ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTgyYzk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ij4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmMzBlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotanNwbW9kZWwuamFyCi1kZXYucHJvcGVydGllcwotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlXzYuMC4wLmphcgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmVfNi4wLjAuemlwCi1qc3Btb2RlbHNyYy56aXAKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YTJjOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWc9dHJ1ZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RyYWNlZmlsdGVyPQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcGluZGV4bWFuYWdlcj1mYWxzZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdHJhbnNsYXRpb25zdG9kaXNrPWZhbHNlCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwc2VhcmNoPWZhbHNlCi0KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvcmVzb2x2ZT1mYWxzZQotCi0KLSMgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXIuX2RlYnVnCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9tYW5hZ2VyPWZhbHNlCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9jYWNoZT1mYWxzZQotCi0jIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLkNNRG9jdW1lbnRGYWN0b3J5VExELl9kZWJ1Zwotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RsZGNtZG9jdW1lbnQvZmFjdG9yeT1mYWxzZQotCi0jb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9qZWN0RGVzY3JpcHRpb24uX2RlYnVnSW5kZXhDcmVhdGlvbgotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3RhZ2xpYi9pbmRleGNyZWF0aW9uPWZhbHNlCi0jb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9qZWN0RGVzY3JpcHRpb24uX2RlYnVnSW5kZXhUaW1lCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4dGltZT1mYWxzZQotCi0jb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJJbmRleC5fZGVidWdFdmVudHMKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvZXZlbnRzPWZhbHNlCi0jb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJJbmRleC5fZGVidWdJbmRleENyZWF0aW9uCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4Y3JlYXRpb249ZmFsc2UKLSNvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkluZGV4Ll9kZWJ1Z1Jlc29sdXRpb24KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvcmVzb2x2ZT1mYWxzZQotCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwamF2YW1hcHBpbmc9ZmFsc2UKLQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHZhbGlkYXRvcj1mYWxzZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RhZ2xpYnZhcnM9ZmFsc2UKLQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RhZ2xpYmNsYXNzbG9hZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxMGI3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExNDI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jV2VkIE1hciAyOCAwMjo1NjoxMiBFRFQgMjAwNw0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjINCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDANCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3INCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvQ1NTSlNQUGFyc2VyL0hvd1RvR2VuLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9DU1NKU1BQYXJzZXIvSG93VG9HZW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0MzlmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9DU1NKU1BQYXJzZXIvSG93VG9HZW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLTxwPgotSlNQZWRDU1NUb2tlbml6ZXIgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXg8L2E+IDEuNC4xIAotZnJvbSB0aGUgSlNQZWRDU1NUb2tlbml6ZXIuZmxleCBncmFtbWVyIGZpbGUuCi1BZnRlciBnZW5lcmF0aW5nIHRoZSBzY2FubmVyLCBJIHJlbW92ZWQgdW51c2VkIHByaXZhdGUgZmllbGQgZXJyb3JzLgotPC9wPgotPC9ib2R5PgotPGh0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9DU1NKU1BQYXJzZXIvSlNQZWRDU1NUb2tlbml6ZXIuZmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9KU1BlZENTU1Rva2VuaXplci5mbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTJkNDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9KU1BlZENTU1Rva2VuaXplci5mbGV4CisrKyAvZGV2L251bGwKQEAgLTEsNTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5KU1BlZENTU1JlZ2lvbkNvbnRleHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1JlZ2lvblV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuSUNTU1Rva2VuaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLkNTU1RleHRSZWdpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOw0KLQ0KLSUlDQotDQotJXB1YmxpYw0KLSVjbGFzcyBKU1BlZENTU1Rva2VuaXplcg0KLSVpbXBsZW1lbnRzIEpTUGVkQ1NTUmVnaW9uQ29udGV4dHMsIElDU1NUb2tlbml6ZXINCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbg0KLSV0eXBlIFN0cmluZw0KLSVjaGFyDQotJXVuaWNvZGUNCi0lY2FzZWxlc3MNCi0lcGFjaw0KLQ0KLSV7DQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBVTkRFRklORUQgPSAidW5kZWZpbmVkIjsNCi0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7DQotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0Ow0KLS8vCXByaXZhdGUgaW50IGZCdWZmZXJlZFRleHRMZW5ndGg7DQotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aDsNCi0vLwlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQnVmZmVyZWRUZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBDU1NUZXh0UmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IENTU1RleHRSZWdpb25GYWN0b3J5LmdldEluc3RhbmNlKCk7DQotCXByaXZhdGUgaW50IGZJbml0aWFsU3RhdGUgPSBZWUlOSVRJQUw7DQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX05PUk1BTCA9IDE2Mzg0Ow0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRV9TTUFMTCA9IDI1NjsNCi0JcHJpdmF0ZSBpbnQgZkluaXRpYWxCdWZmZXJTaXplID0gQlVGRkVSX1NJWkVfTk9STUFMOw0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsU3RhdGUoaW50IHN0YXRlKSB7DQotCQlmSW5pdGlhbFN0YXRlID0gc3RhdGU7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxCdWZmZXJTaXplKGludCBzaXplKSB7DQotCQlmSW5pdGlhbEJ1ZmZlclNpemUgPSBzaXplOw0KLQl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotICAJcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlTdHJpbmcgY29udGV4dDsNCi0JCVN0cmluZyBuZXh0VG9rZW5UeXBlOw0KLQkJYm9vbGVhbiBzcGFjZUZvbGxvd3M7DQotLy8JCVN0cmluZ0J1ZmZlciB0ZXh0Ow0KLQkJaW50IHN0YXJ0Ow0KLQkJaW50IHRleHRMZW5ndGg7DQotCQlpbnQgbGVuZ3RoOw0KLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgIT0gbnVsbCkgew0KLQkJCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0Ow0KLS8vCQkJdGV4dCA9IGZCdWZmZXJlZFRleHQ7DQotCQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsNCi0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOw0KLQ0KLQkJCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQkJfSBlbHNlIHsNCi0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLS8vCQkJdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOw0KLQkJCXN0YXJ0ID0geXljaGFyOw0KLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJfQ0KLQ0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgew0KLQkJCWlmIChjb250ZXh0ID09IENTU19KU1BfU0NSSVBUTEVUIHx8IGNvbnRleHQgPT0gQ1NTX0pTUF9FTCl7DQotCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlICE9IENTU19KU1BfRU5EICYmIG5leHRUb2tlblR5cGUgIT0gQ1NTX0VMX0VORCAmJiBuZXh0VG9rZW5UeXBlICE9IENTU19KU1BfQ09NTUVOVCkgew0KLS8vCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7DQotCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7DQotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOw0KLQkJCQkJaWYgKGNvbnRleHQuZXF1YWxzKENTU19KU1BfU0NSSVBUTEVUKSAmJiAoeXlzdGF0ZSgpID09IFNUX0pTUF9ESVJFQ1RJVkUgfHwgeXlzdGF0ZSgpID09IFNUX0pTUF9FWFAgfHwgeXlzdGF0ZSgpID09IFNUX0pTUF9ERUNMQVJBVElPTikpew0KLQkJCQkJCWNvbnRleHQgPSBuZXh0VG9rZW5UeXBlOw0KLQkJCQkJfQ0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCWlmIChuZXh0VG9rZW5UeXBlID09IG51bGwpew0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCS8vIFsyMzYwMDhdIC0gU2hvdWxkIG5vdCB0cnkgYW5kIGNvbnNpZGVyIHRoZSB0b2tlbiBhDQotCQkJCS8vIGNvbW1lbnQgdW5sZXNzICBhIGNvbW1lbnQgd2FzIHN0YXJ0ZWQNCi0JCQkJaWYgKGNvbnRleHQgPT0gQ1NTX0pTUF9TQ1JJUFRMRVQgJiYgbmV4dFRva2VuVHlwZSA9PSBDU1NfSlNQX0NPTU1FTlQpew0KLQkJCQkJd2hpbGUgKG5leHRUb2tlblR5cGUgIT0gQ1NTX0pTUF9DT01NRU5UX0VORCkgew0KLS8vCQkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOw0KLQkJCQkJCXRleHRMZW5ndGggKz0geXlsZW5ndGgoKTsNCi0JCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOw0KLQkJCQkJCWlmIChjb250ZXh0LmVxdWFscyhDU1NfSlNQX1NDUklQVExFVCkgJiYgeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKXsNCi0JCQkJCQkJY29udGV4dCA9IG5leHRUb2tlblR5cGU7DQotCQkJCQkJfQ0KLQ0KLQkJCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQkJaWYgKG5leHRUb2tlblR5cGUgPT0gbnVsbCl7DQotCQkJCQkJCWJyZWFrOw0KLQkJCQkJCX0NCi0JCQkJCX0JCQkJDQotCQkJCQlpZiAoY29udGV4dCA9PSBDU1NfSlNQX0NPTU1FTlQpew0KLQkJCQkJCWNvbnRleHQgPSBDU1NfQ09NTUVOVDsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7DQotCQkJCWxlbmd0aCA9IHRleHRMZW5ndGg7DQotCQkJCQ0KLQkJCX0NCi0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsNCi0JCQkJLy8gdW5kZWYgLT4gY29uY2F0ZW5hdGUgdW5kZWYncw0KLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSA9PSBVTkRFRklORUQpIHsNCi0vLwkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOw0KLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsNCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCX0NCi0JCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG5leHRUb2tlblR5cGU7DQotLy8JCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOw0KLQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsNCi0JCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQluZXh0VG9rZW5UeXBlID0gbnVsbDsNCi0JCQkJc3BhY2VGb2xsb3dzID0gZmFsc2U7DQotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25WYWx1ZVR5cGUoY29udGV4dCkpIHsgLy8gZGVjbGFyYXRpb24gdmFsdWUgY2FuIGNvbnRhaW4gVkFMVUVfUw0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19ERUNMQVJBVElPTl9WQUxVRV9TKTsNCi0JCQkJfSBlbHNlIGlmIChjYW5Db250YWluU3BhY2UoY29udGV4dCkpIHsNCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQlzcGFjZUZvbGxvd3MgPSAobmV4dFRva2VuVHlwZSA9PSBDU1NfUyk7DQotCQkJCX0NCi0JCQkJaWYgKG5leHRUb2tlblR5cGUgIT0gbnVsbCkgeyAvLyBuZXh0VG9rZW4gaXMgcmV0cmlldmVkDQotCQkJCQlpZiAoc3BhY2VGb2xsb3dzKSB7DQotCQkJCQkJLy8gbmV4dCBpcyBzcGFjZSAtPiBhcHBlbmQNCi0vLwkJCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsNCi0JCQkJCQlsZW5ndGggKz0geXlsZW5ndGgoKTsNCi0JCQkJCX0gZWxzZSB7DQotCQkJCQkJLy8gbmV4dCBpcyBOT1Qgc3BhY2UgLT4gcHVzaCB0aGlzIGZvciBuZXh0IHRpbWUsIHJldHVybiBpdHNlbGYNCi0JCQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0vLwkJCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsNCi0JCQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsNCi0JCQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgew0KLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgew0KLQkJCQljb250ZXh0ID0gQ1NTX1VOS05PV047DQotCQkJfQ0KLQkJCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7DQotCQl9IGVsc2Ugew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLSAgCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JLyogZm9yIHN0YW5kYWxvbmUgdXNlICovDQotICAJcHVibGljIGZpbmFsIExpc3QgcGFyc2VUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gIAkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7DQotDQotICAJCUNTU1RleHRUb2tlbiB0b2tlbjsNCi0JCWZvciAoU3RyaW5nIGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCk7IGtpbmQgIT0gbnVsbDsga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKSkgew0KLQkJCXRva2VuID0gbmV3IENTU1RleHRUb2tlbigpOw0KLQkJCXRva2VuLmtpbmQgPSBraW5kOyAgCQkJCQ0KLQkJCXRva2VuLnN0YXJ0ID0geXljaGFyOw0KLQkJCXRva2VuLmxlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCQkJdG9rZW4uaW1hZ2UgPSB5eXRleHQoKTsNCi0JCQl0b2tlbnMuYWRkKHRva2VuKTsNCi0JCX0NCi0NCi0gIAkJcmV0dXJuIHRva2VuczsNCi0gIAl9DQotICAJDQotICAJLyogdXNlciBtZXRob2QgKi8NCi0gIAlwcml2YXRlIGJvb2xlYW4gY2FuQ29udGFpblNwYWNlKFN0cmluZyB0eXBlKSB7DQotICAJCWlmICh0eXBlID09IENTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgew0KLSAgCQkJcmV0dXJuIGZhbHNlOw0KLSAgCQl9IGVsc2Ugew0KLSAgCQkJcmV0dXJuIHRydWU7DQotICAJCX0NCi0gIAl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgew0KLQkJcmV0dXJuIHl5Y2hhcjsNCi0JfQ0KLQkNCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7DQotCQlyZXR1cm4genpBdEVPRjsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7DQotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOw0KLQl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7DQotCQkvKiogdGhlIGlucHV0IGRldmljZSAqLw0KLQkJenpSZWFkZXIgPSBpbjsNCi0NCi0JCS8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotCQl6elN0YXRlID0gMDsNCi0NCi0JCS8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotCQl6ekxleGljYWxTdGF0ZSA9IGZJbml0aWFsU3RhdGU7IC8vWVlJTklUSUFMOw0KLQ0KLQkJLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0JCQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0JCWlmICh6ekJ1ZmZlci5sZW5ndGggIT0gZkluaXRpYWxCdWZmZXJTaXplKSB7DQotCQkJenpCdWZmZXIgPSBuZXcgY2hhcltmSW5pdGlhbEJ1ZmZlclNpemVdOw0KLQkJfQ0KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsNCi0NCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLQkJenpNYXJrZWRQb3MgPSAwOw0KLQ0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotCQl6elB1c2hiYWNrUG9zID0gMDsNCi0NCi0JCS8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0JCXp6Q3VycmVudFBvcyA9IDA7DQotDQotCQkvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotCQl6elN0YXJ0UmVhZCA9IDA7DQotDQotCQkvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotCQkJZnJvbSBpbnB1dCAqLw0KLQkJenpFbmRSZWFkID0gMDsNCi0NCi0JCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCS8veXlsaW5lID0gMDsNCi0NCi0JCS8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCXl5Y2hhciA9IDA7DQotDQotCQkvKioNCi0JCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSANCi0JCSAqIG1hdGNoZWQgdGV4dA0KLQkJICovDQotCQkvL3l5Y29sdW1uID0gMDsgDQotDQotCQkvKiogDQotCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUNCi0JCSAqLw0KLQkJLy96ekF0Qk9MID0gZmFsc2U7DQotCQkNCi0JCS8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovDQotCQl6ekF0RU9GID0gZmFsc2U7DQotDQotCQkvKiB1c2VyIHZhcmlhYmxlcyAqLw0KLQkJLy8JCWZVbmRlZmluZWQuZGVsZXRlKDAsIGZVbmRlZmluZWQubGVuZ3RoKCkpOw0KLQl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBKU1BlZENTU1Rva2VuaXplcigpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0JDQotCXByaXZhdGUgaW50IGZKU1BQcmV2aW91c1N0YXRlID0gZkluaXRpYWxTdGF0ZTsNCi0JcHJpdmF0ZSB2b2lkIHl5SnNwQmVnaW4oaW50IG5ld3N0YXRlKXsNCi0JCWZKU1BQcmV2aW91c1N0YXRlID0geXlzdGF0ZSgpOw0KLQkJeXliZWdpbihuZXdzdGF0ZSk7DQotCX0NCi0JcHJpdmF0ZSB2b2lkIHl5SnNwRW5kKCl7DQotCQl5eWJlZ2luKGZKU1BQcmV2aW91c1N0YXRlKTsNCi0JfQ0KLSV9DQotDQotJXN0YXRlIFNUX0NIQVJTRVRfTkFNRQ0KLSVzdGF0ZSBTVF9DSEFSU0VUX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9JTVBPUlRfVVJJDQotJXN0YXRlIFNUX0lNUE9SVF9NRURJVU0NCi0lc3RhdGUgU1RfSU1QT1JUX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9NRURJQV9NRURJVU0NCi0lc3RhdGUgU1RfTUVESUFfREVMSU1JVEVSDQotJXN0YXRlIFNUX1BBR0VfUFNFVURPX1BBR0UNCi0lc3RhdGUgU1RfUEFHRV9ERUxJTUlURVINCi0lc3RhdGUgU1RfRk9OVF9GQUNFX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9NT0RJRklFUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1INCi0lc3RhdGUgU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQNCi0lc3RhdGUgU1RfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SDQotJXN0YXRlIFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRQ0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTl9WQUxVRQ0KLSVzdGF0ZSBTVF9KU1BfU0NSSVBUTEVUDQotJXN0YXRlIFNUX0pTUF9ESVJFQ1RJVkUNCi0lc3RhdGUgU1RfSlNQX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX0pTUF9FWFANCi0lc3RhdGUgU1RfSlNQX0VMDQotJXN0YXRlIFNUX0pTUF9DT01NRU5UDQotDQotDQotaCA9IFswLTlhLWZdDQotbm9uYXNjaWkgPSBbXHUwMDgwLVx1ZmZmZl0NCi11bmljb2RlID0gXFx7aH17MSw2fVsgXHRcclxuXGZdPw0KLWVzY2FwZSA9IHt1bmljb2RlfXxcXFsgLX5cdTAwODAtXHVmZmZmXQ0KLW5tc3RhcnQgPSBbX2EtekEtWi1dfHtub25hc2NpaX18e2VzY2FwZX0NCi1ubWNoYXIgPSBbX2EtekEtWjAtOS1dfHtub25hc2NpaX18e2VzY2FwZX0NCi1zdHJpbmcxID0gXCIoW1x0ICEjJCUmKC1+XXxcXHtubH18XCd8e25vbmFzY2lpfXx7ZXNjYXBlfSkqXCINCi1zdHJpbmcyID0gXCcoW1x0ICEjJCUmKC1+XXxcXHtubH18XCJ8e25vbmFzY2lpfXx7ZXNjYXBlfSkqXCcNCi0NCi1pZGVudCA9IHtubXN0YXJ0fXtubWNoYXJ9Kg0KLW5hbWUgPSB7bm1jaGFyfSsNCi1udW0gPSBbKy1dPyhbMC05XSt8WzAtOV0qIi4iWzAtOV0rKQ0KLXN0cmluZyA9IHtzdHJpbmcxfXx7c3RyaW5nMn0NCi11cmwgPSAoWyAhIyQlJiotfl18e25vbmFzY2lpfXx7ZXNjYXBlfSkqDQotcyA9IFsgXHRcclxuXGZdDQotdyA9IHtzfSoNCi1ubCA9IFxufFxyXG58XHJ8XGYNCi1yYW5nZSA9IFw/ezEsNn18e2h9KFw/ezAsNX18e2h9KFw/ezAsNH18e2h9KFw/ezAsM318e2h9KFw/ezAsMn18e2h9KFw/P3x7aH0pKSkpKQ0KLQ0KLWhhc2ggPSAiIyJ7bmFtZX0NCi11cmkgPSAoInVybCgie3d9e3N0cmluZ317d30iKSJ8InVybCgie3d9e3VybH17d30iKSIpDQotZnVuY3Rpb24gPSB7aWRlbnR9IigiDQotdW5pY29kZV9yYW5nZSA9ICJVIlwrWzAtOWEtZkEtRj9dezEsNn0oIi0iWzAtOWEtZkEtRj9dezEsNn0pPw0KLQ0KLVNTID0gW1x4MjBceDA5XHgwRFx4MEFdDQotanNwc3RhcnQgPSAiPCJ7U1N9KiIlIntTU30qDQotanNwZW5kID0gIiUie1NTfSoiPiINCi1lbHN0YXJ0ID0gIiQie1NTfSoieyINCi1lbGVuZCA9ICJ9Ig0KLQ0KLSUlDQotDQotDQotDQotPFlZSU5JVElBTD4gew0KLSB7anNwc3RhcnR9ICAgICAgICAgIHt5eUpzcEJlZ2luKFNUX0pTUF9TQ1JJUFRMRVQpOyAgcmV0dXJuIENTU19KU1BfU0NSSVBUTEVUO30NCi0ge2Vsc3RhcnR9ICAgICAgICAgIHt5eUpzcEJlZ2luKFNUX0pTUF9FTCk7ICByZXR1cm4gQ1NTX0pTUF9FTDt9DQotfQ0KLQ0KLTxTVF9KU1BfU0NSSVBUTEVUPiB7DQotICJAIgl7eXliZWdpbihTVF9KU1BfRElSRUNUSVZFKTsgcmV0dXJuIENTU19KU1BfRElSRUNUSVZFO30NCi0gIj0iCXt5eWJlZ2luKFNUX0pTUF9FWFApOyByZXR1cm4gQ1NTX0pTUF9FWFA7fQ0KLSAiISIJe3l5YmVnaW4oU1RfSlNQX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19KU1BfREVDTDt9DQotIHtqc3BlbmR9IHt5eUpzcEVuZCgpOyAgcmV0dXJuIENTU19KU1BfRU5EO30NCi0gIi0tIiB7IHl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOyByZXR1cm4gQ1NTX0pTUF9DT01NRU5UO30NCi19DQotDQotLyogb3ZlcnJpZGUgZ2xvYmFsICJ9IiAqLw0KLTxTVF9KU1BfRUw+IHsNCi0ge2VsZW5kfSB7eXlKc3BFbmQoKTsgcmV0dXJuIENTU19FTF9FTkQ7IH0NCi19DQotDQotPFNUX0pTUF9ESVJFQ1RJVkUsIFNUX0pTUF9FWFAsIFNUX0pTUF9ERUNMQVJBVElPTj4gew0KLSB7anNwZW5kfSB7eXlKc3BFbmQoKTsgIHJldHVybiBDU1NfSlNQX0VORDt9DQotfQ0KLQ0KLTxTVF9KU1BfQ09NTUVOVD4gew0KLSAtKy17anNwZW5kfSB7IHl5SnNwRW5kKCk7IHJldHVybiBDU1NfSlNQX0NPTU1FTlRfRU5EOyB9DQotICJ9IiAgICAgICAgIHsgcmV0dXJuIFVOREVGSU5FRDsgfQ0KLX0NCi0NCi0NCi0vKg0KLSAqICoqKiBnbG9iYWwgKioqDQotICovDQotDQote3N9KyB7IHJldHVybiBDU1NfUzsgfQ0KLSI8IS0tIiB7IHJldHVybiBDU1NfQ0RPOyB9DQotIi0tPiIgeyByZXR1cm4gQ1NTX0NEQzsgfQ0KLSJ9IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19SQlJBQ0U7IH0NCi1cL1wqW14qXSpcKisoW14vKl1bXipdKlwqKykqXC8geyByZXR1cm4gQ1NTX0NPTU1FTlQ7IH0NCi0vL1w8XCUtLVteLX1dKlt9XSpbXn1dKi0rLVwlXD4geyByZXR1cm4gQ1NTX0NPTU1FTlQ7IH0NCi0NCi0NCi0vLzxZWUlOSVRJQUw+IHsNCi0vLwkiQGltcG9ydCIgewl5eWJlZ2luKFNUX0lNUE9SVF9VUkkpOyByZXR1cm4gQ1NTX0lNUE9SVDsgfQ0KLS8vfQ0KLQ0KLS8qDQotICogKioqIGNoYXJzZXQgcnVsZSAqKioNCi0gKiBDSEFSU0VUX1NZTSBTKiBTVFJJTkcgUyogJzsnDQotICovDQotDQotIkBjaGFyc2V0IiB7IHl5YmVnaW4oU1RfQ0hBUlNFVF9OQU1FKTsgcmV0dXJuIENTU19DSEFSU0VUOyB9DQotDQotPFNUX0NIQVJTRVRfTkFNRT4gew0KLQl7c3RyaW5nfSB7IHl5YmVnaW4oU1RfQ0hBUlNFVF9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1NUUklORzsgfQ0KLX0NCi0NCi08U1RfQ0hBUlNFVF9ERUxJTUlURVI+IHsNCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLX0NCi0NCi0vKg0KLSAqICoqKiBpbXBvcnQgcnVsZSAqKioNCi0gKiBJTVBPUlRfU1lNIFMqIFtTVFJJTkd8VVJJXSBTKiBbIG1lZGl1bSBbIENPTU1BIFMqIG1lZGl1bV0qIF0/ICc7JyBTKg0KLSAqLw0KLQ0KLSJAaW1wb3J0IiB7IHl5YmVnaW4oU1RfSU1QT1JUX1VSSSk7IHJldHVybiBDU1NfSU1QT1JUOyB9DQotDQotPFNUX0lNUE9SVF9VUkk+IHsNCi0Je3N0cmluZ30geyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1NUUklORzsgfQ0KLQkvLwkidXJsKCJ7d317c3RyaW5nfXt3fSIpIiB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOyB9DQotCS8vCSJ1cmwoInt3fXt1cmx9e3d9IikiIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7IH0NCi0Je3VyaX0geyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsgfQ0KLQkiOyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOyB9DQotfQ0KLQ0KLTxTVF9JTVBPUlRfTUVESVVNPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX0lNUE9SVF9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX01FRElVTTsgfQ0KLQkiOyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOyB9DQotfQ0KLQ0KLTxTVF9JTVBPUlRfREVMSU1JVEVSPiB7DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi0JIiwiIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7IH0NCi19DQotDQotLyoNCi0gKiAqKiogbWVkaWEgcnVsZSAqKioNCi0gKiBNRURJQV9TWU0gUyogbWVkaXVtIFsgQ09NTUEgUyogbWVkaXVtIF0qIExCUkFDRSBTKiBydWxlc2V0KiAnfScgUyoNCi0gKi8NCi0NCi0iQG1lZGlhIiB7IHl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQTsgfQ0KLQ0KLS8qIA0KLSAqIG1lZGl1bQ0KLSAqIElERU5UIFMqDQotICovDQotPFNUX01FRElBX01FRElVTT4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9NRURJQV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX01FRElVTTsgfQ0KLX0NCi0NCi08U1RfTUVESUFfREVMSU1JVEVSPiB7DQotCSJ7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi0JIiwiIHsgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsgfQ0KLX0NCi0NCi0vKg0KLSAqICoqKiBwYWdlIHJ1bGUgKioNCi0gKiBQQUdFX1NZTSBTKiBwc2V1ZG9fcGFnZT8gUyogTEJSQUNFIFMqIGRlY2xhcmF0aW9uIFsgJzsnIFMqIGRlY2xhcmF0aW9uIF0qICd9JyBTKg0KLSAqLw0KLQ0KLSJAcGFnZSIgeyB5eWJlZ2luKFNUX1BBR0VfUFNFVURPX1BBR0UpOyByZXR1cm4gQ1NTX1BBR0U7IH0NCi0gDQotLyoNCi0gKiBwc2V1ZG9fcGFnZQ0KLSAqICc6JyBJREVOVA0KLSAqLw0KLQ0KLTxTVF9QQUdFX1BTRVVET19QQUdFPiB7DQotCSI6Ij97aWRlbnR9IHsgeXliZWdpbihTVF9QQUdFX0RFTElNSVRFUik7IHJldHVybiBDU1NfUEFHRV9TRUxFQ1RPUjsgfQ0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotPFNUX1BBR0VfREVMSU1JVEVSPiB7DQotCSJ7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLX0NCi0NCi0vKg0KLSAqIGZvbnQtZmFjZQ0KLSAqIEZPTlRfRkFDRV9TWU0gUyogJ3snIFMqIGRlY2xhcmF0aW9uIFsgJzsnIFMqIGRlY2xhcmF0aW9uICcqICd9JyBTKg0KLSAqLw0KLQ0KLSJAZm9udC1mYWNlIiB7IHl5YmVnaW4oU1RfRk9OVF9GQUNFX0RFTElNSVRFUik7IHJldHVybiBDU1NfRk9OVF9GQUNFOyB9DQotDQotPFNUX0ZPTlRfRkFDRV9ERUxJTUlURVI+IHsNCi0JInsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotfQ0KLQ0KLS8qDQotICogc2VsZWN0b3INCi0gKiBzaW1wbGVfc2VsZWN0b3IgWyBjb21iaW5hdG9yIHNpbXBsZV9zZWxlY3RvciBdKg0KLSAqLw0KLQ0KLS8qDQotICogc2ltcGxlX3NlbGVjdG9yDQotICogZWxlbWVudF9uYW1lIFsgSEFTSCB8IGNsYXNzIHwgYXR0cmliIHwgcHNldWRvIF0qIHwgWyBIQVNIIHwgY2xhc3MgfCBhdHRyaWIgfCBwc2V1ZG8gXSsNCi0gKi8NCi0NCi08WVlJTklUSUFMLCBTVF9TRUxFQ1RPUl9NT0RJRklFUiwgU1RfU0VMRUNUT1I+IHsNCi0JIioiIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfVU5JVkVSU0FMOyB9DQotCXtoYXNofSB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0lEOyB9DQotLy8JIjoie2lkZW50fSB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1BTRVVETzsgfQ0KLQkiOiJ7aWRlbnR9KCIoIntzfSp7aWRlbnR9e3N9KiIpIik/IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfUFNFVURPOyB9DQotCSIuIntuYW1lfSB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NMQVNTOyB9DQotCSJbIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVDsgfQ0KLX0NCi0NCi08WVlJTklUSUFMLCBTVF9TRUxFQ1RPUj4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FOyB9DQotfQ0KLQ0KLTxTVF9TRUxFQ1RPUl9NT0RJRklFUj4gew0KLQkiLCIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9TRVBBUkFUT1I7IH0NCi0JLy8gdXNpbmcgTE9PS0FIRUFEDQotCXtzfSsvW14rPlx7XSB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1I7IH0NCi0JIisifCI+IiB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1I7IH0NCi0JInsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotfQ0KLQ0KLS8qDQotICogYXR0cmliDQotICogJ1snIFMqIElERU5UIFMqIFsgWyAnPScgfCBJTkNMVURFUyB8IERBU0hNQVRDSCBdIFMqIFsgSURFTlQgfCBTVFJJTkcgXSBTKiBdPyAnXScNCi0gKi8NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUU+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRTsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SPiB7DQotCSI9Inwifj0ifCJ8PSIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SOyB9DQotCSJdIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQ7IH0NCi19DQotDQotPFNUX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRT4gew0KLQl7aWRlbnR9fHtzdHJpbmd9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUU7IH0NCi19DQotDQotPFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQ+IHsNCi0JIl0iIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORDsgfQ0KLX0NCi0NCi0vKg0KLSAqIGRlY2xhcmF0aW9uDQotICogcHJvcGVydHkgJzonIFMqIGV4cHIgcHJpbz8gfCAvLyBlbXB0eSAvLw0KLSAqLw0KLQ0KLTxTVF9ERUNMQVJBVElPTj4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZOyB9DQotICAgIHtqc3BzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX1NDUklQVExFVCk7ICByZXR1cm4gQ1NTX0pTUF9TQ1JJUFRMRVQ7fQ0KLSAgICB7ZWxzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX0VMKTsgIHJldHVybiBDU1NfSlNQX0VMO30NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUj4gew0KLQkiOiIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SOyB9DQotICAgIHtqc3BzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX1NDUklQVExFVCk7ICByZXR1cm4gQ1NTX0pTUF9TQ1JJUFRMRVQ7fQ0KLSAgICB7ZWxzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX0VMKTsgIHJldHVybiBDU1NfSlNQX0VMO30gICAgDQotfQ0KLQ0KLTxTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUsIFNUX0RFQ0xBUkFUSU9OX1ZBTFVFPiB7DQotCSIhIntzfSoiaW1wb3J0YW50IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVDsgfQ0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQ7IH0NCi0JIikiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0U7IH0NCi0Je251bX17aWRlbnR9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OOyB9DQotCXtudW19IiUiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRTsgfQ0KLQl7bnVtfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUjsgfQ0KLQl7ZnVuY3Rpb259IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT047IH0NCi0Je3N0cmluZ30geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkc7IH0NCi0Je3VyaX0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9VUkk7IH0NCi0JIiMie25hbWV9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSDsgfQ0KLQl7dW5pY29kZV9yYW5nZX0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFOyB9DQotCVssL10geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUjsgfQ0KLSAgICB7anNwc3RhcnR9ICAgICAgICAgIHt5eUpzcEJlZ2luKFNUX0pTUF9TQ1JJUFRMRVQpOyAgcmV0dXJuIENTU19KU1BfU0NSSVBUTEVUO30NCi0gICAge2Vsc3RhcnR9ICAgICAgICAgIHt5eUpzcEJlZ2luKFNUX0pTUF9FTCk7ICByZXR1cm4gQ1NTX0pTUF9FTDt9ICAgIA0KLX0NCi0NCi08U1RfREVDTEFSQVRJT05fVkFMVUU+IHsNCi0Je3N9Ky9bXjt9XSB7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUzsgfQ0KLSAgICB7anNwc3RhcnR9ICAgICAgICAgIHt5eUpzcEJlZ2luKFNUX0pTUF9TQ1JJUFRMRVQpOyAgcmV0dXJuIENTU19KU1BfU0NSSVBUTEVUO30NCi0gICAge2Vsc3RhcnR9ICAgICAgICAgIHt5eUpzcEJlZ2luKFNUX0pTUF9FTCk7ICByZXR1cm4gQ1NTX0pTUF9FTDt9DQotfQ0KLQ0KLTxTVF9ERUNMQVJBVElPTiwgU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SLCBTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUsIFNUX0RFQ0xBUkFUSU9OX1ZBTFVFPiB7DQotCSI7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUjsgfQ0KLQkvLwkifSIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfUkJSQUNFOyB9DQotfQ0KLQ0KLQ0KLS8vPFlZSU5JVElBTCwgU1RfSU1QT1JUX1VSSSwgU1RfSU1QT1JUX01FRElVTSwgU1RfSU1QT1JUX0RFTElNSVRFUj4gew0KLS8vCVwvXCpbXipdKlwqKyhbXi8qXVteKl0qXCorKSpcLyB7IHJldHVybiBDU1NfQ09NTUVOVDsgfQ0KLS8vCXtzfSsgeyByZXR1cm4gQ1NTX1M7IH0NCi0vLwkuIHsgcmV0dXJuIFVOREVGSU5FRDsgfQ0KLS8vfQ0KLQ0KLS8vPFlZSU5JVElBTCwgU1RfSU1QT1JUX1VSSSwgU1RfSU1QT1JUX01FRElVTSwgU1RfSU1QT1JUX0RFTElNSVRFUj4gew0KLS8vCVteIFx0XHJcblxmXSsgeyByZXR1cm4gQ1NTX1VOS05PV047IH0NCi0vL30NCi0NCi0NCi0NCi0NCi0NCi0uIHsNCi0JcmV0dXJuIFVOREVGSU5FRDsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSlNQSGVhZFRva2VuaXplci5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0pTUEhlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZmNlODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSlNQSGVhZFRva2VuaXplci5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKm5sc1hYWCovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOw0KLQ0KLSUlDQotDQotJXsNCi0NCi0NCi0NCi0NCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsNCi0gICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7DQotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLSAgICAgICAgLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZw0KLSAgICAgICAgcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOw0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsNCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1hIVE1MOw0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzV01MOw0KLQ0KLQ0KLSAgICAgICAgcHVibGljIEpTUEhlYWRUb2tlbml6ZXIoKSB7DQotICAgICAgICAgICAgICAgIHN1cGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsNCi0gICAgICAgICAgICAgICAgLyogdGhlIGlucHV0IGRldmljZSAqLw0KLSAgICAgICAgICAgICAgICB6elJlYWRlciA9IGluOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotICAgICAgICAgICAgICAgIHp6U3RhdGUgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotICAgICAgICAgICAgICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotICAgICAgICAgICAgICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0gICAgICAgICAgICAgICAgQXJyYXlzLmZpbGwoenpCdWZmZXIsIChjaGFyKTApOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLSAgICAgICAgICAgICAgICB6ek1hcmtlZFBvcyA9IDA7DQotDQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotICAgICAgICAgICAgICAgIC8venpQdXNoYmFja1BvcyA9IDA7DQotDQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLw0KLSAgICAgICAgICAgICAgICB6ekN1cnJlbnRQb3MgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0gICAgICAgICAgICAgICAgenpTdGFydFJlYWQgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKioNCi0gICAgICAgICAgICAgICAgICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotICAgICAgICAgICAgICAgICAqIGZyb20gaW5wdXQNCi0gICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgIHp6RW5kUmVhZCA9IDA7DQotDQotICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgICAgICAgICAgICAgICAvL3l5bGluZSA9IDA7DQotDQotICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgICAgICAgICAgICAgICB5eWNoYXIgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKioNCi0gICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQNCi0gICAgICAgICAgICAgICAgICogb2YgdGhlIG1hdGNoZWQgdGV4dA0KLSAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgLy95eWNvbHVtbiA9IDA7DQotDQotICAgICAgICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgICAgICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZw0KLSAgICAgICAgICAgICAgICAgKiBvZiBhIGxpbmUNCi0gICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgIHp6QXRCT0wgPSB0cnVlOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovDQotICAgICAgICAgICAgICAgIHp6QXRFT0YgPSBmYWxzZTsNCi0NCi0gICAgICAgICAgICAgICAgLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovDQotICAgICAgICAgICAgICAgIHp6RU9GRG9uZSA9IGZhbHNlOw0KLQ0KLQ0KLSAgICAgICAgICAgICAgICBmU3RhdGVTdGFjay5jbGVhcigpOw0KLQ0KLSAgICAgICAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgaXNYSFRNTD1mYWxzZTsNCi0gICAgICAgICAgICAgICAgaXNXTUw9ZmFsc2U7DQotDQotDQotICAgICAgICB9DQotDQotDQotICAgICAgICBwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRleHQgPSBudWxsOw0KLSAgICAgICAgICAgICAgICBjb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgICAgICBIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVGV4dCA9IG51bGw7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7DQotICAgICAgICAgICAgICAgIGZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0NCi0gICAgICAgIH0NCi0gDQotICAgICAgICBwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7DQotICAgICAgICAgICAgICAgIHl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1hIVE1MKCkgew0KLSAgICAgICAgICAgIHJldHVybiBpc1hIVE1MOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXTUwoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGlzV01MOw0KLSAgICAgICAgfSAgICAgICAgDQotDQotJX0NCi0NCi0lZW9mew0KLSAgICAgICAgaGFzTW9yZT1mYWxzZTsNCi0lZW9mfQ0KLQ0KLSVwdWJsaWMNCi0lY2xhc3MgSlNQSGVhZFRva2VuaXplcg0KLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuDQotJXR5cGUgU3RyaW5nDQotJWNoYXINCi0ldW5pY29kZQ0KLSVpZ25vcmVjYXNlDQotLy8lZGVidWcNCi0lc3dpdGNoDQotJWJ1ZmZlciA4MTkyDQotJXNjYW5lcnJvciBqYXZhLmxhbmcuRXhjZXB0aW9uDQotDQotDQotVVRGMTZCRSA9IFx4RkVceEZGDQotVVRGMTZMRSA9IFx4RkZceEZFDQotVVRGODNCeXRlQk9NID0gXHhFRlx4QkJceEJGDQotDQotLy8gU3BhY2VDaGFyID0gW1x4MjBceDA5XQ0KLQ0KLQ0KLS8vIFszXSBTIDo6PSAoMHgyMCB8IDB4OSB8IDB4RCB8IDB4QSkrDQotUyA9IFtceDIwXHgwOVx4MERceDBBXQ0KLQ0KLS8vQmVnaW5BdHRyaWJ1dGVlVmFsdWUgPSB7U30qIFw9IHtTfSoNCi0NCi1MaW5lVGVybWluYXRvciA9IFxyfFxuDQotDQotDQotWiA9IChceDAwKT8NCi1TX1VURiA9IHtafXtTfXtafQ0KLUJlZ2luQXR0cmlidXRlVmFsdWVVVEYgPSB7U19VVEZ9KiBcPSB7U19VVEZ9Kg0KLQ0KLSVzdGF0ZSBTVF9YTUxEZWNsDQotJXN0YXRlIFNUX1BBR0VfRElSRUNUSVZFDQotJXN0YXRlIFF1b3RlZEF0dHJpYnV0ZVZhbHVlDQotJXN0YXRlIERRX1NUUklORw0KLSVzdGF0ZSBTUV9TVFJJTkcNCi0lc3RhdGUgVW5EZWxpbWl0ZWRTdHJpbmcNCi0NCi0lJQ0KLQ0KLQ0KLTxZWUlOSVRJQUw+DQotew0KLSAgICAgICAgIC8vIGZvcmNlIHRvIHN0YXJ0IGF0IGJlZ2lubmluZyBvZiBsaW5lICheKSBhbmQgYXQgYmVnaW5uaW5nIG9mIGZpbGUgKHl5Y2hhciA9PSAwKQ0KLSAgICAgICAgXiB7VVRGMTZCRX0gICAgICAgICAgIHtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9fQ0KLSAgICAgICAgXiB7VVRGMTZMRX0gICAgICAgICAgIHtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9fQ0KLSAgICAgICAgXiB7VVRGODNCeXRlQk9NfSAgICAgICB7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9fQ0KLSAgICAgICAgDQotICAgICAgICAvLyBmb3JjZSB0byBiZSBzdGFydGVkIG9uIGZpcnN0IGxpbmUsIGJ1dCB3ZSBkbyBhbGxvdyBwcmVjZWVkaW5nIHNwYWNlcw0KLQkJXiB7U19VVEZ9KiAoe1p9PHtafVw/e1p9eHtafW17Wn1se1p9KXtTX1VURn0rIHtpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O319DQotDQotDQotICAgICAgICAvLyBmb2xsb3dpbmcgYXJlIHNvbWUgc2ltcGx5IHJ1bGVzIHRvIGlkZW50aWZ5IEpTUCBjb250ZW50IGFzICJYSFRNTCINCi0gICAgICAgIC8vIHNlZSBodHRwOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmMzMjM2LnR4dA0KLQkJe1p9PHtafVwhe1p9RHtafU97Wn1De1p9VHtafVl7Wn1Qe1p9RXtafSB7U19VVEZ9KiB7Wn1oe1p9dHtafW17Wn1se1p9IHtTX1VURn0qIHtafVB7Wn1Ve1p9QntafUx7Wn1Je1p9Q3tafSAuKiB7Wn1cL3tafVwve1p9RHtafVR7Wn1Ee1p9e1NfVVRGfXtafVh7Wn1Ie1p9VHtafU17Wn1Me1p9ICAgICAgICAgICAgICAgIHtpc1hIVE1MID0gdHJ1ZTt9DQotCQl7Wn08e1p9aHtafXR7Wn1te1p9bHtafSB7U19VVEZ9KiB7Wn14e1p9bXtafWx7Wn1ue1p9c3tafSB7U19VVEZ9KiB7Wn1cPXtafSB7U19VVEZ9KiAoKHtafVwie1p9KSB8ICh7Wn1cJ3tafSkpIHtafWh7Wn10e1p9dHtafXB7Wn06e1p9XC97Wn1cL3tafXd7Wn13e1p9d3tafVwue1p9d3tafTN7Wn1cLntafW97Wn1ye1p9Z3tafVwve1p9MXtafTl7Wn05e1p9OXtafVwve1p9eHtafWh7Wn10e1p9bXtafWx7Wn0gICAgIHtpc1hIVE1MID0gdHJ1ZTt9DQotICAgICAgICAgLy8gYW5vdGhlciBjYXNlIHRoYXQncyBwYXJ0IG9mIHRoZSAiSFRNTCBmYW1pbHkiIGlzIFdNTCAxLjAgKFdNTCAyLjAgaXMgcGFydCBvZiBYSFRNTCkNCi0JCXtafTx7Wn1cIXtafUR7Wn1Pe1p9Q3tafVR7Wn1Ze1p9UHtafUV7Wn0ge1NfVVRGfSoge1p9d3tafW17Wn1se1p9IHtTX1VURn0qIHtafVB7Wn1Ve1p9QntafUx7Wn1Je1p9Q3tafSAuKiB7Wn1cL3tafVwve1p9RHtafVR7Wn1EIHtTfXtafVd7Wn1Ne1p9THtafSAgICAgICAgICAgICAgICAgICB7aXNXTUwgPSB0cnVlO30NCi0NCi0JCXtafTx7Wn0le1p9IHtTX1VURn0qIHtafUB7Wn0ge1NfVVRGfSogKCh7Wn1we1p9YXtafWd7Wn1le1p9KXwoe1p9dHtafWF7Wn1ne1p9KSkge1NfVVRGfSsgICB7eXliZWdpbihTVF9QQUdFX0RJUkVDVElWRSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVTdGFydDt9DQotCQkoKHtafTx7Wn1qe1p9c3tafXB7Wn06e1p9ZHtafWl7Wn1ye1p9ZXtafWN7Wn10e1p9aXtafXZ7Wn1le1p9XC57Wn1we1p9YXtafWd7Wn1le1p9KXwoe1p9PHtafWp7Wn1ze1p9cHtafTp7Wn1ke1p9aXtafXJ7Wn1le1p9Y3tafXR7Wn1pe1p9dntafWV7Wn1cLntafXR7Wn1he1p9Z3tafSkpIHtTX1VURn0rICAgICAgICAgICB7eXliZWdpbihTVF9QQUdFX0RJUkVDVElWRSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVTdGFydDt9DQotDQotfQ0KLQ0KLTxTVF9YTUxEZWNsPg0KLXsNCi0gICAgICAgICh7Wn12e1p9ZXtafXJ7Wn1ze1p9aXtafW97Wn1ue1p9KSB7QmVnaW5BdHRyaWJ1dGVWYWx1ZVVURn0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xWZXJzaW9uO30NCi0gICAgICAgICh7Wn1le1p9bntafWN7Wn1ve1p9ZHtafWl7Wn1ue1p9Z3tafSkge0JlZ2luQXR0cmlidXRlVmFsdWVVVEZ9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzt9DQotICAgICAgICAvLyBub3RlIHRoZSAiZm9yY2VkIGVuZCIgKHZpYSAnaGFzTW9yZT1mYWxzZScpIG9uY2UgdGhlIGVuZCBvZiBYTUwgRGVjbGFyYXRpb24gZm91bmQNCi0gICAgICAgIC8vIFRoaXMgaXMgc2luY2Ugbm9uLWFzY2lpIGNoYXJzIG1heSBmb2xsb3cgYW5kIG1heSBjYXVzZSBJT0V4Y2VwdGlvbnMgd2hpY2ggd291bGQgbm90IG9jY3VyIG9uY2Ugc3RyZWFtIGlzDQotICAgICAgICAvLyByZWFkIHdpdGggaW5jb3JyZWN0IGVuY29kaW5nIChzdWNoIGFzIGlmIHBsYXRmb3JtIGVuY29kaW5nIGlzIGluIGVmZmVjdCB1bnRpbCB0cnVlIGVuY29kaW5nIGRldGVjdGVkKS4NCi0gICAgICAgIC8vIEJVVCwgdGhlIGhhc01vcmU9ZmFsc2Ugd2FzIHJlbW92ZWQgZm9yIHRoaXMgSlNQIGNhc2UgKHByb2JhYmx5IHN0aWxsIG9rIGZvciBwdXJlIFhNTCkgYmVjYXVzZQ0KLSAgICAgICAgLy8gaW4gYSBKU1AsIHdlIG11c3QgcGFyc2UgcGFzdCB4bWxEZWNsIHRvIGdldCBhdCBKU1AgcGFnZSBkaXJlY3RpdmUuDQotICAgICAgICAvLyBXZSdsbCBhc3N1bWUgYWxsIGNoYXJzIGluIHRoaXMgYXJlYSBhcmUgInJlYWRhYmxlIiBhcyBpcy4NCi0JCXtTX1VURn0qIHtafVw/e1p9PntafSAgICB7eXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kO30NCi19DQotDQotPFNUX1BBR0VfRElSRUNUSVZFPg0KLXsNCi0vLyAgcmVtb3ZlZCAnbGFuZ3VhZ2UnIHNpbmNlIGl0IHJlYWxseSBjYW4gYmUgaGFuZGxlZCBzZXBlcmF0ZWx5IGZyb20gZW5jb2RpbmcsIGJ1dCBtYXkgYWRkIGl0IGJhY2sgbGF0ZXIgZm9yIHNpbXBsZSByZS11c2UuDQotCQl7Wn1se1p9YXtafW57Wn1ne1p9dXtafWF7Wn1ne1p9ZXtafSAgICAge0JlZ2luQXR0cmlidXRlVmFsdWVVVEZ9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlTGFuZ3VhZ2U7fQ0KLSAgICAgICAge1p9Y3tafW97Wn1ue1p9dHtafWV7Wn1ue1p9dHtafVR7Wn15e1p9cHtafWV7Wn0ge0JlZ2luQXR0cmlidXRlVmFsdWVVVEZ9ICB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUNvbnRlbnRUeXBlO30NCi0gICAgICAgIHtafXB7Wn1he1p9Z3tafWV7Wn1Fe1p9bntafWN7Wn1ve1p9ZHtafWl7Wn1ue1p9Z3tafSB7QmVnaW5BdHRyaWJ1dGVWYWx1ZVVURn0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VFbmNvZGluZzt9DQotICAgICAgICAvLyBub3RlIHRoZSAiZm9yY2VkIGVuZCIgKHZpYSAnaGFzTW9yZT1mYWxzZScpIG9uY2UgdGhlIGVuZCBvZiBYTUwgRGVjbGFyYXRpb24gZm91bmQNCi0gICAgICAgIC8vIFRoaXMgaXMgc2luY2Ugbm9uLWFzY2lpIGNoYXJzIG1heSBmb2xsb3cgYW5kIG1heSBjYXVzZSBJT0V4Y2VwdGlvbnMgd2hpY2ggd291bGQgbm90IG9jY3VyIG9uY2Ugc3RyZWFtIGlzDQotICAgICAgICAvLyByZWFkIGluIGNvcnJlY3QgZW5jb2RpbmcuDQotDQotICAgICAgICAvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDIwNSBkZW1vbnN0cmF0ZXMgaG93IHdlIG5lZWQgdG8ga2VlcCBwYXJzaW5nLA0KLSAgICAgICAgLy8gZXZlbiBpZiBjb21lIHRvIGVuZCBvZiBvbmUgcGFnZSBkaXJlY3RpdmUsIHNvIGhhc01vcmU9ZmFsc2Ugd2FzIHJlbW92ZWQgZnJvbSB0aGVzZSBydWxlcy4NCi0JCXtafSV7Wn0+e1p9ICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZUVuZDt9DQotICAgICAgICB7Wn1cL3tafT57Wn0gICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVFbmQ7fQ0KLX0NCi0NCi0NCi08UXVvdGVkQXR0cmlidXRlVmFsdWU+DQotew0KLSAgICAgICAge1p9XCJ7Wn0gICAgICAgICAgICAgICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0NCi0gICAgICAgIHtafVwne1p9ICAgICAgICAgICAgICAgICAgICAgIHsgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9DQotICAgICAgICAvLyBpbiB0aGlzIHN0YXRlLCBhbnl0aGluZyBvdGhlciB0aGFuIGEgc3BhY2UgY2hhcmFjdGVyIGNhbiBzdGFydCBhbiB1bmRlbGltaXRlZCBzdHJpbmcNCi0JCXtTX1VURn0qLiAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTt9DQotfQ0KLQ0KLQ0KLTxEUV9TVFJJTkc+DQotew0KLQ0KLSAgICAgICAge1p9XCJ7Wn0JCQl7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0NCi0gICAgICAgIHtafXtMaW5lVGVybWluYXRvcn17Wn0gICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLSAgICAgICAge1p9XD97Wn0+e1p9CXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0gICAgICAgIHtafTx7Wn0JCQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCQlbXlx4MDBdCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9DQotICAgICAgICB7Wn0le1p9PntafQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotDQotDQotfQ0KLQ0KLTxTUV9TVFJJTkc+DQotew0KLQ0KLSAgICAgICAge1p9XCd7Wn0gICAgICAgICAgICAgICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlO30NCi0JCXtafXtMaW5lVGVybWluYXRvcn17Wn0gICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLSAgICAgICAge1p9JXtafT57Wn0gICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0gICAgICAgIHtafTx7Wn0gICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0JCS8vIFNraXAgb3ZlciB0aGUgc2luZ2xlLWJ5dGUgMHMNCi0JCVteXHgwMF0JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0NCi0gICAgICAgIHtafSV7Wn0+e1p9ICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0NCi0NCi19DQotDQotPFVuRGVsaW1pdGVkU3RyaW5nPg0KLXsNCi0NCi0NCi0gICAgICAgIHtTX1VURn0gICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9DQotICAgICAgICB7Wn17TGluZVRlcm1pbmF0b3J9e1p9ICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0gICAgICAgIHtafVw/e1p9PntafSAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0gICAgICAgIHtafTx7Wn0gICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0gICAgICAgIC8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQ0KLSAgICAgICAge1p9XCd7Wn0gICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9DQotICAgICAgICB7Wn1cIntafSAgICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30gICAgICAgIA0KLQ0KLQkJW15ceDAwXQkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQ0KLSAgICAgICAge1p9JXtafT57Wn0gICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQ0KLX0NCi0NCi0vLyBUaGUgIm1hdGNoIGFueXRoaW5nIiBydWxlIHNob3VsZCBhbHdheXMgYmUgaW4gZWZmZWN0IGV4Y2VwdCBmb3Igd2hlbiBsb29raW5nIGZvciBlbmQgb2Ygc3RyaW5nDQotLy8gKFRoYXQgaXMsIHJlbWVtYmVyIHRvIHVwZGF0ZSBzdGF0ZSBsaXN0IGlmL3doZW4gbmV3IHN0YXRlcyBhZGRlZCkNCi0ufFxuCXtpZih5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9fQ0KLQ0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0DQotPDxFT0Y+PiAgICAgICAgIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7fQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkUGFyc2VyLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkUGFyc2VyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViZTE4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZFBhcnNlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0idG9rZW5pemVyIiBkZWZhdWx0PSJIZWFkVG9rZW5pemVyIj4KLQkKLQk8IS0tIE5vdGU6IGZvciBFY2xpcHNlIGVudi4sIHRoZSBKRmxleCAxLjQgamFyIHNob3VsZCBiZSBhZGRlZCAKLQl0byB0aGUgYW50IGdsb2JhbCBlbnRyaWVzICAtLT4KLQk8dGFza2RlZiBjbGFzc25hbWU9IkpGbGV4LmFudHRhc2suSkZsZXhUYXNrIiBuYW1lPSJqZmxleCIgLz4KLQkJCi0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5maWxlIiB2YWx1ZT0iSlNQSGVhZFRva2VuaXplci5qRmxleCIvPgkJCQotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IkhlYWRQYXJzZXJzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9Ii4uL3NyYyIvPgotCQk8IS0tIHRvdWNoIGNhdXNlcyB0byBhbHdheXMgYnVpbGQsIHJlbW92ZSBmb3IgcmVhbCAnbWFrZScgYmVoYXZpb3IgLS0+Ci0JCTx0b3VjaCBmaWxlPSIke3NyYy5kaXJ9LyR7c3JjLmZpbGV9Ii8+Ci0JCQkJCQotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJIZWFkVG9rZW5pemVyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJydW4tamZsZXgiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnVuLWpmbGV4IiBkZXBlbmRzPSJpbml0Ij4KLQkJPGpmbGV4Ci0JICAgIAlmaWxlPSIke3NyYy5kaXJ9LyR7c3JjLmZpbGV9IgotCSAgICAJZGVzdGRpcj0iJHtkZXN0LmRpcn0iCi0JCQl2ZXJib3NlPSJ0cnVlIgotCQkJbm9iYWs9InRydWUiCi0JCQl0aW1lPSJvbiIKLQkgICAgLz4KLQk8L3RhcmdldD4KLQkKLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMGY5NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuNDAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhc2tzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbCwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlcno7eC1pbnRlcm5hbDo9dHJ1ZQotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnRleHQ7dmVyc2lvbj0iMy44IiwKLSBjb20uaWJtLmljdS51dGlsO3ZlcnNpb249IjMuOCIsCi0gamF2YXguc2VydmxldC5qc3AudGFnZXh0O3ZlcnNpb249IlsyLjAuMCwyLjIuMCkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5qb2JzO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDMuOC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjQwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjEwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS40LjAsMi4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDIuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcztidW5kbGUtdmVyc2lvbj0iMy4yLjAiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eTsgZXhjbHVkZTo9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZSxvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YTUyMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gRGV2VGltZVN1cHBvcnQvLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5MWU2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBKU1AgTW9kZWwKLVN0cnVjdHVyZWRfSlNQX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWU9U3RydWN0dXJlZCBKU1AgRG9jdW1lbnQgRmFjdG9yeSBFeHRlbnNpb24KLUpTUF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AKLUpTUF9UYWdfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIFRhZyBEZWZpbml0aW9uCi1KU1BfVGFnWF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1YTUwgSlNQIFRhZyBEZWZpbml0aW9uCi1KU1BfVExEX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPVRhZyBMaWJyYXJ5IERlc2NyaXB0b3IKLUpTUF9GcmFnbWVudF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgRnJhZ21lbnQKLUpTUF9TeW50YXhfVmFsaWRhdG9yLm5hbWU9SlNQIFN5bnRheCBWYWxpZGF0b3IKLUpTUF9EaXJlY3RpdmVfVmFsaWRhdG9yLm5hbWU9SlNQIERpcmVjdGl2ZSBWYWxpZGF0b3IKLUVMX1N5bnRheF9WYWxpZGF0b3IubmFtZT1FTCBTeW50YXggVmFsaWRhdG9yCi1KU1BfQ29udGVudF9WYWxpZGF0b3IubmFtZT1KU1AgQ29udGVudCBWYWxpZGF0b3IKLVRMRFZhbGlkYXRvci5uYW1lPVRhZyBMaWJyYXJ5IERlc2NyaXB0b3IgVmFsaWRhdG9yCi1TdHJ1Y3R1cmVkX0pTUF9Eb2N1bWVudF9TZXR1cF9wYXJ0aWNpcGFudC5uYW1lPVN0cnVjdHVyZWQgSlNQIERvY3VtZW50IFNldHVwIFBhcnRpY2lwYW50Ci1fdmFsaWRhdGlvbk1hcmtlci5uYW1lPUpTUCBQcm9ibGVtCi1fdGFza01hcmtlci5uYW1lPUpTUCBUYXNrCi0KLWV4dGVuc2lvbi1wb2ludC5uYW1lLjAgPSBKU1AgRUwgVHJhbnNsYXRvcgotCi1jb250ZW50VHlwZUNTU0pTUE5hbWU9Q1NTIEpTUAotY29udGVudFR5cGVDU1NKU1BGTmFtZT1DU1MgSlNQIEZyYWdtZW50Ci0KLWNvbnRlbnRUeXBlQ1NTRG9jdW1lbnRGYWN0b3J5TmFtZT1Db250ZW50IFR5cGUgQ1NTIEpTUCBkb2N1bWVudCBmYWN0b3J5IGV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNjI3MWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVsVHJhbnNsYXRvciIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5uYW1lLjAiIHNjaGVtYT0ic2NoZW1hL2VsdHJhbnNsYXRvci5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCQk8bW9kZWxIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JKU1AiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGZyYWdtZW50c291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yVGFnIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci50YWciPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudEZhY3RvcmllcyI+Ci0JCTxmYWN0b3J5Ci0JCQl0eXBlPSJ0bGQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuQ01Eb2N1bWVudEZhY3RvcnlUTEQiPgotCQk8L2ZhY3Rvcnk+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiPgotCQk8c2Nhbm5lcgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YXNrcy5KU1BGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhc2tzLkpTUEZpbGVUYXNrU2Nhbm5lcjpvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFza01hcmtlciIKLQkJCWNvbnRlbnRUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJaWQ9InRhc2tNYXJrZXIiCi0JCW5hbWU9IiVfdGFza01hcmtlci5uYW1lIgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGFza21hcmtlciIvPgotCQk8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotCTwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ2YWxpZGF0aW9uTWFya2VyIgotICAgICAgICAgbmFtZT0iJV92YWxpZGF0aW9uTWFya2VyLm5hbWUiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJvYmxlbW1hcmtlciIvPgotICAgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLSA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfSlNQX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRTZXR1cCIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5kb2N1bWVudHNldHVwIgotCQluYW1lPSIlU3RydWN0dXJlZF9KU1BfRG9jdW1lbnRfU2V0dXBfcGFydGljaXBhbnQubmFtZSI+Ci0JCTxwYXJ0aWNpcGFudAotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImpzcCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJqc3BmIiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJqc3B4IiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJqc2YiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ianN2Ij4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Imp0cGwiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0idGxkIiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ0YWciIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InRhZ3giIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InRhZ2YiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdFByb2Nlc3NvcnMiPgotCQk8cHJvY2Vzc29yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQuSFRNTEZvcm1hdFByb2Nlc3NvckltcGwiCi0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJPC9wcm9jZXNzb3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlLmNvbnRlbnRUeXBlcyI+Ci0JCTwhLS0gY3JlYXRlIGNvbnRlbnQgdHlwZSBmb3IgSlNQIGZpbGVzIC0tPgotCQk8Y29udGVudC10eXBlCi0JCQlmaWxlLWV4dGVuc2lvbnM9ImpzcCxqc3YsanRwbCxqc3B4IgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlSlNQX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgotCQkJZGVmYXVsdC1jaGFyc2V0PSJJU08tODg1OS0xIj4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkNvbnRlbnREZXNjcmliZXJGb3JKU1AiIC8+Ci0JCTwvY29udGVudC10eXBlPgotCQk8IS0tIGNyZWF0ZSBjb250ZW50IHR5cGUgZm9yIEpTUCBmcmFnbWVudCBmaWxlcyAtLT4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJqc3BmLGpzZiIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJUpTUF9GcmFnbWVudF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IklTTy04ODU5LTEiPgotCQkJPGRlc2NyaWJlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ29udGVudERlc2NyaWJlckZvckpTUCIgLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0JCTwhLS0gY3JlYXRlIGNvbnRlbnQgdHlwZSBmb3IgSlNQIDIuMCBUYWcgZmlsZSB0eXBlcyAtLT4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ0YWcsdGFnZiIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJUpTUF9UYWdfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ3NvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCWRlZmF1bHQtY2hhcnNldD0iSVNPLTg4NTktMSIvPgotCQk8IS0tIGNyZWF0ZSBjb250ZW50IHR5cGUgZm9yIEpTUCAyLjAgVGFnWCBmaWxlIHR5cGVzIC0tPgotCQk8Y29udGVudC10eXBlCi0JCQlmaWxlLWV4dGVuc2lvbnM9InRhZ3gsdGFneGYiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVKU1BfVGFnWF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFneHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ3NvdXJjZSIKLQkJCWRlZmF1bHQtY2hhcnNldD0iSVNPLTg4NTktMSIvPgotCQk8IS0tIGNyZWF0ZSBjb250ZW50IHR5cGUgZm9yIC50bGQgZmlsZXMgLS0+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0idGxkIgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlSlNQX1RMRF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGxkc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCI+Ci0JCQk8IS0tIGFkZCB0aGUgZGVzY3JpYmVyIHNvIGl0J3MgcHJvcGVybHkgZGV0ZWN0ZWQgd2hlbiBvcGVuZWQgZnJvbSB3aXRoaW4gLmphciBmaWxlcyAtLT4KLQkJCTxkZXNjcmliZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LlhNTFJvb3RFbGVtZW50Q29udGVudERlc2NyaWJlciI+Ci0JCQkJPHBhcmFtZXRlciBuYW1lPSJlbGVtZW50IiB2YWx1ZT0idGFnbGliIi8+Ci0JCQk8L2Rlc2NyaWJlcj4KLQkJPC9jb250ZW50LXR5cGU+Ci0JCQotCi0gIAk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIG1pbmltYWwgY29udGVudC10eXBlIGNzcyBqc3Agc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgICAgICAgPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJqc3AiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVjb250ZW50VHlwZUNTU0pTUE5hbWUiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ29udGVudERlc2NyaWJlckZvckpTUGVkQ1NTIiAvPgotCQk8L2NvbnRlbnQtdHlwZT4KLSAgICAgICAgPGNvbnRlbnQtdHlwZQotCSAgICAgICAgZmlsZS1leHRlbnNpb25zPSJqc3BmIgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlY29udGVudFR5cGVDU1NKU1BGTmFtZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwZnJhZ21lbnRzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiPgotCQkJPGRlc2NyaWJlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkNvbnRlbnREZXNjcmliZXJGb3JKU1BlZENTUyIgLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIGluaXRpYWxpemUganNwIGNvcmUgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkpTUENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEpTUCBiYXRjaCB2YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24gaWQ9IkpTUEJhdGNoVmFsaWRhdG9yIiBuYW1lPSIlSlNQX1N5bnRheF9WYWxpZGF0b3IubmFtZSIgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIGJ1aWxkPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEJhdGNoVmFsaWRhdG9yIgotICAgICAgICAgICAgbWFudWFsPSJ0cnVlIgotICAgICAgICAgICAgdmVyc2lvbj0iMSIKLSAgICAgICAgICAgIG1hcmtlcklkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudmFsaWRhdGlvbk1hcmtlciIKLSAgICAgICAgICAgIHNvdXJjZWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmpzcGVsc291cmNldmFsaWRhdG9yLCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZhbGlkYXRpb24uanNwYWN0aW9udmFsaWRhdG9yLCBvcmcuZWNsaXBzZS5qc3QuanNwLnRsZHNvdXJjZXZhbGlkYXRvciwgb3JnLmVjbGlwc2UuanN0LmpzcC5qc3Bzb3VyY2V2YWxpZGF0b3IiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0JICAgICAgICAgICA8cHJvamVjdE5hdHVyZSBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIvPgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotCQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIvPgotCQkJCTwhLS0gbmVlZGVkIHVudGlsIGJ1ZyAxODE0NDMgaXMgaW1wbGVtZW50ZWQgLS0+Ci0JCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2UiLz4KLQkJCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ianNwIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ianNwZiI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9ImpzZiI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InRhZyI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InRhZ2YiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICAgZXh0PSJqc3YiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICAgZXh0PSJqdHBsIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgICA8Z3JvdXAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5zdHJ1Y3R1cmVkTW9kZWxHcm91cCIvPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQkKLSAgIDxleHRlbnNpb24gaWQ9IkpTUENvbnRlbnRWYWxpZGF0b3IiIG5hbWU9IiVKU1BfQ29udGVudF9WYWxpZGF0b3IubmFtZSIgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIGJ1aWxkPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUENvbnRlbnRWYWxpZGF0b3IiCi0gICAgICAgICAgICBtYW51YWw9InRydWUiCi0gICAgICAgICAgICB2ZXJzaW9uPSIxIgotICAgICAgICAgICAgbWFya2VySWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS52YWxpZGF0aW9uTWFya2VyIgotICAgICAgICAgICAgc291cmNlaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5tYXJrdXB2YWxpZGF0b3IsIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5odG1sc3ludGF4dmFsaWRhdG9yIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotCQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIvPgotCQkJCTwhLS0gbmVlZGVkIHVudGlsIGJ1ZyAxODE0NDMgaXMgaW1wbGVtZW50ZWQgLS0+Ci0JCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ianNwIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ianNwZiI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9ImpzZiI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InRhZyI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InRhZ2YiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICAgZXh0PSJqc3YiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICAgZXh0PSJqdHBsIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgICA8Z3JvdXAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5zdHJ1Y3R1cmVkTW9kZWxHcm91cCIvPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBpZD0iVExEVmFsaWRhdG9yIiBuYW1lPSIlVExEVmFsaWRhdG9yLm5hbWUiIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5UTERWYWxpZGF0b3IiCi0gICAgICAgICAgICBtYW51YWw9InRydWUiCi0gICAgICAgICAgICB2ZXJzaW9uPSIxIgotICAgICAgICAgICAgc291cmNlaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5qc3BhY3Rpb252YWxpZGF0b3IsIG9yZy5lY2xpcHNlLmpzdC5qc3AudGxkc291cmNldmFsaWRhdG9yIj4KLSAgICAgICAgICAgIG1hcmtlcklkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudmFsaWRhdGlvbk1hcmtlciI+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLQkJCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50bGRzb3VyY2UiLz4KLQkJCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWd4c291cmNlIi8+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dCBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIgZXh0PSJ0bGQiLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9InRhZ3giLz4KLSAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgIDxncm91cCBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnN0cnVjdHVyZWRNb2RlbEdyb3VwIi8+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCQkKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5lbFRyYW5zbGF0b3IiPgotICAgICAgIDxlbFRyYW5zbGF0b3IKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuSlNQRUxUcmFuc2xhdG9yIgotICAgICAgICAgIG5hbWU9IkRlZmF1bHQgSlNQIDIuMCBFTCBUcmFuc2xhdG9yIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmRlZmF1bHRKU1AyMCIvPgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbEhhbmRsZXIiPgotCQk8bW9kZWxIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCQk8bW9kZWxIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcGZyYWdtZW50c291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUubW9kZWxoYW5kbGVyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudENyZWF0aW9uIgotCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJWNvbnRlbnRUeXBlQ1NTRG9jdW1lbnRGYWN0b3J5TmFtZSI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVycy5CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudFNldHVwIgotCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5kb2N1bWVudHNldHVwIgotCQluYW1lPSIlU3RydWN0dXJlZF9KU1BfRG9jdW1lbnRfU2V0dXBfcGFydGljaXBhbnQubmFtZSI+Ci0JCTxwYXJ0aWNpcGFudAotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5KU1BlZENTU1RhZ2xpYkNvbnRyb2xsZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnRmYWN0b3JpZXMuZnJhZ21lbnQiCi0JCW5hbWU9IiVjb250ZW50VHlwZUNTU0RvY3VtZW50RmFjdG9yeU5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcGZyYWdtZW50c291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVycy5CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+CQotCS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbFF1ZXJ5RXh0ZW5zaW9ucyI+Ci0JCTxtb2RlbFF1ZXJ5RXh0ZW5zaW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuSlNQTW9kZWxRdWVyeUV4dGVuc2lvbiIKLQkJCWNvbnRlbnRUeXBlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJPC9tb2RlbFF1ZXJ5RXh0ZW5zaW9uPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbFF1ZXJ5RXh0ZW5zaW9ucyI+Ci0JCTxtb2RlbFF1ZXJ5RXh0ZW5zaW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuVGFnbGliTW9kZWxRdWVyeUV4dGVuc2lvbiIKLQkJCWNvbnRlbnRUeXBlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJPC9tb2RlbFF1ZXJ5RXh0ZW5zaW9uPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbFF1ZXJ5RXh0ZW5zaW9ucyI+Ci0JCTxtb2RlbFF1ZXJ5RXh0ZW5zaW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuSlNQTW9kZWxRdWVyeUV4dGVuc2lvbiIKLQkJCWNvbnRlbnRUeXBlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnc291cmNlIj4KLQkJPC9tb2RlbFF1ZXJ5RXh0ZW5zaW9uPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbFF1ZXJ5RXh0ZW5zaW9ucyI+Ci0JCTxtb2RlbFF1ZXJ5RXh0ZW5zaW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuVGFnbGliTW9kZWxRdWVyeUV4dGVuc2lvbiIKLQkJCWNvbnRlbnRUeXBlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnc291cmNlIj4KLQkJPC9tb2RlbFF1ZXJ5RXh0ZW5zaW9uPgotCTwvZXh0ZW5zaW9uPgkKLQkKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zY2hlbWEvZWx0cmFuc2xhdG9yLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zY2hlbWEvZWx0cmFuc2xhdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZTQxMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc2NoZW1hL2VsdHJhbnNsYXRvci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlIiBpZD0iZWxUcmFuc2xhdG9yIiBuYW1lPSJKU1AgRUwgVHJhbnNsYXRvciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFeHRlbnNpb24gcG9pbnQgdG8gY3VzdG9tZXIgSlNQIEV4cHJlc3Npb24gTGFuZ3VhZ2UgR2VuZXJhdGlvbgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbFRyYW5zbGF0b3IiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImVsVHJhbnNsYXRvciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIEVMIFRyYW5zbGF0b3IuICBNdXN0IGJlIGFuIGltcGxlbWVudG9yIG9mIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbC5JSlNQRUxUcmFuc2xhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIEVMIHRyYW5zbGF0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB1bmlxdWUgc3RyaW5nIGlkZW50aWZpZXIgZm9yIGFuIEVMIFRyYW5zbGF0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0Fzc2VydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9Bc3NlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkOGUxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0Fzc2VydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWw7Ci0KLQotCi0vKioKLSAqIDxjb2RlPkFzc2VydDwvY29kZT4gaXMgdXNlZnVsIGZvciBmb3IgZW1iZWRkaW5nIHJ1bnRpbWUgc2FuaXR5IGNoZWNrcyBpbgotICogY29kZS4gVGhlIHByZWRpY2F0ZSBtZXRob2RzIGFsbCB0ZXN0IGEgY29uZGl0aW9uIGFuZCB0aHJvdyBzb21lIHR5cGUgb2YKLSAqIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBkb2VzIG5vdCBob2xkLgotICogPHA+Ci0gKiBBc3NlcnRpb24gZmFpbHVyZSBleGNlcHRpb25zLCBsaWtlIG1vc3QgcnVudGltZSBleGNlcHRpb25zLCBhcmUgdGhyb3duIHdoZW4KLSAqIHNvbWV0aGluZyBpcyBtaXNiZWhhdmluZy4gQXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBpbnZhcmlhYmx5IHVuc3BlY2lmaWVkCi0gKiBiZWhhdmlvcjsgY29uc2VxdWVudGx5LCBjbGllbnRzIHNob3VsZCBuZXZlciByZWx5IG9uIHRoZXNlIGJlaW5nIHRocm93bgotICogKGFuZCBjZXJ0YWlubHkgc2hvdWxkIG5vdCBiZWluZyBjYXRjaGluZyB0aGVtIHNwZWNpZmljYWxseSkuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3NlcnQgewotCi0JLyoqCi0JICogPGNvZGU+QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uPC9jb2RlPiBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRocm93bgotCSAqIGJ5IHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4gPGNvZGU+QXNzZXJ0PC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGlzIGNsYXNzIGlzIG5vdCBkZWNsYXJlZCBwdWJsaWMgdG8gcHJldmVudCBzb21lIG1pc3VzZXM7IHByb2dyYW1zCi0JICogdGhhdCBjYXRjaCBvciBvdGhlcndpc2UgZGVwZW5kIG9uIGFzc2VydGlvbiBmYWlsdXJlcyBhcmUgc3VzY2VwdGlibGUgdG8KLQkgKiB1bmV4cGVjdGVkIGJyZWFrYWdlIHdoZW4gYXNzZXJ0aW9ucyBpbiB0aGUgY29kZSBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiA8L3A+Ci0JICovCi0JY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uLgotCQkgKi8KLQkJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIGRldGFpbCkgewotCQkJc3VwZXIoZGV0YWlsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgbm90Ci0JICogPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMKLQkgKiB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQKLQkgKiBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOwotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgaXMKLQkgKiBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuCi0JICogbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEFzc2VydCgpLm5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMgaXMgbm90Ci0JICogdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UKLQkgKiBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZQotCSAqICAgICAgICAgY2hlY2sgZmFpbHMpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikgewotCQkJdGhyb3cgbmV3IEFzc2VydCgpLm5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLwotCXByaXZhdGUgQXNzZXJ0KCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvSlNQQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTcxMjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvSlNQQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgSlNQIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpblJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl85OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl8xMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQQWN0aW9uVmFsaWRhdG9yXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BBY3Rpb25WYWxpZGF0b3JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BJbmRleE1hbmFnZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BJbmRleE1hbmFnZXJfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BfU2VhcmNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEVMX1N5bnRheDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BFTF9Ub2tlbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEb2N1bWVudExvYWRlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BCYXRjaFZhbGlkYXRvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ2xpYkhlbHBlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ2xpYkhlbHBlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ2xpYkhlbHBlcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ2xpYkhlbHBlcl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFRyYW5zbGF0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BUcmFuc2xhdG9yXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQVHJhbnNsYXRvcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFRyYW5zbGF0b3JfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BUcmFuc2xhdG9yXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQVHJhbnNsYXRvcl81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEVMVHJhbnNsYXRvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRMRFZhbGlkYXRvcl9NaXNzaW5nVmFsaWRhdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRMRFZhbGlkYXRvcl9NaXNzaW5nVmFyaWFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVExEVmFsaWRhdG9yX01pc3NpbmdMaXN0ZW5lcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbml0aWFsaXppbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGluZ19KU1BfVHJhbnNsYXRpb25zOwotCQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9KU1BfVkFMSURBVElOR19NRVNTQUdFX1VJXzsKLQkKLQlwcml2YXRlIEpTUENvcmVNZXNzYWdlcygpIHsKLQl9Ci0KLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKU1BDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvSlNQQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMDFiNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTYXZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU2F2ZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTYXZlZFN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0b3JQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUEluZGV4TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliLlRhZ2xpYkhlbHBlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5UYWdsaWJJbmRleDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEpTUENvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgSlNQQ29yZVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqIFNhdmUgcGFydGljaXBhbnQgZm9yIHRoaXMgcGx1Z2luICovCi0JcHJpdmF0ZSBJU2F2ZVBhcnRpY2lwYW50IGZTYXZlUGFydGljaXBhbnQ7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEpTUENvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCWZTYXZlUGFydGljaXBhbnQgPSBuZXcgU2F2ZVBhcnRpY2lwYW50KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSlNQQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQotCQkvKgotCQkgKiBKU1BJbmRleE1hbmFnZXIgZGVwZW5kcyBvbiBUYWdsaWJDb250cm9sbGVyLCBzbyBUYWdsaWJDb250cm9sbGVyCi0JCSAqIHNob3VsZCBiZSBzdGFydGVkIGZpcnN0Ci0JCSAqLwotCQlUYWdsaWJJbmRleC5zdGFydHVwKCk7Ci0JCVRhZ2xpYkNvbnRyb2xsZXIuc3RhcnR1cCgpOwotCi0JCS8vIGxpc3RlbiBmb3IgY2xhc3NwYXRoIGNoYW5nZXMKLQkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcihUYWdsaWJIZWxwZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkpOwotCi0JCS8qCi0JCSAqIFJlc3RvcmUgc2F2ZSBzdGF0ZSBhbmQgcHJvY2VzcyBhbnkgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYmVmb3JlCi0JCSAqIHBsdWctaW4gbG9hZGVkLiBEb24ndCBkbyBpdCBpbW1lZGlhdGVseSBzaW5jZSBhZGRpbmcgdGhlIHNhdmUKLQkJICogcGFydGljaXBhbnQgcmVxdWlyZXMgYSBsb2NrIG9uIHRoZSB3b3Jrc3BhY2UgdG8gY29tcHV0ZSB0aGUKLQkJICogYWNjdW11bGF0ZWQgZGVsdGFzLCBhbmQgaWYgdGhlIHRyZWUgaXMgbm90IGFscmVhZHkgbG9ja2VkIGl0Ci0JCSAqIGJlY29tZXMgYSBibG9ja2luZyBjYWxsLgotCQkgKi8KLQkJaWYgKEpTUFRyYW5zbGF0b3JQZXJzaXN0ZXIuQUNUSVZBVEVEKSB7Ci0JCQlKb2IgcGVyc2lzdGVyID0gbmV3IEpvYihKU1BDb3JlTWVzc2FnZXMuSW5pdGlhbGl6aW5nKSB7Ci0JCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXdvcmtzcGFjZS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQkJCUlTYXZlZFN0YXRlIHNhdmVkU3RhdGUgPSBudWxsOwotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJc2F2ZWRTdGF0ZSA9IHdvcmtzcGFjZS5hZGRTYXZlUGFydGljaXBhbnQoZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIGZTYXZlUGFydGljaXBhbnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2FkIHByZXZpb3VzIHNhdmUgc3RhdGUiLCBlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoc2F2ZWRTdGF0ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0UHJpb3JpdHkoVGhyZWFkLk1JTl9QUklPUklUWSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJCQlzYXZlZFN0YXRlLnByb2Nlc3NSZXNvdXJjZUNoYW5nZUV2ZW50cyhKU1BUcmFuc2xhdG9yUGVyc2lzdGVyLmdldERlZmF1bHQoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9LCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBzZXQgdXAgcGVyc2lzdGVyIHRvIGxpc3RlbiB0byByZXNvdXJjZSBjaGFuZ2UKLQkJCQkJCSAqIGV2ZW50cwotCQkJCQkJICovCi0JCQkJCQl3b3Jrc3BhY2UuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihKU1BUcmFuc2xhdG9yUGVyc2lzdGVyLmdldERlZmF1bHQoKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCQkJfTsKLQkJCXBlcnNpc3Rlci5zZXRVc2VyKGZhbHNlKTsKLQkJCXBlcnNpc3Rlci5zY2hlZHVsZSgyMDAwKTsKLQkJfQotCQkKLQkJLy9pbml0IHRoZSBKU1AgaW5kZXgKLQkJSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuaW5pdGlhbGl6ZSgpOwotCi0JCS8vIGxpc3RlbiBmb3IgcmVzb3VyY2UgY2hhbmdlcyB0byB1cGRhdGUgY29udGVudCBwcm9wZXJ0aWVzIGtleXMKLQkJSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zdGFydHVwKCk7Ci0KLQkJRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLnN0YXJ0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUuc3RvcCgpOwotCi0JCS8qCi0JCSAqIHN0b3AgbGlzdGVuaW5nIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMKLQkJICoga2V5cwotCQkgKi8KLQkJSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zaHV0ZG93bigpOwotCi0JCS8vcmVtb3ZlIHRoZSBwbHVnaW4gc2F2ZSBwYXJ0aWNpcGFudAotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlU2F2ZVBhcnRpY2lwYW50KHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgdHJhbnNsYXRvciBwZXJzaXN0ZXIKLQkJaWYoSlNQVHJhbnNsYXRvclBlcnNpc3Rlci5BQ1RJVkFURUQpIHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKEpTUFRyYW5zbGF0b3JQZXJzaXN0ZXIuZ2V0RGVmYXVsdCgpKTsKLQkJfQotCQkKLQkJLy8gc3RvcCBhbnkgaW5kZXhpbmcKLQkJSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2h1dGRvd24oKTsKLQotCQkvLyBzdG9wIGxpc3RlbmluZyBmb3IgY2xhc3NwYXRoIGNoYW5nZXMKLQkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcihUYWdsaWJIZWxwZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkpOwotCi0JCS8vIHN0b3AgdGFnbGliIGNvbnRyb2xsZXIKLQkJVGFnbGliQ29udHJvbGxlci5zaHV0ZG93bigpOwotCQlUYWdsaWJJbmRleC5zaHV0ZG93bigpOwotCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgc28gdGhhdCBhbGwgb2YgdGhlIElSZXNvdXJjZUNoYW5nZUV2ZW50cyB0aGF0IG9jY3VycmVkIGJlZm9yZQotCSAqIHRoaXMgcGx1Z2luIGxvYWRlZCBjYW4gYmUgcHJvY2Vzc2VkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFNhdmVQYXJ0aWNpcGFudCBpbXBsZW1lbnRzIElTYXZlUGFydGljaXBhbnQgewotCQkvKioKLQkJICogPHA+RGVmYXVsdCBjb25zdHJ1Y3RvcjwvcD4KLQkJICovCi0JCXByb3RlY3RlZCBTYXZlUGFydGljaXBhbnQoKSB7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTYXZlUGFydGljaXBhbnQjZG9uZVNhdmluZyhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU2F2ZUNvbnRleHQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkb25lU2F2aW5nKElTYXZlQ29udGV4dCBjb250ZXh0KSB7Ci0JCQkvL2lnbm9yZQotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTYXZlUGFydGljaXBhbnQjcHJlcGFyZVRvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU2F2ZUNvbnRleHQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcmVwYXJlVG9TYXZlKElTYXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkvL2lnbm9yZQotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTYXZlUGFydGljaXBhbnQjcm9sbGJhY2sob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVNhdmVDb250ZXh0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcm9sbGJhY2soSVNhdmVDb250ZXh0IGNvbnRleHQpIHsKLQkJCS8vaWdub3JlCi0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVNhdmVQYXJ0aWNpcGFudCNzYXZpbmcob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVNhdmVDb250ZXh0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2F2aW5nKElTYXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQljb250ZXh0Lm5lZWREZWx0YSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlOTFiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUpTUEluZGV4TWFuYWdlcl8wPVVwZGF0aW5nIEpTUCBJbmRleAotSlNQSW5kZXhNYW5hZ2VyXzI9SlNQIEluZGV4ZXIgaW5kZXhpbmcgezB9IGZpbGVzCi1KU1BfU2VhcmNoPUpTUCBTZWFyY2ggLSAKLUpTUERvY3VtZW50TG9hZGVyXzE9UHJvZ3JhbSBFcnJvcjogc3RydWN0dXJlZCBtb2RlbCBoYWQgbm8gc3RydWN0dXJlZERvY3VtZW50Ci1KU1BFTF9TeW50YXg9RUwgU3ludGF4IEVycm9yIAotSlNQRUxfVG9rZW49VW5hYmxlIHRvIGFuYWx5emUgRUwgZXhwcmVzc2lvbiBkdWUgdG8gbGV4aWNhbCBhbmFseXNpcyBlcnJvcgotTUVTU0FHRV9KU1BfVkFMSURBVElOR19NRVNTQUdFX1VJXz1KU1AgVmFsaWRhdG9yIHZhbGlkYXRpbmcgezB9Ci1KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nPVVwZGF0aW5nIEpTUCBGcmFnbWVudCBDb250ZW50IFNldHRpbmdzCi1KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1Byb2JsZW1zX1VwZGF0aW5nPVByb2JsZW0gc2F2aW5nIEpTUCBGcmFnbWVudCBDb250ZW50IFNldHRpbmdzIGZvciB7MH0KLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl8wPXswfSBpcyBhIHJlc2VydmVkIHByZWZpeC4gIFRyeSBhbm90aGVyCi1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMT1DYW4gbm90IGZpbmQgdGhlIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZm9yICJ7MH0iCi1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMj1UaGUgcHJlZml4ICJ7MH0gImlzIHVzZWQgbW9yZSB0aGFuIG9uY2UKLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl8zPUEgezB9IHZhbHVlIGlzIHJlcXVpcmVkIGluIHRoaXMgZGlyZWN0aXZlCi1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfND1GcmFnbWVudCAiezB9IiB3YXMgbm90IGZvdW5kIGF0IGV4cGVjdGVkIHBhdGggezF9Ci1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfNT1NaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSAiezB9IgotSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzY9VW5kZWZpbmVkIGF0dHJpYnV0ZSBuYW1lICJ7MH0iCi1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfNz1BIHswfSBvciB7MX0gdmFsdWUgaXMgcmVxdWlyZWQgaW4gdGhpcyBkaXJlY3RpdmUKLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl84PVRoZSBzdXBlcmNsYXNzICJ7MH0iIHdhcyBub3QgZm91bmQgb24gdGhlIEphdmEgQnVpbGQgUGF0aAotSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzk9Q2FuIG5vdCBmaW5kIHRoZSB0YWcgbGlicmFyeSBkZXNjcmlwdG9yIGZvciAiezB9Ii4gIFRyeSBpbmNyZWFzaW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBEeW5hbWljIFdlYiBNb2R1bGUgcHJvamVjdCBmYWNldC4KLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl8xMD1DYW4gbm90IGZpbmQgdGhlIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZm9yICJ7MH0iLiAgVHJ5IHVzaW5nIGEgbmV3ZXIgZ3JhbW1hciBvciBkZWNsYXJlZCB2ZXJzaW9uIGluIHRoZSBXZWIgRGVwbG95bWVudCBEZXNjcmlwdG9yLgotSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzExPUNhbiBub3QgZmluZCB0aGUgdGFnIGRpcmVjdG9yeSAiezB9IgotSlNQQWN0aW9uVmFsaWRhdG9yXzA9VGFnICh7MH0pIG11c3QgYmUgZW1wdHkKLUpTUEFjdGlvblZhbGlkYXRvcl8xPSJ7MH0iIGRvZXMgbm90IHN1cHBvcnQgcnVudGltZSBleHByZXNzaW9ucwotSlNQQmF0Y2hWYWxpZGF0b3JfMD1HYXRoZXJpbmcgZmlsZXMgaW4gezB9Ci1UYWdsaWJIZWxwZXJfMD1UaGUgVGFnRXh0cmFJbmZvIGNsYXNzIGZvciAiezB9IiAoezF9KSB3YXMgbm90IGZvdW5kIG9uIHRoZSBKYXZhIEJ1aWxkIFBhdGgKLVRhZ2xpYkhlbHBlcl8xPVRoZSBUYWdFeHRyYUluZm8gY2xhc3MgZm9yICJ7MH0iICh7MX0pIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQKLVRhZ2xpYkhlbHBlcl8yPUEgcHJvYmxlbSB3YXMgZW5jb3VudGVyZWQgdXNpbmcgVGFnRXh0cmFJbmZvIGNsYXNzIHsxfSBmb3IgJ3swfScgCi1UYWdsaWJIZWxwZXJfMz1UaGUgdGFnIGhhbmRsZXIgY2xhc3MgZm9yICJ7MH0iICh7MX0pIHdhcyBub3QgZm91bmQgb24gdGhlIEphdmEgQnVpbGQgUGF0aAotSlNQVHJhbnNsYXRvcl8wPUludmFsaWQgaWRlbnRpZmllcjogInswfSIKLUpTUFRyYW5zbGF0b3JfMT1VbmRlZmluZWQgdHlwZTogezB9Ci1KU1BUcmFuc2xhdG9yXzI9Q2FuIG5vdCBkZWNsYXJlIGJvdGggImNsYXNzIiBhbmQgImJlYW5OYW1lIiBhdHRyaWJ1dGVzCi1KU1BUcmFuc2xhdG9yXzM9VW5rbm93biB0eXBlIGZvciBpZGVudGlmaWVyICJ7MH0iCi1KU1BUcmFuc2xhdG9yXzQ9TWlzc2luZyBzdGFydCB0YWcgZm9yICJ7MH0iCi1KU1BUcmFuc2xhdG9yXzU9TWlzc2luZyBlbmQgdGFnIGZvciAiezB9IgotSlNQRUxUcmFuc2xhdG9yXzA9VGhlIGZ1bmN0aW9uIHswfSBpcyB1bmRlZmluZWQKLVRMRFZhbGlkYXRvcl9NaXNzaW5nVmFsaWRhdG9yPVRoZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIHN1YmNsYXNzICd7MH0nIHdhcyBub3QgZm91bmQgb24gdGhlIEphdmEgQnVpbGQgUGF0aAotVExEVmFsaWRhdG9yX01pc3NpbmdWYXJpYWJsZT1UaGUgdmFyaWFibGUgY2xhc3MgJ3swfScgd2FzIG5vdCBmb3VuZCBvbiB0aGUgSmF2YSBCdWlsZCBQYXRoCi1UTERWYWxpZGF0b3JfTWlzc2luZ0xpc3RlbmVyPVRoZSBsaXN0ZW5lciBjbGFzcyAnezB9JyB3YXMgbm90IGZvdW5kIG9uIHRoZSBKYXZhIEJ1aWxkIFBhdGgKLUluaXRpYWxpemluZz1Qcm9jZXNzaW5nIEpTUCBjaGFuZ2VzIHNpbmNlIGxhc3QgYWN0aXZhdGlvbgotUGVyc2lzdGluZ19KU1BfVHJhbnNsYXRpb25zPVBlcnNpc3RpbmcgSlNQIFRyYW5zbGF0aW9ucwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmQwMmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmIGRlc2lyZWQsCi0gKiB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcyBwbHVnaW4uIE90aGVyCi0gKiBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogQHBhcmFtIGxldmVsIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZSB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbiBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogQHBhcmFtIG1lc3NhZ2UgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeSBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aCAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudFdyYXBwZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnRXcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTcwN2I3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudFdyYXBwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIENNQ29udGVudFdyYXBwZXJJbXBsIGV4dGVuZHMgQ01Ob2RlV3JhcHBlckltcGwgaW1wbGVtZW50cyBDTUNvbnRlbnQgewotCi0JcHJpdmF0ZSBDTUNvbnRlbnQgZkNNQ29udGVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTUNvbnRlbnRXcmFwcGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIHByZWZpeCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50V3JhcHBlckltcGwoU3RyaW5nIHByZWZpeCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQgbm9kZSkgewotCQlzdXBlcihwcmVmaXgsIG5vZGUpOwotCQlmQ01Db250ZW50ID0gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNYXhPY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgLTEsIGl0J3MgVU5CT1VOREVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCXJldHVybiBmQ01Db250ZW50LmdldE1heE9jY3VyKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWluT2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIDAsIGl0J3MgT1BUSU9OQUwuCi0JICogSWYgMSwgaXQncyBSRVFVSVJFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlyZXR1cm4gZkNNQ29udGVudC5nZXRNaW5PY2N1cigpOwotCX0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0T3JpZ2luTm9kZSgpIHsKLQkJcmV0dXJuIGZDTUNvbnRlbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFdyYXBwZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50V3JhcHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMzMGY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50V3JhcHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci0KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50V3JhcHBlckltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50LCBDTU5vZGVXcmFwcGVyIHsKLQotCWNsYXNzIENNTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQotCQlwcm90ZWN0ZWQgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJSGFzaHRhYmxlIGdldEhhc2h0YWJsZSgpIHsKLQkJCXJldHVybiB0YWJsZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIHRhYmxlLnNpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gKENNTm9kZSkgdGFibGUuZ2V0KG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCQlpbnQgc2l6ZSA9IHRhYmxlLnNpemUoKTsKLQkJCWlmIChpbmRleCA8IHNpemUpIHsKLQkJCQlJdGVyYXRvciB2YWx1ZXMgPSBpdGVyYXRvcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGluZGV4OyBpKyspIHsKLQkJCQkJcmVzdWx0ID0gdmFsdWVzLm5leHQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKENNTm9kZSkgcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUsIENNTm9kZSBhTm9kZSkgewotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBhTm9kZSAhPSBudWxsKQotCQkJCXRhYmxlLnB1dChuYW1lLCBhTm9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ01OYW1lc3BhY2VJbXBsIGltcGxlbWVudHMgQ01OYW1lc3BhY2UgewotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuIENNRG9jdW1lbnRXcmFwcGVySW1wbC50aGlzLmdldFVSSSgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBDTU5vZGUuTkFNRV9TUEFDRTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQkJcmV0dXJuIENNRG9jdW1lbnRXcmFwcGVySW1wbC50aGlzLmdldFByZWZpeCgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCQlyZXR1cm4gQ01Eb2N1bWVudFdyYXBwZXJJbXBsLnRoaXMuZ2V0VVJJKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgZmVhdHVyZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIENNTmFtZWROb2RlTWFwIGZFbGVtZW50cyA9IG51bGw7Ci0JcHJpdmF0ZSBDTU5hbWVkTm9kZU1hcCBmRW50aXRpZXMgPSBudWxsOwotCXByaXZhdGUgQ01OYW1lc3BhY2UgZk5hbWVzcGFjZSA9IG5ldyBDTU5hbWVzcGFjZUltcGwoKTsKLQlwcml2YXRlIFN0cmluZyBmUHJlZml4OwotCXByaXZhdGUgU3RyaW5nIGZVUkk7Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudFdyYXBwZXJJbXBsKFN0cmluZyBuZXdVUkksIFN0cmluZyBuZXdQcmVmaXgsIENNRG9jdW1lbnQgdGxkKSB7Ci0JCWZVUkkgPSBuZXdVUkk7Ci0JCWZQcmVmaXggPSBuZXdQcmVmaXg7Ci0JCWZEb2N1bWVudCA9IHRsZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnRzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlpZiAoZkVsZW1lbnRzID09IG51bGwpIHsKLQkJCWludCBsZW5ndGggPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRzKCkuZ2V0TGVuZ3RoKCk7Ci0JCQlDTU5hbWVkTm9kZU1hcEltcGwgZWxlbWVudHMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbChmUHJlZml4LCAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGdldERvY3VtZW50KCkuZ2V0RWxlbWVudHMoKS5pdGVtKGkpKTsKLQkJCQllbGVtZW50cy5zZXROYW1lZEl0ZW0oZWQuZ2V0Tm9kZU5hbWUoKSwgZWQpOwotCQkJfQotCQkJZkVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCX0KLQkJcmV0dXJuIGZFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbnRpdGllcyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICoKLQkgKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEVudGl0eURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlpZiAoZkVudGl0aWVzID09IG51bGwpIHsKLQkJCWZFbnRpdGllcyA9IGdldERvY3VtZW50KCkuZ2V0RW50aXRpZXMoKTsKLQkJfQotCQlyZXR1cm4gZkVudGl0aWVzOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWVzcGFjZSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZXNwYWNlCi0JICovCi0JcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIGZOYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGdldERvY3VtZW50KCkuZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIGdldERvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlIGdldE9yaWdpbk5vZGUoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBmUHJlZml4OwotCX0KLQotCS8qKgotCSAqIGdldFByb3BlcnR5IG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqCi0JICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NpcGVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZ2V0RG9jdW1lbnQoKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQlyZXR1cm4gZlVSSTsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBnZXREb2N1bWVudCgpLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWVlY2EzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIENNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlckltcGwgZXh0ZW5kcyBDTU5vZGVXcmFwcGVySW1wbCBpbXBsZW1lbnRzIENNRWxlbWVudERlY2xhcmF0aW9uIHsKLQlwcml2YXRlIENNQ29udGVudCBmQ01Db250ZW50ID0gbnVsbDsKLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBmRWxlbWVudERlY2wgPSBudWxsOwotCi0JLyoqCi0JICogQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIHByZWZpeCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbChTdHJpbmcgcHJlZml4LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXN1cGVyKHByZWZpeCwgbm9kZSk7Ci0JCWZFbGVtZW50RGVjbCA9IG5vZGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlcyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICoKLQkgKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEF0dHJpYnV0ZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmRWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCX0KLQotCS8qKgotCSAqIGdldENNQ29udGVudCBtZXRob2QKLQkgKiBAcmV0dXJuIENNQ29udGVudAotCSAqCi0JICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoaXMgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwuCi0JICogVGhpcyBjYW4gYmUgYW4gQ01FbGVtZW50RGVjbGFyYXRpb24gb3IgYSBDTUdyb3VwCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlpZiAoZkNNQ29udGVudCA9PSBudWxsKSB7Ci0JCQlDTUNvbnRlbnQgY29udGVudCA9IGZFbGVtZW50RGVjbC5nZXRDb250ZW50KCk7Ci0JCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBDTUdyb3VwKQotCQkJCWZDTUNvbnRlbnQgPSBuZXcgQ01Hcm91cFdyYXBwZXJJbXBsKGZQcmVmaXgsIChDTUdyb3VwKSBjb250ZW50KTsKLQkJCWVsc2UKLQkJCQlmQ01Db250ZW50ID0gbmV3IENNQ29udGVudFdyYXBwZXJJbXBsKGZQcmVmaXgsIGNvbnRlbnQpOwotCQl9Ci0JCXJldHVybiBmQ01Db250ZW50OwotCX0KLQotCS8qKgotCSAqIGdldENvbnRlbnRUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEuCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIGZFbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpOwotCX0KLQotCS8qKgotCSAqIGdldERhdGFUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gZkVsZW1lbnREZWNsLmdldERhdGFUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RWxlbWVudE5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TG9jYWxFbGVtZW50cyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICoKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBsb2NhbGx5IGRlZmluZWQgZWxlbWVudHMuCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBmRWxlbWVudERlY2wuZ2V0TG9jYWxFbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIGdldE1heE9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJcmV0dXJuIGZFbGVtZW50RGVjbC5nZXRNYXhPY2N1cigpOwotCX0KLQotCS8qKgotCSAqIGdldE1pbk9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAwLCBpdCdzIE9QVElPTkFMLgotCSAqIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0JICovCi0JcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJcmV0dXJuIGZFbGVtZW50RGVjbC5nZXRNaW5PY2N1cigpOwotCX0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0T3JpZ2luTm9kZSgpIHsKLQkJcmV0dXJuIGZFbGVtZW50RGVjbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwV3JhcHBlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBXcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTg2MTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBXcmFwcGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIENNR3JvdXBXcmFwcGVySW1wbCBleHRlbmRzIENNQ29udGVudFdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Hcm91cCB7Ci0JY2xhc3MgQ01Ob2RlTGlzdEltcGwgaW1wbGVtZW50cyBDTU5vZGVMaXN0IHsKLQkJcHJpdmF0ZSBMaXN0IG5vZGVzID0gbnVsbDsKLQotCQkvKioKLQkJICogQ01Ob2RlTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkJICovCi0JCXB1YmxpYyBDTU5vZGVMaXN0SW1wbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCQlub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JCSAqIEBwYXJhbSBub2RlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhcHBlbmRJdGVtKENNTm9kZSBub2RlKSB7Ci0JCQlub2Rlcy5hZGQobm9kZSk7Ci0JCX0KLQotCQkvKioKLQkJICogZ2V0TGVuZ3RoIG1ldGhvZAotCQkgKiBAcmV0dXJuIGludAotCQkgKi8KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gbm9kZXMuc2l6ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGl0ZW0gbWV0aG9kCi0JCSAqIEByZXR1cm4gQ01Ob2RlCi0JCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkJICovCi0JCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbm9kZXMuc2l6ZSgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChDTU5vZGUpIG5vZGVzLmdldChpbmRleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENNTm9kZUxpc3QgZkNoaWxkTm9kZXMgPSBudWxsOwotCXByaXZhdGUgQ01Hcm91cCBmR3JvdXAgPSBudWxsOwotCi0JLyoqCi0JICogQ01Hcm91cFdyYXBwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gcHJlZml4IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbm9kZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUdyb3VwV3JhcHBlckltcGwoU3RyaW5nIHByZWZpeCwgQ01Hcm91cCBub2RlKSB7Ci0JCXN1cGVyKHByZWZpeCwgbm9kZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2hpbGROb2RlcyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZUxpc3QKLQkgKgotCSAqIFJldHVybnMgY2hpbGQgQ01Ob2RlTGlzdCwgd2hpY2ggaW5jbHVkZXMgRWxlbWVudERlZmluaXRpb24gb3IgQ01FbGVtZW50LgotCSAqLwotCXB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCWlmIChmQ2hpbGROb2RlcyA9PSBudWxsKSB7Ci0JCQlDTU5vZGVMaXN0SW1wbCBjaGlsZE5vZGVzID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0JCQlDTU5vZGVMaXN0IGNoaWxkcmVuID0gZkdyb3VwLmdldENoaWxkTm9kZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUNNTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ01Hcm91cCkKLQkJCQkJY2hpbGROb2Rlcy5hcHBlbmRJdGVtKG5ldyBDTUdyb3VwV3JhcHBlckltcGwoZlByZWZpeCwgKENNR3JvdXApIGNoaWxkKSk7Ci0JCQkJZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikKLQkJCQkJY2hpbGROb2Rlcy5hcHBlbmRJdGVtKG5ldyBDTUVsZW1lbnREZWNsYXJhdGlvbldyYXBwZXJJbXBsKGZQcmVmaXgsIChDTUVsZW1lbnREZWNsYXJhdGlvbikgY2hpbGQpKTsKLQkJCQllbHNlCi0JCQkJCS8vIGVycm9yPwotCQkJCQljaGlsZE5vZGVzLmFwcGVuZEl0ZW0obmV3IENNTm9kZVdyYXBwZXJJbXBsKGZQcmVmaXgsIGNoaWxkKSk7Ci0JCQl9Ci0JCQlmQ2hpbGROb2RlcyA9IGNoaWxkTm9kZXM7Ci0JCX0KLQkJcmV0dXJuIGZDaGlsZE5vZGVzOwotCX0KLQotCS8qKgotCSAqIGdldE9wZXJhdGlvbiBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEFMT05FIChhKSwgU0VRVUVOQ0UgKGEsYiksIENIT0lDRSAoYXxiKSwgQUxMIChhJmIpLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBmR3JvdXAuZ2V0T3BlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlIGdldE9yaWdpbk5vZGUoKSB7Ci0JCXJldHVybiBmR3JvdXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlV3JhcHBlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZVdyYXBwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YjdkMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlV3JhcHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Ob2RlV3JhcHBlcjsKLQotcHVibGljIGNsYXNzIENNTm9kZVdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Ob2RlLCBDTU5vZGVXcmFwcGVyIHsKLQlwcml2YXRlIENNTm9kZSBmTm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZk5vZGVOYW1lID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZlByZWZpeCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTU5vZGVXcmFwcGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTm9kZVdyYXBwZXJJbXBsKFN0cmluZyBwcmVmaXgsIENNTm9kZSBub2RlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcmVmaXggPSBwcmVmaXg7Ci0JCWZOb2RlID0gbm9kZTsKLQotCQlmTm9kZU5hbWUgPSBmUHJlZml4ICsgIjoiICsgZk5vZGUuZ2V0Tm9kZU5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBmTm9kZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBmTm9kZS5nZXROb2RlVHlwZSgpOwotCX0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0T3JpZ2luTm9kZSgpIHsKLQkJcmV0dXJuIGZOb2RlOwotCX0KLQotCS8qKgotCSAqIGdldFByb3BlcnR5IG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqCi0JICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NpcGVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZk5vZGUuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBmTm9kZS5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BDTURvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWUxZDJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBmYWN0b3J5IGZvciBKU1AgZG9jdW1lbnRzICh3aGljaCBmb3Igbm93IGxpdmUgaW4gdGhlIEhUTUwgQ29yZQotICogcGx1Z2luKS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpTUENNRG9jdW1lbnRGYWN0b3J5IHsKLQotCXByaXZhdGUgSlNQQ01Eb2N1bWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBnZXRDTURvY3VtZW50KENNRG9jVHlwZS5KU1AyMV9ET0NfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKiBAcGFyYW0gY210eXBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIGNtdHlwZSkgewotCQlpZiAoY210eXBlID09IG51bGwpCi0JCQlyZXR1cm4gZ2V0Q01Eb2N1bWVudCgpOwotCQlyZXR1cm4gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoY210eXBlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChmbG9hdCBqc3BWZXJzaW9uKSB7Ci0JCWlmIChqc3BWZXJzaW9uID49IDIuMWYpCi0JCQlyZXR1cm4gZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSlNQMjFfRE9DX1RZUEUpOwotCQllbHNlIGlmIChqc3BWZXJzaW9uID49IDIpCi0JCQlyZXR1cm4gZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSlNQMjBfRE9DX1RZUEUpOwotCQllbHNlIGlmIChqc3BWZXJzaW9uID49IDEuMmYpCi0JCQlyZXR1cm4gZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSlNQMTJfRE9DX1RZUEUpOwotCQllbHNlIGlmIChqc3BWZXJzaW9uID49IDEpCi0JCQlyZXR1cm4gZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSlNQMTFfRE9DX1RZUEUpOwotCQlyZXR1cm4gZ2V0Q01Eb2N1bWVudCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RhZ2xpYkNvbnRyb2xsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RhZ2xpYkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhNjBhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UYWdsaWJDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkxvY2F0aW9uS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYkluZGV4RGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliSW5kZXhMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLlRhZ2xpYkluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotCi0vKioKLSAqIFByb3ZpZGVzIGEgZGlyZWN0IG1hcHBpbmcgZnJvbSBJU3RydWN0dXJlZERvY3VtZW50IHRvIHN1cHBvcnRpbmcKLSAqIFRMRENNRG9jdW1lbnRNYW5hZ2VyLgotICogCi0gKiBMaXN0ZW5zIHRvIHRoZSBjcmVhdGlvbiBvZiBKU1AgdHlwZSBUZXh0RmlsZUJ1ZmZlcnMgYW5kIGZvcmNlcyBhIHRleHQtbGVzcwotICogcmVwYXJzZSBhZnRlciBjb25uZWN0aW5nIHRhZ2xpYi1zdXBwb3J0aW5nIGxpc3RlbmVycy4gQ29ubmVjdGluZyB0aGUKLSAqIGxpc3RlbmVycyBiZWZvcmUgdGhlIHRleHQgaXMgc2V0IHdvdWxkIGJlIGlkZWFsLCBidXQgdGhlcmUgaXMgbm8gd2F5IHRvCi0gKiBsb29rIHVwIHRhZ2xpYiByZWZlcmVuY2VzIHNpbmNlIHRoZSBsb2NhdGlvbiBpcyBub3QgeWV0IGtub3dhYmxlLiBTaW5jZQotICogdGFnbGlicyBjYW4gYWZmZWN0IHRoZSBwYXJzaW5nIG9mIHRoZSBkb2N1bWVudCwgYSByZXBhcnNlIGlzIGN1cnJlbnRseQotICogcmVxdWlyZWQgdG8gcmVhY3QgdG8gY3VzdG9tIHRhZ3Mgd2l0aCB0YWdkZXBlbmRlbnQgY29udGVudC4KLSAqIAotICogVE9ETzogUmVtb3ZlIHRoZSByZXBhcnNlIHBlbmFsdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJDb250cm9sbGVyIGltcGxlbWVudHMgSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudCwgSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudEV4dGVuc2lvbiB7Ci0KLQljbGFzcyBEb2N1bWVudEluZm8gaW1wbGVtZW50cyBJVGFnbGliSW5kZXhMaXN0ZW5lciB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JCUlUZXh0RmlsZUJ1ZmZlciB0ZXh0RmlsZUJ1ZmZlcjsKLQkJSVBhdGggbG9jYXRpb247Ci0JCUxvY2F0aW9uS2luZCBsb2NhdGlvbktpbmQ7Ci0JCVRMRENNRG9jdW1lbnRNYW5hZ2VyIHRsZERvY3VtZW50TWFuYWdlcjsKLQotCQlwdWJsaWMgdm9pZCBpbmRleENoYW5nZWQoSVRhZ2xpYkluZGV4RGVsdGEgZGVsdGEpIHsKLQkJCWludCB0eXBlID0gZGVsdGEuZ2V0S2luZCgpOwotCQkJaWYgKHR5cGUgPT0gSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRCB8fCB0eXBlID09IElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQpIHsKLQkJCQlJVGFnbGliSW5kZXhEZWx0YVtdIGRlbHRhcyA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQlib29sZWFuIGFmZmVjdGVkID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IGtleSA9IFRMRENNRG9jdW1lbnRNYW5hZ2VyLmdldFVuaXF1ZUlkZW50aWZpZXIoZGVsdGFzW2ldLmdldFRhZ2xpYlJlY29yZCgpKTsKLQkJCQkJaWYgKHRsZERvY3VtZW50TWFuYWdlci5nZXREb2N1bWVudHMoKS5jb250YWluc0tleShrZXkpKSB7Ci0JCQkJCQlhZmZlY3RlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGFmZmVjdGVkKSB7Ci0JCQkJCWlmIChfZGVidWdDYWNoZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50TWFuYWdlciBjbGVhcmVkIGl0cyBwcml2YXRlIENNRG9jdW1lbnQgY2FjaGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXRsZERvY3VtZW50TWFuYWdlci5nZXREb2N1bWVudHMoKS5jbGVhcigpOwotCQkJCQl0bGREb2N1bWVudE1hbmFnZXIuZ2V0U291cmNlUGFyc2VyKCkucmVzZXRIYW5kbGVycygpOwotCi0JCQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkucmVwYXJzZSh0aGlzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXRsZERvY3VtZW50TWFuYWdlci5pbmRleENoYW5nZWQoZGVsdGEpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnQ2FjaGUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RsZGNtZG9jdW1lbnQvY2FjaGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JY2xhc3MgRmlsZUJ1ZmZlckxpc3RlbmVyIGltcGxlbWVudHMgSUZpbGVCdWZmZXJMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjYnVmZmVyQ29udGVudEFib3V0VG9CZVJlcGxhY2VkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBidWZmZXJDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNidWZmZXJDb250ZW50UmVwbGFjZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGJ1ZmZlckNvbnRlbnRSZXBsYWNlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI2J1ZmZlckNyZWF0ZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGJ1ZmZlckNyZWF0ZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCQlpZiAoYnVmZmVyIGluc3RhbmNlb2YgSVRleHRGaWxlQnVmZmVyKSB7Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gKChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcikuZ2V0RG9jdW1lbnQoKTsKLQkJCQkvLyBpZ25vcmUgbm9uLUpTUCBkb2N1bWVudHMKLQkJCQlzeW5jaHJvbml6ZWQgKF9pbnN0YW5jZS5mSlNQZG9jdW1lbnRzKSB7Ci0JCQkJCWlmICghX2luc3RhbmNlLmZKU1Bkb2N1bWVudHMuY29udGFpbnMoZG9jdW1lbnQpKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlBc3NlcnQuaXNUcnVlKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCwgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIFNldHVwUGFydGljaXBhbnQgd2FzIGNhbGxlZCBmb3Igbm9uLUlTdHJ1Y3R1cmVkRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSBudWxsOwotCQkJCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZEb2N1bWVudE1hcCkgewotCQkJCQlpbmZvID0gKERvY3VtZW50SW5mbykgX2luc3RhbmNlLmZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQkJCX0KLQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCS8vIHJlbWVtYmVyIHRoZSBidWZmZXIgbm93Ci0JCQkJCWluZm8udGV4dEZpbGVCdWZmZXIgPSAoSVRleHRGaWxlQnVmZmVyKSBidWZmZXI7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbmZvID0gbmV3IERvY3VtZW50SW5mbygpOwotCQkJCQlpbmZvLmRvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50OwotCQkJCQlpbmZvLnRleHRGaWxlQnVmZmVyID0gKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyOwotCQkJCQlpbmZvLmxvY2F0aW9uID0gYnVmZmVyLmdldExvY2F0aW9uKCk7Ci0JCQkJCWluZm8ubG9jYXRpb25LaW5kID0gTG9jYXRpb25LaW5kLk5PUk1BTElaRTsKLQkJCQkJaW5mby50bGREb2N1bWVudE1hbmFnZXIgPSBuZXcgVExEQ01Eb2N1bWVudE1hbmFnZXIoKTsKLQkJCQkJaW5mby50bGREb2N1bWVudE1hbmFnZXIuc2V0U291cmNlUGFyc2VyKChYTUxTb3VyY2VQYXJzZXIpIGluZm8uZG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQkJCQlzeW5jaHJvbml6ZWQgKF9pbnN0YW5jZS5mRG9jdW1lbnRNYXApIHsKLQkJCQkJCV9pbnN0YW5jZS5mRG9jdW1lbnRNYXAucHV0KGRvY3VtZW50LCBpbmZvKTsKLQkJCQkJfQotCQkJCQlUYWdsaWJJbmRleC5hZGRUYWdsaWJJbmRleExpc3RlbmVyKGluZm8pOwotCQkJCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCAmJiBkb2N1bWVudC5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5yZXBhcnNlKHRoaXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjYnVmZmVyRGlzcG9zZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGJ1ZmZlckRpc3Bvc2VkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQkJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElUZXh0RmlsZUJ1ZmZlcikgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9ICgoSVRleHRGaWxlQnVmZmVyKSBidWZmZXIpLmdldERvY3VtZW50KCk7Ci0JCQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkpTUGRvY3VtZW50cykgewotCQkJCQlpZiAoIV9pbnN0YW5jZS5mSlNQZG9jdW1lbnRzLnJlbW92ZShkb2N1bWVudCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJRG9jdW1lbnRJbmZvIGluZm8gPSBudWxsOwotCQkJc3luY2hyb25pemVkIChmRG9jdW1lbnRNYXApIHsKLQkJCQlNYXAuRW50cnlbXSBlbnRyaWVzID0gKE1hcC5FbnRyeVtdKSBmRG9jdW1lbnRNYXAuZW50cnlTZXQoKS50b0FycmF5KG5ldyBNYXAuRW50cnlbZkRvY3VtZW50TWFwLnNpemUoKV0pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlpbmZvID0gKERvY3VtZW50SW5mbykgZW50cmllc1tpXS5nZXRWYWx1ZSgpOwotCQkJCQkvKioKLQkJCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMjEzNwotCQkJCQkgKiAKLQkJCQkJICogTWlnaHQgYmUgbnVsbCBpZiBzZXR1cCgpIGhhcyBiZWVuIGNhbGxlZCBidXQKLQkJCQkJICogYnVmZmVyQ3JlYXRlZCgpIGhhcyBub3QsIHlldC4KLQkJCQkJICovCi0JCQkJCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby50ZXh0RmlsZUJ1ZmZlciAhPSBudWxsICYmIGluZm8udGV4dEZpbGVCdWZmZXIuZXF1YWxzKGJ1ZmZlcikpIHsKLQkJCQkJCWZEb2N1bWVudE1hcC5yZW1vdmUoZW50cmllc1tpXS5nZXRLZXkoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQlpbmZvLnRsZERvY3VtZW50TWFuYWdlci5jbGVhckNhY2hlKCk7Ci0JCQkJVGFnbGliSW5kZXgucmVtb3ZlVGFnbGliSW5kZXhMaXN0ZW5lcihpbmZvKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI2RpcnR5U3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIsCi0JCSAqICAgICAgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpcnR5U3RhdGVDaGFuZ2VkKElGaWxlQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBpc0RpcnR5KSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNzdGF0ZUNoYW5nZUZhaWxlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VGYWlsZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNzdGF0ZUNoYW5naW5nKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5naW5nKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjc3RhdGVWYWxpZGF0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGF0ZVZhbGlkYXRpb25DaGFuZ2VkKElGaWxlQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBpc1N0YXRlVmFsaWRhdGVkKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciN1bmRlcmx5aW5nRmlsZURlbGV0ZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVuZGVybHlpbmdGaWxlRGVsZXRlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI3VuZGVybHlpbmdGaWxlTW92ZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlciwKLQkJICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1bmRlcmx5aW5nRmlsZU1vdmVkKElGaWxlQnVmZmVyIGJ1ZmZlciwgSVBhdGggcGF0aCkgewotCQl9Ci0KLQotCX0KLQotCXN0YXRpYyBUYWdsaWJDb250cm9sbGVyIF9pbnN0YW5jZSA9IG51bGw7Ci0Jc3RhdGljIHByaXZhdGUgYm9vbGVhbiBmSXNTaHV0ZG93biA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRMb2NhdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkRvY3VtZW50TWFwKSB7Ci0JCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIF9pbnN0YW5jZS5mRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJCWlmIChpbmZvICE9IG51bGwpCi0JCQkJcmV0dXJuIGluZm8ubG9jYXRpb247Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtYW5hZ2VyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0TG9jYXRpb24oVExEQ01Eb2N1bWVudE1hbmFnZXIgbWFuYWdlcikgewotCQkvLyBpZiBfaW5zdGFuY2UgaXMgbnVsbCwgd2UgYXJlIGFscmVhZHkgc2h1dHRpbmcgZG9udwotCQlpZiAoX2luc3RhbmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUGF0aCBsb2NhdGlvbiA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZEb2N1bWVudE1hcCkgewotCQkJSXRlcmF0b3IgZG9jSW5mb3MgPSBfaW5zdGFuY2UuZkRvY3VtZW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZG9jSW5mb3MuaGFzTmV4dCgpICYmIGxvY2F0aW9uID09IG51bGwpIHsKLQkJCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGRvY0luZm9zLm5leHQoKTsKLQkJCQlpZiAoaW5mby50bGREb2N1bWVudE1hbmFnZXIuZXF1YWxzKG1hbmFnZXIpKQotCQkJCQlsb2NhdGlvbiA9IGluZm8ubG9jYXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVExEQ01Eb2N1bWVudE1hbmFnZXIgZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIGlmIF9pbnN0YW5jZSBpcyBudWxsLCB3ZSBhcmUgYWxyZWFkeSBzaHV0dGluZyBkb3duCi0JCWlmIChfaW5zdGFuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlzeW5jaHJvbml6ZWQgKF9pbnN0YW5jZS5mRG9jdW1lbnRNYXApIHsKLQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgX2luc3RhbmNlLmZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkKLQkJCQlyZXR1cm4gaW5mby50bGREb2N1bWVudE1hbmFnZXI7Ci0JCQlyZXR1cm4gbnVsbDsKLQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNTaHV0ZG93bigpIHsKLQkJcmV0dXJuIGZJc1NodXRkb3duOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNodXRkb3duKGJvb2xlYW4gaXNTaHV0ZG93bikgewotCQlmSXNTaHV0ZG93biA9IGlzU2h1dGRvd247Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJc2V0U2h1dGRvd24odHJ1ZSk7Ci0JCUZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLnJlbW92ZUZpbGVCdWZmZXJMaXN0ZW5lcihfaW5zdGFuY2UuZkJ1ZmZlckxpc3RlbmVyKTsKLQkJX2luc3RhbmNlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCWlmIChfaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJX2luc3RhbmNlID0gbmV3IFRhZ2xpYkNvbnRyb2xsZXIoKTsKLQkJCUZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLmFkZEZpbGVCdWZmZXJMaXN0ZW5lcihfaW5zdGFuY2UuZkJ1ZmZlckxpc3RlbmVyKTsKLQkJfQotCQlzZXRTaHV0ZG93bihmYWxzZSk7Ci0JfQotCi0JSUZpbGVCdWZmZXJMaXN0ZW5lciBmQnVmZmVyTGlzdGVuZXI7Ci0KLQlNYXAgZkRvY3VtZW50TWFwOwotCi0JTGlzdCBmSlNQZG9jdW1lbnRzOwotCi0JLyoKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIG9ubHkgdG8gYmUgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIEZpbGVCdWZmZXIKLQkgKiBmcmFtZXdvcmsKLQkgKi8KLQlwdWJsaWMgVGFnbGliQ29udHJvbGxlcigpIHsKLQkJc3VwZXIoKTsKLQkJZkJ1ZmZlckxpc3RlbmVyID0gbmV3IEZpbGVCdWZmZXJMaXN0ZW5lcigpOwotCQlmSlNQZG9jdW1lbnRzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJZkRvY3VtZW50TWFwID0gbmV3IEhhc2hNYXAoMSk7Ci0JfQotCi0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgdG8gYmUgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIEZpbGVCdWZmZXIgZnJhbWV3b3JrCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50I3NldHVwKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldHVwKElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBpZiB3ZSd2ZSBhbHJlYWR5IHNodXRkb3duLCBqdXN0IGlnbm9yZQotCQlpZiAoaXNTaHV0ZG93bigpKQotCQkJcmV0dXJuOwotCQkvLyByZWZlcmVuY2UgdGhlIHNoYXJlZCBpbnN0YW5jZSdzIGRvY3VtZW50cyBkaXJlY3RseQotCQlzeW5jaHJvbml6ZWQgKF9pbnN0YW5jZS5mSlNQZG9jdW1lbnRzKSB7Ci0JCQlfaW5zdGFuY2UuZkpTUGRvY3VtZW50cy5hZGQoZG9jdW1lbnQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudFNldHVwUGFydGljaXBhbnRFeHRlbnNpb24jc2V0dXAob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkxvY2F0aW9uS2luZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXR1cChJRG9jdW1lbnQgZG9jdW1lbnQsIElQYXRoIGxvY2F0aW9uLCBMb2NhdGlvbktpbmQgbG9jYXRpb25LaW5kKSB7Ci0JCS8vIGlmIHdlJ3ZlIGFscmVhZHkgc2h1dGRvd24sIGp1c3QgaWdub3JlCi0JCWlmIChpc1NodXRkb3duKCkpCi0JCQlyZXR1cm47Ci0JCS8vIHJlZmVyZW5jZSB0aGUgc2hhcmVkIGluc3RhbmNlJ3MgZG9jdW1lbnRzIGRpcmVjdGx5Ci0JCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZKU1Bkb2N1bWVudHMpIHsKLQkJCV9pbnN0YW5jZS5mSlNQZG9jdW1lbnRzLmFkZChkb2N1bWVudCk7Ci0JCX0KLQotCQlEb2N1bWVudEluZm8gaW5mbyA9IG5ldyBEb2N1bWVudEluZm8oKTsKLQkJaW5mby5kb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudDsKLQkJaW5mby50ZXh0RmlsZUJ1ZmZlciA9IG51bGw7IC8vIHdpbGwgYmUgc3VwcGxpZWQgbGF0ZXIKLQkJaW5mby5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCQlpbmZvLmxvY2F0aW9uS2luZCA9IGxvY2F0aW9uS2luZDsKLQkJaW5mby50bGREb2N1bWVudE1hbmFnZXIgPSBuZXcgVExEQ01Eb2N1bWVudE1hbmFnZXIoKTsKLQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkRvY3VtZW50TWFwKSB7Ci0JCQlfaW5zdGFuY2UuZkRvY3VtZW50TWFwLnB1dChkb2N1bWVudCwgaW5mbyk7Ci0JCX0KLQkJaW5mby50bGREb2N1bWVudE1hbmFnZXIuc2V0U291cmNlUGFyc2VyKChYTUxTb3VyY2VQYXJzZXIpIGluZm8uZG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCAmJiBkb2N1bWVudC5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5yZXBhcnNlKHRoaXMpOwotCQl9Ci0JCVRhZ2xpYkluZGV4LmFkZFRhZ2xpYkluZGV4TGlzdGVuZXIoaW5mbyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmZGZkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTEREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsIGltcGxlbWVudHMgVExEQXR0cmlidXRlRGVjbGFyYXRpb24gewotCi0JLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MDU1NgotCXByaXZhdGUgc3RhdGljIGZpbmFsIENNRGF0YVR5cGUgYXR0clR5cGUgPSBuZXcgQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uOwotCi0JLy8KLQlwcml2YXRlIGJvb2xlYW4gZklzRnJhZ21lbnQgPSBmYWxzZTsKLQotCXByaXZhdGUgQ01Eb2N1bWVudCBmT3duZXJEb2N1bWVudDsKLQkvLyBvcHRpb25hbCBpZAotCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKLQotCS8vIHJlcXVpcmVkIG5hbWUKLQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQkvLyBvcHRpb25hbCAicmVxdWlyZWQiIGVsZW1lbnQgcHJlc2VudCwgZGVmYXVsdHMgdG8gbm90IHByZXNlbnQKLQlwcml2YXRlIGJvb2xlYW4gcmVxdWlyZWQgPSBmYWxzZTsKLQotCS8vIG9wdGlvbmFsIHJ1bi10aW1lIChzY3JpcGxldCBkZXJpdmVkKSB2YWx1ZSBvZiBhdHRyaWJ1dGVzLCBkZWZhdWx0cyB0bwotCS8vIG5vbmUvZmFsc2UKLQlwcml2YXRlIFN0cmluZyBydGV4cHJ2YWx1ZSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKENNRG9jdW1lbnQgb3duZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk93bmVyRG9jdW1lbnQgPSBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIENNRGF0YVR5cGUKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpIHsKLQkJcmV0dXJuIGF0dHJUeXBlOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIAotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLlRMREF0dHJpYnV0ZURlY2xhcmF0aW9uI2dldE93bmVyRG9jdW1lbnQoKQotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmT3duZXJEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKiAKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY3JpYmVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKiAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZSAhPSBudWxsICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikpIHsKLQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOyAvLyByZXR1cm4gYXR0cmlidXRlIGRlc2NyaXB0aW9uCi0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhUTEREb2N1bWVudC5DTV9LSU5EKSkgewotCQkJcmV0dXJuIFRMRERvY3VtZW50LkpTUF9UTEQ7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKSkgewotCQkJcmV0dXJuIGdldE93bmVyRG9jdW1lbnQoKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJ0ZXhwcnZhbHVlKCkgewotCQlyZXR1cm4gcnRleHBydmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRVc2FnZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBPUFRJT05BTHxSRVFVSVJFRAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VXNhZ2UoKSB7Ci0JCXJldHVybiByZXF1aXJlZCA/IFJFUVVJUkVEIDogT1BUSU9OQUw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpc0ZyYWdtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRnJhZ21lbnQoKSB7Ci0JCXJldHVybiBmSXNGcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgewotCQlyZXR1cm4gcmVxdWlyZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBUaGUgZGVzY3JpcHRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlmRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNGcmFnbWVudAotCSAqICAgICAgICAgICAgVGhlIGlzRnJhZ21lbnQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZyYWdtZW50KGJvb2xlYW4gaXNGcmFnbWVudCkgewotCQlmSXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0lkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCWlkID0gbmV3SWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZU5hbWUoU3RyaW5nIHN0cmluZykgewotCQluYW1lID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdSZXF1aXJlZAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gbmV3UmVxdWlyZWQpIHsKLQkJcmVxdWlyZWQgPSBuZXdSZXF1aXJlZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3UmVxdWlyZWQKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZFN0cmluZyhTdHJpbmcgbmV3UmVxdWlyZWQpIHsKLQkJaWYgKG5ld1JlcXVpcmVkICE9IG51bGwpIHsKLQkJCWlmIChuZXdSZXF1aXJlZC5lcXVhbHNJZ25vcmVDYXNlKEpTUDEyVExETmFtZXMuVFJVRSkgfHwgbmV3UmVxdWlyZWQuZXF1YWxzSWdub3JlQ2FzZShKU1AxMlRMRE5hbWVzLllFUykpCi0JCQkJc2V0UmVxdWlyZWQodHJ1ZSk7Ci0JCQllbHNlIGlmIChuZXdSZXF1aXJlZC5lcXVhbHNJZ25vcmVDYXNlKEpTUDEyVExETmFtZXMuRkFMU0UpIHx8IG5ld1JlcXVpcmVkLmVxdWFsc0lnbm9yZUNhc2UoSlNQMTJUTEROYW1lcy5OTykpCi0JCQkJc2V0UmVxdWlyZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1J0ZXhwcnZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnRleHBydmFsdWUoU3RyaW5nIG5ld1J0ZXhwcnZhbHVlKSB7Ci0JCXJ0ZXhwcnZhbHVlID0gbmV3UnRleHBydmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIAotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gcHJvcGVydHlOYW1lID09IG51bGwgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFRMRERvY3VtZW50LkNNX0tJTkQpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCAiICsgc3VwZXIudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBuYW1lOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0Tm9kZU5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCS8vIEJvb2xlYW4udG9TdHJpbmcoYm9vbGVhbikgaXMgaW50cm9kdWNlZCBpbiAxLjQKLQkJLy8gYnVmZmVyLmFwcGVuZCgiXG5cdCByZXF1aXJlZDoiICsKLQkJLy8gU3RyaW5nVXRpbHMuZXNjYXBlKEJvb2xlYW4udG9TdHJpbmcoaXNSZXF1aXJlZCgpKSkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IHJlcXVpcmVkOiIgKyBTdHJpbmdVdGlscy50b1N0cmluZyhpc1JlcXVpcmVkKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHJ0ZXhwcjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFJ0ZXhwcnZhbHVlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZ2V0SWQoKSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBpZDoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldElkKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRGF0YVR5cGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01EYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzMjVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01EYXRhVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQ01EYXRhVHlwZUltcGwgaW1wbGVtZW50cyBDTURhdGFUeXBlIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgZGF0YVR5cGVOYW1lOwotCi0JcHVibGljIENNRGF0YVR5cGVJbXBsKFN0cmluZyBkYXRhVHlwZU5hbWUpIHsKLQkJdGhpcy5kYXRhVHlwZU5hbWUgPSBkYXRhVHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICoKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGRhdGEgdHlwZSBpcyBjcmVhdGVkLgotCSAqIFRoaXMgcmV0dXJucyBudWxsIG9mIGEgc3VpdGFibGUgZGVmYXVsdCBpcyBub3QgYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGRhdGFUeXBlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotCSAqCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZyAgCi0JICoKLQkgKiBSZXR1cm5zIHRoZSBpbXBsaWVkIHZhbHVlIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEltcGxpZWRWYWx1ZUtpbmQgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBJTVBMSUVEX1ZBTFVFX05PTkUsIElNUExJRURfVkFMVUVfRklYRUQsIElNUExJRURfVkFMVUVfREVGQVVMVC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKSB7Ci0JCXJldHVybiBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGRhdGFUeXBlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjcmliZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURvY3VtZW50RmFjdG9yeVRMRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRG9jdW1lbnRGYWN0b3J5VExELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxM2EwZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRG9jdW1lbnRGYWN0b3J5VExELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTFUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDIwVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExEVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AyME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkZhY2V0TW9kdWxlQ29yZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JSmFyUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRMRFJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdEaXJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVVSTFJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuSmFyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIENNRG9jdW1lbnRCdWlsZGVyIGZvciBUYWcgTGlicmFyeSBEZXNjcmlwdG9ycyBhbmQgdGFnIGZpbGVzCi0gKiAKLSAqIFJldHVybnMgbmFtZXNwYWNlLWxlc3MgQ01Eb2N1bWVudHMgZm9yIGEgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciwgbG9hZGluZyBpdAotICogZGlyZWN0bHkgZnJvbSBhIGZpbGUgb3IgZXh0cmFjdGVkIGZyb20gYSBKQVIgYXJjaGl2ZS4gQ29udGVudCBNb2RlbCBvYmplY3RzCi0gKiB3aWxsIGltcGxlbWVudCB0aGUgVExEQ01Eb2N1bWVudCwgVExERWxlbWVudERlY2xhcmF0aW9uLCBhbmQKLSAqIFRMREF0dHJpYnV0ZURlY2xhcmF0aW9uIGludGVyZmFjZXMgZm9yIGV4dGVuZGVkIHByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeVRMRCBpbXBsZW1lbnRzIENNRG9jdW1lbnRGYWN0b3J5IHsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RsZGNtZG9jdW1lbnQvZmFjdG9yeSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBDTURvY3VtZW50RmFjdG9yeVRMRCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50RmFjdG9yeVRMRCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgQVBJCi0JICogCi0JICogQHBhcmFtIGJhc2Vsb2NhdGlvbgotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIGJhc2Vsb2NhdGlvbiwgSW5wdXRTdHJlYW0gaW5wdXQpIHsKLQkJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQlwcm92aWRlci5zZXRSb290RWxlbWVudE5hbWUoSlNQMTFUTEROYW1lcy5UQUdMSUIpOwotCQlwcm92aWRlci5zZXRJbnB1dFN0cmVhbShpbnB1dCk7Ci0JCWlmIChiYXNlbG9jYXRpb24gIT0gbnVsbCkKLQkJCXByb3ZpZGVyLnNldEJhc2VSZWZlcmVuY2UoYmFzZWxvY2F0aW9uKTsKLQkJcmV0dXJuIGxvYWREb2N1bWVudChiYXNlbG9jYXRpb24sIHByb3ZpZGVyLmdldFJvb3RFbGVtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENNRG9jdW1lbnRJbXBsIGJ1aWxkQ01Eb2N1bWVudEZyb21Gb2xkZXIoSVBhdGggcGF0aCkgewotCQlpZiAoX2RlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInRhZ2RpciBsb2FkaW5nIGZvciAiICsgcGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBFQk5GIGlzIGxpc3RlZCBhdCAxLjMuMTAKLQkJQ01Eb2N1bWVudEltcGwgZG9jdW1lbnQgPSBuZXcgQ01Eb2N1bWVudEltcGwoKTsKLQkJZG9jdW1lbnQuc2V0QmFzZUxvY2F0aW9uKHBhdGgudG9TdHJpbmcoKSk7Ci0JCWRvY3VtZW50LnNldFRsaWJ2ZXJzaW9uKCIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlJRm9sZGVyIGZvbGRlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0Rm9sZGVyKHBhdGgpOwotCQlJUmVzb3VyY2VbXSB0YWdmaWxlczsKLQkJdHJ5IHsKLQkJCXRhZ2ZpbGVzID0gZm9sZGVyLm1lbWJlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFnZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodGFnZmlsZXNbaV0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCWlmICh0YWdmaWxlc1tpXS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHRhZ2ZpbGVzW2ldLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmIChleHRlbnNpb24uZXF1YWxzKCJ0YWciKSB8fCBleHRlbnNpb24uZXF1YWxzKCJ0YWd4IikpKSB7Ci0JCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGNyZWF0ZUVsZW1lbnREZWNsYXJhdGlvbihkb2N1bWVudCwgKElGaWxlKSB0YWdmaWxlc1tpXSk7Ci0JCQkJCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCQkJCWRvY3VtZW50LmZFbGVtZW50cy5zZXROYW1lZEl0ZW0oZWQuZ2V0Tm9kZU5hbWUoKSwgZWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIE5PVCBBUEkKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50RnJvbUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCS8vIGxvYWQgdGhlIHRhZ2xpYiBkZXNjcmlwdG9yIGZpbGUKLQkJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQlwcm92aWRlci5zZXRCYXNlUmVmZXJlbmNlKGZpbGVOYW1lKTsKLQkJcHJvdmlkZXIuc2V0Um9vdEVsZW1lbnROYW1lKEpTUDExVExETmFtZXMuVEFHTElCKTsKLQkJcHJvdmlkZXIuc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotCQlOb2RlIHJvb3RFbGVtZW50ID0gcHJvdmlkZXIuZ2V0Um9vdEVsZW1lbnQoKTsKLQkJcmV0dXJuIGxvYWREb2N1bWVudChmaWxlTmFtZSwgcm9vdEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyBhIENNRG9jdW1lbnQgYXNzdW1pbmcgdGhlIEpTUCB2MS4xIGRlZmF1bHQgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBqYXJGaWxlTmFtZSAtCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmluZyBKQVIgZmlsZQotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudEZyb21KYXIoU3RyaW5nIGphckZpbGVOYW1lKSB7Ci0JCS8vIGxvYWQgdGhlIHRhZ2xpYiBkZXNjcmlwdG9yIGZpbGUKLQkJcmV0dXJuIGJ1aWxkQ01Eb2N1bWVudEZyb21KYXIoamFyRmlsZU5hbWUsIEphclV0aWxpdGllcy5KU1AxMV9UQUdMSUIpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyBhIENNRG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gamFyRmlsZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5pbmcgSkFSIGZpbGUKLQkgKiBAcGFyYW0gY29udGVudEZpbGVOYW1lIC0KLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHdpdGhpbiB0aGUgSkFSIGZvciBhIHZhbGlkIHRhZ2xpYiBkZXNjcmlwdG9yCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50RnJvbUphcihTdHJpbmcgamFyRmlsZU5hbWUsIFN0cmluZyBjb250ZW50RmlsZU5hbWUpIHsKLQkJLy8gbG9hZCB0aGUgdGFnbGliIGRlc2NyaXB0b3IgZmlsZQotCQlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERvY3VtZW50UHJvdmlkZXIoKTsKLQkJcHJvdmlkZXIuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCXByb3ZpZGVyLnNldEJhc2VSZWZlcmVuY2UoamFyRmlsZU5hbWUpOwotCQlwcm92aWRlci5zZXRSb290RWxlbWVudE5hbWUoSlNQMTFUTEROYW1lcy5UQUdMSUIpOwotCQlwcm92aWRlci5zZXRKYXJGaWxlTmFtZShqYXJGaWxlTmFtZSk7Ci0JCXByb3ZpZGVyLnNldEZpbGVOYW1lKGNvbnRlbnRGaWxlTmFtZSk7Ci0JCUNNRG9jdW1lbnQgZG9jdW1lbnQgPSBsb2FkRG9jdW1lbnQoImphcjpmaWxlOi8vIiArIGphckZpbGVOYW1lICsgIiEiICsgY29udGVudEZpbGVOYW1lLCBwcm92aWRlci5nZXRSb290RWxlbWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIFRPRE86IEFkZCB0aGUgdGFncyBkZWNsYXJlZCBpbiBNRVRBLUlORi90YWdzLCBzZWUgSlNQIDIuMCBzZWN0aW9uCi0JCS8vIDguNC4xCi0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbihDTURvY3VtZW50IGRvY3VtZW50LCBOb2RlIGF0dHJOb2RlKSB7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsIGF0dHIgPSBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoZG9jdW1lbnQpOwotCi0JCU5vZGUgY2hpbGQgPSBhdHRyTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLk5BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlhdHRyLnNldE5vZGVOYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWF0dHIuc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLklEKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJYXR0ci5zZXRJZChnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDExVExETmFtZXMuUkVRVUlSRUQpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlhdHRyLnNldFJlcXVpcmVkU3RyaW5nKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5SVEVYUFJWQUxVRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWF0dHIuc2V0UnRleHBydmFsdWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AyMFRMRE5hbWVzLkZSQUdNRU5UKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJYXR0ci5zZXRGcmFnbWVudChCb29sZWFuLnZhbHVlT2YoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgYSBDTURvY3VtZW50IGZyb20gYSB0YWdsaWIgZGVzY3JpcHRvcgotCSAqIAotCSAqIEBwYXJhbSB1cmkgLQotCSAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIGEgdmFsaWQgdGFnbGliIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmkpIHsKLQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwodXJpKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZUNNRG9jdW1lbnRGcm9tRmlsZSh1cmkpOwotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCAmJiB1cmwgIT0gbnVsbCkgewotCQkJaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBjcmVhdGVDTURvY3VtZW50RnJvbUZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKioKLQkJCQkgKiBTa2lwIGFueXRoaW5nIGVsc2Ugc2luY2UgdHJ5aW5nIHRvIGxvYWQgYSBUTEQgZnJvbSBhIHJlbW90ZQotCQkJCSAqIGxvY2F0aW9uIGhhcyB1bnByZWRpY3RhYmxlIHBlcmZvcm1hbmNlIGltcGFjdC4KLQkJCQkgKi8KLQkJCX0KLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBuZXcgQ01Eb2N1bWVudEltcGwoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDTURvY3VtZW50IGNyZWF0ZUNNRG9jdW1lbnRGcm9tRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQlpZiAoZmlsZU5hbWUuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBidWlsZENNRG9jdW1lbnRGcm9tSmFyKGZpbGVOYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQlyZXN1bHQgPSBidWlsZENNRG9jdW1lbnRGcm9tRGlyZWN0b3J5KGZpbGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gYnVpbGRDTURvY3VtZW50RnJvbUZpbGUoZmlsZU5hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVzdWx0ID0gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnRGcm9tRGlyZWN0b3J5KEZpbGUgZmlsZSkgewotCQlJRmlsZVtdIGZvdW5kRmlsZXNGb3JMb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgoZmlsZS5nZXRQYXRoKCkpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb3VuZEZpbGVzRm9yTG9jYXRpb24ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmb3VuZEZpbGVzRm9yTG9jYXRpb25baV0uaXNBY2Nlc3NpYmxlKCkgJiYgZm91bmRGaWxlc0ZvckxvY2F0aW9uW2ldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkQ01Eb2N1bWVudEZyb21Gb2xkZXIoZm91bmRGaWxlc0ZvckxvY2F0aW9uW2ldLmdldEZ1bGxQYXRoKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVFbGVtZW50RGVjbGFyYXRpb24oQ01Eb2N1bWVudEltcGwgZG9jdW1lbnQsIEVsZW1lbnQgdGFnRmlsZU5vZGUsIFN0cmluZyBwYXRoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IG5ldyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwoZG9jdW1lbnQpOwotCQkvKgotCQkgKiBQcmVsb2FkIHdpdGggaW5mb3JtYXRpb24gZnJvbSB0aGUgdGFnIGZpbGUtLWl0IGNhbiBiZSBvdmVyd3JpdHRlbgotCQkgKiBieSB0aGUgdmFsdWVzIGZyb20gdGhlIFRMRAotCQkgKi8KLQkJSVBhdGggdGFnUGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShuZXcgUGF0aChkb2N1bWVudC5nZXRCYXNlTG9jYXRpb24oKSksIHBhdGgpOwotCQlpZiAodGFnUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCUlGaWxlIHRhZ0ZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUodGFnUGF0aCk7Ci0JCQlpZiAodGFnRmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCWVkLnNldFBhdGgodGFnRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCWlmICh0YWdQYXRoLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoInRhZyIpKSB7Ci0JCQkJCWxvYWRUYWdGaWxlKGVkLCB0YWdGaWxlLCB0cnVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodGFnUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJ0YWd4IikpIHsKLQkJCQkJbG9hZFRhZ1hGaWxlKGVkLCB0YWdGaWxlLCB0cnVlKTsKLQkJCQl9Ci0KLQkJCQlpZiAodGFnRmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwgJiYgZWQuZ2V0U21hbGxJY29uKCkgIT0gbnVsbCkgewotCQkJCQllZC5zZXRTbWFsbEljb25VUkwoVVJJSGVscGVyLm5vcm1hbGl6ZShlZC5nZXRTbWFsbEljb24oKSwgImZpbGU6IiArIHRhZ0ZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCB0YWdGaWxlLmdldExvY2F0aW9uKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChpc0phckZpbGUoZG9jdW1lbnQuZ2V0QmFzZUxvY2F0aW9uKCkpKSB7Ci0JCQkJU3RyaW5nIGphckxvY2F0aW9uID0gZG9jdW1lbnQuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJU3RyaW5nW10gZW50cmllcyA9IEphclV0aWxpdGllcy5nZXRFbnRyeU5hbWVzKGphckxvY2F0aW9uKTsKLQkJCQlib29sZWFuIHRhZzsKLQkJCQlmb3IgKGludCBqRW50cnkgPSAwOyBqRW50cnkgPCBlbnRyaWVzLmxlbmd0aDsgakVudHJ5KyspIHsKLQkJCQkJdGFnID0gZmFsc2U7Ci0JCQkJCWlmICgoKHRhZyA9IGVudHJpZXNbakVudHJ5XS5lbmRzV2l0aCgiLnRhZyIpKSB8fCBlbnRyaWVzW2pFbnRyeV0uZW5kc1dpdGgoIi50YWd4IikpICYmIGVudHJpZXNbakVudHJ5XS5zdGFydHNXaXRoKCJNRVRBLUlORi90YWdzLyIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBKYXJVdGlsaXRpZXMuZ2V0SW5wdXRTdHJlYW0oamFyTG9jYXRpb24sIGVudHJpZXNbakVudHJ5XSk7Ci0JCQkJCQkJaWYgKHRhZykgey8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCWxvYWRUYWdGaWxlKGVkLCB0YWdGaWxlLCB0cnVlLCBjb250ZW50cyk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlsb2FkVGFnWEZpbGUoZWQsIHRhZ0ZpbGUsIHRydWUsIGNvbnRlbnRzKTsKLQkJCQkJCQl9Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIG51bGwsIGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQkKLQkJCX0KLQkJfQotCi0JCS8vIGxvYWQgaW5mb3JtYXRpb24gZGVjbGFyZWQgd2l0aGluIHRoZSAudGxkCi0JCU5vZGUgY2hpbGQgPSB0YWdGaWxlTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ESVNQTEFZX05BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXREaXNwbGF5TmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLkVYQU1QTEUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXRFeGFtcGxlKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuSUNPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldFNtYWxsSWNvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLk5BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXROb2RlTmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLlBBVEgpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXRQYXRoKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuVEFHX0VYVEVOU0lPTikpIHsKLQkJCQkJZWQuZ2V0RXh0ZW5zaW9ucygpLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCQotCQlyZXR1cm4gZWQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSmFyRmlsZShTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmaW5hbCBpbnQgaWR4ID0gcGF0aC5sYXN0SW5kZXhPZignLicpOwotCQlyZXR1cm4gaWR4ID49IDAgJiYgaWR4IDwgKHBhdGgubGVuZ3RoKCkgLSAxKSAmJiBwYXRoLnN1YnN0cmluZyhpZHggKyAxKS5lcXVhbHNJZ25vcmVDYXNlKCJqYXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVFbGVtZW50RGVjbGFyYXRpb24oQ01Eb2N1bWVudCBkb2N1bWVudCwgTm9kZSB0YWdOb2RlKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IG5ldyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwoZG9jdW1lbnQpOwotCi0JCU5vZGUgY2hpbGQgPSB0YWdOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJLy8gdGFnIGluZm9ybWF0aW9uCi0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuTkFNRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldE5vZGVOYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlRBR0NMQVNTKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UQUdfQ0xBU1MpKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0VGFnY2xhc3MoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVEVJQ0xBU1MpIHx8IG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlRFSV9DTEFTUykpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXRUZWljbGFzcyhnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5CT0RZQ09OVEVOVCkgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuQk9EWV9DT05URU5UKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCVN0cmluZyBib2R5Y29udGVudCA9IGdldENvbnRhaW5lZFRleHQoY2hpbGQpOwotCQkJCQkvLyBBcHBhcmVudGx5LCBBcGFjaGUgVG9tY2F0IGlzIG5vdCBjYXNlIHNlbnNpdGl2ZSBhYm91dAotCQkJCQkvLyB0aGVzZSB2YWx1ZXMKLQkJCQkJaWYgKGJvZHljb250ZW50LmVxdWFsc0lnbm9yZUNhc2UoSlNQMTFUTEROYW1lcy5DT05URU5UX0pTUCkpCi0JCQkJCQllZC5zZXRCb2R5Y29udGVudChKU1AxMVRMRE5hbWVzLkNPTlRFTlRfSlNQKTsKLQkJCQkJZWxzZSBpZiAoYm9keWNvbnRlbnQuZXF1YWxzSWdub3JlQ2FzZShKU1AxMVRMRE5hbWVzLkNPTlRFTlRfVEFHREVQRU5ERU5UKSkKLQkJCQkJCWVkLnNldEJvZHljb250ZW50KEpTUDExVExETmFtZXMuQ09OVEVOVF9UQUdERVBFTkRFTlQpOwotCQkJCQllbHNlIGlmIChib2R5Y29udGVudC5lcXVhbHNJZ25vcmVDYXNlKEpTUDExVExETmFtZXMuQ09OVEVOVF9FTVBUWSkpCi0JCQkJCQllZC5zZXRCb2R5Y29udGVudChKU1AxMVRMRE5hbWVzLkNPTlRFTlRfRU1QVFkpOwotCQkJCQllbHNlIGlmIChib2R5Y29udGVudC5lcXVhbHNJZ25vcmVDYXNlKEpTUDIwVExETmFtZXMuQ09OVEVOVF9TQ1JJUFRMRVNTKSkKLQkJCQkJCWVkLnNldEJvZHljb250ZW50KEpTUDIwVExETmFtZXMuQ09OVEVOVF9TQ1JJUFRMRVNTKTsKLQkJCQl9Ci0JCQkJLy8gaW5mbyAoMS4xIG9ubHkpIG9yIGRlc2NyaXB0aW9uICgxLjIgb25seSkKLQkJCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuSU5GTykgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQkvLyBhdHRyaWJ1dGVzCi0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuQVRUUklCVVRFKSkgewotCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbihkb2N1bWVudCwgY2hpbGQpOwotCQkJCQllZC5mQXR0cmlidXRlcy5zZXROYW1lZEl0ZW0oYXR0ci5nZXRBdHRyTmFtZSgpLCBhdHRyKTsKLQkJCQl9Ci0JCQkJLy8gdmFyaWFibGVzCi0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEUpKSB7Ci0JCQkJCWVkLmdldFZhcmlhYmxlcygpLmFkZChjcmVhdGVWYXJpYWJsZShjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0TGFyZ2VJY29uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuU01BTExfSUNPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldFNtYWxsSWNvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLlRBR19FWFRFTlNJT04pICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJZWQuZ2V0RXh0ZW5zaW9ucygpLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLkRZTkFNSUNfQVRUUklCVVRFUykgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldER5bmFtaWNBdHRyaWJ1dGVzKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGVkOwotCX0KLQotCXByaXZhdGUgQ01FbGVtZW50RGVjbGFyYXRpb24gY3JlYXRlRWxlbWVudERlY2xhcmF0aW9uKENNRG9jdW1lbnQgZG9jdW1lbnQsIElGaWxlIHRhZ0ZpbGUpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkID0gbmV3IENNRWxlbWVudERlY2xhcmF0aW9uSW1wbChkb2N1bWVudCk7Ci0JCS8vIGluIHRhZyBmaWxlcywgdGhlIGRlZmF1bHQgYm9keSBjb250ZW50IGlzIHNjcmlwdGxlc3MgaW5zdGVhZCBvZiBKU1AKLQkJZWQuc2V0Qm9keWNvbnRlbnQoSlNQMjBUTEROYW1lcy5DT05URU5UX1NDUklQVExFU1MpOwotCQlTdHJpbmcgc2hvcnRGaWxlbmFtZSA9IHRhZ0ZpbGUuZ2V0TmFtZSgpOwotCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IHRhZ0ZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQlpZiAoZmlsZUV4dGVuc2lvbiAhPSBudWxsICYmIGZpbGVFeHRlbnNpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzaG9ydEZpbGVuYW1lID0gc2hvcnRGaWxlbmFtZS5zdWJzdHJpbmcoMCwgc2hvcnRGaWxlbmFtZS5sZW5ndGgoKSAtIGZpbGVFeHRlbnNpb24ubGVuZ3RoKCkgLSAxKTsKLQkJfQotCQllZC5zZXROb2RlTmFtZShzaG9ydEZpbGVuYW1lKTsKLQkJZWQuc2V0UGF0aCh0YWdGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCWlmIChmaWxlRXh0ZW5zaW9uLmVxdWFscygidGFnIikpIHsKLQkJCWxvYWRUYWdGaWxlKGVkLCB0YWdGaWxlLCB0cnVlKTsKLQkJfQotCQllbHNlIGlmIChmaWxlRXh0ZW5zaW9uLmVxdWFscygidGFneCIpKSB7Ci0JCQlsb2FkVGFnWEZpbGUoZWQsIHRhZ0ZpbGUsIHRydWUpOwotCQl9Ci0KLQkJaWYgKHRhZ0ZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsICYmIGVkLmdldFNtYWxsSWNvbigpICE9IG51bGwpIHsKLQkJCWVkLnNldFNtYWxsSWNvblVSTChVUklIZWxwZXIubm9ybWFsaXplKGVkLmdldFNtYWxsSWNvbigpLCAiZmlsZToiICsgdGFnRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksIHRhZ0ZpbGUuZ2V0TG9jYXRpb24oKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9TdHJpbmcoKSkpOwotCQl9Ci0JCXJldHVybiBlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVExERnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24oQ01Eb2N1bWVudCBkb2N1bWVudCwgTm9kZSBmdW5jdGlvbk5vZGUpIHsKLQkJVExERnVuY3Rpb25JbXBsIGZ1bmN0aW9uID0gbmV3IFRMREZ1bmN0aW9uSW1wbChkb2N1bWVudCk7Ci0JCWJvb2xlYW4gaGFzTmFtZSA9IGZhbHNlOwotCi0JCU5vZGUgY2hpbGQgPSBmdW5jdGlvbk5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkvLyB0YWcgaW5mb3JtYXRpb24KLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuRElTUExBWV9OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uc2V0TmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLkVYQU1QTEUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXRFeGFtcGxlKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuRlVOQ1RJT05fQ0xBU1MpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXRDbGFzc05hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5GVU5DVElPTl9FWFRFTlNJT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5nZXRFeHRlbnNpb25zKCkuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuRlVOQ1RJT05fU0lHTkFUVVJFKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uc2V0U2lnbmF0dXJlKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuSUNPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLnNldEljb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uc2V0TmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJCWhhc05hbWUgPSBmdW5jdGlvbi5nZXROYW1lKCkudHJpbSgpLmxlbmd0aCgpID4gMDsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJaWYgKGhhc05hbWUpIHsKLQkJCXJldHVybiBmdW5jdGlvbjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVExESW5pdFBhcmFtIGNyZWF0ZUluaXRQYXJhbShOb2RlIGluaXRQYXJhbU5vZGUpIHsKLQkJVExESW5pdFBhcmFtSW1wbCBpbml0UGFyYW0gPSBuZXcgVExESW5pdFBhcmFtSW1wbCgpOwotCQlOb2RlIGNoaWxkID0gaW5pdFBhcmFtTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBTElEQVRPUl9QQVJBTV9OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJaW5pdFBhcmFtLnNldE5hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQUxJREFUT1JfUEFSQU1fVkFMVUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlpbml0UGFyYW0uc2V0VmFsdWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWluaXRQYXJhbS5zZXREZXNjcmlwdGlvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBpbml0UGFyYW07Ci0JfQotCi0JcHJvdGVjdGVkIFRMRExpc3RlbmVyIGNyZWF0ZUxpc3RlbmVyKE5vZGUgbGlzdGVuZXJOb2RlKSB7Ci0JCVRMRExpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBUTERMaXN0ZW5lckltcGwoKTsKLQkJTm9kZSBjaGlsZCA9IGxpc3RlbmVyTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkxJU1RFTkVSX0NMQVNTKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJbGlzdGVuZXIuc2V0TGlzdGVuZXJDbGFzcyhnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBsaXN0ZW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVExEVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihOb2RlIHZhbGlkYXRvck5vZGUpIHsKLQkJVExEVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3IgPSBuZXcgVExEVmFsaWRhdG9ySW1wbCgpOwotCQlOb2RlIGNoaWxkID0gdmFsaWRhdG9yTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBTElEQVRPUl9DTEFTUykgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXZhbGlkYXRvci5zZXRWYWxpZGF0b3JDbGFzcyhnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBTElEQVRPUl9JTklUX1BBUkFNKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFsaWRhdG9yLmdldEluaXRQYXJhbXMoKS5hZGQoY3JlYXRlSW5pdFBhcmFtKGNoaWxkKSk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIFRMRFZhcmlhYmxlIGNyZWF0ZVZhcmlhYmxlKE5vZGUgdmFyaWFibGVOb2RlKSB7Ci0JCVRMRFZhcmlhYmxlSW1wbCB2YXJpYWJsZSA9IG5ldyBUTERWYXJpYWJsZUltcGwoKTsKLQkJTm9kZSBjaGlsZCA9IHZhcmlhYmxlTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBUklBQkxFX0NMQVNTKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFyaWFibGUuc2V0VmFyaWFibGVDbGFzcyhnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBUklBQkxFX0RFQ0xBUkUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YXJpYWJsZS5zZXREZWNsYXJlU3RyaW5nKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfTkFNRV9GUk9NX0FUVFJJQlVURSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXZhcmlhYmxlLnNldE5hbWVGcm9tQXR0cmlidXRlKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfTkFNRV9HSVZFTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXZhcmlhYmxlLnNldE5hbWVHaXZlbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBUklBQkxFX1NDT1BFKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFyaWFibGUuc2V0U2NvcGUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXZhcmlhYmxlLnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHZhcmlhYmxlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGFpbmVkVGV4dChOb2RlIHBhcmVudCkgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSA9PSAxKSB7Ci0JCQlyZXR1cm4gZ2V0VmFsdWUoY2hpbGRyZW4uaXRlbSgwKSk7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpIHsKLQkJCQlTdHJpbmcgcmVmZXJlbmNlID0gKChFbnRpdHlSZWZlcmVuY2UpIGNoaWxkKS5nZXROb2RlVmFsdWUoKTsKLQkJCQlpZiAocmVmZXJlbmNlID09IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCXJlZmVyZW5jZSA9ICImIiArIGNoaWxkLmdldE5vZGVOYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJcy5hcHBlbmQocmVmZXJlbmNlLnRyaW0oKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcy5hcHBlbmQoZ2V0VmFsdWUoY2hpbGQpKTsKLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gcy50b1N0cmluZygpLnRyaW0oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRWYWx1ZShOb2RlIG4pIHsKLQkJaWYgKG4gPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdmFsdWUgPSBuLmdldE5vZGVWYWx1ZSgpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdmFsdWUudHJpbSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQnVpbGRlckZvckdyYW1tYXIoU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBncmFtbWFyRmlsZU5hbWUudG9Mb3dlckNhc2UoKTsKLQkJcmV0dXJuIGZpbGVOYW1lLmVuZHNXaXRoKCIudGxkIikgfHwgZmlsZU5hbWUuZW5kc1dpdGgoIi5qYXIiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIENNRG9jdW1lbnQgbG9hZERvY3VtZW50KFN0cmluZyBiYXNlTG9jYXRpb24sIE5vZGUgdGFnbGliKSB7Ci0JCU5vZGUgcm9vdCA9IHRhZ2xpYjsKLQotCQkvLyBjcmVhdGUgdGhlIENNRG9jdW1lbnQKLQkJQ01Eb2N1bWVudEltcGwgZG9jdW1lbnQgPSBuZXcgQ01Eb2N1bWVudEltcGwoKTsKLQkJZG9jdW1lbnQuc2V0QmFzZUxvY2F0aW9uKGJhc2VMb2NhdGlvbik7Ci0KLQkJaWYgKHJvb3QgPT0gbnVsbCkgewotCQkJaWYgKF9kZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibnVsbCBcInRhZ2xpYlwiIGVsZW1lbnQgZm9yIFRMRCAiICsgYmFzZUxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGRvY3VtZW50OwotCQl9Ci0KLQkJLy8gcG9wdWxhdGUgdGhlIENNRG9jdW1lbnQKLQkJTm9kZSBjaGlsZCA9IHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJaWYobm9kZU5hbWUuaW5kZXhPZignOicpID4gMCkgewotCQkJCW5vZGVOYW1lID0gbm9kZU5hbWUuc3Vic3RyaW5nKG5vZGVOYW1lLmluZGV4T2YoJzonKSk7Ci0JCQl9Ci0JCQkvLyB0YWcKLQkJCWlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5UQUcpKSB7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBjcmVhdGVFbGVtZW50RGVjbGFyYXRpb24oZG9jdW1lbnQsIGNoaWxkKTsKLQkJCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCQlkb2N1bWVudC5mRWxlbWVudHMuc2V0TmFtZWRJdGVtKGVkLmdldE5vZGVOYW1lKCksIGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyB0YWctZmlsZQotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuVEFHX0ZJTEUpICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJRWxlbWVudCB0YWdGaWxlRWxlbWVudCA9IChFbGVtZW50KSBjaGlsZDsKLQkJCQlOb2RlIHBhdGggPSB0YWdGaWxlRWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJd2hpbGUgKHBhdGggIT0gbnVsbCkgewotCQkJCQlpZiAocGF0aC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIChKU1AyMFRMRE5hbWVzLlBBVEguZXF1YWxzKHBhdGguZ2V0Tm9kZU5hbWUoKSkgfHwgSlNQMjBUTEROYW1lcy5QQVRILmVxdWFscyhwYXRoLmdldExvY2FsTmFtZSgpKSkpIHsKLQkJCQkJCVN0cmluZyBwYXRoVmFsdWUgPSBnZXRDb250YWluZWRUZXh0KHBhdGgpOwotCQkJCQkJaWYgKHBhdGhWYWx1ZSAhPSBudWxsICYmIHBhdGhWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKSBjcmVhdGVFbGVtZW50RGVjbGFyYXRpb24oZG9jdW1lbnQsIHRhZ0ZpbGVFbGVtZW50LCBwYXRoVmFsdWUpOwotCQkJCQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJCQkJCWRvY3VtZW50LmZFbGVtZW50cy5zZXROYW1lZEl0ZW0oZWQuZ2V0Tm9kZU5hbWUoKSwgZWQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlwYXRoID0gcGF0aC5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCX0KLQkJCS8vIG90aGVyIG9uZS1vZi1hLWtpbmQgY2hpbGRyZW4KLQkJCS8vIEpTUCB2ZXJzaW9uCi0JCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuSlNQVkVSU0lPTikgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuSlNQX1ZFUlNJT04pKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXRKc3B2ZXJzaW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIHRhZyBsaWJyYXJ5IHZlcnNpb24KLQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5UTElCVkVSU0lPTikgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVExJQl9WRVJTSU9OKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0VGxpYnZlcnNpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gc2hvcnQgbmFtZQotCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlNIT1JUTkFNRSkgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuU0hPUlRfTkFNRSkpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldFNob3J0bmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBVUkkvVVJOCi0JCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVVJJKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5VUk4pKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWRvY3VtZW50LnNldFVyaShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBpbmZvCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5JTkZPKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXRJbmZvKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIE5ldyBKU1AgMS4yCi0JCQkvLyBkZXNjcmlwdGlvbgotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIGRpc3BsYXkgbmFtZQotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuRElTUExBWV9OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXREaXNwbGF5TmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBsYXJnZSBpY29uCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXRMYXJnZUljb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gc21hbGwgaWNvbgotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuU01BTExfSUNPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0U21hbGxJY29uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIHZhbGlkYXRvcgotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFMSURBVE9SKSkgewotCQkJCWRvY3VtZW50LnNldFZhbGlkYXRvcihjcmVhdGVWYWxpZGF0b3IoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIGxpc3RlbmVyCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MSVNURU5FUikpIHsKLQkJCQlkb2N1bWVudC5nZXRMaXN0ZW5lcnMoKS5hZGQoY3JlYXRlTGlzdGVuZXIoY2hpbGQpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLkZVTkNUSU9OKSkgewotCQkJCVRMREZ1bmN0aW9uIGZ1bmN0aW9uID0gY3JlYXRlRnVuY3Rpb24oZG9jdW1lbnQsIGNoaWxkKTsKLQkJCQlpZiAoZnVuY3Rpb24gIT0gbnVsbCkgewotCQkJCQlkb2N1bWVudC5nZXRGdW5jdGlvbnMoKS5hZGQoZnVuY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLlRBR0xJQl9FWFRFTlNJT04pKSB7Ci0JCQkJZG9jdW1lbnQuZ2V0RXh0ZW5zaW9ucygpLmFkZChjaGlsZCk7Ci0JCQl9Ci0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0Jdm9pZCBsb2FkVGFnWEZpbGUoZmluYWwgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkLCBJRmlsZSB0YWd4RmlsZSwgYm9vbGVhbiBhbGxvd0luY2x1ZGVzKSB7Ci0JICBsb2FkVGFnWEZpbGUoZWQsIHRhZ3hGaWxlLCBhbGxvd0luY2x1ZGVzLCBudWxsKTsKLQl9Ci0JCi0Jdm9pZCBsb2FkVGFnWEZpbGUoZmluYWwgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkLCBJRmlsZSB0YWd4RmlsZSwgYm9vbGVhbiBhbGxvd0luY2x1ZGVzLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQllZC5zZXRQYXRoKHRhZ3hGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCWVkLnNldFRhZ1NvdXJjZShUTERFbGVtZW50RGVjbGFyYXRpb24uU09VUkNFX1RBR19GSUxFKTsKLQkJdHJ5IHsKLQkJCVNBWFBhcnNlciBwYXJzZXIgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCk7Ci0JCQlJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSh0YWd4RmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBpbnB1dFN0cmVhbSAhPSBudWxsID8gaW5wdXRTdHJlYW0gOiB0YWd4RmlsZS5nZXRDb250ZW50cyhmYWxzZSk7Ci0JCQlpbnB1dFNvdXJjZS5zZXRCeXRlU3RyZWFtKGlucHV0KTsKLQkJCXBhcnNlci5wYXJzZShpbnB1dFNvdXJjZSwgbmV3IERlZmF1bHRIYW5kbGVyKCkgewotCQkJCXB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQkJSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UyID0gbmV3IElucHV0U291cmNlKHN5c3RlbUlkKTsKLQkJCQkJaW5wdXRTb3VyY2UyLnNldEJ5dGVTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSk7Ci0JCQkJCXJldHVybiBpbnB1dFNvdXJjZTI7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQkJc3VwZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJCWlmIChxTmFtZS5lcXVhbHMoSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBRykpIHsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDEyVExETmFtZXMuRElTUExBWV9OQU1FKSA+PSAwKQotCQkJCQkJCWVkLnNldERpc3BsYXlOYW1lKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMTJUTEROYW1lcy5ESVNQTEFZX05BTUUpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDEyVExETmFtZXMuQk9EWV9DT05URU5UKSA+PSAwKQotCQkJCQkJCWVkLnNldEJvZHljb250ZW50KGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMTJUTEROYW1lcy5CT0RZX0NPTlRFTlQpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDIwVExETmFtZXMuRFlOQU1JQ19BVFRSSUJVVEVTKSA+PSAwKQotCQkJCQkJCWVkLnNldER5bmFtaWNBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMjBUTEROYW1lcy5EWU5BTUlDX0FUVFJJQlVURVMpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDEyVExETmFtZXMuU01BTExfSUNPTikgPj0gMCkKLQkJCQkJCQllZC5zZXRTbWFsbEljb24oYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04pKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTikgPj0gMCkKLQkJCQkJCQllZC5zZXRMYXJnZUljb24oYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04pKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pID49IDApCi0JCQkJCQkJZWQuc2V0RGVzY3JpcHRpb24oYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRJbmRleChKU1AyMFRMRE5hbWVzLkVYQU1QTEUpID49IDApCi0JCQkJCQkJZWQuc2V0RXhhbXBsZShhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDIwVExETmFtZXMuRVhBTVBMRSkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMjBUTEROYW1lcy5TQ1JJUFRJTkdfTEFOR1VBR0UpID49IDApCi0JCQkJCQkJZWQuc2V0U2NyaXB0aW5nTGFuZ3VhZ2UoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AyMFRMRE5hbWVzLlNDUklQVElOR19MQU5HVUFHRSkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMjBUTEROYW1lcy5JTVBPUlQpID49IDApCi0JCQkJCQkJZWQuc2V0SW1wb3J0KGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMjBUTEROYW1lcy5JTVBPUlQpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDIwVExETmFtZXMuUEFHRV9FTkNPRElORykgPj0gMCkKLQkJCQkJCQllZC5zZXRQYWdlRW5jb2RpbmcoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AyMFRMRE5hbWVzLlBBR0VfRU5DT0RJTkcpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDIwVExETmFtZXMuSVNfRUxfSUdOT1JFRCkgPj0gMCkKLQkJCQkJCQllZC5zZXRJc0VMSWdub3JlZChhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDIwVExETmFtZXMuSVNfRUxfSUdOT1JFRCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHFOYW1lLmVxdWFscyhKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfQVRUUklCVVRFKSkgewotCQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgYXR0cmlidXRlID0gbmV3IENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKGVkLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkJCQlTdHJpbmcgbmFtZVZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLk5BTUUpOwotCQkJCQkJYXR0cmlidXRlLnNldE5vZGVOYW1lKG5hbWVWYWx1ZSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRJbmRleChKU1AyMFRMRE5hbWVzLkZSQUdNRU5UKSA+PSAwKQotCQkJCQkJCWF0dHJpYnV0ZS5zZXRGcmFnbWVudChCb29sZWFuLnZhbHVlT2YoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AyMFRMRE5hbWVzLkZSQUdNRU5UKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5SVEVYUFJWQUxVRSkgPj0gMCkKLQkJCQkJCQlhdHRyaWJ1dGUuc2V0UnRleHBydmFsdWUoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLlJURVhQUlZBTFVFKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRJbmRleChKU1AyMFRMRE5hbWVzLlRZUEUpID49IDApCi0JCQkJCQkJYXR0cmlidXRlLnNldFR5cGUoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AyMFRMRE5hbWVzLlRZUEUpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pID49IDApCi0JCQkJCQkJYXR0cmlidXRlLnNldERlc2NyaXB0aW9uKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5SRVFVSVJFRCkgPj0gMCkKLQkJCQkJCQlhdHRyaWJ1dGUuc2V0UmVxdWlyZWRTdHJpbmcoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLlJFUVVJUkVEKSk7Ci0JCQkJCQlpZiAobmFtZVZhbHVlICE9IG51bGwgJiYgbmFtZVZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCWVkLmZBdHRyaWJ1dGVzLnNldE5hbWVkSXRlbShuYW1lVmFsdWUsIGF0dHJpYnV0ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocU5hbWUuZXF1YWxzKEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9WQVJJQUJMRSkpIHsKLQkJCQkJCVRMRFZhcmlhYmxlSW1wbCB2YXJpYWJsZSA9IG5ldyBUTERWYXJpYWJsZUltcGwoKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDEyVExETmFtZXMuVkFSSUFCTEVfTkFNRV9HSVZFTikgPj0gMCkKLQkJCQkJCQl2YXJpYWJsZS5zZXROYW1lR2l2ZW4oYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLlZBUklBQkxFX05BTUVfR0lWRU4pKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDEyVExETmFtZXMuVkFSSUFCTEVfTkFNRV9GUk9NX0FUVFJJQlVURSkgPj0gMCkKLQkJCQkJCQl2YXJpYWJsZS5zZXROYW1lRnJvbUF0dHJpYnV0ZShhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfTkFNRV9GUk9NX0FUVFJJQlVURSkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMjBUTEROYW1lcy5WQVJJQUJMRV9BTElBUykgPj0gMCkKLQkJCQkJCQl2YXJpYWJsZS5zZXRBbGlhcyhhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDIwVExETmFtZXMuVkFSSUFCTEVfQUxJQVMpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDEyVExETmFtZXMuVkFSSUFCTEVfQ0xBU1MpID49IDApCi0JCQkJCQkJdmFyaWFibGUuc2V0VmFyaWFibGVDbGFzcyhhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfQ0xBU1MpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDEyVExETmFtZXMuVkFSSUFCTEVfREVDTEFSRSkgPj0gMCkKLQkJCQkJCQl2YXJpYWJsZS5zZXREZWNsYXJlU3RyaW5nKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9ERUNMQVJFKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRJbmRleChKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfU0NPUEUpID49IDApCi0JCQkJCQkJdmFyaWFibGUuc2V0U2NvcGUoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfU0NPUEUpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pID49IDApCi0JCQkJCQkJdmFyaWFibGUuc2V0RGVzY3JpcHRpb24oYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSk7Ci0JCQkJCQlpZiAodmFyaWFibGUuZ2V0QWxpYXMoKSAhPSBudWxsIHx8IHZhcmlhYmxlLmdldE5hbWVGcm9tQXR0cmlidXRlKCkgIT0gbnVsbCB8fCB2YXJpYWJsZS5nZXROYW1lR2l2ZW4oKSAhPSBudWxsKSB7Ci0JCQkJCQkJZWQuZ2V0VmFyaWFibGVzKCkuYWRkKHZhcmlhYmxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChxTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX0lOQ0xVREUpKSB7Ci0JCQkJCQlJUGF0aCBmaWxlUGF0aCA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgdGV4dCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0ZJTEUpOwotCQkJCQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJCQkJCWZpbGVQYXRoID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5yZXNvbHZlKG5ldyBQYXRoKCgoQ01Eb2N1bWVudEltcGwpIGVkLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QmFzZUxvY2F0aW9uKCkpLCB0ZXh0KTsKLQkJCQkJCQlJRmlsZSBpbmNsdWRlZEZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotCQkJCQkJCWlmIChpbmNsdWRlZEZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJbG9hZFRhZ1hGaWxlKGVkLCBpbmNsdWRlZEZpbGUsIGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCWlucHV0LmNsb3NlKCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQllZC5zZXRMb2NhdGlvblN0cmluZyh0YWd4RmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkVGFnRmlsZShDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgZWQsIElGaWxlIHRhZ0ZpbGUsIGJvb2xlYW4gYWxsb3dJbmNsdWRlcykgewotCQlsb2FkVGFnRmlsZShlZCwgdGFnRmlsZSwgYWxsb3dJbmNsdWRlcywgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkVGFnRmlsZShDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgZWQsIElGaWxlIHRhZ0ZpbGUsIGJvb2xlYW4gYWxsb3dJbmNsdWRlcywgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdHJ5IHsKLQkJCWVkLnNldFBhdGgodGFnRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJZWQuc2V0VGFnU291cmNlKFRMREVsZW1lbnREZWNsYXJhdGlvbi5TT1VSQ0VfVEFHX0ZJTEUpOwotCQkJZWQuc2V0TG9jYXRpb25TdHJpbmcodGFnRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCQlpZihpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJZG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCluZXcgTW9kZWxIYW5kbGVyRm9ySlNQKCkuZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQodGFnRmlsZS5nZXROYW1lKCksIGlucHV0U3RyZWFtKTsKLQkJCX0KLQkJCWVsc2UgaWYodGFnRmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCWRvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIG5ldyBNb2RlbEhhbmRsZXJGb3JKU1AoKS5nZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCh0YWdGaWxlKTsKLQkJCX0KLQkJCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJd2hpbGUgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAoZG9jdW1lbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpKSB7Ci0JCQkJCWlmIChkb2N1bWVudFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDIpIHsKLQkJCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJCQkJU3RyaW5nIGRpcmVjdGl2ZU5hbWUgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbnMuZ2V0KDEpKTsKLQkJCQkJCWlmIChKU1AxMlRMRE5hbWVzLlRBRy5lcXVhbHMoZGlyZWN0aXZlTmFtZSkpIHsKLQkJCQkJCQkvLyA4LjUuMQotCQkJCQkJCVN0cmluZyBhdHRyTmFtZSA9IG51bGw7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDI7IGkgPCBkb2N1bWVudFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKTsgaSsrKSB7Ci0JCQkJCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJCQlTdHJpbmcgdGV4dCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJCQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQkJCQlhdHRyTmFtZSA9IHRleHQ7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gcHJvY2VzcyB2YWx1ZQotCQkJCQkJCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCQkJCXRleHQgPSBTdHJpbmdVdGlscy5zdHJpcCh0ZXh0KTsKLQkJCQkJCQkJCWlmIChKU1AxMlRMRE5hbWVzLkRJU1BMQVlfTkFNRS5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJZWQuc2V0RGlzcGxheU5hbWUodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLkJPRFlfQ09OVEVOVC5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJZWQuc2V0Qm9keWNvbnRlbnQodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AyMFRMRE5hbWVzLkRZTkFNSUNfQVRUUklCVVRFUy5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJZWQuc2V0RHluYW1pY0F0dHJpYnV0ZXModGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04uZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCWVkLnNldFNtYWxsSWNvbih0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTi5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJZWQuc2V0TGFyZ2VJY29uKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTi5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJZWQuc2V0RGVzY3JpcHRpb24odGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AyMFRMRE5hbWVzLkVYQU1QTEUuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCWVkLnNldEV4YW1wbGUodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AyMFRMRE5hbWVzLlNDUklQVElOR19MQU5HVUFHRS5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJZWQuc2V0U2NyaXB0aW5nTGFuZ3VhZ2UodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AyMFRMRE5hbWVzLklNUE9SVC5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJZWQuc2V0SW1wb3J0KHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMjBUTEROYW1lcy5QQUdFX0VOQ09ESU5HLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXRQYWdlRW5jb2RpbmcodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AyMFRMRE5hbWVzLklTX0VMX0lHTk9SRUQuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCWVkLnNldElzRUxJZ25vcmVkKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoSlNQMTJUTEROYW1lcy5BVFRSSUJVVEUuZXF1YWxzKGRpcmVjdGl2ZU5hbWUpKSB7Ci0JCQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgYXR0cmlidXRlID0gbmV3IENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKGVkLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkJCQkJLy8gOC41LjIKLQkJCQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBudWxsOwotCQkJCQkJCWZvciAoaW50IGkgPSAyOyBpIDwgZG9jdW1lbnRSZWdpb24uZ2V0TnVtYmVyT2ZSZWdpb25zKCk7IGkrKykgewotCQkJCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJCQkJU3RyaW5nIHRleHQgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJCQkJYXR0ck5hbWUgPSB0ZXh0OwotCQkJCQkJCQl9Ci0JCQkJCQkJCS8vIHByb2Nlc3MgdmFsdWUKLQkJCQkJCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFICYmIGF0dHJOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJCXRleHQgPSBTdHJpbmdVdGlscy5zdHJpcCh0ZXh0KTsKLQkJCQkJCQkJCWlmIChKU1AxMlRMRE5hbWVzLk5BTUUuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCWF0dHJpYnV0ZS5zZXROb2RlTmFtZSh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDIwVExETmFtZXMuRlJBR01FTlQuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCWF0dHJpYnV0ZS5zZXRGcmFnbWVudChCb29sZWFuLnZhbHVlT2YodGV4dCkuYm9vbGVhblZhbHVlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMTJUTEROYW1lcy5SVEVYUFJWQUxVRS5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJYXR0cmlidXRlLnNldFJ0ZXhwcnZhbHVlKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMjBUTEROYW1lcy5UWVBFLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQlhdHRyaWJ1dGUuc2V0VHlwZSh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04uZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCWF0dHJpYnV0ZS5zZXREZXNjcmlwdGlvbih0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDEyVExETmFtZXMuUkVRVUlSRUQuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCWF0dHJpYnV0ZS5zZXRSZXF1aXJlZFN0cmluZyh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoYXR0cmlidXRlLmdldE5vZGVOYW1lKCkgIT0gbnVsbCkgewotCQkJCQkJCQllZC5mQXR0cmlidXRlcy5zZXROYW1lZEl0ZW0oYXR0cmlidXRlLmdldE5vZGVOYW1lKCksIGF0dHJpYnV0ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoSlNQMTJUTEROYW1lcy5WQVJJQUJMRS5lcXVhbHMoZGlyZWN0aXZlTmFtZSkpIHsKLQkJCQkJCQlUTERWYXJpYWJsZUltcGwgdmFyaWFibGUgPSBuZXcgVExEVmFyaWFibGVJbXBsKCk7Ci0JCQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gbnVsbDsKLQkJCQkJCQlmb3IgKGludCBpID0gMjsgaSA8IGRvY3VtZW50UmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpOyBpKyspIHsKLQkJCQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCQkJCVN0cmluZyB0ZXh0ID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dChyZWdpb24pOwotCQkJCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCQkJCWF0dHJOYW1lID0gdGV4dDsKLQkJCQkJCQkJfQotCQkJCQkJCQkvLyBwcm9jZXNzIHZhbHVlCi0JCQkJCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSAmJiBhdHRyTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQl0ZXh0ID0gU3RyaW5nVXRpbHMuc3RyaXAodGV4dCk7Ci0JCQkJCQkJCQlpZiAoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9OQU1FX0dJVkVOLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQl2YXJpYWJsZS5zZXROYW1lR2l2ZW4odGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLlZBUklBQkxFX05BTUVfRlJPTV9BVFRSSUJVVEUuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCXZhcmlhYmxlLnNldE5hbWVGcm9tQXR0cmlidXRlKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMjBUTEROYW1lcy5WQVJJQUJMRV9BTElBUy5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJdmFyaWFibGUuc2V0QWxpYXModGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLlZBUklBQkxFX0NMQVNTLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQl2YXJpYWJsZS5zZXRWYXJpYWJsZUNsYXNzKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9ERUNMQVJFLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQl2YXJpYWJsZS5zZXREZWNsYXJlU3RyaW5nKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1NDT1BFLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQl2YXJpYWJsZS5zZXRTY29wZSh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04uZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCXZhcmlhYmxlLnNldERlc2NyaXB0aW9uKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICh2YXJpYWJsZS5nZXRBbGlhcygpICE9IG51bGwgfHwgdmFyaWFibGUuZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSAhPSBudWxsIHx8IHZhcmlhYmxlLmdldE5hbWVHaXZlbigpICE9IG51bGwpIHsKLQkJCQkJCQkJZWQuZ2V0VmFyaWFibGVzKCkuYWRkKHZhcmlhYmxlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmICgiaW5jbHVkZSIuZXF1YWxzKGRpcmVjdGl2ZU5hbWUpICYmIGFsbG93SW5jbHVkZXMpIHsKLQkJCQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBudWxsOwotCQkJCQkJCWZvciAoaW50IGkgPSAyOyBpIDwgZG9jdW1lbnRSZWdpb24uZ2V0TnVtYmVyT2ZSZWdpb25zKCk7IGkrKykgewotCQkJCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJCQkJU3RyaW5nIHRleHQgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJCQkJYXR0ck5hbWUgPSB0ZXh0OwotCQkJCQkJCQl9Ci0JCQkJCQkJCS8vIHByb2Nlc3MgdmFsdWUKLQkJCQkJCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFICYmIGF0dHJOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJCXRleHQgPSBTdHJpbmdVdGlscy5zdHJpcCh0ZXh0KTsKLQkJCQkJCQkJCWlmIChKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfRklMRS5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJSVBhdGggZmlsZVBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LnJlc29sdmUobmV3IFBhdGgoKChDTURvY3VtZW50SW1wbCkgZWQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRCYXNlTG9jYXRpb24oKSksIHRleHQpOwotCi0JCQkJCQkJCQkJSUZpbGUgaW5jbHVkZWRGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJCQkJCQkJCQlpZiAoaW5jbHVkZWRGaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQkJCQkJCWxvYWRUYWdGaWxlKGVkLCBpbmNsdWRlZEZpbGUsIGZhbHNlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlkb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ibGVtIHBhcnNpbmcgIiArIHRhZ0ZpbGUsIGUpOyAvLyBjYW4gYmUgY2F1c2VkIGJ5IGEgc3RpbGwtaW4tZGV2ZWxvcG1lbnQgZmlsZQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIExvZ2dlci5sb2dFeGNlcHRpb24oInByb2JsZW0gcGFyc2luZyAiICsgdGFnRmlsZSwgZSk7IC8vIGZyZXF1ZW50bHkgb3V0IG9mIHN5bmMKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChJVGFnbGliUmVjb3JkIHJlZmVyZW5jZSkgewotCQlDTURvY3VtZW50SW1wbCBkb2N1bWVudCA9IG51bGw7Ci0JCXN3aXRjaCAocmVmZXJlbmNlLmdldFJlY29yZFR5cGUoKSkgewotCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5UTEQpIDogewotCQkJCUlUTERSZWNvcmQgcmVjb3JkID0gKElUTERSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQlJUmVzb3VyY2UgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShyZWNvcmQuZ2V0UGF0aCgpKTsKLQkJCQlpZiAoZmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZG9jdW1lbnQgPSAoQ01Eb2N1bWVudEltcGwpIGJ1aWxkQ01Eb2N1bWVudEZyb21GaWxlKGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCQkJZG9jdW1lbnQuc2V0TG9jYXRpb25TdHJpbmcocmVjb3JkLmdldFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQkJaWYgKF9kZWJ1ZyAmJiBkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmdldEVsZW1lbnRzKCkuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJmYWlsdXJlIHBhcnNpbmcgIiArIHJlY29yZC5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCQlpZiAoZG9jdW1lbnQuZ2V0U21hbGxJY29uKCkgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGljb25QYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZSgoKFRMRERvY3VtZW50KSBkb2N1bWVudCkuZ2V0U21hbGxJY29uKCksIGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlkb2N1bWVudC5zZXRQcm9wZXJ0eShKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04sICJmaWxlOiIgKyBpY29uUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoZG9jdW1lbnQuZ2V0TGFyZ2VJY29uKCkgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGljb25QYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZSgoKFRMRERvY3VtZW50KSBkb2N1bWVudCkuZ2V0TGFyZ2VJY29uKCksIGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlkb2N1bWVudC5zZXRQcm9wZXJ0eShKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04sICJmaWxlOiIgKyBpY29uUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuSkFSKSA6IHsKLQkJCQlJSmFyUmVjb3JkIHJlY29yZCA9IChJSmFyUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJZG9jdW1lbnQgPSAoQ01Eb2N1bWVudEltcGwpIGJ1aWxkQ01Eb2N1bWVudEZyb21KYXIocmVjb3JkLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQkJZG9jdW1lbnQuc2V0TG9jYXRpb25TdHJpbmcoImphcjpmaWxlOiIgKyByZWNvcmQuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpICsgIiEvTUVUQS1JTkYvdGFnbGliLnRsZCIpOwotCQkJCWlmIChkb2N1bWVudC5nZXRTbWFsbEljb24oKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBpY29uUGF0aCA9IFVSSUhlbHBlci5ub3JtYWxpemUoKChUTEREb2N1bWVudCkgZG9jdW1lbnQpLmdldFNtYWxsSWNvbigpLCByZWNvcmQuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpICsgIiEvTUVUQS1JTkYvIiwgIi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWRvY3VtZW50LnNldFByb3BlcnR5KEpTUDEyVExETmFtZXMuU01BTExfSUNPTiwgImphcjpmaWxlOiIgKyBpY29uUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKGRvY3VtZW50LmdldExhcmdlSWNvbigpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGljb25QYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZSgoKFRMRERvY3VtZW50KSBkb2N1bWVudCkuZ2V0TGFyZ2VJY29uKCksIHJlY29yZC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiIS9NRVRBLUlORi8iLCAiLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJZG9jdW1lbnQuc2V0UHJvcGVydHkoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OLCAiamFyOmZpbGU6IiArIGljb25QYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoX2RlYnVnICYmIGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZmFpbHVyZSBwYXJzaW5nICIgKyByZWNvcmQuZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlRBR0RJUikgOiB7Ci0JCQkJSVRhZ0RpclJlY29yZCByZWNvcmQgPSAoSVRhZ0RpclJlY29yZCkgcmVmZXJlbmNlOwotCQkJCWRvY3VtZW50ID0gYnVpbGRDTURvY3VtZW50RnJvbUZvbGRlcihyZWNvcmQuZ2V0UGF0aCgpKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVVJMKSA6IHsKLQkJCQlJVVJMUmVjb3JkIHJlY29yZCA9IChJVVJMUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJVVJMIHVybCA9IHJlY29yZC5nZXRVUkwoKTsKLQkJCQlJbnB1dFN0cmVhbSB1cmxDb250ZW50cyA9IEphclV0aWxpdGllcy5nZXRJbnB1dFN0cmVhbSh1cmwpOwotCQkJCWlmICh1cmxDb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCWRvY3VtZW50ID0gKENNRG9jdW1lbnRJbXBsKSBidWlsZENNRG9jdW1lbnQocmVjb3JkLmdldEJhc2VMb2NhdGlvbigpLCB1cmxDb250ZW50cyk7Ci0JCQkJCVN0cmluZyB1cmxTdHJpbmcgPSB1cmwudG9TdHJpbmcoKTsKLQkJCQkJZG9jdW1lbnQuc2V0TG9jYXRpb25TdHJpbmcodXJsU3RyaW5nKTsKLQkJCQkJaWYgKGRvY3VtZW50LmdldFNtYWxsSWNvbigpICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBpY29uUGF0aCA9IFVSSUhlbHBlci5ub3JtYWxpemUoKChUTEREb2N1bWVudCkgZG9jdW1lbnQpLmdldFNtYWxsSWNvbigpLCB1cmxTdHJpbmcsICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWRvY3VtZW50LnNldFByb3BlcnR5KEpTUDEyVExETmFtZXMuU01BTExfSUNPTiwgaWNvblBhdGgpOwotCQkJCQl9Ci0JCQkJCWlmIChkb2N1bWVudC5nZXRMYXJnZUljb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRMYXJnZUljb24oKSwgdXJsU3RyaW5nLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlkb2N1bWVudC5zZXRQcm9wZXJ0eShKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04sIGljb25QYXRoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodXJsQ29udGVudHMgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJdXJsQ29udGVudHMuY2xvc2UoKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Eb2N1bWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURvY3VtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzY2ODRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTEREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbnRlbnRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb24uQW5ub3RhdGlvbkZpbGVQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50SW1wbCBpbXBsZW1lbnRzIFRMRERvY3VtZW50IHsKLQkKLQkvKiogQ29udGFpbnMgdGFnaW5mbyBhbmQvb3IgYW55IG90aGVyIG1pc2MgcHJvcGVydGllcyovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uTWFwIGZBbm5vdGF0aW9uTWFwID0gbnVsbDsKLQkKLQlwcml2YXRlIE1hcCBmUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKDApOwotCi0JLyoqCi0JICogUmVjb3JkcyBmcm9tIHdoZXJlIHRoaXMgZG9jdW1lbnQgd2FzIGNyZWF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmQmFzZUxvY2F0aW9uOwotCS8qKiAKLQkgKiBzaW5jZSBKU1AgMS4yCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uOwotCQotCXByaXZhdGUgU3RyaW5nIGZEaXNwbGF5TmFtZTsKLQotCS8qKgotCSAqIE5PVCBwdWJsaWMgQVBJCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCBmRWxlbWVudHMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQlwcml2YXRlIExpc3QgZkZ1bmN0aW9ucyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCi0JLy8gaWQgb2YgdGhlIHRhZ2xpYgotCXByaXZhdGUgU3RyaW5nIGZJZCA9IG51bGw7Ci0JLyoqCi0JICogQ2hpbGRyZW4gb2YgInRhZ2xpYiIgd2l0aGluIGEgLnRsZCBmaWxlIGVhY2ggYWxsb3cKLQkgKiBvbmUgVGV4dCBub2RlICgjUENEQVRBKSBiZW5lYXRoIHRoZW0uICBTdG9yZSB0aGUgdmFsdWVzCi0JICogaGVyZSBmb3Igc2ltcGxpY2l0eS4KLQkgKi8KLQkvLyBUaGUgSlNQIHNwZWNpZmljYXRpb24gcmVxdWlyZWQgZm9yIHRoaXMgdGFnbGliIHRvIGZ1bmN0aW9uCi0JcHJpdmF0ZSBTdHJpbmcgZkpTUFZlcnNpb24gPSBudWxsOwotCQotCXByaXZhdGUgU3RyaW5nIGZMYXJnZUljb247Ci0KLQlwcml2YXRlIExpc3QgZkxpc3RlbmVyczsKLQkKLQlwcml2YXRlIFN0cmluZyBmUGFyZW50VVJJID0gbnVsbDsKLQkvLyBBIHNob3J0IG5hbWUgc3VnZ2VzdGVkIGFzIHRoZSBkZWZhdWx0IHByZWZpeCBmb3IgdGFncyB3aXRoaW4gdGhlIGxpYgotCXByaXZhdGUgU3RyaW5nIGZTaG9ydE5hbWUgPSBudWxsOwotCQotCXByaXZhdGUgU3RyaW5nIGZTbWFsbEljb247Ci0JCi0JLyoqCi0JICogc2luY2UgSlNQIDIuMAotCSAqIAotCSAqIFRoZSBlbnRpcmUgZWxlbWVudCBpcyBzdG9yZWQgaGVyZSBzaW5jZSBpdHMgbGF5b3V0IGlzIHVuZGVmaW5lZCAKLQkgKi8KLQlwcml2YXRlIExpc3QgZlRhZ2xpYkV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQotCS8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHRoZSB0YWdsaWIgaXRzZWxmCi0JcHJpdmF0ZSBTdHJpbmcgZlRMaWJWZXJzaW9uID0gbnVsbDsKLQkKLQkvLyBBIHVuaXF1ZSBwdWJsaWMgVVJJIGRlc2NyaWJpbmcgdGhpcyB0YWdsaWIuICBSZWNvbW1lbmRlZCB0byBiZSB0aGUgVVJMCi0JLy8gdG8gdGhlIGRlc2NyaXB0b3IKLQlwcml2YXRlIFN0cmluZyBmVVJJID0gbnVsbDsKLQkKLQlwcml2YXRlIFN0cmluZyBmTG9jYXRpb25TdHJpbmc7Ci0KLQlwcm90ZWN0ZWQgVExEVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQkKLQkvKioKLQkgKiBDTURvY3VtZW50SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGFubm90YXRpb24gbWFwIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiAgTGF6aWx5IGNyZWF0ZXMKLQkgKiBhbmQgbG9hZHMgYW5ub3RhdGlvbiBtYXAuCi0JICogQHJldHVybiBBbm5vdGF0aW9uTWFwCi0JICovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uTWFwIGdldEFubm90YXRpb25NYXAoKSB7Ci0JCS8vIGNyZWF0ZSBhIG5ldyBhbm5vdGF0aW9uIG1hcCBhbmQgbG9hZCBpdCB1cAotCQlpZiAoZkFubm90YXRpb25NYXAgPT0gbnVsbCkgewotCQkJZkFubm90YXRpb25NYXAgPSBuZXcgQW5ub3RhdGlvbk1hcCgpOwotCQkJCi0JCQlMaXN0IGFubm90YXRpb25GaWxlcyA9IENvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uRmlsZXNJbmZvcyhnZXRVcmkoKSk7Ci0JCSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhbm5vdGF0aW9uRmlsZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCSAgICAJdHJ5IHsKLQkJICAgIAkJQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvID0gKEFubm90YXRpb25GaWxlSW5mbykgaS5uZXh0KCk7Ci0JCSAgICAJCUFubm90YXRpb25GaWxlUGFyc2VyIHBhcnNlciA9IG5ldyBBbm5vdGF0aW9uRmlsZVBhcnNlcigpOwotCQkgICAgCQlwYXJzZXIucGFyc2UoZkFubm90YXRpb25NYXAsIGZpbGVJbmZvKTsKLQkJICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkgICAgICAgIAlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiRXhjZXB0aW9uIHRocm93biBpbiBDTURvY3VtZW50SW1wbCNnZXRBbm5vdGF0aW9uTWFwIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJICAgICAgICB9Ci0JCSAgICB9Ci0JCX0KLQkJcmV0dXJuIGZBbm5vdGF0aW9uTWFwOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGJhc2VMb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGZCYXNlTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVzY3JpcHRpb24uCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGZEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNwbGF5TmFtZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZkRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnRzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZkVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIGdldEVudGl0aWVzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRW50aXR5RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gZlRhZ2xpYkV4dGVuc2lvbnM7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZnVuY3Rpb25zLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZ1bmN0aW9ucygpIHsKLQkJcmV0dXJuIGZGdW5jdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaWQuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGZJZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7Ci0JCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SnNwdmVyc2lvbigpIHsKLQkJcmV0dXJuIGZKU1BWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxhcmdlSWNvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbigpIHsKLQkJcmV0dXJuIGZMYXJnZUljb247Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAoZkxpc3RlbmVycyA9PSBudWxsKQotCQkJZkxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGZMaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZXNwYWNlIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lc3BhY2UKLQkgKi8KLQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiNjbWRvY3VtZW50IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICoKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRPQ1VNRU5UOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmVudFVSSS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudFVSSSgpIHsKLQkJcmV0dXJuIGZQYXJlbnRVUkk7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFRMRERvY3VtZW50LkNNX0tJTkQpKSB7Ci0JCQlyZXR1cm4gVExERG9jdW1lbnQuSlNQX1RMRDsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJhbm5vdGF0aW9uTWFwIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGdldEFubm90YXRpb25NYXAoKTsKLQkJfQotCQlyZXR1cm4gZlByb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydG5hbWUoKSB7Ci0JCXJldHVybiBmU2hvcnROYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNtYWxsSWNvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbigpIHsKLQkJcmV0dXJuIGZTbWFsbEljb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUbGlidmVyc2lvbigpIHsKLQkJcmV0dXJuIGZUTGliVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKLQkJcmV0dXJuIGZVUkk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFRMRERvY3VtZW50I2dldFZhbGlkYXRvcigpCi0JICovCi0JcHVibGljIFRMRFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBiYXNlTG9jYXRpb24gVGhlIGJhc2VMb2NhdGlvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFzZUxvY2F0aW9uKFN0cmluZyBiYXNlTG9jYXRpb24pIHsKLQkJZkJhc2VMb2NhdGlvbiA9IGJhc2VMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmZEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRpc3BsYXlOYW1lLgotCSAqIEBwYXJhbSBkaXNwbGF5TmFtZSBUaGUgZGlzcGxheU5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIGRpc3BsYXlOYW1lKSB7Ci0JCXRoaXMuZkRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaWQuCi0JICogQHBhcmFtIGlkIFRoZSBpZCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJdGhpcy5mSWQgPSBpZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SW5mbyBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5mbyhTdHJpbmcgbmV3SW5mbykgewotCQlzZXREZXNjcmlwdGlvbihuZXdJbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SnNwdmVyc2lvbiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SnNwdmVyc2lvbihTdHJpbmcgbmV3SnNwdmVyc2lvbikgewotCQlmSlNQVmVyc2lvbiA9IG5ld0pzcHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFyZ2VJY29uLgotCSAqIEBwYXJhbSBsYXJnZUljb24gVGhlIGxhcmdlSWNvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXJnZUljb24oU3RyaW5nIGxhcmdlSWNvbikgewotCQl0aGlzLmZMYXJnZUljb24gPSBsYXJnZUljb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXJzKExpc3QgbGlzdGVuZXJzKSB7Ci0JCXRoaXMuZkxpc3RlbmVycyA9IGxpc3RlbmVyczsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHBhcmVudFVSSSBUaGUgcGFyZW50VVJJIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRVUkkoU3RyaW5nIHBhcmVudFVSSSkgewotCQlmUGFyZW50VVJJID0gcGFyZW50VVJJOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotCQlmUHJvcGVydGllcy5wdXQocHJvcGVydHksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U2hvcnRuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG9ydG5hbWUoU3RyaW5nIG5ld1Nob3J0bmFtZSkgewotCQlmU2hvcnROYW1lID0gbmV3U2hvcnRuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNtYWxsSWNvbi4KLQkgKiBAcGFyYW0gc21hbGxJY29uIFRoZSBzbWFsbEljb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U21hbGxJY29uKFN0cmluZyBzbWFsbEljb24pIHsKLQkJdGhpcy5mU21hbGxJY29uID0gc21hbGxJY29uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdUbGlidmVyc2lvbiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGxpYnZlcnNpb24oU3RyaW5nIG5ld1RsaWJ2ZXJzaW9uKSB7Ci0JCWZUTGliVmVyc2lvbiA9IG5ld1RsaWJ2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdVcmkgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgbmV3VXJpKSB7Ci0JCWZVUkkgPSBuZXdVcmk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKFRMRFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogQHJldHVybiBib29sZWFuCi0JICoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIENNTm9kZSBzdXBwb3J0cyBhIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoVExERG9jdW1lbnQuQ01fS0lORC5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCAiYW5ub3RhdGlvbk1hcCIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZlByb3BlcnRpZXMuY29udGFpbnNLZXkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IHNob3J0IG5hbWU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRTaG9ydG5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgZGlzcGxheSBuYW1lOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0RGlzcGxheU5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgZGVzY3JpcHRpb24gKGluZm8pOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0RGVzY3JpcHRpb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgVVJJOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VXJpKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IGpzcCB2ZXJzaW9uOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0SnNwdmVyc2lvbigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCB0YWdsaWIgdmVyc2lvbjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFRsaWJ2ZXJzaW9uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHNtYWxsIGljb246IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRTbWFsbEljb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgbGFyZ2UgaWNvbjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldExhcmdlSWNvbigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGdldFZhbGlkYXRvcigpICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKCJcblx0IHZhbGlkYXRvcjoiICsgU3RyaW5nVXRpbHMucmVwbGFjZShnZXRWYWxpZGF0b3IoKS50b1N0cmluZygpLCAiXG4iLCAiXG5cdFx0IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IGxpc3RlbmVyczoiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldExpc3RlbmVycygpLnNpemUoKTsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIgKyBTdHJpbmdVdGlscy5yZXBsYWNlKGdldExpc3RlbmVycygpLmdldChpKS50b1N0cmluZygpLCAiXG4iLCAiXG5cdFx0IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgZWxlbWVudHM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBnZXRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoU3RyaW5nVXRpbHMucmVwbGFjZShlbGVtZW50cy5pdGVtKGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uU3RyaW5nKCkgewotCQlyZXR1cm4gZkxvY2F0aW9uU3RyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uU3RyaW5nKFN0cmluZyB1cmwpIHsKLQkJZkxvY2F0aW9uU3RyaW5nID0gdXJsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUVsZW1lbnREZWNsYXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUVsZW1lbnREZWNsYXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk4NGZiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMVRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci0KLXB1YmxpYyBjbGFzcyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgaW1wbGVtZW50cyBUTERFbGVtZW50RGVjbGFyYXRpb24gewotCi0JLy8gb3B0aW9uYWwgYXR0cmlidXRlcwotCUNNTmFtZWROb2RlTWFwSW1wbCBmQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkvLyAoZW1wdHl8SlNQfHRhZ2RlcGVuZGFudHxzY3JpcHRsZXNzKSAtIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBKU1AKLQlwcml2YXRlIFN0cmluZyBib2R5Y29udGVudCA9IEpTUDExVExETmFtZXMuQ09OVEVOVF9KU1A7Ci0KLQkvKioKLQkgKiBzaW5jZSBKU1AgMS4yCi0JICogCi0JICogVXNhZ2UgaW5mb3JtYXRpb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIHNpbmNlIEpTUCAxLjIKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkaXNwbGF5TmFtZTsKLQotCXByaXZhdGUgQ01Eb2N1bWVudCBmT3duZXJEb2N1bWVudDsKLQotCXByaXZhdGUgU3RyaW5nIGZQYXRoID0gbnVsbDsKLQotCXByaXZhdGUgTGlzdCBmVGFnRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JLyoqCi0JICogc2luY2UgSlNQIDEuMgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGxhcmdlSWNvbjsKLQotCi0JcHJpdmF0ZSBpbnQgbWF4T2NjdXIgPSAtMTsKLQlwcml2YXRlIGludCBtaW5PY2N1ciA9IDA7Ci0KLQkvLyByZXF1aXJlZCB0YWcgbmFtZQotCXByaXZhdGUgU3RyaW5nIG5vZGVOYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIHNpbmNlIEpTUCAxLjIKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBzbWFsbEljb247Ci0KLQkvLyB0YWcgaGFuZGxlciBjbGFzcyAtIHJlcXVpcmVkCi0JcHJpdmF0ZSBTdHJpbmcgdGFnY2xhc3MgPSBudWxsOwotCi0JLy8gdGFnIGV4dHJhIGluZm8gY2xhc3MgKHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLlRhZ0V4dHJhSW5mbykgLQotCS8vIG9wdGlvbmFsCi0JcHJpdmF0ZSBTdHJpbmcgdGVpY2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogc2luY2UgSlNQIDEuMgotCSAqLwotCXByaXZhdGUgTGlzdCB2YXJpYWJsZXM7Ci0KLQkvKioKLQkgKiBzaW5jZSBKU1AgMi4wCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZkV4YW1wbGU7Ci0JcHJpdmF0ZSBTdHJpbmcgZkltcG9ydDsKLQlwcml2YXRlIFN0cmluZyBmU2NyaXB0aW5nTGFuZ3VhZ2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkR5bmFtaWNBdHRyaWJ1dGVzOwotCXByaXZhdGUgU3RyaW5nIGZJc0VMSWdub3JlZDsKLQlwcml2YXRlIFN0cmluZyBmUGFnZUVuY29kaW5nOwotCXByaXZhdGUgU3RyaW5nIGZUYWdTb3VyY2U7Ci0KLQlwcml2YXRlIFN0cmluZyBmTG9jYXRpb25TdHJpbmc7Ci0JcHJpdmF0ZSBTdHJpbmcgc21hbGxJY29uVVJMOwotCi0JLyoqCi0JICogQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uSW1wbChDTURvY3VtZW50IG93bmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZPd25lckRvY3VtZW50ID0gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICogCi0JICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBBdHRyaWJ1dGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZkF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb2R5Y29udGVudCgpIHsKLQkJcmV0dXJuIGJvZHljb250ZW50OwotCX0KLQotCS8qKgotCSAqIGdldENNQ29udGVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIENNQ29udGVudAotCSAqIAotCSAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIGVsZW1lbnQncyBjb250ZW50IG1vZGVsLiBUaGlzIGNhbiBiZSBhbgotCSAqIENNRWxlbWVudERlY2xhcmF0aW9uIG9yIGEgQ01Hcm91cAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q29udGVudFR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiAKLQkgKiBSZXR1cm5zIG9uZSBvZiA6IEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCWlmIChnZXRCb2R5Y29udGVudCgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLkNPTlRFTlRfRU1QVFkpKQotCQkJcmV0dXJuIEVNUFRZOwotCQlpZiAoZ2V0Qm9keWNvbnRlbnQoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVCkpCi0JCQlyZXR1cm4gUENEQVRBOwotCQllbHNlCi0JCQkvLyBKU1AKLQkJCXJldHVybiBBTlk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiBuZXcgQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXlOYW1lLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBkaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbGVtZW50TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4YW1wbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeGFtcGxlKCkgewotCQlyZXR1cm4gZkV4YW1wbGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBleHRlbnNpb25zLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiBmVGFnRXh0ZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7Ci0JCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxhcmdlSWNvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbigpIHsKLQkJcmV0dXJuIGxhcmdlSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMb2NhbEVsZW1lbnRzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKiAKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBsb2NhbGx5IGRlZmluZWQgZWxlbWVudHMuCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE1heE9jY3VyIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogCi0JICogSWYgLTEsIGl0J3MgVU5CT1VOREVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCXJldHVybiBtYXhPY2N1cjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNaW5PY2N1ciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIAotCSAqIElmIDAsIGl0J3MgT1BUSU9OQUwuIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0JICovCi0JcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJcmV0dXJuIG1pbk9jY3VyOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBub2RlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIAotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT047Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmT3duZXJEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gZlBhdGg7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICogCi0JICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NyaWJlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICogCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmICgidGFnSW5mbyIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGdldFRhZ0luZm8oKTsgLy8gcmV0dXJuIHRhZyBpbmZvCi0JCQkvLyBidWc4ODMzNiBubyBuZWVkIHRvIHJlc3RvcmUgbWFya2VycwotCQkJLy8gcmV0dXJuIFN0cmluZ1V0aWxzLnJlc3RvcmVNYXJrZXJzKGdldFRhZ0luZm8oKSk7IC8vIHJldHVybiB0YWcKLQkJCS8vIGRlc2NyaXB0aW9uCi0JCX0KLQkJLy8gQnVnIDE1NTgwMAotCQllbHNlIGlmICgibmFtZSIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAoImRlc2NyaXB0aW9uIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCS8vIGJ1Zzg4MzM2IG5vIG5lZWQgdG8gcmVzdG9yZSBtYXJrZXJzCi0JCQkvLyByZXR1cm4gU3RyaW5nVXRpbHMucmVzdG9yZU1hcmtlcnMoZ2V0RGVzY3JpcHRpb24oKSk7IC8vIHJldHVybgotCQkJLy8gdGFnIGRlc2NyaXB0aW9uCi0JCX0KLQkJZWxzZSBpZiAoVExERG9jdW1lbnQuQ01fS0lORC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIFRMRERvY3VtZW50LkpTUF9UTEQ7Ci0JCX0KLQkJZWxzZSBpZiAoVExERWxlbWVudERlY2xhcmF0aW9uLlRBR19TT1VSQ0UuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiAoZlRhZ1NvdXJjZSAhPSBudWxsID8gZlRhZ1NvdXJjZSA6VExERWxlbWVudERlY2xhcmF0aW9uLlNPVVJDRV9KU1BfVExEKTsKLQkJfQotCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04uZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlpZiAoc21hbGxJY29uVVJMICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc21hbGxJY29uVVJMOwotCQkJfQotCQkJcmV0dXJuIGdldE93bmVyRG9jdW1lbnQoKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCWVsc2UgaWYoVExERWxlbWVudERlY2xhcmF0aW9uLklTX0xJQlJBUllfVEFHLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNtYWxsSWNvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbigpIHsKLQkJcmV0dXJuIHNtYWxsSWNvbjsKLQl9Ci0KLQlTdHJpbmcgZ2V0U21hbGxJY29uVVJMKCkgewotCQlyZXR1cm4gc21hbGxJY29uVVJMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFhQYXRoIG9mIHRoaXMgZWxlbWVudCAoY3VycmVudGx5IGp1c3QgcmV0dXJucyB0aGUgbm9kZQotCSAqIG5hbWUpCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNwZWMoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnY2xhc3MoKSB7Ci0JCXJldHVybiB0YWdjbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHRhZ2luZm8gZm9yIHRoaXMgY3VycmVudCBlbGVtZW50Ci0JICogCi0JICogQHJldHVybiBTdHJpbmcgdGFnaW5mbyBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFnSW5mbygpIHsKLQkJaWYgKGdldE93bmVyRG9jdW1lbnQoKS5zdXBwb3J0cygiYW5ub3RhdGlvbk1hcCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUFubm90YXRpb25NYXAgbWFwID0gKEFubm90YXRpb25NYXApIGdldE93bmVyRG9jdW1lbnQoKS5nZXRQcm9wZXJ0eSgiYW5ub3RhdGlvbk1hcCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgc3BlYyA9IGdldFNwZWMoKTsKLQkJCVN0cmluZyByZXN1bHQgPSBtYXAuZ2V0UHJvcGVydHkoc3BlYywgInRhZ0luZm8iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHJlc3VsdDsKLQkJCS8vIGJ1Zzg4MzM2IG5vIG5lZWQgdG8gcmVzdG9yZSBtYXJrZXJzCi0JCQkvLyByZXR1cm4gU3RyaW5nVXRpbHMucmVzdG9yZU1hcmtlcnMocmVzdWx0KTsgLy8gcmV0dXJuIHRhZyBpbmZvCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZWljbGFzcygpIHsKLQkJcmV0dXJuIHRlaWNsYXNzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHZhcmlhYmxlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0VmFyaWFibGVzKCkgewotCQlpZiAodmFyaWFibGVzID09IG51bGwpIHsKLQkJCXZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gdmFyaWFibGVzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdCb2R5Y29udGVudAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvZHljb250ZW50KFN0cmluZyBuZXdCb2R5Y29udGVudCkgewotCQlib2R5Y29udGVudCA9IG5ld0JvZHljb250ZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgVGhlIGRlc2NyaXB0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlzcGxheU5hbWUuCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXlOYW1lCi0JICogICAgICAgICAgICBUaGUgZGlzcGxheU5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIGRpc3BsYXlOYW1lKSB7Ci0JCXRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXhhbXBsZQotCSAqICAgICAgICAgICAgVGhlIGV4YW1wbGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4YW1wbGUoU3RyaW5nIGV4YW1wbGUpIHsKLQkJZkV4YW1wbGUgPSBleGFtcGxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhcmdlSWNvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbGFyZ2VJY29uCi0JICogICAgICAgICAgICBUaGUgbGFyZ2VJY29uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhcmdlSWNvbihTdHJpbmcgbGFyZ2VJY29uKSB7Ci0JCXRoaXMubGFyZ2VJY29uID0gbGFyZ2VJY29uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGVOYW1lKFN0cmluZyBzdHJpbmcpIHsKLQkJbm9kZU5hbWUgPSBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWZQYXRoID0gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzbWFsbEljb24uCi0JICogCi0JICogQHBhcmFtIHNtYWxsSWNvbgotCSAqICAgICAgICAgICAgVGhlIHNtYWxsSWNvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIHNtYWxsSWNvbikgewotCQl0aGlzLnNtYWxsSWNvbiA9IHNtYWxsSWNvbjsKLQl9Ci0KLQl2b2lkIHNldFNtYWxsSWNvblVSTChTdHJpbmcgdXJsKSB7Ci0JCXNtYWxsSWNvblVSTCA9IHVybDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGFnY2xhc3MKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdjbGFzcyhTdHJpbmcgbmV3VGFnY2xhc3MpIHsKLQkJdGFnY2xhc3MgPSBuZXdUYWdjbGFzczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGFnY2xhc3MKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdTb3VyY2UoU3RyaW5nIHNvdXJjZUtpbmQpIHsKLQkJZlRhZ1NvdXJjZSA9IHNvdXJjZUtpbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1RlaWNsYXNzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVpY2xhc3MoU3RyaW5nIG5ld1RlaWNsYXNzKSB7Ci0JCXRlaWNsYXNzID0gbmV3VGVpY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFyaWFibGVzLgotCSAqIAotCSAqIEBwYXJhbSB2YXJpYWJsZXMKLQkgKiAgICAgICAgICAgIFRoZSB2YXJpYWJsZXMgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFibGVzKExpc3QgdmFyaWFibGVzKSB7Ci0JCXRoaXMudmFyaWFibGVzID0gdmFyaWFibGVzOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIAotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gcHJvcGVydHlOYW1lID09IG51bGwgfHwgcHJvcGVydHlOYW1lLmVxdWFscygidGFnSW5mbyIpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhUTEREb2N1bWVudC5DTV9LSU5EKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuU01BTExfSUNPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoVExERWxlbWVudERlY2xhcmF0aW9uLlRBR19TT1VSQ0UpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoVExERWxlbWVudERlY2xhcmF0aW9uLklTX0xJQlJBUllfVEFHKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0ICIgKyBzdXBlci50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IG5hbWU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXROb2RlTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCB0YWcgY2xhc3M6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRUYWdjbGFzcygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCB0ZWkgY2xhc3M6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRUZWljbGFzcygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBib2R5IGNvbnRlbnQ6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRCb2R5Y29udGVudCgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBkZXNjcmlwdGlvbiAoaW5mbyk6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXREZXNjcmlwdGlvbigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBhdHRyaWJ1dGVzOiIpOyAvLyROT04tTkxTLTEkCi0JCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJcblx0XHQiICsgU3RyaW5nVXRpbHMucmVwbGFjZShhdHRyaWJ1dGVzLml0ZW0oaSkudG9TdHJpbmcoKSwgIlxuIiwgIlxuXHRcdCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlidWZmZXIuYXBwZW5kKCJcblx0IHZhcmlhYmxlczoiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldFZhcmlhYmxlcygpLnNpemUoKTsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJcblx0XHQiICsgU3RyaW5nVXRpbHMucmVwbGFjZShnZXRWYXJpYWJsZXMoKS5nZXQoaSkudG9TdHJpbmcoKSwgIlxuIiwgIlxuXHRcdCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbXBvcnQoKSB7Ci0JCXJldHVybiBmSW1wb3J0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NyaXB0aW5nTGFuZ3VhZ2UoKSB7Ci0JCXJldHVybiBmU2NyaXB0aW5nTGFuZ3VhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREeW5hbWljQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGZEeW5hbWljQXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbXBvcnQoU3RyaW5nIGltcG9ydDEpIHsKLQkJZkltcG9ydCA9IGltcG9ydDE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NyaXB0aW5nTGFuZ3VhZ2UoU3RyaW5nIHNjcmlwdGluZ0xhbmd1YWdlKSB7Ci0JCWZTY3JpcHRpbmdMYW5ndWFnZSA9IHNjcmlwdGluZ0xhbmd1YWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldER5bmFtaWNBdHRyaWJ1dGVzKFN0cmluZyBkeW5hbWljQXR0cmlidXRlcykgewotCQlmRHluYW1pY0F0dHJpYnV0ZXMgPSBkeW5hbWljQXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElzRUxJZ25vcmVkKCkgewotCQlyZXR1cm4gZklzRUxJZ25vcmVkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUVuY29kaW5nKCkgewotCQlyZXR1cm4gZlBhZ2VFbmNvZGluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc0VMSWdub3JlZChTdHJpbmcgaXNFTElnbm9yZWQpIHsKLQkJZklzRUxJZ25vcmVkID0gaXNFTElnbm9yZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFnZUVuY29kaW5nKFN0cmluZyBwYWdlRW5jb2RpbmcpIHsKLQkJZlBhZ2VFbmNvZGluZyA9IHBhZ2VFbmNvZGluZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uU3RyaW5nKCkgewotCQlpZiAoZkxvY2F0aW9uU3RyaW5nID09IG51bGwpCi0JCQlyZXR1cm4gKChDTURvY3VtZW50SW1wbCkgZk93bmVyRG9jdW1lbnQpLmdldExvY2F0aW9uU3RyaW5nKCk7Ci0JCXJldHVybiBmTG9jYXRpb25TdHJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25TdHJpbmcoU3RyaW5nIHVybCkgewotCQlmTG9jYXRpb25TdHJpbmcgPSB1cmw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGYzNzhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0KLQlwdWJsaWMgc3RhdGljIENNTmFtZWROb2RlTWFwSW1wbCBFTVBUWV9OQU1FRF9OT0RFX01BUCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JLyoqCi0JICogQ01OYW1lZE5vZGVNYXBJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlIYXNodGFibGUgZ2V0SGFzaHRhYmxlKCkgewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0YWJsZS5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZWRJdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoQ01Ob2RlKSB0YWJsZS5nZXQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpbnQgc2l6ZSA9IHRhYmxlLnNpemUoKTsKLQkJaWYgKGluZGV4IDwgc2l6ZSkgewotCQkJSXRlcmF0b3IgdmFsdWVzID0gaXRlcmF0b3IoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGluZGV4OyBpKyspIHsKLQkJCQlyZXN1bHQgPSB2YWx1ZXMubmV4dCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoQ01Ob2RlKSByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogQHJldHVybgotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gYU5vZGUgQ01Ob2RlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lLCBDTU5vZGUgYU5vZGUpIHsKLQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBhTm9kZSAhPSBudWxsKQotCQkJdGFibGUucHV0KG5hbWUsIGFOb2RlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Ob2RlTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTU5vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMThjNjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTU5vZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIENNTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgQ01Ob2RlTGlzdCB7Ci0Jc3RhdGljIENNTm9kZUxpc3RJbXBsIEVNUFRZX05PREVfTElTVCA9IG5ldyBDTU5vZGVMaXN0SW1wbChDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQlwcm90ZWN0ZWQgTGlzdCBsaXN0OwotCi0JcHVibGljIENNTm9kZUxpc3RJbXBsKCkgewotCQl0aGlzKG5ldyBBcnJheUxpc3QoKSk7Ci0JfQotCi0JcHVibGljIENNTm9kZUxpc3RJbXBsKExpc3QgbGlzdCkgewotCQl0aGlzLmxpc3QgPSBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGVuZEl0ZW0oQ01Ob2RlIG5vZGUpIHsKLQkJbGlzdC5hZGQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsaXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRMaXN0KCkgewotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChDTU5vZGUpIGxpc3QuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRENNRG9jdW1lbnRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEQ01Eb2N1bWVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwMGNiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEQ01Eb2N1bWVudE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDExVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AyMFRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5EZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUuUHJvcGVydHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRmFjZXRNb2R1bGVDb3JlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5GaWxlQ29udGVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLlplcm9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JSmFyUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRMRFJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdEaXJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliSW5kZXhEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJJbmRleExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYlJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklVUkxSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5UYWdsaWJJbmRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkpTUENhcGFibGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlRhZ01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBUTERDTURvY3VtZW50TWFuYWdlciBpbXBsZW1lbnRzIElUYWdsaWJJbmRleExpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBjbGFzcyBEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGltcGxlbWVudHMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciwgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbiB7Ci0JCS8qKgotCQkgKiBBZGRzIGEgYmxvY2sgdGFnbmFtZSAoZnVsbHkgbmFtZXNwYWNlIHF1YWxpZmllZCkgaW50byB0aGUgbGlzdCBvZgotCQkgKiBibG9jayB0YWcgbmFtZXMgZm9yIHRoZSBwYXJzZXIuIFRoZSBtYXJrZXIKLQkJICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbG9uZyB3aXRoIHBvc2l0aW9uIGN1ZXMgZHVyaW5nIHJlcGFyc2VzCi0JCSAqIGFsbG93IHRoZSBYTUxTb3VyY2VQYXJzZXIgdG8gZW5hYmxlL2lnbm9yZSB0aGUgdGFncyBhcyBibG9ja3MuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBhZGRCbG9ja1RhZyhTdHJpbmcgdGFnbmFtZU5TLCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gbWFya2VyKSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZ2V0UGFyc2VyKCkuZ2V0QmxvY2tNYXJrZXIodGFnbmFtZU5TKSA9PSBudWxsKSB7Ci0JCQkJZ2V0UGFyc2VyKCkuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKHRhZ25hbWVOUywgbWFya2VyLCBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQsIHRydWUsIGZhbHNlKSk7Ci0JCQkJaWYgKF9kZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIGFkZGVkIGJsb2NrIG1hcmtlcjogIiArIHRhZ25hbWVOUyArICJAIiArIG1hcmtlci5nZXRTdGFydE9mZnNldCgpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdsaWJUcmFja2VyKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBDTURvY3VtZW50IHRsZENNRG9jdW1lbnQpIHsKLQkJCWdldFRhZ2xpYlRyYWNrZXJzKCkuYWRkKG5ldyBUYWdsaWJUcmFja2VyKHVyaSwgcHJlZml4LCB0bGRDTURvY3VtZW50LCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbmFibGVzIGEgVExEIG93bmluZyB0aGUgZ2l2ZW4gcHJlZml4IGxvYWRlZCBmcm9tIHRoZSBnaXZlbiBVUkkgYXQKLQkJICogdGhlIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi4gVGhlIGxpc3Qgb2YKLQkJICogYWRkaXRpb25hbENNRG9jdW1lbnRzIHdpbGwgY2xhaW0gdG8gbm90IGtub3cgYW55IG9mIGl0cyB0YWdzIGF0Ci0JCSAqIHBvc2l0aW9ucyBlYXJsaWVyIHRoYW4gdGhhdCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uJ3MgcG9zaXRpb24uCi0JCSAqIAotCQkgKiBGb3IgdGFnbGliIGRpcmVjdGl2ZXMsIHRoZSB0YWdsaWIgaXMgdGhlIGFuY2hvciB3aGlsZSB0YWdsaWJzCi0JCSAqIHJlZ2lzdGVyZWQgdGhyb3VnaCBpbmNsdWRlIGRpcmVjdGl2ZXMgdXNlIHRoZSBwYXJlbnQgZG9jdW1lbnQncwotCQkgKiBpbmNsdWRlIGRpcmVjdGl2ZSBhcyB0aGVpciBhbmNob3IuCi0JCSAqIAotCQkgKiBAcGFyYW0gcHJlZml4Ci0JCSAqIEBwYXJhbSB1cmkKLQkJICogQHBhcmFtIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZW5hYmxlVGFnbGliRnJvbVVSSShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJZW5hYmxlVGFncyhwcmVmaXgsIHVyaSwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCWlmIChfZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIHJlZ2lzdGVyZWQgYSB0cmFja2VyIGZvciAiICsgdXJpICsgIiB3aXRoIHByZWZpeCAiICsgcHJlZml4KTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBlbmFibGVUYWdzKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlpZiAocHJlZml4ID09IG51bGwgfHwgdXJpID09IG51bGwgfHwgYmFubmVkUHJlZml4ZXMuY29udGFpbnMocHJlZml4KSkKLQkJCQlyZXR1cm47Ci0JCQkvLyBUcnkgdG8gbG9hZCB0aGUgQ01Eb2N1bWVudCBmb3IgdGhpcyBVUkkKLQkJCUNNRG9jdW1lbnQgdGxkID0gZ2V0Q01Eb2N1bWVudCh1cmkpOwotCQkJaWYgKHRsZCA9PSBudWxsIHx8ICEodGxkIGluc3RhbmNlb2YgVExERG9jdW1lbnQpKSB7Ci0JCQkJaWYgKF9kZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIGZhaWxlZCB0byBjcmVhdGUgYSBDTURvY3VtZW50IGZvciAiICsgdXJpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlyZWdpc3RlclRhZ2xpYihwcmVmaXgsIHVyaSwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCB0bGQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuYWJsZXMgYSBUTEQgb3duaW5nIHRoZSBnaXZlbiBwcmVmaXggbG9hZGVkIGZyb20gdGhlIGdpdmVuIFVSSSBhdAotCQkgKiB0aGUgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLiBUaGUgbGlzdCBvZgotCQkgKiBhZGRpdGlvbmFsQ01Eb2N1bWVudHMgd2lsbCBjbGFpbSB0byBub3Qga25vdyBhbnkgb2YgaXRzIHRhZ3MgYXQKLQkJICogcG9zaXRpb25zIGVhcmxpZXIgdGhhbiB0aGF0IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ncyBwb3NpdGlvbi4KLQkJICogCi0JCSAqIEZvciB0YWdsaWIgZGlyZWN0aXZlcywgdGhlIHRhZ2xpYiBpcyB0aGUgYW5jaG9yIHdoaWxlIHRhZ2xpYnMKLQkJICogcmVnaXN0ZXJlZCB0aHJvdWdoIGluY2x1ZGUgZGlyZWN0aXZlcyB1c2UgdGhlIHBhcmVudCBkb2N1bWVudCdzCi0JCSAqIGluY2x1ZGUgZGlyZWN0aXZlIGFzIHRoZWlyIGFuY2hvci4KLQkJICogCi0JCSAqIEBwYXJhbSBwcmVmaXgKLQkJICogQHBhcmFtIHVyaQotCQkgKiBAcGFyYW0gdGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVUYWdzSW5EaXIoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHRhZ2RpciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCWVuYWJsZVRhZ3MocHJlZml4LCB0YWdkaXIsIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQlpZiAoX2RlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50TWFuYWdlciByZWdpc3RlcmVkIGEgdHJhY2tlciBmb3IgZGlyZWN0b3J5IiArIHRhZ2RpciArICIgd2l0aCBwcmVmaXggIiArIHByZWZpeCk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NSZWdpb25Db2xsZWN0aW9uKElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb25Db2xsZWN0aW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgWE1MU291cmNlUGFyc2VyIHRleHRTb3VyY2UpIHsKLQkJCS8qCi0JCQkgKiBXb3VsZCB0ZXN0ID4gMSwgYnV0IHNpbmNlIHdlIG9ubHkgY2FyZSBpZiB0aGVyZSBhcmUgOCAoPCVALAotCQkJICogdGFnbGliLCB1cmksID0sIHdoZXJlLCBwcmVmaXgsID0sIHdoYXQpIFtvciA0IGZvciBpbmNsdWRlCi0JCQkgKiBkaXJlY3RpdmVzXQotCQkJICovCi0JCQlpZiAocmVnaW9uQ29sbGVjdGlvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDQgJiYgcmVnaW9uQ29sbGVjdGlvbi5nZXRSZWdpb25zKCkuZ2V0KDEpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lID0gcmVnaW9uQ29sbGVjdGlvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCWJvb2xlYW4gdGFnbGliRGV0ZWN0ZWQgPSBmYWxzZTsKLQkJCQlib29sZWFuIHRhZ2xpYkRpcmVjdGl2ZURldGVjdGVkID0gZmFsc2U7Ci0JCQkJYm9vbGVhbiBpbmNsdWRlRGV0ZWN0ZWQgPSBmYWxzZTsKLQkJCQlib29sZWFuIGluY2x1ZGVEaXJlY3RpdmVEZXRlY3RlZCA9IGZhbHNlOwotCQkJCWludCBzdGFydE9mZnNldCA9IHJlZ2lvbkNvbGxlY3Rpb24uZ2V0U3RhcnRPZmZzZXQobmFtZSk7Ci0JCQkJaW50IHRleHRMZW5ndGggPSBuYW1lLmdldFRleHRMZW5ndGgoKTsKLQotCQkJCXRhZ2xpYkRldGVjdGVkID0gdGV4dFNvdXJjZS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMlRMRE5hbWVzLlRBR0xJQik7Ci0JCQkJaWYgKCF0YWdsaWJEZXRlY3RlZCkKLQkJCQkJdGFnbGliRGlyZWN0aXZlRGV0ZWN0ZWQgPSB0ZXh0U291cmNlLnJlZ2lvbk1hdGNoZXMoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgsIEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpOwotCQkJCWlmICghdGFnbGliRGlyZWN0aXZlRGV0ZWN0ZWQpCi0JCQkJCWluY2x1ZGVEZXRlY3RlZCA9IHRleHRTb3VyY2UucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMTJUTEROYW1lcy5JTkNMVURFKTsKLQkJCQlpZiAoIWluY2x1ZGVEZXRlY3RlZCkKLQkJCQkJaW5jbHVkZURpcmVjdGl2ZURldGVjdGVkID0gdGV4dFNvdXJjZS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfSU5DTFVERSk7Ci0JCQkJaWYgKHRhZ2xpYkRldGVjdGVkIHx8IHRhZ2xpYkRpcmVjdGl2ZURldGVjdGVkKSB7Ci0JCQkJCXByb2Nlc3NUYWdsaWIocmVnaW9uQ29sbGVjdGlvbiwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCB0ZXh0U291cmNlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaW5jbHVkZURldGVjdGVkIHx8IGluY2x1ZGVEaXJlY3RpdmVEZXRlY3RlZCkgewotCQkJCQlwcm9jZXNzSW5jbHVkZShyZWdpb25Db2xsZWN0aW9uLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHRleHRTb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvbkNvbGxlY3Rpb24uZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiAxICYmIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOLmVxdWFscyhyZWdpb25Db2xsZWN0aW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpKSkgewotCQkJCXByb2Nlc3NYTUxTdGFydFRhZyhyZWdpb25Db2xsZWN0aW9uLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHRleHRTb3VyY2UpOwotCQkJfQkJCQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJaWYgKCFwcmVsdWRlc0hhbmRsZWQpIHsKLQkJCQloYW5kbGVQcmVsdWRlcygpOwotCQkJCXByZWx1ZGVzSGFuZGxlZCA9IHRydWU7Ci0JCQl9Ci0JCQlwcm9jZXNzUmVnaW9uQ29sbGVjdGlvbihzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZ2V0UGFyc2VyKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFByb2Nlc3MgYW4gaW5jbHVkZSBkaXJlY3RpdmUgZm91bmQgYnkgdGhlIHRleHRTb3VyY2UgcGFyc2VyIGFuZAotCQkgKiBhbmNob3IgYW55IHRhZ2xpYnMgZm91bmQgd2l0aGluIGF0IHRoZQotCQkgKiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uIEluY2x1ZGVzIHVzZSB0aGUgaW5jbHVkaW5nIGZpbGUgYXMKLQkJICogdGhlIHBvaW50IG9mIHJlZmVyZW5jZSwgbm90IG5lY2Vzc2FyaWx5IHRoZSAidG9wIiBmaWxlLgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0luY2x1ZGUoSVRleHRSZWdpb25Db2xsZWN0aW9uIGluY2x1ZGVEaXJlY3RpdmVDb2xsZWN0aW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgWE1MU291cmNlUGFyc2VyIHRleHRTb3VyY2UpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gaW5jbHVkZURpcmVjdGl2ZUNvbGxlY3Rpb24uZ2V0UmVnaW9ucygpOwotCQkJU3RyaW5nIGluY2x1ZGVkRmlsZSA9IG51bGw7Ci0JCQlib29sZWFuIGlzRmlsZW5hbWUgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDI7IGluY2x1ZGVkRmlsZSA9PSBudWxsICYmIGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCWlmICh0ZXh0U291cmNlLnJlZ2lvbk1hdGNoZXMoaW5jbHVkZURpcmVjdGl2ZUNvbGxlY3Rpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSwgSlNQMTJUTEROYW1lcy5GSUxFKSkgewotCQkJCQkJCWlzRmlsZW5hbWUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJaXNGaWxlbmFtZSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzRmlsZW5hbWUgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlpbmNsdWRlZEZpbGUgPSB0ZXh0U291cmNlLmdldFRleHQoaW5jbHVkZURpcmVjdGl2ZUNvbGxlY3Rpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCQlpc0ZpbGVuYW1lID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzaW9vYkV4YykgewotCQkJCS8vIG5vdGhpbmcgdG8gYmUgZG9uZQotCQkJCWluY2x1ZGVkRmlsZSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmIChmUHJvY2Vzc0luY2x1ZGVzICYmIGluY2x1ZGVkRmlsZSAhPSBudWxsKSB7Ci0JCQkJLy8gc3RyaXAgYW55IGV4dHJhbmVvdXMgcXVvdGVzIGFuZCB3aGl0ZSBzcGFjZQotCQkJCWluY2x1ZGVkRmlsZSA9IFN0cmluZ1V0aWxzLnN0cmlwKGluY2x1ZGVkRmlsZSkudHJpbSgpOwotCQkJCUlQYXRoIGZpbGVQYXRoID0gbnVsbDsKLQkJCQkvKgotCQkJCSAqIFRoZSByZXNvbHV0aW9uIG9mIHRoZSBpbmNsdWRlZCBmcmFnbWVudCBzaG91bGQgdXNlIHRoZSBmaWxlCi0JCQkJICogY29udGFpbmluZyB0aGUgZGlyZWN0aXZlIGFzIHRoZSBiYXNlIHJlZmVyZW5jZSwgbm90IGFsd2F5cwotCQkJCSAqIHRoZSBtYWluIEpTUCBiZWluZyBpbnZva2VkLiBWZXJpZmllZCBiZWhhdmlvciB3aXRoIEFwYWNoZQotCQkJCSAqIFRvbWNhdCA1LjUuMjAuCi0JCQkJICovCi0JCQkJSVBhdGggbW9kZWxCYXNlTG9jYXRpb24gPSBUYWdsaWJDb250cm9sbGVyLmdldExvY2F0aW9uKFRMRENNRG9jdW1lbnRNYW5hZ2VyLnRoaXMpOwotCQkJCWlmKG1vZGVsQmFzZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKGdldEluY2x1ZGVzKCkuaXNFbXB0eSgpKQotCQkJCQkJZmlsZVBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LnJlc29sdmUobW9kZWxCYXNlTG9jYXRpb24sIGluY2x1ZGVkRmlsZSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWZpbGVQYXRoID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5yZXNvbHZlKChJUGF0aCkgZ2V0SW5jbHVkZXMoKS5wZWVrKCksIGluY2x1ZGVkRmlsZSk7Ci0JCQkJfQotCi0JCQkJLy8gY2hlY2sgZm9yICJsb29wcyIKLQkJCQlpZiAoZmlsZVBhdGggIT0gbnVsbCAmJiAhZ2V0SW5jbHVkZXMoKS5jb250YWlucyhmaWxlUGF0aCkgJiYgIWZpbGVQYXRoLmVxdWFscyhtb2RlbEJhc2VMb2NhdGlvbikpIHsKLQkJCQkJLyoKLQkJCQkJICogUHJldmVudCBzbG93IHBlcmZvcm1hbmNlIHdoZW4gZWRpdGluZyBzY3JpcHRsZXQgcGFydCBvZgotCQkJCQkgKiB0aGUgSlNQIGJ5IG9ubHkgcHJvY2Vzc2luZyBpbmNsdWRlcyBpZiB0aGV5J3ZlIGJlZW4KLQkJCQkJICogbW9kaWZpZWQuIFRoZSBJbmNsdWRlSGVscGVyIHJlbWVtYmVycyBhbnkgQ01Eb2N1bWVudHMKLQkJCQkJICogY3JlYXRlZCBmcm9tIHRoZSBmaWxlcyBpdCBwYXJzZXMuIENhY2hpbmcgdGhlIFVSSSBhbmQKLQkJCQkJICogcHJlZml4L3RhZ2RpciBhbGxvd3MgdXMgdG8ganVzdCBlbmFibGUgdGhlIENNRG9jdW1lbnQKLQkJCQkJICogd2hlbiB0aGUgcHJldmlvdXNseSBwYXJzZWQgZmlsZXMuCi0JCQkJCSAqIAotCQkJCQkgKiBSRU1BSU5JTkcgUFJPQkxFTTogZlRMRENNUmVmZXJlbmNlc01hcCBkb2VzIG5vdCBtYXAKLQkJCQkJICogZnJvbSBhIGZyYWdtZW50J3MgcGF0aCBhbmQgYWxzbyBpbmNsdWRlIGFsbCBvZiB0aGUgQ00KLQkJCQkJICogcmVmZXJlbmNlcyBpbiBmcmFnbWVudHMgdGhhdCAqaXQqIGluY2x1ZGVzLiBUaGUKLQkJCQkJICogZnJhZ21lbnRzIHRoYXQgaXQgaW5jbHVkZXMgd29uJ3QgaGF2ZSBpdHMgQ00gcmVmZXJlbmNlcwotCQkJCQkgKiBsb2FkZWQsIGJ1dCB0aGVuIHdlJ2QgbmVlZCB0byByZWNvcmQgdGhlIFVSSSBhbmQKLQkJCQkJICogbG9jYXRpb24gb2YgdGhlIGluY2x1ZGVkIGZyYWdtZW50IHRvIHJlc29sdmUgdGhlbQotCQkJCQkgKiBjb3JyZWN0bHksIG1vZGlmeWluZyBlbmFibGVUYWdsaWIoKSB0byBhbHNvIHRha2UgYSBiYXNlCi0JCQkJCSAqIHBhdGggYW5kIHJlc29sdmUgdGhlIFVSSSBhcHByb3ByaWF0ZWx5LgotCQkJCQkgKi8KLQkJCQkJaWYgKGhhc0FueUluY2x1ZGVCZWVuTW9kaWZpZWQoZmlsZVBhdGgpKSB7Ci0JCQkJCQlnZXRJbmNsdWRlcygpLnB1c2goZmlsZVBhdGgpOwotCi0JCQkJCQlJbmNsdWRlSGVscGVyIGluY2x1ZGVIZWxwZXIgPSBuZXcgSW5jbHVkZUhlbHBlcihhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGdldFBhcnNlcigpKTsKLQkJCQkJCWluY2x1ZGVIZWxwZXIucGFyc2UoZmlsZVBhdGgpOwotCQkJCQkJTGlzdCByZWZlcmVuY2VzID0gaW5jbHVkZUhlbHBlci50YWdsaWJSZWZlcmVuY2VzOwotCQkJCQkJZlRMRENNUmVmZXJlbmNlc01hcC5wdXQoZmlsZVBhdGgsIHJlZmVyZW5jZXMpOwotCQkJCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSlNQQ2FwYWJsZVBhcnNlcikgewotCQkJCQkJCWZvciAoaW50IGkgPSAwOyByZWZlcmVuY2VzICE9IG51bGwgJiYgaSA8IHJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQkJVExEQ01Eb2N1bWVudFJlZmVyZW5jZSByZWZlcmVuY2UgPSAoVExEQ01Eb2N1bWVudFJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQkJCQkJCSgoSlNQQ2FwYWJsZVBhcnNlcikgZ2V0UGFyc2VyKCkpLmFkZE5lc3RhYmxlUHJlZml4KG5ldyBUYWdNYXJrZXIocmVmZXJlbmNlLnByZWZpeCArICI6IikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLyoKLQkJCQkJCSAqIFRPRE86IHdhbGsgdXAgdGhlIGluY2x1ZGUgaGllcmFyY2h5IGFuZCBhZGQKLQkJCQkJCSAqIHRoZXNlIHJlZmVyZW5jZXMgdG8gZWFjaCBvZiB0aGUgcGFyZW50cz8KLQkJCQkJCSAqLwotCi0JCQkJCQlnZXRJbmNsdWRlcygpLnBvcCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gQWRkIGZyb20gdGhhdCBzYXZlZCBsaXN0IG9mIHVyaXMvcHJlZml4ZXMvZG9jdW1lbnRzCi0JCQkJCQlMaXN0IHJlZmVyZW5jZXMgPSAoTGlzdCkgZlRMRENNUmVmZXJlbmNlc01hcC5nZXQoZmlsZVBhdGgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IHJlZmVyZW5jZXMgIT0gbnVsbCAmJiBpIDwgcmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotCQkJCQkJCVRMRENNRG9jdW1lbnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gKFRMRENNRG9jdW1lbnRSZWZlcmVuY2UpIHJlZmVyZW5jZXMuZ2V0KGkpOwotCQkJCQkJCS8qCi0JCQkJCQkJICogVGhlIHVyaSBtaWdodCBub3QgYmUgcmVzb2x2ZWQgcHJvcGVybHkgaWYKLQkJCQkJCQkgKiByZWxhdGl2ZSB0byB0aGUgSlNQIGZyYWdtZW50LgotCQkJCQkJCSAqLwotCQkJCQkJCWVuYWJsZVRhZ2xpYkZyb21VUkkocmVmZXJlbmNlLnByZWZpeCwgcmVmZXJlbmNlLnVyaSwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBKU1BDYXBhYmxlUGFyc2VyKSB7Ci0JCQkJCQkJCSgoSlNQQ2FwYWJsZVBhcnNlcikgZ2V0UGFyc2VyKCkpLmFkZE5lc3RhYmxlUHJlZml4KG5ldyBUYWdNYXJrZXIocmVmZXJlbmNlLnByZWZpeCArICI6IikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGdldEluY2x1ZGVzKCkuY29udGFpbnMoZmlsZVBhdGgpKSB7Ci0JCQkJCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTE9PUCBJTiBASU5DTFVERVMgRk9VTkQ6ICIgKyBmaWxlUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzWE1MU3RhcnRUYWcoSVRleHRSZWdpb25Db2xsZWN0aW9uIHN0YXJ0VGFnUmVnaW9uQ29sbGVjdGlvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIFhNTFNvdXJjZVBhcnNlciB0ZXh0U291cmNlKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0VGFnUmVnaW9uQ29sbGVjdGlvbi5nZXRSZWdpb25zKCk7Ci0JCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJCVN0cmluZyBwcmVmaXggPSBudWxsOwotCQkJYm9vbGVhbiBpc1RhZ2xpYlZhbHVlID0gZmFsc2U7Ci0JCQkvLyBza2lwIHRoZSBmaXJzdCB0d28sIHRoZXkncmUgdGhlIG9wZW4gYnJhY2tldCBhbmQgbmFtZQotCQkJZm9yIChpbnQgaSA9IDI7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCQkvLyBIYW5kbGUgbmVzdGVkIGRpcmVjdGl2ZXMKLQkJCQkJcHJvY2Vzc1JlZ2lvbkNvbGxlY3Rpb24oKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHRleHRTb3VyY2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gSGFuZGxlIHhtbG5zOnh4eD15eXkKLQkJCQkJaW50IHJlZ2lvblN0YXJ0T2Zmc2V0ID0gc3RhcnRUYWdSZWdpb25Db2xsZWN0aW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWludCByZWdpb25UZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQlpZiAocmVnaW9uVGV4dExlbmd0aCA+IFhNTE5TX0xFTkdUSCAmJiB0ZXh0U291cmNlLnJlZ2lvbk1hdGNoZXMocmVnaW9uU3RhcnRPZmZzZXQsIFhNTE5TX0xFTkdUSCwgWE1MTlMpKSB7Ci0JCQkJCQkJcHJlZml4ID0gdGV4dFNvdXJjZS5nZXRUZXh0KHJlZ2lvblN0YXJ0T2Zmc2V0ICsgWE1MTlNfTEVOR1RILCByZWdpb25UZXh0TGVuZ3RoIC0gWE1MTlNfTEVOR1RIKTsKLQkJCQkJCQlpZiAoIWJhbm5lZFByZWZpeGVzLmNvbnRhaW5zKHByZWZpeCkpCi0JCQkJCQkJCWlzVGFnbGliVmFsdWUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcHJlZml4ID0gbnVsbDsKLQkJCQkJCQlpc1RhZ2xpYlZhbHVlID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNUYWdsaWJWYWx1ZSAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdXJpID0gdGV4dFNvdXJjZS5nZXRUZXh0KHJlZ2lvblN0YXJ0T2Zmc2V0LCByZWdpb25UZXh0TGVuZ3RoKTsKLQkJCQkJCQl1cmkgPSBTdHJpbmdVdGlscy5zdHJpcCh1cmkpOwotCQkJCQkJCWludCB1cmlMZW5ndGggPSB1cmkubGVuZ3RoKCk7Ci0JCQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaUxlbmd0aCA+IDApIHsKLQkJCQkJCQkJaWYgKHVyaUxlbmd0aCA+IFVSTl9UTERfTEVOR1RIICYmIHVyaS5zdGFydHNXaXRoKFVSTl9UTEQpKSB7Ci0JCQkJCQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKFVSTl9UTERfTEVOR1RIKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmICh1cmlMZW5ndGggPiBVUk5fVEFHRElSX0xFTkdUSCAmJiB1cmkuc3RhcnRzV2l0aChVUk5fVEFHRElSKSkgewotCQkJCQkJCQkJdXJpID0gdXJpLnN1YnN0cmluZyhVUk5fVEFHRElSX0xFTkdUSCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZW5hYmxlVGFncyhwcmVmaXgsIHVyaSwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQkJdXJpID0gbnVsbDsKLQkJCQkJCQkJcHJlZml4ID0gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUHVsbHMgdGhlIFVSSSBhbmQgcHJlZml4IGZyb20gdGhlIGdpdmVuIHRhZ2xpYiBkaXJlY3RpdmUKLQkJICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmQgbWFrZXMgc3VyZSB0aGUgdGFncyBhcmUga25vd24uCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGFnbGliKElUZXh0UmVnaW9uQ29sbGVjdGlvbiB0YWdsaWJEaXJlY3RpdmVDb2xsZWN0aW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgWE1MU291cmNlUGFyc2VyIHRleHRTb3VyY2UpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gdGFnbGliRGlyZWN0aXZlQ29sbGVjdGlvbi5nZXRSZWdpb25zKCk7Ci0JCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJCVN0cmluZyBwcmVmaXggPSBudWxsOwotCQkJU3RyaW5nIHRhZ2RpciA9IG51bGw7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMjsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCS8vIHJlbWVtYmVyIGF0dHJpYnV0ZSBuYW1lCi0JCQkJCWludCBzdGFydE9mZnNldCA9IHRhZ2xpYkRpcmVjdGl2ZUNvbGxlY3Rpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJaW50IHRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCS8vIFN0cmluZyBuYW1lID0gdGV4dFNvdXJjZS5nZXRUZXh0KHN0YXJ0T2Zmc2V0LAotCQkJCQkJLy8gdGV4dExlbmd0aCk7Ci0JCQkJCQlpZiAodGV4dFNvdXJjZS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMVRMRE5hbWVzLlBSRUZJWCkpIHsKLQkJCQkJCQlhdHRyTmFtZSA9IEpTUDExVExETmFtZXMuUFJFRklYOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAodGV4dFNvdXJjZS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMlRMRE5hbWVzLlVSSSkpIHsKLQkJCQkJCQlhdHRyTmFtZSA9IEpTUDExVExETmFtZXMuVVJJOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAodGV4dFNvdXJjZS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AyMFRMRE5hbWVzLlRBR0RJUikpIHsKLQkJCQkJCQlhdHRyTmFtZSA9IEpTUDIwVExETmFtZXMuVEFHRElSOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJYXR0ck5hbWUgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIHByb2Nlc3MgdmFsdWUKLQkJCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlpZiAoSlNQMTFUTEROYW1lcy5QUkVGSVguZXF1YWxzKGF0dHJOYW1lKSkKLQkJCQkJCQlwcmVmaXggPSBTdHJpbmdVdGlscy5zdHJpcCh0ZXh0U291cmNlLmdldFRleHQoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgpKTsKLQkJCQkJCWVsc2UgaWYgKEpTUDExVExETmFtZXMuVVJJLmVxdWFscyhhdHRyTmFtZSkpCi0JCQkJCQkJdXJpID0gU3RyaW5nVXRpbHMuc3RyaXAodGV4dFNvdXJjZS5nZXRUZXh0KHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoKSk7Ci0JCQkJCQllbHNlIGlmIChKU1AyMFRMRE5hbWVzLlRBR0RJUi5lcXVhbHMoYXR0ck5hbWUpKQotCQkJCQkJCXRhZ2RpciA9IFN0cmluZ1V0aWxzLnN0cmlwKHRleHRTb3VyY2UuZ2V0VGV4dChzdGFydE9mZnNldCwgdGV4dExlbmd0aCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2lvb2JFeGMpIHsKLQkJCQkvLyBub3RoaW5nIHRvIGJlIGRvbmUKLQkJCQl1cmkgPSBudWxsOwotCQkJCXByZWZpeCA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAodXJpICE9IG51bGwgJiYgcHJlZml4ICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID4gMCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZW5hYmxlVGFnbGliRnJvbVVSSShwcmVmaXgsIFN0cmluZ1V0aWxzLnN0cmlwKHVyaSksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmICh0YWdkaXIgIT0gbnVsbCAmJiBwcmVmaXggIT0gbnVsbCAmJiB0YWdkaXIubGVuZ3RoKCkgPiAwICYmIHByZWZpeC5sZW5ndGgoKSA+IDApIHsKLQkJCQllbmFibGVUYWdzSW5EaXIoU3RyaW5nVXRpbHMuc3RyaXAocHJlZml4KSwgU3RyaW5nVXRpbHMuc3RyaXAodGFnZGlyKSwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCByZWdpc3RlclRhZ2xpYihTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgQ01Eb2N1bWVudCB0bGQpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRzID0gdGxkLmdldEVsZW1lbnRzKCk7Ci0JCQkvKgotCQkJICogR28gdGhyb3VnaCB0aGUgQ01Eb2N1bWVudCBmb3IgYW55IHRhZ3MgdGhhdCBtdXN0IGJlIG1hcmtlZCBhcwotCQkJICogYmxvY2sgdGFncyBzdGFydGluZyBhdCB0aGUgYW5jaG9yaW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uCi0JCQkgKiBBcyB0aGUgZG9jdW1lbnQgaXMgZWRpdGVkIGFuZCB0aGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJICogbW92ZWQgYXJvdW5kLCB0aGUgYmxvY2sgdGFnIGVuYWJsZW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5Ci0JCQkgKiBmb2xsb3cgaXQuCi0JCQkgKi8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCVRMREVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChUTERFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzLml0ZW0oaSk7Ci0JCQkJaWYgKGVkLmdldEJvZHljb250ZW50KCkgPT0gSlNQMTJUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVCkKLQkJCQkJYWRkQmxvY2tUYWcocHJlZml4ICsgIjoiICsgZWQuZ2V0Tm9kZU5hbWUoKSwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLyoKLQkJCSAqIFNpbmNlIG1vZGlmaWNhdGlvbnMgdG8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBhZGphY2VudCB0byBhCi0JCQkgKiB0YWdsaWIgZGlyZWN0aXZlIGNhbiBjYXVzZSB0aGF0IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdG8gYmUKLQkJCSAqIHJlcG9ydGVkLCBmaWx0ZXIgb3V0IGFueSBkdXBsaWNhdGVkIFVSSXMuIFdoZW4gdGhlIHRhZ2xpYiBpcwotCQkJICogYWN0dWFsbHkgbW9kaWZpZWQsIGEgZnVsbCByZWJ1aWxkIHdpbGwgb2NjdXIgYW5kIG5vIGR1cGxpY2F0ZXMKLQkJCSAqIHdpbGwvc2hvdWxkIGJlIGZvdW5kLgotCQkJICovCi0JCQlib29sZWFuIGRvVHJhY2sgPSB0cnVlOwotCQkJTGlzdCB0cmFja2VycyA9IGdldFRhZ2xpYlRyYWNrZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRyYWNrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJVGFnbGliVHJhY2tlciB0cmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIHRyYWNrZXJzLmdldChpKTsKLQkJCQlpZiAodHJhY2tlci5nZXRQcmVmaXgoKS5lcXVhbHMocHJlZml4KSAmJiB0cmFja2VyLmdldFVSSSgpLmVxdWFscyh1cmkpKSB7Ci0JCQkJCWRvVHJhY2sgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZG9UcmFjaykgewotCQkJCWFkZFRhZ2xpYlRyYWNrZXIocHJlZml4LCB1cmksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgdGxkKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCByZXNldEJsb2NrVGFncygpIHsKLQkJCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUl0ZXJhdG9yIG5hbWVzID0gZ2V0UGFyc2VyKCkuZ2V0QmxvY2tNYXJrZXJzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKLQkJCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpIG5hbWVzLm5leHQoKTsKLQkJCQlpZiAoIW1hcmtlci5pc0dsb2JhbCgpICYmIG1hcmtlci5nZXRDb250ZXh0KCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkJCWlmIChfZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgcmVtb3ZpbmcgYmxvY2sgdGFnIG5hbWVkOiAiICsgbWFya2VyLmdldFRhZ05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQluYW1lcy5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNldE5vZGVzKCkgewotCQkJaWYgKERlYnVnLmRlYnVnVGFnbGlicykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiByZXNldHRpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2V0SW5jbHVkZXMoKS5jbGVhcigpOwotCQkJcmVzZXRCbG9ja1RhZ3MoKTsKLQkJCXJlc2V0VGFnbGliVHJhY2tlcnMoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld0RvY3VtZW50KSB7Ci0JCQlBc3NlcnQuaXNUcnVlKG5ld0RvY3VtZW50ICE9IG51bGwsICJudWxsIGRvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCUFzc2VydC5pc1RydWUobmV3RG9jdW1lbnQuZ2V0UGFyc2VyKCkgIT0gbnVsbCwgIm51bGwgZG9jdW1lbnQgcGFyc2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJCUFzc2VydC5pc1RydWUobmV3RG9jdW1lbnQuZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBYTUxTb3VyY2VQYXJzZXIsICJjYW4gb25seSBsaXN0ZW4gdG8gZG9jdW1lbnQgd2l0aCBhIFhNTFNvdXJjZVBhcnNlciIpOyAvLyROT04tTkxTLTEkCi0JCQlnZXRTb3VyY2VQYXJzZXIoKS5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKHRoaXMpOwotCQkJc2V0U291cmNlUGFyc2VyKChYTUxTb3VyY2VQYXJzZXIpIG5ld0RvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJCWdldFNvdXJjZVBhcnNlcigpLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgSW5jbHVkZUhlbHBlciBleHRlbmRzIERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgewotCQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQW5jaG9yID0gbnVsbDsKLQkJcHJvdGVjdGVkIFhNTFNvdXJjZVBhcnNlciBmTG9jYWxQYXJzZXIgPSBudWxsOwotCQlwcm90ZWN0ZWQgWE1MU291cmNlUGFyc2VyIGZQYXJlbnRQYXJzZXIgPSBudWxsOwotCQlMaXN0IHRhZ2xpYlJlZmVyZW5jZXMgPSBudWxsOwotCi0JCXB1YmxpYyBJbmNsdWRlSGVscGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yLCBYTUxTb3VyY2VQYXJzZXIgcm9vdFBhcnNlcikgewotCQkJc3VwZXIoKTsKLQkJCWZBbmNob3IgPSBhbmNob3I7Ci0JCQlmUGFyZW50UGFyc2VyID0gcm9vdFBhcnNlcjsKLQkJCXRhZ2xpYlJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgYWRkVGFnbGliVHJhY2tlcihTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgQ01Eb2N1bWVudCB0bGRDTURvY3VtZW50KSB7Ci0JCQlzdXBlci5hZGRUYWdsaWJUcmFja2VyKHByZWZpeCwgdXJpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHRsZENNRG9jdW1lbnQpOwotCQkJVExEQ01Eb2N1bWVudFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVExEQ01Eb2N1bWVudFJlZmVyZW5jZSgpOwotCQkJcmVmZXJlbmNlLnByZWZpeCA9IHByZWZpeDsKLQkJCXJlZmVyZW5jZS51cmkgPSB1cmk7Ci0JCQl0YWdsaWJSZWZlcmVuY2VzLmFkZChyZWZlcmVuY2UpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50cyhJUGF0aCBmaWxlUGF0aCkgewotCQkJcmV0dXJuIEZpbGVDb250ZW50Q2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRDb250ZW50cyhmaWxlUGF0aCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlwcm9jZXNzUmVnaW9uQ29sbGVjdGlvbihzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGZBbmNob3IsIGZMb2NhbFBhcnNlcik7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHBhdGggLQotCQkgKiAgICAgICAgICAgIHRoZSBmdWxscGF0aCBmb3IgdGhlIHJlc291cmNlIHRvIGJlIHBhcnNlZAotCQkgKi8KLQkJdm9pZCBwYXJzZShJUGF0aCBwYXRoKSB7Ci0JCQlYTUxTb3VyY2VQYXJzZXIgcCA9IChYTUxTb3VyY2VQYXJzZXIpIGdldFBhcnNlcigpLm5ld0luc3RhbmNlKCk7Ci0JCQlmTG9jYWxQYXJzZXIgPSBwOwotCQkJU3RyaW5nIHMgPSBnZXRDb250ZW50cyhwYXRoKTsKLQkJCS8vIFNob3VsZCB3ZSBjb25zaWRlciBwcmVsdWRlcyBvbiB0aGlzIHNlZ21lbnQ/Ci0JCQlmTG9jYWxQYXJzZXIuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihJbmNsdWRlSGVscGVyLnRoaXMpOwotCQkJZkxvY2FsUGFyc2VyLnJlc2V0KHMpOwotCQkJTGlzdCBibG9ja1RhZ3MgPSBmUGFyZW50UGFyc2VyLmdldEJsb2NrTWFya2VycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja1RhZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGJsb2NrVGFncy5nZXQoaSk7Ci0JCQkJZkxvY2FsUGFyc2VyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcihtYXJrZXIuZ2V0VGFnTmFtZSgpLCBudWxsLCBtYXJrZXIuZ2V0Q29udGV4dCgpLCBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpKTsKLQkJCX0KLQkJCWlmIChmUGFyZW50UGFyc2VyIGluc3RhbmNlb2YgSlNQQ2FwYWJsZVBhcnNlciAmJiBmTG9jYWxQYXJzZXIgaW5zdGFuY2VvZiBKU1BDYXBhYmxlUGFyc2VyKSB7Ci0JCQkJVGFnTWFya2VyW10ga25vd25QcmVmaXhlcyA9IChUYWdNYXJrZXJbXSkgKChKU1BDYXBhYmxlUGFyc2VyKSBmUGFyZW50UGFyc2VyKS5nZXROZXN0YWJsZVByZWZpeGVzKCkudG9BcnJheShuZXcgVGFnTWFya2VyWzBdKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGtub3duUHJlZml4ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJKChKU1BDYXBhYmxlUGFyc2VyKSBmTG9jYWxQYXJzZXIpLmFkZE5lc3RhYmxlUHJlZml4KG5ldyBUYWdNYXJrZXIoa25vd25QcmVmaXhlc1tpXS5nZXRUYWdOYW1lKCksIG51bGwpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBmb3JjZSBwYXJzZQotCQkJZkxvY2FsUGFyc2VyLmdldERvY3VtZW50UmVnaW9ucygpOwotCQkJZkxvY2FsUGFyc2VyID0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc2V0Tm9kZXMoKSB7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbiBlbnRyeSBpbiB0aGUgc2hhcmVkIGNhY2hlIG1hcAotCSAqLwotCXN0YXRpYyBjbGFzcyBUTERDYWNoZUVudHJ5IHsKLQkJQ01Eb2N1bWVudCBkb2N1bWVudDsKLQkJbG9uZyBtb2RpZmljYXRpb25TdGFtcDsKLQkJaW50IHJlZmVyZW5jZUNvdW50OwotCX0KLQotCXByaXZhdGUgY2xhc3MgVExEQ01Eb2N1bWVudFJlZmVyZW5jZSB7Ci0JCVN0cmluZyBwcmVmaXg7Ci0JCVN0cmluZyB1cmk7Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90bGRjbWRvY3VtZW50L21hbmFnZXIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z0NhY2hlID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90bGRjbWRvY3VtZW50L2NhY2hlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvLyB3aWxsIGhvbGQgdGhlIHByZWZpeGVzIGJhbm5lZCBieSB0aGUgc3BlY2lmaWNhdGlvbjsgdGFnbGlicyBtYXkgbm90IHVzZQotCS8vIHRoZW0KLQlwcm90ZWN0ZWQgc3RhdGljIExpc3QgYmFubmVkUHJlZml4ZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGZDYWNoZSA9IG51bGw7Ci0JZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zOiI7IC8vJE5PTi1OTFMtMSQgCi0JZmluYWwgU3RyaW5nIFVSTl9UQUdESVIgPSAidXJuOmpzcHRhZ2RpcjoiOwotCWZpbmFsIFN0cmluZyBVUk5fVExEID0gInVybjpqc3B0bGQ6IjsKLQotCWZpbmFsIGludCBYTUxOU19MRU5HVEggPSBYTUxOUy5sZW5ndGgoKTsKLQlmaW5hbCBpbnQgVVJOX1RBR0RJUl9MRU5HVEggPSBVUk5fVEFHRElSLmxlbmd0aCgpOwotCWZpbmFsIGludCBVUk5fVExEX0xFTkdUSCA9IFVSTl9UTEQubGVuZ3RoKCk7Ci0KLQlzdGF0aWMgewotCQliYW5uZWRQcmVmaXhlcyA9IG5ldyBBcnJheUxpc3QoNyk7Ci0JCWJhbm5lZFByZWZpeGVzLmFkZCgianNwIik7IC8vJE5PTi1OTFMtMSQKLQkJYmFubmVkUHJlZml4ZXMuYWRkKCJqc3B4Iik7IC8vJE5PTi1OTFMtMSQKLQkJYmFubmVkUHJlZml4ZXMuYWRkKCJqYXZhIik7IC8vJE5PTi1OTFMtMSQKLQkJYmFubmVkUHJlZml4ZXMuYWRkKCJqYXZheCIpOyAvLyROT04tTkxTLTEkCi0JCWJhbm5lZFByZWZpeGVzLmFkZCgic2VydmxldCIpOyAvLyROT04tTkxTLTEkCi0JCWJhbm5lZFByZWZpeGVzLmFkZCgic3VuIik7IC8vJE5PTi1OTFMtMSQKLQkJYmFubmVkUHJlZml4ZXMuYWRkKCJzdW53Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBvZiB0aGUga25vd24gZG9jdW1lbnRzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIEhhc2h0YWJsZSBvZiBlaXRoZXIgVExEQ2FjaGVFbnRyeXMgb3IgV2Vha1JlZmVyZW5jZXMKLQkgKiAgICAgICAgIHRvIFRMRCBDTURvY3VtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIGdldFNoYXJlZERvY3VtZW50Q2FjaGUoKSB7Ci0JCWlmIChmQ2FjaGUgPT0gbnVsbCkgewotCQkJZkNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCQl9Ci0JCXJldHVybiBmQ2FjaGU7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRVbmlxdWVJZGVudGlmaWVyKElUYWdsaWJSZWNvcmQgcmVmZXJlbmNlKSB7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlPYmplY3QgaWRlbnRpZmllciA9IG51bGw7Ci0JCXN3aXRjaCAocmVmZXJlbmNlLmdldFJlY29yZFR5cGUoKSkgewotCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5UTEQpIDogewotCQkJCUlUTERSZWNvcmQgcmVjb3JkID0gKElUTERSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQlpZGVudGlmaWVyID0gcmVjb3JkLmdldFBhdGgoKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuSkFSKSA6IHsKLQkJCQlJSmFyUmVjb3JkIHJlY29yZCA9IChJSmFyUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJaWRlbnRpZmllciA9IHJlY29yZC5nZXRMb2NhdGlvbigpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5UQUdESVIpIDogewotCQkJCUlUYWdEaXJSZWNvcmQgcmVjb3JkID0gKElUYWdEaXJSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQlpZGVudGlmaWVyID0gcmVjb3JkLmdldFBhdGgoKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVVJMKSA6IHsKLQkJCQlJVVJMUmVjb3JkIHJlY29yZCA9IChJVVJMUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJaWRlbnRpZmllciA9IHJlY29yZC5nZXRVUkwoKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWlkZW50aWZpZXIgPSByZWZlcmVuY2U7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGlkZW50aWZpZXI7Ci0JfQotCi0JcHJpdmF0ZSBDTURvY3VtZW50RmFjdG9yeVRMRCBmQ01Eb2N1bWVudEJ1aWxkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGZEaXJlY3RpdmVIYW5kbGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBsb2NhbGx5LWtub3cgbGlzdCBvZiBDTURvY3VtZW50cwotCSAqLwotCXByaXZhdGUgSGFzaHRhYmxlIGZEb2N1bWVudHMgPSBudWxsOwotCi0JLy8gdGltZXN0YW1wIGNhY2hlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHJlcGFyc2luZwotCS8vIG9mIGluY2x1ZGVkIGZpbGVzCi0JLy8gSVBhdGggKGZpbGVwYXRoKSA+IExvbmcgKG1vZGlmaWNhdGlvbiBzdGFtcCkKLQlIYXNoTWFwIGZJbmNsdWRlMlRpbWVzdGFtcE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIFN0YWNrIGZJbmNsdWRlcyA9IG51bGw7Ci0KLQlwcml2YXRlIFhNTFNvdXJjZVBhcnNlciBmUGFyc2VyID0gbnVsbDsKLQotCXByaXZhdGUgTGlzdCBmVGFnbGliVHJhY2tlcnMgPSBudWxsOwotCi0JTWFwIGZUTERDTVJlZmVyZW5jZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCWJvb2xlYW4gZlByb2Nlc3NJbmNsdWRlcyA9IHRydWU7Ci0JYm9vbGVhbiBwcmVsdWRlc0hhbmRsZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBUTERDTURvY3VtZW50TWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCkgewotCQlpZiAoX2RlYnVnQ2FjaGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgY2xlYXJlZCBpdHMgcHJpdmF0ZSBDTURvY3VtZW50IGNhY2hlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXREb2N1bWVudHMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBrZXkgPSBpdGVyLm5leHQoKTsKLQkJCXN5bmNocm9uaXplZCAoZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpKSB7Ci0JCQkJT2JqZWN0IG8gPSBnZXRTaGFyZWREb2N1bWVudENhY2hlKCkuZ2V0KGtleSk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBUTERDYWNoZUVudHJ5KSB7Ci0JCQkJCVRMRENhY2hlRW50cnkgZW50cnkgPSAoVExEQ2FjaGVFbnRyeSkgbzsKLQkJCQkJZW50cnkucmVmZXJlbmNlQ291bnQtLTsKLQkJCQkJaWYgKGVudHJ5LnJlZmVyZW5jZUNvdW50IDw9IDApIHsKLQkJCQkJCWdldFNoYXJlZERvY3VtZW50Q2FjaGUoKS5wdXQoa2V5LCBuZXcgU29mdFJlZmVyZW5jZShlbnRyeSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVyaXZlcyBhbiB1bmlxdWUgY2FjaGUga2V5IGZvciB0aGUgZ2l2ZSBVUkkuIFRoZSBVUkkgaXMgInJlc29sdmVkIiBhbmQKLQkgKiBhIHVuaXF1ZSB2YWx1ZSBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0LiBUaGlzIGVuc3VyZXMgdGhhdCB0d28KLQkgKiBkaWZmZXJlbnQgcmVsYXRpdmUgcmVmZXJlbmNlcyBmcm9tIGRpZmZlcmVudCBmaWxlcyBkbyBub3QgaGF2ZQotCSAqIG92ZXJsYXBwaW5nIFRMRCByZWNvcmRzIGluIHRoZSBzaGFyZWQgY2FjaGUgaWYgdGhleSBkb24ndCByZXNvbHZlIHRvCi0JICogdGhlIHNhbWUgVExELgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDYWNoZUtleShTdHJpbmcgdXJpKSB7Ci0JCUlQYXRoIGN1cnJlbnRQYXJzZXJQYXRoID0gZ2V0Q3VycmVudFBhcnNlclBhdGgoKTsKLQkJaWYgKGN1cnJlbnRQYXJzZXJQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gVGFnbGliSW5kZXgucmVzb2x2ZShjdXJyZW50UGFyc2VyUGF0aC50b1N0cmluZygpLCB1cmksIGZhbHNlKTsKLQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VW5pcXVlSWRlbnRpZmllcihyZWNvcmQpOwotCQl9Ci0JCVN0cmluZyBsb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShnZXRDdXJyZW50QmFzZUxvY2F0aW9uKCkudG9TdHJpbmcoKSwgbnVsbCwgdXJpKTsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgQ01Eb2N1bWVudCBhdCB0aGUgdXJpIChjYWNoZWQpCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgdXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVmZXJlbmNlID0gdXJpOwotCQlPYmplY3QgY2FjaGVLZXkgPSBnZXRDYWNoZUtleShyZWZlcmVuY2UpOwotCQlpZiAoY2FjaGVLZXkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJbG9uZyBsYXN0TW9kaWZpZWQgPSBnZXRNb2RpZmljYXRpb25TdGFtcChyZWZlcmVuY2UpOwotCQlDTURvY3VtZW50IGRvYyA9IChDTURvY3VtZW50KSBnZXREb2N1bWVudHMoKS5nZXQoY2FjaGVLZXkpOwotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBJZiBoYXNuJ3QgYmVlbiBtb3ZlZCBpbnRvIHRoZSBsb2NhbCB0YWJsZSwgZG8gc28gYW5kIGluY3JlbWVudAotCQkJICogdGhlIGNvdW50LiBBIGxvY2FsIFVSSSByZWZlcmVuY2UgY2FuIGJlIGRpZmZlcmVudCBkZXBlbmRpbmcgb24KLQkJCSAqIHRoZSBmaWxlIGZyb20gd2hpY2ggaXQgd2FzIHJlZmVyZW5jZWQuIFVzZSBhIGNvbXB1dGVkIGtleSB0bwotCQkJICoga2VlcCB0aGVtIHN0cmFpZ2h0LgotCQkJICovCi0JCQlPYmplY3QgbyA9IGdldFNoYXJlZERvY3VtZW50Q2FjaGUoKS5nZXQoY2FjaGVLZXkpOwotCQkJaWYgKG8gIT0gbnVsbCkgewotCQkJCWlmIChvIGluc3RhbmNlb2YgVExEQ2FjaGVFbnRyeSkgewotCQkJCQlUTERDYWNoZUVudHJ5IGVudHJ5ID0gKFRMRENhY2hlRW50cnkpIG87Ci0JCQkJCWlmIChfZGVidWdDYWNoZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50IGNhY2hlIGhpdCBvbiAiICsgY2FjaGVLZXkpOwotCQkJCQl9Ci0JCQkJCWlmIChlbnRyeSAhPSBudWxsICYmIGVudHJ5Lm1vZGlmaWNhdGlvblN0YW1wICE9IElSZXNvdXJjZS5OVUxMX1NUQU1QICYmIGVudHJ5Lm1vZGlmaWNhdGlvblN0YW1wID49IGxhc3RNb2RpZmllZCkgewotCQkJCQkJZG9jID0gZW50cnkuZG9jdW1lbnQ7Ci0JCQkJCQllbnRyeS5yZWZlcmVuY2VDb3VudCsrOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpLnJlbW92ZShjYWNoZUtleSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIFJlZmVyZW5jZSkgewotCQkJCQlUTERDYWNoZUVudHJ5IGVudHJ5ID0gKFRMRENhY2hlRW50cnkpICgoUmVmZXJlbmNlKSBvKS5nZXQoKTsKLQkJCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJCWlmIChlbnRyeS5tb2RpZmljYXRpb25TdGFtcCAhPSBJUmVzb3VyY2UuTlVMTF9TVEFNUCAmJiBlbnRyeS5tb2RpZmljYXRpb25TdGFtcCA+PSBsYXN0TW9kaWZpZWQpIHsKLQkJCQkJCQlkb2MgPSBlbnRyeS5kb2N1bWVudDsKLQkJCQkJCQllbnRyeS5yZWZlcmVuY2VDb3VudCA9IDE7Ci0JCQkJCQkJZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpLnB1dChjYWNoZUtleSwgZW50cnkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpLnJlbW92ZShjYWNoZUtleSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvKiBObyBkb2N1bWVudCB3YXMgZm91bmQgY2FjaGVkLCBjcmVhdGUgYSBuZXcgb25lIGFuZCBzaGFyZSBpdCAqLwotCQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQkJaWYgKF9kZWJ1Z0NhY2hlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudCBjYWNoZSBtaXNzIG9uICIgKyBjYWNoZUtleSk7Ci0JCQkJfQotCQkJCUNNRG9jdW1lbnQgZG9jdW1lbnQgPSBsb2FkVGFnbGliKHJlZmVyZW5jZSk7Ci0JCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJVExEQ2FjaGVFbnRyeSBlbnRyeSA9IG5ldyBUTERDYWNoZUVudHJ5KCk7Ci0JCQkJCWRvYyA9IGVudHJ5LmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCQkJCWVudHJ5LnJlZmVyZW5jZUNvdW50ID0gMTsKLQkJCQkJZW50cnkubW9kaWZpY2F0aW9uU3RhbXAgPSBnZXRNb2RpZmljYXRpb25TdGFtcChyZWZlcmVuY2UpOwotCQkJCQlnZXRTaGFyZWREb2N1bWVudENhY2hlKCkucHV0KGNhY2hlS2V5LCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJZ2V0RG9jdW1lbnRzKCkucHV0KGNhY2hlS2V5LCBkb2MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JcHJpdmF0ZSBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKFN0cmluZyByZWZlcmVuY2UpIHsKLQkJSVRhZ2xpYlJlY29yZCByZWNvcmQgPSBUYWdsaWJJbmRleC5yZXNvbHZlKGdldEN1cnJlbnRQYXJzZXJQYXRoKCkudG9TdHJpbmcoKSwgcmVmZXJlbmNlLCBmYWxzZSk7Ci0JCWxvbmcgbW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQlzd2l0Y2ggKHJlY29yZC5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJCUlGaWxlIHRsZGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoKChJVExEUmVjb3JkKSByZWNvcmQpLmdldFBhdGgoKSk7Ci0JCQkJCWlmICh0bGRmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQltb2RpZmljYXRpb25TdGFtcCA9IHRsZGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5KQVIpIDogewotCQkJCQlGaWxlIGphcmZpbGUgPSBuZXcgRmlsZSgoKElKYXJSZWNvcmQpIHJlY29yZCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQkJCQlpZiAoamFyZmlsZS5leGlzdHMoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQltb2RpZmljYXRpb25TdGFtcCA9IGphcmZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJCQkJCW1vZGlmaWNhdGlvblN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVEFHRElSKSA6IHsKLQkJCQkJSUZvbGRlciB0YWdGb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcigoKElUYWdEaXJSZWNvcmQpIHJlY29yZCkuZ2V0UGF0aCgpKTsKLQkJCQkJaWYgKHRhZ0ZvbGRlci5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJSVJlc291cmNlW10gbWVtYmVyczsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWVtYmVycyA9IHRhZ0ZvbGRlci5tZW1iZXJzKCk7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCW1vZGlmaWNhdGlvblN0YW1wID0gTWF0aC5tYXgobW9kaWZpY2F0aW9uU3RhbXAsIG1lbWJlcnNbaV0uZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCW1vZGlmaWNhdGlvblN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVVJMKSA6IHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvYyA9ICgoSVVSTFJlY29yZCkgcmVjb3JkKS5nZXRCYXNlTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvYyAhPSBudWxsICYmIGxvYy5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgamFyZmlsZSA9IG5ldyBGaWxlKGxvYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamFyZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWNhdGlvblN0YW1wID0gamFyZmlsZS5sYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBjTURvY3VtZW50QnVpbGRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBDTURvY3VtZW50RmFjdG9yeVRMRCwgc2luY2UgaXQgaGFzIG1vcmUgYnVpbGRlcgotCSAqICAgICAgICAgbWV0aG9kcwotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50RmFjdG9yeVRMRCBnZXRDTURvY3VtZW50QnVpbGRlcigpIHsKLQkJaWYgKGZDTURvY3VtZW50QnVpbGRlciA9PSBudWxsKQotCQkJZkNNRG9jdW1lbnRCdWlsZGVyID0gbmV3IENNRG9jdW1lbnRGYWN0b3J5VExEKCk7Ci0JCXJldHVybiBmQ01Eb2N1bWVudEJ1aWxkZXI7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKGludCBvZmZzZXQpIHsKLQkJTGlzdCB2YWxpZERvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdFtdIGFsbGRvY3MgPSBnZXRUYWdsaWJUcmFja2VycygpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxkb2NzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWdsaWJUcmFja2VyIGFUcmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIGFsbGRvY3NbaV07Ci0JCQlpZiAoYVRyYWNrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKSA8PSBvZmZzZXQgfHwgb2Zmc2V0IDwgMCkgewotCQkJCXZhbGlkRG9jcy5hZGQoYVRyYWNrZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWxpZERvY3M7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKFN0cmluZyBwcmVmaXgsIGludCBvZmZzZXQpIHsKLQkJTGlzdCB2YWxpZERvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdFtdIGFsbGRvY3MgPSBnZXRUYWdsaWJUcmFja2VycygpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxkb2NzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWdsaWJUcmFja2VyIGFUcmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIGFsbGRvY3NbaV07Ci0JCQkvKioKLQkJCSAqICc8JyBpcyB1c2VkIHRvIHN1cHBvcnQgdGhlIGltbWVkaWF0ZSB1c2Ugb2YgYSBjdXN0b20gdGFnIGluIGpzcHggZmlsZXMgKGluc3RlYWQgb2YgJzw9JykKLQkJCSAqLwotCQkJaWYgKChhVHJhY2tlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpIDw9IG9mZnNldCB8fCBvZmZzZXQgPCAwKSAmJiBhVHJhY2tlci5nZXRQcmVmaXgoKS5lcXVhbHMocHJlZml4KSkgewotCQkJCXZhbGlkRG9jcy5hZGQoYVRyYWNrZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWxpZERvY3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaWxlc3lzdGVtIGxvY2F0aW9uIGluIHRoZSBjdXJyZW50IHBhcnNlci4gVGhpcyBtZXRob2QgaXMKLQkgKiBjYWxsZWQgd2hpbGUgcmVjdXJzaW5nIHRocm91Z2ggaW5jbHVkZWQgZnJhZ21lbnRzLCBzbyBpdCBtdWNoIGNoZWNrIHRoZQotCSAqIGluY2x1ZGUgc3RhY2suIFRoZSBmaWxlc3lzdGVtIGxvY2F0aW9uIGlzIG5lZWRlZCBmb3IgY29tbW9uIFVSSQotCSAqIHJlc29sdXRpb24gaW4gY2FzZSB0aGUgVGFnbGliIEluZGV4IGRvZXNuJ3Qga25vdyB0aGUgVVJJIGJlaW5nIGxvYWRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSVBhdGggZ2V0Q3VycmVudEJhc2VMb2NhdGlvbigpIHsKLQkJSVBhdGggYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJSVBhdGggcGF0aCA9IGdldEN1cnJlbnRQYXJzZXJQYXRoKCk7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5zZWdtZW50Q291bnQoKSA8IDIpCi0JCQlyZXR1cm4gcGF0aDsKLQkJYmFzZUxvY2F0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmdldExvY2F0aW9uKCk7Ci0JCWlmIChiYXNlTG9jYXRpb24gPT0gbnVsbCkgewotCQkJYmFzZUxvY2F0aW9uID0gcGF0aDsKLQkJfQotCQlyZXR1cm4gYmFzZUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGF0aCB1c2VkIGluIHRoZSBjdXJyZW50IHBhcnNlci4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoaWxlCi0JICogcmVjdXJzaW5nIHRocm91Z2ggaW5jbHVkZWQgZnJhZ21lbnRzLCBzbyBpdCBtdWNoIGNoZWNrIHRoZSBpbmNsdWRlCi0JICogc3RhY2suCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUlQYXRoIGdldEN1cnJlbnRQYXJzZXJQYXRoKCkgewotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJaWYgKCFnZXRJbmNsdWRlcygpLmlzRW1wdHkoKSkgewotCQkJcGF0aCA9IChJUGF0aCkgZ2V0SW5jbHVkZXMoKS5wZWVrKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwYXRoID0gVGFnbGliQ29udHJvbGxlci5nZXRMb2NhdGlvbih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwYXRoOwotCX0KLQotCXByb3RlY3RlZCBEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGdldERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKSB7Ci0JCWlmIChmRGlyZWN0aXZlSGFuZGxlciA9PSBudWxsKQotCQkJZkRpcmVjdGl2ZUhhbmRsZXIgPSBuZXcgRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcigpOwotCQlyZXR1cm4gZkRpcmVjdGl2ZUhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZG9jdW1lbnRzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIGphdmEudXRpbC5IYXNodGFibGUKLQkgKi8KLQlwdWJsaWMgSGFzaHRhYmxlIGdldERvY3VtZW50cygpIHsKLQkJaWYgKGZEb2N1bWVudHMgPT0gbnVsbCkKLQkJCWZEb2N1bWVudHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXJldHVybiBmRG9jdW1lbnRzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGluY2x1ZGVzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0YWNrCi0JICovCi0JcHJvdGVjdGVkIFN0YWNrIGdldEluY2x1ZGVzKCkgewotCQlpZiAoZkluY2x1ZGVzID09IG51bGwpCi0JCQlmSW5jbHVkZXMgPSBuZXcgU3RhY2soKTsKLQkJcmV0dXJuIGZJbmNsdWRlczsKLQl9Ci0KLQlYTUxTb3VyY2VQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlyZXR1cm4gZlBhcnNlcjsKLQl9Ci0KLQlwdWJsaWMgWE1MU291cmNlUGFyc2VyIGdldFNvdXJjZVBhcnNlcigpIHsKLQkJcmV0dXJuIGZQYXJzZXI7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcigpIHsKLQkJcmV0dXJuIGdldERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0VGFnbGliVHJhY2tlcnMoKSB7Ci0JCWlmIChmVGFnbGliVHJhY2tlcnMgPT0gbnVsbCkKLQkJCWZUYWdsaWJUcmFja2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGZUYWdsaWJUcmFja2VyczsKLQl9Ci0KLQl2b2lkIGhhbmRsZVByZWx1ZGVzKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvciA9IG5ldyBaZXJvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwsIC0xKTsKLQkJZlByb2Nlc3NJbmNsdWRlcyA9IGZhbHNlOwotCi0JCUlQYXRoIGN1cnJlbnRQYXRoID0gZ2V0Q3VycmVudFBhcnNlclBhdGgoKTsKLQkJaWYgKGN1cnJlbnRQYXRoICE9IG51bGwpIHsKLQkJCVByb3BlcnR5R3JvdXBbXSBwcm9wZXJ0eUdyb3VwcyA9IERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5nZXRJbnN0YW5jZSgpLmdldFByb3BlcnR5R3JvdXBzKGN1cnJlbnRQYXRoKTsKLQkJCWZvcihpbnQgayA9IDA7IGsgPCBwcm9wZXJ0eUdyb3Vwcy5sZW5ndGg7IGsrKykgewotCQkJCUlQYXRoW10gcHJlbHVkZXMgPSBwcm9wZXJ0eUdyb3Vwc1trXS5nZXRJbmNsdWRlUHJlbHVkZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlbHVkZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFnZXRJbmNsdWRlcygpLmNvbnRhaW5zKHByZWx1ZGVzW2ldKSAmJiAhcHJlbHVkZXNbaV0uZXF1YWxzKGN1cnJlbnRQYXRoKSkgewotCQkJCQkJZ2V0SW5jbHVkZXMoKS5wdXNoKHByZWx1ZGVzW2ldKTsKLQkJCQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQkJSW5jbHVkZUhlbHBlciBpbmNsdWRlSGVscGVyID0gbmV3IEluY2x1ZGVIZWxwZXIoYW5jaG9yLCBnZXRQYXJzZXIoKSk7Ci0JCQkJCQkJaW5jbHVkZUhlbHBlci5wYXJzZShwcmVsdWRlc1tpXSk7Ci0JCQkJCQkJTGlzdCByZWZlcmVuY2VzID0gaW5jbHVkZUhlbHBlci50YWdsaWJSZWZlcmVuY2VzOwotCQkJCQkJCWZUTERDTVJlZmVyZW5jZXNNYXAucHV0KHByZWx1ZGVzW2ldLCByZWZlcmVuY2VzKTsKLQkJCQkJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBKU1BDYXBhYmxlUGFyc2VyKSB7Ci0JCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmZXJlbmNlcy5zaXplKCk7IGorKykgewotCQkJCQkJCQkJVExEQ01Eb2N1bWVudFJlZmVyZW5jZSByZWZlcmVuY2UgPSAoVExEQ01Eb2N1bWVudFJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaik7Ci0JCQkJCQkJCQkoKEpTUENhcGFibGVQYXJzZXIpIGdldFBhcnNlcigpKS5hZGROZXN0YWJsZVByZWZpeChuZXcgVGFnTWFya2VyKHJlZmVyZW5jZS5wcmVmaXggKyAiOiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJXYXJuaW5nOiBwYXJzZXIgdGV4dCB3YXMgcmVxdWVzdGVkIGJ5ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgYnV0IG5vbmUgd2FzIGF2YWlsYWJsZTsgdGFnbGliIHN1cHBvcnQgZGlzYWJsZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlnZXRJbmNsdWRlcygpLnBvcCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZlByb2Nlc3NJbmNsdWRlcyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB0byBjaGVjayBmb3IgbW9kaWZpY2F0aW9uCi0JICovCi0JYm9vbGVhbiBoYXNBbnlJbmNsdWRlQmVlbk1vZGlmaWVkKElQYXRoIGZpbGVQYXRoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGNoZWNrIHRoZSB0b3AgbGV2ZWwKLQkJaWYgKGhhc0JlZW5Nb2RpZmllZChmaWxlUGF0aCkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBjaGVjayBhbGwgaW5jbHVkZWVzCi0JCQlJdGVyYXRvciBpdGVyID0gZkluY2x1ZGUyVGltZXN0YW1wTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoaGFzQmVlbk1vZGlmaWVkKChJUGF0aCkgaXRlci5uZXh0KCkpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlbmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGhhc0JlZW5Nb2RpZmllZChJUGF0aCBmaWxlUGF0aCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBxdWljayBmaWxlbmFtZS90aW1lc3RhbXAgY2FjaGUgY2hlY2sgaGVyZS4uLgotCQlJRmlsZSBmID0gbnVsbDsKLQkJaWYgKGYgPT0gbnVsbCAmJiBmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWYgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotCQl9Ci0JCWlmIChmICE9IG51bGwgJiYgZi5leGlzdHMoKSkgewotCQkJTG9uZyBjdXJyZW50U3RhbXAgPSBuZXcgTG9uZyhmLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpOwotCQkJT2JqZWN0IG8gPSBmSW5jbHVkZTJUaW1lc3RhbXBNYXAuZ2V0KGZpbGVQYXRoKTsKLQkJCWlmIChvICE9IG51bGwpIHsKLQkJCQlMb25nIHByZXZpb3VzU3RhbXAgPSAoTG9uZykgbzsKLQkJCQkvLyBzdGFtcHMgZG9uJ3QgbWF0Y2gsIGZpbGUgY2hhbmdlZAotCQkJCWlmIChjdXJyZW50U3RhbXAubG9uZ1ZhbHVlKCkgIT0gcHJldmlvdXNTdGFtcC5sb25nVmFsdWUoKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQkvLyBzdG9yZSBmb3IgbmV4dCB0aW1lCi0JCQkJCWZJbmNsdWRlMlRpbWVzdGFtcE1hcC5wdXQoZmlsZVBhdGgsIGN1cnJlbnRTdGFtcCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gcmV0dXJuIHRydWUsIHNpbmNlIHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCB0aGlzIGZpbGUgeWV0LgotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJLy8gc3RvcmUgZm9yIG5leHQgdGltZQotCQkJCWZJbmNsdWRlMlRpbWVzdGFtcE1hcC5wdXQoZmlsZVBhdGgsIGN1cnJlbnRTdGFtcCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbmRleENoYW5nZWQoSVRhZ2xpYkluZGV4RGVsdGEgZXZlbnQpIHsKLQkJc3luY2hyb25pemVkIChnZXRTaGFyZWREb2N1bWVudENhY2hlKCkpIHsKLQkJCUl0ZXJhdG9yIHZhbHVlcyA9IGdldFNoYXJlZERvY3VtZW50Q2FjaGUoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHZhbHVlcy5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbyA9IHZhbHVlcy5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBSZWZlcmVuY2UpIHsKLQkJCQkJdmFsdWVzLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSB0YWdsaWIgZnJvbSB0aGUgc3BlY2lmaWVkIFVSSS4gSXQgbXVzdCBwb2ludCB0byBhIHZhbGlkCi0JICogdGFnbGliIGRlc2NyaXB0b3IgdG8gd29yay4KLQkgKi8KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudCBsb2FkVGFnbGliKFN0cmluZyB1cmkpIHsKLQkJQ01Eb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCUlQYXRoIGN1cnJlbnRQYXRoID0gZ2V0Q3VycmVudFBhcnNlclBhdGgoKTsKLQkJaWYgKGN1cnJlbnRQYXRoICE9IG51bGwpIHsKLQkJCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gVGFnbGliSW5kZXgucmVzb2x2ZShjdXJyZW50UGF0aC50b1N0cmluZygpLCB1cmksIGZhbHNlKTsKLQkJCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJCWRvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudEJ1aWxkZXIoKS5jcmVhdGVDTURvY3VtZW50KHJlY29yZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBOb3QgYSB2ZXJ5LW9mdGVuIHVzZWQgY29kZSBwYXRoICh3ZSBob3BlKSAqLwotCQkJCUlQYXRoIGN1cnJlbnRCYXNlTG9jYXRpb24gPSBnZXRDdXJyZW50QmFzZUxvY2F0aW9uKCk7Ci0JCQkJaWYgKGN1cnJlbnRCYXNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbG9jYXRpb24gPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoY3VycmVudEJhc2VMb2NhdGlvbi50b1N0cmluZygpLCBudWxsLCB1cmkpOwotCQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQkJaWYgKF9kZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGluZyB0YWdzIGZyb20gIiArIHVyaSArICIgYXQgIiArIGxvY2F0aW9uKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWRvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudEJ1aWxkZXIoKS5jcmVhdGVDTURvY3VtZW50KGxvY2F0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRUYWdsaWJUcmFja2VycygpIHsKLQkJaWYgKF9kZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50TWFuYWdlciBjbGVhcmVkIGl0cyB0YWdsaWIgdHJhY2tlcnNcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJlbHVkZXNIYW5kbGVkID0gZmFsc2U7Ci0JCWdldFRhZ2xpYlRyYWNrZXJzKCkuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VQYXJzZXIoWE1MU291cmNlUGFyc2VyIHBhcnNlcikgewotCQlpZiAoZlBhcnNlciAhPSBudWxsKQotCQkJZlBhcnNlci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKSk7Ci0JCWZQYXJzZXIgPSBwYXJzZXI7Ci0JCWlmIChmUGFyc2VyICE9IG51bGwpCi0JCQlmUGFyc2VyLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMREZ1bmN0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMREZ1bmN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjQ3MTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERGdW5jdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgVExERnVuY3Rpb25JbXBsIGltcGxlbWVudHMgVExERnVuY3Rpb24gewotCXByaXZhdGUgU3RyaW5nIGZDbGFzc05hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRpc3BsYXlOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmRXhhbXBsZSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgwKTsKLQlwcml2YXRlIFN0cmluZyBmSWNvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZk5hbWUgPSBudWxsOwotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGZPd25lckRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmU2lnbmF0dXJlID0gbnVsbDsKLQotCXB1YmxpYyBUTERGdW5jdGlvbkltcGwoQ01Eb2N1bWVudCBvd25lcikgewotCQlzdXBlcigpOwotCQlmT3duZXJEb2N1bWVudCA9IG93bmVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xhc3NOYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZkNsYXNzTmFtZTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGlzcGxheU5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGZEaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4YW1wbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeGFtcGxlKCkgewotCQlyZXR1cm4gZkV4YW1wbGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBleHRlbnNpb25zLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiBmRXh0ZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGljb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJY29uKCkgewotCQlyZXR1cm4gZkljb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3duZXJEb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotCQlyZXR1cm4gZk93bmVyRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzaWduYXR1cmUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaWduYXR1cmUoKSB7Ci0JCXJldHVybiBmU2lnbmF0dXJlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiAgICAgICAgICAgIFRoZSBjbGFzc05hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWZDbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlmRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGlzcGxheU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBkaXNwbGF5TmFtZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIGRpc3BsYXlOYW1lKSB7Ci0JCWZEaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBleGFtcGxlCi0JICogICAgICAgICAgICBUaGUgZXhhbXBsZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhhbXBsZShTdHJpbmcgZXhhbXBsZSkgewotCQlmRXhhbXBsZSA9IGV4YW1wbGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGljb24KLQkgKiAgICAgICAgICAgIFRoZSBpY29uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJY29uKFN0cmluZyBpY29uKSB7Ci0JCWZJY29uID0gaWNvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzaWduYXR1cmUKLQkgKiAgICAgICAgICAgIFRoZSBzaWduYXR1cmUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpZ25hdHVyZShTdHJpbmcgc2lnbmF0dXJlKSB7Ci0JCWZTaWduYXR1cmUgPSBzaWduYXR1cmU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMREluaXRQYXJhbUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERJbml0UGFyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxY2RmZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMREluaXRQYXJhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIFRMREluaXRQYXJhbUltcGwgaW1wbGVtZW50cyBUTERJbml0UGFyYW0gewotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQlwdWJsaWMgVExESW5pdFBhcmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IG5hbWU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IGRlc2NyaXB0aW9uOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0RGVzY3JpcHRpb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdmFsdWU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRWYWx1ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERMaXN0ZW5lckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERMaXN0ZW5lckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlZjk5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExETGlzdGVuZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCA5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIFRMRExpc3RlbmVySW1wbCBpbXBsZW1lbnRzIFRMRExpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGxpc3RlbmVyQ2xhc3M7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBsaXN0ZW5lckNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlsaXN0ZW5lckNsYXNzID0gY2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgbGlzdGVuZXIgY2xhc3M6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRMaXN0ZW5lckNsYXNzKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRFZhbGlkYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERWYWxpZGF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NmY3NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRFZhbGlkYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBUTERWYWxpZGF0b3JJbXBsIGltcGxlbWVudHMgVExEVmFsaWRhdG9yIHsKLQlwcm90ZWN0ZWQgTGlzdCBpbml0UGFyYW1zOwotCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdG9yQ2xhc3M7Ci0KLQlwdWJsaWMgTGlzdCBnZXRJbml0UGFyYW1zKCkgewotCQlpZiAoaW5pdFBhcmFtcyA9PSBudWxsKQotCQkJaW5pdFBhcmFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGluaXRQYXJhbXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JDbGFzcygpIHsKLQkJcmV0dXJuIHZhbGlkYXRvckNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluaXRQYXJhbXMoTGlzdCBpbml0UGFyYW1zKSB7Ci0JCXRoaXMuaW5pdFBhcmFtcyA9IGluaXRQYXJhbXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yQ2xhc3MoU3RyaW5nIHZhbGlkYXRvckNsYXNzKSB7Ci0JCXRoaXMudmFsaWRhdG9yQ2xhc3MgPSB2YWxpZGF0b3JDbGFzczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IHZhbGlkYXRvciBjbGFzczoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFZhbGlkYXRvckNsYXNzKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IGluaXQtcGFybXM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRJbml0UGFyYW1zKCkuc2l6ZSgpOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuIiArIFN0cmluZ1V0aWxzLnJlcGxhY2UoZ2V0SW5pdFBhcmFtcygpLmdldChpKS50b1N0cmluZygpLCAiXG4iLCAiXG5cdFx0IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEVmFyaWFibGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEVmFyaWFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2I3NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRFZhcmlhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExEVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBUTERWYXJpYWJsZUltcGwgaW1wbGVtZW50cyBUTERWYXJpYWJsZSB7Ci0JLy8gb3B0aW9uYWwgLSBkZWZhdWx0cyB0byB0cnVlCi0JcHJpdmF0ZSBib29sZWFuIGRlY2xhcmUgPSB0cnVlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uOwotCS8vIHJlcXVpcmVkCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZUZyb21BdHRyaWJ1dGU7Ci0JLy8gcmVxdWlyZWQKLQlwcml2YXRlIFN0cmluZyBuYW1lR2l2ZW47Ci0JLy8gb3B0aW9uYWwgLSBkZWZhdWx0cyB0byBORVNURUQKLQlwcml2YXRlIFN0cmluZyBzY29wZSA9IEpTUDEyVExETmFtZXMuVkFSSUFCTEVfU0NPUEVfTkVTVEVEOwotCS8vIHJlcXVpcmVkIC0gZGVmYXVsdHMgdG8gYSBTdHJpbmcKLQlwcml2YXRlIFN0cmluZyB2YXJpYWJsZUNsYXNzID0gImphdmEubGFuZy5TdHJpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBmQWxpYXM7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWNsYXJlKCkgewotCQlyZXR1cm4gZGVjbGFyZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBmRGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lRnJvbUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIG5hbWVGcm9tQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUdpdmVuKCkgewotCQlyZXR1cm4gbmFtZUdpdmVuOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBzY29wZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmxlQ2xhc3MoKSB7Ci0JCXJldHVybiB2YXJpYWJsZUNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlY2xhcmUoYm9vbGVhbiBkZWNsYXJlKSB7Ci0JCXRoaXMuZGVjbGFyZSA9IGRlY2xhcmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVjbGFyZVN0cmluZyhTdHJpbmcgZGVjbCkgewotCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQlzZXREZWNsYXJlKGRlY2wuZXF1YWxzKEpTUDEyVExETmFtZXMuVFJVRSkgfHwgZGVjbC5lcXVhbHMoSlNQMTJUTEROYW1lcy5ZRVMpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgVGhlIGRlc2NyaXB0aW9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZUZyb21BdHRyaWJ1dGUoU3RyaW5nIG5hbWVGcm9tQXR0cmlidXRlKSB7Ci0JCXRoaXMubmFtZUZyb21BdHRyaWJ1dGUgPSBuYW1lRnJvbUF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lR2l2ZW4oU3RyaW5nIG5hbWVHaXZlbikgewotCQl0aGlzLm5hbWVHaXZlbiA9IG5hbWVHaXZlbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgc2NvcGUpIHsKLQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmxlQ2xhc3MoU3RyaW5nIHZhcmlhYmxlQ2xhc3MpIHsKLQkJdGhpcy52YXJpYWJsZUNsYXNzID0gdmFyaWFibGVDbGFzczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IG5hbWUgZ2l2ZW46IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXROYW1lR2l2ZW4oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgbmFtZSBmcm9tIGF0dHJpYnV0ZToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldE5hbWVGcm9tQXR0cmlidXRlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBCb29sZWFuLnRvU3RyaW5nKGJvb2xlYW4pIGlzIGludHJvZHVjZWQgaW4gSkRLIDEuNAotCQkvLyBidWZmZXIuYXBwZW5kKCJcblx0IGRlY2xhcmU6IiArCi0JCS8vIFN0cmluZ1V0aWxzLmVzY2FwZShCb29sZWFuLnRvU3RyaW5nKGdldERlY2xhcmUoKSkpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBkZWNsYXJlOiIgKyBTdHJpbmdVdGlscy50b1N0cmluZyhnZXREZWNsYXJlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHNjb3BlOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0U2NvcGUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdmFyaWFibGUgY2xhc3M6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRWYXJpYWJsZUNsYXNzKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbGlhcygpIHsKLQkJcmV0dXJuIGZBbGlhczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGlhcyhTdHJpbmcgYWxpYXMpIHsKLQkJZkFsaWFzID0gYWxpYXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RhZ2xpYlRyYWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UYWdsaWJUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MzUxYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RhZ2xpYlRyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnRXcmFwcGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnRUcmFja2VyOwotCi0vKioKLSAqIFRhZ2xpYlRyYWNrZXIgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYlRyYWNrZXIgZXh0ZW5kcyBDTURvY3VtZW50V3JhcHBlckltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50VHJhY2tlciB7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCXB1YmxpYyBUYWdsaWJUcmFja2VyKFN0cmluZyBuZXdVUkksIFN0cmluZyBuZXdQcmVmaXgsIENNRG9jdW1lbnQgdGxkLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJc3VwZXIobmV3VVJJLCBuZXdQcmVmaXgsIHRsZCk7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBhU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiQCIgKyBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9KU1AxMVRMRE5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMTFUTEROYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjQ5NTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9KU1AxMVRMRE5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQMTFUTEROYW1lcyB7Ci0KLQlTdHJpbmcgVEFHTElCID0gInRhZ2xpYiI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBDT05URU5UX0pTUCA9ICJKU1AiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlRFTlRfRU1QVFkgPSAiZW1wdHkiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlRFTlRfVEFHREVQRU5ERU5UID0gInRhZ2RlcGVuZGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUQUcgPSAidGFnIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BWRVJTSU9OID0gImpzcHZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRMSUJWRVJTSU9OID0gInRsaWJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTSE9SVE5BTUUgPSAic2hvcnRuYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVUk4gPSAidXJuIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJTkZPID0gImluZm8iOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBURUlDTEFTUyA9ICJ0ZWljbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFHQ0xBU1MgPSAidGFnY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEJPRFlDT05URU5UID0gImJvZHljb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSSUJVVEUgPSAiYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIElEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRVFVSVJFRCA9ICJyZXF1aXJlZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUlRFWFBSVkFMVUUgPSAicnRleHBydmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgUFJFRklYID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBJTkNMVURFID0gImluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZJTEUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBZRVMgPSAieWVzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBOTyA9ICJubyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9KU1AxMlRMRE5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMTJUTEROYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWIzMTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9KU1AxMlRMRE5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQMTJUTEROYW1lcyB7Ci0KLQlTdHJpbmcgVEFHTElCID0gSlNQMTFUTEROYW1lcy5UQUdMSUI7Ci0KLQlTdHJpbmcgQ09OVEVOVF9KU1AgPSBKU1AxMVRMRE5hbWVzLkNPTlRFTlRfSlNQOwotCVN0cmluZyBDT05URU5UX0VNUFRZID0gSlNQMTFUTEROYW1lcy5DT05URU5UX0VNUFRZOwotCVN0cmluZyBDT05URU5UX1RBR0RFUEVOREVOVCA9IEpTUDExVExETmFtZXMuQ09OVEVOVF9UQUdERVBFTkRFTlQ7Ci0KLQlTdHJpbmcgVEFHID0gSlNQMTFUTEROYW1lcy5UQUc7Ci0JU3RyaW5nIEpTUF9WRVJTSU9OID0gImpzcC12ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUTElCX1ZFUlNJT04gPSAidGxpYi12ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTSE9SVF9OQU1FID0gInNob3J0LW5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVSSSA9IEpTUDExVExETmFtZXMuVVJJOwotCVN0cmluZyBVUk4gPSBKU1AxMVRMRE5hbWVzLlVSTjsKLQotCVN0cmluZyBOQU1FID0gSlNQMTFUTEROYW1lcy5OQU1FOwotCVN0cmluZyBURUlfQ0xBU1MgPSAidGVpLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQUdfQ0xBU1MgPSAidGFnLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBCT0RZX0NPTlRFTlQgPSAiYm9keS1jb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSSUJVVEUgPSBKU1AxMVRMRE5hbWVzLkFUVFJJQlVURTsKLQotCVN0cmluZyBJRCA9IEpTUDExVExETmFtZXMuSUQ7Ci0JU3RyaW5nIFJFUVVJUkVEID0gSlNQMTFUTEROYW1lcy5SRVFVSVJFRDsKLQlTdHJpbmcgUlRFWFBSVkFMVUUgPSBKU1AxMVRMRE5hbWVzLlJURVhQUlZBTFVFOwotCi0JU3RyaW5nIFBSRUZJWCA9IEpTUDExVExETmFtZXMuUFJFRklYOwotCi0JU3RyaW5nIElOQ0xVREUgPSBKU1AxMVRMRE5hbWVzLklOQ0xVREU7Ci0JU3RyaW5nIEZJTEUgPSBKU1AxMVRMRE5hbWVzLkZJTEU7Ci0KLQlTdHJpbmcgVFJVRSA9IEpTUDExVExETmFtZXMuVFJVRTsKLQlTdHJpbmcgRkFMU0UgPSBKU1AxMVRMRE5hbWVzLkZBTFNFOwotCVN0cmluZyBZRVMgPSBKU1AxMVRMRE5hbWVzLllFUzsKLQlTdHJpbmcgTk8gPSBKU1AxMVRMRE5hbWVzLk5POwotCi0JLyoKLQkgKiBAc2VlIEVjbGlwc2UgSlNQIDEuMgotCSAqLwotCVN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRElTUExBWV9OQU1FID0gImRpc3BsYXktbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU01BTExfSUNPTiA9ICJzbWFsbC1pY29uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBMQVJHRV9JQ09OID0gImxhcmdlLWljb24iOyAvLyROT04tTkxTLTEkCi0KLQotCVN0cmluZyBWQUxJREFUT1IgPSAidmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQUxJREFUT1JfQ0xBU1MgPSAidmFsaWRhdG9yLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQUxJREFUT1JfSU5JVF9QQVJBTSA9ICJpbml0LXBhcmFtIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQUxJREFUT1JfUEFSQU1fTkFNRSA9ICJwYXJhbS1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQUxJREFUT1JfUEFSQU1fVkFMVUUgPSAicGFyYW0tdmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQotCVN0cmluZyBMSVNURU5FUiA9ICJsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTElTVEVORVJfQ0xBU1MgPSAibGlzdGVuZXItY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVkFSSUFCTEUgPSAidmFyaWFibGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX05BTUVfR0lWRU4gPSAibmFtZS1naXZlbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfTkFNRV9GUk9NX0FUVFJJQlVURSA9ICJuYW1lLWZyb20tYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9DTEFTUyA9ICJ2YXJpYWJsZS1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfREVDTEFSRSA9ICJkZWNsYXJlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9TQ09QRSA9ICJzY29wZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfU0NPUEVfTkVTVEVEID0gIk5FU1RFRCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfU0NPUEVfQVRfQkVHSU4gPSAiQVRfQkVHSU4iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX1NDT1BFX0FUX0VORCA9ICJBVF9FTkQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMjBUTEROYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDIwVExETmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyYWU2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMjBUTEROYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi0vKiBubHNYWFggKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQMjBUTEROYW1lcyBleHRlbmRzIEpTUDEyVExETmFtZXMgewotCVN0cmluZyBDT05URU5UX1NDUklQVExFU1MgPSAic2NyaXB0bGVzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRVhBTVBMRSA9ICJleGFtcGxlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGUkFHTUVOVCA9ICJmcmFnbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRlVOQ1RJT04gPSAiZnVuY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZVTkNUSU9OX0NMQVNTID0gImZ1bmN0aW9uLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGVU5DVElPTl9FWFRFTlNJT04gPSAiZnVuY3Rpb24tZXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGVU5DVElPTl9TSUdOQVRVUkUgPSAiZnVuY3Rpb24tc2lnbmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJQ09OID0gImljb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBBVEggPSAicGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFHX0VYVEVOU0lPTiA9ICJ0YWctZXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQUdfRklMRSA9ICJ0YWctZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUQUdESVIgPSAidGFnZGlyIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFRBR0xJQl9FWFRFTlNJT04gPSAidGFnbGliLWV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBEWU5BTUlDX0FUVFJJQlVURVMgPSAiZHluYW1pYy1hdHRyaWJ1dGVzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTQ1JJUFRJTkdfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIElNUE9SVCA9ICJpbXBvcnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIElTX0VMX0lHTk9SRUQgPSAiaXNFTElnbm9yZWQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBBR0VfRU5DT0RJTkcgPSAicGFnZUVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX0FMSUFTID0gImFsaWFzIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExEQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1N2VlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExEQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gYXR0cmlidXRlIGRlZmluaXRpb24gZnJvbSBhIFRMRAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRMREF0dHJpYnV0ZURlY2xhcmF0aW9uIGV4dGVuZHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0KLQkvKioKLQkgKiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqIEBzZWUgIEpTUCAyLjAKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQkKLQkvKioKLQkgKiB0aGUgYXR0cmlidXRlJ3MgbmFtZQotCSAqIEBzZWUgIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCUNNRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpOwotCi0JLyoqCi0JICogd2hldGhlciB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgYXQgcnVudGltZSBieSBhbiBleHByZXNzaW9uCi0JICogQHNlZSAgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRSdGV4cHJ2YWx1ZSgpOwotCi0JLyoqCi0JICogdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlCi0JICogQHNlZSAgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIGlzIGEgZnJhZ21lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGlzRnJhZ21lbnQoKTsKLQkKLQkvKioKLQkgKiBpZiB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsCi0JICogQHNlZSAgSlNQIDEuMQotCSAqLwotCWJvb2xlYW4gaXNSZXF1aXJlZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExERG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEzNTFlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExERG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotcHVibGljIGludGVyZmFjZSBUTEREb2N1bWVudCBleHRlbmRzIENNRG9jdW1lbnQgewotCi0JU3RyaW5nIENNX0tJTkQgPSAiQ29udGVudCBNb2RlbCBLaW5kIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfVExEID0gIkpTUCBUYWcgTGlicmFyeSBEZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHNlZSAgSlNQIDIuMAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSBUaGUgY29udGVudHMgb2YgdGhlICJkZXNjcmlwdGlvbiIgZWxlbWVudCBvZiBhIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcjsgYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICJ1c2UiIG9mIHRoaXMgdGFnbGliLCBzaG91bGQgYmUgdXNlciBkaXNjZXJuYWJsZS4KLQkgKiBAc2VlICBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIFRoZSBjb250ZW50cyBvZiB0aGUgImRpc3BsYXktbmFtZSIgZWxlbWVudCBvZiBhIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcjsgaXQgaXMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzCi0JICogQHNlZSAgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBMaXN0IC0gQSBsaXN0IG9mIGV4dGVuc2lvbiBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSB0YWcgbGlicmFyeQotCSAqIEBzZWUgIEpTUCAyLjAKLQkgKi8KLQlMaXN0IGdldEV4dGVuc2lvbnMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIExpc3QgLSBBIGxpc3Qgb2YgVExERnVuY3Rpb25zIGRlc2NyaWJpbmcgdGhlIGRlY2xhcmVkIGZ1bmN0aW9ucwotCSAqIEBzZWUgIEpTUCAyLjAKLQkgKi8KLQlMaXN0IGdldEZ1bmN0aW9ucygpOwotCQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIGNvbnRlbnRzIG9mIHRoZSAiaW5mbyIgZWxlbWVudCBvZiBhIEpTUCAxLjEgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcjsgYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICJ1c2UiIG9mIHRoaXMgdGFnbGliLCBzaG91bGQgYmUgdXNlciBkaXNjZXJuYWJsZS4KLQkgKiBAc2VlICBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldEluZm8oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIHZlcnNpb24gb2YgSlNQIHRoZSB0YWcgbGlicmFyeSBkZXBlbmRzIHVwb24KLQkgKiBAc2VlICBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldEpzcHZlcnNpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIGNvbnRlbnRzIG9mIHRoZSAibGFyZ2UtaWNvbiIgZWxlbWVudCBvZiBhIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcjsgb3B0aW9uYWwgbGFyZ2UtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0JICogQHNlZSAgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXRMYXJnZUljb24oKTsKLQotCS8qKgotCSAqIEBzZWUgIEpTUCAxLjIKLQkgKiBAcmV0dXJuIExpc3QgLSBhIExpc3Qgb2YgVExETGlzdGVuZXJzCi0JICovCi0JTGlzdCBnZXRMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gQSBzaW1wbGUgZGVmYXVsdCBzaG9ydCBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieSBhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUgbmFtZXMgd2l0aCBhIG1uZW1vbmljIHZhbHVlOyBmb3IgZXhhbXBsZSwgaXQgbWF5IGJlIHVzZWQgYXMgdGhlIHByZWZlcnJlZCBwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMKLQkgKiBAc2VlICBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldFNob3J0bmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSBUaGUgY29udGVudHMgb2YgdGhlICJzbWFsbC1pY29uIiBlbGVtZW50IG9mIGEgSlNQIDEuMiB0YWcgbGlicmFyeSBkZXNjcmlwdG9yOyBvcHRpb25hbCBzbWFsbC1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLQkgKiBAc2VlICBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldFNtYWxsSWNvbigpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSBUaGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgKGl0J3MgaW1wbGVtZW50YXRpb24pCi0JICogQHNlZSAgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRUbGlidmVyc2lvbigpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgVVJJIGRlY2xhcmVkIHdpdGhpbiB0aGUgZGVzY3JpcHRvcgotCSAqIEBzZWUgIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBAc2VlICBKU1AgMS4yCi0JICovCi0JVExEVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREVsZW1lbnREZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDM0OTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERFbGVtZW50RGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFRMREVsZW1lbnREZWNsYXJhdGlvbiBleHRlbmRzIENNRWxlbWVudERlY2xhcmF0aW9uIHsKLQkvKiogCi0JICogUHJvcGVydHkgc3RhdGluZyB3aGV0aGVyIHRoZSB7QGxpbmsgQ01FbGVtZW50RGVjbGFyYXRpb259Ci0JICogaXMgYSBsaWJyYXJ5IHRhZyBvciBub3QKLQkgKi8KLQlTdHJpbmcgSVNfTElCUkFSWV9UQUcgPSAiaXNMaWJyYXJ5VGFnIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBUQUdfU09VUkNFID0gIlRhZyBEZWZpbml0aW9uIFNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU09VUkNFX0pTUF9UTEQgPSAiSlNQIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNPVVJDRV9UQUdfRklMRSA9ICJKU1AgVGFnIDIuMCBGaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGJvZHkgY29udGVudCB0eXBlCi0JICogCi0JICogQHNlZSBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldEJvZHljb250ZW50KCk7Ci0KLQkvKioKLQkgKiBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLQkgKiAKLQkgKiBAc2VlIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBieSB0b29scwotCSAqIAotCSAqIEBzZWUgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZGVjbGFyZWQgdGFnIGhhbmRsZXIgc3VwcG9ydHMgZHluYW1pYyBhdHRyaWJ1dGVzLiBJdAotCSAqIGlzIG5vdCBhIGd1YXJhbnRlZSB0aGF0IHRoZSBjbGFzcyBpdHNlbGYgaW1wbGVtZW50cwotCSAqIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5EeW5hbWljQXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAc2VlIEpTUCAyLjAKLQkgKi8KLQlTdHJpbmcgZ2V0RHluYW1pY0F0dHJpYnV0ZXMoKTsKLQkKLQkvKioKLQkgKiBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgdGFnCi0JICogCi0JICogQHNlZSBKU1AgMi4wCi0JICovCi0JU3RyaW5nIGdldEV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZywKLQkgKiBmb3IgdG9vbCBjb25zdW1wdGlvbgotCSAqIAotCSAqIEBzZWUgSlNQIDIuMAotCSAqLwotCUxpc3QgZ2V0RXh0ZW5zaW9ucygpOwotCi0JLyoqCi0JICogT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0JICogCi0JICogQHNlZSBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldEluZm8oKTsKLQotCS8qKgotCSAqIE5hbWUgb2YgYW4gb3B0aW9uYWwgbGFyZ2UgaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0JICogCi0JICogQHNlZSBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldExhcmdlSWNvbigpOwotCi0JQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBXaGVyZSB0byBmaW5kIHRoZSAudGFnIGZpbGUgaW1wbGVtZW50aW5nIHRoaXMgYWN0aW9uLCByZWxhdGl2ZSB0byB0aGUKLQkgKiByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gb3IgdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlIGZvciBhIHRhZwotCSAqIGxpYnJhcnkgcGFja2FnZWQgaW4gYSBKQVIuIFRoaXMgbXVzdCBiZWdpbiB3aXRoIC9XRUItSU5GL3RhZ3MgaWYgdGhlCi0JICogLnRhZyBmaWxlIHJlc2lkZXMgaW4gdGhlIFdBUiwgb3IgL01FVEEtSU5GL3RhZ3MgaWYgdGhlIC50YWcgZmlsZQotCSAqIHJlc2lkZXMgaW4gYSBKQVIuCi0JICogCi0JICogCi0JICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgLnRhZyh4KSBmaWxlIGFzIGRlZmluZWQgaW4gdGhlIC50bGQgZmlsZSwgbnVsbAotCSAqICAgICAgICAgaWYgaW50ZXJuYWwgdG8gdGhlIC50bGQKLQkgKiBAc2VlIEpTUCAyLjAKLQkgKi8KLQlTdHJpbmcgZ2V0UGF0aCgpOwotCi0JLyoqCi0JICogTmFtZSBvZiBhbiBvcHRpb25hbCBzbWFsbCBpY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLQkgKiAKLQkgKiBAc2VlIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0U21hbGxJY29uKCk7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nCi0JICogamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZwotCSAqIAotCSAqIEBzZWUgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRUYWdjbGFzcygpOwotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgYW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YKLQkgKiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCi0JICogCi0JICogQHNlZSBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldFRlaWNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAc2VlIEpTUCAxLjIKLQkgKiBAcmV0dXJuIExpc3Qgb2YgVExEVmFyaWFibGVzCi0JICovCi0JTGlzdCBnZXRWYXJpYWJsZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERGdW5jdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREZ1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0M2U5NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotcHVibGljIGludGVyZmFjZSBUTERGdW5jdGlvbiB7Ci0KLQlTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7Ci0JCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQlTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCVN0cmluZyBnZXRFeGFtcGxlKCk7Ci0KLQlMaXN0IGdldEV4dGVuc2lvbnMoKTsKLQotCVN0cmluZyBnZXRJY29uKCk7Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCk7Ci0KLQlTdHJpbmcgZ2V0U2lnbmF0dXJlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExESW5pdFBhcmFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExESW5pdFBhcmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZDA5YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREluaXRQYXJhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi0KLS8qKgotICogQSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gYWxvbmcgd2l0aCBhIGRlc2NyaXB0aW9uCi0gKiBAc2VlIEpTUCAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBUTERJbml0UGFyYW0gewotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBwYXJhbWV0ZXIuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExETGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDZmMGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi0KLS8qKgotICogRGVmaW5lcyBhbiBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBvYmplY3QgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCByZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkKLSAqIEBzZWUgSlNQIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRMRExpc3RlbmVyIHsKLQlTdHJpbmcgZ2V0TGlzdGVuZXJDbGFzcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWVlNzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogRGVmaW5lcyBhbiBvcHRpb25hbCB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5Ci0gKiBAc2VlIEpTUCAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBUTERWYWxpZGF0b3IgewotCS8qKgotCSAqIEByZXR1cm4gTGlzdCAtIGEgTGlzdCBvZiBUTERJbml0UGFyYW1zCi0JICovCi0JTGlzdCBnZXRJbml0UGFyYW1zKCk7Ci0KLQlTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERWYXJpYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTM4MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhcmlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogSW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMgZGVmaW5lZCBieSB0aGlzIHRhZy4KLSAqIAotICogQHNlZSBKU1AgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVExEVmFyaWFibGUgewotCi0JLyoqCi0JICogV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQgb3Igbm90LCB0cnVlIGlzIHRoZSBkZWZhdWx0LgotCSAqLwotCWJvb2xlYW4gZ2V0RGVjbGFyZSgpOwotCi0JLyoqCi0JICogQHJldHVybnRoZSB0aGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgdmFyaWFibGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUgd2lsbCBnaXZlIHRoZQotCSAqIG5hbWUgb2YgdGhlIHZhcmlhYmxlLCBvciBudWxsIG9mIHRoZSBuYW1lIGlzIG5vdCB0byBiZSBvYnRhaW5lZCB0aGlzCi0JICogd2F5LgotCSAqLwotCVN0cmluZyBnZXROYW1lRnJvbUF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogVGhlIHZhcmlhYmxlIG5hbWUgZ2l2ZW4gYXMgYSBjb25zdGFudCwgb3IgbnVsbCBvZiB0aGUgbmFtZSBpcyBub3QKLQkgKiBzcGVjaWZpZWQuCi0JICovCi0JU3RyaW5nIGdldE5hbWVHaXZlbigpOwotCi0JLyoqCi0JICogVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgZGVmaW5lZC4KLQkgKi8KLQlTdHJpbmcgZ2V0U2NvcGUoKTsKLQotCS8qKgotCSAqIE5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSB2YXJpYWJsZSwgamF2YS5sYW5nLlN0cmluZyBpZiBudWxsCi0JICovCi0JU3RyaW5nIGdldFZhcmlhYmxlQ2xhc3MoKTsKLQotCS8qKgotCSAqIEEgbG9jYWxseSBzY29wZWQgYXR0cmlidXRlIHRvIGhvbGQgdGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUKLQkgKi8KLQlTdHJpbmcgZ2V0QWxpYXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0pTUEZDb250ZW50UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWNlOTA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJvcGVydGllcyBjb25zdGFudHMgdXNlZCBieSBKU1AgRnJhZ21lbnRzLiBDbGllbnRzIHNob3VsZCBvbmx5IHJlYWQgYW5kCi0gKiBtb2RpZnkgdGhlIEpTUCBGcmFnbWVudCBwcm9wZXJ0aWVzIHByb2dyYW1tYXRpY2FsbHkgdXNpbmcgdGhpcyBjbGFzcy4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUENPUkVfSUQgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9LRVkgPSAiPHByb2plY3Q+IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBuYW1lZCBrZXkgdGhhdCBjb250cm9scyB0aGUgZGVmYXVsdCBsYW5ndWFnZSBmb3IgSlNQIEZyYWdtZW50cwotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUExBTkdVQUdFID0gImpzcC1sYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBBIG5hbWVkIGtleSB0aGF0IGNvbnRyb2xzIHRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZSBmb3IgSlNQIEZyYWdtZW50cwotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUENPTlRFTlRUWVBFID0gImpzcC1jb250ZW50LXR5cGUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIEpTUCBmcmFnbWVudHMgc2hvdWxkIGJlIGNvbXBpbGVkL3ZhbGlkYXRlZC4gSlNQIGZyYWdtZW50cwotCSAqIHdpbGwgYmUgdmFsaWRhdGVkIHdoZW4gdHJ1ZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9GUkFHTUVOVFMgPSAidmFsaWRhdGVGcmFnbWVudHMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdlbmVyYXRlcyBhIHByZWZlcmVuY2Uga2V5IGJhc2VkIG9uIHJlc291cmNlUGF0aAotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRoZSBrZXkgd2lsbCBiZSBiYXNlZCBvZmYgb2YKLQkgKiBAcmV0dXJuIHByZWZlcmVuY2Uga2V5IGJhc2VkIG9uIHJlc291cmNlUGF0aCAoYmFzaWNhbGx5IHRoZQotCSAqICAgICAgICAgcmVzb3VyY2VQYXRoIHdpdGhvdXQgdGhlIGZpbGVuYW1lKTsgUFJPSkVDVF9LRVkgaWYgcmVzb3VyY2VQYXRoCi0JICogICAgICAgICBpcyBudWxsCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRLZXlGb3IoSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCVN0cmluZyBrZXkgPSBQUk9KRUNUX0tFWTsKLQkJaWYgKHJlc291cmNlUGF0aCAhPSBudWxsICYmIHJlc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWtleSA9IHJlc291cmNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByZWZlcmVuY2VzIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IHNjb3BlIGFuZAotCSAqIHByZWZlcmVuY2Uga2V5IChzdWJOb2RlKSBJZiBjcmVhdGUgaXMgdHJ1ZSwgdGhlIHByZWZlcmVuY2Ugbm9kZSB3aWxsIGJlCi0JICogY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB0aGUgcHJlZmVyZW5jZSBub2RlIGlzIHVuZGVyCi0JICogQHBhcmFtIHByZWZlcmVuY2VLZXkKLQkgKiAgICAgICAgICAgIHRoZSBzdWJub2RlL2NhdGVnb3J5IHRoZSBwcmVmZXJlbmNlIG5vZGUgaXMgbG9jYXRlZCBpbgotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIGEgcHJlZmVyZW5jZSBub2RlIHdpbGwgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QKLQkgKiAgICAgICAgICAgIGFscmVhZHkgZXhpc3QKLQkgKiBAcmV0dXJuIFByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvamVjdCBzY29wZSBhbmQKLQkgKiAgICAgICAgIHByZWZlcmVuY2Uga2V5LiBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgZm91bmQgYW5kIGNyZWF0ZSBpcwotCSAqICAgICAgICAgZmFsc2UKLQkgKi8KLQlzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByZWZlcmVuY2VLZXksIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCWlmIChjcmVhdGUpCi0JCQkvLyBjcmVhdGUgYWxsIG5vZGVzIGRvd24gdG8gdGhlIG9uZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbgotCQkJcmV0dXJuIG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdCkuZ2V0Tm9kZShKU1BDT1JFX0lEKS5ub2RlKHByZWZlcmVuY2VLZXkpOwotCQkvLyBiZSBjYXJlZnVsIGxvb2tpbmcgdXAgZm9yIG91ciBub2RlIHNvIG5vdCB0byBjcmVhdGUgYW55IG5vZGVzIGFzCi0JCS8vIHNpZGUgZWZmZWN0Ci0JCVByZWZlcmVuY2VzIG5vZGUgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRSb290Tm9kZSgpLm5vZGUoUHJvamVjdFNjb3BlLlNDT1BFKTsKLQkJdHJ5IHsKLQkJCS8vIFRPRE8gb25jZSBidWcgOTA1MDAgaXMgZml4ZWQsIHNob3VsZCBiZSBhcyBzaW1wbGUgYXMgdGhpczoKLQkJCS8vIFN0cmluZyBwYXRoID0gcHJvamVjdC5nZXROYW1lKCkgKyBJUGF0aC5TRVBBUkFUT1IgKwotCQkJLy8gUmVzb3VyY2VzUGx1Z2luLlBJX1JFU09VUkNFUyArIElQYXRoLlNFUEFSQVRPUiArCi0JCQkvLyBFTkNPRElOR19QUkVGX05PREU7Ci0JCQkvLyByZXR1cm4gbm9kZS5ub2RlRXhpc3RzKHBhdGgpID8gbm9kZS5ub2RlKHBhdGgpIDogbnVsbDsKLQkJCS8vIGZvciBub3csIHRha2UgdGhlIGxvbmcgd2F5Ci0JCQlpZiAoIW5vZGUubm9kZUV4aXN0cyhwcm9qZWN0LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5ub2RlKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKEpTUENPUkVfSUQpKQotCQkJCXJldHVybiBudWxsOwotCQkJbm9kZSA9IG5vZGUubm9kZShKU1BDT1JFX0lEKTsKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKHByZWZlcmVuY2VLZXkpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIG5vZGUubm9kZShwcmVmZXJlbmNlS2V5KTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vZGVFeGlzdHMgZmFpbGVkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IHJldHJpZXZlIHByZWZlcmVuY2Ugbm9kZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IGtleQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY29udGV4dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjb250ZXh0IGlzCi0JICogICAgICAgICAgICBhdmFpbGFibGUgYW5kIHRoZSB3b3Jrc3BhY2Ugc2V0dGluZyBzaG91bGQgYmUgdGFrZW4uIE5vdGUKLQkgKiAgICAgICAgICAgIHRoYXQgcGFzc2luZyA8Y29kZT5udWxsPC9jb2RlPiBzaG91bGQgYmUgYXZvaWRlZC4KLQkgKiBAcGFyYW0gcmVjdXJzZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgcGFyZW50IHNob3VsZCBiZSBxdWVyaWVkIHRpbGwgcHJvcGVydHkgaXMgZm91bmQKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBrZXkuCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXksIElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiByZWN1cnNlKSB7Ci0JCVN0cmluZyB2YWwgPSBudWxsOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKHByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJCXZhbCA9IGludGVybmFsR2V0UHJvcGVydHkocmVzb3VyY2UsIHJlY3Vyc2UsIHByZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gbm8gcHJlZmVyZW5jZXMgZm91bmQgLSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywKLQkJLy8gc2hvcnQtY2lyY3VpdAotCQkvLyBsb29rdXAgYnkgZmFsbGluZyBiYWNrIHRvIHdvcmtzcGFjZSdzIGRlZmF1bHQKLQkJLy8gc2V0dGluZwotCQlpZiAodmFsID09IG51bGwgJiYgcmVjdXJzZSkKLQkJCXZhbCA9IGdldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJcmV0dXJuIHZhbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0V29ya2JlbmNoUHJlZmVyZW5jZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoSlNQQ09SRV9JRCwga2V5LCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgaW50ZXJuYWxHZXRQcm9wZXJ0eShJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gcmVjdXJzZSwgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKLQkJU3RyaW5nIHZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSwgbnVsbCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsICYmIHJlc291cmNlICE9IHJlc291cmNlLmdldFByb2plY3QoKSAmJiByZWN1cnNlKSB7Ci0JCQl2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChnZXRLZXlGb3IobnVsbCksIG51bGwpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGNvbnRleHQuIE5vdGUgY29udGV4dCBjYW5ub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGtleS4gSWYgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIHRoZSBrZXkgaXMgcmVtb3ZlZCBmcm9tIHByb3BlcnRpZXMuCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKHByb2plY3QsIGtleSwgdHJ1ZSk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkJCXByZWZlcmVuY2VzLnJlbW92ZShnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCWVsc2UKLQkJCQkJcHJlZmVyZW5jZXMucHV0KGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSwgdmFsdWUpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIHNhdmUgY2hhbmdlcwotCQkJCQlwcmVmZXJlbmNlcy5mbHVzaCgpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKU1BDT1JFX0lELCBJU3RhdHVzLkVSUk9SLCAiVW5hYmxlIHRvIHNldCBwcm9wZXJ0eSIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyBqdXN0IHNldCBhIHByZWZlcmVuY2UgaW4gdGhlIGluc3RhbmNlIHNjb3BlCi0JCS8vIGlmICghcHJlZmVyZW5jZUZvdW5kKSB7Ci0JCS8vIHNldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJLy8gfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2Q0Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotcHVibGljIGNsYXNzIEpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXIgewotCXB1YmxpYyBKU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCWZKb2IgPSBuZXcgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlciBfaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgZlJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0JQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iIGZKb2I7Ci0KLQkvKioKLQkgKiBUaGlzIGpvYiBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIGFsbG93IHRoZSByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXIKLQkgKiB0byBzY2hlZHVsZSBvcGVyYXRpb25zIHRoYXQgbmVlZCB0byBtb2RpZnkgdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUSUVTX1VQREFURV9ERUxBWSA9IDUwMDsKLQkJcHJpdmF0ZSBMaXN0IGFzeW5jQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCkgewotCQkJc3VwZXIoSlNQQ29yZU1lc3NhZ2VzLkpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQkJc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZENoYW5nZXMoU2V0IG5ld0NoYW5nZXMpIHsKLQkJCWlmIChuZXdDaGFuZ2VzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCWFzeW5jQ2hhbmdlcy5hZGRBbGwobmV3Q2hhbmdlcyk7Ci0JCQkJYXN5bmNDaGFuZ2VzLm5vdGlmeSgpOwotCQkJfQotCQkJc2NoZWR1bGUoUFJPUEVSVElFU19VUERBVEVfREVMQVkpOwotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldE5leHRDaGFuZ2UoKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiBhc3luY0NoYW5nZXMuaXNFbXB0eSgpID8gbnVsbCA6IChJUHJvamVjdCkgYXN5bmNDaGFuZ2VzLnJlbW92ZShhc3luY0NoYW5nZXMuc2l6ZSgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlNdWx0aVN0YXR1cyByZXN1bHQgPSBuZXcgTXVsdGlTdGF0dXMoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUENPUkVfSUQsIElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VULCBKU1BDb3JlTWVzc2FnZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZywgbnVsbCk7Ci0JCQltb25pdG9yID0gbW9uaXRvciA9PSBudWxsID8gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSA6IG1vbml0b3I7Ci0JCQl0cnkgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKEpTUENvcmVNZXNzYWdlcy5KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nLCBhc3luY0NoYW5nZXMuc2l6ZSgpKTsKLQkJCQl0cnkgewotCQkJCQlJUHJvamVjdCBuZXh0OwotCQkJCQl3aGlsZSAoKG5leHQgPSBnZXROZXh0Q2hhbmdlKCkpICE9IG51bGwpIHsKLQkJCQkJCS8vIGp1c3QgZXhpdCBpZiB0aGUgc3lzdGVtIGlzIHNodXR0aW5nIGRvd24gb3IgaGFzCi0JCQkJCQkvLyBiZWVuIHNodXQgZG93bgotCQkJCQkJLy8gaXQgaXMgdG9vIGxhdGUgdG8gY2hhbmdlIHRoZSB3b3Jrc3BhY2UgYXQgdGhpcwotCQkJCQkJLy8gcG9pbnQgYW55d2F5Ci0JCQkJCQlpZiAoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5vc2dpIikuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIHNhdmUgdGhlIHByZWZlcmVuY2VzIG5vZGVzCi0JCQkJCQkJaWYgKG5leHQuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJLy8gc2F2ZSBjb250ZW50IHR5cGUgcHJlZmVyZW5jZXMKLQkJCQkJCQkJUHJlZmVyZW5jZXMgcHJvamVjdFByZWZzID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKG5leHQsIEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BDT05URU5UVFlQRSwgZmFsc2UpOwotCQkJCQkJCQlpZiAocHJvamVjdFByZWZzICE9IG51bGwpCi0JCQkJCQkJCQlwcm9qZWN0UHJlZnMuZmx1c2goKTsKLQkJCQkJCQkJLy8gc2F2ZSBsYW5ndWFnZSBwcmVmZXJlbmNlcwotCQkJCQkJCQlwcm9qZWN0UHJlZnMgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMobmV4dCwgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBmYWxzZSk7Ci0JCQkJCQkJCWlmIChwcm9qZWN0UHJlZnMgIT0gbnVsbCkKLQkJCQkJCQkJCXByb2plY3RQcmVmcy5mbHVzaCgpOwotCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gd2UgZ290IGFuIGVycm9yIHNhdmluZwotCQkJCQkJCVN0cmluZyBkZXRhaWxNZXNzYWdlID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmcsIG5leHQuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKDEgPDwgKElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VUICUgMTAwIC8gMzMpLCBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTLCBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1NFVFRJTkdfQ0hBUlNFVCwgZGV0YWlsTWVzc2FnZSwgZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCQljYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3Nob3VsZFJ1bigpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSdW4oKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiAhYXN5bmNDaGFuZ2VzLmlzRW1wdHkoKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgdm9pZCBwcm9jZXNzRW50cnlDaGFuZ2VzKElSZXNvdXJjZURlbHRhIHByb2plY3REZWx0YSwgU2V0IHByb2plY3RzVG9TYXZlKSB7Ci0JCQkvLyBjaGVjayBlYWNoIHJlc291cmNlIHdpdGgganNwIGZyYWdtZW50IHNldHRpbmcgdG8gc2VlIGlmIGl0IGhhcwotCQkJLy8gYmVlbiBtb3ZlZC9kZWxldGVkCi0JCQlib29sZWFuIHJlc291cmNlQ2hhbmdlcyA9IGZhbHNlOwotCQkJYm9vbGVhbiByZXNvdXJjZUNoYW5nZXMyID0gZmFsc2U7Ci0KLQkJCS8vIHByb2plY3QgYWZmZWN0ZWQKLQkJCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gKElQcm9qZWN0KSBwcm9qZWN0RGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCQkJcmVzb3VyY2VDaGFuZ2VzID0gcHJvY2Vzc1ByZWZlcmVuY2VzKGN1cnJlbnRQcm9qZWN0LCBKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQQ09OVEVOVFRZUEUsIHByb2plY3REZWx0YSwgcHJvamVjdHNUb1NhdmUpOwotCQkJcmVzb3VyY2VDaGFuZ2VzMiA9IHByb2Nlc3NQcmVmZXJlbmNlcyhjdXJyZW50UHJvamVjdCwgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBwcm9qZWN0RGVsdGEsIHByb2plY3RzVG9TYXZlKTsKLQotCQkJLy8gaWYgdGhlcmUgd2FzIGEgcHJlZmVyZW5jZSBrZXkgY2hhbmdlLCBuZWVkIHRvIHNhdmUgcHJlZmVyZW5jZXMKLQkJCWlmIChyZXNvdXJjZUNoYW5nZXMgfHwgcmVzb3VyY2VDaGFuZ2VzMikKLQkJCQlwcm9qZWN0c1RvU2F2ZS5hZGQoY3VycmVudFByb2plY3QpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdvZXMgdGhyb3VnaCBhbGwgdGhlIHJlc291cmNlLWRlcGVuZGVudCBwcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGgKLQkJICogY3VycmVudFByb2plY3QgJiBrZXkgYW5kIHVwZGF0ZXMgdGhlIHByZWZlcmVuY2Uga2V5cyBpZiBuZWVkZWQKLQkJICogYmFzZWQgb24gcHJvamVjdERlbHRhCi0JCSAqIAotCQkgKiBAcGFyYW0gY3VycmVudFByb2plY3QKLQkJICogICAgICAgICAgICBjdXJyZW50IHByb2plY3Qgb2YgdGhlIHByZWZlcmVuY2VzIHRvIGJlIGxvb2tlZCBhdAotCQkgKiBAcGFyYW0ga2V5Ci0JCSAqICAgICAgICAgICAgY3VycmVudCBrZXkvc3ViY2F0ZWdvcnkgb2YgdGhlIHByZWZlcmVuY2VzIHRvIGJlIGxvb2tlZAotCQkgKiAgICAgICAgICAgIGF0Ci0JCSAqIEBwYXJhbSBwcm9qZWN0RGVsdGEKLQkJICogICAgICAgICAgICB0aGUgY2hhbmdlcyB0byBwcm9jZXNzIHRoZSBwcmVmZXJlbmNlIGtleXMgYWdhaW5zdAotCQkgKiBAcGFyYW0gcHJvamVjdHNUb1NhdmUKLQkJICogICAgICAgICAgICB0aGUgcHJvamVjdHMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQvc2F2ZWQKLQkJICogQHJldHVybiB0cnVlIGlmIGN1cnJlbnRQcm9qZWN0J3MgcHJlZmVyZW5jZXMgd2VyZSBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NQcmVmZXJlbmNlcyhJUHJvamVjdCBjdXJyZW50UHJvamVjdCwgU3RyaW5nIGtleSwgSVJlc291cmNlRGVsdGEgcHJvamVjdERlbHRhLCBTZXQgcHJvamVjdHNUb1NhdmUpIHsKLQkJCWJvb2xlYW4gcmVzb3VyY2VDaGFuZ2VzID0gZmFsc2U7Ci0KLQkJCS8vIGdldCB0aGUgcHJvamVjdC1rZXkgcHJlZmVyZW5jZSBub2RlCi0JCQlQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZnMgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMoY3VycmVudFByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJaWYgKHByb2plY3RQcmVmcyA9PSBudWxsKQotCQkJCS8vIG5vIHByZWZlcmVuY2VzIGZvciB0aGlzIHByb2plY3Qta2V5LCBqdXN0IGJhaWwKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdbXSBhZmZlY3RlZFJlc291cmNlczsKLQkJCXRyeSB7Ci0JCQkJYWZmZWN0ZWRSZXNvdXJjZXMgPSBwcm9qZWN0UHJlZnMua2V5cygpOwotCQkJfQotCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJvYmxlbXMgd2l0aCB0aGUgcHJvamVjdCBzY29wZS4uLiB3ZSBnb25uYSBtaXNzIHRoZQotCQkJCS8vIGNoYW5nZXMgKGJ1dCB3aWxsIGxvZykKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiUHJvYmxlbSByZXRyZWl2aW5nIEpTUCBGcmFnbWVudCBwcmVmZXJlbmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBnbyB0aHJvdWdoIGVhY2ggcHJlZmVyZW5jZSBrZXkgKHdoaWNoIGlzIHJlYWxseSBhIGZpbGUgbmFtZSkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWZmZWN0ZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBzZWUgaWYgcHJlZmVyZW5jZSBrZXkvZmlsZSBuYW1lIHdhcyBmaWxlIHRoYXQgd2FzIGNoYW5nZWQKLQkJCQlJUmVzb3VyY2VEZWx0YSBtZW1iZXJEZWx0YSA9IHByb2plY3REZWx0YS5maW5kTWVtYmVyKG5ldyBQYXRoKGFmZmVjdGVkUmVzb3VyY2VzW2ldKSk7Ci0JCQkJLy8gbm8gY2hhbmdlcyBmb3IgdGhlIGdpdmVuIHJlc291cmNlCi0JCQkJaWYgKG1lbWJlckRlbHRhID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChtZW1iZXJEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQlyZXNvdXJjZUNoYW5nZXMgPSB0cnVlOwotCQkJCQkvLyByZW1vdmUgdGhlIHNldHRpbmcgZm9yIHRoZSBvcmlnaW5hbCBsb2NhdGlvbgotCQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gcHJvamVjdFByZWZzLmdldChhZmZlY3RlZFJlc291cmNlc1tpXSwgbnVsbCk7Ci0JCQkJCXByb2plY3RQcmVmcy5yZW1vdmUoYWZmZWN0ZWRSZXNvdXJjZXNbaV0pOwotCQkJCQlpZiAoKG1lbWJlckRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkgewotCQkJCQkJLy8gaWYgbW92aW5nLCBjb3B5IHRoZSBzZXR0aW5nIGZvciB0aGUgbmV3IGxvY2F0aW9uCi0JCQkJCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG1lbWJlckRlbHRhLmdldE1vdmVkVG9QYXRoKCkuc2VnbWVudCgwKSk7Ci0JCQkJCQlQcmVmZXJlbmNlcyB0YXJnZXRQcmVmcyA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyh0YXJnZXRQcm9qZWN0LCBrZXksIHRydWUpOwotCQkJCQkJdGFyZ2V0UHJlZnMucHV0KEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRLZXlGb3IobWVtYmVyRGVsdGEuZ2V0TW92ZWRUb1BhdGgoKSksIGN1cnJlbnRWYWx1ZSk7Ci0JCQkJCQlpZiAodGFyZ2V0UHJvamVjdCAhPSBjdXJyZW50UHJvamVjdCkKLQkJCQkJCQlwcm9qZWN0c1RvU2F2ZS5hZGQodGFyZ2V0UHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzb3VyY2VDaGFuZ2VzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEZvciBhbnkgY2hhbmdlIHRvIHRoZSBlbmNvZGluZyBmaWxlIG9yIGFueSByZXNvdXJjZSB3aXRoIGVuY29kaW5nCi0JCSAqIHNldCwganVzdCBkaXNjYXJkIHRoZSBjYWNoZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSVJlc291cmNlRGVsdGFbXSBwcm9qZWN0RGVsdGFzID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJLy8gcHJvY2VzcyBlYWNoIHByb2plY3QgaW4gdGhlIGRlbHRhCi0JCQlTZXQgcHJvamVjdHNUb1NhdmUgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0RGVsdGFzLmxlbmd0aDsgaSsrKQotCQkJCS8vIG5vdGhpbmcgdG8gZG8gaWYgYSBwcm9qZWN0IGhhcyBiZWVuIGFkZGVkL3JlbW92ZWQvbW92ZWQKLQkJCQlpZiAocHJvamVjdERlbHRhc1tpXS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiAocHJvamVjdERlbHRhc1tpXS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgPT0gMCkKLQkJCQkJcHJvY2Vzc0VudHJ5Q2hhbmdlcyhwcm9qZWN0RGVsdGFzW2ldLCBwcm9qZWN0c1RvU2F2ZSk7Ci0JCQlmSm9iLmFkZENoYW5nZXMocHJvamVjdHNUb1NhdmUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlfaW5zdGFuY2UgPSBuZXcgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlfaW5zdGFuY2UgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MTExOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gImFkYXB0ZXIiIGNsYXNzLCBzaW1wbHkgdG8gZ2V0IGluIGlucHV0IHN0cmVhbSB0byBhY3QgbGlrZSBhCi0gKiByZWFkZXIuIFdlIGNvdWxkIG5vdCB1c2UgSW5wdXRTdHJlYW1SZWFkZXIgZGlyZWN0bHkgYmVjYXVzZSBpdHMgaW50ZXJuYWwKLSAqIGJ1ZmZlcnMgYXJlIG5vdCBjb250cm9sbGFibGUsIGFuZCBpdCBzb21ldGltZXMgcHVsbHMgdG9vIG11Y2ggb3V0IG9mIGlucHV0Ci0gKiBzdHJlYW0gKGV2ZW4gd2hlbiBpdCB3YXNuJ3QgbmVlZGVkIGZvciBvdXIgcHVycG9zZXMpLgotICogCi0gKiBUaGUgdXNlIG9mIHRoaXMgY2xhc3MgaXMgaGlnaGx5IHNwZWNpYWxpemVkIGFuZCBieSBub3QgbWVhbnMgbWVhbnQgdG8gYmUKLSAqIGdlbmVyYWwgcHVycG9zZS4gSXRzIHVzZSBpcyByZXN0cmljdGVkIHRvIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBpbnB1dAotICogc3RyZWFtIGNhbiBiZSByZWdhcmRlZCBhcyBhc2NpaSBqdXN0IGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB3aGF0IHRoZSByZWFsCi0gKiBlbmNvZGluZyBzaG91bGQgYmUuCi0gKi8KLQotcHVibGljIGNsYXNzIEJ5dGVSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IENvZGVkSU8uTUFYX0JVRl9TSVpFOwotCi0JcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOwotCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKLQotCXByb3RlY3RlZCBCeXRlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRoaXMoaW5wdXRTdHJlYW0sIERFRkFVTFRfQlVGRkVSX1NJWkUpOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBzaXplKSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5mQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ubWFyayhyZWFkQWhlYWRMaW1pdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGIwID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCgpOwotCQlyZXR1cm4gKGIwICYgMHgwMEZGKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjaFtdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobGVuZ3RoID4gdGhpcy5mQnVmZmVyLmxlbmd0aCkgewotCQkJbGVuZ3RoID0gdGhpcy5mQnVmZmVyLmxlbmd0aDsKLQkJfQotCi0JCWludCBjb3VudCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQodGhpcy5mQnVmZmVyLCAwLCBsZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGIwID0gdGhpcy5mQnVmZmVyW2ldOwotCQkJLy8gdGhlIDB4MDBGRiBpcyB0byAibG9zZSIgdGhlIG5lZ2F0aXZlIGJpdHMgZmlsbGVkIGluIHRoZSBieXRlIHRvCi0JCQkvLyBpbnQgY29udmVyc2lvbgotCQkJLy8gKGFuZCB3aGljaCB3b3VsZCBiZSB0aGVyZSBpZiBjYXN0IGRpcmVjdGx5IGZyb20gYnl0ZSB0byBjaGFyKS4KLQkJCWNoYXIgYzAgPSAoY2hhcikgKGIwICYgMHgwMEZGKTsKLQkJCWNoW29mZnNldCArIGldID0gYzA7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLnJlc2V0KCk7Ci0JfQotCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5za2lwKG4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlYzdiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLklDb250ZW50RGVzY3JpcHRpb25Gb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUZhbWlseUZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9ySlNQIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX1RZUEVfQVRUUklCVVRFLCBJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkxBTkdVQUdFX0FUVFJJQlVURSwgSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX0ZBTUlMWV9BVFRSSUJVVEV9OwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLklucHV0U3RyZWFtLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5WQUxJRDsKLQotCQkvLyBpZiBkaXNjcmlwdGlvbiBpcyBudWxsLCB3ZSBhcmUganVzdCBiZWluZyBhc2tlZCB0bwotCQkvLyBhc3Nlc3MgY29udGVudHMgdmFsaWRpdHkKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lVmFsaWRpdHkoSW5wdXRTdHJlYW0gY29udGVudHMpIHsKLQkJLy8gVGhlcmUncyBsaXR0bGUgdG8gcHJvdmUsIHZpYSBjb250ZW50cywgdGhhdAotCQkvLyBhIGZpbGUgaXMgSlNQLCBzbyBhbHdheXMgcmV0dXJuIGludGVybWluYW50LCBhbmQKLQkJLy8gbGV0IGZpbGV0eXBlcyBkZWNpZGUuCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uUmVhZGVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOVkFMSUQ7Ci0KLQkJLy8gaWYgZGlzY3JpcHRpb24gaXMgbnVsbCwgd2UgYXJlIGp1c3QgYmVpbmcgYXNrZWQgdG8KLQkJLy8gYXNzZXNzIGNvbnRlbnRzIHZhbGlkaXR5Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgaW50IGRldGVybWluZVZhbGlkaXR5KFJlYWRlciBjb250ZW50cykgewotCQkvLyBUaGVyZSdzIGxpdHRsZSB0byBwcm92ZSwgdmlhIGNvbnRlbnRzLCB0aGF0Ci0JCS8vIGEgZmlsZSBpcyBKU1AsIHNvIGFsd2F5cyByZXR1cm4gaW50ZXJtaW5hbnQsIGFuZAotCQkvLyBsZXQgZmlsZXR5cGVzIGRlY2lkZS4KLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJCXJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQkJcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuVkFMSUQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gaGFuZGxlIHN0YW5kYXJkIG9uZXMgZmlyc3QsIHRvIGJlIHN1cmUgZGV0ZWN0b3IgcHJvY2Vzc2VzCi0JCWhhbmRsZVN0YW5kYXJkQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCS8vIG5vdyBkbyB0aG9zZSBzcGVjaWZpYyBmb3IgSlNQcwotCQkvLyBub3RlOiBkZXRlY3RvciBzaG91bGQgYWx3YXlzIGJlIG9mIGNvcnJlY3QgaW5zdGFuY2UsIGJ1dCB3ZSdsbAotCQkvLyBjaGVjaywgZm9yIG5vdy4KLQkJaWYgKGRldGVjdG9yIGluc3RhbmNlb2YgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSB7Ci0JCQlKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IganNwRGV0ZWN0b3IgPSAoSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcjsKLQkJCVN0cmluZyBsYW5ndWFnZSA9IGpzcERldGVjdG9yLmdldExhbmd1YWdlKCk7Ci0JCQlpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiBsYW5ndWFnZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkxBTkdVQUdFX0FUVFJJQlVURSwgbGFuZ3VhZ2UpOwotCQkJfQotCQkJLyoKLQkJCSAqIGNvbnRlbnQgdHlwZSBpcyBsaXRlcmFsbHkgdGhlIGNvbnRlbnQgdHlwZSB0aGF0J3MgaW4gdGhlIHBhZ2UKLQkJCSAqIGRpcmVjdGl2ZQotCQkJICovCi0JCQlTdHJpbmcgY29udGVudFR5cGVBdHRyaWJ1dGUgPSBqc3BEZXRlY3Rvci5nZXRDb250ZW50VHlwZSgpOwotCQkJaWYgKGNvbnRlbnRUeXBlQXR0cmlidXRlICE9IG51bGwgJiYgY29udGVudFR5cGVBdHRyaWJ1dGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX1RZUEVfQVRUUklCVVRFLCBjb250ZW50VHlwZUF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCQkvKgotCQkJICogY29udGVudCBmYW1pbHkgaXMgdGhlIGdlbmVyYWwgY2xhc3Mgb2YgY29udGVudCwgd2hlbiBpdHMKLQkJCSAqIGRpZmZlcmVudCBmcm9tIHdoYXQncyBkZWZpbmVkIGJ5IGNvbnRlbnQgdHlwZQotCQkJICovCi0JCQlpZiAoanNwRGV0ZWN0b3IuaXNYSFRNTCgpIHx8IGpzcERldGVjdG9yLmlzV01MKCkpIHsKLQkJCQkvLyBJU1NVRTogbG9uZyB0ZXJtIHRoaXMgbG9naWMgYW5kIHZhbHVlIHNob3VsZCBiZSBjb250cmlidXRlZCBieSBleHRlbnNpb24gcG9pbnQKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfRkFNSUxZX0FUVFJJQlVURSwgQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MLkhUTUxfRkFNSUxZKTsKLQkJCX0KLQotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQkvLyBPbmNlIHdlIGRldGVjdGVkIGEgY2hhcnNldCwgd2Ugc2hvdWxkIHNldCB0aGUgcHJvcGVydHkgZXZlbgotCQkJLy8gdGhvdWdoIGl0J3MgdGhlIHNhbWUgYXMgamF2YUNoYXJzZXQKLQkJCS8vIGJlY2F1c2UgdGhlcmUgYXJlIGNsaWVudHMgdGhhdCByZWx5IG9uIHRoaXMgcHJvcGVydHkgdG8KLQkJCS8vIGRldGVybWluZSBpZiB0aGUgY2hhcnNldCBpcyBhY3R1YWxseSBkZXRlY3RlZCBpbiBmaWxlIG9yIG5vdC4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBkZXRlY3RlZENoYXJzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGRldGVjdG9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVTdGFuZGFyZENhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGU6IGlmIHdlJ3JlIGFza2VkIGZvciBvbmUsIHdlIHNldCB0aGVtIGFsbC4gSSBuZWVkIHRvIGJlIHN1cmUgaWYKLQkJLy8gY2FsbGVkCi0JCS8vIG11bGl0aXBsZSB0aW1lcyAob25lIGZvciBlYWNoLCBzYXkpIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgdGltZQotCQkvLyBwcm9jZXNzaW5nIHNhbWUKLQkJLy8gY29udGVudCBhZ2Fpbi4KLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9ICgoSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vIFRPRE86IEkgbmVlZCB0byB2ZXJpZnkgdG8gc2VlIGlmIHRoaXMgQk9NIHdvcmsgaXMgYWx3YXlzIGRvbmUKLQkJLy8gYnkgdGV4dCB0eXBlLgotCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJaWYgKGRldGVjdGVkQnl0ZU9yZGVyTWFyayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdCeXRlT3JkZXJNYXJrID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsIG1heQotCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJaWYgKCFkZXRlY3RlZEJ5dGVPcmRlck1hcmsuZXF1YWxzKGV4aXN0aW5nQnl0ZU9yZGVyTWFyaykpCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIGRldGVjdGVkQnl0ZU9yZGVyTWFyayk7Ci0JCX0KLQotCi0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSkgewotCQkJLy8gbm90ZTogYWZ0ZXIgc2V0dGluZyBoZXJlLCBpdHMgdGhlIG1lcmUgcHJlc2VuY2Ugb2YKLQkJCS8vIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUCi0JCQkvLyBpbiB0aGUgcmVzb3VyY2UncyBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZgotCQkJLy8gaW52YWxpZAotCQkJLy8gaW4gdGhvc2UgY2FzZXMsIHRoZSAiZGV0ZWN0ZWQiIHByb3BlcnR5IGNvbnRhaW5zIGFuCi0JCQkvLyAiYXBwcm9wcmlhdGUgZGVmYXVsdCIgdG8gdXNlLgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIGVuY29kaW5nTWVtZW50by5nZXRJbnZhbGlkRW5jb2RpbmcoKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgZW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpKTsKLQkJfQotCi0JCU9iamVjdCBkZXRlY3RlZENoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQlPYmplY3QgamF2YUNoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0KLQkJLy8gd2UgYWx3YXlzIGluY2x1ZGUgZGV0ZWN0ZWQsIGlmIGl0cyBkaWZmZXJlbnQgdGhhbiBqYXZhCi0JCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCi0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdDaGFyc2V0ID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKTsKLQkJCWlmIChqYXZhQ2hhcnNldC5lcXVhbHMoZXhpc3RpbmdDaGFyc2V0KSkgewotCQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2UgbWF5IG5lZWQgdG8gYWRkIHdoYXQgd2UgZm91bmQsIGJ1dCBvbmx5IG5lZWQgdG8gYWRkCi0JCQkJLy8gaWYgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQuCi0JCQkJT2JqZWN0IGRlZmF1bHRDaGFyc2V0ID0gZGV0ZWN0b3IuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQkJCWlmIChkZWZhdWx0Q2hhcnNldCAhPSBudWxsKSB7Ci0JCQkJCWlmICghZGVmYXVsdENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFzc3VtaW5nIGlmIHRoZXJlIGlzIG5vIHNwZWMgZGVmYXVsdCwgd2UgYWx3YXlzIG5lZWQgdG8KLQkJCQkJLy8gYWRkLCBJJ20gYXNzdW1pbmcKLQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX1RZUEVfQVRUUklCVVRFKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuTEFOR1VBR0VfQVRUUklCVVRFKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0RlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQxMDdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5Db21tb25YTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRmFjZXRNb2R1bGVDb3JlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5GaWxlQ29udGVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgY2FjaGUgZm9yIHByb3BlcnR5IGdyb3VwIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB3ZWIueG1sIGZpbGVzLiBJbmZvcm1hdGlvbgotICogaXMgbm90IHBlcnNpc3RlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydHlHcm91cFtdIE5PX1BST1BFUlRZX0dST1VQUyA9IG5ldyBQcm9wZXJ0eUdyb3VwWzBdOwotCi0Jc3RhdGljIGNsYXNzIERlcGxveW1lbnREZXNjcmlwdG9yIHsKLQkJUHJvcGVydHlHcm91cFtdIGdyb3VwczsKLQkJbG9uZyBtb2RpZmljYXRpb25TdGFtcDsKLQkJU3RyaW5nTWF0Y2hlcltdIHVybFBhdHRlcm5zOwotCQlGbG9hdCB2ZXJzaW9uID0gbmV3IEZsb2F0KGRlZmF1bHRXZWJBcHBWZXJzaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXByZXNlbnRhdGlvbiBvZiB0aGUgSlNQIDIuMCBwcm9wZXJ0eS1ncm91cCBkZWZpbml0aW9ucyBmcm9tIGEgc2VydmxldAotCSAqIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3BlcnR5R3JvdXAgewotCQlzdGF0aWMgUHJvcGVydHlHcm91cCBjcmVhdGVGcm9tKElQYXRoIHBhdGgsIE5vZGUgcHJvcGVydHlHcm91cE5vZGUsIGludCBncm91cE51bWJlcikgewotCQkJUHJvcGVydHlHcm91cCBncm91cCA9IG5ldyBQcm9wZXJ0eUdyb3VwKHBhdGgsIGdyb3VwTnVtYmVyKTsKLQkJCU5vZGUgcHJvcGVydHlHcm91cElEID0gcHJvcGVydHlHcm91cE5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJRCk7Ci0JCQlpZiAocHJvcGVydHlHcm91cElEICE9IG51bGwpIHsKLQkJCQlncm91cC5zZXRJZChwcm9wZXJ0eUdyb3VwSUQuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJfQotCQkJTm9kZSBub2RlID0gcHJvcGVydHlHcm91cE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBub2RlLmdldExvY2FsTmFtZSgpOwotCQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCQluYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChJU19YTUwuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCQlncm91cC5zZXRJc1hNTChnZXRDb250YWluZWRUZXh0KG5vZGUpKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChFTF9JR05PUkVELmVxdWFscyhuYW1lKSkgewotCQkJCQkJZ3JvdXAuc2V0RWxpZ25vcmVkKGdldENvbnRhaW5lZFRleHQobm9kZSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKElOQ0xVREVfQ09EQS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCWdyb3VwLmFkZENvZGEoZ2V0Q29udGFpbmVkVGV4dChub2RlKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoSU5DTFVERV9QUkVMVURFLmVxdWFscyhuYW1lKSkgewotCQkJCQkJZ3JvdXAuYWRkUHJlbHVkZShnZXRDb250YWluZWRUZXh0KG5vZGUpKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChTQ1JJUFRJTkdfSU5WQUxJRC5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCWdyb3VwLnNldFNjcmlwdGluZ0ludmFsaWQoZ2V0Q29udGFpbmVkVGV4dChub2RlKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoUEFHRV9FTkNPRElORy5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCWdyb3VwLnNldFBhZ2VFbmNvZGluZyhnZXRDb250YWluZWRUZXh0KG5vZGUpKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChVUkxfUEFUVEVSTi5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCWdyb3VwLnNldFVybFBhdHRlcm4oZ2V0Q29udGFpbmVkVGV4dChub2RlKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCi0JCQlyZXR1cm4gZ3JvdXA7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gZWxfaWdub3JlZDsKLQotCQlwcml2YXRlIFN0cmluZyBpZDsKLQotCQlwcml2YXRlIElQYXRoW10gaW5jbHVkZV9jb2RhID0gbmV3IElQYXRoWzBdOwotCi0JCXByaXZhdGUgSVBhdGhbXSBpbmNsdWRlX3ByZWx1ZGUgPSBuZXcgSVBhdGhbMF07Ci0JCXByaXZhdGUgYm9vbGVhbiBpc194bWw7Ci0JCXByaXZhdGUgU3RyaW5nTWF0Y2hlciBtYXRjaGVyOwotCQlwcml2YXRlIFN0cmluZyBwYWdlX2VuY29kaW5nOwotCQlwcml2YXRlIGJvb2xlYW4gc2NyaXB0aW5nX2ludmFsaWQ7Ci0JCVN0cmluZyB1cmxfcGF0dGVybjsKLQkJcHJpdmF0ZSBJUGF0aCB3ZWJ4bWxQYXRoOwotCi0JCWludCBudW1iZXI7Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eUdyb3VwKElQYXRoIHBhdGgsIGludCBudW1iZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLndlYnhtbFBhdGggPSBwYXRoOwotCQkJdGhpcy5udW1iZXIgPSBudW1iZXI7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkQ29kYShTdHJpbmcgY29udGFpbmVkVGV4dCkgewotCQkJaWYgKGNvbnRhaW5lZFRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJSVBhdGhbXSBjb2RhcyA9IG5ldyBJUGF0aFtpbmNsdWRlX2NvZGEubGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShpbmNsdWRlX2NvZGEsIDAsIGNvZGFzLCAwLCBpbmNsdWRlX2NvZGEubGVuZ3RoKTsKLQkJCQljb2Rhc1tpbmNsdWRlX2NvZGEubGVuZ3RoXSA9IHdlYnhtbFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDIpLmFwcGVuZChjb250YWluZWRUZXh0KTsKLQkJCQlpbmNsdWRlX2NvZGEgPSBjb2RhczsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRQcmVsdWRlKFN0cmluZyBjb250YWluZWRUZXh0KSB7Ci0JCQlpZiAoY29udGFpbmVkVGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQlJUGF0aFtdIHByZWx1ZGVzID0gbmV3IElQYXRoW2luY2x1ZGVfcHJlbHVkZS5sZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGluY2x1ZGVfcHJlbHVkZSwgMCwgcHJlbHVkZXMsIDAsIGluY2x1ZGVfcHJlbHVkZS5sZW5ndGgpOwotCQkJCXByZWx1ZGVzW2luY2x1ZGVfcHJlbHVkZS5sZW5ndGhdID0gd2VieG1sUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMikuYXBwZW5kKGNvbnRhaW5lZFRleHQpOwotCQkJCWluY2x1ZGVfcHJlbHVkZSA9IHByZWx1ZGVzOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCXJldHVybiBpZDsKLQkJfQotCi0JCXB1YmxpYyBJUGF0aFtdIGdldEluY2x1ZGVDb2RhKCkgewotCQkJcmV0dXJuIGluY2x1ZGVfY29kYTsKLQkJfQotCi0JCXB1YmxpYyBJUGF0aFtdIGdldEluY2x1ZGVQcmVsdWRlKCkgewotCQkJcmV0dXJuIGluY2x1ZGVfcHJlbHVkZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUVuY29kaW5nKCkgewotCQkJcmV0dXJuIHBhZ2VfZW5jb2Rpbmc7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVybFBhdHRlcm4oKSB7Ci0JCQlyZXR1cm4gdXJsX3BhdHRlcm47Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0VMaWdub3JlZCgpIHsKLQkJCXJldHVybiBlbF9pZ25vcmVkOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNJc1hNTCgpIHsKLQkJCXJldHVybiBpc194bWw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1NjcmlwdGluZ0ludmFsaWQoKSB7Ci0JCQlyZXR1cm4gc2NyaXB0aW5nX2ludmFsaWQ7Ci0JCX0KLQotCQlib29sZWFuIG1hdGNoZXMoU3RyaW5nIHBhdHRlcm4sIGJvb2xlYW4gb3B0aW1pc3RpYykgewotCQkJaWYgKG1hdGNoZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gb3B0aW1pc3RpYzsKLQkJCXJldHVybiBtYXRjaGVyLm1hdGNoKHBhdHRlcm4pOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNldEVsaWdub3JlZChTdHJpbmcgZWxfaWdub3JlZCkgewotCQkJdGhpcy5lbF9pZ25vcmVkID0gQm9vbGVhbi52YWx1ZU9mKGVsX2lnbm9yZWQpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQkJdGhpcy5pZCA9IGlkOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNldElzWE1MKFN0cmluZyBpc194bWwpIHsKLQkJCXRoaXMuaXNfeG1sID0gQm9vbGVhbi52YWx1ZU9mKGlzX3htbCkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc2V0UGFnZUVuY29kaW5nKFN0cmluZyBwYWdlX2VuY29kaW5nKSB7Ci0JCQl0aGlzLnBhZ2VfZW5jb2RpbmcgPSBwYWdlX2VuY29kaW5nOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNldFNjcmlwdGluZ0ludmFsaWQoU3RyaW5nIHNjcmlwdGluZ19pbnZhbGlkKSB7Ci0JCQl0aGlzLnNjcmlwdGluZ19pbnZhbGlkID0gQm9vbGVhbi52YWx1ZU9mKHNjcmlwdGluZ19pbnZhbGlkKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzZXRVcmxQYXR0ZXJuKFN0cmluZyB1cmxfcGF0dGVybikgewotCQkJdGhpcy51cmxfcGF0dGVybiA9IHVybF9wYXR0ZXJuOwotCQkJaWYgKHVybF9wYXR0ZXJuICE9IG51bGwgJiYgdXJsX3BhdHRlcm4ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJdGhpcy5tYXRjaGVyID0gbmV3IFN0cmluZ01hdGNoZXIodXJsX3BhdHRlcm4pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBudW1iZXIgKyAiOiIgKyB1cmxfcGF0dGVybjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSAhPSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgKGRlbHRhLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuRU5DT0RJTkcgfHwgZGVsdGEuZ2V0RmxhZ3MoKSA9PSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSkKLQkJCQlyZXR1cm47Ci0KLQkJCUlSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgKGRlbHRhLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuRU5DT0RJTkcgfHwgZGVsdGEuZ2V0RmxhZ3MoKSA9PSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotCQkJCQkJaW50IHNlZ21lbnRDb3VudCA9IHBhdGguc2VnbWVudENvdW50KCk7Ci0JCQkJCQlpZiAoc2VnbWVudENvdW50ID4gMSAmJiBwYXRoLmxhc3RTZWdtZW50KCkuZXF1YWxzKFdFQl9YTUwpICYmIHBhdGguc2VnbWVudChzZWdtZW50Q291bnQgLSAyKS5lcXVhbHMoV0VCX0lORikpIHsKLQkJCQkJCQlnZXRJbnN0YW5jZSgpLmRlcGxveW1lbnREZXNjcmlwdG9yQ2hhbmdlZChwYXRoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkJCQkJaWYgKF9kZWJ1Z1Jlc29sdXRpb25DYWNoZSkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVtb3ZpbmcgRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlIHJlc29sdXRpb24gY2FjaGUgZm9yIHByb2plY3QgIiArIG5hbWUpOyAvLyROT04tTkxTLTEkIAotCQkJCQkJfQotCQkJCQkJc3luY2hyb25pemVkIChMT0NLKSB7Ci0JCQkJCQkJZ2V0SW5zdGFuY2UoKS5yZXNvbHZlZE1hcC5yZW1vdmUobmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfTsKLQkJCXRyeSB7Ci0JCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmRG9Mb2dFeGNlcHRpb25zID0gZmFsc2U7Ci0JCXByaXZhdGUgSVBhdGggZlBhdGg7Ci0KLQkJUmVzb3VyY2VFcnJvckhhbmRsZXIoYm9vbGVhbiBsb2dFeGNlcHRpb25zKSB7Ci0JCQlzdXBlcigpOwotCQkJZkRvTG9nRXhjZXB0aW9ucyA9IGxvZ0V4Y2VwdGlvbnM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJaWYgKGZEb0xvZ0V4Y2VwdGlvbnMpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlNBWFBhcnNlRXhjZXB0aW9uIHdpdGggIiArIGZQYXRoICsgIiAoZXJyb3IpIHdoaWxlIHJlYWRpbmcgZGVzY3JpcHRvcjogIiArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJaWYgKGZEb0xvZ0V4Y2VwdGlvbnMpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlNBWFBhcnNlRXhjZXB0aW9uIHdpdGggIiArIGZQYXRoICsgIiAoZmF0YWxFcnJvcikgd2hpbGUgcmVhZGluZyBkZXNjcmlwdG9yOiAiICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRQYXRoKElQYXRoIHBhdGgpIHsKLQkJCWZQYXRoID0gcGF0aDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCWlmIChmRG9Mb2dFeGNlcHRpb25zKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJTQVhQYXJzZUV4Y2VwdGlvbiB3aXRoICIgKyBmUGF0aCArICIgKHdhcm5pbmcpIHdoaWxlIHJlYWRpbmcgZGVzY3JpcHRvcjogIiArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5wcm9wZXJ0eXRlc3Rlci5TdHJpbmdNYXRjaGVyLCBidXQKLQkgKiBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBhIG1vcmUgYWNjdXJhdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJ1bGVzIGluCi0JICogU2VydmxldCBzcGVjIFNSVi4xMS4yIGFuZCBSRkMgMjM5NgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmluZ01hdGNoZXIgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNJTkdMRV9XSUxEX0NBUkQgPSAnXHUwMDAwJzsKLQotCQkvKioKLQkJICogQm91bmRhcnkgdmFsdWUgYmV5b25kIHdoaWNoIHdlIGRvbid0IG5lZWQgdG8gc2VhcmNoIGluIHRoZSB0ZXh0Ci0JCSAqLwotCQlwcml2YXRlIGludCBib3VuZCA9IDA7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGhhc0xlYWRpbmdTdGFyOwotCi0JCXByaXZhdGUgYm9vbGVhbiBoYXNUcmFpbGluZ1N0YXI7Ci0KLQkJZmluYWwgU3RyaW5nIHBhdHRlcm47Ci0KLQkJcHJpdmF0ZSBmaW5hbCBpbnQgcGF0dGVybkxlbmd0aDsKLQotCQkvKioKLQkJICogVGhlIHBhdHRlcm4gc3BsaXQgaW50byBzZWdtZW50cyBzZXBhcmF0ZWQgYnkgKgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgc2VnbWVudHNbXTsKLQotCQkvKioKLQkJICogU3RyaW5nTWF0Y2hlciBjb25zdHJ1Y3RvciB0YWtlcyBpbiBhIFN0cmluZyBvYmplY3QgdGhhdCBpcyBhIHNpbXBsZQotCQkgKiBwYXR0ZXJuIHdoaWNoIG1heSBjb250YWluICcqJyBmb3IgMCBhbmQgbWFueSBjaGFyYWN0ZXJzIGFuZCAnPycgZm9yCi0JCSAqIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4KLQkJICogCi0JCSAqIExpdGVyYWwgJyonIGFuZCAnPycgY2hhcmFjdGVycyBtdXN0IGJlIGVzY2FwZWQgaW4gdGhlIHBhdHRlcm4gZS5nLiwKLQkJICogIlwqIiBtZWFucyBsaXRlcmFsICIqIiwgZXRjLgotCQkgKiAKLQkJICogRXNjYXBpbmcgYW55IG90aGVyIGNoYXJhY3RlciAoaW5jbHVkaW5nIHRoZSBlc2NhcGUgY2hhcmFjdGVyCi0JCSAqIGl0c2VsZiksIGp1c3QgcmVzdWx0cyBpbiB0aGF0IGNoYXJhY3RlciBpbiB0aGUgcGF0dGVybi4gZS5nLiwgIlxhIgotCQkgKiBtZWFucyAiYSIgYW5kICJcXCIgbWVhbnMgIlwiCi0JCSAqIAotCQkgKiBJZiBpbnZva2luZyB0aGUgU3RyaW5nTWF0Y2hlciB3aXRoIHN0cmluZyBsaXRlcmFscyBpbiBKYXZhLCBkb24ndAotCQkgKiBmb3JnZXQgZXNjYXBlIGNoYXJhY3RlcnMgYXJlIHJlcHJlc2VudGVkIGJ5ICJcXCIuCi0JCSAqIAotCQkgKiBAcGFyYW0gcGF0dGVybgotCQkgKiAgICAgICAgICAgIHRoZSBwYXR0ZXJuIHRvIG1hdGNoIHRleHQgYWdhaW5zdAotCQkgKi8KLQkJU3RyaW5nTWF0Y2hlcihTdHJpbmcgcGF0dGVybikgewotCQkJaWYgKHBhdHRlcm4gPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotCQkJcGF0dGVybkxlbmd0aCA9IHBhdHRlcm4ubGVuZ3RoKCk7Ci0JCQlwYXJzZVdpbGRDYXJkcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSB0ZXh0Ci0JCSAqICAgICAgICAgICAgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IG9ubHkgY29udGFpbiAnPycocykKLQkJICogQHBhcmFtIHN0YXJ0Ci0JCSAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IGZvciBzZWFyY2gsIGluY2x1c2l2ZQotCQkgKiBAcGFyYW0gZW5kCi0JCSAqICAgICAgICAgICAgdGhlIHN0b3BwaW5nIHBvaW50IG9mIHNlYXJjaCwgZXhjbHVzaXZlCi0JCSAqIEBwYXJhbSBwCi0JCSAqICAgICAgICAgICAgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IGNvbnRhaW4gJz8nCi0JCSAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBwYXR0ZXJuICwgb3IgLTEgaWYKLQkJICogICAgICAgICBub3QgZm91bmQKLQkJICovCi0JCXByaXZhdGUgaW50IGZpbmRQb3NpdGlvbihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmcgcCkgewotCQkJYm9vbGVhbiBoYXNXaWxkQ2FyZCA9IHAuaW5kZXhPZihTSU5HTEVfV0lMRF9DQVJEKSA+PSAwOwotCQkJaW50IHBsZW4gPSBwLmxlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IHN0YXJ0LCBtYXggPSBlbmQgLSBwbGVuOyBpIDw9IG1heDsgKytpKSB7Ci0JCQkJaWYgKGhhc1dpbGRDYXJkKSB7Ci0JCQkJCWlmIChyZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIGksIHAsIDAsIHBsZW4pKQotCQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAodGV4dC5yZWdpb25NYXRjaGVzKHRydWUsIGksIHAsIDAsIHBsZW4pKQotCQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdpdmVuIHRoZSBzdGFydGluZyAoaW5jbHVzaXZlKSBhbmQgdGhlIGVuZGluZyAoZXhjbHVzaXZlKSBwb3NpdGlvbnMKLQkJICogaW4gdGhlIDxjb2RlPnRleHQ8L2NvZGU+LCBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHN1YnN0cmluZyBtYXRjaGVzCi0JCSAqIHdpdGggYVBhdHRlcm4KLQkJICogCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhlIHRleHQgbWF0Y2hlcyB0aGUKLQkJICogICAgICAgICBwYXR0ZXJuCi0JCSAqIEBwYXJhbSB0ZXh0Ci0JCSAqICAgICAgICAgICAgYSBTdHJpbmcgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHN1YnN0cmluZyB0byBtYXRjaAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHRleHQpIHsKLQkJCWlmICh0ZXh0ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZmluYWwgaW50IGVuZCA9IHRleHQubGVuZ3RoKCk7Ci0JCQlmaW5hbCBpbnQgc2VnbWVudENvdW50ID0gc2VnbWVudHMubGVuZ3RoOwotCQkJaWYgKHNlZ21lbnRDb3VudCA9PSAwICYmIChoYXNMZWFkaW5nU3RhciB8fCBoYXNUcmFpbGluZ1N0YXIpKSAvLyBwYXR0ZXJuCi0JCQkJLy8gY29udGFpbnMKLQkJCQkvLyBvbmx5Ci0JCQkJLy8gJyonKHMpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoZW5kID09IDApCi0JCQkJcmV0dXJuIHBhdHRlcm5MZW5ndGggPT0gMDsKLQkJCWlmIChwYXR0ZXJuTGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaW50IGN1cnJlbnRUZXh0UG9zaXRpb24gPSAwOwotCQkJaWYgKChlbmQgLSBib3VuZCkgPCAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWludCBzZWdtZW50SW5kZXggPSAwOwotCQkJU3RyaW5nIGN1cnJlbnQgPSBzZWdtZW50c1tzZWdtZW50SW5kZXhdOwotCi0JCQkvKiBwcm9jZXNzIGZpcnN0IHNlZ21lbnQgKi8KLQkJCWlmICghaGFzTGVhZGluZ1N0YXIpIHsKLQkJCQlpbnQgY3VycmVudExlbmd0aCA9IGN1cnJlbnQubGVuZ3RoKCk7Ci0JCQkJaWYgKCFyZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIDAsIGN1cnJlbnQsIDAsIGN1cnJlbnRMZW5ndGgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJc2VnbWVudEluZGV4Kys7Ci0JCQkJY3VycmVudFRleHRQb3NpdGlvbiA9IGN1cnJlbnRUZXh0UG9zaXRpb24gKyBjdXJyZW50TGVuZ3RoOwotCQkJfQotCQkJaWYgKChzZWdtZW50Q291bnQgPT0gMSkgJiYgKCFoYXNMZWFkaW5nU3RhcikgJiYgKCFoYXNUcmFpbGluZ1N0YXIpKSB7Ci0JCQkJLy8gb25seSBvbmUgc2VnbWVudCB0byBtYXRjaCwgbm8gd2lsZCBjYXJkcyBzcGVjaWZpZWQKLQkJCQlyZXR1cm4gY3VycmVudFRleHRQb3NpdGlvbiA9PSBlbmQ7Ci0JCQl9Ci0JCQkvKiBwcm9jZXNzIG1pZGRsZSBzZWdtZW50cyAqLwotCQkJd2hpbGUgKHNlZ21lbnRJbmRleCA8IHNlZ21lbnRDb3VudCkgewotCQkJCWN1cnJlbnQgPSBzZWdtZW50c1tzZWdtZW50SW5kZXhdOwotCQkJCWludCBjdXJyZW50TWF0Y2ggPSBmaW5kUG9zaXRpb24odGV4dCwgY3VycmVudFRleHRQb3NpdGlvbiwgZW5kLCBjdXJyZW50KTsKLQkJCQlpZiAoY3VycmVudE1hdGNoIDwgMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWN1cnJlbnRUZXh0UG9zaXRpb24gPSBjdXJyZW50TWF0Y2ggKyBjdXJyZW50Lmxlbmd0aCgpOwotCQkJCXNlZ21lbnRJbmRleCsrOwotCQkJfQotCi0JCQkvKiBwcm9jZXNzIGZpbmFsIHNlZ21lbnQgKi8KLQkJCWlmICghaGFzVHJhaWxpbmdTdGFyICYmIGN1cnJlbnRUZXh0UG9zaXRpb24gIT0gZW5kKSB7Ci0JCQkJaW50IGN1cnJlbnRMZW5ndGggPSBjdXJyZW50Lmxlbmd0aCgpOwotCQkJCXJldHVybiByZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIGVuZCAtIGN1cnJlbnRMZW5ndGgsIGN1cnJlbnQsIDAsIGN1cnJlbnRMZW5ndGgpOwotCQkJfQotCQkJcmV0dXJuIHNlZ21lbnRJbmRleCA9PSBzZWdtZW50Q291bnQ7Ci0JCX0KLQotCQkvKioKLQkJICogUGFyc2VzIHRoZSBwYXR0ZXJuIGludG8gc2VnbWVudHMgc2VwYXJhdGVkIGJ5IHdpbGRjYXJkICcqJwotCQkgKiBjaGFyYWN0ZXJzLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHBhcnNlV2lsZENhcmRzKCkgewotCQkJaWYgKHBhdHRlcm4uc3RhcnRzV2l0aCgiKiIpKS8vJE5PTi1OTFMtMSQKLQkJCQloYXNMZWFkaW5nU3RhciA9IHRydWU7Ci0JCQlpZiAocGF0dGVybi5lbmRzV2l0aCgiKiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCS8qIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBlc2NhcGVkIHdpbGRjYXJkICovCi0JCQkJaWYgKHBhdHRlcm5MZW5ndGggPiAxICYmIHBhdHRlcm4uY2hhckF0KHBhdHRlcm5MZW5ndGggLSAyKSAhPSAnXFwnKSB7Ci0JCQkJCWhhc1RyYWlsaW5nU3RhciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlBcnJheUxpc3QgdGVtcCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJaW50IHBvcyA9IDA7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJd2hpbGUgKHBvcyA8IHBhdHRlcm5MZW5ndGgpIHsKLQkJCQljaGFyIGMgPSBwYXR0ZXJuLmNoYXJBdChwb3MrKyk7Ci0JCQkJc3dpdGNoIChjKSB7Ci0JCQkJCWNhc2UgJ1xcJyA6Ci0JCQkJCQlpZiAocG9zID49IHBhdHRlcm5MZW5ndGgpIHsKLQkJCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJY2hhciBuZXh0ID0gcGF0dGVybi5jaGFyQXQocG9zKyspOwotCQkJCQkJCS8qIGlmIGl0J3MgYW4gZXNjYXBlIHNlcXVlbmNlICovCi0JCQkJCQkJaWYgKG5leHQgPT0gJyonIHx8IG5leHQgPT0gJz8nIHx8IG5leHQgPT0gJ1xcJykgewotCQkJCQkJCQlidWYuYXBwZW5kKG5leHQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJLyoKLQkJCQkJCQkJICogbm90IGFuIGVzY2FwZSBzZXF1ZW5jZSwganVzdCBpbnNlcnQKLQkJCQkJCQkJICogbGl0ZXJhbGx5Ci0JCQkJCQkJCSAqLwotCQkJCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCQkJCQlidWYuYXBwZW5kKG5leHQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICcqJyA6Ci0JCQkJCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCS8qIG5ldyBzZWdtZW50ICovCi0JCQkJCQkJdGVtcC5hZGQoYnVmLnRvU3RyaW5nKCkpOwotCQkJCQkJCWJvdW5kICs9IGJ1Zi5sZW5ndGgoKTsKLQkJCQkJCQlidWYuc2V0TGVuZ3RoKDApOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJz8nIDoKLQkJCQkJCS8qCi0JCQkJCQkgKiBhcHBlbmQgc3BlY2lhbCBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHNpbmdsZSBtYXRjaAotCQkJCQkJICogd2lsZGNhcmQKLQkJCQkJCSAqLwotCQkJCQkJYnVmLmFwcGVuZChTSU5HTEVfV0lMRF9DQVJEKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBhZGQgbGFzdCBidWZmZXIgdG8gc2VnbWVudCBsaXN0ICovCi0JCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCQkJCXRlbXAuYWRkKGJ1Zi50b1N0cmluZygpKTsKLQkJCQlib3VuZCArPSBidWYubGVuZ3RoKCk7Ci0JCQl9Ci0JCQlzZWdtZW50cyA9IChTdHJpbmdbXSkgdGVtcC50b0FycmF5KG5ldyBTdHJpbmdbdGVtcC5zaXplKCldKTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICogQHJldHVybiBib29sZWFuCi0JCSAqIEBwYXJhbSB0ZXh0Ci0JCSAqICAgICAgICAgICAgYSBTdHJpbmcgdG8gbWF0Y2gKLQkJICogQHBhcmFtIHRTdGFydAotCQkgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRleCBvZiBtYXRjaCwgaW5jbHVzaXZlCi0JCSAqIEBwYXJhbSBwCi0JCSAqICAgICAgICAgICAgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IGNvbnRhaW4gJz8nCi0JCSAqIEBwYXJhbSBwU3RhcnQKLQkJICogICAgICAgICAgICBUaGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIHBhdHRlcm4KLQkJICogQHBhcmFtIHBsZW4KLQkJICogICAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gcmVnRXhwUmVnaW9uTWF0Y2hlcyhTdHJpbmcgdGV4dCwgaW50IHRTdGFydCwgU3RyaW5nIHAsIGludCBwU3RhcnQsIGludCBwbGVuKSB7Ci0JCQl3aGlsZSAocGxlbi0tID4gMCkgewotCQkJCWNoYXIgdGNoYXIgPSB0ZXh0LmNoYXJBdCh0U3RhcnQrKyk7Ci0JCQkJY2hhciBwY2hhciA9IHAuY2hhckF0KHBTdGFydCsrKTsKLQotCQkJCS8vIHByb2Nlc3Mgd2lsZCBjYXJkcywgc2tpcHBpbmcgc2luZ2xlIHdpbGQgY2FyZHMKLQkJCQlpZiAocGNoYXIgPT0gU0lOR0xFX1dJTERfQ0FSRCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHBjaGFyID09IHRjaGFyKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHRjaGFyKSA9PSBDaGFyYWN0ZXIudG9VcHBlckNhc2UocGNoYXIpKQotCQkJCQljb250aW51ZTsKLQkJCQkvLyBjb21wYXJpbmcgYWZ0ZXIgY29udmVydGluZyB0byB1cHBlciBjYXNlIGRvZXNuJ3QgaGFuZGxlIGFsbAotCQkJCS8vIGNhc2VzOwotCQkJCS8vIGFsc28gY29tcGFyZSBhZnRlciBjb252ZXJ0aW5nIHRvIGxvd2VyIGNhc2UKLQkJCQlpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHRjaGFyKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UocGNoYXIpKQotCQkJCQljb250aW51ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiU3RyaW5nTWF0Y2hlcjogIiArIHBhdHRlcm47IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZSBfaW5zdGFuY2UgPSBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdSZXNvbHV0aW9uQ2FjaGUgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IGRlZmF1bHRXZWJBcHBWZXJzaW9uID0gM2Y7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTF9JR05PUkVEID0gImVsLWlnbm9yZWQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfQ09EQSA9ICJpbmNsdWRlLWNvZGEiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX1BSRUxVREUgPSAiaW5jbHVkZS1wcmVsdWRlIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJU19YTUwgPSAiaXMteG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBKU1BfUFJPUEVSVFlfR1JPVVAgPSAianNwLXByb3BlcnR5LWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9FTkNPRElORyA9ICJwYWdlLWVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFRJTkdfSU5WQUxJRCA9ICJzY3JpcHRpbmctaW52YWxpZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QQVRURVJOID0gInVybC1wYXR0ZXJuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfQVBQX0VMRU1FTlRfTE9DQUxfTkFNRSA9ICI6d2ViLWFwcCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0FQUF9FTEVNRU5UX05BTUUgPSAid2ViLWFwcCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfQVBQX1ZFUlNJT05fTkFNRSA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU5GID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9YTUwgPSAid2ViLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORl9XRUJfWE1MID0gV0VCX0lORiArIElQYXRoLlNFUEFSQVRPUgotCS8vICsgV0VCX1hNTDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xBU0hfV0VCX0lORl9XRUJfWE1MID0gUGF0aC5ST09ULnRvU3RyaW5nKCkgKyBXRUJfSU5GICsgSVBhdGguU0VQQVJBVE9SICsgV0VCX1hNTDsKLQotCXN0YXRpYyBTdHJpbmcgZ2V0Q29udGFpbmVkVGV4dChOb2RlIHBhcmVudCkgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSA9PSAxKSB7Ci0JCQlyZXR1cm4gY2hpbGRyZW4uaXRlbSgwKS5nZXROb2RlVmFsdWUoKS50cmltKCk7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpIHsKLQkJCQlTdHJpbmcgcmVmZXJlbmNlID0gKChFbnRpdHlSZWZlcmVuY2UpIGNoaWxkKS5nZXROb2RlVmFsdWUoKTsKLQkJCQlpZiAocmVmZXJlbmNlID09IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCXJlZmVyZW5jZSA9ICImIiArIGNoaWxkLmdldE5vZGVOYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJcy5hcHBlbmQocmVmZXJlbmNlLnRyaW0oKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcy5hcHBlbmQoY2hpbGQuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpKTsKLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gcy50b1N0cmluZygpLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0KCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihnZXRJbnN0YW5jZSgpLmZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdG9wKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihnZXRJbnN0YW5jZSgpLmZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIFJlc291cmNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcjsKLQotCXByaXZhdGUgTWFwIGZEZXBsb3ltZW50RGVzY3JpcHRvcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQotCS8vIGZvciB1c2Ugd2hlbiByZWFkaW5nIFRMRHMKLQlwcml2YXRlIEVudGl0eVJlc29sdmVyIHJlc29sdmVyOwotCi0JTWFwIHJlc29sdmVkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCWZpbmFsIHN0YXRpYyBPYmplY3QgTE9DSyA9IG5ldyBPYmplY3QoKTsKLQotCXByaXZhdGUgRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBfcGFyc2VEb2N1bWVudChJUGF0aCBwYXRoLCBGbG9hdFtdIHZlcnNpb24sIExpc3QgZ3JvdXBMaXN0LCBMaXN0IHVybFBhdHRlcm5zLCBTdWJQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciwgRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRWxlbWVudCB3ZWJhcHAgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJaWYgKHdlYmFwcCAhPSBudWxsKSB7Ci0JCQlpZiAod2ViYXBwLmdldFRhZ05hbWUoKS5lcXVhbHMoV0VCX0FQUF9FTEVNRU5UX05BTUUpIHx8IHdlYmFwcC5nZXROb2RlTmFtZSgpLmVuZHNXaXRoKFdFQl9BUFBfRUxFTUVOVF9MT0NBTF9OQU1FKSkgewotCQkJCS8vIHRoaXMgY29udmVudGlvbiBvbmx5IHN0YXJ0ZWQgd2l0aCAyLjQ/Ci0JCQkJaWYgKHdlYmFwcC5oYXNBdHRyaWJ1dGUoV0VCX0FQUF9WRVJTSU9OX05BTUUpKSB7Ci0JCQkJCVN0cmluZyB2ZXJzaW9uVmFsdWUgPSB3ZWJhcHAuZ2V0QXR0cmlidXRlKFdFQl9BUFBfVkVSU0lPTl9OQU1FKTsKLQkJCQkJdmVyc2lvblZhbHVlID0gdmVyc2lvblZhbHVlLnRyaW0oKTsKLQkJCQkJaWYgKHZlcnNpb25WYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmVyc2lvblswXSA9IEZsb2F0LnZhbHVlT2YodmVyc2lvblZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIGRvZXNuJ3QgbWF0dGVyCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHZlcnNpb25bMF0gPT0gbnVsbCkgewotCQkJCQkvLyB0cnkgZGV0ZXJtaW5pbmcgdGhlIHZlcnNpb24gZnJvbSB0aGUgZG9jdHlwZSByZWZlcmVuY2UKLQkJCQkJRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0JCQkJCWlmIChkb2N0eXBlICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBzeXN0ZW1JZCA9IGRvY3R5cGUuZ2V0U3lzdGVtSWQoKTsKLQkJCQkJCVN0cmluZyBwdWJsaWNJZCA9IGRvY3R5cGUuZ2V0UHVibGljSWQoKTsKLQkJCQkJCWlmICgoc3lzdGVtSWQgIT0gbnVsbCAmJiBzeXN0ZW1JZC5lbmRzV2l0aCgid2ViLWFwcF8yXzMuZHRkIikpIHx8IChwdWJsaWNJZCAhPSBudWxsICYmIHB1YmxpY0lkLmluZGV4T2YoIldlYiBBcHBsaWNhdGlvbiAyLjMiKSA+IDApKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCXZlcnNpb25bMF0gPSBuZXcgRmxvYXQoMi4zKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKChzeXN0ZW1JZCAhPSBudWxsICYmIHN5c3RlbUlkLmVuZHNXaXRoKCJ3ZWItYXBwXzJfMi5kdGQiKSkgfHwgKHB1YmxpY0lkICE9IG51bGwgJiYgcHVibGljSWQuaW5kZXhPZigiV2ViIEFwcGxpY2F0aW9uIDIuMiIpID4gMCkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJdmVyc2lvblswXSA9IG5ldyBGbG9hdCgyLjIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoKHN5c3RlbUlkICE9IG51bGwgJiYgc3lzdGVtSWQuZW5kc1dpdGgoIndlYi1hcHBfMl8xLmR0ZCIpKSB8fCAocHVibGljSWQgIT0gbnVsbCAmJiBwdWJsaWNJZC5pbmRleE9mKCJXZWIgQXBwbGljYXRpb24gMi4xIikgPiAwKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl2ZXJzaW9uWzBdID0gbmV3IEZsb2F0KDIuMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTm9kZUxpc3QgcHJvcGVydHlHcm91cEVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlNQX1BST1BFUlRZX0dST1VQKTsKLQkJaW50IGxlbmd0aCA9IHByb3BlcnR5R3JvdXBFbGVtZW50cy5nZXRMZW5ndGgoKTsKLQkJc3ViTW9uaXRvci5iZWdpblRhc2soIlJlYWRpbmcgUHJvcGVydHkgR3JvdXBzIiwgbGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9wZXJ0eUdyb3VwIGdyb3VwID0gUHJvcGVydHlHcm91cC5jcmVhdGVGcm9tKHBhdGgsIHByb3BlcnR5R3JvdXBFbGVtZW50cy5pdGVtKGkpLCBpKTsKLQkJCXN1Yk1vbml0b3Iud29ya2VkKDEpOwotCQkJaWYgKGdyb3VwICE9IG51bGwpIHsKLQkJCQlncm91cExpc3QuYWRkKGdyb3VwKTsKLQkJCX0KLQkJfQotCQkKLQkJTm9kZUxpc3QgdXJsUGF0dGVybkVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVVJMX1BBVFRFUk4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybFBhdHRlcm5FbGVtZW50cy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgdXJsUGF0dGVybiA9IGdldENvbnRhaW5lZFRleHQodXJsUGF0dGVybkVsZW1lbnRzLml0ZW0oaSkpOwotCQkJaWYodXJsUGF0dGVybiAhPSBudWxsICYmIHVybFBhdHRlcm4ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJdXJsUGF0dGVybnMuYWRkKG5ldyBTdHJpbmdNYXRjaGVyKHVybFBhdHRlcm4pKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIFNSViBzcGVjIHZlcnNpb24gdG8gdGhlIEpTUCBzcGVjIHZlcnNpb24KLQkgKi8KLQlwcml2YXRlIGZsb2F0IGNvbnZlcnRTcGVjVmVyc2lvbnMoZmxvYXQgdmVyc2lvbikgewotCQlpZiAodmVyc2lvbiA+IDApIHsKLQkJCWlmICh2ZXJzaW9uID09IDNmKQotCQkJCXJldHVybiAyLjJmOwotCQkJaWYgKHZlcnNpb24gPT0gMi41ZikKLQkJCQlyZXR1cm4gMi4xZjsKLQkJCWVsc2UgaWYgKHZlcnNpb24gPT0gMi40ZikKLQkJCQlyZXR1cm4gMi4wZjsKLQkJCWVsc2UgaWYgKHZlcnNpb24gPT0gMi4zZikKLQkJCQlyZXR1cm4gMS4yZjsKLQkJCWVsc2UgaWYgKHZlcnNpb24gPT0gMi4yZikKLQkJCQlyZXR1cm4gMS4xZjsKLQkJCWVsc2UgaWYgKHZlcnNpb24gPT0gMi4xZikKLQkJCQlyZXR1cm4gMS4wZjsKLQkJfQotCQlyZXR1cm4gY29udmVydFNwZWNWZXJzaW9ucyhkZWZhdWx0V2ViQXBwVmVyc2lvbik7Ci0JfQotCi0Jdm9pZCBkZXBsb3ltZW50RGVzY3JpcHRvckNoYW5nZWQoZmluYWwgSVBhdGggZnVsbFBhdGgpIHsKLQkJaWYgKGZEZXBsb3ltZW50RGVzY3JpcHRvcnMuY29udGFpbnNLZXkoZnVsbFBhdGgubWFrZUFic29sdXRlKCkpKSB7Ci0JCQl1cGRhdGVDYWNoZUVudHJ5KGZ1bGxQYXRoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHBhcnNlIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdXNpbmcgWGVyY2VzLCBhbmQgaWYgdGhhdCBmYWlscywgdXNlIHRoZQotCSAqIFNTRSBYTUwgcGFyc2VyIHRvIGZpbmQgdGhlIHByb3BlcnR5IGdyb3Vwcy4KLQkgKi8KLQlwcml2YXRlIERlcGxveW1lbnREZXNjcmlwdG9yIGZldGNoRGVzY3JpcHRvcihJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlXzEsIDMpOwotCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCi0JCVByb3BlcnR5R3JvdXAgZ3JvdXBzW10gPSBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlMaXN0IGdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB1cmxQYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRmxvYXRbXSB2ZXJzaW9uID0gbmV3IEZsb2F0WzFdOwotCQlTdWJQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMik7Ci0JCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gQ29tbW9uWE1MLmdldERvY3VtZW50QnVpbGRlcihmYWxzZSk7Ci0JCWJ1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIoZ2V0RW50aXR5UmVzb2x2ZXIoKSk7Ci0JCWJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKGdldEVycm9ySGFuZGxlcihwYXRoKSk7Ci0JCXRyeSB7Ci0JCQlJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSgpOwotCQkJU3RyaW5nIHMgPSBGaWxlQ29udGVudENhY2hlLmdldEluc3RhbmNlKCkuZ2V0Q29udGVudHMocGF0aCk7Ci0JCQlpbnB1dFNvdXJjZS5zZXRDaGFyYWN0ZXJTdHJlYW0obmV3IFN0cmluZ1JlYWRlcihzKSk7Ci0JCQlpbnB1dFNvdXJjZS5zZXRTeXN0ZW1JZChwYXRoLnRvU3RyaW5nKCkpOwotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKGlucHV0U291cmNlKTsKLQkJCV9wYXJzZURvY3VtZW50KHBhdGgsIHZlcnNpb24sIGdyb3VwTGlzdCwgdXJsUGF0dGVybnMsIHN1Yk1vbml0b3IsIGRvY3VtZW50KTsKLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUxKSB7Ci0JCQkvKiBlbmNvdW50ZXJlZCBhIGZhdGFsIHBhcnNpbmcgZXJyb3IsIHRyeSBvdXIgb3duIHBhcnNlciAqLwotCQkJdHJ5IHsKLQkJCQkvKioKLQkJCQkgKiBDaGllZmx5IGJlY2F1c2UgdGhlIHdlYi54bWwgZmlsZSBpdHNlbGYgaXMgZWRpdGFibGUsIHVzZQotCQkJCSAqIFNTRSB0byBnZXQgdGhlIERPTSBEb2N1bWVudCBiZWNhdXNlIGl0IGlzIG1vcmUgZmF1bHQKLQkJCQkgKiB0b2xlcmFudC4KLQkJCQkgKi8KLQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJCV9wYXJzZURvY3VtZW50KHBhdGgsIHZlcnNpb24sIGdyb3VwTGlzdCwgdXJsUGF0dGVybnMsIHN1Yk1vbml0b3IsIGRvY3VtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJLyogZmlsZSBpcyB1bnJlYWRhYmxlLCBjcmVhdGUgbm8gcHJvcGVydHkgZ3JvdXBzICovCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlncm91cHMgPSAoUHJvcGVydHlHcm91cFtdKSBncm91cExpc3QudG9BcnJheShuZXcgUHJvcGVydHlHcm91cFtncm91cExpc3Quc2l6ZSgpXSk7Ci0JCQlzdWJNb25pdG9yLmRvbmUoKTsKLQkJfQotCi0JCWlmIChncm91cHMgPT0gbnVsbCkgewotCQkJZ3JvdXBzID0gTk9fUFJPUEVSVFlfR1JPVVBTOwotCQl9Ci0KLQkJRGVwbG95bWVudERlc2NyaXB0b3IgZGVwbG95bWVudERlc2NyaXB0b3IgPSBuZXcgRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJZGVwbG95bWVudERlc2NyaXB0b3IubW9kaWZpY2F0aW9uU3RhbXAgPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCWRlcGxveW1lbnREZXNjcmlwdG9yLmdyb3VwcyA9IGdyb3VwczsKLQkJZGVwbG95bWVudERlc2NyaXB0b3IudXJsUGF0dGVybnMgPSAoKFN0cmluZ01hdGNoZXJbXSkgdXJsUGF0dGVybnMudG9BcnJheShuZXcgU3RyaW5nTWF0Y2hlclt1cmxQYXR0ZXJucy5zaXplKCldKSk7Ci0JCWRlcGxveW1lbnREZXNjcmlwdG9yLnZlcnNpb24gPSB2ZXJzaW9uWzBdOwotCQltb25pdG9yLmRvbmUoKTsKLQkJZkRlcGxveW1lbnREZXNjcmlwdG9ycy5wdXQocGF0aCwgbmV3IFNvZnRSZWZlcmVuY2UoZGVwbG95bWVudERlc2NyaXB0b3IpKTsKLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCXByaXZhdGUgRGVwbG95bWVudERlc2NyaXB0b3IgZ2V0Q2FjaGVkRGVzY3JpcHRvcihJUGF0aCBqc3BGaWxlUGF0aCkgewotCQlJUGF0aCB3ZWJ4bWxQYXRoID0gZ2V0V2ViWE1MUGF0aChqc3BGaWxlUGF0aCk7Ci0JCWlmICh3ZWJ4bWxQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJRmlsZSB3ZWJ4bWxGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHdlYnhtbFBhdGgpOwotCQlpZiAoIXdlYnhtbEZpbGUuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlSZWZlcmVuY2UgZGVzY3JpcHRvckhvbGRlciA9IChSZWZlcmVuY2UpIGZEZXBsb3ltZW50RGVzY3JpcHRvcnMuZ2V0KHdlYnhtbFBhdGgpOwotCQlEZXBsb3ltZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQotCQlpZiAoZGVzY3JpcHRvckhvbGRlciA9PSBudWxsIHx8ICgoZGVzY3JpcHRvciA9IChEZXBsb3ltZW50RGVzY3JpcHRvcikgZGVzY3JpcHRvckhvbGRlci5nZXQoKSkgPT0gbnVsbCkgfHwgKGRlc2NyaXB0b3IubW9kaWZpY2F0aW9uU3RhbXAgPT0gSVJlc291cmNlLk5VTExfU1RBTVApIHx8IChkZXNjcmlwdG9yLm1vZGlmaWNhdGlvblN0YW1wICE9IHdlYnhtbEZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSkpIHsKLQkJCWRlc2NyaXB0b3IgPSBmZXRjaERlc2NyaXB0b3Iod2VieG1sUGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JcHJpdmF0ZSBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpIHsKLQkJaWYgKHJlc29sdmVyID09IG51bGwpIHsKLQkJCXJlc29sdmVyID0gbmV3IEVudGl0eVJlc29sdmVyKCkgewotCQkJCXB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCQkJCUlucHV0U291cmNlIHJlc3VsdCA9IG5ldyBJbnB1dFNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKLQkJCQkJcmVzdWx0LnNldFB1YmxpY0lkKHB1YmxpY0lEKTsKLQkJCQkJcmVzdWx0LnNldFN5c3RlbUlkKHN5c3RlbUlEICE9IG51bGwgPyBzeXN0ZW1JRCA6ICIvXyIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiByZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIEVycm9ySGFuZGxlciB0aGF0IHdpbGwgbm90IHN0b3AgdGhlIHBhcnNlciBvbiByZXBvcnRlZAotCSAqIGVycm9ycwotCSAqLwotCXByaXZhdGUgRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlcihJUGF0aCBwYXRoKSB7Ci0JCWlmIChlcnJvckhhbmRsZXIgPT0gbnVsbCkgewotCQkJZXJyb3JIYW5kbGVyID0gbmV3IFJlc291cmNlRXJyb3JIYW5kbGVyKGZhbHNlKTsKLQkJfQotCQllcnJvckhhbmRsZXIuc2V0UGF0aChwYXRoKTsKLQkJcmV0dXJuIGVycm9ySGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZnVsbFBhdGgKLQkgKiBAcmV0dXJuIHRoZSBKU1AgdmVyc2lvbiBzdXBwb3J0ZWQgYnkgdGhlIHdlYiBhcHBsaWNhdGlvbiBjb250YWluaW5nIHRoZQotCSAqICAgICAgICAgcGF0aC4gQSB2YWx1ZSBzdGF0ZWQgd2l0aGluIGEgd2ViLnhtbCBmaWxlIHRha2VzIHByaW9yaXR5LgotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRKU1BWZXJzaW9uKElQYXRoIGZ1bGxQYXRoKSB7Ci0JCWZsb2F0IHZlcnNpb24gPSBkZWZhdWx0V2ViQXBwVmVyc2lvbjsKLQkJLyogdHJ5IGFwcGxpY2FibGUgd2ViLnhtbCBmaWxlIGZpcnN0ICovCi0JCURlcGxveW1lbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRDYWNoZWREZXNjcmlwdG9yKGZ1bGxQYXRoKTsKLQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCAmJiBkZXNjcmlwdG9yLnZlcnNpb24gIT0gbnVsbCkgewotCQkJdmVyc2lvbiA9IGRlc2NyaXB0b3IudmVyc2lvbi5mbG9hdFZhbHVlKCk7Ci0JCQlyZXR1cm4gY29udmVydFNwZWNWZXJzaW9ucyh2ZXJzaW9uKTsKLQkJfQotCi0JCS8qIGNoZWNrIGZhY2V0IHNldHRpbmdzICovCi0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoZnVsbFBhdGguc2VnbWVudCgwKSk7Ci0JCXZlcnNpb24gPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmdldER5bmFtaWNXZWJQcm9qZWN0VmVyc2lvbihwcm9qZWN0KTsKLQotCQlyZXR1cm4gY29udmVydFNwZWNWZXJzaW9ucyh2ZXJzaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ganNwRmlsZVBhdGgKLQkgKiBAcmV0dXJuIFByb3BlcnR5R3JvdXBzIG1hdGNoaW5nIHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBwYXRoIG9yIGFuIGVtcHR5Ci0JICogICAgICAgICBhcnJheSBpZiBubyB3ZWIueG1sIGZpbGUgZXhpc3RzIG9yIG5vIG1hdGNoaW5nIHByb3BlcnR5IGdyb3VwCi0JICogICAgICAgICB3YXMgZGVmaW5lZC4gQSByZXR1cm5lZCBQcm9wZXJ0eUdyb3VwIG9iamVjdCBzaG91bGQgYmUKLQkgKiAgICAgICAgIGNvbnNpZGVyZWQgc2hvcnQtbGl2ZWQgYW5kIG5vdCBzYXZlZCBmb3IgbGF0ZXIgdXNlLgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eUdyb3VwW10gZ2V0UHJvcGVydHlHcm91cHMoSVBhdGgganNwRmlsZVBhdGgpIHsKLQkJTGlzdCBtYXRjaGluZ0dyb3VwcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCURlcGxveW1lbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRDYWNoZWREZXNjcmlwdG9yKGpzcEZpbGVQYXRoKTsKLQkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBOT19QUk9QRVJUWV9HUk9VUFM7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmdyb3Vwcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRlc2NyaXB0b3IuZ3JvdXBzW2ldLm1hdGNoZXMoRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5nZXRSdW50aW1lUGF0aChqc3BGaWxlUGF0aCkudG9TdHJpbmcoKSwgZmFsc2UpKSB7Ci0JCQkJbWF0Y2hpbmdHcm91cHMuYWRkKGRlc2NyaXB0b3IuZ3JvdXBzW2ldKTsKLQkJCX0KLQkJfQotCQlpZiAobWF0Y2hpbmdHcm91cHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IuZ3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGRlc2NyaXB0b3IuZ3JvdXBzW2ldLm1hdGNoZXMoRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5nZXRSdW50aW1lUGF0aChqc3BGaWxlUGF0aCkudG9TdHJpbmcoKSwgdHJ1ZSkpIHsKLQkJCQkJbWF0Y2hpbmdHcm91cHMuYWRkKGRlc2NyaXB0b3IuZ3JvdXBzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChQcm9wZXJ0eUdyb3VwW10pIG1hdGNoaW5nR3JvdXBzLnRvQXJyYXkobmV3IFByb3BlcnR5R3JvdXBbbWF0Y2hpbmdHcm91cHMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGpzcEZpbGVQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCBvZiB0aGUgSlNQIGZpbGUKLQkgKiBAcGFyYW0gcmVmZXJlbmNlCi0JICogICAgICAgICAgICBhIHBhdGggcmVmZXJlbmNlIHRvIHRlc3QgZm9yCi0JICogQHJldHVybiBhIG1hdGNoaW5nIHVybC1tYXBwaW5nIHZhbHVlIGluIHRoZSBjb3JyZXNwb25kaW5nIGRlcGxveW1lbnQKLQkgKiAgICAgICAgIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBKU1AgZmlsZSBwYXRoLCBpZiBhIGRlcGxveW1lbnQKLQkgKiAgICAgICAgIGRlc2NyaXB0b3IgY291bGQgYmUgZm91bmQsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkxNYXBwaW5nKElQYXRoIGpzcEZpbGVQYXRoLCBTdHJpbmcgcmVmZXJlbmNlKSB7Ci0JCURlcGxveW1lbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRDYWNoZWREZXNjcmlwdG9yKGpzcEZpbGVQYXRoKTsKLQkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdNYXRjaGVyW10gbWFwcGluZ3MgPSBkZXNjcmlwdG9yLnVybFBhdHRlcm5zOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWFwcGluZ3NbaV0ubWF0Y2gocmVmZXJlbmNlKSkgewotCQkJCXJldHVybiBtYXBwaW5nc1tpXS5wYXR0ZXJuOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElQYXRoIGdldFdlYlhNTFBhdGgoSVBhdGggZnVsbFBhdGgpIHsKLQkJLyoKLQkJICogSXQgY2FuIHRha2UgdGhlIGJldHRlciBwYXJ0IG9mIGEgZnVsbCBzZWNvbmQgdG8gZG8gdGhpcywgc28gY2FjaGUKLQkJICogdGhlIHJlc3VsdC4KLQkJICovCi0JCUlQYXRoIHJlc29sdmVkID0gbnVsbDsKLQkJTWFwIG1hcEZvclByb2plY3QgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKExPQ0spIHsKLQkJCW1hcEZvclByb2plY3QgPSAoTWFwKSByZXNvbHZlZE1hcC5nZXQoZnVsbFBhdGguc2VnbWVudCgwKSk7Ci0JCQlpZiAobWFwRm9yUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJcmVzb2x2ZWQgPSAoSVBhdGgpIG1hcEZvclByb2plY3QuZ2V0KGZ1bGxQYXRoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1hcEZvclByb2plY3QgPSBuZXcgSGFzaE1hcCgpOwotCQkJCXJlc29sdmVkTWFwLnB1dChmdWxsUGF0aC5zZWdtZW50KDApLCBtYXBGb3JQcm9qZWN0KTsKLQkJCX0KLQkJfQotCQlpZiAocmVzb2x2ZWQgIT0gbnVsbCkgewotCQkJaWYgKF9kZWJ1Z1Jlc29sdXRpb25DYWNoZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlIHJlc29sdXRpb24gY2FjaGUgaGl0IGZvciAiICsgZnVsbFBhdGgpOyAvLyROT04tTkxTLTEkIAotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKF9kZWJ1Z1Jlc29sdXRpb25DYWNoZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlIHJlc29sdXRpb24gY2FjaGUgbWlzcyBmb3IgIiArIGZ1bGxQYXRoKTsgLy8kTk9OLU5MUy0xJCAKLQkJCX0KLQkJCXJlc29sdmVkID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5yZXNvbHZlKGZ1bGxQYXRoLCBTTEFTSF9XRUJfSU5GX1dFQl9YTUwpOwotCQkJbWFwRm9yUHJvamVjdC5wdXQoZnVsbFBhdGgsIHJlc29sdmVkKTsKLQkJfQotCQlyZXR1cm4gcmVzb2x2ZWQ7Ci0JfQotCi0JcHVibGljIElGaWxlIGdldFdlYlhNTChJUGF0aCBqc3BGaWxlUGF0aCkgewotCQlJUGF0aCB3ZWJ4bWxQYXRoID0gZ2V0V2ViWE1MUGF0aChqc3BGaWxlUGF0aCk7Ci0JCWlmICh3ZWJ4bWxQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHdlYnhtbFBhdGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVDYWNoZUVudHJ5KElQYXRoIGZ1bGxQYXRoKSB7Ci0JCS8qIGRvbid0IHVwZGF0ZSByaWdodCBub3c7IHJlbW92ZSBhbmQgd2FpdCBmb3IgYW5vdGhlciBxdWVyeSB0byB1cGRhdGUgKi8KLQkJZkRlcGxveW1lbnREZXNjcmlwdG9ycy5yZW1vdmUoZnVsbFBhdGgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTU4YWQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1wdWJsaWMgY2xhc3MgSGVhZFBhcnNlclRva2VuIHsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQlwcml2YXRlIFN0cmluZyBmVHlwZTsKLQotCXByb3RlY3RlZCBIZWFkUGFyc2VyVG9rZW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEhlYWRQYXJzZXJUb2tlbihTdHJpbmcgdHlwZSwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQl0aGlzKCk7Ci0JCWZUeXBlID0gdHlwZTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0ID0gdGV4dDsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGZUZXh0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAoInRleHQ6ICIgKyBmVGV4dCArICIgb2Zmc2V0OiAiICsgZlN0YXJ0ICsgIiB0eXBlOiAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmZGMxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotLyoKLSAqIAotICogQSBub24tcmVzaXphYmxlIGNsYXNzIGltcGxlbWVudGluZyB0aGUgYmVoYXZpb3Igb2YgamF2YS51dGlsLlN0YWNrLCBidXQKLSAqIGRpcmVjdGx5IGZvciB0aGUgPGNvZGU+IGludGVnZXIgPC9jb2RlPiBwcmltaXRpdmUuCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludFN0YWNrIHsKLQlwcml2YXRlIGludFtdIGxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgc2l6ZSA9IDA7Ci0KLQlwdWJsaWMgSW50U3RhY2soKSB7Ci0JCXRoaXMoMTAwKTsKLQl9Ci0KLQlwdWJsaWMgSW50U3RhY2soaW50IG1heGRlcHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxpc3QgPSBuZXcgaW50W21heGRlcHRoXTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7Ci0JCXJldHVybiBzaXplID09IDA7Ci0JfQotCi0JcHVibGljIGludCBnZXQoaW50IHNsb3QpIHsKLQkJcmV0dXJuIGxpc3Rbc2xvdF07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCWxpc3RbaV0gPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdAotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcGVlaygpIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBsaXN0W3NpemUgLSAxXTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBvcCgpIHsKLQkJaW50IHZhbHVlID0gcGVlaygpOwotCQlsaXN0W3NpemUgLSAxXSA9IC0xOwotCQlzaXplLS07Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoZXMgYW4gaXRlbSBvbnRvIHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUgLQotCSAqICAgICAgICAgICAgdGhlIGludCB0byBiZSBwdXNoZWQgb250byB0aGlzIHN0YWNrLgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPm5ld1ZhbHVlPC9jb2RlPiBhcmd1bWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IHB1c2goaW50IG5ld1ZhbHVlKSB7Ci0JCWlmIChzaXplID09IGxpc3QubGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgU3RhY2tPdmVyZmxvd0Vycm9yKCk7Ci0JCX0KLQkJbGlzdFtzaXplKytdID0gbmV3VmFsdWU7Ci0JCXJldHVybiBuZXdWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiIgK3NpemUgKyAiIFsiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXMuYXBwZW5kKGxpc3RbaV0pOwotCQkJaWYoaSA8IHNpemUgLSAxKSB7Ci0JCQkJcy5hcHBlbmQoIiwgIik7Ci0JCQl9Ci0JCX0KLQkJcy5hcHBlbmQoIl0iKTsKLQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzZjNTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyNCArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjQuMiBvbiA3LzI4LzA4IDk6MjkgQU0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXg8L2E+IDEuNC4yCi0gKiBvbiA3LzI4LzA4IDk6MjkgQU0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+RDovd29ya3NwYWNlcy93dHAzMDEvd29ya3NwYWNlL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9KU1BIZWFkVG9rZW5pemVyLmpGbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEpTUEhlYWRUb2tlbml6ZXIgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSA4MTkyOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUlOSVRJQUwgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEUV9TVFJJTkcgPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUV9TVFJJTkcgPSAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1BBR0VfRElSRUNUSVZFID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA2OwotCi0gIC8qKgotICAgKiBaWl9MRVhTVEFURVtsXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiBaWl9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICogbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9MRVhTVEFURVtdID0geyAKLSAgICAgMCwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNywgNwotICB9OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQ01BUF9QQUNLRUQgPSAKLSAgICAiXDFcMTFcMTBcMFwxXDZcMVwxMFwyXDBcMVw3XDIyXDBcMVw2XDFcMjBcMVwzNyIrCi0gICAgIlwyXDBcMVw1MVwxXDBcMVw0MFw2XDBcMVw0M1wxXDM0XDFcMFwxXDQ3XDFcMCIrCi0gICAgIlwxXDQ0XDVcMFwxXDUwXDFcNDFcMVwwXDFcMTNcMVwxMlwxXDU2XDFcMTRcMVw1MiIrCi0gICAgIlwxXDUzXDFcMzJcMVwyM1wxXDIxXDFcMjdcMVwwXDFcNDZcMVwzMFwxXDMzXDFcNTQiKwotICAgICJcMVwwXDFcMTdcMVwxNlwxXDM1XDFcMjJcMVwyNlwxXDBcMVw0NVwxXDM2XDFcMjQiKwotICAgICJcMVwzMVwxXDU1XDFcNDJcMVwxNVwxXDI1XDdcMFwxXDUzXDFcMzJcMVwyM1wxXDIxIisKLSAgICAiXDFcMjdcMVwwXDFcNDZcMVwzMFwxXDMzXDFcNTRcMVwwXDFcMTdcMVwxNlwxXDM1IisKLSAgICAiXDFcMjJcMVwyNlwxXDBcMVw0NVwxXDM2XDFcMjRcMVwzMVwxXDU1XDFcNDJcMVwxNSIrCi0gICAgIlwxXDI1XDEwMVwwXDFcNFwzXDBcMVw1XDE3XDBcMVwzXDE2XDBcMVwxXDIwXDAiKwotICAgICJcMVwzXDE2XDBcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgW10gWlpfQ01BUCA9IHp6VW5wYWNrQ01hcChaWl9DTUFQX1BBQ0tFRCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIERGQSBzdGF0ZXMgdG8gYWN0aW9uIHN3aXRjaCBsYWJlbHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQUNUSU9OID0genpVbnBhY2tBY3Rpb24oKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQUNUSU9OX1BBQ0tFRF8wID0KLSAgICAiXDEwXDBcMjRcMVwyXDJcMVwxXDFcMlwxXDNcMVw0XDFcNSIrCi0gICAgIlwxXDZcMVwxXDFcNVwxXDdcMVw1XDFcMVwxXDEwXDFcMSIrCi0gICAgIlwxXDExXDZcMFwxXDEyXDFcMTNcMTVcMFwxXDE0XDIwXDBcMVwxNSIrCi0gICAgIlwxXDBcMVwxNlwxXDBcMVwyXDFcM1wxXDRcMVw2XDNcMCIrCi0gICAgIlwxXDE3XDFcN1wxXDBcMVwxMFwxXDExXDEwXDBcMVwyMFw1XDAiKwotICAgICJcMVwxNFwxMlwwXDFcMTVcMVwxNlwxXDJcMVwxN1w2N1wwXDFcMjEiKwotICAgICJcMjBcMFwxXDIyXDRcMFwxXDIxXDE3XDBcMVwyMlw2XDBcMVwyMyIrCi0gICAgIlwxNVwwXDFcMjRcMVwwXDFcMjNcMlwwXDFcMjVcMTRcMFwxXDI0IisKLSAgICAiXDJcMFwxXDI1XDM0XDBcMVwyNlwxNFwwXDFcMjZcMlwwXDFcMjciKwotICAgICJcMTNcMFwxXDI3XDEzMlwwXDFcMzBcMVwwXDFcMzBcNlwwXDJcMzAiKwotICAgICJcMTFcMFwxXDMxXDFcMFwxXDMxXDJcMFwyXDMxXDExXDAiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0FjdGlvbigpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0NDZdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQWN0aW9uKFpaX0FDVElPTl9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBY3Rpb24oU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1VOS05PV05fRVJST1IgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTk9fTUFUQ0ggPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfUFVTSEJBQ0tfMkJJRyA9IDI7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgenpSZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB6ekJ1ZmZlcltdID0gbmV3IGNoYXJbWlpfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TWFya2VkUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpDdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB6ekVuZFJlYWQ7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqIAotICAgKiB6ekF0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRCT0wgPSB0cnVlOwotCi0gIC8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4genpFT0ZEb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCi0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIC8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLSAgICAgICAgcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNYSFRNTDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzV01MOwotCi0KLSAgICAgICAgcHVibGljIEpTUEhlYWRUb2tlbml6ZXIoKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgICAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotICAgICAgICAgICAgICAgIC8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgICAgICAgICAgICAgICB6elJlYWRlciA9IGluOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAgICAgICAgICAgICAgIHp6U3RhdGUgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gICAgICAgICAgICAgICAgLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgICAgICAgICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgICAgICAgICAgICAgICBBcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TWFya2VkUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gICAgICAgICAgICAgICAgLy96elB1c2hiYWNrUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHp6Q3VycmVudFBvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgICAgICAgICAgICAgKiBmcm9tIGlucHV0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpFbmRSZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAgICAgICAgICAgICAgIC8veXlsaW5lID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAgICAgICAgICAgICAgIHl5Y2hhciA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAgICAgICAgICAgICAgICAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAvL3l5Y29sdW1uID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAgICAgICAgICogb2YgYSBsaW5lCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpBdEJPTCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gICAgICAgICAgICAgICAgenpBdEVPRiA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gICAgICAgICAgICAgICAgenpFT0ZEb25lID0gZmFsc2U7Ci0KLQotICAgICAgICAgICAgICAgIGZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpc1hIVE1MPWZhbHNlOwotICAgICAgICAgICAgICAgIGlzV01MPWZhbHNlOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgICAgIGNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVRleHQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0gICAgICAgICAgICAgICAgZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0gICAgICAgIH0KLSAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotICAgICAgICAgICAgICAgIHl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1hIVE1MKCkgewotICAgICAgICAgICAgcmV0dXJuIGlzWEhUTUw7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXTUwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNXTUw7Ci0gICAgICAgIH0gICAgICAgIAotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSlNQSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMuenpSZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUEhlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB6elVucGFja0NNYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTk0KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZWZpbGxzIHRoZSBpbnB1dCBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGlmZiB0aGVyZSB3YXMgbmV3IGlucHV0LgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpSZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh6elN0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIHp6U3RhcnRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpFbmRSZWFkLXp6U3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHp6RW5kUmVhZC09IHp6U3RhcnRSZWFkOwotICAgICAgenpDdXJyZW50UG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ek1hcmtlZFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpTdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoenpDdXJyZW50UG9zID49IHp6QnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbenpDdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB6ekJ1ZmZlci5sZW5ndGgpOwotICAgICAgenpCdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB6elJlYWRlci5yZWFkKHp6QnVmZmVyLCB6ekVuZFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLmxlbmd0aC16ekVuZFJlYWQpOwotCi0gICAgaWYgKG51bVJlYWQgPiAwKSB7Ci0gICAgICB6ekVuZFJlYWQrPSBudW1SZWFkOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyB1bmxpa2VseSBidXQgbm90IGltcG9zc2libGU6IHJlYWQgMCBjaGFyYWN0ZXJzLCBidXQgbm90IGF0IGVuZCBvZiBzdHJlYW0gICAgCi0gICAgaWYgKG51bVJlYWQgPT0gMCkgewotICAgICAgaW50IGMgPSB6elJlYWRlci5yZWFkKCk7Ci0gICAgICBpZiAoYyA9PSAtMSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHp6QnVmZmVyW3p6RW5kUmVhZCsrXSA9IChjaGFyKSBjOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9ICAgICAKLSAgICB9Ci0KLQkvLyBudW1SZWFkIDwgMAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB6ekF0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQotICAgIGlmICh6elJlYWRlciAhPSBudWxsKQotICAgICAgenpSZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKiBEb2VzIG5vdCBjbG9zZSB0aGUgb2xkIHJlYWRlci4KLSAgICoKLSAgICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIAotICAgKiA8Yj5jYW5ub3Q8L2I+IGJlIHJldXNlZCAoaW50ZXJuYWwgYnVmZmVyIGlzIGRpc2NhcmRlZCBhbmQgbG9zdCkuCi0gICAqIExleGljYWwgc3RhdGUgaXMgc2V0IHRvIDx0dD5aWl9JTklUSUFMPC90dD4uCi0gICAqCi0gICAqIEBwYXJhbSByZWFkZXIgICB0aGUgbmV3IGlucHV0IHN0cmVhbSAKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0gICAgenpSZWFkZXIgPSByZWFkZXI7Ci0gICAgenpBdEJPTCAgPSB0cnVlOwotICAgIHp6QXRFT0YgID0gZmFsc2U7Ci0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQgPSAwOwotICAgIHp6Q3VycmVudFBvcyA9IHp6TWFya2VkUG9zID0gMDsKLSAgICB5eWNoYXIgPSAwOwotICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB6ekxleGljYWxTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBwdWJsaWMgZmluYWwgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggenpCdWZmZXIsIHp6U3RhcnRSZWFkLCB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZCApOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDx0dD5wb3M8L3R0PiBmcm9tIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0LiAKLSAgICogCi0gICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLSAgICoKLSAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gCi0gICAqICAgICAgICAgICAgQSB2YWx1ZSBmcm9tIDAgdG8geXlsZW5ndGgoKS0xLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0gICAqLwotICBwdWJsaWMgZmluYWwgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0gICAgcmV0dXJuIHp6QnVmZmVyW3p6U3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBJbiBhIHdlbGxmb3JtZWQgc2Nhbm5lciAobm8gb3Igb25seSBjb3JyZWN0IHVzYWdlIG9mIAotICAgKiB5eXB1c2hiYWNrKGludCkgYW5kIGEgbWF0Y2gtYWxsIGZhbGxiYWNrIHJ1bGUpIHRoaXMgbWV0aG9kIAotICAgKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggdGhpbmdzIHRoYXQgIkNhbid0IFBvc3NpYmx5IEhhcHBlbiIuCi0gICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZwotICAgKiAoZS5nLiBhIEpGbGV4IGJ1ZyBwcm9kdWNpbmcgYSBmYXVsdHkgc2Nhbm5lciBldGMuKS4KLSAgICoKLSAgICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICogaW4gZXJyb3IgZmFsbGJhY2sgcnVsZXMuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgenpTY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1taWl9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwdWJsaWMgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpICB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgenpNYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB6ekRvRU9GKCkgewotICAgIGlmICghenpFT0ZEb25lKSB7Ci0gICAgICB6ekVPRkRvbmUgPSB0cnVlOwotICAgICAgICAgICAgaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgIGludCB6eklucHV0OwotICAgIGludCB6ekFjdGlvbjsKLQotICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgaW50IHp6Q3VycmVudFBvc0w7Ci0gICAgaW50IHp6TWFya2VkUG9zTDsKLSAgICBpbnQgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICBjaGFyIFtdIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgIGNoYXIgW10genpDTWFwTCA9IFpaX0NNQVA7Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgeXljaGFyKz0genpNYXJrZWRQb3NMLXp6U3RhcnRSZWFkOwotCi0gICAgICBpZiAoenpNYXJrZWRQb3NMID4genpTdGFydFJlYWQpIHsKLSAgICAgICAgc3dpdGNoICh6ekJ1ZmZlckxbenpNYXJrZWRQb3NMLTFdKSB7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgY2FzZSAnXHUwMDBCJzoKLSAgICAgICAgY2FzZSAnXHUwMDBDJzoKLSAgICAgICAgY2FzZSAnXHUwMDg1JzoKLSAgICAgICAgY2FzZSAnXHUyMDI4JzoKLSAgICAgICAgY2FzZSAnXHUyMDI5JzoKLSAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOiAKLSAgICAgICAgICBpZiAoenpNYXJrZWRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6QXRCT0wgPSB6ekJ1ZmZlckxbenpNYXJrZWRQb3NMXSAhPSAnXG4nOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpCi0gICAgICAgICAgICB6ekF0Qk9MID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgICAgICAgICB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIGlmIChlb2YpIAotICAgICAgICAgICAgICB6ekF0Qk9MID0gZmFsc2U7Ci0gICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICB6ekF0Qk9MID0genpCdWZmZXJMW3p6TWFya2VkUG9zTF0gIT0gJ1xuJzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgenpBdEJPTCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB6ekFjdGlvbiA9IC0xOwotCi0gICAgICB6ekN1cnJlbnRQb3NMID0genpDdXJyZW50UG9zID0genpTdGFydFJlYWQgPSB6ek1hcmtlZFBvc0w7Ci0gIAotICAgICAgaWYgKHp6QXRCT0wpCi0gICAgICAgIHp6U3RhdGUgPSBaWl9MRVhTVEFURVt6ekxleGljYWxTdGF0ZSsxXTsKLSAgICAgIGVsc2UKLSAgICAgICAgenpTdGF0ZSA9IFpaX0xFWFNUQVRFW3p6TGV4aWNhbFN0YXRlXTsKLQotCi0gICAgICB6ekZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIGlmICh6ekN1cnJlbnRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICBlbHNlIGlmICh6ekF0RU9GKSB7Ci0gICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLSAgICAgICAgICAgIHp6Q3VycmVudFBvcyAgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgenpNYXJrZWRQb3MgICA9IHp6TWFya2VkUG9zTDsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgenpDdXJyZW50UG9zTCAgPSB6ekN1cnJlbnRQb3M7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgICA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpCdWZmZXJMICAgICAgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgICAgID0genpFbmRSZWFkOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgenpJbnB1dCA9IHp6Q01hcExbenpJbnB1dF07Ci0KLSAgICAgICAgICBib29sZWFuIHp6SXNGaW5hbCA9IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4genpOb0xvb2tBaGVhZCA9IGZhbHNlOwotCi0gICAgICAgICAgenpGb3JOZXh0OiB7IHN3aXRjaCAoenpTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ1OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQxOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IAotICAgICAgICAgICAgICAgIGNhc2UgNDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDQ0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQxOiB6elN0YXRlID0gNDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ0OiB6elN0YXRlID0gNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHp6U3RhdGUgPSA1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSA1MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDUzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDU2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpTdGF0ZSA9IDQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDQ3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpTdGF0ZSA9IDQ4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NDogenpTdGF0ZSA9IDQ5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gNTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA2MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA2MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSA1OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA2MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSA2MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDU6IHp6U3RhdGUgPSA2MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDY0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDY1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNjY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gNjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA2ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSA2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6U3RhdGUgPSA3MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSA3MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSA3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSA3MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDE6IHp6U3RhdGUgPSA3NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDc1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MzogenpTdGF0ZSA9IDc2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNzc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA3OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDM6IHp6U3RhdGUgPSA4MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDgxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDgyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gODM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDg1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDg1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDg1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDg3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDg4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDg5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA5MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDE6IHp6U3RhdGUgPSA5MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDkyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDk0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gOTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDM4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpTdGF0ZSA9IDkxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDk2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpTdGF0ZSA9IDkxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDk3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQxOiB6elN0YXRlID0gNDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ0OiB6elN0YXRlID0gNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQxOiB6elN0YXRlID0gNDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ0OiB6elN0YXRlID0gNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA5ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSA5OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDEwMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAxMDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MjogenpTdGF0ZSA9IDEwMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDEwNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHp6U3RhdGUgPSAxMDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDU6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTA2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDUzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDU4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpTdGF0ZSA9IDQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDQ3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpTdGF0ZSA9IDQ4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NDogenpTdGF0ZSA9IDQ5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQxOiB6elN0YXRlID0gNDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ0OiB6elN0YXRlID0gNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gMTEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTExOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA2NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSA2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDY4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDY5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDY1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDExMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSA2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDExMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSAxMTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gNjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM3OiB6elN0YXRlID0gMTE2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQzOiB6elN0YXRlID0gNzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA3NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSA3ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDc5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MzogenpTdGF0ZSA9IDgwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gODE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA4MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA4NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDM6IHp6U3RhdGUgPSA3NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDExNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSAxMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gMTIwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MzogenpTdGF0ZSA9IDgwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTIxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDEyMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA4MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAxMjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTI0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDg2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSA4NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA5MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA5MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDk1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDEyNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSA5OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDEyNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSAxMjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDEwMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gMTMwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSA0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDI6IHp6U3RhdGUgPSAxMDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDEzMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAxMzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMTM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHp6U3RhdGUgPSAxMDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDEzNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gNTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6elN0YXRlID0gNTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDU4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAxMTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTM3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDEzODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gNTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDExNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gMTQwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHp6U3RhdGUgPSAxMTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTQxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogenpTdGF0ZSA9IDE0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gMTE4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE0MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAxNDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDEyMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTIwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMTQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAxMjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTQ3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDE0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gODU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogenpTdGF0ZSA9IDEyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gMTUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSAxMzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpTdGF0ZSA9IDE1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTMxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gNDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQyOiB6elN0YXRlID0gMTAzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAxMDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMTMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDEzNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE1MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTMzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQzOiB6elN0YXRlID0gMTU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE1NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDM6IHp6U3RhdGUgPSAxNTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDEzNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB6elN0YXRlID0gMTU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSAxMzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpTdGF0ZSA9IDE2MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gMTQwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE2MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAxNjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogenpTdGF0ZSA9IDE0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTY1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAxNDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTY2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogenpTdGF0ZSA9IDE2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMTQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE2ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSAxNjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDE0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMTcxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSAxNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDE3MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTUxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMTUyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gMTc1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAxMDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMTMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDEzNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQzOiB6elN0YXRlID0gMTU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE3NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAxNzc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MzogenpTdGF0ZSA9IDE1NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB6elN0YXRlID0gMTc5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHp6U3RhdGUgPSAxNTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTgwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDE4MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTYwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMTYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxODM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDE2MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTYzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTg1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTg2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogenpTdGF0ZSA9IDE4NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6elN0YXRlID0gMTY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE4ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDM6IHp6U3RhdGUgPSAxODk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDE2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxOTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gMTkxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSAxNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTkyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDE5MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTcyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMTczOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE5NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSAxOTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDE1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAxNzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxOTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTk3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDE5ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB6elN0YXRlID0gMTc3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxOTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDE3OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMTc3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjAxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAxODE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDIwMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjA0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE4NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gMjA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSAxODc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDIwOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQzOiB6elN0YXRlID0gMTg5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDIxMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAyMTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDE5MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTkxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMjEzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSAxOTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjE0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDIxNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB6elN0YXRlID0gMTk1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDIxNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSAyMTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDE1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAxNzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDE5ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMjE5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyMjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE5OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDIyMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMTc3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAyMDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogenpTdGF0ZSA9IDIyMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTgyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjA1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDIwNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB6elN0YXRlID0gMjI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSAyMDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDIyNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyMjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDIxMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMjI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAyMTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjMwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDIzMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gMjE1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDIzMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSAyMzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDIxNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMjM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6U3RhdGUgPSAyMTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjM2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDIzNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjIwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTk5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjIxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxOTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogenpTdGF0ZSA9IDIyMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjIzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMjM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAyMjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDIwOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyMjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI0MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI0NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjI4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMjI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAyMzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjQ3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDI0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gMjMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI0OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAyNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDIzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDI1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHp6U3RhdGUgPSAyNTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDIzNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjM3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB6elN0YXRlID0gMjU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSAyMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjU2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDI1NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMjI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI1ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyMDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI0MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQ0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjQzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyMjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDI0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMjY1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAyNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjY2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDI2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjUxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMjM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDI1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHp6U3RhdGUgPSAyNTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjY5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDI3MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gMjcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHp6U3RhdGUgPSAyNTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI3MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSAyNzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDI1NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjU3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMjc2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyMjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjQxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjYwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyMjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI2MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjYzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjYyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSAyNjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI2NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjc3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDI3ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMjY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI3OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSAyODA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI2ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDIzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHp6U3RhdGUgPSAyNTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMjUzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAyNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjgxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDI4MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjcxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gMjcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI4MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6U3RhdGUgPSAyODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDI1NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSAyNzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyODU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI4NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHp6U3RhdGUgPSAyODc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDI3NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjc2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyODg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMjg5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSAyNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI5MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyOTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDI4MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjgwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyOTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB6elN0YXRlID0gMjkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyODE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSAyODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI4MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjk0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpTdGF0ZSA9IDI5NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjgzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMjg0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyODQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyOTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMjk3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyODU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyNTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6elN0YXRlID0gMjc0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyNzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB6elN0YXRlID0gMjg3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjk4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyODc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI5OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHp6U3RhdGUgPSAzMDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI4ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDI4OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjg5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzMDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ1OiB6elN0YXRlID0gMzAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjkxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzAzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzMDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDI5MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjkzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzA2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMwNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjk0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMjk1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzMDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMzA5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMjk3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDMxMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHp6U3RhdGUgPSAzMTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDI3NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHp6U3RhdGUgPSAyODc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDMwMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDMxMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzMTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMzE1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDU6IHp6U3RhdGUgPSAzMDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMwMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzE2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDMxNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMjc4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI5MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMwNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMwNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMjkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMwNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDMxODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzE5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzIwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyOTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMzA5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzIxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDMyMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHp6U3RhdGUgPSAzMjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDI4NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSAyOTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMxMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogenpTdGF0ZSA9IDMxMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzMjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6elN0YXRlID0gMzI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHp6U3RhdGUgPSAzMDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDMxNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzMjY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMzI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSAzMTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMxNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzI4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogenpTdGF0ZSA9IDMyOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzE4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMjkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMwNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMyMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMxOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzIxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMjk1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDMwOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzIyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6elN0YXRlID0gMzIzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDMzMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6U3RhdGUgPSAzMzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMyNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpTdGF0ZSA9IDMyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzMzI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMzMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAzMjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDMzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzI4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB6elN0YXRlID0gMzI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAxMzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMTM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzM2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6U3RhdGUgPSAzMzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzM3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpTdGF0ZSA9IDMzODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMzMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDMzOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAzNDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDMzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB6elN0YXRlID0gMzQyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAxMzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMTM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6U3RhdGUgPSAzMzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzQzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDM0NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMzQwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM0NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSAzNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMzogenpTdGF0ZSA9IDM0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzQ4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAzNDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzQ5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDM1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzUzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSAzNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzUxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzU3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDM1ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzU0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM2MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAzNjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDM1ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzU4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMzY0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM2NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAzNjY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAzNjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAzNjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDM2NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzY0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMzcwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gMzY2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMzcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMzY4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gMzc0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHp6U3RhdGUgPSAzNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM3MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzc1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogenpTdGF0ZSA9IDM3NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzcxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDM3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzcyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzc3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDM3ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzczOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDM3NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6U3RhdGUgPSAzNzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAzODA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzU6IHp6U3RhdGUgPSAzNzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM3NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzgxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDM4MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDM3ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6U3RhdGUgPSAzODM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAzODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzODU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzODY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMzg3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM4ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHp6U3RhdGUgPSAzODk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM4MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDM4MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzOTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM2OiB6elN0YXRlID0gMzkxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzOTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gMzkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM5NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAzOTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB6elN0YXRlID0gMzgzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMzg0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzk2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDM4NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzk3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDM5ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMzg5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM5OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSA0MDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM5MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNjogenpTdGF0ZSA9IDM5MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzkxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB6elN0YXRlID0gNDAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gMzkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDAzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gNDA1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAzOTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM5NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDQwODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzk2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6U3RhdGUgPSAzODM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAzODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gMzk4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNDEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSA0MDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDExOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQxMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB6elN0YXRlID0gNDAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQxMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSA0MTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAzOTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHp6U3RhdGUgPSA0MDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQxNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA0MTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogenpTdGF0ZSA9IDM5NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gNDA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQxNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA0MTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA0MTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQxOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNDEyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA0MjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogenpTdGF0ZSA9IDQxNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM3OiB6elN0YXRlID0gNDIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gNDE2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gNDI0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA0MTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQxODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDQyNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDE5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHp6U3RhdGUgPSA0MjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQyMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDQyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDIzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDQyNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDI0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQzMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gNDI2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQzMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA0MzI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDQyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDI4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gNDM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0Mjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNDMwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA0MzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQzMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNDM2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSA0MzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDM3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOTogenpTdGF0ZSA9IDQzODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0Mzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzk6IHp6U3RhdGUgPSA0Mzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MDogenpTdGF0ZSA9IDQ0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQwOiB6elN0YXRlID0gNDQwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQ0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDA6IHp6U3RhdGUgPSA0NDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MDogenpTdGF0ZSA9IDQ0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0NDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQwOiB6elN0YXRlID0gNDQ0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDA6IHp6U3RhdGUgPSA0NDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM5NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQ0NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzk0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBldmVyIHJlYWNoZWQsIHRoZXJlIGlzIGEgc2VyaW91cyBidWcgaW4gSkZsZXgKLSAgICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gfQotCi0gICAgICAgICAgaWYgKCB6eklzRmluYWwgKSB7Ci0gICAgICAgICAgICB6ekFjdGlvbiA9IHp6U3RhdGU7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgaWYgKCB6ek5vTG9va0FoZWFkICkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb24KLSAgICAgIHp6TWFya2VkUG9zID0genpNYXJrZWRQb3NMOwotCi0gICAgICBzd2l0Y2ggKHp6QWN0aW9uIDwgMCA/IHp6QWN0aW9uIDogWlpfQUNUSU9OW3p6QWN0aW9uXSkgewotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFO30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjY6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogCi0gICAgICAgICAgeyBpZih5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI4OiBicmVhazsKLSAgICAgICAgY2FzZSA0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDg6IAotICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMwOiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgICB7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMxOiBicmVhazsKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUxhbmd1YWdlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICAgIHsgaXNYSFRNTCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRW5jb2Rpbmc7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM3OiBicmVhazsKLSAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7ICByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRGlyZWN0aXZlRW5kOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUNvbnRlbnRUeXBlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQxOiBicmVhazsKLSAgICAgICAgY2FzZSAyOiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRGlyZWN0aXZlRW5kOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICAgIHsgaXNXTUwgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9QQUdFX0RJUkVDVElWRSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVTdGFydDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDY6IGJyZWFrOwotICAgICAgICBjYXNlIDY6IAotICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQ3OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDg6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xWZXJzaW9uOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogCi0gICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDUwOiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHp6SW5wdXQgPT0gWVlFT0YgJiYgenpTdGFydFJlYWQgPT0genpDdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB6ekF0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHp6RG9FT0YoKTsKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB6elNjYW5FcnJvcihaWl9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNzE2NTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQSGVhZFRva2VuaXplckNvbnN0YW50cyBleHRlbmRzIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMgewotCVN0cmluZyBQYWdlRGlyZWN0aXZlU3RhcnQgPSAiUGFnZURpcmVjdGl2ZVN0YXJ0IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQYWdlRGlyZWN0aXZlRW5kID0gIlBhZ2VEaXJlY3RpdmVFbmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBhZ2VMYW5ndWFnZSA9ICJQYWdlTGFuZ3VhZ2UiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBhZ2VFbmNvZGluZyA9ICJQYWdlRW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBhZ2VDb250ZW50VHlwZSA9ICJQYWdlQ29udGVudFR5cGUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2ZTVjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHJpdmF0ZSBTdHJpbmcgZkNoYXJzZXQ7Ci0KLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGVWYWx1ZTsKLQotCXByaXZhdGUgU3RyaW5nIGZMYW5ndWFnZTsKLQotCXByaXZhdGUgU3RyaW5nIGZQYWdlRW5jb2RpbmdWYWx1ZTsKLQotCXByaXZhdGUgSlNQSGVhZFRva2VuaXplciBmVG9rZW5pemVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgZlhNTERlY0VuY29kaW5nTmFtZTsKLQotCXByaXZhdGUgYm9vbGVhbiB1bmljb2RlQ2FzZTsKLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkhlYWRlclBhcnNlZDsKLQotCXByaXZhdGUgUmVhZGVyIGZSZWFkZXI7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlhIVE1MOwotCi0JcHJpdmF0ZSBib29sZWFuIGZXTUw7Ci0KLQotCS8qKgotCSAqIE5vIEFyZyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCWNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIE51bGxNZW1lbnRvKCkgewotCQkJc3VwZXIoKTsKLQkJCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJCXNldEphdmFDaGFyc2V0TmFtZShkZWZhdWx0Q2hhcnNldCk7Ci0JCQlzZXRBcHByb3ByaWF0ZURlZmF1bHQoZGVmYXVsdENoYXJzZXQpOwotCQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjb250ZW50VHlwZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbiBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcgcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZSB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzIG5vdCBwcmVzZW50LgotCQl9Ci0JCXJldHVybiBmQ29udGVudFR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRFbmNvZGluZ01lbWVudG8oKS5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JfQotCi0JLy8gdG8gZW5zdXJlIGNvbnNpc3Qgb3ZlcmFsbCBydWxlcyB1c2VkLCB3ZSdsbCBtYXJrIGFzCi0JLy8gZmluYWwsCi0JLy8gYW5kIHJlcXVpcmUgc3ViY2xhc3NlcyB0byBwcm92aWRlIGNlcnRhaW4gcGllY2VzIG9mCi0JLy8gdGhlCi0JLy8gaW1wbGVtZW50YXRpb24KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4KLQkJCS8vIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZwotCQkJLy8gcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZQotCQkJLy8gdGhhdCBhbiBlbXB0eQotCQkJLy8gc3RyaW5nIGluIGNvbnRlbnQgc2hvdWxkIGJlIHRyZWF0ZWQgc2FtZSBhcwotCQkJLy8gbm90IHByZXNlbnQuCi0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJaGFuZGxlU3BlY0RlZmF1bHQoKTsKLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkvLyBzYWZ0eSBuZXQKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgTnVsbE1lbWVudG8oKTsKLQkJfQotCQlyZXR1cm4gZkVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZkxhbmd1YWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJLy8gYnkgSlNQIFNwZWMKLQkJZmluYWwgU3RyaW5nIGVuYyA9ICJJU08tODg1OS0xIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZW5jID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmMpOwotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlcgotCQkJLy8gc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0oU3RyaW5nIHRva2VuVHlwZSkgewotCQlib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZSA9IGZhbHNlOwotCQlpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldFVURjgzQnl0ZUJPTVVzZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUgfHwgdG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJCWJ5dGVbXSBib20gPSAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUpID8gSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzE2QkUgOiBJQ29udGVudERlc2NyaXB0aW9uLkJPTV9VVEZfMTZMRTsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VW5pY29kZVN0cmVhbSh0cnVlKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VW5pY29kZUJPTShib20pOwotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGVBc1VuaWNvZGU7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGVyZSBjYW4gc29tZXRpbWVzIGJlIG11bGl0cGxlICdlbmNvZGluZ3MnIHNwZWNpZmllZCBpbiBhIGZpbGUuIFRoaXMKLQkgKiBpcyBhbiBhdHRlbXB0IHRvIGNlbnRyYWxpemUgdGhlIHJ1bGVzIGZvciBkZWNpZGluZyBiZXR3ZWVuIHRoZW0uCi0JICogUmV0dXJucyBlbmNvZGluZyBhY2NvcmRpbmcgdG8gcHJpb3JpdHk6IDEuIFhNTCBEZWNsYXJhdGlvbiAyLiBwYWdlCi0JICogZGlyZWN0aXZlIHBhZ2VFbmNvZGluZyBuYW1lIDMuIHBhZ2UgZGlyZWN0aXZlIGNvbnRlbnRUeXBlIGNoYXJzZXQgbmFtZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFwcHJvcHJpYXRlRW5jb2RpbmcoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoZlhNTERlY0VuY29kaW5nTmFtZSAhPSBudWxsKQotCQkJcmVzdWx0ID0gZlhNTERlY0VuY29kaW5nTmFtZTsKLQkJZWxzZSBpZiAoZlBhZ2VFbmNvZGluZ1ZhbHVlICE9IG51bGwpCi0JCQlyZXN1bHQgPSBmUGFnZUVuY29kaW5nVmFsdWU7Ci0JCWVsc2UgaWYgKGZDaGFyc2V0ICE9IG51bGwpCi0JCQlyZXN1bHQgPSBmQ2hhcnNldDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIGlmIGludmFsaWQgY2hhcnNldCBuYW1lIChpbiB3aGljaCBjYXNlCi0JICogImFwcHJvcHJpYXRlRGVmYXVsdCIgc2hvdWxkIGJlIHVzZWQsIGlmIGEgbmFtZSBpcyByZWFsbHkgbmVlZCBmb3Igc29tZQotCSAqICJzYXZlIGFueXdheSIgY2FzZXMpLgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIDEuIENoZWNrIGV4cGxpY2l0IG1hcHBpbmcgb3ZlcnJpZGVzIGZyb20KLQkJLy8gcHJvcGVydHkgZmlsZSAtLSBpdHMgaGVyZSB3ZSBwaWNrIHVwICJydWxlcyIgZm9yIGNhc2VzCi0JCS8vIHRoYXQgYXJlIG5vdCBldmVuIGluIEphdmEKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIDIuIFVzZSB0aGUgImNhbm9uaWNhbCIgbmFtZSBmcm9tIEpSRSBtYXBwaW5ncwotCQkvLyBOb3RlOiBzZWUgQ2hhcnNldCBKYXZhRG9jLCB0aGUgbmFtZSB5b3UgZ2V0IG9uZQotCQkvLyB3aXRoIGNhbiBiZSBhbGlhcywKLQkJLy8gdGhlIG5hbWUgeW91IGdldCBiYWNrIGlzICJzdGFuZGFyZCIgbmFtZS4KLQkJQ2hhcnNldCBqYXZhQ2hhcnNldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhQ2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZ2l2ZSBwcmlvcml0eSB0byBqYXZhIGNvbm9uaWNhbCBuYW1lLCBpZiBwcmVzZW50Ci0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBqYXZhQ2hhcnNldC5uYW1lKCk7Ci0JCQkvLyBidXQgc3RpbGwgYWxsb3cgb3ZlcnJpZGVzCi0JCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhyZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBKU1BIZWFkVG9rZW5pemVyIGdldFRva2luaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBKU1BIZWFkVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy8gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuY29kaW5nTmFtZSwKLQkJCS8vIEVuY29kaW5nTWVtZW50by5VU0VEX0NPTlRFTlRfVFlQRV9ERUZBVUxUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShlbmNvZGluZ05hbWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jb2RpbmdOYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xlZ2FsU3RyaW5nKFN0cmluZyB2YWx1ZVRva2VuVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAodmFsdWVUb2tlblR5cGUgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgd2hhdCBpcyBpbiAKLQkgKiBKU1BIZWFkVG9rZW5pemVyVGVzdGVyCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlQ29udGVudFR5cGVWYWx1ZShTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJLyoKLQkJICogQmFzZWQgcGFydGlhbGx5IG9uCi0JCSAqIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlQWRhcHRlckltcGwKLQkJICogLmdldE1pbWVUeXBlRnJvbUNvbnRlbnRUeXBlVmFsdWUoU3RyaW5nKSAsIGRpdmlkZXMgdGhlIGZ1bGwgdmFsdWUKLQkJICogaW50byBzZWdtZW50cyBhY2NvcmRpbmcgdG8gJzsnLCBhc3N1bWVzIHRoZSBmaXJzdCBzcGVjaWZpZXMgdGhlCi0JCSAqIGNvbnRlbnQgdHlwZSBpdHNlbGYgaWYgaXQgaGFzIG5vICc9JywgYW5kIHRoYXQgdGhlIHJlbWFpbmRlciBhcmUKLQkJICogcGFyYW1ldGVycyB3aGljaCBtYXkgc3BlY2lmeSBhIGNoYXJzZXQKLQkJICovCi0JCQotCQlTdHJpbmcgY2xlYW5Db250ZW50VHlwZVZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXBOb25MZXR0ZXJEaWdpdHMoY29udGVudFR5cGUpOwotCQkvKiBCcmVhayB0aGUgbWltZSBoZWFkZXIgaW50byB0aGUgbWFpbiB2YWx1ZSBhbmQgaXRzIHBhcmFtZXRlcnMsIHNlcGFyYXRlZCBieSAnOycgKi8KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xlYW5Db250ZW50VHlwZVZhbHVlLCAiOyIpOyAvLyROT04tTkxTLTEkCi0JCWludCB0TGVuID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCWlmICh0TGVuID09IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZ1tdIHRva2VucyA9IG5ldyBTdHJpbmdbdExlbl07Ci0JCWludCBqID0gMDsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCXRva2Vuc1tqXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWorKzsKLQkJfQotCQkKLQkJaW50IGZpcnN0UGFyYW1ldGVyID0gMDsKLQkJaWYgKHRva2Vuc1swXS5pbmRleE9mKCc9JykgPT0gLTEpIHsKLQkJCS8qCi0JCQkgKiBubyBlcXVhbCBzaWduIGluIHRoZSBmaXJzdCBzZWdtZW50LCBzbyBhc3N1bWUgaXQgaW5kaWNhdGVzIGEKLQkJCSAqIGNvbnRlbnQgdHlwZSBwcm9wZXJseQotCQkJICovCi0JCQlmQ29udGVudFR5cGUgPSB0b2tlbnNbMF0udHJpbSgpOwotCQkJZmlyc3RQYXJhbWV0ZXIgPSAxOwotCQl9Ci0JCS8qCi0JCSAqIG5vdyBoYW5kbGUgcGFyYW1ldGVycyBhcyBuYW1lPXZhbHVlIHBhaXJzLCBsb29raW5nIGZvciAiY2hhcnNldCIKLQkJICogc3BlY2lmaWNhbGx5Ci0JCSAqLwotCQlQYXR0ZXJuIGVxdWFsUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKj1cXHMqIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IGZpcnN0UGFyYW1ldGVyOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBwYWlyID0gZXF1YWxQYXR0ZXJuLnNwbGl0KHRva2Vuc1tpXSk7Ci0JCQlpZiAocGFpci5sZW5ndGggPCAyKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHBhaXJbMF0udHJpbSgpLmVxdWFscygiY2hhcnNldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmQ2hhcnNldCA9IHBhaXJbMV0udHJpbSgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBMb29rcyBmb3Igd2hhdCBldmVyIGVuY29kaW5nIHByb3BlcnRpZXMgdGhlIHRva2VuaXplciByZXR1cm5zLiBJdHMgdGhlCi0JICogcmVzcG9uc2liaWxpdHkgb2YgdGhlIHRva2VuaXplciB0byBzdG9wIHdoZW4gYXBwcm9wcmlhdGUgYW5kIG5vdCBnbyB0b28KLQkgKiBmYXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlSGVhZGVyKEpTUEhlYWRUb2tlbml6ZXIgdG9rZW5pemVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZlBhZ2VFbmNvZGluZ1ZhbHVlID0gbnVsbDsKLQkJZkNoYXJzZXQgPSBudWxsOwotCi0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCWRvIHsKLQkJCS8vIGRvbid0IHVzZSAnZ2V0JyBoZXJlIChhdCBsZWFzdCB1bnRpbCByZXNldCBpc3N1ZSBmaXhlZCkKLQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJU3RyaW5nIHRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQkJCWlmIChjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0odG9rZW5UeXBlKSkKLQkJCQl1bmljb2RlQ2FzZSA9IHRydWU7Ci0JCQllbHNlIHsKLQkJCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2RpbmcpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCUhlYWRQYXJzZXJUb2tlbiB2YWx1ZVRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCQlmWE1MRGVjRW5jb2RpbmdOYW1lID0gdmFsdWVUb2tlbi5nZXRUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUVuY29kaW5nKSB7Ci0JCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQlIZWFkUGFyc2VyVG9rZW4gdmFsdWVUb2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJCVN0cmluZyB2YWx1ZVRva2VuVHlwZSA9IHZhbHVlVG9rZW4uZ2V0VHlwZSgpOwotCQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodmFsdWVUb2tlblR5cGUpKSB7Ci0JCQkJCQkJZlBhZ2VFbmNvZGluZ1ZhbHVlID0gdmFsdWVUb2tlbi5nZXRUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUNvbnRlbnRUeXBlKSB7Ci0JCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQlIZWFkUGFyc2VyVG9rZW4gdmFsdWVUb2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJCVN0cmluZyB2YWx1ZVRva2VuVHlwZSA9IHZhbHVlVG9rZW4uZ2V0VHlwZSgpOwotCQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodmFsdWVUb2tlblR5cGUpKSB7Ci0JCQkJCQkJZkNvbnRlbnRUeXBlVmFsdWUgPSB2YWx1ZVRva2VuLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICh0b2tlblR5cGUgPT0gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlTGFuZ3VhZ2UpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCUhlYWRQYXJzZXJUb2tlbiB2YWx1ZVRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCQlmTGFuZ3VhZ2UgPSB2YWx1ZVRva2VuLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0JCWlmIChmQ29udGVudFR5cGVWYWx1ZSAhPSBudWxsKSB7Ci0JCQlwYXJzZUNvbnRlbnRUeXBlVmFsdWUoZkNvbnRlbnRUeXBlVmFsdWUpOwotCQl9Ci0JCWlmICh0b2tlbml6ZXIuaXNYSFRNTCgpKSB7Ci0JCQlmWEhUTUwgPSB0cnVlOwotCQl9Ci0JCWlmICh0b2tlbml6ZXIuaXNXTUwoKSApIHsKLQkJCWZXTUwgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlKU1BIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2luaXplcigpOwotCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCXRva2VuaXplci5yZXNldChmUmVhZGVyKTsKLQkJdHJ5IHsKLQkJCXBhcnNlSGVhZGVyKHRva2VuaXplcik7Ci0JCQkvLyB1bmljb2RlIHN0cmVhbSBjYXNlcyBhcmUgY3JlYXRlZCBkaXJlY3RseSBpbiBwYXJzZUhlYWRlcgotCQkJaWYgKCF1bmljb2RlQ2FzZSkgewotCQkJCVN0cmluZyBlbmMgPSBnZXRBcHByb3ByaWF0ZUVuY29kaW5nKCk7Ci0JCQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7Ci0JCWZSZWFkZXIgPSBudWxsOwotCQlmSGVhZGVyUGFyc2VkID0gZmFsc2U7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCQlmQ2hhcnNldCA9IG51bGw7Ci0JCWZDb250ZW50VHlwZVZhbHVlID0gbnVsbDsKLQkJZlBhZ2VFbmNvZGluZ1ZhbHVlID0gbnVsbDsKLQkJZlhNTERlY0VuY29kaW5nTmFtZSA9IG51bGw7Ci0JCXVuaWNvZGVDYXNlID0gZmFsc2U7Ci0JCWZYSFRNTD1mYWxzZTsKLQkJZldNTD1mYWxzZTsKLQl9Ci0KLQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyByZWFzb24pIHsKLQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5zdXJlSW5wdXRTZXQoKSB7Ci0JCWlmIChmUmVhZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlucHV0IG11c3QgYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNXTUwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJCS8vIE5vdGU6IHRoZXJlIGlzIGEgImhpZGRlbiBhc3N1bXB0aW9uIiBoZXJlIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMgbm90IHByZXNlbnQuCi0JCX0KLQkJcmV0dXJuIGZXTUw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNYSFRNTCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUgdGhhdCBhbiBlbXB0eQotCQkJLy8gc3RyaW5nIGluIGNvbnRlbnQgc2hvdWxkIGJlIHRyZWF0ZWQgc2FtZSBhcyBub3QgcHJlc2VudC4KLQkJfQotCQlyZXR1cm4gZlhIVE1MOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ4YjQ2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi0NCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGVfMTsNCi0Jc3RhdGljIHsNCi0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlDQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7DQotCX0NCi0NCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OWQzYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlXzE9UmVhZGluZyBEZXBsb3ltZW50IERlc2NyaXB0b3INCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50RmFjdG9yeUZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZhY3RvcnlGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmOWE3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50RmFjdG9yeUZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlRhZ01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEZhY3RvcnlGb3JKU1AgaW1wbGVtZW50cyBJRG9jdW1lbnRGYWN0b3J5IHsKLQotCXB1YmxpYyBEb2N1bWVudEZhY3RvcnlGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudEZhY3RvcnkjY3JlYXRlRG9jdW1lbnQoKQotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShuZXcgSlNQU291cmNlUGFyc2VyKCkpOwotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQkvLyByZW1lbWJlciwgdGhlIExvYWRlcgotCQkvLyB3aWxsIG5lZWQgdG8gZmluaXNoIGluaXRpYWxpemF0aW9uIG9mIHBhcnNlcgotCQkvLyBiYXNlZCBvbiAiZW1iZWRkZWQgY29udGVudCIKLQkJSlNQU291cmNlUGFyc2VyIHBhcnNlciA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJLy8gYWRkIGRlZmF1bHQgbmVzdGFibGUgdGFnIGxpc3QKLQkJYWRkTmVzdGFibGVQcmVmaXgocGFyc2VyLCBKU1AxMU5hbWVzcGFjZS5KU1BfVEFHX1BSRUZJWCk7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5lc3RhYmxlUHJlZml4KEpTUFNvdXJjZVBhcnNlciBwYXJzZXIsIFN0cmluZyB0YWdOYW1lKSB7Ci0JCVRhZ01hcmtlciBibSA9IG5ldyBUYWdNYXJrZXIodGFnTmFtZSk7Ci0JCXBhcnNlci5hZGROZXN0YWJsZVByZWZpeChibSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjMyMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotLyoqCi0gKiBDbGFzc2VzIHdoaWNoIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBoYXZlIHR3byByZXNwb25zaWJpbGl0aWVzLiAKLSAqIE9uZSBpcyB0byBwcm92aWRlCi0gKiBhbmQgZW1iZWRkZWQgZmFjdG9yeSByZWdpc3RyeSBmb3IgSlNQIEF3YXJlIElOb2RlQWRhcHRlciBGYWN0b3JpZXMKLSAqIHRvIHVzZS4gVGhlIG90aGVyIGlzIHRvIG1vbml0b3IgcGFnZSBkaXJlY3RpdmVzIGFuZCBpZiAKLSAqIGEgY2hhbmdlIGluIGVtYmVkZGVkIHR5cGUgaXMgaXMgbWFkZSwgaXQgd2lsbCBzaWduYWwgCi0gKiB0aGUgc3RydWN0dXJlZE1vZGVsIHRoYXQgaXQgbmVlZHMgdG8gcmVpbml0aWFsaXplIGl0c2VsZi4KLSAqLwotcHVibGljIGludGVyZmFjZSBQYWdlRGlyZWN0aXZlQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCk7Ci0KLQkvKioKLQkgKiBUaGlzIHNldHRlciBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlLCBzaG9ydGx5IGFmdGVyCi0JICogaW5pdGlhbGl6YXRpb24uCi0JICovCi0Jdm9pZCBzZXRFbWJlZGRlZFR5cGUoRW1iZWRkZWRUeXBlSGFuZGxlciBoYW5kbGVyKTsKLQotCUVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0RW1iZWRkZWRUeXBlKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB0byBnaXZlIHRoaXMgYWRhcHRlciBhIGNoYW5jZSB0byB1c2UKLQkgKiB0aGUgQWRhcHRlckZhY3RvcmllcyBmcm9tIHRoZSBFbWJlZGRlZFR5cGVIYW5kbGVyCi0JICogdG8gYWRhcHQgdGhlIG5vZGUuIEl0cyB0byBiZSB1c2VkIGJ5IEpTUEF3YXJlQWRhcHRlckZhY3RvcmllcwotCSAqIHRvIChwb3RlbnRpYWxseSkgYWRhcHQgbm9kZXMgZnJvbSB0aGUgZW1iZWRkZWQgY29udGVudCB0eXBlLgotCSAqLwotCUlOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSk7Ci0KLQl2b2lkIGFkZEVtYmVkZGVkRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpOwotCi0JLyoqCi0JICogTWV0aG9kIHNldExhbmd1YWdlLgotCSAqIEBwYXJhbSBsYW5ndWFnZQotCSAqLwotCXZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKTsKLQotCUlOb2RlTm90aWZpZXIgZ2V0VGFyZ2V0KCk7Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5ODZkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGFkYXB0cyBkb2N1bWVudCAKLSAqIHdpdGggdGhlIGFuIGluc3RhbmNlIG9mIFBhZ2VEaXJlY3RpdmVBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQotCXByaXZhdGUgUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5LgotCSAqIE5vdGU6IGl0cyBpbXBvcnRhbnQgbm90IHRvIGJlIGEgc2luZ2xldG9uLCBzaW5jZQotCSAqIHRoaXMgZmFjdG9yeSBuZWVkcyB0byB0cmFjayBpdHMgYWRhcHRlcihzKSBhbmQgcmVsZWFzZQotCSAqIHRoZW0gd2hlbiB0aGV5IGFyZSByZWxlYXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcktleQotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzCi0JICovCi0JcHJvdGVjdGVkIFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBubyBhcmd1bWVudCBjb25zdHJ1Y3RvciBhc3N1bWVzIGl0cyBhIAotCSAqIEZhY3RvcnkgZm9yIFBhZ2VEaXJlY3RpdmVBZGFwdGVyCi0JICovCi0JcHVibGljIFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJdGhpcyhQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgdGFyZ2V0OwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQlyZXN1bHQgPSBnZXRBZGFwdGVySW5zdGFuY2UodGFyZ2V0KTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKHBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UgIT0gbnVsbCkgewotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZS5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXZSBhc3N1bWUgdGhpcyBpcyBvbmx5IGNhbGxlZCBmb3IgJ2RvY3VtZW50JyB0YXJnZXQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFnZURpcmVjdGl2ZUFkYXB0ZXIgZ2V0QWRhcHRlckluc3RhbmNlKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCS8vIGlmIG91ciBpbnN0YW5jZSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50Ci0JCS8vIHRhcmdldCwgdGhlbiwgc29tZWhvdywgdGhlIGRvY3VtZW50IG5vZGUgbXVzdCAKLQkJLy8gaGF2ZSBjaGFuZ2VkIGZvciBhIG1vZGVsLCBzbyB3ZSBzaG91bGQgcmVsZWFzZSAKLQkJLy8gb2xkIGFkYXB0ZXIgYW5kIGNyZWF0ZSBuZXcgb25lIGZvciBuZXcgZG9jdW1lbnQgCi0JCS8vIG5vZGUuIFRoaXMgaXMgcHJvYmFibHkgYSBwcm9ncmFtbWluZyBlcnJvci4KLQkJaWYgKHBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UgIT0gbnVsbCkgewotCQkJaWYgKHRhcmdldCAhPSBwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlLmdldFRhcmdldCgpKSB7Ci0JCQkJcmVsZWFzZSgpOwotCQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UgPSBuZXcgUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsKHRhcmdldCk7Ci0JCQl9Ci0JCQkvLyBlbHNlIHJldHVybiB0aGUgb25lIHdlIGhhdmUKLQkJfQotCQllbHNlIHsKLQkJCS8vIGlmIGlzIGVxdWFsIHRvIG51bGwsIGNyZWF0ZSBhIG5ldyBvbmUKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UgPSBuZXcgUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsKHRhcmdldCk7Ci0JCX0KLQkJQXNzZXJ0LmlzTm90TnVsbChwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlLCAicGFnZURpcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSB3YXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0KLQkJcmV0dXJuIG5ldyBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwY2M4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVN0YXRlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBoYXMgdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHByb3ZpZGUgYW4gZW1iZWRkZWQgZmFjdG9yeSByZWdpc3RyeQotICogZm9yIEpTUCBBd2FyZSBJTm9kZUFkYXB0ZXIgRmFjdG9yaWVzIHRvIHVzZS4KLSAqIAotICogVHlwaWNhbGx5LCB0aGUgZW1iZWRkZWQgdHlwZSBpcyB0byBiZSBjb25zaWRlcmVkIGEgZmVhdHVyZSBvZiB0aGUgZG9jdW1lbnQsCi0gKiBzbyBKU1AgQXdhcmUgQWRwYXRlckZhY3RvcmllcyBzaG91bGQgY2FsbAotICogZ2V0QWRhcHRlcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcykgZGlyZWN0b3kgb24gdGhlIGRvY3VtZW50IChvciBvd25pbmcKLSAqIGRvY3VtZW50KSBub2RlLgotICovCi1wdWJsaWMgY2xhc3MgUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgUGFnZURpcmVjdGl2ZUFkYXB0ZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSX0NIQVJTRVQgPSAiY2hhcnNldCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBPYmplY3QgYWRhcHRlclR5cGUgPSBQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzczsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWw7Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIEpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZUyA9IG5ldyBTdHJpbmdbXXsiamF2YXNjcmlwdCIsICJqYXZhc2NyaXB0MS4wIiwgImphdmFzY3JpcHQxLjFfMyIsICJqYXZhc2NyaXB0MS4yIiwgImphdmFzY3JpcHQxLjMiLCAiamF2YXNjcmlwdDEuNCIsICJqYXZhc2NyaXB0MS41IiwgImphdmFzY3JpcHQxLjYiLCAianNjcmlwdCIsICJzYXNoc2NyaXB0In07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTkkIC8vJE5PTi1OTFMtMTAkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIEpBVkFfTEFOR1VBR0VfS0VZUyA9IG5ldyBTdHJpbmdbXXsiamF2YSJ9OyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsLgotCSAqLwotCXB1YmxpYyBQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJbm90aWZpZXJBdENyZWF0aW9uID0gdGFyZ2V0OwotCQkvLyB3ZSBuZWVkIHRvIHJlbWVtYmVyIG91ciBpbnN0YW5jZSBvZiBtb2RlbCwKLQkJLy8gaW4gY2FzZSB3ZSBuZWVkIHRvICJzaWduYWwiIGEgcmUtaW5pdCBuZWVkZWQuCi0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgdGFyZ2V0OwotCQkJbW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHBhcnNlcyB0aGUgZnVsbCBjb250ZW50VHlwZSB2YWx1ZSBpbnRvIGl0cyB0d28gcGFydHMgdGhlIGNvbnRlbnRUeXBlLAotCSAqIGFuZCB0aGUgY2hhcnNldCwgaWYgcHJlc2VudC4gTm90ZTogdGhpcyBtZXRob2QgaXMgYSBsaWdodGx5IG1vZGlmaWVkCi0JICogdmVyc2lvbiBvZiBhIG1ldGhvZCBpbiBBYnN0cmFjdEhlYWRQYXJzZXIuIFRoZXJlLCB3ZSdyZSBtb3N0bHkKLQkgKiBpbnRlcmVzdGVkIGluIHRoZSBjaGFyc2V0IHBhcnQgb2YgY29udGVudFR5cGVWYWx1ZS4gSGVyZSwgd2UncmUgbW9zdGx5Ci0JICogaW50ZXJlc3RlZCBpbiB0aGUgbWltZVR5cGUgcGFydC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRNaW1lVHlwZUZyb21Db250ZW50VHlwZVZhbHVlKFN0cmluZyBjb250ZW50VHlwZVZhbHVlKSB7Ci0JCWlmIChjb250ZW50VHlwZVZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGNsZWFuQ29udGVudFR5cGVWYWx1ZSA9IFN0cmluZ1V0aWxzLnN0cmlwTm9uTGV0dGVyRGlnaXRzKGNvbnRlbnRUeXBlVmFsdWUpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGVhbkNvbnRlbnRUeXBlVmFsdWUsICI7PSBcdFxuXHJcZiIpOyAvLyROT04tTkxTLTEkCi0JCWludCB0TGVuID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCS8vIGlmIGNvbnRhaW5zIGVuY29kaW5nIHNob3VsZCBoYXZlIHRocmVlIHRva2VucywgdGhlIG1pbWV0eXBlLCB0aGUKLQkJLy8gd29yZCAnY2hhcnNldCcsIGFuZCB0aGUgZW5jb2RpbmcgdmFsdWUKLQkJU3RyaW5nW10gdG9rZW5zID0gbmV3IFN0cmluZ1t0TGVuXTsKLQkJaW50IGogPSAwOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJdG9rZW5zW2pdID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaisrOwotCQl9Ci0JCS8vIAotCQkvLyBGb2xsb3dpbmcgaXMgdGhlIGNvbW1vbiBmb3JtIGZvciB0YXJnZXQgZXhwcmVzc2lvbgotCQkvLyA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0JCS8vIEJ1dCBhcHBhcnJlbnRseSBpcyBhbHNvIHZhbGlkIHdpdGhvdXQgdGhlIGNvbnRlbnQgdHlwZSB0aGVyZSwKLQkJLy8ganVzdCB0aGUgY2hhcnNldCwgYXMgZm9sbG93czoKLQkJLy8gPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJjaGFyc2V0PVVURi04Ij4KLQkJLy8gU28gd2UnbGwgbG9vcCB0aHJvdWdoIHRva2VucyBhbmQga2V5IG9mZiBvZiAnY2hhcnNldCcKLQotCQlpbnQgY2hhcnNldFBvcyA9IC0xOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5lcXVhbHNJZ25vcmVDYXNlKFNUUl9DSEFSU0VUKSkgewotCQkJCWNoYXJzZXRQb3MgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIFN0cmluZyBjaGFyc2V0ID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gbnVsbDsKLQkJaWYgKGNoYXJzZXRQb3MgPiAtMSkgewotCQkJLy8gY2FzZSB3aGVyZSBjaGFyc2V0IHdhcyBwcmVzZW50Ci0JCQkvLyBpbnQgY2hhcnNldFZhbHVlUG9zID0gY2hhcnNldFBvcyArIDE7Ci0JCQkvLyBpZiAoY2hhcnNldFZhbHVlUG9zIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJLy8gY2hhcnNldCA9IHRva2Vuc1tjaGFyc2V0VmFsdWVQb3NdOwotCQkJLy8gfQotCQkJaW50IGNvbnRlbnRUeXBlVmFsdWVQb3MgPSBjaGFyc2V0UG9zIC0gMTsKLQkJCWlmIChjb250ZW50VHlwZVZhbHVlUG9zID4gLTEpIHsKLQkJCQljb250ZW50VHlwZSA9IHRva2Vuc1tjb250ZW50VHlwZVZhbHVlUG9zXTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIGNoYXJzZXQgd2FzIG5vdCBwcmVzZW50LCBzbyBpZiB0aGVyZSdzCi0JCQkvLyBhIHZhbHVlLCB3ZSBhc3N1bWUgaXRzIHRoZSBjb250ZW50VHlwZSB2YWx1ZQotCQkJaWYgKHRva2Vucy5sZW5ndGggPiAwKSB7Ci0JCQkJY29udGVudFR5cGUgPSB0b2tlbnNbMF07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRUeXBlOwotCX0KLQotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZFR5cGVIYW5kbGVyOwotCXByaXZhdGUgTGlzdCBlbWJlZGRlZEZhY3RvcnlSZWdpc3RyeSA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIFN0cmluZyBjYWNoZWRMYW5ndWFnZTsKLQlwcml2YXRlIFN0cmluZyBjYWNoZWRDb250ZW50VHlwZTsKLQlwcml2YXRlIElOb2RlTm90aWZpZXIgbm90aWZpZXJBdENyZWF0aW9uOwotCXByaXZhdGUgU3RyaW5nIGVsSWdub3JlZCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBmaXJzdExhbmd1YWdlUG9zaXRpb24gPSAtMTsKLQlwcml2YXRlIGludCBmaXJzdENvbnRlbnRUeXBlUG9zaXRpb24gPSAtMTsKLQotCS8qCi0JICogQHNlZSBJTm9kZUFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gYWRhcHRlclR5cGUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTm9kZUFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyLCBpbnQsIE9iamVjdCwgT2JqZWN0LAotCSAqICAgICAgT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW1iZWRkZWRUeXBlKEVtYmVkZGVkVHlwZUhhbmRsZXIgaGFuZGxlcikgewotCQkvLyBpZiByZWFsbHkgdGhlIHNhbWUgaGFuZGxlciwgbm8gbmVlZCBmb3IgZnVydGhlciBwcm9jZXNzaW5nCi0JCWlmIChlbWJlZGRlZFR5cGVIYW5kbGVyID09IGhhbmRsZXIpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyB0aGVuIG9uZSBleGlzdHMsIGFuZCB0aGUgbmV3IG9uZSBpcyB0cnVlbHkgZGlmZmVyZW50LCBzbyB3ZSBuZWVkIHRvCi0JCS8vIHJlbGVhc2UgYW5kIHJlbW92ZSBjdXJyZW50IGZhY3RvcmllcwotCQlpZiAoZW1iZWRkZWRUeXBlSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBsaXN0ID0gZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChsaXN0Lmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBsaXN0Lm5leHQoKTsKLQkJCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCX0KLQotCQkJZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkuY2xlYXIoKTsKLQkJfQotCi0JCWVtYmVkZGVkVHlwZUhhbmRsZXIgPSBoYW5kbGVyOwotCQkvLyB3aGVuIHRoZSBoYW5kbGVyIGlzIHNldCwgInRyYW5zZmVyIiBpdHMgZmFjdG9yaWVzIHRvIG91ciBvd24gbGlzdC4KLQkJLy8gbm90ZTogb3VyIG93biBsaXN0IG1heSBhbHNvIGJlIGFkZGVkIHRvIGVsc2Ugd2hlcmUsIHN1Y2ggYXMgb24KLQkJLy8gImVkaXRvciBzaWRlIi4KLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbWJlZGRlZFR5cGVIYW5kbGVyLmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkuYWRkKGZhY3RvcnkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBQYWdlRGlyZWN0aXZlQWRhcHRlciNhZGFwdChJTm9kZU5vdGlmaWVyLCBPYmplY3QpCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlJTm9kZUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgZW1iZWRkZWRDb250ZW50VHlwZSBoYXNuJ3QgYmVlbiBzZXQsCi0JCS8vIHRoZW4gd2UgY2FuIG5vdCBhZGFwdCBpdC4KLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgIT0gbnVsbCkgewotCQkJaWYgKGVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5Lml0ZXJhdG9yKCk7Ci0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCWZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZmFjdG9yeS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQkJCQlyZXN1bHQgPSBmYWN0b3J5LmFkYXB0KG5vdGlmaWVyKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFBhZ2VEaXJlY3RpdmVBZGFwdGVyI2dldEVtYmVkZGVkVHlwZSgpCi0JICovCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0RW1iZWRkZWRUeXBlKCkgewotCQlpZiAoZW1iZWRkZWRUeXBlSGFuZGxlciA9PSBudWxsKSB7Ci0JCQllbWJlZGRlZFR5cGVIYW5kbGVyID0gZ2V0RGVmYXVsdEVtYmVkZGVkVHlwZSgpOwotCQl9Ci0JCXJldHVybiBlbWJlZGRlZFR5cGVIYW5kbGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVtYmVkZGVkRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJLy8gc2hvdWxkIHdlIGNoZWNrIGlmIGFscmVhZHkgZXhpc3RzIGluIGxpc3Q/Ci0JCWVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5LmFkZChmYWN0b3J5KTsKLQl9Ci0KLQkvLyAvKioKLQkvLyAqIFVzZWQgYnkgUGFnZURpcmVjdGl2ZVdhdGNoZXJzIHRvIHNpZ25hbCB0aGF0IHNvbWUgaW1wb3J0YW50IGF0dHJpYnV0ZQotCS8vIGhhcyBjaGFuZ2VkLCBhbmQKLQkvLyAqIGFueSBjYWNoZWQgdmFsdWVzIHNob3VsZCBiZSByZS1jYWxjdWF0ZWQKLQkvLyAqLwotCS8vIHZvaWQgY2hhbmdlZCgpIHsKLQkvLyAvLyB3ZSB3b24ndCBhY3R1YWxseSBjaGVjayBpZiBjaGFuZ2UgaXMgbmVlZGVkLCBpZiB0aGUgbW9kZWwgc3RhdGUgaXMKLQkvLyBhbHJlYWR5IGNoYW5naW5nLgotCS8vIGlmICghbW9kZWwuaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCkpIHsKLQkvLyAvLyBnbyB0aHJvdWdoIG91ciBsaXN0IG9mIHBhZ2Ugd2F0Y2hlciBhZGFwdGVycywgYW5kIHVwZGF0ZXMgdGhlCi0JLy8gYXR0cmlidXRlcwotCS8vIC8vIHdlJ3JlIGludGVyZXN0ZWQgaW4sIGlmIGFuZCBvbmx5IGlmIHRoZXkgYXJlIHRoZSBlYXJsaWVzdCBvY2N1cmFuY2UKLQkvLyBpbiB0aGUgcmVzb3VyY2UKLQkvLyBTdHJpbmcgcG90ZW50aWFsQ29udGVudFR5cGUgPSBudWxsOwotCS8vIFN0cmluZyBwb3RlbnRpYWxMYW5ndWFnZSA9IG51bGw7Ci0JLy8gaW50IGNvbnRlbnRUeXBlUG9zaXRpb24gPSAtMTsKLQkvLyBpbnQgbGFuZ3VhZ2VQb3NpdGlvbiA9IC0xOwotCS8vIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFnZURpcmVjdGl2ZVdhdGNoZXJzLml0ZXJhdG9yKCk7Ci0JLy8gd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCS8vIFBhZ2VEaXJlY3RpdmVXYXRjaGVyIHBkV2F0Y2hlciA9IChQYWdlRGlyZWN0aXZlV2F0Y2hlcikKLQkvLyBpdGVyYXRvci5uZXh0KCk7Ci0JLy8gU3RyaW5nIGNvbnRlbnRUeXBlID0gcGRXYXRjaGVyLmdldENvbnRlbnRUeXBlKCk7Ci0JLy8gU3RyaW5nIGxhbmd1YWdlID0gcGRXYXRjaGVyLmdldExhbmd1YWdlKCk7Ci0JLy8gaW50IG9mZnNldCA9IHBkV2F0Y2hlci5nZXRPZmZzZXQoKTsKLQkvLyBpZiAocG90ZW50aWFsQ29udGVudFR5cGUgPT0gbnVsbCB8fCAoaGFzVmFsdWUoY29udGVudFR5cGUpICYmIChvZmZzZXQgPAotCS8vIGNvbnRlbnRUeXBlUG9zaXRpb24pKSkgewotCS8vIHBvdGVudGlhbENvbnRlbnRUeXBlID0gY29udGVudFR5cGU7Ci0JLy8gY29udGVudFR5cGVQb3NpdGlvbiA9IG9mZnNldDsKLQkvLyB9Ci0JLy8gfQotCS8vIC8vIG5vdyB3ZSBoYXZlIHRoZSBiZXN0IGNhbmRpYXRlcyBmb3IgY2FjaGVkIHZhbHVlcywgbGV0J3Mgc2VlIGlmCi0JLy8gdGhleSd2ZSByZWFsbHkgY2hhbmdlZCBmcm9tCi0JLy8gLy8gd2hhdCB3ZSBoYWQuIElmIHNvLCBub3RlIHdlIGdvIHRocm91Z2ggdGhlIHNldHRlcnMgc28gc2lkZSBlZmZlY3RzCi0JLy8gY2FuIHRha2UgcGxhY2UgdGhlcmUuCi0JLy8gcG90ZW50aWFsQ29udGVudFR5cGUgPQotCS8vIGdldE1pbWVUeXBlRnJvbUNvbnRlbnRUeXBlVmFsdWUocG90ZW50aWFsQ29udGVudFR5cGUpOwotCS8vIGlmIChwb3RlbnRpYWxDb250ZW50VHlwZSA9PSBudWxsIHx8IHBvdGVudGlhbENvbnRlbnRUeXBlLmxlbmd0aCgpID09IDApCi0JLy8gewotCS8vIC8vcG90ZW50aWFsQ29udGVudFR5cGUgPSBnZXREZWZhdWx0Q29udGVudFR5cGUoKTsKLQkvLyB9IGVsc2UgewotCS8vIHNldENhY2hlZENvbnRlbnRUeXBlKHBvdGVudGlhbENvbnRlbnRUeXBlKTsKLQkvLyB9Ci0JLy8KLQkvLyBpZiAocG90ZW50aWFsTGFuZ3VhZ2UgIT0gbnVsbCAmJiBoYXNWYWx1ZShwb3RlbnRpYWxMYW5ndWFnZSkpIHsKLQkvLyBzZXRDYWNoZWRMYW5ndWFnZShwb3RlbnRpYWxMYW5ndWFnZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0Jdm9pZCBjaGFuZ2VkQ29udGVudFR5cGUoaW50IGVsZW1lbnRPZmZzZXQsIFN0cmluZyBuZXdWYWx1ZSkgewotCQkvLyBvbmx5IG5lZWQgdG8gcHJvY2VzcyBpZiB0aGlzIG5ldyB2YWx1ZSBpcwotCQkvLyBlYXJsaWVyIGluIHRoZSBmaWxlIHRoYW4gb3VyIGN1cnJlbnQgdmFsdWUKLQkJaWYgKGZpcnN0Q29udGVudFR5cGVQb3NpdGlvbiA9PSAtMSB8fCBlbGVtZW50T2Zmc2V0IDw9IGZpcnN0Q29udGVudFR5cGVQb3NpdGlvbikgewotCQkJLy8gZHdfVE9ETzogdXBkYXRlIGVtYmVkZGVkIHBhcnRpdGlvbmVyIGluIEpTUCBkb2N1bWVudAotCQkJLy8gcGFydGl0aW9uZXIKLQkJCS8vIG5zZF9UT0RPOiB1cGRhdGUgZW1iZWRkZWQgcGFydGl0aW9uZXIgaW4gSlNQIGRvY3VtZW50Ci0JCQkvLyBwYXJ0aXRpb25lcgotCi0JCQkvLyBubyBuZWVkIHRvIGNoYW5nZSBjdXJyZW50IHZhbHVlLCBpZiB3ZSdyZSB0b2xkIHNvbWUKLQkJCS8vIGVhcmxpZXIgdmFsdWUgaXMgbnVsbCBvciBibGFuayAoc291bmRzIGxpa2UgYW4gZXJyb3IsIGFueXdheSkKLQkJCWlmIChoYXNWYWx1ZShuZXdWYWx1ZSkpIHsKLQkJCQlmaXJzdENvbnRlbnRUeXBlUG9zaXRpb24gPSBlbGVtZW50T2Zmc2V0OwotCQkJCVN0cmluZyBwb3RlbnRpYWxDb250ZW50VHlwZSA9IGdldE1pbWVUeXBlRnJvbUNvbnRlbnRUeXBlVmFsdWUobmV3VmFsdWUpOwotCQkJCS8vIG9ubHkgZG8gdGhlIHNldCBwcm9jZXNzaW5nIGlmIGRpZmZlcmVudAotCQkJCS8vIGZyb20gd2hhdCBpdCBhbHJlYWR5IGlzCi0JCQkJLy8gaWYgKCFwb3RlbnRpYWxDb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKGNhY2hlZExhbmd1YWdlKSkKLQkJCQkvLyB7Ci0JCQkJc2V0Q2FjaGVkQ29udGVudFR5cGUocG90ZW50aWFsQ29udGVudFR5cGUpOwotCQkJCS8vIH0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVzZWQgYnkgUGFnZURpcmVjdGl2ZVdhdGNoZXJzIHRvIHNpZ25hbCB0aGF0IHNvbWUgaW1wb3J0YW50IGF0dHJpYnV0ZQotCSAqIGhhcyBjaGFuZ2VkLCBhbmQgYW55IGNhY2hlZCB2YWx1ZXMgc2hvdWxkIGJlIHJlLWNhbGN1YXRlZAotCSAqLwotCXZvaWQgY2hhbmdlZExhbmd1YWdlKGludCBlbGVtZW50T2Zmc2V0LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJLy8gb25seSBuZWVkIHRvIHByb2Nlc3MgaWYgdGhpcyBuZXcgdmFsdWUgaXMKLQkJLy8gZWFybGllciBpbiB0aGUgZmlsZSB0aGFuIG91ciBjdXJyZW50IHZhbHVlCi0JCS8vIGhhcyB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8sIGluIGNhc2Ugb3VyIHByZXZpb3VzIGVhcmxpZXN0IG9uZSwKLQkJLy8gaXMgaXRzZWxmIGNoYW5naW5nIQotCQlpZiAoZmlyc3RMYW5ndWFnZVBvc2l0aW9uID09IC0xIHx8IGVsZW1lbnRPZmZzZXQgPD0gZmlyc3RMYW5ndWFnZVBvc2l0aW9uKSB7Ci0KLQkJCS8vIG5vIG5lZWQgdG8gY2hhbmdlIGN1cnJlbnQgdmFsdWUsIGlmIHdlJ3JlIHRvbGQgc29tZQotCQkJLy8gZWFybGllciB2YWx1ZSBpcyBudWxsIG9yIGJsYW5rIChzb3VuZHMgbGlrZSBhbiBlcnJvciwgYW55d2F5KQotCQkJaWYgKGhhc1ZhbHVlKG5ld1ZhbHVlKSkgewotCQkJCWZpcnN0TGFuZ3VhZ2VQb3NpdGlvbiA9IGVsZW1lbnRPZmZzZXQ7Ci0JCQkJLy8gb25seSBkbyB0aGUgc2V0IHByb2Nlc3NpbmcgaWYgZGlmZmVyZW50Ci0JCQkJLy8gZnJvbSB3aGF0IGl0IGFscmVhZHkgaXMKLQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoY2FjaGVkTGFuZ3VhZ2UpKSB7Ci0JCQkJCXNldENhY2hlZExhbmd1YWdlKG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGR3X1RPRE86IHNldCBsYW5ndWFnZSBpbiBkb2N1bWVudCBwYXJ0aXRpb25lcgotCQkJLy8gbnNkX1RPRE86IHNldCBsYW5ndWFnZSBpbiBkb2N1bWVudCBwYXJ0aXRpb25lcgotCQl9Ci0JfQotCi0JLyoqCi0JICogVXNlZCBieSBQYWdlRGlyZWN0aXZlV2F0Y2hlcnMgdG8gc2lnbmFsIHRoYXQgc29tZSBpbXBvcnRhbnQgYXR0cmlidXRlCi0JICogaGFzIGNoYW5nZWQsIGFuZCBhbnkgY2FjaGVkIHZhbHVlcyBzaG91bGQgYmUgcmUtY2FsY3VhdGVkCi0JICovCi0Jdm9pZCBjaGFuZ2VkUGFnZUVuY29kaW5nKGludCBlbGVtZW50T2Zmc2V0LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQotCQkvLyB3ZSBkb24ndCBjdXJyZW50bHkgdHJhY2sgYWN0aXZlIHZhbHVlLCBzaW5jZQotCQkvLyBqdXN0IG5lZWQgZHVyaW5nIHJlYWQgYW5kIHdyaXRlICh3aGVyZSBpdHMKLQkJLy8gY2FsY3VsYXRlZC4gV2Ugd2lsbCBuZWVkIGluIGZ1dHVyZSwgdG8KLQkJLy8gYWN1cmF0ZWx5IGNsb25lIGEgbW9kZWwgYW5kIHRvIGRpc3BsYXkKLQkJLy8gImN1cnJlbnQgZW5jb2RpbmciIHRvIHVzZXIgaW4gc3RhdHVzIGJhci4KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgaGFzVmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc1ZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhY2hlZENvbnRlbnRUeXBlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJaWYgKGNhY2hlZENvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWNhY2hlZENvbnRlbnRUeXBlID0gZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENvbnRlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0Q29udGVudFR5cGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0Q29udGVudFR5cGUoKSB7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUobW9kZWwpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQl0eXBlID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BDT05URU5UVFlQRSwgZmlsZSwgdHJ1ZSk7Ci0JCX0KLQkJLy8gQlVHMTM2NDY4Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQl0eXBlID0gInRleHQvaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2FjaGVkTGFuZ3VhZ2UuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgewotCQlpZiAoY2FjaGVkTGFuZ3VhZ2UgPT0gbnVsbCkKLQkJCWNhY2hlZExhbmd1YWdlID0gZ2V0RGVmYXVsdExhbmd1YWdlKCk7Ci0JCXJldHVybiBjYWNoZWRMYW5ndWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0RGVmYXVsdExhbmd1YWdlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdExhbmd1YWdlKCkgewotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShtb2RlbCk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWxhbmd1YWdlID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BMQU5HVUFHRSwgZmlsZSwgdHJ1ZSk7Ci0JCX0KLQkJLy8gQlVHMTM2NDY4Ci0JCWlmIChsYW5ndWFnZSA9PSBudWxsKQotCQkJbGFuZ3VhZ2UgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGxhbmd1YWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNhY2hlZENvbnRlbnRUeXBlLgotCSAqIAotCSAqIEBwYXJhbSBjYWNoZWRDb250ZW50VHlwZQotCSAqICAgICAgICAgICAgVGhlIGNhY2hlZENvbnRlbnRUeXBlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhY2hlZENvbnRlbnRUeXBlKFN0cmluZyBuZXdDb250ZW50VHlwZSkgewotCQkvKgotCQkgKiBpZiB0aGUgcGFzc2VkIGluIHZhbHVlIGlzIHRoZSBzYW1lIGFzIGV4aXN0aW5nLCB0aGVyZSdzIG5vdGhpbmcgdG8KLQkJICogZG8uIGlmIGl0cyBkaWZmZXJlbnQsIHRoZW4gd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGNvbnRlbnRIYW5kbGVyIGFzCi0JCSAqIHdlbGwgYW5kLCBtb3JlIHRvIHRoZSBwb2ludCwgc2lnbmFsIGEgcmUtaW5pdGlhbGl6dGF0aW9uIGlzIG5lZWRlZC4KLQkJICogCi0JCSAqIE5vdGU6IGlmIHRoZSB2YWx1ZSB3ZSdyZSBnZXR0aW5nIHNldCB0byBkb2VzIG5vdCBoYXZlIGEgaGFuZGxlciBpbgotCQkgKiB0aGUgcmVnaXN0cnksIHdlJ2xsIGFjdHVhbGx5IG5vdCBzZXQgaXQgdG8gbnVsbCBvciBhbnl0aGluZywgd2UnbGwKLQkJICoganVzdCBjb250aW51ZSBvbiB3aXRoIHRoZSBvbmUgd2UgaGF2ZS4gVGhpcyBpcyBwcmV0dHkgaW1wb3J0YW50IHRvCi0JCSAqIGF2b2lkIHJlLWluaXRpYWxpemluZyBvbiBldmVyeSBrZXkgc3Ryb2tlIGlmIHNvbWVvbmUgaXMgdHlwaW5nIGluIGEKLQkJICogbmV3IGNvbnRlbnQgdHlwZSwgYnV0IGhhdmVuJ3QgeWV0IGZpbmlzaGVkIHRoZSB3aG9sZSAid29yZCIuCi0JCSAqIEhvd2V2ZXIsIGlmIGFuIGNvbnRlbnRUeXBlIGlzIG5vdCByZWNvZ25pemVkLCB0aGUgcmVnaXN0cnkgcmV0dXJucwotCQkgKiB0aGUgb25lIGZvciBYTUwuCi0JCSAqLwotCQkKLQkJLyogc2V0IHRoZSBhY3R1YWwgdmFsdWUgZmlyc3QsIHRoZSByZXN0IGlzICJzaWRlIGVmZmVjdCIgKi8KLQkJdGhpcy5jYWNoZWRDb250ZW50VHlwZSA9IG5ld0NvbnRlbnRUeXBlOwotCi0JCS8qIHNlZSBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSBlbWJlZGRlZCBoYW5kbGVyICovCi0KLQkJLyoKLQkJICogSWYgdGhlIGRvY3VtZW50IGlzIGEgdHlwZSBvZiBYSFRNTCwgd2UgZG8gbm90IHVzZSB0aGUgcGFnZQotCQkgKiBkaXJlY3RpdmUncyBjb250ZW50VHlwZSB0byBkZXRlcm1pbmUgdGhlIGVtYmVkZGVkIHR5cGUgLi4uIGl0cwotCQkgKiBYSFRNTCEgLi4uIGFuZCwgZXZlbnR1YWxseSwgdGhlIERPQ1RZUEUgYWRhcHRlciBzaG91bGQgZGV0ZXJtaW5lCi0JCSAqIGlmL3doZW4gaXQgbmVlZHMgdG8gY2hhbmdlLgotCQkgKi8KLQotCQkvKiBqdXN0IHNhZmV0eSBjaGVjaywgY2FuIGJlIHJlbW92ZWQgbGF0ZXIsIGVhcmx5IGluIHJlbGVhc2UgY3ljbGUgKi8KLQkJaWYgKG1vZGVsID09IG51bGwpIHsKLQkJCS8vIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibW9kZWwgc2hvdWxkIG5ldmVyIGJlIG51bGwgaW4KLQkJCS8vIFBhZ2VEaXJlY3RpdmUgQWRhcHRlciIpOwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJtb2RlbCBzaG91bGQgbmV2ZXIgYmUgbnVsbCBpbiBQYWdlRGlyZWN0aXZlIEFkYXB0ZXIiKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgcG90ZW50aWFsTmV3YW5kbGVyID0gbnVsbDsKLQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBnZXRDb250ZW50RGVzY3JpcHRpb24obW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQlPYmplY3QgcHJvcCA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfRkFNSUxZX0FUVFJJQlVURSk7Ci0JCWlmIChwcm9wICE9IG51bGwpIHsKLQkJCWlmIChDb250ZW50VHlwZUZhbWlseUZvckhUTUwuSFRNTF9GQU1JTFkuZXF1YWxzKHByb3ApKSB7Ci0JCQkJcG90ZW50aWFsTmV3YW5kbGVyID0gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCkuZ2V0VHlwZUZvcigidGV4dC9odG1sIik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocG90ZW50aWFsTmV3YW5kbGVyID09IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBnZXRIYW5kbGVyIHNob3VsZCBhbHdheXMgcmV0dXJuIHNvbWV0aGluZyAobmV2ZXIgbnVsbCksIGJhc2VkCi0JCQkgKiBvbiB0aGUgcnVsZXMgaW4gdGhlIGZhY3RvcnkuCi0JCQkgKi8KLQkJCXBvdGVudGlhbE5ld2FuZGxlciA9IGdldEhhbmRsZXJGb3IodGhpcy5jYWNoZWRDb250ZW50VHlwZSk7Ci0JCX0KLQkJLyoKLQkJICogd2UgZG8gdGhpcyBjaGVjayBmb3IgcmUtaW5pdCBoZXJlLCBpbnN0ZWFkIG9mIGluIHNldEVtYmVkZGVkVHlwZSwKLQkJICogc2luY2Ugc2V0RW1iZWRkZWRUeXBlIGlzIGNhbGxlZCBkdXJpbmcgdGhlIG5vcm1hbCBpbml0aWFsaXp0aW9uCi0JCSAqIHByb2Nlc3MsIHdoZW4gcmUtaW5pdCBpcyBub3QgbmVlZGVkIChzaW5jZSB0aGVyZSBpcyBubyBjb250ZW50KQotCQkgKi8KLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgPT0gbnVsbCkgewotCQkJc2V0RW1iZWRkZWRUeXBlKHBvdGVudGlhbE5ld2FuZGxlcik7Ci0JCX0KLQkJZWxzZSBpZiAocG90ZW50aWFsTmV3YW5kbGVyICE9IG51bGwgJiYgZW1iZWRkZWRUeXBlSGFuZGxlciAhPSBwb3RlbnRpYWxOZXdhbmRsZXIpIHsKLQkJCS8qCi0JCQkgKiBjaGFuZ2luZyB0aGlzIGVtYmVkZGVkIGhhbmRsZXIgaGVyZSBtYXkgYmUgaW4gdGhlIG1pZGRsZSBvZiBhCi0JCQkgKiBub3RpZnkgbG9vcC4gVGhhdCdzIHdoeSB3ZSBzZXQgdGhhdCAiaXQncyBuZWVkZWQiLiBUaGVuIHRoZQotCQkJICogbW9kZWwgZGVjaWRlcyB3aGVuIGl0cyAic2FmZSIgdG8gYWN0dWFsbHkgZG8gdGhlIHJlLWluaXQuCi0JCQkgKiAKLQkJCSAqIGJlIHN1cmUgdG8gaG9sZCBvbGRIYW5kbGVyIGluIHRlbXAgdmFyIG9yIGVsc2Ugc2V0RW1iZWRkZWRUeXBlCi0JCQkgKiB3aWxsICJyZXNldCIgaXQgYmVmb3JlIG1vZGVsUmVpbml0TmVlZGVkKG9sZEhhbmRsZXIsIGhhbmRsZXIpCi0JCQkgKiBpcyBjYWxsZWQKLQkJCSAqIAotCQkJICovCi0JCQlFbWJlZGRlZFR5cGVIYW5kbGVyIG9sZEhhbmRsZXIgPSBlbWJlZGRlZFR5cGVIYW5kbGVyOwotCQkJc2V0RW1iZWRkZWRUeXBlKHBvdGVudGlhbE5ld2FuZGxlcik7Ci0JCQltb2RlbFJlaW5pdE5lZWRlZChvbGRIYW5kbGVyLCBwb3RlbnRpYWxOZXdhbmRsZXIpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJlLWluaXQgYmFzZWQgb24gZW1iZWRkZWRUeXBlSGFuZGxlciBjaGFuZ2luZy4KLQkgKiBJdCBpcyBnaXZlbiBwcmlvcml0eSBvdmVyIHRoZSBsYW5ndWFnZSBjaGFuZ2UsIHNpbmNlIHRoZXJlIGl0cyBtb3JlCi0JICogaW1wb3J0YW50IHRvIGhhdmUgb2xkIGFuZCBuZXcgaGFuZGxlcnMncyBpbiB0aGUgc3RhdGVEYXRhIGZpZWxkLgotCSAqLwotCXByaXZhdGUgdm9pZCBtb2RlbFJlaW5pdE5lZWRlZChFbWJlZGRlZFR5cGVIYW5kbGVyIG9sZEhhbmRsZXIsIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SGFuZGxlcikgewotCQlpZiAobW9kZWwuaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWxyZWFkeSBiZWluZyBpbml0aWFsaXplZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQltb2RlbC5zZXRSZWluaXRpYWxpemVTdGF0ZURhdGEobmV3IEVtYmVkZGVkVHlwZVN0YXRlRGF0YShvbGRIYW5kbGVyLCBuZXdIYW5kbGVyKSk7Ci0JCQltb2RlbC5zZXRSZWluaXRpYWxpemVOZWVkZWQodHJ1ZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBtb2RlbFJlaW5pdE5lZWRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbW9kZWxSZWluaXROZWVkZWQoU3RyaW5nIG9sZGxhbmd1YWdlLCBTdHJpbmcgbmV3TGFuZ3VhZ2UpIHsKLQkJLy8gYml0IG9mIGEgc2hvcnQgY3V0IGZvciBub3cgLi4uLiB3ZSBkb250JyBuZWVkIGxhbmd1YWdlIGF0IHRoZQotCQkvLyBtb21lbnQsCi0JCS8vIGJ1dCBzaG91bGQgc2V0IHRoZSBzdGF0ZSBkYXRhCi0JCWlmIChtb2RlbC5pc1JlaW5pdGlhbGl6YXRpb25OZWVkZWQoKSkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWxyZWFkeSBiZWluZyBpbml0aWFsaXplZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCS8vIGlmIGFscmVhZHkgYmVpbmcgcmUtaW5pdGlhbGl6ZWQsIHdlIGRvbid0IHdhbnQgdG8KLQkJCQkvLyByZXNldCB0aGUgZGF0YSBpbiB0aGUgc3RhdGVEYXRhIGZpZWxkLgotCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCW1vZGVsLnNldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YShuZXdMYW5ndWFnZSk7Ci0JCQkJbW9kZWwuc2V0UmVpbml0aWFsaXplTmVlZGVkKHRydWUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZWRMYW5ndWFnZShTdHJpbmcgbmV3TGFuZ3VhZ2UpIHsKLQkJaWYgKGNhY2hlZExhbmd1YWdlICE9IG51bGwgJiYgbGFuZ3VhZ2VTdGF0ZUNoYW5nZWQoY2FjaGVkTGFuZ3VhZ2UsIG5ld0xhbmd1YWdlKSkgewotCQkJLyoKLQkJCSAqIGEgY29tcGxldGUgcmUtaW5pdCBvdmVya2lsbCBpbiBjdXJyZW50IHN5c3RlbSwgc2luY2UgcmVhbGx5Ci0JCQkgKiBqdXN0IG5lZWQgZm9yIHRoZSBsaW5lIHN0eWxlIHByb3ZpZGVycywgQlVULCBhIGNoYW5nZSBpbgotCQkJICogbGFuZ3VhZ2UgY291bGQgZWZmZWN0IG90aGVyIHRoaW5ncywgYW5kIHdlIGRvbid0IGV4cGVjdCB0bwotCQkJICogaGFwcGVuIG9mdGVuIHNvIGEgbGl0dGxlIG92ZXJraWxsIGlzbid0IHRvbyBiYWQuIFRoZSBkZWVwCi0JCQkgKiBwcm9ibGVtIGlzIHRoYXQgdGhlcmUgaXMgbm8gd2F5IHRvIGdldCBhdCB0aGUgImVkaXQgc2lkZSIKLQkJCSAqIGFkcGFwdGVycyBzcGVjaWZpY2FsbHkgaGVyZSBpbiBtb2RlbCBjbGFzcy4gd2UgaGF2ZSB0byBkbyB0aGUKLQkJCSAqIG1vZGVsIGNoYW5nZWQgc2VxdWVuY2UgdG8gZ2V0IHRoZSBzY3JlZW4gdG8gdXBkYXRlLiBkbyBub3QKLQkJCSAqIHNpZ25hbCBhZ2FpbiwgaWYgc2lnbmFsZWQgb25jZSAodGhlIHJlaW5pdCBzdGF0ZSBkYXRhIHdpbGwgYmUKLQkJCSAqIHdyb25nLiAodGhpcyBuZWVkcyB0byBiZSBpbXByb3ZlZCBpbiBmdXR1cmUpCi0JCQkgKi8KLQkJCWlmICghbW9kZWwuaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCkpIHsKLQkJCQltb2RlbFJlaW5pdE5lZWRlZChjYWNoZWRMYW5ndWFnZSwgbmV3TGFuZ3VhZ2UpOwotCQkJfQotCQl9Ci0JCXNldExhbmd1YWdlKG5ld0xhbmd1YWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHB1YmxpYyBhY2Nlc3MgbWV0aG9kLCB1c2VkIGVzcGVjaWFsbHkgZnJvbSBsb2FkZXIsIGZvciBKU1AKLQkgKiBGcmFnbWVudCBzdXBwb3J0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBuZXdMYW5ndWFnZSkgewotCQl0aGlzLmNhY2hlZExhbmd1YWdlID0gbmV3TGFuZ3VhZ2U7Ci0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gKChJRG9jdW1lbnRFeHRlbnNpb24zKSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSkuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HKTsKLQkJaWYgKHBhcnRpdGlvbmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCkgewotCQkJKChTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQKSBwYXJ0aXRpb25lcikuc2V0TGFuZ3VhZ2UobmV3TGFuZ3VhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGxhbmd1YWdlU3RhdGVDaGFuZ2UuCi0JICogCi0JICogQHBhcmFtIGNhY2hlZExhbmd1YWdlCi0JICogQHBhcmFtIG5ld0xhbmd1YWdlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGxhbmd1YWdlU3RhdGVDaGFuZ2VkKFN0cmluZyBjYWNoZWRMYW5ndWFnZSwgU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7IC8vIGxhbmd1YWdlcyBhcmUgZXF1YWwsIHRoZW4gbm8gY2hhbmdlIGluCi0JCS8vIHN0YXRlCi0JCWlmICghY2FjaGVkTGFuZ3VhZ2UuZXF1YWxzSWdub3JlQ2FzZShuZXdMYW5ndWFnZSkpIHsKLQkJCWJvb2xlYW4gb2xkTGFuZ3VhZ2VLbm93biA9IGxhbmd1YWdlS25vd24oY2FjaGVkTGFuZ3VhZ2UpOwotCQkJYm9vbGVhbiBuZXdMYW5ndWFnZUtub3duID0gbGFuZ3VhZ2VLbm93bihuZXdMYW5ndWFnZSk7Ci0JCQlyZXN1bHQgPSBuZXdMYW5ndWFnZUtub3duIHx8ICghbmV3TGFuZ3VhZ2VLbm93biAmJiBvbGRMYW5ndWFnZUtub3duKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBsYW5ndWFnZUtub3duLgotCSAqIAotCSAqIEBwYXJhbSBjYWNoZWRMYW5ndWFnZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsYW5ndWFnZUtub3duKFN0cmluZyBsYW5ndWFnZSkgewotCQlyZXR1cm4gKFN0cmluZ1V0aWxzLmNvbnRhaW5zKEpBVkFfTEFOR1VBR0VfS0VZUywgbGFuZ3VhZ2UsIGZhbHNlKSB8fCBTdHJpbmdVdGlscy5jb250YWlucyhKQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMsIGxhbmd1YWdlLCBmYWxzZSkpOwotCX0KLQotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEhhbmRsZXJGb3IoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHJlZyA9IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpOwotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQlpZiAocmVnICE9IG51bGwpCi0JCQloYW5kbGVyID0gcmVnLmdldFR5cGVGb3IoY29udGVudFR5cGUpOwotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5Ci0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVSZWdpc3RyeSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBFbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgSlNQIGZpbGVzLCB0ZXh0L2h0bWwgaXMgdGhlIGRlZmF1bHQgY29udGVudCB0eXBlLiBUaGlzIG1heSB3YW50Ci0JICogdGhpcyBkaWZmZXJlbnQgZm9yIHR5cGVzIGxpa2UganN2IChqc3AgZm9yIHZvaWNlIHhtbCkgRm9yIG5vdywgaGFyZAotCSAqIGNvZGUgdG8gbmV3IGluc3RhbmNlLiBJbiBmdXR1cmUsIHNob3VsZCBnZXQgaW5zdGFuY2UgZnJvbSByZWdpc3RyeS4KLQkgKiAKLQkgKiBTcGVjaWZpY2F0aW9uIGNpdGVzIEhUTUwgYXMgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuCi0JICovCi0JcHJvdGVjdGVkIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0RGVmYXVsdEVtYmVkZGVkVHlwZSgpIHsKLQkJcmV0dXJuIGdldEhhbmRsZXJGb3IoZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyBJTm9kZU5vdGlmaWVyIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIG5vdGlmaWVyQXRDcmVhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZW1iZWRkZWRUeXBlSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlpZiAoZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkgIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkuaXRlcmF0b3IoKTsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWZhY3RvcnkucmVsZWFzZSgpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHBhX1RPRE86IHBvc3NpYmx5IG5lZWQgdG8gcmVsZWFzZSBoZXJlLi4uCi0JCQkvLyBvciAidW5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5IgotCQkJLy8gaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeSB3YXMgY2FsbGVkIGZyb20gSlNQTW9kZWxMb2FkZXIKLQkJCWVtYmVkZGVkVHlwZUhhbmRsZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQ29udGVudERlc2NyaXB0aW9uIGdldENvbnRlbnREZXNjcmlwdGlvbihJRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlEb2N1bWVudFJlYWRlciBpbiA9IG5ldyBEb2N1bWVudFJlYWRlcihkb2MpOwotCQlyZXR1cm4gZ2V0Q29udGVudERlc2NyaXB0aW9uKGluKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFuIGlucHV0IHN0cmVhbSBBc3N1bWVzIGl0J3MgSlNQCi0JICogY29udGVudC4gQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0gd2hlbiBmaW5pc2hlZC4KLQkgKiAKLQkgKiBAcGFyYW0gaW4KLQkgKiBAcmV0dXJuIHRoZSBJQ29udGVudERlc2NyaXB0aW9uIGZvciBpbiwgb3IgbnVsbCBpZiBpbiBpcyBudWxsCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudERlc2NyaXB0aW9uIGdldENvbnRlbnREZXNjcmlwdGlvbihSZWFkZXIgaW4pIHsKLQotCQlpZiAoaW4gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlDb250ZW50RGVzY3JpcHRpb24gZGVzYyA9IG51bGw7Ci0JCXRyeSB7Ci0KLQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZUpTUCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCQkJZGVzYyA9IGNvbnRlbnRUeXBlSlNQLmdldERlc2NyaXB0aW9uRm9yKGluLCBJQ29udGVudERlc2NyaXB0aW9uLkFMTCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWluLmNsb3NlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlc2M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbElnbm9yZWQoKSB7Ci0JCXJldHVybiBlbElnbm9yZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxJZ25vcmVkKFN0cmluZyBpZ25vcmVkKSB7Ci0JCWVsSWdub3JlZCA9IGlnbm9yZWQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0M2E4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLQotaW50ZXJmYWNlIFBhZ2VEaXJlY3RpdmVXYXRjaGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCVN0cmluZyBnZXRDb250ZW50VHlwZSgpOwotCi0JU3RyaW5nIGdldExhbmd1YWdlKCk7Ci0KLQlpbnQgZ2V0T2Zmc2V0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmJiMDdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlLlByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5IGV4dGVuZHMgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwgaW1wbGVtZW50cyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkuCi0JICovCi0JcHVibGljIFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeSgpIHsKLQkJdGhpcyhQYWdlRGlyZWN0aXZlV2F0Y2hlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcktleQotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzCi0JICovCi0JcHVibGljIFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlQYWdlRGlyZWN0aXZlV2F0Y2hlciByZXN1bHQgPSBudWxsOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTUVsZW1lbnQpIHsKLQkJCUlET01FbGVtZW50IHhtbEVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHRhcmdldDsKLQkJCWlmICh4bWxFbGVtZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSB4bWxFbGVtZW50LmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscygianNwOmRpcmVjdGl2ZS5wYWdlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXN1bHQgPSBuZXcgUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsKHhtbEVsZW1lbnQpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5KGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JfX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTRjZTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BdHRySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLQotCi0vKiogCi0gKiBUaGUgcmVzcG9uc2liaWxpdHkgb2YgdGhpcyBjbGFzcyBpcyB0byBtb25pdG9yIHBhZ2UgZGlyZWN0aXZlcyBhbmQgaWYgCi0gKiBhIGNoYW5nZSBpbiBlbWJlZGRlZCB0eXBlIGlzIGlzIG1hZGUsIGl0IHdpbGwgc2lnbmFsIAotICogdGhlIHN0cnVjdHVyZWRNb2RlbCB0aGF0IGl0IG5lZWRzIHRvIHJlaW5pdGlhbGl6ZSBpdHNlbGYuCi0gKi8KLWNsYXNzIFBhZ2VEaXJlY3RpdmVXYXRjaGVySW1wbCBpbXBsZW1lbnRzIFBhZ2VEaXJlY3RpdmVXYXRjaGVyIHsKLQotCXByaXZhdGUgc3RhdGljIE9iamVjdCBhZGFwdGVyVHlwZSA9IFBhZ2VEaXJlY3RpdmVXYXRjaGVyLmNsYXNzOwotCUlET01FbGVtZW50IHRhcmdldEVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsLgotCSAqLwotCXB1YmxpYyBQYWdlRGlyZWN0aXZlV2F0Y2hlckltcGwoSURPTUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRhcmdldEVsZW1lbnQgPSB0YXJnZXQ7Ci0JCWlmICh0YXJnZXQuaGFzQXR0cmlidXRlKCJjb250ZW50VHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBjb250ZW50VHlwZVZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgiY29udGVudFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gdXNpbmcgY29uY3JldGUgY2xhc3MgYmVsb3csIHNpbmNlICJjaGFuZ2VkIiBpcyBzb21ldGhpbmcgb2YgYW4gaW50ZXJuYWwgbWV0aG9kCi0JCQlQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsKSAoKElET01Eb2N1bWVudCkgdGFyZ2V0RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2hhbmdlZENvbnRlbnRUeXBlKCgoSW5kZXhlZFJlZ2lvbikgdGFyZ2V0RWxlbWVudCkuZ2V0U3RhcnRPZmZzZXQoKSwgY29udGVudFR5cGVWYWx1ZSk7Ci0JCX0KLQkJaWYgKHRhcmdldC5oYXNBdHRyaWJ1dGUoImxhbmd1YWdlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGxhbmd1YWdlVmFsdWUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCJsYW5ndWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyB1c2luZyBjb25jcmV0ZSBjbGFzcyBiZWxvdywgc2luY2UgImNoYW5nZWQiIGlzIHNvbWV0aGluZyBvZiBhbiBpbnRlcm5hbCBtZXRob2QKLQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwpICgoSURPTURvY3VtZW50KSB0YXJnZXRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5jaGFuZ2VkTGFuZ3VhZ2UoKChJbmRleGVkUmVnaW9uKSB0YXJnZXRFbGVtZW50KS5nZXRTdGFydE9mZnNldCgpLCBsYW5ndWFnZVZhbHVlKTsKLQkJfQotCQlpZiAodGFyZ2V0Lmhhc0F0dHJpYnV0ZSgiaXNFTElnbm9yZWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZWxJZ25vcmVkID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgiaXNFTElnbm9yZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCkgKChJRE9NRG9jdW1lbnQpIHRhcmdldEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldEVsSWdub3JlZChlbElnbm9yZWQpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBhZGFwdGVyVHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIHdlIHNob3VsZCBvbmx5IGJlIGFkZGVkIHRvIHBhZ2UgZGlyZWN0aXZlcywgc28gaWYgd2Ugc2VlIGEgcGFnZSBkaXJlY3RpdmUKLQkJLy8gY2hhbmdlLCB3ZSBuZWVkIHRvIGNoZWNrIGl0cyBhdHRyaWJ1dGVzLCBhbmQgbm90aWZ5IHRoZSBQYWdlRGlyZWN0aXZlQWRhcHRlciB3aGVuIAotCQkvLyBjZXJ0YWluIG9uZXMgY2hhbmUsIHNvIGl0IGNhbiBtYWtlIGl0cyAiY2VudHJhbGl6ZWQiIGRlY2lzaW9ucy4KLQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQotCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFIDoKLQkJCQkJaWYgKGNoYW5nZWRGZWF0dXJlIGluc3RhbmNlb2YgQXR0ckltcGwpIHsKLQkJCQkJCUF0dHJJbXBsIGF0dHJpYnV0ZSA9IChBdHRySW1wbCkgY2hhbmdlZEZlYXR1cmU7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCQkJCQlpZiAobmFtZS5lcXVhbHMoImNvbnRlbnRUeXBlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIHVzaW5nIGNvbmNyZXRlIGNsYXNzIGJlbG93LCBzaW5jZSAiY2hhbmdlZCIgaXMgc29tZXRoaW5nIG9mIGFuIGludGVybmFsIG1ldGhvZAotCQkJCQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwpICgoSURPTURvY3VtZW50KSB0YXJnZXRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2hhbmdlZENvbnRlbnRUeXBlKCgoSW5kZXhlZFJlZ2lvbikgdGFyZ2V0RWxlbWVudCkuZ2V0U3RhcnRPZmZzZXQoKSwgKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCQkJfQotCQkJCQkJaWYgKG5hbWUuZXF1YWxzKCJsYW5ndWFnZSIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCS8vIHVzaW5nIGNvbmNyZXRlIGNsYXNzIGJlbG93LCBzaW5jZSAiY2hhbmdlZCIgaXMgc29tZXRoaW5nIG9mIGFuIGludGVybmFsIG1ldGhvZAotCQkJCQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwpICgoSURPTURvY3VtZW50KSB0YXJnZXRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2hhbmdlZExhbmd1YWdlKCgoSW5kZXhlZFJlZ2lvbikgdGFyZ2V0RWxlbWVudCkuZ2V0U3RhcnRPZmZzZXQoKSwgKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLlJFTU9WRSA6Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJyZW1vdmVkIituZXcgRGF0ZSgpLnRvU3RyaW5nKCkpOwotCQkJCQlicmVhazsKLQotCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlTdHJpbmcgY29udGVudFR5cGVWYWx1ZSA9IHRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjb250ZW50VHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBjb250ZW50VHlwZVZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCVN0cmluZyBsYW5ndWFnZVZhbHVlID0gdGFyZ2V0RWxlbWVudC5nZXRBdHRyaWJ1dGUoImxhbmd1YWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGxhbmd1YWdlVmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0YXJnZXRFbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0F0dHJJbXBsRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0F0dHJJbXBsRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMzBjNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9BdHRySW1wbEZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvbWRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkF0dHJJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgQXR0ckltcGxGb3JKU1AgZXh0ZW5kcyBBdHRySW1wbCB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZExhbmd1YWdlT3BlbmluZyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzdXBlci5zZXROYW1lKG5hbWUpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQlzdXBlci5zZXROYW1lc3BhY2VVUkkobmFtZXNwYWNlVVJJKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvQ29tbWVudEltcGxGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvQ29tbWVudEltcGxGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzljY2M1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0NvbW1lbnRJbXBsRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ29tbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb21tZW50SW1wbEZvckpTUAotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEltcGxGb3JKU1AgZXh0ZW5kcyBDb21tZW50SW1wbCB7Ci0JcHJvdGVjdGVkIENvbW1lbnRJbXBsRm9ySlNQKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBDb21tZW50SW1wbEZvckpTUChDb21tZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29tbWVudENsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRPcGVuQ2xvc2UoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQl9Ci0JCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDb21tZW50SW1wbCBjbG9uZWQgPSBuZXcgQ29tbWVudEltcGxGb3JKU1AodGhpcyk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9ET01Eb2N1bWVudEZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9ET01Eb2N1bWVudEZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2E4YmFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRE9NRG9jdW1lbnRGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50U3R5bGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgRE9NRG9jdW1lbnRGb3JKU1AgZXh0ZW5kcyBEb2N1bWVudFN0eWxlSW1wbCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRE9NRG9jdW1lbnRGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRoYXQKLQkgKi8KLQlwcm90ZWN0ZWQgRE9NRG9jdW1lbnRGb3JKU1AoRG9jdW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcCBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlET01Eb2N1bWVudEZvckpTUCBjbG9uZWQgPSBuZXcgRE9NRG9jdW1lbnRGb3JKU1AodGhpcyk7Ci0JCWlmIChkZWVwKQotCQkJY2xvbmVkLmltcG9ydENoaWxkTm9kZXModGhpcywgdHJ1ZSk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZUVsZW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyB0YWdOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJY2hlY2tUYWdOYW1lVmFsaWRpdHkodGFnTmFtZSk7Ci0KLQkJRWxlbWVudEltcGxGb3JKU1AgZWxlbWVudCA9IG5ldyBFbGVtZW50SW1wbEZvckpTUCgpOwotCQllbGVtZW50LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWVsZW1lbnQuc2V0VGFnTmFtZSh0YWdOYW1lKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZUNvbW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Db21tZW50Ci0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ29tbWVudCBjcmVhdGVDb21tZW50KFN0cmluZyBkYXRhKSB7Ci0JCUNvbW1lbnRJbXBsRm9ySlNQIGNvbW1lbnQgPSBuZXcgQ29tbWVudEltcGxGb3JKU1AoKTsKLQkJY29tbWVudC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJY29tbWVudC5zZXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVBdHRyaWJ1dGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQXR0ciBjcmVhdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlBdHRySW1wbEZvckpTUCBhdHRyID0gbmV3IEF0dHJJbXBsRm9ySlNQKCk7Ci0JCWF0dHIuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJYXR0ci5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciBjcmVhdGVBdHRyaWJ1dGVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUF0dHJJbXBsRm9ySlNQIGF0dHIgPSBuZXcgQXR0ckltcGxGb3JKU1AoKTsKLQkJYXR0ci5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlhdHRyLnNldE5hbWUobmFtZSk7Ci0JCWF0dHIuc2V0TmFtZXNwYWNlVVJJKHVyaSk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQkvKioKLQkgKiBjcmVhdGVUZXh0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlRleHQKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZVRleHROb2RlKFN0cmluZyBkYXRhKSB7Ci0JCVRleHRJbXBsRm9ySlNQIHRleHQgPSBuZXcgVGV4dEltcGxGb3JKU1AoKTsKLQkJdGV4dC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQl0ZXh0LnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChJRE9NTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIuc2V0TW9kZWwobW9kZWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRE9NTW9kZWxGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRE9NTW9kZWxGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjOGNlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0RPTU1vZGVsRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTVN0eWxlTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuWE1MTW9kZWxVcGRhdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgRE9NTW9kZWxGb3JKU1AgZXh0ZW5kcyBET01TdHlsZU1vZGVsSW1wbCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRE9NTW9kZWxGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIHJlbWVtYmVyLCB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCBpbiBzdXBlciBjb25zdHJ1Y3RvciwgCi0JCS8vIHZpYSBpbnRlcm5hbENyZWF0ZURvY3VtZW50Ci0JfQotCS8qKgotCSAqIGNyZWF0ZURvY3VtZW50IG1ldGhvZAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgaW50ZXJuYWxDcmVhdGVEb2N1bWVudCgpIHsKLQkJRE9NRG9jdW1lbnRGb3JKU1AgZG9jdW1lbnQgPSBuZXcgRE9NRG9jdW1lbnRGb3JKU1AoKTsKLQkJZG9jdW1lbnQuc2V0TW9kZWwodGhpcyk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0JcHJvdGVjdGVkIFhNTE1vZGVsUGFyc2VyIGNyZWF0ZU1vZGVsUGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IE5lc3RlZERPTU1vZGVsUGFyc2VyKHRoaXMpOwotCX0KLQlwcm90ZWN0ZWQgWE1MTW9kZWxVcGRhdGVyIGNyZWF0ZU1vZGVsVXBkYXRlcigpIHsKLQkJcmV0dXJuIG5ldyBOZXN0RE9NTW9kZWxVcGRhdGVyKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRWxlbWVudEltcGxGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRWxlbWVudEltcGxGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2OTEyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0VsZW1lbnRJbXBsRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkVsZW1lbnRTdHlsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW1wbEZvckpTUCBleHRlbmRzIEVsZW1lbnRTdHlsZUltcGwgewotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBFbGVtZW50SW1wbEZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhhdAotCSAqLwotCXB1YmxpYyBFbGVtZW50SW1wbEZvckpTUChFbGVtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkRW5kVGFnKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENsb3NlZChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ2xvc2VkQ29tbWVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDbG9zZWROZXN0ZWREaXJlY3RpdmUoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJEb2N1bWVudChEb2N1bWVudCBvd25lckRvY3VtZW50KSB7Ci0JCXN1cGVyLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFnTmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlzdXBlci5zZXRUYWdOYW1lKHRhZ05hbWUpOwotCX0KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUVsZW1lbnRJbXBsIGNsb25lZCA9IG5ldyBFbGVtZW50SW1wbEZvckpTUCh0aGlzKTsKLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L05lc3RET01Nb2RlbFVwZGF0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdERPTU1vZGVsVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzdkNzViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdERPTU1vZGVsVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvbWRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuWE1MTW9kZWxVcGRhdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBOZXN0RE9NTW9kZWxVcGRhdGVyIGV4dGVuZHMgWE1MTW9kZWxVcGRhdGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqLwotCXB1YmxpYyBOZXN0RE9NTW9kZWxVcGRhdGVyKERPTU1vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdDbG9zZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdGVkRE9NTW9kZWxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdGVkRE9NTW9kZWxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhYTcxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L05lc3RlZERPTU1vZGVsUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5ET01Nb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkpTUFRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuWE1MTW9kZWxQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBOZXN0ZWRET01Nb2RlbFBhcnNlciBleHRlbmRzIFhNTE1vZGVsUGFyc2VyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqLwotCXB1YmxpYyBOZXN0ZWRET01Nb2RlbFBhcnNlcihET01Nb2RlbEltcGwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29tbWVudE9wZW4oU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU47Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50VGV4dChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbnRlbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdOYW1lKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdPcGVuKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU47Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZU5lc3RlZFRhZyhTdHJpbmcgcmVnaW9uVHlwZSwgU3RyaW5nIHRhZ05hbWUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHJlc3VsdFRhZ05hbWUgPSB0YWdOYW1lOwotCQlpZiAocmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHsKLQkJCXJlc3VsdFRhZ05hbWUgPSBKU1BUYWcuSlNQX1NDUklQVExFVDsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4pIHsKLQkJCXJlc3VsdFRhZ05hbWUgPSBKU1BUYWcuSlNQX0VYUFJFU1NJT047Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikgewotCQkJcmVzdWx0VGFnTmFtZSA9IEpTUFRhZy5KU1BfREVDTEFSQVRJT047Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pIHsKLQkJCXJlc3VsdFRhZ05hbWUgPSBKU1BUYWcuSlNQX0RJUkVDVElWRTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJcmVzdWx0VGFnTmFtZSArPSAnLic7Ci0JCQlyZXN1bHRUYWdOYW1lICs9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFRhZ05hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdDbG9zZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvVGV4dEltcGxGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvVGV4dEltcGxGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2N2Y1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L1RleHRJbXBsRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuVGV4dEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBUZXh0SW1wbEZvckpTUCBleHRlbmRzIFRleHRJbXBsIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdE5lc3RlZENvbnRlbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlICE9IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxYzU0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lKU1BIZWFkQ29udGVudERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IgZXh0ZW5kcyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgewotCVN0cmluZyBnZXRDb250ZW50VHlwZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCVN0cmluZyBnZXRMYW5ndWFnZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YzVlN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBhcnNlcyBiZWdpbm5pbmcgcG9ydGlvbiBvZiBKU1AgZmlsZSB0byBnZXQgYXR0cmlidXRlcyBpbiBwYWdlCi0gKiBkaXJlY3RpaXZlCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IgZXh0ZW5kcyBKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJSlNQSGVhZENvbnRlbnREZXRlY3RvciB7Ci0KLQlwdWJsaWMgSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc2V0KG5ldyBEb2N1bWVudFJlYWRlcihkb2N1bWVudCwgMCkpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjE1MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9KU1BEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRSZWFkZXJDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuQnVmZmVyZWRMaW1pdGVkUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlRhZ01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIEpTUERvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTUlNRV9UWVBFID0gInRleHQvaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1BFQ19ERUZBVUxUX0VOQ09ESU5HID0gIklTTy04ODU5LTEiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIElGaWxlIGdldEZpbGVGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcGF0aCA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJT2JqZWN0IGlkID0gbW9kZWwuZ2V0SWQoKTsKLQkJCWlmIChpZCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcGF0aCA9IGlkLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLy8gVE9ETyBuZWVkcyByZXdvcmsgZm9yIGxpbmtlZCByZXNvdXJjZXMKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlGaWxlIGZpbGUgPSByb290LmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChwYXRoKSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXByaXZhdGUgRW1iZWRkZWRUeXBlUmVnaXN0cnkgZkVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeTsKLQotCXB1YmxpYyBKU1BEb2N1bWVudExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROZXN0YWJsZVByZWZpeChKU1BTb3VyY2VQYXJzZXIgcGFyc2VyLCBTdHJpbmcgdGFnTmFtZSkgewotCQlUYWdNYXJrZXIgYm0gPSBuZXcgVGFnTWFya2VyKHRhZ05hbWUpOwotCQlwYXJzZXIuYWRkTmVzdGFibGVQcmVmaXgoYm0pOwotCX0KLQotCXN5bmNocm9uaXplZCBwdWJsaWMgSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0cnVjdHVyZWREb2N1bWVudCA9IGNyZWF0ZUNvZGVkRG9jdW1lbnQoaUZpbGUpOwotCi0JCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkVHlwZSA9IGdldEVtYmVkZGVkVHlwZShpRmlsZSk7Ci0JCQlpZiAoZW1iZWRkZWRUeXBlICE9IG51bGwpCi0JCQkJZW1iZWRkZWRUeXBlLmluaXRpYWxpemVQYXJzZXIoc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlci5yZXNldCgpOwotCQkJc2V0RG9jdW1lbnRDb250ZW50c0Zyb21SZWFkZXIoc3RydWN0dXJlZERvY3VtZW50LCBmRnVsbFByZXBhcmVkUmVhZGVyKTsKLQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgIT0gbnVsbCkgewotCQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVDb2RlZERvY3VtZW50KElGaWxlIGlGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlnZXRDb2RlZFJlYWRlckNyZWF0b3IoKS5zZXQoaUZpbGUpOwotCi0JCWZGdWxsUHJlcGFyZWRSZWFkZXIgPSBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKS5nZXRDb2RlZFJlYWRlcigpOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gZ2V0Q29kZWRSZWFkZXJDcmVhdG9yKCkuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQkJc3RydWN0dXJlZERvY3VtZW50LnNldEVuY29kaW5nTWVtZW50byhnZXRDb2RlZFJlYWRlckNyZWF0b3IoKS5nZXRFbmNvZGluZ01lbWVudG8oKSk7Ci0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGVuYW1lID09IG51bGwgJiYgaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBoYXZlIGJvdGggbnVsbCBmaWxlbmFtZSBhbmQgaW5wdXRzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvZGVkUmVhZGVyQ3JlYXRvciBjb2RlZFJlYWRlckNyZWF0b3IgPSBuZXcgQ29kZWRSZWFkZXJDcmVhdG9yKCk7Ci0JCXRyeSB7Ci0JCQljb2RlZFJlYWRlckNyZWF0b3Iuc2V0KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSk7Ci0JCQlmRnVsbFByZXBhcmVkUmVhZGVyID0gY29kZWRSZWFkZXJDcmVhdG9yLmdldENvZGVkUmVhZGVyKCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gY29kZWRSZWFkZXJDcmVhdG9yLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LnNldEVuY29kaW5nTWVtZW50byhmRW5jb2RpbmdNZW1lbnRvKTsKLQkJCS8vIHRoZSBmYWN0IHRoYXQgZmlsZSBpcyBudWxsIG1lYW5zIHRoaXMgbWV0aG9kL2NvZGUgcGF0aCBpcyBubwotCQkJLy8gZ29vZCBmb3IgSlNQIGZyYWdtZW50cwotCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZFR5cGUgPSBnZXRFbWJlZGRlZFR5cGUoKElGaWxlKSBudWxsKTsKLQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIucmVzZXQoKTsKLQkJCWlmIChlbWJlZGRlZFR5cGUgIT0gbnVsbCkKLQkJCQllbWJlZGRlZFR5cGUuaW5pdGlhbGl6ZVBhcnNlcigoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuZ2V0UGFyc2VyKCkpOwotCQkJc2V0RG9jdW1lbnRDb250ZW50c0Zyb21SZWFkZXIoc3RydWN0dXJlZERvY3VtZW50LCBmRnVsbFByZXBhcmVkUmVhZGVyKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlIGluIHRoaXMgY29udGV4dAotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgIT0gbnVsbCkgewotCQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCi0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEByZXR1cm4gSURvY3VtZW50UGFydGl0aW9uZXIKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCgpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0TWltZVR5cGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TWltZVR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX01JTUVfVFlQRTsKLQl9Ci0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlpZiAoZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID0gbmV3IEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkKLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpIHsKLQkJaWYgKGZFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZkVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSA9IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBmRW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSB0aGUgTUlNRSBjb250ZW50IHR5cGUgc3BlY2lmaWVkIGluIGEgcGFnZSBkaXJlY3RpdmUuIFRoaXMKLQkgKiBzaG91bGQgYXBwZWFyICJhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiB0aGUgSlNQIHBhZ2UiIGFjY29yZGluZyB0byB0aGUKLQkgKiBKU1AgdjEuMiBzcGVjaWZpY2F0aW9uLgotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRFbWJlZGRlZFR5cGUoSUZpbGUgZmlsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgPT0gbnVsbCkgewotCQkJaGFuZGxlciA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBtaW1lVHlwZSA9IG51bGw7Ci0KLQkJCUlEb2N1bWVudENoYXJzZXREZXRlY3RvciBqc3BQcm92aWRlciA9IGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpOwotCQkJUmVhZGVyIGZ1bGxQcmVwYXJlZFJlYWRlciA9IGdldEZ1bGxQcmVwYXJlZFJlYWRlcigpOwotCQkJQnVmZmVyZWRMaW1pdGVkUmVhZGVyIGxpbWl0ZWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRMaW1pdGVkUmVhZGVyKGZ1bGxQcmVwYXJlZFJlYWRlciwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQkJanNwUHJvdmlkZXIuc2V0KGxpbWl0ZWRSZWFkZXIpOwotCQkJaWYgKGpzcFByb3ZpZGVyIGluc3RhbmNlb2YgSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IpIHsKLQkJCQltaW1lVHlwZSA9ICgoSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IpIGpzcFByb3ZpZGVyKS5nZXRDb250ZW50VHlwZSgpOwotCQkJCWZ1bGxQcmVwYXJlZFJlYWRlci5yZXNldCgpOwotCQkJfQotCi0JCQlFbWJlZGRlZFR5cGVSZWdpc3RyeSByZWcgPSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKTsKLQkJCWlmIChtaW1lVHlwZSA9PSBudWxsIHx8IG1pbWVUeXBlLmxlbmd0aCgpID09IDApIHsKLQkJCQloYW5kbGVyID0gZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaGFuZGxlciA9IHJlZy5nZXRUeXBlRm9yKG1pbWVUeXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgSlNQIGZpbGVzLCB0ZXh0L2h0bWwgaXMgdGhlIGRlZmF1bHQgY29udGVudCB0eXBlLiBUaGlzIG1heSB3YW50Ci0JICogdGhpcyBkaWZmZXJlbnQgZm9yIHR5cGVzIGxpa2UganN2IChqc3AgZm9yIHZvaWNlIHhtbCkgRm9yIG5vdywgaGFyZAotCSAqIGNvZGUgdG8gbmV3IGluc3RhbmNlLiBJbiBmdXR1cmUsIHNob3VsZCBnZXQgaW5zdGFuY2UgZnJvbSByZWdpc3RyeS4KLQkgKiBTcGVjaWZpY2F0aW9uIGNpdGVzIEhUTUwgYXMgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCUVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHJlZyA9IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpOwotCQlyZXR1cm4gcmVnLmdldFR5cGVGb3IoZ2V0RGVmYXVsdE1pbWVUeXBlKCkpOwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQkvLyByZW1lbWJlciwgdGhlIExvYWRlcgotCQkvLyB3aWxsIG5lZWQgdG8gZmluaXNoIGluaXRpYWxpemF0aW9uIG9mIHBhcnNlcgotCQkvLyBiYXNlZCBvbiAiZW1iZWRkZWQgY29udGVudCIKLQkJSlNQU291cmNlUGFyc2VyIHBhcnNlciA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJLy8gYWRkIGRlZmF1bHQgbmVzdGFibGUgdGFnIGxpc3QKLQkJYWRkTmVzdGFibGVQcmVmaXgocGFyc2VyLCBKU1AxMU5hbWVzcGFjZS5KU1BfVEFHX1BSRUZJWCk7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGRlbGltaXRlciA9IENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCQlpZiAoZGVsaW1pdGVyID09IG51bGwpCi0JCQlkZWxpbWl0ZXIgPSBzdXBlci5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKGZpbGUpOwotCQlyZXR1cm4gZGVsaW1pdGVyOwotCX0KLQotCS8qKgotCSAqIFNwZWNpZmljYXRpb24gY2l0ZXMgSVNPLTg4NTktMS9MYXRpbi0xIGFzIHRoZSBkZWZhdWx0IGNoYXJzZXQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlyZXR1cm4gU1BFQ19ERUZBVUxUX0VOQ09ESU5HOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQsIHRoYXQgaGFzCi0JICogYmVlbiBpbml0aWFsaXplZCB3aXRoIGFwcHJvcHJpYXRlIHBhcnNlci4gRm9yIG1hbnkgbG9hZGVycywgdGhlCi0JICogKGRlZmF1bHQpIHBhcnNlciB1c2VkIGlzIGtub3duIGZvciBhbnkgaW5wdXQuIEZvciBvdGhlcnMsIHRoZSBjb3JyZWN0Ci0JICogcGFyc2VyIChhbmQgaXRzIGluaXRpYWxpemF0aW9uKSBpcyBub3JtYWxsIGRlcGVuZGVudCBvbiB0aGUgY29udGVudCBvZgotCSAqIHRoZSBmaWxlLiBUaGlzIG5vLWFyZ3VtZW50IG1ldGhvZCBzaG91bGQgYXNzdW1lICJlbXB0eSBpbnB1dCIgYW5kIHdvdWxkCi0JICogdGhlcmVmb3JlIHJldHVybiB0aGUgZGVmYXVsdCBwYXJzZXIgZm9yIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlLiBJZiB0aGUKLQkgKiBwYXJzZXIgaXMgdG8gaGFuZGxlIHRhZyBsaWJyYXJpZXMsIGl0IG11c3QgaGF2ZSBhIFRhZ2xpYlN1cHBvcnQgb2JqZWN0Ci0JICogd2l0aCBhIHZhbGlkIFVSSVJlc29sdmVyIGFuZCB0aGlzIElTdHJ1Y3R1cmVkRG9jdW1lbnQgYXR0YWNoZWQgdG8gaXQKLQkgKiBiZWZvcmUgdGhlIGNvbnRlbnRzIGFyZSBzZXQgb24gdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIElFbmNvZGVkRG9jdW1lbnQgbmV3RW5jb2RlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKG5ldyBKU1BSZVBhcnNlcigpKTsKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50LnNldERvY3VtZW50UGFydGl0aW9uZXIobmV3Ci0JCS8vIEpTUEphdmFEb2N1bWVudFBhcnRpb25lcigpKTsKLQkJLy8gZXZlbiB0aG91Z2ggdGhpcyBpcyBhbiAiZW1wdHkgbW9kZWwiIC4uLiB3ZSB3YW50IGl0IHRvIGhhdmUgYXQKLQkJLy8gbGVhc3QKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQgZW1iZWRkZWRlZCBjb250ZW50IHR5cGUgaGFuZGxlcgotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkVHlwZSA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJZW1iZWRkZWRUeXBlLmluaXRpYWxpemVQYXJzZXIoc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEpTUERvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJLy8KLQkJLy8gZG9jdW1lbnQgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBzZXQgZm9yIHRoaXMgdG8KLQkJLy8gd29yay4KLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGRvY3VtZW50LCBKU1BDb3JlTWVzc2FnZXMuSlNQRG9jdW1lbnRMb2FkZXJfMSk7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgbW9kZWwgaW4gdGhlIGFkYXB0ZXIsIHRoaXMgd2lsbCBhZGFwdCBpdCB0bwotCQkvLyBmaXJzdCBub2RlLiBBZnRlciB0aGF0IHRoZSBQcm9wYWdhdGluZ0FkYXRlciBzcHJlYWRzIG92ZXIgdGhlCi0JCS8vIGNoaWxkcmVuIGJlaW5nCi0JCS8vIGNyZWF0ZWQuIEVhY2ggdGltZSB0aGF0IGhhcHBlbmRzLCBhIHNpZGUgZWZmZWN0IGlzIHRvCi0JCS8vIGFsc28gInNwcmVhZCIgc3ByZWNpZmljIHJlZ2lzdGVyZWQgYWRhcHRlcnMsCi0JCS8vIHRoZXkgdHdvIGNhbiBwcm9waWdhdGUgaXMgbmVlZGVkLgotCQkvLyBUaGlzICdnZXQnIGNhdXNlcyBmaXJzdCB0byBiZSBiZSBhdHRhY2hlZC4KLQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJLy8gbWF5IG1ha2UgdGhpcyBlYXNpZXIgdG8gdXNlIGluIGZ1dHVlCi0JCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXcgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5KCkpOwotCQkvLyBGb3IgSlNQcywgdGhlIE1vZGVsUXVlcnlBZGFwdGVyIG11c3QgYmUgImF0dGFjaGVkIiB0byB0aGUgZG9jdW1lbnQKLQkJLy8gYmVmb3JlIGNvbnRlbnQgaXMgc2V0IGluIHRoZSBtb2RlbCwgc28gdGFnbGliIGluaXRpemF0aW9uIGNhbgotCQkvLyB0YWtlIHBsYWNlLgotCQkoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0FycmF5TWFwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvQXJyYXlNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3ZWM3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvQXJyYXlNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgYSBoYXNodGFibGUgbWFwcyBrZXlzIHRvIGFycmF5cwotICogdG8gc3VwcG9ydCBtdWx0aXBsZSB2YWx1ZXMgYmVpbmcgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlCi0gKiBrZXkuIFRvIHJlbW92ZSBhIHNwZWNpZmljIGVudHJ5LCBhIGtleSBhbmQgaW5zZXJ0ZWQgdmFsdWUgbXVzdAotICogYmUgcHJvdmlkZWQuIFJlbW92aW5nIGp1c3QgYmFzZWQgb24gdGhlIGtleSBuYW1lIHdpbGwgcmVtb3ZlIGFsbAotICogdmFsdWVzIHN0b3JlZCB1bmRlciB0aGF0IGtleQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheU1hcCBleHRlbmRzIEhhc2h0YWJsZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkKLQlwdWJsaWMgQXJyYXlNYXAoaW50IHNpemUpIHsKLQkJc3VwZXIoc2l6ZSk7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJT2JqZWN0W10gdmFsdWVzID0gKE9iamVjdFtdKSBzdXBlci5nZXQoa2V5KTsKLQkJT2JqZWN0W10gbmV3VmFsdWVzID0gbnVsbDsKLQkJCi0JCWlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMubGVuZ3RoID09IDApCi0JCQluZXdWYWx1ZXMgPSBuZXcgT2JqZWN0WzFdOwotCQllbHNlIHsKLQkJCW5ld1ZhbHVlcyA9IG5ldyBPYmplY3RbdmFsdWVzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weSh2YWx1ZXMsIDAsIG5ld1ZhbHVlcywgMCwgdmFsdWVzLmxlbmd0aCk7Ci0JCX0KLQotCQluZXdWYWx1ZXNbbmV3VmFsdWVzLmxlbmd0aCAtIDFdID0gdmFsdWU7Ci0JCXJldHVybiBzdXBlci5wdXQoa2V5LCBuZXdWYWx1ZXMpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIDxjb2RlPnZhbHVlPC9jb2RlPiBmcm9tIHRoZSBsaXN0IAotCSAqIG9mIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggPGNvZGU+a2V5PC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBrZXkgdGhlIGtleSB0aGF0IGhhcyA8Y29kZT52YWx1ZTwvY29kZT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHNwZWNpZmljIHZhbHVlIHRvIHJlbW92ZSBmcm9tIHRoZSBrZXkKLQkgKiBAcmV0dXJuIFRoZSBpdGVtIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdFtdIHZhbHVlcyA9IChPYmplY3RbXSkgc3VwZXIuZ2V0KGtleSk7Ci0JCU9iamVjdCByZW1vdmVkID0gbnVsbDsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlcyAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyh2YWx1ZXNbaV0pKSB7Ci0JCQkJCXJlbW92ZWQgPSB2YWx1ZXNbaV07Ci0JCQkJCXJlc3VsdCA9IG5ldyBPYmplY3RbdmFsdWVzLmxlbmd0aCAtIDFdOwotCQkJCQkKLQkJCQkJaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7Ci0JCQkJCQkvLyBDb3B5IGxlZnQgb2YgdmFsdWUKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodmFsdWVzLCAwLCByZXN1bHQsIDAsIGkpOwotCQkJCQkJLy8gQ29weSByaWdodCBvZiB2YWx1ZQotCQkJCQkJaWYgKGkgPCAodmFsdWVzLmxlbmd0aCAtIDEpKQotCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodmFsdWVzLCBpKzEsIHJlc3VsdCwgaSwgcmVzdWx0Lmxlbmd0aCAtIGkpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCXN1cGVyLnJlbW92ZShrZXkpOwotCQkJCQkKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZihyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoID4gMCkKLQkJCXN1cGVyLnB1dChrZXksIHJlc3VsdCk7Ci0JCQotCQlyZXR1cm4gcmVtb3ZlZDsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewotCQlDb2xsZWN0aW9uIHZhbHVlbWFwcyA9IHN1cGVyLnZhbHVlcygpOwotCQlDb2xsZWN0aW9uIHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCWZvcihJdGVyYXRvciBpID0gdmFsdWVtYXBzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCXZhbHVlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCgoT2JqZWN0W10pIGkubmV4dCgpKSk7Ci0JCQotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0NvbXBpbGF0aW9uVW5pdEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0NvbXBpbGF0aW9uVW5pdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWNlOGQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9Db21waWxhdGlvblVuaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQcm9ibGVtUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7Ci0KLS8qKgotICogVG8gZW5zdXJlIHRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlIG9mIFByb2JsZW1SZXF1ZXN0b3IgYW5kIFdvcmtpbmdDb3B5T3duZXIKLSAqIGZvciBKU1AgcGx1Z2lucy4gIFRoZXNlIHdlcmUgcmVtb3ZlZCBmcm9tIEpTUFRyYW5zbGF0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZQotICogSlNQVHJhbnNsYXRpb24gd2FzIG5vdCBoZWxkIGluIG1lbW9yeSBieSBhbnkgdHlwZSBvZiBKRFQgbGlzdHMgKGNhY2hpbmcKLSAqIHNlYXJjaCByZXN1bHRzLCBldGMuLi4pCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXRIZWxwZXIgewotCi0gICAgcHJpdmF0ZSBKU1BQcm9ibGVtUmVxdWVzdG9yIGZQcm9ibGVtUmVxdWVzdG9yID0gbnVsbDsKLSAgICBwcml2YXRlIFdvcmtpbmdDb3B5T3duZXIgZldvcmtpbmdDb3B5T3duZXIgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIENvbXBpbGF0aW9uVW5pdEhlbHBlciBpbnN0YW5jZTsKLQotICAgIHByaXZhdGUgQ29tcGlsYXRpb25Vbml0SGVscGVyKCkgewotICAgICAgICAvLyBmb3JjZSB1c2Ugb2YgaW5zdGFuY2UKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBmaW5hbCBDb21waWxhdGlvblVuaXRIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0KLSAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBDb21waWxhdGlvblVuaXRIZWxwZXIoKTsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBKU1BQcm9ibGVtUmVxdWVzdG9yIGdldFByb2JsZW1SZXF1ZXN0b3IoKSB7Ci0KLSAgICAgICAgaWYgKGZQcm9ibGVtUmVxdWVzdG9yID09IG51bGwpCi0gICAgICAgICAgICBmUHJvYmxlbVJlcXVlc3RvciA9IG5ldyBKU1BQcm9ibGVtUmVxdWVzdG9yKCk7Ci0gICAgICAgIHJldHVybiBmUHJvYmxlbVJlcXVlc3RvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV29ya2luZ0NvcHlPd25lciBnZXRXb3JraW5nQ29weU93bmVyKCkgewotCi0gICAgICAgIGlmIChmV29ya2luZ0NvcHlPd25lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmV29ya2luZ0NvcHlPd25lciA9IG5ldyBXb3JraW5nQ29weU93bmVyKCkgewotICAgICAgICAgICAgCS8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXIjZ2V0UHJvYmxlbVJlcXVlc3RvcihvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0KQotICAgICAgICAgICAgCSAqLwotICAgICAgICAgICAgCXB1YmxpYyBJUHJvYmxlbVJlcXVlc3RvciBnZXRQcm9ibGVtUmVxdWVzdG9yKElDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkpIHsKLSAgICAgICAgICAgIAkJcmV0dXJuIENvbXBpbGF0aW9uVW5pdEhlbHBlci50aGlzLmdldFByb2JsZW1SZXF1ZXN0b3IoKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJKU1AgV29ya2luZyBjb3B5IG93bmVyIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZXb3JraW5nQ29weU93bmVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9Fc2NhcGVkVGV4dFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9Fc2NhcGVkVGV4dFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2NTM1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvRXNjYXBlZFRleHRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIGNsYXNzIHRvIGhhbmRsZSBjaHVua3Mgb2YgdGV4dC9yZWdpb25zCi0gKiB3aXRoIGVzY2FwZWQgY2hhcmFjdGVyIGRhdGEKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBFc2NhcGVkVGV4dFV0aWwgewotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGZYTUx0b0phdmFMb29rdXAgPSBudWxsOwotCi0JLyoqCi0JICogQHJldHVybiB1bmVzY2FwZWQgZnVsbCB0ZXh0IG9mIHRoYXQgcmVnaW9uLCAiIiBpZiB0aGVyZSBpcyBubyB0ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5lc2NhcGVkVGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgSVRleHRSZWdpb24gcikgewotCQlTdHJpbmcgdGVzdCA9IChwYXJlbnQgIT0gcikgPyBwYXJlbnQuZ2V0RnVsbFRleHQocikgOiBwYXJlbnQuZ2V0RnVsbFRleHQoKTsKLQkJcmV0dXJuIGdldFVuZXNjYXBlZFRleHQodGVzdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5lc2NhcGVkVGV4dChTdHJpbmcgdGVzdCkgewotCQlpbml0TG9va3VwKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmICh0ZXN0ICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGVzdCwgIiY7IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB0b2sxLCB0b2syLCB0b2szLCB0cmFuc1N0cmluZzsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQl0b2sxID0gdG9rMiA9IHRvazMgPSB0cmFuc1N0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJdG9rMSA9IHN0Lm5leHRUb2tlbigpOwotCQkJCWlmICh0b2sxLmVxdWFscygiJiIpICYmIHN0Lmhhc01vcmVUb2tlbnMoKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJdG9rMiA9IHN0Lm5leHRUb2tlbigpOwotCQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQl0b2szID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCEodHJhbnNTdHJpbmcgPSBmWE1MdG9KYXZhTG9va3VwLmdldFByb3BlcnR5KHRvazEgKyB0b2syICsgdG9rMywgIiIpKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQodHJhbnNTdHJpbmcpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCh0b2sxICsgdG9rMiArIHRvazMpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplIGxvb2t1cCB0YWJsZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRMb29rdXAoKSB7Ci0JCWZYTUx0b0phdmFMb29rdXAgPSBuZXcgUHJvcGVydGllcygpOwotCQlmWE1MdG9KYXZhTG9va3VwLnNldFByb3BlcnR5KCImYXBvczsiLCAiJyIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJZlhNTHRvSmF2YUxvb2t1cC5zZXRQcm9wZXJ0eSgiJnF1b3Q7IiwgIlwiIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQlmWE1MdG9KYXZhTG9va3VwLnNldFByb3BlcnR5KCImYW1wOyIsICImIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQlmWE1MdG9KYXZhTG9va3VwLnNldFByb3BlcnR5KCImbHQ7IiwgIjwiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCWZYTUx0b0phdmFMb29rdXAuc2V0UHJvcGVydHkoIiZndDsiLCAiPiIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJZlhNTHRvSmF2YUxvb2t1cC5zZXRQcm9wZXJ0eSgiJm5ic3A7IiwgIiAiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gZW50aXR5IHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0cmFuc2xhdGVFbnRpdHlSZWZlcmVuY2UoU3RyaW5nIGVudGl0eSkgewotCQlyZXR1cm4gZlhNTHRvSmF2YUxvb2t1cC5nZXRQcm9wZXJ0eShlbnRpdHksIGVudGl0eSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSUpTUFByb2JsZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9JSlNQUHJvYmxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjcwY2Q4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9JSlNQUHJvYmxlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUFByb2JsZW0gZXh0ZW5kcyBJUHJvYmxlbSB7Ci0KLQlpbnQgRl9QUk9CTEVNX0lEX0xJVEVSQUwgPSAweEEwMDAwMDAwOwotCQotCWludCBURUlDbGFzc05vdEZvdW5kID0gRl9QUk9CTEVNX0lEX0xJVEVSQUwgKyAxOwotCWludCBURUlWYWxpZGF0aW9uTWVzc2FnZSA9IEZfUFJPQkxFTV9JRF9MSVRFUkFMICsgMjsKLQlpbnQgVEVJQ2xhc3NOb3RJbnN0YW50aWF0ZWQgPSBGX1BST0JMRU1fSURfTElURVJBTCArIDM7Ci0JaW50IFRFSUNsYXNzTWlzYyA9IEZfUFJPQkxFTV9JRF9MSVRFUkFMICsgNDsJCi0JaW50IFRhZ0NsYXNzTm90Rm91bmQgPSBGX1BST0JMRU1fSURfTElURVJBTCArIDU7Ci0JaW50IFVzZUJlYW5JbnZhbGlkSUQgPSBGX1BST0JMRU1fSURfTElURVJBTCArIDY7Ci0JaW50IFVzZUJlYW5NaXNzaW5nVHlwZUluZm8gPSBGX1BST0JMRU1fSURfTElURVJBTCArIDc7Ci0JaW50IFVzZUJlYW5BbWJpZ3VvdXNUeXBlICA9IEZfUFJPQkxFTV9JRF9MSVRFUkFMICsgODsKLQlpbnQgU3RhcnRDdXN0b21UYWdNaXNzaW5nICA9IEZfUFJPQkxFTV9JRF9MSVRFUkFMICsgOTsKLQlpbnQgRW5kQ3VzdG9tVGFnTWlzc2luZyAgPSBGX1BST0JMRU1fSURfTElURVJBTCArIDEwOwotCWludCBVc2VCZWFuU3RhcnRUYWdNaXNzaW5nICA9IEZfUFJPQkxFTV9JRF9MSVRFUkFMICsgMTE7Ci0JaW50IFVzZUJlYW5FbmRUYWdNaXNzaW5nICA9IEZfUFJPQkxFTV9JRF9MSVRFUkFMICsgMTI7Ci0JaW50IEVMUHJvYmxlbSA9IEZfUFJPQkxFTV9JRF9MSVRFUkFMICsgMTM7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBJRCBvZiB0aGlzIEpTUCBwcm9ibGVtCi0JICovCi0JaW50IGdldEVJRCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSUpTUFRyYW5zbGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSUpTUFRyYW5zbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZjY0MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0lKU1BUcmFuc2xhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci0KLS8qKgotICogQW4gb2JqZWN0IHRoYXQgaG9sZHMgYSB0cmFuc2xhdGVkIEpTUCBTdHJpbmcgYWxvbmcgd2l0aAotICogcG9zaXRpb24gbWFwcGluZyBmcm9tIEphdmEgdG8gSlNQLCBhbmQgSlNQIHRvIEphdmEuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSlNQVHJhbnNsYXRpb24gewotCi0JLyoqCi0JICogVGhlIHN0cmluZyBjb250ZW50cyBvZiB0aGUgdHJhbnNsYXRlZCBkb2N1bWVudC4KLQkgKiBAcmV0dXJuICB0aGUgc3RyaW5nIGNvbnRlbnRzIG9mIHRoZSB0cmFuc2xhdGVkIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKTsKLQotCS8qKgotCSAqIFRoZSBjb3JyZXNwb25kaW5nIGphdmEgb2Zmc2V0IGluIHRoZSB0cmFuc2xhdGVkIGRvY3VtZW50IGZvciBhIGdpdmVuIGpzcCBvZmZzZXQuCi0JICogQHBhcmFtIGpzcFBvc2l0aW9uCi0JICogQHJldHVybiB0aGUgamF2YSBvZmZzZXQgdGhhdCBtYXBzIHRvIGpzcE9mZnNldCwgLTEgaWYgdGhlIHBvc2l0aW9uIGhhcyBubyBtYXBwaW5nLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SmF2YU9mZnNldChpbnQganNwT2Zmc2V0KTsKLQotCS8qKgotCSAqIFRoZSBjb3JyZXNwb25kaW5nIGpzcCBvZmZzZXQgaW4gdGhlIHNvdXJjZSBkb2N1bWVudCBmb3IgYSBnaXZlbiBqc3Agb2Zmc2V0IGluIHRoZSB0cmFuc2xhdGVkIGRvY3VtZW50LgotCSAqIEBwYXJhbSBqYXZhUG9zaXRpb24KLQkgKiBAcmV0dXJuIHRoZSBqc3Agb2Zmc2V0IHRoYXQgbWFwcyB0byBqYXZhT2Zmc2V0LCAtMSBpZiB0aGUgcG9zaXRpb24gaGFzIG5vIG1hcHBpbmcuCi0JICovCi0JcHVibGljIGludCBnZXRKc3BPZmZzZXQoaW50IGphdmFPZmZzZXQpOwotCi0JLyoqCi0JICogVGhlIGNvcnJlc3BvbmRpbmcgQ29tcGlsYXRpb25Vbml0IGZvciB0aGUgdHJhbnNsYXRlZCBKU1AgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIGFuIElDb21waWxhdGlvblVuaXQgb2YgdGhlIHRyYW5zbGF0aW9uCi0JICovCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJSmF2YUVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpTUCByYW5nZSBpbiB0aGUgSlNQIFN0cnVjdHVyZWREb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBqc3BTdGFydCBzdGFyaW5nIG9mZnNldCBpbiB0aGUgSlNQIGRvY3VtZW50Ci0JICogQHBhcmFtIGpzcEVuZCBlbmRpbmcgb2Zmc2V0IGluIHRoZSBKU1AgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIElKYXZhRWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgSlNQIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBJSmF2YUVsZW1lbnRbXSBnZXRFbGVtZW50c0Zyb21Kc3BSYW5nZShpbnQganNwU3RhcnQsIGludCBqc3BFbmQpOwotCi0JLyoqCi0JICogQHBhcmFtIGphdmFPZmZzZXQKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG9mZnNldCB3aXRoaW4gdGhlIHRyYW5zbGF0ZWQgSmF2YSBzb3VyY2UgbWFwcwotCSAqICAgICAgICAgZGlyZWN0bHkgdG8gYSBzY3JpcHRpbmcgcmVnaW9uIGluIHRoZSBvcmlnaW5hbCBKU1AKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luZGlyZWN0KGludCBqYXZhT2Zmc2V0KTsKLQkKLQkvKioKLQkgKiBNdXN0IGJlIHNldCB0cnVlIGluIG9yZGVyIGZvciBwcm9ibGVtcyB0byBiZSBjb2xsZWN0ZWQgZHVyaW5nIHJlY29uY2lsZS4KLQkgKiBJZiBzZXQgZmFsc2UsIHByb2JsZW1zIHdpbGwgYmUgaWdub3JlZCBkdXJpbmcgcmVjb25jaWxlLgotCSAqIEBwYXJhbSBjb2xsZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvYmxlbUNvbGxlY3RpbmdBY3RpdmUoYm9vbGVhbiBjb2xsZWN0KTsKLQotCS8qKgotCSAqIFJlY29uY2lsZXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZm9yIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGVDb21waWxhdGlvblVuaXQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIExpc3Qgb2YgcHJvYmxlbXMgY29sbGVjdGVkIGR1cmluZyByZWNvbmNpbGUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9ibGVtcygpOwotCQotCS8vIGFkZCB0aGVzZSBBUEkgb25jZSBmaW5hbGl6ZWQKLQkvLyBnZXRKc3BFZGl0cyhUZXh0RWRpdCBqYXZhRWRpdCkKLQkvLyBnZXRKYXZhUmFuZ2VzKCkKLSAgICAvLyBnZXRKYXZhRG9jdW1lbnQoKQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1AyU2VydmxldE5hbWVVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQMlNlcnZsZXROYW1lVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWM2YmQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1AyU2VydmxldE5hbWVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1AyU2VydmxldE5hbWVVdGlsIHsKLQkKLQkvKioKLQkgKiBXQVMgbWFuZ2xlcyBUb20mSmVycnkgYXM6IF9Ub21fMjZfSmVycnk7IHRoaXMgdGFrZXMgaW4gdGhlIG1hbmdsZWQgbmFtZQotCSAqIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5hbCBuYW1lLgotCSAqIAotCSAqIFVubWFuZ2xlcyB0aGUgcXVhbGlmaWVkIHR5cGUgbmFtZS4gIElmIGFuIHVuZGVyc2NvcmUgaXMgZm91bmQKLQkgKiBpdCBpcyBhc3N1bWVkIHRvIGJlIGEgbWFuZ2xlZCByZXByZXNlbnRhdGlvbiBvZiBhIG5vbi1hbHBoYSwgCi0JICogbm9uLWRpZ2l0IGNoYXJhY3RlciBvZiB0aGUgZm9ybSBfTk5fLCB3aGVyZSBOTiBhcmUgaGV4IGRpZ2l0cwotCSAqIHJlcHJlc2VudGluZyB0aGUgZW5jb2RlZCBjaGFyYWN0ZXIuICBUaGlzIHJvdXRpbmUgY29udmVydHMgaXQKLQkgKiBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgdW5tYW5nbGUoU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCWlmKHF1YWxpZmllZFR5cGVOYW1lLmNoYXJBdCgwKSAhPSAnXycpCi0JCQlyZXR1cm4gcXVhbGlmaWVkVHlwZU5hbWU7Ci0JCQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgcG9zc2libGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQotCQkvLyByZW1vdmUgdGhlIC5qYXZhIGV4dGVuc2lvbiBpZiB0aGVyZSBpcyBvbmUKLQkJaWYocXVhbGlmaWVkVHlwZU5hbWUuZW5kc1dpdGgoIi5qYXZhIikpLy8kTk9OLU5MUy0xJAotCQkJcXVhbGlmaWVkVHlwZU5hbWUgPSBxdWFsaWZpZWRUeXBlTmFtZS5zdWJzdHJpbmcoMCwgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoKCkgLSA1KTsKLQkJCi0JCWZvcihpbnQgaSA9IDE7IGkgPCBxdWFsaWZpZWRUeXBlTmFtZS5sZW5ndGgoKTsgaSsrKSB7ICAvLyBzdGFydCBhdCBpbmRleCAxIGIvYyAxc3QgY2hhciBpcyBhbHdheXMgJ18nCi0JCQljaGFyIGMgPSBxdWFsaWZpZWRUeXBlTmFtZS5jaGFyQXQoaSk7Ci0JCQlpZihjID09ICdfJykgewotCQkJCWludCBlbmRJbmRleCA9IHF1YWxpZmllZFR5cGVOYW1lLmluZGV4T2YoJ18nLCBpKzEpOwotCQkJCWlmKGVuZEluZGV4ID09IC0xKQotCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCWVsc2UgewotCQkJCQljaGFyIHVubWFuZ2xlZDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBvc3NpYmxlID0gcXVhbGlmaWVkVHlwZU5hbWUuc3Vic3RyaW5nKGkrMSwgZW5kSW5kZXgpOyAKLQkJCQkJICAgIGlmKGlzVmFsaWQocG9zc2libGUpKSB7Ci0JCQkJCQkJdW5tYW5nbGVkID0gKGNoYXIpSW50ZWdlci5kZWNvZGUoIjB4IiArIHBvc3NpYmxlKS5pbnRWYWx1ZSgpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpID0gZW5kSW5kZXg7Ci0JCQkJCSAgICB9Ci0JCQkJCSAgICBlbHNlIHsgCi0JCQkJCSAgICAgICAgdW5tYW5nbGVkID0gYzsKLQkJCQkJICAgIH0KLQkJCQkJCQotCQkJCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl1bm1hbmdsZWQgPSBjOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodW5tYW5nbGVkKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBIZXggcmVwcmVzZW50YXRpb24gb2YgYW4gQVNDSUkgY2hhcmFjdGVyIChlZy4gMkYgLT4gLykKLQkgKiBAcGFyYW0gcG9zc2libGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBwb3NzaWJsZSkgewotCSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCSAgICBpZihwb3NzaWJsZS5sZW5ndGgoKSA9PSAyKXsJICAgIAotCSAgICAgICAgY2hhciBjMSA9IHBvc3NpYmxlLmNoYXJBdCgwKTsKLQkgICAgICAgIGNoYXIgYzIgPSBwb3NzaWJsZS5jaGFyQXQoMSk7Ci0JICAgICAgICAvLyAxc3QgY2hhcmFjdGVyIG11c3QgYmUgYSBkaWdpdAotCSAgICAgICAgaWYoQ2hhcmFjdGVyLmlzRGlnaXQoYzEpKSB7Ci0JICAgICAgICAgICAgLy8gMm5kIGNoYXJhY3RlciBtdXN0IGJlIGRpZ2l0IG9yIHVwcGVyIGNhc2UgbGV0dGVyIEEtRgotCSAgICAgICAgICAgIGlmKENoYXJhY3Rlci5pc0RpZ2l0KGMyKSkgewotCSAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBlbHNlIGlmKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShjMikgJiYgKGMyID09ICdBJyB8fCBjMiA9PSAnQicgfHwgYzIgPT0gICdDJ3x8IGMyID09ICAnRCd8fCBjMiA9PSAgJ0UnfHwgYzIgPT0gJ0YnKSkgewotCSAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBNYW5nbGUgc3RyaW5nIHRvIFdBUy1saWtlIHNwZWNpZmljYXRpb25zCi0JICoKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBtYW5nbGUoU3RyaW5nIG5hbWUpIHsJICAKLQkgIFN0cmluZ0J1ZmZlciBtb2RpZmllZE5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JICAKLQkgIC8vIGV4dGVuc2lvbiAoLmpzcCwgLmpzcGYsIC5qc3B4LCBldGMuLi4pIHNob3VsZCBhbHJlYWR5IGJlIGVuY29kZWQgaW4gbmFtZQotCSAgCi0JICBpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKLQkgIC8vIGluIGNhc2UgbmFtZSBpcyBmb3JiaWRkZW4gKGEgbnVtYmVyLCBjbGFzcywgZm9yLCBldGMuLi4pCi0JICBtb2RpZmllZE5hbWUuYXBwZW5kKCdfJyk7Ci0JCi0JICAvLyBlbnN1cmUgcmVzdCBvZiBjaGFyYWN0ZXJzIGFyZSB2YWxpZAkKLQkgIGZvciAoaW50IGk9MDsgaTwgbGVuZ3RoOyBpKyspIHsKLQkJICBjaGFyIGN1cnJlbnRDaGFyID0gbmFtZS5jaGFyQXQoaSk7Ci0JCSAgLy8gWzI5MDc2OV0gTWFuZ2xlIF8gc2luY2UgbWFuZ2xpbmcgaW5zZXJ0cyBfIGFzIGEgZGVsaW1pdGVyCi0JCSAgaWYgKGN1cnJlbnRDaGFyID09ICdfJyB8fCAhQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGN1cnJlbnRDaGFyKSkKLQkJCSAgbW9kaWZpZWROYW1lLmFwcGVuZChtYW5nbGVDaGFyKGN1cnJlbnRDaGFyKSk7Ci0JCSAgZWxzZQotCQkJICBtb2RpZmllZE5hbWUuYXBwZW5kKGN1cnJlbnRDaGFyKTsKLQkgIH0KLQkgIHJldHVybiBtb2RpZmllZE5hbWUudG9TdHJpbmcoKTsKLQkgIAotCX0KLQotCS8qKgotCSAqIHRha2UgYSBjaGFyYWN0ZXIgYW5kIHJldHVybiBpdHMgaGV4IGVxdWl2YWxlbnQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgbWFuZ2xlQ2hhcihjaGFyIGNoKSB7Ci0JICBpZiAoIGNoID09IEZpbGUuc2VwYXJhdG9yQ2hhciApIHsKLQkJICBjaCA9ICcvJzsKLQkgIH0KLQkKLQkgIGlmICggQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjaCkgPT0gdHJ1ZSApIHsKLQkJICByZXR1cm4gIiIgKyBjaDsgLy8kTk9OLU5MUy0xJAotCSAgfQotCSAgcmV0dXJuICJfIiArIEludGVnZXIudG9IZXhTdHJpbmcoY2gpLnRvVXBwZXJDYXNlKCkgKyAiXyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BJbmNsdWRlUmVnaW9uSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQSW5jbHVkZVJlZ2lvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWI1YmUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BJbmNsdWRlUmVnaW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBFeHRlbnNpb24gb2YgWE1MSlNQUmVnaW9uSGVscGVyIGludGVuZGVkIHRvIHBhcnNlIGVudGlyZSBpbmNsdWRlZCBKU1AgZmlsZXMuCi0gKiBCYXNpY2FsbHkgaXQgZXhwYW5kcyB0aGUgcnVsZXMgZm9yIHdoYXQgdGFncyBhcmUgcGFyc2VkIGFzIEpTUC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotY2xhc3MgSlNQSW5jbHVkZVJlZ2lvbkhlbHBlciBleHRlbmRzIFhNTEpTUFJlZ2lvbkhlbHBlciB7Ci0JLyoqCi0JICogQHBhcmFtIEpTUFRyYW5zbGF0b3IKLQkgKi8KLQlwdWJsaWMgSlNQSW5jbHVkZVJlZ2lvbkhlbHBlcihKU1BUcmFuc2xhdG9yIHRyYW5zbGF0b3IsIGJvb2xlYW4gYXBwZW5kQXNJbmRpcmVjdFNvdXJjZSkgewotCQlzdXBlcih0cmFuc2xhdG9yLCBhcHBlbmRBc0luZGlyZWN0U291cmNlKTsKLQl9Ci0KLQkvLyB0aGVzZSBtZXRob2RzIGRldGVybWluZSB3aGF0IGNvbnRlbnQgZ2V0cyBhZGRlZCB0byB0aGUgbG9jYWwgc2NyaXBsZXQsIGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uIGJ1ZmZlcnMKLQkvKgotCSAqIHJldHVybiB0cnVlIGZvciBlbGVtZW50cyB3aG9zZSBjb250ZW50cyB3ZSBtaWdodCB3YW50IHRvIGFkZCB0byB0aGUgamF2YSBmaWxlIHdlIGFyZSBidWlsZGluZwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSlNQU3RhcnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHNkUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpOwotCQlyZXR1cm4gdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlY2xhcmF0aW9uKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkZWNsYXJhdGlvbiIpIC8vJE5PTi1OTFMtMSQJCQotCQkJCQl8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIjwlISIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4cHJlc3Npb24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmV4cHJlc3Npb24iKSAvLyROT04tTkxTLTEkCQkKLQkJCQkJfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCI8JT0iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2NyaXB0bGV0KFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpzY3JpcHRsZXQiKSAvLyROT04tTkxTLTEkCQkKLQkJCQkJfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCI8JSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmNsdWRlRGlyZWN0aXZlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkaXJlY3RpdmUuaW5jbHVkZSIpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJpbmNsdWRlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhZ2xpYkRpcmVjdGl2ZShTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGlyZWN0aXZlLnRhZ2xpYiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ0YWdsaWIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFnZURpcmVjdGl2ZShTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGlyZWN0aXZlLnBhZ2UiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgicGFnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gZGlmZmVyZW50IGJ0d24gWE1MLUpTUCBhbmQgSlNQIHRhZ3MJCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVnaW9uTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCQlTdHJpbmcgbmFtZVN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBzaXplID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJaWYgKHNpemUgPiAxKSB7Ci0JCQkvLyBwcmVzdW1hYmx5IFhNTC1KU1AgPGpzcDpzY3JpcHRsZXQ+IHwgPGpzcDpleHByZXNzaW9uPiB8IDxqc3A6ZGVjbGFyYXRpb24+Ci0JCQluYW1lUmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJfQotCQllbHNlIGlmIChzaXplID09IDEpIHsKLQkJCS8vIHByZXN1bWFibHkgSlNQIG9wZW4gPCUgfCA8JT0gfCA8JSEKLQkJCW5hbWVSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDApOwotCQl9Ci0JCWlmIChuYW1lUmVnaW9uICE9IG51bGwpCi0JCQluYW1lU3RyID0gZlRleHRUb1BhcnNlLnN1YnN0cmluZyhzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChuYW1lUmVnaW9uKSk7Ci0JCXJldHVybiBuYW1lU3RyLnRyaW0oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzT3RoZXJSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUoc2RSZWdpb24pOwotCQlwcm9jZXNzUGFnZURpcmVjdGl2ZShzZFJlZ2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlmU3RyaXBwZWRUZXh0ID0gZlRleHRCZWZvcmUgPSBmVGV4dFRvUGFyc2Uuc3Vic3RyaW5nKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHNkUmVnaW9uLmdldEVuZE9mZnNldCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQUHJvYmxlbVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFByb2JsZW1SZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0NzY4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQUHJvYmxlbVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVByb2JsZW1SZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci0KLWNsYXNzIEpTUFByb2JsZW1SZXF1ZXN0b3IgaW1wbGVtZW50cyBJUHJvYmxlbVJlcXVlc3RvciB7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZklzQWN0aXZlID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZklzUnVubmluZyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBMaXN0IGZDb2xsZWN0ZWRQcm9ibGVtczsKLQotICAgIHB1YmxpYyB2b2lkIGJlZ2luUmVwb3J0aW5nKCkgewotCi0gICAgICAgIGZJc1J1bm5pbmcgPSB0cnVlOwotICAgICAgICBmQ29sbGVjdGVkUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKSB7Ci0KLSAgICAgICAgaWYgKGlzQWN0aXZlKCkpCi0gICAgICAgICAgICBmQ29sbGVjdGVkUHJvYmxlbXMuYWRkKHByb2JsZW0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFJlcG9ydGluZygpIHsKLQotICAgICAgICBmSXNSdW5uaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0KLSAgICAgICAgcmV0dXJuIGZJc0FjdGl2ZSAmJiBmQ29sbGVjdGVkUHJvYmxlbXMgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhY3RpdmUgc3RhdGUgb2YgdGhpcyBwcm9ibGVtIHJlcXVlc3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXNBY3RpdmUKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGF0ZSBvZiB0aGlzIHByb2JsZW0gcmVxdWVzdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SXNBY3RpdmUoYm9vbGVhbiBpc0FjdGl2ZSkgewotCi0gICAgICAgIGlmIChmSXNBY3RpdmUgIT0gaXNBY3RpdmUpIHsKLSAgICAgICAgICAgIGZJc0FjdGl2ZSA9IGlzQWN0aXZlOwotICAgICAgICAgICAgaWYgKGZJc0FjdGl2ZSkKLSAgICAgICAgICAgICAgICBzdGFydENvbGxlY3RpbmdQcm9ibGVtcygpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHN0b3BDb2xsZWN0aW5nUHJvYmxlbXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlbGxzIHRoaXMgYW5ub3RhdGlvbiBtb2RlbCB0byBjb2xsZWN0IHRlbXBvcmFyeSBwcm9ibGVtcyBmcm9tIG5vdyBvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc3RhcnRDb2xsZWN0aW5nUHJvYmxlbXMoKSB7Ci0KLSAgICAgICAgZkNvbGxlY3RlZFByb2JsZW1zID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlbGxzIHRoaXMgYW5ub3RhdGlvbiBtb2RlbCB0byBubyBsb25nZXIgY29sbGVjdCB0ZW1wb3JhcnkgcHJvYmxlbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0b3BDb2xsZWN0aW5nUHJvYmxlbXMoKSB7Ci0KLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY29sbGVjdGVkIHByb2JsZW1zCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0Q29sbGVjdGVkUHJvYmxlbXMoKSB7Ci0KLSAgICAgICAgcmV0dXJuIGZDb2xsZWN0ZWRQcm9ibGVtczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7Ci0KLSAgICAgICAgcmV0dXJuIGZJc1J1bm5pbmc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM2MmJiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuV29ya2luZ0NvcHlPd25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIElKU1BUcmFuc2xhdGlvbi4gIAotICogPGJyPgotICogVGhpcyBvYmplY3QgdGhhdCBob2xkcyB0aGUgamF2YSB0cmFuc2xhdGlvbiBvZiAKLSAqIGEgSlNQIGZpbGUgYXMgd2VsbCBhcyBhIG1hcHBpbmcgb2YgcmFuZ2VzIGZyb20gdGhlIHRyYW5zbGF0ZWQgSmF2YSB0byB0aGUgSlNQIHNvdXJjZSwgCi0gKiBhbmQgbWFwcGluZyBmcm9tIEpTUCBzb3VyY2UgYmFjayB0byB0aGUgdHJhbnNsYXRlZCBKYXZhLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIFlvdSBtYXkgYWxzbyB1c2UgSlNQVHJhbnNsYXRpb24gdG8gZG8gQ29tcGlsYXRpb25Vbml0LWVzcXVlIHRoaW5ncyBzdWNoIGFzOgotICogPHVsPgotICogCTxsaT5jb2RlIHNlbGVjdCAoZ2V0IGphdmEgZWxlbWVudHMgZm9yIGpzcCBzZWxlY3Rpb24pPC9saT4KLSAqICA8bGk+cmVjb25jaWxlPC9saT4KLSAqICA8bGk+Z2V0IGphdmEgcmVnaW9ucyBmb3IganNwIHNlbGVjdGlvbjwvbGk+Ci0gKiAgPGxpPmdldCBhIEpTUCB0ZXh0IGVkaXQgYmFzZWQgb24gYSBKYXZhIHRleHQgZWRpdDwvbGk+Ci0gKiAgPGxpPmRldGVybWluZSBpZiBhIGphdmEgb2Zmc2V0IGZhbGxzIHdpdGhpbiBhIGpzcDp1c2VCZWFuIHJhbmdlPC9saT4KLSAqICA8bGk+ZGV0ZXJtaW5lIGlmIGEgamF2YSBvZmZzZXQgZmFsbHMgd2l0aGluIGEganNwIGltcG9ydCBzdGF0bWVudDwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHJhbnNsYXRpb24gaW1wbGVtZW50cyBJSlNQVHJhbnNsYXRpb24gewotCQotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZT0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B0cmFuc2xhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgKHcvb3V0IGV4dGVuc2lvbikgKiovCi0JcHJpdmF0ZSBTdHJpbmcgZkNsYXNzbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZkphdmFQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIEhhc2hNYXAgZkphdmEySnNwTWFwID0gbnVsbDsKLQlwcml2YXRlIEhhc2hNYXAgZkpzcDJKYXZhTWFwID0gbnVsbDsKLQlwcml2YXRlIEhhc2hNYXAgZkphdmEySnNwSW1wb3J0c01hcCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZKYXZhMkpzcFVzZUJlYW5NYXAgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmSmF2YTJKc3BJbmRpcmVjdE1hcCA9IG51bGw7Ci0JCi0JLy8gZG9uJ3Qgd2FudCB0byBob2xkIG9udG8gbW9kZWwgKHZpYSB0cmFuc2xhdG9yKQotCS8vIGFsbCByZWxldmFudCBpbmZvIGlzIGV4dHJhY3RlZCBpbiB0aGUgY29uc3RydWN0b3IuCi0JLy9wcml2YXRlIEpTUFRyYW5zbGF0b3IgZlRyYW5zbGF0b3IgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZKYXZhVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZkpzcFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBmQ29tcGlsYXRpb25Vbml0ID0gbnVsbDsKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0JLyoqIGxvY2sgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBjb21waWxhdGlvbiB1bml0ICoqLwotCXByaXZhdGUgYnl0ZVtdIGZMb2NrID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmTWFuZ2xlZE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZkpzcE5hbWU7Ci0JcHJpdmF0ZSBMaXN0IGZUcmFuc2xhdGlvblByb2JsZW1zOwotCXByaXZhdGUgQ29sbGVjdGlvbiBmSW5jbHVkZWRQYXRoczsKLQkKLQkvKiogdGhlIHtAbGluayBKU1BUcmFuc2xhdG9yfSB1c2VkIGJ5IHRoaXMge0BsaW5rIEpTUFRyYW5zbGF0b3J9ICovCi0JcHJpdmF0ZSBKU1BUcmFuc2xhdG9yIGZUcmFuc2xhdG9yOwotCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uKElKYXZhUHJvamVjdCBqYXZhUHJvaiwgSlNQVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0KLQkJZkxvY2sgPSBuZXcgYnl0ZVswXTsKLQkJZkphdmFQcm9qZWN0ID0gamF2YVByb2o7Ci0JCWZUcmFuc2xhdG9yID0gdHJhbnNsYXRvcjsKLQkJCi0JCS8vIGNhbiBiZSBudWxsIGlmIGl0J3MgYW4gZW1wdHkgZG9jdW1lbnQgKHcvIE51bGxKU1BUcmFuc2xhdGlvbikKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZihmVHJhbnNsYXRvciAhPSBudWxsKSB7Ci0JCQlmSmF2YVRleHQgPSBmVHJhbnNsYXRvci5nZXRUcmFuc2xhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQlmSnNwVGV4dCA9IGZUcmFuc2xhdG9yLmdldEpzcFRleHQoKTsKLQkJCWZDbGFzc25hbWUgPSBmVHJhbnNsYXRvci5nZXRDbGFzc25hbWUoKTsKLQkJCWZKYXZhMkpzcE1hcCA9IGZUcmFuc2xhdG9yLmdldEphdmEySnNwUmFuZ2VzKCk7Ci0JCQlmSnNwMkphdmFNYXAgPSBmVHJhbnNsYXRvci5nZXRKc3AySmF2YVJhbmdlcygpOwotCQkJZkphdmEySnNwSW1wb3J0c01hcCA9IGZUcmFuc2xhdG9yLmdldEphdmEySnNwSW1wb3J0UmFuZ2VzKCk7Ci0JCQlmSmF2YTJKc3BVc2VCZWFuTWFwID0gZlRyYW5zbGF0b3IuZ2V0SmF2YTJKc3BVc2VCZWFuUmFuZ2VzKCk7Ci0JCQlmSmF2YTJKc3BJbmRpcmVjdE1hcCA9IGZUcmFuc2xhdG9yLmdldEphdmEySnNwSW5kaXJlY3RSYW5nZXMoKTsKLQkJCWZUcmFuc2xhdGlvblByb2JsZW1zID0gZlRyYW5zbGF0b3IuZ2V0VHJhbnNsYXRpb25Qcm9ibGVtcygpOwotCQkJZkluY2x1ZGVkUGF0aHMgPSBmVHJhbnNsYXRvci5nZXRJbmNsdWRlZFBhdGhzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHtAbGluayBKU1BUcmFuc2xhdG9yfSB1c2VkIGJ5IHRoaXMge0BsaW5rIEpTUFRyYW5zbGF0aW9ufQotCSAqLwotCXByb3RlY3RlZCBKU1BUcmFuc2xhdG9yIGdldFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmZUcmFuc2xhdG9yOwotCX0KLQkKLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gZkphdmFQcm9qZWN0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbiNnZXRKYXZhVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKYXZhVGV4dCgpIHsKLQkJLy9yZXR1cm4gKGZUcmFuc2xhdG9yICE9IG51bGwpID8gZlRyYW5zbGF0b3IuZ2V0VHJhbnNsYXRpb24oKS50b1N0cmluZygpIDogIiI7ICAvLyROT04tTkxTLTEkIAotCQlyZXR1cm4gZkphdmFUZXh0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEpzcFRleHQoKSB7Ci0JCS8vcmV0dXJuIChmVHJhbnNsYXRvciAhPSBudWxsKSA/IGZUcmFuc2xhdG9yLmdldEpzcFRleHQoKSA6ICIiOyAgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZkpzcFRleHQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVBhdGgoKSB7Ci0JCS8vIGNyZWF0ZSBpZiBuZWNlc3NhcnkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlyZXR1cm4gKGN1ICE9IG51bGwpID8gY3UuZ2V0UGF0aCgpLnRvU3RyaW5nKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgb2Zmc2V0IGZvciBhIGdpdmUgSlNQIG9mZnNldAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SmF2YU9mZnNldChpbnQganNwT2Zmc2V0KSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IG9mZnNldEluUmFuZ2UgPSAwOwotCQlQb3NpdGlvbiBqc3BQb3MsIGphdmFQb3MgPSBudWxsOwotCi0JCS8vIGl0ZXJhdGUgYWxsIG1hcHBlZCBqc3AgcmFuZ2VzCi0JCUl0ZXJhdG9yIGl0ID0gZkpzcDJKYXZhTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWpzcFBvcyA9IChQb3NpdGlvbikgaXQubmV4dCgpOwotCQkJLy8gbmVlZCB0byBjb3VudCB0aGUgbGFzdCBwb3NpdGlvbiBhcyBpbmNsdWRlZAotCQkJaWYgKCFqc3BQb3MuaW5jbHVkZXMoanNwT2Zmc2V0KSAmJiAhKGpzcFBvcy5vZmZzZXQranNwUG9zLmxlbmd0aCA9PSBqc3BPZmZzZXQpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlvZmZzZXRJblJhbmdlID0ganNwT2Zmc2V0IC0ganNwUG9zLm9mZnNldDsKLQkJCWphdmFQb3MgPSAoUG9zaXRpb24pIGZKc3AySmF2YU1hcC5nZXQoanNwUG9zKTsKLQkJCWlmKGphdmFQb3MgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBqYXZhUG9zLm9mZnNldCArIG9mZnNldEluUmFuZ2U7Ci0JCQllbHNlICB7Ci0KLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkphdmFQb3NpdGlvbiB3YXMgbnVsbCEiICsganNwT2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEpTUCBvZmZzZXQgZm9yIGEgZ2l2ZSBKYXZhIG9mZnNldAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SnNwT2Zmc2V0KGludCBqYXZhT2Zmc2V0KSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IG9mZnNldEluUmFuZ2UgPSAwOwotCQlQb3NpdGlvbiBqc3BQb3MsIGphdmFQb3MgPSBudWxsOwotCi0JCS8vIGl0ZXJhdGUgYWxsIG1hcHBlZCBqYXZhIHJhbmdlcwotCQlJdGVyYXRvciBpdCA9IGZKYXZhMkpzcE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlqYXZhUG9zID0gKFBvc2l0aW9uKSBpdC5uZXh0KCk7Ci0JCQkvLyBuZWVkIHRvIGNvdW50IHRoZSBsYXN0IHBvc2l0aW9uIGFzIGluY2x1ZGVkCi0JCQlpZiAoIWphdmFQb3MuaW5jbHVkZXMoamF2YU9mZnNldCkgJiYgIShqYXZhUG9zLm9mZnNldCtqYXZhUG9zLmxlbmd0aCA9PSBqYXZhT2Zmc2V0KSkKLQkJCQljb250aW51ZTsKLQotCQkJb2Zmc2V0SW5SYW5nZSA9IGphdmFPZmZzZXQgLSBqYXZhUG9zLm9mZnNldDsKLQkJCWpzcFBvcyA9IChQb3NpdGlvbikgZkphdmEySnNwTWFwLmdldChqYXZhUG9zKTsKLQkJCQotCQkJaWYoanNwUG9zICE9IG51bGwpCi0JCQkJcmVzdWx0ID0ganNwUG9zLm9mZnNldCArIG9mZnNldEluUmFuZ2U7Ci0JCQllbHNlICB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJqc3BQb3NpdGlvbiB3YXMgbnVsbCEiICsgamF2YU9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEluY2x1ZGVkUGF0aHMoKSB7Ci0JCXJldHVybiBmSW5jbHVkZWRQYXRoczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIFBvc2l0aW9ucyBpbiB0aGUgSmF2YSBkb2N1bWVudCB0byBjb3JyZXNwb25kaW5nIFBvc2l0aW9ucyBpbiB0aGUgSlNQIGRvY3VtZW50Ci0JICovCi0JcHVibGljIEhhc2hNYXAgZ2V0SmF2YTJKc3BNYXAoKSB7Ci0JCXJldHVybiBmSmF2YTJKc3BNYXA7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiBQb3NpdGlvbnMgaW4gdGhlIEpTUCBkb2N1bWVudCB0byBjb3JyZXNwb25kaW5nIFBvc2l0aW9ucyBpbiB0aGUgSmF2YSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBIYXNoTWFwIGdldEpzcDJKYXZhTWFwKCkgewotCQlyZXR1cm4gZkpzcDJKYXZhTWFwOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGphdmEgcmFuZ2UgY292ZXJzIG1vcmUgdGhhbiBvbmUgcGFydGl0aW9uIGluIHRoZSBKU1AgZmlsZS4KLQkgKiAKLQkgKiA8cD4KLQkgKiBleC4KLQkgKiA8Y29kZT4KLQkgKiA8JQotCSAqIAlpZihzdWJtaXQpCi0JICogIHsKLQkgKiAlPgotCSAqICAgIDxwPiBwcmludCB0aGlzLi4uPC9wPgotCSAqIAotCSAqIDwlCi0JICogIH0KLQkgKiAgZWxzZQotCSAqICB7Ci0JICogJT4KLQkgKiAJICAgPHA+IHByaW50IHRoYXQuLi48L3A+Ci0JICogPCUKLQkgKiAgfQotCSAqICU+Ci0JICogPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiB0aGUgaWYgZWxzZSBzdGF0ZW1lbnQgYWJvdmUgc3BhbnMgMyBKU1AgcGFydGl0aW9ucywgc28gaXQgd291bGQgcmV0dXJuIHRydWUuCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBqYXZhIGNvZGUgc3BhbnMgbXVsdGlwbGUgSlNQIHBhcnRpdGlvbnMsIG90aGVyd2lzZSBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBqYXZhU3BhbnNNdWx0aXBsZUpzcFBhcnRpdGlvbnMoaW50IGphdmFPZmZzZXQsIGludCBqYXZhTGVuZ3RoKSB7Ci0JCUhhc2hNYXAgamF2YTJqc3AgPSBnZXRKYXZhMkpzcE1hcCgpOwotCQlpbnQgY291bnQgPSAwOwotCQlJdGVyYXRvciBpdCA9IGphdmEyanNwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVBvc2l0aW9uIGphdmFSYW5nZSA9IG51bGw7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJamF2YVJhbmdlID0gKFBvc2l0aW9uKWl0Lm5leHQoKTsKLQkJCWlmKGphdmFSYW5nZS5vdmVybGFwc1dpdGgoamF2YU9mZnNldCwgamF2YUxlbmd0aCkpCi0JCQkJY291bnQrKzsKLQkJCWlmKGNvdW50ID4gMSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmEgcG9zaXRpb25zIGZvciB0aGUgZ2l2ZW4gcmFuZ2UgaW4gdGhlIEphdmEgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFBvc2l0aW9uW10gZ2V0SmF2YVJhbmdlcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdCA9IGdldEphdmEySnNwTWFwKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJUG9zaXRpb24gcCA9IG51bGw7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJcCA9IChQb3NpdGlvbilpdC5uZXh0KCk7Ci0JCQlpZihwLm92ZXJsYXBzV2l0aChvZmZzZXQsIGxlbmd0aCkpCi0JCQkJcmVzdWx0cy5hZGQocCk7Ci0JCX0KLQkJcmV0dXJuIChQb3NpdGlvbltdKXJlc3VsdHMudG9BcnJheShuZXcgUG9zaXRpb25bcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBqYXZhIE9mZnNldCBmYWxscyB3aXRoaW4gdGhlIHVzZXIgaW1wb3J0IHJhbmdlcwotCSAqIEBwYXJhbSBqYXZhT2Zmc2V0Ci0JICogQHJldHVybiB0cnVlIGlmIHRoZSBqYXZhIE9mZnNldCBmYWxscyB3aXRoaW4gdGhlIHVzZXIgaW1wb3J0IHJhbmdlcywgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbXBvcnQoaW50IGphdmFPZmZzZXQpIHsKLQkJcmV0dXJuIGlzSW5SYW5nZXMoamF2YU9mZnNldCwgZkphdmEySnNwSW1wb3J0c01hcCk7Ci0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBqYXZhIG9mZnNldCBmYWxscyB3aXRoaW4gdGhlIHVzZSBiZWFuIHJhbmdlcwotCSAqIEBwYXJhbSBqYXZhT2Zmc2V0Ci0JICogQHJldHVybiB0cnVlIGlmIHRoZSBqYXZhIG9mZnNldCBmYWxscyB3aXRoaW4gdGhlIHVzZXIgaW1wb3J0IHJhbmdlcywgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVc2VCZWFuKGludCBqYXZhT2Zmc2V0KSB7Ci0JCXJldHVybiBpc0luUmFuZ2VzKGphdmFPZmZzZXQsIGZKYXZhMkpzcFVzZUJlYW5NYXApOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gamF2YVBvcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luZGlyZWN0KGludCBqYXZhT2Zmc2V0KSB7Ci0JCXJldHVybiBpc0luUmFuZ2VzKGphdmFPZmZzZXQsIGZKYXZhMkpzcEluZGlyZWN0TWFwLCBmYWxzZSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0luUmFuZ2VzKGludCBqYXZhT2Zmc2V0LCBIYXNoTWFwIHJhbmdlcykgewotCQlyZXR1cm4gaXNJblJhbmdlcyhqYXZhT2Zmc2V0LCByYW5nZXMsIHRydWUpOwotCX0KLQkvKioKLQkgKiBUZWxscyB5b3UgaWYgdGhlIGdpdmVuIG9mZnNldCBpcyBpbmNsdWRlZCBpbiBhbnkgb2YgdGhlIHJhbmdlcyAoUG9zaXRpb25zKSBwYXNzZWQgaW4uCi0JICogaW5jbHVkZUVuZE9mZnNldCB0ZWxscyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSBlbmQgb2Zmc2V0IG9mIGVhY2ggcmFuZ2UgaW4gdGhlIHRlc3QuCi0JICogCi0JICogQHBhcmFtIGphdmFPZmZzZXQKLQkgKiBAcGFyYW0gcmFuZ2VzCi0JICogQHBhcmFtIGluY2x1ZGVFbmRPZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5SYW5nZXMoaW50IGphdmFPZmZzZXQsIEhhc2hNYXAgcmFuZ2VzLCBib29sZWFuIGluY2x1ZGVFbmRPZmZzZXQpIHsKLQkJCi0JCUl0ZXJhdG9yIGl0ID0gcmFuZ2VzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJUG9zaXRpb24gamF2YVBvcyA9IChQb3NpdGlvbilpdC5uZXh0KCk7Ci0JCQkvLyBhbHNvIGluY2x1ZGUgdGhlIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0IChvbmx5IGlmIHJlcXVlc3RlZCkKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MTY4NwotCQkJaWYoamF2YVBvcy5pbmNsdWRlcyhqYXZhT2Zmc2V0KSB8fCAoaW5jbHVkZUVuZE9mZnNldCAmJiBqYXZhUG9zLm9mZnNldCtqYXZhUG9zLmxlbmd0aCA9PSBqYXZhT2Zmc2V0KSkgCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSBDb21waWxhdGlvblVuaXQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSlNQVHJhbnNsYXRpb24gKHRoaXMgcGFydGljdWxhciBtb2RlbCkKLQkgKiBXaGVuIHVzaW5nIG1ldGhvZHMgb24gdGhlIENVLCBpdCdzIHJlY2NvbWVuZGVkIHRvIHN5bmNocm9uaXplIG9uIHRoZSBDVSBmb3IgcmVsaWFibGUKLQkgKiByZXN1bHRzLgotCSAqIAotCSAqIFRoZSBtZXRob2QgaXMgc3luY2hyb25pemVkIHRvIGVuc3VyZSB0aGF0IDxjb2RlPmNyZWF0ZUNvbXBsaWxhdGlvblVuaXQ8L2NvZGU+IGRvZXNuJ3QKLQkgKiBnZXQgZW50ZXJlZCAyIG9yIG1vcmUgdGltZXMgc2ltdWx0YW5lb3VzbHkuICBBIHNpZGUgZWZmZWN0IG9mIHRoYXQgaXMgMiBjb21waWxhdGlvbiB1bml0cwotCSAqIGNhbiBiZSBjcmVhdGVkIGluIHRoZSBKYXZhTW9kZWxNYW5hZ2VyLCBidXQgd2Ugb25seSBob2xkIG9uZSByZWZlcmVuY2UgdG8gaXQgaW4gCi0JICogZkNvbXBpbGF0aW9uVW5pdC4gIFRoaXMgd291bGQgbGVhZCB0byBhIGxlYWsgc2luY2Ugb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIENVIGlzCi0JICogZGlzY2FyZGVkIGluIHRoZSA8Y29kZT5yZWxlYXNlKCk8L2NvZGU+IG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29tcGlsYXRpb25Vbml0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7Ci0JCXN5bmNocm9uaXplZChmTG9jaykgewotCQkJdHJ5IHsKLQkJCQlpZiAoZkNvbXBpbGF0aW9uVW5pdCA9PSBudWxsKSB7Ci0JCQkJCWZDb21waWxhdGlvblVuaXQgPSBjcmVhdGVDb21waWxhdGlvblVuaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJCWlmKERFQlVHKQotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJlcnJvciBjcmVhdGluZyBKU1Agd29ya2luZyBjb3B5Li4uICIsIGptZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkNvbXBpbGF0aW9uVW5pdDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNYW5nbGVkTmFtZSgpIHsKLQkJcmV0dXJuIGZNYW5nbGVkTmFtZTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldE1hbmdsZWROYW1lKFN0cmluZyBtYW5nbGVkTmFtZSkgewotCQlmTWFuZ2xlZE5hbWUgPSBtYW5nbGVkTmFtZTsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0SnNwTmFtZSgpIHsKLQkJcmV0dXJuIGZKc3BOYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRKc3BOYW1lKFN0cmluZyBqc3BOYW1lKSB7Ci0JCWZKc3BOYW1lID0ganNwTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBtYW5nbGVkIChzZXJ2bGV0KSBuYW1lIHdpdGgganNwIGZpbGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheVN0cmluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZpeHVwTWFuZ2xlZE5hbWUoU3RyaW5nIGRpc3BsYXlTdHJpbmcpIHsKLQkJCi0JCWlmKGRpc3BsYXlTdHJpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaWYoZ2V0SnNwTmFtZSgpID09IG51bGwgfHwgZ2V0TWFuZ2xlZE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkvLyBuYW1lcyBub3Qgc2V0IHlldAotCQkJaW5pdEpzcEFuZFNlcnZsZXROYW1lcygpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5U3RyaW5nLnJlcGxhY2VBbGwoZ2V0TWFuZ2xlZE5hbWUoKSwgZ2V0SnNwTmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdEpzcEFuZFNlcnZsZXROYW1lcygpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlpZihjdSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY3VOYW1lID0gbnVsbDsKLQkJCXN5bmNocm9uaXplZChjdSkgewotCQkJCS8vIHNldCBzb21lIG5hbWVzIGZvciBmaXhpbmcgdXAgbWFuZ2xlZCBuYW1lIGluIHByb3Bvc2FscwotCQkJCS8vIHNldCBtYW5nbGVkIChzZXJ2bGV0KSBuYW1lCi0JCQkJIGN1TmFtZSA9IGN1LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpOwotCQkJfQotCQkJaWYoY3VOYW1lICE9IG51bGwpIHsKLQkJCQlzZXRNYW5nbGVkTmFtZShjdU5hbWUuc3Vic3RyaW5nKDAsIGN1TmFtZS5sYXN0SW5kZXhPZignLicpKSk7Ci0JCQkJLy8gc2V0IG5hbWUgb2YganNwIGZpbGUKLQkJCQlTdHJpbmcgdW5tYW5nbGVkID0gSlNQMlNlcnZsZXROYW1lVXRpbC51bm1hbmdsZShjdU5hbWUpOwotCQkJCXNldEpzcE5hbWUodW5tYW5nbGVkLnN1YnN0cmluZyh1bm1hbmdsZWQubGFzdEluZGV4T2YoJy8nKSArIDEsIHVubWFuZ2xlZC5sYXN0SW5kZXhPZignLicpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBPcmlnaW5hbGx5IGZyb20gUmVjb25jaWxlU3RlcEZvckphdmEuICBDcmVhdGVzIGFuIElDb21waWxhdGlvblVuaXQgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIEpTUCBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIElDb21waWxhdGlvblVuaXQgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIEpTUCBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCi0JCUlKYXZhUHJvamVjdCBqZSA9IGdldEphdmFQcm9qZWN0KCk7Ci0KLQkJaWYgKGplID09IG51bGwgfHwgIWplLmV4aXN0cygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGdldENsYXNzbmFtZSgpICsgIi5qYXZhIjsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IG51bGw7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBqZS5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VGcmFnbWVudFJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIXBhY2thZ2VGcmFnbWVudFJvb3RzW2ldLmlzQXJjaGl2ZSgpICYmICFwYWNrYWdlRnJhZ21lbnRSb290c1tpXS5pc0V4dGVybmFsKCkpIHsKLQkJCQlwYWNrYWdlRnJhZ21lbnRSb290ID0gcGFja2FnZUZyYWdtZW50Um9vdHNbaV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHBhY2thZ2VGcmFnbWVudFJvb3QgPT0gbnVsbCkgewotCQkJaWYoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqIEFib3J0IGNyZWF0ZSB3b3JraW5nIGNvcHk6IGNhbm5vdCBjcmVhdGUgd29ya2luZyBjb3B5OiBKU1AgaXMgbm90IGluIGEgSmF2YSBwcm9qZWN0IHdpdGggc291cmNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IGZyYWdtZW50ID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudFJvb3QuREVGQVVMVF9QQUNLQUdFUk9PVF9QQVRIKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGZyYWdtZW50LmdldENvbXBpbGF0aW9uVW5pdChuYW1lKS5nZXRXb3JraW5nQ29weShnZXRXb3JraW5nQ29weU93bmVyKCksIGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJc2V0Q29udGVudHMoY3UpOwotCi0JCWlmKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIoKykgSlNQVHJhbnNsYXRpb24gWyIrIHRoaXMgKyAiXSBmaW5pc2hlZCBjcmVhdGluZyBDb21waWxhdGlvblVuaXQ6ICIgKyBjdSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJcmV0dXJuIGN1OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2JsZW0gcmVxdWVzdG9yIGZvciB0aGUgQ29tcGlsYXRpb25Vbml0IGluIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKi8KLQlwcml2YXRlIEpTUFByb2JsZW1SZXF1ZXN0b3IgZ2V0UHJvYmxlbVJlcXVlc3RvcigpIHsKLQkgICAgcmV0dXJuIENvbXBpbGF0aW9uVW5pdEhlbHBlci5nZXRJbnN0YW5jZSgpLmdldFByb2JsZW1SZXF1ZXN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJV29ya2luZ0NvcHlPd25lciBmb3IgdGhpcyBDb21waWxhdGlvblVuaXQgaW4gdGhpcyBKU1BUcmFuc2xhdGlvbgotCSAqLwotCXB1YmxpYyBXb3JraW5nQ29weU93bmVyIGdldFdvcmtpbmdDb3B5T3duZXIoKSB7Ci0JICAgIHJldHVybiBDb21waWxhdGlvblVuaXRIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRXb3JraW5nQ29weU93bmVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIGluIGxvbmcgb3BlcmF0aW9ucyAocmVjb25jaWxlLCBjcmVhdGluZyB0aGUgQ29tcGlsYXRpb25Vbml0Li4uKSBpbiB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJaWYgKGZQcm9ncmVzc01vbml0b3IgPT0gbnVsbCkKLQkJCWZQcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gZlByb2dyZXNzTW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBMaXN0IG9mIHByb2JsZW1zIGNvbGxlY3RlZCBkdXJpbmcgcmVjb25jaWxlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvYmxlbXMoKSB7Ci0JCUxpc3QgcHJvYmxlbXMgPSBnZXRQcm9ibGVtUmVxdWVzdG9yKCkuZ2V0Q29sbGVjdGVkUHJvYmxlbXMoKTsKLQkJaWYgKHByb2JsZW1zICE9IG51bGwpIHsKLQkJCWlmIChmVHJhbnNsYXRpb25Qcm9ibGVtcy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gcHJvYmxlbXM7Ci0JCQl9Ci0JCQlMaXN0IGNvbWJpbmVkUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KHByb2JsZW1zKTsKLQkJCWNvbWJpbmVkUHJvYmxlbXMuYWRkQWxsKGZUcmFuc2xhdGlvblByb2JsZW1zKTsKLQkJCXJldHVybiBjb21iaW5lZFByb2JsZW1zOwotCQl9Ci0JCXJldHVybiBmVHJhbnNsYXRpb25Qcm9ibGVtczsKLQl9Ci0KLQkvKioKLQkgKiBNdXN0IGJlIHNldCB0cnVlIGluIG9yZGVyIGZvciBwcm9ibGVtcyB0byBiZSBjb2xsZWN0ZWQgZHVyaW5nIHJlY29uY2lsZS4KLQkgKiBJZiBzZXQgZmFsc2UsIHByb2JsZW1zIHdpbGwgYmUgaWdub3JlZCBkdXJpbmcgcmVjb25jaWxlLgotCSAqIEBwYXJhbSBjb2xsZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvYmxlbUNvbGxlY3RpbmdBY3RpdmUoYm9vbGVhbiBjb2xsZWN0KSB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYoY3UgIT0gbnVsbCkgewkKLQkJCWdldFByb2JsZW1SZXF1ZXN0b3IoKS5zZXRJc0FjdGl2ZShjb2xsZWN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJldHJhbnNsYXRlKCkgewotCQlpZiAoZlRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkJLy8gcmV0cmFuc2xhdGUgYW5kIGluaXRpYWxpemUgdGhpcyB0cmFuc2xhdGlvbgotCQkJZlRyYW5zbGF0b3IucmVzZXQoKTsKLQkJCWZUcmFuc2xhdG9yLnRyYW5zbGF0ZSgpOwotCQkJaW5pdGlhbGl6ZSgpOwotCi0JCQkvLyBBbHNvLCBpZiB3ZSBoYXZlIGEgY29tcGlsYXRpb24gdW5pdCwgcmVzZXQgdGhlIGNvbnRlbnRzCi0JCQlzeW5jaHJvbml6ZWQgKGZMb2NrKSB7Ci0JCQkJc2V0Q29udGVudHMoZkNvbXBpbGF0aW9uVW5pdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWNvbmNpbGVzIHRoZSBjb21waWxhdGlvbiB1bml0IGZvciB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlQ29tcGlsYXRpb25Vbml0KCkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCWlmIChjdSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXN5bmNocm9uaXplZChjdSkgewotCQkJCQljdS5tYWtlQ29uc2lzdGVudChnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWN1LnJlY29uY2lsZShJQ29tcGlsYXRpb25Vbml0Lk5PX0FTVCwgZmFsc2UsIGdldFdvcmtpbmdDb3B5T3duZXIoKSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgY29udGVudHMgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdG8gdGhlIHRyYW5zbGF0ZWQganNwIHRleHQuCi0JICogQHBhcmFtIHRoZSBJQ29tcGlsYXRpb25Vbml0IG9uIHdoaWNoIHRvIHNldCB0aGUgYnVmZmVyIGNvbnRlbnRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldENvbnRlbnRzKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJaWYgKGN1ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlzeW5jaHJvbml6ZWQgKGN1KSB7Ci0JCQlJQnVmZmVyIGJ1ZmZlcjsKLQkJCXRyeSB7Ci0JCQkJCi0JCQkJYnVmZmVyID0gY3UuZ2V0QnVmZmVyKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCWJ1ZmZlciA9IG51bGw7Ci0JCQl9Ci0JCi0JCQlpZiAoYnVmZmVyICE9IG51bGwpCi0JCQkJYnVmZmVyLnNldENvbnRlbnRzKGdldEphdmFUZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUphdmFFbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBKU1AgcmFuZ2UgaW4gdGhlIEpTUCBTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0ganNwU3RhcnQgc3RhcmluZyBvZmZzZXQgaW4gdGhlIEpTUCBkb2N1bWVudAotCSAqIEBwYXJhbSBqc3BFbmQgZW5kaW5nIG9mZnNldCBpbiB0aGUgSlNQIGRvY3VtZW50Ci0JICogQHJldHVybiBJSmF2YUVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpTUCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0RWxlbWVudHNGcm9tSnNwUmFuZ2UoaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kKSB7Ci0KLQkJaW50IGphdmFQb3NpdGlvblN0YXJ0ID0gZ2V0SmF2YU9mZnNldChqc3BTdGFydCk7Ci0JCWludCBqYXZhUG9zaXRpb25FbmQgPSBnZXRKYXZhT2Zmc2V0KGpzcEVuZCk7Ci0KLQkJSUphdmFFbGVtZW50W10gRU1UUFlfUkVTVUxUX1NFVCA9IG5ldyBJSmF2YUVsZW1lbnRbMF07Ci0JCUlKYXZhRWxlbWVudFtdIHJlc3VsdCA9IEVNVFBZX1JFU1VMVF9TRVQ7Ci0JCXRyeSB7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQlpZiAoY3UgIT0gbnVsbCkgewotCQkJCXN5bmNocm9uaXplZCAoY3UpIHsKLQkJCQkJaW50IGN1RG9jTGVuZ3RoID0gY3UuZ2V0QnVmZmVyKCkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWludCBqYXZhTGVuZ3RoID0gamF2YVBvc2l0aW9uRW5kIC0gamF2YVBvc2l0aW9uU3RhcnQ7Ci0JCQkJCWlmIChjdURvY0xlbmd0aCA+IDAgJiYgamF2YVBvc2l0aW9uU3RhcnQgPj0gMCAmJiBqYXZhTGVuZ3RoID49IDAgJiYgamF2YVBvc2l0aW9uRW5kIDwgY3VEb2NMZW5ndGgpIHsKLQkJCQkJCXJlc3VsdCA9IGN1LmNvZGVTZWxlY3QoamF2YVBvc2l0aW9uU3RhcnQsIGphdmFMZW5ndGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCA9PSAwKQotCQkJCXJldHVybiBFTVRQWV9SRVNVTFRfU0VUOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24geCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbih4KTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc25hbWUoKSB7Ci0JCXJldHVybiBmQ2xhc3NuYW1lOwotCX0KLQotCS8qKgotCSAqIE11c3QgZGlzY2FyZCBjb21waWxhdGlvbiB1bml0LCBvciBlbHNlIHRoZXkgY2FuIGxlYWsgaW4gdGhlIEphdmFNb2RlbE1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkKLQkJc3luY2hyb25pemVkIChmTG9jaykgewotCQkJaWYgKGZDb21waWxhdGlvblVuaXQgIT0gbnVsbCkgewotCQkJCUpvYiBkaXNjYXJkZXIgPSBuZXcgV29ya3NwYWNlSm9iKGZDbGFzc25hbWUpIHsKLQkJCQkJcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKC0pIEpTUFRyYW5zbGF0aW9uIFsiICsgdGhpcyArICJdIGRpc2NhcmRpbmcgQ29tcGlsYXRpb25Vbml0OiAiICsgZkNvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWZDb21waWxhdGlvblVuaXQuZGlzY2FyZFdvcmtpbmdDb3B5KCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyB3ZSdyZSBkb25lIHcvIGl0IGFueXdheQotCQkJCQkJfQotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWRpc2NhcmRlci5zY2hlZHVsZSgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2IxMTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogQW4gYWRhcHRlciBmb3IgZ2V0dGluZyBhIEpTUFRyYW5zbGF0aW9uIG9mIHRoZSBkb2N1bWVudC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFRyYW5zbGF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciwgSURvY3VtZW50TGlzdGVuZXIgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIElEb2N1bWVudCBmSnNwRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgSURvY3VtZW50IGZKYXZhRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZkpTUFRyYW5zbGF0aW9uID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZkRvY3VtZW50SXNEaXJ0eSA9IHRydWU7Ci0JcHJpdmF0ZSBJRE9NTW9kZWwgZlhNTE1vZGVsOwotCXByaXZhdGUgSlNQVHJhbnNsYXRvciBmVHJhbnNsYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBOdWxsUHJvZ3Jlc3NNb25pdG9yIGZUcmFuc2xhdGlvbk1vbml0b3IgPSBudWxsOwotCi0JLyoqCi0JICogPHA+Q29uc3RydWN0cyBhIHtAbGluayBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJ9IHRoYXQgd2lsbCBjcmVhdGUgYSBuZXcge0BsaW5rIEpTUFRyYW5zbGF0b3J9PHA+Ci0JICogCi0JICogQHBhcmFtIHhtbE1vZGVsIHtAbGluayBJRE9NTW9kZWx9IHRoaXMge0BsaW5rIEpTUFRyYW5zbGF0aW9uQWRhcHRlcn0gaXMgZm9yCi0JICovCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uQWRhcHRlcihJRE9NTW9kZWwgeG1sTW9kZWwpIHsKLQkJc2V0WE1MTW9kZWwoeG1sTW9kZWwpOwotCQlpbml0aWFsaXplSmF2YVBsdWdpbnMoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Q29uc3RydWN0cyBhIHtAbGluayBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJ9IHVzaW5nIGFuIGV4aXN0aW5nIHtAbGluayBKU1BUcmFuc2xhdG9yfTwvcD4KLQkgKiAKLQkgKiBAcGFyYW0geG1sTW9kZWwge0BsaW5rIElET01Nb2RlbH0gdGhpcyB7QGxpbmsgSlNQVHJhbnNsYXRpb25BZGFwdGVyfSBpcyBmb3IKLQkgKiBAcGFyYW0gdHJhbnNsYXRvciBleGlzdGluZyB7QGxpbmsgSlNQVHJhbnNsYXRvcn0gdGhpcyB7QGxpbmsgSlNQVHJhbnNsYXRpb25BZGFwdGVyfSB3aWxsIHVzZQotCSAqLwotCXB1YmxpYyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIoSURPTU1vZGVsIHhtbE1vZGVsLCBKU1BUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJdGhpcyh4bWxNb2RlbCk7Ci0JCXRoaXMuZlRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yOwotCQl0aGlzLmZKYXZhRG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQodHJhbnNsYXRvci5nZXRUcmFuc2xhdGlvbigpLnRvU3RyaW5nKCkpOwotCQl0aGlzLmZKU1BUcmFuc2xhdGlvbiA9IG5ldyBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbihnZXRYTUxNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBmSmF2YURvY3VtZW50LCBnZXRKYXZhUHJvamVjdCgpLCB0aGlzLmZUcmFuc2xhdG9yKTsKLQkJdGhpcy5mRG9jdW1lbnRJc0RpcnR5ID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgcmVxdWlyZWQgSmF2YSBQbHVnaW5zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUphdmFQbHVnaW5zKCkgewotCQlKYXZhQ29yZS5nZXRQbHVnaW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmVxdWFscyhJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JLyoqCi0JICogQXV0b21hdGljYWxseSBzZXQgdGhyb3VnaCB0aGUgc2V0WE1MTW9kZWwoWE1MTW9kZWwpCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqLwotCXByaXZhdGUgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChmSnNwRG9jdW1lbnQgIT0gbnVsbCkKLQkJCWZKc3BEb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCWRvYy5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQkJZkpzcERvY3VtZW50ID0gZG9jOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCS8vIG1hcmsgdHJhbnNsYXRpb24gZm9yIHJlYnVpbGRpbmcKLQkJZkRvY3VtZW50SXNEaXJ0eSA9IHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQotCQlpZiAoZkpzcERvY3VtZW50ICE9IG51bGwpCi0JCQlmSnNwRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQotCQlpZiAoZlRyYW5zbGF0aW9uTW9uaXRvciAhPSBudWxsKQotCQkJZlRyYW5zbGF0aW9uTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQotCQlpZiAoZkpTUFRyYW5zbGF0aW9uICE9IG51bGwpIHsKLQotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQVHJhbnNsYXRpb25BZGFwdGVyIHJlbGVhc2luZzoiICsgZkpTUFRyYW5zbGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlmSlNQVHJhbnNsYXRpb24ucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+UmV0dXJucyB0aGUgSlNQVHJhbnNsYXRpb24gZm9yIHRoaXMgYWRhcHRlci48L3A+Ci0JICogCi0JICogPHA+PGI+SU1QT1JUQU5UOiA8L2I+PGk+VGhpcyB3aWxsIGZvcmNlIHRyYW5zbGF0aW9uIG9mIHRoZQotCSAqIGRvY3VtZW50IGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGNhbGxlZC4gIFRvIGF2b2lkCi0JICogYWNjaWRlbnRhbCB0cmFuc2xhdGlvbiBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCBjYWxsCi0JICoge0BsaW5rICNoYXNUcmFuc2xhdGlvbigpfSB0byB2ZXJpZnkgYSB0cmFuc2xhdGlvbgotCSAqIGhhcyBhbHJlYWR5IGJlZW4gZm9yY2VkIGJ5IHRoaXMgYWRhcHRlci48L2k+PC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZ2V0SlNQVHJhbnNsYXRpb24oKSB7Ci0KLQkJaWYgKGZKU1BUcmFuc2xhdGlvbiA9PSBudWxsIHx8IGZEb2N1bWVudElzRGlydHkpIHsKLQkJCUpTUFRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG51bGw7Ci0JCQlpZiAoZ2V0WE1MTW9kZWwoKSAhPSBudWxsICYmIGdldFhNTE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbigwKSAhPSBudWxsKSB7Ci0JCQkJdHJhbnNsYXRvciA9IGdldFRyYW5zbGF0b3IoKElET01Ob2RlKSBnZXRYTUxNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oMCkpOwotCQkJCXRyYW5zbGF0b3IudHJhbnNsYXRlKCk7Ci0JCQkJU3RyaW5nQnVmZmVyIGphdmFDb250ZW50cyA9IHRyYW5zbGF0b3IuZ2V0VHJhbnNsYXRpb24oKTsKLQkJCQlmSmF2YURvY3VtZW50ID0gbmV3IERvY3VtZW50KGphdmFDb250ZW50cy50b1N0cmluZygpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGVtcHR5IGRvY3VtZW50IGNhc2UKLQkJCQl0cmFuc2xhdG9yID0gY3JlYXRlVHJhbnNsYXRvcigpOwotCQkJCVN0cmluZ0J1ZmZlciBlbXB0eUNvbnRlbnRzID0gdHJhbnNsYXRvci5nZXRFbXB0eVRyYW5zbGF0aW9uKCk7Ci0JCQkJZkphdmFEb2N1bWVudCA9IG5ldyBEb2N1bWVudChlbXB0eUNvbnRlbnRzLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJLy8gaXQncyBnb2luZyB0byBiZSByZWJ1aWx0LCBzbyB3ZSByZWxlYXNlIGl0IGhlcmUKLQkJCWlmIChmSlNQVHJhbnNsYXRpb24gIT0gbnVsbCkgewotCQkJCWlmIChERUJVRykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgcmV0cmFuc2xhdGluZzoiICsgZkpTUFRyYW5zbGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZKU1BUcmFuc2xhdGlvbi5yZXRyYW5zbGF0ZSgpOwotCQkJfQotCQkJZkpTUFRyYW5zbGF0aW9uID0gbmV3IEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uKGdldFhNTE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIGZKYXZhRG9jdW1lbnQsIGdldEphdmFQcm9qZWN0KCksIHRyYW5zbGF0b3IpOwotCQkJZkRvY3VtZW50SXNEaXJ0eSA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBmSlNQVHJhbnNsYXRpb247Ci0JfQotCQotCS8qKgotCSAqIDxwPktub3dpbmcgd2VhdGhlciB0aGUgdHJhbnNsYXRpb24gaGFzIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQKLQkgKiBmcm9tIHRoaXMgYWRhcHRlciBpcyBpbXBvcnRhbnQgaWYgeW91IGRvIG5vdCB3YW4ndCB0byBmb3JjZQotCSAqIHRoZSB0cmFuc2xhdGlvbiBvZiBhIGRvY3VtZW50IHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiB0cmFuc2xhdGVkPC9wPgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYge0BsaW5rICNnZXRKU1BUcmFuc2xhdGlvbigpfSBoYXMKLQkgKiBiZWVuIGNhbGxlZCBvbiB0aGlzIGFkYXB0ZXIgYWxyZWFkeSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1RyYW5zbGF0aW9uKCkgewotCQlyZXR1cm4gZkpTUFRyYW5zbGF0aW9uICE9IG51bGw7Ci0JfQotCi0JSlNQVHJhbnNsYXRvciBjcmVhdGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEpTUFRyYW5zbGF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKU1BUcmFuc2xhdG9yIGZvciB0aGlzIGFkYXB0ZXIuIElmIGl0J3MgbnVsbCwgYSBuZXcKLQkgKiB0cmFuc2xhdG9yIGlzIGNyZWF0ZWQgd2l0aCB0aGUgeG1sTm9kZS4gT3RoZXJ3aXNlIHRoZQotCSAqIHRyYW5zbGF0b3IucmVzZXQoeG1sTm9kZSkgaXMgY2FsbGVkIHRvIHJlc2V0IHRoZSBjdXJyZW50IGxvY2FsCi0JICogdHJhbnNsYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0geG1sTm9kZQotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IG5vZGUgb2YgdGhlIEpTUCBkb2N1bWVudCB0byBiZSB0cmFuc2xhdGVkCi0JICogQHJldHVybiB0aGUgSlNQVHJhbnNsYXRvciBmb3IgdGhpcyBhZGFwdGVyIChjcmVhdGVzIGlmIG51bGwpCi0JICovCi0JcHJpdmF0ZSBKU1BUcmFuc2xhdG9yIGdldFRyYW5zbGF0b3IoSURPTU5vZGUgeG1sTm9kZSkgewotCQlpZiAoZlRyYW5zbGF0b3IgPT0gbnVsbCkgewotCQkJZlRyYW5zbGF0aW9uTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQlmVHJhbnNsYXRvciA9IGNyZWF0ZVRyYW5zbGF0b3IoKTsKLQkJCWZUcmFuc2xhdG9yLnJlc2V0KHhtbE5vZGUsIGZUcmFuc2xhdGlvbk1vbml0b3IpOwotCQl9Ci0JCWVsc2UKLQkJCWZUcmFuc2xhdG9yLnJlc2V0KHhtbE5vZGUsIGZUcmFuc2xhdGlvbk1vbml0b3IpOwotCQlyZXR1cm4gZlRyYW5zbGF0b3I7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBYTUxNb2RlbCBmb3IgdGhpcyBhZGFwdGVyLiBNdXN0IGJlIGNhbGxlZC4KLQkgKiAKLQkgKiBAcGFyYW0geG1sTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRYTUxNb2RlbChJRE9NTW9kZWwgeG1sTW9kZWwpIHsKLQkJZlhNTE1vZGVsID0geG1sTW9kZWw7Ci0JCXNldERvY3VtZW50KGZYTUxNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgWE1MTW9kZWwgZm9yIHRoaXMgYWRhcHRlci4KLQkgKi8KLQlwcml2YXRlIElET01Nb2RlbCBnZXRYTUxNb2RlbCgpIHsKLQkJcmV0dXJuIGZYTUxNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIChvciBjcmVhdGVzIHZpYSBKYXZhQ29yZSkgYSBKYXZhUHJvamVjdCBiYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YKLQkgKiB0aGlzIGFkYXB0ZXIncyBYTUxNb2RlbC4gUmV0dXJucyBudWxsIGZvciBub24gSUZpbGUgYmFzZWQgbW9kZWxzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGphdmEgcHJvamVjdCB3aGVyZQotCSAqLwotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBnZXRYTUxNb2RlbCgpLmdldEJhc2VMb2NhdGlvbigpOwotCQkJLy8gMjAwNDExMjkgKHBhKSB0aGUgYmFzZSBsb2NhdGlvbiBjaGFuZ2VkIGZvciBYTUwgbW9kZWwKLQkJCS8vIGJlY2F1c2Ugb2YgRmlsZUJ1ZmZlcnMsIHNvIHRoaXMgY29kZSBoYWQgdG8gYmUgdXBkYXRlZAotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5Njg2Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkJaWYgKGZpbGVQYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJCXByb2plY3QgPSByb290LmdldFByb2plY3QoZmlsZVBhdGguc2VnbWVudCgwKSk7Ci0JCQl9Ci0vLwkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKG5ldyBQYXRoKGJhc2VMb2NhdGlvbikpOwotLy8JCQlmb3IgKGludCBpID0gMDsgcHJvamVjdCA9PSBudWxsICYmIGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotLy8JCQkJaWYgKGZpbGVzW2ldLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuUFJPSkVDVCkgewotLy8JCQkJCXByb2plY3QgPSBmaWxlc1tpXS5nZXRQcm9qZWN0KCk7Ci0vLwkJCQkJYnJlYWs7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZ2V0WE1MTW9kZWwoKSAhPSBudWxsKQotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIihKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHByb2JsZW0gZ2V0dGluZyBqYXZhIHByb2plY3QgZnJvbSB0aGUgWE1MTW9kZWwncyBiYXNlTG9jYXRpb24gPiAiICsgZ2V0WE1MTW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKSwgZXgpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgcHJvYmxlbSBnZXR0aW5nIGphdmEgcHJvamVjdCIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBqYXZhUHJvamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjYWM1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgSlNQVHJhbnNsYXRpb25BZGFwdGVycy4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKiB0aGUgYWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBmYWN0b3J5ICovCi0JcHJpdmF0ZSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgZkFkYXB0ZXIgPSBudWxsOwotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQm9vbGVhbi52YWx1ZU9mKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdHJhbnNsYXRpb24iKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQ7Ci0JCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKElKU1BUcmFuc2xhdGlvbi5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElET01Ob2RlICYmIGZBZGFwdGVyID09IG51bGwpIHsKLQkJCS8qIGF0dGVtcHQgdG8gbG9hZCBleHRlcm5hbGl6ZWQgdHJhbnNsYXRvciBhbmQgY3JlYXRlIGFkYXB0ZXIgZnJvbSBpdAotCQkJICogZWxzZSBjcmVhdGUgbmV3IGFkYXB0ZXIgKi8KLQkJCUlET01Nb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpIHRhcmdldCkuZ2V0TW9kZWwoKTsKLQkJCQotCQkJSlNQVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gSlNQVHJhbnNsYXRvclBlcnNpc3Rlci5nZXRQZXJzaXN0ZWRUcmFuc2xhdG9yKG1vZGVsKTsKLQkJCWlmKHRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkJCWZBZGFwdGVyID0gbmV3IEpTUFRyYW5zbGF0aW9uQWRhcHRlcihtb2RlbCwgdHJhbnNsYXRvcik7Ci0JCQl9IGVsc2UgewotCQkJCWZBZGFwdGVyPSBuZXcgSlNQVHJhbnNsYXRpb25BZGFwdGVyKG1vZGVsKTsKLQkJCX0KLQotCQkJaWYoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IFsiICsgdGhpcyArICJdIGNyZWF0ZWQgYWRhcHRlcjogIiArIGZBZGFwdGVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZBZGFwdGVyOwotCX0KLQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYoZkFkYXB0ZXIgIT0gbnVsbCkgewotCQkJaWYoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigtKSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IFsiICsgdGhpcyArICJdIHJlbGVhc2luZyBhZGFwdGVyOiAiICsgZkFkYXB0ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWZBZGFwdGVyLnJlbGVhc2UoKTsKLQkJfQotCQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25FeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1ZmVlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25FeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Ub29sRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuQ29kZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5VbmRvRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIEFkZHMgdGhlIG5vdGlvbiBvZiBJRG9jdW1lbnRzIChqc3AgRG9jdW1lbnQgYW5kIGphdmEgRG9jdW1lbnQpIFVzZWQgZm9yCi0gKiBUZXh0RWRpdCB0cmFuc2xhdGlvbgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZXh0ZW5kcyBKU1BUcmFuc2xhdGlvbiB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIGp1c3QgYSBjb252ZW5pZW5jZSBkYXRhIHN0cnVjdHVyZQotCS8vIHRvIGtlZXAgdHJhY2sgb2YgamF2YSBwb3NpdGlvbiBkZWx0YXMKLQlwcml2YXRlIGNsYXNzIFBvc2l0aW9uRGVsdGEgewotCi0JCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZCA9IGZhbHNlOwotCQlwdWJsaWMgaW50IHByZU9mZnNldCA9IDA7Ci0JCXB1YmxpYyBpbnQgcHJlTGVuZ3RoID0gMDsKLQkJcHVibGljIGludCBwb3N0T2Zmc2V0ID0gMDsKLQkJcHVibGljIGludCBwb3N0TGVuZ3RoID0gMDsKLQotCQlwdWJsaWMgUG9zaXRpb25EZWx0YShpbnQgcHJlT2Zmc2V0LCBpbnQgcHJlTGVuZ3RoKSB7Ci0JCQl0aGlzLnByZU9mZnNldCA9IHByZU9mZnNldDsKLQkJCXRoaXMucHJlTGVuZ3RoID0gcHJlTGVuZ3RoOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0UG9zdEVkaXREYXRhKGludCBwb3N0T2Zmc2V0LCBpbnQgcG9zdExlbmd0aCwgYm9vbGVhbiBpc0RlbGV0ZWQpIHsKLQkJCXRoaXMucG9zdE9mZnNldCA9IHBvc3RPZmZzZXQ7Ci0JCQl0aGlzLnBvc3RMZW5ndGggPSBwb3N0TGVuZ3RoOwotCQkJdGhpcy5pc0RlbGV0ZWQgPSBpc0RlbGV0ZWQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElEb2N1bWVudCBmSnNwRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgSURvY3VtZW50IGZKYXZhRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgQ29kZUZvcm1hdHRlciBmQ29kZUZvcm1hdHRlciA9IG51bGw7Ci0KLQlwdWJsaWMgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24oSURvY3VtZW50IGpzcERvY3VtZW50LCBJRG9jdW1lbnQgamF2YURvY3VtZW50LCBJSmF2YVByb2plY3QgamF2YVByb2osIEpTUFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQlzdXBlcihqYXZhUHJvaiwgdHJhbnNsYXRvcik7Ci0JCWZKc3BEb2N1bWVudCA9IGpzcERvY3VtZW50OwotCQlmSmF2YURvY3VtZW50ID0gamF2YURvY3VtZW50OwotCi0JCS8vIG1ha2Ugc3VyZSBwb3NpdGlvbnMgYXJlIGFkZGVkIHRvIEphdmEgYW5kIEpTUCBkb2N1bWVudHMKLQkJLy8gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRleHQgZWRpdHMKLQkJYWRkUG9zaXRpb25zVG9Eb2N1bWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50IGdldEpzcERvY3VtZW50KCkgewotCQlyZXR1cm4gZkpzcERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0SmF2YURvY3VtZW50KCkgewotCQlyZXR1cm4gZkphdmFEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFUZXh0KCkgewotCQlyZXR1cm4gZ2V0SmF2YURvY3VtZW50KCkgIT0gbnVsbCA/IGdldEphdmFEb2N1bWVudCgpLmdldCgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29ycmVzcG9uZGluZyBUZXh0RWRpdCBmb3IgdGhlIEpTUCBmaWxlIGdpdmVuIGEgVGV4dEVkaXQgZm9yCi0JICogYSBKYXZhIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGphdmFFZGl0Ci0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBKU1AgZWRpdHMgKG5vdCBhcHBsaWVkIHRvIHRoZSBkb2N1bWVudCB5ZXQpCi0JICovCi0JcHVibGljIFRleHRFZGl0IGdldEpzcEVkaXQoVGV4dEVkaXQgamF2YUVkaXQpIHsKLQotCQlpZiAoamF2YUVkaXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUxpc3QganNwRWRpdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaW50IG9mZnNldCA9IGphdmFFZGl0LmdldE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gamF2YUVkaXQuZ2V0TGVuZ3RoKCk7Ci0KLQkJaWYgKGphdmFFZGl0IGluc3RhbmNlb2YgTXVsdGlUZXh0RWRpdCAmJiBqYXZhRWRpdC5nZXRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKLQotCQkJSVJlZ2lvbiByID0gVGV4dEVkaXQuZ2V0Q292ZXJhZ2UoZ2V0QWxsRWRpdHMoamF2YUVkaXQpKTsKLQkJCW9mZnNldCA9IHIuZ2V0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSByLmdldExlbmd0aCgpOwotCQl9Ci0KLQkJLy8gZ2V0IGphdmEgcmFuZ2VzIHRoYXQgd2lsbCBiZSBhZmZlY3RlZCBieSB0aGUgZWRpdAotCQlQb3NpdGlvbltdIGphdmFQb3NpdGlvbnMgPSBnZXRKYXZhUmFuZ2VzKG9mZnNldCwgbGVuZ3RoKTsKLQotCQkvLyByZWNvcmQgcG9zaXRpb24gZGF0YSBiZWZvcmUgdGhlIGNoYW5nZQotCQlQb3NpdGlvbltdIGpzcFBvc2l0aW9ucyA9IG5ldyBQb3NpdGlvbltqYXZhUG9zaXRpb25zLmxlbmd0aF07Ci0JCVBvc2l0aW9uRGVsdGFbXSBkZWx0YXMgPSBuZXcgUG9zaXRpb25EZWx0YVtqYXZhUG9zaXRpb25zLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YVBvc2l0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJZGVsdGFzW2ldID0gbmV3IFBvc2l0aW9uRGVsdGEoamF2YVBvc2l0aW9uc1tpXS5vZmZzZXQsIGphdmFQb3NpdGlvbnNbaV0ubGVuZ3RoKTsKLQkJCS8vIGlzSW5kaXJlY3QgbWVhbnMgdGhlIHBvc2l0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3QgYXMgZXhhY3QKLQkJCS8vIHRleHQKLQkJCS8vIG1hcHBpbmcgZnJvbSBqYXZhIDwtPiBqc3AgKGVnLiBhbiBpbXBvcnQgc3RhdGVtZW50KQotCQkJaWYgKCFpc0luZGlyZWN0KGphdmFQb3NpdGlvbnNbaV0ub2Zmc2V0KSkKLQkJCQlqc3BQb3NpdGlvbnNbaV0gPSAoUG9zaXRpb24pIGdldEphdmEySnNwTWFwKCkuZ2V0KGphdmFQb3NpdGlvbnNbaV0pOwotCQl9Ci0KLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImRlbHRhczoiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGphdmFUZXh0ID0gZ2V0SmF2YVRleHQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicG9zWyIgKyBkZWx0YXNbaV0ucHJlT2Zmc2V0ICsgIjoiICsgZGVsdGFzW2ldLnByZUxlbmd0aCArICJdIiArIGphdmFUZXh0LnN1YnN0cmluZyhkZWx0YXNbaV0ucHJlT2Zmc2V0LCBkZWx0YXNbaV0ucHJlT2Zmc2V0ICsgZGVsdGFzW2ldLnByZUxlbmd0aCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJVW5kb0VkaXQgdW5kbyA9IG51bGw7Ci0JCS8vIGFwcGx5IHRoZSBlZGl0IHRvIHRoZSBqYXZhIGRvY3VtZW50Ci0JCXRyeSB7Ci0JCQl1bmRvID0gamF2YUVkaXQuYXBwbHkoZ2V0SmF2YURvY3VtZW50KCkpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJLy8gbm93IGF0IHRoaXMgcG9pbnQgSmF2YSBwb3NpdGlvbnMgYXJlIHVucmVsaWFibGUgc2luY2UgdGhleSB3ZXJlCi0JCS8vIHVwZGF0ZWQgYWZ0ZXIgYXBwbHlpbmcgamF2YSBlZGl0LgotCi0JCVN0cmluZyBuZXdKYXZhVGV4dCA9IGdldEphdmFEb2N1bWVudCgpLmdldCgpOwotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImphdmEgcG9zdCBmb3JtYXQgdGV4dDpcbiIgKyBuZXdKYXZhVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyByZWNvcmQgcG9zdCBlZGl0IGRhdGEKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXZhUG9zaXRpb25zLmxlbmd0aDsgaSsrKQotCQkJZGVsdGFzW2ldLnNldFBvc3RFZGl0RGF0YShqYXZhUG9zaXRpb25zW2ldLm9mZnNldCwgamF2YVBvc2l0aW9uc1tpXS5sZW5ndGgsIGphdmFQb3NpdGlvbnNbaV0uaXNEZWxldGVkKTsKLQotCQkvLyBjcmVhdGUgYXBwcm9wcmlhdGUgdGV4dCBlZGl0cyBmb3IgZGVsdGFzCi0JCVBvc2l0aW9uIGpzcFBvcyA9IG51bGw7Ci0JCVN0cmluZyByZXBsYWNlVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQlqc3BQb3MgPSBqc3BQb3NpdGlvbnNbaV07Ci0JCQkvLyBjYW4gYmUgbnVsbCBpZiBpdCdzIGFuIGluZGlyZWN0IG1hcHBpbmcgcG9zaXRpb24KLQkJCS8vIG9yIGlmIHNvbWV0aGluZyB3YXMgYWRkZWQgaW50byBqYXZhIHRoYXQgd2FzIG5vdCBvcmlnaW5hbGx5IGluCi0JCQkvLyBKU1AgKGxpa2UgYSBuZXcgaW1wb3J0Li4uKQotCi0JCQlpZiAoanNwUG9zICE9IG51bGwpIHsKLQkJCQlpZiAoZGVsdGFzW2ldLmlzRGVsZXRlZCkgewotCQkJCQlqc3BFZGl0cy5hZGQobmV3IERlbGV0ZUVkaXQoanNwUG9zLm9mZnNldCwganNwUG9zLmxlbmd0aCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVwbGFjZVRleHQgPSBuZXdKYXZhVGV4dC5zdWJzdHJpbmcoZGVsdGFzW2ldLnBvc3RPZmZzZXQsIGRlbHRhc1tpXS5wb3N0T2Zmc2V0ICsgZGVsdGFzW2ldLnBvc3RMZW5ndGgpOwotCi0JCQkJCS8vIGdldCByaWQgb2YgcHJlIGFuZCBwb3N0IHdoaXRlIHNwYWNlIG9yIGZpbmUgdHVuZWQKLQkJCQkJLy8gYWRqdXN0bWVudCBsYXRlci4KLQkJCQkJLy8gZml4IHRleHQgaGVyZS4uLgotCQkJCQlyZXBsYWNlVGV4dCA9IGZpeEpzcFJlcGxhY2VUZXh0KHJlcGxhY2VUZXh0LCBqc3BQb3MpOwotCQkJCQlpZiAoIShyZXBsYWNlVGV4dC5sZW5ndGgoKSA9PSAwICYmIGpzcFBvcy5sZW5ndGggPT0gMCkpLy9VbndhbnRlZCBUZXh0RWRpdCBjYW4gbGVhZCB0byBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLlNlZTogQnVnIDMyMTk3NyAKLSAJCQkJCSAgIGpzcEVkaXRzLmFkZChuZXcgUmVwbGFjZUVkaXQoanNwUG9zLm9mZnNldCwganNwUG9zLmxlbmd0aCwgcmVwbGFjZVRleHQpKTsKLQkJCQl9Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1Z1JlcGxhY2UoZGVsdGFzLCBqc3BQb3MsIHJlcGxhY2VUZXh0LCBpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHRoZSBuZXcgSmF2YSB0ZXh0IGhhcyBubyBjb3JyZXNwb25kaW5nIEpTUCBwb3NpdGlvbgotCQkJCS8vIHBvc3NpYmxlIG5ldyBpbXBvcnQ/Ci0JCQkJaWYgKGlzSW1wb3J0KGphdmFQb3NpdGlvbnNbaV0uZ2V0T2Zmc2V0KCkpICYmIHJlcGxhY2VUZXh0Lmxhc3RJbmRleE9mKCJpbXBvcnQgIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXBsYWNlVGV4dCA9IG5ld0phdmFUZXh0LnN1YnN0cmluZyhkZWx0YXNbaV0ucG9zdE9mZnNldCwgZGVsdGFzW2ldLnBvc3RPZmZzZXQgKyBkZWx0YXNbaV0ucG9zdExlbmd0aCk7Ci0JCQkJCVN0cmluZyBpbXBvcnRUZXh0ID0gcmVwbGFjZVRleHQuc3Vic3RyaW5nKHJlcGxhY2VUZXh0Lmxhc3RJbmRleE9mKCJpbXBvcnQgIiksIHJlcGxhY2VUZXh0LmluZGV4T2YoIjsiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkvLyBldmVudXRhbGx5IG5lZWQgdG8gY2hlY2sgaWYgaXQncyBYTUwtSlNQCi0JCQkJCWltcG9ydFRleHQgPSAiPCVAcGFnZSBpbXBvcnQ9XCIiICsgaW1wb3J0VGV4dCArICJcIiAlPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWpzcEVkaXRzLmFkZChuZXcgSW5zZXJ0RWRpdCgwLCBpbXBvcnRUZXh0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVRleHRFZGl0IGFsbEpzcEVkaXRzID0gY3JlYXRlTXVsdGlUZXh0RWRpdCgoVGV4dEVkaXRbXSkganNwRWRpdHMudG9BcnJheShuZXcgVGV4dEVkaXRbanNwRWRpdHMuc2l6ZSgpXSkpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU2MzIKLQkJLy8gdW5kbyB0aGUgamF2YSBlZGl0Ci0JCS8vIChzbyB0aGUgdW5kZXJseWluZyBKYXZhIGRvY3VtZW50IHN0aWxsIHJlcHJlc2VudHMgd2hhdCdzIGluIHRoZQotCQkvLyBlZGl0b3IpCi0JCWlmICh1bmRvICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdW5kby5hcHBseShnZXRKYXZhRG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhbGxKc3BFZGl0czsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmaXhKc3BSZXBsYWNlVGV4dChTdHJpbmcgcmVwbGFjZVRleHQsIFBvc2l0aW9uIGpzcFBvcykgewotCi0JCS8vIHJlc3VsdCBpcyB0aGUgdGV4dCBpbmJldHdlZW4gdGhlIGRlbGltaXRlcnMKLQkJLy8gZWcuCi0JCS8vIAotCQkvLyA8JSByZXN1bHQKLQkJLy8gJT4KLQkJU3RyaW5nIHJlc3VsdCA9IHJlcGxhY2VUZXh0LnRyaW0oKTsKLQkJU3RyaW5nIHByZURlbGltaXRlcldoaXRlc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCUlEb2N1bWVudCBqc3BEb2MgPSBnZXRKc3BEb2N1bWVudCgpOwotCQlpZiAoanNwRG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGpzcERvYzsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSByZWdpb25zID0gc0RvYy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKDAsIGpzcFBvcy5vZmZzZXQpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9uc1tyZWdpb25zLmxlbmd0aCAtIDFdOwotCi0JCQkvLyBvbmx5IHNwZWNpZmljYWxseSBtb2RpZnkgc2NyaXB0bGV0cwotCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCAmJiBsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHsKLQkJCQlmb3IgKGludCBpID0gcmVnaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnNbaV07Ci0KLQkJCQkJLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGNoZWNrIHdoaXRlc3BhY2U/Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQgJiYgcmVnaW9uLmdldEZ1bGxUZXh0KCkudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlID0gcmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCQkJCQlwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlID0gcHJlRGVsaW1pdGVyV2hpdGVzcGFjZS5yZXBsYWNlQWxsKCJcciIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlID0gcHJlRGVsaW1pdGVyV2hpdGVzcGFjZS5yZXBsYWNlQWxsKCJcbiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCS8vIG5lZWQgdG8gZGV0ZXJtaW5lIGluZGVudCBmb3IgdGhhdCBmaXJzdCBsaW5lLi4uCi0JCQkJCQlTdHJpbmcgaW5pdGlhbEluZGVudCA9IGdldEluaXRpYWxJbmRlbnQocmVzdWx0KTsKLQotCQkJCQkJLy8gZml4IHRoZSBmaXJzdCBsaW5lIG9mIGphdmEgY29kZQotCQkJCQkJcmVzdWx0ID0gVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihzRG9jKSArIGluaXRpYWxJbmRlbnQgKyByZXN1bHQ7Ci0KLQkJCQkJCXJlc3VsdCA9IGFkanVzdEluZGVudChyZXN1bHQsIHByZURlbGltaXRlcldoaXRlc3BhY2UsIFRleHRVdGlsaXRpZXMuZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoc0RvYykpOwotCi0JCQkJCQkvLyBhZGQgd2hpdGVzcGFjZSBiZWZvcmUgbGFzdCBkZWxpbWl0ZXIgdG8gbWF0Y2gKLQkJCQkJCS8vIGl0IHcvIHRoZSBvcGVuaW5nIGRlbGltaXRlcgotCQkJCQkJcmVzdWx0ID0gcmVzdWx0ICsgVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihzRG9jKSArIHByZURlbGltaXRlcldoaXRlc3BhY2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGxhc3RSZWdpb24gIT0gbnVsbCAmJiBjaGVja0ZvckVMUmVnaW9uKGxhc3RSZWdpb24pKSB7Ly9DaGVjayBmb3IgRUwgcmVnaW9uLCB3ZSBkb24ndCB3YW50IHRvIHJlcGxhY2UgRUwgcmVnaW9uIHdpdGggY29ycmVzcG9uZGluZyBqYXZhIHRleHQsbGVhdmUgaXQgYXMgaXQgaXMuCi0JCQkJcmVzdWx0ID0gZ2V0SnNwVGV4dCgpLnN1YnN0cmluZyhqc3BQb3Mub2Zmc2V0LCBqc3BQb3Mub2Zmc2V0ICsganNwUG9zLmxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tGb3JFTFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRhaW5lcikgewotCQlJdGVyYXRvciByZWdpb25zID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCXJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIHBhcmVudFJlZ2lvbiA9ICgoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByZWdpb24pOwotCQkJCUl0ZXJhdG9yIGNoaWxkUmVnaW9ucyA9IHBhcmVudFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoY2hpbGRSZWdpb25zLmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBjaGlsZFJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgY2hpbGRSZWdpb25zLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfT1BFTikKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGFkanVzdEluZGVudChTdHJpbmcgdGV4dEJlZm9yZSwgU3RyaW5nIGluZGVudCwgU3RyaW5nIGRlbGltKSB7Ci0KLQkJLy8gZmlyc3QgcmVwbGFjZSBtdWx0aXBsZSBpbmRlbnQgd2l0aCBzaW5nbGUgaW5kZW50Ci0JCS8vIHRoZSB0cmlwbGUgaW5kZW50IG9jY3VycyBiZWNhdXNlIHRoZSBzY3JpcHRsZXQgY29kZQotCQkvLyBhY3R1YWxseSBvY2N1cnMgdW5kZXI6Ci0JCS8vIAotCQkvLyBjbGFzcwotCQkvLyBtZXRob2QKLQkJLy8gY29kZQotCQkvLyAKLQkJLy8gaW4gdGhlIHRyYW5zbGF0ZWQgamF2YSBkb2N1bWVudAotCQkvLyBCVUcxODg2MzYgLSBqdXN0IGdldCBpbmRlbnQgaW5mbyBmcm9tIGNvZGUgZm9ybWF0dGVyCi0JCVN0cmluZyBsZXZlbDEgPSBnZXRDb2RlRm9ybWF0dGVyKCkuY3JlYXRlSW5kZW50YXRpb25TdHJpbmcoMSk7Ci0JCVN0cmluZyBsZXZlbDMgPSBnZXRDb2RlRm9ybWF0dGVyKCkuY3JlYXRlSW5kZW50YXRpb25TdHJpbmcoMyk7Ci0JCVN0cmluZyB0aGVPbGQgPSAiXG4iICsgbGV2ZWwzOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0aGVOZXcgPSAiXG4iICsgbGV2ZWwxOyAvLyROT04tTkxTLTEkCi0JCXRleHRCZWZvcmUgPSB0ZXh0QmVmb3JlLnJlcGxhY2VBbGwodGhlT2xkLCB0aGVOZXcpOwotCi0JCS8vIGdldCBpbmRlbnQgYWZ0ZXIgMm5kIGxpbmUgYnJlYWsKLQkJU3RyaW5nQnVmZmVyIHRleHRBZnRlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy8gd2lsbCB0aGlzIHdvcmsgb24gbWFjPwotCQl0ZXh0QmVmb3JlID0gdGV4dEJlZm9yZS5yZXBsYWNlQWxsKCJcciIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGV4dEJlZm9yZSwgIlxuIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRvayA9IHN0Lm5leHRUb2tlbigpOwotCQkJaWYgKHRvay5lcXVhbHMoIlxuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXRleHRBZnRlci5hcHBlbmQoZGVsaW0pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gcHJlcGVuZCBlYWNoIGxpbmUgdy8gc3BlY2lmaWVkIGluZGVudAotCQkJCXRleHRBZnRlci5hcHBlbmQoaW5kZW50KTsKLQkJCQl0ZXh0QWZ0ZXIuYXBwZW5kKHRvayk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHRBZnRlci50b1N0cmluZygpOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5pdGlhbEluZGVudChTdHJpbmcgcmVzdWx0KSB7Ci0JCS8vIEJVRzE4ODYzNiAtIGp1c3QgZ2V0IGluaXRpYWwgaW5kZW50IGZyb20gY29kZSBmb3JtYXR0ZXIKLQkJU3RyaW5nIGluZGVudCA9IGdldENvZGVGb3JtYXR0ZXIoKS5jcmVhdGVJbmRlbnRhdGlvblN0cmluZygxKTsKLQkJLy8gLy8gZ2V0IGluZGVudCBhZnRlciAybmQgbGluZSBicmVhawotCQkvLyBTdHJpbmcgaW5kZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihyZXN1bHQsICJcclxuIiwgZmFsc2UpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIGlmIChzdC5jb3VudFRva2VucygpID4gMSkgewotCQkvLyBTdHJpbmcgdG9rID0gc3QubmV4dFRva2VuKCk7Ci0JCS8vIHRvayA9IHN0Lm5leHRUb2tlbigpOwotCQkvLyBpbnQgaW5kZXggPSAwOwotCQkvLyBpZiAodG9rICE9IG51bGwpIHsKLQkJLy8gd2hpbGUgKHRvay5jaGFyQXQoaW5kZXgpID09ICcgJyB8fCB0b2suY2hhckF0KGluZGV4KSA9PSAnXHQnKSB7Ci0JCS8vIGluZGVudCArPSB0b2suY2hhckF0KGluZGV4KTsKLQkJLy8gaW5kZXgrKzsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJcmV0dXJuIGluZGVudDsKLQl9Ci0KLQlwcml2YXRlIENvZGVGb3JtYXR0ZXIgZ2V0Q29kZUZvcm1hdHRlcigpIHsKLQkJaWYgKGZDb2RlRm9ybWF0dGVyID09IG51bGwpCi0JCQlmQ29kZUZvcm1hdHRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZUNvZGVGb3JtYXR0ZXIobnVsbCk7Ci0JCXJldHVybiBmQ29kZUZvcm1hdHRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIENvbWJpbmVzIGFuIGFycmF5IG9mIGVkaXRzIGludG8gb25lIE11bHRpVGV4dEVkaXQgKHdpdGggdGhlIGFwcHJvcHJpYXRlCi0JICogY292ZXJhZ2UgcmVnaW9uKQotCSAqIAotCSAqIEBwYXJhbSBlZGl0cwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRleHRFZGl0IGNyZWF0ZU11bHRpVGV4dEVkaXQoVGV4dEVkaXRbXSBlZGl0cykgewotCi0JCWlmIChlZGl0cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCi0JCS8qIHNob3VsZCBub3Qgc3BlY2lmeSBhIGxpbWl0ZWQgcmVnaW9uIGJlY2F1c2Ugb3RoZXIgZWRpdHMgb3V0c2lkZQotCQkgKiB0aGVzZSBvcmlnaW5hbCBlZGl0cyBtaWdodCBiZSBhZGRlZCBsYXRlci4KLQkJICovCi0JCU11bHRpVGV4dEVkaXQgbXVsdGlFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0cy5sZW5ndGg7IGkrKykgewotCQkJYWRkVG9NdWx0aUVkaXQoZWRpdHNbaV0sIG11bHRpRWRpdCk7Ci0JCX0KLQkJcmV0dXJuIG11bHRpRWRpdDsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBhZGRUb011bHRpRWRpdChUZXh0RWRpdCBlZGl0LCBNdWx0aVRleHRFZGl0IG11bHRpRWRpdCkgewotCi0JCS8vIGNoZWNrIGZvciBvdmVybGFwIGhlcmUKLQkJLy8gZGlzY2FyZCBvdmVybGFwcGluZyBlZGl0cy4uCi0JCS8vIHBvc3NpYmxlIGV4cG9uZW50aWFsIHBlcmZvcm1hbmNlIGhpdC4uLiBuZWVkIGEgYmV0dGVyIHdheS4uLgotCQlUZXh0RWRpdFtdIGNoaWxkcmVuID0gbXVsdGlFZGl0LmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjaGlsZHJlbltpXS5jb3ZlcnMoZWRpdCkpCi0JCQkJLy8gZG9uJ3QgYWRkCi0JCQkJcmV0dXJuOwotCQl9Ci0JCW11bHRpRWRpdC5hZGRDaGlsZChlZGl0KTsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSB0cmFuc2xhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQb3NpdGlvbnNUb0RvY3VtZW50cygpIHsKLQotCQkvLyBjYW4gYmUgbnVsbCBpZiBpdCdzIGEgTnVsbEpTUFRyYW5zbGF0aW9uCi0JCWlmIChnZXRKYXZhRG9jdW1lbnQoKSAhPSBudWxsICYmIGdldEpzcERvY3VtZW50KCkgIT0gbnVsbCkgewotCi0JCQlIYXNoTWFwIGphdmEyanNwID0gZ2V0SmF2YTJKc3BNYXAoKTsKLQkJCUl0ZXJhdG9yIGl0ID0gamF2YTJqc3Aua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCVBvc2l0aW9uIGphdmFQb3MgPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWphdmFQb3MgPSAoUG9zaXRpb24pIGl0Lm5leHQoKTsKLQkJCQl0cnkgewotCi0JCQkJCWZKYXZhRG9jdW1lbnQuYWRkUG9zaXRpb24oamF2YVBvcyk7Ci0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInR5cmluZyB0byBhZGQgSmF2YSBQb3NpdGlvbjpbIiArIGphdmFQb3Mub2Zmc2V0ICsgIjoiICsgamF2YVBvcy5sZW5ndGggKyAiXSB0byAiICsgZ2V0SmF2YVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCQkJCQkKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic3Vic3RyaW5nIDpbIiArCi0JCQkJCQkvLyBmSmF2YURvY3VtZW50LmdldCgpLnN1YnN0cmluZyhqYXZhUG9zLm9mZnNldCkgKwotCQkJCQkJLy8gIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJdHJ5IHsKLQotCQkJCQlmSnNwRG9jdW1lbnQuYWRkUG9zaXRpb24oKFBvc2l0aW9uKSBqYXZhMmpzcC5nZXQoamF2YVBvcykpOwotCi0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0eXJpbmcgdG8gYWRkIEpTUCBQb3NpdGlvbjpbIiArICgoUG9zaXRpb24pIGphdmEyanNwLmdldChqYXZhUG9zKSkub2Zmc2V0ICsgIjoiICsgKChQb3NpdGlvbikgamF2YTJqc3AuZ2V0KGphdmFQb3MpKS5sZW5ndGggKyAiXSB0byAiICsgZ2V0SmF2YVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVjdXJzaXZlbHkgZ2V0cyBhbGwgY2hpbGQgZWRpdHMKLQkgKiAKLQkgKiBAcGFyYW0gamF2YUVkaXQKLQkgKiBAcmV0dXJuIGFsbCBjaGlsZCBlZGl0cwotCSAqLwotCXByaXZhdGUgVGV4dEVkaXRbXSBnZXRBbGxFZGl0cyhUZXh0RWRpdCBqYXZhRWRpdCkgewotCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoamF2YUVkaXQgaW5zdGFuY2VvZiBNdWx0aVRleHRFZGl0KSB7Ci0JCQlUZXh0RWRpdFtdIGNoaWxkcmVuID0gamF2YUVkaXQuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGdldEFsbEVkaXRzKGNoaWxkcmVuW2ldKSkpOwotCQl9Ci0JCWVsc2UKLQkJCXJlc3VsdC5hZGQoamF2YUVkaXQpOwotCQlyZXR1cm4gKFRleHRFZGl0W10pIHJlc3VsdC50b0FycmF5KG5ldyBUZXh0RWRpdFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlbHRhcwotCSAqIEBwYXJhbSBqc3BQb3MKLQkgKiBAcGFyYW0gcmVwbGFjZVRleHQKLQkgKiBAcGFyYW0ganNwVGV4dAotCSAqIEBwYXJhbSBpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlYnVnUmVwbGFjZShQb3NpdGlvbkRlbHRhW10gZGVsdGFzLCBQb3NpdGlvbiBqc3BQb3MsIFN0cmluZyByZXBsYWNlVGV4dCwgaW50IGkpIHsKLQkJU3RyaW5nIGpzcENodW5rOwotCQlqc3BDaHVuayA9IGdldEpzcERvY3VtZW50KCkuZ2V0KCkuc3Vic3RyaW5nKGpzcFBvcy5vZmZzZXQsIGpzcFBvcy5vZmZzZXQgKyBqc3BQb3MubGVuZ3RoKTsKLQkJaWYgKCFkZWx0YXNbaV0uaXNEZWxldGVkKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlcGxhY2luZzoiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJqc3A6WyIgKyBqc3BDaHVuayArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ3LyA6WyIgKyByZXBsYWNlVGV4dCArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNzJjMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5Db3B5U291cmNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkNvcHlUYXJnZXRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5Nb3ZlU291cmNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1vdmVUYXJnZXRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgSlNQVHJhbnNsYXRpb25VdGlsIHsKLQlwcm90ZWN0ZWQgSURvY3VtZW50IGZEb2N1bWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uIGZUcmFuc2xhdGlvbiA9IG51bGw7Ci0KLQlwdWJsaWMgSlNQVHJhbnNsYXRpb25VdGlsKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgVGV4dEVkaXQgdHJhbnNsYXRlVGV4dEVkaXQoVGV4dEVkaXQgdGV4dEVkaXQpIHsKLQkJVGV4dEVkaXQgdHJhbnNsYXRlZFRleHRFZGl0ID0gbnVsbDsKLQotCQlpbnQgamF2YU9mZnNldCA9IHRleHRFZGl0LmdldE9mZnNldCgpOwotCQlpbnQganNwT2Zmc2V0ID0gZ2V0VHJhbnNsYXRpb24oKS5nZXRKc3BPZmZzZXQodGV4dEVkaXQuZ2V0T2Zmc2V0KCkpOwotCQlpbnQgbGVuZ3RoID0gdGV4dEVkaXQuZ2V0TGVuZ3RoKCk7Ci0KLQkJaWYgKHRleHRFZGl0IGluc3RhbmNlb2YgTXVsdGlUZXh0RWRpdCkgewotCQkJdHJhbnNsYXRlZFRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCVRleHRFZGl0W10gY2hpbGRyZW4gPSAoKE11bHRpVGV4dEVkaXQpIHRleHRFZGl0KS5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCVRleHRFZGl0IHRyYW5zbGF0ZWRDaGlsZFRleHRFZGl0ID0gdHJhbnNsYXRlVGV4dEVkaXQoY2hpbGRyZW5baV0pOwotCQkJCWlmICh0cmFuc2xhdGVkQ2hpbGRUZXh0RWRpdCAhPSBudWxsKQotCQkJCQkoKE11bHRpVGV4dEVkaXQpIHRyYW5zbGF0ZWRUZXh0RWRpdCkuYWRkQ2hpbGQodHJhbnNsYXRlZENoaWxkVGV4dEVkaXQpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRleHRFZGl0IGluc3RhbmNlb2YgUmVwbGFjZUVkaXQpIHsKLQkJCWlmIChqc3BPZmZzZXQgPT0gLTEpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCWlmICghZ2V0VHJhbnNsYXRpb24oKS5qYXZhU3BhbnNNdWx0aXBsZUpzcFBhcnRpdGlvbnMoamF2YU9mZnNldCwgbGVuZ3RoKSkKLQkJCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgUmVwbGFjZUVkaXQoanNwT2Zmc2V0LCBsZW5ndGgsICgoUmVwbGFjZUVkaXQpIHRleHRFZGl0KS5nZXRUZXh0KCkpOwotCQl9Ci0JCWVsc2UgaWYgKHRleHRFZGl0IGluc3RhbmNlb2YgSW5zZXJ0RWRpdCkgewotCQkJdHJhbnNsYXRlZFRleHRFZGl0ID0gbmV3IEluc2VydEVkaXQoanNwT2Zmc2V0LCAoKEluc2VydEVkaXQpIHRleHRFZGl0KS5nZXRUZXh0KCkpOwotCQl9Ci0JCWVsc2UgaWYgKHRleHRFZGl0IGluc3RhbmNlb2YgRGVsZXRlRWRpdCkgewotCQkJdHJhbnNsYXRlZFRleHRFZGl0ID0gbmV3IERlbGV0ZUVkaXQoanNwT2Zmc2V0LCBsZW5ndGgpOwotCQkJVGV4dEVkaXRbXSBjaGlsZHJlbiA9ICgoRGVsZXRlRWRpdCkgdGV4dEVkaXQpLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGV4dEVkaXQgdHJhbnNsYXRlZENoaWxkVGV4dEVkaXQgPSB0cmFuc2xhdGVUZXh0RWRpdChjaGlsZHJlbltpXSk7Ci0JCQkJaWYgKHRyYW5zbGF0ZWRDaGlsZFRleHRFZGl0ICE9IG51bGwpCi0JCQkJCSgoRGVsZXRlRWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KS5hZGRDaGlsZCh0cmFuc2xhdGVkQ2hpbGRUZXh0RWRpdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBDb3B5U291cmNlRWRpdCkgewotCQkJdHJhbnNsYXRlZFRleHRFZGl0ID0gbmV3IENvcHlTb3VyY2VFZGl0KGpzcE9mZnNldCwgbGVuZ3RoKTsKLQkJCSgoQ29weVNvdXJjZUVkaXQpIHRyYW5zbGF0ZWRUZXh0RWRpdCkuc2V0VGFyZ2V0RWRpdCgoKENvcHlTb3VyY2VFZGl0KSB0ZXh0RWRpdCkuZ2V0VGFyZ2V0RWRpdCgpKTsKLQkJCSgoQ29weVNvdXJjZUVkaXQpIHRyYW5zbGF0ZWRUZXh0RWRpdCkuc2V0U291cmNlTW9kaWZpZXIoKChDb3B5U291cmNlRWRpdCkgdGV4dEVkaXQpLmdldFNvdXJjZU1vZGlmaWVyKCkpOwotCQl9Ci0JCWVsc2UgaWYgKHRleHRFZGl0IGluc3RhbmNlb2YgQ29weVRhcmdldEVkaXQpIHsKLQkJCXRyYW5zbGF0ZWRUZXh0RWRpdCA9IG5ldyBDb3B5VGFyZ2V0RWRpdChqc3BPZmZzZXQpOwotCQkJKChDb3B5VGFyZ2V0RWRpdCkgdGV4dEVkaXQpLmdldFNvdXJjZUVkaXQoKS5zZXRUYXJnZXRFZGl0KChDb3B5VGFyZ2V0RWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KTsKLQkJfQotCQllbHNlIGlmICh0ZXh0RWRpdCBpbnN0YW5jZW9mIE1vdmVTb3VyY2VFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgTW92ZVNvdXJjZUVkaXQoanNwT2Zmc2V0LCBsZW5ndGgpOwotCQkJKChNb3ZlU291cmNlRWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KS5zZXRUYXJnZXRFZGl0KCgoTW92ZVNvdXJjZUVkaXQpIHRleHRFZGl0KS5nZXRUYXJnZXRFZGl0KCkpOwotCQl9Ci0JCWVsc2UgaWYgKHRleHRFZGl0IGluc3RhbmNlb2YgTW92ZVRhcmdldEVkaXQpIHsKLQkJCXRyYW5zbGF0ZWRUZXh0RWRpdCA9IG5ldyBNb3ZlVGFyZ2V0RWRpdChqc3BPZmZzZXQpOwotCQkJKChNb3ZlVGFyZ2V0RWRpdCkgdGV4dEVkaXQpLmdldFNvdXJjZUVkaXQoKS5zZXRUYXJnZXRFZGl0KChNb3ZlVGFyZ2V0RWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KTsKLQkJfQotCQllbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTmVlZCB0byB0cmFuc2xhdGUgIiArIHRleHRFZGl0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHRyYW5zbGF0ZWRUZXh0RWRpdDsKLQl9Ci0KLQlwdWJsaWMgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZ2V0VHJhbnNsYXRpb24oKSB7Ci0JCWlmIChmVHJhbnNsYXRpb24gPT0gbnVsbCkgewotCQkJSURPTU1vZGVsIHhtbE1vZGVsID0gKElET01Nb2RlbCkgZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCU1vZGVsSGFuZGxlckZvckpTUC5lbnN1cmVUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KHhtbE1vZGVsKTsKLQkJCXRyeSB7Ci0JCQkJSURPTURvY3VtZW50IHhtbERvYyA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0KLQkJCQlKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgdHJhbnNsYXRpb25BZGFwdGVyID0gKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAodHJhbnNsYXRpb25BZGFwdGVyICE9IG51bGwpCi0JCQkJCWZUcmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uQWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZUcmFuc2xhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7Ci0JCXJldHVybiBnZXRUcmFuc2xhdGlvbigpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCX0KLQotCXByb3RlY3RlZCBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OWY0M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBGcml0cyBKYWx2aW5naCAtIGNvbnRyaWJ1dGlvbnMgZm9yIGJ1ZyAxNTA3OTQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5WYXJpYWJsZUluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5EZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkRlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5Qcm9wZXJ0eUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYi5DdXN0b21UYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYi5UYWdsaWJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYi5UYWdsaWJIZWxwZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWIuVGFnbGliVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRmFjZXRNb2R1bGVDb3JlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5aZXJvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbC5JSlNQRUxUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQMjBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkZpbGVCdWZmZXJNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50VHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFRyYW5zbGF0ZXMgYSBKU1AgZG9jdW1lbnQgaW50byBhIEh0dHBTZXJ2bGV0IHN1YmNsYXNzLiBLZWVwcyB0d28gd2F5IG1hcHBpbmcgZnJvbQotICogSmF2YSB0cmFuc2xhdGlvbiB0byB0aGUgb3JpZ2luYWwgSlNQIHNvdXJjZSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIHRocm91Z2gKLSAqIGdldEphdmEySnNwUmFuZ2VzKCkgYW5kIGdldEpzcDJKYXZhUmFuZ2VzKCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUcmFuc2xhdG9yIGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUgewotCS8qKgotCSAqIDxwPlRoaXMgdmFsdWUgc2hvdWxkIGJlIGluY3JlbWVudGVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHMgY2hhbmdlOgotCSAqIDx1bD4KLQkgKiA8bGk+e0BsaW5rICN3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCl9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNyZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQpfTwvbGk+Ci0JICogPGxpPntAbGluayAjd3JpdGVTdHJpbmcoT2JqZWN0T3V0cHV0LCBTdHJpbmcpfTwvbGk+Ci0JICogPGxpPntAbGluayAjcmVhZFN0cmluZyhPYmplY3RJbnB1dCl9PC9saT4KLQkgKiA8bGk+e0BsaW5rICN3cml0ZVJhbmdlcyhPYmplY3RPdXRwdXQsIEhhc2hNYXApfTwvbGk+Ci0JICogPGxpPntAbGluayAjcmVhZFJhbmdlcyhPYmplY3RJbnB1dCl9PC9saT4KLQkgKiA8L3VsPgotCSAqIAotCSAqIFRoaXMgaXMgYmVjYXVzZSBpZiBhbnkgb2YgdGhlc2UgY2hhbmdlIHRoZW4gcHJldmlvdXNseSBleHRlcm5hbGl6ZWQge0BsaW5rIEpTUFRyYW5zbGF0b3J9cwotCSAqIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYmUgcmVhZCBieSB0aGUgbmV3IGltcGxlbWVudGF0aW9uLiAgVGhpcyB2YWx1ZSBpcyB1c2VkIGJ5Ci0JICogdGhlIHtAbGluayBFeHRlcm5hbGl6YWJsZX0gQVBJIGF1dG9tYXRpY2FsbHkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaWxlIGJlaW5nIHJlYWQgaXMgb2YgdGhlCi0JICogY29ycmVjdCB2ZXJzaW9uIHRvIGJlIHJlYWQgYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBKU1BUcmFuc2xhdG9yfTwvcD4KLQkgKiAKLQkgKiBAc2VlICN3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCkKLQkgKiBAc2VlICNyZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQpCi0JICogQHNlZSAjd3JpdGVTdHJpbmcoT2JqZWN0T3V0cHV0LCBTdHJpbmcpCi0JICogQHNlZSAjcmVhZFN0cmluZyhPYmplY3RJbnB1dCkKLQkgKiBAc2VlICN3cml0ZVJhbmdlcyhPYmplY3RPdXRwdXQsIEhhc2hNYXApCi0JICogQHNlZSAjcmVhZFJhbmdlcyhPYmplY3RJbnB1dCkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkKLQkvKiogZm9yIGRlYnVnZ2luZyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBCb29sZWFuLnZhbHVlT2YoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BqYXZhbWFwcGluZyIpKS5ib29sZWFuVmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBoYW5keSBwbHVnaW4gSUQgY29uc3RhbnQgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPUkVfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBjb25zdGFudHMgZm9yIHJlYWRpbmcgZXh0ZW5zaW9uIHBvaW50Ci0JLyoqIERlZmF1bHQgRUwgVHJhbnNsYXRvciBleHRlbnNpb24gSUQgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KU1BfRUxfVFJBTlNMQVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmRlZmF1bHRKU1AyMCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGV4dGVuc2lvbiBwb2ludCAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9UUkFOU0xBVE9SX0VYVEVOU0lPTl9OQU1FID0gImVsVHJhbnNsYXRvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBleHRlbnNpb24gcG9pbnQgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxUUkFOU0xBVE9SX1BST1BfTkFNRSA9ICJFTFRyYW5zbGF0b3IiOyAvLyROT04tTkxTLTEkCi0KLQkKLQkvLyB0aGVzZSBjb25zdGFudHMgYXJlIGNvbW1vbmx5IHVzZWQgc3RyaW5ncyBkdXJpbmcgdHJhbnNsYXRpb24KLQkvKiogZW5kIGxpbmUgY2hhcmFjdGVycyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOREwgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHNlc3Npb24gdmFyaWFibGUgZGVjbGFyYXRpb24gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9WQVJJQUJMRV9ERUNMQVJBVElPTiA9ICJqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHBhZ2VDb250ZXh0LmdldFNlc3Npb24oKTsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBmb290ZXIgdGV4dCAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT09URVIgPSAifX0iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT04gPSAiVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IG51bGw7IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBleHByZXNzaW9uIHByZWZpeCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fUFJFRklYID0gIm91dC5wcmludCgiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGV4cHJlc3Npb24gc3VmZml4ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9TVUZGSVggPSAiKTsiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHRyeS9jYXRjaCBzdGFydCAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUllfQ0FUQ0hfU1RBUlQgPSBFTkRMICsgInRyeSB7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdHJ5L2NhdGNoIGVuZCAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUllfQ0FUQ0hfRU5EID0gIiB9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHt9ICIgKyBFTkRMOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIEpTUCB0YWcgbmFtZSBwcmVmaXggKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9QUkVGSVggPSAianNwOiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQkvLyB0aGVzZSBjb25zdGFudHMgYXJlIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCB0eXBlIG9mIGNvZGUgaXMgY3VycmVudGx5IGJlaW5nIHRyYW5zbGF0ZWQKLQkvKiogY29kZSBpbiBxdWVzdGlvbiBpcyBzdGFuZGFyZCBKU1AgKi8KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBTVEFOREFSRF9KU1AgPSAwOwotCQotCS8qKiBjb2RlIGluIHF1ZXN0aW9uIGlzIGVtYmVkZGVkIChKU1AgYXMgYW4gYXR0cmlidXRlIG9yIHdpdGhpbiBjb21tZW50IHRhZ3MpICovCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgRU1CRURERURfSlNQID0gMTsKLQkKLQkvKiogY29kZSBpbiBxdWVzdGlvbiBpcyBhIEpTUCBkZWNsYXJhdGlvbiAqLwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IERFQ0xBUkFUSU9OID0gMjsKLQkKLQkvKiogY29kZSBpbiBxdWVzdGlvbiBpcyBhIEpTUCBleHByZXNzaW9uICovCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgRVhQUkVTU0lPTiA9IDQ7Ci0JCi0JLyoqIGNvZGUgaW4gcXVlc3Rpb24gaXMgYSBKU1Agc2NyaXB0bGV0ICovCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU0NSSVBUTEVUID0gODsKLQkKLQkKLQkvLyBzdHJpbmdzIHNwZWNpZmljIHRvIHRoaXMgdHJhbnNsYXRpb24KLQkvKiogdHJhbnNsYXRlZCBjbGFzcyBoZWFkZXIgKi8KLQlTdHJpbmcgZkNsYXNzSGVhZGVyID0gbnVsbDsKLQkKLQkvKiogdHJhbnNsYXRlZCBjbGFzcyBuYW1lICovCi0JU3RyaW5nIGZDbGFzc25hbWUgPSBudWxsOwotCQotCS8qKiB0cmFuc2xhdGVkIGNsYXNzIHN1cGVyIGNsYXNzICovCi0JU3RyaW5nIGZTdXBlcmNsYXNzID0gbnVsbDsKLQotCS8qKiB0cmFuc2xhdGVkIGNsYXNzIGltcG9ydHMgKi8KLQlTdHJpbmcgZkltcGxpY2l0SW1wb3J0cyA9IG51bGw7Ci0KLQkvKiogdHJhbnNsYXRlZCBjbGFzcyBzZXJ2aWNlIGhlYWRlciAqLwotCVN0cmluZyBmU2VydmljZUhlYWRlciA9IG51bGw7Ci0JCi0JLyoqIHRyYW5zbGF0ZWQgdXNlciBkZWZpbmVkIGltcG9ydHMgKi8KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBmVXNlckltcG9ydHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCi0JLy90cmFuc2xhdGlvbiBzcGVjaWZpYyBzdGF0ZQotCS8qKiB7QGxpbmsgSURPTU1vZGVsfSBmb3IgdGhlIEpTUCBmaWxlIGJlaW5nIHRyYW5zbGF0ZWQgKi8KLQlJRE9NTW9kZWwgZlN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCi0JLyoqIHtAbGluayBJU3RydWN0dXJlZERvY3VtZW50fSBmb3IgdGhlIEpTUCBmaWxlIGJlaW5nIHRyYW5zbGF0ZWQgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCQotCS8qKiB0aGUgRUwgdHJhbnNsYXRvciAqLwotCXByaXZhdGUgSUpTUEVMVHJhbnNsYXRvciBmRUxUcmFuc2xhdG9yID0gbnVsbDsKLQkKLQkvKiogcmVwb3J0ZWQgdHJhbnNsYXRpb24gcHJvYmxlbXMgKi8KLQlwcml2YXRlIExpc3QgZlRyYW5zbGF0aW9uUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLyoqIGZTb3VyY2VQb3NpdGlvbiA9IHBvc2l0aW9uIGluIEpTUCBzb3VyY2UgKi8KLQlwcml2YXRlIGludCBmU291cmNlUG9zaXRpb24gPSAtMTsKLQkKLQkvKiogZlJlbGF0aXZlT2ZmZXN0ID0gb2Zmc2V0IGluIHRoZSBidWZmZXIgdGhlcmUgdGhlIGN1cnNvciBpcyAqLwotCXByaXZhdGUgaW50IGZSZWxhdGl2ZU9mZnNldCA9IC0xOwotCQotCS8qKiBmQ3Vyc29yUG9zaXRpb24gPSBvZmZzZXQgaW4gdGhlIHRyYW5zbGF0ZWQgamF2YSBkb2N1bWVudCAqLwotCXByaXZhdGUgaW50IGZDdXJzb3JQb3NpdGlvbiA9IC0xOwotCi0JLyoqIHNvbWUgcGFnZSBkaXJlY3RpdmUgYXR0cmlidXRlcyAqLwotCXByaXZhdGUgYm9vbGVhbiBmSXNFcnJvclBhZ2UgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkN1cnNvckluRXhwcmVzc2lvbiA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNJbkFTZXNzaW9uID0gdHJ1ZTsKLQotCS8qKiB1c2VyIGphdmEgY29kZSBpbiBib2R5IG9mIHRoZSBzZXJ2aWNlIG1ldGhvZCAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZVc2VyQ29kZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvKiogdXNlciBFTCBFeHByZXNzaW9uICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZlVzZXJFTEV4cHJlc3Npb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8qKiB1c2VyIGRlZmluZWQgdmFycyBkZWNsYXJlZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjbGFzcyAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZVc2VyRGVjbGFyYXRpb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JLyoqCi0JICogQSBtYXAgb2YgdGFnIG5hbWVzIHRvIHRhZyBsaWJyYXJ5IHZhcmlhYmxlIGluZm9ybWF0aW9uOyB1c2VkIHRvIHN0b3JlCi0JICogdGhlIG9uZXMgbmVlZGVkIGZvciBBVF9FTkQgdmFyaWFibGUgc3VwcG9ydC4KLQkgKi8KLQlwcml2YXRlIFN0YWNrTWFwIGZUYWdUb1ZhcmlhYmxlTWFwID0gbnVsbDsKLQlwcml2YXRlIFN0YWNrIGZVc2VCZWFuc1N0YWNrID0gbmV3IFN0YWNrKCk7Ci0KLQkvKiogdGhlIGZpbmFsIHRyYW5zbGF0ZWQgamF2YSBkb2N1bWVudCAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZSZXN1bHQ7Ci0JCi0JLyoqIHRoZSBidWZmZXIgd2hlcmUgdGhlIGN1cnNvciBpcyAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZDdXJzb3JPd25lciA9IG51bGw7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZkN1cnJlbnROb2RlOwotCQotCS8qKiBmbGFnIGZvciBpZiB0aGUgY3Vyc29yIGlzIGluIHRoZSBjdXJyZW50IHJlZ2lvbmIgZWluZyB0cmFuc2xhdGVkICovCi0JcHJpdmF0ZSBib29sZWFuIGZJbkNvZGVSZWdpb24gPSBmYWxzZTsKLQotCS8qKiB1c2VkIHRvIGF2b2lkIGluZmluaXRlIGxvb3BpbmcgaW5jbHVkZSBmaWxlcyAqLwotCXByaXZhdGUgU3RhY2sgZkluY2x1ZGVzID0gbnVsbDsKLQlwcml2YXRlIFNldCBmSW5jbHVkZWRQYXRocyA9IG5ldyBIYXNoU2V0KDIpOwotCXByaXZhdGUgYm9vbGVhbiBmUHJvY2Vzc0luY2x1ZGVzID0gdHJ1ZTsKLQkvKiogbW9zdGx5IGZvciBoZWxwZXIgY2xhc3Nlcywgc28gdGhleSBwYXJzZSBjb3JyZWN0bHkgKi8KLQlwcml2YXRlIEFycmF5TGlzdCBmQmxvY2tNYXJrZXJzID0gbnVsbDsKLQkvKioKLQkgKiBmb3Iga2VlcGluZyB0cmFjayBvZiBvZmZzZXQgaW4gdXNlciBidWZmZXJzIHdoaWxlIGRvY3VtZW50IGlzIGJlaW5nCi0JICogYnVpbHQKLQkgKi8KLQlwcml2YXRlIGludCBmT2Zmc2V0SW5Vc2VySW1wb3J0cyA9IDA7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldEluVXNlckRlY2xhcmF0aW9ucyA9IDA7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldEluVXNlckNvZGUgPSAwOwotCi0JLyoqIGNvcnJlbGF0ZXMgcmFuZ2VzIChwb3NpdGlvbnMpIGluIGphdmEgdG8gcmFuZ2VzIGluIGpzcCAqLwotCXByaXZhdGUgSGFzaE1hcCBmSmF2YTJKc3BSYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyBpbiBmVXNlckltcG9ydHMgKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyKSB0bwotCSAqIHJhbmdlcyBpbiBzb3VyY2UgSlNQIGJ1ZmZlci4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZkltcG9ydFJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyBpbiBmVXNlckNvZGUgKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyKSB0bwotCSAqIHJhbmdlcyBpbiBzb3VyY2UgSlNQIGJ1ZmZlci4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZkNvZGVSYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwotCS8qKgotCSAqIG1hcCBvZiByYW5nZXMgaW4gZlVzZXJEZWNsYXJhdGlvbnMgKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKLQkgKiBidWZmZXIpIHRvIHJhbmdlcyBpbiBzb3VyY2UgSlNQIGJ1ZmZlci4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZkRlY2xhcmF0aW9uUmFuZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSGFzaE1hcCBmVXNlQmVhblJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgZlVzZXJFTFJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiByYW5nZXMgdGhhdCBkb24ndCBkaXJlY3RseSBtYXAgZnJvbSBqYXZhIGNvZGUgdG8gSlNQIGNvZGUgKGVnLgotCSAqIDwlQGluY2x1ZGUgZmlsZT0iaW5jbHVkZWQuanNwIiU+Ci0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbmRpcmVjdFJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQkvKioKLQkgKiBzYXZlIEpTUCBkb2N1bWVudCB0ZXh0IGZvciBsYXRlciB1c2UgbWF5IGp1c3Qgd2FudCB0byByZWFkIHRoaXMgZnJvbQotCSAqIHRoZSBmaWxlIG9yIHN0cnVjZHR1cmVkIGRvY3VtZW50IGRlcGVuZGluZyB3aGF0IGlzIGF2YWlsYWJsZQotCSAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZKc3BUZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JLyoqIEVMIFRyYW5zbGF0b3IgSUQgKHBsdWdnYWJsZSkgKi8KLQlwcml2YXRlIFN0cmluZyBmRUxUcmFuc2xhdG9ySUQ7Ci0KLQkvKioKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjb2RlIGhhcyBiZWVuIGZvdW5kLCBzdWNoIGFzIEhUTUwgdGFncywgdGhhdCBpcyBub3QgdHJhbnNsYXRlZAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuICBVc2VmdWwgZm9yIGRlY2lkaW5nIGlmIGEgcGxhY2UgaG9sZGVyIG5lZWRzIHRvIGJlCi0JICogd3JpdHRlbiB0byB0cmFuc2xhdGlvbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmRm91bmROb25UcmFuc2xhdGVkQ29kZTsKLQotCS8qKgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNvZGUgaGFzIGJlZW4gdHJhbnNsYXRlZCBmb3IgdGhlIGN1cnJlbnQgcmVnaW9uLAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZkNvZGVUcmFuc2xhdGVkOwotCi0JLyoqCi0JICogQSBzdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgYSByZWdpb24gY29sbGVjdGlvbiBtYXJrZXIgYW5kIGxpc3Qgb2YgdmFyaWFibGUKLQkgKiBpbmZvcm1hdGlvbi4gVGhlIHJlZ2lvbiBjYW4gYmUgdXNlZCBsYXRlciBmb3IgcG9zaXRpb25pbmcgdmFsaWRhdGlvbgotCSAqIG1lc3NhZ2VzLgotCSAqLwotCXN0YXRpYyBjbGFzcyBSZWdpb25UYWdzIHsKLQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbjsKLQkJQ3VzdG9tVGFnIHRhZzsKLQotCQlSZWdpb25UYWdzKElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24sIEN1c3RvbVRhZyB0YWcpIHsKLQkJCXRoaXMucmVnaW9uID0gcmVnaW9uOwotCQkJdGhpcy50YWcgPSB0YWc7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSlNQVHJhbnNsYXRvcigpIHsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIGNvbmZpZ3VyZSB1c2luZyBhbiBYTUxOb2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmUoSURPTU5vZGUgbm9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JCWZTdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCVN0cmluZyBiYXNlTG9jYXRpb24gPSBmU3RydWN0dXJlZE1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCi0JCWZFTFRyYW5zbGF0b3JJRCA9IGdldEVMVHJhbnNsYXRvclByb3BlcnR5KGJhc2VMb2NhdGlvbik7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IGZTdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNyZWF0ZUNsYXNzbmFtZShub2RlKTsKLQkJaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXNldENsYXNzbmFtZShjbGFzc05hbWUpOwotCQkJZkNsYXNzSGVhZGVyID0gInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lICsgIiBleHRlbmRzICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBtZW1vcnkgc2F2aW5nIGNvbmZpZ3VyZSAobm8gU3RydWN0dXJlZERvY3VtZW50IGluIG1lbW9yeSkgY3VycmVudGx5Ci0JICogZG9lc24ndCBoYW5kbGUgaW5jbHVkZWQgZmlsZXMKLQkgKiAKLQkgKiBAcGFyYW0ganNwRmlsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZShJRmlsZSBqc3BGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gd2hlbiBjb25maWd1cmVkIG9uIGEgZmlsZQotCQkvLyBmU3RydWN0dXJlZE1vZGVsLCBmUG9zaXRpb25Ob2RlLCBmTW9kZWxRdWVyeSwgZlN0cnVjdHVyZWREb2N1bWVudAotCQkvLyBhcmUgYWxsIG51bGwKLQkJZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0KLQkJZkVMVHJhbnNsYXRvcklEID0gZ2V0RUxUcmFuc2xhdG9yUHJvcGVydHkoanNwRmlsZSk7Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNyZWF0ZUNsYXNzbmFtZShqc3BGaWxlKTsKLQkJaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXNldENsYXNzbmFtZShjbGFzc05hbWUpOwotCQkJZkNsYXNzSGVhZGVyID0gInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lICsgIiBleHRlbmRzICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBqc3AgdGV4dCBmcm9tIGFuIElGaWxlCi0JICogCi0JICogQHBhcmFtIGpzcEZpbGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0SnNwVGV4dChJRmlsZSBqc3BGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlCdWZmZXJlZElucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oanNwRmlsZS5nZXRDb250ZW50cygpKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLQkJCVN0cmluZyBsaW5lID0gbnVsbDsKLQkJCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJZkpzcFRleHRCdWZmZXIuYXBwZW5kKGxpbmUpOwotCQkJCWZKc3BUZXh0QnVmZmVyLmFwcGVuZChFTkRMKTsKLQkJCX0KLQkJCXJlYWRlci5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBFTFRyYW5zbGF0b3IgcHJvcGVydHkgZnJvbSBhIHdvcmtzcGFjZSByZWxhdGl2ZQotCSAqIHBhdGggc3RyaW5nCi0JICogCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbgotCSAqICAgICAgICAgICAgV29ya3NwYWNlLXJlbGF0aXZlIHN0cmluZyBwYXRoCi0JICogQHJldHVybiBWYWx1ZSBvZiB0aGUgRUxUcmFuc2xhdG9yIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRFTFRyYW5zbGF0b3JQcm9wZXJ0eShTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlTdHJpbmcgZWxUcmFuc2xhdG9yVmFsdWUgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKG5ldyBQYXRoKGJhc2VMb2NhdGlvbikpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQllbFRyYW5zbGF0b3JWYWx1ZSA9IGdldEVMVHJhbnNsYXRvclByb3BlcnR5KGZpbGUpOwotCQl9Ci0JCXJldHVybiBlbFRyYW5zbGF0b3JWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBFTFRyYW5zbGF0b3IgcHJvcGVydHkgZnJvbSBhbiBJRmlsZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBJRmlsZQotCSAqIEByZXR1cm4gVmFsdWUgb2YgdGhlIEVMVHJhbnNsYXRvciBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RUxUcmFuc2xhdG9yUHJvcGVydHkoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZWxUcmFuc2xhdG9yVmFsdWUgPSBudWxsOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWVsVHJhbnNsYXRvclZhbHVlID0gZmlsZS5nZXRQZXJzaXN0ZW50UHJvcGVydHkobmV3IFF1YWxpZmllZE5hbWUoSlNQX0NPUkVfUExVR0lOX0lELCBFTFRSQU5TTEFUT1JfUFJPUF9OQU1FKSk7Ci0JCQkJCWlmIChudWxsID09IGVsVHJhbnNsYXRvclZhbHVlKSB7Ci0KLQkJCQkJCWVsVHJhbnNsYXRvclZhbHVlID0gZmlsZS5nZXRQcm9qZWN0KCkuZ2V0UGVyc2lzdGVudFByb3BlcnR5KG5ldyBRdWFsaWZpZWROYW1lKEpTUF9DT1JFX1BMVUdJTl9JRCwgRUxUUkFOU0xBVE9SX1BST1BfTkFNRSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSVNTVUU6IHdoeSBkbyB3ZSBsb2cgdGhpcyBoZXJlPyBJbnN0ZWFkIG9mIGFsbG93aW5nIHRvCi0JCQkJCS8vIHRocm93dXA/Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsVHJhbnNsYXRvclZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiB0aGUgc2ltcGxlIGNsYXNzIG5hbWUsIG5vdCBmdWxseSBxdWFsaWZpZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVDbGFzc25hbWUoSURPTU5vZGUgbm9kZSkgewotCQlTdHJpbmcgY2xhc3NuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGJhc2UgPSBub2RlLmdldE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQljbGFzc25hbWUgPSBKU1AyU2VydmxldE5hbWVVdGlsLm1hbmdsZShiYXNlKTsKLQkJfQotCQlyZXR1cm4gY2xhc3NuYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBqc3BGaWxlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZUNsYXNzbmFtZShJRmlsZSBqc3BGaWxlKSB7Ci0KLQkJU3RyaW5nIGNsYXNzbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChqc3BGaWxlICE9IG51bGwpIHsKLQkJCWNsYXNzbmFtZSA9IEpTUDJTZXJ2bGV0TmFtZVV0aWwubWFuZ2xlKGpzcEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gY2xhc3NuYW1lOwotCX0KLQotCXByaXZhdGUgSUpTUFByb2JsZW0gY3JlYXRlSlNQUHJvYmxlbShmaW5hbCBpbnQgcHJvYmxlbUVJRCwgZmluYWwgaW50IHByb2JsZW1JRCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIGludCBzdGFydCwgZmluYWwgaW50IGVuZCkgewotCQlmaW5hbCBpbnQgbGluZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJZmluYWwgY2hhcltdIGNsYXNzbmFtZSA9IGZDbGFzc25hbWUudG9DaGFyQXJyYXkoKTsKLQotCQkvKgotCQkgKiBOb3RlOiB0aGVzZSBwcm9ibGVtcyB3b3VsZCByZXN1bHQgaW4gdHJhbnNsYXRpb24gZXJyb3JzIG9uIHRoZQotCQkgKiBzZXJ2ZXIsIHNvIHRoZSBzZXZlcml0eSBpcyBub3QgbWVhbnQgdG8gYmUgY29udHJvbGxhYmxlCi0JCSAqLwotCQlyZXR1cm4gbmV3IElKU1BQcm9ibGVtKCkgewotCQkJcHVibGljIHZvaWQgc2V0U291cmNlU3RhcnQoaW50IHNvdXJjZVN0YXJ0KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFNvdXJjZUxpbmVOdW1iZXIoaW50IGxpbmVOdW1iZXIpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0U291cmNlRW5kKGludCBzb3VyY2VFbmQpIHsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNXYXJuaW5nKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRTb3VyY2VTdGFydCgpIHsKLQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0U291cmNlTGluZU51bWJlcigpIHsKLQkJCQlyZXR1cm4gbGluZTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRTb3VyY2VFbmQoKSB7Ci0JCQkJcmV0dXJuIGVuZDsKLQkJCX0KLQotCQkJcHVibGljIGNoYXJbXSBnZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCkgewotCQkJCXJldHVybiBjbGFzc25hbWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJCQlyZXR1cm4gbWVzc2FnZTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRJRCgpIHsKLQkJCQlyZXR1cm4gcHJvYmxlbUlEOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0QXJndW1lbnRzKCkgewotCQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldEVJRCgpIHsKLQkJCQlyZXR1cm4gcHJvYmxlbUVJRDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSkgewotCQl0aGlzLmZDbGFzc25hbWUgPSBjbGFzc25hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc25hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZDbGFzc25hbWUgIT0gbnVsbCA/IHRoaXMuZkNsYXNzbmFtZSA6ICJHZW5lcmljSnNwU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTbyB0aGF0IHRoZSBKU1BUcmFuc2xhdG9yIGNhbiBiZSByZXVzZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoSURPTU5vZGUgbm9kZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgewotCi0JCS8vIGluaXRpYWxpemUgc29tZSB0aGluZ3Mgb24gbm9kZQotCQljb25maWd1cmUobm9kZSwgcHJvZ3Jlc3MpOwotCQlyZXNldCgpOwotCQkvLyBzZXQgdGhlIGpzcCB0ZXh0IGJ1ZmZlcgotCQlmSnNwVGV4dEJ1ZmZlci5hcHBlbmQoZlN0cnVjdHVyZWREb2N1bWVudC5nZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogY29uc2VydmF0aXZlIHZlcnNpb24gKG5vIFN0cnVjdHVyZWREb2N1bWVudC9Nb2RlbCkKLQkgKiAKLQkgKiBAcGFyYW0ganNwRmlsZQotCSAqIEBwYXJhbSBwcm9ncmVzcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KElGaWxlIGpzcEZpbGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHsKLQotCQkvLyBpbml0aWFsaXplIHNvbWUgdGhpbmdzIG9uIG5vZGUKLQkJY29uZmlndXJlKGpzcEZpbGUsIHByb2dyZXNzKTsKLQkJcmVzZXQoKTsKLQkJLy8gc2V0IHRoZSBqc3AgdGV4dCBidWZmZXIKLQkJc2V0SnNwVGV4dChqc3BGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWluaXRpYWxpemUgc29tZSBmaWVsZHMKLQkgKi8KLQl2b2lkIHJlc2V0KCkgewotCi0JCS8vIHJlc2V0IHByb2dyZXNzIG1vbml0b3IKLQkJaWYgKGZQcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKLQkJCWZQcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQoZmFsc2UpOwotCi0JCS8vIHJlaW5pdCBmaWVsZHMKLQkJZlNvdXJjZVBvc2l0aW9uID0gLTE7Ci0JCWZSZWxhdGl2ZU9mZnNldCA9IC0xOwotCQlmQ3Vyc29yUG9zaXRpb24gPSAtMTsKLQotCQlmSXNFcnJvclBhZ2UgPSBmQ3Vyc29ySW5FeHByZXNzaW9uID0gZmFsc2U7Ci0JCWZJc0luQVNlc3Npb24gPSB0cnVlOwotCi0JCWZVc2VyQ29kZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZlVzZXJEZWNsYXJhdGlvbnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZVc2VySW1wb3J0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZlVzZXJFTEV4cHJlc3Npb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZSZXN1bHQgPSBudWxsOwotCQlmQ3Vyc29yT3duZXIgPSBudWxsOyAvLyB0aGUgYnVmZmVyIHdoZXJlIHRoZSBjdXJzb3IgaXMKLQotCQlmQ3VycmVudE5vZGUgPSBudWxsOwotCQlmSW5Db2RlUmVnaW9uID0gZmFsc2U7IC8vIGZsYWcgZm9yIGlmIGN1cnNvciBpcyBpbiB0aGUgY3VycmVudCByZWdpb24KLQkJLy8gYmVpbmcgdHJhbnNsYXRlZAotCi0JCWlmIChmSW5jbHVkZXMgIT0gbnVsbCkKLQkJCWZJbmNsdWRlcy5jbGVhcigpOwotCi0JCWZCbG9ja01hcmtlcnMgPSBudWxsOwotCi0JCWZPZmZzZXRJblVzZXJJbXBvcnRzID0gMDsKLQkJZk9mZnNldEluVXNlckRlY2xhcmF0aW9ucyA9IDA7Ci0JCWZPZmZzZXRJblVzZXJDb2RlID0gMDsKLQotCQlmSmF2YTJKc3BSYW5nZXMuY2xlYXIoKTsKLQkJZkltcG9ydFJhbmdlcy5jbGVhcigpOwotCQlmQ29kZVJhbmdlcy5jbGVhcigpOwotCQlmVXNlQmVhblJhbmdlcy5jbGVhcigpOwotCQlmRGVjbGFyYXRpb25SYW5nZXMuY2xlYXIoKTsKLQkJZlVzZXJFTFJhbmdlcy5jbGVhcigpOwotCQlmSW5kaXJlY3RSYW5nZXMuY2xlYXIoKTsKLQkJZkluY2x1ZGVkUGF0aHMuY2xlYXIoKTsKLQotCQlmSnNwVGV4dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCi0JCWZGb3VuZE5vblRyYW5zbGF0ZWRDb2RlID0gZmFsc2U7Ci0JCWZDb2RlVHJhbnNsYXRlZCA9IGZhbHNlOwotCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBqdXN0IHRoZSAic2hlbGwiIG9mIGEgc2VydmxldCwgbm90aGluZyBjb250cmlidXRlZCBmcm9tIHRoZSBKU1AKLQkgKiAgICAgICAgIGRvYwotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgZ2V0RW1wdHlUcmFuc2xhdGlvbigpIHsKLQkJcmVzZXQoKTsKLQkJYnVpbGRSZXN1bHQodHJ1ZSk7Ci0JCXJldHVybiBnZXRUcmFuc2xhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDxwPnB1dCB0aGUgZmluYWwgamF2YSBkb2N1bWVudCB0b2dldGhlcjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdXBkYXRlUmFuZ2VzIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByYW5nZXMgbmVlZCB0byBiZSB1cGRhdGVkIGFzIHRoZSByZXN1bHQKLQkgKiBpcyBidWlsdCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSByYW5nZXMgaGF2ZSBhbHJlYWR5IGJlZW4gdXBkYXRlZC4gIFRoaXMgaXMgdXNlZnVsCi0JICogaWYgYnVpbGRpbmcgYSByZXN1bHQgZnJvbSBhIHBlcnNpc3RlZCB7QGxpbmsgSlNQVHJhbnNsYXRvcn0uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGJ1aWxkUmVzdWx0KGJvb2xlYW4gdXBkYXRlUmFuZ2VzKSB7Ci0JCS8vIHRvIGJ1aWxkIHRoZSBqYXZhIGRvY3VtZW50IHRoaXMgaXMgdGhlIG9yZGVyOgotCQkvLyAKLQkJLy8gKyBkZWZhdWx0IGltcG9ydHMKLQkJLy8gKyB1c2VyIGltcG9ydHMKLQkJLy8gKyBjbGFzcyBoZWFkZXIKLQkJLy8gWysgZXJyb3IgcGFnZV0KLQkJLy8gKyB1c2VyIGRlY2xhcmF0aW9ucwotCQkvLyArIHNlcnZpY2UgbWV0aG9kIGhlYWRlcgotCQkvLyArIHRyeS9jYXRjaCBzdGFydAotCQkvLyArIHVzZXIgY29kZQotCQkvLyArIHRyeS9jYXRjaCBlbmQKLQkJLy8gKyBzZXJ2aWNlIG1ldGhvZCBmb290ZXIKLQkJZlJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoZkltcGxpY2l0SW1wb3J0cy5sZW5ndGgoKSArIGZVc2VySW1wb3J0cy5sZW5ndGgoKSArIGZDbGFzc0hlYWRlci5sZW5ndGgoKSArCi0JCQkJZlVzZXJEZWNsYXJhdGlvbnMubGVuZ3RoKCkgKyBmU2VydmljZUhlYWRlci5sZW5ndGgoKSArIFRSWV9DQVRDSF9TVEFSVC5sZW5ndGgoKQotCQkJCSsgZlVzZXJDb2RlLmxlbmd0aCgpICsgVFJZX0NBVENIX0VORC5sZW5ndGgoKSArIEZPT1RFUi5sZW5ndGgoKSk7Ci0KLQkJaW50IGphdmFPZmZzZXQgPSAwOwotCi0JCWZSZXN1bHQuYXBwZW5kKGZJbXBsaWNpdEltcG9ydHMpOwotCQlqYXZhT2Zmc2V0ICs9IGZJbXBsaWNpdEltcG9ydHMubGVuZ3RoKCk7Ci0KLQkJLy8gdXBkYXRlUmFuZ2VzKGZJbmRpcmVjdEltcG9ydHMsIGphdmFPZmZzZXQpOwotCQlpZih1cGRhdGVSYW5nZXMpIHsKLQkJCXVwZGF0ZVJhbmdlcyhmSW1wb3J0UmFuZ2VzLCBqYXZhT2Zmc2V0KTsKLQkJfQotCQkvLyB1c2VyIGltcG9ydHMKLQkJYXBwZW5kKGZVc2VySW1wb3J0cyk7Ci0JCWphdmFPZmZzZXQgKz0gZlVzZXJJbXBvcnRzLmxlbmd0aCgpOwotCi0JCS8vIGNsYXNzIGhlYWRlcgotCQlmUmVzdWx0LmFwcGVuZChmQ2xhc3NIZWFkZXIpOwotCQlqYXZhT2Zmc2V0ICs9IGZDbGFzc0hlYWRlci5sZW5ndGgoKTsKLQkJZlJlc3VsdC5hcHBlbmQoZlN1cGVyY2xhc3MgKyAieyIgKyBFTkRMKTsgLy8kTk9OLU5MUy0xJAotCQlqYXZhT2Zmc2V0ICs9IGZTdXBlcmNsYXNzLmxlbmd0aCgpICsgMjsKLQotCQlpZih1cGRhdGVSYW5nZXMpIHsKLQkJCXVwZGF0ZVJhbmdlcyhmRGVjbGFyYXRpb25SYW5nZXMsIGphdmFPZmZzZXQpOwotCQl9Ci0JCS8vIHVzZXIgZGVjbGFyYXRpb25zCi0JCWFwcGVuZChmVXNlckRlY2xhcmF0aW9ucyk7Ci0JCWphdmFPZmZzZXQgKz0gZlVzZXJEZWNsYXJhdGlvbnMubGVuZ3RoKCk7Ci0KLQkJaWYodXBkYXRlUmFuZ2VzKSB7Ci0JCQl1cGRhdGVSYW5nZXMoZlVzZXJFTFJhbmdlcywgamF2YU9mZnNldCk7Ci0JCX0KLQkJYXBwZW5kKGZVc2VyRUxFeHByZXNzaW9ucyk7Ci0JCWphdmFPZmZzZXQgKz0gZlVzZXJFTEV4cHJlc3Npb25zLmxlbmd0aCgpOwotCi0JCWZSZXN1bHQuYXBwZW5kKGZTZXJ2aWNlSGVhZGVyKTsKLQkJamF2YU9mZnNldCArPSBmU2VydmljZUhlYWRlci5sZW5ndGgoKTsKLQkJLy8gc2Vzc2lvbiBwYXJ0aWNpcGFudAotCQlpZiAoZklzSW5BU2Vzc2lvbikgewotCQkJZlJlc3VsdC5hcHBlbmQoU0VTU0lPTl9WQVJJQUJMRV9ERUNMQVJBVElPTik7Ci0JCQlqYXZhT2Zmc2V0ICs9IFNFU1NJT05fVkFSSUFCTEVfREVDTEFSQVRJT04ubGVuZ3RoKCk7Ci0JCX0KLQkJLy8gZXJyb3IgcGFnZQotCQlpZiAoZklzRXJyb3JQYWdlKSB7Ci0JCQlmUmVzdWx0LmFwcGVuZChFWENFUFRJT04pOwotCQkJamF2YU9mZnNldCArPSBFWENFUFRJT04ubGVuZ3RoKCk7Ci0JCX0KLQotCi0JCWZSZXN1bHQuYXBwZW5kKFRSWV9DQVRDSF9TVEFSVCk7Ci0JCWphdmFPZmZzZXQgKz0gVFJZX0NBVENIX1NUQVJULmxlbmd0aCgpOwotCi0JCWlmKHVwZGF0ZVJhbmdlcykgewotCQkJdXBkYXRlUmFuZ2VzKGZDb2RlUmFuZ2VzLCBqYXZhT2Zmc2V0KTsKLQkJfQotCi0JCS8vIHVzZXIgY29kZQotCQlhcHBlbmQoZlVzZXJDb2RlKTsKLQkJamF2YU9mZnNldCArPSBmVXNlckNvZGUubGVuZ3RoKCk7Ci0KLQotCQlmUmVzdWx0LmFwcGVuZChUUllfQ0FUQ0hfRU5EKTsKLQkJamF2YU9mZnNldCArPSBUUllfQ0FUQ0hfRU5ELmxlbmd0aCgpOwotCi0JCS8vIGZvb3RlcgotCQlmUmVzdWx0LmFwcGVuZChGT09URVIpOwotCQlqYXZhT2Zmc2V0ICs9IEZPT1RFUi5sZW5ndGgoKTsKLQotCQlmSmF2YTJKc3BSYW5nZXMucHV0QWxsKGZJbXBvcnRSYW5nZXMpOwotCQlmSmF2YTJKc3BSYW5nZXMucHV0QWxsKGZEZWNsYXJhdGlvblJhbmdlcyk7Ci0JCWZKYXZhMkpzcFJhbmdlcy5wdXRBbGwoZkNvZGVSYW5nZXMpOwotCQlmSmF2YTJKc3BSYW5nZXMucHV0QWxsKGZVc2VyRUxSYW5nZXMpOwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGphdmFSYW5nZXMKLQkgKiBAcGFyYW0gb2Zmc2V0SW5KYXZhCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVJhbmdlcyhIYXNoTWFwIHJhbmdlTWFwLCBpbnQgb2Zmc2V0SW5KYXZhKSB7Ci0JCS8vIGp1c3QgbmVlZCB0byB1cGRhdGUgamF2YSByYW5nZXMgdy8gdGhlIG9mZnNldCB3ZSBub3cga25vdwotCQlJdGVyYXRvciBpdCA9IHJhbmdlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpCi0JCQkoKFBvc2l0aW9uKSBpdC5uZXh0KCkpLm9mZnNldCArPSBvZmZzZXRJbkphdmE7Ci0JfQotCi0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyAocG9zaXRpb25zKSBpbiBqYXZhIGRvY3VtZW50IHRvIHJhbmdlcyBpbiBqc3AgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIGphdmEgcG9zaXRpb25zIHRvIGpzcCBwb3NpdGlvbnMuCi0JICovCi0JcHVibGljIEhhc2hNYXAgZ2V0SmF2YTJKc3BSYW5nZXMoKSB7Ci0JCXJldHVybiBmSmF2YTJKc3BSYW5nZXM7Ci0JfQotCi0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyBpbiBqc3AgZG9jdW1lbnQgdG8gcmFuZ2VzIGluIGphdmEgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiBqc3AgcG9zaXRpb25zIHRvIGphdmEgcG9zaXRpb25zLCBvciBudWxsIGlmIG5vCi0JICogICAgICAgICB0cmFuc2xhdGlvbiBoYXMgb2NjdXJlZCB5ZXQgKHRoZSBtYXAgaGFzbid0IGJlZW4gYnVpbHQpLgotCSAqLwotCXB1YmxpYyBIYXNoTWFwIGdldEpzcDJKYXZhUmFuZ2VzKCkgewotCQlpZiAoZkphdmEySnNwUmFuZ2VzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSGFzaE1hcCBmbGlwRmxvcHBlZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUl0ZXJhdG9yIGtleXMgPSBmSmF2YTJKc3BSYW5nZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0IHJhbmdlID0gbnVsbDsKLQkJd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0JCQlyYW5nZSA9IGtleXMubmV4dCgpOwotCQkJZmxpcEZsb3BwZWQucHV0KGZKYXZhMkpzcFJhbmdlcy5nZXQocmFuZ2UpLCByYW5nZSk7Ci0JCX0KLQkJcmV0dXJuIGZsaXBGbG9wcGVkOwotCX0KLQotCXB1YmxpYyBIYXNoTWFwIGdldEphdmEySnNwSW1wb3J0UmFuZ2VzKCkgewotCQlyZXR1cm4gZkltcG9ydFJhbmdlczsKLQl9Ci0KLQlwdWJsaWMgSGFzaE1hcCBnZXRKYXZhMkpzcFVzZUJlYW5SYW5nZXMoKSB7Ci0JCXJldHVybiBmVXNlQmVhblJhbmdlczsKLQl9Ci0KLQlwdWJsaWMgSGFzaE1hcCBnZXRKYXZhMkpzcEluZGlyZWN0UmFuZ2VzKCkgewotCQlyZXR1cm4gZkluZGlyZWN0UmFuZ2VzOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdG8gdGhlIGpzcDwtPmphdmEgbWFwIGJ5IGRlZmF1bHQKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGEgY29tbWEgZGVsaW1pdGVkIGxpc3Qgb2YgaW1wb3J0cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEltcG9ydHMoU3RyaW5nIHZhbHVlKSB7Ci0JCWFkZEltcG9ydHModmFsdWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFBhc3MgaW4gYSBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBpbXBvcnQgdmFsdWVzLCBhcHBlbmRzIGVhY2ggdG8gdGhlCi0JICogZmluYWwgcmVzdWx0IGJ1ZmZlcgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgYSBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBpbXBvcnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wb3J0cyhTdHJpbmcgdmFsdWUsIGJvb2xlYW4gYWRkVG9NYXApIHsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgxNjg3Ci0JCS8vIGFkZGVkIHRoZSAiYWRkVG9NYXAiIHBhcmFtZXRlciB0byBleGNsdWRlIGltcG9ydHMgb3JpZ2luYXRpbmcKLQkJLy8gZnJvbSBpbmNsdWRlZCBKU1AgZmlsZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGpzcDwtPmphdmEgbWFwcGluZwotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdG9rID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gU3RyaW5nIGFwcGVuZGFnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCXRvayA9IHN0Lm5leHRUb2tlbigpOwotCQkJYXBwZW5kSW1wb3J0VG9CdWZmZXIodG9rLCBmQ3VycmVudE5vZGUsIGFkZFRvTWFwKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIC8qIGtlZXAgdHJhY2sgb2YgY3Vyc29yIHBvc2l0aW9uIGluc2lkZSB0aGUgYnVmZmVyIC8qIGFwcGVuZHMgYnVmZmVyIHRvCi0JICogdGhlIGZpbmFsIHJlc3VsdCBidWZmZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmQoU3RyaW5nQnVmZmVyIGJ1ZikgewotCQlpZiAoZ2V0Q3Vyc29yT3duZXIoKSA9PSBidWYpIHsKLQkJCWZDdXJzb3JQb3NpdGlvbiA9IGZSZXN1bHQubGVuZ3RoKCkgKyBnZXRSZWxhdGl2ZU9mZnNldCgpOwotCQl9Ci0JCWZSZXN1bHQuYXBwZW5kKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHZhbGlkIGFmdGVyIGEgY29uZmlndXJlKC4uLiksIHRyYW5zbGF0ZSguLi4pIG9yCi0JICogdHJhbnNsYXRlRnJvbUZpbGUoLi4uKSBjYWxsCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCByZXN1bHQgKGphdmEgdHJhbnNsYXRpb24pIGJ1ZmZlcgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgZ2V0VHJhbnNsYXRpb24oKSB7Ci0KLQkJaWYgKERFQlVHKSB7Ci0JCQlTdHJpbmdCdWZmZXIgZGVidWdTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl0cnkgewotCQkJCUl0ZXJhdG9yIGl0ID0gZkphdmEySnNwUmFuZ2VzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlQb3NpdGlvbiBqYXZhID0gKFBvc2l0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiSmF2YSByYW5nZTpbIiArIGphdmEub2Zmc2V0ICsgIjoiICsgamF2YS5sZW5ndGggKyAiXVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiWyIgKyBmUmVzdWx0LnRvU3RyaW5nKCkuc3Vic3RyaW5nKGphdmEub2Zmc2V0LCBqYXZhLm9mZnNldCArIGphdmEubGVuZ3RoKSArICJdXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgifG1hcHMgdG8uLi58XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlQb3NpdGlvbiBqc3AgPSAoUG9zaXRpb24pIGZKYXZhMkpzcFJhbmdlcy5nZXQoamF2YSk7Ci0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiSlNQIHJhbmdlOlsiICsganNwLm9mZnNldCArICI6IiArIGpzcC5sZW5ndGggKyAiXVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiWyIgKyBmSnNwVGV4dEJ1ZmZlci50b1N0cmluZygpLnN1YnN0cmluZyhqc3Aub2Zmc2V0LCBqc3Aub2Zmc2V0ICsganNwLmxlbmd0aCkgKyAiXVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiSlNQVHJhbnNsYXRpb24gZXJyb3IiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgZGVidWdTdHJpbmcudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZlJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRUcmFuc2xhdGlvblByb2JsZW1zKCkgewotCQlyZXR1cm4gZlRyYW5zbGF0aW9uUHJvYmxlbXM7Ci0JfQotCi0JLyoqCi0JICogT25seSB2YWxpZCBhZnRlciBhIGNvbmZpZ3VyZSguLi4pLCB0cmFuc2xhdGUoLi4uKSBvcgotCSAqIHRyYW5zbGF0ZUZyb21GaWxlKC4uLikgY2FsbAotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgaW4gdGhlIEpTUCBmaWxlCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRKc3BUZXh0KCkgewotCQlyZXR1cm4gZkpzcFRleHRCdWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdsaWJWYXJpYWJsZXMoU3RyaW5nIHRhZ1RvQWRkLCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY3VzdG9tVGFnKSB7Ci0JCWFkZFRhZ2xpYlZhcmlhYmxlcyh0YWdUb0FkZCwgY3VzdG9tVGFnLCAtMSk7Ci0JfQotCS8qKgotCSAqIEFkZCB0aGUgc2VydmVyLXNpZGUgc2NyaXB0aW5nIHZhcmlhYmxlcyB1c2VkIGJ5IHRoaXMgdGFnLCBhbG9uZyB3aXRoCi0JICogYW55IHNjb3BpbmcuCi0JICogCi0JICogQHBhcmFtIHRhZ1RvQWRkCi0JICogQHBhcmFtIGN1c3RvbVRhZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ2xpYlZhcmlhYmxlcyhTdHJpbmcgdGFnVG9BZGQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjdXN0b21UYWcsIGludCBpbmRleCkgewotCQlpZiAoY3VzdG9tVGFnLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikpIHsKLQkJCS8qCi0JCQkgKiBTdGFydCB0YWcKLQkJCSAqLwotCQkJYWRkU3RhcnRUYWdWYXJpYWJsZSh0YWdUb0FkZCwgY3VzdG9tVGFnLGluZGV4KTsKLQkJfQotCQllbHNlIGlmIChjdXN0b21UYWcuZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikpIHsKLQkJCS8qCi0JCQkgKiBFbmQgdGFnCi0JCQkgKi8KLQkJCWFkZEVuZFRhZ1ZhcmlhYmxlKHRhZ1RvQWRkLCBjdXN0b21UYWcpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRFbmRUYWdWYXJpYWJsZShTdHJpbmcgdGFnVG9BZGQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjdXN0b21UYWcpewotCQlJRmlsZSBmID0gZ2V0RmlsZSgpOwotCQlpZiAoZiA9PSBudWxsIHx8ICFmLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgZGVjbCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVJlZ2lvblRhZ3MgcmVnaW9uVGFnID0gKFJlZ2lvblRhZ3MpIGZUYWdUb1ZhcmlhYmxlTWFwLnBvcCh0YWdUb0FkZCk7Ci0JCWlmIChyZWdpb25UYWcgIT0gbnVsbCkgewotCQkJLy8gZXZlbiBhbiBlbXB0eSBhcnJheSB3aWxsIGluZGljYXRlIGEgbmVlZCBmb3IgYSBjbG9zaW5nIGJyYWNlCi0JCQlUYWdsaWJWYXJpYWJsZVtdIHRhZ2xpYlZhcnMgPSByZWdpb25UYWcudGFnLmdldFRhZ1ZhcmlhYmxlcygpOwotCQkJU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAocmVnaW9uVGFnLnRhZy5pc0l0ZXJhdGlvblRhZygpKQotCQkJCWRvQWZ0ZXJCb2R5KHRleHQsIHJlZ2lvblRhZyk7Ci0JCQl0ZXh0LmFwcGVuZCgifSAvLyA8LyIpOyAvLyROT04tTkxTLTEkCi0JCQl0ZXh0LmFwcGVuZCh0YWdUb0FkZCk7Ci0JCQl0ZXh0LmFwcGVuZCgiPlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFRvQnVmZmVyKHRleHQudG9TdHJpbmcoKSwgZlVzZXJDb2RlLCBmYWxzZSwgY3VzdG9tVGFnKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFnbGliVmFycy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh0YWdsaWJWYXJzW2ldLmdldFNjb3BlKCkgPT0gVmFyaWFibGVJbmZvLkFUX0VORCkgewotCQkJCQlkZWNsID0gdGFnbGliVmFyc1tpXS5nZXREZWNsYXJhdGlvblN0cmluZygpOwotCQkJCQlhcHBlbmRUb0J1ZmZlcihkZWNsLCBmVXNlckNvZGUsIGZhbHNlLCBjdXN0b21UYWcpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiBTaW5jZSBzb21ldGhpbmcgc2hvdWxkIGhhdmUgYmVlbiBpbiB0aGUgbWFwIGJlY2F1c2Ugb2YgYQotCQkJICogc3RhcnQgdGFnLCBpdHMgYWJzZW5jZSBub3cgbWVhbnMgYW4gdW5iYWxhbmNlZCBlbmQgdGFnLgotCQkJICogRXh0cmFzIHdpbGwgYmUgY2hlY2tlZCBsYXRlciB0byBmbGFnIHVuYmFsYW5jZWQgc3RhcnQgdGFncy4KLQkJCSAqLwotCQkJSUpTUFByb2JsZW0gbWlzc2luZ1N0YXJ0VGFnID0gY3JlYXRlSlNQUHJvYmxlbShJSlNQUHJvYmxlbS5TdGFydEN1c3RvbVRhZ01pc3NpbmcsIElKU1BQcm9ibGVtLkZfUFJPQkxFTV9JRF9MSVRFUkFMLCBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQVHJhbnNsYXRvcl80LCB0YWdUb0FkZCksIGN1c3RvbVRhZy5nZXRTdGFydE9mZnNldCgpLCBjdXN0b21UYWcuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJZlRyYW5zbGF0aW9uUHJvYmxlbXMuYWRkKG1pc3NpbmdTdGFydFRhZyk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkZFN0YXJ0VGFnVmFyaWFibGUoU3RyaW5nIHRhZ1RvQWRkLElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjdXN0b21UYWcsIGludCBpbmRleCl7Ci0JCUlGaWxlIGYgPSBnZXRGaWxlKCk7Ci0KLQkJaWYgKGYgPT0gbnVsbCB8fCAhZi5leGlzdHMoKSkKLQkJCXJldHVybjsKLQkJVGFnbGliSGVscGVyIGhlbHBlciA9IFRhZ2xpYkhlbHBlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRUYWdsaWJIZWxwZXIoZik7Ci0JCVN0cmluZyBkZWNsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBwcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ3VzdG9tVGFnIHRhZyA9IGhlbHBlci5nZXRDdXN0b21UYWcodGFnVG9BZGQsIGdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBjdXN0b21UYWcsIHByb2JsZW1zKTsKLQkJVGFnbGliVmFyaWFibGVbXSB0YWdsaWJWYXJzID0gdGFnLmdldFRhZ1ZhcmlhYmxlcygpOwotCQlmVHJhbnNsYXRpb25Qcm9ibGVtcy5hZGRBbGwocHJvYmxlbXMpOwotCQkvKgotCQkgKiBBZGQgQVRfQkVHSU4gdmFyaWFibGVzCi0JCSAqLwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ2xpYlZhcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0YWdsaWJWYXJzW2ldLmdldFNjb3BlKCkgPT0gVmFyaWFibGVJbmZvLkFUX0JFR0lOKSB7Ci0JCQkJZGVjbCA9IHRhZ2xpYlZhcnNbaV0uZ2V0RGVjbGFyYXRpb25TdHJpbmcoKTsKLQkJCQlhcHBlbmRUb0J1ZmZlcihkZWNsLCBmVXNlckNvZGUsIGZhbHNlLCBjdXN0b21UYWcpOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gaXNFbXB0eVRhZyA9IGZhbHNlOwotCQlpZiAoaW5kZXggIT0gLTEpCi0JCQlpc0VtcHR5VGFnPSBpc0VtcHR5VGFnKGN1c3RvbVRhZywgaW5kZXgpOwotCQllbHNlCi0JCQlpc0VtcHR5VGFnPSBpc0VtcHR5VGFnKGN1c3RvbVRhZyk7Ci0JCQotCQkvKgotCQkgKiBBZGQgYSBzaW5nbGUgIHsgdG8gbGltaXQgdGhlIHNjb3BlIG9mIE5FU1RFRCB2YXJpYWJsZXMKLQkJICovCi0JCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoIWlzRW1wdHlUYWcgJiYgdGFnLmlzSXRlcmF0aW9uVGFnKCkgJiYgdGFnLmdldFRhZ0NsYXNzTmFtZSgpICE9IG51bGwpIHsKLQkJCXRleHQuYXBwZW5kKCJcbndoaWxlKHRydWUpICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGV4dC5hcHBlbmQoInsgLy8gPCIpOyAvLyROT04tTkxTLTEkCi0JCXRleHQuYXBwZW5kKHRhZ1RvQWRkKTsKLQkJaWYgKGlzRW1wdHlUYWcpCi0JCQl0ZXh0LmFwcGVuZCgiLz5cbiIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCXRleHQuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFwcGVuZFRvQnVmZmVyKHRleHQudG9TdHJpbmcoKSwgZlVzZXJDb2RlLCBmYWxzZSwgY3VzdG9tVGFnKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ2xpYlZhcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0YWdsaWJWYXJzW2ldLmdldFNjb3BlKCkgPT0gVmFyaWFibGVJbmZvLk5FU1RFRCkgewotCQkJCWRlY2wgPSB0YWdsaWJWYXJzW2ldLmdldERlY2xhcmF0aW9uU3RyaW5nKCk7Ci0JCQkJYXBwZW5kVG9CdWZmZXIoZGVjbCwgZlVzZXJDb2RlLCBmYWxzZSwgY3VzdG9tVGFnKTsKLQkJCX0KLQkJfQotCQkvKgotCQkgKiBGb3IgZW1wdHkgdGFncywgYWRkIHRoZSBjb3JyZXNwb25kaW5nIH0gYW5kIEFUX0VORCB2YXJpYWJsZXMgaW1tZWRpYXRlbHkuICAKLQkJICovCi0JCWlmIChpc0VtcHR5VGFnKSB7Ci0JCQl0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJdGV4dC5hcHBlbmQoIn0gLy8gPCIpOyAvLyROT04tTkxTLTEkCi0JCQl0ZXh0LmFwcGVuZCh0YWdUb0FkZCk7Ci0JCQl0ZXh0LmFwcGVuZCgiLz5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRUb0J1ZmZlcih0ZXh0LnRvU3RyaW5nKCksIGZVc2VyQ29kZSwgZmFsc2UsIGN1c3RvbVRhZyk7Ci0JCQkvKiBUcmVhdCB0aGlzIGFzIHRoZSBlbmQgZm9yIGVtcHR5IHRhZ3MgKi8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFnbGliVmFycy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh0YWdsaWJWYXJzW2ldLmdldFNjb3BlKCkgPT0gVmFyaWFibGVJbmZvLkFUX0VORCkgewotCQkJCQlkZWNsID0gdGFnbGliVmFyc1tpXS5nZXREZWNsYXJhdGlvblN0cmluZygpOwotCQkJCQlhcHBlbmRUb0J1ZmZlcihkZWNsLCBmVXNlckNvZGUsIGZhbHNlLCBjdXN0b21UYWcpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiBGb3Igbm9uLWVtcHR5IHRhZ3MsIHJlbWVtYmVyIHRoZSB2YXJpYWJsZSBpbmZvcm1hdGlvbgotCQkJICovCi0JCQlmVGFnVG9WYXJpYWJsZU1hcC5wdXNoKHRhZ1RvQWRkLCBuZXcgUmVnaW9uVGFncyhjdXN0b21UYWcsIHRhZykpOwotCQl9Ci0JCQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5VGFnKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjdXN0b21UYWcsIGludCBpbmRleCkgewotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCS8vIGN1c3RvbSB0YWcgaXMgZW1iZWRkZWQKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBjdXN0b21UYWcuZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiBuZXh0UmVnaW9uID0gcmVnaW9ucy5nZXQoaW5kZXgpOwotCQlpbnQgc2l6ZSA9IGN1c3RvbVRhZy5nZXROdW1iZXJPZlJlZ2lvbnMoKSA7Ci0JCXR5cGUgPSBuZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJd2hpbGUgKGluZGV4IDw9IHNpemUgJiYgIShET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UuZXF1YWxzKHR5cGUpIHx8IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLmVxdWFscyh0eXBlKSB8fCBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UuZXF1YWxzKHR5cGUpICkpIHsKLQkJCQluZXh0UmVnaW9uID0gcmVnaW9ucy5nZXQoKytpbmRleCk7Ci0JCQkJdHlwZSA9IG5leHRSZWdpb24uZ2V0VHlwZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFLmVxdWFscyh0eXBlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHlUYWcoSVRleHRSZWdpb25Db2xsZWN0aW9uIGN1c3RvbVRhZykgewotCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gY3VzdG9tVGFnLmdldExhc3RSZWdpb24oKTsKLQkJLy8gY3VzdG9tIHRhZyBpcyBlbWJlZGRlZAotCQlpZiAoY3VzdG9tVGFnIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY3VzdG9tVGFnLmdldFJlZ2lvbnMoKTsKLQkJCWludCBzaXplID0gY3VzdG9tVGFnLmdldE51bWJlck9mUmVnaW9ucygpIC0gMTsKLQkJCXdoaWxlIChzaXplID4gMCAmJiAhKERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRS5lcXVhbHMobGFzdFJlZ2lvbi5nZXRUeXBlKCkpIHx8IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLmVxdWFscyhsYXN0UmVnaW9uLmdldFR5cGUoKSkgfHwgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFLmVxdWFscyhsYXN0UmVnaW9uLmdldFR5cGUoKSkgKSkgewotCQkJCWxhc3RSZWdpb24gPSByZWdpb25zLmdldCgtLXNpemUpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFLmVxdWFscyhsYXN0UmVnaW9uLmdldFR5cGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEN1c3RvbVRhZ2xpYlZhcmlhYmxlcyhTdHJpbmcgdGFnVG9BZGQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjdXN0b21UYWcsIElUZXh0UmVnaW9uIHByZXZSZWdpb24sIGludCBpbmRleCkgewotCQkvL0Nhbid0IGp1ZGdlIGJ5IGZpcnN0IHJlZ2lvbiBhcyBzdGFydCBhbmQgZW5kIHRhZyBhcmUgcGFydCBvZiBzYW1lIENvbnRleHRSZWdpb25Db250YWluZXIJCQotCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIHByZXZSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pKSB7Ci0JCQkvKgotCQkJICogRW5kIHRhZwotCQkJICovCi0JCQlhZGRFbmRUYWdWYXJpYWJsZSh0YWdUb0FkZCwgY3VzdG9tVGFnKTsKLQkJfQotCQllbHNlIGlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgcHJldlJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSkgewotCQkJLyoKLQkJCSAqIFN0YXJ0IHRhZwotCQkJICovCi0JCQlhZGRTdGFydFRhZ1ZhcmlhYmxlKHRhZ1RvQWRkLGN1c3RvbVRhZywgaW5kZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvQWZ0ZXJCb2R5KFN0cmluZ0J1ZmZlciBidWZmZXIsIFJlZ2lvblRhZ3MgcmVnaW9uVGFnKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoIlx0aWYgKCAobmV3ICIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQocmVnaW9uVGFnLnRhZy5nZXRUYWdDbGFzc05hbWUoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIigpKS5kb0FmdGVyQm9keSgpICE9IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5VGFnLkVWQUxfQk9EWV9BR0FJTilcblx0XHRicmVhaztcbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgd29ya3NwYWNlIGZpbGUgZm9yIHRoaXMgbW9kZWwsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKCkgewotCQlJRmlsZSBmID0gbnVsbDsKLQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRCdWZmZXIoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCUlQYXRoIHBhdGggPSBidWZmZXIuZ2V0TG9jYXRpb24oKTsKLQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCWYgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQl9Ci0JCQlpZiAoZiAhPSBudWxsICYmIGYuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlyZXR1cm4gZjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIHVzZWQgYnkgaW5uZXIgaGVscGVyIGNsYXNzIChYTUxKU1BSZWdpb25IZWxwZXIsIEpTUEluY2x1ZGVSZWdpb25IZWxwZXIpCi0JICovCi0JcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgewotCQlpZiAoZkJsb2NrTWFya2VycyA9PSBudWxsKQotCQkJZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGZCbG9ja01hcmtlcnM7Ci0JfQotCi0JLyoqCi0JICogdGhlIG1haW4gY29udHJvbCBsb29wIGZvciB0cmFuc2xhdGluZyB0aGUgZG9jdW1lbnQsIGRyaXZlbiBieSB0aGUKLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgbm9kZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGUoKSB7Ci0JCWlmIChmVGFnVG9WYXJpYWJsZU1hcCA9PSBudWxsKSB7Ci0JCQlmVGFnVG9WYXJpYWJsZU1hcCA9IG5ldyBTdGFja01hcCgpOwotCQl9Ci0JCWZUcmFuc2xhdGlvblByb2JsZW1zLmNsZWFyKCk7Ci0KLQkJc2V0Q3VycmVudE5vZGUobmV3IFplcm9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZlN0cnVjdHVyZWREb2N1bWVudCwgMCkpOwotCQl0cmFuc2xhdGVQcmVsdWRlcygpOwotCi0JCXNldEN1cnJlbnROb2RlKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0KLQkJd2hpbGUgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCAmJiAhaXNDYW5jZWxlZCgpKSB7Ci0JCQkvL25vIGNvZGUgaGFzIGJlZW4gdHJhbnNsYXRlZCBmb3IgdGhpcyByZWdpb24geWV0Ci0JCQlmQ29kZVRyYW5zbGF0ZWQgPSBmYWxzZTsKLQkJCS8vIGludGVyY2VwdCBIVE1MIGNvbW1lbnQgZmxhdCBub2RlCi0JCQkvLyBhbHNvIGhhbmRsZXMgVU5ERUZJTkVEICh3aGljaCBpcyB3aGF0IENEQVRBIGNvbWVzIGluIGFzKQotCQkJLy8gYmFzaWNhbGx5IHRoaXMgcGFydCB3aWxsIGhhbmRsZSBhbnkgImVtYmVkZGVkIiBKU1AgY29udGFpbmVycwotCQkJaWYgKGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCB8fCBnZXRDdXJyZW50Tm9kZSgpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUIHx8IGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQkJdHJhbnNsYXRlWE1MQ29tbWVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBpdGVyYXRlIHRocm91Z2ggZWFjaCByZWdpb24gaW4gdGhlIGZsYXQgbm9kZQotCQkJCXRyYW5zbGF0ZVJlZ2lvbkNvbnRhaW5lcihnZXRDdXJyZW50Tm9kZSgpLCBTVEFOREFSRF9KU1ApOwotCQkJfQotCQkJCi0JCQkvL2lmIG5vIGNvZGUgd2FzIHRyYW5zbGF0ZWQgZm9yIHRoaXMgcmVnaW9uIHRoZW4gZm91bmQgIm5vbiB0cmFuc2xhdGVkIGNvZGUiCi0JCQlpZighZkNvZGVUcmFuc2xhdGVkKSB7Ci0JCQkJZkZvdW5kTm9uVHJhbnNsYXRlZENvZGUgPSB0cnVlOwotCQkJfQotCQkJCi0JCQlpZiAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsKQotCQkJCWFkdmFuY2VOZXh0Tm9kZSgpOwotCQl9Ci0JCQotCQl3cml0ZVBsYWNlSG9sZGVyRm9yTm9uVHJhbnNsYXRlZENvZGUoKTsKLQotCQlzZXRDdXJyZW50Tm9kZShuZXcgWmVyb1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmU3RydWN0dXJlZERvY3VtZW50LCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSk7Ci0JCXRyYW5zbGF0ZUNvZGFzKCk7Ci0KLQkJLyoKLQkJICogQW55IGNvbnRlbnRzIGxlZnQgaW4gdGhlIG1hcCBpbmRpY2F0ZSBzdGFydCB0YWdzIHRoYXQgbmV2ZXIgaGFkIGVuZAotCQkgKiB0YWdzLiBXaGlsZSB0aGUgJ3snIHRoYXQgaXMgcHJlc2VudCB3aXRob3V0IHRoZSBtYXRjaGluZyAnfScgc2hvdWxkCi0JCSAqIGNhdXNlIGEgSmF2YSB0cmFuc2xhdGlvbiBmYXVsdCwgdGhhdCdzIG5vdCBwYXJ0aWN1bGFybHkgaGVscGZ1bCB0bwotCQkgKiBhIHVzZXIgd2hvIG1heSBvbmx5IGtub3cgaG93IHRvIHVzZSBjdXN0b20gdGFncyBhcyB0YWdzLiBVbHRpbWF0ZWx5Ci0JCSAqIHVuYmFsYW5jZWQgY3VzdG9tIHRhZ3Mgc2hvdWxkIGp1c3QgYmUgcmVwb3J0ZWQgYXMgdW5iYWxhbmNlZCB0YWdzLAotCQkgKiBhbmQgdW5iYWxhbmNlZCAneycvJ30nIG9ubHkgcmVwb3J0ZWQgd2hlbiB0aGUgdXNlciBhY3R1YWxseQotCQkgKiB1bmJhbGFuY2VkIHRoZW0gd2l0aCBzY3JpcHRsZXRzLgotCQkgKi8KLQkJSXRlcmF0b3IgcmVnaW9uQW5kVGFnbGliVmFyaWFibGVzID0gZlRhZ1RvVmFyaWFibGVNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHJlZ2lvbkFuZFRhZ2xpYlZhcmlhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCVJlZ2lvblRhZ3MgcmVnaW9uVGFnID0gKFJlZ2lvblRhZ3MpIHJlZ2lvbkFuZFRhZ2xpYlZhcmlhYmxlcy5uZXh0KCk7Ci0JCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gZXh0cmFTdGFydFJlZ2lvbiA9IHJlZ2lvblRhZy5yZWdpb247Ci0JCQlJSlNQUHJvYmxlbSBtaXNzaW5nRW5kVGFnID0gY3JlYXRlSlNQUHJvYmxlbShJSlNQUHJvYmxlbS5FbmRDdXN0b21UYWdNaXNzaW5nLCBJSlNQUHJvYmxlbS5GX1BST0JMRU1fSURfTElURVJBTCwgTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUFRyYW5zbGF0b3JfNSxyZWdpb25UYWcudGFnLmdldFRhZ05hbWUoKSksIGV4dHJhU3RhcnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgZXh0cmFTdGFydFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSk7Ci0JCQlmVHJhbnNsYXRpb25Qcm9ibGVtcy5hZGQobWlzc2luZ0VuZFRhZyk7Ci0KLQkJCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJLy8gQWNjb3VudCBmb3IgaXRlcmF0aW9uIHRhZ3MgdGhhdCBoYXZlIGEgbWlzc2luZyBlbmQgdGFnCi0JCQlpZiAocmVnaW9uVGFnLnRhZy5pc0l0ZXJhdGlvblRhZygpKQotCQkJCWRvQWZ0ZXJCb2R5KHRleHQsIHJlZ2lvblRhZyk7Ci0JCQl0ZXh0LmFwcGVuZCgifSAvLyBbPC8iKTsgLy8kTk9OLU5MUy0xJAotCQkJdGV4dC5hcHBlbmQocmVnaW9uVGFnLnRhZy5nZXRUYWdOYW1lKCkpOwotCQkJdGV4dC5hcHBlbmQoIj5dIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFRvQnVmZmVyKHRleHQudG9TdHJpbmcoKSwgZlVzZXJDb2RlLCBmYWxzZSwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQl9Ci0JCWZUYWdUb1ZhcmlhYmxlTWFwLmNsZWFyKCk7Ci0KLQkJLyoKLQkJICogTm93IGRvIHRoZSBzYW1lIGZvciBqc3A6dXNlQmVhbiB0YWdzLCB3aG9zZSBjb250ZW50cyBnZXQgdGhlaXIgb3duCi0JCSAqIHsgJiB9Ci0JCSAqLwotCQl3aGlsZSAoIWZVc2VCZWFuc1N0YWNrLmlzRW1wdHkoKSkgewotCQkJYXBwZW5kVG9CdWZmZXIoIn0iLCBmVXNlckNvZGUsIGZhbHNlLCBmU3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBleHRyYVN0YXJ0UmVnaW9uID0gKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgZlVzZUJlYW5zU3RhY2sucG9wKCk7Ci0JCQlJSlNQUHJvYmxlbSBtaXNzaW5nRW5kVGFnID0gY3JlYXRlSlNQUHJvYmxlbShJSlNQUHJvYmxlbS5Vc2VCZWFuRW5kVGFnTWlzc2luZywgSUpTUFByb2JsZW0uRl9QUk9CTEVNX0lEX0xJVEVSQUwsIE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BUcmFuc2xhdG9yXzUsSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTiksIGV4dHJhU3RhcnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgZXh0cmFTdGFydFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSk7Ci0JCQlmVHJhbnNsYXRpb25Qcm9ibGVtcy5hZGQobWlzc2luZ0VuZFRhZyk7Ci0JCX0KLQotCQlidWlsZFJlc3VsdCh0cnVlKTsKLQl9Ci0KLSAJLyoqCi0JICogVHJhbnNsYXRlcyBhIHJlZ2lvbiBjb250YWluZXIgKGFuZCBYTUwgSlNQIGNvbnRhaW5lciwgb3IgPCUgSlNQCi0JICogY29udGFpbmVyKS4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIHRoaXMgY2xhc3MgYW5kIGZvcgotCSAqIGNvbnRhaW5lcnMgaW4gdGhlIHByaW1hcnkgc3RydWN0dXJlZCBkb2N1bWVudCBhcyBhbGwgYnVmZmVyIGFwcGVuZHMKLQkgKiB3aWxsIGJlIGRpcmVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnQoSURvY3VtZW50IGRvY3VtZW50LCBJbnB1dFN0cmVhbSBjb250ZW50U3RyZWFtLCBTdHJpbmcgY2hhcnNldCkgewotCQlSZWFkZXIgaW4gPSBudWxsOwotCQl0cnkgewotCQkJaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbnRlbnRTdHJlYW0sIGNoYXJzZXQpLCAyMDQ4KTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDIwNDgpOwotCQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclsyMDQ4XTsKLQkJCWludCBuID0gaW4ucmVhZChyZWFkQnVmZmVyKTsKLQkJCXdoaWxlIChuID4gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQocmVhZEJ1ZmZlciwgMCwgbik7Ci0JCQkJbiA9IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl9Ci0JCQlkb2N1bWVudC5zZXQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJZkNsYXNzbmFtZSA9ICJfSlNQU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQkJZkNsYXNzSGVhZGVyID0gInB1YmxpYyBjbGFzcyAiICsgZkNsYXNzbmFtZSArICIgZXh0ZW5kcyAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCi0JCWZJbXBsaWNpdEltcG9ydHMgPSAiaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC4qOyIgKyBFTkRMICsgRU5ETDsgLy8kTk9OLU5MUy0xJAotCi0JCWZTZXJ2aWNlSGVhZGVyID0gInB1YmxpYyB2b2lkIF9qc3BTZXJ2aWNlKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiXHRcdHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24geyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQgcGFnZUNvbnRleHQgPSBKc3BGYWN0b3J5LmdldERlZmF1bHRGYWN0b3J5KCkuZ2V0UGFnZUNvbnRleHQodGhpcywgcmVxdWVzdCwgcmVzcG9uc2UsIG51bGwsIHRydWUsIEpzcFdyaXRlci5ERUZBVUxUX0JVRkZFUiwgdHJ1ZSk7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0IGFwcGxpY2F0aW9uID0gcGFnZUNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKTsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZyBjb25maWcgPSBwYWdlQ29udGV4dC5nZXRTZXJ2bGV0Q29uZmlnKCk7IiArIEVOREwgKyAvLyROT04tTkxTLTEkIAotCQkJCQkiamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyIG91dCA9IHBhZ2VDb250ZXh0LmdldE91dCgpOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiT2JqZWN0IHBhZ2UgPSB0aGlzOyIgKyBFTkRMOyAvLyROT04tTkxTLTEkCi0JCWZTdXBlcmNsYXNzID0gImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zbGF0b3IncyBwcm9ncnNzIG1vbml0b3IsIGZhbHNlIGlmIHRoZQotCSAqICAgICAgICAgbW9uaXRvciBpcyBudWxsCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCXJldHVybiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsKSA/IGZhbHNlIDogZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkdmFuY2VOZXh0Tm9kZSgpIHsKLQkJc2V0Q3VycmVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkpOwotCQlpZiAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsKQotCQkJc2V0U291cmNlUmVmZXJlbmNlUG9pbnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U291cmNlUmVmZXJlbmNlUG9pbnQoKSB7Ci0JCWlmIChpc0pTUChnZXRDdXJyZW50Tm9kZSgpLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpKSkgewotCQkJSXRlcmF0b3IgaXQgPSBnZXRDdXJyZW50Tm9kZSgpLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJciA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKQotCQkJCQlicmVhazsKLQkJCQllbHNlIGlmIChyLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpCi0JCQkJCWJyZWFrOwotCQkJCWVsc2UgaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgJiYgZ2V0Q3VycmVudE5vZGUoKS5nZXRGdWxsVGV4dChyKS50cmltKCkuZXF1YWxzKCJpbXBvcnQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgYSByZWdpb24gY29udGFpbmVyIChhbmQgWE1MIEpTUCBjb250YWluZXIsIG9yIDwlIEpTUAotCSAqIGNvbnRhaW5lcikKLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGhpcyBjbGFzcyBhbmQgZm9yIGNvbnRhaW5lcnMgaW4KLQkgKiB0aGUgcHJpbWFyeSBzdHJ1Y3R1cmVkIGRvY3VtZW50IGFzIGFsbCBidWZmZXIgYXBwZW5kcyB3aWxsIGJlIGRpcmVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVJlZ2lvbkNvbnRhaW5lcihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyLCBpbnQgSlNQVHlwZSkgewotCi0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24gPSBjb250YWluZXI7Ci0KLQkJSXRlcmF0b3IgcmVnaW9ucyA9IGNvbnRhaW5lclJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQlyZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCi0JCQkvLyBjb250ZW50IGFzc2lzdCB3YXMgbm90IHNob3dpbmcgdXAgaW4gSlNQIGluc2lkZSBhIGphdmFzY3JpcHQgcmVnaW9uCi0JCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUID09IHR5cGUpIHsKLQkJCQkvLyBjaGVjayBpZiBpdCdzIG5lc3RlZCBqc3AgaW4gYSBzY3JpcHQgdGFnLi4uCi0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCS8vIHBhc3MgaW4gYmxvY2sgdGV4dCdzIGNvbnRhaW5lciAmIGl0ZXJhdG9yCi0JCQkJCUl0ZXJhdG9yIHJlZ2lvbkl0ZXJhdG9yID0gKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbikuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJCXRyYW5zbGF0ZUpTUE5vZGUocmVnaW9uLCByZWdpb25JdGVyYXRvciwgdHlwZSwgRU1CRURERURfSlNQKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vYmUgc3VyZSB0byBjb21iaW5lIGFsbCBvZiB0aGUgdGV4dCBmcm9tIHRoZSBibG9jayByZWdpb24KLQkJCQkJU3RyaW5nQnVmZmVyIGZ1bGxUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihjb250YWluZXJSZWdpb24uZ2V0RnVsbFRleHQocmVnaW9uKSk7Ci0JCQkJCXdoaWxlKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJCQlyZWdpb24gPSAoSVRleHRSZWdpb24pcmVnaW9ucy5uZXh0KCk7Ci0JCQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJCQkvLyBwYXNzIGluIGJsb2NrIHRleHQncyBjb250YWluZXIgJiBpdGVyYXRvcgotCQkJCQkJCUl0ZXJhdG9yIHJlZ2lvbkl0ZXJhdG9yID0gKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbikuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJCQkJdHJhbnNsYXRlSlNQTm9kZShyZWdpb24sIHJlZ2lvbkl0ZXJhdG9yLCB0eXBlLCBFTUJFRERFRF9KU1ApOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZihyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCQkJCWZ1bGxUZXh0LmFwcGVuZChjb250YWluZXJSZWdpb24uZ2V0RnVsbFRleHQocmVnaW9uKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vdXBkYXRlIHR5cGUgZm9yIHdoZW4gd2UgZXhpdCBpZiBzdGF0ZW1lbnQgZm9yIEJMT0NLX1RFWFQKLQkJCQkJCQl0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJLyoqCi0JCQkJCSAqIExJTUlUQVRJT04gLSBOb3JtYWxseSB0aGUgc2NyaXB0IGNvbnRlbnQgd2l0aGluIGEKLQkJCQkJICogc2NyaXB0IHRhZyBpcyBhIHNpbmdsZSBkb2N1bWVudCByZWdpb24gd2l0aCBhIHNpbmdsZQotCQkJCQkgKiBCTE9DS19URVhUIHRleHQgcmVnaW9uIHdpdGhpbiBpdC4gQW55IEpTUCBzY3JpcHRpbmcKLQkJCQkJICogd2lsbCBiZSB3aXRoaW4gaXRzIG93biByZWdpb24gY29udGFpbmVyIChmb3IgdGhlIHNha2UKLQkJCQkJICogb2Yga2VlcGluZyB0aGUgc2NyaXB0aW5nIG9wZW4vY29udGVudC9lbmQgYXMgYSBncm91cCkKLQkJCQkJICogYWxzbyBvZiBCTE9DS19URVhULiBUaGF0IGlnbm9yZXMgY3VzdG9tIHRhZ3MgdGhhdCBtaWdodAotCQkJCQkgKiBiZSBpbiB0aGVyZSwgdGhvdWdoLCBhcyB0aGV5IHJlcXVpcmUgcHJvcGVyIHNjb3BpbmcgYW5kCi0JCQkJCSAqIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHRvIGJlIHBlcmZvcm1lZCBldmVuIHRob3VnaAotCQkJCQkgKiB0aGV5J3JlIG5vdCBwcm9wZXIgbm9kZXMgaW4gdGhlIERPTS4gVGhlIG9ubHkgd2F5IHRvCi0JCQkJCSAqIHJlYWxseSBkbyB0aGlzIGlzIHRvIHRyZWF0IHRoZSBlbnRpcmUgc2NyaXB0IGNvbnRlbnQgYXMKLQkJCQkJICogSlNQIGNvbnRlbnQgb24gaXRzIG93biwgYWtpbiB0byBhbiBpbmNsdWRlZCBzZWdtZW50LgotCQkJCQkgKiBGdXJ0aGVyIGNvbXBsaWNhdGluZyB0aGlzIHNvbHV0aW9uIGlzIHRoYXQgdGFnZGVwZW5kZW50Ci0JCQkJCSAqIGN1c3RvbSB0YWdzIGhhdmUgdGhlaXIgY29tbWVudCBtYXJrZWQgYXMgQkxPQ0tfVEVYVCBhcwotCQkJCQkgKiB3ZWxsLCBzbyB0aGVyZSdzIG5vIGNsZWFyIHdheSB0byB0ZWxsIHRoZSB0d28gY2FzZXMKLQkJCQkJICogYXBhcnQuCi0JCQkJCSAqLwotCi0JCQkJCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCQkJCS8vIFRISVMgRU1CRURERUQgSlNQIFRFWFQgV0lMTCBDT01FIE9VVCBMQVRFUiBXSEVOCi0JCQkJCS8vIFBBUlRJVElPTklORyBIQVMKLQkJCQkJLy8gU1VQUE9SVCBGT1IgTkVTVEVEIFhNTC1KU1AKLQkJCQkJLy8gQ01WQyAyNDE4ODIKLQkJCQkJZGVjb2RlU2NyaXB0QmxvY2soZnVsbFRleHQudG9TdHJpbmcoKSwgY29udGFpbmVyUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkJCX0KLQkJCX0KLQkJCS8vIGlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gJiYKLQkJCS8vICgoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByZWdpb24pLmdldE51bWJlck9mUmVnaW9ucygpID4gMCkgewotCQkJLy8gdHJhbnNsYXRlUmVnaW9uQ29udGFpbmVyKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbiwKLQkJCS8vIEVNQkVEREVEX0pTUCk7Ci0JCQkvLyB9Ci0JCQlpZiAodHlwZSAhPSBudWxsICYmIGlzSlNQKHR5cGUpKSAvLyA8JSwgPCU9LCA8JSEsIDwlQAotCQkJewotCQkJCS8vIHRyYW5zbGF0ZUpTUE5vZGUocmVnaW9uLCByZWdpb25zLCB0eXBlLCBKU1BUeXBlKTsKLQkJCQl0cmFuc2xhdGVKU1BOb2RlKGNvbnRhaW5lclJlZ2lvbiwgcmVnaW9ucywgdHlwZSwgSlNQVHlwZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlICE9IG51bGwgJiYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pKSB7Ci0JCQkJdHJhbnNsYXRlWE1MTm9kZShjb250YWluZXJSZWdpb24sIHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZih0eXBlICE9IG51bGwgJiYgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UICYmIHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJLy90aGlzIGNhc2Ugd2FzIHB1dCBpbiB0byBwYXJzZSBFTCB0aGF0IGlzIG5vdCBpbiBhbiBhdHRyaWJ1dGUKLQkJCQl0cmFuc2xhdGVYTUxDb250ZW50KChJVGV4dFJlZ2lvbkNvbnRhaW5lcilyZWdpb24pOwotCQkJfQotCQkJLy90aGUgZW5kIHRhZ3Mgb2YgdGhlc2UgcmVnaW9ucyBhcmUgInRyYW5zbGF0ZWQiIGluIGEgc2Vuc2UKLQkJCWVsc2UgaWYodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFIHx8Ci0JCQkJCXR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB7Ci0JCQkJdGhpcy5mQ29kZVRyYW5zbGF0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICoqCi0JICogVEVNUCBXT1JLQVJPVU5EIEZPUiBDTVZDIDI0MTg4MiBUYWtlcyBhIFN0cmluZyBhbmQgYmxvY2tzIG91dAotCSAqIGpzcDpzY3JpcHRsZXQsIGpzcDpleHByZXNzaW9uLCBhbmQganNwOmRlY2xhcmF0aW9uIEBwYXJhbSBibG9ja1RleHQKLQkgKiBAcmV0dXJuCi0JICovCi0Jdm9pZCBkZWNvZGVTY3JpcHRCbG9jayhTdHJpbmcgYmxvY2tUZXh0LCBpbnQgc3RhcnRPZkJsb2NrKSB7Ci0JCVhNTEpTUFJlZ2lvbkhlbHBlciBoZWxwZXIgPSBuZXcgWE1MSlNQUmVnaW9uSGVscGVyKHRoaXMsIGZhbHNlKTsKLQkJaGVscGVyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOnNjcmlwdGxldCIsIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0JCWhlbHBlci5hZGRCbG9ja01hcmtlcihuZXcgQmxvY2tNYXJrZXIoImpzcDpleHByZXNzaW9uIiwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJaGVscGVyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmRlY2xhcmF0aW9uIiwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJaGVscGVyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmRpcmVjdGl2ZS5pbmNsdWRlIiwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJaGVscGVyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmRpcmVjdGl2ZS50YWdsaWIiLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwZXIucmVzZXQoYmxvY2tUZXh0LCBzdGFydE9mQmxvY2spOwotCQkvLyBmb3JjZSBwYXJzZQotCQloZWxwZXIuZm9yY2VQYXJzZSgpOwotCX0KLQotCS8qCi0JICogcmV0dXJucyBzdHJpbmcgbWludXMgQ0RBVEEgb3BlbiBhbmQgY2xvc2UgdGV4dAotCSAqLwotCWZpbmFsIHB1YmxpYyBTdHJpbmcgc3RyaXBDREFUQShTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgcmVzdWx0VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBDREFUQV9PUEVOID0gIjwhW0NEQVRBWyI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENEQVRBX0NMT1NFID0gIl1dPiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IGVuZCA9IHRleHQubGVuZ3RoKCk7Ci0JCXdoaWxlIChzdGFydCA8IHRleHQubGVuZ3RoKCkpIHsKLQkJCWlmICh0ZXh0LmluZGV4T2YoQ0RBVEFfT1BFTiwgc3RhcnQpID4gLTEpIHsKLQkJCQllbmQgPSB0ZXh0LmluZGV4T2YoQ0RBVEFfT1BFTiwgc3RhcnQpOwotCQkJCXJlc3VsdFRleHQgKz0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0JCQkJc3RhcnQgPSBlbmQgKyBDREFUQV9PUEVOLmxlbmd0aCgpOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dC5pbmRleE9mKENEQVRBX0NMT1NFLCBzdGFydCkgPiAtMSkgewotCQkJCWVuZCA9IHRleHQuaW5kZXhPZihDREFUQV9DTE9TRSwgc3RhcnQpOwotCQkJCXJlc3VsdFRleHQgKz0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0JCQkJc3RhcnQgPSBlbmQgKyBDREFUQV9DTE9TRS5sZW5ndGgoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWVuZCA9IHRleHQubGVuZ3RoKCk7Ci0JCQkJcmVzdWx0VGV4dCArPSB0ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0VGV4dDsKLQl9Ci0KLQkvLyBFTkQgT0YgV09SS0FST1VORCBDT0RFLi4uCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8qKgotCSAqIGRldGVybWluZXMgaWYgdGhlIHR5cGUgaXMgYSBwdXJlIEpTUCB0eXBlIChub3QgWE1MKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSlNQKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQgfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfT1BFTikgJiYgdHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTik7Ci0JCS8vIGNoZWNraW5nIFhNTF9UQUdfT1BFTiBzbyA8anNwOmRpcmVjdGl2ZS54eHgvPiBnZXRzIHRyZWF0ZWQgbGlrZQotCQkvLyBvdGhlciBYTUwganNwIHRhZ3MKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGN1cnJlbnRseSBvbmx5IGRldGVjdHMgRUwgY29udGVudCBhbmQgdHJhbnNsYXRlcyBpdCwKLQkgKiBidXQgaWYgb3RoZXIgY2FzZXMgYXJpc2UgbGF0ZXIgdGhlbiB0aGV5IGNvdWxkIGJlIGFkZGVkIGluIGhlcmUKLQkgKiAKLQkgKiBAcGFyYW0gZW1iZWRkZWRDb250YWluZXIgdGhlIGNvbnRhaW5lciB0aGF0IG1heSBjb250YWluIEVMCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlWE1MQ29udGVudChJVGV4dFJlZ2lvbkNvbnRhaW5lciBlbWJlZGRlZENvbnRhaW5lcikgewotCQlJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zID0gZW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpOwotCQlpbnQgbGVuZ3RoID0gZW1iZWRkZWRSZWdpb25zLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJSVRleHRSZWdpb24gZGVsaW0gPSBlbWJlZGRlZFJlZ2lvbnMuZ2V0KGkpOwotCQkJU3RyaW5nIHR5cGUgPSBkZWxpbS5nZXRUeXBlKCk7Ci0KLQkJCS8vIGNoZWNrIG5leHQgcmVnaW9uIHRvIHNlZSBpZiBpdCdzIEVMIGNvbnRlbnQKLQkJCWlmIChpICsgMSA8IGxlbmd0aCkgewotCQkJCWlmKCh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1ZCTF9PUEVOKSkgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQkJCQkKLQkJCQkJaW50IHN0YXJ0ID0gZGVsaW0uZ2V0RW5kKCk7Ci0JCQkJCXdoaWxlICgrK2kgPCBsZW5ndGgpIHsKLQkJCQkJCXJlZ2lvbiA9IGVtYmVkZGVkUmVnaW9ucy5nZXQoaSk7Ci0JCQkJCQlpZiAocmVnaW9uID09IG51bGwgfHwgIWlzRUxUeXBlKHJlZ2lvbi5nZXRUeXBlKCkpKQotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWZMYXN0SlNQVHlwZSA9IEVYUFJFU1NJT047Ci0JCQkJCVN0cmluZyBlbFRleHQgPSBlbWJlZGRlZENvbnRhaW5lci5nZXRGdWxsVGV4dCgpLnN1YnN0cmluZyhzdGFydCwgKHJlZ2lvbiAhPSBudWxsID8gcmVnaW9uLmdldFN0YXJ0KCkgOiBlbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSAtIDEpKTsKLQkJCQkJdHJhbnNsYXRlRUwoZWxUZXh0LCBlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGRlbGltKSwgZkN1cnJlbnROb2RlLAotCQkJCQkJCWVtYmVkZGVkQ29udGFpbmVyLmdldEVuZE9mZnNldChkZWxpbSksIGVsVGV4dC5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRUxUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfQ09OVEVOVC5lcXVhbHModHlwZSkgfHwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX0RRVU9URS5lcXVhbHModHlwZSkgfHwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX1FVT1RFRF9DT05URU5ULmVxdWFscyh0eXBlKSB8fCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfU1FVT1RFLmVxdWFscyh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiB0cmFuc2xhdGVzIHRoZSB2YXJpb3VzIFhNTEpTUCB0eXBlIG5vZGVzCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbnMKLQkgKiAgICAgICAgICAgIHRoZSByZWdpb25zIG9mIHRoZSBYTUxOb2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlWE1MTm9kZShJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyLCBJdGVyYXRvciByZWdpb25zKSB7Ci0JCS8vIGNvbnRlbnRzIG11c3QgYmUgdmFsaWQgWEhUTUwsIHRyYW5zbGF0ZSBlc2NhcGVkIENEQVRBIGludG8gd2hhdCBpdAotCQkvLyByZWFsbHkgaXMuLi4KLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCWlmIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJciA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkvLyA8anNwOmRpcmVjdGl2ZS54eHggPiBjb21lcyBpbiBhcyB0aGlzCi0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgci5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKQotCi0JCQl7Ci0JCQkJU3RyaW5nIGZ1bGxUYWdOYW1lID0gY29udGFpbmVyLmdldFRleHQocik7Ci0JCQkJaWYgKGZ1bGxUYWdOYW1lLmluZGV4T2YoJzonKSA+IC0xICYmICFmdWxsVGFnTmFtZS5zdGFydHNXaXRoKEpTUF9QUkVGSVgpKSB7Ci0JCQkJCWFkZFRhZ2xpYlZhcmlhYmxlcyhmdWxsVGFnTmFtZSwgY29udGFpbmVyLC0xKTsgLy8gaXQKLQkJCQkJLy8gbWF5Ci0JCQkJCS8vIGJlIGEKLQkJCQkJLy8gY3VzdG9tCi0JCQkJCS8vIHRhZwotCQkJCX0KLQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZ1bGxUYWdOYW1lLCAiOi4iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpICYmIHN0Lm5leHRUb2tlbigpLmVxdWFscygianNwIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCVN0cmluZyBqc3BUYWdOYW1lID0gc3QubmV4dFRva2VuKCk7Ci0KLQkJCQkJCWlmIChqc3BUYWdOYW1lLmVxdWFscygic2NyaXB0bGV0IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQl0cmFuc2xhdGVYTUxKU1BDb250ZW50KFNDUklQVExFVCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygiZXhwcmVzc2lvbiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJdHJhbnNsYXRlWE1MSlNQQ29udGVudChFWFBSRVNTSU9OKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJkZWNsYXJhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJdHJhbnNsYXRlWE1MSlNQQ29udGVudChERUNMQVJBVElPTik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygiZGlyZWN0aXZlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCVN0cmluZyBkaXJlY3RpdmVOYW1lID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJCQkJCWlmIChkaXJlY3RpdmVOYW1lLmVxdWFscygidGFnbGliIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJd2hpbGUgKHIgIT0gbnVsbCAmJiByZWdpb25zLmhhc05leHQoKSAmJiAhci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQkJCQkJCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCQkJCQkJCQlpZiAoY29udGFpbmVyLmdldFRleHQocikuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9QUkVGSVgpKSB7Ci0JCQkJCQkJCQkJCVN0cmluZyBwcmVmaXggPSBnZXRBdHRyaWJ1dGVWYWx1ZShyLCByZWdpb25zKTsKLQkJCQkJCQkJCQkJaWYgKHByZWZpeCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQloYW5kbGVUYWdsaWIocHJlZml4KTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmIChkaXJlY3RpdmVOYW1lLmVxdWFscygiaW5jbHVkZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCQkJU3RyaW5nIGZpbGVMb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCQkJCS8vIHNraXAgdG8gcmVxdWlyZWQgImZpbGUiIGF0dHJpYnV0ZSwKLQkJCQkJCQkJCS8vIHNob3VsZCBiZSBzYWZlIGJlY2F1c2UKLQkJCQkJCQkJCS8vICJmaWxlIiBpcyB0aGUgb25seSBhdHRyaWJ1dGUgZm9yIHRoZQotCQkJCQkJCQkJLy8gaW5jbHVkZSBkaXJlY3RpdmUKLQkJCQkJCQkJCXdoaWxlIChyICE9IG51bGwgJiYgcmVnaW9ucy5oYXNOZXh0KCkgJiYgIXIuZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpKSB7Ci0JCQkJCQkJCQkJciA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlmaWxlTG9jYXRpb24gPSBnZXRBdHRyaWJ1dGVWYWx1ZShyLCByZWdpb25zKTsKLQkJCQkJCQkJCWlmIChmaWxlTG9jYXRpb24gIT0gbnVsbCkKLQkJCQkJCQkJCQloYW5kbGVJbmNsdWRlRmlsZShmaWxlTG9jYXRpb24pOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKCJwYWdlIikpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQkJCQkvLyBiYWQgaWYgY3VycmVudE5vZGUgaXMgcmVmZXJlbmNlZCBhZnRlcgotCQkJCQkJCQkJLy8gaGVyZSB3LyB0aGUgY3VycmVudCBsaXN0Ci0JCQkJCQkJCQkvLyBzZWU6Ci0JCQkJCQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzAzNQotCQkJCQkJCQkJLy8gc2V0Q3VycmVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkpOwotCQkJCQkJCQkJaWYgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCkgewotCQkJCQkJCQkJCS8vICdyZWdpb25zJyBjb250YWluIHRoZSBhdHRycwotCQkJCQkJCQkJCXRyYW5zbGF0ZVBhZ2VEaXJlY3RpdmVBdHRyaWJ1dGVzKHJlZ2lvbnMsIGdldEN1cnJlbnROb2RlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKCJ0YWciKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl0cmFuc2xhdGVQYWdlRGlyZWN0aXZlQXR0cmlidXRlcyhyZWdpb25zLCBnZXRDdXJyZW50Tm9kZSgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmIChkaXJlY3RpdmVOYW1lLmVxdWFscygidmFyaWFibGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl0cmFuc2xhdGVWYXJpYWJsZURpcmVjdGl2ZUF0dHJpYnV0ZXMocmVnaW9ucyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygiaW5jbHVkZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkvLyA8anNwOmluY2x1ZGUgcGFnZT0iZmlsZW5hbWUiKSAvPgotCQkJCQkJCWNoZWNrQXR0cmlidXRlVmFsdWVDb250YWluZXIocmVnaW9ucywgInBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoanNwVGFnTmFtZS5lcXVhbHMoImZvcndhcmQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJY2hlY2tBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcihyZWdpb25zLCAicGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygicGFyYW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJY2hlY2tBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcihyZWdpb25zLCAidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoanNwVGFnTmFtZS5lcXVhbHMoInNldFByb3BlcnR5IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWNoZWNrQXR0cmlidXRlVmFsdWVDb250YWluZXIocmVnaW9ucywgInZhbHVlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJ1c2VCZWFuIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQljaGVja0F0dHJpYnV0ZVZhbHVlQ29udGFpbmVyKHJlZ2lvbnMsICJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzMDA0Ci0JCQkJCQkJLy8gYWR2YW5jZU5leHROb2RlKCk7IC8vIGdldCB0aGUgY29udGVudAotCQkJCQkJCWlmIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCQkJCQkJdHJhbnNsYXRlVXNlQmVhbihjb250YWluZXIpOyAvLyAncmVnaW9ucycKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2hlY2tBbGxBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcnMocmVnaW9ucyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogdHJhbnNsYXRlcyBlbWJlZGRlZCBjb250YWluZXJzIGZvciBBTEwgYXR0cmlidXRlIHZhbHVlcwotCSAqIAotCSAqIEBwYXJhbSByZWdpb25zCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQWxsQXR0cmlidXRlVmFsdWVDb250YWluZXJzKEl0ZXJhdG9yIHJlZ2lvbnMpIHsKLQkJLy8gdGFnIG5hbWUgaXMgbm90IGpzcAotCQkvLyBoYW5kbGUgZW1iZWRkZWQganNwIGF0dHJpYnV0ZXMuLi4KLQkJSVRleHRSZWdpb24gZW1iZWRkZWQgPSBudWxsOwotCQkvLyBJdGVyYXRvciBhdHRyUmVnaW9ucyA9IG51bGw7Ci0JCS8vIElUZXh0UmVnaW9uIGF0dHJDaHVuayA9IG51bGw7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJZW1iZWRkZWQgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJaWYgKGVtYmVkZGVkIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkvLyBwYXJzZSBvdXQgY29udGFpbmVyCi0KLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMwNjA2Ci0JCQkJLy8gZml4IGV4cG9uZW50aWFsIGl0ZXJhdGlvbiBwcm9ibGVtIHcvIGVtYmVkZGVkIGV4cHJlc3Npb25zCi0JCQkJdHJhbnNsYXRlRW1iZWRkZWRKU1BJbkF0dHJpYnV0ZSgoSVRleHRSZWdpb25Db250YWluZXIpIGVtYmVkZGVkKTsKLQkJCQkvLyBhdHRyUmVnaW9ucyA9ICgoSVRleHRSZWdpb25Db250YWluZXIpCi0JCQkJLy8gZW1iZWRkZWQpLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCS8vIHdoaWxlIChhdHRyUmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQkvLyBhdHRyQ2h1bmsgPSAoSVRleHRSZWdpb24pIGF0dHJSZWdpb25zLm5leHQoKTsKLQkJCQkvLyBTdHJpbmcgdHlwZSA9IGF0dHJDaHVuay5nZXRUeXBlKCk7Ci0JCQkJLy8gLy8gZW1iZWRkZWQgSlNQIGluIGF0dHJpYnV0ZSBzdXBwb3J0IG9ubHkgd2FudCB0bwotCQkJCS8vIC8vIHRyYW5zbGF0ZSBvbmUgdGltZSBwZXIKLQkJCQkvLyAvLyBlbWJlZGRlZCByZWdpb24gc28gd2Ugb25seSB0cmFuc2xhdGUgb24gdGhlIEpTUCBvcGVuCi0JCQkJLy8gLy8gdGFncyAobm90IGNvbnRlbnQpCi0JCQkJLy8gaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fAotCQkJCS8vIHR5cGUgPT0KLQkJCQkvLyBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgdHlwZSA9PQotCQkJCS8vIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOIHx8IHR5cGUgPT0KLQkJCQkvLyBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4gfHwgdHlwZSA9PQotCQkJCS8vIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9PUEVOKSB7Ci0JCQkJLy8gLy8gbm93IGNhbGwganNwdHJhbnNsYXRlCi0JCQkJLy8gdHJhbnNsYXRlRW1iZWRkZWRKU1BJbkF0dHJpYnV0ZSgoSVRleHRSZWdpb25Db250YWluZXIpCi0JCQkJLy8gZW1iZWRkZWQpOwotCQkJCS8vIGJyZWFrOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0cmFuc2xhdGVzIGVtYmVkZGVkIGNvbnRhaW5lciBmb3Igc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIAotCSAqIEBwYXJhbSByZWdpb25zCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQXR0cmlidXRlVmFsdWVDb250YWluZXIoSXRlcmF0b3IgcmVnaW9ucywgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCXIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSAmJiBnZXRDdXJyZW50Tm9kZSgpLmdldFRleHQocikuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCS8vIHNraXAgdG8gYXR0cmlidXRlIHZhbHVlCi0JCQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKSkgIT0gbnVsbCkgewotCQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvLyBmb3JjZXMgZW1iZWRkZWQgcmVnaW9uIHRvIGJlIHRyYW5zbGF0ZWQKLQkJCQlpZiAociBpbnN0YW5jZW9mIENvbnRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJdHJhbnNsYXRlRW1iZWRkZWRKU1BJbkF0dHJpYnV0ZSgoQ29udGV4dFJlZ2lvbkNvbnRhaW5lcikgcik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBleGFtcGxlOgotCSAqIAotCSAqIDxqc3A6c2NyaXB0bGV0PnNjcmlwdGxldCBqc3AtamF2YSBjb250ZW50IDwhW0NEQVRBWyBtb3JlIGpzcCBqYXZhIF1dPgotCSAqIGpzcC1qYXZhIGNvbnRlbnQuLi4gPCFbQ0RBVEFbIG1vcmUganNwIGphdmEgXV0+IDwvanNwOnNjcmlwdGxldD4KLQkgKiAKLQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTMzNjYKLQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg1OTAgdHJhbnNsYXRlCi0JICogZXZlcnl0aGluZyBpbmJldHdlZW4gPHNjcmlwdGxldD4gdGFncywgd2hpY2ggbWF5IGJlIG1vcmUgdGhhbiBvbmUKLQkgKiByZWdpb24gKGVzcC4gQ0RBVEEpCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyYW5zbGF0ZVhNTEpTUENvbnRlbnQoaW50IHR5cGUpIHsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkciA9IGdldEN1cnJlbnROb2RlKCkuZ2V0TmV4dCgpOwotCQlpbnQgc3RhcnQgPSBzZHIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IHNkci5nZXRFbmRPZmZzZXQoKTsKLQkJU3RyaW5nIHNkclRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZ0J1ZmZlciByZWdpb25UZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyByZWFkIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucyB1bnRpbCA8L2pzcDpzY3JpcHRsZXQ+IG9yIEVPRgotCQl3aGlsZSAoc2RyICE9IG51bGwgJiYgc2RyLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCi0JCQkvLyBzZXR1cCBmb3IgbmV4dCByZWdpb24KLQkJCWlmIChyZWdpb25UZXh0Lmxlbmd0aCgpID09IDApCi0JCQkJc3RhcnQgPSBzZHIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCXNkclRleHQgPSBzZHIuZ2V0VGV4dCgpOwotCi0JCQlpZiAoc2RyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQkJLy8gQ2xlYXIgb3V0IHRoZSBidWZmZXIKLQkJCQlpZiAocmVnaW9uVGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJd3JpdGVUb0J1ZmZlcih0eXBlLCByZWdpb25UZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQpOwotCQkJCQlyZWdpb25UZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCX0KLQkJCQkvLyBqdXN0IHRvIGJlIHNhZmUsIG1ha2Ugc3VyZSBDREFUQSBzdGFydCAmIGVuZCBhcmUgdGhlcmUKLQkJCQlpZiAoc2RyVGV4dC5zdGFydHNXaXRoKCI8IVtDREFUQVsiKSAmJiBzZHJUZXh0LmVuZHNXaXRoKCJdXT4iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQlzdGFydCA9IHNkci5nZXRTdGFydE9mZnNldCgpICsgOTsgLy8gPCFbQ0RBVEFbCi0JCQkJCWVuZCA9IHNkci5nZXRFbmRPZmZzZXQoKSAtIDM7IC8vIF1dPgotCQkJCQlzZHJUZXh0ID0gc2RyVGV4dC5zdWJzdHJpbmcoOSwgc2RyVGV4dC5sZW5ndGgoKSAtIDMpOwotCQkJCQl3cml0ZVRvQnVmZmVyKHR5cGUsIHNkclRleHQsIHN0YXJ0LCBlbmQpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGhhbmRsZSBlbnRpdHkgcmVmZXJlbmNlcwotCQkJCXJlZ2lvblRleHQuYXBwZW5kKEVzY2FwZWRUZXh0VXRpbC5nZXRVbmVzY2FwZWRUZXh0KHNkclRleHQpKTsKLQkJCQllbmQgPSBzZHIuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCQlzZHIgPSBzZHIuZ2V0TmV4dCgpOwotCQl9Ci0KLQkJaWYgKHJlZ2lvblRleHQubGVuZ3RoKCkgPiAwKQotCQkJd3JpdGVUb0J1ZmZlcih0eXBlLCByZWdpb25UZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQpOwotCQlzZXRDdXJyZW50Tm9kZShzZHIpOwotCQlzZXRTb3VyY2VSZWZlcmVuY2VQb2ludCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZVRvQnVmZmVyKGludCB0eXBlLCBTdHJpbmcgY29udGVudCwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kKSB7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBTQ1JJUFRMRVQgOgotCQkJCXRyYW5zbGF0ZVNjcmlwdGxldFN0cmluZyhjb250ZW50LCBnZXRDdXJyZW50Tm9kZSgpLCBqc3BTdGFydCwganNwRW5kIC0ganNwU3RhcnQsIGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVhQUkVTU0lPTiA6Ci0JCQkJdHJhbnNsYXRlRXhwcmVzc2lvblN0cmluZyhjb250ZW50LCBnZXRDdXJyZW50Tm9kZSgpLCBqc3BTdGFydCwganNwRW5kIC0ganNwU3RhcnQsIGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgREVDTEFSQVRJT04gOgotCQkJCXRyYW5zbGF0ZURlY2xhcmF0aW9uU3RyaW5nKGNvbnRlbnQsIGdldEN1cnJlbnROb2RlKCksIGpzcFN0YXJ0LCBqc3BFbmQgLSBqc3BTdGFydCwgZmFsc2UpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ29lcyB0aHJvdWdoIGNvbW1lbnQgcmVnaW9ucywgY2hlY2tzIGlmIGFueSBhcmUgYW4gZW1iZWRkZWQgSlNQCi0JICogY29udGFpbmVyIGlmIGl0IGZpbmRzIG9uZSwgaXQncyBzZW5kcyB0aGUgY29udGFpbmVyIGludG8gdGhlCi0JICogdHJhbnNsYXRpb24gcm91dGluZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVhNTENvbW1lbnROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlJdGVyYXRvciBpdCA9IG5vZGUuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIGNvbW1lbnRSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoaXQgIT0gbnVsbCAmJiBpdC5oYXNOZXh0KCkpIHsKLQkJCWNvbW1lbnRSZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCWlmIChjb21tZW50UmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQl0cmFuc2xhdGVSZWdpb25Db250YWluZXIoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjb21tZW50UmVnaW9uLCBFTUJFRERFRF9KU1ApOyAvLyBpdCdzCi0JCQkJLy8gZW1iZWRkZWQKLQkJCQkvLyBqc3AuLi5pdGVyYXRlCi0JCQkJLy8gcmVnaW9ucy4uLgotCQkJfQotCQkJZWxzZSBpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhULmVxdWFscyhjb21tZW50UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIyMjE1Ci0JCQkJLy8gc3VwcG9ydCBjdXN0b20gdGFncyBoaWRkZW4gaW4gYSBjb21tZW50IHJlZ2lvbgotCQkJCWRlY29kZVNjcmlwdEJsb2NrKG5vZGUuZ2V0RnVsbFRleHQoY29tbWVudFJlZ2lvbiksIG5vZGUuZ2V0U3RhcnRPZmZzZXQoY29tbWVudFJlZ2lvbikpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogZGV0ZXJtaW5lcyB3aGljaCB0eXBlIG9mIEpTUCBub2RlIHRvIHRyYW5zbGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZUpTUE5vZGUoSVRleHRSZWdpb24gcmVnaW9uLCBJdGVyYXRvciByZWdpb25zLCBTdHJpbmcgdHlwZSwgaW50IEpTUFR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOICYmIHJlZ2lvbnMgIT0gbnVsbCkgewotCQkJdHJhbnNsYXRlRGlyZWN0aXZlKHJlZ2lvbnMpOwotCQl9Ci0JCWVsc2UgewotCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRlbnRSZWdpb24gPSBudWxsOwotCQkJaWYgKEpTUFR5cGUgPT0gU1RBTkRBUkRfSlNQICYmIChzZXRDdXJyZW50Tm9kZShnZXRDdXJyZW50Tm9kZSgpLmdldE5leHQoKSkpICE9IG51bGwpIHsKLQkJCQljb250ZW50UmVnaW9uID0gZ2V0Q3VycmVudE5vZGUoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKEpTUFR5cGUgPT0gRU1CRURERURfSlNQICYmIHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCXRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5CbG9jaygoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByZWdpb24sIHJlZ2lvbnMpOwotCQkJCS8vIGVuc3VyZSB0aGUgcmVzdCBvZiB0aGlzIG1ldGhvZCB3b24ndCBiZSBjYWxsZWQKLQkJCX0KLQkJCS8qIE5PVEU6IHRoZSB0eXBlIGhlcmUgaXMgb2YgdGhlIG5vZGUgcHJlY2VkaW5nIHRoZSBjdXJyZW50IG5vZGUKLQkJCSAqIHRodXMgbXVzdCBjaGVjayB0byBzZWUgaWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBKU1AgY2xvc2UsIGlmIGl0IGlzCi0JCQkgKiB0aGVuIHRoZSBKU1AgaXMgc29tZXRoaW5nIGFraW4gdG8gPCUlPiBhbmQgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkCi0JCQkgKiAoQnVnIDE4OTMxOCkKLQkJCSAqLwotCQkJaWYgKGNvbnRlbnRSZWdpb24gIT0gbnVsbCAmJiBjb250ZW50UmVnaW9uLmdldFR5cGUoKSAhPSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UpIHsKLQkJCQlpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB7Ci0JCQkJCXRyYW5zbGF0ZUV4cHJlc3Npb24oY29udGVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHsKLQkJCQkJdHJhbnNsYXRlRGVjbGFyYXRpb24oY29udGVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQgfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHsKLQkJCQkJdHJhbnNsYXRlU2NyaXB0bGV0KGNvbnRlbnRSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHRoaXMgaXMgdGhlIGNhc2Ugb2YgYW4gYXR0cmlidXRlIHcvIG5vIHJlZ2lvbiA8cAotCQkJCS8vIGFsaWduPSI8JSU+Ij4KLQkJCQlzZXRDdXJzb3JPd25lcihnZXRKU1BUeXBlRm9yUmVnaW9uKHJlZ2lvbikpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgdHJhbnNsYXRlRUwoU3RyaW5nIGVsVGV4dCwgU3RyaW5nIGRlbGltLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlLCBpbnQgY29udGVudFN0YXJ0LCBpbnQgY29udGVudExlbmd0aCkgewotCQlJSlNQRUxUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBnZXRFTFRyYW5zbGF0b3IoKTsKLQkJaWYgKG51bGwgIT0gdHJhbnNsYXRvcikgewotCQkJTGlzdCBlbFByb2JsZW1zID0gdHJhbnNsYXRvci50cmFuc2xhdGVFTChlbFRleHQsIGRlbGltLCBjdXJyZW50Tm9kZSwgY29udGVudFN0YXJ0LCBjb250ZW50TGVuZ3RoLCBmVXNlckVMRXhwcmVzc2lvbnMsIGZVc2VyRUxSYW5nZXMsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJZlRyYW5zbGF0aW9uUHJvYmxlbXMuYWRkQWxsKGVsUHJvYmxlbXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzY292ZXIgYW5kIGluc3RhbnRpYXRlIGFuIEVMIHRyYW5zbGF0b3IuCi0JICovCi0JcHVibGljIElKU1BFTFRyYW5zbGF0b3IgZ2V0RUxUcmFuc2xhdG9yKCkgewotCQlpZiAoZkVMVHJhbnNsYXRvciA9PSBudWxsKSB7Ci0KLQkJCS8qCi0JCQkgKiBuYW1lIG9mIHBsdWdpbiB0aGF0IGV4cG9zZXMgdGhpcyBleHRlbnNpb24gcG9pbnQKLQkJCSAqLwotCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChKU1BfQ09SRV9QTFVHSU5fSUQsIEVMX1RSQU5TTEFUT1JfRVhURU5TSU9OX05BTUUpOyAvLyAtCi0JCQkvLyBleHRlbnNpb24KLQkJCS8vIGlkCi0KLQkJCS8vIEl0ZXJhdGUgb3ZlciBhbGwgZGVjbGFyZWQgZXh0ZW5zaW9ucyBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC4KLQkJCS8vIEEgc2luZ2xlIHBsdWdpbiBtYXkgZXh0ZW5kIHRoZSBleHRlbnNpb24gcG9pbnQgbW9yZSB0aGFuIG9uY2UsCi0JCQkvLyBhbHRob3VnaCBpdCdzIG5vdCByZWNvbW1lbmRlZC4KLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBiZXN0VHJhbnNsYXRvciA9IG51bGw7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGN1ckV4dGVuc2lvbiA9IDA7IGN1ckV4dGVuc2lvbiA8IGV4dGVuc2lvbnMubGVuZ3RoOyBjdXJFeHRlbnNpb24rKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tjdXJFeHRlbnNpb25dOwotCi0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gdHJhbnNsYXRvcnMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgY3VyVHJhbnNsYXRvciA9IDA7IGN1clRyYW5zbGF0b3IgPCB0cmFuc2xhdG9ycy5sZW5ndGg7IGN1clRyYW5zbGF0b3IrKykgewotCi0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbFRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yc1tjdXJUcmFuc2xhdG9yXTsKLQotCQkJCQlpZiAoIUVMX1RSQU5TTEFUT1JfRVhURU5TSU9OX05BTUUuZXF1YWxzKGVsVHJhbnNsYXRvci5nZXROYW1lKCkpKSB7IC8vIC0KLQkJCQkJCS8vIG5hbWUKLQkJCQkJCS8vIG9mCi0JCQkJCQkvLyBjb25maWdFbGVtZW50Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCVN0cmluZyBpZFN0cmluZyA9IGVsVHJhbnNsYXRvci5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKG51bGwgIT0gaWRTdHJpbmcgJiYgaWRTdHJpbmcuZXF1YWxzKGZFTFRyYW5zbGF0b3JJRCkgfHwgKG51bGwgPT0gYmVzdFRyYW5zbGF0b3IgJiYgREVGQVVMVF9KU1BfRUxfVFJBTlNMQVRPUl9JRC5lcXVhbHMoaWRTdHJpbmcpKSkgewotCQkJCQkJYmVzdFRyYW5zbGF0b3IgPSBlbFRyYW5zbGF0b3I7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChudWxsICE9IGJlc3RUcmFuc2xhdG9yKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJT2JqZWN0IGV4ZWNFeHQgPSBiZXN0VHJhbnNsYXRvci5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChleGVjRXh0IGluc3RhbmNlb2YgSUpTUEVMVHJhbnNsYXRvcikgewotCQkJCQkJcmV0dXJuIGZFTFRyYW5zbGF0b3IgPSAoSUpTUEVMVHJhbnNsYXRvcikgZXhlY0V4dDsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmRUxUcmFuc2xhdG9yOwotCX0KLQotCS8qKgotCSAqIFBhc3MgdGhlIElUZXh0UmVnaW9uQ29sbGVjdGlvbiB3aGljaCBpcyB0aGUgZW1iZWRkZWQgcmVnaW9uCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbnMKLQkgKiAgICAgICAgICAgIGl0ZXJhdG9yIGZvciBjb2xsZWN0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5CbG9jayhJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29sbGVjdGlvbiwgSXRlcmF0b3IgcmVnaW9ucykgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCXJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlpZiAoaXNKU1AocmVnaW9uLmdldFR5cGUoKSkpCi0JCQkJYnJlYWs7Ci0JCQlyZWdpb24gPSBudWxsOwotCQl9Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJdHJhbnNsYXRlRW1iZWRkZWRKU1BJbkF0dHJpYnV0ZShjb2xsZWN0aW9uKTsKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjYzNzcKLQkJCS8vIGFsbCBvZiBjb2xsZWN0aW9uIHdhcyB0cmFuc2xhdGVkIHNvIGp1c3QgZmluaXNoIG9mZiBpdGVyYXRvcgotCQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKQotCQkJCXJlZ2lvbnMubmV4dCgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUcmFuc2xhdGVzIGFsbCBlbWJlZGRlZCBqc3AgcmVnaW9ucyBpbiBlbWJlZGRlZENvbnRhaW5lciBmb3IgZXhhbXBsZToKLQkgKiA8YSBocmVmPSJpbmRleC5qc3A/cD08JT1hYmMlPmI9PCU9eHl6JT4iPmFiYzwvYT4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhbnNsYXRlRW1iZWRkZWRKU1BJbkF0dHJpYnV0ZShJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gZW1iZWRkZWRDb250YWluZXIpIHsKLQkJLy8gVEhJUyBNRVRIT0QgSVMgQSBGSVggRk9SCi0JCS8vIGpzcCBlbWJlZGRlZCBpbiBhdHRyaWJ1dGUgcmVnaW9ucwotCQkvLyBsb29wIGFsbCByZWdpb25zCi0JCUlUZXh0UmVnaW9uTGlzdCBlbWJlZGRlZFJlZ2lvbnMgPSBlbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIGRlbGltID0gbnVsbDsKLQkJSVRleHRSZWdpb24gY29udGVudCA9IG51bGw7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJU3RyaW5nIHF1b3RldHlwZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW1iZWRkZWRSZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0KLQkJCS8vIHBvc3NpYmxlIGRlbGltaXRlciwgY2hlY2sgbGF0ZXIKLQkJCWRlbGltID0gZW1iZWRkZWRSZWdpb25zLmdldChpKTsKLQkJCXR5cGUgPSBkZWxpbS5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSApIHsKLQkJCQlTdHJpbmcgZnVsbFRhZ05hbWUgPSBlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGRlbGltKTsKLQkJCQlpZiAoZnVsbFRhZ05hbWUuaW5kZXhPZignOicpID4gLTEgJiYgIWZ1bGxUYWdOYW1lLnN0YXJ0c1dpdGgoSlNQX1BSRUZJWCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcHJldlJlZ2lvbiA9bnVsbDsKLQkJCQkJaWYgKGk+MCkKLQkJCQkJCXByZXZSZWdpb24gPSBlbWJlZGRlZFJlZ2lvbnMuZ2V0KGktMSk7Ci0JCQkJCWFkZEN1c3RvbVRhZ2xpYlZhcmlhYmxlcyhmdWxsVGFnTmFtZSwgZW1iZWRkZWRDb250YWluZXIscHJldlJlZ2lvbixpKzEpOyAvLyBpdCBtYXkgYmUgYSBjdXN0b20gdGFnCi0JCQkJfQotCQkJfQotCQkJaWYodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUgfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUKLQkJCQl8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSkKLQkJCQlxdW90ZXR5cGUgPSB0eXBlOwotCi0JCQkvLyBjaGVjayBuZXh0IHJlZ2lvbiB0byBzZWUgaWYgaXQncyBjb250ZW50Ci0JCQlpZiAoaSArIDEgPCBlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBlbWJlZGRlZFJlZ2lvbnMuZ2V0KGkgKyAxKS5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQgfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfQ09OVEVOVCkKLQkJCQkJY29udGVudCA9IGVtYmVkZGVkUmVnaW9ucy5nZXQoaSArIDEpOwotCQkJfQotCi0JCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJaW50IGNvbnRlbnRTdGFydCA9IGVtYmVkZGVkQ29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KGNvbnRlbnQpOwotCQkJCWludCByU3RhcnQgPSBmQ3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIGNvbnRlbnRTdGFydDsKLQkJCQlpbnQgckVuZCA9IGZDdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpICsgZW1iZWRkZWRDb250YWluZXIuZ2V0RW5kT2Zmc2V0KGNvbnRlbnQpOwotCi0JCQkJYm9vbGVhbiBpblRoaXNSZWdpb24gPSByU3RhcnQgPD0gZlNvdXJjZVBvc2l0aW9uICYmIHJFbmQgPj0gZlNvdXJjZVBvc2l0aW9uOwotCQkJCS8vIGludCBqc3BQb3NpdGlvblN0YXJ0ID0gZkN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgKwotCQkJCS8vIGNvbnRlbnRTdGFydDsKLQotCQkJCWlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4pIHsKLQkJCQkJZkxhc3RKU1BUeXBlID0gRVhQUkVTU0lPTjsKLQkJCQkJLy8gdHJhbnNsYXRlRXhwcmVzc2lvblN0cmluZyhlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGNvbnRlbnQpLAotCQkJCQkvLyBmQ3VycmVudE5vZGUsIGNvbnRlbnRTdGFydCwgY29udGVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJCXRyYW5zbGF0ZUV4cHJlc3Npb25TdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwgZW1iZWRkZWRDb250YWluZXIsIGNvbnRlbnRTdGFydCwgY29udGVudC5nZXRMZW5ndGgoKSwgcXVvdGV0eXBlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHsKLQkJCQkJZkxhc3RKU1BUeXBlID0gU0NSSVBUTEVUOwotCQkJCQkvLyB0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwKLQkJCQkJLy8gZkN1cnJlbnROb2RlLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJCQl0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwgZW1iZWRkZWRDb250YWluZXIsIGNvbnRlbnRTdGFydCwgY29udGVudC5nZXRMZW5ndGgoKSwgZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSB7Ci0JCQkJCWZMYXN0SlNQVHlwZSA9IERFQ0xBUkFUSU9OOwotCQkJCQkvLyB0cmFuc2xhdGVEZWNsYXJhdGlvblN0cmluZyhlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGNvbnRlbnQpLAotCQkJCQkvLyBmQ3VycmVudE5vZGUsIGNvbnRlbnRTdGFydCwgY29udGVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJCXRyYW5zbGF0ZURlY2xhcmF0aW9uU3RyaW5nKGVtYmVkZGVkQ29udGFpbmVyLmdldFRleHQoY29udGVudCksIGVtYmVkZGVkQ29udGFpbmVyLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCksIGZhbHNlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfT1BFTikgewotCQkJCQlmTGFzdEpTUFR5cGUgPSBFWFBSRVNTSU9OOwotCQkJCQl0cmFuc2xhdGVFTChlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGNvbnRlbnQpLCBlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGRlbGltKSwgZkN1cnJlbnROb2RlLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQotCQkJCS8vIGNhbGN1bGF0ZSByZWxhdGl2ZSBvZmZzZXQgaW4gYnVmZmVyCi0JCQkJaWYgKGluVGhpc1JlZ2lvbikgewotCQkJCQlzZXRDdXJzb3JPd25lcihmTGFzdEpTUFR5cGUpOwotCQkJCQlpbnQgY3VycmVudEJ1ZmZlckxlbmd0aCA9IGdldEN1cnNvck93bmVyKCkubGVuZ3RoKCk7Ci0JCQkJCXNldFJlbGF0aXZlT2Zmc2V0KChmU291cmNlUG9zaXRpb24gLSBjb250ZW50U3RhcnQpICsgY3VycmVudEJ1ZmZlckxlbmd0aCk7Ci0JCQkJCWlmIChmTGFzdEpTUFR5cGUgPT0gRVhQUkVTU0lPTikgewotCQkJCQkJLy8gaWYgYW4gZXhwcmVzc2lvbiwgYWRkIHRoZW4gbGVuZ3RoIG9mIHRoZSBlbmNsb3NpbmcKLQkJCQkJCS8vIHBhcmVuLi4KLQkJCQkJCXNldEN1cnNvckluRXhwcmVzc2lvbih0cnVlKTsKLQkJCQkJCXNldFJlbGF0aXZlT2Zmc2V0KGdldFJlbGF0aXZlT2Zmc2V0KCkgKyBFWFBSRVNTSU9OX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0eXBlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGZMYXN0SlNQVHlwZSA9IFNDUklQVExFVDsKLQotCS8qKgotCSAqIEpTUFR5cGUgaXMgb25seSB1c2VkIGludGVybmFsbHkgaW4gdGhpcyBjbGFzcyB0byBkZXNjcmliZSB0eWUgdHlwZSBvZgotCSAqIHJlZ2lvbiB0byBiZSB0cmFuc2xhdGVkCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0SlNQVHlwZUZvclJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpbnQgdHlwZSA9IFNDUklQVExFVDsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKQotCQkJdHlwZSA9IFNDUklQVExFVDsKLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKQotCQkJdHlwZSA9IEVYUFJFU1NJT047Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pCi0JCQl0eXBlID0gREVDTEFSQVRJT047Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpCi0JCQl0eXBlID0gZkxhc3RKU1BUeXBlOwotCQkvLyByZW1lbWJlciB0aGUgbGFzdCB0eXBlLCBpbiBjYXNlIHRoZSBuZXh0IHR5cGUgdGhhdCBjb21lcyBpbiBpcwotCQkvLyBKU1BfQ09OVEVOVAotCQlmTGFzdEpTUFR5cGUgPSB0eXBlOwotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAvKiA8JUAgJT4gLyogbmVlZCB0byBwYXNzIGluIHRoZSBkaXJlY3RpdmUgdGFnIHJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZURpcmVjdGl2ZShJdGVyYXRvciByZWdpb25zKSB7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgcmVnaW9uVGV4dCwgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKSkgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsgLy8gY291bGQKLQkJCS8vIGJlCi0JCQkvLyBYTUxfQ09OVEVOVAotCQkJLy8gPQotCQkJLy8gIiIsCi0JCQkvLyBza2lwcwotCQkJLy8gYXR0cnM/Ci0JCQlyZWdpb25UZXh0ID0gZ2V0Q3VycmVudE5vZGUoKS5nZXRUZXh0KHIpOwotCQkJaWYgKHJlZ2lvblRleHQuZXF1YWxzKCJ0YWdsaWIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gYWRkIGN1c3RvbSB0YWcgYmxvY2sgbWFya2VycyBoZXJlCi0JCQkJaGFuZGxlVGFnbGliKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVGV4dC5lcXVhbHMoImluY2x1ZGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGZpbGVMb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gQ01WQyAyNTgzMTEKLQkJCQkvLyBQTVIgMTgzNjgsIEI2NjMKLQkJCQkvLyBza2lwIHRvIHJlcXVpcmVkICJmaWxlIiBhdHRyaWJ1dGUsIHNob3VsZCBiZSBzYWZlIGJlY2F1c2UKLQkJCQkvLyAiZmlsZSIgaXMgdGhlIG9ubHkgYXR0cmlidXRlIGZvciB0aGUgaW5jbHVkZSBkaXJlY3RpdmUKLQkJCQl3aGlsZSAociAhPSBudWxsICYmIHJlZ2lvbnMuaGFzTmV4dCgpICYmICFyLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSkgewotCQkJCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCQl9Ci0JCQkJZmlsZUxvY2F0aW9uID0gZ2V0QXR0cmlidXRlVmFsdWUociwgcmVnaW9ucyk7Ci0JCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKQotCQkJCQloYW5kbGVJbmNsdWRlRmlsZShmaWxlTG9jYXRpb24pOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVGV4dC5lcXVhbHMoInBhZ2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNsYXRlUGFnZURpcmVjdGl2ZUF0dHJpYnV0ZXMocmVnaW9ucywgZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UZXh0LmVxdWFscygidGFnIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIHNvbWUgYXR0cmlidXRlcyBvdmVybGFwLCBzbyBib3RoIGFyZSBoYW5kbGVkIGluIHRoaXMgbWV0aG9kCi0JCQkJdHJhbnNsYXRlUGFnZURpcmVjdGl2ZUF0dHJpYnV0ZXMocmVnaW9ucywgZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UZXh0LmVxdWFscygidmFyaWFibGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNsYXRlVmFyaWFibGVEaXJlY3RpdmVBdHRyaWJ1dGVzKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVGV4dC5lcXVhbHMoImF0dHJpYnV0ZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cmFuc2xhdGVBdHRyaWJ1dGVEaXJlY3RpdmVBdHRyaWJ1dGVzKHJlZ2lvbnMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRyYW5zbGF0ZUF0dHJpYnV0ZURpcmVjdGl2ZUF0dHJpYnV0ZXMoSXRlcmF0b3IgcmVnaW9ucykgewotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJOYW1lLCBhdHRyVmFsdWU7Ci0KLQkJU3RyaW5nIHZhclR5cGUgPSAiamF2YS5sYW5nLlN0cmluZyI7IC8vJE5PTi1OTFMtMSQgLy8gdGhlIGRlZmF1bHQgY2xhc3MuLi4KLQkJU3RyaW5nIHZhck5hbWUgPSBudWxsOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiIjsvLyROT04tTkxTLTEkIAotCQlib29sZWFuIGlzRnJhZ21lbnQgPSBmYWxzZTsKLQotCQkvLyBpdGVyYXRlIGFsbCBhdHRyaWJ1dGVzCi0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB7Ci0JCQlhdHRyTmFtZSA9IGF0dHJWYWx1ZSA9IG51bGw7Ci0JCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQlhdHRyTmFtZSA9IGdldEN1cnJlbnROb2RlKCkuZ2V0VGV4dChyKS50cmltKCk7Ci0JCQkJaWYgKGF0dHJOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCQlhdHRyVmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChnZXRDdXJyZW50Tm9kZSgpLmdldFRleHQocikpOwotCQkJCQkJfQotCQkJCQkJLy8gaGFzIGVxdWFscywgYnV0IG5vIHZhbHVlPwotCQkJCQl9Ci0JCQkJCWlmIChhdHRyTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpKSB7Ci0JCQkJCQl2YXJUeXBlID0gYXR0clZhbHVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscyhKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBR01FTlQpKSB7Ci0JCQkJCQlpc0ZyYWdtZW50ID0gQm9vbGVhbi52YWx1ZU9mKGF0dHJWYWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FKSkgewotCQkJCQkJdmFyTmFtZSA9IGF0dHJWYWx1ZTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RFU0NSSVBUSU9OKSkgewotCQkJCQkJZGVzY3JpcHRpb24gPSBhdHRyVmFsdWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHZhck5hbWUgIT0gbnVsbCkgewotCQkJaWYgKGlzRnJhZ21lbnQpIHsKLQkJCQkvLyAyLjA6SlNQLjguNS4yCi0JCQkJdmFyVHlwZSA9ICJqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSnNwRnJhZ21lbnQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJpbmcgZGVjbGFyYXRpb24gPSBuZXcgVGFnbGliVmFyaWFibGUodmFyVHlwZSwgdmFyTmFtZSwgIiIsIGRlc2NyaXB0aW9uKS5nZXREZWNsYXJhdGlvblN0cmluZyh0cnVlLCBUYWdsaWJWYXJpYWJsZS5NX1BSSVZBVEUpOyAvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRUb0J1ZmZlcihkZWNsYXJhdGlvbiwgZlVzZXJEZWNsYXJhdGlvbnMsIGZhbHNlLCBmQ3VycmVudE5vZGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRyYW5zbGF0ZVZhcmlhYmxlRGlyZWN0aXZlQXR0cmlidXRlcyhJdGVyYXRvciByZWdpb25zKSB7Ci0JCS8qCi0JCSAqIFNob3VsZG4ndCBjcmVhdGUgYSBzY3JpcHRpbmcgdmFyaWFibGUgaW4gKnRoaXMqIHRhZyBmaWxlJ3MKLQkJICogdHJhbnNsYXRpb24sIG9ubHkgaW4gSlNQIGZpbGVzIHRoYXQgdXNlIGl0IC0KLQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4ODc4MAotCQkgKi8KLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBpZGVhbGx5IG9ubHkgYmUgY2FsbGVkIG9uY2UgcGVyIHJ1biB0aHJvdWdoCi0JICogSlNQVHJhbnNsYXRvciBUaGlzIGlzIGludGVuZGVkIGZvciB1c2UgYnkgaW5uZXIgaGVscGVyIGNsYXNzZXMgdGhhdAotCSAqIG5lZWQgdG8gYWRkIGJsb2NrIG1hcmtlcnMgdG8gdGhlaXIgb3duIHBhcnNlcnMuIFRoaXMgbWV0aG9kIG9ubHkgYWRkcwotCSAqIG1hcmtlcnMgdGhhdCBjYW1lIGZyb20gPEB0YWdsaWI+IGRpcmVjdGl2ZXMsIChub3QgPEBpbmNsdWRlPiksIHNpbmNlCi0JICogaW5jbHVkZSBmaWxlIHRhZ2xpYnMgYXJlIGhhbmRsZWQgb24gdGhlIGZseSB3aGVuIHRoZXkgYXJlIGVuY291bnRlcmVkLiAqCi0JICogQHBhcmFtIHJlZ2lvbnMKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIGRvZXMgbm90IHByb3Blcmx5IGhhbmRsZSBwcmVmaXhlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVRhZ2xpYigpIHsKLQkJLy8gZ2V0L2NyZWF0ZSBUTERDTURvY3VtZW50Ci0JCVRMRENNRG9jdW1lbnRNYW5hZ2VyIG1nciA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJTGlzdCB0cmFja2VycyA9IG1nci5nZXRDTURvY3VtZW50VHJhY2tlcnMoZ2V0Q3VycmVudE5vZGUoKS5nZXRFbmQoKSk7Ci0JCQlJdGVyYXRvciBpdCA9IHRyYWNrZXJzLml0ZXJhdG9yKCk7Ci0JCQlDTURvY3VtZW50VHJhY2tlciB0cmFja2VyID0gbnVsbDsKLQkJCUl0ZXJhdG9yIHRhZ2xpYlJlZ2lvbnMgPSBudWxsOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IG51bGw7Ci0JCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQl0cmFja2VyID0gKENNRG9jdW1lbnRUcmFja2VyKSBpdC5uZXh0KCk7Ci0JCQkJc2RSZWdpb24gPSB0cmFja2VyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCS8vIHNpbmNlIG1heSBiZSBjYWxsIGZyb20gYW5vdGhlciB0aHJlYWQgKGxpa2UgYSBiYWNrZ3JvdW5kCi0JCQkJLy8gam9iKQotCQkJCS8vIHRoaXMgY2hlY2sgaXMgdG8gYmUgc2FmZXIKLQkJCQlpZiAoc2RSZWdpb24gIT0gbnVsbCAmJiAhc2RSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCQkJdGFnbGliUmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoIXNkUmVnaW9uLmlzRGVsZXRlZCgpICYmIHRhZ2xpYlJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJCQlyID0gKElUZXh0UmVnaW9uKSB0YWdsaWJSZWdpb25zLm5leHQoKTsKLQkJCQkJCWlmIChyLmdldFR5cGUoKS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSkgewotCQkJCQkJCVN0cmluZyB0ZXh0ID0gc2RSZWdpb24uZ2V0VGV4dChyKTsKLQkJCQkJCQlpZiAoSlNQMTJUTEROYW1lcy5UQUdMSUIuZXF1YWxzKHRleHQpIHx8IEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIuZXF1YWxzKHRleHQpKSB7Ci0JCQkJCQkJCWFkZEJsb2NrTWFya2Vycyh0cmFja2VyLmdldERvY3VtZW50KCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGlkZWFsbHkgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgcnVuIHRocm91Z2gKLQkgKiBKU1BUcmFuc2xhdG9yIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBpbm5lciBoZWxwZXIgY2xhc3NlcyB0aGF0Ci0JICogbmVlZCB0byBhZGQgYmxvY2sgbWFya2VycyB0byB0aGVpciBvd24gcGFyc2Vycy4gVGhpcyBtZXRob2Qgb25seSBhZGRzCi0JICogbWFya2VycyB0aGF0IGNhbWUgZnJvbSA8QHRhZ2xpYj4gZGlyZWN0aXZlcywgKG5vdCA8QGluY2x1ZGU+KSwgc2luY2UKLQkgKiBpbmNsdWRlIGZpbGUgdGFnbGlicyBhcmUgaGFuZGxlZCBvbiB0aGUgZmx5IHdoZW4gdGhleSBhcmUgZW5jb3VudGVyZWQuICoKLQkgKiBAcGFyYW0gcmVnaW9ucwotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVUYWdsaWIoU3RyaW5nIHByZWZpeCkgewotCQkvLyBnZXQvY3JlYXRlIFRMRENNRG9jdW1lbnQKLQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgbWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgdHJhY2tlcnMgZm9yIHRoZSBDTURvY3VtZW50cyBlbmFibGVkIGF0IHRoaXMgb2Zmc2V0Ci0JCQlMaXN0IHRyYWNrZXJzID0gbWdyLmdldENNRG9jdW1lbnRUcmFja2VycyhnZXRDdXJyZW50Tm9kZSgpLmdldEVuZCgpKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdHJhY2tlcnMuaXRlcmF0b3IoKTsKLQkJCUNNRG9jdW1lbnRUcmFja2VyIHRyYWNrZXIgPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXRyYWNrZXIgPSAoQ01Eb2N1bWVudFRyYWNrZXIpIGl0Lm5leHQoKTsKLQkJCQlhZGRCbG9ja01hcmtlcnMocHJlZml4ICsgIjoiLCB0cmFja2VyLmdldERvY3VtZW50KCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIGFkZHMgYmxvY2sgbWFya2VycyB0byBKU1BUcmFuc2xhdG9yJ3MgYmxvY2sgbWFya2VyIGxpc3QgZm9yIGFsbAotCSAqIGVsZW1lbnRzIGluIGRvYyBAcGFyYW0gZG9jCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQmxvY2tNYXJrZXJzKENNRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGVsZW1lbnRzID0gZG9jLmdldEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCUNNTm9kZSBub2RlID0gbnVsbDsKLQkJCXdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlub2RlID0gKENNTm9kZSkgZWxlbWVudHMubmV4dCgpOwotCQkJCWdldEJsb2NrTWFya2VycygpLmFkZChuZXcgQmxvY2tNYXJrZXIobm9kZS5nZXROb2RlTmFtZSgpLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgdHJ1ZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBhZGRzIGJsb2NrIG1hcmtlcnMgdG8gSlNQVHJhbnNsYXRvcidzIGJsb2NrIG1hcmtlciBsaXN0IGZvciBhbGwKLQkgKiBlbGVtZW50cyBpbiBkb2MgQHBhcmFtIGRvYwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJsb2NrTWFya2VycyhTdHJpbmcgcHJlZml4LCBDTURvY3VtZW50IGRvYykgewotCQlpZiAoZG9jLmdldEVsZW1lbnRzKCkuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlJdGVyYXRvciBlbGVtZW50cyA9IGRvYy5nZXRFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQlDTU5vZGUgbm9kZSA9IG51bGw7Ci0JCQl3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0JCQkJbm9kZSA9IChDTU5vZGUpIGVsZW1lbnRzLm5leHQoKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRMREVsZW1lbnREZWNsYXJhdGlvbiAmJiAoKFRMREVsZW1lbnREZWNsYXJhdGlvbikgbm9kZSkuZ2V0Qm9keWNvbnRlbnQoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVCkpCi0JCQkJCWdldEJsb2NrTWFya2VycygpLmFkZChuZXcgQmxvY2tNYXJrZXIocHJlZml4ICsgbm9kZS5nZXROb2RlTmFtZSgpLCBudWxsLCBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQsIHRydWUpKTsKLQkJCQllbHNlCi0JCQkJCWdldEJsb2NrTWFya2VycygpLmFkZChuZXcgQmxvY2tNYXJrZXIocHJlZml4ICsgbm9kZS5nZXROb2RlTmFtZSgpLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgdHJ1ZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgciBpcyBhbiBhdHRyaWJ1dGUgbmFtZSByZWdpb24sIHRoaXMgbWV0aG9kIHdpbGwgc2FmZWx5IHJldHVybiB0aGUKLQkgKiB2YWx1ZSBmb3IgdGhhdCBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIHIKLQkgKiBAcGFyYW0gcmVtYWluaW5nUmVnaW9ucwotCSAqIEByZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIG5hbWUgKHIpLCBvciBudWxsIGlmIGlzbid0IG9uZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoSVRleHRSZWdpb24gciwgSXRlcmF0b3IgcmVtYWluaW5nUmVnaW9ucykgewotCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCWlmIChyZW1haW5pbmdSZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVtYWluaW5nUmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAocmVtYWluaW5nUmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlbWFpbmluZ1JlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJcmV0dXJuIFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKGdldEN1cnJlbnROb2RlKCkuZ2V0VGV4dChyKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHRha2VzIGFuIGl0ZXJhdG9yIG9mIHRoZSBhdHRyaWJ1dGVzIG9mIGEgcGFnZSBkaXJlY3RpdmUgYW5kIHRoZQotCSAqIGRpcmVjdGl2ZSBpdHNlbGYuIFRoZSBpdGVyYXRvciBpcyB1c2VkIGluIGNhc2UgaXQgY2FuIGJlIG9wdGltaXplZCwgYnV0Ci0JICogdGhlIGRvY3VtZW50UmVnaW9uIGlzIHN0aWxsIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGF0IHRoZSB2YWx1ZXMgYXJlCi0JICogZXh0cmFjdGVkIGZyb20gdGhlIGNvcnJlY3QgdGV4dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVQYWdlRGlyZWN0aXZlQXR0cmlidXRlcyhJdGVyYXRvciByZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgYXR0ck5hbWUsIGF0dHJWYWx1ZTsKLQkJLy8gaXRlcmF0ZSBhbGwgYXR0cmlidXRlcwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpICE9IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgewotCQkJYXR0ck5hbWUgPSBhdHRyVmFsdWUgPSBudWxsOwotCQkJaWYgKHIuZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpKSB7Ci0KLQkJCQlhdHRyTmFtZSA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQocikudHJpbSgpOwotCQkJCWlmIChhdHRyTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKSkgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCQkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKSkgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0KLQkJCQkJCQlhdHRyVmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHIpKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGhhcyBlcXVhbHMsIGJ1dCBubyB2YWx1ZT8KLQkJCQkJfQotCQkJCQlzZXREaXJlY3RpdmVBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0cyB0aGUgYXBwcm9wcmlhdGUgcGFnZS90YWcgZGlyZWN0aXZlIGF0dHJpYnV0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERpcmVjdGl2ZUF0dHJpYnV0ZShTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBhdHRyVmFsdWUpIHsKLQkJaWYgKGF0dHJWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyB1c2VzIGRlZmF1bHQgKGlmIHRoZXJlIHdhcyBvbmUpCi0JCWlmIChhdHRyTmFtZS5lcXVhbHMoImV4dGVuZHMiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlmU3VwZXJjbGFzcyA9IGF0dHJWYWx1ZTsKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImltcG9ydCIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCWFkZEltcG9ydHMoYXR0clZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoInNlc3Npb24iKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlmSXNJbkFTZXNzaW9uID0gQm9vbGVhbi52YWx1ZU9mKGF0dHJWYWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJidWZmZXIiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQkvLyBpZ25vcmUgZm9yIG5vdwotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiYXV0b0ZsdXNoIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJLy8gaWdub3JlIGZvciBub3cKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImlzVGhyZWFkU2FmZSIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCS8vIGZUaHJlYWRTYWZlID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoYXR0clZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiaXNFcnJvclBhZ2UiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlmSXNFcnJvclBhZ2UgPSBCb29sZWFuLnZhbHVlT2YoYXR0clZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUluY2x1ZGVGaWxlKFN0cmluZyBmaWxlbmFtZSkgewotCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCAmJiBmUHJvY2Vzc0luY2x1ZGVzKSB7Ci0JCQlJUGF0aCBtb2RlbFBhdGggPSBnZXRNb2RlbFBhdGgoKTsKLQkJCUlQYXRoIGJhc2VQYXRoID0gbW9kZWxQYXRoOwotCQkJaWYgKGJhc2VQYXRoICE9IG51bGwpIHsKLQkJCQkvKgotCQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjc1NzYKLQkJCQkgKiAKLQkJCQkgKiBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgaW5jbHVkZWQgZnJhZ21lbnQgc2hvdWxkIHVzZSB0aGUgZmlsZQotCQkJCSAqIGNvbnRhaW5pbmcgdGhlIGRpcmVjdGl2ZSBhcyB0aGUgYmFzZSByZWZlcmVuY2UsIG5vdCBhbHdheXMKLQkJCQkgKiB0aGUgbWFpbiBKU1AgYmVpbmcgaW52b2tlZC4gVmVyaWZpZWQgYmVoYXZpb3Igd2l0aCBBcGFjaGUKLQkJCQkgKiBUb21jYXQgNS41LjIwLgotCQkJCSAqLwotCQkJCWlmICghZ2V0SW5jbHVkZXMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJYmFzZVBhdGggPSBuZXcgUGF0aCgoU3RyaW5nKSBnZXRJbmNsdWRlcygpLnBlZWsoKSk7Ci0JCQkJfQotCQkJCVN0cmluZyBmaWxlUGF0aFN0cmluZyA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShiYXNlUGF0aCwgZmlsZW5hbWUpLnRvU3RyaW5nKCk7Ci0JCQkJZkluY2x1ZGVkUGF0aHMuYWRkKGZpbGVQYXRoU3RyaW5nKTsKLQotCQkJCWlmICghZ2V0SW5jbHVkZXMoKS5jb250YWlucyhmaWxlUGF0aFN0cmluZykgJiYgIWZpbGVQYXRoU3RyaW5nLmVxdWFscyhtb2RlbFBhdGgudG9TdHJpbmcoKSkpIHsKLQkJCQkJZ2V0SW5jbHVkZXMoKS5wdXNoKGZpbGVQYXRoU3RyaW5nKTsKLQkJCQkJSlNQSW5jbHVkZVJlZ2lvbkhlbHBlciBoZWxwZXIgPSBuZXcgSlNQSW5jbHVkZVJlZ2lvbkhlbHBlcih0aGlzLCB0cnVlKTsKLQkJCQkJLy8gU2hvdWxkIHdlIGNvbnNpZGVyIHByZWx1ZGVzIG9uIHRoaXMgc2VnbWVudD8KLQkJCQkJaGVscGVyLnBhcnNlKGZpbGVQYXRoU3RyaW5nKTsKLQkJCQkJZ2V0SW5jbHVkZXMoKS5wb3AoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0YWNrIGdldEluY2x1ZGVzKCkgewotCQlpZiAoZkluY2x1ZGVzID09IG51bGwpCi0JCQlmSW5jbHVkZXMgPSBuZXcgU3RhY2soKTsKLQkJcmV0dXJuIGZJbmNsdWRlczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRJbmNsdWRlZFBhdGhzKCkgewotCQlyZXR1cm4gZkluY2x1ZGVkUGF0aHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlRXhwcmVzc2lvblN0cmluZyhTdHJpbmcgbmV3VGV4dCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGVtYmVkZGVkQ29udGFpbmVyLCBpbnQganNwUG9zaXRpb25TdGFydCwgaW50IGpzcFBvc2l0aW9uTGVuZ3RoLCBib29sZWFuIGlzSW5kaXJlY3QpIHsKLQkJYXBwZW5kVG9CdWZmZXIoRVhQUkVTU0lPTl9QUkVGSVgsIGZVc2VyQ29kZSwgZmFsc2UsIGVtYmVkZGVkQ29udGFpbmVyLCB0cnVlKTsKLQkJYXBwZW5kVG9CdWZmZXIobmV3VGV4dCwgZlVzZXJDb2RlLCB0cnVlLCBlbWJlZGRlZENvbnRhaW5lciwganNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgsIGlzSW5kaXJlY3QsIHRydWUpOwotCQlhcHBlbmRUb0J1ZmZlcihFWFBSRVNTSU9OX1NVRkZJWCwgZlVzZXJDb2RlLCBmYWxzZSwgZW1iZWRkZWRDb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVFeHByZXNzaW9uU3RyaW5nKFN0cmluZyBuZXdUZXh0LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gZW1iZWRkZWRDb250YWluZXIsIGludCBqc3BQb3NpdGlvblN0YXJ0LCBpbnQganNwUG9zaXRpb25MZW5ndGgsIFN0cmluZyBxdW90ZXR5cGUpIHsKLQkJaWYocXVvdGV0eXBlID09IG51bGwgfHwgcXVvdGV0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSB8fHF1b3RldHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUgKSB7Ci0JCQl0cmFuc2xhdGVFeHByZXNzaW9uU3RyaW5nKG5ld1RleHQsIGVtYmVkZGVkQ29udGFpbmVyLCBqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkxlbmd0aCwgZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8tLSBUaGlzIGlzIGEgcXVvdGVkIGF0dHJpYnV0ZS4gV2UgbmVlZCB0byB1bnF1b3RlIGFzIHBlciB0aGUgSlNQIHNwZWM6IEpTUCAyLjAgcGFnZSAxLTM2Ci0JCWFwcGVuZFRvQnVmZmVyKEVYUFJFU1NJT05fUFJFRklYLCBmVXNlckNvZGUsIGZhbHNlLCBlbWJlZGRlZENvbnRhaW5lciwgdHJ1ZSk7Ci0KLQkJaW50IGxlbmd0aCA9IG5ld1RleHQubGVuZ3RoKCk7Ci0JCWludCBydW5TdGFydCA9IDA7Ci0JCWludCBpID0gMDsKLQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCS8vLS0gY29sbGVjdCBhIG5ldyBydW4KLQkJCWNoYXIgYyA9IG5ld1RleHQuY2hhckF0KGkpOwotCQkJaWYgKGMgPT0gJ1xcJykgewotCQkJCS8vLS0gRXNjYXBlZCB2YWx1ZS4gQWRkIHRoZSBydW4sIHRoZW4gdW5lc2NhcGUKLQkJCQlpbnQgcnVuTGVuZ3RoID0gaS1ydW5TdGFydDsKLQkJCQlpZiAocnVuTGVuZ3RoID4gMCkgewotCQkJCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LnN1YnN0cmluZyhydW5TdGFydCwgaSksIGZVc2VyQ29kZSwgdHJ1ZSwgZW1iZWRkZWRDb250YWluZXIsIGpzcFBvc2l0aW9uU3RhcnQsIHJ1bkxlbmd0aCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCWpzcFBvc2l0aW9uU3RhcnQgKz0gcnVuTGVuZ3RoICsgMTsKLQkJCQkJanNwUG9zaXRpb25MZW5ndGggLT0gcnVuTGVuZ3RoICsgMTsKLQkJCQl9Ci0JCQkJcnVuU3RhcnQgPSArK2k7Ci0JCQkJaWYgKGkgPj0gbGVuZ3RoKSB7IC8vIEVzY2FwZSBidXQgbm8gZGF0YSBmb2xsb3dzPyEKLQkJCQkJLy8tIGVycm9yLgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYyA9IG5ld1RleHQuY2hhckF0KGkpOwkJCQkvLyBUaGUgZXNjYXBlZCBjaGFyYWN0ZXIsIGNvcGllZCB2ZXJiYXRpbQotCQkJfQotCQl9Ci0JCS8vLS0gQ29weSBsYXN0LXJ1bgotCQlpbnQgcnVuTGVuZ3RoID0gaSAtIHJ1blN0YXJ0OwotCQlpZiAocnVuTGVuZ3RoID4gMCkKLQkJCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQuc3Vic3RyaW5nKHJ1blN0YXJ0LCBpKSwgZlVzZXJDb2RlLCB0cnVlLCBlbWJlZGRlZENvbnRhaW5lciwganNwUG9zaXRpb25TdGFydCwgcnVuTGVuZ3RoLCB0cnVlLCBmYWxzZSk7Ci0JCWFwcGVuZFRvQnVmZmVyKEVYUFJFU1NJT05fU1VGRklYLCBmVXNlckNvZGUsIGZhbHNlLCBlbWJlZGRlZENvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlRGVjbGFyYXRpb25TdHJpbmcoU3RyaW5nIG5ld1RleHQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBlbWJlZGRlZENvbnRhaW5lciwgaW50IGpzcFBvc2l0aW9uU3RhcnQsIGludCBqc3BQb3NpdGlvbkxlbmd0aCwgYm9vbGVhbiBpc0luZGlyZWN0KSB7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGZVc2VyRGVjbGFyYXRpb25zLCB0cnVlLCBlbWJlZGRlZENvbnRhaW5lciwganNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgsIGlzSW5kaXJlY3QpOwotCQlhcHBlbmRUb0J1ZmZlcihFTkRMLCBmVXNlckRlY2xhcmF0aW9ucywgZmFsc2UsIGVtYmVkZGVkQ29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiB1c2VkIGJ5IFhNTEpTUFJlZ2lvbkhlbHBlciBmb3IgaW5jbHVkZWQgSlNQIGZpbGVzCi0JICogCi0JICogQHBhcmFtIG5ld1RleHQKLQkgKiBAcGFyYW0gZW1iZWRkZWRDb250YWluZXIKLQkgKiBAcGFyYW0ganNwUG9zaXRpb25TdGFydAotCSAqIEBwYXJhbSBqc3BQb3NpdGlvbkxlbmd0aAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVNjcmlwdGxldFN0cmluZyhTdHJpbmcgbmV3VGV4dCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGVtYmVkZGVkQ29udGFpbmVyLCBpbnQganNwUG9zaXRpb25TdGFydCwgaW50IGpzcFBvc2l0aW9uTGVuZ3RoLCBib29sZWFuIGlzSW5kaXJlY3QpIHsKLQkJYXBwZW5kVG9CdWZmZXIobmV3VGV4dCwgZlVzZXJDb2RlLCB0cnVlLCBlbWJlZGRlZENvbnRhaW5lciwganNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgsIGlzSW5kaXJlY3QpOwotCX0KLQotCS8vIHRoZSBmb2xsb3dpbmcgMyBtZXRob2RzIGRldGVybWluZSB0aGUgY3Vyc29yIHBvc2l0aW9uCi0JLy8gPCU9ICU+Ci0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlRXhwcmVzc2lvbihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyBuZXdUZXh0ID0gZ2V0VW5lc2NhcGVkUmVnaW9uVGV4dChyZWdpb24sIEVYUFJFU1NJT04pOwotCQlhcHBlbmRUb0J1ZmZlcihFWFBSRVNTSU9OX1BSRUZJWCwgZlVzZXJDb2RlLCBmYWxzZSwgcmVnaW9uLCB0cnVlKTsKLQkJYXBwZW5kVG9CdWZmZXIobmV3VGV4dCwgZlVzZXJDb2RlLCB0cnVlLCByZWdpb24sIHRydWUpOwotCQlhcHBlbmRUb0J1ZmZlcihFWFBSRVNTSU9OX1NVRkZJWCwgZlVzZXJDb2RlLCBmYWxzZSwgcmVnaW9uKTsKLQl9Ci0KLQkvLwotCS8vIDwlISAlPgotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZURlY2xhcmF0aW9uKElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24pIHsKLQkJU3RyaW5nIG5ld1RleHQgPSBnZXRVbmVzY2FwZWRSZWdpb25UZXh0KHJlZ2lvbiwgREVDTEFSQVRJT04pOwotCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBmVXNlckRlY2xhcmF0aW9ucywgdHJ1ZSwgcmVnaW9uKTsKLQkJYXBwZW5kVG9CdWZmZXIoRU5ETCwgZlVzZXJEZWNsYXJhdGlvbnMsIGZhbHNlLCByZWdpb24pOwotCX0KLQotCS8vCi0JLy8gPCUgJT4KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVTY3JpcHRsZXQoSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbikgewotCQlTdHJpbmcgbmV3VGV4dCA9IGdldFVuZXNjYXBlZFJlZ2lvblRleHQocmVnaW9uLCBTQ1JJUFRMRVQpOwotCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBmVXNlckNvZGUsIHRydWUsIHJlZ2lvbik7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHVzaW5nIGEgcmVnaW9uLCBwcm9iYWJseSBpbmRpcmVjdCBtYXBwaW5nIChlZy4gPCVAcGFnZQotCSAqIGluY2x1ZGU9IiIlPikKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBidWZmZXIKLQkgKiBAcGFyYW0gYWRkVG9NYXAKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFRvQnVmZmVyKFN0cmluZyBuZXdUZXh0LCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBib29sZWFuIGFkZFRvTWFwLCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uKSB7Ci0JCWludCBzdGFydCA9IDAsIGxlbmd0aCA9IDA7Ci0JCWlmIChqc3BSZWZlcmVuY2VSZWdpb24gIT0gbnVsbCkgewotCQkJc3RhcnQgPSBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJfQotCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBidWZmZXIsIGFkZFRvTWFwLCBqc3BSZWZlcmVuY2VSZWdpb24sIHN0YXJ0LCBsZW5ndGgsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQXBwZW5kIHVzaW5nIGEgcmVnaW9uLCBwcm9iYWJseSBpbmRpcmVjdCBtYXBwaW5nIChlZy4gPCVAcGFnZQotCSAqIGluY2x1ZGU9IiIlPikKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBidWZmZXIKLQkgKiBAcGFyYW0gYWRkVG9NYXAKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICogQHBhcmFtIG5vbmwKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kVG9CdWZmZXIoU3RyaW5nIG5ld1RleHQsIFN0cmluZ0J1ZmZlciBidWZmZXIsIGJvb2xlYW4gYWRkVG9NYXAsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24sIGJvb2xlYW4gbm9ubCkgewotCQlpbnQgc3RhcnQgPSAwLCBsZW5ndGggPSAwOwotCQlpZiAoanNwUmVmZXJlbmNlUmVnaW9uICE9IG51bGwpIHsKLQkJCXN0YXJ0ID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCX0KLQkJYXBwZW5kVG9CdWZmZXIobmV3VGV4dCwgYnVmZmVyLCBhZGRUb01hcCwganNwUmVmZXJlbmNlUmVnaW9uLCBzdGFydCwgbGVuZ3RoLCBmYWxzZSwgbm9ubCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhcHBlbmRUb0J1ZmZlcihTdHJpbmcgbmV3VGV4dCwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBhZGRUb01hcCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGpzcFJlZmVyZW5jZVJlZ2lvbiwgaW50IGpzcFBvc2l0aW9uU3RhcnQsIGludCBqc3BQb3NpdGlvbkxlbmd0aCwgYm9vbGVhbiBpc0luZGlyZWN0KSB7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGJ1ZmZlciwgYWRkVG9NYXAsIGpzcFJlZmVyZW5jZVJlZ2lvbiwganNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgsIGlzSW5kaXJlY3QsIGZhbHNlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEFkZHMgbmV3VGV4dCB0byB0aGUgYnVmZmVyIHBhc3NlZCBpbiwgYW5kIGFkZHMgdG8gdHJhbnNsYXRpb24gbWFwcGluZwotCSAqIGFzIHNwZWNpZmllZCBieSB0aGUgYWRkVG9NYXAgZmxhZy4gc29tZSBzcGVjaWFsIGNhc2VzIHRvIGNvbnNpZGVyICh0aGF0Ci0JICogbWF5IGJlIGFmZmVjdGVkIGJ5IGNoYW5nZXMgdG8gdGhpcyBtZXRob2QpOiBpbmNsdWRlZCBmaWxlcyBzY3JpcGxldHMgaW4KLQkgKiBhbiBhdHRyaWJ1dGUgdmFsdWUgcmVmYWN0b3JpbmcKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBidWZmZXIKLQkgKiBAcGFyYW0gYWRkVG9NYXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kVG9CdWZmZXIoU3RyaW5nIG5ld1RleHQsIFN0cmluZ0J1ZmZlciBidWZmZXIsIGJvb2xlYW4gYWRkVG9NYXAsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24sIGludCBqc3BQb3NpdGlvblN0YXJ0LCBpbnQganNwUG9zaXRpb25MZW5ndGgsIGJvb2xlYW4gaXNJbmRpcmVjdCwgYm9vbGVhbiBub25sKSB7Ci0KLQkJaW50IG9yaWdOZXdUZXh0TGVuZ3RoID0gbmV3VGV4dC5sZW5ndGgoKTsKLQotCQkvLyBub3RoaW5nIHRvIGFwcGVuZAotCQlpZiAoanNwUmVmZXJlbmNlUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gYWRkIGEgbmV3bGluZSBzbyB0cmFuc2xhdGlvbiBsb29rcyBjbGVhbmVyCi0JCWlmICghIG5vbmwgJiYgIW5ld1RleHQuZW5kc1dpdGgoRU5ETCkpCi0JCQluZXdUZXh0ICs9IEVOREw7Ci0KLQkJLy9kdW1wIGFueSBub24gdHJhbnNsYXRlZCBjb2RlIGJlZm9yZSB3cml0aW5nIHRyYW5zbGF0ZWQgY29kZQotCQl3cml0ZVBsYWNlSG9sZGVyRm9yTm9uVHJhbnNsYXRlZENvZGUoKTsKLQotCQkvL2lmIGFwcGVuZGluZyB0byB0aGUgYnVmZmVyIGNhbiBhc3N1bWUgc29tZXRoaW5nIGdvdCB0cmFuc2xhdGVkCi0JCWZDb2RlVHJhbnNsYXRlZCA9IHRydWU7Ci0KLQkJaWYgKGJ1ZmZlciA9PSBmVXNlckNvZGUpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmV3VGV4dCk7Ci0JCQlpZiAoYWRkVG9NYXApIHsKLQkJCQlpZiAoaXNVc2ViZWFuVGFnKGpzcFJlZmVyZW5jZVJlZ2lvbikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIHJlcXVpcmVzIHNwZWNpYWwgbWFwcGluZwotCQkJCQkJYXBwZW5kVXNlQmVhblRvQnVmZmVyKG5ld1RleHQsIGpzcFJlZmVyZW5jZVJlZ2lvbiwgaXNJbmRpcmVjdCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBzdGlsbCB3b3JraW5nIG91dCBraW5rcwotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYWxsIG90aGVyIGNhc2VzCi0JCQkJCVBvc2l0aW9uIGphdmFSYW5nZSA9IG5ldyBQb3NpdGlvbihmT2Zmc2V0SW5Vc2VyQ29kZSwgb3JpZ05ld1RleHRMZW5ndGgpOwotCQkJCQlQb3NpdGlvbiBqc3BSYW5nZSA9IG5ldyBQb3NpdGlvbihqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkxlbmd0aCk7Ci0KLQkJCQkJZkNvZGVSYW5nZXMucHV0KGphdmFSYW5nZSwganNwUmFuZ2UpOwotCQkJCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQkJCWZJbmRpcmVjdFJhbmdlcy5wdXQoamF2YVJhbmdlLCBqc3BSYW5nZSk7Ci0JCQkJfQotCQkJfQotCQkJZk9mZnNldEluVXNlckNvZGUgKz0gbmV3VGV4dC5sZW5ndGgoKTsKLQkJfQotCQllbHNlIGlmIChidWZmZXIgPT0gZlVzZXJEZWNsYXJhdGlvbnMpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmV3VGV4dCk7Ci0JCQlpZiAoYWRkVG9NYXApIHsKLQkJCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckRlY2xhcmF0aW9ucywgbmV3VGV4dC5sZW5ndGgoKSk7Ci0JCQkJUG9zaXRpb24ganNwUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgpOwotCi0JCQkJZkRlY2xhcmF0aW9uUmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQkJZkluZGlyZWN0UmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJCX0KLQkJCWZPZmZzZXRJblVzZXJEZWNsYXJhdGlvbnMgKz0gbmV3VGV4dC5sZW5ndGgoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVXNlYmVhblRhZyhJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCWJvb2xlYW4gaXNVc2VCZWFuID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyODQ5MAotCQkJLy8gbGVuZ3RoIG9mIDExIGlzIHRoZSBsZW5ndGggb2YganNwOnVzZUJlYW4KLQkJCS8vIGFuZCBzYXZlcyB0aGUgZXhwZW5zaXZlIGdldFRleHQuZXF1YWxzIGNhbGwKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCWlmIChyLmdldFRleHRMZW5ndGgoKSA9PSAxMSAmJiBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0VGV4dChyKS5lcXVhbHMoImpzcDp1c2VCZWFuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpc1VzZUJlYW4gPSB0cnVlOwotCQkJCX0KLQkJCQkvLyBicmVhayBubyBtYXR0ZXIgd2hhdCBpZiB5b3UgaGl0IHRhZ25hbWUKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNVc2VCZWFuOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbXBvcnROYW1lCi0JICogICAgICAgICAgICBzaG91bGQgYmUganVzdCB0aGUgcGFja2FnZSBwbHVzIHRoZSB0eXBlIGVnLiBqYXZhLnV0aWwuTGlzdAotCSAqICAgICAgICAgICAgb3IgamF2YS51dGlsLioKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICogICAgICAgICAgICBzaG91bGQgYmUgdGhlIDwlQCBwYWdlIGltcG9ydCA9ICJqYXZhLnV0aWwuTGlzdCIlPiByZWdpb24KLQkgKiBAcGFyYW0gYWRkVG9NYXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kSW1wb3J0VG9CdWZmZXIoU3RyaW5nIGltcG9ydE5hbWUsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24sIGJvb2xlYW4gYWRkVG9NYXApIHsKLQkJU3RyaW5nIGphdmFJbXBvcnRTdHJpbmcgPSAiaW1wb3J0ICIgKyBpbXBvcnROYW1lICsgIjsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZVc2VySW1wb3J0cy5hcHBlbmQoamF2YUltcG9ydFN0cmluZyk7Ci0JCWlmIChhZGRUb01hcCkgewotCQkJYWRkSW1wb3J0VG9NYXAoaW1wb3J0TmFtZSwganNwUmVmZXJlbmNlUmVnaW9uKTsKLQkJfQotCQlmT2Zmc2V0SW5Vc2VySW1wb3J0cyArPSBqYXZhSW1wb3J0U3RyaW5nLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIG5ldyB0ZXh0IGNhbiBiZSBzb21ldGhpbmcgbGlrZTogImltcG9ydCBqYXZhLmxhbmcuT2JqZWN0O1xuIgotCSAqIAotCSAqIGJ1dCB0aGUgcmVmZXJlbmNlIHJlZ2lvbiBjb3VsZCBoYXZlIGJlZW4gc29tZXRoaW5nIGxpa2U6IDwlQHBhZ2UKLQkgKiBpbXBvcnQ9ImphdmEubGFuZy5PYmplY3QsIGphdmEuaW8uKiwgamF2YS51dGlsLkxpc3QiJT4KLQkgKiAKLQkgKiBzbyB0aGUgZXhhY3QgbWFwcGluZyBoYXMgdG8gYmUgY2FsY3VsYXRlZCBjYXJlZnVsbHkuCi0JICogCi0JICogaXNJbmRpcmVjdCBtZWFucyB0aGF0IHRoZSBpbXBvcnQgY2FtZSBmcm9tIGFuIGluY2x1ZGVkIGZpbGUgKGlmIHRydWUpCi0JICogCi0JICogQHBhcmFtIGltcG9ydE5hbWUKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEltcG9ydFRvTWFwKFN0cmluZyBpbXBvcnROYW1lLCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uKSB7Ci0KLQkJLy8gbWFzc2FnZSB0ZXh0Ci0JCS8vIFN0cmluZyBqc3BUZXh0ID0gaW1wb3J0TmFtZS5zdWJzdHJpbmcoaW1wb3J0TmFtZS5pbmRleE9mKCJpbXBvcnQgIikKLQkJLy8gKyA3LCBpbXBvcnROYW1lLmluZGV4T2YoJzsnKSk7Ci0JCS8vIFN0cmluZyBqc3BUZXh0ID0gaW1wb3J0TmFtZS50cmltKCk7Ci0KLQkJLy8gdGhlc2UgcG9zaXRpb25zIHdpbGwgYmUgdXBkYXRlZCBiZWxvdwotCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckltcG9ydHMgKyA3LCAxKTsKLQkJUG9zaXRpb24ganNwUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0KCksIGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJLy8gY2FsY3VsYXRlIEpTUCByYW5nZSBieSBmaW5kaW5nICJpbXBvcnQiIGF0dHJpYnV0ZQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWludCBzaXplID0gcmVnaW9ucy5zaXplKCk7Ci0KLQkJaW50IHN0YXJ0ID0gLTE7Ci0JCWludCBsZW5ndGggPSAtMTsKLQotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJaWYgKGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRUZXh0KHIpLnRyaW0oKS5lcXVhbHMoImltcG9ydCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gZ2V0IHRoZSBhdHRyIHZhbHVlIHJlZ2lvbgotCQkJCQlpZiAoc2l6ZSA+IGkgKyAyKSB7Ci0JCQkJCQlyID0gcmVnaW9ucy5nZXQoaSArIDIpOwotCQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQotCQkJCQkJCVN0cmluZyBqc3BJbXBvcnRUZXh0ID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFRleHQocik7Ci0KLQkJCQkJCQkvLyB0aGUgcG9zaXRpb24gaW4gcXVlc3Rpb24gKGluIHRoZSBKU1ApIGlzIHdoYXQKLQkJCQkJCQkvLyBpcyBicmFja2V0ZWQgYmVsb3cKLQkJCQkJCQkvLyBpbmNsdWRlcyB3aGl0ZXNwYWNlCi0JCQkJCQkJLy8gPCVAcGFnZSBpbXBvcnQ9ImphdmEubGFuZy5PYmplY3QsWyBqYXZhLmlvLiogXSwKLQkJCQkJCQkvLyBqYXZhLnV0aWwuTGlzdCIlPgotCi0JCQkJCQkJLy8gaW4gdGhlIGphdmEgZmlsZQotCQkJCQkJCS8vIGltcG9ydCBbIGphdmEuaW8uKiBdOwotCi0JCQkJCQkJc3RhcnQgPSBqc3BJbXBvcnRUZXh0LmluZGV4T2YoaW1wb3J0TmFtZSk7Ci0JCQkJCQkJbGVuZ3RoID0gaW1wb3J0TmFtZS5sZW5ndGgoKTsKLQotCQkJCQkJCS8vIHNhZmV0eSwgZG9uJ3QgYWRkIHRvIG1hcCBpZiBiYWQgcG9zaXRpb25pbmcKLQkJCQkJCQlpZiAoc3RhcnQgPT0gLTEgfHwgbGVuZ3RoIDwgMSkKLQkJCQkJCQkJYnJlYWs7Ci0KLQkJCQkJCQkvLyB1cGRhdGUganNwIHJhbmdlCi0JCQkJCQkJanNwUmFuZ2Uuc2V0T2Zmc2V0KGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSArIHN0YXJ0KTsKLQkJCQkJCQlqc3BSYW5nZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQkJCS8vIHVwZGF0ZSBqYXZhIHJhbmdlCi0JCQkJCQkJamF2YVJhbmdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCX0KLQotCQkvLyBzYWZldHkgZm9yIGJhZCByYW5nZXMKLQkJaWYgKHN0YXJ0ICE9IC0xICYmIGxlbmd0aCA+IDEpIHsKLQkJCS8vIHB1dCByYW5nZXMgaW4gamF2YSAtPiBqc3AgcmFuZ2UgbWFwCi0JCQlmSW1wb3J0UmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHRlbXAgZml4IGZvciAyODIyOTUgdW50aWwgYmV0dGVyIG1hcHBpbmcgaXMgaW4gcGxhY2UKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kVXNlQmVhblRvQnVmZmVyKFN0cmluZyBuZXdUZXh0LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uLCBib29sZWFuIGlzSW5kaXJlY3QpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBqYXZhIHN0cmluZyBsb29rcyBsaWtlIHRoaXMgKHRva2VuaXplZCkKLQkJLy8gVHlwZSBpZCA9IG5ldyBDbGFzc25hbWUoKTtcbgotCQkvLyAwIDEgMiAzIDQKLQkJLy8gb3IKLQkJLy8gVHlwZSBpZCA9IG51bGw7XG4gLy8gaWYgdGhlcmUgaXMgbm8gY2xhc3NuYW1lCi0JCS8vIDAgMSAyIDMKLQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIGNhbGN1bGF0ZSBqYXZhIHJhbmdlcwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobmV3VGV4dCwgIiAiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGkgPSAwOwotCQlTdHJpbmdbXSBwYXJzZWRKYXZhID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLQkJCXBhcnNlZEphdmFbaSsrXSA9IHN0Lm5leHRUb2tlbigpOwotCi0JCVN0cmluZyB0eXBlID0gcGFyc2VkSmF2YVswXSAhPSBudWxsID8gcGFyc2VkSmF2YVswXSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBpZCA9IHBhcnNlZEphdmFbMV0gIT0gbnVsbCA/IHBhcnNlZEphdmFbMV0gOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY2xhc3NOYW1lID0gcGFyc2VkSmF2YS5sZW5ndGggPiA0ID8gcGFyc2VkSmF2YVs0XSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJUG9zaXRpb24gamF2YVR5cGVSYW5nZSA9IG5ldyBQb3NpdGlvbihmT2Zmc2V0SW5Vc2VyQ29kZSwgdHlwZS5sZW5ndGgoKSk7Ci0JCVBvc2l0aW9uIGphdmFJZFJhbmdlID0gbmV3IFBvc2l0aW9uKGZPZmZzZXRJblVzZXJDb2RlICsgdHlwZS5sZW5ndGgoKSArIDEsIGlkLmxlbmd0aCgpKTsKLQkJUG9zaXRpb24gamF2YUNsYXNzUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckNvZGUgKyB0eXBlLmxlbmd0aCgpICsgMSArIGlkLmxlbmd0aCgpICsgNywgMCk7Ci0JCS8qCi0JCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTIyNDIgLSBDaGVjayBmb3IKLQkJICogdGhlIGV4aXN0ZW5jZSBvZiAnKCcgZmlyc3QuCi0JCSAqLwotCQlpbnQgcGFyZW5Qb3MgPSAtMTsKLQkJaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSA+PSA0ICYmIChwYXJlblBvcyA9IGNsYXNzTmFtZS5pbmRleE9mKCcoJykpID49IDApIHsKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjEzMgotCQkJaW50IGNsYXNzTmFtZUxlbmd0aCA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgcGFyZW5Qb3MpLmxlbmd0aCgpOwotCQkJamF2YUNsYXNzUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckNvZGUgKyB0eXBlLmxlbmd0aCgpICsgMSArIGlkLmxlbmd0aCgpICsgNywgY2xhc3NOYW1lTGVuZ3RoKTsKLQkJfQotCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBjYWxjdWxhdGUganNwIHJhbmdlcwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJOYW1lID0gIiIsIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW50IHF1b3RlT2Zmc2V0ID0gMDsKLQkJUG9zaXRpb24ganNwVHlwZVJhbmdlID0gbnVsbDsKLQkJUG9zaXRpb24ganNwSWRSYW5nZSA9IG51bGw7Ci0JCVBvc2l0aW9uIGpzcENsYXNzUmFuZ2UgPSBudWxsOwotCi0JCWZvciAoaW50IGogPSAwOyBqIDwgcmVnaW9ucy5zaXplKCk7IGorKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGopOwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWF0dHJOYW1lID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFRleHQocik7Ci0JCQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID4gaiArIDIgJiYgcmVnaW9ucy5nZXQoaiArIDIpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCS8vIGdldCBhdHRyIHZhbHVlCi0JCQkJCXIgPSByZWdpb25zLmdldChqICsgMik7Ci0JCQkJCWF0dHJWYWx1ZSA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRUZXh0KHIpOwotCi0JCQkJCS8vIG1heSBoYXZlIHF1b3RlcwotCQkJCQlxdW90ZU9mZnNldCA9IChhdHRyVmFsdWUuc3RhcnRzV2l0aCgiXCIiKSB8fCBhdHRyVmFsdWUuc3RhcnRzV2l0aCgiJyIpKSA/IDEgOiAwOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQlpZiAoYXR0ck5hbWUuZXF1YWxzKCJ0eXBlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWpzcFR5cGVSYW5nZSA9IG5ldyBQb3NpdGlvbihqc3BSZWZlcmVuY2VSZWdpb24uZ2V0U3RhcnRPZmZzZXQocikgKyBxdW90ZU9mZnNldCwgU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXNMZWF2ZUluc2lkZVNwYWNlKGF0dHJWYWx1ZSkubGVuZ3RoKCkpOwotCQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImlkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWpzcElkUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpICsgcXVvdGVPZmZzZXQsIFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzTGVhdmVJbnNpZGVTcGFjZShhdHRyVmFsdWUpLmxlbmd0aCgpKTsKLQkJCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJjbGFzcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQlqc3BDbGFzc1JhbmdlID0gbmV3IFBvc2l0aW9uKGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSArIHF1b3RlT2Zmc2V0LCBTdHJpbmdVdGlscy5zdHJpcFF1b3Rlc0xlYXZlSW5zaWRlU3BhY2UoYXR0clZhbHVlKS5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcHV0IHJhbmdlcyBpbiBqYXZhIC0+IGpzcCByYW5nZSBtYXAKLQkJaWYgKCF0eXBlLmVxdWFscygiIikgJiYganNwVHlwZVJhbmdlICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJZkNvZGVSYW5nZXMucHV0KGphdmFUeXBlUmFuZ2UsIGpzcFR5cGVSYW5nZSk7Ci0JCQkvLyBub3RlOiBkb24ndCB1cGRhdGUgb2Zmc2V0cyBmb3IgdGhpcyBtYXAgd2hlbiByZXN1bHQgaXMgYnVpbHQKLQkJCS8vIHRoZXknbGwgYmUgdXBkYXRlZCB3aGVuIGNvZGUgcmFuZ2VzIG9mZnNldHMgYXJlIHVwZGF0ZWQKLQkJCWZVc2VCZWFuUmFuZ2VzLnB1dChqYXZhVHlwZVJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQkJaWYgKGlzSW5kaXJlY3QpCi0JCQkJZkluZGlyZWN0UmFuZ2VzLnB1dChqYXZhVHlwZVJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQl9Ci0JCWlmICghaWQuZXF1YWxzKCIiKSAmJiBqc3BJZFJhbmdlICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJZkNvZGVSYW5nZXMucHV0KGphdmFJZFJhbmdlLCBqc3BJZFJhbmdlKTsKLQkJCS8vIG5vdGU6IGRvbid0IHVwZGF0ZSBvZmZzZXRzIGZvciB0aGlzIG1hcCB3aGVuIHJlc3VsdCBpcyBidWlsdAotCQkJLy8gdGhleSdsbCBiZSB1cGRhdGVkIHdoZW4gY29kZSByYW5nZXMgb2Zmc2V0cyBhcmUgdXBkYXRlZAotCQkJZlVzZUJlYW5SYW5nZXMucHV0KGphdmFJZFJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQkJaWYgKGlzSW5kaXJlY3QpCi0JCQkJZkluZGlyZWN0UmFuZ2VzLnB1dChqYXZhSWRSYW5nZSwganNwVHlwZVJhbmdlKTsKLQkJfQotCQlpZiAoIWNsYXNzTmFtZS5lcXVhbHMoIiIpICYmIGpzcENsYXNzUmFuZ2UgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlmQ29kZVJhbmdlcy5wdXQoamF2YUNsYXNzUmFuZ2UsIGpzcENsYXNzUmFuZ2UpOwotCQkJLy8gbm90ZTogZG9uJ3QgdXBkYXRlIG9mZnNldHMgZm9yIHRoaXMgbWFwIHdoZW4gcmVzdWx0IGlzIGJ1aWx0Ci0JCQkvLyB0aGV5J2xsIGJlIHVwZGF0ZWQgd2hlbiBjb2RlIHJhbmdlcyBvZmZzZXRzIGFyZSB1cGRhdGVkCi0JCQlmVXNlQmVhblJhbmdlcy5wdXQoamF2YUNsYXNzUmFuZ2UsIGpzcFR5cGVSYW5nZSk7Ci0JCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQlmSW5kaXJlY3RSYW5nZXMucHV0KGphdmFDbGFzc1JhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBidWZmZXIgdG8gdGhlIGN1cnJlbnQgSlNQVHlwZTogU1RBTkRBUkRfSlNQLCBFTUJFRERFRF9KU1AsCi0JICogREVDTEFSQVRJT04sIEVYUFJFU1NJT04sIFNDUklQVExFVCAoZm9yIGtlZXB0aW5nIHRyYWNrIG9mIGN1cnNvcgotCSAqIHBvc2l0aW9uIHdoZW4gdGhlIGZpbmFsIGRvY3VtZW50IGlzIGJ1aWx0KQotCSAqIAotCSAqIEBwYXJhbSBKU1BUeXBlCi0JICogICAgICAgICAgICB0aGUgSlNQIHR5cGUgdGhhdCB0aGUgY3Vyc29yIGlzIGluCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3Vyc29yT3duZXIoaW50IEpTUFR5cGUpIHsKLQkJc3dpdGNoIChKU1BUeXBlKSB7Ci0JCQljYXNlIERFQ0xBUkFUSU9OIDoKLQkJCQlzZXRDdXJzb3JPd25lcihmVXNlckRlY2xhcmF0aW9ucyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVYUFJFU1NJT04gOgotCQkJY2FzZSBTQ1JJUFRMRVQgOgotCQkJCXNldEN1cnNvck93bmVyKGZVc2VyQ29kZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlzZXRDdXJzb3JPd25lcihmVXNlckNvZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhpcyBwaWVjZSBvZiBjb2RlIGl0ZXJhdGVzIHRocm91Z2ggZkN1cnJlbnROb2RlcyBhbmQgY2x1bXBzIHRoZW0KLQkgKiB0b2dldGhlciBpbiBhIGJpZyB0ZXh0IHN0cmluZyAtIHVuZXNjYXBpbmcgY2hhcmFjdGVycyBpZiB0aGV5IGFyZSBub3QKLQkgKiBDREFUQSAtIHNpbXBseSBhcHBlbmRpbmcgaWYgdGhleSBhcmUgQ0RBVEEgaXQgc3RvcHMgaXRlcmF0aW9uIHdoZW4gaXQKLQkgKiBoaXRzIGEgbm9kZSB0aGF0IGlzIGFuIFhNTF9UQUdfTkFNRSAod2hpY2ggc2hvdWxkIGJlIHRoZSByZWdpb24gY2xvc2luZwotCSAqIHRhZykKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVuZXNjYXBlZFJlZ2lvblRleHQoSVRleHRSZWdpb25Db2xsZWN0aW9uIHN0UmVnaW9uLCBpbnQgSlNQVHlwZSkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgc3RhcnQgPSBzdFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gc3RSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCS8vIGFkanVzdG1lbnQgbmVjZXNzYXJ5IGZvciBlbWJlZGRlZCByZWdpb24gY29udGFpbmVycwotCQlpZiAoc3RSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lciAmJiBzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQlpZiAoc3RSZWdpb24uZ2V0UmVnaW9ucygpICE9IG51bGwgJiYgc3RSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpIHsKLQkJCQlJVGV4dFJlZ2lvbiBqc3BDb250ZW50ID0gc3RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsgLy8gc2hvdWxkCi0JCQkJLy8gYmUKLQkJCQkvLyBqc3BDb250ZW50Ci0JCQkJLy8gcmVnaW9uCi0JCQkJc3RhcnQgPSBzdFJlZ2lvbi5nZXRTdGFydE9mZnNldChqc3BDb250ZW50KTsKLQkJCQllbmQgPSBzdFJlZ2lvbi5nZXRFbmRPZmZzZXQoanNwQ29udGVudCk7Ci0JCQl9Ci0JCX0KLQkJaW50IENEQVRBT2Zmc2V0ID0gMDsgLy8gbnVtYmVyIG9mIGNoYXJhY3RlcnMgbG9zdCBpbiBjb252ZXJzaW9uCi0JCWludCBidWZmZXJTaXplID0gMDsKLQkJaWYgKHN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCBzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUIC8vIG5lZWQKLQkJCQkJLy8gdGhpcwotCQkJCQkvLyBmb3IKLQkJCQkJLy8gZW1iZWRkZWQKLQkJCQkJLy8gSlNQCi0JCQkJCS8vIHJlZ2lvbnMKLQkJCQkJfHwgc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSAvLyBuZWVkCi0JCS8vIHRoaXMKLQkJLy8gaW4KLQkJLy8gY2FzZQotCQkvLyB0aGVyZSdzCi0JCS8vIG5vCi0JCS8vIHJlZ2lvbi4uLgotCQl7Ci0JCQlmSW5Db2RlUmVnaW9uID0gKHN0YXJ0IDw9IGZTb3VyY2VQb3NpdGlvbiAmJiBmU291cmNlUG9zaXRpb24gPD0gZW5kKTsKLQkJCWlmIChmSW5Db2RlUmVnaW9uKSB7Ci0JCQkJc2V0Q3Vyc29yT3duZXIoSlNQVHlwZSk7Ci0JCQkJc2V0UmVsYXRpdmVPZmZzZXQoKGZTb3VyY2VQb3NpdGlvbiAtIHN0YXJ0KSArIGdldEN1cnNvck93bmVyKCkubGVuZ3RoKCkpOwotCQkJCWlmIChKU1BUeXBlID09IEVYUFJFU1NJT04pIHsKLQkJCQkJLy8gaWYgYW4gZXhwcmVzc2lvbiwgYWRkIHRoZW4gbGVuZ3RoIG9mIHRoZSBlbmNsb3NpbmcKLQkJCQkJLy8gcGFyZW4uLgotCQkJCQlzZXRDdXJzb3JJbkV4cHJlc3Npb24odHJ1ZSk7Ci0JCQkJCXNldFJlbGF0aXZlT2Zmc2V0KGdldFJlbGF0aXZlT2Zmc2V0KCkgKyBFWFBSRVNTSU9OX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQkJSVRleHRSZWdpb24ganNwQ29udGVudCA9IG51bGw7Ci0JCQlpZiAoc3RSZWdpb24uZ2V0UmVnaW9ucygpICE9IG51bGwgJiYgc3RSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpCi0JCQkJanNwQ29udGVudCA9IHN0UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlyZXR1cm4gKGpzcENvbnRlbnQgIT0gbnVsbCkgPyBzdFJlZ2lvbi5nZXRGdWxsVGV4dChqc3BDb250ZW50KSA6IHN0UmVnaW9uLmdldEZ1bGxUZXh0KCk7IC8vIGRvbid0Ci0JCQkvLyB1bmVzY2FwZQotCQkJLy8gaWYKLQkJCS8vIGl0J3MKLQkJCS8vIG5vdAotCQkJLy8gYW4KLQkJCS8vIFhNTEpTUAotCQkJLy8gdGFnCi0JCX0KLQkJZWxzZSBpZiAoc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgewotCQkJLy8gbmVlZCB0byBkZXRlcm1pbmUgY3Vyc29yIG93bmVyIHNvIHRoYXQgdGhlIGZDdXJvc29yUG9zaXRpb24KLQkJCS8vIHdpbGwgYmUKLQkJCS8vIGNvcnJlY3QgZXZlbiBpZiB0aGVyZSBpcyBubyByZWdpb24gYWZ0ZXIgdGhlIGN1cnNvciBpbiB0aGUgSlNQCi0JCQkvLyBmaWxlCi0JCQlzZXRDdXJzb3JPd25lcihKU1BUeXBlKTsKLQkJfQotCQkvLyBpdGVyYXRlIFhNTENPTlRFTlQgYW5kIENEQVRBIHJlZ2lvbnMKLQkJLy8gbG9vcCBmQ3VycmVudE5vZGUgdW50aWwgeW91IGhpdCA8L2pzcDpzY3JpcHRsZXQ+IChvciBvdGhlciBjbG9zaW5nCi0JCS8vIHRhZyBuYW1lKQotCQl3aGlsZSAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsICYmIGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FICYmIGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpICE9IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgLy8gbmVlZCB0byBzdG9wIG9uIHRoZSBlbmRpbmcgdGFnIG5hbWUuLi4KLQkJewotCQkJc3RhcnQgPSBnZXRDdXJyZW50Tm9kZSgpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQllbmQgPSBnZXRDdXJyZW50Tm9kZSgpLmdldEVuZE9mZnNldCgpOwotCQkJYnVmZmVyU2l6ZSA9IGJ1ZmZlci5sZW5ndGgoKTsKLQkJCUNEQVRBT2Zmc2V0ID0gdW5lc2NhcGVSZWdpb24oZ2V0Q3VycmVudE5vZGUoKSwgYnVmZmVyKTsKLQkJCWZJbkNvZGVSZWdpb24gPSAoc3RhcnQgPD0gZlNvdXJjZVBvc2l0aW9uICYmIGZTb3VyY2VQb3NpdGlvbiA8PSBlbmQpOwotCQkJaWYgKGZJbkNvZGVSZWdpb24pIHsKLQkJCQlzZXRDdXJzb3JPd25lcihKU1BUeXBlKTsKLQkJCQkvLyB0aGlzIG9mZnNldCBpcyBzb3J0IG9mIGNvbXBsaWNhdGVkLi4uCi0JCQkJLy8gaXQncyBjb21wb3NlZCBvZjoKLQkJCQkvLyAxLiB0aGUgbGVuZ3RoIG9mIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCByZWdpb24gdXAgdGlsbAotCQkJCS8vIHdoZXJlIHRoZSBjdXJzb3IgaXMKLQkJCQkvLyAyLiBtaW51cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgbG9zdCBpbiBDREFUQSB0cmFuc2xhdGlvbgotCQkJCS8vIDMuIHBsdXMgdGhlIGxlbmd0aCBvZiB0aGUgZXNjYXBlZCBidWZmZXIgYmVmb3JlIHRoZSBjdXJyZW50Ci0JCQkJLy8gcmVnaW9uLCBidXQKLQkJCQkvLyBpcyBzdGlsbCB3aXRoaW4gdGhlIGpzcCB0YWcKLQkJCQlzZXRSZWxhdGl2ZU9mZnNldCgoZlNvdXJjZVBvc2l0aW9uIC0gZ2V0Q3VycmVudE5vZGUoKS5nZXRTdGFydE9mZnNldCgpKSArIGdldEN1cnNvck93bmVyKCkubGVuZ3RoKCkgLSBDREFUQU9mZnNldCArIGJ1ZmZlclNpemUpOwotCQkJCWlmIChKU1BUeXBlID09IEVYUFJFU1NJT04pIHsKLQkJCQkJc2V0Q3Vyc29ySW5FeHByZXNzaW9uKHRydWUpOwotCQkJCQkvLyBpZiBhbiBleHByZXNzaW9uLCBhZGQgdGhlbiBsZW5ndGggb2YgdGhlIGVuY2xvc2luZwotCQkJCQkvLyBwYXJlbi4uCi0JCQkJCXNldFJlbGF0aXZlT2Zmc2V0KGdldFJlbGF0aXZlT2Zmc2V0KCkgKyBFWFBSRVNTSU9OX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCkKLQkJCQlhZHZhbmNlTmV4dE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHIKLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24gdG8gYmUgdW5lc2NhcGVkIChYTUxDb250ZW50LCBYTUwgRU5USVRZCi0JICogICAgICAgICAgICBSRUZFUkVOQ0UsIG9yIENEQVRBKQotCSAqIEBwYXJhbSBzYgotCSAqICAgICAgICAgICAgdGhlIHN0cmluZ2J1ZmZlciB0byBhcHBlbmQgdGhlIHRleHQgdG8KLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1vdmVkIGluIHVuZXNjYXBpbmcgdGhpcyB0ZXh0Ci0JICovCi0JcHJvdGVjdGVkIGludCB1bmVzY2FwZVJlZ2lvbihJVGV4dFJlZ2lvbiByLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbGVuZ3RoQmVmb3JlID0gMCwgbGVuZ3RoQWZ0ZXIgPSAwLCBjZGF0YV90YWdzX2xlbmd0aCA9IDA7Ci0JCWlmIChyICE9IG51bGwgJiYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQgfHwgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSkpIHsKLQkJCWxlbmd0aEJlZm9yZSA9IChnZXRDdXJyZW50Tm9kZSgpICE9IHIpID8gZ2V0Q3VycmVudE5vZGUoKS5nZXRGdWxsVGV4dChyKS5sZW5ndGgoKSA6IGdldEN1cnJlbnROb2RlKCkuZ2V0RnVsbFRleHQoKS5sZW5ndGgoKTsKLQkJCXMgPSBFc2NhcGVkVGV4dFV0aWwuZ2V0VW5lc2NhcGVkVGV4dChnZXRDdXJyZW50Tm9kZSgpLCByKTsKLQkJCWxlbmd0aEFmdGVyID0gcy5sZW5ndGgoKTsKLQkJCXNiLmFwcGVuZChzKTsKLQkJfQotCQllbHNlIGlmIChyICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkgewotCQkJaWYgKHIgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgLy8gb25seSBpbnRlcmVzdGVkIGluCi0JCQkvLyBjb250ZW50cwotCQkJewotCQkJCS8vIG5hdmlnYXRlIHRvIG5leHQgcmVnaW9uIGNvbnRhaW5lciAod2hpY2ggc2hvdWxkIGJlIGEgSlNQCi0JCQkJLy8gcmVnaW9uKQotCQkJCUl0ZXJhdG9yIGl0ID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcikuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJSVRleHRSZWdpb24gdGVtcCA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQl0ZW1wID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWlmICh0ZW1wIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIgfHwgdGVtcC5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkgewotCQkJCQkJc2IuYXBwZW5kKGdldEN1cnJlbnROb2RlKCkuZ2V0RnVsbFRleHQodGVtcCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHRlbXAuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4gfHwgdGVtcC5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UpIHsKLQkJCQkJCWNkYXRhX3RhZ3NfbGVuZ3RoICs9IHRlbXAuZ2V0TGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChsZW5ndGhCZWZvcmUgLSBsZW5ndGhBZnRlciArIGNkYXRhX3RhZ3NfbGVuZ3RoKTsKLQl9Ci0KLQkvLwotCS8vIDxqc3A6dXNlQmVhbj4KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVVc2VCZWFuKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXIpIHsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSA9IG51bGw7Ci0JCVN0cmluZyBhdHRyVmFsdWUgPSBudWxsOwotCQlTdHJpbmcgaWQgPSBudWxsOwotCQlJVGV4dFJlZ2lvbiBpZFJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJSVRleHRSZWdpb24gdHlwZVJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBudWxsOwotCQlJVGV4dFJlZ2lvbiBjbGFzc25hbWVSZWdpb24gPSBudWxsOwotCQlTdHJpbmcgYmVhbk5hbWUgPSBudWxsOwotCQlJVGV4dFJlZ2lvbiBiZWFuTmFtZVJlZ2lvbiA9IG51bGw7Ci0KLQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTi5lcXVhbHMoY29udGFpbmVyLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpKSkgewotCQkJaWYgKCFmVXNlQmVhbnNTdGFjay5pc0VtcHR5KCkpIHsKLQkJCQlmVXNlQmVhbnNTdGFjay5wb3AoKTsKLQkJCQlhcHBlbmRUb0J1ZmZlcigifSIsIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBubyB1c2VCZWFuIHN0YXJ0IHRhZyBiZWluZyByZW1lbWJlcmVkCi0JCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIGV4dHJhRW5kUmVnaW9uID0gY29udGFpbmVyOwotCQkJCUlKU1BQcm9ibGVtIG1pc3NpbmdTdGFydFRhZyA9IGNyZWF0ZUpTUFByb2JsZW0oSUpTUFByb2JsZW0uVXNlQmVhblN0YXJ0VGFnTWlzc2luZywgSUpTUFByb2JsZW0uRl9QUk9CTEVNX0lEX0xJVEVSQUwsIE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BUcmFuc2xhdG9yXzQsSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTiksIGV4dHJhRW5kUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGV4dHJhRW5kUmVnaW9uLmdldEVuZE9mZnNldCgpKTsKLQkJCQlmVHJhbnNsYXRpb25Qcm9ibGVtcy5hZGQobWlzc2luZ1N0YXJ0VGFnKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCUl0ZXJhdG9yIHJlZ2lvbnMgPSBjb250YWluZXIuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgKHIuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCByLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpKSB7Ci0JCQlhdHRyTmFtZSA9IGF0dHJWYWx1ZSA9IG51bGw7Ci0JCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQlhdHRyTmFtZSA9IGNvbnRhaW5lci5nZXRUZXh0KHIpLnRyaW0oKTsKLQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJCWlmIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJYXR0clZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoY29udGFpbmVyLmdldFRleHQocikpOwotCQkJCQl9Ci0JCQkJCS8vIGhhcyBlcXVhbHMsIGJ1dCBubyB2YWx1ZT8KLQkJCQl9Ci0JCQkJLy8gYW4gYXR0cmlidXRlIHdpdGggbm8gZXF1YWxzPwotCQkJfQotCQkJLy8gKHBhKSBtaWdodCBuZWVkIGRpZmZlcmVudCBsb2dpYyBoZXJlIGlmIHdlIHdhbm5hIHN1cHBvcnQgbW9yZQotCQkJaWYgKGF0dHJOYW1lICE9IG51bGwgJiYgYXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQlpZiAoYXR0ck5hbWUuZXF1YWxzKCJpZCIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQlpZCA9IGF0dHJWYWx1ZTsKLQkJCQkJaWRSZWdpb24gPSByOwotCQkJCX0KLQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImNsYXNzIikpIHsvLyROT04tTkxTLTEkCi0JCQkJCWNsYXNzTmFtZSA9IGF0dHJWYWx1ZTsKLQkJCQkJY2xhc3NuYW1lUmVnaW9uID0gcjsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJ0eXBlIikpIHsvLyROT04tTkxTLTEkCi0JCQkJCXR5cGUgPSBhdHRyVmFsdWU7Ci0JCQkJCXR5cGVSZWdpb24gPSByOwotCQkJCX0KLQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImJlYW5OYW1lIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQliZWFuTmFtZSA9IGF0dHJWYWx1ZTsKLQkJCQkJYmVhbk5hbWVSZWdpb24gPSByOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChpZCAhPSBudWxsKSB7Ci0JCQkvLyBUaGUgaWQgaXMgbm90IGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCi0JCQlpZiAoIWlzVmFsaWRKYXZhSWRlbnRpZmllcihpZCkgJiYgaWRSZWdpb24gIT0gbnVsbCkgewotCQkJCU9iamVjdCBwcm9ibGVtID0gY3JlYXRlSlNQUHJvYmxlbShJSlNQUHJvYmxlbS5Vc2VCZWFuSW52YWxpZElELCBJUHJvYmxlbS5QYXJzaW5nRXJyb3JJbnZhbGlkVG9rZW4sIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpTUENvcmVNZXNzYWdlcy5KU1BUcmFuc2xhdG9yXzAsIG5ldyBTdHJpbmdbXXtpZH0pLCBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoaWRSZWdpb24pLCBjb250YWluZXIuZ2V0VGV4dEVuZE9mZnNldChpZFJlZ2lvbikgLSAxKTsKLQkJCQlmVHJhbnNsYXRpb25Qcm9ibGVtcy5hZGQocHJvYmxlbSk7Ci0JCQl9Ci0JCQkvLyBObyBUeXBlIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkCi0JCQlpZiAoKCh0eXBlID09IG51bGwgJiYgY2xhc3NOYW1lID09IG51bGwpIHx8ICh0eXBlID09IG51bGwgJiYgYmVhbk5hbWUgIT0gbnVsbCkpICYmIGlkUmVnaW9uICE9IG51bGwpIHsKLQkJCQlPYmplY3QgcHJvYmxlbSA9IGNyZWF0ZUpTUFByb2JsZW0oSUpTUFByb2JsZW0uVXNlQmVhbk1pc3NpbmdUeXBlSW5mbywgSVByb2JsZW0uVW5kZWZpbmVkVHlwZSwgTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUFRyYW5zbGF0b3JfMywgbmV3IFN0cmluZ1tde2lkfSksIGNvbnRhaW5lci5nZXRTdGFydE9mZnNldChpZFJlZ2lvbiksIGNvbnRhaW5lci5nZXRUZXh0RW5kT2Zmc2V0KGlkUmVnaW9uKSAtIDEpOwotCQkJCWZUcmFuc2xhdGlvblByb2JsZW1zLmFkZChwcm9ibGVtKTsKLQkJCX0KLQkJCS8vIENhbm5vdCBzcGVjaWZ5IGJvdGggYSBjbGFzcyBhbmQgYSBiZWFuTmFtZQotCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGJlYW5OYW1lICE9IG51bGwgJiYgYmVhbk5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBjb250YWluZXIuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCQlPYmplY3QgcHJvYmxlbSA9IGNyZWF0ZUpTUFByb2JsZW0oSUpTUFByb2JsZW0uVXNlQmVhbkFtYmlndW91c1R5cGUsIElQcm9ibGVtLkFtYmlndW91c1R5cGUsIEpTUENvcmVNZXNzYWdlcy5KU1BUcmFuc2xhdG9yXzIsIGNvbnRhaW5lci5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgY29udGFpbmVyLmdldFRleHRFbmRPZmZzZXQobmFtZVJlZ2lvbikgLSAxKTsKLQkJCQlmVHJhbnNsYXRpb25Qcm9ibGVtcy5hZGQocHJvYmxlbSk7Ci0JCQl9Ci0JCQkvKgotCQkJICogT25seSBoYXZlIGEgY2xhc3Mgb3IgYSBiZWFuTmFtZSBhdCB0aGlzIHBvaW50LCBhbmQgcG90ZW50aWFsbHkKLQkJCSAqIGEgdHlwZSBoYXMgaWQgdy8gdHlwZSBhbmQvb3IgY2xhc3NuYW1lL2JlYW5OYW1lCi0JCQkgKi8KLQkJCS8vIFR5cGUgaWQgPSBuZXcgQ2xhc3NuYW1lL0JlYW5uYW1lKCk7Ci0JCQkvLyBvcgotCQkJLy8gVHlwZSBpZCA9IG51bGw7IC8vIGlmIHRoZXJlIGlzIG5vIGNsYXNzbmFtZSBvciBiZWFubmFtZQotCQkJaWYgKCh0eXBlICE9IG51bGwgfHwgY2xhc3NOYW1lICE9IG51bGwpKSB7Ci0JCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotCQkJCQljbGFzc05hbWUgPSBkZWNvZGVUeXBlKGNsYXNzTmFtZSk7Ci0KLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCXR5cGUgPSBjbGFzc05hbWU7Ci0JCQkJCXR5cGVSZWdpb24gPSBjbGFzc25hbWVSZWdpb247Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJdHlwZSA9IGRlY29kZVR5cGUodHlwZSk7Ci0KLQkJCQkvKiBOb3cgY2hlY2sgdGhlIHR5cGVzIChtdWx0aXBsZSBvZiBnZW5lcmljcyBtYXkgYmUgaW52b2x2ZWQpICovCi0JCQkJTGlzdCBlcnJvclR5cGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCQkJaWYgKCFpc1R5cGVGb3VuZCh0eXBlLCBlcnJvclR5cGVOYW1lcykpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvclR5cGVOYW1lcy5zaXplKCk7IGkrKykgewotCQkJCQkJT2JqZWN0IHByb2JsZW0gPSBjcmVhdGVKU1BQcm9ibGVtKElKU1BQcm9ibGVtLkZfUFJPQkxFTV9JRF9MSVRFUkFMLCBJUHJvYmxlbS5VbmRlZmluZWRUeXBlLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChKU1BDb3JlTWVzc2FnZXMuSlNQVHJhbnNsYXRvcl8xLCBuZXcgU3RyaW5nW117ZXJyb3JUeXBlTmFtZXMuZ2V0KGkpLnRvU3RyaW5nKCl9KSwgY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KHR5cGVSZWdpb24pLCBjb250YWluZXIuZ2V0VGV4dEVuZE9mZnNldCh0eXBlUmVnaW9uKSAtIDEpOwotCQkJCQkJZlRyYW5zbGF0aW9uUHJvYmxlbXMuYWRkKHByb2JsZW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlTdHJpbmcgcHJlZml4ID0gdHlwZSArICIgIiArIGlkICsgIiA9ICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlTdHJpbmcgc3VmZml4ID0gIm51bGw7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotCQkJCQkJc3VmZml4ID0gIm5ldyAiICsgY2xhc3NOYW1lICsgIigpOyIgKyBFTkRMOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJZWxzZSBpZiAoYmVhbk5hbWUgIT0gbnVsbCkKLQkJCQkJCXN1ZmZpeCA9ICIoIiArIHR5cGUgKyAiKSBqYXZhLmJlYW5zLkJlYW5zLmluc3RhbnRpYXRlKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgXCIiICsgYmVhbk5hbWUgKyAiXCIpOyIgKyBFTkRMOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlhcHBlbmRUb0J1ZmZlcihwcmVmaXggKyBzdWZmaXgsIGZVc2VyQ29kZSwgdHJ1ZSwgZkN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJICogQWRkIGEgYnJhY2UgYW5kIHJlbWVtYmVyIHRoZSBzdGFydCB0YWcgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGEKLQkJICogdmFyaWFibGUgd2FzIGNvcnJlY3RseSBjcmVhdGVkCi0JCSAqLwotCQlpZiAoIURPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRS5lcXVhbHMoY29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkpKSB7Ci0JCQlmVXNlQmVhbnNTdGFjay5wdXNoKGNvbnRhaW5lcik7Ci0JCQlhcHBlbmRUb0J1ZmZlcigieyIsIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7IC8vJE5PTi1OTFMtMSQgCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWNvZGVzIHR5cGUgc3RyaW5ncyBmb3IgWE1MLXN0eWxlIEpTUHMKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSB0aGUgc3RyaW5nIHRvIGRlY29kZQotCSAqIEByZXR1cm4gdGhlIGRlY29kZWQgc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVjb2RlVHlwZShTdHJpbmcgdHlwZSkgewotCQlmaW5hbCBpbnQgbGVuZ3RoID0gdHlwZS5sZW5ndGgoKTsKLQkJZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJZmluYWwgY2hhciBjID0gdHlwZS5jaGFyQXQoaSk7Ci0JCQlpZiAoYyA9PSAnJicpIHsKLQkJCQlpZiAobGVuZ3RoID4gaSArIDMpIHsKLQkJCQkJZmluYWwgU3RyaW5nIGNvZGUgPSB0eXBlLnN1YnN0cmluZyhpICsgMSwgaSArIDQpOwotCQkJCQlmaW5hbCBib29sZWFuIGlzR3QgPSAiZ3Q7Ii5lcXVhbHMoY29kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGlzR3QgfHwgImx0OyIuZXF1YWxzKGNvZGUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWkrPTM7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKGlzR3QgPyAnPicgOiAnPCcpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKGMpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNUeXBlRm91bmQoU3RyaW5nIHJhd1R5cGVWYWx1ZSwgTGlzdCBlcnJvclR5cGVOYW1lcykgewotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZSgpOwotCQlpZihmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJSUphdmFQcm9qZWN0IHAgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCWlmIChwLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmcgdHlwZXNbXSA9IG5ldyBTdHJpbmdbM107Ci0JCQlpZiAocmF3VHlwZVZhbHVlLmluZGV4T2YoJzwnKSA+IDApIHsKLQkJCQkvLyBKU1IgMTQgOiBHZW5lcmljcyBhcmUgYmVpbmcgdXNlZCwgcGFyc2UgdGhlbSBvdXQKLQkJCQl0cnkgewotCQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJhd1R5cGVWYWx1ZSk7Ci0JCQkJCS8vIGdlbmVyaWMKLQkJCQkJdHlwZXNbMF0gPSB0b2tlci5uZXh0VG9rZW4oIjwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyB0eXBlIDEgb3Iga2V5Ci0JCQkJCXR5cGVzWzFdID0gdG9rZXIubmV4dFRva2VuKCIsPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHR5cGUgMiBvciB2YWx1ZQotCQkJCQl0eXBlc1syXSA9IHRva2VyLm5leHRUb2tlbigiLD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQljYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFN0cmluZ1Rva2VuaXplciBmYWlsdXJlIHdpdGggdW5zdXBwb3J0ZWQgc3ludGF4Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdHlwZXNbMF0gPSByYXdUeXBlVmFsdWU7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodHlwZXNbaV0gIT0gbnVsbCkgewotCQkJCQkvLyByZW1vdmUgYW55IGFycmF5IHN1ZmZpeGVzIAotCQkJCQlpZiAodHlwZXNbaV0uaW5kZXhPZignWycpID4gMCkgewotCQkJCQkJdHlwZXNbaV0gPSB0eXBlc1tpXS5zdWJzdHJpbmcoMCwgdHlwZXNbaV0uaW5kZXhPZignWycpKTsKLQkJCQkJfQotCQkJCQkvLyByZW1vdmUgYW55ICJleHRlbmRzIiBwcmVmaXhlcyAoSlNSIDE0KQotCQkJCQlpZiAodHlwZXNbaV0uaW5kZXhPZigiZXh0ZW5kcyIpID4gMCkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQl0eXBlc1tpXSA9IFN0cmluZ1V0aWxzLnN0cmlwKHR5cGVzW2ldLnN1YnN0cmluZyh0eXBlc1tpXS5pbmRleE9mKCJleHRlbmRzIikpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJYWRkTmFtZVRvTGlzdElmVHlwZU5vdEZvdW5kKHAsIHR5cGVzW2ldLCBlcnJvclR5cGVOYW1lcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlcnJvclR5cGVOYW1lcy5pc0VtcHR5KCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGROYW1lVG9MaXN0SWZUeXBlTm90Rm91bmQoSUphdmFQcm9qZWN0IHAsIFN0cmluZyB0eXBlTmFtZSwgTGlzdCBjb2xsZWN0ZWROYW1lc05vdEZvdW5kKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodHlwZU5hbWUgIT0gbnVsbCkgewotCQkJCUlUeXBlIHR5cGUgPSBwLmZpbmRUeXBlKHR5cGVOYW1lKTsKLQkJCQlpZiAodHlwZSA9PSBudWxsIHx8ICF0eXBlLmV4aXN0cygpKSB7Ci0JCQkJCWNvbGxlY3RlZE5hbWVzTm90Rm91bmQuYWRkKHR5cGVOYW1lKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlSZXNvdXJjZSB0eXBlUmVzb3VyY2UgPSB0eXBlLmdldFJlc291cmNlKCk7Ci0JCQkJCWlmKHR5cGVSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vIE5vdCBhIEphdmEgUHJvamVjdAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRKYXZhSWRlbnRpZmllcihTdHJpbmcgaWQpIHsKLQkJY2hhcltdIGlkQ2hhcnMgPSBpZC50b0NoYXJBcnJheSgpOwotCQlpZiAoaWRDaGFycy5sZW5ndGggPCAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQlib29sZWFuIGlzVmFsaWQgPSBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGlkQ2hhcnNbMF0pOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGlkQ2hhcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlzVmFsaWQgPSBpc1ZhbGlkICYmIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChpZENoYXJzW2ldKTsKLQkJfQotCQlyZXR1cm4gaXNWYWxpZDsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgaW50IGdldEN1cnNvclBvc2l0aW9uKCkgewotCQlyZXR1cm4gZkN1cnNvclBvc2l0aW9uOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ3Vyc29ySW5FeHByZXNzaW9uKCkgewotCQlyZXR1cm4gZkN1cnNvckluRXhwcmVzc2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXJzb3JJbkV4cHJlc3Npb24oYm9vbGVhbiBpbikgewotCQlmQ3Vyc29ySW5FeHByZXNzaW9uID0gaW47Ci0JfQotCi0JZmluYWwgcHVibGljIHZvaWQgc2V0U291cmNlQ3Vyc29yKGludCBpKSB7Ci0JCWZTb3VyY2VQb3NpdGlvbiA9IGk7Ci0JfQotCi0JZmluYWwgcHVibGljIGludCBnZXRTb3VyY2VQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZTb3VyY2VQb3NpdGlvbjsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgVExEQ01Eb2N1bWVudE1hbmFnZXIgZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIoKSB7Ci0JCXJldHVybiBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCX0KLQotCWZpbmFsIHB1YmxpYyB2b2lkIHNldFJlbGF0aXZlT2Zmc2V0KGludCByZWxhdGl2ZU9mZnNldCkgewotCQl0aGlzLmZSZWxhdGl2ZU9mZnNldCA9IHJlbGF0aXZlT2Zmc2V0OwotCX0KLQotCWZpbmFsIHB1YmxpYyBpbnQgZ2V0UmVsYXRpdmVPZmZzZXQoKSB7Ci0JCXJldHVybiBmUmVsYXRpdmVPZmZzZXQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEN1cnNvck93bmVyKFN0cmluZ0J1ZmZlciBjdXJzb3JPd25lcikgewotCQl0aGlzLmZDdXJzb3JPd25lciA9IGN1cnNvck93bmVyOwotCX0KLQotCWZpbmFsIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0Q3Vyc29yT3duZXIoKSB7Ci0JCXJldHVybiBmQ3Vyc29yT3duZXI7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNldEN1cnJlbnROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUpIHsKLQkJcmV0dXJuIHRoaXMuZkN1cnJlbnROb2RlID0gY3VycmVudE5vZGU7Ci0JfQotCi0JZmluYWwgcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Q3VycmVudE5vZGUoKSB7Ci0JCXJldHVybiBmQ3VycmVudE5vZGU7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGdldE1vZGVsUGF0aCgpIHsKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyKGdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlwYXRoID0gYnVmZmVyLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRyYW5zbGF0ZUNvZGFzKCkgewotCQlmUHJvY2Vzc0luY2x1ZGVzID0gZmFsc2U7Ci0JCUlQYXRoIG1vZGVscGF0aCA9IGdldE1vZGVsUGF0aCgpOwotCQlpZiAobW9kZWxwYXRoICE9IG51bGwpIHsKLQkJCVByb3BlcnR5R3JvdXBbXSBwcm9wZXJ0eUdyb3VwcyA9IERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5nZXRJbnN0YW5jZSgpLmdldFByb3BlcnR5R3JvdXBzKG1vZGVscGF0aCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHByb3BlcnR5R3JvdXBzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSVBhdGhbXSBjb2RhcyA9IHByb3BlcnR5R3JvdXBzW2pdLmdldEluY2x1ZGVDb2RhKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2Rhcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIWdldEluY2x1ZGVzKCkuY29udGFpbnMoY29kYXNbaV0udG9TdHJpbmcoKSkgJiYgIWNvZGFzW2ldLmVxdWFscyhtb2RlbHBhdGgpKSB7Ci0JCQkJCQlnZXRJbmNsdWRlcygpLnB1c2goY29kYXNbaV0pOwotCQkJCQkJSlNQSW5jbHVkZVJlZ2lvbkhlbHBlciBoZWxwZXIgPSBuZXcgSlNQSW5jbHVkZVJlZ2lvbkhlbHBlcih0aGlzLCB0cnVlKTsKLQkJCQkJCWhlbHBlci5wYXJzZShjb2Rhc1tpXS50b1N0cmluZygpKTsKLQkJCQkJCWdldEluY2x1ZGVzKCkucG9wKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZlByb2Nlc3NJbmNsdWRlcyA9IHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRyYW5zbGF0ZVByZWx1ZGVzKCkgewotCQlmUHJvY2Vzc0luY2x1ZGVzID0gZmFsc2U7Ci0JCUlQYXRoIG1vZGVscGF0aCA9IGdldE1vZGVsUGF0aCgpOwotCQlpZiAobW9kZWxwYXRoICE9IG51bGwpIHsKLQkJCVByb3BlcnR5R3JvdXBbXSBwcm9wZXJ0eUdyb3VwcyA9IERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5nZXRJbnN0YW5jZSgpLmdldFByb3BlcnR5R3JvdXBzKG1vZGVscGF0aCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHByb3BlcnR5R3JvdXBzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSVBhdGhbXSBwcmVsdWRlcyA9IHByb3BlcnR5R3JvdXBzW2pdLmdldEluY2x1ZGVQcmVsdWRlKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVsdWRlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIWdldEluY2x1ZGVzKCkuY29udGFpbnMocHJlbHVkZXNbaV0udG9TdHJpbmcoKSkgJiYgIXByZWx1ZGVzW2ldLmVxdWFscyhtb2RlbHBhdGgpKSB7Ci0JCQkJCQlnZXRJbmNsdWRlcygpLnB1c2gocHJlbHVkZXNbaV0pOwotCQkJCQkJSlNQSW5jbHVkZVJlZ2lvbkhlbHBlciBoZWxwZXIgPSBuZXcgSlNQSW5jbHVkZVJlZ2lvbkhlbHBlcih0aGlzLCB0cnVlKTsKLQkJCQkJCWhlbHBlci5wYXJzZShwcmVsdWRlc1tpXS50b1N0cmluZygpKTsKLQkJCQkJCWdldEluY2x1ZGVzKCkucG9wKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZlByb2Nlc3NJbmNsdWRlcyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogPHA+V3JpdGVzIGFuIGVtcHR5IGV4cHJlc3Npb24gdG8ge0BsaW5rICNmVXNlckNvZGV9IGlmIHByZXZpb3VzbHkKLQkgKiBmb3VuZCBub24gdHJhbnNsYXRlZCBjb2RlPC9wPgotCSAqIDxwPlRoaXMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGFwcGVuZGluZyBhbnkgbmV3bHkgdHJhbnNsYXRlZCBjb2RlLjwvcD4KLQkgKi8KLQlwcml2YXRlIHZvaWQgd3JpdGVQbGFjZUhvbGRlckZvck5vblRyYW5zbGF0ZWRDb2RlKCkgewotCQlpZihmRm91bmROb25UcmFuc2xhdGVkQ29kZSkgewotCQkJU3RyaW5nIHRleHQgPSAoInsiICsgRVhQUkVTU0lPTl9QUkVGSVggKyAiXCJcIiIgKyBFWFBSRVNTSU9OX1NVRkZJWCArICJ9IiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCSIgLy9tYXJrdXAiKyBFTkRMKTsgLy8kTk9OLU5MUy0xJAotCQkJZlVzZXJDb2RlLmFwcGVuZCh0ZXh0KTsKLQkJCWZPZmZzZXRJblVzZXJDb2RlICs9IHRleHQubGVuZ3RoKCk7Ci0JCQlmRm91bmROb25UcmFuc2xhdGVkQ29kZSA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+PGI+Tk9URTogPC9iPklmIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBpcyBjaGFuZ2VkIGJlIHN1cmUgdG8gdXBkYXRlCi0JICogIHtAbGluayAjcmVhZEV4dGVybmFsKE9iamVjdElucHV0KX0gYW5kIHtAbGluayAjc2VyaWFsVmVyc2lvblVJRH08L3A+Ci0JICoKLQkgKiBAc2VlICNyZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQpCi0JICogQHNlZSAjc2VyaWFsVmVyc2lvblVJRAotCSAqIEBzZWUgamF2YS5pby5FeHRlcm5hbGl6YWJsZSN3cml0ZUV4dGVybmFsKGphdmEuaW8uT2JqZWN0T3V0cHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlRXh0ZXJuYWwoT2JqZWN0T3V0cHV0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJd3JpdGVTdHJpbmcob3V0LCB0aGlzLmZDbGFzc0hlYWRlcik7Ci0JCXdyaXRlU3RyaW5nKG91dCwgdGhpcy5mQ2xhc3NuYW1lKTsKLQkJd3JpdGVTdHJpbmcob3V0LCB0aGlzLmZTdXBlcmNsYXNzKTsKLQkJd3JpdGVTdHJpbmcob3V0LCB0aGlzLmZJbXBsaWNpdEltcG9ydHMpOwotCQl3cml0ZVN0cmluZyhvdXQsIHRoaXMuZlNlcnZpY2VIZWFkZXIpOwotCQl3cml0ZUJ1ZmZlcihvdXQsIHRoaXMuZlVzZXJJbXBvcnRzKTsKLQkJb3V0LndyaXRlSW50KHRoaXMuZlNvdXJjZVBvc2l0aW9uKTsKLQkJb3V0LndyaXRlSW50KHRoaXMuZlJlbGF0aXZlT2Zmc2V0KTsKLQkJb3V0LndyaXRlSW50KHRoaXMuZkN1cnNvclBvc2l0aW9uKTsKLQkJb3V0LndyaXRlQm9vbGVhbih0aGlzLmZJc0Vycm9yUGFnZSk7Ci0JCW91dC53cml0ZUJvb2xlYW4odGhpcy5mQ3Vyc29ySW5FeHByZXNzaW9uKTsKLQkJb3V0LndyaXRlQm9vbGVhbih0aGlzLmZJc0luQVNlc3Npb24pOwotCQl3cml0ZUJ1ZmZlcihvdXQsIHRoaXMuZlVzZXJDb2RlKTsKLQkJd3JpdGVCdWZmZXIob3V0LCB0aGlzLmZVc2VyRUxFeHByZXNzaW9ucyk7Ci0JCXdyaXRlQnVmZmVyKG91dCwgdGhpcy5mVXNlckRlY2xhcmF0aW9ucyk7Ci0JCXdyaXRlQnVmZmVyKG91dCwgdGhpcy5mQ3Vyc29yT3duZXIpOwotCQlvdXQud3JpdGVCb29sZWFuKHRoaXMuZkluQ29kZVJlZ2lvbik7Ci0JCW91dC53cml0ZUJvb2xlYW4odGhpcy5mUHJvY2Vzc0luY2x1ZGVzKTsKLQkJb3V0LndyaXRlSW50KHRoaXMuZk9mZnNldEluVXNlckltcG9ydHMpOwotCQlvdXQud3JpdGVJbnQodGhpcy5mT2Zmc2V0SW5Vc2VyRGVjbGFyYXRpb25zKTsKLQkJb3V0LndyaXRlSW50KHRoaXMuZk9mZnNldEluVXNlckNvZGUpOwotCQkKLQkJLy93cml0ZSBpbmNsdWRlZCBwYXRocwotCQlvdXQud3JpdGVJbnQodGhpcy5mSW5jbHVkZWRQYXRocy5zaXplKCkpOwotCQlJdGVyYXRvciBpdGVyID0gdGhpcy5mSW5jbHVkZWRQYXRocy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJd3JpdGVTdHJpbmcob3V0LCAoU3RyaW5nKWl0ZXIubmV4dCgpKTsKLQkJfQotCQkKLQkJd3JpdGVSYW5nZXMob3V0LCB0aGlzLmZJbXBvcnRSYW5nZXMpOwotCQl3cml0ZVJhbmdlcyhvdXQsIHRoaXMuZkNvZGVSYW5nZXMpOwotCQl3cml0ZVJhbmdlcyhvdXQsIHRoaXMuZkRlY2xhcmF0aW9uUmFuZ2VzKTsKLQkJd3JpdGVSYW5nZXMob3V0LCB0aGlzLmZVc2VCZWFuUmFuZ2VzKTsKLQkJd3JpdGVSYW5nZXMob3V0LCB0aGlzLmZVc2VyRUxSYW5nZXMpOwotCQl3cml0ZVJhbmdlcyhvdXQsIHRoaXMuZkluZGlyZWN0UmFuZ2VzKTsKLQkJd3JpdGVTdHJpbmcob3V0LCB0aGlzLmZFTFRyYW5zbGF0b3JJRCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPjxiPk5PVEUgMTogPC9iPkFmdGVyIHJlYWRpbmcgaW4gYW4gZXh0ZXJuYWxpemVkIHtAbGluayBKU1BUcmFuc2xhdG9yfSB0aGUgY2FsbGVyIG11c3QKLQkgKiBtYW51YWxseSBjYWxsIHtAbGluayAjcG9zdFJlYWRFeHRlcm5hbFNldHVwKElTdHJ1Y3R1cmVkTW9kZWwpfSB0byBmaW5pc2ggc2V0dGluZyB1cAotCSAqIHRoZSB7QGxpbmsgSlNQVHJhbnNsYXRvcn0gZm9yIHVzZS48L3A+Ci0JICogCi0JICogPHA+PGI+Tk9URSAyOiA8L2I+SWYgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGlzIGNoYW5nZWQgYmUgc3VyZSB0byB1cGRhdGUKLQkgKiB7QGxpbmsgI3dyaXRlRXh0ZXJuYWwoT2JqZWN0T3V0cHV0KX0gYW5kIHtAbGluayAjc2VyaWFsVmVyc2lvblVJRH08L3A+Ci0JICogCi0JICogQHNlZSAjd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQpCi0JICogQHNlZSAjc2VyaWFsVmVyc2lvblVJRAotCSAqIEBzZWUgamF2YS5pby5FeHRlcm5hbGl6YWJsZSNyZWFkRXh0ZXJuYWwoamF2YS5pby5PYmplY3RJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZkNsYXNzSGVhZGVyID0gcmVhZFN0cmluZyhpbik7Ci0JCXRoaXMuZkNsYXNzbmFtZSA9IHJlYWRTdHJpbmcoaW4pOwotCQl0aGlzLmZTdXBlcmNsYXNzID0gcmVhZFN0cmluZyhpbik7Ci0JCXRoaXMuZkltcGxpY2l0SW1wb3J0cyA9IHJlYWRTdHJpbmcoaW4pOwotCQl0aGlzLmZTZXJ2aWNlSGVhZGVyID0gcmVhZFN0cmluZyhpbik7Ci0JCXRoaXMuZlVzZXJJbXBvcnRzID0gbmV3IFN0cmluZ0J1ZmZlcihyZWFkU3RyaW5nKGluKSk7Ci0JCXRoaXMuZlNvdXJjZVBvc2l0aW9uID0gaW4ucmVhZEludCgpOwotCQl0aGlzLmZSZWxhdGl2ZU9mZnNldCA9IGluLnJlYWRJbnQoKTsKLQkJdGhpcy5mQ3Vyc29yUG9zaXRpb24gPSBpbi5yZWFkSW50KCk7Ci0JCXRoaXMuZklzRXJyb3JQYWdlID0gaW4ucmVhZEJvb2xlYW4oKTsKLQkJdGhpcy5mQ3Vyc29ySW5FeHByZXNzaW9uID0gaW4ucmVhZEJvb2xlYW4oKTsKLQkJdGhpcy5mSXNJbkFTZXNzaW9uID0gaW4ucmVhZEJvb2xlYW4oKTsKLQkJdGhpcy5mVXNlckNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyKHJlYWRTdHJpbmcoaW4pKTsKLQkJdGhpcy5mVXNlckVMRXhwcmVzc2lvbnMgPSBuZXcgU3RyaW5nQnVmZmVyKHJlYWRTdHJpbmcoaW4pKTsKLQkJdGhpcy5mVXNlckRlY2xhcmF0aW9ucyA9IG5ldyBTdHJpbmdCdWZmZXIocmVhZFN0cmluZyhpbikpOwotCQl0aGlzLmZDdXJzb3JPd25lciA9IG5ldyBTdHJpbmdCdWZmZXIocmVhZFN0cmluZyhpbikpOwotCQl0aGlzLmZJbkNvZGVSZWdpb24gPSBpbi5yZWFkQm9vbGVhbigpOwotCQl0aGlzLmZQcm9jZXNzSW5jbHVkZXMgPSBpbi5yZWFkQm9vbGVhbigpOwotCQl0aGlzLmZPZmZzZXRJblVzZXJJbXBvcnRzID0gaW4ucmVhZEludCgpOwotCQl0aGlzLmZPZmZzZXRJblVzZXJEZWNsYXJhdGlvbnMgPSBpbi5yZWFkSW50KCk7Ci0JCXRoaXMuZk9mZnNldEluVXNlckNvZGUgPSBpbi5yZWFkSW50KCk7Ci0JCQotCQkvL3JlYWQgaW5jbHVkZWQgcGF0aHMKLQkJaW50IHNpemUgPSBpbi5yZWFkSW50KCk7Ci0JCXRoaXMuZkluY2x1ZGVkUGF0aHMgPSBuZXcgSGFzaFNldChzaXplKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotCQkJdGhpcy5mSW5jbHVkZWRQYXRocy5hZGQocmVhZFN0cmluZyhpbikpOwotCQl9Ci0JCQotCQl0aGlzLmZJbXBvcnRSYW5nZXMgPSByZWFkUmFuZ2VzKGluKTsKLQkJdGhpcy5mQ29kZVJhbmdlcyA9IHJlYWRSYW5nZXMoaW4pOwotCQl0aGlzLmZEZWNsYXJhdGlvblJhbmdlcyA9IHJlYWRSYW5nZXMoaW4pOwotCQl0aGlzLmZVc2VCZWFuUmFuZ2VzID0gcmVhZFJhbmdlcyhpbik7Ci0JCXRoaXMuZlVzZXJFTFJhbmdlcyA9IHJlYWRSYW5nZXMoaW4pOwotCQl0aGlzLmZJbmRpcmVjdFJhbmdlcyA9IHJlYWRSYW5nZXMoaW4pOwotCQl0aGlzLmZFTFRyYW5zbGF0b3JJRCA9IHJlYWRTdHJpbmcoaW4pOwotCQkKLQkJLy9idWlsZCByZXN1bHQKLQkJdGhpcy5idWlsZFJlc3VsdChmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIDxwPlRoaXMgZG9lcyBtYW5kYXRvcnkgc2V0dXAgbmVlZGVkIGFmdGVyIGEgSlNQVHJhbnNsYXRvciBpcyByZXN0b3JlZCBmcm9tCi0JICogYSBwZXJzaXN0ZWQgZmlsZTwvcD4KLQkgKiAKLQkgKiBAcGFyYW0ganNwTW9kZWwge0BsaW5rIElTdHJ1Y3R1cmVkTW9kZWx9IHJlcHJlc2VudGluZyB0aGUgSlNQIGZpbGUgdGhhdCB0aGlzCi0JICogaXMgYSB0cmFuc2xhdG9yIGZvcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvc3RSZWFkRXh0ZXJuYWxTZXR1cChJU3RydWN0dXJlZE1vZGVsIGpzcE1vZGVsKSB7Ci0JCXRoaXMuZlN0cnVjdHVyZWREb2N1bWVudCA9IGpzcE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl0aGlzLmZKc3BUZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih0aGlzLmZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KCkpOwotCQlpZihqc3BNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJdGhpcy5mU3RydWN0dXJlZE1vZGVsID0gKElET01Nb2RlbClqc3BNb2RlbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD5Xcml0ZXMgYSBzdHJpbmcgdG8gYW4ge0BsaW5rIE9iamVjdE91dHB1dH0gc3RyZWFtPC9wPgotCSAqIAotCSAqIDxwPjxiPk5PVEU6IDwvYj5JZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaXMgY2hhbmdlZCBiZSBzdXJlIHRvIHVwZGF0ZQotCSAqIHtAbGluayAjcmVhZFN0cmluZyhPYmplY3RJbnB1dCl9IGFuZCB7QGxpbmsgI3NlcmlhbFZlcnNpb25VSUR9PC9wPgotCSAqIAotCSAqIEBwYXJhbSBvdXQge0BsaW5rIE9iamVjdE91dHB1dH0gc3RyZWFtIHRvIHdyaXRlIDxjb2RlPnM8L2NvZGU+IHRvbwotCSAqIEBwYXJhbSBzIHtAbGluayBTdHJpbmd9IHRvIHdyaXRlIHRvIDxjb2RlPm91dDwvY29kZT4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElPIGNhbiB0aHJvdyBleGNlcHRpb25zCi0JICogCi0JICogQHNlZSAjcmVhZFN0cmluZyhPYmplY3RJbnB1dCkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nKE9iamVjdE91dHB1dCBvdXQsIFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZihzICE9IG51bGwpIHsKLQkJCW91dC53cml0ZUludChzLmxlbmd0aCgpKTsKLQkJCW91dC53cml0ZUJ5dGVzKHMpOwotCQl9IGVsc2UgewotCQkJb3V0LndyaXRlSW50KDApOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPlJlYWRzIGEge0BsaW5rIFN0cmluZ30gd3JpdHRlbiBieSB7QGxpbmsgI3dyaXRlU3RyaW5nKE9iamVjdE91dHB1dCwgU3RyaW5nKX0gZnJvbQotCSAqIGEge0BsaW5rIE9iamVjdElucHV0fSBzdHJlYW0uPC9wPgotCSAqIAotCSAqIDxwPjxiPk5PVEU6IDwvYj5JZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaXMgY2hhbmdlZCBiZSBzdXJlIHRvIHVwZGF0ZQotCSAqIHtAbGluayAjd3JpdGVTdHJpbmcoT2JqZWN0T3V0cHV0LCBTdHJpbmcpfSBhbmQge0BsaW5rICNzZXJpYWxWZXJzaW9uVUlEfTwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaW4ge0BsaW5rIE9iamVjdElucHV0fSBzdHJlYW0gdG8gcmVhZCB0aGUge0BsaW5rIFN0cmluZ30gZnJvbQotCSAqIEByZXR1cm4ge0BsaW5rIFN0cmluZ30gcmVhZCBmcm9tIDxjb2RlPmluPC9jb2RlPgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSU8gQ2FuIHRocm93IGV4Y2VwdGlvbnMKLQkgKiAKLQkgKiBAc2VlICN3cml0ZVN0cmluZyhPYmplY3RPdXRwdXQsIFN0cmluZykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFN0cmluZyhPYmplY3RJbnB1dCBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGxlbmd0aCA9IGluLnJlYWRJbnQoKTsKLQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLQkJaW4ucmVhZEZ1bGx5KGJ5dGVzKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMpOwotCX0KLQkKLQkvKioKLQkgKiA8cD5Xcml0ZXMgYSB7QGxpbmsgU3RyaW5nQnVmZmVyfSB0byBhbiB7QGxpbmsgT2JqZWN0T3V0cHV0fSBzdHJlYW08L3A+Ci0JICogCi0JICogQHBhcmFtIG91dCB7QGxpbmsgT2JqZWN0T3V0cHV0fSBzdHJlYW0gdG8gd3JpdGUgPGNvZGU+czwvY29kZT4gdG9vCi0JICogQHBhcmFtIHMge0BsaW5rIFN0cmluZ30gdG8gd3JpdGUgdG8gPGNvZGU+b3V0PC9jb2RlPgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSU8gY2FuIHRocm93IGV4Y2VwdGlvbnMKLQkgKiAKLQkgKiBAc2VlICNyZWFkU3RyaW5nKE9iamVjdElucHV0KQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVCdWZmZXIoT2JqZWN0T3V0cHV0IG91dCwgU3RyaW5nQnVmZmVyIGJ1ZmYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmKGJ1ZmYgIT0gbnVsbCAmJiBidWZmLmxlbmd0aCgpID4gMCkgewotCQkJd3JpdGVTdHJpbmcob3V0LCBidWZmLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJd3JpdGVTdHJpbmcob3V0LCBudWxsKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD5Xcml0ZXMgYSB7QGxpbmsgSGFzaE1hcH0gb2Yge0BsaW5rIFBvc2l0aW9ufXMgdG8gYW4ge0BsaW5rIE9iamVjdE91dHB1dH0gc3RyZWFtPC9wPgotCSAqIAotCSAqIDxwPjxiPk5PVEU6IDwvYj5JZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaXMgY2hhbmdlZCBiZSBzdXJlIHRvIHVwZGF0ZQotCSAqIHtAbGluayAjcmVhZFJhbmdlcyhPYmplY3RJbnB1dCl9IGFuZCB7QGxpbmsgI3NlcmlhbFZlcnNpb25VSUR9PC9wPgotCSAqIAotCSAqIEBwYXJhbSBvdXQge0BsaW5rIE9iamVjdE91dHB1dH0gc3RyZWFtIHRvIHdyaXRlIHRvCi0JICogQHBhcmFtIHJhbmdlcyB7QGxpbmsgSGFzaE1hcH0gb2Yge0BsaW5rIFBvc2l0aW9ufXMgdG8gd3JpdGUgdG8gPGNvZGU+b3V0PC9jb2RlPgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSU8gY2FuIHRocm93IGV4Y2VwdGlvbnMKLQkgKiAKLQkgKiBAc2VlICNyZWFkUmFuZ2VzKE9iamVjdElucHV0KQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVSYW5nZXMoT2JqZWN0T3V0cHV0IG91dCwgSGFzaE1hcCByYW5nZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vdGhpcyBpcyBhIHN0cmFuZ2UgaGFjayBiZWNhdXNlIFBvc2l0aW9uIGlzIG5vdCBkZXNpZ25lZCB0byBiZSB1c2VkIGFzIGtleXMgaW4gYSBNYXAsIHNlZSBQb3NpdGlvbiBkb2MKLQkJSGFzaE1hcCB0ZW1wID0gbmV3IEhhc2hNYXAoKTsKLQkJdGVtcC5wdXRBbGwocmFuZ2VzKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXIgPSB0ZW1wLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCW91dC53cml0ZUludChyYW5nZXMuc2l6ZSgpKTsKLQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVBvc2l0aW9uIGphdmFQb3MgPSAoUG9zaXRpb24paXRlci5uZXh0KCk7Ci0JCQlQb3NpdGlvbiBqc3BQb3MgPSAoUG9zaXRpb24pdGVtcC5nZXQoamF2YVBvcyk7Ci0JCQlvdXQud3JpdGVJbnQoamF2YVBvcy5vZmZzZXQpOwotCQkJb3V0LndyaXRlSW50KGphdmFQb3MubGVuZ3RoKTsKLQkJCW91dC53cml0ZUJvb2xlYW4oamF2YVBvcy5pc0RlbGV0ZWQpOwotCQkJCi0JCQlpZihqc3BQb3MgIT0gbnVsbCkgewotCQkJCW91dC53cml0ZUludChqc3BQb3Mub2Zmc2V0KTsKLQkJCQlvdXQud3JpdGVJbnQoanNwUG9zLmxlbmd0aCk7Ci0JCQkJb3V0LndyaXRlQm9vbGVhbihqc3BQb3MuaXNEZWxldGVkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0LndyaXRlSW50KC0xKTsKLQkJCQlvdXQud3JpdGVJbnQoLTEpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPlJlYWRzIGEge0BsaW5rIEhhc2hNYXB9IG9mIHtAbGluayBQb3NpdGlvbn1zIGZyb20gYW4ge0BsaW5rIE9iamVjdElucHV0fSBzdHJlYW0gdGhhdCB3YXMgd3JpdHRlbiBieQotCSAqIHtAbGluayAjd3JpdGVSYW5nZXMoT2JqZWN0T3V0cHV0LCBIYXNoTWFwKX08L3A+Ci0JICogCi0JICogPHA+PGI+Tk9URTogPC9iPklmIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBpcyBjaGFuZ2VkIGJlIHN1cmUgdG8gdXBkYXRlCi0JICoge0BsaW5rICN3cml0ZVJhbmdlcyhPYmplY3RPdXRwdXQsIEhhc2hNYXApfSBhbmQge0BsaW5rICNzZXJpYWxWZXJzaW9uVUlEfTwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaW4ge0BsaW5rIE9iamVjdElucHV0fSBzdHJlYW0gdG8gcmVhZCB0aGUge0BsaW5rIEhhc2hNYXB9IG9mIHtAbGluayBQb3NpdGlvbn1zIGZyb20KLQkgKiBAcmV0dXJuIHtAbGluayBIYXNoTWFwfSBvZiB7QGxpbmsgUG9zaXRpb259cyByZWFkIGZyb20gPGNvZGU+aW48L2NvZGU+Ci0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBJTyBjYW4gdGhyb3cgZXhjZXB0aW9ucwotCSAqIAotCSAqIEBzZWUgI3dyaXRlUmFuZ2VzKE9iamVjdE91dHB1dCwgSGFzaE1hcCkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwIHJlYWRSYW5nZXMoT2JqZWN0SW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBzaXplID0gaW4ucmVhZEludCgpOwotCQlIYXNoTWFwIHJhbmdlcyA9IG5ldyBIYXNoTWFwKHNpemUpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQlQb3NpdGlvbiBqYXZhUG9zID0gbmV3IFBvc2l0aW9uKGluLnJlYWRJbnQoKSwgaW4ucmVhZEludCgpKTsKLQkJCWlmKGluLnJlYWRCb29sZWFuKCkpIHsKLQkJCQlqYXZhUG9zLmRlbGV0ZSgpOwotCQkJfQotCQkJCi0JCQkvL2lmIHRoZSBqc3BQb3Mgd2FzIG51bGwgZm9yIHNvbWUgcmVhc29uIHRoZW4gLTEgd2FzIHdyaXR0ZW4gZm9yIGxlbmd0aCBhbmQgb2Zmc2V0Ci0JCQlQb3NpdGlvbiBqc3BQb3MgPSBudWxsOwotCQkJaW50IGpzcFBvc09mZnNldCA9IGluLnJlYWRJbnQoKTsKLQkJCWludCBqc3BQb3NMZW5ndGggPSBpbi5yZWFkSW50KCk7Ci0JCQlpZihqc3BQb3NPZmZzZXQgIT0gLTEgJiYganNwUG9zTGVuZ3RoICE9IC0xKSB7Ci0JCQkJanNwUG9zID0gbmV3IFBvc2l0aW9uKGpzcFBvc09mZnNldCwganNwUG9zTGVuZ3RoKTsKLQkJCX0KLQkJCQotCQkJLy9vbmx5IHJlYWQgYSBib29sZWFuIGlmIHRoZSBqc3BQb3Mgd2FzIG5vdCBudWxsCi0JCQlpZihqc3BQb3MgIT0gbnVsbCAmJiBpbi5yZWFkQm9vbGVhbigpKSB7Ci0JCQkJanNwUG9zLmRlbGV0ZSgpOwotCQkJfQotCQkJCi0JCQlyYW5nZXMucHV0KGphdmFQb3MsIGpzcFBvcyk7Ci0JCX0KLQkJCi0JCXJldHVybiByYW5nZXM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlib29sZWFuIGVxdWFsID0gZmFsc2U7Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIEpTUFRyYW5zbGF0b3IpIHsKLQkJCUpTUFRyYW5zbGF0b3Igb3RoZXIgPSAoSlNQVHJhbnNsYXRvcilvYmo7Ci0JCQllcXVhbCA9IHRoaXMuZkNsYXNzSGVhZGVyLmVxdWFscyhvdGhlci5mQ2xhc3NIZWFkZXIpICYmCi0JCQkJdGhpcy5mQ2xhc3NuYW1lLmVxdWFscyhvdGhlci5mQ2xhc3NuYW1lKSAmJgotCQkJCXRoaXMuZlN1cGVyY2xhc3MuZXF1YWxzKG90aGVyLmZTdXBlcmNsYXNzKSAmJgotCQkJCXRoaXMuZkltcGxpY2l0SW1wb3J0cy5lcXVhbHMob3RoZXIuZkltcGxpY2l0SW1wb3J0cykgJiYKLQkJCQl0aGlzLmZTZXJ2aWNlSGVhZGVyLmVxdWFscyhvdGhlci5mU2VydmljZUhlYWRlcikgJiYKLQkJCQlidWZmZXJzRXF1YWwodGhpcy5mVXNlckltcG9ydHMsIG90aGVyLmZVc2VySW1wb3J0cykgJiYKLQkJCQl0aGlzLmZTb3VyY2VQb3NpdGlvbiA9PSBvdGhlci5mU291cmNlUG9zaXRpb24gJiYKLQkJCQl0aGlzLmZSZWxhdGl2ZU9mZnNldCA9PSBvdGhlci5mUmVsYXRpdmVPZmZzZXQgJiYKLQkJCQl0aGlzLmZDdXJzb3JQb3NpdGlvbiA9PSBvdGhlci5mQ3Vyc29yUG9zaXRpb24gJiYKLQkJCQl0aGlzLmZJc0Vycm9yUGFnZSA9PSBvdGhlci5mSXNFcnJvclBhZ2UgJiYKLQkJCQl0aGlzLmZDdXJzb3JJbkV4cHJlc3Npb24gPT0gb3RoZXIuZkN1cnNvckluRXhwcmVzc2lvbiAmJgotCQkJCXRoaXMuZklzSW5BU2Vzc2lvbiA9PSBvdGhlci5mSXNJbkFTZXNzaW9uICYmCi0JCQkJYnVmZmVyc0VxdWFsKHRoaXMuZlVzZXJDb2RlLCBvdGhlci5mVXNlckNvZGUpICYmCi0JCQkJYnVmZmVyc0VxdWFsKHRoaXMuZlVzZXJFTEV4cHJlc3Npb25zLCBvdGhlci5mVXNlckVMRXhwcmVzc2lvbnMpICYmCi0JCQkJYnVmZmVyc0VxdWFsKHRoaXMuZlVzZXJEZWNsYXJhdGlvbnMsIG90aGVyLmZVc2VyRGVjbGFyYXRpb25zKSAmJgotCQkJCWJ1ZmZlcnNFcXVhbCh0aGlzLmZDdXJzb3JPd25lciwgb3RoZXIuZkN1cnNvck93bmVyKSAmJgotCQkJCXRoaXMuZkluQ29kZVJlZ2lvbiA9PSBvdGhlci5mSW5Db2RlUmVnaW9uICYmCi0JCQkJdGhpcy5mUHJvY2Vzc0luY2x1ZGVzID09IG90aGVyLmZQcm9jZXNzSW5jbHVkZXMgJiYKLQkJCQl0aGlzLmZPZmZzZXRJblVzZXJJbXBvcnRzID09IG90aGVyLmZPZmZzZXRJblVzZXJJbXBvcnRzICYmCi0JCQkJdGhpcy5mT2Zmc2V0SW5Vc2VyRGVjbGFyYXRpb25zID09IG90aGVyLmZPZmZzZXRJblVzZXJEZWNsYXJhdGlvbnMgJiYKLQkJCQl0aGlzLmZPZmZzZXRJblVzZXJDb2RlID09IG90aGVyLmZPZmZzZXRJblVzZXJDb2RlICYmCi0JCQkJcmFuZ2VzRXF1YWwodGhpcy5mSW1wb3J0UmFuZ2VzLCBvdGhlci5mSW1wb3J0UmFuZ2VzKSAmJgotCQkJCXJhbmdlc0VxdWFsKHRoaXMuZkNvZGVSYW5nZXMsIG90aGVyLmZDb2RlUmFuZ2VzKSAmJgotCQkJCXJhbmdlc0VxdWFsKHRoaXMuZkRlY2xhcmF0aW9uUmFuZ2VzLCBvdGhlci5mRGVjbGFyYXRpb25SYW5nZXMpICYmCi0JCQkJcmFuZ2VzRXF1YWwodGhpcy5mVXNlQmVhblJhbmdlcywgb3RoZXIuZlVzZUJlYW5SYW5nZXMpICYmCi0JCQkJcmFuZ2VzRXF1YWwodGhpcy5mVXNlckVMUmFuZ2VzLCBvdGhlci5mVXNlckVMUmFuZ2VzKSAmJgotCQkJCXJhbmdlc0VxdWFsKHRoaXMuZkluZGlyZWN0UmFuZ2VzLCBvdGhlci5mSW5kaXJlY3RSYW5nZXMpICYmCi0JCQkJKAotCQkJCQkodGhpcy5mRUxUcmFuc2xhdG9ySUQgIT0gbnVsbCAmJiBvdGhlci5mRUxUcmFuc2xhdG9ySUQgIT0gbnVsbCkgfHwKLQkJCQkJKHRoaXMuZkVMVHJhbnNsYXRvcklEID09IG51bGwgJiYgb3RoZXIuZkVMVHJhbnNsYXRvcklEICE9IG51bGwgJiYgb3RoZXIuZkVMVHJhbnNsYXRvcklELmxlbmd0aCgpID09IDApIHx8Ci0JCQkJCSh0aGlzLmZFTFRyYW5zbGF0b3JJRCAhPSBudWxsICYmIHRoaXMuZkVMVHJhbnNsYXRvcklELmxlbmd0aCgpID09IDAgJiYgb3RoZXIuZkVMVHJhbnNsYXRvcklEID09IG51bGwpIHx8Ci0JCQkJCSh0aGlzLmZFTFRyYW5zbGF0b3JJRC5lcXVhbHMob3RoZXIuZkVMVHJhbnNsYXRvcikpCi0JCQkJKTsKLQkJfQotCQlyZXR1cm4gZXF1YWw7Ci0JfQotCQotCS8qKgotCSAqIDxwPjxjb2RlPm51bGw8L2NvZGU+IGlzIGNvbnNpZGVyZWQgZXF1aXZsZW50IHRvIGFuIGVtcHR5IGJ1ZmZlcjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYnVmZjEgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGJ1ZmYyIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBnaXZlbiBidWZmZXJzIGFyZSBlcXVhbCwgPGNvZGVlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGJ1ZmZlcnNFcXVhbChTdHJpbmdCdWZmZXIgYnVmZjEsIFN0cmluZ0J1ZmZlciBidWZmMikgewotCQlyZXR1cm4gKGJ1ZmYxID09IG51bGwgJiYgYnVmZjIgPT0gbnVsbCkgfHwKLQkJCShidWZmMSAhPSBudWxsICYmIGJ1ZmYyIT0gbnVsbCAmJiBidWZmMS50b1N0cmluZygpLmVxdWFscyhidWZmMi50b1N0cmluZygpKSkgfHwKLQkJCShidWZmMSA9PSBudWxsICYmIGJ1ZmYyICE9IG51bGwgJiYgYnVmZjIubGVuZ3RoKCkgPT0gMCkgfHwKLQkJCShidWZmMSAhPSBudWxsICYmIGJ1ZmYxLmxlbmd0aCgpID09IDAgJiYgYnVmZjIgPT0gbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSByYW5nZXMxCi0JICogQHBhcmFtIHJhbmdlczIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0d28gbWFwcyBvZiByYW5nZXMgY29udGFpbnMgdGhlIHNhbWUga2V5L3ZhbHVlIHBhcmVzLAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHJhbmdlc0VxdWFsKEhhc2hNYXAgcmFuZ2VzMSwgSGFzaE1hcCByYW5nZXMyKSB7Ci0JCS8vdGhpcyBpcyBhIHN0cmFuZ2UgaGFjayBiZWNhdXNlIFBvc2l0aW9uIGlzIG5vdCBkZXNpZ25lZCB0byBiZSB1c2VkIGFzIGtleXMgaW4gYSBNYXAsIHNlZSBQb3NpdGlvbiBkb2MKLQkJSGFzaE1hcCB0ZW1wID0gbmV3IEhhc2hNYXAoKTsKLQkJdGVtcC5wdXRBbGwocmFuZ2VzMSk7Ci0JCXJhbmdlczEgPSB0ZW1wOwotCQkKLQkJYm9vbGVhbiBlcXVhbCA9IGZhbHNlOwotCQlpZihyYW5nZXMxICE9IG51bGwgJiYgcmFuZ2VzMiAhPSBudWxsKSB7Ci0JCQllcXVhbCA9IHRydWU7Ci0JCQlJdGVyYXRvciByYW5nZXMxS2V5cyA9IHJhbmdlczEua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKHJhbmdlczFLZXlzLmhhc05leHQoKSAmJiBlcXVhbCkgewotCQkJCVBvc2l0aW9uIGtleSA9IChQb3NpdGlvbilyYW5nZXMxS2V5cy5uZXh0KCk7Ci0JCQkJUG9zaXRpb24gcmFuZ2VzMVZhbHVlID0gKFBvc2l0aW9uKXJhbmdlczEuZ2V0KGtleSk7Ci0JCQkJUG9zaXRpb24gcmFuZ2VzMlZhbHVlID0gKFBvc2l0aW9uKXJhbmdlczIuZ2V0KGtleSk7Ci0JCQkJZXF1YWwgPSByYW5nZXMxVmFsdWUuZXF1YWxzKHJhbmdlczJWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBlcXVhbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRvclBlcnNpc3Rlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0b3JQZXJzaXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhZmM1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRvclBlcnNpc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnZhbGlkQ2xhc3NFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5GaWxlQnVmZmVyTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotLyoqCi0gKiA8cD5UaGlzIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcn0gaXMgdXNlZCB0byBrZWVwIHRoZSB7QGxpbmsgSlNQVHJhbnNsYXRvcn1zIGZvciBKU1AKLSAqIHJlc291cmNlcyBwZXJzaXN0ZWQgdG8gZGlzay4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gZ2V0IHBlcnNpc3RlZCB0cmFuc2xhdG9yczwvcD4KLSAqIDxwPlRoaXMgY2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgYXMgYW4ge0BsaW5rIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyfSBvbiB0aGUgV29ya3NwYWNlCi0gKiBhcyB3ZWxsIGFzIHByb2Nlc3NpbmcgcmVzb3VyY2UgY2hhbmdlIGV2ZW50cyBmcm9tIGEgc2F2ZWQgc3RhdGUsIGZvciBleGFtcGxlIHVzZSBzZWUgYmVsb3cuPHA+Ci0gKiA8cD48Yj5QbHVnaW4gQWN0aXZhdGlvbjo8L2I+Ci0gKiA8cHJlPgotICogdHJ5IHsKLSAqICAgSVNhdmVkU3RhdGUgc2F2ZWRTdGF0ZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRTYXZlUGFydGljaXBhbnQoCi0gKiAgICAgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCB0aGlzLmZTYXZlUGFydGljaXBhbnQpOwotICogICBpZiAoc2F2ZWRTdGF0ZSAhPSBudWxsKSB7Ci0gKiAgICAgc2F2ZWRTdGF0ZS5wcm9jZXNzUmVzb3VyY2VDaGFuZ2VFdmVudHMoSlNQVHJhbnNsYXRvclBlcnNpc3Rvci5nZXREZWZhdWx0KCkpOwotICogICB9Ci0gKiB9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkge30KLSAqIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKEpTUFRyYW5zbGF0b3JQZXJzaXN0b3IuZ2V0RGVmYXVsdCgpKTsKLSAqIDwvcHJlPgotICogPGI+UGx1Z2luIERlYWN0aXZhdGlvbjo8L2I+Ci0gKiA8cHJlPgotICogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVNhdmVQYXJ0aWNpcGFudChwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotICogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoSlNQVHJhbnNsYXRvclBlcnNpc3Rvci5nZXREZWZhdWx0KCkpOwotICogPC9wcmU+PC9wPgotICogCi0gKiA8cD5UaGlzIGNsYXNzIGNhbiBiZSBkZWFjdGl2YXRlZCB0aHJvdWdoIHRoZSA8Y29kZT5wZXJzaXN0SlNQVHJhbnNsYXRpb25zPC9jb2RlPiBzeXN0ZW0gcHJvcGVydHksCi0gKiBhIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IG1lYW5zIHRoZSBwZXJzaXN0ZXIgaXMgYWN0aXZhdGVkICh3aGljaCBpcyB0aGUgZGVmYXVsdCksIHZhbHVlIG9mCi0gKiA8Y29kZT5mYWxzZTwvY29kZT4gbWVhbnMgdGhlIHBlcnNpc3RlciBpcyBub3QgYWN0aXZhdGVkLjwvcD4KLSAqLwotcHVibGljIGNsYXNzIEpTUFRyYW5zbGF0b3JQZXJzaXN0ZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JLyoqCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBlcnNpc3RlciBpcyBhY3RpdmF0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIG90aGVyd2lzZS4gIFRoaXMgaXMgZGV0ZXJtaW5lZCBieSBjaGVja2luZyB0aGUgc3lzdGVtIHByb3BlcnR5Ci0JICogPGNvZGU+cGVyc2lzdEpTUFRyYW5zbGF0aW9uczwvY29kZT4sIGlmIG5vIHZhbHVlIHN1cHBsaWVkIHRoZW4KLQkgKiBkZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEFDVElWQVRFRCA9Ci0JCUJvb2xlYW4udmFsdWVPZihTeXN0ZW0uZ2V0UHJvcGVydHkoInBlcnNpc3RKU1BUcmFuc2xhdGlvbnMiLCAidHJ1ZSIpKS5ib29sZWFuVmFsdWUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCi0JLyoqIHRoZSBsb2NhdGlvbiB3aGVyZSB7QGxpbmsgSlNQVHJhbnNsYXRvcn1zIGFyZSBleHRlcm5hbGl6ZWQgdG9vIGZvciBwZXJzaXN0ZW5jZSBwdXJwb3NlcyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIFBFUlNJU1RfTE9DQVRJT04gPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKCJ0cmFuc2xhdG9ycyIpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHVzZWQgdG8gY2FsY3VsYXRlIHBlcnNpc3RlZCB0cmFuc2xhdG9yIGZpbGUgbmFtZXMgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDUkMzMiBDSEVDS1NVTV9DQUxDID0gbmV3IENSQzMyKCk7Ci0JCi0JLyoqIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUge0BsaW5rIEpTUFRyYW5zbGF0b3JQZXJzaXN0ZXJ9ICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSlNQVHJhbnNsYXRvclBlcnNpc3RlciBJTlNUQU5DRSA9IG5ldyBKU1BUcmFuc2xhdG9yUGVyc2lzdGVyKCk7Ci0JCi0JLyoqCi0JICogVXNlZCB0byBoYW5kbGUgcmVzb3VyY2UgY2hhbmdlIGV2ZW50cwotCSAqIEBzZWUgI3Jlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZURlbHRhVmlzaXRvciBmUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci0JCi0JLyoqIHtAbGluayBKb2J9IHRoYXQgYWN0dWFsbHkgZG9lcyBhbGwgdGhlIHBlcnNpc3RpbmcgKi8KLQlwcm90ZWN0ZWQgUGVyc2lzdGVySm9iIGZQZXJzaXN0ZXJKb2I7Ci0JCi0JLyoqCi0JICogPHA+UHJpdmF0ZSBzaW5nbGV0b24gZGVmYXVsdCBjb25zdHJ1Y3RvcjwvcD4KLQkgKi8KLQlwcml2YXRlIEpTUFRyYW5zbGF0b3JQZXJzaXN0ZXIoKSB7Ci0JCXRoaXMuZlJlc291cmNlRGVsdGFWaXNpdG9yID0gbmV3IEpTUFJlc291cmNlVmlzaXRvcigpOwotCQl0aGlzLmZQZXJzaXN0ZXJKb2IgPSBuZXcgUGVyc2lzdGVySm9iKCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPjxiPk5PVEU6IDwvYj48aT5UaGlzIGNhbiBwb3NzaWJsZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT48L2k+PC9wPgotCSAqIAotCSAqIEByZXR1cm4gU2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgSlNQVHJhbnNsYXRvclBlcnNpc3Rlcn0gaWYKLQkgKiB7QGxpbmsgI0FDVElWQVRFRH0gaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpTUFRyYW5zbGF0b3JQZXJzaXN0ZXIgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIEFDVElWQVRFRCA/IElOU1RBTkNFIDogbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXN3aXRjaChldmVudC5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFOgotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFOgotCQkJCS8vcHJlLWNsb3NlIG9yIHByZS1kZWxldGUgc3RvcCB0aGUgcGVyc2lzdGVyIGpvYiBzbyBpdCBkb2VzIG5vdCBpbnRlcmZlcmUKLQkJCQl0aGlzLmZQZXJzaXN0ZXJKb2Iuc3RvcCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRToKLQkJCQkvL3Bvc3QgY2hhbmdlIHN0YXJ0IHVwIHRoZSBwZXJzaXN0ZXIgam9iIGFuZCBwcm9jZXNzIHRoZSBkZWx0YQotCQkJCXRoaXMuZlBlcnNpc3RlckpvYi5zdGFydCgpOwotCQkJCQotCQkJCS8vIG9ubHkgYW5hbHl6ZSB0aGUgZnVsbCAoc3RhcnRpbmcgYXQgcm9vdCkgZGVsdGEgaGllcmFyY2h5Ci0JCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJCWlmIChkZWx0YSAhPSBudWxsICYmIGRlbHRhLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQkvL3VzZSB2aXNpdG9yIHRvIHZpc2l0IGFsbCBjaGlsZHJlbgotCQkJCQkJZGVsdGEuYWNjZXB0KHRoaXMuZlJlc291cmNlRGVsdGFWaXNpdG9yLCBmYWxzZSk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiUHJvY2Vzc2luZyByZXNvdXJjZSBjaGFuZ2UgZXZlbnQgZGVsdGEgZmFpbGVkLCAiICsKLQkJCQkJCQkJInBlcnNpc3RlZCBKU1BUcmFuc2xhdG9ycyBtYXkgbm90IGhhdmUgYmVlbiB1cGRhdGVkLiIsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPkdpdmVuIHRoZSB7QGxpbmsgSVN0cnVjdHVyZWRNb2RlbH0gb2YgYSBKU1AgZmlsZSBhdHRlbXB0cyB0byByZXRyaWV2ZSB0aGUgcGVyc2lzdGVkCi0JICoge0BsaW5rIEpTUFRyYW5zbGF0b3J9IGZvciB0aGF0IG1vZGVsLjwvcD4KLQkgKiA8cD48Yj5OT1RFOiA8L2I+PGk+SXQgaXMgcG9zc2libGUgZm9yIHRoZXJlIG5vdCB0byBiZSBhIHBlcnNpc3RlZCB0cmFuc2xhdG9yPC9pPjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwge0BsaW5rIElTdHJ1Y3R1cmVkTW9kZWx9IHRvIGdldCB0aGUgcGVyc2lzdGVkIHtAbGluayBKU1BUcmFuc2xhdG9yfSBmb3IKLQkgKiBAcmV0dXJuIHRoZSBwZXJzaXN0ZWQge0BsaW5rIEpTUFRyYW5zbGF0b3J9IGZvciB0aGUgZ2l2ZW4gPGNvZGU+bW9kZWw8L2NvZGU+LCBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgY291bGQgYmUgZm91bmQgb3IgYW4gZXhpc3Rpbmcgb25lIGNvdWxkIG5vdCBiZSByZWFkCi0JICovCi0JcHVibGljIHN0YXRpYyBKU1BUcmFuc2xhdG9yIGdldFBlcnNpc3RlZFRyYW5zbGF0b3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgcGVyc2lzdGVkVHJhbnNsYXRvckZpbGVQYXRoID0gZ2V0UGVyc2lzdGVkVHJhbnNsYXRvckZpbGVQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJRmlsZSBwZXJzaXN0ZWRUcmFuc2xhdG9yRmlsZSA9IG5ldyBGaWxlKHBlcnNpc3RlZFRyYW5zbGF0b3JGaWxlUGF0aCk7Ci0JCQotCQkvL2F0dGVtcHQgdG8gcmVhZCBpbiB0aGUgZXh0ZXJuYWxpemVkIHRyYW5zbGF0b3IKLQkJSlNQVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbnVsbDsKLQkJT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJLy9nZXQgdGhlIHBlcnNpc3RlZCB0cmFuc2xhdG9yIGZpbGUgaWYgb25lIGV4aXN0cwotCQkJaWYocGVyc2lzdGVkVHJhbnNsYXRvckZpbGUuZXhpc3RzKCkpIHsKLQkJCQlsb25nIHBlcnNpc3RlZFRyYW5zbGF0b3JGaWxlVGltZXN0YW1wID0gcGVyc2lzdGVkVHJhbnNsYXRvckZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCQkJbG9uZyBqc3BGaWxlVGltZXN0YW1wID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcigKLQkJCQkJCW1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJCQotCQkJCS8qIGlmIHRoZSBwZXJzaXN0ZWQgdHJhbnNsYXRvciB0aW1lc3RhbXAgaXMgbmV3ZXIgdGhlbiB0aGUganNwIGZpbGUgdGltZXN0YW1wCi0JCQkJICogdGhlbiB0aGUgdHJhbnNsYXRpb24gaGFzIG5vdCBiZWNvbWUgc3RhbGUsIG90aGVyd2lzZSBpdCBoYXMgc28gZGVsZXRlCi0JCQkJICogaXQgYW5kIGRvbid0IHVzZSBpdCAqLwotCQkJCWlmKHBlcnNpc3RlZFRyYW5zbGF0b3JGaWxlVGltZXN0YW1wID4ganNwRmlsZVRpbWVzdGFtcCkgewotCQkJCQlGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwZXJzaXN0ZWRUcmFuc2xhdG9yRmlsZSk7Ci0JCQkJCWluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGZpcyk7Ci0JCQkJCXRyYW5zbGF0b3IgPSAoSlNQVHJhbnNsYXRvcilpbi5yZWFkT2JqZWN0KCk7Ci0JCQkJCQotCQkJCQkvL2RvIHBvc3QgcmVhZCBleHRlcm5hbCBzZXR1cAotCQkJCQlpZih0cmFuc2xhdG9yICE9IG51bGwpIHsKLQkJCQkJCXRyYW5zbGF0b3IucG9zdFJlYWRFeHRlcm5hbFNldHVwKG1vZGVsKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXBlcnNpc3RlZFRyYW5zbGF0b3JGaWxlLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaChJbnZhbGlkQ2xhc3NFeGNlcHRpb24gZSkgewotCQkJLyogdGhpcyBtZWFucyB0aGF0IHRoZSBleHRlcm5hbGl6ZWQgdHJhbnNsYXRvciBpcyBmb3IgYW4gb2xkZXIgdmVyc2lvbgotCQkJICogb2YgdGhlIEpTUFRyYW5zbGF0b3IsIHNvIGRlbGV0ZSBpdCAqLwotCQkJcGVyc2lzdGVkVHJhbnNsYXRvckZpbGUuZGVsZXRlKCk7Ci0JCX1jYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ291bGQgbm90IHJlYWQgZXh0ZXJuYWxpemVkIEpTUFRyYW5zbGF0b3IgYXQgIiArIHBlcnNpc3RlZFRyYW5zbGF0b3JGaWxlUGF0aCwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJDbGFzcyBvZiBhIHNlcmlhbGl6ZWQgSlNQVHJhbnNsYXRvciBjYW5ub3QgYmUgZm91bmQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJaWYoaW4gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJDb3VsZCBub3QgY2xvc2UgZXh0ZXJuYWxpemVkIEpTUFRyYW5zbGF0b3IgdGhhdCB3YXMganVzdCByZWFkIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cmFuc2xhdG9yOwotCX0KLQkKLQkvKioKLQkgKiA8cD5HaXZlbiB0aGUgcGF0aCB0byBhIEpTUCBmaWxlIGRldGVybWluZXMgdGhlIHBhdGggdG8gaXRzIHBlcnNpc3RlZCB7QGxpbmsgSlNQVHJhbnNsYXRvcn08L3A+Ci0JICogCi0JICogQHBhcmFtIGpzcEZpbGVQYXRoIHtAbGluayBJUGF0aH0gdG8gSlNQIGZpbGUgZm9yIHdoaWNoIHRoZSBwYXRoIHRvIGl0cyBwZXJzaXN0ZWQge0BsaW5rIEpTUFRyYW5zbGF0b3J9Ci0JICogc2hvdWxkIGJlIGRldGVybWluZWQKLQkgKiAKLQkgKiBAcmV0dXJuIE9TIGZpbGUgcGF0aCB0byB0aGUgcGVyc2lzdGVkIHtAbGluayBKU1BUcmFuc2xhdG9yfSBhc3NvY2lhdGVkIHdpdGggdGhlIEpTUCBmaWxlIGF0Ci0JICogPGNvZGU+anNwRmlsZVBhdGg8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0UGVyc2lzdGVkVHJhbnNsYXRvckZpbGVQYXRoKFN0cmluZyBqc3BGaWxlUGF0aCkgewotCQlDSEVDS1NVTV9DQUxDLnJlc2V0KCk7Ci0JCUNIRUNLU1VNX0NBTEMudXBkYXRlKGpzcEZpbGVQYXRoLmdldEJ5dGVzKCkpOwotCQlTdHJpbmcgcGVyc2lzdGVkVHJhbnNsYXRvckZpbGVOYW1lID0gTG9uZy50b1N0cmluZyhDSEVDS1NVTV9DQUxDLmdldFZhbHVlKCkpICsgIi50cmFuc2xhdG9yIjsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBsb2NhdGlvbiA9IFBFUlNJU1RfTE9DQVRJT047Ci0JCQotCQkvLyBlbnN1cmUgdGhlIGZvbGRlciBleGlzdHMgb24gZGlzawotICAgICAgICBGaWxlIGZvbGRlciA9IG5ldyBGaWxlKGxvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCWlmICghZm9sZGVyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJZm9sZGVyLm1rZGlyKCk7Ci0JCQl9Ci0JCQljYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCQotCQlsb2NhdGlvbiA9IGxvY2F0aW9uLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCWxvY2F0aW9uID0gbG9jYXRpb24uYXBwZW5kKHBlcnNpc3RlZFRyYW5zbGF0b3JGaWxlTmFtZSk7Ci0JCXJldHVybiBsb2NhdGlvbi50b09TU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSlNQUmVzb3VyY2VWaXNpdG9yI3Zpc2l0KElSZXNvdXJjZURlbHRhKQotCSAqLwotCXByaXZhdGUgY2xhc3MgSlNQUmVzb3VyY2VWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJLyoqCi0JCSAqIDxwPkRlZmF1bHQgY29uc3RydWN0b3I8L3A+Ci0JCSAqLwotCQlwcm90ZWN0ZWQgSlNQUmVzb3VyY2VWaXNpdG9yKCkgewotCQl9Ci0JCQotCQkvKioKLQkJICogPHA+Rm9yIGVhY2gge0BsaW5rIElSZXNvdXJjZURlbHRhfSBkZXRlcm1pbmUgaWYgaXRzIGEgSlNQIHJlc291cmNlIGFuZCBpZiBpdCBpcwotCQkgKiBhZGQgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbiB0byB0aGUge0BsaW5rIFBlcnNpc3RlckpvYn0gc28gYXMgbm90IHRvIGhvbGQgdXAKLQkJICogdGhlIHtAbGluayBJUmVzb3VyY2VEZWx0YX08L3A+Ci0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YSkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlpZihpc0pTUFJlc291cmNlKGRlbHRhLmdldFJlc291cmNlKCkpKSB7Ci0JCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKLQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6IHsKLQkJCQkJCS8qIGlmIGEgbW92ZSwgdGhlbiBtb3ZlIHRoZSBwZXJzaXN0ZWQgdHJhbnNsYXRpb24KLQkJCQkJCSAqIGVsc2UgY3JlYXRlIGEgbmV3IHBlcnNpc3RlZCB0cmFuc2xhdGlvbiwgaWYgaXRzIGEgY2hhbmdlIHRoZW4KLQkJCQkJCSAqICAgdGhlIG9sZCBwZXJzaXN0ZWQgdHJhbnNsYXRpb24gd2lsbCBiZSBvdmVyd3JpdHRlbiAqLwotCQkJCQkJaWYoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAhPSAwKSB7Ci0JCQkJCQkJZmluYWwgRmlsZSBmcm9tID0gZ2V0UGVyc2lzdGVkRmlsZShkZWx0YS5nZXRNb3ZlZEZyb21QYXRoKCkpOwotCQkJCQkJCWZpbmFsIEZpbGUgdG8gPSBnZXRQZXJzaXN0ZWRGaWxlKGRlbHRhLmdldEZ1bGxQYXRoKCkpOwotCQkJCQkJCS8vYWRkIHRoZSBtb3ZlIGFjdGlvbiB0byB0aGUgcGVyc2lzdGVyIGpvYgotCQkJCQkJCUpTUFRyYW5zbGF0b3JQZXJzaXN0ZXIudGhpcy5mUGVyc2lzdGVySm9iLmFkZEFjdGlvbihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCQlyZW5hbWVQZXJzaXN0ZWRUcmFuc2xhdG9yKGZyb20sIHRvKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7fQotCQkJCQkJCX0pOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlmaW5hbCBTdHJpbmcgZmlsZVBhdGggPSBnZXRQZXJzaXN0ZWRUcmFuc2xhdG9yRmlsZVBhdGgoZGVsdGEuZ2V0RnVsbFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJCQkJCWZpbmFsIElGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZGVsdGEuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJCQkJLy9hZGQgdGhlIGFkZCBhY3Rpb24gdG8gdGhlIHBlcnNpc3RlciBqb2IKLQkJCQkJCQlKU1BUcmFuc2xhdG9yUGVyc2lzdGVyLnRoaXMuZlBlcnNpc3RlckpvYi5hZGRBY3Rpb24obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJCQkJSlNQVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gZ2V0SlNQVHJhbnNsYXRvcihmaWxlKTsKLQkJCQkJCQkJCWlmKHRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkJCQkJCQkJCXBlcnNpc3RUcmFuc2xhdG9yKHRyYW5zbGF0b3IsIGZpbGVQYXRoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCi0JCQkJCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7fQotCQkJCQkJCX0pOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOiB7Ci0JCQkJCQkvKiBvbmx5IHJlbW92ZSBpZiBpdHMgbm90IGEgbW92ZSwKLQkJCQkJCSAqIGlmIGl0IGlzIGEgbW92ZSB0aGUgYWRkZWQgZmlsZSBkZWx0YSBldmVudCB3aWxsIG1vdmUgdHJhbnNsYXRpb24gKi8KLQkJCQkJCWlmKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pID09IDApIHsKLQkJCQkJCQlmaW5hbCBGaWxlIGZpbGUgPSBnZXRQZXJzaXN0ZWRGaWxlKGRlbHRhLmdldEZ1bGxQYXRoKCkpOwotCQkJCQkJCS8vYWRkIHRoZSBkZWxldGUgYWN0aW9uIHRvIHRoZSBwZXJzaXN0ZXIgam9iCi0JCQkJCQkJSlNQVHJhbnNsYXRvclBlcnNpc3Rlci50aGlzLmZQZXJzaXN0ZXJKb2IuYWRkQWN0aW9uKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCQkJCWRlbGV0ZVBlcnNpc3RlZFRyYW5zbGF0b3IoZmlsZSk7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikge30KLQkJCQkJCQl9KTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvL3Zpc2l0IGNoaWxkcmVuIGRlbHRhcwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiA8cD5EZXRlcm1pbmVzIGlmIGFuIHtAbGluayBJUmVzb3VyY2V9IGlzIGEgSlNQIHJlc291cmNlPC9wPgotCQkgKiAKLQkJICogQHBhcmFtIHJlc291cmNlIGRldGVybWluZSBpZiB0aGlzIHtAbGluayBJUmVzb3VyY2V9IGlzIGEgSlNQIHJlc291cmNlCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+cmVzb3VyY2U8L2NvZGU+IGlzIGEgSlNQIHJlc291cmNlLAotCQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGlzSlNQUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQlib29sZWFuIGlzSlNQID0gZmFsc2U7Ci0JCQkKLQkJCS8vZ2VuZXJhbCBydWxlIGZvciBnZXR0aW5nIGZpbGVzIGluIHRoZSB3b3Jrc3BhY2UKLQkJCWlmKHJlc291cmNlLmdldEZ1bGxQYXRoKCkuc2VnbWVudENvdW50KCkgPj0gMikgewotCQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJaWYoZmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJLy9nZXQgSlNQIGNvbnRlbnQgdHlwZSBlYWNoIHRpbWUgYmVjYXVzZSB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IGl0IGNvdWxkIGNoYW5nZQotCQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZSgKLQkJCQkJCQlDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJCQkJCi0JCQkJCWlzSlNQID0gY29udGVudFR5cGVKU1AuaXNBc3NvY2lhdGVkV2l0aChmaWxlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlyZXR1cm4gaXNKU1A7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiA8cD5HZXRzIHRoZSBhc3NvY2lhdGVkIHtAbGluayBKU1BUcmFuc2xhdG9yfSBmb3IgYSBzcGVjaWZpYyBKU1AgZmlsZS48L3A+Ci0JCSAqIDxwPjxiPk5PVEU6IDwvYj48aT5UaGlzIGRvZXMgbm90IGdldCB0aGUgcGVyc2lzdGVkIHRyYW5zbGF0b3IgYnV0IHJhdGhlciB0aGUKLQkJICogYXNzb2NpYXRlZCB0cmFuc2xhdG9yIGluIG1lbW9yeTwvaT48L3A+Ci0JCSAqIAotCQkgKiBAcGFyYW0ganNwRmlsZSB7QGxpbmsgSUZpbGV9IHRvIHRoZSBKU1AgZmlsZSB0aGF0IHRoZSBhc3NvY2lhdGVkIHtAbGluayBKU1BUcmFuc2xhdG9yfQotCQkgKiBpcyBuZWVkZWQgZm9yCi0JCSAqIEByZXR1cm4ge0BsaW5rIEpTUFRyYW5zbGF0b3J9IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gPGNvZGU+anNwRmlsZVBhdGg8L2NvZGU+LCBvcgotCQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZC4KLQkJICovCi0JCXByb3RlY3RlZCBKU1BUcmFuc2xhdG9yIGdldEpTUFRyYW5zbGF0b3IoSUZpbGUganNwRmlsZSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQlKU1BUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGpzcEZpbGUpOwotCQkJCWlmKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCUlET01Eb2N1bWVudCBkb2MgPSAoKElET01Nb2RlbCltb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJTW9kZWxIYW5kbGVyRm9ySlNQLmVuc3VyZVRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkobW9kZWwpOwotCQkJCQlKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpZG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQkJCi0JCQkJCS8vZG9uJ3Qgd2FudCB0byBwZXJzaXN0IGEgdHJhbnNsYXRvciB0aGF0IGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZAotCQkJCQlpZihhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5oYXNUcmFuc2xhdGlvbigpKSB7Ci0JCQkJCQl0cmFuc2xhdG9yID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpLmdldFRyYW5zbGF0b3IoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IHRyYW5zbGF0b3IgZm9yICIgKyBqc3BGaWxlLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSIgYmVjYXVzZSBjb3VsZCBub3QgcmVhZCBtb2RlbCBmb3Igc2FtZS4iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ291bGQgbm90IGdldCB0cmFuc2xhdG9yIGZvciAiICsganNwRmlsZS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkiIGJlY2F1c2UgY291bGQgbm90IHJlYWQgbW9kZWwgZm9yIHNhbWUuIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYobW9kZWwgIT0gbnVsbCkgewotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiB0cmFuc2xhdG9yOwotCQl9Ci0JCQotCQkvKioKLQkJICogPHA+UGVyc2lzdHMgYSB7QGxpbmsgSlNQVHJhbnNsYXRvcn0gdG8gZGlzayBmb3IgYSBzcGVjaWZpYyBKU1AgZmlsZTwvcD4KLQkJICogCi0JCSAqIEBwYXJhbSB0cmFuc2xhdG9yIHtAbGluayBKU1BUcmFuc2xhdG9yfSB0byBwZXJzaXN0IHRvIGRpc2sKLQkJICogQHBhcmFtIGpzcEZpbGVQYXRoIHtAbGluayBJUGF0aH0gdG8gdGhlIEpTUCBmaWxlIHRoZSBnaXZlbiA8Y29kZT50cmFuc2xhdG9yPC9jb2RlPiBpcyBmb3IKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHBlcnNpc3RUcmFuc2xhdG9yKEpTUFRyYW5zbGF0b3IgdHJhbnNsYXRvciwgU3RyaW5nIGZpbGVQYXRoKSB7Ci0JCQl0cnkgewotCQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZVBhdGgpOwotCQkJCU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGZvcyk7Ci0JCQkJb3V0LndyaXRlT2JqZWN0KHRyYW5zbGF0b3IpOwotCQkJCW91dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIldhcyB1bmFibGUgdG8gZXh0ZXJuYWxpemUgSlNQVHJhbnNsYXRvciAiICsgdHJhbnNsYXRvciArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSIgdG8gIiArIGZpbGVQYXRoLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogPHA+RGVsZXRlcyBhIHBlcnNpc3RlZCB0cmFuc2xhdGlvbiBmb3IgYSBKU1AgZmlsZSB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQ8L3A+Ci0JCSAqIAotCQkgKiBAcGFyYW0ganNwRmlsZVBhdGgge0BsaW5rIElQYXRofSB0byB0aGUgSlNQIGZpbGUgdGhhdCBoYXMgYmVlbiBkZWxldGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVQZXJzaXN0ZWRUcmFuc2xhdG9yKEZpbGUgZmlsZSkgewotCQkJZmlsZS5kZWxldGUoKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIDxwPlJlbmFtZXMgYSBwZXJzaXN0ZWQgdHJhbnNsYXRpb24gZm9yIGEgSlNQIGZpbGUgdGhhdCBoYXMgbW92ZWQ8L3A+Ci0JCSAqIAotCQkgKiBAcGFyYW0ganNwUHJldkZpbGVQYXRoIHtAbGluayBJUGF0aH0gdG8gdGhlIHByZXZpb3VzIGxvY2F0aW9uIG9mIEpTUCBmaWxlPC9wPgotCQkgKiBAcGFyYW0ganNwTmV3RmlsZVBhdGgge0BsaW5rIElQYXRofSB0byBuZXcgbG9jYXRpb24gb2YgSlNQIGZpbGU8L3A+Ci0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCByZW5hbWVQZXJzaXN0ZWRUcmFuc2xhdG9yKEZpbGUgZnJvbSwgRmlsZSB0bykgewotCQkJLy9kbyB0aGUgbW92ZQotCQkJZnJvbS5yZW5hbWVUbyh0byk7Ci0JCX0KLQotCQlwcml2YXRlIEZpbGUgZ2V0UGVyc2lzdGVkRmlsZShJUGF0aCBwYXRoKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbGUoZ2V0UGVyc2lzdGVkVHJhbnNsYXRvckZpbGVQYXRoKHBhdGgudG9Qb3J0YWJsZVN0cmluZygpKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+e0BsaW5rIEpvYn0gcmVzcG9uc2libGUgZm9yIHJlYWN0aW5nIHRvIHtAbGluayBJUmVzb3VyY2VEZWx0YX0gdmlzaXRlZAotCSAqIGJ5IHtAbGluayBKU1BSZXNvdXJjZVZpc2l0b3J9LiAgVGhpcyB3YXkgdGhlIGFjdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHRha2VuCi0JICogaW4gcmVhY3Rpb24gdG8gdGhlIGRlbHRhIHRvIG5vdCBob2xkIHVwIHRoZSB7QGxpbmsgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXJ9Ci0JICogb3IgdGhlIHtAbGluayBJUmVzb3VyY2VEZWx0YX0uPC9wPgotCSAqCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQZXJzaXN0ZXJKb2IgZXh0ZW5kcyBKb2IgewotCQkvKiogTGVuZ3RoIHRvIGRlbGF5IHdoZW4gc2NoZWR1bGluZyBqb2IgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFTEFZID0gNTAwOwotCQkKLQkJLyoqIAotCQkgKiAgPGNvZGU+e0BsaW5rIExpbmtlZExpc3R9Jmx0e0BsaW5rIElTYWZlUnVubmFibGV9Jmd0PC9jb2RlPgotCQkgKiA8cD5UaGUgcGVyc2lzdGVyIGFjdGlvbnMgdGhhdCBoYXZlIGJlZW4gcXVldWVkIHVwIGJ5IHRoZSB7QGxpbmsgSlNQUmVzb3VyY2VWaXNpdG9yfTwvcD4KLQkJICovCi0JCXByaXZhdGUgTGlua2VkTGlzdCBmQWN0aW9uczsKLQkJCi0JCS8qKiBXaGV0aGVyIHRoaXMgam9iIGhhcyBiZWVuIHN0b3BwZWQgb3Igbm90ICovCi0JCXByaXZhdGUgYm9vbGVhbiBmSXNTdG9wcGVkOwotCQkKLQkJLyoqCi0JCSAqIDxwPlNldHMgam9iIHVwIGFzIGEgc3lzdGVtIGpvYjwvcD4KLQkJICovCi0JCXByb3RlY3RlZCBQZXJzaXN0ZXJKb2IoKSB7Ci0JCQlzdXBlcihKU1BDb3JlTWVzc2FnZXMuUGVyc2lzdGluZ19KU1BfVHJhbnNsYXRpb25zKTsKLQkJCXRoaXMuc2V0VXNlcihmYWxzZSk7Ci0JCQl0aGlzLnNldFN5c3RlbSh0cnVlKTsKLQkJCXRoaXMuc2V0UHJpb3JpdHkoSm9iLkxPTkcpOwotCQkJCi0JCQl0aGlzLmZBY3Rpb25zID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCXRoaXMuZklzU3RvcHBlZCA9IGZhbHNlOwotCQl9Ci0JCQotCQkvKioKLQkJICogPHA+U3RhcnRzIHRoaXMgam9iLiAgVGhpcyBoYXMgbm8gZWZmZWN0IGlmIHRoZSBqb2IgaXMgYWxyZWFkeSBzdGFydGVkLjwvcD4KLQkJICogPHA+VGhpcyBzaG91bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiB7QGxpbmsgSm9iI3NjaGVkdWxlKCl9IHRvIHJlc2V0IHN0YXRlCi0JCSAqIGNhdXNlZCBieSBjYWxsaW5nIHtAbGluayAjc3RvcCgpfTwvcD4KLQkJICogCi0JCSAqIEBzZWUgI3N0b3AoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgewotCQkJdGhpcy5mSXNTdG9wcGVkID0gZmFsc2U7Ci0JCQkKLQkJCS8vZ2V0IHRoZSBqb2IgcnVubmluZyBhZ2FpbiBkZXBlbmRpbmcgb24gaXRzIGN1cnJlbnQgc3RhdGUKLQkJCWlmKHRoaXMuZ2V0U3RhdGUoKSA9PSBKb2IuU0xFRVBJTkcpIHsKLQkJCQl0aGlzLndha2VVcChERUxBWSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2NoZWR1bGUoREVMQVkpOwotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogPHA+U3RvcHMgdGhpcyBqb2IsIGV2ZW4gaWYgaXQgaXMgcnVubmluZzwvcD4KLQkJICogPHA+VGhpcyBzaG91bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiB7QGxpbmsgSm9iI3NsZWVwKCl9IGJlY2F1c2Uge0BsaW5rIEpvYiNzbGVlcCgpfQotCQkgKiB3aWxsIG5vdCBzdG9wIGEgam9iIHRoYXQgaXMgYWxyZWFkeSBydW5uaW5nIGJ1dCBjYWxsaW5nIHRoaXMgd2lsbCBzdG9wIHRoaXMgam9iCi0JCSAqIGV2ZW4gaWYgaXQgaXMgcnVubmluZy4ge0BsaW5rICNzdGFydCgpfSBtdXN0IGJlIHVzZWQgdG8gc3RhcnQgdGhpcyBqb2IgYWdhaW48L3A+Ci0JCSAqIAotCQkgKiBAc2VlICNzdGFydCgpCi0JCSAqLwotCQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKLQkJCS8vc2xlZXAgdGhlIGpvYiBpZiBpdCBpcyB3YWl0aW5nIHRvIHJ1bgotCQkJdGhpcy5zbGVlcCgpOwotCQkJCi0JCQkvL2lmIGpvYiBpcyBhbHJlYWR5IHJ1bm5pbmcgd2lsbCBmb3JjZSBpdCB0byBzdG9wCi0JCQl0aGlzLmZJc1N0b3BwZWQgPSB0cnVlOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIGFjdGlvbiB7QGxpbmsgSVNhZmVSdW5uYWJsZX0gY29udGFpbmluZyBhIHBlcnNpc3RlciBhY3Rpb24gdG8gdGFrZQotCQkgKiBiYXNlZCBvbiBhbiB7QGxpbmsgSVJlc291cmNlRGVsdGF9IHByb2Nlc3NlZCBieSB7QGxpbmsgSlNQUmVzb3VyY2VWaXNpdG9yfQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgYWRkQWN0aW9uKElTYWZlUnVubmFibGUgYWN0aW9uKSB7Ci0JCQkvL2FkZCB0aGUgYWN0aW9uCi0JCQlzeW5jaHJvbml6ZWQgKHRoaXMuZkFjdGlvbnMpIHsKLQkJCQl0aGlzLmZBY3Rpb25zLmFkZExhc3QoYWN0aW9uKTsKLQkJCX0KLQkJCQotCQkJLy9pZiBqb2IgaGFzIG5vdCBiZWVuIG1hbnVhbGx5IHN0b3BwZWQsIHRoZW4gc3RhcnQgaXQKLQkJCWlmKCF0aGlzLmZJc1N0b3BwZWQpIHsKLQkJCQl0aGlzLnN0YXJ0KCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogPHA+UHJvY2VzcyB0aGUgYWN0aW9ucyB1bnRpbCB0aGVyZSBhcmUgbm9uZSBsZWZ0PC9wPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JCSAqLwotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkvKiAgcnVuIHNvIGxvbmcgYXMgam9iIGhhcyBub3QgYmVlbiBzdG9wcGVkLAotCQkJICptb25pdG9yIGNhbmNlbGVkLCBhbmQgaGF2ZSBhY3Rpb25zIHRvIHByb2Nlc3MgKi8KLQkJCXdoaWxlKCF0aGlzLmZJc1N0b3BwZWQgJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpICYmICF0aGlzLmZBY3Rpb25zLmlzRW1wdHkoKSkgewotCQkJCUlTYWZlUnVubmFibGUgYWN0aW9uOwotCQkJCXN5bmNocm9uaXplZCAodGhpcy5mQWN0aW9ucykgewotCQkJCQlhY3Rpb24gPSAoSVNhZmVSdW5uYWJsZSl0aGlzLmZBY3Rpb25zLnJlbW92ZUZpcnN0KCk7Ci0JCQkJfQotCQkJCQotCQkJCVNhZmVSdW5uZXIucnVuKGFjdGlvbik7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9TdGFja01hcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1N0YWNrTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTI2ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1N0YWNrTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotLyoqCi0gKiBAYXV0aG9yIG5pdGluCi0gKiAKLSAqLwotY2xhc3MgU3RhY2tNYXAgewotCi0JcHJpdmF0ZSBNYXAgZkludGVybmFsTWFwID0gbnVsbDsKLQotCXB1YmxpYyBTdGFja01hcCgpIHsKLQkJZkludGVybmFsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCBtYXBwaW5ncyBmcm9tIHRoaXMgU3RhY2tNYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJZkludGVybmFsTWFwLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9zdCByZWNlbnRseSBwdXNoZWQgdmFsdWUgdG8gd2hpY2ggdGhpcyBtYXAgbWFwcyB0aGUKLQkgKiBzcGVjaWZpZWQga2V5LiBSZXR1cm5zIDx0dD5udWxsPC90dD4gaWYgdGhlIG1hcCBjb250YWlucyBubyBtYXBwaW5nCi0JICogZm9yIHRoaXMga2V5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIGtleSB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkLgotCSAqIEByZXR1cm4gdGhlIG1vc3QgcmVjZW50bHkgcHV0IHZhbHVlIHRvIHdoaWNoIHRoaXMgbWFwIG1hcHMgdGhlCi0JICogICAgICAgICBzcGVjaWZpZWQga2V5LCBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBtYXAgY29udGFpbnMgbm8KLQkgKiAgICAgICAgIG1hcHBpbmcgZm9yIHRoaXMga2V5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgcGVlayhPYmplY3Qga2V5KSB7Ci0JCVN0YWNrIHN0YWNrID0gKFN0YWNrKSBmSW50ZXJuYWxNYXAuZ2V0KGtleSk7Ci0JCWlmIChzdGFjayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgbyA9IHN0YWNrLnBlZWsoKTsKLQkJCWlmIChzdGFjay5pc0VtcHR5KCkpIHsKLQkJCQlmSW50ZXJuYWxNYXAucmVtb3ZlKGtleSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBc3NvY2lhdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIG1hcC4gSWYKLQkgKiB0aGUgbWFwIHByZXZpb3VzbHkgY29udGFpbmVkIGEgbWFwcGluZyBmb3IgdGhpcyBrZXksIHRoZSBvbGQgdmFsdWUgaXMKLQkgKiBwdXNoZWQgb250byB0aGUgdG9wIG9mIHRoaXMga2V5J3MgcHJpdmF0ZSBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBrZXkgd2l0aCB3aGljaCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIHRvIGJlIGFzc29jaWF0ZWQuCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0JICogQHJldHVybiBuZXdlc3QgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHNwZWNpZmllZCBrZXkKLQkgKiAKLQkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIDx0dD5wdXQ8L3R0PiBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzCi0JICogICAgICAgICAgICAgU3RhY2tNYXAuCi0JICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCBrZXkgb3IgdmFsdWUgcHJldmVudHMgaXQgZnJvbQotCSAqICAgICAgICAgICAgIGJlaW5nIHN0b3JlZCBpbiB0aGlzIFN0YWNrTWFwLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgc29tZSBhc3BlY3Qgb2YgdGhpcyBrZXkgb3IgdmFsdWUgcHJldmVudHMgaXQgZnJvbSBiZWluZwotCSAqICAgICAgICAgICAgIHN0b3JlZCBpbiB0aGlzIFN0YWNrTWFwLgotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24sCi0JICogICAgICAgICAgICAgYXMgdGhpcyBtYXAgZG9lcyBub3QgcGVybWl0IDx0dD5udWxsPC90dD4ga2V5cyBvciB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHB1c2goT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCVN0YWNrIHN0YWNrID0gKFN0YWNrKSBmSW50ZXJuYWxNYXAuZ2V0KGtleSk7Ci0JCWlmIChzdGFjayA9PSBudWxsKSB7Ci0JCQlzdGFjayA9IG5ldyBTdGFjaygpOwotCQkJZkludGVybmFsTWFwLnB1dChrZXksIHN0YWNrKTsKLQkJfQotCQlPYmplY3QgbyA9IHN0YWNrLnB1c2godmFsdWUpOwotCQlyZXR1cm4gbzsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBtb3N0LXJlY2VudCBtYXBwaW5nIGZvciB0aGlzIGtleSBmcm9tIHRoaXMgU3RhY2tNYXAgaWYgaXQKLQkgKiBpcyBwcmVzZW50LgotCSAqIAotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBtYXAgcHJldmlvdXNseSBhc3NvY2lhdGVkIHRoZSBrZXksIG9yCi0JICogPHR0Pm51bGw8L3R0PiBpZiB0aGUgbWFwIGNvbnRhaW5lZCBubyBtYXBwaW5nIGZvciB0aGlzIGtleS4gVGhlIG1hcAotCSAqIHdpbGwgbm90IGNvbnRhaW4gYSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGtleSBvbmNlIHRoZSBjYWxsIHJldHVybnMuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAga2V5IHdob3NlIHN0YWNrIGlzIHRvIGJlIHBvcHBlZAotCSAqIEByZXR1cm4gbW9zdC1yZWNlbnRseSBwdXNoZWQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHNwZWNpZmllZCBrZXksIG9yCi0JICogICAgICAgICA8dHQ+bnVsbDwvdHQ+IGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nIGZvciBrZXkuCi0JICogCi0JICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUga2V5IGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhpcyBtYXAuCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBrZXkgaXMgPHR0Pm51bGw8L3R0PiBhcyB0aGlzIGNsYXNzIGRvZXMgbm90IHBlcm1pdAotCSAqICAgICAgICAgICAgIDx0dD5udWxsPC90dD4ga2V5cwotCSAqLwotCXB1YmxpYyBPYmplY3QgcG9wKE9iamVjdCBrZXkpIHsKLQkJU3RhY2sgc3RhY2sgPSAoU3RhY2spIGZJbnRlcm5hbE1hcC5nZXQoa2V5KTsKLQkJaWYgKHN0YWNrICE9IG51bGwpIHsKLQkJCU9iamVjdCBvID0gc3RhY2sucG9wKCk7Ci0JCQlpZiAoc3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkJZkludGVybmFsTWFwLnJlbW92ZShrZXkpOwotCQkJfQotCQkJcmV0dXJuIG87Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0gICAgLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBTdGFja01hcCwgdGhlIHN1bSBvZiB0aGUgc2l6ZXMgb2YKLQkgKiBldmVyeSByZW1lbWJlcmVkIHN0YWNrLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgbWFwLgotCSAqLwotCWludCBzaXplKCkgewotCQlpbnQgc2l6ZSA9IDA7Ci0JCUl0ZXJhdG9yIGkgPSBmSW50ZXJuYWxNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDb2xsZWN0aW9uIGMgPSAoQ29sbGVjdGlvbikgaS5uZXh0KCk7Ci0JCQlzaXplICs9IGMuc2l6ZSgpOwotCQl9Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIG9mIHRoZSB2YWx1ZXMgb2YgdGhpcyBTdGFja01hcC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZXMgb2YgZXZlcnkgU3RhY2sgd2l0aGluIHRoaXMgU3RhY2tNYXAuCi0JICovCi0JQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0JCUNvbGxlY3Rpb24gdmFsdWVzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJSXRlcmF0b3IgaSA9IGZJbnRlcm5hbE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNvbGxlY3Rpb24gYyA9IChDb2xsZWN0aW9uKSBpLm5leHQoKTsKLQkJCXZhbHVlcy5hZGRBbGwoYyk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvVGFnVHJhbnNsYXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvVGFnVHJhbnNsYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMjVmY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLWNsYXNzIFRhZ1RyYW5zbGF0aW9uQWRhcHRlciBleHRlbmRzIEpTUFRyYW5zbGF0aW9uQWRhcHRlciB7Ci0JVGFnVHJhbnNsYXRpb25BZGFwdGVyKElET01Nb2RlbCB4bWxNb2RlbCkgewotCQlzdXBlcih4bWxNb2RlbCk7Ci0JfQotCi0JSlNQVHJhbnNsYXRvciBjcmVhdGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRhZ1RyYW5zbGF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvVGFnVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgwNzk3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvVGFnVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotcHVibGljIGNsYXNzIFRhZ1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IHsKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIikpLmJvb2xlYW5WYWx1ZSgpOyAvLyROT04tTkxTLTEkOwotCQotCXByaXZhdGUgVGFnVHJhbnNsYXRpb25BZGFwdGVyIGZBZGFwdGVyID0gbnVsbDsKLQotCXB1YmxpYyBUYWdUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcihJSlNQVHJhbnNsYXRpb24uY2xhc3MsIHRydWUpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgVGFnVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUgJiYgZkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJZkFkYXB0ZXIgPSBuZXcgVGFnVHJhbnNsYXRpb25BZGFwdGVyKCgoSURPTU5vZGUpIHRhcmdldCkuZ2V0TW9kZWwoKSk7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBUYWdUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IFsiICsgdGhpcyArICJdIGNyZWF0ZWQgYWRhcHRlcjogIiArIGZBZGFwdGVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZBZGFwdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChmQWRhcHRlciAhPSBudWxsKSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigtKSBUYWdUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IFsiICsgdGhpcyArICJdIHJlbGVhc2luZyBhZGFwdGVyOiAiICsgZkFkYXB0ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWZBZGFwdGVyLnJlbGVhc2UoKTsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9UYWdUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkN2MxN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWNsYXNzIFRhZ1RyYW5zbGF0b3IgZXh0ZW5kcyBKU1BUcmFuc2xhdG9yIHsKLQotCXB1YmxpYyBUYWdUcmFuc2xhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlmQ2xhc3NIZWFkZXIgPSAicHVibGljIGNsYXNzIF9UYWdIYW5kbGVyIGV4dGVuZHMgIjsgLy8kTk9OLU5MUy0xJAotCQlmQ2xhc3NuYW1lID0gIl9UYWdIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JCWZJbXBsaWNpdEltcG9ydHMgPSAiaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC4qOyIgKyBFTkRMICsgRU5ETDsgLy8kTk9OLU5MUy0xJAotCi0JCWZTZXJ2aWNlSGVhZGVyID0gInB1YmxpYyB2b2lkIGRvVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBTa2lwUGFnZUV4Y2VwdGlvbiB7IiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJCSJKc3BDb250ZXh0IGpzcENvbnRleHQgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dCBhcHBsaWNhdGlvbiA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZheC5zZXJ2bGV0LmpzcC5Kc3BXcml0ZXIgb3V0ID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZyBjb25maWcgPSBudWxsOyIgKyBFTkRMOyAvLyROT04tTkxTLTEkIAotCi0JCWZTdXBlcmNsYXNzID0gImphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5TaW1wbGVUYWdTdXBwb3J0IjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9YTUxKU1BSZWdpb25IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9YTUxKU1BSZWdpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjNjg2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvWE1MSlNQUmVnaW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSlNQRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkZpbGVDb250ZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBQYXJzZXIvaGVscGVyIGNsYXNzIGZvciBKU1BUcmFuc2xhdG9yLiBVc2VkIGZvciBwYXJzaW5nIFhNTC1KU1AgcmVnaW9ucyAoaW4KLSAqIGEgc2NyaXB0IGJsb2NrKSBBIGxvdCBvZiBsb2dpYyBib3Jyb3dlZCBmcm9tIFRMRENNRG9jdW1lbnRNYW5hZ2VyLiBUaGVyZQotICogc2hvdWxkIGJlIG9ubHkgb25lIFhNTEpTUFJlZ2lvbkhlbHBlciBwZXIgdGV4dCBmaWxlCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLWNsYXNzIFhNTEpTUFJlZ2lvbkhlbHBlciBpbXBsZW1lbnRzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgewotCXByaXZhdGUgZmluYWwgSlNQVHJhbnNsYXRvciBmVHJhbnNsYXRvcjsKLQlwcm90ZWN0ZWQgSlNQU291cmNlUGFyc2VyIGZMb2NhbFBhcnNlciA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBmVGV4dFRvUGFyc2UgPSBudWxsOwotCS8vIG5lZWQgdGhpcyBpZiBub3QgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudCAoZWcuIHBhcnNpbmcganVzdCBhCi0JLy8gc2NyaXB0IGJsb2NrKQotCXByb3RlY3RlZCBpbnQgZlN0YXJ0T2ZUZXh0VG9QYXJzZSA9IDA7Ci0JLy8gbmFtZSBvZiB0aGUgb3BlbiB0YWcgdGhhdCB3YXMgbGFzdCBoYW5kbGVkIChpZiB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBpdCkKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUYWduYW1lID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUZXh0QmVmb3JlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIGZVbmVzY2FwZWRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTdHJpcHBlZFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCS8vIGZvciByZWNvbmNpbGluZyBjdXJzb3IgcG9zaXRpb24gbGF0ZXIKLQlpbnQgZlBvc3NpYmxlT3duZXIgPSBKU1BUcmFuc2xhdG9yLlNDUklQVExFVDsKLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHJhbnNsYXRlZCBzb3VyY2UgYXBwZW5kcyBhcmUgaW5kaWNhdGVkIGFzCi0JICogImluZGlyZWN0IiwgYWZmZWN0aW5nIGhvdyBvZmZzZXRzIGFyZSBtYXBwZWQuCi0JICovCi0JYm9vbGVhbiBmQXBwZW5kQXNJbmRpcmVjdFNvdXJjZTsKLQotCXB1YmxpYyBYTUxKU1BSZWdpb25IZWxwZXIoSlNQVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBib29sZWFuIGFwcGVuZEFzSW5kaXJlY3RTb3VyY2UpIHsKLQkJZ2V0TG9jYWxQYXJzZXIoKS5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKHRoaXMpOwotCQl0aGlzLmZUcmFuc2xhdG9yID0gdHJhbnNsYXRvcjsKLQkJZkFwcGVuZEFzSW5kaXJlY3RTb3VyY2UgPSBhcHBlbmRBc0luZGlyZWN0U291cmNlOwotCX0KLQotCXByb3RlY3RlZCBKU1BTb3VyY2VQYXJzZXIgZ2V0TG9jYWxQYXJzZXIoKSB7Ci0JCWlmIChmTG9jYWxQYXJzZXIgPT0gbnVsbCkKLQkJCWZMb2NhbFBhcnNlciA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJcmV0dXJuIGZMb2NhbFBhcnNlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJZkxvY2FsUGFyc2VyLmFkZEJsb2NrTWFya2VyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIHRleHRUb1BhcnNlKSB7Ci0JCXJlc2V0KHRleHRUb1BhcnNlLCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgdGV4dFRvUGFyc2UsIGludCBzdGFydCkgewotCQlmU3RhcnRPZlRleHRUb1BhcnNlID0gc3RhcnQ7Ci0JCWZUZXh0VG9QYXJzZSA9IHRleHRUb1BhcnNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcmNlUGFyc2UoKSB7Ci0JCVN0cmluZyBjb250ZW50cyA9IGZUZXh0VG9QYXJzZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIG5ldyBKU1BEb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZihjb250ZW50cyAhPSBudWxsICYmIGRvY3VtZW50ICE9IG51bGwpIHsJCQotCQkJLy8gZnJvbSBvdXRlciBjbGFzcwotCQkJTGlzdCBibG9ja01hcmtlcnMgPSB0aGlzLmZUcmFuc2xhdG9yLmdldEJsb2NrTWFya2VycygpOwotCQkJLy8gdGhpcyBhZGRzIHRoZSBjdXJyZW50IG1hcmtlcnMgZnJvbSB0aGUgb3V0ZXIgY2xhc3MgbGlzdAotCQkJLy8gdG8gdGhpcyBwYXJzZXIgc28gcGFyc2luZyB3b3JrcyBjb3JyZWN0bHkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkQmxvY2tNYXJrZXIoKEJsb2NrTWFya2VyKSBibG9ja01hcmtlcnMuZ2V0KGkpKTsKLQkJCX0KLQkJCXJlc2V0KGNvbnRlbnRzKTsKLQkKLQkJCWRvY3VtZW50LnNldChjb250ZW50cyk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnNvciA9IGRvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQl3aGlsZShjdXJzb3IgIT0gbnVsbCkgewotCQkJCW5vZGVQYXJzZWQoY3Vyc29yKTsKLQkJCQljdXJzb3IgPSBjdXJzb3IuZ2V0TmV4dCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBwYXJzZSBhbiBlbnRpcmUgZmlsZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZSBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGFyc2UoU3RyaW5nIGZpbGVQYXRoU3RyaW5nKSB7Ci0JCWJvb2xlYW4gcGFyc2VkID0gZmFsc2U7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQlTdHJpbmcgY29udGVudHMgPSBudWxsOwotCi0JCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZVBhdGhTdHJpbmcpOwotCQlJRmlsZSBmID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJaWYgKGYgPT0gbnVsbCB8fCAhZi5pc0FjY2Vzc2libGUoKSkgewotCQkJZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKGZpbGVQYXRoKTsKLQkJfQotCQlpZiAoZiAhPSBudWxsICYmIGYuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCS8qCi0JCQkgKiB1c2luZyBhIHJlYWwgZG9jdW1lbnQgYWxsb3dzIHVzIHRvIHB1bGwgb3V0IHRleHQgaW4gdGhlCi0JCQkgKiB0cmFuc2xhdG9yIGZvciBkZWFsaW5nIHdpdGggVEVJIHZhcmlhYmxlcwotCQkJICovCi0JCQl0cnkgewotCQkJCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IE1vZGVsSGFuZGxlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SGFuZGxlckZvcihmLCBmYWxzZSk7Ci0JCQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCQkJaGFuZGxlciA9IE1vZGVsSGFuZGxlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlSWQoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUEZSQUdNRU5UKTsKLQkJCQlkb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJY29udGVudHMgPSBGaWxlQ29udGVudENhY2hlLmdldEluc3RhbmNlKCkuZ2V0Q29udGVudHMoZi5nZXRGdWxsUGF0aCgpKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCWlmIChjb250ZW50cyAhPSBudWxsICYmIGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCS8vIGZyb20gb3V0ZXIgY2xhc3MKLQkJCUxpc3QgYmxvY2tNYXJrZXJzID0gdGhpcy5mVHJhbnNsYXRvci5nZXRCbG9ja01hcmtlcnMoKTsKLQkJCS8vIHRoaXMgYWRkcyB0aGUgY3VycmVudCBtYXJrZXJzIGZyb20gdGhlIG91dGVyIGNsYXNzIGxpc3QKLQkJCS8vIHRvIHRoaXMgcGFyc2VyIHNvIHBhcnNpbmcgd29ya3MgY29ycmVjdGx5Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJCWFkZEJsb2NrTWFya2VyKChCbG9ja01hcmtlcikgYmxvY2tNYXJrZXJzLmdldChpKSk7Ci0JCQl9Ci0JCQlyZXNldChjb250ZW50cyk7Ci0JCQkvLyBmb3JjZXMgcGFyc2UKLQkJCWRvY3VtZW50LnNldChjb250ZW50cyk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnNvciA9IGRvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQl3aGlsZSAoY3Vyc29yICE9IG51bGwpIHsKLQkJCQlub2RlUGFyc2VkKGN1cnNvcik7Ci0JCQkJY3Vyc29yID0gY3Vyc29yLmdldE5leHQoKTsKLQkJCX0KLQkJCXBhcnNlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlZDsKLQl9Ci0KLQotCS8qCi0JICogbGlzdGVucyB0byBwYXJzZXIgbm9kZSBwYXJzZWQgZXZlbnRzIGFkZHMgdG8gbG9jYWwgc2NyaXBsZXQsCi0JICogZXhwcmVzc2lvbiwgZGVjbGFyYXRpb24gYnVmZmVycyBkZXRlcm1pbmVzIHdoaWNoIHR5cGUgb2YgcmVnaW9uIHRoZQotCSAqIGN1cnNvciBpcyBpbiwgYW5kIGFkanVzdHMgY3Vyc29yIG9mZnNldCBhY2NvcmRpbmdseQotCSAqLwotCXB1YmxpYyB2b2lkIG5vZGVQYXJzZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCi0JCXRyeSB7Ci0JCQlpZiAoaXNKU1BFbmRSZWdpb24oc2RSZWdpb24pKSB7Ci0JCQkJU3RyaW5nIG5hbWVTdHIgPSBnZXRSZWdpb25OYW1lKHNkUmVnaW9uKTsKLQkJCQlpZiAoaXNQb3NzaWJsZUN1c3RvbVRhZyhuYW1lU3RyKSkgewotCQkJCQkvLyB0aGlzIGN1c3RvbSB0YWcgbWF5IGRlZmluZSB2YXJpYWJsZXMKLQkJCQkJdGhpcy5mVHJhbnNsYXRvci5hZGRUYWdsaWJWYXJpYWJsZXMobmFtZVN0ciwgc2RSZWdpb24pOwotCQkJCX0KLQkJCQlmVGFnbmFtZSA9IG51bGw7Ci0JCQl9Ci0JCQllbHNlIGlmIChpc0pTUFN0YXJ0UmVnaW9uKHNkUmVnaW9uKSkgewotCQkJCWludCBpbGxlZ2FsQ29udGVudCA9IGhhc0lsbGVnYWxDb250ZW50KHNkUmVnaW9uKTsKLQkJCQlpZiAoaWxsZWdhbENvbnRlbnQgPj0gMCkKLQkJCQkJZGVjb2RlUmVtYWluaW5nUmVnaW9ucyhzZFJlZ2lvbiwgaWxsZWdhbENvbnRlbnQpOwotCQkJCVN0cmluZyBuYW1lU3RyID0gZ2V0UmVnaW9uTmFtZShzZFJlZ2lvbik7Ci0JCQkJaWYgKHNkUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQkJCWlmIChpc1Bvc3NpYmxlQ3VzdG9tVGFnKG5hbWVTdHIpKSB7Ci0JCQkJCQkvLyB0aGlzIGN1c3RvbSB0YWcgbWF5IGRlZmluZSB2YXJpYWJsZXMKLQkJCQkJCXRoaXMuZlRyYW5zbGF0b3IuYWRkVGFnbGliVmFyaWFibGVzKG5hbWVTdHIsIHNkUmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoaXNKU1BSZWdpb24obmFtZVN0cikpCi0JCQkJCWZUYWduYW1lID0gbmFtZVN0cjsKLQkJCQllbHNlCi0JCQkJCWZUYWduYW1lID0gbnVsbDsKLQotCi0JCQkJLy8gdGhpcyBzZWN0aW9uIGFzc3VtZXMgaW1wb3J0YW50IGNvbnRlbnQgKHRvIHRyYW5zbGF0ZSkKLQkJCQkvLyBJUyB0aGUgb3BlbmluZyB0YWcKLQotCQkJCS8vIGhhbmRsZSBpbmNsdWRlIGFuZCBkaXJlY3RpdmUKLQkJCQlpZiAoZlRhZ25hbWUgIT0gbnVsbCkgewotCQkJCQlwcm9jZXNzT3RoZXJSZWdpb25zKHNkUmVnaW9uKTsKLQkJCQl9Ci0KLQotCQkJCS8vIGhhbmRsZSBqc3A6dXNlQmVhbgotCQkJCWlmIChmVGFnbmFtZSAhPSBudWxsICYmIGZUYWduYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKSkgewotCQkJCQlwcm9jZXNzVXNlQmVhbihzZFJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQgfHwgc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJCS8vIHRoaXMgc2VjdGlvbiBhc3N1bWVzIGltcG9ydGFudCBjb250ZW50ICh0byB0cmFuc2xhdGUpCi0JCQkJLy8gaXMgQUZURVIgdGhlIG9wZW5pbmcgdGFnCi0JCQkJaWYgKGZUYWduYW1lICE9IG51bGwpIHsKLQkJCQkJLy8gYXNzaWduIGNvbnRlbnRzIHRvIG9uZSBvZiB0aGUgdGFibGVzCi0JCQkJCWlmIChpc1NjcmlwdGxldChmVGFnbmFtZSkpIHsKLQkJCQkJCXByb2Nlc3NTY3JpcHRsZXQoc2RSZWdpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzRXhwcmVzc2lvbihmVGFnbmFtZSkpIHsKLQkJCQkJCXByb2Nlc3NFeHByZXNzaW9uKHNkUmVnaW9uKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0RlY2xhcmF0aW9uKGZUYWduYW1lKSkgewotCQkJCQkJcHJvY2Vzc0RlY2xhcmF0aW9uKHNkUmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWZUYWduYW1lID0gbnVsbDsKLQkJCQkvKgotCQkJCSAqIFdlIG1heSBoYXZlIGJlZW4gYXNrZWQgdG8gZGVjb2RlIGEgc2NyaXB0IGJsb2NrIHdpdGggYW4gWE1MCi0JCQkJICogY29tbWVudCBpbiBpdCAoYSBjb21tb24gcHJvdmlzaW9uIGZvciBicm93c2VycyBub3QKLQkJCQkgKiBzdXBwb3J0aW5nIGNsaWVudCBzY3JpcHRpbmcpLiBXaGlsZQotCQkJCSAqIHNjcmlwdGxldHMvZXhwcmVzc2lvbnMvZGVjbGFyYXRpb25zIHdpbGwgYmUgaWRlbnRpZmllZCBhcwotCQkJCSAqIHBhcnQgb2YgdGhlIG5vcm1hbCBwYXJzaW5nIHByb2Nlc3MsIHRoZSB0ZW1wb3JhcnkgZG9jdW1lbnQKLQkJCQkgKiB1c2VkIGhlcmUgd2lsbCBiZSBwYXJzZWQgZGlmZmVyZW50bHksIHJlc3BlY3RpbmcgdGhlCi0JCQkJICogY29tbWVudCBzaW5jZSBpdCdzIG5vdCBpbiBhIHRhZyBibG9jayByZWdpb24gYW55IG1vcmUsIGFuZAotCQkJCSAqIHRoZSBjdXN0b20gdGFncyBpbiB0aGUgY29tbWVudCB3aWxsIG5vdCBiZSBmb3VuZC4gUnVuIHRob3NlCi0JCQkJICogY29tbWVudCB0ZXh0IHBpZWNlcyB0aHJvdWdoIHRoZSB0cmFuc2xhdG9yIG9uIHRoZWlyIG93bi4KLQkJCQkgKi8KLQkJCQlJdGVyYXRvciByZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkJCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQuZXF1YWxzKHJlZ2lvbi5nZXRUeXBlKCkpICYmIHJlZ2lvbi5nZXRTdGFydCgpICE9IDApIHsKLQkJCQkJCWZUcmFuc2xhdG9yLmRlY29kZVNjcmlwdEJsb2NrKHNkUmVnaW9uLmdldEZ1bGxUZXh0KHJlZ2lvbiksIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gdGhpcyB1cGRhdGVzIGN1cnNvciBwb3NpdGlvbgotCQkJY2hlY2tDdXJzb3JJblJlZ2lvbihzZFJlZ2lvbik7Ci0JCX0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZ2dpbmcgdGhpcyBleGNlcHRpb24gdGhhdCBJJ3ZlIHNlZW4gYSBjb3VwbGUgb2YgdGltZXMuLi4KLQkJCS8vIHNlZW1zIHRvIGhhcHBlbiBkdXJpbmcgc2h1dGRvd24gb2YgdW5pdCB0ZXN0cywgYXQgd2hpY2gKLQkJCS8vIHBvaW50IExvZ2dlciBoYXMgYWxyZWFkeSBiZWVuIHVubG9hZGVkCi0JCQl0cnkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIlhNTEpTUFJlZ2lvbkhlbHBlcjogZXhjZXB0aW9uIGluIG5vZGUgcGFyc2luZyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZXgpIHsKLQkJCQkvLyBkbyBub3RoaW5nLCBzaW5jZSB3ZSdyZSBqdXN0IGVuZGluZwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlY29kZVJlbWFpbmluZ1JlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgaW50IHN0YXJ0KSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpZihyZWdpb25MaXN0ICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbkxpc3QuZ2V0KHN0YXJ0KTsKLQkJCVN0cmluZyB0ZXh0ID0gc2RSZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgcmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmdldFN0YXJ0KCkgPD0gdGV4dC5sZW5ndGgoKSkKLQkJCQlmVHJhbnNsYXRvci5kZWNvZGVTY3JpcHRCbG9jayh0ZXh0LnN1YnN0cmluZyhyZWdpb24uZ2V0U3RhcnQoKSwgdGV4dC5sZW5ndGgoKSksIDApOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgaGFzSWxsZWdhbENvbnRlbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbkxpc3QgbGlzdCA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBsaXN0LmdldChpKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKQotCQkJCXJldHVybiBpOwotCQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0Tm9kZXMoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tDdXJzb3JJblJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCS8vIGlmIGN1cnNvciBpcyBpbiB0aGlzIHJlZ2lvbi4uLgotCQlpZiAodGhpcy5mVHJhbnNsYXRvci5nZXRTb3VyY2VQb3NpdGlvbigpID49IGZTdGFydE9mVGV4dFRvUGFyc2UgKyBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICYmIHRoaXMuZlRyYW5zbGF0b3IuZ2V0U291cmNlUG9zaXRpb24oKSA8PSBmU3RhcnRPZlRleHRUb1BhcnNlICsgc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCWludCBlbmRPZk5hbWVUYWcgPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IG9mZnNldCA9IGZUZXh0QmVmb3JlLmxlbmd0aCgpIC0gZlN0cmlwcGVkVGV4dC5sZW5ndGgoKTsKLQkJCS8vIG9mZnNldCBpbiBhZGR0aW9uIHRvIHdoYXQncyBhbHJlYWR5IGluIHRoZSBidWZmZXIKLQkJCXRoaXMuZlRyYW5zbGF0b3Iuc2V0UmVsYXRpdmVPZmZzZXQodGhpcy5mVHJhbnNsYXRvci5nZXRTb3VyY2VQb3NpdGlvbigpIC0gKGZTdGFydE9mVGV4dFRvUGFyc2UgKyBlbmRPZk5hbWVUYWcpIC0gb2Zmc2V0KTsKLQkJCS8vIG91dGVyIGNsYXNzIG1ldGhvZAotCQkJdGhpcy5mVHJhbnNsYXRvci5zZXRDdXJzb3JPd25lcihmUG9zc2libGVPd25lcik7Ci0JCQkvLyBhZGQgbGVuZ3RoIG9mIHdoYXQncyBhbHJlYWR5IGluIHRoZSBidWZmZXIKLQkJCXRoaXMuZlRyYW5zbGF0b3Iuc2V0UmVsYXRpdmVPZmZzZXQodGhpcy5mVHJhbnNsYXRvci5nZXRSZWxhdGl2ZU9mZnNldCgpICsgdGhpcy5mVHJhbnNsYXRvci5nZXRDdXJzb3JPd25lcigpLmxlbmd0aCgpKTsKLQkJCWlmIChmUG9zc2libGVPd25lciA9PSBKU1BUcmFuc2xhdG9yLkVYUFJFU1NJT04pIHsKLQkJCQkvLyBhZGQgbGVuZ3RoIG9mIGV4cHJlc3Npb24gcHJlZml4IGlmIG5lY2Vzc2FyeS4uLgotCQkJCXRoaXMuZlRyYW5zbGF0b3Iuc2V0UmVsYXRpdmVPZmZzZXQodGhpcy5mVHJhbnNsYXRvci5nZXRSZWxhdGl2ZU9mZnNldCgpICsgSlNQVHJhbnNsYXRvci5FWFBSRVNTSU9OX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRGVjbGFyYXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlwcmVwYXJlVGV4dChzZFJlZ2lvbik7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBmVHJhbnNsYXRvci5nZXRDdXJyZW50Tm9kZSgpOwotCQl0aGlzLmZUcmFuc2xhdG9yLnRyYW5zbGF0ZURlY2xhcmF0aW9uU3RyaW5nKGZTdHJpcHBlZFRleHQsIGN1cnJlbnROb2RlLCBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50Tm9kZS5nZXRMZW5ndGgoKSwgZkFwcGVuZEFzSW5kaXJlY3RTb3VyY2UpOwotCQlmUG9zc2libGVPd25lciA9IEpTUFRyYW5zbGF0b3IuREVDTEFSQVRJT047Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0V4cHJlc3Npb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlwcmVwYXJlVGV4dChzZFJlZ2lvbik7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBmVHJhbnNsYXRvci5nZXRDdXJyZW50Tm9kZSgpOwotCQl0aGlzLmZUcmFuc2xhdG9yLnRyYW5zbGF0ZUV4cHJlc3Npb25TdHJpbmcoZlN0cmlwcGVkVGV4dCwgY3VycmVudE5vZGUsIGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnROb2RlLmdldExlbmd0aCgpLCBmQXBwZW5kQXNJbmRpcmVjdFNvdXJjZSk7Ci0JCWZQb3NzaWJsZU93bmVyID0gSlNQVHJhbnNsYXRvci5FWFBSRVNTSU9OOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NTY3JpcHRsZXQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlwcmVwYXJlVGV4dChzZFJlZ2lvbik7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBmVHJhbnNsYXRvci5nZXRDdXJyZW50Tm9kZSgpOwotCQl0aGlzLmZUcmFuc2xhdG9yLnRyYW5zbGF0ZVNjcmlwdGxldFN0cmluZyhmU3RyaXBwZWRUZXh0LCBjdXJyZW50Tm9kZSwgY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgY3VycmVudE5vZGUuZ2V0TGVuZ3RoKCksIGZBcHBlbmRBc0luZGlyZWN0U291cmNlKTsKLQkJZlBvc3NpYmxlT3duZXIgPSBKU1BUcmFuc2xhdG9yLlNDUklQVExFVDsKLQl9Ci0KLQkvKgotCSAqIFN1YnN0aXR1dGVzIHZhbHVlcyBmb3IgZW50aXR5IHJlZmVyZW5jZXMsIHN0cmlwcyBDREFUQSB0YWdzLCBhbmQga2VlcHMKLQkgKiB0cmFjayBvZiBzdHJpbmcgbGVuZ3RoKHMpIGZvciBjdXJzb3IgcG9zaXRpb24gY2FsY3VsYXRpb24gbGF0ZXIuIEBwYXJhbQotCSAqIHNkUmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlmVGV4dEJlZm9yZSA9IGZUZXh0VG9QYXJzZS5zdWJzdHJpbmcoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KCkpOwotCQlmVW5lc2NhcGVkVGV4dCA9IEVzY2FwZWRUZXh0VXRpbC5nZXRVbmVzY2FwZWRUZXh0KGZUZXh0QmVmb3JlKTsKLQkJZlN0cmlwcGVkVGV4dCA9IHRoaXMuZlRyYW5zbGF0b3Iuc3RyaXBDREFUQShmVW5lc2NhcGVkVGV4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1VzZUJlYW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlpZiAoZlRhZ25hbWUgIT0gbnVsbCAmJiBpc1VzZUJlYW4oZlRhZ25hbWUpKSB7Ci0KLQkJCVN0cmluZyBiZWFuQ2xhc3MsIGJlYW5UeXBlLCBiZWFuSWQsIGJlYW5EZWNsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWJlYW5DbGFzcyA9IGdldEF0dHJpYnV0ZVZhbHVlKCJjbGFzcyIsIHNkUmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJYmVhblR5cGUgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgidHlwZSIsIHNkUmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJYmVhbklkID0gZ2V0QXR0cmlidXRlVmFsdWUoImlkIiwgc2RSZWdpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmIChiZWFuSWQgIT0gbnVsbCAmJiAoYmVhblR5cGUgIT0gbnVsbCB8fCBiZWFuQ2xhc3MgIT0gbnVsbCkpIHsKLQkJCQlTdHJpbmcgcHJlZml4ID0gbnVsbDsKLQkJCQlpZiAoYmVhblR5cGUubGVuZ3RoKCkgIT0gMCkgewotCQkJCQkvKiBhIHR5cGUgd2FzIHNwZWNpZmllZCAqLwotCQkJCQlwcmVmaXggPSBiZWFuVHlwZSArICIgIiArIGJlYW5JZCArICIgPSAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8qIG5vIHR5cGUgd2FzIHNwZWNpZmllZCwgdXNlIHRoZSBjb25jcmV0ZSBjbGFzcyB2YWx1ZSAqLwotCQkJCQlwcmVmaXggPSBiZWFuQ2xhc3MgKyAiICIgKyBiZWFuSWQgKyAiID0gIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCS8qCi0JCQkJICogRGVmaW5lIGFzIG51bGwgYnkgZGVmYXVsdC4gSWYgYSBjb25jcmV0ZSBjbGFzcyB3YXMKLQkJCQkgKiBzcGVjaWZpZWQsIHN1cHBseSBhIGRlZmF1bHQgY29uc3RydWN0b3IgaW52b2NhdGlvbiBpbnN0ZWFkLgotCQkJCSAqLwotCQkJCVN0cmluZyBzdWZmaXggPSAibnVsbDtcbiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyAxODY3NzEgLSBKU1AgVmFsaWRhdG9yIHByb2JsZW0gd2l0aCBpbmNsdWRlZCB1c2VCZWFuCi0JCQkJaWYgKGJlYW5DbGFzcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJc3VmZml4ID0gIm5ldyAiICsgYmVhbkNsYXNzICsgIigpO1xuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWJlYW5EZWNsID0gcHJlZml4ICsgc3VmZml4OwotCQkJfQotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKTsKLQkJCXRoaXMuZlRyYW5zbGF0b3IudHJhbnNsYXRlU2NyaXB0bGV0U3RyaW5nKGJlYW5EZWNsLCBjdXJyZW50Tm9kZSwgY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgY3VycmVudE5vZGUuZ2V0TGVuZ3RoKCksIGZBcHBlbmRBc0luZGlyZWN0U291cmNlKTsKLQkJCWZQb3NzaWJsZU93bmVyID0gSlNQVHJhbnNsYXRvci5TQ1JJUFRMRVQ7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzT3RoZXJSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUoc2RSZWdpb24pOwotCQlwcm9jZXNzUGFnZURpcmVjdGl2ZShzZFJlZ2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlpZiAoaXNJbmNsdWRlRGlyZWN0aXZlKGZUYWduYW1lKSkgewotCQkJLy8gdGhlIGRpcmVjdGl2ZSBuYW1lIHJlZ2lvbiBpdHNlbGYgY29udGFpbnMgdGhlIGF0dHJzLi4uCi0JCQlpZiAoc2RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgwKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkKLQkJCQlzZFJlZ2lvbiA9IHNkUmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQlTdHJpbmcgZmlsZUxvY2F0aW9uID0gZ2V0QXR0cmlidXRlVmFsdWUoImZpbGUiLCBzZFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuZlRyYW5zbGF0b3IuaGFuZGxlSW5jbHVkZUZpbGUoZmlsZUxvY2F0aW9uKTsKLQkJfQotCQllbHNlIGlmIChpc1RhZ2xpYkRpcmVjdGl2ZShmVGFnbmFtZSkpIHsKLQkJCS8vIGFsc28gYWRkIHRoZSBvbmVzIGNyZWF0ZWQgaGVyZSB0byB0aGUgcGFyZW50IGRvY3VtZW50Ci0JCQlTdHJpbmcgcHJlZml4ID0gZ2V0QXR0cmlidXRlVmFsdWUoInByZWZpeCIsIHNkUmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyID0gdGhpcy5mVHJhbnNsYXRvci5nZXRUTERDTURvY3VtZW50TWFuYWdlcigpOwotCQkJaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJTGlzdCBkb2NzID0gZG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnRUcmFja2VycyhwcmVmaXgsIHRoaXMuZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlJdGVyYXRvciBpdCA9IGRvY3MuaXRlcmF0b3IoKTsKLQkJCQlJdGVyYXRvciBlbGVtZW50cyA9IG51bGw7Ci0JCQkJQ01Ob2RlIG5vZGUgPSBudWxsOwotCQkJCUNNRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJCQlCbG9ja01hcmtlciBtYXJrZXIgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJZG9jID0gKENNRG9jdW1lbnQpIGl0Lm5leHQoKTsKLQkJCQkJZWxlbWVudHMgPSBkb2MuZ2V0RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0JCQkJCQlub2RlID0gKENNTm9kZSkgZWxlbWVudHMubmV4dCgpOwotCQkJCQkJbWFya2VyID0gbmV3IEJsb2NrTWFya2VyKG5vZGUuZ2V0Tm9kZU5hbWUoKSwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIHRydWUpOwotCQkJCQkJLy8gZ2xvYmFsIHNjb3BlIGlzIE9LIGJlY2F1c2Ugd2UgaGF2ZSBlbmNvdW50ZXJlZCB0aGlzCi0JCQkJCQkvLyA8QHRhZ2xpYj4gZGlyZWN0aXZlCi0JCQkJCQkvLyBzbyBpdCBhbGwgbWFya2VycyBmcm9tIGl0IHNob3VsZCB3aWxsIGJlIGluIHNjb3BlCi0JCQkJCQkvLyBhZGQgdG8gdGhpcyBsb2NhbCBwYXJzZXIKLQkJCQkJCWFkZEJsb2NrTWFya2VyKG1hcmtlcik7Ci0JCQkJCQkvLyBhZGQgdG8gb3V0ZXIgY2xhc3MgbWFya2VyIGxpc3QsIGZvcgotCQkJCQkJdGhpcy5mVHJhbnNsYXRvci5nZXRCbG9ja01hcmtlcnMoKS5hZGQobWFya2VyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NQYWdlRGlyZWN0aXZlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJaWYgKGlzUGFnZURpcmVjdGl2ZShmVGFnbmFtZSkpIHsKLQkJCXRoaXMuZlRyYW5zbGF0b3IudHJhbnNsYXRlUGFnZURpcmVjdGl2ZUF0dHJpYnV0ZXMoc2RSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCksIHNkUmVnaW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogY29udmVuaWVuY2UgbWV0aG9kIHRvIGdldCBhbiBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBhdHRyaWJ1dGUgbmFtZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIGF0dHJOYW1lLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCVN0cmluZyBzZFJlZ2lvblRleHQgPSBmVGV4dFRvUGFyc2Uuc3Vic3RyaW5nKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHNkUmVnaW9uLmdldEVuZE9mZnNldCgpKTsKLQkJU3RyaW5nIHRleHRSZWdpb25UZXh0LCBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJdGVyYXRvciBpdCA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uLCB2YWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCW5hbWVSZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQl0ZXh0UmVnaW9uVGV4dCA9IHNkUmVnaW9uVGV4dC5zdWJzdHJpbmcobmFtZVJlZ2lvbi5nZXRTdGFydCgpLCBuYW1lUmVnaW9uLmdldFRleHRFbmQoKSk7Ci0JCQkJaWYgKHRleHRSZWdpb25UZXh0LmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJCXZhbHVlUmVnaW9uID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAodmFsdWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCQlhdHRyVmFsdWUgPSBzZFJlZ2lvblRleHQuc3Vic3RyaW5nKHZhbHVlUmVnaW9uLmdldFN0YXJ0KCksIHZhbHVlUmVnaW9uLmdldEVuZCgpKTsKLQkJCQkJCQlicmVhazsgLy8gaW5uZXIKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsgLy8gb3V0ZXIKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKGF0dHJWYWx1ZSk7Ci0JfQotCi0JLy8gdGhlc2UgbWV0aG9kcyBkZXRlcm1pbmUgd2hhdCBjb250ZW50IGdldHMgYWRkZWQgdG8gdGhlIGxvY2FsIHNjcmlwbGV0LAotCS8vIGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uIGJ1ZmZlcnMKLQkvKgotCSAqIHJldHVybiB0cnVlIGZvciBlbGVtZW50cyB3aG9zZSBjb250ZW50cyB3ZSBtaWdodCB3YW50IHRvIGFkZCB0byB0aGUKLQkgKiBqYXZhIGZpbGUgd2UgYXJlIGJ1aWxkaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKU1BTdGFydFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCXJldHVybiAoc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gfHwgc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNKU1BFbmRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlyZXR1cm4gKHNkUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKU1BSZWdpb24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIGlzRGVjbGFyYXRpb24odGFnTmFtZSkgfHwgaXNFeHByZXNzaW9uKHRhZ05hbWUpIHx8IGlzU2NyaXB0bGV0KHRhZ05hbWUpIHx8IGlzVXNlQmVhbih0YWdOYW1lKSB8fCBpc0luY2x1ZGVEaXJlY3RpdmUodGFnTmFtZSkgfHwgaXNQb3NzaWJsZUN1c3RvbVRhZyh0YWdOYW1lKSB8fCBpc1RhZ2xpYkRpcmVjdGl2ZSh0YWdOYW1lKSB8fCBpc1BhZ2VEaXJlY3RpdmUodGFnTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWNsYXJhdGlvbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGVjbGFyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHByZXNzaW9uKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpleHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2NyaXB0bGV0KFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpzY3JpcHRsZXQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVXNlQmVhbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6dXNlQmVhbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmNsdWRlRGlyZWN0aXZlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkaXJlY3RpdmUuaW5jbHVkZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQb3NzaWJsZUN1c3RvbVRhZyhTdHJpbmcgdGFnTmFtZSkgewotLy8JCWludCBjb2xvbkluZGV4ID0gdGFnTmFtZS5pbmRleE9mKCI6Iik7Ci0vLwkJaWYgKGNvbG9uSW5kZXggPiAwKSB7Ci0vLwkJCVN0cmluZyBwcmVmaXggPSB0YWdOYW1lLnN1YnN0cmluZygwLCBjb2xvbkluZGV4KTsKLS8vCQkJaWYgKHByZWZpeC5lcXVhbHMoImpzcCIpKSB7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfQotLy8JCQlpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkgewotLy8JCQkJVGFnTWFya2VyW10gcHJlZml4ZXMgPSAoVGFnTWFya2VyW10pIGZMb2NhbFBhcnNlci5nZXROZXN0YWJsZVByZWZpeGVzKCkudG9BcnJheShuZXcgVGFnTWFya2VyWzBdKTsKLS8vCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJCQlpZiAocHJlZml4LmVxdWFscyhwcmVmaXhlc1tpXS5nZXRUYWdOYW1lKCkpKSB7Ci0vLwkJCQkJCXJldHVybiB0cnVlOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0YWdOYW1lLmluZGV4T2YoJzonKSA+IC0xICYmICF0YWdOYW1lLnN0YXJ0c1dpdGgoSlNQVHJhbnNsYXRvci5KU1BfUFJFRklYKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhZ2xpYkRpcmVjdGl2ZShTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGlyZWN0aXZlLnRhZ2xpYiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYWdlRGlyZWN0aXZlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkaXJlY3RpdmUucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZWdpb25OYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQotCQlTdHJpbmcgbmFtZVN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCW5hbWVTdHIgPSBmVGV4dFRvUGFyc2Uuc3Vic3RyaW5nKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpLCBzZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KHIpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZVN0ci50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjb250ZW50cyBvZiBhIGZpbGUgYXMgYSBTdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVBhdGggLSB0aGUgcGF0aCB0byB0aGUgZmlsZQotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnRzLCBudWxsIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudHMoU3RyaW5nIGZpbGVQYXRoKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlUGF0aCk7Ci0JCXJldHVybiBGaWxlQ29udGVudENhY2hlLmdldEluc3RhbmNlKCkuZ2V0Q29udGVudHMocGF0aC5tYWtlQWJzb2x1dGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RBZGRFeHByZXNzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQWRkRXhwcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2M2YTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RBZGRFeHByZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQWRkRXhwcmVzcy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBZGRFeHByZXNzIGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIHB1YmxpYyBBU1RBZGRFeHByZXNzKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBZGRFeHByZXNzKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQWRkRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEFkZEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiNmVhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQWRkRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFkZEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUQWRkRXhwcmVzc2lvbiBleHRlbmRzIEFTVE9wZXJhdG9yRXhwcmVzc2lvbiB7Ci0gIHB1YmxpYyBBU1RBZGRFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBZGRFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQW5kRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEFuZEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmZTQwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQW5kRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFuZEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUQW5kRXhwcmVzc2lvbiBleHRlbmRzIEFTVE9wZXJhdG9yRXhwcmVzc2lvbiB7Ci0gIHB1YmxpYyBBU1RBbmRFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBbmRFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQ2hvaWNlRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVENob2ljZUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5MDc5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQ2hvaWNlRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVENob2ljZUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUQ2hvaWNlRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUQ2hvaWNlRXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQ2hvaWNlRXhwcmVzc2lvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEVxdWFsaXR5RXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEVxdWFsaXR5RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTA2MTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RFcXVhbGl0eUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RFcXVhbGl0eUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNURXF1YWxpdHlFeHByZXNzaW9uIGV4dGVuZHMgQVNUT3BlcmF0b3JFeHByZXNzaW9uIHsKLSAgcHVibGljIEFTVEVxdWFsaXR5RXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXF1YWxpdHlFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNURXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5M2YzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNURXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNURXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNURXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXhwcmVzc2lvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEZ1bmN0aW9uSW52b2NhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEZ1bmN0aW9uSW52b2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGNhZDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RGdW5jdGlvbkludm9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGdW5jdGlvbkludm9jYXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNURnVuY3Rpb25JbnZvY2F0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIFN0cmluZyBmdWxsRnVuY3Rpb25OYW1lOyAKLSAgCi0gIHB1YmxpYyBBU1RGdW5jdGlvbkludm9jYXRpb24oaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZ1bmN0aW9uSW52b2NhdGlvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotCi1wdWJsaWMgU3RyaW5nIGdldEZ1bGxGdW5jdGlvbk5hbWUoKSB7Ci0JcmV0dXJuIGZ1bGxGdW5jdGlvbk5hbWU7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEZ1bGxGdW5jdGlvbk5hbWUoU3RyaW5nIGZ1bGxGdW5jdGlvbk5hbWUpIHsKLQl0aGlzLmZ1bGxGdW5jdGlvbk5hbWUgPSBmdWxsRnVuY3Rpb25OYW1lOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEdUTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEdUTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDAwMDViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RHVE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RHVE5vZGUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUR1ROb2RlIGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIHB1YmxpYyBBU1RHVE5vZGUoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEdUTm9kZShKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEltcGxpY2l0T2JqZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUSW1wbGljaXRPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0OWFkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUSW1wbGljaXRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RJbXBsaWNpdE9iamVjdC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RJbXBsaWNpdE9iamVjdCBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUSW1wbGljaXRPYmplY3QoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEltcGxpY2l0T2JqZWN0KEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUTGl0ZXJhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVExpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzMzRmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVExpdGVyYWwuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUTGl0ZXJhbCBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUTGl0ZXJhbChpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTGl0ZXJhbChKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE11bHRpcGx5RXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE11bHRpcGx5RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDhmNjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RNdWx0aXBseUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RNdWx0aXBseUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUTXVsdGlwbHlFeHByZXNzaW9uIGV4dGVuZHMgQVNUT3BlcmF0b3JFeHByZXNzaW9uIHsKLSAgcHVibGljIEFTVE11bHRpcGx5RXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTXVsdGlwbHlFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3BlcmF0b3JFeHByZXNzaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3BlcmF0b3JFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTZiNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE9wZXJhdG9yRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEFTVE9wZXJhdG9yRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotCXByb3RlY3RlZCBBcnJheUxpc3Qgb3BlcmF0b3JUb2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgQVNUT3BlcmF0b3JFeHByZXNzaW9uKGludCBpKSB7Ci0JCXN1cGVyKGkpOwotCX0KLQkKLQlwdWJsaWMgQVNUT3BlcmF0b3JFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpKSB7Ci0JCXRoaXMoaSk7Ci0JCXBhcnNlciA9IHA7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkT3BlcmF0b3JUb2tlbihUb2tlbiBvcFRva2VuKSB7Ci0JCW9wZXJhdG9yVG9rZW5zLmFkZChvcFRva2VuKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0T3BlcmF0b3JUb2tlbnMoKSB7Ci0JCXJldHVybiBvcGVyYXRvclRva2VuczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3JFeHByZXNzaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3JFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmI3NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE9yRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVE9yRXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RPckV4cHJlc3Npb24gZXh0ZW5kcyBBU1RPcGVyYXRvckV4cHJlc3Npb24gewotICBwdWJsaWMgQVNUT3JFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RPckV4cHJlc3Npb24oSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RSZWxhdGlvbmFsRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFJlbGF0aW9uYWxFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMjM4NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFJlbGF0aW9uYWxFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUmVsYXRpb25hbEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gZXh0ZW5kcyBBU1RPcGVyYXRvckV4cHJlc3Npb24gewotICBwdWJsaWMgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24oaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUU3RhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RTdGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmUxZTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RTdGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVFN0YXJ0IGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIHB1YmxpYyBBU1RTdGFydChpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUU3RhcnQoSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RVbmFyeUV4cHJlc3Npb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RVbmFyeUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4NzBhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVW5hcnlFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVW5hcnlFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVFVuYXJ5RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUVW5hcnlFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RVbmFyeUV4cHJlc3Npb24oSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmEzNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVmFsdWUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUVmFsdWUgZXh0ZW5kcyBTaW1wbGVOb2RlIHsKLSAgcHVibGljIEFTVFZhbHVlKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RWYWx1ZShKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlUHJlZml4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWVQcmVmaXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyYmYwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWVQcmVmaXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYWx1ZVByZWZpeC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYWx1ZVByZWZpeCBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUVmFsdWVQcmVmaXgoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhbHVlUHJlZml4KEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWVTdWZmaXguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZVN1ZmZpeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzE3MjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZVN1ZmZpeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhbHVlU3VmZml4LmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVFZhbHVlU3VmZml4IGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0JCi0gIHByb3RlY3RlZCBUb2tlbiBwcm9wZXJ0eU5hbWVUb2tlbjsKLSAgCi0gIHB1YmxpYyBBU1RWYWx1ZVN1ZmZpeChpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFsdWVTdWZmaXgoSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLQotcHVibGljIFRva2VuIGdldFByb3BlcnR5TmFtZVRva2VuKCkgewotCXJldHVybiBwcm9wZXJ0eU5hbWVUb2tlbjsKLX0KLQotcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lVG9rZW4oVG9rZW4gcHJvcGVydHlOYW1lVG9rZW4pIHsKLQl0aGlzLnByb3BlcnR5TmFtZVRva2VuID0gcHJvcGVydHlOYW1lVG9rZW47Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvRUxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9FTEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWE3YmY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9FTEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGVsLkVMUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotCi0vKioKLSAqIFRoZSBjb2RlIGNoZWNrZXIgZm9yIHRoZSBqc2YvanNwIEVMLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRUxHZW5lcmF0b3IgewotCS8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGxvY2F0b3IgQSB2YWxpZCBFTExvY2F0b3IgaW5zdGFuY2UsIG1heSBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRUxHZW5lcmF0b3IoKSB7Ci0gICAgfSAvLyBjb25zdHJ1Y3RvcgotCQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBuZXR1aWVsIEFTVCBhbmQgc2V0IGRpYWdub3N0aWNzIGFzIG5lY2Vzc2FyeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcm9vdAotICAgICAqIEBwYXJhbSBjdXJyZW50Tm9kZQotICAgICAqIEBwYXJhbSByZXN1bHQKLSAgICAgKiBAcGFyYW0gY29kZU1hcAotICAgICAqIEBwYXJhbSBkb2N1bWVudAotICAgICAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLSAgICAgKiBAcGFyYW0gY29udGVudFN0YXJ0Ci0gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGgKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBFTFByb2JsZW19cyByZXBvcnRlZCBieSB0aGUge0BsaW5rIEVMR2VuZXJhdG9yVmlzaXRvcn0gdGhpcyB7QGxpbmsgRUxHZW5lcmF0b3J9IHVzZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZW5lcmF0ZShBU1RFeHByZXNzaW9uIHJvb3QsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUsIFN0cmluZ0J1ZmZlciByZXN1bHQsIE1hcCBjb2RlTWFwLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uLCBpbnQgY29udGVudFN0YXJ0LCBpbnQgY29udGVudExlbmd0aCkgewotCQlFTEdlbmVyYXRvclZpc2l0b3IgdmlzaXRvciA9IG5ldyBFTEdlbmVyYXRvclZpc2l0b3IocmVzdWx0LCBjdXJyZW50Tm9kZSwgY29kZU1hcCwgZG9jdW1lbnQsIGpzcFJlZmVyZW5jZVJlZ2lvbiwgY29udGVudFN0YXJ0KTsKLQkJdmlzaXRvci5zdGFydEZ1bmN0aW9uRGVmaW5pdGlvbihyb290LmdldEZpcnN0VG9rZW4oKS5iZWdpbkNvbHVtbiAtIDEpOwotCQlyb290LmpqdEFjY2VwdCh2aXNpdG9yLCBudWxsKTsKLQkJdmlzaXRvci5lbmRGdW5jdGlvbkRlZmluaXRpb24ocm9vdC5nZXRMYXN0VG9rZW4oKS5lbmRDb2x1bW4gLSAxKTsKLQkJCi0JCXJldHVybiB2aXNpdG9yLmdldEVMUHJvYmxlbXMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvRUxHZW5lcmF0b3JWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvRUxHZW5lcmF0b3JWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOTk2ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0VMR2VuZXJhdG9yVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBCdWcgMTU0NDc0IEVMOiAnYW5kJywgJ29yJywgLi4uIG9wZXJhdG9yCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDQ3NAotICogICAgIEJlcm5oYXJkIEh1ZW1lciA8YmVybmhhcmQuaHVlbWVyQGdtYWlsLmNvbT4KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLkNNRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRhZ2xpYlRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkpTUENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGVsLkVMUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5GaWxlQnVmZmVyTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBFTEdlbmVyYXRvclZpc2l0b3IgaW1wbGVtZW50cyBKU1BFTFBhcnNlclZpc2l0b3IgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOREwgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZFeHByZXNzaW9uSGVhZGVyMSA9ICJwdWJsaWMgU3RyaW5nIF9lbEV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZFeHByZXNzaW9uSGVhZGVyMiA9ICIoKSIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJcdFx0dGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbiwgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uIHsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQgcGFnZUNvbnRleHQgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwIHBhcmFtID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcCBwYXJhbVZhbHVlcyA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXAgaGVhZGVyID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQgCi0JImphdmEudXRpbC5NYXAgaGVhZGVyVmFsdWVzID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcCBjb29raWUgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJCAKLQkiamF2YS51dGlsLk1hcCBpbml0UGFyYW0gPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwIHBhZ2VTY29wZSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXAgcmVxdWVzdFNjb3BlID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcCBzZXNzaW9uU2NvcGUgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwIGFwcGxpY2F0aW9uU2NvcGUgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJyZXR1cm4gXCJcIisoICI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmRXhwcmVzc2lvbkhlYWRlcjJfcGFyYW0gPSAiKCkiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiXHRcdHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24sIGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbiB7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0ID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW0gPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcmFtVmFsdWVzID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQgCi0JImphdmEudXRpbC5NYXA8U3RyaW5nLCBTdHJpbmdbXT4gaGVhZGVyVmFsdWVzID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcDxTdHJpbmcsIGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU+IGNvb2tpZSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkIAotCSJqYXZhLnV0aWwuTWFwPFN0cmluZywgU3RyaW5nPiBpbml0UGFyYW0gPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwPFN0cmluZywgT2JqZWN0PiBwYWdlU2NvcGUgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwPFN0cmluZywgT2JqZWN0PiByZXF1ZXN0U2NvcGUgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwPFN0cmluZywgT2JqZWN0PiBzZXNzaW9uU2NvcGUgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwPFN0cmluZywgT2JqZWN0PiBhcHBsaWNhdGlvblNjb3BlID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkicmV0dXJuIFwiXCIrKCAiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZKc3BJbXBsaWNpdE9iamVjdHNbXSA9IHsgInBhZ2VDb250ZXh0IiB9OyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZKc3BJbXBsaWNpdE1hcHNbXSA9IHsgCSJwYXJhbSIsICJwYXJhbVZhbHVlcyIsICJoZWFkZXIiLCAiaGVhZGVyVmFsdWVzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQkJCQkJCQkJCQkiY29va2llIiwgImluaXRQYXJhbSIsICJwYWdlU2NvcGUiLCAicmVxdWVzdFNjb3BlIiwgInNlc3Npb25TY29wZSIsICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCQkJCQkJCQkJCQkJImFwcGxpY2F0aW9uU2NvcGUiIH07IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwIGZKU1BJbXBsaWNpdE9iamVjdE1hcCA9IG5ldyBIYXNoTWFwKGZKc3BJbXBsaWNpdE9iamVjdHMubGVuZ3RoKTsKLQlzdGF0aWMgewotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkpzcEltcGxpY2l0T2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJZkpTUEltcGxpY2l0T2JqZWN0TWFwLnB1dChmSnNwSW1wbGljaXRPYmplY3RzW2ldLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCX0KLQkJCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmSnNwSW1wbGljaXRNYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmSlNQSW1wbGljaXRPYmplY3RNYXAucHV0KGZKc3BJbXBsaWNpdE1hcHNbaV0sIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZGb290ZXIgPSAiICk7IiArIEVOREwgKyAifSIgKyBFTkRMOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZSZXN1bHQ7Ci0JcHJpdmF0ZSBNYXAgZkNvZGVNYXA7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldEluVXNlckNvZGU7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IG1ldGhvZENvdW50ZXIgPSAwOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgaW50IGZDb250ZW50U3RhcnQ7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIGZPcGVyYXRvck1hcDsKLQkvLyBzdGFydCBvZiB0aGUgZ2VuZXJhdGVkIGZ1bmN0aW9uIGRlZmluaXRpb24sIGlmIGFueToKLQlwcml2YXRlIGludCBmR2VuZXJhdGVkRnVuY3Rpb25TdGFydDsKLQotCS8vIHRoaXMgZmxhZyBsZXRzIHVzIGtub3cgaWYgd2Ugd2VyZSB1bmFibGUgdG8gZ2VuZXJhdGUgZm9yIHNvbWUgcmVhc29uLiAgT25lIHBvc3NpYmxlIHJlYXNvbiBpcyB0aGF0IHRoZSBleHByZXNzaW9uIAotCS8vIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgdmFyaWFibGUgZm9yIHdoaWNoIGluZm9ybWF0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuCi0JcHJpdmF0ZSBib29sZWFuIGZDYW5HZW5lcmF0ZSA9IHRydWU7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZkN1cnJlbnROb2RlOwotCi0JcHJpdmF0ZSBib29sZWFuIGZVc2VQYXJhbWV0ZXJpemVkVHlwZXM7Ci0KLQlwcml2YXRlIExpc3QgZkVMUHJvYmxlbXM7Ci0JcHJpdmF0ZSBJU2NvcGVDb250ZXh0W10gZlNjb3BlQ29udGV4dHMgPSBudWxsOwotCi0JLyoqCi0JICogVHJhbmxzYXRpb24gb2YgWE1MLXN0eWxlIG9wZXJhdG9ycyB0byBqYXZhCi0JICovCi0Jc3RhdGljIHsKLQkJZk9wZXJhdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZk9wZXJhdG9yTWFwLnB1dCgiZ3QiLCAiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZk9wZXJhdG9yTWFwLnB1dCgibHQiLCAiPCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZk9wZXJhdG9yTWFwLnB1dCgiZ2UiLCAiPj0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoImxlIiwgIjw9Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmT3BlcmF0b3JNYXAucHV0KCJtb2QiLCAiJSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZk9wZXJhdG9yTWFwLnB1dCgiZXEiLCAiPT0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoImFuZCIsICImJiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZk9wZXJhdG9yTWFwLnB1dCgib3IiLCAifHwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoIm5vdCIsICIhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3Igc3F1aXJyZWxzIGF3YXkgYSBmZXcgdGhpbmdzIHdlJ2xsIG5lZWQgbGF0ZXIKLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHBhcmFtIGNvZGVNYXAKLQkgKiBAcGFyYW0gdHJhbnNsYXRvcgotCSAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLQkgKiBAcGFyYW0gY29udGVudFN0YXJ0Ci0JICovCi0JcHVibGljIEVMR2VuZXJhdG9yVmlzaXRvcihTdHJpbmdCdWZmZXIgcmVzdWx0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlLCBNYXAgY29kZU1hcCwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGpzcFJlZmVyZW5jZVJlZ2lvbiwgaW50IGNvbnRlbnRTdGFydCkKLQl7Ci0JCWZSZXN1bHQgPSByZXN1bHQ7Ci0JCWZDb2RlTWFwID0gY29kZU1hcDsKLQkJZk9mZnNldEluVXNlckNvZGUgPSByZXN1bHQubGVuZ3RoKCk7Ci0JCWZDb250ZW50U3RhcnQgPSBjb250ZW50U3RhcnQ7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmQ3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJZkdlbmVyYXRlZEZ1bmN0aW9uU3RhcnQgPSAtMTsgLy9zZXQgd2hlbiBnZW5lcmF0aW5nIGZ1bmN0aW9uIGRlZmluaXRpb24KLQkJZlVzZVBhcmFtZXRlcml6ZWRUeXBlcyA9IGNvbXBpbGVyU3VwcG9ydHNQYXJhbWV0ZXJpemVkVHlwZXMoKTsKLQkJZkVMUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZTY29wZUNvbnRleHRzID0gZ2V0U2NvcGVDb250ZXh0cygpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCBhIHRva2VuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiAgQXV0b21hdGljYWxseSBjYWxjdWxhdGluZyBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSB0b2tlbgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmQoVG9rZW4gdG9rZW4pCi0JewotCQlhcHBlbmQodG9rZW4uaW1hZ2UsIHRva2VuLmJlZ2luQ29sdW1uIC0gMSwgdG9rZW4uZW5kQ29sdW1uKTsKLQl9Ci0JCi0JLyoqCi0JICogQXBwZW5kIGEgdHJhbnNsYXRpb24gZm9yIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IHRva2VuLgotCSAqIAotCSAqIEBwYXJhbSB0cmFuc2xhdGVkCi0JICogQHBhcmFtIHRva2VuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZChTdHJpbmcgdHJhbnNsYXRlZCwgVG9rZW4gdG9rZW4pCi0JewotCQlhcHBlbmQodHJhbnNsYXRlZCwgdG9rZW4uYmVnaW5Db2x1bW4gLSAxLCB0b2tlbi5lbmRDb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCBhIHN0cmluZyBleHBsaWNpdGx5IGdpdmluZyB0aGUgaW5wdXQgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBqc3BQb3NpdGlvblN0YXJ0Ci0JICogQHBhcmFtIGpzcFBvc2l0aW9uRW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZChTdHJpbmcgbmV3VGV4dCwgaW50IGpzcFBvc2l0aW9uU3RhcnQsIGludCBqc3BQb3NpdGlvbkVuZCkKLQl7Ci0JCWZSZXN1bHQuYXBwZW5kKG5ld1RleHQpOwotCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckNvZGUsIG5ld1RleHQubGVuZ3RoKCkpOwotCQlQb3NpdGlvbiBqc3BSYW5nZSA9IG5ldyBQb3NpdGlvbihmQ29udGVudFN0YXJ0ICsganNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25FbmQgLSBqc3BQb3NpdGlvblN0YXJ0KTsKLQotCQlmQ29kZU1hcC5wdXQoamF2YVJhbmdlLCBqc3BSYW5nZSk7Ci0JCWZPZmZzZXRJblVzZXJDb2RlICs9IG5ld1RleHQubGVuZ3RoKCk7Ci0JfQotCQotCS8qKgotCSAqIEFwcGVuZCB0ZXh0IHRoYXQgd2lsbCBiZSB1bm1hcHBlZCBhbmQgdGhlcmVmb3JlIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBmb3IgY29tcGxldGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmQoU3RyaW5nIG5ld1RleHQpCi0JewotCQlmUmVzdWx0LmFwcGVuZChuZXdUZXh0KTsKLQkJZk9mZnNldEluVXNlckNvZGUgKz0gbmV3VGV4dC5sZW5ndGgoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2VuZXJhdGUgYSBmdW5jdGlvbiBpbnZvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmdWxsRnVuY3Rpb25OYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2VuRnVuY3Rpb24oU3RyaW5nIGZ1bGxGdW5jdGlvbk5hbWUpIHsKLQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgZG9jTWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihmRG9jdW1lbnQpOwotCQlpbnQgY29sb25JbmRleCA9IGZ1bGxGdW5jdGlvbk5hbWUuaW5kZXhPZignOicpOwotCQlTdHJpbmcgcHJlZml4ID0gZnVsbEZ1bmN0aW9uTmFtZS5zdWJzdHJpbmcoMCwgY29sb25JbmRleCk7Ci0JCVN0cmluZyBmdW5jdGlvbk5hbWUgPSBmdWxsRnVuY3Rpb25OYW1lLnN1YnN0cmluZyhjb2xvbkluZGV4ICsgMSk7Ci0JCWlmIChkb2NNZ3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJSXRlcmF0b3IgdGFnbGlicyA9IGRvY01nci5nZXRDTURvY3VtZW50VHJhY2tlcnMoZkN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlICh0YWdsaWJzLmhhc05leHQoKSkgewotCQkJVGFnbGliVHJhY2tlciB0cmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpdGFnbGlicy5uZXh0KCk7Ci0JCQlpZih0cmFja2VyLmdldFByZWZpeCgpLmVxdWFscyhwcmVmaXgpKSB7Ci0JCQkJQ01Eb2N1bWVudEltcGwgZG9jID0gKENNRG9jdW1lbnRJbXBsKXRyYWNrZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkKLQkJCQlMaXN0IGZ1bmN0aW9ucyA9IGRvYy5nZXRGdW5jdGlvbnMoKTsKLQkJCQlmb3IoSXRlcmF0b3IgaXQgPSBmdW5jdGlvbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJVExERnVuY3Rpb24gZnVuY3Rpb24gPSAoVExERnVuY3Rpb24paXQubmV4dCgpOwotCQkJCQlpZihmdW5jdGlvbi5nZXROYW1lKCkuZXF1YWxzKGZ1bmN0aW9uTmFtZSkpIHsKLQkJCQkJCVN0cmluZyBqYXZhRnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWVGcm9tU2lnbmF0dXJlKGZ1bmN0aW9uLmdldFNpZ25hdHVyZSgpKTsKLQkJCQkJCWlmIChqYXZhRnVuY05hbWUgPT0gbnVsbCkKLQkJCQkJCQlqYXZhRnVuY05hbWUgPSBmdW5jdGlvbk5hbWU7Ci0JCQkJCQlyZXR1cm4gZnVuY3Rpb24uZ2V0Q2xhc3NOYW1lKCkgKyAiLiIgKyBqYXZhRnVuY05hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgYSBzaW1wbGUgbm9kZSAtLSBmYWxsYmFjawotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoU2ltcGxlTm9kZSBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4obm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKSk7Ci0JfQotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TWV0aG9kQ291bnRlcigpIHsKLQkJcmV0dXJuIG1ldGhvZENvdW50ZXIrKzsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlIHRvcC1sZXZlbCBleHByZXNzaW9uCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0RnVuY3Rpb25EZWZpbml0aW9uKGludCBzdGFydCkgewotCQlmR2VuZXJhdGVkRnVuY3Rpb25TdGFydCA9IGZSZXN1bHQubGVuZ3RoKCk7Ci0JCWFwcGVuZChmRXhwcmVzc2lvbkhlYWRlcjEsIHN0YXJ0LCBzdGFydCk7Ci0JCWFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGdldE1ldGhvZENvdW50ZXIoKSksIHN0YXJ0LCBzdGFydCk7Ci0JCWlmIChmVXNlUGFyYW1ldGVyaXplZFR5cGVzKQotCQkJYXBwZW5kKGZFeHByZXNzaW9uSGVhZGVyMl9wYXJhbSwgc3RhcnQsIHN0YXJ0KTsKLQkJZWxzZQotCQkJYXBwZW5kKGZFeHByZXNzaW9uSGVhZGVyMiwgc3RhcnQsIHN0YXJ0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRGdW5jdGlvbkRlZmluaXRpb24oaW50IGVuZCkgewotCQlpZiAoZkdlbmVyYXRlZEZ1bmN0aW9uU3RhcnQgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgZW5kIGZ1bmN0aW9uIGRlZmluaXRpb24gYmVjYXVzZSBub25lIGhhcyBiZWVuIHN0YXJ0ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhcHBlbmQoZkZvb3RlciwgZW5kLCBlbmQpOwotCi0JCS8vIHNvbWV0aGluZyBpcyBwcmV2ZW50aW5nIGdvb2QgY29kZSBnZW5lcmF0aW9uIHNvIGVtcHR5IG91dCB0aGUgcmVzdWx0Ci0JCS8vIGFuZCB0aGUgbWFwLgotCQlpZiAoIWZDYW5HZW5lcmF0ZSkgewotCQkJZlJlc3VsdC5kZWxldGUoZkdlbmVyYXRlZEZ1bmN0aW9uU3RhcnQsIGZSZXN1bHQubGVuZ3RoKCkpOwotCQkJZk9mZnNldEluVXNlckNvZGUgPSBmUmVzdWx0Lmxlbmd0aCgpOwotCQkJLy8gcmVtb3ZlIGFsbCBmQ29kZU1hcCBlbnRyaWVzIGZvciB0aGUgcmVtb3ZlZCBjb2RlOgotCQkJZm9yIChJdGVyYXRvciBpdCA9IGZDb2RlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgaXQubmV4dCgpOwotCQkJCWlmIChlbnRyeS5nZXRLZXkoKSBpbnN0YW5jZW9mIFBvc2l0aW9uKSB7Ci0JCQkJCVBvc2l0aW9uIHBvcyA9IChQb3NpdGlvbikgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCWlmIChwb3MuZ2V0T2Zmc2V0KCkgPj0gZkdlbmVyYXRlZEZ1bmN0aW9uU3RhcnQpIHsKLQkJCQkJCWl0LnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZHZW5lcmF0ZWRGdW5jdGlvblN0YXJ0ID0gLTE7Ci0JfQotCi0KLQlwcml2YXRlIGJvb2xlYW4gY29tcGlsZXJTdXBwb3J0c1BhcmFtZXRlcml6ZWRUeXBlcygpIHsKLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQYXRoIGxvY2F0aW9uID0gVGFnbGliQ29udHJvbGxlci5nZXRMb2NhdGlvbihmRG9jdW1lbnQpOwotCQkJaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgbG9jYXRpb24uc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocm9vdC5nZXRQcm9qZWN0KGxvY2F0aW9uLnNlZ21lbnQoMCkpKTsKLQkJCQlTdHJpbmcgY29tcGxpYW5jZSA9IHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgdHJ1ZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIEZsb2F0LnBhcnNlRmxvYXQoY29tcGxpYW5jZSkgPj0gMS41OwotCQkJCX0KLQkJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyaWNhbGx5IGdlbmVyYXRlIGFuIG9wZXJhdG9yIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gZGF0YQotCSAqLwotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZU9wZXJhdG9yTm9kZShBU1RPcGVyYXRvckV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJZm9yKGludCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCW5vZGUuY2hpbGRyZW5baV0uamp0QWNjZXB0KHRoaXMsIGRhdGEpOwotCQkJaWYoIG5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gaSA+IDEpIHsKLQkJCQlhcHBlbmRPcGVyYXRvcigoVG9rZW4pbm9kZS5nZXRPcGVyYXRvclRva2VucygpLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQXBwZW5kIGFuIG9wZXJhdG9yIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGFmdGVyIHRyYW5zbGF0aW9uIChpZiBhbnkpCi0JICogCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGFwcGVuZE9wZXJhdG9yKFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0b2tlbkltYWdlID0gdG9rZW4uaW1hZ2UudHJpbSgpOwotCQlTdHJpbmcgdHJhbnNsYXRlZCA9IChTdHJpbmcpZk9wZXJhdG9yTWFwLmdldCh0b2tlbkltYWdlKTsKLQkJaWYobnVsbCAhPSB0cmFuc2xhdGVkKSB7Ci0JCQlhcHBlbmQodHJhbnNsYXRlZCwgdG9rZW4pOwotCQl9IGVsc2UgewotCQkJYXBwZW5kKHRva2VuKTsKLQkJfQotCQlyZXR1cm4odHJhbnNsYXRlZCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIG9yIEV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE9yRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlnZW5lcmF0ZU9wZXJhdG9yTm9kZShub2RlLCBkYXRhKTsKLQkJcmV0dXJuKG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogSGFuZGxlIGFuZCBleHByZXNzaW9uIAotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQW5kRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlnZW5lcmF0ZU9wZXJhdG9yTm9kZShub2RlLCBkYXRhKTsKLQkJcmV0dXJuKG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogSGFuZGxlIGVxdWFsaXR5Ci0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RFcXVhbGl0eUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJZ2VuZXJhdGVPcGVyYXRvck5vZGUobm9kZSwgZGF0YSk7Ci0JCXJldHVybihudWxsKTsKLQl9Ci0KLQotCS8qKgotCSAqIEhhbmRsZSBSZWxhdGlvbmFsCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlnZW5lcmF0ZU9wZXJhdG9yTm9kZShub2RlLCBkYXRhKTsKLQkJcmV0dXJuKG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogSGFuZGxlIGFkZGl0aW9uCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RBZGRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWdlbmVyYXRlT3BlcmF0b3JOb2RlKG5vZGUsIGRhdGEpOwotCQlyZXR1cm4obnVsbCk7Ci0JfQotCi0KLQkvKioKLQkgKiBIYW5kbGUgbXVsdGlwbHkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE11bHRpcGx5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlnZW5lcmF0ZU9wZXJhdG9yTm9kZShub2RlLCBkYXRhKTsKLQkJcmV0dXJuKG51bGwpOwotCX0KLQotCi0JLyoqIAotCSAqIENob2ljZSBFeHByZXNzaW9uICh0ZXJuYXJ5IG9wZXJhdG9yKQotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2hvaWNlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlub2RlLmNoaWxkcmVuWzBdLmpqdEFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJYXBwZW5kKCI/Iik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZS5jaGlsZHJlblsxXS5qanRBY2NlcHQodGhpcywgZGF0YSk7Ci0JCWFwcGVuZCgiOiIpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUuY2hpbGRyZW5bMl0uamp0QWNjZXB0KHRoaXMsZGF0YSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogSGFuZGxlIHVuYXJ5Ci0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RVbmFyeUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJaWYoSlNQRUxQYXJzZXJDb25zdGFudHMuRU1QVFkgPT0gbm9kZS5maXJzdFRva2VuLmtpbmQpIHsKLQkJCWFwcGVuZCgiKChudWxsID09ICIpOyAvLyROT04tTkxTLTEkCi0JCQlub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwotCQkJYXBwZW5kKCIpIHx8ICgiKTsgLy8kTk9OLU5MUy0xJAotCQkJbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJCWFwcGVuZCgiKS5pc0VtcHR5KCkpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmKEpTUEVMUGFyc2VyQ29uc3RhbnRzLk5PVDEgPT0gbm9kZS5maXJzdFRva2VuLmtpbmQgfHwgSlNQRUxQYXJzZXJDb25zdGFudHMuTk9UMiA9PSBub2RlLmZpcnN0VG9rZW4ua2luZCkgewotCQkJYXBwZW5kKCIoISIpOyAvLyROT04tTkxTLTEkCi0JCQlub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwotCQkJYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmKEpTUEVMUGFyc2VyQ29uc3RhbnRzLk1JTlVTID09IG5vZGUuZmlyc3RUb2tlbi5raW5kKSB7Ci0JCQlhcHBlbmQoIigtIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0JCQlhcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIFZhbHVlIG5vZGUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWlmKG5vZGUuamp0R2V0TnVtQ2hpbGRyZW4oKSA+PSAyKSB7Ci0JCQlpZihub2RlLmpqdEdldENoaWxkKDApIGluc3RhbmNlb2YgQVNUVmFsdWVQcmVmaXggJiYgbm9kZS5qanRHZXRDaGlsZCgxKSBpbnN0YW5jZW9mIEFTVFZhbHVlU3VmZml4KSB7Ci0JCQkJQVNUVmFsdWVQcmVmaXggcHJlZml4ID0gKEFTVFZhbHVlUHJlZml4KSBub2RlLmpqdEdldENoaWxkKDApOwotCQkJCUFTVFZhbHVlU3VmZml4IHN1ZmZpeCA9IChBU1RWYWx1ZVN1ZmZpeCkgbm9kZS5qanRHZXRDaGlsZCgxKTsKLQkJCQkvL2NvbnRlbnQgYXNzaXN0IGNhbiBjYXVzZSBhIG51bGwgcG9pbnRlciBoZXJlIHdpdGhvdXQgdGhlIGV4dHJhIG51bGwgY2hlY2sKLQkJCQlpZihwcmVmaXguZmlyc3RUb2tlbi5pbWFnZS5lcXVhbHMoInBhZ2VDb250ZXh0IikgJiYgc3VmZml4LmdldFByb3BlcnR5TmFtZVRva2VuKCkgIT0gbnVsbCAmJiBzdWZmaXguZ2V0UHJvcGVydHlOYW1lVG9rZW4oKS5pbWFnZS5lcXVhbHMoInJlcXVlc3QiKSkgewotCQkJCQlhcHBlbmQoIigoSHR0cFNlcnZsZXRSZXF1ZXN0KSIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsJCi0JfQotCi0KLQkvKioKLQkgKiBWYWx1ZSBQcmVmaXgKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlUHJlZml4IG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCS8vIHRoaXMgaXMgYSByYXcgaWRlbnRpZmllci4gIE1heSBzdXJlIGl0J3MgYW4gaW1wbGljaXQgb2JqZWN0LgotCQkvLyBUaGlzIGlzIHRoZSBwcmltYXJ5IHBsYWNlIHdoZXJlIG1vZGlmaWNhdGlvbiBpcyBuZWVkZWQgdG8gCi0JCS8vIHN1cHBvcnQgSlNGIGJhY2tpbmcgYmVhbnMuCi0JCWlmKG51bGwgPT0gbm9kZS5jaGlsZHJlbikgewotCQkJaWYoaXNDb21wbGV0aW5nT2JqZWN0KG5vZGUuZmlyc3RUb2tlbi5pbWFnZSkpIHsKLQkJCQlhcHBlbmQobm9kZS5maXJzdFRva2VuKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZkNhbkdlbmVyYXRlID0gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4obnVsbCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0JfQotCi0KLQkvKioKLQkgKiBGdW5jdGlvbiBmb3IgdGVzdGluZyBpbXBsaWNpdCBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21wbGV0aW5nT2JqZWN0KFN0cmluZyBpbWFnZSkgewotCQlCb29sZWFuIHZhbHVlID0gKEJvb2xlYW4pZkpTUEltcGxpY2l0T2JqZWN0TWFwLmdldChpbWFnZSk7Ci0JCXJldHVybiBudWxsID09IHZhbHVlID8gZmFsc2UgOiB2YWx1ZS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWx1ZSBzdWZmaXgKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlU3VmZml4IG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWlmKEpTUEVMUGFyc2VyQ29uc3RhbnRzLkxCUkFDS0VUID09IG5vZGUuZmlyc3RUb2tlbi5raW5kKSB7Ci0JCQlmQ2FuR2VuZXJhdGUgPSBmYWxzZTsKLQkJfSBlbHNlIGlmKG51bGwgIT0gbm9kZS5nZXRQcm9wZXJ0eU5hbWVUb2tlbigpKSB7Ci0JCQlUb2tlbiBzdWZmaXggPSBub2RlLmdldFByb3BlcnR5TmFtZVRva2VuKCk7Ci0JCQlTdHJpbmcgdWNhc2VOYW1lID0gc3VmZml4LmltYWdlLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgc3VmZml4LmltYWdlLnN1YnN0cmluZygxLCBzdWZmaXguaW1hZ2UubGVuZ3RoKCkpOyAKLQotCQkJLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gIE5vdGUgdGhhdCB0aGUgdHlwZSBzeXN0ZW0sIG5vIG1hdHRlciBob3cgbXVjaCB0eXBlIGluZm9ybWF0aW9uCi0JCQkvLyB3ZSB3b3VsZCBoYXZlIHdvdWxkbid0IGdpdmUgdXMgdGhlIGNvcnJlY3QgcmVzdWx0LiAgV2UncmUgbG9va2luZyBmb3IgInBhZ2VDb250ZXh0LnJlcXVlc3QiIAotCQkJLy8gaGVyZSBhbmQgd2lsbCBhZGQgYSBkb3duY2FzdCB0byAoSFRUUFNlcnZsZXRSZXF1ZXN0KQotCQkJCi0JCQlhcHBlbmQobm9kZS5maXJzdFRva2VuKTsKLQkJCWFwcGVuZCgiZ2V0IiArIHVjYXNlTmFtZSArICIoKSIsIHN1ZmZpeCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQlTaW1wbGVOb2RlIHBhcmVudCA9IChTaW1wbGVOb2RlKSBub2RlLmpqdEdldFBhcmVudCgpOwotCQkJaWYoc3VmZml4LmltYWdlLmVxdWFscygicmVxdWVzdCIpICYmIHBhcmVudCBpbnN0YW5jZW9mIEFTVFZhbHVlICYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJcGFyZW50LmpqdEdldFBhcmVudCgpIGluc3RhbmNlb2YgQVNUVW5hcnlFeHByZXNzaW9uICYmIHBhcmVudC5maXJzdFRva2VuLmltYWdlLmVxdWFscygicGFnZUNvbnRleHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJYXBwZW5kKCIpIik7Ci0JCQl9IAotCi0JCX0gZWxzZSBpZihub2RlLmdldExhc3RUb2tlbigpLmltYWdlLmVxdWFscygiLiIpICYmIG5vZGUuZ2V0TGFzdFRva2VuKCkubmV4dC5pbWFnZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLy90aGlzIGFsbG93cyBmb3IgY29udGVudCBhc3Npc3QgaW4gdGhlIGNhc2Ugb2Ygc29tZXRoaW5nIGFsb25nIHRoZSBsaW5lcyBvZiAicGFnZUNvbnRleHQuIiBhbmQgdGhlbiBjdGwtc3BhY2UKLQkJCWFwcGVuZChub2RlLmZpcnN0VG9rZW4pOwotCQkJYXBwZW5kKCJnZXQoKSIsIG5vZGUuZ2V0TGFzdFRva2VuKCkuYmVnaW5Db2x1bW4sIG5vZGUuZ2V0TGFzdFRva2VuKCkuYmVnaW5Db2x1bW4pOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlhcHBlbmQobm9kZS5maXJzdFRva2VuKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIEZ1bmN0aW9uIGludm9jYXRpb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uSW52b2NhdGlvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlTdHJpbmcgZnVuY3Rpb25UcmFuc2xhdGlvbiA9IGdlbkZ1bmN0aW9uKG5vZGUuZ2V0RnVsbEZ1bmN0aW9uTmFtZSgpKTsKLQkJaWYobnVsbCAhPSBmdW5jdGlvblRyYW5zbGF0aW9uKSB7Ci0KLQkJCS8vZmluZCB0aGUgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBmdW5jdGlvbiBuYW1lCi0JCQlUb2tlbiBqc3BGdW5jTmFtZVRva2VuID0gZ2V0SlNQRnVuY05hbWVUb2tlbihub2RlKTsKLQkJCQotCQkJLyogaWYgdGhlcmUgaXMgYSBkb3QgaW4gdGhlIGZ1bmN0aW9uIG5hbWUgdGhlbiBzZXBhcmF0ZSBvdXQgdGhlIGNsYXNzIHBhdGgKLQkJCSAqIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIGFwcGVuZC4KLQkJCSAqIGVsc2UganVzdCBhcHBlbmQKLQkJCSAqIGluIGJvdGggY2FzZXMgdXNlIHRoZSBqc3AgZnVuY3Rpb24gbmFtZSB0b2tlbiBhcyB0aGUgbWFwcGVkIHRva2VuCi0JCQkgKi8KLQkJCWludCBpbmRleE9mRG90ID0gZnVuY3Rpb25UcmFuc2xhdGlvbi5sYXN0SW5kZXhPZignLicpOwotCQkJaWYoaW5kZXhPZkRvdCAhPSAtMSkgewotCQkJCVN0cmluZyBmdW5jQ2xhc3MgPSBmdW5jdGlvblRyYW5zbGF0aW9uLnN1YnN0cmluZygwLGluZGV4T2ZEb3QrMSk7Ci0JCQkJU3RyaW5nIGZ1bmNOYW1lID0gZnVuY3Rpb25UcmFuc2xhdGlvbi5zdWJzdHJpbmcoaW5kZXhPZkRvdCsxKTsKLQkJCQlhcHBlbmQoZnVuY0NsYXNzLCBqc3BGdW5jTmFtZVRva2VuKTsKLQkJCQlhcHBlbmQoZnVuY05hbWUsIGpzcEZ1bmNOYW1lVG9rZW4pOwotCQkJfSBlbHNlIHsKLQkJCQlhcHBlbmQoZnVuY3Rpb25UcmFuc2xhdGlvbiwganNwRnVuY05hbWVUb2tlbik7Ci0JCQl9Ci0JCQkKLQkJCS8vYXBwZW5kIGFueSBwYXJhbWV0ZXJzCi0JCQlhcHBlbmQoIigiKTsKLQkJCWlmKG5vZGUuY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCW5vZGUuY2hpbGRyZW5baV0uamp0QWNjZXB0KHRoaXMsIGRhdGEpOwotCQkJCQlpZiggbm9kZS5jaGlsZHJlbi5sZW5ndGggLSBpID4gMSl7Ci0JCQkJCQlhcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCWZpbmFsIGludCBzZXYgPSBnZXRQcm9ibGVtU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0VMX0ZVTkNUSU9OX1VOREVGSU5FRCk7Ci0JCQlpZiAoc2V2ICE9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJCS8vY29sdW1uIG9mZnNldHMgYXJlIDEgYmFzZWQgbm90IDAgYmFzZWQsIHRodXMgc3VidHJhY3Qgb25lCi0JCQkJZmluYWwgaW50IHByb2JsZW1PZmZzZXQgPSBmQ29udGVudFN0YXJ0ICsgbm9kZS5nZXRGaXJzdFRva2VuKCkuYmVnaW5Db2x1bW4gLSAxOwotCQkJCWZpbmFsIGludCBwcm9ibGVtTGVuZ3RoID0gbm9kZS5nZXRMYXN0VG9rZW4oKS5lbmRDb2x1bW4gLSAxOwotCQotCQkJCS8vY291bGQgbm90IGZpbmQgZnVuY3Rpb24gdHJhbnNsYXRpb24gc28gcmVwb3J0IGVycm9yCi0JCQkJZkVMUHJvYmxlbXMuYWRkKG5ldyBFTFByb2JsZW0oc2V2LCBuZXcgUG9zaXRpb24ocHJvYmxlbU9mZnNldCwgcHJvYmxlbUxlbmd0aCksIE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BFTFRyYW5zbGF0b3JfMCwgbm9kZS5nZXRGdWxsRnVuY3Rpb25OYW1lKCkpKSk7Ci0JCQl9Ci0JCQkKLQkJCS8vZXJyb3IgbWVzc2FnZSB0byBiZSBpbmplY3RlZCBpbnRvIHRyYW5zbGF0aW9uIHB1cmVseSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCi0JCQlTdHJpbmcgZXJyb3JNc2cgPSAiXCJDb3VsZCBub3QgZmluZCBmdW5jdGlvbiB0cmFuc2xhdGlvbiBmb3I6ICIgKyBub2RlLmdldEZ1bGxGdW5jdGlvbk5hbWUoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYXBwZW5kKGVycm9yTXNnKTsKLSAJCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUge0BsaW5rIEVMUHJvYmxlbX1zIGZvdW5kIGJ5IHRoaXMgdmlzaXRvcgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVMUHJvYmxlbXMoKSB7Ci0JCXJldHVybiBmRUxQcm9ibGVtczsKLQl9Ci0KLQkvKioKLQkgKiBMaXRlcmFsCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RMaXRlcmFsIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWlmIChpc1NpbmdsZVF1b3RlZFN0cmluZ0xpdGVyYWwobm9kZSkpIHsKLQkJCS8vcmVwbGFjZSB0aGUgc2luZ2xlIHF1b3RlcyB3aXRoIGRvdWJsZSBxdW90ZXMgcXVvdGVzCi0JCQkvL3NvIGphdmEgY29tcGlsZXIgd2lsbCBiZSBoYXBweQotCQkJLy8oc2VlOiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA0OTQzKQotCQkJU3RyaW5nIGltYWdlID0gbm9kZS5maXJzdFRva2VuLmltYWdlOwotCQkJaW1hZ2UgPSAiXCIiICsgaW1hZ2Uuc3Vic3RyaW5nKDEsIGltYWdlLmxlbmd0aCgpLTEpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlub2RlLmZpcnN0VG9rZW4uaW1hZ2UgPSBpbWFnZTsKLQkJfQotCQkKLQkJYXBwZW5kKG5vZGUuZmlyc3RUb2tlbik7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gQVNUTGl0ZXJhbCBpcyBhIHNpbmdsZSBxdW90ZWQgc3RyaW5nIGxpdGVyYWwsCi0JICogQXMgb3Bwb3NlZCB0byBhIGRvdWJsZSBxdW90ZWQgQVNUTGl0ZXJhbAotCSAqIAotCSAqIEBwYXJhbSBub2RlIHRoZSBBU1RMaXRlcmFsIHRvIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBzaW5nbGUgcXVvdGVkCi0JICogCi0JICogQHJldHVybiB0cnVlLCBpZiB0aGUgZ2l2ZW4gdG9rZW4gaXMgYSBzaW5nbGUgcXVvdGVkIHN0cmluZyBsaXRlcmFsLAotCSAqIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTaW5nbGVRdW90ZWRTdHJpbmdMaXRlcmFsKEFTVExpdGVyYWwgbm9kZSkgewotCQlTdHJpbmcgY29udGVudCA9IG5vZGUuZmlyc3RUb2tlbi5pbWFnZTsKLQkJcmV0dXJuIGNvbnRlbnQubGVuZ3RoKCkgPiAxICYmIGNvbnRlbnQuc3RhcnRzV2l0aCgiJyIpICYmIGNvbnRlbnQuZW5kc1dpdGgoIiciKTsgLy8kTk9OLU5MUy0xJCAvLyAkTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIDxwPkdpdmVuIGEgbWV0aG9kIHNpZ25hdHVyZSBwYXJzZSBvdXQgdGhlIG1ldGhvZCBuYW1lIGFuZCByZXR1cm4gaXQuCi0JICogVGhlIG1ldGhvZCBuYW1lIGluIHRoZSBzaWduYXR1cmUgaXMgZm91bmQgYnkgZmluZGluZyBhIHdvcmQgd2l0aAotCSAqIHdoaXRlc3BhY2UgYmVmb3JlIGl0IGFuZCBhICc8Y29kZT4oPC9jb2RlPicgYWZ0ZXIgaXQuPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUgdGhlIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kIHRvIGdldCB0aGUgbWV0aG9kIG5hbWUgb3V0IG9mLgotCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBuYW1lIGZyb20gdGhlIGdpdmVuIHNpZ25hdHVyZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQKLQkgKiBjYW4gbm90IGJlIGZvdW5kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGdW5jdGlvbk5hbWVGcm9tU2lnbmF0dXJlIChTdHJpbmcgbWV0aG9kU2lnbmF0dXJlKSB7Ci0JCWludCBsZW5ndGggPSBtZXRob2RTaWduYXR1cmUubGVuZ3RoKCk7Ci0JCWNoYXIgYyA9IDA7Ci0JCWludCBpZGVudGlmaWVyU3RhcnQgPSAtMTsKLQkJaW50IHdoaXRlc3BhY2VTdGFydCA9IC0xOwotCQkvLyBrZWVwIHRyYWNrIG9mIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBpZGVudGlmaWVyIGJlZm9yZSB0aGUgKAotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQljID0gbWV0aG9kU2lnbmF0dXJlLmNoYXJBdChpKTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykgJiYgd2hpdGVzcGFjZVN0YXJ0ID49IGlkZW50aWZpZXJTdGFydCkKLQkJCQlpZGVudGlmaWVyU3RhcnQgPSBpOwotCQkJZWxzZSBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkKLQkJCQl3aGl0ZXNwYWNlU3RhcnQgPSBpOwotCQkJZWxzZSBpZiAoYyA9PSAnKCcpIHsKLQkJCQlpZiAoaWRlbnRpZmllclN0YXJ0ID49IDApIHsKLQkJCQkJcmV0dXJuIG1ldGhvZFNpZ25hdHVyZS5zdWJzdHJpbmcoaWRlbnRpZmllclN0YXJ0LCBpKS50cmltKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVG9rZW59IHRoZSByZXByZXNlbnRzIHRoZSBmdW5jdGlvbiBuYW1lIGluCi0JICogdGhlIHtAbGluayBBU1RGdW5jdGlvbkludm9jYXRpb259LiBUaGlzIGlzIGRlc2lnbmF0ZWQgYXMgdGhlCi0JICogZmlyc3QgdG9rZW4gYWZ0ZXIgdGhlIHtAbGluayBUb2tlbn0gd2hvc2UgaW1hZ2UgaXMgIjoiLgotCSAqIElmIHN1Y2ggYSB0b2tlbiBjYW4gbm90IGJlIGZvdW5kIHRoZW4gdGhlIGZpcnN0IHRva2VuIG9mIHRoZQotCSAqIHtAbGluayBBU1RGdW5jdGlvbkludm9jYXRpb259IGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBmdW5jSW52byB0aGUge0BsaW5rIEFTVEZ1bmN0aW9uSW52b2NhdGlvbn0gdG8gZmluZCB0aGUgZnVuY3Rpb24gbmFtZSB7QGxpbmsgVG9rZW59IGluCi0JICogQHJldHVybiB0aGUge0BsaW5rIFRva2VufSBpbiB0aGUgZ2l2ZW4ge0BsaW5rIEFTVEZ1bmN0aW9uSW52b2NhdGlvbn0gdGhhdCByZXByZXNlbnRzIHRoZQotCSAqIGZ1bmN0aW9uIG5hbWUsIG9yIGlmIHRoYXQgY2FuJ3QgYmUgZm91bmQgdGhlIGZpcnN0IHtAbGluayBUb2tlbn0gaW4gdGhlIHtAbGluayBBU1RGdW5jdGlvbkludm9jYXRpb259LgotCSAqLwotCXByaXZhdGUgVG9rZW4gZ2V0SlNQRnVuY05hbWVUb2tlbihBU1RGdW5jdGlvbkludm9jYXRpb24gZnVuY0ludm8pIHsKLQkJVG9rZW4gZnVuY05hbWVUb2tlbiA9IGZ1bmNJbnZvLmdldEZpcnN0VG9rZW4oKTsKLQkJCi0JCVRva2VuIHRlbXAgPSBmdW5jSW52by5nZXRGaXJzdFRva2VuKCk7Ci0JCWRvIHsKLQkJCWlmKHRlbXAuaW1hZ2UuZXF1YWxzKCI6IikpIHsKLQkJCQlmdW5jTmFtZVRva2VuID0gdGVtcC5uZXh0OwotCQkJfQotCQl9IHdoaWxlKHRlbXAubmV4dCAhPSBudWxsICYmIGZ1bmNOYW1lVG9rZW4gPT0gbnVsbCk7Ci0JCQkKLQkJCi0JCXJldHVybiBmdW5jTmFtZVRva2VuOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0ga2V5IHByZWZlcmVuY2Uga2V5IHVzZWQgdG8gZ2V0IHRoZSBzZXZlcml0eSBmb3IgYSBwcm9ibGVtCi0JICogQHBhcmFtIGNvbnRleHRzIHByZWZlcmVuY2Ugc2VydmljZSBjb250ZXh0cwotCSAqIEByZXR1cm4gVGhlIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBwcmVmZXJlbmNlIGtleQotCSAqLwotCXByaXZhdGUgaW50IGdldFByb2JsZW1TZXZlcml0eShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRJbnQoUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUiwga2V5LCBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIGZTY29wZUNvbnRleHRzKTsKLQl9Ci0KLQlwcml2YXRlIElTY29wZUNvbnRleHRbXSBnZXRTY29wZUNvbnRleHRzKCkgewotCQlJU2NvcGVDb250ZXh0W10gc2NvcGVzID0gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQlmaW5hbCBJRmlsZSBmaWxlID0gZ2V0RmlsZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJZmluYWwgUHJvamVjdFNjb3BlIHByb2plY3RTY29wZSA9IG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdCk7Ci0JCQkJaWYgKHByb2plY3RTY29wZS5nZXROb2RlKFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIpLmdldEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1VTRV9QUk9KRUNUX1NFVFRJTkdTLCBmYWxzZSkpIHsKLQkJCQkJc2NvcGVzID0gbmV3IElTY29wZUNvbnRleHRbXXtwcm9qZWN0U2NvcGUsIG5ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzY29wZXM7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKCkgewotCQlJRmlsZSBmID0gbnVsbDsKLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlmaW5hbCBJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcihmRG9jdW1lbnQpOwotCQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQkJZmluYWwgSVBhdGggcGF0aCA9IGJ1ZmZlci5nZXRMb2NhdGlvbigpOwotCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQlmID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJCX0KLQkJCQlpZiAoZiAhPSBudWxsICYmIGYuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJcmV0dXJuIGY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9GaW5kRnVuY3Rpb25JbnZvY2F0aW9uVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0ZpbmRGdW5jdGlvbkludm9jYXRpb25WaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNWM1NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0ZpbmRGdW5jdGlvbkludm9jYXRpb25WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgRmluZEZ1bmN0aW9uSW52b2NhdGlvblZpc2l0b3IgaW1wbGVtZW50cyBKU1BFTFBhcnNlclZpc2l0b3IgewotCXByb3RlY3RlZCBpbnQgZkN1cnNvclBvc2l0aW9uOwotCQotCXB1YmxpYyBGaW5kRnVuY3Rpb25JbnZvY2F0aW9uVmlzaXRvcihpbnQgY3Vyc29yUG9zaXRpb24pCi0JewotCQlmQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmNsb3NpbmcoU2ltcGxlTm9kZSBub2RlKSB7Ci0JCXJldHVybihub2RlLmZpcnN0VG9rZW4uYmVnaW5Db2x1bW4gPCBmQ3Vyc29yUG9zaXRpb24gJiYgbm9kZS5sYXN0VG9rZW4uZW5kQ29sdW1uID49IGZDdXJzb3JQb3NpdGlvbik7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIE9iamVjdCB2aXNpdEVuY2xvc2luZ0NoaWxkKFNpbXBsZU5vZGUgbm9kZSwgT2JqZWN0IGRhdGEpCXsKLQkJaWYobnVsbCA9PSBub2RlLmNoaWxkcmVuKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlmb3IoaW50IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYoaXNFbmNsb3Npbmcobm9kZSkpIAotCQkJCXJldHVybiBub2RlLmNoaWxkcmVuW2ldLmpqdEFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KFNpbXBsZU5vZGUgbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUT3JFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQW5kRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVxdWFsaXR5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQWRkRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE11bHRpcGx5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENob2ljZUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RVbmFyeUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZSBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlUHJlZml4IG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFsdWVTdWZmaXggbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbkludm9jYXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJT2JqZWN0IG5lc3RlZEludm9jYXRpb24gPSB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCQlpZihudWxsICE9IG5lc3RlZEludm9jYXRpb24pCi0JCQlyZXR1cm4gbmVzdGVkSW52b2NhdGlvbjsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RMaXRlcmFsIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KSlRKU1BFTFBhcnNlclN0YXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSkpUSlNQRUxQYXJzZXJTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTFhODRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KSlRKU1BFTFBhcnNlclN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEJ1ZyAzMTgyODEgLSBFTCB2YWxpZGF0aW9uIGVycm9yIGZvciBxdW90ZSBlc2NhcGluZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKSlRKU1BFTFBhcnNlclN0YXRlLmphdmEgVmVyc2lvbiA0LjIgKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBKSlRKU1BFTFBhcnNlclN0YXRlIHsKLSAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBub2RlczsKLSAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBtYXJrczsKLQotICBwcml2YXRlIGludCBzcDsgICAgICAgIC8vIG51bWJlciBvZiBub2RlcyBvbiBzdGFjawotICBwcml2YXRlIGludCBtazsgICAgICAgIC8vIGN1cnJlbnQgbWFyawotICBwcml2YXRlIGJvb2xlYW4gbm9kZV9jcmVhdGVkOwotCi0gIHB1YmxpYyBKSlRKU1BFTFBhcnNlclN0YXRlKCkgewotICAgIG5vZGVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICBtYXJrcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgc3AgPSAwOwotICAgIG1rID0gMDsKLSAgfQotCi0gIC8qIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBub2RlIHdhcyBhY3R1YWxseSBjbG9zZWQgYW5kCi0gICAgIHB1c2hlZC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIHRoZSBmaW5hbCB1c2VyIGFjdGlvbiBvZiBhCi0gICAgIG5vZGUgc2NvcGUuICAqLwotICBwdWJsaWMgYm9vbGVhbiBub2RlQ3JlYXRlZCgpIHsKLSAgICByZXR1cm4gbm9kZV9jcmVhdGVkOwotICB9Ci0KLSAgLyogQ2FsbCB0aGlzIHRvIHJlaW5pdGlhbGl6ZSB0aGUgbm9kZSBzdGFjay4gIEl0IGlzIGNhbGxlZAotICAgICBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBwYXJzZXIncyBSZUluaXQoKSBtZXRob2QuICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIG5vZGVzLmNsZWFyKCk7Ci0gICAgbWFya3MuY2xlYXIoKTsKLSAgICBzcCA9IDA7Ci0gICAgbWsgPSAwOwotICB9Ci0KLSAgLyogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoZSBBU1QuICBJdCBvbmx5IG1ha2VzIHNlbnNlIHRvIGNhbGwKLSAgICAgdGhpcyBhZnRlciBhIHN1Y2Nlc3NmdWwgcGFyc2UuICovCi0gIHB1YmxpYyBOb2RlIHJvb3ROb2RlKCkgewotICAgIHJldHVybiAoTm9kZSlub2Rlcy5nZXQoMCk7Ci0gIH0KLQotICAvKiBQdXNoZXMgYSBub2RlIG9uIHRvIHRoZSBzdGFjay4gKi8KLSAgcHVibGljIHZvaWQgcHVzaE5vZGUoTm9kZSBuKSB7Ci0gICAgbm9kZXMuYWRkKG4pOwotICAgICsrc3A7Ci0gIH0KLQotICAvKiBSZXR1cm5zIHRoZSBub2RlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlCi0gICAgIHN0YWNrLiAgKi8KLSAgcHVibGljIE5vZGUgcG9wTm9kZSgpIHsKLSAgICBpZiAoLS1zcCA8IG1rKSB7Ci0gICAgICBtayA9ICgoSW50ZWdlciltYXJrcy5yZW1vdmUobWFya3Muc2l6ZSgpLTEpKS5pbnRWYWx1ZSgpOwotICAgIH0KLSAgICByZXR1cm4gKE5vZGUpbm9kZXMucmVtb3ZlKG5vZGVzLnNpemUoKS0xKTsKLSAgfQotCi0gIC8qIFJldHVybnMgdGhlIG5vZGUgY3VycmVudGx5IG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAqLwotICBwdWJsaWMgTm9kZSBwZWVrTm9kZSgpIHsKLSAgICByZXR1cm4gKE5vZGUpbm9kZXMuZ2V0KG5vZGVzLnNpemUoKS0xKTsKLSAgfQotCi0gIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvbiB0aGUgc3RhY2sgaW4gdGhlIGN1cnJlbnQgbm9kZQotICAgICBzY29wZS4gKi8KLSAgcHVibGljIGludCBub2RlQXJpdHkoKSB7Ci0gICAgcmV0dXJuIHNwIC0gbWs7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGNsZWFyTm9kZVNjb3BlKE5vZGUgbikgewotICAgIHdoaWxlIChzcCA+IG1rKSB7Ci0gICAgICBwb3BOb2RlKCk7Ci0gICAgfQotICAgIG1rID0gKChJbnRlZ2VyKW1hcmtzLnJlbW92ZShtYXJrcy5zaXplKCktMSkpLmludFZhbHVlKCk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIG9wZW5Ob2RlU2NvcGUoTm9kZSBuKSB7Ci0gICAgbWFya3MuYWRkKG5ldyBJbnRlZ2VyKG1rKSk7Ci0gICAgbWsgPSBzcDsKLSAgICBuLmpqdE9wZW4oKTsKLSAgfQotCi0KLSAgLyogQSBkZWZpbml0ZSBub2RlIGlzIGNvbnN0cnVjdGVkIGZyb20gYSBzcGVjaWZpZWQgbnVtYmVyIG9mCi0gICAgIGNoaWxkcmVuLiAgVGhhdCBudW1iZXIgb2Ygbm9kZXMgYXJlIHBvcHBlZCBmcm9tIHRoZSBzdGFjayBhbmQKLSAgICAgbWFkZSB0aGUgY2hpbGRyZW4gb2YgdGhlIGRlZmluaXRlIG5vZGUuICBUaGVuIHRoZSBkZWZpbml0ZSBub2RlCi0gICAgIGlzIHB1c2hlZCBvbiB0byB0aGUgc3RhY2suICovCi0gIHB1YmxpYyB2b2lkIGNsb3NlTm9kZVNjb3BlKE5vZGUgbiwgaW50IG51bSkgewotICAgIG1rID0gKChJbnRlZ2VyKW1hcmtzLnJlbW92ZShtYXJrcy5zaXplKCktMSkpLmludFZhbHVlKCk7Ci0gICAgd2hpbGUgKG51bS0tID4gMCkgewotICAgICAgTm9kZSBjID0gcG9wTm9kZSgpOwotICAgICAgYy5qanRTZXRQYXJlbnQobik7Ci0gICAgICBuLmpqdEFkZENoaWxkKGMsIG51bSk7Ci0gICAgfQotICAgIG4uamp0Q2xvc2UoKTsKLSAgICBwdXNoTm9kZShuKTsKLSAgICBub2RlX2NyZWF0ZWQgPSB0cnVlOwotICB9Ci0KLQotICAvKiBBIGNvbmRpdGlvbmFsIG5vZGUgaXMgY29uc3RydWN0ZWQgaWYgaXRzIGNvbmRpdGlvbiBpcyB0cnVlLiAgQWxsCi0gICAgIHRoZSBub2RlcyB0aGF0IGhhdmUgYmVlbiBwdXNoZWQgc2luY2UgdGhlIG5vZGUgd2FzIG9wZW5lZCBhcmUKLSAgICAgbWFkZSBjaGlsZHJlbiBvZiB0aGUgY29uZGl0aW9uYWwgbm9kZSwgd2hpY2ggaXMgdGhlbiBwdXNoZWQKLSAgICAgb24gdG8gdGhlIHN0YWNrLiAgSWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZSB0aGUgbm9kZSBpcyBub3QKLSAgICAgY29uc3RydWN0ZWQgYW5kIHRoZXkgYXJlIGxlZnQgb24gdGhlIHN0YWNrLiAqLwotICBwdWJsaWMgdm9pZCBjbG9zZU5vZGVTY29wZShOb2RlIG4sIGJvb2xlYW4gY29uZGl0aW9uKSB7Ci0gICAgaWYgKGNvbmRpdGlvbikgewotICAgICAgaW50IGEgPSBub2RlQXJpdHkoKTsKLSAgICAgIG1rID0gKChJbnRlZ2VyKW1hcmtzLnJlbW92ZShtYXJrcy5zaXplKCktMSkpLmludFZhbHVlKCk7Ci0gICAgICB3aGlsZSAoYS0tID4gMCkgewotICAgICAgICBOb2RlIGMgPSBwb3BOb2RlKCk7Ci0gICAgICAgIGMuamp0U2V0UGFyZW50KG4pOwotICAgICAgICBuLmpqdEFkZENoaWxkKGMsIGEpOwotICAgICAgfQotICAgICAgbi5qanRDbG9zZSgpOwotICAgICAgcHVzaE5vZGUobik7Ci0gICAgICBub2RlX2NyZWF0ZWQgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBtayA9ICgoSW50ZWdlciltYXJrcy5yZW1vdmUobWFya3Muc2l6ZSgpLTEpKS5pbnRWYWx1ZSgpOwotICAgICAgbm9kZV9jcmVhdGVkID0gZmFsc2U7Ci0gICAgfQotICB9Ci19Ci0vKiBKYXZhQ0MgLSBPcmlnaW5hbENoZWNrc3VtPWNmMDFhM2UyMTA0NGUxZmEyMGNkZmRjN2E1NTJlODg1IChkbyBub3QgZWRpdCB0aGlzIGxpbmUpICovCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUwuamogYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUwuamoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OWU4YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMLmpqCisrKyAvZGV2L251bGwKQEAgLTEsNjc2ICswLDAgQEAKLS8qQGJnZW4oamp0cmVlKSBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEpTUEVMLmpqICovDQotLypAZWdlbiovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEJ1ZyAzMTgyODEgLSBFTCB2YWxpZGF0aW9uIGVycm9yIGZvciBxdW90ZSBlc2NhcGluZw0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogSSBrbm93IHRoYXQgaGF2aW5nIHNvbWUgb2YgdGhlc2Ugb3B0aW9ucyBvbiBvbmUgbGluZSBpcyBydWRlIGJ1dCANCi0gKiBpZiB3ZSBkb24ndCBkbyB0aGF0IHRoZSBsaW5lIG51bWJlciByZXBvcnRlZCBmcm9tIGphdmFjYyBhcmUgb2ZmDQotICogd2hpY2gsIHRydXN0IG1lLCBpcyBmYXIgbW9yZSBhbm5veWluZy4gIC0tdGNhcnJvbGxAYmVhLmNvbQ0KLSAqLw0KLW9wdGlvbnMgew0KLSAgSkFWQV9VTklDT0RFX0VTQ0FQRSA9IGZhbHNlOw0KLSAgVU5JQ09ERV9JTlBVVCA9IHRydWU7DQotICBTVEFUSUMgPSBmYWxzZTsNCi0gIE9QVElNSVpFX1RPS0VOX01BTkFHRVIgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLX0NCi0NCi1QQVJTRVJfQkVHSU4oSlNQRUxQYXJzZXIpDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsNCi0NCi1wdWJsaWMgY2xhc3MgSlNQRUxQYXJzZXIvKkBiZ2VuKGpqdHJlZSkqL2ltcGxlbWVudHMgSlNQRUxQYXJzZXJUcmVlQ29uc3RhbnRzLypAZWdlbiovIHsvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgcHJvdGVjdGVkIEpKVEpTUEVMUGFyc2VyU3RhdGUgamp0cmVlID0gbmV3IEpKVEpTUEVMUGFyc2VyU3RhdGUoKTsNCi0NCi0vKkBlZ2VuKi8NCi0gIA0KLSAgdm9pZCBqanRyZWVPcGVuTm9kZVNjb3BlKE5vZGUgbikNCi0gIHsNCi0gICAgICAgICAgKChTaW1wbGVOb2RlKW4pLnNldEZpcnN0VG9rZW4oZ2V0VG9rZW4oMSkpOw0KLSAgfQ0KLQ0KLSAgdm9pZCBqanRyZWVDbG9zZU5vZGVTY29wZShOb2RlIG4pDQotICB7DQotICAgICgoU2ltcGxlTm9kZSluKS5zZXRMYXN0VG9rZW4oZ2V0VG9rZW4oMCkpOw0KLSAgfQ0KLSAgDQotICBwdWJsaWMgc3RhdGljIEpTUEVMUGFyc2VyIGNyZWF0ZVBhcnNlcihqYXZhLmxhbmcuU3RyaW5nIGlucHV0KSB7DQotICAgICAgICAgIGphdmEuaW8uU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihpbnB1dCk7DQotICAgICAgICAgIHJldHVybiBuZXcgSlNQRUxQYXJzZXIocmVhZGVyKTsNCi0gIH0NCi0gIA0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEubGFuZy5TdHJpbmcgaW5wdXQpIHsNCi0gICAgICAgICAgIGphdmEuaW8uU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihpbnB1dCk7DQotICAgICAgICAgICBSZUluaXQocmVhZGVyKTsNCi0gIH0NCi0gIA0KLX0NCi0NCi1QQVJTRVJfRU5EKEpTUEVMUGFyc2VyKQ0KLQ0KLVNLSVAgOg0KLXsNCi0gICIgIg0KLXwgIlx0Ig0KLXwgIlxuIg0KLXwgIlxyIg0KLX0NCi0NCi1UT0tFTiA6DQotew0KLS8qIExpdGVyYWxzICovDQotICA8IElOVEVHRVJfTElURVJBTDogWyIwIi0iOSJdIChbIjAiLSI5Il0pKiA+DQotfA0KLSAgPCBGTE9BVElOR19QT0lOVF9MSVRFUkFMOg0KLSAgICAgICAgKFsiMCItIjkiXSkrICIuIiAoWyIwIi0iOSJdKSogKDxFWFBPTkVOVD4pPw0KLSAgICAgIHwgIi4iIChbIjAiLSI5Il0pKyAoPEVYUE9ORU5UPik/DQotICAgICAgfCAoWyIwIi0iOSJdKSsgPEVYUE9ORU5UPg0KLSAgPg0KLXwNCi0gIDwgI0VYUE9ORU5UOiBbImUiLCJFIl0gKFsiKyIsIi0iXSk/IChbIjAiLSI5Il0pKyA+DQotfA0KLSAgPCBTVFJJTkdfTElURVJBTDoNCi0gICAgICAoIlwiIiAoKH5bIlwiIiwiXFwiXSkgfCAoIlxcIiAoIFsiXFwiLCJcIiIsIlwnIl0gKSkpKiAiXCIiKSB8DQotICAgICAgKCJcJyIgKCh+WyJcJyIsIlxcIl0pIHwgKCJcXCIgKCBbIlxcIiwiXCciLCJcIiJdICkpKSogIlwnIikNCi0gID4NCi18DQotICA8IEJBRExZX0VTQ0FQRURfU1RSSU5HX0xJVEVSQUw6DQotICAgICAgKCJcIiIgKH5bIlwiIiwiXFwiXSkqICgiXFwiICggflsiXFwiLCJcIiJdICkpKSB8DQotICAgICAgKCJcJyIgKH5bIlwnIiwiXFwiXSkqICgiXFwiICggflsiXFwiLCJcJyJdICkpKQ0KLSAgPg0KLQ0KLS8qIFJlc2VydmVkIFdvcmRzIGFuZCBTeW1ib2xzICovDQotfCA8IFRSVUU6ICJ0cnVlIiA+DQotfCA8IEZBTFNFOiAiZmFsc2UiID4NCi18IDwgTlVMTDogIm51bGwiID4NCi18IDwgRE9UOiAiLiIgPg0KLXwgPCBHVDE6ICI+IiA+DQotfCA8IEdUMjogImd0IiA+DQotfCA8IExUMTogIjwiID4NCi18IDwgTFQyOiAibHQiID4NCi18IDwgRVExOiAiPT0iID4NCi18IDwgRVEyOiAiZXEiID4NCi18IDwgTEUxOiAiPD0iID4NCi18IDwgTEUyOiAibGUiID4NCi18IDwgR0UxOiAiPj0iID4NCi18IDwgR0UyOiAiZ2UiID4NCi18IDwgTkVRMTogIiE9IiA+DQotfCA8IE5FUTI6ICJuZSIgPg0KLXwgPCBMUEFSRU46ICIoIiA+DQotfCA8IFJQQVJFTjogIikiID4NCi18IDwgQ09NTUE6ICIsIiA+DQotfCA8IENPTE9OOiAiOiIgPg0KLXwgPCBMQlJBQ0tFVDogIlsiID4NCi18IDwgUkJSQUNLRVQ6ICJdIiA+DQotfCA8IFBMVVM6ICIrIiA+DQotfCA8IE1JTlVTOiAiLSIgPg0KLXwgPCBNVUxUSVBMWTogIioiID4NCi18IDwgRElWSURFMTogIi8iID4NCi18IDwgRElWSURFMjogImRpdiIgPg0KLXwgPCBNT0RVTFVTMTogIiUiID4NCi18IDwgTU9EVUxVUzI6ICJtb2QiID4NCi18IDwgTk9UMTogIm5vdCIgPg0KLXwgPCBOT1QyOiAiISIgPg0KLXwgPCBBTkQxOiAiYW5kIiA+DQotfCA8IEFORDI6ICImJiIgPg0KLXwgPCBPUjE6ICJvciIgPg0KLXwgPCBPUjI6ICJ8fCIgPg0KLXwgPCBFTVBUWTogImVtcHR5IiA+DQotfCA8IENPTkQ6ICI/IiA+DQotDQotLyogSWRlbnRpZmllcnMgKi8NCi0NCi18IDwgSURFTlRJRklFUjogKDxMRVRURVI+fDxJTVBMX09CSl9TVEFSVD4pICg8TEVUVEVSPnw8RElHSVQ+KSogPg0KLXwgPCAjSU1QTF9PQkpfU1RBUlQ6ICIjIiA+DQotfA0KLSAgPCAjTEVUVEVSOg0KLSAgICAgIFsNCi0gICAgICAgIiQiLA0KLSAgICAgICAiQSItIloiLA0KLSAgICAgICAiXyIsDQotICAgICAgICJhIi0ieiIsDQotICAgICAgICJcdTAwYzAiLSJcdTAwZDYiLA0KLSAgICAgICAiXHUwMGQ4Ii0iXHUwMGY2IiwNCi0gICAgICAgIlx1MDBmOCItIlx1MDBmZiIsDQotICAgICAgICJcdTAxMDAiLSJcdTFmZmYiLA0KLSAgICAgICAiXHUzMDQwIi0iXHUzMThmIiwNCi0gICAgICAgIlx1MzMwMCItIlx1MzM3ZiIsDQotICAgICAgICJcdTM0MDAiLSJcdTNkMmQiLA0KLSAgICAgICAiXHU0ZTAwIi0iXHU5ZmZmIiwNCi0gICAgICAgIlx1ZjkwMCItIlx1ZmFmZiINCi0gICAgICBdDQotICA+DQotfA0KLSAgPCAjRElHSVQ6DQotICAgICAgWw0KLSAgICAgICAiMCItIjkiLA0KLSAgICAgICAiXHUwNjYwIi0iXHUwNjY5IiwNCi0gICAgICAgIlx1MDZmMCItIlx1MDZmOSIsDQotICAgICAgICJcdTA5NjYiLSJcdTA5NmYiLA0KLSAgICAgICAiXHUwOWU2Ii0iXHUwOWVmIiwNCi0gICAgICAgIlx1MGE2NiItIlx1MGE2ZiIsDQotICAgICAgICJcdTBhZTYiLSJcdTBhZWYiLA0KLSAgICAgICAiXHUwYjY2Ii0iXHUwYjZmIiwNCi0gICAgICAgIlx1MGJlNyItIlx1MGJlZiIsDQotICAgICAgICJcdTBjNjYiLSJcdTBjNmYiLA0KLSAgICAgICAiXHUwY2U2Ii0iXHUwY2VmIiwNCi0gICAgICAgIlx1MGQ2NiItIlx1MGQ2ZiIsDQotICAgICAgICJcdTBlNTAiLSJcdTBlNTkiLA0KLSAgICAgICAiXHUwZWQwIi0iXHUwZWQ5IiwNCi0gICAgICAgIlx1MTA0MCItIlx1MTA0OSINCi0gICAgICBdDQotICA+DQotfQ0KLQ0KLUFTVEV4cHJlc3Npb24gRXhwcmVzc2lvbigpIDogey8qQGJnZW4oamp0cmVlKSBFeHByZXNzaW9uICovDQotICBBU1RFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURXhwcmVzc2lvbihKSlRFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIChMT09LQUhFQUQoQ2hvaWNlRXhwcmVzc2lvbigpKSBDaG9pY2VFeHByZXNzaW9uKCkgfCBPckV4cHJlc3Npb24oKSkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLS8qQGVnZW4qLyB7IHJldHVybiBqanRuMDAwOyB9LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBPckV4cHJlc3Npb24oKSAgICAgICAgICAgICAgICAgICA6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgI09yRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICBBU1RPckV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RPckV4cHJlc3Npb24oSkpUT1JFWFBSRVNTSU9OKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovDQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17LypAYmdlbihqanRyZWUpICNPckV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEFuZEV4cHJlc3Npb24oKSAoKHQgPSA8T1IxPiB8IHQgPSA8T1IyPikgeyBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgIEFuZEV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBBbmRFeHByZXNzaW9uKCkgICAgICAgICAgICAgICAgICAgIDogDQotey8qQGJnZW4oamp0cmVlKSAjQW5kRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICBBU1RBbmRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQW5kRXhwcmVzc2lvbihKSlRBTkRFWFBSRVNTSU9OKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovDQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17LypAYmdlbihqanRyZWUpICNBbmRFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBFcXVhbGl0eUV4cHJlc3Npb24oKSAoKHQgPSA8QU5EMT4gfCB0ID0gPEFORDI+KSB7IGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovICAgICAgICANCi19DQotDQotdm9pZCBFcXVhbGl0eUV4cHJlc3Npb24oKSAgICAgICAgICAgICAgICAgICAgICAgICA6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgI0VxdWFsaXR5RXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICBBU1RFcXVhbGl0eUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RFcXVhbGl0eUV4cHJlc3Npb24oSkpURVFVQUxJVFlFWFBSRVNTSU9OKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovDQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17LypAYmdlbihqanRyZWUpICNFcXVhbGl0eUV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgDQotICAgICAgICAoKHQgPSA8RVExPiB8IHQgPSA8RVEyPiB8IHQgPSA8TkVRMT4gfCB0ID0gPE5FUTI+KSB7IGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBSZWxhdGlvbmFsRXhwcmVzc2lvbigpICAgICAgICAgICAgICAgICAgICAgICAgICAgOg0KLXsvKkBiZ2VuKGpqdHJlZSkgI1JlbGF0aW9uYWxFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24oSkpUUkVMQVRJT05BTEVYUFJFU1NJT04pOw0KLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgI1JlbGF0aW9uYWxFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBBZGRFeHByZXNzaW9uKCkgDQotICAgICAgICAoDQotICAgICAgICAgICAgICAgICh0ID0gPExUMT4gfCB0ID0gPExUMj4gfCB0ID0gPEdUMT4gfCB0ID0gPEdUMj4gfCB0ID0gPEdFMT4gfCB0ID0gPEdFMj4gfCB0ID0gPExFMT4gfCB0ID0gPExFMj4pICB7IGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgICAgICAgICBBZGRFeHByZXNzaW9uKCkNCi0gICAgICAgICkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBBZGRFeHByZXNzaW9uKCkgICAgICAgICAgICAgICAgICAgIDogDQotey8qQGJnZW4oamp0cmVlKSAjQWRkRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICBBU1RBZGRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQWRkRXhwcmVzc2lvbihKSlRBRERFWFBSRVNTSU9OKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovDQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17LypAYmdlbihqanRyZWUpICNBZGRFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBNdWx0aXBseUV4cHJlc3Npb24oKSAoKHQgPSA8UExVUz4gfCB0ID0gPE1JTlVTPikgeyBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgIE11bHRpcGx5RXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIE11bHRpcGx5RXhwcmVzc2lvbigpICAgICAgICAgICAgICAgICAgICAgICAgIDogDQotey8qQGJnZW4oamp0cmVlKSAjTXVsdGlwbHlFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIEFTVE11bHRpcGx5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVE11bHRpcGx5RXhwcmVzc2lvbihKSlRNVUxUSVBMWUVYUFJFU1NJT04pOw0KLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgI011bHRpcGx5RXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCkgKA0KLSAgICAgICAgICAgICAgICAoIHQgPSA8TVVMVElQTFk+IHwgdCA9IDxESVZJREUxPiB8IHQgPSA8RElWSURFMj4gfCB0ID0gPE1PRFVMVVMxPiB8IHQgPSA8TU9EVUxVUzI+KSB7IGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgICAgICAgICBVbmFyeUV4cHJlc3Npb24oKSAgICAgICAgDQotICAgICAgICApKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQ2hvaWNlRXhwcmVzc2lvbigpIDogey8qQGJnZW4oamp0cmVlKSBDaG9pY2VFeHByZXNzaW9uICovDQotICBBU1RDaG9pY2VFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQ2hvaWNlRXhwcmVzc2lvbihKSlRDSE9JQ0VFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQ2hvaWNlRXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIE9yRXhwcmVzc2lvbigpIDxDT05EPiBPckV4cHJlc3Npb24oKSA8Q09MT04+IE9yRXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBVbmFyeUV4cHJlc3Npb24oKSA6IHsvKkBiZ2VuKGpqdHJlZSkgVW5hcnlFeHByZXNzaW9uICovDQotICBBU1RVbmFyeUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RVbmFyeUV4cHJlc3Npb24oSkpUVU5BUllFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVW5hcnlFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgKCg8Tk9UMT4gfCA8Tk9UMj4gfCA8TUlOVVM+IHwgPEVNUFRZPikgVW5hcnlFeHByZXNzaW9uKCkpDQotICAgICAgICB8IFZhbHVlKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLSAgICAgICAgDQotfQ0KLQ0KLXZvaWQgVmFsdWUoKSA6IHsvKkBiZ2VuKGpqdHJlZSkgVmFsdWUgKi8NCi0gIEFTVFZhbHVlIGpqdG4wMDAgPSBuZXcgQVNUVmFsdWUoSkpUVkFMVUUpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYWx1ZSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFZhbHVlUHJlZml4KCkgKFZhbHVlU3VmZml4KCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgVmFsdWVQcmVmaXgoKSA6IHsvKkBiZ2VuKGpqdHJlZSkgVmFsdWVQcmVmaXggKi8NCi0gIEFTVFZhbHVlUHJlZml4IGpqdG4wMDAgPSBuZXcgQVNUVmFsdWVQcmVmaXgoSkpUVkFMVUVQUkVGSVgpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYWx1ZVByZWZpeCAqLw0KLSAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICBMaXRlcmFsKCkgfCAoPExQQVJFTj4gKEV4cHJlc3Npb24oKSk/IDxSUEFSRU4+KSB8IExPT0tBSEVBRCgzKSBGdW5jdGlvbkludm9jYXRpb24oKSB8IDxJREVOVElGSUVSPi8qQGJnZW4oamp0cmVlKSovDQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICB9DQotICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgIH0NCi0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICB9DQotICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgIH0gZmluYWxseSB7DQotICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgIH0NCi0gICAgfQ0KLS8qQGVnZW4qLyANCi19DQotDQotdm9pZCBWYWx1ZVN1ZmZpeCgpIDogDQotey8qQGJnZW4oamp0cmVlKSBWYWx1ZVN1ZmZpeCAqLw0KLSAgICAgICAgQVNUVmFsdWVTdWZmaXggamp0bjAwMCA9IG5ldyBBU1RWYWx1ZVN1ZmZpeChKSlRWQUxVRVNVRkZJWCk7DQotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gdCA9IG51bGw7DQotfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFsdWVTdWZmaXggKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAoPERPVD4gKHQgPSA8SURFTlRJRklFUj4pPykvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0vKkBlZ2VuKi8geyBqanRuMDAwLnNldFByb3BlcnR5TmFtZVRva2VuKHQpOyB9DQotICAgICAgICB8ICg8TEJSQUNLRVQ+IEV4cHJlc3Npb24oKSA8UkJSQUNLRVQ+KS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRnVuY3Rpb25JbnZvY2F0aW9uKCkgOiANCi17LypAYmdlbihqanRyZWUpIEZ1bmN0aW9uSW52b2NhdGlvbiAqLw0KLSAgICAgICAgQVNURnVuY3Rpb25JbnZvY2F0aW9uIGpqdG4wMDAgPSBuZXcgQVNURnVuY3Rpb25JbnZvY2F0aW9uKEpKVEZVTkNUSU9OSU5WT0NBVElPTik7DQotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gcHJlZml4ID0gbnVsbCwgbmFtZSA9IG51bGw7DQotfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25JbnZvY2F0aW9uICovDQotICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgIChwcmVmaXggPSA8SURFTlRJRklFUj4gPENPTE9OPikgeyBqanRuMDAwLnNldEZ1bGxGdW5jdGlvbk5hbWUocHJlZml4LmltYWdlICsgIjoiKTsgfQ0KLSAgICAgICAgKG5hbWUgPSA8SURFTlRJRklFUj4pPyB7DQotICAgICAgICAgICAgaWYobnVsbCAhPSBwcmVmaXggJiYgbnVsbCAhPSBuYW1lKQ0KLSAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5zZXRGdWxsRnVuY3Rpb25OYW1lKHByZWZpeC5pbWFnZSArICI6IiArIChudWxsID09IG5hbWUgPyAiIiA6IG5hbWUuaW1hZ2UpKTsNCi0gICAgICAgICAgICBlbHNlIGlmKG51bGwgIT0gbmFtZSkNCi0gICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuc2V0RnVsbEZ1bmN0aW9uTmFtZShuYW1lLmltYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgICg8TFBBUkVOPiAoRXhwcmVzc2lvbigpKT8gKDxDT01NQT4gRXhwcmVzc2lvbigpKSogdHJ5ICB7ICg8UlBBUkVOPikgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9ICk/LypAYmdlbihqanRyZWUpKi8NCi0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgIH0NCi0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgfQ0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgIH0NCi0gICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgfSBmaW5hbGx5IHsNCi0gICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgfQ0KLSAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgTGl0ZXJhbCgpIDogey8qQGJnZW4oamp0cmVlKSBMaXRlcmFsICovDQotICBBU1RMaXRlcmFsIGpqdG4wMDAgPSBuZXcgQVNUTGl0ZXJhbChKSlRMSVRFUkFMKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTGl0ZXJhbCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxUUlVFPiB8IDxGQUxTRT4gfCA8SU5URUdFUl9MSVRFUkFMPiB8IDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiB8IDxTVFJJTkdfTElURVJBTD4gfCA8TlVMTD4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMLmpqdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTC5qanQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZDJjNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMLmpqdAorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gQnVnIDMxODI4MSAtIEVMIHZhbGlkYXRpb24gZXJyb3IgZm9yIHF1b3RlIGVzY2FwaW5nDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBJIGtub3cgdGhhdCBoYXZpbmcgc29tZSBvZiB0aGVzZSBvcHRpb25zIG9uIG9uZSBsaW5lIGlzIHJ1ZGUgYnV0IA0KLSAqIGlmIHdlIGRvbid0IGRvIHRoYXQgdGhlIGxpbmUgbnVtYmVyIHJlcG9ydGVkIGZyb20gamF2YWNjIGFyZSBvZmYNCi0gKiB3aGljaCwgdHJ1c3QgbWUsIGlzIGZhciBtb3JlIGFubm95aW5nLiAgLS10Y2Fycm9sbEBiZWEuY29tDQotICovDQotb3B0aW9ucyB7DQotICBKQVZBX1VOSUNPREVfRVNDQVBFID0gZmFsc2U7DQotICBVTklDT0RFX0lOUFVUID0gdHJ1ZTsNCi0gIFNUQVRJQyA9IGZhbHNlOw0KLSAgT1BUSU1JWkVfVE9LRU5fTUFOQUdFUiA9IHRydWU7IE1VTFRJID0gdHJ1ZTsgVklTSVRPUiA9IHRydWU7IE5PREVfUEFDS0FHRSA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbCI7IE5PREVfU0NPUEVfSE9PSyA9IHRydWU7DQotfQ0KLQ0KLVBBUlNFUl9CRUdJTihKU1BFTFBhcnNlcikNCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOw0KLQ0KLXB1YmxpYyBjbGFzcyBKU1BFTFBhcnNlciB7DQotICANCi0gIHZvaWQgamp0cmVlT3Blbk5vZGVTY29wZShOb2RlIG4pDQotICB7DQotICAgICAgICAgICgoU2ltcGxlTm9kZSluKS5zZXRGaXJzdFRva2VuKGdldFRva2VuKDEpKTsNCi0gIH0NCi0NCi0gIHZvaWQgamp0cmVlQ2xvc2VOb2RlU2NvcGUoTm9kZSBuKQ0KLSAgew0KLSAgICAoKFNpbXBsZU5vZGUpbikuc2V0TGFzdFRva2VuKGdldFRva2VuKDApKTsNCi0gIH0NCi0gIA0KLSAgcHVibGljIHN0YXRpYyBKU1BFTFBhcnNlciBjcmVhdGVQYXJzZXIoamF2YS5sYW5nLlN0cmluZyBpbnB1dCkgew0KLSAgICAgICAgICBqYXZhLmlvLlN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoaW5wdXQpOw0KLSAgICAgICAgICByZXR1cm4gbmV3IEpTUEVMUGFyc2VyKHJlYWRlcik7DQotICB9DQotICANCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmxhbmcuU3RyaW5nIGlucHV0KSB7DQotICAgICAgICAgICBqYXZhLmlvLlN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoaW5wdXQpOw0KLSAgICAgICAgICAgUmVJbml0KHJlYWRlcik7DQotICB9DQotICANCi19DQotDQotUEFSU0VSX0VORChKU1BFTFBhcnNlcikNCi0NCi1TS0lQIDoNCi17DQotICAiICINCi18ICJcdCINCi18ICJcbiINCi18ICJcciINCi19DQotDQotVE9LRU4gOg0KLXsNCi0vKiBMaXRlcmFscyAqLw0KLSAgPCBJTlRFR0VSX0xJVEVSQUw6IFsiMCItIjkiXSAoWyIwIi0iOSJdKSogPg0KLXwNCi0gIDwgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoNCi0gICAgICAgIChbIjAiLSI5Il0pKyAiLiIgKFsiMCItIjkiXSkqICg8RVhQT05FTlQ+KT8NCi0gICAgICB8ICIuIiAoWyIwIi0iOSJdKSsgKDxFWFBPTkVOVD4pPw0KLSAgICAgIHwgKFsiMCItIjkiXSkrIDxFWFBPTkVOVD4NCi0gID4NCi18DQotICA8ICNFWFBPTkVOVDogWyJlIiwiRSJdIChbIisiLCItIl0pPyAoWyIwIi0iOSJdKSsgPg0KLXwNCi0gIDwgU1RSSU5HX0xJVEVSQUw6DQotICAgICAgKCJcIiIgKCh+WyJcIiIsIlxcIl0pIHwgKCJcXCIgKCBbIlxcIiwiXCIiLCJcJyJdICkpKSogIlwiIikgfA0KLSAgICAgICgiXCciICgoflsiXCciLCJcXCJdKSB8ICgiXFwiICggWyJcXCIsIlwnIiwiXCIiXSApKSkqICJcJyIpDQotICA+DQotfA0KLSAgPCBCQURMWV9FU0NBUEVEX1NUUklOR19MSVRFUkFMOg0KLSAgICAgICgiXCIiICh+WyJcIiIsIlxcIl0pKiAoIlxcIiAoIH5bIlxcIiwiXCIiXSApKSkgfA0KLSAgICAgICgiXCciICh+WyJcJyIsIlxcIl0pKiAoIlxcIiAoIH5bIlxcIiwiXCciXSApKSkNCi0gID4NCi0NCi0vKiBSZXNlcnZlZCBXb3JkcyBhbmQgU3ltYm9scyAqLw0KLXwgPCBUUlVFOiAidHJ1ZSIgPg0KLXwgPCBGQUxTRTogImZhbHNlIiA+DQotfCA8IE5VTEw6ICJudWxsIiA+DQotfCA8IERPVDogIi4iID4NCi18IDwgR1QxOiAiPiIgPg0KLXwgPCBHVDI6ICJndCIgPg0KLXwgPCBMVDE6ICI8IiA+DQotfCA8IExUMjogImx0IiA+DQotfCA8IEVRMTogIj09IiA+DQotfCA8IEVRMjogImVxIiA+DQotfCA8IExFMTogIjw9IiA+DQotfCA8IExFMjogImxlIiA+DQotfCA8IEdFMTogIj49IiA+DQotfCA8IEdFMjogImdlIiA+DQotfCA8IE5FUTE6ICIhPSIgPg0KLXwgPCBORVEyOiAibmUiID4NCi18IDwgTFBBUkVOOiAiKCIgPg0KLXwgPCBSUEFSRU46ICIpIiA+DQotfCA8IENPTU1BOiAiLCIgPg0KLXwgPCBDT0xPTjogIjoiID4NCi18IDwgTEJSQUNLRVQ6ICJbIiA+DQotfCA8IFJCUkFDS0VUOiAiXSIgPg0KLXwgPCBQTFVTOiAiKyIgPg0KLXwgPCBNSU5VUzogIi0iID4NCi18IDwgTVVMVElQTFk6ICIqIiA+DQotfCA8IERJVklERTE6ICIvIiA+DQotfCA8IERJVklERTI6ICJkaXYiID4NCi18IDwgTU9EVUxVUzE6ICIlIiA+DQotfCA8IE1PRFVMVVMyOiAibW9kIiA+DQotfCA8IE5PVDE6ICJub3QiID4NCi18IDwgTk9UMjogIiEiID4NCi18IDwgQU5EMTogImFuZCIgPg0KLXwgPCBBTkQyOiAiJiYiID4NCi18IDwgT1IxOiAib3IiID4NCi18IDwgT1IyOiAifHwiID4NCi18IDwgRU1QVFk6ICJlbXB0eSIgPg0KLXwgPCBDT05EOiAiPyIgPg0KLQ0KLS8qIElkZW50aWZpZXJzICovDQotDQotfCA8IElERU5USUZJRVI6ICg8TEVUVEVSPnw8SU1QTF9PQkpfU1RBUlQ+KSAoPExFVFRFUj58PERJR0lUPikqID4NCi18IDwgI0lNUExfT0JKX1NUQVJUOiAiIyIgPg0KLXwNCi0gIDwgI0xFVFRFUjoNCi0gICAgICBbDQotICAgICAgICJcdTAwMjQiLA0KLSAgICAgICAiXHUwMDQxIi0iXHUwMDVhIiwNCi0gICAgICAgIlx1MDA1ZiIsDQotICAgICAgICJcdTAwNjEiLSJcdTAwN2EiLA0KLSAgICAgICAiXHUwMGMwIi0iXHUwMGQ2IiwNCi0gICAgICAgIlx1MDBkOCItIlx1MDBmNiIsDQotICAgICAgICJcdTAwZjgiLSJcdTAwZmYiLA0KLSAgICAgICAiXHUwMTAwIi0iXHUxZmZmIiwNCi0gICAgICAgIlx1MzA0MCItIlx1MzE4ZiIsDQotICAgICAgICJcdTMzMDAiLSJcdTMzN2YiLA0KLSAgICAgICAiXHUzNDAwIi0iXHUzZDJkIiwNCi0gICAgICAgIlx1NGUwMCItIlx1OWZmZiIsDQotICAgICAgICJcdWY5MDAiLSJcdWZhZmYiDQotICAgICAgXQ0KLSAgPg0KLXwNCi0gIDwgI0RJR0lUOg0KLSAgICAgIFsNCi0gICAgICAgIlx1MDAzMCItIlx1MDAzOSIsDQotICAgICAgICJcdTA2NjAiLSJcdTA2NjkiLA0KLSAgICAgICAiXHUwNmYwIi0iXHUwNmY5IiwNCi0gICAgICAgIlx1MDk2NiItIlx1MDk2ZiIsDQotICAgICAgICJcdTA5ZTYiLSJcdTA5ZWYiLA0KLSAgICAgICAiXHUwYTY2Ii0iXHUwYTZmIiwNCi0gICAgICAgIlx1MGFlNiItIlx1MGFlZiIsDQotICAgICAgICJcdTBiNjYiLSJcdTBiNmYiLA0KLSAgICAgICAiXHUwYmU3Ii0iXHUwYmVmIiwNCi0gICAgICAgIlx1MGM2NiItIlx1MGM2ZiIsDQotICAgICAgICJcdTBjZTYiLSJcdTBjZWYiLA0KLSAgICAgICAiXHUwZDY2Ii0iXHUwZDZmIiwNCi0gICAgICAgIlx1MGU1MCItIlx1MGU1OSIsDQotICAgICAgICJcdTBlZDAiLSJcdTBlZDkiLA0KLSAgICAgICAiXHUxMDQwIi0iXHUxMDQ5Ig0KLSAgICAgIF0NCi0gID4NCi19DQotDQotQVNURXhwcmVzc2lvbiBFeHByZXNzaW9uKCkgOiB7fQ0KLXsNCi0gICAgICAgIChMT09LQUhFQUQoQ2hvaWNlRXhwcmVzc2lvbigpKSBDaG9pY2VFeHByZXNzaW9uKCkgfCBPckV4cHJlc3Npb24oKSkgeyByZXR1cm4gamp0VGhpczsgfQ0KLX0NCi0NCi12b2lkIE9yRXhwcmVzc2lvbigpICNPckV4cHJlc3Npb24oPjEpIDogDQotew0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotew0KLSAgICAgICAgQW5kRXhwcmVzc2lvbigpICgodCA9IDxPUjE+IHwgdCA9IDxPUjI+KSB7IGpqdFRoaXMuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgQW5kRXhwcmVzc2lvbigpKSoNCi19DQotDQotdm9pZCBBbmRFeHByZXNzaW9uKCkgI0FuZEV4cHJlc3Npb24oPjEpIDogDQotew0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotew0KLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCkgKCh0ID0gPEFORDE+IHwgdCA9IDxBTkQyPikgeyBqanRUaGlzLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpKSogICAgICAgIA0KLX0NCi0NCi12b2lkIEVxdWFsaXR5RXhwcmVzc2lvbigpICNFcXVhbGl0eUV4cHJlc3Npb24oPjEpIDogDQotew0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotew0KLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKSANCi0gICAgICAgICgodCA9IDxFUTE+IHwgdCA9IDxFUTI+IHwgdCA9IDxORVExPiB8IHQgPSA8TkVRMj4pIHsgamp0VGhpcy5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpKSoNCi19DQotDQotdm9pZCBSZWxhdGlvbmFsRXhwcmVzc2lvbigpICNSZWxhdGlvbmFsRXhwcmVzc2lvbig+MSkgOg0KLXsNCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsNCi0gICAgICAgIEFkZEV4cHJlc3Npb24oKSANCi0gICAgICAgICgNCi0gICAgICAgICAgICAgICAgKHQgPSA8TFQxPiB8IHQgPSA8TFQyPiB8IHQgPSA8R1QxPiB8IHQgPSA8R1QyPiB8IHQgPSA8R0UxPiB8IHQgPSA8R0UyPiB8IHQgPSA8TEUxPiB8IHQgPSA8TEUyPikgIHsgamp0VGhpcy5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICAgICAgICAgIEFkZEV4cHJlc3Npb24oKQ0KLSAgICAgICAgKSoNCi19DQotDQotdm9pZCBBZGRFeHByZXNzaW9uKCkgI0FkZEV4cHJlc3Npb24oPjEpIDogDQotew0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotew0KLSAgICAgICAgTXVsdGlwbHlFeHByZXNzaW9uKCkgKCh0ID0gPFBMVVM+IHwgdCA9IDxNSU5VUz4pIHsgamp0VGhpcy5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICBNdWx0aXBseUV4cHJlc3Npb24oKSkqDQotfQ0KLQ0KLXZvaWQgTXVsdGlwbHlFeHByZXNzaW9uKCkgI011bHRpcGx5RXhwcmVzc2lvbig+MSkgOiANCi17DQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17DQotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKSAoDQotICAgICAgICAgICAgICAgICggdCA9IDxNVUxUSVBMWT4gfCB0ID0gPERJVklERTE+IHwgdCA9IDxESVZJREUyPiB8IHQgPSA8TU9EVUxVUzE+IHwgdCA9IDxNT0RVTFVTMj4pIHsgamp0VGhpcy5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICAgICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpICAgICAgICANCi0gICAgICAgICkqDQotfQ0KLQ0KLXZvaWQgQ2hvaWNlRXhwcmVzc2lvbigpIDoge30NCi17DQotICAgICAgICBPckV4cHJlc3Npb24oKSA8Q09ORD4gT3JFeHByZXNzaW9uKCkgPENPTE9OPiBPckV4cHJlc3Npb24oKQ0KLX0NCi0NCi12b2lkIFVuYXJ5RXhwcmVzc2lvbigpIDoge30NCi17DQotICAgICAgICAoKDxOT1QxPiB8IDxOT1QyPiB8IDxNSU5VUz4gfCA8RU1QVFk+KSBVbmFyeUV4cHJlc3Npb24oKSkNCi0gICAgICAgIHwgVmFsdWUoKQ0KLSAgICAgICAgDQotfQ0KLQ0KLXZvaWQgVmFsdWUoKSA6IHt9DQotew0KLSAgICAgICAgVmFsdWVQcmVmaXgoKSAoVmFsdWVTdWZmaXgoKSkqDQotfQ0KLQ0KLXZvaWQgVmFsdWVQcmVmaXgoKSA6IHt9DQotew0KLSAgICBMaXRlcmFsKCkgfCAoPExQQVJFTj4gKEV4cHJlc3Npb24oKSk/IDxSUEFSRU4+KSB8IExPT0tBSEVBRCgzKSBGdW5jdGlvbkludm9jYXRpb24oKSB8IDxJREVOVElGSUVSPiANCi19DQotDQotdm9pZCBWYWx1ZVN1ZmZpeCgpIDogDQotew0KLSAgICAgICAgVG9rZW4gdCA9IG51bGw7DQotfQ0KLXsNCi0gICAgICAgICg8RE9UPiAodCA9IDxJREVOVElGSUVSPik/KSB7IGpqdFRoaXMuc2V0UHJvcGVydHlOYW1lVG9rZW4odCk7IH0NCi0gICAgICAgIHwgKDxMQlJBQ0tFVD4gRXhwcmVzc2lvbigpIDxSQlJBQ0tFVD4pDQotfQ0KLQ0KLXZvaWQgRnVuY3Rpb25JbnZvY2F0aW9uKCkgOiANCi17DQotICAgICAgICBUb2tlbiBwcmVmaXggPSBudWxsLCBuYW1lID0gbnVsbDsNCi19DQotew0KLSAgICAocHJlZml4ID0gPElERU5USUZJRVI+IDxDT0xPTj4pIHsgamp0VGhpcy5zZXRGdWxsRnVuY3Rpb25OYW1lKHByZWZpeC5pbWFnZSArICI6Iik7IH0NCi0gICAgICAgIChuYW1lID0gPElERU5USUZJRVI+KT8gew0KLSAgICAgICAgICAgIGlmKG51bGwgIT0gcHJlZml4ICYmIG51bGwgIT0gbmFtZSkNCi0gICAgICAgICAgICAgICAgICAgIGpqdFRoaXMuc2V0RnVsbEZ1bmN0aW9uTmFtZShwcmVmaXguaW1hZ2UgKyAiOiIgKyAobnVsbCA9PSBuYW1lID8gIiIgOiBuYW1lLmltYWdlKSk7DQotICAgICAgICAgICAgZWxzZSBpZihudWxsICE9IG5hbWUpDQotICAgICAgICAgICAgICAgICAgICBqanRUaGlzLnNldEZ1bGxGdW5jdGlvbk5hbWUobmFtZS5pbWFnZSk7DQotICAgICAgICB9DQotICAgICAgICAoPExQQVJFTj4gKEV4cHJlc3Npb24oKSk/ICg8Q09NTUE+IEV4cHJlc3Npb24oKSkqIHRyeSAgeyAoPFJQQVJFTj4pIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSApPw0KLX0NCi0NCi12b2lkIExpdGVyYWwoKSA6IHt9DQotew0KLSAgICAgICAgPFRSVUU+IHwgPEZBTFNFPiB8IDxJTlRFR0VSX0xJVEVSQUw+IHwgPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IHwgPFNUUklOR19MSVRFUkFMPiB8IDxOVUxMPg0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTNjMmU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gQnVnIDMxODI4MSAtIEVMIHZhbGlkYXRpb24gZXJyb3IgZm9yIHF1b3RlIGVzY2FwaW5nCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlJkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKU1BFTFBhcnNlci5qYXZhICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgSlNQRUxQYXJzZXIvKkBiZ2VuKGpqdHJlZSkqL2ltcGxlbWVudHMgSlNQRUxQYXJzZXJUcmVlQ29uc3RhbnRzLCBKU1BFTFBhcnNlckNvbnN0YW50cyB7LypAYmdlbihqanRyZWUpKi8KLSAgcHJvdGVjdGVkIEpKVEpTUEVMUGFyc2VyU3RhdGUgamp0cmVlID0gbmV3IEpKVEpTUEVMUGFyc2VyU3RhdGUoKTsKLSAgdm9pZCBqanRyZWVPcGVuTm9kZVNjb3BlKE5vZGUgbikKLSAgewotICAgICAgICAgICgoU2ltcGxlTm9kZSluKS5zZXRGaXJzdFRva2VuKGdldFRva2VuKDEpKTsKLSAgfQotCi0gIHZvaWQgamp0cmVlQ2xvc2VOb2RlU2NvcGUoTm9kZSBuKQotICB7Ci0gICAgKChTaW1wbGVOb2RlKW4pLnNldExhc3RUb2tlbihnZXRUb2tlbigwKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEpTUEVMUGFyc2VyIGNyZWF0ZVBhcnNlcihqYXZhLmxhbmcuU3RyaW5nIGlucHV0KSB7Ci0gICAgICAgICAgamF2YS5pby5TdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKGlucHV0KTsKLSAgICAgICAgICByZXR1cm4gbmV3IEpTUEVMUGFyc2VyKHJlYWRlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5sYW5nLlN0cmluZyBpbnB1dCkgewotICAgICAgICAgICBqYXZhLmlvLlN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoaW5wdXQpOwotICAgICAgICAgICBSZUluaXQocmVhZGVyKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBBU1RFeHByZXNzaW9uIEV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypAYmdlbihqanRyZWUpIEV4cHJlc3Npb24gKi8KLSAgQVNURXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEV4cHJlc3Npb24oSkpURVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl8xKDIxNDc0ODM2NDcpKSB7Ci0gICAgICAgIENob2ljZUV4cHJlc3Npb24oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKLSAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGNhc2UgTlVMTDoKLSAgICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgIGNhc2UgTk9UMToKLSAgICAgICAgY2FzZSBOT1QyOgotICAgICAgICBjYXNlIEVNUFRZOgotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgT3JFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzBdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIGpqdG4wMDA7fQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgT3JFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgI09yRXhwcmVzc2lvbig+IDEpICovCi0gICAgICAgIEFTVE9yRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVE9yRXhwcmVzc2lvbihKSlRPUkVYUFJFU1NJT04pOwotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiB0OwotICAgIHRyeSB7Ci0gICAgICBBbmRFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8xOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgT1IxOgotICAgICAgICBjYXNlIE9SMjoKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBPUjE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oT1IxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUjI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oT1IyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMl0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsKLSAgICAgICAgQW5kRXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEFuZEV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSAjQW5kRXhwcmVzc2lvbig+IDEpICovCi0gICAgICAgIEFTVEFuZEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RBbmRFeHByZXNzaW9uKEpKVEFOREVYUFJFU1NJT04pOwotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiB0OwotICAgIHRyeSB7Ci0gICAgICBFcXVhbGl0eUV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzI6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBBTkQxOgotICAgICAgICBjYXNlIEFORDI6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzNdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzI7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQU5EMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihBTkQxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBTkQyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEFORDIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs0XSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsKLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRXF1YWxpdHlFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgI0VxdWFsaXR5RXhwcmVzc2lvbig+IDEpICovCi0gICAgICAgIEFTVEVxdWFsaXR5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEVxdWFsaXR5RXhwcmVzc2lvbihKSlRFUVVBTElUWUVYUFJFU1NJT04pOwotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiB0OwotICAgIHRyeSB7Ci0gICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMzoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEVRMToKLSAgICAgICAgY2FzZSBFUTI6Ci0gICAgICAgIGNhc2UgTkVRMToKLSAgICAgICAgY2FzZSBORVEyOgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs1XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8zOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEVRMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihFUTEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVRMjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihFUTIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5FUTE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTkVRMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTkVRMjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihORVEyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNl0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7Ci0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUmVsYXRpb25hbEV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSAjUmVsYXRpb25hbEV4cHJlc3Npb24oPiAxKSAqLwotICAgICAgICBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uKEpKVFJFTEFUSU9OQUxFWFBSRVNTSU9OKTsKLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7VG9rZW4gdDsKLSAgICB0cnkgewotICAgICAgQWRkRXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfNDoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEdUMToKLSAgICAgICAgY2FzZSBHVDI6Ci0gICAgICAgIGNhc2UgTFQxOgotICAgICAgICBjYXNlIExUMjoKLSAgICAgICAgY2FzZSBMRTE6Ci0gICAgICAgIGNhc2UgTEUyOgotICAgICAgICBjYXNlIEdFMToKLSAgICAgICAgY2FzZSBHRTI6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzddID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzQ7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgTFQxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKExUMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFQyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKExUMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1QxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEdUMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1QyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEdUMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0UxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEdFMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0UyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEdFMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTEUxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKExFMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTEUyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKExFMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzhdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOwotICAgICAgICBBZGRFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQWRkRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpICNBZGRFeHByZXNzaW9uKD4gMSkgKi8KLSAgICAgICAgQVNUQWRkRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEFkZEV4cHJlc3Npb24oSkpUQURERVhQUkVTU0lPTik7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHQ7Ci0gICAgdHJ5IHsKLSAgICAgIE11bHRpcGx5RXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfNToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFBMVVM6Ci0gICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzldID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzU7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgUExVUzoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihQTFVTKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihNSU5VUyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzEwXSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7Ci0gICAgICAgIE11bHRpcGx5RXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIE11bHRpcGx5RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpICNNdWx0aXBseUV4cHJlc3Npb24oPiAxKSAqLwotICAgICAgICBBU1RNdWx0aXBseUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RNdWx0aXBseUV4cHJlc3Npb24oSkpUTVVMVElQTFlFWFBSRVNTSU9OKTsKLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7VG9rZW4gdDsKLSAgICB0cnkgewotICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF82OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgTVVMVElQTFk6Ci0gICAgICAgIGNhc2UgRElWSURFMToKLSAgICAgICAgY2FzZSBESVZJREUyOgotICAgICAgICBjYXNlIE1PRFVMVVMxOgotICAgICAgICBjYXNlIE1PRFVMVVMyOgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxMV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfNjsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBNVUxUSVBMWToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihNVUxUSVBMWSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRElWSURFMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihESVZJREUxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBESVZJREUyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKERJVklERTIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1PRFVMVVMxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE1PRFVMVVMxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNT0RVTFVTMjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihNT0RVTFVTMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzEyXSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOwotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBDaG9pY2VFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQGJnZW4oamp0cmVlKSBDaG9pY2VFeHByZXNzaW9uICovCi0gIEFTVENob2ljZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RDaG9pY2VFeHByZXNzaW9uKEpKVENIT0lDRUVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgT3JFeHByZXNzaW9uKCk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKENPTkQpOwotICAgICAgT3JFeHByZXNzaW9uKCk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKLSAgICAgIE9yRXhwcmVzc2lvbigpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFVuYXJ5RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qQGJnZW4oamp0cmVlKSBVbmFyeUV4cHJlc3Npb24gKi8KLSAgQVNUVW5hcnlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUVW5hcnlFeHByZXNzaW9uKEpKVFVOQVJZRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICBjYXNlIE5PVDE6Ci0gICAgICBjYXNlIE5PVDI6Ci0gICAgICBjYXNlIEVNUFRZOgotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBOT1QxOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTk9UMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTk9UMjoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5PVDIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1JTlVTOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTUlOVVMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVNUFRZOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRU1QVFkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxM10gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgY2FzZSBUUlVFOgotICAgICAgY2FzZSBGQUxTRToKLSAgICAgIGNhc2UgTlVMTDoKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICBWYWx1ZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxNF0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBWYWx1ZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgLypAYmdlbihqanRyZWUpIFZhbHVlICovCi0gIEFTVFZhbHVlIGpqdG4wMDAgPSBuZXcgQVNUVmFsdWUoSkpUVkFMVUUpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgVmFsdWVQcmVmaXgoKTsKLSAgICAgIGxhYmVsXzc6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBET1Q6Ci0gICAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzE1XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF83OwotICAgICAgICB9Ci0gICAgICAgIFZhbHVlU3VmZml4KCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFsdWVQcmVmaXgoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgIC8qQGJnZW4oamp0cmVlKSBWYWx1ZVByZWZpeCAqLwotICBBU1RWYWx1ZVByZWZpeCBqanRuMDAwID0gbmV3IEFTVFZhbHVlUHJlZml4KEpKVFZBTFVFUFJFRklYKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgY2FzZSBUUlVFOgotICAgICAgY2FzZSBGQUxTRToKLSAgICAgIGNhc2UgTlVMTDoKLSAgICAgICAgTGl0ZXJhbCgpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKLSAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGNhc2UgTlVMTDoKLSAgICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgIGNhc2UgTk9UMToKLSAgICAgICAgY2FzZSBOT1QyOgotICAgICAgICBjYXNlIEVNUFRZOgotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgRXhwcmVzc2lvbigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxNl0gPSBqal9nZW47Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxN10gPSBqal9nZW47Ci0gICAgICAgIGlmIChqal8yXzIoMykpIHsKLSAgICAgICAgICBGdW5jdGlvbkludm9jYXRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVsxOF0gPSBqal9nZW47Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgIH0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICB9Ci0gICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBWYWx1ZVN1ZmZpeCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhbHVlU3VmZml4ICovCi0gICAgICAgIEFTVFZhbHVlU3VmZml4IGpqdG4wMDAgPSBuZXcgQVNUVmFsdWVTdWZmaXgoSkpUVkFMVUVTVUZGSVgpOwotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiB0ID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIERPVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihET1QpOwotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxOV0gPSBqal9nZW47Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRuMDAwLnNldFByb3BlcnR5TmFtZVRva2VuKHQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNLRVQpOwotICAgICAgICBFeHByZXNzaW9uKCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNLRVQpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsyMF0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBGdW5jdGlvbkludm9jYXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkludm9jYXRpb24gKi8KLSAgICAgICAgQVNURnVuY3Rpb25JbnZvY2F0aW9uIGpqdG4wMDAgPSBuZXcgQVNURnVuY3Rpb25JbnZvY2F0aW9uKEpKVEZVTkNUSU9OSU5WT0NBVElPTik7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHByZWZpeCA9IG51bGwsIG5hbWUgPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICBwcmVmaXggPSBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOwotICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuc2V0RnVsbEZ1bmN0aW9uTmFtZShwcmVmaXguaW1hZ2UgKyAiOiIpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIG5hbWUgPSBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsyMV0gPSBqal9nZW47Ci0gICAgICB9Ci0gICAgICAgICAgICBpZihudWxsICE9IHByZWZpeCAmJiBudWxsICE9IG5hbWUpCi0gICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuc2V0RnVsbEZ1bmN0aW9uTmFtZShwcmVmaXguaW1hZ2UgKyAiOiIgKyAobnVsbCA9PSBuYW1lID8gIiIgOiBuYW1lLmltYWdlKSk7Ci0gICAgICAgICAgICBlbHNlIGlmKG51bGwgIT0gbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5zZXRGdWxsRnVuY3Rpb25OYW1lKG5hbWUuaW1hZ2UpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICBjYXNlIEZBTFNFOgotICAgICAgICBjYXNlIE5VTEw6Ci0gICAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBjYXNlIE1JTlVTOgotICAgICAgICBjYXNlIE5PVDE6Ci0gICAgICAgIGNhc2UgTk9UMjoKLSAgICAgICAgY2FzZSBFTVBUWToKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIEV4cHJlc3Npb24oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMjJdID0gampfZ2VuOwotICAgICAgICB9Ci0gICAgICAgIGxhYmVsXzg6Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9sYTFbMjNdID0gampfZ2VuOwotICAgICAgICAgICAgYnJlYWsgbGFiZWxfODsKLSAgICAgICAgICB9Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7Ci0gICAgICAgICAgRXhwcmVzc2lvbigpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMjRdID0gampfZ2VuOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgIH0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICB9Ci0gICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBMaXRlcmFsKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgIC8qQGJnZW4oamp0cmVlKSBMaXRlcmFsICovCi0gIEFTVExpdGVyYWwgamp0bjAwMCA9IG5ldyBBU1RMaXRlcmFsKEpKVExJVEVSQUwpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVFJVRSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihGQUxTRSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU5URUdFUl9MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRkxPQVRJTkdfUE9JTlRfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOVUxMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5VTEwpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsyNV0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMShpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzEoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgwLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMigpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDEsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzEoKSB7Ci0gICAgaWYgKGpqXzNSXzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExKCkgewotICAgIGlmIChqal8zUl8xMygpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMTQoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzQoKSB7Ci0gICAgaWYgKGpqXzNSXzM3KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zOCgpIHsKLSAgICBpZiAoampfM1JfOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzcoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzM4KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDQ3KSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xMigpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0tFVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zNygpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSQlJBQ0tFVCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOSgpIHsKLSAgICBpZiAoampfM1JfMzIoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8zNCgpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMigpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMzUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzM2KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzUoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNDcpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMzAoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzMxKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zXzIoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNDcpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzAoKSB7Ci0gICAgaWYgKGpqXzNSXzMzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNygpIHsKLSAgICBpZiAoampfM1JfMjgoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzI5KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2KCkgewotICAgIGlmIChqal8zUl8yNygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjMoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yNigpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDMyKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzMpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGpqXzNSXzIxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzOSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDQwKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzMpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig0NSkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIGlmIChqal8zUl8yMygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzQpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzNSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDM2KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzcpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzOCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICBpZiAoampfM1JfMjMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzkoKSB7Ci0gICAgaWYgKGpqXzNSXzExKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTkQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTEoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxKCkgewotICAgIGlmIChqal8zUl8yMygpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMjQoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzkoKSB7Ci0gICAgaWYgKGpqXzNSXzExKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOSgpIHsKLSAgICBpZiAoampfM1JfMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzIyKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDE2KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTcpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigxNCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDE1KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMjIpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigyMykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDIwKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMjEpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgaWYgKGpqXzNSXzE5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNigpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbig0MSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDQyKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChqal8zUl8xNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDEoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzcoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3KCkgewotICAgIGlmIChqal8zUl8xOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMjAoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yKCkgewotICAgIGlmIChqal8zUl8xMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTgoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigxOSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDI0KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMjUpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICBpZiAoampfM1JfMTcoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1KCkgewotICAgIGlmIChqal8zUl8xNygpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMTgoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNDMpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig0NCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoampfM1JfMTMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQwKCkgewotICAgIGlmIChqal8zUl8zNygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTMoKSB7Ci0gICAgaWYgKGpqXzNSXzE1KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8xNigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMygpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbigxMCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDYpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig4KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTIpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfNDAoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl80MSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKiBHZW5lcmF0ZWQgVG9rZW4gTWFuYWdlci4gKi8KLSAgcHVibGljIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyIHRva2VuX3NvdXJjZTsKLSAgU2ltcGxlQ2hhclN0cmVhbSBqal9pbnB1dF9zdHJlYW07Ci0gIC8qKiBDdXJyZW50IHRva2VuLiAqLwotICBwdWJsaWMgVG9rZW4gdG9rZW47Ci0gIC8qKiBOZXh0IHRva2VuLiAqLwotICBwdWJsaWMgVG9rZW4gampfbnQ7Ci0gIHByaXZhdGUgaW50IGpqX250azsKLSAgcHJpdmF0ZSBUb2tlbiBqal9zY2FucG9zLCBqal9sYXN0cG9zOwotICBwcml2YXRlIGludCBqal9sYTsKLSAgcHJpdmF0ZSBpbnQgampfZ2VuOwotICBmaW5hbCBwcml2YXRlIGludFtdIGpqX2xhMSA9IG5ldyBpbnRbMjZdOwotICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBqal9sYTFfMDsKLSAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzE7Ci0gIHN0YXRpYyB7Ci0gICAgICBqal9sYTFfaW5pdF8wKCk7Ci0gICAgICBqal9sYTFfaW5pdF8xKCk7Ci0gICB9Ci0gICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV9pbml0XzAoKSB7Ci0gICAgICBqal9sYTFfMCA9IG5ldyBpbnRbXSB7MHg0MDAxZDYwLDB4MCwweDAsMHgwLDB4MCwweDMwYzAwMDAsMHgzMGMwMDAwLDB4ZjNjMDAwLDB4ZjNjMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg0MDAxZDYwLDB4NDAwMDIwMDAsMHg0MDAxZDYwLDB4NDAwMWQ2MCwweDAsMHgwLDB4NDAwMDIwMDAsMHgwLDB4NDAwMWQ2MCwweDEwMDAwMDAwLDB4NDAwMDAwMCwweDFkNjAsfTsKLSAgIH0KLSAgIHByaXZhdGUgc3RhdGljIHZvaWQgampfbGExX2luaXRfMSgpIHsKLSAgICAgIGpqX2xhMV8xID0gbmV3IGludFtdIHsweGExODIsMHgxODAwLDB4MTgwMCwweDYwMCwweDYwMCwweDAsMHgwLDB4MCwweDAsMHgzLDB4MywweDdjLDB4N2MsMHgyMTgyLDB4YTE4MiwweDAsMHhhMTgyLDB4MCwweDgwMDAsMHg4MDAwLDB4MCwweDgwMDAsMHhhMTgyLDB4MCwweDAsMHgwLH07Ci0gICB9Ci0gIGZpbmFsIHByaXZhdGUgSkpDYWxsc1tdIGpqXzJfcnRucyA9IG5ldyBKSkNhbGxzWzJdOwotICBwcml2YXRlIGJvb2xlYW4gampfcmVzY2FuID0gZmFsc2U7Ci0gIHByaXZhdGUgaW50IGpqX2djID0gMDsKLQotICAvKiogQ29uc3RydWN0b3Igd2l0aCBJbnB1dFN0cmVhbS4gKi8KLSAgcHVibGljIEpTUEVMUGFyc2VyKGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0gICAgIHRoaXMoc3RyZWFtLCBudWxsKTsKLSAgfQotICAvKiogQ29uc3RydWN0b3Igd2l0aCBJbnB1dFN0cmVhbSBhbmQgc3VwcGxpZWQgZW5jb2RpbmcgKi8KLSAgcHVibGljIEpTUEVMUGFyc2VyKGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpIHsKLSAgICB0cnkgeyBqal9pbnB1dF9zdHJlYW0gPSBuZXcgU2ltcGxlQ2hhclN0cmVhbShzdHJlYW0sIGVuY29kaW5nLCAxLCAxKTsgfSBjYXRjaChqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsgfQotICAgIHRva2VuX3NvdXJjZSA9IG5ldyBKU1BFTFBhcnNlclRva2VuTWFuYWdlcihqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI2OyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgLyoqIFJlaW5pdGlhbGlzZS4gKi8KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0gICAgIFJlSW5pdChzdHJlYW0sIG51bGwpOwotICB9Ci0gIC8qKiBSZWluaXRpYWxpc2UuICovCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgdHJ5IHsgampfaW5wdXRfc3RyZWFtLlJlSW5pdChzdHJlYW0sIGVuY29kaW5nLCAxLCAxKTsgfSBjYXRjaChqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsgfQotICAgIHRva2VuX3NvdXJjZS5SZUluaXQoampfaW5wdXRfc3RyZWFtKTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqdHJlZS5yZXNldCgpOwotICAgIGpqX2dlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNjsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIC8qKiBDb25zdHJ1Y3Rvci4gKi8KLSAgcHVibGljIEpTUEVMUGFyc2VyKGphdmEuaW8uUmVhZGVyIHN0cmVhbSkgewotICAgIGpqX2lucHV0X3N0cmVhbSA9IG5ldyBTaW1wbGVDaGFyU3RyZWFtKHN0cmVhbSwgMSwgMSk7Ci0gICAgdG9rZW5fc291cmNlID0gbmV3IEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyKGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqal9nZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjY7IGkrKykgampfbGExW2ldID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7Ci0gIH0KLQotICAvKiogUmVpbml0aWFsaXNlLiAqLwotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgc3RyZWFtKSB7Ci0gICAgampfaW5wdXRfc3RyZWFtLlJlSW5pdChzdHJlYW0sIDEsIDEpOwotICAgIHRva2VuX3NvdXJjZS5SZUluaXQoampfaW5wdXRfc3RyZWFtKTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqdHJlZS5yZXNldCgpOwotICAgIGpqX2dlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNjsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIC8qKiBDb25zdHJ1Y3RvciB3aXRoIGdlbmVyYXRlZCBUb2tlbiBNYW5hZ2VyLiAqLwotICBwdWJsaWMgSlNQRUxQYXJzZXIoSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIgdG0pIHsKLSAgICB0b2tlbl9zb3VyY2UgPSB0bTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqX2dlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNjsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIC8qKiBSZWluaXRpYWxpc2UuICovCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChKU1BFTFBhcnNlclRva2VuTWFuYWdlciB0bSkgewotICAgIHRva2VuX3NvdXJjZSA9IHRtOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgamp0cmVlLnJlc2V0KCk7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI2OyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBUb2tlbiBqal9jb25zdW1lX3Rva2VuKGludCBraW5kKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIFRva2VuIG9sZFRva2VuOwotICAgIGlmICgob2xkVG9rZW4gPSB0b2tlbikubmV4dCAhPSBudWxsKSB0b2tlbiA9IHRva2VuLm5leHQ7Ci0gICAgZWxzZSB0b2tlbiA9IHRva2VuLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgaWYgKHRva2VuLmtpbmQgPT0ga2luZCkgewotICAgICAgampfZ2VuKys7Ci0gICAgICBpZiAoKytqal9nYyA+IDEwMCkgewotICAgICAgICBqal9nYyA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgSkpDYWxscyBjID0gampfMl9ydG5zW2ldOwotICAgICAgICAgIHdoaWxlIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjLmdlbiA8IGpqX2dlbikgYy5maXJzdCA9IG51bGw7Ci0gICAgICAgICAgICBjID0gYy5uZXh0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRva2VuOwotICAgIH0KLSAgICB0b2tlbiA9IG9sZFRva2VuOwotICAgIGpqX2tpbmQgPSBraW5kOwotICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsKLSAgfQotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIGNsYXNzIExvb2thaGVhZFN1Y2Nlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuRXJyb3IgeyAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsgCi0gIH0KLSAgZmluYWwgcHJpdmF0ZSBMb29rYWhlYWRTdWNjZXNzIGpqX2xzID0gbmV3IExvb2thaGVhZFN1Y2Nlc3MoKTsKLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqX3NjYW5fdG9rZW4oaW50IGtpbmQpIHsKLSAgICBpZiAoampfc2NhbnBvcyA9PSBqal9sYXN0cG9zKSB7Ci0gICAgICBqal9sYS0tOwotICAgICAgaWYgKGpqX3NjYW5wb3MubmV4dCA9PSBudWxsKSB7Ci0gICAgICAgIGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gampfc2NhbnBvcy5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQ7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQ7Ci0gICAgfQotICAgIGlmIChqal9yZXNjYW4pIHsKLSAgICAgIGludCBpID0gMDsgVG9rZW4gdG9rID0gdG9rZW47Ci0gICAgICB3aGlsZSAodG9rICE9IG51bGwgJiYgdG9rICE9IGpqX3NjYW5wb3MpIHsgaSsrOyB0b2sgPSB0b2submV4dDsgfQotICAgICAgaWYgKHRvayAhPSBudWxsKSBqal9hZGRfZXJyb3JfdG9rZW4oa2luZCwgaSk7Ci0gICAgfQotICAgIGlmIChqal9zY2FucG9zLmtpbmQgIT0ga2luZCkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX2xhID09IDAgJiYgampfc2NhbnBvcyA9PSBqal9sYXN0cG9zKSB0aHJvdyBqal9sczsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi0vKiogR2V0IHRoZSBuZXh0IFRva2VuLiAqLwotICBmaW5hbCBwdWJsaWMgVG9rZW4gZ2V0TmV4dFRva2VuKCkgewotICAgIGlmICh0b2tlbi5uZXh0ICE9IG51bGwpIHRva2VuID0gdG9rZW4ubmV4dDsKLSAgICBlbHNlIHRva2VuID0gdG9rZW4ubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqal9nZW4rKzsKLSAgICByZXR1cm4gdG9rZW47Ci0gIH0KLQotLyoqIEdldCB0aGUgc3BlY2lmaWMgVG9rZW4uICovCi0gIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXRUb2tlbihpbnQgaW5kZXgpIHsKLSAgICBUb2tlbiB0ID0gdG9rZW47Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7Ci0gICAgICBpZiAodC5uZXh0ICE9IG51bGwpIHQgPSB0Lm5leHQ7Ci0gICAgICBlbHNlIHQgPSB0Lm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgfQotICAgIHJldHVybiB0OwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBpbnQgampfbnRrKCkgewotICAgIGlmICgoampfbnQ9dG9rZW4ubmV4dCkgPT0gbnVsbCkKLSAgICAgIHJldHVybiAoampfbnRrID0gKHRva2VuLm5leHQ9dG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpKS5raW5kKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gKGpqX250ayA9IGpqX250LmtpbmQpOwotICB9Ci0KLSAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBqal9leHBlbnRyaWVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBpbnRbXSBqal9leHBlbnRyeTsKLSAgcHJpdmF0ZSBpbnQgampfa2luZCA9IC0xOwotICBwcml2YXRlIGludFtdIGpqX2xhc3R0b2tlbnMgPSBuZXcgaW50WzEwMF07Ci0gIHByaXZhdGUgaW50IGpqX2VuZHBvczsKLQotICBwcml2YXRlIHZvaWQgampfYWRkX2Vycm9yX3Rva2VuKGludCBraW5kLCBpbnQgcG9zKSB7Ci0gICAgaWYgKHBvcyA+PSAxMDApIHJldHVybjsKLSAgICBpZiAocG9zID09IGpqX2VuZHBvcyArIDEpIHsKLSAgICAgIGpqX2xhc3R0b2tlbnNbampfZW5kcG9zKytdID0ga2luZDsKLSAgICB9IGVsc2UgaWYgKGpqX2VuZHBvcyAhPSAwKSB7Ci0gICAgICBqal9leHBlbnRyeSA9IG5ldyBpbnRbampfZW5kcG9zXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfZW5kcG9zOyBpKyspIHsKLSAgICAgICAgampfZXhwZW50cnlbaV0gPSBqal9sYXN0dG9rZW5zW2ldOwotICAgICAgfQotICAgICAgampfZW50cmllc19sb29wOiBmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IGpqX2V4cGVudHJpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICBpbnRbXSBvbGRlbnRyeSA9IChpbnRbXSkoaXQubmV4dCgpKTsKLSAgICAgICAgaWYgKG9sZGVudHJ5Lmxlbmd0aCA9PSBqal9leHBlbnRyeS5sZW5ndGgpIHsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqX2V4cGVudHJ5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAob2xkZW50cnlbaV0gIT0gampfZXhwZW50cnlbaV0pIHsKLSAgICAgICAgICAgICAgY29udGludWUgampfZW50cmllc19sb29wOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBqal9leHBlbnRyaWVzLmFkZChqal9leHBlbnRyeSk7Ci0gICAgICAgICAgYnJlYWsgampfZW50cmllc19sb29wOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAocG9zICE9IDApIGpqX2xhc3R0b2tlbnNbKGpqX2VuZHBvcyA9IHBvcykgLSAxXSA9IGtpbmQ7Ci0gICAgfQotICB9Ci0KLSAgLyoqIEdlbmVyYXRlIFBhcnNlRXhjZXB0aW9uLiAqLwotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24gZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpIHsKLSAgICBqal9leHBlbnRyaWVzLmNsZWFyKCk7Ci0gICAgYm9vbGVhbltdIGxhMXRva2VucyA9IG5ldyBib29sZWFuWzUxXTsKLSAgICBpZiAoampfa2luZCA+PSAwKSB7Ci0gICAgICBsYTF0b2tlbnNbampfa2luZF0gPSB0cnVlOwotICAgICAgampfa2luZCA9IC0xOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI2OyBpKyspIHsKLSAgICAgIGlmIChqal9sYTFbaV0gPT0gampfZ2VuKSB7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7IGorKykgewotICAgICAgICAgIGlmICgoampfbGExXzBbaV0gJiAoMTw8aikpICE9IDApIHsKLSAgICAgICAgICAgIGxhMXRva2Vuc1tqXSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICgoampfbGExXzFbaV0gJiAoMTw8aikpICE9IDApIHsKLSAgICAgICAgICAgIGxhMXRva2Vuc1szMitqXSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTE7IGkrKykgewotICAgICAgaWYgKGxhMXRva2Vuc1tpXSkgewotICAgICAgICBqal9leHBlbnRyeSA9IG5ldyBpbnRbMV07Ci0gICAgICAgIGpqX2V4cGVudHJ5WzBdID0gaTsKLSAgICAgICAgampfZXhwZW50cmllcy5hZGQoampfZXhwZW50cnkpOwotICAgICAgfQotICAgIH0KLSAgICBqal9lbmRwb3MgPSAwOwotICAgIGpqX3Jlc2Nhbl90b2tlbigpOwotICAgIGpqX2FkZF9lcnJvcl90b2tlbigwLCAwKTsKLSAgICBpbnRbXVtdIGV4cHRva3NlcSA9IG5ldyBpbnRbampfZXhwZW50cmllcy5zaXplKCldW107Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal9leHBlbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBleHB0b2tzZXFbaV0gPSAoaW50W10pampfZXhwZW50cmllcy5nZXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgUGFyc2VFeGNlcHRpb24odG9rZW4sIGV4cHRva3NlcSwgdG9rZW5JbWFnZSk7Ci0gIH0KLQotICAvKiogRW5hYmxlIHRyYWNpbmcuICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIGVuYWJsZV90cmFjaW5nKCkgewotICB9Ci0KLSAgLyoqIERpc2FibGUgdHJhY2luZy4gKi8KLSAgZmluYWwgcHVibGljIHZvaWQgZGlzYWJsZV90cmFjaW5nKCkgewotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSB2b2lkIGpqX3Jlc2Nhbl90b2tlbigpIHsKLSAgICBqal9yZXNjYW4gPSB0cnVlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgdHJ5IHsKLSAgICAgIEpKQ2FsbHMgcCA9IGpqXzJfcnRuc1tpXTsKLSAgICAgIGRvIHsKLSAgICAgICAgaWYgKHAuZ2VuID4gampfZ2VuKSB7Ci0gICAgICAgICAgampfbGEgPSBwLmFyZzsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBwLmZpcnN0OwotICAgICAgICAgIHN3aXRjaCAoaSkgewotICAgICAgICAgICAgY2FzZSAwOiBqal8zXzEoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6IGpqXzNfMigpOyBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcCA9IHAubmV4dDsKLSAgICAgIH0gd2hpbGUgKHAgIT0gbnVsbCk7Ci0gICAgICB9IGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgfQotICAgIH0KLSAgICBqal9yZXNjYW4gPSBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgdm9pZCBqal9zYXZlKGludCBpbmRleCwgaW50IHhsYSkgewotICAgIEpKQ2FsbHMgcCA9IGpqXzJfcnRuc1tpbmRleF07Ci0gICAgd2hpbGUgKHAuZ2VuID4gampfZ2VuKSB7Ci0gICAgICBpZiAocC5uZXh0ID09IG51bGwpIHsgcCA9IHAubmV4dCA9IG5ldyBKSkNhbGxzKCk7IGJyZWFrOyB9Ci0gICAgICBwID0gcC5uZXh0OwotICAgIH0KLSAgICBwLmdlbiA9IGpqX2dlbiArIHhsYSAtIGpqX2xhOyBwLmZpcnN0ID0gdG9rZW47IHAuYXJnID0geGxhOwotICB9Ci0KLSAgc3RhdGljIGZpbmFsIGNsYXNzIEpKQ2FsbHMgewotICAgIGludCBnZW47Ci0gICAgVG9rZW4gZmlyc3Q7Ci0gICAgaW50IGFyZzsKLSAgICBKSkNhbGxzIG5leHQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0ZTNhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWUmSmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEpTUEVMUGFyc2VyQ29uc3RhbnRzLmphdmEgKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQRUxQYXJzZXJDb25zdGFudHMgewotCi0gIGludCBFT0YgPSAwOwotICBpbnQgSU5URUdFUl9MSVRFUkFMID0gNTsKLSAgaW50IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUwgPSA2OwotICBpbnQgRVhQT05FTlQgPSA3OwotICBpbnQgU1RSSU5HX0xJVEVSQUwgPSA4OwotICBpbnQgQkFETFlfRVNDQVBFRF9TVFJJTkdfTElURVJBTCA9IDk7Ci0gIGludCBUUlVFID0gMTA7Ci0gIGludCBGQUxTRSA9IDExOwotICBpbnQgTlVMTCA9IDEyOwotICBpbnQgRE9UID0gMTM7Ci0gIGludCBHVDEgPSAxNDsKLSAgaW50IEdUMiA9IDE1OwotICBpbnQgTFQxID0gMTY7Ci0gIGludCBMVDIgPSAxNzsKLSAgaW50IEVRMSA9IDE4OwotICBpbnQgRVEyID0gMTk7Ci0gIGludCBMRTEgPSAyMDsKLSAgaW50IExFMiA9IDIxOwotICBpbnQgR0UxID0gMjI7Ci0gIGludCBHRTIgPSAyMzsKLSAgaW50IE5FUTEgPSAyNDsKLSAgaW50IE5FUTIgPSAyNTsKLSAgaW50IExQQVJFTiA9IDI2OwotICBpbnQgUlBBUkVOID0gMjc7Ci0gIGludCBDT01NQSA9IDI4OwotICBpbnQgQ09MT04gPSAyOTsKLSAgaW50IExCUkFDS0VUID0gMzA7Ci0gIGludCBSQlJBQ0tFVCA9IDMxOwotICBpbnQgUExVUyA9IDMyOwotICBpbnQgTUlOVVMgPSAzMzsKLSAgaW50IE1VTFRJUExZID0gMzQ7Ci0gIGludCBESVZJREUxID0gMzU7Ci0gIGludCBESVZJREUyID0gMzY7Ci0gIGludCBNT0RVTFVTMSA9IDM3OwotICBpbnQgTU9EVUxVUzIgPSAzODsKLSAgaW50IE5PVDEgPSAzOTsKLSAgaW50IE5PVDIgPSA0MDsKLSAgaW50IEFORDEgPSA0MTsKLSAgaW50IEFORDIgPSA0MjsKLSAgaW50IE9SMSA9IDQzOwotICBpbnQgT1IyID0gNDQ7Ci0gIGludCBFTVBUWSA9IDQ1OwotICBpbnQgQ09ORCA9IDQ2OwotICBpbnQgSURFTlRJRklFUiA9IDQ3OwotICBpbnQgSU1QTF9PQkpfU1RBUlQgPSA0ODsKLSAgaW50IExFVFRFUiA9IDQ5OwotICBpbnQgRElHSVQgPSA1MDsKLQotICBpbnQgREVGQVVMVCA9IDA7Ci0KLSAgU3RyaW5nW10gdG9rZW5JbWFnZSA9IHsKLSAgICAiPEVPRj4iLAotICAgICJcIiBcIiIsCi0gICAgIlwiXFx0XCIiLAotICAgICJcIlxcblwiIiwKLSAgICAiXCJcXHJcIiIsCi0gICAgIjxJTlRFR0VSX0xJVEVSQUw+IiwKLSAgICAiPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IiwKLSAgICAiPEVYUE9ORU5UPiIsCi0gICAgIjxTVFJJTkdfTElURVJBTD4iLAotICAgICI8QkFETFlfRVNDQVBFRF9TVFJJTkdfTElURVJBTD4iLAotICAgICJcInRydWVcIiIsCi0gICAgIlwiZmFsc2VcIiIsCi0gICAgIlwibnVsbFwiIiwKLSAgICAiXCIuXCIiLAotICAgICJcIj5cIiIsCi0gICAgIlwiZ3RcIiIsCi0gICAgIlwiPFwiIiwKLSAgICAiXCJsdFwiIiwKLSAgICAiXCI9PVwiIiwKLSAgICAiXCJlcVwiIiwKLSAgICAiXCI8PVwiIiwKLSAgICAiXCJsZVwiIiwKLSAgICAiXCI+PVwiIiwKLSAgICAiXCJnZVwiIiwKLSAgICAiXCIhPVwiIiwKLSAgICAiXCJuZVwiIiwKLSAgICAiXCIoXCIiLAotICAgICJcIilcIiIsCi0gICAgIlwiLFwiIiwKLSAgICAiXCI6XCIiLAotICAgICJcIltcIiIsCi0gICAgIlwiXVwiIiwKLSAgICAiXCIrXCIiLAotICAgICJcIi1cIiIsCi0gICAgIlwiKlwiIiwKLSAgICAiXCIvXCIiLAotICAgICJcImRpdlwiIiwKLSAgICAiXCIlXCIiLAotICAgICJcIm1vZFwiIiwKLSAgICAiXCJub3RcIiIsCi0gICAgIlwiIVwiIiwKLSAgICAiXCJhbmRcIiIsCi0gICAgIlwiJiZcIiIsCi0gICAgIlwib3JcIiIsCi0gICAgIlwifHxcIiIsCi0gICAgIlwiZW1wdHlcIiIsCi0gICAgIlwiP1wiIiwKLSAgICAiPElERU5USUZJRVI+IiwKLSAgICAiXCIjXCIiLAotICAgICI8TEVUVEVSPiIsCi0gICAgIjxESUdJVD4iLAotICB9OwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclRva2VuTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzcyN2VhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclRva2VuTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBCdWcgMzE4MjgxIC0gRUwgdmFsaWRhdGlvbiBlcnJvciBmb3IgcXVvdGUgZXNjYXBpbmcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWUmSmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEgKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLS8qKiBUb2tlbiBNYW5hZ2VyLiAqLwotcHVibGljIGNsYXNzIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyIGltcGxlbWVudHMgSlNQRUxQYXJzZXJDb25zdGFudHMKLXsKLQotICAvKiogRGVidWcgb3V0cHV0LiAqLwotICBwdWJsaWMgIGphdmEuaW8uUHJpbnRTdHJlYW0gZGVidWdTdHJlYW0gPSBTeXN0ZW0ub3V0OwotICAvKiogU2V0IGRlYnVnIG91dHB1dC4gKi8KLSAgcHVibGljICB2b2lkIHNldERlYnVnU3RyZWFtKGphdmEuaW8uUHJpbnRTdHJlYW0gZHMpIHsgZGVidWdTdHJlYW0gPSBkczsgfQotcHJpdmF0ZSBmaW5hbCBpbnQgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKGludCBwb3MsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIHN3aXRjaCAocG9zKQotICAgewotICAgICAgY2FzZSAwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyYWQwMDJhYTljMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA0NzsKLSAgICAgICAgICAgIHJldHVybiA2OwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjJkMDAwMDAxYzAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNDc7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgICAgcmV0dXJuIDY7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAyYWE4MDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gNjsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAxYzAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNDc7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAyOwotICAgICAgICAgICAgcmV0dXJuIDY7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDJkMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gNjsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgMzoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwODAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNDc7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAzOwotICAgICAgICAgICAgcmV0dXJuIDY7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDE0MDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiA2OwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICB9Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqalN0YXJ0TmZhXzAoaW50IHBvcywgbG9uZyBhY3RpdmUwKQotewotICAgcmV0dXJuIGpqTW92ZU5mYV8wKGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMChwb3MsIGFjdGl2ZTApLCBwb3MgKyAxKTsKLX0KLXByaXZhdGUgaW50IGpqU3RvcEF0UG9zKGludCBwb3MsIGludCBraW5kKQotewotICAgamptYXRjaGVkS2luZCA9IGtpbmQ7Ci0gICBqam1hdGNoZWRQb3MgPSBwb3M7Ci0gICByZXR1cm4gcG9zICsgMTsKLX0KLXByaXZhdGUgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzAoKQotewotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDMzOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDQwOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAwMDAwTCk7Ci0gICAgICBjYXNlIDM3OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDM3KTsKLSAgICAgIGNhc2UgMzg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDQwOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDI2KTsKLSAgICAgIGNhc2UgNDE6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMjcpOwotICAgICAgY2FzZSA0MjoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzNCk7Ci0gICAgICBjYXNlIDQzOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDMyKTsKLSAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMjgpOwotICAgICAgY2FzZSA0NToKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzMyk7Ci0gICAgICBjYXNlIDQ2OgotICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMCwgMTMsIDEpOwotICAgICAgY2FzZSA0NzoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzNSk7Ci0gICAgICBjYXNlIDU4OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDI5KTsKLSAgICAgIGNhc2UgNjA6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTY7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMEwpOwotICAgICAgY2FzZSA2MToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwMDBMKTsKLSAgICAgIGNhc2UgNjI6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTQ7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwMEwpOwotICAgICAgY2FzZSA2MzoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA0Nik7Ci0gICAgICBjYXNlIDkxOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDMwKTsKLSAgICAgIGNhc2UgOTM6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMzEpOwotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwMDAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTAwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwMDAwMDgwMDAwTCk7Ci0gICAgICBjYXNlIDEwMjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODAwTCk7Ci0gICAgICBjYXNlIDEwMzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODA4MDAwTCk7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjIwMDAwTCk7Ci0gICAgICBjYXNlIDEwOToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDIwMDEwMDBMKTsKLSAgICAgIGNhc2UgMTExOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMEwpOwotICAgICAgY2FzZSAxMjQ6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMDAwMDAwMEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoMCwgMCk7Ci0gICB9Ci19Ci1wcml2YXRlIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKGxvbmcgYWN0aXZlMCkKLXsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMCwgYWN0aXZlMCk7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAzODoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA0Mik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNjE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTgpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDIwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg0MDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAyMik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDI0KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4ODAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAyMSwgNik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAyMywgNik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgMjUsIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDExMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4YzAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTM6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAxOSwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgNDMsIDYpOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAxNSwgNik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDE3LCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDBMKTsKLSAgICAgIGNhc2UgMTI0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA0NCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDAsIGFjdGl2ZTApOwotfQotcHJpdmF0ZSBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgwLCBvbGQwKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMSwgYWN0aXZlMCk7Ci0gICAgICByZXR1cm4gMjsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDM4LCA2KTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMiwgNDEsIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MTgwMEwpOwotICAgICAgY2FzZSAxMTI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDM5LCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDQwMEwpOwotICAgICAgY2FzZSAxMTg6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDM2LCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoMSwgYWN0aXZlMCk7Ci19Ci1wcml2YXRlIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampTdGFydE5mYV8wKDEsIG9sZDApOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgyLCBhY3RpdmUwKTsKLSAgICAgIHJldHVybiAzOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCAxMCwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTA4OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCAxMiwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg4MDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDAwMDAwMDAwMDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDIsIGFjdGl2ZTApOwotfQotcHJpdmF0ZSBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgyLCBvbGQwKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMywgYWN0aXZlMCk7Ci0gICAgICByZXR1cm4gNDsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgMTEsIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEyMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCA0NSwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDMsIGFjdGl2ZTApOwotfQotcHJpdmF0ZSBpbnQgampTdGFydE5mYVdpdGhTdGF0ZXNfMChpbnQgcG9zLCBpbnQga2luZCwgaW50IHN0YXRlKQotewotICAgamptYXRjaGVkS2luZCA9IGtpbmQ7Ci0gICBqam1hdGNoZWRQb3MgPSBwb3M7Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyByZXR1cm4gcG9zICsgMTsgfQotICAgcmV0dXJuIGpqTW92ZU5mYV8wKHN0YXRlLCBwb3MgKyAxKTsKLX0KLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMwID0gewotICAgMHgxZmYwMDAwMGZmZmZmZmZlTCwgMHhmZmZmZmZmZmZmZmZjMDAwTCwgMHhmZmZmZmZmZkwsIDB4NjAwMDAwMDAwMDAwMDAwTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMyID0gewotICAgMHgwTCwgMHgwTCwgMHgwTCwgMHhmZjdmZmZmZmZmN2ZmZmZmTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMzID0gewotICAgMHgwTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM0ID0gewotICAgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmTCwgMHgwTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM1ID0gewotICAgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHgwTCwgMHgwTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM2ID0gewotICAgMHgzZmZmZmZmZmZmZmZMLCAweDBMLCAweDBMLCAweDBMCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzcgPSB7Ci0gICAweGZmZmZmZmZmZmZmZmZmZmVMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzggPSB7Ci0gICAweDBMLCAweDBMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMCi19OwotcHJpdmF0ZSBpbnQgampNb3ZlTmZhXzAoaW50IHN0YXJ0U3RhdGUsIGludCBjdXJQb3MpCi17Ci0gICBpbnQgc3RhcnRzQXQgPSAwOwotICAgampuZXdTdGF0ZUNudCA9IDM1OwotICAgaW50IGkgPSAxOwotICAgampzdGF0ZVNldFswXSA9IHN0YXJ0U3RhdGU7Ci0gICBpbnQga2luZCA9IDB4N2ZmZmZmZmY7Ci0gICBmb3IgKDs7KQotICAgewotICAgICAgaWYgKCsrampyb3VuZCA9PSAweDdmZmZmZmZmKQotICAgICAgICAgUmVJbml0Um91bmRzKCk7Ci0gICAgICBpZiAoY3VyQ2hhciA8IDY0KQotICAgICAgewotICAgICAgICAgbG9uZyBsID0gMUwgPDwgY3VyQ2hhcjsKLSAgICAgICAgIGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA1OwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMCwgNCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmICgoMHgxODAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA0NykKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA0NzsKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDYpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAzOSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDUsIDkpOwotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAzNCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEwLCAxNCk7Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDQ2KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMSwgMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyODAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDE4MDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNDcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNDc7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMTAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA0NykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA0NzsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDUpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDAsIDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDUpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoOSwgMTApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgIT0gNDYpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTEsIDEyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTEsIDEyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyODAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxNCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDYpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxNSwgMTYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzQpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxMCwgMTQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZiZmZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxNSwgMTcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDg0MDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxNSwgMTcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzQgJiYga2luZCA+IDgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gODsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmYmZmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMjQsIDI1KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmYmZmZmZmZmZmTCAmIGwpICE9IDBMICYmIGtpbmQgPiA5KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzOSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDUsIDkpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZjdmZmZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxOCwgMjApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDg0MDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxOCwgMjApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMxOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzkgJiYga2luZCA+IDgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gODsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmY3ZmZmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMzIsIDMzKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmY3ZmZmZmZmZmZmTCAmIGwpICE9IDBMICYmIGtpbmQgPiA5KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjdXJDaGFyIDwgMTI4KQotICAgICAgewotICAgICAgICAgbG9uZyBsID0gMUwgPDwgKGN1ckNoYXIgJiAwNzcpOwotICAgICAgICAgZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2ZmZmZmZTg3ZmZmZmZlTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDQ3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDQ3OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjEsIDIyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjMsIDI0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjUsIDI2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTUsIDE3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMjI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE1LCAxNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDI3LCAyOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDI2OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMICYmIGtpbmQgPiA5KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE4LCAyMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDMwOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxOCwgMjApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZWZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyOSwgMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzNDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGludCBoaUJ5dGUgPSBjdXJDaGFyID4+IDg7Ci0gICAgICAgICBpbnQgaTEgPSBoaUJ5dGUgPj4gNjsKLSAgICAgICAgIGxvbmcgbDEgPSAxTCA8PCAoaGlCeXRlICYgMDc3KTsKLSAgICAgICAgIGludCBpMiA9IChjdXJDaGFyICYgMHhmZikgPj4gNjsKLSAgICAgICAgIGxvbmcgbDIgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7Ci0gICAgICAgICBkbwotICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAgIGlmICghampDYW5Nb3ZlXzAoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNDcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNDc7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDE1LCAxNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzEoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyNywgMjgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSAmJiBraW5kID4gOSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA5OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI4OgotICAgICAgICAgICAgICAgICAgaWYgKGpqQ2FuTW92ZV8xKGhpQnl0ZSwgaTEsIGkyLCBsMSwgbDIpKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTgsIDIwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDI5LCAzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7Ci0gICAgICB9Ci0gICAgICBpZiAoa2luZCAhPSAweDdmZmZmZmZmKQotICAgICAgewotICAgICAgICAgamptYXRjaGVkS2luZCA9IGtpbmQ7Ci0gICAgICAgICBqam1hdGNoZWRQb3MgPSBjdXJQb3M7Ci0gICAgICAgICBraW5kID0gMHg3ZmZmZmZmZjsKLSAgICAgIH0KLSAgICAgICsrY3VyUG9zOwotICAgICAgaWYgKChpID0gampuZXdTdGF0ZUNudCkgPT0gKHN0YXJ0c0F0ID0gMzUgLSAoampuZXdTdGF0ZUNudCA9IHN0YXJ0c0F0KSkpCi0gICAgICAgICByZXR1cm4gY3VyUG9zOwotICAgICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsgcmV0dXJuIGN1clBvczsgfQotICAgfQotfQotc3RhdGljIGZpbmFsIGludFtdIGpqbmV4dFN0YXRlcyA9IHsKLSAgIDgsIDksIDEwLCAxNSwgMTYsIDI4LCAyOSwgMzEsIDMyLCAzMywgMjAsIDIxLCAyMywgMjQsIDI1LCAyMCwgCi0gICAyMSwgMjMsIDI4LCAyOSwgMzEsIDMsIDQsIDEzLCAxNCwgMTcsIDE4LCAyNCwgMjUsIDMyLCAzMywgCi19OwotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBqakNhbk1vdmVfMChpbnQgaGlCeXRlLCBpbnQgaTEsIGludCBpMiwgbG9uZyBsMSwgbG9uZyBsMikKLXsKLSAgIHN3aXRjaChoaUJ5dGUpCi0gICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgICByZXR1cm4gKChqamJpdFZlYzJbaTJdICYgbDIpICE9IDBMKTsKLSAgICAgIGNhc2UgNDg6Ci0gICAgICAgICByZXR1cm4gKChqamJpdFZlYzNbaTJdICYgbDIpICE9IDBMKTsKLSAgICAgIGNhc2UgNDk6Ci0gICAgICAgICByZXR1cm4gKChqamJpdFZlYzRbaTJdICYgbDIpICE9IDBMKTsKLSAgICAgIGNhc2UgNTE6Ci0gICAgICAgICByZXR1cm4gKChqamJpdFZlYzVbaTJdICYgbDIpICE9IDBMKTsKLSAgICAgIGNhc2UgNjE6Ci0gICAgICAgICByZXR1cm4gKChqamJpdFZlYzZbaTJdICYgbDIpICE9IDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgaWYgKChqamJpdFZlYzBbaTFdICYgbDEpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICB9Ci19Ci1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGpqQ2FuTW92ZV8xKGludCBoaUJ5dGUsIGludCBpMSwgaW50IGkyLCBsb25nIGwxLCBsb25nIGwyKQotewotICAgc3dpdGNoKGhpQnl0ZSkKLSAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgIHJldHVybiAoKGpqYml0VmVjOFtpMl0gJiBsMikgIT0gMEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBpZiAoKGpqYml0VmVjN1tpMV0gJiBsMSkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLX0KLQotLyoqIFRva2VuIGxpdGVyYWwgdmFsdWVzLiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBqanN0ckxpdGVyYWxJbWFnZXMgPSB7Ci0iIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIlwxNjRcMTYyXDE2NVwxNDUiLCAKLSJcMTQ2XDE0MVwxNTRcMTYzXDE0NSIsICJcMTU2XDE2NVwxNTRcMTU0IiwgIlw1NiIsICJcNzYiLCAiXDE0N1wxNjQiLCAiXDc0IiwgIlwxNTRcMTY0IiwgIlw3NVw3NSIsIAotIlwxNDVcMTYxIiwgIlw3NFw3NSIsICJcMTU0XDE0NSIsICJcNzZcNzUiLCAiXDE0N1wxNDUiLCAiXDQxXDc1IiwgIlwxNTZcMTQ1IiwgIlw1MCIsIAotIlw1MSIsICJcNTQiLCAiXDcyIiwgIlwxMzMiLCAiXDEzNSIsICJcNTMiLCAiXDU1IiwgIlw1MiIsICJcNTciLCAiXDE0NFwxNTFcMTY2IiwgCi0iXDQ1IiwgIlwxNTVcMTU3XDE0NCIsICJcMTU2XDE1N1wxNjQiLCAiXDQxIiwgIlwxNDFcMTU2XDE0NCIsICJcNDZcNDYiLCAiXDE1N1wxNjIiLCAKLSJcMTc0XDE3NCIsICJcMTQ1XDE1NVwxNjBcMTY0XDE3MSIsICJcNzciLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB9OwotCi0vKiogTGV4ZXIgc3RhdGUgbmFtZXMuICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxleFN0YXRlTmFtZXMgPSB7Ci0gICAiREVGQVVMVCIsCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvVG9rZW4gPSB7Ci0gICAweGZmZmZmZmZmZmY2MUwsIAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gamp0b1NraXAgPSB7Ci0gICAweDFlTCwgCi19OwotcHJvdGVjdGVkIFNpbXBsZUNoYXJTdHJlYW0gaW5wdXRfc3RyZWFtOwotcHJpdmF0ZSBmaW5hbCBpbnRbXSBqanJvdW5kcyA9IG5ldyBpbnRbMzVdOwotcHJpdmF0ZSBmaW5hbCBpbnRbXSBqanN0YXRlU2V0ID0gbmV3IGludFs3MF07Ci1wcm90ZWN0ZWQgY2hhciBjdXJDaGFyOwotLyoqIENvbnN0cnVjdG9yLiAqLwotcHVibGljIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyKFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtKXsKLSAgIGlmIChTaW1wbGVDaGFyU3RyZWFtLnN0YXRpY0ZsYWcpCi0gICAgICB0aHJvdyBuZXcgRXJyb3IoIkVSUk9SOiBDYW5ub3QgdXNlIGEgc3RhdGljIENoYXJTdHJlYW0gY2xhc3Mgd2l0aCBhIG5vbi1zdGF0aWMgbGV4aWNhbCBhbmFseXplci4iKTsKLSAgIGlucHV0X3N0cmVhbSA9IHN0cmVhbTsKLX0KLQotLyoqIENvbnN0cnVjdG9yLiAqLwotcHVibGljIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyKFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtLCBpbnQgbGV4U3RhdGUpewotICAgdGhpcyhzdHJlYW0pOwotICAgU3dpdGNoVG8obGV4U3RhdGUpOwotfQotCi0vKiogUmVpbml0aWFsaXNlIHBhcnNlci4gKi8KLXB1YmxpYyB2b2lkIFJlSW5pdChTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSkKLXsKLSAgIGpqbWF0Y2hlZFBvcyA9IGpqbmV3U3RhdGVDbnQgPSAwOwotICAgY3VyTGV4U3RhdGUgPSBkZWZhdWx0TGV4U3RhdGU7Ci0gICBpbnB1dF9zdHJlYW0gPSBzdHJlYW07Ci0gICBSZUluaXRSb3VuZHMoKTsKLX0KLXByaXZhdGUgdm9pZCBSZUluaXRSb3VuZHMoKQotewotICAgaW50IGk7Ci0gICBqanJvdW5kID0gMHg4MDAwMDAwMTsKLSAgIGZvciAoaSA9IDM1OyBpLS0gPiAwOykKLSAgICAgIGpqcm91bmRzW2ldID0gMHg4MDAwMDAwMDsKLX0KLQotLyoqIFJlaW5pdGlhbGlzZSBwYXJzZXIuICovCi1wdWJsaWMgdm9pZCBSZUluaXQoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0sIGludCBsZXhTdGF0ZSkKLXsKLSAgIFJlSW5pdChzdHJlYW0pOwotICAgU3dpdGNoVG8obGV4U3RhdGUpOwotfQotCi0vKiogU3dpdGNoIHRvIHNwZWNpZmllZCBsZXggc3RhdGUuICovCi1wdWJsaWMgdm9pZCBTd2l0Y2hUbyhpbnQgbGV4U3RhdGUpCi17Ci0gICBpZiAobGV4U3RhdGUgPj0gMSB8fCBsZXhTdGF0ZSA8IDApCi0gICAgICB0aHJvdyBuZXcgVG9rZW5NZ3JFcnJvcigiRXJyb3I6IElnbm9yaW5nIGludmFsaWQgbGV4aWNhbCBzdGF0ZSA6ICIgKyBsZXhTdGF0ZSArICIuIFN0YXRlIHVuY2hhbmdlZC4iLCBUb2tlbk1nckVycm9yLklOVkFMSURfTEVYSUNBTF9TVEFURSk7Ci0gICBlbHNlCi0gICAgICBjdXJMZXhTdGF0ZSA9IGxleFN0YXRlOwotfQotCi1wcm90ZWN0ZWQgVG9rZW4gampGaWxsVG9rZW4oKQotewotICAgZmluYWwgVG9rZW4gdDsKLSAgIGZpbmFsIFN0cmluZyBjdXJUb2tlbkltYWdlOwotICAgZmluYWwgaW50IGJlZ2luTGluZTsKLSAgIGZpbmFsIGludCBlbmRMaW5lOwotICAgZmluYWwgaW50IGJlZ2luQ29sdW1uOwotICAgZmluYWwgaW50IGVuZENvbHVtbjsKLSAgIFN0cmluZyBpbSA9IGpqc3RyTGl0ZXJhbEltYWdlc1tqam1hdGNoZWRLaW5kXTsKLSAgIGN1clRva2VuSW1hZ2UgPSAoaW0gPT0gbnVsbCkgPyBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKSA6IGltOwotICAgYmVnaW5MaW5lID0gaW5wdXRfc3RyZWFtLmdldEJlZ2luTGluZSgpOwotICAgYmVnaW5Db2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5Db2x1bW4oKTsKLSAgIGVuZExpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0RW5kTGluZSgpOwotICAgZW5kQ29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEVuZENvbHVtbigpOwotICAgdCA9IFRva2VuLm5ld1Rva2VuKGpqbWF0Y2hlZEtpbmQsIGN1clRva2VuSW1hZ2UpOwotCi0gICB0LmJlZ2luTGluZSA9IGJlZ2luTGluZTsKLSAgIHQuZW5kTGluZSA9IGVuZExpbmU7Ci0gICB0LmJlZ2luQ29sdW1uID0gYmVnaW5Db2x1bW47Ci0gICB0LmVuZENvbHVtbiA9IGVuZENvbHVtbjsKLQotICAgcmV0dXJuIHQ7Ci19Ci0KLWludCBjdXJMZXhTdGF0ZSA9IDA7Ci1pbnQgZGVmYXVsdExleFN0YXRlID0gMDsKLWludCBqam5ld1N0YXRlQ250OwotaW50IGpqcm91bmQ7Ci1pbnQgamptYXRjaGVkUG9zOwotaW50IGpqbWF0Y2hlZEtpbmQ7Ci0KLS8qKiBHZXQgdGhlIG5leHQgVG9rZW4uICovCi1wdWJsaWMgVG9rZW4gZ2V0TmV4dFRva2VuKCkgCi17Ci0gIFRva2VuIG1hdGNoZWRUb2tlbjsKLSAgaW50IGN1clBvcyA9IDA7Ci0KLSAgRU9GTG9vcCA6Ci0gIGZvciAoOzspCi0gIHsKLSAgIHRyeQotICAgewotICAgICAgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5CZWdpblRva2VuKCk7Ci0gICB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpCi0gICB7Ci0gICAgICBqam1hdGNoZWRLaW5kID0gMDsKLSAgICAgIG1hdGNoZWRUb2tlbiA9IGpqRmlsbFRva2VuKCk7Ci0gICAgICByZXR1cm4gbWF0Y2hlZFRva2VuOwotICAgfQotCi0gICB0cnkgeyBpbnB1dF9zdHJlYW0uYmFja3VwKDApOwotICAgICAgd2hpbGUgKGN1ckNoYXIgPD0gMzIgJiYgKDB4MTAwMDAyNjAwTCAmICgxTCA8PCBjdXJDaGFyKSkgIT0gMEwpCi0gICAgICAgICBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLkJlZ2luVG9rZW4oKTsKLSAgIH0KLSAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUxKSB7IGNvbnRpbnVlIEVPRkxvb3A7IH0KLSAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOwotICAgamptYXRjaGVkUG9zID0gMDsKLSAgIGN1clBvcyA9IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzAoKTsKLSAgIGlmIChqam1hdGNoZWRLaW5kICE9IDB4N2ZmZmZmZmYpCi0gICB7Ci0gICAgICBpZiAoamptYXRjaGVkUG9zICsgMSA8IGN1clBvcykKLSAgICAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAoY3VyUG9zIC0gamptYXRjaGVkUG9zIC0gMSk7Ci0gICAgICBpZiAoKGpqdG9Ub2tlbltqam1hdGNoZWRLaW5kID4+IDZdICYgKDFMIDw8IChqam1hdGNoZWRLaW5kICYgMDc3KSkpICE9IDBMKQotICAgICAgewotICAgICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKLSAgICAgICAgIHJldHVybiBtYXRjaGVkVG9rZW47Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBjb250aW51ZSBFT0ZMb29wOwotICAgICAgfQotICAgfQotICAgaW50IGVycm9yX2xpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0RW5kTGluZSgpOwotICAgaW50IGVycm9yX2NvbHVtbiA9IGlucHV0X3N0cmVhbS5nZXRFbmRDb2x1bW4oKTsKLSAgIFN0cmluZyBlcnJvcl9hZnRlciA9IG51bGw7Ci0gICBib29sZWFuIEVPRlNlZW4gPSBmYWxzZTsKLSAgIHRyeSB7IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOyB9Ci0gICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlMSkgewotICAgICAgRU9GU2VlbiA9IHRydWU7Ci0gICAgICBlcnJvcl9hZnRlciA9IGN1clBvcyA8PSAxID8gIiIgOiBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKTsKLSAgICAgIGlmIChjdXJDaGFyID09ICdcbicgfHwgY3VyQ2hhciA9PSAnXHInKSB7Ci0gICAgICAgICBlcnJvcl9saW5lKys7Ci0gICAgICAgICBlcnJvcl9jb2x1bW4gPSAwOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICAgZXJyb3JfY29sdW1uKys7Ci0gICB9Ci0gICBpZiAoIUVPRlNlZW4pIHsKLSAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7Ci0gICAgICBlcnJvcl9hZnRlciA9IGN1clBvcyA8PSAxID8gIiIgOiBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKTsKLSAgIH0KLSAgIHRocm93IG5ldyBUb2tlbk1nckVycm9yKEVPRlNlZW4sIGN1ckxleFN0YXRlLCBlcnJvcl9saW5lLCBlcnJvcl9jb2x1bW4sIGVycm9yX2FmdGVyLCBjdXJDaGFyLCBUb2tlbk1nckVycm9yLkxFWElDQUxfRVJST1IpOwotICB9Ci19Ci0KLXByaXZhdGUgdm9pZCBqakNoZWNrTkFkZChpbnQgc3RhdGUpCi17Ci0gICBpZiAoampyb3VuZHNbc3RhdGVdICE9IGpqcm91bmQpCi0gICB7Ci0gICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSBzdGF0ZTsKLSAgICAgIGpqcm91bmRzW3N0YXRlXSA9IGpqcm91bmQ7Ci0gICB9Ci19Ci1wcml2YXRlIHZvaWQgampBZGRTdGF0ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKQotewotICAgZG8gewotICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gampuZXh0U3RhdGVzW3N0YXJ0XTsKLSAgIH0gd2hpbGUgKHN0YXJ0KysgIT0gZW5kKTsKLX0KLXByaXZhdGUgdm9pZCBqakNoZWNrTkFkZFR3b1N0YXRlcyhpbnQgc3RhdGUxLCBpbnQgc3RhdGUyKQotewotICAgampDaGVja05BZGQoc3RhdGUxKTsKLSAgIGpqQ2hlY2tOQWRkKHN0YXRlMik7Ci19Ci0KLXByaXZhdGUgdm9pZCBqakNoZWNrTkFkZFN0YXRlcyhpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICBkbyB7Ci0gICAgICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnRdKTsKLSAgIH0gd2hpbGUgKHN0YXJ0KysgIT0gZW5kKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVHJlZUNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVHJlZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWE2ZTQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclRyZWVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKU1BFTFBhcnNlclRyZWVDb25zdGFudHMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUEVMUGFyc2VyVHJlZUNvbnN0YW50cwotewotICBwdWJsaWMgaW50IEpKVEVYUFJFU1NJT04gPSAwOwotICBwdWJsaWMgaW50IEpKVE9SRVhQUkVTU0lPTiA9IDE7Ci0gIHB1YmxpYyBpbnQgSkpUQU5ERVhQUkVTU0lPTiA9IDI7Ci0gIHB1YmxpYyBpbnQgSkpURVFVQUxJVFlFWFBSRVNTSU9OID0gMzsKLSAgcHVibGljIGludCBKSlRSRUxBVElPTkFMRVhQUkVTU0lPTiA9IDQ7Ci0gIHB1YmxpYyBpbnQgSkpUQURERVhQUkVTU0lPTiA9IDU7Ci0gIHB1YmxpYyBpbnQgSkpUTVVMVElQTFlFWFBSRVNTSU9OID0gNjsKLSAgcHVibGljIGludCBKSlRDSE9JQ0VFWFBSRVNTSU9OID0gNzsKLSAgcHVibGljIGludCBKSlRVTkFSWUVYUFJFU1NJT04gPSA4OwotICBwdWJsaWMgaW50IEpKVFZBTFVFID0gOTsKLSAgcHVibGljIGludCBKSlRWQUxVRVBSRUZJWCA9IDEwOwotICBwdWJsaWMgaW50IEpKVFZBTFVFU1VGRklYID0gMTE7Ci0gIHB1YmxpYyBpbnQgSkpURlVOQ1RJT05JTlZPQ0FUSU9OID0gMTI7Ci0gIHB1YmxpYyBpbnQgSkpUTElURVJBTCA9IDEzOwotCi0KLSAgcHVibGljIFN0cmluZ1tdIGpqdE5vZGVOYW1lID0gewotICAgICJFeHByZXNzaW9uIiwKLSAgICAiT3JFeHByZXNzaW9uIiwKLSAgICAiQW5kRXhwcmVzc2lvbiIsCi0gICAgIkVxdWFsaXR5RXhwcmVzc2lvbiIsCi0gICAgIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwKLSAgICAiQWRkRXhwcmVzc2lvbiIsCi0gICAgIk11bHRpcGx5RXhwcmVzc2lvbiIsCi0gICAgIkNob2ljZUV4cHJlc3Npb24iLAotICAgICJVbmFyeUV4cHJlc3Npb24iLAotICAgICJWYWx1ZSIsCi0gICAgIlZhbHVlUHJlZml4IiwKLSAgICAiVmFsdWVTdWZmaXgiLAotICAgICJGdW5jdGlvbkludm9jYXRpb24iLAotICAgICJMaXRlcmFsIiwKLSAgfTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjZjQ5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSlNQRUxQYXJzZXJWaXNpdG9yLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGludGVyZmFjZSBKU1BFTFBhcnNlclZpc2l0b3IKLXsKLSAgcHVibGljIE9iamVjdCB2aXNpdChTaW1wbGVOb2RlIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RPckV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFuZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVxdWFsaXR5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFkZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE11bHRpcGx5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2hvaWNlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVW5hcnlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFsdWVQcmVmaXggbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlU3VmZml4IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbkludm9jYXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExpdGVyYWwgbm9kZSwgT2JqZWN0IGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMVHJhbnNsYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjdkODYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gQnVnIDI5ODMwNCBVc2VyLWNvbmZpZ3VyYWJsZSBzZXZlcml0aWVzIGZvciBFTCBwcm9ibGVtcwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbC5FTFByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGVsLklKU1BFTFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkZpbGVCdWZmZXJNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0JCi1wdWJsaWMgY2xhc3MgSlNQRUxUcmFuc2xhdG9yIGltcGxlbWVudHMgSUpTUEVMVHJhbnNsYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUiA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCS8qKgotCSAqIEpTUCBFeHByZXNzaW9uIExhbmd1YWdlIFBhcnNlci4KLQkgKi8KLQlwcml2YXRlIEpTUEVMUGFyc2VyIGVsUGFyc2VyID0gbnVsbDsKLQkKLQlwdWJsaWMgTGlzdCB0cmFuc2xhdGVFTChTdHJpbmcgZWxUZXh0LCBTdHJpbmcgZGVsaW0sCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlLCBpbnQgY29udGVudFN0YXJ0LAotCQkJaW50IGNvbnRlbnRMZW5ndGgsIFN0cmluZ0J1ZmZlciBmVXNlckVMRXhwcmVzc2lvbnMsCi0JCQlIYXNoTWFwIGZVc2VyRUxSYW5nZXMsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCi0JCUFycmF5TGlzdCBlbFByb2JsZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCh0aGlzKSB7Ci0JCQkJaWYobnVsbCA9PSBlbFBhcnNlcikgewotCQkJCQllbFBhcnNlciA9IEpTUEVMUGFyc2VyLmNyZWF0ZVBhcnNlcihlbFRleHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVsUGFyc2VyLlJlSW5pdChlbFRleHQpOwotCQkJCX0KLQkJCQotCQkJCUFTVEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGVsUGFyc2VyLkV4cHJlc3Npb24oKTsKLQkJCQlFTEdlbmVyYXRvciBnZW4gPSBuZXcgRUxHZW5lcmF0b3IoKTsKLQkJCQlMaXN0IGdlbmVyYXRvckVMUHJvYmxlbXMgPSBnZW4uZ2VuZXJhdGUoZXhwcmVzc2lvbiwgY3VycmVudE5vZGUsIGZVc2VyRUxFeHByZXNzaW9ucywgZlVzZXJFTFJhbmdlcywgZG9jdW1lbnQsIGN1cnJlbnROb2RlLCBjb250ZW50U3RhcnQsIGNvbnRlbnRMZW5ndGgpOwotCQkJCWVsUHJvYmxlbXMuYWRkQWxsKGdlbmVyYXRvckVMUHJvYmxlbXMpOwotCQkJfQotCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmaW5hbCBpbnQgc2V2ID0gZ2V0UHJvYmxlbVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9FTF9TWU5UQVgsIGdldFNjb3BlQ29udGV4dHMoZG9jdW1lbnQpKTsKLQkJCWlmIChzZXYgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJVG9rZW4gY3VyVG9rID0gZS5jdXJyZW50VG9rZW47Ci0JCQkJaW50IHByb2JsZW1TdGFydE9mZnNldDsKLQkJCQlpbnQgcHJvYmxlbUVuZE9mZnNldDsKLQkJCQlQb3NpdGlvbiBwb3MgPSBudWxsOwotCQkJCXByb2JsZW1TdGFydE9mZnNldCA9ICBjb250ZW50U3RhcnQgKyBjdXJUb2suYmVnaW5Db2x1bW47Ci0JCQkJcHJvYmxlbUVuZE9mZnNldCA9IGNvbnRlbnRTdGFydCArIGN1clRvay5lbmRDb2x1bW47Ci0JCQkJCi0JCQkJcG9zID0gbmV3IFBvc2l0aW9uKHByb2JsZW1TdGFydE9mZnNldCwgcHJvYmxlbUVuZE9mZnNldCAtIHByb2JsZW1TdGFydE9mZnNldCArIDEpOwotCQkJCWVsUHJvYmxlbXMuYWRkKG5ldyBFTFByb2JsZW0oc2V2LCBwb3MsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRva2VuTWdyRXJyb3IgdGUpIHsKLQkJCWludCBzZXYgPSBnZXRQcm9ibGVtU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0VMX0xFWEVSLCBnZXRTY29wZUNvbnRleHRzKGRvY3VtZW50KSk7Ci0JCQlpZiAoc2V2ICE9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJCVBvc2l0aW9uIHBvcyA9IG5ldyBQb3NpdGlvbihjb250ZW50U3RhcnQsIGNvbnRlbnRMZW5ndGgpOwotCQkJCWVsUHJvYmxlbXMuYWRkKG5ldyBFTFByb2JsZW0oc2V2LCBwb3MsIEpTUENvcmVNZXNzYWdlcy5KU1BFTF9Ub2tlbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbFByb2JsZW1zOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0ga2V5IHByZWZlcmVuY2Uga2V5IHVzZWQgdG8gZ2V0IHRoZSBzZXZlcml0eSBmb3IgYSBwcm9ibGVtCi0JICogQHBhcmFtIGNvbnRleHRzIHByZWZlcmVuY2Ugc2VydmljZSBjb250ZXh0cwotCSAqIEByZXR1cm4gVGhlIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBwcmVmZXJlbmNlIGtleQotCSAqLwotCXByaXZhdGUgaW50IGdldFByb2JsZW1TZXZlcml0eShTdHJpbmcga2V5LCBJU2NvcGVDb250ZXh0W10gY29udGV4dHMpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldEludChQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSLCBrZXksIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgY29udGV4dHMpOwotCX0KLQotCXByaXZhdGUgSVNjb3BlQ29udGV4dFtdIGdldFNjb3BlQ29udGV4dHMoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlJU2NvcGVDb250ZXh0W10gc2NvcGVzID0gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQlmaW5hbCBJRmlsZSBmaWxlID0gZ2V0RmlsZShkb2N1bWVudCk7Ci0JCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQlQcm9qZWN0U2NvcGUgcHJvamVjdFNjb3BlID0gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KTsKLQkJCQlpZiAocHJvamVjdFNjb3BlLmdldE5vZGUoUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUikuZ2V0Qm9vbGVhbihKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVVNFX1BST0pFQ1RfU0VUVElOR1MsIGZhbHNlKSkgewotCQkJCQlzY29wZXMgPSBuZXcgSVNjb3BlQ29udGV4dFtde3Byb2plY3RTY29wZSwgbmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNjb3BlczsKLQl9Ci0KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlJRmlsZSBmID0gbnVsbDsKLQkJZmluYWwgSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRCdWZmZXIoZG9jdW1lbnQpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWZpbmFsIElQYXRoIHBhdGggPSBidWZmZXIuZ2V0TG9jYXRpb24oKTsKLQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCWYgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQl9Ci0JCQlpZiAoZiAhPSBudWxsICYmIGYuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlyZXR1cm4gZjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhMTg2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIE5vZGUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi0vKiBBbGwgQVNUIG5vZGVzIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiAgSXQgcHJvdmlkZXMgYmFzaWMKLSAgIG1hY2hpbmVyeSBmb3IgY29uc3RydWN0aW5nIHRoZSBwYXJlbnQgYW5kIGNoaWxkIHJlbGF0aW9uc2hpcHMKLSAgIGJldHdlZW4gbm9kZXMuICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgTm9kZSB7Ci0KLSAgLyoqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgbm9kZSBoYXMgYmVlbiBtYWRlIHRoZSBjdXJyZW50Ci0gICAgbm9kZS4gIEl0IGluZGljYXRlcyB0aGF0IGNoaWxkIG5vZGVzIGNhbiBub3cgYmUgYWRkZWQgdG8gaXQuICovCi0gIHB1YmxpYyB2b2lkIGpqdE9wZW4oKTsKLQotICAvKiogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGUgY2hpbGQgbm9kZXMgaGF2ZSBiZWVuCi0gICAgYWRkZWQuICovCi0gIHB1YmxpYyB2b2lkIGpqdENsb3NlKCk7Ci0KLSAgLyoqIFRoaXMgcGFpciBvZiBtZXRob2RzIGFyZSB1c2VkIHRvIGluZm9ybSB0aGUgbm9kZSBvZiBpdHMKLSAgICBwYXJlbnQuICovCi0gIHB1YmxpYyB2b2lkIGpqdFNldFBhcmVudChOb2RlIG4pOwotICBwdWJsaWMgTm9kZSBqanRHZXRQYXJlbnQoKTsKLQotICAvKiogVGhpcyBtZXRob2QgdGVsbHMgdGhlIG5vZGUgdG8gYWRkIGl0cyBhcmd1bWVudCB0byB0aGUgbm9kZSdzCi0gICAgbGlzdCBvZiBjaGlsZHJlbi4gICovCi0gIHB1YmxpYyB2b2lkIGpqdEFkZENoaWxkKE5vZGUgbiwgaW50IGkpOwotCi0gIC8qKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgY2hpbGQgbm9kZS4gIFRoZSBjaGlsZHJlbiBhcmUgbnVtYmVyZWQKLSAgICAgZnJvbSB6ZXJvLCBsZWZ0IHRvIHJpZ2h0LiAqLwotICBwdWJsaWMgTm9kZSBqanRHZXRDaGlsZChpbnQgaSk7Ci0KLSAgLyoqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoZSBub2RlIGhhcy4gKi8KLSAgcHVibGljIGludCBqanRHZXROdW1DaGlsZHJlbigpOwotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1BhcnNlRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvUGFyc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhYTA2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvUGFyc2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gQnVnIDMxODI4MSAtIEVMIHZhbGlkYXRpb24gZXJyb3IgZm9yIHF1b3RlIGVzY2FwaW5nCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFBhcnNlRXhjZXB0aW9uLmphdmEgVmVyc2lvbiA0LjEgKi8KLS8qIEphdmFDQ09wdGlvbnM6S0VFUF9MSU5FX0NPTD1udWxsICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi0vKioKLSAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHBhcnNlIGVycm9ycyBhcmUgZW5jb3VudGVyZWQuCi0gKiBZb3UgY2FuIGV4cGxpY2l0bHkgY3JlYXRlIG9iamVjdHMgb2YgdGhpcyBleGNlcHRpb24gdHlwZSBieQotICogY2FsbGluZyB0aGUgbWV0aG9kIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24gaW4gdGhlIGdlbmVyYXRlZAotICogcGFyc2VyLgotICoKLSAqIFlvdSBjYW4gbW9kaWZ5IHRoaXMgY2xhc3MgdG8gY3VzdG9taXplIHlvdXIgZXJyb3IgcmVwb3J0aW5nCi0gKiBtZWNoYW5pc21zIHNvIGxvbmcgYXMgeW91IHJldGFpbiB0aGUgcHVibGljIGZpZWxkcy4KLSAqLwotcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAvKioKLSAgICogVGhlIHZlcnNpb24gaWRlbnRpZmllciBmb3IgdGhpcyBTZXJpYWxpemFibGUgY2xhc3MuCi0gICAqIEluY3JlbWVudCBvbmx5IGlmIHRoZSA8aT5zZXJpYWxpemVkPC9pPiBmb3JtIG9mIHRoZQotICAgKiBjbGFzcyBjaGFuZ2VzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgbWV0aG9kICJnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uIgotICAgKiBpbiB0aGUgZ2VuZXJhdGVkIHBhcnNlci4gIENhbGxpbmcgdGhpcyBjb25zdHJ1Y3RvciBnZW5lcmF0ZXMKLSAgICogYSBuZXcgb2JqZWN0IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBmaWVsZHMgImN1cnJlbnRUb2tlbiIsCi0gICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBzZXQuCi0gICAqLwotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oVG9rZW4gY3VycmVudFRva2VuVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5JbWFnZVZhbAotICAgICAgICAgICAgICAgICAgICAgICApCi0gIHsKLSAgICBzdXBlcihpbml0aWFsaXNlKGN1cnJlbnRUb2tlblZhbCwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1ZhbCwgdG9rZW5JbWFnZVZhbCkpOwotICAgIGN1cnJlbnRUb2tlbiA9IGN1cnJlbnRUb2tlblZhbDsKLSAgICBleHBlY3RlZFRva2VuU2VxdWVuY2VzID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1ZhbDsKLSAgICB0b2tlbkltYWdlID0gdG9rZW5JbWFnZVZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgZm9sbG93aW5nIGNvbnN0cnVjdG9ycyBhcmUgZm9yIHVzZSBieSB5b3UgZm9yIHdoYXRldmVyCi0gICAqIHB1cnBvc2UgeW91IGNhbiB0aGluayBvZi4gIENvbnN0cnVjdGluZyB0aGUgZXhjZXB0aW9uIGluIHRoaXMKLSAgICogbWFubmVyIG1ha2VzIHRoZSBleGNlcHRpb24gYmVoYXZlIGluIHRoZSBub3JtYWwgd2F5IC0gaS5lLiwgYXMKLSAgICogZG9jdW1lbnRlZCBpbiB0aGUgY2xhc3MgIlRocm93YWJsZSIuICBUaGUgZmllbGRzICJlcnJvclRva2VuIiwKLSAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIGRvIG5vdCBjb250YWluCi0gICAqIHJlbGV2YW50IGluZm9ybWF0aW9uLiAgVGhlIEphdmFDQyBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCB1c2UKLSAgICogdGhlc2UgY29uc3RydWN0b3JzLgotICAgKi8KLQotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oKSB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKiBDb25zdHJ1Y3RvciB3aXRoIG1lc3NhZ2UuICovCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgIHN1cGVyKG1lc3NhZ2UpOwotICB9Ci0KLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgbGFzdCB0b2tlbiB0aGF0IGhhcyBiZWVuIGNvbnN1bWVkIHN1Y2Nlc3NmdWxseS4gIElmCi0gICAqIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQgZHVlIHRvIGEgcGFyc2UgZXJyb3IsIHRoZSB0b2tlbgotICAgKiBmb2xsb3duZyB0aGlzIHRva2VuIHdpbGwgKHRoZXJlZm9yZSkgYmUgdGhlIGZpcnN0IGVycm9yIHRva2VuLgotICAgKi8KLSAgcHVibGljIFRva2VuIGN1cnJlbnRUb2tlbjsKLQotICAvKioKLSAgICogRWFjaCBlbnRyeSBpbiB0aGlzIGFycmF5IGlzIGFuIGFycmF5IG9mIGludGVnZXJzLiAgRWFjaCBhcnJheQotICAgKiBvZiBpbnRlZ2VycyByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIChieSB0aGVpciBvcmRpbmFsCi0gICAqIHZhbHVlcykgdGhhdCBpcyBleHBlY3RlZCBhdCB0aGlzIHBvaW50IG9mIHRoZSBwYXJzZS4KLSAgICovCi0gIHB1YmxpYyBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXM7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhlICJ0b2tlbkltYWdlIiBhcnJheSBvZiB0aGUgZ2VuZXJhdGVkCi0gICAqIHBhcnNlciB3aXRoaW4gd2hpY2ggdGhlIHBhcnNlIGVycm9yIG9jY3VycmVkLiAgVGhpcyBhcnJheSBpcwotICAgKiBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgLi4uQ29uc3RhbnRzIGludGVyZmFjZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSB0b2tlbkltYWdlOwotCi0gIC8qKgotICAgKiBJdCB1c2VzICJjdXJyZW50VG9rZW4iIGFuZCAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIgdG8gZ2VuZXJhdGUgYSBwYXJzZQotICAgKiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm5zIGl0LiAgSWYgdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZAotICAgKiBkdWUgdG8gYSBwYXJzZSBlcnJvciwgYW5kIHlvdSBkbyBub3QgY2F0Y2ggaXQgKGl0IGdldHMgdGhyb3duCi0gICAqIGZyb20gdGhlIHBhcnNlcikgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZQotICAgKiBnZXRzIGRpc3BsYXllZC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBpbml0aWFsaXNlKFRva2VuIGN1cnJlbnRUb2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdW10gZXhwZWN0ZWRUb2tlblNlcXVlbmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHRva2VuSW1hZ2UpIHsKLSAgICBTdHJpbmcgZW9sID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwotICAgIFN0cmluZ0J1ZmZlciBleHBlY3RlZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBpbnQgbWF4U2l6ZSA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZiAobWF4U2l6ZSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoKSB7Ci0gICAgICAgIG1heFNpemUgPSBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7IGorKykgewotICAgICAgICBleHBlY3RlZC5hcHBlbmQodG9rZW5JbWFnZVtleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2pdXSkuYXBwZW5kKCcgJyk7Ci0gICAgICB9Ci0gICAgICBpZiAoZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXVtleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aCAtIDFdICE9IDApIHsKLSAgICAgICAgZXhwZWN0ZWQuYXBwZW5kKCIuLi4iKTsKLSAgICAgIH0KLSAgICAgIGV4cGVjdGVkLmFwcGVuZChlb2wpLmFwcGVuZCgiICAgICIpOwotICAgIH0KLSAgICBTdHJpbmcgcmV0dmFsID0gIkVuY291bnRlcmVkIFwiIjsKLSAgICBUb2tlbiB0b2sgPSBjdXJyZW50VG9rZW4ubmV4dDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heFNpemU7IGkrKykgewotICAgICAgaWYgKGkgIT0gMCkgcmV0dmFsICs9ICIgIjsKLSAgICAgIGlmICh0b2sua2luZCA9PSAwKSB7Ci0gICAgICAgIHJldHZhbCArPSB0b2tlbkltYWdlWzBdOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHJldHZhbCArPSAiICIgKyB0b2tlbkltYWdlW3Rvay5raW5kXTsKLSAgICAgIHJldHZhbCArPSAiIFwiIjsKLSAgICAgIHJldHZhbCArPSBhZGRfZXNjYXBlcyh0b2suaW1hZ2UpOwotICAgICAgcmV0dmFsICs9ICIgXCIiOwotICAgICAgdG9rID0gdG9rLm5leHQ7Ci0gICAgfQotICAgIHJldHZhbCArPSAiXCIgYXQgbGluZSAiICsgY3VycmVudFRva2VuLm5leHQuYmVnaW5MaW5lICsgIiwgY29sdW1uICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkNvbHVtbjsKLSAgICByZXR2YWwgKz0gIi4iICsgZW9sOwotICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmc6IiArIGVvbCArICIgICAgIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dmFsICs9ICJXYXMgZXhwZWN0aW5nIG9uZSBvZjoiICsgZW9sICsgIiAgICAiOwotICAgIH0KLSAgICByZXR2YWwgKz0gZXhwZWN0ZWQudG9TdHJpbmcoKTsKLSAgICByZXR1cm4gcmV0dmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBlbmQgb2YgbGluZSBzdHJpbmcgZm9yIHRoaXMgbWFjaGluZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZW9sID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwotCi0gIC8qKgotICAgKiBVc2VkIHRvIGNvbnZlcnQgcmF3IGNoYXJhY3RlcnMgdG8gdGhlaXIgZXNjYXBlZCB2ZXJzaW9uCi0gICAqIHdoZW4gdGhlc2UgcmF3IHZlcnNpb24gY2Fubm90IGJlIHVzZWQgYXMgcGFydCBvZiBhbiBBU0NJSQotICAgKiBzdHJpbmcgbGl0ZXJhbC4KLSAgICovCi0gIHN0YXRpYyBTdHJpbmcgYWRkX2VzY2FwZXMoU3RyaW5nIHN0cikgewotICAgICAgU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGNoYXIgY2g7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKLSAgICAgICAgewotICAgICAgICAgICBjYXNlIDAgOgotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXGInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXGYnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGYiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcJyIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwIHx8IGNoID4gMHg3ZSkgewotICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICIwMDAwIiArIEludGVnZXIudG9TdHJpbmcoY2gsIDE2KTsKLSAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7Ci0gICB9Ci0KLX0KLS8qIEphdmFDQyAtIE9yaWdpbmFsQ2hlY2tzdW09MjQ1MGVhOTZlNzFjMDQ4YzFiZTAwZDZhYTE3YzdiNTIgKGRvIG5vdCBlZGl0IHRoaXMgbGluZSkgKi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9TaW1wbGVDaGFyU3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvU2ltcGxlQ2hhclN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTdjNTA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9TaW1wbGVDaGFyU3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEJ1ZyAzMTgyODEgLSBFTCB2YWxpZGF0aW9uIGVycm9yIGZvciBxdW90ZSBlc2NhcGluZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBTaW1wbGVDaGFyU3RyZWFtLmphdmEgVmVyc2lvbiA0LjEgKi8KLS8qIEphdmFDQ09wdGlvbnM6U1RBVElDPWZhbHNlLFNVUFBPUlRfQ0xBU1NfVklTSUJJTElUWV9QVUJMSUM9dHJ1ZSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgQ2hhclN0cmVhbSwgd2hlcmUgdGhlIHN0cmVhbSBpcyBhc3N1bWVkIHRvCi0gKiBjb250YWluIG9ubHkgQVNDSUkgY2hhcmFjdGVycyAod2l0aG91dCB1bmljb2RlIHByb2Nlc3NpbmcpLgotICovCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVDaGFyU3RyZWFtCi17Ci0vKiogV2hldGhlciBwYXJzZXIgaXMgc3RhdGljLiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gc3RhdGljRmxhZyA9IGZhbHNlOwotICBpbnQgYnVmc2l6ZTsKLSAgaW50IGF2YWlsYWJsZTsKLSAgaW50IHRva2VuQmVnaW47Ci0vKiogUG9zaXRpb24gaW4gYnVmZmVyLiAqLwotICBwdWJsaWMgaW50IGJ1ZnBvcyA9IC0xOwotICBwcm90ZWN0ZWQgaW50IGJ1ZmxpbmVbXTsKLSAgcHJvdGVjdGVkIGludCBidWZjb2x1bW5bXTsKLQotICBwcm90ZWN0ZWQgaW50IGNvbHVtbiA9IDA7Ci0gIHByb3RlY3RlZCBpbnQgbGluZSA9IDE7Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJldkNoYXJJc0NSID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIHByZXZDaGFySXNMRiA9IGZhbHNlOwotCi0gIHByb3RlY3RlZCBqYXZhLmlvLlJlYWRlciBpbnB1dFN0cmVhbTsKLQotICBwcm90ZWN0ZWQgY2hhcltdIGJ1ZmZlcjsKLSAgcHJvdGVjdGVkIGludCBtYXhOZXh0Q2hhckluZCA9IDA7Ci0gIHByb3RlY3RlZCBpbnQgaW5CdWYgPSAwOwotICBwcm90ZWN0ZWQgaW50IHRhYlNpemUgPSA4OwotCi0gIHByb3RlY3RlZCB2b2lkIHNldFRhYlNpemUoaW50IGkpIHsgdGFiU2l6ZSA9IGk7IH0KLSAgcHJvdGVjdGVkIGludCBnZXRUYWJTaXplKGludCBpKSB7IHJldHVybiB0YWJTaXplOyB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCBFeHBhbmRCdWZmKGJvb2xlYW4gd3JhcEFyb3VuZCkKLSAgewotICAgIGNoYXJbXSBuZXdidWZmZXIgPSBuZXcgY2hhcltidWZzaXplICsgMjA0OF07Ci0gICAgaW50IG5ld2J1ZmxpbmVbXSA9IG5ldyBpbnRbYnVmc2l6ZSArIDIwNDhdOwotICAgIGludCBuZXdidWZjb2x1bW5bXSA9IG5ldyBpbnRbYnVmc2l6ZSArIDIwNDhdOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHdyYXBBcm91bmQpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCB0b2tlbkJlZ2luLCBuZXdidWZmZXIsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIG5ld2J1ZmZlciwgYnVmc2l6ZSAtIHRva2VuQmVnaW4sIGJ1ZnBvcyk7Ci0gICAgICAgIGJ1ZmZlciA9IG5ld2J1ZmZlcjsKLQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIHRva2VuQmVnaW4sIG5ld2J1ZmxpbmUsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCAwLCBuZXdidWZsaW5lLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKLSAgICAgICAgYnVmbGluZSA9IG5ld2J1ZmxpbmU7Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIHRva2VuQmVnaW4sIG5ld2J1ZmNvbHVtbiwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgMCwgbmV3YnVmY29sdW1uLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKLSAgICAgICAgYnVmY29sdW1uID0gbmV3YnVmY29sdW1uOwotCi0gICAgICAgIG1heE5leHRDaGFySW5kID0gKGJ1ZnBvcyArPSAoYnVmc2l6ZSAtIHRva2VuQmVnaW4pKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICBidWZmZXIgPSBuZXdidWZmZXI7Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCB0b2tlbkJlZ2luLCBuZXdidWZsaW5lLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgIGJ1ZmxpbmUgPSBuZXdidWZsaW5lOwotCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCB0b2tlbkJlZ2luLCBuZXdidWZjb2x1bW4sIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgYnVmY29sdW1uID0gbmV3YnVmY29sdW1uOwotCi0gICAgICAgIG1heE5leHRDaGFySW5kID0gKGJ1ZnBvcyAtPSB0b2tlbkJlZ2luKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIHRocm93IG5ldyBFcnJvcih0LmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotCi0KLSAgICBidWZzaXplICs9IDIwNDg7Ci0gICAgYXZhaWxhYmxlID0gYnVmc2l6ZTsKLSAgICB0b2tlbkJlZ2luID0gMDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIEZpbGxCdWZmKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChtYXhOZXh0Q2hhckluZCA9PSBhdmFpbGFibGUpCi0gICAgewotICAgICAgaWYgKGF2YWlsYWJsZSA9PSBidWZzaXplKQotICAgICAgewotICAgICAgICBpZiAodG9rZW5CZWdpbiA+IDIwNDgpCi0gICAgICAgIHsKLSAgICAgICAgICBidWZwb3MgPSBtYXhOZXh0Q2hhckluZCA9IDA7Ci0gICAgICAgICAgYXZhaWxhYmxlID0gdG9rZW5CZWdpbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0b2tlbkJlZ2luIDwgMCkKLSAgICAgICAgICBidWZwb3MgPSBtYXhOZXh0Q2hhckluZCA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBFeHBhbmRCdWZmKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF2YWlsYWJsZSA+IHRva2VuQmVnaW4pCi0gICAgICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemU7Ci0gICAgICBlbHNlIGlmICgodG9rZW5CZWdpbiAtIGF2YWlsYWJsZSkgPCAyMDQ4KQotICAgICAgICBFeHBhbmRCdWZmKHRydWUpOwotICAgICAgZWxzZQotICAgICAgICBhdmFpbGFibGUgPSB0b2tlbkJlZ2luOwotICAgIH0KLQotICAgIGludCBpOwotICAgIHRyeSB7Ci0gICAgICBpZiAoKGkgPSBpbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlciwgbWF4TmV4dENoYXJJbmQsIGF2YWlsYWJsZSAtIG1heE5leHRDaGFySW5kKSkgPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIG1heE5leHRDaGFySW5kICs9IGk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgLS1idWZwb3M7Ci0gICAgICBiYWNrdXAoMCk7Ci0gICAgICBpZiAodG9rZW5CZWdpbiA9PSAtMSkKLSAgICAgICAgdG9rZW5CZWdpbiA9IGJ1ZnBvczsKLSAgICAgIHRocm93IGU7Ci0gICAgfQotICB9Ci0KLS8qKiBTdGFydC4gKi8KLSAgcHVibGljIGNoYXIgQmVnaW5Ub2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gIHsKLSAgICB0b2tlbkJlZ2luID0gLTE7Ci0gICAgY2hhciBjID0gcmVhZENoYXIoKTsKLSAgICB0b2tlbkJlZ2luID0gYnVmcG9zOwotCi0gICAgcmV0dXJuIGM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBVcGRhdGVMaW5lQ29sdW1uKGNoYXIgYykKLSAgewotICAgIGNvbHVtbisrOwotCi0gICAgaWYgKHByZXZDaGFySXNMRikKLSAgICB7Ci0gICAgICBwcmV2Q2hhcklzTEYgPSBmYWxzZTsKLSAgICAgIGxpbmUgKz0gKGNvbHVtbiA9IDEpOwotICAgIH0KLSAgICBlbHNlIGlmIChwcmV2Q2hhcklzQ1IpCi0gICAgewotICAgICAgcHJldkNoYXJJc0NSID0gZmFsc2U7Ci0gICAgICBpZiAoYyA9PSAnXG4nKQotICAgICAgewotICAgICAgICBwcmV2Q2hhcklzTEYgPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBsaW5lICs9IChjb2x1bW4gPSAxKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGMpCi0gICAgewotICAgICAgY2FzZSAnXHInIDoKLSAgICAgICAgcHJldkNoYXJJc0NSID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdcbicgOgotICAgICAgICBwcmV2Q2hhcklzTEYgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ1x0JyA6Ci0gICAgICAgIGNvbHVtbi0tOwotICAgICAgICBjb2x1bW4gKz0gKHRhYlNpemUgLSAoY29sdW1uICUgdGFiU2l6ZSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBidWZsaW5lW2J1ZnBvc10gPSBsaW5lOwotICAgIGJ1ZmNvbHVtbltidWZwb3NdID0gY29sdW1uOwotICB9Ci0KLS8qKiBSZWFkIGEgY2hhcmFjdGVyLiAqLwotICBwdWJsaWMgY2hhciByZWFkQ2hhcigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoaW5CdWYgPiAwKQotICAgIHsKLSAgICAgIC0taW5CdWY7Ci0KLSAgICAgIGlmICgrK2J1ZnBvcyA9PSBidWZzaXplKQotICAgICAgICBidWZwb3MgPSAwOwotCi0gICAgICByZXR1cm4gYnVmZmVyW2J1ZnBvc107Ci0gICAgfQotCi0gICAgaWYgKCsrYnVmcG9zID49IG1heE5leHRDaGFySW5kKQotICAgICAgRmlsbEJ1ZmYoKTsKLQotICAgIGNoYXIgYyA9IGJ1ZmZlcltidWZwb3NdOwotCi0gICAgVXBkYXRlTGluZUNvbHVtbihjKTsKLSAgICByZXR1cm4gYzsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKiBAc2VlICNnZXRFbmRDb2x1bW4KLSAgICovCi0KLSAgcHVibGljIGludCBnZXRDb2x1bW4oKSB7Ci0gICAgcmV0dXJuIGJ1ZmNvbHVtbltidWZwb3NdOwotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqIEBzZWUgI2dldEVuZExpbmUKLSAgICovCi0KLSAgcHVibGljIGludCBnZXRMaW5lKCkgewotICAgIHJldHVybiBidWZsaW5lW2J1ZnBvc107Ci0gIH0KLQotICAvKiogR2V0IHRva2VuIGVuZCBjb2x1bW4gbnVtYmVyLiAqLwotICBwdWJsaWMgaW50IGdldEVuZENvbHVtbigpIHsKLSAgICByZXR1cm4gYnVmY29sdW1uW2J1ZnBvc107Ci0gIH0KLQotICAvKiogR2V0IHRva2VuIGVuZCBsaW5lIG51bWJlci4gKi8KLSAgcHVibGljIGludCBnZXRFbmRMaW5lKCkgewotICAgICByZXR1cm4gYnVmbGluZVtidWZwb3NdOwotICB9Ci0KLSAgLyoqIEdldCB0b2tlbiBiZWdpbm5pbmcgY29sdW1uIG51bWJlci4gKi8KLSAgcHVibGljIGludCBnZXRCZWdpbkNvbHVtbigpIHsKLSAgICByZXR1cm4gYnVmY29sdW1uW3Rva2VuQmVnaW5dOwotICB9Ci0KLSAgLyoqIEdldCB0b2tlbiBiZWdpbm5pbmcgbGluZSBudW1iZXIuICovCi0gIHB1YmxpYyBpbnQgZ2V0QmVnaW5MaW5lKCkgewotICAgIHJldHVybiBidWZsaW5lW3Rva2VuQmVnaW5dOwotICB9Ci0KLS8qKiBCYWNrdXAgYSBudW1iZXIgb2YgY2hhcmFjdGVycy4gKi8KLSAgcHVibGljIHZvaWQgYmFja3VwKGludCBhbW91bnQpIHsKLQotICAgIGluQnVmICs9IGFtb3VudDsKLSAgICBpZiAoKGJ1ZnBvcyAtPSBhbW91bnQpIDwgMCkKLSAgICAgIGJ1ZnBvcyArPSBidWZzaXplOwotICB9Ci0KLSAgLyoqIENvbnN0cnVjdG9yLiAqLwotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgaW5wdXRTdHJlYW0gPSBkc3RyZWFtOwotICAgIGxpbmUgPSBzdGFydGxpbmU7Ci0gICAgY29sdW1uID0gc3RhcnRjb2x1bW4gLSAxOwotCi0gICAgYXZhaWxhYmxlID0gYnVmc2l6ZSA9IGJ1ZmZlcnNpemU7Ci0gICAgYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyc2l6ZV07Ci0gICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gICAgYnVmY29sdW1uID0gbmV3IGludFtidWZmZXJzaXplXTsKLSAgfQotCi0gIC8qKiBDb25zdHJ1Y3Rvci4gKi8KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQotICB7Ci0gICAgdGhpcyhkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIC8qKiBDb25zdHJ1Y3Rvci4gKi8KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKLSAgewotICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLQotICAvKiogUmVpbml0aWFsaXNlLiAqLwotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgIGlucHV0U3RyZWFtID0gZHN0cmVhbTsKLSAgICBsaW5lID0gc3RhcnRsaW5lOwotICAgIGNvbHVtbiA9IHN0YXJ0Y29sdW1uIC0gMTsKLQotICAgIGlmIChidWZmZXIgPT0gbnVsbCB8fCBidWZmZXJzaXplICE9IGJ1ZmZlci5sZW5ndGgpCi0gICAgewotICAgICAgYXZhaWxhYmxlID0gYnVmc2l6ZSA9IGJ1ZmZlcnNpemU7Ci0gICAgICBidWZmZXIgPSBuZXcgY2hhcltidWZmZXJzaXplXTsKLSAgICAgIGJ1ZmxpbmUgPSBuZXcgaW50W2J1ZmZlcnNpemVdOwotICAgICAgYnVmY29sdW1uID0gbmV3IGludFtidWZmZXJzaXplXTsKLSAgICB9Ci0gICAgcHJldkNoYXJJc0xGID0gcHJldkNoYXJJc0NSID0gZmFsc2U7Ci0gICAgdG9rZW5CZWdpbiA9IGluQnVmID0gbWF4TmV4dENoYXJJbmQgPSAwOwotICAgIGJ1ZnBvcyA9IC0xOwotICB9Ci0KLSAgLyoqIFJlaW5pdGlhbGlzZS4gKi8KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICBSZUluaXQoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICAvKiogUmVpbml0aWFsaXNlLiAqLwotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKLSAgewotICAgIFJlSW5pdChkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotICAvKiogQ29uc3RydWN0b3IuICovCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLCBpbnQgc3RhcnRsaW5lLAotICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gIHsKLSAgICB0aGlzKGVuY29kaW5nID09IG51bGwgPyBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSA6IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0sIGVuY29kaW5nKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgYnVmZmVyc2l6ZSk7Ci0gIH0KLQotICAvKiogQ29uc3RydWN0b3IuICovCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIGJ1ZmZlcnNpemUpOwotICB9Ci0KLSAgLyoqIENvbnN0cnVjdG9yLiAqLwotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZywgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gIHsKLSAgICB0aGlzKGRzdHJlYW0sIGVuY29kaW5nLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIC8qKiBDb25zdHJ1Y3Rvci4gKi8KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICB0aGlzKGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgLyoqIENvbnN0cnVjdG9yLiAqLwotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICB7Ci0gICAgdGhpcyhkc3RyZWFtLCBlbmNvZGluZywgMSwgMSwgNDA5Nik7Ci0gIH0KLQotICAvKiogQ29uc3RydWN0b3IuICovCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSkKLSAgewotICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLQotICAvKiogUmVpbml0aWFsaXNlLiAqLwotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcsIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgewotICAgIFJlSW5pdChlbmNvZGluZyA9PSBudWxsID8gbmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSkgOiBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtLCBlbmNvZGluZyksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIGJ1ZmZlcnNpemUpOwotICB9Ci0KLSAgLyoqIFJlaW5pdGlhbGlzZS4gKi8KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgIFJlSW5pdChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgYnVmZmVyc2l6ZSk7Ci0gIH0KLQotICAvKiogUmVpbml0aWFsaXNlLiAqLwotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgewotICAgIFJlSW5pdChkc3RyZWFtLCBlbmNvZGluZywgMSwgMSwgNDA5Nik7Ci0gIH0KLQotICAvKiogUmVpbml0aWFsaXNlLiAqLwotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtKQotICB7Ci0gICAgUmVJbml0KGRzdHJlYW0sIDEsIDEsIDQwOTYpOwotICB9Ci0gIC8qKiBSZWluaXRpYWxpc2UuICovCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZywgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICB7Ci0gICAgUmVJbml0KGRzdHJlYW0sIGVuY29kaW5nLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotICAvKiogUmVpbml0aWFsaXNlLiAqLwotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQotICB7Ci0gICAgUmVJbml0KGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0gIC8qKiBHZXQgdG9rZW4gbGl0ZXJhbCB2YWx1ZS4gKi8KLSAgcHVibGljIFN0cmluZyBHZXRJbWFnZSgpCi0gIHsKLSAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCi0gICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnBvcyAtIHRva2VuQmVnaW4gKyAxKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhidWZmZXIsIDAsIGJ1ZnBvcyArIDEpOwotICB9Ci0KLSAgLyoqIEdldCB0aGUgc3VmZml4LiAqLwotICBwdWJsaWMgY2hhcltdIEdldFN1ZmZpeChpbnQgbGVuKQotICB7Ci0gICAgY2hhcltdIHJldCA9IG5ldyBjaGFyW2xlbl07Ci0KLSAgICBpZiAoKGJ1ZnBvcyArIDEpID49IGxlbikKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZwb3MgLSBsZW4gKyAxLCByZXQsIDAsIGxlbik7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZzaXplIC0gKGxlbiAtIGJ1ZnBvcyAtIDEpLCByZXQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtIGJ1ZnBvcyAtIDEpOwotICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIHJldCwgbGVuIC0gYnVmcG9zIC0gMSwgYnVmcG9zICsgMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIC8qKiBSZXNldCBidWZmZXIgd2hlbiBmaW5pc2hlZC4gKi8KLSAgcHVibGljIHZvaWQgRG9uZSgpCi0gIHsKLSAgICBidWZmZXIgPSBudWxsOwotICAgIGJ1ZmxpbmUgPSBudWxsOwotICAgIGJ1ZmNvbHVtbiA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHRvIGFkanVzdCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBmb3IgdGhlIHN0YXJ0IG9mIGEgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGp1c3RCZWdpbkxpbmVDb2x1bW4oaW50IG5ld0xpbmUsIGludCBuZXdDb2wpCi0gIHsKLSAgICBpbnQgc3RhcnQgPSB0b2tlbkJlZ2luOwotICAgIGludCBsZW47Ci0KLSAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCi0gICAgewotICAgICAgbGVuID0gYnVmcG9zIC0gdG9rZW5CZWdpbiArIGluQnVmICsgMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxlbiA9IGJ1ZnNpemUgLSB0b2tlbkJlZ2luICsgYnVmcG9zICsgMSArIGluQnVmOwotICAgIH0KLQotICAgIGludCBpID0gMCwgaiA9IDAsIGsgPSAwOwotICAgIGludCBuZXh0Q29sRGlmZiA9IDAsIGNvbHVtbkRpZmYgPSAwOwotCi0gICAgd2hpbGUgKGkgPCBsZW4gJiYgYnVmbGluZVtqID0gc3RhcnQgJSBidWZzaXplXSA9PSBidWZsaW5lW2sgPSArK3N0YXJ0ICUgYnVmc2l6ZV0pCi0gICAgewotICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmU7Ci0gICAgICBuZXh0Q29sRGlmZiA9IGNvbHVtbkRpZmYgKyBidWZjb2x1bW5ba10gLSBidWZjb2x1bW5bal07Ci0gICAgICBidWZjb2x1bW5bal0gPSBuZXdDb2wgKyBjb2x1bW5EaWZmOwotICAgICAgY29sdW1uRGlmZiA9IG5leHRDb2xEaWZmOwotICAgICAgaSsrOwotICAgIH0KLQotICAgIGlmIChpIDwgbGVuKQotICAgIHsKLSAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lKys7Ci0gICAgICBidWZjb2x1bW5bal0gPSBuZXdDb2wgKyBjb2x1bW5EaWZmOwotCi0gICAgICB3aGlsZSAoaSsrIDwgbGVuKQotICAgICAgewotICAgICAgICBpZiAoYnVmbGluZVtqID0gc3RhcnQgJSBidWZzaXplXSAhPSBidWZsaW5lWysrc3RhcnQgJSBidWZzaXplXSkKLSAgICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZSsrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgbGluZSA9IGJ1ZmxpbmVbal07Ci0gICAgY29sdW1uID0gYnVmY29sdW1uW2pdOwotICB9Ci0KLX0KLS8qIEphdmFDQyAtIE9yaWdpbmFsQ2hlY2tzdW09ZjMxOWNkNjI4NTVmNGIyOWQ1YzRlOTU1MGM4ODUyZWIgKGRvIG5vdCBlZGl0IHRoaXMgbGluZSkgKi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9TaW1wbGVOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvU2ltcGxlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWM0NzNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9TaW1wbGVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFNpbXBsZU5vZGUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlTm9kZSBpbXBsZW1lbnRzIE5vZGUgewotICBwcm90ZWN0ZWQgTm9kZSBwYXJlbnQ7Ci0gIHByb3RlY3RlZCBOb2RlW10gY2hpbGRyZW47Ci0gIHByb3RlY3RlZCBpbnQgaWQ7Ci0gIHByb3RlY3RlZCBKU1BFTFBhcnNlciBwYXJzZXI7Ci0gIHByb3RlY3RlZCBUb2tlbiBmaXJzdFRva2VuOwotICBwcm90ZWN0ZWQgVG9rZW4gbGFzdFRva2VuOwotCi0gIHB1YmxpYyBTaW1wbGVOb2RlKGludCBpKSB7Ci0gICAgaWQgPSBpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZU5vZGUoSlNQRUxQYXJzZXIgcCwgaW50IGkpIHsKLSAgICB0aGlzKGkpOwotICAgIHBhcnNlciA9IHA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBqanRPcGVuKCkgewotICB9Ci0KLSAgcHVibGljIHZvaWQgamp0Q2xvc2UoKSB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGpqdFNldFBhcmVudChOb2RlIG4pIHsgcGFyZW50ID0gbjsgfQotICBwdWJsaWMgTm9kZSBqanRHZXRQYXJlbnQoKSB7IHJldHVybiBwYXJlbnQ7IH0KLQotICBwdWJsaWMgdm9pZCBqanRBZGRDaGlsZChOb2RlIG4sIGludCBpKSB7Ci0gICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLSAgICAgIGNoaWxkcmVuID0gbmV3IE5vZGVbaSArIDFdOwotICAgIH0gZWxzZSBpZiAoaSA+PSBjaGlsZHJlbi5sZW5ndGgpIHsKLSAgICAgIE5vZGUgY1tdID0gbmV3IE5vZGVbaSArIDFdOwotICAgICAgU3lzdGVtLmFycmF5Y29weShjaGlsZHJlbiwgMCwgYywgMCwgY2hpbGRyZW4ubGVuZ3RoKTsKLSAgICAgIGNoaWxkcmVuID0gYzsKLSAgICB9Ci0gICAgY2hpbGRyZW5baV0gPSBuOwotICB9Ci0KLSAgcHVibGljIE5vZGUgamp0R2V0Q2hpbGQoaW50IGkpIHsKLSAgICByZXR1cm4gY2hpbGRyZW5baV07Ci0gIH0KLQotICBwdWJsaWMgaW50IGpqdEdldE51bUNoaWxkcmVuKCkgewotICAgIHJldHVybiAoY2hpbGRyZW4gPT0gbnVsbCkgPyAwIDogY2hpbGRyZW4ubGVuZ3RoOwotICB9Ci0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3QgY2hpbGRyZW5BY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgY2hpbGRyZW5baV0uamp0QWNjZXB0KHZpc2l0b3IsIGRhdGEpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIC8qIFlvdSBjYW4gb3ZlcnJpZGUgdGhlc2UgdHdvIG1ldGhvZHMgaW4gc3ViY2xhc3NlcyBvZiBTaW1wbGVOb2RlIHRvCi0gICAgIGN1c3RvbWl6ZSB0aGUgd2F5IHRoZSBub2RlIGFwcGVhcnMgd2hlbiB0aGUgdHJlZSBpcyBkdW1wZWQuICBJZgotICAgICB5b3VyIG91dHB1dCB1c2VzIG1vcmUgdGhhbiBvbmUgbGluZSB5b3Ugc2hvdWxkIG92ZXJyaWRlCi0gICAgIHRvU3RyaW5nKFN0cmluZyksIG90aGVyd2lzZSBvdmVycmlkaW5nIHRvU3RyaW5nKCkgaXMgcHJvYmFibHkgYWxsCi0gICAgIHlvdSBuZWVkIHRvIGRvLiAqLwotCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiBKU1BFTFBhcnNlclRyZWVDb25zdGFudHMuamp0Tm9kZU5hbWVbaWRdOyB9Ci0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIHByZWZpeCkgeyByZXR1cm4gcHJlZml4ICsgdG9TdHJpbmcoKTsgfQotCi0gIC8qIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSBob3cgdGhlIG5vZGUgZHVtcHMKLSAgICAgb3V0IGl0cyBjaGlsZHJlbi4gKi8KLQotICBwdWJsaWMgdm9pZCBkdW1wKFN0cmluZyBwcmVmaXgpIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4odG9TdHJpbmcocHJlZml4KSk7Ci0gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQlTaW1wbGVOb2RlIG4gPSAoU2ltcGxlTm9kZSljaGlsZHJlbltpXTsKLQlpZiAobiAhPSBudWxsKSB7Ci0JICBuLmR1bXAocHJlZml4ICsgIiAiKTsKLQl9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFRva2VuIGdldEZpcnN0VG9rZW4oKSB7Ci0gICAgcmV0dXJuIGZpcnN0VG9rZW47Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGaXJzdFRva2VuKFRva2VuIGZpcnN0VG9rZW4pIHsKLSAgICB0aGlzLmZpcnN0VG9rZW4gPSBmaXJzdFRva2VuOwotICB9Ci0KLSAgcHVibGljIFRva2VuIGdldExhc3RUb2tlbigpIHsKLSAgICByZXR1cm4gbGFzdFRva2VuOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TGFzdFRva2VuKFRva2VuIGxhc3RUb2tlbikgewotICAgIHRoaXMubGFzdFRva2VuID0gbGFzdFRva2VuOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9Ub2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1Rva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYWQ5NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1Rva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEJ1ZyAzMTgyODEgLSBFTCB2YWxpZGF0aW9uIGVycm9yIGZvciBxdW90ZSBlc2NhcGluZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbi5qYXZhIFZlcnNpb24gNC4xICovCi0vKiBKYXZhQ0NPcHRpb25zOlRPS0VOX0VYVEVORFM9LEtFRVBfTElORV9DT0w9bnVsbCxTVVBQT1JUX0NMQVNTX1ZJU0lCSUxJVFlfUFVCTElDPXRydWUgKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBpbnB1dCB0b2tlbiBzdHJlYW0uCi0gKi8KLQotcHVibGljIGNsYXNzIFRva2VuIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCi0gIC8qKgotICAgKiBUaGUgdmVyc2lvbiBpZGVudGlmaWVyIGZvciB0aGlzIFNlcmlhbGl6YWJsZSBjbGFzcy4KLSAgICogSW5jcmVtZW50IG9ubHkgaWYgdGhlIDxpPnNlcmlhbGl6ZWQ8L2k+IGZvcm0gb2YgdGhlCi0gICAqIGNsYXNzIGNoYW5nZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLSAgICogQW4gaW50ZWdlciB0aGF0IGRlc2NyaWJlcyB0aGUga2luZCBvZiB0aGlzIHRva2VuLiAgVGhpcyBudW1iZXJpbmcKLSAgICogc3lzdGVtIGlzIGRldGVybWluZWQgYnkgSmF2YUNDUGFyc2VyLCBhbmQgYSB0YWJsZSBvZiB0aGVzZSBudW1iZXJzIGlzCi0gICAqIHN0b3JlZCBpbiB0aGUgZmlsZSAuLi5Db25zdGFudHMuamF2YS4KLSAgICovCi0gIHB1YmxpYyBpbnQga2luZDsKLQotICAvKiogVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhpcyBUb2tlbi4gKi8KLSAgcHVibGljIGludCBiZWdpbkxpbmU7Ci0gIC8qKiBUaGUgY29sdW1uIG51bWJlciBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoaXMgVG9rZW4uICovCi0gIHB1YmxpYyBpbnQgYmVnaW5Db2x1bW47Ci0gIC8qKiBUaGUgbGluZSBudW1iZXIgb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoaXMgVG9rZW4uICovCi0gIHB1YmxpYyBpbnQgZW5kTGluZTsKLSAgLyoqIFRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGlzIFRva2VuLiAqLwotICBwdWJsaWMgaW50IGVuZENvbHVtbjsKLQotICAvKioKLSAgICogVGhlIHN0cmluZyBpbWFnZSBvZiB0aGUgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGltYWdlOwotCi0gIC8qKgotICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbmV4dCByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4gZnJvbSB0aGUgaW5wdXQKLSAgICogc3RyZWFtLiAgSWYgdGhpcyBpcyB0aGUgbGFzdCB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIG9yIGlmIHRoZQotICAgKiB0b2tlbiBtYW5hZ2VyIGhhcyBub3QgcmVhZCB0b2tlbnMgYmV5b25kIHRoaXMgb25lLCB0aGlzIGZpZWxkIGlzCi0gICAqIHNldCB0byBudWxsLiAgVGhpcyBpcyB0cnVlIG9ubHkgaWYgdGhpcyB0b2tlbiBpcyBhbHNvIGEgcmVndWxhcgotICAgKiB0b2tlbi4gIE90aGVyd2lzZSwgc2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZgotICAgKiB0aGlzIGZpZWxkLgotICAgKi8KLSAgcHVibGljIFRva2VuIG5leHQ7Ci0KLSAgLyoqCi0gICAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBhY2Nlc3Mgc3BlY2lhbCB0b2tlbnMgdGhhdCBvY2N1ciBwcmlvciB0byB0aGlzCi0gICAqIHRva2VuLCBidXQgYWZ0ZXIgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4uCi0gICAqIElmIHRoZXJlIGFyZSBubyBzdWNoIHNwZWNpYWwgdG9rZW5zLCB0aGlzIGZpZWxkIGlzIHNldCB0byBudWxsLgotICAgKiBXaGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHN1Y2ggc3BlY2lhbCB0b2tlbiwgdGhpcyBmaWVsZCByZWZlcnMKLSAgICogdG8gdGhlIGxhc3Qgb2YgdGhlc2Ugc3BlY2lhbCB0b2tlbnMsIHdoaWNoIGluIHR1cm4gcmVmZXJzIHRvIHRoZSBuZXh0Ci0gICAqIHByZXZpb3VzIHNwZWNpYWwgdG9rZW4gdGhyb3VnaCBpdHMgc3BlY2lhbFRva2VuIGZpZWxkLCBhbmQgc28gb24KLSAgICogdW50aWwgdGhlIGZpcnN0IHNwZWNpYWwgdG9rZW4gKHdob3NlIHNwZWNpYWxUb2tlbiBmaWVsZCBpcyBudWxsKS4KLSAgICogVGhlIG5leHQgZmllbGRzIG9mIHNwZWNpYWwgdG9rZW5zIHJlZmVyIHRvIG90aGVyIHNwZWNpYWwgdG9rZW5zIHRoYXQKLSAgICogaW1tZWRpYXRlbHkgZm9sbG93IGl0ICh3aXRob3V0IGFuIGludGVydmVuaW5nIHJlZ3VsYXIgdG9rZW4pLiAgSWYgdGhlcmUKLSAgICogaXMgbm8gc3VjaCB0b2tlbiwgdGhpcyBmaWVsZCBpcyBudWxsLgotICAgKi8KLSAgcHVibGljIFRva2VuIHNwZWNpYWxUb2tlbjsKLQotICAvKioKLSAgICogQW4gb3B0aW9uYWwgYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBUb2tlbi4KLSAgICogVG9rZW5zIHdoaWNoIGFyZSBub3QgdXNlZCBhcyBzeW50YWN0aWMgc3VnYXIgd2lsbCBvZnRlbiBjb250YWluCi0gICAqIG1lYW5pbmdmdWwgdmFsdWVzIHRoYXQgd2lsbCBiZSB1c2VkIGxhdGVyIG9uIGJ5IHRoZSBjb21waWxlciBvcgotICAgKiBpbnRlcnByZXRlci4gVGhpcyBhdHRyaWJ1dGUgdmFsdWUgaXMgb2Z0ZW4gZGlmZmVyZW50IGZyb20gdGhlIGltYWdlLgotICAgKiBBbnkgc3ViY2xhc3Mgb2YgVG9rZW4gdGhhdCBhY3R1YWxseSB3YW50cyB0byByZXR1cm4gYSBub24tbnVsbCB2YWx1ZSBjYW4KLSAgICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgYXBwcm9wcmlhdGUuCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIE5vLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgVG9rZW4oKSB7fQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHRva2VuIGZvciB0aGUgc3BlY2lmaWVkIEltYWdlLgotICAgKi8KLSAgcHVibGljIFRva2VuKGludCBraW5kKQotICB7Ci0gICAgdGhpcyhraW5kLCBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHRva2VuIGZvciB0aGUgc3BlY2lmaWVkIEltYWdlIGFuZCBLaW5kLgotICAgKi8KLSAgcHVibGljIFRva2VuKGludCBraW5kLCBTdHJpbmcgaW1hZ2UpCi0gIHsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbWFnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIGltYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgVG9rZW4gb2JqZWN0LCBieSBkZWZhdWx0LiBIb3dldmVyLCBpZiB5b3Ugd2FudCwgeW91Ci0gICAqIGNhbiBjcmVhdGUgYW5kIHJldHVybiBzdWJjbGFzcyBvYmplY3RzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBvZktpbmQuCi0gICAqIFNpbXBseSBhZGQgdGhlIGNhc2VzIHRvIHRoZSBzd2l0Y2ggZm9yIGFsbCB0aG9zZSBzcGVjaWFsIGNhc2VzLgotICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBzdWJjbGFzcyBvZiBUb2tlbiBjYWxsZWQgSURUb2tlbiB0aGF0Ci0gICAqIHlvdSB3YW50IHRvIGNyZWF0ZSBpZiBvZktpbmQgaXMgSUQsIHNpbXBseSBhZGQgc29tZXRoaW5nIGxpa2UgOgotICAgKgotICAgKiAgICBjYXNlIE15UGFyc2VyQ29uc3RhbnRzLklEIDogcmV0dXJuIG5ldyBJRFRva2VuKG9mS2luZCwgaW1hZ2UpOwotICAgKgotICAgKiB0byB0aGUgZm9sbG93aW5nIHN3aXRjaCBzdGF0ZW1lbnQuIFRoZW4geW91IGNhbiBjYXN0IG1hdGNoZWRUb2tlbgotICAgKiB2YXJpYWJsZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBhbmQgdXNlIHNpdCBpbiB5b3VyIGxleGljYWwgYWN0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVG9rZW4gbmV3VG9rZW4oaW50IG9mS2luZCwgU3RyaW5nIGltYWdlKQotICB7Ci0gICAgc3dpdGNoKG9mS2luZCkKLSAgICB7Ci0gICAgICBkZWZhdWx0IDogcmV0dXJuIG5ldyBUb2tlbihvZktpbmQsIGltYWdlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRva2VuIG5ld1Rva2VuKGludCBvZktpbmQpCi0gIHsKLSAgICByZXR1cm4gbmV3VG9rZW4ob2ZLaW5kLCBudWxsKTsKLSAgfQotCi19Ci0vKiBKYXZhQ0MgLSBPcmlnaW5hbENoZWNrc3VtPTY4ODY4NmEyMTgxZTAxMDQ0NWVhOTllNTAxZTljZDA3IChkbyBub3QgZWRpdCB0aGlzIGxpbmUpICovCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvVG9rZW5NZ3JFcnJvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1Rva2VuTWdyRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1M2RjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvVG9rZW5NZ3JFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbk1nckVycm9yLmphdmEgVmVyc2lvbiAzLjAgKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBUb2tlbk1nckVycm9yIGV4dGVuZHMgRXJyb3IKLXsKLSAgIC8qCi0gICAgKiBPcmRpbmFscyBmb3IgdmFyaW91cyByZWFzb25zIHdoeSBhbiBFcnJvciBvZiB0aGlzIHR5cGUgY2FuIGJlIHRocm93bi4KLSAgICAqLwotCi0gICAvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLS8qKgotICAgICogTGV4aWNhbCBlcnJvciBvY2N1cmVkLgotICAgICovCi0gICBzdGF0aWMgZmluYWwgaW50IExFWElDQUxfRVJST1IgPSAwOwotCi0gICAvKioKLSAgICAqIEFuIGF0dGVtcHQgd2FzcyBtYWRlIHRvIGNyZWF0ZSBhIHNlY29uZCBpbnN0YW5jZSBvZiBhIHN0YXRpYyB0b2tlbiBtYW5hZ2VyLgotICAgICovCi0gICBzdGF0aWMgZmluYWwgaW50IFNUQVRJQ19MRVhFUl9FUlJPUiA9IDE7Ci0KLSAgIC8qKgotICAgICogVHJpZWQgdG8gY2hhbmdlIHRvIGFuIGludmFsaWQgbGV4aWNhbCBzdGF0ZS4KLSAgICAqLwotICAgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0xFWElDQUxfU1RBVEUgPSAyOwotCi0gICAvKioKLSAgICAqIERldGVjdGVkIChhbmQgYmFpbGVkIG91dCBvZikgYW4gaW5maW5pdGUgbG9vcCBpbiB0aGUgdG9rZW4gbWFuYWdlci4KLSAgICAqLwotICAgc3RhdGljIGZpbmFsIGludCBMT09QX0RFVEVDVEVEID0gMzsKLQotICAgLyoqCi0gICAgKiBJbmRpY2F0ZXMgdGhlIHJlYXNvbiB3aHkgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uIEl0IHdpbGwgaGF2ZQotICAgICogb25lIG9mIHRoZSBhYm92ZSA0IHZhbHVlcy4KLSAgICAqLwotICAgaW50IGVycm9yQ29kZTsKLQotICAgLyoqCi0gICAgKiBSZXBsYWNlcyB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIGJ5IHRoZWlyIGVzcGFjZWQgKG9yIHVuaWNvZGUgZXNjYXBlZCkKLSAgICAqIGVxdWl2YWxlbnRzIGluIHRoZSBnaXZlbiBzdHJpbmcKLSAgICAqLwotICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWRkRXNjYXBlcyhTdHJpbmcgc3RyKSB7Ci0gICAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgY2hhciBjaDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQotICAgICAgICB7Ci0gICAgICAgICAgIGNhc2UgMCA6Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcYic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcZic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1wiJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXCcnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGlmICgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjAgfHwgY2ggPiAweDdlKSB7Ci0gICAgICAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOwotICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBSZXR1cm5zIGEgZGV0YWlsZWQgbWVzc2FnZSBmb3IgdGhlIEVycm9yIHdoZW4gaXQgaXMgdGhyb3duIGJ5IHRoZQotICAgICogdG9rZW4gbWFuYWdlciB0byBpbmRpY2F0ZSBhIGxleGljYWwgZXJyb3IuCi0gICAgKiBQYXJhbWV0ZXJzIDogCi0gICAgKiAgICBFT0ZTZWVuICAgICA6IGluZGljYXRlcyBpZiBFT0YgY2F1c2VkIHRoZSBsZXhpY2wgZXJyb3IKLSAgICAqICAgIGN1ckxleFN0YXRlIDogbGV4aWNhbCBzdGF0ZSBpbiB3aGljaCB0aGlzIGVycm9yIG9jY3VyZWQKLSAgICAqICAgIGVycm9yTGluZSAgIDogbGluZSBudW1iZXIgd2hlbiB0aGUgZXJyb3Igb2NjdXJlZAotICAgICogICAgZXJyb3JDb2x1bW4gOiBjb2x1bW4gbnVtYmVyIHdoZW4gdGhlIGVycm9yIG9jY3VyZWQKLSAgICAqICAgIGVycm9yQWZ0ZXIgIDogcHJlZml4IHRoYXQgd2FzIHNlZW4gYmVmb3JlIHRoaXMgZXJyb3Igb2NjdXJlZAotICAgICogICAgY3VyY2hhciAgICAgOiB0aGUgb2ZmZW5kaW5nIGNoYXJhY3RlcgotICAgICogTm90ZTogWW91IGNhbiBjdXN0b21pemUgdGhlIGxleGljYWwgZXJyb3IgbWVzc2FnZSBieSBtb2RpZnlpbmcgdGhpcyBtZXRob2QuCi0gICAgKi8KLSAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIExleGljYWxFcnJvcihib29sZWFuIEVPRlNlZW4sIGludCBsZXhTdGF0ZSwgaW50IGVycm9yTGluZSwgaW50IGVycm9yQ29sdW1uLCBTdHJpbmcgZXJyb3JBZnRlciwgY2hhciBjdXJDaGFyKSB7Ci0gICAgICByZXR1cm4oIkxleGljYWwgZXJyb3IgYXQgbGluZSAiICsKLSAgICAgICAgICAgZXJyb3JMaW5lICsgIiwgY29sdW1uICIgKwotICAgICAgICAgICBlcnJvckNvbHVtbiArICIuICBFbmNvdW50ZXJlZDogIiArCi0gICAgICAgICAgIChFT0ZTZWVuID8gIjxFT0Y+ICIgOiAoIlwiIiArIGFkZEVzY2FwZXMoU3RyaW5nLnZhbHVlT2YoY3VyQ2hhcikpICsgIlwiIikgKyAiICgiICsgKGludCljdXJDaGFyICsgIiksICIpICsKLSAgICAgICAgICAgImFmdGVyIDogXCIiICsgYWRkRXNjYXBlcyhlcnJvckFmdGVyKSArICJcIiIpOwotICAgfQotCi0gICAvKioKLSAgICAqIFlvdSBjYW4gYWxzbyBtb2RpZnkgdGhlIGJvZHkgb2YgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHlvdXIgZXJyb3IgbWVzc2FnZXMuCi0gICAgKiBGb3IgZXhhbXBsZSwgY2FzZXMgbGlrZSBMT09QX0RFVEVDVEVEIGFuZCBJTlZBTElEX0xFWElDQUxfU1RBVEUgYXJlIG5vdAotICAgICogb2YgZW5kLXVzZXJzIGNvbmNlcm4sIHNvIHlvdSBjYW4gcmV0dXJuIHNvbWV0aGluZyBsaWtlIDogCi0gICAgKgotICAgICogICAgICJJbnRlcm5hbCBFcnJvciA6IFBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCAuLi4uICIKLSAgICAqCi0gICAgKiBmcm9tIHRoaXMgbWV0aG9kIGZvciBzdWNoIGNhc2VzIGluIHRoZSByZWxlYXNlIHZlcnNpb24gb2YgeW91ciBwYXJzZXIuCi0gICAgKi8KLSAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7Ci0gICB9Ci0KLSAgIC8qCi0gICAgKiBDb25zdHJ1Y3RvcnMgb2YgdmFyaW91cyBmbGF2b3JzIGZvbGxvdy4KLSAgICAqLwotCi0gICBwdWJsaWMgVG9rZW5NZ3JFcnJvcigpIHsKLSAgIH0KLQotICAgcHVibGljIFRva2VuTWdyRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIGludCByZWFzb24pIHsKLSAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgICAgZXJyb3JDb2RlID0gcmVhc29uOwotICAgfQotCi0gICBwdWJsaWMgVG9rZW5NZ3JFcnJvcihib29sZWFuIEVPRlNlZW4sIGludCBsZXhTdGF0ZSwgaW50IGVycm9yTGluZSwgaW50IGVycm9yQ29sdW1uLCBTdHJpbmcgZXJyb3JBZnRlciwgY2hhciBjdXJDaGFyLCBpbnQgcmVhc29uKSB7Ci0gICAgICB0aGlzKExleGljYWxFcnJvcihFT0ZTZWVuLCBsZXhTdGF0ZSwgZXJyb3JMaW5lLCBlcnJvckNvbHVtbiwgZXJyb3JBZnRlciwgY3VyQ2hhciksIHJlYXNvbik7Ci0gICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZml4cGFyc2VyLnNlZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9maXhwYXJzZXIuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWE1ZTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9maXhwYXJzZXIuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyEvdXNyL2Jpbi9zZWQNCi0NCi0jDQotIyBUaGUgU1NFIGdlbmVyYWxseSB1c2VzIGNvbXBpbGVyIHNldHRpbmcgdG8gdHVybiAgbW9zdCB3YXJuaW5ncyBpbnRvIGVycm9ycy4gIA0KLSMgVGhpcyBpcyBhIGxpdHRsZSBwcm9ibGVtYXRpYyBmb3IgSmF2YUNDIGdlbmVyYXRlZCBmaWxlcy4gIFdlIGRvbid0IHdhbnQgDQotIyB0byBkaXN0cmlidXRlIGEgY3VzdG9taXplZCB2ZXJzaW9uIG9mIEphdmFDQyBub3IgaXMgdGhlcmUgYW55ICJ0ZW1wbGF0ZSIgDQotIyBtZWNoYW5pc20uICBTbywgdGhpcyBzaW1wbGUgc2VkIHNjcmlwdCBnb2VzIHRocm91Z2ggdGhlIGdlbmVyYXRlZCB0b2tlbg0KLSMgbWFuYWdlciBhbmQgZml4ZXMgYSBmZXcgdGhpbmdzLiAgSWYgSmF2YUNDIGNoYW5nZXMgdGhlIGdlbmVyYXRlZCBjb2RlLCANCi0jIGl0J3MgbGlrZWx5IHRoYXQgdGhpcyBzY3JpcHQgd2lsbCBubyBsb25nZXIgZG8gdGhlIHJpZ2h0IHRoaW5nLiAgRGl0dG8gd2l0aA0KLSMgYW55IHZlcnNpb24gb2YgSmF2YUNDIGJlc2lkZXMgMy4yLiBBbHNvLCB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgDQotIyBzY3JpcHQgd2lsbCBldmVuIHdvcmsgd2l0aCBhbiBhcmJpdHJhcnkgSmF2YUNDIGdyYW1tYXIuICBJdCdzIG9ubHkgYmVlbiB0ZXN0ZWQNCi0jIHdpdGggdGhlIGN1cnJlbnQgSlNQIEVMIGdyYW1tYXIuDQotIw0KLSMgQXV0aG9yOiBUZWQgQS4gQ2Fycm9sbCAodGNhcnJvbGxAYmVhLmNvbSkNCi0jDQotDQotcy9zdGF0aWMgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMb29rYWhlYWRTdWNjZXNzIGV4dGVuZHMgamF2YS5sYW5nLkVycm9yIHsgfS9zdGF0aWMgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMb29rYWhlYWRTdWNjZXNzIGV4dGVuZHMgamF2YS5sYW5nLkVycm9yIHsgXG4gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7IFxuICB9L2cNCi0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZml4dG0uc2VkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2ZpeHRtLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxZGVhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZml4dG0uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyEvdXNyL2Jpbi9zZWQNCi0NCi0jDQotIyBUaGUgU1NFIGdlbmVyYWxseSB1c2VzIGNvbXBpbGVyIHNldHRpbmcgdG8gdHVybiAgbW9zdCB3YXJuaW5ncyBpbnRvIGVycm9ycy4gIA0KLSMgVGhpcyBpcyBhIGxpdHRsZSBwcm9ibGVtYXRpYyBmb3IgSmF2YUNDIGdlbmVyYXRlZCBmaWxlcy4gIFdlIGRvbid0IHdhbnQgDQotIyB0byBkaXN0cmlidXRlIGEgY3VzdG9taXplZCB2ZXJzaW9uIG9mIEphdmFDQyBub3IgaXMgdGhlcmUgYW55ICJ0ZW1wbGF0ZSIgDQotIyBtZWNoYW5pc20uICBTbywgdGhpcyBzaW1wbGUgc2VkIHNjcmlwdCBnb2VzIHRocm91Z2ggdGhlIGdlbmVyYXRlZCB0b2tlbg0KLSMgbWFuYWdlciBhbmQgZml4ZXMgYSBmZXcgdGhpbmdzLiAgSWYgSmF2YUNDIGNoYW5nZXMgdGhlIGdlbmVyYXRlZCBjb2RlLCANCi0jIGl0J3MgbGlrZWx5IHRoYXQgdGhpcyBzY3JpcHQgd2lsbCBubyBsb25nZXIgZG8gdGhlIHJpZ2h0IHRoaW5nLiAgRGl0dG8gd2l0aA0KLSMgYW55IHZlcnNpb24gb2YgSmF2YUNDIGJlc2lkZXMgMy4yLiBBbHNvLCB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgDQotIyBzY3JpcHQgd2lsbCBldmVuIHdvcmsgd2l0aCBhbiBhcmJpdHJhcnkgSmF2YUNDIGdyYW1tYXIuICBJdCdzIG9ubHkgYmVlbiB0ZXN0ZWQNCi0jIHdpdGggdGhlIGN1cnJlbnQgSlNQIEVMIGdyYW1tYXIuDQotIw0KLSMgQXV0aG9yOiBUZWQgQS4gQ2Fycm9sbCAodGNhcnJvbGxAYmVhLmNvbSkNCi0jDQotDQotcy8oaW50KShjdXJDaGFyID4+IDgpL2N1ckNoYXIgPj4gOC9nDQotDQotL15wdWJsaWMgVG9rZW4gZ2V0TmV4dFRva2VuKCkvLCAvRU9GTG9vcC97DQotCS9pbnQga2luZDsvIHtkfQ0KLQkvVG9rZW4gc3BlY2lhbFRva2VuID0gbnVsbDsve2R9DQotfQ0KLQ0KLS9ecHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlTmZhXzAoaW50IHN0YXJ0U3RhdGUsIGludCBjdXJQb3MpLywgL2Zvcig7Oykvew0KLQlzL2ludCBqLCBraW5kID0gMHg3ZmZmZmZmZjsvaW50IGtpbmQgPSAweDdmZmZmZmZmOy9nDQotCS9pbnRcW1xdIG5leHRTdGF0ZXM7L3tkfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZ28uc2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZ28uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZDVhYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2dvLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jIS91c3IvYmluL3NoDQotDQotIyBTZXQgSkFWQUNDX0hPTUUgdG8gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgamF2YWNjIDMuMg0KLSRKQVZBQ0NfSE9NRS9iaW4vamp0cmVlLmJhdCBKU1BFTC5qanQNCi0kSkFWQUNDX0hPTUUvYmluL2phdmFjYy5iYXQgSlNQRUwuamoNCi1zZWQgLWYgZml4dG0uc2VkIC1pLmJhayBKU1BFTFBhcnNlclRva2VuTWFuYWdlci5qYXZhDQotZGlmZiAtdyBKU1BFTFBhcnNlclRva2VuTWFuYWdlci5qYXZhIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEuYmFrDQotc2VkIC1mIGZpeHBhcnNlci5zZWQgLWkuYmFrIEpTUEVMUGFyc2VyLmphdmENCi1kaWZmIC13IEpTUEVMUGFyc2VyLmphdmEgSlNQRUxQYXJzZXIuamF2YS5iYWsNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0luZGV4V29ya3NwYWNlSm9iLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0luZGV4V29ya3NwYWNlSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YTQzZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9JbmRleFdvcmtzcGFjZUpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotCi0vKioKLSAqIFJlLWluZGV4ZXMgdGhlIGVudGlyZSB3b3Jrc3BhY2UuCi0gKiBFbnN1cmVzIHRoZSBKU1AgSW5kZXggaXMgaW4gYSBzdGFibGUgc3RhdGUgYmVmb3JlIHBlcmZvcm1pbmcgYSBzZWFyY2guCi0gKiAobGlrZSBhZnRlciBhIGNyYXNoIG9yIGlmIHByZXZpb3VzIGluZGV4aW5nIHdhcyBjYW5jZWxlZCkKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEluZGV4V29ya3NwYWNlSm9iIGV4dGVuZHMgSm9iIHsKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWU9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwaW5kZXhtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUc9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFZpc2l0b3IgdGhhdCByZXRyaWV2ZXMganNwIHByb2plY3QgcGF0aHMgZm9yIGFsbCBqc3AgZmlsZXMgaW4gdGhlIHdvcmtzcGFjZSwKLQkgKiBhbmQgYWRkcyB0aGUgZmlsZXMgdG8gYmUgaW5kZXhlZCBhcyB0aGV5IGFyZSBlbmNvdW50ZXJlZAotCSAqLwotCXByaXZhdGUgY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCSAgICBwcml2YXRlIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7IAotCQkKLQkJLy8gbW9uaXRvciBmcm9tIHRoZSBKb2IKLQkJSVByb2dyZXNzTW9uaXRvciBmSW5uZXJNb25pdG9yID0gbnVsbDsKLQkJcHVibGljIEpTUEZpbGVWaXNpdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJdGhpcy5mSW5uZXJNb25pdG9yID0gbW9uaXRvcjsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQotCQkJLy8gY2hlY2sgam9iIGNhbmNlbGVkCi0JCQlpZiAodGhpcy5mSW5uZXJNb25pdG9yICE9IG51bGwgJiYgdGhpcy5mSW5uZXJNb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCS8vIGNoZWNrIHNlYXJjaCBzdXBwb3J0IGNhbmNlbGVkCi0JCQlpZihKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQotCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNTUzCi0JCQkJLy8gY2hlY2sgdGhpcyBiZWZvcmUgZGVzY3JpcHRpb24KLQkJCQkvLyBjaGVjayBuYW1lIGJlZm9yZSBhY3R1YWxseSBnZXR0aW5nIHRoZSBmaWxlIChsZXNzIHdvcmspCi0JCQkJaWYoZ2V0SnNwQ29udGVudFR5cGUoKS5pc0Fzc29jaWF0ZWRXaXRoKHByb3h5LmdldE5hbWUoKSkpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCWlmKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQotCQkJCQkJaWYoREVCVUcpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoKykgSW5kZXhXb3Jrc3BhY2VKb2IgYWRkaW5nIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIHRoaXMgY2FsbCB3aWxsIGNoZWNrIHRoZSBDb250ZW50VHlwZURlc2NyaXB0aW9uLCBzbyBkb24ndCBuZWVkIHRvIGRvIGl0IGhlcmUuCi0JCQkJCQkvL0pTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5hZGRKc3BGaWxlKGZpbGUpOwotCQkJCQkJdGhpcy5maWxlcy5hZGQoZmlsZSk7Ci0JCQkJCQl0aGlzLmZJbm5lck1vbml0b3Iuc3ViVGFzayhwcm94eS5nZXROYW1lKCkpOwotCQkJCQkJCi0JCQkJCQkvLyBkb24ndCBzZWFyY2ggZGVlcGVyIGZvciBmaWxlcwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBmaW5hbCBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkgICAgcmV0dXJuIChJRmlsZVtdKXRoaXMuZmlsZXMudG9BcnJheShuZXcgSUZpbGVbdGhpcy5maWxlcy5zaXplKCldKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGVKU1AgPSBudWxsOwotCQotCXB1YmxpYyBJbmRleFdvcmtzcGFjZUpvYigpIHsKLQkJLy8gcGFfVE9ETyBtYXkgd2FudCB0byBzYXkgc29tZXRoaW5nIGxpa2UgIlJlYnVpbGRpbmcgSlNQIEluZGV4IiB0byBiZSBtb3JlCi0JCS8vIGRlc2NyaXB0aXZlIGluc3RlYWQgb2YgIlVwZGF0aW5nIEpTUCBJbmRleCIgc2luY2UgdGhleSBhcmUgMiBkaWZmZXJlbnQgdGhpbmdzCi0JCXN1cGVyKEpTUENvcmVNZXNzYWdlcy5KU1BJbmRleE1hbmFnZXJfMCk7Ci0JCXNldFByaW9yaXR5KEpvYi5MT05HKTsKLQkJc2V0U3lzdGVtKHRydWUpOwotCX0KLQotCUlDb250ZW50VHlwZSBnZXRKc3BDb250ZW50VHlwZSgpIHsKLQkJaWYodGhpcy5mQ29udGVudFR5cGVKU1AgPT0gbnVsbCkKLQkJCXRoaXMuZkNvbnRlbnRUeXBlSlNQID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCXJldHVybiB0aGlzLmZDb250ZW50VHlwZUpTUDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcgZWNsaXBzZS5jb3JlLmludGVybmFsLmpvYnMuSW50ZXJuYWxKb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKSAKLQkgKiBmb3Igc2ltaWxhciBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0UHJpb3JpdHkoVGhyZWFkLk1JTl9QUklPUklUWSk7Ci0JCQotCQlpZihtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQl9Ci0JCQotCQlpZihERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIF4gSW5kZXhXb3Jrc3BhY2VKb2Igc3RhcnRlZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCi0JCXRyeSB7Ci0JCSAgICBKU1BGaWxlVmlzaXRvciB2aXNpdG9yID0gbmV3IEpTUEZpbGVWaXNpdG9yKG1vbml0b3IpOwotCQkgICAgLy8gY29sbGVjdCBhbGwganNwIGZpbGVzCi0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJLy8gcmVxdWVzdCBpbmRleGluZwotCQkJLy8gdGhpcyBpcyBwcmV0dHkgbXVjaCBsaWtlIGZha2luZyBhbiBlbnRpcmUgd29ya3NwYWNlIHJlc291cmNlIGRlbHRhCi0JCQlKU1BJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pbmRleEZpbGVzKHZpc2l0b3IuZ2V0RmlsZXMoKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaWYoREVCVUcpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCWxvbmcgZmluaXNoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWlmKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgXiBJbmRleFdvcmtzcGFjZUpvYiBmaW5pc2hlZFxuICAgdG90YWwgdGltZSBydW5uaW5nOiAiICsgKGZpbmlzaCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXZvaWQgc2V0Q2FuY2VsZWRTdGF0ZSgpIHsKLQkJSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0SW5kZXhTdGF0ZShKU1BJbmRleE1hbmFnZXIuU19DQU5DRUxFRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BJbmRleE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQSW5kZXhNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZThkNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BJbmRleE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LkluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbmRleE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBSZXNwb25zaWJsZSBmb3Iga2VlcGluZyB0aGUgSlNQIGluZGV4IHVwIHRvIGRhdGUuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BJbmRleE1hbmFnZXIgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCS8vIFRPRE8gbW92ZSB0aGlzIHRvIExvZ2dlciwgYXMgd2UgaGF2ZSBpbiBTU0UKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcGluZGV4bWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtFWV9JTkRFWF9TVEFURSA9ICJqc3BJbmRleFN0YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbmRleFdvcmtzcGFjZUpvYiBpbmRleGluZ0pvYiA9IG5ldyBJbmRleFdvcmtzcGFjZUpvYigpOwotCi0KLQotCS8vIFRPRE86IGNvbnNpZGVyIGVudW1lcmF0aW9uIGZvciB0aGVzZSBpbnQgY29uc3RhbnRzCi0JLy8gc2V0IHRvIFNfVVBEQVRJTkcgb25jZSBhIHJlc291cmNlIGNoYW5nZSBjb21lcyBpbgotCS8vIHNldCB0byBTX1NUQUJMRSBpZjoKLQkvLyAtIHdlIGtub3cgd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGhlIHJlc291cmNlIGNoYW5nZQotCS8vIC0gb3IgdGhlIFByb2Nlc3NGaWxlc0pvYiBjb21wbGV0ZXMKLQkvLyBzZXQgdG8gU19DQU5DRUxFRCBpZiBhbiBpbmRleGluZyBqb2IgaXMgY2FuY2VsZWQKLQkvLyBzZXQgdG8gU19SRUJVSUxESU5HIGlmIHJlLWluZGV4aW5nIHRoZSBlbnRpcmUgd29ya3NwYWNlCi0KLQkvLyB0aGUgaW50ICcwJyBpcyByZXNlcnZlZCBmb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgYSBwcmVmZXJlbmNlIGlzIG5vdAotCS8vIHRoZXJlCi0JLyoqIGluZGV4IGlzIHJlbGlhYmxlIHRvIHVzZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfU1RBQkxFID0gMTsKLQkvKiogaW5kZXggaXMgYmVpbmcgdXBkYXRlZCAoZnJvbSBhIHJlc291cmNlIGRlbHRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfVVBEQVRJTkcgPSAyOwotCS8qKiBlbnRpcmUgaW5kZXggaXMgYmVpbmcgcmVidWlsdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfUkVCVUlMRElORyA9IDM7Ci0JLyoqCi0JICogaW5kZXhpbmcgam9iIHdhcyBjYW5jZWxlZCBpbiB0aGUgbWlkZGxlIG9mIGl0LCBpbmRleCBuZWVkcyB0byBiZQotCSAqIHJlYnVpbHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0NBTkNFTEVEID0gNDsKLQotCS8qKiBzeW1ib2xpYyBuYW1lIGZvciBPU0dJIGZyYW1ld29yayAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9TR0lfRlJBTUVXT1JLX0lEID0gIm9yZy5lY2xpcHNlLm9zZ2kiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb2xsZWN0cyBKU1AgZmlsZXMgZnJvbSBhIHJlc291cmNlIGRlbHRhLgotCSAqLwotCXByaXZhdGUgY2xhc3MgSlNQUmVzb3VyY2VWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJLy8gdXNpbmcgaGFzaCBtYXAgZW5zdXJlcyBvbmx5IG9uZSBvZiBlYWNoIGZpbGUKLQkJLy8gbXVzdCBiZSByZXNldCBiZWZvcmUgZXZlcnkgdXNlCi0JCXByaXZhdGUgSGFzaE1hcCBqc3BGaWxlcyA9IG51bGw7Ci0KLQkJcHVibGljIEpTUFJlc291cmNlVmlzaXRvcigpIHsKLQkJCXRoaXMuanNwRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJLy8gaW4gY2FzZSBKU1Agc2VhcmNoIHdhcyBjYW5jZWxlZCAoZWcuIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yKQotCQkJaWYgKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkgfHwgZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKCFpc0hpZGRlblJlc291cmNlKGRlbHRhLmdldEZ1bGxQYXRoKCkpKSB7Ci0KLQkJCQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQkJCWJvb2xlYW4gYWRkZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkFEREVEKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRDsKLQkJCQkJYm9vbGVhbiBpc0ludGVyZXN0aW5nQ2hhbmdlID0gZmFsc2U7Ci0JCQkJCWlmICgoa2luZCAmIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLQkJCQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCQkJCQkvLyBpZ25vcmUgdGhpbmdzIGxpa2UgbWFya2VyIGNoYW5nZXMKLQkJCQkJCWlzSW50ZXJlc3RpbmdDaGFuZ2UgPSAoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA9PSBJUmVzb3VyY2VEZWx0YS5DT05URU5UIHx8IChmbGFncyAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSA9PSBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRDsKLQkJCQkJfQotCQkJCQlib29sZWFuIHJlbW92ZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLlJFTU9WRUQpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQ7Ci0JCQkJCWlmIChhZGRlZCB8fCBpc0ludGVyZXN0aW5nQ2hhbmdlKSB7Ci0KLQkJCQkJCXZpc2l0QWRkZWQoZGVsdGEpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHJlbW92ZWQpIHsKLQkJCQkJCXZpc2l0UmVtb3ZlZChkZWx0YSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCWlmIChERUJVRykKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRGVsdGEgYW5hbHlzaXMgbWF5IG5vdCBiZSBjb21wbGV0ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvLyBpZiB0aGUgZGVsdGEgaGFzIGNoaWxkcmVuLCBjb250aW51ZSB0byBhZGQvcmVtb3ZlIGZpbGVzCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdFJlbW92ZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCS8vIGhhbmRsZSBjbGVhbnVwCi0JCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHIgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCWlmIChyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICYmIHIuZXhpc3RzKCkpIHsKLQkJCQkJZGVsZXRlSW5kZXgoKElGaWxlKSByKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgdmlzaXRBZGRlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1NTMKLQkJCS8vIHF1aWNrIGNoZWNrIGlmIGl0J3MgZXZlbiBKU1AgcmVsYXRlZCB0byBpbXByb3ZlCi0JCQkvLyBwZXJmb3JtYW5jZQotCQkJLy8gY2hlY2tpbmcgbmFtZSBmcm9tIHRoZSBkZWx0YSBiZWZvcmUgZ2V0dGluZwotCQkJLy8gcmVzb3VyY2UgYmVjYXVzZSBpdCdzIGxpZ2h0ZXIKLQkJCVN0cmluZyBmaWxlbmFtZSA9IGRlbHRhLmdldEZ1bGxQYXRoKCkubGFzdFNlZ21lbnQoKTsKLQkJCWlmIChmaWxlbmFtZSAhPSBudWxsICYmIGdldEpzcENvbnRlbnRUeXBlKCkuaXNBc3NvY2lhdGVkV2l0aChmaWxlbmFtZSkpIHsKLQkJCQlJUmVzb3VyY2UgciA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJaWYgKHIgIT0gbnVsbCAmJiByLmV4aXN0cygpICYmIHIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCXRoaXMuanNwRmlsZXMucHV0KHIuZ2V0RnVsbFBhdGgoKSwgcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzNDYzCi0JCXByaXZhdGUgYm9vbGVhbiBpc0hpZGRlblJlc291cmNlKElQYXRoIHApIHsKLQkJCVN0cmluZ1tdIHNlZ21lbnRzID0gcC5zZWdtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZWdtZW50c1tpXS5zdGFydHNXaXRoKCIuIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZGVsZXRlSW5kZXgoSUZpbGUgZm9sZGVyKSB7Ci0JCQkvLyBjbGVhbnVwIGluZGV4Ci0JCQlJbmRleE1hbmFnZXIgaW0gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEluZGV4TWFuYWdlcigpOwotCQkJSVBhdGggZm9sZGVyUGF0aCA9IGZvbGRlci5nZXRGdWxsUGF0aCgpOwotCQkJSVBhdGggaW5kZXhMb2NhdGlvbiA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5jb21wdXRlSW5kZXhMb2NhdGlvbihmb2xkZXJQYXRoKTsKLQkJCWltLnJlbW92ZUluZGV4KGluZGV4TG9jYXRpb24pOwotCQkJLy8gaW0uaW5kZXhMb2NhdGlvbnMucmVtb3ZlS2V5KGZvbGRlclBhdGgpOwotCQkJLy8gaW0uaW5kZXhMb2NhdGlvbnMucmVtb3ZlVmFsdWUoaW5kZXhMb2NhdGlvbik7Ci0JCQlGaWxlIGYgPSBpbmRleExvY2F0aW9uLnRvRmlsZSgpOwotCQkJZi5kZWxldGUoKTsKLQkJfQotCi0JCXB1YmxpYyBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkJcmV0dXJuIChJRmlsZVtdKSB0aGlzLmpzcEZpbGVzLnZhbHVlcygpLnRvQXJyYXkobmV3IElGaWxlW3RoaXMuanNwRmlsZXMuc2l6ZSgpXSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJCXRoaXMuanNwRmlsZXMuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8vIGVuZCBjbGFzcyBKU1BSZXNvdXJjZVZpc2l0b3IKLQotCS8qKgotCSAqIHNjaGVkdWxlcyBKU1AgZmlsZXMgZm9yIGluZGV4aW5nIGJ5IEphdmEgY29yZQotCSAqLwotCXByaXZhdGUgY2xhc3MgUHJvY2Vzc0ZpbGVzSm9iIGV4dGVuZHMgSm9iIHsKLQkJTGlzdCBmaWxlTGlzdCA9IG51bGw7Ci0JCS8vIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgZmlsZXMgd2UndmUgaW5kZXhlZAotCQlpbnQgbGFzdEZpbGVDdXJzb3IgPSAwOwotCi0JCVByb2Nlc3NGaWxlc0pvYihTdHJpbmcgdGFza05hbWUpIHsKLQkJCXN1cGVyKHRhc2tOYW1lKTsKLQkJCWZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIHZvaWQgcHJvY2VzcyhJRmlsZVtdIGZpbGVzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmlsZUxpc3QuYWRkKGZpbGVzW2ldKTsKLQkJCX0KLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQSW5kZXhNYW5hZ2VyIHF1ZXVpbmcgIiArIGZpbGVzLmxlbmd0aCArICIgZmlsZXMiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgSUZpbGVbXSBnZXRGaWxlcygpIHsKLQkJCXJldHVybiAoSUZpbGVbXSkgZmlsZUxpc3QudG9BcnJheShuZXcgSUZpbGVbZmlsZUxpc3Quc2l6ZSgpXSk7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgdm9pZCBjbGVhckZpbGVzKCkgewotCQkJZmlsZUxpc3QuY2xlYXIoKTsKLQkJCWxhc3RGaWxlQ3Vyc29yID0gMDsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjbGVhcmVkIGZpbGVzIik7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImluZGV4ZXIgbW9uaXRvciIgKyBtb25pdG9yKTsKLQkJCWlmIChpc0NhbmNlbGVkKG1vbml0b3IpIHx8IGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotCi0JCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldFByaW9yaXR5KFRocmVhZC5NSU5fUFJJT1JJVFkpOwotCQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCQl0cnkgewotCQkJCUlGaWxlW10gZmlsZXNUb0JlUHJvY2Vzc2VkID0gZ2V0RmlsZXMoKTsKLQotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBpbmRleGluZyAiICsgZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aCArICIgZmlsZXMiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCS8vIEFQSSBpbmRpY2F0ZXMgdGhhdCBtb25pdG9yIGlzIG5ldmVyIG51bGwKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlKU1BTZWFyY2hTdXBwb3J0IHNzID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkJCVN0cmluZyBwcm9jZXNzaW5nTkZpbGVzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JCQkJZm9yICg7bGFzdEZpbGVDdXJzb3IgPCBmaWxlc1RvQmVQcm9jZXNzZWQubGVuZ3RoOyBsYXN0RmlsZUN1cnNvcisrKSB7Ci0KLQkJCQkJaWYgKGlzQ2FuY2VsZWQobW9uaXRvcikgfHwgZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQl9Ci0JCQkJCUlGaWxlIGZpbGUgPSBmaWxlc1RvQmVQcm9jZXNzZWRbbGFzdEZpbGVDdXJzb3JdOwotCQkJCQl0cnkgewotCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJCUlKYXZhUHJvamVjdCBqcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQkJCQlpZiAoanByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkJCQkJc3MuYWRkSnNwRmlsZShmaWxlKTsKLQkJCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBKb2IgYWRkZWQgZmlsZTogIiArIGZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCS8vIEpTUCBJbmRleGVyIHByb2Nlc3NpbmcgbiBmaWxlcwotCQkJCQkJCXByb2Nlc3NpbmdORmlsZXMgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQSW5kZXhNYW5hZ2VyXzIsIG5ldyBTdHJpbmdbXXtJbnRlZ2VyLnRvU3RyaW5nKChmaWxlc1RvQmVQcm9jZXNzZWQubGVuZ3RoIC0gbGFzdEZpbGVDdXJzb3IpKX0pOwotCQkJCQkJCW1vbml0b3Iuc3ViVGFzayhwcm9jZXNzaW5nTkZpbGVzICsgIiAtICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFJBVExDMDAyODQ3NzYKLQkJCQkJCS8vIElTU1VFOiB3ZSBwcm9iYWJseSBzaG91bGRuJ3QgYmUgY2F0Y2hpbmcgRVZFUlkKLQkJCQkJCS8vIGV4Y2VwdGlvbiwgYnV0Ci0JCQkJCQkvLyB0aGUgZnJhbWV3b3JrIG9ubHkgYWxsb3dzIHRvIHJldHVybiBJU3RhdHVzIGluCi0JCQkJCQkvLyBvcmRlciB0byBjb21tdW5pY2F0ZQotCQkJCQkJLy8gdGhhdCBzb21ldGhpbmcgd2VudCB3cm9uZywgd2hpY2ggbWVhbnMgdGhlIGxvb3AKLQkJCQkJCS8vIHdvbid0IGNvbXBsZXRlLCBhbmQgd2Ugd291bGQgaGl0IHRoZSBzYW1lIHByb2JsZW0KLQkJCQkJCS8vIHRoZSBuZXh0IHRpbWUuCi0JCQkJCQkvLyAKLQkJCQkJCS8vIGEgcG9zc2libGUgc29sdXRpb24gaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUKLQkJCQkJCS8vIGV4Y2VwdGlvbnMgbG9nZ2VkCi0JCQkJCQkvLyBhbmQgb25seSBsb2cgYSBjZXJ0YWluIGFtdCBvZiB0aGUgc2FtZSBvbmUsCi0JCQkJCQkvLyBvdGhlcndpc2Ugc2tpcCBpdC4KLQkJCQkJCWlmICghZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJKU1BJbmRleGVyIHByb2JsZW0gaW5kZXhpbmc6IiArIGZpbGVuYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSAvLyBlbmQgZm9yCi0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBqdXN0IGluIGNhc2Ugc29tZXRoaW5nIGRpZG4ndCBmb2xsb3cgQVBJIChtb25pdG9yIGlzIG51bGwpCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0KLQkJCS8vIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCwgY2xlYXIgZmlsZXMgbGlzdAotCQkJY2xlYXJGaWxlcygpOwotCQkJCi0JCQlsb25nIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJbG9uZyBkaWZmID0gZmluaXNoIC0gc3RhcnQ7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlmVG90YWxUaW1lICs9IGRpZmY7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInRoaXMgdGltZTogIiArIGRpZmYgKyAiIGN1bXVsYXRpdmUgdGltZSBmb3IgcmVzb3VyY2UgY2hhbmdlZDogIiArIGZUb3RhbFRpbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNDYW5jZWxlZChJUHJvZ3Jlc3NNb25pdG9yIHJ1bk1vbml0b3IpIHsKLQotCQkJYm9vbGVhbiBjYW5jZWxlZCA9IGZhbHNlOwotCQkJLy8gY2hlY2sgc3BlY2lmaWMgbW9uaXRvciBwYXNzZWQgaW50byBydW4gbWV0aG9kICh0aGUgcHJvZ3Jlc3MKLQkJCS8vIGdyb3VwIGluIHRoaXMgY2FzZSkKLQkJCS8vIGNoZWNrIG1haW4gc2VhcmNoIHN1cHBvcnQgY2FuY2VsZWQKLQkJCWlmIChydW5Nb25pdG9yICE9IG51bGwgJiYgcnVuTW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJY2FuY2VsZWQgPSB0cnVlOwotCQkJZWxzZSBpZiAoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkgewotCQkJCWNhbmNlbGVkID0gdHJ1ZTsKLQkJCQlpZiAocnVuTW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCXJ1bk1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNhbmNlbGVkOwotCQl9Ci0JCQotCX0KLQotCS8vIGVuZCBjbGFzcyBQcm9jZXNzRmlsZXNKb2IKLQotCXByaXZhdGUgc3RhdGljIEpTUEluZGV4TWFuYWdlciBmU2luZ2xldG9uID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemluZyA9IHRydWU7Ci0KLQlwcml2YXRlIEluZGV4Sm9iQ29vcmRpbmF0b3IgaW5kZXhKb2JDb29yZGluYXRvcjsKLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGpzcFJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIEpTUFJlc291cmNlVmlzaXRvciBmVmlzaXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlSlNQID0gbnVsbDsKLQotCXN0YXRpYyBsb25nIGZUb3RhbFRpbWUgPSAwOwotCi0JLy8gSm9iIGZvciBwcm9jZXNzaW5nIHJlc291cmNlIGRlbHRhCi0JcHJpdmF0ZSBQcm9jZXNzRmlsZXNKb2IgcHJvY2Vzc0ZpbGVzSm9iID0gbnVsbDsKLQotCXByaXZhdGUgSlNQSW5kZXhNYW5hZ2VyKCkgewotCQlwcm9jZXNzRmlsZXNKb2IgPSBuZXcgUHJvY2Vzc0ZpbGVzSm9iKEpTUENvcmVNZXNzYWdlcy5KU1BJbmRleE1hbmFnZXJfMCk7Ci0JCS8vIG9ubHkgc2hvdyBpbiB2ZXJib3NlIG1vZGUKLQkJcHJvY2Vzc0ZpbGVzSm9iLnNldFN5c3RlbSh0cnVlKTsKLQkJcHJvY2Vzc0ZpbGVzSm9iLnNldFByaW9yaXR5KEpvYi5MT05HKTsKLQkJcHJvY2Vzc0ZpbGVzSm9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlzdXBlci5kb25lKGV2ZW50KTsKLQkJCQlzZXRTdGFibGVTdGF0ZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKU1BJbmRleE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0KLQkJaWYgKGZTaW5nbGV0b24gPT0gbnVsbCkKLQkJCWZTaW5nbGV0b24gPSBuZXcgSlNQSW5kZXhNYW5hZ2VyKCk7Ci0JCXJldHVybiBmU2luZ2xldG9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0KLQkJSlNQSW5kZXhNYW5hZ2VyIHNpbmdsZUluc3RhbmNlID0gZ2V0SW5zdGFuY2UoKTsKLQotCi0JCWlmICghc2luZ2xlSW5zdGFuY2UuaW5pdGlhbGl6ZWQpIHsKLQkJCXNpbmdsZUluc3RhbmNlLmluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCXNpbmdsZUluc3RhbmNlLmluaXRpYWxpemluZyA9IHRydWU7Ci0KLQkJCXNpbmdsZUluc3RhbmNlLmluZGV4Sm9iQ29vcmRpbmF0b3IgPSBuZXcgSW5kZXhKb2JDb29yZGluYXRvcigpOwotCQkJc2luZ2xlSW5zdGFuY2UuanNwUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBKU1BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0KLQkJCS8vIGFkZGVkIGFzIEpvYkNoYW5nZSBsaXN0ZW5lciBzbyBKU1BJbmRleE1hbmFnZXIgY2FuIGJlIHNtYXJ0ZXIKLQkJCS8vIGFib3V0IHdoZW4gaXQgcnVucwotCQkJUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmFkZEpvYkNoYW5nZUxpc3RlbmVyKHNpbmdsZUluc3RhbmNlLmluZGV4Sm9iQ29vcmRpbmF0b3IpOwotCi0JCQkvLyBhZGQgSlNQSW5kZXhNYW5hZ2VyIHRvIGtlZXAgSlNQIEluZGV4IHVwIHRvIGRhdGUKLQkJCS8vIGxpc3RlbmluZyBmb3IgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSBhbmQKLQkJCS8vIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFCi0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0KLQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MDkxCi0JCQkvLyBtYWtlcyBzdXJlIEluZGV4TWFuYWdlciBpcyBhd2FyZSBvZiBvdXIgaW5kZXhlcwotCQkJc2F2ZUluZGV4ZXMoKTsKLQkJCXNpbmdsZUluc3RhbmNlLmluaXRpYWxpemluZyA9IGZhbHNlOwotCQl9Ci0KLQl9Ci0JCi0Jc3luY2hyb25pemVkIHZvaWQgc2V0SW5kZXhTdGF0ZShpbnQgc3RhdGUpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBzZXR0aW5nIGluZGV4IHN0YXRlIHRvOiAiICsgc3RhdGUyU3RyaW5nKHN0YXRlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlQbHVnaW4ganNwTW9kZWxQbHVnaW4gPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJanNwTW9kZWxQbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShQS0VZX0lOREVYX1NUQVRFLCBzdGF0ZSk7Ci0JCWpzcE1vZGVsUGx1Z2luLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgc3RhdGUyU3RyaW5nKGludCBzdGF0ZSkgewotCQlTdHJpbmcgcyA9ICJVTktOT1dOIjsgLy8kTk9OLU5MUy0xJAotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQljYXNlIChTX1NUQUJMRSkgOgotCQkJCXMgPSAiU19TVEFCTEUiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIChTX1VQREFUSU5HKSA6Ci0JCQkJcyA9ICJTX1VQREFUSU5HIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAoU19DQU5DRUxFRCkgOgotCQkJCXMgPSAiU19DQU5DRUxFRCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgKFNfUkVCVUlMRElORykgOgotCQkJCXMgPSAiU19SRUJVSUxESU5HIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBzOwotCX0KLQotCWludCBnZXRJbmRleFN0YXRlKCkgewotCQlyZXR1cm4gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoUEtFWV9JTkRFWF9TVEFURSk7Ci0JfQotCi0Jdm9pZCBzZXRVcGRhdGluZ1N0YXRlKCkgewotCQkvL2lmIChnZXRJbmRleFN0YXRlKCkgIT0gU19DQU5DRUxFRCkKLQkJc2V0SW5kZXhTdGF0ZShTX1VQREFUSU5HKTsKLQl9Ci0KLQl2b2lkIHNldENhbmNlbGVkU3RhdGUoKSB7Ci0JCXNldEluZGV4U3RhdGUoSlNQSW5kZXhNYW5hZ2VyLlNfQ0FOQ0VMRUQpOwotCX0KLQotCXZvaWQgc2V0U3RhYmxlU3RhdGUoKSB7Ci0JCS8vaWYgKGdldEluZGV4U3RhdGUoKSAhPSBTX0NBTkNFTEVEKQotCQlzZXRJbmRleFN0YXRlKFNfU1RBQkxFKTsKLQl9Ci0KLQl2b2lkIHNldFJlYnVpbGRpbmdTdGF0ZSgpIHsKLQkJc2V0SW5kZXhTdGF0ZShTX1JFQlVJTERJTkcpOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHJlYnVpbGRJbmRleElmTmVlZGVkKCkgewotCQlpZiAoZ2V0SW5kZXhTdGF0ZSgpICE9IFNfU1RBQkxFKSB7Ci0JCQlyZWJ1aWxkSW5kZXgoKTsKLQkJfQotCX0KLQotCXZvaWQgcmVidWlsZEluZGV4KCkgewotCi0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqIEpTUCBJbmRleCB1bnN0YWJsZSwgcmVxdWVzdGluZyByZS1pbmRleGluZyIpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0SW5kZXhpbmdKb2IoKS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFib3V0VG9SdW4oSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3VwZXIuYWJvdXRUb1J1bihldmVudCk7Ci0JCQkJc2V0UmVidWlsZGluZ1N0YXRlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3VwZXIuZG9uZShldmVudCk7Ci0JCQkJc2V0U3RhYmxlU3RhdGUoKTsKLQkJCQlnZXRJbmRleGluZ0pvYigpLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJfQotCQl9KTsKLQkJLy8gd2UncmUgYWJvdXQgdG8gcmVpbmRleCBldmVyeXRoaW5nIGFueXdheQotCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5jbGVhckZpbGVzKCk7Ci0JCWdldEluZGV4aW5nSm9iKCkuc2NoZWR1bGUoKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHNjaGVkdWxlcyBhIEpvYiB0byBwcm9jZXNzIGNvbGxlY3RlZCBmaWxlcy4gQWxsIEpTUAotCSAqIGluZGV4aW5nIHNob3VsZCBiZSBkb25lIHRocm91Z2ggdGhpcyBtZXRob2Qgb3IgcHJvY2Vzc0ZpbGVzKElGaWxlIGZpbGUpCi0JICogCi0JICogQHBhcmFtIGZpbGVzCi0JICovCi0JZmluYWwgdm9pZCBpbmRleEZpbGVzKElGaWxlW10gZmlsZXMpIHsKLQkJLy8gZG9uJ3QgdXNlIHRoaXMgcnVsZQotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkzMQotCQkvLyBwcm9jZXNzRmlsZXMuc2V0UnVsZShuZXcgSW5kZXhGaWxlUnVsZSgpKTsKLQkJcHJvY2Vzc0ZpbGVzSm9iLnByb2Nlc3MoZmlsZXMpOwotCX0KLQotCi0JLyoqCi0JICogUGFja2FnZSBwcm90ZWN0ZWQgZm9yIGFjY2VzcyBieSBpbm5lciBKb2IgY2xhc3MgaW4gcmVzb3VyY2VDaGFuZ2VkKC4uLikKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSlNQUmVzb3VyY2VWaXNpdG9yIGdldFZpc2l0b3IoKSB7Ci0KLQkJaWYgKHRoaXMuZlZpc2l0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5mVmlzaXRvciA9IG5ldyBKU1BSZXNvdXJjZVZpc2l0b3IoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5mVmlzaXRvcjsKLQl9Ci0KLQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTA5MQotCS8vIG1ha2VzIHN1cmUgSW5kZXhNYW5hZ2VyIGlzIGF3YXJlIG9mIG91ciBpbmRleGVzCi0Jdm9pZCBzYXZlSW5kZXhlcygpIHsKLQkJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JCUlQYXRoIGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldE1vZGVsSnNwUGx1Z2luV29ya2luZ0xvY2F0aW9uKCk7Ci0KLQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShqc3BNb2RlbFdvcmtpbmdMb2NhdGlvbi50b09TU3RyaW5nKCkpOwotCQlTdHJpbmdbXSBmaWxlcyA9IGZvbGRlci5saXN0KCk7Ci0JCVN0cmluZyBsb2NheSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUluZGV4IGluZGV4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmluZGV4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2NheSA9IGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvU3RyaW5nKCkgKyAiLyIgKyBmaWxlc1tpXTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyByZXVzZSBpbmRleCBmaWxlCi0JCQkJCWluZGV4ID0gbmV3IEluZGV4KGxvY2F5LCAiSW5kZXggZm9yICIgKyBsb2NheSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW5kZXhNYW5hZ2VyLnNhdmVJbmRleChpbmRleCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gd2Ugc2hvdWxkIGJlIHNodXR0aW5nIGRvd24sIHdhbnQgdG8gc2h1dCBkb3duIHF1aWV0bHkKLQkJCWlmIChERUJVRykKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JSUNvbnRlbnRUeXBlIGdldEpzcENvbnRlbnRUeXBlKCkgewotCQlpZiAodGhpcy5mQ29udGVudFR5cGVKU1AgPT0gbnVsbCkKLQkJCXRoaXMuZkNvbnRlbnRUeXBlSlNQID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCXJldHVybiB0aGlzLmZDb250ZW50VHlwZUpTUDsKLQl9Ci0KLQkvKioKLQkgKiBBIGNoZWNrIHRvIHNlZSBpZiB0aGUgT1NHSSBmcmFtZXdvcmsgaXMgc2h1dHRpbmcgZG93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFN5c3RlbSBCdW5kbGUgaXMgc3RvcHBlZCAoaWUuIHRoZSBmcmFtZXdvcmsgaXMKLQkgKiAgICAgICAgIHNodXR0aW5nIGRvd24pCi0JICovCi0JYm9vbGVhbiBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpIHsKLQkJLy8gaW4gdGhlIEZyYW1ld29yayBjbGFzcyB0aGVyZSdzIGEgbm90ZToKLQkJLy8gc2V0IHRoZSBzdGF0ZSBvZiB0aGUgU3lzdGVtIEJ1bmRsZSB0byBTVE9QUElORy4KLQkJLy8gdGhpcyBtdXN0IGJlIGRvbmUgZmlyc3QgYWNjb3JkaW5nIHRvIHNlY3Rpb24gNC4xOS4yIGZyb20gdGhlIE9TR2kKLQkJLy8gUjMgc3BlYy4KLQkJYm9vbGVhbiBzaHV0dGluZ0Rvd24gPSBQbGF0Zm9ybS5nZXRCdW5kbGUoT1NHSV9GUkFNRVdPUktfSUQpLmdldFN0YXRlKCkgPT0gQnVuZGxlLlNUT1BQSU5HOwotCQlpZiAoREVCVUcgJiYgc2h1dHRpbmdEb3duKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlcjogc3lzdGVtIGlzIHNodXR0aW5nIGRvd24hIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc2h1dHRpbmdEb3duOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0KLQkJLy8gc3RvcCBsaXN0ZW5pbmcKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoanNwUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0KLQotCQkvLyBzdG9wIGFueSBzZWFyY2hpbmcKLQkJSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLnNldENhbmNlbGVkKHRydWUpOwotCi0JCS8vIHN0b3AgbGlzdGVuaW5nIHRvIGpvYnMKLQkJUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKGluZGV4Sm9iQ29vcmRpbmF0b3IpOwotCi0KLQkJaW50IG1heHdhaXQgPSA1MDAwOwotCQlpZiAocHJvY2Vzc0ZpbGVzSm9iICE9IG51bGwpIHsKLQkJCXByb2Nlc3NGaWxlc0pvYi5jYW5jZWwoKTsKLQkJfQotCQkvLyBhdHRlbXB0IHRvIG1ha2Ugc3VyZSB0aGlzIGluZGV4aW5nIGpvYiBpcyBsaXR0ZXJhbGx5Ci0JCS8vIGRvbmUgYmVmb3JlIGNvbnRpbnVpbmcsIHNpbmNlIHdlIGFyZSBzaHV0dGluZyBkb3duCi0JCXdhaXRUaWxsTm90UnVubmluZyhtYXh3YWl0LCBwcm9jZXNzRmlsZXNKb2IpOwotCi0JCWlmIChpbmRleGluZ0pvYiAhPSBudWxsKSB7Ci0JCQlpbmRleGluZ0pvYi5jYW5jZWwoKTsKLQkJfQotCQl3YWl0VGlsbE5vdFJ1bm5pbmcobWF4d2FpdCwgcHJvY2Vzc0ZpbGVzSm9iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2FpdFRpbGxOb3RSdW5uaW5nKGludCBtYXhTZWNvbmRzLCBKb2Igam9iKSB7Ci0JCWludCBwYXVzZVRpbWUgPSAxMDsKLQkJaW50IG1heHRyaWVzID0gbWF4U2Vjb25kcyAvIHBhdXNlVGltZTsKLQkJaW50IGNvdW50ID0gMDsKLQkJd2hpbGUgKGNvdW50KysgPCBtYXh0cmllcyAmJiBqb2IuZ2V0U3RhdGUoKSA9PSBKb2IuUlVOTklORykgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAocGF1c2VUaW1lKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvdW50OiAiICsgY291bnQgKyAiIG1heDogIiArCi0JCQkJLy8gbWF4dHJpZXMpOwotCQkJfQotCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBJbmRleEpvYkNvb3JkaW5hdG9yIGV4dGVuZHMgSm9iQ2hhbmdlQWRhcHRlciB7Ci0JCQotCQlwdWJsaWMgdm9pZCBhYm91dFRvUnVuKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSm9iIGpvYlRvQ29vcmRpbmF0ZSA9IGV2ZW50LmdldEpvYigpOwotCQkJaWYgKGlzSm9iVG9Bdm9pZChqb2JUb0Nvb3JkaW5hdGUpKSB7Ci0JCQkJLy8gam9iIHdpbGwgYmUgcmVzY2hlZHVsZWQgd2hlbiB0aGUgam9iIHdlCi0JCQkJLy8gYXJlIGF2b2lkaW5nIChlZy4gYnVpbGQpIGlzIGRvbmUKLQkJCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5jYW5jZWwoKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY2FuY2VsOiIgKyBqb2JUb0Nvb3JkaW5hdGUuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0KLQkJCUpvYiBqb2JUb0Nvb3JkaW5hdGUgPSBldmVudC5nZXRKb2IoKTsKLQkJCWlmIChpc0pvYlRvQXZvaWQoam9iVG9Db29yZGluYXRlKSkgewotCQkJCWlmIChnZXRQcm9jZXNzRmlsZXNKb2IoKS5nZXRGaWxlcygpLmxlbmd0aCA+IDApIHsKLQkJCQkJZ2V0UHJvY2Vzc0ZpbGVzSm9iKCkuc2NoZWR1bGUoNTAwKTsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInNjaGVkdWxlOiIgKyBqb2JUb0Nvb3JkaW5hdGUuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJCQotCi0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNKb2JUb0F2b2lkKEpvYiBqb2JUb0Nvb3JkaW5hdGUpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQpIHx8IGpvYlRvQ29vcmRpbmF0ZS5iZWxvbmdzVG8oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQpIHx8IGpvYlRvQ29vcmRpbmF0ZS5iZWxvbmdzVG8oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX1JFRlJFU0gpKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBKU1BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCi0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0KLQkJCWlmIChpc0luaXRpYWxpemluZygpKQotCQkJCXJldHVybjsKLQotCQkJLy8gaWdub3JlIHJlc291cmNlIGNoYW5nZXMgaWYgYWxyZWFkeSByZWJ1aWxkaW5nCi0JCQlpZiAoZ2V0SW5kZXhTdGF0ZSgpID09IFNfUkVCVUlMRElORykKLQkJCQlyZXR1cm47Ci0JCQkvLyBwcmV2aW91c2x5IGNhbmNlbGVkLCBuZWVkcyBlbnRpcmUgaW5kZXggcmVidWlsZAotCQkJaWYgKGdldEluZGV4U3RhdGUoKSA9PSBTX0NBTkNFTEVEKSB7Ci0JCQkJLy8gcmVidWlsZEluZGV4KCk7Ci0JCQkJLy8ganVzdCByZXN1bWUgaW5kZXhpbmcKLQkJCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5zY2hlZHVsZSg1MDApOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzY2hlZHVsZTogcmVzb3VyY2UgY2hhbmdlZCwgcHJldmlvdXNseSBjYW5jZWxlZCIpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCQkvLyBvbmx5IGNhcmUgYWJvdXQgYWRkcyBvciBjaGFuZ2VzIHJpZ2h0IG5vdy4uLgotCQkJCWludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOwotCQkJCWJvb2xlYW4gYWRkZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkFEREVEKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRDsKLQkJCQlib29sZWFuIGNoYW5nZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQ7Ci0JCQkJaWYgKGFkZGVkIHx8IGNoYW5nZWQpIHsKLQotCQkJCQkvLyBvbmx5IGFuYWx5emUgdGhlIGZ1bGwgKHN0YXJ0aW5nIGF0IHJvb3QpIGRlbHRhCi0JCQkJCS8vIGhpZXJhcmNoeQotCQkJCQlpZiAoZGVsdGEuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLmVxdWFscygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJSlNQUmVzb3VyY2VWaXNpdG9yIHYgPSBnZXRWaXNpdG9yKCk7Ci0JCQkJCQkJLy8gY2xlYXIgZnJvbSBsYXN0IHJ1bgotCQkJCQkJCXYucmVzZXQoKTsKLQkJCQkJCQkvLyBjb3VudCBmaWxlcywgcG9zc2libHkgZG8gdGhpcyBpbiBhIGpvYiB0b28uLi4KLQkJCQkJCQkvLyBkb24ndCBpbmNsdWRlIFBIQU5UT00gcmVzb3VyY2VzCi0JCQkJCQkJZGVsdGEuYWNjZXB0KHYsIGZhbHNlKTsKLQotCQkJCQkJCS8vIHByb2Nlc3MgZmlsZXMgZnJvbSB0aGlzIGRlbHRhCi0JCQkJCQkJSUZpbGVbXSBmaWxlcyA9IHYuZ2V0RmlsZXMoKTsKLQkJCQkJCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCQkJCQkvKgotCQkJCQkJCQkgKiBKb2IgY2hhbmdlIGxpc3RlbmVyIHNob3VsZCBzZXQgYmFjayB0bwotCQkJCQkJCQkgKiBzdGFibGUgd2hlbiBmaW5pc2hlZAotCQkJCQkJCQkgKi8KLQkJCQkJCQkJc2V0VXBkYXRpbmdTdGF0ZSgpOwotCQkJCQkJCQkvLyBwcm9jZXNzRmlsZXMoZmlsZXMpOwotCQkJCQkJCQlpbmRleEZpbGVzKGZpbGVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gbmVlZCB0byBzZXQgc3RhdGUgaGVyZSBzb21laG93LCBhbmQgcmVpbmRleAotCQkJCQkJCS8vIG90aGVyd2lzZSBpbmRleCB3aWxsIGJlIHVucmVsaWFibGUKLQkJCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlJbmRleFdvcmtzcGFjZUpvYiBnZXRJbmRleGluZ0pvYigpIHsKLQkJcmV0dXJuIGluZGV4aW5nSm9iOwotCX0KLQotCVByb2Nlc3NGaWxlc0pvYiBnZXRQcm9jZXNzRmlsZXNKb2IoKSB7Ci0JCXJldHVybiBwcm9jZXNzRmlsZXNKb2I7Ci0JfQotCi0JYm9vbGVhbiBpc0luaXRpYWxpemluZygpIHsKLQkJcmV0dXJuIGluaXRpYWxpemluZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQUGF0aEluZGV4ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQUGF0aEluZGV4ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmZGRhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFBhdGhJbmRleGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLQotLyoqCi0gKiBwYV9UT0RPIFN0aWxsIG5lZWQgdG8gdGFrZSBpbnRvIGNvbnNpZGVyYXRpb246Ci0gKiAJLSBmb2N1cyBpbiB3b3Jrc3BhY2UKLSAqICAtIHNlYXJjaCBwYXR0ZXJuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYXRoSW5kZXhlciB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvLyB2aXNpdG9yIHRoYXQgcmV0cmlldmVzIGpzcCBwcm9qZWN0IHBhdGhzIGZvciBhbGwganNwIGZpbGVzIGluIHRoZSB3b3Jrc3BhY2UKLQljbGFzcyBKU1BGaWxlVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0JCS8vIGhhc2ggbWFwIGZvcmNlcyBvbmx5IG9uZSBvZiBlYWNoIGZpbGUKLQkJcHJpdmF0ZSBIYXNoTWFwIGZQYXRocyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUlKYXZhU2VhcmNoU2NvcGUgZlNjb3BlID0gbnVsbDsKLQkJU2VhcmNoUGF0dGVybiBmUGF0dGVybiA9IG51bGw7Ci0KLQkJcHVibGljIEpTUEZpbGVWaXNpdG9yKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgewotCQkJdGhpcy5mUGF0dGVybiA9IHBhdHRlcm47Ci0JCQl0aGlzLmZTY29wZSA9IHNjb3BlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQotCQkJaWYoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCWlmIChwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQotCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZUpTUCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNTUzCi0JCQkJLy8gY2hlY2sgdGhpcyBiZWZvcmUgZGVzY3JpcHRpb24KLQkJCQkvLyBjaGVjayBuYW1lIGJlZm9yZSBhY3R1YWxseSBnZXR0aW5nIHRoZSBmaWxlIChsZXNzIHdvcmspCi0JCQkJaWYoY29udGVudFR5cGVKU1AuaXNBc3NvY2lhdGVkV2l0aChwcm94eS5nZXROYW1lKCkpKSB7Ci0JCQkJCQotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKXByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOwotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCVN0cmluZyBjdElkID0gbnVsbDsKLQkJCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQljdElkID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCkuZ2V0SWQoKTsKLQkJCQkJfQotCQkJCQlpZiAoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUC5lcXVhbHMoY3RJZCkpIHsKLQkJCQkJCWlmICh0aGlzLmZTY29wZS5lbmNsb3Nlcyhwcm94eS5yZXF1ZXN0RnVsbFBhdGgoKS50b1N0cmluZygpKSkgewotCQotCQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgc2VsZWN0ZWQgaW5kZXggcGF0aDoiICsgZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQkJZlBhdGhzLnB1dChmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCksIEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5jb21wdXRlSW5kZXhMb2NhdGlvbihmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBkb24ndCBzZWFyY2ggZGVlcGVyIGZvciBmaWxlcwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIElQYXRoW10gZ2V0UGF0aHMoKSB7Ci0JCQlyZXR1cm4gKElQYXRoW10pIGZQYXRocy52YWx1ZXMoKS50b0FycmF5KG5ldyBJUGF0aFtmUGF0aHMuc2l6ZSgpXSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVBhdGhbXSBnZXRWaXNpYmxlSnNwUGF0aHMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB7Ci0KLQkJSlNQRmlsZVZpc2l0b3IganNwRmlsZVZpc2l0b3IgPSBuZXcgSlNQRmlsZVZpc2l0b3IocGF0dGVybiwgc2NvcGUpOwotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5hY2NlcHQoanNwRmlsZVZpc2l0b3IsIDApOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGpzcEZpbGVWaXNpdG9yLmdldFBhdGhzKCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ODk0NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotCi0vKioKLSAqIENyZWF0ZWQgd2l0aCBhIC5qc3AgZmlsZSwgYnV0IHNob3VsZCBhcHBlYXIgdG8gYmUgYSAuamF2YSBmaWxlIGZvciBpbmRleGluZwotICogYW5kIHNlYXJjaGluZyBwdXJwb3Nlcy4gVGhlcmUgYXJlIHB1cnBvc2VseSBmZXcgZmllbGRzIGluIHRoaXMgY2xhc3MsIGFuZAotICogdGhvc2UgZmllbGRzIGFyZSBsaWdodHdlaWdodCBzaW5jZSBpdCdzIHBvc3NpYmxlIGZvciBtYW55IEpTUCBzZWFyY2gKLSAqIGRvY3VtZW50cyB0byBleGlzdCBpbiBtZW1vcnkgYXQgb25lIHRpbWUgKGVnLiBhZnRlciBpbXBvcnRpbmcgYSBwcm9qZWN0Ci0gKiB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIEpTUCBmaWxlcykKLSAqLwotcHVibGljIGNsYXNzIEpTUFNlYXJjaERvY3VtZW50IHsKLQotCXByaXZhdGUgU3RyaW5nIGZKU1BQYXRoU3RyaW5nID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmQ1VQYXRoID0gbnVsbDsKLQlwcml2YXRlIFNlYXJjaFBhcnRpY2lwYW50IGZQYXJ0aWNpcGFudCA9IG51bGw7Ci0JcHJpdmF0ZSBsb25nIGZMYXN0TW9kaWZpZWRTdGFtcDsKLQlwcml2YXRlIGNoYXJbXSBmQ2FjaGVkQ2hhckNvbnRlbnRzOwotCQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIHBhcnRpY2lwYW50Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIEpTUFNlYXJjaERvY3VtZW50KFN0cmluZyBmaWxlUGF0aCwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQkJLy9Bc3NlcnQuaXNOb3ROdWxsKGZpbGVQYXRoLCAiU2VhcmNoIHN1cHBvcnQgZm9yIEpTUCByZXF1aXJlcyBmaWxlIHBhdGhzIik7IC8vJE5PTi1OTFMtMSQgCi0JCXRoaXMuZkpTUFBhdGhTdHJpbmcgPSBmaWxlUGF0aDsKLQkJdGhpcy5mUGFydGljaXBhbnQgPSBwYXJ0aWNpcGFudDsKLQl9Ci0KLQlwdWJsaWMgU2VhcmNoUGFydGljaXBhbnQgZ2V0UGFydGljaXBhbnQoKSB7Ci0JCXJldHVybiB0aGlzLmZQYXJ0aWNpcGFudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudCNnZXRDaGFyQ29udGVudHMoKQotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q2hhckNvbnRlbnRzKCkgewotCQkKLQkJaWYoZkNhY2hlZENoYXJDb250ZW50cyA9PSBudWxsIHx8IGlzRGlydHkoKSkgewotCQkgICAgSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBnZXRKU1BUcmFuc2xhdGlvbigpOyAgICAKLQkJICAgIGZDYWNoZWRDaGFyQ29udGVudHMgPSB0cmFucyAhPSBudWxsID8gdHJhbnMuZ2V0SmF2YVRleHQoKS50b0NoYXJBcnJheSgpIDogbmV3IGNoYXJbMF07Ci0JCSAgICBmQ1VQYXRoID0gdHJhbnMuZ2V0SmF2YVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gZkNhY2hlZENoYXJDb250ZW50czsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFUZXh0KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhnZXRDaGFyQ29udGVudHMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogSXQncyBub3QgcmVjb21tZW5kZWQgZm9yIGNsaWVudHMgdG8gaG9sZCBvbiB0byB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICogc2luY2UgaXQncyBraW5kIG9mIGxhcmdlLiBJZiBwb3NzaWJsZSwgaG9sZCBvbiB0byB0aGUKLQkgKiBKU1BTZWFyY2hEb2N1bWVudCwgd2hpY2ggaXMgbW9yZSBvZiBhIGxpZ2h0d2VpZ2h0IHByb3h5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIEpTUFRyYW5zbGF0aW9uIGZvciB0aGUganNwIGZpbGUsIG9yIG51bGwgaWYgaXQncyBhbgotCSAqICAgICAgICAgdW5zdXBwb3J0ZWQgZmlsZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZ2V0SlNQVHJhbnNsYXRpb24oKSB7Ci0JCUpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uIHRyYW5zbGF0aW9uID0gbnVsbDsKLQkJSUZpbGUganNwRmlsZSA9IGdldEZpbGUoKTsKLQkJaWYgKCFKU1BTZWFyY2hTdXBwb3J0LmlzSnNwKGpzcEZpbGUpKQotCQkJcmV0dXJuIHRyYW5zbGF0aW9uOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJLy8gZ2V0IGV4aXN0aW5nIG1vZGVsIGZvciByZWFkLCB0aGVuIGdldCBkb2N1bWVudCBmcm9tIGl0Ci0JCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCQkJaWYgKG1vZGVsTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJanNwRmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCW1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChqc3BGaWxlKTsKLQkJCX0KLQkJCS8vIGhhbmRsZSB1bnN1cHBvcnRlZAotCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJSURPTU1vZGVsIHhtbE1vZGVsID0gKElET01Nb2RlbCltb2RlbDsKLQkJCQlzZXR1cEFkYXB0ZXJGYWN0b3J5KHhtbE1vZGVsKTsKLQkJCQlJRE9NRG9jdW1lbnQgZG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQlKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIGRvYy5nZXRBZGFwdGVyRm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJdHJhbnNsYXRpb24gPSBhZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbCBlKSB7Ci0JCQkvLyBubyBuZWVkIHRvIGxvZyB0aGlzLiBKdXN0IGNvbnNpZGVyIGl0IGFuIGludmFsaWQgZmlsZSBmb3Igb3VyCi0JCQkvLyBwdXJwb3Nlcy4KLQkJCS8vIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gdHJhbnNsYXRpb247Ci0JfQotCi0JLyoqCi0JICogYWRkIHRoZSBmYWN0b3J5IGZvciBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgaGVyZQotCSAqIAotCSAqIEBwYXJhbSBzbQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cEFkYXB0ZXJGYWN0b3J5KElTdHJ1Y3R1cmVkTW9kZWwgc20pIHsKLQkJTW9kZWxIYW5kbGVyRm9ySlNQLmVuc3VyZVRyYW5zbGF0aW9uQWRhcHRlckZhY3Rvcnkoc20pOwotCX0KLQotCS8qKgotCSAqIHRoZSBwYXRoIHRvIHRoZSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudCNnZXRQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JICAgIC8vIGNhY2hpbmcgdGhlIHBhdGggc2luY2UgaXQncyBleHBlbnNpdmUgdG8gZ2V0IHRyYW5zbGF0aW9uCi0JCS8vIGltcG9ydGFudCB0aGF0IGlzRGlydHkoKSBjaGVjayBpcyBzZWNvbmQgdG8gY2FjaGUgbW9kaWZpY2F0aW9uIHN0YW1wCi0JICAgIGlmKHRoaXMuZkNVUGF0aCA9PSBudWxsIHx8IGlzRGlydHkoKSkgewotCSAgICAgICAgSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBnZXRKU1BUcmFuc2xhdGlvbigpOwotCSAgICAgICAgaWYodHJhbnMgIT0gbnVsbCkgewotCSAgICAgICAgICAgIHRoaXMuZkNVUGF0aCA9IHRyYW5zLmdldEphdmFQYXRoKCk7Ci0JICAgICAgICAgICAgLy8gc2F2ZSBzaW5jZSBpdCdzIGV4cGVuc2l2ZSB0byBjYWxjdWxhdGUgYWdhaW4gbGF0ZXIKLQkgICAgICAgICAgICBmQ2FjaGVkQ2hhckNvbnRlbnRzID0gdHJhbnMuZ2V0SmF2YVRleHQoKS50b0NoYXJBcnJheSgpOwotCSAgICAgICAgfQotCSAgICB9Ci0JCXJldHVybiBmQ1VQYXRoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SnNwT2Zmc2V0KGludCBqYXZhT2Zmc2V0KSB7Ci0JCS8vIGNvcGllZCBmcm9tIEpTUFRyYW5zbGF0aW9uCi0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IG9mZnNldEluUmFuZ2UgPSAwOwotCQlQb3NpdGlvbiBqc3BQb3MsIGphdmFQb3MgPSBudWxsOwotCQlKU1BUcmFuc2xhdGlvbiB0cmFucyA9IGdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JCWlmICh0cmFucyAhPSBudWxsKSB7Ci0JCQlIYXNoTWFwIGphdmEyanNwTWFwID0gdHJhbnMuZ2V0SmF2YTJKc3BNYXAoKTsKLQotCQkJLy8gaXRlcmF0ZSBhbGwgbWFwcGVkIGphdmEgcmFuZ2VzCi0JCQlJdGVyYXRvciBpdCA9IGphdmEyanNwTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJamF2YVBvcyA9IChQb3NpdGlvbikgaXQubmV4dCgpOwotCQkJCS8vIG5lZWQgdG8gY291bnQgdGhlIGxhc3QgcG9zaXRpb24gYXMgaW5jbHVkZWQKLQkJCQlpZiAoIWphdmFQb3MuaW5jbHVkZXMoamF2YU9mZnNldCkgJiYgIShqYXZhUG9zLm9mZnNldCArIGphdmFQb3MubGVuZ3RoID09IGphdmFPZmZzZXQpKQotCQkJCQljb250aW51ZTsKLQotCQkJCW9mZnNldEluUmFuZ2UgPSBqYXZhT2Zmc2V0IC0gamF2YVBvcy5vZmZzZXQ7Ci0JCQkJanNwUG9zID0gKFBvc2l0aW9uKSBqYXZhMmpzcE1hcC5nZXQoamF2YVBvcyk7Ci0KLQkJCQlpZiAoanNwUG9zICE9IG51bGwpCi0JCQkJCXJlc3VsdCA9IGpzcFBvcy5vZmZzZXQgKyBvZmZzZXRJblJhbmdlOwotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgImpzcFBvc2l0aW9uIHdhcyBudWxsISIgKyBqYXZhT2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSVBhdGgganNwUGF0aCA9IG5ldyBQYXRoKHRoaXMuZkpTUFBhdGhTdHJpbmcpOwotCQlJRmlsZSBqc3BGaWxlID0gcm9vdC5nZXRGaWxlKGpzcFBhdGgpOwotCQlpZiAoIWpzcEZpbGUuZXhpc3RzKCkpIHsKLQkJCS8vIHBvc3NpYmx5IG91dHNpZGUgd29ya3NwYWNlCi0JCQlqc3BGaWxlID0gcm9vdC5nZXRGaWxlRm9yTG9jYXRpb24oanNwUGF0aCk7Ci0JCX0KLQkJcmV0dXJuIGpzcEZpbGU7Ci0JfQotCi0JCi0JcHJpdmF0ZSBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJSUZpbGUgZiA9IGdldEZpbGUoKTsKLQkJaWYoZiAhPSBudWxsKSB7Ci0JCQlsb25nIGN1cnJlbnRTdGFtcCA9IGYuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCWlmKGN1cnJlbnRTdGFtcCAhPSBmTGFzdE1vZGlmaWVkU3RhbXApCi0JCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJZkxhc3RNb2RpZmllZFN0YW1wID0gY3VycmVudFN0YW1wOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbyBub3cgc2luY2UgSlNQVHJhbnNsYXRpb24gaXMgY3JlYXRlZCBvbiB0aGUgZmx5Ci0JfQotCi0JLyoqCi0JICogZm9yIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiW0pTUFNlYXJjaERvY3VtZW50OiIgKyB0aGlzLmZKU1BQYXRoU3RyaW5nICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldEVuY29kaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldEJ5dGVDb250ZW50cygpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRCeXRlQ29udGVudHMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTg0YjJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci0KLS8qKgotICogSW50ZWdyYXRpb24gb2YgSlNQIHcvIGphdmEgc2VhcmNoLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoUGFydGljaXBhbnQgZXh0ZW5kcyBTZWFyY2hQYXJ0aWNpcGFudCB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGNhbGN1bGF0ZVZhbHVlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhbGN1bGF0ZVZhbHVlKCkgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gZGVidWcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVidWc7Ci0JfQotCi0JLyoqCi0JICogSW1wb3J0YW50IHRvIG5ldmVyIHJldHVybiBudWxsIGhlcmUgb3IgZWxzZSBKYXZhIHNlYXJjaCBwYXJ0aWNpcGF0aW9uCi0JICogd2lsbCBicmVhay4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50UGF0aCkgewotCQlTZWFyY2hEb2N1bWVudCBzRG9jID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFNlYXJjaERvY3VtZW50KGRvY3VtZW50UGF0aCk7Ci0KLQkJaWYgKHNEb2MgPT0gbnVsbCkgewotCQkJLy8gcmV0dXJuIGEgZHVtbXkgZG9jIGhlcmUgc28gc2VhcmNoIHBhcnRpY2lwYXRpb24gZG9lc24ndCBicmVhawotCQkJcmV0dXJuIG5ldyBOdWxsU2VhcmNoRG9jdW1lbnQoZG9jdW1lbnRQYXRoKTsKLQkJfQotCQlyZXR1cm4gc0RvYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIkpTUCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVBhdGhbXSBzZWxlY3RJbmRleGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgewotCQlKU1BQYXRoSW5kZXhlciBpbmRleGVyID0gbmV3IEpTUFBhdGhJbmRleGVyKCk7Ci0JCXJldHVybiBpbmRleGVyLmdldFZpc2libGVKc3BQYXRocyhwYXR0ZXJuLCBzY29wZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5kZXhEb2N1bWVudChTZWFyY2hEb2N1bWVudCBkb2N1bWVudCwgSVBhdGggaW5kZXhQYXRoKSB7Ci0JCWlmICghKGRvY3VtZW50IGluc3RhbmNlb2YgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUpKQotCQkJcmV0dXJuOwotCi0JCS8vIHVzZSBKYXZhIHNlYXJjaCBpbmRleGluZwotCQlTZWFyY2hFbmdpbmUuZ2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCkuaW5kZXhEb2N1bWVudChkb2N1bWVudCwgaW5kZXhQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaERvY3VtZW50W10gaW5kZXhNYXRjaGVzLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZmlsdGVyIG91dCBudWxsIG1hdGNoZXMKLQkJTGlzdCBmaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU2VhcmNoRG9jdW1lbnQgbWF0Y2ggPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4TWF0Y2hlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgcG9zc2libGUgbWF0Y2hpbmcgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU6ICIgKyBpbmRleE1hdGNoZXNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQltYXRjaCA9IGluZGV4TWF0Y2hlc1tpXTsKLQkJCWlmIChtYXRjaCAhPSBudWxsKSB7Ci0JCQkJLy8gc29tZSBtYXRjaGVzIG1heSBiZSBudWxsLCBvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGRhdGUsCi0JCQkJLy8gdGhlIGZpbGUgbWF5IG5vdCBldmVuIGV4aXN0Ci0JCQkJaWYgKG1hdGNoIGluc3RhbmNlb2YgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgJiYgKChKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgbWF0Y2gpLmdldEZpbGUoKS5leGlzdHMoKSkKLQkJCQkJZmlsdGVyZWQuYWRkKG1hdGNoKTsKLQkJCX0KLQkJfQotCi0JCWluZGV4TWF0Y2hlcyA9IChTZWFyY2hEb2N1bWVudFtdKSBmaWx0ZXJlZC50b0FycmF5KG5ldyBTZWFyY2hEb2N1bWVudFtmaWx0ZXJlZC5zaXplKCldKTsKLQkJU2VhcmNoRW5naW5lLmdldERlZmF1bHRTZWFyY2hQYXJ0aWNpcGFudCgpLmxvY2F0ZU1hdGNoZXMoaW5kZXhNYXRjaGVzLCBwYXR0ZXJuLCBzY29wZSwgcmVxdWVzdG9yLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCNnZXREb2N1bWVudChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSUZpbGUgZmlsZSkgewotCQkvLyBuZXZlciBnZXRzIGNhbGxlZD8KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hTY29wZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTVjZDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLQotLyoqCi0gKiBVc2VkIHRvIGNvbnN0cmFpbiBKU1AvamF2YSBzZWFyY2ggdG8gY2VydGFpbiBwYXRocyBhbmQgZWxlbWVudHMuCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoU2NvcGUgaW1wbGVtZW50cyBJSmF2YVNlYXJjaFNjb3BlIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmRW5jbG9zZXNBbGwgPSBmYWxzZTsKLQlwcml2YXRlIExpc3QgZlJlc291cmNlUGF0aHMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmSmF2YUVsZW1lbnRzID0gbnVsbDsKLQotCXB1YmxpYyBKU1BTZWFyY2hTY29wZSgpIHsKLQkJLy8gZW1wdHkgY29uc3RydWN0b3IganVzdCByZXR1cm5zIHRydWUgZm9yIGV2ZXJ5dGhpbmcKLQkJLy8gZXZlcnl0aGluZyBpcyBpbiBzY29wZQotCQl0aGlzLmZFbmNsb3Nlc0FsbCA9IHRydWU7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwdWJsaWMgSlNQU2VhcmNoU2NvcGUoU3RyaW5nW10gcmVzb3VyY2VTdHJpbmdQYXRoKSB7Ci0JCWluaXQoKTsKLQkJZlJlc291cmNlUGF0aHMuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVzb3VyY2VTdHJpbmdQYXRoKSk7Ci0JfQotCi0JcHVibGljIEpTUFNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdIGphdmFFbGVtZW50KSB7Ci0JCWluaXQoKTsKLQkJZkphdmFFbGVtZW50cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChqYXZhRWxlbWVudCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQl0aGlzLmZSZXNvdXJjZVBhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0aGlzLmZKYXZhRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoU3RyaW5nIHJlc291cmNlUGF0aFN0cmluZykgewotCi0JCWlmICh0aGlzLmZFbmNsb3Nlc0FsbCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChlbmNsb3Nlc1BhdGgocmVzb3VyY2VQYXRoU3RyaW5nKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCi0JCS8vIHBhX1RPRCBpbXBsZW1lbnQKLQkJaWYgKHRoaXMuZkVuY2xvc2VzQWxsKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoSVJlc291cmNlUHJveHkgZWxlbWVudCkgewotCi0JCWlmICh0aGlzLmZFbmNsb3Nlc0FsbCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChlbmNsb3Nlc1BhdGgoZWxlbWVudC5yZXF1ZXN0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGF0aChTdHJpbmcgcGF0aCkgewotCQl0aGlzLmZSZXNvdXJjZVBhdGhzLmFkZChwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZkphdmFFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGVuY2xvc2VzUGF0aChTdHJpbmcgcG9zc2libGUpIHsKLQotCQlTdHJpbmdbXSBwYXRocyA9IChTdHJpbmdbXSkgZlJlc291cmNlUGF0aHMudG9BcnJheShuZXcgU3RyaW5nW2ZSZXNvdXJjZVBhdGhzLnNpemUoKV0pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocG9zc2libGUuZXF1YWxzKHBhdGhzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQotCQlyZXR1cm4gIkpTUFNlYXJjaFNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJUGF0aFtdIGVuY2xvc2luZ1Byb2plY3RzQW5kSmFycygpIHsKLQkJcmV0dXJuIChJUGF0aFtdKSBmUmVzb3VyY2VQYXRocy50b0FycmF5KG5ldyBJUGF0aFtmUmVzb3VyY2VQYXRocy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlc0JpbmFyaWVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZXNDbGFzc3BhdGhzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5jbHVkZXNCaW5hcmllcyhib29sZWFuIGluY2x1ZGVzQmluYXJpZXMpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVzQ2xhc3NwYXRocyhib29sZWFuIGluY2x1ZGVzQ2xhc3NwYXRocykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzZWY4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1AyU2VydmxldE5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotCi0vKioKLSAqIENlbnRyYWwgYWNjZXNzIHRvIGphdmEgaW5kZXhpbmcgYW5kIHNlYXJjaC4gQWxsIGNvbnRhY3QgYmV0d2VlbiBKRFQgaW5kZXhpbmcKLSAqIGFuZCBTZWFyY2hpbmcgc2hvdWxkIGJlIGRvbmUgdGhyb3VnaCBoZXJlLgotICogCi0gKiBDbGllbnRzIHNob3VsZCBhY2Nlc3MgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB2aWEgdGhlIHNpbmdsZSBpbnN0YW5jZSB2aWEKLSAqIDxjb2RlPmdldEluc3RhbmNlKCk8L2NvZGU+LgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoU3VwcG9ydCB7Ci0KLSAgICAvLyBmb3IgZGVidWdnaW5nCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSlNQU2VhcmNoU3VwcG9ydCBzaW5nbGV0b24gPSBudWxsOwotCi0gICAgcHJpdmF0ZSBKU1BTZWFyY2hQYXJ0aWNpcGFudCBmUGFydGljaXBhbnQgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBJUGF0aCBmSnNwUGx1Z2luTG9jYXRpb24gPSBudWxsOwotCi0gICAgLy8gcGFfVE9ETyBtYXkgYmUgc2xvdyAoZXNwIGZvciBpbmRleGluZyBlbnRpcmUgd29ya3NwYWNlKQotICAgIHByaXZhdGUgZmluYWwgQ1JDMzIgZkNoZWNrc3VtQ2FsY3VsYXRvciA9IG5ldyBDUkMzMigpOwotCi0gICAgLyoqIG1haW4gY2FuY2VsIG1vbnRpb3IgZm9yIGFsbCBzZWFyY2ggc3VwcG9ydCAqLwotICAgIHByaXZhdGUgZmluYWwgSVByb2dyZXNzTW9uaXRvciBmTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLSAgICBwcml2YXRlIEpTUFNlYXJjaFN1cHBvcnQoKSB7Ci0gICAgICAgIC8vIGZvcmNlIHVzZSBvZiBzaW5nbGUgaW5zdGFuY2UKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9wZXJhdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGxpdmUgcmVzb3VyY2UncyBzZWFyY2ggbWFya2VycyBzaG93IHVwIGluCi0gICAgICogdGhlIG9wZW4gZWRpdG9yLiBJdCBhbHNvIGFsbG93cyB0aGUgYWJpbGl0eSB0byBwYXNzIGluIGEgUHJvZ3Jlc3NNb25pdG9yCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBTZWFyY2hKb2IgZXh0ZW5kcyBKb2IgaW1wbGVtZW50cyBJSmF2YVNlYXJjaENvbnN0YW50cyB7Ci0KLSAgICAgICAgU3RyaW5nIGZTZWFyY2hUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJSmF2YVNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0KLSAgICAgICAgaW50IGZTZWFyY2hGb3IgPSBGSUVMRDsKLQotICAgICAgICBpbnQgZkxpbWl0VG8gPSBBTExfT0NDVVJSRU5DRVM7Ci0KLSAgICAgICAgaW50IGZNYXRjaE1vZGUgPSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSDsKLQotICAgICAgICBTZWFyY2hSZXF1ZXN0b3IgZlJlcXVlc3RvciA9IG51bGw7Ci0KLSAgICAgICAgSUphdmFFbGVtZW50IGZFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBqYXZhIGVsZW1lbnQKLSAgICAgICAgcHVibGljIFNlYXJjaEpvYihJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgICAgICBzdXBlcihKU1BDb3JlTWVzc2FnZXMuSlNQX1NlYXJjaCArIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICB0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgICAgIHRoaXMuZlNjb3BlID0gc2NvcGU7Ci0gICAgICAgICAgICB0aGlzLmZSZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBzZWFyY2ggdGV4dAotICAgICAgICBwdWJsaWMgU2VhcmNoSm9iKFN0cmluZyBzZWFyY2hUZXh0LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgc3VwZXIoSlNQQ29yZU1lc3NhZ2VzLkpTUF9TZWFyY2ggKyBzZWFyY2hUZXh0KTsKLSAgICAgICAgICAgIHRoaXMuZlNlYXJjaFRleHQgPSBzZWFyY2hUZXh0OwotICAgICAgICAgICAgdGhpcy5mU2NvcGUgPSBzY29wZTsKLSAgICAgICAgICAgIHRoaXMuZlNlYXJjaEZvciA9IHNlYXJjaEZvcjsKLSAgICAgICAgICAgIHRoaXMuZkxpbWl0VG8gPSBsaW1pdFRvOwotICAgICAgICAgICAgdGhpcy5mTWF0Y2hNb2RlID0gbWF0Y2hNb2RlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3Igam9iTW9uaXRvcikgewotCi0gICAgICAgICAgICBpZiAoam9iTW9uaXRvciAhPSBudWxsICYmIGpvYk1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLSAgICAgICAgICAgIGlmIChKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQotICAgICAgICAgICAgU2VhcmNoUGF0dGVybiBqYXZhU2VhcmNoUGF0dGVybiA9IG51bGw7Ci0gICAgICAgICAgICAvLyBpZiBhbiBlbGVtZW50IGlzIGF2YWlsYWJsZSwgdXNlIHRoYXQgdG8gY3JlYXRlIHNlYXJjaCBwYXR0ZXJuCi0gICAgICAgICAgICAvLyAoZWcuIExvY2FsVmFyaWFibGUpCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSB0ZXh0IGFuZCBvdGhlciBwYXJhbXRlcnMKLSAgICAgICAgICAgIGlmICh0aGlzLmZFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mRWxlbWVudCwgdGhpcy5mTGltaXRUbyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mU2VhcmNoVGV4dCwgdGhpcy5mU2VhcmNoRm9yLCB0aGlzLmZMaW1pdFRvLCB0aGlzLmZNYXRjaE1vZGUpOwotCi0gICAgICAgICAgICBpZiAoamF2YVNlYXJjaFBhdHRlcm4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEpTUFNlYXJjaFBhcnRpY2lwYW50W10gcGFydGljaXBhbnRzID0geyBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpIH07Ci0gICAgICAgICAgICAgICAgU2VhcmNoRW5naW5lIGVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoam9iTW9uaXRvciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgam9iTW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZW5naW5lLnNlYXJjaChqYXZhU2VhcmNoUGF0dGVybiwgcGFydGljaXBhbnRzLCB0aGlzLmZTY29wZSwgdGhpcy5mUmVxdWVzdG9yLCBqb2JNb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKQotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbm9uLUNvcmVFeGNlcHRpb25zIHdpbGwgcGVybWFuZW50bHkgc3RhbGwgdGhlIFdvcmtlciB0aHJlYWQKLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKQotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoam9iTW9uaXRvciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgam9iTW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBlbmQgU2VhcmNoSm9iCi0gICAgLyoqCi0gICAgICogUnVubmFibGUgZm9yY2VzIGNhbGxlciB0byB3YWl0IHVudGlsIGZpbmlzaGVkIChhcyBvcHBvc2VkIHRvIHVzaW5nIGEgSm9iKQotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgU2VhcmNoUnVubmFibGUgaW1wbGVtZW50cyBJV29ya3NwYWNlUnVubmFibGUsIElKYXZhU2VhcmNoQ29uc3RhbnRzIHsKLQotICAgICAgICBTdHJpbmcgZlNlYXJjaFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIElKYXZhU2VhcmNoU2NvcGUgZlNjb3BlID0gbnVsbDsKLQotICAgICAgICBpbnQgZlNlYXJjaEZvciA9IEZJRUxEOwotCi0gICAgICAgIGludCBmTGltaXRUbyA9IEFMTF9PQ0NVUlJFTkNFUzsKLQotICAgICAgICBpbnQgZk1hdGNoTW9kZSA9IFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIOwotCi0gICAgICAgIFNlYXJjaFJlcXVlc3RvciBmUmVxdWVzdG9yID0gbnVsbDsKLQotICAgICAgICBJSmF2YUVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIGphdmEgZWxlbWVudAotICAgICAgICBwdWJsaWMgU2VhcmNoUnVubmFibGUoSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlmIChKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgU2VhcmNoUGF0dGVybiBqYXZhU2VhcmNoUGF0dGVybiA9IG51bGw7Ci0gICAgICAgICAgICAvLyBpZiBhbiBlbGVtZW50IGlzIGF2YWlsYWJsZSwgdXNlIHRoYXQgdG8gY3JlYXRlIHNlYXJjaCBwYXR0ZXJuCi0gICAgICAgICAgICAvLyAoZWcuIExvY2FsVmFyaWFibGUpCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSB0ZXh0IGFuZCBvdGhlciBwYXJhbXRlcnMKLSAgICAgICAgICAgIGlmICh0aGlzLmZFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mRWxlbWVudCwgZkxpbWl0VG8pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGphdmFTZWFyY2hQYXR0ZXJuID0gU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKGZTZWFyY2hUZXh0LCBmU2VhcmNoRm9yLCBmTGltaXRUbywgZk1hdGNoTW9kZSk7Ci0KLSAgICAgICAgICAgIGlmIChqYXZhU2VhcmNoUGF0dGVybiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSlNQU2VhcmNoUGFydGljaXBhbnRbXSBwYXJ0aWNpcGFudHMgPSB7IGdldFNlYXJjaFBhcnRpY2lwYW50KCkgfTsKLSAgICAgICAgICAgICAgICBTZWFyY2hFbmdpbmUgZW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzaygiIiwgMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZW5naW5lLnNlYXJjaChqYXZhU2VhcmNoUGF0dGVybiwgcGFydGljaXBhbnRzLCBmU2NvcGUsIGZSZXF1ZXN0b3IsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICAvL3Rocm93IGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIG5vbi1Db3JlRXhjZXB0aW9ucyB3aWxsIHBlcm1hbmVudGx5IHN0YWxsIHRoZSBXb3JrZXIgdGhyZWFkCi0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGVuZCBTZWFyY2hSdW5uYWJsZQotCi0gICAgLyoqCi0gICAgICogQ2xpZW50cyBzaG91bGQgYWNjZXNzIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgdmlhIHRoZSBzaW5nbGUgaW5zdGFuY2UKLSAgICAgKiB2aWEgZ2V0SW5zdGFuY2UoKQotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKU1BTZWFyY2hTdXBwb3J0IGdldEluc3RhbmNlKCkgewotCi0gICAgICAgIGlmIChzaW5nbGV0b24gPT0gbnVsbCkKLSAgICAgICAgICAgIHNpbmdsZXRvbiA9IG5ldyBKU1BTZWFyY2hTdXBwb3J0KCk7Ci0gICAgICAgIHJldHVybiBzaW5nbGV0b247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gY2hlY2sgaWYgYSBmaWxlIGlzIGEganNwIGZpbGUgKHNpbmNlIHRoaXMgaXMgZG9uZQotICAgICAqIGZyZXF1ZW50bHkpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSnNwKElGaWxlIGZpbGUpIHsKLSAgICAJLy8gKHBhKSAyMDA1MTAyNSByZW1vdmluZyBkZWVwIGNvbnRlbnQgdHlwZSBjaGVjawotICAgIAkvLyBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcmVxdWVudGx5Ci0gICAgCS8vIGFuZCBJTyBpcyBleHBlbnNpdmUKLSAgICAgICAgYm9vbGVhbiBpc0pzcCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotICAgICAgICAJCi0gICAgICAgICAgICBJQ29udGVudFR5cGUgY29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLSAgICAgICAgICAgIC8vIGNoZWNrIHRoaXMgYmVmb3JlIGRlc2NyaXB0aW9uLCBpdCdzIGxlc3MgZXhwZW5zaXZlCi0gICAgICAgICAgICBpZiAoY29udGVudFR5cGVKU1AuaXNBc3NvY2lhdGVkV2l0aChmaWxlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIAlpc0pzcCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaXNKc3A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2NoZWR1bGVzIGEgc2VhcmNoIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGlzIEpTUCBmaWxlIGZvciBpbmRleGluZyAoYnkKLSAgICAgKiB0aGUgamF2YSBpbmRleGVyKQotICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICB0aGUgSlNQIGZpbGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgaW5kZXhpbmcgd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTZWFyY2hEb2N1bWVudCBhZGRKc3BGaWxlKElGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkgfHwgIWZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKERFQlVHKQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgSlNQIGZpbGU6IiArIGZpbGUuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvLyBjcmVhdGUKLSAgICAgICAgU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSBjcmVhdGVTZWFyY2hEb2N1bWVudChmaWxlKTsKLSAgICAgICAgLy8gbnVsbCBpZiBub3QgYSBqc3AgZmlsZQotICAgICAgICBpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpLnNjaGVkdWxlRG9jdW1lbnRJbmRleGluZyhkZWxlZ2F0ZSwgY29tcHV0ZUluZGV4TG9jYXRpb24oZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGZhaWx1cmUgaGVyZSBkb2Vzbid0IGtlZXAgb3RoZXIgZG9jdW1lbnRzIGZyb20KLSAgICAgICAgICAgICAgICAvLyBiZWluZyBpbmRleGVkCi0gICAgICAgICAgICAgICAgLy8gaWYgcGVmb3JtZWQgaW4gYSBiYXRjaCBjYWxsIChsaWtlIEpTUEluZGV4TWFuYWdlcikKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpCi0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNjaGVkdWxlZCIgKyBkZWxlZ2F0ZSArICJmb3IgaW5kZXhpbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGEgamF2YSBzZWFyY2ggdy8gdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFJ1bnMgaW4gYSBiYWNrZ3JvdW5kIEpvYgotICAgICAqIChyZXN1bHRzIG1heSBzdGlsbCBjb21lIGluIGFmdGVyIHRoaXMgbWV0aG9kIGNhbGwpCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlYXJjaFRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgb2YgdGV4dCB0byBzZWFyY2ggb24KLSAgICAgKiBAcGFyYW0gc2VhcmNoRm9yCi0gICAgICogICAgICAgICAgICBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFLCBNRVRIT0QsIEZJRUxELCBQQUNLQUdFLCBldGMuLi4KLSAgICAgKiBAcGFyYW0gbGltaXRUbwotICAgICAqICAgICAgICAgICAgSUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TLAotICAgICAqICAgICAgICAgICAgSUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUywKLSAgICAgKiAgICAgICAgICAgIElKYXZhU2VhcmNoQ29uc3RhbnRzLklNUExFTUVOVE9SUywgb3IKLSAgICAgKiAgICAgICAgICAgIElKYXZhU2VhcmNoQ29uc3RhbnRzLkFMTF9PQ0NVUlJFTkNFUwotICAgICAqIEBwYXJhbSBtYXRjaE1vZGUKLSAgICAgKiAgICAgICAgICAgIGFsbG93ICogd2lsZGNhcmRzIG9yIG5vdAotICAgICAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUKLSAgICAgKiBAcGFyYW0gcmVxdWVzdG9yCi0gICAgICogICAgICAgICAgICBwYXNzZWQgaW4gdG8gYWNjZXB0IHNlYXJjaCBtYXRjaGVzIChhbmQgZG8gInNvbWV0aGluZyIgd2l0aAotICAgICAqICAgICAgICAgICAgdGhlbSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWFyY2goU3RyaW5nIHNlYXJjaFRleHQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIGludCBzZWFyY2hGb3IsIGludCBsaW1pdFRvLCBpbnQgbWF0Y2hNb2RlLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlYnVpbGRJbmRleElmTmVlZGVkKCk7Ci0KLSAgICAgICAgU2VhcmNoSm9iIGpvYiA9IG5ldyBTZWFyY2hKb2Ioc2VhcmNoVGV4dCwgc2NvcGUsIHNlYXJjaEZvciwgbGltaXRUbywgbWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUsIHJlcXVlc3Rvcik7Ci0gICAgICAgIHNldENhbmNlbGVkKGZhbHNlKTsKLSAgICAgICAgam9iLnNldFVzZXIodHJ1ZSk7Ci0gICAgICAgIC8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MDMyCi0gICAgICAgIC8vIHBvcHMgdXAgdXNlciBvcGVyYXRpb24gYmxvY2tlZCBkaWFsb2cgaWYgeW91IHBlcmZvcm0gYSBsb25nIHNlYXJjaCwKLSAgICAgICAgLy8gdGhlbiBvcGVuIGEgZmlsZSBiZWNhdXNlIGl0IGxvY2tzIHRoZSB3b3Jrc3BhY2UKLSAgICAgICAgLy9qb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhbiBJSmF2YUVsZW1lbnQsIGNvbnN0cmFpbmVkIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluCi0gICAgICogYSBiYWNrZ3JvdW5kIEpvYiAocmVzdWx0cyBtYXkgc3RpbGwgY29tZSBpbiBhZnRlciB0aGlzIG1ldGhvZCBjYWxsKQotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHBhcmFtIHNjb3BlCi0gICAgICogQHBhcmFtIHJlcXVlc3RvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlYXJjaChJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlYnVpbGRJbmRleElmTmVlZGVkKCk7Ci0KLSAgICAgICAgU2VhcmNoSm9iIGpvYiA9IG5ldyBTZWFyY2hKb2IoZWxlbWVudCwgc2NvcGUsIHJlcXVlc3Rvcik7Ci0gICAgICAgIHNldENhbmNlbGVkKGZhbHNlKTsKLSAgICAgICAgam9iLnNldFVzZXIodHJ1ZSk7Ci0gICAgICAgIC8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MDMyCi0gICAgICAgIC8vam9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0gICAgICAgIGpvYi5zY2hlZHVsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlYXJjaCBmb3IgYW4gSUphdmFFbGVtZW50LCBjb25zdHJhaW5lZCBieSB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4gUnVucyBpbgotICAgICAqIGFuIElXb3Jrc3BhY2UgcnVubmFibGUgKHJlc3VsdHMgd2lsbCBiZSByZXBvcnRlZCBieSB0aGUgZW5kIG9mIHRoaXMKLSAgICAgKiBtZXRob2QpCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gc2NvcGUKLSAgICAgKiBAcGFyYW0gcmVxdWVzdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VhcmNoUnVubmFibGUoSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICBKU1BJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWJ1aWxkSW5kZXhJZk5lZWRlZCgpOwotCi0gICAgICAgIFNlYXJjaFJ1bm5hYmxlIHNlYXJjaFJ1bm5hYmxlID0gbmV3IFNlYXJjaFJ1bm5hYmxlKGVsZW1lbnQsIHNjb3BlLCByZXF1ZXN0b3IpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihzZWFyY2hSdW5uYWJsZSwgSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGpzcEZpbGUKLSAgICAgKiBAcmV0dXJuIFNlYXJjaERvY3VtZW50IGlmIHRoZSBmaWxlIGlzIG5vdCBudWxsLCBleGlzdHMsIGFuZCBpcyBhIEpTUAotICAgICAqICAgICAgICAgZmlsZSwgb3RoZXJ3aXNlIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZWFyY2hEb2N1bWVudCBjcmVhdGVTZWFyY2hEb2N1bWVudChJRmlsZSBqc3BGaWxlKSB7Ci0KLSAgICAgICAgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgZGVsZWdhdGUgPSBudWxsOwotICAgICAgICBpZiAoanNwRmlsZSAhPSBudWxsICYmIGpzcEZpbGUuZXhpc3RzKCkgJiYgaXNKc3AoanNwRmlsZSkpIHsKLQotICAgICAgICAgICAgZGVsZWdhdGUgPSBuZXcgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUobmV3IEpTUFNlYXJjaERvY3VtZW50KGpzcEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2VudHJhbGl6ZWQgcGxhY2UgdG8gYWNjZXNzIEpTUFNlYXJjaERvY3VtZW50cyAodXNlZCBieQotICAgICAqIEpTUFNlYXJjaFBhcnRpY2lwYW50IGFuZCBKU1BTZWFyY2hSZXF1ZXN0b3IpCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlYXJjaERvY1BhdGgKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHJldHVybiB0aGUgSlNQU2VhcmNoRG9jdW1lbnQgb3IgbnVsbCBpZiBvbmUgaXMgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIFNlYXJjaERvY3VtZW50IGdldFNlYXJjaERvY3VtZW50KFN0cmluZyBzZWFyY2hEb2NQYXRoKSB7Ci0gICAgICAgICAKLSAgICAgICAgU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSBudWxsOwotICAgICAgICBJRmlsZSBmID0gZmlsZUZvckNVUGF0aChzZWFyY2hEb2NQYXRoKTsKLSAgICAgICAgaWYgKGYgIT0gbnVsbCkgewotICAgICAgICAgICAgZGVsZWdhdGUgPSBjcmVhdGVTZWFyY2hEb2N1bWVudChmKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGhhbmRsZSBmYWlsdXJlIGNhc2UuLi4gKGZpbGUgZGVsZXRlZCBtYXliZT8pCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVubWFuZ2xlcyB0aGUgc2VhcmNoRG9jUGF0aCBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBKU1AgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VhcmNoRG9jUGF0aAotICAgICAqLwotICAgIHByaXZhdGUgSUZpbGUgZmlsZUZvckNVUGF0aChTdHJpbmcgc2VhcmNoRG9jUGF0aCkgewotICAgIAotICAgICAgICBTdHJpbmdbXSBzcGxpdCA9IHNlYXJjaERvY1BhdGguc3BsaXQoIi8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gc3BsaXRbc3BsaXQubGVuZ3RoIC0gMV07Ci0KLSAgICAgICAgLy8gaWdub3JlIGFueXRoaW5nIGJ1dCAuamF2YSBtYXRjaGVzIChsaWtlIC5jbGFzcyBiaW5hcnkgbWF0Y2hlcykKLSAgICAgICAgaWYoIXNlYXJjaERvY1BhdGguZW5kc1dpdGgoIi5qYXZhIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBKU1AyU2VydmxldE5hbWVVdGlsLnVubWFuZ2xlKGNsYXNzbmFtZSk7Ci0gICAgICAgCi0gICAgICAgIC8vIHRyeSBhYnNvbHV0ZSBwYXRoCi0gICAgICAgIElGaWxlIGYgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlUGF0aCkpOwotICAgICAgICAvLyB3b3Jrc3BhY2UgcmVsYXRpdmUgdGhlbgotICAgICAgICBpZihmID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjAwOQotICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGEgcHJvamVjdCBuYW1lIGFzIHdlbGwKLSAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIG1lYW4gPj0gMiBwYXRoIHNlZ21lbnRzCi0gICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZVBhdGgpOwotICAgICAgICAgICAgaWYocGF0aC5zZWdtZW50Q291bnQoKSA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZjsKLSAgICB9Ci0KLSAgICBKU1BTZWFyY2hQYXJ0aWNpcGFudCBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpIHsKLQotICAgICAgICBpZiAodGhpcy5mUGFydGljaXBhbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRoaXMuZlBhcnRpY2lwYW50ID0gbmV3IEpTUFNlYXJjaFBhcnRpY2lwYW50KCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmZQYXJ0aWNpcGFudDsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGlzIGNhbGxlZCBmcm9tIEpTUFBhdGhJbmRleGVyCi0gICAgLy8gcGFfVE9ETwotICAgIC8vaG93IGNhbiB3ZSBtYWtlIHN1cmUgcGFydGljaXBhbnQgaW5kZXhMb2NhdGlvbnMgYXJlIHVwZGF0ZWQgYXQgc3RhcnR1cD8KLSAgICBwdWJsaWMgZmluYWwgSVBhdGggY29tcHV0ZUluZGV4TG9jYXRpb24oSVBhdGggY29udGFpbmVyUGF0aCkgewotCi0gICAgICAgIElQYXRoIGluZGV4TG9jYXRpb24gPSBudWxsOwotICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIGluYWR2ZXJ0ZW50bHkgdXNlIGEgSkRUIEluZGV4Ci0gICAgICAgIC8vIHdlIHdhbnQgdG8gYmUgc3VyZSB0byB1c2UgdGhlIEluZGV4IGZyb20gdGhlIEpTUCBsb2NhdGlvbgotICAgICAgICAvL09iamVjdCBvYmogPSBpbmRleExvY2F0aW9ucy5nZXQoY29udGFpbmVyUGF0aCk7Ci0gICAgICAgIC8vaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgIC8vICAgIGluZGV4TG9jYXRpb24gPSAoU3RyaW5nKSBvYmo7Ci0gICAgICAgIC8vfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBpbmRleCBlbnRyeQotICAgICAgICAgICAgU3RyaW5nIHBhdGhTdHJpbmcgPSBjb250YWluZXJQYXRoLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgICAgIHRoaXMuZkNoZWNrc3VtQ2FsY3VsYXRvci5yZXNldCgpOwotICAgICAgICAgICAgdGhpcy5mQ2hlY2tzdW1DYWxjdWxhdG9yLnVwZGF0ZShwYXRoU3RyaW5nLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gTG9uZy50b1N0cmluZyh0aGlzLmZDaGVja3N1bUNhbGN1bGF0b3IuZ2V0VmFsdWUoKSkgKyAiLmluZGV4IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgb25seSBkaWZmZXJlbmNlIGZyb20KLSAgICAgICAgICAgIC8vIEluZGV4TWFuYWdlciNjb21wdXRlSW5kZXhMb2NhdGlvbiguLi4pCi0gICAgICAgICAgICBpbmRleExvY2F0aW9uID0gZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oKS5hcHBlbmQoZmlsZU5hbWUpOwotCi0gICAgICAgICAgICAvLyBwYV9UT0RPIG5lZWQgdG8gYWRkIHRvIGphdmEgcGF0aCB0b28sIHNvIEpEVCBzZWFyY2ggc3VwcG9ydCBrbm93cwotICAgICAgICAgICAgLy8gdGhlcmUgc2hvdWxkIGJlIGEgbm9uIGludGVybmFsIHdheSB0byBkbyB0aGlzLgotICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc3NTY0Ci0gICAgICAgICAgICBKYXZhTW9kZWxNYW5hZ2VyLmdldEluZGV4TWFuYWdlcigpLmluZGV4TG9jYXRpb25zLnB1dChjb250YWluZXJQYXRoLCBpbmRleExvY2F0aW9uKTsKLSAgICAgICAgLy99Ci0gICAgICAgIHJldHVybiBpbmRleExvY2F0aW9uOwotICAgIH0KLQotICAgIC8vIGNvcGllZCBmcm9tIEpEVCBJbmRleE1hbmFnZXIKLSAgICBwdWJsaWMgSVBhdGggZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oKSB7Ci0KLSAgICAgICAgaWYgKHRoaXMuZkpzcFBsdWdpbkxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5mSnNwUGx1Z2luTG9jYXRpb247Ci0KLSAgICAgICAgLy8gQXBwZW5kIHRoZSBmb2xkZXIgbmFtZSAianNwc2VhcmNoIiB0byBrZWVwIHRoZSBzdGF0ZSBsb2NhdGlvbiBhcmVhIGNsZWFuZXIKLSAgICAgICAgSVBhdGggc3RhdGVMb2NhdGlvbiA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoImpzcHNlYXJjaCIpOwotCi0gICAgICAgIC8vIHBhX1RPRE8gd29ya2Fyb3VuZCBmb3IKLSAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyMjY3Ci0gICAgICAgIC8vIGNvcGllZCBmcm9tIEluZGV4TWFuYWdlcgotICAgICAgICBTdHJpbmcgZGV2aWNlID0gc3RhdGVMb2NhdGlvbi5nZXREZXZpY2UoKTsKLSAgICAgICAgaWYgKGRldmljZSAhPSBudWxsICYmIGRldmljZS5jaGFyQXQoMCkgPT0gJy8nKQotICAgICAgICAgICAgc3RhdGVMb2NhdGlvbiA9IHN0YXRlTG9jYXRpb24uc2V0RGV2aWNlKGRldmljZS5zdWJzdHJpbmcoMSkpOwotCi0gICAgICAgIC8vIGVuc3VyZSB0aGF0IGl0IGV4aXN0cyBvbiBkaXNrCi0gICAgICAgIEZpbGUgZm9sZGVyID0gbmV3IEZpbGUoc3RhdGVMb2NhdGlvbi50b09TU3RyaW5nKCkpOwotCQlpZiAoIWZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQl0cnkgewotCQkJCWZvbGRlci5ta2RpcigpOwotCQkJfQotCQkJY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0gICAgICAgIHJldHVybiB0aGlzLmZKc3BQbHVnaW5Mb2NhdGlvbiA9IHN0YXRlTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgZmluYWwgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIGNhbmNlbCkgewotICAgIAkvL1N5c3RlbS5vdXQucHJpbnRsbigic2VhcmNoIHN1cHBvcnQgbW9uaXRvciIgKyBmTW9uaXRvcik7Ci0gICAgICAgIGZNb25pdG9yLnNldENhbmNlbGVkKGNhbmNlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgZmluYWwgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCi0gICAgICAgIHJldHVybiBmTW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQotICAgICAgICByZXR1cm4gdGhpcy5mTW9uaXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0phdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0phdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMDcxNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbjsKLQotCi0vKioKLSAqIFdyYXBwZXIgbWV0aG9kIHRvIHNldCBnZXRQYXRoKCkgcGF0aCB0byBiZSB0aGUgcGF0aCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCAKLSAqIGZvciB0aGUganNwIGZpbGUuIChzaW5jZSBpdCdzIGEgZmluYWwgbWV0aG9kLCBpdCBuZWVkcyB0byBiZSBzZXQgdmlhIGNvbnN0cnVjdG9yKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgZXh0ZW5kcyBTZWFyY2hEb2N1bWVudCB7Ci0JCi0JcHJpdmF0ZSBKU1BTZWFyY2hEb2N1bWVudCBmSlNQU2VhcmNoRG9jID0gbnVsbDsKLQkKLQlwdWJsaWMgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUoSlNQU2VhcmNoRG9jdW1lbnQganNwU2VhcmNoRG9jKSB7Ci0JCQotCQlzdXBlcihqc3BTZWFyY2hEb2MuZ2V0UGF0aCgpLCBqc3BTZWFyY2hEb2MuZ2V0UGFydGljaXBhbnQoKSk7Ci0JCXRoaXMuZkpTUFNlYXJjaERvYyA9IGpzcFNlYXJjaERvYzsKLQl9Ci0KLQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb250ZW50cygpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0Qnl0ZUNvbnRlbnRzKCk7Ci0JfQotCi0JcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudHMoKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldENoYXJDb250ZW50cygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEphdmFUZXh0KCkgewotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEphdmFUZXh0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0RW5jb2RpbmcoKTsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEZpbGUoKTsKLQl9Ci0JCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uIGdldEpzcFRyYW5zbGF0aW9uKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRKU1BUcmFuc2xhdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEpzcE9mZnNldChpbnQgamF2YU9mZnNldCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRKc3BPZmZzZXQoamF2YU9mZnNldCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXRoaXMuZkpTUFNlYXJjaERvYy5yZWxlYXNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9OdWxsU2VhcmNoRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvTnVsbFNlYXJjaERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTlhMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9OdWxsU2VhcmNoRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0b3I7Ci0KLQotCi0vKioKLSAqIEFuIGVtcHR5IHNlcnZsZXQsIHNhZmUgZm9yIEphdmEgc2VhcmNoIHBhcnRpY2lwYXRpb24KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIE51bGxTZWFyY2hEb2N1bWVudCBleHRlbmRzIFNlYXJjaERvY3VtZW50IHsKLQkKLQlTdHJpbmdCdWZmZXIgZkVtcHR5U2VydmxldEJ1ZmZlciA9IG51bGw7Ci0JCi0JcHVibGljIE51bGxTZWFyY2hEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoKSB7Ci0JCXN1cGVyKGRvY3VtZW50UGF0aCwgbmV3IEpTUFNlYXJjaFBhcnRpY2lwYW50KCkpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZkVtcHR5U2VydmxldEJ1ZmZlciA9IG5ldyBKU1BUcmFuc2xhdG9yKCkuZ2V0RW1wdHlUcmFuc2xhdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb250ZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuZkVtcHR5U2VydmxldEJ1ZmZlci50b1N0cmluZygpLmdldEJ5dGVzKCk7Ci0JfQotCQotCXB1YmxpYyBjaGFyW10gZ2V0Q2hhckNvbnRlbnRzKCkgewotCQlyZXR1cm4gdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVTdGF0ZURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVN0YXRlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWU4YTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVN0YXRlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIHJlbWVtYmVyaW5nIG9sZCBhbmQgbmV3IGVtYmVkZGVkIGhhbmRsZXJzLCAKLSAqIGluIHRoZSBldmVudCBhIHJlLWluaXQgaXMgbmVlZGVkLgotICovCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRUeXBlU3RhdGVEYXRhIHsKLQotCi0JRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyOwotCUVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SGFuZGxlcjsKLQotCXB1YmxpYyBFbWJlZGRlZFR5cGVTdGF0ZURhdGEoRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0hhbmRsZXIpIHsKLQkJdGhpcy5vbGRIYW5kbGVyID0gb2xkSGFuZGxlcjsKLQkJdGhpcy5uZXdIYW5kbGVyID0gbmV3SGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXROZXdIYW5kbGVyKCkgewotCQlyZXR1cm4gbmV3SGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRPbGRIYW5kbGVyKCkgewotCQlyZXR1cm4gb2xkSGFuZGxlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0pTUE1vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9KU1BNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2I5MGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0pTUE1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuUGFnZURpcmVjdGl2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudC5ET01Nb2RlbEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUpTUEhlYWRDb250ZW50RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nLkpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSlNQRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUZhbWlseUZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkRlYnVnQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlLlByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgSlNQTW9kZWxMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsTG9hZGVyIHsKLQlwcm90ZWN0ZWQgZmluYWwgaW50IE1BWF9CVUZGRVJFRF9TSVpFX0ZPUl9SRVNFVF9NQVJLID0gMjAwMDAwOwotCi0JLyoqCi0JICogRE1XIC0gTm90ZTogSSB0aGluayB0aGUgZW1iZWRkZWRUeXBlUmVnaXN0cnkgaW4gSU1vZGVsTWFuYWdlciBjYW4gYmUKLQkgKiByZW1vdmVkCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVSZWdpc3RyeSBlbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnk7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTUlNRV9UWVBFID0gInRleHQvaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9MQU5HVUFHRSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEpTUE1vZGVsTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkKLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpIHsKLQkJaWYgKGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQllbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkgPSBFbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCkgewotCQlET01Nb2RlbEZvckpTUCBtb2RlbCA9IG5ldyBET01Nb2RlbEZvckpTUCgpOwotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogRm9yIEpTUCBmaWxlcywgdGV4dC9odG1sIGlzIHRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZS4gVGhpcyBtYXkgd2FudAotCSAqIHRoaXMgZGlmZmVyZW50IGZvciB0eXBlcyBsaWtlIGpzdiAoanNwIGZvciB2b2ljZSB4bWwpIEZvciBub3csIGhhcmQKLQkgKiBjb2RlIHRvIG5ldyBpbnN0YW5jZS4gSW4gZnV0dXJlLCBzaG91bGQgZ2V0IGluc3RhbmNlIGZyb20gcmVnaXN0cnkuCi0JICogCi0JICogU3BlY2lmaWNhdGlvbiBjaXRlcyBIVE1MIGFzIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlLgotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRKU1BEZWZhdWx0RW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJRW1iZWRkZWRUeXBlUmVnaXN0cnkgcmVnID0gZ2V0RW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5KCk7Ci0KLQkJU3RyaW5nIG1pbWVUeXBlID0gbnVsbDsKLQkJLy8gZGVmYXVsdCBlbWJlZGRlZCB0eXBlIGZvciBmcmFnbWVudHMKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKG1vZGVsKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQltaW1lVHlwZSA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQQ09OVEVOVFRZUEUsIGZpbGUsIHRydWUpOwotCQkJfQotCQl9Ci0JCW1pbWVUeXBlID0gbWltZVR5cGUgPT0gbnVsbCA/IGdldERlZmF1bHRNaW1lVHlwZSgpIDogbWltZVR5cGU7Ci0JCXJldHVybiByZWcuZ2V0VHlwZUZvcihtaW1lVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldERlZmF1bHRNaW1lVHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRNaW1lVHlwZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfTUlNRV9UWVBFOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQsIHRoYXQgaGFzCi0JICogYmVlbiBpbml0aWFsaXplZCB3aXRoIGFwcHJvcHJpYXRlIHBhcnNlci4gRm9yIG1hbnkgbG9hZGVycywgdGhlCi0JICogKGRlZmF1bHQpIHBhcnNlciB1c2VkIGlzIGtub3duIGZvciBhbnkgaW5wdXQuIEZvciBvdGhlcnMsIHRoZSBjb3JyZWN0Ci0JICogcGFyc2VyIChhbmQgaXRzIGluaXRpYWxpemF0aW9uKSBpcyBub3JtYWxsIGRlcGVuZGVudCBvbiB0aGUgY29udGVudCBvZgotCSAqIHRoZSBmaWxlLiBUaGlzIG5vLWFyZ3VtZW50IG1ldGhvZCBzaG91bGQgYXNzdW1lICJlbXB0eSBpbnB1dCIgYW5kIHdvdWxkCi0JICogdGhlcmVmb3JlIHJldHVybiB0aGUgZGVmYXVsdCBwYXJzZXIgZm9yIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlLgotCSAqIAotCSAqIElmIHRoZSBwYXJzZXIgaXMgdG8gaGFuZGxlIHRhZyBsaWJyYXJpZXMsIGl0IG11c3QgaGF2ZSBhIFRhZ2xpYlN1cHBvcnQKLQkgKiBvYmplY3Qgd2l0aCBhIHZhbGlkIFVSSVJlc29sdmVyIGFuZCB0aGlzIElTdHJ1Y3R1cmVkRG9jdW1lbnQgYXR0YWNoZWQKLQkgKiB0byBpdCBiZWZvcmUgdGhlIGNvbnRlbnRzIGFyZSBzZXQgb24gdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKG5ldyBKU1BSZVBhcnNlcigpKTsKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50LnNldERvY3VtZW50UGFydGl0aW9uZXIobmV3Ci0JCS8vIEpTUEphdmFEb2N1bWVudFBhcnRpb25lcigpKTsKLQkJLy8gZXZlbiB0aG91Z2ggdGhpcyBpcyBhbiAiZW1wdHkgbW9kZWwiIC4uLiB3ZSB3YW50IGl0IHRvIGhhdmUgYXQKLQkJLy8gbGVhc3QgdGhlCi0JCS8vIGRlZmF1bHQgZW1iZWRkZWRlZCBjb250ZW50IHR5cGUgaGFuZGxlcgotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkVHlwZSA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUobnVsbCk7Ci0JCWVtYmVkZGVkVHlwZS5pbml0aWFsaXplUGFyc2VyKHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCS8vIHJlbWVtYmVyLCB0aGUgTG9hZGVyCi0JCS8vIHdpbGwgbmVlZCB0byBmaW5pc2ggaW5pdGlhbGl6YXRpb24gb2YgcGFyc2VyCi0JCS8vIGJhc2VkIG9uICJlbWJlZGRlZCBjb250ZW50IgotCQlyZXR1cm4gbmV3IEpTUFNvdXJjZVBhcnNlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZUxvYWRBZGFwdChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlzdXBlci5wcmVMb2FkQWRhcHQoc3RydWN0dXJlZE1vZGVsKTsKLQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgc3RydWN0dXJlZE1vZGVsOwotCQkvLwotCQkvLyBkb2N1bWVudCBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIHNldCBmb3IgdGhpcyB0bwotCQkvLyB3b3JrLgotCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZG9jdW1lbnQpOwotCQkvLyBpZiB0aGVyZSBpcyBhIG1vZGVsIGluIHRoZSBhZGFwdGVyLCB0aGlzIHdpbGwgYWRhcHQgaXQgdG8KLQkJLy8gZmlyc3Qgbm9kZS4gQWZ0ZXIgdGhhdCB0aGUgUHJvcGFnYXRpbmdBZGF0ZXIgc3ByZWFkcyBvdmVyIHRoZQotCQkvLyBjaGlsZHJlbiBiZWluZwotCQkvLyBjcmVhdGVkLiBFYWNoIHRpbWUgdGhhdCBoYXBwZW5kcywgYSBzaWRlIGVmZmVjdCBpcyB0bwotCQkvLyBhbHNvICJzcHJlYWQiIHNwcmVjaWZpYyByZWdpc3RlcmVkIGFkYXB0ZXJzLAotCQkvLyB0aGV5IHR3byBjYW4gcHJvcGlnYXRlIGlzIG5lZWRlZC4KLQkJLy8gVGhpcyAnZ2V0JyBjYXVzZXMgZmlyc3QgdG8gYmUgYmUgYXR0YWNoZWQuCi0JCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCS8vIG1heSBtYWtlIHRoaXMgZWFzaWVyIHRvIHVzZSBpbiBmdXR1ZQotCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3IFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeSgpKTsKLQkJaWYgKERlYnVnLmRlYnVnTm90aWZpY2F0aW9uQW5kRXZlbnRzKSB7Ci0JCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3IERlYnVnQWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQkJLy8gRm9yIEpTUHMsIHRoZSBNb2RlbFF1ZXJ5QWRhcHRlciBtdXN0IGJlICJhdHRhY2hlZCIgdG8gdGhlIGRvY3VtZW50Ci0JCS8vIGJlZm9yZSBjb250ZW50IGlzIHNldCBpbiB0aGUgbW9kZWwsIHNvIHRhZ2xpYiBpbml0aXphdGlvbiBjYW4KLQkJLy8gdGFrZSBwbGFjZS4KLQkJKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCS8vCi0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB0aG9zZSBmYWN0b3JpZXMgd2hpY2ggbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUKLQkgKiBzdHJ1Y3R1cmVkTW9kZWwgYmVmb3JlIGNvbnRlbnQgaXMgYXBwbGllZC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJLy8KLQkJZmFjdG9yeSA9IG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IG5ldyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gbmV3IFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IgZ2V0SGVhZFBhcnNlcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gZ2V0Q29udGVudERlc2NyaXB0aW9uKElEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCURvY3VtZW50UmVhZGVyIHJlYWRlciA9IG5ldyBEb2N1bWVudFJlYWRlcihkb2MpOwotCQlyZXR1cm4gZ2V0Q29udGVudERlc2NyaXB0aW9uKHJlYWRlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb250ZW50IGRlc2NyaXB0aW9uIGZvciBhbiBpbnB1dCBzdHJlYW0gQXNzdW1lcyBpdCdzIEpTUAotCSAqIGNvbnRlbnQuIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtIHdoZW4gZmluaXNoZWQuCi0JICogCi0JICogQHBhcmFtIHJlYWRlcgotCSAqIEByZXR1cm4gdGhlIElDb250ZW50RGVzY3JpcHRpb24gZm9yIGluLCBvciBudWxsIGlmIGluIGlzIG51bGwKLQkgKi8KLQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gZ2V0Q29udGVudERlc2NyaXB0aW9uKFJlYWRlciByZWFkZXIpIHsKLQotCQlpZiAocmVhZGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2MgPSBudWxsOwotCQl0cnkgewotCi0JCQlJQ29udGVudFR5cGUgY29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJCWRlc2MgPSBjb250ZW50VHlwZUpTUC5nZXREZXNjcmlwdGlvbkZvcihyZWFkZXIsIElDb250ZW50RGVzY3JpcHRpb24uQUxMKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVzYzsKLQl9Ci0KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCQkJaWYgKCFwYXRoLnRvRmlsZSgpLmV4aXN0cygpICYmIHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRMYW5ndWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExhbmd1YWdlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGZpcnN0IGNoZWNrIHRoZSBtb2RlbCAoZG9jdW1lbnQgaXRzZWxmKSB0byBzZWUgaWYgY29udGFpbnMKLQkJcmVzdWx0ID0gZ2V0TGFuZ3VhZ2VGcm9tU3RydWN0dXJlZERvY3VtZW50KG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJLy8gTm90ZTogaWYgbW9kZWwgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQKLQkJLy8gbGFuZ3VhZ2UsIHdlJ2xsIGV2ZW4gcmV0dXJuIGl0LAotCQkvLyBzaW5jZSB3aG8ga25vd3Mgd2hhdCBmdXR1cmUgaG9sZHMuCi0KLQkJLy8gZ2V0IGRlZmF1bHQgbGFuZ3VhZ2Ugc3BlY2lmaWVkIGluIHByb3BlcnRpZXMgcGFnZQotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShtb2RlbCk7Ci0JCXJlc3VsdCA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQTEFOR1VBR0UsIGZpbGUsIHRydWUpOwotCi0JCS8vIGFsd2F5cyByZXR1cm4gc29tZXRoaW5nCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gREVGQVVMVF9MQU5HVUFHRTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRMYW5ndWFnZUZyb21TdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGFuZ3VhZ2VGcm9tU3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gYmFzY2lhbGx5IHNhbWUgYWxnb3JpdGhtIGFzIGdldCBlbmNvZGluZyBvcgotCQkvLyBnZXQgY29udGVudCB0eXBlIGZyb20gc3RydWN0dXJlZERvY3VtZW50LgotCQlJSlNQSGVhZENvbnRlbnREZXRlY3RvciBsb2NhbEhlYWRQYXJzZXIgPSBnZXRIZWFkUGFyc2VyKCk7Ci0JCS8vIHdlIGNhbiBiZSBhc3N1cmVkIHRoYXQgaXRzIGFscmVhZHkgYmVlbgotCQkvLyBwYXJzZWQuIElmIG5vdCBjYWxsIHBhcnNlSGVhZGVyRm9yUGFnZURpcmVjdGl2ZSgpCi0JCS8vIGJlZm9yZSBjYWxsaW5nIGdldExhbmd1YWdlOwotCQlsb2NhbEhlYWRQYXJzZXIuc2V0KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBsb2NhbEhlYWRQYXJzZXIuZ2V0TGFuZ3VhZ2UoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZQotCQkJLy8gVE9ETyBuZWVkIHRvIHJlY29uc2lkZXIgZGVzaWduIHRvIGF2b2lkCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzICJyZWluaXRpYWxpemUiIHNpbmNlIHRoZXJlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3QgdGhlCi0JICogZGVmYXVsdCBvbmUgYXNzaWduZWQsIGJlZm9yZSB3ZSBzdGFydCBjaGVja2luZyB0aGUgc3RyZWFtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlSW5pdGlhbGl6ZUVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG9sZEVtYmVkZGVkQ29udGVudFR5cGUsIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3RW1iZWRkZWRDb250ZW50VHlwZSkgewotCQkvLyBjaGVjayBwcm9ncmFtIGxvZ2ljCi0JCUFzc2VydC5pc05vdE51bGwob2xkRW1iZWRkZWRDb250ZW50VHlwZSwgIlByb2dyYW0gZXJyb3I6IGludmFsaWQgY2FsbCBkdXJpbmcgbW9kZWwgaW5pdGlhbGl6YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBvbmNlIHdlIGtub3cgdGhlIGVtYmVkZGVkIGNvbnRlbnQgdHlwZSwgd2UgbmVlZCB0byBzZXQgaXQgaW4gdGhlCi0JCS8vIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIC4uLiB0aGUgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gaXMKLQkJLy8gY3JpdGljYWwgaGVyZSwgdGhlIGRvYyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBidXQgaXRzIGNvbnRlbnRzIG5vdAotCQkvLyBzZXQgeWV0LAotCQkvLyBhbmQgYWxsIGZhY3RvcmllcyBtdXN0IGhhdmUgYmVlbiBzZXQgdXAgYWxzby4KLQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSBkb2N1bWVudC5nZXRFeGlzdGluZ0FkYXB0ZXIoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikKLQkJLy8gZG9jdW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gTW9kZWxRdWVyeUFkYXB0ZXIgbW9kZWxRdWVyeUFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikKLQkJLy8gZG9jdW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCW9sZEVtYmVkZGVkQ29udGVudFR5cGUudW5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJb2xkRW1iZWRkZWRDb250ZW50VHlwZS51bmluaXRpYWxpemVQYXJzZXIoc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJLy8gc2luY2UgJ2RvY3VtZW50JyBpcyBub3QgcmVjcmVhdGVkIGluIHRoaXMKLQkJLy8gcmVpbml0IHBhdGgsIHdlIG5lZWQgdG8gcmVtb3ZlIGFsbCBhZGFwdGVycywKLQkJLy8gZXhjZXB0IGZvciB0aGUgcHJvcGFnYXRlZCBhZGFwdGVycyAoaW5jbHVkaW5nIHBhZ2UKLQkJLy8gZGlyZWN0aXZlIGFkYXB0ZXIsIGFuZCBtb2RlbCBxdWVyeSBhZGFwdGVyKS4KLQkJLy8gdG8gYWNjb21wbGlzaCB0aGlzLCB3ZSdsbCBqdXN0IHJlbW92ZSBhbGwsIHRoZW4KLQkJLy8gYWRkIGJhY2sgd2l0aCBhIGNhbGwgdG8gcHJlLWxvYWQgYWRhcHQuCi0JCS8vIGxldCBjbGllbnRzIGRlY2lkZSB0byB1bmxvYWQgYWRhcHRlcnMgZnJvbSBkb2N1bWVudAotCQkvLyBDb2xsZWN0aW9uIG9sZEFkYXB0ZXJzID0gZG9jdW1lbnQuZ2V0QWRhcHRlcnMoKTsKLQkJLy8gSXRlcmF0b3Igb2xkQWRhcHRlcnNJdGVyYXRvciA9IG9sZEFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCS8vIHdoaWxlIChvbGRBZGFwdGVyc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkvLyBJTm9kZUFkYXB0ZXIgb2xkQWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpCi0JCS8vIG9sZEFkYXB0ZXJzSXRlcmF0b3IubmV4dCgpOwotCQkvLyBpZiAob2xkQWRhcHRlciAhPSBwYWdlRGlyZWN0aXZlQWRhcHRlciAmJiBvbGRBZGFwdGVyICE9Ci0JCS8vIHByb3BhZ2F0aW5nQWRhcHRlciAmJiBvbGRBZGFwdGVyICE9IG1vZGVsUXVlcnlBZGFwdGVyKSB7Ci0JCS8vIC8vIERPIE5PVCByZW1vdmUgZGlyZWN0bHkhCi0JCS8vIC8vIGNhbiBjaGFuZ2UgY29udGVudHMgd2hpbGUgaW4gbm90aWZpdHkgbG9vcCEKLQkJLy8gLy9vbGRBZGFwdGVyc0l0ZXJhdG9yLnJlbW92ZSgpOwotCQkvLyBkb2N1bWVudC5yZW1vdmVBZGFwdGVyKG9sZEFkYXB0ZXIpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gRE1XOiBJIGJlbGlldmUgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyBpcyBuZWVkZWQsCi0JCS8vIHNpbmNlIHJlbGVhc2VzIGNhY2hlZCBhZGFwdGVycwotCQkvLyBpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBEb2N1bWVudEltcGwpIHsKLQkJLy8gKChEb2N1bWVudEltcGwpIGRvY3VtZW50KS5yZWxlYXNlRG9jdW1lbnRUeXBlKCk7Ci0JCS8vICgoRG9jdW1lbnRJbXBsKSBkb2N1bWVudCkucmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCS8vIH0KLQkJLy8gcmVtZW1iZXIsIGVtYmVkZGVkIHR5cGUgZmFjdG9yaWVzIGFyZSBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgd2hlbgotCQkvLyBlbWJlZGVkVHlwZSBjaGFuZ2VkCi0JCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldEVtYmVkZGVkVHlwZShuZXdFbWJlZGRlZENvbnRlbnRUeXBlKTsKLQkJLy8gLy8gYnV0IHN0aWxsIG5lZWQgdG8gY2xlYXIgdGhlIHBhZ2UgZGlyZWN0aXZlIHdhdGNoZXJzLCBhbmQgbGV0Ci0JCS8vIHRoZW0gYmUgcmVkaXNjb3ZlcmVkICh3aXRoIG5ldywgYWNjdXJhdGUgbm9kZSBhcyB0YXJnZXQpCi0JCS8vIHBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsZWFyUGFnZVdhdGNoZXJzKCk7Ci0JCWlmIChuZXdFbWJlZGRlZENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQotCQkJLy8gbmVlZCB0byBudWxsIG91dCBvciBlbHNlIE1vZGVsUGFyc2VyQWRhcHRlcgotCQkJLy8gd29uJ3QgZ2V0IHJlaW5pdGlhbGl6ZWQKLQkJCSgoRE9NTW9kZWxJbXBsKSBtb2RlbCkuc2V0TW9kZWxQYXJzZXIobnVsbCk7Ci0KLQkJCW5ld0VtYmVkZGVkQ29udGVudFR5cGUuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCQluZXdFbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVQYXJzZXIoc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQotCQkJLy8gcGFydGl0aW9uZXIgc2V0dXAgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoaXMgbG9hZGVyCi0JCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBkb2N1bWVudFBhcnRpdGlvbmVyID0gc3RydWN0dXJlZERvY3VtZW50LmdldERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQkJCS8vIElTU1VFOiB0aGlzIGxvZ2ljIGlzIGZsYXdlZCwgbm90IHN1cmUgb2Ygb3JpZ2luYWwgaW50ZW50LCBidXQKLQkJCS8vIGFkZGVkIG51bGwvdHlwZSBjaGVja3MgZm9yIHNhZmV0eS4KLQkJCWlmIChkb2N1bWVudFBhcnRpdGlvbmVyICE9IG51bGwgJiYgZG9jdW1lbnRQYXJ0aXRpb25lciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1ApIHsKLQkJCQlpZiAobmV3RW1iZWRkZWRDb250ZW50VHlwZS5nZXRGYW1pbHlJZCgpLmVxdWFscyhDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKSkgewotCQkJCQkoKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1ApIGRvY3VtZW50UGFydGl0aW9uZXIpLnNldEVtYmVkZGVkUGFydGl0aW9uZXIobmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwoKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5ld0VtYmVkZGVkQ29udGVudFR5cGUuZ2V0RmFtaWx5SWQoKS5lcXVhbHMoQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MKSkgewotCQkJCQkoKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1ApIGRvY3VtZW50UGFydGl0aW9uZXIpLnNldEVtYmVkZGVkUGFydGl0aW9uZXIobmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBhZGRpbmcgbGFuZ3VhZ2UgaGVyZSwgaW4gdGhpcyBjb252aWVuZW50IGNlbnRyYWwKLQkJLy8gbG9jYXRpb24sIGJ1dCBzb21lIG9idmlvdXMgcmVuYW1pbmcgb3IgcmVmYWN0b3JpbmcKLQkJLy8gd291bGRuJ3QgaHVydCwgaW4gZnV0dXJlLgotCQkvLyBJIG5lZWRlZCB0byBhZGQgdGhpcyBsYW5ndWFnZSBzZXR0aW5nIGZvciBKU1AgRnJhZ21lbnQgc3VwcG9ydAotCQkvLyBOb3RlOiB0aGlzIGlzIHRoZSBvbmUgdGhhdCBjb3VudHMsIHNpbmNlIGF0IHRoaXMgcG9pbnQsCi0JCS8vIHRoZSBtb2RlbCBoYXMgYW4gSUQsIHNvIHdlIGNhbiBsb29rIHVwIElGaWxlLCBldGMuCi0JCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKG1vZGVsKTsKLQkJaWYgKGxhbmd1YWdlICE9IG51bGwgJiYgbGFuZ3VhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRMYW5ndWFnZShsYW5ndWFnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzICJyZWluaXRpYWxpemUiIHNpbmNlIHRoZXJlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3QgdGhlCi0JICogZGVmYXVsdCBvbmUgYXNzaWduZWQsIGJlZm9yZSB3ZSBzdGFydCBjaGVja2luZyB0aGUgc3RyZWFtCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRDbG9uZU9mRW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIEVtYmVkZGVkVHlwZUhhbmRsZXIgb2xkRW1iZWRkZWRDb250ZW50VHlwZSwgRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdFbWJlZGRlZENvbnRlbnRUeXBlKSB7Ci0JCS8vIGNoZWNrIHByb2dyYW0gbG9naWMKLQkJQXNzZXJ0LmlzTm90TnVsbChvbGRFbWJlZGRlZENvbnRlbnRUeXBlLCAiUHJvZ3JhbSBlcnJvcjogaW52YWxpZCBjYWxsIGR1cmluZyBtb2RlbCBpbml0aWFsaXphdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIG9uY2Ugd2Uga25vdyB0aGUgZW1iZWRkZWQgY29udGVudCB0eXBlLCB3ZSBuZWVkIHRvIHNldCBpdCBpbiB0aGUKLQkJLy8gUGFnZURpcmVjdGl2ZUFkYXB0ZXIgLi4uIHRoZSBvcmRlciBvZiBpbml0aWFsaXphdGlvbiBpcwotCQkvLyBjcml0aWNhbCBoZXJlLCB0aGUgZG9jIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGJ1dCBpdHMgY29udGVudHMgbm90Ci0JCS8vIHNldCB5ZXQsCi0JCS8vIGFuZCBhbGwgZmFjdG9yaWVzIG11c3QgaGF2ZSBiZWVuIHNldCB1cCBhbHNvLgotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBtb2RlbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJLy8gPT0+IC8vIE1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKQotCQkvLyAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJLy8gYmVjYXVzZSwgZXZlbiBpbiB0aGUgY2xvbmUgY2FzZSwgdGhlIG1vZGVsIGhhcyBiZWVuIHBhcml0YWxseQotCQkvLyBpbnRpYWxpemVkIHdpdGgKLQkJLy8gdGhlIG9sZCBlbWJlZGRlZCB0eXBlIChkdXJpbmcgY3JlYXRlTW9kZWwpLCB3ZSBuZWVkIHRvIHVuaXRpYWxpemUKLQkJLy8gcGFydHMgb2YgaXQsIGJhc2VkIG9uIHRoZSBvbGQgKG9yIGRlZmF1bHQpIG9uZXMKLQkJb2xkRW1iZWRkZWRDb250ZW50VHlwZS51bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQlvbGRFbWJlZGRlZENvbnRlbnRUeXBlLnVuaW5pdGlhbGl6ZVBhcnNlcihzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQkvLyByZW1lbWJlciwgZW1iZWRkZWQgdHlwZSBmYWN0b3JpZXMgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCB3aGVuCi0JCS8vIGVtYmVkZWRUeXBlIGNoYW5nZWQKLQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0RW1iZWRkZWRUeXBlKG5ld0VtYmVkZGVkQ29udGVudFR5cGUpOwotCQlpZiAobmV3RW1iZWRkZWRDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQluZXdFbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQkJbmV3RW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplUGFyc2VyKHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCX0KLQkJLy8gYWRkaW5nIGxhbmd1YWdlIGhlcmUsIGluIHRoaXMgY29udmllbmVudCBjZW50cmFsCi0JCS8vIGxvY2F0aW9uLCBidXQgc29tZSBvYnZpb3VzIHJlbmFtaW5nIG9yIHJlZmFjdG9yaW5nCi0JCS8vIHdvdWxkbid0IGh1cnQsIGluIGZ1dHVyZS4KLQkJLy8gSSBuZWVkZWQgdG8gYWRkIHRoaXMgbGFuZ3VhZ2Ugc2V0dGluZyBmb3IgSlNQIEZyYWdtZW50IHN1cHBvcnQKLQkJLy8gTm90ZTogdGhpcyBpcyB0aGUgb25lIHRoYXQgY291bnRzLCBzaW5jZSBhdCB0aGlzIHBvaW50LAotCQkvLyB0aGUgbW9kZWwgaGFzIGFuIElELCBzbyB3ZSBjYW4gbG9vayB1cCBJRmlsZSwgZXRjLgotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZShtb2RlbCk7Ci0JCWlmIChsYW5ndWFnZSAhPSBudWxsICYmIGxhbmd1YWdlLmxlbmd0aCgpID4gMCkgewotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCURvY3VtZW50IGRvYyA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZEhhbmRsZXIgPSBwYWdlRGlyZWN0aXZlQWRhcHRlci5nZXRFbWJlZGRlZFR5cGUoKTsKLQkJcmV0dXJuIGVtYmVkZGVkSGFuZGxlcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWxMb2FkZXIjaW5pdEVtYmVkZGVkVHlwZVByZShvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RW1iZWRkZWRUeXBlUHJlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJSlNQTW9kZWxMb2FkZXIudGhpcy5pbml0RW1iZWRkZWRUeXBlUHJlKG1vZGVsLCBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZVByZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCi0JCS8vIG5vdGU6IHRoaXMgd2lsbCBjdXJyZW50bHkgb25seSB3b3JrIGZvciBtb2RlbHMgYmFja2VkIGJ5IGZpbGVzCi0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRDb250ZW50VHlwZSA9IG51bGw7Ci0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCi0JCWlmIChlbWJlZGRlZENvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzYyA9IGdldENvbnRlbnREZXNjcmlwdGlvbihzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCU9iamVjdCBwcm9wID0gbnVsbDsKLQotCQkJCXByb3AgPSBkZXNjLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9GQU1JTFlfQVRUUklCVVRFKTsKLQkJCQlpZiAocHJvcCAhPSBudWxsKSB7Ci0JCQkJCWlmIChDb250ZW50VHlwZUZhbWlseUZvckhUTUwuSFRNTF9GQU1JTFkuZXF1YWxzKHByb3ApKSB7Ci0JCQkJCQllbWJlZGRlZENvbnRlbnRUeXBlID0gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCkuZ2V0VHlwZUZvcigidGV4dC9odG1sIik7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoZW1iZWRkZWRDb250ZW50VHlwZSA9PSBudWxsKSB7Ci0KLQkJCQkJcHJvcCA9IGRlc2MuZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX1RZUEVfQVRUUklCVVRFKTsKLQkJCQkJaWYgKHByb3AgIT0gbnVsbCkgewotCQkJCQkJZW1iZWRkZWRDb250ZW50VHlwZSA9IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpLmdldFR5cGVGb3IoKFN0cmluZykgcHJvcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0KLQkJaWYgKGVtYmVkZGVkQ29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0RW1iZWRkZWRUeXBlKGVtYmVkZGVkQ29udGVudFR5cGUpOwotCQkJZW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHVzZSBkZWZhdWx0IGVtYmVkZGVkVHlwZSBpZiBpdCBjb3VsZG4ndCBkZXRlcm1pbmUgb25lCi0JCQllbWJlZGRlZENvbnRlbnRUeXBlID0gZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZShtb2RlbCk7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRFbWJlZGRlZFR5cGUoZW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCQllbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZVBvc3QoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkvLyBzaG91bGQgYWxyZWFkeSBiZSBpbml0aWFsaXplZCAoZnJvbSBpbml0RW1iZWRkZWRUeXBlUHJlKQotCQkvLyB2aWEgSUNvbnRlbnREZXNjcmlwdGlvbgotCQlzZXRMYW5ndWFnZUluUGFnZURpcmVjdGl2ZShtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQXMgcGFydCBvZiB0aGUgbW9kZWwgY2xvbmluZyBwcm9jZXNzLCBlbnN1cmUgdGhhdCB0aGUgbmV3IG1vZGVsIGhhcyB0aGUKLQkgKiBzYW1lIGVtYmVkZGVkIGNvbnRlbnQgdHlwZSBoYW5kbGVyIGFzIHRoZSBvbGQgbW9kZWwsIGFuZCB0aGF0IGl0IGlzCi0JICogcHJvcGVybHkgaW5pdGlhbGl6ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBleGlzdGluZ0VtYmVkZGVkVHlwZSA9IGdldEVtYmVkZGVkVHlwZShvbGRNb2RlbCk7Ci0JCWlmIChleGlzdGluZ0VtYmVkZGVkVHlwZSA9PSBudWxsKSB7Ci0JCQlpbml0RW1iZWRkZWRUeXBlUHJlKG5ld01vZGVsLCBuZXdNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQlpbml0RW1iZWRkZWRUeXBlUG9zdChuZXdNb2RlbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0VtYmVkZGVkQ29udGVudFR5cGUgPSBleGlzdGluZ0VtYmVkZGVkVHlwZS5uZXdJbnN0YW5jZSgpOwotCQkJLy8gaW5pdEVtYmVkZGVkVHlwZShuZXdNb2RlbCk7Ci0JCQlpbml0Q2xvbmVPZkVtYmVkZGVkVHlwZShuZXdNb2RlbCwgZXhpc3RpbmdFbWJlZGRlZFR5cGUsIG5ld0VtYmVkZGVkQ29udGVudFR5cGUpOwotCQkJc2V0TGFuZ3VhZ2VJblBhZ2VEaXJlY3RpdmUobmV3TW9kZWwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFuZ3VhZ2VJblBhZ2VEaXJlY3RpdmUoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQlpZiAobmV3TW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBuZXdNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKG5ld01vZGVsKTsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldExhbmd1YWdlKGxhbmd1YWdlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgb2xkSGFuZGxlciA9IG51bGw7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SGFuZGxlciA9IG51bGw7Ci0JCU9iamVjdCByZWluaXRTdGF0ZURhdGEgPSBtb2RlbC5nZXRSZWluaXRpYWxpemVTdGF0ZURhdGEoKTsKLQkJaWYgKHJlaW5pdFN0YXRlRGF0YSBpbnN0YW5jZW9mIEVtYmVkZGVkVHlwZVN0YXRlRGF0YSkgewotCQkJRW1iZWRkZWRUeXBlU3RhdGVEYXRhIG9sZFN0YXRlRGF0YSA9IChFbWJlZGRlZFR5cGVTdGF0ZURhdGEpIHJlaW5pdFN0YXRlRGF0YTsKLQkJCW9sZEhhbmRsZXIgPSBvbGRTdGF0ZURhdGEuZ2V0T2xkSGFuZGxlcigpOwotCQkJbmV3SGFuZGxlciA9IG9sZFN0YXRlRGF0YS5nZXROZXdIYW5kbGVyKCk7Ci0JCQkvLyBub3RlLiBXZSBzaG91bGQgYWxyZWFkeSBoYXZlIHRoZSBuZXcgaGFuZGxlciBpbiB0aGUgbW9kZWwncwotCQkJLy8gKGRvY3VtZW50cykgYWRhcHRlcnMsCi0JCQkvLyBzbyBuZWVkIG5lZWQgdG8gdXNlIHRoZSBvbGQgb25lIHRvIHVuZG8gdGhlIG9sZCBzdGF0ZSBkYXRhCi0JCQlyZUluaXRpYWxpemVFbWJlZGRlZFR5cGUobW9kZWwsIG9sZEhhbmRsZXIsIG5ld0hhbmRsZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gZm9yIGxhbmd1YWdlIC4uLiB3ZSBzb21lZGF5IE1JR0hUIGhhdmUgdG8gZG8gc29tZXRoaW5nCi0JCQkvLyBoZXJlLCBidXQgZm9yIG5vdywgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9kZWwtc2lkZSBsYW5ndWFnZQotCQkJLy8gc2Vuc2l0aXZlIGFkYXB0ZXJzLgotCQl9Ci0JCXJldHVybiBzdXBlci5yZWluaXRpYWxpemUobW9kZWwpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgSlNQTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlpZiAoZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbmV3IEpTUERvY3VtZW50TG9hZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IGFuIElucHV0U3RyZWFtIGhhcyBtYXJrL3Jlc2V0IHN1cHBvcnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRNYXJrU3VwcG9ydGVkU3RyZWFtKElucHV0U3RyZWFtIG9yaWdpbmFsKSB7Ci0JCWlmIChvcmlnaW5hbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvcmlnaW5hbC5tYXJrU3VwcG9ydGVkKCkpCi0JCQlyZXR1cm4gb3JpZ2luYWw7Ci0JCXJldHVybiBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShvcmlnaW5hbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJ5dGVbXSBnZXRCeXRlcyhJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IG1heCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIHNtYWxsQnVmZmVyID0gbmV3IGJ5dGVbbWF4XTsKLQkJYnl0ZVtdIHJldHVybkJ1ZmZlciA9IG51bGw7Ci0JCWludCBuUmVhZCA9IGlucHV0U3RyZWFtLnJlYWQoc21hbGxCdWZmZXIsIDAsIG1heCk7Ci0JCWlmIChuUmVhZCA8IG1heCkgewotCQkJLy8gZW1wdHkgZmlsZSB3aWxsIHJldHVybiAtMTsKLQkJCWlmIChuUmVhZCA8IDApCi0JCQkJblJlYWQgPSAwOwotCQkJYnl0ZVtdIHNtYWxsZXJCdWZmZXIgPSBuZXcgYnl0ZVtuUmVhZF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNtYWxsQnVmZmVyLCAwLCBzbWFsbGVyQnVmZmVyLCAwLCBuUmVhZCk7Ci0JCQlyZXR1cm5CdWZmZXIgPSBzbWFsbGVyQnVmZmVyOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuQnVmZmVyID0gc21hbGxCdWZmZXI7Ci0JCX0KLQkJcmV0dXJuIHJldHVybkJ1ZmZlcjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBzdXBlci5jcmVhdGVNb2RlbChvbGRNb2RlbCk7Ci0JCS8vIEZvciBKU1BzLCB0aGUgTW9kZWxRdWVyeUFkYXB0ZXIgbXVzdCBiZSAiYXR0YWNoZWQiIHRvIHRoZSBkb2N1bWVudAotCQkvLyBiZWZvcmUgY29udGVudCBpcyBzZXQgaW4gdGhlIG1vZGVsLCBzbyB0YWdsaWIgaW5pdGlhbGl6YXRpb24gY2FuCi0JCS8vIHRha2UgcGxhY2UuCi0JCS8vIEluIHRoaXMgImNsb25lIG1vZGVsIiBjYXNlLCB3ZSBjcmVhdGUgYSBNb2RlbFF1ZXJ5IGFkYXB0ZXIKLQkJLy8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIGZyb20gdGhlIG9sZCBkYXRhLiBOb3RlOiBJIHRoaW5rIHRoaXMKLQkJLy8gImZvcmNlZCBmaXQiIG9ubHkgd29ya3MgaGVyZSBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24gb2YKLQkJLy8gTW9kZWxRdWVyeUFkYXB0ZXIgZG9lcyBub3QKLQkJLy8gaGF2ZSB0byBiZSByZWxlYXNlZC4KLQotCQlNb2RlbFF1ZXJ5QWRhcHRlciBtb2RlbFF1ZXJ5QWRhcHRlciA9IGdldE1vZGVsUXVlcnlBZGFwdGVyKG1vZGVsKTsKLQkJaWYgKG1vZGVsUXVlcnlBZGFwdGVyID09IG51bGwpIHsKLQkJCW1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIob2xkTW9kZWwpOwotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJZG9jdW1lbnQuYWRkQWRhcHRlcihuZXcgSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsKG1vZGVsUXVlcnlBZGFwdGVyLmdldENNRG9jdW1lbnRDYWNoZSgpLCBtb2RlbFF1ZXJ5QWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCksIG1vZGVsUXVlcnlBZGFwdGVyLmdldElkUmVzb2x2ZXIoKSkpOwotCi0JCX0KLQotCi0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXByaXZhdGUgTW9kZWxRdWVyeUFkYXB0ZXIgZ2V0TW9kZWxRdWVyeUFkYXB0ZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0KLQkJTW9kZWxRdWVyeUFkYXB0ZXIgbW9kZWxRdWVyeUFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQlyZXR1cm4gbW9kZWxRdWVyeUFkYXB0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTc0NjM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nLkpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSlNQRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuVGFnVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlckZvckpTUCBleHRlbmRzIEFic3RyYWN0TW9kZWxIYW5kbGVyIHsKLQotCS8qKgotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbgotCSAqIGF0IHJ1biB0aW1lIHdpdGggd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0Jc3RhdGljIFN0cmluZyBBc3NvY2lhdGVkQ29udGVudFR5cGVJRCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbgotCSAqIGF0IHJ1biB0aW1lIHdpdGggd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1vZGVsSGFuZGxlcklEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5tb2RlbGhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBNb2RlbEhhbmRsZXJGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldElkKE1vZGVsSGFuZGxlcklEKTsKLQkJc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEpTUFRhZ05hbWUoSlNQU291cmNlUGFyc2VyIHBhcnNlciwgU3RyaW5nIHRhZ25hbWUpIHsKLQkJQmxvY2tNYXJrZXIgYm0gPSBuZXcgQmxvY2tNYXJrZXIodGFnbmFtZSwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIHRydWUpOwotCQlwYXJzZXIuYWRkQmxvY2tNYXJrZXIoYm0pOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNQTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IEpTUERvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuc3VyZVRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoSVN0cnVjdHVyZWRNb2RlbCBzbSkgewotCQlpZiAoc20uZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpID09IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBDaGVjayBmb3IgdGFnL3RhZ3ggZmlsZXMsIG90aGVyd2lzZSBhZGQgdGhlIEpTUCB0cmFuc2xhdGlvbgotCQkJICogZmFjdG9yeSBmb3IgYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBwb3NzaWJsZSBzdWJ0eXBlcwotCQkJICogb2YgSlNQLgotCQkJICovCi0JCQlJQ29udGVudFR5cGUgdGhpc0NvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoc20uZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQkJSUNvbnRlbnRUeXBlIHRhZ0NvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUFRBRyk7Ci0JCQlpZiAodGhpc0NvbnRlbnRUeXBlLmlzS2luZE9mKHRhZ0NvbnRlbnRUeXBlKSkgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBUYWdUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJc20uZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0vLwkJCQlpZiAoZmFsc2UpIHsKLS8vCQkJCQlJQ29udGVudFR5cGUgdGV4dENvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoSUNvbnRlbnRUeXBlTWFuYWdlci5DVF9URVhUKTsKLS8vCQkJCQlJQ29udGVudFR5cGUganNwQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLS8vCQkJCQkvKgotLy8JCQkJCSAqIFRoaXMgSUFkYXB0ZXJNYW5hZ2VyIGNhbGwgaXMgdGVtcG9yYXJ5IHBsYWNlaG9sZGVyIGNvZGUKLS8vCQkJCQkgKiB0aGF0IHNob3VsZCBub3QgYmUgcmVsaWVkIHVwb24gaW4gYW55IHdheSEKLS8vCQkJCQkgKi8KLS8vCQkJCQlpZiAodGhpc0NvbnRlbnRUeXBlLmlzS2luZE9mKGpzcENvbnRlbnRUeXBlKSkgewotLy8JCQkJCQlJQ29udGVudFR5cGUgdGVzdENvbnRlbnRUeXBlID0gdGhpc0NvbnRlbnRUeXBlOwotLy8JCQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGhvbGRGYWN0b3J5ID0gbnVsbDsKLS8vCQkJCQkJd2hpbGUgKCF0ZXN0Q29udGVudFR5cGUuZXF1YWxzKHRleHRDb250ZW50VHlwZSkgJiYgaG9sZEZhY3RvcnkgPT0gbnVsbCkgewotLy8JCQkJCQkJaG9sZEZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRlc3RDb250ZW50VHlwZS5nZXRJZCgpLCBJSlNQVHJhbnNsYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKLS8vCQkJCQkJCXRlc3RDb250ZW50VHlwZSA9IHRlc3RDb250ZW50VHlwZS5nZXRCYXNlVHlwZSgpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJZmFjdG9yeSA9IG5ldyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJfQotCi0JCQkJc20uZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvclRhZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjVmNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJGb3JUYWcgZXh0ZW5kcyBNb2RlbEhhbmRsZXJGb3JKU1AgewotCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLm1vZGVsaGFuZGxlci50YWciOyAvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBNb2RlbEhhbmRsZXJGb3JUYWcoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldElkKE1vZGVsSGFuZGxlcklEKTsKLQkJc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFnTW9kZWxMb2FkZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9UYWdNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvVGFnTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzZGE3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9UYWdNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgVGFnTW9kZWxMb2FkZXIgZXh0ZW5kcyBKU1BNb2RlbExvYWRlciB7Ci0KLQlwdWJsaWMgVGFnTW9kZWxMb2FkZXIoKSB7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJTGlzdCBmYWN0b3JpZXMgPSBzdXBlci5nZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0JCS8qCi0JCSAqIFJlcGxhY2UgdGhlIGRlZmF1bHQgSlNQIG1vZGVsIHF1ZXJ5IGJ5IHVzaW5nIG91ciBvd24gZmFjdG9yeQotCQkgKi8KLQotCQlJdGVyYXRvciBpID0gZmFjdG9yaWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJaWYgKCgoSU5vZGVBZGFwdGVyRmFjdG9yeSkgaS5uZXh0KCkpLmlzRmFjdG9yeUZvclR5cGUoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQkJaS5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCi0JCWZhY3Rvcmllcy5hZGQobmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclRhZygpKTsKLQkJcmV0dXJuIGZhY3RvcmllczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTBlNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0KLQotcHVibGljIGNsYXNzIEpTUE1vZGVsUXVlcnlBZGFwdGVySW1wbCBleHRlbmRzIE1vZGVsUXVlcnlBZGFwdGVySW1wbCB7Ci0JcHVibGljIEpTUE1vZGVsUXVlcnlBZGFwdGVySW1wbChDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlLCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnksIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIoY21Eb2N1bWVudENhY2hlLCBtb2RlbFF1ZXJ5LCBpZFJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjg5ZjVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5TaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBleHRlbmRzIFNpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsUXVlcnlDTVByb3ZpZGVyCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUNNUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgSlNQTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKG5ldyBKU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUNNUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjc3YTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkpTUENNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5Q01Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIENNRG9jdW1lbnQgcHJvdmlkZXIgZm9yIEhUTUwgYW5kIEpTUCBkb2N1bWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlciBpbXBsZW1lbnRzIE1vZGVsUXVlcnlDTVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBKU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDTURvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERPTSBOb2RlLiBvciBudWxsIGlmIG5vCi0JICogQ01Eb2N1bWVudCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIERPTSBOb2RlLgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSkgewotCQlDTURvY3VtZW50IGpjbWRvYyA9IG51bGw7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlET01Nb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldE1vZGVsKCk7Ci0JCQlTdHJpbmcgbW9kZWxQYXRoID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQlpZiAobW9kZWxQYXRoICE9IG51bGwgJiYgIUlNb2RlbE1hbmFnZXIuVU5NQU5BR0VEX01PREVMLmVxdWFscyhtb2RlbFBhdGgpKSB7Ci0JCQkJZmxvYXQgdmVyc2lvbiA9IERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5nZXRJbnN0YW5jZSgpLmdldEpTUFZlcnNpb24obmV3IFBhdGgobW9kZWxQYXRoKSk7Ci0JCQkJamNtZG9jID0gSlNQQ01Eb2N1bWVudEZhY3RvcnkuZ2V0Q01Eb2N1bWVudCh2ZXJzaW9uKTsKLQkJCX0KLQkJfQotCQlpZiAoamNtZG9jID09IG51bGwpIHsKLQkJCWpjbWRvYyA9IEpTUENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoKTsKLQkJfQotCQkKLQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBlbGVtZW50TmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQotCQkJCS8vIHRlc3QgdG8gc2VlIGlmIHRoaXMgbm9kZSBiZWxvbmdzIHRvIEpTUCdzIENNRG9jdW1lbnQgKGNhc2UKLQkJCQkvLyBzZW5zaXRpdmUpCi0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBqY21kb2MuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0oZWxlbWVudE5hbWUpOwotCQkJCWlmIChkZWMgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBqY21kb2M7Ci0JCQkJfQotCQkJfQotCi0JCQlTdHJpbmcgcHJlZml4ID0gbm9kZS5nZXRQcmVmaXgoKTsKLQotCQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgbm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJLy8gY2hlY2sgcG9zaXRpb24gZGVwZW5kZW50Ci0JCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCQlUTERDTURvY3VtZW50TWFuYWdlciB0bGRtZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKHhtbE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCWlmICh0bGRtZ3IgIT0gbnVsbCkgewotCQkJCQlMaXN0IGRvY3VtZW50cyA9IHRsZG1nci5nZXRDTURvY3VtZW50VHJhY2tlcnMobm9kZS5nZXRQcmVmaXgoKSwgeG1sTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJLy8gdGhlcmUgc2hvdWxkbid0IGJlIG1vcmUgdGhhbiBvbmUgY21kb2N1bWVudCByZXR1cm5lZAotCQkJCQlpZiAoZG9jdW1lbnRzICE9IG51bGwgJiYgZG9jdW1lbnRzLnNpemUoKSA+IDApCi0JCQkJCQlyZXN1bHQgPSAoQ01Eb2N1bWVudCkgZG9jdW1lbnRzLmdldCgwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMDA0NzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5KU1BDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMjBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBNb2RlbFF1ZXJ5RXh0ZW5zaW9ufSBmb3IgSlNQIHRhZ3MgaW4gSlNQIGRvY3VtZW50cwotICovCi1wdWJsaWMgY2xhc3MgSlNQTW9kZWxRdWVyeUV4dGVuc2lvbiBleHRlbmRzIE1vZGVsUXVlcnlFeHRlbnNpb24gewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSlNQX1JPT1QgPSAianNwOnJvb3QiOwotCi0JLyoqCi0JICogT3JpZ2luYWxseSB0YWtlbiBmcm9tIEpTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3IKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbiNnZXRBdmFpbGFibGVFbGVtZW50Q29udGVudChvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIENNTm9kZVtdIGdldEF2YWlsYWJsZUVsZW1lbnRDb250ZW50KEVsZW1lbnQgcGFyZW50RWxlbWVudCwKLQkJCVN0cmluZyBuYW1lc3BhY2UsIGludCBpbmNsdWRlT3B0aW9ucykgewotCQkKLQkJQ01Ob2RlW10gbm9kZXMgPSBFTVBUWV9DTU5PREVfQVJSQVk7Ci0JCUFycmF5TGlzdCBub2RlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vb25seSByZXR1cm5zIGFueXRoaW5nIGlmIGxvb2tpbmcgZm9yIGNoaWxkIG5vZGVzCi0JCWlmKCgoaW5jbHVkZU9wdGlvbnMgJiBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVMpICE9IDApICYmIHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSlwYXJlbnRFbGVtZW50OwotCQkJLy8gZ2V0IHBvc2l0aW9uIGRlcGVuZGVudCBDTURvY3VtZW50cyBhbmQgaW5zZXJ0IHRoZWlyIHRhZ3MgYXMKLQkJCS8vIHByb3Bvc2FscwotCQkJTW9kZWxRdWVyeUFkYXB0ZXIgbXFBZGFwdGVyID0gbnVsbDsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJbXFBZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSBub2RlLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkJfSBlbHNlIHsKLQkJCQltcUFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpICgoSURPTU5vZGUpIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJCX0KLQotCQkJaWYgKG1xQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJQ01Eb2N1bWVudCBkb2MgPSBtcUFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpLmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KG5vZGUpOwotCQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCQlDTURvY3VtZW50IGpjbWRvYyA9IGdldERlZmF1bHRKU1BDTURvY3VtZW50KG5vZGUpOwotCQkJCQlDTU5hbWVkTm9kZU1hcCBqc3BlbGVtZW50cyA9IGpjbWRvYy5nZXRFbGVtZW50cygpOwotCi0JCQkJCS8qIEZvciBhIGJ1aWx0LWluIEpTUCBhY3Rpb24gdGhlIGNvbnRlbnQgbW9kZWwgaXMgcHJvcGVybHkKLQkJCQkJICogc2V0IHVwLCBzbyBkb24ndCBqdXN0IGJsaW5kbHkgYWRkIHRoZSByZXN0LS11bmxlc3MgdGhpcwotCQkJCQkgKiB3aWxsIGJlIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBkb2N1bWVudAotCQkJCQkgKi8KLQkJCQkJaWYgKGpzcGVsZW1lbnRzICE9IG51bGwgJiYgKCEoZG9jIGluc3RhbmNlb2YgSlNQQ01Eb2N1bWVudCkgfHwgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCQkJCUxpc3QgcmVqZWN0RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCQkJCS8vIGRldGVybWluZSBpZiB0aGUgZG9jdW1lbnQgaXMgaW4gWE1MIGZvcm0KLQkJCQkJCURvY3VtZW50IGRvbURvYyA9IG51bGw7Ci0JCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQkJCWRvbURvYyA9IChEb2N1bWVudCkgbm9kZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZG9tRG9jID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIFNob3cgWE1MIHRhZyBmb3JtcyBvZiBKU1AgbWFya2VycyBpZiBqc3A6cm9vdCBpcwotCQkJCQkJLy8gdGhlIGRvY3VtZW50IGVsZW1lbnQgT1IgaXQncyBIVE1MIGJ1dAotCQkJCQkJLy8gaXNuJ3QgcmVhbGx5IGluIHRoZSB0ZXh0LgotCQkJCQkJLy8gSWYgdGhlIGRvY3VtZW50IGlzbid0IHN0cmljdGx5IFhNTCwgcHVsbCBvdXQgdGhlCi0JCQkJCQkvLyBYTUwgdGFnIGZvcm1zIGl0IGlzIHhtbCBmb3JtYXQKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFRMRVQpOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVYUFJFU1NJT04pOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRFQ0xBUkFUSU9OKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfSU5DTFVERSk7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1BBR0UpOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRFWFQpOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUcpOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9BVFRSSUJVVEUpOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9WQVJJQUJMRSk7Ci0JCQkJCQlpZiAoaXNYTUxGb3JtYXQoZG9tRG9jKSkgewotCQkJCQkJCS8vIGpzcCBhY3Rpb25zCi0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZBTExCQUNLKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTik7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkdFVFBST1BFUlRZKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VUUFJPUEVSVFkpOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTkNMVURFKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9SV0FSRCk7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBMVUdJTik7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZBTExCQUNLKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU0pOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTVMpOwotCQkJCQkJfQotCi0KLQkJCQkJCS8vIGRvbid0IHNob3cganNwOnJvb3QgaWYgYSBkb2N1bWVudCBlbGVtZW50IGFscmVhZHkKLQkJCQkJCS8vIGV4aXN0cwotCQkJCQkJRWxlbWVudCBkb2NFbGVtZW50ID0gZG9tRG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQkJaWYgKGRvY0VsZW1lbnQgIT0gbnVsbCAmJigoZG9jRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscyhUQUdfSlNQX1JPT1QpKSB8fAotCQkJCQkJCQkoKCgoSURPTU5vZGUpIGRvY0VsZW1lbnQpLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCB8fAotCQkJCQkJCQkJCSgoSURPTU5vZGUpIGRvY0VsZW1lbnQpLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpKSkpIHsKLQkJCQkJCQkKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUk9PVCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwganNwZWxlbWVudHMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBqc3BlbGVtZW50cy5pdGVtKGopOwotCQkJCQkJCWlmICghcmVqZWN0RWxlbWVudHMuY29udGFpbnMoZWQuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJCQkJbm9kZUxpc3QuYWRkKGVkKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBObyBjbSBkb2N1bWVudCAoc3VjaCBhcyBmb3IgdGhlIERvY3VtZW50IChhIG5vbi1FbGVtZW50KSBub2RlIGl0c2VsZikKLQkJCQllbHNlIHsKLQkJCQkJQ01OYW1lZE5vZGVNYXAganNwRWxlbWVudHMgPSBnZXREZWZhdWx0SlNQQ01Eb2N1bWVudChub2RlKS5nZXRFbGVtZW50cygpOwotCQkJCQlpbnQgbGVuZ3RoID0ganNwRWxlbWVudHMuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCW5vZGVMaXN0LmFkZChqc3BFbGVtZW50cy5pdGVtKGkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJbm9kZXMgPSAoQ01Ob2RlW10pbm9kZUxpc3QudG9BcnJheShuZXcgQ01Ob2RlW25vZGVMaXN0LnNpemUoKV0pOwotCQl9Ci0JCQotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCQotCS8qKgotCSAqIDxwPkZvciBKU1AgZmlsZXMgYW5kIHNlZ21lbnRzLCB0aGlzIGlzIGp1c3QgdGhlIEpTUAotCSAqICAgICAgICAgZG9jdW1lbnQsIGJ1dCB3aGVuIGVkaXRpbmcgdGFnIGZpbGVzIGFuZCB0aGVpciBmcmFnbWVudHMsIGl0Ci0JICogICAgICAgICBzaG91bGQgYmUgdGhlIHRhZyBkb2N1bWVudC48L3A+Ci0JICogCi0JICogPHA+SXQgbWF5IGFsc28gdmFyeSBiYXNlZCBvbiB0aGUgbW9kZWwgYmVpbmcgZWRpdGVkIGluIHRoZSBmdXR1cmUuPC9wPgotCSAqIAotCSAqIDxwPjxiPk5PVEU6PC9iPkNvcGllZCBmcm9tIEpTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3I8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IG5vbi1lbWJlZGRlZCBDTURvY3VtZW50IGZvciB0aGUgZG9jdW1lbnQgYmVpbmcKLQkgKiAgICAgICAgIGVkaXRlZC4gCi0JICovCi0JcHJpdmF0ZSBDTURvY3VtZW50IGdldERlZmF1bHRKU1BDTURvY3VtZW50KElET01Ob2RlIG5vZGUpIHsKLQkJQ01Eb2N1bWVudCBqY21kb2MgPSBudWxsOyAKLQkJCi0JCS8vIGhhbmRsZSB0YWcgZmlsZXMgaGVyZQotCQlTdHJpbmcgY29udGVudFR5cGUgPSBub2RlLmdldE1vZGVsKCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0JCWlmIChDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQVEFHLmVxdWFscyhjb250ZW50VHlwZSkpIHsKLQkJCWpjbWRvYyA9ICBKU1BDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5UQUcyMF9ET0NfVFlQRSk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbW9kZWxQYXRoID0gbm9kZS5nZXRNb2RlbCgpLmdldEJhc2VMb2NhdGlvbigpOwotCQkJaWYgKG1vZGVsUGF0aCAhPSBudWxsICYmICFJTW9kZWxNYW5hZ2VyLlVOTUFOQUdFRF9NT0RFTC5lcXVhbHMobW9kZWxQYXRoKSkgewotCQkJCWZsb2F0IHZlcnNpb24gPSBEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRKU1BWZXJzaW9uKG5ldyBQYXRoKG1vZGVsUGF0aCkpOwotCQkJCWpjbWRvYyA9IEpTUENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQodmVyc2lvbik7Ci0JCQl9Ci0JCQlpZiAoamNtZG9jID09IG51bGwpIHsKLQkJCQlqY21kb2MgPSBKU1BDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gamNtZG9jOwotCX0KLQkKLQkvKioKLQkgKiA8cD48Yj5OT1RFOjwvYj5Db3BpZWQgZnJvbSBKU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yPC9wPgotCSAqCi0JICogQHBhcmFtIGRvYyBkZXRlcm1pbmUgaWYgdGhpcyB7QGxpbmsgRG9jdW1lbnR9IGlzIGluIGFuIFhNTCBmb3JtYXQKLQkgKiBAcmV0dXJuIGlzIHRoZSBnaXZlbiBkb2N1bWVudCBpbiBhbiBYTUwgZm9ybWF0Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MRm9ybWF0KERvY3VtZW50IGRvYykgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCUVsZW1lbnQgZG9jRWxlbWVudCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCXJlc3VsdCA9IGRvY0VsZW1lbnQgIT0gbnVsbCAmJgotCQkJCSgoZG9jRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscyhUQUdfSlNQX1JPT1QpKSB8fAotCQkJCQkJKCgoKElET01Ob2RlKSBkb2NFbGVtZW50KS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwgJiYKLQkJCQkJCQkJKChJRE9NTm9kZSkgZG9jRWxlbWVudCkuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWU1NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLk1vZGVsUXVlcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEpTUE1vZGVsUXVlcnlJbXBsIGV4dGVuZHMgTW9kZWxRdWVyeUltcGwgewotCi0JLy8gSVNTVUU6IGpzcE1vZGVsIGRvZXNuJ3Qgc2VlbSB1c2VkPwotCXByb3RlY3RlZCBJU3RydWN0dXJlZE1vZGVsIGpzcE1vZGVsID0gbnVsbDsKLQlwcml2YXRlIEhhc2hNYXAgZW1iZWRkZWRNb2RlbFF1ZXJpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIEpTUE1vZGVsUXVlcnlJbXBsKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB7Ci0JCXN1cGVyKG5ldyBTaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyKG5ldyBKU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlcigpKSk7Ci0JCWpzcE1vZGVsID0gbW9kZWw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZGVsUXVlcnkjZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IHN1cGVyLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgcXVlcnkgPSBnZXRFbWJlZGRlZE1vZGVsUXVlcnkoZWxlbWVudCk7Ci0JCQlpZiAocXVlcnkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZGVsUXVlcnkjZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSkKLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpIHsKLQkJQ01Eb2N1bWVudCBkb2MgPSBzdXBlci5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChub2RlKTsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlNb2RlbFF1ZXJ5IHF1ZXJ5ID0gZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KG5vZGUpOwotCQkJaWYgKHF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlkb2MgPSBxdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZG9jOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2RlbFF1ZXJ5I2dldENNTm9kZShOb2RlKQotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0Q01Ob2RlKE5vZGUgbm9kZSkgewotCQlDTU5vZGUgcmVzdWx0ID0gc3VwZXIuZ2V0Q01Ob2RlKG5vZGUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgcXVlcnkgPSBnZXRFbWJlZGRlZE1vZGVsUXVlcnkobm9kZSk7Ci0JCQlpZiAocXVlcnkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHF1ZXJ5LmdldENNTm9kZShub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbnRlbnQoRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zKSB7Ci0JCU1vZGVsUXVlcnkgZW1xID0gZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KGVsZW1lbnQpOwotCQlpZiAoZW1xICE9IG51bGwpCi0JCQlyZXR1cm4gZW1xLmdldEF2YWlsYWJsZUNvbnRlbnQoZWxlbWVudCwgZWQsIGluY2x1ZGVPcHRpb25zKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldEF2YWlsYWJsZUNvbnRlbnQoZWxlbWVudCwgZWQsIGluY2x1ZGVPcHRpb25zKTsKLQl9Ci0KLQkvLyBJU1NVRTogc2hvdWxkbid0IHRoaXMgYmUgcHJpdmF0ZT8KLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeSBnZXRFbWJlZGRlZE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCU1vZGVsUXVlcnkgZW1iZWRkZWRNb2RlbFF1ZXJ5ID0gbnVsbDsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsgCi0JCQlOb2RlIG93bmVyTm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKG93bmVyTm9kZSA9PSBudWxsKSB7Ci0JCQkJLy8gdGhlbiBtdXN0IGJlIHRoZSBkb2N1bWVudCBpdHNlbGYKLQkJCQlvd25lck5vZGUgPSBub2RlOyAKLQkJCX0KLQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIG93bmVyTm9kZSkuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAocGFnZURpcmVjdGl2ZUFkYXB0ZXIgIT0gbnVsbCkgewotCi0JCQkJU3RyaW5nIGVmZmVjdGl2ZUNvbnRlbnRUeXBlID0gbnVsbDsKLQkJCQlNb2RlbFF1ZXJ5IHBvdGVudGlhbE1vZGVsUXVlcnlPYmplY3QgPSBudWxsOwotCi0JCQkJU3RyaW5nIGZhbWlseUlkID0gcGFnZURpcmVjdGl2ZUFkYXB0ZXIuZ2V0RW1iZWRkZWRUeXBlKCkuZ2V0RmFtaWx5SWQoKTsKLQkJCQlpZiAoQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MLkhUTUxfRkFNSUxZLmVxdWFscyhmYW1pbHlJZCkpIHsKLQkJCQkJZWZmZWN0aXZlQ29udGVudFR5cGUgPSAidGV4dC9odG1sIjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWVmZmVjdGl2ZUNvbnRlbnRUeXBlID0gcGFnZURpcmVjdGl2ZUFkYXB0ZXIuZ2V0Q29udGVudFR5cGUoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcG90ZW50aWFsTW9kZWxRdWVyeU9iamVjdCA9IChNb2RlbFF1ZXJ5KSBlbWJlZGRlZE1vZGVsUXVlcmllcy5nZXQoZWZmZWN0aXZlQ29udGVudFR5cGUpOwotCQkJCQotCQkJCWlmIChwb3RlbnRpYWxNb2RlbFF1ZXJ5T2JqZWN0ID09IG51bGwpIHsKLQkJCQkJTW9kZWxRdWVyeUFkYXB0ZXIgZW1iZWRkZWRBZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSBwYWdlRGlyZWN0aXZlQWRhcHRlci5hZGFwdCgoSU5vZGVOb3RpZmllcikgbm9kZSwgTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkJCQlpZiAoZW1iZWRkZWRBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCS8vIHdlIHdpbGwgY2FjaGUgb25lIG1vZGVsIHF1ZXJ5IHBlciBjb250ZW50IHR5cGUKLQkJCQkJCWVtYmVkZGVkTW9kZWxRdWVyeSA9IGVtYmVkZGVkQWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCk7Ci0JCQkJCQllbWJlZGRlZE1vZGVsUXVlcmllcy5wdXQoZWZmZWN0aXZlQ29udGVudFR5cGUsIGVtYmVkZGVkTW9kZWxRdWVyeSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWVtYmVkZGVkTW9kZWxRdWVyeSA9IHBvdGVudGlhbE1vZGVsUXVlcnlPYmplY3Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbWJlZGRlZE1vZGVsUXVlcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeSNnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKG9yZy53M2MuZG9tLkF0dHIpCi0JICovCi0JcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihBdHRyIGF0dHIpIHsKLQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiByZXN1bHQgPSBzdXBlci5nZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgcXVlcnkgPSBnZXRFbWJlZGRlZE1vZGVsUXVlcnkoYXR0cik7Ci0JCQlpZiAocXVlcnkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHF1ZXJ5LmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogTk9UIEFQSSAtLSB0aGlzIGlzIHByb3ZpZGVkLCBhbmQgaXMgcHVibGljLCBvbmx5IHRvIG1ha2Ugc29tZSBKVW5pdCB0ZXN0aW5nIAotCSAqIG1vcmUgc3RyYWlnaHRmb3J3YXJkLiBJdCB3aWxsIGJlIGNoYW5nZWQgaW4gZnV0dXJlLCBhbmQgZnJvbSByZWxlYXNlIHRvIHJlbGVhc2UuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnkgaW50ZXJuYWxUZXN0T25seV9nZXRFbWJlZGRlZE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBnZXRFbWJlZGRlZE1vZGVsUXVlcnkobm9kZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDVjMTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuWE1MQ2F0YWxvZ0lkUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEpTUE1vZGVsUXVlcnlBZGFwdGVySW1wbCBtb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBzdGF0ZU5vdGlmaWVyID0gbnVsbDsKLQotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AoKSB7Ci0JCXRoaXMoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyS2V5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICogQHBhcmFtIHJlZ2lzdGVyQWRhcHRlcnMKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQKE9iamVjdCBrZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihrZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQKGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQWRhcHRlciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUC5jcmVhdGVBZGFwdGVyIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1vZGVsUXVlcnlBZGFwdGVySW1wbCA9PSBudWxsKSB7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSB0YXJnZXQ7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHN0YXRlTm90aWZpZXIgPSB4bWxOb2RlLmdldE1vZGVsKCk7Ci0JCQkJaWYgKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJc3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCi0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBtb2RlbC5nZXRSZXNvbHZlcigpOwotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQLi4uIGJhc2VMb2NhdGlvbiA6ICIgKyByZXNvbHZlci5nZXRGaWxlQmFzZUxvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvKioKLQkJCQkgKiBYTUxDYXRhbG9nSWRSZXNvbHZlciBjdXJyZW50bHkgcmVxdWlyZXMgYSBmaWxlc3lzdGVtCi0JCQkJICogbG9jYXRpb24gc3RyaW5nLiBDdXN0b21hcmlseSB0aGlzIHdpbGwgYmUgd2hhdCBpcyBpbiB0aGUKLQkJCQkgKiBkZXByZWNhdGVkIFNTRSBVUklSZXNvbHZlciBhbmQgcmVxdWlyZWQgYnkgdGhlIENvbW1vbiBVUkkKLQkJCQkgKiBSZXNvbHZlci4KLQkJCQkgKi8KLQkJCQlVUklSZXNvbHZlciBpZFJlc29sdmVyID0gbnVsbDsKLQkJCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJCQlpZFJlc29sdmVyID0gbmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKHJlc29sdmVyLmdldEZpbGVCYXNlTG9jYXRpb24oKSwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogMjAzNjQ5IC0gdGhpcyBibG9jayBtYXkgYmUgbmVjZXNzYXJ5IGR1ZSB0byBvcmRlcmluZyBvZgotCQkJCQkgKiBzZXR0aW5nIHRoZSByZXNvbHZlciBpbnRvIHRoZSBtb2RlbAotCQkJCQkgKi8KLQkJCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCQkJCVN0cmluZyBtb2RlbHNCYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkJaWYgKG1vZGVsc0Jhc2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlGaWxlIGZpbGUgPSBuZXcgUGF0aChtb2RlbHNCYXNlTG9jYXRpb24pLnRvRmlsZSgpOwotCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQliYXNlTG9jYXRpb24gPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJCQkJSVJlc291cmNlIGRlcml2ZWRSZXNvdXJjZSA9IG51bGw7Ci0JCQkJCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCQkJCQkJZGVyaXZlZFJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGJhc2VQYXRoKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCWRlcml2ZWRSZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChiYXNlUGF0aC5zZWdtZW50KDApKTsKLQkJCQkJCQlJUGF0aCBkZXJpdmVkUGF0aCA9IGRlcml2ZWRSZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCWlmIChkZXJpdmVkUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJCWJhc2VMb2NhdGlvbiA9IGRlcml2ZWRQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlVUkkgdXJpID0gZGVyaXZlZFJlc291cmNlLmdldExvY2F0aW9uVVJJKCk7Ci0JCQkJCQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCQkJCQkJYmFzZUxvY2F0aW9uID0gdXJpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZihiYXNlTG9jYXRpb24gPT0gbnVsbCkgewotCQkJCQkJCWJhc2VMb2NhdGlvbiA9IG1vZGVsc0Jhc2VMb2NhdGlvbjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZFJlc29sdmVyID0gbmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKGJhc2VMb2NhdGlvbiwgbnVsbCk7Ci0JCQkJfQotCi0JCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gY3JlYXRlTW9kZWxRdWVyeShtb2RlbCwgaWRSZXNvbHZlcik7Ci0JCQkJbW9kZWxRdWVyeS5zZXRFZGl0TW9kZShNb2RlbFF1ZXJ5LkVESVRfTU9ERV9VTkNPTlNUUkFJTkVEKTsKLQkJCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwgPSBuZXcgSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsKG5ldyBDTURvY3VtZW50Q2FjaGUoKSwgbW9kZWxRdWVyeSwgaWRSZXNvbHZlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeSBjcmVhdGVNb2RlbFF1ZXJ5KElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB7Ci0JCXJldHVybiBuZXcgSlNQTW9kZWxRdWVyeUltcGwobW9kZWwsIHJlc29sdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsLAotCSAqICAgICAgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwsCi0JICogICAgICBJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCS8vIGlmIG9sZE1vZGVsICE9IG5ld01vZGVsLCBiYWQgdGhpbmdzIG1pZ2h0IGhhcHBlbiB3aXRoIHRoZSBhZGFwdGVyCi0JCXN0YXRlTm90aWZpZXIucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQlzdGF0ZU5vdGlmaWVyID0gbmV3TW9kZWw7Ci0JCXVwZGF0ZVJlc29sdmVyKHN0YXRlTm90aWZpZXIpOwotCQlzdGF0ZU5vdGlmaWVyLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQkJaWYgKHN0YXRlTm90aWZpZXIgIT0gbnVsbCkgewotCQkJc3RhdGVOb3RpZmllci5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJc3RhdGVOb3RpZmllciA9IG51bGw7Ci0JCWlmIChtb2RlbFF1ZXJ5QWRhcHRlckltcGwgIT0gbnVsbCkgewotCQkJbW9kZWxRdWVyeUFkYXB0ZXJJbXBsLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlc29sdmVyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlJRmlsZSBiYXNlRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSkpOwotCQlpZiAoYmFzZUZpbGUgIT0gbnVsbCkgewotCQkJaWYgKGJhc2VGaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChiYXNlTG9jYXRpb24gPT0gbnVsbCAmJiBiYXNlRmlsZS5nZXRMb2NhdGlvblVSSSgpICE9IG51bGwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBiYXNlRmlsZS5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoYmFzZUxvY2F0aW9uID09IG51bGwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBiYXNlRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJfQotCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwuc2V0SWRSZXNvbHZlcihuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCBtb2RlbC5nZXRSZXNvbHZlcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQl1cGRhdGVSZXNvbHZlcihzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yVGFnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOWFiYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5TaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yVGFnIGV4dGVuZHMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQIHsKLQotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JUYWcoKSB7Ci0JfQotCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclRhZyhPYmplY3Qga2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoa2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclRhZyhnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IGNyZWF0ZU1vZGVsUXVlcnkoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLQkJcmV0dXJuIG5ldyBUYWdNb2RlbFF1ZXJ5KG5ldyBTaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyKG5ldyBUYWdNb2RlbFF1ZXJ5Q01Qcm92aWRlcigpKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1RhZ01vZGVsUXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9UYWdNb2RlbFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZWYxY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1RhZ01vZGVsUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlclV0aWxpdHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuTW9kZWxRdWVyeUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vdmFibGVNb2RlbFF1ZXJ5Ow0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50Ow0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOw0KLQ0KLS8qKg0KLSAqIE1vZGVsUXVlcnkgZm9yIEpTUCBUYWcgZmlsZXMuIFByaW9yaXRpemVzIHRoZSBUYWcgY29udGVudCBtb2RlbCBhbmQgYW55DQotICogbG9hZGVkIHRhZyBsaWJyYXJpZXMgaW4gdGhlIG1vZGVsIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtYmVkZGVkIG1vZGVsDQotICogcXVlcnksIGlmIG9uZSBpcyBmb3VuZC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgVGFnTW9kZWxRdWVyeSBleHRlbmRzIE1vZGVsUXVlcnlJbXBsIGltcGxlbWVudHMgTW9kZWxRdWVyeSwgTW92YWJsZU1vZGVsUXVlcnkgew0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgbWltZS10eXBlIGZvciB0aGUgZW1iZWRkZWQgTW9kZWxRdWVyeQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NSU1FVFlQRSA9ICJ0ZXh0L2h0bWwiOw0KLQ0KLQ0KLQkvKioNCi0JICogVGhlIHByZWZpeCB1c2VkIHdpdGggUHJvamVjdFNjb3BlIHRvIGZpbmQgdGhlIChwb3NzaWJseSB1c2VyLXNldCkNCi0JICogZW1iZWRkZWQgbWltZS10eXBlIG9uIGEgLnRhZyBmaWxlLg0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfUFJFRklYID0gImVtYmVkZGVkTWltZVR5cGUvIjsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlUHJlZmVyZW5jZUtleShJUGF0aCBmdWxsUGF0aCkgew0KLQkJcmV0dXJuIFBSRUZFUkVOQ0VfUFJFRklYICsgZnVsbFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKS50b1N0cmluZygpOw0KLQl9DQotDQotCXByaXZhdGUgTW9kZWxRdWVyeSBmRW1iZWRkZWRNb2RlbFF1ZXJ5Ow0KLQ0KLQkvKioNCi0JICogQHBhcmFtIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyDQotCSAqLw0KLQlwdWJsaWMgVGFnTW9kZWxRdWVyeShNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcikgew0KLQkJc3VwZXIobW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIpOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC4NCi0JICogTW9kZWxRdWVyeUltcGwjZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ob3JnLnczYy5kb20uRWxlbWVudCkNCi0JICovDQotCXB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsNCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGNtRWxlbWVudERlY2xhcmF0aW9uID0gc3VwZXIuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7DQotCQlpZiAoY21FbGVtZW50RGVjbGFyYXRpb24gPT0gbnVsbCkgew0KLQkJCU1vZGVsUXVlcnkgZW1iZWRkZWRNb2RlbFF1ZXJ5ID0gZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KGVsZW1lbnQpOw0KLQkJCWlmIChlbWJlZGRlZE1vZGVsUXVlcnkgIT0gbnVsbCkgew0KLQkJCQlyZXR1cm4gZW1iZWRkZWRNb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBjbUVsZW1lbnREZWNsYXJhdGlvbjsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuDQotCSAqIE1vZGVsUXVlcnlJbXBsI2dldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KG9yZy53M2MuZG9tLk5vZGUpDQotCSAqLw0KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpIHsNCi0JCUNNRG9jdW1lbnQgZG9jdW1lbnQgPSBzdXBlci5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChub2RlKTsNCi0JCWlmIChkb2N1bWVudCA9PSBudWxsKSB7DQotCQkJTW9kZWxRdWVyeSBlbWJlZGRlZE1vZGVsUXVlcnkgPSBnZXRFbWJlZGRlZE1vZGVsUXVlcnkobm9kZSk7DQotCQkJaWYgKGVtYmVkZGVkTW9kZWxRdWVyeSAhPSBudWxsKSB7DQotCQkJCXJldHVybiBlbWJlZGRlZE1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGRvY3VtZW50Ow0KLQl9DQotDQotCXByaXZhdGUgU3RyaW5nIGdldEVtYmVkZGVkTWltZVR5cGUoTm9kZSBub2RlKSB7DQotCQlTdHJpbmcgdHlwZSA9IERFRkFVTFRfTUlNRVRZUEU7DQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7DQotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldE1vZGVsKCk7DQotCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOw0KLQkJCWlmICghYmFzZUxvY2F0aW9uLmVxdWFscyhJTW9kZWxNYW5hZ2VyLlVOTUFOQUdFRF9NT0RFTCkpIHsNCi0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7DQotCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgew0KLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpOw0KLQkJCQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsNCi0JCQkJCQlTdHJpbmcga2V5ID0gY3JlYXRlUHJlZmVyZW5jZUtleShwYXRoKTsNCi0JCQkJCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KS5nZXROb2RlKEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsNCi0JCQkJCQl0eXBlID0gcHJlZmVyZW5jZXMuZ2V0KGtleSwgREVGQVVMVF9NSU1FVFlQRSk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gdHlwZTsNCi0JfQ0KLQ0KLQlwcml2YXRlIE1vZGVsUXVlcnkgZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KE5vZGUgbm9kZSkgew0KLQkJaWYgKGZFbWJlZGRlZE1vZGVsUXVlcnkgPT0gbnVsbCkgew0KLQkJCVN0cmluZyBlbWJlZGRlZE1pbWVUeXBlID0gZ2V0RW1iZWRkZWRNaW1lVHlwZShub2RlKTsNCi0JCQlpZiAoZW1iZWRkZWRNaW1lVHlwZSAhPSBudWxsKSB7DQotCQkJCUVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRDb250ZW50VHlwZUhhbmRsZXIgPSBNb2RlbEhhbmRsZXJVdGlsaXR5LmdldEVtYmVkZGVkQ29udGVudFR5cGVGb3IoZW1iZWRkZWRNaW1lVHlwZSk7DQotCQkJCWlmIChlbWJlZGRlZENvbnRlbnRUeXBlSGFuZGxlciAhPSBudWxsKSB7DQotCQkJCQlMaXN0IGFkYXB0ZXJGYWN0b3JpZXMgPSBlbWJlZGRlZENvbnRlbnRUeXBlSGFuZGxlci5nZXRBZGFwdGVyRmFjdG9yaWVzKCk7DQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJGYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsNCi0JCQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3Rvcmllcy5nZXQoaSk7DQotCQkJCQkJaWYgKGZhY3RvcnkuaXNGYWN0b3J5Rm9yVHlwZShNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcykpIHsNCi0JCQkJCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBmYWN0b3J5LmFkYXB0KChJTm9kZU5vdGlmaWVyKSBub2RlLmdldE93bmVyRG9jdW1lbnQoKSk7DQotCQkJCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgTW9kZWxRdWVyeUFkYXB0ZXIpIHsNCi0JCQkJCQkJCWZFbWJlZGRlZE1vZGVsUXVlcnkgPSAoKE1vZGVsUXVlcnlBZGFwdGVyKSBhZGFwdGVyKS5nZXRNb2RlbFF1ZXJ5KCk7DQotCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gZkVtYmVkZGVkTW9kZWxRdWVyeTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW92YWJsZU1vZGVsUXVlcnkjc2V0SWRSZXNvbHZlcihvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdVUklSZXNvbHZlcikgew0KLQkJZkVtYmVkZGVkTW9kZWxRdWVyeSA9IG51bGw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1RhZ01vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvVGFnTW9kZWxRdWVyeUNNUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyMGU4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvVGFnTW9kZWxRdWVyeUNNUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIENNRG9jdW1lbnQgcHJvdmlkZXIgZm9yIEhUTUwgYW5kIEpTUCBkb2N1bWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdNb2RlbFF1ZXJ5Q01Qcm92aWRlciBpbXBsZW1lbnRzIE1vZGVsUXVlcnlDTVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBUYWdNb2RlbFF1ZXJ5Q01Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDTURvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERPTSBOb2RlLiBvciBudWxsIGlmIG5vCi0JICogQ01Eb2N1bWVudCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIERPTSBOb2RlLgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSkgewotCQlDTURvY3VtZW50IHRhZ2RvYyA9IEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5UQUcyMF9ET0NfVFlQRSk7Ci0KLQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBlbGVtZW50TmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQotCQkJCS8vIHRlc3QgdG8gc2VlIGlmIHRoaXMgbm9kZSBiZWxvbmdzIHRvIEpTUCdzIENNRG9jdW1lbnQgKGNhc2UKLQkJCQkvLyBzZW5zaXRpdmUpCi0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSB0YWdkb2MuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0oZWxlbWVudE5hbWUpOwotCQkJCWlmIChkZWMgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSB0YWdkb2M7Ci0JCQkJfQotCQkJfQotCi0JCQlTdHJpbmcgcHJlZml4ID0gbm9kZS5nZXRQcmVmaXgoKTsKLQotCQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgbm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJLy8gY2hlY2sgcG9zaXRpb24gZGVwZW5kZW50Ci0JCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCQlUTERDTURvY3VtZW50TWFuYWdlciB0bGRtZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKHhtbE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCWlmICh0bGRtZ3IgIT0gbnVsbCkgewotCQkJCQlMaXN0IGRvY3VtZW50cyA9IHRsZG1nci5nZXRDTURvY3VtZW50VHJhY2tlcnMobm9kZS5nZXRQcmVmaXgoKSwgeG1sTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJLy8gdGhlcmUgc2hvdWxkbid0IGJlIG1vcmUgdGhhbiBvbmUgY21kb2N1bWVudCByZXR1cm5lZAotCQkJCQlpZiAoZG9jdW1lbnRzICE9IG51bGwgJiYgIWRvY3VtZW50cy5pc0VtcHR5KCkpCi0JCQkJCQlyZXN1bHQgPSAoQ01Eb2N1bWVudCkgZG9jdW1lbnRzLmdldCgwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0vLyAyMDQ5OTAgLSBKU1AvV2ViIFBhZ2UgRWRpdG9yczogdGFnIGZpbGVzIGRvIG5vdCBzdXBwb3J0IGNvbnRlbnQgYXNzaXN0IG9uIGh0bWwgZWxlbWVudCBhdHRyaWJ1dGVzCi0vLwkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0vLwkJCXJlc3VsdCA9IHRhZ2RvYzsKLS8vCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1RhZ2xpYk1vZGVsUXVlcnlFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9UYWdsaWJNb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZThjMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1RhZ2xpYk1vZGVsUXVlcnlFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVGFnbGliVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBNb2RlbFF1ZXJ5RXh0ZW5zaW9ufSBmb3IgdGFnIGxpYnJhcmllcyBpbiBKU1AgZG9jdW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGV4dGVuZHMgTW9kZWxRdWVyeUV4dGVuc2lvbiB7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uLk1vZGVsUXVlcnlFeHRlbnNpb24jZ2V0QXZhaWxhYmxlRWxlbWVudENvbnRlbnQob3JnLnczYy5kb20uRWxlbWVudCwgamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBDTU5vZGVbXSBnZXRBdmFpbGFibGVFbGVtZW50Q29udGVudChFbGVtZW50IHBhcmVudEVsZW1lbnQsCi0JCQlTdHJpbmcgbmFtZXNwYWNlLCBpbnQgaW5jbHVkZU9wdGlvbnMpIHsKLQkJCi0JCUNNTm9kZVtdIG5vZGVzID0gRU1QVFlfQ01OT0RFX0FSUkFZOwotCQlBcnJheUxpc3Qgbm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvL29ubHkgcmV0dXJucyBhbnl0aGluZyBpZiBsb29raW5nIGZvciBjaGlsZCBub2RlcwotCQlpZigoKGluY2x1ZGVPcHRpb25zICYgTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTKSAhPSAwKSAmJiBwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSURPTUVsZW1lbnQpIHsKLQkJCS8vZ2V0IHRoZSB0cmFja2VycwotCQkJSURPTUVsZW1lbnQgZWxlbSA9IChJRE9NRWxlbWVudClwYXJlbnRFbGVtZW50OwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3REb2MgPSBlbGVtLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlUTERDTURvY3VtZW50TWFuYWdlciBtYW5hZ2VyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihzdHJ1Y3REb2MpOwotCi0JCQlpZihtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlMaXN0IHRyYWNrZXJzID0gbmV3IEFycmF5TGlzdChtYW5hZ2VyLmdldFRhZ2xpYlRyYWNrZXJzKCkpOwotCQkJCQotCQkJCS8vZm9yIGVhY2ggdHJhY2tlciBhZGQgZWFjaCBvZiBpdHMgZWxlbWVudHMgdG8gdGhlIG5vZGUgbGlzdAotCQkJCWZvcihpbnQgdHJhY2tlckluZGV4ID0gMDsgdHJhY2tlckluZGV4IDwgdHJhY2tlcnMuc2l6ZSgpOyArK3RyYWNrZXJJbmRleCkgewotCQkJCQlDTU5hbWVkTm9kZU1hcCBlbGVtZW50cyA9ICgoVGFnbGliVHJhY2tlcil0cmFja2Vycy5nZXQodHJhY2tlckluZGV4KSkuZ2V0RWxlbWVudHMoKTsKLQkJCQkJZm9yKGludCBlbGVtZW50SW5kZXggPSAwOyBlbGVtZW50SW5kZXggPCBlbGVtZW50cy5nZXRMZW5ndGgoKTsgKytlbGVtZW50SW5kZXgpIHsKLQkJCQkJCW5vZGVMaXN0LmFkZChlbGVtZW50cy5pdGVtKGVsZW1lbnRJbmRleCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCW5vZGVzID0gKENNTm9kZVtdKW5vZGVMaXN0LnRvQXJyYXkobmV3IENNTm9kZVtub2RlTGlzdC5zaXplKCldKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG5vZGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2M2E3MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dC5YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBKU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZXh0ZW5kcyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCS8qKgotCSAqIEpTUERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gVGhpcyBpcyBhIGxhbmd1YWdlIHNwZWNpZmljIG1ldGhvZCAoZS5nLiBIVE1MLCBKYXZhLCBQcm9sb2csIGV0Yy4pIHNvCi0JLy8gY291bGQvc2hvdWxkIGJlIG1hZGUgY29uZmlndXJhYmxlLgotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0bm9kZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BSZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQUmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiMDY0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BSZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMVRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQ29yZU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpTUFJlUGFyc2VyIGV4dGVuZHMgWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgewotCi0JLyoqCi0JICogQWxsb3cgYSByZXBhcnNlciB0byBjaGVjayBmb3IgZXh0cmEgc3ludGFjdGljIGNhc2VzIHRoYXQgcmVxdWlyZQotCSAqIHBhcnNpbmcgYmV5b25kIHRoZSBmbGF0Tm9kZSBib3VuZGFyeS4KLQkgKiAKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFkZHMgSlNQIGxhbmd1YWdlIG1hcmtlcnMgKGNvbW1lbnRzIGFyZSBoYW5kbGVkCi0JICogZWxzZXdoZXJlKS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblN5bnRheCgpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gc3VwZXIuY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblN5bnRheCgpOwotCQkvLyBOb25lIG9mIHRoZSBzdXBlcmNsYXNzJyBjYXNlcyB3ZXJlIHZhbGlkLCBzbyBjaGVjayBmb3IgSlNQIGNhc2VzCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2hlY2tGb3JKU1AoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEEgY2hhbmdlIHRvIGEgSlNQIHRhZyBjYW4gcmVzdWx0IGluIGFsbCBiZWluZyByZXBhcnNlZC4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9ySlNQKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8JSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwlPSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwlISIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIiU+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIElmIGEgY29tbWVudCBzdGFydCBvciBlbmQgdGFnIGlzIGJlaW5nIGFkZGVkIG9yIGRlbGV0ZWQsIHdlJ2xsIHJlc2NhbgotCSAqIHRoZSB3aG9sZSBkb2N1bWVudC4gVGhlIHJlYXNvbiBpcyB0aGF0IGNvbnRlbnQgdGhhdCBpcyByZXZlYWxlZCBvcgotCSAqIGNvbW1lbnRlZCBvdXQgY2FuIGVmZmVjdCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHJlc3Qgb2YgdGhlCi0JICogZG9jdW1lbnQuIE5vdGU6IGZvciBub3cgdGhpcyBpcyB2ZXJ5IFhNTC9KU1Agc3BlY2lmaWMsIGNhbgotCSAqIHJlZmFjdG9yL2ltcHJvdmUgbGF0ZXIuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ29tbWVudHMoKSB7Ci0KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gc3VwZXIuY2hlY2tGb3JDb21tZW50cygpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwlLS0iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCItLSU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gd2UnbGwgYWxzbyBjaGVjayBmb3IgdGhlc2UgZGVnZW5lcmF0ZSBjYXNlcwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8JS0tLSU+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSBjb3JlIHJlcGFyc2luZyBtZXRob2QgLi4uIGFmdGVyIHRoZSBkaXJ0eSBzdGFydCBhbmQgZGlydHkgZW5kIGhhdmUKLQkgKiBiZWVuIGNhbGN1bGF0ZWQgZWxzZXdoZXJlLiAtIHRoaXMgbWV0aG9kIG92ZXJyaWRlcywgZG9lcyBub3QgZXh0ZW5kCi0JICogc3VwZXIncyBtZXRob2QuIGNoYW5nZXMvZml4ZXMgdG8gc3VwZXIgbWF5IGhhdmUgdG8gYmUgbWFkZSBoZXJlIGFzCi0JICogd2VsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IHJlc2NhblN0YXJ0ID0gLTE7Ci0JCWludCByZXNjYW5FbmQgPSAtMTsKLQkJYm9vbGVhbiBmaXJzdFRpbWUgPSBmYWxzZTsKLQkJYm9vbGVhbiBkZXRlY3RlZEJyZWFraW5nQ2hhbmdlID0gZmFsc2U7Ci0KLQkJLy8KLQkJLy8gInNhdmUiIHRoZSBvbGROb2RlcyAodGhhdCBtYXkgYmUgcmVwbGFjZWQpIGluIGEgbGlzdAotCQlDb3JlTm9kZUxpc3Qgb2xkTm9kZXMgPSBmb3JtT2xkTm9kZXMoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCi0JCWlmIChjb250YWluc0JyZWFraW5nQ2hhbmdlKG9sZE5vZGVzKSB8fCBpc0JyZWFraW5nV2l0aE5lc3RlZFRhZyhkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCkpIHsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1RhZ2xpYnMpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXBhcnNlOiBpcyB0YWdsaWIgb3IgaW5jbHVkZSIpOyAvLyROT04tTkxTLTEkCi0JCQlkZXRlY3RlZEJyZWFraW5nQ2hhbmdlID0gdHJ1ZTsKLQkJCXJlc2NhblN0YXJ0ID0gMDsKLQkJCXJlc2NhbkVuZCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgKyBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCW9sZE5vZGVzID0gZm9ybU9sZE5vZGVzKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJY2xlYXJUYWdsaWJJbmZvKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZGlydHlTdGFydCA9PSBudWxsIHx8IGRpcnR5RW5kID09IG51bGwpIHsKLQkJCS8vIGRpcnR5U3RhcnQgb3IgZGlydHkgZW5kIGFyZSBudWxsLCB0aGVuIHRoYXQgbWVhbnMgd2UgZGlkbid0Ci0JCQkvLyBoYXZlIGEKLQkJCS8vIGNhY2hlZCBub2RlLCB3aGljaCBtZWFucyB3ZSBoYXZlIGFuIGVtcHR5IGRvY3VtZW50LCBzbyB3ZQotCQkJLy8ganVzdCBuZWVkIHRvIHJlc2NhbiB0aGUgY2hhbmdlcwotCQkJcmVzY2FuU3RhcnQgPSAwOwotCQkJcmVzY2FuRW5kID0gZkNoYW5nZXMubGVuZ3RoKCk7Ci0JCQlmaXJzdFRpbWUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2V0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byByZXNjYW4KLQkJCXJlc2NhblN0YXJ0ID0gZGlydHlTdGFydC5nZXRTdGFydCgpOwotCQkJLy8KLQkJCS8vIHNldCB0aGUgZW5kIG9mIHRoZSB0ZXh0IHRvIHJlc2NhbgotCQkJLy8gbm90aWNlIHdlIHVzZSB0aGUgc2FtZSByYXRpb25hbGUgYXMgZm9yIHRoZSByZXNjYW5TdGFydCwKLQkJCS8vIHdpdGggdGhlIGFkZGVkIGNhdmVhdCB0aGF0IGxlbmd0aCBoYXMgdG8gYmUgYWRkZWQgdG8gaXQsCi0JCQkvLyB0byBjb21wZW5zYXRlIGZvciB0aGUgbmV3IHRleHQgd2hpY2ggaGFzIGJlZW4gYWRkZWQgb3IgZGVsZXRlZC4KLQkJCS8vIElmIGNoYW5nZXMgaGFzIHplcm8gbGVuZ3RoLCB0aGVuICJsZW5ndGgiIHdpbGwgYmUgbmVnYXRpdmUsCi0JCQkvLyBzaW5jZQotCQkJLy8gd2UgYXJlIGRlbGV0aW5nIHRleHQuIE90aGVyd2lzZSwgdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLQkJCS8vIHdoYXQncyBzZWxlY3RlZCB0byBiZSByZXBsYWNlZCBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgbmV3IHRleHQuCi0JCQlyZXNjYW5FbmQgPSBkaXJ0eUVuZC5nZXRFbmQoKSArIGZMZW5ndGhEaWZmZXJlbmNlOwotCQl9Ci0KLQkJLy8gbm93IHRoYXQgd2UgaGF2ZSB0aGUgb2xkIHN0dWZmICJzYXZlZCIgYXdheSwgdXBkYXRlIHRoZSBkb2N1bWVudAotCQkvLyB3aXRoIHRoZSBjaGFuZ2VzLgotCQlmU3RydWN0dXJlZERvY3VtZW50LnVwZGF0ZURvY3VtZW50RGF0YShmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UsIGZDaGFuZ2VzKTsKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tIG5vdyB0aGUgcmVhbCB3b3JrCi0JCXJlc3VsdCA9IGNvcmVfcmVwYXJzZShyZXNjYW5TdGFydCwgcmVzY2FuRW5kLCBvbGROb2RlcywgZmlyc3RUaW1lKTsKLQkJLy8KLQotCQkvLyBpZiB3ZSBkaWQgbm90IGRldGVjdCBhIGJyZWFraW5nIHR5cGUgb2YgY2hhbmdlIGF0IHRoZSBiZWdpbm5pbmcsCi0JCS8vIGJ1dAotCQkvLyBkbyBub3csIHRoZW4gcmVwYXJzZSBhbGwhIElmIHdlIGRpZCBkZXRlY3QgdGhlbSwgdGhlbiB3ZSBtYXkgb3IgbWF5Ci0JCS8vIG5vdCBkZXRlY3QgYWdhaW4sIGJ1dCBwcmVzdW1hYmx5IHdlJ3ZlIGFscmVhZHkgc2V0IHVwIHRvIHJlLXBhcnNlZAotCQkvLyBldmVydGhpbmcsIHNvIG5vIG5lZWQgdG8gZG8gYWdhaW4uCi0JCWlmICgoIWRldGVjdGVkQnJlYWtpbmdDaGFuZ2UpICYmIChjb250YWluc0JyZWFraW5nQ2hhbmdlKG9sZE5vZGVzKSkpIHsKLQkJCWNsZWFyVGFnbGliSW5mbygpOwotCQkJLy8gcmVwYXJzZSBhbGwKLQkJCW9sZE5vZGVzID0gZm9ybU9sZE5vZGVzKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJcmVzdWx0ID0gY29yZV9yZXBhcnNlKDAsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCksIG9sZE5vZGVzLCBmaXJzdFRpbWUpOwotCQl9Ci0KLQkJLy8gZXZlbnQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciwgaW5jYXNlIHRoZXJlIGlzCi0JCS8vIHNvbWUgb3B0aW1pemF0aW9uIHRoZXkgY2FuIGRvCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCB0aGUgcmVnaW9ucyBnaXZlbiwgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50cyBvZiBhCi0JICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgY29udGFpbiByZWdpb25zIHRoYXQgY291bGQgYWx0ZXIgdGhlCi0JICogYmVoYXZpb3Igb2YgdGhlIHBhcnNlciBvciB0aGUgcGFyc2luZyBvZiBhcmVhcyBvdXRzaWRlIG9mIHRoZSByZWdpb25zCi0JICogZ2l2ZW4uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtpbmdDaGFuZ2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlLCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlyZXR1cm4gaXNUYWdsaWJPckluY2x1ZGUobm9kZSwgcmVnaW9ucykgfHwgaXNKc3BSb290KHJlZ2lvbnMpOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgdGhlIHJlZ2lvbnMgZ2l2ZW4sIHJlcHJlc2VudGluZyB0aGUgcmVnaW9ucyB0b3VjaGVkIGJ5IGEKLQkgKiB0ZXh0IGNoYW5nZSBoYXZlOiAxKSAuLi5hbiBpbnNlcnRpb24gYXQgdGhlIHRleHRFbmRPZmZzZXQgb2YgYW4KLQkgKiBYTUxfVEFHX09QRU4gdGhhdCdzIGluIGl0J3Mgb3duIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5kIHByZWNlZGVkCi0JICogYnkgYW4gdW5lbmRlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIDIpIC4uLmEgZGVsZXRpb24gaGFwcGVuaW5nIGluCi0JICogYW4gWE1MX0VNUFRZX1RBR19DTE9TRSB0aGF0IGVuZHMgYSBJVGV4dFJlZ2lvbkNvbnRhaW5lciAzKSAuLi5hbgotCSAqIGluc2VydGlvbiBoYXBwZW5pbmcgd2l0aCBhICcgPCcgY2hhcmFjdGVyIHNvbWV3aGVyZSBpbiBhbiBYTUwgYXR0cmlidXRlCi0JICogbmFtZSBvciB2YWx1ZSA0KSAuLi5hIGRlbGV0aW9uIG9mIGEgbm9ybWFsIFhNTF9UQUdfQ0xPU0Ugc2luY2UKLQkgKiBzdWJzZXF1ZW50IHRhZ3MgYmVjb21lIGF0dHJpYnV0ZSB2YWx1ZXMKLQkgKi8KLQotCXByaXZhdGUgYm9vbGVhbiBpc0JyZWFraW5nV2l0aE5lc3RlZFRhZyhib29sZWFuIGNoYW5nZXNJbmNsdWRlQV9sdCwgYm9vbGVhbiBkZWxzSW5jbHVkZUFfZ3QsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzID0gcGFyZW50LmdldFByZXZpb3VzKCk7Ci0JCS8vIGNhc2UgMSB0ZXN0Ci0JCWlmIChwYXJlbnQuZ2V0UmVnaW9ucygpLnNpemUoKSA9PSAxICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gJiYgKHByZXZpb3VzID09IG51bGwgfHwgKCFwcmV2aW91cy5pc0VuZGVkKCkgfHwgcHJldmlvdXMuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQkvLyBjYXNlIDIgdGVzdAotCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uOwotCQkJSVRleHRSZWdpb24gaW50ZXJuYWwgPSBjb250YWluZXIuZ2V0UmVnaW9ucygpLmdldChjb250YWluZXIuZ2V0UmVnaW9ucygpLnNpemUoKSAtIDEpOwotCQkJaWYgKGludGVybmFsLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFICYmIGNvbnRhaW5lci5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDIpCi0JCQkJaW50ZXJuYWwgPSBjb250YWluZXIuZ2V0UmVnaW9ucygpLmdldChjb250YWluZXIuZ2V0UmVnaW9ucygpLnNpemUoKSAtIDIpOwotCQkJaWYgKGludGVybmFsLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIGNhc2UgMyB0ZXN0Ci0JCWlmIChjaGFuZ2VzSW5jbHVkZUFfbHQgJiYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJLy8gY2FzZSA0IHRlc3QKLQkJaWYgKGRlbHNJbmNsdWRlQV9ndCAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgdGhlIHJlZ2lvbnMgZ2l2ZW4sIHJlcHJlc2VudGluZyB0aGUgY29udGVudHMgb2YgYQotCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGluY2x1ZGVzIGEganNwOnJvb3QgdGFnCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSnNwUm9vdChJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlyZXR1cm4gcmVnaW9ucy5zaXplKCkgPiAxICYmIHJlZ2lvbnMuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiAmJiByZWdpb25zLmdldCgxKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUU7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCB0aGUgcmVnaW9ucyBnaXZlbiwgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50cyBvZiBhCi0JICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaW5jbHVkZXMgYSB2YWxpZCB0YWdsaWIgZGlyZWN0aXZlIG9yIGluY2x1ZGUKLQkgKiBkaXJlY3RpdmUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNUYWdsaWJPckluY2x1ZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlLCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlib29sZWFuIHNpemVBbmRUeXBlc01hdGNoID0gKHJlZ2lvbnMuc2l6ZSgpID4gMSkgJiYgKHJlZ2lvbnMuZ2V0KDEpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpICYmIChyZWdpb25zLmdldCgwKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOIHx8IHJlZ2lvbnMuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTik7Ci0JCWlmICghc2l6ZUFuZFR5cGVzTWF0Y2gpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDEpOwotCQlTdHJpbmcgZGlyZWN0aXZlTmFtZSA9IG5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQlyZXR1cm4gc2l6ZUFuZFR5cGVzTWF0Y2ggJiYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVEFHTElCKSB8fCBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLklOQ0xVREUpIHx8IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpIHx8IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyVGFnbGliSW5mbygpIHsKLQkJaWYgKERlYnVnLmRlYnVnVGFnbGlicykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2xlYXJpbmcgdGFnbGliIGluZm8iKTsgLy8kTk9OLU5MUy0xJAotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikKLQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyKSBwYXJzZXIpLnJlc2V0SGFuZGxlcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnNCcmVha2luZ0NoYW5nZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBsaXN0KSB7Ci0JCWJvb2xlYW4gY29udGFpbnMgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGxpc3QuaXRlbShpKTsKLQkJCWlmIChpc0JyZWFraW5nQ2hhbmdlKG5vZGUsIG5vZGUuZ2V0UmVnaW9ucygpKSkgewotCQkJCWNvbnRhaW5zID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbnM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZERpcnR5RW5kKGludCBlbmQpIHsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IHN1cGVyLmZpbmREaXJ0eUVuZChlbmQpOwotCi0JCS8vIGlmIG5vdCB3ZWxsIGZvcm1lZCwgZ2V0IG9uZSBwYXN0LCBpZiBpdHMgbm90IG51bGwKLQotCQkvLyBub3csIGlmIGFueSBvZiB0by1iZS1zY2FubmVkIGZsYXRub2RlcyBhcmUgdGhlIHN0YXJ0IG9mIGEganNwCi0JCS8vIHJlZ2lvbiwgd2UnbGwKLQkJLy8gcmVwYXJzZSBhbGwgdGhlIHdheSB0byB0aGUgZW5kLCB0byBiZSBzdXJlIHdlIGRldGVjdCBlbWJlZGRlZAotCQkvLyByZWdpb25zIChvciBub3QtZW1iZWRkZWQgcmVnaW9ucykgY29ycmVjdGx5LgotCQkvLyBub3RpY2Ugd2UgZG9uJ3QgbmVlZCB0byBkbyBpZiB3ZSdyZSBvbmx5IHByb2Nlc3Npbmcgb25lIG5vZGUuCi0JCS8vIG5vdGljZSB0b28gd2UgaGF2ZSBhIHN0cm9uZyBhc3N1bXB0aW9uIGhlcmUgdGhhdCBkaXJ0eVN0YXJ0IGhhcwotCQkvLyBhbHJlYWR5IGJlZW4gZm91bmQhCi0JCS8vCi0JCS8vIG5vdGUgdGhhdCBkaXJ0eUVuZCBpcyBub3QgY2hlY2tlZCBpbiB0aGUgZG8tYmxvY2sgYmVsb3csIHNvIHdlJ2xsCi0JCS8vIGNoZWNrIGl0IGZpcnN0LgotCQlpZiAoaXNKU1BFbWJlZGRlZFN0YXJ0T3JFbmQocmVzdWx0KSkgewotCQkJcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB3aGVuIGVuZCBub2RlIGFuZCBzdGFydCBub2RlIGFyZSB0aGUgc2FtZSwgd2Ugb25seSBuZWVkIHRoZQotCQkJLy8gYWJvdmUKLQkJCS8vIGNoZWNrLCBvdGhlcndpc2UsIHRoZXJlJ3MgYSBmZXcgY2FzZXMgdGhhdCB3ZSdsbCBzZWFyY2ggdGhlCi0JCQkvLyByZXN0IG9mIHRoZQotCQkJLy8gZmxhdG5vZGVzIG5lZWRsZXNzbHkuCi0JCQlpZiAocmVzdWx0ICE9IGRpcnR5U3RhcnQpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNlYXJjaE5vZGUgPSBkaXJ0eVN0YXJ0OwotCQkJCWRvIHsKLQkJCQkJaWYgKGlzSlNQRW1iZWRkZWRTdGFydE9yRW5kKHNlYXJjaE5vZGUpKSB7Ci0JCQkJCQlyZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2VhcmNoTm9kZSA9IHNlYXJjaE5vZGUuZ2V0TmV4dCgpOwotCQkJCQl9Ci0JCQkJCS8vIGlmIHdlIGdldCB0byB0aGUgY3VycmVudCBkaXJ0eSBlbmQsIG9yIGVuZCBvZgotCQkJCQkvLyBmbGF0bm9kZXMsIHdpdGhvdXQgZmluZGluZyBKU1AgcmVnaW9uIHRoZW4gd2UKLQkJCQkJLy8gZG9uJ3QgbmVlZCB0byBjaGVjayBmdXJ0aGVyCi0JCQkJfQotCQkJCXdoaWxlICgoc2VhcmNoTm9kZSAhPSByZXN1bHQpICYmIChzZWFyY2hOb2RlICE9IG51bGwpKTsKLQkJCX0KLQkJfQotCQkvLyByZXN1bHQgc2hvdWxkIG5ldmVyIGJlIG51bGwsIGJ1dCBjYWNoZWROb2RlIG5lZWRzIHRvIGJlIHByb3RlY3RlZAotCQkvLyBmcm9tIGJlaW5nIGNoYW5nZWQgdG8gbnVsbAotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCWRpcnR5RW5kID0gcmVzdWx0OwotCQlyZXR1cm4gZGlydHlFbmQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtpbmdXaXRoTmVzdGVkVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWJvb2xlYW4gY2hhbmdlc0luY2x1ZGVBX2x0ID0gZkNoYW5nZXMgIT0gbnVsbCAmJiBmQ2hhbmdlcy5pbmRleE9mKCc8JykgPj0gMDsKLQkJYm9vbGVhbiBkZWxzSW5jbHVkZUFfZ3QgPSBmRGVsZXRlZFRleHQgIT0gbnVsbCAmJiBmRGVsZXRlZFRleHQuaW5kZXhPZignPicpID49IDA7Ci0KLQkJLy8gTGlzdCByZWdpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBzdGFydDsKLQkJaW50IGVuZFJlcGxhY2UgPSBmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlOwotCQl3aGlsZSAoZW5kICE9IG51bGwgJiYgbm9kZSAhPSBlbmQuZ2V0TmV4dCgpKSB7Ci0JCQlJdGVyYXRvciBpID0gbm9kZS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKGludGVyc2VjdHMobm9kZSwgcmVnaW9uLCBmU3RhcnQsIGVuZFJlcGxhY2UpKSB7Ci0KLQkJCQkJcmVzdWx0ID0gaXNCcmVha2luZ1dpdGhOZXN0ZWRUYWcoY2hhbmdlc0luY2x1ZGVBX2x0LCBkZWxzSW5jbHVkZUFfZ3QsIG5vZGUsIHJlZ2lvbik7Ci0KLQkJCQkJaWYgKHJlc3VsdCkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJCWlmIChyZXN1bHQpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW50ZXJzZWN0cyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IGxvdywgaW50IGhpZ2gpIHsKLQkJaW50IHN0YXJ0ID0gbm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQlpbnQgZW5kID0gbm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJcmV0dXJuIChlbmQgPj0gbG93ICYmIHN0YXJ0IDw9IGhpZ2gpIHx8IChzdGFydCA8PSBsb3cgJiYgZW5kID49IGxvdykgfHwgKHN0YXJ0IDw9IGhpZ2ggJiYgZW5kID49IGhpZ2gpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBwb3RlbnRpYWxseSBjb3VsZCBiZSBhIGpzcCBlbWJlZGRlZCByZWdpb24uIFRoaW5ncyBsaWtlCi0JICogSlNQIERlY2xhcmF0aW9uIGNhbid0IGJlIGVtYmVkZGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0pTUEVtYmVkZGVkU3RhcnRPckVuZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQlyZXN1bHQgPSAoKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGV4dGVuZHMgc3VwZXIgY2xhc3MgYmVoYXZpb3IKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcnRPZkJsb2NrUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU3RyaW5nIHR5cGUgPSBmbGF0Tm9kZS5nZXRUeXBlKCk7Ci0JCXJlc3VsdCA9ICgodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB8fCBzdXBlci5pc1BhcnRPZkJsb2NrUmVnaW9uKGZsYXROb2RlKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEpTUFJlUGFyc2VyKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHF1aWNrQ2hlY2soKSB7Ci0JCWlmIChjb250YWluc0JyZWFraW5nQ2hhbmdlKG5ldyBDb3JlTm9kZUxpc3QoZGlydHlTdGFydCwgZGlydHlFbmQpKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gc3VwZXIucXVpY2tDaGVjaygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQU291cmNlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BTb3VyY2VQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhZjRmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BTb3VyY2VQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbC5KU1BUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDEyTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkpTUENhcGFibGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuVGFnTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSVJlZ2lvbkNvbXBhcmlibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICogVGFrZXMgaW5wdXQgZnJvbSB0aGUgSlNQVG9rZW5pemVyIGFuZCBjcmVhdGVzIGEgdGFnIGxpc3QKLSAqLwotCi1wdWJsaWMgY2xhc3MgSlNQU291cmNlUGFyc2VyIGV4dGVuZHMgWE1MU291cmNlUGFyc2VyIGltcGxlbWVudHMgSlNQQ2FwYWJsZVBhcnNlciB7Ci0JcHJvdGVjdGVkIGNsYXNzIE5lc3RhYmxlUHJlZml4SGFuZGxlciBpbXBsZW1lbnRzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIsIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24gewotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxuczoiOyAvLyROT04tTkxTLTEkCi0KLQkJLyoqCi0JCSAqIEVuYWJsZXMgYSBUTEQgb3duaW5nIHRoZSBnaXZlbiBwcmVmaXggbG9hZGVkIGZyb20gdGhlIGdpdmVuIFVSSSBhdAotCQkgKiB0aGUgYW5jaG9yRmxhdE5vZGUuIFRoZSBsaXN0IG9mIGFkZGl0aW9uYWxDTURvY3VtZW50cyB3aWxsIGNsYWltIHRvCi0JCSAqIG5vdCBrbm93IGFueSBvZiBpdHMgdGFncyBhdCBwb3NpdGlvbnMgZWFybGllciB0aGFuIHRoYXQKLQkJICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbidzIHBvc2l0aW9uLgotCQkgKiAKLQkJICogRm9yIHRhZ2xpYiBkaXJlY3RpdmVzLCB0aGUgdGFnbGliIGlzIHRoZSBhbmNob3Igd2hpbGUgdGFnbGlicwotCQkgKiByZWdpc3RlcmVkIHRocm91Z2ggaW5jbHVkZSBkaXJlY3RpdmVzIHVzZSB0aGUgcHJpbWFyeSBpbmNsdWRlCi0JCSAqIGRpcmVjdGl2ZSBhcyB0aGVpciBhbmNob3IuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVGb3JUYWdsaWIoU3RyaW5nIHByZWZpeCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JGbGF0Tm9kZSkgewotCQkJaWYgKHByZWZpeCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUxpc3QgdGFnbWFya2VycyA9ICgoSlNQVG9rZW5pemVyKSBnZXRUb2tlbml6ZXIoKSkuZ2V0TmVzdGFibGVQcmVmaXhlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdtYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKCgoVGFnTWFya2VyKSB0YWdtYXJrZXJzLmdldChpKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyhwcmVmaXgpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkoKEpTUFRva2VuaXplcikgZ2V0VG9rZW5pemVyKCkpLmdldE5lc3RhYmxlUHJlZml4ZXMoKS5hZGQobmV3IFRhZ01hcmtlcihwcmVmaXgsIGFuY2hvckZsYXROb2RlKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYUNvcmVGbGF0Tm9kZSkgewotCQkJLy8gY291bGQgdGVzdCA+IDEsIGJ1dCBzaW5jZSB3ZSBvbmx5IGNhcmUgaWYgdGhlcmUgYXJlIDggKDwlQCwKLQkJCS8vIHRhZ2xpYiwgdXJpLCA9LCB3aGVyZSwgcHJlZml4LCA9LCB3aGF0KSBbb3IgNCBmb3IgaW5jbHVkZXNdCi0JCQlpZiAoYUNvcmVGbGF0Tm9kZS5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDQgJiYgYUNvcmVGbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lID0gYUNvcmVGbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCXRyeSB7Ci0JCQkJCWludCBvZmZzZXQgPSBhQ29yZUZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KG5hbWUpOwotCQkJCQlpbnQgbGVuZ3RoID0gbmFtZS5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCWJvb2xlYW4gdGFnbGliZGV0ZWN0ZWQgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiB0YWdsaWJkaXJlY3RpdmVkZXRlY3RlZCA9IGZhbHNlOwotCQkJCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSBpbnN0YW5jZW9mIElSZWdpb25Db21wYXJpYmxlKSB7Ci0JCQkJCQl0YWdsaWJkZXRlY3RlZCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIGZDaGFyU2VxdWVuY2VTb3VyY2UpLnJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBsZW5ndGgsIEpTUDEyVExETmFtZXMuVEFHTElCKTsKLQkJCQkJCXRhZ2xpYmRpcmVjdGl2ZWRldGVjdGVkID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgZkNoYXJTZXF1ZW5jZVNvdXJjZSkucmVnaW9uTWF0Y2hlcyhvZmZzZXQsIGxlbmd0aCwgSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBvbGQgZmFzaGlvbmVkIHdheQotCQkJCQkJU3RyaW5nIGRpcmVjdGl2ZU5hbWUgPSBnZXRUZXh0KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCXRhZ2xpYmRldGVjdGVkID0gZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UQUdMSUIpOwotCQkJCQkJdGFnbGliZGlyZWN0aXZlZGV0ZWN0ZWQgPSBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKTsKLQkJCQkJfQotCQkJCQlib29sZWFuIHByb2Nlc3NEaXJlY3RpdmVOYW1lID0gdGFnbGliZGV0ZWN0ZWQgfHwgdGFnbGliZGlyZWN0aXZlZGV0ZWN0ZWQ7Ci0JCQkJCWlmIChwcm9jZXNzRGlyZWN0aXZlTmFtZSkgewotCQkJCQkJcHJvY2Vzc1RhZ2xpYihhQ29yZUZsYXROb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzaW9vYkV4YykgewotCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJfQotCQkJfQotCQkJLy8gY291bGQgdGVzdCA+IDEsIGJ1dCBzaW5jZSB3ZSBvbmx5IGNhcmUgaWYgdGhlcmUgYXJlIDUgKDwsCi0JCQkvLyBqc3A6cm9vdCwgeG1sbnM6cHJlZml4LCA9LCB3aGVyZSkKLQkJCWVsc2UgaWYgKGFDb3JlRmxhdE5vZGUuZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiA0ICYmIChhQ29yZUZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSkpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSkgewotCQkJCXByb2Nlc3NKU1BSb290KGFDb3JlRmxhdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0pTUFJvb3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0YWdsaWJGbGF0Tm9kZSkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSB0YWdsaWJGbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlTdHJpbmcgcHJlZml4ID0gbnVsbDsKLQkJCWJvb2xlYW4gdGFnbGliID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gdGFnbGliRmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJCWludCBsZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCi0JCQkJCQlTdHJpbmcgbmFtZSA9IGdldFRleHQob2Zmc2V0LCBsZW5ndGgpOwotCQkJCQkJaWYgKG5hbWUuc3RhcnRzV2l0aChYTUxOUykgJiYgbmFtZS5sZW5ndGgoKSA+IFhNTE5TLmxlbmd0aCgpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlwcmVmaXggPSBuYW1lLnN1YnN0cmluZyg2KTsKLQkJCQkJCQl0YWdsaWIgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcHJlZml4ID0gbnVsbDsKLQkJCQkJCQl0YWdsaWIgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmICh0YWdsaWIgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlwcmVmaXggPSBTdHJpbmdVdGlscy5zdHJpcChwcmVmaXgpOwotCQkJCQkJaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQllbmFibGVGb3JUYWdsaWIocHJlZml4LCB0YWdsaWJGbGF0Tm9kZSk7Ci0JCQkJCQkJcHJlZml4ID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJLy8gbm90aGluZyB0byBiZSBkb25lCi0JCQkJcHJlZml4ID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBQdWxscyB0aGUgcHJlZml4IGZyb20gdGhlIGdpdmVuIHRhZ2xpYiBkaXJlY3RpdmUKLQkJICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmQgbWFrZXMgc3VyZSB0aGUgcHJlZml4IGlzIG5lc3RhYmxlLgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RhZ2xpYihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhZ2xpYkZsYXROb2RlKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHRhZ2xpYkZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCVN0cmluZyBwcmVmaXggPSBudWxsOwotCQkJYm9vbGVhbiBwcmVmaXhuYW1lID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSAhPSBudWxsICYmIGZDaGFyU2VxdWVuY2VTb3VyY2UgaW5zdGFuY2VvZiBJUmVnaW9uQ29tcGFyaWJsZSkgewotCQkJCQkJCWludCBvZmZzZXQgPSB0YWdsaWJGbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQkJCWludCBsZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJCXByZWZpeG5hbWUgPSAoKElSZWdpb25Db21wYXJpYmxlKSBmQ2hhclNlcXVlbmNlU291cmNlKS5yZWdpb25NYXRjaGVzKG9mZnNldCwgbGVuZ3RoLCBKU1AxMlRMRE5hbWVzLlBSRUZJWCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBvbGQgZmFzaGlvbmVkIHdheQotCQkJCQkJCXByZWZpeG5hbWUgPSAoZ2V0VGV4dCh0YWdsaWJGbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5QUkVGSVgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChwcmVmaXhuYW1lICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJcHJlZml4ID0gZ2V0VGV4dCh0YWdsaWJGbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJLy8gbm90aGluZyB0byBiZSBkb25lCi0JCQkJcHJlZml4ID0gbnVsbDsKLQkJCX0KLQkJCXByZWZpeCA9IFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCk7Ci0JCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCWVuYWJsZUZvclRhZ2xpYihwcmVmaXgsIHRhZ2xpYkZsYXROb2RlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc2V0Tm9kZXMoKSB7Ci0JCQlJdGVyYXRvciB0YWdtYXJrZXJzID0gKChKU1BUb2tlbml6ZXIpIGdldFRva2VuaXplcigpKS5nZXROZXN0YWJsZVByZWZpeGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlICh0YWdtYXJrZXJzLmhhc05leHQoKSkgewotCQkJCWlmICghKChUYWdNYXJrZXIpIHRhZ21hcmtlcnMubmV4dCgpKS5pc0dsb2JhbCgpKQotCQkJCQl0YWdtYXJrZXJzLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3RG9jdW1lbnQpIHsKLQkJCXJlc2V0Tm9kZXMoKTsKLQkJCWdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJaWYgKG5ld0RvY3VtZW50ICE9IG51bGwgJiYgbmV3RG9jdW1lbnQuZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIHsKLQkJCQkoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgbmV3RG9jdW1lbnQuZ2V0UGFyc2VyKCkpLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBKU1BTb3VyY2VQYXJzZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSlNQU291cmNlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE5lc3RhYmxlUHJlZml4KFRhZ01hcmtlciBtYXJrZXIpIHsKLQkJKChKU1BUb2tlbml6ZXIpIGdldFRva2VuaXplcigpKS5hZGROZXN0YWJsZVByZWZpeChtYXJrZXIpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5lc3RhYmxlUHJlZml4ZXMoKSB7Ci0JCXJldHVybiAoKEpTUFRva2VuaXplcikgZ2V0VG9rZW5pemVyKCkpLmdldE5lc3RhYmxlUHJlZml4ZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQmxvY2tUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IEpTUFRva2VuaXplcigpOwotCQkJZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoKS5hZGQobmV3IE5lc3RhYmxlUHJlZml4SGFuZGxlcigpKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCUpTUFNvdXJjZVBhcnNlciBuZXdJbnN0YW5jZSA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJbmV3SW5zdGFuY2Uuc2V0VG9rZW5pemVyKGdldFRva2VuaXplcigpLm5ld0luc3RhbmNlKCkpOwotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyc2VOb2RlcygpIHsKLQkJLy8gcmVnaW9ucyBhcmUgaW5pdGlhbGx5IHJlcG9ydGVkIGFzIGNvbXBsZXRlIG9mZnNldHMgd2l0aGluIHRoZQotCQkvLyBzY2FubmVkIGlucHV0Ci0JCS8vIHRoZXkgYXJlIGFkanVzdGVkIGhlcmUgdG8gYmUgaW5kZXhlcyBmcm9tIHRoZSBjdXJyZW50Tm9kZSdzIHN0YXJ0Ci0JCS8vIG9mZnNldAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCS8vIERNVzogMi8xMi8wMy4gTWFkZSBjdXJyZW50IG5vZGUgbG9jYWwgdmFyaWFibGUsIHNpbmNlCi0JCS8vIHdlIGNoYW5nZWQgY2xhc3MgdG8gbm90IHJlcXVpcmUgc3RhdGUKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IG51bGw7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQotCQl3aGlsZSAoKHJlZ2lvbiA9IGdldE5leHRSZWdpb24oKSkgIT0gbnVsbCkgewotCQkJdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkvLyB0aGVzZSB0eXBlcyAobWlnaHQpIGRlbWFuZCBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm9yIGVhY2gKLQkJCS8vIG9mIHRoZW0KLQkJCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkJCS8vIG11bHRpcGxlIGJsb2NrIHRleHRzIGluZGljYXRlZCBlbWJlZGRlZCBjb250YWluZXJzOyBubwotCQkJCQkvLyBuZXcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm90IGNvbnRpbnVpbmcgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBlbnN1cmUgdGhhdCBhbnkgZXhpc3Rpbmcgbm9kZSBpcyBhdCBsZWFzdAotCQkJCQkJLy8gdGVybWluYXRlZAotCQkJCQkJaWYgKCFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCQkvLyBmQ3VycmVudE5vZGUuc2V0VGV4dExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtCi0JCQkJCQkJLy8gZkN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJfQotCQkJCQkJbGFzdE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCQkJfQotCQkJCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBPUEVOIG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQllbHNlIGlmICgoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9PUEVOKSB7Ci0JCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJLy8gZW5zdXJlIHRoYXQgYW55IGV4aXN0aW5nIG5vZGUgaXMgYXQgbGVhc3QgdGVybWluYXRlZAotCQkJCQlpZiAoIWN1cnJlbnROb2RlLmlzRW5kZWQoKSkgewotCQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCQkvLyBmQ3VycmVudE5vZGUuc2V0VGV4dExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtCi0JCQkJCQkvLyBmQ3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCX0KLQkJCQkJbGFzdE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCQl9Ci0JCQkJZmlyZU5vZGVQYXJzZWQoY3VycmVudE5vZGUpOwotCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCWxhc3ROb2RlLnNldE5leHQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBORUlUSEVSIG9wZW4gbm9yIGNsb3NlCi0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOyBqdXN0IGFkZCB0byB0aGVtCi0JCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVCkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVCkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfQ09OVEVOVCkgewotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgY2xvc2Ugb2ZmIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCS8vIGNsZWFubHkKLQkJCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0UpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKSB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DTE9TRSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHRoaXMgaXMgZXh0cmVtZWx5IHJhcmUsIGJ1dCB2YWxpZAotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFKSB7Ci0JCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKTsKLQkJCQkvLyBwYWNrIHRoZSBlbWJlZGRlZCBjb250YWluZXIgd2l0aCB0aGlzIHJlZ2lvbgotCQkJCWlmIChsYXN0UmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJSVRleHRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKElUZXh0UmVnaW9uQ29udGFpbmVyKSBsYXN0UmVnaW9uOwotCQkJCQljb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChyZWdpb24pOwotCQkJCQkvLyBEVywgNC8xNi8yMDAzIGNvbnRhaW5lciByZWdpb25zIGhhdmUgcGFyZW50LiBQcm9iYWJseSBhCi0JCQkJCS8vIGJldHRlciBwbGFjZSB0byBzZXQsCi0JCQkJCS8vIGJ1dCBmb3Igbm93LCB3aWxsIChyZSlzZXQgZWFjaCB0aW1lIHRocm91Z2gKLQkJCQkJY29udGFpbmVyLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY29udGFpbmVyKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KGNvbnRhaW5lci5nZXRMZW5ndGgoKSAtIHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWN1cnJlbnROb2RlLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJLy8gc2tpcCBvbiBhIHZlcnktZmlyc3QgcmVnaW9uIHNpdHVhdGlvbiBhcyB0aGUgZGVmYXVsdAotCQkJCS8vIGJlaGF2aW9yIGlzIGdvb2QgZW5vdWdoCi0JCQkJLy8gY29tYmluZSB3aXRoIHByZXZpb3VzIGlmIGFsc28gdW5kZWZpbmVkCi0JCQkJaWYgKGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQpIHsKLQkJCQkJY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQljdXJyZW50Tm9kZS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQotCQkJCQkvL2lmIGFkZGluZyB0aGlzIHJlZ2lvbiB0byBhIHByZXZpb3VzIGNvbnRhaW5lciB0aGVuIG5lZWQgdG8gYWRkIHRoaXMKLQkJCQkJLy9yZWdpb24gdG8gdGhlIGNvbnRhaW5lciBhbmQgdXBkYXRlIGl0cyBzdGFydCBsb2NhdGlvbgotCQkJCQlpZihjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuZ2V0U3RhcnQoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lciljdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkpLmdldFJlZ2lvbnMoKS5hZGQocmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBwcmV2aW91cyB3YXNuJ3QgdW5kZWZpbmVkCi0JCQkJZWxzZSB7Ci0JCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBpZiBhbiB1bmtub3duIHR5cGUgaXMgdGhlIGZpcnN0IHJlZ2lvbiBpbiB0aGUgZG9jdW1lbnQsCi0JCQkJLy8gZW5zdXJlIHRoYXQgYSBub2RlIGV4aXN0cwotCQkJCWlmIChjdXJyZW50Tm9kZSA9PSBudWxsKSB7Ci0JCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3VuZCByZWdpb24gb2Ygbm90IHNwZWNpZmljYWxseSBoYW5kbGVkIHR5cGUgIiArIHJlZ2lvbi5nZXRUeXBlKCkgKyAiIEAgIiArIHJlZ2lvbi5nZXRTdGFydCgpICsgIlsiICsgcmVnaW9uLmdldExlbmd0aCgpICsgIl0iKTsvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJCX0KLQotCQkJLy8gdGhlc2UgcmVnaW9ucyBhbHNvIGdldCB0aGVpciBvd24gbm9kZSwgc28gY2xvc2UgdGhlbSBjbGVhbmx5Ci0JCQkvLyBOT1RFOiB0aGVzZSByZWdpb25zIGhhdmUgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgY3JlYXRlZAotCQkJLy8gZm9yIHRoZW0gYWJvdmU7IGl0IG1heQotCQkJLy8gYmUgbW9yZSByZWFkYWJsZSBpZiB0aGF0IGlzIGhhbmRsZWQgaGVyZSBhcyB3ZWxsLCBidXQgdGhlCi0JCQkvLyBjdXJyZW50IGxheW91dAotCQkJLy8gZW5zdXJlcyB0aGF0IHRoZXkgb3BlbiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIHRoZSBzYW1lIHdheQotCQkJaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJfQotCQkJaWYgKGhlYWROb2RlID09IG51bGwgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCWhlYWROb2RlID0gY3VycmVudE5vZGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJfQotCQlwcmltUmVzZXQoKTsKLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyB0YWdOYW1lKSB7Ci0JCSgoSlNQVG9rZW5pemVyKSBnZXRUb2tlbml6ZXIoKSkucmVtb3ZlTmVzdGFibGVQcmVmaXgodGFnTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzZkYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLlhNTFBhcnNlclJlZ2lvbkZhY3Rvcnk7Ci0KLS8qKgotICogCi0gKiBUaGlzIHJlZ2lvbiBmYWN0b3J5IGlzIHZlcnkgc3BlY2lmaWMgdG8gdGhlIHBhcnNlciBvdXRwdXQsIGFuZCB0aGUgc3BlY2lmaWMKLSAqIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgZm9yIHZhcmlvdXMgcmVnaW9ucy4KLSAqLwotcHVibGljIGNsYXNzIEpTUFBhcnNlclJlZ2lvbkZhY3RvcnkgZXh0ZW5kcyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5IHsKLQlwdWJsaWMgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGNvbnRleHQgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBGb3JlaWduUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UKLQkJCW5ld1JlZ2lvbiA9IHN1cGVyLmNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIGxhbmcsIHN1cnJvdW5kaW5nVGFnKTsKLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4ZWQ5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3Rvcnk7Ci0KLS8qKgotICogQSBzaW1wbGUgY2xhc3MgdG8gZ2VuZXJhdGUgaW5zdGFuY2VzIG9mIFN0cnVjdHVyZWRSZWdpb25zLiAKLSAqLwotcHVibGljIGNsYXNzIEpTUFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5IGV4dGVuZHMgWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVJlZ2lvbihpbnQgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIEpTUF9ESVJFQ1RJVkUgOgotCQkJCWluc3RhbmNlID0gbmV3IEpTUERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJaW5zdGFuY2UgPSBYTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24odHlwZSk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2NjNlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMzYgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gMTAvMjkvMTAgNDoyNCBQTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEZyaXRzIEphbHZpbmdoIC0gY29udHJpYnV0aW9ucyBmb3IgYnVnIDE1MDc5NAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlRhZ01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLkludFN0YWNrOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDEwLzI5LzEwIDQ6MjQgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovQzovZGV2L3dvcmtzcGFjZXMvaW5kaWdvL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUb2tlbml6ZXIgaW1wbGVtZW50cyBCbG9ja1Rva2VuaXplciwgRE9NSlNQUmVnaW9uQ29udGV4dHMgewotCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX0RRVU9URVMgPSA1MjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9TUVVPVEVTID0gNTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkxfU1FVT1RFU19FTkQgPSA1MzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlRfRU5EID0gNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUgPSAyMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX1NRVU9URVNfRU5EID0gNDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9EUVVPVEVTID0gNDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTCA9IDQzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfU0NBTiA9IDM2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUxfU1FVT1RFUyA9IDQ0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUgPSAxNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfVEFHX0NMT1NFID0gMTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCA9IDQyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9FUVVBTFMgPSAxMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFID0gMjU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkwgPSA1MDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1NRVU9URURfVkJMID0gNTY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCA9IDQxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX05BTUUgPSAyMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VRVUFMUyA9IDI0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FID0gMTk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT05URU5UID0gMTY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSA9IDMxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiA9IDMyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UgPSAyNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMgPSAyMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9EUVVPVEVTX0VORCA9IDU0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRFFVT1RFRF9FTCA9IDQ4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiA9IDI4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9FTkQgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9XUyA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX1RFWFQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSA9IDE4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UID0gMzM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OID0gMzQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9EUVVPVEVTX0VORCA9IDQ3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfU1FVT1RFRF9FTCA9IDQ5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfQ09NTUVOVF9FTkQgPSAzOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0VRVUFMUyA9IDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAzNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDID0gMzA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9EUVVPVEVEX1ZCTCA9IDU1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9BQk9SVF9FTUJFRERFRCA9IDM3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCA9IDI5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfQ09NTUVOVCA9IDM4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9DT05URU5UID0gNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4gPSAzNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUEkgPSA1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT04gPSAyNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9OQU1FID0gMTc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9UQUdfTkFNRSA9IDIyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfVEFHX0NMT1NFID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UID0gMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0FUVFJJQlVURV9WQUxVRSA9IDQwOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTFcMFwxXDVcMVwyN1wyXDBcMVwyMFwyMlwwXDFcMjBcMVwyNlwxXDEyXDFcNjYiKwotICAgICJcMVwxNVwxXDIzXDFcMTNcMVwxNFwxXDI1XDFcMjVcMVwyNVwxXDI1XDFcMjVcMVw3IisKLSAgICAiXDFcNlwxXDNcMTJcMjFcMVwxMVwxXDczXDFcMVwxXDUyXDFcMlwxXDRcMVwyMiIrCi0gICAgIlwxXDQxXDFcNzRcMVwzN1wxXDQwXDFcNTZcMVw3MVwxXDYzXDFcNjNcMVw2NFwxXDYzIisKLSAgICAiXDFcNjNcMVwzNFwxXDMyXDFcNjVcMVw1M1wxXDU1XDFcNjNcMVw3MFwxXDY3XDFcNDIiKwotICAgICJcMVw3MlwyXDYzXDFcMzBcMVw1NFwxXDYzXDFcMzZcMVwxN1wxXDI0XDFcMFwxXDEwIisKLSAgICAiXDFcMFwxXDYwXDFcMTA0XDFcNzVcMVw2MVwxXDQ0XDFcNzFcMVw3NlwxXDEwNlwxXDQ3IisKLSAgICAiXDFcMTAxXDFcNjNcMVwzNVwxXDMzXDFcNTFcMVw1MFwxXDEwMlwxXDYzXDFcNDVcMVw0NiIrCi0gICAgIlwxXDU3XDFcMTAzXDFcNDNcMVw2M1wxXDMxXDFcNjJcMVw2M1wxXDE2XDFcMFwxXDEwNSIrCi0gICAgIlw3MVwwXDFcMTAwXDEwXDBcMjdcNzdcMVwwXDM3XDc3XDFcMFw3Mlw3N1wyXDBcMTNcNzciKwotICAgICJcMlwwXDEwXDc3XDFcMFw2NVw3N1wxXDBcMTA0XDc3XDExXDBcNDRcNzdcM1wwXDJcNzciKwotICAgICJcNFwwXDM2XDc3XDcwXDBcMTMxXDc3XDIyXDBcN1w3N1wxNlwwXDJcMTAwXDU2XDBcMTA2XDEwMCIrCi0gICAgIlwzMlwwXDJcMTAwXDQ0XDBcMVw3N1wxXDEwMFwzXDc3XDFcMFwxXDc3XDFcMFwyNFw3NyIrCi0gICAgIlwxXDBcNTRcNzdcMVwwXDdcNzdcM1wwXDFcNzdcMVwwXDFcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDFcNzdcMVwwXDIyXDc3XDE1XDBcMTRcNzdcMVwwXDEwMlw3N1wxXDBcMTRcNzciKwotICAgICJcMVwwXDQ0XDc3XDFcMFw0XDEwMFwxMVwwXDY1XDc3XDJcMFwyXDc3XDJcMFwyXDc3IisKLSAgICAiXDNcMFwzNFw3N1wyXDBcMTBcNzdcMlwwXDJcNzdcNjdcMFw0Nlw3N1wyXDBcMVw3NyIrCi0gICAgIlw3XDBcNDZcNzdcMTJcMFwyMVwxMDBcMVwwXDI3XDEwMFwxXDBcM1wxMDBcMVwwXDFcMTAwIisKLSAgICAiXDFcMFwyXDEwMFwxXDBcMVwxMDBcMTNcMFwzM1w3N1w1XDBcM1w3N1w1NlwwXDMyXDc3IisKLSAgICAiXDVcMFwxXDEwMFwxMlw3N1wxMFwxMDBcMTVcMFwxMlwxMDBcNlwwXDFcMTAwXDEwN1w3N1wyXDAiKwotICAgICJcNVw3N1wxXDBcMTdcNzdcMVwwXDRcNzdcMVwwXDFcNzdcMTdcMTAwXDJcNzdcMlwxMDAiKwotICAgICJcMVwwXDRcMTAwXDJcMFwxMlwxMDBcdTAyMDdcMFwzXDEwMFwxXDBcNjVcNzdcMlwwXDFcMTAwIisKLSAgICAiXDFcNzdcMjBcMTAwXDNcMFw0XDEwMFwzXDBcMTJcNzdcMlwxMDBcMlwwXDEyXDEwMFwyMVwwIisKLSAgICAiXDNcMTAwXDFcMFwxMFw3N1wyXDBcMlw3N1wyXDBcMjZcNzdcMVwwXDdcNzdcMVwwIisKLSAgICAiXDFcNzdcM1wwXDRcNzdcMlwwXDFcMTAwXDFcMFw3XDEwMFwyXDBcMlwxMDBcMlwwIisKLSAgICAiXDNcMTAwXDExXDBcMVwxMDBcNFwwXDJcNzdcMVwwXDNcNzdcMlwxMDBcMlwwXDEyXDEwMCIrCi0gICAgIlwyXDc3XDIwXDBcMVwxMDBcMlwwXDZcNzdcNFwwXDJcNzdcMlwwXDI2XDc3XDFcMCIrCi0gICAgIlw3XDc3XDFcMFwyXDc3XDFcMFwyXDc3XDFcMFwyXDc3XDJcMFwxXDEwMFwxXDAiKwotICAgICJcNVwxMDBcNFwwXDJcMTAwXDJcMFwzXDEwMFwxM1wwXDRcNzdcMVwwXDFcNzdcN1wwIisKLSAgICAiXDEyXDEwMFwyXDEwMFwzXDc3XDE0XDBcM1wxMDBcMVwwXDdcNzdcMVwwXDFcNzdcMVwwIisKLSAgICAiXDNcNzdcMVwwXDI2XDc3XDFcMFw3XDc3XDFcMFwyXDc3XDFcMFw1XDc3XDJcMCIrCi0gICAgIlwxXDEwMFwxXDc3XDEwXDEwMFwxXDBcM1wxMDBcMVwwXDNcMTAwXDIyXDBcMVw3N1w1XDAiKwotICAgICJcMTJcMTAwXDIxXDBcM1wxMDBcMVwwXDEwXDc3XDJcMFwyXDc3XDJcMFwyNlw3N1wxXDAiKwotICAgICJcN1w3N1wxXDBcMlw3N1wyXDBcNFw3N1wyXDBcMVwxMDBcMVw3N1w2XDEwMFwzXDAiKwotICAgICJcMlwxMDBcMlwwXDNcMTAwXDEwXDBcMlwxMDBcNFwwXDJcNzdcMVwwXDNcNzdcNFwwIisKLSAgICAiXDEyXDEwMFwyMlwwXDJcMTAwXDFcMFw2XDc3XDNcMFwzXDc3XDFcMFw0XDc3XDNcMCIrCi0gICAgIlwyXDc3XDFcMFwxXDc3XDFcMFwyXDc3XDNcMFwyXDc3XDNcMFwzXDc3XDNcMCIrCi0gICAgIlwxMFw3N1wxXDBcM1w3N1w0XDBcNVwxMDBcM1wwXDNcMTAwXDFcMFw0XDEwMFwxMVwwIisKLSAgICAiXDFcMTAwXDE3XDBcMTFcMTAwXDIxXDBcM1wxMDBcMVwwXDEwXDc3XDFcMFwzXDc3XDFcMCIrCi0gICAgIlwyN1w3N1wxXDBcMTJcNzdcMVwwXDVcNzdcNFwwXDdcMTAwXDFcMFwzXDEwMFwxXDAiKwotICAgICJcNFwxMDBcN1wwXDJcMTAwXDExXDBcMlw3N1w0XDBcMTJcMTAwXDIyXDBcMlwxMDBcMVwwIisKLSAgICAiXDEwXDc3XDFcMFwzXDc3XDFcMFwyN1w3N1wxXDBcMTJcNzdcMVwwXDVcNzdcNFwwIisKLSAgICAiXDdcMTAwXDFcMFwzXDEwMFwxXDBcNFwxMDBcN1wwXDJcMTAwXDdcMFwxXDc3XDFcMCIrCi0gICAgIlwyXDc3XDRcMFwxMlwxMDBcMjJcMFwyXDEwMFwxXDBcMTBcNzdcMVwwXDNcNzdcMVwwIisKLSAgICAiXDI3XDc3XDFcMFwyMFw3N1w0XDBcNlwxMDBcMlwwXDNcMTAwXDFcMFw0XDEwMFwxMVwwIisKLSAgICAiXDFcMTAwXDEwXDBcMlw3N1w0XDBcMTJcMTAwXDIyMVwwXDU2XDc3XDFcMFwxXDc3XDFcMTAwIisKLSAgICAiXDJcNzdcN1wxMDBcNVwwXDZcNzdcMVwxMDBcMTBcMTAwXDFcMFwxMlwxMDBcNDdcMFwyXDc3IisKLSAgICAiXDFcMFwxXDc3XDJcMFwyXDc3XDFcMFwxXDc3XDJcMFwxXDc3XDZcMFw0XDc3IisKLSAgICAiXDFcMFw3XDc3XDFcMFwzXDc3XDFcMFwxXDc3XDFcMFwxXDc3XDJcMFwyXDc3IisKLSAgICAiXDFcMFwyXDc3XDFcMFwxXDc3XDFcMTAwXDJcNzdcNlwxMDBcMVwwXDJcMTAwXDFcNzciKwotICAgICJcMlwwXDVcNzdcMVwwXDFcMTAwXDFcMFw2XDEwMFwyXDBcMTJcMTAwXDc2XDBcMlwxMDAiKwotICAgICJcNlwwXDEyXDEwMFwxM1wwXDFcMTAwXDFcMFwxXDEwMFwxXDBcMVwxMDBcNFwwXDJcMTAwIisKLSAgICAiXDEwXDc3XDFcMFw0MVw3N1w3XDBcMjRcMTAwXDFcMFw2XDEwMFw0XDBcNlwxMDBcMVwwIisKLSAgICAiXDFcMTAwXDFcMFwyNVwxMDBcM1wwXDdcMTAwXDFcMFwxXDEwMFwzNDZcMFw0Nlw3N1wxMlwwIisKLSAgICAiXDQ3XDc3XDExXDBcMVw3N1wxXDBcMlw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDAiKwotICAgICJcMlw3N1wxXDBcNVw3N1w1MVwwXDFcNzdcMVwwXDFcNzdcMVwwXDFcNzdcMTNcMCIrCi0gICAgIlwxXDc3XDFcMFwxXDc3XDFcMFwxXDc3XDNcMFwyXDc3XDNcMFwxXDc3XDVcMCIrCi0gICAgIlwzXDc3XDFcMFwxXDc3XDFcMFwxXDc3XDFcMFwxXDc3XDFcMFwxXDc3XDNcMCIrCi0gICAgIlwyXDc3XDNcMFwyXDc3XDFcMFwxXDc3XDUwXDBcMVw3N1wxMVwwXDFcNzdcMlwwIisKLSAgICAiXDFcNzdcMlwwXDJcNzdcN1wwXDJcNzdcMVwwXDFcNzdcMVwwXDdcNzdcNTBcMCIrCi0gICAgIlwxXDc3XDRcMFwxXDc3XDEwXDBcMVw3N1x1MGMwNlwwXDIzNFw3N1w0XDBcMTMyXDc3XDZcMCIrCi0gICAgIlwyNlw3N1wyXDBcNlw3N1wyXDBcNDZcNzdcMlwwXDZcNzdcMlwwXDEwXDc3XDFcMCIrCi0gICAgIlwxXDc3XDFcMFwxXDc3XDFcMFwxXDc3XDFcMFwzN1w3N1wyXDBcNjVcNzdcMVwwIisKLSAgICAiXDdcNzdcMVwwXDFcNzdcM1wwXDNcNzdcMVwwXDdcNzdcM1wwXDRcNzdcMlwwIisKLSAgICAiXDZcNzdcNFwwXDE1XDc3XDVcMFwzXDc3XDFcMFw3XDc3XDMyM1wwXDE1XDEwMFw0XDAiKwotICAgICJcMVwxMDBcMTA0XDBcMVw3N1wzXDBcMlw3N1wyXDBcMVw3N1wxMjFcMFwzXDc3XHUwZTgyXDAiKwotICAgICJcMVwxMDBcMVwwXDFcNzdcMzFcMFwxMVw3N1w2XDEwMFwxXDBcNVwxMDBcMTNcMFwxMjRcNzciKwotICAgICJcNFwwXDJcMTAwXDJcMFwyXDEwMFwyXDBcMTMyXDc3XDFcMFwzXDEwMFw2XDBcNTBcNzciKwotICAgICJcdTFjZDNcMFx1NTFhNlw3N1x1MGM1YVwwXHUyYmE0XDc3XDEzNFwwXHUwODAwXDBcdTFmZmVcMFwyXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXlfcm93TWFwIFtdID0geyAKLSAgICAgICAgMCwgICAgNzEsICAgMTQyLCAgIDIxMywgICAyODQsICAgMzU1LCAgIDQyNiwgICA0OTcsICAgNTY4LCAgIDYzOSwgCi0gICAgICA3MTAsICAgNzgxLCAgIDg1MiwgICA5MjMsICAgOTk0LCAgMTA2NSwgIDExMzYsICAxMjA3LCAgMTI3OCwgIDEzNDksIAotICAgICAxNDIwLCAgMTQ5MSwgIDE1NjIsICAxNjMzLCAgMTcwNCwgIDE3NzUsICAxODQ2LCAgMTkxNywgIDE5ODgsICAyMDU5LCAKLSAgICAgMjEzMCwgIDIyMDEsICAyMjcyLCAgMjM0MywgIDI0MTQsICAyNDg1LCAgMjU1NiwgIDI2MjcsICAyNjk4LCAgMjc2OSwgCi0gICAgIDI4NDAsICAyOTExLCAgMjk4MiwgIDMwNTMsICAzMTI0LCAgMzE5NSwgIDMyNjYsICAzMzM3LCAgMzQwOCwgIDM0NzksIAotICAgICAzNTUwLCAgMzYyMSwgIDM2OTIsICAzNzYzLCAgMzgzNCwgIDM5MDUsICAzOTc2LCAgNDA0NywgIDQxMTgsICA0MTg5LCAKLSAgICAgNDI2MCwgIDQzMzEsICA0NDAyLCAgNDQ3MywgIDQ1NDQsICA0NjE1LCAgNDU0NCwgIDQ2MTUsICA0Njg2LCAgNDU0NCwgCi0gICAgIDQ1NDQsICA0NjE1LCAgNDc1NywgIDQ4MjgsICA0ODk5LCAgNDk3MCwgIDUwNDEsICA1MTEyLCAgNTE4MywgIDUyNTQsIAotICAgICA0NTQ0LCAgNDYxNSwgIDUzMjUsICA1Mzk2LCAgNTQ2NywgIDQ1NDQsICA1NTM4LCAgNTUzOCwgIDU2MDksICA1NjgwLCAKLSAgICAgNTc1MSwgIDUzMjUsICA0NTQ0LCAgNTgyMiwgIDU4OTMsICA0NTQ0LCAgNTk2NCwgIDYwMzUsICA2MTA2LCAgNjE3NywgCi0gICAgIDQ1NDQsICA0NjE1LCAgNjI0OCwgIDYzMTksICA2MzkwLCAgNjQ2MSwgIDY1MzIsICA2NjAzLCAgNDU0NCwgIDY2NzQsIAotICAgICA2Njc0LCAgNjc0NSwgIDY4MTYsICA2ODg3LCAgNjk1OCwgIDcwMjksICA0NTQ0LCAgNzEwMCwgIDcxNzEsICA3MjQyLCAKLSAgICAgNzMxMywgIDczODQsICA3NDU1LCAgNDU0NCwgIDc1MjYsICA3NTk3LCAgNzY2OCwgIDc3MzksICA3ODEwLCAgNzg4MSwgCi0gICAgIDc5NTIsICA4MDIzLCAgNDU0NCwgIDgwOTQsICA4MTY1LCAgODIzNiwgIDgzMDcsICA4Mzc4LCAgODQ0OSwgIDg1MjAsIAotICAgICA4NTkxLCAgODU5MSwgIDg2NjIsICA4NzMzLCAgODgwNCwgIDg4NzUsICA4ODc1LCAgODk0NiwgIDkwMTcsICA5MDg4LCAKLSAgICAgOTE1OSwgIDkxNTksICA5MjMwLCAgOTMwMSwgIDkzNzIsICA5NDQzLCAgNDU0NCwgIDk1MTQsICA5NTE0LCAgOTU4NSwgCi0gICAgIDk2NTYsICA5NzI3LCAgOTc5OCwgIDQ1NDQsICA0NTQ0LCAgNDYxNSwgIDQ1NDQsICA0NjE1LCAgOTg2OSwgIDk5NDAsIAotICAgICA3NTk3LCAxMDAxMSwgMTAwODIsIDEwMTUzLCAxMDIyNCwgMTAyOTUsIDEwMzY2LCAxMDQzNywgMTA1MDgsICA0NTQ0LCAKLSAgICAxMDU3OSwgMTA2NTAsIDEwNzIxLCAxMDc5MiwgIDQ1NDQsIDEwODYzLCAxMDkzNCwgMTEwMDUsIDExMDc2LCAgNDU0NCwgCi0gICAgIDQ1NDQsIDExMTQ3LCAgNDU0NCwgMTEyMTgsIDExMjg5LCAgNDU0NCwgMTEyMTgsIDExMzYwLCAxMTQzMSwgIDQ1NDQsIAotICAgIDExMzYwLCAxMTUwMiwgMTE1NzMsICA0NTQ0LCAxMTY0NCwgIDQ1NDQsIDExNzE1LCAxMTc4NiwgMTE4NTcsIDExOTI4LCAKLSAgICAxMTk5OSwgIDQ1NDQsICA0NTQ0LCAxMjA3MCwgIDQ1NDQsIDEyMTQxLCAxMjIxMiwgIDQ1NDQsIDEyMTQxLCAxMjI4MywgCi0gICAgMTIzNTQsICA0NTQ0LCAxMjI4MywgMTI0MjUsIDEyNDk2LCAxMjU2NywgIDQ1NDQsIDEyNjM4LCAxMjcwOSwgMTI3ODAsIAotICAgICA0NTQ0LCAgNDU0NCwgMTI4NTEsIDEyOTIyLCAxMjk5MywgMTMwNjQsIDEzMTM1LCAxMzIwNiwgMTMyNzcsIDEzMzQ4LCAKLSAgICAxMzQxOSwgMTM0OTAsIDEzNTYxLCAxMzYzMiwgMTM3MDMsIDEzNzc0LCAgNDU0NCwgMTM4NDUsIDEzOTE2LCAxMzk4NywgCi0gICAgIDQ1NDQsICA0NTQ0LCAgNTUzOCwgIDU2ODAsICA0NTQ0LCAxNDA1OCwgMTQxMjksICA1NzUxLCAxNDIwMCwgMTQyNzEsIAotICAgICA1ODIyLCAgNTk2NCwgIDYwMzUsIDE0MzQyLCAgNjEwNiwgIDQ1NDQsIDE0NDEzLCAxNDQ4NCwgMTQ1NTUsICA2MTc3LCAKLSAgICAxNDYyNiwgMTQ2OTcsICA0NTQ0LCAxMjkyMiwgIDQ1NDQsICA2Njc0LCAgNjc0NSwgIDQ1NDQsIDE0NzY4LCAxNDgzOSwgCi0gICAgIDY4MTYsIDE0OTEwLCAxNDk4MSwgIDQ1NDQsIDE1MDUyLCAxNTEyMywgIDc1MjYsIDE1MTk0LCAgNzczOSwgIDQ1NDQsIAotICAgIDE1MjY1LCAxNTMzNiwgIDc4MTAsIDE1NDA3LCAxNTQ3OCwgMTU1NDksIDE1NjIwLCAxNTY5MSwgMTU3NjIsIDE1ODMzLCAKLSAgICAgODMwNywgIDQ1NDQsIDE1OTA0LCAxNTk3NSwgIDg1OTEsICA4NjYyLCAgNDU0NCwgMTYwNDYsIDE2MTE3LCAxNjE4OCwgCi0gICAgMTYyNTksIDE2MzMwLCAxNjQwMSwgMTY0NzIsICA4ODA0LCAgODU5MSwgIDg4NzUsICA4OTQ2LCAgNDU0NCwgIDkwMTcsIAotICAgICA5MDg4LCAgODg3NSwgIDkxNTksICA5MjMwLCAgNDU0NCwgMTY1NDMsIDE2NjE0LCAxNjY4NSwgMTY3NTYsIDE2ODI3LCAKLSAgICAxNjg5OCwgMTY5NjksIDE3MDQwLCAxNzExMSwgIDk1MTQsICA5NTg1LCAgNDU0NCwgMTcxODIsIDE3MjUzLCAxNzMyNCwgCi0gICAgMTczOTUsIDE3NDY2LCAxNzUzNywgMTc2MDgsIDE3Njc5LCAxNzc1MCwgMTc4MjEsICA5OTQwLCAxMDA4MiwgIDQ1NDQsIAotICAgIDE3ODkyLCAxNzk2MywgMTAxNTMsIDE4MDM0LCAxODEwNSwgMTgxNzYsIDE4MjQ3LCAgNDU0NCwgMTgzMTgsICA0NTQ0LCAKLSAgICAgNDU0NCwgIDQ1NDQsICA0NTQ0LCAxODM4OSwgMTg0NjAsIDE4NTMxLCAxODYwMiwgMTEyMTgsICA0NTQ0LCAxODY3MywgCi0gICAgMTg3NDQsIDExMzYwLCAgNDU0NCwgMTg4MTUsIDE4ODg2LCAxODk1NywgMTkwMjgsIDE5MDk5LCAxOTE3MCwgMTkyNDEsIAotICAgIDE5MzEyLCAxOTM4MywgMTE5MjgsIDEyMTQxLCAgNDU0NCwgMTk0NTQsIDE5NTI1LCAxMjI4MywgIDQ1NDQsIDE5NTk2LCAKLSAgICAxOTY2NywgMTk3MzgsIDE5ODA5LCAxOTg4MCwgMTk5NTEsIDIwMDIyLCAyMDA5MywgMjAxNjQsICA0NTQ0LCAgNDU0NCwgCi0gICAgIDQ1NDQsIDIwMjM1LCAyMDMwNiwgMjAzNzcsIDIwNDQ4LCAyMDUxOSwgIDQ1NDQsIDIwNTkwLCAyMDY2MSwgMjA3MzIsIAotICAgICA0NTQ0LCAgNDU0NCwgIDQ1NDQsICA0NTQ0LCAyMDgwMywgIDQ1NDQsICA0NTQ0LCAgNDk3MCwgMjA4NzQsIDIwOTQ1LCAKLSAgICAyMTAxNiwgMjEwODcsIDIxMTU4LCAyMTIyOSwgMjEzMDAsIDIxMzcxLCAyMTQ0MiwgMjE1MTMsIDIxNTg0LCAyMTY1NSwgCi0gICAgMjE3MjYsIDIxNzk3LCAyMTg2OCwgMjE5MzksIDIyMDEwLCAyMTkzOSwgMjIwODEsIDIyMTUyLCAyMjA4MSwgMjIyMjMsIAotICAgIDIyMjk0LCAyMjM2NSwgMjI0MzYsIDIyNTA3LCAyMjU3OCwgMjI2NDksIDIyNzIwLCAyMjcyMCwgMjI3OTEsIDIyODYyLCAKLSAgICAyMjkzMywgMjMwMDQsIDIzMDA0LCAyMzA3NSwgMjMxNDYsICA5MzcyLCAgOTM3MiwgIDkzNzIsIDIzMjE3LCAyMzI4OCwgCi0gICAgMjMzNTksIDIzNDMwLCAyMzQzMCwgMjM1MDEsIDIzNTcyLCAgOTcyNywgIDk3MjcsICA5NzI3LCAyMzY0MywgMjM3MTQsIAotICAgIDEwMDgyLCAyMzc4NSwgMTAxNTMsIDIzODU2LCAyMzkyNywgMjM5MjcsIDIzOTk4LCAyMzk5OCwgMTg1MzEsIDI0MDY5LCAKLSAgICAxMTAwNSwgMTEwMDUsIDExMDA1LCAyNDE0MCwgMjQyMTEsIDExMjE4LCAxMTIxOCwgMTEyMTgsIDI0MjgyLCAyNDM1MywgCi0gICAgMTEzNjAsIDExMzYwLCAxMTM2MCwgMjQ0MjQsIDI0NDk1LCAxMTUwMiwgMTE1MDIsIDExNTAyLCAxOTA5OSwgMjQ1NjYsIAotICAgIDI0NjM3LCAxMTcxNSwgMTE3MTUsIDExNzE1LCAxOTMxMiwgMjQ3MDgsIDI0Nzc5LCAxMTkyOCwgMTE5MjgsIDExOTI4LCAKLSAgICAyNDg1MCwgMTIxNDEsIDEyMTQxLCAxMjE0MSwgMjQ5MjEsIDI0OTkyLCAxMjI4MywgMTIyODMsIDEyMjgzLCAyNTA2MywgCi0gICAgMjUxMzQsIDEyNDI1LCAxMjQyNSwgMTI0MjUsIDE5ODgwLCAyNTIwNSwgMjUyNzYsIDEyNjM4LCAxMjYzOCwgMTI2MzgsIAotICAgIDIwMDkzLCAyNTM0NywgIDQ1NDQsICA0NTQ0LCAyNTQxOCwgMjU0ODksICA0NTQ0LCAyNTU2MCwgMjU2MzEsIDI1NzAyLCAKLSAgICAyNTc3MywgMjU4NDQsIDI1OTE1LCAgNzUyNiwgIDQ1NDQsICA0NTQ0LCAyNTk4NiwgMjYwNTcsIDI2MTI4LCAyNjE5OSwgCi0gICAgMjYyNzAsIDE2MzMwLCAxNjgyNywgIDkzNzIsIDI2MzQxLCAxNzQ2NiwgIDk3MjcsIDI2NDEyLCAgNDU0NCwgIDk5NDAsIAotICAgIDExMDA1LCAxMTIxOCwgMjY0ODMsIDExMzYwLCAyNjU1NCwgMTE1MDIsIDI2NjI1LCAgNDU0NCwgMTE3MTUsIDI2Njk2LCAKLSAgICAxMTkyOCwgMTIxNDEsIDI2NzY3LCAxMjI4MywgMjY4MzgsIDEyNDI1LCAyNjkwOSwgIDQ1NDQsIDEyNjM4LCAyNjk4MCwgCi0gICAgMjcwNTEsIDI3MTIyLCAyNzE5MywgMjcyNjQsIDI3MzM1LCAyNzQwNiwgMjc0NzcsIDI3NTQ4LCAyNzYxOSwgMjc2OTAsIAotICAgIDI3NzYxLCAyNzgzMiwgMjc5MDMsIDI3OTc0LCAyODA0NSwgMjgxMTYsIDI4MTg3LCAyODI1OCwgMjgzMjksIDI4NDAwLCAKLSAgICAyODQ3MSwgMjg1NDIsICA0OTcwLCAyODYxMywgMjg2ODQsIDI4NzU1LCAyODgyNiwgMjg4OTcsICA0NTQ0LCAgNDU0NCwgCi0gICAgMjg5NjgsIDI5MDM5LCAyOTExMCwgMjkxODEsIDE5MDk5LCAxOTMxMiwgMjkyNTIsIDI5MzIzLCAxOTg4MCwgMjAwOTMsIAotICAgIDI5Mzk0LCAyOTQ2NSwgMjk1MzYsIDI5NjA3LCAgNDU0NCwgIDQ1NDQsICA0NTQ0LCAyOTY3OCwgMjk3NDksIDI5ODIwLCAKLSAgICAyOTg5MSwgMjk5NjIsIDMwMDMzLCAzMDEwNCwgMzAxNzUsICA3MjQyLCAzMDI0NiwgMzAzMTcsIDMwMzg4LCAzMDQ1OSwgCi0gICAgMzA1MzAsIDMwNjAxLCAzMDY3MiwgIDQ1NDQsIDMwNzQzLCAzMDgxNCwgIDkzNzIsICA5NzI3LCAxMTIxOCwgMTEzNjAsIAotICAgIDEyMTQxLCAxMjI4MywgMzA4ODUsIDMwOTU2LCAzMTAyNywgMzEwOTgsIDMxMTY5LCAzMTI0MCwgMzEzMTEsIDMxMzgyLCAKLSAgICAgNDk3MCwgMzE0NTMsIDMxNTI0LCAzMTU5NSwgMzE2NjYsIDMxNzM3LCAzMTgwOCwgMzE4NzksIDMxOTUwLCAzMjAyMSwgCi0gICAgMzIwOTIsIDMyMTYzLCAzMjIzNCwgMzIzMDUsIDMyMzc2LCAzMjQ0NywgMzI1MTgsIDMyNTg5LCAzMjY2MCwgMzI3MzEsIAotICAgIDMyODAyLCAzMjg3MywgMzI5NDQsIDMzMDE1LCAzMzA4NiwgMzMxNTcsIDMzMjI4LCAzMzI5OSwgMzMzNzAsIDMzNDQxLCAKLSAgICAzMzUxMiwgMzM1ODMsIDMzNjU0LCAzMzcyNSwgMzM3OTYsIDMzODY3LCAzMzkzOCwgIDQ1NDQsIDM0MDA5LCAzNDA4MCwgCi0gICAgMzQxNTEsIDM0MjIyLCAgNzI0MiwgMzQyOTMsIDM0MzY0LCAzNDQzNSwgMzQ1MDYsIDM0NTc3LCAzNDY0OCwgMzQ3MTksIAotICAgIDM0NzkwLCAzNDg2MSwgMzQ5MzIsIDM1MDAzLCAzNTA3NCwgMzUxNDUsIDM1MjE2Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUaGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5X3BhY2tlZCA9IAotICAgICJcMVw3MlwxXDczXDExXDcyXDFcNzRcMVw3MlwxXDc1XDFcNzJcMVw3NiIrCi0gICAgIlwzXDcyXDFcNzdcNDJcNzJcMVwxMDBcMjBcNzJcMVwxMDFcMVwxMDJcMTA1XDEwMSIrCi0gICAgIlwxXDEwM1wxXDEwNFwyMlwxMDNcMVwxMDVcMlwxMDNcMVwxMDZcNTdcMTAzXDFcMTA3IisKLSAgICAiXDFcMTEwXDEwNVwxMDdcMVwxMDNcMVwxMDRcNVwxMDNcMVwxMTFcMTdcMTAzXDFcMTA2IisKLSAgICAiXDYwXDEwM1wxXDEwNFwyXDEwM1wxXDExMlwxXDExM1wyXDEwM1wyXDExNFw2XDEwMyIrCi0gICAgIlwxXDExM1w2XDEwM1wxXDExM1wxXDExNVwxXDExNlw0XDExNFwxXDEwM1wxMFwxMTQiKwotICAgICJcMVwxMTdcMlwxMTRcMVwxMDNcMTFcMTE0XDFcMTE3XDFcMTE0XDFcMTAzXDRcMTE0IisKLSAgICAiXDFcMTAzXDRcMTE0XDFcMTAzXDRcMTE0XDFcMTAzXDFcMTE0XDFcMTAzXDFcMTA0IisKLSAgICAiXDJcMTAzXDFcMTEyXDFcMTIwXDEyXDEwM1wxXDEyMFw2XDEwM1wxXDEyMFw1N1wxMDMiKwotICAgICJcMVwxMjFcMVwxMjJcMlwxMjFcMVwxMjNcMjJcMTIxXDFcMTA2XDU3XDEyMVwxXDEwMyIrCi0gICAgIlwxXDEwNFwyXDEwM1wxXDEyNFwxXDExM1wyXDEwM1wyXDEyNVw2XDEwM1wxXDExMyIrCi0gICAgIlw2XDEwM1wxXDExM1w2XDEyNVwxXDEwM1wxM1wxMjVcMVwxMDNcMTNcMTI1XDFcMTAzIisKLSAgICAiXDRcMTI1XDFcMTAzXDRcMTI1XDFcMTAzXDRcMTI1XDFcMTAzXDFcMTI1XDFcMTAzIisKLSAgICAiXDFcMTA0XDJcMTAzXDFcMTI0XDFcMTEzXDJcMTAzXDJcMTI1XDZcMTAzXDFcMTEzIisKLSAgICAiXDZcMTAzXDFcMTEzXDZcMTI1XDFcMTAzXDEzXDEyNVwxXDEyNlwxM1wxMjVcMVwxMDMiKwotICAgICJcNFwxMjVcMVwxMDNcNFwxMjVcMVwxMDNcNFwxMjVcMVwxMDNcMVwxMjVcMVwxMjciKwotICAgICJcMVwxMDRcMVwxMDNcMVwxMzBcMVwxMzFcMVwxMTNcNFwxMjdcMVwxMzJcMVwxMjciKwotICAgICJcMVwxMzNcM1wxMjdcMVwxMTNcNlwxMjdcMVwxMTNcNTdcMTI3XDFcMTAzXDFcMTA0IisKLSAgICAiXDJcMTAzXDFcMTM0XDIyXDEwM1wxXDEwNlw2MFwxMDNcMVwxMDRcMVwxMzVcMVwxMzYiKwotICAgICJcMVwxMDNcMVwxMTNcMlwxMDNcMlwxMzdcNlwxMDNcMVwxMTNcNlwxMDNcMVwxMTMiKwotICAgICJcNlwxMzdcMVwxMDNcMTNcMTM3XDFcMTAzXDEzXDEzN1wxXDEwM1w0XDEzN1wxXDEwMyIrCi0gICAgIlw0XDEzN1wxXDEwM1w0XDEzN1wxXDEwM1wxXDEzN1wxXDEwM1wxXDEwNFwxXDEzNSIrCi0gICAgIlwxXDEzNlwxXDEwM1wxXDExM1wyXDEwM1wyXDEzN1w2XDEwM1wxXDExM1w2XDEwMyIrCi0gICAgIlwxXDExM1w2XDEzN1wxXDEwM1wxM1wxMzdcMVwxNDBcMTNcMTM3XDFcMTAzXDRcMTM3IisKLSAgICAiXDFcMTAzXDRcMTM3XDFcMTAzXDRcMTM3XDFcMTAzXDFcMTM3XDFcMTQxXDFcMTA0IisKLSAgICAiXDFcMTM1XDFcMTQyXDFcMTQxXDFcMTEzXDRcMTQxXDFcMTQzXDFcMTQxXDFcMTQ0IisKLSAgICAiXDNcMTQxXDFcMTEzXDZcMTQxXDFcMTEzXDU3XDE0MVwxXDEwM1wxXDEwNFwzXDEwMyIrCi0gICAgIlwxXDExM1wxMlwxMDNcMVwxMTNcNlwxMDNcMVwxMTNcNTdcMTAzXDFcMTQ1XDFcMTQ2IisKLSAgICAiXDIxXDE0NVwxXDE0N1w2M1wxNDVcMVwxMDNcMVwxNTBcM1wxMDNcMVwxMTNcMlwxMDMiKwotICAgICJcMlwxNTFcNlwxMDNcMVwxMTNcMlwxMDNcMVwxNTJcM1wxMDNcMVwxMTNcNlwxNTEiKwotICAgICJcMVwxMDNcMTNcMTUxXDFcMTAzXDEzXDE1MVwxXDEwM1w0XDE1MVwxXDEwM1w0XDE1MSIrCi0gICAgIlwxXDEwM1w0XDE1MVwxXDEwM1wxXDE1MVwxXDEwM1wxXDE1MFwzXDEwM1wxXDE1MyIrCi0gICAgIlwxMlwxMDNcMVwxNTNcMlwxMDNcMVwxNTJcM1wxMDNcMVwxNTNcNjBcMTAzXDFcMTUwIisKLSAgICAiXDNcMTAzXDFcMTEzXDJcMTAzXDJcMTU0XDZcMTAzXDFcMTEzXDJcMTAzXDFcMTUyIisKLSAgICAiXDNcMTAzXDFcMTEzXDZcMTU0XDFcMTAzXDEzXDE1NFwxXDEwM1wxM1wxNTRcMVwxMDMiKwotICAgICJcNFwxNTRcMVwxMDNcNFwxNTRcMVwxMDNcNFwxNTRcMVwxMDNcMVwxNTRcMVwxMDMiKwotICAgICJcMVwxNTBcM1wxMDNcMVwxMTNcMlwxMDNcMlwxNTRcNlwxMDNcMVwxMTNcMlwxMDMiKwotICAgICJcMVwxNTJcM1wxMDNcMVwxMTNcNlwxNTRcMVwxMDNcMTNcMTU0XDFcMTU1XDEzXDE1NCIrCi0gICAgIlwxXDEwM1w0XDE1NFwxXDEwM1w0XDE1NFwxXDEwM1w0XDE1NFwxXDEwM1wxXDE1NCIrCi0gICAgIlwxXDE1NlwxXDE1MFwxXDEwM1wxXDE1N1wxXDE1NlwxXDExM1w0XDE1NlwxXDE2MCIrCi0gICAgIlwxXDE1NlwxXDE2MVwzXDE1NlwxXDExM1wyXDE1NlwxXDE2MlwzXDE1NlwxXDExMyIrCi0gICAgIlw1N1wxNTZcMVwxNjNcMVwxNjRcMVwxNjVcMVwxNjZcNFwxNjNcMlwxNjdcMTZcMTYzIisKLSAgICAiXDZcMTcwXDFcMTYzXDEzXDE3MFwxXDE2M1wxM1wxNzBcMVwxNjNcNFwxNzBcMVwxNjMiKwotICAgICJcNFwxNzBcMVwxNjNcMVwxNzFcM1wxNzBcMVwxNjNcMVwxNzBcMVwxMDNcMVwxNzIiKwotICAgICJcMVwxNjVcMVwxNjZcMVwxMDNcMVwxMTNcMlwxMDNcMlwxNzNcNlwxMDNcMVwxMTMiKwotICAgICJcNlwxMDNcMVwxMTNcNlwxNzNcMVwxMDNcMTNcMTczXDFcMTAzXDEzXDE3M1wxXDEwMyIrCi0gICAgIlw0XDE3M1wxXDEwM1w0XDE3M1wxXDEwM1w0XDE3M1wxXDEwM1wxXDE3M1wxXDEwMyIrCi0gICAgIlwxXDE3MlwxXDE2NVwxXDE2NlwxXDEwM1wxXDExM1wyXDEwM1wyXDE3M1w2XDEwMyIrCi0gICAgIlwxXDExM1w2XDEwM1wxXDExM1w2XDE3M1wxXDEwM1wxM1wxNzNcMVwxNzRcMTNcMTczIisKLSAgICAiXDFcMTAzXDRcMTczXDFcMTAzXDRcMTczXDFcMTAzXDRcMTczXDFcMTAzXDFcMTczIisKLSAgICAiXDFcMTc1XDFcMTc2XDFcMTY1XDFcMTc3XDFcMTc1XDFcMTEzXDRcMTc1XDFcMjAwIisKLSAgICAiXDFcMTc1XDFcMjAxXDFcMjAyXDJcMTc1XDFcMTEzXDZcMTc1XDFcMTEzXDM2XDE3NSIrCi0gICAgIlwxXDIwM1wyMFwxNzVcMVwxMDNcMVwyMDRcMVwyMDVcMlwxMDNcMVwxMTNcMTJcMTAzIisKLSAgICAiXDFcMTEzXDZcMTAzXDFcMTEzXDEwXDEwM1wxXDIwNlwxXDIwN1wyXDEwM1wxXDIxMCIrCi0gICAgIlwxMVwxMDNcMVwyMTBcMVwxMDNcMVwyMDdcMVwyMDZcMjZcMTAzXDFcMTA0XDFcMjA1IisKLSAgICAiXDJcMTAzXDFcMTEzXDEyXDEwM1wxXDExM1w2XDEwM1wxXDExM1w2XDEwM1wxXDIxMSIrCi0gICAgIlw1MVwxMDNcMVwxMDRcMVwyMDVcMlwxMDNcMVwxMTNcMlwxMDNcMlwyMTJcNlwxMDMiKwotICAgICJcMVwxMTNcNlwxMDNcMVwxMTNcNlwyMTJcMVwyMTFcMTNcMjEyXDFcMTAzXDEzXDIxMiIrCi0gICAgIlwxXDEwM1w0XDIxMlwxXDEwM1w0XDIxMlwxXDEwM1w0XDIxMlwxXDEwM1wxXDIxMiIrCi0gICAgIlwxXDEwM1wxXDEwNFwxXDIwNVwyXDEwM1wxXDExM1wxMlwxMDNcMVwxMTNcNlwxMDMiKwotICAgICJcMVwxMTNcNlwxMDNcMVwyMTFcN1wxMDNcMVwyMTNcNlwxMDNcMVwyMTRcMTFcMTAzIisKLSAgICAiXDFcMjEzXDEyXDEwM1wxXDIxNFw0XDEwM1wxXDIxNVwxXDEwNFwxXDIwNVwxXDIxNiIrCi0gICAgIlwxXDIxNVwxXDExM1w0XDIxNVwxXDIxN1wxXDIxNVwxXDIyMFwzXDIxNVwxXDExMyIrCi0gICAgIlw2XDIxNVwxXDExM1w2XDIxNVwxXDIyMVw1MFwyMTVcMVwyMjJcMVwxMDRcMVwyMDUiKwotICAgICJcMVwyMjNcMVwyMjJcMVwxMTNcNFwyMjJcMVwyMjRcMVwyMjJcMVwyMjVcM1wyMjIiKwotICAgICJcMVwxMTNcNlwyMjJcMVwxMTNcNlwyMjJcMVwyMjZcNTBcMjIyXDFcMjI3XDFcMTA0IisKLSAgICAiXDFcMjA1XDFcMjMwXDFcMjI3XDFcMTEzXDRcMjI3XDFcMjMxXDFcMjI3XDFcMjMyIisKLSAgICAiXDNcMjI3XDFcMTEzXDZcMjI3XDFcMTEzXDU3XDIyN1wxXDIzM1wxXDIzNFwxXDIzNSIrCi0gICAgIlwxMDRcMjMzXDFcMjM2XDFcMTA0XDFcMjA1XDFcMjM3XDFcMjM2XDFcMTEzXDRcMjM2IisKLSAgICAiXDFcMjQwXDFcMjM2XDFcMjQxXDNcMjM2XDFcMTEzXDZcMjM2XDFcMTEzXDU3XDIzNiIrCi0gICAgIlwxXDI0MlwxXDI0M1wxXDI0NFwxMDRcMjQyXDFcMjQ1XDFcMjQ2XDEwNVwyNDVcMVwxMDMiKwotICAgICJcMVwxMDRcMjVcMTAzXDFcMTA2XDU3XDEwM1wxXDI0N1wxXDI1MFwxMDVcMjQ3XDFcMTAzIisKLSAgICAiXDFcMTA0XDVcMTAzXDFcMjUxXDE3XDEwM1wxXDEwNlw1N1wxMDNcMVwyNTJcMVwyNTMiKwotICAgICJcMVwxNjVcMVwyNTRcMVwyNTJcMVwxMTNcNFwyNTJcMVwyNTVcMVwyNTJcMVwyNTYiKwotICAgICJcMVwyNTdcMlwyNTJcMVwxMTNcNlwyNTJcMVwxMTNcMzZcMjUyXDFcMjYwXDIwXDI1MiIrCi0gICAgIlwxXDI2MVwxXDI2MlwzXDI2MVwxXDI2M1w2XDI2MVwxXDI2NFwxXDI2NVwyXDI2MSIrCi0gICAgIlwxXDI2M1w2XDI2MVwxXDI2M1wzNlwyNjFcMVwyNjZcMjBcMjYxXDFcMjY3XDFcMjYyIisKLSAgICAiXDNcMjY3XDFcMjcwXDRcMjY3XDFcMjcxXDJcMjY3XDFcMjcyXDJcMjY3XDFcMjcwIisKLSAgICAiXDZcMjY3XDFcMjcwXDM2XDI2N1wxXDI3M1wyMFwyNjdcMVwyNzRcMVwyNzVcMTBcMjc0IisKLSAgICAiXDFcMjc2XDFcMjc0XDFcMjc3XDFcMzAwXDY3XDI3NFwxXDMwMVwxXDI3NFwxXDMwMiIrCi0gICAgIlwxXDMwM1wxMlwzMDJcMVwzMDRcMTJcMzAyXDFcMzA1XDU3XDMwMlwxXDMwNlwxXDMwNyIrCi0gICAgIlwxMFwzMDZcMVwzMTBcMTRcMzA2XDFcMzExXDU3XDMwNlwxXDEwM1wxXDEwNFwxMlwxMDMiKwotICAgICJcMVwzMDRcMTJcMTAzXDFcMTA2XDYwXDEwM1wxXDEwNFwxMFwxMDNcMVwzMTBcMTRcMTAzIisKLSAgICAiXDFcMTA2XDU3XDEwM1wxXDMxMlwxXDMxM1wxMFwzMTJcMVwzMTRcNFwzMTJcMVwzMTUiKwotICAgICJcNjVcMzEyXDFcMzE2XDFcMzEyXDFcMzE3XDFcMzIwXDEyXDMxN1wxXDI2NFwyXDMxNyIrCi0gICAgIlwxXDMyMVw2NVwzMTdcMVwzMTZcMVwzMTdcMVwzMjJcMVwzMjNcMTBcMzIyXDFcMzI0IisKLSAgICAiXDFcMzIyXDFcMzI1XDUxXDMyMlwxXDMyNlwxNlwzMjJcMVwzMjdcMVwzMjJcMVwzMzAiKwotICAgICJcMVwzMzFcMTJcMzMwXDFcMzMyXDEyXDMzMFwxXDMzM1w1N1wzMzBcMVwzMzRcMVwzMzUiKwotICAgICJcMTBcMzM0XDFcMzM2XDE0XDMzNFwxXDMzN1w1N1wzMzRcMVwxMDNcMVwxMDRcMTJcMTAzIisKLSAgICAiXDFcMzMyXDEyXDEwM1wxXDEwNlw2MFwxMDNcMVwxMDRcMTBcMTAzXDFcMzM2XDE0XDEwMyIrCi0gICAgIlwxXDEwNlw1N1wxMDNcMVwzNDBcMVwzNDFcMTBcMzQwXDFcMzE0XDRcMzQwXDFcMzQyIisKLSAgICAiXDY1XDM0MFwxXDM0M1wxXDM0MFwxXDM0NFwxXDM0NVwxMlwzNDRcMVwyNjRcMlwzNDQiKwotICAgICJcMVwzNDZcNjVcMzQ0XDFcMzQzXDFcMzQ0XDFcNzJcMVwwXDExXDcyXDFcMCIrCi0gICAgIlwxXDcyXDFcMFw1XDcyXDFcMFw0Mlw3MlwxXDBcMjBcNzJcM1wwIisKLSAgICAiXDFcMzQ3XDFcMzUwXDE2XDBcMVwzNTFcMlwwXDFcMzUyXDY1XDBcMVwzNTMiKwotICAgICJcMlwwXDJcMzU0XDZcMFwxXDM1M1w2XDBcMVwzNTNcNlwzNTRcMVwwIisKLSAgICAiXDEzXDM1NFwxXDBcMTNcMzU0XDFcMzU1XDRcMzU0XDFcMFw0XDM1NFwxXDAiKwotICAgICJcNFwzNTRcMVwwXDFcMzU0XDFcNzJcMVwwXDExXDcyXDFcMFwxXDcyIisKLSAgICAiXDFcMzU2XDFcMzU3XDRcNzJcMVwwXDY0XDcyXDFcMFwxMVw3MlwxXDAiKwotICAgICJcMVw3MlwxXDM2MFw1XDcyXDFcMFw0Mlw3MlwxXDM2MFwyMFw3Mlw1XDAiKwotICAgICJcMVwzNTNcMlwwXDJcMzYxXDZcMFwxXDM1M1w2XDBcMVwzNTNcNlwzNjEiKwotICAgICJcMVwwXDEzXDM2MVwxXDBcMTNcMzYxXDFcMFw0XDM2MVwxXDBcNFwzNjEiKwotICAgICJcMVwwXDRcMzYxXDFcMFwxXDM2MVwxXDcyXDFcMFwxMVw3MlwxXDAiKwotICAgICJcMlw3MlwxXDM2Mlw0XDcyXDFcMFw0Mlw3MlwxXDM2M1wyMFw3MlwxMzJcMCIrCi0gICAgIlwxXDM1MVwyXDBcMVwzNjRcMTA0XDBcMVwzNjVcNzFcMFwxXDM2NlwxMDFcMCIrCi0gICAgIlwxXDM2N1wxMTFcMFwxXDExM1wxMlwwXDFcMTEzXDZcMFwxXDExM1w2NVwwIisKLSAgICAiXDRcMTE0XDdcMFwxXDExNFw2XDBcNlwxMTRcMVwwXDEzXDExNFwxXDAiKwotICAgICJcMTNcMTE0XDFcMFw0XDExNFwxXDBcMTFcMTE0XDFcMFwxXDExNFw2XDAiKwotICAgICJcNFwxMTRcN1wwXDFcMTE0XDZcMFwyXDExNFwyXDM3MFwyXDExNFwxXDAiKwotICAgICJcMTNcMTE0XDFcMFwxM1wxMTRcMVwwXDRcMTE0XDFcMFwxMVwxMTRcMVwwIisKLSAgICAiXDFcMTE0XDZcMFw0XDExNFw3XDBcMVwxMTRcNlwwXDJcMTE0XDFcMzcwIisKLSAgICAiXDFcMzcxXDJcMTE0XDFcMFwxM1wxMTRcMVwwXDEzXDExNFwxXDBcNFwxMTQiKwotICAgICJcMVwwXDExXDExNFwxXDBcMVwxMTRcNlwwXDRcMTE0XDdcMFwxXDExNCIrCi0gICAgIlw2XDBcMlwxMTRcMlwzNzJcMlwxMTRcMVwwXDEzXDExNFwxXDBcMTNcMTE0IisKLSAgICAiXDFcMFw0XDExNFwxXDBcMTFcMTE0XDFcMFwxXDExNFw1XDBcMVwxMjAiKwotICAgICJcMTJcMFwxXDEyMFw2XDBcMVwxMjBcNjFcMFwxXDM3M1wxMDZcMFwxXDM3NCIrCi0gICAgIlwxMTJcMFw0XDEyNVw3XDBcMVwxMjVcNlwwXDZcMTI1XDFcMFwxM1wxMjUiKwotICAgICJcMVwwXDEzXDEyNVwxXDBcNFwxMjVcMVwwXDExXDEyNVwxXDBcMVwxMjUiKwotICAgICJcMVwxMjdcMlwwXDFcMzc1XDFcMTI3XDFcMFw0XDEyN1wxXDBcMVwxMjciKwotICAgICJcMVwwXDNcMTI3XDFcMFw2XDEyN1wxXDBcNjBcMTI3XDFcMFwxXDM3NCIrCi0gICAgIlwxXDM3NVwxXDEyN1wxXDBcNFwxMjdcMVwwXDFcMTI3XDFcMFwzXDEyNyIrCi0gICAgIlwxXDBcNlwxMjdcMVwwXDU3XDEyN1wxXDM3NlwxXDBcMTBcMzc2XDFcMzc3IisKLSAgICAiXDJcMzc2XDFcdTAxMDBcMVwzNzZcMVx1MDEwMVw0NlwzNzZcMVx1MDEwMFwyMFwzNzZcMVx1MDEwMiIrCi0gICAgIlwxXDBcMTJcdTAxMDJcMVwzNzdcMVx1MDEwM1wxXHUwMTAyXDFcdTAxMDRcNDZcdTAxMDJcMVx1MDEwMyIrCi0gICAgIlwyMFx1MDEwMlwyXDBcMVwxMzVcMVx1MDEwNVwxMTFcMFw0XDEzN1w3XDBcMVwxMzciKwotICAgICJcNlwwXDZcMTM3XDFcMFwxM1wxMzdcMVwwXDEzXDEzN1wxXDBcNFwxMzciKwotICAgICJcMVwwXDExXDEzN1wxXDBcMVwxMzdcMVwxNDFcMlwwXDFcdTAxMDZcMVwxNDEiKwotICAgICJcMVwwXDRcMTQxXDFcMFwxXDE0MVwxXDBcM1wxNDFcMVwwXDZcMTQxIisKLSAgICAiXDFcMFw2MFwxNDFcMVwwXDFcMTM1XDFcdTAxMDdcMVwxNDFcMVwwXDRcMTQxIisKLSAgICAiXDFcMFwxXDE0MVwxXDBcM1wxNDFcMVwwXDZcMTQxXDFcMFw1N1wxNDEiKwotICAgICJcMVwxNDNcMVwwXDFcdTAxMDhcMVx1MDEwOVwxXDE0M1wxXHUwMTA4XDRcMTQzXDFcdTAxMGEiKwotICAgICJcMVwxNDNcMVx1MDEwOFwxXHUwMTBiXDFcMTQzXDFcdTAxMGNcMVx1MDEwOFw2XDE0M1wxXHUwMTA4IisKLSAgICAiXDM2XDE0M1wxXHUwMTBiXDIwXDE0M1wxXDE0NFwxXDBcMVx1MDEwZFwxXHUwMTBlXDFcMTQ0IisKLSAgICAiXDFcdTAxMGRcNFwxNDRcMVx1MDEwZFwxXDE0NFwxXHUwMTBhXDFcdTAxMGZcMVwxNDRcMVx1MDExMCIrCi0gICAgIlwxXHUwMTBkXDZcMTQ0XDFcdTAxMGRcMzZcMTQ0XDFcdTAxMGZcMjBcMTQ0XDJcMFwxXHUwMTExIisKLSAgICAiXDEyN1wwXDFcMzUxXDJcMFwxXHUwMTEyXDY2XDBcNFwxNTFcN1wwXDFcMTUxIisKLSAgICAiXDZcMFw2XDE1MVwxXDBcMTNcMTUxXDFcMFwxM1wxNTFcMVwwXDRcMTUxIisKLSAgICAiXDFcMFwxMVwxNTFcMVwwXDFcMTUxXDJcMFwxXHUwMTEzXDExMVwwXDFcMTUzIisKLSAgICAiXDEyXDBcMVwxNTNcNlwwXDFcMTUzXDY1XDBcNFwxNTRcN1wwXDFcMTU0IisKLSAgICAiXDZcMFw2XDE1NFwxXDBcMTNcMTU0XDFcMFwxM1wxNTRcMVwwXDRcMTU0IisKLSAgICAiXDFcMFwxMVwxNTRcMVwwXDFcMTU0XDFcMTU2XDJcMFwxXHUwMTE0XDFcMTU2IisKLSAgICAiXDFcMFw0XDE1NlwxXDBcMVwxNTZcMVwwXDNcMTU2XDFcMFw2XDE1NiIrCi0gICAgIlwxXDBcNTdcMTU2XDFcdTAxMTVcMVwwXDEwXHUwMTE1XDFcdTAxMTZcMlx1MDExNVwxXHUwMTE3IisKLSAgICAiXDFcdTAxMTVcMVx1MDExOFw0Nlx1MDExNVwxXHUwMTE3XDIwXHUwMTE1XDFcdTAxMTlcMVwwXDEyXHUwMTE5IisKLSAgICAiXDFcdTAxMTZcMVx1MDExYVwxXHUwMTE5XDFcdTAxMWJcNDZcdTAxMTlcMVx1MDExYVwyMFx1MDExOVwxXDE1NiIrCi0gICAgIlwxXDBcMVx1MDExM1wxXHUwMTE0XDFcMTU2XDFcMFw0XDE1NlwxXDBcMVwxNTYiKwotICAgICJcMVwwXDNcMTU2XDFcMFw2XDE1NlwxXDBcNTdcMTU2XDFcMTYzXDNcMCIrCi0gICAgIlwyNFwxNjNcNlwwXDFcMTYzXDEzXDBcMVwxNjNcMTNcMFwxXDE2M1w0XDAiKwotICAgICJcMVwxNjNcNFwwXDFcMTYzXDRcMFwxXDE2M1w0XDBcMVwzNDdcMTdcMCIrCi0gICAgIlwxXDM1MVwyXDBcMVwzNTJcNjJcMFwxXHUwMTFjXDEwNFwwXDFcMTYzXDNcMCIrCi0gICAgIlwyXDE2M1w0XDE2N1w3XDE2M1wxXDE2N1w2XDE2M1w2XDE3MFwxXDE2M1wxM1wxNzAiKwotICAgICJcMVwxNjNcMTNcMTcwXDFcMTYzXDRcMTcwXDFcMTYzXDRcMTcwXDFcMTY3XDRcMTcwIisKLSAgICAiXDFcMTYzXDFcMTcwXDZcMFw0XDE3MFw3XDBcMVwxNzBcNlwwXDZcMTcwIisKLSAgICAiXDFcMFwxM1wxNzBcMVwwXDEzXDE3MFwxXDBcNFwxNzBcMVwwXDExXDE3MCIrCi0gICAgIlwxXDBcMVwxNzBcNlwwXDRcMTcwXDdcMFwxXDE3MFw2XDBcNlwxNzAiKwotICAgICJcMVwwXDdcMTcwXDFcdTAxMWRcM1wxNzBcMVwwXDEzXDE3MFwxXDBcNFwxNzAiKwotICAgICJcMVwwXDExXDE3MFwxXDBcMVwxNzBcM1wwXDFcMzQ3XDRcMFwyXHUwMTFlIisKLSAgICAiXDExXDBcMVwzNTFcMlwwXDFcMzUyXDFcMFw2XHUwMTFlXDFcMFwxM1x1MDExZSIrCi0gICAgIlwxXDBcMTNcdTAxMWVcMVwwXDRcdTAxMWVcMVwwXDRcdTAxMWVcMVwwXDRcdTAxMWUiKwotICAgICJcMVwwXDFcdTAxMWVcNlwwXDRcMTczXDdcMFwxXDE3M1w2XDBcNlwxNzMiKwotICAgICJcMVwwXDEzXDE3M1wxXDBcMTNcMTczXDFcMFw0XDE3M1wxXDBcMTFcMTczIisKLSAgICAiXDFcMFwxXDE3M1wxXDE3NVwyXDBcMVx1MDExZlwxXDE3NVwxXDBcNFwxNzUiKwotICAgICJcMVwwXDFcMTc1XDFcMFwzXDE3NVwxXDBcNlwxNzVcMVwwXDU3XDE3NSIrCi0gICAgIlwzXDBcMVwzNDdcNFwwXDJcdTAxMjBcMTFcMFwxXDM1MVwyXDBcMVwzNTIiKwotICAgICJcMVwwXDZcdTAxMjBcMVwwXDEzXHUwMTIwXDFcMFwxM1x1MDEyMFwxXDBcNFx1MDEyMCIrCi0gICAgIlwxXDBcNFx1MDEyMFwxXDBcNFx1MDEyMFwxXDBcMVx1MDEyMFwxXDE3NVwxXDAiKwotICAgICJcMVx1MDExY1wxXHUwMTFmXDFcMTc1XDFcMFw0XDE3NVwxXDBcMVwxNzVcMVwwIisKLSAgICAiXDNcMTc1XDFcMFw2XDE3NVwxXDBcNTdcMTc1XDFcdTAxMjFcMVwwXDEwXHUwMTIxIisKLSAgICAiXDFcdTAxMjJcMlx1MDEyMVwxXHUwMTIzXDFcdTAxMjFcMVx1MDEyNFw0Nlx1MDEyMVwxXHUwMTIzXDIwXHUwMTIxIisKLSAgICAiXDFcdTAxMjVcMVwwXDEyXHUwMTI1XDFcdTAxMjJcMVx1MDEyNlwxXHUwMTI1XDFcdTAxMjdcNDZcdTAxMjUiKwotICAgICJcMVx1MDEyNlwyMFx1MDEyNVwxXDE3NVwyXDBcMVx1MDExZlwxXDE3NVwxXDBcNFwxNzUiKwotICAgICJcMVwwXDFcMTc1XDFcMFwxXDE3NVwxXHUwMTI4XDFcMTc1XDFcMFw2XDE3NSIrCi0gICAgIlwxXDBcNjBcMTc1XDJcMFwxXHUwMTFmXDFcMTc1XDFcMFw0XDE3NVwxXDAiKwotICAgICJcMVwxNzVcMVwwXDFcMTc1XDFcdTAxMjlcMVwxNzVcMVwwXDZcMTc1XDFcMCIrCi0gICAgIlw1N1wxNzVcM1wwXDFcMzQ3XDE3XDBcMVwzNTFcMlwwXDFcdTAxMTJcMTMwXDAiKwotICAgICJcMVx1MDEyYVwyXDBcMVx1MDEyYVw3NVwwXDFcdTAxMmJcMTRcMFwxXHUwMTJiXDYzXDAiKwotICAgICJcMlx1MDEyY1w1MVwwXDI0XHUwMTJkXDFcdTAxMmVcNjJcdTAxMmRcNlwwXDRcMjEyXDdcMCIrCi0gICAgIlwxXDIxMlw2XDBcNlwyMTJcMVwwXDEzXDIxMlwxXDBcMTNcMjEyXDFcMCIrCi0gICAgIlw0XDIxMlwxXDBcMTFcMjEyXDFcMFwxXDIxMlw1NFwwXDFcdTAxMmZcNVwwIisKLSAgICAiXDFcdTAxMmZcMTE2XDBcMVx1MDEzMFwxMFwwXDFcdTAxMzBcM1wwXDFcMjE1XDJcMCIrCi0gICAgIlwxXHUwMTMxXDFcMjE1XDFcMFw0XDIxNVwxXDBcMVwyMTVcMVwwXDNcMjE1IisKLSAgICAiXDFcMFw2XDIxNVwxXDBcNTdcMjE1XDFcdTAxMzJcMVwwXDEwXHUwMTMyXDFcdTAxMzMiKwotICAgICJcMlx1MDEzMlwxXHUwMTM0XDFcdTAxMzJcMVx1MDEzNVw0Nlx1MDEzMlwxXHUwMTM0XDIwXHUwMTMyXDFcdTAxMzYiKwotICAgICJcMVwwXDFcdTAxMzZcMlx1MDEzN1wxXHUwMTM2XDRcdTAxMzdcMlx1MDEzNlwxXHUwMTM4XDFcdTAxMzkiKwotICAgICJcMVx1MDEzNlwxXHUwMTNhXDRcdTAxMzdcMVx1MDEzNlwxMVx1MDEzN1wxXHUwMTM2XDI3XHUwMTM3XDFcdTAxMzkiKwotICAgICJcMTBcdTAxMzdcMlx1MDEzNlw0XHUwMTM3XDFcdTAxMzZcMVx1MDEzN1wxXDIyMVwyXHUwMTJkXDFcdTAxM2IiKwotICAgICJcMVwyMjFcMVx1MDEyZFw0XDIyMVwxXHUwMTJkXDFcMjIxXDFcdTAxMmRcM1wyMjFcMVx1MDEyZCIrCi0gICAgIlwzXDIyMVwxXHUwMTNjXDJcMjIxXDFcdTAxMmRcNTdcMjIxXDFcMjIyXDJcMFwxXHUwMTNkIisKLSAgICAiXDFcMjIyXDFcMFw0XDIyMlwxXDBcMVwyMjJcMVwwXDNcMjIyXDFcMCIrCi0gICAgIlw2XDIyMlwxXDBcNTdcMjIyXDEyXHUwMTNlXDFcdTAxM2ZcNzRcdTAxM2VcMTRcdTAxNDBcMVx1MDEzZiIrCi0gICAgIlw3Mlx1MDE0MFwxXDIyNlwyXHUwMTJkXDFcdTAxNDFcMVwyMjZcMVx1MDEyZFw0XDIyNlwxXHUwMTJkIisKLSAgICAiXDFcMjI2XDFcdTAxMmRcM1wyMjZcMVx1MDEyZFwzXDIyNlwxXHUwMTQyXDJcMjI2XDFcdTAxMmQiKwotICAgICJcNTdcMjI2XDFcMjI3XDJcMFwxXHUwMTQzXDFcMjI3XDFcMFw0XDIyN1wxXDAiKwotICAgICJcMVwyMjdcMVwwXDNcMjI3XDFcMFw2XDIyN1wxXDBcNTdcMjI3XDFcdTAxNDQiKwotICAgICJcMVwwXDEwXHUwMTQ0XDFcdTAxNDVcMlx1MDE0NFwxXHUwMTQ2XDFcdTAxNDRcMVx1MDE0N1w0Nlx1MDE0NCIrCi0gICAgIlwxXHUwMTQ2XDIwXHUwMTQ0XDFcdTAxNDhcMVwwXDFcdTAxNDhcMlx1MDE0OVwxXHUwMTQ4XDRcdTAxNDkiKwotICAgICJcMlx1MDE0OFwxXHUwMTRhXDFcdTAxNGJcMVx1MDE0OFwxXHUwMTRjXDRcdTAxNDlcMVx1MDE0OFwxMVx1MDE0OSIrCi0gICAgIlwxXHUwMTQ4XDI3XHUwMTQ5XDFcdTAxNGJcMTBcdTAxNDlcMlx1MDE0OFw0XHUwMTQ5XDFcdTAxNDhcMVx1MDE0OSIrCi0gICAgIlwyXDIzM1wxXDBcMTA2XDIzM1wxXDBcMjBcMjMzXDFcdTAxNGRcMlwyMzNcMVx1MDE0ZSIrCi0gICAgIlw2MFwyMzNcMVwyMzZcMlwwXDFcdTAxNGZcMVwyMzZcMVwwXDRcMjM2XDFcMCIrCi0gICAgIlwxXDIzNlwxXDBcM1wyMzZcMVwwXDZcMjM2XDFcMFw1N1wyMzZcMVx1MDE1MCIrCi0gICAgIlwxXDBcMTBcdTAxNTBcMVx1MDE1MVwyXHUwMTUwXDFcdTAxNTJcMVx1MDE1MFwxXHUwMTUzXDQ2XHUwMTUwIisKLSAgICAiXDFcdTAxNTJcMjBcdTAxNTBcMVx1MDE1NFwxXDBcMVx1MDE1NFwyXHUwMTU1XDFcdTAxNTRcNFx1MDE1NSIrCi0gICAgIlwyXHUwMTU0XDFcdTAxNTZcMVx1MDE1N1wxXHUwMTU0XDFcdTAxNThcNFx1MDE1NVwxXHUwMTU0XDExXHUwMTU1IisKLSAgICAiXDFcdTAxNTRcMjdcdTAxNTVcMVx1MDE1N1wxMFx1MDE1NVwyXHUwMTU0XDRcdTAxNTVcMVx1MDE1NFwxXHUwMTU1IisKLSAgICAiXDJcMjQyXDFcMFwxMDZcMjQyXDFcMFwyMFwyNDJcMVx1MDE1OVwyXDI0MlwxXHUwMTVhIisKLSAgICAiXDYwXDI0Mlw3XDBcMVx1MDE1Ylw3N1wwXDFcMjUyXDJcMFwxXHUwMTVjXDFcMjUyIisKLSAgICAiXDFcMFw0XDI1MlwxXDBcMVwyNTJcMVwwXDNcMjUyXDFcMFw2XDI1MiIrCi0gICAgIlwxXDBcNjBcMjUyXDFcMFwxXHUwMTFjXDFcdTAxNWNcMVwyNTJcMVwwXDRcMjUyIisKLSAgICAiXDFcMFwxXDI1MlwxXDBcM1wyNTJcMVwwXDZcMjUyXDFcMFw1N1wyNTIiKwotICAgICJcMVx1MDE1ZFwxXDBcMTBcdTAxNWRcMVx1MDE1ZVwyXHUwMTVkXDFcdTAxNWZcMVx1MDE1ZFwxXHUwMTYwIisKLSAgICAiXDQ2XHUwMTVkXDFcdTAxNWZcMjBcdTAxNWRcMVx1MDE2MVwxXDBcMTJcdTAxNjFcMVx1MDE1ZVwxXHUwMTYyIisKLSAgICAiXDFcdTAxNjFcMVx1MDE2M1w0Nlx1MDE2MVwxXHUwMTYyXDIwXHUwMTYxXDFcMjUyXDJcMFwxXHUwMTVjIisKLSAgICAiXDFcMjUyXDFcMFw0XDI1MlwxXDBcMVwyNTJcMVwwXDFcMjUyXDFcdTAxNjQiKwotICAgICJcMVwyNTJcMVwwXDZcMjUyXDFcMFw2MFwyNTJcMlwwXDFcdTAxNWNcMVwyNTIiKwotICAgICJcMVwwXDRcMjUyXDFcMFwxXDI1MlwxXDBcMVwyNTJcMVx1MDE2NVwxXDI1MiIrCi0gICAgIlwxXDBcNlwyNTJcMVwwXDU3XDI1MlwxXDI2MVwxXDBcMTJcMjYxXDJcMCIrCi0gICAgIlw1MFwyNjFcMVwwXDIwXDI2MVwzXDBcMVx1MDE2NlwxN1wwXDFcMzUxXDJcMCIrCi0gICAgIlwxXDM2NFw2MFwwXDFcMjYxXDFcMFwzXDI2MVwxXDI2M1w2XDI2MVwyXDAiKwotICAgICJcMlwyNjFcMVwyNjNcNlwyNjFcMVwyNjNcMzZcMjYxXDFcMFwyMFwyNjFcNVwwIisKLSAgICAiXDFcdTAxNjdcMTBcMFwxXHUwMTY4XDFcMFwxXHUwMTY3XDZcMFwxXHUwMTY3XDY0XDAiKwotICAgICJcMVx1MDE2N1wxMFwwXDFcdTAxNjlcMVwwXDFcdTAxNjdcNlwwXDFcdTAxNjdcNTdcMCIrCi0gICAgIlwxXDI2N1wxXDBcMTBcMjY3XDFcMFwyXDI2N1wxXDBcNTBcMjY3XDFcMCIrCi0gICAgIlwyMVwyNjdcMVwwXDNcMjY3XDFcMjcwXDRcMjY3XDFcMFwyXDI2N1wxXDAiKwotICAgICJcMlwyNjdcMVwyNzBcNlwyNjdcMVwyNzBcMzZcMjY3XDFcMFwyMFwyNjdcNVwwIisKLSAgICAiXDFcdTAxNjdcMTBcMFwxXHUwMTZhXDFcMFwxXHUwMTY3XDZcMFwxXHUwMTY3XDY0XDAiKwotICAgICJcMVx1MDE2N1wxMFwwXDFcdTAxNmJcMVwwXDFcdTAxNjdcNlwwXDFcdTAxNjdcNTdcMCIrCi0gICAgIlwxMlwyNzRcMVwwXDFcMjc0XDFcMFwxXHUwMTZjXDY3XDI3NFwxXDBcMTNcMjc0IisKLSAgICAiXDFcMFwxXDI3NFwxXDBcMVx1MDE2Y1w1XDI3NFwxXHUwMTZkXDYxXDI3NFwxXDAiKwotICAgICJcMTNcMjc0XDFcMFwxXDI3NFwxXDBcMVwyNzRcMVx1MDE2ZVw2NlwyNzRcMVx1MDE2ZiIrCi0gICAgIlwxXDI3NFwxNFx1MDE3MFwxXHUwMTcxXDEwNlx1MDE3MFwxXHUwMTcxXDZcdTAxNzBcMVx1MDE3MlwyXHUwMTcwIisKLSAgICAiXDFcdTAxNzNcNjBcdTAxNzBcMTJcdTAxNzRcMVx1MDE3NVwxMDZcdTAxNzRcMVx1MDE3NVwxMFx1MDE3NFwxXHUwMTc2IisKLSAgICAiXDJcdTAxNzRcMVx1MDE3N1w2MFx1MDE3NFwxMlwzMTJcMVwwXDRcMzEyXDFcdTAxNzhcNjVcMzEyIisKLSAgICAiXDFcMFwxM1wzMTJcMVwwXDRcMzEyXDFcdTAxNzhcM1wzMTJcMVx1MDE3OVw2MVwzMTIiKwotICAgICJcMVwwXDEzXDMxMlwxXHUwMTdhXDc0XDMxMlwxNFwzMTdcMVwwXDJcMzE3XDFcdTAxN2IiKwotICAgICJcNjVcMzE3XDFcMFwxNVwzMTdcMVwwXDJcMzE3XDFcdTAxN2JcM1wzMTdcMVx1MDE3YyIrCi0gICAgIlw2MVwzMTdcMVwwXDE1XDMxN1wxXHUwMTdkXDcyXDMxN1wxMlwzMjJcMVwwXDFcMzIyIisKLSAgICAiXDFcMFw3MFwzMjJcMVwwXDEzXDMyMlwxXDBcMVwzMjJcMVwwXDZcMzIyIisKLSAgICAiXDFcdTAxN2VcNjFcMzIyXDFcMFwxM1wzMjJcMVwwXDFcMzIyXDFcMFwxXDMyMiIrCi0gICAgIlwxXHUwMTdmXDY2XDMyMlwxXDBcMVwzMjJcMTRcdTAxODBcMVx1MDE4MVwxMDZcdTAxODBcMVx1MDE4MSIrCi0gICAgIlw2XHUwMTgwXDFcdTAxODJcMlx1MDE4MFwxXHUwMTgzXDYwXHUwMTgwXDEyXHUwMTg0XDFcdTAxODVcMTA2XHUwMTg0IisKLSAgICAiXDFcdTAxODVcMTBcdTAxODRcMVx1MDE4NlwyXHUwMTg0XDFcdTAxODdcNjBcdTAxODRcMTJcMzQwXDFcMCIrCi0gICAgIlw0XDM0MFwxXHUwMTg4XDY1XDM0MFwxXDBcMTNcMzQwXDFcMFw0XDM0MFwxXHUwMTg4IisKLSAgICAiXDNcMzQwXDFcdTAxODlcNjFcMzQwXDFcMFwxM1wzNDBcMVx1MDE4YVw3NFwzNDBcMTRcMzQ0IisKLSAgICAiXDFcMFwyXDM0NFwxXHUwMThiXDY1XDM0NFwxXDBcMTVcMzQ0XDFcMFwyXDM0NCIrCi0gICAgIlwxXHUwMThiXDNcMzQ0XDFcdTAxOGNcNjFcMzQ0XDFcMFwxNVwzNDRcMVx1MDE4ZFw3MlwzNDQiKwotICAgICJcN1wwXDFcdTAxOGVcMTJcMFwxXHUwMThmXDNcMFwxXHUwMTkwXDIzXDBcMVx1MDE5MSIrCi0gICAgIlw0M1wwXDFcdTAxOTJcMjZcMFwxXHUwMTkzXDU1XDBcMVwzNTNcMlwwXDJcdTAxOTQiKwotICAgICJcNlwwXDFcMzUzXDZcMFwxXDM1M1w2XHUwMTk0XDFcMFwxM1x1MDE5NFwxXDAiKwotICAgICJcMTNcdTAxOTRcMVwwXDRcdTAxOTRcMVwwXDRcdTAxOTRcMVwwXDRcdTAxOTRcMVwwIisKLSAgICAiXDFcdTAxOTRcMVx1MDE5NVwxXDBcM1x1MDE5NVwxXHUwMTk2XDRcMzU0XDFcdTAxOTVcMVwwIisKLSAgICAiXDRcdTAxOTVcMVx1MDE5NlwxXDM1NFwxXHUwMTk1XDFcMFwzXHUwMTk1XDFcdTAxOTZcNlwzNTQiKwotICAgICJcMVx1MDE5NVwxM1wzNTRcMVx1MDE5NVwxM1wzNTRcMVx1MDE5NVw0XDM1NFwxXHUwMTk3XDExXDM1NCIrCi0gICAgIlwxXHUwMTk1XDFcMzU0XDIxXDBcMVx1MDE5OFw3XDBcMVx1MDE5OVw1NVwwXDFcNzIiKwotICAgICJcMVwwXDExXDcyXDFcMFwxXDcyXDFcdTAxOWFcNVw3MlwxXDBcNDJcNzIiKwotICAgICJcMVwwXDIwXDcyXDEwNVwzNTdcMVx1MDE5YlwxXDM1N1wxNlwwXDFcdTAxOWNcNzBcMCIrCi0gICAgIlwxXHUwMTk1XDFcMFwzXHUwMTk1XDFcdTAxOTZcNFwzNjFcMVx1MDE5NVwxXDBcNFx1MDE5NSIrCi0gICAgIlwxXHUwMTk2XDFcMzYxXDFcdTAxOTVcMVwwXDNcdTAxOTVcMVx1MDE5Nlw2XDM2MVwxXHUwMTk1IisKLSAgICAiXDEzXDM2MVwxXHUwMTk1XDEzXDM2MVwxXHUwMTk1XDRcMzYxXDFcdTAxOWRcMTFcMzYxXDFcdTAxOTUiKwotICAgICJcMVwzNjFcMTA1XDM2MlwxXHUwMTllXDFcMzYyXDFcNzJcMVwwXDExXDcyXDFcMCIrCi0gICAgIlwxXDcyXDFcMFw1XDcyXDFcMFw0Mlw3MlwxXHUwMTlmXDIwXDcyXDM2XDAiKwotICAgICJcMVx1MDE5M1w1MlwwXDFcdTAxYTBcMTA2XDBcMVx1MDFhMVwxMTJcMFw0XDExNFw3XDAiKwotICAgICJcMVwxMTRcNlwwXDRcMTE0XDJcdTAxYTJcMVwwXDEzXDExNFwxXDBcMTNcMTE0IisKLSAgICAiXDFcMFw0XDExNFwxXDBcMTFcMTE0XDFcMFwxXDExNFw2XDBcNFwxMTQiKwotICAgICJcN1wwXDFcMTE0XDZcMFw0XDExNFwxXHUwMWEyXDFcdTAxYTNcMVwwXDEzXDExNCIrCi0gICAgIlwxXDBcMTNcMTE0XDFcMFw0XDExNFwxXDBcMTFcMTE0XDFcMFwxXDExNCIrCi0gICAgIlw2XDBcNFwxMTRcN1wwXDFcMTE0XDZcMFw2XDExNFwxXDBcMTNcMTE0IisKLSAgICAiXDFcMFwyXDExNFwxXHUwMWE0XDEwXDExNFwxXDBcNFwxMTRcMVwwXDZcMTE0IisKLSAgICAiXDFcdTAxYTRcMlwxMTRcMVwwXDFcMTE0XDEyXDM3NlwxXDM3N1wzXDM3NlwxXDAiKwotICAgICJcNzFcMzc2XDFcMFwxMFwzNzZcMVwzNzdcMlwzNzZcMVx1MDFhNVwxXDM3NlwxXHUwMTAxIisKLSAgICAiXDQ2XDM3NlwxXHUwMWE1XDIwXDM3NlwxNFx1MDEwMlwxXDM3N1wxXHUwMTAyXDFcMFw3MVx1MDEwMiIrCi0gICAgIlwxXDBcMTJcdTAxMDJcMVwzNzdcMVx1MDFhNlwxXHUwMTAyXDFcdTAxMDRcNDZcdTAxMDJcMVx1MDFhNiIrCi0gICAgIlwyMFx1MDEwMlwxXHUwMTA4XDFcMFwxMFx1MDEwOFwxXHUwMTBhXDJcdTAxMDhcMVx1MDFhN1wxXHUwMTA4IisKLSAgICAiXDFcdTAxYThcNDZcdTAxMDhcMVx1MDFhN1wyMFx1MDEwOFwxXDE0M1wyXHUwMTA4XDFcdTAxMDlcMVwxNDMiKwotICAgICJcMVx1MDEwOFw0XDE0M1wxXHUwMTBhXDFcMTQzXDFcdTAxMDhcMVwxNDNcMVwxNDFcMVwxNDMiKwotICAgICJcMVx1MDEwOFw2XDE0M1wxXHUwMTA4XDYwXDE0M1wxXDBcMVx1MDEwOFwxXHUwMTA5XDFcMTQzIisKLSAgICAiXDFcdTAxMDhcNFwxNDNcMVx1MDEwYVwxXDE0M1wxXHUwMTA4XDFcdTAxYTlcMVwxNDNcMVx1MDEwYyIrCi0gICAgIlwxXHUwMTA4XDZcMTQzXDFcdTAxMDhcMzZcMTQzXDFcdTAxYTlcMjBcMTQzXDFcdTAxMGRcMVwwIisKLSAgICAiXDEyXHUwMTBkXDFcdTAxMGFcMVx1MDFhYVwxXHUwMTBkXDFcdTAxYWJcNDZcdTAxMGRcMVx1MDFhYVwyMFx1MDEwZCIrCi0gICAgIlwxXDE0NFwyXHUwMTBkXDFcdTAxMGVcMVwxNDRcMVx1MDEwZFw0XDE0NFwxXHUwMTBkXDFcMTQ0IisKLSAgICAiXDFcdTAxMGFcMVwxNDRcMVwxNDFcMVwxNDRcMVx1MDEwZFw2XDE0NFwxXHUwMTBkXDYwXDE0NCIrCi0gICAgIlwxXDBcMVx1MDEwZFwxXHUwMTBlXDFcMTQ0XDFcdTAxMGRcNFwxNDRcMVx1MDEwZFwxXDE0NCIrCi0gICAgIlwxXHUwMTBhXDFcdTAxYWNcMVwxNDRcMVx1MDExMFwxXHUwMTBkXDZcMTQ0XDFcdTAxMGRcMzZcMTQ0IisKLSAgICAiXDFcdTAxYWNcMjBcMTQ0XDEyXHUwMTE1XDFcdTAxMTZcM1x1MDExNVwxXDBcNzFcdTAxMTVcMVwwIisKLSAgICAiXDEwXHUwMTE1XDFcdTAxMTZcMlx1MDExNVwxXHUwMWFkXDFcdTAxMTVcMVx1MDExOFw0Nlx1MDExNVwxXHUwMWFkIisKLSAgICAiXDIwXHUwMTE1XDE0XHUwMTE5XDFcdTAxMTZcMVx1MDExOVwxXDBcNzFcdTAxMTlcMVwwXDEyXHUwMTE5IisKLSAgICAiXDFcdTAxMTZcMVx1MDFhZVwxXHUwMTE5XDFcdTAxMWJcNDZcdTAxMTlcMVx1MDFhZVwyMFx1MDExOVw2XDAiKwotICAgICJcNFwxNzBcN1wwXDFcMTcwXDZcMFw2XDE3MFwxXDBcMTNcMTcwXDFcMCIrCi0gICAgIlwxM1wxNzBcMVwwXDRcMTcwXDFcMFw2XDE3MFwxXHUwMWFmXDJcMTcwXDFcMCIrCi0gICAgIlwxXDE3MFw2XDBcNFx1MDExZVw3XDBcMVx1MDExZVw2XDBcNlx1MDExZVwxXDAiKwotICAgICJcMTNcdTAxMWVcMVwwXDEzXHUwMTFlXDFcMFw0XHUwMTFlXDFcMFwxMVx1MDExZVwxXDAiKwotICAgICJcMVx1MDExZVw2XDBcNFx1MDEyMFw3XDBcMVx1MDEyMFw2XDBcNlx1MDEyMFwxXDAiKwotICAgICJcMTNcdTAxMjBcMVwwXDEzXHUwMTIwXDFcMFw0XHUwMTIwXDFcMFwxMVx1MDEyMFwxXDAiKwotICAgICJcMVx1MDEyMFwxMlx1MDEyMVwxXHUwMTIyXDNcdTAxMjFcMVwwXDcxXHUwMTIxXDFcMFwxMFx1MDEyMSIrCi0gICAgIlwxXHUwMTIyXDJcdTAxMjFcMVx1MDFiMFwxXHUwMTIxXDFcdTAxMjRcNDZcdTAxMjFcMVx1MDFiMFwyMFx1MDEyMSIrCi0gICAgIlwxNFx1MDEyNVwxXHUwMTIyXDFcdTAxMjVcMVwwXDcxXHUwMTI1XDFcMFwxMlx1MDEyNVwxXHUwMTIyIisKLSAgICAiXDFcdTAxYjFcMVx1MDEyNVwxXHUwMTI3XDQ2XHUwMTI1XDFcdTAxYjFcMjBcdTAxMjVcMVx1MDFiMlwyXHUwMWIzIisKLSAgICAiXDFcdTAxYjRcMVx1MDFiMlwxXHUwMWIzXDRcdTAxYjJcMVx1MDFiM1wxXHUwMWIyXDFcdTAxYjNcM1x1MDFiMiIrCi0gICAgIlwxXHUwMWIzXDZcdTAxYjJcMVx1MDFiM1w1NVx1MDFiMlwxXDE3NVwxXHUwMWIyXDFcdTAxYjVcMlx1MDFiNiIrCi0gICAgIlwxXHUwMWI3XDFcdTAxYjVcMVx1MDFiNlw0XHUwMWI1XDFcdTAxYjZcMVx1MDFiNVwxXHUwMWI2XDNcdTAxYjUiKwotICAgICJcMVx1MDFiNlw2XHUwMWI1XDFcdTAxYjZcNTVcdTAxYjVcMVwxNzVcMVx1MDFiNVwzN1wwXDFcdTAxYjgiKwotICAgICJcMzVcMFwxXHUwMWI4XDUzXDBcMVx1MDFiOVwxNFwwXDFcdTAxYjlcNzNcMFwxXHUwMWJhIisKLSAgICAiXDExXDBcMVx1MDFiYVw3NlwwXDFcdTAxYmJcMjBcMFwxXHUwMWJiXDExM1wwXDFcdTAxYmMiKwotICAgICJcN1wwXDFcdTAxYmNcMlwwXDEyXHUwMTMyXDFcdTAxMzNcM1x1MDEzMlwxXDBcNzFcdTAxMzIiKwotICAgICJcMVwwXDEwXHUwMTMyXDFcdTAxMzNcMlx1MDEzMlwxXHUwMWJkXDFcdTAxMzJcMVx1MDEzNVw0Nlx1MDEzMiIrCi0gICAgIlwxXHUwMWJkXDIwXHUwMTMyXDFcdTAxMzZcMVwwXDEyXHUwMTM2XDFcdTAxMzNcMVx1MDFiZVwxXHUwMTM2IisKLSAgICAiXDFcdTAxM2FcNDZcdTAxMzZcMVx1MDFiZVwyMVx1MDEzNlwxXDBcMTJcdTAxMzZcMVx1MDFiZlwxXHUwMWJlIisKLSAgICAiXDFcdTAxMzZcMVx1MDEzYVw0Nlx1MDEzNlwxXHUwMWJlXDIwXHUwMTM2XDE0XDBcMVx1MDFjMFw3MlwwIisKLSAgICAiXDE0XHUwMTM2XDFcdTAxYmZcMVx1MDEzNlwxXDBcNzFcdTAxMzZcMVwwXDEyXHUwMTM2XDFcdTAxMzMiKwotICAgICJcMVx1MDFjMVwxXHUwMTM2XDFcdTAxM2FcNDZcdTAxMzZcMVx1MDFjMVwyMFx1MDEzNlwxMlx1MDE0NFwxXHUwMTQ1IisKLSAgICAiXDNcdTAxNDRcMVwwXDcxXHUwMTQ0XDFcMFwxMFx1MDE0NFwxXHUwMTQ1XDJcdTAxNDRcMVx1MDFjMiIrCi0gICAgIlwxXHUwMTQ0XDFcdTAxNDdcNDZcdTAxNDRcMVx1MDFjMlwyMFx1MDE0NFwxXHUwMTQ4XDFcMFwxMlx1MDE0OCIrCi0gICAgIlwxXHUwMTQ1XDFcdTAxYzNcMVx1MDE0OFwxXHUwMTRjXDQ2XHUwMTQ4XDFcdTAxYzNcMjFcdTAxNDhcMVwwIisKLSAgICAiXDEyXHUwMTQ4XDFcdTAxYzRcMVx1MDFjM1wxXHUwMTQ4XDFcdTAxNGNcNDZcdTAxNDhcMVx1MDFjM1wyMFx1MDE0OCIrCi0gICAgIlwxNFwwXDFcdTAxYzVcNzJcMFwxNFx1MDE0OFwxXHUwMWM0XDFcdTAxNDhcMVwwXDcxXHUwMTQ4IisKLSAgICAiXDFcMFwxMlx1MDE0OFwxXHUwMTQ1XDFcdTAxYzZcMVx1MDE0OFwxXHUwMTRjXDQ2XHUwMTQ4XDFcdTAxYzYiKwotICAgICJcMjBcdTAxNDhcMlwyMzNcMVwwXDRcMjMzXDFcdTAxYzdcMTJcMjMzXDFcdTAxYzhcM1wyMzMiKwotICAgICJcMVx1MDFjOVwyM1wyMzNcMVx1MDFjYVwzNlwyMzNcMVwwXDMzXDIzM1wxXHUwMWNiXDUwXDIzMyIrCi0gICAgIlwxMlx1MDE1MFwxXHUwMTUxXDNcdTAxNTBcMVwwXDcxXHUwMTUwXDFcMFwxMFx1MDE1MFwxXHUwMTUxIisKLSAgICAiXDJcdTAxNTBcMVx1MDFjY1wxXHUwMTUwXDFcdTAxNTNcNDZcdTAxNTBcMVx1MDFjY1wyMFx1MDE1MFwxXHUwMTU0IisKLSAgICAiXDFcMFwxMlx1MDE1NFwxXHUwMTUxXDFcdTAxY2RcMVx1MDE1NFwxXHUwMTU4XDQ2XHUwMTU0XDFcdTAxY2QiKwotICAgICJcMjFcdTAxNTRcMVwwXDEyXHUwMTU0XDFcdTAxY2VcMVx1MDFjZFwxXHUwMTU0XDFcdTAxNThcNDZcdTAxNTQiKwotICAgICJcMVx1MDFjZFwyMFx1MDE1NFwxNFwwXDFcdTAxY2ZcNzJcMFwxNFx1MDE1NFwxXHUwMWNlXDFcdTAxNTQiKwotICAgICJcMVwwXDcxXHUwMTU0XDFcMFwxMlx1MDE1NFwxXHUwMTUxXDFcdTAxZDBcMVx1MDE1NFwxXHUwMTU4IisKLSAgICAiXDQ2XHUwMTU0XDFcdTAxZDBcMjBcdTAxNTRcMlwyNDJcMVwwXDRcMjQyXDFcdTAxZDFcMTJcMjQyIisKLSAgICAiXDFcdTAxZDJcM1wyNDJcMVx1MDFkM1wyM1wyNDJcMVx1MDFkNFwzNlwyNDJcMVwwXDMzXDI0MiIrCi0gICAgIlwxXHUwMWQ1XDUwXDI0MlwyM1wwXDFcdTAxZDZcNjNcMFwxMlx1MDE1ZFwxXHUwMTVlXDNcdTAxNWQiKwotICAgICJcMVwwXDcxXHUwMTVkXDFcMFwxMFx1MDE1ZFwxXHUwMWQ3XDJcdTAxNWRcMVx1MDFkOFwxXHUwMTVkIisKLSAgICAiXDFcdTAxNjBcNDZcdTAxNWRcMVx1MDFkOFwyMFx1MDE1ZFwxNFx1MDE2MVwxXHUwMTVlXDFcdTAxNjFcMVwwIisKLSAgICAiXDcxXHUwMTYxXDFcMFwxMlx1MDE2MVwxXHUwMWQ5XDFcdTAxZGFcMVx1MDE2MVwxXHUwMTYzXDQ2XHUwMTYxIisKLSAgICAiXDFcdTAxZGFcMjBcdTAxNjFcMVx1MDFkYlwyXHUwMWIzXDFcdTAxZGNcMVx1MDFkYlwxXHUwMWIzXDRcdTAxZGIiKwotICAgICJcMVx1MDFiM1wxXHUwMWRiXDFcdTAxYjNcM1x1MDFkYlwxXHUwMWIzXDZcdTAxZGJcMVx1MDFiM1w1NVx1MDFkYiIrCi0gICAgIlwxXDI1MlwxXHUwMWRiXDFcdTAxZGRcMlx1MDFiNlwxXHUwMWRlXDFcdTAxZGRcMVx1MDFiNlw0XHUwMWRkIisKLSAgICAiXDFcdTAxYjZcMVx1MDFkZFwxXHUwMWI2XDNcdTAxZGRcMVx1MDFiNlw2XHUwMWRkXDFcdTAxYjZcNTVcdTAxZGQiKwotICAgICJcMVwyNTJcMVx1MDFkZFw1XDBcMVx1MDE2N1wxMlwwXDFcdTAxNjdcNlwwXDFcdTAxNjciKwotICAgICJcNTdcMFwxMlwyNzRcMVwwXDFcMjc0XDFcMFwxXDI3NFwxXHUwMWRmXDY2XDI3NCIrCi0gICAgIlwxXHUwMTZmXDEwXDI3NFwxXHUwMWUwXDJcMjc0XDFcMFwxXDI3NFwxXDBcMVx1MDE2YyIrCi0gICAgIlw0XDI3NFwxXHUwMWUxXDNcMjc0XDFcdTAxZTJcMjNcMjc0XDFcdTAxZTNcMzJcMjc0XDFcMCIrCi0gICAgIlwxXDI3NFwxMlx1MDFkZlwxXDBcMVx1MDFkZlwxXDBcNzBcdTAxZGZcMVwwXDFcdTAxZGYiKwotICAgICJcMTJcdTAxNmZcMVwwXDFcdTAxNmZcMVwwXDFcdTAxZTRcNjdcdTAxNmZcMVwwXDFcdTAxNmYiKwotICAgICJcN1x1MDE3MFwxXHUwMWU1XDRcdTAxNzBcMVx1MDE3MVw1XHUwMTcwXDFcdTAxZTZcM1x1MDE3MFwxXHUwMWU3IisKLSAgICAiXDIzXHUwMTcwXDFcdTAxZThcNTBcdTAxNzBcMVx1MDE3MVwyMVx1MDE3MFwxXHUwMWU5XDUwXHUwMTcwXDdcdTAxNzQiKwotICAgICJcMVx1MDFlYVwyXHUwMTc0XDFcdTAxNzVcN1x1MDE3NFwxXHUwMWViXDNcdTAxNzRcMVx1MDFlY1wyM1x1MDE3NCIrCi0gICAgIlwxXHUwMWVkXDQ2XHUwMTc0XDFcdTAxNzVcMjNcdTAxNzRcMVx1MDFlZVw1MFx1MDE3NFwxMlwzMTJcMVwwIisKLSAgICAiXDEwM1wzMTJcMVx1MDFlZlwyXDMxMlwxXDBcNFwzMTJcMVx1MDE3OFwyXDMxMlwxXHUwMWYwIisKLSAgICAiXDNcMzEyXDFcdTAxZjFcMjNcMzEyXDFcdTAxZjJcMzJcMzEyXDFcMFwxXDMxMlwxN1x1MDFmMyIrCi0gICAgIlwxXHUwMWY0XDY3XHUwMWYzXDE0XDMxN1wxXDBcMTAxXDMxN1wxXHUwMWY1XDRcMzE3XDFcMCIrCi0gICAgIlwyXDMxN1wxXHUwMTdiXDJcMzE3XDFcdTAxZjZcM1wzMTdcMVx1MDFmN1wyM1wzMTdcMVx1MDFmOCIrCi0gICAgIlwzMlwzMTdcMVwwXDFcMzE3XDE3XHUwMWY5XDFcdTAxZmFcNjdcdTAxZjlcN1wzMjJcMVx1MDFmYiIrCi0gICAgIlwyXDMyMlwxXDBcMVwzMjJcMVwwXDVcMzIyXDFcdTAxZmNcM1wzMjJcMVx1MDFmZCIrCi0gICAgIlwyM1wzMjJcMVx1MDFmZVwzMlwzMjJcMVwwXDFcMzIyXDdcdTAxODBcMVx1MDFmZlw0XHUwMTgwIisKLSAgICAiXDFcdTAxODFcNVx1MDE4MFwxXHUwMjAwXDNcdTAxODBcMVx1MDIwMVwyM1x1MDE4MFwxXHUwMjAyXDUwXHUwMTgwIisKLSAgICAiXDFcdTAxODFcMjFcdTAxODBcMVx1MDIwM1w1MFx1MDE4MFw3XHUwMTg0XDFcdTAyMDRcMlx1MDE4NFwxXHUwMTg1IisKLSAgICAiXDdcdTAxODRcMVx1MDIwNVwzXHUwMTg0XDFcdTAyMDZcMjNcdTAxODRcMVx1MDIwN1w0Nlx1MDE4NFwxXHUwMTg1IisKLSAgICAiXDIzXHUwMTg0XDFcdTAyMDhcNTBcdTAxODRcMTJcMzQwXDFcMFwxMDNcMzQwXDFcdTAyMDlcMlwzNDAiKwotICAgICJcMVwwXDRcMzQwXDFcdTAxODhcMlwzNDBcMVx1MDIwYVwzXDM0MFwxXHUwMjBiXDIzXDM0MCIrCi0gICAgIlwxXHUwMjBjXDMyXDM0MFwxXDBcMVwzNDBcMTdcdTAyMGRcMVx1MDIwZVw2N1x1MDIwZFwxNFwzNDQiKwotICAgICJcMVwwXDEwMVwzNDRcMVx1MDIwZlw0XDM0NFwxXDBcMlwzNDRcMVx1MDE4YlwyXDM0NCIrCi0gICAgIlwxXHUwMjEwXDNcMzQ0XDFcdTAyMTFcMjNcMzQ0XDFcdTAyMTJcMzJcMzQ0XDFcMFwxXDM0NCIrCi0gICAgIlwxN1x1MDIxM1wxXHUwMjE0XDY3XHUwMjEzXDdcMFwxXHUwMjE1XDEwNlwwXDFcdTAyMTZcMTM2XDAiKwotICAgICJcMVx1MDIxN1w0N1wwXDFcdTAxOTRcMVwwXDExXHUwMTk0XDFcMFw3XHUwMTk0XDFcMCIrCi0gICAgIlw2M1x1MDE5NFwxXHUwMTk1XDFcMFwxMVx1MDE5NVwxXDBcN1x1MDE5NVwxXDBcNDdcdTAxOTUiKwotICAgICJcMVwwXDE0XHUwMTk1XDFcMFwzXHUwMTk1XDFcdTAxOTZcNVx1MDE5NVwxXDBcNFx1MDE5NSIrCi0gICAgIlwxXHUwMTk2XDJcdTAxOTVcMVwwXDNcdTAxOTVcMVx1MDE5Nlw0M1x1MDE5NVwxXHUwMjE4XDEzXHUwMTk1IisKLSAgICAiXDIxXDBcMVx1MDE5OFw1MVwwXDFcdTAyMTlcMzRcMFwxXHUwMjFhXDE1XDBcM1x1MDIxYSIrCi0gICAgIlwyXDBcMVx1MDIxYVwxMVwwXDFcdTAyMWFcMVwwXDJcdTAyMWFcN1wwXDFcdTAyMWEiKwotICAgICJcMlwwXDJcdTAyMWFcNlwwXDFcdTAyMWFcMTdcMFwxXHUwMTlhXDE1N1wwXDFcdTAxOWYiKwotICAgICJcMjZcMFwxXDExNFwxXHUwMjFiXDJcMTE0XDdcMFwxXDExNFw2XDBcNlwxMTQiKwotICAgICJcMVwwXDEzXDExNFwxXDBcMTNcMTE0XDFcMFw0XDExNFwxXDBcMTFcMTE0IisKLSAgICAiXDFcMFwxXDExNFw2XDBcNFwxMTRcN1wwXDFcMTE0XDZcMFw2XDExNCIrCi0gICAgIlwxXDBcMTFcMTE0XDFcdTAyMWNcMVwxMTRcMVwwXDFcdTAyMWNcMTJcMTE0XDFcMCIrCi0gICAgIlw0XDExNFwxXDBcMTFcMTE0XDFcMFwxXDExNFwxMlwzNzZcMVwzNzdcNzRcMzc2IisKLSAgICAiXDE0XHUwMTAyXDFcMzc3XDcyXHUwMTAyXDEyXHUwMTA4XDFcdTAxMGFcM1x1MDEwOFwxXDBcNzFcdTAxMDgiKwotICAgICJcMVwwXDEwXHUwMTA4XDFcdTAxMGFcMlx1MDEwOFwxXHUwMjFkXDFcdTAxMDhcMVx1MDFhOFw0Nlx1MDEwOCIrCi0gICAgIlwxXHUwMjFkXDIwXHUwMTA4XDFcMTQzXDJcdTAxMDhcMVx1MDEwOVwxXDE0M1wxXHUwMTA4XDRcMTQzIisKLSAgICAiXDFcdTAxMGFcMVwxNDNcMVx1MDEwOFwzXDE0M1wxXHUwMTA4XDZcMTQzXDFcdTAxMDhcNTdcMTQzIisKLSAgICAiXDE0XHUwMTBkXDFcdTAxMGFcMVx1MDEwZFwxXDBcNzFcdTAxMGRcMVwwXDEyXHUwMTBkXDFcdTAxMGEiKwotICAgICJcMVx1MDIxZVwxXHUwMTBkXDFcdTAxYWJcNDZcdTAxMGRcMVx1MDIxZVwyMFx1MDEwZFwxXDE0NFwyXHUwMTBkIisKLSAgICAiXDFcdTAxMGVcMVwxNDRcMVx1MDEwZFw0XDE0NFwxXHUwMTBkXDFcMTQ0XDFcdTAxMGFcM1wxNDQiKwotICAgICJcMVx1MDEwZFw2XDE0NFwxXHUwMTBkXDU3XDE0NFwxMlx1MDExNVwxXHUwMTE2XDc0XHUwMTE1XDE0XHUwMTE5IisKLSAgICAiXDFcdTAxMTZcNzJcdTAxMTlcNlwwXDNcMTcwXDFcdTAyMWZcN1wwXDFcMTcwXDZcMCIrCi0gICAgIlw2XDE3MFwxXDBcMTNcMTcwXDFcMFwxM1wxNzBcMVwwXDRcMTcwXDFcMCIrCi0gICAgIlwxMVwxNzBcMVwwXDFcMTcwXDEyXHUwMTIxXDFcdTAxMjJcNzRcdTAxMjFcMTRcdTAxMjVcMVx1MDEyMiIrCi0gICAgIlw3Mlx1MDEyNVwxXHUwMWIyXDJcdTAxYjNcMVx1MDFiNFwxXHUwMWIyXDFcdTAxYjNcNFx1MDFiMlwxXHUwMWIzIisKLSAgICAiXDFcdTAxYjJcMVx1MDFiM1wzXHUwMWIyXDFcdTAxYjNcNlx1MDFiMlwxXHUwMWIzXDU1XHUwMWIyXDFcdTAyMjAiKwotICAgICJcMVx1MDFiMlwxMDVcdTAxYjNcMVx1MDIyMVwxXHUwMWIzXDFcdTAxYjVcMlx1MDFiNlwxXHUwMWI3XDFcdTAxYjUiKwotICAgICJcMVx1MDFiNlw0XHUwMWI1XDFcdTAxYjZcMVx1MDFiNVwxXHUwMWI2XDNcdTAxYjVcMVx1MDFiNlw2XHUwMWI1IisKLSAgICAiXDFcdTAxYjZcNTVcdTAxYjVcMVx1MDIyMFwxXHUwMWI1XDEwNVx1MDFiNlwxXHUwMjIyXDFcdTAxYjZcNDJcMCIrCi0gICAgIlwxXHUwMjIzXDE0XDBcMVx1MDIyM1w2M1wwXDJcdTAyMjRcMTAzXDBcMlx1MDIyNVwxMTVcMCIrCi0gICAgIlwxXHUwMjI2XDE0XDBcMVx1MDIyNlw2M1wwXDJcdTAyMjdcNTFcMFwxMlx1MDEzMlwxXHUwMTMzIisKLSAgICAiXDc0XHUwMTMyXDE0XHUwMTM2XDFcdTAxMzNcMVx1MDEzNlwxXDBcNzBcdTAxMzZcM1wwXDJcdTAyMjgiKwotICAgICJcMVwwXDRcdTAyMjhcMlwwXDFcdTAxMzhcMVx1MDIyOFwyXDBcNFx1MDIyOFwxXDAiKwotICAgICJcMTFcdTAyMjhcMVwwXDQwXHUwMjI4XDJcMFw0XHUwMjI4XDFcMFwxXHUwMjI4XDE0XHUwMTM2IisKLSAgICAiXDFcdTAxMzNcNzJcdTAxMzZcMTJcdTAxNDRcMVx1MDE0NVw3NFx1MDE0NFwxNFx1MDE0OFwxXHUwMTQ1XDFcdTAxNDgiKwotICAgICJcMVwwXDcwXHUwMTQ4XDNcMFwyXHUwMjI5XDFcMFw0XHUwMjI5XDJcMFwxXHUwMTRhIisKLSAgICAiXDFcdTAyMjlcMlwwXDRcdTAyMjlcMVwwXDExXHUwMjI5XDFcMFw0MFx1MDIyOVwyXDAiKwotICAgICJcNFx1MDIyOVwxXDBcMVx1MDIyOVwxNFx1MDE0OFwxXHUwMTQ1XDcyXHUwMTQ4XDJcMjMzXDFcMCIrCi0gICAgIlw0XDIzM1wxXHUwMjJhXDEwMVwyMzNcMVwwXDM0XDIzM1wxXHUwMjJiXDQ3XDIzM1wxMlx1MDE1MCIrCi0gICAgIlwxXHUwMTUxXDc0XHUwMTUwXDE0XHUwMTU0XDFcdTAxNTFcMVx1MDE1NFwxXDBcNzBcdTAxNTRcM1wwIisKLSAgICAiXDJcdTAyMmNcMVwwXDRcdTAyMmNcMlwwXDFcdTAxNTZcMVx1MDIyY1wyXDBcNFx1MDIyYyIrCi0gICAgIlwxXDBcMTFcdTAyMmNcMVwwXDQwXHUwMjJjXDJcMFw0XHUwMjJjXDFcMFwxXHUwMjJjIisKLSAgICAiXDE0XHUwMTU0XDFcdTAxNTFcNzJcdTAxNTRcMlwyNDJcMVwwXDRcMjQyXDFcdTAyMmRcMTAxXDI0MiIrCi0gICAgIlwxXDBcMzRcMjQyXDFcdTAyMmVcNDdcMjQyXDJcMFwxXHUwMjJmXDEwNFwwXDEyXHUwMTVkIisKLSAgICAiXDFcdTAxNWVcNzRcdTAxNWRcMTRcdTAxNjFcMVx1MDE1ZVw3Mlx1MDE2MVwxXHUwMWRiXDJcdTAxYjNcMVx1MDFkYyIrCi0gICAgIlwxXHUwMWRiXDFcdTAxYjNcNFx1MDFkYlwxXHUwMWIzXDFcdTAxZGJcMVx1MDFiM1wzXHUwMWRiXDFcdTAxYjMiKwotICAgICJcNlx1MDFkYlwxXHUwMWIzXDU1XHUwMWRiXDFcdTAyMzBcMVx1MDFkYlwxXHUwMWRkXDJcdTAxYjZcMVx1MDFkZSIrCi0gICAgIlwxXHUwMWRkXDFcdTAxYjZcNFx1MDFkZFwxXHUwMWI2XDFcdTAxZGRcMVx1MDFiNlwzXHUwMWRkXDFcdTAxYjYiKwotICAgICJcNlx1MDFkZFwxXHUwMWI2XDU1XHUwMWRkXDFcdTAyMzBcMVx1MDFkZFw3XDI3NFwxXHUwMjMxXDJcMjc0IisKLSAgICAiXDFcMFwxXDI3NFwxXDBcMVx1MDE2Y1w2N1wyNzRcMVwwXDFcMjc0XDEyXHUwMTZmIisKLSAgICAiXDFcMFwxXHUwMTZmXDFcMFwxXHUwMTZmXDFcMFw3MFx1MDE2Zlw3XHUwMTcwXDFcdTAyMzIiKwotICAgICJcNFx1MDE3MFwxXHUwMTcxXDEwNlx1MDE3MFwxXHUwMTcxXDIyXHUwMTcwXDFcdTAyMzNcNDdcdTAxNzBcN1x1MDE3NCIrCi0gICAgIlwxXHUwMjM0XDJcdTAxNzRcMVx1MDE3NVwxMDZcdTAxNzRcMVx1MDE3NVwyNFx1MDE3NFwxXHUwMjM1XDQ3XHUwMTc0IisKLSAgICAiXDdcMzEyXDFcdTAyMzZcMlwzMTJcMVwwXDRcMzEyXDFcdTAxNzhcNjVcMzEyXDFcMCIrCi0gICAgIlwxXDMxMlwxMlx1MDIzN1wxXHUwMjM4XDcyXHUwMjM3XDFcMFwxXHUwMjM3XDdcMzE3XDFcdTAyMzkiKwotICAgICJcNFwzMTdcMVwwXDJcMzE3XDFcdTAxN2JcNjVcMzE3XDFcMFwxXDMxN1wxNFx1MDIzYSIrCi0gICAgIlwxXHUwMjM4XDcwXHUwMjNhXDFcMFwxXHUwMjNhXDdcMzIyXDFcdTAyM2JcMlwzMjJcMVwwIisKLSAgICAiXDFcMzIyXDFcMFw3MFwzMjJcMVwwXDFcMzIyXDdcdTAxODBcMVx1MDIzY1w0XHUwMTgwIisKLSAgICAiXDFcdTAxODFcMTA2XHUwMTgwXDFcdTAxODFcMjJcdTAxODBcMVx1MDIzZFw0N1x1MDE4MFw3XHUwMTg0XDFcdTAyM2UiKwotICAgICJcMlx1MDE4NFwxXHUwMTg1XDEwNlx1MDE4NFwxXHUwMTg1XDI0XHUwMTg0XDFcdTAyM2ZcNDdcdTAxODRcN1wzNDAiKwotICAgICJcMVx1MDI0MFwyXDM0MFwxXDBcNFwzNDBcMVx1MDE4OFw2NVwzNDBcMVwwXDFcMzQwIisKLSAgICAiXDEyXHUwMjQxXDFcdTAyNDJcNzJcdTAyNDFcMVwwXDFcdTAyNDFcN1wzNDRcMVx1MDI0M1w0XDM0NCIrCi0gICAgIlwxXDBcMlwzNDRcMVx1MDE4Ylw2NVwzNDRcMVwwXDFcMzQ0XDE0XHUwMjQ0XDFcdTAyNDIiKwotICAgICJcNzBcdTAyNDRcMVwwXDFcdTAyNDRcNDBcMFwxXHUwMjQ1XDE0MVwwXDFcdTAyMThcMzRcMCIrCi0gICAgIlwxXHUwMjFhXDE1XDBcM1x1MDIxYVwyXDBcMVx1MDIxYVwxMVwwXDFcdTAyMWFcMVwwIisKLSAgICAiXDJcdTAyMWFcN1wwXDFcdTAyMWFcMVwwXDFcdTAyMTlcMlx1MDIxYVw2XDBcMVx1MDIxYSIrCi0gICAgIlwxMFwwXDRcMTE0XDdcMFwxXDExNFw2XDBcNlwxMTRcMVwwXDdcMTE0IisKLSAgICAiXDFcdTAyNDZcM1wxMTRcMVwwXDEzXDExNFwxXDBcNFwxMTRcMVwwXDExXDExNCIrCi0gICAgIlwxXDBcMVwxMTRcNlwwXDRcMTE0XDdcMFwxXDExNFw2XDBcNlwxMTQiKwotICAgICJcMVwwXDZcMTE0XDFcdTAyNDdcNFwxMTRcMVwwXDEzXDExNFwxXDBcMVwxMTQiKwotICAgICJcMVx1MDI0N1wyXDExNFwxXDBcMTFcMTE0XDFcMFwxXDExNFwxMlx1MDEwOFwxXHUwMTBhIisKLSAgICAiXDc0XHUwMTA4XDE0XHUwMTBkXDFcdTAxMGFcNzJcdTAxMGRcNlwwXDRcMTcwXDdcMFwxXDE3MCIrCi0gICAgIlw2XDBcNlwxNzBcMVwwXDZcMTcwXDFcdTAyNDhcNFwxNzBcMVwwXDZcMTcwIisKLSAgICAiXDFcdTAyNDlcNFwxNzBcMVwwXDRcMTcwXDFcMFwxMVwxNzBcMVwwXDFcMTcwIisKLSAgICAiXDU0XDBcMVx1MDI0YVw1XDBcMVx1MDI0YVw3M1wwXDFcdTAyNGJcMTRcMFwxXHUwMjRiIisKLSAgICAiXDY2XDBcMVx1MDI0Y1wxMVwwXDFcdTAyNGNcNzRcMFwxXHUwMjRkXDExXDBcMVx1MDI0ZCIrCi0gICAgIlw3N1wwXDFcdTAyNGVcMTRcMFwxXHUwMjRlXDIyXDBcMlwyMzNcMVwwXDM1XDIzMyIrCi0gICAgIlwxXHUwMjRmXDQ2XDIzM1wyXDI0MlwxXDBcMzVcMjQyXDFcdTAyNTBcNDZcMjQyXDE0XHUwMTcwIisKLSAgICAiXDFcdTAxNzFcMjNcdTAxNzBcMVx1MDI1MVw0Nlx1MDE3MFwxMlx1MDE3NFwxXHUwMTc1XDI1XHUwMTc0XDFcdTAyNTIiKwotICAgICJcNDZcdTAxNzRcMTJcdTAyMzdcMVx1MDFmM1w0XHUwMjM3XDFcdTAyNTNcNjVcdTAyMzdcMVx1MDFmM1wxXHUwMjM3IisKLSAgICAiXDE0XHUwMjNhXDFcdTAxZjlcMlx1MDIzYVwxXHUwMjU0XDY1XHUwMjNhXDFcdTAxZjlcMVx1MDIzYVwxNFx1MDE4MCIrCi0gICAgIlwxXHUwMTgxXDIzXHUwMTgwXDFcdTAyNTVcNDZcdTAxODBcMTJcdTAxODRcMVx1MDE4NVwyNVx1MDE4NFwxXHUwMjU2IisKLSAgICAiXDQ2XHUwMTg0XDEyXHUwMjQxXDFcdTAyMGRcNFx1MDI0MVwxXHUwMjU3XDY1XHUwMjQxXDFcdTAyMGRcMVx1MDI0MSIrCi0gICAgIlwxNFx1MDI0NFwxXHUwMjEzXDJcdTAyNDRcMVx1MDI1OFw2NVx1MDI0NFwxXHUwMjEzXDFcdTAyNDRcNDFcMCIrCi0gICAgIlwxXHUwMjU5XDUzXDBcNFwxMTRcN1wwXDFcMTE0XDZcMFw2XDExNFwxXDAiKwotICAgICJcMTNcMTE0XDFcMFw0XDExNFwxXHUwMjVhXDZcMTE0XDFcMFw0XDExNFwxXDAiKwotICAgICJcMTFcMTE0XDFcMFwxXDExNFw2XDBcNFwxMTRcN1wwXDFcMTE0XDZcMCIrCi0gICAgIlw2XDExNFwxXDBcM1wxMTRcMVx1MDI1Ylw3XDExNFwxXDBcNFwxMTRcMVx1MDI1YiIrCi0gICAgIlw2XDExNFwxXDBcNFwxMTRcMVwwXDExXDExNFwxXDBcMVwxMTRcNlwwIisKLSAgICAiXDRcMTcwXDdcMFwxXDE3MFw2XDBcNlwxNzBcMVwwXDExXDE3MFwxXHUwMjVjIisKLSAgICAiXDFcMTcwXDFcMFwxM1wxNzBcMVwwXDRcMTcwXDFcMFwxMVwxNzBcMVwwIisKLSAgICAiXDFcMTcwXDZcMFw0XDE3MFw3XDBcMVwxNzBcNlwwXDZcMTcwXDFcMCIrCi0gICAgIlwxMFwxNzBcMVx1MDI1ZFwyXDE3MFwxXDBcMTNcMTcwXDFcMFw0XDE3MFwxXDAiKwotICAgICJcMTFcMTcwXDFcMFwxXDE3MFw1NVwwXDFcdTAyNWVcMjRcMFwxXHUwMjVlXDUyXDAiKwotICAgICJcMVx1MDI1ZlwyMFwwXDFcdTAyNWZcNzBcMFwxXHUwMjYwXDEzXDBcMVx1MDI2MFw1M1wwIisKLSAgICAiXDJcdTAyNjFcMTEyXDBcMVx1MDI2MlwzNVwwXDFcdTAyNjJcMTFcMFwyXDIzM1wxXDAiKwotICAgICJcMzZcMjMzXDFcdTAyNjNcNDVcMjMzXDJcMjQyXDFcMFwzNlwyNDJcMVx1MDI2NFw0NVwyNDIiKwotICAgICJcMTRcdTAxNzBcMVx1MDE3MVwyNFx1MDE3MFwxXHUwMjY1XDQ1XHUwMTcwXDEyXHUwMTc0XDFcdTAxNzVcMjZcdTAxNzQiKwotICAgICJcMVx1MDI2Nlw0NVx1MDE3NFwxMlx1MDIzN1wxXHUwMjY3XDRcdTAyMzdcMVx1MDI1M1w2NVx1MDIzN1wxXHUwMWYzIisKLSAgICAiXDFcdTAyMzdcMTRcdTAyM2FcMVx1MDI2OFwyXHUwMjNhXDFcdTAyNTRcNjVcdTAyM2FcMVx1MDFmOVwxXHUwMjNhIisKLSAgICAiXDE0XHUwMTgwXDFcdTAxODFcMjRcdTAxODBcMVx1MDI2OVw0NVx1MDE4MFwxMlx1MDE4NFwxXHUwMTg1XDI2XHUwMTg0IisKLSAgICAiXDFcdTAyNmFcNDVcdTAxODRcMTJcdTAyNDFcMVx1MDI2Ylw0XHUwMjQxXDFcdTAyNTdcNjVcdTAyNDFcMVx1MDIwZCIrCi0gICAgIlwxXHUwMjQxXDE0XHUwMjQ0XDFcdTAyNmNcMlx1MDI0NFwxXHUwMjU4XDY1XHUwMjQ0XDFcdTAyMTNcMVx1MDI0NCIrCi0gICAgIlw0MlwwXDFcdTAyNmRcNTJcMFw0XDExNFw3XDBcMVwxMTRcNlwwXDZcMTE0IisKLSAgICAiXDFcMFwxM1wxMTRcMVwwXDdcMTE0XDFcdTAyNmVcM1wxMTRcMVwwXDRcMTE0IisKLSAgICAiXDFcMFwxMVwxMTRcMVwwXDFcMTE0XDZcMFw0XDE3MFw3XDBcMVwxNzAiKwotICAgICJcNlwwXDZcMTcwXDFcMFwxMVwxNzBcMVx1MDI2ZlwxXDE3MFwxXDBcMTNcMTcwIisKLSAgICAiXDFcMFw0XDE3MFwxXDBcMTFcMTcwXDFcMFwxXDE3MFw2XDBcNFwxNzAiKwotICAgICJcN1wwXDFcMTcwXDZcMFw2XDE3MFwxXDBcNlwxNzBcMVx1MDI3MFw0XDE3MCIrCi0gICAgIlwxXDBcMTNcMTcwXDFcMFw0XDE3MFwxXDBcMTFcMTcwXDFcMFwxXDE3MCIrCi0gICAgIlw0NFwwXDFcdTAyNzFcMTFcMFwxXHUwMjcxXDcyXDBcMVx1MDI3MlwxNFwwXDFcdTAyNzIiKwotICAgICJcNzFcMFwxXHUwMjczXDE0XDBcMVx1MDI3M1wyN1wwXDJcMjMzXDFcMFwzN1wyMzMiKwotICAgICJcMVx1MDI3NFw0NFwyMzNcMlwyNDJcMVwwXDM3XDI0MlwxXHUwMjc1XDQ0XDI0MlwxNFx1MDE3MCIrCi0gICAgIlwxXHUwMTcxXDI1XHUwMTcwXDFcdTAyNzZcNDRcdTAxNzBcMTJcdTAxNzRcMVx1MDE3NVwyN1x1MDE3NFwxXHUwMjc3IisKLSAgICAiXDQ0XHUwMTc0XDE0XHUwMTgwXDFcdTAxODFcMjVcdTAxODBcMVx1MDI3OFw0NFx1MDE4MFwxMlx1MDE4NFwxXHUwMTg1IisKLSAgICAiXDI3XHUwMTg0XDFcdTAyNzlcNDRcdTAxODRcNDFcMFwxXHUwMjdhXDUzXDBcNFwxMTRcN1wwIisKLSAgICAiXDFcMTE0XDZcMFw1XDExNFwxXHUwMjdiXDFcMFwxM1wxMTRcMVwwXDEzXDExNCIrCi0gICAgIlwxXDBcNFwxMTRcMVwwXDExXDExNFwxXDBcMVwxMTRcNlwwXDRcMTcwIisKLSAgICAiXDdcMFwxXDE3MFw2XDBcNlwxNzBcMVwwXDEzXDE3MFwxXDBcNFwxNzAiKwotICAgICJcMVx1MDI3Y1w2XDE3MFwxXDBcNFwxNzBcMVwwXDExXDE3MFwxXDBcMVwxNzAiKwotICAgICJcNlwwXDRcMTcwXDdcMFwxXDE3MFw2XDBcNlwxNzBcMVwwXDVcMTcwIisKLSAgICAiXDFcdTAyN2RcNVwxNzBcMVwwXDEzXDE3MFwxXDBcNFwxNzBcMVwwXDExXDE3MCIrCi0gICAgIlwxXDBcMVwxNzBcMlwyMzNcMVwwXDM2XDIzM1wxXHUwMjdlXDQ1XDIzM1wyXDI0MiIrCi0gICAgIlwxXDBcMzZcMjQyXDFcdTAyN2ZcNDVcMjQyXDE0XHUwMTcwXDFcdTAxNzFcMjRcdTAxNzBcMVx1MDI4MCIrCi0gICAgIlw0NVx1MDE3MFwxMlx1MDE3NFwxXHUwMTc1XDI2XHUwMTc0XDFcdTAyODFcNDVcdTAxNzRcMTRcdTAxODBcMVx1MDE4MSIrCi0gICAgIlwyNFx1MDE4MFwxXHUwMjgyXDQ1XHUwMTgwXDEyXHUwMTg0XDFcdTAxODVcMjZcdTAxODRcMVx1MDI4M1w0NVx1MDE4NCIrCi0gICAgIlwzNlwwXDFcdTAyODRcNTZcMFw0XDExNFw3XDBcMVwxMTRcNlwwXDZcMTE0IisKLSAgICAiXDFcMFw1XDExNFwxXHUwMjg1XDVcMTE0XDFcMFwxM1wxMTRcMVwwXDRcMTE0IisKLSAgICAiXDFcMFwxMVwxMTRcMVwwXDFcMTE0XDZcMFw0XDE3MFw3XDBcMVwxNzAiKwotICAgICJcNlwwXDZcMTcwXDFcMFwxM1wxNzBcMVwwXDEzXDE3MFwxXDBcNFwxNzAiKwotICAgICJcMVwwXDFcMTcwXDFcdTAyODZcN1wxNzBcMVwwXDFcMTcwXDJcMjMzXDFcMCIrCi0gICAgIlwzM1wyMzNcMVx1MDI4N1w1MFwyMzNcMlwyNDJcMVwwXDMzXDI0MlwxXHUwMjg4XDUwXDI0MiIrCi0gICAgIlwxNFx1MDE3MFwxXHUwMTcxXDIxXHUwMTcwXDFcdTAyODlcNTBcdTAxNzBcMTJcdTAxNzRcMVx1MDE3NVwyM1x1MDE3NCIrCi0gICAgIlwxXHUwMjhhXDUwXHUwMTc0XDE0XHUwMTgwXDFcdTAxODFcMjFcdTAxODBcMVx1MDI4Ylw1MFx1MDE4MFwxMlx1MDE4NCIrCi0gICAgIlwxXHUwMTg1XDIzXHUwMTg0XDFcdTAyOGNcNTBcdTAxODRcNlwwXDRcMTE0XDdcMFwxXDExNCIrCi0gICAgIlw2XDBcNlwxMTRcMVwwXDdcMTE0XDFcdTAyOGRcM1wxMTRcMVwwXDEzXDExNCIrCi0gICAgIlwxXDBcNFwxMTRcMVwwXDExXDExNFwxXDBcMVwxMTRcNlwwXDRcMTcwIisKLSAgICAiXDdcMFwxXDE3MFw2XDBcNlwxNzBcMVwwXDEzXDE3MFwxXDBcNFwxNzAiKwotICAgICJcMVx1MDI4ZVw2XDE3MFwxXDBcNFwxNzBcMVwwXDExXDE3MFwxXDBcMVwxNzAiKwotICAgICJcNlwwXDRcMTE0XDdcMFwxXDExNFw2XDBcNlwxMTRcMVwwXDEzXDExNCIrCi0gICAgIlwxXDBcMTNcMTE0XDFcMFw0XDExNFwxXDBcMTFcMTE0XDFcMFwxXHUwMjhmIisKLSAgICAiXDZcMFw0XDE3MFw3XDBcMVwxNzBcNlwwXDZcMTcwXDFcMFwxMFwxNzAiKwotICAgICJcMVx1MDI5MFwyXDE3MFwxXDBcMTNcMTcwXDFcMFw0XDE3MFwxXDBcMTFcMTcwIisKLSAgICAiXDFcMFwxXDE3MFw2XDBcNFwxMTRcN1wwXDFcMTE0XDZcMFw2XDExNCIrCi0gICAgIlwxXDBcNVwxMTRcMVx1MDI5MVw1XDExNFwxXDBcMTNcMTE0XDFcMFw0XDExNCIrCi0gICAgIlwxXDBcMTFcMTE0XDFcMFwxXDExNFw2XDBcNFwxNzBcN1wwXDFcMTcwIisKLSAgICAiXDZcMFw2XDE3MFwxXDBcNFwxNzBcMVx1MDI5Mlw2XDE3MFwxXDBcMTNcMTcwIisKLSAgICAiXDFcMFw0XDE3MFwxXDBcMTFcMTcwXDFcMFwxXDE3MFw2XDBcNFwxMTQiKwotICAgICJcN1wwXDFcMTE0XDZcMFw2XDExNFwxXDBcNVwxMTRcMVx1MDI5M1w1XDExNCIrCi0gICAgIlwxXDBcMTNcMTE0XDFcMFw0XDExNFwxXDBcMTFcMTE0XDFcMFwxXDExNCIrCi0gICAgIlw2XDBcNFwxNzBcN1wwXDFcMTcwXDZcMFw2XDE3MFwxXDBcNVwxNzAiKwotICAgICJcMVx1MDI5NFw1XDE3MFwxXDBcMTNcMTcwXDFcMFw0XDE3MFwxXDBcMTFcMTcwIisKLSAgICAiXDFcMFwxXDE3MFw2XDBcNFwxMTRcN1wwXDFcMTE0XDZcMFw2XDExNCIrCi0gICAgIlwxXDBcMTNcMTE0XDFcMFw0XDExNFwxXHUwMjk1XDZcMTE0XDFcMFw0XDExNCIrCi0gICAgIlwxXDBcMTFcMTE0XDFcMFwxXDExNFw2XHUwMjk2XDRcdTAyOTdcN1x1MDI5NlwxXHUwMjk3IisKLSAgICAiXDVcdTAyOTZcMVwwXDZcdTAyOTdcMVx1MDI5NlwxM1x1MDI5N1wxXHUwMjk2XDEzXHUwMjk3XDFcdTAyOTYiKwotICAgICJcNFx1MDI5N1wxXHUwMjk2XDExXHUwMjk3XDFcdTAyOTZcMVx1MDI5N1w0M1wwXDFcdTAyOThcM1wwIisKLSAgICAiXDFcdTAyOTlcN1wwXDFcdTAyOWFcMVx1MDI5YlwyMVwwXDFcdTAyOWNcMTJcMFw0XDE3MCIrCi0gICAgIlw3XDBcMVwxNzBcNlwwXDZcMTcwXDFcMFw0XDE3MFwxXHUwMjlkXDNcMTcwIisKLSAgICAiXDFcdTAyOWVcMlwxNzBcMVwwXDRcMTcwXDFcdTAyOWZcMVx1MDJhMFw1XDE3MFwxXDAiKwotICAgICJcNFwxNzBcMVwwXDZcMTcwXDFcdTAyYTFcMlwxNzBcMVwwXDFcMTcwXDYwXDAiKwotICAgICJcMVx1MDJhMlw3N1wwXDFcdTAyYTNcMTE1XDBcMVx1MDJhNFwxMDVcMFwxXHUwMmE1XDEwN1wwIisKLSAgICAiXDFcdTAyYTZcMzRcMFw0XDE3MFw3XDBcMVwxNzBcNlwwXDZcMTcwXDFcMCIrCi0gICAgIlwxM1wxNzBcMVwwXDVcMTcwXDFcdTAyYTdcNVwxNzBcMVwwXDRcMTcwXDFcMCIrCi0gICAgIlwxMVwxNzBcMVwwXDFcMTcwXDZcMFw0XDE3MFw3XDBcMVwxNzBcNlwwIisKLSAgICAiXDZcMTcwXDFcMFwxMlwxNzBcMVx1MDJhOFwxXDBcMTNcMTcwXDFcMFw0XDE3MCIrCi0gICAgIlwxXDBcMTFcMTcwXDFcMFwxXDE3MFw2XDBcNFwxNzBcN1wwXDFcMTcwIisKLSAgICAiXDZcMFw2XDE3MFwxXDBcMTNcMTcwXDFcMFw1XDE3MFwxXHUwMmE5XDVcMTcwIisKLSAgICAiXDFcMFw0XDE3MFwxXDBcMTFcMTcwXDFcMFwxXDE3MFw2XDBcNFwxNzAiKwotICAgICJcN1wwXDFcMTcwXDZcMFw2XDE3MFwxXDBcMTNcMTcwXDFcMFw0XDE3MCIrCi0gICAgIlwxXHUwMmFhXDZcMTcwXDFcMFw0XDE3MFwxXDBcMTFcMTcwXDFcMFwxXDE3MCIrCi0gICAgIlw2XDBcNFwxNzBcN1wwXDFcMTcwXDZcMFw2XDE3MFwxXDBcMTNcMTcwIisKLSAgICAiXDFcMFw1XDE3MFwxXHUwMmFiXDVcMTcwXDFcMFw0XDE3MFwxXDBcMTFcMTcwIisKLSAgICAiXDFcMFwxXDE3MFw0NVwwXDFcdTAyYWNcMTM2XDBcMVx1MDJhZFwxMDdcMFwxXHUwMmFlIisKLSAgICAiXDY3XDBcMVx1MDJhZlwxMjVcMFwxXHUwMmIwXDE2XDBcNFwxNzBcN1wwXDFcMTcwIisKLSAgICAiXDZcMFw2XDE3MFwxXDBcNlwxNzBcMVx1MDJiMVw0XDE3MFwxXDBcMTNcMTcwIisKLSAgICAiXDFcMFw0XDE3MFwxXDBcMTFcMTcwXDFcMFwxXDE3MFw2XDBcNFwxNzAiKwotICAgICJcN1wwXDFcMTcwXDZcMFw2XDE3MFwxXDBcMTNcMTcwXDFcMFwxM1wxNzAiKwotICAgICJcMVwwXDRcMTcwXDFcMFwxXDE3MFwxXHUwMmIyXDdcMTcwXDFcMFwxXDE3MCIrCi0gICAgIlw2XDBcNFwxNzBcN1wwXDFcMTcwXDZcMFw2XDE3MFwxXDBcMTNcMTcwIisKLSAgICAiXDFcMFwxM1wxNzBcMVwwXDRcMTcwXDFcMFwyXDE3MFwxXHUwMmIzXDZcMTcwIisKLSAgICAiXDFcMFwxXDE3MFw2XDBcNFwxNzBcN1wwXDFcMTcwXDZcMFw2XDE3MCIrCi0gICAgIlwxXDBcMTNcMTcwXDFcMFw0XDE3MFwxXHUwMmI0XDZcMTcwXDFcMFw0XDE3MCIrCi0gICAgIlwxXDBcMTFcMTcwXDFcMFwxXDE3MFw2XDBcNFwxNzBcN1wwXDFcMTcwIisKLSAgICAiXDZcMFw2XDE3MFwxXDBcMTNcMTcwXDFcMFwxM1wxNzBcMVwwXDRcMTcwIisKLSAgICAiXDFcMFwyXDE3MFwxXHUwMmI1XDZcMTcwXDFcMFwxXDE3MFw0N1wwXDFcdTAyYjYiKwotICAgICJcNzRcMFwxXHUwMmI3XDEwNlwwXDFcdTAyYjhcMTE2XDBcMVx1MDJiOVwxMDVcMFwxXHUwMmJhIisKLSAgICAiXDUwXDBcNFwxNzBcN1wwXDFcMTcwXDZcMFw2XDE3MFwxXDBcMTBcMTcwIisKLSAgICAiXDFcdTAyYmJcMlwxNzBcMVwwXDEzXDE3MFwxXDBcNFwxNzBcMVwwXDExXDE3MCIrCi0gICAgIlwxXDBcMVwxNzBcNlwwXDRcMTcwXDdcMFwxXDE3MFw2XDBcNVwxNzAiKwotICAgICJcMVx1MDJiY1wxXDBcMTNcMTcwXDFcMFwxM1wxNzBcMVwwXDRcMTcwXDFcMCIrCi0gICAgIlwxMVwxNzBcMVwwXDFcMTcwXDZcMFw0XDE3MFw3XDBcMVwxNzBcNlwwIisKLSAgICAiXDVcMTcwXDFcdTAyYmRcMVwwXDEzXDE3MFwxXDBcMTNcMTcwXDFcMFw0XDE3MCIrCi0gICAgIlwxXDBcMTFcMTcwXDFcMFwxXDE3MFw2XDBcNFwxNzBcN1wwXDFcMTcwIisKLSAgICAiXDZcMFw2XDE3MFwxXDBcNlwxNzBcMVx1MDJiZVw0XDE3MFwxXDBcMTNcMTcwIisKLSAgICAiXDFcMFw0XDE3MFwxXDBcMTFcMTcwXDFcMFwxXDE3MFw2XDBcNFwxNzAiKwotICAgICJcN1wwXDFcMTcwXDZcMFw2XDE3MFwxXDBcNVwxNzBcMVx1MDJiZlw1XDE3MCIrCi0gICAgIlwxXDBcMTNcMTcwXDFcMFw0XDE3MFwxXDBcMTFcMTcwXDFcMFwxXDE3MCIrCi0gICAgIlw2MFwwXDFcdTAyYzBcMTMxXDBcMVx1MDJjMVw1MlwwXDFcdTAyYzJcMTA2XDBcMVx1MDJjMyIrCi0gICAgIlw0NVwwXDRcMTcwXDdcMFwxXDE3MFw2XDBcNlwxNzBcMVwwXDEzXDE3MCIrCi0gICAgIlwxXDBcNVwxNzBcMVx1MDJjNFw1XDE3MFwxXDBcNFwxNzBcMVwwXDExXDE3MCIrCi0gICAgIlwxXDBcMVwxNzBcNlwwXDRcMTcwXDdcMFwxXDE3MFw2XDBcNlwxNzAiKwotICAgICJcMVwwXDEzXDE3MFwxXDBcMTNcMTcwXDFcMFw0XDE3MFwxXDBcN1wxNzAiKwotICAgICJcMVx1MDJjNVwxXDE3MFwxXDBcMVwxNzBcNlwwXDRcMTcwXDdcMFwxXDE3MCIrCi0gICAgIlw2XDBcNlwxNzBcMVwwXDEwXDE3MFwxXHUwMmM2XDJcMTcwXDFcMFwxM1wxNzAiKwotICAgICJcMVwwXDRcMTcwXDFcMFwxMVwxNzBcMVwwXDFcMTcwXDZcMFw0XDE3MCIrCi0gICAgIlw3XDBcMVwxNzBcNlwwXDZcMTcwXDFcMFwxMFwxNzBcMVx1MDJjN1wyXDE3MCIrCi0gICAgIlwxXDBcMTNcMTcwXDFcMFw0XDE3MFwxXDBcMTFcMTcwXDFcMFwxXDE3MCIrCi0gICAgIlwxMDRcMFwxXHUwMmM4XDYzXDBcMVx1MDJiMFwxMzFcMFwxXHUwMmJhXDEwNlwwXDFcdTAyYzkiKwotICAgICJcMTBcMFw0XDE3MFw3XDBcMVwxNzBcNlwwXDZcMTcwXDFcMFwxM1wxNzAiKwotICAgICJcMVwwXDEzXDE3MFwxXDBcNFwxNzBcMVwwXDEwXDE3MFwxXHUwMmNhXDFcMCIrCi0gICAgIlwxXDE3MFw2XDBcNFwxNzBcN1wwXDFcMTcwXDZcMFw2XDE3MFwxXDAiKwotICAgICJcMTNcMTcwXDFcMFw2XDE3MFwxXHUwMmI1XDRcMTcwXDFcMFw0XDE3MFwxXDAiKwotICAgICJcMTFcMTcwXDFcMFwxXDE3MFw2XDBcNFwxNzBcN1wwXDFcMTcwXDZcMCIrCi0gICAgIlw2XDE3MFwxXDBcMTNcMTcwXDFcMFwxM1wxNzBcMVwwXDRcMTcwXDFcMCIrCi0gICAgIlwxMFwxNzBcMVx1MDJiZlwxXDBcMVwxNzBcNlwwXDRcMTcwXDdcMFwxXDE3MCIrCi0gICAgIlw2XDBcNlwxNzBcMVwwXDEzXDE3MFwxXDBcMTNcMTcwXDFcMFw0XDE3MCIrCi0gICAgIlwxXDBcMTBcMTcwXDFcdTAyY2JcMVwwXDFcMTcwXDM1XDBcMVx1MDJiMFwxNTRcMCIrCi0gICAgIlwxXHUwMmNjXDExXDBcNFwxNzBcN1wwXDFcMTcwXDZcMFw1XDE3MFwxXHUwMmI1IisKLSAgICAiXDFcMFwxM1wxNzBcMVwwXDEzXDE3MFwxXDBcNFwxNzBcMVwwXDExXDE3MCIrCi0gICAgIlwxXDBcMVwxNzBcNlwwXDRcMTcwXDdcMFwxXDE3MFw2XDBcNlwxNzAiKwotICAgICJcMVwwXDEzXDE3MFwxXDBcMTNcMTcwXDFcMFw0XDE3MFwxXDBcN1wxNzAiKwotICAgICJcMVx1MDJjZFwxXDE3MFwxXDBcMVwxNzBcNTdcMFwxXHUwMmIwXDM1XDBcNFwxNzAiKwotICAgICJcN1wwXDFcMTcwXDZcMFw2XDE3MFwxXDBcMTNcMTcwXDFcMFw0XDE3MCIrCi0gICAgIlwxXHUwMmI1XDZcMTcwXDFcMFw0XDE3MFwxXDBcMTFcMTcwXDFcMFwxXDE3MCI7Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXl0cmFucyBbXSA9IHl5X3VucGFjayh5eV9wYWNrZWQpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICAvLyBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAkJLy8kTk9OLU5MUy0xJAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIJLy8kTk9OLU5MUy0xJAotICB9OwotCi0gIC8qKgotICAgKiBZWV9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFlZX0FUVFJJQlVURVtdID0gewotICAgICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgOSwgIDEsICA5LCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDksIAotICAgICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsIAotICAgICA5LCAgMywgIDMsICA5LCAgMywgIDMsICAzLCAgOSwgIDMsICAxLCAgMSwgIDksICAxLCAgOSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgOSwgIDMsICAzLCAgOSwgIDMsICAzLCAgMywgIDksICAzLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDEsICAwLCAgMSwgIDAsICAxLCAgMiwgIDAsIAotICAgICAxLCAgMiwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsICAxLCAgOSwgIDksICAwLCAgMCwgIDksICAwLCAKLSAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgCi0gICAgIDksICAwLCAgOSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAxLCAgMCwgIDEsIAotICAgICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAKLSAgICAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICA5LCAgMCwgCi0gICAgIDAsICAxLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsIAotICAgICA5LCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAwLCAgMSwgIDEsICA5LCAgMSwgIDksICA5LCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMiwgCi0gICAgMTMsICAzLCAgMiwgIDIsIDEzLCAgMywgIDIsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDIsIAotICAgIDEzLCAgMywgIDIsICAyLCAxMywgIDMsICAyLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDksICA5LCAKLSAgICAgOSwgIDAsICAwLCAgMSwgIDEsICAxLCAgOSwgIDAsICAwLCAgMSwgMTMsICA5LCAgOSwgMTMsICAxLCAgOSwgCi0gICAgIDksICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDAsIAotICAgICAwLCAgMywgIDIsICAyLCAgMywgIDIsICAyLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAKLSAgICAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAzLCAgMiwgIDMsICAyLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAwLCAgMiwgIDMsICAzLCAgMywgIDIsICAyLCAgMywgIDMsICAzLCAgMiwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAyLCAgMywgCi0gICAgIDMsICAzLCAgMiwgIDIsICAzLCAgMywgIDMsICAyLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDAsICAwLCAgOSwgIDksICAwLCAgMSwgIDksICAwLCAgMSwgIDEsICAwLCAgMCwgIDEsICA1LCAKLSAgICAxMywgMTMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICA5LCAgNSwgCi0gICAgIDEsICAzLCAgMiwgIDMsICAyLCAgMSwgIDAsICA5LCAgMSwgIDAsICAxLCAgMywgIDIsICAzLCAgMiwgIDEsIAotICAgICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAKLSAgICAgMiwgIDIsICAwLCAgMCwgIDIsICAyLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgCi0gICAgIDksICA5LCAgMSwgIDEsICAyLCAgMiwgIDEsICAxLCAgMiwgIDIsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsIAotICAgICA5LCAgOSwgIDksICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAyLCAKLSAgICAgMiwgIDIsICAyLCAgOSwgIDEsICAxLCAgMSwgIDEsICAzLCAgMywgIDMsICAzLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDAsICAwLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAvLyBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICAvLyBwcml2YXRlIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIAotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIC8vIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfZW9mX2RvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCXByaXZhdGUgaW50IGZUb2tlbkNvdW50ID0gMDsKLSAKLQkvLyByZXF1aXJlZCBob2xkZXJzIGZvciB3aGl0ZS1zcGFjZSBjb21wYWN0aW5nCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydCA9IDE7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoID0gMDsKLQlwcml2YXRlIElUZXh0UmVnaW9uIGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQlwcml2YXRlIElUZXh0UmVnaW9uIGZQcm94eVVua25vd25SZWdpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZfY29udGV4dCA9IG51bGw7Ci0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQkvLyBhICJoaW50IiBhcyB0byB3aGF0IGFuIGVtYmVkZGVkIHJlZ2lvbiBzaG91bGQgYmUgZXZhbHVhdGVkCi0JcHJpdmF0ZSBTdHJpbmcgZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQkvLyBhICJoaW50IiBhcyB0byB3aGF0IHN0YXRlIHRvIGVudGVyIG9uY2UgYW4gZW1iZWRkZWQgcmVnaW9uIGhhcwotCS8vICAgYmVlbiBjb21wbGV0ZWQKLQlwcml2YXRlIGludCBmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JCi0JLy8gdGhlIGNvbnRhaW5lciB1c2VkIHRvIGNyZWF0ZSBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0NPTlRFWFQgPSAiUFJPWFlfQ09OVEVYVCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1VOS05PV05fQ09OVEVYVCA9ICJQUk9YWV9VTktOT1dOX0NPTlRFWFQiOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOwotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MKLQlwcml2YXRlIGludCBmT2Zmc2V0ID0gMDsKLQkKLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQotCS8vIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyBpbnNpZGUgb2YgYW4gZW1iZWRkZWQgcmVnaW9uCi0JcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxUYWdOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbENvbnRleHQgPSBudWxsOwotCi0JLy8gdGhlIGxpc3Qgb2YgdGFnIG5hbWUgQmxvY2tNYXJrZXJzCi0JcHJpdmF0ZSBMaXN0IGZCbG9ja01hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KDApOwotCXByaXZhdGUgTGlzdCBmTmVzdGFibGVQcmVmaXhlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCi0JLy8gd2hlcmUgdGhlIGxhc3QgaW50ZXJuYWwgY29udGFpbmVyIGJsb2NrIHdhcyBmb3VuZAotCXByaXZhdGUgaW50IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0gLTE7Ci0KLQkvLyByZXF1aXJlZCB0byBub3Qgc2VlayB0ZXh0IGJsb2NrcyBvbiBhbiBlbmQgdGFnCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSB0cnVlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBmRm9yYmlkSlNQID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBpbnQgZkVMbGV2ZWwgPSAwOwotCi0JcHJpdmF0ZSBKU1BQYXJzZXJSZWdpb25GYWN0b3J5IGZSZWdpb25GYWN0b3J5ID0gbmV3IEpTUFBhcnNlclJlZ2lvbkZhY3RvcnkoKTsKLQotCS8vIElzIHRoZSBlbWJlZGRlZCB0YWcgYSBKU1AgdGFnCi0JcHJpdmF0ZSBib29sZWFuIGZFbWJlZGRlZFRhZyA9IGZhbHNlOwotCS8vIElzIHRoZSBub24tZW1iZWRkZWQgdGFnIGEgSlNQIHRhZwotCXByaXZhdGUgYm9vbGVhbiBmQ29udGFpbmVyVGFnID0gZmFsc2U7Ci0JLy8gSXMgdGhlIHRva2VuaXplciBpbiBhIG5vbi1lbWJlZGRlZCB0YWcgKGJldHdlZW4gPCBhbmQgPikKLQlwcml2YXRlIGJvb2xlYW4gZkluVGFnQ29udGFpbmVyID0gZmFsc2U7Ci0JLy8gSXMgdGhlIHRva2VuaXplciBpbiBhbiBlbWJlZGRlZCB0YWcgKGJldHdlZW4gPCBhbmQgPikKLQlwcml2YXRlIGJvb2xlYW4gZkluVGFnRW1iZWRkZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpCi0JCQlyZXR1cm47Ci0JCWZCbG9ja01hcmtlcnMuYWRkKG1hcmtlcik7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkTmVzdGFibGVQcmVmaXgoVGFnTWFya2VyIG1hcmtlcikgewotCQlmTmVzdGFibGVQcmVmaXhlcy5hZGQobWFya2VyKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgTGlzdCBnZXROZXN0YWJsZVByZWZpeGVzKCkgewotCQlyZXR1cm4gZk5lc3RhYmxlUHJlZml4ZXM7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGFibGUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJLy9JdGVyYXRvciBibG9ja3MgPSBmTmVzdGFibGVQcmVmaXhlcy5pdGVyYXRvcigpOwotCQkvL3doaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJLy8JVGFnTWFya2VyIG1hcmtlciA9IChUYWdNYXJrZXIpYmxvY2tzLm5leHQoKTsKLQkJLy8JU3RyaW5nIG1hcmtlck5hbWUgPSBtYXJrZXIuZ2V0VGFnTmFtZSgpOwotCQkvLwlpZih0YWdOYW1lLmxlbmd0aCgpID4gbWFya2VyTmFtZS5sZW5ndGgoKSArIDEgJiYgdGFnTmFtZS5zdGFydHNXaXRoKG1hcmtlck5hbWUpICYmIHRhZ05hbWUuY2hhckF0KG1hcmtlck5hbWUubGVuZ3RoKCkpID09ICc6JykgewotCQkvLwkJcmV0dXJuIG1hcmtlci5pc0dsb2JhbCgpIHx8IGdldE9mZnNldCgpID49IG1hcmtlci5nZXRNYXJrZXIoKS5nZXRTdGFydCgpOwotCQkvLwl9Ci0JCS8vfQotCQkvL3JldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyBuYW1lKSB7Ci0JCWlmIChmTmVzdGFibGVQcmVmaXhlcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBuZXN0YWJsZXMgPSBmTmVzdGFibGVQcmVmaXhlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKG5lc3RhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoKChUYWdNYXJrZXIpIG5lc3RhYmxlcy5uZXh0KCkpLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCQluZXN0YWJsZXMucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWZCbG9ja01hcmtlcnMucmVtb3ZlKG1hcmtlcik7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JCWlmIChmQmxvY2tNYXJrZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCgoQmxvY2tNYXJrZXIpIGJsb2Nrcy5uZXh0KCkpLmdldFRhZ05hbWUoKS5lcXVhbHModGFnbmFtZSkpCi0JCQkJCWJsb2Nrcy5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nIGVuZFRhZ05hbWUpIHsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIG51bGwsIGVuZFRhZ05hbWUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzKSB7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBlbmRUeXBlcywgbnVsbCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nIGVuZFR5cGUpIHsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIG5ldyBTdHJpbmdbXXtlbmRUeXBlfSwgbnVsbCk7Ci0JfQotCS8qKgotCSAqICB1c2VyIG1ldGhvZCAKLQkgKiAKLQkgKiBBc3NlbWJsZXMgYW4gZW1iZWRkZWQgY29udGFpbmVyIGJlZ2lubmluZyB3aXRoIHRoZSBnaXZlbiBzdGFydFR5cGUgYXMKLQkgKiB0aGUgZmlyc3QgQ29udGV4dFJlZ2lvbiB3aXRoaW4gaXQgYW5kIG9mIHRoZSB0eXBlIGZFbWJlZGRlZEhpbnQuICBUaGUKLQkgKiBlbmRUeXBlc1tdIGFycmF5IGNvbnRhaW5zIHRoZSBjb250ZXh0IHR5cGVzIHRoYXQgd2lsbCBjYXVzZSBhIHN1Y2Nlc3NmdWwKLQkgKiBleGl0LiAgVXNlIG9mIHRoZSBlbmRUYWdOYW1lIHBhcmFtZXRlciBhbHRlcnMgdGhpcyBiZWhhdmlvciB0byBmb3JjZSBhbgotCSAqIGV4aXQgb24gYW4gWE1MX1RBR19DTE9TRSBhZnRlciBzZWVpbmcgYW4gWE1MX1RBR19OQU1FIHdob3NlIHNpZ25pZmljYW50Ci0JICogdGV4dCBtYXRjaGVzIHRoZSBlbmRUYWdOYW1lIFN0cmluZy4gIEFsbCBjb250ZW50cyBpbiBiZXR3ZWVuIGFyZQotCSAqIGluc2lnbmlmaWNhbnQsIGFuZCB5ZXMsIHRoaXMgbWVhbnMgY29tbWVudHMgYXJlIGFsbG93ZWQgaW5zaWRlLgotCSAqKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmdbXSBlbmRUeXBlcywgU3RyaW5nIGVuZFRhZ05hbWUpIHsKLQkJLy8gdGhlIGNvbnRleHQgb2YgdGhlIHJlZ2lvbiBiZWluZyBhZGRlZCB0byB0aGUgZW1iZWRkZWQgY29udGFpbmVyCi0JCWludGVybmFsQ29udGV4dCA9IHN0YXJ0VHlwZTsKLQkJLy8ga2VlcCB0cmFjayBvZiB3aGVyZSB0aGlzIGNvbnRhaW5lciBiZWdhbjsgdG8gcHJvdmlkZSByZWxhdGl2ZSBpbmRlY2VzIGZvciB0aGUgcmVnaW9ucwotCQlpbnQgY29udGFpbmVyU3RhcnQgPSB5eWNoYXI7Ci0JCWJvb2xlYW4gbm90RmluaXNoZWQgPSB0cnVlOwotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHdlIHNlZW0gdG8gYmUgc28gdGhhdCB0aGUgZW5kVGFnTmFtZSBjYW4gYmUgY2hlY2tlZAotCQlib29sZWFuIGlzSW5FbmRUYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpc0luRmlyc3RUYWcgPSB0cnVlOwotCQkvLyBjcmVhdGUgdGhlIGVtYmVkZGVkIGNvbnRhaW5lciBhbmQgc2V0dXAgaXRzICJ0eXBlIgotCQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyID09IG51bGwpIHsKLQkJCWZFbWJlZGRlZENvbnRhaW5lciA9IG5ldyBDb250ZXh0UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShmRW1iZWRkZWRIaW50KTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRTdGFydChjb250YWluZXJTdGFydCk7Ci0JCQkvLyBUT0RPOiBwYXJlbnQgcmVnaW9uIG5lZWRzIHRvIGJlIHNldCAuLi4uIGJ1dCBub3Qgc3VyZSB3aGVyZSB0byBnZXQgaXQgZnJvbSAKLQkJCS8vCQlmRW1iZWRkZWRDb250YWluZXIuc2V0UGFyZW50KHBhcmVudFJlZ2lvbik7Ci0JCX0KLQkJaW50IGluaXRpYWxMZW5ndGggPSBmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJY29udGFpbmVyU3RhcnQgPSBmRW1iZWRkZWRDb250YWluZXIuZ2V0U3RhcnQoKTsKLQkJd2hpbGUgKG5vdEZpbmlzaGVkKSB7Ci0JCQkvLyBhZGQgdGhlIHJlZ2lvbiB0byB0aGUgY29udGFpbmVyCi0JCQlpZiAoaW50ZXJuYWxDb250ZXh0ICE9IG51bGwgJiYgaW50ZXJuYWxDb250ZXh0ICE9IFBST1hZX0NPTlRFWFQpIHsKLQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCS8vIGxvbmdzY2FuIGRldGVybWluZXMgd2hldGhlciB0byBhdHRlbXB0IGEgYmxvY2tUYWdTY2FuIHdpdGhpbiB0aGUgZW1iZWRkZWQgY29udGFpbmVyCi0JCQkJYm9vbGVhbiBsb25nc2NhbiA9IGZhbHNlOwotCQkJCS8vIHNhdmUgdGhlIHRva2VuaXplciBzdGF0ZSBpbiBjYXNlIG9mIGEgYmxvY2sgdGFnIHNjYW4KLQkJCQlpbnQgcHJldmlvdXNTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQlTdHJpbmcgcHJldmlvdXNDdXJyZW50VGFnTmFtZSA9IGZDdXJyZW50VGFnTmFtZTsKLQkJCQlpbnQgcHJldmlvdXNQb3N0U3RhdGUgPSBmRW1iZWRkZWRQb3N0U3RhdGU7Ci0JCQkJU3RyaW5nIHByZXZpb3VzRW1iZWRkZWRIaW50ID0gZkVtYmVkZGVkSGludDsKLQkJCQkvLyBkZXRlcm1pbmUgaWYgYSBibG9jayB0YWcgc2NhbiBpcyBuZWNlc3NhcnkKLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCQkJaWYoIWlzTmVzdGFibGUoaW50ZXJuYWxUYWdOYW1lKSkgewotCQkJCQkJaW50ZXJuYWxUYWdOYW1lID0gbnVsbDsKLQkJCQkJCS8vIHNuYWdnZWQgYSB0YWcgbmFtZSB3ZSBzaG91bGRuJ3QgaGF2ZQotCQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQUJPUlRfRU1CRURERUQ7Ci0JCQkJCQlub3RGaW5pc2hlZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX09QRU4gfHwgaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJaW50ZXJuYWxUYWdOYW1lID0gbnVsbDsKLQkJCQl9Ci0JCQkJLy8gZG8gdXBrZWVwIGZvciBlbmRUYWdOYW1lIHVzYWdlOyBtdXN0IGJlIGhlcmUgc2luY2UgdGhlIG5leHQgdG9rZW4gY291bGQgYmUgdGhlIGNsb3NlCi0JCQkJaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJCWlzSW5FbmRUYWcgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJaXNJbkZpcnN0VGFnID0gaXNJbkVuZFRhZyA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJIAlJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJCQkJaWYgKGVtYmVkZGVkUmVnaW9ucy5zaXplKCkgPiAyICYmIChlbWJlZGRlZFJlZ2lvbnMuZ2V0KGVtYmVkZGVkUmVnaW9ucy5zaXplKCktMSkpLmdldFR5cGUoKSA9PSBYTUxfVEFHX0NMT1NFICYmIChlbWJlZGRlZFJlZ2lvbnMuZ2V0KGVtYmVkZGVkUmVnaW9ucy5zaXplKCkgLSAzKSkuZ2V0VHlwZSgpID09IFhNTF9UQUdfT1BFTiAmJiBpbnRlcm5hbFRhZ05hbWUgIT0gbnVsbCkgewotCQkJCQkJaWYgKGNvbnRhaW5zVGFnTmFtZShpbnRlcm5hbFRhZ05hbWUpKSB7Ci0JCQkJCQkJbG9uZ3NjYW4gPSB0cnVlOwotCQkJCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChsb25nc2NhbikKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gaW50ZXJuYWxUYWdOYW1lOwotCQkJCS8vIHJlYWQgdGhlIG5leHQgcmVnaW9uIGFuZCBjb250ZXh0Ci0JCQkJaW50ZXJuYWxDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCWlmIChsb25nc2NhbikgewotCQkJCQkvLyBSZXR1cm5pbmcgZnJvbSBhIGJsb2NrIHRhZyBzY2FuIHJlcXVpcmVzIHJlc3RvcmluZyBzb21lIHN0YXRlIHZhcmlhYmxlcwotCQkJCQkvLyBhcyB3ZWxsIGFzIGhhbmRsaW5nIHRoZSBibG9jayByZWdpb24gYW5kIHNldHRpbmcgdXAgZm9yIG5vcm1hbCBzY2FubmluZwotCQkJCQkvLyBpbnNpZGUgdGhlIGVtYmVkZGVkIGNvbnRhaW5lcgotCQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7Ci0JCQkJCWxvbmdzY2FuID0gZmFsc2U7Ci0JCQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IHByZXZpb3VzUG9zdFN0YXRlOwotCQkJCQlmRW1iZWRkZWRIaW50ID0gcHJldmlvdXNFbWJlZGRlZEhpbnQ7Ci0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IHByZXZpb3VzQ3VycmVudFRhZ05hbWU7Ci0JCQkJCXl5YmVnaW4ocHJldmlvdXNTdGF0ZSk7Ci0JCQkJCWludGVybmFsQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJpbUdldE5leHRUb2tlbigpIGNhbGxzIG1heSB0aHJvdyBhbiBJT0V4Y2VwdGlvbgotCQkJCS8vIGNhdGNoIGFuZCBkbyBub3RoaW5nIHNpbmNlIHRoZSBpc0VPRiBjaGVjayBiZWxvdwotCQkJCS8vIHdpbGwgcHJvcGVybHkgZXhpdCBpZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydAotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGYpIHsKLQkJCQkvLyBzb21lIG90aGVyIGV4Y2VwdGlvbiBoYXBwZW5lZDsgbmV2ZXIgc2hvdWxkCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihmKTsKLQkJCX0KLQkJCWJvb2xlYW4gaXNFbmRpbmdUeXBlID0geXlzdGF0ZSgpID09IFNUX0FCT1JUX0VNQkVEREVEOwotCQkJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkTGlzdCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7Ci0JCQlpZighaXNFbmRpbmdUeXBlKSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGVuZGluZyBjb250ZXh0Ci0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpc0VuZGluZ1R5cGUgPSBpc0VuZGluZ1R5cGUgfHwgKGludGVybmFsQ29udGV4dCA9PSBlbmRUeXBlc1tpXSkgfHwgKGVtYmVkZGVkTGlzdC5zaXplKCkgLSBpbml0aWFsTGVuZ3RoKSA+PSAyICYmIChlbWJlZGRlZExpc3QuZ2V0KGVtYmVkZGVkTGlzdC5zaXplKCktMSkpLmdldFR5cGUoKSA9PSBlbmRUeXBlc1tpXTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaXNFbmRpbmdUeXBlID0gKChpc0luRW5kVGFnICYmIGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX0NMT1NFKSB8fCAoaXNJbkZpcnN0VGFnICYmIGludGVybmFsQ29udGV4dCA9PSBYTUxfRU1QVFlfVEFHX0NMT1NFKSkgJiYgaW50ZXJuYWxUYWdOYW1lICE9IG51bGwgJiYgaW50ZXJuYWxUYWdOYW1lLmVxdWFscyhlbmRUYWdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQlub3RGaW5pc2hlZCA9IG5vdEZpbmlzaGVkICYmICgoIWlzRW5kaW5nVHlwZSkgJiYgIWlzRU9GKCkgJiYgKGVuZFRhZ05hbWUgIT0gbnVsbCB8fCBpbnRlcm5hbENvbnRleHQgIT0gVU5ERUZJTkVEKSAmJiAhKGludGVybmFsQ29udGV4dCA9PSBQUk9YWV9DT05URVhUICYmIChlbWJlZGRlZExpc3QuZ2V0KGVtYmVkZGVkTGlzdC5zaXplKCktMSkpLmdldFR5cGUoKSA9PSBVTkRFRklORUQpKTsKLQkJfQotCQkvLyBmaW5pc2ggYWRkaW5nIHRoZSBsYXN0IGNvbnRleHQKLQkJaWYgKGludGVybmFsQ29udGV4dCAhPSBudWxsICYmIGludGVybmFsQ29udGV4dCAhPSBQUk9YWV9DT05URVhUKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCS8vbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0ICsgeXlsZW5ndGgoKSk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aCh5eWNoYXIgLSBjb250YWluZXJTdGFydCArIHl5bGVuZ3RoKCkpOwotCQl9Ci0JCXl5YmVnaW4oZkVtYmVkZGVkUG9zdFN0YXRlKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsKLQkJcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBuZXdWYWx1ZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckFsbG93c0pTUCgpIHsKLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsKLQkJCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsKLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuYWxsb3dzSlNQKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKSB7Ci0JCXJldHVybiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShmQ3VycmVudFRhZ05hbWUpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gbWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCkgewotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuZ2V0Q29udGV4dCgpOwotCQl9Ci0JCXJldHVybiBCTE9DS19URVhUOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQkJcmV0dXJuIGZCbG9ja01hcmtlcnM7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmT2Zmc2V0ICsgeXljaGFyOwotCX0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcigpIHsKLQkJcmV0dXJuIGlzQmxvY2tNYXJrZXIoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKCFmSXNCbG9ja2luZ0VuYWJsZWQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjb250YWluc1RhZ05hbWUodGFnTmFtZSk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQkJYmVnaW5CbG9ja01hcmtlclNjYW4obmV3VGFnTmFtZSwgQkxPQ0tfVEVYVCk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQotCSAqIHN0YXJ0IG9mIGEgdGV4dCBibG9jayB3aXRoaW4gYSAibmV3VGFnTmFtZSIgdGFnLgotCSAqCi0JICogRXhhbXBsZTogCi0JICoJVG9rZW5pemVyIHRva2VyID0gbmV3IFRva2VuaXplcigpOwotCSAqCXRva2VyLnNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhmYWxzZSk7Ci0JICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOwotCSAqCXRva2VyLmJlZ2luQmxvY2tNYXJrZXJTY2FuKCJzY3JpcHQiLCBCTE9DS19URVhUKTsKLQkgKgl0b2tlci5nZXRSZWdpb25zKCk7IAotCSAqCi0JICogUmV0dXJuczoKLQkgKglCTE9DS19URVhUOiAwLTQwCi0JICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDIKLQkgKglYTUxfVEFHX05BTUU6IDQzLTQ4Ci0JICoJWE1MX1RBR19DTE9TRTogNDktNDkKLQkgKglYTUxfQ09OVEVOVDogNTAtNTcKLQkgKgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7Ci0JCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQlmQ3VycmVudFRhZ05hbWUgPSBuZXdUYWdOYW1lOwotCX0KLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGRvU2NhbihTdHJpbmcgc2VhcmNoU3RyaW5nLCBib29sZWFuIHJlcXVpcmVUYWlsU2VwYXJhdG9yLCBib29sZWFuIGFsbG93SlNQLCBib29sZWFuIGFsbG93Q0RBVEEsIFN0cmluZyBzZWFyY2hDb250ZXh0LCBpbnQgZXhpdFN0YXRlLCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRvU2NhbihzZWFyY2hTdHJpbmcsIHJlcXVpcmVUYWlsU2VwYXJhdG9yLCBhbGxvd0pTUCwgYWxsb3dDREFUQSwgZmFsc2UsIHNlYXJjaENvbnRleHQsIGV4aXRTdGF0ZSwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci0JfQotLyoqCi0gKiBNZXRob2QgZG9TY2FuLgotICogCi0gKiBSZXR1cm5zIGEgY29udGV4dCByZWdpb24gZm9yIGFsbCBvZiB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVwdG8gdGhlIGVuZCBvZiBpbnB1dCBvcgotICogdG8gcmlnaHQgKmJlZm9yZSogdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBzZWFyY2hTdHJpbmcKLSAqIAotICogQHBhcmFtIHNlYXJjaFN0cmluZyAtIHRhcmdldCBzdHJpbmcgdG8gc2VhcmNoIGZvciBleC46ICItLT4iLCAiPC90YWduYW1lIgotICogQHBhcmFtIHJlcXVpcmVUYWlsU2VwYXJhdG9yIC0gd2hldGhlciB0aGUgdGFyZ2V0IG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAnPicKLSAqIEBwYXJhbSBhbGxvd0pTUCAtIGNoZWNrIGZvciBhbmQgYWxsb3cgZm9yIEpTUCBtYXJrdXAgPCUlPgotICogQHBhcmFtIGFsbG93VGFnIC0gY2hlY2sgZm9yIGFuZCBhbGxvdyBmb3IgeG1sIHRhZ3MgPAotICogQHBhcmFtIGNvbnRleHQgLSB0aGUgY29udGV4dCBvZiB0aGUgc2Nhbm5lZCByZWdpb24gaWYgbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gZXhpdFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSByZWdpb24gd2FzIG9mIG5vbi16ZXJvIGxlbmd0aAotICogQHBhcmFtIGFib3J0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHNlYXJjaFN0cmluZyB3YXMgZm91bmQgaW1tZWRpYXRlbHkKLSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGNvbnRleHQgZm91bmQ6IHRoZSBkZXNpcmVkIGNvbnRleHQgb24gYSBub24temVybyBsZW5ndGggbWF0Y2gsIHRoZSBhYm9ydENvbnRleHQgb24gaW1tZWRpYXRlIHN1Y2Nlc3MKLSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9TY2FuKFN0cmluZyBzZWFyY2hTdHJpbmcsIGJvb2xlYW4gcmVxdWlyZVRhaWxTZXBhcmF0b3IsIGJvb2xlYW4gYWxsb3dKU1AsIGJvb2xlYW4gYWxsb3dDREFUQSwgYm9vbGVhbiBhbGxvd1RhZywgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOwotCWJvb2xlYW4gd2FzQmxvY2tpbmdFbmFibGVkID0gZklzQmxvY2tpbmdFbmFibGVkOwotCXRyeSB7Ci0JCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpCi0JCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCQlpbnQgc2VhcmNoU3RyaW5nTGVuZ3RoID0gc2VhcmNoU3RyaW5nLmxlbmd0aCgpOwotCQlpbnQgbiA9IDA7Ci0JCWNoYXIgbGFzdENoZWNrQ2hhcjsKLQkJaW50IGk7Ci0JCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCQkvLyBDaGVjayBmb3IgSlNQIHN0YXJ0cyAoIjwlIikgaWYgdGhlIHRhZyBpcyBnbG9iYWwgbGlrZSBTQ1JJUFQgb3IgU1RZTEUKLQkJYm9vbGVhbiBjaGVja0pTUHMgPSBhbGxvd0pTUCAmJiAhZkZvcmJpZEpTUDsKLQkJYm9vbGVhbiBjaGVja2VkRm9ySlNQc09uY2UgPSAhY2hlY2tKU1BzOwotCQlib29sZWFuIGNoZWNrZWRKU1BzQXRTdGFydE9uY2UgPSBmYWxzZTsKLQkJCi0JCXdoaWxlIChzdGlsbFNlYXJjaGluZykgewotCQkJbiA9IDA7Ci0JCQkvLyBFbnN1cmUgdGhhdCBlbm91Z2ggZGF0YSBmcm9tIHRoZSBpbnB1dCBleGlzdHMgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBzZWFyY2ggU3RyaW5nLgotCQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJCXdoaWxlKG4gIT0gWVlFT0YgJiYgeXlfY3VycmVudFBvcyA8IHNlYXJjaFN0cmluZ0xlbmd0aCkKLQkJCQluID0geXlfYWR2YW5jZSgpOwotCS8vCQljID0gKGNoYXIpIG47Ci0JCQkvLyBJZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydCBvciB3ZSd2ZSBleGhhdXN0ZWQgdGhlIGlucHV0LCBzdG9wIGltbWVkaWF0ZWx5LgotCQkJaWYgKG4gPT0gWVlFT0YgJiYgY2hlY2tlZEZvckpTUHNPbmNlKSB7Ci0JCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qKgotCQkJCSAqIExvb2sgZm9yIHN0YXJ0aW5nIEpTUHMgIjwlIgotCQkJCSAqLwotCQkJCWNoZWNrZWRGb3JKU1BzT25jZSA9IHRydWU7Ci0JCQkJLy8gMSkgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCA6IFRoZXJlJ3MgYXQgbGVhc3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgb25jZSB0aGF0J3MgcmVhZCwgY2hlY2sgZm9yIEpTUHMKLQkJCQkvLyAtLS0KLQkJCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgYXQgY3VycmVudC1zZWFyY2hTdHJpbmdMZW5ndGg7IGlmIHNvLCBiYWNrdXAgYW5kIHN3aXRjaCBzY2FubmVyIHN0YXRlcyB0byBoYW5kbGUgaXQuCi0JCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDwlJT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQKLQkJCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0JCQkJaWYoY2hlY2tKU1BzICYmIHl5X2N1cnJlbnRQb3MgPiBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiAKLQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCArIDFdID09ICclJykgewotCQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQkJfQotCQkJCS8vIDIpIHl5X2N1cnJlbnRQb3MgLSBqc3BzdGFydGVyLmxlbmd0aCA6IFRoZXJlJ3Mgbm90IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IGNoZWNrIGZvciBhIEpTUCAyIHNwb3RzIGJhY2sgaW4gd2hhdCB3ZSBjb3VsZCByZWFkCi0JCQkJLy8gLS0tCi0JCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiAqaGF2aW5nKiBjbG9zZVRhZ1N0cmluZ0xlbmd0aCBhbW91bnQgb2YgaW5wdXQgdG8gd29yayBhcyBkZXNpZ25lZC4gIE11c3QgYmUgc3VyZSB3ZSBkb24ndAotCQkJCS8vIHNwaWxsIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIGNoZWNraW5nLgotCQkJCWVsc2UgaWYoY2hlY2tKU1BzICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9jdXJyZW50UG9zID4gMCAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYKLQkJCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gMV0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSA9PSAnJScpIHsKLQkJCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gMTsKLQkJCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCQl9Ci0JCQkJLy8gMykgeXlfY3VycmVudFBvcy4uKHl5X2N1cnJlbnRQb3MranNwU3RhcnRsZW5ndGgtMSkgOiBDaGVjayBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9uZSB0aW1lCi0JCQkJLy8gLS0tCi0JCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGltbWVkaWF0ZWx5IGluIHRoZSBibG9jayBhcmVhOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiB5eV9jdXJyZW50UG9zIGVxdWFsaW5nIGV4YWN0bHkgdGhlIHByZXZpb3VzIGVuZCArMSB0byB3b3JrIGFzIGRlc2lnbmVkLgotCQkJCWVsc2UgaWYoY2hlY2tKU1BzICYmICFjaGVja2VkSlNQc0F0U3RhcnRPbmNlICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9zdGFydFJlYWQgPiAwICYmCi0JCQkJCQl5eV9zdGFydFJlYWQgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZCArIDFdID09ICclJykgewotCQkJCQljaGVja2VkSlNQc0F0U3RhcnRPbmNlID0gdHJ1ZTsKLQkJCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9zdGFydFJlYWQ7Ci0JCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQkJfQotCQkJCS8vIDQpIFhNTCB0YWcgCi0JCQkJZWxzZSBpZihhbGxvd1RhZyAmJiBjaGVja0pTUHMgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIAotCQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09ICc8JykgewotCQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQkJCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCQl9Ci0JCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJCX0KLQkKLQkKLQkJCQkvKioKLQkJCQkgKiBMb29rIGZvciBzdGFydGluZyBDREFUQSAiPCFbQ0RBVEFbIgotCQkJCSAqLwotCQkJCS8vIDEpIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg6IFRoZXJlJ3MgYXQgbGVhc3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgb25jZSB0aGF0J3MgcmVhZCwgY2hlY2sgZm9yIENEQVRBCi0JCQkJLy8gLS0tCi0JCQkJLy8gTG9vayBmb3IgYSBDREFUQSBiZWdpbm5pbmcgYXQgY3VycmVudC1zZWFyY2hTdHJpbmdMZW5ndGg7IGlmIHNvLCBiYWNrdXAgYW5kIHN3aXRjaCBzY2FubmVyIHN0YXRlcyB0byBoYW5kbGUgaXQuCi0JCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDxbIUNEQVRBW11dPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZAotCQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4KLQkvKgkJCWlmKGNoZWNrQ0RBVEEgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zICsgc2VhcmNoU3RyaW5nTGVuZ3RoIDwgeXlfYnVmZmVyLmxlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIAotCQkJCQljaGFyc01hdGNoKGNkYXRhU3RhcnRlciwgeXlfYnVmZmVyLCAwLCB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoKSkgewotCQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJCS8vIGdvIHRvIGEgc3RhdGUgd2hlcmUgQ0RBVEEgY2FuIGJlIGZvdW5kCi0JCQkJCWlmIChmRW1iZWRkZWRDb250YWluZXIgPT0gbnVsbCkgewotCQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsKLQkJCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUeXBlKHNlYXJjaENvbnRleHQpOwotCQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFN0YXJ0KHl5Y2hhcik7Ci0JCQkJCX0KLQkJCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihzZWFyY2hDb250ZXh0LCB5eWNoYXIsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCQlTdHJpbmcgY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJaWYoY29udGV4dC5lcXVhbHMoWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX09QRU4pKSB7Ci0JCQkJCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOLCBYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfQ0xPU0UpOwotCQkJCQl9Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCQl9Ci0JKi8vKgotCQkJCS8vIDIpIHl5X2N1cnJlbnRQb3MgLSBjZGF0YVN0YXJ0ZXIubGVuZ3RoOiBUaGVyZSdzIG5vdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBjaGVjayBmb3IgYSBDREFUQSByaWdodCBoZXJlIHNwb3RzIGJhY2sgaW4gd2hhdCB3ZSBjb3VsZCByZWFkCi0JCQkJLy8gLS0tCi0JCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiAqaGF2aW5nKiBjbG9zZVRhZ1N0cmluZ0xlbmd0aCBhbW91bnQgb2YgaW5wdXQgdG8gd29yayBhcyBkZXNpZ25lZC4gIE11c3QgYmUgc3VyZSB3ZSBkb24ndAotCQkJCS8vIHNwaWxsIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIGNoZWNraW5nLgotCQkJCWVsc2UgaWYoY2hlY2tDREFUQSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfY3VycmVudFBvcyA+IDAgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmCi0JCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIDFdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvc10gPT0gJyUnKSB7Ci0JCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7Ci0JCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQkJfQotCQkJCS8vIDMpIHl5X2N1cnJlbnRQb3MgOiBDaGVjayBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9uZSB0aW1lCi0JCQkJLy8gLS0tCi0JCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGltbWVkaWF0ZWx5IGluIHRoZSBibG9jayBhcmVhOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiB5eV9jdXJyZW50UG9zIGVxdWFsaW5nIGV4YWN0bHkgdGhlIHByZXZpb3VzIGVuZCArMSB0byB3b3JrIGFzIGRlc2lnbmVkLgotCQkJCWVsc2UgaWYoY2hlY2tDREFUQSAmJiAhY2hlY2tlZEZvckNEQVRBT25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJgotCQkJCQkJeXlfc3RhcnRSZWFkIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQgKyAxXSA9PSAnJScpIHsKLQkJCQkJY2hlY2tlZEZvckNEQVRBT25jZSA9IHRydWU7Ci0JCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOwotCQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCQl9Ci0JCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJCX0KLQkqLwotCQkJCS8vIENoZWNrIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSB0YXJnZXQgdmVyc3VzIHRoZSBsYXN0IHRhcmdldExlbmd0aCBjaGFyYWN0ZXJzIHJlYWQgZnJvbSB0aGUgYnVmZmVyCi0JCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzCi0JCQkJaWYgKG4gPT0gWVlFT0YpIHsKLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNhbWUgPSB0cnVlOwotCQkJCQkvLyBzYWZldHkgY2hlY2sgZm9yIGFycmF5IGFjY2Vzc2VzCi0JCQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCQkJZm9yKGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHNhbWU7IGkrKykgewotCQkJCQkJCWlmKGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXNhbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoeXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaFN0cmluZy5jaGFyQXQoaSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIHNhZmV0eSBjaGVjayBmYWlsZWQ7IG5vIG1hdGNoIGlzIHBvc3NpYmxlIHJpZ2h0IG5vdwotCQkJCQllbHNlIHsKLQkJCQkJCXNhbWUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCQkvLyBBZGRpdGlvbmFsIGNoZWNrIGZvciBjbG9zZSB0YWdzIHRvIGVuc3VyZSB0aGF0IHRhcmdldFN0cmluZz0iPC9zY3JpcHQiIGRvZXNuJ3QgbWF0Y2gKLQkJCQkJLy8gIjwvc2NyaXB0UyIKLQkJCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsKLQkJCQkJLy8gU3VjY2VlZCBvbiAiPC9zY3JpcHQ+IiBhbmQgIjwvc2NyaXB0ICIKLQkJCQkJaWYobGFzdENoZWNrQ2hhciA9PSAnPicgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShsYXN0Q2hlY2tDaGFyKSkKLQkJCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG4gIT0gWVlFT0YgfHwgc2FtZSkgewotCQkJLy8gV2UndmUgc3RvcHBlZCBzaG9ydCBvZiB0aGUgZW5kIG9yIGRlZmluaXRlbHkgZm91bmQgYSBtYXRjaAotCQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJLy8gSWYgdGhlIHNlYXJjaFN0cmluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQkJCWlmICh5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJeXliZWdpbihpbW1lZGlhdGVGYWxsYmFja1N0YXRlKTsKLQkJCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gV2UgcmFuIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGlucHV0Ci0JCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOwotCQkJeXlfY3VycmVudFBvcysrOwotCQl9Ci0JCXl5YmVnaW4oZXhpdFN0YXRlKTsKLQkJLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQotCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKQotCQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JfQotCWZpbmFsbHkgewotCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB3YXNCbG9ja2luZ0VuYWJsZWQ7Ci0JfQotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tUYWdTY2FuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpOwotCXJldHVybiBkb1NjYW4oIjwvIiArIGZDdXJyZW50VGFnTmFtZSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoKSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSksIFlZSU5JVElBTCwgWVlJTklUSUFMKTsKLX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpCi0JICogbWV0aG9kIGludG8gYSBmdWxsIElUZXh0UmVnaW9uIGJ5IHB1bGxpbmcgaW4gdmFsdWVzIGZvciB0aGUKLQkgKiBjdXJyZW50IG9mZnNldCB3aXRoaW4gdGhlIHNjYW5uaW5nIHRleHQuCi0JICoKLQkgKiBSZXR1cm5zIG51bGwgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgYW5kIGF0dGFjaGVzIGludGVybWl0dGVudGx5Ci0JICogZGlzY292ZXJlZCB3aGl0ZXNwYWNlIG9udG8gdGhlIGVuZCBvZiB1c2VmdWwgcmVnaW9ucy4KLQkgKgotCSAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjYWNoZXMgdGhlIHRva2VuIGZvbGxvd2luZyB0aGUgb25lIGJlaW5nIHJldHVybmVkCi0JICogc28gdGhhdCB3aGl0ZXNwYWNlIGNhbiBiZSBjb2xsYXBzZWQuCi0JICovCi0JcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykKLQkJaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsKLQkJCWlmIChmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb24gY29udGFpbmVyID0gZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXI7Ci0JCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJCQlyZXR1cm4gY29udGFpbmVyOwotCQkJfQotCQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0JCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0OwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsKLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQlpZiAoY29udGV4dCA9PSBQUk9YWV9DT05URVhUKSB7Ci0JCQkJcmV0dXJuIGZFbWJlZGRlZENvbnRhaW5lcjsKLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCQllbHNlCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCQl9Ci0JCQlzdGFydCA9IHl5Y2hhcjsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJaWYgKHl5X2F0RU9GKSB7Ci0JCQkJZlRva2VuQ291bnQrKzsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbgotCQlmX2NvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCWlmIChmX2NvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCkgewotCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBmRW1iZWRkZWRDb250YWluZXI7Ci0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfUk9PVF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJZWxzZQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFBST1hZX1VOS05PV05fQ09OVEVYVCkgewotCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBmUHJveHlVbmtub3duUmVnaW9uOwotCQl9Ci0JCWZCdWZmZXJlZENvbnRleHQgPSBmX2NvbnRleHQ7Ci0JCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgPT0gV0hJVEVfU1BBQ0UpIHsKLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJCWxlbmd0aCArPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCX0KLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkgewotCQkJLy8gRU9GCi0JCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRpc2NvdmVyZWQgIiArIGZUb2tlbkNvdW50ICsgIiB0b2tlbnMuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmVG9rZW5Db3VudCsrOwotCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgSlNQVG9rZW5pemVyKCl7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIEpTUFRva2VuaXplcihjaGFyW10gY2hhckFycmF5KXsKLQkJCXRoaXMobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSwgaW50IG5ld09mZnNldCkgewotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIG5ld09mZnNldCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotCQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIDApOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpIHsKLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCBuZXdPZmZzZXQpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluKSB7Ci0JCXJlc2V0KGluLCAwKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgKgotCSAqCi0JICogUmVzZXQgaW50ZXJuYWwgY291bnRlcnMgYW5kIHZhcnMgdG8gIm5ld2x5IGNyZWF0ZWQiIHZhbHVlcywgaW4gdGhlIGhvcGVzCi0JICogdGhhdCByZXNldHRpbmcgYSBwcmUtZXhpc3RpbmcgdG9rZW5pemVyIGlzIGZhc3RlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGNvbnRhaW5zIGNvZGUgYmxvY2tzIHRoYXQgd2VyZSBlc3NlbnRpYWxseSBkdXBsaWNhdGVkIGZyb20gdGhlCi0JICogPGVtPmdlbmVyYXRlZDwvZW0+IG91dHB1dCBvZiB0aGlzIHNwZWNpZmljYXRpb24gYmVmb3JlIHRoaXMgbWV0aG9kIHdhcwotCSAqIGFkZGVkLiAgVGhvc2UgY29kZSBibG9ja3Mgd2VyZSB1bmRlciB0aGUgYWJvdmUgY29weXJpZ2h0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXNldHRpbmcgdG9rZW5pemVyIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWZPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0JCi0JCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkJeXlfcmVhZGVyID0gaW47Ci0JCi0JCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQkJeXlfc3RhdGUgPSAwOwotCQotCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0JCi0JCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQkJdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCQl5eV9tYXJrZWRQb3MgPSAwOwotCQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0JCi0JCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9jdXJyZW50UG9zID0gMDsKLQkKLQkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JCXl5X3N0YXJ0UmVhZCA9IDA7Ci0JCi0JCS8qKiAKLQkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JCSAqIGZyb20gaW5wdXQgCi0JCSAqLwotCQl5eV9lbmRSZWFkID0gMDsKLQkKLQkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCS8veXlsaW5lID0gMDsKLQkKLQkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5Y2hhciA9IDA7Ci0JCi0JCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJeXlfYXRFT0YgPSBmYWxzZTsKLQkKLQkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0JCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0JCi0JCi0JCS8qIHVzZXIgdmFyczogKi8KLQkJZlRva2VuQ291bnQgPSAwOwotCSAKLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQkJZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCQlmQnVmZmVyZWRMZW5ndGggPSAwOwotCQlmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCQotCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOwotCQotCQljb250ZXh0ID0gbnVsbDsKLQkJc3RhcnQgPSAwOwotCQl0ZXh0TGVuZ3RoID0gMDsKLQkJbGVuZ3RoID0gMDsKLQkKLQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQkJCi0JCWZFTGxldmVsID0gMDsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKgotCSAqLwotCXB1YmxpYyBCbG9ja1Rva2VuaXplciBuZXdJbnN0YW5jZSgpIHsKLQkJSlNQVG9rZW5pemVyIG5ld0luc3RhbmNlID0gbmV3IEpTUFRva2VuaXplcigpOwotCQkvLyBnbG9iYWwgdGFnbWFya2VycyBjYW4gYmUgc2hhcmVkOyB0aGV5IGhhdmUgbm8gc3RhdGUgYW5kIAotCQkvLyBhcmUgbmV2ZXIgZGVzdHJveWVkIChlLmcuICdyZWxlYXNlJykKLQkJZm9yKGludCBpID0gMDsgaSA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUJsb2NrTWFya2VyIGJsb2NrTWFya2VyID0gKEJsb2NrTWFya2VyKSBmQmxvY2tNYXJrZXJzLmdldChpKTsKLQkJCWlmKGJsb2NrTWFya2VyLmlzR2xvYmFsKCkpCi0JCQkJbmV3SW5zdGFuY2UuYWRkQmxvY2tNYXJrZXIoYmxvY2tNYXJrZXIpOwotCQl9Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBmTmVzdGFibGVQcmVmaXhlcy5zaXplKCk7IGkrKykgewotCQkJVGFnTWFya2VyIG1hcmtlciA9IChUYWdNYXJrZXIpIGZOZXN0YWJsZVByZWZpeGVzLmdldChpKTsKLQkJCWlmKG1hcmtlci5pc0dsb2JhbCgpKQotCQkJCW5ld0luc3RhbmNlLmFkZE5lc3RhYmxlUHJlZml4KG1hcmtlcik7Ci0JCX0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5YTUxDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFNjYW4gZm9yICctLT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcwotCQkvLyAgIFhNTF9DT01NRU5UX1RFWFQgdW5sZXNzIHRoZSBzdHJpbmcgb2NjdXJzIElNTUVESUFURUxZLCBpbiB3aGljaAotCQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX1hNTF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0Ci0JCS8vICBjb250ZXh0IGFzIHVzdWFsLgotCQlyZXR1cm4gZG9TY2FuKCItLT4iLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgWE1MX0NPTU1FTlRfVEVYVCwgU1RfWE1MX0NPTU1FTlRfRU5ELCBTVF9YTUxfQ09NTUVOVF9FTkQpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5KU1BDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFNjYW4gZm9yICctLSU+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMKLQkJLy8gICBKU1BfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gKLQkJLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9KU1BfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dAotCQkvLyAgY29udGV4dCBhcyB1c3VhbC4KLQkJcmV0dXJuIGRvU2NhbigiLS0lPiIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgSlNQX0NPTU1FTlRfVEVYVCwgU1RfSlNQX0NPTU1FTlRfRU5ELCBTVF9KU1BfQ09NTUVOVF9FTkQpOwotCX0KLQkKLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0pzcFRhZygpIHsKLQkJcmV0dXJuIChmQ29udGFpbmVyVGFnICYmIGZFbWJlZGRlZENvbnRhaW5lciAhPSBudWxsKSB8fCAoZkNvbnRhaW5lclRhZyAmJiBmSW5UYWdDb250YWluZXIpIHx8IChmRW1iZWRkZWRUYWcgJiYgZkluVGFnRW1iZWRkZWQpOwotCX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSlNQVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKFN0cmluZyBwYWNrZWQpIHsKLSAgICBpbnQgW10gdHJhbnMgPSBuZXcgaW50WzM1Mjg3XTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCA5MzQ0KSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gdHJhbnNbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnM7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTM3NikgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLSAgICAvLyBETyBOT1QgRVhJVCB0aGUgVk0gb24gYW4gZXJyb3IKLSAgICAvLyBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShjaGFyW10gbWFya2VyVGFnTmFtZSwgaW50IG9mZnNldCwgaW50IHRhZ25hbWVMZW5ndGgpIHsKLQkJZm9yKGludCBqID0gMDsgaiA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBqKyspIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilmQmxvY2tNYXJrZXJzLmdldChqKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkubGVuZ3RoKCkgPT0gdGFnbmFtZUxlbmd0aCkgewotCQkJCWJvb2xlYW4gbWF0Y2hlc1NvRmFyID0gdHJ1ZTsKLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGFnbmFtZUxlbmd0aCAmJiBtYXRjaGVzU29GYXI7IGkrKykgewotCQkJCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpICE9IG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtYXRjaGVzU29GYXIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqCi0JICogUmV0dXJuIEFMTCBvZiB0aGUgcmVnaW9ucyBzY2FubmFibGUgd2l0aGluIHRoZSByZW1haW5pbmcgdGV4dAotCSAqIE5vdGU6IGZvciB2ZXJpZmljYXRpb24gdXNlCi0JICovCi0JcHVibGljIGZpbmFsIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCXdoaWxlKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCXRva2Vucy5hZGQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFN0YWNrT3ZlcmZsb3dFcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKyI6IGlucHV0IGNvdWxkIG5vdCBiZSB0b2tlbml6ZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRPZmZzZXQoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNpbmNlIHRoaXMgaXMgY29udmVuaWVuY2UgbWV0aG9kIGFuZCBOT1QgdGhlIHJlY29tbWVuZGVkIAotCQkJLy8gd2F5IG9mIGdldHRpbmcgdG9rZW5zLCBtYW55IGVycm9ycyBhcmUgc2ltcGx5IGhpZGRlbgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIG5vdCBoYW5kbGVkIHJldHJpZXZpbmcgcmVnaW9uczogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRva2VuczsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZHVtcChTdHJpbmcgcykgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzICsgIiAoIiArIHl5Y2hhciArICItIiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJKHl5bGVuZ3RoKCkgKyB5eWNoYXIpICsgIik6XCciICsvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1V0aWxzLmVzY2FwZSh5eXRleHQoKSkgKyAiXCciKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JLyogdXNlciBtZXRob2QgIC0gc2tlbGV0b24uc2VkICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7Ci0JCXJldHVybiB5eV9hdEVPRjsKLQl9Ci0vKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZCAqLwotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKFN0cmluZyBtYXJrZXJUYWdOYW1lKSB7Ci0JSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWJsb2Nrcy5uZXh0KCk7Ci0JCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgLy8gZG8gbm90aGluZywgdGhpcyBpcyB0aGUgZG93bnN0cmVhbSBwYXJzZXIncyBqb2IKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotICAgIHl5X3B1c2hiYWNrUG9zID0gLTE7Ci0gICAgYm9vbGVhbiB5eV93YXNfcHVzaGJhY2s7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgeXlfc3RhdGUgPSB5eV9sZXhpY2FsX3N0YXRlOwotCi0gICAgICB5eV93YXNfcHVzaGJhY2sgPSBmYWxzZTsKLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgaW50IHl5X25leHQgPSB5eXRyYW5zWyB5eV9yb3dNYXBbeXlfc3RhdGVdICsgeXljbWFwW3l5X2lucHV0XSBdOwotICAgICAgICAgIGlmICh5eV9uZXh0ID09IC0xKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgeXlfc3RhdGUgPSB5eV9uZXh0OwotCi0gICAgICAgICAgaW50IHl5X2F0dHJpYnV0ZXMgPSBZWV9BVFRSSUJVVEVbeXlfc3RhdGVdOwotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAyKSA+IDAgKQotICAgICAgICAgICAgeXlfcHVzaGJhY2tQb3MgPSB5eV9jdXJyZW50UG9zOwotCi0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID4gMCApIHsKLSAgICAgICAgICAgIHl5X3dhc19wdXNoYmFjayA9ICh5eV9hdHRyaWJ1dGVzICYgNCkgPiAwOwotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgOCkgPiAwICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV93YXNfcHVzaGJhY2spCi0gICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X3B1c2hiYWNrUG9zOwotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDEyNDogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgY2FzZSAxMzA6IAotICAgICAgICBjYXNlIDI4OTogCi0gICAgICAgIGNhc2UgMjk1OiAKLSAgICAgICAgY2FzZSAyOTY6IAotICAgICAgICBjYXNlIDQzMzogCi0gICAgICAgIGNhc2UgNDM2OiAKLSAgICAgICAgY2FzZSA1NDM6IAotICAgICAgICAgIHsgIC8qIG9ubHkgYWxsb3cgZm9yIG5vbi1KU1AgdGFncyBmb3IgdGhpcyBkb2VzIG5vdCBvYmV5IEpTUCBxdW90aW5nIHJ1bGVzICovCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDcxODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY5OiAKLSAgICAgICAgY2FzZSAxNzQ6IAotICAgICAgICBjYXNlIDE3NTogCi0gICAgICAgIGNhc2UgMzQ5OiAKLSAgICAgICAgY2FzZSAzNTU6IAotICAgICAgICBjYXNlIDM1NjogCi0gICAgICAgIGNhc2UgNDcwOiAKLSAgICAgICAgY2FzZSA0NzI6IAotICAgICAgICBjYXNlIDQ3NDogCi0gICAgICAgIGNhc2UgNDc2OiAKLSAgICAgICAgY2FzZSA1NTk6IAotICAgICAgICAgIHsgIC8qIEpTUCBhdHRyaWJ1dGUgdmFsdWVzIGhhdmUgZXNjYXBlIHNlbWFudGljcyAqLwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJqc3AgYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDcxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjg1OiAKLSAgICAgICAgY2FzZSA2OTA6IAotICAgICAgICBjYXNlIDY5NzogCi0gICAgICAgIGNhc2UgNzAyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJqc3AgZGlyZWN0aXZlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIEpTUF9ESVJFQ1RJVkVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzIwOiBicmVhazsKLSAgICAgICAgY2FzZSA2NjA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhTTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjQzOiAKLSAgICAgICAgY2FzZSA2NDY6IAotICAgICAgICBjYXNlIDY0NzogCi0gICAgICAgIGNhc2UgNjQ4OiAKLSAgICAgICAgY2FzZSA2NDk6IAotICAgICAgICBjYXNlIDY1MDogCi0gICAgICAgIGNhc2UgNjUxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNEQVRBIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQl5eWJlZ2luKFNUX0NEQVRBX1RFWFQpOwotCXJldHVybiBYTUxfQ0RBVEFfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzIyOiBicmVhazsKLSAgICAgICAgY2FzZSA2MzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImpzcDpyb290IHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIEpTUF9ST09UX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MjM6IGJyZWFrOwotICAgICAgICBjYXNlIDYyNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDcyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjI1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgNzI1OiBicmVhazsKLSAgICAgICAgY2FzZSA2MjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSA3MjY6IGJyZWFrOwotICAgICAgICBjYXNlIDYwOTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOwotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDOwotIH0KLSAgICAgICAgY2FzZSA3Mjc6IGJyZWFrOwotICAgICAgICBjYXNlIDYwODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOwotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNOwotIH0KLSAgICAgICAgY2FzZSA3Mjg6IGJyZWFrOwotICAgICAgICBjYXNlIDYwMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTc3OiAKLSAgICAgICAgY2FzZSA2MTg6IAotICAgICAgICBjYXNlIDYxOTogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX1ZCTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzMwOiBicmVhazsKLSAgICAgICAgY2FzZSA1Njc6IAotICAgICAgICBjYXNlIDYxNDogCi0gICAgICAgIGNhc2UgNjE1OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDczMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTU4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkpTUCBjb21tZW50IGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gSlNQX0NPTU1FTlRfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDczMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ1OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwgZWwtdW5xdW90ZWQiKTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJWQkwgaW4gYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCWZFTGxldmVsKys7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFfSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDczMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ0OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwgZWwtdW5xdW90ZWQiKTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJFTCBpbiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlmRUxsZXZlbCsrOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0V9KTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNzM0OiBicmVhazsKLSAgICAgICAgY2FzZSA1MzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ2hhclJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NIQVJfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA3MzU6IGJyZWFrOwotICAgICAgICBjYXNlIDUzMzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5jb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09NTUVOVF9URVhUOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9DT01NRU5UOwotCXl5YmVnaW4oU1RfWE1MX0NPTU1FTlQpOwotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA3MzY6IGJyZWFrOwotICAgICAgICBjYXNlIDUzMjogCi0gICAgICAgIGNhc2UgNTUzOiAKLSAgICAgICAgY2FzZSA1NTY6IAotICAgICAgICBjYXNlIDU2MDogCi0gICAgICAgIGNhc2UgNTYxOiAKLSAgICAgICAgY2FzZSA1NjM6IAotICAgICAgICBjYXNlIDU2NTogCi0gICAgICAgIGNhc2UgNTY4OiAKLSAgICAgICAgY2FzZSA1NzA6IAotICAgICAgICBjYXNlIDU3MTogCi0gICAgICAgIGNhc2UgNTczOiAKLSAgICAgICAgY2FzZSA1NzU6IAotICAgICAgICBjYXNlIDU3ODogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgY29tbWVudCBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDQpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjayg0KTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDQpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSAgewotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfQ09NTUVOVF9PUEVOLCBKU1BfQ09NTUVOVF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0JLy8gZmluaXNoZWQgc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIHJlZ3VsYXIgc2NyaXB0bGV0IG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7Ci0JCXJldHVybiBKU1BfQ09NTUVOVF9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwganNwQ29tbWVudFN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsKLQkJLy8gdGhlIGNvbW1lbnQgY29udGFpbmVyIGl0c2VsZiB3aWxsIGFjdCBhcyBjb21tZW50IHRleHQKLQkJZkVtYmVkZGVkSGludCA9IEpTUF9DT01NRU5UX1RFWFQ7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0NPTU1FTlRfT1BFTiwgSlNQX0NPTU1FTlRfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLyoKLQkJICogcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zOyBtYXJrIHRoaXMgb25lIGFzIGEKLQkJICogY29tbWVudCBzbyBpdCB3aWxsIGJlIG90aGVyd2lzZSBpZ25vcmVkIGJ1dCBwcmVzZXJ2ZWQgKHdoaWNoIGlzIHdoeQotCQkgKiB3ZSBjYW4ndCB1c2Ugd2hpdGUtc3BhY2UpCi0JCSAqLwotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDczNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE3OiAKLSAgICAgICAgY2FzZSA0MTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDczODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDczOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9DREFUQV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQwOiBicmVhazsKLSAgICAgICAgY2FzZSA0MTM6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMik7Ci0JZkVMbGV2ZWwrKzsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBKU1BfVkJMX0NMT1NFKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA3NDE6IGJyZWFrOwotICAgICAgICBjYXNlIDQxMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5QRVJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX1BFX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQyOiBicmVhazsKLSAgICAgICAgY2FzZSA0MTA6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAyKTsKLQlmRUxsZXZlbCsrOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgSlNQX0VMX0NMT1NFKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA3NDM6IGJyZWFrOwotICAgICAgICBjYXNlIDQwNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5FbnRpdHlSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA3NDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQwMDogCi0gICAgICAgIGNhc2UgNDU3OiAKLSAgICAgICAgY2FzZSA0Njc6IAotICAgICAgICBjYXNlIDQ4MjogCi0gICAgICAgIGNhc2UgNDg3OiAKLSAgICAgICAgY2FzZSA0OTI6IAotICAgICAgICBjYXNlIDQ5NzogCi0gICAgICAgIGNhc2UgNTAzOiAKLSAgICAgICAgY2FzZSA1MDk6IAotICAgICAgICBjYXNlIDUxMzogCi0gICAgICAgIGNhc2UgNTE4OiAKLSAgICAgICAgY2FzZSA1MjM6IAotICAgICAgICBjYXNlIDUyOTogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgZXhwcmVzc2lvbiBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhbiBleHByZXNzaW9uIG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgZXhwcmVzc2lvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCXJldHVybiBKU1BfRVhQUkVTU0lPTl9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwganNwRXhwcmVzc2lvblN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGV4cHJlc3Npb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRVhQUkVTU0lPTl9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDc0NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzk5OiAKLSAgICAgICAgY2FzZSA0NTY6IAotICAgICAgICBjYXNlIDQ2NjogCi0gICAgICAgIGNhc2UgNDgxOiAKLSAgICAgICAgY2FzZSA0ODY6IAotICAgICAgICBjYXNlIDQ5MTogCi0gICAgICAgIGNhc2UgNDk2OiAKLSAgICAgICAgY2FzZSA1MDI6IAotICAgICAgICBjYXNlIDUwODogCi0gICAgICAgIGNhc2UgNTEyOiAKLSAgICAgICAgY2FzZSA1MTc6IAotICAgICAgICBjYXNlIDUyMjogCi0gICAgICAgIGNhc2UgNTI4OiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBkZWNsYXJhdGlvbiBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIGRlY2xhcmF0aW9uIG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlyZXR1cm4gSlNQX0RFQ0xBUkFUSU9OX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCsiLCBqc3BEZWNsYXJhdGlvblN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0RFQ0xBUkFUSU9OX09QRU4sIEpTUF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA3NDY6IGJyZWFrOwotICAgICAgICBjYXNlIDM5ODogCi0gICAgICAgIGNhc2UgNDU1OiAKLSAgICAgICAgY2FzZSA0NjU6IAotICAgICAgICBjYXNlIDQ4MDogCi0gICAgICAgIGNhc2UgNDg1OiAKLSAgICAgICAgY2FzZSA0OTA6IAotICAgICAgICBjYXNlIDQ5NTogCi0gICAgICAgIGNhc2UgNTAxOiAKLSAgICAgICAgY2FzZSA1MDc6IAotICAgICAgICBjYXNlIDUxMTogCi0gICAgICAgIGNhc2UgNTE2OiAKLSAgICAgICAgY2FzZSA1MjE6IAotICAgICAgICBjYXNlIDUyNzogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgZGlyZWN0aXZlIGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JLy8gZW5kIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgZGVjbGFyYXRpb24gb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBkaXJlY3RpdmUgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FKTsKLQkJcmV0dXJuIEpTUF9ESVJFQ1RJVkVfT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KyIsIGpzcERpcmVjdGl2ZVN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUUpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9ESVJFQ1RJVkVfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9ESVJFQ1RJVkVfQ0xPU0UsIEpTUF9DTE9TRX0pOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA3NDc6IGJyZWFrOwotICAgICAgICBjYXNlIDM4ODogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfRFFVT1RFU19FTkQpOwotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3NDg6IGJyZWFrOwotICAgICAgICBjYXNlIDM4NDogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfU1FVT1RFU19FTkQpOwotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3NDk6IGJyZWFrOwotICAgICAgICBjYXNlIDM4MjogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbCsrOwotCWlmKGZFTGxldmVsID09IDEpIHsKLQkJcmV0dXJuIEpTUF9WQkxfT1BFTjsKLQl9Ci0gfQotICAgICAgICBjYXNlIDc1MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzcyOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX0RRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3NTE6IGJyZWFrOwotICAgICAgICBjYXNlIDM2ODogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTF9TUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzUyOiBicmVhazsKLSAgICAgICAgY2FzZSAzNjY6IAotICAgICAgICAgIHsgCi0JLy9TeXN0ZW0ub3V0LnByaW50bG4oSlNQX0VMX0NPTlRFTlQrICI6WyIgKyB5eXRleHQoKSArICJdIik7Ci0JcmV0dXJuIEpTUF9FTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3NTM6IGJyZWFrOwotICAgICAgICBjYXNlIDM2NTogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbCsrOwotCWlmKGZFTGxldmVsID09IDEpIHsKLQkJcmV0dXJuIEpTUF9FTF9PUEVOOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNzU0OiBicmVhazsKLSAgICAgICAgY2FzZSAzNjI6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9WQkwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFLCBKU1BfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBkb3VibGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIFZCTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpIHx8IGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhKU1BfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNzU1OiBicmVhazsKLSAgICAgICAgY2FzZSAzNjE6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9FTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFLCBKU1BfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBkb3VibGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkgfHwgZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQl9Ci0JZWxzZSB7Ci0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7Ci0JfQotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA3NTY6IGJyZWFrOwotICAgICAgICBjYXNlIDM2MDogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9TUVVPVEVEX1ZCTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIHNpbmdsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgVkJMCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSkgfHwgZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQl9Ci0JZWxzZSB7Ci0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7Ci0JfQotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA3NTc6IGJyZWFrOwotICAgICAgICBjYXNlIDM1OTogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9TUVVPVEVEX0VMKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIHNpbmdsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgRUwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSB8fCBmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoSlNQX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDc1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU3OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwgZ2VuZXJpY0VuZFRhZ09wZW4iKTsvLyROT04tTkxTLTEkCi0JfQotCWludCBpbmNvbWluZ1N0YXRlID0geXlzdGF0ZSgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBlbmQgdGFnIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9FTkRfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsKLQlpZih5eXN0YXRlKCkgIT0gU1RfQUJPUlRfRU1CRURERUQpCi0gICAgICAgIHl5YmVnaW4oaW5jb21pbmdTdGF0ZSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDc1OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzAxOiAKLSAgICAgICAgY2FzZSAzMTU6IAotICAgICAgICBjYXNlIDMyMTogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOwotIH0KLSAgICAgICAgY2FzZSA3NjA6IGJyZWFrOwotICAgICAgICBjYXNlIDI4NzogCi0gICAgICAgICAgeyAKLQlTdHJpbmcgdGFnTmFtZSA9IHl5dGV4dCgpLnN1YnN0cmluZygxKTsKLQkvLyBwdXNoYmFjayB0byBqdXN0IGFmdGVyIHRoZSBvcGVuaW5nIGJyYWNrZXQKLQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAxKTsKLQkvKgotCSAqIElmIHRoaXMgdGFnIGNhbiBub3QgYmUgbmVzdGVkIG9yIHdlJ3JlIGFscmVhZHkgc2VhcmNoaW5nIGZvciBhbgotCSAqIGF0dHJpYnV0ZSBuYW1lLCBlcXVhbHMsIG9yIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JaWYgKCFpc05lc3RhYmxlKHRhZ05hbWUpIHx8ICghZlN0YXRlU3RhY2suZW1wdHkoKSAmJiAoZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0VRVUFMUyB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfSlNQX0FUVFJJQlVURV9WQUxVRSkpKSB7Ci0JCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQkJcmV0dXJuIFhNTF9UQUdfT1BFTjsKLQl9Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBpbiBwbGFjZSBvZiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCS8vIGVtYmVkZGVkIGNvbnRhaW5lciBzaG91bGQgYmUgbG9va2luZyBmb3IgdGhlIG5hbWUgKGFnYWluKSBuZXh0Ci0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShYTUxfVEFHX09QRU4sIHRhZ05hbWUpOyAvLyA/Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA3NjE6IGJyZWFrOwotICAgICAgICBjYXNlIDI4NTogCi0gICAgICAgICAgeyAKLQlTdHJpbmcgdGFnTmFtZSA9IHl5dGV4dCgpLnN1YnN0cmluZygxKTsKLQkvLyBwdXNoYmFjayB0byBqdXN0IGFmdGVyIHRoZSBvcGVuaW5nIGJyYWNrZXQKLQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAxKTsKLQkvKgotCSAqIElmIHRoaXMgdGFnIGNhbiBub3QgYmUgbmVzdGVkIG9yIHdlJ3JlIGFscmVhZHkgc2VhcmNoaW5nIGZvciBhbgotCSAqIGF0dHJpYnV0ZSBuYW1lLCBlcXVhbHMsIG9yIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JaWYgKCFpc05lc3RhYmxlKHRhZ05hbWUpIHx8ICghZlN0YXRlU3RhY2suZW1wdHkoKSAmJiAoZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0VRVUFMUyB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfSlNQX0FUVFJJQlVURV9WQUxVRSkpKSB7Ci0JCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQkJcmV0dXJuIFhNTF9UQUdfT1BFTjsKLQl9Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBpbiBwbGFjZSBvZiBhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQkvLyBlbWJlZGRlZCBjb250YWluZXIgc2hvdWxkIGJlIGxvb2tpbmcgZm9yIHRoZSBuYW1lIChhZ2FpbikgbmV4dAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDc2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjgzOiAKLSAgICAgICAgICB7IAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZW1wdHkgdGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCi0JaWYgKGZFbWJlZGRlZENvbnRhaW5lciAhPSBudWxsKQotCQlmSW5UYWdFbWJlZGRlZCA9IGZhbHNlOwotCWVsc2UKLQkJZkluVGFnQ29udGFpbmVyID0gZmFsc2U7Ci0KLQlyZXR1cm4gWE1MX0VNUFRZX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzYzOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzY0OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gSlNQX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NjU6IGJyZWFrOwotICAgICAgICBjYXNlIDEyNzogCi0gICAgICAgIGNhc2UgMTcyOiAKLSAgICAgICAgICB7IAotCVN0cmluZyB0eXBlID0geXlfbGV4aWNhbF9zdGF0ZSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFID8gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFIDogSlNQX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFOwotCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCsiLCAiK3R5cGUpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCk7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gY29tcGxleCBkb3VibGUgcXVvdGVkIik7Ly8kTk9OLU5MUy0xJAotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIodHlwZSwgdHlwZSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JaWYgKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IFVOREVGSU5FRCkgewotCQlmUHJveHlVbmtub3duUmVnaW9uID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUsIGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpLCBmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpLCBmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkpOwotCQlyZXR1cm4gUFJPWFlfVU5LTk9XTl9DT05URVhUOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNzY2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjU6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCsiLCB1bnF1b3RlZCBnZW5lcmljVGFnT3BlbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCB0YWcgZW1iZWRkZWQgbmFtZSBzdGFydCAtIHN0YXJ0IHRhZyIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDc2NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihpc0pzcFRhZygpID8gU1RfSlNQX0FUVFJJQlVURV9WQUxVRSA6IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA3Njg6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDc2OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgY2FzZSAxMTk6IAotICAgICAgICBjYXNlIDEyMDogCi0gICAgICAgIGNhc2UgMjg0OiAKLSAgICAgICAgY2FzZSA0MzA6IAotICAgICAgICBjYXNlIDU0MjogCi0gICAgICAgIGNhc2UgNTgzOiAKLSAgICAgICAgY2FzZSA1ODQ6IAotICAgICAgICBjYXNlIDYwMzogCi0gICAgICAgIGNhc2UgNjA0OiAKLSAgICAgICAgY2FzZSA2MjI6IAotICAgICAgICBjYXNlIDYyMzogCi0gICAgICAgIGNhc2UgNjM2OiAKLSAgICAgICAgY2FzZSA2NDU6IAotICAgICAgICBjYXNlIDY1MzogCi0gICAgICAgIGNhc2UgNjU1OiAKLSAgICAgICAgY2FzZSA2NTc6IAotICAgICAgICBjYXNlIDY1OTogCi0gICAgICAgIGNhc2UgNjYyOiAKLSAgICAgICAgY2FzZSA2Njg6IAotICAgICAgICBjYXNlIDY2OTogCi0gICAgICAgIGNhc2UgNjcwOiAKLSAgICAgICAgY2FzZSA2NzE6IAotICAgICAgICBjYXNlIDY3MjogCi0gICAgICAgIGNhc2UgNjc4OiAKLSAgICAgICAgY2FzZSA2Nzk6IAotICAgICAgICBjYXNlIDY4MDogCi0gICAgICAgIGNhc2UgNjgxOiAKLSAgICAgICAgY2FzZSA2ODI6IAotICAgICAgICBjYXNlIDY4ODogCi0gICAgICAgIGNhc2UgNjg5OiAKLSAgICAgICAgY2FzZSA2OTE6IAotICAgICAgICBjYXNlIDY5MjogCi0gICAgICAgIGNhc2UgNjk4OiAKLSAgICAgICAgY2FzZSA2OTk6IAotICAgICAgICBjYXNlIDcwMDogCi0gICAgICAgIGNhc2UgNzAxOiAKLSAgICAgICAgY2FzZSA3MDc6IAotICAgICAgICBjYXNlIDcwODogCi0gICAgICAgIGNhc2UgNzA5OiAKLSAgICAgICAgY2FzZSA3MTA6IAotICAgICAgICBjYXNlIDcxMzogCi0gICAgICAgIGNhc2UgNzE0OiAKLSAgICAgICAgY2FzZSA3MTY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgIFN0cmluZyB0YWduYW1lID0geXl0ZXh0KCk7Ci0gICAgYm9vbGVhbiBqc3BUYWcgPSB0YWduYW1lLmluZGV4T2YoJzonKSAhPSAtMTsKLQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyICE9IG51bGwpIHsKLSAgICAJZkVtYmVkZGVkVGFnID0ganNwVGFnOwotCQlmSW5UYWdFbWJlZGRlZCA9IHRydWU7Ci0gICAgfQotCWVsc2UgewotCQlmQ29udGFpbmVyVGFnID0ganNwVGFnOwotCQlmSW5UYWdDb250YWluZXIgPSB0cnVlOwotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDc3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlpZihpc0Jsb2NrTWFya2VyKCkpIHsKLQkJZkVtYmVkZGVkSGludCA9IGdldEJsb2NrTWFya2VyQ29udGV4dCgpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9CTE9DS19UQUdfU0NBTjsKLSAgICAgICAgCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCX0KLQllbHNlCi0gICAgICAgIAl5eWJlZ2luKFlZSU5JVElBTCk7Ci0KLQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyICE9IG51bGwpCi0JCWZJblRhZ0VtYmVkZGVkID0gZmFsc2U7Ci0JZWxzZQotCQlmSW5UYWdDb250YWluZXIgPSBmYWxzZTsKLQotCXJldHVybiBYTUxfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NzE6IGJyZWFrOwotICAgICAgICBjYXNlIDEwOTogCi0gICAgICAgIGNhc2UgMTEzOiAKLSAgICAgICAgY2FzZSAyNzc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNzcyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDc3MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzc0OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBkaXJlY3RpdmUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFKTsKLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3NzU6IGJyZWFrOwotICAgICAgICBjYXNlIDEwMDogCi0gICAgICAgIGNhc2UgMTAxOiAKLSAgICAgICAgY2FzZSAxMDI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBjb2RlIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIGRvU2NhbigiJT4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBKU1BfQ09OVEVOVCwgU1RfSlNQX0NPTlRFTlQsIFNUX0pTUF9DT05URU5UKTsKLSB9Ci0gICAgICAgIGNhc2UgNzc2OiBicmVhazsKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgOTg6IAotICAgICAgICBjYXNlIDk5OiAKLSAgICAgICAgY2FzZSAyNjU6IAotICAgICAgICBjYXNlIDI2NjogCi0gICAgICAgIGNhc2UgMjY3OiAKLSAgICAgICAgY2FzZSAyNzA6IAotICAgICAgICBjYXNlIDI3MTogCi0gICAgICAgIGNhc2UgNDI0OiAKLSAgICAgICAgY2FzZSA0Mjc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDc3NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgNzc4OiBicmVhazsKLSAgICAgICAgY2FzZSA5NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzc5OiBicmVhazsKLSAgICAgICAgY2FzZSA5MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3ODA6IGJyZWFrOwotICAgICAgICBjYXNlIDg2OiAKLSAgICAgICAgY2FzZSA4ODogCi0gICAgICAgIGNhc2UgMjU0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDc4MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA3ODI6IGJyZWFrOwotICAgICAgICBjYXNlIDUwOiAKLSAgICAgICAgY2FzZSAyMDk6IAotICAgICAgICBjYXNlIDIxMDogCi0gICAgICAgIGNhc2UgMjEzOiAKLSAgICAgICAgY2FzZSAyMjM6IAotICAgICAgICBjYXNlIDIyNDogCi0gICAgICAgIGNhc2UgMjI3OiAKLSAgICAgICAgY2FzZSAyMjg6IAotICAgICAgICBjYXNlIDM5MzogCi0gICAgICAgIGNhc2UgMzk2OiAKLSAgICAgICAgY2FzZSA1MDY6IAotICAgICAgICBjYXNlIDUyMDogCi0gICAgICAgIGNhc2UgNTI2OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDc4MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICBjYXNlIDE4NzogCi0gICAgICAgIGNhc2UgMTg4OiAKLSAgICAgICAgY2FzZSAxOTE6IAotICAgICAgICBjYXNlIDIwMTogCi0gICAgICAgIGNhc2UgMjAyOiAKLSAgICAgICAgY2FzZSAyMDY6IAotICAgICAgICBjYXNlIDIwNzogCi0gICAgICAgIGNhc2UgMzYzOiAKLSAgICAgICAgY2FzZSAzNzc6IAotICAgICAgICBjYXNlIDM4MDogCi0gICAgICAgIGNhc2UgNDc4OiAKLSAgICAgICAgY2FzZSA0Nzk6IAotICAgICAgICBjYXNlIDQ5NDogCi0gICAgICAgIGNhc2UgNTAwOiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzg0OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMTYxOiAKLSAgICAgICAgY2FzZSAxNjI6IAotICAgICAgICBjYXNlIDM0NTogCi0gICAgICAgIGNhc2UgNDY0OiAKLSAgICAgICAgY2FzZSA0Njg6IAotICAgICAgICBjYXNlIDU1NzogCi0gICAgICAgIGNhc2UgNTkxOiAKLSAgICAgICAgY2FzZSA2MTE6IAotICAgICAgICBjYXNlIDYyODogCi0gICAgICAgIGNhc2UgNjM4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDc4NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDE1NDogCi0gICAgICAgIGNhc2UgMTU1OiAKLSAgICAgICAgY2FzZSAzMzM6IAotICAgICAgICBjYXNlIDQ1NDogCi0gICAgICAgIGNhc2UgNDU4OiAKLSAgICAgICAgY2FzZSA1NTQ6IAotICAgICAgICBjYXNlIDU5MDogCi0gICAgICAgIGNhc2UgNjEwOiAKLSAgICAgICAgY2FzZSA2Mjc6IAotICAgICAgICBjYXNlIDYzNzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzg2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMTE0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJpbmFwcHJvcHJpYXRlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWlmKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRHx8ZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQljaGFyIGMgPSB5eV9idWZmZXJbeXlfbWFya2VkUG9zIC0gMV07Ci0JCWlmIChmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCAmJiBjID09ICdcIicpIHsKLQkJCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEU7Ci0JCX0JCQotCQlpZiAoZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQgJiYgYyA9PSAnXCcnKSB7Ci0JCQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFOwotCQl9Ci0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKS0xKTsKLQkJcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCX0KLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzg3OiBicmVhazsKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMTA2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNzg4OiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICBjYXNlIDc0OiAKLSAgICAgICAgY2FzZSAxNzg6IAotICAgICAgICBjYXNlIDE4MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNzg5OiBicmVhazsKLSAgICAgICAgY2FzZSAwOiAKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgNjA6IAotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgIGNhc2UgMjM1OiAKLSAgICAgICAgY2FzZSAyMzc6IAotICAgICAgICBjYXNlIDI0MDogCi0gICAgICAgIGNhc2UgMjQyOiAKLSAgICAgICAgY2FzZSA0MDM6IAotICAgICAgICBjYXNlIDQwNDogCi0gICAgICAgIGNhc2UgNDA1OiAKLSAgICAgICAgY2FzZSA0MDk6IAotICAgICAgICBjYXNlIDQxMTogCi0gICAgICAgIGNhc2UgNDE0OiAKLSAgICAgICAgY2FzZSA1MzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuWE1MIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3OTA6IGJyZWFrOwotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgY2FzZSAxMDM6IAotICAgICAgICBjYXNlIDExNTogCi0gICAgICAgIGNhc2UgMTIxOiAKLSAgICAgICAgY2FzZSAxMzE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzkxOiBicmVhazsKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgIGNhc2UgNjI6IAotICAgICAgICBjYXNlIDY2OiAKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgY2FzZSA3MzogCi0gICAgICAgIGNhc2UgODM6IAotICAgICAgICBjYXNlIDg3OiAKLSAgICAgICAgY2FzZSA4OTogCi0gICAgICAgIGNhc2UgOTA6IAotICAgICAgICBjYXNlIDkxOiAKLSAgICAgICAgY2FzZSA5MzogCi0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICBjYXNlIDEwNTogCi0gICAgICAgIGNhc2UgMTEwOiAKLSAgICAgICAgY2FzZSAxMTE6IAotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgIGNhc2UgMTE3OiAKLSAgICAgICAgY2FzZSAxMjY6IAotICAgICAgICBjYXNlIDEzMzogCi0gICAgICAgIGNhc2UgMTM0OiAKLSAgICAgICAgY2FzZSAxMzU6IAotICAgICAgICBjYXNlIDEzNjogCi0gICAgICAgIGNhc2UgMTM4OiAKLSAgICAgICAgY2FzZSAxMzk6IAotICAgICAgICBjYXNlIDE0MTogCi0gICAgICAgIGNhc2UgMTQyOiAKLSAgICAgICAgY2FzZSAxNDM6IAotICAgICAgICBjYXNlIDE0NjogCi0gICAgICAgIGNhc2UgMTQ3OiAKLSAgICAgICAgY2FzZSAxNDg6IAotICAgICAgICBjYXNlIDE1MTogCi0gICAgICAgIGNhc2UgMTUyOiAKLSAgICAgICAgY2FzZSAxNTM6IAotICAgICAgICBjYXNlIDE1ODogCi0gICAgICAgIGNhc2UgMTU5OiAKLSAgICAgICAgY2FzZSAxNjA6IAotICAgICAgICBjYXNlIDE2ODogCi0gICAgICAgIGNhc2UgMTcwOiAKLSAgICAgICAgY2FzZSAxNzE6IAotICAgICAgICBjYXNlIDE5MzogCi0gICAgICAgIGNhc2UgMTk0OiAKLSAgICAgICAgY2FzZSAxOTc6IAotICAgICAgICBjYXNlIDE5ODogCi0gICAgICAgIGNhc2UgMjA0OiAKLSAgICAgICAgY2FzZSAyMDg6IAotICAgICAgICBjYXNlIDIxNTogCi0gICAgICAgIGNhc2UgMjE2OiAKLSAgICAgICAgY2FzZSAyMTk6IAotICAgICAgICBjYXNlIDIyMDogCi0gICAgICAgIGNhc2UgMjI1OiAKLSAgICAgICAgY2FzZSAyMjk6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFVOREVGSU5FRDsKLSB9Ci0gICAgICAgIGNhc2UgNzkyOiBicmVhazsKLSAgICAgICAgY2FzZSA2NDogCi0gICAgICAgIGNhc2UgNjU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JU3RyaW5nIHJldHVybmVkQ29udGV4dCA9IGRvU2NhbigiXV0+IiwgZmFsc2UsIHRydWUsIHRydWUsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQsICBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQKLQlpZihyZXR1cm5lZENvbnRleHQgPT0gWE1MX0NEQVRBX1RFWFQpCi0JCXl5YmVnaW4oU1RfQ0RBVEFfRU5EKTsKLQlyZXR1cm4gcmV0dXJuZWRDb250ZXh0OwotIH0KLSAgICAgICAgY2FzZSA3OTM6IGJyZWFrOwotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgY2FzZSAxOTY6IAotICAgICAgICBjYXNlIDIwMDogCi0gICAgICAgIGNhc2UgMjE4OiAKLSAgICAgICAgY2FzZSAyMjI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkxJTkUgRkVFRCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDc5NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzA6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSA3OTU6IGJyZWFrOwotICAgICAgICBjYXNlIDc1OiAKLSAgICAgICAgY2FzZSA3NjogCi0gICAgICAgIGNhc2UgNzc6IAotICAgICAgICBjYXNlIDc4OiAKLSAgICAgICAgY2FzZSAyNDc6IAotICAgICAgICBjYXNlIDI0ODogCi0gICAgICAgIGNhc2UgMjQ5OiAKLSAgICAgICAgY2FzZSA0MTk6IAotICAgICAgICBjYXNlIDUzODogCi0gICAgICAgIGNhc2UgNTM5OiAKLSAgICAgICAgY2FzZSA1ODE6IAotICAgICAgICBjYXNlIDU4MjogCi0gICAgICAgIGNhc2UgNjAxOiAKLSAgICAgICAgY2FzZSA2MjE6IAotICAgICAgICBjYXNlIDYzNDogCi0gICAgICAgIGNhc2UgNjQ0OiAKLSAgICAgICAgY2FzZSA2NTI6IAotICAgICAgICBjYXNlIDY1NDogCi0gICAgICAgIGNhc2UgNjU2OiAKLSAgICAgICAgY2FzZSA2NTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLSAgICAgICAgeXliZWdpbihTVF9QSV9XUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDc5NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzk6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oU1RfUElfQ09OVEVOVCk7Ci0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNzk3OiBicmVhazsKLSAgICAgICAgY2FzZSA4MDogCi0gICAgICAgIGNhc2UgODE6IAotICAgICAgICBjYXNlIDgyOiAKLSAgICAgICAgICB7IAotCQkvLyBibG9jayBzY2FuIHVudGlsIGNsb3NlIGlzIGZvdW5kCi0JcmV0dXJuIGRvU2NhbigiPz4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBYTUxfUElfQ09OVEVOVCwgU1RfWE1MX1BJX1RBR19DTE9TRSwgU1RfWE1MX1BJX1RBR19DTE9TRSk7Ci0gfQotICAgICAgICBjYXNlIDc5ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgODQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzk5OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjg6IAotICAgICAgICBjYXNlIDE3MzogCi0gICAgICAgICAgeyAKLQlTdHJpbmcgdHlwZSA9IHl5X2xleGljYWxfc3RhdGUgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSA/IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSA6IEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URTsKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KyIsICIrdHlwZSk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBjb21wbGV4IHNpbmdsZSBxdW90ZWQiKTsvLyROT04tTkxTLTEkCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcih0eXBlLCB0eXBlKTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgaWYgKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IFVOREVGSU5FRCkgewotCQlmUHJveHlVbmtub3duUmVnaW9uID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUsIGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpLCBmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpLCBmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkpOwotCQlyZXR1cm4gUFJPWFlfVU5LTk9XTl9DT05URVhUOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgODAwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMzI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRlY2xhcmF0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDgwMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHR5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDgwMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQwOiAKLSAgICAgICAgY2FzZSAxNDQ6IAotICAgICAgICBjYXNlIDMwNjogCi0gICAgICAgIGNhc2UgMzExOiAKLSAgICAgICAgY2FzZSA0NDY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgcHVibGljIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLSB9Ci0gICAgICAgIGNhc2UgODAzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNDU6IAotICAgICAgICBjYXNlIDE0OTogCi0gICAgICAgIGNhc2UgMzE4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0gfQotICAgICAgICBjYXNlIDgwNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTUwOiAKLSAgICAgICAgY2FzZSAzMjQ6IAotICAgICAgICBjYXNlIDMyOTogCi0gICAgICAgIGNhc2UgNDUxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgODA1OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgODA2OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTc6IAotICAgICAgICBjYXNlIDMzNjogCi0gICAgICAgIGNhc2UgMzQxOiAKLSAgICAgICAgY2FzZSA0NjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDgwNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTYzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgODA4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjY6IAotICAgICAgICBjYXNlIDE2NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5KU1AgY29tbWVudCB0ZXh0Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLSB9Ci0gICAgICAgIGNhc2UgODA5OiBicmVhazsKLSAgICAgICAgY2FzZSAxNzY6IAotICAgICAgICBjYXNlIDE4MDogCi0gICAgICAgIGNhc2UgMTgxOiAKLSAgICAgICAgY2FzZSAxODI6IAotICAgICAgICBjYXNlIDE4NTogCi0gICAgICAgIGNhc2UgMTg2OiAKLSAgICAgICAgY2FzZSAzNTg6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA4MTA6IGJyZWFrOwotICAgICAgICBjYXNlIDE3NzogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KyIsIGdlbmVyaWNUYWdPcGVuIik7Ly8kTk9OLU5MUy0xJAotCX0KLQlpbnQgaW5jb21pbmdTdGF0ZSA9IHl5c3RhdGUoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgaW5zaWRlIG9mIEpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7Ci0JaWYoeXlzdGF0ZSgpICE9IFNUX0FCT1JUX0VNQkVEREVEKQotICAgICAgICB5eWJlZ2luKGluY29taW5nU3RhdGUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA4MTE6IGJyZWFrOwotICAgICAgICBjYXNlIDE3OTogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gaXNKc3BUYWcoKSA/IEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSA6IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgODEyOiBicmVhazsKLSAgICAgICAgY2FzZSAxODQ6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIGlzSnNwVGFnKCk/IEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSA6IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgODEzOiBicmVhazsKLSAgICAgICAgY2FzZSAxODk6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFUyk7Ci0JcmV0dXJuIEpTUF9FTF9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDgxNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTkwOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX1NRVU9URVMpOwotCXJldHVybiBKU1BfRUxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA4MTU6IGJyZWFrOwotICAgICAgICBjYXNlIDE5MjogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbC0tOwotCWlmKGZFTGxldmVsID09IDApIHsKLQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQlyZXR1cm4gSlNQX0VMX0NMT1NFOwotCX0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDgxNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk1OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlyZXR1cm4gSlNQX0VMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgODE3OiBicmVhazsKLSAgICAgICAgY2FzZSAxOTk6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCXJldHVybiBKU1BfRUxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA4MTg6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMzogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gaXNKc3BUYWcoKSA/IEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URTogWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA4MTk6IGJyZWFrOwotICAgICAgICBjYXNlIDIwNTogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX0VMX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA4MjA6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfRFFVT1RFUyk7Ci0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA4MjE6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMjogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfU1FVT1RFUyk7Ci0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA4MjI6IGJyZWFrOwotICAgICAgICBjYXNlIDIxNDogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbC0tOwotCWlmKGZFTGxldmVsID09IDApIHsKLQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQlyZXR1cm4gSlNQX1ZCTF9DTE9TRTsKLQl9Ci0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgODIzOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTc6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlyZXR1cm4gSlNQX1ZCTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDgyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjIxOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA4MjU6IGJyZWFrOwotICAgICAgICBjYXNlIDIyNjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX1ZCTF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgODI2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMzA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZW5kIHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSA4Mjc6IGJyZWFrOwotICAgICAgICBjYXNlIDIzMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5wcm9jZXNzaW5nIGluc3RydWN0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfUEkpOwotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47Ci0gfQotICAgICAgICBjYXNlIDgyODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjMyOiAKLSAgICAgICAgY2FzZSAzMzI6IAotICAgICAgICBjYXNlIDM0NDogCi0gICAgICAgIGNhc2UgMzY0OiAKLSAgICAgICAgY2FzZSAzNjk6IAotICAgICAgICBjYXNlIDM3MzogCi0gICAgICAgIGNhc2UgMzc2OiAKLSAgICAgICAgY2FzZSAzNzk6IAotICAgICAgICBjYXNlIDM4MTogCi0gICAgICAgIGNhc2UgMzg1OiAKLSAgICAgICAgY2FzZSAzODk6IAotICAgICAgICBjYXNlIDM5MjogCi0gICAgICAgIGNhc2UgMzk1OiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBzY3JpcHRsZXQgYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMSk7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQkvLyBmaW5pc2hlZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIHJlZ3VsYXIgc2NyaXB0bGV0IG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1Agc2NyaXB0bGV0IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9TQ1JJUFRMRVRfT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KyIsIGpzcFNjcmlwdGxldFN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIHNjcmlwdGxldCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9TQ1JJUFRMRVRfT1BFTiwgSlNQX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucwotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0gICAgICAgIGVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9BVFRSSUJVVEVfVkFMVUUpIHsKLSAgICAgICAgICAgIGZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSAgICAgICAgICAgIGZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgfQotCQkKLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA4Mjk6IGJyZWFrOwotICAgICAgICBjYXNlIDIzMzogCi0gICAgICAgICAgeyAKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX09QRU47Ci0gfQotICAgICAgICBjYXNlIDgzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDgzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjUwOiAKLSAgICAgICAgICB7IAotCQkvLyBlbmRlZCB3aXRoIG5vdGhpbmcgaW5zaWRlCi0JCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgODMyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNTE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDgzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY0OiAKLSAgICAgICAgY2FzZSAxNjU6IAotICAgICAgICAgIHsgCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCSB9Ci0gICAgICAgIGNhc2UgODM0OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzcxMmUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uQ2hhcnNldE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgSlNQIENvcmUgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIEpTUENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0KLQkJLy8gY29tcGlsZXIvdmFsaWRhdGlvbiBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFURV9GUkFHTUVOVFMsIHRydWUpOwotCi0JCS8vIGNvZGUgZ2VuZXJhdGlvbiBwcmVmZXJlbmNlcwotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VULCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRlZmF1bHRFbmMgPSAiSVNPLTg4NTktMSI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3lzdGVtRW5jID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHN5c3RlbUVuYyAhPSBudWxsKSB7Ci0JCQlkZWZhdWx0RW5jID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldFByZWZlcnJlZERlZmF1bHRJYW5hTmFtZShzeXN0ZW1FbmMsICJJU08tODg1OS0xIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VULCBkZWZhdWx0RW5jKTsKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gdGhpcyBjb3VsZCBiZSBtYWRlIHNtYXJ0ZXIgYnkgYWN0dWFsbHkgbG9va2luZyB1cCB0aGUgY29udGVudAotCQkvLyB0eXBlJ3MgdmFsaWQgZXh0ZW5zaW9ucwotCQlub2RlLnB1dChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCAianNwIik7IC8vJE5PTi1OTFMtMSQKLQotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfRElGRkVSRU5UX1VSSVMsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfRFVQTElDQVRFX1BSRUZJWEVTX1NBTUVfVVJJUywgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19QUkVGSVgsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19VUklfT1JfVEFHRElSLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX1VOUkVTT0xWQUJMRV9VUklfT1JfVEFHRElSLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfUEFHRV9TVVBFUkNMQVNTX05PVF9GT1VORCwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX0lOQ0xVREVfTk9fRklMRV9TUEVDSUZJRUQsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX0ZJTEVfTk9UX0ZPVU5ELCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0KLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfTE9DQUxfVkFSSUFCTEVfTkVWRVJfVVNFRCwgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfQVJHVU1FTlRfSVNfTkVWRVJfVVNFRCwgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfTlVMTF9MT0NBTF9WQVJJQUJMRV9SRUZFUkVOQ0UsIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSk7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX1BPVEVOVElBTF9OVUxMX0xPQ0FMX1ZBUklBQkxFX1JFRkVSRU5DRSwgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfVU5VU0VEX0lNUE9SVCwgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKTsKLQotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRUxfU1lOVEFYLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9FTF9MRVhFUiwgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0VMX0ZVTkNUSU9OX1VOREVGSU5FRCwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCi0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX01JU1NJTkdfUkVRVUlSRURfQVRUUklCVVRFLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX1VOS05PV05fQVRUUklCVVRFLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTk9OX0VNUFRZX0lOTElORV9UQUcsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9VTkVYUEVDVEVEX1JURVhQUlZBTFVFLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX1ZBTElEQVRJT05fTUVTU0FHRSwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX05PVF9GT1VORCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0lOU1RBTlRJQVRFRCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfUlVOVElNRV9FWENFUFRJT04sIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEFHX0hBTkRMRVJfQ0xBU1NfTk9UX0ZPVU5ELCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTRUJFQU5fSU5WQUxJRF9JRCwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNCRUFOX01JU1NJTkdfVFlQRV9JTkZPLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0VCRUFOX0FNQklHVU9VU19UWVBFX0lORk8sIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOGFmOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotCi0vKioKLSAqIENvbW1vbiBwcmVmZXJlbmNlIGtleXMgdXNlZCBieSBKU1AgY29yZQotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29yZVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4dGVuc2lvbiB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZCBpbiB0aGUgTmV3IEpTUCBGaWxlCi0JICogV2l6YXJkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFRFTlNJT04gPSAiZGVmYXVsdEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBKU1AgZnJhZ21lbnRzIHNob3VsZCBiZSBjb21waWxlZC92YWxpZGF0ZWQuIEpTUCBmcmFnbWVudHMKLQkgKiB3aWxsIGJlIHZhbGlkYXRlZCB3aGVuIHRydWUuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfRlJBR01FTlRTID0gInZhbGlkYXRlRnJhZ21lbnRzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhhdCBKU1AgdmFsaWRhdGlvbiB3aWxsIHVzZSBwZXItcHJvamVjdCBwcmVmZXJlbmNlcwotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fVVNFX1BST0pFQ1RfU0VUVElOR1MgPSAidmFsaWRhdGlvbi51c2UtcHJvamVjdC1zZXR0aW5ncyI7Ci0KLQkvKioKLQkgKiBWYWxpZGF0aW9uIHByZWZlcmVuY2Uga2V5cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfRElGRkVSRU5UX1VSSVM9InZhbGlkYXRpb24uZGlyZWN0aXZlLXRhZ2xpYi1kdXBsaWNhdGUtcHJlZml4ZXMtZGlmZmVyZW50LXVyaXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfRFVQTElDQVRFX1BSRUZJWEVTX1NBTUVfVVJJUz0idmFsaWRhdGlvbi5kaXJlY3RpdmUtdGFnbGliLWR1cGxpY2F0ZS1wcmVmaXhlcy1zYW1lLXVyaXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19QUkVGSVg9InZhbGlkYXRpb24uZGlyZWN0aXZlLXRhZ2xpYi1taXNzaW5nLXByZWZpeCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9NSVNTSU5HX1VSSV9PUl9UQUdESVI9InZhbGlkYXRpb24uZGlyZWN0aXZlLXRhZ2xpYi1taXNzaW5nLXVyaS1vci10YWdkaXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfVU5SRVNPTFZBQkxFX1VSSV9PUl9UQUdESVI9InZhbGlkYXRpb24uZGlyZWN0aXZlLXRhZ2xpYi11bnJlc29sdmFibGUtdXJpLW9yLXRhZ2RpciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1BBR0VfU1VQRVJDTEFTU19OT1RfRk9VTkQ9InZhbGlkYXRpb24uZGlyZWN0aXZlLXBhZ2Utc3VwZXJjbGFzcy1ub3QtZm91bmQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX05PX0ZJTEVfU1BFQ0lGSUVEPSJ2YWxpZGF0aW9uLmRpcmVjdGl2ZS1pbmNsdWRlLWZyYWdtZW50LWZpbGUtbm90LXNwZWNpZmllZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX0lOQ0xVREVfRklMRV9OT1RfRk9VTkQ9InZhbGlkYXRpb24uZGlyZWN0aXZlLWluY2x1ZGUtZnJhZ21lbnQtZmlsZS1ub3QtZm91bmQiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfTE9DQUxfVkFSSUFCTEVfTkVWRVJfVVNFRCA9InZhbGlkYXRpb24uamF2YS1sb2NhbC12YXJpYWJsZS1pcy1uZXZlci11c2VkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfQVJHVU1FTlRfSVNfTkVWRVJfVVNFRCAgPSJ2YWxpZGF0aW9uLmphdmEtIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfTlVMTF9MT0NBTF9WQVJJQUJMRV9SRUZFUkVOQ0UgID0idmFsaWRhdGlvbi5qYXZhLW51bGwtbG9jYWwtdmFyaWFibGUtcmVmZXJlbmNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfUE9URU5USUFMX05VTExfTE9DQUxfVkFSSUFCTEVfUkVGRVJFTkNFICA9InZhbGlkYXRpb24uamF2YS1wb3RlbnRpYWwtbnVsbC1sb2NhbC12YXJpYWJsZS1yZWZlcmVuY2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fSkFWQV9VTlVTRURfSU1QT1JUICA9InZhbGlkYXRpb24uamF2YS11bnVzZWQtaW1wb3J0IjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0VMX1NZTlRBWCAgPSJ2YWxpZGF0aW9uLmVsLWdlbmVyYWwtc3ludGF4IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0VMX0xFWEVSICA9InZhbGlkYXRpb24uZWwtbGV4aWNhbC1mYWlsdXJlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0VMX0ZVTkNUSU9OX1VOREVGSU5FRCA9ICJ2YWxpZGF0aW9uLmVsLWZ1bmN0aW9uLXVuZGVmaW5lZCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTUlTU0lOR19SRVFVSVJFRF9BVFRSSUJVVEUgPSAidmFsaWRhdGlvbi5hY3Rpb25zLW1pc3NpbmctcmVxdWlyZWQtYXR0cmlidXRlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfVU5LTk9XTl9BVFRSSUJVVEUgPSAidmFsaWRhdGlvbi5hY3Rpb25zLXVua25vd24tYXR0cmlidXRlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfVU5FWFBFQ1RFRF9SVEVYUFJWQUxVRSA9ICJ2YWxpZGF0aW9uLmFjdGlvbnMtdW5leHBlY3RlZC1ydGV4cHJ2YWx1ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX05PTl9FTVBUWV9JTkxJTkVfVEFHID0gInZhbGlkYXRpb24uYWN0aW9ucy1ub24tZW1wdHktaW5saW5lLXRhZyI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfVkFMSURBVElPTl9NRVNTQUdFID0gInZhbGlkYXRpb24udHJhbnNsYXRpb24tdGVpLW1lc3NhZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX05PVF9GT1VORCA9ICJ2YWxpZGF0aW9uLnRyYW5zbGF0aW9uLXRlaS1jbGFzcy1ub3QtZm91bmQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX05PVF9JTlNUQU5USUFURUQgPSAidmFsaWRhdGlvbi50cmFuc2xhdGlvbi10ZWktY2xhc3Mtbm90LWluc3RhbnRpYXRlZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfUlVOVElNRV9FWENFUFRJT04gPSAidmFsaWRhdGlvbi50cmFuc2xhdGlvbi10ZWktY2xhc3MtcnVudGltZS1leGNlcHRpb24iOwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RBR19IQU5ETEVSX0NMQVNTX05PVF9GT1VORCA9ICJ2YWxpZGF0aW9uLnRyYW5zbGF0aW9uLXRhZy1jbGFzcy1ub3QtZm91bmQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9JTlZBTElEX0lEPSAidmFsaWRhdGlvbi50cmFuc2xhdGlvbi11c2ViZWFuLWludmFsaWQtaWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNCRUFOX01JU1NJTkdfVFlQRV9JTkZPPSAidmFsaWRhdGlvbi50cmFuc2xhdGlvbi11c2ViZWFuLW1pc3NpbmctdHlwZS1pbmZvIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTRUJFQU5fQU1CSUdVT1VTX1RZUEVfSU5GTyA9ICJ2YWxpZGF0aW9uLnRyYW5zbGF0aW9uLXVzZWJlYW4tYW1iaWd1b3VzLXR5cGUtaW5mbyI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDExTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDExTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDBmNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9KU1AxMU5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotLyoqCi0gKiBKU1AgMS4xIE5hbWVzcGFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDExTmFtZXNwYWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVsZW1lbnROYW1lIHsKLQkJLy8gRWxlbWVudCBuYW1lcwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFRMRVQgPSAianNwOnNjcmlwdGxldCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTiA9ICJqc3A6ZXhwcmVzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDTEFSQVRJT04gPSAianNwOmRlY2xhcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfUEFHRSA9ICJqc3A6ZGlyZWN0aXZlLnBhZ2UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElWRV9JTkNMVURFID0gImpzcDpkaXJlY3RpdmUuaW5jbHVkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUSVZFX1RBR0xJQiA9ICJqc3A6ZGlyZWN0aXZlLnRhZ2xpYiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFQkVBTiA9ICJqc3A6dXNlQmVhbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUUFJPUEVSVFkgPSAianNwOnNldFByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRQUk9QRVJUWSA9ICJqc3A6Z2V0UHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREUgPSAianNwOmluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkQgPSAianNwOmZvcndhcmQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTiA9ICJqc3A6cGx1Z2luIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTVMgPSAianNwOnBhcmFtcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMTEJBQ0sgPSAianNwOmZhbGxiYWNrIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTSA9ICJqc3A6cGFyYW0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAianNwOnJvb3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAianNwOnRleHQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQMTFfVVJJID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVEFHX1BSRUZJWCA9ICJqc3AiOyAvLyROT04tTkxTLTEkCi0JLy8gYXR0cmlidXRlIG5hbWVzCi0JLy8gICBkaXJlY3RpdmUucGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRVhURU5EUyA9ICJleHRlbmRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT05URU5UX1RZUEUgPSAiY29udGVudFR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lNUE9SVCA9ICJpbXBvcnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NFU1NJT04gPSAic2Vzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQlVGRkVSID0gImJ1ZmZlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVVUT0ZMVVNIID0gImF1dG9GbHVzaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNfVEhSRUFEX1NBRkUgPSAiaXNUaHJlYWRTYWZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JTkZPID0gImluZm8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VSUk9SX1BBR0UgPSAiZXJyb3JQYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU19FUlJPUl9QQUdFID0gImlzRXJyb3JQYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QQUdFX0VOQ09ESU5HID0gInBhZ2VFbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIGRpcmVjdGl2ZS5pbmNsdWRlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0ZJTEUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIGRpcmVjdGl2ZS50YWdsaWIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUFJFRklYID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIHVzZUJlYW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDT1BFID0gInNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQkVBTl9OQU1FID0gImJlYW5OYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JLy8gICBzZXRQcm9wZXJ0eQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BST1BFUlRZID0gInByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFSQU0gPSAicGFyYW0iOyAvLyROT04tTkxTLTEkCi0JLy8gICBpbmNsdWRlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBR0UgPSAicGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRkxVU0ggPSAiZmx1c2giOyAvLyROT04tTkxTLTEkCi0JLy8gICBwbHVnaW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERSA9ICJjb2RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0RFQkFTRSA9ICJjb2RlYmFzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUxJR04gPSAiYWxpZ24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FSQ0hJVkUgPSAiYXJjaGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSEVJR0hUID0gImhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFNQQUNFID0gImhzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSlJFVkVSU0lPTiA9ICJqcmV2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WU1BBQ0UgPSAidnNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9XSURUSCA9ICJ3aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTlNQTFVHSU5VUkwgPSAibnNwbHVnaW51cmwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lFUExVR0lOVVJMID0gImllcGx1Z2ludXJsIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgcm9vdAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9YTUxOU19KU1AgPSAieG1sbnM6anNwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JLy8gYXR0cmlidXRlIHZhbHVlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9KQVZBID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DVF9ERUZBVUxUID0gInRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIjsvL0QxOTUzNjYgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQlVGU0laX0RFRkFVTFQgPSAiOGtiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUEFHRSA9ICJwYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfU0VTU0lPTiA9ICJzZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkVRVUVTVCA9ICJyZXF1ZXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQVBQTElDQVRJT04gPSAiYXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CRUFOID0gImJlYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BUFBMRVQgPSAiYXBwbGV0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVE9QID0gInRvcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX01JRERMRSA9ICJtaWRkbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CT1RUT00gPSAiYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTEVGVCA9ICJsZWZ0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUklHSFQgPSAicmlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9KVkVSMTEgPSAiMS4xIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfWE1MTlNfSlNQID0gImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDEyTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDEyTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Zjc2ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9KU1AxMk5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBOYW1lcyBmb3IgSlNQIDEuMiBzcGVjLgotICogQ3VycmVudGx5LCBpdCBpcyBqdXN0IHRoZSBzYW1lIGFzIEpTUDExTmFtZXNwYWNlIGluIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBKU1AxMk5hbWVzcGFjZSBleHRlbmRzIEpTUDExTmFtZXNwYWNlIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9KU1AyME5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9KU1AyME5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTFmZGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMjBOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogTmV3IG5hbWVzIGZvciBKU1AgMi4wIHNwZWMuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBKU1AyME5hbWVzcGFjZSBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkpTUDIwTmFtZXNwYWNlIHsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMjFOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMjFOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiNWQ5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDIxTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDIxTmFtZXNwYWNlIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQMjFOYW1lc3BhY2UgewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyNDZiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzLCB3aXRoIGl0cyBvbmUgZmllbGQsIGlzIGEgY29udmllbmNlIHRvIHByb3ZpZGUgY29tcGlsZS10aW1lCi0gKiBzYWZldHkgd2hlbiByZWZlcmluZyB0byBhIGNvbnRlbnRUeXBlIElELiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkCi0gKiBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluIHBsdWdpbi54bWwgZmlsZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29udGVudFR5cGVJZEZvckpTUCB7Ci0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IHNldCB3aXRoIGRlZmF1bHQKLQkgKiBwcm90ZWN0ZWQgbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9KU1AgPSBnZXRDb25zdGFudFN0cmluZygpOwotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0Ci0JICogcHJvdGVjdGVkIG1ldGhvZCBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQgPSBnZXRGcmFnbWVudENvbnN0YW50U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLQkgKiBwbHVnaW4ueG1sIGZpbGUuIE5vdGU6IHRoaXMgdmFsdWUgaXMgaW50ZW50aWFsbHkgc2V0IHdpdGggZGVmYXVsdAotCSAqIHByb3RlY3RlZCBtZXRob2Qgc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX0pTUFRBRyA9IGdldFRhZ0NvbnN0YW50U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBEb24ndCBhbGxvdyBpbnN0YW50aWF0aW9uLgotCSAqLwotCXByaXZhdGUgQ29udGVudFR5cGVJZEZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldENvbnN0YW50U3RyaW5nKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXN0YXRpYyBTdHJpbmcgZ2V0RnJhZ21lbnRDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXN0YXRpYyBTdHJpbmcgZ2V0VGFnQ29uc3RhbnRTdHJpbmcoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ3NvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5M2RkMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklDb2RlZFJlc291cmNlUGx1Z2luOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUCB7Ci0JLyoqCi0JICogRXh0cmEgcHJvcGVydGllcyBhcyBwYXJ0IG9mIENvbnRlbnREZXNjcmlwdGlvbiwgaWYgdGhlIGNvbnRlbnQgaXMgSlNQLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBDT05URU5UX1RZUEVfQVRUUklCVVRFID0gbmV3IFF1YWxpZmllZE5hbWUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQsICJjb250ZW50VHlwZUF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIExBTkdVQUdFX0FUVFJJQlVURSA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAibGFuZ3VhZ2VBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBDT05URU5UX0ZBTUlMWV9BVFRSSUJVVEUgPSBuZXcgUXVhbGlmaWVkTmFtZShJQ29kZWRSZXNvdXJjZVBsdWdpbi5JRCwgImNvbnRlbnRGYW1pbHlBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJDsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lKU1BQYXJ0aXRpb25UeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lKU1BQYXJ0aXRpb25UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWNjMzFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JSlNQUGFydGl0aW9uVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbiB0eXBlcyBmb3IgSlNQLgotICogQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQGRlcHJlY2F0ZWQgdXNlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklKU1BQYXJ0aXRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUFBhcnRpdGlvblR5cGVzIHsKLQotCVN0cmluZyBKU1BfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLkRFRkFVTFRfSlNQIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfQ09NTUVOVCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9DT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBKU1BfU0NSSVBUX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLlNDUklQVC4iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT05URU5UX0RFTElNSVRFUiA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkRFTElNSVRFUiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfSkFWQSA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkpBVkEiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT05URU5UX0pBVkFTQ1JJUFQgPSBKU1BfU0NSSVBUX1BSRUZJWCArICJKQVZBU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfREVGQVVMVF9FTCA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkpTUF9FTCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0RFRkFVTFRfRUwyID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSlNQX0VMMiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgSlNQX0RJUkVDVElWRSA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9ESVJFQ1RJVkUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvRE9NSlNQUmVnaW9uQ29udGV4dHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9ET01KU1BSZWdpb25Db250ZXh0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzg3ZTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9ET01KU1BSZWdpb25Db250ZXh0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEZyaXRzIEphbHZpbmdoIC0gY29udHJpYnV0aW9ucyBmb3IgYnVnIDE1MDc5NAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBET01KU1BSZWdpb25Db250ZXh0cyBleHRlbmRzIERPTVJlZ2lvbkNvbnRleHQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DTE9TRSA9ICJKU1BfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfQ0xPU0UgPSAiSlNQX0NPTU1FTlRfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9PUEVOID0gIkpTUF9DT01NRU5UX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfVEVYVCA9ICJKU1BfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTlRFTlQgPSAiSlNQX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RFQ0xBUkFUSU9OX09QRU4gPSAiSlNQX0RFQ0xBUkFUSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9DTE9TRSA9ICJKU1BfRElSRUNUSVZFX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfTkFNRSA9ICJKU1BfRElSRUNUSVZFX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX09QRU4gPSAiSlNQX0RJUkVDVElWRV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FTF9DTE9TRSA9ICJKU1BfRUxfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX0NPTlRFTlQgPSAiSlNQX0VMX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX0RRVU9URSA9ICJKU1BfRUxfRFFVT1RFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX09QRU4gPSAiSlNQX0VMX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX1FVT1RFRF9DT05URU5UID0gIkpTUF9FTF9RVU9URURfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRUxfU1FVT1RFID0gIkpTUF9FTF9TUVVPVEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VYUFJFU1NJT05fT1BFTiA9ICJKU1BfRVhQUkVTU0lPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1JPT1RfVEFHX05BTUUgPSAiSlNQX1JPT1RfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU0NSSVBUTEVUX09QRU4gPSAiSlNQX1NDUklQVExFVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfQ0xPU0UgPSAiSlNQX1ZCTF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkJMX0NPTlRFTlQgPSAiSlNQX1ZCTF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfRFFVT1RFID0gIkpTUF9WQkxfRFFVT1RFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfT1BFTiA9ICJKU1BfVkJMX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZCTF9RVU9URURfQ09OVEVOVCA9ICJKU1BfVkJMX1FVT1RFRF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfU1FVT1RFID0gIkpTUF9WQkxfU1FVT1RFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIE5vbi10YWdsaWIgWE1MIHRhZywgbmVlZGluZyBzaW5nbGUgZXNjYXBlIHVucXVvdGluZyBmb3IgZW1iZWRkZWQgZXhwcmVzc2lvbnMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUgPSAiWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSA9ICJYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogVGFnbGliIHRhZyBhdHRyaWJ1dGUgd2l0aCBkb3VibGUgcXVvdGUsIG5lZWRpbmcgJ2RvdWJsZSBlc2NhcGluZycgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUgPSAiSlNQX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFIjsgLy8kTk9OLU5MUy0xJAotCS8qKiBUYWdsaWIgdGFnIGF0dHJpYnV0ZSB3aXRoIHNpbmdsZSBxdW90ZSwgbmVlZGluZyAnZG91YmxlIGVzY2FwaW5nJyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSA9ICJKU1BfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9CdWlsZFBhdGhDbGFzc0xvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvQnVpbGRQYXRoQ2xhc3NMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1NDQzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9CdWlsZFBhdGhDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0vKioKLSAqIEN1c3RvbSBDbGFzc0xvYWRlciBiYWNrZWQgYnkgYSBKYXZhIFByb2plY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWlsZFBhdGhDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQm9vbGVhbi52YWx1ZU9mKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGFnbGliY2xhc3Nsb2FkZXIiKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElKYXZhUHJvamVjdCBmUHJvamVjdDsKLQotCXB1YmxpYyBCdWlsZFBhdGhDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnQsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCWZQcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGdpdmVuIGZpbGUgd2l0aCAiZXh0cmVtZSBwcmVqdWRpY2UiLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIHRoZSB6aXAgZmlsZSB0byBiZSBjbG9zZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUphckZpbGUoWmlwRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlmaWxlLmNsb3NlKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJLy8gbm8gY2xlYW51cCBjYW4gYmUgZG9uZQotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiSmFyVXRpbGl0aWVzOiBDb3VsZCBub3QgY2xvc2UgZmlsZSAiICsgZmlsZS5nZXROYW1lKCksIGlvZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogVGhpcyBtYXkgcG9zZSBhIHJ1bnRpbWUgcGVyZm9ybWFuY2UgcHJvYmxlbSBhcyBpdCBvcGVucyB0aGUgY29udGFpbmluZwotCSAqIC5qYXIgZmlsZSBmb3IgZWFjaCBjbGFzcywgYnV0IHRoaXMgaXMgY291bnRlcmVkIGJ5IG5vIGxvbmdlciBsZWF2aW5nCi0JICogZmlsZSBoYW5kbGVzIG9wZW4gbm9yIGhhdmluZyB0byBkaXJlY3RseSBpbnRlcmFjdCB0aGUgYnVpbGQgcGF0aCBhdAotCSAqIGFsbC4gSWYgaXQgaXMgYSBwcm9ibGVtLCB0aGUgVGFnbGliSGVscGVyIHNob3VsZCBjb250cm9sIHNvbWUKLQkgKiAiYmF0Y2hpbmciIHdoZXJlYnkgd2UgbGVhdmUgdGhlIEphckZpbGVzIG9wZW4gdW50aWwgZGlyZWN0ZWQgdG8gY2xvc2UKLQkgKiB0aGVtIGF0IHRoZSBlbmQgb2YgVGFnbGliSGVscGVyLmFkZFRFSVZhcmlhYmxlcyguLi4pLgotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzTG9hZGVyI2ZpbmRDbGFzcyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBmaW5kQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImZpbmRpbmc6IFsiICsgY2xhc3NOYW1lICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRyeSB7Ci0JCQlJVHlwZSB0eXBlID0gZlByb2plY3QuZmluZFR5cGUoY2xhc3NOYW1lKTsKLQkJCWludCBvZmZzZXQgPSAtMTsKLQkJCWlmICh0eXBlID09IG51bGwgJiYgKG9mZnNldCA9IGNsYXNzTmFtZS5pbmRleE9mKCckJykpICE9IC0xKSB7Ci0JCQkJLy8gSW50ZXJuYWwgY2xhc3NlcyBmcm9tIHNvdXJjZSBmaWxlcyBtdXN0IGJlIHJlZmVyZW5jZWQgYnkgLiBpbnN0ZWFkIG9mICQKLQkJCQlTdHJpbmcgY2xzID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBvZmZzZXQpICsgY2xhc3NOYW1lLnN1YnN0cmluZyhvZmZzZXQpLnJlcGxhY2UoJyQnLCAnLicpOwotCQkJCXR5cGUgPSBmUHJvamVjdC5maW5kVHlwZShjbHMpOwotCQkJfQotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCUlQYXRoIHBhdGggPSBudWxsOwotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHR5cGUuZ2V0UmVzb3VyY2UoKTsKLQotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJCQlwYXRoID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJCQlpZiAocGF0aCA9PSBudWxsKQotCQkJCQlwYXRoID0gdHlwZS5nZXRQYXRoKCk7Ci0KLQkJCQkvLyBuZWVkcyB0byBiZSBjb21waWxlZCBiZWZvcmUgd2UgY2FuIGxvYWQgaXQKLQkJCQlpZiAoImNsYXNzIi5lcXVhbHNJZ25vcmVDYXNlKHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpKSkgewotCQkJCQlJRmlsZSBmaWxlID0gbnVsbDsKLQotCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQkJCQlmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQkJCQkJZWxzZQotCQkJCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQotCQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCWJ5dGVbXSBieXRlcyA9IGxvYWRCeXRlcyhmaWxlKTsKLQkJCQkJCXJldHVybiBkZWZpbmVDbGFzcyhjbGFzc05hbWUsIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIExvb2sgdXAgdGhlIGNsYXNzIGZpbGUgYmFzZWQgb24gdGhlIG91dHB1dCBsb2NhdGlvbiBvZiB0aGUgamF2YSBwcm9qZWN0Ci0JCQkJZWxzZSBpZiAoImphdmEiLmVxdWFsc0lnbm9yZUNhc2UocGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkpICYmIHJlc291cmNlICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAocmVzb3VyY2UuZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCQkJCUlKYXZhUHJvamVjdCBqUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQkJCQkJU3RyaW5nIG91dHB1dENsYXNzID0gU3RyaW5nVXRpbHMucmVwbGFjZSh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCAiLiIsICIvIikuY29uY2F0KCIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCUlQYXRoIGNsYXNzUGF0aCA9IGpQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCkuYXBwZW5kKG91dHB1dENsYXNzKTsKLQkJCQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoY2xhc3NQYXRoKTsKLQkJCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJCWJ5dGVbXSBieXRlcyA9IGxvYWRCeXRlcyhmaWxlKTsKLQkJCQkJCQlyZXR1cm4gZGVmaW5lQ2xhc3MoY2xhc3NOYW1lLCBieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpKSkgewotCQkJCQlTdHJpbmcgZXhwZWN0ZWRGaWxlTmFtZSA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY2xhc3NOYW1lLCAiLiIsICIvIikuY29uY2F0KCIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYnl0ZVtdIGJ5dGVzID0gZ2V0Q2FjaGVkSW5wdXRTdHJlYW0ocGF0aC50b09TU3RyaW5nKCksIGV4cGVjdGVkRmlsZU5hbWUpOwotCQkJCQlyZXR1cm4gZGVmaW5lQ2xhc3MoY2xhc3NOYW1lLCBieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5maW5kQ2xhc3MoY2xhc3NOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGVudHJ5IGZyb20gdGhlIGphcmZpbGUKLQkgKiBAcGFyYW0gamFyRmlsZW5hbWUgdGhlIHN0cmluZyBwYXRoIG9mIHRoZSBqYXJmaWxlCi0JICogQHBhcmFtIGVudHJ5TmFtZSB0aGUgZnVsbHktcXVhbGlmaWVkIGVudHJ5Ci0JICogQHJldHVybiB0aGUgYnl0ZXMgZm9yIHRoZSBlbnRyeSB3aXRoaW4gdGhlIGphcmZpbGUgb3IgYSBieXRlIGFycmF5IG9mIHNpemUgMAotCSAqLwotCXByaXZhdGUgYnl0ZVtdIGdldENhY2hlZElucHV0U3RyZWFtKFN0cmluZyBqYXJGaWxlbmFtZSwgU3RyaW5nIGVudHJ5TmFtZSkgewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyID0gbnVsbDsKLQotCQlGaWxlIHRlc3RGaWxlID0gbmV3IEZpbGUoamFyRmlsZW5hbWUpOwotCQlpZiAoIXRlc3RGaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJWmlwRmlsZSBqYXJmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphcmZpbGUgPSBuZXcgWmlwRmlsZShqYXJGaWxlbmFtZSk7Ci0JCQkKLQkJCWlmIChqYXJmaWxlICE9IG51bGwpIHsKLQkJCQlaaXBFbnRyeSB6ZW50cnkgPSBqYXJmaWxlLmdldEVudHJ5KGVudHJ5TmFtZSk7Ci0JCQkJaWYgKHplbnRyeSAhPSBudWxsKSB7Ci0JCQkJCUlucHV0U3RyZWFtIGVudHJ5SW5wdXRTdHJlYW0gPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJZW50cnlJbnB1dFN0cmVhbSA9IGphcmZpbGUuZ2V0SW5wdXRTdHJlYW0oemVudHJ5KTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gaW9FeGMpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkphclV0aWxpdGllczogIiArIGphckZpbGVuYW1lLCBpb0V4Yyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCWlmIChlbnRyeUlucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQkJCWludCBjOwotCQkJCQkJaWYgKHplbnRyeS5nZXRTaXplKCkgPiAwKSB7Ci0JCQkJCQkJYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgoaW50KSB6ZW50cnkuZ2V0U2l6ZSgpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGFycmF5IGRpbSByZXN0cmljdGlvbj8KLQkJCQkJCWJ5dGUgYnl0ZXNbXSA9IG5ldyBieXRlWzIwNDhdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQl3aGlsZSAoKGMgPSBlbnRyeUlucHV0U3RyZWFtLnJlYWQoYnl0ZXMpKSA+PSAwKSB7Ci0JCQkJCQkJCWJ1ZmZlci53cml0ZShieXRlcywgMCwgYyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWVudHJ5SW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJKYXJVdGlsaXRpZXM6ICIgKyBqYXJGaWxlbmFtZSwgaW9FeGMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZmluYWxseSB7Ci0JCQljbG9zZUphckZpbGUoamFyZmlsZSk7Ci0JCX0KLQotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCXJldHVybiBidWZmZXIudG9CeXRlQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gbmV3IGJ5dGVbMF07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBieXRlW10gbG9hZEJ5dGVzKElGaWxlIGZpbGUpIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07Ci0JCQlpbnQgcmVhZCA9IDA7Ci0JCQl3aGlsZSAoKHJlYWQgPSBpbi5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7Ci0JCQkJb3V0LndyaXRlKGJ1ZmZlciwgMCwgcmVhZCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9DdXN0b21UYWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL0N1c3RvbVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTg2NzEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL0N1c3RvbVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliOwotCi0vKioKLSAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgY3VzdG9tIHRhZyBpbmNsdWRpbmcgdGhlIHRhZyBuYW1lICh3aXRoIHByZWZpeCksCi0gKiB0aGUgY2xhc3MgdGhhdCBkZWZpbmVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSB0YWcsIFRFSSBjbGFzcywgYW55IHNjcmlwdGluZyB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotICogVEVJIGNsYXNzLCBhbmQgaWYgdGhlIGNsYXNzIGlzIGFuIGl0ZXJhdGlvbiB0YWcKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21UYWcgewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlRhZ05hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZkNsYXNzTmFtZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmVGVpQ2xhc3NOYW1lOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmSXNJdGVyYXRpb25UYWc7Ci0JcHJpdmF0ZSBmaW5hbCBUYWdsaWJWYXJpYWJsZVtdIGZWYXJpYWJsZXM7Ci0KLQlwdWJsaWMgQ3VzdG9tVGFnKFN0cmluZyB0YWdOYW1lLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgdGVpQ2xhc3NOYW1lLCBUYWdsaWJWYXJpYWJsZVtdIHRhZ1ZhcmlhYmxlcywgYm9vbGVhbiBpc0l0ZXJhdGlvblRhZykgewotCQlmVGFnTmFtZSA9IHRhZ05hbWU7Ci0JCWZDbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCWZUZWlDbGFzc05hbWUgPSB0ZWlDbGFzc05hbWU7Ci0JCWZWYXJpYWJsZXMgPSB0YWdWYXJpYWJsZXM7Ci0JCWZJc0l0ZXJhdGlvblRhZyA9IGlzSXRlcmF0aW9uVGFnOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHRhZyB3aXRoIGl0cyBwcmVmaXgKLQkgKiBAcmV0dXJuIHRoZSB0YWcgbmFtZSBpbmNsdWRpbmcgcHJlZml4Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWdOYW1lKCkgewotCQlyZXR1cm4gZlRhZ05hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSB0YWcKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdGhlIHRhZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZkNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBUYWdFeHRyYUluZm8gY2xhc3MgZm9yIHRoZSB0YWcKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBUYWdFeHRyYUluZm8gY2xhc3MgZm9yIHRoZSB0YWcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRlaUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGZUZWlDbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBzY3JpcHRpbmcgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgVGFnRXh0cmFJbmZvIGNsYXNzCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBzY3JpcHRpbmcgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgVGFnRXh0cmFJbmZvIGNsYXNzCi0JICovCi0JcHVibGljIFRhZ2xpYlZhcmlhYmxlW10gZ2V0VGFnVmFyaWFibGVzKCkgewotCQlyZXR1cm4gZlZhcmlhYmxlczsKLQl9Ci0KLQkvKioKLQkgKiBJZGVudGlmaWVzIGlmIHRoZSB0YWcgaW1wbGVtZW50cyB0aGUgSXRlcmF0aW9uVGFnIGludGVyZmFjZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFnIGltcGxlbWVudHMgdGhlIEl0ZXJhdGlvblRhZyBpbnRlcmZhY2U7IGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXRlcmF0aW9uVGFnKCkgewotCQlyZXR1cm4gZklzSXRlcmF0aW9uVGFnOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkNsYXNzTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGMzOTQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkNsYXNzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYjsKLQotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBDdXN0b20gY2xhc3Nsb2FkZXIgd2hpY2ggYWxsb3dzIHlvdSB0byBhZGQgc291cmNlIGRpcmVjdG9yaWVzIChmb2xkZXJzCi0gKiBjb250YWluaW5nIC5jbGFzcyBmaWxlcykgYW5kIGphcnMgdG8gdGhlIGNsYXNzcGF0aC4KLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYkNsYXNzTG9hZGVyIGV4dGVuZHMgVVJMQ2xhc3NMb2FkZXIgewotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQm9vbGVhbi52YWx1ZU9mKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGFnbGliY2xhc3Nsb2FkZXIiKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFID0gImZpbGU6LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFID0gInBsYXRmb3JtOi9yZXNvdXJjZS8iOwotCi0JcHVibGljIFRhZ2xpYkNsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudExvYWRlcikgewotCQlzdXBlcihuZXcgVVJMWzBdLCBwYXJlbnRMb2FkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERpcmVjdG9yeShTdHJpbmcgZGlyUGF0aCkgewotCQlhZGRKYXZhRmlsZShkaXJQYXRoICsgIi8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZpbGUoSVBhdGggZmlsZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKFJFU09VUkNFICsgZmlsZVBhdGgudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cGVyLmFkZFVSTCh1cmwpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkZWQ6IFsiICsgdXJsICsgIl0gdG8gY2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihmaWxlUGF0aC50b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZvbGRlcihJUGF0aCBmb2xkZXJQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChSRVNPVVJDRSArIGZvbGRlclBhdGgudG9TdHJpbmcoKSArICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cGVyLmFkZFVSTCh1cmwpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkZWQ6IFsiICsgdXJsICsgIl0gdG8gY2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihmb2xkZXJQYXRoLnRvU3RyaW5nKCksIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSmFyKFN0cmluZyBmaWxlbmFtZSkgewotCQlhZGRKYXZhRmlsZShmaWxlbmFtZSk7Ci0JfQotCi0Jdm9pZCBhZGRKYXZhRmlsZShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKEZJTEUgKyBmaWxlbmFtZSk7Ci0JCQlzdXBlci5hZGRVUkwodXJsKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkZGVkOiBbIiArIHVybCArICJdIHRvIGNsYXNzcGF0aCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZmlsZW5hbWUsIGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciNmaW5kQ2xhc3MoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJmaW5kaW5nOiBbIiArIGNsYXNzTmFtZSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gc3VwZXIuZmluZENsYXNzKGNsYXNzTmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxY2RhNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkZ1bmN0aW9uSW5mbzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnQXR0cmlidXRlSW5mbzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRGF0YTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdGaWxlSW5mbzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnSW5mbzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnTGlicmFyeUluZm87Ci1pbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5WYXJpYWJsZUluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVGFnbGliVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTEREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExEVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdE1lbW9yeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGVscHMgZmluZCBUYWdsaWJWYXJpYWJsZXMgaW4gYSBKU1AgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYkhlbHBlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFUkFUSU9OX1FVQUxJRklFUiA9ICJqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElURVJBVElPTl9OQU1FID0gIkl0ZXJhdGlvblRhZyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RhZ2xpYnZhcnMiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdCBmUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBDbGFzc0xvYWRlciBmTG9hZGVyID0gbnVsbDsKLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGZKYXZhUHJvamVjdDsKLQkKLQkvKioKLQkgKiBBIGNhY2hlIG9mIGNsYXNzIG5hbWVzIHRoYXQgdGhlIGNsYXNzIGxvYWRlciBjb3VsZCBub3QgZmluZC4KLQkgKiBCZWNhdXNlIHRoZSBUYWdsaWJIZWxwZXIgaXMgZGVzdHJveWVkIGFuZCByZWNyZWF0ZWQgd2hlbmV2ZXIKLQkgKiB0aGUgY2xhc3NwYXRoIGNoYW5nZXMgdGhpcyBjYWNoZSB3aWxsIG5vdCBiZWNvbWUgc3RhbGUKLQkgKi8KLQlwcml2YXRlIFNldCBmTm90Rm91bmRDbGFzc2VzID0gbnVsbDsKLQotCXByaXZhdGUgTWFwIGZDbGFzc01hcCA9IG51bGw7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGtlZXAgdGhlIHtAbGluayAjZk5vdEZvdW5kQ2xhc3Nlc30gY2FjaGUgY2xlYW4gd2hlbiBtZW1vcnkgaXMgbG93Ci0JICovCi0JcHJpdmF0ZSBNZW1vcnlMaXN0ZW5lciBmTWVtb3J5TGlzdGVuZXI7Ci0KLQlwdWJsaWMgVGFnbGliSGVscGVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJZk1lbW9yeUxpc3RlbmVyID0gbmV3IE1lbW9yeUxpc3RlbmVyKCk7Ci0JCWZNZW1vcnlMaXN0ZW5lci5jb25uZWN0KCk7Ci0JCWZOb3RGb3VuZENsYXNzZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmQ2xhc3NNYXAgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgPGNvZGU+dHlwZTwvY29kZT4gaW1wbGVtZW50cyBhbiBJdGVyYXRpb25UYWcKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiA8Y29kZT50eXBlPC9jb2RlPiBpbXBsZW1lbnRzIEl0ZXJhdGlvblRhZwotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHRocm93biB3aGVuIHRoZSA8Y29kZT50eXBlPC9jb2RlPiBpcyBudWxsCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSXRlcmF0aW9uVGFnKElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXN5bmNocm9uaXplZCAoZkNsYXNzTWFwKSB7Ci0JCQlpZiAoZkNsYXNzTWFwLmNvbnRhaW5zS2V5KHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKQotCQkJCXJldHVybiAoKEJvb2xlYW4pIGZDbGFzc01hcC5nZXQodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQkJU3RyaW5nIHNpZ25hdHVyZTsKLQkJU3RyaW5nIHF1YWxpZmllcjsKLQkJU3RyaW5nIG5hbWU7Ci0JCVN0cmluZ1tdIGludGVyZmFjZXMgPSB0eXBlLmdldFN1cGVySW50ZXJmYWNlVHlwZVNpZ25hdHVyZXMoKTsKLQkJYm9vbGVhbiBpc0l0ZXJhdGlvbiA9IGZhbHNlOwotCQkvLyBDaGVjayBhbnkgc3VwZXIgaW50ZXJmYWNlcyBmb3IgdGhlIGl0ZXJhdGlvbiB0YWcKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBGb3Igc291cmNlIGZpbGVzLCB0aGUgaW50ZXJmYWNlIG1heSBuZWVkIHRvIGJlIHJlc29sdmVkCi0JCQlTdHJpbmcgZXJhc3VyZVNpZyA9IFNpZ25hdHVyZS5nZXRUeXBlRXJhc3VyZShpbnRlcmZhY2VzW2ldKTsKLQkJCXF1YWxpZmllciA9IFNpZ25hdHVyZS5nZXRTaWduYXR1cmVRdWFsaWZpZXIoZXJhc3VyZVNpZyk7Ci0JCQluYW1lID0gU2lnbmF0dXJlLmdldFNpZ25hdHVyZVNpbXBsZU5hbWUoZXJhc3VyZVNpZyk7Ci0JCQkvLyBJbnRlcmZhY2UgdHlwZSBpcyB1bnJlc29sdmVkCi0JCQlpZiAoZXJhc3VyZVNpZy5jaGFyQXQoMCkgPT0gU2lnbmF0dXJlLkNfVU5SRVNPTFZFRCkgewotCQkJCVN0cmluZ1tdW10gdHlwZXMgPSB0eXBlLnJlc29sdmVUeXBlKGdldFF1YWxpZmllZFR5cGUocXVhbGlmaWVyLCBuYW1lKSk7Ci0JCQkJLy8gVHlwZSB3YXMgcmVzb2x2ZWQKLQkJCQlpZiAodHlwZXMgIT0gbnVsbCAmJiB0eXBlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCWlzSXRlcmF0aW9uID0gaGFuZGxlSW50ZXJmYWNlKHR5cGUsIHR5cGVzWzBdWzBdLCB0eXBlc1swXVsxXSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaXNJdGVyYXRpb24gPSBoYW5kbGVJbnRlcmZhY2UodHlwZSwgcXVhbGlmaWVyLCBuYW1lKTsKLQkJCX0KLQkJCWlmIChpc0l0ZXJhdGlvbikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXNpZ25hdHVyZSA9IHR5cGUuZ2V0U3VwZXJjbGFzc1R5cGVTaWduYXR1cmUoKTsKLQkJaWYgKHNpZ25hdHVyZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZXJhc3VyZVNpZyA9IFNpZ25hdHVyZS5nZXRUeXBlRXJhc3VyZShzaWduYXR1cmUpOwotCQkJcXVhbGlmaWVyID0gU2lnbmF0dXJlLmdldFNpZ25hdHVyZVF1YWxpZmllcihlcmFzdXJlU2lnKTsKLQkJCW5hbWUgPSBTaWduYXR1cmUuZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShlcmFzdXJlU2lnKTsKLQkJCS8vIHN1cGVyY2xhc3Mgd2FzIHVucmVzb2x2ZWQKLQkJCWlmIChlcmFzdXJlU2lnLmNoYXJBdCgwKSA9PSBTaWduYXR1cmUuQ19VTlJFU09MVkVEKSB7Ci0JCQkJU3RyaW5nW11bXSB0eXBlcyA9IHR5cGUucmVzb2x2ZVR5cGUoZ2V0UXVhbGlmaWVkVHlwZShxdWFsaWZpZXIsIG5hbWUpKTsKLQkJCQkvLyBUeXBlIHdhcyByZXNvbHZlZAotCQkJCWlmICh0eXBlcyAhPSBudWxsICYmIHR5cGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJaXNJdGVyYXRpb24gPSBpc0l0ZXJhdGlvblRhZyhmSmF2YVByb2plY3QuZmluZFR5cGUodHlwZXNbMF1bMF0sIHR5cGVzWzBdWzFdKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaXNJdGVyYXRpb24gPSBpc0l0ZXJhdGlvblRhZyhmSmF2YVByb2plY3QuZmluZFR5cGUocXVhbGlmaWVyLCBuYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJZkNsYXNzTWFwLnB1dCh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCBCb29sZWFuLnZhbHVlT2YoaXNJdGVyYXRpb24pKTsKLQkJcmV0dXJuIGlzSXRlcmF0aW9uOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYW5kbGVJbnRlcmZhY2UoSVR5cGUgdHlwZSwgU3RyaW5nIHF1YWxpZmllciwgU3RyaW5nIG5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlib29sZWFuIGlzSXRlcmF0aW9uID0gZmFsc2U7Ci0JCS8vIFF1YWxpZmllZCBpbnRlcmZhY2UgaXMgYW4gaXRlcmF0aW9uIHRhZwotCQlpZiAoSVRFUkFUSU9OX1FVQUxJRklFUi5lcXVhbHMocXVhbGlmaWVyKSAmJiBJVEVSQVRJT05fTkFNRS5lcXVhbHMobmFtZSkpCi0JCQlpc0l0ZXJhdGlvbiA9IHRydWU7Ci0JCS8vIENoZWNrIGFuY2VzdG9ycyBvZiB0aGlzIGludGVyZmFjZQotCQllbHNlCi0JCQlpc0l0ZXJhdGlvbiA9IGlzSXRlcmF0aW9uVGFnKGZKYXZhUHJvamVjdC5maW5kVHlwZShxdWFsaWZpZXIsIG5hbWUpKTsKLQotCQlmQ2xhc3NNYXAucHV0KHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIEJvb2xlYW4udmFsdWVPZihpc0l0ZXJhdGlvbikpOwotCQlyZXR1cm4gaXNJdGVyYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UXVhbGlmaWVkVHlwZShTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSkgewotCQlTdHJpbmdCdWZmZXIgcXVhbCA9IG5ldyBTdHJpbmdCdWZmZXIocXVhbGlmaWVyKTsKLQkJaWYgKHF1YWwubGVuZ3RoKCkgPiAwKQotCQkJcXVhbC5hcHBlbmQoJy4nKTsKLQkJcXVhbC5hcHBlbmQobmFtZSk7Ci0JCXJldHVybiBxdWFsLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSXRlcmF0aW9uVGFnKFRMREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGN1c3RvbVRhZywgTGlzdCBwcm9ibGVtcykgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudERlY2wuZ2V0VGFnY2xhc3MoKTsKLQkJaWYgKGNsYXNzTmFtZSA9PSBudWxsIHx8IGNsYXNzTmFtZS5sZW5ndGgoKSA9PSAwIHx8IGZQcm9qZWN0ID09IG51bGwgfHwgZk5vdEZvdW5kQ2xhc3Nlcy5jb250YWlucyhjbGFzc05hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGZDbGFzc01hcCkgewotCQkJCWlmIChmQ2xhc3NNYXAuY29udGFpbnNLZXkoY2xhc3NOYW1lKSkKLQkJCQkJcmV0dXJuICgoQm9vbGVhbikgZkNsYXNzTWFwLmdldChjbGFzc05hbWUpKS5ib29sZWFuVmFsdWUoKTsKLQkJCX0KLQkJCXJldHVybiBpc0l0ZXJhdGlvblRhZyhmSmF2YVByb2plY3QuZmluZFR5cGUoY2xhc3NOYW1lKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy90aGUgY2xhc3MgY291bGQgbm90IGJlIGZvdW5kIHNvIGFkZCBpdCB0byB0aGUgY2FjaGUKLQkJCWZOb3RGb3VuZENsYXNzZXMuYWRkKGNsYXNzTmFtZSk7Ci0KLQkJCU9iamVjdCBjcmVhdGVkUHJvYmxlbSA9IGNyZWF0ZUpTUFByb2JsZW0oZG9jdW1lbnQsIGN1c3RvbVRhZywgSUpTUFByb2JsZW0uVGFnQ2xhc3NOb3RGb3VuZCwgSlNQQ29yZU1lc3NhZ2VzLlRhZ2xpYkhlbHBlcl8zLCBjbGFzc05hbWUsIHRydWUpOwotCQkJaWYgKGNyZWF0ZWRQcm9ibGVtICE9IG51bGwpCi0JCQkJcHJvYmxlbXMuYWRkKGNyZWF0ZWRQcm9ibGVtKTsKLQkJCWlmIChERUJVRykKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGNsYXNzTmFtZSwgZSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihjbGFzc05hbWUsIGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gdGhpcyBpcyAzcmQgcGFydHkgY29kZSwgbmVlZCB0byBjYXRjaCBhbGwgZXJyb3JzCi0JCQlpZiAoREVCVUcpCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihjbGFzc05hbWUsIGUpOwotCQl9IGNhdGNoIChFcnJvciBlKSB7Ci0JCQkvLyB0aGlzIGlzIDNyZCBwYXJ0eSBjb2RlLCBuZWVkIHRvIGNhdGNoIGFsbCBlcnJvcnMKLQkJCWlmIChERUJVRykKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGNsYXNzTmFtZSwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEN1c3RvbVRhZyBnZXRDdXN0b21UYWcoU3RyaW5nIHRhZ1RvQWRkLCBJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2MsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjdXN0b21UYWcsIExpc3QgcHJvYmxlbXMpIHsKLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlib29sZWFuIGlzSXRlcmF0aW9uVGFnID0gZmFsc2U7Ci0JCVN0cmluZyB0YWdDbGFzcyA9IG51bGw7Ci0JCVN0cmluZyB0ZWlDbGFzcyA9IG51bGw7Ci0JCWlmIChwcm9ibGVtcyA9PSBudWxsKQotCQkJcHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1vZGVsUXVlcnkgbXEgPSBnZXRNb2RlbFF1ZXJ5KHN0cnVjdHVyZWREb2MpOwotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgbWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihzdHJ1Y3R1cmVkRG9jKTsKLQotCQkJaWYgKG1nciAhPSBudWxsKSB7Ci0KLQkJCQlMaXN0IHRyYWNrZXJzID0gbWdyLmdldENNRG9jdW1lbnRUcmFja2VycygtMSk7Ci0JCQkJSXRlcmF0b3IgdGFnbGlicyA9IHRyYWNrZXJzLml0ZXJhdG9yKCk7Ci0JCi0JCQkJQ01Eb2N1bWVudCBkb2MgPSBudWxsOwotCQkJCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRzID0gbnVsbDsKLQkJCQl3aGlsZSAodGFnbGlicy5oYXNOZXh0KCkpIHsKLQkJCQkJZG9jID0gKENNRG9jdW1lbnQpIHRhZ2xpYnMubmV4dCgpOwotCQkJCQlDTU5vZGUgbm9kZSA9IG51bGw7Ci0JCQkJCWlmICgoZWxlbWVudHMgPSBkb2MuZ2V0RWxlbWVudHMoKSkgIT0gbnVsbCAmJiAobm9kZSA9IGVsZW1lbnRzLmdldE5hbWVkSXRlbSh0YWdUb0FkZCkpICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKSB7Ci0JCi0JCQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNTm9kZVdyYXBwZXIpIHsKLQkJCQkJCQlub2RlID0gKChDTU5vZGVXcmFwcGVyKSBub2RlKS5nZXRPcmlnaW5Ob2RlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlUTERFbGVtZW50RGVjbGFyYXRpb24gdGxkRWxlbWVudERlY2wgPSAoVExERWxlbWVudERlY2xhcmF0aW9uKSBub2RlOwotCi0JCQkJCQl0YWdDbGFzcyA9IHRsZEVsZW1lbnREZWNsLmdldFRhZ2NsYXNzKCk7Ci0JCQkJCQl0ZWlDbGFzcyA9IHRsZEVsZW1lbnREZWNsLmdldFRlaWNsYXNzKCk7Ci0JCQkJCQlpc0l0ZXJhdGlvblRhZyA9IGlzSXRlcmF0aW9uVGFnKHRsZEVsZW1lbnREZWNsLCBzdHJ1Y3R1cmVkRG9jLCBjdXN0b21UYWcsIHByb2JsZW1zKTsKLQkJCQkJCS8qCi0JCQkJCQkgKiBBbHRob3VnaCBjbGVhcmx5IG5vdCB0aGUgcmlnaHQgcGxhY2UgdG8gYWRkIHZhbGlkYXRpb24KLQkJCQkJCSAqIGRlc2lnbi13aXNlLCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgdGhlCi0JCQkJCQkgKiBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gdmFsaWRhdGUgdGhlIHRhZyBjbGFzcy4KLQkJCQkJCSAqLwotCQkJCQkJdmFsaWRhdGVUYWdDbGFzcyhzdHJ1Y3R1cmVkRG9jLCBjdXN0b21UYWcsIHRsZEVsZW1lbnREZWNsLCBwcm9ibGVtcyk7Ci0JCi0JCQkJCQkvLyAxLjIrIHRhZ2xpYiBzdHlsZQotCQkJCQkJYWRkVmFyaWFibGVzKHJlc3VsdHMsIG5vZGUsIGN1c3RvbVRhZyk7Ci0JCi0JCQkJCQkvLyBmb3IgMS4xIG5lZWQgbW9yZSBpbmZvIGZyb20gdGFnbGliIHRyYWNrZXIKLQkJCQkJCWlmIChkb2MgaW5zdGFuY2VvZiBUYWdsaWJUcmFja2VyKSB7Ci0JCQkJCQkJU3RyaW5nIHVyaSA9ICgoVGFnbGliVHJhY2tlcikgZG9jKS5nZXRVUkkoKTsKLQkJCQkJCQlTdHJpbmcgcHJlZml4ID0gKChUYWdsaWJUcmFja2VyKSBkb2MpLmdldFByZWZpeCgpOwotCQkJCQkJCS8vIG9ubHkgZm9yIDEuMSB0YWdsaWJzCi0JCQkJCQkJYWRkVEVJVmFyaWFibGVzKHN0cnVjdHVyZWREb2MsIGN1c3RvbVRhZywgcmVzdWx0cywgdGxkRWxlbWVudERlY2wsIHByZWZpeCwgdXJpLCBwcm9ibGVtcyk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXcgQ3VzdG9tVGFnKHRhZ1RvQWRkLCB0YWdDbGFzcywgdGVpQ2xhc3MsIChUYWdsaWJWYXJpYWJsZVtdKSByZXN1bHRzLnRvQXJyYXkobmV3IFRhZ2xpYlZhcmlhYmxlW3Jlc3VsdHMuc2l6ZSgpXSksIGlzSXRlcmF0aW9uVGFnKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHRhZ1RvQWRkCi0JICogICAgICAgICAgICBpcyB0aGUgbmFtZSBvZiB0aGUgdGFnIHdob3NlIHZhcmlhYmxlcyB3ZSB3YW50Ci0JICogQHBhcmFtIHN0cnVjdHVyZWREb2MKLQkgKiAgICAgICAgICAgIGlzIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IHdoZXJlIHRoZSB0YWcgaXMgZm91bmQKLQkgKiBAcGFyYW0gY3VzdG9tVGFnCi0JICogICAgICAgICAgICBpcyB0aGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuaW5nIHRhZyBmb3IgdGhlIGN1c3RvbQotCSAqICAgICAgICAgICAgdGFnCi0JICogQHBhcmFtIHByb2JsZW1zIHByb2JsZW1zIHRoYXQgYXJlIGdlbmVyYXRlZCB3aGlsZSBjcmVhdGluZyB2YXJpYWJsZXMgYXJlIGFkZGVkIHRvIHRoaXMgY29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBUYWdsaWJWYXJpYWJsZVtdIGdldFRhZ2xpYlZhcmlhYmxlcyhTdHJpbmcgdGFnVG9BZGQsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvYywgSVRleHRSZWdpb25Db2xsZWN0aW9uIGN1c3RvbVRhZywgTGlzdCBwcm9ibGVtcykgewotCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByb2JsZW1zID09IG51bGwpCi0JCQlwcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTW9kZWxRdWVyeSBtcSA9IGdldE1vZGVsUXVlcnkoc3RydWN0dXJlZERvYyk7Ci0JCWlmIChtcSAhPSBudWxsKSB7Ci0JCQlUTERDTURvY3VtZW50TWFuYWdlciBtZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKHN0cnVjdHVyZWREb2MpOwotCi0JCQkvLyBUYWdsaWJTdXBwb3J0IHN1cHBvcnQgPSAoKFRhZ2xpYk1vZGVsUXVlcnkpCi0JCQkvLyBtcSkuZ2V0VGFnbGliU3VwcG9ydCgpOwotCQkJaWYgKG1nciA9PSBudWxsKQotCQkJCXJldHVybiBuZXcgVGFnbGliVmFyaWFibGVbMF07Ci0KLQkJCUxpc3QgdHJhY2tlcnMgPSBtZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKC0xKTsKLQkJCUl0ZXJhdG9yIHRhZ2xpYnMgPSB0cmFja2Vycy5pdGVyYXRvcigpOwotCi0JCQkvLyBUYWdsaWJTdXBwb3J0IHN1cHBvcnQgPSAoKFRhZ2xpYk1vZGVsUXVlcnkpCi0JCQkvLyBtcSkuZ2V0VGFnbGliU3VwcG9ydCgpOwotCQkJLy8gaWYgKHN1cHBvcnQgPT0gbnVsbCkKLQkJCS8vIHJldHVybiBuZXcgVGFnbGliVmFyaWFibGVbMF07Ci0JCQkvLwotCQkJLy8gSXRlcmF0b3IgdGFnbGlicyA9Ci0JCQkvLyBzdXBwb3J0LmdldENNRG9jdW1lbnRzKGN1c3RvbVRhZy5nZXRTdGFydE9mZnNldCgpKS5pdGVyYXRvcigpOwotCQkJQ01Eb2N1bWVudCBkb2MgPSBudWxsOwotCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBudWxsOwotCQkJd2hpbGUgKHRhZ2xpYnMuaGFzTmV4dCgpKSB7Ci0JCQkJZG9jID0gKENNRG9jdW1lbnQpIHRhZ2xpYnMubmV4dCgpOwotCQkJCUNNTm9kZSBub2RlID0gbnVsbDsKLQkJCQlpZiAoKGVsZW1lbnRzID0gZG9jLmdldEVsZW1lbnRzKCkpICE9IG51bGwgJiYgKG5vZGUgPSBlbGVtZW50cy5nZXROYW1lZEl0ZW0odGFnVG9BZGQpKSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikgewotCi0JCQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ01Ob2RlV3JhcHBlcikgewotCQkJCQkJbm9kZSA9ICgoQ01Ob2RlV3JhcHBlcikgbm9kZSkuZ2V0T3JpZ2luTm9kZSgpOwotCQkJCQl9Ci0JCQkJCVRMREVsZW1lbnREZWNsYXJhdGlvbiB0bGRFbGVtZW50RGVjbCA9IChUTERFbGVtZW50RGVjbGFyYXRpb24pIG5vZGU7Ci0KLQkJCQkJLyoKLQkJCQkJICogQWx0aG91Z2ggY2xlYXJseSBub3QgdGhlIHJpZ2h0IHBsYWNlIHRvIGFkZCB2YWxpZGF0aW9uCi0JCQkJCSAqIGRlc2lnbi13aXNlLCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgdGhlCi0JCQkJCSAqIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byB2YWxpZGF0ZSB0aGUgdGFnIGNsYXNzLgotCQkJCQkgKi8KLQkJCQkJdmFsaWRhdGVUYWdDbGFzcyhzdHJ1Y3R1cmVkRG9jLCBjdXN0b21UYWcsIHRsZEVsZW1lbnREZWNsLCBwcm9ibGVtcyk7Ci0KLQkJCQkJLy8gMS4yKyB0YWdsaWIgc3R5bGUKLQkJCQkJYWRkVmFyaWFibGVzKHJlc3VsdHMsIG5vZGUsIGN1c3RvbVRhZyk7Ci0KLQkJCQkJLy8gZm9yIDEuMSBuZWVkIG1vcmUgaW5mbyBmcm9tIHRhZ2xpYiB0cmFja2VyCi0JCQkJCWlmIChkb2MgaW5zdGFuY2VvZiBUYWdsaWJUcmFja2VyKSB7Ci0JCQkJCQlTdHJpbmcgdXJpID0gKChUYWdsaWJUcmFja2VyKSBkb2MpLmdldFVSSSgpOwotCQkJCQkJU3RyaW5nIHByZWZpeCA9ICgoVGFnbGliVHJhY2tlcikgZG9jKS5nZXRQcmVmaXgoKTsKLQkJCQkJCS8vIG9ubHkgZm9yIDEuMSB0YWdsaWJzCi0JCQkJCQlhZGRURUlWYXJpYWJsZXMoc3RydWN0dXJlZERvYywgY3VzdG9tVGFnLCByZXN1bHRzLCB0bGRFbGVtZW50RGVjbCwgcHJlZml4LCB1cmksIHByb2JsZW1zKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAoVGFnbGliVmFyaWFibGVbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBUYWdsaWJWYXJpYWJsZVtyZXN1bHRzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEFkZHMgMS4yIHN0eWxlIFRhZ2xpYlZhcmlhYmxlcyB0byB0aGUgcmVzdWx0cyBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRzCi0JICogICAgICAgICAgICBsaXN0IHdoZXJlIHRoZSA8Y29kZT5UYWdsaWJWYXJpYWJsZTwvY29kZT4gcyBhcmUgYWRkZWQKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRWYXJpYWJsZXMoTGlzdCByZXN1bHRzLCBDTU5vZGUgbm9kZSwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGN1c3RvbVRhZykgewotCQlMaXN0IGxpc3QgPSAoKFRMREVsZW1lbnREZWNsYXJhdGlvbikgbm9kZSkuZ2V0VmFyaWFibGVzKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlUTERWYXJpYWJsZSB2YXIgPSAoVExEVmFyaWFibGUpIGl0Lm5leHQoKTsKLQkJCWlmICghdmFyLmdldERlY2xhcmUoKSkKLQkJCQljb250aW51ZTsKLQotCQkJU3RyaW5nIHZhck5hbWUgPSB2YXIuZ2V0TmFtZUdpdmVuKCk7Ci0JCQlpZiAodmFyTmFtZSA9PSBudWxsKSB7Ci0JCQkJLy8gMi4wCi0JCQkJdmFyTmFtZSA9IHZhci5nZXRBbGlhcygpOwotCQkJfQotCQkJaWYgKHZhck5hbWUgPT0gbnVsbCkgewotCQkJCVN0cmluZyBhdHRyTmFtZSA9IHZhci5nZXROYW1lRnJvbUF0dHJpYnV0ZSgpOwotCQkJCS8qCi0JCQkJICogSXRlcmF0ZSB0aHJvdWdoIHRoZSBkb2N1bWVudCByZWdpb24gdG8gZmluZCB0aGUKLQkJCQkgKiBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBuYW1lLCBhbmQgdGhlbiB1c2UgaXRzIHZhbHVlCi0JCQkJICovCi0JCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBjdXN0b21UYWcuZ2V0UmVnaW9ucygpOwotCQkJCWJvb2xlYW4gYXR0ck5hbWVGb3VuZCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGkgPSAyOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRS5lcXVhbHMocmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCWF0dHJOYW1lRm91bmQgPSBhdHRyTmFtZS5lcXVhbHMoY3VzdG9tVGFnLmdldFRleHQocmVnaW9uKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGF0dHJOYW1lRm91bmQgJiYgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRS5lcXVhbHMocmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCXZhck5hbWUgPSBTdHJpbmdVdGlscy5zdHJpcChjdXN0b21UYWcuZ2V0VGV4dChyZWdpb24pKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICh2YXJOYW1lICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdmFyQ2xhc3MgPSAiamF2YS5sYW5nLlN0cmluZyI7IC8vIHRoZSBkZWZhdWx0Ci0JCQkJLy8gY2xhc3MuLi4vLyROT04tTkxTLTEkCi0JCQkJaWYgKHZhci5nZXRWYXJpYWJsZUNsYXNzKCkgIT0gbnVsbCkgewotCQkJCQl2YXJDbGFzcyA9IHZhci5nZXRWYXJpYWJsZUNsYXNzKCk7Ci0JCQkJfQotCQkJCXJlc3VsdHMuYWRkKG5ldyBUYWdsaWJWYXJpYWJsZSh2YXJDbGFzcywgdmFyTmFtZSwgdmFyLmdldFNjb3BlKCksIHZhci5nZXREZXNjcmlwdGlvbigpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIDEuMSBzdHlsZSBUYWdsaWJWYXJpYWJsZXMgKGRlZmluZWQgaW4gYSBUYWdFeHRyYUluZm8gY2xhc3MpIHRvIHRoZQotCSAqIHJlc3VsdHMgbGlzdC4gQWxzbyByZXBvcnRzIHByb2JsZW1zIHdpdGggdGhlIHRhZyBhbmQgdGVpIGNsYXNzZXMgaW4KLQkgKiBmVHJhbnNsYXRvclByb2JsZW1zLgotCSAqIAotCSAqIEBwYXJhbSBjdXN0b21UYWcKLQkgKiBAcGFyYW0gcmVzdWx0cwotCSAqICAgICAgICAgICAgbGlzdCB3aGVyZSB0aGUgPGNvZGU+VGFnbGliVmFyaWFibGU8L2NvZGU+IHMgYXJlIGFkZGVkCi0JICogQHBhcmFtIGRlY2wKLQkgKiAgICAgICAgICAgIFRMREVsZW1lbnREZWNsYXJhdGlvbiBmb3IgdGhlIGN1c3RvbSB0YWcKLQkgKiBAcGFyYW0gcHJlZml4Ci0JICogICAgICAgICAgICBjdXN0b20gdGFnIHByZWZpeAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFVSSSB3aGVyZSB0aGUgdGxkIGNhbiBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRURUlWYXJpYWJsZXMoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGN1c3RvbVRhZywgTGlzdCByZXN1bHRzLCBUTERFbGVtZW50RGVjbGFyYXRpb24gZGVjbCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgTGlzdCBwcm9ibGVtcykgewotCQlTdHJpbmcgdGVpQ2xhc3NuYW1lID0gZGVjbC5nZXRUZWljbGFzcygpOwotCQlpZiAodGVpQ2xhc3NuYW1lID09IG51bGwgfHwgdGVpQ2xhc3NuYW1lLmxlbmd0aCgpID09IDAgfHwgZkphdmFQcm9qZWN0ID09IG51bGwgfHwgZk5vdEZvdW5kQ2xhc3Nlcy5jb250YWlucyh0ZWlDbGFzc25hbWUpKQotCQkJcmV0dXJuOwotCi0JCUNsYXNzTG9hZGVyIGxvYWRlciA9IGdldENsYXNzbG9hZGVyKCk7Ci0KLQkJQ2xhc3MgdGVpQ2xhc3MgPSBudWxsOwotCQl0cnkgewotCQkJLyoKLQkJCSAqIEpEVCBjb3VsZCB0ZWxsIHVzIGFib3V0IGl0LCBidXQgbG9hZGluZyBhbmQgY2FsbGluZyBpdCB3b3VsZAotCQkJICogc3RpbGwgdGFrZSB0aW1lCi0JCQkgKi8KLQkJCXRlaUNsYXNzID0gQ2xhc3MuZm9yTmFtZSh0ZWlDbGFzc25hbWUsIHRydWUsIGxvYWRlcik7Ci0JCQlpZiAodGVpQ2xhc3MgIT0gbnVsbCkgewotCQkJCU9iamVjdCB0ZWlPYmplY3QgPSB0ZWlDbGFzcy5uZXdJbnN0YW5jZSgpOwotCQkJCWlmIChUYWdFeHRyYUluZm8uY2xhc3MuaXNJbnN0YW5jZSh0ZWlPYmplY3QpKSB7Ci0JCQkJCVRhZ0V4dHJhSW5mbyB0ZWkgPSAoVGFnRXh0cmFJbmZvKSB0ZWlPYmplY3Q7Ci0JCQkJCUhhc2h0YWJsZSB0YWdEYXRhVGFibGUgPSBleHRyYWN0VGFnRGF0YShjdXN0b21UYWcpOwotCQkJCQlUYWdJbmZvIGluZm8gPSBnZXRUYWdJbmZvKGRlY2wsIHRlaSwgcHJlZml4LCB1cmkpOwotCQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCQl0ZWkuc2V0VGFnSW5mbyhpbmZvKTsKLQotCQkJCQkJLy8gYWRkIHRvIHJlc3VsdHMKLQkJCQkJCVRhZ0RhdGEgdGQgPSBuZXcgVGFnRGF0YSh0YWdEYXRhVGFibGUpOwotCi0JCQkJCQlWYXJpYWJsZUluZm9bXSB2SW5mb3MgPSB0ZWkuZ2V0VmFyaWFibGVJbmZvKHRkKTsKLQkJCQkJCWlmICh2SW5mb3MgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdkluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCXJlc3VsdHMuYWRkKG5ldyBUYWdsaWJWYXJpYWJsZSh2SW5mb3NbaV0uZ2V0Q2xhc3NOYW1lKCksIHZJbmZvc1tpXS5nZXRWYXJOYW1lKCksIHZJbmZvc1tpXS5nZXRTY29wZSgpLCBkZWNsLmdldERlc2NyaXB0aW9uKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCVZhbGlkYXRpb25NZXNzYWdlW10gbWVzc2FnZXMgPSB0ZWkudmFsaWRhdGUodGQpOwotCQkJCQkJaWYgKG1lc3NhZ2VzICE9IG51bGwgJiYgbWVzc2FnZXMubGVuZ3RoID4gMCkgewotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJT2JqZWN0IGNyZWF0ZWRQcm9ibGVtID0gY3JlYXRlVmFsaWRhdGlvbk1lc3NhZ2VQcm9ibGVtKGRvY3VtZW50LCBjdXN0b21UYWcsIG1lc3NhZ2VzW2ldLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCWlmIChjcmVhdGVkUHJvYmxlbSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlwcm9ibGVtcy5hZGQoY3JlYXRlZFByb2JsZW0pOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlPYmplY3QgY3JlYXRlZFByb2JsZW0gPSBjcmVhdGVKU1BQcm9ibGVtKGRvY3VtZW50LCBjdXN0b21UYWcsIElKU1BQcm9ibGVtLlRFSUNsYXNzTWlzYywgSlNQQ29yZU1lc3NhZ2VzLlRhZ2xpYkhlbHBlcl8yLCB0ZWlDbGFzc25hbWUsIHRydWUpOwotCQkJCQlpZiAoY3JlYXRlZFByb2JsZW0gIT0gbnVsbCkgewotCQkJCQkJcHJvYmxlbXMuYWRkKGNyZWF0ZWRQcm9ibGVtKTsKLQkJCQkJfQotCQkJCQkvLyB0aGlzIGlzIDNyZCBwYXJ0eSBjb2RlLCBuZWVkIHRvIGNhdGNoIGFsbCBleGNlcHRpb25zCi0JCQkJCWlmIChERUJVRykgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgdGVpQ2xhc3NuYW1lICsgIiBpcyBub3QgYSBzdWJjbGFzcyBvZiBUYXhFeHRyYUluZm8iKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL3RoZSBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQgc28gYWRkIGl0IHRvIHRoZSBjYWNoZQotCQkJZk5vdEZvdW5kQ2xhc3Nlcy5hZGQodGVpQ2xhc3NuYW1lKTsKLQotCQkJT2JqZWN0IGNyZWF0ZWRQcm9ibGVtID0gY3JlYXRlSlNQUHJvYmxlbShkb2N1bWVudCwgY3VzdG9tVGFnLCBJSlNQUHJvYmxlbS5URUlDbGFzc05vdEZvdW5kLCBKU1BDb3JlTWVzc2FnZXMuVGFnbGliSGVscGVyXzAsIHRlaUNsYXNzbmFtZSwgdHJ1ZSk7Ci0JCQlpZiAoY3JlYXRlZFByb2JsZW0gIT0gbnVsbCkgewotCQkJCXByb2JsZW1zLmFkZChjcmVhdGVkUHJvYmxlbSk7Ci0JCQl9Ci0JCQkvLyBURUkgY2xhc3Mgd2Fzbid0IG9uIGJ1aWxkIHBhdGgKLQkJCWlmIChERUJVRykKLQkJCQlsb2dFeGNlcHRpb24odGVpQ2xhc3NuYW1lLCBlKTsKLQkJfQotCQljYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlPYmplY3QgY3JlYXRlZFByb2JsZW0gPSBjcmVhdGVKU1BQcm9ibGVtKGRvY3VtZW50LCBjdXN0b21UYWcsIElKU1BQcm9ibGVtLlRFSUNsYXNzTm90SW5zdGFudGlhdGVkLCBKU1BDb3JlTWVzc2FnZXMuVGFnbGliSGVscGVyXzEsIHRlaUNsYXNzbmFtZSwgdHJ1ZSk7Ci0JCQlpZiAoY3JlYXRlZFByb2JsZW0gIT0gbnVsbCkgewotCQkJCXByb2JsZW1zLmFkZChjcmVhdGVkUHJvYmxlbSk7Ci0JCQl9Ci0JCQkvLyBURUkgY2xhc3MgY291bGRuJ3QgYmUgaW5zdGFudGlhdGVkCi0JCQlpZiAoREVCVUcpCi0JCQkJbG9nRXhjZXB0aW9uKHRlaUNsYXNzbmFtZSwgZSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJaWYgKERFQlVHKQotCQkJCWxvZ0V4Y2VwdGlvbih0ZWlDbGFzc25hbWUsIGUpOwotCQl9Ci0JCS8vIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkvLyAvLyBURUkgY2xhc3Mgd2Fzbid0IHJlYWxseSBhIHN1YmNsYXNzIG9mIFRhZ0V4dHJhSW5mbwotCQkvLyBpZiAoREVCVUcpCi0JCS8vIGxvZ0V4Y2VwdGlvbih0ZWlDbGFzc25hbWUsIGUpOwotCQkvLyB9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJT2JqZWN0IGNyZWF0ZWRQcm9ibGVtID0gY3JlYXRlSlNQUHJvYmxlbShkb2N1bWVudCwgY3VzdG9tVGFnLCBJSlNQUHJvYmxlbS5URUlDbGFzc01pc2MsIEpTUENvcmVNZXNzYWdlcy5UYWdsaWJIZWxwZXJfMiwgdGVpQ2xhc3NuYW1lLCB0cnVlKTsKLQkJCWlmIChjcmVhdGVkUHJvYmxlbSAhPSBudWxsKSB7Ci0JCQkJcHJvYmxlbXMuYWRkKGNyZWF0ZWRQcm9ibGVtKTsKLQkJCX0KLQkJCS8vIHRoaXMgaXMgM3JkIHBhcnR5IGNvZGUsIG5lZWQgdG8gY2F0Y2ggYWxsIGV4Y2VwdGlvbnMKLQkJCWlmIChERUJVRykKLQkJCQlsb2dFeGNlcHRpb24odGVpQ2xhc3NuYW1lLCBlKTsKLQkJfQotCQljYXRjaCAoRXJyb3IgZSkgewotCQkJLy8gdGhpcyBpcyAzcmQgcGFydHkgY29kZSwgbmVlZCB0byBjYXRjaCBhbGwgZXJyb3JzCi0JCQlPYmplY3QgY3JlYXRlZFByb2JsZW0gPSBjcmVhdGVKU1BQcm9ibGVtKGRvY3VtZW50LCBjdXN0b21UYWcsIElKU1BQcm9ibGVtLlRFSUNsYXNzTm90SW5zdGFudGlhdGVkLCBKU1BDb3JlTWVzc2FnZXMuVGFnbGliSGVscGVyXzEsIHRlaUNsYXNzbmFtZSwgdHJ1ZSk7Ci0JCQlpZiAoY3JlYXRlZFByb2JsZW0gIT0gbnVsbCkgewotCQkJCXByb2JsZW1zLmFkZChjcmVhdGVkUHJvYmxlbSk7Ci0JCQl9Ci0JCQlpZiAoREVCVUcpCi0JCQkJbG9nRXhjZXB0aW9uKHRlaUNsYXNzbmFtZSwgZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvbGRMb2FkZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGN1c3RvbVRhZwotCSAqIEBwYXJhbSB0ZWlDbGFzcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBjcmVhdGVKU1BQcm9ibGVtKGZpbmFsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIGZpbmFsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjdXN0b21UYWcsIGZpbmFsIGludCBwcm9ibGVtSUQsIGZpbmFsIFN0cmluZyBtZXNzYWdlS2V5LCBmaW5hbCBTdHJpbmcgYXJndW1lbnQsIGJvb2xlYW4gcHJlZmVyVmFycykgewotCQlmaW5hbCBTdHJpbmcgdGFnbmFtZSA9IGN1c3RvbVRhZy5nZXRUZXh0KGN1c3RvbVRhZy5nZXRSZWdpb25zKCkuZ2V0KDEpKTsKLQotCQlmaW5hbCBpbnQgc3RhcnQ7Ci0JCWlmIChjdXN0b21UYWcuZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiAxKSB7Ci0JCQlzdGFydCA9IGN1c3RvbVRhZy5nZXRTdGFydE9mZnNldChjdXN0b21UYWcuZ2V0UmVnaW9ucygpLmdldCgxKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdGFydCA9IGN1c3RvbVRhZy5nZXRTdGFydE9mZnNldCgpOwotCQl9Ci0KLQkJZmluYWwgaW50IGVuZDsKLQkJaWYgKGN1c3RvbVRhZy5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDEpIHsKLQkJCWVuZCA9IGN1c3RvbVRhZy5nZXRUZXh0RW5kT2Zmc2V0KGN1c3RvbVRhZy5nZXRSZWdpb25zKCkuZ2V0KDEpKSAtIDE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllbmQgPSBjdXN0b21UYWcuZ2V0VGV4dEVuZE9mZnNldCgpIC0gMTsKLQkJfQotCi0JCWZpbmFsIGludCBsaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQotCQlmaW5hbCBjaGFyW10gbmFtZTsKLQkJSVBhdGggbG9jYXRpb24gPSBUYWdsaWJDb250cm9sbGVyLmdldExvY2F0aW9uKGRvY3VtZW50KTsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCW5hbWUgPSBuZXcgY2hhclswXTsKLQkJfQotCQllbHNlIHsKLQkJCW5hbWUgPSBsb2NhdGlvbi50b1N0cmluZygpLnRvQ2hhckFycmF5KCk7Ci0JCX0KLQotCQkvKgotCQkgKiBOb3RlOiB0aGVzZSBwcm9ibGVtcyB3b3VsZCByZXN1bHQgaW4gdHJhbnNsYXRpb24gZXJyb3JzIG9uIHRoZQotCQkgKiBzZXJ2ZXIsIHNvIHRoZSBzZXZlcml0eSBpcyBub3QgbWVhbnQgdG8gYmUgY29udHJvbGxhYmxlCi0JCSAqLwotCQlyZXR1cm4gbmV3IElKU1BQcm9ibGVtKCkgewotCQkJcHVibGljIHZvaWQgc2V0U291cmNlU3RhcnQoaW50IHNvdXJjZVN0YXJ0KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFNvdXJjZUxpbmVOdW1iZXIoaW50IGxpbmVOdW1iZXIpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0U291cmNlRW5kKGludCBzb3VyY2VFbmQpIHsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNXYXJuaW5nKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRTb3VyY2VTdGFydCgpIHsKLQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0U291cmNlTGluZU51bWJlcigpIHsKLQkJCQlyZXR1cm4gbGluZTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRTb3VyY2VFbmQoKSB7Ci0JCQkJcmV0dXJuIGVuZDsKLQkJCX0KLQotCQkJcHVibGljIGNoYXJbXSBnZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCkgewotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2VLZXksIG5ldyBTdHJpbmdbXXt0YWduYW1lLCBhcmd1bWVudH0pOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldElEKCkgewotCQkJCXJldHVybiBwcm9ibGVtSUQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRBcmd1bWVudHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0RUlEKCkgewotCQkJCXJldHVybiBwcm9ibGVtSUQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGN1c3RvbVRhZwotCSAqIEBwYXJhbSB2YWxpZGF0aW9uTWVzc2FnZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uTWVzc2FnZVByb2JsZW0oZmluYWwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgZmluYWwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGN1c3RvbVRhZywgZmluYWwgU3RyaW5nIHZhbGlkYXRpb25NZXNzYWdlKSB7Ci0JCWZpbmFsIGludCBzdGFydDsKLQkJaWYgKGN1c3RvbVRhZy5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDMpIHsKLQkJCXN0YXJ0ID0gY3VzdG9tVGFnLmdldFN0YXJ0T2Zmc2V0KGN1c3RvbVRhZy5nZXRSZWdpb25zKCkuZ2V0KDIpKTsKLQkJfQotCQllbHNlIGlmIChjdXN0b21UYWcuZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiAxKSB7Ci0JCQlzdGFydCA9IGN1c3RvbVRhZy5nZXRTdGFydE9mZnNldChjdXN0b21UYWcuZ2V0UmVnaW9ucygpLmdldCgxKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdGFydCA9IGN1c3RvbVRhZy5nZXRTdGFydE9mZnNldCgpOwotCQl9Ci0KLQkJZmluYWwgaW50IGVuZDsKLQkJaWYgKGN1c3RvbVRhZy5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDMpIHsKLQkJCWVuZCA9IGN1c3RvbVRhZy5nZXRUZXh0RW5kT2Zmc2V0KGN1c3RvbVRhZy5nZXRSZWdpb25zKCkuZ2V0KGN1c3RvbVRhZy5nZXROdW1iZXJPZlJlZ2lvbnMoKSAtIDIpKSAtIDE7Ci0JCX0KLQkJZWxzZSBpZiAoY3VzdG9tVGFnLmdldE51bWJlck9mUmVnaW9ucygpID4gMSkgewotCQkJZW5kID0gY3VzdG9tVGFnLmdldFRleHRFbmRPZmZzZXQoY3VzdG9tVGFnLmdldFJlZ2lvbnMoKS5nZXQoMSkpIC0gMTsKLQkJfQotCQllbHNlIHsKLQkJCWVuZCA9IGN1c3RvbVRhZy5nZXRUZXh0RW5kT2Zmc2V0KCk7Ci0JCX0KLQotCQlmaW5hbCBpbnQgbGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0KLQkJZmluYWwgY2hhcltdIG5hbWU7Ci0JCUlQYXRoIGxvY2F0aW9uID0gVGFnbGliQ29udHJvbGxlci5nZXRMb2NhdGlvbihkb2N1bWVudCk7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQluYW1lID0gbmV3IGNoYXJbMF07Ci0JCX0KLQkJZWxzZSB7Ci0JCQluYW1lID0gbG9jYXRpb24udG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBJSlNQUHJvYmxlbSgpIHsKLQkJCXB1YmxpYyB2b2lkIHNldFNvdXJjZVN0YXJ0KGludCBzb3VyY2VTdGFydCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VMaW5lTnVtYmVyKGludCBsaW5lTnVtYmVyKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFNvdXJjZUVuZChpbnQgc291cmNlRW5kKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzV2FybmluZygpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0U291cmNlU3RhcnQoKSB7Ci0JCQkJcmV0dXJuIHN0YXJ0OwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFNvdXJjZUxpbmVOdW1iZXIoKSB7Ci0JCQkJcmV0dXJuIGxpbmU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0U291cmNlRW5kKCkgewotCQkJCXJldHVybiBlbmQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBjaGFyW10gZ2V0T3JpZ2luYXRpbmdGaWxlTmFtZSgpIHsKLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQkJCXJldHVybiB2YWxpZGF0aW9uTWVzc2FnZTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRJRCgpIHsKLQkJCQlyZXR1cm4gZ2V0RUlEKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRBcmd1bWVudHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0RUlEKCkgewotCQkJCXJldHVybiBJSlNQUHJvYmxlbS5URUlWYWxpZGF0aW9uTWVzc2FnZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVjbAotCSAqIEByZXR1cm4gdGhlIFRhZ0luZm8gZm9yIHRoZSBUTERFTGVtZW50RGVjbGFyYXRpb24gaWYgdGhlIGRlY2xhcmF0aW9uIGlzCi0JICogICAgICAgICB2YWxpZCwgb3RoZXJ3aXNlIG51bGwKLQkgKi8KLQlwcml2YXRlIFRhZ0luZm8gZ2V0VGFnSW5mbyhmaW5hbCBUTERFbGVtZW50RGVjbGFyYXRpb24gZGVjbCwgVGFnRXh0cmFJbmZvIHRlaSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotCi0JCVRhZ0xpYnJhcnlJbmZvIGxpYkluZm8gPSBuZXcgVGFnTGlicmFyeUluZm9JbXBsKHByZWZpeCwgdXJpLCBkZWNsKTsKLQotCQlDTU5hbWVkTm9kZU1hcCBhdHRycyA9IGRlY2wuZ2V0QXR0cmlidXRlcygpOwotCQlUYWdBdHRyaWJ1dGVJbmZvW10gYXR0ckluZm9zID0gbmV3IFRhZ0F0dHJpYnV0ZUluZm9bYXR0cnMuZ2V0TGVuZ3RoKCldOwotCQlUTERBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJCAKLQotCQkvLyBnZXQgdGFnIGF0dHJpYnV0ZSBpbmZvcwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWF0dHIgPSAoVExEQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJzLml0ZW0oaSk7Ci0JCQl0eXBlID0gYXR0ci5nZXRUeXBlKCk7Ci0JCQkvLyBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIGlzIFN0cmluZwotCQkJaWYgKGF0dHIuZ2V0VHlwZSgpID09IG51bGwgfHwgYXR0ci5nZXRUeXBlKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJCAKLQkJCQl0eXBlID0gImphdmEubGFuZy5TdHJpbmciOyAvLyROT04tTkxTLTEkIAotCQkJYXR0ckluZm9zW2ldID0gbmV3IFRhZ0F0dHJpYnV0ZUluZm8oYXR0ci5nZXRBdHRyTmFtZSgpLCBhdHRyLmlzUmVxdWlyZWQoKSwgdHlwZSwgZmFsc2UpOwotCQl9Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBkZWNsLmdldE5vZGVOYW1lKCk7Ci0JCVN0cmluZyB0YWdDbGFzcyA9IGRlY2wuZ2V0VGFnY2xhc3MoKTsKLQkJU3RyaW5nIGJvZHlDb250ZW50ID0gZGVjbC5nZXRCb2R5Y29udGVudCgpOwotCQlpZiAodGFnTmFtZSAhPSBudWxsICYmIHRhZ0NsYXNzICE9IG51bGwgJiYgYm9keUNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgVGFnSW5mbyh0YWdOYW1lLCB0YWdDbGFzcywgYm9keUNvbnRlbnQsIGRlY2wuZ2V0SW5mbygpLCBsaWJJbmZvLCB0ZWksIGF0dHJJbmZvcyk7Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyB0ZWlDbGFzc25hbWUsIFRocm93YWJsZSBlKSB7Ci0KLQkJU3RyaW5nIG1lc3NhZ2UgPSAidGVpQ2xhc3NuYW1lOiBbIjsgLy8kTk9OLU5MUy0xJCAKLQkJaWYgKHRlaUNsYXNzbmFtZSAhPSBudWxsKQotCQkJbWVzc2FnZSArPSB0ZWlDbGFzc25hbWU7Ci0JCW1lc3NhZ2UgKz0gIl0iOyAvLyROT04tTkxTLTEkCi0JCUxvZ2dlci5sb2dFeGNlcHRpb24obWVzc2FnZSwgZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgYXR0cmlidXRlIC0+IHZhbHVlIHBhaXJzIGZvciB0aGUgdGFnIGluIGEgSGFzaHRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBjdXN0b21UYWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBIYXNodGFibGUgZXh0cmFjdFRhZ0RhdGEoSVRleHRSZWdpb25Db2xsZWN0aW9uIGN1c3RvbVRhZykgewotCQlIYXNodGFibGUgdGFnRGF0YVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGN1c3RvbVRhZy5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgYXR0ck5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDI7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkvLyBjaGVjayBpZiBhdHRyIG5hbWUKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlhdHRyTmFtZSA9IGN1c3RvbVRhZy5nZXRUZXh0KHIpOwotCQkJCS8vIGNoZWNrIGVxdWFscyBpcyBuZXh0IHJlZ2lvbgotCQkJCWlmIChyZWdpb25zLnNpemUoKSA+ICsraSkgewotCQkJCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyAmJiByZWdpb25zLnNpemUoKSA+ICsraSkgewotCQkJCQkJLy8gZ2V0IGF0dHIgdmFsdWUKLQkJCQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQkJLy8gYXR0cmlidXRlcyBpbiBvdXIgZG9jdW1lbnQgaGF2ZSBxdW90ZXMsIHNvIHdlCi0JCQkJCQkJLy8gbmVlZCB0byBzdHJpcCB0aGVtCi0JCQkJCQkJYXR0clZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoY3VzdG9tVGFnLmdldFRleHQocikpOwotCQkJCQkJCXRhZ0RhdGFUYWJsZS5wdXQoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQl0YWdEYXRhVGFibGUucHV0KCJqc3A6aWQiLCBjdXN0b21UYWcuZ2V0VGV4dChyZWdpb25zLmdldCgxKSkgKyAiXyIgKyBjdXN0b21UYWcuZ2V0U3RhcnRPZmZzZXQoKSk7IC8vJE5PTi1OTFMtMSQgCi0KLQkJcmV0dXJuIHRhZ0RhdGFUYWJsZTsKLQl9Ci0KLQlwcml2YXRlIENsYXNzTG9hZGVyIGdldENsYXNzbG9hZGVyKCkgewotCQlpZiAoZkxvYWRlciA9PSBudWxsKSB7Ci0JCQlmTG9hZGVyID0gbmV3IEJ1aWxkUGF0aENsYXNzTG9hZGVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLCBmSmF2YVByb2plY3QpOwotCQl9Ci0JCXJldHVybiBmTG9hZGVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZk1vZGVsUXVlcnkuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeShJRG9jdW1lbnQgZG9jKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlNb2RlbFF1ZXJ5IG1xID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQkJbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBtcTsKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkZpbGUuCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0KLQkJcmV0dXJuIGZQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBUaGUgZkZpbGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcCkgewotCQlmUHJvamVjdCA9IHA7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwKTsKLQkJaWYgKGphdmFQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQlmSmF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVRhZ0NsYXNzKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjdXN0b21UYWcsIFRMREVsZW1lbnREZWNsYXJhdGlvbiBkZWNsLCBMaXN0IHByb2JsZW1zKSB7Ci0JCS8vIHNraXAgaWYgZnJvbSBhIHRhZyBmaWxlCi0JCWlmIChUTERFbGVtZW50RGVjbGFyYXRpb24uU09VUkNFX1RBR19GSUxFLmVxdWFscyhkZWNsLmdldFByb3BlcnR5KFRMREVsZW1lbnREZWNsYXJhdGlvbi5UQUdfU09VUkNFKSkgfHwgZkphdmFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyB0YWdDbGFzc25hbWUgPSBkZWNsLmdldFRhZ2NsYXNzKCk7Ci0JCU9iamVjdCB0YWdDbGFzcyA9IG51bGw7Ci0JCWlmICh0YWdDbGFzc25hbWUgIT0gbnVsbCAmJiB0YWdDbGFzc25hbWUubGVuZ3RoKCkgPiAwICYmIGZKYXZhUHJvamVjdC5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQl0YWdDbGFzcyA9IGZKYXZhUHJvamVjdC5maW5kVHlwZSh0YWdDbGFzc25hbWUpOwotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlpZiAodGFnQ2xhc3MgPT0gbnVsbCkgewotCQkJT2JqZWN0IGNyZWF0ZWRQcm9ibGVtID0gY3JlYXRlSlNQUHJvYmxlbShkb2N1bWVudCwgY3VzdG9tVGFnLCBJSlNQUHJvYmxlbS5UYWdDbGFzc05vdEZvdW5kLCBKU1BDb3JlTWVzc2FnZXMuVGFnbGliSGVscGVyXzMsIHRhZ0NsYXNzbmFtZSwgZmFsc2UpOwotCQkJaWYgKGNyZWF0ZWRQcm9ibGVtICE9IG51bGwpIHsKLQkJCQlwcm9ibGVtcy5hZGQoY3JlYXRlZFByb2JsZW0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZkxvYWRlciA9IG51bGw7Ci0JCWZKYXZhUHJvamVjdCA9IG51bGw7Ci0JCWZQcm9qZWN0ID0gbnVsbDsKLQkJZk5vdEZvdW5kQ2xhc3NlcyA9IG51bGw7Ci0JCWZDbGFzc01hcCA9IG51bGw7Ci0JCWZNZW1vcnlMaXN0ZW5lci5kaXNjb25uZWN0KCk7Ci0JCWZNZW1vcnlMaXN0ZW5lciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW52YWxpZGF0ZUNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJZkNsYXNzTWFwLnJlbW92ZShjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPkEge0BsaW5rIEFic3RyYWN0TWVtb3J5TGlzdGVuZXJ9IHRoYXQgY2xlYXJzIHRoZSB7QGxpbmsgI2ZOb3RGb3VuZENsYXNzZXN9IGNhY2hlCi0JICogd2hlbmV2ZXIgc3BlY2lmaWMgbWVtb3J5IGV2ZW50cyBhcmUgcmVjZWl2ZWQuPC9wPgotCSAqIAotCSAqIDxwPkV2ZW50czoKLQkgKiA8dWw+Ci0JICogPGxpPntAbGluayBBYnN0cmFjdE1lbW9yeUxpc3RlbmVyI1NFVl9OT1JNQUx9PC9saT4KLQkgKiA8bGk+e0BsaW5rIEFic3RyYWN0TWVtb3J5TGlzdGVuZXIjU0VWX1NFUklPVVN9PC9saT4KLQkgKiA8bGk+e0BsaW5rIEFic3RyYWN0TWVtb3J5TGlzdGVuZXIjU0VWX0NSSVRJQ0FMfTwvbGk+Ci0JICogPC91bD4KLQkgKiA8L3A+Ci0JICovCi0JcHJpdmF0ZSBjbGFzcyBNZW1vcnlMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0TWVtb3J5TGlzdGVuZXIgewotCQkvKioKLQkJICogPHA+Q29uc3RydWN0b3IgY2F1c2VzIHRoaXMgbGlzdGVuZXIgdG8gbGlzdGVuIGZvciBzcGVjaWZpYyBtZW1vcnkgZXZlbnRzLjwvcD4KLQkJICogPHA+RXZlbnRzOgotCQkgKiA8dWw+Ci0JCSAqIDxsaT57QGxpbmsgQWJzdHJhY3RNZW1vcnlMaXN0ZW5lciNTRVZfTk9STUFMfTwvbGk+Ci0JCSAqIDxsaT57QGxpbmsgQWJzdHJhY3RNZW1vcnlMaXN0ZW5lciNTRVZfU0VSSU9VU308L2xpPgotCQkgKiA8bGk+e0BsaW5rIEFic3RyYWN0TWVtb3J5TGlzdGVuZXIjU0VWX0NSSVRJQ0FMfTwvbGk+Ci0JCSAqIDwvdWw+Ci0JCSAqIDwvcD4KLQkJICovCi0JCU1lbW9yeUxpc3RlbmVyKCkgewotCQkJc3VwZXIobmV3IFN0cmluZ1tdIHsgU0VWX05PUk1BTCwgU0VWX1NFUklPVVMsIFNFVl9DUklUSUNBTCB9KTsKLQkJfQotCi0JCS8qKgotCQkgKiBPbiBhbnkgbWVtb3J5IGV2ZW50IHdlIGhhbmRsZSBjbGVhciBvdXQgdGhlIHByb2plY3QgZGVzY3JpcHRpb25zCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkFic3RyYWN0TWVtb3J5TGlzdGVuZXIjaGFuZGxlTWVtb3J5RXZlbnQob3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZU1lbW9yeUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkvKiBpZiBydW5uaW5nIGxvdyBvbiBtZW1vcnkgdGhlbiB0aGlzIGNhY2hlIGNhbiBiZSBjbGVhcmVkCi0JCQkgKiBhbmQgcmVidWlsdCBhdCB0aGUgZXhwZW5zZSBvZiBwcm9jZXNzaW5nIHRpbWUKLQkJCSAqLwotCQkJZk5vdEZvdW5kQ2xhc3Nlcy5jbGVhcigpOwotCQkJZkNsYXNzTWFwLmNsZWFyKCk7Ci0JCX0KLQotCX0KLQotCWNsYXNzIFRhZ0xpYnJhcnlJbmZvSW1wbCBleHRlbmRzIFRhZ0xpYnJhcnlJbmZvIHsKLQkJVExERWxlbWVudERlY2xhcmF0aW9uIGRlY2w7Ci0KLQkJVGFnTGlicmFyeUluZm9JbXBsKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIFRMREVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKXsKLQkJCXN1cGVyKHByZWZpeCwgdXJpKTsKLQkJCXRoaXMuZGVjbCA9IGRlY2w7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCWlmIChQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpKQotCQkJCW5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIHN1cGVyLmdldFVSSSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRQcmVmaXhTdHJpbmcoKSB7Ci0JCQlpZiAoUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSkKLQkJCQluZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBzdXBlci5nZXRQcmVmaXhTdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotCQkJcmV0dXJuICgoVExERG9jdW1lbnQpZGVjbC5nZXRPd25lckRvY3VtZW50KCkpLmdldFNob3J0bmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRSZWxpYWJsZVVSTigpIHsKLQkJCXJldHVybiAoKFRMRERvY3VtZW50KWRlY2wuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRVcmkoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb1N0cmluZygpIHsKLQkJCXJldHVybiAoKFRMRERvY3VtZW50KWRlY2wuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRJbmZvKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVkVmVyc2lvbigpIHsKLQkJCXJldHVybiAoKFRMRERvY3VtZW50KWRlY2wuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRKc3B2ZXJzaW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFnSW5mb1tdIGdldFRhZ3MoKSB7Ci0JCQlpZiAoUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSkKLQkJCQluZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBzdXBlci5nZXRUYWdzKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFnRmlsZUluZm9bXSBnZXRUYWdGaWxlcygpIHsKLQkJCWlmIChQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpKQotCQkJCW5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIHN1cGVyLmdldFRhZ0ZpbGVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFnSW5mbyBnZXRUYWcoU3RyaW5nIHNob3J0bmFtZSkgewotCQkJaWYgKFBsYXRmb3JtLmluRGVidWdNb2RlKCkpCi0JCQkJbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGFnKHNob3J0bmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgVGFnRmlsZUluZm8gZ2V0VGFnRmlsZShTdHJpbmcgc2hvcnRuYW1lKSB7Ci0JCQlpZiAoUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSkKLQkJCQluZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBzdXBlci5nZXRUYWdGaWxlKHNob3J0bmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgRnVuY3Rpb25JbmZvW10gZ2V0RnVuY3Rpb25zKCkgewotCQkJaWYgKFBsYXRmb3JtLmluRGVidWdNb2RlKCkpCi0JCQkJbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RnVuY3Rpb25zKCk7Ci0JCX0KLQotCQlwdWJsaWMgRnVuY3Rpb25JbmZvIGdldEZ1bmN0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCQluZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24obmFtZSkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RnVuY3Rpb24obmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgVGFnTGlicmFyeUluZm9bXSBnZXRUYWdMaWJyYXJ5SW5mb3MoKSAgewotCQkJaWYgKFBsYXRmb3JtLmluRGVidWdNb2RlKCkpCi0JCQkJbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbmV3IFRhZ0xpYnJhcnlJbmZvW10geyB0aGlzIH07Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXJDYWNoZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1ZWFkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXJDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBBIHNpbXBsZSBjYWNoZSBmb3IgVGFnbGliSGVscGVycyB0byBhdm9pZCBleGNlc3NpdmUgY3JlYXRpb24gb2YgVGFnbGliQ2xhc3NMb2FkZXJzCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1jbGFzcyBUYWdsaWJIZWxwZXJDYWNoZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGFnbGlidmFycyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIERFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlbnRyeSBmb3IgdGhlIGNhY2hlIChwcm9qZWN0UGF0aCBzdHJpbmcgJiBUYWdsaWJIZWxwZXIpCi0gICAgICovCi0gICAgY2xhc3MgRW50cnkgewotICAgICAgICBwcml2YXRlIFRhZ2xpYkhlbHBlciBmSGVscGVyOwotICAgICAgICBwcml2YXRlIFN0cmluZyBmUHJvamVjdE5hbWU7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgRW50cnkoU3RyaW5nIHByb2plY3ROYW1lLCBUYWdsaWJIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgICAgICBzZXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBzZXRIZWxwZXIoaGVscGVyKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgVGFnbGliSGVscGVyIGdldEhlbHBlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBmSGVscGVyOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldEhlbHBlcihUYWdsaWJIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgICAgICBmSGVscGVyID0gaGVscGVyOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZlByb2plY3ROYW1lOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICAgICAgZlByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiVGFnbGliIEhlbHBlciBFbnRyeSBbIiArIGdldFByb2plY3ROYW1lKCkgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdCBmSGVscGVyczsKLSAgICAvLyBtYXggc2l6ZSBmb3IgdGhlIGNhY2hlCi0gICAgcHJpdmF0ZSBpbnQgTUFYX1NJWkU7Ci0KLSAgICAvKioKLSAgICAgKiBOb3QgaW50ZW5kZWQgdG8gYmUgbGFyZ2Ugc2luY2UgdW5kZXJseWluZyBpbXBsbWVtZW50YXRpb24gdXNlcwotICAgICAqIGEgTGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGFnbGliSGVscGVyQ2FjaGUoaW50IHNpemUpIHsKLSAgICAgICAgTUFYX1NJWkUgPSBzaXplOwotICAgICAgICBmSGVscGVycyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdChNQVhfU0laRSkpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvamVjdFBhdGgKLSAgICAgKiBAcGFyYW0gZgotICAgICAqIEBwYXJhbSBtcQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIFRhZ2xpYkhlbHBlciBnZXRIZWxwZXIoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBUYWdsaWJIZWxwZXIgaGVscGVyID0gbnVsbDsKLSAgICAgICAgRW50cnkgZW50cnkgPSBudWxsOwotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0LmdldE5hbWUoKTsKLSAgICAgICAgaW50IHNpemUgPSBmSGVscGVycy5zaXplKCk7Ci0gICAgICAgIC8vIGZpc3QgY2hlY2sgZm9yIGV4aXN0aW5nCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGVudHJ5ID0gKEVudHJ5KWZIZWxwZXJzLmdldChpKTsKLSAgICAgICAgICAgIGlmKGVudHJ5LmdldFByb2plY3ROYW1lKCkuZXF1YWxzKHByb2plY3ROYW1lKSkgewotICAgICAgICAgICAgICAgIC8vIGV4aXN0cwotICAgICAgICAgICAgICAgIGhlbHBlciA9IGVudHJ5LmdldEhlbHBlcigpOwotICAgICAgICAgICAgICAgIC8vIG9ubHkgbW92ZSB0byBmcm9udCBpZiBpdCdzIG5vdCB0aGUgZmlyc3QgZW50cnkKLSAgICAgICAgICAgICAgICBpZihpPjApIHsKLSAgICAgICAgICAgICAgICAgICAgZkhlbHBlcnMucmVtb3ZlKGVudHJ5KTsKLQkgICAgICAgICAgICAgICAgZkhlbHBlcnMuYWRkKDEsIGVudHJ5KTsKLQkgICAgICAgICAgICAgICAgaWYoREVCVUcpIHsKLQkgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLklORk8sICIoLT4pIFRhZ2xpYkhlbHBlckNhY2hlIG1vdmVkOiAiICsgZW50cnkgKyAiIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkgICAgICAgICAgICAgICAgICAgIHByaW50Q2FjaGVDb250ZW50cygpOwotCSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGRpZG4ndCBleGlzdAotICAgICAgICBpZihoZWxwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaGVscGVyID0gY3JlYXRlTmV3SGVscGVyKHByb2plY3ROYW1lLCBwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVscGVyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHJvamVjdE5hbWUKLSAgICAgKiBAcGFyYW0gZgotICAgICAqIEBwYXJhbSBtcQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRhZ2xpYkhlbHBlciBjcmVhdGVOZXdIZWxwZXIoU3RyaW5nIHByb2plY3ROYW1lLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0KLSAgICAgICAgVGFnbGliSGVscGVyIGhlbHBlcjsKLSAgICAgICAgLy8gY3JlYXRlCi0gICAgICAgIGhlbHBlciA9IG5ldyBUYWdsaWJIZWxwZXIocHJvamVjdCk7Ci0gICAgICAgIEVudHJ5IG5ld0VudHJ5ID0gbmV3IEVudHJ5KHByb2plY3ROYW1lLCBoZWxwZXIpOwotICAgICAgICBmSGVscGVycy5hZGQoMCwgbmV3RW50cnkpOwotICAgICAgICBpZihERUJVRykgewotICAgICAgICAJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIigrKSBUYWdsaWJIZWxwZXJDYWNoZSBhZGRlZDogIiArIG5ld0VudHJ5KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcHJpbnRDYWNoZUNvbnRlbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoZkhlbHBlcnMuc2l6ZSgpID4gTUFYX1NJWkUpIHsKLSAgICAgICAgICAgIC8vIG9uZSB0b28gbWFueSwgcmVtb3ZlIGxhc3QKLSAgICAgICAgCUVudHJ5IHJlbW92ZWQgPSAoRW50cnkpIGZIZWxwZXJzLnJlbW92ZShmSGVscGVycy5zaXplKCktMSk7Ci0gICAgICAgIAlyZW1vdmVkLmdldEhlbHBlcigpLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGlmKERFQlVHKSB7Ci0gICAgICAgICAgICAJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIigtKSBUYWdsaWJIZWxwZXJDYWNoZSByZW1vdmVkOiAiICsgcmVtb3ZlZC5nZXRQcm9qZWN0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHByaW50Q2FjaGVDb250ZW50cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWxwZXI7Ci0gICAgfQotIAotICAgIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVIZWxwZXIoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIEVudHJ5IGVudHJ5ID0gbnVsbDsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBmSGVscGVycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZShpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGVudHJ5ID0gKEVudHJ5KWl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmKGVudHJ5LmdldFByb2plY3ROYW1lKCkuZXF1YWxzKHByb2plY3ROYW1lKSkgewotICAgICAgICAgICAgCWVudHJ5LmdldEhlbHBlcigpLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICBmSGVscGVycy5yZW1vdmUoZW50cnkpOwotICAgICAgICAgICAgICAgIGlmKERFQlVHKSB7IAotICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiKC0pIFRhZ2xpYkhlbHBlckNhY2hlIHJlbW92ZWQ6ICIgKyBlbnRyeSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRDYWNoZUNvbnRlbnRzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIGludmFsaWRhdGUoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgCUVudHJ5IGVudHJ5ID0gbnVsbDsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBmSGVscGVycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZShpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGVudHJ5ID0gKEVudHJ5KWl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmKGVudHJ5LmdldFByb2plY3ROYW1lKCkuZXF1YWxzKHByb2plY3ROYW1lKSkgewotICAgICAgICAgICAgCWVudHJ5LmdldEhlbHBlcigpLmludmFsaWRhdGVDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGlmKERFQlVHKSB7IAotICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiKC0pIFRhZ2xpYkhlbHBlckNhY2hlIGludmFsaWRhdGVkOiAiICsgY2xhc3NOYW1lKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBwcmludENhY2hlQ29udGVudHMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHByaW50Q2FjaGVDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGRlYnVnU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBkZWJ1Z1N0cmluZy5hcHBlbmQoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZWJ1Z1N0cmluZy5hcHBlbmQoIlxuY2FjaGUgY29udGVudHM6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZIZWxwZXJzLnNpemUoKTsgaSsrKQkKLSAgICAgICAgCWRlYnVnU3RyaW5nLmFwcGVuZCgiXG4gLSIgKyBpICsgIi0gIiArIGZIZWxwZXJzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBkZWJ1Z1N0cmluZy5hcHBlbmQoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBkZWJ1Z1N0cmluZy50b1N0cmluZygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXJNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYjI2ZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci0KLS8qKgotICogTWFuYWdlcyBjcmVhdGlvbiBhbmQgY2FjaGluZyAob3JkZXJlZCBNUlUpIG9mIFRhZ2xpYkhlbHBlcnMuCi0gKiBSZW1vdmVzIGhlbHBlcnMgd2hlbiB0aGVpciBjbGFzc3BhdGggY2hhbmdlcyAoc28gdGhleSBhcmUgcmVidWlsdCkuCi0gKiBUaGVyZSBpcyBvbmUgaGVscGVyIHBlciBwcm9qZWN0ICh3aXRoIGEgc3BlY2lmaWMgY2xhc3NwYXRoIGVudHJ5KS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYkhlbHBlck1hbmFnZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7Ci0gICAKLQotICAgIHByaXZhdGUgc3RhdGljIFRhZ2xpYkhlbHBlck1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotICAgIC8vIHVzaW5nIGEgY2FjaGUgb2YganVzdCAzIGxvYWRlcnMKLSAgICBwcml2YXRlIFRhZ2xpYkhlbHBlckNhY2hlIGZDYWNoZSA9IG5ldyBUYWdsaWJIZWxwZXJDYWNoZSgzKTsKLQotICAgIHByaXZhdGUgVGFnbGliSGVscGVyTWFuYWdlcigpIHsKLSAgICAgICAgLy8gdXNlIGluc3RhbmNlCi0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFRhZ2xpYkhlbHBlck1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmKGluc3RhbmNlID09IG51bGwpCi0gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBUYWdsaWJIZWxwZXJNYW5hZ2VyKCk7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFRhZ2xpYkhlbHBlciBnZXRUYWdsaWJIZWxwZXIoSUZpbGUgZikgewotICAgICAgICBJUHJvamVjdCBwID0gZi5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIHJldHVybiBnZXRIZWxwZXJGcm9tQ2FjaGUocCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBwcm9qZWN0UGF0aAotICAgICAqLwotICAgIHByaXZhdGUgVGFnbGliSGVscGVyIGdldEhlbHBlckZyb21DYWNoZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBmQ2FjaGUuZ2V0SGVscGVyKHByb2plY3QpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBVcGRhdGUgY2xhc3NwYXRoIGZvciBhcHByb3ByaWF0ZSBsb2FkZXIuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lciNlbGVtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50KQotICAgICAqLwotCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJLy8gaGFuZGxlIGNsYXNzcGF0aCBjaGFuZ2VzCi0JCUlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJaWYgKGRlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX01PREVMKSB7Ci0JCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoYW5nZWQgPSBkZWx0YS5nZXRDaGFuZ2VkQ2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlZC5sZW5ndGg7IGkrKykgewotCQkJCWlmICgoY2hhbmdlZFtpXS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DTEFTU1BBVEhfQ0hBTkdFRCkgIT0gMCB8fCAoY2hhbmdlZFtpXS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU9SREVSKSAhPSAwIHx8IChjaGFuZ2VkW2ldLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFU09MVkVEX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwIHx8IChjaGFuZ2VkW2ldLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1BSSU1BUllfUkVTT1VSQ0UpICE9IDApIHsKLQkJCQkJSUphdmFFbGVtZW50IHByb2ogPSBjaGFuZ2VkW2ldLmdldEVsZW1lbnQoKTsKLQkJCQkJaGFuZGxlQ2xhc3NwYXRoQ2hhbmdlKGNoYW5nZWQsIGksIHByb2opOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgewotCQkJSUphdmFFbGVtZW50RGVsdGFbXSBjaGFuZ2VkID0gZGVsdGEuZ2V0Q2hhbmdlZENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZWQubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoKGNoYW5nZWRbaV0uZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfU1VQRVJfVFlQRVMpICE9IDApIHsKLQkJCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBjaGFuZ2VkW2ldLmdldEVsZW1lbnQoKTsKLQkJCQkJaGFuZGxlU3VwZXJUeXBlQ2hhbmdlKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTdXBlclR5cGVDaGFuZ2UoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBlbGVtZW50LmdldEphdmFQcm9qZWN0KCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLQkJCWZDYWNoZS5pbnZhbGlkYXRlKHByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgKChJVHlwZSkgZWxlbWVudCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBjaGFuZ2VkCi0gICAgICogQHBhcmFtIGkKLSAgICAgKiBAcGFyYW0gcHJvagotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDbGFzc3BhdGhDaGFuZ2UoSUphdmFFbGVtZW50RGVsdGFbXSBjaGFuZ2VkLCBpbnQgaSwgSUphdmFFbGVtZW50IHByb2opIHsKLSAgICAgICAgaWYgKHByb2ouZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUKSB7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoKElKYXZhUHJvamVjdCkgcHJvaikuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCWZDYWNoZS5yZW1vdmVIZWxwZXIocHJvamVjdE5hbWUpOwotCQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliVmFyaWFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYlZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOTFjZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliVmFyaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5WYXJpYWJsZUluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLS8qKgotICogQ29udGFpbnMgaW5mbyBhYm91dCBhIFRhZ2xpYlZhcmlhYmxlOiBjbGFzc25hbWUsIHZhcmlhYmxlbmFtZS4KLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYlZhcmlhYmxlIHsKLQotCXByaXZhdGUgU3RyaW5nIGZWYXJDbGFzcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZlZhck5hbWUgPSBudWxsOwotCXByaXZhdGUgaW50IGZTY29wZTsKLQlwcml2YXRlIFN0cmluZyBmRGVzY3JpcHRpb247Ci0KLQkvKiogZml4ZWQgZW5kLW9mLWxpbmUgdmFsdWUgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFTkRMID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUX0VORCA9ICJBVF9FTkQiOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVF9CRUdJTiA9ICJBVF9CRUdJTiI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FU1RFRCA9ICJORVNURUQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTV9QUklWQVRFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNX05PTkUgPSAwOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFRhZ2xpYlZhcmlhYmxlKFN0cmluZyB2YXJDbGFzcywgU3RyaW5nIHZhck5hbWUsIGludCBzY29wZSkgewotCQlzZXRWYXJDbGFzcyh2YXJDbGFzcyk7Ci0JCXNldFZhck5hbWUodmFyTmFtZSk7Ci0JCXNldFNjb3BlKHNjb3BlKTsKLQl9Ci0KLQlwdWJsaWMgVGFnbGliVmFyaWFibGUoU3RyaW5nIHZhckNsYXNzLCBTdHJpbmcgdmFyTmFtZSwgU3RyaW5nIHNjb3BlKSB7Ci0JCXNldFZhckNsYXNzKHZhckNsYXNzKTsKLQkJc2V0VmFyTmFtZSh2YXJOYW1lKTsKLQkJc2V0U2NvcGUoc2NvcGUpOwotCX0KLQotCXB1YmxpYyBUYWdsaWJWYXJpYWJsZShTdHJpbmcgdmFyQ2xhc3MsIFN0cmluZyB2YXJOYW1lLCBTdHJpbmcgc2NvcGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzZXRWYXJDbGFzcyh2YXJDbGFzcyk7Ci0JCXNldFZhck5hbWUodmFyTmFtZSk7Ci0JCXNldFNjb3BlKHNjb3BlKTsKLQkJc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCX0KLQotCVRhZ2xpYlZhcmlhYmxlKFN0cmluZyB2YXJDbGFzcywgU3RyaW5nIHZhck5hbWUsIGludCBzY29wZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXNldFZhckNsYXNzKHZhckNsYXNzKTsKLQkJc2V0VmFyTmFtZSh2YXJOYW1lKTsKLQkJc2V0U2NvcGUoc2NvcGUpOwotCQlzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmVmFyQ2xhc3MuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRWYXJDbGFzcygpIHsKLQkJcmV0dXJuIGZWYXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFyQ2xhc3MKLQkgKiAgICAgICAgICAgIFRoZSBmVmFyQ2xhc3MgdG8gc2V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFZhckNsYXNzKFN0cmluZyB2YXJDbGFzcykgewotCQlmVmFyQ2xhc3MgPSB2YXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZWYXJOYW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VmFyTmFtZSgpIHsKLQkJcmV0dXJuIGZWYXJOYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YXJOYW1lCi0JICogICAgICAgICAgICBUaGUgZlZhck5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFZhck5hbWUoU3RyaW5nIHZhck5hbWUpIHsKLQkJZlZhck5hbWUgPSB2YXJOYW1lOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXREZWNsYXJhdGlvblN0cmluZygpIHsKLQkJcmV0dXJuIGdldERlY2xhcmF0aW9uU3RyaW5nKGZhbHNlLCBNX05PTkUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXREZWNsYXJhdGlvblN0cmluZyhib29sZWFuIGluY2x1ZGVEb2MsIGludCBzdHlsZSkgewotCQlTdHJpbmcgZGVjbGFyYXRpb24gPSBudWxsOwotCQkvKgotCQkgKiBubyBkZXNjcmlwdGlvbiBmb3Igbm93IC0tSkRUIHdvdWxkIG5lZWQgdG8gc2hvdyBpdCBmb3IgbG9jYWwKLQkJICogdmFyaWFibGVzIGFuZCBJTG9jYWxWYXJpYWJsZSBoYXMgbm8gImRvYyByYW5nZSIKLQkJICovCi0JCWlmIChpbmNsdWRlRG9jICYmIGdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgewotCQkJaWYgKHN0eWxlID09IE1fUFJJVkFURSkgewotCQkJCWRlY2xhcmF0aW9uID0gIi8qKiAiICsgRU5ETCArIFN0cmluZ1V0aWxzLnJlcGxhY2UoZ2V0RGVzY3JpcHRpb24oKSwgIiovIiwgIipcXC8iKSArIEVOREwgKyAiICovICIgKyBFTkRMICsgInByaXZhdGUgIiArIGdldFZhckNsYXNzKCkgKyAiICIgKyBnZXRWYXJOYW1lKCkgKyAiID0gKCIgKyBnZXRWYXJDbGFzcygpICsgIikgcGFnZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiIiArIGdldFZhck5hbWUoKSArICJcIik7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTkkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlkZWNsYXJhdGlvbiA9ICIvKiogIiArIEVOREwgKyBTdHJpbmdVdGlscy5yZXBsYWNlKGdldERlc2NyaXB0aW9uKCksICIqLyIsICIqXFwvIikgKyBFTkRMICsgIiAqLyAiICsgRU5ETCArIGdldFZhckNsYXNzKCkgKyAiICIgKyBnZXRWYXJOYW1lKCkgKyAiID0gKCIgKyBnZXRWYXJDbGFzcygpICsgIikgcGFnZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiIiArIGdldFZhck5hbWUoKSArICJcIik7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHN0eWxlID09IE1fUFJJVkFURSkgewotCQkJCWRlY2xhcmF0aW9uID0gInByaXZhdGUgIiArIGdldFZhckNsYXNzKCkgKyAiICIgKyBnZXRWYXJOYW1lKCkgKyAiID0gKCIgKyBnZXRWYXJDbGFzcygpICsgIikgcGFnZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiIiArIGdldFZhck5hbWUoKSArICJcIik7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZGVjbGFyYXRpb24gPSBnZXRWYXJDbGFzcygpICsgIiAiICsgZ2V0VmFyTmFtZSgpICsgIiA9ICgiICsgZ2V0VmFyQ2xhc3MoKSArICIpIHBhZ2VDb250ZXh0LmdldEF0dHJpYnV0ZShcIiIgKyBnZXRWYXJOYW1lKCkgKyAiXCIpOyIgKyBFTkRMOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlY2xhcmF0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBmRGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIGludCBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIGZTY29wZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY29wZShpbnQgc2NvcGUpIHsKLQkJZlNjb3BlID0gc2NvcGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlU3RyaW5nKSB7Ci0JCWludCBzY29wZSA9IFZhcmlhYmxlSW5mby5BVF9CRUdJTjsKLQotCQlTdHJpbmcgdHJpbW1lZFNjb3BlID0gc2NvcGVTdHJpbmcudHJpbSgpOwotCQlpZiAoTkVTVEVELmVxdWFscyh0cmltbWVkU2NvcGUpKSB7Ci0JCQlzY29wZSA9IFZhcmlhYmxlSW5mby5ORVNURUQ7Ci0JCX0KLQkJZWxzZSBpZiAoQVRfQkVHSU4uZXF1YWxzKHRyaW1tZWRTY29wZSkpIHsKLQkJCXNjb3BlID0gVmFyaWFibGVJbmZvLkFUX0JFR0lOOwotCQl9Ci0JCWVsc2UgaWYgKEFUX0VORC5lcXVhbHModHJpbW1lZFNjb3BlKSkgewotCQkJc2NvcGUgPSBWYXJpYWJsZUluZm8uQVRfRU5EOwotCQl9Ci0KLQkJZlNjb3BlID0gc2NvcGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWZEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFza3MvSlNQRmlsZVRhc2tTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Rhc2tzL0pTUEZpbGVUYXNrU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWY1ZmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFza3MvSlNQRmlsZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGFza3MuWE1MRmlsZVRhc2tTY2FubmVyOwotCi1wdWJsaWMgY2xhc3MgSlNQRmlsZVRhc2tTY2FubmVyIGV4dGVuZHMgWE1MRmlsZVRhc2tTY2FubmVyIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmlzQ29tbWVudFJlZ2lvbihyZWdpb24sIHRleHRSZWdpb24pIHx8IHRleHRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9URVhUKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5MTUwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQkvLyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHY1LjEuMCwgd2UnbGwgcmV1c2UgU1RfSlNQX0RJUkVDVElWRSBmb3IgYWN0aW9uCi0JLy8gdGFncwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZkVuYWJsZUpTUEFjdGlvblBhcnRpdGlvbnMgPSB0cnVlOwotCS8vIGxpc3Qgb2YgdmFsaWQgSlNQIDEuMiB0YWcgYW5kIGFjdGlvbiBuYW1lcwotCXByaXZhdGUgc3RhdGljIExpc3QgZkpTUEFjdGlvblRhZ05hbWVzID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9NSU1FX1RZUEUgPSAidGV4dC9odG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSFRNTF9NSU1FX1RZUEUgPSAidGV4dC94aHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX01JTUVfVFlQRSA9ICJ0ZXh0L3htbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk5EX1dBUF9XTUwgPSAidGV4dC92bmQud2FwLndtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tde0lKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxULCBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTCwgSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFRfRUwyLCBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFLCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9ERUxJTUlURVIsIElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEsIElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQsIElKU1BQYXJ0aXRpb25zLkpTUF9DT01NRU5UfTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIGZFbWJlZGRlZFBhcnRpdGlvbmVyID0gbnVsbDsKLQkvKgotCSAqIFNhdmUgbGFzdCB0YWdsaWIgcHJlZml4IHRoYXQgd2FzIGNoZWNrZWQgKHNlZSBpc0FjdGlvbigpKSBmb3IgYmV0dGVyCi0JICogcGVyZm9ybWFuY2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFzdENoZWNrZWRQcmVmaXggPSBudWxsOwotCi0JLyoqCi0JICogQXNzdW1lIGxhbmd1YWdlPWphdmEgYnkgZGVmYXVsdCAuLi4gY2xpZW50LCBzdWNoIGFzCi0JICogUGFnZURpcmVjdGl2ZUFkYXB0ZXIsIG11c3Qgc2V0IGxhbmd1YWdlIG9mIGRvY3VtZW50IHBhcnRpdGlvbmVyLAotCSAqIGlmL3doZW4gaXQgY2hhbmdlcy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFuZ3VhZ2UgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKU1BEb2N1bWVudFBhcnRpb25lci4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGZKU1BBY3Rpb25UYWdOYW1lcyA9PSBudWxsKSB7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIHVzZXMgLmVxdWFscygpIGZvcgotCQkJLy8gY29udGFpbnMoKQotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERUNMQVJBVElPTik7Ci0JCQkvLyBmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKTsKLQkJCS8vIGZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1BBR0UpOwotCQkJLy8gZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRVhQUkVTU0lPTik7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZBTExCQUNLKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9SV0FSRCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkdFVFBST1BFUlRZKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5DTFVERSk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU1TKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUExVR0lOKTsKLQkJCS8vIGZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUk9PVCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVExFVCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2Nvbm5lY3Qob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIuY29ubmVjdChkb2N1bWVudCk7Ci0JCWZTdXBwb3J0ZWRUeXBlcyA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBjcmVhdGVTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHJlc3VsdCA9IG51bGw7Ci0JCS8vIHRoaXMgc2FtZSBkZXRlY3RvciBzaG91bGQgdW5kZXJseSBjb250ZW50IGRlc2NyaWJlciwgdG8gaGF2ZSBjb25zaXN0ZW50IHJlc3VsdHMKLQkJSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yIGpzcEhlYWRDb250ZW50RGV0ZWN0b3IgPSBuZXcgSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yKCk7Ci0JCWpzcEhlYWRDb250ZW50RGV0ZWN0b3Iuc2V0KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCVN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50VHlwZSA9IGpzcEhlYWRDb250ZW50RGV0ZWN0b3IuZ2V0Q29udGVudFR5cGUoKTsKLQkJCS8vIGlmIFhIVE1MIG9yIFdNTCwgdGhhdCB0cnVtcHMgd2hhdCBpcyBpbiB0aGUgcGFnZSBkaXJlY3RpdmUKLQkJCWlmIChqc3BIZWFkQ29udGVudERldGVjdG9yLmlzWEhUTUwoKSB8fCBqc3BIZWFkQ29udGVudERldGVjdG9yLmlzV01MKCkpIHsKLQkJCQljb250ZW50VHlwZSA9ICJ0ZXh0L2h0bWwiOwotCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUgaW4gdGhpcyBjb250ZXh0LCBzaW5jZSB3b3JraW5nIHdpdGggZG9jdW1lbnQgc3RyZWFtCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJLy8gbnVsbCBvciBlbXB0eSwgdHJlYXQgYXMgImRlZmF1bHQiCi0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsIHx8IGNvbnRlbnRUeXBlLmxlbmd0aCgpID09IDApIHsKLQkJCWNvbnRlbnRUeXBlID0gInRleHQvaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyB3ZSBjdXJyZW50bHkgb25seSBoYXZlIHR3byAuLi4gZXZlbnR1YWxseSBzaG91bGQKLQkJLy8gbWFrZSBvciB0aWUtaW4gdG8gZXhpc3RpbmcgcmVnaXN0cnkuCi0JCWlmIChjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUxfTUlNRV9UWVBFKSB8fCBjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKFZORF9XQVBfV01MKSkgewotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCk7Ci0JCQlyZXN1bHQuY29ubmVjdChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoWEhUTUxfTUlNRV9UWVBFKSkgewotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCk7Ci0JCQlyZXN1bHQuY29ubmVjdChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoWE1MX01JTUVfVFlQRSkgfHwgY29udGVudFR5cGUuZW5kc1dpdGgoIit4bWwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpOwotCQkJcmVzdWx0LmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKCk7Ci0JCQlyZXN1bHQuY29ubmVjdChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXIjZGlzY29ubmVjdCgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKLQkJaWYgKGZFbWJlZGRlZFBhcnRpdGlvbmVyICE9IG51bGwpIHsKLQkJCWZFbWJlZGRlZFBhcnRpdGlvbmVyLmRpc2Nvbm5lY3QoKTsKLQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00OTA5Ci0JCQkvKioKLQkJCSAqIGZvcmNlIHJlY3JlYXRpb24gd2hlbiByZWNvbm5lY3RlZAotCQkJICovCi0JCQlmRW1iZWRkZWRQYXJ0aXRpb25lciA9IG51bGw7Ci0JCX0KLQkJLy8gc3VwZXIuZGlzY29ubmVjdCBzaG91bGQgY29tZSBhdCBlbmQsIHNpbmNlIGl0IChtYXkpIHNldAotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQgdG8gbnVsbAotCQlzdXBlci5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGdldEVtYmVkZGVkUGFydGl0aW9uZXIoKS5nZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVtYmVkZGVkUGFydGl0aW9uZXIuCi0JICogCi0JICogQHJldHVybiBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkgewotCQlpZiAoZkVtYmVkZGVkUGFydGl0aW9uZXIgPT0gbnVsbCkgewotCQkJZkVtYmVkZGVkUGFydGl0aW9uZXIgPSBjcmVhdGVTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJZkVtYmVkZGVkUGFydGl0aW9uZXIuY29ubmVjdChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCi0JCXJldHVybiBmRW1iZWRkZWRQYXJ0aXRpb25lcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCXJldHVybiBmTGFuZ3VhZ2U7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldExvY2FsTGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdFtdIGNvbmZpZ3VyZWRUeXBlcyA9IGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmVkVHlwZXMubGVuZ3RoOyBpKyspCi0JCQl0eXBlcy5hZGQoY29uZmlndXJlZFR5cGVzW2ldKTsKLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBhcmVudE5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlTdHJpbmcgcmVzdWx0ID0gIlVOS05PV04iOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzZFJlZ2lvbiAhPSBudWxsICYmIGlzVmFsaWRKc3BBY3Rpb25SZWdpb25UeXBlKHNkUmVnaW9uLmdldFR5cGUoKSkpCi0JCQlzZFJlZ2lvbiA9IHNkUmVnaW9uLmdldFByZXZpb3VzKCk7Ci0KLQkJaWYgKHNkUmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJLy8gb25seSBmaW5kIHBhcmVudCBuYW1lcyBmcm9tIGEgc3RhcnQgdGFnCi0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJCWlmIChyZWdpb25zLmdldCgwKS5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSAmJiByLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpKSB7Ci0JCQkJCXJlc3VsdCA9IHNkUmVnaW9uLmdldFRleHQocik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlmaW5hbCBTdHJpbmcgcmVnaW9uX3R5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpIHsKLQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGVGb3JEb2N1bWVudExhbmd1YWdlKCk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVCB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9PUEVOIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX0NMT1NFKQotCQkJcmVzdWx0ID0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTU1FTlQ7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4gfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSkKLQkJCXJlc3VsdCA9IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkU7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikKLQkJCXJlc3VsdCA9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0RFTElNSVRFUjsKLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUpCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVDsKLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX09QRU4gfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX0NPTlRFTlQgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX0NMT1NFIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9EUVVPVEUgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX1NRVU9URSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfUVVPVEVEX0NPTlRFTlQpCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTDsKLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1ZCTF9PUEVOIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfQ09OVEVOVCB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfVkJMX0NMT1NFIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfRFFVT1RFIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfU1FVT1RFIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfUVVPVEVEX0NPTlRFTlQpCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTDI7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVDsKLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkgewotCQkJLy8gQlVHMTMxNDYzOiBwb3NzaWJseSBiZXR3ZWVuIDxqc3A6c2NyaXB0bGV0PiwgPGpzcDpleHByZXNzaW9uPiwKLQkJCS8vIDxqc3A6ZGVjbGFyYXRpb24+Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gdGhpcy5mU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAoaXNKc3BKYXZhQWN0aW9uTmFtZShnZXRQYXJlbnROYW1lKHNkUmVnaW9uKSkpCi0JCQkJcmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZUZvckRvY3VtZW50TGFuZ3VhZ2UoKTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPSBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJLy8gcG9zc2libHkgYmV0d2VlbiA8anNwOnNjcmlwdGxldD4sIDxqc3A6ZXhwcmVzc2lvbj4sCi0JCQkvLyA8anNwOmRlY2xhcmF0aW9uPgotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IHRoaXMuZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGlzSnNwSmF2YUFjdGlvbk5hbWUoZ2V0UGFyZW50TmFtZShzZFJlZ2lvbikpKQotCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGVGb3JEb2N1bWVudExhbmd1YWdlKCk7Ci0JCQllbHNlCi0JCQkJcmVzdWx0ID0gZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKTsKLQkJfQotLy8JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJLy8gcG9zc2libHkgYmV0d2VlbiA8anNwOnNjcmlwdGxldD4sIDxqc3A6ZXhwcmVzc2lvbj4sCi0JCQkvLyA8anNwOmRlY2xhcmF0aW9uPgotLy8JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gdGhpcy5mU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0vLwkJCWlmIChpc0pzcEphdmFBY3Rpb25OYW1lKGdldFBhcmVudE5hbWUoc2RSZWdpb24pKSkKLS8vCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGVGb3JEb2N1bWVudExhbmd1YWdlKCk7Ci0vLwkJCWVsc2UKLS8vCQkJCXJlc3VsdCA9IGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCk7Ci0vLwkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGdldEVtYmVkZGVkUGFydGl0aW9uZXIoKS5nZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c05vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dE5vZGUpIHsKLQkJcmV0dXJuIGdldEVtYmVkZGVkUGFydGl0aW9uZXIoKS5nZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihwcmV2aW91c05vZGUsIG5leHROb2RlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlRm9yRG9jdW1lbnRMYW5ndWFnZSgpIHsKLQkJU3RyaW5nIHJlc3VsdDsKLQkJaWYgKGZMYW5ndWFnZSA9PSBudWxsIHx8IGZMYW5ndWFnZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ID0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQTsKLQkJfQotCQllbHNlIGlmIChmTGFuZ3VhZ2UuZXF1YWxzSWdub3JlQ2FzZSgiamF2YXNjcmlwdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCA9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfU0NSSVBUX1BSRUZJWCArIGdldExhbmd1YWdlKCkudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlMaXN0IGNvbWJpbmVkVHlwZXMgPSBnZXRMb2NhbExlZ2FsQ29udGVudFR5cGVzKCk7Ci0JCWlmIChnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkgIT0gbnVsbCkgewotCQkJU3RyaW5nW10gbW9yZVR5cGVzID0gZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpLmdldExlZ2FsQ29udGVudFR5cGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1vcmVUeXBlcy5sZW5ndGg7IGkrKykKLQkJCQljb21iaW5lZFR5cGVzLmFkZChtb3JlVHlwZXNbaV0pOwotCQl9Ci0JCWZTdXBwb3J0ZWRUeXBlcyA9IG5ldyBTdHJpbmdbMF07Ci0JCWNvbWJpbmVkVHlwZXMudG9BcnJheShmU3VwcG9ydGVkVHlwZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZFJlZ2lvbgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQWN0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJaWYgKCFzZFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLyoKLQkJICogc2hvdWxkbid0IGdldCBhIHRhZyBuYW1lIHJlZ2lvbiB0eXBlIHVubGVzcyBhIHRhZyBuYW1lIHJlZ2lvbgotCQkgKiBleGlzdHMgYXQgWzFdCi0JCSAqLwotCQlJVGV4dFJlZ2lvbiB0YWdOYW1lUmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBzZFJlZ2lvbi5nZXRUZXh0KHRhZ05hbWVSZWdpb24pOwotCi0JCVJlZ2lvblBhcnNlciBwYXJzZXIgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpOwotCQlpZiAocGFyc2VyIGluc3RhbmNlb2YgSlNQU291cmNlUGFyc2VyKSB7Ci0JCQlpZiAodGFnTmFtZS5lcXVhbHMoZkxhc3RDaGVja2VkUHJlZml4KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCUxpc3QgZkN1c3RvbUFjdGlvblByZWZpeGVzID0gKChKU1BTb3VyY2VQYXJzZXIpIHBhcnNlcikuZ2V0TmVzdGFibGVQcmVmaXhlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmQ3VzdG9tQWN0aW9uUHJlZml4ZXMuc2l6ZSgpOyBpKyspCi0JCQkJaWYgKHRhZ05hbWUuc3RhcnRzV2l0aCgoKFRhZ01hcmtlcikgZkN1c3RvbUFjdGlvblByZWZpeGVzLmdldChpKSkuZ2V0VGFnTmFtZSgpKSkgewotCQkJCQlmTGFzdENoZWNrZWRQcmVmaXggPSAoKFRhZ01hcmtlcikgZkN1c3RvbUFjdGlvblByZWZpeGVzLmdldChpKSkuZ2V0VGFnTmFtZSgpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRG9jdW1lbnRSZWdpb25CYXNlZFBhcnRpdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJVGV4dFJlZ2lvbiBjb250YWluZWRDaGlsZFJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlTdHJpbmcgZG9jdW1lbnRSZWdpb25Db250ZXh0ID0gc2RSZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAoY29udGFpbmVkQ2hpbGRSZWdpb24gIT0gbnVsbCkgewotCQkJaWYgKGRvY3VtZW50UmVnaW9uQ29udGV4dC5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB8fCBkb2N1bWVudFJlZ2lvbkNvbnRleHQuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FKSkgewotCQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgY29udGFpbmVkQ2hpbGRSZWdpb24uZ2V0TGVuZ3RoKCksIElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJCi0JCQkvL2lmIGlzIGEgSlNQIGN1c3RvbSB0YWcgYnV0IG5vdCBhIEpTUF9FTCByZWdpb24KLQkJCWlmIChmRW5hYmxlSlNQQWN0aW9uUGFydGl0aW9ucyAmJiAhaXNFTFJlZ2lvbihjb250YWluZWRDaGlsZFJlZ2lvbikgJiYgaXNBY3Rpb24oc2RSZWdpb24sIG9mZnNldCkgJiYgIShjb250YWluZWRDaGlsZFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSApIHsKLQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIGNvbnRhaW5lZENoaWxkUmVnaW9uLmdldExlbmd0aCgpLCBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNEb2N1bWVudFJlZ2lvbkJhc2VkUGFydGl0aW9uKHNkUmVnaW9uLCBjb250YWluZWRDaGlsZFJlZ2lvbiwgb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcG9zc2libGVKc3BKYXZhQWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0pzcEphdmFBY3Rpb25OYW1lKFN0cmluZyBwb3NzaWJsZUpzcEphdmFBY3Rpb24pIHsKLQkJcmV0dXJuIHBvc3NpYmxlSnNwSmF2YUFjdGlvbi5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUTEVUKSB8fCBwb3NzaWJsZUpzcEphdmFBY3Rpb24uZXF1YWxzKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVYUFJFU1NJT04pIHx8IHBvc3NpYmxlSnNwSmF2YUFjdGlvbi5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVDTEFSQVRJT04pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkSnNwQWN0aW9uUmVnaW9uVHlwZShTdHJpbmcgdHlwZSkgewotCQkvLyB0cnVlIGZvciBhbnl0aGluZyB0aGF0IGNhbiBiZSB3aXRoaW4gPGpzcDpzY3JpcHRsZXQ+LAotCQkvLyA8anNwOmV4cHJlc3Npb24+LCA8anNwOmRlY2xhcmF0aW9uPgotCQlyZXR1cm4gdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTiB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQgfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AgaW5zdGFuY2UgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCgpOwotCQlpbnN0YW5jZS5zZXRFbWJlZGRlZFBhcnRpdGlvbmVyKGNyZWF0ZVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIoZlN0cnVjdHVyZWREb2N1bWVudCkpOwotCQlpbnN0YW5jZS5zZXRMYW5ndWFnZShmTGFuZ3VhZ2UpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZW1iZWRkZWRQYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBAcGFyYW0gZW1iZWRkZWRQYXJ0aXRpb25lcgotCSAqICAgICAgICAgICAgVGhlIGVtYmVkZGVkUGFydGl0aW9uZXIgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW1iZWRkZWRQYXJ0aXRpb25lcihJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBlbWJlZGRlZFBhcnRpdGlvbmVyKSB7Ci0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00OTA5Ci0JCS8qKgotCQkgKiBtYW5hZ2UgY29ubmVjdGVkIHN0YXRlIG9mIGVtYmVkZGVkIHBhcnRpdGlvbmVyCi0JCSAqLwotCQlpZiAoZkVtYmVkZGVkUGFydGl0aW9uZXIgIT0gbnVsbCAmJiBmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWZFbWJlZGRlZFBhcnRpdGlvbmVyLmRpc2Nvbm5lY3QoKTsKLQkJfQotCi0JCXRoaXMuZkVtYmVkZGVkUGFydGl0aW9uZXIgPSBlbWJlZGRlZFBhcnRpdGlvbmVyOwotCi0JCWlmIChmRW1iZWRkZWRQYXJ0aXRpb25lciAhPSBudWxsICYmIGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJZkVtYmVkZGVkUGFydGl0aW9uZXIuY29ubmVjdChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEludGVybmFsUGFydGl0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0eXBlKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gY2FycnkgdGhpcyBzaW5nbGUgaW5zdGFuY2UgaWRlYSBmdXJ0aGVyIHRvIGJlCi0JCS8vIGNvbXBsZXRlLAotCQkvLyBidXQgaG9wZWZ1bGx5IHRoaXMgd2lsbCBiZSBsZXNzIGdhcmJhZ2UgdGhhbiBiZWZvcmUgKGVzcGVjaWFsbHkgZm9yCi0JCS8vIEhUTUwsIFhNTCwKLQkJLy8gbmF0dXJhbGx5ISkKLQkJSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiByZWdpb24gPSBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuY3JlYXRlUGFydGl0aW9uKG9mZnNldCwgbGVuZ3RoLCB0eXBlKTsKLQkJc3VwZXIuc2V0SW50ZXJuYWxQYXJ0aXRpb24ocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCksIHJlZ2lvbi5nZXRUeXBlKCkpOwotCi0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFuZ3VhZ2UuCi0JICogCi0JICogQHBhcmFtIGxhbmd1YWdlCi0JICogICAgICAgICAgICBUaGUgbGFuZ3VhZ2UgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKSB7Ci0JCXRoaXMuZkxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSByZWdpb24gZGVjaWRlIGlmIHRoaXMgcmVnaW9uIGlzIGFuIEVMIHJlZ2lvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIDxjb2RlPnJlZ2lvbjwvY29kZT4gaXMgYSBFTCByZWdpb24sCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFTFJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlyZXR1cm4KLQkJCXR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX0NMT1NFIHx8Ci0JCQl0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DT05URU5UIHx8Ci0JCQl0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9EUVVPVEUgfHwKLQkJCXR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX09QRU4gfHwKLQkJCXR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX1FVT1RFRF9DT05URU5UIHx8Ci0JCQl0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9TUVVPVEUgfHwKLQkJCXR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1ZCTF9DTE9TRSB8fAotCQkJdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfVkJMX0NPTlRFTlQgfHwKLQkJCXR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1ZCTF9EUVVPVEUgfHwKLQkJCXR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1ZCTF9PUEVOIHx8Ci0JCQl0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfUVVPVEVEX0NPTlRFTlQgfHwKLQkJCXR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1ZCTF9TUVVPVEU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYjMzNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vblhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIENvbW1vblhNTCB7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgZ2V0RG9jdW1lbnRCdWlsZGVyKCkgewotCQlEb2N1bWVudEJ1aWxkZXIgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGdldERvY3VtZW50QnVpbGRlcihib29sZWFuIHZhbGlkYXRpbmcpIHsKLQkJRG9jdW1lbnRCdWlsZGVyIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGluc3RhbmNlID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJaW5zdGFuY2Uuc2V0VmFsaWRhdGluZyh2YWxpZGF0aW5nKTsKLQkJCWluc3RhbmNlLnNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoZmFsc2UpOwotCQkJaW5zdGFuY2Uuc2V0Q29hbGVzY2luZyh0cnVlKTsKLQkJCXJlc3VsdCA9IGluc3RhbmNlLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplKERvY3VtZW50IGRvY3VtZW50LCBPdXRwdXRTdHJlYW0gb3N0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU291cmNlIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpOwotCQl0cnkgewotCQkJVHJhbnNmb3JtZXIgc2VyaWFsaXplciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQl0cnkgewotCQkJCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCAiVVRGLTE2Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vIHVuc3VwcG9ydGVkIHByb3BlcnRpZXMKLQkJCX0KLQkJCXNlcmlhbGl6ZXIudHJhbnNmb3JtKGRvbVNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChvc3RyZWFtKSk7Ci0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQljYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9Eb2N1bWVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvRG9jdW1lbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQzNmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9Eb2N1bWVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5KYXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQW4gWE1MIENyZWF0b3IvUmVhZGVyL1dyaXRlciB0aGF0IDEpIElnbm9yZXMgYW55IERvY3VtZW50VHlwZSBOb2RlcyBmb3VuZAotICogd2l0aGluIHRoZSBkb2N1bWVudCAoYXMgd2VsbCBhcyBhbnkgZW50aXRpZXMpIDIpIElnbm9yZXMgYW55Ci0gKiBlcnJvcnMvZXhjZXB0aW9ucyBmcm9tIFhlcmNlcyB3aGVuIGxvYWRpbmcgYSBkb2N1bWVudCAzKSBDYW4gbG9hZCBEb2N1bWVudHMKLSAqIGZyb20gd2l0aGluIGEgLkpBUiBmaWxlICgqKipyZWFkLW9ubHkqKiopCi0gKi8KLQotcHVibGljIGNsYXNzIERvY3VtZW50UHJvdmlkZXIgewotCXByaXZhdGUgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJhc2VSZWZlcmVuY2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmVmFsaWRhdGluZyA9IGZhbHNlOwotCXByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGphckZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIEVudGl0eVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLQotCXByaXZhdGUgTm9kZSByb290RWxlbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gbnVsbDsKLQotCXB1YmxpYyBEb2N1bWVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIF9nZXRGaWxlTmFtZSgpIHsKLQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoaXNKQVIoKSkgewotCQkJcmV0dXJuIGdldEphckZpbGVOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGdldEZpbGVOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudCBfZ2V0UGFyc2VkRG9jdW1lbnRET00yKCkgewotCQlEb2N1bWVudCByZXN1bHQgPSBudWxsOwotCi0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZ2V0RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQkvLyBET01QYXJzZXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwotCQkJLy8gcGFyc2VyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9jb250aW51ZS1hZnRlci1mYXRhbC1lcnJvciIsCi0JCQkvLyBmYWxzZSk7Ly8kTk9OLU5MUy0xJAotCQkJLy8gcGFyc2VyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9ub252YWxpZGF0aW5nL2xvYWQtZHRkLWdyYW1tYXIiLAotCQkJLy8gZmFsc2UpOy8vJE5PTi1OTFMtMSQKLQkJCS8vIHBhcnNlci5zZXRFcnJvckhhbmRsZXIoZ2V0TnVsbEVycm9ySGFuZGxlcigpKTsKLQkJCS8vIHBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihnZXROdWxsRW50aXR5UmVzb2x2ZXIoKSk7Ci0JCQkvLyBpcyA9IGdldElucHV0U3RyZWFtKCk7Ci0JCQlidWlsZGVyLnNldEVudGl0eVJlc29sdmVyKGdldEVudGl0eVJlc29sdmVyKCkpOwotCQkJYnVpbGRlci5zZXRFcnJvckhhbmRsZXIoZ2V0TnVsbEVycm9ySGFuZGxlcigpKTsKLQkJCWlzID0gZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGJ1aWxkZXIucGFyc2UoaXMsIGdldEJhc2VSZWZlcmVuY2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBwYXJzaW5nIGV4Y2VwdGlvbiwgbm90aWZ5IHRoZSB1c2VyPwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIlNBWEV4Y2VwdGlvbiB3aGlsZSByZWFkaW5nIGRlc2NyaXB0b3IgIiArIF9nZXRGaWxlTmFtZSgpICsgIiAiICsgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gTk9UIGFuICJleGNlcHRpb25hbCBjYXNlIjsgZG8gbm90IExvZwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiSU9FeGNlcHRpb24gd2hpbGUgcmVhZGluZyBkZXNjcmlwdG9yICIgKyBfZ2V0RmlsZU5hbWUoKSArICIgIiArIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChpcyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHdoYXQgY2FuIGJlIGRvbmU/Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGZCYXNlUmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBnZXREb2N1bWVudCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoYm9vbGVhbiBjcmVhdGVFbXB0eU9uRmFpbHVyZSkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCWxvYWQoY3JlYXRlRW1wdHlPbkZhaWx1cmUpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JRG9jdW1lbnRCdWlsZGVyIGZEb2N1bWVudEJ1aWxkZXIgPSBudWxsOwotCQotCXByaXZhdGUgRG9jdW1lbnRCdWlsZGVyIGdldERvY3VtZW50QnVpbGRlcigpIHsKLQkJaWYgKGZEb2N1bWVudEJ1aWxkZXIgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50QnVpbGRlciA9IENvbW1vblhNTC5nZXREb2N1bWVudEJ1aWxkZXIoaXNWYWxpZGF0aW5nKCkpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRCdWlsZGVyOwotCX0KLQotCXByaXZhdGUgRE9NSW1wbGVtZW50YXRpb24gZ2V0RG9tSW1wbGVtZW50YXRpb24oKSB7Ci0JCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJ1aWxkZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZTEpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQl9Ci0JCWNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUxKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJfQotCQlET01JbXBsZW1lbnRhdGlvbiBpbXBsID0gYnVpbGRlci5nZXRET01JbXBsZW1lbnRhdGlvbigpOwotCQlyZXR1cm4gaW1wbDsKLQl9Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIFRha2VzIGEgc2luZ2xlIHN0cmluZyBvZiB0aGUgZm9ybSAiYS9iL2MiIGFuZCBlbnN1cmVzIHRoYXQgdGhhdAotCSAqIHN0cnVjdHVyZSBleGlzdHMgYmVsb3cgdGhlIGhlYWQgZWxlbWVudCwgZG93biB0aHJvdWdoICdjJywgYW5kIHJldHVybnMKLQkgKiBhIDxlbT5zaW5nbGU8L2VtPiBlbGVtZW50ICdjJy4gRm9yIG11bHRpcGxlIGVsZW1lbnRzIChzdWNoIGFzCi0JICogbXVsdGlwbGUgJmx0O21hY3JvJmd0OyBlbGVtZW50cyBjb250YWluZWQgd2l0aGluIGEgc2luZ2xlCi0JICogJmx0O21hY3JvcyZndDsgZWxlbWVudCwgZnVsbCBET00gYWNjZXNzIGlzIHJlcXVpcmVkIGZvciBzZWFyY2hpbmcgYW5kCi0JICogY2hpbGQgZWxlbWVudCBtYW5pcHVsYXRpb24uCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KFN0cmluZyBuYW1lKSB7Ci0JCUVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlsb2FkKGZhbHNlKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IChFbGVtZW50KSBnZXROb2RlKGdldFJvb3RFbGVtZW50KCksIG5hbWUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBFbnRpdHlSZXNvbHZlciB0aGF0IHdvbid0IHRyeSB0byBsb2FkIGFuZCByZXNvbHZlIEFOWQotCSAqIGVudGl0aWVzCi0JICovCi0JcHJpdmF0ZSBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpIHsKLQkJaWYgKHJlc29sdmVyID09IG51bGwpIHsKLQkJCXJlc29sdmVyID0gbmV3IEVudGl0eVJlc29sdmVyKCkgewotCQkJCXB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCQkJCUlucHV0U291cmNlIHJlc3VsdCA9IG51bGw7Ci0JCQkJCWlmIChpc1ZhbGlkYXRpbmcoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlVUkwgc3BlYyA9IG5ldyBVUkwoImZpbGU6Ly8iICsgZ2V0QmFzZVJlZmVyZW5jZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHNwZWMsIHN5c3RlbUlEKTsKLQkJCQkJCQlpZiAodXJsLmdldFByb3RvY29sKCkuc3RhcnRzV2l0aCgiZmlsZToiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCVVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCQkJCQlyZXN1bHQgPSBuZXcgSW5wdXRTb3VyY2Uoc3lzdGVtSUQgIT0gbnVsbCA/IHN5c3RlbUlEIDogIi9fIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXJlc3VsdC5zZXRQdWJsaWNJZChwdWJsaWNJRCk7Ci0JCQkJCQkJCXJlc3VsdC5zZXRCeXRlU3RyZWFtKGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJcmVzdWx0ID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gbmV3IElucHV0U291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOwotCQkJCQkJcmVzdWx0LnNldFB1YmxpY0lkKHB1YmxpY0lEKTsKLQkJCQkJCXJlc3VsdC5zZXRTeXN0ZW1JZChzeXN0ZW1JRCAhPSBudWxsID8gc3lzdGVtSUQgOiAiL18iICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiByZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotCQlyZXR1cm4gZmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbmQgaW5wdXQgc3RyZWFtIHRvIHVzZSBhcyB0aGUgc291cmNlIG9mIHRoZSBEb2N1bWVudCAxKSBmcm9tCi0JICogYW4gSW5wdXRTdHJlYW0gc2V0IG9uIHRoaXMgaW5zdGFuY2UgMikgZnJvbSBhIEpBUiBmaWxlIHdpdGggdGhlIGdpdmVuCi0JICogZW50cnkgbmFtZSAzKSBmcm9tIGEgbm9ybWFsIGZpbGUKLQkgKiAKLQkgKiBAcmV0dXJuIElucHV0U3RyZWFtCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotCQkJcmV0dXJuIGlucHV0U3RyZWFtOwotCQllbHNlIGlmIChpc0pBUigpKSB7Ci0JCQlyZXR1cm4gSmFyVXRpbGl0aWVzLmdldElucHV0U3RyZWFtKGdldEphckZpbGVOYW1lKCksIGdldEZpbGVOYW1lKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZ2V0RmlsZU5hbWUoKSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKYXJGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGphckZpbGVOYW1lOwotCX0KLQotCXByaXZhdGUgTm9kZSBnZXROYW1lZENoaWxkKE5vZGUgcGFyZW50LCBTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTm9kZUxpc3QgY2hpbGRMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZExpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGNoaWxkTGlzdC5pdGVtKGkpLmdldE5vZGVOYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpCi0JCQkJcmV0dXJuIGNoaWxkTGlzdC5pdGVtKGkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgZ2V0TmV3RG9jdW1lbnQoKSB7Ci0JCURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBnZXREb21JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50KCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLCBnZXRSb290RWxlbWVudE5hbWUoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vZGVMaXN0IGNoaWxkcmVuID0gcmVzdWx0LmdldENoaWxkTm9kZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCXJlc3VsdC5yZW1vdmVDaGlsZChjaGlsZHJlbi5pdGVtKGkpKTsKLQkJCX0KLQkJCS8vIHdlJ3JlIGdvaW5nIHRocm91Z2ggdGhpcyBlZmZvcnQgdG8gYXZvaWQgYSBOUyBlbGVtZW50Ci0JCQlFbGVtZW50IHNldHRpbmdzID0gcmVzdWx0LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwgZ2V0Um9vdEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQuYXBwZW5kQ2hpbGQoc2V0dGluZ3MpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBUYWtlcyBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGZvcm0gImEvYi9jIiBhbmQgZW5zdXJlcyB0aGF0IHRoYXQKLQkgKiBzdHJ1Y3R1cmUgZXhpc3RzIGJlbG93IHRoZSBoZWFkIGVsZW1lbnQsIGRvd24gdGhyb3VnaCAnYycsIGFuZCByZXR1cm5zCi0JICogdGhlIGVsZW1lbnQgJ2MnLgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JcHJpdmF0ZSBOb2RlIGdldE5vZGUoTm9kZSBub2RlLCBTdHJpbmcgbmFtZSkgewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0b2tlbiA9IG51bGw7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWlmIChnZXROYW1lZENoaWxkKG5vZGUsIHRva2VuKSA9PSBudWxsKQotCQkJCW5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0b2tlbikpOwotCQkJbm9kZSA9IGdldE5hbWVkQ2hpbGQobm9kZSwgdG9rZW4pOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gRXJyb3JIYW5kbGVyIHRoYXQgd2lsbCBub3Qgc3RvcCB0aGUgcGFyc2VyIG9uIHJlcG9ydGVkCi0JICogZXJyb3JzCi0JICovCi0JcHJpdmF0ZSBFcnJvckhhbmRsZXIgZ2V0TnVsbEVycm9ySGFuZGxlcigpIHsKLQkJaWYgKGVycm9ySGFuZGxlciA9PSBudWxsKSB7Ci0JCQllcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJTQVhQYXJzZUV4Y2VwdGlvbiB3aXRoICIgKyBmQmFzZVJlZmVyZW5jZSArICIvIiArIGdldEphckZpbGVOYW1lKCkgKyAiLyIgKyBnZXRGaWxlTmFtZSgpICsgIiAoZXJyb3IpIHdoaWxlIHJlYWRpbmcgZGVzY3JpcHRvcjogIiArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiU0FYUGFyc2VFeGNlcHRpb24gd2l0aCAiICsgZkJhc2VSZWZlcmVuY2UgKyAiLyIgKyBnZXRKYXJGaWxlTmFtZSgpICsgIi8iICsgZ2V0RmlsZU5hbWUoKSArICIgKGZhdGFsRXJyb3IpIHdoaWxlIHJlYWRpbmcgZGVzY3JpcHRvcjogIiArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIlNBWFBhcnNlRXhjZXB0aW9uIHdpdGggIiArIGZCYXNlUmVmZXJlbmNlICsgIi8iICsgZ2V0SmFyRmlsZU5hbWUoKSArICIvIiArIGdldEZpbGVOYW1lKCkgKyAiICh3YXJuaW5nKSB3aGlsZSByZWFkaW5nIGRlc2NyaXB0b3I6ICIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBlcnJvckhhbmRsZXI7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudCBnZXRQYXJzZWREb2N1bWVudCgpIHsKLQkJRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKLQkJCUZpbGUgZXhpc3RlbmNlVGVzdGVyID0gbnVsbDsKLQkJCWlmIChpc0pBUigpKQotCQkJCWV4aXN0ZW5jZVRlc3RlciA9IG5ldyBGaWxlKGdldEphckZpbGVOYW1lKCkpOwotCQkJZWxzZQotCQkJCWV4aXN0ZW5jZVRlc3RlciA9IG5ldyBGaWxlKGdldEZpbGVOYW1lKCkpOwotCQkJaWYgKCFleGlzdGVuY2VUZXN0ZXIuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXN1bHQgPSBfZ2V0UGFyc2VkRG9jdW1lbnRET00yKCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgRWxlbWVudCBvZiB0aGUgY3VycmVudCBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXB1YmxpYyBOb2RlIGdldFJvb3RFbGVtZW50KCkgewotCQlyZXR1cm4gZ2V0Um9vdEVsZW1lbnQoZ2V0RG9jdW1lbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUvYSByb290IEVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBOb2RlIGdldFJvb3RFbGVtZW50KERvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSAhPSBudWxsKQotCQkJcmV0dXJuIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJdHJ5IHsKLQkJCUVsZW1lbnQgbmV3Um9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChnZXRSb290RWxlbWVudE5hbWUoKSk7Ci0JCQlkb2MuYXBwZW5kQ2hpbGQobmV3Um9vdEVsZW1lbnQpOwotCQkJcmV0dXJuIG5ld1Jvb3RFbGVtZW50OwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSb290RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiByb290RWxlbWVudE5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSkFSKCkgewotCQlyZXR1cm4gZ2V0SmFyRmlsZU5hbWUoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRpbmcoKSB7Ci0JCXJldHVybiBmVmFsaWRhdGluZzsKLQl9Ci0KLQl2b2lkIGxvYWQoYm9vbGVhbiBjcmVhdGVFbXB0eU9uRmFpbHVyZSkgewotCQkvLyByb290RWxlbWVudE5hbWUgYW5kIGZpbGVOYW1lIGFyZSBleHBlY3RlZCB0byBiZSBkZWZpbmVkIGF0IHRoaXMKLQkJLy8gcG9pbnQKLQkJZG9jdW1lbnQgPSBnZXRQYXJzZWREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKHJvb3RFbGVtZW50TmFtZSAhPSBudWxsKQotCQkJCXJvb3RFbGVtZW50ID0gZ2V0Um9vdEVsZW1lbnQoZG9jdW1lbnQpOwotCQkJZWxzZQotCQkJCXJvb3RFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCX0KLQotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCB8fCByb290RWxlbWVudCA9PSBudWxsKSB7Ci0JCQlpZiAoY3JlYXRlRW1wdHlPbkZhaWx1cmUpIHsKLQkJCQlkb2N1bWVudCA9IGdldE5ld0RvY3VtZW50KCk7Ci0JCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVOYW1lKCkuZXF1YWxzKGdldFJvb3RFbGVtZW50TmFtZSgpKSkKLQkJCQkJCQlyb290RWxlbWVudCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHJvb3RFbGVtZW50ID09IG51bGwpIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJCWlmIChjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCQkJcm9vdEVsZW1lbnQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFzZVJlZmVyZW5jZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWZCYXNlUmVmZXJlbmNlID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdGaWxlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3RmlsZU5hbWUpIHsKLQkJZmlsZU5hbWUgPSBuZXdGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbnB1dFN0cmVhbSBmb3Igd2hpY2ggdG8gcHJvdmlkZSBhIERvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dFN0cmVhbQotCSAqICAgICAgICAgICAgVGhlIGlucHV0U3RyZWFtIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlTdHJlYW0pIHsKLQkJdGhpcy5pbnB1dFN0cmVhbSA9IGlTdHJlYW07Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0phckZpbGVOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmFyRmlsZU5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdKYXJGaWxlTmFtZSkgewotCQlqYXJGaWxlTmFtZSA9IG5ld0phckZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdSb290RWxlbWVudE5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb290RWxlbWVudE5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdSb290RWxlbWVudE5hbWUpIHsKLQkJcm9vdEVsZW1lbnROYW1lID0gbmV3Um9vdEVsZW1lbnROYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGluZyhib29sZWFuIGIpIHsKLQkJZlZhbGlkYXRpbmcgPSBiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDBkNGRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIGFueSB1c2VkIE1vZHVsZSBDb3JlIGFuZCBGYWNldHMgQVBJcyBhbG9uZyB3aXRoCi0gKiBmYWxsYmFja3MgZm9yIHVzZSBvbiBub24tY29tcGxpYW50IHByb2plY3RzIGFuZCB3aGVuIHRob3NlIHNlcnZpY2VzIGFyZSBub3QKLSAqIGF2YWlsYWJsZSBhdCBydW50aW1lLgotICogCi0gKiBCZWNhdXNlIE1vZHVsZUNvcmUgQVBJIGNhbGxzIGNhbiByZXN1bHQgaW4gbG9ja3MgbmVlZGluZyB0byBiZSBhY3F1aXJlZCwKLSAqIG5vbmUgb2YgdGhlc2UgbWV0aG9kcyBzaG91bGQgYmUgY2FsbGVkIHdoaWxlIG90aGVyIHRocmVhZCBsb2NrcyBoYXZlCi0gKiBhbHJlYWR5IGJlZW4gYWNxdWlyZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldE1vZHVsZUNvcmVTdXBwb3J0IHsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZHVtcF9OQ0RGRSA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU5GID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBhdGggV0VCX0lORl9QQVRIID0gbmV3IFBhdGgoV0VCX0lORik7Ci0KLQlzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9TRVJWTEVUX1ZFUlNJT04gPSAzZjsKLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiB0aGUgY29tcHV0ZWQgSVBhdGggdG8gdGhlICJyb290IiBvZiB0aGUgd2ViIGNvbnRlbnRzLCBlaXRoZXIgZnJvbSBmYWNldCBrbm93bGVkZ2Ugb3IgaHVlcmlzdGljcywgb3IgbnVsbCBpZiBvbmUgY2FuIG5vdCBiZSBkZXRlcm1pbmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBjb21wdXRlV2ViQ29udGVudFJvb3RQYXRoKElQYXRoIHBhdGgpIHsKLQkJSVBhdGggcm9vdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyb290ID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmdldFdlYkNvbnRlbnRSb290UGF0aChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aC5zZWdtZW50KDApKSk7Ci0JCX0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLQkJCWlmIChfZHVtcF9OQ0RGRSkKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWlmKHJvb3QgPT0gbnVsbCkgewotCQkJLyoKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTMyNDUKLQkJCSAqIAotCQkJICogTlBFIGluIEpTUFRhZ2xpYkRpcmVjdGl2ZUNvbnRlbnRBc3Npc3RQcm9jZXNzb3Igd2l0aAotCQkJICogbm9uLWZhY2V0ZWQgcHJvamVjdAotCQkJICovCi0JCQlyb290ID0gZ2V0TG9jYWxSb290KHBhdGgpOwotCQl9Ci0JCXJldHVybiByb290OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiBhIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHByb2plY3QgZG9lcyBub3QgaGF2ZSB0aGUgSlNUIFdlYiBmYWNldCwgdGhlIHZlcnNpb24KLQkgKiAgICAgICAgIG51bWJlciBvZiB0aGUgaW5zdGFsbGVkIGZhY2V0IG90aGVyd2lzZQotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZsb2F0IGdldER5bmFtaWNXZWJQcm9qZWN0VmVyc2lvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vIEluIHRoZSBhYnNlbmNlIG9mIGFueSBmYWNldCBpbmZvcm1hdGlvbiwgYXNzdW1lIHRoZSBoaWdoZXN0IGxldmVsCi0JCWZsb2F0IHZlcnNpb24gPSBERUZBVUxUX1NFUlZMRVRfVkVSU0lPTjsKLQkJdHJ5IHsKLQkJCXZlcnNpb24gPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuZ2V0RHluYW1pY1dlYlByb2plY3RWZXJzaW9uKHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gdGhlIElQYXRoIHRvIHRoZSAicm9vdCIgb2YgdGhlIHdlYiBjb250ZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0V2ViQ29udGVudFJvb3RQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCQl0cnkgewotCQkJcGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5nZXRXZWJDb250ZW50Um9vdFBhdGgocHJvamVjdCk7Ci0JCX0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLQkJCWlmIChfZHVtcF9OQ0RGRSkKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICAtIHRoZSBmdWxsIHBhdGggdG8gYSByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gLSB0aGUgcnVudGltZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBpZiBvbmUgZXhpc3RzLCBhbgotCSAqICAgICAgICAgYXBwcm94aW1hdGlvbiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFJ1bnRpbWVQYXRoKElQYXRoIHBhdGgpIHsKLQkJSVBhdGggcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5nZXRSdW50aW1lUGF0aChwYXRoKTsKLQkJfQotCQljYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgewotCQkJaWYgKF9kdW1wX05DREZFKQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlJUGF0aCByb290ID0gZ2V0TG9jYWxSb290KHBhdGgpOwotCQkJcmVzdWx0ID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHJvb3Quc2VnbWVudENvdW50KCkpLm1ha2VBYnNvbHV0ZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBwcm9qZWN0IGhhcyB0aGUganN0LndlYiBmYWNldCBpbnN0YWxsZWQgb24gaXQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEeW5hbWljV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQl0cnkgewotCQkJcmV0dXJuIEZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZVBhdGggLQotCSAqICAgICAgICAgICAgdGhlIGZ1bGwgcGF0aCB0byBhIHJlc291cmNlIHdpdGhpbiB0aGUgd29ya3NwYWNlCi0JICogQHBhcmFtIHJlZmVyZW5jZSAtCi0JICogICAgICAgICAgICB0aGUgcmVmZXJlbmNlIHN0cmluZyB0byByZXNvbHZlCi0JICogQHJldHVybiAtIHRoZSBmdWxsIHBhdGggd2l0aGluIHRoZSB3b3Jrc3BhY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKLQkgKiAgICAgICAgIGdpdmVuIHJlZmVyZW5jZSBhY2NvcmRpbmcgdG8gdGhlIHZpcnR1YWwgcGF0aGluZyBzdXBwb3J0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCByZXNvbHZlKElQYXRoIGJhc2VQYXRoLCBTdHJpbmcgcmVmZXJlbmNlKSB7Ci0JCUlQYXRoIHJlc29sdmVkUGF0aCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXNvbHZlZFBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUucmVzb2x2ZShiYXNlUGF0aCwgcmVmZXJlbmNlKTsKLQkJfQotCQljYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgewotCQkJaWYgKF9kdW1wX05DREZFKQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlpZiAocmVzb2x2ZWRQYXRoID09IG51bGwpIHsKLQkJCUlQYXRoIHJvb3RQYXRoID0gZ2V0TG9jYWxSb290KGJhc2VQYXRoKTsKLQkJCWlmIChyZWZlcmVuY2Uuc3RhcnRzV2l0aChQYXRoLlJPT1QudG9TdHJpbmcoKSkpIHsKLQkJCQlyZXNvbHZlZFBhdGggPSByb290UGF0aC5hcHBlbmQocmVmZXJlbmNlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc29sdmVkUGF0aCA9IGJhc2VQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQocmVmZXJlbmNlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXNvbHZlZFBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogQHJldHVybiBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSBhcHBsaWNhYmxlIFdlYiBjb250ZXh0IHJvb3QgcGF0aCwgaWYgb25lIGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggZ2V0TG9jYWxSb290KElQYXRoIGJhc2VQYXRoKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0JCS8vIGV4aXN0aW5nIHdvcmtzcGFjZSByZXNvdXJjZXMgLSB0aGlzIGlzIHRoZSA5MyUgY2FzZQotCQlJUmVzb3VyY2UgZmlsZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGJhc2VQYXRoKTsKLQotCQkvLyBUcnkgdGhlIGJhc2UgcGF0aCBhcyBhIGZvbGRlciBmaXJzdAotCQlpZiAoZmlsZSA9PSBudWxsICYmIGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Rm9sZGVyKGJhc2VQYXRoKTsKLQkJfQotCQkvLyBJZiBub3QgYSBmb2xkZXIsIHRoZW4gdHJ5IGJhc2UgcGF0aCBhcyBhIGZpbGUKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiAhZmlsZS5leGlzdHMoKSAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZpbGUoYmFzZVBhdGgpOwotCQl9Ci0KLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7Ci0JCQlmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KGJhc2VQYXRoLnNlZ21lbnQoMCkpOwotCQl9Ci0KLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJLyoKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY1MjkKLQkJCSAqIAotCQkJICogVGhpcyBtZXRob2QgcHJvZHVjZXMgYSBsZXNzIGFjY3VyYXRlIHJlc3VsdCwgYnV0IGRvZXNuJ3QKLQkJCSAqIHJlcXVpcmUgdGhhdCB0aGUgZmlsZSBleGlzdCB5ZXQuCi0JCQkgKi8KLQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKGJhc2VQYXRoKTsKLQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKQotCQkJCWZpbGUgPSBmaWxlc1swXTsKLQkJfQotCi0JCXdoaWxlIChmaWxlICE9IG51bGwpIHsKLQkJCS8qKgotCQkJICogVHJlYXQgYW55IHBhcmVudCBmb2xkZXIgd2l0aCBhIFdFQi1JTkYgc3ViZm9sZGVyIGFzIGEgd2ViLWFwcAotCQkJICogcm9vdAotCQkJICovCi0JCQlJQ29udGFpbmVyIGZvbGRlciA9IG51bGw7Ci0JCQlpZiAoKGZpbGUuZ2V0VHlwZSgpICYgSVJlc291cmNlLkZPTERFUikgIT0gMCkgewotCQkJCWZvbGRlciA9IChJQ29udGFpbmVyKSBmaWxlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9sZGVyID0gZmlsZS5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCS8vIGdldEZvbGRlciBvbiBhIHdvcmtzcGFjZSByb290IG11c3QgdXNlIGEgZnVsbCBwYXRoLCBza2lwCi0JCQlpZiAoZm9sZGVyICE9IG51bGwgJiYgKGZvbGRlci5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUk9PVCkgPT0gMCkgewotCQkJCUlGb2xkZXIgd2ViaW5mID0gZm9sZGVyLmdldEZvbGRlcihXRUJfSU5GX1BBVEgpOwotCQkJCWlmICh3ZWJpbmYgIT0gbnVsbCAmJiB3ZWJpbmYuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIGZvbGRlci5nZXRGdWxsUGF0aCgpOwotCQkJCX0KLQkJCX0KLQkJCWZpbGUgPSBmaWxlLmdldFBhcmVudCgpOwotCQl9Ci0KLQkJcmV0dXJuIGJhc2VQYXRoLnVwdG9TZWdtZW50KDEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1MTM2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIFdyYXBwZXIgY2xhc3MgZm9yIGFsbCBGYWNldC1yZWxhdGVkIGNhbGxzLiBJZiB0aGUgRmFjZXQgb3IgTW9kdWxlQ29yZQotICogYnVuZGxlcyBhcmUgbm90IGF2YWlsYWJsZSwgdGhpcyBjbGFzcyB3aWxsIG5vdCBsb2FkLCBvciBpZiBpdCBkb2VzLCBpdHMKLSAqIG1ldGhvZHMgd2lsbCBjYXVzZSBOb0NsYXNzRGVmRm91bmRFcnJvcnMuIFRoaXMgYWxsb3dzIHVzIHRvCi0gKiBjb21wYXJ0bWVudGFsaXplIHRoZSBkZXBlbmRlbmNpZXMuCi0gKiAKLSAqLwotZmluYWwgY2xhc3MgRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xBU0ggPSAiLyI7Ci0KLQkvKioKLQkgKiBDb3BpZWQgdG8gYXZvaWQgdW5uZWVkZWQgZXh0cmEgZGVwZW5kZW5jeSAocGx1cyBpdCdzIHVuY2xlYXIgd2h5IHRoZQotCSAqIHZhbHVlIGlzIGluIHRoYXQgcGx1Zy1pbikuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTVF9XRUJfTU9EVUxFID0gImpzdC53ZWIiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIC0xIGlmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGhhdmUgdGhlIEpTVCBXZWIgZmFjZXQsIHRoZSB2ZXJzaW9uCi0JICogICAgICAgICBudW1iZXIgb2YgaXQgb3RoZXJ3aXNlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIGZsb2F0IGdldER5bmFtaWNXZWJQcm9qZWN0VmVyc2lvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5ERUZBVUxUX1NFUlZMRVRfVkVSU0lPTjsKLQotCQkvLyBJbiB0aGUgYWJzZW5jZSBvZiBhbnkgZmFjZXQgaW5mb3JtYXRpb24sIGFzc3VtZSB0aGUgaGlnaGVzdCBsZXZlbAotCQlmbG9hdCB2ZXJzaW9uID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5ERUZBVUxUX1NFUlZMRVRfVkVSU0lPTjsKLQkJdHJ5IHsKLQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKGZhY2V0ZWQgIT0gbnVsbCAmJiBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoSlNUX1dFQl9NT0RVTEUpKSB7Ci0JCQkJSVByb2plY3RGYWNldCB3ZWJNb2R1bGVGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChKU1RfV0VCX01PRFVMRSk7Ci0JCQkJaWYgKGZhY2V0ZWQuaGFzUHJvamVjdEZhY2V0KHdlYk1vZHVsZUZhY2V0KSkgewotCQkJCQl2ZXJzaW9uID0gRmxvYXQucGFyc2VGbG9hdChmYWNldGVkLmdldEluc3RhbGxlZFZlcnNpb24od2ViTW9kdWxlRmFjZXQpLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXRoIC0KLQkgKiAgICAgICAgICAgIHRoZSBmdWxsIHBhdGggdG8gYSByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gLSB0aGUgcnVudGltZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBpZiBvbmUgZXhpc3RzLCBudWxsCi0JICogICAgICAgICBvdGhlcndpc2UKLQkgKi8KLQlzdGF0aWMgSVBhdGggZ2V0UnVudGltZVBhdGgoSVBhdGggcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpOwotCi0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlWaXJ0dWFsUmVzb3VyY2VbXSB2aXJ0dWFsUmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpKTsKLQkJaWYgKHZpcnR1YWxSZXNvdXJjZXMgIT0gbnVsbCAmJiB2aXJ0dWFsUmVzb3VyY2VzLmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiB2aXJ0dWFsUmVzb3VyY2VzWzBdLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMKLQkgKi8KLQlzdGF0aWMgSVBhdGggZ2V0V2ViQ29udGVudFJvb3RQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsICYmIGNvbXBvbmVudC5leGlzdHMoKSkgewotCQkJcGF0aCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNEeW5hbWljV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQl0cnkgewotCQkJaWYgKFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZChKU1RfV0VCX01PRFVMRSkpIHsKLQkJCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQlJUHJvamVjdEZhY2V0IHdlYk1vZHVsZUZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEpTVF9XRUJfTU9EVUxFKTsKLQkJCQlpZiAoZmFjZXRlZCAhPSBudWxsICYmIGZhY2V0ZWQuaGFzUHJvamVjdEZhY2V0KHdlYk1vZHVsZUZhY2V0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VQYXRoIC0KLQkgKiAgICAgICAgICAgIHRoZSBmdWxsIHBhdGggdG8gYSByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtzcGFjZQotCSAqIEBwYXJhbSByZWZlcmVuY2UgLQotCSAqICAgICAgICAgICAgdGhlIHJlZmVyZW5jZSBzdHJpbmcgdG8gcmVzb2x2ZQotCSAqIEByZXR1cm4gLSB0aGUgZnVsbCBwYXRoIHdpdGhpbiB0aGUgd29ya3NwYWNlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0JICogICAgICAgICBnaXZlbiByZWZlcmVuY2UgYWNjb3JkaW5nIHRvIHRoZSB2aXJ0dWFsIHBhdGhpbmcgc3VwcG9ydAotCSAqLwotCXN0YXRpYyBJUGF0aCByZXNvbHZlKElQYXRoIGJhc2VQYXRoLCBTdHJpbmcgcmVmZXJlbmNlKSB7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCB8fCBiYXNlUGF0aCA9PSBudWxsIHx8IGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGJhc2VQYXRoLnNlZ21lbnQoMCkpOwotCi0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCUlGaWxlIGJhc2VGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGJhc2VQYXRoKTsKLQkJCUlWaXJ0dWFsUmVzb3VyY2VbXSB2aXJ0dWFsUmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoYmFzZUZpbGUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2aXJ0dWFsUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVBhdGggYmFzZVJ1bnRpbWVQYXRoID0gdmlydHVhbFJlc291cmNlc1tpXS5nZXRSdW50aW1lUGF0aCgpOwotCQkJCUlQYXRoIHJlZmVyZW5jZVJ1bnRpbWVQYXRoID0gbnVsbDsKLQkJCQlpZiAocmVmZXJlbmNlLnN0YXJ0c1dpdGgoU0xBU0gpKSB7Ci0JCQkJCXJlZmVyZW5jZVJ1bnRpbWVQYXRoID0gbmV3IFBhdGgocmVmZXJlbmNlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlZmVyZW5jZVJ1bnRpbWVQYXRoID0gYmFzZVJ1bnRpbWVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQocmVmZXJlbmNlKTsKLQkJCQl9Ci0JCQkJSVZpcnR1YWxGaWxlIHZpcnR1YWxGaWxlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVGaWxlKHByb2plY3QsIHJlZmVyZW5jZVJ1bnRpbWVQYXRoKTsKLQkJCQlpZiAodmlydHVhbEZpbGUgIT0gbnVsbCAmJiB2aXJ0dWFsRmlsZS5leGlzdHMoKSkgewotCQkJCQlJRmlsZVtdIHVuZGVybHlpbmdGaWxlcyA9IHZpcnR1YWxGaWxlLmdldFVuZGVybHlpbmdGaWxlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHVuZGVybHlpbmdGaWxlcy5sZW5ndGg7IGorKykgewotCQkJCQkJaWYgKHVuZGVybHlpbmdGaWxlc1tqXS5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpICYmIHVuZGVybHlpbmdGaWxlc1tqXS5leGlzdHMoKSkgewotCQkJCQkJCXJldHVybiB1bmRlcmx5aW5nRmlsZXNbal0uZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJSVZpcnR1YWxGaWxlIHZpcnR1YWxGaWxlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVGaWxlKHByb2plY3QsIG5ldyBQYXRoKHJlZmVyZW5jZSkpOwotCQkJaWYgKHZpcnR1YWxGaWxlICE9IG51bGwgJiYgdmlydHVhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gdmlydHVhbEZpbGUuZ2V0VW5kZXJseWluZ0ZpbGUoKS5nZXRGdWxsUGF0aCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9GaWxlQ29udGVudENhY2hlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvRmlsZUNvbnRlbnRDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODAyYzc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9GaWxlQ29udGVudENhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuTG9jYXRpb25LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlQ29udGVudENhY2hlIHsKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDYWNoZUVudHJ5IHsKLQkJU3RyaW5nIGNvbnRlbnRzOwotCQlsb25nIG1vZGlmaWNhdGlvblN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCUlQYXRoIHBhdGg7Ci0KLQkJQ2FjaGVFbnRyeShJUGF0aCBwYXRoKSB7Ci0JCQl0aGlzLnBhdGggPSBwYXRoOwotCQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBnZXRNb2RpZmljYXRpb25TdGFtcChwYXRoKTsKLQkJCWNvbnRlbnRzID0gcmVhZENvbnRlbnRzKHBhdGgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKElQYXRoIHBhdGgpIHsKLQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWJvb2xlYW4gaXNTdGFsZSgpIHsKLQkJCWlmIChtb2RpZmljYXRpb25TdGFtcCA9PSBJUmVzb3VyY2UuTlVMTF9TVEFNUCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJbG9uZyBuZXdTdGFtcCA9IGdldE1vZGlmaWNhdGlvblN0YW1wKHBhdGgpOwotCQkJcmV0dXJuIG5ld1N0YW1wID4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBkZXRlY3RDaGFyc2V0KElGaWxlIGZpbGUpIHsKLQkJCWlmIChmaWxlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiBmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQkvLyBvcHRpbWl6ZWQgZGVzY3JpcHRpb24gbG9va3VwLCBtaWdodCBub3Qgc3VjY2VlZAotCQkJCQlkID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBkLmdldENoYXJzZXQoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGdpdmVuIHRoZSBhY2Nlc3NpYmxlIGFuZCBmaWxlCi0JCQkJCS8vIHR5cGUKLQkJCQkJLy8gY2hlY2sgYWJvdmUKLQkJCQl9Ci0JCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNvbnRlbnRzID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IoY29udGVudHMsIGZpbGUuZ2V0TmFtZSgpLCBuZXcgUXVhbGlmaWVkTmFtZVtde0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVH0pOwotCQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGRlc2NyaXB0aW9uLmdldENoYXJzZXQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyB3aWxsIHRyeSB0byBjbGVhbnVwIGluIGZpbmFsbHkKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBvdXQgb2Ygc3luYwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIG5vdCBzdXJlIGhvdyB0byByZWNvdmVyIGF0IHRoaXMgcG9pbnQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0RW5jb2RpbmcoKTsKLQkJfQotCi0JCXByaXZhdGUgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcChJUGF0aCBmaWxlUGF0aCkgewotCQkJSUZpbGUgZiA9IGdldEZpbGUoZmlsZVBhdGgpOwotCQkJaWYgKGYgIT0gbnVsbCAmJiBmLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJcmV0dXJuIGYuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCX0KLQkJCUZpbGUgZmlsZSA9IGZpbGVQYXRoLnRvRmlsZSgpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIGZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCQlyZXR1cm4gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyByZWFkQ29udGVudHMoSVBhdGggZmlsZVBhdGgpIHsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlYWRDb250ZW50czoiICsgZmlsZVBhdGgpOwotCQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCUlGaWxlIGYgPSBnZXRGaWxlKGZpbGVQYXRoKTsKLQkJCQlpZiAoZiAhPSBudWxsICYmIGYuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJU3RyaW5nIGNoYXJzZXQgPSBkZXRlY3RDaGFyc2V0KGYpOwotCQkJCQlpZiAoY2hhcnNldCA9PSBudWxsKSB7Ci0JCQkJCQljaGFyc2V0ID0gUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCk7Ci0JCQkJCX0KLQkJCQkJaXMgPSBmLmdldENvbnRlbnRzKCk7Ci0JCQkJCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIGNoYXJzZXQpOwotCQkJCQljaGFyW10gcmVhZEJ1ZmZlciA9IG5ldyBjaGFyWzgwOTJdOwotCQkJCQlpbnQgbiA9IHJlYWRlci5yZWFkKHJlYWRCdWZmZXIpOwotCQkJCQl3aGlsZSAobiA+IDApIHsKLQkJCQkJCXMuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCQkJbiA9IHJlYWRlci5yZWFkKHJlYWRCdWZmZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIG91dCBvZiBzeW5jCi0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90aGluZyB0byBkbwotCQkJCX0KLQkJCX0KLQkJCWlmIChpcyA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCkuY29ubmVjdChmaWxlUGF0aCwgTG9jYXRpb25LaW5kLkxPQ0FUSU9OLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLmdldFRleHRGaWxlQnVmZmVyKGZpbGVQYXRoLCBMb2NhdGlvbktpbmQuTE9DQVRJT04pOwotCQkJCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCQkJCXMuYXBwZW5kKGJ1ZmZlci5nZXREb2N1bWVudCgpLmdldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5kaXNjb25uZWN0KGZpbGVQYXRoLCBMb2NhdGlvbktpbmQuTE9DQVRJT04sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcy50b1N0cmluZygpOwotCQl9Ci0KLQl9Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0Jc3RhdGljIEZpbGVDb250ZW50Q2FjaGUgaW5zdGFuY2UgPSBuZXcgRmlsZUNvbnRlbnRDYWNoZSgpOwotCi0JcHVibGljIHN0YXRpYyBGaWxlQ29udGVudENhY2hlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBIYXNoTWFwIGZDb250ZW50TWFwOwotCi0JcHJpdmF0ZSBGaWxlQ29udGVudENhY2hlKCkgewotCQlzdXBlcigpOwotCQlmQ29udGVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXAoKSB7Ci0JCXN5bmNocm9uaXplZCAoZkNvbnRlbnRNYXApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkNvbnRlbnRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoZW50cnkuZ2V0VmFsdWUoKSAhPSBudWxsICYmICgoUmVmZXJlbmNlKSBlbnRyeS5nZXRWYWx1ZSgpKS5nZXQoKSA9PSBudWxsKSB7Ci0JCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudHMoSVBhdGggZmlsZVBhdGgpIHsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJnZXRDb250ZW50czoiICsgZmlsZVBhdGgpOwotCQlDYWNoZUVudHJ5IGVudHJ5ID0gbnVsbDsKLQkJT2JqZWN0IG8gPSBmQ29udGVudE1hcC5nZXQoZmlsZVBhdGgpOwotCQlpZiAobyBpbnN0YW5jZW9mIFJlZmVyZW5jZSkgewotCQkJZW50cnkgPSAoQ2FjaGVFbnRyeSkgKChSZWZlcmVuY2UpIG8pLmdldCgpOwotCQl9Ci0JCWlmIChlbnRyeSA9PSBudWxsIHx8IGVudHJ5LmlzU3RhbGUoKSkgewotCQkJaWYgKERFQlVHICYmIGVudHJ5ICE9IG51bGwgJiYgZW50cnkuaXNTdGFsZSgpKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic3RhbGUgY29udGVudHM6IiArIGZpbGVQYXRoKTsKLQkJCWVudHJ5ID0gbmV3IENhY2hlRW50cnkoZmlsZVBhdGgpOwotCQkJc3luY2hyb25pemVkIChmQ29udGVudE1hcCkgewotCQkJCWZDb250ZW50TWFwLnB1dChmaWxlUGF0aCwgbmV3IFNvZnRSZWZlcmVuY2UoZW50cnkpKTsKLQkJCX0KLQkJfQotCQljbGVhbnVwKCk7Ci0JCXJldHVybiBlbnRyeS5jb250ZW50czsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL1plcm9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9aZXJvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NzI0NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL1plcm9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlRleHRSZWdpb25MaXN0SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgWmVyb1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQlwcml2YXRlIGludCBvZmZzZXQgPSAwOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmUGFyZW50RG9jdW1lbnQ7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgWmVyb1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQpIHsKLQkJc3VwZXIoKTsKLQkJZlBhcmVudERvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCW9mZnNldCA9IHN0YXJ0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZ2lvbihJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgaSkgewotCQlyZXR1cm4gb2Zmc2V0IDw9IGkgJiYgaSA8IGdldEVuZE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RGVlcGVzdFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIG9mZnNldCArIGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldEVuZCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dCgpIHsKLQkJcmV0dXJuIGdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJcmV0dXJuIGdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TmV4dCgpIHsKLQkJcmV0dXJuIGdldFBhcmVudERvY3VtZW50KCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE51bWJlck9mUmVnaW9ucygpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb25Db250YWluZXIgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRQYXJlbnREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZQYXJlbnREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2aW91cygpIHsKLQkJcmV0dXJuIG51bGw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQlyZXR1cm4gbnVsbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbkxpc3QgZ2V0UmVnaW9ucygpIHsKLQkJcmV0dXJuIG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGdldFBhcmVudERvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZ2V0RW5kKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0VGV4dEVuZCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBsZW5ndGggaXMgZXF1YWwgdG8gbGVuZ3RoIGlmIHRoZXJlIGlzIG5vIHdoaXRlIHNwYWNlIGF0IHRoZQotCSAqIGVuZCBvZiBhIHJlZ2lvbi4gT3RoZXJ3aXNlIGl0IGlzIHNtYWxsZXIgdGhhbiBsZW5ndGguCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gIlplcm9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24iOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiBvbGRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIG5ld1JlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZChib29sZWFuIGRlbGV0ZWQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmRlZChib29sZWFuIGhhc0VuZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGhhZCB0byBtYWtlIHB1YmxpYywgZHVlIHRvIEFQSSB0cmFuc2l0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5leHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdQcmV2aW91cykgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbnMoSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucykgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBuZXdTdGFydCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0bm9kZSwgU3RyaW5nIGNoYW5nZXMsIGludCBzdGFydCwgaW50IGVuZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9GcmFnbWVudFZhbGlkYXRpb25Ub29scy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0ZyYWdtZW50VmFsaWRhdGlvblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYTk1YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0ZyYWdtZW50VmFsaWRhdGlvblRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQQ29yZVByZWZlcmVuY2VOYW1lczsNCi0NCi0NCi0vKioNCi0gKiBVdGlsaXR5IGNsYXNzIGZvciByZWFkaW5nIGZyYWdtZW50IHZhbGlkYXRpb24gcHJlZmVyZW5jZXMvcHJvcGVydGllcy4NCi0gKiBKU1BGQ29udGVudFByb3BlcnRpZXMgZG9lcyBub3QgcmVzcGVjdCB0aGUgcHJvamVjdCBvdmVycmlkZSBwcmVmZXJlbmNlLg0KLSAqIA0KLSAqLw0KLWNsYXNzIEZyYWdtZW50VmFsaWRhdGlvblRvb2xzIHsNCi0JLyoqDQotCSAqIEBwYXJhbSByZXNvdXJjZQ0KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdG8gcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGEgZnJhZ21lbnQsIHJldHVybmluZyB0aGUNCi0JICogICAgICAgICBwcm9qZWN0LXNwZWNpZmljIHByZWZlcmVuY2Ugb25seSBvZiBwcm9qZWN0LXNwZWNpZmljIHZhbHVlcyBhcmUNCi0JICogICAgICAgICBlbmFibGVkDQotCSAqLw0KLQlzdGF0aWMgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZUZyYWdtZW50KElSZXNvdXJjZSByZXNvdXJjZSkgew0KLQkJU3RyaW5nIHF1YWxpZmllciA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOw0KLQ0KLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7DQotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7DQotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOw0KLQkJfQ0KLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgew0KLQkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdCkuZ2V0Tm9kZShxdWFsaWZpZXIpOw0KLQkJCS8vIGZpcnN0LCBjaGVjayB3aGV0aGVyIHByb2plY3Qgc3BlY2lmaWMgc2V0dGluZ3MgYXJlIHRvIGJlIHVzZWQNCi0JCQlib29sZWFuIHVzZVByb2plY3RTZXR0aW5ncyA9IG5vZGUuZ2V0Qm9vbGVhbihKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVVNFX1BST0pFQ1RfU0VUVElOR1MsIGZhbHNlKTsNCi0JCQlpZiAodXNlUHJvamVjdFNldHRpbmdzKSB7DQotCQkJCS8vIG9ubHkgaWYgc28sIHJldHVybiB0aGF0IHZhbHVlDQotCQkJCXJldHVybiBub2RlLmdldEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFURV9GUkFHTUVOVFMsIHRydWUpOw0KLQkJCX0NCi0JCQkvLyBpZiBub3QsIHJldHVybiB0aGUgd29ya3NwYWNlIHZhbHVlDQotCQl9DQotCQlyZXR1cm4gbmV3IEluc3RhbmNlU2NvcGUoKS5nZXROb2RlKHF1YWxpZmllcikuZ2V0Qm9vbGVhbihKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRFX0ZSQUdNRU5UUywgdHJ1ZSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVwb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNzdjMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5FcnJvckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLS8qCi0gKiBDb3BpZWQgZnJvbSBodG1sLnVpJ3MgSFRNTFZhbGlkYXRpb25SZXBvcnRlciB3aXRoIHNvbWUgbWlub3IgY2xlYW51cAotICogbW9kaWZpY2F0aW9ucwotICovCi1jbGFzcyBIVE1MVmFsaWRhdGlvblJlcG9ydGVyIGltcGxlbWVudHMgVmFsaWRhdGlvblJlcG9ydGVyIHsKLQotCXByaXZhdGUgSVZhbGlkYXRvciBvd25lciA9IG51bGw7Ci0JcHJpdmF0ZSBJUmVwb3J0ZXIgcmVwb3J0ZXIgPSBudWxsOwotCXByaXZhdGUgSUZpbGUgZmlsZSA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE1lc3NhZ2VGYWN0b3J5IGZGYWN0b3J5ID0gbnVsbDsKLQkKLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTFZhbGlkYXRpb25SZXBvcnRlcihJVmFsaWRhdG9yIG93bmVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJZkZhY3RvcnkgPSBuZXcgTWVzc2FnZUZhY3RvcnkoZmlsZSAhPSBudWxsID8gZmlsZS5nZXRQcm9qZWN0KCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0KLQkJaWYgKHRoaXMucmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy5yZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLm93bmVyLCB0aGlzLmZpbGUpOwotCQl9Ci0JfQotCi0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydChWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwgfHwgdGhpcy5maWxlID09IG51bGwgfHwgbWVzc2FnZS5nZXRTZXZlcml0eSgpID09IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkKLQkJCXJldHVybjsKLQkJSU1lc3NhZ2UgbWVzID0gdHJhbnNsYXRlTWVzc2FnZShtZXNzYWdlKTsKLQotCQlpZiAodGhpcy5yZXBvcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcy5vd25lciwgbWVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRyYW5zbGF0ZSBWYWxpZGF0aW9uTWVzc2FnZSB0byBJTWVzc2FnZSBhbmQgZ2VuZXJhdGUgcmVzdWx0IGxvZwotCSAqLwotCXByaXZhdGUgSU1lc3NhZ2UgdHJhbnNsYXRlTWVzc2FnZShWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWludCBzZXZlcml0eSA9IElNZXNzYWdlLkxPV19TRVZFUklUWTsKLQkJc3dpdGNoIChtZXNzYWdlLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLklORk9STUFUSU9OIDoKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJSU1lc3NhZ2UgbWVzID0gbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2ZXJpdHksIG1lc3NhZ2UuZ2V0TWVzc2FnZSgpLCB0aGlzLmZpbGUpOwotCQltZXMuc2V0T2Zmc2V0KG1lc3NhZ2UuZ2V0T2Zmc2V0KCkpOwotCQltZXMuc2V0TGVuZ3RoKG1lc3NhZ2UuZ2V0TGVuZ3RoKCkpOwotCQlpZiAodGhpcy5tb2RlbCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGZsYXRNb2RlbCA9IHRoaXMubW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoZmxhdE1vZGVsICE9IG51bGwpIHsKLQkJCQlpbnQgbGluZSA9IGZsYXRNb2RlbC5nZXRMaW5lT2ZPZmZzZXQobWVzc2FnZS5nZXRPZmZzZXQoKSk7Ci0JCQkJbWVzLnNldExpbmVObyhsaW5lICsgMSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcG9ydChFcnJvckluZm8gaW5mbykgewotCQlyZXBvcnQoZkZhY3RvcnkuY3JlYXRlTWVzc2FnZShpbmZvKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEFjdGlvblZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEFjdGlvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTg1ZmJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BBY3Rpb25WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UYWdsaWJUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDExVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5EZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkRlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5Qcm9wZXJ0eUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQ2hlY2tzIGZvcjogbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzICYgdW5kZWZpbmVkIGF0dHJpYnV0ZXMgaW4ganNwCi0gKiBhY3Rpb24gdGFncyBzdWNoIGFzIGpzcCBkaXJlY3RpdmVzIGFuZCBqc3AgY3VzdG9tIHRhZ3MgYXMgd2VsbCBhcyBub24tZW1wdHkKLSAqIGlubGluZSBqc3AgYWN0aW9uIHRhZ3MKLSAqLwotcHVibGljIGNsYXNzIEpTUEFjdGlvblZhbGlkYXRvciBleHRlbmRzIEpTUFZhbGlkYXRvciB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQlwcml2YXRlIElWYWxpZGF0b3IgZk1lc3NhZ2VPcmlnaW5hdG9yOwotCXByaXZhdGUgSVByZWZlcmVuY2VzU2VydmljZSBmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQlwcml2YXRlIElTY29wZUNvbnRleHRbXSBmU2NvcGVzID0gbnVsbDsKLQlwcml2YXRlIGludCBmU2V2ZXJpdHlNaXNzaW5nUmVxdWlyZWRBdHRyaWJ1dGUgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCXByaXZhdGUgaW50IGZTZXZlcml0eU5vbkVtcHR5SW5saW5lVGFnID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCXByaXZhdGUgaW50IGZTZXZlcml0eVVua25vd25BdHRyaWJ1dGUgPSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JcHJpdmF0ZSBpbnQgZlNldmVyaXR5VW5leHBlY3RlZFJ1bnRpbWVFeHByZXNzaW9uID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCi0JcHJpdmF0ZSBIYXNoU2V0IGZUYWdsaWJQcmVmaXhlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0VMSWdub3JlZCA9IGZhbHNlOwotCi0JcHVibGljIEpTUEFjdGlvblZhbGlkYXRvcigpIHsKLQkJdGhpcy5mTWVzc2FnZU9yaWdpbmF0b3IgPSB0aGlzOwotCX0KLQotCXB1YmxpYyBKU1BBY3Rpb25WYWxpZGF0b3IoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy5mTWVzc2FnZU9yaWdpbmF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTm9uRW1wdHlJbmxpbmVUYWcoSURPTUVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gY21FbGVtZW50RGVjbCwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChjbUVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkgJiYgZWxlbWVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BBY3Rpb25WYWxpZGF0b3JfMCwgZWxlbWVudC5nZXROb2RlTmFtZSgpKTsKLQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eU5vbkVtcHR5SW5saW5lVGFnLCBtc2dUZXh0LCBmaWxlKTsKLQkJCWludCBzdGFydCA9IGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBsZW5ndGggPSBlbGVtZW50LmdldFN0YXJ0RW5kT2Zmc2V0KCkgLSBzdGFydDsKLQkJCWludCBsaW5lTm8gPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBhbiBhdHRyaWJ1dGUgZm9yIHJ1bnRpbWUgZXhwcmVzc2lvbnMKLQkgKiBAcGFyYW0gYSBUaGUgYXR0cmlidXRlIHRvIGNoZWNrIGZvciBydW50aW1lIGV4cHJlc3Npb25zCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgY29udGFpbnMgYSBydW50aW1lIGV4cHJlc3Npb24sIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1J1bnRpbWVWYWx1ZShJRE9NQXR0ciBhKSB7Ci0JCUlUZXh0UmVnaW9uIHZhbHVlID0gYS5nZXRWYWx1ZVJlZ2lvbigpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJSXRlcmF0b3IgaXQgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSB2YWx1ZSkuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSAoKElUZXh0UmVnaW9uKSBpdC5uZXh0KCkpLmdldFR5cGUoKTsKLQkJCQlpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfT1BFTikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgRUwgc2hvdWxkIGJlIGlnbm9yZWQuIENoZWNrcwotCSAqIDxvbD4KLQkgKiAgPGxpPkpTUCB2ZXJzaW9uPC9saT4KLQkgKiAJPGxpPlBhZ2UgZGlyZWN0aXZlIGlzRUxJZ25vcmVkPC9saT4KLQkgKiAgPGxpPkRlcGxveW1lbnQgZGVzY3JpcHRvcidzIGVsLWlnbm9yZWQ8L2xpPgotCSAqIDwvb2w+Ci0JICogQHJldHVybiB0cnVlIGlmIEVMIHNob3VsZCBiZSBpZ25vcmVkLCBmYWxzZSBvdGhlcndpc2UuIElmIHRoZSBKU1AgdmVyc2lvbiBpcyA8IDIuMCwgRUwgaXMgaWdub3JlZCBieSBkZWZhdWx0Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRWxJZ25vcmVkKElQYXRoIHBhdGgsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5nZXRJbnN0YW5jZSgpLmdldEpTUFZlcnNpb24ocGF0aCkgPCAyLjBmKQotCQkJcmV0dXJuIHRydWU7Ci0JCVN0cmluZyBkaXJlY3RpdmVJc0VMSWdub3JlZCA9ICgoUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsKSgoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCkuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcykpKS5nZXRFbElnbm9yZWQoKTsKLQkJLy8gaXNFTElnbm9yZWQgZGlyZWN0aXZlIGZvdW5kCi0JCWlmIChkaXJlY3RpdmVJc0VMSWdub3JlZCAhPSBudWxsKQotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihkaXJlY3RpdmVJc0VMSWdub3JlZCkuYm9vbGVhblZhbHVlKCk7Ci0JCS8vIENoZWNrIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIGVsLWlnbm9yZWQKLQkJUHJvcGVydHlHcm91cFtdIGdyb3VwcyA9IERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5nZXRJbnN0YW5jZSgpLmdldFByb3BlcnR5R3JvdXBzKHBhdGgpOwotCQlpZiAoZ3JvdXBzLmxlbmd0aCA+IDApCi0JCQlyZXR1cm4gZ3JvdXBzWzBdLmlzRUxpZ25vcmVkKCk7Ci0JCS8vIEpTUCB2ZXJzaW9uID49IDIuMCBkZWZhdWx0cyB0byBldmFsdWF0aW5nIEVMCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tSZXF1aXJlZEF0dHJpYnV0ZXMoSURPTUVsZW1lbnQgZWxlbWVudCwgQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gYXR0ck1hcC5pdGVyYXRvcigpOwotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlhdHRyID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGl0Lm5leHQoKTsKLQkJCWlmIChhdHRyLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCUF0dHIgYSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShhdHRyLmdldEF0dHJOYW1lKCkpOwotCQkJCWlmIChhID09IG51bGwpIHsKLQkJCQkJLy8gQXR0cmlidXRlIG1heSBiZSBkZWZpbmVkIHVzaW5nIGEganNwOmF0dHJpYnV0ZSBhY3Rpb24KLQkJCQkJaWYgKCFjaGVja0pTUEF0dHJpYnV0ZUFjdGlvbihlbGVtZW50LCBhdHRyKSkgewotCQkJCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzUsIGF0dHIuZ2V0QXR0ck5hbWUoKSk7Ci0JCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlNaXNzaW5nUmVxdWlyZWRBdHRyaWJ1dGUsIG1zZ1RleHQsIGZpbGUpOwotCQkJCQkJaW50IHN0YXJ0ID0gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJaW50IGxlbmd0aCA9IGVsZW1lbnQuZ2V0U3RhcnRFbmRPZmZzZXQoKSAtIHN0YXJ0OwotCQkJCQkJaW50IGxpbmVObyA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkKLQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgZm9yIGpzcDphdHRyaWJ1dGUgYWN0aW9ucyBvZiA8Y29kZT5lbGVtZW50PC9jb2RlPiB0byBzZWUgaWYgdGhleQotCSAqIHNhdGlzZnkgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSA8Y29kZT5hdHRyPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHdpdGggYSByZXF1aXJlZCBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gYXR0ciBUaGUgcmVxdWlyZWQgYXR0cmlidXRlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIGpzcDphdHRyaWJ1dGUgYWN0aW9uIGhhcyB0aGUgbmFtZSBvZgotCSAqIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUgPGNvZGU+YXR0cjwvY29kZT47IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrSlNQQXR0cmlidXRlQWN0aW9uKElET01FbGVtZW50IGVsZW1lbnQsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cikgewotCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGF0dHIgIT0gbnVsbCkgewotCQkJTm9kZUxpc3QgZWxlbWVudHMgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJqc3A6YXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBuZWVkZWRBdHRyTmFtZSA9IGF0dHIuZ2V0Tm9kZU5hbWUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gKEVsZW1lbnQpIGVsZW1lbnRzLml0ZW0oaSk7Ci0JCQkJLyoKLQkJCQkgKiBHZXQgdGhlIG5hbWUgYXR0cmlidXRlIG9mIGpzcDphdHRyaWJ1dGUgYW5kIGNvbXBhcmUgaXRzCi0JCQkJICogdmFsdWUgdG8gdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSBuYW1lCi0JCQkJICovCi0JCQkJaWYgKGNoaWxkRWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSAmJiBuZWVkZWRBdHRyTmFtZS5lcXVhbHMoY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKSkgey8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja1Vua25vd25BdHRyaWJ1dGVzKElET01FbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBDTU5hbWVkTm9kZU1hcCBjbUF0dHJzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24pIHsKLQkJYm9vbGVhbiBmb3VuZGpzcGF0dHJpYnV0ZSA9IGZhbHNlOwotCQlib29sZWFuIGR5bmFtaWNBdHRyaWJ1dGVzQWxsb3dlZCA9IGZhbHNlOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZWxlbWVudERlY2w7Ci0JCWlmIChkZWNsIGluc3RhbmNlb2YgQ01Ob2RlV3JhcHBlcikKLQkJCWRlY2wgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pICgoQ01Ob2RlV3JhcHBlcikgZGVjbCkuZ2V0T3JpZ2luTm9kZSgpOwotCQlpZiAoZGVjbCBpbnN0YW5jZW9mIFRMREVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJU3RyaW5nIGR5bmFtaWNBdHRyaWJ1dGVzID0gKChUTERFbGVtZW50RGVjbGFyYXRpb24pIGRlY2wpLmdldER5bmFtaWNBdHRyaWJ1dGVzKCk7Ci0JCQlkeW5hbWljQXR0cmlidXRlc0FsbG93ZWQgPSBkeW5hbWljQXR0cmlidXRlcyAhPSBudWxsID8gQm9vbGVhbi52YWx1ZU9mKGR5bmFtaWNBdHRyaWJ1dGVzKS5ib29sZWFuVmFsdWUoKSA6IGZhbHNlOwotCQl9Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJQXR0ciBhID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkZWMgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21BdHRycy5nZXROYW1lZEl0ZW0oYS5nZXROYW1lKCkpOwotCQkJaWYgKGFkZWMgPT0gbnVsbCkgewotCQkJCS8qCi0JCQkJICogTm8gYXR0ciBkZWNsYXJhdGlvbiB3YXMgZm91bmQuIFRoYXQgaXMsIHRoZSBhdHRyIG5hbWUgaXMKLQkJCQkgKiB1bmRlZmluZWQuIERpc3JlZ2FyZCBpdCBpbmNsdWRlcyBKU1Agc3RydWN0dXJlIG9yIHRoaXMKLQkJCQkgKiBlbGVtZW50IHN1cHBvcnRzIGR5bmFtaWMgYXR0cmlidXRlcwotCQkJCSAqLwotCQkJCWlmICghaGFzSlNQUmVnaW9uKCgoSURPTU5vZGUpIGEpLmdldE5hbWVSZWdpb24oKSkgJiYgZlNldmVyaXR5VW5rbm93bkF0dHJpYnV0ZSAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQkJaWYgKCFkeW5hbWljQXR0cmlidXRlc0FsbG93ZWQpIHsKLQkJCQkJCVN0cmluZyBtc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl82LCBhLmdldE5hbWUoKSk7Ci0JCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlVbmtub3duQXR0cmlidXRlLCBtc2dUZXh0LCBmaWxlKTsKLQkJCQkJCWludCBzdGFydCA9ICgoSURPTUF0dHIpIGEpLmdldE5hbWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCQkJaW50IGxlbmd0aCA9ICgoSURPTUF0dHIpIGEpLmdldE5hbWVSZWdpb25FbmRPZmZzZXQoKSAtIHN0YXJ0OwotCQkJCQkJaW50IGxpbmVObyA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3VuZGpzcGF0dHJpYnV0ZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGZTZXZlcml0eVVuZXhwZWN0ZWRSdW50aW1lRXhwcmVzc2lvbiAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUgJiYgYWRlYyBpbnN0YW5jZW9mIFRMREF0dHJpYnV0ZURlY2xhcmF0aW9uKSB7Ci0JCQkJCS8vIFRoZSBhdHRyaWJ1dGUgY2Fubm90IGhhdmUgYSBydW50aW1lIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbgotCQkJCQlpZiAoIWlzVHJ1ZSgoKFRMREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhZGVjKS5nZXRSdGV4cHJ2YWx1ZSgpKSkgewotCQkJCQkJSURPTUF0dHIgYXR0ciA9IChJRE9NQXR0cikgYTsKLQkJCQkJCWlmKGNoZWNrUnVudGltZVZhbHVlKGF0dHIpICYmICFmSXNFTElnbm9yZWQpIHsKLQkJCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUEFjdGlvblZhbGlkYXRvcl8xLCBhLmdldE5hbWUoKSk7Ci0JCQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZlNldmVyaXR5VW5leHBlY3RlZFJ1bnRpbWVFeHByZXNzaW9uLCBtc2csIGZpbGUpOwotCQkJCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGF0dHIuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQkJCQlpbnQgc3RhcnQgPSBhdHRyLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQkJCQlpbnQgbGVuZ3RoID0gcmVnaW9uICE9IG51bGwgPyByZWdpb24uZ2V0VGV4dExlbmd0aCgpIDogMDsKLQkJCQkJCQlpbnQgbGluZU5vID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZm91bmRqc3BhdHRyaWJ1dGU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVHJ1ZShTdHJpbmcgdmFsdWUpIHsKLQkJcmV0dXJuIEpTUDExVExETmFtZXMuVFJVRS5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSB8fCBKU1AxMVRMRE5hbWVzLllFUy5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci5jbGVhbnVwKHJlcG9ydGVyKTsKLQkJZlRhZ2xpYlByZWZpeGVzLmNsZWFyKCk7Ci0JfQotCi0JaW50IGdldE1lc3NhZ2VTZXZlcml0eShTdHJpbmcga2V5KSB7Ci0JCWludCBzZXYgPSBmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldEludChQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSLCBrZXksIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgZlNjb3Blcyk7Ci0JCXN3aXRjaCAoc2V2KSB7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SIDoKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyA6Ci0JCQkJcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuSU5GT1JNQVRJT04gOgotCQkJCXJldHVybiBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSA6Ci0JCQkJcmV0dXJuIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRTsKLQkJfQotCQlyZXR1cm4gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0YXJ0VGFnTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkcikgewotCQlTdHJpbmcgbmFtZSA9IG5ldyBTdHJpbmcoKTsKLQkJSVRleHRSZWdpb25MaXN0IHN1YlJlZ2lvbnMgPSBzZHIuZ2V0UmVnaW9ucygpOwotCQlpZiAoc3ViUmVnaW9ucy5zaXplKCkgPiAyKSB7Ci0JCQlJVGV4dFJlZ2lvbiBzdWJSZWdpb24gPSBzdWJSZWdpb25zLmdldCgwKTsKLQkJCWlmIChzdWJSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQkJc3ViUmVnaW9uID0gc3ViUmVnaW9ucy5nZXQoMSk7Ci0JCQkJaWYgKHN1YlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJbmFtZSA9IHNkci5nZXRUZXh0KHN1YlJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXByaXZhdGUgSGFzaFNldCBnZXRUYWdsaWJQcmVmaXhlcyhJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChmVGFnbGliUHJlZml4ZXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBhZGQgYWxsIHJlc2VydmVkIHByZWZpeGVzCi0JCQlmVGFnbGliUHJlZml4ZXMuYWRkKCJqc3AiKTsgLy8kTk9OLU5MUy0xJAotCQkJZlRhZ2xpYlByZWZpeGVzLmFkZCgianNweCIpOyAvLyROT04tTkxTLTEkCi0JCQlmVGFnbGliUHJlZml4ZXMuYWRkKCJqYXZhIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZUYWdsaWJQcmVmaXhlcy5hZGQoImphdmF4Iik7IC8vJE5PTi1OTFMtMSQgCi0JCQlmVGFnbGliUHJlZml4ZXMuYWRkKCJzZXJ2bGV0Iik7IC8vJE5PTi1OTFMtMSQgCi0JCQlmVGFnbGliUHJlZml4ZXMuYWRkKCJzdW4iKTsgLy8kTk9OLU5MUy0xJCAKLQkJCWZUYWdsaWJQcmVmaXhlcy5hZGQoInN1bnciKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBhZGQgYWxsIHRhZ2xpYiBwcmVmaXhlcwotCQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgbWFuYWdlciA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIoZG9jdW1lbnQpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCUxpc3QgdHJhY2tlcnMgPSBtYW5hZ2VyLmdldFRhZ2xpYlRyYWNrZXJzKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IHRyYWNrZXJzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJVGFnbGliVHJhY2tlciB0cmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKHRyYWNrZXIuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKSA9PSAwKQotCQkJCQkJY29udGludWU7Ci0JCQkJCVN0cmluZyBwcmVmaXggPSB0cmFja2VyLmdldFByZWZpeCgpOwotCQkJCQlmVGFnbGliUHJlZml4ZXMuYWRkKHByZWZpeCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmVGFnbGliUHJlZml4ZXM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0pTUFJlZ2lvbihJVGV4dFJlZ2lvbiBjb250YWluZXIpIHsKLQkJaWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIGNvbnRhaW5lcikuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiB8fCAoaXNOZXN0ZWRUYWdOYW1lKHJlZ2lvblR5cGUpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGVkVGFnTmFtZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmVmZXJlbmNlcyhJRmlsZSBmaWxlKSB7Ci0JCWZTY29wZXMgPSBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0KLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCVByb2plY3RTY29wZSBwcm9qZWN0U2NvcGUgPSBuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChwcm9qZWN0U2NvcGUuZ2V0Tm9kZShQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSKS5nZXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9VU0VfUFJPSkVDVF9TRVRUSU5HUywgZmFsc2UpKSB7Ci0JCQkJZlNjb3BlcyA9IG5ldyBJU2NvcGVDb250ZXh0W117cHJvamVjdFNjb3BlLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQkJfQotCQl9Ci0KLQkJZlNldmVyaXR5TWlzc2luZ1JlcXVpcmVkQXR0cmlidXRlID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX01JU1NJTkdfUkVRVUlSRURfQVRUUklCVVRFKTsKLQkJZlNldmVyaXR5Tm9uRW1wdHlJbmxpbmVUYWcgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTk9OX0VNUFRZX0lOTElORV9UQUcpOwotCQlmU2V2ZXJpdHlVbmtub3duQXR0cmlidXRlID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX1VOS05PV05fQVRUUklCVVRFKTsKLQkJZlNldmVyaXR5VW5leHBlY3RlZFJ1bnRpbWVFeHByZXNzaW9uID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX1VORVhQRUNURURfUlRFWFBSVkFMVUUpOwotCX0KLQotCXZvaWQgcGVyZm9ybVZhbGlkYXRpb24oSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWZUYWdsaWJQcmVmaXhlcy5jbGVhcigpOwotCQlpbnQgbGVuZ3RoID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JCXBlcmZvcm1WYWxpZGF0aW9uKGYsIHJlcG9ydGVyLCBtb2RlbCwgbmV3IFJlZ2lvbigwLCBsZW5ndGgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtVmFsaWRhdGlvbihJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIElSZWdpb24gdmFsaWRhdGVSZWdpb24pIHsKLQkJbG9hZFByZWZlcmVuY2VzKGYpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHNEb2MgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlmSXNFTElnbm9yZWQgPSBpc0VsSWdub3JlZChmLmdldEZ1bGxQYXRoKCksIG1vZGVsKTsKLQkJLy8gaXRlcmF0ZSBhbGwgZG9jdW1lbnQgcmVnaW9ucwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHNEb2MuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQodmFsaWRhdGVSZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQl3aGlsZSAocmVnaW9uICE9IG51bGwgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgJiYgKHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpIDw9ICh2YWxpZGF0ZVJlZ2lvbi5nZXRPZmZzZXQoKSArIHZhbGlkYXRlUmVnaW9uLmdldExlbmd0aCgpKSkpIHsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCS8vIG9ubHkgY2hlY2tpbmcgZGlyZWN0aXZlcwotCQkJCXByb2Nlc3NEaXJlY3RpdmUocmVwb3J0ZXIsIGYsIG1vZGVsLCByZWdpb24pOwotCQkJCWZUYWdsaWJQcmVmaXhlcy5jbGVhcigpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCS8vIGFuZCBqc3AgdGFncwotCQkJCVN0cmluZyB0YWdOYW1lID0gZ2V0U3RhcnRUYWdOYW1lKHJlZ2lvbik7Ci0JCQkJaW50IGNvbG9uUG9zaXRpb24gPSB0YWdOYW1lLmluZGV4T2YoJzonKTsKLQkJCQlpZiAoY29sb25Qb3NpdGlvbiA+IC0xKSB7Ci0JCQkJCS8vIGdldCB0YWcncyBwcmVmaXggYW5kIGNoZWNrIGlmIGl0J3MgcmVhbGx5IGEganNwIGFjdGlvbgotCQkJCQkvLyB0YWcKLQkJCQkJU3RyaW5nIHByZWZpeCA9IHRhZ05hbWUuc3Vic3RyaW5nKDAsIGNvbG9uUG9zaXRpb24pOwotCQkJCQlpZiAoZ2V0VGFnbGliUHJlZml4ZXMoc0RvYykuY29udGFpbnMocHJlZml4KSkKLQkJCQkJCXByb2Nlc3NEaXJlY3RpdmUocmVwb3J0ZXIsIGYsIG1vZGVsLCByZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCXJlZ2lvbiA9IHJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQkJdW5sb2FkUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0RpcmVjdGl2ZShJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24pIHsKLQkJSW5kZXhlZFJlZ2lvbiBpciA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCWlmIChpciBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBpcjsKLQkJCU1vZGVsUXVlcnkgcXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJCWlmIChxdWVyeSAhPSBudWxsKSB7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gY21FbGVtZW50ID0gcXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQkJaWYgKGNtRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCUNNTmFtZWROb2RlTWFwIGNtQXR0cmlidXRlcyA9IG51bGw7Ci0KLQkJCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGFsbEF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQkJCUxpc3Qgbm9kZXMgPSBxdWVyeS5nZXRBdmFpbGFibGVDb250ZW50KGVsZW1lbnQsIGNtRWxlbWVudCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotCQkJCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNtQXR0cmlidXRlcyA9IGFsbEF0dHJpYnV0ZXM7Ci0KLQkJCQkJYm9vbGVhbiBmb3VuZGpzcGF0dHJpYnV0ZSA9IGNoZWNrVW5rbm93bkF0dHJpYnV0ZXMoZWxlbWVudCwgY21FbGVtZW50LCBjbUF0dHJpYnV0ZXMsIHJlcG9ydGVyLCBmaWxlLCBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgZG9jdW1lbnRSZWdpb24pOwotCQkJCQkvLyByZXF1aXJlZCBhdHRyaWJ1dGVzIGNvdWxkIGJlIGhpZGRlbiBpbiBqc3AgcmVnaW9ucyBpbgotCQkJCQkvLyB0YWdzLCBzbyBpZiBqc3AgcmVnaW9ucyB3ZXJlIGRldGVjdGVkLCBkbyBub3QgY2hlY2sgZm9yCi0JCQkJCS8vIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcwotCQkJCQlpZiAoIWZvdW5kanNwYXR0cmlidXRlICYmIGZTZXZlcml0eU1pc3NpbmdSZXF1aXJlZEF0dHJpYnV0ZSAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpCi0JCQkJCQljaGVja1JlcXVpcmVkQXR0cmlidXRlcyhlbGVtZW50LCBjbUF0dHJpYnV0ZXMsIHJlcG9ydGVyLCBmaWxlLCBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgZG9jdW1lbnRSZWdpb24pOwotCi0JCQkJCWlmIChmU2V2ZXJpdHlOb25FbXB0eUlubGluZVRhZyAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpCi0JCQkJCQljaGVja05vbkVtcHR5SW5saW5lVGFnKGVsZW1lbnQsIGNtRWxlbWVudCwgcmVwb3J0ZXIsIGZpbGUsIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5sb2FkUHJlZmVyZW5jZXMoKSB7Ci0JCWZQcmVmZXJlbmNlc1NlcnZpY2UgPSBudWxsOwotCQlmU2NvcGVzID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUZpbGUoSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmIChERUJVRykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHZhbGlkYXRpbmc6ICIgKyBmKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZik7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQlwZXJmb3JtVmFsaWRhdGlvbihmLCByZXBvcnRlciwgc01vZGVsKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEJhdGNoVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQmF0Y2hWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJjMjg3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQmF0Y2hWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5EZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUuUHJvcGVydHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotCi0vKioKLSAqIFBlcmZvcm1zIEpTUCB2YWxpZGF0aW9uIHRhc2tzIGZvciBiYXRjaCB2YWxpZGF0aW9uLiBUaGUgaW5kaXZpZHVhbAotICogdmFsaWRhdG9yIGNsYXNzZXMgd2lsbCBzdGlsbCBiZSB1c2VkIGZvciBzb3VyY2UgdmFsaWRhdGlvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpTUEJhdGNoVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9ySm9iLCBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0JY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCi0JCXByaXZhdGUgTGlzdCBmRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByaXZhdGUgSVJlcG9ydGVyIGZSZXBvcnRlciA9IG51bGw7Ci0KLQkJcHVibGljIEpTUEZpbGVWaXNpdG9yKElSZXBvcnRlciByZXBvcnRlcikgewotCQkJZlJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JCX0KLQotCQlmaW5hbCBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkJcmV0dXJuIChJRmlsZVtdKSBmRmlsZXMudG9BcnJheShuZXcgSUZpbGVbZkZpbGVzLnNpemUoKV0pOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJLy8gY2hlY2sgdmFsaWRhdGlvbgotCQkJaWYgKGZSZXBvcnRlci5pc0NhbmNlbGxlZCgpKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCi0JCQkJaWYgKGlzSlNQVHlwZShwcm94eS5nZXROYW1lKCkpICYmIHByb3h5LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOwotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBKU1BWYWxpZGF0b3IgYWRkaW5nIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZkZpbGVzLmFkZChmaWxlKTsKLQotCQkJCQkvLyBkb24ndCBzZWFyY2ggZGVlcGVyIGZvciBmaWxlcwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBCb29sZWFuLnZhbHVlT2YoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B2YWxpZGF0b3IiKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSURfSlNQX0NPUkUgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTGlzdCBvZiBJUmVzb3VyY2VzIHRoYXQgdGhlIGN1cnJlbnRseSB2YWxpZGF0aW5nIGZpbGUgZGVwZW5kcyB1cG9uCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGZEZXBlbmRzT247Ci0KLQkvKioKLQkgKiBHZXRzIGN1cnJlbnQgdmFsaWRhdGlvbiBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gY3VycmVudCBwcm9qZWN0Ci0JICogKHdoaWNoIGlzIGJhc2VkIG9uIGN1cnJlbnQgZG9jdW1lbnQpCi0JICogCi0JICogQHJldHVybiBQcm9qZWN0Q29uZmlndXJhdGlvbgotCSAqLwotCXN0YXRpYyBwcml2YXRlIFByb2plY3RDb25maWd1cmF0aW9uIGdldFByb2plY3RDb25maWd1cmF0aW9uKElGaWxlIGZpbGUpIHsKLQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJvamVjdENvbmZpZ3VyYXRpb24gPSBudWxsOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvamVjdENvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBwcm9qZWN0Q29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdmFsaWRhdG9yIGlzIGVuYWJsZWQgYWNjb3JkaW5nIGluIFZhbGlkYXRpb24gcHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gdm1kCi0JICogQHJldHVybgotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzQmF0Y2hWYWxpZGF0b3JQcmVmZXJlbmNlRW5hYmxlZChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQkJUHJvamVjdENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGdldFByb2plY3RDb25maWd1cmF0aW9uKGZpbGUpOwotCQlpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YSBtZXRhZGF0YSA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YShKU1BCYXRjaFZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCkpOwotCQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCAmJiBtZXRhZGF0YSAhPSBudWxsKSB7Ci0JCQkJaWYgKCFjb25maWd1cmF0aW9uLmlzQnVpbGRFbmFibGVkKG1ldGFkYXRhKSAmJiAhY29uZmlndXJhdGlvbi5pc01hbnVhbEVuYWJsZWQobWV0YWRhdGEpKQotCQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0JU3RyaW5nIGZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzW10gPSBudWxsOwotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBmQ29udGVudFR5cGVzID0gbnVsbDsKLQotCXByaXZhdGUgSlNQRGlyZWN0aXZlVmFsaWRhdG9yIGZKU1BEaXJlY3RpdmVWYWxpZGF0b3IgPSBuZXcgSlNQRGlyZWN0aXZlVmFsaWRhdG9yKHRoaXMpOwotCi0JcHJpdmF0ZSBKU1BFTFZhbGlkYXRvciBmSlNQRUxWYWxpZGF0b3IgPSBuZXcgSlNQRUxWYWxpZGF0b3IodGhpcyk7Ci0KLQlwcml2YXRlIElDb250ZW50VHlwZSBmSlNQRkNvbnRlbnRUeXBlID0gbnVsbDsKLQotCXByaXZhdGUgSlNQSmF2YVZhbGlkYXRvciBmSlNQSmF2YVZhbGlkYXRvciA9IG5ldyBKU1BKYXZhVmFsaWRhdG9yKHRoaXMpOwotCi0JcHJpdmF0ZSBKU1BBY3Rpb25WYWxpZGF0b3IgZkpTUEFjdGlvblZhbGlkYXRvciA9IG5ldyBKU1BBY3Rpb25WYWxpZGF0b3IodGhpcyk7Ci0KLQl2b2lkIGFkZERlcGVuZHNPbihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJZkRlcGVuZHNPbi5hZGQocmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJZkpTUERpcmVjdGl2ZVZhbGlkYXRvci5jbGVhbnVwKHJlcG9ydGVyKTsKLQkJZkpTUEVMVmFsaWRhdG9yLmNsZWFudXAocmVwb3J0ZXIpOwotCQlmSlNQSmF2YVZhbGlkYXRvci5jbGVhbnVwKHJlcG9ydGVyKTsKLQkJZkpTUEFjdGlvblZhbGlkYXRvci5jbGVhbnVwKHJlcG9ydGVyKTsKLQl9Ci0KLQotCXZvaWQgZG9WYWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gdXJpcyA9IGhlbHBlci5nZXRVUklzKCk7Ci0JCWlmICh1cmlzLmxlbmd0aCA+IDApIHsKLQkJCUlXb3Jrc3BhY2VSb290IHdzUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJRmlsZSBjdXJyZW50RmlsZSA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQljdXJyZW50RmlsZSA9IHdzUm9vdC5nZXRGaWxlKG5ldyBQYXRoKHVyaXNbaV0pKTsKLQkJCQlpZiAoY3VycmVudEZpbGUgIT0gbnVsbCAmJiBjdXJyZW50RmlsZS5leGlzdHMoKSkgewotCQkJCQlpZiAoc2hvdWxkVmFsaWRhdGUoY3VycmVudEZpbGUpICYmIGZyYWdtZW50Q2hlY2soY3VycmVudEZpbGUpKSB7Ci0JCQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIGN1cnJlbnRGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSkpOwotCQkJCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzc2FnZSk7Ci0JCQkJCQl2YWxpZGF0ZUZpbGUoY3VycmVudEZpbGUsIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInZhbGlkYXRpbmc6IFsiICsgdXJpc1tpXSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIGlmIHVyaXNbXSBsZW5ndGggMCAtPiB2YWxpZGF0ZSgpIGdldHMgY2FsbGVkIGZvciBlYWNoIHByb2plY3QKLQkJCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBJV29ya2JlbmNoQ29udGV4dCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoKElXb3JrYmVuY2hDb250ZXh0KSBoZWxwZXIpLmdldFByb2plY3QoKTsKLQotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUEJhdGNoVmFsaWRhdG9yXzAsIHByb2plY3QuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3NhZ2UpOwotCi0JCQkJSlNQRmlsZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBKU1BGaWxlVmlzaXRvcihyZXBvcnRlcik7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gY29sbGVjdCBhbGwganNwIGZpbGVzIGZvciB0aGUgcHJvamVjdAotCQkJCQlwcm9qZWN0LmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChERUJVRykKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCUlGaWxlW10gZmlsZXMgPSB2aXNpdG9yLmdldEZpbGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGggJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCk7IGkrKykgewotCQkJCQlpZiAoc2hvdWxkVmFsaWRhdGUoZmlsZXNbaV0pICYmIGZyYWdtZW50Q2hlY2soZmlsZXNbaV0pKSB7Ci0KLQkJCQkJCW1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIGZpbGVzW2ldLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSkpOwotCQkJCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzc2FnZSk7Ci0KLQkJCQkJCXZhbGlkYXRlRmlsZShmaWxlc1tpXSwgcmVwb3J0ZXIpOwotCQkJCQl9Ci0JCQkJCWlmIChERUJVRykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidmFsaWRhdGluZzogWyIgKyBmaWxlc1tpXSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBmaWxlIGlzIGEganNwIGZyYWdtZW50IG9yIG5vdC4gSWYgc28sIGNoZWNrIGlmIHRoZSBmcmFnbWVudAotCSAqIHNob3VsZCBiZSB2YWxpZGF0ZWQgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBBc3N1bWVzIHNob3VsZFZhbGlkYXRlIHdhcyBhbHJlYWR5IGNhbGxlZCBvbiBmaWxlIHNvIGl0Ci0JICogICAgICAgICAgICBzaG91bGQgbm90IGJlIG51bGwgYW5kIGRvZXMgZXhpc3QKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGZpbGUgaXMgYSBmcmFnbWVudCBhbmQgaXQgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQsCi0JICogICAgICAgICB0cnVlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmcmFnbWVudENoZWNrKElGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiBzaG91bGRWYWxpZGF0ZSA9IHRydWU7Ci0JCS8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIHBvc3NpYmx5IGEganNwIGZyYWdtZW50Ci0JCWlmIChnZXRKU1BGQ29udGVudFR5cGUoKS5pc0Fzc29jaWF0ZWRXaXRoKGZpbGUuZ2V0TmFtZSgpKSkgewotCQkJLy8gZ2V0IHByZWZlcmVuY2UgZm9yIHZhbGlkYXRlIGpzcCBmcmFnbWVudHMKLQkJCWJvb2xlYW4gc2hvdWxkVmFsaWRhdGVGcmFnbWVudHMgPSBGcmFnbWVudFZhbGlkYXRpb25Ub29scy5zaG91bGRWYWxpZGF0ZUZyYWdtZW50KGZpbGUpOwotCQkJLyoKLQkJCSAqIGlmIGpzcCBmcmFnbWVudHMgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQsIGNoZWNrIGlmIGZpbGUgaXMKLQkJCSAqIHJlYWxseSBqc3AgZnJhZ21lbnQKLQkJCSAqLwotCQkJaWYgKCFzaG91bGRWYWxpZGF0ZUZyYWdtZW50cykgewotCQkJCWJvb2xlYW4gaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQoZmlsZSk7Ci0JCQkJc2hvdWxkVmFsaWRhdGUgPSAhaXNGcmFnbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2hvdWxkVmFsaWRhdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBKU1AgZnJhZ21lbnQgY29udGVudCB0eXBlCi0JICogCi0JICogQHJldHVybiBqc3BmIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGdldEpTUEZDb250ZW50VHlwZSgpIHsKLQkJaWYgKGZKU1BGQ29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJZkpTUEZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGZKU1BGQ29udGVudFR5cGU7Ci0JfQotCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyKSB7Ci0JCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBJV29ya2JlbmNoQ29udGV4dCkgewotCQkJLyoKLQkJCSAqIFVzZSBhIHNpbmdsZSBidWlsZCBydWxlIHdoZW4gcnVubmluZyBiYXRjaCB2YWxpZGF0aW9uLgotCQkJICovCi0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkuYnVpbGRSdWxlKCk7Ci0JCX0KLQkJLyoKLQkJICogRm9yIG90aGVyIGtpbmRzIG9mIHZhbGlkYXRpb24sIHVzZSBubyBzcGVjaWZpYyBydWxlCi0JCSAqLwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGxpc3Qgb2YgY29udGVudCB0eXBlcyB0aGlzIHZpc2l0b3IgaXMgaW50ZXJlc3RlZCBpbgotCSAqIAotCSAqIEByZXR1cm4gQWxsIEpTUC1yZWxhdGVkIGNvbnRlbnQgdHlwZXMKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZVtdIGdldFZhbGlkQ29udGVudFR5cGVzKCkgewotCQlpZiAoZkNvbnRlbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQkvLyBjdXJyZW50bHkgImhhcmQtY29kZWQiIHRvIGJlIGpzcCAmIGpzcGYKLQkJCWZDb250ZW50VHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW117UGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCksIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVCl9OwotCQkJaWYgKGZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzICE9IG51bGwpIHsKLQkJCQlMaXN0IGFsbFR5cGVzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZDb250ZW50VHlwZXMpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDb250ZW50VHlwZSB0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoZkFkZGl0aW9uYWxDb250ZW50VHlwZXNJRHNbaV0pOwotCQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCQlhbGxUeXBlcy5hZGQodHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZkNvbnRlbnRUeXBlcyA9IChJQ29udGVudFR5cGVbXSkgYWxsVHlwZXMudG9BcnJheShuZXcgSUNvbnRlbnRUeXBlW2FsbFR5cGVzLnNpemUoKV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBmQ29udGVudFR5cGVzOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgZmlsZSBpcyBqc3AgZnJhZ21lbnQgb3Igbm90IChkb2VzIGEgZGVlcCwgaW5kZXB0aCBjaGVjaywKLQkgKiBsb29raW5nIGludG8gY29udGVudHMgb2YgZmlsZSkKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYXNzdW1lcyBmaWxlIGlzIG5vdCBudWxsIGFuZCBleGlzdHMKLQkgKiBAcmV0dXJuIHRydWUgaWYgZmlsZSBpcyBqc3AgZnJhZ21lbnQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZyYWdtZW50KElGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiBpc0ZyYWdtZW50ID0gZmFsc2U7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCS8vIGl0IGNhbiBiZSBudWxsCi0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCQlpcyA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQljb250ZW50RGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihpcywgZmlsZS5nZXROYW1lKCksIG5ldyBRdWFsaWZpZWROYW1lW117SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUfSk7Ci0JCQl9Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmlsZUN0SWQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpOwotCQkJCWlzRnJhZ21lbnQgPSAoZmlsZUN0SWQgIT0gbnVsbCAmJiBDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQuZXF1YWxzKGZpbGVDdElkKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSwgYXNzdW1lIGl0J3MgaW52YWxpZCBKU1AKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUsIGFzc3VtZSBpdCdzIGludmFsaWQgSlNQCi0JCX0KLQkJZmluYWxseSB7Ci0JCQkvKgotCQkJICogbXVzdCBjbG9zZSBpbnB1dCBzdHJlYW0gaW4gY2FzZSBvdGhlcnMgbmVlZCBpdAotCQkJICogKElGaWxlLmdldENvbnRlbnRzKCkgcmVxdWlyZW1lbnQgYXMgd2VsbCkKLQkJCSAqLwotCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdCBzdXJlIGhvdyB0byByZWNvdmVyIGF0IHRoaXMgcG9pbnQKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGlzRnJhZ21lbnQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGZpbGVOYW1lIGlzIHNvbWUgdHlwZSBvZiBKU1AgKGluY2x1ZGluZyBKU1AgZnJhZ21lbnRzKQotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBmaWxlbmFtZSBpbmRpY2F0ZXMgc29tZSB0eXBlIG9mIEpTUCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSlNQVHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCUlDb250ZW50VHlwZVtdIHR5cGVzID0gZ2V0VmFsaWRDb250ZW50VHlwZXMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IHR5cGVzLmxlbmd0aCAmJiAhdmFsaWQpIHsKLQkJCXZhbGlkID0gdHlwZXNbaV0uaXNBc3NvY2lhdGVkV2l0aChmaWxlTmFtZSk7Ci0JCQkrK2k7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtVmFsaWRhdGlvbihJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKQotCQkJZkpTUEphdmFWYWxpZGF0b3IucGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIG1vZGVsKTsKLQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKQotCQkJZkpTUERpcmVjdGl2ZVZhbGlkYXRvci5wZXJmb3JtVmFsaWRhdGlvbihmLCByZXBvcnRlciwgbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQlpZiAoIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpCi0JCQlmSlNQRUxWYWxpZGF0b3IucGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKQotCQkJZkpTUEFjdGlvblZhbGlkYXRvci5wZXJmb3JtVmFsaWRhdGlvbihmLCByZXBvcnRlciwgbW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uI3NldEluaXRpYWxpemF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZkFkZGl0aW9uYWxDb250ZW50VHlwZXNJRHMgPSBuZXcgU3RyaW5nWzBdOwotCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZyAmJiBkYXRhLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZkFkZGl0aW9uYWxDb250ZW50VHlwZXNJRHMgPSBTdHJpbmdVdGlscy51bnBhY2soZGF0YS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJRmlsZSBmaWxlKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGZpbGU7Ci0JCWRvIHsKLQkJCWlmIChyZXNvdXJjZS5pc0Rlcml2ZWQoKSB8fCByZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgfHwgIXJlc291cmNlLmlzQWNjZXNzaWJsZSgpIHx8IHJlc291cmNlLmdldE5hbWUoKS5jaGFyQXQoMCkgPT0gJy4nKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJfQotCQl3aGlsZSAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5QUk9KRUNUKSA9PSAwKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWRvVmFsaWRhdGUoaGVscGVyLCByZXBvcnRlcik7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgb25lIGZpbGUuIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIGhhcyBKU1AgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0Jdm9pZCB2YWxpZGF0ZUZpbGUoSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXRyeSB7Ci0JCQlmLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGdldCBKU1AgbW9kZWwgb24gYmVoYWxmIG9mIGFsbCBKU1AgdmFsaWRhdG9ycwotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmKTsKLQkJCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSAmJiBtb2RlbCAhPSBudWxsKSB7Ci0JCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcywgZik7Ci0JCQkJcGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIG1vZGVsKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIGZpbmFsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlKb2IgY3VycmVudEpvYiA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkuY3VycmVudEpvYigpOwotCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSA9IG51bGw7Ci0JCWlmIChjdXJyZW50Sm9iICE9IG51bGwpIHsKLQkJCXJ1bGUgPSBjdXJyZW50Sm9iLmdldFJ1bGUoKTsKLQkJfQotCQlJV29ya3NwYWNlUnVubmFibGUgdmFsaWRhdGlvblJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlkb1ZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwotCQkJCX0KLQkJCQljYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lEX0pTUF9DT1JFLCAwLCBQTFVHSU5fSURfSlNQX0NPUkUsIGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlKYXZhQ29yZS5ydW4odmFsaWRhdGlvblJ1bm5hYmxlLCBydWxlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVmFsaWRhdGlvbkV4Y2VwdGlvbikgewotCQkJCXRocm93IChWYWxpZGF0aW9uRXhjZXB0aW9uKSBlLmdldENhdXNlKCk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5FUlJPUl9BTkRfV0FSTklORywgZS5nZXRNZXNzYWdlKCkpLCBlKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0JCWZpbmFsIFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKLQkJZmluYWwgSVJlcG9ydGVyIHJlcG9ydGVyID0gcmVzdWx0LmdldFJlcG9ydGVyKG1vbml0b3IpOwotCQkKLQkJaWYocmVzdWx0LmdldERlcGVuZHNPbigpICE9IG51bGwpIHsKLQkJCWZEZXBlbmRzT24gPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KHJlc3VsdC5nZXREZXBlbmRzT24oKSkpOwotCQl9Ci0JCWVsc2UgewotCQkJZkRlcGVuZHNPbiA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJCi0JCS8vIGFkZCB3ZWIueG1sIGFzIGEgZGVwZW5kZW5jeQotCQlhZGREZXBlbmRzT24oRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0V2ViWE1MKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpKTsKLQotCQkvLyBMaXN0IHJlbGV2YW50IEpTUCAyLjAgcHJlbHVkZXMvY29kYXMgYXMgZGVwZW5kZW5jaWVzCi0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlQcm9wZXJ0eUdyb3VwW10gcHJvcGVydHlHcm91cHMgPSBEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRQcm9wZXJ0eUdyb3VwcyhyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm9wZXJ0eUdyb3Vwcy5sZW5ndGg7IGorKykgewotCQkJSVBhdGhbXSBwcmVsdWRlcyA9IHByb3BlcnR5R3JvdXBzW2pdLmdldEluY2x1ZGVQcmVsdWRlKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWx1ZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWRkRGVwZW5kc09uKHdvcmtzcGFjZVJvb3QuZ2V0RmlsZShwcmVsdWRlc1tpXSkpOwotCQkJfQotCQkJSVBhdGhbXSBjb2RhcyA9IHByb3BlcnR5R3JvdXBzW2pdLmdldEluY2x1ZGVDb2RhKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvZGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWRkRGVwZW5kc09uKHdvcmtzcGFjZVJvb3QuZ2V0RmlsZShjb2Rhc1tpXSkpOwotCQkJfQotCQl9Ci0JCQotCQlJV29ya3NwYWNlUnVubmFibGUgdmFsaWRhdGlvblJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlpZiAoZnJhZ21lbnRDaGVjaygoSUZpbGUpIHJlc291cmNlKSkgewotCQkJCQl2YWxpZGF0ZUZpbGUoKElGaWxlKSByZXNvdXJjZSwgcmVwb3J0ZXIpOwotCQkJCX0KLQkJCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSAoSVJlc291cmNlW10pIGZEZXBlbmRzT24udG9BcnJheShuZXcgSVJlc291cmNlW2ZEZXBlbmRzT24uc2l6ZSgpXSk7Ci0JCQkJcmVzdWx0LnNldERlcGVuZHNPbihyZXNvdXJjZXMpOwotCQkJCWZEZXBlbmRzT24uY2xlYXIoKTsKLQkJCX0KLQkJfTsKLQkJSm9iIGN1cnJlbnRKb2IgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpLmN1cnJlbnRKb2IoKTsKLQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSBudWxsOwotCQlpZiAoY3VycmVudEpvYiAhPSBudWxsKSB7Ci0JCQlydWxlID0gY3VycmVudEpvYi5nZXRSdWxlKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCUphdmFDb3JlLnJ1bih2YWxpZGF0aW9uUnVubmFibGUsIHJ1bGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQ29udGVudFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUENvbnRlbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxM2QxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQ29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyB2YWxpZGF0b3IgdmFsaWRhdGVzIHRoZSBjb250ZW50cyBvZiB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBKU1AsIGxpa2UKLSAqIHRoZSBIVE1MIHJlZ2lvbnMgaW4gYSBKU1Agd2l0aCBjb250ZW50IHR5cGU9InRleHQvaHRtbCIKLSAqLwotcHVibGljIGNsYXNzIEpTUENvbnRlbnRWYWxpZGF0b3IgZXh0ZW5kcyBKU1BWYWxpZGF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0pBVkFfU1VOX0NPTV9KU1BfUEFHRSA9ICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxucyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlNfSlNQID0gInhtbG5zOmpzcCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElDb250ZW50VHlwZSBmSlNQRkNvbnRlbnRUeXBlID0gbnVsbDsKLQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGZpbGUgaXMgYSBqc3AgZnJhZ21lbnQgb3Igbm90LiBJZiBzbywgY2hlY2sgaWYgdGhlIGZyYWdtZW50Ci0JICogc2hvdWxkIGJlIHZhbGlkYXRlZCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIEFzc3VtZXMgc2hvdWxkVmFsaWRhdGUgd2FzIGFscmVhZHkgY2FsbGVkIG9uIGZpbGUgc28gaXQKLQkgKiAgICAgICAgICAgIHNob3VsZCBub3QgYmUgbnVsbCBhbmQgZG9lcyBleGlzdAotCSAqIEByZXR1cm4gZmFsc2UgaWYgZmlsZSBpcyBhIGZyYWdtZW50IGFuZCBpdCBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCwKLQkgKiAgICAgICAgIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZyYWdtZW50Q2hlY2soSUZpbGUgZmlsZSkgewotCQlib29sZWFuIHNob3VsZFZhbGlkYXRlID0gdHJ1ZTsKLQkJLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgcG9zc2libHkgYSBqc3AgZnJhZ21lbnQKLQkJaWYgKGdldEpTUEZDb250ZW50VHlwZSgpLmlzQXNzb2NpYXRlZFdpdGgoZmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkvLyBnZXQgcHJlZmVyZW5jZSBmb3IgdmFsaWRhdGUganNwIGZyYWdtZW50cwotCQkJYm9vbGVhbiBzaG91bGRWYWxpZGF0ZUZyYWdtZW50cyA9IEZyYWdtZW50VmFsaWRhdGlvblRvb2xzLnNob3VsZFZhbGlkYXRlRnJhZ21lbnQoZmlsZSk7Ci0JCQkvKgotCQkJICogaWYganNwIGZyYWdtZW50cyBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCwgY2hlY2sgaWYgZmlsZSBpcwotCQkJICogcmVhbGx5IGpzcCBmcmFnbWVudAotCQkJICovCi0JCQlpZiAoIXNob3VsZFZhbGlkYXRlRnJhZ21lbnRzKSB7Ci0JCQkJYm9vbGVhbiBpc0ZyYWdtZW50ID0gaXNGcmFnbWVudChmaWxlKTsKLQkJCQlzaG91bGRWYWxpZGF0ZSA9ICFpc0ZyYWdtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBzaG91bGRWYWxpZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIEpTUCBmcmFnbWVudCBjb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuIGpzcGYgY29udGVudCB0eXBlCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0SlNQRkNvbnRlbnRUeXBlKCkgewotCQlpZiAoZkpTUEZDb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlmSlNQRkNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUEZSQUdNRU5UKTsKLQkJfQotCQlyZXR1cm4gZkpTUEZDb250ZW50VHlwZTsKLQl9Ci0KLQkvKgotCSAqIENvcGllZCBmcm9tIEhUTUxWYWxpZGF0b3IKLQkgKi8KLQlwcml2YXRlIEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgZ2V0UmVwb3J0ZXIoSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJRE9NTW9kZWwgbW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBIVE1MVmFsaWRhdGlvblJlcG9ydGVyKHRoaXMsIHJlcG9ydGVyLCBmaWxlLCBtb2RlbCk7Ci0JfQotCi0JLyoKLQkgKiBDb3BpZWQgZnJvbSBIVE1MVmFsaWRhdG9yCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc0hUTUxGZWF0dXJlKElET01Eb2N1bWVudCBkb2N1bWVudCkgewotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGFkYXB0ZXIuaGFzRmVhdHVyZShIVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzLkhUTUwpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgZmlsZSBpcyBqc3AgZnJhZ21lbnQgb3Igbm90IChkb2VzIGEgZGVlcCwgaW5kZXB0aCBjaGVjaywKLQkgKiBsb29raW5nIGludG8gY29udGVudHMgb2YgZmlsZSkKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYXNzdW1lcyBmaWxlIGlzIG5vdCBudWxsIGFuZCBleGlzdHMKLQkgKiBAcmV0dXJuIHRydWUgaWYgZmlsZSBpcyBqc3AgZnJhZ21lbnQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZyYWdtZW50KElGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiBpc0ZyYWdtZW50ID0gZmFsc2U7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCS8vIGl0IGNhbiBiZSBudWxsCi0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCQlpcyA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQljb250ZW50RGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihpcywgZmlsZS5nZXROYW1lKCksIG5ldyBRdWFsaWZpZWROYW1lW117SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUfSk7Ci0JCQl9Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmlsZUN0SWQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpOwotCQkJCWlzRnJhZ21lbnQgPSAoZmlsZUN0SWQgIT0gbnVsbCAmJiBDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQuZXF1YWxzKGZpbGVDdElkKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSwgYXNzdW1lIGl0J3MgaW52YWxpZCBKU1AKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUsIGFzc3VtZSBpdCdzIGludmFsaWQgSlNQCi0JCX0KLQkJZmluYWxseSB7Ci0JCQkvKgotCQkJICogbXVzdCBjbG9zZSBpbnB1dCBzdHJlYW0gaW4gY2FzZSBvdGhlcnMgbmVlZCBpdAotCQkJICogKElGaWxlLmdldENvbnRlbnRzKCkgcmVxdWlyZW1lbnQgYXMgd2VsbCkKLQkJCSAqLwotCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdCBzdXJlIGhvdyB0byByZWNvdmVyIGF0IHRoaXMgcG9pbnQKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGlzRnJhZ21lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MSlNQKElET01Eb2N1bWVudCBkb2N1bWVudCkgewotCQlFbGVtZW50IHJvb3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJcmV0dXJuIHJvb3QgIT0gbnVsbCAmJiAocm9vdC5oYXNBdHRyaWJ1dGUoWE1MTlNfSlNQKSB8fCBIVFRQX0pBVkFfU1VOX0NPTV9KU1BfUEFHRS5lcXVhbHMocm9vdC5nZXRBdHRyaWJ1dGUoWE1MTlMpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKElGaWxlIGZpbGUsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSURPTU1vZGVsIG1vZGVsLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJYm9vbGVhbiBpc1hNTEpTUCA9IGlzWE1MSlNQKGRvY3VtZW50KTsKLQkJYm9vbGVhbiBoYXNIVE1MRmVhdHVyZSA9IGhhc0hUTUxGZWF0dXJlKGRvY3VtZW50KTsKLQotCQlpZiAoaGFzSFRNTEZlYXR1cmUgJiYgIWlzWE1MSlNQKSB7Ci0JCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCQlWYWxpZGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKFZhbGlkYXRpb25BZGFwdGVyKSBmYWN0b3J5LmFkYXB0KGRvY3VtZW50KTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlIVE1MVmFsaWRhdGlvblJlcG9ydGVyIHJlcCA9IGdldFJlcG9ydGVyKHJlcG9ydGVyLCBmaWxlLCBtb2RlbCk7Ci0JCQkJcmVwLmNsZWFyKCk7Ci0JCQkJYWRhcHRlci5zZXRSZXBvcnRlcihyZXApOwotCQkJCWFkYXB0ZXIudmFsaWRhdGUoZG9jdW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmICghaGFzSFRNTEZlYXR1cmUgJiYgaXNYTUxKU1ApIHsKLQkJCVZhbGlkYXRvciB4bWxWYWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yKCk7Ci0JCQl4bWxWYWxpZGF0b3IudmFsaWRhdGUoZmlsZSwga2luZCwgc3RhdGUsIG1vbml0b3IpOwotCQl9Ci0JfQotCi0KLQkvKgotCSAqIE1vc3RseSBjb3BpZWQgZnJvbSBIVE1MVmFsaWRhdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSURPTU1vZGVsIG1vZGVsKSB7Ci0JCWlmIChmaWxlID09IG51bGwgfHwgbW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJLy8gVGhpcyB2YWxpZGF0b3IgY3VycmVudGx5IG9ubHkgaGFuZGxlcyB2YWxpZGF0aW5nIEhUTUwgY29udGVudCBpbgotCQkvLyBKU1AKLQkJYm9vbGVhbiBoYXNYTUxGZWF0dXJlID0gaXNYTUxKU1AoZG9jdW1lbnQpOwotCQlib29sZWFuIGhhc0hUTUxGZWF0dXJlID0gaGFzSFRNTEZlYXR1cmUoZG9jdW1lbnQpOwotCQlpZiAoaGFzSFRNTEZlYXR1cmUgJiYgIWhhc1hNTEZlYXR1cmUpIHsKLQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJCVZhbGlkYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoVmFsaWRhdGlvbkFkYXB0ZXIpIGZhY3RvcnkuYWRhcHQoZG9jdW1lbnQpOwotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJCUhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwID0gZ2V0UmVwb3J0ZXIocmVwb3J0ZXIsIGZpbGUsIG1vZGVsKTsKLQkJCXJlcC5jbGVhcigpOwotCQkJYWRhcHRlci5zZXRSZXBvcnRlcihyZXApOwotCQkJYWRhcHRlci52YWxpZGF0ZShkb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwotCQlmaW5hbCBJUmVwb3J0ZXIgcmVwb3J0ZXIgPSByZXN1bHQuZ2V0UmVwb3J0ZXIobW9uaXRvcik7Ci0KLQkJaWYgKGZyYWdtZW50Q2hlY2soKElGaWxlKSByZXNvdXJjZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSAmJiBtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLCByZXNvdXJjZSk7Ci0JCQkJCXZhbGlkYXRlKChJRmlsZSkgcmVzb3VyY2UsIGtpbmQsIHN0YXRlLCBtb25pdG9yLCAoSURPTU1vZGVsKSBtb2RlbCwgcmVwb3J0ZXIpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUZpbGUoSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGZyYWdtZW50Q2hlY2soZikpIHsKLQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGYpOwotCQkJCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSAmJiBtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLCBmKTsKLQkJCQkJdmFsaWRhdGUocmVwb3J0ZXIsIGYsIChJRE9NTW9kZWwpIG1vZGVsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQRGlyZWN0aXZlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQRGlyZWN0aXZlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MTljNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUERpcmVjdGl2ZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5GYWNldE1vZHVsZUNvcmVTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSUphclJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUTERSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnRGlyUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYlJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklVUkxSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5UYWdsaWJJbmRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkpTUDIwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LklSZWdpb25Db21wYXJpYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIENoZWNrcyBmb3I6IC0gZHVwbGljYXRlIHRhZ2xpYiBwcmVmaXggdmFsdWVzIGFuZCByZXNlcnZlZCB0YWdsaWIgcHJlZml4Ci0gKiB2YWx1ZXMgaW4gdGhlIHNhbWUgZmlsZQotICovCi1wdWJsaWMgY2xhc3MgSlNQRGlyZWN0aXZlVmFsaWRhdG9yIGV4dGVuZHMgSlNQVmFsaWRhdG9yIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUiA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuVVMpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHZhbGlkYXRvciIpKS5ib29sZWFuVmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJVmFsaWRhdG9yIGZNZXNzYWdlT3JpZ2luYXRvcjsKLQlwcml2YXRlIElFY2xpcHNlUHJlZmVyZW5jZXMgZlByZWZlcmVuY2VzID0gbnVsbDsKLQotCXByaXZhdGUgSVByZWZlcmVuY2VzU2VydmljZSBmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQlwcml2YXRlIEhhc2hNYXAgZlByZWZpeFZhbHVlUmVnaW9uVG9Eb2N1bWVudFJlZ2lvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZlByb2plY3QgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmUmVzZXJ2ZWRQcmVmaXhlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBJU2NvcGVDb250ZXh0W10gZlNjb3BlcyA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlNldmVyaXR5SW5jbHVkZUZpbGVNaXNzaW5nID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlNldmVyaXR5SW5jbHVkZUZpbGVOb3RTcGVjaWZpZWQgPSAtMTsKLQlwcml2YXRlIGludCBmU2V2ZXJpdHlTdXBlckNsYXNzTm90Rm91bmQgPSAtMTsKLQlwcml2YXRlIGludCBmU2V2ZXJpdHlUYWdkaXJVbnJlc29sdmFibGVVUkkgPSAtMTsKLQlwcml2YXRlIGludCBmU2V2ZXJpdHlUYWdsaWJEdXBsaWNhdGVQcmVmaXhXaXRoRGlmZmVyZW50VVJJcyA9IC0xOwotCi0JcHJpdmF0ZSBpbnQgZlNldmVyaXR5VGFnbGliRHVwbGljYXRlUHJlZml4V2l0aFNhbWVVUklzID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlNldmVyaXR5VGFnbGliTWlzc2luZ1ByZWZpeCA9IC0xOwotCi0JcHJpdmF0ZSBpbnQgZlNldmVyaXR5VGFnbGliTWlzc2luZ1VSSSA9IC0xOwotCi0KLQlwcml2YXRlIGludCBmU2V2ZXJpdHlUYWdsaWJVbnJlc29sdmFibGVVUkkgPSAtMTsKLQotCXByaXZhdGUgSGFzaE1hcCBmVGFnbGliUHJlZml4ZXNJblVzZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgSlNQRGlyZWN0aXZlVmFsaWRhdG9yKCkgewotCQlpbml0UmVzZXJ2ZWRQcmVmaXhlcygpOwotCQlmTWVzc2FnZU9yaWdpbmF0b3IgPSB0aGlzOwotCX0KLQotCXB1YmxpYyBKU1BEaXJlY3RpdmVWYWxpZGF0b3IoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJaW5pdFJlc2VydmVkUHJlZml4ZXMoKTsKLQkJdGhpcy5mTWVzc2FnZU9yaWdpbmF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogUmVjb3JkIHRoYXQgdGhlIGN1cnJlbnRseSB2YWxpZGF0aW5nIHJlc291cmNlIGRlcGVuZHMgb24gdGhlIGdpdmVuCi0JICogZmlsZS4gT25seSBwb3NzaWJsZSBkdXJpbmcgYmF0Y2ggKG5vdCBzb3VyY2UpIHZhbGlkYXRpb24uCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKi8KLQl2b2lkIGFkZERlcGVuZHNPbihJUmVzb3VyY2UgZmlsZSkgewotCQlpZiAoZk1lc3NhZ2VPcmlnaW5hdG9yIGluc3RhbmNlb2YgSlNQQmF0Y2hWYWxpZGF0b3IpIHsKLQkJCSgoSlNQQmF0Y2hWYWxpZGF0b3IpIGZNZXNzYWdlT3JpZ2luYXRvcikuYWRkRGVwZW5kc09uKGZpbGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIuY2xlYW51cChyZXBvcnRlcik7Ci0JCWZUYWdsaWJQcmVmaXhlc0luVXNlLmNsZWFyKCk7Ci0JCWZQcmVmaXhWYWx1ZVJlZ2lvblRvRG9jdW1lbnRSZWdpb25NYXAuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29sbGVjdFRhZ2xpYlByZWZpeChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiwgU3RyaW5nIHRhZ2xpYlByZWZpeCkgewotCQlmUHJlZml4VmFsdWVSZWdpb25Ub0RvY3VtZW50UmVnaW9uTWFwLnB1dCh2YWx1ZVJlZ2lvbiwgZG9jdW1lbnRSZWdpb24pOwotCi0JCU9iamVjdCBvID0gZlRhZ2xpYlByZWZpeGVzSW5Vc2UuZ2V0KHRhZ2xpYlByZWZpeCk7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCS8vIHByZWZpeCBkb2Vzbid0IGV4aXN0LCByZW1lbWJlciBpdAotCQkJZlRhZ2xpYlByZWZpeGVzSW5Vc2UucHV0KHRhZ2xpYlByZWZpeCwgdmFsdWVSZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCByZWdpb25MaXN0ID0gbnVsbDsKLQkJCS8vIGFscmVhZHkgYSBMaXN0Ci0JCQlpZiAobyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQlyZWdpb25MaXN0ID0gKExpc3QpIG87Ci0JCQl9Ci0JCQkvKgotCQkJICogYSBzaW5nbGUgdmFsdWUgcmVnaW9uLCBjcmVhdGUgYSBuZXcgTGlzdCBhbmQgYWRkIHByZXZpb3VzCi0JCQkgKiB2YWx1ZVJlZ2lvbgotCQkJICovCi0JCQllbHNlIHsKLQkJCQlyZWdpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJlZ2lvbkxpc3QuYWRkKG8pOwotCQkJCWZUYWdsaWJQcmVmaXhlc0luVXNlLnB1dCh0YWdsaWJQcmVmaXgsIHJlZ2lvbkxpc3QpOwotCQkJfQotCQkJcmVnaW9uTGlzdC5hZGQodmFsdWVSZWdpb24pOwotCQl9Ci0JfQotCi0JaW50IGdldE1lc3NhZ2VTZXZlcml0eShTdHJpbmcga2V5KSB7Ci0JCWludCBzZXYgPSBmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldEludChQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSLCBrZXksIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgZlNjb3Blcyk7Ci0JCXN3aXRjaCAoc2V2KSB7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SIDoKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyA6Ci0JCQkJcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuSU5GT1JNQVRJT04gOgotCQkJCXJldHVybiBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSA6Ci0JCQkJcmV0dXJuIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRTsKLQkJfQotCQlyZXR1cm4gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCX0KLQlwcml2YXRlIHZvaWQgaW5pdFJlc2VydmVkUHJlZml4ZXMoKSB7Ci0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgianNwIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZlJlc2VydmVkUHJlZml4ZXMucHV0KCJqc3B4IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZlJlc2VydmVkUHJlZml4ZXMucHV0KCJqYXZhIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZlJlc2VydmVkUHJlZml4ZXMucHV0KCJqYXZheCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQlmUmVzZXJ2ZWRQcmVmaXhlcy5wdXQoInNlcnZsZXQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJZlJlc2VydmVkUHJlZml4ZXMucHV0KCJzdW4iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJZlJlc2VydmVkUHJlZml4ZXMucHV0KCJzdW53IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVzZXJ2ZWRUYWdsaWJQcmVmaXgoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZSZXNlcnZlZFByZWZpeGVzLmdldChuYW1lKSAhPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZFByZWZlcmVuY2VzKElGaWxlIGZpbGUpIHsKLQkJZlNjb3BlcyA9IG5ldyBJU2NvcGVDb250ZXh0W117bmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCk7Ci0JCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJUHJvamVjdFNjb3BlIHByb2plY3RTY29wZSA9IG5ldyBQcm9qZWN0U2NvcGUoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQkJaWYgKHByb2plY3RTY29wZS5nZXROb2RlKFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIpLmdldEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1VTRV9QUk9KRUNUX1NFVFRJTkdTLCBmYWxzZSkpIHsKLQkJCQlmU2NvcGVzID0gbmV3IElTY29wZUNvbnRleHRbXXtwcm9qZWN0U2NvcGUsIG5ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JCQl9Ci0JCX0KLQotCQlmU2V2ZXJpdHlJbmNsdWRlRmlsZU1pc3NpbmcgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX0ZJTEVfTk9UX0ZPVU5EKTsKLQkJZlNldmVyaXR5SW5jbHVkZUZpbGVOb3RTcGVjaWZpZWQgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX05PX0ZJTEVfU1BFQ0lGSUVEKTsKLQkJZlNldmVyaXR5VGFnbGliRHVwbGljYXRlUHJlZml4V2l0aERpZmZlcmVudFVSSXMgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfRFVQTElDQVRFX1BSRUZJWEVTX0RJRkZFUkVOVF9VUklTKTsKLQkJZlNldmVyaXR5VGFnbGliRHVwbGljYXRlUHJlZml4V2l0aFNhbWVVUklzID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX0RVUExJQ0FURV9QUkVGSVhFU19TQU1FX1VSSVMpOwotCQlmU2V2ZXJpdHlUYWdsaWJNaXNzaW5nUHJlZml4ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX01JU1NJTkdfUFJFRklYKTsKLQkJZlNldmVyaXR5VGFnbGliTWlzc2luZ1VSSSA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9NSVNTSU5HX1VSSV9PUl9UQUdESVIpOwotCQlmU2V2ZXJpdHlUYWdsaWJVbnJlc29sdmFibGVVUkkgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfVU5SRVNPTFZBQkxFX1VSSV9PUl9UQUdESVIpOwotCQlmU2V2ZXJpdHlUYWdkaXJVbnJlc29sdmFibGVVUkkgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfVU5SRVNPTFZBQkxFX1VSSV9PUl9UQUdESVIpOwotCQlmU2V2ZXJpdHlTdXBlckNsYXNzTm90Rm91bmQgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9QQUdFX1NVUEVSQ0xBU1NfTk9UX0ZPVU5EKTsKLQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtVmFsaWRhdGlvbihJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc0RvYykgewotCQlsb2FkUHJlZmVyZW5jZXMoZik7Ci0JCQotCQkKLQkJc2V0UHJvamVjdChmLmdldFByb2plY3QoKSk7Ci0JCS8qCi0JCSAqIHdoZW4gdmFsaWRhdGluZyBhbiBlbnRpcmUgZmlsZSBuZWVkIHRvIGNsZWFyIGR1cGVzIG9yIGVsc2UgeW91J3JlCi0JCSAqIGNvbXBhcmluZyBiZXR3ZWVuIGZpbGVzCi0JCSAqLwotCQlmUHJlZml4VmFsdWVSZWdpb25Ub0RvY3VtZW50UmVnaW9uTWFwLmNsZWFyKCk7Ci0JCWZUYWdsaWJQcmVmaXhlc0luVXNlLmNsZWFyKCk7Ci0KLQkJSVJlZ2lvbkNvbXBhcmlibGUgY29tcGFyZXIgPSBudWxsOwotCQlpZiAoc0RvYyBpbnN0YW5jZW9mIElSZWdpb25Db21wYXJpYmxlKQotCQkJY29tcGFyZXIgPSAoSVJlZ2lvbkNvbXBhcmlibGUpIHNEb2M7Ci0JCQotCQkvLyBpdGVyYXRlIGFsbCBkb2N1bWVudCByZWdpb25zCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gc0RvYy5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAocmVnaW9uICE9IG51bGwgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCS8vIG9ubHkgY2hlY2tpbmcgZGlyZWN0aXZlcwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJcHJvY2Vzc0RpcmVjdGl2ZShyZXBvcnRlciwgZiwgc0RvYywgcmVnaW9uKTsKLQkJCX0KLQkJCS8vIHJlcXVpcmVzIHRhZyBuYW1lLCBhdHRyaWJ1dGUsIGVxdWFscywgYW5kIHZhbHVlCi0JCQllbHNlIGlmIChjb21wYXJlciAhPSBudWxsICYmIHJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDQpIHsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gcmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJaWYgKGNvbXBhcmVyLnJlZ2lvbk1hdGNoZXMocmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBuYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgImpzcDppbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcm9jZXNzSW5jbHVkZShyZXBvcnRlciwgZiwgc0RvYywgcmVnaW9uLCBKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfUEFHRSk7Ci0JCQkJfQotCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTU5NTAKLQkJCQllbHNlIGlmIChjb21wYXJlci5yZWdpb25NYXRjaGVzKHJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgMTQsICJqc3A6ZGlyZWN0aXZlLiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvY2Vzc0RpcmVjdGl2ZShyZXBvcnRlciwgZiwgc0RvYywgcmVnaW9uKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCXJlZ2lvbiA9IHJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQotCQlpZiAoIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCXJlcG9ydFRhZ2xpYkR1cGxpY2F0ZVByZWZpeGVzKGYsIHJlcG9ydGVyLCBzRG9jKTsKLQkJfQotCi0JCWZQcmVmaXhWYWx1ZVJlZ2lvblRvRG9jdW1lbnRSZWdpb25NYXAuY2xlYXIoKTsKLQkJZlRhZ2xpYlByZWZpeGVzSW5Vc2UuY2xlYXIoKTsKLQkJc2V0UHJvamVjdChudWxsKTsKLQkJdW5sb2FkUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0RpcmVjdGl2ZShJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc0RvYywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbikgewotCQlTdHJpbmcgZGlyZWN0aXZlTmFtZSA9IGdldERpcmVjdGl2ZU5hbWUoZG9jdW1lbnRSZWdpb24pOwotCi0JCWlmIChkaXJlY3RpdmVOYW1lLmVuZHNXaXRoKCJ0YWdsaWIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzVGFnbGliRGlyZWN0aXZlKHJlcG9ydGVyLCBmaWxlLCBzRG9jLCBkb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAoZGlyZWN0aXZlTmFtZS5lcXVhbHMoImpzcDppbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc0luY2x1ZGUocmVwb3J0ZXIsIGZpbGUsIHNEb2MsIGRvY3VtZW50UmVnaW9uLCBKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfUEFHRSk7Ci0JCX0KLQkJZWxzZSBpZiAoZGlyZWN0aXZlTmFtZS5lbmRzV2l0aCgiaW5jbHVkZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2Nlc3NJbmNsdWRlKHJlcG9ydGVyLCBmaWxlLCBzRG9jLCBkb2N1bWVudFJlZ2lvbiwgSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0ZJTEUpOwotCQl9Ci0JCWVsc2UgaWYgKGRpcmVjdGl2ZU5hbWUuZW5kc1dpdGgoInBhZ2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzUGFnZURpcmVjdGl2ZShyZXBvcnRlciwgZmlsZSwgc0RvYywgZG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbmNsdWRlKElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJSVRleHRSZWdpb24gZmlsZVZhbHVlUmVnaW9uID0gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oZG9jdW1lbnRSZWdpb24sIGF0dHJOYW1lKTsKLQkJLy8gVGhlcmUgaXMgYSBmaWxlIGFuZCBpdCBpc24ndCBhIG5lc3RlZCByZWdpb24gd2hpY2ggY291bGQgY29udGFpbiBhIEpTUCBleHByZXNzaW9uCi0JCWlmIChmaWxlVmFsdWVSZWdpb24gIT0gbnVsbCAmJiAhaGFzTmVzdGVkUmVnaW9uKGZpbGVWYWx1ZVJlZ2lvbikpIHsKLQkJCS8vIGZpbGUgc3BlY2lmaWVkCi0JCQlTdHJpbmcgZmlsZVZhbHVlID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dChmaWxlVmFsdWVSZWdpb24pOwotCQkJZmlsZVZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoZmlsZVZhbHVlKTsKLQotCQkJaWYgKGZpbGVWYWx1ZS5sZW5ndGgoKSA9PSAwICYmIGZTZXZlcml0eUluY2x1ZGVGaWxlTm90U3BlY2lmaWVkICE9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJCS8vIGZpbGUgdmFsdWUgaXMgc3BlY2lmaWVkIGJ1dCBlbXB0eQotCQkJCVN0cmluZyBtc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl8zLCBhdHRyTmFtZSk7Ci0JCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZlNldmVyaXR5SW5jbHVkZUZpbGVOb3RTcGVjaWZpZWQsIG1zZ1RleHQsIGZpbGUpOwotCQkJCWludCBzdGFydCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZpbGVWYWx1ZVJlZ2lvbik7Ci0JCQkJaW50IGxlbmd0aCA9IGZpbGVWYWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJaW50IGxpbmVObyA9IHNEb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8gKyAxKTsKLQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5nZXRJbnN0YW5jZSgpLmdldFVSTE1hcHBpbmcoZmlsZS5nZXRGdWxsUGF0aCgpLCBmaWxlVmFsdWUpID09IG51bGwpIHsKLQkJCQlJUGF0aCB0ZXN0UGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShmaWxlLmdldEZ1bGxQYXRoKCksIGZpbGVWYWx1ZSk7Ci0JCQkJaWYgKHRlc3RQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQlJRmlsZSB0ZXN0RmlsZSA9IGZpbGUuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUodGVzdFBhdGgpOwotCQkJCQlhZGREZXBlbmRzT24odGVzdEZpbGUpOwotCQkJCQlpZiAoIXRlc3RGaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQlpZiAoZlNldmVyaXR5SW5jbHVkZUZpbGVNaXNzaW5nICE9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJCQkJCS8vIEZpbGUgbm90IGZvdW5kCi0JCQkJCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzQsIG5ldyBTdHJpbmdbXXtmaWxlVmFsdWUsIHRlc3RQYXRoLnRvU3RyaW5nKCl9KTsKLQkJCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlJbmNsdWRlRmlsZU1pc3NpbmcsIG1zZ1RleHQsIGZpbGUpOwotCQkJCQkJCWludCBzdGFydCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZpbGVWYWx1ZVJlZ2lvbik7Ci0JCQkJCQkJaW50IGxlbmd0aCA9IGZpbGVWYWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQkJaW50IGxpbmVObyA9IHNEb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8gKyAxKTsKLQkJCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChmaWxlVmFsdWVSZWdpb24gPT0gbnVsbCAmJiBmU2V2ZXJpdHlJbmNsdWRlRmlsZU5vdFNwZWNpZmllZCAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCS8vIGZpbGUgaXMgbm90IHNwZWNpZmllZCBhdCBhbGwKLQkJCVN0cmluZyBtc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl8zLCBhdHRyTmFtZSk7Ci0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlJbmNsdWRlRmlsZU5vdFNwZWNpZmllZCwgbXNnVGV4dCwgZmlsZSk7Ci0JCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGxlbmd0aCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8gKyAxKTsKLQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGRvYwotCSAqIEBwYXJhbSBkb2N1bWVudFJlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzUGFnZURpcmVjdGl2ZShJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uIHN1cGVyY2xhc3NWYWx1ZVJlZ2lvbiA9IGdldEF0dHJpYnV0ZVZhbHVlUmVnaW9uKGRvY3VtZW50UmVnaW9uLCBKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfRVhURU5EUyk7Ci0JCWlmIChzdXBlcmNsYXNzVmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJLy8gZmlsZSBzcGVjaWZpZWQKLQkJCVN0cmluZyBzdXBlcmNsYXNzTmFtZSA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQoc3VwZXJjbGFzc1ZhbHVlUmVnaW9uKTsKLQkJCXN1cGVyY2xhc3NOYW1lID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoc3VwZXJjbGFzc05hbWUpOwotCi0JCQlJVHlwZSBzdXBlckNsYXNzID0gbnVsbDsKLQkJCWlmIChzdXBlcmNsYXNzTmFtZSAhPSBudWxsICYmIHN1cGVyY2xhc3NOYW1lLmxlbmd0aCgpID4gMCAmJiBmUHJvamVjdCAhPSBudWxsICYmIGZQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3VwZXJDbGFzcyA9IGZQcm9qZWN0LmZpbmRUeXBlKHN1cGVyY2xhc3NOYW1lLnRyaW0oKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHN1cGVyQ2xhc3MgPT0gbnVsbCAmJiBmU2V2ZXJpdHlTdXBlckNsYXNzTm90Rm91bmQgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJLy8gc3VwZXJjbGFzcyBub3QgZm91bmQKLQkJCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfOCwgc3VwZXJjbGFzc05hbWUpOwotCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eVN1cGVyQ2xhc3NOb3RGb3VuZCwgbXNnVGV4dCwgZmlsZSk7Ci0JCQkJaW50IHN0YXJ0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoc3VwZXJjbGFzc1ZhbHVlUmVnaW9uKTsKLQkJCQlpbnQgbGVuZ3RoID0gc3VwZXJjbGFzc1ZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQlpbnQgbGluZU5vID0gZG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vICsgMSk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1RhZ2xpYkRpcmVjdGl2ZShJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc0RvYywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbiBwcmVmaXhWYWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHVyaVZhbHVlUmVnaW9uID0gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oZG9jdW1lbnRSZWdpb24sIEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9VUkkpOwotCQlJVGV4dFJlZ2lvbiB0YWdkaXJWYWx1ZVJlZ2lvbiA9IGdldEF0dHJpYnV0ZVZhbHVlUmVnaW9uKGRvY3VtZW50UmVnaW9uLCBKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVEFHRElSKTsKLQkJaWYgKHVyaVZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIFVSSSBpcyBzcGVjaWZpZWQKLQkJCVN0cmluZyB1cmkgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHVyaVZhbHVlUmVnaW9uKTsKLQotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXVyaSA9IFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKHVyaSk7Ci0JCQkJaWYgKHVyaS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJSVRhZ2xpYlJlY29yZCByZWZlcmVuY2UgPSBUYWdsaWJJbmRleC5yZXNvbHZlKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB1cmksIGZhbHNlKTsKLQkJCQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJCQlzd2l0Y2ggKHJlZmVyZW5jZS5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJCQkJCUlUTERSZWNvcmQgcmVjb3JkID0gKElUTERSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQkJCQkJSVJlc291cmNlIHRsZGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocmVjb3JkLmdldFBhdGgoKSk7Ci0JCQkJCQkJCWFkZERlcGVuZHNPbih0bGRmaWxlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuSkFSKSA6IHsKLQkJCQkJCQkJSUphclJlY29yZCByZWNvcmQgPSAoSUphclJlY29yZCkgcmVmZXJlbmNlOwotCQkJCQkJCQlJRmlsZVtdIGZvdW5kRmlsZXNGb3JMb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24ocmVjb3JkLmdldExvY2F0aW9uKCkpOwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZvdW5kRmlsZXNGb3JMb2NhdGlvbi5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJYWRkRGVwZW5kc09uKGZvdW5kRmlsZXNGb3JMb2NhdGlvbltpXSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVEFHRElSKSA6IHsKLQkJCQkJCQkJSVRhZ0RpclJlY29yZCByZWNvcmQgPSAoSVRhZ0RpclJlY29yZCkgcmVmZXJlbmNlOwotCQkJCQkJCQlJUGF0aCBwYXRoID0gcmVjb3JkLmdldFBhdGgoKTsKLQkJCQkJCQkJSVJlc291cmNlIGZvdW5kID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgsIGZhbHNlKTsKLQotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJZm91bmQuYWNjZXB0KG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJCQkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCQkJCQkJCQlhZGREZXBlbmRzT24ocmVzb3VyY2UpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0pOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVVJMKSA6IHsKLQkJCQkJCQkJSVVSTFJlY29yZCByZWNvcmQgPSAoSVVSTFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCQkJCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gcmVjb3JkLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCQkJCQlpZiAoYmFzZUxvY2F0aW9uICE9IG51bGwgJiYgYmFzZUxvY2F0aW9uLmluZGV4T2YoIjovLyIpIDwgMCkgewotCQkJCQkJCQkJSVJlc291cmNlIGZvdW5kID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGJhc2VMb2NhdGlvbiwgZmFsc2UpOwotCQkJCQkJCQkJaWYgKGZvdW5kICE9IG51bGwpIHsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlmb3VuZC5hY2NlcHQobmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7Ci0JCQkJCQkJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCQkJCQkJCQkJCWFkZERlcGVuZHNPbihyZXNvdXJjZSk7Ci0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9KTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCUlGaWxlIGV4dGVybmFsSmFyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgoYmFzZUxvY2F0aW9uKSk7Ci0JCQkJCQkJCQkJaWYgKGV4dGVybmFsSmFyICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJYWRkRGVwZW5kc09uKGV4dGVybmFsSmFyKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChyZWZlcmVuY2UgPT0gbnVsbCAmJiBmU2V2ZXJpdHlUYWdsaWJVbnJlc29sdmFibGVVUkkgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJCQkvLyBVUkkgc3BlY2lmaWVkIGJ1dCBkb2VzIG5vdCByZXNvbHZlCi0JCQkJCQlTdHJpbmcgbXNnVGV4dCA9IG51bGw7Ci0JCQkJCQkvLyBwcm92aWRlIGJldHRlciBtZXNzYWdlcyBmb3IgdHlwaWNhbCAiaHR0cDoqIiBVUklzCi0JCQkJCQlpZiAodXJpLnN0YXJ0c1dpdGgoImh0dHA6IikgJiYgRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0SlNQVmVyc2lvbihmaWxlLmdldEZ1bGxQYXRoKCkpIDwgMS4yKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5pc0R5bmFtaWNXZWJQcm9qZWN0KGZpbGUuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJCQltc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl85LCB1cmkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMTAsIHVyaSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMSwgdXJpKTsKLQkJCQkJCX0KLQkJCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eVRhZ2xpYlVucmVzb2x2YWJsZVVSSSwgbXNnVGV4dCwgZmlsZSk7Ci0JCQkJCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh1cmlWYWx1ZVJlZ2lvbik7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gdXJpVmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJaW50IGxpbmVObyA9IHNEb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyArIDEpOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoIlBST0JMRU1fSUQiLCBuZXcgSW50ZWdlcig2MTEpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZlNldmVyaXR5VGFnbGliTWlzc2luZ1VSSSAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQkJLy8gVVJJIHNwZWNpZmllZCBidXQgZW1wdHkgc3RyaW5nCi0JCQkJCVN0cmluZyBtc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl8zLCBKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVVJJKTsKLQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZlNldmVyaXR5VGFnbGliTWlzc2luZ1VSSSwgbXNnVGV4dCwgZmlsZSk7Ci0JCQkJCWludCBzdGFydCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHVyaVZhbHVlUmVnaW9uKTsKLQkJCQkJaW50IGxlbmd0aCA9IHVyaVZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJaW50IGxpbmVObyA9IHNEb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vICsgMSk7Ci0JCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRhZ2RpclZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIFVSSSBpcyBzcGVjaWZpZWQKLQkJCVN0cmluZyB0YWdkaXIgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHRhZ2RpclZhbHVlUmVnaW9uKTsKLQotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXRhZ2RpciA9IFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKHRhZ2Rpcik7Ci0JCQkJaWYgKHRhZ2Rpci5sZW5ndGgoKSA8PSAwICYmIGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdVUkkgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJCS8vIHRhZ2RpciBzcGVjaWZpZWQgYnV0IGVtcHR5IHN0cmluZwotCQkJCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMywgSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBR0RJUik7Ci0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdVUkksIG1zZ1RleHQsIGZpbGUpOwotCQkJCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh0YWdkaXJWYWx1ZVJlZ2lvbik7Ci0JCQkJCWludCBsZW5ndGggPSB0YWdkaXJWYWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyArIDEpOwotCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIGlmIChUYWdsaWJJbmRleC5yZXNvbHZlKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0YWdkaXIsIGZhbHNlKSA9PSBudWxsICYmIGZTZXZlcml0eVRhZ2RpclVucmVzb2x2YWJsZVVSSSAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQkJLy8gVVJJIHNwZWNpZmllZCBidXQgZG9lcyBub3QgcmVzb2x2ZQotCQkJCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMTEsIHRhZ2Rpcik7Ci0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eVRhZ2xpYlVucmVzb2x2YWJsZVVSSSwgbXNnVGV4dCwgZmlsZSk7Ci0JCQkJCWludCBzdGFydCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHRhZ2RpclZhbHVlUmVnaW9uKTsKLQkJCQkJaW50IGxlbmd0aCA9IHRhZ2RpclZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJaW50IGxpbmVObyA9IHNEb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vICsgMSk7Ci0JCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdVUkkgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkvLyBVUkkgbm90IHNwZWNpZmllZCBvciBlbXB0eSBzdHJpbmcKLQkJCVN0cmluZyBtc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl83LCBuZXcgU3RyaW5nW117SlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBR0RJUiwgSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1VSSX0pOwotCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZlNldmVyaXR5VGFnbGliTWlzc2luZ1VSSSwgbXNnVGV4dCwgZmlsZSk7Ci0JCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGxlbmd0aCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8gKyAxKTsKLQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJfQotCi0JCXByZWZpeFZhbHVlUmVnaW9uID0gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oZG9jdW1lbnRSZWdpb24sIEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9QUkVGSVgpOwotCQlpZiAocHJlZml4VmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJLy8gcHJlZml4IHNwZWNpZmllZAotCQkJU3RyaW5nIHRhZ2xpYlByZWZpeCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQocHJlZml4VmFsdWVSZWdpb24pOwotCQkJdGFnbGliUHJlZml4ID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXModGFnbGliUHJlZml4KTsKLQotCQkJY29sbGVjdFRhZ2xpYlByZWZpeChkb2N1bWVudFJlZ2lvbiwgcHJlZml4VmFsdWVSZWdpb24sIHRhZ2xpYlByZWZpeCk7Ci0KLQkJCWlmIChpc1Jlc2VydmVkVGFnbGliUHJlZml4KHRhZ2xpYlByZWZpeCkpIHsKLQkJCQkvLyBwcmVmaXggaXMgYSByZXNlcnZlZCBwcmVmaXgKLQkJCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMCwgdGFnbGliUHJlZml4KTsKLQkJCQlpbnQgc2V2ID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSAoZmlsZSA9PSBudWxsID8gbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2LCBtc2dUZXh0KSA6IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldiwgbXNnVGV4dCwgZmlsZSkpOwotCQkJCWludCBzdGFydCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHByZWZpeFZhbHVlUmVnaW9uKTsKLQkJCQlpbnQgbGVuZ3RoID0gcHJlZml4VmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vICsgMSk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQl9Ci0JCQlpZiAodGFnbGliUHJlZml4Lmxlbmd0aCgpID09IDAgJiYgZlNldmVyaXR5VGFnbGliTWlzc2luZ1ByZWZpeCAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQkvLyBwcmVmaXggaXMgc3BlY2lmaWVkIGJ1dCBlbXB0eQotCQkJCVN0cmluZyBtc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl8zLCBKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfUFJFRklYKTsKLQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlUYWdsaWJNaXNzaW5nUHJlZml4LCBtc2dUZXh0LCBmaWxlKTsKLQkJCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChwcmVmaXhWYWx1ZVJlZ2lvbik7Ci0JCQkJaW50IGxlbmd0aCA9IHByZWZpeFZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQlpbnQgbGluZU5vID0gc0RvYy5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyArIDEpOwotCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdQcmVmaXggIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkvLyBwcmVmaXggaXMgbm90IHNwZWNpZmllZAotCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzMsIEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9QUkVGSVgpOwotCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZlNldmVyaXR5VGFnbGliTWlzc2luZ1ByZWZpeCwgbXNnVGV4dCwgZmlsZSk7Ci0JCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGxlbmd0aCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8gKyAxKTsKLQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXBvcnRUYWdsaWJEdXBsaWNhdGVQcmVmaXhlcyhJRmlsZSBmaWxlLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGZTZXZlcml0eVRhZ2xpYkR1cGxpY2F0ZVByZWZpeFdpdGhEaWZmZXJlbnRVUklzID09IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSAmJiBmU2V2ZXJpdHlUYWdsaWJEdXBsaWNhdGVQcmVmaXhXaXRoU2FtZVVSSXMgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZ1tdIHByZWZpeGVzID0gKFN0cmluZ1tdKSBmVGFnbGliUHJlZml4ZXNJblVzZS5rZXlTZXQoKS50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCQlmb3IgKGludCBwcmVmaXhOdW1iZXIgPSAwOyBwcmVmaXhOdW1iZXIgPCBwcmVmaXhlcy5sZW5ndGg7IHByZWZpeE51bWJlcisrKSB7Ci0JCQlpbnQgc2V2ZXJpdHkgPSBmU2V2ZXJpdHlUYWdsaWJEdXBsaWNhdGVQcmVmaXhXaXRoU2FtZVVSSXM7Ci0KLQkJCU9iamVjdCBvID0gZlRhZ2xpYlByZWZpeGVzSW5Vc2UuZ2V0KHByZWZpeGVzW3ByZWZpeE51bWJlcl0pOwotCQkJLyoKLQkJCSAqIE9ubHkgY2FyZSBpZiBpdCdzIGEgTGlzdCAoYmVjYXVzZSB0aGVyZSB3YXMgbW9yZSB0aGFuIG9uZQotCQkJICogZGlyZWN0aXZlIHdpdGggdGhhdCBwcmVmaXgpIGFuZCBpZiB3ZSdyZSBzdXBwb3NlZCB0byByZXBvcnQKLQkJCSAqIGR1cGxpY2F0ZXMKLQkJCSAqLwotCQkJaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJTGlzdCB2YWx1ZVJlZ2lvbnMgPSAoTGlzdCkgbzsKLQkJCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJCQlmb3IgKGludCByZWdpb25OdW1iZXIgPSAwOyByZWdpb25OdW1iZXIgPCB2YWx1ZVJlZ2lvbnMuc2l6ZSgpOyByZWdpb25OdW1iZXIrKykgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGZQcmVmaXhWYWx1ZVJlZ2lvblRvRG9jdW1lbnRSZWdpb25NYXAuZ2V0KHZhbHVlUmVnaW9ucy5nZXQocmVnaW9uTnVtYmVyKSk7Ci0JCQkJCUlUZXh0UmVnaW9uIHVyaVZhbHVlUmVnaW9uID0gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oZG9jdW1lbnRSZWdpb24sIEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9VUkkpOwotCQkJCQlpZiAodXJpVmFsdWVSZWdpb24gPT0gbnVsbCkgewotCQkJCQkJdXJpVmFsdWVSZWdpb24gPSBnZXRBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihkb2N1bWVudFJlZ2lvbiwgSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBR0RJUik7Ci0JCQkJCX0KLQkJCQkJaWYgKHVyaVZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyB1cmkyID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoZG9jdW1lbnRSZWdpb24uZ2V0VGV4dCh1cmlWYWx1ZVJlZ2lvbikpOwotCQkJCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJCQkJdXJpID0gdXJpMjsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWlmIChjb2xsYXRvci5jb21wYXJlKHVyaSwgdXJpMikgIT0gMCkgewotCQkJCQkJCQlzZXZlcml0eSA9IGZTZXZlcml0eVRhZ2xpYkR1cGxpY2F0ZVByZWZpeFdpdGhEaWZmZXJlbnRVUklzOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChzZXZlcml0eSAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzIsIHByZWZpeGVzW3ByZWZpeE51bWJlcl0pOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQotCQkJCQkvLyBSZXBvcnQgYW4gZXJyb3IgaW4gYWxsIGRpcmVjdGl2ZXMgdXNpbmcgdGhpcyBwcmVmaXgKLQkJCQkJZm9yIChpbnQgcmVnaW9uTnVtYmVyID0gMDsgcmVnaW9uTnVtYmVyIDwgdmFsdWVSZWdpb25zLnNpemUoKTsgcmVnaW9uTnVtYmVyKyspIHsKLQotCQkJCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSAoSVRleHRSZWdpb24pIHZhbHVlUmVnaW9ucy5nZXQocmVnaW9uTnVtYmVyKTsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZlByZWZpeFZhbHVlUmVnaW9uVG9Eb2N1bWVudFJlZ2lvbk1hcC5nZXQodmFsdWVSZWdpb24pOwotCQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gKGZpbGUgPT0gbnVsbCA/IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldmVyaXR5LCBtc2dUZXh0KSA6IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldmVyaXR5LCBtc2dUZXh0LCBmaWxlKSk7Ci0KLQkJCQkJCS8vIGlmIHRoZXJlJ3MgYSBtZXNzYWdlLCB0aGVyZSB3YXMgYW4gZXJyb3IgZm91bmQKLQkJCQkJCWludCBzdGFydCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKTsKLQkJCQkJCWludCBsZW5ndGggPSB2YWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQlpbnQgbGluZU5vID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyArIDEpOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gdXNlUHJvamVjdCA9IGZhbHNlOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlmUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWZQcmVmZXJlbmNlcyA9IG5ldyBQcm9qZWN0U2NvcGUoZlByb2plY3QuZ2V0UHJvamVjdCgpKS5nZXROb2RlKFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIpOwotCQkJdXNlUHJvamVjdCA9IGZQcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVTRV9QUk9KRUNUX1NFVFRJTkdTLCBmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUHJvamVjdCA9IG51bGw7Ci0JCX0KLQotCQlpZiAoIXVzZVByb2plY3QpIHsKLQkJCWZQcmVmZXJlbmNlcyA9IG5ldyBJbnN0YW5jZVNjb3BlKCkuZ2V0Tm9kZShQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1bmxvYWRQcmVmZXJlbmNlcygpIHsKLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IG51bGw7Ci0JCWZTY29wZXMgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUcnVlIGlmIGNvbnRhaW5lciBoYXMgbmVzdGVkIHJlZ2lvbnMsIG1lYW5pbmcgY29udGFpbmVyIGlzIHByb2JhYmx5IHRvbwotCSAqIGNvbXBsaWNhdGVkIChsaWtlIEpTUCBleHByZXNzaW9ucyBvciBFTCkgdG8gdmFsaWRhdGUgd2l0aCB0aGlzIHZhbGlkYXRvci4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTmVzdGVkUmVnaW9uKElUZXh0UmVnaW9uIGNvbnRhaW5lcikgewotCQlyZXR1cm4gKGNvbnRhaW5lciBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyICYmICgoSVRleHRSZWdpb25Db250YWluZXIpIGNvbnRhaW5lcikuZ2V0UmVnaW9ucygpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIGJhdGNoIHZhbGlkYXRpb24gY2FsbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmlsZShJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmFsaWRhdGluZzogIiArIGYpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmKTsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCXBlcmZvcm1WYWxpZGF0aW9uKGYsIHJlcG9ydGVyLCBzTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQRUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BFTFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjg0NTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BFTFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLkpTUEVMUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLlRva2VuTWdyRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkpTUENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIEpTUEVMVmFsaWRhdG9yIGV4dGVuZHMgSlNQVmFsaWRhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQm9vbGVhbi52YWx1ZU9mKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdmFsaWRhdG9yIikpLmJvb2xlYW5WYWx1ZSgpOyAvLyROT04tTkxTLTEkCQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUiA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVHSU9OUyA9IDEwMDA7Ci0JCi0JcHJpdmF0ZSBJVmFsaWRhdG9yIGZNZXNzYWdlT3JpZ2luYXRvcjsKLQotCXB1YmxpYyBKU1BFTFZhbGlkYXRvcigpIHsKLQkJdGhpcy5mTWVzc2FnZU9yaWdpbmF0b3IgPSB0aGlzOwotCX0KLQotCXB1YmxpYyBKU1BFTFZhbGlkYXRvcihJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLmZNZXNzYWdlT3JpZ2luYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUZpbGUoSUZpbGUgZmlsZSwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmIChERUJVRykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHZhbGlkYXRpbmc6ICIgKyBmaWxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpICYmIG1vZGVsICE9IG51bGwpIHsKLQkJCQlwZXJmb3JtVmFsaWRhdGlvbihmaWxlLCByZXBvcnRlciwgbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChudWxsICE9IG1vZGVsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZXNTZXJ2aWNlIGZQcmVmZXJlbmNlc1NlcnZpY2UgPSBudWxsOwotCXByaXZhdGUgSVNjb3BlQ29udGV4dFtdIGZTY29wZXMgPSBudWxsOwotCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmVmZXJlbmNlcyhJRmlsZSBmaWxlKSB7Ci0JCWZTY29wZXMgPSBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0KLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCVByb2plY3RTY29wZSBwcm9qZWN0U2NvcGUgPSBuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChwcm9qZWN0U2NvcGUuZ2V0Tm9kZShQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSKS5nZXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9VU0VfUFJPSkVDVF9TRVRUSU5HUywgZmFsc2UpKSB7Ci0JCQkJZlNjb3BlcyA9IG5ldyBJU2NvcGVDb250ZXh0W117cHJvamVjdFNjb3BlLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQkJfQotCQl9Ci0JfQotCQotCWludCBnZXRNZXNzYWdlU2V2ZXJpdHkoU3RyaW5nIGtleSkgewotCQlpbnQgc2V2ID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXRJbnQoUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUiwga2V5LCBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIGZTY29wZXMpOwotCQlzd2l0Y2ggKHNldikgewotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUiA6Ci0JCQkJcmV0dXJuIElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcgOgotCQkJCXJldHVybiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLklORk9STUFUSU9OIDoKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUgOgotCQkJCXJldHVybiBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkU7Ci0JCX0KLQkJcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVubG9hZFByZWZlcmVuY2VzKCkgewotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQkJZlNjb3BlcyA9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVZhbGlkYXRpb24oSUZpbGUgZmlsZSwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2MpIHsKLQkJbG9hZFByZWZlcmVuY2VzKGZpbGUpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1ck5vZGUgPSBzdHJ1Y3R1cmVkRG9jLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCXdoaWxlIChudWxsICE9IGN1ck5vZGUgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCWlmIChjdXJOb2RlLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQgJiYgY3VyTm9kZS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCAmJiBjdXJOb2RlLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgewotCQkJCXZhbGlkYXRlUmVnaW9uQ29udGFpbmVyKGN1ck5vZGUsIHJlcG9ydGVyLCBmaWxlKTsKLQkJCX0KLQkJCWN1ck5vZGUgPSBjdXJOb2RlLmdldE5leHQoKTsKLQkJfQotCQl1bmxvYWRQcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVnaW9uQ29udGFpbmVyKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXIsIElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSkgewotCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyUmVnaW9uID0gY29udGFpbmVyOwotCQlJdGVyYXRvciByZWdpb25zID0gY29udGFpbmVyUmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCXJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSAhPSBudWxsICYmIHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBwYXJlbnRSZWdpb24gPSAoKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uKTsKLQkJCQlJdGVyYXRvciBjaGlsZFJlZ2lvbnMgPSBwYXJlbnRSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGNoaWxkUmVnaW9ucy5oYXNOZXh0KCkgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQkJSVRleHRSZWdpb24gY2hpbGRSZWdpb24gPSAoSVRleHRSZWdpb24pIGNoaWxkUmVnaW9ucy5uZXh0KCk7Ci0JCQkJCS8qIFsxMzY3OTVdIFZhbGlkYXRlIGV2ZXJ5dGhpbmcgaW4gdGhlIEVMIGNvbnRhaW5lciwgbm90IGp1c3QgSlNQX0VMX0NPTlRFTlQgKi8KLQkJCQkJaWYgKGNoaWxkUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfT1BFTikKLQkJCQkJCXZhbGlkYXRlRUxDb250ZW50KHBhcmVudFJlZ2lvbiwgY2hpbGRSZWdpb24sIGNoaWxkUmVnaW9ucywgcmVwb3J0ZXIsIGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUVMQ29udGVudChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyLCBJVGV4dFJlZ2lvbiBlbE9wZW5SZWdpb24sIEl0ZXJhdG9yIGVsUmVnaW9ucywgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlKSB7Ci0JCWludCBjb250ZW50U3RhcnQgPSBlbE9wZW5SZWdpb24uZ2V0RW5kKCk7Ci0JCWludCBjb250ZW50RG9jU3RhcnQgPSBjb250YWluZXIuZ2V0RW5kT2Zmc2V0KGVsT3BlblJlZ2lvbik7Ci0JCWludCBjb250ZW50TGVuZ3RoID0gY29udGFpbmVyLmdldExlbmd0aCgpOwotCQlpbnQgcmVnaW9uQ291bnQgPSAwOwotCQlJVGV4dFJlZ2lvbiBlbFJlZ2lvbiA9IG51bGw7Ci0JCS8qIEZpbmQgdGhlIEVMIGNsb3NpbmcgcmVnaW9uLCBvdGhlcndpc2UgdGhlIGxhc3QgcmVnaW9uIHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIEVMIGNvbnRlbnQgdGV4dCAqLwotCQl3aGlsZSAoZWxSZWdpb25zICE9IG51bGwgJiYgZWxSZWdpb25zLmhhc05leHQoKSAmJiAocmVnaW9uQ291bnQrKyA8IE1BWF9SRUdJT05TKSkgewotCQkJZWxSZWdpb24gPSAoSVRleHRSZWdpb24pIGVsUmVnaW9ucy5uZXh0KCk7Ci0JCQlpZiAoZWxSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DTE9TRSkKLQkJCQlicmVhazsKLQkJfQotCQkKLQkJU3RyaW5nIGVsVGV4dCA9IGNvbnRhaW5lci5nZXRGdWxsVGV4dCgpLnN1YnN0cmluZyhjb250ZW50U3RhcnQsIChlbFJlZ2lvbiAhPSBudWxsKSA/IGVsUmVnaW9uLmdldFN0YXJ0KCkgOiAoY29udGVudExlbmd0aCAtIDEpKTsKLQkJSlNQRUxQYXJzZXIgZWxQYXJzZXIgPSBKU1BFTFBhcnNlci5jcmVhdGVQYXJzZXIoZWxUZXh0KTsKLQkJdHJ5IHsKLQkJCWVsUGFyc2VyLkV4cHJlc3Npb24oKTsKLQkJfQotCQljYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotCQkJaW50IHNldiA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRUxfU1lOVEFYKTsKLQkJCWlmIChzZXYgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJVG9rZW4gY3VyVG9rID0gZS5jdXJyZW50VG9rZW47Ci0JCQkJaW50IHByb2JsZW1TdGFydE9mZnNldCA9IGNvbnRlbnREb2NTdGFydCArIGN1clRvay5iZWdpbkNvbHVtbjsKLQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXYsIEpTUENvcmVNZXNzYWdlcy5KU1BFTF9TeW50YXgpOwotCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHByb2JsZW1TdGFydE9mZnNldCk7Ci0JCQkJbWVzc2FnZS5zZXRMZW5ndGgoY3VyVG9rLmVuZENvbHVtbiAtIGN1clRvay5iZWdpbkNvbHVtbiArIDEpOwotCQkJCW1lc3NhZ2Uuc2V0VGFyZ2V0T2JqZWN0KGZpbGUpOwotCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoVG9rZW5NZ3JFcnJvciB0ZSkgewotCQkJaW50IHNldiA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRUxfTEVYRVIpOwotCQkJaWYgKHNldiAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIEpTUENvcmVNZXNzYWdlcy5KU1BFTF9Ub2tlbik7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoY29udGVudERvY1N0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExlbmd0aChjb250ZW50TGVuZ3RoKTsKLQkJCQltZXNzYWdlLnNldFRhcmdldE9iamVjdChmaWxlKTsKLQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVhNTE5vZGUoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lciwgSVRleHRSZWdpb24gcmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGVsVGV4dCA9IGNvbnRhaW5lci5nZXRUZXh0KHJlZ2lvbik7Ci0JCUpTUEVMUGFyc2VyIGVsUGFyc2VyID0gSlNQRUxQYXJzZXIuY3JlYXRlUGFyc2VyKGVsVGV4dCk7Ci0JCWludCBjb250ZW50U3RhcnQgPSBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJaW50IGNvbnRlbnRMZW5ndGggPSBjb250YWluZXIuZ2V0TGVuZ3RoKCk7Ci0JCXRyeSB7Ci0JCQllbFBhcnNlci5FeHByZXNzaW9uKCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJCWludCBzZXYgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0VMX1NZTlRBWCk7Ci0JCQlpZiAoc2V2ICE9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJCVRva2VuIGN1clRvayA9IGUuY3VycmVudFRva2VuOwotCQkJCWludCBwcm9ibGVtU3RhcnRPZmZzZXQgPSBjb250ZW50U3RhcnQgKyBjdXJUb2suYmVnaW5Db2x1bW47Ci0JCQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2LCBKU1BDb3JlTWVzc2FnZXMuSlNQRUxfU3ludGF4KTsKLQkJCQltZXNzYWdlLnNldE9mZnNldChwcm9ibGVtU3RhcnRPZmZzZXQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGN1clRvay5lbmRDb2x1bW4gLSBjdXJUb2suYmVnaW5Db2x1bW4gKyAxKTsKLQkJCQltZXNzYWdlLnNldFRhcmdldE9iamVjdChmaWxlKTsKLQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFRva2VuTWdyRXJyb3IgdGUpIHsKLQkJCWludCBzZXYgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0VMX0xFWEVSKTsKLQkJCWlmIChzZXYgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLCBKU1BDb3JlTWVzc2FnZXMuSlNQRUxfVG9rZW4pOwotCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KGNvbnRlbnRTdGFydCk7Ci0JCQkJbWVzc2FnZS5zZXRMZW5ndGgoY29udGVudExlbmd0aCk7Ci0JCQkJbWVzc2FnZS5zZXRUYXJnZXRPYmplY3QoZmlsZSk7Ci0JCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEphdmFWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BKYXZhVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYzE0MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEphdmFWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgSlNQSmF2YVZhbGlkYXRvciBleHRlbmRzIEpTUFZhbGlkYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHZhbGlkYXRvciIpKS5ib29sZWFuVmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSVZhbGlkYXRvciBmTWVzc2FnZU9yaWdpbmF0b3I7Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlc1NlcnZpY2UgZlByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JcHJpdmF0ZSBJU2NvcGVDb250ZXh0W10gZlNjb3BlcyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBVUERBVEVfSkFWQV9UQVNLUyA9IHRydWU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfVEFTS19NQVJLRVJfVFlQRSA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS50YXNrIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFUEVORF9PTnMgPSBuZXcgU3RyaW5nW117Ii5jbGFzc3BhdGgiLCAiLnByb2plY3QiLCAiLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIiwgIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUucHJlZnMiLCAiLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnhtbCIsICIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQifTsKLQotCXB1YmxpYyBKU1BKYXZhVmFsaWRhdG9yKCkgewotCQl0aGlzLmZNZXNzYWdlT3JpZ2luYXRvciA9IHRoaXM7Ci0JfQotCi0JcHVibGljIEpTUEphdmFWYWxpZGF0b3IoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy5mTWVzc2FnZU9yaWdpbmF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogQXNzdW1lZCB0aGUgbWVzc2FnZSBvZmZzZXQgaXMgYW4gaW5kaXJlY3QgcG9zaXRpb24uIEluIG90aGVyIHdvcmRzLCBhbgotCSAqIGVycm9yIGZyb20gYW4gaW5jbHVkZWQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbQotCSAqIEBwYXJhbSB0cmFuc2xhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGp1c3RJbmRpcmVjdFBvc2l0aW9uKElNZXNzYWdlIG0sIElKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbikgewotCi0JCWlmICghKHRyYW5zbGF0aW9uIGluc3RhbmNlb2YgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24pKQotCQkJcmV0dXJuOwotCi0JCUlEb2N1bWVudCBqc3BEb2MgPSAoKEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uKSB0cmFuc2xhdGlvbikuZ2V0SnNwRG9jdW1lbnQoKTsKLQkJaWYgKCEoanNwRG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGpzcERvYzsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHJlZ2lvbnMgPSBzRG9jLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoMCwgbS5nZXRPZmZzZXQoKSArIG0uZ2V0TGVuZ3RoKCkpOwotCQkvLyBpdGVyYXRlIGJhY2t3YXJkcyB1bnRpbCB5b3UgaGl0IHRoZSBpbmNsdWRlIGRpcmVjdGl2ZQotCQlmb3IgKGludCBpID0gcmVnaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSByZWdpb25zW2ldOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJaWYgKGdldERpcmVjdGl2ZU5hbWUocmVnaW9uKS5lcXVhbHMoImluY2x1ZGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUlUZXh0UmVnaW9uIGZpbGVWYWx1ZVJlZ2lvbiA9IGdldEF0dHJpYnV0ZVZhbHVlUmVnaW9uKHJlZ2lvbiwgImZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZmlsZVZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCW0uc2V0T2Zmc2V0KHJlZ2lvbi5nZXRTdGFydE9mZnNldChmaWxlVmFsdWVSZWdpb24pKTsKLQkJCQkJCW0uc2V0TGVuZ3RoKGZpbGVWYWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbS5zZXRPZmZzZXQocmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQkJbS5zZXRMZW5ndGgocmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQkJLyoqCi0JCQkJCSAqIEJ1ZyAyMTk3NjEgLSBTeW50YXggZXJyb3IgcmVwb3J0ZWQgYXQgd3JvbmcgbG9jYXRpb24KLQkJCQkJICogKGRvbid0IGZvcmdldCB0byBhZGp1c3QgdGhlIGxpbmUgbnVtYmVyLCB0b28pCi0JCQkJCSAqLwotCQkJCQltLnNldExpbmVObyhzRG9jLmdldExpbmVPZk9mZnNldChtLmdldE9mZnNldCgpKSArIDEpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIElNZXNzYWdlIGZyb20gYXNuIElQcm9ibGVtCi0JICogCi0JICogQHBhcmFtIHByb2JsZW0KLQkgKiBAcGFyYW0gZgotCSAqIEBwYXJhbSB0cmFuc2xhdGlvbgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jCi0JICogQHJldHVybiBtZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm9ibGVtLCBvciBudWxsIGlmIGl0IGNvdWxkIG5vdAotCSAqICAgICAgICAgY3JlYXRlIG9uZQotCSAqLwotCXByaXZhdGUgSU1lc3NhZ2UgY3JlYXRlTWVzc2FnZUZyb21Qcm9ibGVtKElQcm9ibGVtIHByb2JsZW0sIElGaWxlIGYsIElKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiwgSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jKSB7Ci0JCWludCBzZXYgPSAtMTsKLQkJaW50IHNvdXJjZVN0YXJ0ID0gLTE7Ci0JCWludCBzb3VyY2VFbmQgPSAtMTsKLQotCQlpZiAocHJvYmxlbSBpbnN0YW5jZW9mIElKU1BQcm9ibGVtKSB7Ci0JCQlzb3VyY2VTdGFydCA9IHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKTsKLQkJCXNvdXJjZUVuZCA9IHByb2JsZW0uZ2V0U291cmNlRW5kKCk7Ci0JCQlzd2l0Y2ggKCgoSUpTUFByb2JsZW0pIHByb2JsZW0pLmdldEVJRCgpKSB7Ci0JCQkJY2FzZSBJSlNQUHJvYmxlbS5URUlDbGFzc05vdEZvdW5kIDoKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0ZPVU5EKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJSlNQUHJvYmxlbS5URUlWYWxpZGF0aW9uTWVzc2FnZSA6Ci0JCQkJCXNldiA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX1ZBTElEQVRJT05fTUVTU0FHRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUpTUFByb2JsZW0uVEVJQ2xhc3NOb3RJbnN0YW50aWF0ZWQgOgotCQkJCQlzZXYgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19OT1RfSU5TVEFOVElBVEVEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJSlNQUHJvYmxlbS5URUlDbGFzc01pc2MgOgotCQkJCQlzZXYgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19SVU5USU1FX0VYQ0VQVElPTik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUpTUFByb2JsZW0uVGFnQ2xhc3NOb3RGb3VuZCA6Ci0JCQkJCXNldiA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEFHX0hBTkRMRVJfQ0xBU1NfTk9UX0ZPVU5EKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJSlNQUHJvYmxlbS5Vc2VCZWFuSW52YWxpZElEIDoKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0VCRUFOX0lOVkFMSURfSUQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKU1BQcm9ibGVtLlVzZUJlYW5NaXNzaW5nVHlwZUluZm8gOgotCQkJCQlzZXYgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTQkVBTl9NSVNTSU5HX1RZUEVfSU5GTyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUpTUFByb2JsZW0uVXNlQmVhbkFtYmlndW91c1R5cGUgOgotCQkJCQlzZXYgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTRUJFQU5fQU1CSUdVT1VTX1RZUEVfSU5GTyk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlzZXYgPSBwcm9ibGVtLmlzRXJyb3IoKSA/IElNZXNzYWdlLkhJR0hfU0VWRVJJVFkgOiAocHJvYmxlbS5pc1dhcm5pbmcoKSA/IElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSA6IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSk7Ci0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNvdXJjZVN0YXJ0ID0gdHJhbnNsYXRpb24uZ2V0SnNwT2Zmc2V0KHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKSk7Ci0JCQlzb3VyY2VFbmQgPSB0cmFuc2xhdGlvbi5nZXRKc3BPZmZzZXQocHJvYmxlbS5nZXRTb3VyY2VFbmQoKSk7Ci0JCQlzd2l0Y2ggKHByb2JsZW0uZ2V0SUQoKSkgewotCQkJCWNhc2UgSVByb2JsZW0uTG9jYWxWYXJpYWJsZUlzTmV2ZXJVc2VkIDogewotCQkJCQlzZXYgPSBnZXRTb3VyY2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fSkFWQV9MT0NBTF9WQVJJQUJMRV9ORVZFUl9VU0VELCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKLQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVByb2JsZW0uTnVsbExvY2FsVmFyaWFibGVSZWZlcmVuY2UgOiB7Ci0JCQkJCXNldiA9IGdldFNvdXJjZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX05VTExfTE9DQUxfVkFSSUFCTEVfUkVGRVJFTkNFLCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKLQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVByb2JsZW0uQXJndW1lbnRJc05ldmVyVXNlZCA6IHsKLQkJCQkJc2V2ID0gZ2V0U291cmNlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfQVJHVU1FTlRfSVNfTkVWRVJfVVNFRCwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7Ci0JCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElQcm9ibGVtLlBvdGVudGlhbE51bGxMb2NhbFZhcmlhYmxlUmVmZXJlbmNlIDogewotCQkJCQlzZXYgPSBnZXRTb3VyY2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fSkFWQV9QT1RFTlRJQUxfTlVMTF9MT0NBTF9WQVJJQUJMRV9SRUZFUkVOQ0UsIHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOwotCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUHJvYmxlbS5VbnVzZWRJbXBvcnQgOiB7Ci0JCQkJCXNldiA9IGdldFNvdXJjZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX1VOVVNFRF9JTVBPUlQsIHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOwotCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUHJvYmxlbS5VbnVzZWRQcml2YXRlRmllbGQ6Ci0JCQkJY2FzZSBJUHJvYmxlbS5NaXNzaW5nU2VyaWFsVmVyc2lvbiA6IHsKLQkJCQkJLy8gSlNQIGZpbGVzIGRvbid0IGdldCBzZXJpYWxpemVkLi4ucmlnaHQ/Ci0JCQkJCXNldiA9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0IDogewotCQkJCQlpZiAocHJvYmxlbS5pc0Vycm9yKCkpIHsKLQkJCQkJCXNldiA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocHJvYmxlbS5pc1dhcm5pbmcoKSkgewotCQkJCQkJc2V2ID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2V2ID0gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQkJCQl9Ci0JCQkJfQotCQkJCQlpZiAoc2V2ID09IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQkvKiBwcm9ibGVtcyB3aXRob3V0IEpTUCBwb3NpdGlvbnMgYXJlIGluIGdlbmVyYXRlZCBjb2RlICovCi0JCQkJCWlmIChzb3VyY2VTdGFydCA9PSAtMSkgewotCQkJCQkJaW50IHByb2JsZW1JRCA9IHByb2JsZW0uZ2V0SUQoKTsKLQkJCQkJCS8qCi0JCQkJCQkgKiBRdW90aW5nIElQcm9ibGVtIGRvYzogIldoZW4gYSBwcm9ibGVtIGlzIHRhZ2dlZCBhcwotCQkJCQkJICogSW50ZXJuYWwsIGl0IG1lYW5zIHRoYXQgbm8gY2hhbmdlIG90aGVyIHRoYW4gYQotCQkJCQkJICogbG9jYWwgc291cmNlIGNvZGUgY2hhbmdlIGNhbiBmaXggdGhlIGNvcnJlc3BvbmRpbmcKLQkJCQkJCSAqIHByb2JsZW0uIiBBc3N1bWluZyB0aGF0IG91ciBnZW5lcmF0ZWQgY29kZSBpcwotCQkJCQkJICogY29ycmVjdCwgdGhhdCBzaG91bGQgcmVkdWNlIHRoZSByZXBvcnRlZCBwcm9ibGVtcwotCQkJCQkJICogdG8gdGhvc2UgdGhlIHVzZXIgY2FuIGNvcnJlY3QuCi0JCQkJCQkgKi8KLQkJCQkJCWlmICgoKHByb2JsZW1JRCAmIElQcm9ibGVtLkludGVybmFsKSAhPSAwKSAmJiAoKHByb2JsZW1JRCAmIElQcm9ibGVtLlN5bnRheCkgIT0gMCkgJiYgdHJhbnNsYXRpb24gaW5zdGFuY2VvZiBKU1BUcmFuc2xhdGlvbikgewotCQkJCQkJCS8vIEF0dGFjaCB0byB0aGUgbGFzdCBjb2RlIHNjcmlwdGluZyBzZWN0aW9uCi0JCQkJCQkJSlNQVHJhbnNsYXRpb24ganNwVHJhbnNsYXRpb24gPSAoKEpTUFRyYW5zbGF0aW9uKSB0cmFuc2xhdGlvbik7Ci0JCQkJCQkJUG9zaXRpb25bXSBqc3BQb3NpdGlvbnMgPSAoUG9zaXRpb25bXSkganNwVHJhbnNsYXRpb24uZ2V0SnNwMkphdmFNYXAoKS5rZXlTZXQoKS50b0FycmF5KG5ldyBQb3NpdGlvbltqc3BUcmFuc2xhdGlvbi5nZXRKc3AySmF2YU1hcCgpLnNpemUoKV0pOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwganNwUG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCXNvdXJjZVN0YXJ0ID0gTWF0aC5tYXgoc291cmNlU3RhcnQsIGpzcFBvc2l0aW9uc1tpXS5nZXRPZmZzZXQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCUlNZXNzYWdlIG0gPSBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXYsIHByb2JsZW0uZ2V0TWVzc2FnZSgpLCBmKTsKLQkJCQkJCQltLnNldE9mZnNldChzb3VyY2VTdGFydCk7Ci0JCQkJCQkJbS5zZXRMZW5ndGgoMSk7Ci0JCQkJCQkJcmV0dXJuIG07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzZXYgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGxpbmUgbnVtYmVyIGZvciBtYXJrZXIgc3RhcnRzIEAgMQotCQkvLyBsaW5lIG51bWJlciBmcm9tIGRvY3VtZW50IHN0YXJ0cyBAIDAKLQkJaW50IGxpbmVObyA9IHN0cnVjdHVyZWREb2MuZ2V0TGluZU9mT2Zmc2V0KHNvdXJjZVN0YXJ0KSArIDE7Ci0KLQkJSU1lc3NhZ2UgbSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldiwgcHJvYmxlbS5nZXRNZXNzYWdlKCksIGYpOwotCi0JCW0uc2V0TGluZU5vKGxpbmVObyk7Ci0JCW0uc2V0T2Zmc2V0KHNvdXJjZVN0YXJ0KTsKLQkJbS5zZXRMZW5ndGgoKHNvdXJjZUVuZCA+PSBzb3VyY2VTdGFydCkgPyAoc291cmNlRW5kIC0gc291cmNlU3RhcnQgKyAxKSA6IDApOwotCi0JCS8vIG5lZWQgYWRkaXRpb25hbCBhZGp1c3RtZW50IGZvciBwcm9ibGVtcyBmcm9tCi0JCS8vIGluZGlyZWN0IChpbmNsdWRlZCkgZmlsZXMKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTYzMwotCQlpZiAodHJhbnNsYXRpb24uaXNJbmRpcmVjdChwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkpKSB7Ci0JCQlhZGp1c3RJbmRpcmVjdFBvc2l0aW9uKG0sIHRyYW5zbGF0aW9uKTsKLQkJfQotCi0JCXJldHVybiBtOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIHRoZSBzZXZlcml0eSBmb3IgdGhlIGdpdmVuIG1lc3NhZ2Uga2V5IG9ubHkgd2hlbiBpdCdzIHdpdGhpbiB0aGUgc291cmNlIHJhbmdlIG9mIHRoZSBKU1AgKGkuZS4sIG5vdCBib2lsZXJwbGF0ZSBjb2RlKS4KLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gZ2V0IHRoZSBzZXZlcml0eSBvZgotCSAqIEBwYXJhbSBzdGFydCBzdGFydCB3aXRoaW4gdGhlIEpTUCBzb3VyY2UKLQkgKiBAcGFyYW0gZW5kIGVuZCB3dGloaW4gdGhlIEpTUCBzb3VyY2UKLQkgKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHNldmVyaXR5IGZvciB0aGUga2V5IGlmIGl0IGlzIHBhcnQgb2YgdGhlIEpTUCdzIHNvdXJjZS4gSUdOT1JFIGlmIGl0J3MgYm9pbGVycGxhdGUgY29kZS4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRTb3VyY2VTZXZlcml0eShTdHJpbmcga2V5LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJcmV0dXJuIChzdGFydCA+PSAwICYmIGVuZCA+PSAwICkgPyBnZXRNZXNzYWdlU2V2ZXJpdHkoa2V5KSA6IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRTsKLQl9Ci0KLQlpbnQgZ2V0TWVzc2FnZVNldmVyaXR5KFN0cmluZyBrZXkpIHsKLQkJaW50IHNldiA9IGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0SW50KFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIsIGtleSwgSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLCBmU2NvcGVzKTsKLQkJc3dpdGNoIChzZXYpIHsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IgOgotCQkJCXJldHVybiBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HIDoKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5JTkZPUk1BVElPTiA6Ci0JCQkJcmV0dXJuIElNZXNzYWdlLkxPV19TRVZFUklUWTsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFIDoKLQkJCQlyZXR1cm4gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFOwotCQl9Ci0JCXJldHVybiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmVmZXJlbmNlcyhJRmlsZSBmaWxlKSB7Ci0JCWZTY29wZXMgPSBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0KLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlQcm9qZWN0U2NvcGUgcHJvamVjdFNjb3BlID0gbmV3IFByb2plY3RTY29wZShmaWxlLmdldFByb2plY3QoKSk7Ci0JCQlpZiAocHJvamVjdFNjb3BlLmdldE5vZGUoUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUikuZ2V0Qm9vbGVhbihKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVVNFX1BST0pFQ1RfU0VUVElOR1MsIGZhbHNlKSkgewotCQkJCWZTY29wZXMgPSBuZXcgSVNjb3BlQ29udGV4dFtde3Byb2plY3RTY29wZSwgbmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgcGVyZm9ybVZhbGlkYXRpb24oSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgREVQRU5EX09Ocy5sZW5ndGg7IGkrKykgewotCQkJYWRkRGVwZW5kc09uKGYuZ2V0UHJvamVjdCgpLmdldEZpbGUoREVQRU5EX09Oc1tpXSkpOwkKLQkJfQotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCQkJTW9kZWxIYW5kbGVyRm9ySlNQLmVuc3VyZVRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoZG9tTW9kZWwpOwotCi0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJSUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25BZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0KLQkJCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCWxvYWRQcmVmZXJlbmNlcyhmKTsKLQotCQkJCS8vIG9ubHkgdXBkYXRlIHRhc2sgbWFya2VycyBpZiB0aGUgbW9kZWwgaXMgdGhlIHNhbWUgYXMgd2hhdCdzIG9uIGRpc2sKLQkJCQlib29sZWFuIHVwZGF0ZUphdmFUYXNrcyA9IFVQREFURV9KQVZBX1RBU0tTICYmICFkb21Nb2RlbC5pc0RpcnR5KCkgJiYgZiAhPSBudWxsICYmIGYuaXNBY2Nlc3NpYmxlKCk7Ci0JCQkJaWYgKHVwZGF0ZUphdmFUYXNrcykgewotCQkJCQkvLyByZW1vdmUgb2xkIEphdmEgdGFzayBtYXJrZXJzCi0JCQkJCXRyeSB7Ci0JCQkJCQlJTWFya2VyW10gZm91bmRNYXJrZXJzID0gZi5maW5kTWFya2VycyhKQVZBX1RBU0tfTUFSS0VSX1RZUEUsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9PTkUpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb3VuZE1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlmb3VuZE1hcmtlcnNbaV0uZGVsZXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXRyYW5zbGF0aW9uLnNldFByb2JsZW1Db2xsZWN0aW5nQWN0aXZlKHRydWUpOwotCQkJCXRyYW5zbGF0aW9uLnJlY29uY2lsZUNvbXBpbGF0aW9uVW5pdCgpOwotCQkJCUxpc3QgcHJvYmxlbXMgPSB0cmFuc2xhdGlvbi5nZXRQcm9ibGVtcygpOwotCQkJCS8vIGFkZCBuZXcgbWVzc2FnZXMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1zLnNpemUoKSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsgaSsrKSB7Ci0JCQkJCUlQcm9ibGVtIHByb2JsZW0gPSAoSVByb2JsZW0pIHByb2JsZW1zLmdldChpKTsKLQkJCQkJSU1lc3NhZ2UgbSA9IGNyZWF0ZU1lc3NhZ2VGcm9tUHJvYmxlbShwcm9ibGVtLCBmLCB0cmFuc2xhdGlvbiwgZG9tTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCQlpZiAobSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAocHJvYmxlbS5nZXRJRCgpID09IElQcm9ibGVtLlRhc2spIHsKLQkJCQkJCQlpZiAodXBkYXRlSmF2YVRhc2tzKSB7Ci0JCQkJCQkJCS8vIGFkZCBuZXcgSmF2YSB0YXNrIG1hcmtlcgotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJSU1hcmtlciB0YXNrID0gZi5jcmVhdGVNYXJrZXIoSkFWQV9UQVNLX01BUktFUl9UWVBFKTsKLQkJCQkJCQkJCXRhc2suc2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIG5ldyBJbnRlZ2VyKG0uZ2V0TGluZU51bWJlcigpKSk7Ci0JCQkJCQkJCQl0YXNrLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIG5ldyBJbnRlZ2VyKG0uZ2V0T2Zmc2V0KCkpKTsKLQkJCQkJCQkJCXRhc2suc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQsIG5ldyBJbnRlZ2VyKG0uZ2V0T2Zmc2V0KCkgKyBtLmdldExlbmd0aCgpKSk7Ci0JCQkJCQkJCQl0YXNrLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIG0uZ2V0VGV4dCgpKTsKLQkJCQkJCQkJCXRhc2suc2V0QXR0cmlidXRlKElNYXJrZXIuVVNFUl9FRElUQUJMRSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJCQkJCQkJCXN3aXRjaCAobS5nZXRTZXZlcml0eSgpKSB7Ci0JCQkJCQkJCQkJY2FzZSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOiB7Ci0JCQkJCQkJCQkJCXRhc2suc2V0QXR0cmlidXRlKElNYXJrZXIuUFJJT1JJVFksIG5ldyBJbnRlZ2VyKElNYXJrZXIuUFJJT1JJVFlfSElHSCkpOwotCQkJCQkJCQkJCQl0YXNrLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBuZXcgSW50ZWdlcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIElNZXNzYWdlLkxPV19TRVZFUklUWSA6IHsKLQkJCQkJCQkJCQkJdGFzay5zZXRBdHRyaWJ1dGUoSU1hcmtlci5QUklPUklUWSwgbmV3IEludGVnZXIoSU1hcmtlci5QUklPUklUWV9MT1cpKTsKLQkJCQkJCQkJCQkJdGFzay5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgbmV3IEludGVnZXIoSU1hcmtlci5TRVZFUklUWV9JTkZPKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQlkZWZhdWx0IDogewotCQkJCQkJCQkJCQl0YXNrLnNldEF0dHJpYnV0ZShJTWFya2VyLlBSSU9SSVRZLCBuZXcgSW50ZWdlcihJTWFya2VyLlBSSU9SSVRZX05PUk1BTCkpOwotCQkJCQkJCQkJCQl0YXNrLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBuZXcgSW50ZWdlcihJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQl1bmxvYWRQcmVmZXJlbmNlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1bmxvYWRQcmVmZXJlbmNlcygpIHsKLQkJZlNjb3BlcyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgb25lIGZpbGUuIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIGhhcyBKU1AgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoREVCVUcpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB2YWxpZGF0aW5nOiAiICsgZik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJLy8gZ2V0IGpzcCBtb2RlbCwgZ2V0IHRyYW5sc2F0aW9uCi0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGYpOwotCQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpICYmIG1vZGVsICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IERFUEVORF9PTnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJYWRkRGVwZW5kc09uKGYuZ2V0UHJvamVjdCgpLmdldEZpbGUoREVQRU5EX09Oc1tpXSkpOwkKLQkJCQl9Ci0JCQkJLy8gZ2V0IGpzcCBtb2RlbCwgZ2V0IHRyYW5zbGF0aW9uCi0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKGZNZXNzYWdlT3JpZ2luYXRvciwgZik7Ci0JCQkJCXBlcmZvcm1WYWxpZGF0aW9uKGYsIHJlcG9ydGVyLCBtb2RlbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlY29yZCB0aGF0IHRoZSBjdXJyZW50bHkgdmFsaWRhdGluZyByZXNvdXJjZSBkZXBlbmRzIG9uIHRoZSBnaXZlbgotCSAqIGZpbGUuIE9ubHkgcG9zc2libGUgZHVyaW5nIGJhdGNoIChub3Qgc291cmNlKSB2YWxpZGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZERlcGVuZHNPbihJRmlsZSBmaWxlKSB7Ci0JCWlmIChmTWVzc2FnZU9yaWdpbmF0b3IgaW5zdGFuY2VvZiBKU1BCYXRjaFZhbGlkYXRvcikgewotCQkJKChKU1BCYXRjaFZhbGlkYXRvcikgZk1lc3NhZ2VPcmlnaW5hdG9yKS5hZGREZXBlbmRzT24oZmlsZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiMjBjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5KU1BGQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotLyoqCi0gKiBQZXJmb3JtcyBzb21lIGNvbW1vbiBKU1AgdmFsaWRhdGlvbiB0YXNrcwotICovCi1wdWJsaWMgY2xhc3MgSlNQVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9ySm9iIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSURfSlNQX0NPUkUgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZKU1BGQ29udGVudFR5cGUgPSBudWxsOwotCi0JcHJvdGVjdGVkIGNsYXNzIExvY2FsaXplZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKLQotCQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZSA9IG51bGw7Ci0KLQkJcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQpIHsKLQkJCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSB7Ci0JCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgKE9iamVjdCkgdGFyZ2V0T2JqZWN0KTsKLQkJfQotCi0JCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCQlzdXBlcihudWxsLCBzZXZlcml0eSwgbnVsbCk7Ci0JCQlzZXRMb2NhbGl6ZWRNZXNzYWdlKG1lc3NhZ2VUZXh0KTsKLQkJCXNldFRhcmdldE9iamVjdCh0YXJnZXRPYmplY3QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TG9jYWxpemVkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQkJX21lc3NhZ2UgPSBtZXNzYWdlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgewotCQkJcmV0dXJuIF9tZXNzYWdlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCwgQ2xhc3NMb2FkZXIgY2wpIHsKLQkJCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCi0JCXByaXZhdGUgTGlzdCBmRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByaXZhdGUgSUNvbnRlbnRUeXBlW10gZkNvbnRlbnRUeXBlcyA9IG51bGw7Ci0JCXByaXZhdGUgSVJlcG9ydGVyIGZSZXBvcnRlciA9IG51bGw7Ci0KLQkJcHVibGljIEpTUEZpbGVWaXNpdG9yKElSZXBvcnRlciByZXBvcnRlcikgewotCQkJZlJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCQkvLyBjaGVjayB2YWxpZGF0aW9uCi0JCQlpZiAoZlJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0KLQkJCQlpZiAoaXNKU1BUeXBlKHByb3h5LmdldE5hbWUoKSkpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0KLQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBKU1BWYWxpZGF0b3IgYWRkaW5nIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZGaWxlcy5hZGQoZmlsZSk7Ci0KLQkJCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBmaW5hbCBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkJcmV0dXJuIChJRmlsZVtdKSBmRmlsZXMudG9BcnJheShuZXcgSUZpbGVbZkZpbGVzLnNpemUoKV0pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldHMgbGlzdCBvZiBjb250ZW50IHR5cGVzIHRoaXMgdmlzaXRvciBpcyBpbnRlcmVzdGVkIGluCi0JCSAqIAotCQkgKiBAcmV0dXJuIEFsbCBKU1AtcmVsYXRlZCBjb250ZW50IHR5cGVzCi0JCSAqLwotCQlwcml2YXRlIElDb250ZW50VHlwZVtdIGdldFZhbGlkQ29udGVudFR5cGVzKCkgewotCQkJaWYgKGZDb250ZW50VHlwZXMgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnRseSAiaGFyZC1jb2RlZCIgdG8gYmUganNwICYganNwZgotCQkJCWZDb250ZW50VHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW117UGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCksIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVCl9OwotCQkJfQotCQkJcmV0dXJuIGZDb250ZW50VHlwZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQ2hlY2tzIGlmIGZpbGVOYW1lIGlzIHNvbWUgdHlwZSBvZiBKU1AgKGluY2x1ZGluZyBKU1AgZnJhZ21lbnRzKQotCQkgKiAKLQkJICogQHBhcmFtIGZpbGVOYW1lCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiBmaWxlbmFtZSBpbmRpY2F0ZXMgc29tZSB0eXBlIG9mIEpTUCwgZmFsc2UKLQkJICogICAgICAgICBvdGhlcndpc2UKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBpc0pTUFR5cGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gZ2V0VmFsaWRDb250ZW50VHlwZXMoKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNBc3NvY2lhdGVkV2l0aChmaWxlTmFtZSk7Ci0JCQkJKytpOwotCQkJfQotCQkJcmV0dXJuIHZhbGlkOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmdbXSB1cmlzID0gaGVscGVyLmdldFVSSXMoKTsKLQkJSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJaWYgKHVyaXMubGVuZ3RoID4gMCkgewotCQkJSUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQkvLyBtaWdodCBiZSBjYWxsZWQgd2l0aCBqdXN0IHByb2plY3QgcGF0aD8KLQkJCQljdXJyZW50RmlsZSA9IHdzUm9vdC5nZXRGaWxlKG5ldyBQYXRoKHVyaXNbaV0pKTsKLQkJCQlpZiAoY3VycmVudEZpbGUgIT0gbnVsbCAmJiBjdXJyZW50RmlsZS5leGlzdHMoKSkgewotCQkJCQlpZiAoc2hvdWxkVmFsaWRhdGUoY3VycmVudEZpbGUpICYmIGZyYWdtZW50Q2hlY2soY3VycmVudEZpbGUpKSB7Ci0KLQkJCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgdXJpc1tpXSk7Ci0JCQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQotCQkJCQkJdmFsaWRhdGVGaWxlKGN1cnJlbnRGaWxlLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0aW5nOiBbIiArIHVyaXNbaV0gKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCS8vIGlmIHVyaXNbXSBsZW5ndGggMCAtPiB2YWxpZGF0ZSgpIGdldHMgY2FsbGVkIGZvciBlYWNoIHByb2plY3QKLQkJCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBJV29ya2JlbmNoQ29udGV4dCkgewotCi0JCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuZ2V0UHJvamVjdCgpOwotCQkJCUpTUEZpbGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSlNQRmlsZVZpc2l0b3IocmVwb3J0ZXIpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIGNvbGxlY3QgYWxsIGpzcCBmaWxlcyBmb3IgdGhlIHByb2plY3QKLQkJCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQlJRmlsZVtdIGZpbGVzID0gdmlzaXRvci5nZXRGaWxlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQkJaWYgKHNob3VsZFZhbGlkYXRlKGZpbGVzW2ldKSAmJiBmcmFnbWVudENoZWNrKGZpbGVzW2ldKSkgewotCQkJCQkJaW50IHBlcmNlbnQgPSAoaSAqIDEwMCkgLyBmaWxlcy5sZW5ndGggKyAxOwotCQkJCQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBwZXJjZW50ICsgIiUgIiArIGZpbGVzW2ldLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQotCQkJCQkJdmFsaWRhdGVGaWxlKGZpbGVzW2ldLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0aW5nOiBbIiArIGZpbGVzW2ldICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgb25lIGZpbGUuIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIGhhcyBKU1AgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgKGZvciBiYXRjaCB2YWxpZGF0aW9uKQotCX0KLQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwotCQlmaW5hbCBJUmVwb3J0ZXIgcmVwb3J0ZXIgPSByZXN1bHQuZ2V0UmVwb3J0ZXIobW9uaXRvcik7Ci0JCXZhbGlkYXRlRmlsZSgoSUZpbGUpIHJlc291cmNlLCByZXBvcnRlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKiBAcmV0dXJuIHRoZSBqc3AgZGlyZWN0aXZlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpcmVjdGl2ZU5hbWUoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJVGV4dFJlZ2lvbkxpc3Qgc3ViUmVnaW9ucyA9IGNvbGxlY3Rpb24uZ2V0UmVnaW9ucygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHN1YlJlZ2lvbnMuc2l6ZSgpOyBqKyspIHsKLQkJCUlUZXh0UmVnaW9uIHN1YlJlZ2lvbiA9IHN1YlJlZ2lvbnMuZ2V0KGopOwotCQkJaWYgKHN1YlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJbmFtZSA9IGNvbGxlY3Rpb24uZ2V0VGV4dChzdWJSZWdpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzZHIKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKiBAcmV0dXJuIHRoZSBJVGV4dFJlZ2lvbiBmb3IgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYXR0cmlidXRlCi0JICogICAgICAgICBuYW1lLCBjYXNlIHNlbnNpdGl2ZSwgbnVsbCBpZiBubyBtYXRjaGluZyBhdHRyaWJ1dGUgaXMgZm91bmQKLQkgKi8KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oSVRleHRSZWdpb25Db2xsZWN0aW9uIHNkciwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHN1YlJlZ2lvbnMgPSBzZHIuZ2V0UmVnaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YlJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHN1YlJlZ2lvbiA9IHN1YlJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHN1YlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FICYmIHNkci5nZXRUZXh0KHN1YlJlZ2lvbikuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCWZvciAoaW50IGogPSBpOyBqIDwgc3ViUmVnaW9ucy5zaXplKCk7IGorKykgewotCQkJCQlzdWJSZWdpb24gPSBzdWJSZWdpb25zLmdldChqKTsKLQkJCQkJaWYgKHN1YlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJdmFsdWVSZWdpb24gPSBzdWJSZWdpb247Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWVSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gc2RyLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJSVRleHRSZWdpb24gciA9IGdldEF0dHJpYnV0ZVZhbHVlUmVnaW9uKHNkciwgYXR0ck5hbWUpOwotCQlpZiAociAhPSBudWxsKQotCQkJcmV0dXJuIHNkci5nZXRUZXh0KHIpLnRyaW0oKTsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBmaWxlIGlzIGpzcCBmcmFnbWVudCBvciBub3QgKGRvZXMgYSBkZWVwLCBpbmRlcHRoIGNoZWNrLAotCSAqIGxvb2tpbmcgaW50byBjb250ZW50cyBvZiBmaWxlKQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhc3N1bWVzIGZpbGUgaXMgbm90IG51bGwgYW5kIGV4aXN0cwotCSAqIEByZXR1cm4gdHJ1ZSBpZiBmaWxlIGlzIGpzcCBmcmFnbWVudCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRnJhZ21lbnQoSUZpbGUgZmlsZSkgewotCQlib29sZWFuIGlzRnJhZ21lbnQgPSBmYWxzZTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJLy8gaXQgY2FuIGJlIG51bGwKLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJCWlzID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldERlc2NyaXB0aW9uRm9yKGlzLCBmaWxlLmdldE5hbWUoKSwgbmV3IFF1YWxpZmllZE5hbWVbXXtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVR9KTsKLQkJCX0KLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlQ3RJZCA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpLmdldElkKCk7Ci0JCQkJaXNGcmFnbWVudCA9IChmaWxlQ3RJZCAhPSBudWxsICYmIENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVC5lcXVhbHMoZmlsZUN0SWQpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCBhc3N1bWUgaXQncyBpbnZhbGlkIEpTUAotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSwgYXNzdW1lIGl0J3MgaW52YWxpZCBKU1AKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIG11c3QgY2xvc2UgaW5wdXQgc3RyZWFtIGluIGNhc2Ugb3RoZXJzIG5lZWQgaXQKLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBub3Qgc3VyZSBob3cgdG8gcmVjb3ZlciBhdCB0aGlzIHBvaW50Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBpc0ZyYWdtZW50OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJRmlsZSBmaWxlKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGZpbGU7Ci0JCWRvIHsKLQkJCWlmIChyZXNvdXJjZS5pc0Rlcml2ZWQoKSB8fCByZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgfHwgIXJlc291cmNlLmlzQWNjZXNzaWJsZSgpIHx8IHJlc291cmNlLmdldE5hbWUoKS5jaGFyQXQoMCkgPT0gJy4nKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJfQotCQl3aGlsZSAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5QUk9KRUNUKSA9PSAwKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdmFsaWRhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBmaWxlIGlzIGEganNwIGZyYWdtZW50IG9yIG5vdC4gSWYgc28sIGNoZWNrIGlmIHRoZSBmcmFnbWVudAotCSAqIHNob3VsZCBiZSB2YWxpZGF0ZWQgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBBc3N1bWVzIHNob3VsZFZhbGlkYXRlIHdhcyBhbHJlYWR5IGNhbGxlZCBvbiBmaWxlIHNvIGl0Ci0JICogICAgICAgICAgICBzaG91bGQgbm90IGJlIG51bGwgYW5kIGRvZXMgZXhpc3QKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGZpbGUgaXMgYSBmcmFnbWVudCBhbmQgaXQgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQsCi0JICogICAgICAgICB0cnVlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmcmFnbWVudENoZWNrKElGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiBzaG91bGRWYWxpZGF0ZSA9IHRydWU7Ci0JCS8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIHBvc3NpYmx5IGEganNwIGZyYWdtZW50Ci0JCWlmIChnZXRKU1BGQ29udGVudFR5cGUoKS5pc0Fzc29jaWF0ZWRXaXRoKGZpbGUuZ2V0TmFtZSgpKSkgewotCQkJLy8gZ2V0IHByZWZlcmVuY2UgZm9yIHZhbGlkYXRlIGpzcCBmcmFnbWVudHMKLQkJCWJvb2xlYW4gc2hvdWxkVmFsaWRhdGVGcmFnbWVudHMgPSBCb29sZWFuLnZhbHVlT2YoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5WQUxJREFURV9GUkFHTUVOVFMsIGZpbGUsIHRydWUpKS5ib29sZWFuVmFsdWUoKTsKLQkJCS8qCi0JCQkgKiBpZiBqc3AgZnJhZ21lbnRzIHNob3VsZCBub3QgYmUgdmFsaWRhdGVkLCBjaGVjayBpZiBmaWxlIGlzCi0JCQkgKiByZWFsbHkganNwIGZyYWdtZW50Ci0JCQkgKi8KLQkJCWlmICghc2hvdWxkVmFsaWRhdGVGcmFnbWVudHMpIHsKLQkJCQlib29sZWFuIGlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50KGZpbGUpOwotCQkJCXNob3VsZFZhbGlkYXRlID0gIWlzRnJhZ21lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNob3VsZFZhbGlkYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgSlNQIGZyYWdtZW50IGNvbnRlbnQgdHlwZQotCSAqIAotCSAqIEByZXR1cm4ganNwZiBjb250ZW50IHR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRKU1BGQ29udGVudFR5cGUoKSB7Ci0JCWlmIChmSlNQRkNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWZKU1BGQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQpOwotCQl9Ci0JCXJldHVybiBmSlNQRkNvbnRlbnRUeXBlOwotCX0KLQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXRyeSB7Ci0JCQl2YWxpZGF0ZShoZWxwZXIsIHJlcG9ydGVyKTsKLQkJfQotCQljYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSURfSlNQX0NPUkUsIElTdGF0dXMuRVJST1IsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vTG9jYWxpemVkTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0xvY2FsaXplZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkMmYzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vTG9jYWxpemVkTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotCi0vKioKLSAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBNZXNzYWdlIGFsbCB2YWxpZGF0b3JzIGluIHBhY2thZ2UgY2FuIHVzZS4KLSAqLwotY2xhc3MgTG9jYWxpemVkTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2UgewotCXByaXZhdGUgU3RyaW5nIF9tZXNzYWdlID0gbnVsbDsKLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0KSB7Ci0JCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgSVJlc291cmNlIHRhcmdldE9iamVjdCkgewotCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgKE9iamVjdCkgdGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQlzdXBlcihudWxsLCBzZXZlcml0eSwgbnVsbCk7Ci0JCXNldExvY2FsaXplZE1lc3NhZ2UobWVzc2FnZVRleHQpOwotCQlzZXRUYXJnZXRPYmplY3QodGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbGl6ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9tZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBfbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KENsYXNzTG9hZGVyIGNsKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsLCBDbGFzc0xvYWRlciBjbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9UTERWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9UTERWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4NzBjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vVExEVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDExVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5NYXJrdXBWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBBIG1pbmlhdHVyZSB2YWxpZGF0b3IgZm9yIC50bGQgZmlsZXMuIENoZWNrcyBmb3IgdmFsaWQgY2xhc3MgbmFtZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUTERWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9UWVBFID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS52YWxpZGF0aW9uTWFya2VyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlc1NlcnZpY2UgZlByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gY2xhc3NFbGVtZW50TmFtZXMgPSBuZXcgU3RyaW5nW117SlNQMTFUTEROYW1lcy5UQUdDTEFTUywgSlNQMTJUTEROYW1lcy5UQUdfQ0xBU1MsIEpTUDExVExETmFtZXMuVEVJQ0xBU1MsIEpTUDEyVExETmFtZXMuVEVJX0NMQVNTLCBKU1AxMlRMRE5hbWVzLlZBTElEQVRPUl9DTEFTUywgSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9DTEFTUywgSlNQMTJUTEROYW1lcy5MSVNURU5FUl9DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbWlzc2luZ0NsYXNzTWVzc2FnZXMgPSBuZXcgU3RyaW5nW117SlNQQ29yZU1lc3NhZ2VzLlRhZ2xpYkhlbHBlcl8zLCBKU1BDb3JlTWVzc2FnZXMuVGFnbGliSGVscGVyXzMsIEpTUENvcmVNZXNzYWdlcy5UYWdsaWJIZWxwZXJfMCwgSlNQQ29yZU1lc3NhZ2VzLlRhZ2xpYkhlbHBlcl8wLCBKU1BDb3JlTWVzc2FnZXMuVExEVmFsaWRhdG9yX01pc3NpbmdWYWxpZGF0b3IsIEpTUENvcmVNZXNzYWdlcy5UTERWYWxpZGF0b3JfTWlzc2luZ1ZhcmlhYmxlLCBKU1BDb3JlTWVzc2FnZXMuVExEVmFsaWRhdG9yX01pc3NpbmdMaXN0ZW5lcn07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbWlzc2luZ0NsYXNzU2V2ZXJpdHlQcmVmZXJlbmNlS2V5cyA9IG5ldyBTdHJpbmdbXXtKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEFHX0hBTkRMRVJfQ0xBU1NfTk9UX0ZPVU5ELCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEFHX0hBTkRMRVJfQ0xBU1NfTk9UX0ZPVU5ELCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX05PVF9GT1VORCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19OT1RfRk9VTkQsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9UQUdfSEFORExFUl9DTEFTU19OT1RfRk9VTkQsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9UQUdfSEFORExFUl9DTEFTU19OT1RfRk9VTkQsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9UQUdfSEFORExFUl9DTEFTU19OT1RfRk9VTkR9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR1hfQ09OVEVOVF9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWd4c291cmNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgTGlzdCBmVGFnWGV4dHMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVGFnWG5hbWVzID0gbnVsbDsKLQotCXB1YmxpYyBUTERWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJQXNzZXJ0LmlzVHJ1ZShjbGFzc0VsZW1lbnROYW1lcy5sZW5ndGggPT0gbWlzc2luZ0NsYXNzTWVzc2FnZXMubGVuZ3RoLCAibWlzbWFuYWdlZCBhcnJheXMiKTsgLy8kTk9OLU5MUy0xJAotCQlBc3NlcnQuaXNUcnVlKGNsYXNzRWxlbWVudE5hbWVzLmxlbmd0aCA9PSBtaXNzaW5nQ2xhc3NTZXZlcml0eVByZWZlcmVuY2VLZXlzLmxlbmd0aCwgIm1pc21hbmFnZWQgYXJyYXlzIik7IC8vJE5PTi1OTFMtMSQKLQkJQXNzZXJ0LmlzVHJ1ZShtaXNzaW5nQ2xhc3NNZXNzYWdlcy5sZW5ndGggPT0gbWlzc2luZ0NsYXNzU2V2ZXJpdHlQcmVmZXJlbmNlS2V5cy5sZW5ndGgsICJtaXNtYW5hZ2VkIGFycmF5cyIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlpbml0Q29udGVudFR5cGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDb250ZW50VHlwZXMoKSB7Ci0JCWZUYWdYZXh0cyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShUQUdYX0NPTlRFTlRfVFlQRV9JRCkuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZVNldHRpbmdzLkZJTEVfRVhURU5TSU9OX1NQRUMpKSk7Ci0JCWZUYWdYbmFtZXMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoVEFHWF9DT05URU5UX1RZUEVfSUQpLmdldEZpbGVTcGVjcyhJQ29udGVudFR5cGVTZXR0aW5ncy5GSUxFX05BTUVfU1BFQykpKTsKLQl9Ci0KLQlwcml2YXRlIE1hcCBjaGVja0NsYXNzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgTm9kZSBjbGFzc1NwZWNpZmllciwgSVNjb3BlQ29udGV4dFtdIHByZWZlcmVuY2VTY29wZXMsIFN0cmluZyBwcmVmZXJlbmNlS2V5LCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRUZXh0Q29udGVudHMoY2xhc3NTcGVjaWZpZXIpOwotCQlpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmxlbmd0aCgpID4gMikgewotCQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShjbGFzc05hbWUpOwotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCWlmICh0eXBlID09IG51bGwgfHwgIXR5cGUuZXhpc3RzKCkpIHsKLQkJCQlPYmplY3Qgc2V2ZXJpdHkgPSBnZXRNZXNzYWdlU2V2ZXJpdHkocHJlZmVyZW5jZVNjb3BlcywgcHJlZmVyZW5jZUtleSk7Ci0JCQkJaWYgKHNldmVyaXR5ID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCi0JCQkJSURPTU5vZGUgY2xhc3NFbGVtZW50ID0gKElET01Ob2RlKSBjbGFzc1NwZWNpZmllcjsKLQkJCQlNYXAgbWFya2VyVmFsdWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQltYXJrZXJWYWx1ZXMucHV0KElNYXJrZXIuU0VWRVJJVFksIHNldmVyaXR5KTsKLQkJCQlpbnQgc3RhcnQgPSBjbGFzc0VsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpZiAoY2xhc3NFbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCAmJiBjbGFzc0VsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkKLQkJCQkJc3RhcnQgPSBjbGFzc0VsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQltYXJrZXJWYWx1ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgbmV3IEludGVnZXIoc3RhcnQpKTsKLQkJCQlpbnQgZW5kID0gY2xhc3NFbGVtZW50LmdldEVuZE9mZnNldCgpOwotCQkJCWlmIChjbGFzc0VsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsICYmIGNsYXNzRWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKQotCQkJCQllbmQgPSBjbGFzc0VsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQltYXJrZXJWYWx1ZXMucHV0KElNYXJrZXIuQ0hBUl9FTkQsIG5ldyBJbnRlZ2VyKGVuZCkpOwotCQkJCWludCBsaW5lID0gY2xhc3NFbGVtZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJbWFya2VyVmFsdWVzLnB1dChJTWFya2VyLkxJTkVfTlVNQkVSLCBuZXcgSW50ZWdlcihsaW5lICsgMSkpOwotCQkJCW1hcmtlclZhbHVlcy5wdXQoSU1hcmtlci5NRVNTQUdFLCBOTFMuYmluZChlcnJvck1lc3NhZ2UsIChlcnJvck1lc3NhZ2UuaW5kZXhPZigiezF9IikgPj0gMCkgPyBuZXcgU3RyaW5nW117Z2V0VGFnTmFtZShjbGFzc1NwZWNpZmllciksIGNsYXNzTmFtZX0gOiBuZXcgU3RyaW5nW117Y2xhc3NOYW1lfSkpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG1hcmtlclZhbHVlczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE1hcFtdIGRldGVjdFByb2JsZW1zKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUZpbGUgdGxkLCBJU2NvcGVDb250ZXh0W10gcHJlZmVyZW5jZVNjb3BlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0IHByb2JsZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQodGxkKTsKLQkJCWlmIChtICE9IG51bGwgJiYgbSBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtKS5nZXREb2N1bWVudCgpOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc0VsZW1lbnROYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlOb2RlTGlzdCBjbGFzc2VzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoY2xhc3NFbGVtZW50TmFtZXNbaV0pOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNsYXNzZXMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJTWFwIHByb2JsZW0gPSBjaGVja0NsYXNzKGphdmFQcm9qZWN0LCBjbGFzc2VzLml0ZW0oaiksIHByZWZlcmVuY2VTY29wZXMsIG1pc3NpbmdDbGFzc1NldmVyaXR5UHJlZmVyZW5jZUtleXNbaV0sIG1pc3NpbmdDbGFzc01lc3NhZ2VzW2ldKTsKLQkJCQkJCWlmIChwcm9ibGVtICE9IG51bGwpCi0JCQkJCQkJcHJvYmxlbXMuYWRkKHByb2JsZW0pOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobSAhPSBudWxsKQotCQkJCW0ucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQotCQlyZXR1cm4gKE1hcFtdKSBwcm9ibGVtcy50b0FycmF5KG5ldyBNYXBbcHJvYmxlbXMuc2l6ZSgpXSk7Ci0JfQotCi0JSW50ZWdlciBnZXRNZXNzYWdlU2V2ZXJpdHkoSVNjb3BlQ29udGV4dFtdIHByZWZlcmVuY2VTY29wZXMsIFN0cmluZyBrZXkpIHsKLQkJaW50IHNldiA9IGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0SW50KFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIsIGtleSwgSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLCBwcmVmZXJlbmNlU2NvcGVzKTsKLQkJc3dpdGNoIChzZXYpIHsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IgOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyA6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLklORk9STUFUSU9OIDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoSU1hcmtlci5TRVZFUklUWV9JTkZPKTsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFIDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbmV3IEludGVnZXIoSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRUYWdOYW1lKE5vZGUgY2xhc3NTcGVjaWZpZXIpIHsKLQkJTm9kZSB0YWdFbGVtZW50ID0gY2xhc3NTcGVjaWZpZXIuZ2V0UGFyZW50Tm9kZSgpOwotCQlOb2RlIGNoaWxkID0gdGFnRWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBuYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAoSlNQMTFUTEROYW1lcy5OQU1FLmVxdWFscyhuYW1lKSkKLQkJCQkJcmV0dXJuIGdldFRleHRDb250ZW50cyhjaGlsZCk7Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFRleHRDb250ZW50cyhOb2RlIHBhcmVudCkgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSA9PSAxKSB7Ci0JCQlyZXR1cm4gY2hpbGRyZW4uaXRlbSgwKS5nZXROb2RlVmFsdWUoKS50cmltKCk7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJcy5hcHBlbmQoY2hpbGQuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpKTsKLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gcy50b1N0cmluZygpLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0JCVZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKLQotCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCS8vIFRBR1gKLQkJCWlmIChmVGFnWGV4dHMuY29udGFpbnMoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkpIHx8IGZUYWdYbmFtZXMuY29udGFpbnMoZmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDMpOwotCQkJCW9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yIHhtbFZhbGlkYXRvciA9IG5ldyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvcigpOwotCQkJCVZhbGlkYXRpb25SZXN1bHQgcmVzdWx0MyA9IG5ldyBNYXJrdXBWYWxpZGF0b3IoKS52YWxpZGF0ZShyZXNvdXJjZSwga2luZCwgc3RhdGUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCWlmKG1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm4gcmVzdWx0OwotCQkJCVZhbGlkYXRpb25SZXN1bHQgcmVzdWx0MiA9IHhtbFZhbGlkYXRvci52YWxpZGF0ZShyZXNvdXJjZSwga2luZCwgc3RhdGUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCWlmKG1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm4gcmVzdWx0OwotCQkJCVZhbGlkYXRpb25SZXN1bHQgcmVzdWx0MSA9IG5ldyBKU1BBY3Rpb25WYWxpZGF0b3IoKS52YWxpZGF0ZShyZXNvdXJjZSwga2luZCwgc3RhdGUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCUxpc3QgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KHJlc3VsdDEuZ2V0UmVwb3J0ZXIobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSkuZ2V0TWVzc2FnZXMoKSk7Ci0JCQkJbWVzc2FnZXMuYWRkQWxsKHJlc3VsdDIuZ2V0UmVwb3J0ZXIobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSkuZ2V0TWVzc2FnZXMoKSk7Ci0JCQkJbWVzc2FnZXMuYWRkQWxsKHJlc3VsdDMuZ2V0UmVwb3J0ZXIobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSkuZ2V0TWVzc2FnZXMoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5zaXplKCk7IGkrKykgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gKElNZXNzYWdlKSBtZXNzYWdlcy5nZXQoaSk7Ci0JCQkJCWlmIChtZXNzYWdlLmdldFRleHQoKSAhPSBudWxsICYmIG1lc3NhZ2UuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJVmFsaWRhdG9yTWVzc2FnZSB2bWVzc2FnZSA9IFZhbGlkYXRvck1lc3NhZ2UuY3JlYXRlKG1lc3NhZ2UuZ2V0VGV4dCgpLCByZXNvdXJjZSk7Ci0JCQkJCQlpZiAobWVzc2FnZS5nZXRBdHRyaWJ1dGVzKCkgIT0gbnVsbCkgewotCQkJCQkJCU1hcCBhdHRycyA9IG1lc3NhZ2UuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJCUl0ZXJhdG9yIGl0ID0gYXR0cnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCQkJCQlpZiAoIShlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nIHx8IGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBJbnRlZ2VyIHx8IGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCb29sZWFuKSkgewotCQkJCQkJCQkJaXQucmVtb3ZlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJdm1lc3NhZ2Uuc2V0QXR0cmlidXRlcyhhdHRycyk7Ci0JCQkJCQl9Ci0JCQkJCQl2bWVzc2FnZS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgbWVzc2FnZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCQkJdm1lc3NhZ2Uuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgbWVzc2FnZS5nZXRUZXh0KCkpOwotCQkJCQkJaWYgKG1lc3NhZ2UuZ2V0T2Zmc2V0KCkgPiAtMSkgewotCQkJCQkJCXZtZXNzYWdlLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIG1lc3NhZ2UuZ2V0T2Zmc2V0KCkpOwotCQkJCQkJCXZtZXNzYWdlLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCBtZXNzYWdlLmdldE9mZnNldCgpICsgbWVzc2FnZS5nZXRMZW5ndGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpbnQgc2V2ZXJpdHkgPSAwOwotCQkJCQkJc3dpdGNoIChtZXNzYWdlLmdldFNldmVyaXR5KCkpIHsKLQkJCQkJCQljYXNlIElNZXNzYWdlLkhJR0hfU0VWRVJJVFkgOgotCQkJCQkJCQlzZXZlcml0eSA9IElNYXJrZXIuU0VWRVJJVFlfRVJST1I7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZIDoKLQkJCQkJCQkJc2V2ZXJpdHkgPSBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSU1lc3NhZ2UuTE9XX1NFVkVSSVRZIDoKLQkJCQkJCQkJc2V2ZXJpdHkgPSBJTWFya2VyLlNFVkVSSVRZX0lORk87Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJdm1lc3NhZ2Uuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIHNldmVyaXR5KTsKLQkJCQkJCXZtZXNzYWdlLnNldFR5cGUoTUFSS0VSX1RZUEUpOwotCQkJCQkJcmVzdWx0LmFkZCh2bWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCQkvLyBUTEQKLQkJCWVsc2UgewotCQkJCXRyeSB7Ci0JCQkJCWZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShmaWxlLmdldFByb2plY3QoKSk7Ci0JCQkJCWlmIChqYXZhUHJvamVjdC5leGlzdHMoKSkgewotCQkJCQkJSVNjb3BlQ29udGV4dFtdIHNjb3BlcyA9IG5ldyBJU2NvcGVDb250ZXh0W117bmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQkJCQkJCVByb2plY3RTY29wZSBwcm9qZWN0U2NvcGUgPSBuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCWlmIChwcm9qZWN0U2NvcGUuZ2V0Tm9kZShQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSKS5nZXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9VU0VfUFJPSkVDVF9TRVRUSU5HUywgZmFsc2UpKSB7Ci0JCQkJCQkJc2NvcGVzID0gbmV3IElTY29wZUNvbnRleHRbXXtwcm9qZWN0U2NvcGUsIG5ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JCQkJCQl9Ci0JCQkJCQlNYXBbXSBwcm9ibGVtcyA9IGRldGVjdFByb2JsZW1zKGphdmFQcm9qZWN0LCBmaWxlLCBzY29wZXMpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9ibGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCVZhbGlkYXRvck1lc3NhZ2UgbWVzc2FnZSA9IFZhbGlkYXRvck1lc3NhZ2UuY3JlYXRlKHByb2JsZW1zW2ldLmdldChJTWFya2VyLk1FU1NBR0UpLnRvU3RyaW5nKCksIHJlc291cmNlKTsKLQkJCQkJCQltZXNzYWdlLnNldFR5cGUoTUFSS0VSX1RZUEUpOwotCQkJCQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlcyhwcm9ibGVtc1tpXSk7Ci0JCQkJCQkJcmVzdWx0LmFkZChtZXNzYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvanNwZWwvRUxQcm9ibGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2pzcGVsL0VMUHJvYmxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTg4NTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvanNwZWwvRUxQcm9ibGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEJ1ZyAyOTgzMDQgVXNlci1jb25maWd1cmFibGUgc2V2ZXJpdGllcyBmb3IgRUwgcHJvYmxlbXMKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotCi0vKioKLSAqIDxwPlJlcHJlc2VudHMgYW4gRUwgcHJvYmxlbSBpbiBhIEpTUCBkb2N1bWVudDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEVMUHJvYmxlbSBpbXBsZW1lbnRzIElKU1BQcm9ibGVtIHsKLQlwcml2YXRlIFBvc2l0aW9uIGZQb3M7Ci0JcHJpdmF0ZSBTdHJpbmcgZk1lc3NhZ2U7Ci0JcHJpdmF0ZSBpbnQgZklkID0gSUpTUFByb2JsZW0uRUxQcm9ibGVtOwotCXByaXZhdGUgaW50IGZTZXZlcml0eTsKLQotCS8qKgotCSAqIEBwYXJhbSBwb3Mgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBKU1AgZG9jdW1lbnQgdGhlIGVycm9yIGlzIHRvIGJlIHJlcG9ydGVkIG9uCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgRUxQcm9ibGVtKFBvc2l0aW9uIHBvcywgU3RyaW5nIG1lc3NhZ2UpCXsKLQkJdGhpcyhwb3MsIG1lc3NhZ2UsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQl9Ci0KLQlwdWJsaWMgRUxQcm9ibGVtKFBvc2l0aW9uIHBvcywgU3RyaW5nIG1lc3NhZ2UsIGludCBpZCkJewotCQl0aGlzKHBvcywgbWVzc2FnZSwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IsIGlkKTsKLQl9Ci0KLQlwdWJsaWMgRUxQcm9ibGVtKGludCBzZXZlcml0eSwgUG9zaXRpb24gcG9zLCBTdHJpbmcgbWVzc2FnZSkgewotCQlmUG9zID0gcG9zOwotCQlmTWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCWZTZXZlcml0eSA9IHNldmVyaXR5OwotCX0KLQotCXB1YmxpYyBFTFByb2JsZW0oUG9zaXRpb24gcG9zLCBTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5LCBpbnQgaWQpCXsKLQkJZlBvcyA9IHBvczsKLQkJZk1lc3NhZ2UgPSBtZXNzYWdlOwotCQlmSWQgPSBpZDsKLQkJZlNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZNZXNzYWdlOwotCX0KLQkKLQlwdWJsaWMgUG9zaXRpb24gZ2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBmUG9zOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBcmd1bWVudHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SUQoKSB7Ci0JCXJldHVybiBmSWQ7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0RUlEKCkgewotCQlyZXR1cm4gZklkOwotCX0KLQotCXB1YmxpYyBjaGFyW10gZ2V0T3JpZ2luYXRpbmdGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRTb3VyY2VFbmQoKSB7Ci0JCXJldHVybiBmUG9zLmdldE9mZnNldCgpICsgZlBvcy5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNvdXJjZUxpbmVOdW1iZXIoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U291cmNlU3RhcnQoKSB7Ci0JCXJldHVybiBmUG9zLmdldE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRXJyb3IoKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNXYXJuaW5nKCkgewotCQlyZXR1cm4gZlNldmVyaXR5ID09IFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U291cmNlRW5kKGludCBzb3VyY2VFbmQpIHt9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VMaW5lTnVtYmVyKGludCBsaW5lTnVtYmVyKSB7fQotCi0JcHVibGljIHZvaWQgc2V0U291cmNlU3RhcnQoaW50IHNvdXJjZVN0YXJ0KSB7fQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9qc3BlbC9JSlNQRUxUcmFuc2xhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2pzcGVsL0lKU1BFTFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVlODQ2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2pzcGVsL0lKU1BFTFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElKU1BFTFRyYW5zbGF0b3IgewotCi0JLyoqCi0JICogVG8gb3ZlcnJpZGUgdGhlIEVMIHRyYW5zbGF0aW9uLCBwbGVhc2Ugc2VlIHRoZSBleHRlbnNpb24gcG9pbnQgCi0JICogb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmVsdHJhbnNsYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZWxUZXh0ICBUaGUgdGV4dCB0byBiZSB0cmFuc2xhdGVkLgotCSAqIEBwYXJhbSBkZWxpbQlUaGUgc3RhcnRpbmcgZGVsaW1pdGVyCi0JICogQHBhcmFtIGN1cnJlbnROb2RlIFRoZSBjdXJyZW50IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiBAcGFyYW0gY29udGVudFN0YXJ0IFRoZSBzdGFydGluZyBvZmZzZXQgb2YgdGhlIEVMIHRvIGJlIHRyYW5zbGF0ZWQKLQkgKiBAcGFyYW0gY29udGVudExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBFTCBjb250ZW50IHRvIGJlIHRyYW5zbGF0ZWQKLQkgKiBAcGFyYW0gZlVzZXJFTEV4cHJlc3Npb25zIEEgc3RyaW5nIGJ1ZmZlciB0byB3aGljaCBnZW5lcmF0ZWQgY29kZSBjYW4gYmUgYXBwZW5kZWQuCi0JICoJCVRoZSB0ZXh0IGFwcGVuZGVkIGhlcmUgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBnZW5lcmF0ZWQgY2xhc3MgYXQgdGhlIHRvcCBsZXZlbCAKLQkgKgkJbm90IGF0IHRoZSBwb2ludCBpbiB0aGUgSlNQIHRyYW5zbGF0aW9uIHdoZXJlIHRoZSBFTCB3YXMgZm91bmQuIAotCSAqIAotCSAqIEBwYXJhbSBmVXNlckVMUmFuZ2VzICBNYXAgb2YgbG9jYXRpb24gcmFuZ2VzIGZyb20gSlNQIEVMIG9mZnNldHMgdG8gZ2VuZXJhdGVkIEphdmEgY29kZS4KLQkgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQuCi0JICogQHJldHVybiBBIGxpc3Qgb2YgRUxQcm9ibGVtcyB0aGF0IGRlc2NyaWJlcyBhbnkgc3ludGFjdGljIGlzc3VlcyBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgTGlzdCB0cmFuc2xhdGVFTChTdHJpbmcgZWxUZXh0LAotCQkJU3RyaW5nIGRlbGltLAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSwgCi0JCQlpbnQgY29udGVudFN0YXJ0LAotCQkJaW50IGNvbnRlbnRMZW5ndGgsCi0JCQlTdHJpbmdCdWZmZXIgdXNlckVMRXhwcmVzc2lvbnMsCi0JCQlIYXNoTWFwIHVzZXJFTFJhbmdlcywKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSUphclJlY29yZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSUphclJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDE2NDczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lKYXJSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSAqIEEgcmVjb3JkIHRvIGEgLmphciBmaWxlIGRpcmVjdGx5IHJlZmVyZW5jYWJsZSBhcyBhIHRhZyBsaWJyYXJ5LgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJSmFyUmVjb3JkIGV4dGVuZHMgSVRhZ2xpYlJlY29yZCB7Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgLmphciBpbiB0aGUgZmlsZS1zeXN0ZW0uCi0JICovCi0JcHVibGljIElQYXRoIGdldExvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlY29tbWVuZGVkL2RlZmF1bHQgcHJlZml4IGlmIG9uZSB3YXMgZ2l2ZW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gdXNlIHRoZSBkZXNjcmlwdG9yJ3MgVVJJIHZhbHVlCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB1cmkuCi0JICovCi0JU3RyaW5nIGdldFVSSSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRMRFJlY29yZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRMRFJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTVkM2IxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUTERSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSAqIEEgcmVjb3JkIHJlcHJlc2VudGluZyBhIHN0YW5kYWxvbmUgLnRsZCBmaWxlLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUTERSZWNvcmQgZXh0ZW5kcyBJVGFnbGliUmVjb3JkIHsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGF0aCB3aXRoaW4gdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlJUGF0aCBnZXRQYXRoKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlY29tbWVuZGVkL2RlZmF1bHQgcHJlZml4IGlmIG9uZSB3YXMgZ2l2ZW4uCi0JICovCi0JU3RyaW5nIGdldFNob3J0TmFtZSgpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgdGhlIGRlc2NyaXB0b3IncyBVUkkgdmFsdWUKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVyaS4KLQkgKi8KLQlTdHJpbmcgZ2V0VVJJKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdEaXJSZWNvcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdEaXJSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyMDg2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnRGlyUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBBIHJlY29yZCByZXByZXNlbnRpbmcgYSBmb2xkZXIgb2YgLnRhZy8udGFneCBmaWxlcwotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWdEaXJSZWNvcmQgZXh0ZW5kcyBJVGFnbGliUmVjb3JkIHsKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhdGggd2l0aGluIHRoZSB3b3Jrc3BhY2UgdG8gdGhpcyBkaXJlY3RvcnkuCi0JICovCi0JSVBhdGggZ2V0UGF0aCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYmE0NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotLyoqCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGluZm9ybWF0aW9uIHdpdGhpbiBhIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IuIFByb3ZpZGVzCi0gKiBtdWNoIG9mIHRoZSBoaWdoLWxldmVsIGluZm9ybWF0aW9uIGV4cHJlc3NlZCBieSB0aGUgZGVzY3JpcHRvci4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGFnbGliRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gdmFsdWUgb2YgdGhpcyB0YWcgbGlicmFyeQotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCS8qKgotCSAqIEByZXR1cm4gdGhlIGRpc3BsYXkgbmFtZSB2YWx1ZSBvZiB0aGlzIHRhZyBsaWJyYXJ5Ci0JICovCi0JU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0JLyoqCi0JICogQHJldHVybiB0aGUgc3RhdGVkIHJlcXVpcmVkIEpTUCB2ZXJzaW9uIG9mIHRoaXMgdGFnIGxpYnJhcnkKLQkgKi8KLQlTdHJpbmcgZ2V0SlNQVmVyc2lvbigpOwotCS8qKgotCSAqIEByZXR1cm4gYSBVUkwgc3RyaW5nIHRvIHRoZSBsYXJnZSBpY29uIGZvciB0aGlzIHRhZyBsaWJyYXJ5Ci0JICovCi0JU3RyaW5nIGdldExhcmdlSWNvbigpOwotCS8qKgotCSAqIEByZXR1cm4gdGhlIHN0YXRlZCBzaG9ydCBuYW1lIGZvciB0aGlzIHRhZyBsaWJyYXJ5Ci0JICovCi0JU3RyaW5nIGdldFNob3J0TmFtZSgpOwotCS8qKgotCSAqIEByZXR1cm4gYSBVUkwgc3RyaW5nIHRvIHRoZSBzbWFsbCBpY29uIGZvciB0aGlzIHRhZyBsaWJyYXJ5Ci0JICovCi0JU3RyaW5nIGdldFNtYWxsSWNvbigpOwotCS8qKgotCSAqIEByZXR1cm4gdGhlIHN0YXRlZCB2ZXJzaW9uIG9mIHRoaXMgdGFnIGxpYnJhcnkgaWYgc3BlY2lmaWVkCi0JICovCi0JU3RyaW5nIGdldFRsaWJWZXJzaW9uKCk7Ci0JLyoqCi0JICogQHJldHVybiBhIFVSSSBwb2ludGluZyB0byB0aGlzIHRhZyBsaWJyYXJ5J3MgZGVzY3JpcHRvciwgb3IgbnVsbAotCSAqLwotCVN0cmluZyBnZXRVUkkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJJbmRleERlbHRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliSW5kZXhEZWx0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWE2MTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJJbmRleERlbHRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgY2hhbmdlcyB0byB0aGUga25vd24gcmVjb3JkcyB3aXRoaW4gdGhlIFRhZ2xpYkluZGV4LgotICogPHA+Ci0gKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGFnbGliSW5kZXhEZWx0YSB7Ci0KLQkvKioKLQkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSByZWNvcmQgaGFzIGJlZW4gYWRkZWQuIE5vdGUgdGhhdCBhbgotCSAqIGFkZGVkIHRhZ2xpYiByZWNvcmQgZGVsdGEgaGFzIG5vIGNoaWxkcmVuLCBhcyB0aGV5IGFyZSBhbGwgaW1wbGljaXRlbHkKLQkgKiBhZGRlZC4KLQkgKi8KLQlwdWJsaWMgaW50IEFEREVEID0gMTsKLQkvKioKLQkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSByZWNvcmQgaGFzIGJlZW4gY2hhbmdlZCwgYXMKLQkgKiBkZXNjcmliZWQgYnkgdGhlIGNoYW5nZSBmbGFncy4KLQkgKi8KLQlwdWJsaWMgaW50IENIQU5HRUQgPSA0OwotCS8qKgotCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlY29yZCBoYXMgYmVlbiByZW1vdmVkLiBOb3RlIHRoYXQKLQkgKiBhIHJlbW92ZWQgdGFnbGliIGVsZW1lbnQgZGVsdGEgaGFzIG5vIGNoaWxkcmVuLCBhcyB0aGV5IGFyZSBhbGwKLQkgKiBpbXBsaWNpdGVseSByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBpbnQgUkVNT1ZFRCA9IDI7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgZGVsdGFzIGZvciB0aGUgYWZmZWN0ZWQgKGFkZGVkLCByZW1vdmVkLCBvciBjaGFuZ2VkKSByZWNvcmRzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlJVGFnbGliSW5kZXhEZWx0YVtdIGdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgY2hhbmdlLCBvbmUgb2YgQURERUQsIENIQU5HRUQsIG9yIFJFTU9WRUQKLQkgKi8KLQlpbnQgZ2V0S2luZCgpOwotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIElQcm9qZWN0IGluIHdoaWNoIHRoaXMgZGVsdGEgb3JpZ2luYXRlZAotCSAqLwotCUlQcm9qZWN0IGdldFByb2plY3QoKTsKLQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgcmVjb3JkIHRoYXQgd2FzIGNoYW5nZWQKLQkgKi8KLQlJVGFnbGliUmVjb3JkIGdldFRhZ2xpYlJlY29yZCgpOwotCi0JLyoqCi0JICogQWNjZXB0cyB0aGUgZ2l2ZW4gdmlzaXRvci4gVGhlIG9ubHkga2luZHMgb2YgaW5kZXggZGVsdGFzIHZpc2l0ZWQgYXJlCi0JICogPGNvZGU+QURERUQ8L2NvZGU+LCA8Y29kZT5SRU1PVkVEPC9jb2RlPiwgYW5kCi0JICogPGNvZGU+Q0hBTkdFRDwvY29kZT4uIFRoZSB2aXNpdG9yJ3MgPGNvZGU+dmlzaXQ8L2NvZGU+IG1ldGhvZCBpcwotCSAqIGNhbGxlZCB3aXRoIHRoaXMgaW5kZXggZGVsdGEgaWYgYXBwbGljYWJsZS4gSWYgdGhlIHZpc2l0b3IgcmV0dXJucwotCSAqIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgcmVzb3VyY2UgZGVsdGEncyBjaGlsZHJlbiBhcmUgYWxzbyB2aXNpdGVkLgotCSAqIAotCSAqIEBwYXJhbSB2aXNpdG9yCi0JICogICAgICAgICAgICB0aGUgdmlzaXRvcgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSB2aXNpdG9yIGZhaWxlZCB3aXRoIHRoaXMgZXhjZXB0aW9uLgotCSAqIEBzZWUgSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KElUYWdsaWJJbmRleERlbHRhVmlzaXRvcikKLQkgKi8KLQkvLyBwdWJsaWMgdm9pZCBhY2NlcHQoSVRhZ2xpYkluZGV4RGVsdGFWaXNpdG9yIHZpc2l0b3IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYkluZGV4TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJJbmRleExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZTQwNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYkluZGV4TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotLyoqCi0gKiBBIGxpc3RlbmVyIGZvciBjaGFuZ2VzIGluIHRoZSBpbmRleCdzIHJlY29yZHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhZ2xpYkluZGV4TGlzdGVuZXIgewotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGEgY2hhbmdlIGluIHRoZSBUYWdsaWJJbmRleCwgZGVzY3JpYmVkIGJ5Ci0JICogYW4gSVRhZ2xpYkluZGV4RGVsdGEsIGhhcyBvY2N1cnJlZAotCSAqIAotCSAqIEBwYXJhbSBkZWx0YQotCSAqICAgICAgICAgICAgdGhlIGRlbHRhIG9mIGNoYW5nZXMKLQkgKi8KLQl2b2lkIGluZGV4Q2hhbmdlZChJVGFnbGliSW5kZXhEZWx0YSBkZWx0YSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliUmVjb3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjY0NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYlJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLS8qKgotICogQSByZXByZXNlbnRhdGlvbiBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSB0YWcgbGlicmFyeSBkZXNjcmlwdG9yLiBUaGlzCi0gKiBpbnRlcmZhY2UgaXMgY29tbW9uIHRvIGFsbCByZWNvcmQgdHlwZXMuCi0gKiAKLSAqIAotICogQHNlZSBJSmFyUmVjb3JkCi0gKiBAc2VlIElUYWdEaXJSZWNvcmQKLSAqIEBzZWUgSVRMRFJlY29yZAotICogQHNlZSBJVVJMUmVjb3JkCi0gKiAgICAgIDxwPgotICogICAgICBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqICAgICAgPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhZ2xpYlJlY29yZCB7Ci0JLyoqCi0JICogQSByZWNvcmQgdG8gYSAuamFyIGZpbGUgcmVmZXJyYWJsZSBkaXJlY3RseSwgMS4xIHN0eWxlLCBvciBtZW50aW9uZWQgaW4KLQkgKiBhIHdlYi54bWwgZmlsZS4KLQkgKi8KLQlpbnQgSkFSID0gMSA8PCAxOwotCi0JLyoqCi0JICogQSByZWNvcmQgcmVwcmVzZW50aW5nIGEgZm9sZGVyIG9mIC50YWcvLnRhZ3ggZmlsZXMKLQkgKi8KLQlpbnQgVEFHRElSID0gMSA8PCAzOwotCi0JLyoqCi0JICogQSByZWNvcmQgcmVwcmVzZW50aW5nIGEgc3RhbmRhbG9uZSAudGxkIGZpbGUKLQkgKi8KLQlpbnQgVExEID0gMTsKLQotCS8qKgotCSAqIEEgcmVjb3JkIHJlcHJlc2VudGluZyBhIC50bGQgdGhhdCBpcyBub3QgYSBzdGFuZGFsb25lIGZpbGUKLQkgKi8KLQlpbnQgVVJMID0gMSA8PCAyOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIHJlY29yZC4gVGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgb25lIG9mCi0JICogPGNvZGU+VVJMPC9jb2RlPiwgPGNvZGU+VEFHRElSPC9jb2RlPiwgPGNvZGU+VExEPC9jb2RlPiwgb3IKLQkgKiA8Y29kZT5KQVI8L2NvZGU+LgotCSAqIDxwPgotCSAqIDx1bD4KLQkgKiA8bGk+IEFsbCByZWNvcmRzIG9mIHR5cGUgPGNvZGU+SkFSPC9jb2RlPiBpbXBsZW1lbnQKLQkgKiA8Y29kZT5JSmFyUmVjb3JkPC9jb2RlPi48L2xpPgotCSAqIDxsaT4gQWxsIHJlY29yZHMgb2YgdHlwZSA8Y29kZT5UQUdESVI8L2NvZGU+IGltcGxlbWVudAotCSAqIDxjb2RlPklUYWdEaXJSZWNvcmQ8L2NvZGU+LjwvbGk+Ci0JICogPGxpPiBBbGwgcmVjb3JkcyBvZiB0eXBlIDxjb2RlPlRMRDwvY29kZT4gaW1wbGVtZW50Ci0JICogPGNvZGU+SVRMRFJlY29yZDwvY29kZT4uPC9saT4KLQkgKiA8bGk+IEFsbCByZWNvcmRzIG9mIHR5cGUgPGNvZGU+VVJMPC9jb2RlPiBpbXBsZW1lbnQKLQkgKiA8Y29kZT5JVVJMUmVjb3JkPC9jb2RlPi48L2xpPgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyByZXNvdXJjZQotCSAqIEBzZWUgI0pBUgotCSAqIEBzZWUgI1RBR0RJUgotCSAqIEBzZWUgI1RMRAotCSAqIEBzZWUgI1VSTAotCSAqLwotCWludCBnZXRSZWNvcmRUeXBlKCk7Ci0JCi0JSVRhZ2xpYkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYlJlY29yZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliUmVjb3JkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMxNjUxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliUmVjb3JkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotCi0vKioKLSAqIERlc2NyaWJlcyBjaGFuZ2VzIHRvIHRoZSBrbm93biByZWNvcmRzIHdpdGhpbiB0aGUgVGFnbGliSW5kZXguCi0gKiAKLSAqIDxwPgotICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWdsaWJSZWNvcmRFdmVudCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSByZWNvcmQgdGhhdCB3YXMgY2hhbmdlZAotCSAqLwotCUlUYWdsaWJSZWNvcmQgZ2V0VGFnbGliUmVjb3JkKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIGNoYW5nZSwgb25lIG9mIEFEREVELCBDSEFOR0VELCBvciBSRU1PVkVECi0JICovCi0JaW50IGdldFR5cGUoKTsKLQotCWludCBBRERFRCA9IElSZXNvdXJjZURlbHRhLkFEREVEOwotCWludCBDSEFOR0VEID0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRDsKLQlpbnQgUkVNT1ZFRCA9IElSZXNvdXJjZURlbHRhLlJFTU9WRUQ7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVVJMUmVjb3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVVJMUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NzRkMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVVSTFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogQSByZWNvcmQgcmVwcmVzZW50aW5nIGEgLnRsZCB0aGF0IGlzIG5vdCBhIHN0YW5kYWxvbmUgZmlsZQotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVUkxSZWNvcmQgZXh0ZW5kcyBJVGFnbGliUmVjb3JkIHsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGJhc2UgbG9jYXRpb24gdG8gdXNlIGZvciBmdXJ0aGVyIHJlc29sdXRpb24gb2YgcmVzb3VyY2VzCi0JICogICAgICAgICBmcm9tIHRoZSBUTEQKLQkgKi8KLQlTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNob3J0LW5hbWUgKG5vcm1hbGx5IHRyZWF0ZWQgYXMgdGhlCi0JICogICAgICAgICByZWNvbW1lbmRlZC9kZWZhdWx0IHByZWZpeCksIGlmIG9uZSB3YXMgc3BlY2lmaWVkIHdpdGhpbiB0aGlzCi0JICogICAgICAgICBUTEQncyBjb250ZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0U2hvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSB0aGUgZGVzY3JpcHRvcidzIFVSSSB2YWx1ZQotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdXJpIHNwZWNpZmllZCB3aXRoaW4gdGhpcyBUTEQncyBjb250ZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0VVJJKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIFVSTCB0byB0aGlzIFRMRCdzIGNvbnRlbnRzLgotCSAqLwotCVVSTCBnZXRVUkwoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL1Byb2plY3REZXNjcmlwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvUHJvamVjdERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjE0MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvUHJvamVjdERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTFUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5EZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuQXJyYXlNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5GYWNldE1vZHVsZUNvcmVTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuSmFyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSB0YWcgbGlicmFyeSBpbmZvcm1hdGlvbiBmb3IgYSBzaW5nbGUgcHJvamVjdC4KLSAqIAotICogICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5laXRoZXIgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIG5vciBhY2Nlc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICoKLSAqLwotY2xhc3MgUHJvamVjdERlc2NyaXB0aW9uIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0JY2xhc3MgQnVpbGRQYXRoSm9iIGV4dGVuZHMgSm9iIHsKLQkJcHVibGljIEJ1aWxkUGF0aEpvYigpIHsKLQkJCXN1cGVyKCJVcGRhdGluZyBUYWcgTGlicmFyeSBJbmRleCIpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQkJc2V0VXNlcihmYWxzZSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQl0cnkgewotCQkJCUxPQ0suYWNxdWlyZSgpOwotCi0JCQkJUGFja2FnZUZyYWdtZW50Um9vdERlbHRhW10gcmVtb3ZlcyA9IChQYWNrYWdlRnJhZ21lbnRSb290RGVsdGFbXSkgZlBhY2thZ2VGcmFnbWVudFJvb3RzUmVtb3ZlZC52YWx1ZXMoKS50b0FycmF5KG5ldyBQYWNrYWdlRnJhZ21lbnRSb290RGVsdGFbZlBhY2thZ2VGcmFnbWVudFJvb3RzUmVtb3ZlZC5zaXplKCldKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW92ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaGFuZGxlRWxlbWVudENoYW5nZWQocmVtb3Zlc1tpXS5lbGVtZW50UGF0aCwgcmVtb3Zlc1tpXS5kZWx0YUtpbmQsIHJlbW92ZXNbaV0uaXNFeHBvcnRlZCk7Ci0JCQkJfQotCQkJCWZQYWNrYWdlRnJhZ21lbnRSb290c1JlbW92ZWQuY2xlYXIoKTsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQotCQkJCVBhY2thZ2VGcmFnbWVudFJvb3REZWx0YVtdIGNoYW5nZXMgPSAoUGFja2FnZUZyYWdtZW50Um9vdERlbHRhW10pIGZQYWNrYWdlRnJhZ21lbnRSb290c0NoYW5nZWQudmFsdWVzKCkudG9BcnJheShuZXcgUGFja2FnZUZyYWdtZW50Um9vdERlbHRhW2ZQYWNrYWdlRnJhZ21lbnRSb290c0NoYW5nZWQuc2l6ZSgpXSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWhhbmRsZUVsZW1lbnRDaGFuZ2VkKGNoYW5nZXNbaV0uZWxlbWVudFBhdGgsIGNoYW5nZXNbaV0uZGVsdGFLaW5kLCBjaGFuZ2VzW2ldLmlzRXhwb3J0ZWQpOwotCQkJCX0KLQkJCQlmUGFja2FnZUZyYWdtZW50Um9vdHNDaGFuZ2VkLmNsZWFyKCk7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkKLQkJCQlQYWNrYWdlRnJhZ21lbnRSb290RGVsdGFbXSBhZGRzID0gKFBhY2thZ2VGcmFnbWVudFJvb3REZWx0YVtdKSBmUGFja2FnZUZyYWdtZW50Um9vdHNBZGRlZC52YWx1ZXMoKS50b0FycmF5KG5ldyBQYWNrYWdlRnJhZ21lbnRSb290RGVsdGFbZlBhY2thZ2VGcmFnbWVudFJvb3RzQWRkZWQuc2l6ZSgpXSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWhhbmRsZUVsZW1lbnRDaGFuZ2VkKGFkZHNbaV0uZWxlbWVudFBhdGgsIGFkZHNbaV0uZGVsdGFLaW5kLCBhZGRzW2ldLmlzRXhwb3J0ZWQpOwotCQkJCX0KLQkJCQlmUGFja2FnZUZyYWdtZW50Um9vdHNBZGRlZC5jbGVhcigpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCQl9Ci0JCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmZpcmVDdXJyZW50RGVsdGEoQnVpbGRQYXRoSm9iLnRoaXMpOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgUGFja2FnZUZyYWdtZW50Um9vdERlbHRhIHsKLQkJUGFja2FnZUZyYWdtZW50Um9vdERlbHRhKElQYXRoIHBhdGgsIGludCBraW5kLCBib29sZWFuIGV4cG9ydGVkKSB7Ci0JCQlzdXBlcigpOwotCQkJZWxlbWVudFBhdGggPSBwYXRoOwotCQkJZGVsdGFLaW5kID0ga2luZDsKLQkJCWlzRXhwb3J0ZWQgPSBleHBvcnRlZDsKLQkJfQotCi0JCS8qCi0JCQlJSmF2YUVsZW1lbnREZWx0YS5GX0FEREVEX1RPX0NMQVNTUEFUSAotCQkJSUphdmFFbGVtZW50RGVsdGEuRl9BUkNISVZFX0NPTlRFTlRfQ0hBTkdFRAotCQkJSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRICi0JCSovIAotCQlpbnQgZGVsdGFLaW5kOwotCQlJUGF0aCBlbGVtZW50UGF0aDsKLQkJYm9vbGVhbiBpc0V4cG9ydGVkOwotCX0KLQotCWNsYXNzIERlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiAoZGVsdGEuZ2V0RmxhZ3MoKSA9PSBJUmVzb3VyY2VEZWx0YS5FTkNPRElORyB8fCBkZWx0YS5nZXRGbGFncygpID09IElSZXNvdXJjZURlbHRhLk1BUktFUlMpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVuZHNXaXRoKCIudGxkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJCXJlbW92ZVRMRChyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl1cGRhdGVUTEQocmVzb3VyY2UsIGRlbHRhLmdldEtpbmQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJCXJlbW92ZUpBUihyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl1cGRhdGVKQVIocmVzb3VyY2UsIGRlbHRhLmdldEtpbmQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoInRhZyIuZXF1YWxzSWdub3JlQ2FzZShyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpIHx8ICJ0YWd4Ii5lcXVhbHNJZ25vcmVDYXNlKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQkJcmVtb3ZlVGFnKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXVwZGF0ZVRhZyhyZXNvdXJjZSwgZGVsdGEuZ2V0S2luZCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChyZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKFdFQl9YTUwpICYmIHJlc291cmNlLmdldFBhcmVudCgpLmdldE5hbWUoKS5lcXVhbHMoV0VCX0lORikpIHsKLQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0JCQkJCQlyZW1vdmVXZWJYTUwocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdXBkYXRlV2ViWE1MKHJlc291cmNlLCBkZWx0YS5nZXRLaW5kKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc291cmNlLmdldE5hbWUoKS5sZW5ndGgoKSAhPSAwICYmIHJlc291cmNlLmdldE5hbWUoKS5jaGFyQXQoMCkgIT0gJy4nOwotCQl9Ci0JfQotCi0JY2xhc3MgSW5kZXhlciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlib29sZWFuIHZpc2l0TWVtYmVycyA9IHRydWU7Ci0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJaWYgKHByb3h5LmdldE5hbWUoKS5lbmRzV2l0aCgiLnRsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdXBkYXRlVExEKHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLCBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHByb3h5LmdldE5hbWUoKS5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdXBkYXRlSkFSKHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLCBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHByb3h5LmdldE5hbWUoKS5lbmRzV2l0aCgiLnRhZyIpIHx8IHByb3h5LmdldE5hbWUoKS5lbmRzV2l0aCgiLnRhZ3giKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdXBkYXRlVGFnRGlyKHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLmdldFBhcmVudCgpLCBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCk7Ci0JCQkJCS8vIGFueSBmb2xkZXIgd2l0aCB0aGVzZSBmaWxlcyB3aWxsIGNyZWF0ZSBhIHJlY29yZCBmb3IKLQkJCQkJLy8gdGhhdCBmb2xkZXIgaW4gb25lIHBhc3MKLQkJCQkJdmlzaXRNZW1iZXJzID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHByb3h5LmdldE5hbWUoKS5lcXVhbHMoV0VCX1hNTCkgJiYgcHJveHkucmVxdWVzdFJlc291cmNlKCkuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLmVxdWFscyhXRUJfSU5GKSkgewotCQkJCQl1cGRhdGVXZWJYTUwocHJveHkucmVxdWVzdFJlc291cmNlKCksIElUYWdsaWJJbmRleERlbHRhLkFEREVEKTsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgbmFtZSA9IHByb3h5LmdldE5hbWUoKTsKLQkJCXJldHVybiBuYW1lLmxlbmd0aCgpICE9IDAgJiYgbmFtZS5jaGFyQXQoMCkgIT0gJy4nICYmIHZpc2l0TWVtYmVyczsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBKYXJSZWNvcmQgaW1wbGVtZW50cyBJSmFyUmVjb3JkIHsJCQotCQkvKioKLQkJICogV2hldGhlciB0aGlzIGphciBpbmNsdWRlcyBhbiBlbnRyeSBuYW1lICJNRVRBLUlORi90YWdsaWIudGxkIgotCQkgKi8KLQkJYm9vbGVhbiBoYXMxMVRMRDsKLQkJVGFnbGliSW5mbyBpbmZvOwotCi0JCS8qKgotCQkgKiBXaGV0aGVyIHRoaXMgcmVjb3JkIGlzIGluIGEgbGlicmFyeSB0aGF0IHdhcyAiZXhwb3J0ZWQiIG9uIHRoZSBKYXZhCi0JCSAqIEJ1aWxkIFBhdGguIE1heSBubyBsb25nZXIgYmUgYWNjdXJhdGUgc2luY2UgdGhlIGxpYnJhcnkgbWF5IGJlIHVzZWQKLQkJICogaW4gbXVsdGlwbGUgcHJvamVjdHMuCi0JCSAqIAotCQkgKiAgQGRlcHJlY2F0ZWQgLSBubyBjdXJyZW50IHVzZSwgbWlnaHQgbm90IGJlIHdvcnRoIHByZXNlcnZpbmcKLQkJICovCi0JCWJvb2xlYW4gaXNFeHBvcnRlZCA9IHRydWU7Ci0JCQotCQkvKioKLQkJICogV2hldGhlciB0aGlzIHJlY29yZCB3YXMgY3JlYXRlZCBiYXNlZCBvbiBhIG1hcHBpbmcgd2l0aGluIGEKLQkJICogZGVwbG95bWVudCBkZXNjcmlwdG9yLiBNYXkgYWxzbyBiZSBpbm5hY2N1cmF0ZSBpZiB0aGUgamFyIGlzIHVzZWQKLQkJICogaW4gbXVsdGlwbGUgcHJvamVjdHMuCi0JCSAqLwotCQlib29sZWFuIGlzTWFwcGVkSW5XZWJYTUw7Ci0JCWJvb2xlYW4gaXNDb25zaXN0ZW50ID0gZmFsc2U7Ci0JCUlQYXRoIGxvY2F0aW9uOwotCQlMaXN0IHVybFJlY29yZHM7Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIEphclJlY29yZCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuICgoSmFyUmVjb3JkKSBvYmopLmxvY2F0aW9uLmVxdWFscyhsb2NhdGlvbikgJiYgKChKYXJSZWNvcmQpIG9iaikuaGFzMTFUTEQgPT0gaGFzMTFUTEQgJiYgKChKYXJSZWNvcmQpIG9iaikuaW5mby5lcXVhbHMoaW5mbyk7Ci0JCX0KLQotCQlwdWJsaWMgSVRhZ2xpYkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLQkJCXJldHVybiBpbmZvICE9IG51bGwgPyBpbmZvIDogbmV3IFRhZ2xpYkluZm8oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvY2F0aW9uLgotCQkgKi8KLQkJcHVibGljIElQYXRoIGdldExvY2F0aW9uKCkgewotCQkJcmV0dXJuIGxvY2F0aW9uOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRSZWNvcmRUeXBlKCkgewotCQkJcmV0dXJuIElUYWdsaWJSZWNvcmQuSkFSOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVjb21tZW5kZWQvZGVmYXVsdCBwcmVmaXggaWYgb25lIHdhcyBnaXZlbi4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpbmZvLnNob3J0TmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVyaS4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpbmZvLnVyaTsKLQkJfQotCi0JCXB1YmxpYyBMaXN0IGdldFVSTFJlY29yZHMoKSB7Ci0JCQlyZXR1cm4gdXJsUmVjb3JkczsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoIkphclJlY29yZDogIik7Ly8kTk9OLU5MUy0xJCAKLQkJCXMuYXBwZW5kKGxvY2F0aW9uKTsKLQkJCWlmICh1cmxSZWNvcmRzLnNpemUoKSA+IDApIHsKLQkJCQlzLmFwcGVuZCgnXG4nKTsvLyROT04tTkxTLTEkIAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJsUmVjb3Jkcy5zaXplKCk7IGkrKykgewotCQkJCQlzLmFwcGVuZCh1cmxSZWNvcmRzLmdldChpKSk7Ci0JCQkJCXMuYXBwZW5kKCdcbicpOy8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBUYWdEaXJSZWNvcmQgaW1wbGVtZW50cyBJVGFnRGlyUmVjb3JkIHsKLQkJVGFnbGliSW5mbyBpbmZvOwotCQlJUGF0aCBwYXRoOwotCQkvLyBhIExpc3QgaG9sZGluZyBTdHJpbmdzIG9mIC50YWcgYW5kIC50YWd4IGZpbGVuYW1lcyByZWxhdGl2ZSB0byB0aGUKLQkJLy8gdGFnZGlyJ3MgbG9jYXRpb24KLQkJTGlzdCB0YWdzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgVGFnRGlyUmVjb3JkKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gKChUYWdEaXJSZWNvcmQpIG9iaikucGF0aC5lcXVhbHMocGF0aCkgJiYgKChUYWdEaXJSZWNvcmQpIG9iaikuaW5mby5lcXVhbHMoaW5mbyk7Ci0JCX0KLQotCQlwdWJsaWMgSVRhZ2xpYkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLQkJCXJldHVybiBpbmZvICE9IG51bGwgPyBpbmZvIDogKGluZm8gPSBuZXcgVGFnbGliSW5mbygpKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnRGlyUmVjb3JkI2dldFBhdGgoKQotCQkgKi8KLQkJcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UmVjb3JkVHlwZSgpIHsKLQkJCXJldHVybiBJVGFnbGliUmVjb3JkLlRBR0RJUjsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRhZ3MuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nW10gZ2V0VGFnRmlsZW5hbWVzKCkgewotCQkJcmV0dXJuIChTdHJpbmdbXSkgdGFncy50b0FycmF5KG5ldyBTdHJpbmdbdGFncy5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRhZ2RpclJlY29yZDogIiArIHBhdGggKyAiIDwtPiAiICsgaW5mby5zaG9ydE5hbWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBicmllZiByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gaW4gYSBUTEQuCi0JICovCi0Jc3RhdGljIGNsYXNzIFRhZ2xpYkluZm8gaW1wbGVtZW50cyBJVGFnbGliRGVzY3JpcHRvciB7Ci0JCS8vIGV4dHJhY3Qgb25seSB3aGVuIGFza2VkPwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBFTVBUWV9TVFJJTkc7Ci0JCVN0cmluZyBkaXNwbGF5TmFtZSA9IEVNUFRZX1NUUklORzsKLQkJU3RyaW5nIGpzcFZlcnNpb24gPSBFTVBUWV9TVFJJTkc7Ci0JCVN0cmluZyBsYXJnZUljb24gPSBFTVBUWV9TVFJJTkc7Ci0JCVN0cmluZyBzaG9ydE5hbWUgPSBFTVBUWV9TVFJJTkc7Ci0JCVN0cmluZyBzbWFsbEljb24gPSBFTVBUWV9TVFJJTkc7Ci0JCVN0cmluZyB0bGliVmVyc2lvbiA9IEVNUFRZX1NUUklORzsKLQkJU3RyaW5nIHVyaSA9IEVNUFRZX1NUUklORzsKLQotCQlwdWJsaWMgVGFnbGliSW5mbygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgVGFnbGliSW5mbykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuICgoVGFnbGliSW5mbykgb2JqKS5qc3BWZXJzaW9uID09IGpzcFZlcnNpb24gJiYgKChUYWdsaWJJbmZvKSBvYmopLmRlc2NyaXB0aW9uLmVxdWFscyhkZXNjcmlwdGlvbikgJiYgKChUYWdsaWJJbmZvKSBvYmopLmxhcmdlSWNvbi5lcXVhbHMobGFyZ2VJY29uKSAmJiAoKFRhZ2xpYkluZm8pIG9iaikuc2hvcnROYW1lLmVxdWFscyhzaG9ydE5hbWUpICYmICgoVGFnbGliSW5mbykgb2JqKS5zbWFsbEljb24uZXF1YWxzKHNtYWxsSWNvbikgJiYgKChUYWdsaWJJbmZvKSBvYmopLnRsaWJWZXJzaW9uLmVxdWFscyh0bGliVmVyc2lvbikgJiYgKChUYWdsaWJJbmZvKSBvYmopLnVyaS5lcXVhbHModXJpKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRKU1BWZXJzaW9uKCkgewotCQkJcmV0dXJuIGpzcFZlcnNpb247Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbigpIHsKLQkJCXJldHVybiBsYXJnZUljb247Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLQkJCXJldHVybiBzaG9ydE5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbigpIHsKLQkJCXJldHVybiBzbWFsbEljb247Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRsaWJWZXJzaW9uKCkgewotCQkJcmV0dXJuIHRsaWJWZXJzaW9uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCQlyZXR1cm4gdXJpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGFnbGliSW5mb3wiICsgdXJpICsgInwiICsgc2hvcnROYW1lICsgInwiICsgdGxpYlZlcnNpb24gKyAifCIgKyBzbWFsbEljb24gKyAifCIgKyBsYXJnZUljb24gKyAifCIgKyBqc3BWZXJzaW9uICsgInwiICsgZGVzY3JpcHRpb247IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBUTERSZWNvcmQgaW1wbGVtZW50cyBJVExEUmVjb3JkIHsKLQkJVGFnbGliSW5mbyBpbmZvOwotCQlJUGF0aCBwYXRoOwotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBUTERSZWNvcmQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiAoKFRMRFJlY29yZCkgb2JqKS5wYXRoLmVxdWFscyhwYXRoKSAmJiAoKFRMRFJlY29yZCkgb2JqKS5nZXRVUkkoKS5lcXVhbHMoZ2V0VVJJKCkpICYmICgoVExEUmVjb3JkKSBvYmopLmluZm8uZXF1YWxzKGluZm8pOwotCQl9Ci0KLQkJcHVibGljIElUYWdsaWJEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0JCQlyZXR1cm4gaW5mbyAhPSBudWxsID8gaW5mbyA6IG5ldyBUYWdsaWJJbmZvKCk7Ci0JCX0KLQotCQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJCXJldHVybiBwYXRoOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRSZWNvcmRUeXBlKCkgewotCQkJcmV0dXJuIElUYWdsaWJSZWNvcmQuVExEOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKSB7Ci0JCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGluZm8uc2hvcnROYW1lOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdXJpLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGluZm8udXJpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVExEUmVjb3JkOiAiICsgZ2V0VVJJKCkgKyAiIDwtPiAiICsgcGF0aDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVVJMUmVjb3JkIGltcGxlbWVudHMgSVVSTFJlY29yZCB7Ci0JCVN0cmluZyBiYXNlTG9jYXRpb247Ci0JCVRhZ2xpYkluZm8gaW5mbzsKLQkJLyoqCi0JCSAqIFhYWDogUG9zc2libHkgYSBwcm9ibGVtIGlmIHRoZSBvd25pbmcgamFyIGlzIHNoYXJlZCBhY3Jvc3MKLQkJICogcHJvamVjdHMtLXRoaXMgdmFsdWUgaGVscHMgZGV0ZXJtaW5lIHZpc2liaWxpdHkgZHVyaW5nIGVudW1lcmF0aW9uCi0JCSAqIGFuZCByZXNvbHV0aW9uIGFuZCBtYXkgbm90IGJlIGNvcnJlY3QuCi0JCSAqLwotCQlib29sZWFuIGlzRXhwb3J0ZWQgPSB0cnVlOwotCQlVUkwgdXJsOwotCi0JCXB1YmxpYyBVUkxSZWNvcmQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFVSTFJlY29yZCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuICgoVVJMUmVjb3JkKSBvYmopLmJhc2VMb2NhdGlvbi5lcXVhbHMoYmFzZUxvY2F0aW9uKSAmJiAoKFVSTFJlY29yZCkgb2JqKS51cmwuZXF1YWxzKHVybCkgJiYgKChVUkxSZWNvcmQpIG9iaikuaW5mby5lcXVhbHMoaW5mbyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEJhc2VMb2NhdGlvbigpIHsKLQkJCXJldHVybiBiYXNlTG9jYXRpb247Ci0JCX0KLQotCQlwdWJsaWMgSVRhZ2xpYkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLQkJCXJldHVybiBpbmZvICE9IG51bGwgPyBpbmZvIDogbmV3IFRhZ2xpYkluZm8oKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UmVjb3JkVHlwZSgpIHsKLQkJCXJldHVybiBJVGFnbGliUmVjb3JkLlVSTDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlY29tbWVuZGVkL2RlZmF1bHQgcHJlZml4IGlmIG9uZSB3YXMgZ2l2ZW4uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gaW5mby5zaG9ydE5hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSB1cmkuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuIEVNUFRZX1NUUklORzsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGluZm8udXJpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgVVJMLgotCQkgKi8KLQkJcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVVJMUmVjb3JkOiAoZXhwb3J0ZWQ9IiArIGlzRXhwb3J0ZWQgKyAiKSAiICsgYmFzZUxvY2F0aW9uICsgIiA8LT4gIiArIGdldFVSSSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBXZWJYTUxSZWNvcmQgewotCQlUYWdsaWJJbmZvIGluZm87Ci0JCUlQYXRoIHBhdGg7Ci0JCUxpc3QgdGxkUmVjb3JkcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFdlYlhNTFJlY29yZCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuICgoV2ViWE1MUmVjb3JkKSBvYmopLnBhdGguZXF1YWxzKHBhdGgpICYmICgoV2ViWE1MUmVjb3JkKSBvYmopLmluZm8uZXF1YWxzKGluZm8pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVjb21tZW5kZWQvZGVmYXVsdCBwcmVmaXggaWYgb25lIHdhcyBnaXZlbi4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpbmZvLnNob3J0TmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBMaXN0IGdldFRMRFJlY29yZHMoKSB7Ci0JCQlyZXR1cm4gdGxkUmVjb3JkczsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYnhtbC4KLQkJICovCi0JCXB1YmxpYyBJUGF0aCBnZXRXZWJYTUwoKSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoIldlYlhNTFJlY29yZDogIik7Ly8kTk9OLU5MUy0xJCAKLQkJCXMuYXBwZW5kKHBhdGgpOwotCQkJaWYgKHRsZFJlY29yZHMuc2l6ZSgpID4gMCkgewotCQkJCXMuYXBwZW5kKCdcbicpOy8vJE5PTi1OTFMtMSQgCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0bGRSZWNvcmRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCXMuYXBwZW5kKHRsZFJlY29yZHMuZ2V0KGkpKTsKLQkJCQkJcy5hcHBlbmQoJ1xuJyk7Ly8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcy50b1N0cmluZygpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgVGFnbGliU29ydGVyIGV4dGVuZHMgU29ydGVyIHsKLQkJVGFnbGliU29ydGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkKLQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCi0JCXB1YmxpYyBib29sZWFuIGNvbXBhcmUoT2JqZWN0IGVsZW1lbnRPbmUsIE9iamVjdCBlbGVtZW50VHdvKSB7Ci0JCQkvKioKLQkJCSAqIFJldHVybnMgdHJ1ZSBpZiBlbGVtZW50VHdvIGlzICdncmVhdGVyIHRoYW4nIGVsZW1lbnRPbmUgVGhpcyBpcwotCQkJICogdGhlICdvcmRlcmluZycgbWV0aG9kIG9mIHRoZSBzb3J0IG9wZXJhdGlvbi4gRWFjaCBzdWJjbGFzcwotCQkJICogb3ZlcmlkZXMgdGhpcyBtZXRob2Qgd2l0aCB0aGUgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLQkJCSAqICdncmVhdGVyIHRoYW4nIGNvbmNlcHQgZm9yIHRoZSBvYmplY3RzIGJlaW5nIHNvcnRlZC4KLQkJCSAqLwotCQkJCi0JCQlyZXR1cm4gKGNvbGxhdG9yLmNvbXBhcmUoZ2V0VGFnbGliUGF0aCgoSVRhZ2xpYlJlY29yZCkgZWxlbWVudE9uZSksIGdldFRhZ2xpYlBhdGgoKElUYWdsaWJSZWNvcmQpIGVsZW1lbnRUd28pKSkgPCAwOwotCQl9Ci0JCQotCQlwcml2YXRlIFN0cmluZyBnZXRUYWdsaWJQYXRoKElUYWdsaWJSZWNvcmQgcmVjb3JkKSB7Ci0JCQlzd2l0Y2gocmVjb3JkLmdldFJlY29yZFR5cGUoKSkgewotCQkJCWNhc2UgSVRhZ2xpYlJlY29yZC5KQVI6Ci0JCQkJCXJldHVybiAoKEphclJlY29yZCkgcmVjb3JkKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJY2FzZSBJVGFnbGliUmVjb3JkLlRBR0RJUjoKLQkJCQkJcmV0dXJuICgoVGFnRGlyUmVjb3JkKSByZWNvcmQpLmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJCWNhc2UgSVRhZ2xpYlJlY29yZC5UTEQ6Ci0JCQkJCXJldHVybiAoKFRMRFJlY29yZCkgcmVjb3JkKS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQljYXNlIElUYWdsaWJSZWNvcmQuVVJMOgotCQkJCQlyZXR1cm4gKChVUkxSZWNvcmQpIHJlY29yZCkuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIEVNUFRZX1NUUklORzsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gX2RlYnVnSW5kZXhDcmVhdGlvbiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4Y3JlYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXN0YXRpYyBib29sZWFuIF9kZWJ1Z0luZGV4VGltZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4dGltZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERQQVRIX0RJUlRZID0gIkJVSUxEUEFUSF9ESVJUWSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERQQVRIX0VOVFJJRVMgPSAiQlVJTERQQVRIX0VOVFJJRVMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEUEFUSF9QUk9KRUNUID0gIkJVSUxEUEFUSF9QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0ZPUk1BVF9WRVJTSU9OID0gIlRhZyBMaWJyYXJ5IEluZGV4IDEuMS4wIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU5GID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBhdGggV0VCX0lORl9QQVRIID0gbmV3IFBhdGgoV0VCX0lORik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9YTUwgPSAid2ViLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gVExEID0geyAndCcsICdUJywgJ2wnLCAnTCcsICdkJywgJ0QnfSA7Ci0JCi0JLyoqCi0JICogTm90ZXMgdGhhdCB0aGUgYnVpbGQgcGF0aCBpbmZvcm1hdGlvbiBpcyBzdGFsZS4gU29tZSBvcGVyYXRpb25zIGNhbiBub3cKLQkgKiBiZSBza2lwcGVkIHVudGlsIGEgcmVzb2x2ZS9nZXRBdmFpbGFibGUgY2FsbCBpcyBtYWRlLgotCSAqLwotCWJvb2xlYW4gZkJ1aWxkUGF0aElzRGlydHkgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvdW50IG9mIGVudHJpZXMgb24gdGhlIGJ1aWxkIHBhdGguIFByaW1hcnkgdXNlIGNhc2UgaXMgZm9yIGNsYXNzcGF0aAotCSAqIGNvbnRhaW5lcnMgdGhhdCBhZGQgYW4gZW50cnkuIFdpdGhvdXQgbm90aWZpY2F0aW9uICgzLjMpLCB3ZSBjYW4gb25seQotCSAqIGNoZWNrIGFmdGVyLXRoZS1mYWN0LgotCSAqLwotCWludCBmQnVpbGRQYXRoRW50cnlDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBBIGNhY2hlZCBjb3B5IG9mIGFsbCBvZiB0aGUgcmVjb3JkcyBjcmVhdGVhYmxlIGZyb20gdGhlIFhNTENhdGFsb2cuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGZDYXRhbG9nUmVjb3JkczsKLQotCS8qCi0JICogUmVjb3JkcyBhY3RpdmUgSkFScyBvbiB0aGUgY2xhc3NwYXRoLiBUYWdsaWIgZGVzY3JpcHRvcnMgc2hvdWxkIGJlCi0JICogdXNhYmxlLCBidXQgdGhlIGphcnMgYnkgdGhlbXNlbHZlcyBhcmUgbm90LgotCSAqLwotCUhhc2h0YWJsZSBmQ2xhc3NwYXRoSmFyczsKLQotCS8qKgotCSAqIEEgc2V0IG9mIHRoZSBwcm9qZWN0cyB0aGF0IGFyZSBpbiB0aGlzIHByb2plY3QncyBidWlsZCBwYXRoLgotCSAqIExvb2t1cHMvZW51bWVyYXRpb25zIHdpbGwgYmUgcmVkaXJlY3RlZCB0byB0aGUgY29ycmVzcG9uZGluZwotCSAqIFByb2plY3REZXNjcmlwdGlvbiBpbnN0YW5jZXMKLQkgKi8KLQlTZXQgZkNsYXNzcGF0aFByb2plY3RzID0gbnVsbDsKLQotCS8vIGhvbGRzIHJlZmVyZW5jZXMgYnkgVVJJIHRvIEpBUnMKLQlIYXNodGFibGUgZkNsYXNzcGF0aFJlZmVyZW5jZXM7Ci0KLQkvKgotCSAqIHRoaXMgdGFibGUgaXMgc3BlY2lhbCBpbiB0aGF0IGl0IGhvbGRzIHRhYmxlcyBvZiByZWZlcmVuY2VzIGFjY29yZGluZwotCSAqIHRvIGxvY2FsIHJvb3RzCi0JICovCi0JSGFzaHRhYmxlIGZJbXBsaWNpdFJlZmVyZW5jZXM7Ci0KLQlIYXNodGFibGUgZkpBUlJlZmVyZW5jZXM7Ci0KLQlJUHJvamVjdCBmUHJvamVjdDsKLQotCXByaXZhdGUgU3RyaW5nIGZTYXZlU3RhdGVGaWxlbmFtZTsKLQotCUhhc2h0YWJsZSBmVGFnRGlyUmVmZXJlbmNlczsKLQotCUhhc2h0YWJsZSBmVExEUmVmZXJlbmNlczsKLQotCUlSZXNvdXJjZURlbHRhVmlzaXRvciBmVmlzaXRvcjsKLQlIYXNodGFibGUgZldlYlhNTFJlZmVyZW5jZXM7Ci0JCi0JTWFwIGZQYWNrYWdlRnJhZ21lbnRSb290c0FkZGVkID0gbmV3IEhhc2hNYXAoKTsKLQlNYXAgZlBhY2thZ2VGcmFnbWVudFJvb3RzQ2hhbmdlZCA9IG5ldyBIYXNoTWFwKCk7Ci0JTWFwIGZQYWNrYWdlRnJhZ21lbnRSb290c1JlbW92ZWQgPSBuZXcgSGFzaE1hcCgpOwotCi0JSUxvY2sgTE9DSyA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOwotCi0JcHJpdmF0ZSBsb25nIHRpbWUwOwotCQotCXByaXZhdGUgVGFnbGliU29ydGVyIGZUYWdsaWJTb3J0ZXIgPSBuZXcgVGFnbGliU29ydGVyKCk7Ci0JcHJpdmF0ZSBCdWlsZFBhdGhKb2IgZkJ1aWxkUGF0aEpvYiA9IG5ldyBCdWlsZFBhdGhKb2IoKTsKLQotCS8qKiBTaGFyZWQgSkFSIHJlY29yZHMgYmV0d2VlbiBwcm9qZWN0cyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBmU2hhcmVkSmFyUmVjb3JkcyA9IG5ldyBIYXNodGFibGUoKTsKLQotCVByb2plY3REZXNjcmlwdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgc2F2ZVN0YXRlRmlsZSkgewotCQlzdXBlcigpOwotCQlmUHJvamVjdCA9IHByb2plY3Q7Ci0JCWZTYXZlU3RhdGVGaWxlbmFtZSA9IHNhdmVTdGF0ZUZpbGU7Ci0KLQkJZkNsYXNzcGF0aEphcnMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmSkFSUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZUYWdEaXJSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZlRMRFJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmV2ViWE1MUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZJbXBsaWNpdFJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmQ2xhc3NwYXRoUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZDbGFzc3BhdGhQcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJcmVzdG9yZVJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gX2dldEpTUDExQW5kV2ViWE1MSmFyUmVmZXJlbmNlcyhDb2xsZWN0aW9uIGFsbEpBUnMpIHsKLQkJTGlzdCBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdChhbGxKQVJzLnNpemUoKSk7Ci0JCUl0ZXJhdG9yIGkgPSBhbGxKQVJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJSmFyUmVjb3JkIHJlY29yZCA9IChKYXJSZWNvcmQpIGkubmV4dCgpOwotCQkJaWYgKHJlY29yZC5oYXMxMVRMRCB8fCByZWNvcmQuaXNNYXBwZWRJbldlYlhNTCkgewotCQkJCWNvbGxlY3Rpb24uYWRkKHJlY29yZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdCBvZiBrbm93biByZWZlcmVuY2VzIGZyb20gdGhpcyBwcm9qZWN0J3MgYnVpbGQgcGF0aCB0byB0aGUKLQkgKiBtYXAsIGFwcGVuZGluZyBhbnkgcHJvY2Vzc2VkIHByb2plY3RzIGludG8gdGhlIGxpc3QgdG8gYXZvaWQKLQkgKiBidWlsZC1wYXRoLWN5Y2xlcy4KLQkgKiAKLQkgKiBAc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDI0MDgKLQkgKiAKLQkgKiBAcGFyYW0gcmVmZXJlbmNlcyAtCi0JICogICAgICAgICAgICB0aGUgbWFwIG9mIHJlZmVyZW5jZXMgdG8gSVRhZ2xpYlJlY29yZHMKLQkgKiBAcGFyYW0gcHJvamVjdHNQcm9jZXNzZWQgLQotCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgcHJvamVjdHMgYWxyZWFkeSBjb25zaWRlcmVkCi0JICogQHBhcmFtIGV4cG9ydGVkT25seSAtCi0JICogICAgICAgICAgICBXaGV0aGVyIHRvIG9ubHkgYWRkIHJlZmVyZW5jZXMgZGVyaXZlZCBmcm9tIGV4cG9ydGVkIGJ1aWxkCi0JICogICAgICAgICAgICBwYXRoIGNvbnRhaW5lcnMuIFRoaXMgbWV0aG9kIGNhbGxzIGl0c2VsZiByZWN1cnNpdmVseSB3aXRoCi0JICogICAgICAgICAgICB0aGlzIHBhcmFtZXRlciBhcyBmYWxzZS4KLQkgKi8KLQl2b2lkIGFkZEJ1aWxkUGF0aFJlZmVyZW5jZXMoTWFwIHJlZmVyZW5jZXMsIExpc3QgcHJvamVjdHNQcm9jZXNzZWQsIGJvb2xlYW4gZXhwb3J0ZWRPbmx5KSB7Ci0JCWVuc3VyZVVwVG9kYXRlKCk7Ci0KLQkJLy8gQWRkIHRoZSBidWlsZCBwYXRoIHJlZmVyZW5jZXMgdGhhdCBhcmUgZXhwb3J0ZWQgZnJvbSB0aGlzIHByb2plY3QKLQkJRW51bWVyYXRpb24ga2V5cyA9IGZDbGFzc3BhdGhSZWZlcmVuY2VzLmtleXMoKTsKLQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCU9iamVjdCBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQlVUkxSZWNvcmQgdXJsUmVjb3JkID0gKFVSTFJlY29yZCkgZkNsYXNzcGF0aFJlZmVyZW5jZXMuZ2V0KGtleSk7Ci0JCQlpZiAoZXhwb3J0ZWRPbmx5KSB7Ci0JCQkJaWYgKHVybFJlY29yZC5pc0V4cG9ydGVkKSB7Ci0JCQkJCXJlZmVyZW5jZXMucHV0KGtleSwgdXJsUmVjb3JkKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZWZlcmVuY2VzLnB1dChrZXksIHVybFJlY29yZCk7Ci0JCQl9Ci0JCX0KLQkJSVByb2plY3RbXSBidWlsZHBhdGhQcm9qZWN0cyA9IChJUHJvamVjdFtdKSBmQ2xhc3NwYXRoUHJvamVjdHMudG9BcnJheShuZXcgSVByb2plY3RbZkNsYXNzcGF0aFByb2plY3RzLnNpemUoKV0pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1aWxkcGF0aFByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIXByb2plY3RzUHJvY2Vzc2VkLmNvbnRhaW5zKGJ1aWxkcGF0aFByb2plY3RzW2ldKSAmJiBidWlsZHBhdGhQcm9qZWN0c1tpXS5pc0FjY2Vzc2libGUoKSkgewotCQkJCXByb2plY3RzUHJvY2Vzc2VkLmFkZChidWlsZHBhdGhQcm9qZWN0c1tpXSk7Ci0JCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5jcmVhdGVEZXNjcmlwdGlvbihidWlsZHBhdGhQcm9qZWN0c1tpXSk7Ci0JCQkJZGVzY3JpcHRpb24uYWRkQnVpbGRQYXRoUmVmZXJlbmNlcyhyZWZlcmVuY2VzLCBwcm9qZWN0c1Byb2Nlc3NlZCwgdHJ1ZSk7Ci0KLQkJCQkvKgotCQkJCSAqIDE5OTg0MyAoMTgzNzU2KSAtIEpTUCBWYWxpZGF0aW9uIENhbm5vdCBGaW5kIFRhZyBMaWJyYXJ5Ci0JCQkJICogRGVzY3JpcHRvciBpbiBSZWZlcmVuY2VkIFByb2plY3RzCi0JCQkJICogCi0JCQkJICogQWRkIGFueSBUTEQgcmVjb3JkcyBoYXZpbmcgVVJJIHZhbHVlcyBmcm9tIHByb2plY3RzIG9uIHRoZQotCQkJCSAqIGJ1aWxkIHBhdGgKLQkJCQkgKi8KLQkJCQlNYXBbXSByb290UmVmZXJlbmNlcyA9IChNYXBbXSkgZGVzY3JpcHRpb24uZkltcGxpY2l0UmVmZXJlbmNlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBNYXBbZGVzY3JpcHRpb24uZkltcGxpY2l0UmVmZXJlbmNlcy5zaXplKCldKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJvb3RSZWZlcmVuY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUl0ZXJhdG9yIGltcGxpY2l0UmVjb3JkcyA9IHJvb3RSZWZlcmVuY2VzW2pdLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpbXBsaWNpdFJlY29yZHMuaGFzTmV4dCgpKSB7Ci0JCQkJCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBpbXBsaWNpdFJlY29yZHMubmV4dCgpOwotCQkJCQkJaWYgKHJlY29yZC5nZXRSZWNvcmRUeXBlKCkgPT0gSVRhZ2xpYlJlY29yZC5UTEQgJiYgKChJVExEUmVjb3JkKSByZWNvcmQpLmdldFVSSSgpICE9IG51bGwgJiYgKChJVExEUmVjb3JkKSByZWNvcmQpLmdldFVSSSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCXJlZmVyZW5jZXMucHV0KCgoSVRMRFJlY29yZCkgcmVjb3JkKS5nZXRVUkkoKSwgcmVjb3JkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEVyYXNlcyBhbGwga25vd24gdGFibGVzCi0JICovCi0Jdm9pZCBjbGVhcigpIHsKLQkJZkNsYXNzcGF0aEphcnMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmSkFSUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZUYWdEaXJSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZlRMRFJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmV2ViWE1MUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZJbXBsaWNpdFJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmQ2xhc3NwYXRoUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsb3NlSmFyRmlsZShaaXBGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWZpbGUuY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkvLyBubyBjbGVhbnVwIGNhbiBiZSBkb25lCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJUYWdsaWJJbmRleDogQ291bGQgbm90IGNsb3NlIHppcCBmaWxlICIgKyBmaWxlLmdldE5hbWUoKSwgaW9lKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNhdGFsb2dFbnRyeQotCSAqICAgICAgICAgICAgYSBYTUwgY2F0YWxvZyBlbnRyeSBwb2ludGluZyB0byBhIC5qYXIgb3IgLnRsZCBmaWxlCi0JICogQHJldHVybiBhIElUYWdsaWJSZWNvcmQgZGVzY3JpYmluZyBhIFRMRCBjb250cmlidXRlZCB0byB0aGUgWE1MQ2F0YWxvZwotCSAqICAgICAgICAgaWYgb25lIHdhcyBmb3VuZCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24sIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBJVGFnbGliUmVjb3JkIGNyZWF0ZUNhdGFsb2dSZWNvcmQoSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkpIHsKLQkJcmV0dXJuIGNyZWF0ZUNhdGFsb2dSZWNvcmQoY2F0YWxvZ0VudHJ5LmdldEtleSgpLCBjYXRhbG9nRW50cnkuZ2V0VVJJKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cmkgLQotCSAqICAgICAgICAgICAgdGhlIGtleSB2YWx1ZSB0aGF0IHdpbGwgYmVjb21lIHRoZSByZXR1cm5lZCByZWNvcmQncyAiVVJJIgotCSAqIEBwYXJhbSB1cmxTdHJpbmcgLQotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyBpbmRpY2F0aW5nIHdoZXJlIHRoZSBUTEQgcmVhbGx5IGlzCi0JICogQHJldHVybiBhIElUYWdsaWJSZWNvcmQgZGVzY3JpYmluZyBhIFRMRCBjb250cmlidXRlZCB0byB0aGUgWE1MQ2F0YWxvZwotCSAqICAgICAgICAgaWYgb25lIHdhcyBmb3VuZCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24sIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBJVGFnbGliUmVjb3JkIGNyZWF0ZUNhdGFsb2dSZWNvcmQoU3RyaW5nIHVyaSwgU3RyaW5nIHVybFN0cmluZykgewotCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IG51bGw7Ci0JCS8vIGhhbmRsZSAiZmlsZToiIFVSTHMgdGhhdCBwb2ludCB0byBhIC5qYXIgZmlsZSBvbiBkaXNrICgxLjEgbW9kZSkKLQkJaWYgKHVybFN0cmluZy50b0xvd2VyQ2FzZShMb2NhbGUuVVMpLmVuZHNXaXRoKCgiLmphciIpKSAmJiB1cmxTdHJpbmcuc3RhcnRzV2l0aCgiZmlsZToiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN0cmluZyBmaWxlTG9jYXRpb24gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlVUkwgdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOwotCQkJCWZpbGVMb2NhdGlvbiA9IHVybC5nZXRGaWxlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBub3Qgd29ydGggcmVwb3J0aW5nCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIG51bGwsIGUpOwotCQkJfQotCQkJaWYgKGZpbGVMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJSmFyUmVjb3JkIGphclJlY29yZCA9IGNyZWF0ZUpBUlJlY29yZChmaWxlTG9jYXRpb24pOwotCQkJCVN0cmluZ1tdIGVudHJpZXMgPSBKYXJVdGlsaXRpZXMuZ2V0RW50cnlOYW1lcyhmaWxlTG9jYXRpb24pOwotCQkJCWZvciAoaW50IGpFbnRyeSA9IDA7IGpFbnRyeSA8IGVudHJpZXMubGVuZ3RoOyBqRW50cnkrKykgewotCQkJCQlpZiAoZW50cmllc1tqRW50cnldLmVuZHNXaXRoKCIudGxkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGVudHJpZXNbakVudHJ5XS5lcXVhbHMoSmFyVXRpbGl0aWVzLkpTUDExX1RBR0xJQikpIHsKLQkJCQkJCQlqYXJSZWNvcmQuaGFzMTFUTEQgPSB0cnVlOwotCQkJCQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gSmFyVXRpbGl0aWVzLmdldElucHV0U3RyZWFtKGZpbGVMb2NhdGlvbiwgZW50cmllc1tqRW50cnldKTsKLQkJCQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyhmaWxlTG9jYXRpb24sIGNvbnRlbnRzKTsKLQkJCQkJCQkJLyoKLQkJCQkJCQkJICogdGhlIHJlY29yZCdzIHJlcG9ydGVkIFVSSSBzaG91bGQgbWF0Y2ggdGhlCi0JCQkJCQkJCSAqIGNhdGFsb2cgZW50cnkncyAia2V5IiBzbyByZXBsYWNlIHRoZQotCQkJCQkJCQkgKiBkZXRlY3RlZCB2YWx1ZQotCQkJCQkJCQkgKi8KLQkJCQkJCQkJaW5mby51cmkgPSB1cmk7Ci0JCQkJCQkJCWphclJlY29yZC5pbmZvID0gaW5mbzsKLQkJCQkJCQl9Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIG51bGwsIGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoamFyUmVjb3JkLmhhczExVExEKSB7Ci0JCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImNyZWF0ZWQgY2F0YWxvZyByZWNvcmQgZm9yICIgKyB1cmxTdHJpbmcgKyAiQCIgKyBqYXJSZWNvcmQuZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlyZWNvcmQgPSBqYXJSZWNvcmQ7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJLy8gVGhlIHJlc3QgYXJlIFVSTHMgaW50byBhIHBsdWctaW4uLi5zb21ld2hlcmUKLQkJZWxzZSB7Ci0JCQlVUkwgdXJsID0gbnVsbDsKLQkJCUlucHV0U3RyZWFtIHRsZFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXVybCA9IG5ldyBVUkwodXJsU3RyaW5nKTsKLQkJCQl0bGRTdHJlYW0gPSBKYXJVdGlsaXRpZXMuZ2V0SW5wdXRTdHJlYW0odXJsKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gcmVhZGluZyBUTEQgY29udHJpYnV0ZWQgdG8gdGhlIFhNTCBDYXRhbG9nIiwgZTEpOwotCQkJfQotCi0JCQlpZiAodGxkU3RyZWFtICE9IG51bGwpIHsKLQkJCQlVUkxSZWNvcmQgdXJsUmVjb3JkID0gbnVsbDsKLQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyh1cmxTdHJpbmcsIHRsZFN0cmVhbSk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQkvKgotCQkJCQkgKiB0aGUgcmVjb3JkJ3MgcmVwb3J0ZWQgVVJJIHNob3VsZCBtYXRjaCB0aGUgY2F0YWxvZwotCQkJCQkgKiBlbnRyeSdzICJrZXkiIHNvIHJlcGxhY2UgdGhlIGRldGVjdGVkIHZhbHVlCi0JCQkJCSAqLwotCQkJCQlpbmZvLnVyaSA9IHVyaTsKLQkJCQkJdXJsUmVjb3JkID0gbmV3IFVSTFJlY29yZCgpOwotCQkJCQl1cmxSZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJCXVybFJlY29yZC5iYXNlTG9jYXRpb24gPSB1cmxTdHJpbmc7Ci0JCQkJCXVybFJlY29yZC51cmwgPSB1cmw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQl0cnkgewotCQkJCQl0bGRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIG51bGwsIGUpOwotCQkJCX0KLQkJCQlyZWNvcmQgPSB1cmxSZWNvcmQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlY29yZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBKYXJSZWNvcmQgY3JlYXRlSkFSUmVjb3JkKElSZXNvdXJjZSBqYXIpIHsKLQkJSVBhdGggbG9jYXRpb24gPSBqYXIuZ2V0TG9jYXRpb24oKTsKLQkJSmFyUmVjb3JkIGphclJlY29yZCA9IG51bGw7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlqYXJSZWNvcmQgPSBjcmVhdGVKQVJSZWNvcmQobG9jYXRpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamFyLmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkgewotCQkJamFyUmVjb3JkID0gY3JlYXRlSkFSUmVjb3JkKGphci5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBqYXJSZWNvcmQ7Ci0JfQotCi0JcHJpdmF0ZSBKYXJSZWNvcmQgY3JlYXRlSkFSUmVjb3JkKFN0cmluZyBmaWxlTG9jYXRpb24pIHsKLQkJc3luY2hyb25pemVkIChmU2hhcmVkSmFyUmVjb3JkcykgewotCQkJSmFyUmVjb3JkIHJlY29yZCA9IChKYXJSZWNvcmQpIGZTaGFyZWRKYXJSZWNvcmRzLmdldChmaWxlTG9jYXRpb24pOwotCQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQkJcmVjb3JkID0gbmV3IEphclJlY29yZCgpOwotCQkJCXJlY29yZC5pbmZvID0gbmV3IFRhZ2xpYkluZm8oKTsKLQkJCQlyZWNvcmQubG9jYXRpb24gPSBuZXcgUGF0aChmaWxlTG9jYXRpb24pOwotCQkJCXJlY29yZC51cmxSZWNvcmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZTaGFyZWRKYXJSZWNvcmRzLnB1dChmaWxlTG9jYXRpb24sIHJlY29yZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVjb3JkOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGFnRGlyUmVjb3JkIGNyZWF0ZVRhZ2RpclJlY29yZChJRm9sZGVyIHRhZ2RpcikgewotCQlJUGF0aCB0YWdkaXJQYXRoID0gdGFnZGlyLmdldEZ1bGxQYXRoKCk7Ci0JCVRhZ0RpclJlY29yZCByZWNvcmQgPSBuZXcgVGFnRGlyUmVjb3JkKCk7Ci0JCXJlY29yZC5wYXRoID0gdGFnZGlyLmdldEZ1bGxQYXRoKCk7Ci0JCXJlY29yZC5pbmZvID0gbmV3IFRhZ2xpYkluZm8oKTsKLQkJLy8gOC40LjMKLQkJaWYgKHRhZ2Rpci5nZXROYW1lKCkuZXF1YWxzKCJ0YWdzIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJlY29yZC5pbmZvLnNob3J0TmFtZSA9ICJ0YWdzIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIHsKLQkJCWJvb2xlYW4gZGV0ZXJtaW5lZCA9IGZhbHNlOwotCQkJSVBhdGggcGF0aCA9IHRhZ2RpclBhdGg7Ci0JCQlTdHJpbmdbXSBzZWdtZW50cyA9IHBhdGguc2VnbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc2VnbWVudHNbaSAtIDFdLmVxdWFscygiV0VCLUlORiIpICYmIHNlZ21lbnRzW2ldLmVxdWFscygidGFncyIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlJUGF0aCB0YWdkaXJMb2NhbFBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoaSArIDEpOwotCQkJCQlyZWNvcmQuaW5mby5zaG9ydE5hbWUgPSBTdHJpbmdVdGlscy5yZXBsYWNlKHRhZ2RpckxvY2FsUGF0aC50b1N0cmluZygpLCAiLyIsICItIik7Ci0JCQkJCWRldGVybWluZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZGV0ZXJtaW5lZCkgewotCQkJCXJlY29yZC5pbmZvLnNob3J0TmFtZSA9IFN0cmluZ1V0aWxzLnJlcGxhY2UodGFnZGlyUGF0aC50b1N0cmluZygpLCAiLyIsICItIik7Ci0JCQl9Ci0JCX0KLQkJLy8gOC40LjMKLQkJcmVjb3JkLmluZm8udGxpYlZlcnNpb24gPSAiMS4wIjsKLQkJcmVjb3JkLmluZm8uZGVzY3JpcHRpb24gPSBFTVBUWV9TVFJJTkc7Ci0JCXJlY29yZC5pbmZvLmRpc3BsYXlOYW1lID0gRU1QVFlfU1RSSU5HOwotCQlyZWNvcmQuaW5mby5zbWFsbEljb24gPSBFTVBUWV9TVFJJTkc7Ci0JCXJlY29yZC5pbmZvLmxhcmdlSWNvbiA9IEVNUFRZX1NUUklORzsKLQotCQl0cnkgewotCQkJSVJlc291cmNlW10gdGFnZmlsZXMgPSB0YWdkaXIubWVtYmVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh0YWdmaWxlc1tpXS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVN0cmluZyBleHRlbnNpb24gPSB0YWdmaWxlc1tpXS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmIChleHRlbnNpb24uZXF1YWxzKCJ0YWciKSB8fCBleHRlbnNpb24uZXF1YWxzKCJ0YWd4IikpKSB7Ci0JCQkJCXJlY29yZC50YWdzLmFkZCh0YWdmaWxlc1tpXS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlY29yZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUTERSZWNvcmQgY3JlYXRlVExEUmVjb3JkKElSZXNvdXJjZSB0bGQpIHsKLQkJVExEUmVjb3JkIHJlY29yZCA9IG5ldyBUTERSZWNvcmQoKTsKLQkJcmVjb3JkLnBhdGggPSB0bGQuZ2V0RnVsbFBhdGgoKTsKLQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHRsZC5pc0FjY2Vzc2libGUoKSkgewotCQkJCWNvbnRlbnRzID0gKChJRmlsZSkgdGxkKS5nZXRDb250ZW50cygpOwotCQkJCVN0cmluZyBiYXNlUGF0aCA9IHRsZC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8oYmFzZVBhdGgsIGNvbnRlbnRzKTsKLQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCXJlY29yZC5pbmZvID0gaW5mbzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gb3V0IG9mIHN5bmMKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBudWxsLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVjb3JkOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbnN1cmVVcFRvZGF0ZSgpIHsKLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8qCi0JCQkJICogSWYgdGhlIEphdmEgbmF0dXJlIGlzbid0IHByZXNlbnQgKG9yIHNvbWV0aGluZyBlbHNlIGlzCi0JCQkJICogd3JvbmcpLCBkb24ndCBjaGVjayB0aGUgYnVpbGQgcGF0aC4KLQkJCQkgKi8KLQkJCQlJSmF2YVByb2plY3QganByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZlByb2plY3QpOwotCQkJCWlmIChqcHJvamVjdCAhPSBudWxsICYmIGpwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCWVudHJpZXMgPSBqcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQlpZiAoZW50cmllcyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJCS8qCi0JCQkJICogRG91YmxlLWNoZWNrIHRoYXQgdGhlIG51bWJlciBvZiBidWlsZCBwYXRoIGVudHJpZXMgaGFzIG5vdAotCQkJCSAqIGNoYW5nZWQuIFRoaXMgc2hvdWxkIGNvdmVyIG1vc3QgY2FzZXMgc3VjaCBhcyB3aGVuIGEKLQkJCQkgKiBsaWJyYXJ5IGlzIGFkZGVkIGludG8gb3IgcmVtb3ZlZCBmcm9tIGEgY29udGFpbmVyLgotCQkJCSAqLwotCQkJCWZCdWlsZFBhdGhJc0RpcnR5ID0gZkJ1aWxkUGF0aElzRGlydHkgfHwgKGZCdWlsZFBhdGhFbnRyeUNvdW50ICE9IGVudHJpZXMubGVuZ3RoKTsKLQotCQkJCWlmIChmQnVpbGRQYXRoSXNEaXJ0eSkgewotCQkJCQlpbmRleENsYXNzcGF0aChlbnRyaWVzKTsKLQkJCQkJZkJ1aWxkUGF0aElzRGlydHkgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVBhY2thZ2VGcmFnbWVudFJvb3REZWx0YVtdIHJlbW92ZXMgPSAoUGFja2FnZUZyYWdtZW50Um9vdERlbHRhW10pIGZQYWNrYWdlRnJhZ21lbnRSb290c1JlbW92ZWQudmFsdWVzKCkudG9BcnJheShuZXcgUGFja2FnZUZyYWdtZW50Um9vdERlbHRhW2ZQYWNrYWdlRnJhZ21lbnRSb290c1JlbW92ZWQuc2l6ZSgpXSk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3Zlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaGFuZGxlRWxlbWVudENoYW5nZWQocmVtb3Zlc1tpXS5lbGVtZW50UGF0aCwgcmVtb3Zlc1tpXS5kZWx0YUtpbmQsIHJlbW92ZXNbaV0uaXNFeHBvcnRlZCk7Ci0JCQkJCX0KLQkJCQkJUGFja2FnZUZyYWdtZW50Um9vdERlbHRhW10gY2hhbmdlcyA9IChQYWNrYWdlRnJhZ21lbnRSb290RGVsdGFbXSkgZlBhY2thZ2VGcmFnbWVudFJvb3RzQ2hhbmdlZC52YWx1ZXMoKS50b0FycmF5KG5ldyBQYWNrYWdlRnJhZ21lbnRSb290RGVsdGFbZlBhY2thZ2VGcmFnbWVudFJvb3RzQ2hhbmdlZC5zaXplKCldKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQloYW5kbGVFbGVtZW50Q2hhbmdlZChjaGFuZ2VzW2ldLmVsZW1lbnRQYXRoLCBjaGFuZ2VzW2ldLmRlbHRhS2luZCwgY2hhbmdlc1tpXS5pc0V4cG9ydGVkKTsKLQkJCQkJfQotCQkJCQlQYWNrYWdlRnJhZ21lbnRSb290RGVsdGFbXSBhZGRzID0gKFBhY2thZ2VGcmFnbWVudFJvb3REZWx0YVtdKSBmUGFja2FnZUZyYWdtZW50Um9vdHNBZGRlZC52YWx1ZXMoKS50b0FycmF5KG5ldyBQYWNrYWdlRnJhZ21lbnRSb290RGVsdGFbZlBhY2thZ2VGcmFnbWVudFJvb3RzQWRkZWQuc2l6ZSgpXSk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaGFuZGxlRWxlbWVudENoYW5nZWQoYWRkc1tpXS5lbGVtZW50UGF0aCwgYWRkc1tpXS5kZWx0YUtpbmQsIGFkZHNbaV0uaXNFeHBvcnRlZCk7Ci0JCQkJCX0KLQkJCQkJZlBhY2thZ2VGcmFnbWVudFJvb3RzUmVtb3ZlZC5jbGVhcigpOwotCQkJCQlmUGFja2FnZUZyYWdtZW50Um9vdHNDaGFuZ2VkLmNsZWFyKCk7Ci0JCQkJCWZQYWNrYWdlRnJhZ21lbnRSb290c0FkZGVkLmNsZWFyKCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFRhZ2xpYkluZm8gZXh0cmFjdEluZm8oU3RyaW5nIGJhc2VQYXRoLCBJbnB1dFN0cmVhbSB0bGRDb250ZW50cykgewotCQlUYWdsaWJJbmZvIGluZm8gPSBuZXcgVGFnbGliSW5mbygpOwotCQlpZiAodGxkQ29udGVudHMgIT0gbnVsbCkgewotCQkJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCQlwcm92aWRlci5zZXRJbnB1dFN0cmVhbSh0bGRDb250ZW50cyk7Ci0JCQlwcm92aWRlci5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJCXByb3ZpZGVyLnNldFJvb3RFbGVtZW50TmFtZShKU1AxMlRMRE5hbWVzLlRBR0xJQik7Ci0JCQlwcm92aWRlci5zZXRCYXNlUmVmZXJlbmNlKGJhc2VQYXRoKTsKLQkJCU5vZGUgY2hpbGQgPSBwcm92aWRlci5nZXRSb290RWxlbWVudCgpOwotCQkJaWYgKGNoaWxkID09IG51bGwgfHwgY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSB8fCAhY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UQUdMSUIpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuVVJJKSkgewotCQkJCQkJaW5mby51cmkgPSBnZXRUZXh0Q29udGVudHMoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuU0hPUlRfTkFNRSkgfHwgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5TSE9SVE5BTUUpKSB7Ci0JCQkJCQlpbmZvLnNob3J0TmFtZSA9IGdldFRleHRDb250ZW50cyhjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgfHwgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5JTkZPKSkgewotCQkJCQkJaW5mby5kZXNjcmlwdGlvbiA9IGdldFRleHRDb250ZW50cyhjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ESVNQTEFZX05BTUUpKSB7Ci0JCQkJCQlpbmZvLmRpc3BsYXlOYW1lID0gZ2V0VGV4dENvbnRlbnRzKGNoaWxkKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMlRMRE5hbWVzLkpTUF9WRVJTSU9OKSB8fCBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLkpTUFZFUlNJT04pKSB7Ci0JCQkJCQlpbmZvLmpzcFZlcnNpb24gPSBnZXRUZXh0Q29udGVudHMoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuVExJQl9WRVJTSU9OKSB8fCBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLlRMSUJWRVJTSU9OKSkgewotCQkJCQkJaW5mby50bGliVmVyc2lvbiA9IGdldFRleHRDb250ZW50cyhjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSkgewotCQkJCQkJaW5mby5zbWFsbEljb24gPSBnZXRUZXh0Q29udGVudHMoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTikpIHsKLQkJCQkJCWluZm8ubGFyZ2VJY29uID0gZ2V0VGV4dENvbnRlbnRzKGNoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JTGlzdCBnZXRBdmFpbGFibGVUYWdsaWJSZWNvcmRzKElQYXRoIHBhdGgpIHsKLQkJZW5zdXJlVXBUb2RhdGUoKTsKLQkJQ29sbGVjdGlvbiByZWNvcmRzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZsb2F0IGpzcFZlcnNpb24gPSBEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRKU1BWZXJzaW9uKHBhdGgpOwotCQkJTE9DSy5hY3F1aXJlKCk7Ci0KLQkJCUNvbGxlY3Rpb24gaW1wbGljaXRSZWZlcmVuY2VzID0gbmV3IEhhc2hTZXQoZ2V0SW1wbGljaXRSZWZlcmVuY2VzKHBhdGgudG9TdHJpbmcoKSkudmFsdWVzKCkpOwotCQkJcmVjb3JkcyA9IG5ldyBIYXNoU2V0KGZUTERSZWZlcmVuY2VzLnNpemUoKSArIGZUYWdEaXJSZWZlcmVuY2VzLnNpemUoKSArIGZKQVJSZWZlcmVuY2VzLnNpemUoKSArIGZXZWJYTUxSZWZlcmVuY2VzLnNpemUoKSk7Ci0JCQlyZWNvcmRzLmFkZEFsbChmVExEUmVmZXJlbmNlcy52YWx1ZXMoKSk7Ci0JCQlpZiAoanNwVmVyc2lvbiA+PSAxLjEpIHsKLQkJCQlyZWNvcmRzLmFkZEFsbChfZ2V0SlNQMTFBbmRXZWJYTUxKYXJSZWZlcmVuY2VzKGZKQVJSZWZlcmVuY2VzLnZhbHVlcygpKSk7Ci0JCQl9Ci0KLQkJCWlmIChqc3BWZXJzaW9uID49IDEuMikgewotCQkJCXJlY29yZHMuYWRkQWxsKGltcGxpY2l0UmVmZXJlbmNlcyk7Ci0KLQkJCQlNYXAgYnVpbGRQYXRoUmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJTGlzdCBwcm9qZWN0c1Byb2Nlc3NlZCA9IG5ldyBBcnJheUxpc3QoZkNsYXNzcGF0aFByb2plY3RzLnNpemUoKSArIDEpOwotCQkJCXByb2plY3RzUHJvY2Vzc2VkLmFkZChmUHJvamVjdCk7Ci0JCQkJYWRkQnVpbGRQYXRoUmVmZXJlbmNlcyhidWlsZFBhdGhSZWZlcmVuY2VzLCBwcm9qZWN0c1Byb2Nlc3NlZCwgZmFsc2UpOwotCQkJCXJlY29yZHMuYWRkQWxsKGJ1aWxkUGF0aFJlZmVyZW5jZXMudmFsdWVzKCkpOwotCQkJCQotCQkJCWlmKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCXJlY29yZHMuYWRkQWxsKG5ldyBIYXNoU2V0KGdldEltcGxpY2l0UmVmZXJlbmNlcyhmUHJvamVjdC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLnZhbHVlcygpKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGpzcFZlcnNpb24gPj0gMi4wKSB7Ci0JCQkJcmVjb3Jkcy5hZGRBbGwoZlRhZ0RpclJlZmVyZW5jZXMudmFsdWVzKCkpOwotCQkJfQotCQkJCi0JCQlJUGF0aCBsb2NhbFdlYlhNTCA9IG5ldyBQYXRoKGdldExvY2FsUm9vdChwYXRoLnRvU3RyaW5nKCkpKS5hcHBlbmQoIi9XRUItSU5GL3dlYi54bWwiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCVdlYlhNTFJlY29yZCB3ZWJ4bWxSZWNvcmQgPSAoV2ViWE1MUmVjb3JkKSBmV2ViWE1MUmVmZXJlbmNlcy5nZXQobG9jYWxXZWJYTUwudG9TdHJpbmcoKSk7Ci0JCQlpZih3ZWJ4bWxSZWNvcmQgIT0gbnVsbCkKLQkJCQlyZWNvcmRzLmFkZEFsbCh3ZWJ4bWxSZWNvcmQuZ2V0VExEUmVjb3JkcygpKTsKLQotCQkJcmVjb3Jkcy5hZGRBbGwoZ2V0Q2F0YWxvZ1JlY29yZHMoKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlMT0NLLnJlbGVhc2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IEFycmF5TGlzdChyZWNvcmRzKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhIHN0cmVhbSB0byBhIGxvY2FsIGNvcHkgb2YgdGhlIGlucHV0IG9yIG51bGwgaWYgbm90IHBvc3NpYmxlCi0JICovCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRDYWNoZWRJbnB1dFN0cmVhbShaaXBGaWxlIHppcEZpbGUsIFppcEVudHJ5IHppcEVudHJ5KSB7Ci0JCUlucHV0U3RyZWFtIGNhY2hlID0gbnVsbDsKLQkJaWYgKHppcEZpbGUgIT0gbnVsbCkgewotCQkJaWYgKHppcEVudHJ5ICE9IG51bGwpIHsKLQkJCQlJbnB1dFN0cmVhbSBlbnRyeUlucHV0U3RyZWFtID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQllbnRyeUlucHV0U3RyZWFtID0gemlwRmlsZS5nZXRJbnB1dFN0cmVhbSh6aXBFbnRyeSk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4YykgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJUYWdsaWIgSW5kZXg6ICIgKyB6aXBGaWxlLmdldE5hbWUoKSwgaW9FeGMpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJaWYgKGVudHJ5SW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCQlpbnQgYzsKLQkJCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZmZlciA9IG51bGw7Ci0JCQkJCWlmICh6aXBFbnRyeS5nZXRTaXplKCkgPiAwKSB7Ci0JCQkJCQlidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKChpbnQpIHppcEVudHJ5LmdldFNpemUoKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJCX0KLQkJCQkJLy8gYXJyYXkgZGltIHJlc3RyaWN0aW9uPwotCQkJCQlieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXdoaWxlICgoYyA9IGVudHJ5SW5wdXRTdHJlYW0ucmVhZChieXRlcykpID49IDApIHsKLQkJCQkJCQlidWZmZXIud3JpdGUoYnl0ZXMsIDAsIGMpOwotCQkJCQkJfQotCQkJCQkJY2FjaGUgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyLnRvQnl0ZUFycmF5KCkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBudWxsLCBpb2UpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQllbnRyeUlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBudWxsLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjYWNoZTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0Q2F0YWxvZ1JlY29yZHMoKSB7Ci0JCWlmIChmQ2F0YWxvZ1JlY29yZHMgPT0gbnVsbCkgewotCQkJTGlzdCByZWNvcmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSUNhdGFsb2cgZGVmYXVsdENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQkJaWYgKGRlZmF1bHRDYXRhbG9nICE9IG51bGwpIHsKLQkJCQkvLyBQcm9jZXNzIGRlZmF1bHQgY2F0YWxvZwotCQkJCUlDYXRhbG9nRW50cnlbXSBlbnRyaWVzID0gZGVmYXVsdENhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLQkJCQlmb3IgKGludCBlbnRyeSA9IDA7IGVudHJ5IDwgZW50cmllcy5sZW5ndGg7IGVudHJ5KyspIHsKLQkJCQkJSVRhZ2xpYlJlY29yZCByZWNvcmQgPSBjcmVhdGVDYXRhbG9nUmVjb3JkKGVudHJpZXNbZW50cnldKTsKLQkJCQkJcmVjb3Jkcy5hZGQocmVjb3JkKTsKLQkJCQl9Ci0KLQkJCQkvLyBQcm9jZXNzIGRlY2xhcmVkIE9BU0lTIG5leHRDYXRhbG9ncyBjYXRhbG9nCi0JCQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZGVmYXVsdENhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCQkJZm9yIChpbnQgbmV4dENhdGFsb2cgPSAwOyBuZXh0Q2F0YWxvZyA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IG5leHRDYXRhbG9nKyspIHsKLQkJCQkJSUNhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tuZXh0Q2F0YWxvZ10uZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCQkJSUNhdGFsb2dFbnRyeVtdIGVudHJpZXMyID0gY2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpOwotCQkJCQlmb3IgKGludCBlbnRyeSA9IDA7IGVudHJ5IDwgZW50cmllczIubGVuZ3RoOyBlbnRyeSsrKSB7Ci0JCQkJCQlTdHJpbmcgdXJpID0gZW50cmllczJbZW50cnldLmdldFVSSSgpOwotCQkJCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCQkJdXJpID0gdXJpLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7Ci0JCQkJCQkJaWYgKHVyaS5lbmRzV2l0aCgoIi5qYXIiKSkgfHwgdXJpLmVuZHNXaXRoKCgiLnRsZCIpKSkgewotCQkJCQkJCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IGNyZWF0ZUNhdGFsb2dSZWNvcmQoZW50cmllczJbZW50cnldKTsKLQkJCQkJCQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlyZWNvcmRzLmFkZChyZWNvcmQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZkNhdGFsb2dSZWNvcmRzID0gcmVjb3JkczsKLQkJfQotCQlyZXR1cm4gZkNhdGFsb2dSZWNvcmRzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW1wbGljaXRSZWZlcmVuY2VzIGZvciB0aGUgZ2l2ZW4gcGF0aAotCSAqLwotCUhhc2h0YWJsZSBnZXRJbXBsaWNpdFJlZmVyZW5jZXMoU3RyaW5nIHBhdGgpIHsKLQkJU3RyaW5nIGxvY2FsUm9vdCA9IGdldExvY2FsUm9vdChwYXRoKTsKLQkJSGFzaHRhYmxlIGltcGxpY2l0UmVmZXJlbmNlcyA9IChIYXNodGFibGUpIGZJbXBsaWNpdFJlZmVyZW5jZXMuZ2V0KGxvY2FsUm9vdCk7Ci0JCWlmIChpbXBsaWNpdFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJaW1wbGljaXRSZWZlcmVuY2VzID0gbmV3IEFycmF5TWFwKDEpOwotCQkJZkltcGxpY2l0UmVmZXJlbmNlcy5wdXQobG9jYWxSb290LCBpbXBsaWNpdFJlZmVyZW5jZXMpOwotCQl9Ci0JCXJldHVybiBpbXBsaWNpdFJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogQHJldHVybiB0aGUgYXBwbGljYWJsZSBXZWIgY29udGV4dCByb290IHBhdGgsIGlmIG9uZSBleGlzdHMKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlQYXRoIGdldExvY2FsUm9vdChJUGF0aCBiYXNlUGF0aCkgewotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQotCQkvLyBleGlzdGluZyB3b3Jrc3BhY2UgcmVzb3VyY2VzIC0gdGhpcyBpcyB0aGUgOTMlIGNhc2UKLQkJSVJlc291cmNlIGZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihiYXNlUGF0aCk7Ci0KLQkJLy8gVHJ5IHRoZSBiYXNlIHBhdGggYXMgYSBmb2xkZXIgZmlyc3QKLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZvbGRlcihiYXNlUGF0aCk7Ci0JCX0KLQkJLy8gSWYgbm90IGEgZm9sZGVyLCB0aGVuIHRyeSBiYXNlIHBhdGggYXMgYSBmaWxlCi0JCWlmIChmaWxlICE9IG51bGwgJiYgIWZpbGUuZXhpc3RzKCkgJiYgYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKGJhc2VQYXRoKTsKLQkJfQotCi0JCWlmIChmaWxlID09IG51bGwgJiYgYmFzZVBhdGguc2VnbWVudENvdW50KCkgPT0gMSkgewotCQkJZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChiYXNlUGF0aC5zZWdtZW50KDApKTsKLQkJfQotCi0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NTI5Ci0JCQkgKiAKLQkJCSAqIFRoaXMgbWV0aG9kIHByb2R1Y2VzIGEgbGVzcyBhY2N1cmF0ZSByZXN1bHQsIGJ1dCBkb2Vzbid0Ci0JCQkgKiByZXF1aXJlIHRoYXQgdGhlIGZpbGUgZXhpc3QgeWV0LgotCQkJICovCi0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihiYXNlUGF0aCk7Ci0JCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkKLQkJCQlmaWxlID0gZmlsZXNbMF07Ci0JCX0KLQotCQl3aGlsZSAoZmlsZSAhPSBudWxsKSB7Ci0JCQkvKioKLQkJCSAqIFRyZWF0IGFueSBwYXJlbnQgZm9sZGVyIHdpdGggYSBXRUItSU5GIHN1YmZvbGRlciBhcyBhIHdlYi1hcHAKLQkJCSAqIHJvb3QKLQkJCSAqLwotCQkJSUNvbnRhaW5lciBmb2xkZXIgPSBudWxsOwotCQkJaWYgKChmaWxlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpICE9IDApIHsKLQkJCQlmb2xkZXIgPSAoSUNvbnRhaW5lcikgZmlsZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvbGRlciA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQkvLyBnZXRGb2xkZXIgb24gYSB3b3Jrc3BhY2Ugcm9vdCBtdXN0IHVzZSBhIGZ1bGwgcGF0aCwgc2tpcAotCQkJaWYgKGZvbGRlciAhPSBudWxsICYmIChmb2xkZXIuZ2V0VHlwZSgpICYgSVJlc291cmNlLlJPT1QpID09IDApIHsKLQkJCQlJRm9sZGVyIHdlYmluZiA9IGZvbGRlci5nZXRGb2xkZXIoV0VCX0lORl9QQVRIKTsKLQkJCQlpZiAod2ViaW5mICE9IG51bGwgJiYgd2ViaW5mLmV4aXN0cygpKSB7Ci0JCQkJCXJldHVybiBmb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaWxlID0gZmlsZS5nZXRQYXJlbnQoKTsKLQkJfQotCi0JCXJldHVybiBmUHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMb2NhbFJvb3QoU3RyaW5nIGJhc2VQYXRoKSB7Ci0JCXJldHVybiBnZXRMb2NhbFJvb3QobmV3IFBhdGgoYmFzZVBhdGgpKS50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFRleHRDb250ZW50cyhOb2RlIHBhcmVudCkgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSA9PSAxKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbSgwKTsKLQkJCWlmIChjaGlsZC5nZXROb2RlVmFsdWUoKSAhPSBudWxsKQotCQkJCXJldHVybiBjaGlsZC5nZXROb2RlVmFsdWUoKS50cmltKCk7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpIHsKLQkJCQlTdHJpbmcgcmVmZXJlbmNlID0gKChFbnRpdHlSZWZlcmVuY2UpIGNoaWxkKS5nZXROb2RlVmFsdWUoKTsKLQkJCQlpZiAocmVmZXJlbmNlID09IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCXJlZmVyZW5jZSA9ICImIiArIGNoaWxkLmdldE5vZGVOYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJcy5hcHBlbmQocmVmZXJlbmNlLnRyaW0oKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZVZhbHVlKCkgIT0gbnVsbCkgewotCQkJCXMuYXBwZW5kKGNoaWxkLmdldE5vZGVWYWx1ZSgpLnRyaW0oKSk7Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHMudG9TdHJpbmcoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2aXNpdG9yLgotCSAqLwotCUlSZXNvdXJjZURlbHRhVmlzaXRvciBnZXRWaXNpdG9yKCkgewotCQlpZiAoZlZpc2l0b3IgPT0gbnVsbCkgewotCQkJZlZpc2l0b3IgPSBuZXcgRGVsdGFWaXNpdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZWaXNpdG9yOwotCX0KLQotCXZvaWQgaGFuZGxlRWxlbWVudENoYW5nZWQoSVBhdGggbGlicmFyeVBhdGgsIGludCBkZWx0YUtpbmQsIGJvb2xlYW4gZXhwb3J0ZWQpIHsKLQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShsaWJyYXJ5UGF0aCk7Ci0JCVN0cmluZyBsaWJyYXJ5TG9jYXRpb24gPSBudWxsOwotCQlpZiAoZmlsZS5pc0FjY2Vzc2libGUoKSAmJiBmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkKLQkJCWxpYnJhcnlMb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQllbHNlCi0JCQlsaWJyYXJ5TG9jYXRpb24gPSBsaWJyYXJ5UGF0aC50b1N0cmluZygpOwotCQl1cGRhdGVDbGFzc3BhdGhMaWJyYXJ5KGxpYnJhcnlMb2NhdGlvbiwgZGVsdGFLaW5kLCBleHBvcnRlZCk7Ci0JfQotCQotCXZvaWQgaGFuZGxlRWxlbWVudENoYW5nZWQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKGZCdWlsZFBhdGhJc0RpcnR5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiSUphdmFFbGVtZW50RGVsdGE6ICIgKyBkZWx0YSk7Ci0JCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZGVsdGEuZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QpIHsKLQkJCUlKYXZhRWxlbWVudERlbHRhW10gYWZmZWN0ZWRDaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWZmZWN0ZWRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWhhbmRsZUVsZW1lbnRDaGFuZ2VkKGFmZmVjdGVkQ2hpbGRyZW5baV0pOwotCQkJfQotCQl9Ci0JCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCAmJiAoKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50KS5pc0FyY2hpdmUoKSkgewotCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCAmJiAoKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50KS5pc0V4dGVybmFsKCkpIHsKLQkJCX0KLQkJCVN0cmluZyBsaWJMb2NhdGlvbiA9IG51bGw7Ci0JCQlpbnQgdGFnbGliUmVjb3JkRXZlbnRLaW5kID0gLTE7Ci0JCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0FEREVEX1RPX0NMQVNTUEFUSCkgPiAwIHx8IChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9BUkNISVZFX0NPTlRFTlRfQ0hBTkdFRCkgPiAwIHx8IChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSA+IDApIHsKLQkJCQl0YWdsaWJSZWNvcmRFdmVudEtpbmQgPSBJVGFnbGliSW5kZXhEZWx0YS5DSEFOR0VEOwotCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQURERURfVE9fQ0xBU1NQQVRIKSA+IDApIHsKLQkJCQkJdGFnbGliUmVjb3JkRXZlbnRLaW5kID0gSVRhZ2xpYkluZGV4RGVsdGEuQURERUQ7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9BUkNISVZFX0NPTlRFTlRfQ0hBTkdFRCkgPiAwKSB7Ci0JCQkJCXRhZ2xpYlJlY29yZEV2ZW50S2luZCA9IElUYWdsaWJJbmRleERlbHRhLkNIQU5HRUQ7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSA+IDApIHsKLQkJCQkJdGFnbGliUmVjb3JkRXZlbnRLaW5kID0gSVRhZ2xpYkluZGV4RGVsdGEuUkVNT1ZFRDsKLQkJCQl9Ci0JCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShlbGVtZW50LmdldFBhdGgoKSk7Ci0JCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkgJiYgZmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpCi0JCQkJCWxpYkxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJZWxzZQotCQkJCQlsaWJMb2NhdGlvbiA9IGVsZW1lbnQuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAobGliTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gZnJhZ21lbnRpc0V4cG9ydGVkID0gdHJ1ZTsKLQkJCQl0cnkgewotCQkJCQlJQ2xhc3NwYXRoRW50cnkgcmF3Q2xhc3NwYXRoRW50cnkgPSAoKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50KS5nZXRSYXdDbGFzc3BhdGhFbnRyeSgpOwotCQkJCQkvKgotCQkJCQkgKiBudWxsIG1heSBhbHNvIGJlIHJldHVybmVkIGZvciBkZWxldGlvbnMgZGVwZW5kaW5nIG9uCi0JCQkJCSAqIHJlc291cmNlL2J1aWxkIHBhdGggbm90aWZpY2F0aW9uIG9yZGVyLiBJZiBpdCdzIG51bGwsCi0JCQkJCSAqIGl0J3MgYmVlbiBkZWxldGVkIGFuZCB3aGV0aGVyIGl0J3MgZXhwb3J0ZWQgd29uJ3QKLQkJCQkJICogcmVhbGx5IG1hdHRlcgotCQkJCQkgKi8KLQkJCQkJaWYgKHJhd0NsYXNzcGF0aEVudHJ5ICE9IG51bGwpIHsKLQkJCQkJCWZyYWdtZW50aXNFeHBvcnRlZCA9IHJhd0NsYXNzcGF0aEVudHJ5LmlzRXhwb3J0ZWQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSVBhY2thZ2VGcmFnbWVudFJvb3Qgbm90IHBhcnQgb2YgdGhlIGJ1aWxkIHBhdGgKLQkJCQl9Ci0JCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgpID4gMCkgewotCQkJCQlmQnVpbGRQYXRoRW50cnlDb3VudCsrOwotCQkJCX0KLQkJCQllbHNlIGlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCkgPiAwKSB7Ci0JCQkJCWZCdWlsZFBhdGhFbnRyeUNvdW50LS07Ci0JCQkJfQotCQkJCXVwZGF0ZUNsYXNzcGF0aExpYnJhcnkobGliTG9jYXRpb24sIHRhZ2xpYlJlY29yZEV2ZW50S2luZCwgZnJhZ21lbnRpc0V4cG9ydGVkKTsKLQkJCX0KLQkJCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInByb2Nlc3NlZCBidWlsZCBwYXRoIGRlbHRhIGZvciAiICsgZlByb2plY3QuZ2V0TmFtZSgpICsgIigiICsgZWxlbWVudC5nZXRQYXRoKCkgKyAiKSBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQl2b2lkIGluZGV4KCkgewotCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCWZUTERSZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCWZKQVJSZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCWZUYWdEaXJSZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCWZXZWJYTUxSZWZlcmVuY2VzLmNsZWFyKCk7Ci0KLQkJdHJ5IHsKLQkJCWZQcm9qZWN0LmFjY2VwdChuZXcgSW5kZXhlcigpLCAwKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJaWYgKF9kZWJ1Z0luZGV4VGltZSkKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJpbmRleGVkICIgKyBmUHJvamVjdC5nZXROYW1lKCkgKyAiIGNvbnRlbnRzIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXZvaWQgaW5kZXhDbGFzc3BhdGgoKSB7Ci0JCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlmQ2xhc3NwYXRoUHJvamVjdHMuY2xlYXIoKTsKLQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJZkNsYXNzcGF0aEphcnMuY2xlYXIoKTsKLQkJZkJ1aWxkUGF0aEVudHJ5Q291bnQgPSAwOwotCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShmUHJvamVjdCk7Ci0JCS8qCi0JCSAqIElmIHRoZSBKYXZhIG5hdHVyZSBpc24ndCBwcmVzZW50IChvciBzb21ldGhpbmcgZWxzZSBpcyB3cm9uZyksCi0JCSAqIGRvbid0IGNoZWNrIHRoZSBidWlsZCBwYXRoLgotCQkgKi8KLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwgJiYgamF2YVByb2plY3QuZXhpc3RzKCkpIHsKLQkJCWluZGV4Q2xhc3NwYXRoKGphdmFQcm9qZWN0KTsKLQkJfQotCQkvLyBlbHNlIHsKLQkJLy8gTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlRhZ2xpYkluZGV4IHdhcyBhc2tlZCB0byBpbmRleCBub24tSmF2YQotCQkvLyBQcm9qZWN0ICIgKyBmUHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCS8vIH0KLQotCQlpZiAoX2RlYnVnSW5kZXhUaW1lKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImluZGV4ZWQgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIgY2xhc3NwYXRoIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQl2b2lkIGluZGV4Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHsKLQkJaWYgKF9kZWJ1Z0luZGV4VGltZSkKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWZDbGFzc3BhdGhQcm9qZWN0cy5jbGVhcigpOwotCQlmQ2xhc3NwYXRoUmVmZXJlbmNlcy5jbGVhcigpOwotCQlmQ2xhc3NwYXRoSmFycy5jbGVhcigpOwotCi0JCWZCdWlsZFBhdGhFbnRyeUNvdW50ID0gZW50cmllcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJaW5kZXhDbGFzc3BhdGgoZW50cmllc1tpXSk7Ci0JCX0KLQotCQlpZiAoX2RlYnVnSW5kZXhUaW1lKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImluZGV4ZWQgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIgY2xhc3NwYXRoIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZW50cnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5kZXhDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgOiB7Ci0JCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSAoSUNsYXNzcGF0aENvbnRhaW5lcikgZW50cnk7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5W10gY29udGFpbmVkRW50cmllcyA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZWRFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWluZGV4Q2xhc3NwYXRoKGNvbnRhaW5lZEVudHJpZXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDogewotCQkJCS8qCi0JCQkJICogSWdub3JlIGxpYnMgaW4gcmVxdWlyZWQgcHJvamVjdHMgdGhhdCBhcmUgbm90IGV4cG9ydGVkCi0JCQkJICovCi0JCQkJSVBhdGggbGliUGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQlpZiAoIWZDbGFzc3BhdGhKYXJzLmNvbnRhaW5zS2V5KGxpYlBhdGgudG9TdHJpbmcoKSkpIHsKLQkJCQkJaWYgKGxpYlBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJCXVwZGF0ZUNsYXNzcGF0aExpYnJhcnkobGliUGF0aC50b1N0cmluZygpLCBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCwgZW50cnkuaXNFeHBvcnRlZCgpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBOb3RlOiAuamFycyBvbiB0aGUgY2xhc3NwYXRoIGluc2lkZSBvZiB0aGUgcHJvamVjdAotCQkJCQkJICogd2lsbCBoYXZlIGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSBKQVIgcmVmZXJlbmNlcwotCQkJCQkJICogdGFibGUgdGhhdCB3aWxsIGUgcmV0dXJuZWQgdG8KLQkJCQkJCSAqIGdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMoKS4KLQkJCQkJCSAqLwotCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGxpYlBhdGgpOwotCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJCQkJCXVwZGF0ZUNsYXNzcGF0aExpYnJhcnkocmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCwgZW50cnkuaXNFeHBvcnRlZCgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJcmVzb3VyY2UuYWNjZXB0KG5ldyBJbmRleGVyKCksIDApOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6IHsKLQkJCQkvKgotCQkJCSAqIFdlJ3JlIGN1cnJlbnRseSBpZ25vcmluZyB3aGV0aGVyIHRoZSBwcm9qZWN0IGV4cG9ydHMgYWxsIG9mCi0JCQkJICogaXRzIGJ1aWxkIHBhdGgKLQkJCQkgKi8KLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGVudHJ5LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpKTsKLQkJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCWZDbGFzc3BhdGhQcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6IHsKLQkJCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQkJCXRyeSB7Ci0JCQkJCUlSZXNvdXJjZSBzb3VyY2VGb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGF0aCk7Ci0JCQkJCS8vIGNvdWxkIGJlIGEgYmFkIC5jbGFzc3BhdGggZmlsZQotCQkJCQlpZihzb3VyY2VGb2xkZXIgIT0gbnVsbCkgewotCQkJCQkJc291cmNlRm9sZGVyLmFjY2VwdChuZXcgSW5kZXhlcigpLCAwKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDogewotCQkJCUlQYXRoIGxpYlBhdGggPSBKYXZhQ29yZS5nZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRQYXRoKCkpOwotCQkJCWlmIChsaWJQYXRoICE9IG51bGwpIHsKLQkJCQkJRmlsZSBmaWxlID0gbGliUGF0aC50b0ZpbGUoKTsKLQotCQkJCQkvLyBmaWxlIGluIGZpbGVzeXN0ZW0KLQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgIWZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQkJdXBkYXRlQ2xhc3NwYXRoTGlicmFyeShsaWJQYXRoLnRvU3RyaW5nKCksIElUYWdsaWJSZWNvcmRFdmVudC5BRERFRCwgZW50cnkuaXNFeHBvcnRlZCgpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHdvcmtzcGFjZSBmaWxlCi0JCQkJCQlJRmlsZSBqYXJGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGxpYlBhdGgpOwotCQkJCQkJaWYgKGphckZpbGUuaXNBY2Nlc3NpYmxlKCkgJiYgamFyRmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgamFyRmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJCQlTdHJpbmcgamFyUGF0aFN0cmluZyA9IGphckZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCQkJCXVwZGF0ZUNsYXNzcGF0aExpYnJhcnkoamFyUGF0aFN0cmluZywgSVRhZ2xpYlJlY29yZEV2ZW50LkFEREVELCBlbnRyeS5pc0V4cG9ydGVkKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBwcml2YXRlIHZvaWQgcmVtb3ZlQ2xhc3NwYXRoTGlicmFyeShTdHJpbmcgbGlicmFyeUxvY2F0aW9uKSB7IEphclJlY29yZAotCSAqIHJlY29yZCA9IChKYXJSZWNvcmQpIGZDbGFzc3BhdGhKYXJzLnJlbW92ZShsaWJyYXJ5TG9jYXRpb24pOyBpZiAocmVjb3JkICE9Ci0JICogbnVsbCkgeyBVUkxSZWNvcmRbXSByZWNvcmRzID0gKFVSTFJlY29yZFtdKQotCSAqIHJlY29yZC5nZXRVUkxSZWNvcmRzKCkudG9BcnJheShuZXcgVVJMUmVjb3JkWzBdKTsgZm9yIChpbnQgaSA9IDA7IGkgPAotCSAqIHJlY29yZHMubGVuZ3RoOyBpKyspIHsKLQkgKiBmQ2xhc3NwYXRoUmVmZXJlbmNlcy5yZW1vdmUocmVjb3Jkc1tpXS5nZXRVUkkoKSk7IH0KLQkgKiBUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KHJlY29yZCwKLQkgKiBJVGFnbGliSW5kZXhEZWx0YS5SRU1PVkVEKSk7IH0gfQotCSAqLwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5kZXhDbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCWlmIChqYXZhUHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0LmVxdWFscyhmUHJvamVjdCkpIHsKLQkJCXRyeSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotCQkJCWZCdWlsZFBhdGhFbnRyeUNvdW50ID0gZW50cmllcy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWluZGV4Q2xhc3NwYXRoKGVudHJpZXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIHNlYXJjaGluZyBKYXZhIEJ1aWxkIFBhdGggKyAoIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIpIGZvciB0YWcgbGlicmFyaWVzIiwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JfQotCQotCXZvaWQgcXVldWVFbGVtZW50Q2hhbmdlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQl0cnkgewotCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgewotCQkJCUlKYXZhRWxlbWVudERlbHRhW10gYWZmZWN0ZWRDaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFmZmVjdGVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJcXVldWVFbGVtZW50Q2hhbmdlZChhZmZlY3RlZENoaWxkcmVuW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgJiYgKChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudCkuaXNBcmNoaXZlKCkpIHsKLQkJCQlJUGF0aCBwYXRoID0gZWxlbWVudC5nZXRQYXRoKCk7Ci0JCQkJYm9vbGVhbiBmcmFnbWVudGlzRXhwb3J0ZWQgPSB0cnVlOwotCQkJCXRyeSB7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeSByYXdDbGFzc3BhdGhFbnRyeSA9ICgoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQpLmdldFJhd0NsYXNzcGF0aEVudHJ5KCk7Ci0JCQkJCS8qCi0JCQkJCSAqIG51bGwgbWF5IGFsc28gYmUgcmV0dXJuZWQgZm9yIGRlbGV0aW9ucyBkZXBlbmRpbmcgb24KLQkJCQkJICogcmVzb3VyY2UvYnVpbGQgcGF0aCBub3RpZmljYXRpb24gb3JkZXIuIElmIGl0J3MgbnVsbCwKLQkJCQkJICogaXQncyBiZWVuIGRlbGV0ZWQgYW5kIHdoZXRoZXIgaXQncyBleHBvcnRlZCB3b24ndAotCQkJCQkgKiByZWFsbHkgbWF0dGVyCi0JCQkJCSAqLwotCQkJCQlpZiAocmF3Q2xhc3NwYXRoRW50cnkgIT0gbnVsbCkgewotCQkJCQkJZnJhZ21lbnRpc0V4cG9ydGVkID0gcmF3Q2xhc3NwYXRoRW50cnkuaXNFeHBvcnRlZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkvLyBJUGFja2FnZUZyYWdtZW50Um9vdCBub3QgcGFydCBvZiB0aGUgYnVpbGQgcGF0aAotCQkJCX0KLQkJCQlTdHJpbmcga2V5ID0gcGF0aC50b1N0cmluZygpOwotCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQURERURfVE9fQ0xBU1NQQVRIKSA+IDApIHsKLQkJCQkJZlBhY2thZ2VGcmFnbWVudFJvb3RzQWRkZWQucHV0KGtleSwgbmV3IFBhY2thZ2VGcmFnbWVudFJvb3REZWx0YShwYXRoLCBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCwgZnJhZ21lbnRpc0V4cG9ydGVkKSk7Ci0JCQkJCWZQYWNrYWdlRnJhZ21lbnRSb290c0NoYW5nZWQucmVtb3ZlKGtleSk7Ci0JCQkJCWZQYWNrYWdlRnJhZ21lbnRSb290c1JlbW92ZWQucmVtb3ZlKGtleSk7Ci0JCQkJCWZCdWlsZFBhdGhFbnRyeUNvdW50Kys7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9BUkNISVZFX0NPTlRFTlRfQ0hBTkdFRCkgPiAwKSB7Ci0JCQkJCWZQYWNrYWdlRnJhZ21lbnRSb290c0NoYW5nZWQucHV0KGtleSwgbmV3IFBhY2thZ2VGcmFnbWVudFJvb3REZWx0YShwYXRoLCBJVGFnbGliSW5kZXhEZWx0YS5DSEFOR0VELCBmcmFnbWVudGlzRXhwb3J0ZWQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFTU9WRURfRlJPTV9DTEFTU1BBVEgpID4gMCkgewotCQkJCQlmUGFja2FnZUZyYWdtZW50Um9vdHNBZGRlZC5yZW1vdmUoa2V5KTsKLQkJCQkJZlBhY2thZ2VGcmFnbWVudFJvb3RzQ2hhbmdlZC5yZW1vdmUoa2V5KTsKLQkJCQkJZlBhY2thZ2VGcmFnbWVudFJvb3RzUmVtb3ZlZC5wdXQoa2V5LCBuZXcgUGFja2FnZUZyYWdtZW50Um9vdERlbHRhKHBhdGgsIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQsIGZyYWdtZW50aXNFeHBvcnRlZCkpOwotCQkJCQlmQnVpbGRQYXRoRW50cnlDb3VudC0tOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCUxPQ0sucmVsZWFzZSgpOwotCQl9Ci0KLQkJZkJ1aWxkUGF0aEpvYi5jYW5jZWwoKTsKLQkJZkJ1aWxkUGF0aEpvYi5zY2hlZHVsZSgyMDAwKTsKLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIHJlYWRUZXh0b2ZDaGlsZChOb2RlIG5vZGUsIFN0cmluZyBjaGlsZE5hbWUpIHsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpIHsKLQkJCQlyZXR1cm4gZ2V0VGV4dENvbnRlbnRzKGNoaWxkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRU1QVFlfU1RSSU5HOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jdm9pZCByZW1vdmVKQVIoSVJlc291cmNlIGphcikgewotCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJyZW1vdmluZyByZWNvcmRzIGZvciBKQVIgIiArIGphci5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQlKYXJSZWNvcmQgcmVjb3JkID0gKEphclJlY29yZCkgZkpBUlJlZmVyZW5jZXMucmVtb3ZlKGphci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQlpZiAocmVjb3JkICE9IG51bGwpIHsKLQkJCVVSTFJlY29yZFtdIHJlY29yZHMgPSAoVVJMUmVjb3JkW10pIHJlY29yZC5nZXRVUkxSZWNvcmRzKCkudG9BcnJheShuZXcgVVJMUmVjb3JkWzBdKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjb3Jkcy5sZW5ndGg7IGkrKykgewotCQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIHJlY29yZHNbaV0sIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQpKTsKLQkJCQkoKEFycmF5TWFwKSBnZXRJbXBsaWNpdFJlZmVyZW5jZXMoamFyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpLnJlbW92ZShyZWNvcmRzW2ldLmdldFVSSSgpLCByZWNvcmRzW2ldKTsKLQkJCX0KLQkJCWlmIChyZWNvcmQuaGFzMTFUTEQpIHsKLQkJCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCByZWNvcmQsIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQpKTsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVGFnKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlUYWdEaXJSZWNvcmQgcmVjb3JkID0gKFRhZ0RpclJlY29yZCkgZlRhZ0RpclJlZmVyZW5jZXMuZ2V0KHJlc291cmNlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJcmVjb3JkLnRhZ3MucmVtb3ZlKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCByZWNvcmQsIElUYWdsaWJJbmRleERlbHRhLkNIQU5HRUQpKTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVGFnRGlyKElSZXNvdXJjZSB0YWdkaXIpIHsKLQkJSVBhdGggdGFnZGlyUGF0aCA9IHRhZ2Rpci5nZXRGdWxsUGF0aCgpOwotCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJyZW1vdmluZyByZWNvcmQgZm9yICIgKyB0YWdkaXJQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBmVGFnRGlyUmVmZXJlbmNlcy5yZW1vdmUodGFnZGlyUGF0aC50b1N0cmluZygpKTsKLQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCByZWNvcmQsIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQpKTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVExEKElSZXNvdXJjZSB0bGQpIHsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAicmVtb3ZpbmcgcmVjb3JkIGZvciAiICsgdGxkLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCVRMRFJlY29yZCByZWNvcmQgPSAoVExEUmVjb3JkKSBmVExEUmVmZXJlbmNlcy5yZW1vdmUodGxkLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJaWYgKHJlY29yZC5nZXRVUkkoKSAhPSBudWxsKSB7Ci0JCQkJKChBcnJheU1hcCkgZ2V0SW1wbGljaXRSZWZlcmVuY2VzKHRsZC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKS5yZW1vdmUocmVjb3JkLmdldFVSSSgpLCByZWNvcmQpOwotCQkJfQotCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCBJVGFnbGliSW5kZXhEZWx0YS5SRU1PVkVEKSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVdlYlhNTChJUmVzb3VyY2Ugd2VieG1sKSB7Ci0JCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92aW5nIHJlY29yZHMgZm9yICIgKyB3ZWJ4bWwuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJV2ViWE1MUmVjb3JkIHJlY29yZCA9IChXZWJYTUxSZWNvcmQpIGZXZWJYTUxSZWZlcmVuY2VzLnJlbW92ZSh3ZWJ4bWwuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQlUTERSZWNvcmRbXSByZWNvcmRzID0gKFRMRFJlY29yZFtdKSByZWNvcmQuZ2V0VExEUmVjb3JkcygpLnRvQXJyYXkobmV3IFRMRFJlY29yZFswXSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92ZWQgcmVjb3JkIGZvciAiICsgcmVjb3Jkc1tpXS5nZXRVUkkoKSArICJAIiArIHJlY29yZHNbaV0ucGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCSgoQXJyYXlNYXApIGdldEltcGxpY2l0UmVmZXJlbmNlcyh3ZWJ4bWwuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSkucmVtb3ZlKHJlY29yZHNbaV0uZ2V0VVJJKCksIHJlY29yZHNbaV0pOwotCQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIHJlY29yZHNbaV0sIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcmVxdWVzdGVkUmVmcmVzaCgpIHsKLQkJYm9vbGVhbiByZXF1ZXN0ZWQgPSBmYWxzZTsKLQkJU3RyaW5nW10gY29tbWFuZExpbmVBcmdzID0gUGxhdGZvcm0uZ2V0Q29tbWFuZExpbmVBcmdzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZExpbmVBcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXF1ZXN0ZWQgPSByZXF1ZXN0ZWQgfHwgIi1yZWZyZXNoIi5lcXVhbHMoY29tbWFuZExpbmVBcmdzW2ldKTsgLy8kTk9OLU5MUy0xJCAKLQkJfQotCQlyZXR1cm4gcmVxdWVzdGVkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JSVRhZ2xpYlJlY29yZCByZXNvbHZlKFN0cmluZyBiYXNlUGF0aCwgU3RyaW5nIHJlZmVyZW5jZSkgewotCQllbnN1cmVVcFRvZGF0ZSgpOwotCi0JCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gbnVsbDsKLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQl0cnkgewotCQkJZmxvYXQganNwVmVyc2lvbiA9IERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5nZXRJbnN0YW5jZSgpLmdldEpTUFZlcnNpb24obmV3IFBhdGgoYmFzZVBhdGgpKTsKLQotCQkJLyoqCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk2MTc3IFN1cHBvcnQKLQkJCSAqIHJlc29sdXRpb24gaW4gZmxleGlibGUgcHJvamVjdHMKLQkJCSAqLwotCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5yZXNvbHZlKG5ldyBQYXRoKGJhc2VQYXRoKSwgcmVmZXJlbmNlKTsKLQkJCWlmIChyZXNvdXJjZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJaWYgKHJlc291cmNlUGF0aC50b1N0cmluZygpLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuZW5kc1dpdGgoIi50bGQiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCk7Ci0JCQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQlwYXRoID0gcmVzb3VyY2VQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2VQYXRoLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocmVzb3VyY2VQYXRoKTsKLQkJCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCXBhdGggPSByZXNvdXJjZVBhdGgudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJTE9DSy5hY3F1aXJlKCk7Ci0KLQkJCVN0cmluZyBsb2NhbFJvb3QgPSBnZXRMb2NhbFJvb3QoYmFzZVBhdGgpOwotCQkJLyoqCi0JCQkgKiBXb3JrYXJvdW5kIGZvciBwcm9ibGVtIGluIFVSSUhlbHBlcjsgdXJpcyBzdGFydGluZyB3aXRoICcvJyBhcmUKLQkJCSAqIHJldHVybmVkIGFzLWlzLgotCQkJICovCi0JCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQkJaWYgKHJlZmVyZW5jZS5zdGFydHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwYXRoID0gbG9jYWxSb290ICsgcmVmZXJlbmNlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGF0aCA9IFVSSUhlbHBlci5ub3JtYWxpemUocmVmZXJlbmNlLCBiYXNlUGF0aCwgbG9jYWxSb290KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUlQYXRoIGxvY2FsV2ViWE1MID0gbmV3IFBhdGgobG9jYWxSb290KS5hcHBlbmQoIi9XRUItSU5GL3dlYi54bWwiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCVdlYlhNTFJlY29yZCB3ZWJ4bWxSZWNvcmQgPSAoV2ViWE1MUmVjb3JkKSBmV2ViWE1MUmVmZXJlbmNlcy5nZXQobG9jYWxXZWJYTUwudG9TdHJpbmcoKSk7Ci0JCQlpZiAod2VieG1sUmVjb3JkICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHdlYnhtbFJlY29yZC50bGRSZWNvcmRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUYWdsaWJSZWNvcmQgcmVjb3JkMiA9IChJVGFnbGliUmVjb3JkKSB3ZWJ4bWxSZWNvcmQudGxkUmVjb3Jkcy5nZXQoaSk7Ci0JCQkJCUlUYWdsaWJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSByZWNvcmQyLmdldERlc2NyaXB0b3IoKTsKLQkJCQkJaWYgKHJlZmVyZW5jZS5lcXVhbHMoZGVzY3JpcHRvci5nZXRVUkkoKSkpIHsKLQkJCQkJCXJlY29yZCA9IHJlY29yZDI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZWNvcmQgPT0gbnVsbCkgewotCQkJCS8vIG9yZGVyIGRpY3RhdGVkIGJ5IEpTUCBzcGVjIDIuMCBzZWN0aW9uIDcuMi4zCi0JCQkJcmVjb3JkID0gKElUYWdsaWJSZWNvcmQpIGZKQVJSZWZlcmVuY2VzLmdldChwYXRoKTsKLQotCQkJCS8vIG9ubHkgaWYgMS4xIFRMRCB3YXMgZm91bmQKLQkJCQlpZiAoanNwVmVyc2lvbiA8IDEuMSB8fCAocmVjb3JkIGluc3RhbmNlb2YgSmFyUmVjb3JkICYmICEoKEphclJlY29yZCkgcmVjb3JkKS5oYXMxMVRMRCkpIHsKLQkJCQkJcmVjb3JkID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChyZWNvcmQgPT0gbnVsbCkgewotCQkJCXJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBmVExEUmVmZXJlbmNlcy5nZXQocGF0aCk7Ci0JCQl9Ci0JCQlpZiAocmVjb3JkID09IG51bGwgJiYganNwVmVyc2lvbiA+PSAxLjIpIHsKLQkJCQlPYmplY3RbXSByZWNvcmRzID0gKE9iamVjdFtdKSBnZXRJbXBsaWNpdFJlZmVyZW5jZXMoYmFzZVBhdGgpLmdldChyZWZlcmVuY2UpOwotCQkJCWlmIChyZWNvcmRzICE9IG51bGwgJiYgcmVjb3Jkcy5sZW5ndGggPiAwKSB7Ci0JCQkJCWlmIChyZWNvcmRzLmxlbmd0aCA+IDEpCi0JCQkJCQlyZWNvcmRzID0gZlRhZ2xpYlNvcnRlci5zb3J0KHJlY29yZHMpOwotCQkJCQlyZWNvcmQgPSAgKElUYWdsaWJSZWNvcmQpIHJlY29yZHNbcmVjb3Jkcy5sZW5ndGggLSAxXTsKLQkJCQl9Ci0JCQl9Ci0KLQotCQkJaWYgKHJlY29yZCA9PSBudWxsICYmIGpzcFZlcnNpb24gPj0gMi4wKSB7Ci0JCQkJcmVjb3JkID0gKElUYWdsaWJSZWNvcmQpIGZUYWdEaXJSZWZlcmVuY2VzLmdldChwYXRoKTsKLQkJCX0KLQotCQkJaWYgKHJlY29yZCA9PSBudWxsICYmIGpzcFZlcnNpb24gPj0gMS4yKSB7Ci0JCQkJcmVjb3JkID0gKElUYWdsaWJSZWNvcmQpIGZDbGFzc3BhdGhSZWZlcmVuY2VzLmdldChyZWZlcmVuY2UpOwotCQkJfQotCQkJaWYgKHJlY29yZCA9PSBudWxsICYmIGpzcFZlcnNpb24gPj0gMS4yKSB7Ci0JCQkJTWFwIGJ1aWxkUGF0aFJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCUxpc3QgcHJvamVjdHNQcm9jZXNzZWQgPSBuZXcgQXJyYXlMaXN0KGZDbGFzc3BhdGhQcm9qZWN0cy5zaXplKCkgKyAxKTsKLQkJCQlwcm9qZWN0c1Byb2Nlc3NlZC5hZGQoZlByb2plY3QpOwotCQkJCWFkZEJ1aWxkUGF0aFJlZmVyZW5jZXMoYnVpbGRQYXRoUmVmZXJlbmNlcywgcHJvamVjdHNQcm9jZXNzZWQsIGZhbHNlKTsKLQkJCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgYnVpbGRQYXRoUmVmZXJlbmNlcy5nZXQocmVmZXJlbmNlKTsKLQkJCX0KLQkJCQotCQkJLy8gQ2hlY2sgdGhlIFhNTCBDYXRhbG9nCi0JCQlpZiAocmVjb3JkID09IG51bGwpIHsKLQkJCQlJQ2F0YWxvZyBjYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyByZXNvbHZlZFN0cmluZyA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkvLyBDaGVjayBhcyBzeXN0ZW0gcmVmZXJlbmNlIGZpcnN0Ci0JCQkJCQlyZXNvbHZlZFN0cmluZyA9IGNhdGFsb2cucmVzb2x2ZVN5c3RlbShyZWZlcmVuY2UpOwotCQkJCQkJLy8gQ2hlY2sgYXMgVVJJCi0JCQkJCQlpZiAocmVzb2x2ZWRTdHJpbmcgPT0gbnVsbCB8fCByZXNvbHZlZFN0cmluZy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXJlc29sdmVkU3RyaW5nID0gY2F0YWxvZy5yZXNvbHZlVVJJKHJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBDaGVjayBhcyBwdWJsaWMgSUQKLQkJCQkJCWlmIChyZXNvbHZlZFN0cmluZyA9PSBudWxsIHx8IHJlc29sdmVkU3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJcmVzb2x2ZWRTdHJpbmcgPSBjYXRhbG9nLnJlc29sdmVQdWJsaWMocmVmZXJlbmNlLCBiYXNlUGF0aCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJCWlmIChyZXNvbHZlZFN0cmluZyAhPSBudWxsICYmIHJlc29sdmVkU3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCXJlY29yZCA9IGNyZWF0ZUNhdGFsb2dSZWNvcmQocmVmZXJlbmNlLCByZXNvbHZlZFN0cmluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8qCi0JCQkgKiBJZiBubyByZWNvcmRzIHdlcmUgZm91bmQgYW5kIG5vIGxvY2FsLXJvb3QgYXBwbGllcywgY2hlY2sgQUxMCi0JCQkgKiBvZiB0aGUgd2ViLnhtbCBmaWxlcyBhcyBhIGZhbGxiYWNrCi0JCQkgKi8KLQkJCWlmIChyZWNvcmQgPT0gbnVsbCAmJiBmUHJvamVjdC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKGxvY2FsUm9vdCkpIHsKLQkJCQlXZWJYTUxSZWNvcmRbXSB3ZWJ4bWxzID0gKFdlYlhNTFJlY29yZFtdKSBmV2ViWE1MUmVmZXJlbmNlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBXZWJYTUxSZWNvcmRbMF0pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd2VieG1scy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAocmVjb3JkICE9IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJT2JqZWN0W10gcmVjb3JkcyA9IChPYmplY3RbXSkgZ2V0SW1wbGljaXRSZWZlcmVuY2VzKHdlYnhtbHNbaV0ucGF0aC50b1N0cmluZygpKS5nZXQocmVmZXJlbmNlKTsKLQkJCQkJaWYgKHJlY29yZHMgIT0gbnVsbCAmJiByZWNvcmRzLmxlbmd0aCA+IDApIHsKLQkJCQkJCWlmIChyZWNvcmRzLmxlbmd0aCA+IDEpCi0JCQkJCQkJcmVjb3JkcyA9IGZUYWdsaWJTb3J0ZXIuc29ydChyZWNvcmRzKTsKLQkJCQkJCXJlY29yZCA9ICAoSVRhZ2xpYlJlY29yZCkgcmVjb3Jkc1tyZWNvcmRzLmxlbmd0aCAtIDFdOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLyoKLQkJCSAqIElmIG5vIHJlY29yZHMgd2VyZSBmb3VuZCwgY2hlY2sgdGhlIGltcGxpY2l0IHJlZmVyZW5jZXMgb24gdGhlIHByb2plY3QgaXRzZWxmIGFzIGEgZmFsbGJhY2sKLQkJCSAqLwotCQkJaWYgKHJlY29yZCA9PSBudWxsICYmIGpzcFZlcnNpb24gPj0gMS4yKSB7Ci0JCQkJT2JqZWN0W10gcmVjb3JkcyA9IChPYmplY3RbXSkgZ2V0SW1wbGljaXRSZWZlcmVuY2VzKGZQcm9qZWN0LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkuZ2V0KHJlZmVyZW5jZSk7Ci0JCQkJaWYgKHJlY29yZHMgIT0gbnVsbCAmJiByZWNvcmRzLmxlbmd0aCA+IDApIHsKLQkJCQkJaWYgKHJlY29yZHMubGVuZ3RoID4gMSkKLQkJCQkJCXJlY29yZHMgPSBmVGFnbGliU29ydGVyLnNvcnQocmVjb3Jkcyk7Ci0JCQkJCXJlY29yZCA9ICAoSVRhZ2xpYlJlY29yZCkgcmVjb3Jkc1tyZWNvcmRzLmxlbmd0aCAtIDFdOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCWZpbmFsbHkgewotCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVjb3JkOwotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIGFueSBzYXZlZCByZWZlcmVuY2UgdGFibGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVSZWZlcmVuY2VzKCkgewotCQlmaW5hbCBib29sZWFuIG5vdGlmeU9uUmVzdG9yYXRpb24gPSB0cnVlOwotCQlpZiAoVGFnbGliSW5kZXguRU5BQkxFRCkgewotCQkJLy8gcmVzb3VyY2VzIGZpcnN0Ci0JCQlpbmRleCgpOwotCQkJLy8gbm93IGJ1aWxkIHBhdGgKLQotCQkJLy8gPT09PT09PT09PT09PT09PSB0ZXN0IHJlbG9hZCB0aW1lID09PT09PT09PT09PT09PT09PT09PT09PQotCQkJYm9vbGVhbiByZXN0b3JlZCA9IGZhbHNlOwotCQkJRmlsZSBzYXZlZFN0YXRlID0gbmV3IEZpbGUoZlNhdmVTdGF0ZUZpbGVuYW1lKTsKLQkJCWlmIChzYXZlZFN0YXRlLmV4aXN0cygpICYmICFyZXF1ZXN0ZWRSZWZyZXNoKCkpIHsKLQkJCQlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlyZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShzYXZlZFN0YXRlKSksICJVVEYtMTYiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJLy8gdXNlIGEgc3RyaW5nIGJ1ZmZlciB0ZW1wb3JhcmlseSB0byByZWR1Y2Ugc3RyaW5nCi0JCQkJCS8vIGNyZWF0aW9uCi0JCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCWNoYXIgYXJyYXlbXSA9IG5ldyBjaGFyWzIwNDhdOwotCQkJCQlpbnQgY2hhcnNSZWFkID0gMDsKLQkJCQkJd2hpbGUgKChjaGFyc1JlYWQgPSByZWFkZXIucmVhZChhcnJheSkpICE9IC0xKSB7Ci0JCQkJCQlpZiAoY2hhcnNSZWFkID4gMCkgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoYXJyYXksIDAsIGNoYXJzUmVhZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlJRG9jdW1lbnQgZG9jID0gbmV3IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQoKTsKLQkJCQkJZG9jLnNldChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQkJCWludCBsaW5lcyA9IGRvYy5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCQkJCWlmIChsaW5lcyA+IDApIHsKLQkJCQkJCUlSZWdpb24gbGluZSA9IGRvYy5nZXRMaW5lSW5mb3JtYXRpb24oMCk7Ci0JCQkJCQlTdHJpbmcgbGluZVRleHQgPSBkb2MuZ2V0KGxpbmUuZ2V0T2Zmc2V0KCksIGxpbmUuZ2V0TGVuZ3RoKCkpOwotCQkJCQkJSmFyUmVjb3JkIGxpYnJhcnlSZWNvcmQgPSBudWxsOwotCQkJCQkJaWYgKFNBVkVfRk9STUFUX1ZFUlNJT04uZXF1YWxzKGxpbmVUZXh0LnRyaW0oKSkpIHsKLQkJCQkJCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQotCQkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbGluZXMgJiYgIWZCdWlsZFBhdGhJc0RpcnR5OyBpKyspIHsKLQkJCQkJCQkJbGluZSA9IGRvYy5nZXRMaW5lSW5mb3JtYXRpb24oaSk7Ci0JCQkJCQkJCWxpbmVUZXh0ID0gZG9jLmdldChsaW5lLmdldE9mZnNldCgpLCBsaW5lLmdldExlbmd0aCgpKTsKLQkJCQkJCQkJU3RyaW5nVG9rZW5pemVyIHRva2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lVGV4dCwgInwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpZiAodG9rZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCQlTdHJpbmcgdG9rZW5UeXBlID0gdG9rZXIubmV4dFRva2VuKCk7Ci0JCQkJCQkJCQlpZiAoIkpBUiIuZXF1YWxzSWdub3JlQ2FzZSh0b2tlblR5cGUpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCWJvb2xlYW4gaGFzMTFUTEQgPSBCb29sZWFuLnZhbHVlT2YodG9rZXIubmV4dFRva2VuKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJCQkJCWJvb2xlYW4gZXhwb3J0ZWQgPSBCb29sZWFuLnZhbHVlT2YodG9rZXIubmV4dFRva2VuKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJCQkJCS8vIG1ha2UgdGhlIHJlc3QgdGhlIGxpYnJhcnlMb2NhdGlvbgotCQkJCQkJCQkJCVN0cmluZyBsaWJyYXJ5TG9jYXRpb24gPSB0b2tlci5uZXh0VG9rZW4oKTsKLQkJCQkJCQkJCQl3aGlsZSAodG9rZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCQkJCWxpYnJhcnlMb2NhdGlvbiA9IGxpYnJhcnlMb2NhdGlvbiArICJ8IiArIHRva2VyLm5leHRUb2tlbigpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJbGlicmFyeUxvY2F0aW9uID0gbGlicmFyeUxvY2F0aW9uLnRyaW0oKTsKLQkJCQkJCQkJCQlpZiAobGlicmFyeVJlY29yZCAhPSBudWxsICYmIG5vdGlmeU9uUmVzdG9yYXRpb24pIHsKLQkJCQkJCQkJCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgbGlicmFyeVJlY29yZCwgSVRhZ2xpYkluZGV4RGVsdGEuQURERUQpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJLy8gQ3JlYXRlIGEgbmV3IEphclJlY29yZAotCQkJCQkJCQkJCWxpYnJhcnlSZWNvcmQgPSBjcmVhdGVKQVJSZWNvcmQobGlicmFyeUxvY2F0aW9uKTsKLQkJCQkJCQkJCQlsaWJyYXJ5UmVjb3JkLmhhczExVExEID0gaGFzMTFUTEQ7Ci0JCQkJCQkJCQkJbGlicmFyeVJlY29yZC5pc0V4cG9ydGVkID0gZXhwb3J0ZWQ7Ci0KLQkJCQkJCQkJCQkvLyBBZGQgYSBVUkxSZWNvcmQgZm9yIHRoZSAxLjEgVExECi0JCQkJCQkJCQkJaWYgKGhhczExVExEKSB7Ci0JCQkJCQkJCQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gSmFyVXRpbGl0aWVzLmdldElucHV0U3RyZWFtKGxpYnJhcnlMb2NhdGlvbiwgSmFyVXRpbGl0aWVzLkpTUDExX1RBR0xJQik7Ci0JCQkJCQkJCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyhsaWJyYXJ5TG9jYXRpb24sIGNvbnRlbnRzKTsKLQotCQkJCQkJCQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnVyaSAhPSBudWxsICYmIGluZm8udXJpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQkJCQkJCVVSTFJlY29yZCB1cmxSZWNvcmQgPSBuZXcgVVJMUmVjb3JkKCk7Ci0JCQkJCQkJCQkJCQkJdXJsUmVjb3JkLmluZm8gPSBpbmZvOwotCQkJCQkJCQkJCQkJCXVybFJlY29yZC5pc0V4cG9ydGVkID0gZXhwb3J0ZWQ7Ci0JCQkJCQkJCQkJCQkJdXJsUmVjb3JkLmJhc2VMb2NhdGlvbiA9IGxpYnJhcnlMb2NhdGlvbjsKLQkJCQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQkJCQl1cmxSZWNvcmQudXJsID0gbmV3IFVSTCgiamFyOmZpbGU6IiArIGxpYnJhcnlMb2NhdGlvbiArICIhLyIgKyBKYXJVdGlsaXRpZXMuSlNQMTFfVEFHTElCKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCQkJCWxpYnJhcnlSZWNvcmQudXJsUmVjb3Jkcy5hZGQodXJsUmVjb3JkKTsKLQkJCQkJCQkJCQkJCQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMucHV0KHVybFJlY29yZC5nZXRVUkkoKSwgdXJsUmVjb3JkKTsKLQkJCQkJCQkJCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRlZCByZWNvcmQgZm9yICIgKyB1cmxSZWNvcmQuZ2V0VVJJKCkgKyAiQCIgKyB1cmxSZWNvcmQuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCQkJCS8qCi0JCQkJCQkJCQkJCQkJCSAqIGRvbid0IHJlY29yZCB0aGlzCi0JCQkJCQkJCQkJCQkJCSAqIFVSSQotCQkJCQkJCQkJCQkJCQkgKi8KLQkJCQkJCQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBudWxsLCBlKTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQotCQkJCQkJCQkJCWZDbGFzc3BhdGhKYXJzLnB1dChsaWJyYXJ5TG9jYXRpb24sIGxpYnJhcnlSZWNvcmQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoIlVSTCIuZXF1YWxzSWdub3JlQ2FzZSh0b2tlblR5cGUpICYmIGxpYnJhcnlSZWNvcmQgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJLy8gcmVsaWVzIG9uIGEgcHJldmlvdXNseSBkZWNsYXJlZCBKQVIgcmVjb3JkCi0JCQkJCQkJCQkJYm9vbGVhbiBleHBvcnRlZCA9IEJvb2xlYW4udmFsdWVPZih0b2tlci5uZXh0VG9rZW4oKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCQkJCQkJLy8gbWFrZSB0aGUgcmVzdCB0aGUgVVJMCi0JCQkJCQkJCQkJU3RyaW5nIHVybFN0cmluZyA9IHRva2VyLm5leHRUb2tlbigpOwotCQkJCQkJCQkJCXdoaWxlICh0b2tlci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQkJCQkJdXJsU3RyaW5nID0gdXJsU3RyaW5nICsgInwiICsgdG9rZXIubmV4dFRva2VuKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl1cmxTdHJpbmcgPSB1cmxTdHJpbmcudHJpbSgpOwotCQkJCQkJCQkJCS8vIEFwcGVuZCBhIFVSTHJlY29yZAotCQkJCQkJCQkJCVVSTFJlY29yZCB1cmxSZWNvcmQgPSBuZXcgVVJMUmVjb3JkKCk7Ci0JCQkJCQkJCQkJdXJsUmVjb3JkLnVybCA9IG5ldyBVUkwodXJsU3RyaW5nKTsKLQkJCQkJCQkJCQl1cmxSZWNvcmQuaXNFeHBvcnRlZCA9IGV4cG9ydGVkOwotCQkJCQkJCQkJCXVybFJlY29yZC5iYXNlTG9jYXRpb24gPSBsaWJyYXJ5UmVjb3JkLmxvY2F0aW9uLnRvU3RyaW5nKCk7Ci0KLQkJCQkJCQkJCQlJbnB1dFN0cmVhbSB0bGRTdHJlYW0gPSBKYXJVdGlsaXRpZXMuZ2V0SW5wdXRTdHJlYW0odXJsUmVjb3JkLnVybCk7Ci0JCQkJCQkJCQkJaWYodGxkU3RyZWFtICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJbGlicmFyeVJlY29yZC51cmxSZWNvcmRzLmFkZCh1cmxSZWNvcmQpOwotCQkJCQkJCQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyh1cmxSZWNvcmQudXJsLnRvU3RyaW5nKCksIHRsZFN0cmVhbSk7Ci0JCQkJCQkJCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCXVybFJlY29yZC5pbmZvID0gaW5mbzsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQkJdGxkU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBudWxsLCBlKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQlpZiAodXJsUmVjb3JkLmdldFVSSSgpICE9IG51bGwgJiYgdXJsUmVjb3JkLmdldFVSSSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQkJCQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMucHV0KHVybFJlY29yZC5nZXRVUkkoKSwgdXJsUmVjb3JkKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEJVSUxEUEFUSF9QUk9KRUNULmVxdWFsc0lnbm9yZUNhc2UodG9rZW5UeXBlKSkgewotCQkJCQkJCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IHRva2VyLm5leHRUb2tlbigpOwotCQkJCQkJCQkJCWlmIChQYXRoLlJPT1QuaXNWYWxpZFNlZ21lbnQocHJvamVjdE5hbWUpKSB7Ci0JCQkJCQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJCQkJCQkJCQkvKiBkbyBub3QgY2hlY2sgaWYgIm9wZW4iIGhlcmUgKi8KLQkJCQkJCQkJCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJZkNsYXNzcGF0aFByb2plY3RzLmFkZChwcm9qZWN0KTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCS8vIGxhc3Qgc2luY2UgdGhleSBvY2N1ciBvbmNlCi0JCQkJCQkJCQllbHNlIGlmIChCVUlMRFBBVEhfRElSVFkuZXF1YWxzSWdub3JlQ2FzZSh0b2tlblR5cGUpKSB7Ci0JCQkJCQkJCQkJZkJ1aWxkUGF0aElzRGlydHkgPSBCb29sZWFuLnZhbHVlT2YodG9rZXIubmV4dFRva2VuKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoQlVJTERQQVRIX0VOVFJJRVMuZXF1YWxzSWdub3JlQ2FzZSh0b2tlblR5cGUpKSB7Ci0JCQkJCQkJCQkJZkJ1aWxkUGF0aEVudHJ5Q291bnQgPSBJbnRlZ2VyLnZhbHVlT2YodG9rZXIubmV4dFRva2VuKCkpLmludFZhbHVlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGxpYnJhcnlSZWNvcmQgIT0gbnVsbCAmJiBub3RpZnlPblJlc3RvcmF0aW9uKSB7Ci0JCQkJCQkJCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCBsaWJyYXJ5UmVjb3JkLCBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCXJlc3RvcmVkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJUYWcgTGlicmFyeSBJbmRleDogZGlmZmVyZW50IGNhY2hlIGZvcm1hdCBmb3VuZCwgd2FzIFwiIiArIGxpbmVUZXh0ICsgIlwiLCBzdXBwb3J0cyBcIiIgKyBTQVZFX0ZPUk1BVF9WRVJTSU9OICsgIlwiLCByZWluZGV4aW5nIGJ1aWxkIHBhdGgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoX2RlYnVnSW5kZXhUaW1lKQotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInRpbWUgc3BlbnQgcmVsb2FkaW5nICIgKyBmUHJvamVjdC5nZXROYW1lKCkgKyAiIGJ1aWxkIHBhdGg6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJlc3RvcmVkID0gZmFsc2U7Ci0JCQkJCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiZmFpbHVyZSByZWxvYWRpbmcgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIgYnVpbGQgcGF0aCBpbmRleCIsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIG51bGwsIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyA9PT09PT09PT09PT09PT09IHRlc3QgcmVsb2FkIHRpbWUgKGVuZCkgPT09PT09PT09PT09PT09PT09Ci0KLQotCQkJaWYgKCFyZXN0b3JlZCkgewotCQkJCXNldEJ1aWxkUGF0aElzRGlydHkoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIGFueSBzdG9yYWJsZSByZWZlcmVuY2VzIHRvIGRpc2suIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiB0aGUKLQkgKiBkZXNjcmlwdGlvbiBpcyBiZWluZyBjbGVhcmVkIGFuZCBub3QgYWZ0ZXIgZXZlcnkgdXBkYXRlLgotCSAqLwotCXZvaWQgc2F2ZVJlZmVyZW5jZXMoKSB7Ci0JCS8vIHRoZSBidWlsZCBwYXRoIGluZm9ybWF0aW9uIGlzIG91dCBvZiBkYXRlLCByZW1lbWJlciB0aGF0Ci0JCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCVdyaXRlciB3cml0ZXIgPSBudWxsOwotCi0JCS8qKgotCQkgKiA8cHJlPgotCQkgKiAgICAgICAgICAgICAgICAgICAgIAkJIDEuMS4wCi0JCSAqICAgICAgICAgICAgICAgICAgICAgCQkgU2F2ZSBjbGFzc3BhdGggaW5mb3JtYXRpb24gKHwgaXMgZmllbGQgZGVsaW1pdGVyKQotCQkgKiAgICAgICAgICAgICAgICAgICAgIAkJIEphcnMgYXJlIHNhdmVkIGFzICZxdW90O0pBUjomcXVvdDsrIGhhczExVExEICsgamFyIHBhdGggCi0JCSAqICAgICAgICAgICAgICAgICAgICAgCQkgVVJMUmVjb3JkcyBhcyAmcXVvdDtVUkw6JnF1b3Q7K1VSTAotCQkgKiA8L3ByZT4KLQkJICovCi0JCXRyeSB7Ci0JCQl3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZTYXZlU3RhdGVGaWxlbmFtZSksICJVVEYtMTYiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLndyaXRlKFNBVkVfRk9STUFUX1ZFUlNJT04pOwotCQkJd3JpdGVyLndyaXRlKCdcbicpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGUoQlVJTERQQVRIX0RJUlRZICsgInwiICsgZkJ1aWxkUGF0aElzRGlydHkpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGUoJ1xuJyk7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZShCVUlMRFBBVEhfRU5UUklFUyArICJ8IiArIGZCdWlsZFBhdGhFbnRyeUNvdW50KTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLndyaXRlKCdcbicpOyAvLyROT04tTkxTLTEkCi0KLQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSAoSVByb2plY3RbXSkgZkNsYXNzcGF0aFByb2plY3RzLnRvQXJyYXkobmV3IElQcm9qZWN0WzBdKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQl3cml0ZXIud3JpdGUoQlVJTERQQVRIX1BST0pFQ1QpOwotCQkJCXdyaXRlci53cml0ZSgifCIpOyAvLyROT04tTkxTLTEkCi0JCQkJd3JpdGVyLndyaXRlKHByb2plY3RzW2ldLmdldE5hbWUoKSk7Ci0JCQkJd3JpdGVyLndyaXRlKCdcbicpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCUVudW1lcmF0aW9uIGphcnMgPSBmQ2xhc3NwYXRoSmFycy5rZXlzKCk7Ci0JCQl3aGlsZSAoamFycy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyBqYXJQYXRoID0gamFycy5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0JCQkJSmFyUmVjb3JkIGphclJlY29yZCA9IChKYXJSZWNvcmQpIGZDbGFzc3BhdGhKYXJzLmdldChqYXJQYXRoKTsKLQkJCQl3cml0ZXIud3JpdGUoIkpBUnwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXdyaXRlci53cml0ZShCb29sZWFuLnRvU3RyaW5nKGphclJlY29yZC5oYXMxMVRMRCkpOwotCQkJCXdyaXRlci53cml0ZSgnfCcpOyAvLyROT04tTkxTLTEkCi0JCQkJd3JpdGVyLndyaXRlKEJvb2xlYW4udG9TdHJpbmcoamFyUmVjb3JkLmlzRXhwb3J0ZWQpKTsKLQkJCQl3cml0ZXIud3JpdGUoJ3wnKTsgLy8kTk9OLU5MUy0xJAotCQkJCXdyaXRlci53cml0ZShqYXJQYXRoKTsKLQkJCQl3cml0ZXIud3JpdGUoJ1xuJyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlJdGVyYXRvciBpID0gamFyUmVjb3JkLnVybFJlY29yZHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQkJVVJMUmVjb3JkIHVybFJlY29yZCA9IChVUkxSZWNvcmQpIGkubmV4dCgpOwotCQkJCQl3cml0ZXIud3JpdGUoIlVSTHwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl3cml0ZXIud3JpdGUoU3RyaW5nLnZhbHVlT2YodXJsUmVjb3JkLmlzRXhwb3J0ZWQpKTsKLQkJCQkJd3JpdGVyLndyaXRlKCJ8Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJd3JpdGVyLndyaXRlKHVybFJlY29yZC5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCQkJd3JpdGVyLndyaXRlKCdcbicpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgbnVsbCwgZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmICh3cml0ZXIgIT0gbnVsbCkgewotCQkJCQl3cml0ZXIuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgbnVsbCwgZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoX2RlYnVnSW5kZXhUaW1lKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInRpbWUgc3BlbnQgc2F2aW5nIGluZGV4IGZvciAiICsgZlByb2plY3QuZ2V0TmFtZSgpICsgIjogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQl2b2lkIHNldEJ1aWxkUGF0aElzRGlydHkoKSB7Ci0JCWZCdWlsZFBhdGhJc0RpcnR5ID0gdHJ1ZTsKLQkJaWYgKF9kZWJ1Z0luZGV4VGltZSkKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJtYXJraW5nIGJ1aWxkIHBhdGggaW5mb3JtYXRpb24gZm9yICIgKyBmUHJvamVjdC5nZXROYW1lKCkgKyAiIGFzIGRpcnR5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgcmVjb3JkcyBmb3IgYSBsaWJyYXJ5IG9uIHRoZSBwcm9qZWN0IGJ1aWxkIHBhdGgKLQkgKiBAcGFyYW0gbGlicmFyeUxvY2F0aW9uCi0JICogQHBhcmFtIGRlbHRhS2luZAotCSAqIEBwYXJhbSBpc0V4cG9ydGVkCi0JICovCi0Jdm9pZCB1cGRhdGVDbGFzc3BhdGhMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5TG9jYXRpb24sIGludCBkZWx0YUtpbmQsIGJvb2xlYW4gaXNFeHBvcnRlZCkgewotCQlKYXJSZWNvcmQgbGlicmFyeVJlY29yZCA9IG51bGw7Ci0JCWlmIChkZWx0YUtpbmQgPT0gSVRhZ2xpYkluZGV4RGVsdGEuUkVNT1ZFRCB8fCBkZWx0YUtpbmQgPT0gSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRCkgewotCQkJbGlicmFyeVJlY29yZCA9IChKYXJSZWNvcmQpIGZDbGFzc3BhdGhKYXJzLnJlbW92ZShsaWJyYXJ5TG9jYXRpb24pOwotCQkJc3luY2hyb25pemVkIChmU2hhcmVkSmFyUmVjb3JkcykgewotCQkJCWZTaGFyZWRKYXJSZWNvcmRzLnJlbW92ZShsaWJyYXJ5TG9jYXRpb24pOwotCQkJfQotCQkJaWYgKGxpYnJhcnlSZWNvcmQgIT0gbnVsbCkgewotCQkJCUlVUkxSZWNvcmRbXSB1cmxSZWNvcmRzID0gKElVUkxSZWNvcmRbXSkgbGlicmFyeVJlY29yZC51cmxSZWNvcmRzLnRvQXJyYXkobmV3IElVUkxSZWNvcmRbMF0pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJsUmVjb3Jkcy5sZW5ndGg7IGkrKykgewotCQkJCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBmQ2xhc3NwYXRoUmVmZXJlbmNlcy5yZW1vdmUodXJsUmVjb3Jkc1tpXS5nZXRVUkkoKSk7Ci0JCQkJCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCBJVGFnbGliSW5kZXhEZWx0YS5SRU1PVkVEKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlbHRhS2luZCA9PSBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCB8fCBkZWx0YUtpbmQgPT0gSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRCkgewotCQkJLy8gWFhYOiBydW5zIG9uIGZvbGRlcnMgYXMgd2VsbD8hCi0JCQlsaWJyYXJ5UmVjb3JkID0gY3JlYXRlSkFSUmVjb3JkKGxpYnJhcnlMb2NhdGlvbik7Ci0JCQlzeW5jaHJvbml6ZWQgKGxpYnJhcnlSZWNvcmQpIHsKLQkJCQlpZiAobGlicmFyeVJlY29yZC5pc0NvbnNpc3RlbnQpIHsKLQkJCQkJLy8gTGlicmFyeSBsb2FkZWQgYnkgYW5vdGhlciBQcm9qZWN0IERlc2NyaXB0aW9uLCBpbml0aWFsaXplIG91ciByZWZlcmVuY2VzIGZyb20gdGhlIGV4aXN0aW5nCi0JCQkJCWZDbGFzc3BhdGhKYXJzLnB1dChsaWJyYXJ5TG9jYXRpb24sIGxpYnJhcnlSZWNvcmQpOwotCQkJCQlJdGVyYXRvciByZWNvcmRzID0gbGlicmFyeVJlY29yZC51cmxSZWNvcmRzLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChyZWNvcmRzLmhhc05leHQoKSkgewotCQkJCQkJVVJMUmVjb3JkIHJlY29yZCA9IChVUkxSZWNvcmQpcmVjb3Jkcy5uZXh0KCk7Ci0JCQkJCQlpbnQgdXJsRGVsdGFLaW5kID0gSVRhZ2xpYkluZGV4RGVsdGEuQURERUQ7Ci0JCQkJCQlpZiAoZkNsYXNzcGF0aFJlZmVyZW5jZXMuY29udGFpbnNLZXkocmVjb3JkLmdldFVSSSgpKSkgewotCQkJCQkJCXVybERlbHRhS2luZCA9IElUYWdsaWJJbmRleERlbHRhLkNIQU5HRUQ7Ci0JCQkJCQl9Ci0JCQkJCQlmQ2xhc3NwYXRoUmVmZXJlbmNlcy5wdXQocmVjb3JkLmdldFVSSSgpLCByZWNvcmQpOwotCQkJCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCB1cmxEZWx0YUtpbmQpKTsKLQkJCQkJCWZDbGFzc3BhdGhSZWZlcmVuY2VzLnB1dChyZWNvcmQuaW5mby51cmksIHJlY29yZCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlsaWJyYXJ5UmVjb3JkLmlzRXhwb3J0ZWQgPSBpc0V4cG9ydGVkOwotCQkJCWZDbGFzc3BhdGhKYXJzLnB1dChsaWJyYXJ5TG9jYXRpb24sIGxpYnJhcnlSZWNvcmQpOwotCQotCQkJCVppcEZpbGUgamFyZmlsZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJamFyZmlsZSA9IG5ldyBaaXBGaWxlKGxpYnJhcnlMb2NhdGlvbik7Ci0JCQkJCUVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXJmaWxlLmVudHJpZXMoKTsKLQkJCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJCVppcEVudHJ5IHogPSAoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCQkJCWlmICghei5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQkJaWYgKGlzVExEKHouZ2V0TmFtZSgpKSkgewotCQkJCQkJCQlpZiAoei5nZXROYW1lKCkuZXF1YWxzKEphclV0aWxpdGllcy5KU1AxMV9UQUdMSUIpKSB7Ci0JCQkJCQkJCQlsaWJyYXJ5UmVjb3JkLmhhczExVExEID0gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IGdldENhY2hlZElucHV0U3RyZWFtKGphcmZpbGUsIHopOwotCQkJCQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQkJCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8obGlicmFyeUxvY2F0aW9uLCBjb250ZW50cyk7Ci0JCi0JCQkJCQkJCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8udXJpICE9IG51bGwgJiYgaW5mby51cmkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCQkJVVJMUmVjb3JkIHVybFJlY29yZCA9IG5ldyBVUkxSZWNvcmQoKTsKLQkJCQkJCQkJCQl1cmxSZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJCQkJCQkJdXJsUmVjb3JkLmJhc2VMb2NhdGlvbiA9IGxpYnJhcnlMb2NhdGlvbjsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQl1cmxSZWNvcmQuaXNFeHBvcnRlZCA9IGlzRXhwb3J0ZWQ7Ci0JCQkJCQkJCQkJCXVybFJlY29yZC51cmwgPSBuZXcgVVJMKCJqYXI6ZmlsZToiICsgbGlicmFyeUxvY2F0aW9uICsgIiEvIiArIHouZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCWxpYnJhcnlSZWNvcmQudXJsUmVjb3Jkcy5hZGQodXJsUmVjb3JkKTsKLQkJCQkJCQkJCQkJaW50IHVybERlbHRhS2luZCA9IElUYWdsaWJJbmRleERlbHRhLkFEREVEOwotCQkJCQkJCQkJCQlpZiAoZkNsYXNzcGF0aFJlZmVyZW5jZXMuY29udGFpbnNLZXkodXJsUmVjb3JkLmdldFVSSSgpKSkgewotCQkJCQkJCQkJCQkJLy8gVE9ETzogbm90IG1pbmltaXplZCBlbm91Z2gKLQkJCQkJCQkJCQkJCXVybERlbHRhS2luZCA9IElUYWdsaWJJbmRleERlbHRhLkNIQU5HRUQ7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMucHV0KHVybFJlY29yZC5nZXRVUkkoKSwgdXJsUmVjb3JkKTsKLQkJCQkJCQkJCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgdXJsUmVjb3JkLCB1cmxEZWx0YUtpbmQpKTsKLQkJCQkJCQkJCQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMucHV0KGluZm8udXJpLCB1cmxSZWNvcmQpOwotCQkJCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGVkIHJlY29yZCBmb3IgIiArIHVybFJlY29yZC5nZXRVUkkoKSArICJAIiArIHVybFJlY29yZC5nZXRVUkwoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJLy8gZG9uJ3QgcmVjb3JkIHRoaXMgVVJJCi0JCQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgbnVsbCwgZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKFppcEV4Y2VwdGlvbiB6RXhjKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJUYWdsaWIgSW5kZXggWmlwRXhjZXB0aW9uOiAiICsgbGlicmFyeUxvY2F0aW9uICsgIiAiICsgekV4Yy5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJUYWdsaWIgSW5kZXggSU9FeGNlcHRpb246ICIgKyBsaWJyYXJ5TG9jYXRpb24gKyAiICIgKyBpb0V4Yy5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWNsb3NlSmFyRmlsZShqYXJmaWxlKTsKLQkJCQl9Ci0JCQkJbGlicmFyeVJlY29yZC5pc0NvbnNpc3RlbnQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChsaWJyYXJ5UmVjb3JkICE9IG51bGwpIHsKLQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIGxpYnJhcnlSZWNvcmQsIGRlbHRhS2luZCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVExEKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZmluYWwgaW50IGxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7Ci0KLQkJaWYgKGxlbmd0aCA8IDQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChuYW1lLmNoYXJBdChsZW5ndGggLSA0KSAhPSAnLicpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IGxlbmd0aCAtIDMsIGogPSAwOyBpIDwgbGVuZ3RoOyBpKyssIGorKykgewotCQkJZmluYWwgY2hhciBjID0gbmFtZS5jaGFyQXQoaSk7Ci0JCQlpZiAoYyAhPSBUTERbMipqXSAmJiBjICE9IFRMRFsyKmogKyAxXSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0Jdm9pZCB1cGRhdGVKQVIoSVJlc291cmNlIGphciwgaW50IGRlbHRhS2luZCkgewotCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGluZyByZWNvcmRzIGZvciBKQVIgIiArIGphci5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBqYXJMb2NhdGlvblN0cmluZyA9IG51bGw7Ci0JCWlmIChqYXIuZ2V0TG9jYXRpb24oKSAhPSBudWxsKQotCQkJamFyTG9jYXRpb25TdHJpbmcgPSBqYXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQllbHNlCi0JCQlqYXJMb2NhdGlvblN0cmluZyA9IGphci5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0JCUphclJlY29yZCBqYXJSZWNvcmQgPSBjcmVhdGVKQVJSZWNvcmQoamFyKTsKLQkJZkpBUlJlZmVyZW5jZXMucHV0KGphci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGphclJlY29yZCk7Ci0JCVppcElucHV0U3RyZWFtIHppcCA9IGdldFppcElucHV0U3RyZWFtKGphcik7Ci0JCWlmKHppcCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVppcEVudHJ5IGVudHJ5OwotCQkJCXdoaWxlICgoZW50cnkgPSB6aXAuZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLQkJCQkJaWYgKGlzVExEKGVudHJ5LmdldE5hbWUoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGVudHJ5LmdldE5hbWUoKS5lcXVhbHMoSmFyVXRpbGl0aWVzLkpTUDExX1RBR0xJQikpIHsKLQkJCQkJCQlqYXJSZWNvcmQuaGFzMTFUTEQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBjb3B5WmlwRW50cnkoemlwKTsKLQkJCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8oamFyTG9jYXRpb25TdHJpbmcsIGNvbnRlbnRzKTsKLQkJCi0JCQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnVyaSAhPSBudWxsICYmIGluZm8udXJpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQlVUkxSZWNvcmQgcmVjb3JkID0gbmV3IFVSTFJlY29yZCgpOwotCQkJCQkJCQlyZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJCQkJCXJlY29yZC5iYXNlTG9jYXRpb24gPSBqYXJMb2NhdGlvblN0cmluZzsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXJlY29yZC51cmwgPSBuZXcgVVJMKCJqYXI6ZmlsZToiICsgamFyTG9jYXRpb25TdHJpbmcgKyAiIS8iICsgZW50cnkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQlqYXJSZWNvcmQudXJsUmVjb3Jkcy5hZGQocmVjb3JkKTsKLQkJCi0JCQkJCQkJCQlpbnQgdGFnbGliRGVsdGFLaW5kID0gSVRhZ2xpYkluZGV4RGVsdGEuQURERUQ7Ci0JCQkJCQkJCQlIYXNodGFibGUgdGFibGUgPSBnZXRJbXBsaWNpdFJlZmVyZW5jZXMoamFyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQlpZiAodGFibGUgIT0gbnVsbCAmJiB0YWJsZS5nZXQocmVjb3JkLmdldFVSSSgpKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJdGFnbGliRGVsdGFLaW5kID0gSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRDsKLQkJCQkJCQkJCX0KLQkJCi0JCQkJCQkJCQlnZXRJbXBsaWNpdFJlZmVyZW5jZXMoamFyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkucHV0KGluZm8udXJpLCByZWNvcmQpOwotCQkJCQkJCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCB0YWdsaWJEZWx0YUtpbmQpKTsKLQkJCQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGVkIHJlY29yZCBmb3IgIiArIHJlY29yZC5nZXRVUkkoKSArICJAIiArIHJlY29yZC5nZXRVUkwoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJLy8gZG9uJ3QgcmVjb3JkIHRoaXMgVVJJCi0JCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBudWxsLCBlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiY291bGQgbm90IHJlYWQgcmVzb3VyY2UgIiArIGphci5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyB9Ci0JCQlmaW5hbGx5IHsKLQkJCQljbG9zZUlucHV0U3RyZWFtKHppcCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGphclJlY29yZC5oYXMxMVRMRCkgewotCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgamFyUmVjb3JkLCBkZWx0YUtpbmQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gY29weVppcEVudHJ5KFppcElucHV0U3RyZWFtIHN0cmVhbSkgewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlJbnB1dFN0cmVhbSBjb3B5ID0gbnVsbDsKLQotCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKLQkJCWludCBjOwotCQkJLy8gYXJyYXkgZGltIHJlc3RyaWN0aW9uPwotCQkJYnl0ZSBieXRlc1tdID0gbmV3IGJ5dGVbMjA0OF07Ci0JCQl0cnkgewotCQkJCXdoaWxlICgoYyA9IHN0cmVhbS5yZWFkKGJ5dGVzKSkgPj0gMCkgewotCQkJCQlidWZmZXIud3JpdGUoYnl0ZXMsIDAsIGMpOwotCQkJCX0KLQkJCQljb3B5ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlci50b0J5dGVBcnJheSgpKTsKLQkJCQljbG9zZVppcEVudHJ5KHN0cmVhbSk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJLy8gbm8gY2xlYW51cCBjYW4gYmUgZG9uZQotCQkJfQotCQl9Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXByaXZhdGUgWmlwSW5wdXRTdHJlYW0gZ2V0WmlwSW5wdXRTdHJlYW0oSVJlc291cmNlIGphcikgewotCQlpZiAoamFyID09IG51bGwgfHwgamFyLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSB8fCAhamFyLmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIHppcFN0cmVhbSA9ICgoSUZpbGUpIGphcikuZ2V0Q29udGVudHMoKTsKLQkJCXJldHVybiBuZXcgWmlwSW5wdXRTdHJlYW0oemlwU3RyZWFtKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7IH0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsb3NlSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0JCWlmIChzdHJlYW0gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgfQotCQl9Ci0JCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xvc2VaaXBFbnRyeShaaXBJbnB1dFN0cmVhbSB6aXMpIHsKLQkJaWYgKHppcyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXppcy5jbG9zZUVudHJ5KCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciIpOwotCQkJfQotCQl9Ci0JCQkKLQl9Ci0KLQl2b2lkIHVwZGF0ZVRhZyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kKSB7Ci0JCVRhZ0RpclJlY29yZCByZWNvcmQgPSAoVGFnRGlyUmVjb3JkKSBmVGFnRGlyUmVmZXJlbmNlcy5nZXQocmVzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQlyZWNvcmQgPSBjcmVhdGVUYWdkaXJSZWNvcmQoKElGb2xkZXIpIHJlc291cmNlLmdldFBhcmVudCgpKTsKLQkJCWZUYWdEaXJSZWZlcmVuY2VzLnB1dChyZXNvdXJjZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHJlY29yZCk7Ci0JCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCByZWNvcmQsIElUYWdsaWJJbmRleERlbHRhLkFEREVEKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoIXJlY29yZC50YWdzLmNvbnRhaW5zKHJlc291cmNlLmdldE5hbWUoKSkpIHsKLQkJCQlyZWNvcmQudGFncy5hZGQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIHJlY29yZCwgSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRCkpOwotCQl9Ci0JfQotCi0Jdm9pZCB1cGRhdGVUYWdEaXIoSVJlc291cmNlIHRhZ2RpclJlc291cmNlLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCS8qKgotCQkgKiA4LjQuMTogdGFnIGZpbGVzIGFyZSBsb29zZSBmaWxlcyB1bmRlciAvV0VCLUlORi90YWdzCi0JCSAqLwotCQlpZiAoKHRhZ2RpclJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpICE9IDApIHsKLQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGluZyByZWNvcmQgZm9yIGRpcmVjdG9yeSAiICsgdGFnZGlyUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVRhZ0RpclJlY29yZCByZWNvcmQgPSAoVGFnRGlyUmVjb3JkKSBmVGFnRGlyUmVmZXJlbmNlcy5nZXQodGFnZGlyUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCWlmIChyZWNvcmQgPT0gbnVsbCkgewotCQkJCXJlY29yZCA9IGNyZWF0ZVRhZ2RpclJlY29yZCgoSUZvbGRlcikgdGFnZGlyUmVzb3VyY2UpOwotCQkJCWZUYWdEaXJSZWZlcmVuY2VzLnB1dCh0YWdkaXJSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHJlY29yZCk7Ci0JCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCBkZWx0YUtpbmQpKTsKLQkJCX0KLQkJCWVsc2UgewotCi0JCQl9Ci0JCX0KLQkJLyoqCi0JCSAqIDguNC4xOiB0YWcgZmlsZXMgY2FuIGFsc28gYmUgcGFja2FnZWQgaW4gdGhlIC9NRVRBLUlORi90YWdzIGZvbGRlcgotCQkgKiBvZiBhIGphciBpbiAvV0VCLUlORi9saWIvICg4LjQuMjogYnV0IG11c3QgYmUgbWVudGlvbmVkIGluIGEgLnRsZCkKLQkJICovCi0JCWVsc2UgewotCQkJLy8gdGhlc2UgdGFncyBhcmUgbWVyZWx5IHN1cmZhY2VkIHdoZW4gdGhlIFRMRCBpcyBtb2RlbGxlZAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHRsZAotCSAqIEBwYXJhbSBkZWx0YUtpbmQKLQkgKi8KLQl2b2lkIHVwZGF0ZVRMRChJUmVzb3VyY2UgdGxkLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImNyZWF0aW5nIHJlY29yZCBmb3IgIiArIHRsZC5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQlUTERSZWNvcmQgcmVjb3JkID0gY3JlYXRlVExEUmVjb3JkKHRsZCk7Ci0JCWZUTERSZWZlcmVuY2VzLnB1dCh0bGQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCByZWNvcmQpOwotCQlpZiAocmVjb3JkLmdldFVSSSgpICE9IG51bGwgJiYgcmVjb3JkLmdldFVSSSgpLmxlbmd0aCgpID4gMCkgewotCQkJZ2V0SW1wbGljaXRSZWZlcmVuY2VzKHRsZC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLnB1dChyZWNvcmQuZ2V0VVJJKCksIHJlY29yZCk7Ci0JCX0KLQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCBkZWx0YUtpbmQpKTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZVdlYlhNTChJUmVzb3VyY2Ugd2VieG1sLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCWlmICh3ZWJ4bWwuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuOwotCQlJbnB1dFN0cmVhbSB3ZWJ4bWxDb250ZW50cyA9IG51bGw7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXdlYnhtbENvbnRlbnRzID0gKChJRmlsZSkgd2VieG1sKS5nZXRDb250ZW50cyhmYWxzZSk7Ci0JCQlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCXByb3ZpZGVyLnNldElucHV0U3RyZWFtKHdlYnhtbENvbnRlbnRzKTsKLQkJCXByb3ZpZGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQkJcHJvdmlkZXIuc2V0Um9vdEVsZW1lbnROYW1lKCJ3ZWItYXBwIik7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3ZpZGVyLnNldEJhc2VSZWZlcmVuY2Uod2VieG1sLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQlkb2N1bWVudCA9IHByb3ZpZGVyLmdldERvY3VtZW50KGZhbHNlKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgRU1QVFlfU1RSSU5HLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHdlYnhtbENvbnRlbnRzICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJd2VieG1sQ29udGVudHMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgbnVsbCwgZTEpOwotCQkJCX0KLQkJfQotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRpbmcgcmVjb3JkcyBmb3IgIiArIHdlYnhtbC5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVdlYlhNTFJlY29yZCB3ZWJ4bWxSZWNvcmQgPSBuZXcgV2ViWE1MUmVjb3JkKCk7Ci0JCXdlYnhtbFJlY29yZC5wYXRoID0gd2VieG1sLmdldEZ1bGxQYXRoKCk7Ci0JCWZXZWJYTUxSZWZlcmVuY2VzLnB1dCh3ZWJ4bWxSZWNvcmQuZ2V0V2ViWE1MKCkudG9TdHJpbmcoKSwgd2VieG1sUmVjb3JkKTsKLQkJTm9kZUxpc3QgdGFnbGlicyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDEyVExETmFtZXMuVEFHTElCKTsKLQkJZm9yIChpbnQgaVRhZ2xpYiA9IDA7IGlUYWdsaWIgPCB0YWdsaWJzLmdldExlbmd0aCgpOyBpVGFnbGliKyspIHsKLQkJCVN0cmluZyB0YWdsaWJVcmkgPSByZWFkVGV4dG9mQ2hpbGQodGFnbGlicy5pdGVtKGlUYWdsaWIpLCAidGFnbGliLXVyaSIpLnRyaW0oKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gc3BlY2lmaWVkIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHJvb3Qgb2YgdGhlIHdlYi1hcHAKLQkJCVN0cmluZyB0YWdsaWJMb2NhdGlvbiA9IHJlYWRUZXh0b2ZDaGlsZCh0YWdsaWJzLml0ZW0oaVRhZ2xpYiksICJ0YWdsaWItbG9jYXRpb24iKS50cmltKCk7IC8vJE5PTi1OTFMtMSQKLQkJCUlQYXRoIHBhdGggPSBudWxsOwotCQkJaWYgKHRhZ2xpYkxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShuZXcgUGF0aCh3ZWJ4bWwuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSwgdGFnbGliTG9jYXRpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGF0aCA9IG5ldyBQYXRoKFVSSUhlbHBlci5ub3JtYWxpemUodGFnbGliTG9jYXRpb24sIHdlYnhtbC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGdldExvY2FsUm9vdCh3ZWJ4bWwuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSkpOwotCQkJfQotCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJSUZpbGUgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQkJaWYgKHJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gbnVsbDsKLQkJCQkJLyoKLQkJCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTk2MAotCQkJCQkgKiAKLQkJCQkJICogQWxzbyBzdXBwb3J0IG1hcHBpbmdzIHRvIC5qYXIgZmlsZXMKLQkJCQkJICovCi0JCQkJCWlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSmFyUmVjb3JkIGphclJlY29yZCA9IGNyZWF0ZUpBUlJlY29yZChyZXNvdXJjZSk7Ci0JCQkJCQlTdHJpbmdbXSBlbnRyaWVzID0gSmFyVXRpbGl0aWVzLmdldEVudHJ5TmFtZXMocmVzb3VyY2UpOwotCQkJCQkJZm9yIChpbnQgakVudHJ5ID0gMDsgakVudHJ5IDwgZW50cmllcy5sZW5ndGg7IGpFbnRyeSsrKSB7Ci0JCQkJCQkJaWYgKGVudHJpZXNbakVudHJ5XS5lbmRzV2l0aCgiLnRsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaWYgKGVudHJpZXNbakVudHJ5XS5lcXVhbHMoSmFyVXRpbGl0aWVzLkpTUDExX1RBR0xJQikpIHsKLQkJCQkJCQkJCWphclJlY29yZC5oYXMxMVRMRCA9IHRydWU7Ci0JCQkJCQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IEphclV0aWxpdGllcy5nZXRJbnB1dFN0cmVhbShyZXNvdXJjZSwgZW50cmllc1tqRW50cnldKTsKLQkJCQkJCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8ocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBjb250ZW50cyk7Ci0JCQkJCQkJCQkJamFyUmVjb3JkLmluZm8gPSBpbmZvOwotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBudWxsLCBlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZWNvcmQgPSBqYXJSZWNvcmQ7Ci0JCQkJCQkvLyB0aGUgc3RvcmVkIFVSSSBzaG91bGQgcmVmbGVjdCB0aGUgd2ViLnhtbCdzIHZhbHVlCi0JCQkJCQlpZiAoamFyUmVjb3JkLmluZm8gPT0gbnVsbCkgewotCQkJCQkJCWphclJlY29yZC5pbmZvID0gbmV3IFRhZ2xpYkluZm8oKTsKLQkJCQkJCX0KLQkJCQkJCWphclJlY29yZC5pbmZvLnVyaSA9IHRhZ2xpYlVyaTsKLQkJCQkJCWphclJlY29yZC5pc01hcHBlZEluV2ViWE1MID0gdHJ1ZTsKLQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGVkIHdlYi54bWwgcmVjb3JkIGZvciAiICsgdGFnbGliVXJpICsgIkAiICsgamFyUmVjb3JkLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVRMRFJlY29yZCB0bGRSZWNvcmQgPSBjcmVhdGVUTERSZWNvcmQocmVzb3VyY2UpOwotCQkJCQkJcmVjb3JkID0gdGxkUmVjb3JkOwotCQkJCQkJLy8gdGhlIHN0b3JlZCBVUkkgc2hvdWxkIHJlZmxlY3QgdGhlIHdlYi54bWwncyB2YWx1ZQotCQkJCQkJdGxkUmVjb3JkLmluZm8udXJpID0gdGFnbGliVXJpOwotCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImNyZWF0ZWQgd2ViLnhtbCByZWNvcmQgZm9yICIgKyB0YWdsaWJVcmkgKyAiQCIgKyB0bGRSZWNvcmQuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQkJCQl3ZWJ4bWxSZWNvcmQudGxkUmVjb3Jkcy5hZGQocmVjb3JkKTsKLQkJCQkJCWdldEltcGxpY2l0UmVmZXJlbmNlcyh3ZWJ4bWwuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5wdXQodGFnbGliVXJpLCByZWNvcmQpOwotCQkJCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCBkZWx0YUtpbmQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL1RhZ2xpYkluZGV4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9UYWdsaWJJbmRleC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWIyODBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL1RhZ2xpYkluZGV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdE1lbW9yeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudDsKLQotLyoqCi0gKiBBIG5vbi1leHRlbmRhYmxlIGluZGV4IG1hbmFnZXIgZm9yIHRhZ2xpYnMgc2ltaWxhciB0byB0aGUgcHJldmlvdXMgSjJFRQotICogSVRhZ2xpYlJlZ2lzdHJ5IGJ1dCBsYWNraW5nIGFueSB0aWVzIHRvIHByb2plY3QgbmF0dXJlcy4gRWFjaCByZWNvcmQKLSAqIHJldHVybmVkIGZyb20gdGhlIGluZGV4IHJlcHJlc2VudHMgYSBzaW5nbGUgdGFnIGxpYnJhcnkgZGVzY3JpcHRvci4KLSAqIAotICogSW5kZXhpbmcgaXMgb25seSBwZXJzaXN0ZWQgYmV0d2VlbiBzZXNzaW9ucyBmb3IgZW50cmllcyBvbiB0aGUgSmF2YSBCdWlsZAotICogUGF0aC4gTmV3IEFERCBldmVudHMgd2lsbCBiZSBzZW50IHRvIElUYWdsaWJJbmRleExpc3RlbmVycyBkdXJpbmcgZWFjaAotICogd29ya2JlbmNoIHNlc3Npb24gZm9yIGJvdGggY2FjaGVkIGFuZCBuZXdseSBmb3VuZCByZWNvcmRzLiBSRU1PVkUgZXZlbnRzCi0gKiBhcmUgbm90IGZpcmVkIG9uIHdvcmtiZW5jaCBzaHV0ZG93bi4gVGhlIHJlY29yZCdzIGNvbnRlbnRzIHNob3VsZCBiZQotICogZXhhbWluZWQgZm9yIGFueSBmdXJ0aGVyIGluZm9ybWF0aW9uLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYWdsaWJJbmRleCB7Ci0JY2xhc3MgQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7Ci0JCUxpc3QgcHJvamVjdHNJbmRleGVkID0gbmV3IEFycmF5TGlzdCgxKTsKLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoIWlzSW5kZXhBdmFpbGFibGUoKSkKLQkJCQlyZXR1cm47Ci0JCQl0cnkgewotCQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJCWlmIChfZGVidWdFdmVudHMpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IHJlc3BvbmRpbmcgdG86IiArIGV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlwcm9qZWN0c0luZGV4ZWQuY2xlYXIoKTsKLQkJCQllbGVtZW50Q2hhbmdlZChldmVudC5nZXREZWx0YSgpLCB0cnVlKTsKLQkJCQlmaXJlQ3VycmVudERlbHRhKGV2ZW50KTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCUxPQ0sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGVsZW1lbnRDaGFuZ2VkKElKYXZhRWxlbWVudERlbHRhIGRlbHRhLCBib29sZWFuIGZvcmNlVXBkYXRlKSB7Ci0JCQlpZiAoZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkKLQkJCQlyZXR1cm47Ci0KLQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZGVsdGEuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTCkgewotCQkJCUlKYXZhRWxlbWVudERlbHRhW10gY2hhbmdlZCA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZWQubGVuZ3RoOyBpKyspIHsKLQkJCQkJZWxlbWVudENoYW5nZWQoY2hhbmdlZFtpXSwgZm9yY2VVcGRhdGUpOwotCQkJCX0KLQkJCX0KLQkJCS8vIEhhbmRsZSBhbnkgY2hhbmdlcyBhdCB0aGUgcHJvamVjdCBsZXZlbAotCQkJZWxzZSBpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QpIHsKLQkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwKSB7Ci0JCQkJCUlKYXZhRWxlbWVudCBwcm9qID0gZWxlbWVudDsKLQkJCQkJaGFuZGxlQ2xhc3NwYXRoQ2hhbmdlKChJSmF2YVByb2plY3QpIHByb2osIGRlbHRhLCBmb3JjZVVwZGF0ZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJSmF2YUVsZW1lbnREZWx0YVtdIGRlbHRhcyA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQkJaWYgKGRlbHRhcy5sZW5ndGggPT0gMCkgewotCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEIHx8IChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DTE9TRUQpICE9IDApIHsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIElmIHRoZSBwcm9qZWN0IGlzIGJlaW5nIGRlbGV0ZWQgb3IgY2xvc2VkLCBqdXN0Ci0JCQkJCQkJICogcmVtb3ZlIHRoZSBkZXNjcmlwdGlvbgotCQkJCQkJCSAqLwotCQkJCQkJCUlKYXZhUHJvamVjdCBwcm9qID0gKElKYXZhUHJvamVjdCkgZWxlbWVudDsKLQkJCQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoUHJvamVjdERlc2NyaXB0aW9uKSBmUHJvamVjdERlc2NyaXB0aW9ucy5yZW1vdmUocHJvai5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKSB7Ci0JCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAicmVtb3ZpbmcgaW5kZXggb2YgIiArIGRlc2NyaXB0aW9uLmZQcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQkvLyByZW1vdmluZyB0aGUgaW5kZXggZmlsZSBlbnN1cmVzIHRoYXQgd2UKLQkJCQkJCQkJLy8gZG9uJ3QgZ2V0IHN0YWxlIGRhdGEgaWYgdGhlIHByb2plY3QgaXMKLQkJCQkJCQkJLy8gcmVvcGVuZWQKLQkJCQkJCQkJcmVtb3ZlSW5kZXhGaWxlKHByb2ouZ2V0UHJvamVjdCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLyoKLQkJCQkJICogKGVsc2UpIFdpdGhvdXQgdGhlIGNsYXNzcGF0aCBjaGFuZ2luZywgdGhlcmUncyBub3RoaW5nCi0JCQkJCSAqIGVsc2UgdG8gZG8KLQkJCQkJICovCi0JCQkJCWVsc2UgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQllbGVtZW50Q2hhbmdlZChkZWx0YXNbaV0sIGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8qCi0JCQkgKiBPdGhlciBtb2RpZmljYXRpb24gdG8gdGhlIGNsYXNzcGF0aCAoc3VjaCBhcyB3aXRoaW4gYSBjbGFzc3BhdGgKLQkJCSAqIGNvbnRhaW5lciBsaWtlICJXZWIgQXBwIExpYnJhcmllcyIpIGdvIHRvIHRoZSBkZXNjcmlwdGlvbgotCQkJICogaXRzZWxmCi0JCQkgKi8KLQkJCWVsc2UgaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgpICE9IDAgfHwgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFTU9WRURfRlJPTV9DTEFTU1BBVEgpICE9IDApIHsKLQkJCQlJSmF2YVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0ID0gZWxlbWVudC5nZXRKYXZhUHJvamVjdCgpOwotCQkJCWlmIChhZmZlY3RlZFByb2plY3QgIT0gbnVsbCkgewotCQkJCQkvKgotCQkJCQkgKiBJZiB0aGUgYWZmZWN0ZWQgcHJvamVjdCBoYXMgYW4gaW5kZXggb24tZGlzaywgaXQncwotCQkJCQkgKiBnb2luZyB0byBiZSBpbnZhbGlkLS13ZSBuZWVkIHRvIGNyZWF0ZS9sb2FkIHRoZQotCQkJCQkgKiBkZXNjcmlwdGlvbiBzbyBpdCB3aWxsIGJlIHVwIHRvIGRhdGUgW2xvYWRpbmcgbm93IGFuZAotCQkJCQkgKiB1cGRhdGluZyBpcyB1c3VhbGx5IGZhc3RlciB0aGFuIHJlZ2VuZXJhdGluZyB0aGUgZW50aXJlCi0JCQkJCSAqIGluZGV4XS4gSWYgdGhlcmUgaXMgbm8gaW5kZXggb24gZGlzaywgZG8gbm90aGluZyBtb3JlLgotCQkJCQkgKi8KLQkJCQkJRmlsZSBpbmRleEZpbGUgPSBuZXcgRmlsZShjb21wdXRlSW5kZXhMb2NhdGlvbihhZmZlY3RlZFByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQkJaWYgKGluZGV4RmlsZS5leGlzdHMoKSkgewotCQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGFmZmVjdGVkRGVzY3JpcHRpb24gPSBjcmVhdGVEZXNjcmlwdGlvbihhZmZlY3RlZFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCWlmIChhZmZlY3RlZERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCQlhZmZlY3RlZERlc2NyaXB0aW9uLmhhbmRsZUVsZW1lbnRDaGFuZ2VkKGRlbHRhKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlwcm9qZWN0c0luZGV4ZWQuYWRkKGFmZmVjdGVkUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVDbGFzc3BhdGhDaGFuZ2UoSUphdmFQcm9qZWN0IHByb2plY3QsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhLCBib29sZWFuIGZvcmNlVXBkYXRlKSB7Ci0JCQlpZiAoZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkKLQkJCQlyZXR1cm47Ci0KLQkJCXRyeSB7Ci0JCQkJLyogSGFuZGxlIGxhcmdlIGNoYW5nZXMgdG8gdGhpcyBwcm9qZWN0J3MgYnVpbGQgcGF0aCAqLwotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHByb2plY3QuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCAmJiAhcHJvamVjdHNJbmRleGVkLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkvKgotCQkJCQkgKiBVc2UgZ2V0IGluc3RlYWQgb2YgY3JlYXRlIHNpbmNlIHRoZSBkb3duc3RyZWFtCi0JCQkJCSAqICh1cHN0cmVhbT8pIHByb2plY3Qgd2Fzbid0IGl0c2VsZiBtb2RpZmllZC4KLQkJCQkJICovCi0JCQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCQkJCWlmIChmb3JjZVVwZGF0ZSkgewotCQkJCQkJZGVzY3JpcHRpb24gPSBjcmVhdGVEZXNjcmlwdGlvbigoSVByb2plY3QpIHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWRlc2NyaXB0aW9uID0gZ2V0RGVzY3JpcHRpb24oKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgJiYgIWZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQkJCXByb2plY3RzSW5kZXhlZC5hZGQocmVzb3VyY2UpOwotCQkJCQkJZGVzY3JpcHRpb24ucXVldWVFbGVtZW50Q2hhbmdlZChkZWx0YSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoIWlzSW5kZXhBdmFpbGFibGUoKSkKLQkJCQlyZXR1cm47Ci0JCQl0cnkgewotCQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJCWlmIChfZGVidWdFdmVudHMpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IHJlc3BvbmRpbmcgdG86IiArIGV2ZW50ICsgIlxuIiArIGV2ZW50LmdldERlbHRhKCkpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgOgotCQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgOiB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIHBhaXIgZGVsdGFzIHdpdGggcHJvamVjdHMKLQkJCQkJCQlJUmVzb3VyY2VEZWx0YVtdIGRlbHRhcyA9IG5ldyBJUmVzb3VyY2VEZWx0YVtde2V2ZW50LmdldERlbHRhKCl9OwotCQkJCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBudWxsOwotCi0JCQkJCQkJaWYgKGRlbHRhcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCQkJCQkJCWlmIChkZWx0YXNbMF0gIT0gbnVsbCkgewotCQkJCQkJCQkJcmVzb3VyY2UgPSBkZWx0YXNbMF0uZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCXJlc291cmNlID0gZXZlbnQuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5ST09UKSB7Ci0JCQkJCQkJCQkJZGVsdGFzID0gZGVsdGFzWzBdLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQkJCQkJCQlwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtkZWx0YXMubGVuZ3RoXTsKLQkJCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJCQlpZiAoZGVsdGFzW2ldLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCQkJCQkJCQlwcm9qZWN0c1tpXSA9IChJUHJvamVjdCkgZGVsdGFzW2ldLmdldFJlc291cmNlKCk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQlwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFsxXTsKLQkJCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCQkJCQkJCXByb2plY3RzWzBdID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkJcHJvamVjdHNbMF0gPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikgewotCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJUYWdsaWJJbmRleCBub3RpY2VkICIgKyBwcm9qZWN0c1tpXS5nZXROYW1lKCkgKyAiIGlzIGFib3V0IHRvIGJlIGRlbGV0ZWQvY2xvc2VkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJfQotCQkJCQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgZlByb2plY3REZXNjcmlwdGlvbnMucmVtb3ZlKHByb2plY3RzW2ldKTsKLQkJCQkJCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pIHsKLQkJCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92aW5nIGluZGV4IG9mICIgKyBkZXNjcmlwdGlvbi5mUHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWRlc2NyaXB0aW9uLmNsZWFyKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXNvdXJjZSBkZWxldGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSA6IHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gcGFpciBkZWx0YXMgd2l0aCBwcm9qZWN0cwotCQkJCQkJCUlSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gbmV3IElSZXNvdXJjZURlbHRhW117ZXZlbnQuZ2V0RGVsdGEoKX07Ci0JCQkJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IG51bGw7Ci0KLQkJCQkJCQlpZiAoZGVsdGFzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCQkJCQkJaWYgKGRlbHRhc1swXSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlyZXNvdXJjZSA9IGRlbHRhc1swXS5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJcmVzb3VyY2UgPSBldmVudC5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlJPT1QpIHsKLQkJCQkJCQkJCQlkZWx0YXMgPSBkZWx0YXNbMF0uZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJCQkJCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0W2RlbHRhcy5sZW5ndGhdOwotCQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQkJCWlmIChkZWx0YXNbaV0uZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCQkJCQkJCXByb2plY3RzW2ldID0gKElQcm9qZWN0KSBkZWx0YXNbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0WzFdOwotCQkJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCQkJCQkJcHJvamVjdHNbMF0gPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQlwcm9qZWN0c1swXSA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJaWYgKGRlbHRhc1tpXSAhPSBudWxsICYmIGRlbHRhc1tpXS5nZXRLaW5kKCkgIT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCAmJiBwcm9qZWN0c1tpXS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJCQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBnZXREZXNjcmlwdGlvbihwcm9qZWN0c1tpXSk7Ci0JCQkJCQkJCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmICFmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJCQkJCQkJCQlkZWx0YXNbaV0uYWNjZXB0KGRlc2NyaXB0aW9uLmdldFZpc2l0b3IoKSk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJaWYgKCFwcm9qZWN0c1tpXS5pc0FjY2Vzc2libGUoKSB8fCAoZGVsdGFzW2ldICE9IG51bGwgJiYgZGVsdGFzW2ldLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSkgewotCQkJCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikgewotCQkJCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IG5vdGljZWQgIiArIHByb2plY3RzW2ldLmdldE5hbWUoKSArICIgd2FzIHJlbW92ZWQgb3IgaXMgbm8gbG9uZ2VyIGFjY2Vzc2libGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgZlByb2plY3REZXNjcmlwdGlvbnMucmVtb3ZlKHByb2plY3RzW2ldKTsKLQkJCQkJCQkJCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKSB7Ci0JCQkJCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92aW5nIGluZGV4IG9mICIgKyBkZXNjcmlwdGlvbi5mUHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQlkZXNjcmlwdGlvbi5jbGVhcigpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXNvdXJjZSBjaGFuZ2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZmlyZUN1cnJlbnREZWx0YShldmVudCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlMT0NLLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPkEge0BsaW5rIEFic3RyYWN0TWVtb3J5TGlzdGVuZXJ9IHRoYXQgY2xlYXJzIHRoZSB7QGxpbmsgUHJvamVjdERlc2NyaXB0aW9ufSBjYWNoZQotCSAqIHdoZW5ldmVyIHNwZWNpZmljIG1lbW9yeSBldmVudHMgYXJlIHJlY2VpdmVkLjwvcD4KLQkgKiAKLQkgKiA8cD5FdmVudHM6Ci0JICogPHVsPgotCSAqIDxsaT57QGxpbmsgQWJzdHJhY3RNZW1vcnlMaXN0ZW5lciNTRVZfU0VSSU9VU308L2xpPgotCSAqIDxsaT57QGxpbmsgQWJzdHJhY3RNZW1vcnlMaXN0ZW5lciNTRVZfQ1JJVElDQUx9PC9saT4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIE1lbW9yeUxpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RNZW1vcnlMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiA8cD5Db25zdHJ1Y3RvciBjYXVzZXMgdGhpcyBsaXN0ZW5lciB0byBsaXN0ZW4gZm9yIHNwZWNpZmljIG1lbW9yeSBldmVudHMuPC9wPgotCQkgKiA8cD5FdmVudHM6Ci0JCSAqIDx1bD4KLQkJICogPGxpPntAbGluayBBYnN0cmFjdE1lbW9yeUxpc3RlbmVyI1NFVl9TRVJJT1VTfTwvbGk+Ci0JCSAqIDxsaT57QGxpbmsgQWJzdHJhY3RNZW1vcnlMaXN0ZW5lciNTRVZfQ1JJVElDQUx9PC9saT4KLQkJICogPC91bD4KLQkJICogPC9wPgotCQkgKi8KLQkJTWVtb3J5TGlzdGVuZXIoKSB7Ci0JCQlzdXBlcihuZXcgU3RyaW5nW10geyBTRVZfU0VSSU9VUywgU0VWX0NSSVRJQ0FMIH0pOwotCQl9Ci0JCQotCQkvKioKLQkJICogT24gYW55IG1lbW9yeSBldmVudCB3ZSBoYW5kbGUgY2xlYXIgb3V0IHRoZSBwcm9qZWN0IGRlc2NyaXB0aW9ucwotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdE1lbW9yeUxpc3RlbmVyI2hhbmRsZU1lbW9yeUV2ZW50KG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVNZW1vcnlFdmVudChFdmVudCBldmVudCkgewotCQkJY2xlYXJQcm9qZWN0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJCi0JfQotCQotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z0NoYW5nZUxpc3RlbmVyID0gZmFsc2U7Ci0KLQlzdGF0aWMgYm9vbGVhbiBfZGVidWdFdmVudHMgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3RhZ2xpYi9ldmVudHMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0Jc3RhdGljIGJvb2xlYW4gX2RlYnVnSW5kZXhDcmVhdGlvbiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4Y3JlYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnUmVzb2x1dGlvbiA9ICJ0cnVlIi5lcXVhbHMoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvcmVzb2x2ZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlzdGF0aWMgVGFnbGliSW5kZXggX2luc3RhbmNlID0gbmV3IFRhZ2xpYkluZGV4KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDUkMzMiBjaGVja3N1bUNhbGN1bGF0b3IgPSBuZXcgQ1JDMzIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTiA9ICJDTEVBTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJUlRZID0gIkRJUlRZIjsKLQlzdGF0aWMgYm9vbGVhbiBFTkFCTEVEID0gZmFsc2U7Ci0KLQlzdGF0aWMgZmluYWwgSUxvY2sgTE9DSyA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOwotCi0JLyoqCi0JICogTk9UIEFQSS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byBiZSBhZGRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUYWdsaWJJbmRleExpc3RlbmVyKElUYWdsaWJJbmRleExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChnZXRJbnN0YW5jZSgpLmlzSW5pdGlhbGl6ZWQoKSkKLQkJCWdldEluc3RhbmNlKCkuaW50ZXJuYWxBZGRUYWdsaWJJbmRleExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBmaXJlVGFnbGliRGVsdGEoSVRhZ2xpYkluZGV4RGVsdGEgZGVsdGEpIHsKLQkJaWYgKF9kZWJ1Z0V2ZW50cykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IGZpcmVkIGRlbHRhOiIgKyBkZWx0YSArICIgWyIgKyBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoICsgIl1cbiIgKyAoKFRhZ2xpYkluZGV4RGVsdGEpIGRlbHRhKS50cmlnZ2VyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8qCi0JCSAqIEZsdXNoIGFueSBzaGFyZWQgY2FjaGUgZW50cmllcywgdGhlIFRhZ2xpYkNvbnRyb2xsZXJzIHNob3VsZCBoYW5kbGUKLQkJICogdXBkYXRpbmcgdGhlaXIgZG9jdW1lbnRzIGFzIG5lZWRlZC4KLQkJICovCi0JCUlUYWdsaWJJbmRleERlbHRhW10gZGVsdGFzID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJSVRhZ2xpYlJlY29yZCB0YWdsaWJSZWNvcmQgPSBkZWx0YXNbaV0uZ2V0VGFnbGliUmVjb3JkKCk7Ci0JCQlpZiAodGFnbGliUmVjb3JkICE9IG51bGwpIHsKLQkJCQlPYmplY3QgdW5pcXVlSWRlbnRpZmllciA9IFRMRENNRG9jdW1lbnRNYW5hZ2VyLmdldFVuaXF1ZUlkZW50aWZpZXIodGFnbGliUmVjb3JkKTsKLQkJCQlpZiAodW5pcXVlSWRlbnRpZmllciAhPSBudWxsKSB7Ci0JCQkJCVRMRENNRG9jdW1lbnRNYW5hZ2VyLmdldFNoYXJlZERvY3VtZW50Q2FjaGUoKS5yZW1vdmUodW5pcXVlSWRlbnRpZmllcik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgImlkZW50aWZpZXIgZm9yICIgKyB0YWdsaWJSZWNvcmQgKyAiIHdhcyBudWxsIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN5bmNocm9uaXplZCAoVExEQ01Eb2N1bWVudE1hbmFnZXIuZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpKSB7Ci0JCQlJdGVyYXRvciB2YWx1ZXMgPSBUTERDTURvY3VtZW50TWFuYWdlci5nZXRTaGFyZWREb2N1bWVudENhY2hlKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlICh2YWx1ZXMuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG8gPSB2YWx1ZXMubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgUmVmZXJlbmNlKSB7Ci0JCQkJCXZhbHVlcy5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoX2luc3RhbmNlLmlzSW5pdGlhbGl6ZWQoKSkgewotCQkJSVRhZ2xpYkluZGV4TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBfaW5zdGFuY2UuZlRhZ2xpYkluZGV4TGlzdGVuZXJzOwotCQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsaXN0ZW5lcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWxpc3RlbmVyc1tqXS5pbmRleENoYW5nZWQoZGVsdGEpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBGaW5kcyBhbGwgb2YgdGhlIHZpc2libGUgSVRhZ2xpYlJlY29yZHMgZm9yIHRoZSBnaXZlbiBwYXRoIGluIHRoZQotCSAqIHdvcmtzcGFjZS4gVGFnbGliIG1hcHBpbmdzIGZyb20gd2ViLnhtbCBmaWxlcyBhcmUgb25seSB2aXNpYmxlIHRvIHBhdGhzCi0JICogd2l0aGluIHRoZSB3ZWIueG1sJ3MgY29ycmVzcG9uZGluZyB3ZWIgY29udGVudCBmb2xkZXIuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBhbG1vc3QgY2VydGFpbmx5IHJlcXVpcmUgYSB3b3Jrc3BhY2UgbG9jayB0byBjb21wbGV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZnVsbFBhdGggLQotCSAqICAgICAgICAgICAgYSBwYXRoIHdpdGhpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbGwgb2YgdGhlIHZpc2libGUgSVRhZ2xpYlJlY29yZHMgZnJvbSB0aGUgZ2l2ZW4gcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElUYWdsaWJSZWNvcmRbXSBnZXRBdmFpbGFibGVUYWdsaWJSZWNvcmRzKElQYXRoIGZ1bGxQYXRoKSB7Ci0JCWlmICghX2luc3RhbmNlLmlzSW5pdGlhbGl6ZWQoKSkgewotCQkJcmV0dXJuIG5ldyBJVGFnbGliUmVjb3JkWzBdOwotCQl9Ci0JCUlUYWdsaWJSZWNvcmRbXSByZWNvcmRzID0gbnVsbDsKLQkJaWYgKGdldEluc3RhbmNlKCkuaXNJbml0aWFsaXplZCgpKSB7Ci0JCQlyZWNvcmRzID0gZ2V0SW5zdGFuY2UoKS5pbnRlcm5hbEdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMoZnVsbFBhdGgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVjb3JkcyA9IG5ldyBJVGFnbGliUmVjb3JkWzBdOwotCQl9Ci0JCWdldEluc3RhbmNlKCkuZmlyZUN1cnJlbnREZWx0YSgiZW51bWVyYXRlOiAiICsgZnVsbFBhdGgpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZWNvcmRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElQYXRoIGNvbnNpZGVyZWQgdG8gYmUgdGhlIHdlYi1hcHAgcm9vdCBmb3IgdGhlIGdpdmVuIHBhdGguCi0JICogQWxsIHJlc29sdXRpb24gZnJvbSB0aGUgZ2l2ZW4gcGF0aCBiZWdpbm5pbmcgd2l0aCAnLycgd2lsbCBiZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBjb21wdXRlZCB3ZWItYXBwIHJvb3QuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSBpcyBub3QgY29ycmVjdCBpbiBmbGV4aWJsZSBwcm9qZWN0cwotCSAqIEBwYXJhbSBwYXRoIC0KLQkgKiAgICAgICAgICAgIGEgcGF0aCB1bmRlciB0aGUgd2ViLWFwcCByb290Ci0JICogQHJldHVybiB0aGUgSVBhdGggY29uc2lkZXJlZCB0byBiZSB0aGUgd2ViLWFwcCdzIHJvb3QgZm9yIHRoZSBnaXZlbgotCSAqICAgICAgICAgcGF0aCBvciBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q29udGV4dFJvb3QoSVBhdGggcGF0aCkgewotCQl0cnkgewotCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQlpZiAoZ2V0SW5zdGFuY2UoKS5pc0luaXRpYWxpemVkKCkpIHsKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5pbnRlcm5hbEdldENvbnRleHRSb290KHBhdGgpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUYWdsaWJJbmRleCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgQVBJLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlVGFnbGliSW5kZXhMaXN0ZW5lcihJVGFnbGliSW5kZXhMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoIWdldEluc3RhbmNlKCkuaXNJbml0aWFsaXplZCgpKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0SW5zdGFuY2UoKS5pc0luaXRpYWxpemVkKCkpCi0JCQlnZXRJbnN0YW5jZSgpLmludGVybmFsUmVtb3ZlVGFnbGliSW5kZXhMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYSBtYXRjaGluZyBJVGFnbGliUmVjb3JkIGdpdmVuIHRoZSByZWZlcmVuY2UuIFR5cGljYWxseSB0aGUKLQkgKiByZXN1bHQgd2lsbCBoYXZlIHRvIGJlIGNhc3QgdG8gYSBzdWJpbnRlcmZhY2Ugb2YgSVRhZ2xpYlJlY29yZC4gVGhpcwotCSAqIG1ldGhvZCB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgcmVxdWlyZSBhIHdvcmtzcGFjZSBsb2NrIHRvIGNvbXBsZXRlLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgLSB0aGUgd29ya3NwYWNlLXJlbGF0aXZlIHBhdGggZm9yIElSZXNvdXJjZXMsIGZ1bGwKLQkgKiAgICAgICAgICAgIGZpbGVzeXN0ZW0gcGF0aCBvdGhlcndpc2UKLQkgKiBAcGFyYW0gcmVmZXJlbmNlCi0JICogICAgICAgICAgICAtIHRoZSBVUkkgdG8gbG9va3VwLCBmb3IgZXhhbXBsZSB0aGUgdXJpIHZhbHVlIGZyb20gYSB0YWdsaWIKLQkgKiAgICAgICAgICAgIGRpcmVjdGl2ZQotCSAqIEBwYXJhbSBjcm9zc1Byb2plY3RzCi0JICogICAgICAgICAgICAtIHdoZXRoZXIgdG8gc2VhcmNoIGFjcm9zcyBwcm9qZWN0cyAoY3VycmVudGx5IGlnbm9yZWQpCi0JICogCi0JICogQHJldHVybiBhIHZpc2libGUgSVRhZ2xpYlJlY29yZCBvciBudWxsIGlmIHRoZSByZWZlcmVuY2UgcG9pbnRzIHRvIG5vCi0JICogICAgICAgICBrbm93biB0YWcgbGlicmFyeSBkZXNjcmlwdG9yCi0JICogCi0JICogQFNlZSBJVGFnbGliUmVjb3JkCi0JICovCi0JcHVibGljIHN0YXRpYyBJVGFnbGliUmVjb3JkIHJlc29sdmUoU3RyaW5nIGJhc2VQYXRoLCBTdHJpbmcgcmVmZXJlbmNlLCBib29sZWFuIGNyb3NzUHJvamVjdHMpIHsKLQkJSVRhZ2xpYlJlY29yZCByZXN1bHQgPSBudWxsOwotCQlpZiAoZ2V0SW5zdGFuY2UoKS5pc0luaXRpYWxpemVkKCkpIHsKLQkJCXJlc3VsdCA9IGdldEluc3RhbmNlKCkuaW50ZXJuYWxSZXNvbHZlKGJhc2VQYXRoLCByZWZlcmVuY2UsIGNyb3NzUHJvamVjdHMpOwotCQl9Ci0JCWdldEluc3RhbmNlKCkuZmlyZUN1cnJlbnREZWx0YSgicmVzb2x2ZTogIiArIHJlZmVyZW5jZSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKF9kZWJ1Z1Jlc29sdXRpb24pIHsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJUYWdsaWJJbmRleCBjb3VsZCBub3QgcmVzb2x2ZSBcIiIgKyByZWZlcmVuY2UgKyAiXCIgZnJvbSAiICsgYmFzZVBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN3aXRjaCAocmVzdWx0LmdldFJlY29yZFR5cGUoKSkgewotCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJCQlJVExEUmVjb3JkIHJlY29yZCA9IChJVExEUmVjb3JkKSByZXN1bHQ7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiVGFnbGliSW5kZXggcmVzb2x2ZWQgIiArIGJhc2VQYXRoICsgIjoiICsgcmVmZXJlbmNlICsgIiA9ICIgKyByZWNvcmQuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuSkFSKSA6IHsKLQkJCQkJCUlKYXJSZWNvcmQgcmVjb3JkID0gKElKYXJSZWNvcmQpIHJlc3VsdDsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJUYWdsaWJJbmRleCByZXNvbHZlZCAiICsgYmFzZVBhdGggKyAiOiIgKyByZWZlcmVuY2UgKyAiID0gIiArIHJlY29yZC5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVEFHRElSKSA6IHsKLQkJCQkJCUlUYWdEaXJSZWNvcmQgcmVjb3JkID0gKElUYWdEaXJSZWNvcmQpIHJlc3VsdDsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJUYWdsaWJJbmRleCByZXNvbHZlZCAiICsgYmFzZVBhdGggKyAiOiIgKyByZWZlcmVuY2UgKyAiID0gIiArIHJlY29yZC5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5VUkwpIDogewotCQkJCQkJSVVSTFJlY29yZCByZWNvcmQgPSAoSVVSTFJlY29yZCkgcmVzdWx0OwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IHJlc29sdmVkICIgKyBiYXNlUGF0aCArICI6IiArIHJlZmVyZW5jZSArICIgPSAiICsgcmVjb3JkLmdldFVSTCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSW5zdHJ1Y3RzIHRoZSBpbmRleCB0byBzdG9wIGxpc3RlbmluZyBmb3IgcmVzb3VyY2UgYW5kIGNsYXNzcGF0aAotCSAqIGNoYW5nZXMsIGFuZCB0byBmb3JnZXQgYWxsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3b3Jrc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotCQl0cnkgewotCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQlpZiAoZ2V0SW5zdGFuY2UoKS5pc0luaXRpYWxpemVkKCkpIHsKLQkJCQlnZXRJbnN0YW5jZSgpLnN0b3AoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCUxPQ0sucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zdHJ1Y3RzIHRoZSBpbmRleCB0byBiZWdpbiBsaXN0ZW5pbmcgZm9yIHJlc291cmNlIGFuZCBjbGFzc3BhdGgKLQkgKiBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlib29sZWFuIHNodXR0aW5nRG93biA9ICFQbGF0Zm9ybS5pc1J1bm5pbmcoKSB8fCBQbGF0Zm9ybS5nZXRCdW5kbGUoT1NHSV9GUkFNRVdPUktfSUQpLmdldFN0YXRlKCkgPT0gQnVuZGxlLlNUT1BQSU5HOwotCQlpZiAoIXNodXR0aW5nRG93bikgewotCQkJdHJ5IHsKLQkJCQlMT0NLLmFjcXVpcmUoKTsKLQkJCQlFTkFCTEVEID0gISJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoVGFnbGliSW5kZXguY2xhc3MuZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRJbnN0YW5jZSgpLmluaXRpYWxpemVJbnN0YW5jZSgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENsYXNzcGF0aENoYW5nZUxpc3RlbmVyIGZDbGFzc3BhdGhDaGFuZ2VMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcml2YXRlIFRhZ2xpYkluZGV4RGVsdGEgZkN1cnJlbnRUb3BMZXZlbERlbHRhID0gbnVsbDsKLQotCU1hcCBmUHJvamVjdERlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwcml2YXRlIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgZlJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIElUYWdsaWJJbmRleExpc3RlbmVyW10gZlRhZ2xpYkluZGV4TGlzdGVuZXJzID0gbnVsbDsKLQkKLQkvKioKLQkgKiBVc2VkIHRvIGtlZXAgdGhlIHtAbGluayBQcm9qZWN0RGVzY3JpcHRpb259IGNhY2hlIGNsZWFuIHdoZW4gbWVtb3J5IGlzIGxvdwotCSAqLwotCXByaXZhdGUgTWVtb3J5TGlzdGVuZXIgZk1lbW9yeUxpc3RlbmVyOwotCi0JLyoqIHN5bWJvbGljIG5hbWUgZm9yIE9TR0kgZnJhbWV3b3JrICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE9TR0lfRlJBTUVXT1JLX0lEID0gIm9yZy5lY2xpcHNlLm9zZ2kiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRhZ2xpYkluZGV4KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplSW5zdGFuY2UoKSB7Ci0KLQkJaWYgKGlzSW5pdGlhbGl6ZWQoKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJLyoKLQkJCSAqIGNoZWNrIGFnYWluLCBqdXN0IGluY2FzZSBpdCB3YXMgaW5pdGlhbGl6ZWQgb24gYW5vdGhlciB0aHJlYWQsCi0JCQkgKiB3aGlsZSB3ZSB3ZXJlIHdhaXRpbmcgZm9yIHRoZSBsb2NrCi0JCQkgKi8KLQkJCWlmICghaXNJbml0aWFsaXplZCgpKSB7Ci0JCQkJZ2V0V29ya2luZ0xvY2F0aW9uKCk7Ci0JCQkJLyoKLQkJCQkgKiBPbmx5IGNvbnNpZGVyIGEgY3Jhc2ggaWYgYSB2YWx1ZSBleGlzdHMgYW5kIGlzIERJUlRZIChub3QgYQotCQkJCSAqIG5ldyB3b3Jrc3BhY2UpCi0JCQkJICovCi0JCQkJaWYgKERJUlRZLmVxdWFsc0lnbm9yZUNhc2UoZ2V0U3RhdGUoKSkpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJBIHdvcmtzcGFjZSBjcmFzaCB3YXMgZGV0ZWN0ZWQuIFRoZSBwcmV2aW91cyBzZXNzaW9uIGRpZCBub3QgZXhpdCBub3JtYWxseS4gTm90IHVzaW5nIHNhdmVkIHRhZ2xpYiBpbmRleGVzLiIpOyAvLyROT04tTkxTLTMkCi0JCQkJCXJlbW92ZUluZGV4ZXMoZmFsc2UpOwotCQkJCX0KLQotCQkJCWZQcm9qZWN0RGVzY3JpcHRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJCWZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJCQlmQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIgPSBuZXcgQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIoKTsKLQkJCQlmTWVtb3J5TGlzdGVuZXIgPSBuZXcgTWVtb3J5TGlzdGVuZXIoKTsKLQotCQkJCWlmIChFTkFCTEVEKSB7Ci0JCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCQkJCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkNsYXNzcGF0aENoYW5nZUxpc3RlbmVyKTsKLQkJCQkJLy9yZWdpc3RlciB0aGUgbWVtb3J5IGxpc3RlbmVyCi0JCQkJCWZNZW1vcnlMaXN0ZW5lci5jb25uZWN0KCk7Ci0JCQkJfQotCQkJCXNldEludGlhbGl6ZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlMT0NLLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGRlbHRhIGFzIGEgY2hpbGQgdG8gYW4gb3ZlcmFsbCBkZWx0YQotCSAqIAotCSAqIEBwYXJhbSBkZWx0YQotCSAqLwotCXN5bmNocm9uaXplZCB2b2lkIGFkZERlbHRhKElUYWdsaWJJbmRleERlbHRhIGRlbHRhKSB7Ci0JCWVuc3VyZURlbHRhKGRlbHRhLmdldFByb2plY3QoKSkuYWRkQ2hpbGREZWx0YShkZWx0YSk7Ci0JfQotCi0JLyoqCi0JICogQmFzZWQgb24gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkluZGV4TWFuYWdlcgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXJQYXRoCi0JICogQHJldHVybiB0aGUgaW5kZXggZmlsZSBsb2NhdGlvbiBmb3IgdGhlIGdpdmVuIHdvcmtzcGFjZSBwYXRoCi0JICovCi0JU3RyaW5nIGNvbXB1dGVJbmRleExvY2F0aW9uKElQYXRoIGNvbnRhaW5lclBhdGgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gY29tcHV0ZUluZGV4TmFtZShjb250YWluZXJQYXRoKTsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiLT4gaW5kZXggbmFtZSBmb3IgIiArIGNvbnRhaW5lclBhdGggKyAiIGlzICIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmcgaW5kZXhMb2NhdGlvbiA9IGdldFRhZ2xpYkluZGV4U3RhdGVMb2NhdGlvbigpLmFwcGVuZChmaWxlTmFtZSkudG9PU1N0cmluZygpOwotCQlyZXR1cm4gaW5kZXhMb2NhdGlvbjsKLQl9Ci0KLQlTdHJpbmcgY29tcHV0ZUluZGV4TmFtZShJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0JCWNoZWNrc3VtQ2FsY3VsYXRvci5yZXNldCgpOwotCQljaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKGNvbnRhaW5lclBhdGgudG9PU1N0cmluZygpLmdldEJ5dGVzKCkpOwotCQkvLyB1c2UgIi5kYXQiIHNvIHdlJ3JlIG5vdCBjb25mdXNlZCB3aXRoIEpEVCBpbmRleGVzCi0JCVN0cmluZyBmaWxlTmFtZSA9IExvbmcudG9TdHJpbmcoY2hlY2tzdW1DYWxjdWxhdG9yLmdldFZhbHVlKCkpICsgIi5kYXQiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gdGhlIFByb2plY3REZXNjcmlwdGlvbiByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHByb2plY3QKLQkgKi8KLQlQcm9qZWN0RGVzY3JpcHRpb24gY3JlYXRlRGVzY3JpcHRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoZlByb2plY3REZXNjcmlwdGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlMT0NLLmFjcXVpcmUoKTsKLQkJCWRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgZlByb2plY3REZXNjcmlwdGlvbnMuZ2V0KHByb2plY3QpOwotCQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCQkvLyBPbmNlIHdlJ3ZlIHN0YXJ0ZWQgaW5kZXhpbmcsIHdlJ3JlIGRpcnR5IGFnYWluCi0JCQkJaWYgKGZQcm9qZWN0RGVzY3JpcHRpb25zLmlzRW1wdHkoKSkgewotCQkJCQlzZXRTdGF0ZShESVJUWSk7Ci0JCQkJfQotCQkJCWRlc2NyaXB0aW9uID0gbmV3IFByb2plY3REZXNjcmlwdGlvbihwcm9qZWN0LCBjb21wdXRlSW5kZXhMb2NhdGlvbihwcm9qZWN0LmdldEZ1bGxQYXRoKCkpKTsKLQkJCQlmUHJvamVjdERlc2NyaXB0aW9ucy5wdXQocHJvamVjdCwgZGVzY3JpcHRpb24pOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCBhIGRlbHRhIGV4aXN0cyBmb3IgaG9sZGluZyBpbmRleCBjaGFuZ2UgaW5mb3JtYXRpb24KLQkgKi8KLQlwcml2YXRlIFRhZ2xpYkluZGV4RGVsdGEgZW5zdXJlRGVsdGEoSVByb2plY3QgcHJvamVjdCkgewotCQkvKgotCQkgKiBUaGUgZmlyc3QgZGVsdGEgdG8gYmUgYWRkZWQgd2lsbCBkZXRlcm1pbmUgd2hpY2ggcHJvamVjdCB0aGUKLQkJICogdG9wLWxldmVsIGRlbHRhIHdpbGwgY29udGFpbi4KLQkJICovCi0JCWlmIChmQ3VycmVudFRvcExldmVsRGVsdGEgPT0gbnVsbCkgewotCQkJZkN1cnJlbnRUb3BMZXZlbERlbHRhID0gbmV3IFRhZ2xpYkluZGV4RGVsdGEocHJvamVjdCwgbnVsbCwgSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRCk7Ci0JCX0KLQkJcmV0dXJuIGZDdXJyZW50VG9wTGV2ZWxEZWx0YTsKLQl9Ci0KLQl2b2lkIGZpcmVDdXJyZW50RGVsdGEoT2JqZWN0IHRyaWdnZXIpIHsKLQkJaWYgKGZDdXJyZW50VG9wTGV2ZWxEZWx0YSAhPSBudWxsKSB7Ci0JCQlmQ3VycmVudFRvcExldmVsRGVsdGEudHJpZ2dlciA9IHRyaWdnZXI7Ci0JCQlJVGFnbGliSW5kZXhEZWx0YSBkZWx0YSA9IGZDdXJyZW50VG9wTGV2ZWxEZWx0YTsKLQkJCWZDdXJyZW50VG9wTGV2ZWxEZWx0YSA9IG51bGw7Ci0JCQlmaXJlVGFnbGliRGVsdGEoZGVsdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBjaGVjayB0byBzZWUgaWYgdGhlIE9TR0kgZnJhbWV3b3JrIGlzIHNodXR0aW5nIGRvd24uCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBTeXN0ZW0gQnVuZGxlIGlzIHN0b3BwZWQgKGllLiB0aGUgZnJhbWV3b3JrIGlzCi0JICogICAgICAgICBzaHV0dGluZyBkb3duKQotCSAqLwotCWJvb2xlYW4gZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSB7Ci0JCS8vIGluIHRoZSBGcmFtZXdvcmsgY2xhc3MgdGhlcmUncyBhIG5vdGU6Ci0JCS8vIHNldCB0aGUgc3RhdGUgb2YgdGhlIFN5c3RlbSBCdW5kbGUgdG8gU1RPUFBJTkcuCi0JCS8vIHRoaXMgbXVzdCBiZSBkb25lIGZpcnN0IGFjY29yZGluZyB0byBzZWN0aW9uIDQuMTkuMiBmcm9tIHRoZSBPU0dpCi0JCS8vIFIzIHNwZWMuCi0JCWJvb2xlYW4gc2h1dHRpbmdEb3duID0gIVBsYXRmb3JtLmlzUnVubmluZygpIHx8IFBsYXRmb3JtLmdldEJ1bmRsZShPU0dJX0ZSQU1FV09SS19JRCkuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuU1RPUFBJTkc7Ci0JCXJldHVybiBzaHV0dGluZ0Rvd247Ci0JfQotCi0JUHJvamVjdERlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbnVsbDsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQoKSkgewotCQkJZGVzY3JpcHRpb24gPSAoUHJvamVjdERlc2NyaXB0aW9uKSBmUHJvamVjdERlc2NyaXB0aW9ucy5nZXQocHJvamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0YXRlKCkgewotCQlTdHJpbmcgc3RhdGUgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhUYWdsaWJJbmRleC5jbGFzcy5nZXROYW1lKCkpOwotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRUYWdsaWJJbmRleFN0YXRlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKCJ0YWdsaWJpbmRleC8iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxBZGRUYWdsaWJJbmRleExpc3RlbmVyKElUYWdsaWJJbmRleExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRyeSB7Ci0JCQlMT0NLLmFjcXVpcmUoKTsKLQkJCWlmIChmVGFnbGliSW5kZXhMaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJCWZUYWdsaWJJbmRleExpc3RlbmVycyA9IG5ldyBJVGFnbGliSW5kZXhMaXN0ZW5lcltde2xpc3RlbmVyfTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUxpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZUYWdsaWJJbmRleExpc3RlbmVycykpOwotCQkJCWlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJCQl9Ci0JCQkJZlRhZ2xpYkluZGV4TGlzdGVuZXJzID0gKElUYWdsaWJJbmRleExpc3RlbmVyW10pIGxpc3RlbmVycy50b0FycmF5KG5ldyBJVGFnbGliSW5kZXhMaXN0ZW5lclswXSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlMT0NLLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVRhZ2xpYlJlY29yZFtdIGludGVybmFsR2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcyhJUGF0aCBwYXRoKSB7Ci0JCUlUYWdsaWJSZWNvcmRbXSByZWNvcmRzID0gbmV3IElUYWdsaWJSZWNvcmRbMF07Ci0JCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpOwotCQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBjcmVhdGVEZXNjcmlwdGlvbihwcm9qZWN0KTsKLQkJCQlMaXN0IGF2YWlsYWJsZVJlY29yZHMgPSBkZXNjcmlwdGlvbi5nZXRBdmFpbGFibGVUYWdsaWJSZWNvcmRzKHBhdGgpOwotCi0JCQkJLy8gSUNhdGFsb2cgY2F0YWxvZyA9Ci0JCQkJLy8gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJCQkvLyB3aGlsZSAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJLy8gSUNhdGFsb2dFbnRyeVtdIGVudHJpZXMgPSBjYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0JCQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKGVudHJpZXNbaV0uZ2V0VVJJKCkpOwotCQkJCS8vIH0KLQkJCQkvLyBJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBjYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotCQkJCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gSUNhdGFsb2dFbnRyeVtdIGVudHJpZXMyID0KLQkJCQkvLyBuZXh0Q2F0YWxvZ3NbaV0uZ2V0UmVmZXJlbmNlZENhdGFsb2coKS5nZXRDYXRhbG9nRW50cmllcygpOwotCQkJCS8vIGZvciAoaW50IGogPSAwOyBqIDwgZW50cmllczIubGVuZ3RoOyBqKyspIHsKLQkJCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oZW50cmllczJbal0uZ2V0VVJJKCkpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCi0JCQkJcmVjb3JkcyA9IChJVGFnbGliUmVjb3JkW10pIGF2YWlsYWJsZVJlY29yZHMudG9BcnJheShyZWNvcmRzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVjb3JkczsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGludGVybmFsR2V0Q29udGV4dFJvb3QoSVBhdGggcGF0aCkgewotCQlJRmlsZSBiYXNlUmVzb3VyY2UgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihwYXRoKTsKLQkJaWYgKGJhc2VSZXNvdXJjZSAhPSBudWxsICYmIGJhc2VSZXNvdXJjZS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBiYXNlUmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVEZXNjcmlwdGlvbihwcm9qZWN0KTsKLQkJCUlQYXRoIHJvb3RQYXRoID0gZGVzY3JpcHRpb24uZ2V0TG9jYWxSb290KGJhc2VSZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLQkJCXJldHVybiByb290UGF0aDsKLQkJfQotCQkvLyB0cnkgdG8gaGFuZGxlIG91dC1vZi13b3Jrc3BhY2UgcGF0aHMKLQkJSVBhdGggcm9vdCA9IHBhdGgubWFrZUFic29sdXRlKCk7Ci0JCXdoaWxlIChyb290LnNlZ21lbnRDb3VudCgpID4gMCAmJiAhcm9vdC5pc1Jvb3QoKSkKLQkJCXJvb3QgPSByb290LnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsUmVtb3ZlVGFnbGliSW5kZXhMaXN0ZW5lcihJVGFnbGliSW5kZXhMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0cnkgewotCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQlpZiAoZlRhZ2xpYkluZGV4TGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChmVGFnbGliSW5kZXhMaXN0ZW5lcnMpKTsKLQkJCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCQlmVGFnbGliSW5kZXhMaXN0ZW5lcnMgPSAoSVRhZ2xpYkluZGV4TGlzdGVuZXJbXSkgbGlzdGVuZXJzLnRvQXJyYXkobmV3IElUYWdsaWJJbmRleExpc3RlbmVyWzBdKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCUxPQ0sucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJVGFnbGliUmVjb3JkIGludGVybmFsUmVzb2x2ZShTdHJpbmcgYmFzZVBhdGgsIGZpbmFsIFN0cmluZyByZWZlcmVuY2UsIGJvb2xlYW4gY3Jvc3NQcm9qZWN0cykgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJSVRhZ2xpYlJlY29yZCByZXNvbHZlZCA9IG51bGw7Ci0KLQkJUGF0aCBiYXNlSVBhdGggPSBuZXcgUGF0aChiYXNlUGF0aCk7Ci0JCUlSZXNvdXJjZSBiYXNlUmVzb3VyY2UgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihiYXNlSVBhdGgpOwotCi0JCWlmIChiYXNlUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkvLyBUcnkgdGhlIGJhc2UgcGF0aCBhcyBhIGZvbGRlciBmaXJzdAotCQkJaWYgKGJhc2VJUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQliYXNlUmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldEZvbGRlcihiYXNlSVBhdGgpOwotCQkJfQotCQkJLy8gSWYgbm90IGEgZm9sZGVyLCB0aGVuIHRyeSBiYXNlIHBhdGggYXMgYSBmaWxlCi0JCQlpZiAoYmFzZVJlc291cmNlICE9IG51bGwgJiYgIWJhc2VSZXNvdXJjZS5leGlzdHMoKSAmJiBiYXNlSVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJYmFzZVJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKGJhc2VJUGF0aCk7Ci0JCQl9Ci0JCQlpZiAoYmFzZVJlc291cmNlID09IG51bGwgJiYgYmFzZUlQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpIHsKLQkJCQliYXNlUmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QoYmFzZUlQYXRoLnNlZ21lbnQoMCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGJhc2VSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkvKgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjUyOQotCQkJICogCi0JCQkgKiBUaGlzIG1ldGhvZCBwcm9kdWNlcyBhIGxlc3MgYWNjdXJhdGUgcmVzdWx0LCBidXQgZG9lc24ndAotCQkJICogcmVxdWlyZSB0aGF0IHRoZSBmaWxlIGV4aXN0IHlldC4KLQkJCSAqLwotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24oYmFzZUlQYXRoKTsKLQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKQotCQkJCWJhc2VSZXNvdXJjZSA9IGZpbGVzWzBdOwotCQl9Ci0JCWlmIChiYXNlUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChiYXNlSVBhdGguc2VnbWVudCgwKSk7Ci0JCQlpZiAocHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGNyZWF0ZURlc2NyaXB0aW9uKHByb2plY3QpOwotCQkJCXJlc29sdmVkID0gZGVzY3JpcHRpb24ucmVzb2x2ZShiYXNlUGF0aCwgcmVmZXJlbmNlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXNvbHZlZDsKLQl9Ci0KLQlib29sZWFuIGlzSW5kZXhBdmFpbGFibGUoKSB7Ci0JCXJldHVybiBfaW5zdGFuY2UuaXNJbml0aWFsaXplZCgpICYmIEVOQUJMRUQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBpbmRleCBmaWxlIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKi8KLQl2b2lkIHJlbW92ZUluZGV4RmlsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUZpbGUgaW5kZXhGaWxlID0gbmV3IEZpbGUoY29tcHV0ZUluZGV4TG9jYXRpb24ocHJvamVjdC5nZXRGdWxsUGF0aCgpKSk7Ci0JCWlmIChpbmRleEZpbGUuZXhpc3RzKCkpIHsKLQkJCWluZGV4RmlsZS5kZWxldGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgaW5kZXggZmlsZXMuIFVzZWQgZm9yIG1haW50ZW5hbmNlIGFuZCBrZWVwaW5nIHRoZSBpbmRleCBmb2xkZXIKLQkgKiBhIG1hbmFnZWFibGUgc2l6ZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhbGVPbmx5IC0KLQkgKiAgICAgICAgICAgIGlmIDxiPnRydWU8L2I+LCByZW1vdmVzIG9ubHkgdGhlIGluZGV4ZXMgZm9yIHByb2plY3RzIG5vdAotCSAqICAgICAgICAgICAgb3BlbiBpbiB0aGUgd29ya3NwYWNlLCBpZiA8Yj5mYWxzZTwvYj4sIHJlbW92ZXMgYWxsIG9mIHRoZQotCSAqICAgICAgICAgICAgaW5kZXhlcwotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVJbmRleGVzKGJvb2xlYW4gc3RhbGVPbmx5KSB7Ci0JCUZpbGUgZm9sZGVyID0gZ2V0V29ya2luZ0xvY2F0aW9uKCk7Ci0KLQkJLy8gcmVtb3ZlIGFueSBleHRyYW5lb3VzIGluZGV4IGZpbGVzCi0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCUxpc3QgaW5kZXhOYW1lcyA9IG5ldyBBcnJheUxpc3QocHJvamVjdHMubGVuZ3RoKTsKLQkJaWYgKHN0YWxlT25seSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChwcm9qZWN0c1tpXS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlpbmRleE5hbWVzLmFkZChjb21wdXRlSW5kZXhOYW1lKHByb2plY3RzW2ldLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZm9sZGVyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IGZvbGRlci5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBmaWxlcyAhPSBudWxsICYmIGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghaW5kZXhOYW1lcy5jb250YWlucyhmaWxlc1tpXS5nZXROYW1lKCkpKQotCQkJCQlmaWxlc1tpXS5kZWxldGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTdGF0ZShTdHJpbmcgc3RhdGUpIHsKLQkJaWYgKCFzdGF0ZS5lcXVhbHMoZ2V0U3RhdGUoKSkpIHsKLQkJCUpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoVGFnbGliSW5kZXguY2xhc3MuZ2V0TmFtZSgpLCBzdGF0ZSk7Ci0JCQlKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCgpKSB7Ci0JCQlzZXRJbnRpYWxpemVkKGZhbHNlKTsKLQotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcihmQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIpOwotCQkJLy91bnJlZ2lzdGVyIHRoZSBtZW1vcnkgbGlzdGVuZXIKLQkJCWZNZW1vcnlMaXN0ZW5lci5kaXNjb25uZWN0KCk7Ci0KLQkJCS8qCi0JCQkgKiBDbGVhcmluZyB0aGUgZXhpc3Rpbmcgc2F2ZWQgc3RhdGVzIGhlbHBzIHBydW5lIGRlYWQgZGF0YSBmcm9tCi0JCQkgKiB0aGUgaW5kZXggZm9sZGVyLgotCQkJICovCi0JCQlyZW1vdmVJbmRleGVzKHRydWUpOwotCi0JCQljbGVhclByb2plY3REZXNjcmlwdGlvbnMoKTsKLQotCQkJc2V0U3RhdGUoQ0xFQU4pOwotCQkJZlByb2plY3REZXNjcmlwdGlvbnMgPSBudWxsOwotCQkJZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBudWxsOwotCQkJZkNsYXNzcGF0aENoYW5nZUxpc3RlbmVyID0gbnVsbDsKLQkJCWZNZW1vcnlMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHdvcmtpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWdsaWIgaW5kZXgKLQkgKiBAcmV0dXJuIFRoZSBGaWxlIHJlcHJlc2VudGluZyB0aGUgdGFnbGliIGluZGV4J3Mgd29ya2luZyBsb2NhdGlvbgotCSAqLwotCXByaXZhdGUgRmlsZSBnZXRXb3JraW5nTG9jYXRpb24oKSB7Ci0JCUZpbGUgZm9sZGVyID0gbmV3IEZpbGUoZ2V0VGFnbGliSW5kZXhTdGF0ZUxvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJaWYgKCFmb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotCQkJdHJ5IHsKLQkJCQlmb2xkZXIubWtkaXIoKTsKLQkJCX0KLQkJCWNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBIYXZlIGFsbCBvZiB0aGUgUHJvamVjdERlc2NyaXB0aW9ucyB3cml0ZSB0aGVpciBpbmZvcm1hdGlvbiB0byBkaXNrIGFuZAotCSAqIHRoZW4gY2xlYXIgb3VyIG1hcCBvZiB0aGVtCi0JICovCi0Jdm9pZCBjbGVhclByb2plY3REZXNjcmlwdGlvbnMoKSB7Ci0JCXRyeSB7Ci0JCQlMT0NLLmFjcXVpcmUoKTsKLQkJCUl0ZXJhdG9yIGkgPSBmUHJvamVjdERlc2NyaXB0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgaS5uZXh0KCk7Ci0JCQkJZGVzY3JpcHRpb24uc2F2ZVJlZmVyZW5jZXMoKTsKLQkJCX0KLQotCQkJZlByb2plY3REZXNjcmlwdGlvbnMuY2xlYXIoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCUxPQ0sucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0JCXJldHVybiBpbml0aWFsaXplZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0SW50aWFsaXplZChib29sZWFuIGludGlhbGl6ZWQpIHsKLQkJdGhpcy5pbml0aWFsaXplZCA9IGludGlhbGl6ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvVGFnbGliSW5kZXhEZWx0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvVGFnbGliSW5kZXhEZWx0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzE0ZDhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL1RhZ2xpYkluZGV4RGVsdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLXB1YmxpYyBjbGFzcyBUYWdsaWJJbmRleERlbHRhIGltcGxlbWVudHMgSVRhZ2xpYkluZGV4RGVsdGEgewotCXByaXZhdGUgQ29sbGVjdGlvbiBmQ2hpbGRyZW47Ci0JcHJpdmF0ZSBpbnQgZkV4cGxpY2l0S2luZCA9IC0xOwotCXByaXZhdGUgaW50IGZJbXBsaWNpdEtpbmQgPSAtMTsKLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0OwotCXByaXZhdGUgSVRhZ2xpYlJlY29yZCBmVGFnbGliUmVjb3JkID0gbnVsbDsKLQlsb25nIHRpbWU7Ci0JT2JqZWN0IHRyaWdnZXIgPSBudWxsOwotCi0JVGFnbGliSW5kZXhEZWx0YShJUHJvamVjdCBwcm9qZWN0LCBJVGFnbGliUmVjb3JkIHJlY29yZCwgaW50IGtpbmQpIHsKLQkJZlByb2plY3QgPSBwcm9qZWN0OwotCQlmVGFnbGliUmVjb3JkID0gcmVjb3JkOwotCQlmRXhwbGljaXRLaW5kID0ga2luZDsKLQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCX0KLQotCXZvaWQgYWRkQ2hpbGREZWx0YShJVGFnbGliSW5kZXhEZWx0YSBkZWx0YSkgewotCQlpZiAoZkNoaWxkcmVuID09IG51bGwpCi0JCQlmQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZDaGlsZHJlbi5hZGQoZGVsdGEpOwotCQlmSW1wbGljaXRLaW5kID0gLTE7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZUtpbmQoKSB7Ci0JCWludCBhZGRlZCA9IDA7Ci0JCWludCByZW1vdmVkID0gMDsKLQotCQlJVGFnbGliSW5kZXhEZWx0YVtdIGNoaWxkcmVuID0gKElUYWdsaWJJbmRleERlbHRhW10pIGZDaGlsZHJlbi50b0FycmF5KG5ldyBJVGFnbGliSW5kZXhEZWx0YVtmQ2hpbGRyZW4uc2l6ZSgpXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWludCBraW5kID0gY2hpbGRyZW5baV0uZ2V0S2luZCgpOwotCQkJaWYgKGtpbmQgPT0gSVRhZ2xpYkluZGV4RGVsdGEuQURERUQpCi0JCQkJYWRkZWQrKzsKLQkJCWlmIChraW5kID09IElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQpCi0JCQkJcmVtb3ZlZCsrOwotCQkJaWYgKGFkZGVkID4gMCAmJiByZW1vdmVkID4gMCkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoYWRkZWQgPiAwICYmIHJlbW92ZWQgPiAwKSB7Ci0JCQlyZXR1cm4gSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRDsKLQkJfQotCQllbHNlIGlmIChhZGRlZCA+IDApIHsKLQkJCXJldHVybiBJVGFnbGliSW5kZXhEZWx0YS5BRERFRDsKLQkJfQotCQllbHNlIGlmIChyZW1vdmVkID4gMCkgewotCQkJcmV0dXJuIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRDsKLQkJfQotCX0KLQotCXB1YmxpYyBJVGFnbGliSW5kZXhEZWx0YVtdIGdldEFmZmVjdGVkQ2hpbGRyZW4oKSB7Ci0JCWlmIChmQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBJVGFnbGliSW5kZXhEZWx0YVswXTsKLQkJfQotCQlyZXR1cm4gKElUYWdsaWJJbmRleERlbHRhW10pIGZDaGlsZHJlbi50b0FycmF5KG5ldyBJVGFnbGliSW5kZXhEZWx0YVtmQ2hpbGRyZW4uc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlpZiAoZkNoaWxkcmVuID09IG51bGwpIHsKLQkJCXJldHVybiBmRXhwbGljaXRLaW5kOwotCQl9Ci0JCWlmIChmSW1wbGljaXRLaW5kID09IC0xKSB7Ci0JCQlmSW1wbGljaXRLaW5kID0gY29tcHV0ZUtpbmQoKTsKLQkJfQotCQlyZXR1cm4gZkltcGxpY2l0S2luZDsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGZQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJVGFnbGliUmVjb3JkIGdldFRhZ2xpYlJlY29yZCgpIHsKLQkJcmV0dXJuIGZUYWdsaWJSZWNvcmQ7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0VGltZSgpIHsKLQkJcmV0dXJuIHRpbWU7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRUcmlnZ2VyKCkgewotCQlyZXR1cm4gdHJpZ2dlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZlRhZ2xpYlJlY29yZCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZlRhZ2xpYlJlY29yZC50b1N0cmluZygpOwotCQkJaW50IGtpbmQgPSBnZXRLaW5kKCk7Ci0JCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCQljYXNlIElUYWdsaWJJbmRleERlbHRhLkFEREVEIDoKLQkJCQkJc3RyaW5nID0gIiBBRERFRCAoIiArIHN0cmluZyArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRCA6Ci0JCQkJCXN0cmluZyA9ICIgQ0hBTkdFRCAoIiArIHN0cmluZyArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVRhZ2xpYkluZGV4RGVsdGEuUkVNT1ZFRCA6Ci0JCQkJCXN0cmluZyA9ICIgUkVNT1ZFRCAoIiArIHN0cmluZyArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlzdHJpbmcgPSAiIG90aGVyOiIgKyBraW5kICsgIiAoIiArIHN0cmluZyArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWludCBraW5kID0gZ2V0S2luZCgpOwotCQkJc3dpdGNoIChraW5kKSB7Ci0JCQkJY2FzZSBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlRhZ2xpYkluZGV4RGVsdGEoIiArIGZQcm9qZWN0ICsgIik6QURERURcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRCA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlRhZ2xpYkluZGV4RGVsdGEoIiArIGZQcm9qZWN0ICsgIik6Q0hBTkdFRFxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJVGFnbGliSW5kZXhEZWx0YS5SRU1PVkVEIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiVGFnbGliSW5kZXhEZWx0YSgiICsgZlByb2plY3QgKyAiKTpSRU1PVkVEXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQkJCUlUYWdsaWJJbmRleERlbHRhW10gY2hpbGRyZW4gPSBnZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnXHQnKTsKLQkJCQlidWZmZXIuYXBwZW5kKGNoaWxkcmVuW2ldLnRvU3RyaW5nKCkpOwotCQkJCWlmIChpIDwgY2hpbGRyZW4ubGVuZ3RoIC0gMSkgewotCQkJCQlidWZmZXIuYXBwZW5kKCdcbicpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RleHQvSUpTUFBhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGV4dC9JSlNQUGFydGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWU0YzNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGV4dC9JSlNQUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0OwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIGZvciBKU1AuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUFBhcnRpdGlvbnMgewotCi0JU3RyaW5nIEpTUF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuREVGQVVMVF9KU1AiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEpTUF9TQ1JJUFRfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuU0NSSVBULiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfREVMSU1JVEVSID0gSlNQX1NDUklQVF9QUkVGSVggKyAiREVMSU1JVEVSIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfQ09OVEVOVF9KQVZBID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSkFWQSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfSkFWQVNDUklQVCA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkpBVkFTQ1JJUFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9ERUZBVUxUX0VMID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSlNQX0VMIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfREVGQVVMVF9FTDIgPSBKU1BfU0NSSVBUX1BSRUZJWCArICJKU1BfRUwyIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBKU1BfRElSRUNUSVZFID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0RJUkVDVElWRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BlZENTU1RhZ2xpYkNvbnRyb2xsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BlZENTU1RhZ2xpYkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0YTVmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQZWRDU1NUYWdsaWJDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudFNldHVwUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKU1BlZENTU1RhZ2xpYkNvbnRyb2xsZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50IHsKLQotCXB1YmxpYyB2b2lkIHNldHVwKElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBpZ25vcmUgVExEIGluIGNvbnRlbnQgdHlwZSBjc3MganNwCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySlNQZWRDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1BlZENTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGFmYTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1BlZENTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5KU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLklDb250ZW50RGVzY3JpcHRpb25Gb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9ySlNQZWRDU1MgaW1wbGVtZW50cyBJVGV4dENvbnRlbnREZXNjcmliZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWVbXSBTVVBQT1JURURfT1BUSU9OUyA9IHtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfVFlQRV9BVFRSSUJVVEUsIElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuTEFOR1VBR0VfQVRUUklCVVRFfTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXIjZGVzY3JpYmUoamF2YS5pby5JbnB1dFN0cmVhbSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOVkFMSUQ7Ci0KLQkJLy8gaWYgZGlzY3JpcHRpb24gaXMgbnVsbCwgd2UgYXJlIGp1c3QgYmVpbmcgYXNrZWQgdG8KLQkJLy8gYXNzZXNzIGNvbnRlbnRzIHZhbGlkaXR5Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLlJlYWRlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTlZBTElEOwotCi0JCS8vIGlmIGRpc2NyaXB0aW9uIGlzIG51bGwsIHdlIGFyZSBqdXN0IGJlaW5nIGFza2VkIHRvCi0JCS8vIGFzc2VzcyBjb250ZW50cyB2YWxpZGl0eQotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQkJcmV0dXJuIFNVUFBPUlRFRF9PUFRJT05TOwotCX0KLQotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCQlyZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5WQUxJRDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIGludCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJCXJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZ2V0RGV0ZWN0b3IoKSB7Ci0JCXJldHVybiBuZXcgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGhhbmRsZSBzdGFuZGFyZCBvbmVzIGZpcnN0LCB0byBiZSBzdXJlIGRldGVjdG9yIHByb2Nlc3NlcwotCQloYW5kbGVTdGFuZGFyZENhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQkvLyBub3cgZG8gdGhvc2Ugc3BlY2lmaWMgZm9yIEpTUHMKLQkJLy8gbm90ZTogZGV0ZWN0b3Igc2hvdWxkIGFsd2F5cyBiZSBvZiBjb3JyZWN0IGluc3RhbmNlLCBidXQgd2UnbGwKLQkJLy8gY2hlY2ssIGZvciBub3cuCi0JCWlmIChkZXRlY3RvciBpbnN0YW5jZW9mIEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgewotCQkJSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGpzcERldGVjdG9yID0gKEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3I7Ci0JCQlTdHJpbmcgbGFuZ3VhZ2UgPSBqc3BEZXRlY3Rvci5nZXRMYW5ndWFnZSgpOwotCQkJaWYgKGxhbmd1YWdlICE9IG51bGwgJiYgbGFuZ3VhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5MQU5HVUFHRV9BVFRSSUJVVEUsIGxhbmd1YWdlKTsKLQkJCX0KLQkJCVN0cmluZyBjb250ZW50VHlwZUF0dHJpYnV0ZSA9IGpzcERldGVjdG9yLmdldENvbnRlbnRUeXBlKCk7Ci0JCQlpZiAoY29udGVudFR5cGVBdHRyaWJ1dGUgIT0gbnVsbCAmJiBjb250ZW50VHlwZUF0dHJpYnV0ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfVFlQRV9BVFRSSUJVVEUsIGNvbnRlbnRUeXBlQXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIE9iamVjdCBkZXRlY3RlZENoYXJzZXQsIE9iamVjdCBqYXZhQ2hhcnNldCkgewotCQlpZiAoZGV0ZWN0ZWRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCS8vIE9uY2Ugd2UgZGV0ZWN0ZWQgYSBjaGFyc2V0LCB3ZSBzaG91bGQgc2V0IHRoZSBwcm9wZXJ0eSBldmVuCi0JCQkvLyB0aG91Z2ggaXQncyB0aGUgc2FtZSBhcyBqYXZhQ2hhcnNldAotCQkJLy8gYmVjYXVzZSB0aGVyZSBhcmUgY2xpZW50cyB0aGF0IHJlbHkgb24gdGhpcyBwcm9wZXJ0eSB0bwotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFyc2V0IGlzIGFjdHVhbGx5IGRldGVjdGVkIGluIGZpbGUgb3Igbm90LgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIGRldGVjdGVkQ2hhcnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGV0ZWN0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVN0YW5kYXJkQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbm90ZTogaWYgd2UncmUgYXNrZWQgZm9yIG9uZSwgd2Ugc2V0IHRoZW0gYWxsLiBJIG5lZWQgdG8gYmUgc3VyZSBpZgotCQkvLyBjYWxsZWQKLQkJLy8gbXVsaXRpcGxlIHRpbWVzIChvbmUgZm9yIGVhY2gsIHNheSkgdGhhdCB3ZSBkb24ndCB3YXN0ZSB0aW1lCi0JCS8vIHByb2Nlc3Npbmcgc2FtZQotCQkvLyBjb250ZW50IGFnYWluLgotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gKChKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpIGRldGVjdG9yKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJLy8gVE9ETzogSSBuZWVkIHRvIHZlcmlmeSB0byBzZWUgaWYgdGhpcyBCT00gd29yayBpcyBhbHdheXMgZG9uZQotCQkvLyBieSB0ZXh0IHR5cGUuCi0JCU9iamVjdCBkZXRlY3RlZEJ5dGVPcmRlck1hcmsgPSBlbmNvZGluZ01lbWVudG8uZ2V0VW5pY29kZUJPTSgpOwotCQlpZiAoZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0J5dGVPcmRlck1hcmsgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSyk7Ci0JCQkvLyBub3Qgc3VyZSB3aHkgd291bGQgZXZlciBiZSBkaWZmZXJlbnQsIHNvIGlmIGlzIGRpZmZlcmVudCwgbWF5Ci0JCQkvLyBuZWVkIHRvICJwdXNoIiB1cCBpbnRvIGJhc2UuCi0JCQlpZiAoIWRldGVjdGVkQnl0ZU9yZGVyTWFyay5lcXVhbHMoZXhpc3RpbmdCeXRlT3JkZXJNYXJrKSkKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrKTsKLQkJfQotCi0KLQkJaWYgKCFlbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkvLyBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJLy8gSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQKLQkJCS8vIGluIHRoZSByZXNvdXJjZSdzIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCi0JCQkvLyBpbnZhbGlkCi0JCQkvLyBpbiB0aG9zZSBjYXNlcywgdGhlICJkZXRlY3RlZCIgcHJvcGVydHkgY29udGFpbnMgYW4KLQkJCS8vICJhcHByb3ByaWF0ZSBkZWZhdWx0IiB0byB1c2UuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgZW5jb2RpbmdNZW1lbnRvLmdldEludmFsaWRFbmNvZGluZygpKTsKLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQl9Ci0KLQkJT2JqZWN0IGRldGVjdGVkQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0KLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJaWYgKGphdmFDaGFyc2V0LmVxdWFscyhleGlzdGluZ0NoYXJzZXQpKSB7Ci0JCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBtYXkgbmVlZCB0byBhZGQgd2hhdCB3ZSBmb3VuZCwgYnV0IG9ubHkgbmVlZCB0byBhZGQKLQkJCQkvLyBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdC4KLQkJCQlPYmplY3QgZGVmYXVsdENoYXJzZXQgPSBkZXRlY3Rvci5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJaWYgKGRlZmF1bHRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFkZWZhdWx0Q2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYXNzdW1pbmcgaWYgdGhlcmUgaXMgbm8gc3BlYyBkZWZhdWx0LCB3ZSBhbHdheXMgbmVlZCB0bwotCQkJCQkvLyBhZGQsIEknbSBhc3N1bWluZwotCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNSZWxldmVudChJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfVFlQRV9BVFRSSUJVVEUpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lVmFsaWRpdHkoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lVmFsaWRpdHkoUmVhZGVyIHJlYWRlcikgewotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lKU1BDU1NJbXBvcnRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JSlNQQ1NTSW1wb3J0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjc0Yjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lKU1BDU1NJbXBvcnRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUENTU0ltcG9ydFJ1bGUgZXh0ZW5kcyBJQ1NTSW1wb3J0UnVsZSwgSUpTUENTU05vZGUgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JSlNQQ1NTTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSUpTUENTU05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyNjc1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JSlNQQ1NTTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElKU1BDU1NOb2RlIGV4dGVuZHMgSUNTU05vZGUgewotCXNob3J0IEpTUF9OT0RFID0gMTY7Ci0JU3RyaW5nIGdldENzc1RleHQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU0ltcG9ydFJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BDU1NJbXBvcnRSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTlkZDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU0ltcG9ydFJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTSW1wb3J0UnVsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci0KLXB1YmxpYyBjbGFzcyBKU1BDU1NJbXBvcnRSdWxlSW1wbCBleHRlbmRzIENTU0ltcG9ydFJ1bGVJbXBsIGltcGxlbWVudHMgSUpTUENTU0ltcG9ydFJ1bGUgewotCi0JSlNQQ1NTSW1wb3J0UnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUpTUENTU0ltcG9ydFJ1bGVJbXBsKEpTUENTU0ltcG9ydFJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJSlNQQ1NTSW1wb3J0UnVsZUltcGwgY2xvbmVkID0gbmV3IEpTUENTU0ltcG9ydFJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRIcmVmKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKEhSRUYpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChIUkVGLmVxdWFscyhuYW1lKSl7Ci0JCQl2YWx1ZSA9IENTU1V0aWwuZXh0cmFjdFVyaUNvbnRlbnRzKHZhbHVlKTsKLQkJfQotCQlzdXBlci5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU05vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BDU1NOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmJhNzBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU05vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLWNsYXNzIEpTUENTU05vZGVJbXBsIGV4dGVuZHMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSUpTUENTU05vZGUgewotCi0KLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQotCUpTUENTU05vZGVJbXBsKEpTUENTU05vZGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQl9Ci0KLQlKU1BDU1NOb2RlSW1wbChTdHJpbmcgdGV4dCkgewotCQlzdXBlcigpOwotCQlmVGV4dCA9IHRleHQ7Ci0JfQotCQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUpTUENTU05vZGVJbXBsIGNsb25lZCA9IG5ldyBKU1BDU1NOb2RlSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gSlNQX05PREU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDc3NUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BlZENTU01vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQZWRDU1NNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkYTBmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BlZENTU01vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU01vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTTW9kZWxQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBKU1BlZENTU01vZGVsSW1wbCBleHRlbmRzIENTU01vZGVsSW1wbCB7Ci0JcHJpdmF0ZSBKU1BlZENTU01vZGVsUGFyc2VyIGZQYXJzZXI7Ci0JCi0JcHJvdGVjdGVkIENTU01vZGVsUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKGZQYXJzZXIgPT0gbnVsbCkgewotCQkJaWYgKGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJCWZQYXJzZXIgPSBuZXcgSlNQZWRDU1NNb2RlbFBhcnNlcihnZXREb2N1bWVudCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlBhcnNlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUGVkQ1NTTW9kZWxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUGVkQ1NTTW9kZWxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNzIzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BlZENTU01vZGVsUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouSlNQZWRDU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU01vZGVsUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NOb2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NSdWxlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgSlNQZWRDU1NNb2RlbFBhcnNlciBleHRlbmRzIENTU01vZGVsUGFyc2VyIHsKLQotCXB1YmxpYyBKU1BlZENTU01vZGVsUGFyc2VyKElDU1NEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIoZG9jKTsKLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENTU05vZGVJbXBsIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlDU1NNb2RlbENyZWF0aW9uQ29udGV4dCBjcmVhdGlvbkNvbnRleHQgPSBnZXRDcmVhdGlvbkNvbnRleHQoKTsKLQkJaWYgKGNyZWF0aW9uQ29udGV4dCA9PSBudWxsIHx8IHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyB0eXBlID0gKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgcmVnaW9uKS5nZXRUeXBlKCk7Ci0JCUNTU05vZGVJbXBsIG1vZGlmaWVkID0gbnVsbDsKLQotCQkvL0lDU1NOb2RlIHRhcmdldCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQkKLQkJaWYgKHR5cGUgPT0gSlNQZWRDU1NSZWdpb25Db250ZXh0cy5DU1NfSlNQX0RJUkVDVElWRSl7Ci0JCQkKLQkJCWJvb2xlYW4gaXNJbmNsdWRlID0gcmVnaW9uLmdldFRleHQoKS5pbmRleE9mKCJpbmNsdWRlIikgIT0gLTE7Ci0JCQlpZiAoaXNJbmNsdWRlKXsKLQkJCQltb2RpZmllZCA9IGluc2VydFVua25vd25JbXBvcnQocmVnaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kaWZpZWQgPSBpbnNlcnRVbmtub3duUnVsZShyZWdpb24pOwkJCQkJCi0JCQl9Ci0JCX0KLQotCQkvLyBwb3N0IHByb2Nlc3MKLQkJaWYgKG1vZGlmaWVkICE9IG51bGwpIHsKLQkJCWlmIChtb2RpZmllZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBtb2RpZmllZCkucHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtb2RpZmllZCAhPSBudWxsID8gbW9kaWZpZWQgOiBzdXBlci5pbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocmVnaW9uKTsKLQl9Ci0KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydFVua25vd25JbXBvcnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQgY3JlYXRpb25Db250ZXh0ID0gZ2V0Q3JlYXRpb25Db250ZXh0KCk7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCUlDU1NEb2N1bWVudCBzaGVldCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQotCQlTdHJpbmcgdGV4dCA9IHJlZ2lvbi5nZXRUZXh0KCk7Ci0JCVBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiICIpOwotCSAgICBTdHJpbmdbXSBzdHJzID0gcGF0dGVybi5zcGxpdCh0ZXh0KTsKLQkgICAgU3RyaW5nIGhyZWZWYWx1ZSA9IG51bGw7Ci0JICAgIGZvciAoaW50IGk9MDtpPHN0cnMubGVuZ3RoO2krKykgewotCSAgICAJU3RyaW5nIGhyZWZTdHIgPSAiZmlsZT1cIiI7Ci0JICAgICAgaWYgKHN0cnNbaV0uc3RhcnRzV2l0aChocmVmU3RyKSl7Ci0JCQkJaW50IGhyZWZTdHJfbGVuZ3RoID0gaHJlZlN0ci5sZW5ndGgoKTsKLQkJCQkvLyBtaW51cyAxIHRvIGF2b2lkIHF1b3RlPwotCQkJCWludCBocmVmVmFsdWVfbGVuZ3RoID0gc3Ryc1tpXS5sZW5ndGgoKSAtIDE7Ci0JCQkJaWYgKGhyZWZWYWx1ZV9sZW5ndGggPiBocmVmU3RyX2xlbmd0aCkgewotCQkJCQlocmVmVmFsdWUgPSBzdHJzW2ldLnN1YnN0cmluZyhocmVmU3RyX2xlbmd0aCwgaHJlZlZhbHVlX2xlbmd0aCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBJU1NVRTogdGhpcyBoYW5kbGVzIGNhc2VzIHdoZXJlLCBlLmcuICJmaWxlPSIgaGFzIG5vCi0JCQkJCSAqIHN1YnNlcXVlbnQgJ3ZhbHVlJyAuLi4gYW5kIGZyb20gY29kZSBpbiBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJICogSSBiZWxpZXZlIHNob3VsZCByZXR1cm4gbnVsbCwgcmF0aGVyIHRoYW4gZW1wdHkgc3RyaW5nLCBidXQsIHRoaXMgbWF5IAotCQkJCQkgKiBuZWVkIHNvbWUgZmluZSB0dW5pbmcgZXZlbnR1YWxseS4KLQkJCQkJICovCi0JCQkJCWhyZWZWYWx1ZSA9IG51bGw7Ci0JCQkJfQotCSAgICAJICBicmVhazsKLQkgICAgICB9Ci0JICAgIH0KLQkJCi0JCWlmIChocmVmVmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlKU1BDU1NJbXBvcnRSdWxlSW1wbCBydWxlID0gbmV3IEpTUENTU0ltcG9ydFJ1bGVJbXBsKCk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudChzaGVldCk7Ci0JCXJ1bGUuYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKXNoZWV0LmNyZWF0ZU1lZGlhTGlzdCgpKTsKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihyZWdpb24sIHJlZ2lvbik7Ci0KLQkJCi0JCWlmICghaXNVcGRhdGVDb250ZXh0QWN0aXZlKCkpIHsKLQkJCXJ1bGUuc2V0SHJlZihocmVmVmFsdWUpOy8vQXR0cmlidXRlKElDU1NJbXBvcnRSdWxlLkhSRUYsIGhyZWZWYWx1ZSk7Ci0JCX0KLQotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghaXNVcGRhdGVDb250ZXh0QWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCS8vcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQoc2hlZXQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCSgoQ1NTTm9kZUltcGwpc2hlZXQpLmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCSgoQ1NTTm9kZUltcGwpc2hlZXQpLmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0JCS8vY3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocnVsZSk7Ci0JCXJldHVybiBydWxlOwotCX0KLQotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0VW5rbm93blJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlDU1NNb2RlbENyZWF0aW9uQ29udGV4dCBjcmVhdGlvbkNvbnRleHQgPSBnZXRDcmVhdGlvbkNvbnRleHQoKTsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gY3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFpc1BhcnNlRmxvYXRpbmcoKSAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlKU1BDU1NOb2RlSW1wbCBydWxlID0gbmV3IEpTUENTU05vZGVJbXBsKGZsYXROb2RlLmdldFRleHQoKSk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudChwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlLCBmbGF0Tm9kZSk7Ci0KLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWlzVXBkYXRlQ29udGV4dEFjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQkvL2NyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkvLyBUYXJnZXROZXh0IGlzIHNldCB0byBudWxsIGF1dG9tYXRpY2FsbHkKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUGVkQ1NTRG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUGVkQ1NTRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3Y2E3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9KU1BlZENTU0RvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5KU1BlZENTU1NvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBKU1BlZENTU0RvY3VtZW50TG9hZGVyIGV4dGVuZHMgQ1NTRG9jdW1lbnRMb2FkZXIgewotcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JcmV0dXJuIG5ldyBKU1BlZENTU1NvdXJjZVBhcnNlcigpOwotfQotcHVibGljIElEb2N1bWVudExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gbmV3IEpTUGVkQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9KU1BlZENTU01vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvSlNQZWRDU1NNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDkxNGI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9KU1BlZENTU01vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5KU1BlZENTU01vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkpTUGVkQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5DU1NNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIEpTUGVkQ1NTTW9kZWxMb2FkZXIgZXh0ZW5kcyBDU1NNb2RlbExvYWRlciB7Ci1wdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbmV3IEpTUGVkQ1NTTW9kZWxJbXBsKCk7Ci0JcmV0dXJuIG1vZGVsOwotfQotcHVibGljIElNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gbmV3IEpTUGVkQ1NTTW9kZWxMb2FkZXIoKTsKLX0KLXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbmV3IEpTUGVkQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0JcmV0dXJuIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci19Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckpTUGVkQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkMWMyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkpTUGVkQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlckZvckpTUGVkQ1NTIGV4dGVuZHMgQWJzdHJhY3RNb2RlbEhhbmRsZXIgaW1wbGVtZW50cyBJTW9kZWxIYW5kbGVyIHsKLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1vZGVsSGFuZGxlcklEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBNb2RlbEhhbmRsZXJGb3JKU1BlZENTUygpewotCQlzdXBlcigpOwotCQlzZXRJZChNb2RlbEhhbmRsZXJJRCk7Ci0JCXNldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKEFzc29jaWF0ZWRDb250ZW50VHlwZUlEKTsKLQl9Ci0JCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BlZENTU01vZGVsTG9hZGVyKCk7Ci0JfQotCQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNQZWRDU1NEb2N1bWVudExvYWRlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BlZENTU1NvdXJjZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUGVkQ1NTU291cmNlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MmE4YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUGVkQ1NTU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouSlNQZWRDU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1JlZ2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5JQ1NTVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLQotCi1wdWJsaWMgY2xhc3MgSlNQZWRDU1NTb3VyY2VQYXJzZXIgZXh0ZW5kcyBDU1NTb3VyY2VQYXJzZXIgewotCi0JcHJpdmF0ZSBKU1BlZENTU1Rva2VuaXplciBmVG9rZW5pemVyOwotCXByb3RlY3RlZCBib29sZWFuIG11c3RCZVN0YXJ0KFN0cmluZyB0eXBlLCBTdHJpbmcgZG9jUmVnaW9uVHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IEpTUGVkQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0pTUF9DT01NRU5UIHx8IHR5cGUgPT0gSlNQZWRDU1NSZWdpb25Db250ZXh0cy5DU1NfSlNQX0RJUkVDVElWRSB8fCB0eXBlID09IEpTUGVkQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0pTUF9FTkQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQVRLRVlXT1JEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgfHwgKGRvY1JlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZICYmIHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHx8ICghQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yQmVnZ2luaW5nVHlwZShkb2NSZWdpb25UeXBlKSAmJiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUKSkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG11c3RCZUVuZChTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gSlNQZWRDU1NSZWdpb25Db250ZXh0cy5DU1NfSlNQX0NPTU1FTlQgfHwgdHlwZSA9PSBKU1BlZENTU1JlZ2lvbkNvbnRleHRzLkNTU19KU1BfRElSRUNUSVZFIHx8IHR5cGUgPT0gSlNQZWRDU1NSZWdpb25Db250ZXh0cy5DU1NfSlNQX0VORCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpOwotCX0KLQkKLQlwdWJsaWMgSUNTU1Rva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCWlmIChmVG9rZW5pemVyID09IG51bGwpIHsKLQkJCWZUb2tlbml6ZXIgPSBuZXcgSlNQZWRDU1NUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0JCi0JcHVibGljIFJlZ2lvblBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBKU1BlZENTU1NvdXJjZVBhcnNlcigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BlZENTU1Rva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUGVkQ1NTVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOWU3NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUGVkQ1NTVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMwICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuNC4xIG9uIDEwLzI5LzEwIDQ6NTcgUE0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5KU1BlZENTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLklDU1NUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLkNTU1RleHRSZWdpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40LjEKLSAqIG9uIDEwLzI5LzEwIDQ6NTcgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+QzovZGV2L3dvcmtzcGFjZXMvaW5kaWdvL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9DU1NKU1BQYXJzZXIvSlNQZWRDU1NUb2tlbml6ZXIuZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BlZENTU1Rva2VuaXplciBpbXBsZW1lbnRzIEpTUGVkQ1NTUmVnaW9uQ29udGV4dHMsIElDU1NUb2tlbml6ZXIgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSAxNjM4NDsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSlNQX0VYUCA9IDIxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9KU1BfRElSRUNUSVZFID0gMjE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FID0gMTI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0lNUE9SVF9ERUxJTUlURVIgPSA1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUgPSAxODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1IgPSAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfQ0hBUlNFVF9ERUxJTUlURVIgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTl9WQUxVRSA9IDE5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9QQUdFX1BTRVVET19QQUdFID0gODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSU1QT1JUX1VSSSA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQgPSAxNTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSlNQX0VMID0gMjI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiA9IDEzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9KU1BfREVDTEFSQVRJT04gPSAyMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfREVDTEFSQVRJT04gPSAxNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfUEFHRV9ERUxJTUlURVIgPSA5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgPSAxNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfTUVESUFfTUVESVVNID0gNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSlNQX1NDUklQVExFVCA9IDIwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9DSEFSU0VUX05BTUUgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9KU1BfQ09NTUVOVCA9IDIzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9JTVBPUlRfTUVESVVNID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SID0gMTc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0ZPTlRfRkFDRV9ERUxJTUlURVIgPSA5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9NRURJQV9ERUxJTUlURVIgPSA3OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9TRUxFQ1RPUl9NT0RJRklFUiA9IDExOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUlOSVRJQUwgPSAwOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQ01BUF9QQUNLRUQgPSAKLSAgICAiXDExXDBcMVwxMVwxXDE3XDFcMFwxXDRcMVwyMFwyMlwwXDFcNlwxXDQwXDFcMTAiKwotICAgICJcMVwyMlwxXDMzXDFcMzFcMVwxNlwxXDVcMVwyNlwxXDEyXDFcNDJcMVwxNFwxXDYxIisKLSAgICAiXDFcMTNcMVwxNVwxXDQxXDEyXDFcMVw2NVwxXDU0XDFcMzBcMVwzN1wxXDMyXDFcMjEiKwotICAgICJcMVwzNlwxXDQ3XDFcMjdcMVw0NFwxXDYzXDFcNTJcMVw2N1wxXDY0XDFcNDVcMVw1NSIrCi0gICAgIlwyXDJcMVwyNVwxXDU2XDFcNzBcMVw2MFwxXDU3XDFcMlwxXDI0XDFcNTBcMVw1MyIrCi0gICAgIlwxXDIzXDVcMlwxXDcxXDFcM1wxXDczXDFcMTZcMVwyXDFcMTZcMVw0NlwxXDciKwotICAgICJcMVw0M1wxXDYyXDFcNTFcMVw2NlwxXDY0XDFcNDVcMVw1NVwyXDJcMVwyNVwxXDU2IisKLSAgICAiXDFcNzBcMVw2MFwxXDU3XDFcMlwxXDI0XDFcNTBcMVw1M1wxXDIzXDVcMlwxXDM0IisKLSAgICAiXDFcNzJcMVwzNVwxXDcyXDFcMFx1ZmY4MFwyIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBbXSBaWl9DTUFQID0genpVbnBhY2tDTWFwKFpaX0NNQVBfUEFDS0VEKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgREZBIHN0YXRlcyB0byBhY3Rpb24gc3dpdGNoIGxhYmVscy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BQ1RJT04gPSB6elVucGFja0FjdGlvbigpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BQ1RJT05fUEFDS0VEXzAgPQotICAgICJcMzBcMFwxXDFcMVwyXDFcMVwxXDNcMVwyXDRcMVwxXDQiKwotICAgICJcMlwxXDFcNVwxXDFcMVw2XDRcMVwxXDdcM1wxXDFcMTAiKwotICAgICJcMVwxXDFcMTBcMVwxMVwxXDEyXDFcMVwxXDEyXDFcMTNcMVwxNCIrCi0gICAgIlwxXDE1XDFcMVwxXDE1XDFcMTZcMVwxXDFcM1wxXDE3XDFcMjAiKwotICAgICJcMVwyMVwxXDFcMVwyMVwxXDIyXDFcMVwxXDIzXDFcMjRcM1wxIisKLSAgICAiXDFcMjRcMVwyNVwxXDFcMVwyNVwxXDI2XDFcMjdcMVwzMFwxXDMxIisKLSAgICAiXDNcMVwxXDMyXDFcMzFcM1wxXDFcMzFcMVwxXDJcMzNcMVwzIisKLSAgICAiXDJcMVwxXDM0XDFcMzVcMVwzNlwxXDM3XDFcMVwxXDBcMlwyIisKLSAgICAiXDFcNDBcMVwwXDFcNDFcMlwwXDFcNDJcMlwwXDFcNDNcNlwwIisKLSAgICAiXDFcNDRcM1wwXDFcNDVcNVwwXDFcNDZcNFwwXDJcMTBcMVwwIisKLSAgICAiXDJcMTJcMVwwXDJcMTVcMVwxN1wxXDBcMlwyMVwxXDBcMVwyNCIrCi0gICAgIlwyXDBcMVwyNFwyXDBcMVwyNFwxXDBcMlwyNVwxXDQ3XDJcMCIrCi0gICAgIlwxXDUwXDFcMFwxXDUxXDFcMzFcMlwwXDFcNTJcMlwwXDJcMzEiKwotICAgICJcMVwzMFwxXDUzXDJcMFwxXDMxXDJcMFwxXDU0XDFcNTVcMVwwIisKLSAgICAiXDFcNTZcMVwwXDFcMlwxXDU3XDFcNDBcMVw0MVwxMFwwXDFcNDQiKwotICAgICJcMVwwXDFcNDVcMlwwXDFcNDVcMlwwXDFcNDZcMlwwXDFcNDYiKwotICAgICJcMlwwXDFcMTBcMVwxMlwxXDE1XDFcMjFcMVwyNFwxXDBcMVwyNCIrCi0gICAgIlwyXDBcMVwyNFwxXDBcMVwyNVwxXDQ3XDFcMzFcMVwwXDFcNTIiKwotICAgICJcMlwwXDFcNTJcMVwwXDFcNTNcMVw2MFwxXDMxXDNcMFwxXDIiKwotICAgICJcMVw0MFwxXDQxXDFcNjFcNVwwXDFcNjJcMlwwXDFcNDRcNVwwIisKLSAgICAiXDFcMTBcMVwxMlwxXDE1XDFcMjFcMVwyNFwyXDBcMVwyNVwxXDQ3IisKLSAgICAiXDFcMzFcMlwwXDFcNTNcMVw2MFwxXDBcMVw1MVwxXDBcMVw2MyIrCi0gICAgIlwxXDJcMVw0MFwxXDQxXDNcMFwxXDY0XDJcMFwxXDQ0XDFcMCIrCi0gICAgIlwxXDQ0XDEwXDBcMVw2NVwxXDEwXDFcMTJcMVwxNVwxXDIxXDFcMjQiKwotICAgICJcMlwwXDFcMjVcMVw0N1wxXDMxXDJcMFwxXDUzXDJcNjBcNVwwIisKLSAgICAiXDFcNjZcMVwwXDFcMlwxXDQwXDFcNDFcMlwwXDFcNjdcMlwwIisKLSAgICAiXDFcNDRcNlwwXDFcNjVcMlwwXDFcMTBcMVwxMlwxXDE1XDFcMjEiKwotICAgICJcMVwyNFwyXDBcMVwyNVwxXDQ3XDFcMzFcMlwwXDFcNTNcMlw2MCIrCi0gICAgIlwyXDBcMVw2NlwzXDBcMVwyXDFcNDBcMVw0MVwxXDBcMVw3MCIrCi0gICAgIlwyXDBcMVw0NFwxM1wwXDFcMTBcMVwxMlwxXDE1XDFcMjFcMVwyNCIrCi0gICAgIlwyXDBcMVwyNVwxXDQ3XDFcMzFcMlwwXDFcNTNcMlw2MFwxMFwwIisKLSAgICAiXDFcNDBcMVw0MVwxXDcxXDJcMFwxXDQ0XDZcMFwxXDY1XDFcMCIrCi0gICAgIlwxXDY1XDJcMFwxXDQ3XDJcMFwxXDUzXDJcNjBcMlwwXDFcNjYiKwotICAgICJcMVwwXDFcNjZcNlwwXDFcNjBcNFwwXDFcNzJcNFwwXDFcNjAiKwotICAgICJcM1wwXDFcNzNcMTJcMCI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQWN0aW9uKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzQ1NV07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBY3Rpb24oWlpfQUNUSU9OX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0FjdGlvbihTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX1JPV01BUCA9IHp6VW5wYWNrUm93TWFwKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX1JPV01BUF9QQUNLRURfMCA9Ci0gICAgIlwwXDBcMFw3NFwwXDE3MFwwXDI2NFwwXDM2MFwwXHUwMTJjXDBcdTAxNjhcMFx1MDFhNCIrCi0gICAgIlwwXHUwMWUwXDBcdTAyMWNcMFx1MDI1OFwwXHUwMjk0XDBcdTAyZDBcMFx1MDMwY1wwXHUwMzQ4XDBcdTAzODQiKwotICAgICJcMFx1MDNjMFwwXHUwM2ZjXDBcdTA0MzhcMFx1MDQ3NFwwXHUwNGIwXDBcdTA0ZWNcMFx1MDUyOFwwXHUwNTY0IisKLSAgICAiXDBcdTA1YTBcMFx1MDVkY1wwXHUwNjE4XDBcdTA2NTRcMFx1MDY5MFwwXHUwNmNjXDBcdTA3MDhcMFx1MDc0NCIrCi0gICAgIlwwXHUwNzgwXDBcdTA1YTBcMFx1MDdiY1wwXHUwN2Y4XDBcdTA1YTBcMFx1MDgzNFwwXHUwNWEwXDBcdTA4NzAiKwotICAgICJcMFx1MDhhY1wwXHUwOGU4XDBcdTA5MjRcMFx1MDVhMFwwXHUwOTYwXDBcdTA5OWNcMFx1MDlkOFwwXHUwYTE0IisKLSAgICAiXDBcdTBhNTBcMFx1MGE4Y1wwXHUwNWEwXDBcdTBhYzhcMFx1MGIwNFwwXHUwYjQwXDBcdTA1YTBcMFx1MDVhMCIrCi0gICAgIlwwXHUwYjdjXDBcdTBiYjhcMFx1MGJmNFwwXHUwNWEwXDBcdTBjMzBcMFx1MGM2Y1wwXHUwNWEwXDBcdTA1YTAiKwotICAgICJcMFx1MGNhOFwwXHUwY2U0XDBcdTBkMjBcMFx1MDVhMFwwXHUwZDVjXDBcdTA1YTBcMFx1MGQ5OFwwXHUwZGQ0IisKLSAgICAiXDBcdTBlMTBcMFx1MGU0Y1wwXHUwZTg4XDBcdTBlYzRcMFx1MGYwMFwwXHUwZjNjXDBcdTA1YTBcMFx1MDVhMCIrCi0gICAgIlwwXHUwZjc4XDBcdTBmYjRcMFx1MGZmMFwwXHUxMDJjXDBcdTEwNjhcMFx1MDVhMFwwXHUxMGE0XDBcdTEwZTAiKwotICAgICJcMFx1MTExY1wwXHUxMTU4XDBcdTExOTRcMFx1MTFkMFwwXHUwN2Y4XDBcdTA1YTBcMFx1MTIwY1wwXHUxMjQ4IisKLSAgICAiXDBcdTEyODRcMFx1MDdiY1wwXHUwNWEwXDBcdTA1YTBcMFx1MDVhMFwwXHUxMmMwXDBcdTA2MThcMFx1MTJmYyIrCi0gICAgIlwwXHUxMzM4XDBcdTA2Y2NcMFx1MTM3NFwwXHUwNzA4XDBcdTEzYjBcMFx1MTNlY1wwXHUxNDI4XDBcdTE0NjQiKwotICAgICJcMFx1MDc4MFwwXHUwNWEwXDBcdTE0YTBcMFx1MTRkY1wwXHUxNTE4XDBcdTE1NTRcMFx1MTU5MFwwXHUxNWNjIisKLSAgICAiXDBcdTE2MDhcMFx1MTY0NFwwXHUwODcwXDBcdTE2ODBcMFx1MDVhMFwwXHUwOGFjXDBcdTE2YmNcMFx1MTZmOCIrCi0gICAgIlwwXHUwOTYwXDBcdTE3MzRcMFx1MDVhMFwwXHUwOTljXDBcdTE3NzBcMFx1MTdhY1wwXHUwYTUwXDBcdTE3ZTgiKwotICAgICJcMFx1MTgyNFwwXHUwYjA0XDBcdTE4NjBcMFx1MTg5Y1wwXHUwYmI4XDBcdTE4ZDhcMFx1MTkxNFwwXHUwNWEwIisKLSAgICAiXDBcdTBjZTRcMFx1MTk1MFwwXHUxOThjXDBcdTBkZDRcMFx1MTljOFwwXHUwZTEwXDBcdTFhMDRcMFx1MDVhMCIrCi0gICAgIlwwXHUwZTRjXDBcdTFhNDBcMFx1MWE3Y1wwXHUwZjAwXDBcdTFhYjhcMFx1MWFmNFwwXHUxYjMwXDBcdTFiNmMiKwotICAgICJcMFx1MTExY1wwXHUwNWEwXDBcdTBmZjBcMFx1MDVhMFwwXHUxYmE4XDBcdTEwMmNcMFx1MWJlNFwwXHUwNWEwIisKLSAgICAiXDBcdTEwNjhcMFx1MWMyMFwwXHUxYzVjXDBcdTFjOThcMFx1MWNkNFwwXHUxMTU4XDBcdTFkMTBcMFx1MWQ0YyIrCi0gICAgIlwwXHUxZDg4XDBcdTExZDBcMFx1MWRjNFwwXHUwNWEwXDBcdTE2ZjhcMFx1MTI4NFwwXHUwNWEwXDBcdTFlMDAiKwotICAgICJcMFx1MWUzY1wwXHUwNWEwXDBcdTFlNzhcMFx1MWViNFwwXHUxZWYwXDBcdTFmMmNcMFx1MWY2OFwwXHUxZmE0IisKLSAgICAiXDBcdTFmZTBcMFx1MjAxY1wwXHUyMDU4XDBcdTIwOTRcMFx1MjBkMFwwXHUyMTBjXDBcdTA4NzBcMFx1MjE0OCIrCi0gICAgIlwwXHUyMTg0XDBcdTA4YWNcMFx1MjFjMFwwXHUyMWZjXDBcdTA5NjBcMFx1MjIzOFwwXHUyMjc0XDBcdTA5OWMiKwotICAgICJcMFx1MjJiMFwwXHUyMmVjXDBcdTIzMjhcMFx1MjM2NFwwXHUyM2EwXDBcdTIzZGNcMFx1MjQxOFwwXHUyNDU0IisKLSAgICAiXDBcdTBlMTBcMFx1MjQ5MFwwXHUyNGNjXDBcdTBlNGNcMFx1MjUwOFwwXHUyNTQ0XDBcdTI1ODBcMFx1MjViYyIrCi0gICAgIlwwXHUyNWY4XDBcdTEwMmNcMFx1MjYzNFwwXHUyNjcwXDBcdTEwNjhcMFx1MjZhY1wwXHUyNmU4XDBcdTI3MjQiKwotICAgICJcMFx1Mjc2MFwwXHUyNzljXDBcdTI3ZDhcMFx1MjgxNFwwXHUyODUwXDBcdTI4OGNcMFx1MjhjOFwwXHUwNWEwIisKLSAgICAiXDBcdTI5MDRcMFx1Mjk0MFwwXHUyOTdjXDBcdTI5YjhcMFx1MjlmNFwwXHUwNWEwXDBcdTJhMzBcMFx1MmE2YyIrCi0gICAgIlwwXHUyYWE4XDBcdTJhZTRcMFx1MmIyMFwwXHUyYjVjXDBcdTJiOThcMFx1MmJkNFwwXHUyYzEwXDBcdTJjNGMiKwotICAgICJcMFx1MmM4OFwwXHUyY2M0XDBcdTJkMDBcMFx1MmQzY1wwXHUyZDc4XDBcdTJkYjRcMFx1MmRmMFwwXHUyZTJjIisKLSAgICAiXDBcdTJlNjhcMFx1MmVhNFwwXHUyZWUwXDBcdTJmMWNcMFx1MmY1OFwwXHUyZjk0XDBcdTJmZDBcMFx1MDVhMCIrCi0gICAgIlwwXHUzMDBjXDBcdTMwNDhcMFx1MzA4NFwwXHUzMGMwXDBcdTMwZmNcMFx1MzEzOFwwXHUwNWEwXDBcdTMxNzQiKwotICAgICJcMFx1MzFiMFwwXHUwNWEwXDBcdTMxZWNcMFx1MzIyOFwwXHUzMjY0XDBcdTMyYTBcMFx1MzJkY1wwXHUzMzE4IisKLSAgICAiXDBcdTMzNTRcMFx1MzM5MFwwXHUzM2NjXDBcdTM0MDhcMFx1MDVhMFwwXHUzNDQ0XDBcdTM0ODBcMFx1MzRiYyIrCi0gICAgIlwwXHUzNGY4XDBcdTM1MzRcMFx1MzU3MFwwXHUzNWFjXDBcdTM1ZThcMFx1MzYyNFwwXHUzNjYwXDBcdTM2OWMiKwotICAgICJcMFx1MzZkOFwwXHUzNzE0XDBcdTM3NTBcMFx1Mzc4Y1wwXHUzN2M4XDBcdTM4MDRcMFx1MmY5NFwwXHUzODQwIisKLSAgICAiXDBcdTM4N2NcMFx1MDVhMFwwXHUzOGI4XDBcdTM4ZjRcMFx1MzkzMFwwXHUzOTZjXDBcdTM5YThcMFx1MzllNCIrCi0gICAgIlwwXHUwNWEwXDBcdTNhMjBcMFx1M2E1Y1wwXHUzYTk4XDBcdTNhZDRcMFx1M2IxMFwwXHUzYjRjXDBcdTNiODgiKwotICAgICJcMFx1M2JjNFwwXHUzYzAwXDBcdTMzNTRcMFx1M2MzY1wwXHUzYzc4XDBcdTNjYjRcMFx1M2NmMFwwXHUzZDJjIisKLSAgICAiXDBcdTNkNjhcMFx1M2RhNFwwXHUzZGUwXDBcdTNlMWNcMFx1M2U1OFwwXHUzZTk0XDBcdTNlZDBcMFx1M2YwYyIrCi0gICAgIlwwXHUzZjQ4XDBcdTNmODRcMFx1M2ZjMFwwXHUzZmZjXDBcdTQwMzhcMFx1NDA3NFwwXHUzN2M4XDBcdTQwYjAiKwotICAgICJcMFx1NDBlY1wwXHU0MTI4XDBcdTQxNjRcMFx1NDFhMFwwXHU0MWRjXDBcdTQyMThcMFx1MDVhMFwwXHU0MjU0IisKLSAgICAiXDBcdTQyOTBcMFx1NDJjY1wwXHU0MzA4XDBcdTQzNDRcMFx1NDM4MFwwXHU0M2JjXDBcdTQzZjhcMFx1NDQzNCIrCi0gICAgIlwwXHU0NDcwXDBcdTQ0YWNcMFx1NDRlOFwwXHU0NTI0XDBcdTQ1NjBcMFx1NDU5Y1wwXHU0NWQ4XDBcdTQ2MTQiKwotICAgICJcMFx1NDY1MFwwXHU0NjhjXDBcdTQ2YzhcMFx1NDcwNFwwXHU0NzQwXDBcdTQ3N2NcMFx1NDdiOFwwXHU0N2Y0IisKLSAgICAiXDBcdTQ4MzBcMFx1NDg2Y1wwXHU0OGE4XDBcdTQ4ZTRcMFx1NDkyMFwwXHU0OTVjXDBcdTQ5OThcMFx1NDlkNCIrCi0gICAgIlwwXHU0YTEwXDBcdTRhNGNcMFx1NGE4OFwwXHU0YWM0XDBcdTRiMDBcMFx1NGIzY1wwXHUwNWEwXDBcdTRiNzgiKwotICAgICJcMFx1NGJiNFwwXHU0YmYwXDBcdTRjMmNcMFx1NGM2OFwwXHU0Y2E0XDBcdTRjZTBcMFx1NGQxY1wwXHU0ZDU4IisKLSAgICAiXDBcdTMzY2NcMFx1NGQ5NFwwXHUzNDA4XDBcdTRkZDBcMFx1NGUwY1wwXHU0ZTQ4XDBcdTRlODRcMFx1NGVjMCIrCi0gICAgIlwwXHU0ZWZjXDBcdTRmMzhcMFx1NGY3NFwwXHU0ZmIwXDBcdTRmZWNcMFx1Mzg0MFwwXHU1MDI4XDBcdTM4N2MiKwotICAgICJcMFx1NTA2NFwwXHU1MGEwXDBcdTUwZGNcMFx1NTExOFwwXHU1MTU0XDBcdTUxOTBcMFx1NTFjY1wwXHU1MjA4IisKLSAgICAiXDBcdTUyNDRcMFx1NTI4MFwwXHU1MmJjXDBcdTA1YTBcMFx1NTJmOFwwXHU1MzM0XDBcdTUzNzBcMFx1NTNhYyIrCi0gICAgIlwwXHUwNWEwXDBcdTUzZThcMFx1NTQyNFwwXHU1NDYwXDBcdTA1YTBcMFx1NTQ5Y1wwXHU1NGQ4XDBcdTU1MTQiKwotICAgICJcMFx1NTU1MFwwXHU1NThjXDBcdTU1YzhcMFx1NTYwNFwwXHU1NjQwXDBcdTU2N2NcMFx1NTZiOCI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrUm93TWFwKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzQ1NV07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tSb3dNYXAoWlpfUk9XTUFQX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja1Jvd01hcChTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgaGlnaCA9IHBhY2tlZC5jaGFyQXQoaSsrKSA8PCAxNjsKLSAgICAgIHJlc3VsdFtqKytdID0gaGlnaCB8IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9UUkFOUyA9IHp6VW5wYWNrVHJhbnMoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfVFJBTlNfUEFDS0VEXzAgPQotICAgICJcMlwzMVwxXDMyXDFcMzNcMVwzNFwxXDMxXDFcMzRcMVwzMlwxXDMxIisKLSAgICAiXDFcMzRcMVwzMVwxXDM1XDFcMzFcMVwzNlwxXDMxXDJcMzRcMVwzMSIrCi0gICAgIlwxXDM3XDNcMzJcMVwzMVwxXDMyXDFcNDBcMlwzMVwxXDQxXDFcMzEiKwotICAgICJcMVw0MlwxXDQzXDJcMzFcMVw0NFwxXDQ1XDExXDMyXDFcMzFcNFwzMiIrCi0gICAgIlwxXDMxXDNcMzJcMVw0NlwzXDMyXDFcNDdcNlwzMVwxXDM0XDFcNTAiKwotICAgICJcMVwzNFwxXDMxXDFcNTFcMVwzNFwxXDMxXDFcNTJcM1wzMVwyXDM0IisKLSAgICAiXDdcMzFcMVw1M1w0XDMxXDFcNDJcMVw0M1wyXDMxXDFcNDRcMzZcMzEiKwotICAgICJcMVwzNFwxXDMxXDFcMzRcMlwzMVwxXDM0XDFcMzFcMVw1MlwzXDMxIisKLSAgICAiXDJcMzRcN1wzMVwxXDUzXDRcMzFcMVw0MlwxXDQzXDJcMzFcMVw0NCIrCi0gICAgIlwxMlwzMVwxXDU0XDIzXDMxXDFcMzRcMVw1NVwxXDM0XDFcMzFcMVw1NiIrCi0gICAgIlwxXDM0XDFcMzFcMVw1MlwzXDMxXDJcMzRcMlwzMVwxXDU3XDRcMzEiKwotICAgICJcMVw1M1w0XDMxXDFcNDJcMVw0M1wyXDMxXDFcNDRcMTJcMzFcMVw1NCIrCi0gICAgIlwyMVwzMVwxXDYwXDFcNjFcMVwzNFwxXDMxXDFcMzRcMVw2MFwxXDMxIisKLSAgICAiXDFcMzRcMVwzMVwxXDYyXDNcMzFcMlwzNFwyXDMxXDNcNjBcMVwzMSIrCi0gICAgIlwxXDYwXDFcNTNcNFwzMVwxXDQyXDFcNDNcMlwzMVwxXDQ0XDFcMzEiKwotICAgICJcMTFcNjBcMVw1NFw0XDYwXDFcMzFcM1w2MFwxXDMxXDNcNjBcN1wzMSIrCi0gICAgIlwxXDM0XDFcMzFcMVwzNFwyXDMxXDFcMzRcMVwzMVwxXDUyXDNcMzEiKwotICAgICJcMlwzNFw3XDMxXDFcNTNcNFwzMVwxXDQyXDFcNDNcMlwzMVwxXDQ0IisKLSAgICAiXDEyXDMxXDFcNTRcNFwzMVwxXDYzXDE0XDMxXDFcNjRcMVw2NVwxXDM0IisKLSAgICAiXDFcMzFcMVwzNFwxXDY0XDFcMzFcMVwzNFwxXDMxXDFcNjZcM1wzMSIrCi0gICAgIlwyXDM0XDJcMzFcM1w2NFwxXDMxXDFcNjRcMVw1M1w0XDMxXDFcNDIiKwotICAgICJcMVw0M1wyXDMxXDFcNDRcMVwzMVwxMVw2NFwxXDMxXDRcNjRcMVwzMSIrCi0gICAgIlwzXDY0XDFcMzFcM1w2NFw3XDMxXDFcMzRcMVwzMVwxXDM0XDJcMzEiKwotICAgICJcMVwzNFwxXDMxXDFcNTJcM1wzMVwyXDM0XDdcMzFcMVw1M1wzXDMxIisKLSAgICAiXDFcNjdcMVw0MlwxXDQzXDJcMzFcMVw0NFwxN1wzMVwxXDcwXDE0XDMxIisKLSAgICAiXDFcNzFcMVw3MlwxXDM0XDFcMzFcMVwzNFwxXDcxXDFcMzFcMVwzNCIrCi0gICAgIlwxXDMxXDFcNzNcM1wzMVwyXDM0XDJcMzFcM1w3MVwxXDMxXDFcNzEiKwotICAgICJcMVw1M1wzXDMxXDFcNzRcMVw0MlwxXDQzXDJcMzFcMVw0NFwxXDMxIisKLSAgICAiXDExXDcxXDFcMzFcNFw3MVwxXDMxXDNcNzFcMVw3NVwzXDcxXDdcMzEiKwotICAgICJcMVwzNFwxXDMxXDFcMzRcMlwzMVwxXDM0XDFcMzFcMVw1MlwzXDMxIisKLSAgICAiXDJcMzRcN1wzMVwxXDUzXDNcMzFcMVw3NFwxXDQyXDFcNDNcMlwzMSIrCi0gICAgIlwxXDQ0XDM0XDMxXDFcMzJcMVwzM1wxXDM0XDFcMzFcMVwzNFwxXDMyIisKLSAgICAiXDFcMzFcMVwzNFwxXDMxXDFcMzVcMVwzMVwxXDM2XDFcMzFcMlwzNCIrCi0gICAgIlwxXDMxXDFcMzdcM1wzMlwxXDMxXDFcMzJcMVw1M1w0XDMxXDFcNDIiKwotICAgICJcMVw0M1wyXDMxXDFcNDRcMVw0NVwxMVwzMlwxXDMxXDRcMzJcMVwzMSIrCi0gICAgIlwzXDMyXDFcNDZcM1wzMlwxXDQ3XDZcMzFcMVw3NlwxXDMxXDFcNzYiKwotICAgICJcMlwzMVwxXDc2XDFcMzFcMVw1MlwxXDc3XDFcMzZcMVwzMVwyXDc2IisKLSAgICAiXDFcMzFcMVwzN1w1XDMxXDFcNTNcMVwzMVwxXDc3XDFcMzFcMVw3NCIrCi0gICAgIlwxXDQyXDFcNDNcMlwzMVwxXDQ0XDFcNDVcMTZcMzFcMVwxMDBcM1wzMSIrCi0gICAgIlwxXDQ2XDNcMzFcMVw0N1w0XDMxXDFcMTAxXDFcMTAyXDFcMzRcMVwzMSIrCi0gICAgIlwxXDM0XDFcMTAxXDFcMzFcMVwzNFwxXDMxXDFcMTAzXDNcMzFcMlwzNCIrCi0gICAgIlwyXDMxXDNcMTAxXDFcMzFcMVwxMDFcMVw1M1w0XDMxXDFcNDJcMVw0MyIrCi0gICAgIlwyXDMxXDFcNDRcMVwzMVwxMVwxMDFcMVwzMVw0XDEwMVwxXDMxXDNcMTAxIisKLSAgICAiXDFcMzFcM1wxMDFcN1wzMVwxXDM0XDFcMzFcMVwzNFwyXDMxXDFcMzQiKwotICAgICJcMVwzMVwxXDUyXDNcMzFcMlwzNFw3XDMxXDFcNTNcNFwzMVwxXDQyIisKLSAgICAiXDFcNDNcMVwxMDRcMVwzMVwxXDQ0XDMwXDMxXDFcMTA1XDFcMTA2XDJcMzEiKwotICAgICJcMVwxMDdcMVwxMTBcMVwzNFwxXDExMVwxXDM0XDFcMTA3XDFcMTEyXDFcMzQiKwotICAgICJcMVwzMVwxXDExM1wzXDMxXDJcMzRcMlwzMVwzXDEwN1wxXDMxXDFcMTA3IisKLSAgICAiXDFcNTNcNFwzMVwxXDQyXDFcNDNcMlwzMVwxXDQ0XDFcMzFcMTFcMTA3IisKLSAgICAiXDFcMzFcNFwxMDdcMVwzMVwzXDEwN1wxXDMxXDNcMTA3XDdcMzFcMVwzNCIrCi0gICAgIlwxXDMxXDFcMzRcMlwzMVwxXDM0XDFcMzFcMVw1MlwzXDMxXDJcMzQiKwotICAgICJcN1wzMVwxXDUzXDRcMzFcMVw0MlwxXDQzXDJcMzFcMVw0NFwzMVwzMSIrCi0gICAgIlwxXDEwNlwyXDMxXDFcMTE0XDFcMTE1XDFcMzRcMVwzMVwxXDM0XDFcMTE0IisKLSAgICAiXDFcMzFcMVwzNFwxXDMxXDFcMTE2XDNcMzFcMlwzNFwyXDMxXDNcMTE0IisKLSAgICAiXDFcMzFcMVwxMTRcMVw0MFwyXDMxXDFcNDFcMVwzMVwxXDQyXDFcNDMiKwotICAgICJcMlwzMVwxXDQ0XDFcMzFcMTFcMTE0XDFcMTE3XDRcMTE0XDFcMzFcM1wxMTQiKwotICAgICJcMVwzMVwzXDExNFw3XDMxXDFcMzRcMVwzMVwxXDM0XDJcMzFcMVwzNCIrCi0gICAgIlwxXDMxXDFcNTJcM1wzMVwyXDM0XDdcMzFcMVw0MFwyXDMxXDFcNDEiKwotICAgICJcMVwzMVwxXDQyXDFcNDNcMlwzMVwxXDQ0XDEyXDMxXDFcMTE3XDEwXDMxIisKLSAgICAiXDFcMTIwXDdcMzFcMVwxMjFcMVwxMjJcMVwxMjNcMVwzNFwxXDEyNFwxXDM0IisKLSAgICAiXDFcMTIyXDFcMTI1XDFcMzRcMVwxMjZcMVwxMjdcMVwxMzBcMVwxMzFcMVwzMSIrCi0gICAgIlwyXDM0XDFcMzFcMVwxMzJcMVwxMzNcMlwxMjJcMVwzMVwxXDEyMlwxXDQwIisKLSAgICAiXDJcMzFcMVw0MVwxXDMxXDFcNDJcMVw0M1wxXDMxXDFcMTM0XDFcMTM1IisKLSAgICAiXDFcMzFcMTFcMTIyXDFcMTE3XDRcMTIyXDFcMTM2XDNcMTIyXDFcMzFcM1wxMjIiKwotICAgICJcNFwzMVwxXDEyMVwxXDEyMlwxXDEyM1wxXDEzN1wxXDEyNFwxXDEzN1wxXDEyMiIrCi0gICAgIlwxXDEyNVwxXDEzN1wxXDEyNlwxXDEyN1wxXDEzMFwxXDEzMVwxXDMxXDJcMTM3IisKLSAgICAiXDFcMzFcMVwxMzJcMVwxMzNcMlwxMjJcMVwzMVwxXDEyMlwxXDQwXDJcMzEiKwotICAgICJcMVw0MVwxXDMxXDFcNDJcMVw0M1wxXDMxXDFcMTM0XDFcMTM1XDFcMzEiKwotICAgICJcMTFcMTIyXDFcMTE3XDRcMTIyXDFcMTM2XDNcMTIyXDFcMzFcM1wxMjJcN1wzMSIrCi0gICAgIlwxXDM0XDFcMzFcMVwzNFwyXDMxXDFcMzRcMVwzMVwxXDE0MFwzXDMxIisKLSAgICAiXDJcMzRcN1wzMVwxXDUzXDFcMTQxXDNcMzFcMVw0MlwxXDE0MlwxXDE0MyIrCi0gICAgIlwxXDE0NFwxXDQ0XDM2XDMxXDFcMzRcMVwzMVwxXDM0XDJcMzFcMVwzNCIrCi0gICAgIlwxXDMxXDFcNTJcM1wzMVwyXDM0XDdcMzFcMVw1M1wxXDE0MVwzXDMxIisKLSAgICAiXDFcNDJcMVw0M1wyXDMxXDFcNDRcMzZcMzFcMVwzNFwxXDMxXDFcMzQiKwotICAgICJcMlwzMVwxXDM0XDFcMzFcMVw1MlwzXDMxXDJcMzRcN1wzMVwxXDUzIisKLSAgICAiXDRcMzFcMVwxNDVcMVw0M1wyXDMxXDFcNDRcMzZcMzFcMVwzNFwxXDMxIisKLSAgICAiXDFcMzRcMlwzMVwxXDM0XDFcMzFcMVwxNDZcM1wzMVwyXDM0XDdcMzEiKwotICAgICJcMVw1M1w1XDMxXDFcNDNcMlwzMVwxXDQ0XDMyXDMxXDc1XDBcMlwzMiIrCi0gICAgIlwxXDE0N1wzXDBcMVwzMlwzXDBcMVwzMlw3XDBcM1wzMlwxXDAiKwotICAgICJcMVwzMlwxM1wwXDExXDMyXDFcMFw0XDMyXDFcMFwzXDMyXDFcMCIrCi0gICAgIlwzXDMyXDRcMFwxXDE1MFwyXDMyXDFcMFwyXDMyXDFcMTUwXDFcMzIiKwotICAgICJcMVwwXDVcMzJcMlwwXDIyXDMyXDFcMTUwXDJcMzJcMVwxNTBcMlwzMiIrCi0gICAgIlwxXDE1MFwxMFwzMlwxXDE1MFwzXDMyXDFcMTUwXDVcMzJcNFwwXDFcMzQiKwotICAgICJcMVwwXDFcMzRcMlwwXDFcMzRcNVwwXDJcMzRcNTRcMFwyXDMyIisKLSAgICAiXDFcMTQ3XDNcMFwxXDMyXDNcMFwxXDE1MVw3XDBcM1wzMlwxXDAiKwotICAgICJcMVwzMlwxM1wwXDExXDMyXDFcMFw0XDMyXDFcMFwzXDMyXDFcMCIrCi0gICAgIlwzXDMyXDRcMFwyXDE1MlwxXDE1M1wzXDBcMVwxNTJcM1wwXDFcMTUyIisKLSAgICAiXDdcMFwzXDE1MlwxXDBcMVwxNTJcMTNcMFwxMVwxNTJcMVwwXDRcMTUyIisKLSAgICAiXDFcMFwzXDE1MlwxXDBcM1wxNTJcNFwwXDJcMTU0XDFcMTU1XDNcMCIrCi0gICAgIlwxXDE1NFwzXDBcMVwxNTRcN1wwXDNcMTU0XDFcMFwxXDE1NFwxM1wwIisKLSAgICAiXDExXDE1NFwxXDBcNFwxNTRcMVwwXDNcMTU0XDFcMFwzXDE1NFwxMVwwIisKLSAgICAiXDFcMTU2XDJcMFwxXDE1Nlw1XDBcMlwxNTZcMTBcMFwxXDE1N1w2XDAiKwotICAgICJcMVwxNjBcNDFcMFwxXDE2MVwyXDBcMVwxNjFcNVwwXDJcMTYxXDEzXDAiKwotICAgICJcMVwxNjJcMTAyXDBcMlwxNjNcMTBcMFwxXDE2NFwxXDE2NVwxXDE2Nlw2XDAiKwotICAgICJcMlwxNjdcNDZcMFwxXDE3MFwzM1wwXDFcMTcxXDFcMTcyXDNcMFwxXDE3MSIrCi0gICAgIlwzXDBcMVwxNzFcN1wwXDNcMTcxXDFcMFwxXDE3MVwxM1wwXDExXDE3MSIrCi0gICAgIlwxXDBcNFwxNzFcMVwwXDNcMTcxXDFcMFwzXDE3MVw0XDBcMlwxNzMiKwotICAgICJcMVwxNzRcMVwwXDFcMTc1XDExXDE3M1wyXDBcNTNcMTczXDFcMFwyXDE3NiIrCi0gICAgIlwxXDE3N1wxXDBcM1wxNzZcMVwxNzVcNlwxNzZcMlwwXDUzXDE3NlwxM1wwIisKLSAgICAiXDFcMjAwXDEyMFwwXDFcMTYwXDM0XDBcMlwyMDFcMVwyMDJcMVwwXDFcMjAzIisKLSAgICAiXDExXDIwMVwyXDBcNTNcMjAxXDFcMFwyXDIwNFwxXDIwNVwxXDBcM1wyMDQiKwotICAgICJcMVwyMDNcNlwyMDRcMlwwXDUzXDIwNFwyNFwwXDFcMjA2XDUwXDBcMlw2MCIrCi0gICAgIlwxXDIwN1wzXDBcMVw2MFwzXDBcMVw2MFw3XDBcM1w2MFwxXDAiKwotICAgICJcMVw2MFwxM1wwXDExXDYwXDFcMFw0XDYwXDFcMFwzXDYwXDFcMCIrCi0gICAgIlwzXDYwXDRcMFwxXDIxMFwyXDYwXDFcMFwyXDYwXDFcMjEwXDFcNjAiKwotICAgICJcMVwwXDVcNjBcMlwwXDIyXDYwXDFcMjEwXDJcNjBcMVwyMTBcMlw2MCIrCi0gICAgIlwxXDIxMFwxMFw2MFwxXDIxMFwzXDYwXDFcMjEwXDVcNjBcMVwwXDJcNjAiKwotICAgICJcMVwyMDdcM1wwXDFcNjBcM1wwXDFcMjExXDdcMFwzXDYwXDFcMCIrCi0gICAgIlwxXDYwXDEzXDBcMTFcNjBcMVwwXDRcNjBcMVwwXDNcNjBcMVwwIisKLSAgICAiXDNcNjBcNFwwXDJcNjRcMVwyMTJcM1wwXDFcNjRcM1wwXDFcNjQiKwotICAgICJcN1wwXDNcNjRcMVwwXDFcNjRcMTNcMFwxMVw2NFwxXDBcNFw2NCIrCi0gICAgIlwxXDBcM1w2NFwxXDBcM1w2NFw0XDBcMVwyMTNcMlw2NFwxXDAiKwotICAgICJcMlw2NFwxXDIxM1wxXDY0XDFcMFw1XDY0XDJcMFwyMlw2NFwxXDIxMyIrCi0gICAgIlwyXDY0XDFcMjEzXDJcNjRcMVwyMTNcMTBcNjRcMVwyMTNcM1w2NFwxXDIxMyIrCi0gICAgIlw1XDY0XDFcMFwyXDY0XDFcMjEyXDNcMFwxXDY0XDNcMFwxXDIxNCIrCi0gICAgIlw3XDBcM1w2NFwxXDBcMVw2NFwxM1wwXDExXDY0XDFcMFw0XDY0IisKLSAgICAiXDFcMFwzXDY0XDFcMFwzXDY0XDRcMFwyXDcxXDFcMjE1XDNcMCIrCi0gICAgIlwxXDcxXDNcMFwxXDcxXDdcMFwzXDcxXDFcMFwxXDcxXDEzXDAiKwotICAgICJcMTFcNzFcMVwwXDRcNzFcMVwwXDNcNzFcMVwwXDNcNzFcNFwwIisKLSAgICAiXDFcMjE2XDJcNzFcMVwwXDJcNzFcMVwyMTZcMVw3MVwxXDBcNVw3MSIrCi0gICAgIlwyXDBcMjJcNzFcMVwyMTZcMlw3MVwxXDIxNlwyXDcxXDFcMjE2XDEwXDcxIisKLSAgICAiXDFcMjE2XDNcNzFcMVwyMTZcNVw3MVwxXDBcMlw3MVwxXDIxNVwzXDAiKwotICAgICJcMVw3MVwzXDBcMVwyMTdcN1wwXDNcNzFcMVwwXDFcNzFcMTNcMCIrCi0gICAgIlwxMVw3MVwxXDBcNFw3MVwxXDBcM1w3MVwxXDBcM1w3MVw1XDAiKwotICAgICJcMVw3MVwxXDIxNVwzXDBcMVw3MVwzXDBcMVw3MVw3XDBcM1w3MSIrCi0gICAgIlwxXDBcMVw3MVwxM1wwXDExXDcxXDFcMFw0XDcxXDFcMFwzXDcxIisKLSAgICAiXDFcMFwzXDcxXDNcMFw0XDIyMFwxXDc2XDFcMjIwXDFcNzZcMlwyMjAiKwotICAgICJcMVw3NlwyXDIyMFwxXDBcMlwyMjBcMlw3NlwxMVwyMjBcMVwwXDFcMjIwIisKLSAgICAiXDFcMFwzN1wyMjBcMVwwXDJcMTAxXDFcMjIxXDNcMFwxXDEwMVwzXDAiKwotICAgICJcMVwxMDFcN1wwXDNcMTAxXDFcMFwxXDEwMVwxM1wwXDExXDEwMVwxXDAiKwotICAgICJcNFwxMDFcMVwwXDNcMTAxXDFcMFwzXDEwMVw0XDBcMVwyMjJcMlwxMDEiKwotICAgICJcMVwwXDJcMTAxXDFcMjIyXDFcMTAxXDFcMFw1XDEwMVwyXDBcMjJcMTAxIisKLSAgICAiXDFcMjIyXDJcMTAxXDFcMjIyXDJcMTAxXDFcMjIyXDEwXDEwMVwxXDIyMlwzXDEwMSIrCi0gICAgIlwxXDIyMlw1XDEwMVwxXDBcMlwxMDFcMVwyMjFcM1wwXDFcMTAxXDNcMCIrCi0gICAgIlwxXDIyM1w3XDBcM1wxMDFcMVwwXDFcMTAxXDEzXDBcMTFcMTAxXDFcMCIrCi0gICAgIlw0XDEwMVwxXDBcM1wxMDFcMVwwXDNcMTAxXDQyXDBcMVwxMDRcMzVcMCIrCi0gICAgIlwyXDEwN1wxXDIyNFwzXDBcMVwxMDdcM1wwXDFcMTA3XDdcMFwzXDEwNyIrCi0gICAgIlwxXDBcMVwxMDdcMTNcMFwxMVwxMDdcMVwwXDRcMTA3XDFcMFwzXDEwNyIrCi0gICAgIlwxXDBcM1wxMDdcNFwwXDFcMjI1XDJcMTA3XDFcMFwyXDEwN1wxXDIyNSIrCi0gICAgIlwxXDEwN1wxXDBcNVwxMDdcMlwwXDIyXDEwN1wxXDIyNVwyXDEwN1wxXDIyNSIrCi0gICAgIlwyXDEwN1wxXDIyNVwxMFwxMDdcMVwyMjVcM1wxMDdcMVwyMjVcNVwxMDdcMVwwIisKLSAgICAiXDJcMjI2XDFcMjI3XDFcMFwxXDIzMFwxMVwyMjZcMlwwXDUzXDIyNlwxXDAiKwotICAgICJcMlwyMzFcMVwyMzJcMVwwXDNcMjMxXDFcMjMwXDZcMjMxXDJcMFw1M1wyMzEiKwotICAgICJcMVwwXDJcMTA3XDFcMjI0XDNcMFwxXDEwN1wzXDBcMVwyMzNcN1wwIisKLSAgICAiXDNcMTA3XDFcMFwxXDEwN1wxM1wwXDExXDEwN1wxXDBcNFwxMDdcMVwwIisKLSAgICAiXDNcMTA3XDFcMFwzXDEwN1w0XDBcMlwxMTRcMVwyMzRcM1wwXDFcMTE0IisKLSAgICAiXDNcMFwxXDExNFw3XDBcM1wxMTRcMVwwXDFcMTE0XDEzXDBcMTFcMTE0IisKLSAgICAiXDFcMFw0XDExNFwxXDBcM1wxMTRcMVwwXDNcMTE0XDRcMFwxXDIzNSIrCi0gICAgIlwyXDExNFwxXDBcMlwxMTRcMVwyMzVcMVwxMTRcMVwwXDVcMTE0XDJcMCIrCi0gICAgIlwyMlwxMTRcMVwyMzVcMlwxMTRcMVwyMzVcMlwxMTRcMVwyMzVcMTBcMTE0XDFcMjM1IisKLSAgICAiXDNcMTE0XDFcMjM1XDVcMTE0XDFcMFwyXDExNFwxXDIzNFwzXDBcMVwxMTQiKwotICAgICJcM1wwXDFcMjM2XDdcMFwzXDExNFwxXDBcMVwxMTRcMTNcMFwxMVwxMTQiKwotICAgICJcMVwwXDRcMTE0XDFcMFwzXDExNFwxXDBcM1wxMTRcNFwwXDFcMTIxIisKLSAgICAiXDFcMjM3XDFcMjQwXDNcMFwxXDIzN1wzXDBcMVwyMzdcMVwwXDFcMjQxIisKLSAgICAiXDVcMFwzXDIzN1wxXDBcMVwyMzdcMVwwXDFcMjQyXDExXDBcMTFcMjM3IisKLSAgICAiXDFcMFw0XDIzN1wxXDBcM1wyMzdcMVwwXDNcMjM3XDRcMFwyXDEyMiIrCi0gICAgIlwxXDI0M1wzXDBcMVwxMjJcM1wwXDFcMTIyXDdcMFwzXDEyMlwxXDI0NCIrCi0gICAgIlwxXDEyMlwxM1wwXDExXDEyMlwxXDBcNFwxMjJcMVwwXDNcMTIyXDFcMCIrCi0gICAgIlwzXDEyMlw0XDBcMVwyNDVcMlwxMjJcMVwwXDJcMTIyXDFcMjQ1XDFcMTIyIisKLSAgICAiXDFcMFw1XDEyMlwyXDBcMjJcMTIyXDFcMjQ1XDJcMTIyXDFcMjQ1XDJcMTIyIisKLSAgICAiXDFcMjQ1XDEwXDEyMlwxXDI0NVwzXDEyMlwxXDI0NVw1XDEyMlwxXDBcMlwyNDYiKwotICAgICJcMVwyNDdcMVwwXDFcMjUwXDExXDI0NlwyXDBcNTNcMjQ2XDFcMFwyXDI1MSIrCi0gICAgIlwxXDI1MlwxXDBcM1wyNTFcMVwyNTBcNlwyNTFcMlwwXDUzXDI1MVwxXDAiKwotICAgICJcMVwyNTNcMVwxMjJcMVwyNDNcM1wwXDFcMTIyXDNcMFwxXDI1NFwxXDAiKwotICAgICJcMVwyNDFcNVwwXDNcMTIyXDFcMjQ0XDFcMTIyXDEzXDBcMTFcMTIyXDFcMCIrCi0gICAgIlw0XDEyMlwxXDBcM1wxMjJcMVwwXDNcMTIyXDRcMFwxXDEyMVwxM1wwIisKLSAgICAiXDFcMjQxXDU3XDBcMVwyNTVcNzNcMFwyXDI1NlwxXDI1N1wzXDBcMVwyNTYiKwotICAgICJcM1wwXDFcMjU2XDdcMFwzXDI1NlwxXDBcMVwyNTZcMTNcMFwxMVwyNTYiKwotICAgICJcMVwwXDRcMjU2XDFcMFwzXDI1NlwxXDBcM1wyNTZcNFwwXDJcMTIyIisKLSAgICAiXDFcMjQzXDNcMFwxXDEyMlwzXDBcMVwxMjJcMVwyNjBcNlwwXDFcMTIyIisKLSAgICAiXDFcMjYxXDFcMTIyXDFcMjQ0XDFcMTIyXDEzXDBcMTFcMTIyXDFcMFw0XDEyMiIrCi0gICAgIlwxXDBcM1wxMjJcMVwwXDNcMTIyXDdcMFwxXDI2MlwxXDBcMVwyNjIiKwotICAgICJcMlwwXDFcMjYyXDVcMFwyXDI2MlwzNFwwXDFcMjYzXDE2XDBcNFwyNjQiKwotICAgICJcMVwxMzdcMVwyNjRcMVwxMzdcMlwyNjRcMVwxMzdcNVwyNjRcMlwxMzdcMTRcMjY0IisKLSAgICAiXDFcMFwxNlwyNjRcMVwwXDE3XDI2NFwxM1wwXDFcMjY1XDY2XDBcMVwyNjYiKwotICAgICJcMlwwXDFcMjY2XDVcMFwyXDI2NlwxMVwwXDFcMjY3XDU0XDBcMVwyNzAiKwotICAgICJcNjFcMFwxXDI3MVwxXDMyXDFcMTQ3XDFcMzJcMVwwXDFcMzJcMVwyNzEiKwotICAgICJcMVwwXDFcMzJcMVwwXDFcMzJcM1wwXDJcMzJcMlwwXDNcMzIiKwotICAgICJcMVwwXDFcMzJcMTNcMFwxXDI3MVwyXDMyXDFcMjcxXDJcMzJcMVwyNzEiKwotICAgICJcMlwzMlwxXDBcNFwzMlwxXDBcMVwyNzFcMlwzMlwxXDBcMVwyNzEiKwotICAgICJcMlwzMlw0XDBcMlwzMlwxXDE0N1wzXDBcMVwzMlwzXDBcMVwzMiIrCi0gICAgIlw3XDBcM1wzMlwxXDBcMVwzMlwyXDBcMVwyNzJcMTBcMFwxMVwzMiIrCi0gICAgIlwxXDBcNFwzMlwxXDBcM1wzMlwxXDBcM1wzMlw0XDBcMVwyNzMiKwotICAgICJcMlwxNTJcMVwwXDJcMTUyXDFcMjczXDFcMTUyXDFcMFw1XDE1MlwyXDAiKwotICAgICJcMjJcMTUyXDFcMjczXDJcMTUyXDFcMjczXDJcMTUyXDFcMjczXDEwXDE1MlwxXDI3MyIrCi0gICAgIlwzXDE1MlwxXDI3M1w1XDE1MlwxXDBcMVwyNzRcMlwxNTRcMVwwXDJcMTU0IisKLSAgICAiXDFcMjc0XDFcMTU0XDFcMFw1XDE1NFwyXDBcMjJcMTU0XDFcMjc0XDJcMTU0IisKLSAgICAiXDFcMjc0XDJcMTU0XDFcMjc0XDEwXDE1NFwxXDI3NFwzXDE1NFwxXDI3NFw1XDE1NCIrCi0gICAgIlw2XDBcMVwxNTZcMlwwXDFcMTU2XDVcMFwyXDE1NlwxMFwwXDFcMTU3IisKLSAgICAiXDUwXDBcMVwxNTdcMlwwXDFcMTU3XDVcMFwyXDE1N1w2NlwwXDFcMjc1IisKLSAgICAiXDEyNVwwXDFcMjc2XDEwNFwwXDFcMjc3XDY2XDBcMlwzMDBcNjdcMFwyXDMwMSIrCi0gICAgIlwxMDRcMFwxXDMwMlwxM1wwXDQyXDE3MFwxXDMwM1wzMVwxNzBcMVwwXDJcMTcxIisKLSAgICAiXDFcMTcyXDNcMFwxXDE3MVwzXDBcMVwxNzFcN1wwXDNcMTcxXDFcMzA0IisKLSAgICAiXDFcMTcxXDEzXDBcMTFcMTcxXDFcMFw0XDE3MVwxXDBcM1wxNzFcMVwwIisKLSAgICAiXDNcMTcxXDRcMFwxXDMwNVwyXDE3MVwxXDBcMlwxNzFcMVwzMDVcMVwxNzEiKwotICAgICJcMVwwXDVcMTcxXDJcMFwyMlwxNzFcMVwzMDVcMlwxNzFcMVwzMDVcMlwxNzEiKwotICAgICJcMVwzMDVcMTBcMTcxXDFcMzA1XDNcMTcxXDFcMzA1XDVcMTcxXDFcMFwxXDMwNiIrCi0gICAgIlwxXDE3M1wxXDE3NFwxXDE3M1wxXDMwN1wxXDE3M1wxXDMwNlwxMFwxNzNcMVwzMTAiKwotICAgICJcMjJcMTczXDFcMzA2XDJcMTczXDFcMzA2XDJcMTczXDFcMzA2XDEwXDE3M1wxXDMwNiIrCi0gICAgIlwzXDE3M1wxXDMwNlw1XDE3M1wxXDBcMVwzMTFcMVwxNzZcMVwxNzdcM1wxNzYiKwotICAgICJcMVwzMTFcMVwzMTJcN1wxNzZcMVwzMTNcMjJcMTc2XDFcMzExXDJcMTc2XDFcMzExIisKLSAgICAiXDJcMTc2XDFcMzExXDEwXDE3NlwxXDMxMVwzXDE3NlwxXDMxMVw1XDE3NlwzMlwwIisKLSAgICAiXDFcMjcyXDQyXDBcMVwzMTRcMVwyMDFcMVwyMDJcMVwyMDFcMVwzMTVcMVwyMDEiKwotICAgICJcMVwzMTRcMTBcMjAxXDFcMzE2XDIyXDIwMVwxXDMxNFwyXDIwMVwxXDMxNFwyXDIwMSIrCi0gICAgIlwxXDMxNFwxMFwyMDFcMVwzMTRcM1wyMDFcMVwzMTRcNVwyMDFcMVwwXDFcMzE3IisKLSAgICAiXDFcMjA0XDFcMjA1XDNcMjA0XDFcMzE3XDFcMzIwXDdcMjA0XDFcMzIxXDIyXDIwNCIrCi0gICAgIlwxXDMxN1wyXDIwNFwxXDMxN1wyXDIwNFwxXDMxN1wxMFwyMDRcMVwzMTdcM1wyMDQiKwotICAgICJcMVwzMTdcNVwyMDRcMjVcMFwxXDMyMlw0N1wwXDFcMzIzXDFcNjBcMVwyMDciKwotICAgICJcMVw2MFwxXDBcMVw2MFwxXDMyM1wxXDBcMVw2MFwxXDBcMVw2MCIrCi0gICAgIlwzXDBcMlw2MFwyXDBcM1w2MFwxXDBcMVw2MFwxM1wwXDFcMzIzIisKLSAgICAiXDJcNjBcMVwzMjNcMlw2MFwxXDMyM1wyXDYwXDFcMFw0XDYwXDFcMCIrCi0gICAgIlwxXDMyM1wyXDYwXDFcMFwxXDMyM1wyXDYwXDRcMFwyXDYwXDFcMjA3IisKLSAgICAiXDNcMFwxXDYwXDNcMFwxXDYwXDdcMFwzXDYwXDFcMFwxXDYwIisKLSAgICAiXDJcMFwxXDI3MlwxMFwwXDExXDYwXDFcMFw0XDYwXDFcMFwzXDYwIisKLSAgICAiXDFcMFwzXDYwXDRcMFwxXDMyNFwxXDY0XDFcMjEyXDFcNjRcMVwwIisKLSAgICAiXDFcNjRcMVwzMjRcMVwwXDFcNjRcMVwwXDFcNjRcM1wwXDJcNjQiKwotICAgICJcMlwwXDNcNjRcMVwwXDFcNjRcMTNcMFwxXDMyNFwyXDY0XDFcMzI0IisKLSAgICAiXDJcNjRcMVwzMjRcMlw2NFwxXDBcNFw2NFwxXDBcMVwzMjRcMlw2NCIrCi0gICAgIlwxXDBcMVwzMjRcMlw2NFw0XDBcMlw2NFwxXDIxMlwzXDBcMVw2NCIrCi0gICAgIlwzXDBcMVw2NFw3XDBcM1w2NFwxXDBcMVw2NFwyXDBcMVwyNzIiKwotICAgICJcMTBcMFwxMVw2NFwxXDBcNFw2NFwxXDBcM1w2NFwxXDBcM1w2NCIrCi0gICAgIlw0XDBcMVwzMjVcMVw3MVwxXDIxNVwxXDcxXDFcMFwxXDcxXDFcMzI1IisKLSAgICAiXDFcMFwxXDcxXDFcMFwxXDcxXDNcMFwyXDcxXDJcMFwzXDcxIisKLSAgICAiXDFcMFwxXDcxXDEzXDBcMVwzMjVcMlw3MVwxXDMyNVwyXDcxXDFcMzI1IisKLSAgICAiXDJcNzFcMVwwXDRcNzFcMVwwXDFcMzI1XDJcNzFcMVwwXDFcMzI1IisKLSAgICAiXDJcNzFcNFwwXDJcNzFcMVwyMTVcM1wwXDFcNzFcM1wwXDFcNzEiKwotICAgICJcN1wwXDNcNzFcMVwwXDFcNzFcMlwwXDFcMjcyXDEwXDBcMTFcNzEiKwotICAgICJcMVwwXDRcNzFcMVwwXDNcNzFcMVwwXDNcNzFcNFwwXDFcMzI2IisKLSAgICAiXDFcMTAxXDFcMjIxXDFcMTAxXDFcMFwxXDEwMVwxXDMyNlwxXDBcMVwxMDEiKwotICAgICJcMVwwXDFcMTAxXDNcMFwyXDEwMVwyXDBcM1wxMDFcMVwwXDFcMTAxIisKLSAgICAiXDEzXDBcMVwzMjZcMlwxMDFcMVwzMjZcMlwxMDFcMVwzMjZcMlwxMDFcMVwwIisKLSAgICAiXDRcMTAxXDFcMFwxXDMyNlwyXDEwMVwxXDBcMVwzMjZcMlwxMDFcNFwwIisKLSAgICAiXDJcMTAxXDFcMjIxXDNcMFwxXDEwMVwzXDBcMVwxMDFcN1wwXDNcMTAxIisKLSAgICAiXDFcMFwxXDEwMVwyXDBcMVwyNzJcMTBcMFwxMVwxMDFcMVwwXDRcMTAxIisKLSAgICAiXDFcMFwzXDEwMVwxXDBcM1wxMDFcNFwwXDFcMzI3XDFcMTA3XDFcMjI0IisKLSAgICAiXDFcMTA3XDFcMFwxXDEwN1wxXDMyN1wxXDBcMVwxMDdcMVwwXDFcMTA3IisKLSAgICAiXDNcMFwyXDEwN1wyXDBcM1wxMDdcMVwwXDFcMTA3XDEzXDBcMVwzMjciKwotICAgICJcMlwxMDdcMVwzMjdcMlwxMDdcMVwzMjdcMlwxMDdcMVwwXDRcMTA3XDFcMCIrCi0gICAgIlwxXDMyN1wyXDEwN1wxXDBcMVwzMjdcMlwxMDdcNFwwXDFcMzMwXDFcMjI2IisKLSAgICAiXDFcMjI3XDFcMjI2XDFcMzMxXDFcMjI2XDFcMzMwXDEwXDIyNlwxXDMzMlwyMlwyMjYiKwotICAgICJcMVwzMzBcMlwyMjZcMVwzMzBcMlwyMjZcMVwzMzBcMTBcMjI2XDFcMzMwXDNcMjI2IisKLSAgICAiXDFcMzMwXDVcMjI2XDFcMFwxXDMzM1wxXDIzMVwxXDIzMlwzXDIzMVwxXDMzMyIrCi0gICAgIlwxXDMzNFw3XDIzMVwxXDMzNVwyMlwyMzFcMVwzMzNcMlwyMzFcMVwzMzNcMlwyMzEiKwotICAgICJcMVwzMzNcMTBcMjMxXDFcMzMzXDNcMjMxXDFcMzMzXDVcMjMxXDFcMFwyXDEwNyIrCi0gICAgIlwxXDIyNFwzXDBcMVwxMDdcM1wwXDFcMTA3XDdcMFwzXDEwN1wxXDAiKwotICAgICJcMVwxMDdcMlwwXDFcMjcyXDEwXDBcMTFcMTA3XDFcMFw0XDEwN1wxXDAiKwotICAgICJcM1wxMDdcMVwwXDNcMTA3XDRcMFwxXDMzNlwxXDExNFwxXDIzNFwxXDExNCIrCi0gICAgIlwxXDBcMVwxMTRcMVwzMzZcMVwwXDFcMTE0XDFcMFwxXDExNFwzXDAiKwotICAgICJcMlwxMTRcMlwwXDNcMTE0XDFcMFwxXDExNFwxM1wwXDFcMzM2XDJcMTE0IisKLSAgICAiXDFcMzM2XDJcMTE0XDFcMzM2XDJcMTE0XDFcMFw0XDExNFwxXDBcMVwzMzYiKwotICAgICJcMlwxMTRcMVwwXDFcMzM2XDJcMTE0XDRcMFwyXDExNFwxXDIzNFwzXDAiKwotICAgICJcMVwxMTRcM1wwXDFcMTE0XDdcMFwzXDExNFwxXDBcMVwxMTRcMlwwIisKLSAgICAiXDFcMjcyXDEwXDBcMTFcMTE0XDFcMFw0XDExNFwxXDBcM1wxMTRcMVwwIisKLSAgICAiXDNcMTE0XDRcMFwyXDIzN1wxXDI0MFwzXDBcMVwyMzdcM1wwXDFcMjM3IisKLSAgICAiXDdcMFwzXDIzN1wxXDBcMVwyMzdcMTNcMFwxMVwyMzdcMVwwXDRcMjM3IisKLSAgICAiXDFcMFwzXDIzN1wxXDBcM1wyMzdcNFwwXDFcMzM3XDJcMjM3XDFcMCIrCi0gICAgIlwyXDIzN1wxXDMzN1wxXDIzN1wxXDBcNVwyMzdcMlwwXDIyXDIzN1wxXDMzNyIrCi0gICAgIlwyXDIzN1wxXDMzN1wyXDIzN1wxXDMzN1wxMFwyMzdcMVwzMzdcM1wyMzdcMVwzMzciKwotICAgICJcNVwyMzdcMVwwXDFcMzQwXDFcMTIyXDFcMjQzXDFcMTIyXDFcMFwxXDEyMiIrCi0gICAgIlwxXDM0MFwxXDBcMVwxMjJcMVwwXDFcMTIyXDNcMFwyXDEyMlwyXDAiKwotICAgICJcM1wxMjJcMVwyNDRcMVwxMjJcMTNcMFwxXDM0MFwyXDEyMlwxXDM0MFwyXDEyMiIrCi0gICAgIlwxXDM0MFwyXDEyMlwxXDBcNFwxMjJcMVwwXDFcMzQwXDJcMTIyXDFcMCIrCi0gICAgIlwxXDM0MFwyXDEyMlw0XDBcMVwzNDFcMVwyNDZcMVwyNDdcMVwyNDZcMVwzNDIiKwotICAgICJcMVwyNDZcMVwzNDFcMTBcMjQ2XDFcMzQzXDIyXDI0NlwxXDM0MVwyXDI0NlwxXDM0MSIrCi0gICAgIlwyXDI0NlwxXDM0MVwxMFwyNDZcMVwzNDFcM1wyNDZcMVwzNDFcNVwyNDZcMVwwIisKLSAgICAiXDFcMzQ0XDFcMjUxXDFcMjUyXDNcMjUxXDFcMzQ0XDFcMzQ1XDdcMjUxXDFcMzQ2IisKLSAgICAiXDIyXDI1MVwxXDM0NFwyXDI1MVwxXDM0NFwyXDI1MVwxXDM0NFwxMFwyNTFcMVwzNDQiKwotICAgICJcM1wyNTFcMVwzNDRcNVwyNTFcMVwwXDFcMjUzXDFcMTIyXDFcMjQzXDNcMCIrCi0gICAgIlwxXDEyMlwzXDBcMVwxMjJcMVwwXDFcMjQxXDVcMFwzXDEyMlwxXDI0NCIrCi0gICAgIlwxXDEyMlwxXDBcMVwyNDJcMTFcMFwxMVwxMjJcMVwwXDRcMTIyXDFcMCIrCi0gICAgIlwzXDEyMlwxXDBcM1wxMjJcNFwwXDJcMTIyXDFcMjQzXDNcMFwxXDEyMiIrCi0gICAgIlwzXDBcMVwxMjJcN1wwXDNcMTIyXDFcMjQ0XDFcMTIyXDJcMFwxXDI3MiIrCi0gICAgIlwxMFwwXDExXDEyMlwxXDBcNFwxMjJcMVwwXDNcMTIyXDFcMFwzXDEyMiIrCi0gICAgIlw0XDBcMVwyNTVcMVwyMzdcMVwyNDBcM1wwXDFcMjM3XDNcMFwxXDIzNyIrCi0gICAgIlw3XDBcM1wyMzdcMVwwXDFcMjM3XDFcMFwxXDI0MlwxMVwwXDExXDIzNyIrCi0gICAgIlwxXDBcNFwyMzdcMVwwXDNcMjM3XDFcMFwzXDIzN1w0XDBcMVwzNDciKwotICAgICJcMlwyNTZcMVwwXDJcMjU2XDFcMzQ3XDFcMjU2XDFcMFw1XDI1NlwyXDAiKwotICAgICJcMjJcMjU2XDFcMzQ3XDJcMjU2XDFcMzQ3XDJcMjU2XDFcMzQ3XDEwXDI1NlwxXDM0NyIrCi0gICAgIlwzXDI1NlwxXDM0N1w1XDI1NlwxXDBcMVwzNTBcNVwwXDFcMzUwXDExXDAiKwotICAgICJcMVwzNTBcNVwwXDFcMzUwXDEzXDBcMlwzNTBcMVwwXDJcMzUwXDFcMCIrCi0gICAgIlwyXDM1MFw3XDBcMlwzNTBcMlwwXDJcMzUwXDVcMFwyXDEyMlwxXDI0MyIrCi0gICAgIlwzXDBcMVwxMjJcM1wwXDFcMTIyXDdcMFwyXDEyMlwxXDM1MVwxXDI0NCIrCi0gICAgIlwxXDEyMlwxM1wwXDExXDEyMlwxXDBcNFwxMjJcMVwwXDNcMTIyXDFcMCIrCi0gICAgIlwzXDEyMlw2MVwwXDFcMzUyXDMwXDBcMVwzNTNcMTVcMFwxXDM1NFwxXDI3MiIrCi0gICAgIlw0MlwwXDFcMzU1XDFcMzJcMVwxNDdcMVwzMlwxXDBcMVwzMlwxXDM1NSIrCi0gICAgIlwxXDBcMVwzMlwxXDBcMVwzMlwzXDBcMlwzMlwyXDBcM1wzMiIrCi0gICAgIlwxXDBcMVwzMlwxM1wwXDFcMzU1XDJcMzJcMVwzNTVcMlwzMlwxXDM1NSIrCi0gICAgIlwyXDMyXDFcMFw0XDMyXDFcMFwxXDM1NVwyXDMyXDFcMFwxXDM1NSIrCi0gICAgIlwyXDMyXDRcMFwxXDM1NlwxXDE1MlwxXDE1M1wxXDE1MlwxXDBcMVwxNTIiKwotICAgICJcMVwzNTZcMVwwXDFcMTUyXDFcMFwxXDE1MlwzXDBcMlwxNTJcMlwwIisKLSAgICAiXDNcMTUyXDFcMFwxXDE1MlwxM1wwXDFcMzU2XDJcMTUyXDFcMzU2XDJcMTUyIisKLSAgICAiXDFcMzU2XDJcMTUyXDFcMFw0XDE1MlwxXDBcMVwzNTZcMlwxNTJcMVwwIisKLSAgICAiXDFcMzU2XDJcMTUyXDRcMFwxXDM1N1wxXDE1NFwxXDE1NVwxXDE1NFwxXDAiKwotICAgICJcMVwxNTRcMVwzNTdcMVwwXDFcMTU0XDFcMFwxXDE1NFwzXDBcMlwxNTQiKwotICAgICJcMlwwXDNcMTU0XDFcMFwxXDE1NFwxM1wwXDFcMzU3XDJcMTU0XDFcMzU3IisKLSAgICAiXDJcMTU0XDFcMzU3XDJcMTU0XDFcMFw0XDE1NFwxXDBcMVwzNTdcMlwxNTQiKwotICAgICJcMVwwXDFcMzU3XDJcMTU0XDE2XDBcMVwzNjBcMTI2XDBcMlwzNjFcMTAzXDAiKwotICAgICJcMVwzNjJcNzZcMFwyXDM2M1w3NFwwXDFcMzY0XDc3XDBcMVwzNjVcM1wwIisKLSAgICAiXDQxXDE3MFwxXDM2NlwxXDMwM1wzMVwxNzBcMlwwXDFcMzY3XDFcMzcwXDFcMzA0IisKLSAgICAiXDFcMFwxXDMwNFwxXDM2N1wxXDBcMVwzMDRcMVwwXDFcMzY3XDNcMCIrCi0gICAgIlwyXDMwNFwyXDBcM1wzNjdcMVwwXDFcMzY3XDEzXDBcMTFcMzY3XDFcMCIrCi0gICAgIlw0XDM2N1wxXDBcM1wzNjdcMVwwXDNcMzY3XDRcMFwxXDM3MVwxXDE3MSIrCi0gICAgIlwxXDE3MlwxXDE3MVwxXDBcMVwxNzFcMVwzNzFcMVwwXDFcMTcxXDFcMCIrCi0gICAgIlwxXDE3MVwzXDBcMlwxNzFcMlwwXDNcMTcxXDFcMzA0XDFcMTcxXDEzXDAiKwotICAgICJcMVwzNzFcMlwxNzFcMVwzNzFcMlwxNzFcMVwzNzFcMlwxNzFcMVwwXDRcMTcxIisKLSAgICAiXDFcMFwxXDM3MVwyXDE3MVwxXDBcMVwzNzFcMlwxNzFcNFwwXDFcMzcyIisKLSAgICAiXDFcMTczXDFcMTc0XDFcMTczXDFcMTc1XDFcMTczXDFcMzcyXDMzXDE3M1wxXDM3MiIrCi0gICAgIlwyXDE3M1wxXDM3MlwyXDE3M1wxXDM3MlwxMFwxNzNcMVwzNzJcM1wxNzNcMVwzNzIiKwotICAgICJcNVwxNzNcMVwwXDJcMTczXDFcMTc0XDFcMFwxXDE3NVwxMlwxNzNcMVwwIisKLSAgICAiXDUzXDE3M1wxXDBcMVwzNzNcMVwxNzZcMVwxNzdcM1wxNzZcMVwzNzNcMVwxNzUiKwotICAgICJcMzJcMTc2XDFcMzczXDJcMTc2XDFcMzczXDJcMTc2XDFcMzczXDEwXDE3NlwxXDM3MyIrCi0gICAgIlwzXDE3NlwxXDM3M1w1XDE3NlwxXDBcMlwxNzZcMVwxNzdcMVwwXDNcMTc2IisKLSAgICAiXDFcMTc1XDdcMTc2XDFcMFw1M1wxNzZcMVwwXDFcMzc0XDFcMjAxXDFcMjAyIisKLSAgICAiXDFcMjAxXDFcMjAzXDFcMjAxXDFcMzc0XDMzXDIwMVwxXDM3NFwyXDIwMVwxXDM3NCIrCi0gICAgIlwyXDIwMVwxXDM3NFwxMFwyMDFcMVwzNzRcM1wyMDFcMVwzNzRcNVwyMDFcMVwwIisKLSAgICAiXDJcMjAxXDFcMjAyXDFcMFwxXDIwM1wxMlwyMDFcMVwwXDUzXDIwMVwxXDAiKwotICAgICJcMVwzNzVcMVwyMDRcMVwyMDVcM1wyMDRcMVwzNzVcMVwyMDNcMzJcMjA0XDFcMzc1IisKLSAgICAiXDJcMjA0XDFcMzc1XDJcMjA0XDFcMzc1XDEwXDIwNFwxXDM3NVwzXDIwNFwxXDM3NSIrCi0gICAgIlw1XDIwNFwxXDBcMlwyMDRcMVwyMDVcMVwwXDNcMjA0XDFcMjAzXDdcMjA0IisKLSAgICAiXDFcMFw1M1wyMDRcMjZcMFwxXDM3Nlw0NlwwXDFcMzc3XDFcNjBcMVwyMDciKwotICAgICJcMVw2MFwxXDBcMVw2MFwxXDM3N1wxXDBcMVw2MFwxXDBcMVw2MCIrCi0gICAgIlwzXDBcMlw2MFwyXDBcM1w2MFwxXDBcMVw2MFwxM1wwXDFcMzc3IisKLSAgICAiXDJcNjBcMVwzNzdcMlw2MFwxXDM3N1wyXDYwXDFcMFw0XDYwXDFcMCIrCi0gICAgIlwxXDM3N1wyXDYwXDFcMFwxXDM3N1wyXDYwXDRcMFwxXHUwMTAwXDFcNjQiKwotICAgICJcMVwyMTJcMVw2NFwxXDBcMVw2NFwxXHUwMTAwXDFcMFwxXDY0XDFcMCIrCi0gICAgIlwxXDY0XDNcMFwyXDY0XDJcMFwzXDY0XDFcMFwxXDY0XDEzXDAiKwotICAgICJcMVx1MDEwMFwyXDY0XDFcdTAxMDBcMlw2NFwxXHUwMTAwXDJcNjRcMVwwXDRcNjQiKwotICAgICJcMVwwXDFcdTAxMDBcMlw2NFwxXDBcMVx1MDEwMFwyXDY0XDRcMFwxXHUwMTAxIisKLSAgICAiXDFcNzFcMVwyMTVcMVw3MVwxXDBcMVw3MVwxXHUwMTAxXDFcMFwxXDcxIisKLSAgICAiXDFcMFwxXDcxXDNcMFwyXDcxXDJcMFwzXDcxXDFcMFwxXDcxIisKLSAgICAiXDEzXDBcMVx1MDEwMVwyXDcxXDFcdTAxMDFcMlw3MVwxXHUwMTAxXDJcNzFcMVwwIisKLSAgICAiXDRcNzFcMVwwXDFcdTAxMDFcMlw3MVwxXDBcMVx1MDEwMVwyXDcxXDRcMCIrCi0gICAgIlwxXHUwMTAyXDFcMTAxXDFcMjIxXDFcMTAxXDFcMFwxXDEwMVwxXHUwMTAyXDFcMCIrCi0gICAgIlwxXDEwMVwxXDBcMVwxMDFcM1wwXDJcMTAxXDJcMFwzXDEwMVwxXDAiKwotICAgICJcMVwxMDFcMTNcMFwxXHUwMTAyXDJcMTAxXDFcdTAxMDJcMlwxMDFcMVx1MDEwMlwyXDEwMSIrCi0gICAgIlwxXDBcNFwxMDFcMVwwXDFcdTAxMDJcMlwxMDFcMVwwXDFcdTAxMDJcMlwxMDEiKwotICAgICJcNFwwXDFcdTAxMDNcMVwxMDdcMVwyMjRcMVwxMDdcMVwwXDFcMTA3XDFcdTAxMDMiKwotICAgICJcMVwwXDFcMTA3XDFcMFwxXDEwN1wzXDBcMlwxMDdcMlwwXDNcMTA3IisKLSAgICAiXDFcMFwxXDEwN1wxM1wwXDFcdTAxMDNcMlwxMDdcMVx1MDEwM1wyXDEwN1wxXHUwMTAzIisKLSAgICAiXDJcMTA3XDFcMFw0XDEwN1wxXDBcMVx1MDEwM1wyXDEwN1wxXDBcMVx1MDEwMyIrCi0gICAgIlwyXDEwN1w0XDBcMVx1MDEwNFwxXDIyNlwxXDIyN1wxXDIyNlwxXDIzMFwxXDIyNiIrCi0gICAgIlwxXHUwMTA0XDMzXDIyNlwxXHUwMTA0XDJcMjI2XDFcdTAxMDRcMlwyMjZcMVx1MDEwNFwxMFwyMjYiKwotICAgICJcMVx1MDEwNFwzXDIyNlwxXHUwMTA0XDVcMjI2XDFcMFwyXDIyNlwxXDIyN1wxXDAiKwotICAgICJcMVwyMzBcMTJcMjI2XDFcMFw1M1wyMjZcMVwwXDFcdTAxMDVcMVwyMzFcMVwyMzIiKwotICAgICJcM1wyMzFcMVx1MDEwNVwxXDIzMFwzMlwyMzFcMVx1MDEwNVwyXDIzMVwxXHUwMTA1XDJcMjMxIisKLSAgICAiXDFcdTAxMDVcMTBcMjMxXDFcdTAxMDVcM1wyMzFcMVx1MDEwNVw1XDIzMVwxXDBcMlwyMzEiKwotICAgICJcMVwyMzJcMVwwXDNcMjMxXDFcMjMwXDdcMjMxXDFcMFw1M1wyMzFcMVwwIisKLSAgICAiXDFcdTAxMDZcMVwxMTRcMVwyMzRcMVwxMTRcMVwwXDFcMTE0XDFcdTAxMDZcMVwwIisKLSAgICAiXDFcMTE0XDFcMFwxXDExNFwzXDBcMlwxMTRcMlwwXDNcMTE0XDFcMCIrCi0gICAgIlwxXDExNFwxM1wwXDFcdTAxMDZcMlwxMTRcMVx1MDEwNlwyXDExNFwxXHUwMTA2XDJcMTE0IisKLSAgICAiXDFcMFw0XDExNFwxXDBcMVx1MDEwNlwyXDExNFwxXDBcMVx1MDEwNlwyXDExNCIrCi0gICAgIlw0XDBcMVx1MDEwN1wxXDIzN1wxXDI0MFwxXDIzN1wxXDBcMVwyMzdcMVx1MDEwNyIrCi0gICAgIlwxXDBcMVwyMzdcMVwwXDFcMjM3XDNcMFwyXDIzN1wyXDBcM1wyMzciKwotICAgICJcMVwwXDFcMjM3XDEzXDBcMVx1MDEwN1wyXDIzN1wxXHUwMTA3XDJcMjM3XDFcdTAxMDciKwotICAgICJcMlwyMzdcMVwwXDRcMjM3XDFcMFwxXHUwMTA3XDJcMjM3XDFcMFwxXHUwMTA3IisKLSAgICAiXDJcMjM3XDRcMFwxXHUwMTA4XDFcMTIyXDFcMjQzXDFcMTIyXDFcMFwxXDEyMiIrCi0gICAgIlwxXHUwMTA4XDFcMFwxXDEyMlwxXDBcMVwxMjJcM1wwXDJcMTIyXDJcMCIrCi0gICAgIlwzXDEyMlwxXDI0NFwxXDEyMlwxM1wwXDFcdTAxMDhcMlwxMjJcMVx1MDEwOFwyXDEyMiIrCi0gICAgIlwxXHUwMTA4XDJcMTIyXDFcMFw0XDEyMlwxXDBcMVx1MDEwOFwyXDEyMlwxXDAiKwotICAgICJcMVx1MDEwOFwyXDEyMlw0XDBcMVx1MDEwOVwxXDI0NlwxXDI0N1wxXDI0NlwxXDI1MCIrCi0gICAgIlwxXDI0NlwxXHUwMTA5XDMzXDI0NlwxXHUwMTA5XDJcMjQ2XDFcdTAxMDlcMlwyNDZcMVx1MDEwOSIrCi0gICAgIlwxMFwyNDZcMVx1MDEwOVwzXDI0NlwxXHUwMTA5XDVcMjQ2XDFcMFwyXDI0NlwxXDI0NyIrCi0gICAgIlwxXDBcMVwyNTBcMTJcMjQ2XDFcMFw1M1wyNDZcMVwwXDFcdTAxMGFcMVwyNTEiKwotICAgICJcMVwyNTJcM1wyNTFcMVx1MDEwYVwxXDI1MFwzMlwyNTFcMVx1MDEwYVwyXDI1MVwxXHUwMTBhIisKLSAgICAiXDJcMjUxXDFcdTAxMGFcMTBcMjUxXDFcdTAxMGFcM1wyNTFcMVx1MDEwYVw1XDI1MVwxXDAiKwotICAgICJcMlwyNTFcMVwyNTJcMVwwXDNcMjUxXDFcMjUwXDdcMjUxXDFcMFw1M1wyNTEiKwotICAgICJcMVwwXDFcdTAxMGJcMVwyNTZcMVwyNTdcMVwyNTZcMVwwXDFcMjU2XDFcdTAxMGIiKwotICAgICJcMVwwXDFcMjU2XDFcMFwxXDI1NlwzXDBcMlwyNTZcMlwwXDNcMjU2IisKLSAgICAiXDFcMFwxXDI1NlwxM1wwXDFcdTAxMGJcMlwyNTZcMVx1MDEwYlwyXDI1NlwxXHUwMTBiIisKLSAgICAiXDJcMjU2XDFcMFw0XDI1NlwxXDBcMVx1MDEwYlwyXDI1NlwxXDBcMVx1MDEwYiIrCi0gICAgIlwyXDI1Nlw0XDBcMVx1MDEwY1w1XDBcMVx1MDEwY1wzXDBcMVx1MDEwZFw1XDAiKwotICAgICJcMVx1MDEwY1w1XDBcMVx1MDEwY1wxM1wwXDJcdTAxMGNcMVwwXDJcdTAxMGNcMVwwIisKLSAgICAiXDJcdTAxMGNcN1wwXDJcdTAxMGNcMlwwXDJcdTAxMGNcNVwwXDJcMTIyXDFcMjQzIisKLSAgICAiXDNcMFwxXDEyMlwzXDBcMVwxMjJcN1wwXDNcMTIyXDFcdTAxMGVcMVwxMjIiKwotICAgICJcMTNcMFwxMVwxMjJcMVwwXDRcMTIyXDFcMFwzXDEyMlwxXDBcM1wxMjIiKwotICAgICJcNjJcMFwxXHUwMTBmXDI3XDBcMVwzNTNcMTVcMFwxXDM1NFw1MFwwXDFcMzU0IisKLSAgICAiXDJcMFwxXDM1NFw1XDBcMlwzNTRcMTFcMFwxXHUwMTEwXDQyXDBcMVx1MDExMSIrCi0gICAgIlwxXDMyXDFcMTQ3XDFcMzJcMVwwXDFcMzJcMVx1MDExMVwxXDBcMVwzMiIrCi0gICAgIlwxXDBcMVwzMlwzXDBcMlwzMlwyXDBcM1wzMlwxXDBcMVwzMiIrCi0gICAgIlwxM1wwXDFcdTAxMTFcMlwzMlwxXHUwMTExXDJcMzJcMVx1MDExMVwyXDMyXDFcMCIrCi0gICAgIlw0XDMyXDFcMFwxXHUwMTExXDJcMzJcMVwwXDFcdTAxMTFcMlwzMlw0XDAiKwotICAgICJcMVx1MDExMlwxXDE1MlwxXDE1M1wxXDE1MlwxXDBcMVwxNTJcMVx1MDExMlwxXDAiKwotICAgICJcMVwxNTJcMVwwXDFcMTUyXDNcMFwyXDE1MlwyXDBcM1wxNTJcMVwwIisKLSAgICAiXDFcMTUyXDEzXDBcMVx1MDExMlwyXDE1MlwxXHUwMTEyXDJcMTUyXDFcdTAxMTJcMlwxNTIiKwotICAgICJcMVwwXDRcMTUyXDFcMFwxXHUwMTEyXDJcMTUyXDFcMFwxXHUwMTEyXDJcMTUyIisKLSAgICAiXDRcMFwxXHUwMTEzXDFcMTU0XDFcMTU1XDFcMTU0XDFcMFwxXDE1NFwxXHUwMTEzIisKLSAgICAiXDFcMFwxXDE1NFwxXDBcMVwxNTRcM1wwXDJcMTU0XDJcMFwzXDE1NCIrCi0gICAgIlwxXDBcMVwxNTRcMTNcMFwxXHUwMTEzXDJcMTU0XDFcdTAxMTNcMlwxNTRcMVx1MDExMyIrCi0gICAgIlwyXDE1NFwxXDBcNFwxNTRcMVwwXDFcdTAxMTNcMlwxNTRcMVwwXDFcdTAxMTMiKwotICAgICJcMlwxNTRcMjdcMFwxXHUwMTE0XDEyN1wwXDFcdTAxMTVcNzBcMFwxXHUwMTE2XDY3XDAiKwotICAgICJcMlx1MDExN1w3NFwwXDFcdTAxMThcMjFcMFwyXDM2N1wxXDM3MFwxXHUwMTE5XDFcMCIrCi0gICAgIlwxXHUwMTE5XDFcMzY3XDFcMFwxXHUwMTE5XDFcdTAxMWFcMVwzNjdcM1wwXDJcdTAxMTkiKwotICAgICJcMlwwXDNcMzY3XDFcMFwxXDM2N1wxM1wwXDExXDM2N1wxXDBcNFwzNjciKwotICAgICJcMVwwXDNcMzY3XDFcMFwzXDM2N1w0XDBcMVx1MDExYlwyXDM2N1wxXDAiKwotICAgICJcMlwzNjdcMVx1MDExYlwxXDM2N1wxXDBcNVwzNjdcMlwwXDIyXDM2N1wxXHUwMTFiIisKLSAgICAiXDJcMzY3XDFcdTAxMWJcMlwzNjdcMVx1MDExYlwxMFwzNjdcMVx1MDExYlwzXDM2N1wxXHUwMTFiIisKLSAgICAiXDVcMzY3XDFcMFwxXHUwMTFjXDFcMTcxXDFcMTcyXDFcMTcxXDFcMFwxXDE3MSIrCi0gICAgIlwxXHUwMTFjXDFcMFwxXDE3MVwxXDBcMVwxNzFcM1wwXDJcMTcxXDJcMCIrCi0gICAgIlwzXDE3MVwxXDMwNFwxXDE3MVwxM1wwXDFcdTAxMWNcMlwxNzFcMVx1MDExY1wyXDE3MSIrCi0gICAgIlwxXHUwMTFjXDJcMTcxXDFcMFw0XDE3MVwxXDBcMVx1MDExY1wyXDE3MVwxXDAiKwotICAgICJcMVx1MDExY1wyXDE3MVw0XDBcMVx1MDExZFwxXDE3M1wxXDE3NFwxXDE3M1wxXDE3NSIrCi0gICAgIlwxXDE3M1wxXHUwMTFkXDMzXDE3M1wxXHUwMTFkXDJcMTczXDFcdTAxMWRcMlwxNzNcMVx1MDExZCIrCi0gICAgIlwxMFwxNzNcMVx1MDExZFwzXDE3M1wxXHUwMTFkXDVcMTczXDFcMFwxXHUwMTFlXDFcMTc2IisKLSAgICAiXDFcMTc3XDNcMTc2XDFcdTAxMWVcMVwxNzVcMzJcMTc2XDFcdTAxMWVcMlwxNzZcMVx1MDExZSIrCi0gICAgIlwyXDE3NlwxXHUwMTFlXDEwXDE3NlwxXHUwMTFlXDNcMTc2XDFcdTAxMWVcNVwxNzZcMVwwIisKLSAgICAiXDFcdTAxMWZcMVwyMDFcMVwyMDJcMVwyMDFcMVwyMDNcMVwyMDFcMVx1MDExZlwzM1wyMDEiKwotICAgICJcMVx1MDExZlwyXDIwMVwxXHUwMTFmXDJcMjAxXDFcdTAxMWZcMTBcMjAxXDFcdTAxMWZcM1wyMDEiKwotICAgICJcMVx1MDExZlw1XDIwMVwxXDBcMVx1MDEyMFwxXDIwNFwxXDIwNVwzXDIwNFwxXHUwMTIwIisKLSAgICAiXDFcMjAzXDMyXDIwNFwxXHUwMTIwXDJcMjA0XDFcdTAxMjBcMlwyMDRcMVx1MDEyMFwxMFwyMDQiKwotICAgICJcMVx1MDEyMFwzXDIwNFwxXHUwMTIwXDVcMjA0XDFcMFwyXHUwMTIxXDFcdTAxMjJcMVwzNzYiKwotICAgICJcMVx1MDEyM1wxXDM3NlwxXHUwMTIxXDFcdTAxMjRcMVwzNzZcMVx1MDEyNVw0XHUwMTIxXDJcMzc2IisKLSAgICAiXDVcdTAxMjFcMVwwXDQ1XHUwMTIxXDFcMFwxXHUwMTI2XDFcNjBcMVwyMDdcMVw2MCIrCi0gICAgIlwxXDBcMVw2MFwxXHUwMTI2XDFcMFwxXDYwXDFcMFwxXDYwXDNcMCIrCi0gICAgIlwyXDYwXDJcMFwzXDYwXDFcMFwxXDYwXDEzXDBcMVx1MDEyNlwyXDYwIisKLSAgICAiXDFcdTAxMjZcMlw2MFwxXHUwMTI2XDJcNjBcMVwwXDRcNjBcMVwwXDFcdTAxMjYiKwotICAgICJcMlw2MFwxXDBcMVx1MDEyNlwyXDYwXDRcMFwxXHUwMTI3XDFcNjRcMVwyMTIiKwotICAgICJcMVw2NFwxXDBcMVw2NFwxXHUwMTI3XDFcMFwxXDY0XDFcMFwxXDY0IisKLSAgICAiXDNcMFwyXDY0XDJcMFwzXDY0XDFcMFwxXDY0XDEzXDBcMVx1MDEyNyIrCi0gICAgIlwyXDY0XDFcdTAxMjdcMlw2NFwxXHUwMTI3XDJcNjRcMVwwXDRcNjRcMVwwIisKLSAgICAiXDFcdTAxMjdcMlw2NFwxXDBcMVx1MDEyN1wyXDY0XDRcMFwxXHUwMTI4XDFcNzEiKwotICAgICJcMVwyMTVcMVw3MVwxXDBcMVw3MVwxXHUwMTI4XDFcMFwxXDcxXDFcMCIrCi0gICAgIlwxXDcxXDNcMFwyXDcxXDJcMFwzXDcxXDFcMFwxXDcxXDEzXDAiKwotICAgICJcMVx1MDEyOFwyXDcxXDFcdTAxMjhcMlw3MVwxXHUwMTI4XDJcNzFcMVwwXDRcNzEiKwotICAgICJcMVwwXDFcdTAxMjhcMlw3MVwxXDBcMVx1MDEyOFwyXDcxXDRcMFwxXHUwMTI5IisKLSAgICAiXDFcMTAxXDFcMjIxXDFcMTAxXDFcMFwxXDEwMVwxXHUwMTI5XDFcMFwxXDEwMSIrCi0gICAgIlwxXDBcMVwxMDFcM1wwXDJcMTAxXDJcMFwzXDEwMVwxXDBcMVwxMDEiKwotICAgICJcMTNcMFwxXHUwMTI5XDJcMTAxXDFcdTAxMjlcMlwxMDFcMVx1MDEyOVwyXDEwMVwxXDAiKwotICAgICJcNFwxMDFcMVwwXDFcdTAxMjlcMlwxMDFcMVwwXDFcdTAxMjlcMlwxMDFcNFwwIisKLSAgICAiXDFcdTAxMmFcMVwxMDdcMVwyMjRcMVwxMDdcMVwwXDFcMTA3XDFcdTAxMmFcMVwwIisKLSAgICAiXDFcMTA3XDFcMFwxXDEwN1wzXDBcMlwxMDdcMlwwXDNcMTA3XDFcMCIrCi0gICAgIlwxXDEwN1wxM1wwXDFcdTAxMmFcMlwxMDdcMVx1MDEyYVwyXDEwN1wxXHUwMTJhXDJcMTA3IisKLSAgICAiXDFcMFw0XDEwN1wxXDBcMVx1MDEyYVwyXDEwN1wxXDBcMVx1MDEyYVwyXDEwNyIrCi0gICAgIlw0XDBcMVx1MDEyYlwxXDIyNlwxXDIyN1wxXDIyNlwxXDIzMFwxXDIyNlwxXHUwMTJiIisKLSAgICAiXDMzXDIyNlwxXHUwMTJiXDJcMjI2XDFcdTAxMmJcMlwyMjZcMVx1MDEyYlwxMFwyMjZcMVx1MDEyYiIrCi0gICAgIlwzXDIyNlwxXHUwMTJiXDVcMjI2XDFcMFwxXHUwMTJjXDFcMjMxXDFcMjMyXDNcMjMxIisKLSAgICAiXDFcdTAxMmNcMVwyMzBcMzJcMjMxXDFcdTAxMmNcMlwyMzFcMVx1MDEyY1wyXDIzMVwxXHUwMTJjIisKLSAgICAiXDEwXDIzMVwxXHUwMTJjXDNcMjMxXDFcdTAxMmNcNVwyMzFcMVwwXDFcdTAxMmRcMVwxMTQiKwotICAgICJcMVwyMzRcMVwxMTRcMVwwXDFcMTE0XDFcdTAxMmRcMVwwXDFcMTE0XDFcMCIrCi0gICAgIlwxXDExNFwzXDBcMlwxMTRcMlwwXDNcMTE0XDFcMFwxXDExNFwxM1wwIisKLSAgICAiXDFcdTAxMmRcMlwxMTRcMVx1MDEyZFwyXDExNFwxXHUwMTJkXDJcMTE0XDFcMFw0XDExNCIrCi0gICAgIlwxXDBcMVx1MDEyZFwyXDExNFwxXDBcMVx1MDEyZFwyXDExNFw0XDBcMVx1MDEyZSIrCi0gICAgIlwxXDIzN1wxXDI0MFwxXDIzN1wxXDBcMVwyMzdcMVx1MDEyZVwxXDBcMVwyMzciKwotICAgICJcMVwwXDFcMjM3XDNcMFwyXDIzN1wyXDBcM1wyMzdcMVwwXDFcMjM3IisKLSAgICAiXDEzXDBcMVx1MDEyZVwyXDIzN1wxXHUwMTJlXDJcMjM3XDFcdTAxMmVcMlwyMzdcMVwwIisKLSAgICAiXDRcMjM3XDFcMFwxXHUwMTJlXDJcMjM3XDFcMFwxXHUwMTJlXDJcMjM3XDRcMCIrCi0gICAgIlwxXHUwMTJmXDFcMTIyXDFcMjQzXDFcMTIyXDFcMFwxXDEyMlwxXHUwMTJmXDFcMCIrCi0gICAgIlwxXDEyMlwxXDBcMVwxMjJcM1wwXDJcMTIyXDJcMFwzXDEyMlwxXDI0NCIrCi0gICAgIlwxXDEyMlwxM1wwXDFcdTAxMmZcMlwxMjJcMVx1MDEyZlwyXDEyMlwxXHUwMTJmXDJcMTIyIisKLSAgICAiXDFcMFw0XDEyMlwxXDBcMVx1MDEyZlwyXDEyMlwxXDBcMVx1MDEyZlwyXDEyMiIrCi0gICAgIlw0XDBcMVx1MDEzMFwxXDI0NlwxXDI0N1wxXDI0NlwxXDI1MFwxXDI0NlwxXHUwMTMwIisKLSAgICAiXDMzXDI0NlwxXHUwMTMwXDJcMjQ2XDFcdTAxMzBcMlwyNDZcMVx1MDEzMFwxMFwyNDZcMVx1MDEzMCIrCi0gICAgIlwzXDI0NlwxXHUwMTMwXDVcMjQ2XDFcMFwxXHUwMTMxXDFcMjUxXDFcMjUyXDNcMjUxIisKLSAgICAiXDFcdTAxMzFcMVwyNTBcMzJcMjUxXDFcdTAxMzFcMlwyNTFcMVx1MDEzMVwyXDI1MVwxXHUwMTMxIisKLSAgICAiXDEwXDI1MVwxXHUwMTMxXDNcMjUxXDFcdTAxMzFcNVwyNTFcMVwwXDFcdTAxMzJcMVwyNTYiKwotICAgICJcMVwyNTdcMVwyNTZcMVwwXDFcMjU2XDFcdTAxMzJcMVwwXDFcMjU2XDFcMCIrCi0gICAgIlwxXDI1NlwzXDBcMlwyNTZcMlwwXDNcMjU2XDFcMFwxXDI1NlwxM1wwIisKLSAgICAiXDFcdTAxMzJcMlwyNTZcMVx1MDEzMlwyXDI1NlwxXHUwMTMyXDJcMjU2XDFcMFw0XDI1NiIrCi0gICAgIlwxXDBcMVx1MDEzMlwyXDI1NlwxXDBcMVx1MDEzMlwyXDI1Nlw0XDBcMVx1MDEzMyIrCi0gICAgIlw1XDBcMVx1MDEzM1wzXDBcMVx1MDEwZFw1XDBcMVx1MDEzM1w1XDBcMVx1MDEzMyIrCi0gICAgIlwxM1wwXDJcdTAxMzNcMVwwXDJcdTAxMzNcMVwwXDJcdTAxMzNcN1wwXDJcdTAxMzMiKwotICAgICJcMlwwXDJcdTAxMzNcNVwwXDFcdTAxMzRcNVwwXDFcdTAxMzRcMTFcMFwxXHUwMTM0IisKLSAgICAiXDVcMFwxXHUwMTM0XDEzXDBcMlx1MDEzNFwxXDBcMlx1MDEzNFwxXDBcMlx1MDEzNCIrCi0gICAgIlw3XDBcMlx1MDEzNFwyXDBcMlx1MDEzNFw1XDBcMlx1MDEzNVwxXHUwMTM2XDFcdTAxMzciKwotICAgICJcMVx1MDEzOFwxXHUwMTM3XDFcdTAxMzVcMVx1MDEzOVwxXHUwMTM3XDFcdTAxM2FcNFx1MDEzNVwyXHUwMTM3IisKLSAgICAiXDVcdTAxMzVcMVwwXDQ1XHUwMTM1XDYwXDBcMVx1MDEzYlwxNFwwXDFcdTAxM2NcMVwzMiIrCi0gICAgIlwxXDE0N1wxXDMyXDFcMFwxXDMyXDFcdTAxM2NcMVwwXDFcMzJcMVwwIisKLSAgICAiXDFcMzJcM1wwXDJcMzJcMlwwXDNcMzJcMVwwXDFcMzJcMTNcMCIrCi0gICAgIlwxXHUwMTNjXDJcMzJcMVx1MDEzY1wyXDMyXDFcdTAxM2NcMlwzMlwxXDBcNFwzMiIrCi0gICAgIlwxXDBcMVx1MDEzY1wyXDMyXDFcMFwxXHUwMTNjXDJcMzJcNFwwXDFcdTAxM2QiKwotICAgICJcMVwxNTJcMVwxNTNcMVwxNTJcMVwwXDFcMTUyXDFcdTAxM2RcMVwwXDFcMTUyIisKLSAgICAiXDFcMFwxXDE1MlwzXDBcMlwxNTJcMlwwXDNcMTUyXDFcMFwxXDE1MiIrCi0gICAgIlwxM1wwXDFcdTAxM2RcMlwxNTJcMVx1MDEzZFwyXDE1MlwxXHUwMTNkXDJcMTUyXDFcMCIrCi0gICAgIlw0XDE1MlwxXDBcMVx1MDEzZFwyXDE1MlwxXDBcMVx1MDEzZFwyXDE1Mlw0XDAiKwotICAgICJcMVx1MDEzZVwxXDE1NFwxXDE1NVwxXDE1NFwxXDBcMVwxNTRcMVx1MDEzZVwxXDAiKwotICAgICJcMVwxNTRcMVwwXDFcMTU0XDNcMFwyXDE1NFwyXDBcM1wxNTRcMVwwIisKLSAgICAiXDFcMTU0XDEzXDBcMVx1MDEzZVwyXDE1NFwxXHUwMTNlXDJcMTU0XDFcdTAxM2VcMlwxNTQiKwotICAgICJcMVwwXDRcMTU0XDFcMFwxXHUwMTNlXDJcMTU0XDFcMFwxXHUwMTNlXDJcMTU0IisKLSAgICAiXDUzXDBcMVx1MDEzZlw0N1wwXDFcdTAxNDBcMTE1XDBcMlx1MDE0MVwzN1wwXDFcdTAxNDIiKwotICAgICJcNjRcMFwxXHUwMTE5XDFcMFwxXHUwMTE5XDJcMFwxXHUwMTE5XDFcdTAxMWFcNFwwIisKLSAgICAiXDJcdTAxMTlcNTRcMFwxXHUwMTQzXDFcMzY3XDFcMzcwXDFcMzY3XDFcMFwxXDM2NyIrCi0gICAgIlwxXHUwMTQzXDFcMFwxXDM2N1wxXHUwMTFhXDFcMzY3XDNcMFwyXDM2N1wyXDAiKwotICAgICJcM1wzNjdcMVwwXDFcMzY3XDEzXDBcMVx1MDE0M1wyXDM2N1wxXHUwMTQzXDJcMzY3IisKLSAgICAiXDFcdTAxNDNcMlwzNjdcMVwwXDRcMzY3XDFcMFwxXHUwMTQzXDJcMzY3XDFcMCIrCi0gICAgIlwxXHUwMTQzXDJcMzY3XDRcMFwxXHUwMTQ0XDFcMTcxXDFcMTcyXDFcMTcxXDFcMCIrCi0gICAgIlwxXDE3MVwxXHUwMTQ0XDFcMFwxXDE3MVwxXDBcMVwxNzFcM1wwXDJcMTcxIisKLSAgICAiXDJcMFwzXDE3MVwxXDMwNFwxXDE3MVwxM1wwXDFcdTAxNDRcMlwxNzFcMVx1MDE0NCIrCi0gICAgIlwyXDE3MVwxXHUwMTQ0XDJcMTcxXDFcMFw0XDE3MVwxXDBcMVx1MDE0NFwyXDE3MSIrCi0gICAgIlwxXDBcMVx1MDE0NFwyXDE3MVw0XDBcMVx1MDE0NVwxXDE3M1wxXDE3NFwxXDE3MyIrCi0gICAgIlwxXDE3NVwxXDE3M1wxXHUwMTQ1XDMzXDE3M1wxXHUwMTQ1XDJcMTczXDFcdTAxNDVcMlwxNzMiKwotICAgICJcMVx1MDE0NVwxMFwxNzNcMVx1MDE0NVwzXDE3M1wxXHUwMTQ1XDVcMTczXDFcMFwxXHUwMTQ2IisKLSAgICAiXDFcMTc2XDFcMTc3XDNcMTc2XDFcdTAxNDZcMVwxNzVcMzJcMTc2XDFcdTAxNDZcMlwxNzYiKwotICAgICJcMVx1MDE0NlwyXDE3NlwxXHUwMTQ2XDEwXDE3NlwxXHUwMTQ2XDNcMTc2XDFcdTAxNDZcNVwxNzYiKwotICAgICJcMVwwXDFcdTAxNDdcMVwyMDFcMVwyMDJcMVwyMDFcMVwyMDNcMVwyMDFcMVx1MDE0NyIrCi0gICAgIlwzM1wyMDFcMVx1MDE0N1wyXDIwMVwxXHUwMTQ3XDJcMjAxXDFcdTAxNDdcMTBcMjAxXDFcdTAxNDciKwotICAgICJcM1wyMDFcMVx1MDE0N1w1XDIwMVwxXDBcMVx1MDE0OFwxXDIwNFwxXDIwNVwzXDIwNCIrCi0gICAgIlwxXHUwMTQ4XDFcMjAzXDMyXDIwNFwxXHUwMTQ4XDJcMjA0XDFcdTAxNDhcMlwyMDRcMVx1MDE0OCIrCi0gICAgIlwxMFwyMDRcMVx1MDE0OFwzXDIwNFwxXHUwMTQ4XDVcMjA0XDFcMFwyXHUwMTIxXDFcdTAxMjIiKwotICAgICJcMVx1MDE0OVwxXDBcMlx1MDEyMVwxXDBcMVx1MDE0OVwxXHUwMTI1XDRcdTAxMjFcMlx1MDE0OSIrCi0gICAgIlw1XHUwMTIxXDFcMFw0NVx1MDEyMVwxXDBcMVx1MDE0YVwxXHUwMTIxXDFcdTAxMjJcMVx1MDE0OSIrCi0gICAgIlwyXHUwMTIxXDFcdTAxNGFcMVx1MDEyMVwxXHUwMTQ5XDFcdTAxNGJcNFx1MDEyMVwyXHUwMTQ5XDIyXHUwMTIxIisKLSAgICAiXDFcdTAxNGFcMlx1MDEyMVwxXHUwMTRhXDJcdTAxMjFcMVx1MDE0YVwxMFx1MDEyMVwxXHUwMTRhXDNcdTAxMjEiKwotICAgICJcMVx1MDE0YVw1XHUwMTIxXDFcMFwyXHUwMTIzXDFcdTAxNGNcMVwwXDFcdTAxNDlcMTFcdTAxMjMiKwotICAgICJcMlwwXDUzXHUwMTIzXDFcMFwyXHUwMTI0XDFcdTAxNGRcMVwwXDNcdTAxMjRcMVx1MDE0OSIrCi0gICAgIlw2XHUwMTI0XDJcMFw1M1x1MDEyNFwxXDBcMVx1MDE0ZVwxXDYwXDFcMjA3XDFcNjAiKwotICAgICJcMVwwXDFcNjBcMVx1MDE0ZVwxXDBcMVw2MFwxXDBcMVw2MFwzXDAiKwotICAgICJcMlw2MFwyXDBcM1w2MFwxXDBcMVw2MFwxM1wwXDFcdTAxNGVcMlw2MCIrCi0gICAgIlwxXHUwMTRlXDJcNjBcMVx1MDE0ZVwyXDYwXDFcMFw0XDYwXDFcMFwxXHUwMTRlIisKLSAgICAiXDJcNjBcMVwwXDFcdTAxNGVcMlw2MFw0XDBcMVx1MDE0ZlwxXDY0XDFcMjEyIisKLSAgICAiXDFcNjRcMVwwXDFcNjRcMVx1MDE0ZlwxXDBcMVw2NFwxXDBcMVw2NCIrCi0gICAgIlwzXDBcMlw2NFwyXDBcM1w2NFwxXDBcMVw2NFwxM1wwXDFcdTAxNGYiKwotICAgICJcMlw2NFwxXHUwMTRmXDJcNjRcMVx1MDE0ZlwyXDY0XDFcMFw0XDY0XDFcMCIrCi0gICAgIlwxXHUwMTRmXDJcNjRcMVwwXDFcdTAxNGZcMlw2NFw0XDBcMVx1MDE1MFwxXDcxIisKLSAgICAiXDFcMjE1XDFcNzFcMVwwXDFcNzFcMVx1MDE1MFwxXDBcMVw3MVwxXDAiKwotICAgICJcMVw3MVwzXDBcMlw3MVwyXDBcM1w3MVwxXDBcMVw3MVwxM1wwIisKLSAgICAiXDFcdTAxNTBcMlw3MVwxXHUwMTUwXDJcNzFcMVx1MDE1MFwyXDcxXDFcMFw0XDcxIisKLSAgICAiXDFcMFwxXHUwMTUwXDJcNzFcMVwwXDFcdTAxNTBcMlw3MVw0XDBcMVx1MDE1MSIrCi0gICAgIlwxXDEwMVwxXDIyMVwxXDEwMVwxXDBcMVwxMDFcMVx1MDE1MVwxXDBcMVwxMDEiKwotICAgICJcMVwwXDFcMTAxXDNcMFwyXDEwMVwyXDBcM1wxMDFcMVwwXDFcMTAxIisKLSAgICAiXDEzXDBcMVx1MDE1MVwyXDEwMVwxXHUwMTUxXDJcMTAxXDFcdTAxNTFcMlwxMDFcMVwwIisKLSAgICAiXDRcMTAxXDFcMFwxXHUwMTUxXDJcMTAxXDFcMFwxXHUwMTUxXDJcMTAxXDRcMCIrCi0gICAgIlwxXHUwMTUyXDFcMTA3XDFcMjI0XDFcMTA3XDFcMFwxXDEwN1wxXHUwMTUyXDFcMCIrCi0gICAgIlwxXDEwN1wxXDBcMVwxMDdcM1wwXDJcMTA3XDJcMFwzXDEwN1wxXDAiKwotICAgICJcMVwxMDdcMTNcMFwxXHUwMTUyXDJcMTA3XDFcdTAxNTJcMlwxMDdcMVx1MDE1MlwyXDEwNyIrCi0gICAgIlwxXDBcNFwxMDdcMVwwXDFcdTAxNTJcMlwxMDdcMVwwXDFcdTAxNTJcMlwxMDciKwotICAgICJcNFwwXDFcdTAxNTNcMVwyMjZcMVwyMjdcMVwyMjZcMVwyMzBcMVwyMjZcMVx1MDE1MyIrCi0gICAgIlwzM1wyMjZcMVx1MDE1M1wyXDIyNlwxXHUwMTUzXDJcMjI2XDFcdTAxNTNcMTBcMjI2XDFcdTAxNTMiKwotICAgICJcM1wyMjZcMVx1MDE1M1w1XDIyNlwxXDBcMVx1MDE1NFwxXDIzMVwxXDIzMlwzXDIzMSIrCi0gICAgIlwxXHUwMTU0XDFcMjMwXDMyXDIzMVwxXHUwMTU0XDJcMjMxXDFcdTAxNTRcMlwyMzFcMVx1MDE1NCIrCi0gICAgIlwxMFwyMzFcMVx1MDE1NFwzXDIzMVwxXHUwMTU0XDVcMjMxXDFcMFwxXHUwMTU1XDFcMTE0IisKLSAgICAiXDFcMjM0XDFcMTE0XDFcMFwxXDExNFwxXHUwMTU1XDFcMFwxXDExNFwxXDAiKwotICAgICJcMVwxMTRcM1wwXDJcMTE0XDJcMFwzXDExNFwxXDBcMVwxMTRcMTNcMCIrCi0gICAgIlwxXHUwMTU1XDJcMTE0XDFcdTAxNTVcMlwxMTRcMVx1MDE1NVwyXDExNFwxXDBcNFwxMTQiKwotICAgICJcMVwwXDFcdTAxNTVcMlwxMTRcMVwwXDFcdTAxNTVcMlwxMTRcNFwwXDFcdTAxNTYiKwotICAgICJcMVwyMzdcMVwyNDBcMVwyMzdcMVwwXDFcMjM3XDFcdTAxNTZcMVwwXDFcMjM3IisKLSAgICAiXDFcMFwxXDIzN1wzXDBcMlwyMzdcMlwwXDNcMjM3XDFcMFwxXDIzNyIrCi0gICAgIlwxM1wwXDFcdTAxNTZcMlwyMzdcMVx1MDE1NlwyXDIzN1wxXHUwMTU2XDJcMjM3XDFcMCIrCi0gICAgIlw0XDIzN1wxXDBcMVx1MDE1NlwyXDIzN1wxXDBcMVx1MDE1NlwyXDIzN1w0XDAiKwotICAgICJcMVx1MDE1N1wxXDEyMlwxXDI0M1wxXDEyMlwxXDBcMVwxMjJcMVx1MDE1N1wxXDAiKwotICAgICJcMVwxMjJcMVwwXDFcMTIyXDNcMFwyXDEyMlwyXDBcM1wxMjJcMVwyNDQiKwotICAgICJcMVwxMjJcMTNcMFwxXHUwMTU3XDJcMTIyXDFcdTAxNTdcMlwxMjJcMVx1MDE1N1wyXDEyMiIrCi0gICAgIlwxXDBcNFwxMjJcMVwwXDFcdTAxNTdcMlwxMjJcMVwwXDFcdTAxNTdcMlwxMjIiKwotICAgICJcNFwwXDFcdTAxNThcMVwyNDZcMVwyNDdcMVwyNDZcMVwyNTBcMVwyNDZcMVx1MDE1OCIrCi0gICAgIlwzM1wyNDZcMVx1MDE1OFwyXDI0NlwxXHUwMTU4XDJcMjQ2XDFcdTAxNThcMTBcMjQ2XDFcdTAxNTgiKwotICAgICJcM1wyNDZcMVx1MDE1OFw1XDI0NlwxXDBcMVx1MDE1OVwxXDI1MVwxXDI1MlwzXDI1MSIrCi0gICAgIlwxXHUwMTU5XDFcMjUwXDMyXDI1MVwxXHUwMTU5XDJcMjUxXDFcdTAxNTlcMlwyNTFcMVx1MDE1OSIrCi0gICAgIlwxMFwyNTFcMVx1MDE1OVwzXDI1MVwxXHUwMTU5XDVcMjUxXDFcMFwxXHUwMTVhXDFcMjU2IisKLSAgICAiXDFcMjU3XDFcMjU2XDFcMFwxXDI1NlwxXHUwMTVhXDFcMFwxXDI1NlwxXDAiKwotICAgICJcMVwyNTZcM1wwXDJcMjU2XDJcMFwzXDI1NlwxXDBcMVwyNTZcMTNcMCIrCi0gICAgIlwxXHUwMTVhXDJcMjU2XDFcdTAxNWFcMlwyNTZcMVx1MDE1YVwyXDI1NlwxXDBcNFwyNTYiKwotICAgICJcMVwwXDFcdTAxNWFcMlwyNTZcMVwwXDFcdTAxNWFcMlwyNTZcNFwwXDFcdTAxNWIiKwotICAgICJcNVwwXDFcdTAxNWJcM1wwXDFcdTAxMGRcNVwwXDFcdTAxNWJcNVwwXDFcdTAxNWIiKwotICAgICJcMTNcMFwyXHUwMTViXDFcMFwyXHUwMTViXDFcMFwyXHUwMTViXDdcMFwyXHUwMTViIisKLSAgICAiXDJcMFwyXHUwMTViXDVcMFwxXHUwMTVjXDVcMFwxXHUwMTVjXDExXDBcMVx1MDE1YyIrCi0gICAgIlw1XDBcMVx1MDE1Y1wxM1wwXDJcdTAxNWNcMVwwXDJcdTAxNWNcMVwwXDJcdTAxNWMiKwotICAgICJcN1wwXDJcdTAxNWNcMlwwXDJcdTAxNWNcNVwwXDJcdTAxMzVcMVx1MDEzNlwxXHUwMTVkIisKLSAgICAiXDFcMFwyXHUwMTM1XDFcMFwxXHUwMTVkXDFcdTAxM2FcNFx1MDEzNVwyXHUwMTVkXDVcdTAxMzUiKwotICAgICJcMVwwXDQ1XHUwMTM1XDFcMFwxXHUwMTVlXDFcdTAxMzVcMVx1MDEzNlwxXHUwMTVkXDJcdTAxMzUiKwotICAgICJcMVx1MDE1ZVwxXHUwMTM1XDFcdTAxNWRcMVx1MDE1Zlw0XHUwMTM1XDJcdTAxNWRcMjJcdTAxMzVcMVx1MDE1ZSIrCi0gICAgIlwyXHUwMTM1XDFcdTAxNWVcMlx1MDEzNVwxXHUwMTVlXDEwXHUwMTM1XDFcdTAxNWVcM1x1MDEzNVwxXHUwMTVlIisKLSAgICAiXDVcdTAxMzVcMVwwXDJcdTAxMzhcMVx1MDE2MFwxXDBcMVx1MDE1ZFwxMVx1MDEzOFwyXDAiKwotICAgICJcNTNcdTAxMzhcMVwwXDJcdTAxMzlcMVx1MDE2MVwxXDBcM1x1MDEzOVwxXHUwMTVkXDZcdTAxMzkiKwotICAgICJcMlwwXDUzXHUwMTM5XDI0XDBcMVx1MDE2Mlw1MFwwXDFcdTAxNjNcMVwzMlwxXDE0NyIrCi0gICAgIlwxXDMyXDFcMFwxXDMyXDFcdTAxNjNcMVwwXDFcMzJcMVwwXDFcMzIiKwotICAgICJcM1wwXDJcMzJcMlwwXDNcMzJcMVwwXDFcMzJcMTNcMFwxXHUwMTYzIisKLSAgICAiXDJcMzJcMVx1MDE2M1wyXDMyXDFcdTAxNjNcMlwzMlwxXDBcNFwzMlwxXDAiKwotICAgICJcMVx1MDE2M1wyXDMyXDFcMFwxXHUwMTYzXDJcMzJcNFwwXDFcdTAxNjRcMVwxNTIiKwotICAgICJcMVwxNTNcMVwxNTJcMVwwXDFcMTUyXDFcdTAxNjRcMVwwXDFcMTUyXDFcMCIrCi0gICAgIlwxXDE1MlwzXDBcMlwxNTJcMlwwXDNcMTUyXDFcMFwxXDE1MlwxM1wwIisKLSAgICAiXDFcdTAxNjRcMlwxNTJcMVx1MDE2NFwyXDE1MlwxXHUwMTY0XDJcMTUyXDFcMFw0XDE1MiIrCi0gICAgIlwxXDBcMVx1MDE2NFwyXDE1MlwxXDBcMVx1MDE2NFwyXDE1Mlw0XDBcMVx1MDE2NSIrCi0gICAgIlwxXDE1NFwxXDE1NVwxXDE1NFwxXDBcMVwxNTRcMVx1MDE2NVwxXDBcMVwxNTQiKwotICAgICJcMVwwXDFcMTU0XDNcMFwyXDE1NFwyXDBcM1wxNTRcMVwwXDFcMTU0IisKLSAgICAiXDEzXDBcMVx1MDE2NVwyXDE1NFwxXHUwMTY1XDJcMTU0XDFcdTAxNjVcMlwxNTRcMVwwIisKLSAgICAiXDRcMTU0XDFcMFwxXHUwMTY1XDJcMTU0XDFcMFwxXHUwMTY1XDJcMTU0XDU0XDAiKwotICAgICJcMlx1MDE2Nlw3NFwwXDFcdTAxNjdcMTA2XDBcMlx1MDE2OFw1XDBcMVx1MDE2OVwxXDM2NyIrCi0gICAgIlwxXDM3MFwxXDM2N1wxXDBcMVwzNjdcMVx1MDE2OVwxXDBcMVwzNjdcMVx1MDExYSIrCi0gICAgIlwxXDM2N1wzXDBcMlwzNjdcMlwwXDNcMzY3XDFcMFwxXDM2N1wxM1wwIisKLSAgICAiXDFcdTAxNjlcMlwzNjdcMVx1MDE2OVwyXDM2N1wxXHUwMTY5XDJcMzY3XDFcMFw0XDM2NyIrCi0gICAgIlwxXDBcMVx1MDE2OVwyXDM2N1wxXDBcMVx1MDE2OVwyXDM2N1w0XDBcMVx1MDE2YSIrCi0gICAgIlwxXDE3MVwxXDE3MlwxXDE3MVwxXDBcMVwxNzFcMVx1MDE2YVwxXDBcMVwxNzEiKwotICAgICJcMVwwXDFcMTcxXDNcMFwyXDE3MVwyXDBcM1wxNzFcMVwzMDRcMVwxNzEiKwotICAgICJcMTNcMFwxXHUwMTZhXDJcMTcxXDFcdTAxNmFcMlwxNzFcMVx1MDE2YVwyXDE3MVwxXDAiKwotICAgICJcNFwxNzFcMVwwXDFcdTAxNmFcMlwxNzFcMVwwXDFcdTAxNmFcMlwxNzFcNFwwIisKLSAgICAiXDFcdTAxNmJcMVwxNzNcMVwxNzRcMVwxNzNcMVwxNzVcMVwxNzNcMVx1MDE2YlwzM1wxNzMiKwotICAgICJcMVx1MDE2YlwyXDE3M1wxXHUwMTZiXDJcMTczXDFcdTAxNmJcMTBcMTczXDFcdTAxNmJcM1wxNzMiKwotICAgICJcMVx1MDE2Ylw1XDE3M1wxXDBcMVx1MDE2Y1wxXDE3NlwxXDE3N1wzXDE3NlwxXHUwMTZjIisKLSAgICAiXDFcMTc1XDMyXDE3NlwxXHUwMTZjXDJcMTc2XDFcdTAxNmNcMlwxNzZcMVx1MDE2Y1wxMFwxNzYiKwotICAgICJcMVx1MDE2Y1wzXDE3NlwxXHUwMTZjXDVcMTc2XDFcMFwxXHUwMTZkXDFcMjAxXDFcMjAyIisKLSAgICAiXDFcMjAxXDFcMjAzXDFcMjAxXDFcdTAxNmRcMzNcMjAxXDFcdTAxNmRcMlwyMDFcMVx1MDE2ZCIrCi0gICAgIlwyXDIwMVwxXHUwMTZkXDEwXDIwMVwxXHUwMTZkXDNcMjAxXDFcdTAxNmRcNVwyMDFcMVwwIisKLSAgICAiXDFcdTAxNmVcMVwyMDRcMVwyMDVcM1wyMDRcMVx1MDE2ZVwxXDIwM1wzMlwyMDRcMVx1MDE2ZSIrCi0gICAgIlwyXDIwNFwxXHUwMTZlXDJcMjA0XDFcdTAxNmVcMTBcMjA0XDFcdTAxNmVcM1wyMDRcMVx1MDE2ZSIrCi0gICAgIlw1XDIwNFw0XDBcMVx1MDE0OVwxXDBcMVx1MDE0OVwyXDBcMVx1MDE0OVwxXHUwMTI1IisKLSAgICAiXDRcMFwyXHUwMTQ5XDU0XDBcMVx1MDE2ZlwxXHUwMTIxXDFcdTAxMjJcMVx1MDEyMVwxXDAiKwotICAgICJcMVx1MDEyMVwxXHUwMTZmXDFcMFwxXHUwMTIxXDFcdTAxMjVcMTNcdTAxMjFcMVwwXDE0XHUwMTIxIisKLSAgICAiXDFcdTAxNmZcMlx1MDEyMVwxXHUwMTZmXDJcdTAxMjFcMVx1MDE2ZlwxMFx1MDEyMVwxXHUwMTZmXDNcdTAxMjEiKwotICAgICJcMVx1MDE2Zlw1XHUwMTIxXDFcMFwxXHUwMTcwXDFcdTAxMjNcMVx1MDE0Y1wxXHUwMTIzXDFcdTAxNzEiKwotICAgICJcMVx1MDEyM1wxXHUwMTcwXDEwXHUwMTIzXDFcdTAxNzJcMjJcdTAxMjNcMVx1MDE3MFwyXHUwMTIzXDFcdTAxNzAiKwotICAgICJcMlx1MDEyM1wxXHUwMTcwXDEwXHUwMTIzXDFcdTAxNzBcM1x1MDEyM1wxXHUwMTcwXDVcdTAxMjNcMVwwIisKLSAgICAiXDFcdTAxNzNcMVx1MDEyNFwxXHUwMTRkXDNcdTAxMjRcMVx1MDE3M1wxXHUwMTc0XDdcdTAxMjRcMVx1MDE3NSIrCi0gICAgIlwyMlx1MDEyNFwxXHUwMTczXDJcdTAxMjRcMVx1MDE3M1wyXHUwMTI0XDFcdTAxNzNcMTBcdTAxMjRcMVx1MDE3MyIrCi0gICAgIlwzXHUwMTI0XDFcdTAxNzNcNVx1MDEyNFwxXDBcMVx1MDE3NlwxXDYwXDFcMjA3XDFcNjAiKwotICAgICJcMVwwXDFcNjBcMVx1MDE3NlwxXDBcMVw2MFwxXDBcMVw2MFwzXDAiKwotICAgICJcMlw2MFwyXDBcM1w2MFwxXDBcMVw2MFwxM1wwXDFcdTAxNzZcMlw2MCIrCi0gICAgIlwxXHUwMTc2XDJcNjBcMVx1MDE3NlwyXDYwXDFcMFw0XDYwXDFcMFwxXHUwMTc2IisKLSAgICAiXDJcNjBcMVwwXDFcdTAxNzZcMlw2MFw0XDBcMVx1MDE3N1wxXDY0XDFcMjEyIisKLSAgICAiXDFcNjRcMVwwXDFcNjRcMVx1MDE3N1wxXDBcMVw2NFwxXDBcMVw2NCIrCi0gICAgIlwzXDBcMlw2NFwyXDBcM1w2NFwxXDBcMVw2NFwxM1wwXDFcdTAxNzciKwotICAgICJcMlw2NFwxXHUwMTc3XDJcNjRcMVx1MDE3N1wyXDY0XDFcMFw0XDY0XDFcMCIrCi0gICAgIlwxXHUwMTc3XDJcNjRcMVwwXDFcdTAxNzdcMlw2NFw0XDBcMVx1MDE3OFwxXDcxIisKLSAgICAiXDFcMjE1XDFcNzFcMVwwXDFcNzFcMVx1MDE3OFwxXDBcMVw3MVwxXDAiKwotICAgICJcMVw3MVwzXDBcMlw3MVwyXDBcM1w3MVwxXDBcMVw3MVwxM1wwIisKLSAgICAiXDFcdTAxNzhcMlw3MVwxXHUwMTc4XDJcNzFcMVx1MDE3OFwyXDcxXDFcMFw0XDcxIisKLSAgICAiXDFcMFwxXHUwMTc4XDJcNzFcMVwwXDFcdTAxNzhcMlw3MVw0XDBcMVx1MDE3OSIrCi0gICAgIlwxXDEwMVwxXDIyMVwxXDEwMVwxXDBcMVwxMDFcMVx1MDE3OVwxXDBcMVwxMDEiKwotICAgICJcMVwwXDFcMTAxXDNcMFwyXDEwMVwyXDBcM1wxMDFcMVwwXDFcMTAxIisKLSAgICAiXDEzXDBcMVx1MDE3OVwyXDEwMVwxXHUwMTc5XDJcMTAxXDFcdTAxNzlcMlwxMDFcMVwwIisKLSAgICAiXDRcMTAxXDFcMFwxXHUwMTc5XDJcMTAxXDFcMFwxXHUwMTc5XDJcMTAxXDRcMCIrCi0gICAgIlwxXHUwMTdhXDFcMTA3XDFcMjI0XDFcMTA3XDFcMFwxXDEwN1wxXHUwMTdhXDFcMCIrCi0gICAgIlwxXDEwN1wxXDBcMVwxMDdcM1wwXDJcMTA3XDJcMFwzXDEwN1wxXDAiKwotICAgICJcMVwxMDdcMTNcMFwxXHUwMTdhXDJcMTA3XDFcdTAxN2FcMlwxMDdcMVx1MDE3YVwyXDEwNyIrCi0gICAgIlwxXDBcNFwxMDdcMVwwXDFcdTAxN2FcMlwxMDdcMVwwXDFcdTAxN2FcMlwxMDciKwotICAgICJcNFwwXDFcdTAxN2JcMVwyMjZcMVwyMjdcMVwyMjZcMVwyMzBcMVwyMjZcMVx1MDE3YiIrCi0gICAgIlwzM1wyMjZcMVx1MDE3YlwyXDIyNlwxXHUwMTdiXDJcMjI2XDFcdTAxN2JcMTBcMjI2XDFcdTAxN2IiKwotICAgICJcM1wyMjZcMVx1MDE3Ylw1XDIyNlwxXDBcMVx1MDE3Y1wxXDIzMVwxXDIzMlwzXDIzMSIrCi0gICAgIlwxXHUwMTdjXDFcMjMwXDMyXDIzMVwxXHUwMTdjXDJcMjMxXDFcdTAxN2NcMlwyMzFcMVx1MDE3YyIrCi0gICAgIlwxMFwyMzFcMVx1MDE3Y1wzXDIzMVwxXHUwMTdjXDVcMjMxXDFcMFwxXHUwMTdkXDFcMTE0IisKLSAgICAiXDFcMjM0XDFcMTE0XDFcMFwxXDExNFwxXHUwMTdkXDFcMFwxXDExNFwxXDAiKwotICAgICJcMVwxMTRcM1wwXDJcMTE0XDJcMFwzXDExNFwxXDBcMVwxMTRcMTNcMCIrCi0gICAgIlwxXHUwMTdkXDJcMTE0XDFcdTAxN2RcMlwxMTRcMVx1MDE3ZFwyXDExNFwxXDBcNFwxMTQiKwotICAgICJcMVwwXDFcdTAxN2RcMlwxMTRcMVwwXDFcdTAxN2RcMlwxMTRcNFwwXDFcdTAxN2UiKwotICAgICJcMVwyMzdcMVwyNDBcMVwyMzdcMVwwXDFcMjM3XDFcdTAxN2VcMVwwXDFcMjM3IisKLSAgICAiXDFcMFwxXDIzN1wzXDBcMlwyMzdcMlwwXDNcMjM3XDFcMFwxXDIzNyIrCi0gICAgIlwxM1wwXDFcdTAxN2VcMlwyMzdcMVx1MDE3ZVwyXDIzN1wxXHUwMTdlXDJcMjM3XDFcMCIrCi0gICAgIlw0XDIzN1wxXDBcMVx1MDE3ZVwyXDIzN1wxXDBcMVx1MDE3ZVwyXDIzN1w0XDAiKwotICAgICJcMVx1MDE3ZlwxXDEyMlwxXDI0M1wxXDEyMlwxXDBcMVwxMjJcMVx1MDE3ZlwxXDAiKwotICAgICJcMVwxMjJcMVwwXDFcMTIyXDNcMFwyXDEyMlwyXDBcM1wxMjJcMVwyNDQiKwotICAgICJcMVwxMjJcMTNcMFwxXHUwMTdmXDJcMTIyXDFcdTAxN2ZcMlwxMjJcMVx1MDE3ZlwyXDEyMiIrCi0gICAgIlwxXDBcNFwxMjJcMVwwXDFcdTAxN2ZcMlwxMjJcMVwwXDFcdTAxN2ZcMlwxMjIiKwotICAgICJcNFwwXDFcdTAxODBcMVwyNDZcMVwyNDdcMVwyNDZcMVwyNTBcMVwyNDZcMVx1MDE4MCIrCi0gICAgIlwzM1wyNDZcMVx1MDE4MFwyXDI0NlwxXHUwMTgwXDJcMjQ2XDFcdTAxODBcMTBcMjQ2XDFcdTAxODAiKwotICAgICJcM1wyNDZcMVx1MDE4MFw1XDI0NlwxXDBcMVx1MDE4MVwxXDI1MVwxXDI1MlwzXDI1MSIrCi0gICAgIlwxXHUwMTgxXDFcMjUwXDMyXDI1MVwxXHUwMTgxXDJcMjUxXDFcdTAxODFcMlwyNTFcMVx1MDE4MSIrCi0gICAgIlwxMFwyNTFcMVx1MDE4MVwzXDI1MVwxXHUwMTgxXDVcMjUxXDFcMFwxXHUwMTgyXDFcMjU2IisKLSAgICAiXDFcMjU3XDFcMjU2XDFcMFwxXDI1NlwxXHUwMTgyXDFcMFwxXDI1NlwxXDAiKwotICAgICJcMVwyNTZcM1wwXDJcMjU2XDJcMFwzXDI1NlwxXDBcMVwyNTZcMTNcMCIrCi0gICAgIlwxXHUwMTgyXDJcMjU2XDFcdTAxODJcMlwyNTZcMVx1MDE4MlwyXDI1NlwxXDBcNFwyNTYiKwotICAgICJcMVwwXDFcdTAxODJcMlwyNTZcMVwwXDFcdTAxODJcMlwyNTZcNFwwXDFcdTAxODMiKwotICAgICJcNVwwXDFcdTAxODNcM1wwXDFcdTAxMGRcNVwwXDFcdTAxODNcNVwwXDFcdTAxODMiKwotICAgICJcMTNcMFwyXHUwMTgzXDFcMFwyXHUwMTgzXDFcMFwyXHUwMTgzXDdcMFwyXHUwMTgzIisKLSAgICAiXDJcMFwyXHUwMTgzXDVcMFwxXHUwMTg0XDVcMFwxXHUwMTg0XDExXDBcMVx1MDE4NCIrCi0gICAgIlw1XDBcMVx1MDE4NFwxM1wwXDJcdTAxODRcMVwwXDJcdTAxODRcMVwwXDJcdTAxODQiKwotICAgICJcN1wwXDJcdTAxODRcMlwwXDJcdTAxODRcMTBcMFwxXHUwMTVkXDFcMFwxXHUwMTVkIisKLSAgICAiXDJcMFwxXHUwMTVkXDFcdTAxM2FcNFwwXDJcdTAxNWRcNTRcMFwxXHUwMTg1XDFcdTAxMzUiKwotICAgICJcMVx1MDEzNlwxXHUwMTM1XDFcMFwxXHUwMTM1XDFcdTAxODVcMVwwXDFcdTAxMzVcMVx1MDEzYSIrCi0gICAgIlwxM1x1MDEzNVwxXDBcMTRcdTAxMzVcMVx1MDE4NVwyXHUwMTM1XDFcdTAxODVcMlx1MDEzNVwxXHUwMTg1IisKLSAgICAiXDEwXHUwMTM1XDFcdTAxODVcM1x1MDEzNVwxXHUwMTg1XDVcdTAxMzVcMVwwXDFcdTAxODZcMVx1MDEzOCIrCi0gICAgIlwxXHUwMTYwXDFcdTAxMzhcMVx1MDE4N1wxXHUwMTM4XDFcdTAxODZcMTBcdTAxMzhcMVx1MDE4OFwyMlx1MDEzOCIrCi0gICAgIlwxXHUwMTg2XDJcdTAxMzhcMVx1MDE4NlwyXHUwMTM4XDFcdTAxODZcMTBcdTAxMzhcMVx1MDE4NlwzXHUwMTM4IisKLSAgICAiXDFcdTAxODZcNVx1MDEzOFwxXDBcMVx1MDE4OVwxXHUwMTM5XDFcdTAxNjFcM1x1MDEzOVwxXHUwMTg5IisKLSAgICAiXDFcdTAxOGFcN1x1MDEzOVwxXHUwMThiXDIyXHUwMTM5XDFcdTAxODlcMlx1MDEzOVwxXHUwMTg5XDJcdTAxMzkiKwotICAgICJcMVx1MDE4OVwxMFx1MDEzOVwxXHUwMTg5XDNcdTAxMzlcMVx1MDE4OVw1XHUwMTM5XDUzXDBcMVx1MDE4YyIrCi0gICAgIlwyMVwwXDJcMzJcMVwxNDdcMVwzMlwxXDBcMlwzMlwxXDBcMVwzMiIrCi0gICAgIlwxXDBcMVwzMlwzXDBcMlwzMlwyXDBcM1wzMlwxXDBcMVwzMiIrCi0gICAgIlwxM1wwXDExXDMyXDFcMFw0XDMyXDFcMFwzXDMyXDFcMFwzXDMyIisKLSAgICAiXDRcMFwxXHUwMThkXDFcMTUyXDFcMTUzXDFcMTUyXDFcMFwxXDE1MlwxXHUwMThkIisKLSAgICAiXDFcMFwxXDE1MlwxXDBcMVwxNTJcM1wwXDJcMTUyXDJcMFwzXDE1MiIrCi0gICAgIlwxXDBcMVwxNTJcMTNcMFwxXHUwMThkXDJcMTUyXDFcdTAxOGRcMlwxNTJcMVx1MDE4ZCIrCi0gICAgIlwyXDE1MlwxXDBcNFwxNTJcMVwwXDFcdTAxOGRcMlwxNTJcMVwwXDFcdTAxOGQiKwotICAgICJcMlwxNTJcNFwwXDFcdTAxOGVcMVwxNTRcMVwxNTVcMVwxNTRcMVwwXDFcMTU0IisKLSAgICAiXDFcdTAxOGVcMVwwXDFcMTU0XDFcMFwxXDE1NFwzXDBcMlwxNTRcMlwwIisKLSAgICAiXDNcMTU0XDFcMFwxXDE1NFwxM1wwXDFcdTAxOGVcMlwxNTRcMVx1MDE4ZVwyXDE1NCIrCi0gICAgIlwxXHUwMThlXDJcMTU0XDFcMFw0XDE1NFwxXDBcMVx1MDE4ZVwyXDE1NFwxXDAiKwotICAgICJcMVx1MDE4ZVwyXDE1NFw1NlwwXDFcdTAxOGZcNjZcMFwyXHUwMTkwXDI1XDBcMVx1MDE5MSIrCi0gICAgIlwxXDM2N1wxXDM3MFwxXDM2N1wxXDBcMVwzNjdcMVx1MDE5MVwxXDBcMVwzNjciKwotICAgICJcMVx1MDExYVwxXDM2N1wzXDBcMlwzNjdcMlwwXDNcMzY3XDFcMFwxXDM2NyIrCi0gICAgIlwxM1wwXDFcdTAxOTFcMlwzNjdcMVx1MDE5MVwyXDM2N1wxXHUwMTkxXDJcMzY3XDFcMCIrCi0gICAgIlw0XDM2N1wxXDBcMVx1MDE5MVwyXDM2N1wxXDBcMVx1MDE5MVwyXDM2N1w0XDAiKwotICAgICJcMVx1MDE5MlwxXDE3MVwxXDE3MlwxXDE3MVwxXDBcMVwxNzFcMVx1MDE5MlwxXDAiKwotICAgICJcMVwxNzFcMVwwXDFcMTcxXDNcMFwyXDE3MVwyXDBcM1wxNzFcMVwzMDQiKwotICAgICJcMVwxNzFcMTNcMFwxXHUwMTkyXDJcMTcxXDFcdTAxOTJcMlwxNzFcMVx1MDE5MlwyXDE3MSIrCi0gICAgIlwxXDBcNFwxNzFcMVwwXDFcdTAxOTJcMlwxNzFcMVwwXDFcdTAxOTJcMlwxNzEiKwotICAgICJcNFwwXDFcdTAxOTNcMVwxNzNcMVwxNzRcMVwxNzNcMVwxNzVcMVwxNzNcMVx1MDE5MyIrCi0gICAgIlwzM1wxNzNcMVx1MDE5M1wyXDE3M1wxXHUwMTkzXDJcMTczXDFcdTAxOTNcMTBcMTczXDFcdTAxOTMiKwotICAgICJcM1wxNzNcMVx1MDE5M1w1XDE3M1wxXDBcMVx1MDE5NFwxXDE3NlwxXDE3N1wzXDE3NiIrCi0gICAgIlwxXHUwMTk0XDFcMTc1XDMyXDE3NlwxXHUwMTk0XDJcMTc2XDFcdTAxOTRcMlwxNzZcMVx1MDE5NCIrCi0gICAgIlwxMFwxNzZcMVx1MDE5NFwzXDE3NlwxXHUwMTk0XDVcMTc2XDFcMFwxXHUwMTk1XDFcMjAxIisKLSAgICAiXDFcMjAyXDFcMjAxXDFcMjAzXDFcMjAxXDFcdTAxOTVcMzNcMjAxXDFcdTAxOTVcMlwyMDEiKwotICAgICJcMVx1MDE5NVwyXDIwMVwxXHUwMTk1XDEwXDIwMVwxXHUwMTk1XDNcMjAxXDFcdTAxOTVcNVwyMDEiKwotICAgICJcMVwwXDFcdTAxOTZcMVwyMDRcMVwyMDVcM1wyMDRcMVx1MDE5NlwxXDIwM1wzMlwyMDQiKwotICAgICJcMVx1MDE5NlwyXDIwNFwxXHUwMTk2XDJcMjA0XDFcdTAxOTZcMTBcMjA0XDFcdTAxOTZcM1wyMDQiKwotICAgICJcMVx1MDE5Nlw1XDIwNFwxXDBcMVx1MDE5N1wxXHUwMTIxXDFcdTAxMjJcMVx1MDEyMVwxXDAiKwotICAgICJcMVx1MDEyMVwxXHUwMTk3XDFcMFwxXHUwMTIxXDFcdTAxMjVcMTNcdTAxMjFcMVwwXDE0XHUwMTIxIisKLSAgICAiXDFcdTAxOTdcMlx1MDEyMVwxXHUwMTk3XDJcdTAxMjFcMVx1MDE5N1wxMFx1MDEyMVwxXHUwMTk3XDNcdTAxMjEiKwotICAgICJcMVx1MDE5N1w1XHUwMTIxXDFcMFwxXHUwMTk4XDFcdTAxMjNcMVx1MDE0Y1wxXHUwMTIzXDFcdTAxNDkiKwotICAgICJcMVx1MDEyM1wxXHUwMTk4XDMzXHUwMTIzXDFcdTAxOThcMlx1MDEyM1wxXHUwMTk4XDJcdTAxMjNcMVx1MDE5OCIrCi0gICAgIlwxMFx1MDEyM1wxXHUwMTk4XDNcdTAxMjNcMVx1MDE5OFw1XHUwMTIzXDFcMFwyXHUwMTIzXDFcdTAxNGMiKwotICAgICJcMlx1MDE0OVwxXHUwMTcxXDJcdTAxMjNcMVx1MDE3MVwxXHUwMTk5XDRcdTAxMjNcMlx1MDE0OVw1M1x1MDEyMyIrCi0gICAgIlwxXDBcMlx1MDEyM1wxXHUwMTRjXDFcMFwxXHUwMTQ5XDEyXHUwMTIzXDFcMFw1M1x1MDEyMyIrCi0gICAgIlwxXDBcMVx1MDE5YVwxXHUwMTI0XDFcdTAxNGRcM1x1MDEyNFwxXHUwMTlhXDFcdTAxNDlcMzJcdTAxMjQiKwotICAgICJcMVx1MDE5YVwyXHUwMTI0XDFcdTAxOWFcMlx1MDEyNFwxXHUwMTlhXDEwXHUwMTI0XDFcdTAxOWFcM1x1MDEyNCIrCi0gICAgIlwxXHUwMTlhXDVcdTAxMjRcMVwwXDJcdTAxMjRcMVx1MDE0ZFwxXHUwMTQ5XDFcdTAxMjRcMVx1MDE3NCIrCi0gICAgIlwxXHUwMTI0XDFcdTAxNDlcMVx1MDE3NFwxXHUwMTliXDRcdTAxMjRcMlx1MDE0OVw1M1x1MDEyNFwxXDAiKwotICAgICJcMlx1MDEyNFwxXHUwMTRkXDFcMFwzXHUwMTI0XDFcdTAxNDlcN1x1MDEyNFwxXDBcNTNcdTAxMjQiKwotICAgICJcMVwwXDJcNjBcMVwyMDdcMVw2MFwxXDBcMlw2MFwxXDBcMVw2MCIrCi0gICAgIlwxXDBcMVw2MFwzXDBcMlw2MFwyXDBcM1w2MFwxXDBcMVw2MCIrCi0gICAgIlwxM1wwXDExXDYwXDFcMFw0XDYwXDFcMFwzXDYwXDFcMFwzXDYwIisKLSAgICAiXDRcMFwyXDY0XDFcMjEyXDFcNjRcMVwwXDJcNjRcMVwwXDFcNjQiKwotICAgICJcMVwwXDFcNjRcM1wwXDJcNjRcMlwwXDNcNjRcMVwwXDFcNjQiKwotICAgICJcMTNcMFwxMVw2NFwxXDBcNFw2NFwxXDBcM1w2NFwxXDBcM1w2NCIrCi0gICAgIlw0XDBcMlw3MVwxXDIxNVwxXDcxXDFcMFwyXDcxXDFcMFwxXDcxIisKLSAgICAiXDFcMFwxXDcxXDNcMFwyXDcxXDJcMFwzXDcxXDFcMFwxXDcxIisKLSAgICAiXDEzXDBcMTFcNzFcMVwwXDRcNzFcMVwwXDNcNzFcMVwwXDNcNzEiKwotICAgICJcNFwwXDJcMTAxXDFcMjIxXDFcMTAxXDFcMFwyXDEwMVwxXDBcMVwxMDEiKwotICAgICJcMVwwXDFcMTAxXDNcMFwyXDEwMVwyXDBcM1wxMDFcMVwwXDFcMTAxIisKLSAgICAiXDEzXDBcMTFcMTAxXDFcMFw0XDEwMVwxXDBcM1wxMDFcMVwwXDNcMTAxIisKLSAgICAiXDRcMFwyXDEwN1wxXDIyNFwxXDEwN1wxXDBcMlwxMDdcMVwwXDFcMTA3IisKLSAgICAiXDFcMFwxXDEwN1wzXDBcMlwxMDdcMlwwXDNcMTA3XDFcMFwxXDEwNyIrCi0gICAgIlwxM1wwXDExXDEwN1wxXDBcNFwxMDdcMVwwXDNcMTA3XDFcMFwzXDEwNyIrCi0gICAgIlw0XDBcMVx1MDE5Y1wxXDIyNlwxXDIyN1wxXDIyNlwxXDIzMFwxXDIyNlwxXHUwMTljIisKLSAgICAiXDMzXDIyNlwxXHUwMTljXDJcMjI2XDFcdTAxOWNcMlwyMjZcMVx1MDE5Y1wxMFwyMjZcMVx1MDE5YyIrCi0gICAgIlwzXDIyNlwxXHUwMTljXDVcMjI2XDFcMFwxXHUwMTlkXDFcMjMxXDFcMjMyXDNcMjMxIisKLSAgICAiXDFcdTAxOWRcMVwyMzBcMzJcMjMxXDFcdTAxOWRcMlwyMzFcMVx1MDE5ZFwyXDIzMVwxXHUwMTlkIisKLSAgICAiXDEwXDIzMVwxXHUwMTlkXDNcMjMxXDFcdTAxOWRcNVwyMzFcMVwwXDJcMTE0XDFcMjM0IisKLSAgICAiXDFcMTE0XDFcMFwyXDExNFwxXDBcMVwxMTRcMVwwXDFcMTE0XDNcMCIrCi0gICAgIlwyXDExNFwyXDBcM1wxMTRcMVwwXDFcMTE0XDEzXDBcMTFcMTE0XDFcMCIrCi0gICAgIlw0XDExNFwxXDBcM1wxMTRcMVwwXDNcMTE0XDRcMFwxXHUwMTllXDFcMjM3IisKLSAgICAiXDFcMjQwXDFcMjM3XDFcMFwxXDIzN1wxXHUwMTllXDFcMFwxXDIzN1wxXDAiKwotICAgICJcMVwyMzdcM1wwXDJcMjM3XDJcMFwzXDIzN1wxXDBcMVwyMzdcMTNcMCIrCi0gICAgIlwxXHUwMTllXDJcMjM3XDFcdTAxOWVcMlwyMzdcMVx1MDE5ZVwyXDIzN1wxXDBcNFwyMzciKwotICAgICJcMVwwXDFcdTAxOWVcMlwyMzdcMVwwXDFcdTAxOWVcMlwyMzdcNFwwXDJcMTIyIisKLSAgICAiXDFcMjQzXDFcMTIyXDFcMFwyXDEyMlwxXDBcMVwxMjJcMVwwXDFcMTIyIisKLSAgICAiXDNcMFwyXDEyMlwyXDBcM1wxMjJcMVwyNDRcMVwxMjJcMTNcMFwxMVwxMjIiKwotICAgICJcMVwwXDRcMTIyXDFcMFwzXDEyMlwxXDBcM1wxMjJcNFwwXDFcdTAxOWYiKwotICAgICJcMVwyNDZcMVwyNDdcMVwyNDZcMVwyNTBcMVwyNDZcMVx1MDE5ZlwzM1wyNDZcMVx1MDE5ZiIrCi0gICAgIlwyXDI0NlwxXHUwMTlmXDJcMjQ2XDFcdTAxOWZcMTBcMjQ2XDFcdTAxOWZcM1wyNDZcMVx1MDE5ZiIrCi0gICAgIlw1XDI0NlwxXDBcMVx1MDFhMFwxXDI1MVwxXDI1MlwzXDI1MVwxXHUwMWEwXDFcMjUwIisKLSAgICAiXDMyXDI1MVwxXHUwMWEwXDJcMjUxXDFcdTAxYTBcMlwyNTFcMVx1MDFhMFwxMFwyNTFcMVx1MDFhMCIrCi0gICAgIlwzXDI1MVwxXHUwMWEwXDVcMjUxXDFcMFwxXHUwMWExXDFcMjU2XDFcMjU3XDFcMjU2IisKLSAgICAiXDFcMFwxXDI1NlwxXHUwMWExXDFcMFwxXDI1NlwxXDBcMVwyNTZcM1wwIisKLSAgICAiXDJcMjU2XDJcMFwzXDI1NlwxXDBcMVwyNTZcMTNcMFwxXHUwMWExXDJcMjU2IisKLSAgICAiXDFcdTAxYTFcMlwyNTZcMVx1MDFhMVwyXDI1NlwxXDBcNFwyNTZcMVwwXDFcdTAxYTEiKwotICAgICJcMlwyNTZcMVwwXDFcdTAxYTFcMlwyNTZcNFwwXDFcdTAxYTJcNVwwXDFcdTAxYTIiKwotICAgICJcM1wwXDFcdTAxMGRcNVwwXDFcdTAxYTJcNVwwXDFcdTAxYTJcMTNcMFwyXHUwMWEyIisKLSAgICAiXDFcMFwyXHUwMWEyXDFcMFwyXHUwMWEyXDdcMFwyXHUwMWEyXDJcMFwyXHUwMWEyIisKLSAgICAiXDVcMFwxXHUwMWEzXDVcMFwxXHUwMWEzXDExXDBcMVx1MDFhM1w1XDBcMVx1MDFhMyIrCi0gICAgIlwxM1wwXDJcdTAxYTNcMVwwXDJcdTAxYTNcMVwwXDJcdTAxYTNcN1wwXDJcdTAxYTMiKwotICAgICJcMlwwXDJcdTAxYTNcNVwwXDFcdTAxYTRcMVx1MDEzNVwxXHUwMTM2XDFcdTAxMzVcMVwwIisKLSAgICAiXDFcdTAxMzVcMVx1MDFhNFwxXDBcMVx1MDEzNVwxXHUwMTNhXDEzXHUwMTM1XDFcMFwxNFx1MDEzNSIrCi0gICAgIlwxXHUwMWE0XDJcdTAxMzVcMVx1MDFhNFwyXHUwMTM1XDFcdTAxYTRcMTBcdTAxMzVcMVx1MDFhNFwzXHUwMTM1IisKLSAgICAiXDFcdTAxYTRcNVx1MDEzNVwxXDBcMVx1MDFhNVwxXHUwMTM4XDFcdTAxNjBcMVx1MDEzOFwxXHUwMTVkIisKLSAgICAiXDFcdTAxMzhcMVx1MDFhNVwzM1x1MDEzOFwxXHUwMWE1XDJcdTAxMzhcMVx1MDFhNVwyXHUwMTM4XDFcdTAxYTUiKwotICAgICJcMTBcdTAxMzhcMVx1MDFhNVwzXHUwMTM4XDFcdTAxYTVcNVx1MDEzOFwxXDBcMlx1MDEzOFwxXHUwMTYwIisKLSAgICAiXDJcdTAxNWRcMVx1MDE4N1wyXHUwMTM4XDFcdTAxODdcMVx1MDFhNlw0XHUwMTM4XDJcdTAxNWRcNTNcdTAxMzgiKwotICAgICJcMVwwXDJcdTAxMzhcMVx1MDE2MFwxXDBcMVx1MDE1ZFwxMlx1MDEzOFwxXDBcNTNcdTAxMzgiKwotICAgICJcMVwwXDFcdTAxYTdcMVx1MDEzOVwxXHUwMTYxXDNcdTAxMzlcMVx1MDFhN1wxXHUwMTVkXDMyXHUwMTM5IisKLSAgICAiXDFcdTAxYTdcMlx1MDEzOVwxXHUwMWE3XDJcdTAxMzlcMVx1MDFhN1wxMFx1MDEzOVwxXHUwMWE3XDNcdTAxMzkiKwotICAgICJcMVx1MDFhN1w1XHUwMTM5XDFcMFwyXHUwMTM5XDFcdTAxNjFcMVx1MDE1ZFwxXHUwMTM5XDFcdTAxOGEiKwotICAgICJcMVx1MDEzOVwxXHUwMTVkXDFcdTAxOGFcMVx1MDFhOFw0XHUwMTM5XDJcdTAxNWRcNTNcdTAxMzlcMVwwIisKLSAgICAiXDJcdTAxMzlcMVx1MDE2MVwxXDBcM1x1MDEzOVwxXHUwMTVkXDdcdTAxMzlcMVwwXDUzXHUwMTM5IisKLSAgICAiXDQ2XDBcMlx1MDFhOVwyNVwwXDJcMTUyXDFcMTUzXDFcMTUyXDFcMFwyXDE1MiIrCi0gICAgIlwxXDBcMVwxNTJcMVwwXDFcMTUyXDNcMFwyXDE1MlwyXDBcM1wxNTIiKwotICAgICJcMVwwXDFcMTUyXDEzXDBcMTFcMTUyXDFcMFw0XDE1MlwxXDBcM1wxNTIiKwotICAgICJcMVwwXDNcMTUyXDRcMFwyXDE1NFwxXDE1NVwxXDE1NFwxXDBcMlwxNTQiKwotICAgICJcMVwwXDFcMTU0XDFcMFwxXDE1NFwzXDBcMlwxNTRcMlwwXDNcMTU0IisKLSAgICAiXDFcMFwxXDE1NFwxM1wwXDExXDE1NFwxXDBcNFwxNTRcMVwwXDNcMTU0IisKLSAgICAiXDFcMFwzXDE1NFw0NlwwXDJcdTAxYWFcMzBcMFwxXHUwMWFiXDFcMzY3XDFcMzcwIisKLSAgICAiXDFcMzY3XDFcMFwxXDM2N1wxXHUwMWFiXDFcMFwxXDM2N1wxXHUwMTFhXDFcMzY3IisKLSAgICAiXDNcMFwyXDM2N1wyXDBcM1wzNjdcMVwwXDFcMzY3XDEzXDBcMVx1MDFhYiIrCi0gICAgIlwyXDM2N1wxXHUwMWFiXDJcMzY3XDFcdTAxYWJcMlwzNjdcMVwwXDRcMzY3XDFcMCIrCi0gICAgIlwxXHUwMWFiXDJcMzY3XDFcMFwxXHUwMWFiXDJcMzY3XDRcMFwyXDE3MVwxXDE3MiIrCi0gICAgIlwxXDE3MVwxXDBcMlwxNzFcMVwwXDFcMTcxXDFcMFwxXDE3MVwzXDAiKwotICAgICJcMlwxNzFcMlwwXDNcMTcxXDFcMzA0XDFcMTcxXDEzXDBcMTFcMTcxXDFcMCIrCi0gICAgIlw0XDE3MVwxXDBcM1wxNzFcMVwwXDNcMTcxXDRcMFwyXDE3M1wxXDE3NCIrCi0gICAgIlwxXDE3M1wxXDE3NVw2NlwxNzNcMVwwXDJcMTc2XDFcMTc3XDRcMTc2XDFcMTc1IisKLSAgICAiXDYzXDE3NlwxXDBcMlwyMDFcMVwyMDJcMVwyMDFcMVwyMDNcNjZcMjAxXDFcMCIrCi0gICAgIlwyXDIwNFwxXDIwNVw0XDIwNFwxXDIwM1w2M1wyMDRcMVwwXDFcdTAxYWNcMVx1MDEyMSIrCi0gICAgIlwxXHUwMTIyXDFcdTAxMjFcMVwwXDFcdTAxMjFcMVx1MDFhY1wxXDBcMVx1MDEyMVwxXHUwMTI1IisKLSAgICAiXDEzXHUwMTIxXDFcMFwxNFx1MDEyMVwxXHUwMWFjXDJcdTAxMjFcMVx1MDFhY1wyXHUwMTIxXDFcdTAxYWMiKwotICAgICJcMTBcdTAxMjFcMVx1MDFhY1wzXHUwMTIxXDFcdTAxYWNcNVx1MDEyMVwxXDBcMVx1MDFhZFwxXHUwMTIzIisKLSAgICAiXDFcdTAxNGNcMVx1MDEyM1wxXHUwMTQ5XDFcdTAxMjNcMVx1MDFhZFwzM1x1MDEyM1wxXHUwMWFkXDJcdTAxMjMiKwotICAgICJcMVx1MDFhZFwyXHUwMTIzXDFcdTAxYWRcMTBcdTAxMjNcMVx1MDFhZFwzXHUwMTIzXDFcdTAxYWRcNVx1MDEyMyIrCi0gICAgIlwxXDBcMVx1MDFhZVwxXHUwMTI0XDFcdTAxNGRcM1x1MDEyNFwxXHUwMWFlXDFcdTAxNDlcMzJcdTAxMjQiKwotICAgICJcMVx1MDFhZVwyXHUwMTI0XDFcdTAxYWVcMlx1MDEyNFwxXHUwMWFlXDEwXHUwMTI0XDFcdTAxYWVcM1x1MDEyNCIrCi0gICAgIlwxXHUwMWFlXDVcdTAxMjRcMVwwXDJcMjI2XDFcMjI3XDFcMjI2XDFcMjMwXDY2XDIyNiIrCi0gICAgIlwxXDBcMlwyMzFcMVwyMzJcNFwyMzFcMVwyMzBcNjNcMjMxXDFcMFwyXDIzNyIrCi0gICAgIlwxXDI0MFwxXDIzN1wxXDBcMlwyMzdcMVwwXDFcMjM3XDFcMFwxXDIzNyIrCi0gICAgIlwzXDBcMlwyMzdcMlwwXDNcMjM3XDFcMFwxXDIzN1wxM1wwXDExXDIzNyIrCi0gICAgIlwxXDBcNFwyMzdcMVwwXDNcMjM3XDFcMFwzXDIzN1w0XDBcMlwyNDYiKwotICAgICJcMVwyNDdcMVwyNDZcMVwyNTBcNjZcMjQ2XDFcMFwyXDI1MVwxXDI1Mlw0XDI1MSIrCi0gICAgIlwxXDI1MFw2M1wyNTFcMVwwXDJcMjU2XDFcMjU3XDFcMjU2XDFcMFwyXDI1NiIrCi0gICAgIlwxXDBcMVwyNTZcMVwwXDFcMjU2XDNcMFwyXDI1NlwyXDBcM1wyNTYiKwotICAgICJcMVwwXDFcMjU2XDEzXDBcMTFcMjU2XDFcMFw0XDI1NlwxXDBcM1wyNTYiKwotICAgICJcMVwwXDNcMjU2XDE2XDBcMVx1MDEwZFw2MVwwXDFcdTAxYWZcNVwwXDFcdTAxYWYiKwotICAgICJcMTFcMFwxXHUwMWFmXDVcMFwxXHUwMWFmXDEzXDBcMlx1MDFhZlwxXDBcMlx1MDFhZiIrCi0gICAgIlwxXDBcMlx1MDFhZlw3XDBcMlx1MDFhZlwyXDBcMlx1MDFhZlw1XDBcMVx1MDFiMCIrCi0gICAgIlwxXHUwMTM1XDFcdTAxMzZcMVx1MDEzNVwxXDBcMVx1MDEzNVwxXHUwMWIwXDFcMFwxXHUwMTM1IisKLSAgICAiXDFcdTAxM2FcMTNcdTAxMzVcMVwwXDE0XHUwMTM1XDFcdTAxYjBcMlx1MDEzNVwxXHUwMWIwXDJcdTAxMzUiKwotICAgICJcMVx1MDFiMFwxMFx1MDEzNVwxXHUwMWIwXDNcdTAxMzVcMVx1MDFiMFw1XHUwMTM1XDFcMFwxXHUwMWIxIisKLSAgICAiXDFcdTAxMzhcMVx1MDE2MFwxXHUwMTM4XDFcdTAxNWRcMVx1MDEzOFwxXHUwMWIxXDMzXHUwMTM4XDFcdTAxYjEiKwotICAgICJcMlx1MDEzOFwxXHUwMWIxXDJcdTAxMzhcMVx1MDFiMVwxMFx1MDEzOFwxXHUwMWIxXDNcdTAxMzhcMVx1MDFiMSIrCi0gICAgIlw1XHUwMTM4XDFcMFwxXHUwMWIyXDFcdTAxMzlcMVx1MDE2MVwzXHUwMTM5XDFcdTAxYjJcMVx1MDE1ZCIrCi0gICAgIlwzMlx1MDEzOVwxXHUwMWIyXDJcdTAxMzlcMVx1MDFiMlwyXHUwMTM5XDFcdTAxYjJcMTBcdTAxMzlcMVx1MDFiMiIrCi0gICAgIlwzXHUwMTM5XDFcdTAxYjJcNVx1MDEzOVw3MFwwXDFcdTAxYjNcNTRcMFwyXHUwMWI0XDIyXDAiKwotICAgICJcMVx1MDFiNVwxXDM2N1wxXDM3MFwxXDM2N1wxXDBcMVwzNjdcMVx1MDFiNVwxXDAiKwotICAgICJcMVwzNjdcMVx1MDExYVwxXDM2N1wzXDBcMlwzNjdcMlwwXDNcMzY3XDFcMCIrCi0gICAgIlwxXDM2N1wxM1wwXDFcdTAxYjVcMlwzNjdcMVx1MDFiNVwyXDM2N1wxXHUwMWI1XDJcMzY3IisKLSAgICAiXDFcMFw0XDM2N1wxXDBcMVx1MDFiNVwyXDM2N1wxXDBcMVx1MDFiNVwyXDM2NyIrCi0gICAgIlw0XDBcMVx1MDFiNlwxXHUwMTIxXDFcdTAxMjJcMVx1MDEyMVwxXDBcMVx1MDEyMVwxXHUwMWI2IisKLSAgICAiXDFcMFwxXHUwMTIxXDFcdTAxMjVcMTNcdTAxMjFcMVwwXDE0XHUwMTIxXDFcdTAxYjZcMlx1MDEyMSIrCi0gICAgIlwxXHUwMWI2XDJcdTAxMjFcMVx1MDFiNlwxMFx1MDEyMVwxXHUwMWI2XDNcdTAxMjFcMVx1MDFiNlw1XHUwMTIxIisKLSAgICAiXDFcMFwxXHUwMWI3XDFcdTAxMjNcMVx1MDE0Y1wxXHUwMTIzXDFcdTAxNDlcMVx1MDEyM1wxXHUwMWI3IisKLSAgICAiXDMzXHUwMTIzXDFcdTAxYjdcMlx1MDEyM1wxXHUwMWI3XDJcdTAxMjNcMVx1MDFiN1wxMFx1MDEyM1wxXHUwMWI3IisKLSAgICAiXDNcdTAxMjNcMVx1MDFiN1w1XHUwMTIzXDFcMFwxXHUwMWI4XDFcdTAxMjRcMVx1MDE0ZFwzXHUwMTI0IisKLSAgICAiXDFcdTAxYjhcMVx1MDE0OVwzMlx1MDEyNFwxXHUwMWI4XDJcdTAxMjRcMVx1MDFiOFwyXHUwMTI0XDFcdTAxYjgiKwotICAgICJcMTBcdTAxMjRcMVx1MDFiOFwzXHUwMTI0XDFcdTAxYjhcNVx1MDEyNFwxXDBcMVx1MDFiOVw1XDAiKwotICAgICJcMVx1MDFiOVwxMVwwXDFcdTAxYjlcNVwwXDFcdTAxYjlcMTNcMFwyXHUwMWI5XDFcMCIrCi0gICAgIlwyXHUwMWI5XDFcMFwyXHUwMWI5XDdcMFwyXHUwMWI5XDJcMFwyXHUwMWI5XDVcMCIrCi0gICAgIlwxXHUwMWJhXDFcdTAxMzVcMVx1MDEzNlwxXHUwMTM1XDFcMFwxXHUwMTM1XDFcdTAxYmFcMVwwIisKLSAgICAiXDFcdTAxMzVcMVx1MDEzYVwxM1x1MDEzNVwxXDBcMTRcdTAxMzVcMVx1MDFiYVwyXHUwMTM1XDFcdTAxYmEiKwotICAgICJcMlx1MDEzNVwxXHUwMWJhXDEwXHUwMTM1XDFcdTAxYmFcM1x1MDEzNVwxXHUwMWJhXDVcdTAxMzVcMVwwIisKLSAgICAiXDFcdTAxYmJcMVx1MDEzOFwxXHUwMTYwXDFcdTAxMzhcMVx1MDE1ZFwxXHUwMTM4XDFcdTAxYmJcMzNcdTAxMzgiKwotICAgICJcMVx1MDFiYlwyXHUwMTM4XDFcdTAxYmJcMlx1MDEzOFwxXHUwMWJiXDEwXHUwMTM4XDFcdTAxYmJcM1x1MDEzOCIrCi0gICAgIlwxXHUwMWJiXDVcdTAxMzhcMVwwXDFcdTAxYmNcMVx1MDEzOVwxXHUwMTYxXDNcdTAxMzlcMVx1MDFiYyIrCi0gICAgIlwxXHUwMTVkXDMyXHUwMTM5XDFcdTAxYmNcMlx1MDEzOVwxXHUwMWJjXDJcdTAxMzlcMVx1MDFiY1wxMFx1MDEzOSIrCi0gICAgIlwxXHUwMWJjXDNcdTAxMzlcMVx1MDFiY1w1XHUwMTM5XDUzXDBcMVx1MDFiZFwyMVwwXDJcMzY3IisKLSAgICAiXDFcMzcwXDFcMzY3XDFcMFwyXDM2N1wxXDBcMVwzNjdcMVx1MDExYVwxXDM2NyIrCi0gICAgIlwzXDBcMlwzNjdcMlwwXDNcMzY3XDFcMFwxXDM2N1wxM1wwXDExXDM2NyIrCi0gICAgIlwxXDBcNFwzNjdcMVwwXDNcMzY3XDFcMFwzXDM2N1w0XDBcMVx1MDFiZSIrCi0gICAgIlwxXHUwMTIxXDFcdTAxMjJcMVx1MDEyMVwxXDBcMVx1MDEyMVwxXHUwMWJlXDFcMFwxXHUwMTIxIisKLSAgICAiXDFcdTAxMjVcMTNcdTAxMjFcMVwwXDE0XHUwMTIxXDFcdTAxYmVcMlx1MDEyMVwxXHUwMWJlXDJcdTAxMjEiKwotICAgICJcMVx1MDFiZVwxMFx1MDEyMVwxXHUwMWJlXDNcdTAxMjFcMVx1MDFiZVw1XHUwMTIxXDFcMFwxXHUwMWJmIisKLSAgICAiXDFcdTAxMjNcMVx1MDE0Y1wxXHUwMTIzXDFcdTAxNDlcMVx1MDEyM1wxXHUwMWJmXDMzXHUwMTIzXDFcdTAxYmYiKwotICAgICJcMlx1MDEyM1wxXHUwMWJmXDJcdTAxMjNcMVx1MDFiZlwxMFx1MDEyM1wxXHUwMWJmXDNcdTAxMjNcMVx1MDFiZiIrCi0gICAgIlw1XHUwMTIzXDFcMFwxXHUwMWMwXDFcdTAxMjRcMVx1MDE0ZFwzXHUwMTI0XDFcdTAxYzBcMVx1MDE0OSIrCi0gICAgIlwzMlx1MDEyNFwxXHUwMWMwXDJcdTAxMjRcMVx1MDFjMFwyXHUwMTI0XDFcdTAxYzBcMTBcdTAxMjRcMVx1MDFjMCIrCi0gICAgIlwzXHUwMTI0XDFcdTAxYzBcNVx1MDEyNFwxXDBcMVx1MDFjMVwxXHUwMTM1XDFcdTAxMzZcMVx1MDEzNSIrCi0gICAgIlwxXDBcMVx1MDEzNVwxXHUwMWMxXDFcMFwxXHUwMTM1XDFcdTAxM2FcMTNcdTAxMzVcMVwwIisKLSAgICAiXDE0XHUwMTM1XDFcdTAxYzFcMlx1MDEzNVwxXHUwMWMxXDJcdTAxMzVcMVx1MDFjMVwxMFx1MDEzNVwxXHUwMWMxIisKLSAgICAiXDNcdTAxMzVcMVx1MDFjMVw1XHUwMTM1XDFcMFwxXHUwMWMyXDFcdTAxMzhcMVx1MDE2MFwxXHUwMTM4IisKLSAgICAiXDFcdTAxNWRcMVx1MDEzOFwxXHUwMWMyXDMzXHUwMTM4XDFcdTAxYzJcMlx1MDEzOFwxXHUwMWMyXDJcdTAxMzgiKwotICAgICJcMVx1MDFjMlwxMFx1MDEzOFwxXHUwMWMyXDNcdTAxMzhcMVx1MDFjMlw1XHUwMTM4XDFcMFwxXHUwMWMzIisKLSAgICAiXDFcdTAxMzlcMVx1MDE2MVwzXHUwMTM5XDFcdTAxYzNcMVx1MDE1ZFwzMlx1MDEzOVwxXHUwMWMzXDJcdTAxMzkiKwotICAgICJcMVx1MDFjM1wyXHUwMTM5XDFcdTAxYzNcMTBcdTAxMzlcMVx1MDFjM1wzXHUwMTM5XDFcdTAxYzNcNVx1MDEzOSIrCi0gICAgIlwxXDBcMlx1MDEyMVwxXHUwMTIyXDFcdTAxMjFcMVwwXDJcdTAxMjFcMVwwXDFcdTAxMjEiKwotICAgICJcMVx1MDEyNVwxM1x1MDEyMVwxXDBcNDVcdTAxMjFcMVwwXDFcdTAxYzRcMVx1MDEyM1wxXHUwMTRjIisKLSAgICAiXDFcdTAxMjNcMVx1MDE0OVwxXHUwMTIzXDFcdTAxYzRcMzNcdTAxMjNcMVx1MDFjNFwyXHUwMTIzXDFcdTAxYzQiKwotICAgICJcMlx1MDEyM1wxXHUwMWM0XDEwXHUwMTIzXDFcdTAxYzRcM1x1MDEyM1wxXHUwMWM0XDVcdTAxMjNcMVwwIisKLSAgICAiXDFcdTAxYzVcMVx1MDEyNFwxXHUwMTRkXDNcdTAxMjRcMVx1MDFjNVwxXHUwMTQ5XDMyXHUwMTI0XDFcdTAxYzUiKwotICAgICJcMlx1MDEyNFwxXHUwMWM1XDJcdTAxMjRcMVx1MDFjNVwxMFx1MDEyNFwxXHUwMWM1XDNcdTAxMjRcMVx1MDFjNSIrCi0gICAgIlw1XHUwMTI0XDFcMFwyXHUwMTM1XDFcdTAxMzZcMVx1MDEzNVwxXDBcMlx1MDEzNVwxXDAiKwotICAgICJcMVx1MDEzNVwxXHUwMTNhXDEzXHUwMTM1XDFcMFw0NVx1MDEzNVwxXDBcMVx1MDFjNlwxXHUwMTM4IisKLSAgICAiXDFcdTAxNjBcMVx1MDEzOFwxXHUwMTVkXDFcdTAxMzhcMVx1MDFjNlwzM1x1MDEzOFwxXHUwMWM2XDJcdTAxMzgiKwotICAgICJcMVx1MDFjNlwyXHUwMTM4XDFcdTAxYzZcMTBcdTAxMzhcMVx1MDFjNlwzXHUwMTM4XDFcdTAxYzZcNVx1MDEzOCIrCi0gICAgIlwxXDBcMVx1MDFjN1wxXHUwMTM5XDFcdTAxNjFcM1x1MDEzOVwxXHUwMWM3XDFcdTAxNWRcMzJcdTAxMzkiKwotICAgICJcMVx1MDFjN1wyXHUwMTM5XDFcdTAxYzdcMlx1MDEzOVwxXHUwMWM3XDEwXHUwMTM5XDFcdTAxYzdcM1x1MDEzOSIrCi0gICAgIlwxXHUwMWM3XDVcdTAxMzlcMVwwXDJcdTAxMjNcMVx1MDE0Y1wxXHUwMTIzXDFcdTAxNDlcNjZcdTAxMjMiKwotICAgICJcMVwwXDJcdTAxMjRcMVx1MDE0ZFw0XHUwMTI0XDFcdTAxNDlcNjNcdTAxMjRcMVwwXDJcdTAxMzgiKwotICAgICJcMVx1MDE2MFwxXHUwMTM4XDFcdTAxNWRcNjZcdTAxMzhcMVwwXDJcdTAxMzlcMVx1MDE2MVw0XHUwMTM5IisKLSAgICAiXDFcdTAxNWRcNjNcdTAxMzkiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja1RyYW5zKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzIyMjYwXTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja1RyYW5zKFpaX1RSQU5TX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja1RyYW5zKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9OT19NQVRDSCA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9QVVNIQkFDS18yQklHID0gMjsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqCi0gICAqIFpaX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BVFRSSUJVVEUgPSB6elVucGFja0F0dHJpYnV0ZSgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BVFRSSUJVVEVfUEFDS0VEXzAgPQotICAgICJcMzBcMFwxXDExXDEwXDFcMVwxMVwyXDFcMVwxMVwxXDFcMVwxMSIrCi0gICAgIlw0XDFcMVwxMVw2XDFcMVwxMVwzXDFcMlwxMVwzXDFcMVwxMSIrCi0gICAgIlwxXDFcMVwzXDJcMTFcM1wxXDFcMTFcMVwxXDFcMTFcMTBcMSIrCi0gICAgIlwyXDExXDVcMVwxXDExXDdcMVwxXDExXDFcM1wzXDFcM1wxMSIrCi0gICAgIlwxXDFcMVwwXDNcMVwxXDBcMVwxXDJcMFwxXDFcMlwwIisKLSAgICAiXDFcMTFcNlwwXDFcMVwzXDBcMVwxMVw1XDBcMVwxMVw0XDAiKwotICAgICJcMlwxXDFcMFwyXDFcMVwwXDJcMVwxXDE1XDFcMFwyXDEiKwotICAgICJcMVwwXDFcMVwyXDBcMVwxMVwyXDBcMVwxXDFcMFwzXDEiKwotICAgICJcMlwwXDFcMTFcMVwwXDFcMTFcMVwxXDJcMFwxXDExXDJcMCIrCi0gICAgIlw0XDFcMlwwXDFcMVwyXDBcMVwxNVwxXDFcMVwwXDFcMTEiKwotICAgICJcMVwwXDFcMVwxXDExXDJcMVwxMFwwXDFcMVwxXDBcMVwxIisKLSAgICAiXDJcMFwxXDFcMlwwXDFcMVwyXDBcMVwxXDJcMFw1XDEiKwotICAgICJcMVwwXDFcMVwyXDBcMVwxXDFcMFwzXDFcMVwwXDFcMSIrCi0gICAgIlwyXDBcMVwxXDFcMFwzXDFcM1wwXDNcMVwxXDExXDVcMCIrCi0gICAgIlwxXDExXDJcMFwxXDFcNVwwXDVcMVwyXDBcM1wxXDJcMCIrCi0gICAgIlwyXDFcMVwwXDFcMVwxXDBcMVwxMVwzXDFcM1wwXDFcMTEiKwotICAgICJcMlwwXDFcMTFcMVwwXDFcMVwxMFwwXDFcMTFcNVwxXDJcMCIrCi0gICAgIlwzXDFcMlwwXDNcMVw1XDBcMVwxMVwxXDBcM1wxXDJcMCIrCi0gICAgIlwxXDExXDJcMFwxXDFcNlwwXDFcMVwyXDBcNVwxXDJcMCIrCi0gICAgIlwzXDFcMlwwXDNcMVwyXDBcMVwxXDNcMFwzXDFcMVwwIisKLSAgICAiXDFcMTFcMlwwXDFcMVwxM1wwXDVcMVwyXDBcM1wxXDJcMCIrCi0gICAgIlwzXDFcMTBcMFwyXDFcMVwxMVwyXDBcMVwxXDZcMFwxXDEiKwotICAgICJcMVwwXDFcMVwyXDBcMVwxXDJcMFwzXDFcMlwwXDFcMSIrCi0gICAgIlwxXDBcMVwxXDZcMFwxXDFcNFwwXDFcMTFcNFwwXDFcMTEiKwotICAgICJcM1wwXDFcMTFcMTJcMCI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQXR0cmlidXRlKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzQ1NV07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBdHRyaWJ1dGUoWlpfQVRUUklCVVRFX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0F0dHJpYnV0ZShTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB6elJlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB6elN0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHp6QnVmZmVyW10gPSBuZXcgY2hhcltaWl9CVUZGRVJTSVpFXTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpNYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHp6UHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6ekN1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6elN0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHp6RW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIC8vcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy9wcml2YXRlIGludCB5eWNvbHVtbjsKLQotICAvKiogCi0gICAqIHp6QXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvL3ByaXZhdGUgYm9vbGVhbiB6ekF0Qk9MID0gdHJ1ZTsKLQotICAvKiogenpBdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0RU9GOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5ERUZJTkVEID0gInVuZGVmaW5lZCI7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQ7Ci0vLwlwcml2YXRlIGludCBmQnVmZmVyZWRUZXh0TGVuZ3RoOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aDsKLS8vCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZCdWZmZXJlZFRleHQgPSBudWxsOwotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCXByaXZhdGUgaW50IGZJbml0aWFsU3RhdGUgPSBZWUlOSVRJQUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfTk9STUFMID0gMTYzODQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7Ci0JcHJpdmF0ZSBpbnQgZkluaXRpYWxCdWZmZXJTaXplID0gQlVGRkVSX1NJWkVfTk9STUFMOwotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgewotCQlmSW5pdGlhbFN0YXRlID0gc3RhdGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxCdWZmZXJTaXplKGludCBzaXplKSB7Ci0JCWZJbml0aWFsQnVmZmVyU2l6ZSA9IHNpemU7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLSAgCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dDsKLQkJU3RyaW5nIG5leHRUb2tlblR5cGU7Ci0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOwotLy8JCVN0cmluZ0J1ZmZlciB0ZXh0OwotCQlpbnQgc3RhcnQ7Ci0JCWludCB0ZXh0TGVuZ3RoOwotCQlpbnQgbGVuZ3RoOwotCQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCAhPSBudWxsKSB7Ci0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsKLS8vCQkJdGV4dCA9IGZCdWZmZXJlZFRleHQ7Ci0JCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0OwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsKLQotCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotLy8JCQl0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQlzdGFydCA9IHl5Y2hhcjsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQl9Ci0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRleHQgPT0gQ1NTX0pTUF9TQ1JJUFRMRVQgfHwgY29udGV4dCA9PSBDU1NfSlNQX0VMKXsKLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlICE9IENTU19KU1BfRU5EICYmIG5leHRUb2tlblR5cGUgIT0gQ1NTX0VMX0VORCAmJiBuZXh0VG9rZW5UeXBlICE9IENTU19KU1BfQ09NTUVOVCkgewotLy8JCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQlpZiAoY29udGV4dC5lcXVhbHMoQ1NTX0pTUF9TQ1JJUFRMRVQpICYmICh5eXN0YXRlKCkgPT0gU1RfSlNQX0RJUkVDVElWRSB8fCB5eXN0YXRlKCkgPT0gU1RfSlNQX0VYUCB8fCB5eXN0YXRlKCkgPT0gU1RfSlNQX0RFQ0xBUkFUSU9OKSl7Ci0JCQkJCQljb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLQkJCQkJfQotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQlpZiAobmV4dFRva2VuVHlwZSA9PSBudWxsKXsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIFsyMzYwMDhdIC0gU2hvdWxkIG5vdCB0cnkgYW5kIGNvbnNpZGVyIHRoZSB0b2tlbiBhCi0JCQkJLy8gY29tbWVudCB1bmxlc3MgIGEgY29tbWVudCB3YXMgc3RhcnRlZAotCQkJCWlmIChjb250ZXh0ID09IENTU19KU1BfU0NSSVBUTEVUICYmIG5leHRUb2tlblR5cGUgPT0gQ1NTX0pTUF9DT01NRU5UKXsKLQkJCQkJd2hpbGUgKG5leHRUb2tlblR5cGUgIT0gQ1NTX0pTUF9DT01NRU5UX0VORCkgewotLy8JCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7Ci0JCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7Ci0JCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQkJaWYgKGNvbnRleHQuZXF1YWxzKENTU19KU1BfU0NSSVBUTEVUKSAmJiB5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpewotCQkJCQkJCWNvbnRleHQgPSBuZXh0VG9rZW5UeXBlOwotCQkJCQkJfQotCi0JCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQkJaWYgKG5leHRUb2tlblR5cGUgPT0gbnVsbCl7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCi0JCQkJCWlmIChjb250ZXh0ID09IENTU19KU1BfQ09NTUVOVCl7Ci0JCQkJCQljb250ZXh0ID0gQ1NTX0NPTU1FTlQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCWxlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCQkJCi0JCQl9Ci0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsKLQkJCQkvLyB1bmRlZiAtPiBjb25jYXRlbmF0ZSB1bmRlZidzCi0JCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSA9PSBVTkRFRklORUQpIHsKLS8vCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7Ci0JCQkJCXRleHRMZW5ndGggKz0geXlsZW5ndGgoKTsKLQkJCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQl9Ci0JCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG5leHRUb2tlblR5cGU7Ci0vLwkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV4dFRva2VuVHlwZSA9IG51bGw7Ci0JCQkJc3BhY2VGb2xsb3dzID0gZmFsc2U7Ci0JCQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblZhbHVlVHlwZShjb250ZXh0KSkgeyAvLyBkZWNsYXJhdGlvbiB2YWx1ZSBjYW4gY29udGFpbiBWQUxVRV9TCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19ERUNMQVJBVElPTl9WQUxVRV9TKTsKLQkJCQl9IGVsc2UgaWYgKGNhbkNvbnRhaW5TcGFjZShjb250ZXh0KSkgewotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQlzcGFjZUZvbGxvd3MgPSAobmV4dFRva2VuVHlwZSA9PSBDU1NfUyk7Ci0JCQkJfQotCQkJCWlmIChuZXh0VG9rZW5UeXBlICE9IG51bGwpIHsgLy8gbmV4dFRva2VuIGlzIHJldHJpZXZlZAotCQkJCQlpZiAoc3BhY2VGb2xsb3dzKSB7Ci0JCQkJCQkvLyBuZXh0IGlzIHNwYWNlIC0+IGFwcGVuZAotLy8JCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7Ci0JCQkJCQlsZW5ndGggKz0geXlsZW5ndGgoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG5leHQgaXMgTk9UIHNwYWNlIC0+IHB1c2ggdGhpcyBmb3IgbmV4dCB0aW1lLCByZXR1cm4gaXRzZWxmCi0JCQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLS8vCQkJCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOwotCQkJCQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JCQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7Ci0JCQkJY29udGV4dCA9IENTU19VTktOT1dOOwotCQkJfQotCQkJcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0gIAl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCS8qIGZvciBzdGFuZGFsb25lIHVzZSAqLwotICAJcHVibGljIGZpbmFsIExpc3QgcGFyc2VUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAJCUNTU1RleHRUb2tlbiB0b2tlbjsKLQkJZm9yIChTdHJpbmcga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKTsga2luZCAhPSBudWxsOyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpKSB7Ci0JCQl0b2tlbiA9IG5ldyBDU1NUZXh0VG9rZW4oKTsKLQkJCXRva2VuLmtpbmQgPSBraW5kOyAgCQkJCQotCQkJdG9rZW4uc3RhcnQgPSB5eWNoYXI7Ci0JCQl0b2tlbi5sZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJdG9rZW4uaW1hZ2UgPSB5eXRleHQoKTsKLQkJCXRva2Vucy5hZGQodG9rZW4pOwotCQl9Ci0KLSAgCQlyZXR1cm4gdG9rZW5zOwotICAJfQotICAJCi0gIAkvKiB1c2VyIG1ldGhvZCAqLwotICAJcHJpdmF0ZSBib29sZWFuIGNhbkNvbnRhaW5TcGFjZShTdHJpbmcgdHlwZSkgewotICAJCWlmICh0eXBlID09IENTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotICAJCQlyZXR1cm4gZmFsc2U7Ci0gIAkJfSBlbHNlIHsKLSAgCQkJcmV0dXJuIHRydWU7Ci0gIAkJfQotICAJfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHl5Y2hhcjsKLQl9Ci0JCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsKLQkJcmV0dXJuIHp6QXRFT0Y7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCQkvKiogdGhlIGlucHV0IGRldmljZSAqLwotCQl6elJlYWRlciA9IGluOwotCi0JCS8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JCXp6U3RhdGUgPSAwOwotCi0JCS8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JCXp6TGV4aWNhbFN0YXRlID0gZkluaXRpYWxTdGF0ZTsgLy9ZWUlOSVRJQUw7Ci0KLQkJLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQkJCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCQlpZiAoenpCdWZmZXIubGVuZ3RoICE9IGZJbml0aWFsQnVmZmVyU2l6ZSkgewotCQkJenpCdWZmZXIgPSBuZXcgY2hhcltmSW5pdGlhbEJ1ZmZlclNpemVdOwotCQl9Ci0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7Ci0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JCXp6TWFya2VkUG9zID0gMDsKLQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQkJenpQdXNoYmFja1BvcyA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCQl6ekN1cnJlbnRQb3MgPSAwOwotCi0JCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQkJenpTdGFydFJlYWQgPSAwOwotCi0JCS8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkJCWZyb20gaW5wdXQgKi8KLQkJenpFbmRSZWFkID0gMDsKLQotCQkvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCS8veXlsaW5lID0gMDsKLQotCQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5Y2hhciA9IDA7Ci0KLQkJLyoqCi0JCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLQkJICogbWF0Y2hlZCB0ZXh0Ci0JCSAqLwotCQkvL3l5Y29sdW1uID0gMDsgCi0KLQkJLyoqIAotCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLQkJICovCi0JCS8venpBdEJPTCA9IGZhbHNlOwotCQkKLQkJLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJenpBdEVPRiA9IGZhbHNlOwotCi0JCS8qIHVzZXIgdmFyaWFibGVzICovCi0JCS8vCQlmVW5kZWZpbmVkLmRlbGV0ZSgwLCBmVW5kZWZpbmVkLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBKU1BlZENTU1Rva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZkpTUFByZXZpb3VzU3RhdGUgPSBmSW5pdGlhbFN0YXRlOwotCXByaXZhdGUgdm9pZCB5eUpzcEJlZ2luKGludCBuZXdzdGF0ZSl7Ci0JCWZKU1BQcmV2aW91c1N0YXRlID0geXlzdGF0ZSgpOwotCQl5eWJlZ2luKG5ld3N0YXRlKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHl5SnNwRW5kKCl7Ci0JCXl5YmVnaW4oZkpTUFByZXZpb3VzU3RhdGUpOwotCX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BlZENTU1Rva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMuenpSZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUGVkQ1NTVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE3MCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6UmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoenpTdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6RW5kUmVhZC16elN0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB6ekVuZFJlYWQtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6Q3VycmVudFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpNYXJrZWRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6UHVzaGJhY2tQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6U3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHp6Q3VycmVudFBvcyA+PSB6ekJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3p6Q3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgenpCdWZmZXIubGVuZ3RoKTsKLSAgICAgIHp6QnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0genpSZWFkZXIucmVhZCh6ekJ1ZmZlciwgenpFbmRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlci5sZW5ndGgtenpFbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkIDwgMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgenpFbmRSZWFkKz0gbnVtUmVhZDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHp6QXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotCi0gICAgaWYgKHp6UmVhZGVyICE9IG51bGwpCi0gICAgICB6elJlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqIERvZXMgbm90IGNsb3NlIHRoZSBvbGQgcmVhZGVyLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PlpaX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHsKLSAgICB6elJlYWRlciA9IHJlYWRlcjsKLSAgICAvL3p6QXRCT0wgID0gdHJ1ZTsKLSAgICB6ekF0RU9GICA9IGZhbHNlOwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkID0gMDsKLSAgICB6ekN1cnJlbnRQb3MgPSB6ek1hcmtlZFBvcyA9IHp6UHVzaGJhY2tQb3MgPSAwOwotICAgIHl5Y2hhciA9IDA7Ly95eWxpbmUgPSB5eWNoYXIgPSAwO3l5Y29sdW1uID0gMDsKLSAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4genpMZXhpY2FsU3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHp6TGV4aWNhbFN0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgcHVibGljIGZpbmFsIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwgenpNYXJrZWRQb3MtenpTdGFydFJlYWQgKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dC4gCi0gICAqIAotICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHl5dGV4dCgpLmNoYXJBdChwb3MpLCBidXQgZmFzdGVyCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gZmV0Y2guIAotICAgKiAgICAgICAgICAgIEEgdmFsdWUgZnJvbSAwIHRvIHl5bGVuZ3RoKCktMS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIHBvcwotICAgKi8KLSAgcHVibGljIGZpbmFsIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotICAgIHJldHVybiB6ekJ1ZmZlclt6elN0YXJ0UmVhZCtwb3NdOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4genpNYXJrZWRQb3MtenpTdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6U2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbWlpfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHB1YmxpYyB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgenpTY2FuRXJyb3IoWlpfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB6ek1hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgenpJbnB1dDsKLSAgICBpbnQgenpBY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB6ekN1cnJlbnRQb3NMOwotICAgIGludCB6ek1hcmtlZFBvc0w7Ci0gICAgaW50IHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgY2hhciBbXSB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICBjaGFyIFtdIHp6Q01hcEwgPSBaWl9DTUFQOwotCi0gICAgaW50IFtdIHp6VHJhbnNMID0gWlpfVFJBTlM7Ci0gICAgaW50IFtdIHp6Um93TWFwTCA9IFpaX1JPV01BUDsKLSAgICBpbnQgW10genpBdHRyTCA9IFpaX0FUVFJJQlVURTsKLSAgICBpbnQgenpQdXNoYmFja1Bvc0wgPSB6elB1c2hiYWNrUG9zID0gLTE7Ci0gICAgYm9vbGVhbiB6eldhc1B1c2hiYWNrOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotCi0gICAgICB5eWNoYXIrPSB6ek1hcmtlZFBvc0wtenpTdGFydFJlYWQ7Ci0KLSAgICAgIHp6QWN0aW9uID0gLTE7Ci0KLSAgICAgIHp6Q3VycmVudFBvc0wgPSB6ekN1cnJlbnRQb3MgPSB6elN0YXJ0UmVhZCA9IHp6TWFya2VkUG9zTDsKLSAgCi0gICAgICB6elN0YXRlID0genpMZXhpY2FsU3RhdGU7Ci0KLSAgICAgIHp6V2FzUHVzaGJhY2sgPSBmYWxzZTsKLQotICAgICAgenpGb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICBpZiAoenpDdXJyZW50UG9zTCA8IHp6RW5kUmVhZEwpCi0gICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgZWxzZSBpZiAoenpBdEVPRikgewotICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb25zCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3MgID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zICAgPSB6ek1hcmtlZFBvc0w7Ci0gICAgICAgICAgICB6elB1c2hiYWNrUG9zID0genpQdXNoYmFja1Bvc0w7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdHJhbnNsYXRlZCBwb3NpdGlvbnMgYW5kIHBvc3NpYmx5IG5ldyBidWZmZXIKLSAgICAgICAgICAgIHp6Q3VycmVudFBvc0wgID0genpDdXJyZW50UG9zOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMICAgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6QnVmZmVyTCAgICAgID0genpCdWZmZXI7Ci0gICAgICAgICAgICB6ekVuZFJlYWRMICAgICA9IHp6RW5kUmVhZDsKLSAgICAgICAgICAgIHp6UHVzaGJhY2tQb3NMID0genpQdXNoYmFja1BvczsKLSAgICAgICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGludCB6ek5leHQgPSB6elRyYW5zTFsgenpSb3dNYXBMW3p6U3RhdGVdICsgenpDTWFwTFt6eklucHV0XSBdOwotICAgICAgICAgIGlmICh6ek5leHQgPT0gLTEpIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIHp6U3RhdGUgPSB6ek5leHQ7Ci0KLSAgICAgICAgICBpbnQgenpBdHRyaWJ1dGVzID0genpBdHRyTFt6elN0YXRlXTsKLSAgICAgICAgICBpZiAoICh6ekF0dHJpYnV0ZXMgJiAyKSA9PSAyICkKLSAgICAgICAgICAgIHp6UHVzaGJhY2tQb3NMID0genpDdXJyZW50UG9zTDsKLQotICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDEpID09IDEgKSB7Ci0gICAgICAgICAgICB6eldhc1B1c2hiYWNrID0gKHp6QXR0cmlidXRlcyAmIDQpID09IDQ7Ci0gICAgICAgICAgICB6ekFjdGlvbiA9IHp6U3RhdGU7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgOCkgPT0gOCApIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB6ek1hcmtlZFBvcyA9IHp6TWFya2VkUG9zTDsKLSAgICAgIGlmICh6eldhc1B1c2hiYWNrKQotICAgICAgICB6ek1hcmtlZFBvcyA9IHp6UHVzaGJhY2tQb3NMOwotCi0gICAgICBzd2l0Y2ggKHp6QWN0aW9uIDwgMCA/IHp6QWN0aW9uIDogWlpfQUNUSU9OW3p6QWN0aW9uXSkgewotICAgICAgICBjYXNlIDM4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfU1RSSU5HOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDQ6IAotICAgICAgICAgIHsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT047Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDYzOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogCi0gICAgICAgICAgeyByZXR1cm4gVU5ERUZJTkVEOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0lNUE9SVF9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX01FRElVTTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjY6IGJyZWFrOwotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjc6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NMQVNTOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0xCUkFDRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjk6IGJyZWFrOwotICAgICAgICBjYXNlIDQ6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX1JCUkFDRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzA6IGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfTUVESUFfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDcxOiBicmVhazsKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzM6IGJyZWFrOwotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfRk9OVF9GQUNFX0RFTElNSVRFUik7IHJldHVybiBDU1NfRk9OVF9GQUNFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTc6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9DSEFSU0VUX05BTUUpOyByZXR1cm4gQ1NTX0NIQVJTRVQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDc1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgeyB5eUpzcEVuZCgpOyByZXR1cm4gQ1NTX0VMX0VORDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzY6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgICB7IHl5SnNwRW5kKCk7ICByZXR1cm4gQ1NTX0pTUF9FTkQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDc3OiBicmVhazsKLSAgICAgICAgY2FzZSA1MzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzg6IGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDc5OiBicmVhazsKLSAgICAgICAgY2FzZSA0NzogCi0gICAgICAgICAgeyByZXR1cm4gQ1NTX0NEQzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODA6IGJyZWFrOwotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODE6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfVU5JVkVSU0FMOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDgzOiBicmVhazsKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgICAgeyByZXR1cm4gQ1NTX0NETzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODQ6IGJyZWFrOwotICAgICAgICBjYXNlIDc6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODU6IGJyZWFrOwotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODY6IGJyZWFrOwotICAgICAgICBjYXNlIDQzOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0g7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDg3OiBicmVhazsKLSAgICAgICAgY2FzZSA1MjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1BBR0VfUFNFVURPX1BBR0UpOyByZXR1cm4gQ1NTX1BBR0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDg4OiBicmVhazsKLSAgICAgICAgY2FzZSAyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODk6IGJyZWFrOwotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfQ0hBUlNFVF9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1NUUklORzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTA6IGJyZWFrOwotICAgICAgICBjYXNlIDM1OiAKLSAgICAgICAgICB7IHl5SnNwQmVnaW4oU1RfSlNQX0VMKTsgIHJldHVybiBDU1NfSlNQX0VMOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTM6IGJyZWFrOwotICAgICAgICBjYXNlIDQ4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk0OiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTY6IGJyZWFrOwotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9QQUdFX0RFTElNSVRFUik7IHJldHVybiBDU1NfUEFHRV9TRUxFQ1RPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTg6IGJyZWFrOwotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICAgIHsgcmV0dXJuIENTU19DT01NRU5UOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDA6IGJyZWFrOwotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTAxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTAyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9TRVBBUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogCi0gICAgICAgICAgeyByZXR1cm4gQ1NTX1M7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTE6IAotICAgICAgICAgIHsgeXlKc3BFbmQoKTsgcmV0dXJuIENTU19KU1BfQ09NTUVOVF9FTkQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfSUQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9KU1BfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0pTUF9ERUNMOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDc6IGJyZWFrOwotICAgICAgICBjYXNlIDU2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX1VSSSk7IHJldHVybiBDU1NfSU1QT1JUOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDg6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDk6IGJyZWFrOwotICAgICAgICBjYXNlIDU1OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTEwOiBicmVhazsKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0pTUF9FWFApOyByZXR1cm4gQ1NTX0pTUF9FWFA7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMTI6IGJyZWFrOwotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1BTRVVETzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTEzOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fUFJPUEVSVFk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7IHJldHVybiBDU1NfSlNQX0NPTU1FTlQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICAgIHsgeXlKc3BCZWdpbihTVF9KU1BfU0NSSVBUTEVUKTsgIHJldHVybiBDU1NfSlNQX1NDUklQVExFVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTE2OiBicmVhazsKLSAgICAgICAgY2FzZSA1NDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9VUkk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFKTsgcmV0dXJuIENTU19KU1BfRElSRUNUSVZFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMTg6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoenpJbnB1dCA9PSBZWUVPRiAmJiB6elN0YXJ0UmVhZCA9PSB6ekN1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHp6QXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHp6U2NhbkVycm9yKFpaX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9KU1BlZENTU1JlZ2lvbkNvbnRleHRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0pTUGVkQ1NTUmVnaW9uQ29udGV4dHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUxYjE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0pTUGVkQ1NTUmVnaW9uQ29udGV4dHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQZWRDU1NSZWdpb25Db250ZXh0cyBleHRlbmRzIENTU1JlZ2lvbkNvbnRleHRzIHsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0pTUF9FWFAgPSAiQ1NTX0pTUF9FWFAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0pTUF9FTCA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT1JFSUdOX0VMRU1FTlQ7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX1NDUklQVExFVCA9ICJDU1NfSlNQX1NDUklQVExFVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX0RJUkVDVElWRSA9ICJDU1NfSlNQX0RJUkVDVElWRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX0RFQ0wgPSAiQ1NTX0pTUF9ERUNMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19KU1BfRU5EID0gIkNTU19KU1BfRU5EIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19FTF9FTkQgPSAiQ1NTX0VMX0VORCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX0NPTU1FTlRfRU5EID0gIkNTU19KU1BfQ09NTUVOVF9FTkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0pTUF9DT01NRU5UID0gIkNTU19KU1BfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzk3NGU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNWMwOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUdWUgRmViIDA5IDE3OjUzOjAyIEVTVCAyMDEwCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZWxldHRhZ2xpYnJhcnlfMl8wLnhzZD1VVEY4CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YWM5YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1NhdCBBcHIgMjggMDk6Mjg6MzEgRURUIDIwMDcKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQotY29tcGlsZXJzLnAuYnVpbGQ9MQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0xCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YWIxMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNmIzMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiAvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08cD5KYW51YXJ5LCAyMDEwPC9wPgotPGgzPkxpY2Vuc2U8L2gzPgotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcwotcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUKLUNvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZQotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUgRVBMIGlzCi1hdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UKLUZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eQotKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5Ci10byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MKLWxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywKLWNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMKLWFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEKLQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L2E+LjwvcD4KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZAotcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseQotZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIGZvciBpbmZvcm1hdGlvbmFsCi1wdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSBmb3IKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci08aDQ+QXBwc2VydiBDb21tb25zIHNjaGVtYXMgYW5kIERURHMgdjJfYjMzIChTdWJzZXQpPC9oND4KLTxwPllvdXIgdXNlIG9mIHRoZSBBcHBzZXJ2IENvbW1vbnMgc2NoZW1hcyBhbmQgRFREcyBpcyBzdWJqZWN0IHRvCi10aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uCi1MaWNlbnNlIHYxLjAuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBjb250YWluZWQgaW4gdGhlIGZpbGUgPGEKLQlocmVmPSJhYm91dF9maWxlcy9DRERMdjEuMC50eHQiPkxJQ0VOU0UudHh0PC9hPiBhbmQgaXMgYWxzbyBhdmFpbGFibGUKLWF0IDxhIGhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCI+aHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sPC9hPi4KLTwvcD4KLTxwPlRoZSBzb3VyY2UgZm9yIHRoZSBzY2hlbWFzIGFuZCBEVERzIGlzIGF2YWlsYWJsZSBvbiB0aGUgR2xhc3NmaXNoCi1jb21tdW5pdHkgd2Vic2l0ZSBhdCA8YQotCWhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvZG93bmxvYWRzaW5kZXguaHRtbCI+aHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0LzwvYT4uCi08L3A+Ci0KLTxoND5KYXZhIFNlcnZlciBGYWNlcyAxLjIgU2NoZW1hIGFuZCBEVERzIChTdWJzZXQpPC9oND4KLTxwPllvdXIgdXNlIG9mIHRoZSBKYXZhIFNlcnZlciBGYWNlcyBzY2hlbWFzIGFuZCBEVERzIGlzIHN1YmplY3QgdG8KLXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24KLUxpY2Vuc2UgdjEuMC4gQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSA8YQotCWhyZWY9ImFib3V0X2ZpbGVzL0NEREx2MS4wLnR4dCI+TElDRU5TRS50eHQ8L2E+IGFuZCBpcyBhbHNvIGF2YWlsYWJsZQotYXQgPGEgaHJlZj0iaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sIj5odHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWw8L2E+LgotPC9wPgotPHA+VGhlIHNvdXJjZSBmb3IgdGhlIHNjaGVtYXMgYW5kIERURHMgaXMgYXZhaWxhYmxlIG9uIHRoZSBKYXZhCi1TZXJ2ZXIgRmFjZXMgcHJvamVjdCBwYWdlIG9uIHRoZSBHbGFzc2Zpc2ggY29tbXVuaXR5IHdlYnNpdGUgYXQgPGEKLQlocmVmPSJodHRwczovL2phdmFzZXJ2ZXJmYWNlcy5kZXYuamF2YS5uZXQiPmh0dHBzOi8vamF2YXNlcnZlcmZhY2VzLmRldi5qYXZhLm5ldC88L2E+LgotPC9wPgotCi08aDQ+SmF2YSBQZXJzaXN0ZW5jZSBBUEkgWE1MIFNjaGVtYXM8L2g0PgotPHA+WW91ciB1c2Ugb2YgdGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIFhNTCBTY2hlbWFzIChvcm1fMV8wLnhzZCwKLXBlcnNpc3RlbmNlXzFfMC54c2QpIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wLiBBIGNvcHkgb2YgdGhlIGxpY2Vuc2UKLWlzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSA8YSBocmVmPSJhYm91dF9maWxlcy9DRERMdjEuMC50eHQiPkxJQ0VOU0UudHh0PC9hPgotYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCi0JaHJlZj0iaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sIj5odHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWw8L2E+LgotPC9wPgotPHA+VGhlIG9yaWdpbmFsIHNvdXJjZSBmb3IgdGhlIHNjaGVtYXMgaXMgYXZhaWxhYmxlIG9uIDxhCi0JaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UvIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS88L2E+LgotPC9wPgotCi08aDQ+SmF2YSBFRSA2IFhNTCBTY2hlbWFzPC9oND4KLTxwPllvdXIgdXNlIG9mIHRoZSBKYXZhIEVFIDYgWE1MIFNjaGVtYXMgKGFwcGxpY2F0aW9uXzYueHNkLAotYXBwbGljYXRpb24tY2xpZW50LTYueHNkLCBjb25uZWN0b3JfMV82LnhzZCwgZWpiLWphcl8zXzEueHNkLAotamF2YWVlXzYueHNkLCBqYXZhZWVfd2ViX3NlcnZpY2VzXzFfMy54c2QsCi1qYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzMueHNkLCBqc3BfMl8yLnhzZCwgd2ViLWFwcF8zXzAueHNkLAotd2ViLWNvbW1vbl8zXzAueHNkLCB3ZWItZnJhZ21lbnRfM18wLnhzZCkgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kCi1jb25kaXRpb25zIG9mIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYxLjAuIEEKLWNvcHkgb2YgdGhlIGxpY2Vuc2UgaXMgY29udGFpbmVkIGluIHRoZSBmaWxlIDxhCi0JaHJlZj0iYWJvdXRfZmlsZXMvQ0RETHYxLjAudHh0Ij5MSUNFTlNFLnR4dDwvYT4gYW5kIGlzIGFsc28gYXZhaWxhYmxlCi1hdCA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwiPmh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbDwvYT4uCi08L3A+Ci08cD5UaGUgb3JpZ2luYWwgc291cmNlIGZvciB0aGUgc2NoZW1hcyBpcyBhdmFpbGFibGUgb24gPGEKLQlocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvPC9hPi4KLTwvcD4KLQotPGg0PkphdmEgU2VydmVyIEZhY2VzIDIuMCBTY2hlbWE8L2g0PgotPHA+WW91ciB1c2Ugb2YgdGhlIEphdmEgU2VydmVyIEZhY2VzIDIuMCBzY2hlbWFzIGlzIHN1YmplY3QgdG8gdGhlCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZQotdjEuMC4gQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSA8YQotCWhyZWY9ImFib3V0X2ZpbGVzL0NEREx2MS4wLnR4dCI+TElDRU5TRS50eHQ8L2E+IGFuZCBpcyBhbHNvIGF2YWlsYWJsZQotYXQgPGEgaHJlZj0iaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sIj5odHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWw8L2E+LgotPC9wPgotPHA+VGhlIHNvdXJjZSBmb3IgdGhlIHNjaGVtYSBpcyBhdmFpbGFibGUgb24gdGhlIEphdmEgU2VydmVyIEZhY2VzCi1wcm9qZWN0IHBhZ2Ugb24gdGhlIEdsYXNzZmlzaCBjb21tdW5pdHkgd2Vic2l0ZSBhdCA8YQotCWhyZWY9Imh0dHBzOi8vamF2YXNlcnZlcmZhY2VzLmRldi5qYXZhLm5ldCI+aHR0cHM6Ly9qYXZhc2VydmVyZmFjZXMuZGV2LmphdmEubmV0LzwvYT4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvQ0RETHYxLjAudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9DRERMdjEuMC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNTRlMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9DRERMdjEuMC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjAKLQotMS4gRGVmaW5pdGlvbnMuCi0KLTEuMS4gQ29udHJpYnV0b3IgbWVhbnMgZWFjaCBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0IGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCi0KLTEuMi4gQ29udHJpYnV0b3IgVmVyc2lvbiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciAoaWYgYW55KSwgYW5kIHRoZSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgotCi0xLjMuIENvdmVyZWQgU29mdHdhcmUgbWVhbnMgKGEpIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGIpIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIGZpbGVzIGNvbnRhaW5pbmcgTW9kaWZpY2F0aW9ucywgaW4gZWFjaCBjYXNlIGluY2x1ZGluZyBwb3J0aW9ucyB0aGVyZW9mLgotCi0xLjQuIEV4ZWN1dGFibGUgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0gb3RoZXIgdGhhbiBTb3VyY2UgQ29kZS4KLQotMS41LiBJbml0aWFsIERldmVsb3BlciBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0xLjYuIExhcmdlciBXb3JrIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkIFNvZnR3YXJlIG9yIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0xLjcuIExpY2Vuc2UgbWVhbnMgdGhpcyBkb2N1bWVudC4KLQotMS44LiBMaWNlbnNhYmxlIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvciBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMgY29udmV5ZWQgaGVyZWluLgotCi0xLjkuIE1vZGlmaWNhdGlvbnMgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci0KLUEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYSBmaWxlIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uczsKLQotQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IKLQotQy4gQW55IG5ldyBmaWxlIHRoYXQgaXMgY29udHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLTEuMTAuIE9yaWdpbmFsIFNvZnR3YXJlIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgdGhhdCBpcyBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotMS4xMS4gUGF0ZW50IENsYWltcyBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQgb3IgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLCBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50IExpY2Vuc2FibGUgYnkgZ3JhbnRvci4KLQotMS4xMi4gU291cmNlIENvZGUgbWVhbnMgKGEpIHRoZSBjb21tb24gZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIGluIHdoaWNoIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgYW5kIChiKSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgaW4gb3Igd2l0aCBzdWNoIGNvZGUuCi0KLTEuMTMuIFlvdSAob3IgWW91cikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUgdGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCBZb3UgaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sIGNvbnRyb2wgbWVhbnMgKGEp4XRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYinhb3duZXJzaGlwIG9mIG1vcmUgdGhhbiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLTIuIExpY2Vuc2UgR3JhbnRzLgotCi0yLjEuIFRoZSBJbml0aWFsIERldmVsb3BlciBHcmFudC4KLUNvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6Ci0oYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IEluaXRpYWwgRGV2ZWxvcGVyLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZiksIHdpdGggb3Igd2l0aG91dCBNb2RpZmljYXRpb25zLCBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLShiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZyBvciBzZWxsaW5nIG9mIE9yaWdpbmFsIFNvZnR3YXJlLCB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgcHJhY3RpY2UsIHNlbGwsIGFuZCBvZmZlciBmb3Igc2FsZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZikuCi0oYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnPhMi4xKGEpIGFuZCAoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0oZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb27hMi4xKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkOiAoMSnhZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoMinhZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSnhdGhlIG1vZGlmaWNhdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yIChpaSnhdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGRldmljZXMuCi0KLTIuMi4gQ29udHJpYnV0b3IgR3JhbnQuCi1Db25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZToKLShhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgQ29udHJpYnV0b3IgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBlaXRoZXIgb24gYW4gdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcyBDb3ZlcmVkIFNvZnR3YXJlIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAotKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nLCBvciBzZWxsaW5nIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZSBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbiksIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsIGhhdmUgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAoMSnhTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpOyBhbmQgKDIp4XRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKS4KLShjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9uc+EyLjIoYSkgYW5kIDIuMihiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0IGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgTW9kaWZpY2F0aW9ucyBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eS4KLShkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbuEyLjIoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKeFmb3IgYW55IGNvZGUgdGhhdCBDb250cmlidXRvciBoYXMgZGVsZXRlZCBmcm9tIHRoZSBDb250cmlidXRvciBWZXJzaW9uOyAoMinhZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSnhdGhpcmQgcGFydHkgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkp4XRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMp4XVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IENvdmVyZWQgU29mdHdhcmUgaW4gdGhlIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IuCi0KLTMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4KLQotMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCi0KLUFueSBDb3ZlcmVkIFNvZnR3YXJlIHRoYXQgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGluIEV4ZWN1dGFibGUgZm9ybSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgaW4gU291cmNlIENvZGUgZm9ybSBhbmQgdGhhdCBTb3VyY2UgQ29kZSBmb3JtIG11c3QgYmUgZGlzdHJpYnV0ZWQgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgbXVzdCBpbmNsdWRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZSBTb3VyY2UgQ29kZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZS4gWW91IG11c3QgaW5mb3JtIHJlY2lwaWVudHMgb2YgYW55IHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gYXMgdG8gaG93IHRoZXkgY2FuIG9idGFpbiBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCi0KLTMuMi4gTW9kaWZpY2F0aW9ucy4KLQotVGhlIE1vZGlmaWNhdGlvbnMgdGhhdCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZSBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgcmVwcmVzZW50IHRoYXQgWW91IGJlbGlldmUgWW91ciBNb2RpZmljYXRpb25zIGFyZSBZb3VyIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vciBZb3UgaGF2ZSBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4KLQotMy4zLiBSZXF1aXJlZCBOb3RpY2VzLgotWW91IG11c3QgaW5jbHVkZSBhIG5vdGljZSBpbiBlYWNoIG9mIFlvdXIgTW9kaWZpY2F0aW9ucyB0aGF0IGlkZW50aWZpZXMgWW91IGFzIHRoZSBDb250cmlidXRvciBvZiB0aGUgTW9kaWZpY2F0aW9uLiBZb3UgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyayBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIENvdmVyZWQgU29mdHdhcmUsIG9yIGFueSBub3RpY2VzIG9mIGxpY2Vuc2luZyBvciBhbnkgZGVzY3JpcHRpdmUgdGV4dCBnaXZpbmcgYXR0cmlidXRpb24gdG8gYW55IENvbnRyaWJ1dG9yIG9yIHRoZSBJbml0aWFsIERldmVsb3Blci4KLQotMy40LiBBcHBsaWNhdGlvbiBvZiBBZGRpdGlvbmFsIFRlcm1zLgotWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiBhbnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50cyByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBTb2Z0d2FyZS4gSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbiBiZWhhbGYgb2YgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIGFueSBDb250cmlidXRvci4gWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHN1Y2ggd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgYW5kIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2Ygd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLgotCi0zLjUuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIFZlcnNpb25zLgotWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciB1bmRlciB0aGUgdGVybXMgb2YgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLCB3aGljaCBtYXkgY29udGFpbiB0ZXJtcyBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbiBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgdGhhdCB0aGUgbGljZW5zZSBmb3IgdGhlIEV4ZWN1dGFibGUgZm9ybSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnRzIHJpZ2h0cyBpbiB0aGUgU291cmNlIENvZGUgZm9ybSBmcm9tIHRoZSByaWdodHMgc2V0IGZvcnRoIGluIHRoaXMgTGljZW5zZS4gSWYgWW91IGRpc3RyaWJ1dGUgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UsIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UgYXJlIG9mZmVyZWQgYnkgWW91IGFsb25lLCBub3QgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yLiBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoIHRlcm1zIFlvdSBvZmZlci4KLQotMy42LiBMYXJnZXIgV29ya3MuCi1Zb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaCBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4KLQotNC4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuCi0KLTQuMS4gTmV3IFZlcnNpb25zLgotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbiB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbiBTZWN0aW9uIDQuMywgbm8gb25lIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2Ugc3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIExpY2Vuc2UuCi0KLTQuMi4gRWZmZWN0IG9mIE5ldyBWZXJzaW9ucy4KLQotWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBJbml0aWFsIERldmVsb3BlciBpbmNsdWRlcyBhIG5vdGljZSBpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgcHJvaGliaXRpbmcgaXQgZnJvbSBiZWluZyBkaXN0cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBPdGhlcndpc2UsIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSBwdWJsaXNoZWQgYnkgdGhlIGxpY2Vuc2Ugc3Rld2FyZC4KLTQuMy4gTW9kaWZpZWQgVmVyc2lvbnMuCi0KLVdoZW4gWW91IGFyZSBhbiBJbml0aWFsIERldmVsb3BlciBhbmQgWW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGxpY2Vuc2UgZm9yIFlvdXIgT3JpZ2luYWwgU29mdHdhcmUsIFlvdSBtYXkgY3JlYXRlIGFuZCB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKeFyZW5hbWUgdGhlIGxpY2Vuc2UgYW5kIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0byB0aGUgbmFtZSBvZiB0aGUgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIp4W90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQgdGhlIGxpY2Vuc2UgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlLgotCi01LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgotCi1DT1ZFUkVEIFNPRlRXQVJFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiBBUyBJUyBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVEIFNPRlRXQVJFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVEIFNPRlRXQVJFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgU09GVFdBUkUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVCBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgU09GVFdBUkUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSIFRISVMgRElTQ0xBSU1FUi4KLQotNi4gVEVSTUlOQVRJT04uCi0KLTYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwgdGVybWluYXRlIGF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMgaGVyZWluIGFuZCBmYWlsIHRvIGN1cmUgc3VjaCBicmVhY2ggd2l0aGluIDMwIGRheXMgb2YgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXIgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwgc3Vydml2ZS4KLQotNi4yLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nIGRlY2xhcmF0b3J5IGp1ZGdtZW50IGFjdGlvbnMpIGFnYWluc3QgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYSBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3Qgd2hvbSBZb3UgYXNzZXJ0IHN1Y2ggY2xhaW0gaXMgcmVmZXJyZWQgdG8gYXMgUGFydGljaXBhbnQpIGFsbGVnaW5nIHRoYXQgdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIChtZWFuaW5nIHRoZSBDb250cmlidXRvciBWZXJzaW9uIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyBhIENvbnRyaWJ1dG9yIG9yIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyKSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdG8gWW91IGJ5IHN1Y2ggUGFydGljaXBhbnQsIHRoZSBJbml0aWFsIERldmVsb3BlciAoaWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGlzIG5vdCB0aGUgUGFydGljaXBhbnQpIGFuZCBhbGwgQ29udHJpYnV0b3JzIHVuZGVyIFNlY3Rpb25z4TIuMSBhbmQvb3IgMi4yIG9mIHRoaXMgTGljZW5zZSBzaGFsbCwgdXBvbiA2MCBkYXlzIG5vdGljZSBmcm9tIFBhcnRpY2lwYW50IHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5IGFuZCBhdXRvbWF0aWNhbGx5IGF0IHRoZSBleHBpcmF0aW9uIG9mIHN1Y2ggNjAgZGF5IG5vdGljZSBwZXJpb2QsIHVubGVzcyBpZiB3aXRoaW4gc3VjaCA2MCBkYXkgcGVyaW9kIFlvdSB3aXRoZHJhdyBZb3VyIGNsYWltIHdpdGggcmVzcGVjdCB0byB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50IGVpdGhlciB1bmlsYXRlcmFsbHkgb3IgcHVyc3VhbnQgdG8gYSB3cml0dGVuIGFncmVlbWVudCB3aXRoIFBhcnRpY2lwYW50LgotCi02LjMuIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9uc+E2LjEgb3IgNi4yIGFib3ZlLCBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBhbnkgZGlzdHJpYnV0b3IgaGVyZXVuZGVyIHByaW9yIHRvIHRlcm1pbmF0aW9uIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKSBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLgotCi03LiBMSU1JVEFUSU9OIE9GIExJQUJJTElUWS4KLQotVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUgSU5JVElBTCBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GIENPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUiBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRiBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwgSU5KVVJZIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFlTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVCBBUFBMSUNBQkxFIExBVyBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRSBFWENMVVNJT04gT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVCBBUFBMWSBUTyBZT1UuCi0KLTguIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuCi0KLVRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgY29tbWVyY2lhbCBpdGVtLCBhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBpbiA0OOFDLkYuUi7hMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZSAoYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgYXQgNDggQy5GLlIuIOEyNTIuMjI3LTcwMTQoYSkoMSkpIGFuZCBjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb24gYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OOFDLkYuUi7hMTIuMjEyIChTZXB0LiAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4IEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4gVGhpcyBVLlMuIEdvdmVybm1lbnQgUmlnaHRzIGNsYXVzZSBpcyBpbiBsaWV1IG9mLCBhbmQgc3VwZXJzZWRlcywgYW55IG90aGVyIEZBUiwgREZBUiwgb3Igb3RoZXIgY2xhdXNlIG9yIHByb3Zpc2lvbiB0aGF0IGFkZHJlc3NlcyBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLTkuIE1JU0NFTExBTkVPVVMuCi0KLVRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAoZXhjZXB0IHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcsIGlmIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIHN1Y2gganVyaXNkaWN0aW9ucyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gQW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgY291cnRzIGxvY2F0ZWQgaW4gdGhlIGp1cmlzZGljdGlvbiBhbmQgdmVudWUgc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCB3aXRoIHRoZSBsb3NpbmcgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgY291cnQgY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzIGZlZXMgYW5kIGV4cGVuc2VzLiBUaGUgYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zIENvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4gQW55IGxhdyBvciByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3Qgc2hhbGwgYmUgY29uc3RydWVkIGFnYWluc3QgdGhlIGRyYWZ0ZXIgc2hhbGwgbm90IGFwcGx5IHRvIHRoaXMgTGljZW5zZS4gWW91IGFncmVlIHRoYXQgWW91IGFsb25lIGFyZSByZXNwb25zaWJsZSBmb3IgY29tcGxpYW5jZSB3aXRoIHRoZSBVbml0ZWQgU3RhdGVzIGV4cG9ydCBhZG1pbmlzdHJhdGlvbiByZWd1bGF0aW9ucyAoYW5kIHRoZSBleHBvcnQgY29udHJvbCBsYXdzIGFuZCByZWd1bGF0aW9uIG9mIGFueSBvdGhlciBjb3VudHJpZXMpIHdoZW4gWW91IHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IENvdmVyZWQgU29mdHdhcmUuCi0KLTEwLiBSRVNQT05TSUJJTElUWSBGT1IgQ0xBSU1TLgotCi1BcyBiZXR3ZWVuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCB0aGUgQ29udHJpYnV0b3JzLCBlYWNoIHBhcnR5IGlzIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgb3V0IG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBZb3UgYWdyZWUgdG8gd29yayB3aXRoIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBDb250cmlidXRvcnMgdG8gZGlzdHJpYnV0ZSBzdWNoIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZyBoZXJlaW4gaXMgaW50ZW5kZWQgb3Igc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbiBvZiBsaWFiaWxpdHkuCi0KLU5PVElDRSBQVVJTVUFOVCBUTyBTRUNUSU9OIDkgT0YgVEhFIENPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpCi1UaGUgR2xhc3NGaXNoIGNvZGUgcmVsZWFzZWQgdW5kZXIgdGhlIENEREwgc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEgKGV4Y2x1ZGluZyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucykuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIEZlZGVyYWwgQ291cnRzIG9mIHRoZSBOb3J0aGVybiBEaXN0cmljdCBvZiBDYWxpZm9ybmlhIGFuZCB0aGUgc3RhdGUgY291cnRzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhLCB3aXRoIHZlbnVlIGx5aW5nIGluIFNhbnRhIENsYXJhIENvdW50eSwgQ2FsaWZvcm5pYS4gCi0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL0xJQ0VOU0UudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1NGUwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLUNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wCi0KLTEuIERlZmluaXRpb25zLgotCi0xLjEuIENvbnRyaWJ1dG9yIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yIGNvbnRyaWJ1dGVzIHRvIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLgotCi0xLjIuIENvbnRyaWJ1dG9yIFZlcnNpb24gbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEgQ29udHJpYnV0b3IgKGlmIGFueSksIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KLQotMS4zLiBDb3ZlcmVkIFNvZnR3YXJlIG1lYW5zIChhKSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yIChiKSBNb2RpZmljYXRpb25zLCBvciAoYykgdGhlIGNvbWJpbmF0aW9uIG9mIGZpbGVzIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBmaWxlcyBjb250YWluaW5nIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZSBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4KLQotMS40LiBFeGVjdXRhYmxlIG1lYW5zIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIGFueSBmb3JtIG90aGVyIHRoYW4gU291cmNlIENvZGUuCi0KLTEuNS4gSW5pdGlhbCBEZXZlbG9wZXIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgZmlyc3QgbWFrZXMgT3JpZ2luYWwgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotMS42LiBMYXJnZXIgV29yayBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZCBTb2Z0d2FyZSBvciBwb3J0aW9ucyB0aGVyZW9mIHdpdGggY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotMS43LiBMaWNlbnNlIG1lYW5zIHRoaXMgZG9jdW1lbnQuCi0KLTEuOC4gTGljZW5zYWJsZSBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwgZ3JhbnQgb3Igc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzIGNvbnZleWVkIGhlcmVpbi4KLQotMS45LiBNb2RpZmljYXRpb25zIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGFueSBvZiB0aGUgZm9sbG93aW5nOgotCi1BLiBBbnkgZmlsZSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywgZGVsZXRpb24gZnJvbSBvciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbnM7Ci0KLUIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb247IG9yCi0KLUMuIEFueSBuZXcgZmlsZSB0aGF0IGlzIGNvbnRyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0xLjEwLiBPcmlnaW5hbCBTb2Z0d2FyZSBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIHRoYXQgaXMgb3JpZ2luYWxseSByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLTEuMTEuIFBhdGVudCBDbGFpbXMgbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkIG9yIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuCi0KLTEuMTIuIFNvdXJjZSBDb2RlIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSBpbiB3aGljaCBtb2RpZmljYXRpb25zIGFyZSBtYWRlIGFuZCAoYikgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIGluIG9yIHdpdGggc3VjaCBjb2RlLgotCi0xLjEzLiBZb3UgKG9yIFlvdXIpIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgWW91IGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCBjb250cm9sIG1lYW5zIChhKeF0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGIp4W93bmVyc2hpcCBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0yLiBMaWNlbnNlIEdyYW50cy4KLQotMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCi1Db25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgotKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0oYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLgotKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25z4TIuMShhKSBhbmQgKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgSW5pdGlhbCBEZXZlbG9wZXIgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9u4TIuMShiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEp4WZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIp4WZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkp4XRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoaWkp4XRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLgotCi0yLjIuIENvbnRyaWJ1dG9yIEdyYW50LgotQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6Ci0oYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIgTW9kaWZpY2F0aW9ucywgYXMgQ292ZXJlZCBTb2Z0d2FyZSBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLShiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluIGNvbWJpbmF0aW9uIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBoYXZlIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogKDEp4U1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKTsgYW5kICgyKeF0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbikuCi0oYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnPhMi4yKGEpIGFuZCAyLjIoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE1vZGlmaWNhdGlvbnMgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuCi0oZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb27hMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkOiAoMSnhZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IgaGFzIGRlbGV0ZWQgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsgKDIp4WZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkp4XRoaXJkIHBhcnR5IG1vZGlmaWNhdGlvbnMgb2YgQ29udHJpYnV0b3IgVmVyc2lvbiwgb3IgKGlpKeF0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBvdGhlciBzb2Z0d2FyZSAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24pIG9yIG90aGVyIGRldmljZXM7IG9yICgzKeF1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZSBhYnNlbmNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yLgotCi0zLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCi0KLTMuMS4gQXZhaWxhYmlsaXR5IG9mIFNvdXJjZSBDb2RlLgotCi1BbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0gYW5kIHRoYXQgU291cmNlIENvZGUgZm9ybSBtdXN0IGJlIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUgU291cmNlIENvZGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueSBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbiBvYnRhaW4gc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi0zLjIuIE1vZGlmaWNhdGlvbnMuCi0KLVRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IHJlcHJlc2VudCB0aGF0IFlvdSBiZWxpZXZlIFlvdXIgTW9kaWZpY2F0aW9ucyBhcmUgWW91ciBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8gZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCi0KLTMuMy4gUmVxdWlyZWQgTm90aWNlcy4KLVlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMgdGhhdCBpZGVudGlmaWVzIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4gWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvciB0cmFkZW1hcmsgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLCBvciBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuCi0KLTMuNC4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcy4KLVlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMgcmlnaHRzIGhlcmV1bmRlci4gWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsIGFuZCB0byBjaGFyZ2UgYSBmZWUgZm9yLCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgU29mdHdhcmUuIEhvd2V2ZXIsIHlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24gYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KLQotMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KLVlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzIExpY2Vuc2UuIElmIFlvdSBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvci4gWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiBhbnkgc3VjaCB0ZXJtcyBZb3Ugb2ZmZXIuCi0KLTMuNi4gTGFyZ2VyIFdvcmtzLgotWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG90aGVyIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2ggYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UgYXJlIGZ1bGZpbGxlZCBmb3IgdGhlIENvdmVyZWQgU29mdHdhcmUuCi0KLTQuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLgotCi00LjEuIE5ldyBWZXJzaW9ucy4KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZCBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24gd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4gU2VjdGlvbiA0LjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBMaWNlbnNlLgotCi00LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCi0KLVlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW5jbHVkZXMgYSBub3RpY2UgaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHByb2hpYml0aW5nIGl0IGZyb20gYmVpbmcgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtdXN0IGRpc3RyaWJ1dGUgYW5kIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuCi00LjMuIE1vZGlmaWVkIFZlcnNpb25zLgotCi1XaGVuIFlvdSBhcmUgYW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIFlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBsaWNlbnNlIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaWYgWW91OiAoYSnhcmVuYW1lIHRoZSBsaWNlbnNlIGFuZCByZW1vdmUgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG5hbWUgb2YgdGhlIGxpY2Vuc2Ugc3Rld2FyZCAoZXhjZXB0IHRvIG5vdGUgdGhhdCB0aGUgbGljZW5zZSBkaWZmZXJzIGZyb20gdGhpcyBMaWNlbnNlKTsgYW5kIChiKeFvdGhlcndpc2UgbWFrZSBpdCBjbGVhciB0aGF0IHRoZSBsaWNlbnNlIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZS4KLQotNS4gRElTQ0xBSU1FUiBPRiBXQVJSQU5UWS4KLQotQ09WRVJFRCBTT0ZUV0FSRSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gQVMgSVMgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgVEhBVCBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QgVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuCi0KLTYuIFRFUk1JTkFUSU9OLgotCi02LjEuIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIFByb3Zpc2lvbnMgd2hpY2gsIGJ5IHRoZWlyIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlIHNoYWxsIHN1cnZpdmUuCi0KLTYuMi4gSWYgWW91IGFzc2VydCBhIHBhdGVudCBpbmZyaW5nZW1lbnQgY2xhaW0gKGV4Y2x1ZGluZyBkZWNsYXJhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyIG9yIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0IHdob20gWW91IGFzc2VydCBzdWNoIGNsYWltIGlzIHJlZmVycmVkIHRvIGFzIFBhcnRpY2lwYW50KSBhbGxlZ2luZyB0aGF0IHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSAobWVhbmluZyB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbiB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgYSBDb250cmlidXRvciBvciB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIHRoZSBJbml0aWFsIERldmVsb3BlcikgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55IHBhdGVudCwgdGhlbiBhbnkgYW5kIGFsbCByaWdodHMgZ3JhbnRlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50LCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgKGlmIHRoZSBJbml0aWFsIERldmVsb3BlciBpcyBub3QgdGhlIFBhcnRpY2lwYW50KSBhbmQgYWxsIENvbnRyaWJ1dG9ycyB1bmRlciBTZWN0aW9uc+EyLjEgYW5kL29yIDIuMiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudCB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQgYXV0b21hdGljYWxseSBhdCB0aGUgZXhwaXJhdGlvbiBvZiBzdWNoIDYwIGRheSBub3RpY2UgcGVyaW9kLCB1bmxlc3MgaWYgd2l0aGluIHN1Y2ggNjAgZGF5IHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXIgdW5pbGF0ZXJhbGx5IG9yIHB1cnN1YW50IHRvIGEgd3JpdHRlbiBhZ3JlZW1lbnQgd2l0aCBQYXJ0aWNpcGFudC4KLQotNi4zLiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnPhNi4xIG9yIDYuMiBhYm92ZSwgYWxsIGVuZCB1c2VyIGxpY2Vuc2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkbHkgZ3JhbnRlZCBieSBZb3Ugb3IgYW55IGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbiAoZXhjbHVkaW5nIGxpY2Vuc2VzIGdyYW50ZWQgdG8gWW91IGJ5IGFueSBkaXN0cmlidXRvcikgc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KLQotNy4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuCi0KLVVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFIElOSVRJQUwgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVEIFNPRlRXQVJFLCBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUgTElBQkxFIFRPIEFOWSBQRVJTT04gRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1QgUFJPRklUUywgTE9TUyBPRiBHT09EV0lMTCwgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTiBJTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMIElOSlVSWSBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFNPIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgotCi04LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgotCi1UaGUgQ292ZXJlZCBTb2Z0d2FyZSBpcyBhIGNvbW1lcmNpYWwgaXRlbSwgYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgaW4gNDjhQy5GLlIu4TIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mIGNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiDhMjUyLjIyNy03MDE0KGEpKDEpKSBhbmQgY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZSBkb2N1bWVudGF0aW9uIGFzIHN1Y2ggdGVybXMgYXJlIHVzZWQgaW4gNDjhQy5GLlIu4TEyLjIxMiAoU2VwdC4gMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMSB0aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksIGFsbCBVLlMuIEdvdmVybm1lbnQgRW5kIFVzZXJzIGFjcXVpcmUgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG9ubHkgdGhvc2UgcmlnaHRzIHNldCBmb3J0aCBoZXJlaW4uIFRoaXMgVS5TLiBHb3Zlcm5tZW50IFJpZ2h0cyBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsIGFueSBvdGhlciBGQVIsIERGQVIsIG9yIG90aGVyIGNsYXVzZSBvciBwcm92aXNpb24gdGhhdCBhZGRyZXNzZXMgR292ZXJubWVudCByaWdodHMgaW4gY29tcHV0ZXIgc29mdHdhcmUgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi05LiBNSVNDRUxMQU5FT1VTLgotCi1UaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdCBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXcgb2YgdGhlIGp1cmlzZGljdGlvbiBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKGV4Y2VwdCB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3LCBpZiBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBzdWNoIGp1cmlzZGljdGlvbnMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIGNvdXJ0cyBsb2NhdGVkIGluIHRoZSBqdXJpc2RpY3Rpb24gYW5kIHZlbnVlIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nIHBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0IGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cyBmZWVzIGFuZCBleHBlbnNlcy4gVGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3IgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuIFlvdSBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUgVW5pdGVkIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0IGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdSB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLgotCi0xMC4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KLQotQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcyByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgWW91IGFncmVlIHRvIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5LgotCi1OT1RJQ0UgUFVSU1VBTlQgVE8gU0VDVElPTiA5IE9GIFRIRSBDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKQotVGhlIEdsYXNzRmlzaCBjb2RlIHJlbGVhc2VkIHVuZGVyIHRoZSBDRERMIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhIChleGNsdWRpbmcgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMpLiBBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4gRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSBhbmQgdGhlIHN0YXRlIGNvdXJ0cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYSBDb3VudHksIENhbGlmb3JuaWEuIAotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjgxYTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgZHRkc0FuZFNjaGVtYXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXRfZmlsZXMvCi1zcmMuaW5jbHVkZXMgPSBkdGRzQW5kU2NoZW1hcy8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8KLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzIuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfMV8yLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1OGNjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzIuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENBICA5NDMwMywgVS5TLkEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotVGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50IGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgYW5kIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyBpdHMgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIE5vIHBhcnQgb2YgdGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50YXRpb24gbWF5IGJlCi1yZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgotb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuICAKLQotVGhpcmQgcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZCAKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4gCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBMb2dvLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhIAotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCBKREJDLCBKREssIEphdmFNYWlsIGFuZCBFbnRlcnByaXNlIEphdmFCZWFucywgCi1hcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jIGluIHRoZSBVLlMuIAotYW5kIG90aGVyIGNvdW50cmllcy4KLQotQWxsIFNQQVJDIHRyYWRlbWFya3MgYXJlIHVzZWQgdW5kZXIgbGljZW5zZSBhbmQgYXJlIHRyYWRlbWFya3MKLW9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTUEFSQyBJbnRlcm5hdGlvbmFsLCBJbmMuCi1pbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLiBQcm9kdWN0cyBiZWFyaW5nIFNQQVJDCi10cmFkZW1hcmtzIGFyZSBiYXNlZCB1cG9uIGFuIGFyY2hpdGVjdHVyZSBkZXZlbG9wZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAKLQotUG9zdFNjcmlwdCBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMsIEluYy4gCi0KLSAKLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvIAotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotCi0gCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWQotSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRSBPUiBOT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUCi1UTyBUSEUgRVhURU5UIFRIQVQgU1VDSCBESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZCi1JTlZBTElELgotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCAKLTkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBICA5NDMwMywgRXRhdHMtVW5pcy4gCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotIAotCi1DZSBwcm9kdWl0IG91IGRvY3VtZW50IGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldCBkaXN0cmlidWUnIGF2ZWMgCi1kZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEgZGlzdHJpYnV0aW9uLAotZXQgbGEgZGUnY29tcGlsYXRpb24uICBBdWN1bmUgcGFydGllIGRlIGNlIHByb2R1aXQgb3UgZGUgc2EgZG9jdW1lbnRhdGlvbgotYXNzb2NpZSdlIG5lIHBldXQgZV50cmUgcmVwcm9kdWl0ZSBzb3VzIGF1Y3VuZSBmb3JtZSwgcGFyIHF1ZWxxdWUgbW95ZW4gCi1xdWUgY2Ugc29pdCwgc2FucyBsJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcyAKLWJhaWxsZXVycyBkZSBsaWNlbmNlLCBzJ2lsIHkgZW4gYS4gIAotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZSAKLXJlbGF0aXZlIGF1eCBwb2xpY2VzIGRlIGNhcmFjdGVgcmVzLCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgCi1ldCBsaWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotIAotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCBsZSBsb2dvIFN1biwgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCwgZXQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsICAKLXNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTdW4gCi1NaWNyb3N5c3RlbXMsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgZGFucyBkJ2F1dHJlcyBwYXlzLgotIAotVG91dGVzIGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQgdXRpbGlzZSdlcyBzb3VzIGxpY2VuY2UgZXQgc29udAotZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTUEFSQwotSW50ZXJuYXRpb25hbCwgSW5jLiBhdXggRXRhdHMtVW5pcyBldCAgZGFucwotZCdhdXRyZXMgcGF5cy4gTGVzIHByb2R1aXRzIHBvcnRhbnQgbGVzIG1hcnF1ZXMgU1BBUkMgc29udAotYmFzZSdzIHN1ciB1bmUgYXJjaGl0ZWN0dXJlIGRlJ3ZlbG9wcGUnZSBwYXIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgCi0KLVBvc3RjcmlwdCBlc3QgdW5lIG1hcnF1ZSBlbnJlZ2lzdHJlJ2UgZCdBZG9iZSBTeXN0ZW1zIEluYy4gCi0gCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0VUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQgRVhDTFVFUywKLURBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUyBOT1RBTU1FTlQKLVRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBIEwnQVBUSVRVREUKLUEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERSBDT05UUkVGQUNPTi4KLS0tPgotCi08IS0tCi1UaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQKLWRlcGxveW1lbnQgZGVzY3JpcHRvci4KLVRoZSBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgRUpCIGNvbXBvbmVudHMgYW5kCi1leHRlcm5hbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50LgotLS0+Ci08IUVMRU1FTlQgYXBwbGljYXRpb24tY2xpZW50IChpY29uPywgZGlzcGxheS1uYW1lLCBkZXNjcmlwdGlvbj8sIGVudi1lbnRyeSosCi1lamItcmVmKiwgcmVzb3VyY2UtcmVmKik+Ci0KLTwhLS0KLVRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LgotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlCi1hcHBsaWNhdGlvbi1jbGllbnQgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUKLWFwcGxpY2F0aW9uLWNsaWVudCBmaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5Ci10aGUgYXBwbGljYXRpb24tY2xpZW50IGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuCi1wcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZAotYnkgdG9vbHMuCi0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBlamItcmVmIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGF0IGFuIEVKQgotcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGVuY29tcGFzc2luZyBKMkVFIEFwcGxpY2F0aW9uCi1wYWNrYWdlLiBUaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4gZW50ZXJwcmlzZQotYmVhbiBpbiB0aGUgc2FtZSBKMkVFIEFwcGxpY2F0aW9uIHBhY2thZ2UuIFVzZWQgaW46IGVqYi1yZWYKLUV4YW1wbGU6IDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0tLT4KLTwhRUxFTUVOVCBlamItbGluayAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmIGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UKLWJlYW4ncyBob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IHRoZSBFSkIKLXJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGNsaWVudDsgdGhlCi1leHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbjsgdGhlIGV4cGVjdGVkIGhvbWUgYW5kIHJlbW90ZQotaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW47IGFuZCBhbiBvcHRpb25hbCBlamItbGluawotaW5mb3JtYXRpb24uIFRoZSBvcHRpb25hbCBlamItbGluayBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZAotZW50ZXJwcmlzZSBiZWFuLgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZiAoZGVzY3JpcHRpb24/LCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwgaG9tZSwgcmVtb3RlLAotZWpiLWxpbms/KT4KLQotPCEtLQotVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIKLXJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MgZW52aXJvbm1lbnQuIEl0IGlzIHJlY29tbWVuZGVkCi10aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuIFVzZWQgaW46IGVqYi1yZWYKLUV4YW1wbGU6IDxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCi1iZWFuLiBUaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLTxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci08ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLVVzZWQgaW46IGVqYi1yZWYKLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnkgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLWVudmlyb25tZW50IGVudHJpZXMuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlCi1uYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYW5kIGFuIG9wdGlvbmFsIHZhbHVlLgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5IChkZXNjcmlwdGlvbj8sIGVudi1lbnRyeS1uYW1lLCBlbnYtZW50cnktdHlwZSwKLWVudi1lbnRyeS12YWx1ZT8pPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotZW52aXJvbm1lbnQgZW50cnkuIFVzZWQgaW46IGVudi1lbnRyeQotRXhhbXBsZTogPGVudi1lbnRyeS1uYW1lPkVtcGxveWVlQXBwREI8L2Vudi1lbnRyeS1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZiB0aGUKLWVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzIGNvZGUuIFRoZQotZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlOiBqYXZhLmxhbmcuQm9vbGVhbiwKLWphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLCBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwKLWphdmEubGFuZy5TaG9ydCwgamF2YS5sYW5nLkxvbmcsIGFuZCBqYXZhLmxhbmcuRmxvYXQuCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotZW52aXJvbm1lbnQgZW50cnkuIFRoZSB2YWx1ZSBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZSBjb25zdHJ1Y3Rvcgotb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYSBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlci4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0KLUV4YW1wbGU6Ci08ZW52LWVudHJ5LXZhbHVlPi9kYXRhc291cmNlcy9NeURhdGFiYXNlPC9lbnYtZW50cnktdmFsdWU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZQotaW50ZXJmYWNlLgotVXNlZCBpbjogZWpiLXJlZgotRXhhbXBsZTogPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8L2hvbWU+Ci0tLT4KLTwhRUxFTUVOVCBob21lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGljb24gZWxlbWVudCBjb250YWlucyBhIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudCB3aGljaCBzcGVjaWZ5IHRoZQotVVJJcyBmb3IgYSBzbWFsbCBhbmQgYSBsYXJnZSBHSUYgb3IgSlBFRyBpY29uIGltYWdlIHVzZWQgdG8gcmVwcmVzZW50IHRoZQotYXBwbGljYXRpb24gY2xpZW50IGluIGEgR1VJIHRvb2wuCi0tLT4KLTwhRUxFTUVOVCBpY29uIChzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8pPgotCi08IS0tCi1UaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgbGFyZ2UgKDMyIHggMzIpCi1pY29uIGltYWdlLiBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLWNsaWVudCBqYXIKLWZpbGUuIFRoZSBpbWFnZSBtdXN0IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LCBhbmQgdGhlIGZpbGUgbmFtZSBtdXN0Ci1lbmQgd2l0aCB0aGUgc3VmZml4ICIuanBnIiBvciAiLmdpZiIgcmVzcGVjdGl2ZWx5LiBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieQotdG9vbHMuCi1FeGFtcGxlOgotPGxhcmdlLWljb24+bGliL2ltYWdlcy9lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLXJlbW90ZSBpbnRlcmZhY2UuCi1Vc2VkIGluOiBlamItcmVmCi1FeGFtcGxlOgotPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0tLT4KLTwhRUxFTUVOVCByZW1vdGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLWF1dGggZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUgc2lnbnMgb24KLXByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yIHdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24KLXRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyIG9uIGJlaGFsZiBvZiB0aGUgYmVhbi4gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgQ29udGFpbmVyCi11c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlIERlcGxveWVyLgotVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLTxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci08cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLS0tPgotPCFFTEVNRU5UIHJlcy1hdXRoICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeSByZWZlcmVuY2UKLW5hbWUuIFRoZSByZXNvdXJjZSBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbgotY2xpZW50J3MgZW52aXJvbm1lbnQgZW50cnkgd2hvc2UgdmFsdWUgY29udGFpbnMgdGhlIEpOREkgbmFtZSBvZiB0aGUgZGF0YQotc291cmNlLgotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEgc291cmNlLiBUaGUgdHlwZSBpcwotc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZSAob3IgY2xhc3MpIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZQotZGF0YSBzb3VyY2UuCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYXBwbGljYXRpb24gY2xpZW50cydzCi1yZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUKLXJlc291cmNlIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsIHRoZSBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5IHR5cGUKLWV4cGVjdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncyBjb2RlLCBhbmQgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24gKGJlYW4KLW9yIGNvbnRhaW5lcikuCi0KLUV4YW1wbGU6Ci08cmVzb3VyY2UtcmVmPgotPHJlcy1yZWYtbmFtZT5FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+Ci08cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci08L3Jlc291cmNlLXJlZj4KLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLXJlZiAoZGVzY3JpcHRpb24/LCByZXMtcmVmLW5hbWUsIHJlcy10eXBlLCByZXMtYXV0aCk+Ci08IS0tCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpCi1pY29uIGltYWdlLiBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLWNsaWVudCBqYXIKLWZpbGUuIFRoZSBpbWFnZSBtdXN0IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LCBhbmQgdGhlIGZpbGUgbmFtZSBtdXN0Ci1lbmQgd2l0aCB0aGUgc3VmZml4ICIuanBnIiBvciAiLmdpZiIgcmVzcGVjdGl2ZWx5LiBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieQotdG9vbHMuCi1FeGFtcGxlOgotPHNtYWxsLWljb24+bGliL2ltYWdlcy9lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIElEIG1lY2hhbmlzbSBpcyB0byBhbGxvdyB0b29scyB0byBlYXNpbHkgbWFrZSB0b29sLXNwZWNpZmljIHJlZmVyZW5jZXMgdG8KLXRoZSBlbGVtZW50cyBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotIC0tPgotPCFBVFRMSVNUIGFwcGxpY2F0aW9uLWNsaWVudCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaG9tZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVtb3RlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1hdXRoIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfMy5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWQ0NTZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfMy5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotPCEtLQotQ29weXJpZ2h0IChjKSAyMDAwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sCi05MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIHJlbGF0aW5nIHRvCi10ZWNobm9sb2d5IGVtYm9kaWVkIGluIHRoZSBwcm9kdWN0IHRoYXQgaXMgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuCi1JbiBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzIGxpc3RlZCBhdAotaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlIGFkZGl0aW9uYWwgcGF0ZW50cyBvcgotcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZSBVLlMuIGFuZCBpbiBvdGhlciBjb3VudHJpZXMuCi0KLVRoaXMgZG9jdW1lbnQgYW5kIHRoZSBwcm9kdWN0IHRvIHdoaWNoIGl0IHBlcnRhaW5zIGFyZSBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIFRoaXMgZG9jdW1lbnQgbWF5IGJlIHJlcHJvZHVjZWQgYW5kIGRpc3RyaWJ1dGVkIGJ1dCBtYXkKLW5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzCi1saWNlbnNvcnMsIGlmIGFueS4KLQotVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZAotbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi1TdW4sICBTdW4gTWljcm9zeXN0ZW1zLCAgdGhlIFN1biBsb2dvLCAgSmF2YSwgIEphdmFTZXJ2ZXIgUGFnZXMsICBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsICBKREJDLCAgSkRLLCAgSmF2YU1haWwgYW5kICBhbmQKLUVudGVycHJpc2UgSmF2YUJlYW5zIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLU1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0bwotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkgSU1QTElFRAotV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IKLU5PTi1JTkZSSU5HRU1FTlQsIEFSRSBESVNDTEFJTUVELCBFWENFUFQgVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0gKLURJU0NMQUlNRVJTIEFSRSBIRUxEIFRPIEJFIExFR0FMTFkgSU5WQUxJRC4KLQotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLUNvcHlyaWdodCAoYykgMjAwMCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLAotOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIEUndGF0cy1VbmlzLgotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhIGxlcyBkcm9pdHMgZGUgcHJvcHJpZSd0ZScgaW50ZWxsZWN0dWVscwotcmVsYXRhbnRzIGFgIGxhIHRlY2hub2xvZ2llIGluY29ycG9yZSdlIGRhbnMgbGUgcHJvZHVpdCBxdWkgZXN0IGRlJ2NyaXQKLWRhbnMgY2UgZG9jdW1lbnQuIEVuIHBhcnRpY3VsaWVyLCBldCBzYW5zIGxhIGxpbWl0YXRpb24sIGNlcyBkcm9pdHMgZGUKLXByb3ByaWUndGUnIGludGVsbGVjdHVlbHMgcGV1dmVudCBpbmNsdXJlIHVuIG91IHBsdXMgZGVzIGJyZXZldHMKLWFtZSdyaWNhaW5zIGUnbnVtZSdyZSdzIGFgIGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGV0IHVuIG91IGxlcwotYnJldmV0cyBwbHVzIHN1cHBsZSdtZW50YWlyZXMgb3UgbGVzIGFwcGxpY2F0aW9ucyBkZSBicmV2ZXQgZW4gYXR0ZW50ZQotZGFucyBsZXMgRSd0YXRzLVVuaXMgZXQgZGFucyBsZXMgYXV0cmVzIHBheXMuCi0KLUNlIHByb2R1aXQgb3UgZG9jdW1lbnQgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0IGRpc3RyaWJ1ZScKLWF2ZWMgZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhCi1kaXN0cmlidXRpb24sIGV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQ2UgZG9jdW1lbnRpb24gYXNzb2NpZSBuIHBldXQKLWVedHJlIHJlcHJvZHVpdGUgZXQgZGlzdHJpYnVlciwgcGFyIHF1ZWxxdWUgbW95ZW4gcXVlIGNlIHNvaXQsIHNhbnMKLWwnYXV0b3Jpc2F0aW9uIHByZSdhbGFibGUgZXQgZSdjcml0ZSBkZSBTdW4gZXQgZGUgc2VzIGJhaWxsZXVycyBkZQotbGljZW5jZSwgbGUgY2FzIGUnY2hlJ2FudC4KLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUKLXJlbGF0aXZlIGF1eCBwb2xpY2VzIGRlIGNhcmFjdGVgcmVzLCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQKLWxpY2VuY2llJyBwYXIgZGVzIGZvdXJuaXNzZXVycyBkZSBTdW4uCi0KLVN1biwgIFN1biBNaWNyb3N5c3RlbXMsICBsZSBsb2dvIFN1biwgIEphdmEsICBKYXZhU2VydmVyIFBhZ2VzLCAgSmF2YQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCAgSkRCQywgIEpESywgIEphdmFNYWlsIGV0ICBhbmQKLUVudGVycHJpc2UgSmF2YUJlYW5zIHNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMKLWRlJ3Bvc2UnZXMgZGUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhdXggRSd0YXRzLVVuaXMgZXQgZGFucyBkJ2F1dHJlcwotcGF5cy4KLQotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFJ1RBVCIgRVQgVE9VVEVTIEFVVFJFUyBDT05ESVRJT05TLAotREVDTEFSQVRJT05TIEVUIEdBUkFOVElFUyBFWFBSRVNTRVMgT1UgVEFDSVRFUyBTT05UIEZPUk1FTExFTUVOVAotRVhDTFVFUywgREFOUyBMQSBNRVNVUkUgQVVUT1JJU0VFIFBBUiBMQSBMT0kgQVBQTElDQUJMRSwgWSBDT01QUklTCi1OT1RBTU1FTlQgVE9VVEUgR0FSQU5USUUgSU1QTElDSVRFIFJFTEFUSVZFIEEgTEEgUVVBTElURSBNQVJDSEFOREUsIEEKLUwnQVBUSVRVREUgQSBVTkUgVVRJTElTQVRJT04gUEFSVElDVUxJRVJFIE9VIEEgTCdBQlNFTkNFIERFCi1DT05UUkVGQUMsT04uCi0tLT4KLQotPCEtLQotVGhpcyBpcyB0aGUgWE1MIERURCBmb3IgdGhlIEoyRUUgMS4zIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLiAgQWxsIEoyRUUgMS4zIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCi1tdXN0IGluY2x1ZGUgYSBET0NUWVBFIG9mIHRoZSBmb2xsb3dpbmcgZm9ybToKLQotICA8IURPQ1RZUEUgYXBwbGljYXRpb24tY2xpZW50IFBVQkxJQwotCSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgMS4zLy9FTiIKLQkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb24tY2xpZW50XzFfMy5kdGQiPgotCi0tLT4KLQotPCEtLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgY29udGFpbiBQQ0RBVEEsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKLSAgaW4gdGhlIGRhdGEgbWF5IGJlIGlnbm9yZWQuCi0KLS0gSW4gZWxlbWVudHMgd2hvc2UgdmFsdWUgaXMgYW4gImVudW1lcmF0ZWQgdHlwZSIsIHRoZSB2YWx1ZSBpcwotICBjYXNlIHNlbnNpdGl2ZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZSBzYW1lCi0gIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdCBzdGFydGluZyB3aXRoICIvIikKLSAgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLgotICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkKLSAgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBzZXJ2bGV0IEFQSS4KLS0tPgotCi0KLTwhLS0KLVRoZSBhcHBsaWNhdGlvbi1jbGllbnQgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuIGFwcGxpY2F0aW9uCi1jbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgRUpCIGNvbXBvbmVudHMgYW5kIGV4dGVybmFsIHJlc291cmNlcwotcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50LgotLS0+Ci08IUVMRU1FTlQgYXBwbGljYXRpb24tY2xpZW50IChpY29uPywgZGlzcGxheS1uYW1lLCBkZXNjcmlwdGlvbj8sCi0JCWVudi1lbnRyeSosIGVqYi1yZWYqLCByZXNvdXJjZS1yZWYqLCByZXNvdXJjZS1lbnYtcmVmKiwKLQkJY2FsbGJhY2staGFuZGxlcj8pPgotCi08IS0tCi1UaGUgY2FsbGJhY2staGFuZGxlciBlbGVtZW50IG5hbWVzIGEgY2xhc3MgcHJvdmlkZWQgYnkgdGhlCi1hcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzIGNvbnN0cnVjdG9yIGFuZCBtdXN0Ci1pbXBsZW1lbnQgdGhlIGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyIGludGVyZmFjZS4KLVRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGNvbnRhaW5lciBhbmQKLXVzZWQgYnkgdGhlIGNvbnRhaW5lciB0byBjb2xsZWN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlCi11c2VyLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbi1jbGllbnQKLS0tPgotPCFFTEVNRU5UIGNhbGxiYWNrLWhhbmRsZXIgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQKLWVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdAotdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBqYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBqYXIgZmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMKLXVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBqYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uCi13aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbi1jbGllbnQsIGVqYi1yZWYsIGVudi1lbnRyeSwgcmVzb3VyY2UtZW52LXJlZiwKLXJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLWRpc3BsYXllZCBieSB0b29scy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbi1jbGllbnQKLQotRXhhbXBsZToKLQotPGRpc3BsYXktbmFtZT5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGVqYi1yZWYgZWxlbWVudAotdG8gc3BlY2lmeSB0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGFuCi1lbnRlcnByaXNlIGJlYW4uCi0KLVRoZSBuYW1lIGluIHRoZSBlamItbGluayBlbGVtZW50IGlzIGNvbXBvc2VkIG9mIGEKLXBhdGggbmFtZSBzcGVjaWZ5aW5nIHRoZSBlamItamFyIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZQotYmVhbiB3aXRoIHRoZSBlamItbmFtZSBvZiB0aGUgdGFyZ2V0IGJlYW4gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tCi10aGUgcGF0aCBuYW1lIGJ5ICIjIi4gIFRoZSBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIGphciBmaWxlCi1jb250YWluaW5nIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgdGhhdCBpcyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuLgotVGhpcyBhbGxvd3MgbXVsdGlwbGUgZW50ZXJwcmlzZSBiZWFucyB3aXRoIHRoZSBzYW1lIGVqYi1uYW1lIHRvIGJlCi11bmlxdWVseSBpZGVudGlmaWVkLgotCi1Vc2VkIGluOiBlamItcmVmCi0KLUV4YW1wbGVzOgotCi0JPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLQotCTxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLQotLS0+Ci08IUVMRU1FTlQgZWpiLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bwotYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCS0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mCi0JICB0aGUgYXBwbGljYXRpb24gY2xpZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQktIHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZAotCSAgZW50ZXJwcmlzZSBiZWFuCi0JLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZSByZWZlcmVuY2VkCi0JICBlbnRlcnByaXNlIGJlYW4KLQotVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0tLT4KLTwhRUxFTUVOVCBlamItcmVmIChkZXNjcmlwdGlvbj8sIGVqYi1yZWYtbmFtZSwgZWpiLXJlZi10eXBlLAotCQlob21lLCByZW1vdGUsIGVqYi1saW5rPyk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIgcmVmZXJlbmNlLiBUaGUKLUVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGFuZCBpcwotcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi13aXRoaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi1Vc2VkIGluOiBlamItcmVmCi0KLUV4YW1wbGU6Ci0KLTxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUKLXJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCTxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0JPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0KLVVzZWQgaW46IGVqYi1yZWYKLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnkgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLWVudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbAotdmFsdWUuICBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIG9uZSBtdXN0IGJlIHN1cHBsaWVkCi1kdXJpbmcgZGVwbG95bWVudC4KLQotVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnkgKGRlc2NyaXB0aW9uPywgZW52LWVudHJ5LW5hbWUsIGVudi1lbnRyeS10eXBlLAotCQllbnYtZW50cnktdmFsdWU/KT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLWVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi1qYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCi1Vc2VkIGluOiBlbnYtZW50cnkKLQotRXhhbXBsZToKLQotPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mCi10aGUgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MKLWNvZGUuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGU6Ci0KLQlqYXZhLmxhbmcuQm9vbGVhbgotCWphdmEubGFuZy5CeXRlCi0JamF2YS5sYW5nLkNoYXJhY3RlcgotCWphdmEubGFuZy5TdHJpbmcKLQlqYXZhLmxhbmcuU2hvcnQKLQlqYXZhLmxhbmcuSW50ZWdlcgotCWphdmEubGFuZy5Mb25nCi0JamF2YS5sYW5nLkZsb2F0Ci0JamF2YS5sYW5nLkRvdWJsZQotCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotCi08ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi1lbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlCi1jb25zdHJ1Y3RvciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdGhhdCB0YWtlcyBhIHNpbmdsZSBTdHJpbmcKLXBhcmFtZXRlciwgb3IgZm9yIGphdmEubGFuZy5DaGFyYWN0ZXIsIGEgc2luZ2xlIGNoYXJhY3Rlci4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0KLUV4YW1wbGU6Ci0KLTxlbnYtZW50cnktdmFsdWU+MTAwLjAwPC9lbnYtZW50cnktdmFsdWU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZQotYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItcmVmCi0KLUV4YW1wbGU6Ci0KLTxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC9ob21lPgotLS0+Ci08IUVMRU1FTlQgaG9tZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBpY29uIGVsZW1lbnQgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cyB0aGF0Ci1zcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgYSBsYXJnZSBHSUYgb3IgSlBFRyBpY29uIGltYWdlcwotdXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEgR1VJIHRvb2wuCi0KLVVzZWQgaW46IGFwcGxpY2F0aW9uLWNsaWVudAotLS0+Ci08IUVMRU1FTlQgaWNvbiAoc21hbGwtaWNvbj8sIGxhcmdlLWljb24/KT4KLQotPCEtLQotVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLWNvbnRhaW5pbmcgYSBsYXJnZSAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MKLWphciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPGxhcmdlLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgotLS0+Ci08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UKLWJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItcmVmCi0KLUV4YW1wbGU6Ci0KLTxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotLS0+Ci08IUVMRU1FTlQgcmVtb3RlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBjb2RlIHNpZ25zCi1vbiBwcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvciB3aGV0aGVyIHRoZSBDb250YWluZXIKLXdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4gSW4gdGhlCi1sYXR0ZXIgY2FzZSwgdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlCi1EZXBsb3llci4KLQotVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0JPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLWF1dGggKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgbWFuYWdlcgotY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXNoYXJpbmctc2NvcGUgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucyBvYnRhaW5lZAotdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZQotc2hhcmVkLiBUaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50LCBpZiBzcGVjaWZpZWQsIG11c3QgYmUgb25lIG9mIHRoZQotdHdvIGZvbGxvd2luZzoKLQotCTxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotCTxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0KLVRoZSBkZWZhdWx0IHZhbHVlIGlzIFNoYXJlYWJsZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtc2hhcmluZy1zY29wZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YSBzb3VyY2UuIFRoZSB0eXBlCi1pcyBzcGVjaWZpZWQgYnkgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZQotZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGEgc291cmNlLgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLWVudi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi1yZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZQotaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbgotaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkKLXRoZSBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4KLQotVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0KLUV4YW1wbGU6Ci0KLTxyZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zL1N0b2NrUXVldWU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotPC9yZXNvdXJjZS1lbnYtcmVmPgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZiAoZGVzY3JpcHRpb24/LCByZXNvdXJjZS1lbnYtcmVmLW5hbWUsCi0JCXJlc291cmNlLWVudi1yZWYtdHlwZSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSByZXNvdXJjZQotZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi1qYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLVVzZWQgaW46IHJlc291cmNlLWVudi1yZWYKLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLWVudi1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgYSByZXNvdXJjZQotZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgSXQgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YQotbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiByZXNvdXJjZS1lbnYtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwKLXRoZSBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlCi1leHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGNvZGUsIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uCi0oQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlCi1zaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UgKFNoYXJlYWJsZSBvcgotVW5zaGFyZWFibGUpLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbi1jbGllbnQKLQotRXhhbXBsZToKLQotICAgIDxyZXNvdXJjZS1yZWY+Ci0JPHJlcy1yZWYtbmFtZT5qZGJjL0VtcGxveWVlQXBwREI8L3Jlcy1yZWYtbmFtZT4KLQk8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotCTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCTxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtcmVmIChkZXNjcmlwdGlvbj8sIHJlcy1yZWYtbmFtZSwgcmVzLXR5cGUsIHJlcy1hdXRoLAotCQlyZXMtc2hhcmluZy1zY29wZT8pPgotCi08IS0tCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQotbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncwotamFyIGZpbGUuCi0KLVRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotVXNlZCBpbjogaWNvbgotCi1FeGFtcGxlOgotCi08c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIElEIG1lY2hhbmlzbSBpcyB0byBhbGxvdyB0b29scyB0aGF0IHByb2R1Y2UgYWRkaXRpb25hbCBkZXBsb3ltZW50Ci1pbmZvcm1hdGlvbiAoaS5lLiwgaW5mb3JtYXRpb24gYmV5b25kIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGluZm9ybWF0aW9uKSB0byBzdG9yZSB0aGUgbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGluIGEKLXNlcGFyYXRlIGZpbGUsIGFuZCBlYXNpbHkgcmVmZXIgZnJvbSB0aGVzZSB0b29sLXNwZWNpZmljIGZpbGVzIHRvIHRoZQotaW5mb3JtYXRpb24gaW4gdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotVG9vbHMgYXJlIG5vdCBhbGxvd2VkIHRvIGFkZCB0aGUgbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGludG8gdGhlCi1zdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0tLT4KLQotPCFBVFRMSVNUIGFwcGxpY2F0aW9uLWNsaWVudCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjYWxsYmFjay1oYW5kbGVyIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRpc3BsYXktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbGluayBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBob21lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW1vdGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLWF1dGggaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1zaGFyaW5nLXNjb3BlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzg4OTcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjEuNCI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2RzCTEuMTcgMDIvMTEvMDMKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotICAgICAgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgMS40Ci0JZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0Ci0JYmUgbmFtZWQgIk1FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiIGluIHRoZQotCWFwcGxpY2F0aW9uIGNsaWVudCdzIGphciBmaWxlLiAgQWxsIGFwcGxpY2F0aW9uIGNsaWVudAotCWRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZSB0aGUgYXBwbGljYXRpb24KLQljbGllbnQgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKMkVFIG5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotCWFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8YXBwbGljYXRpb24tY2xpZW50IHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0JCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QiCi0JICAgICAgdmVyc2lvbj0iMS40Ij4KLQkgICAgICAuLi4KLQkgICAgPC9hcHBsaWNhdGlvbi1jbGllbnQ+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLQl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLQlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1jbGllbnQiIHR5cGU9ImoyZWU6YXBwbGljYXRpb24tY2xpZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFwcGxpY2F0aW9uLWNsaWVudCBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYW4KLQlhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uCi0JY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvciBkZXNjcmliZXMgdGhlIEVKQiBjb21wb25lbnRzCi0JYW5kIGV4dGVybmFsIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoZSBhcHBsaWNhdGlvbgotCWNsaWVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbgotCSAgYXBwbGljYXRpb24gY2xpZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QKLQkgIGJlIHVuaXF1ZSB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGFwcGxpY2F0aW9uCi0JICBjbGllbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLQkgIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuVGhlIG5hbWUKLQkgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXMtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotCSAgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLQkgIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgYXBwbGljYXRpb24gY2xpZW50Ci0JICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZQotCSAgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlCi0JICBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLQkgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlCi0JICB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFwcGxpY2F0aW9uLWNsaWVudFR5cGUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotCQkgICB0eXBlPSJqMmVlOmVudi1lbnRyeVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotCQkgICB0eXBlPSJqMmVlOmVqYi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpzZXJ2aWNlLXJlZkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtcmVmIgotCQkgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotCQkgICB0eXBlPSJqMmVlOnJlc291cmNlLWVudi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FsbGJhY2staGFuZGxlciIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY2FsbGJhY2staGFuZGxlciBlbGVtZW50IG5hbWVzIGEgY2xhc3MgcHJvdmlkZWQgYnkKLQkgICAgdGhlIGFwcGxpY2F0aW9uLiAgVGhlIGNsYXNzIG11c3QgaGF2ZSBhIG5vIGFyZ3MKLQkgICAgY29uc3RydWN0b3IgYW5kIG11c3QgaW1wbGVtZW50IHRoZQotCSAgICBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlcgotCSAgICBpbnRlcmZhY2UuICBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlCi0JICAgIGFwcGxpY2F0aW9uIGNsaWVudCBjb250YWluZXIgYW5kIHVzZWQgYnkgdGhlIGNvbnRhaW5lcgotCSAgICB0byBjb2xsZWN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjEuNCIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDEuNC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MDgyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iNSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpYXBwbGljYXRpb24tY2xpZW50XzUueHNkcwkxLjI2IDAyLzE3LzA2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCA1Ci0JZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0Ci0JYmUgbmFtZWQgIk1FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiIGluIHRoZQotCWFwcGxpY2F0aW9uIGNsaWVudCdzIGphciBmaWxlLiAgQWxsIGFwcGxpY2F0aW9uIGNsaWVudAotCWRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZSB0aGUgYXBwbGljYXRpb24KLQljbGllbnQgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFIG5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotCi0JYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDxhcHBsaWNhdGlvbi1jbGllbnQgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0JCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2QiCi0JICAgICAgdmVyc2lvbj0iNSI+Ci0JICAgICAgLi4uCi0JICAgIDwvYXBwbGljYXRpb24tY2xpZW50PgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0JdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQotCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzUueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNS54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uLWNsaWVudCIgdHlwZT0iamF2YWVlOmFwcGxpY2F0aW9uLWNsaWVudFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhcHBsaWNhdGlvbi1jbGllbnQgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuCi0JYXBwbGljYXRpb24gY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBhcHBsaWNhdGlvbgotCWNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cwotCWFuZCBleHRlcm5hbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24KLQljbGllbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4KLQkgIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0Ci0JICBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVudi1lbnRyeSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVudi1lbnRyeS1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgYXBwbGljYXRpb24KLQkgIGNsaWVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotCSAgYXBwbGljYXRpb24gY2xpZW50LgotCi0JICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuVGhlIG5hbWUKLQkgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLQkgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0JICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudAotCSAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgYXBwbGljYXRpb24gY2xpZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlCi0JICBuYW1lIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUKLQkgIGFwcGxpY2F0aW9uIGNsaWVudCBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUKLQkgIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFwcGxpY2F0aW9uLWNsaWVudFR5cGUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCi0JCSAgIHR5cGU9ImphdmFlZTplbnYtZW50cnlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnNlcnZpY2UtcmVmR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpyZXNvdXJjZS1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOnJlc291cmNlLWVudi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOnBlcnNpc3RlbmNlLXVuaXQtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtY29uc3RydWN0IgotCQkgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1kZXN0cm95IgotCQkgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhbGxiYWNrLWhhbmRsZXIiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY2FsbGJhY2staGFuZGxlciBlbGVtZW50IG5hbWVzIGEgY2xhc3MgcHJvdmlkZWQgYnkKLQkgICAgdGhlIGFwcGxpY2F0aW9uLiAgVGhlIGNsYXNzIG11c3QgaGF2ZSBhIG5vIGFyZ3MKLQkgICAgY29uc3RydWN0b3IgYW5kIG11c3QgaW1wbGVtZW50IHRoZQotCSAgICBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlcgotCSAgICBpbnRlcmZhY2UuICBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlCi0JICAgIGFwcGxpY2F0aW9uIGNsaWVudCBjb250YWluZXIgYW5kIHVzZWQgYnkgdGhlIGNvbnRhaW5lcgotCSAgICB0byBjb2xsZWN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSI1IgotCQkgICB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgNS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgZGVmaW5lcyB3aGV0aGVyIHRoaXMKLQkgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgb3RoZXIgcmVsYXRlZCBkZXBsb3ltZW50Ci0JICBkZXNjcmlwdG9ycyBmb3IgdGhpcyBtb2R1bGUgKGUuZy4sIHdlYiBzZXJ2aWNlCi0JICBkZXNjcmlwdG9ycykgYXJlIGNvbXBsZXRlLCBvciB3aGV0aGVyIHRoZSBjbGFzcwotCSAgZmlsZXMgYXZhaWxhYmxlIHRvIHRoaXMgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoCi0JICB0aGlzIGFwcGxpY2F0aW9uIHNob3VsZCBiZSBleGFtaW5lZCBmb3IgYW5ub3RhdGlvbnMKLQkgIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50IGluZm9ybWF0aW9uLgotCi0JICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBzZXQgdG8gInRydWUiLCB0aGUgZGVwbG95bWVudAotCSAgdG9vbCBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQKLQkgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcwotCSAgb2YgdGhlIGFwcGxpY2F0aW9uLgotCi0JICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0bwotCSAgImZhbHNlIiwgdGhlIGRlcGxveW1lbnQgdG9vbCBtdXN0IGV4YW1pbmUgdGhlIGNsYXNzCi0JICBmaWxlcyBvZiB0aGUgYXBwbGljYXRpb24gZm9yIGFubm90YXRpb25zLCBhcwotCSAgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucy4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF82LnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzYueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YThlNWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzYueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICAgdmVyc2lvbj0iNiI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gICAgICAKLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotICAgICAgCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICAgICAgCi0gICAgICBDb250cmlidXRvcihzKToKLSAgICAgIAotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVtbCi0gICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgYXBwbGljYXRpb24gY2xpZW50IDYKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdAotICAgICAgYmUgbmFtZWQgIk1FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiIGluIHRoZQotICAgICAgYXBwbGljYXRpb24gY2xpZW50J3MgamFyIGZpbGUuICBBbGwgYXBwbGljYXRpb24gY2xpZW50Ci0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgICBjbGllbnQgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFIG5hbWVzcGFjZToKLSAgICAgIAotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0gICAgICAKLSAgICAgIGFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0gICAgICB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotICAgICAgCi0gICAgICA8YXBwbGljYXRpb24tY2xpZW50IHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgCi0gICAgICAJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF82LnhzZCIKLSAgICAgIHZlcnNpb249IjYiPgotICAgICAgLi4uCi0gICAgICA8L2FwcGxpY2F0aW9uLWNsaWVudD4KLSAgICAgIAotICAgICAgVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0gICAgICB0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKYXZhIEVFCi0gICAgICBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotICAgICAgCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzYueHNkCi0gICAgICAKLSAgICAgIF1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotICAgICAgCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gICAgICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gICAgICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gICAgICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICAgICAgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLSAgICAgIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICAgICAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzYueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1jbGllbnQiCi0gICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXBwbGljYXRpb24tY2xpZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhcHBsaWNhdGlvbi1jbGllbnQgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuCi0gICAgICAgIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBUaGUgYXBwbGljYXRpb24KLSAgICAgICAgY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvciBkZXNjcmliZXMgdGhlIEVKQiBjb21wb25lbnRzCi0gICAgICAgIGFuZCBleHRlcm5hbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24KLSAgICAgICAgY2xpZW50LgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4KLSAgICAgICAgICBhcHBsaWNhdGlvbiBjbGllbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QKLSAgICAgICAgICBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5Ii8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0gICAgICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgYXBwbGljYXRpb24KLSAgICAgICAgICBjbGllbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCi0gICAgICAgICAgYXBwbGljYXRpb24gY2xpZW50LgotICAgICAgICAgIAotICAgICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJyZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS5UaGUgbmFtZQotICAgICAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0gICAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLSAgICAgICAgICBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZQotICAgICAgICAgIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgYXBwbGljYXRpb24gY2xpZW50Ci0gICAgICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLSAgICAgICAgICBhcHBsaWNhdGlvbiBjbGllbnQuCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZQotICAgICAgICAgIG5hbWUgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0gICAgICAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUKLSAgICAgICAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLSAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZQotICAgICAgICAgIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBsaWNhdGlvbi1jbGllbnRUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1vZHVsZS1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVudi1lbnRyeVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnNlcnZpY2UtcmVmR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJlc291cmNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGVyc2lzdGVuY2UtdW5pdC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtY29uc3RydWN0IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsaWZlY3ljbGUtY2FsbGJhY2tUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1kZXN0cm95IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsaWZlY3ljbGUtY2FsbGJhY2tUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhbGxiYWNrLWhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGNhbGxiYWNrLWhhbmRsZXIgZWxlbWVudCBuYW1lcyBhIGNsYXNzIHByb3ZpZGVkIGJ5Ci0gICAgICAgICAgICB0aGUgYXBwbGljYXRpb24uICBUaGUgY2xhc3MgbXVzdCBoYXZlIGEgbm8gYXJncwotICAgICAgICAgICAgY29uc3RydWN0b3IgYW5kIG11c3QgaW1wbGVtZW50IHRoZQotICAgICAgICAgICAgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIKLSAgICAgICAgICAgIGludGVyZmFjZS4gIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCBieSB0aGUKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNsaWVudCBjb250YWluZXIgYW5kIHVzZWQgYnkgdGhlIGNvbnRhaW5lcgotICAgICAgICAgICAgdG8gY29sbGVjdCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1c2VyLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YS1zb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRhdGEtc291cmNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXdleS12ZXJzaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBmaXhlZD0iNiIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyA2LgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGRlZmluZXMgd2hldGhlciB0aGlzCi0gICAgICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCBvdGhlciByZWxhdGVkIGRlcGxveW1lbnQKLSAgICAgICAgICBkZXNjcmlwdG9ycyBmb3IgdGhpcyBtb2R1bGUgKGUuZy4sIHdlYiBzZXJ2aWNlCi0gICAgICAgICAgZGVzY3JpcHRvcnMpIGFyZSBjb21wbGV0ZSwgb3Igd2hldGhlciB0aGUgY2xhc3MKLSAgICAgICAgICBmaWxlcyBhdmFpbGFibGUgdG8gdGhpcyBtb2R1bGUgYW5kIHBhY2thZ2VkIHdpdGgKLSAgICAgICAgICB0aGlzIGFwcGxpY2F0aW9uIHNob3VsZCBiZSBleGFtaW5lZCBmb3IgYW5ub3RhdGlvbnMKLSAgICAgICAgICB0aGF0IHNwZWNpZnkgZGVwbG95bWVudCBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBzZXQgdG8gInRydWUiLCB0aGUgZGVwbG95bWVudAotICAgICAgICAgIHRvb2wgbXVzdCBpZ25vcmUgYW55IGFubm90YXRpb25zIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50Ci0gICAgICAgICAgaW5mb3JtYXRpb24sIHdoaWNoIG1pZ2h0IGJlIHByZXNlbnQgaW4gdGhlIGNsYXNzIGZpbGVzCi0gICAgICAgICAgb2YgdGhlIGFwcGxpY2F0aW9uLgotICAgICAgICAgIAotICAgICAgICAgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgc2V0IHRvCi0gICAgICAgICAgImZhbHNlIiwgdGhlIGRlcGxveW1lbnQgdG9vbCBtdXN0IGV4YW1pbmUgdGhlIGNsYXNzCi0gICAgICAgICAgZmlsZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBhbm5vdGF0aW9ucywgYXMKLSAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIHNwZWNpZmljYXRpb25zLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzFfMi5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzFfMi5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTczNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzIuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENBICA5NDMwMywgVS5TLkEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotVGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50IGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgYW5kIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyBpdHMgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIE5vIHBhcnQgb2YgdGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50YXRpb24gbWF5IGJlCi1yZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgotb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuICAKLQotVGhpcmQgcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZCAKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4gCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBMb2dvLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhIAotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCBKREJDLCBKREssIEphdmFNYWlsIGFuZCBFbnRlcnByaXNlIEphdmFCZWFucywgCi1hcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jIGluIHRoZSBVLlMuIAotYW5kIG90aGVyIGNvdW50cmllcy4KLQotQWxsIFNQQVJDIHRyYWRlbWFya3MgYXJlIHVzZWQgdW5kZXIgbGljZW5zZSBhbmQgYXJlIHRyYWRlbWFya3MKLW9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTUEFSQyBJbnRlcm5hdGlvbmFsLCBJbmMuCi1pbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLiBQcm9kdWN0cyBiZWFyaW5nIFNQQVJDCi10cmFkZW1hcmtzIGFyZSBiYXNlZCB1cG9uIGFuIGFyY2hpdGVjdHVyZSBkZXZlbG9wZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAKLQotUG9zdFNjcmlwdCBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMsIEluYy4gCi0KLSAKLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvIAotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotCi0gCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWQotSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRSBPUiBOT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUCi1UTyBUSEUgRVhURU5UIFRIQVQgU1VDSCBESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZCi1JTlZBTElELgotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCAKLTkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBICA5NDMwMywgRXRhdHMtVW5pcy4gCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotIAotCi1DZSBwcm9kdWl0IG91IGRvY3VtZW50IGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldCBkaXN0cmlidWUnIGF2ZWMgCi1kZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEgZGlzdHJpYnV0aW9uLAotZXQgbGEgZGUnY29tcGlsYXRpb24uICBBdWN1bmUgcGFydGllIGRlIGNlIHByb2R1aXQgb3UgZGUgc2EgZG9jdW1lbnRhdGlvbgotYXNzb2NpZSdlIG5lIHBldXQgZV50cmUgcmVwcm9kdWl0ZSBzb3VzIGF1Y3VuZSBmb3JtZSwgcGFyIHF1ZWxxdWUgbW95ZW4gCi1xdWUgY2Ugc29pdCwgc2FucyBsJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcyAKLWJhaWxsZXVycyBkZSBsaWNlbmNlLCBzJ2lsIHkgZW4gYS4gIAotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZSAKLXJlbGF0aXZlIGF1eCBwb2xpY2VzIGRlIGNhcmFjdGVgcmVzLCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgCi1ldCBsaWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotIAotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCBsZSBsb2dvIFN1biwgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCwgZXQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsICAKLXNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTdW4gCi1NaWNyb3N5c3RlbXMsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgZGFucyBkJ2F1dHJlcyBwYXlzLgotIAotVG91dGVzIGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQgdXRpbGlzZSdlcyBzb3VzIGxpY2VuY2UgZXQgc29udAotZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTUEFSQwotSW50ZXJuYXRpb25hbCwgSW5jLiBhdXggRXRhdHMtVW5pcyBldCAgZGFucwotZCdhdXRyZXMgcGF5cy4gTGVzIHByb2R1aXRzIHBvcnRhbnQgbGVzIG1hcnF1ZXMgU1BBUkMgc29udAotYmFzZSdzIHN1ciB1bmUgYXJjaGl0ZWN0dXJlIGRlJ3ZlbG9wcGUnZSBwYXIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgCi0KLVBvc3RjcmlwdCBlc3QgdW5lIG1hcnF1ZSBlbnJlZ2lzdHJlJ2UgZCdBZG9iZSBTeXN0ZW1zIEluYy4gCi0gCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0VUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQgRVhDTFVFUywKLURBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUyBOT1RBTU1FTlQKLVRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBIEwnQVBUSVRVREUKLUEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERSBDT05UUkVGQUNPTi4KLS0tPgotCi08IS0tCi1UaGUgYWx0LWRkIGVsZW1lbnQgc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgZm9yIGEgcGFydGljdWxhciBKMkVFIG1vZHVsZS4gVGhlIFVSSSBtdXN0IHNwZWNpZnkKLXRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUKLWFwcGxpY2F0aW9uJ3Mgcm9vdCBkaXJlY3RvcnkuIElmIGFsdC1kZCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVwbG95ZXIgbXVzdCByZWFkCi10aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20gdGhlIGRlZmF1bHQgbG9jYXRpb24gYW5kIGZpbGUgbmFtZSByZXF1aXJlZCBieQotdGhlIHJlc3BlY3RpdmUgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi0tLT4KLTwhRUxFTUVOVCBhbHQtZGQgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSjJFRSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLgotLS0+Ci08IUVMRU1FTlQgYXBwbGljYXRpb24gKGljb24/LCBkaXNwbGF5LW5hbWUsIGRlc2NyaXB0aW9uPywgbW9kdWxlKywKLXNlY3VyaXR5LXJvbGUqKT4KLQotPCEtLQotVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IHNwZWNpZmllcyB0aGUgY29udGV4dCByb290IG9mIGEgd2ViIGFwcGxpY2F0aW9uCi0tLT4KLTwhRUxFTUVOVCBjb250ZXh0LXJvb3QgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGVzY3JpcHRpb24gZWxlbWVudCBwcm92aWRlcyBhIGh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotYXBwbGljYXRpb24uIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZQotYXBwbGljYXRpb24gYXNzZW1ibGVyIHdhbnRzIHRvIHByb3ZpZGUgdGhlIGRlcGxveWVyLgotLS0+Ci08IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGFuIGFwcGxpY2F0aW9uIG5hbWUuCi1UaGUgYXBwbGljYXRpb24gbmFtZSBpcyBhc3NpZ25lZCB0byB0aGUgYXBwbGljYXRpb24gYnkgdGhlIGFwcGxpY2F0aW9uIGFzc2VtYmxlcgotYW5kIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBkZXBsb3llciBhdCBkZXBsb3ltZW50IHRpbWUuCi0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBlamItamFyLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZQotYXBwbGljYXRpb24gcGFja2FnZS4KLS0tPgotPCFFTEVNRU5UIGVqYiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBpY29uIGVsZW1lbnQgY29udGFpbnMgYSBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnQgd2hpY2ggc3BlY2lmeSB0aGUKLVVSSXMgZm9yIGEgc21hbGwgYW5kIGEgbGFyZ2UgR0lGIG9yIEpQRUcgaWNvbiBpbWFnZSB0byByZXByZXNlbnQgdGhlIGFwcGxpY2F0aW9uCi1pbiBhIEdVSS4KLS0tPgotPCFFTEVNRU5UIGljb24gKHNtYWxsLWljb24/LCBsYXJnZS1pY29uPyk+Ci0KLTwhLS0KLVRoZSBqYXZhIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBqYXZhIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUsIHJlbGF0aXZlCi10byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotLS0+Ci08IUVMRU1FTlQgamF2YSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgZm9yIGEgbGFyZ2UgR0lGIG9yIEpQRUcgaWNvbiBpbWFnZSB0bwotcmVwcmVzZW50IHRoZSBhcHBsaWNhdGlvbiBpbiBhIEdVSS4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbW9kdWxlIGVsZW1lbnQgcmVwcmVzZW50cyBhIHNpbmdsZSBKMkVFIG1vZHVsZSBhbmQgY29udGFpbnMgYW4gZWpiLCBqYXZhLCBvcgotd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUgbW9kdWxlIHR5cGUgYW5kIGNvbnRhaW5zIGEgcGF0aCB0byB0aGUgbW9kdWxlCi1maWxlLCBhbmQgYW4gb3B0aW9uYWwgYWx0LWRkIGVsZW1lbnQsIHdoaWNoIHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlCi1wb3N0LWFzc2VtYmx5IHZlcnNpb24gb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLVRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBoYXZlIG9uZSBtb2R1bGUgZWxlbWVudCBmb3IgZWFjaCBKMkVFCi1tb2R1bGUgaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0tLT4KLTwhRUxFTUVOVCBtb2R1bGUgKChlamIgfCBqYXZhIHwgd2ViKSwgYWx0LWRkPyk+Ci0KLTwhLS0KLVRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0tLT4KLTwhRUxFTUVOVCByb2xlLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2VjdXJpdHktcm9sZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkgcm9sZSB3aGljaCBpcwotZ2xvYmFsIHRvIHRoZSBhcHBsaWNhdGlvbi4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYSBkZXNjcmlwdGlvbiBvZiB0aGUKLXNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLiBUaGUgZGVzY3JpcHRpb25zIGF0IHRoaXMgbGV2ZWwKLW92ZXJyaWRlIHRob3NlIGluIHRoZSBjb21wb25lbnQgbGV2ZWwgc2VjdXJpdHktcm9sZSBkZWZpbml0aW9ucyBhbmQgbXVzdCBiZSB0aGUKLWRlc2NyaXB0aW9ucyB0b29sIGRpc3BsYXkgdG8gdGhlIGRlcGxveWVyLgotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktcm9sZSAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgotCi08IS0tCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIGZvciBhIHNtYWxsIEdJRiBvciBKUEVHIGljb24gaW1hZ2UgdG8KLXJlcHJlc2VudCB0aGUgYXBwbGljYXRpb24gaW4gYSBHVUkuCi0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHdlYiBlbGVtZW50IGNvbnRhaW5zIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YgYSB3ZWIgYXBwbGljYXRpb24KLW1vZHVsZS4KLS0tPgotPCFFTEVNRU5UIHdlYiAod2ViLXVyaSwgY29udGV4dC1yb290KT4KLQotPCEtLQotVGhlIHdlYi11cmkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHdlYiBhcHBsaWNhdGlvbiBmaWxlLCByZWxhdGl2ZSB0byB0aGUKLXRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLS0tPgotPCFFTEVNRU5UIHdlYi11cmkgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgSUQgbWVjaGFuaXNtIGlzIHRvIGFsbG93IHRvb2xzIHRvIGVhc2lseSBtYWtlIHRvb2wtc3BlY2lmaWMgcmVmZXJlbmNlcyB0bwotdGhlIGVsZW1lbnRzIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gLS0+Ci08IUFUVExJU1QgYWx0LWRkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGFwcGxpY2F0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnRleHQtcm9vdCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgamF2YSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsYXJnZS1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1vZHVsZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHdlYiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWItdXJpIGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzMuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzMuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmE0OWFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV8zLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi08IS0tCi1Db3B5cmlnaHQgKGMpIDIwMDAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwKLTkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgcmVsYXRpbmcgdG8KLXRlY2hub2xvZ3kgZW1ib2RpZWQgaW4gdGhlIHByb2R1Y3QgdGhhdCBpcyBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4KLUluIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMgbGlzdGVkIGF0Ci1odHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUgYWRkaXRpb25hbCBwYXRlbnRzIG9yCi1wZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlIFUuUy4gYW5kIGluIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHByb2R1Y3QgdG8gd2hpY2ggaXQgcGVydGFpbnMgYXJlIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiwgYW5kCi1kZWNvbXBpbGF0aW9uLiAgVGhpcyBkb2N1bWVudCBtYXkgYmUgcmVwcm9kdWNlZCBhbmQgZGlzdHJpYnV0ZWQgYnV0IG1heQotbm90IGJlIGNoYW5nZWQgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMKLWxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMgY29weXJpZ2h0ZWQgYW5kCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgIFN1biBNaWNyb3N5c3RlbXMsICB0aGUgU3VuIGxvZ28sICBKYXZhLCAgSmF2YVNlcnZlciBQYWdlcywgIEphdmEKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgIEpEQkMsICBKREssICBKYXZhTWFpbCBhbmQgIGFuZAotRW50ZXJwcmlzZSBKYXZhQmVhbnMgYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvCi1TdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWSBJTVBMSUVECi1XQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUgotTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVCBUTyBUSEUgRVhURU5UIFRIQVQgU1VDSAotRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWSBJTlZBTElELgotCi0KLV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotQ29weXJpZ2h0IChjKSAyMDAwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sCi05MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgRSd0YXRzLVVuaXMuCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGEgbGVzIGRyb2l0cyBkZSBwcm9wcmllJ3RlJyBpbnRlbGxlY3R1ZWxzCi1yZWxhdGFudHMgYWAgbGEgdGVjaG5vbG9naWUgaW5jb3Jwb3JlJ2UgZGFucyBsZSBwcm9kdWl0IHF1aSBlc3QgZGUnY3JpdAotZGFucyBjZSBkb2N1bWVudC4gRW4gcGFydGljdWxpZXIsIGV0IHNhbnMgbGEgbGltaXRhdGlvbiwgY2VzIGRyb2l0cyBkZQotcHJvcHJpZSd0ZScgaW50ZWxsZWN0dWVscyBwZXV2ZW50IGluY2x1cmUgdW4gb3UgcGx1cyBkZXMgYnJldmV0cwotYW1lJ3JpY2FpbnMgZSdudW1lJ3JlJ3MgYWAgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgZXQgdW4gb3UgbGVzCi1icmV2ZXRzIHBsdXMgc3VwcGxlJ21lbnRhaXJlcyBvdSBsZXMgYXBwbGljYXRpb25zIGRlIGJyZXZldCBlbiBhdHRlbnRlCi1kYW5zIGxlcyBFJ3RhdHMtVW5pcyBldCBkYW5zIGxlcyBhdXRyZXMgcGF5cy4KLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJwotYXZlYyBkZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEKLWRpc3RyaWJ1dGlvbiwgZXQgbGEgZGUnY29tcGlsYXRpb24uICBDZSBkb2N1bWVudGlvbiBhc3NvY2llIG4gcGV1dAotZV50cmUgcmVwcm9kdWl0ZSBldCBkaXN0cmlidWVyLCBwYXIgcXVlbHF1ZSBtb3llbiBxdWUgY2Ugc29pdCwgc2FucwotbCdhdXRvcmlzYXRpb24gcHJlJ2FsYWJsZSBldCBlJ2NyaXRlIGRlIFN1biBldCBkZSBzZXMgYmFpbGxldXJzIGRlCi1saWNlbmNlLCBsZSBjYXMgZSdjaGUnYW50LgotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZQotcmVsYXRpdmUgYXV4IHBvbGljZXMgZGUgY2FyYWN0ZWByZXMsIGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldAotbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLQotU3VuLCAgU3VuIE1pY3Jvc3lzdGVtcywgIGxlIGxvZ28gU3VuLCAgSmF2YSwgIEphdmFTZXJ2ZXIgUGFnZXMsICBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsICBKREJDLCAgSkRLLCAgSmF2YU1haWwgZXQgIGFuZAotRW50ZXJwcmlzZSBKYXZhQmVhbnMgc29udCBkZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcwotZGUncG9zZSdlcyBkZSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFJ3RhdHMtVW5pcyBldCBkYW5zIGQnYXV0cmVzCi1wYXlzLgotCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0UnVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsCi1ERUNMQVJBVElPTlMgRVQgR0FSQU5USUVTIEVYUFJFU1NFUyBPVSBUQUNJVEVTIFNPTlQgRk9STUVMTEVNRU5UCi1FWENMVUVTLCBEQU5TIExBIE1FU1VSRSBBVVRPUklTRUUgUEFSIExBIExPSSBBUFBMSUNBQkxFLCBZIENPTVBSSVMKLU5PVEFNTUVOVCBUT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQQotTCdBUFRJVFVERSBBIFVORSBVVElMSVNBVElPTiBQQVJUSUNVTElFUkUgT1UgQSBMJ0FCU0VOQ0UgREUKLUNPTlRSRUZBQyxPTi4KLS0tPgotCi08IS0tCi1UaGlzIGlzIHRoZSBYTUwgRFREIGZvciB0aGUgSjJFRSAxLjMgYXBwbGljYXRpb24gZGVwbG95bWVudAotZGVzY3JpcHRvci4gIEFsbCBKMkVFIDEuMyBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCi1tdXN0IGluY2x1ZGUgYSBET0NUWVBFIG9mIHRoZSBmb2xsb3dpbmcgZm9ybToKLQotICA8IURPQ1RZUEUgYXBwbGljYXRpb24gUFVCTElDCi0JIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMy8vRU4iCi0JImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiPgotCi0tLT4KLQotPCEtLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgY29udGFpbiBQQ0RBVEEsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKLSAgaW4gdGhlIGRhdGEgbWF5IGJlIGlnbm9yZWQuCi0KLS0gSW4gZWxlbWVudHMgd2hvc2UgdmFsdWUgaXMgYW4gImVudW1lcmF0ZWQgdHlwZSIsIHRoZSB2YWx1ZSBpcwotICBjYXNlIHNlbnNpdGl2ZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZSBzYW1lCi0gIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdCBzdGFydGluZyB3aXRoICIvIikKLSAgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLgotICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkKLSAgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBzZXJ2bGV0IEFQSS4KLS0tPgotCi0KLTwhLS0KLVRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBKMkVFIGFwcGxpY2F0aW9uCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0tLT4KLTwhRUxFTUVOVCBhcHBsaWNhdGlvbiAoaWNvbj8sIGRpc3BsYXktbmFtZSwgZGVzY3JpcHRpb24/LCBtb2R1bGUrLAotCQlzZWN1cml0eS1yb2xlKik+Ci0KLTwhLS0KLVRoZSBhbHQtZGQgZWxlbWVudCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvIHRoZSBwb3N0LWFzc2VtYmx5Ci12ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIEoyRUUgbW9kdWxlLgotVGhlIFVSSSBtdXN0IHNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotZmlsZSByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24ncyByb290IGRpcmVjdG9yeS4gSWYgYWx0LWRkIGlzIG5vdAotc3BlY2lmaWVkLCB0aGUgZGVwbG95ZXIgbXVzdCByZWFkIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZnJvbSB0aGUKLWRlZmF1bHQgbG9jYXRpb24gYW5kIGZpbGUgbmFtZSByZXF1aXJlZCBieSB0aGUgcmVzcGVjdGl2ZSBjb21wb25lbnQKLXNwZWNpZmljYXRpb24uCi0KLVVzZWQgaW46IG1vZHVsZQotLS0+Ci08IUVMRU1FTlQgYWx0LWRkICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGNvbm5lY3RvciBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgcmVzb3VyY2UgYWRhcHRlciBhcmNoaXZlCi1maWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi1Vc2VkIGluOiBtb2R1bGUKLS0tPgotPCFFTEVNRU5UIGNvbm5lY3RvciAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNvbnRleHQgcm9vdCBvZiBhIHdlYgotYXBwbGljYXRpb24uCi0KLVVzZWQgaW46IHdlYgotLS0+Ci08IUVMRU1FTlQgY29udGV4dC1yb290ICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50Ci1lbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQKLXRoZSBhcHBsaWNhdGlvbiBlYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotdGhlIGFwcGxpY2F0aW9uIGVhciBmaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scwotdXNlZCBieSB0aGUgYXBwbGljYXRpb24gZWFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbgotd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLQotVXNlZCBpbjogYXBwbGljYXRpb24sIHNlY3VyaXR5LXJvbGUKLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi1kaXNwbGF5ZWQgYnkgdG9vbHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotVXNlZCBpbjogYXBwbGljYXRpb24KLQotRXhhbXBsZToKLQotPGRpc3BsYXktbmFtZT5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamIgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhbiBlamItamFyLCByZWxhdGl2ZSB0byB0aGUgdG9wCi1sZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLQotVXNlZCBpbjogbW9kdWxlCi0tLT4KLTwhRUxFTUVOVCBlamIgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaWNvbiBlbGVtZW50IGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMgdGhhdAotc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGEgbGFyZ2UgR0lGIG9yIEpQRUcgaWNvbiBpbWFnZXMKLXVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhIEdVSSB0b29sLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbgotLS0+Ci08IUVMRU1FTlQgaWNvbiAoc21hbGwtaWNvbj8sIGxhcmdlLWljb24/KT4KLQotPCEtLQotVGhlIGphdmEgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGphdmEgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSwKLXJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLVVzZWQgaW46IG1vZHVsZQotLS0+Ci08IUVMRU1FTlQgamF2YSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi1jb250YWluaW5nIGEgbGFyZ2UgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi1uYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uJ3MKLWVhciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPGxhcmdlLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgotLS0+Ci08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBtb2R1bGUgZWxlbWVudCByZXByZXNlbnRzIGEgc2luZ2xlIEoyRUUgbW9kdWxlIGFuZCBjb250YWlucyBhCi1jb25uZWN0b3IsIGVqYiwgamF2YSwgb3Igd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUgbW9kdWxlIHR5cGUKLWFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4gb3B0aW9uYWwgYWx0LWRkIGVsZW1lbnQsCi13aGljaCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvIHRoZSBwb3N0LWFzc2VtYmx5IHZlcnNpb24gb2YgdGhlCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLVRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBoYXZlIG9uZSBtb2R1bGUgZWxlbWVudCBmb3IKLWVhY2ggSjJFRSBtb2R1bGUgaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLVVzZWQgaW46IGFwcGxpY2F0aW9uCi0tLT4KLTwhRUxFTUVOVCBtb2R1bGUgKChjb25uZWN0b3IgfCBlamIgfCBqYXZhIHwgd2ViKSwgYWx0LWRkPyk+Ci0KLTwhLS0KLVRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4KLQotVXNlZCBpbjogc2VjdXJpdHktcm9sZQotLS0+Ci08IUVMRU1FTlQgcm9sZS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5Ci1yb2xlLiBUaGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUKLXNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbgotCi1FeGFtcGxlOgotCi0gICAgPHNlY3VyaXR5LXJvbGU+Ci0JPGRlc2NyaXB0aW9uPgotCSAgICBUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8gYXJlIGF1dGhvcml6ZWQKLQkgICAgdG8gYWNjZXNzIHRoZSBlbXBsb3llZSBzZXJ2aWNlIGFwcGxpY2F0aW9uLgotCTwvZGVzY3JpcHRpb24+Ci0JPHJvbGUtbmFtZT5lbXBsb3llZTwvcm9sZS1uYW1lPgotICAgIDwvc2VjdXJpdHktcm9sZT4KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKT4KLQotPCEtLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLWNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgYXBwbGljYXRpb24ncwotZWFyIGZpbGUuCi0KLVRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotVXNlZCBpbjogaWNvbgotCi1FeGFtcGxlOgotCi08c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHdlYiBlbGVtZW50IGNvbnRhaW5zIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YgYSB3ZWIKLWFwcGxpY2F0aW9uIG1vZHVsZS4KLQotVXNlZCBpbjogbW9kdWxlCi0tLT4KLTwhRUxFTUVOVCB3ZWIgKHdlYi11cmksIGNvbnRleHQtcm9vdCk+Ci0KLTwhLS0KLVRoZSB3ZWItdXJpIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSB3ZWIgYXBwbGljYXRpb24gZmlsZSwKLXJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLVVzZWQgaW46IHdlYgotLS0+Ci08IUVMRU1FTlQgd2ViLXVyaSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdGhhdCBwcm9kdWNlIGFkZGl0aW9uYWwgZGVwbG95bWVudAotaW5mb3JtYXRpb24gKGkuZS4sIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgc3RhbmRhcmQgZGVwbG95bWVudAotZGVzY3JpcHRvciBpbmZvcm1hdGlvbikgdG8gc3RvcmUgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhCi1zZXBhcmF0ZSBmaWxlLCBhbmQgZWFzaWx5IHJlZmVyIGZyb20gdGhlc2UgdG9vbC1zcGVjaWZpYyBmaWxlcyB0byB0aGUKLWluZm9ybWF0aW9uIGluIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLVRvb2xzIGFyZSBub3QgYWxsb3dlZCB0byBhZGQgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbnRvIHRoZQotc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci0KLTwhQVRUTElTVCBhbHQtZGQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXBwbGljYXRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29ubmVjdG9yIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnRleHQtcm9vdCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgamF2YSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsYXJnZS1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1vZHVsZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHdlYiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWItdXJpIGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzQueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDU4Y2ZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV80LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMS40Ij4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylhcHBsaWNhdGlvbl8xXzQueHNkcwkxLjEzIDAyLzExLzAzCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgYXBwbGljYXRpb24gMS40IGRlcGxveW1lbnQKLQlkZXNjcmlwdG9yLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkCi0JIk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCIgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgZWFyIGZpbGUuCi0JQWxsIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZQotCXRoZSBhcHBsaWNhdGlvbiBzY2hlbWEgYnkgdXNpbmcgdGhlIEoyRUUgbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCi0JYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDxhcHBsaWNhdGlvbiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiCi0JICAgICAgdmVyc2lvbj0iMS40Ij4KLQkgICAgICAuLi4KLQkgICAgPC9hcHBsaWNhdGlvbj4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEoyRUUKLQluYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24iIHR5cGU9ImoyZWU6YXBwbGljYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSjJFRQotCWFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iY29udGV4dC1yb290LXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZSB1bmlxdWUKLQkgIGluIHRoZSBlYXIuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bW9kdWxlL2oyZWU6d2ViIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmNvbnRleHQtcm9vdCIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlY3VyaXR5LXJvbGUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgc2VjdXJpdHktcm9sZS1uYW1lIGVsZW1lbnQgY29udGVudAotCSAgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGVhci4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpzZWN1cml0eS1yb2xlIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJvbGUtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICA8L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBsaWNhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhcHBsaWNhdGlvblR5cGUgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHRoZQotCWFwcGxpY2F0aW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1vZHVsZSIKLQkJICAgdHlwZT0iajJlZTptb2R1bGVUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBoYXZlIG9uZQotCSAgICBtb2R1bGUgZWxlbWVudCBmb3IgZWFjaCBKMkVFIG1vZHVsZSBpbiB0aGUKLQkgICAgYXBwbGljYXRpb24gcGFja2FnZS4gQSBtb2R1bGUgZWxlbWVudCBpcyBkZWZpbmVkCi0JICAgIGJ5IG1vZHVsZVR5cGUgZGVmaW5pdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlIgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjEuNCIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDEuNC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1vZHVsZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtb2R1bGVUeXBlIGRlZmluZXMgYSBzaW5nbGUgSjJFRSBtb2R1bGUgYW5kIGNvbnRhaW5zIGEKLQljb25uZWN0b3IsIGVqYiwgamF2YSwgb3Igd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUKLQltb2R1bGUgdHlwZSBhbmQgY29udGFpbnMgYSBwYXRoIHRvIHRoZSBtb2R1bGUgZmlsZSwgYW5kIGFuCi0Jb3B0aW9uYWwgYWx0LWRkIGVsZW1lbnQsIHdoaWNoIHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8KLQl0aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdG9yIgotCQkgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgY29ubmVjdG9yIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYQotCSAgICAgIHJlc291cmNlIGFkYXB0ZXIgYXJjaGl2ZSBmaWxlLCByZWxhdGl2ZSB0byB0aGUKLQkgICAgICB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZWpiIgotCQkgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYW4gZWpiLWphciwKLQkgICAgICByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbgotCSAgICAgIHBhY2thZ2UuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iamF2YSIKLQkJICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGphdmEgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGphdmEKLQkgICAgICBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wCi0JICAgICAgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0id2ViIgotCQkgICAgIHR5cGU9ImoyZWU6d2ViVHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFsdC1kZCIKLQkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlCi0JICAgIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICAgIGZpbGUgZm9yIGEgcGFydGljdWxhciBKMkVFIG1vZHVsZS4gIFRoZSBVUkkgbXVzdAotCSAgICBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50Ci0JICAgIGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24ncyByb290Ci0JICAgIGRpcmVjdG9yeS4gSWYgYWx0LWRkIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZXBsb3llcgotCSAgICBtdXN0IHJlYWQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBkZWZhdWx0Ci0JICAgIGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkgdGhlIHJlc3BlY3RpdmUKLQkgICAgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYlR5cGUgZGVmaW5lcyB0aGUgd2ViLXVyaSBhbmQgY29udGV4dC1yb290IG9mCi0JYSB3ZWIgYXBwbGljYXRpb24gbW9kdWxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItdXJpIgotCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdlYi11cmkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHdlYgotCSAgICBhcHBsaWNhdGlvbiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZQotCSAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRleHQtcm9vdCIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCi0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNvbnRleHQgcm9vdAotCSAgICBvZiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fNS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTA5NjYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjUiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWFwcGxpY2F0aW9uXzUueHNkcwkxLjE3IDA4LzA1LzA1Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIGFwcGxpY2F0aW9uIDUgZGVwbG95bWVudAotCWRlc2NyaXB0b3IuICBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQKLQkiTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIiBpbiB0aGUgYXBwbGljYXRpb24ncyBlYXIgZmlsZS4KLQlBbGwgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlCi0JdGhlIGFwcGxpY2F0aW9uIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQotCWFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8YXBwbGljYXRpb24geG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0JCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbl81LnhzZCIKLQkgICAgICB2ZXJzaW9uPSI1Ij4KLQkgICAgICAuLi4KLQkgICAgPC9hcHBsaWNhdGlvbj4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEphdmEgRUUKLQluYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzUueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNS54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24iIHR5cGU9ImphdmFlZTphcHBsaWNhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBKYXZhIEVFCi0JYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJjb250ZXh0LXJvb3QtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgY29udGV4dC1yb290IGVsZW1lbnQgY29udGVudCBtdXN0IGJlIHVuaXF1ZQotCSAgaW4gdGhlIGVhci4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1vZHVsZS9qYXZhZWU6d2ViIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6Y29udGV4dC1yb290Ii8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0ic2VjdXJpdHktcm9sZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBzZWN1cml0eS1yb2xlLW5hbWUgZWxlbWVudCBjb250ZW50Ci0JICBtdXN0IGJlIHVuaXF1ZSBpbiB0aGUgZWFyLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6c2VjdXJpdHktcm9sZSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJvbGUtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICA8L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBsaWNhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhcHBsaWNhdGlvblR5cGUgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHRoZQotCWFwcGxpY2F0aW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibW9kdWxlIgotCQkgICB0eXBlPSJqYXZhZWU6bW9kdWxlVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUKLQkgICAgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSmF2YSBFRSBtb2R1bGUgaW4gdGhlCi0JICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuIEEgbW9kdWxlIGVsZW1lbnQgaXMgZGVmaW5lZAotCSAgICBieSBtb2R1bGVUeXBlIGRlZmluaXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLQkJICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LXJvbGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlicmFyeS1kaXJlY3RvcnkiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbGlicmFyeS1kaXJlY3RvcnkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHBhdGhuYW1lCi0JICAgIG9mIGEgZGlyZWN0b3J5IHdpdGhpbiB0aGUgYXBwbGljYXRpb24gcGFja2FnZSwgcmVsYXRpdmUKLQkgICAgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4gIEFsbCBmaWxlcwotCSAgICBuYW1lZCAiKi5qYXIiIGluIHRoaXMgZGlyZWN0b3J5IG11c3QgYmUgbWFkZSBhdmFpbGFibGUKLQkgICAgaW4gdGhlIGNsYXNzIHBhdGggb2YgYWxsIGNvbXBvbmVudHMgaW5jbHVkZWQgaW4gdGhpcwotCSAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLiAgSWYgdGhpcyBlbGVtZW50IGlzbid0IHNwZWNpZmllZCwKLQkgICAgdGhlIGRpcmVjdG9yeSBuYW1lZCAibGliIiBpcyBzZWFyY2hlZC4gIEFuIGVtcHR5IGVsZW1lbnQKLQkgICAgbWF5IGJlIHVzZWQgdG8gZGlzYWJsZSBzZWFyY2hpbmcuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRld2V5LXZlcnNpb25UeXBlIgotCQkgICBmaXhlZD0iNSIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtb2R1bGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbW9kdWxlVHlwZSBkZWZpbmVzIGEgc2luZ2xlIEphdmEgRUUgbW9kdWxlIGFuZCBjb250YWlucyBhCi0JY29ubmVjdG9yLCBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlCi0JbW9kdWxlIHR5cGUgYW5kIGNvbnRhaW5zIGEgcGF0aCB0byB0aGUgbW9kdWxlIGZpbGUsIGFuZCBhbgotCW9wdGlvbmFsIGFsdC1kZCBlbGVtZW50LCB3aGljaCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvCi0JdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3RvciIKLQkJICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgY29ubmVjdG9yIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYQotCSAgICAgIHJlc291cmNlIGFkYXB0ZXIgYXJjaGl2ZSBmaWxlLCByZWxhdGl2ZSB0byB0aGUKLQkgICAgICB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZWpiIgotCQkgICAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamIgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhbiBlamItamFyLAotCSAgICAgIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uCi0JICAgICAgcGFja2FnZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJqYXZhIgotCQkgICAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBqYXZhIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBqYXZhCi0JICAgICAgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcAotCSAgICAgIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IndlYiIKLQkJICAgICB0eXBlPSJqYXZhZWU6d2ViVHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFsdC1kZCIKLQkJICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgYWx0LWRkIGVsZW1lbnQgc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUKLQkgICAgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgICAgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIEphdmEgRUUgbW9kdWxlLiAgVGhlIFVSSSBtdXN0Ci0JICAgIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGRlcGxveW1lbnQKLQkgICAgZGVzY3JpcHRvciBmaWxlIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbidzIHJvb3QKLQkgICAgZGlyZWN0b3J5LiBJZiBhbHQtZGQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlcGxveWVyCi0JICAgIG11c3QgcmVhZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20gdGhlIGRlZmF1bHQKLQkgICAgbG9jYXRpb24gYW5kIGZpbGUgbmFtZSByZXF1aXJlZCBieSB0aGUgcmVzcGVjdGl2ZQotCSAgICBjb21wb25lbnQgc3BlY2lmaWNhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd2ViVHlwZSBkZWZpbmVzIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YKLQlhIHdlYiBhcHBsaWNhdGlvbiBtb2R1bGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi11cmkiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3ZWItdXJpIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSB3ZWIKLQkgICAgYXBwbGljYXRpb24gZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUKLQkgICAgYXBwbGljYXRpb24gcGFja2FnZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250ZXh0LXJvb3QiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCi0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNvbnRleHQgcm9vdAotCSAgICBvZiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fNi54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzYueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjExMWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fNi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgICAgICAgICB2ZXJzaW9uPSI2Ij4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLSAgICAgIAotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgICAKLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbgotICAgICAgRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlCi0gICAgICAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgICB0aGUgTGljZW5zZS4gWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwgb3IKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLSAgICAgIExpY2Vuc2UuCi0gICAgICAKLSAgICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyCi0gICAgICBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gICAgICBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzCi0gICAgICBwcm92aWRlZCBieSBTdW4gaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZSBmaWxlCi0gICAgICB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4gIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nCi0gICAgICBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBbXQotICAgICAgcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgICAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0gICAgICAKLSAgICAgIENvbnRyaWJ1dG9yKHMpOgotICAgICAgCi0gICAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlCi0gICAgICBDRERMIG9yIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nCi0gICAgICAiW0NvbnRyaWJ1dG9yXSBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UKLSAgICAgIGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhIHJlY2lwaWVudCBoYXMgdGhlCi0gICAgICBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUKLSAgICAgIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8gaXRzCi0gICAgICBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIKLSAgICAgIGNvZGUgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZQotICAgICAgb3B0aW9uIGFwcGxpZXMgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2gKLSAgICAgIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0IGhvbGRlci4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBW1sKLSAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBhcHBsaWNhdGlvbiA2IGRlcGxveW1lbnQKLSAgICAgIGRlc2NyaXB0b3IuICBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQKLSAgICAgICJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiIGluIHRoZSBhcHBsaWNhdGlvbidzIGVhciBmaWxlLgotICAgICAgQWxsIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZQotICAgICAgdGhlIGFwcGxpY2F0aW9uIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0gICAgICAKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotICAgICAgCi0gICAgICBhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotICAgICAgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLSAgICAgIAotICAgICAgPGFwcGxpY2F0aW9uIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgCi0gICAgICAJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzYueHNkIgotICAgICAgdmVyc2lvbj0iNiI+Ci0gICAgICAuLi4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICAgICAKLSAgICAgIFRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotICAgICAgdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQotICAgICAgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLSAgICAgIAotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzYueHNkCi0gICAgICAKLSAgICAgIF1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotICAgICAgCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gICAgICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gICAgICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gICAgICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICAgICAgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLSAgICAgIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICAgICAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzYueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbiIKLSAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphcHBsaWNhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSmF2YSBFRQotICAgICAgICBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImNvbnRleHQtcm9vdC11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgICBpbiB0aGUgZWFyLiAKLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6bW9kdWxlL2phdmFlZTp3ZWIiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpjb250ZXh0LXJvb3QiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0ic2VjdXJpdHktcm9sZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIHNlY3VyaXR5LXJvbGUtbmFtZSBlbGVtZW50IGNvbnRlbnQKLSAgICAgICAgICBtdXN0IGJlIHVuaXF1ZSBpbiB0aGUgZWFyLiAgCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uVHlwZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlCi0gICAgICAgIGFwcGxpY2F0aW9uLiAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0aWFsaXplLWluLW9yZGVyIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpnZW5lcmljLWJvb2xlYW5UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBJZiBpbml0aWFsaXplLWluLW9yZGVyIGlzIHRydWUsIG1vZHVsZXMgbXVzdCBiZSBpbml0aWFsaXplZAotICAgICAgICAgICAgaW4gdGhlIG9yZGVyIHRoZXkncmUgbGlzdGVkIGluIHRoaXMgZGVwbG95bWVudCBkZXNjcmlwdG9yLAotICAgICAgICAgICAgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGVzLCB3aGljaCBjYW4KLSAgICAgICAgICAgIGJlIGluaXRpYWxpemVkIGluIGFueSBvcmRlci4KLSAgICAgICAgICAgIElmIGluaXRpYWxpemUtaW4tb3JkZXIgaXMgbm90IHNldCBvciBzZXQgdG8gZmFsc2UsIHRoZSBvcmRlcgotICAgICAgICAgICAgb2YgaW5pdGlhbGl6YXRpb24gaXMgdW5zcGVjaWZpZWQgYW5kIG1heSBiZSBwcm9kdWN0LWRlcGVuZGVudC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1vZHVsZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bW9kdWxlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBoYXZlIG9uZQotICAgICAgICAgICAgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSmF2YSBFRSBtb2R1bGUgaW4gdGhlCi0gICAgICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLiBBIG1vZHVsZSBlbGVtZW50IGlzIGRlZmluZWQgCi0gICAgICAgICAgICBieSBtb2R1bGVUeXBlIGRlZmluaXRpb24uIAotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktcm9sZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlicmFyeS1kaXJlY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgbGlicmFyeS1kaXJlY3RvcnkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHBhdGhuYW1lCi0gICAgICAgICAgICBvZiBhIGRpcmVjdG9yeSB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UsIHJlbGF0aXZlCi0gICAgICAgICAgICB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLiAgQWxsIGZpbGVzCi0gICAgICAgICAgICBuYW1lZCAiKi5qYXIiIGluIHRoaXMgZGlyZWN0b3J5IG11c3QgYmUgbWFkZSBhdmFpbGFibGUKLSAgICAgICAgICAgIGluIHRoZSBjbGFzcyBwYXRoIG9mIGFsbCBjb21wb25lbnRzIGluY2x1ZGVkIGluIHRoaXMKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuICBJZiB0aGlzIGVsZW1lbnQgaXNuJ3Qgc3BlY2lmaWVkLAotICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSBuYW1lZCAibGliIiBpcyBzZWFyY2hlZC4gIEFuIGVtcHR5IGVsZW1lbnQKLSAgICAgICAgICAgIG1heSBiZSB1c2VkIHRvIGRpc2FibGUgc2VhcmNoaW5nLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplbnYtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1sb2NhbC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpzZXJ2aWNlLXJlZkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZXNvdXJjZS1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJlc291cmNlLWVudi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtY29udGV4dC1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBlcnNpc3RlbmNlLWNvbnRleHQtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGVyc2lzdGVuY2UtdW5pdC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGEtc291cmNlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkYXRhLXNvdXJjZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgZml4ZWQ9IjYiCi0gICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgNi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtb2R1bGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG1vZHVsZVR5cGUgZGVmaW5lcyBhIHNpbmdsZSBKYXZhIEVFIG1vZHVsZSBhbmQgY29udGFpbnMgYQotICAgICAgICBjb25uZWN0b3IsIGVqYiwgamF2YSwgb3Igd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUKLSAgICAgICAgbW9kdWxlIHR5cGUgYW5kIGNvbnRhaW5zIGEgcGF0aCB0byB0aGUgbW9kdWxlIGZpbGUsIGFuZCBhbgotICAgICAgICBvcHRpb25hbCBhbHQtZGQgZWxlbWVudCwgd2hpY2ggc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0bwotICAgICAgICB0aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3RvciIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBjb25uZWN0b3IgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhCi0gICAgICAgICAgICAgIHJlc291cmNlIGFkYXB0ZXIgYXJjaGl2ZSBmaWxlLCByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBlamIgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhbiBlamItamFyLAotICAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbgotICAgICAgICAgICAgICBwYWNrYWdlLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImphdmEiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgamF2YSBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgamF2YQotICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wCi0gICAgICAgICAgICAgIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp3ZWJUeXBlIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWx0LWRkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgYWx0LWRkIGVsZW1lbnQgc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUKLSAgICAgICAgICAgIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICAgICAgICBmaWxlIGZvciBhIHBhcnRpY3VsYXIgSmF2YSBFRSBtb2R1bGUuICBUaGUgVVJJIG11c3QKLSAgICAgICAgICAgIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGRlcGxveW1lbnQKLSAgICAgICAgICAgIGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24ncyByb290Ci0gICAgICAgICAgICBkaXJlY3RvcnkuIElmIGFsdC1kZCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVwbG95ZXIKLSAgICAgICAgICAgIG11c3QgcmVhZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20gdGhlIGRlZmF1bHQKLSAgICAgICAgICAgIGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkgdGhlIHJlc3BlY3RpdmUKLSAgICAgICAgICAgIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgd2ViVHlwZSBkZWZpbmVzIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YKLSAgICAgICAgYSB3ZWIgYXBwbGljYXRpb24gbW9kdWxlLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi11cmkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHdlYi11cmkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHdlYgotICAgICAgICAgICAgYXBwbGljYXRpb24gZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250ZXh0LXJvb3QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNvbnRleHQgcm9vdAotICAgICAgICAgICAgb2YgYSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvY29ubmVjdG9yXzFfMC5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzAuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWIzYjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvY29ubmVjdG9yXzFfMC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotPCEtLQotQ29weXJpZ2h0IDIwMDAtMjAwMSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIDkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDQSAgOTQzMDMsIFUuUy5BLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50IGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgYW5kIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyBpdHMgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIE5vIHBhcnQgb2YgdGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50YXRpb24gbWF5IGJlCi1yZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgotb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkIHBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIExvZ28sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCBhbmQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsCi1hcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jIGluIHRoZSBVLlMuCi1hbmQgb3RoZXIgY291bnRyaWVzLgotCi1BbGwgU1BBUkMgdHJhZGVtYXJrcyBhcmUgdXNlZCB1bmRlciBsaWNlbnNlIGFuZCBhcmUgdHJhZGVtYXJrcwotb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFNQQVJDIEludGVybmF0aW9uYWwsIEluYy4KLWluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuIFByb2R1Y3RzIGJlYXJpbmcgU1BBUkMKLXRyYWRlbWFya3MgYXJlIGJhc2VkIHVwb24gYW4gYXJjaGl0ZWN0dXJlIGRldmVsb3BlZCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0KLVBvc3RTY3JpcHQgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zLCBJbmMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvCi1TdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWQotSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRSBPUiBOT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUCi1UTyBUSEUgRVhURU5UIFRIQVQgU1VDSCBESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZCi1JTlZBTElELgotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLUNvcHlyaWdodCAyMDAwLTIwMDEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwKLTkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBICA5NDMwMywgRXRhdHMtVW5pcy4KLVRvdXMgZHJvaXRzIHJlJ3NlcnZlJ3MuCi0KLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJyBhdmVjCi1kZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEgZGlzdHJpYnV0aW9uLAotZXQgbGEgZGUnY29tcGlsYXRpb24uICBBdWN1bmUgcGFydGllIGRlIGNlIHByb2R1aXQgb3UgZGUgc2EgZG9jdW1lbnRhdGlvbgotYXNzb2NpZSdlIG5lIHBldXQgZV50cmUgcmVwcm9kdWl0ZSBzb3VzIGF1Y3VuZSBmb3JtZSwgcGFyIHF1ZWxxdWUgbW95ZW4KLXF1ZSBjZSBzb2l0LCBzYW5zIGwnYXV0b3Jpc2F0aW9uIHByZSdhbGFibGUgZXQgZSdjcml0ZSBkZSBTdW4gZXQgZGUgc2VzCi1iYWlsbGV1cnMgZGUgbGljZW5jZSwgcydpbCB5IGVuIGEuCi0KLUxlIGxvZ2ljaWVsIGRlJ3RlbnUgcGFyIGRlcyB0aWVycywgZXQgcXVpIGNvbXByZW5kIGxhIHRlY2hub2xvZ2llCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0Ci1ldCBsaWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIGxlIGxvZ28gU3VuLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwsIGV0IEVudGVycHJpc2UgSmF2YUJlYW5zLAotc29udCBkZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcyBkZSdwb3NlJ2VzIGRlIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMgcGF5cy4KLQotVG91dGVzIGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQgdXRpbGlzZSdlcyBzb3VzIGxpY2VuY2UgZXQgc29udAotZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTUEFSQwotSW50ZXJuYXRpb25hbCwgSW5jLiBhdXggRXRhdHMtVW5pcyBldCAgZGFucwotZCdhdXRyZXMgcGF5cy4gTGVzIHByb2R1aXRzIHBvcnRhbnQgbGVzIG1hcnF1ZXMgU1BBUkMgc29udAotYmFzZSdzIHN1ciB1bmUgYXJjaGl0ZWN0dXJlIGRlJ3ZlbG9wcGUnZSBwYXIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotCi1Qb3N0Y3JpcHQgZXN0IHVuZSBtYXJxdWUgZW5yZWdpc3RyZSdlIGQnQWRvYmUgU3lzdGVtcyBJbmMuCi0KLUxBIERPQ1VNRU5UQVRJT04gRVNUIEZPVVJOSUUgIkVOIEwnRVRBVCIgRVQgVE9VVEVTIEFVVFJFUyBDT05ESVRJT05TLAotREVDTEFSQVRJT05TIEVUIEdBUkFOVElFUyBFWFBSRVNTRVMgT1UgVEFDSVRFUyBTT05UIEZPUk1FTExFTUVOVCBFWENMVUVTLAotREFOUyBMQSBNRVNVUkUgQVVUT1JJU0VFIFBBUiBMQSBMT0kgQVBQTElDQUJMRSwgWSBDT01QUklTIE5PVEFNTUVOVAotVE9VVEUgR0FSQU5USUUgSU1QTElDSVRFIFJFTEFUSVZFIEEgTEEgUVVBTElURSBNQVJDSEFOREUsIEEgTCdBUFRJVFVERQotQSBVTkUgVVRJTElTQVRJT04gUEFSVElDVUxJRVJFIE9VIEEgTCdBQlNFTkNFIERFIENPTlRSRUZBQ09OLgotLS0+Ci0KLTwhLS0KLVRoaXMgaXMgdGhlIFhNTCBEVEQgZm9yIHRoZSBDb25uZWN0b3IgMS4wIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLUFsbCBDb25uZWN0b3IgMS4wIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmNsdWRlIGEgRE9DVFlQRQotb2YgdGhlIGZvbGxvd2luZyBmb3JtOgotCi0gIDwhRE9DVFlQRSBjb25uZWN0b3IgUFVCTElDCi0JIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBDb25uZWN0b3IgMS4wLy9FTiIKLQkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvY29ubmVjdG9yXzFfMC5kdGQiPgotCi0tLT4KLQotPCEtLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgY29udGFpbiBQQ0RBVEEsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKLSAgaW4gdGhlIGRhdGEgbWF5IGJlIGlnbm9yZWQuCi0KLS0gSW4gZWxlbWVudHMgd2hvc2UgdmFsdWUgaXMgYW4gImVudW1lcmF0ZWQgdHlwZSIsIHRoZSB2YWx1ZSBpcwotICBjYXNlIHNlbnNpdGl2ZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZSBzYW1lCi0gIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdCBzdGFydGluZyB3aXRoICIvIikKLSAgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLgotICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkKLSAgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBzZXJ2bGV0IEFQSS4KLS0tPgotCi0KLTwhLS0KLVRoZSBjb25uZWN0b3IgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWZvciB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IGluY2x1ZGVzIGdlbmVyYWwgaW5mb3JtYXRpb24gLSB2ZW5kb3IKLW5hbWUsIHZlcnNpb24sIHNwZWNpZmljYXRpb24gdmVyc2lvbiBzdXBwb3J0ZWQsIGljb24gLSAgYWJvdXQgdGhlCi1yZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gSXQgYWxzbyBpbmNsdWRlcyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUKLWltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2gKLXRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci4KLS0tPgotPCFFTEVNRU5UIGNvbm5lY3RvciAoZGlzcGxheS1uYW1lPywgZGVzY3JpcHRpb24/LCBpY29uPywgdmVuZG9yLW5hbWUsCi1zcGVjLXZlcnNpb24sIGVpcy10eXBlLCB2ZXJzaW9uLCBsaWNlbnNlPywgcmVzb3VyY2VhZGFwdGVyKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllcyBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20KLXN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gTm90ZSB0aGF0IHRoaXMgc3VwcG9ydCBpcyBmb3IKLXRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBub3QgZm9yIHRoZSB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhlCi1vcHRpb25hbCBkZXNjcmlwdGlvbiBzcGVjaWZpZXMgYW55IHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgcmVxdWlyZW1lbnQKLWZvciB0aGUgc3VwcG9ydCBvZiBzZWN1cml0eSBjb250cmFjdCBhbmQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCi1Ob3RlIHRoYXQgQmFzaWNQYXNzd29yZCBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwgaW50ZXJmYWNlLgotVGhlIEtlcmJ2NSBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotLS0+Ci08IUVMRU1FTlQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtICgKLWRlc2NyaXB0aW9uPywgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUsIGNyZWRlbnRpYWwtaW50ZXJmYWNlKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgc3BlY2lmaWVzIHR5cGUgb2YgYW4gYXV0aGVudGljYXRpb24KLW1lY2hhbmlzbS4KLQotVGhlIGV4YW1wbGUgdmFsdWVzIGFyZToKLSAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkCi0gICAgICAgICAgICAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5LZXJidjUKLSAgICAgICAgICAgICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotCi1BbnkgYWRkaXRpb25hbCBzZWN1cml0eSBtZWNoYW5pc21zIGFyZSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUKLUNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLQotVXNlZCBpbjogYXV0aGVudGljYXRpb24tbWVjaGFuaXNtCi0tLT4KLTwhRUxFTUVOVCBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgc2luZ2xlCi1jb25maWd1cmF0aW9uIHByb3BlcnR5IGZvciBhIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZS4KLQotRWFjaCBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UgY3JlYXRlcyBjb25uZWN0aW9ucyB0byBhCi1zcGVjaWZpYyBFSVMgaW5zdGFuY2UgYmFzZWQgb24gdGhlIHByb3BlcnRpZXMgY29uZmlndXJlZCBvbiB0aGUKLU1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZS4gVGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGFyZQotc3BlY2lmaWVkIG9ubHkgb25jZSBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBldmVuIHRob3VnaCBhCi1yZXNvdXJjZSBhZGFwdGVyIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBtdWx0aXBsZSBNYW5hZ2VkQ29ubm5lY3Rpb24tCi1GYWN0b3J5IGluc3RhbmNlcyAodGhhdCBjcmVhdGUgY29ubmVjdGlvbnMgdG8gZGlmZmVyZW50IGluc3RhbmNlcyBvZgotdGhlIHNhbWUgRUlTKS4KLQotVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBuYW1lLCB0eXBlCi1hbmQgYW4gb3B0aW9uYWwgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuIElmIHRoZSByZXNvdXJjZQotYWRhcHRlciBwcm92aWRlciBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsdWUgdGhhbiB0aGUgZGVwbG95ZXIgaXMKLXJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSB2YWxpZCB2YWx1ZSBmb3IgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5LgotCi1BbnkgYm91bmRzIG9yIHdlbGwtZGVmaW5lZCB2YWx1ZXMgb2YgcHJvcGVydGllcyBzaG91bGQgYmUgZGVzY3JpYmVkCi1pbiB0aGUgZGVzY3JpcHRpb24gZWxlbWVudC4KLQotVXNlZCBpbjogcmVzb3VyY2VhZGFwdGVyCi0tLT4KLTwhRUxFTUVOVCBjb25maWctcHJvcGVydHkgKGRlc2NyaXB0aW9uPywgY29uZmlnLXByb3BlcnR5LW5hbWUsCi1jb25maWctcHJvcGVydHktdHlwZSwgY29uZmlnLXByb3BlcnR5LXZhbHVlPyk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgY29uZmlndXJhdGlvbgotcHJvcGVydHkuCi0KLVRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIGRlZmluZXMgYSBzZXQgb2Ygd2VsbC1kZWZpbmVkIHByb3BlcnRpZXMKLWFsbCBvZiB0eXBlIGphdmEubGFuZy5TdHJpbmcuIFRoZXNlIGFyZSBhcyBmb2xsb3dzOgotICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+U2VydmVyTmFtZTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgIDxjb25maWctcHJvcGVydHktbmFtZT5Qb3J0TnVtYmVyPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPlVzZXJOYW1lPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPlBhc3N3b3JkPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPkNvbm5lY3Rpb25VUkw8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotCi1BIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgY2FuIGV4dGVuZCB0aGlzIHByb3BlcnR5IHNldCB0byBpbmNsdWRlCi1wcm9wZXJ0aWVzIHNwZWNpZmljIHRvIHRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBpdHMgdW5kZXJseWluZyBFSVMuCi0KLVVzZWQgaW46IGNvbmZpZy1wcm9wZXJ0eQotCi1FeGFtcGxlOiA8Y29uZmlnLXByb3BlcnR5LW5hbWU+U2VydmVyTmFtZTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBjb25maWctcHJvcGVydHktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eS10eXBlIGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YQotdHlwZSBvZiBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgYXMgcmVxdWlyZWQgYnkgTWFuYWdlZENvbm5lY3Rpb24tCi1GYWN0b3J5IGluc3RhbmNlLgotCi1UaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGNvbmZpZy1wcm9wZXJ0eS10eXBlOgotICAgamF2YS5sYW5nLkJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLAotICAgamF2YS5sYW5nLkRvdWJsZSwgamF2YS5sYW5nLkJ5dGUsIGphdmEubGFuZy5TaG9ydCwKLSAgIGphdmEubGFuZy5Mb25nLCBqYXZhLmxhbmcuRmxvYXQsIGphdmEubGFuZy5DaGFyYWN0ZXIKLQotVXNlZCBpbjogY29uZmlnLXByb3BlcnR5Ci0KLUV4YW1wbGU6IDxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLS0tPgotPCFFTEVNRU5UIGNvbmZpZy1wcm9wZXJ0eS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgY29uZmlnLXByb3BlcnR5LXZhbHVlIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIGNvbmZpZ3VyYXRpb24KLWVudHJ5LgotCi1Vc2VkIGluOiBjb25maWctcHJvcGVydHkKLQotRXhhbXBsZTogPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT5Xb21iYXRTZXJ2ZXI8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLS0tPgotPCFFTEVNRU5UIGNvbmZpZy1wcm9wZXJ0eS12YWx1ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbm5lY3Rpb24taW1wbC1jbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZAotbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBjbGFzcyB0aGF0IGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlcgotc3BlY2lmaWMgQ29ubmVjdGlvbiBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotCi1FeGFtcGxlOiA8Y29ubmVjdGlvbi1pbXBsLWNsYXNzPmNvbS53b21iYXQuQ29ubmVjdGlvbkltcGwKLSAgICAgICAgIDwvY29ubmVjdGlvbi1pbXBsLWNsYXNzPgotLS0+Ci08IUVMRU1FTlQgY29ubmVjdGlvbi1pbXBsLWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgY29ubmVjdGlvbi1pbnRlcmZhY2Ugc3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQKLW5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UKLWFkYXB0ZXIuCi0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotCi1FeGFtcGxlOiA8Y29ubmVjdGlvbi1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb24KLSAgICAgICAgIDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0tLT4KLTwhRUxFTUVOVCBjb25uZWN0aW9uLWludGVyZmFjZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQKLW5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5IGNsYXNzIHRoYXQgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyCi1zcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotCi1FeGFtcGxlOiA8Y29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5SW1wbAotICAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotLS0+Ci08IUVMRU1FTlQgY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSBzcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZAotbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UKLWFkYXB0ZXIuCi0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotCi1FeGFtcGxlOiA8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmNvbS53b21iYXQuQ29ubmVjdGlvbkZhY3RvcnkKLSAgICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotT1IKLTxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLS0tPgotPCFFTEVNRU5UIGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNyZWRlbnRpYWwtaW50ZXJmYWNlIHNwZWNpZmllcyB0aGUgaW50ZXJmYWNlIHRoYXQgdGhlCi1yZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGZvciB0aGUgcmVwcmVzZW50YXRpb24KLW9mIHRoZSBjcmVkZW50aWFscy4gVGhpcyBlbGVtZW50IHNob3VsZCBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9uIHNlcnZlcgotdG8gZmluZCBvdXQgdGhlIENyZWRlbnRpYWwgaW50ZXJmYWNlIGl0IHNob3VsZCB1c2UgYXMgcGFydCBvZiB0aGUKLXNlY3VyaXR5IGNvbnRyYWN0LgotCi1UaGUgcG9zc2libGUgdmFsdWVzIGFyZToKLSAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsCi0gICAgICAgIDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsCi0gICAgICAgIDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0KLVVzZWQgaW46IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbQotLS0+Ci08IUVMRU1FTlQgY3JlZGVudGlhbC1pbnRlcmZhY2UgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQKLWVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdAotdGhlIHJlc291cmNlIGFkYXB0ZXIgcmFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLXRoZSByZXNvdXJjZSBhZGFwdGVyIHJhciBmaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scwotdXNlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlciByYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uCi13aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotCi1Vc2VkIGluOiBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20sIGNvbmZpZy1wcm9wZXJ0eSwgY29ubmVjdG9yLCBsaWNlbnNlLAotc2VjdXJpdHktcGVybWlzc2lvbgotLS0+Ci08IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLWRpc3BsYXllZCBieSB0b29scy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgotCi1Vc2VkIGluOiBjb25uZWN0b3IKLQotRXhhbXBsZToKLQotPGRpc3BsYXktbmFtZT5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGVpcy10eXBlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIHRoZQotRUlTLiBGb3IgZXhhbXBsZSwgdGhlIHR5cGUgb2YgYW4gRUlTIGNhbiBiZSBwcm9kdWN0IG5hbWUgb2YgRUlTCi1pbmRlcGVuZGVudCBvZiBhbnkgdmVyc2lvbiBpbmZvLgotCi1UaGlzIGhlbHBzIGluIGlkZW50aWZ5aW5nIEVJUyBpbnN0YW5jZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoCi10aGlzIHJlc291cmNlIGFkYXB0ZXIuCi0KLVVzZWQgaW46IGNvbm5lY3RvcgotLS0+Ci08IUVMRU1FTlQgZWlzLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaWNvbiBlbGVtZW50IGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMgdGhhdAotc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGEgbGFyZ2UgR0lGIG9yIEpQRUcgaWNvbiBpbWFnZXMKLXVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhIEdVSSB0b29sLgotCi1Vc2VkIGluOiBjb25uZWN0b3IKLS0tPgotPCFFTEVNRU5UIGljb24gKHNtYWxsLWljb24/LCBsYXJnZS1pY29uPyk+Ci0KLTwhLS0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi1jb250YWluaW5nIGEgbGFyZ2UgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi1uYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIHJlc291cmNlIGFkYXB0ZXIncwotcmFyIGZpbGUuCi0KLVRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotVXNlZCBpbjogaWNvbgotCi1FeGFtcGxlOgotCi08bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgbGljZW5zZSBzcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHJlc291cmNlCi1hZGFwdGVyIG1vZHVsZS4gVGhpcyBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGEgbGljZW5zZSBpcyByZXF1aXJlZAotdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLCBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLW9mIHRoZSBsaWNlbnNpbmcgdGVybXMgKGV4YW1wbGVzOiBkdXJhdGlvbiBvZiBsaWNlbnNlLCBudW1iZXIgb2YKLWNvbm5lY3Rpb24gcmVzdHJpY3Rpb25zKS4KLQotVXNlZCBpbjogY29ubmVjdG9yCi0tLT4KLTwhRUxFTUVOVCBsaWNlbnNlIChkZXNjcmlwdGlvbj8sIGxpY2Vuc2UtcmVxdWlyZWQpPgotCi08IS0tCi1UaGUgZWxlbWVudCBsaWNlbnNlLXJlcXVpcmVkIHNwZWNpZmllcyB3aGV0aGVyIGEgbGljZW5zZSBpcyByZXF1aXJlZAotdG8gZGVwbG95IGFuZCB1c2UgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZgotdGhlIGZvbGxvd2luZzoKLQotCTxsaWNlbnNlLXJlcXVpcmVkPnRydWU8L2xpY2Vuc2UtcmVxdWlyZWQ+Ci0JPGxpY2Vuc2UtcmVxdWlyZWQ+ZmFsc2U8L2xpY2Vuc2UtcmVxdWlyZWQ+Ci0KLVVzZWQgaW46IGxpY2Vuc2UKLS0tPgotPCFFTEVNRU5UIGxpY2Vuc2UtcmVxdWlyZWQgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQKLW5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBqYXZheC5yZXNvdXJjZS5zcGkuTWFuYWdlZC0KLUNvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4gVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YKLXJlc291cmNlIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZAotY29udHJhY3RzLgotCi1Vc2VkIGluOiByZXNvdXJjZWFkYXB0ZXIKLQotRXhhbXBsZToKLSAgPG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz5jb20ud29tYmF0Lk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUltcGwKLSAgPC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlCi1hZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHJlLWF1dGhlbnRpY2F0aW9uIG9mIGV4aXN0aW5nIE1hbmFnZWQtCi1Db25uZWN0aW9uIGluc3RhbmNlLiBOb3RlIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBmb3IgdGhlIHJlc291cmNlCi1hZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZSB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4KLQotVGhpcyBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIDxyZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+dHJ1ZTwvcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PgotICAgICAgICA8cmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PmZhbHNlPC9yZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+Ci1Vc2VkIGluOiByZXNvdXJjZWFkYXB0ZXIKLS0tPgotPCFFTEVNRU5UIHJlYXV0aGVudGljYXRpb24tc3VwcG9ydCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlciBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc291cmNlCi1hZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHktcXVhbGlmaWVkIG5hbWVzIG9mCi1jbGFzcy9pbnRlcmZhY2VzIHJlcXVpcmVkIGFzIHBhcnQgb2YgdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUKLXNwZWNpZmllZCBjb250cmFjdHMsIGxldmVsIG9mIHRyYW5zYWN0aW9uIHN1cHBvcnQgcHJvdmlkZWQsCi1jb25maWd1cmFibGUgcHJvcGVydGllcyBmb3IgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlcywKLW9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkIGFuZCBhZGRpdGlvbmFsCi1yZXF1aXJlZCBzZWN1cml0eSBwZXJtaXNzaW9ucy4KLQotSWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mCi1yZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnQgdGhlbiB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdAotc3VwcG9ydCBhbnkgc3RhbmRhcmQgc2VjdXJpdHkgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBhcyBwYXJ0Ci1vZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzIHRoZSBzZWN1cml0eQotcGFydCBvZiB0aGUgc3lzdGVtIGNvbnRyYWN0cyBpbiB0aGlzIGNhc2UuCi0KLVVzZWQgaW46IGNvbm5lY3RvcgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2VhZGFwdGVyICgKLW1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcywgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlLAotY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcywgY29ubmVjdGlvbi1pbnRlcmZhY2UsCi1jb25uZWN0aW9uLWltcGwtY2xhc3MsIHRyYW5zYWN0aW9uLXN1cHBvcnQsIGNvbmZpZy1wcm9wZXJ0eSosCi1hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20qLCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQsIHNlY3VyaXR5LXBlcm1pc3Npb24qCi0pPgotCi08IS0tCi1UaGUgZWxlbWVudCBzZWN1cml0eSBwZXJtaXNzaW9uIHNwZWNpZmllcyBhIHNlY3VyaXR5IHBlcm1pc3Npb24gdGhhdAotaXMgcmVxdWlyZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgY29kZS4KLQotVGhlIHNlY3VyaXR5IHBlcm1pc3Npb24gbGlzdGVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXJlIG9uZXMKLXRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHJlcXVpcmVkIGJ5IHRoZSBkZWZhdWx0IHBlcm1pc3Npb24gc2V0Ci1hcyBzcGVjaWZpZWQgaW4gdGhlIGNvbm5lY3RvciBzcGVjaWZpY2F0aW9uLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24KLWNhbiBtZW50aW9uIHNwZWNpZmljIHJlYXNvbiB0aGF0IHJlc291cmNlIGFkYXB0ZXIgcmVxdWlyZXMgYSBnaXZlbgotc2VjdXJpdHkgcGVybWlzc2lvbi4KLQotVXNlZCBpbjogcmVzb3VyY2VhZGFwdGVyCi0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1wZXJtaXNzaW9uIChkZXNjcmlwdGlvbj8sIHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYyk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IHBlcm1pc3Npb24tc3BlYyBzcGVjaWZpZXMgYSBzZWN1cml0eSBwZXJtaXNzaW9uIGJhc2VkCi1vbiB0aGUgU2VjdXJpdHkgcG9saWN5IGZpbGUgc3ludGF4LiBSZWZlciB0byB0aGUgZm9sbG93aW5nIFVSTCBmb3IKLVN1bidzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZWN1cml0eSBwZXJtaXNzaW9uIHNwZWNpZmljYXRpb246Ci0KLWh0dHA6Ci0KLVVzZWQgaW46IHNlY3VyaXR5LXBlcm1pc3Npb24KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi1jb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi1uYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIHJlc291cmNlIGFkYXB0ZXIncwotcmFyIGZpbGUuCi0KLVRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotVXNlZCBpbjogaWNvbgotCi1FeGFtcGxlOgotCi08c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgc3BlYy12ZXJzaW9uIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUgY29ubmVjdG9yCi1hcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHJlc291cmNlCi1hZGFwdGVyLiBUaGlzIGluZm9ybWF0aW9uIGVuYWJsZXMgZGVwbG95ZXIgdG8gY29uZmlndXJlIHRoZSByZXNvdXJjZQotYWRhcHRlciB0byBzdXBwb3J0IGRlcGxveW1lbnQgYW5kIHJ1bnRpbWUgcmVxdWlyZW1lbnRzIG9mIHRoZQotY29ycmVzcG9uZGluZyBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLVVzZWQgaW46IGNvbm5lY3RvcgotCi1FeGFtcGxlOgotICA8c3BlYy12ZXJzaW9uPjEuMDwvc3BlYy12ZXJzaW9uPgotLS0+Ci08IUVMRU1FTlQgc3BlYy12ZXJzaW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHRyYW5zYWN0aW9uLXN1cHBvcnQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxldmVsIG9mIHRyYW5zYWN0aW9uCi1zdXBwb3J0IHByb3ZpZGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgotVGhlIHZhbHVlIG9mIHRyYW5zYWN0aW9uLXN1cHBvcnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSA8dHJhbnNhY3Rpb24tc3VwcG9ydD5Ob1RyYW5zYWN0aW9uPC90cmFuc2FjdGlvbi1zdXBwb3J0PgotIDx0cmFuc2FjdGlvbi1zdXBwb3J0PkxvY2FsVHJhbnNhY3Rpb248L3RyYW5zYWN0aW9uLXN1cHBvcnQ+Ci0gPHRyYW5zYWN0aW9uLXN1cHBvcnQ+WEFUcmFuc2FjdGlvbjwvdHJhbnNhY3Rpb24tc3VwcG9ydD4KLQotVXNlZCBpbjogcmVzb3VyY2VhZGFwdGVyCi0tLT4KLTwhRUxFTUVOVCB0cmFuc2FjdGlvbi1zdXBwb3J0ICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgdmVuZG9yLW5hbWUgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIKLXZlbmRvci4KLQotVXNlZCBpbjogY29ubmVjdG9yCi0KLUV4YW1wbGU6Ci0gIDx2ZW5kb3ItbmFtZT5Xb21iYXQgQ29ycC48L3ZlbmRvci1uYW1lPgotLS0+Ci08IUVMRU1FTlQgdmVuZG9yLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCB2ZXJzaW9uIHNwZWNpZmllcyBhIHN0cmluZy1iYXNlZCB2ZXJzaW9uIG9mIHRoZQotcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyLgotCi1Vc2VkIGluOiBjb25uZWN0b3IKLQotRXhhbXBsZToKLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotLS0+Ci08IUVMRU1FTlQgdmVyc2lvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdGhhdCBwcm9kdWNlIGFkZGl0aW9uYWwgZGVwbG95bWVudAotaW5mb3JtYXRpb24gKGkuZS4sIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgc3RhbmRhcmQgZGVwbG95bWVudAotZGVzY3JpcHRvciBpbmZvcm1hdGlvbikgdG8gc3RvcmUgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhCi1zZXBhcmF0ZSBmaWxlLCBhbmQgZWFzaWx5IHJlZmVyIGZyb20gdGhlc2UgdG9vbC1zcGVjaWZpYyBmaWxlcyB0byB0aGUKLWluZm9ybWF0aW9uIGluIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLVRvb2xzIGFyZSBub3QgYWxsb3dlZCB0byBhZGQgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbnRvIHRoZQotc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci0KLTwhQVRUTElTVCBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29uZmlnLXByb3BlcnR5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbmZpZy1wcm9wZXJ0eS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbmZpZy1wcm9wZXJ0eS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb25uZWN0aW9uLWltcGwtY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29ubmVjdGlvbi1pbnRlcmZhY2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29ubmVjdG9yIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNyZWRlbnRpYWwtaW50ZXJmYWNlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRpc3BsYXktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlaXMtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGljZW5zZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsaWNlbnNlLXJlcXVpcmVkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2VhZGFwdGVyIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXBlcm1pc3Npb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNtYWxsLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc3BlYy12ZXJzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRyYW5zYWN0aW9uLXN1cHBvcnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmVuZG9yLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvY29ubmVjdG9yXzFfNS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQxOTEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvY29ubmVjdG9yXzFfNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSIxLjUiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWNvbm5lY3Rvcl8xXzUueHNkcwkxLjI3IDA2LzE3LzAzCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgQ29ubmVjdG9yIDEuNSBkZXBsb3ltZW50Ci0JZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAotCSJNRVRBLUlORi9yYS54bWwiIGluIHRoZSBjb25uZWN0b3IncyByYXIgZmlsZS4gIEFsbCBDb25uZWN0b3IKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlIGNvbm5lY3RvciByZXNvdXJjZQotCWFkYXB0ZXIgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKMkVFIG5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDxjb25uZWN0b3IgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQkJIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvY29ubmVjdG9yXzFfNS54c2QiCi0JICAgICAgdmVyc2lvbj0iMS41Ij4KLQkgICAgICAuLi4KLQkgICAgPC9jb25uZWN0b3I+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLQl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvY29ubmVjdG9yXzFfNS54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLQlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0b3IiIHR5cGU9ImoyZWU6Y29ubmVjdG9yVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNvbm5lY3RvciBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQKLQlkZXNjcmlwdG9yIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IGluY2x1ZGVzCi0JZ2VuZXJhbCBpbmZvcm1hdGlvbiAtIHZlbmRvciBuYW1lLCByZXNvdXJjZSBhZGFwdGVyIHZlcnNpb24sCi0JaWNvbiAtIGFib3V0IHRoZSByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gSXQgYWxzbyBpbmNsdWRlcwotCWluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UKLQlhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlIGVsZW1lbnQKLQlyZXNvdXJjZWFkYXB0ZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY3RpdmF0aW9uc3BlY1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhY3RpdmF0aW9uc3BlY1R5cGUgc3BlY2lmaWVzIGFuIGFjdGl2YXRpb24KLQlzcGVjaWZpY2F0aW9uLiAgVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5IHF1YWxpZmllZAotCUphdmEgY2xhc3MgbmFtZSBvZiBhbiBhY3RpdmF0aW9uIHNwZWNpZmljYXRpb24gYW5kIGEgc2V0IG9mCi0JcmVxdWlyZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBuYW1lcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uc3BlYy1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGVsZW1lbnQgYWN0aXZhdGlvbnNwZWMtY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseQotCSAgICAgIHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGFjdGl2YXRpb24KLQkgICAgICBzcGVjaWZpY2F0aW9uIGNsYXNzLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQotCSAgICAgIGphdmF4LnJlc291cmNlLnNwaS5BY3RpdmF0aW9uU3BlYyBpbnRlcmZhY2UuIFRoZQotCSAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYQotCSAgICAgIEphdmFCZWFuLgotCi0JICAgICAgRXhhbXBsZToKLQkJICA8YWN0aXZhdGlvbnNwZWMtY2xhc3M+Y29tLndvbWJhdC5BY3RpdmF0aW9uU3BlY0ltcGwKLQkJICA8L2FjdGl2YXRpb25zcGVjLWNsYXNzPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSIKLQkJICAgdHlwZT0iajJlZTpyZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWRtaW5vYmplY3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYWRtaW5vYmplY3RUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhbgotCWFkbWluaXN0ZXJlZCBvYmplY3QuICBBZG1pbmlzdGVyZWQgb2JqZWN0cyBhcmUgc3BlY2lmaWMgdG8gYQotCW1lc3NhZ2luZyBzdHlsZSBvciBtZXNzYWdlIHByb3ZpZGVyLiAgVGhpcyBjb250YWlucwotCWluZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieQotCWFuIGFkbWluaXN0ZXJlZCBvYmplY3QsIGl0cyBKYXZhIGNsYXNzIG5hbWUgYW5kIGl0cwotCWNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZG1pbm9iamVjdC1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IGFkbWlub2JqZWN0LWludGVyZmFjZSBzcGVjaWZpZXMgdGhlCi0JICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgdHlwZSBvZiB0aGUKLQkgICAgICBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYW4gYWRtaW5pc3RlcmVkIG9iamVjdC4KLQotCSAgICAgIEV4YW1wbGU6Ci0JCTxhZG1pbm9iamVjdC1pbnRlcmZhY2U+amF2YXguam1zLkRlc3RpbmF0aW9uCi0JCTwvYWRtaW5vYmplY3QtaW50ZXJmYWNlPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRtaW5vYmplY3QtY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IGFkbWlub2JqZWN0LWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLQkgICAgICBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QuCi0KLQkgICAgICBFeGFtcGxlOgotCQkgIDxhZG1pbm9iamVjdC1jbGFzcz5jb20ud29tYmF0LkRlc3RpbmF0aW9uSW1wbAotCQkgIDwvYWRtaW5vYmplY3QtY2xhc3M+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHkiCi0JCSAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIHNwZWNpZmllcyBhbiBhdXRoZW50aWNhdGlvbgotCW1lY2hhbmlzbSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuIE5vdGUgdGhhdCB0aGlzCi0Jc3VwcG9ydCBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIG5vdCBmb3IgdGhlCi0JdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBzcGVjaWZpZXMKLQlhbnkgcmVzb3VyY2UgYWRhcHRlciBzcGVjaWZpYyByZXF1aXJlbWVudCBmb3IgdGhlIHN1cHBvcnQgb2YKLQlzZWN1cml0eSBjb250cmFjdCBhbmQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCi0JTm90ZSB0aGF0IEJhc2ljUGFzc3dvcmQgbWVjaGFuaXNtIHR5cGUgc2hvdWxkIHN1cHBvcnQgdGhlCi0JamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0JVGhlIEtlcmJ2NSBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLQlvcmcuaWV0Zi5qZ3NzLkdTU0NyZWRlbnRpYWwgaW50ZXJmYWNlIG9yIHRoZSBkZXByZWNhdGVkCi0JamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsIGludGVyZmFjZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgc3BlY2lmaWVzCi0JICAgICAgdHlwZSBvZiBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uCi0KLQkgICAgICBUaGUgZXhhbXBsZSB2YWx1ZXMgYXJlOgotCi0JICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQKLQkgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotCi0JICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPktlcmJ2NQotCSAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0KLQkgICAgICBBbnkgYWRkaXRpb25hbCBzZWN1cml0eSBtZWNoYW5pc21zIGFyZSBvdXRzaWRlIHRoZQotCSAgICAgIHNjb3BlIG9mIHRoZSBDb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjcmVkZW50aWFsLWludGVyZmFjZSIKLQkJICAgdHlwZT0iajJlZTpjcmVkZW50aWFsLWludGVyZmFjZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25maWctcHJvcGVydHktbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIGNvbmZpZy1wcm9wZXJ0eS1uYW1lVHlwZSBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICBjb25maWd1cmF0aW9uIHByb3BlcnR5LgotCi0JICBUaGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBkZWZpbmVzIGEgc2V0IG9mIHdlbGwtZGVmaW5lZAotCSAgcHJvcGVydGllcyBhbGwgb2YgdHlwZSBqYXZhLmxhbmcuU3RyaW5nLiBUaGVzZSBhcmUgYXMKLQkgIGZvbGxvd3MuCi0KLQkgICAgICAgU2VydmVyTmFtZQotCSAgICAgICBQb3J0TnVtYmVyCi0JICAgICAgIFVzZXJOYW1lCi0JICAgICAgIFBhc3N3b3JkCi0JICAgICAgIENvbm5lY3Rpb25VUkwKLQotCSAgQSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIGNhbiBleHRlbmQgdGhpcyBwcm9wZXJ0eSBzZXQgdG8KLQkgIGluY2x1ZGUgcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgaXRzCi0JICB1bmRlcmx5aW5nIEVJUy4KLQotCSAgUG9zc2libGUgdmFsdWVzIGluY2x1ZGUKLQkJICBTZXJ2ZXJOYW1lCi0JCSAgUG9ydE51bWJlcgotCQkgIFVzZXJOYW1lCi0JCSAgUGFzc3dvcmQKLQkJICBDb25uZWN0aW9uVVJMCi0KLQkgIEV4YW1wbGU6IDxjb25maWctcHJvcGVydHktbmFtZT5TZXJ2ZXJOYW1lPC9jb25maWctcHJvcGVydHktbmFtZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnhzZFN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBjb25maWctcHJvcGVydHktdHlwZVR5cGUgY29udGFpbnMgdGhlIGZ1bGx5Ci0JICBxdWFsaWZpZWQgSmF2YSB0eXBlIG9mIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KLQotCSAgVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlczoKLQkgICAgIGphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciwKLQkgICAgIGphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5CeXRlLCBqYXZhLmxhbmcuU2hvcnQsCi0JICAgICBqYXZhLmxhbmcuTG9uZywgamF2YS5sYW5nLkZsb2F0LCBqYXZhLmxhbmcuQ2hhcmFjdGVyCi0KLQkgIFVzZWQgaW46IGNvbmZpZy1wcm9wZXJ0eQotCi0JICBFeGFtcGxlOgotCSAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQm9vbGVhbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TdHJpbmciLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuSW50ZWdlciIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Eb3VibGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQnl0ZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TaG9ydCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Mb25nIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkNoYXJhY3RlciIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbmZpZy1wcm9wZXJ0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjb25maWctcHJvcGVydHlUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSBzaW5nbGUKLQljb25maWd1cmF0aW9uIHByb3BlcnR5IHRoYXQgbWF5IGJlIHVzZWQgZm9yIHByb3ZpZGluZwotCWNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0KLQlUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIG5hbWUsCi0JdHlwZSBhbmQgYW4gb3B0aW9uYWwgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuIElmCi0JdGhlIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4KLQl0aGUgZGVwbG95ZXIgaXMgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBhIHZhbGlkIHZhbHVlIGZvcgotCWEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KLQotCUFueSBib3VuZHMgb3Igd2VsbC1kZWZpbmVkIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIHNob3VsZCBiZQotCWRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRpb24gZWxlbWVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LXZhbHVlIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBjb250YWlucyB0aGUgdmFsdWUKLQkgICAgICBvZiBhIGNvbmZpZ3VyYXRpb24gZW50cnkuIE5vdGUsIGl0IGlzIHBvc3NpYmxlIGZvciBhCi0JICAgICAgcmVzb3VyY2UgYWRhcHRlciBkZXBsb3llciB0byBvdmVycmlkZSB0aGlzCi0JICAgICAgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBkdXJpbmcgZGVwbG95bWVudC4KLQotCSAgICAgIEV4YW1wbGU6Ci0JICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT5Xb21iYXRTZXJ2ZXI8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLWRlZmluaXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY29ubmVjdGlvbi1kZWZpbml0aW9uVHlwZSBkZWZpbmVzIGEgc2V0IG9mIGNvbm5lY3Rpb24KLQlpbnRlcmZhY2VzIGFuZCBjbGFzc2VzIHBlcnRhaW5pbmcgdG8gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24KLQl0eXBlLiBUaGlzIGFsc28gaW5jbHVkZXMgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgZm9yCi0JTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlcyB0aGF0IG1heSBiZSBwcm9kdWNlZCBvdXQKLQlvZiB0aGlzIHNldC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcyBzcGVjaWZpZXMKLQkgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdAotCSAgICAgIGltcGxlbWVudHMgdGhlCi0JICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuCi0JICAgICAgVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UKLQkgICAgICBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yIGFyY2hpdGVjdHVyZQotCSAgICAgIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0JICAgICAgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4KLQotCSAgICAgIEV4YW1wbGU6Ci0JICAgICAgPG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz4KLQkJICBjb20ud29tYmF0Lk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUltcGwKLQkgICAgICA8L21hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHkiCi0JCSAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGVsZW1lbnQgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIHNwZWNpZmllcwotCSAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkKLQkgICAgICBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgotCi0JICAgICAgRXhhbXBsZToKLQkgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmNvbS53b21iYXQuQ29ubmVjdGlvbkZhY3RvcnkKLQkgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLQotCSAgICAgIE9SCi0KLQkgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uRmFjdG9yeQotCSAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGVsZW1lbnQgY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyBzcGVjaWZpZXMKLQkgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5Ci0JICAgICAgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIKLQkgICAgICBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeUltcGwKLQkgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBjb25uZWN0aW9uLWludGVyZmFjZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgZnVsbHkKLQkgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBpbnRlcmZhY2Ugc3VwcG9ydGVkCi0JICAgICAgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JCSAgPGNvbm5lY3Rpb24taW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uCi0JCSAgPC9jb25uZWN0aW9uLWludGVyZmFjZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWltcGwtY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3NUeXBlIHNwZWNpZmllcyB0aGUgZnVsbHkKLQkgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBjbGFzcyB0aGF0Ci0JICAgICAgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIENvbm5lY3Rpb24KLQkgICAgICBpbnRlcmZhY2UuICBJdCBpcyB1c2VkIGJ5IHRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3MKLQkgICAgICBlbGVtZW50cy4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkJICA8Y29ubmVjdGlvbi1pbXBsLWNsYXNzPmNvbS53b21iYXQuQ29ubmVjdGlvbkltcGwKLQkJICA8L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0b3JUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY29ubmVjdG9yVHlwZSBkZWZpbmVzIGEgcmVzb3VyY2UgYWRhcHRlci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZW5kb3ItbmFtZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQgdmVuZG9yLW5hbWUgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0JICAgIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgdmVuZG9yLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVpcy10eXBlIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudCBlaXMtdHlwZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQkgICAgdHlwZSBvZiB0aGUgRUlTLiBGb3IgZXhhbXBsZSwgdGhlIHR5cGUgb2YgYW4gRUlTIGNhbgotCSAgICBiZSBwcm9kdWN0IG5hbWUgb2YgRUlTIGluZGVwZW5kZW50IG9mIGFueSB2ZXJzaW9uCi0JICAgIGluZm8uCi0KLQkgICAgVGhpcyBoZWxwcyBpbiBpZGVudGlmeWluZyBFSVMgaW5zdGFuY2VzIHRoYXQgY2FuIGJlCi0JICAgIHVzZWQgd2l0aCB0aGlzIHJlc291cmNlIGFkYXB0ZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2VhZGFwdGVyLXZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci12ZXJzaW9uIHNwZWNpZmllcyBhIHN0cmluZy1iYXNlZCB2ZXJzaW9uCi0JICAgIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIGZyb20gdGhlIHJlc291cmNlIGFkYXB0ZXIKLQkgICAgcHJvdmlkZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaWNlbnNlIgotCQkgICB0eXBlPSJqMmVlOmxpY2Vuc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZWFkYXB0ZXIiCi0JCSAgIHR5cGU9ImoyZWU6cmVzb3VyY2VhZGFwdGVyVHlwZSIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjEuNSIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgdmVyc2lvbiBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlCi0JICBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gdGhhdCBpcwotCSAgc3VwcG9ydGVkIGJ5IHRoaXMgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBpbmZvcm1hdGlvbgotCSAgZW5hYmxlcyBkZXBsb3llciB0byBjb25maWd1cmUgdGhlIHJlc291cmNlIGFkYXB0ZXIgdG8KLQkgIHN1cHBvcnQgZGVwbG95bWVudCBhbmQgcnVudGltZSByZXF1aXJlbWVudHMgb2YgdGhlCi0JICBjb3JyZXNwb25kaW5nIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjcmVkZW50aWFsLWludGVyZmFjZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjcmVkZW50aWFsLWludGVyZmFjZVR5cGUgc3BlY2lmaWVzIHRoZQotCWludGVyZmFjZSB0aGF0IHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uCi0Jc3VwcG9ydHMgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKLQljcmVkZW50aWFscy4gVGhpcyBlbGVtZW50KHMpIHRoYXQgdXNlIHRoaXMgdHlwZSwKLQlpLmUuIGNyZWRlbnRpYWwtaW50ZXJmYWNlLCAgc2hvdWxkIGJlIHVzZWQgYnkKLQlhcHBsaWNhdGlvbiBzZXJ2ZXIgdG8gZmluZCBvdXQgdGhlIENyZWRlbnRpYWwKLQlpbnRlcmZhY2UgaXQgc2hvdWxkIHVzZSBhcyBwYXJ0IG9mIHRoZSBzZWN1cml0eQotCWNvbnRyYWN0LgotCi0JVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6Ci0KLQlqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsCi0Jb3JnLmlldGYuamdzcy5HU1NDcmVkZW50aWFsCi0JamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDplbnVtZXJhdGlvbgotCSAgICAgdmFsdWU9ImphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwiLz4KLQk8eHNkOmVudW1lcmF0aW9uCi0JICAgICB2YWx1ZT0ib3JnLmlldGYuamdzcy5HU1NDcmVkZW50aWFsIi8+Ci0JPHhzZDplbnVtZXJhdGlvbgotCSAgICAgdmFsdWU9ImphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluYm91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGluYm91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24KLQlhYm91dCBhbiBpbmJvdW5kIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24KLQlzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIKLQlsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBtZXNzYWdlYWRhcHRlciBlbGVtZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2VhZGFwdGVyIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2VhZGFwdGVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlbGlzdGVuZXItdHlwZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG1lc3NhZ2VsaXN0ZW5lci10eXBlIGVsZW1lbnQgY29udGVudCBtdXN0IGJlCi0JICAgICAgdW5pcXVlIGluIHRoZSBtZXNzYWdlYWRhcHRlci4gU2V2ZXJhbCBtZXNzYWdlbGlzdGVuZXJzCi0JICAgICAgY2FuIG5vdCB1c2UgdGhlIHNhbWUgbWVzc2FnZWxpc3RlbmVyLXR5cGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1lc3NhZ2VsaXN0ZW5lciIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlbGlzdGVuZXItdHlwZSIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibGljZW5zZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsaWNlbnNlVHlwZSBzcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlCi0JcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIFRoaXMgdHlwZSBzcGVjaWZpZXMgd2hldGhlciBhCi0JbGljZW5zZSBpcyByZXF1aXJlZCB0byBkZXBsb3kgYW5kIHVzZSB0aGlzIHJlc291cmNlIGFkYXB0ZXIsCi0JYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMKLQkoZXhhbXBsZXM6IGR1cmF0aW9uIG9mIGxpY2Vuc2UsIG51bWJlciBvZiBjb25uZWN0aW9uCi0JcmVzdHJpY3Rpb25zKS4gSXQgaXMgdXNlZCBieSB0aGUgbGljZW5zZSBlbGVtZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpY2Vuc2UtcmVxdWlyZWQiCi0JCSAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudCBsaWNlbnNlLXJlcXVpcmVkIHNwZWNpZmllcyB3aGV0aGVyIGEKLQkgICAgbGljZW5zZSBpcyByZXF1aXJlZCB0byBkZXBsb3kgYW5kIHVzZSB0aGUKLQkgICAgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IG11c3QgYmUgb25lIG9mCi0JICAgIHRoZSBmb2xsb3dpbmcsICJ0cnVlIiBvciAiZmFsc2UiLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2VhZGFwdGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1lc3NhZ2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JbWVzc2FnaW5nIGNhcGFiaWxpdGllcyBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcwotCWNvbnRhaW5zIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLQlyZXNvdXJjZSBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlCi0JbWVzc2FnZWxpc3RlbmVyIGVsZW1lbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZWxpc3RlbmVyIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2VsaXN0ZW5lclR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZWxpc3RlbmVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1lc3NhZ2VsaXN0ZW5lclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEKLQlzcGVjaWZpYyBtZXNzYWdlIGxpc3RlbmVyIHN1cHBvcnRlZCBieSB0aGUgbWVzc2FnaW5nCi0JcmVzb3VyY2UgYWRhcHRlci4gSXQgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIEphdmEgdHlwZQotCW9mIHRoZSBtZXNzYWdlIGxpc3RlbmVyIGludGVyZmFjZSBhbmQgYW4gYWN0aXZhdGlvbgotCXNwZWNpZmljYXRpb24uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZWxpc3RlbmVyLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IG1lc3NhZ2VsaXN0ZW5lci10eXBlIHNwZWNpZmllcyB0aGUgZnVsbHkKLQkgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIG9mIGEgbWVzc2FnZQotCSAgICAgIGxpc3RlbmVyIGludGVyZmFjZS4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkJPG1lc3NhZ2VsaXN0ZW5lci10eXBlPmphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIKLQkJPC9tZXNzYWdlbGlzdGVuZXItdHlwZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb25zcGVjIgotCQkgICB0eXBlPSJqMmVlOmFjdGl2YXRpb25zcGVjVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dAotCWFuIG91dGJvdW5kIHJlc291cmNlIGFkYXB0ZXIuIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseQotCXF1YWxpZmllZCBuYW1lcyBvZiBjbGFzc2VzL2ludGVyZmFjZXMgcmVxdWlyZWQgYXMgcGFydCBvZgotCXRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMgZm9yCi0JY29ubmVjdGlvbiBtYW5hZ2VtZW50LCBsZXZlbCBvZiB0cmFuc2FjdGlvbiBzdXBwb3J0Ci0JcHJvdmlkZWQsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkCi0JYW5kIGFkZGl0aW9uYWwgcmVxdWlyZWQgc2VjdXJpdHkgcGVybWlzc2lvbnMuCi0KLQlJZiB0aGVyZSBpcyBubyBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gc3BlY2lmaWVkIGFzIHBhcnQgb2YKLQlyZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnQgdGhlbiB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdAotCXN1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMKLQlwYXJ0IG9mIHNlY3VyaXR5IGNvbnRyYWN0LiBUaGUgYXBwbGljYXRpb24gc2VydmVyIGlnbm9yZXMKLQl0aGUgc2VjdXJpdHkgcGFydCBvZiB0aGUgc3lzdGVtIGNvbnRyYWN0cyBpbiB0aGlzIGNhc2UuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1kZWZpbml0aW9uIgotCQkgICB0eXBlPSJqMmVlOmNvbm5lY3Rpb24tZGVmaW5pdGlvblR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNhY3Rpb24tc3VwcG9ydCIKLQkJICAgdHlwZT0iajJlZTp0cmFuc2FjdGlvbi1zdXBwb3J0VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSIKLQkJICAgdHlwZT0iajJlZTphdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IgotCQkgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQgcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IHNwZWNpZmllcwotCSAgICB3aGV0aGVyIHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzCi0JICAgIHJlLWF1dGhlbnRpY2F0aW9uIG9mIGV4aXN0aW5nIE1hbmFnZWQtIENvbm5lY3Rpb24KLQkgICAgaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIGZvciB0aGUKLQkgICAgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBhbmQgbm90IGZvciB0aGUKLQkgICAgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIFRoaXMgZWxlbWVudCBtdXN0IGhhdmUKLQkgICAgZWl0aGVyIGEgInRydWUiIG9yICJmYWxzZSIgdmFsdWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSByZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLQkgIG9mIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgdXNlZCBmb3Igc3BlY2lmeWluZyBhCi0JICByZXF1aXJlZCBjb25maWd1cmF0aW9uIHByb3BlcnR5IG5hbWUuIEl0IGlzIHVzZWQKLQkgIGJ5IHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSBlbGVtZW50cy4KLQotCSAgRXhhbXBsZToKLQotCSAgPHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eT5EZXN0aW5hdGlvbjwvcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5PgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzb3VyY2VhZGFwdGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCXJlc291cmNlIGFkYXB0ZXIuIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQKLQlyZXNvdXJjZSBhZGFwdGVyIEphdmEgY2xhc3MgbmFtZSwgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLAotCWluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UKLQlhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlCi0Jb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyIGFuZCBpbmJvdW5kLXJlc291cmNlYWRhcHRlcgotCWVsZW1lbnRzLCBhbmQgYW4gb3B0aW9uYWwgc2V0IG9mIGFkbWluaXN0ZXJlZCBvYmplY3RzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlYWRhcHRlci1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXItY2xhc3Mgc3BlY2lmaWVzIHRoZQotCSAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzCi0JICAgIHRoZSBqYXZheC5yZXNvdXJjZS5zcGkuUmVzb3VyY2VBZGFwdGVyCi0JICAgIGludGVyZmFjZS4gVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YKLQkgICAgcmVzb3VyY2UgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvcgotCSAgICBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cy4gVGhlIGltcGxlbWVudGF0aW9uCi0JICAgIG9mIHRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eSIKLQkJICAgdHlwZT0iajJlZTpjb25maWctcHJvcGVydHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyIgotCQkgICB0eXBlPSJqMmVlOm91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0iY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIGVsZW1lbnQgY29udGVudAotCSAgICAgIG11c3QgYmUgdW5pcXVlIGluIHRoZSBvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXIuCi0JICAgICAgTXVsdGlwbGUgY29ubmVjdGlvbi1kZWZpbml0aW9ucyBjYW4gbm90IHVzZSB0aGUKLQkgICAgICBzYW1lIGNvbm5lY3Rpb25mYWN0b3J5LXR5cGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmNvbm5lY3Rpb24tZGVmaW5pdGlvbiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluYm91bmQtcmVzb3VyY2VhZGFwdGVyIgotCQkgICB0eXBlPSJqMmVlOmluYm91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRtaW5vYmplY3QiCi0JCSAgIHR5cGU9ImoyZWU6YWRtaW5vYmplY3RUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcGVybWlzc2lvbiIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1wZXJtaXNzaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXBlcm1pc3Npb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VjdXJpdHktcGVybWlzc2lvblR5cGUgc3BlY2lmaWVzIGEgc2VjdXJpdHkKLQlwZXJtaXNzaW9uIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgY29kZS4KLQotCVRoZSBzZWN1cml0eSBwZXJtaXNzaW9uIGxpc3RlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JYXJlIG9uZXMgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gdGhvc2UgcmVxdWlyZWQgYnkgdGhlCi0JZGVmYXVsdCBwZXJtaXNzaW9uIHNldCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbm5lY3RvcgotCXNwZWNpZmljYXRpb24uIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBjYW4gbWVudGlvbiBzcGVjaWZpYwotCXJlYXNvbiB0aGF0IHJlc291cmNlIGFkYXB0ZXIgcmVxdWlyZXMgYSBnaXZlbiBzZWN1cml0eQotCXBlcm1pc3Npb24uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcGVybWlzc2lvbi1zcGVjIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudCBzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWMgc3BlY2lmaWVzIGEgc2VjdXJpdHkKLQkgICAgcGVybWlzc2lvbiBiYXNlZCBvbiB0aGUgU2VjdXJpdHkgcG9saWN5IGZpbGUKLQkgICAgc3ludGF4LiBSZWZlciB0byB0aGUgZm9sbG93aW5nIFVSTCBmb3IgU3VuJ3MKLQkgICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlY3VyaXR5IHBlcm1pc3Npb24KLQkgICAgc3BlY2lmaWNhdGlvbjoKLQotCSAgICBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjQvZG9jcy9ndWlkZS9zZWN1cml0eS9Qb2xpY3lGaWxlcy5odG1sI0ZpbGVTeW50YXgKLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0cmFuc2FjdGlvbi1zdXBwb3J0VHlwZSBzcGVjaWZpZXMgdGhlIGxldmVsIG9mCi0JdHJhbnNhY3Rpb24gc3VwcG9ydCBwcm92aWRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gSXQgaXMKLQl1c2VkIGJ5IHRyYW5zYWN0aW9uLXN1cHBvcnQgZWxlbWVudHMuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCSAgICBOb1RyYW5zYWN0aW9uCi0JICAgIExvY2FsVHJhbnNhY3Rpb24KLQkgICAgWEFUcmFuc2FjdGlvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9UcmFuc2FjdGlvbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsVHJhbnNhY3Rpb24iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYQVRyYW5zYWN0aW9uIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzYueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9jb25uZWN0b3JfMV82LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkODc1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzYueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgICAgICAgIHZlcnNpb249IjEuNiI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gICAgICAKLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotICAgICAgCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICAgICAgCi0gICAgICBDb250cmlidXRvcihzKToKLSAgICAgIAotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gICAgICAKLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotICAgICAgCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICAgICAgCi0gICAgICBDb250cmlidXRvcihzKToKLSAgICAgIAotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVtbCi0gICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgQ29ubmVjdG9yIDEuNiBkZXBsb3ltZW50Ci0gICAgICBkZXNjcmlwdG9yLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkCi0gICAgICAiTUVUQS1JTkYvcmEueG1sIiBpbiB0aGUgY29ubmVjdG9yJ3MgcmFyIGZpbGUuICBBbGwgQ29ubmVjdG9yCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlIGNvbm5lY3RvciByZXNvdXJjZQotICAgICAgYWRhcHRlciBzY2hlbWEgYnkgdXNpbmcgdGhlIEphdmEgRUUgbmFtZXNwYWNlOgotICAgICAgCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLSAgICAgIAotICAgICAgYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotICAgICAgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLSAgICAgIAotICAgICAgPGNvbm5lY3RvciB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0gICAgICAJIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9jb25uZWN0b3JfMV82LnhzZCIKLSAgICAgIHZlcnNpb249IjEuNiI+Ci0gICAgICAuLi4KLSAgICAgIDwvY29ubmVjdG9yPgotICAgICAgCi0gICAgICBUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLSAgICAgIHRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEphdmEgRUUKLSAgICAgIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0gICAgICAKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9jb25uZWN0b3JfMV82LnhzZAotICAgICAgCi0gICAgICBdXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAgICAgIAotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICAgICAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICAgICAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAgICAgIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gICAgICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgICAgIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV82LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdG9yIgotICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNvbm5lY3RvclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgY29ubmVjdG9yIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZGVwbG95bWVudAotICAgICAgICBkZXNjcmlwdG9yIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IGluY2x1ZGVzCi0gICAgICAgIGdlbmVyYWwgaW5mb3JtYXRpb24gLSB2ZW5kb3IgbmFtZSwgcmVzb3VyY2UgYWRhcHRlciB2ZXJzaW9uLAotICAgICAgICBpY29uIC0gYWJvdXQgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBJdCBhbHNvIGluY2x1ZGVzCi0gICAgICAgIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UKLSAgICAgICAgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBlbGVtZW50Ci0gICAgICAgIHJlc291cmNlYWRhcHRlci4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbnNwZWNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFjdGl2YXRpb25zcGVjVHlwZSBzcGVjaWZpZXMgYW4gYWN0aXZhdGlvbgotICAgICAgICBzcGVjaWZpY2F0aW9uLiAgVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5IHF1YWxpZmllZAotICAgICAgICBKYXZhIGNsYXNzIG5hbWUgb2YgYW4gYWN0aXZhdGlvbiBzcGVjaWZpY2F0aW9uIGFuZCBhIHNldCBvZgotICAgICAgICByZXF1aXJlZCBjb25maWd1cmF0aW9uIHByb3BlcnR5IG5hbWVzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb25zcGVjLWNsYXNzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgICAgIFRoZSBlbGVtZW50IGFjdGl2YXRpb25zcGVjLWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgICAgIHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGFjdGl2YXRpb24KLSAgICAgICAgICAgIHNwZWNpZmljYXRpb24gY2xhc3MuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlCi0gICAgICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuQWN0aXZhdGlvblNwZWMgaW50ZXJmYWNlLiBUaGUKLSAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYQotICAgICAgICAgICAgSmF2YUJlYW4uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICAJICA8YWN0aXZhdGlvbnNwZWMtY2xhc3M+Y29tLndvbWJhdC5BY3RpdmF0aW9uU3BlY0ltcGwKLSAgICAgICAgICAgIAkgIDwvYWN0aXZhdGlvbnNwZWMtY2xhc3M+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5IGVsZW1lbnQgaXMgZGVwcmVjYXRlZCBzaW5jZQotICAgICAgICAgICAgQ29ubmVjdG9ycyAxLjYgc3BlY2lmaWNhdGlvbi4gVGhlIHJlc291cmNlIGFkYXB0ZXIgCi0gICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIEBOb3ROdWxsCi0gICAgICAgICAgICBCZWFuIFZhbGlkYXRpb24gYW5ub3RhdGlvbiBvciBpdHMgWE1MIHZhbGlkYXRpb24KLSAgICAgICAgICAgIGRlc2NyaXB0b3IgZXF1aXZhbGVudCB0byBpbmRpY2F0ZSB0aGF0IGEgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgcHJvcGVydHkgaXMgcmVxdWlyZWQgdG8gYmUgc3BlY2lmaWVkIGJ5IHRoZSBkZXBsb3llci4KLSAgICAgICAgICAgIFNlZSB0aGUgQ29ubmVjdG9ycyBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLiAKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWRtaW5vYmplY3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFkbWlub2JqZWN0VHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYW4KLSAgICAgICAgYWRtaW5pc3RlcmVkIG9iamVjdC4gIEFkbWluaXN0ZXJlZCBvYmplY3RzIGFyZSBzcGVjaWZpYyB0byBhCi0gICAgICAgIG1lc3NhZ2luZyBzdHlsZSBvciBtZXNzYWdlIHByb3ZpZGVyLiAgVGhpcyBjb250YWlucwotICAgICAgICBpbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlIG9mIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkKLSAgICAgICAgYW4gYWRtaW5pc3RlcmVkIG9iamVjdCwgaXRzIEphdmEgY2xhc3MgbmFtZSBhbmQgaXRzCi0gICAgICAgIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZG1pbm9iamVjdC1pbnRlcmZhY2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICAgICAgVGhlIGVsZW1lbnQgYWRtaW5vYmplY3QtaW50ZXJmYWNlIHNwZWNpZmllcyB0aGUKLSAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgb2YgdGhlCi0gICAgICAgICAgICBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYW4gYWRtaW5pc3RlcmVkIG9iamVjdC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgICAgIAk8YWRtaW5vYmplY3QtaW50ZXJmYWNlPmphdmF4Lmptcy5EZXN0aW5hdGlvbgotICAgICAgICAgICAgCTwvYWRtaW5vYmplY3QtaW50ZXJmYWNlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZG1pbm9iamVjdC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICBUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1jbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICAJICA8YWRtaW5vYmplY3QtY2xhc3M+Y29tLndvbWJhdC5EZXN0aW5hdGlvbkltcGwKLSAgICAgICAgICAgIAkgIDwvYWRtaW5vYmplY3QtY2xhc3M+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXV0aGVudGljYXRpb24tbWVjaGFuaXNtVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIHNwZWNpZmllcyBhbiBhdXRoZW50aWNhdGlvbgotICAgICAgICBtZWNoYW5pc20gc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBOb3RlIHRoYXQgdGhpcwotICAgICAgICBzdXBwb3J0IGlzIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgbm90IGZvciB0aGUKLSAgICAgICAgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBzcGVjaWZpZXMKLSAgICAgICAgYW55IHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgcmVxdWlyZW1lbnQgZm9yIHRoZSBzdXBwb3J0IG9mCi0gICAgICAgIHNlY3VyaXR5IGNvbnRyYWN0IGFuZCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uCi0gICAgICAgIAotICAgICAgICBOb3RlIHRoYXQgQmFzaWNQYXNzd29yZCBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLSAgICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0gICAgICAgIFRoZSBLZXJidjUgbWVjaGFuaXNtIHR5cGUgc2hvdWxkIHN1cHBvcnQgdGhlCi0gICAgICAgIG9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbCBpbnRlcmZhY2Ugb3IgdGhlIGRlcHJlY2F0ZWQKLSAgICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsIGludGVyZmFjZS4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgICAgIFRoZSBlbGVtZW50IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlIHNwZWNpZmllcwotICAgICAgICAgICAgdHlwZSBvZiBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRoZSBleGFtcGxlIHZhbHVlcyBhcmU6Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkCi0gICAgICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+S2VyYnY1Ci0gICAgICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBBbnkgYWRkaXRpb25hbCBzZWN1cml0eSBtZWNoYW5pc21zIGFyZSBvdXRzaWRlIHRoZQotICAgICAgICAgICAgc2NvcGUgb2YgdGhlIENvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JlZGVudGlhbC1pbnRlcmZhY2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNyZWRlbnRpYWwtaW50ZXJmYWNlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25maWctcHJvcGVydHktbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgY29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KLSAgICAgICAgCi0gICAgICAgIFRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIGRlZmluZXMgYSBzZXQgb2Ygd2VsbC1kZWZpbmVkCi0gICAgICAgIHByb3BlcnRpZXMgYWxsIG9mIHR5cGUgamF2YS5sYW5nLlN0cmluZy4gVGhlc2UgYXJlIGFzCi0gICAgICAgIGZvbGxvd3MuCi0gICAgICAgIAotICAgICAgICBTZXJ2ZXJOYW1lCi0gICAgICAgIFBvcnROdW1iZXIKLSAgICAgICAgVXNlck5hbWUKLSAgICAgICAgUGFzc3dvcmQKLSAgICAgICAgQ29ubmVjdGlvblVSTAotICAgICAgICAKLSAgICAgICAgQSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIGNhbiBleHRlbmQgdGhpcyBwcm9wZXJ0eSBzZXQgdG8KLSAgICAgICAgaW5jbHVkZSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvIHRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBpdHMKLSAgICAgICAgdW5kZXJseWluZyBFSVMuCi0gICAgICAgIAotICAgICAgICBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZQotICAgICAgICAJICBTZXJ2ZXJOYW1lCi0gICAgICAgIAkgIFBvcnROdW1iZXIKLSAgICAgICAgCSAgVXNlck5hbWUKLSAgICAgICAgCSAgUGFzc3dvcmQKLSAgICAgICAgCSAgQ29ubmVjdGlvblVSTAotICAgICAgICAKLSAgICAgICAgRXhhbXBsZTogPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPlNlcnZlck5hbWU8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgIFRoZSBjb25maWctcHJvcGVydHktdHlwZVR5cGUgY29udGFpbnMgdGhlIGZ1bGx5Ci0gICAgICAgIHF1YWxpZmllZCBKYXZhIHR5cGUgb2YgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5LgotICAgICAgICAKLSAgICAgICAgVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlczoKLSAgICAgICAgamF2YS5sYW5nLkJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLAotICAgICAgICBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LAotICAgICAgICBqYXZhLmxhbmcuTG9uZywgamF2YS5sYW5nLkZsb2F0LCBqYXZhLmxhbmcuQ2hhcmFjdGVyCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiBjb25maWctcHJvcGVydHkKLSAgICAgICAgCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Cb29sZWFuIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkludGVnZXIiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkRvdWJsZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQnl0ZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU2hvcnQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkxvbmciLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5DaGFyYWN0ZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbmZpZy1wcm9wZXJ0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgc2luZ2xlCi0gICAgICAgIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgdGhhdCBtYXkgYmUgdXNlZCBmb3IgcHJvdmlkaW5nCi0gICAgICAgIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0gICAgICAgIAotICAgICAgICBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIG5hbWUsCi0gICAgICAgIHR5cGUgYW5kIGFuIG9wdGlvbmFsIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBJZgotICAgICAgICB0aGUgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsdWUgdGhhbgotICAgICAgICB0aGUgZGVwbG95ZXIgaXMgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBhIHZhbGlkIHZhbHVlIGZvcgotICAgICAgICBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0gICAgICAgIAotICAgICAgICBBbnkgYm91bmRzIG9yIHdlbGwtZGVmaW5lZCB2YWx1ZXMgb2YgcHJvcGVydGllcyBzaG91bGQgYmUKLSAgICAgICAgZGVzY3JpYmVkIGluIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50LgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNvbmZpZy1wcm9wZXJ0eS1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS10eXBlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpjb25maWctcHJvcGVydHktdHlwZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgICAgIFRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBjb250YWlucyB0aGUgdmFsdWUKLSAgICAgICAgICAgIG9mIGEgY29uZmlndXJhdGlvbiBlbnRyeS4gTm90ZSwgaXQgaXMgcG9zc2libGUgZm9yIGEKLSAgICAgICAgICAgIHJlc291cmNlIGFkYXB0ZXIgZGVwbG95ZXIgdG8gb3ZlcnJpZGUgdGhpcwotICAgICAgICAgICAgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBkdXJpbmcgZGVwbG95bWVudC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+V29tYmF0U2VydmVyPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS1pZ25vcmUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWxlbWVudCBjb25maWctcHJvcGVydHktaWdub3JlIGlzIHVzZWQgdG8gc3BlY2lmeSAKLSAgICAgICAgICAgIHdoZXRoZXIgdGhlIGNvbmZpZ3VyYXRpb24gdG9vbHMgbXVzdCBpZ25vcmUgY29uc2lkZXJpbmcgdGhlIAotICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBkdXJpbmcgYXV0by1kaXNjb3Zlcnkgb2YKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4gU2VlIHRoZSBDb25uZWN0b3Igc3BlY2lmaWNhdGlvbiBmb3IKLSAgICAgICAgICAgIG1vcmUgZGV0YWlscy4gSWYgdW5zcGVjaWZpZWQsIHRoZSBjb250YWluZXIgbXVzdCBub3QgaWdub3JlCi0gICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBkdXJpbmcgYXV0by1kaXNjb3ZlcnkuCi0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZywgInRydWUiIG9yICJmYWxzZSIuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktc3VwcG9ydHMtZHluYW1pYy11cGRhdGVzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGVsZW1lbnQgY29uZmlnLXByb3BlcnR5LXN1cHBvcnRzLWR5bmFtaWMtdXBkYXRlcyBpcyB1c2VkIHRvIHNwZWNpZnkgCi0gICAgICAgICAgICB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGFsbG93cyBpdHMgdmFsdWUgdG8gYmUgdXBkYXRlZCwgYnkKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNlcnZlcidzIGNvbmZpZ3VyYXRpb24gdG9vbHMsIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YKLSAgICAgICAgICAgIHRoZSBKYXZhQmVhbiBpbnN0YW5jZS4gU2VlIHRoZSBDb25uZWN0b3Igc3BlY2lmaWNhdGlvbiBmb3IKLSAgICAgICAgICAgIG1vcmUgZGV0YWlscy4gSWYgdW5zcGVjaWZpZWQsIHRoZSBjb250YWluZXIgbXVzdCBub3QgZHluYW1pY2FsbHkKLSAgICAgICAgICAgIHJlY29uZmlndXJlIHRoZSBwcm9wZXJ0eS4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nLCAidHJ1ZSIgb3IgImZhbHNlIi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS1jb25maWRlbnRpYWwiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWxlbWVudCBjb25maWctcHJvcGVydHktY29uZmlkZW50aWFsIGlzIHVzZWQgdG8gc3BlY2lmeSAKLSAgICAgICAgICAgIHdoZXRoZXIgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgY29uZmlkZW50aWFsIGFuZAotICAgICAgICAgICAgcmVjb21tZW5kcyBhcHBsaWNhdGlvbiBzZXJ2ZXIncyBjb25maWd1cmF0aW9uIHRvb2xzIHRvIHVzZSBzcGVjaWFsIAotICAgICAgICAgICAgdmlzdWFsIGFpZHMgZm9yIGVkaXRpbmcgdGhlbS4gU2VlIHRoZSBDb25uZWN0b3Igc3BlY2lmaWNhdGlvbiBmb3IKLSAgICAgICAgICAgIG1vcmUgZGV0YWlscy4gSWYgdW5zcGVjaWZpZWQsIHRoZSBjb250YWluZXIgbXVzdCBub3QgdHJlYXQgdGhlCi0gICAgICAgICAgICBwcm9wZXJ0eSBhcyBjb25maWRlbnRpYWwuCi0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZywgInRydWUiIG9yICJmYWxzZSIuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1kZWZpbml0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb25uZWN0aW9uLWRlZmluaXRpb25UeXBlIGRlZmluZXMgYSBzZXQgb2YgY29ubmVjdGlvbgotICAgICAgICBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzIHBlcnRhaW5pbmcgdG8gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24KLSAgICAgICAgdHlwZS4gVGhpcyBhbHNvIGluY2x1ZGVzIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGZvcgotICAgICAgICBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2VzIHRoYXQgbWF5IGJlIHByb2R1Y2VkIG91dAotICAgICAgICBvZiB0aGlzIHNldC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICAgICAgVGhlIGVsZW1lbnQgbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIHNwZWNpZmllcwotICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQKLSAgICAgICAgICAgIGltcGxlbWVudHMgdGhlCi0gICAgICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4KLSAgICAgICAgICAgIFRoaXMgSmF2YSBjbGFzcyBpcyBwcm92aWRlZCBhcyBwYXJ0IG9mIHJlc291cmNlCi0gICAgICAgICAgICBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yIGFyY2hpdGVjdHVyZQotICAgICAgICAgICAgc3BlY2lmaWVkIGNvbnRyYWN0cy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgICAgICAgIGNsYXNzIGlzIHJlcXVpcmVkIHRvIGJlIGEgSmF2YUJlYW4uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICA8bWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotICAgICAgICAgICAgCSAgY29tLndvbWJhdC5NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlJbXBsCi0gICAgICAgICAgICA8L21hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpjb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICBUaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2Ugc3BlY2lmaWVzCi0gICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgICAgICBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGFtcGxlOgotICAgICAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgT1IKLSAgICAgICAgICAgIAotICAgICAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbkZhY3RvcnkKLSAgICAgICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgICAgIFRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3Mgc3BlY2lmaWVzCi0gICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcyB0aGF0IGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlcgotICAgICAgICAgICAgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGFtcGxlOgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5SW1wbAotICAgICAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWludGVyZmFjZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICBUaGUgY29ubmVjdGlvbi1pbnRlcmZhY2UgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBpbnRlcmZhY2Ugc3VwcG9ydGVkCi0gICAgICAgICAgICBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCSAgPGNvbm5lY3Rpb24taW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uCi0gICAgICAgICAgICAJICA8L2Nvbm5lY3Rpb24taW50ZXJmYWNlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWltcGwtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICAgICAgVGhlIGNvbm5lY3Rpb24taW1wbC1jbGFzc1R5cGUgc3BlY2lmaWVzIHRoZSBmdWxseQotICAgICAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gY2xhc3MgdGhhdAotICAgICAgICAgICAgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIENvbm5lY3Rpb24KLSAgICAgICAgICAgIGludGVyZmFjZS4gIEl0IGlzIHVzZWQgYnkgdGhlIGNvbm5lY3Rpb24taW1wbC1jbGFzcwotICAgICAgICAgICAgZWxlbWVudHMuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAkgIDxjb25uZWN0aW9uLWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uSW1wbAotICAgICAgICAgICAgCSAgPC9jb25uZWN0aW9uLWltcGwtY2xhc3M+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0b3JUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNvbm5lY3RvclR5cGUgZGVmaW5lcyBhIHJlc291cmNlIGFkYXB0ZXIuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibW9kdWxlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWxlbWVudCBtb2R1bGUtbmFtZSBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlCi0gICAgICAgICAgICByZXNvdXJjZSBhZGFwdGVyLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBJZiB0aGVyZSBpcyBubyBtb2R1bGUtbmFtZSBzcGVjaWZpZWQsIHRoZSBtb2R1bGUtbmFtZQotICAgICAgICAgICAgaXMgZGV0ZXJtaW5lZCBhcyBkZWZpbmVkIGluIFNlY3Rpb24gRUUuOC4xLjEgYW5kIEVFLjguMS4yIAotICAgICAgICAgICAgb2YgdGhlIEphdmEgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSmF2YSBFRSkgCi0gICAgICAgICAgICBTcGVjaWZpY2F0aW9uLCB2ZXJzaW9uIDYuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlbmRvci1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBlbGVtZW50IHZlbmRvci1uYW1lIHNwZWNpZmllcyB0aGUgbmFtZSBvZgotICAgICAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciB2ZW5kb3IuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIElmIHRoZXJlIGlzIG5vIHZlbmRvci1uYW1lIHNwZWNpZmllZCwgdGhlIGFwcGxpY2F0aW9uIAotICAgICAgICAgICAgc2VydmVyIG11c3QgY29uc2lkZXIgdGhlIGRlZmF1bHQgIiIgKGVtcHR5IHN0cmluZykgYXMKLSAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIHZlbmRvci4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVpcy10eXBlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBlbGVtZW50IGVpcy10eXBlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgICAgICAgICAgdHlwZSBvZiB0aGUgRUlTLiBGb3IgZXhhbXBsZSwgdGhlIHR5cGUgb2YgYW4gRUlTIGNhbgotICAgICAgICAgICAgYmUgcHJvZHVjdCBuYW1lIG9mIEVJUyBpbmRlcGVuZGVudCBvZiBhbnkgdmVyc2lvbgotICAgICAgICAgICAgaW5mby4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgVGhpcyBoZWxwcyBpbiBpZGVudGlmeWluZyBFSVMgaW5zdGFuY2VzIHRoYXQgY2FuIGJlCi0gICAgICAgICAgICB1c2VkIHdpdGggdGhpcyByZXNvdXJjZSBhZGFwdGVyLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBJZiB0aGVyZSBpcyBubyBlaXMtdHlwZSBzcGVjaWZpZWQsIHRoZSBhcHBsaWNhdGlvbiAKLSAgICAgICAgICAgIHNlcnZlciBtdXN0IGNvbnNpZGVyIHRoZSBkZWZhdWx0ICIiIChlbXB0eSBzdHJpbmcpIGFzCi0gICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgRUlTLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2VhZGFwdGVyLXZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGVsZW1lbnQgcmVzb3VyY2VhZGFwdGVyLXZlcnNpb24gc3BlY2lmaWVzIGEgc3RyaW5nLWJhc2VkIHZlcnNpb24KLSAgICAgICAgICAgIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIGZyb20gdGhlIHJlc291cmNlIGFkYXB0ZXIKLSAgICAgICAgICAgIHByb3ZpZGVyLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBJZiB0aGVyZSBpcyBubyByZXNvdXJjZWFkYXB0ZXItdmVyc2lvbiBzcGVjaWZpZWQsIHRoZSBhcHBsaWNhdGlvbiAKLSAgICAgICAgICAgIHNlcnZlciBtdXN0IGNvbnNpZGVyIHRoZSBkZWZhdWx0ICIiIChlbXB0eSBzdHJpbmcpIGFzCi0gICAgICAgICAgICB0aGUgdmVyc2lvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLSAgICAgICAgICAgIAkKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpY2Vuc2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxpY2Vuc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlYWRhcHRlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVzb3VyY2VhZGFwdGVyVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkLXdvcmstY29udGV4dCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWxlbWVudCByZXF1aXJlZC13b3JrLWNvbnRleHQgc3BlY2lmaWVzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIAotICAgICAgICAgICAgbmFtZSB0aGF0IGltcGxlbWVudHMgV29ya0NvbnRleHQgaW50ZXJmYWNlLCB0aGF0IHRoZSByZXNvdXJjZSBhZGFwdGVyIAotICAgICAgICAgICAgcmVxdWlyZXMgdGhlIGFwcGxpY2F0aW9uIHNlcnZlciB0byBzdXBwb3J0LgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgZml4ZWQ9IjEuNiIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIHZlcnNpb24gaW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgdG8gYmUgdXNlZCBieSB0aGUKLSAgICAgICAgICBkZXBsb3ltZW50IHRvb2wuIFRoaXMgZWxlbWVudCBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0LCBhbmQgdGhlIHJlc291cmNlIGFkYXB0ZXIgCi0gICAgICAgICAgZGV2ZWxvcGVyL2RlcGxveWVyIGlzIHJlcXVpcmVkIHRvIHNwZWNpZnkgaXQuIFRoZSBlbGVtZW50IGFsbG93cyB0aGUgZGVwbG95bWVudCAKLSAgICAgICAgICB0b29sIHRvIGNob29zZSB3aGljaCBzY2hlbWEgdG8gdmFsaWRhdGUgdGhlIGRlc2NyaXB0b3IgYWdhaW5zdC4KLSAgICAgICAgICAJICAKLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBkZWZpbmVzIHdoZXRoZXIgdGhlIGRlcGxveW1lbnQgCi0gICAgICAgICAgZGVzY3JpcHRvciBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlIGlzIGNvbXBsZXRlLCBvciB3aGV0aGVyCi0gICAgICAgICAgdGhlIGNsYXNzIGZpbGVzIGF2YWlsYWJsZSB0byB0aGUgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoIHRoZSByZXNvdXJjZSAKLSAgICAgICAgICBhZGFwdGVyIHNob3VsZCBiZSBleGFtaW5lZCBmb3IgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQgCi0gICAgICAgICAgaW5mb3JtYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgICAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQgdG9vbCBvZiB0aGUgCi0gICAgICAgICAgYXBwbGljYXRpb24gc2VydmVyIG11c3QgaWdub3JlIGFueSBhbm5vdGF0aW9ucyB0aGF0IHNwZWNpZnkgZGVwbG95bWVudCAKLSAgICAgICAgICBpbmZvcm1hdGlvbiwgd2hpY2ggbWlnaHQgYmUgcHJlc2VudCBpbiB0aGUgY2xhc3MgZmlsZXMgb2YgdGhlIAotICAgICAgICAgIGFwcGxpY2F0aW9uLklmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgc2V0IHRvICJmYWxzZSIsIAotICAgICAgICAgIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBleGFtaW5lIHRoZSBjbGFzcyBmaWxlcyBvZiB0aGUgYXBwbGljYXRpb24gZm9yIAotICAgICAgICAgIGFubm90YXRpb25zLCBhcyBzcGVjaWZpZWQgYnkgdGhpcyBzcGVjaWZpY2F0aW9uLiBJZiB0aGUgCi0gICAgICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIG5vdCBpbmNsdWRlZCBvciBpcyBpbmNsdWRlZCBidXQgbm90IG1hcmtlZCAKLSAgICAgICAgICBtZXRhZGF0YS1jb21wbGV0ZSwgdGhlIGRlcGxveW1lbnQgdG9vbCB3aWxsIHByb2Nlc3MgYW5ub3RhdGlvbnMuCi0gICAgICAgICAgCi0gICAgICAgICAgQXBwbGljYXRpb24gc2VydmVycyBtdXN0IGFzc3VtZSB0aGF0IG1ldGFkYXRhLWNvbXBsZXRlIGlzIHRydWUgZm9yIAotICAgICAgICAgIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlcyB3aXRoIGRlcGxveW1lbnQgZGVzY3JpcHRvciB2ZXJzaW9uIAotICAgICAgICAgIGxvd2VyIHRoYW4gMS42LgotICAgICAgICAgIAkJCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNyZWRlbnRpYWwtaW50ZXJmYWNlVHlwZSBzcGVjaWZpZXMgdGhlCi0gICAgICAgIGludGVyZmFjZSB0aGF0IHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uCi0gICAgICAgIHN1cHBvcnRzIGZvciB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlCi0gICAgICAgIGNyZWRlbnRpYWxzLiBUaGlzIGVsZW1lbnQocykgdGhhdCB1c2UgdGhpcyB0eXBlLAotICAgICAgICBpLmUuIGNyZWRlbnRpYWwtaW50ZXJmYWNlLCAgc2hvdWxkIGJlIHVzZWQgYnkKLSAgICAgICAgYXBwbGljYXRpb24gc2VydmVyIHRvIGZpbmQgb3V0IHRoZSBDcmVkZW50aWFsCi0gICAgICAgIGludGVyZmFjZSBpdCBzaG91bGQgdXNlIGFzIHBhcnQgb2YgdGhlIHNlY3VyaXR5Ci0gICAgICAgIGNvbnRyYWN0LgotICAgICAgICAKLSAgICAgICAgVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6Ci0gICAgICAgIAotICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsCi0gICAgICAgIG9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbAotICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuR2VuZXJpY0NyZWRlbnRpYWwKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib3JnLmlldGYuamdzcy5HU1NDcmVkZW50aWFsIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGluYm91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24KLSAgICAgICAgYWJvdXQgYW4gaW5ib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGNvbnRhaW5zIGluZm9ybWF0aW9uCi0gICAgICAgIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlcgotICAgICAgICBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBtZXNzYWdlYWRhcHRlciBlbGVtZW50LgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2VhZGFwdGVyIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXNzYWdlYWRhcHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWxpc3RlbmVyLXR5cGUtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBtZXNzYWdlbGlzdGVuZXItdHlwZSBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZQotICAgICAgICAgICAgICB1bmlxdWUgaW4gdGhlIG1lc3NhZ2VhZGFwdGVyLiBTZXZlcmFsIG1lc3NhZ2VsaXN0ZW5lcnMKLSAgICAgICAgICAgICAgY2FuIG5vdCB1c2UgdGhlIHNhbWUgbWVzc2FnZWxpc3RlbmVyLXR5cGUuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptZXNzYWdlbGlzdGVuZXIiLz4KLSAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6bWVzc2FnZWxpc3RlbmVyLXR5cGUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibGljZW5zZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbGljZW5zZVR5cGUgc3BlY2lmaWVzIGxpY2Vuc2luZyByZXF1aXJlbWVudHMgZm9yIHRoZQotICAgICAgICByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gVGhpcyB0eXBlIHNwZWNpZmllcyB3aGV0aGVyIGEKLSAgICAgICAgbGljZW5zZSBpcyByZXF1aXJlZCB0byBkZXBsb3kgYW5kIHVzZSB0aGlzIHJlc291cmNlIGFkYXB0ZXIsCi0gICAgICAgIGFuZCBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGljZW5zaW5nIHRlcm1zCi0gICAgICAgIChleGFtcGxlczogZHVyYXRpb24gb2YgbGljZW5zZSwgbnVtYmVyIG9mIGNvbm5lY3Rpb24KLSAgICAgICAgcmVzdHJpY3Rpb25zKS4gSXQgaXMgdXNlZCBieSB0aGUgbGljZW5zZSBlbGVtZW50LgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGljZW5zZS1yZXF1aXJlZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWxlbWVudCBsaWNlbnNlLXJlcXVpcmVkIHNwZWNpZmllcyB3aGV0aGVyIGEKLSAgICAgICAgICAgIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhlCi0gICAgICAgICAgICByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YKLSAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcsICJ0cnVlIiBvciAiZmFsc2UiLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2VhZGFwdGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXNzYWdlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgICAgICBtZXNzYWdpbmcgY2FwYWJpbGl0aWVzIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGlzCi0gICAgICAgIGNvbnRhaW5zIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZQotICAgICAgICBtZXNzYWdlbGlzdGVuZXIgZWxlbWVudC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlbGlzdGVuZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1lc3NhZ2VsaXN0ZW5lclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZWxpc3RlbmVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXNzYWdlbGlzdGVuZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhCi0gICAgICAgIHNwZWNpZmljIG1lc3NhZ2UgbGlzdGVuZXIgc3VwcG9ydGVkIGJ5IHRoZSBtZXNzYWdpbmcKLSAgICAgICAgcmVzb3VyY2UgYWRhcHRlci4gSXQgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIEphdmEgdHlwZQotICAgICAgICBvZiB0aGUgbWVzc2FnZSBsaXN0ZW5lciBpbnRlcmZhY2UgYW5kIGFuIGFjdGl2YXRpb24KLSAgICAgICAgc3BlY2lmaWNhdGlvbi4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlbGlzdGVuZXItdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICBUaGUgZWxlbWVudCBtZXNzYWdlbGlzdGVuZXItdHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIG9mIGEgbWVzc2FnZQotICAgICAgICAgICAgbGlzdGVuZXIgaW50ZXJmYWNlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGFtcGxlOgotICAgICAgICAgICAgCi0gICAgICAgICAgICAJPG1lc3NhZ2VsaXN0ZW5lci10eXBlPmphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIKLSAgICAgICAgICAgIAk8L21lc3NhZ2VsaXN0ZW5lci10eXBlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uc3BlYyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YWN0aXZhdGlvbnNwZWNUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQKLSAgICAgICAgYW4gb3V0Ym91bmQgcmVzb3VyY2UgYWRhcHRlci4gVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5Ci0gICAgICAgIHF1YWxpZmllZCBuYW1lcyBvZiBjbGFzc2VzL2ludGVyZmFjZXMgcmVxdWlyZWQgYXMgcGFydCBvZgotICAgICAgICB0aGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzIGZvcgotICAgICAgICBjb25uZWN0aW9uIG1hbmFnZW1lbnQsIGxldmVsIG9mIHRyYW5zYWN0aW9uIHN1cHBvcnQKLSAgICAgICAgcHJvdmlkZWQsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkCi0gICAgICAgIGFuZCBhZGRpdGlvbmFsIHJlcXVpcmVkIHNlY3VyaXR5IHBlcm1pc3Npb25zLgotICAgICAgICAKLSAgICAgICAgSWYgYW55IG9mIHRoZSBvdXRib3VuZCByZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnRzICh0cmFuc2FjdGlvbi1zdXBwb3J0LAotICAgICAgICBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20sIHJlYXV0aGVudGljYXRpb24tc3VwcG9ydCkgaXMgc3BlY2lmaWVkIHRocm91Z2gKLSAgICAgICAgdGhpcyBlbGVtZW50IG9yIG1ldGFkYXRhIGFubm90YXRpb25zLCBhbmQgbm8gIGNvbm5lY3Rpb24tZGVmaW5pdGlvbiBpcyAKLSAgICAgICAgc3BlY2lmaWVkIGFzIHBhcnQgb2YgdGhpcyBlbGVtZW50IG9yIHRocm91Z2ggYW5ub3RhdGlvbnMsIHRoZSAKLSAgICAgICAgYXBwbGljYXRpb24gc2VydmVyIG11c3QgY29uc2lkZXIgdGhpcyBhbiBlcnJvciBhbmQgZmFpbCBkZXBsb3ltZW50LiAKLSAgICAgICAgCi0gICAgICAgIElmIHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZWQgYXMgcGFydCBvZgotICAgICAgICB0aGlzIGVsZW1lbnQgb3IgbWV0YWRhdGEgYW5ub3RhdGlvbnMsIHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyAKLSAgICAgICAgbm90IHN1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMgCi0gICAgICAgIHBhcnQgb2Ygc2VjdXJpdHkgY29udHJhY3QuIFRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgaWdub3JlcyB0aGUgc2VjdXJpdHkgCi0gICAgICAgIHBhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLgotICAgICAgICAKLSAgICAgICAgSWYgdGhlcmUgaXMgbm8gdHJhbnNhY3Rpb24tc3VwcG9ydCBzcGVjaWZpZWQgYXMgcGFydCBvZiB0aGlzIGVsZW1lbnQgCi0gICAgICAgIG9yIG1ldGFkYXRhIGFubm90YXRpb24sIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHNlcnZlciBtdXN0IGNvbnNpZGVyIHRoYXQgCi0gICAgICAgIHRoZSByZXNvdXJjZSBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgZWl0aGVyIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGxvY2FsIAotICAgICAgICBvciBKVEEgdHJhbnNhY3Rpb25zIGFuZCBtdXN0IGNvbnNpZGVyIHRoZSB0cmFuc2FjdGlvbiBzdXBwb3J0IGFzIAotICAgICAgICBOb1RyYW5zYWN0aW9uLiBOb3RlIHRoYXQgcmVzb3VyY2UgYWRhcHRlcnMgbWF5IHNwZWNpZnkgdGhlIGxldmVsIG9mIAotICAgICAgICB0cmFuc2FjdGlvbiBzdXBwb3J0IHRvIGJlIHVzZWQgYXQgcnVudGltZSBmb3IgYSBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgCi0gICAgICAgIHRocm91Z2ggdGhlIFRyYW5zYWN0aW9uU3VwcG9ydCBpbnRlcmZhY2UuCi0gICAgICAgIAotICAgICAgICBJZiB0aGVyZSBpcyBubyByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgc3BlY2lmaWVkIGFzIHBhcnQgb2YKLSAgICAgICAgdGhpcyBlbGVtZW50IG9yIG1ldGFkYXRhIGFubm90YXRpb24sIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHNlcnZlciBtdXN0IGNvbnNpZGVyIAotICAgICAgICB0aGF0IHRoZSByZXNvdXJjZSBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgcmUtYXV0aGVudGljYXRpb24gb2YgCi0gICAgICAgIE1hbmFnZWRDb25uZWN0aW9ucy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWRlZmluaXRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNvbm5lY3Rpb24tZGVmaW5pdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNhY3Rpb24tc3VwcG9ydCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYXV0aGVudGljYXRpb24tc3VwcG9ydCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgCSAgICBUaGUgZWxlbWVudCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgc3BlY2lmaWVzCi0gICAgICAgICAgICAJICAgIHdoZXRoZXIgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMKLSAgICAgICAgICAgIAkgICAgcmUtYXV0aGVudGljYXRpb24gb2YgZXhpc3RpbmcgTWFuYWdlZC0gQ29ubmVjdGlvbgotICAgICAgICAgICAgCSAgICBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgZm9yIHRoZQotICAgICAgICAgICAgCSAgICByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZQotICAgICAgICAgICAgCSAgICB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhpcyBlbGVtZW50IG11c3QgaGF2ZQotICAgICAgICAgICAgCSAgICBlaXRoZXIgYSAidHJ1ZSIgb3IgImZhbHNlIiB2YWx1ZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgCSAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uCi0gICAgICAgIG9mIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgdXNlZCBmb3Igc3BlY2lmeWluZyBhCi0gICAgICAgIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZS4gSXQgaXMgdXNlZAotICAgICAgICBieSByZXF1aXJlZC1jb25maWctcHJvcGVydHkgZWxlbWVudHMuCi0gICAgICAgIAotICAgICAgICBVc2FnZSBvZiB0aGlzIHR5cGUgaXMgZGVwcmVjYXRlZCBmcm9tIENvbm5lY3RvcnMgMS42IHNwZWNpZmljYXRpb24uIAotICAgICAgICBSZWZlciB0byByZXF1aXJlZC1jb25maWctcHJvcGVydHkgZWxlbWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgICAgCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgIAotICAgICAgICA8cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+RGVzdGluYXRpb248L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICA8L3JlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlYWRhcHRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gICAgICAgIHJlc291cmNlIGFkYXB0ZXIuIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQKLSAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBKYXZhIGNsYXNzIG5hbWUsIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcywKLSAgICAgICAgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZQotICAgICAgICBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlCi0gICAgICAgIG91dGJvdW5kLXJlc291cmNlYWRhcHRlciBhbmQgaW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXIKLSAgICAgICAgZWxlbWVudHMsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgYWRtaW5pc3RlcmVkIG9iamVjdHMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2VhZGFwdGVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci1jbGFzcyBzcGVjaWZpZXMgdGhlCi0gICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzCi0gICAgICAgICAgICB0aGUgamF2YXgucmVzb3VyY2Uuc3BpLlJlc291cmNlQWRhcHRlcgotICAgICAgICAgICAgaW50ZXJmYWNlLiBUaGlzIEphdmEgY2xhc3MgaXMgcHJvdmlkZWQgYXMgcGFydCBvZgotICAgICAgICAgICAgcmVzb3VyY2UgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvcgotICAgICAgICAgICAgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhIEphdmFCZWFuLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpjb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im91dGJvdW5kLXJlc291cmNlYWRhcHRlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6b3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UgZWxlbWVudCBjb250ZW50Ci0gICAgICAgICAgICAgIG11c3QgYmUgdW5pcXVlIGluIHRoZSBvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXIuCi0gICAgICAgICAgICAgIE11bHRpcGxlIGNvbm5lY3Rpb24tZGVmaW5pdGlvbnMgY2FuIG5vdCB1c2UgdGhlCi0gICAgICAgICAgICAgIHNhbWUgY29ubmVjdGlvbmZhY3RvcnktdHlwZS4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmNvbm5lY3Rpb24tZGVmaW5pdGlvbiIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmJvdW5kLXJlc291cmNlYWRhcHRlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkbWlub2JqZWN0IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphZG1pbm9iamVjdFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iYWRtaW5vYmplY3QtdHlwZS11bmlxdWVuZXNzIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIGFkbWlub2JqZWN0LWludGVyZmFjZSBhbmQgYWRtaW5vYmplY3QtY2xhc3MgZWxlbWVudCBjb250ZW50IG11c3QgYmUKLSAgICAgICAgICAgICAgdW5pcXVlIGluIHRoZSByZXNvdXJjZWFkYXB0ZXJUeXBlLiBTZXZlcmFsIGFkbWluIG9iamVjdHMKLSAgICAgICAgICAgICAgY2FuIG5vdCB1c2UgdGhlIHNhbWUgYWRtaW5vYmplY3QtaW50ZXJmYWNlIGFuZCBhZG1pbm9iamVjdC1jbGFzcy4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmFkbWlub2JqZWN0Ii8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmFkbWlub2JqZWN0LWludGVyZmFjZSIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTphZG1pbm9iamVjdC1jbGFzcyIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXBlcm1pc3Npb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LXBlcm1pc3Npb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1wZXJtaXNzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBzZWN1cml0eS1wZXJtaXNzaW9uVHlwZSBzcGVjaWZpZXMgYSBzZWN1cml0eQotICAgICAgICBwZXJtaXNzaW9uIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgY29kZS4KLSAgICAgICAgCi0gICAgICAgIFRoZSBzZWN1cml0eSBwZXJtaXNzaW9uIGxpc3RlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICAgIGFyZSBvbmVzIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHJlcXVpcmVkIGJ5IHRoZQotICAgICAgICBkZWZhdWx0IHBlcm1pc3Npb24gc2V0IGFzIHNwZWNpZmllZCBpbiB0aGUgY29ubmVjdG9yCi0gICAgICAgIHNwZWNpZmljYXRpb24uIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBjYW4gbWVudGlvbiBzcGVjaWZpYwotICAgICAgICByZWFzb24gdGhhdCByZXNvdXJjZSBhZGFwdGVyIHJlcXVpcmVzIGEgZ2l2ZW4gc2VjdXJpdHkKLSAgICAgICAgcGVybWlzc2lvbi4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBlbGVtZW50IHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYyBzcGVjaWZpZXMgYSBzZWN1cml0eQotICAgICAgICAgICAgcGVybWlzc2lvbiBiYXNlZCBvbiB0aGUgU2VjdXJpdHkgcG9saWN5IGZpbGUKLSAgICAgICAgICAgIHN5bnRheC4gUmVmZXIgdG8gdGhlIGZvbGxvd2luZyBVUkwgZm9yIFN1bidzCi0gICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbgotICAgICAgICAgICAgc3BlY2lmaWNhdGlvbjoKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvc2VjdXJpdHkvUG9saWN5RmlsZXMuaHRtbAotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zYWN0aW9uLXN1cHBvcnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHRyYW5zYWN0aW9uLXN1cHBvcnRUeXBlIHNwZWNpZmllcyB0aGUgbGV2ZWwgb2YKLSAgICAgICAgdHJhbnNhY3Rpb24gc3VwcG9ydCBwcm92aWRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gSXQgaXMKLSAgICAgICAgdXNlZCBieSB0cmFuc2FjdGlvbi1zdXBwb3J0IGVsZW1lbnRzLgotICAgICAgICAKLSAgICAgICAgVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIAotICAgICAgICBOb1RyYW5zYWN0aW9uCi0gICAgICAgIExvY2FsVHJhbnNhY3Rpb24KLSAgICAgICAgWEFUcmFuc2FjdGlvbgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1RyYW5zYWN0aW9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWEFUcmFuc2FjdGlvbiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8xXzEuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzFfMS5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZDgzOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzFfMS5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw4OTQgKzAsMCBAQAotPCEtLQotQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiA5MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ0EgIDk0MzAzLCBVLlMuQS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi1UaGlzIHByb2R1Y3Qgb3IgZG9jdW1lbnQgaXMgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBhbmQgZGlzdHJpYnV0ZWQKLXVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIGl0cyB1c2UsIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiwgYW5kCi1kZWNvbXBpbGF0aW9uLiAgTm8gcGFydCBvZiB0aGlzIHByb2R1Y3Qgb3IgZG9jdW1lbnRhdGlvbiBtYXkgYmUKLXJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCi1vZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4gIAotCi1UaGlyZCBwYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMgY29weXJpZ2h0ZWQgYW5kIAotbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLiAKLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIExvZ28sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEgCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwgYW5kIEVudGVycHJpc2UgSmF2YUJlYW5zLCAKLWFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMgaW4gdGhlIFUuUy4gCi1hbmQgb3RoZXIgY291bnRyaWVzLgotCi1BbGwgU1BBUkMgdHJhZGVtYXJrcyBhcmUgdXNlZCB1bmRlciBsaWNlbnNlIGFuZCBhcmUgdHJhZGVtYXJrcwotb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFNQQVJDIEludGVybmF0aW9uYWwsIEluYy4KLWluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuIFByb2R1Y3RzIGJlYXJpbmcgU1BBUkMKLXRyYWRlbWFya3MgYXJlIGJhc2VkIHVwb24gYW4gYXJjaGl0ZWN0dXJlIGRldmVsb3BlZCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIAotCi1Qb3N0U2NyaXB0IGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcywgSW5jLiAKLQotIAotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzIFN1YmplY3QgdG8gCi1TdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0KLSAKLURPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQUxMIEVYUFJFU1MgT1IgSU1QTElFRAotQ09ORElUSU9OUywgUkVQUkVTRU5UQVRJT05TIEFORCBXQVJSQU5USUVTLCBJTkNMVURJTkcgQU5ZCi1JTVBMSUVEIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFIE9SIE5PTi1JTkZSSU5HRU1FTlQsIEFSRSBESVNDTEFJTUVELCBFWENFUFQKLVRPIFRIRSBFWFRFTlQgVEhBVCBTVUNIIERJU0NMQUlNRVJTIEFSRSBIRUxEIFRPIEJFIExFR0FMTFkKLUlOVkFMSUQuCi0KLV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLUNvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIAotOTAxIFNhbiBBbnRvbmlvIFJvYWQsIFBhbG8gQWx0bywgQ0EgIDk0MzAzLCBFdGF0cy1VbmlzLiAKLVRvdXMgZHJvaXRzIHJlJ3NlcnZlJ3MuCi0gCi0KLUNlIHByb2R1aXQgb3UgZG9jdW1lbnQgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0IGRpc3RyaWJ1ZScgYXZlYyAKLWRlcyBsaWNlbmNlcyBxdWkgZW4gcmVzdHJlaWduZW50IGwndXRpbGlzYXRpb24sIGxhIGNvcGllLCBsYSBkaXN0cmlidXRpb24sCi1ldCBsYSBkZSdjb21waWxhdGlvbi4gIEF1Y3VuZSBwYXJ0aWUgZGUgY2UgcHJvZHVpdCBvdSBkZSBzYSBkb2N1bWVudGF0aW9uCi1hc3NvY2llJ2UgbmUgcGV1dCBlXnRyZSByZXByb2R1aXRlIHNvdXMgYXVjdW5lIGZvcm1lLCBwYXIgcXVlbHF1ZSBtb3llbiAKLXF1ZSBjZSBzb2l0LCBzYW5zIGwnYXV0b3Jpc2F0aW9uIHByZSdhbGFibGUgZXQgZSdjcml0ZSBkZSBTdW4gZXQgZGUgc2VzIAotYmFpbGxldXJzIGRlIGxpY2VuY2UsIHMnaWwgeSBlbiBhLiAgCi0KLUxlIGxvZ2ljaWVsIGRlJ3RlbnUgcGFyIGRlcyB0aWVycywgZXQgcXVpIGNvbXByZW5kIGxhIHRlY2hub2xvZ2llIAotcmVsYXRpdmUgYXV4IHBvbGljZXMgZGUgY2FyYWN0ZWByZXMsIGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCAKLWV0IGxpY2VuY2llJyBwYXIgZGVzIGZvdXJuaXNzZXVycyBkZSBTdW4uCi0gCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIGxlIGxvZ28gU3VuLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhIAotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCBKREJDLCBKREssIEphdmFNYWlsLCBldCBFbnRlcnByaXNlIEphdmFCZWFucywgIAotc29udCBkZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcyBkZSdwb3NlJ2VzIGRlIFN1biAKLU1pY3Jvc3lzdGVtcywgSW5jLiBhdXggRXRhdHMtVW5pcyBldCBkYW5zIGQnYXV0cmVzIHBheXMuCi0gCi1Ub3V0ZXMgbGVzIG1hcnF1ZXMgU1BBUkMgc29udCB1dGlsaXNlJ2VzIHNvdXMgbGljZW5jZSBldCBzb250Ci1kZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcyBkZSdwb3NlJ2VzIGRlIFNQQVJDCi1JbnRlcm5hdGlvbmFsLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0ICBkYW5zCi1kJ2F1dHJlcyBwYXlzLiBMZXMgcHJvZHVpdHMgcG9ydGFudCBsZXMgbWFycXVlcyBTUEFSQyBzb250Ci1iYXNlJ3Mgc3VyIHVuZSBhcmNoaXRlY3R1cmUgZGUndmVsb3BwZSdlIHBhciBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICAKLQotUG9zdGNyaXB0IGVzdCB1bmUgbWFycXVlIGVucmVnaXN0cmUnZSBkJ0Fkb2JlIFN5c3RlbXMgSW5jLiAKLSAKLUxBIERPQ1VNRU5UQVRJT04gRVNUIEZPVVJOSUUgIkVOIEwnRVRBVCIgRVQgVE9VVEVTIEFVVFJFUyBDT05ESVRJT05TLAotREVDTEFSQVRJT05TIEVUIEdBUkFOVElFUyBFWFBSRVNTRVMgT1UgVEFDSVRFUyBTT05UIEZPUk1FTExFTUVOVCBFWENMVUVTLAotREFOUyBMQSBNRVNVUkUgQVVUT1JJU0VFIFBBUiBMQSBMT0kgQVBQTElDQUJMRSwgWSBDT01QUklTIE5PVEFNTUVOVAotVE9VVEUgR0FSQU5USUUgSU1QTElDSVRFIFJFTEFUSVZFIEEgTEEgUVVBTElURSBNQVJDSEFOREUsIEEgTCdBUFRJVFVERQotQSBVTkUgVVRJTElTQVRJT04gUEFSVElDVUxJRVJFIE9VIEEgTCdBQlNFTkNFIERFIENPTlRSRUZBQ09OLgotLS0+Ci0KLQotPCEtLQotVGhpcyBpcyB0aGUgWE1MIERURCBmb3IgdGhlIEVKQiAxLjEgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci0KLQotPCEtLQotVGhlIGFzc2VtYmx5LWRlc2NyaXB0b3IgZWxlbWVudCBjb250YWlucyBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4KLQotVGhlIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFydHM6Ci10aGUgZGVmaW5pdGlvbiBvZiBzZWN1cml0eSByb2xlcywgdGhlIGRlZmluaXRpb24gb2YgbWV0aG9kIHBlcm1pc3Npb25zLAotYW5kIHRoZSBkZWZpbml0aW9uIG9mIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aAotY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24uCi0KLUFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlCi1saXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcwotb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0KLVVzZWQgaW46IGVqYi1qYXIKLS0tPgotPCFFTEVNRU5UIGFzc2VtYmx5LWRlc2NyaXB0b3IgKHNlY3VyaXR5LXJvbGUqLCBtZXRob2QtcGVybWlzc2lvbiosCi0JCWNvbnRhaW5lci10cmFuc2FjdGlvbiopPgotCi08IS0tCi1UaGUgY21wLWZpZWxkIGVsZW1lbnQgZGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZSBmaWVsZAotZWxlbWVudCBpbmNsdWRlcyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsIGFuZCB0aGUgbmFtZSBvZgotdGhlIGZpZWxkLgotCi1Vc2VkIGluOiBlbnRpdHkKLS0tPgotPCFFTEVNRU5UIGNtcC1maWVsZCAoZGVzY3JpcHRpb24/LCBmaWVsZC1uYW1lKT4KLQotPCEtLQotVGhlIGNvbnRhaW5lci10cmFuc2FjdGlvbiBlbGVtZW50IHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0Ci1tYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kIGludm9jYXRpb25zLgotVGhlIGVsZW1lbnQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdCBvZiBtZXRob2QKLWVsZW1lbnRzLCBhbmQgYSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUuVGhlIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBpcyB0bwotYmUgYXBwbGllZCB0byBhbGwgdGhlIHNwZWNpZmllZCBtZXRob2RzLgotCi1Vc2VkIGluOiBhc3NlbWJseS1kZXNjcmlwdG9yCi0tLT4KLTwhRUxFTUVOVCBjb250YWluZXItdHJhbnNhY3Rpb24gKGRlc2NyaXB0aW9uPywgbWV0aG9kKywKLQkJdHJhbnMtYXR0cmlidXRlKT4KLQotPCEtLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUKLXRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuCi0KLVRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyCi1maWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUKLShpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZQotY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudAotZWxlbWVudC4KLQotVXNlZCBpbjogY21wLWZpZWxkLCBjb250YWluZXItdHJhbnNhY3Rpb24sIGVqYi1qYXIsIGVudGl0eSwgZW52LWVudHJ5LAotZWpiLXJlZiwgbWV0aG9kLCBtZXRob2QtcGVybWlzc2lvbiwgcmVzb3VyY2UtcmVmLCBzZWN1cml0eS1yb2xlLAotc2VjdXJpdHktcm9sZS1yZWYsIGFuZCBzZXNzaW9uLgotLS0+Ci08IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLWRpc3BsYXkgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGVqYi1qYXIsIHNlc3Npb24sIGFuZCBlbnRpdHkKLQotRXhhbXBsZToKLQk8ZGlzcGxheS1uYW1lPkVtcGxveWVlIFNlbGYgU2VydmljZTwvZGlzcGxheS1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZGlzcGxheS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUKLWVudGVycHJpc2UgYmVhbidzIGNsYXNzLgotCi1Vc2VkIGluOiBlbnRpdHkgYW5kIHNlc3Npb24KLQotRXhhbXBsZToKLQkJPGVqYi1jbGFzcz5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlQmVhbjwvZWpiLWNsYXNzPgotLS0+Ci08IUVMRU1FTlQgZWpiLWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG9wdGlvbmFsIGVqYi1jbGllbnQtamFyIGVsZW1lbnQgc3BlY2lmaWVzIGEgSkFSIGZpbGUgdGhhdCBjb250YWlucwotdGhlIGNsYXNzIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYSBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlIGVudGVycHJpc2UKLWJlYW5zIGluIHRoZSBlamItamFyIGZpbGUuIFRoZSBEZXBsb3llciBzaG91bGQgbWFrZSB0aGUgZWpiLWNsaWVudCBKQVIKLWZpbGUgYWNjZXNzaWJsZSB0byB0aGUgY2xpZW50J3MgY2xhc3MtbG9hZGVyLgotCi1Vc2VkIGluOiBlamItamFyCi0KLUV4YW1wbGU6Ci0JPGVqYi1jbGllbnQtamFyPmVtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphcjwvZWpiLWNsaWVudC1qYXI+Ci0tLT4KLTwhRUxFTUVOVCBlamItY2xpZW50LWphciAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItamFyIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlamItamFyIGZpbGUsCi1vcHRpb25hbCBkaXNwbGF5IG5hbWUsIG9wdGlvbmFsIHNtYWxsIGljb24gZmlsZSBuYW1lLCBvcHRpb25hbCBsYXJnZQotaWNvbiBmaWxlIG5hbWUsIG1hbmRhdG9yeSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBpbmNsdWRlZAotZW50ZXJwcmlzZSBiZWFucywgb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvciwgYW5kIGFuCi1vcHRpb25hbCBuYW1lIG9mIGFuIGVqYi1jbGllbnQtamFyIGZpbGUgZm9yIHRoZSBlamItamFyLgotLS0+Ci08IUVMRU1FTlQgZWpiLWphciAoZGVzY3JpcHRpb24/LCBkaXNwbGF5LW5hbWU/LCBzbWFsbC1pY29uPywKLQkJbGFyZ2UtaWNvbj8sIGVudGVycHJpc2UtYmVhbnMsIGFzc2VtYmx5LWRlc2NyaXB0b3I/LAotCQllamItY2xpZW50LWphcj8pPgotCi08IS0tCi1UaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBlamItcmVmIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGF0IGFuCi1FSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbm90aGVyIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgZWpiLWphcgotZmlsZS4KLQotVGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuIGVudGVycHJpc2UKLWJlYW4gaW4gdGhlIHNhbWUgZWpiLWphciBmaWxlLCBvciBpbiBhbm90aGVyIGVqYi1qYXIgZmlsZSBpbiB0aGUgc2FtZQotSjJFRSBhcHBsaWNhdGlvbiB1bml0LgotCi1Vc2VkIGluOiBlamItcmVmCi0KLUV4YW1wbGU6Ci0JCTxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0tLT4KLTwhRUxFTUVOVCBlamItbGluayAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyBuYW1lLiBUaGlzIG5hbWUgaXMKLWFzc2lnbmVkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gbmFtZSB0aGUgZW50ZXJwcmlzZSBiZWFuIGluCi10aGUgZWpiLWphciBmaWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSBhbW9uZwotdGhlIG5hbWVzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZS4KLQotVGhlIGVudGVycHJpc2UgYmVhbiBjb2RlIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgbmFtZTsgdGhlcmVmb3JlIHRoZQotbmFtZSBjYW4gYmUgY2hhbmdlZCBkdXJpbmcgdGhlIGFwcGxpY2F0aW9uLWFzc2VtYmx5IHByb2Nlc3Mgd2l0aG91dAotYnJlYWtpbmcgdGhlIGVudGVycHJpc2UgYmVhbidzIGZ1bmN0aW9uLgotCi1UaGVyZSBpcyBubyBhcmNoaXRlY3RlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZWpiLW5hbWUgaW4gdGhlCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIHRoZSBKTkRJIG5hbWUgdGhhdCB0aGUgRGVwbG95ZXIgd2lsbCBhc3NpZ24KLXRvIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBob21lLgotCi1UaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0KLVVzZWQgaW46IGVudGl0eSwgbWV0aG9kLCBhbmQgc2Vzc2lvbgotCi1FeGFtcGxlOgotCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVqYi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8KLWFub3RoZXIgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbjsgdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSByZWZlcmVuY2luZwotZW50ZXJwcmlzZSBiZWFuOyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW47Ci10aGUgZXhwZWN0ZWQgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZQotYmVhbjsgYW5kIGFuIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLgotCi1UaGUgb3B0aW9uYWwgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQKLWVudGVycHJpc2UgYmVhbi4gSXQgaXMgdXNlZCB0eXBpY2FsbHkgaW4gZWpiLWphciBmaWxlcyB0aGF0IGNvbnRhaW4gYW4KLWFzc2VtYmxlZCBhcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogZW50aXR5IGFuZCBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCBlamItcmVmIChkZXNjcmlwdGlvbj8sIGVqYi1yZWYtbmFtZSwgZWpiLXJlZi10eXBlLCBob21lLAotCQlyZW1vdGUsIGVqYi1saW5rPyk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCCi1yZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGVudmlyb25tZW50LgotCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLVVzZWQgaW46IGVqYi1yZWYKLQotRXhhbXBsZToKLQkJPGVqYi1yZWYtbmFtZT5lamIvUGF5cm9sbDwvZWpiLXJlZi1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkCi1lbnRlcnByaXNlIGJlYW4uCi0KLVRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCQk8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotCQk8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLQotVXNlZCBpbjogZWpiLXJlZgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudGVycHJpc2UtYmVhbnMgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIG9mIG9uZSBvciBtb3JlCi1lbnRlcnByaXNlIGJlYW5zLgotLS0+Ci08IUVMRU1FTlQgZW50ZXJwcmlzZS1iZWFucyAoc2Vzc2lvbiB8IGVudGl0eSkrPgotCi08IS0tCi1UaGUgZW50aXR5IGVsZW1lbnQgZGVjbGFyZXMgYW4gZW50aXR5IGJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cwotb2Y6IGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBvcHRpb25hbCBkaXNwbGF5IG5hbWU7IG9wdGlvbmFsIHNtYWxsIGljb24KLWZpbGUgbmFtZTsgb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlIG5hbWU7IGEgbmFtZSBhc3NpZ25lZCB0byB0aGUKLWVudGVycHJpc2UgYmVhbiBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eQotYmVhbidzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzOyB0aGUgZW50aXR5IGJlYW4ncyBpbXBsZW1lbnRhdGlvbgotY2xhc3M7IHRoZSBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlIG1hbmFnZW1lbnQgdHlwZTsgdGhlIGVudGl0eSBiZWFuJ3MKLXByaW1hcnkga2V5IGNsYXNzIG5hbWU7IGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeTsKLWFuIG9wdGlvbmFsIGxpc3Qgb2YgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzOyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uCi1vZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQ7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLWVudmlyb25tZW50IGVudHJpZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCCi1yZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzOwotYW5kIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uCi1mYWN0b3J5IHJlZmVyZW5jZXMuCi0KLVRoZSBvcHRpb25hbCBwcmlta2V5LWZpZWxkIG1heSBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yIGlmIHRoZQotZW50aXR5J3MgcGVyc2lzdGVuY3ktdHlwZSBpcyBDb250YWluZXIuCi0KLVRoZSBvdGhlciBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UgdGhhdAotdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0KLUF0IGxlYXN0IG9uZSBjbXAtZmllbGQgZWxlbWVudCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYgdGhlCi1lbnRpdHkncyBwZXJzaXN0ZW5jeS10eXBlIGlzIENvbnRhaW5lciwgYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZgotdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQmVhbi4KLQotVXNlZCBpbjogZW50ZXJwcmlzZS1iZWFucwotLS0+Ci08IUVMRU1FTlQgZW50aXR5IChkZXNjcmlwdGlvbj8sIGRpc3BsYXktbmFtZT8sIHNtYWxsLWljb24/LAotCQlsYXJnZS1pY29uPywgZWpiLW5hbWUsIGhvbWUsIHJlbW90ZSwgZWpiLWNsYXNzLAotCQlwZXJzaXN0ZW5jZS10eXBlLCBwcmltLWtleS1jbGFzcywgcmVlbnRyYW50LAotCQljbXAtZmllbGQqLCBwcmlta2V5LWZpZWxkPywgZW52LWVudHJ5KiwKLQkJZWpiLXJlZiosIHNlY3VyaXR5LXJvbGUtcmVmKiwgcmVzb3VyY2UtcmVmKik+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnkgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWVudmlyb25tZW50IGVudHJpZXMuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYW5kIGFuIG9wdGlvbmFsIHZhbHVlLgotCi1Vc2VkIGluOiBlbnRpdHkgYW5kIHNlc3Npb24KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeSAoZGVzY3JpcHRpb24/LCBlbnYtZW50cnktbmFtZSwgZW52LWVudHJ5LXR5cGUsCi0JCWVudi1lbnRyeS12YWx1ZT8pPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncwotZW52aXJvbm1lbnQgZW50cnkuCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotCQk8ZW52LWVudHJ5LW5hbWU+bWluQW1vdW50PC9lbnYtZW50cnktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YKLXRoZSBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSBlbnRlcnByaXNlIGJlYW4ncwotY29kZS4KLQotVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZToKLWphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciwKLWphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5CeXRlLCBqYXZhLmxhbmcuU2hvcnQsIGphdmEubGFuZy5Mb25nLCBhbmQKLWphdmEubGFuZy5GbG9hdC4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0KLUV4YW1wbGU6Ci0JCTxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWVudmlyb25tZW50IGVudHJ5LgotCi1Vc2VkIGluOiBlbnYtZW50cnkKLQotRXhhbXBsZToKLQkJPGVudi1lbnRyeS12YWx1ZT4xMDAuMDA8L2Vudi1lbnRyeS12YWx1ZT4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS12YWx1ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBmaWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY29udGFpbmVyIG1hbmFnZWQgZmllbGQuCi1UaGUgbmFtZSBtdXN0IGJlIGEgcHVibGljIGZpZWxkIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3Igb25lIG9mCi1pdHMgc3VwZXJjbGFzc2VzLgotCi1Vc2VkIGluOiBjbXAtZmllbGQKLQotRXhhbXBsZToKLQkJPGZpZWxkLW5hbWU+Zmlyc3ROYW1lPC9maWVsZC1OYW1lPgotLS0+Ci08IUVMRU1FTlQgZmllbGQtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlCi1iZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IGVqYi1yZWYsIGVudGl0eSwgYW5kIHNlc3Npb24KLQotRXhhbXBsZToKLQkJPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8L2hvbWU+Ci0tLT4KLTwhRUxFTUVOVCBob21lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIGxhcmdlCi0oMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgZWpiLWphcgotZmlsZS4KLQotVGhlIGltYWdlIG11c3QgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQsIGFuZCB0aGUgZmlsZSBuYW1lCi1tdXN0IGVuZCB3aXRoIHRoZSBzdWZmaXggIi5qcGciIG9yICIuZ2lmIiByZXNwZWN0aXZlbHkuICBUaGUgaWNvbiBjYW4KLWJlIHVzZWQgYnkgdG9vbHMuCi0KLUV4YW1wbGU6Ci0JPGxhcmdlLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgotLS0+Ci08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBtZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncwotaG9tZSBvciByZW1vdGUgaW50ZXJmYWNlLCBvciBhIHNldCBvZiBtZXRob2RzLiBUaGUgZWpiLW5hbWUgZWxlbWVudAotbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gZGVjbGFyZWQgaW4gdGhlCi1kZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyB0bwotZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSB0aGF0IGlzIGRlZmluZWQgaW4KLWJvdGggdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2U7IHRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcwotdGhlIG1ldGhvZCBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsIG1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkgYQotc2luZ2xlIG1ldGhvZCBhbW9uZyBtdWx0aXBsZSBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBtZXRob2QgbmFtZS4KLQotVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgc3ludGF4OgotCi0xLiAJPG1ldGhvZD4KLQkJPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgCQk8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci0JPC9tZXRob2Q+Ci0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIHNwZWNpZmllZAotICAgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMuCi0KLTIuIAk8bWV0aG9kPgotCQk8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAJCTxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotCTwvbWV0aG9kPj4KLQotICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mIHRoZQotICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1ldGhvZHMgd2l0aAotICAgdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZiB0aGlzIHN0eWxlIHJlZmVycyB0bwotICAgYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQgbmFtZS4KLQotCi0KLQotCi0zLiAJPG1ldGhvZD4KLQkJPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgCQk8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLQkJPG1ldGhvZC1wYXJhbXM+Ci0gICAJCQk8bWV0aG9kLXBhcmFtPlBBUkFNLTE8L21ldGhvZC1wYXJhbT4KLSAgIAkJCTxtZXRob2QtcGFyYW0+UEFSQU0tMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgIAkJCS4uLgotICAgCQkJPG1ldGhvZC1wYXJhbT5QQVJBTS1uPC9tZXRob2QtcGFyYW0+Ci0JCTwvbWV0aG9kLXBhcmFtcz4KLQk8bWV0aG9kPgkKLQotICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYSBzZXQgb2YKLSAgIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaCBQQVJBTS1uIGFyZSB0aGUKLSAgIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZSBtZXRob2QncyBpbnB1dCBwYXJhbWV0ZXJzIChpZgotICAgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQgYXJndW1lbnRzLCB0aGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50Ci0gICBjb250YWlucyBubyBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUKLSAgIGFycmF5IGVsZW1lbnQncyB0eXBlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwYWlyIG9mIHNxdWFyZQotICAgYnJhY2tldHMgKGUuZy4gaW50W11bXSkuCi0KLQotVXNlZCBpbjogbWV0aG9kLXBlcm1pc3Npb24gYW5kIGNvbnRhaW5lci10cmFuc2FjdGlvbgotCi1FeGFtcGxlczoKLQotICAgIFN0eWxlIDE6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgbWV0aG9kcyBvZgotCQl0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlczoKLQotCQk8bWV0aG9kPgotCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JCQk8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci0JCTwvbWV0aG9kPgotCi0JU3R5bGUgMjogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZSBjcmVhdGUKLQkJbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZToKLQotICAgIAkJPG1ldGhvZD4KLQkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JCTwvbWV0aG9kPgotCi0JU3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlCi0JCWNyZWF0ZShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgTGFzdE5hbWUpIG1ldGhvZCBvZiB0aGUKLQkgCUVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0KLSAgICAJCTxtZXRob2Q+Ci0JCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkJCTxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCQkJPG1ldGhvZC1wYXJhbXM+Ci0JCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCQk8L21ldGhvZC1wYXJhbXM+Ci0JCTwvbWV0aG9kPgotCi0JCi0JVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgU3R5bGUgMyBlbGVtZW50IHdpdGgKLQltb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kCi0JCQlmb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLAotCQkJCW15cGFja2FnZS5NeUNsYXNzW11bXSBteWNsYWFyKQotICAgICAgICB3b3VsZCBiZSBzcGVjaWZpZWQgYXM6Ci0KLSAgICAJCTxtZXRob2Q+Ci0JCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkJCTxtZXRob2QtbmFtZT5mb29iYXI8L21ldGhvZC1uYW1lPgotCQkJPG1ldGhvZC1wYXJhbXM+Ci0JCQkJPG1ldGhvZC1wYXJhbT5jaGFyPC9tZXRob2QtcGFyYW0+Ci0JCQkJPG1ldGhvZC1wYXJhbT5pbnQ8L21ldGhvZC1wYXJhbT4KLQkJCQk8bWV0aG9kLXBhcmFtPmludFtdPC9tZXRob2QtcGFyYW0+Ci0JCQkJPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzczwvbWV0aG9kLXBhcmFtPgotCQkJCTxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3NbXVtdPC9tZXRob2QtcGFyYW0+Ci0JCQk8L21ldGhvZC1wYXJhbXM+Ci0JCTwvbWV0aG9kPgotCi0JVGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2hlbiBpdCBiZWNvbWVzCi0gICBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUKLSAgIGludGVyZmFjZSBhbmQgYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBzaWduYXR1cmUgdGhhdCBpcwotICAgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZS4KLQotCUZvciBleGFtcGxlLCB0aGUgbWV0aG9kIGVsZW1lbnQKLQotICAgCQk8bWV0aG9kPgotCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JCQk8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLQkJCTxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCQkJPG1ldGhvZC1wYXJhbXM+Ci0JCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCQk8L21ldGhvZC1wYXJhbXM+Ci0JCTwvbWV0aG9kPgotCi0JY2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKSBtZXRob2QKLSAgIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgZnJvbSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKQotICAgbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUgaW50ZXJmYWNlLCB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLSAgIAkJPG1ldGhvZD4KLQkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCQkJPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotCQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JCQk8bWV0aG9kLXBhcmFtcz4KLQkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJCTwvbWV0aG9kLXBhcmFtcz4KLQkJPC9tZXRob2Q+Ci0KLS0tPgotPCFFTEVNRU5UIG1ldGhvZCAoZGVzY3JpcHRpb24/LCBlamItbmFtZSwgbWV0aG9kLWludGY/LCBtZXRob2QtbmFtZSwKLQkJCW1ldGhvZC1wYXJhbXM/KT4KLQotPCEtLQotVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIGEgbWV0aG9kIGVsZW1lbnQgdG8gZGlmZmVyZW50aWF0ZQotYmV0d2VlbiB0aGUgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHNpZ25hdHVyZSB0aGF0IGFyZSBkZWZpbmVkCi1pbiBib3RoIHRoZSByZW1vdGUgYW5kIGhvbWUgaW50ZXJmYWNlcy4KLQotVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkJPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotCQk8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLQotVXNlZCBpbjogbWV0aG9kCi0tLT4KLTwhRUxFTUVOVCBtZXRob2QtaW50ZiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBtZXRob2QtbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4gbWV0aG9kLAotb3IgdGhlIGFzdGVyaXNrICgqKSBjaGFyYWN0ZXIuIFRoZSBhc3RlcmlzayBpcyB1c2VkIHdoZW4gdGhlIGVsZW1lbnQKLWRlbm90ZXMgYWxsIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIHJlbW90ZSBhbmQgaG9tZQotaW50ZXJmYWNlcy4KLQotVXNlZCBpbjogbWV0aG9kCi0tLT4KLTwhRUxFTUVOVCBtZXRob2QtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBtZXRob2QtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lIG9mCi1hIG1ldGhvZCBwYXJhbWV0ZXIuCi0KLVVzZWQgaW46IG1ldGhvZC1wYXJhbXMKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1wYXJhbSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQgY29udGFpbnMgYSBsaXN0IG9mIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YQotdHlwZSBuYW1lcyBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMuCi0KLVVzZWQgaW46IG1ldGhvZAotLS0+Ci08IUVMRU1FTlQgbWV0aG9kLXBhcmFtcyAobWV0aG9kLXBhcmFtKik+Ci0KLTwhLS0KLVRoZSBtZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlIHNlY3VyaXR5IHJvbGVzCi1hcmUgYWxsb3dlZCB0byBpbnZva2Ugb25lIG9yIG1vcmUgZW50ZXJwcmlzZSBiZWFuIG1ldGhvZHMuIFRoZQotbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0Ci1vZiBzZWN1cml0eSByb2xlIG5hbWVzLCBhbmQgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cy4KLQotVGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgbXVzdCBiZQotZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGFuZAotdGhlIG1ldGhvZHMgbXVzdCBiZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIHJlbW90ZQotYW5kL29yIGhvbWUgaW50ZXJmYWNlcy4KLQotVXNlZCBpbjogYXNzZW1ibHktZGVzY3JpcHRvcgotLS0+Ci08IUVMRU1FTlQgbWV0aG9kLXBlcm1pc3Npb24gKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKywgbWV0aG9kKyk+Ci0KLTwhLS0KLVRoZSBwZXJzaXN0ZW5jZS10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIGFuIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UKLW1hbmFnZW1lbnQgdHlwZS4KLQotVGhlIHBlcnNpc3RlbmNlLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQkJPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLQkJPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotCi1Vc2VkIGluOiBlbnRpdHkKLS0tPgotPCFFTEVNRU5UIHBlcnNpc3RlbmNlLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcHJpbS1rZXktY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KLWVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MuCi0KLUlmIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBpcyBkZWZlcnJlZCB0byBkZXBsb3ltZW50Ci10aW1lLCB0aGUgcHJpbS1rZXktY2xhc3MgZWxlbWVudCBzaG91bGQgc3BlY2lmeSBqYXZhLmxhbmcuT2JqZWN0LgotCi1Vc2VkIGluOiBlbnRpdHkKLQotRXhhbXBsZXM6Ci0JPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ByaW0ta2V5LWNsYXNzPgotCTxwcmltLWtleS1jbGFzcz5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVJRDwvcHJpbS1rZXktY2xhc3M+Ci0JPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5PYmplY3Q8L3ByaW0ta2V5LWNsYXNzPgotCi0tLT4KLTwhRUxFTUVOVCBwcmltLWtleS1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5Ci1rZXkgZmllbGQgZm9yIGFuIGVudGl0eSB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLgotCi1UaGUgcHJpbWtleS1maWVsZCBtdXN0IGJlIG9uZSBvZiB0aGUgZmllbGRzIGRlY2xhcmVkIGluIHRoZSBjbXAtZmllbGQKLWVsZW1lbnQsIGFuZCB0aGUgdHlwZSBvZiB0aGUgZmllbGQgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJpbWFyeSBrZXkKLXR5cGUuCi0KLVRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgbm90IHVzZWQgaWYgdGhlIHByaW1hcnkga2V5IG1hcHMgdG8KLW11bHRpcGxlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcyAoaS5lLiB0aGUga2V5IGlzIGEgY29tcG91bmQga2V5KS4gSW4KLXRoaXMgY2FzZSwgdGhlIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBwdWJsaWMsIGFuZAotdGhlaXIgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZCBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4gY2xhc3MKLXRoYXQgY29tcHJpc2UgdGhlIGtleS4KLQotVXNlZCBpbjogZW50aXR5Ci0KLUV4YW1wbGU6Ci0JPHByaW1rZXktZmllbGQ+RW1wbG95ZWVJZDwvcHJpbWtleS1maWVsZD4KLS0tPgotPCFFTEVNRU5UIHByaW1rZXktZmllbGQgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVlbnRyYW50IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYW4gZW50aXR5IGJlYW4gaXMgcmVlbnRyYW50IG9yIG5vdC4KLQotVGhlIHJlZW50cmFudCBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCQk8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLQkJPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotCi1Vc2VkIGluOiBlbnRpdHkKLS0tPgotPCFFTEVNRU5UIHJlZW50cmFudCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UKLWJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItcmVmLCBlbnRpdHksIGFuZCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0JCTxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotLS0+Ci08IUVMRU1FTlQgcmVtb3RlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlIHNpZ25zCi1vbiBwcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvciB3aGV0aGVyIHRoZSBDb250YWluZXIKLXdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlIGJlYW4uIEluIHRoZQotbGF0dGVyIGNhc2UsIHRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQotRGVwbG95ZXIuCi0KLVRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0JCTxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0JCTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotLS0+Ci08IUVMRU1FTlQgcmVzLWF1dGggKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgbWFuYWdlcgotY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEgc291cmNlLiBUaGUgdHlwZSBpcwotc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZSAob3IgY2xhc3MpIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkCi1ieSB0aGUgZGF0YSBzb3VyY2UuCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBlbnRlcnByaXNlIGJlYW4ncwotcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwKLXRoZSBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlIGV4cGVjdGVkCi1ieSB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUsIGFuZCB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbiAoYmVhbiBvcgotY29udGFpbmVyKS4KLQotVXNlZCBpbjogZW50aXR5IGFuZCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0JCTxyZXNvdXJjZS1yZWY+Ci0JCQk8cmVzLXJlZi1uYW1lPkVtcGxveWVlQXBwREI8L3Jlcy1yZWYtbmFtZT4KLQkJCTxyZXMtdHlwZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvcmVzLXR5cGU+Ci0JCQk8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLQkJPC9yZXNvdXJjZS1yZWY+Ci0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1yZWYgKGRlc2NyaXB0aW9uPywgcmVzLXJlZi1uYW1lLCByZXMtdHlwZSwKLQkJCXJlcy1hdXRoKT4KLQotPCEtLQotVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIHVzZWQgdG8gbGluayBhIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIHRvIGEKLWRlZmluZWQgc2VjdXJpdHkgcm9sZS4gVGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbiB0aGUgbmFtZSBvZgotb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotCi1Vc2VkIGluOiBzZWN1cml0eS1yb2xlLXJlZgotLS0+Ci08IUVMRU1FTlQgcm9sZS1saW5rICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQotVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi1Vc2VkIGluOiBtZXRob2QtcGVybWlzc2lvbiwgc2VjdXJpdHktcm9sZSwgYW5kIHNlY3VyaXR5LXJvbGUtcmVmCi0tLT4KLTwhRUxFTUVOVCByb2xlLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2VjdXJpdHktcm9sZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkgcm9sZS4KLVRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWN1cml0eQotcm9sZSwgYW5kIHRoZSBzZWN1cml0eSByb2xlIG5hbWUuCi0KLVVzZWQgaW46IGFzc2VtYmx5LWRlc2NyaXB0b3IKLQotRXhhbXBsZToKLQkJPHNlY3VyaXR5LXJvbGU+Ci0JCQk8ZGVzY3JpcHRpb24+Ci0JCQkJVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvCi0JCQkJYXJlIGF1dGhvcml6ZWQgdG8gYWNjZXNzIHRoZSBlbXBsb3llZQotCQkJCXNlcnZpY2UgYXBwbGljYXRpb24uCi0JCQk8L2Rlc2NyaXB0aW9uPgotCQkJPHJvbGUtbmFtZT5lbXBsb3llZTwvcm9sZS1uYW1lPgotCQk8L3NlY3VyaXR5LXJvbGU+Ci0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1yb2xlIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSk+Ci0KLTwhLS0KLVRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHNlY3VyaXR5Ci1yb2xlIHJlZmVyZW5jZSBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgY29kZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzCi1vZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZSB1c2VkIGluIHRoZSBjb2RlLAotYW5kIGFuIG9wdGlvbmFsIGxpbmsgdG8gYSBkZWZpbmVkIHNlY3VyaXR5IHJvbGUuCi0KLVRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgU3RyaW5nIHVzZWQgYXMgdGhlCi1wYXJhbWV0ZXIgdG8gdGhlIEVKQkNvbnRleHQuaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGVOYW1lKSBtZXRob2QuCi0KLVRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlCi1zZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotCi1Vc2VkIGluOiBlbnRpdHkgYW5kIHNlc3Npb24KLQotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktcm9sZS1yZWYgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lLCByb2xlLWxpbms/KT4KLQotPCEtLQotVGhlIHNlc3Npb24tdHlwZSBlbGVtZW50IGRlc2NyaWJlcyB3aGV0aGVyIHRoZSBzZXNzaW9uIGJlYW4gaXMgYQotc3RhdGVmdWwgc2Vzc2lvbiwgb3Igc3RhdGVsZXNzIHNlc3Npb24uCi0KLVRoZSBzZXNzaW9uLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQkJPHNlc3Npb24tdHlwZT5TdGF0ZWZ1bDwvc2Vzc2lvbi10eXBlPgotCQk8c2Vzc2lvbi10eXBlPlN0YXRlbGVzczwvc2Vzc2lvbi10eXBlPgotLS0+Ci08IUVMRU1FTlQgc2Vzc2lvbi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlc3Npb24gZWxlbWVudCBkZWNsYXJlcyBhbiBzZXNzaW9uIGJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cwotb2Y6IGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBvcHRpb25hbCBkaXNwbGF5IG5hbWU7IG9wdGlvbmFsIHNtYWxsIGljb24KLWZpbGUgbmFtZTsgb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlIG5hbWU7IGEgbmFtZSBhc3NpZ25lZCB0byB0aGUKLWVudGVycHJpc2UgYmVhbiBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdGlvbjsgdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uCi1iZWFuJ3MgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXM7IHRoZSBzZXNzaW9uIGJlYW4ncyBpbXBsZW1lbnRhdGlvbgotY2xhc3M7IHRoZSBzZXNzaW9uIGJlYW4ncyBzdGF0ZSBtYW5hZ2VtZW50IHR5cGU7IHRoZSBzZXNzaW9uIGJlYW4ncwotdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi1lbnZpcm9ubWVudCBlbnRyaWVzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQgotcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlczsKLWFuZCBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbgotZmFjdG9yeSByZWZlcmVuY2VzLgotCi1UaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhleQotYXJlIG9taXR0ZWQgd2hlbiBpZiBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotVXNlZCBpbjogZW50ZXJwcmlzZS1iZWFucwotLS0+Ci08IUVMRU1FTlQgc2Vzc2lvbiAoZGVzY3JpcHRpb24/LCBkaXNwbGF5LW5hbWU/LCBzbWFsbC1pY29uPywKLQkJbGFyZ2UtaWNvbj8sIGVqYi1uYW1lLCBob21lLCByZW1vdGUsIGVqYi1jbGFzcywKLQkJc2Vzc2lvbi10eXBlLCB0cmFuc2FjdGlvbi10eXBlLCBlbnYtZW50cnkqLAotCQllamItcmVmKiwgc2VjdXJpdHktcm9sZS1yZWYqLCByZXNvdXJjZS1yZWYqKT4KLQotPCEtLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIHNtYWxsCi0oMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgZWpiLWphcgotZmlsZS4KLQotVGhlIGltYWdlIG11c3QgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQsIGFuZCB0aGUgZmlsZSBuYW1lCi1tdXN0IGVuZCB3aXRoIHRoZSBzdWZmaXggIi5qcGciIG9yICIuZ2lmIiByZXNwZWN0aXZlbHkuCi0KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi1FeGFtcGxlOgotCTxzbWFsbC1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjE2eDE2LmpwZzwvc21hbGwtaWNvbj4KLS0tPgotPCFFTEVNRU5UIHNtYWxsLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyB0cmFuc2FjdGlvbgotbWFuYWdlbWVudCB0eXBlLgotCi1UaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCQk8dHJhbnNhY3Rpb24tdHlwZT5CZWFuPC90cmFuc2FjdGlvbi10eXBlPgotCQk8dHJhbnNhY3Rpb24tdHlwZT5Db250YWluZXI8L3RyYW5zYWN0aW9uLXR5cGU+Ci0KLVVzZWQgaW46IHNlc3Npb24KLS0tPgotPCFFTEVNRU5UIHRyYW5zYWN0aW9uLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdHJhbnMtYXR0cmlidXRlIGVsZW1lbnQgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QgbWFuYWdlIHRoZQotdHJhbnNhY3Rpb24gYm91bmRhcmllcyB3aGVuIGRlbGVnYXRpbmcgYSBtZXRob2QgaW52b2NhdGlvbiB0byBhbgotZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MgbWV0aG9kLgotCi1UaGUgdmFsdWUgb2YgdHJhbnMtYXR0cmlidXRlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JCTx0cmFucy1hdHRyaWJ1dGU+Tm90U3VwcG9ydGVkPC90cmFucy1hdHRyaWJ1dGU+Ci0JCTx0cmFucy1hdHRyaWJ1dGU+U3VwcG9ydHM8L3RyYW5zLWF0dHJpYnV0ZT4KLQkJPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlZDwvdHJhbnMtYXR0cmlidXRlPgotCQk8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVzTmV3PC90cmFucy1hdHRyaWJ1dGU+Ci0JCTx0cmFucy1hdHRyaWJ1dGU+TWFuZGF0b3J5PC90cmFucy1hdHRyaWJ1dGU+Ci0JCTx0cmFucy1hdHRyaWJ1dGU+TmV2ZXI8L3RyYW5zLWF0dHJpYnV0ZT4KLQotVXNlZCBpbjogY29udGFpbmVyLXRyYW5zYWN0aW9uCi0tLT4KLTwhRUxFTUVOVCB0cmFucy1hdHRyaWJ1dGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgSUQgbWVjaGFuaXNtIGlzIHRvIGFsbG93IHRvb2xzIHRoYXQgcHJvZHVjZSBhZGRpdGlvbmFsIGRlcGxveW1lbnQKLWluZm9ybWF0aW9uIChpLmUgaW5mb3JtYXRpb24gYmV5b25kIHRoZSBzdGFuZGFyZCBFSkIgZGVwbG95bWVudAotZGVzY3JpcHRvciBpbmZvcm1hdGlvbikgdG8gc3RvcmUgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhCi1zZXBhcmF0ZSBmaWxlLCBhbmQgZWFzaWx5IHJlZmVyIGZyb20gdGhlc2UgdG9vbHMtc3BlY2lmaWMgZmlsZXMgdG8gdGhlCi1pbmZvcm1hdGlvbiBpbiB0aGUgc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi1UaGUgRUpCIGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBhbGxvdyB0aGUgdG9vbHMgdG8gYWRkIHRoZSBub24tc3RhbmRhcmQKLWluZm9ybWF0aW9uIGludG8gdGhlIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0tLT4KLTwhQVRUTElTVCBhc3NlbWJseS1kZXNjcmlwdG9yIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNtcC1maWVsZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb250YWluZXItdHJhbnNhY3Rpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItY2xpZW50LWphciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItamFyIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1saW5rIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnRlcnByaXNlLWJlYW5zIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudGl0eSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LXZhbHVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZpZWxkLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaG9tZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsYXJnZS1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1ldGhvZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QtaW50ZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QtcGFyYW0gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLXBhcmFtcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QtcGVybWlzc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwZXJzaXN0ZW5jZS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByaW0ta2V5LWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByaW1rZXktZmllbGQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVlbnRyYW50IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbW90ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtYXV0aCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJvbGUtbGluayBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1yb2xlLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXNzaW9uLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2Vzc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRyYW5zYWN0aW9uLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdHJhbnMtYXR0cmlidXRlIGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzJfMC5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfMl8wLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEyY2M3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfMl8wLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDE2NzEgKzAsMCBAQAotPCEtLQotQ29weXJpZ2h0IChjKSAyMDAwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sCi05MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIHJlbGF0aW5nIHRvCi10ZWNobm9sb2d5IGVtYm9kaWVkIGluIHRoZSBwcm9kdWN0IHRoYXQgaXMgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuCi1JbiBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzIGxpc3RlZCBhdAotaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlIGFkZGl0aW9uYWwgcGF0ZW50cyBvcgotcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZSBVLlMuIGFuZCBpbiBvdGhlciBjb3VudHJpZXMuCi0KLVRoaXMgZG9jdW1lbnQgYW5kIHRoZSBwcm9kdWN0IHRvIHdoaWNoIGl0IHBlcnRhaW5zIGFyZSBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIFRoaXMgZG9jdW1lbnQgbWF5IGJlIHJlcHJvZHVjZWQgYW5kIGRpc3RyaWJ1dGVkIGJ1dCBtYXkKLW5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzCi1saWNlbnNvcnMsIGlmIGFueS4KLQotVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZAotbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi1TdW4sICBTdW4gTWljcm9zeXN0ZW1zLCAgdGhlIFN1biBsb2dvLCAgSmF2YSwgIEphdmFTZXJ2ZXIgUGFnZXMsICBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsICBKREJDLCAgSkRLLCAgSmF2YU1haWwgYW5kICBhbmQKLUVudGVycHJpc2UgSmF2YUJlYW5zIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLU1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0bwotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkgSU1QTElFRAotV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IKLU5PTi1JTkZSSU5HRU1FTlQsIEFSRSBESVNDTEFJTUVELCBFWENFUFQgVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0gKLURJU0NMQUlNRVJTIEFSRSBIRUxEIFRPIEJFIExFR0FMTFkgSU5WQUxJRC4KLQotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLUNvcHlyaWdodCAoYykgMjAwMCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLAotOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIEUndGF0cy1VbmlzLgotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhIGxlcyBkcm9pdHMgZGUgcHJvcHJpZSd0ZScgaW50ZWxsZWN0dWVscwotcmVsYXRhbnRzIGFgIGxhIHRlY2hub2xvZ2llIGluY29ycG9yZSdlIGRhbnMgbGUgcHJvZHVpdCBxdWkgZXN0IGRlJ2NyaXQKLWRhbnMgY2UgZG9jdW1lbnQuIEVuIHBhcnRpY3VsaWVyLCBldCBzYW5zIGxhIGxpbWl0YXRpb24sIGNlcyBkcm9pdHMgZGUKLXByb3ByaWUndGUnIGludGVsbGVjdHVlbHMgcGV1dmVudCBpbmNsdXJlIHVuIG91IHBsdXMgZGVzIGJyZXZldHMKLWFtZSdyaWNhaW5zIGUnbnVtZSdyZSdzIGFgIGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGV0IHVuIG91IGxlcwotYnJldmV0cyBwbHVzIHN1cHBsZSdtZW50YWlyZXMgb3UgbGVzIGFwcGxpY2F0aW9ucyBkZSBicmV2ZXQgZW4gYXR0ZW50ZQotZGFucyBsZXMgRSd0YXRzLVVuaXMgZXQgZGFucyBsZXMgYXV0cmVzIHBheXMuCi0KLUNlIHByb2R1aXQgb3UgZG9jdW1lbnQgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0IGRpc3RyaWJ1ZScKLWF2ZWMgZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhCi1kaXN0cmlidXRpb24sIGV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQ2UgZG9jdW1lbnRpb24gYXNzb2NpZSBuIHBldXQKLWVedHJlIHJlcHJvZHVpdGUgZXQgZGlzdHJpYnVlciwgcGFyIHF1ZWxxdWUgbW95ZW4gcXVlIGNlIHNvaXQsIHNhbnMKLWwnYXV0b3Jpc2F0aW9uIHByZSdhbGFibGUgZXQgZSdjcml0ZSBkZSBTdW4gZXQgZGUgc2VzIGJhaWxsZXVycyBkZQotbGljZW5jZSwgbGUgY2FzIGUnY2hlJ2FudC4KLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUKLXJlbGF0aXZlIGF1eCBwb2xpY2VzIGRlIGNhcmFjdGVgcmVzLCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQKLWxpY2VuY2llJyBwYXIgZGVzIGZvdXJuaXNzZXVycyBkZSBTdW4uCi0KLVN1biwgIFN1biBNaWNyb3N5c3RlbXMsICBsZSBsb2dvIFN1biwgIEphdmEsICBKYXZhU2VydmVyIFBhZ2VzLCAgSmF2YQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCAgSkRCQywgIEpESywgIEphdmFNYWlsIGV0ICBhbmQKLUVudGVycHJpc2UgSmF2YUJlYW5zIHNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMKLWRlJ3Bvc2UnZXMgZGUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhdXggRSd0YXRzLVVuaXMgZXQgZGFucyBkJ2F1dHJlcwotcGF5cy4KLQotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFJ1RBVCIgRVQgVE9VVEVTIEFVVFJFUyBDT05ESVRJT05TLAotREVDTEFSQVRJT05TIEVUIEdBUkFOVElFUyBFWFBSRVNTRVMgT1UgVEFDSVRFUyBTT05UIEZPUk1FTExFTUVOVAotRVhDTFVFUywgREFOUyBMQSBNRVNVUkUgQVVUT1JJU0VFIFBBUiBMQSBMT0kgQVBQTElDQUJMRSwgWSBDT01QUklTCi1OT1RBTU1FTlQgVE9VVEUgR0FSQU5USUUgSU1QTElDSVRFIFJFTEFUSVZFIEEgTEEgUVVBTElURSBNQVJDSEFOREUsIEEKLUwnQVBUSVRVREUgQSBVTkUgVVRJTElTQVRJT04gUEFSVElDVUxJRVJFIE9VIEEgTCdBQlNFTkNFIERFCi1DT05UUkVGQUMsT04uCi0tLT4KLQotPCEtLQotVGhpcyBpcyB0aGUgWE1MIERURCBmb3IgdGhlIEVKQiAyLjAgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotQWxsIEVKQiAyLjAgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluY2x1ZGUgYSBET0NUWVBFCi1vZiB0aGUgZm9sbG93aW5nIGZvcm06Ci0KLSAgPCFET0NUWVBFIGVqYi1qYXIgUFVCTElDCi0JIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotCSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9lamItamFyXzJfMC5kdGQiPgotCi0tLT4KLQotPCEtLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgY29udGFpbiBQQ0RBVEEsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKLSAgaW4gdGhlIGRhdGEgbWF5IGJlIGlnbm9yZWQuCi0KLS0gSW4gZWxlbWVudHMgd2hvc2UgdmFsdWUgaXMgYW4gImVudW1lcmF0ZWQgdHlwZSIsIHRoZSB2YWx1ZSBpcwotICBjYXNlIHNlbnNpdGl2ZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZSBzYW1lCi0gIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdCBzdGFydGluZyB3aXRoICIvIikKLSAgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLgotICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkKLSAgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBzZXJ2bGV0IEFQSS4KLS0tPgotCi0KLTwhLS0KLVRoZSBlamItamFyIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IuIEl0IGNvbnRhaW5zCi0KLQktIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlamItamFyIGZpbGUKLQktIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCS0gYW4gb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWUKLQktIGFuIG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lCi0JLSBtYW5kYXRvcnkgc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5jbHVkZWQKLQkgIGVudGVycHJpc2UgYmVhbnMKLQktIGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywgaWYgYW55Ci0JLSBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbi1hc3NlbWJseSBkZXNjcmlwdG9yCi0JLSBhbiBvcHRpb25hbCBuYW1lIG9mIGFuIGVqYi1jbGllbnQtamFyIGZpbGUgZm9yIHRoZSBlamItamFyLgotLS0+Ci08IUVMRU1FTlQgZWpiLWphciAoZGVzY3JpcHRpb24/LCBkaXNwbGF5LW5hbWU/LCBzbWFsbC1pY29uPywKLWxhcmdlLWljb24/LCBlbnRlcnByaXNlLWJlYW5zLCByZWxhdGlvbnNoaXBzPywgYXNzZW1ibHktZGVzY3JpcHRvcj8sCi1lamItY2xpZW50LWphcj8pPgotCi08IS0tCi1UaGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGFic3RyYWN0Ci1zY2hlbWEgdHlwZSBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueC4gSXQgaXMgdXNlZCBpbiBFSkIKLVFMIHF1ZXJpZXMuCi0KLUZvciBleGFtcGxlLCB0aGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIHdob3NlIGxvY2FsCi1pbnRlcmZhY2UgaXMgY29tLmFjbWUuY29tbWVyY2UuT3JkZXIgbWlnaHQgYmUgT3JkZXIuCi0KLVVzZWQgaW46IGVudGl0eQotLS0+Ci08IUVMRU1FTlQgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi0KLVRoZSBhY2tub3dsZWRnZS1tb2RlIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgSk1TIEFVVE9fQUNLTk9XTEVER0Ugb3IKLURVUFNfT0tfQUNLTk9XTEVER0UgbWVzc2FnZSBhY2tub3dsZWRnbWVudCBzZW1hbnRpY3Mgc2hvdWxkIGJlIHVzZWQKLWZvciB0aGUgb25NZXNzYWdlIG1lc3NhZ2Ugb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuIHRoYXQgdXNlcyBiZWFuCi1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uLgotCi1UaGUgYWNrbm93bGVkZ2UtbW9kZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JPGFja25vd2xlZGdlLW1vZGU+QXV0by1hY2tub3dsZWRnZTwvYWNrbm93bGVkZ2UtbW9kZT4KLQk8YWNrbm93bGVkZ2UtbW9kZT5EdXBzLW9rLWFja25vd2xlZGdlPC9hY2tub3dsZWRnZW1vZGU+Ci0KLVVzZWQgaW46IG1lc3NhZ2UtZHJpdmVuCi0tLT4KLTwhRUxFTUVOVCBhY2tub3dsZWRnZS1tb2RlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGFzc2VtYmx5LWRlc2NyaXB0b3IgZWxlbWVudCBjb250YWlucyBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4KLQotVGhlIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFydHM6Ci10aGUgZGVmaW5pdGlvbiBvZiBzZWN1cml0eSByb2xlcywgdGhlIGRlZmluaXRpb24gb2YgbWV0aG9kCi1wZXJtaXNzaW9ucywgdGhlIGRlZmluaXRpb24gb2YgdHJhbnNhY3Rpb24gYXR0cmlidXRlcyBmb3IKLWVudGVycHJpc2UgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBhbmQKLWEgbGlzdCBvZiBtZXRob2RzIHRvIGJlIGV4Y2x1ZGVkIGZyb20gYmVpbmcgaW52b2tlZC4KLQotQWxsIHRoZSBwYXJ0cyBhcmUgb3B0aW9uYWwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUKLWxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotCi1Qcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzCi1vcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlci4KLQotVXNlZCBpbjogZWpiLWphcgotLS0+Ci08IUVMRU1FTlQgYXNzZW1ibHktZGVzY3JpcHRvciAoc2VjdXJpdHktcm9sZSosIG1ldGhvZC1wZXJtaXNzaW9uKiwKLWNvbnRhaW5lci10cmFuc2FjdGlvbiosIGV4Y2x1ZGUtbGlzdD8pPgotCi08IS0tCi1UaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCwgd2l0aGluIGEgcGFydGljdWxhcgotcmVsYXRpb25zaGlwLCB0aGUgbGlmZXRpbWUgb2Ygb25lIG9yIG1vcmUgZW50aXR5IGJlYW5zIGlzIGRlcGVuZGVudAotdXBvbiB0aGUgbGlmZXRpbWUgb2YgYW5vdGhlciBlbnRpdHkgYmVhbi4gVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQKLWNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnQgY29udGFpbmVkCi1pbiBhbiBlamItcmVsYXRpb24gZWxlbWVudCBpbiB3aGljaCB0aGUgb3RoZXIgZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi1lbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0KLVVzZWQgaW46IGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotLS0+Ci08IUVMRU1FTlQgY2FzY2FkZS1kZWxldGUgRU1QVFk+Ci0KLTwhLS0KLVRoZSBjbXAtZmllbGQgZWxlbWVudCBkZXNjcmliZXMgYSBjb250YWluZXItbWFuYWdlZCBmaWVsZC4gVGhlCi1maWVsZCBlbGVtZW50IGluY2x1ZGVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZCwgYW5kIHRoZQotbmFtZSBvZiB0aGUgZmllbGQuCi0KLVVzZWQgaW46IGVudGl0eQotLS0+Ci08IUVMRU1FTlQgY21wLWZpZWxkIChkZXNjcmlwdGlvbj8sIGZpZWxkLW5hbWUpPgotCi08IS0tCi1UaGUgY21wLXZlcnNpb24gZWxlbWVudCBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgYW4gZW50aXR5IGJlYW4KLXdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuCi0KLVRoZSBjbXAtdmVyc2lvbiBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JPGNtcC12ZXJzaW9uPjEueDwvY21wLXZlcnNpb24+Ci0JPGNtcC12ZXJzaW9uPjIueDwvY21wLXZlcnNpb24+Ci0KLVRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjbXAtdmVyc2lvbiBlbGVtZW50IGlzIDIueC4KLQotVXNlZCBpbjogZW50aXR5Ci0tLT4KLTwhRUxFTUVOVCBjbXAtdmVyc2lvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLQotVGhlIGNtci1maWVsZCBlbGVtZW50IGRlc2NyaWJlcyB0aGUgYmVhbiBwcm92aWRlcidzIHZpZXcgb2YgYQotcmVsYXRpb25zaGlwLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZSBuYW1lIGFuZAotdGhlIGNsYXNzIHR5cGUgb2YgYSBmaWVsZCBpbiB0aGUgc291cmNlIG9mIGEgcm9sZSBvZiBhCi1yZWxhdGlvbnNoaXAuIFRoZSBjbXItZmllbGQtbmFtZSBlbGVtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIHVzZWQKLWZvciB0aGUgZ2V0IGFuZCBzZXQgYWNjZXNzb3IgbWV0aG9kcyBmb3IgdGhlIHJlbGF0aW9uc2hpcC4gVGhlCi1jbXItZmllbGQtdHlwZSBlbGVtZW50IGlzIHVzZWQgb25seSBmb3IgY29sbGVjdGlvbi12YWx1ZWQKLWNtci1maWVsZHMuIEl0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGlzIHVzZWQuCi0KLVVzZWQgaW46IGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotLS0+Ci08IUVMRU1FTlQgY21yLWZpZWxkIChkZXNjcmlwdGlvbj8sIGNtci1maWVsZC1uYW1lLCBjbXItZmllbGQtdHlwZT8pPgotCi08IS0tCi1UaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBsb2dpY2FsCi1yZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzLiBUaGUgbmFtZSBvZiB0aGUgY21yLWZpZWxkCi1tdXN0IGJlZ2luIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyLiBUaGlzIGZpZWxkIGlzIGFjY2Vzc2VkIGJ5IG1ldGhvZHMKLXdob3NlIG5hbWVzIGNvbnNpc3Qgb2YgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHNwZWNpZmllZCBieQotY21yLWZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0IGxldHRlciBpcyB1cHBlcmNhc2VkLCBwcmVmaXhlZCBieQotImdldCIgb3IgInNldCIuCi0KLVVzZWQgaW46IGNtci1maWVsZAotLS0+Ci08IUVMRU1FTlQgY21yLWZpZWxkLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNsYXNzIG9mIGEKLWNvbGxlY3Rpb24tdmFsdWVkIGxvZ2ljYWwgcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkgYmVhbgotY2xhc3MuIFRoZSB2YWx1ZSBvZiB0aGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBtdXN0IGJlIGVpdGhlcjoKLWphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGphdmEudXRpbC5TZXQuCi0KLVVzZWQgaW46IGNtci1maWVsZAotLS0+Ci08IUVMRU1FTlQgY21yLWZpZWxkLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgY29udGFpbmVyLXRyYW5zYWN0aW9uIGVsZW1lbnQgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyCi1tdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2QKLWludm9jYXRpb25zLiBUaGUgZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0Ci1vZiBtZXRob2QgZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS4gVGhlIHRyYW5zYWN0aW9uCi1hdHRyaWJ1dGUgaXMgdG8gYmUgYXBwbGllZCB0byBhbGwgdGhlIHNwZWNpZmllZCBtZXRob2RzLgotCi1Vc2VkIGluOiBhc3NlbWJseS1kZXNjcmlwdG9yCi0tLT4KLTwhRUxFTUVOVCBjb250YWluZXItdHJhbnNhY3Rpb24gKGRlc2NyaXB0aW9uPywgbWV0aG9kKywgdHJhbnMtYXR0cmlidXRlKT4KLQotPCEtLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50Ci1lbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQKLXRoZSBlbnRlcnByaXNlIGJlYW4gZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mCi10aGUgZW50ZXJwcmlzZSBiZWFuIGVqYi1qYXIgZmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMKLXVzZWQgYnkgdGhlIGVudGVycHJpc2UgYmVhbiBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbgotd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLQotVXNlZCBpbjogY21wLWZpZWxkLCBjbXItZmllbGQsIGNvbnRhaW5lci10cmFuc2FjdGlvbiwgZWpiLWphciwKLWVqYi1sb2NhbC1yZWYsIGVqYi1yZWYsIGVqYi1yZWxhdGlvbiwgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLCBlbnRpdHksCi1lbnYtZW50cnksIGV4Y2x1ZGUtbGlzdCwgbWVzc2FnZS1kcml2ZW4sIG1ldGhvZCwgbWV0aG9kLXBlcm1pc3Npb24sCi1xdWVyeSwgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlLCByZWxhdGlvbnNoaXBzLCByZXNvdXJjZS1lbnYtcmVmLAotcmVzb3VyY2UtcmVmLCBydW4tYXMsIHNlY3VyaXR5LWlkZW50aXR5LCBzZWN1cml0eS1yb2xlLAotc2VjdXJpdHktcm9sZS1yZWYsIHNlc3Npb24KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRlc3RpbmF0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIEpNUwotZGVzdGluYXRpb24uIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UgZXhwZWN0ZWQgdG8KLWJlIGltcGxlbWVudGVkIGJ5IHRoZSBkZXN0aW5hdGlvbi4KLQotVGhlIGRlc3RpbmF0aW9uLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotPGRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlPC9kZXN0aW5hdGlvbi10eXBlPgotPGRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlRvcGljPC9kZXN0aW5hdGlvbi10eXBlPgotCi1Vc2VkIGluOiBtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbgotLS0+Ci08IUVMRU1FTlQgZGVzdGluYXRpb24tdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQotZGlzcGxheWVkIGJ5IHRvb2xzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuCi0KLVVzZWQgaW46IGVqYi1qYXIsIGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLQotRXhhbXBsZToKLQotPGRpc3BsYXktbmFtZT5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi1lbnRlcnByaXNlIGJlYW4ncyBjbGFzcy4KLQotVXNlZCBpbjogZW50aXR5LCBtZXNzYWdlLWRyaXZlbiwgc2Vzc2lvbgotCi1FeGFtcGxlOgotCi08ZWpiLWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2VCZWFuPC9lamItY2xhc3M+Ci0tLT4KLTwhRUxFTUVOVCBlamItY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgb3B0aW9uYWwgZWpiLWNsaWVudC1qYXIgZWxlbWVudCBzcGVjaWZpZXMgYSBKQVIgZmlsZSB0aGF0IGNvbnRhaW5zCi10aGUgY2xhc3MgZmlsZXMgbmVjZXNzYXJ5IGZvciBhIGNsaWVudCBwcm9ncmFtIHRvIGFjY2VzcyB0aGUKLWVudGVycHJpc2UgYmVhbnMgaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQotVXNlZCBpbjogZWpiLWphcgotCi1FeGFtcGxlOgotCi08ZWpiLWNsaWVudC1qYXI+ZW1wbG95ZWVfc2VydmljZV9jbGllbnQuamFyPC9lamItY2xpZW50LWphcj4KLS0tPgotPCFFTEVNRU5UIGVqYi1jbGllbnQtamFyICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgZWpiLXJlZiBvciBlamItbG9jYWwtcmVmCi1lbGVtZW50cyB0byBzcGVjaWZ5IHRoYXQgYW4gRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gYW4KLWVudGVycHJpc2UgYmVhbi4KLQotVGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuCi1lbnRlcnByaXNlIGJlYW4gaW4gdGhlIHNhbWUgZWpiLWphciBmaWxlIG9yIGluIGFub3RoZXIgZWpiLWphcgotZmlsZSBpbiB0aGUgc2FtZSBKMkVFIGFwcGxpY2F0aW9uIHVuaXQuCi0KLUFsdGVybmF0aXZlbHksIHRoZSBuYW1lIGluIHRoZSBlamItbGluayBlbGVtZW50IG1heSBiZSBjb21wb3NlZCBvZiBhCi1wYXRoIG5hbWUgc3BlY2lmeWluZyB0aGUgZWpiLWphciBjb250YWluaW5nIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UKLWJlYW4gd2l0aCB0aGUgZWpiLW5hbWUgb2YgdGhlIHRhcmdldCBiZWFuIGFwcGVuZGVkIGFuZCBzZXBhcmF0ZWQgZnJvbQotdGhlIHBhdGggbmFtZSBieSAiIyIuICBUaGUgcGF0aCBuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBlamItamFyIGZpbGUKLWNvbnRhaW5pbmcgdGhlIGVudGVycHJpc2UgYmVhbiB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4uCi1UaGlzIGFsbG93cyBtdWx0aXBsZSBlbnRlcnByaXNlIGJlYW5zIHdpdGggdGhlIHNhbWUgZWpiLW5hbWUgdG8gYmUKLXVuaXF1ZWx5IGlkZW50aWZpZWQuCi0KLVVzZWQgaW46IGVqYi1sb2NhbC1yZWYsIGVqYi1yZWYKLQotRXhhbXBsZXM6Ci0KLQk8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPgotCi0JPGVqYi1saW5rPi4uL3Byb2R1Y3RzL3Byb2R1Y3QuamFyI1Byb2R1Y3RFSkI8L2VqYi1saW5rPgotCi0tLT4KLTwhRUxFTUVOVCBlamItbGluayAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItbG9jYWwtcmVmIGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvCi1hbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQktIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIGVudGVycHJpc2UgYmVhbgotCSAgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4KLQktIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCS0gdGhlIGV4cGVjdGVkIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQKLQkgIGVudGVycHJpc2UgYmVhbgotCS0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZAotCSAgZW50ZXJwcmlzZSBiZWFuCi0KLVVzZWQgaW46IGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLS0tPgotPCFFTEVNRU5UIGVqYi1sb2NhbC1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsCi0JCWxvY2FsLWhvbWUsIGxvY2FsLCBlamItbGluaz8pPgotCi08IS0tCi1UaGUgZWpiLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbmFtZS4gVGhpcyBuYW1lIGlzCi1hc3NpZ25lZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIG5hbWUgdGhlIGVudGVycHJpc2UgYmVhbiBpbgotdGhlIGVqYi1qYXIgZmlsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLWFtb25nIHRoZSBuYW1lcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgc2FtZSBlamItamFyIGZpbGUuCi0KLVRoZXJlIGlzIG5vIGFyY2hpdGVjdGVkIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBlamItbmFtZSBpbiB0aGUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgdGhlIEpOREkgbmFtZSB0aGF0IHRoZSBEZXBsb3llciB3aWxsIGFzc2lnbgotdG8gdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUuCi0KLVRoZSBuYW1lIGZvciBhbiBlbnRpdHkgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueCBtdXN0IGNvbmZvcm0gdG8gdGhlCi1sZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLiBUaGUgbmFtZSBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aAotY21wLXZlcnNpb24gMi54IG11c3Qgbm90IGJlIGEgcmVzZXJ2ZWQgbGl0ZXJhbCBpbiBFSkIgUUwuCi0KLVVzZWQgaW46IGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIG1ldGhvZCwgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlLAotc2Vzc2lvbgotCi1FeGFtcGxlOgotCi08ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVqYi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1xbCBlbGVtZW50IGNvbnRhaW5zIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcwotYSBmaW5kZXIgb3Igc2VsZWN0IHF1ZXJ5LiBUaGlzIGVsZW1lbnQgaXMgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mCi1hIHF1ZXJ5IGVsZW1lbnQgd2hvc2UgY29udGVudHMgc3BlY2lmeSB0aGUgZmluZGVyIG9yIHRoZSBzZWxlY3QgbWV0aG9kCi10aGF0IHVzZXMgdGhlIHF1ZXJ5LiBUaGUgY29udGVudCBtdXN0IGJlIGEgdmFsaWQgRUpCIFFMIHF1ZXJ5IHN0cmluZwotZm9yIHRoZSBlbnRpdHkgYmVhbiBmb3Igd2hpY2ggdGhlIHF1ZXJ5IGlzIHNwZWNpZmllZC4KLQotVGhlIGVqYi1xbCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbGwgcXVlcmllcyB0aGF0IGFyZQotZXhwcmVzc2libGUgaW4gRUpCIFFMLgotCi1Vc2VkIGluOiBxdWVyeQotCi1FeGFtcGxlOgotPHF1ZXJ5PgotICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgIDxtZXRob2QtbmFtZT5lamJTZWxlY3RQZW5kaW5nTGluZWl0ZW1zPC9tZXRob2QtbmFtZT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgIDwvcXVlcnktbWV0aG9kPgotICAgIDxlamItcWw+U0VMRUNUIE9CSkVDVChsKSBGUk9NIExpbmVJdGVtcyBsIFdIRVJFIGwuc2hpcHBlZCA8PiBUUlVFCi0gICAgPC9lamItcWw+Ci08L3F1ZXJ5PgotCi0tLT4KLTwhRUxFTUVOVCBlamItcWwgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bwotYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCS0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mCi0JICB0aGUgZW50ZXJwcmlzZSBiZWFuIHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQktIHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZAotCSAgZW50ZXJwcmlzZSBiZWFuCi0JLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZSByZWZlcmVuY2VkCi0JICBlbnRlcnByaXNlIGJlYW4KLQotVXNlZCBpbjogZW50aXR5LCBtZXNzYWdlLWRyaXZlbiwgc2Vzc2lvbgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZiAoZGVzY3JpcHRpb24/LCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwKLQkJaG9tZSwgcmVtb3RlLCBlamItbGluaz8pPgotCi08IS0tCi1UaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCIHJlZmVyZW5jZS4gVGhlCi1FSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBlbnZpcm9ubWVudCBhbmQgaXMKLXJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotd2l0aGluIHRoZSBlbnRlcnByaXNlIGJlYW4uCi0KLUl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZWpiLXJlZgotCi1FeGFtcGxlOgotCi08ZWpiLXJlZi1uYW1lPmVqYi9QYXlyb2xsPC9lamItcmVmLW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlamItcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlCi1yZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLQotVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQk8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotCTxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmLCBlamItcmVmCi0tLT4KLTwhRUxFTUVOVCBlamItcmVmLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi0KLVRoZSBlamItcmVsYXRpb24gZWxlbWVudCBkZXNjcmliZXMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28KLWVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLiAgQW4gZWpiLXJlbGF0aW9uCi1lbGVtZW50IGNvbnRhaW5zIGEgZGVzY3JpcHRpb247IGFuIG9wdGlvbmFsIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQ7Ci1hbmQgZXhhY3RseSB0d28gcmVsYXRpb25zaGlwIHJvbGUgZGVjbGFyYXRpb25zLCBkZWZpbmVkIGJ5IHRoZQotZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnRzLiBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLCBpZgotc3BlY2lmaWVkLCBpcyB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuCi0KLVVzZWQgaW46IHJlbGF0aW9uc2hpcHMKLS0tPgotPCFFTEVNRU5UIGVqYi1yZWxhdGlvbiAoZGVzY3JpcHRpb24/LCBlamItcmVsYXRpb24tbmFtZT8sIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSwKLWVqYi1yZWxhdGlvbnNoaXAtcm9sZSk+Ci0KLTwhLS0KLVRoZSBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50IHByb3ZpZGVzIGEgdW5pcXVlIG5hbWUgZm9yIGEgcmVsYXRpb25zaGlwLgotCi1Vc2VkIGluOiBlamItcmVsYXRpb24KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWxhdGlvbi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50IGRlc2NyaWJlcyBhIHJvbGUgd2l0aGluIGEKLXJlbGF0aW9uc2hpcC4gVGhlcmUgYXJlIHR3byByb2xlcyBpbiBlYWNoIHJlbGF0aW9uc2hpcC4KLQotVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBhbgotb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHJlbGF0aW9uc2hpcCByb2xlOyBhIHNwZWNpZmljYXRpb24gb2YgdGhlCi1tdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgY2FzY2FkZS1kZWxldGUKLWZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOyB0aGUgcm9sZSBzb3VyY2U7IGFuZCBhIGRlY2xhcmF0aW9uIG9mIHRoZQotY21yLWZpZWxkLCBpZiBhbnksIGJ5IG1lYW5zIG9mIHdoaWNoIHRoZSBvdGhlciBzaWRlIG9mIHRoZQotcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSByb2xlIHNvdXJjZS4KLQotVGhlIG11bHRpcGxpY2l0eSBhbmQgcm9sZS1zb3VyY2UgZWxlbWVudCBhcmUgbWFuZGF0b3J5LgotCi1UaGUgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgZGVzaWduYXRlcyBhbiBlbnRpdHkgYmVhbiBieQotbWVhbnMgb2YgYW4gZWpiLW5hbWUgZWxlbWVudC4gRm9yIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcywgYm90aAotcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgbXVzdCBkZWNsYXJlIGEgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlCi1lbGVtZW50IHRoYXQgc3BlY2lmaWVzIGEgY21yLWZpZWxkIGluIHRlcm1zIG9mIHdoaWNoIHRoZSByZWxhdGlvbnNoaXAKLWlzIGFjY2Vzc2VkLiBUaGUgbGFjayBvZiBhIGNtci1maWVsZCBlbGVtZW50IGluIGFuCi1lamItcmVsYXRpb25zaGlwLXJvbGUgc3BlY2lmaWVzIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcwotdW5pZGlyZWN0aW9uYWwgaW4gbmF2aWdhYmlsaXR5IGFuZCB0aGUgZW50aXR5IGJlYW4gdGhhdCBwYXJ0aWNpcGF0ZXMKLWluIHRoZSByZWxhdGlvbnNoaXAgaXMgIm5vdCBhd2FyZSIgb2YgdGhlIHJlbGF0aW9uc2hpcC4KLQotVXNlZCBpbjogZWpiLXJlbGF0aW9uCi0KLUV4YW1wbGU6Ci0KLTxlamItcmVsYXRpb24+Ci0gICAgPGVqYi1yZWxhdGlvbi1uYW1lPlByb2R1Y3QtTGluZUl0ZW08L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5wcm9kdWN0LWhhcy1saW5laXRlbXMKLSAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgPGVqYi1uYW1lPlByb2R1Y3RFSkI8L2VqYi1uYW1lPgotICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSAoZGVzY3JpcHRpb24/LCBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT8sCi1tdWx0aXBsaWNpdHksIGNhc2NhZGUtZGVsZXRlPywgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlLCBjbXItZmllbGQ/KT4KLQotPCEtLQotVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIGVsZW1lbnQgZGVmaW5lcyBhIG5hbWUgZm9yIGEgcm9sZSB0aGF0Ci1pcyB1bmlxdWUgd2l0aGluIGFuIGVqYi1yZWxhdGlvbi4gRGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUKLXNhbWUgbmFtZSBmb3IgYSByb2xlLgotCi1Vc2VkIGluOiBlamItcmVsYXRpb25zaGlwLXJvbGUKLS0tPgotPCFFTEVNRU5UIGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudGVycHJpc2UtYmVhbnMgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIG9mIG9uZSBvciBtb3JlCi1lbnRlcnByaXNlIGJlYW5zLgotLS0+Ci08IUVMRU1FTlQgZW50ZXJwcmlzZS1iZWFucyAoc2Vzc2lvbiB8IGVudGl0eSB8IG1lc3NhZ2UtZHJpdmVuKSs+Ci0KLTwhLS0KLVRoZSBlbnRpdHkgZWxlbWVudCBkZWNsYXJlcyBhbiBlbnRpdHkgYmVhbi4gVGhlIGRlY2xhcmF0aW9uCi1jb25zaXN0cyBvZjoKLQotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQktIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCS0gYW4gb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWUKLQktIGFuIG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lCi0JLSBhIHVuaXF1ZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLQkgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQktIHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaG9tZSBhbmQgcmVtb3RlCi0gICAgICAgICAgaW50ZXJmYWNlcywgaWYgYW55Ci0JLSB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQgbG9jYWwKLQkgIGludGVyZmFjZXMsIGlmIGFueQotCS0gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLQktIHRoZSBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlIG1hbmFnZW1lbnQgdHlwZQotCS0gdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MgbmFtZQotCS0gYW4gaW5kaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyByZWVudHJhbmN5Ci0JLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzIGNtcC12ZXJzaW9uCi0JLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzIGFic3RyYWN0Ci0JICBzY2hlbWEgbmFtZQotCS0gYW4gb3B0aW9uYWwgbGlzdCBvZiBjb250YWluZXItbWFuYWdlZCBmaWVsZHMKLQktIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IGVudHJpZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCIHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eQotCSAgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzIG1ldGhvZHMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UgbWFuYWdlcgotICAgICAgICAgIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBzZXQgb2YgcXVlcnkgZGVjbGFyYXRpb25zCi0JICBmb3IgZmluZGVyIGFuZCBzZWxlY3QgbWV0aG9kcyBmb3IgYW4gZW50aXR5Ci0JICBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LgotCi1UaGUgb3B0aW9uYWwgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYW4KLWVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UgYW5kIGNtcC12ZXJzaW9uIDIueC4KLQotVGhlIG9wdGlvbmFsIHByaW1rZXktZmllbGQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYgdGhlCi1lbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4KLQotVGhlIG9wdGlvbmFsIGNtcC12ZXJzaW9uIGVsZW1lbnQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYKLXRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4gSWYgdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMKLUNvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlCi1kZWZhdWx0cyB0byAyLnguCi0KLVRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYgdGhlIGVudGl0eQotYmVhbiBjbXAtdmVyc2lvbiBpcyAxLnguCi0KLVRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYgdGhlIGVudGl0eQotYmVhbiBoYXMgYSByZW1vdGUgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZS4KLQotVGhlIG9wdGlvbmFsIGxvY2FsLWhvbWUgYW5kIGxvY2FsIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmIHRoZQotZW50aXR5IGJlYW4gaGFzIGEgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLgotCi1FaXRoZXIgYm90aCB0aGUgbG9jYWwtaG9tZSBhbmQgdGhlIGxvY2FsIGVsZW1lbnRzIG9yIGJvdGggdGhlCi1ob21lIGFuZCB0aGUgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkLgotCi1UaGUgb3B0aW9uYWwgcXVlcnkgZWxlbWVudHMgbXVzdCBiZSBwcmVzZW50IGlmIHRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzCi1Db250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kIHF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbgotZmluZEJ5UHJpbWFyeUtleSBoYXZlIGJlZW4gZGVmaW5lZCBmb3IgdGhlIGVudGl0eSBiZWFuLgotCi1UaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQKLXRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotCi1BdCBsZWFzdCBvbmUgY21wLWZpZWxkIGVsZW1lbnQgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yIGlmCi10aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAxLngsCi1hbmQgbm9uZSBtdXN0IG5vdCBiZSBwcmVzZW50IGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIEJlYW4uCi0KLVVzZWQgaW46IGVudGVycHJpc2UtYmVhbnMKLQotLS0+Ci08IUVMRU1FTlQgZW50aXR5IChkZXNjcmlwdGlvbj8sIGRpc3BsYXktbmFtZT8sIHNtYWxsLWljb24/LAotCQlsYXJnZS1pY29uPywgZWpiLW5hbWUsIGhvbWU/LCByZW1vdGU/LCBsb2NhbC1ob21lPywKLQkJbG9jYWw/LCBlamItY2xhc3MsIHBlcnNpc3RlbmNlLXR5cGUsIHByaW0ta2V5LWNsYXNzLAotCQlyZWVudHJhbnQsIGNtcC12ZXJzaW9uPywgYWJzdHJhY3Qtc2NoZW1hLW5hbWU/LAotCQljbXAtZmllbGQqLCBwcmlta2V5LWZpZWxkPywgZW52LWVudHJ5KiwgZWpiLXJlZiosCi0JCWVqYi1sb2NhbC1yZWYqLCBzZWN1cml0eS1yb2xlLXJlZiosIHNlY3VyaXR5LWlkZW50aXR5PywKLQkJcmVzb3VyY2UtcmVmKiwgcmVzb3VyY2UtZW52LXJlZiosIHF1ZXJ5Kik+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnkgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWVudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbAotdmFsdWUuICBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIG9uZSBtdXN0IGJlIHN1cHBsaWVkCi1kdXJpbmcgZGVwbG95bWVudC4KLQotVXNlZCBpbjogZW50aXR5LCBtZXNzYWdlLWRyaXZlbiwgc2Vzc2lvbgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5IChkZXNjcmlwdGlvbj8sIGVudi1lbnRyeS1uYW1lLCBlbnYtZW50cnktdHlwZSwKLQkJZW52LWVudHJ5LXZhbHVlPyk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi1lbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGVudGVycHJpc2UgYmVhbi4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0KLUV4YW1wbGU6Ci0KLTxlbnYtZW50cnktbmFtZT5taW5BbW91bnQ8L2Vudi1lbnRyeS1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZgotdGhlIGVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlIGVudGVycHJpc2UgYmVhbidzCi1jb2RlLgotCi1UaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlOgotCi0JamF2YS5sYW5nLkJvb2xlYW4KLQlqYXZhLmxhbmcuQnl0ZQotCWphdmEubGFuZy5DaGFyYWN0ZXIKLQlqYXZhLmxhbmcuU3RyaW5nCi0JamF2YS5sYW5nLlNob3J0Ci0JamF2YS5sYW5nLkludGVnZXIKLQlqYXZhLmxhbmcuTG9uZwotCWphdmEubGFuZy5GbG9hdAotCWphdmEubGFuZy5Eb3VibGUKLQotCi1Vc2VkIGluOiBlbnYtZW50cnkKLQotRXhhbXBsZToKLQotPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncwotZW52aXJvbm1lbnQgZW50cnkuIFRoZSB2YWx1ZSBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZQotY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYSBzaW5nbGUgU3RyaW5nCi1wYXJhbWV0ZXIsIG9yIGZvciBqYXZhLmxhbmcuQ2hhcmFjdGVyLCBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotCi08ZW52LWVudHJ5LXZhbHVlPjEwMC4wMDwvZW52LWVudHJ5LXZhbHVlPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LXZhbHVlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGV4Y2x1ZGUgbGlzdCBlbGVtZW50IHNwZWNpZmllcyBvbmUgb3IgbW9yZSBtZXRob2RzIHdoaWNoIHRoZQotQXNzZW1ibGVyIG1hcmtzIHRvIGJlIHVuY2FsbGFibGUuCi0KLUlmIHRoZSBtZXRob2QgcGVybWlzc2lvbiByZWxhdGlvbiBjb250YWlucyBtZXRob2RzIHRoYXQgYXJlIGluIHRoZQotZXhjbHVkZSBsaXN0LCB0aGUgRGVwbG95ZXIgc2hvdWxkIGNvbnNpZGVyIHRob3NlIG1ldGhvZHMgdG8gYmUKLXVuY2FsbGFibGUuCi0KLVVzZWQgaW46IGFzc2VtYmx5LWRlc2NyaXB0b3IKLS0tPgotPCFFTEVNRU5UIGV4Y2x1ZGUtbGlzdCAoZGVzY3JpcHRpb24/LCBtZXRob2QrKT4KLQotPCEtLQotVGhlIGZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBjb250YWluZXIgbWFuYWdlZAotZmllbGQuCi0KLVRoZSBuYW1lIG9mIHRoZSBjbXAtZmllbGQgb2YgYW4gZW50aXR5IGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnggbXVzdAotYmVnaW4gd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcyB3aG9zZQotbmFtZXMgY29uc2lzdHMgb2YgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHNwZWNpZmllZCBieSBmaWVsZC1uYW1lIGluCi13aGljaCB0aGUgZmlyc3QgbGV0dGVyIGlzIHVwcGVyY2FzZWQsIHByZWZpeGVkIGJ5ICJnZXQiIG9yICJzZXQiLgotCi1UaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGggY21wLXZlcnNpb24gMS54IG11c3QKLWRlbm90ZSBhIHB1YmxpYyBmaWVsZCBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG9yIG9uZSBvZiBpdHMKLXN1cGVyY2xhc3Nlcy4KLQotVXNlZCBpbjogY21wLWZpZWxkCi0KLUV4YW1wbGU6Ci0KLQotCTxmaWVsZC1uYW1lPmZpcnN0TmFtZTwvZmllbGQtTmFtZT4KLQotLS0+Ci08IUVMRU1FTlQgZmllbGQtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlCi1iZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IGVqYi1yZWYsIGVudGl0eSwgc2Vzc2lvbgotCi1FeGFtcGxlOgotCi08aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KLS0tPgotPCFFTEVNRU5UIGhvbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotY29udGFpbmluZyBhIGxhcmdlICgzMiB4IDMyKSBpY29uIGltYWdlLiBUaGUgZmlsZQotbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncwotZWpiLWphciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGVqYi1qYXIsIGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLQotRXhhbXBsZToKLQotPGxhcmdlLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgotLS0+Ci08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLQotVGhlIGxvY2FsIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQotZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmLCBlbnRpdHksIHNlc3Npb24KLQotLS0+Ci08IUVMRU1FTlQgbG9jYWwgKCNQQ0RBVEEpPgotCi08IS0tCi0KLVRoZSBsb2NhbC1ob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQotZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaG9tZSBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IGVqYi1sb2NhbC1yZWYsIGVudGl0eSwgc2Vzc2lvbgotLS0+Ci08IUVMRU1FTlQgbG9jYWwtaG9tZSAoI1BDREFUQSk+Ci0KLTwhLS0KLQotVGhlIG1lc3NhZ2UtZHJpdmVuIGVsZW1lbnQgZGVjbGFyZXMgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLiBUaGUKLWRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCS0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0JLSBhbiBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZQotCS0gYW4gb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlIG5hbWUKLQktIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluCi0JICB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZQotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncwotCSAgbWVzc2FnZSBzZWxlY3RvcgotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlCi0JICBhY2tub3dsZWRnbWVudCBtb2RlIGZvciB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbgotCSAgaWYgYmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uIGlzIHVzZWQKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZQotCSAgaW50ZW5kZWQgZGVzdGluYXRpb24gdHlwZSBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbgotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudCBlbnRyaWVzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIEVKQiByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkKLQkgIGlkZW50aXR5IHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIG1hbmFnZXIKLQkgIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlCi0gICAgICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLQotVXNlZCBpbjogZW50ZXJwcmlzZS1iZWFucwotLS0+Ci08IUVMRU1FTlQgbWVzc2FnZS1kcml2ZW4gKGRlc2NyaXB0aW9uPywgZGlzcGxheS1uYW1lPywgc21hbGwtaWNvbj8sCi0JCWxhcmdlLWljb24/LCBlamItbmFtZSwgZWpiLWNsYXNzLCB0cmFuc2FjdGlvbi10eXBlLAotCQltZXNzYWdlLXNlbGVjdG9yPywgYWNrbm93bGVkZ2UtbW9kZT8sCi0JCW1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uPywgZW52LWVudHJ5KiwgZWpiLXJlZiosCi0JCWVqYi1sb2NhbC1yZWYqLCBzZWN1cml0eS1pZGVudGl0eT8sIHJlc291cmNlLXJlZiosCi0JCXJlc291cmNlLWVudi1yZWYqKT4KLQotPCEtLQotVGhlIG1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uIGVsZW1lbnQgcHJvdmlkZXMgYWR2aWNlIHRvIHRoZSBEZXBsb3llcgotYXMgdG8gd2hldGhlciBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4gaXMgaW50ZW5kZWQgZm9yIGEgUXVldWUgb3IgYQotVG9waWMuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjogdGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuCi1iZWFuJ3MgaW50ZW5kZWQgZGVzdGluYXRpb24gYW5kIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHdoZXRoZXIgYQotZHVyYWJsZSBvciBub24tZHVyYWJsZSBzdWJzY3JpcHRpb24gc2hvdWxkIGJlIHVzZWQgaWYgdGhlCi1kZXN0aW5hdGlvbi10eXBlIGlzIGphdmF4Lmptcy5Ub3BpYy4KLQotVXNlZCBpbjogbWVzc2FnZS1kcml2ZW4KLS0tPgotPCFFTEVNRU5UIG1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uIChkZXN0aW5hdGlvbi10eXBlLAotc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHk/KT4KLQotPCEtLQotVGhlIG1lc3NhZ2Utc2VsZWN0b3IgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIEpNUyBtZXNzYWdlCi1zZWxlY3RvciB0byBiZSB1c2VkIGluIGRldGVybWluaW5nIHdoaWNoIG1lc3NhZ2VzIGEgbWVzc2FnZS1kcml2ZW4KLWJlYW4gaXMgdG8gcmVjZWl2ZS4KLQotRXhhbXBsZToKLTxtZXNzYWdlLXNlbGVjdG9yPkpNU1R5cGUgPSBgY2FyJyBBTkQgY29sb3IgPSBgYmx1ZScgQU5EIHdlaWdodCAmZ3Q7IDI1MDAKLTwvbWVzc2FnZS1zZWxlY3Rvcj4KLQotVXNlZCBpbjogbWVzc2FnZS1kcml2ZW4KLS0tPgotPCFFTEVNRU5UIG1lc3NhZ2Utc2VsZWN0b3IgKCNQQ0RBVEEpPgotCi08IS0tCi0KLVRoZSBtZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlCi1iZWFuJ3MgaG9tZSBvciBjb21wb25lbnQgaW50ZXJmYWNlLCBvciwgaW4gdGhlIGNhc2Ugb2YgYSBtZXNzYWdlLWRyaXZlbgotYmVhbiwgdGhlIGJlYW4ncyBvbk1lc3NhZ2UgbWV0aG9kLCBvciBhIHNldCBvZiBtZXRob2RzLiBUaGUgZWpiLW5hbWUKLWVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIGVudGVycHJpc2UgYmVhbnMgZGVjbGFyZWQgaW4KLXRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyB0bwotZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSB0aGF0IGlzIG11bHRpcGx5Ci1kZWZpbmVkIGFjcm9zcyBpbiBib3RoIHRoZSBob21lIGFuZCBjb21wb25lbnQgaW50ZXJmYWNlczsgdGhlCi1tZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWV0aG9kIG5hbWU7IGFuZCB0aGUgb3B0aW9uYWwKLW1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkgYSBzaW5nbGUgbWV0aG9kIGFtb25nIG11bHRpcGxlIG1ldGhvZHMKLXdpdGggYW4gb3ZlcmxvYWRlZCBtZXRob2QgbmFtZS4KLQotVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgc3ludGF4OgotCi0xLgotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotPC9tZXRob2Q+Ci0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIHNwZWNpZmllZAotICAgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBhbmQgY29tcG9uZW50IGludGVyZmFjZXMuCi0KLTIuCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLTwvbWV0aG9kPj4KLQotICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mIHRoZQotICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1ldGhvZHMgd2l0aAotICAgdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZiB0aGlzIHN0eWxlIHJlZmVycyB0bwotICAgYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQgbmFtZS4KLQotCi0zLgotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0gICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPlBBUkFNLTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgLi4uCi0gICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tbjwvbWV0aG9kLXBhcmFtPgotICAgIDwvbWV0aG9kLXBhcmFtcz4KLTxtZXRob2Q+Ci0KLQotICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYSBzZXQgb2YKLSAgIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaCBQQVJBTS1uIGFyZSB0aGUKLSAgIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZSBtZXRob2QncyBpbnB1dCBwYXJhbWV0ZXJzIChpZgotICAgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQgYXJndW1lbnRzLCB0aGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50Ci0gICBjb250YWlucyBubyBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUKLSAgIGFycmF5IGVsZW1lbnQncyB0eXBlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwYWlyIG9mIHNxdWFyZQotICAgYnJhY2tldHMgKGUuZy4gaW50W11bXSkuIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtZXRob2RzIHdpdGggdGhlCi0gICBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhpcyBzdHlsZSByZWZlcnMgdG8gYWxsIG9mIHRoZSBvdmVybG9hZGVkCi0gICBtZXRob2RzLgotCi0KLVVzZWQgaW46IGNvbnRhaW5lci10cmFuc2FjdGlvbiwgZXhjbHVkZS1saXN0LCBtZXRob2QtcGVybWlzc2lvbgotCi1FeGFtcGxlczoKLQotU3R5bGUgMTogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIG9mCi10aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGFuZCBjb21wb25lbnQgaW50ZXJmYWNlczoKLQotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4KLQotU3R5bGUgMjogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZSBjcmVhdGUKLW1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UocykuCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4KLQotCi1TdHlsZSAzOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byB0aGUKLWNyZWF0ZShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgTGFzdE5hbWUpIG1ldGhvZCBvZiB0aGUKLUVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UocykuCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0gICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICA8L21ldGhvZC1wYXJhbXM+Ci08L21ldGhvZD4KLQotCi1UaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgYSBTdHlsZSAzIGVsZW1lbnQgd2l0aAotbW9yZSBjb21wbGV4IHBhcmFtZXRlciB0eXBlcy4gVGhlIG1ldGhvZAotZm9vYmFyKGNoYXIgcywgaW50IGksIGludFtdIGlhciwgbXlwYWNrYWdlLk15Q2xhc3MgbXljbCwKLW15cGFja2FnZS5NeUNsYXNzW11bXSBteWNsYWFyKSB3b3VsZCBiZSBzcGVjaWZpZWQgYXM6Ci0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPmZvb2JhcjwvbWV0aG9kLW5hbWU+Ci0gICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+Y2hhcjwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmludDwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmludFtdPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3M8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzc1tdW108L21ldGhvZC1wYXJhbT4KLSAgICA8L21ldGhvZC1wYXJhbXM+Ci08L21ldGhvZD4KLQotCi1UaGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aGVuIGl0IGJlY29tZXMgbmVjZXNzYXJ5Ci10byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBtZXRob2QgdGhhdCBpcyBtdWx0aXBseSBkZWZpbmVkIGFjcm9zcyB0aGUKLWVudGVycHJpc2UgYmVhbidzIGhvbWUgYW5kIGNvbXBvbmVudCBpbnRlcmZhY2VzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKLXNpZ25hdHVyZS4KLQotCi1Gb3IgZXhhbXBsZSwgdGhlIG1ldGhvZCBlbGVtZW50Ci0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0gICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICA8L21ldGhvZC1wYXJhbXM+Ci08L21ldGhvZD4KLQotCi1jYW4gYmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpIG1ldGhvZCBkZWZpbmVkCi1pbiB0aGUgcmVtb3RlIGludGVyZmFjZSBmcm9tIHRoZSBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpIG1ldGhvZCBkZWZpbmVkCi1pbiB0aGUgcmVtb3RlIGhvbWUgaW50ZXJmYWNlLCB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLQotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0gICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICA8L21ldGhvZC1wYXJhbXM+Ci08L21ldGhvZD4KLQotYW5kIHRoZSBjcmVhdGUgbWV0aG9kIHRoYXQgaXMgZGVmaW5lZCBpbiB0aGUgbG9jYWwgaG9tZSBpbnRlcmZhY2UKLXdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKLQotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLSAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgIDwvbWV0aG9kLXBhcmFtcz4KLTwvbWV0aG9kPgotCi0KLVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdpdGggYWxsIHRocmVlIFN0eWxlcyBvZiB0aGUKLW1ldGhvZCBlbGVtZW50IHVzYWdlLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudAotZXhhbXBsZSBjb3VsZCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUKLUVtcGxveWVlU2VydmljZSBiZWFuJ3MgcmVtb3RlIGhvbWUgaW50ZXJmYWNlLgotCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLTwvbWV0aG9kPgotCi0tLT4KLTwhRUxFTUVOVCBtZXRob2QgKGRlc2NyaXB0aW9uPywgZWpiLW5hbWUsIG1ldGhvZC1pbnRmPywgbWV0aG9kLW5hbWUsCi1tZXRob2QtcGFyYW1zPyk+Ci0KLTwhLS0KLQotVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIGEgbWV0aG9kIGVsZW1lbnQgdG8gZGlmZmVyZW50aWF0ZQotYmV0d2VlbiB0aGUgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHNpZ25hdHVyZSB0aGF0IGFyZSBtdWx0aXBseQotZGVmaW5lZCBhY3Jvc3MgdGhlIGNvbXBvbmVudCBhbmQgaG9tZSBpbnRlcmZhY2VzIChlLmcsIGluIGJvdGggYW4KLWVudGVycHJpc2UgYmVhbidzIHJlbW90ZSBhbmQgbG9jYWwgaW50ZXJmYWNlczsgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGV0Yy4pCi0KLVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQk8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0JPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0JPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0JPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLQotVXNlZCBpbjogbWV0aG9kCi0tLT4KLTwhRUxFTUVOVCBtZXRob2QtaW50ZiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBtZXRob2QtbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4gbWV0aG9kCi1vciB0aGUgYXN0ZXJpc2sgKCopIGNoYXJhY3Rlci4gVGhlIGFzdGVyaXNrIGlzIHVzZWQgd2hlbiB0aGUgZWxlbWVudAotZGVub3RlcyBhbGwgdGhlIG1ldGhvZHMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgY29tcG9uZW50IGFuZCBob21lCi1pbnRlcmZhY2VzLgotCi1Vc2VkIGluOiBtZXRob2QsIHF1ZXJ5LW1ldGhvZAotLS0+Ci08IUVMRU1FTlQgbWV0aG9kLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbWV0aG9kLXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZQotb2YgYSBtZXRob2QgcGFyYW1ldGVyLgotCi1Vc2VkIGluOiBtZXRob2QtcGFyYW1zCi0tLT4KLTwhRUxFTUVOVCBtZXRob2QtcGFyYW0gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50IGNvbnRhaW5zIGEgbGlzdCBvZiB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEKLXR5cGUgbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLgotCi1Vc2VkIGluOiBtZXRob2QsIHF1ZXJ5LW1ldGhvZAotLS0+Ci08IUVMRU1FTlQgbWV0aG9kLXBhcmFtcyAobWV0aG9kLXBhcmFtKik+Ci0KLTwhLS0KLQotVGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgb25lIG9yIG1vcmUgc2VjdXJpdHkKLXJvbGVzIGFyZSBhbGxvd2VkIHRvIGludm9rZSBvbmUgb3IgbW9yZSBlbnRlcnByaXNlIGJlYW4gbWV0aG9kcy4gVGhlCi1tZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhIGxpc3QKLW9mIHNlY3VyaXR5IHJvbGUgbmFtZXMgb3IgYW4gaW5kaWNhdG9yIHRvIHN0YXRlIHRoYXQgdGhlIG1ldGhvZCBpcwotdW5jaGVja2VkIGZvciBhdXRob3JpemF0aW9uLCBhbmQgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cy4KLQotVGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgbXVzdCBiZQotZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLAotYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncwotY29tcG9uZW50IGFuZC9vciBob21lIGludGVyZmFjZXMuCi0KLQotVXNlZCBpbjogYXNzZW1ibHktZGVzY3JpcHRvcgotLS0+Ci08IUVMRU1FTlQgbWV0aG9kLXBlcm1pc3Npb24gKGRlc2NyaXB0aW9uPywgKHJvbGUtbmFtZSt8dW5jaGVja2VkKSwgbWV0aG9kKyk+Ci0KLTwhLS0KLVRoZSBtdWx0aXBsaWNpdHkgZWxlbWVudCBkZXNjcmliZXMgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgcm9sZSB0aGF0Ci1wYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbi4KLQotVGhlIG11bHRpcGxpY2l0eSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLQk8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLQotVXNlZCBpbjogZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0tLT4KLTwhRUxFTUVOVCBtdWx0aXBsaWNpdHkgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcGVyc2lzdGVuY2UtdHlwZSBlbGVtZW50IHNwZWNpZmllcyBhbiBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlCi1tYW5hZ2VtZW50IHR5cGUuCi0KLVRoZSBwZXJzaXN0ZW5jZS10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotCTxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLQotVXNlZCBpbjogZW50aXR5Ci0tLT4KLTwhRUxFTUVOVCBwZXJzaXN0ZW5jZS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi1lbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzLgotCi1JZiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgaXMgZGVmZXJyZWQgdG8gZGVwbG95bWVudAotdGltZSwgdGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgc2hvdWxkIHNwZWNpZnkgamF2YS5sYW5nLk9iamVjdC4KLQotVXNlZCBpbjogZW50aXR5Ci0KLUV4YW1wbGVzOgotCi0JPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ByaW0ta2V5LWNsYXNzPgotCi0JPHByaW0ta2V5LWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZUlEPC9wcmltLWtleS1jbGFzcz4KLQotCTxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuT2JqZWN0PC9wcmltLWtleS1jbGFzcz4KLQotLS0+Ci08IUVMRU1FTlQgcHJpbS1rZXktY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgcHJpbWFyeQota2V5IGZpZWxkIGZvciBhbiBlbnRpdHkgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQotVGhlIHByaW1rZXktZmllbGQgbXVzdCBiZSBvbmUgb2YgdGhlIGZpZWxkcyBkZWNsYXJlZCBpbiB0aGUgY21wLWZpZWxkCi1lbGVtZW50LCBhbmQgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkga2V5Ci10eXBlLgotCi1UaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIG5vdCB1c2VkIGlmIHRoZSBwcmltYXJ5IGtleSBtYXBzIHRvCi1tdWx0aXBsZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgKGkuZS4gdGhlIGtleSBpcyBhIGNvbXBvdW5kIGtleSkuIEluCi10aGlzIGNhc2UsIHRoZSBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQKLXRoZWlyIG5hbWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuCi1jbGFzcyB0aGF0IGNvbXByaXNlIHRoZSBrZXkuCi0KLVVzZWQgaW46IGVudGl0eQotCi1FeGFtcGxlOgotCi0JPHByaW1rZXktZmllbGQ+RW1wbG95ZWVJZDwvcHJpbWtleS1maWVsZD4KLQotLS0+Ci08IUVMRU1FTlQgcHJpbWtleS1maWVsZCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBxdWVyeSBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSBhIGZpbmRlciBvciBzZWxlY3QgcXVlcnkuIEl0Ci1jb250YWlucwotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5Ci0JLSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmluZGVyIG9yIHNlbGVjdAotCSAgbWV0aG9kIGl0IGlzIHVzZWQgYnkKLSAgICAgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSByZXN1bHQgdHlwZSBtYXBwaW5nLCBpZgotICAgICAgICAgIHRoZSBxdWVyeSBpcyBmb3IgYSBzZWxlY3QgbWV0aG9kIGFuZCBlbnRpdHkgb2JqZWN0cyBhcmUKLSAgICAgICAgICByZXR1cm5lZC4KLSAgICAJLSB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHF1ZXJ5LgotCi1RdWVyaWVzIHRoYXQgYXJlIGV4cHJlc3NpYmxlIGluIEVKQiBRTCBtdXN0IHVzZSB0aGUgZWpiLXFsIGVsZW1lbnQgdG8KLXNwZWNpZnkgdGhlIHF1ZXJ5LiBJZiBhIHF1ZXJ5IGlzIG5vdCBleHByZXNzaWJsZSBpbiBFSkIgUUwsIHRoZQotZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgYmUgdXNlZCB0byBkZXNjcmliZSB0aGUgc2VtYW50aWNzIG9mIHRoZQotcXVlcnkgYW5kIHRoZSBlamItcWwgZWxlbWVudCBzaG91bGQgYmUgZW1wdHkuCi0KLVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nIGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIEl0IGNhbiBvbmx5IGJlIHByZXNlbnQKLWlmIHRoZSBxdWVyeS1tZXRob2Qgc3BlY2lmaWVzIGEgc2VsZWN0IG1ldGhvZCB0aGF0IHJldHVybnMgZW50aXR5Ci1vYmplY3RzLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSByZXN1bHQtdHlwZS1tYXBwaW5nIGVsZW1lbnQgaXMKLSJMb2NhbCIuCi0KLQotVXNlZCBpbjogZW50aXR5Ci0tLT4KLTwhRUxFTUVOVCBxdWVyeSAoZGVzY3JpcHRpb24/LCBxdWVyeS1tZXRob2QsIHJlc3VsdC10eXBlLW1hcHBpbmc/LCBlamItcWwpPgotCi08IS0tCi1UaGUgcXVlcnktbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBtZXRob2QgZm9yIGEgZmluZGVyIG9yCi1zZWxlY3QgcXVlcnkuCi0KLVRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGZpbmRlciBvciBzZWxlY3QKLW1ldGhvZCBpbiB0aGUgZW50aXR5IGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQotRWFjaCBtZXRob2QtcGFyYW0gbXVzdCBiZSBkZWZpbmVkIGZvciBhIHF1ZXJ5LW1ldGhvZCB1c2luZyB0aGUKLW1ldGhvZC1wYXJhbXMgZWxlbWVudC4KLQotVXNlZCBpbjogcXVlcnkKLQotRXhhbXBsZToKLQotPHF1ZXJ5PgotICAgIDxkZXNjcmlwdGlvbj5NZXRob2QgZmluZHMgbGFyZ2Ugb3JkZXJzPC9kZXNjcmlwdGlvbj4KLSAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICA8bWV0aG9kLW5hbWU+ZmluZExhcmdlT3JkZXJzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgIDwvcXVlcnktbWV0aG9kPgotICAgIDxlamItcWw+U0VMRUNUIE9CSkVDVChvKSBGUk9NIE9yZGVyIG8gV0hFUkUgby5hbW91bnQgJmd0OyAxMDAwPC9lamItcWw+Ci08L3F1ZXJ5PgotCi0tLT4KLTwhRUxFTUVOVCBxdWVyeS1tZXRob2QgKG1ldGhvZC1uYW1lLCBtZXRob2QtcGFyYW1zKT4KLQotPCEtLQotVGhlIHJlZW50cmFudCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGFuIGVudGl0eSBiZWFuIGlzIHJlZW50cmFudCBvcgotbm90LgotCi1UaGUgcmVlbnRyYW50IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLQk8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0KLVVzZWQgaW46IGVudGl0eQotLS0+Ci08IUVMRU1FTlQgcmVlbnRyYW50ICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgZGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEgcm9sZQotdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlCi1lbGVtZW50IHVuaXF1ZWx5IGlkZW50aWZpZXMgYW4gZW50aXR5IGJlYW4uCi0KLVVzZWQgaW46IGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotLS0+Ci08IUVMRU1FTlQgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIChkZXNjcmlwdGlvbj8sIGVqYi1uYW1lKT4KLQotPCEtLQotVGhlIHJlbGF0aW9uc2hpcHMgZWxlbWVudCBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4gd2hpY2gKLWVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlIHBhcnRpY2lwYXRlLiBUaGUKLXJlbGF0aW9uc2hpcHMgZWxlbWVudCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgYW5kIGEgbGlzdCBvZgotZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZAotcmVsYXRpb25zaGlwcy4KLQotCi1Vc2VkIGluOiBlamItamFyCi0tLT4KLTwhRUxFTUVOVCByZWxhdGlvbnNoaXBzIChkZXNjcmlwdGlvbj8sIGVqYi1yZWxhdGlvbispPgotCi08IS0tCi1UaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlCi1iZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLXJlZiwgZW50aXR5LCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0KLTxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotLS0+Ci08IUVMRU1FTlQgcmVtb3RlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlIHNpZ25zCi1vbiBwcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvciB3aGV0aGVyIHRoZSBDb250YWluZXIKLXdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlIGVudGVycHJpc2UgYmVhbi4gSW4gdGhlCi1sYXR0ZXIgY2FzZSwgdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlCi1EZXBsb3llci4KLQotVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0JPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLWF1dGggKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgbWFuYWdlcgotY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGVudGVycHJpc2UgYmVhbi4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXNoYXJpbmctc2NvcGUgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucyBvYnRhaW5lZAotdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZQotc2hhcmVkLiBUaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50LCBpZiBzcGVjaWZpZWQsIG11c3QgYmUgb25lIG9mIHRoZQotdHdvIGZvbGxvd2luZzoKLQotCTxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotCTxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0KLVRoZSBkZWZhdWx0IHZhbHVlIGlzIFNoYXJlYWJsZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtc2hhcmluZy1zY29wZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YSBzb3VyY2UuIFRoZSB0eXBlCi1pcyBzcGVjaWZpZWQgYnkgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZQotZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGEgc291cmNlLgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLWVudi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi1yZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZQotaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbgotaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkKLXRoZSBlbnRlcnByaXNlIGJlYW4gY29kZS4KLQotVXNlZCBpbjogZW50aXR5LCBtZXNzYWdlLWRyaXZlbiwgc2Vzc2lvbgotCi1FeGFtcGxlOgotCi08cmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLTwvcmVzb3VyY2UtZW52LXJlZj4KLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLWVudi1yZWYgKGRlc2NyaXB0aW9uPywgcmVzb3VyY2UtZW52LXJlZi1uYW1lLAotCQlyZXNvdXJjZS1lbnYtcmVmLXR5cGUpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UKLWVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLXRoZSBlbnRlcnByaXNlIGJlYW4gY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gZW50ZXJwcmlzZSBiZWFuLgotCi1Vc2VkIGluOiByZXNvdXJjZS1lbnYtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtZW52LXJlZi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGEgcmVzb3VyY2UKLWVudmlyb25tZW50IHJlZmVyZW5jZS4gIEl0IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEKLWxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtZW52LXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLXJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsCi10aGUgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZQotZXhwZWN0ZWQgYnkgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLCB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbgotKEFwcGxpY2F0aW9uIG9yIENvbnRhaW5lciksIGFuZCBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZQotc2hhcmVhYmlsaXR5IG9mIGNvbm5lY3Rpb25zIG9idGFpbmVkIGZyb20gdGhlIHJlc291cmNlIChTaGFyZWFibGUgb3IKLVVuc2hhcmVhYmxlKS4KLQotVXNlZCBpbjogZW50aXR5LCBtZXNzYWdlLWRyaXZlbiwgc2Vzc2lvbgotCi1FeGFtcGxlOgotCi0gICAgPHJlc291cmNlLXJlZj4KLQk8cmVzLXJlZi1uYW1lPmpkYmMvRW1wbG95ZWVBcHBEQjwvcmVzLXJlZi1uYW1lPgotCTxyZXMtdHlwZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvcmVzLXR5cGU+Ci0JPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0JPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1yZWYgKGRlc2NyaXB0aW9uPywgcmVzLXJlZi1uYW1lLCByZXMtdHlwZSwgcmVzLWF1dGgsCi0JCXJlcy1zaGFyaW5nLXNjb3BlPyk+Ci0KLTwhLS0KLQotVGhlIHJlc3VsdC10eXBlLW1hcHBpbmcgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBxdWVyeSBlbGVtZW50IHRvIHNwZWNpZnkKLXdoZXRoZXIgYW4gYWJzdHJhY3Qgc2NoZW1hIHR5cGUgcmV0dXJuZWQgYnkgYSBxdWVyeSBmb3IgYSBzZWxlY3QgbWV0aG9kCi1pcyB0byBiZSBtYXBwZWQgdG8gYW4gRUpCTG9jYWxPYmplY3Qgb3IgRUpCT2JqZWN0IHR5cGUuCi0KLVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5Mb2NhbDwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+UmVtb3RlPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotCi1Vc2VkIGluOiBxdWVyeQotLS0+Ci08IUVMRU1FTlQgcmVzdWx0LXR5cGUtbWFwcGluZyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgc2VjdXJpdHkgcm9sZS4gVGhlCi1yb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4gdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcwotZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLQotVXNlZCBpbjogc2VjdXJpdHktcm9sZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJvbGUtbGluayAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4KLQotVXNlZCBpbjogbWV0aG9kLXBlcm1pc3Npb24sIHJ1bi1hcywgc2VjdXJpdHktcm9sZSwgc2VjdXJpdHktcm9sZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJvbGUtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBydW4tYXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUKLWV4ZWN1dGlvbiBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kCi10aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLVVzZWQgaW46IHNlY3VyaXR5LWlkZW50aXR5Ci0tLT4KLTwhRUxFTUVOVCBydW4tYXMgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKT4KLQotPCEtLQotCi1UaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3MKLXNlY3VyaXR5IGlkZW50aXR5IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIG1ldGhvZHMgb2YKLXRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcyBpZGVudGl0eSBpcyB0byBiZQotdXNlZC4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUKLXNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuCi0KLVVzZWQgaW46IGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LWlkZW50aXR5IChkZXNjcmlwdGlvbj8sICh1c2UtY2FsbGVyLWlkZW50aXR5fHJ1bi1hcykpPgotCi08IS0tCi1UaGUgc2VjdXJpdHktcm9sZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkKLXJvbGUuIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZQotc2VjdXJpdHkgcm9sZSwgYW5kIHRoZSBzZWN1cml0eSByb2xlIG5hbWUuCi0KLVVzZWQgaW46IGFzc2VtYmx5LWRlc2NyaXB0b3IKLQotRXhhbXBsZToKLQotICAgIDxzZWN1cml0eS1yb2xlPgotCTxkZXNjcmlwdGlvbj4KLQkgICAgVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkCi0JICAgIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUgc2VydmljZSBhcHBsaWNhdGlvbi4KLQk8L2Rlc2NyaXB0aW9uPgotCTxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4KLSAgICA8L3NlY3VyaXR5LXJvbGU+Ci0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1yb2xlIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSk+Ci0KLTwhLS0KLVRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHNlY3VyaXR5Ci1yb2xlIHJlZmVyZW5jZSBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgY29kZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzCi1vZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZSB1c2VkIGluIHRoZSBjb2RlLAotYW5kIGFuIG9wdGlvbmFsIGxpbmsgdG8gYSBzZWN1cml0eSByb2xlLiBJZiB0aGUgc2VjdXJpdHkgcm9sZSBpcyBub3QKLXNwZWNpZmllZCwgdGhlIERlcGxveWVyIG11c3QgY2hvb3NlIGFuIGFwcHJvcHJpYXRlIHNlY3VyaXR5IHJvbGUuCi0KLVRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgU3RyaW5nIHVzZWQgYXMgdGhlCi1wYXJhbWV0ZXIgdG8gdGhlIEVKQkNvbnRleHQuaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGVOYW1lKSBtZXRob2QKLW9yIHRoZSBIdHRwU2VydmxldFJlcXVlc3QuaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSBtZXRob2QuCi0KLVVzZWQgaW46IGVudGl0eSwgc2Vzc2lvbgotCi0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1yb2xlLXJlZiAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUsIHJvbGUtbGluaz8pPgotCi08IS0tCi1UaGUgc2Vzc2lvbiBlbGVtZW50IGRlY2xhcmVzIGFuIHNlc3Npb24gYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzCi1vZjoKLQktIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQktIGFuIG9wdGlvbmFsIHNtYWxsIGljb24gZmlsZSBuYW1lCi0JLSBhbiBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUgbmFtZQotCS0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLQkgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0aW9uCi0JLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lIGFuZAotCSAgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotCS0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZAotCSAgbG9jYWwgaW50ZXJmYWNlcywgaWYgYW55Ci0JLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLQktIHRoZSBzZXNzaW9uIGJlYW4ncyBzdGF0ZSBtYW5hZ2VtZW50IHR5cGUKLQktIHRoZSBzZXNzaW9uIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQgZW50cmllcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlCi0gICAgICAgICAgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzIG1ldGhvZHMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UgbWFuYWdlcgotCSAgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UgZW52aXJvbm1lbnQKLQkgIHJlZmVyZW5jZXMuCi0KLVRoZSBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5Ci1hcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotCi1FaXRoZXIgYm90aCB0aGUgbG9jYWwtaG9tZSBhbmQgdGhlIGxvY2FsIGVsZW1lbnRzIG9yIGJvdGggdGhlCi1ob21lIGFuZCB0aGUgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGZvciB0aGUgc2Vzc2lvbiBiZWFuLgotCi1Vc2VkIGluOiBlbnRlcnByaXNlLWJlYW5zCi0tLT4KLTwhRUxFTUVOVCBzZXNzaW9uIChkZXNjcmlwdGlvbj8sIGRpc3BsYXktbmFtZT8sIHNtYWxsLWljb24/LAotbGFyZ2UtaWNvbj8sIGVqYi1uYW1lLCBob21lPywgcmVtb3RlPywgbG9jYWwtaG9tZT8sIGxvY2FsPywKLWVqYi1jbGFzcywgc2Vzc2lvbi10eXBlLCB0cmFuc2FjdGlvbi10eXBlLCBlbnYtZW50cnkqLCBlamItcmVmKiwKLWVqYi1sb2NhbC1yZWYqLCBzZWN1cml0eS1yb2xlLXJlZiosIHNlY3VyaXR5LWlkZW50aXR5PywgcmVzb3VyY2UtcmVmKiwKLXJlc291cmNlLWVudi1yZWYqKT4KLQotPCEtLQotVGhlIHNlc3Npb24tdHlwZSBlbGVtZW50IGRlc2NyaWJlcyB3aGV0aGVyIHRoZSBzZXNzaW9uIGJlYW4gaXMgYQotc3RhdGVmdWwgc2Vzc2lvbiBvciBzdGF0ZWxlc3Mgc2Vzc2lvbi4KLQotVGhlIHNlc3Npb24tdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JPHNlc3Npb24tdHlwZT5TdGF0ZWZ1bDwvc2Vzc2lvbi10eXBlPgotCTxzZXNzaW9uLXR5cGU+U3RhdGVsZXNzPC9zZXNzaW9uLXR5cGU+Ci0tLT4KLTwhRUxFTUVOVCBzZXNzaW9uLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQotbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncwotZWpiLWphciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGVqYi1qYXIsIGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLQotRXhhbXBsZToKLQotPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzdWJzY3JpcHRpb24tZHVyYWJpbGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGEgSk1TIHRvcGljCi1zdWJzY3JpcHRpb24gaXMgaW50ZW5kZWQgdG8gYmUgZHVyYWJsZSBvciBub25kdXJhYmxlLgotCi1UaGUgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxzdWJzY3JpcHRpb24tZHVyYWJpbGl0eT5EdXJhYmxlPC9zdWJzY3JpcHRpb24tZHVyYWJpbGl0eT4KLQk8c3Vic2NyaXB0aW9uLWR1cmFiaWxpdHk+Tm9uRHVyYWJsZTwvc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHk+Ci0KLVVzZWQgaW46IG1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uCi0tLT4KLTwhRUxFTUVOVCBzdWJzY3JpcHRpb24tZHVyYWJpbGl0eSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB0cmFucy1hdHRyaWJ1dGUgZWxlbWVudCBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UKLXRoZSB0cmFuc2FjdGlvbiBib3VuZGFyaWVzIHdoZW4gZGVsZWdhdGluZyBhIG1ldGhvZCBpbnZvY2F0aW9uIHRvIGFuCi1lbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuCi0KLVRoZSB2YWx1ZSBvZiB0cmFucy1hdHRyaWJ1dGUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCi0JPHRyYW5zLWF0dHJpYnV0ZT5Ob3RTdXBwb3J0ZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLQk8dHJhbnMtYXR0cmlidXRlPlN1cHBvcnRzPC90cmFucy1hdHRyaWJ1dGU+Ci0JPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlZDwvdHJhbnMtYXR0cmlidXRlPgotCTx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZXNOZXc8L3RyYW5zLWF0dHJpYnV0ZT4KLQk8dHJhbnMtYXR0cmlidXRlPk1hbmRhdG9yeTwvdHJhbnMtYXR0cmlidXRlPgotCTx0cmFucy1hdHRyaWJ1dGU+TmV2ZXI8L3RyYW5zLWF0dHJpYnV0ZT4KLQotVXNlZCBpbjogY29udGFpbmVyLXRyYW5zYWN0aW9uCi0tLT4KLTwhRUxFTUVOVCB0cmFucy1hdHRyaWJ1dGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncwotdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLgotCi1UaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JPHRyYW5zYWN0aW9uLXR5cGU+QmVhbjwvdHJhbnNhY3Rpb24tdHlwZT4KLQk8dHJhbnNhY3Rpb24tdHlwZT5Db250YWluZXI8L3RyYW5zYWN0aW9uLXR5cGU+Ci0KLVVzZWQgaW46IG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCB0cmFuc2FjdGlvbi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHVuY2hlY2tlZCBlbGVtZW50IHNwZWNpZmllcyB0aGF0IGEgbWV0aG9kIGlzIG5vdCBjaGVja2VkIGZvciBhdXRob3JpemF0aW9uCi1ieSB0aGUgY29udGFpbmVyIHByaW9yIHRvIGludm9jYXRpb24gb2YgdGhlIG1ldGhvZC4KLQotVXNlZCBpbjogbWV0aG9kLXBlcm1pc3Npb24KLS0tPgotPCFFTEVNRU5UIHVuY2hlY2tlZCBFTVBUWT4KLQotPCEtLQotCi1UaGUgdXNlLWNhbGxlci1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoZSBjYWxsZXIncyBzZWN1cml0eQotaWRlbnRpdHkgYmUgdXNlZCBhcyB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlCi1lbnRlcnByaXNlIGJlYW4ncyBtZXRob2RzLgotCi1Vc2VkIGluOiBzZWN1cml0eS1pZGVudGl0eQotLS0+Ci08IUVMRU1FTlQgdXNlLWNhbGxlci1pZGVudGl0eSBFTVBUWT4KLQotPCEtLQotVGhlIElEIG1lY2hhbmlzbSBpcyB0byBhbGxvdyB0b29scyB0aGF0IHByb2R1Y2UgYWRkaXRpb25hbCBkZXBsb3ltZW50Ci1pbmZvcm1hdGlvbiAoaS5lLiwgaW5mb3JtYXRpb24gYmV5b25kIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGluZm9ybWF0aW9uKSB0byBzdG9yZSB0aGUgbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGluIGEKLXNlcGFyYXRlIGZpbGUsIGFuZCBlYXNpbHkgcmVmZXIgZnJvbSB0aGVzZSB0b29sLXNwZWNpZmljIGZpbGVzIHRvIHRoZQotaW5mb3JtYXRpb24gaW4gdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotVG9vbHMgYXJlIG5vdCBhbGxvd2VkIHRvIGFkZCB0aGUgbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGludG8gdGhlCi1zdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0tLT4KLQotPCFBVFRMSVNUIGFic3RyYWN0LXNjaGVtYS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGFja25vd2xlZGdlLW1vZGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXNzZW1ibHktZGVzY3JpcHRvciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjYXNjYWRlLWRlbGV0ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjbXAtZmllbGQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY21wLXZlcnNpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY21yLWZpZWxkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNtci1maWVsZC1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNtci1maWVsZC10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnRhaW5lci10cmFuc2FjdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXN0aW5hdGlvbi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRpc3BsYXktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWNsaWVudC1qYXIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWphciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbGluayBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbG9jYWwtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1xbCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlbGF0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWxhdGlvbi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnRlcnByaXNlLWJlYW5zIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudGl0eSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LXZhbHVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGV4Y2x1ZGUtbGlzdCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmaWVsZC1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGhvbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsb2NhbCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsb2NhbC1ob21lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1lc3NhZ2UtZHJpdmVuIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1lc3NhZ2Utc2VsZWN0b3IgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1ldGhvZC1pbnRmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1ldGhvZC1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1ldGhvZC1wYXJhbSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QtcGFyYW1zIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1ldGhvZC1wZXJtaXNzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG11bHRpcGxpY2l0eSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwZXJzaXN0ZW5jZS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByaW0ta2V5LWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByaW1rZXktZmllbGQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcXVlcnkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcXVlcnktbWV0aG9kIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlZW50cmFudCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVsYXRpb25zaGlwcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW1vdGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLWF1dGggaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1zaGFyaW5nLXNjb3BlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzdWx0LXR5cGUtbWFwcGluZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJ1bi1hcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1pZGVudGl0eSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1yb2xlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlc3Npb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2Vzc2lvbi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNtYWxsLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdHJhbnMtYXR0cmlidXRlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRyYW5zYWN0aW9uLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdW5jaGVja2VkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHVzZS1jYWxsZXItaWRlbnRpdHkgaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfMl8xLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8yXzEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTk0MjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8yXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjIwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMi4xIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyllamItamFyXzJfMS54c2RzCTEuMjMgMDgvMDEvMDMKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotICAgICAgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBFSkIgMi4xIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQlUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQgIk1FVEEtSU5GL2VqYi1qYXIueG1sIiBpbgotCXRoZSBFSkIncyBqYXIgZmlsZS4gIEFsbCBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlCi0JdGhlIGVqYi1qYXIgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKMkVFIG5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDxlamItamFyIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0JCSAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9lamItamFyXzJfMS54c2QiCi0JICAgICAgdmVyc2lvbj0iMi4xIj4KLQkgICAgICAuLi4KLQkgICAgPC9lamItamFyPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0JdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgdGhlCi0JSjJFRSBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9lamItamFyXzJfMS54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLQlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItamFyIiB0eXBlPSJqMmVlOmVqYi1qYXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIGlzIHRoZSByb290IG9mIHRoZSBlamItamFyIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDprZXkgbmFtZT0iZWpiLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlamItbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGVudGVycHJpc2UKLQkgIGJlYW4uIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphciBmaWxlLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudGVycHJpc2UtYmVhbnMvKiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleT4KLQotICAgIDx4c2Q6a2V5cmVmIG5hbWU9ImVqYi1uYW1lLXJlZmVyZW5jZXMiCi0JCXJlZmVyPSJqMmVlOmVqYi1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0JICByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgbXVzdCBiZSB0byBhIHNwZWNpZmljIGVqYi1uYW1lCi0JICBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgZW50ZXJwcmlzZS1iZWFucyBlbGVtZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yCi0JICAgeHBhdGg9Ii4vL2oyZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlL2oyZWU6cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIi8+Ci0gICAgICA8eHNkOmZpZWxkCi0JICAgeHBhdGg9ImoyZWU6ZWpiLW5hbWUiLz4KLSAgICA8L3hzZDprZXlyZWY+Ci0KLSAgICA8eHNkOmtleSBuYW1lPSJyb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIEEgcm9sZS1uYW1lLWtleSBpcyBzcGVjaWZpZWQgdG8gYWxsb3cgdGhlIHJlZmVyZW5jZXMKLQkgIGZyb20gdGhlIHNlY3VyaXR5LXJvbGUtcmVmcy4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTphc3NlbWJseS1kZXNjcmlwdG9yL2oyZWU6c2VjdXJpdHktcm9sZSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJyb2xlLW5hbWUtcmVmZXJlbmNlcyIKLQkJcmVmZXI9ImoyZWU6cm9sZS1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0JICBzZWN1cml0eS1yb2xlLXJlZiB0byBhIHNwZWNpZmllZCByb2xlLW5hbWUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZW50ZXJwcmlzZS1iZWFucy8qL2oyZWU6c2VjdXJpdHktcm9sZS1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotICA8L3hzZDplbGVtZW50PgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIG5hbWUvdmFsdWUKLQljb25maWd1cmF0aW9uIHByb3BlcnR5IHBhaXIgZm9yIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQotCVRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlY29nbml6ZWQgZm9yIGEgcGFydGljdWxhcgotCW1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS1uYW1lIGVsZW1lbnQgY29udGFpbnMKLQkgICAgdGhlIG5hbWUgZm9yIGFuIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBvZgotCSAgICBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCi0KLQkgICAgRm9yIEpNUyBtZXNzYWdlLWRyaXZlbiBiZWFucywgdGhlIGZvbGxvd2luZyBwcm9wZXJ0eQotCSAgICBuYW1lcyBhcmUgcmVjb2duaXplZDogYWNrbm93bGVkZ2VNb2RlLAotCSAgICBtZXNzYWdlU2VsZWN0b3IsIGRlc3RpbmF0aW9uVHlwZSwgc3Vic2NyaXB0aW9uRHVyYWJpbGl0eQotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUgZWxlbWVudAotCSAgICBjb250YWlucyB0aGUgdmFsdWUgZm9yIGFuIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbgotCSAgICBwcm9wZXJ0eSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYWN0aXZhdGlvbi1jb25maWdUeXBlIGRlZmluZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JZXhwZWN0ZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCi0JaW4gaXRzIG9wZXJhdGlvbmFsIGVudmlyb25tZW50LiBUaGlzIG1heSBpbmNsdWRlIGluZm9ybWF0aW9uCi0JYWJvdXQgbWVzc2FnZSBhY2tub3dsZWRnZW1lbnQsIG1lc3NhZ2Ugc2VsZWN0b3IsIGV4cGVjdGVkCi0JZGVzdGluYXRpb24gdHlwZSwgZXRjLgotCi0JVGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgZXhwcmVzc2VkIGluIHRlcm1zIG9mCi0JbmFtZS92YWx1ZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCi0KLQlUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLQltZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eSIKLQkJICAgdHlwZT0iajJlZTphY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzZW1ibHktZGVzY3JpcHRvclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhc3NlbWJseS1kZXNjcmlwdG9yVHlwZSBkZWZpbmVzCi0JYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24uCi0KLQlUaGUgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24gY29uc2lzdHMgb2YgdGhlCi0JZm9sbG93aW5nIHBhcnRzOiB0aGUgZGVmaW5pdGlvbiBvZiBzZWN1cml0eSByb2xlcywgdGhlCi0JZGVmaW5pdGlvbiBvZiBtZXRob2QgcGVybWlzc2lvbnMsIHRoZSBkZWZpbml0aW9uIG9mCi0JdHJhbnNhY3Rpb24gYXR0cmlidXRlcyBmb3IgZW50ZXJwcmlzZSBiZWFucyB3aXRoCi0JY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gYW5kIGEgbGlzdCBvZgotCW1ldGhvZHMgdG8gYmUgZXhjbHVkZWQgZnJvbSBiZWluZyBpbnZva2VkLgotCi0JQWxsIHRoZSBwYXJ0cyBhcmUgb3B0aW9uYWwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUKLQlvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotCVByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50Ci0JZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlIgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBlcm1pc3Npb24iCi0JCSAgIHR5cGU9ImoyZWU6bWV0aG9kLXBlcm1pc3Npb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXRyYW5zYWN0aW9uIgotCQkgICB0eXBlPSJqMmVlOmNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1saXN0IgotCQkgICB0eXBlPSJqMmVlOmV4Y2x1ZGUtbGlzdFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtcC1maWVsZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjbXAtZmllbGRUeXBlIGRlc2NyaWJlcyBhIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkLiBUaGUKLQljbXAtZmllbGRUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZCwKLQlhbmQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmphdmEtaWRlbnRpZmllclR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZmllbGQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgIGNvbnRhaW5lciBtYW5hZ2VkIGZpZWxkLgotCi0JICAgIFRoZSBuYW1lIG9mIHRoZSBjbXAtZmllbGQgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotCSAgICBjbXAtdmVyc2lvbiAyLnggbXVzdCBiZWdpbiB3aXRoIGEgbG93ZXJjYXNlCi0JICAgIGxldHRlci4gVGhpcyBmaWVsZCBpcyBhY2Nlc3NlZCBieSBtZXRob2RzIHdob3NlCi0JICAgIG5hbWVzIGNvbnNpc3RzIG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkKLQkgICAgZmllbGQtbmFtZSBpbiB3aGljaCB0aGUgZmlyc3QgbGV0dGVyIGlzIHVwcGVyY2FzZWQsCi0JICAgIHByZWZpeGVkIGJ5ICJnZXQiIG9yICJzZXQiLgotCi0JICAgIFRoZSBuYW1lIG9mIHRoZSBjbXAtZmllbGQgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotCSAgICBjbXAtdmVyc2lvbiAxLnggbXVzdCBkZW5vdGUgYSBwdWJsaWMgZmllbGQgb2YgdGhlCi0JICAgIGVudGVycHJpc2UgYmVhbiBjbGFzcyBvciBvbmUgb2YgaXRzIHN1cGVyY2xhc3Nlcy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXAtdmVyc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjbXAtdmVyc2lvblR5cGUgc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIGFuIGVudGl0eSBiZWFuCi0Jd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gSXQgaXMgdXNlZCBieQotCWNtcC12ZXJzaW9uIGVsZW1lbnRzLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIDEueAotCSAgICAyLngKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEueCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIueCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtci1maWVsZC10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNtci1maWVsZC10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjbGFzcyBvZiBhCi0JY29sbGVjdGlvbi12YWx1ZWQgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eQotCWJlYW4gY2xhc3MuIFRoZSB2YWx1ZSBvZiBhbiBlbGVtZW50IHVzaW5nIGNtci1maWVsZC10eXBlVHlwZQotCW11c3QgYmUgZWl0aGVyOiBqYXZhLnV0aWwuQ29sbGVjdGlvbiBvciBqYXZhLnV0aWwuU2V0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS51dGlsLkNvbGxlY3Rpb24iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLnV0aWwuU2V0Ii8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21yLWZpZWxkVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNtci1maWVsZFR5cGUgZGVzY3JpYmVzIHRoZSBiZWFuIHByb3ZpZGVyJ3MgdmlldyBvZgotCWEgcmVsYXRpb25zaGlwLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kCi0JdGhlIG5hbWUgYW5kIHRoZSBjbGFzcyB0eXBlIG9mIGEgZmllbGQgaW4gdGhlIHNvdXJjZSBvZiBhCi0Jcm9sZSBvZiBhIHJlbGF0aW9uc2hpcC4gVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQKLQljb3JyZXNwb25kcyB0byB0aGUgbmFtZSB1c2VkIGZvciB0aGUgZ2V0IGFuZCBzZXQgYWNjZXNzb3IKLQltZXRob2RzIGZvciB0aGUgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBpcwotCXVzZWQgb25seSBmb3IgY29sbGVjdGlvbi12YWx1ZWQgY21yLWZpZWxkcy4gSXQgc3BlY2lmaWVzIHRoZQotCXR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBpcyB1c2VkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtci1maWVsZC1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBjbXItZmllbGQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgIGxvZ2ljYWwgcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkgYmVhbgotCSAgICBjbGFzcy4gVGhlIG5hbWUgb2YgdGhlIGNtci1maWVsZCBtdXN0IGJlZ2luIHdpdGggYQotCSAgICBsb3dlcmNhc2UgbGV0dGVyLiBUaGlzIGZpZWxkIGlzIGFjY2Vzc2VkIGJ5IG1ldGhvZHMKLQkgICAgd2hvc2UgbmFtZXMgY29uc2lzdCBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQKLQkgICAgc3BlY2lmaWVkIGJ5IGNtci1maWVsZC1uYW1lIGluIHdoaWNoIHRoZSBmaXJzdAotCSAgICBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwgcHJlZml4ZWQgYnkgImdldCIgb3IgInNldCIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6Y21yLWZpZWxkLXR5cGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY29udGFpbmVyLXRyYW5zYWN0aW9uVHlwZSBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIKLQltdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncwotCW1ldGhvZCBpbnZvY2F0aW9ucy4gSXQgZGVmaW5lcyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYQotCWxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLCBhbmQgYSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUuIFRoZQotCXRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkCi0JbWV0aG9kcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0JCSAgIHR5cGU9ImoyZWU6bWV0aG9kVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFucy1hdHRyaWJ1dGUiCi0JCSAgIHR5cGU9ImoyZWU6dHJhbnMtYXR0cmlidXRlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1jbGFzc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIGVqYi1jbGFzc1R5cGUgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQotCSAgZW50ZXJwcmlzZSBiZWFuJ3MgY2xhc3MuIEl0IGlzIHVzZWQgYnkgZWpiLWNsYXNzIGVsZW1lbnRzLgotCi0JICBFeGFtcGxlOgotCi0JICAgICAgPGVqYi1jbGFzcz5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlQmVhbjwvZWpiLWNsYXNzPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItamFyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVqYi1qYXJUeXBlIGRlZmluZXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCCi0JZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJdCBjb250YWlucwotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGVqYi1qYXIgZmlsZQotCSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGljb24gdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0JICAgICAgaWNvbiBmaWxlIG5hbWUKLQkgICAgLSBtYW5kYXRvcnkgc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5jbHVkZWQKLQkgICAgICBlbnRlcnByaXNlIGJlYW5zCi0JICAgIC0gYSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLAotCSAgICAgIGlmIGFueQotCSAgICAtIGFuIG9wdGlvbmFsIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGRlc2NyaXB0b3IKLQkgICAgLSBhbiBvcHRpb25hbCBuYW1lIG9mIGFuIGVqYi1jbGllbnQtamFyIGZpbGUgZm9yIHRoZQotCSAgICAgIGVqYi1qYXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50ZXJwcmlzZS1iZWFucyIKLQkJICAgdHlwZT0iajJlZTplbnRlcnByaXNlLWJlYW5zVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcHMiCi0JCSAgIHR5cGU9ImoyZWU6cmVsYXRpb25zaGlwc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0icmVsYXRpb25zaGlwLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVsYXRpb24tbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgcmVsYXRpb24uIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgICAgIHJlbGF0aW9uc2hpcHMuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWxhdGlvbiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVsYXRpb24tbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzZW1ibHktZGVzY3JpcHRvciIKLQkJICAgdHlwZT0iajJlZTphc3NlbWJseS1kZXNjcmlwdG9yVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLQkgICAgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZQotCSAgICBwcm9kdWNlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItY2xpZW50LWphciIKLQkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIG9wdGlvbmFsIGVqYi1jbGllbnQtamFyIGVsZW1lbnQgc3BlY2lmaWVzIGEgSkFSCi0JICAgICAgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBjbGFzcyBmaWxlcyBuZWNlc3NhcnkgZm9yIGEKLQkgICAgICBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlCi0JICAgICAgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgZWpiLWphciBmaWxlLgotCi0JICAgICAgRXhhbXBsZToKLQotCQkgIDxlamItY2xpZW50LWphcj5lbXBsb3llZV9zZXJ2aWNlX2NsaWVudC5qYXIKLQkJICA8L2VqYi1jbGllbnQtamFyPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIyLjEiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHZlcnNpb24gc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZQotCSAgRUpCIHNwZWNpZmljYXRpb24gdGhhdCB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgbXVzdAotCSAgY29tcGx5IHdpdGguIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3ltZW50IHRvb2xzCi0JICB0byB2YWxpZGF0ZSBhIHBhcnRpY3VsYXIgRUpCIERlcGxveW1lbnQKLQkgIERlc2NyaXB0b3Igd2l0aCByZXNwZWN0IHRvIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgRUpCCi0JICBzY2hlbWEuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItbmFtZVR5cGUgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzIG5hbWUuIEl0IGlzCi0JICB1c2VkIGJ5IGVqYi1uYW1lIGVsZW1lbnRzLiBUaGlzIG5hbWUgaXMgYXNzaWduZWQgYnkgdGhlCi0JICBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gbmFtZSB0aGUgZW50ZXJwcmlzZSBiZWFuIGluIHRoZQotCSAgZWpiLWphciBmaWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlCi0JICB1bmlxdWUgYW1vbmcgdGhlIG5hbWVzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIHRoZSBzYW1lCi0JICBlamItamFyIGZpbGUuCi0KLQkgIFRoZXJlIGlzIG5vIGFyY2hpdGVjdGVkIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB1c2VkCi0JICBlamItbmFtZSBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCB0aGUgSk5ESSBuYW1lIHRoYXQKLQkgIHRoZSBEZXBsb3llciB3aWxsIGFzc2lnbiB0byB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4KLQotCSAgVGhlIG5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbAotCSAgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6eHNkTk1UT0tFTlR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlbGF0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVqYi1yZWxhdGlvblR5cGUgZGVzY3JpYmVzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvCi0JZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuICBJdCBpcyB1c2VkCi0JYnkgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLiBJdCBjb250YWlucyBhIGRlc2NyaXB0aW9uOyBhbgotCW9wdGlvbmFsIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQ7IGFuZCBleGFjdGx5IHR3bwotCXJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUKLQllamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudHMuIFRoZSBuYW1lIG9mIHRoZQotCXJlbGF0aW9uc2hpcCwgaWYgc3BlY2lmaWVkLCBpcyB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyCi0JZmlsZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb24tbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50IHByb3ZpZGVzIGEgdW5pcXVlIG5hbWUKLQkgICAgd2l0aGluIHRoZSBlamItamFyIGZpbGUgZm9yIGEgcmVsYXRpb25zaGlwLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZSIKLQkJICAgdHlwZT0iajJlZTplamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlIgotCQkgICB0eXBlPSJqMmVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGRlc2NyaWJlcyBhIHJvbGUgd2l0aGluIGEKLQkgIHJlbGF0aW9uc2hpcC4gVGhlcmUgYXJlIHR3byByb2xlcyBpbiBlYWNoIHJlbGF0aW9uc2hpcC4KLQotCSAgVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUgY29udGFpbnMgYW4gb3B0aW9uYWwKLQkgIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcmVsYXRpb25zaGlwIHJvbGU7IGEKLQkgIHNwZWNpZmljYXRpb24gb2YgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgcm9sZTsgYW4gb3B0aW9uYWwKLQkgIHNwZWNpZmljYXRpb24gb2YgY2FzY2FkZS1kZWxldGUgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIHJvbGU7Ci0JICB0aGUgcm9sZSBzb3VyY2U7IGFuZCBhIGRlY2xhcmF0aW9uIG9mIHRoZSBjbXItZmllbGQsIGlmIGFueSwKLQkgIGJ5IG1lYW5zIG9mIHdoaWNoIHRoZSBvdGhlciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgaXMKLQkgIGFjY2Vzc2VkIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSByb2xlIHNvdXJjZS4KLQotCSAgVGhlIG11bHRpcGxpY2l0eSBhbmQgcm9sZS1zb3VyY2UgZWxlbWVudCBhcmUgbWFuZGF0b3J5LgotCi0JICBUaGUgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgZGVzaWduYXRlcyBhbiBlbnRpdHkKLQkgIGJlYW4gYnkgbWVhbnMgb2YgYW4gZWpiLW5hbWUgZWxlbWVudC4gRm9yIGJpZGlyZWN0aW9uYWwKLQkgIHJlbGF0aW9uc2hpcHMsIGJvdGggcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgbXVzdCBkZWNsYXJlIGEKLQkgIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHRoYXQgc3BlY2lmaWVzIGEgY21yLWZpZWxkCi0JICBpbiB0ZXJtcyBvZiB3aGljaCB0aGUgcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkLiBUaGUgbGFjayBvZgotCSAgYSBjbXItZmllbGQgZWxlbWVudCBpbiBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUgc3BlY2lmaWVzCi0JICB0aGF0IHRoZSByZWxhdGlvbnNoaXAgaXMgdW5pZGlyZWN0aW9uYWwgaW4gbmF2aWdhYmlsaXR5IGFuZAotCSAgdGhlIGVudGl0eSBiZWFuIHRoYXQgcGFydGljaXBhdGVzIGluIHRoZSByZWxhdGlvbnNoaXAgaXMKLQkgICJub3QgYXdhcmUiIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxlamItcmVsYXRpb24+Ci0JICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPlByb2R1Y3QtTGluZUl0ZW08L2VqYi1yZWxhdGlvbi1uYW1lPgotCSAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0JCSAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnByb2R1Y3QtaGFzLWxpbmVpdGVtcwotCQkgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0JCSAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLQkJICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotCQkgIDxlamItbmFtZT5Qcm9kdWN0RUpCPC9lamItbmFtZT4KLQkJICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLQkgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0JICA8L2VqYi1yZWxhdGlvbj4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIGVsZW1lbnQgZGVmaW5lcyBhCi0JICAgIG5hbWUgZm9yIGEgcm9sZSB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgZWpiLXJlbGF0aW9uLiBEaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBjYW4gdXNlIHRoZQotCSAgICBzYW1lIG5hbWUgZm9yIGEgcm9sZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtdWx0aXBsaWNpdHkiCi0JCSAgIHR5cGU9ImoyZWU6bXVsdGlwbGljaXR5VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtZGVsZXRlIgotCQkgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQsIHdpdGhpbiBhCi0JICAgIHBhcnRpY3VsYXIgcmVsYXRpb25zaGlwLCB0aGUgbGlmZXRpbWUgb2Ygb25lIG9yIG1vcmUKLQkgICAgZW50aXR5IGJlYW5zIGlzIGRlcGVuZGVudCB1cG9uIHRoZSBsaWZldGltZSBvZgotCSAgICBhbm90aGVyIGVudGl0eSBiZWFuLiBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBjYW4KLQkgICAgb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotCSAgICBlbGVtZW50IGNvbnRhaW5lZCBpbiBhbiBlamItcmVsYXRpb24gZWxlbWVudCBpbgotCSAgICB3aGljaCB0aGUgb3RoZXIgZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0JICAgIGVsZW1lbnQgc3BlY2lmaWVzIGEgbXVsdGlwbGljaXR5IG9mIE9uZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UiCi0JCSAgIHR5cGU9ImoyZWU6cmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtci1maWVsZCIKLQkJICAgdHlwZT0iajJlZTpjbXItZmllbGRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRlcnByaXNlLWJlYW5zVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVudGVycHJpc2UtYmVhbnNUeXBlIGRlY2xhcmVzIG9uZSBvciBtb3JlIGVudGVycHJpc2UKLQliZWFucy4gRWFjaCBiZWFuIGNhbiBiZSBhIHNlc3Npb24sIGVudGl0eSBvciBtZXNzYWdlLWRyaXZlbgotCWJlYW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uIgotCQkgICB0eXBlPSJqMmVlOnNlc3Npb24tYmVhblR5cGUiPgotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YKLQkgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotCSAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLWxvY2FsLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgICAgICB3aXRoaW4gdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLXJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0JICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgICBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQotCSAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlcy1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZQotCSAgICAgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZW52LWVudHJ5Ii8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVudi1lbnRyeS1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eSIKLQkJICAgdHlwZT0iajJlZTplbnRpdHktYmVhblR5cGUiPgotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZgotCSAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0JICAgICAgdGhlIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgICAgICB0aGUgY29tcG9uZW50LgotCi0JICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGJlIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LXJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0JICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgICBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLQkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXMtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZQotCSAgICAgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZW52LWVudHJ5Ii8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVudi1lbnRyeS1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZHJpdmVuIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZHJpdmVuLWJlYW5UeXBlIj4KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZgotCSAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0JICAgICAgdGhlIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgICAgICB0aGUgY29tcG9uZW50LgotCi0JICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGJlIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgICAgICB3aXRoaW4gdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQotCSAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlcy1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLQkgICAgICBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWJlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZW50aXR5LWJlYW5UeXBlIGRlY2xhcmVzIGFuIGVudGl0eSBiZWFuLiBUaGUgZGVjbGFyYXRpb24KLQljb25zaXN0cyBvZjoKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0JICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotCSAgICAgIGljb24gZmlsZSBuYW1lCi0JICAgIC0gYSB1bmlxdWUgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JICAgICAgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCSAgICAtIHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaG9tZQotCSAgICAgIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55Ci0JICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsCi0JICAgICAgaW50ZXJmYWNlcywgaWYgYW55Ci0JICAgIC0gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLQkgICAgLSB0aGUgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGUKLQkgICAgLSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcyBuYW1lCi0JICAgIC0gYW4gaW5kaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyByZWVudHJhbmN5Ci0JICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUKLQkgICAgICBlbnRpdHkgYmVhbidzIGNtcC12ZXJzaW9uCi0JICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncwotCSAgICAgIGFic3RyYWN0IHNjaGVtYSBuYW1lCi0JICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiBjb250YWluZXItbWFuYWdlZCBmaWVsZHMKLQkgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBwcmltYXJ5IGtleQotCSAgICAgIGZpZWxkCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudAotCSAgICAgIGVudHJpZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQgotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsCi0JICAgICAgRUpCIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYgotCSAgICAgIHNlcnZpY2UgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlCi0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eQotCSAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotCSAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBzZXQgb2YgcXVlcnkgZGVjbGFyYXRpb25zCi0JICAgICAgZm9yIGZpbmRlciBhbmQgc2VsZWN0IG1ldGhvZHMgZm9yIGFuIGVudGl0eQotCSAgICAgIGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguCi0KLQlUaGUgb3B0aW9uYWwgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZAotCWZvciBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlIGFuZAotCWNtcC12ZXJzaW9uIDIueC4KLQotCVRoZSBvcHRpb25hbCBwcmlta2V5LWZpZWxkIG1heSBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yCi0JaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLgotCi0JVGhlIG9wdGlvbmFsIGNtcC12ZXJzaW9uIGVsZW1lbnQgbWF5IGJlIHByZXNlbnQgaW4gdGhlCi0JZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuIElmCi0JdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24KLQllbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIGl0cyB2YWx1ZSBkZWZhdWx0cyB0byAyLnguCi0KLQlUaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmCi0JdGhlIGVudGl0eSBiZWFuIGNtcC12ZXJzaW9uIGlzIDEueC4KLQotCVRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYKLQl0aGUgZW50aXR5IGJlYW4gaGFzIGEgcmVtb3RlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2UuCi0KLQlUaGUgb3B0aW9uYWwgbG9jYWwtaG9tZSBhbmQgbG9jYWwgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQKLQlpZiB0aGUgZW50aXR5IGJlYW4gaGFzIGEgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLgotCi0JRWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoCi0JdGhlIGhvbWUgYW5kIHRoZSByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQuCi0KLQlUaGUgb3B0aW9uYWwgcXVlcnkgZWxlbWVudHMgbXVzdCBiZSBwcmVzZW50IGlmIHRoZQotCXBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMi54IGFuZAotCXF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkCi0JZm9yIHRoZSBlbnRpdHkgYmVhbi4KLQotCVRoZSBvdGhlciBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUKLQlzZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0KLQlhcmUgZW1wdHkuCi0KLQlBdCBsZWFzdCBvbmUgY21wLWZpZWxkIGVsZW1lbnQgbXVzdCBiZSBwcmVzZW50IGluIHRoZQotCWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZAotCXRoZSBjbXAtdmVyc2lvbiBpcyAxLngsIGFuZCBub25lIG11c3Qgbm90IGJlIHByZXNlbnQgaWYgdGhlCi0JZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBCZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmVqYi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0JCSAgIHR5cGU9ImoyZWU6aG9tZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLQkJICAgdHlwZT0iajJlZTpyZW1vdGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbC1ob21lIgotCQkgICB0eXBlPSJqMmVlOmxvY2FsLWhvbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKLQkJICAgdHlwZT0iajJlZTpsb2NhbFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTplamItY2xhc3NUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdHlwZSIKLQkJICAgdHlwZT0iajJlZTpwZXJzaXN0ZW5jZS10eXBlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW0ta2V5LWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcHJpbS1rZXktY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUKLQkgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KLQkgICAgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcy4KLQotCSAgICBJZiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgaXMKLQkgICAgZGVmZXJyZWQgdG8gZGVwbG95bWVudCB0aW1lLCB0aGUgcHJpbS1rZXktY2xhc3MKLQkgICAgZWxlbWVudCBzaG91bGQgc3BlY2lmeSBqYXZhLmxhbmcuT2JqZWN0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZW50cmFudCIKLQkJICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhbiBlbnRpdHkKLQkgICAgYmVhbiBpcyByZWVudHJhbnQgb3Igbm90LgotCi0JICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvCi0JICAgIGZvbGxvd2luZzogdHJ1ZSBvciBmYWxzZQotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtcC12ZXJzaW9uIgotCQkgICB0eXBlPSJqMmVlOmNtcC12ZXJzaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWJzdHJhY3Qtc2NoZW1hLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6amF2YS1pZGVudGlmaWVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgIG9mIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoCi0JICAgIGNtcC12ZXJzaW9uIDIueC4gSXQgaXMgdXNlZCBpbiBFSkIgUUwgcXVlcmllcy4KLQotCSAgICBGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGZvciBhbiBlbnRpdHkKLQkgICAgYmVhbiB3aG9zZSBsb2NhbCBpbnRlcmZhY2UgaXMKLQkgICAgY29tLmFjbWUuY29tbWVyY2UuT3JkZXIgbWlnaHQgYmUgT3JkZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21wLWZpZWxkIgotCQkgICB0eXBlPSJqMmVlOmNtcC1maWVsZFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmlta2V5LWZpZWxkIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCi0JICAgIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkIGZvciBhbiBlbnRpdHkgd2l0aAotCSAgICBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQotCSAgICBUaGUgcHJpbWtleS1maWVsZCBtdXN0IGJlIG9uZSBvZiB0aGUgZmllbGRzIGRlY2xhcmVkCi0JICAgIGluIHRoZSBjbXAtZmllbGQgZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZAotCSAgICBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleSB0eXBlLgotCi0JICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgbm90IHVzZWQgaWYgdGhlIHByaW1hcnkKLQkgICAga2V5IG1hcHMgdG8gbXVsdGlwbGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JICAgIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbiB0aGlzIGNhc2UsIHRoZQotCSAgICBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQKLQkgICAgdGhlaXIgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZCBuYW1lcyBvZgotCSAgICB0aGUgZW50aXR5IGJlYW4gY2xhc3MgdGhhdCBjb21wcmlzZSB0aGUga2V5LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6c2VjdXJpdHktcm9sZS1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHkiCi0JCSAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIKLQkJICAgdHlwZT0iajJlZTpxdWVyeVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleGNsdWRlLWxpc3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZXhjbHVkZS1saXN0VHlwZSBzcGVjaWZpZXMgb25lIG9yIG1vcmUgbWV0aG9kcyB3aGljaAotCXRoZSBBc3NlbWJsZXIgbWFya3MgdG8gYmUgdW5jYWxsYWJsZS4KLQotCUlmIHRoZSBtZXRob2QgcGVybWlzc2lvbiByZWxhdGlvbiBjb250YWlucyBtZXRob2RzIHRoYXQgYXJlCi0JaW4gdGhlIGV4Y2x1ZGUgbGlzdCwgdGhlIERlcGxveWVyIHNob3VsZCBjb25zaWRlciB0aG9zZQotCW1ldGhvZHMgdG8gYmUgdW5jYWxsYWJsZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0JCSAgIHR5cGU9ImoyZWU6bWV0aG9kVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRyaXZlbi1iZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1lc3NhZ2UtZHJpdmVuIGVsZW1lbnQgZGVjbGFyZXMgYSBtZXNzYWdlLWRyaXZlbgotCWJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0JICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotCSAgICAgIGljb24gZmlsZSBuYW1lLgotCSAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluCi0JICAgICAgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCSAgICAtIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2luZwotCSAgICAgIHR5cGUKLQkgICAgLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZQotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncwotCSAgICAgIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudAotCSAgICAgIGVudHJpZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIgc2VydmljZQotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkKLQkgICAgICBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICBtZXRob2RzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5Ci0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UKLQkgICAgICBlbnZpcm9ubWVudCByZWZlcmVuY2VzLgotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotCSAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2luZy10eXBlIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBtZXNzYWdpbmctdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWVzc2FnZQotCSAgICBsaXN0ZW5lciBpbnRlcmZhY2Ugb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4uIElmCi0JICAgIHRoZSBtZXNzYWdpbmctdHlwZSBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzCi0JICAgIGFzc3VtZWQgdG8gYmUgamF2YXguam1zLk1lc3NhZ2VMaXN0ZW5lci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlIgotCQkgICB0eXBlPSJqMmVlOnRyYW5zYWN0aW9uLXR5cGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGluayIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZyIKLQkJICAgdHlwZT0iajJlZTphY3RpdmF0aW9uLWNvbmZpZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHkiCi0JCSAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtaW50ZlR5cGUiPgotCi0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIGEgbWV0aG9kIGVsZW1lbnQgdG8KLQlkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAotCXNpZ25hdHVyZSB0aGF0IGFyZSBtdWx0aXBseSBkZWZpbmVkIGFjcm9zcyB0aGUgaG9tZSBhbmQKLQljb21wb25lbnQgaW50ZXJmYWNlcyAoZS5nLCBpbiBib3RoIGFuIGVudGVycHJpc2UgYmVhbidzCi0JcmVtb3RlIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9yIGluIGJvdGggYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLQlob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgZXRjLik7IHRoZSBjb21wb25lbnQgYW5kIHdlYgotCXNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcywgYW5kIHNvIG9uLgotCi0JVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCSAgICBIb21lCi0JICAgIFJlbW90ZQotCSAgICBMb2NhbEhvbWUKLQkgICAgTG9jYWwKLQkgICAgU2VydmljZUVuZHBvaW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxIb21lIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWwiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRW5kcG9pbnQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXRob2QtbmFtZVR5cGUgY29udGFpbnMgYSBuYW1lIG9mIGFuIGVudGVycHJpc2UKLQliZWFuIG1ldGhvZCBvciB0aGUgYXN0ZXJpc2sgKCopIGNoYXJhY3Rlci4gVGhlIGFzdGVyaXNrIGlzCi0JdXNlZCB3aGVuIHRoZSBlbGVtZW50IGRlbm90ZXMgYWxsIHRoZSBtZXRob2RzIG9mIGFuCi0JZW50ZXJwcmlzZSBiZWFuJ3MgY2xpZW50IHZpZXcgaW50ZXJmYWNlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLXBhcmFtc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXRob2QtcGFyYW1zVHlwZSBkZWZpbmVzIGEgbGlzdCBvZiB0aGUKLQlmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG5hbWVzIG9mIHRoZSBtZXRob2QgcGFyYW1ldGVycy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW0iCi0JCSAgIHR5cGU9ImoyZWU6amF2YS10eXBlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBtZXRob2QtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIHByaW1pdGl2ZQotCSAgICBvciBhIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZiBhIG1ldGhvZAotCSAgICBwYXJhbWV0ZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLXBlcm1pc3Npb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlCi0Jc2VjdXJpdHkgcm9sZXMgYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UKLQliZWFuIG1ldGhvZHMuIFRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUgY29uc2lzdHMgb2YgYW4KLQlvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMgb3IgYW4KLQlpbmRpY2F0b3IgdG8gc3RhdGUgdGhhdCB0aGUgbWV0aG9kIGlzIHVuY2hlY2tlZCBmb3IKLQlhdXRob3JpemF0aW9uLCBhbmQgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cy4KLQotCVRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUKLQltdXN0IGJlIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMgb2YgdGhlCi0JZGVwbG95bWVudCBkZXNjcmlwdG9yLCBhbmQgdGhlIG1ldGhvZHMgbXVzdCBiZSBtZXRob2RzCi0JZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSwgY29tcG9uZW50IGFuZC9vciB3ZWIKLQlzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIKLQkJICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmNoZWNrZWQiCi0JCSAgICAgdHlwZT0iajJlZTplbXB0eVR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgdW5jaGVja2VkIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgYSBtZXRob2QgaXMKLQkgICAgICBub3QgY2hlY2tlZCBmb3IgYXV0aG9yaXphdGlvbiBieSB0aGUgY29udGFpbmVyCi0JICAgICAgcHJpb3IgdG8gaW52b2NhdGlvbiBvZiB0aGUgbWV0aG9kLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZFR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgbWV0aG9kVHlwZSBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlCi0JICBiZWFuJ3MgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQKLQkgIGludGVyZmFjZSwgb3IsIGluIHRoZSBjYXNlIG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiwgdGhlCi0JICBiZWFuJ3MgbWVzc2FnZSBsaXN0ZW5lciBtZXRob2QsIG9yIGEgc2V0IG9mIHN1Y2gKLQkgIG1ldGhvZHMuIFRoZSBlamItbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZQotCSAgZW50ZXJwcmlzZSBiZWFucyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUKLQkgIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYQotCSAgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIHRoYXQgaXMgbXVsdGlwbHkgZGVmaW5lZAotCSAgYWNyb3NzIHRoZSBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludAotCSAgaW50ZXJmYWNlczsgdGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXRob2QKLQkgIG5hbWU7IGFuZCB0aGUgb3B0aW9uYWwgbWV0aG9kLXBhcmFtcyBlbGVtZW50cyBpZGVudGlmeSBhCi0JICBzaW5nbGUgbWV0aG9kIGFtb25nIG11bHRpcGxlIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkCi0JICBtZXRob2QgbmFtZS4KLQotCSAgVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBvZiB1c2luZyBtZXRob2RUeXBlIGVsZW1lbnQKLQkgIHdpdGhpbiBhIG1ldGhvZCBlbGVtZW50OgotCi0JICAxLgotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotCSAgPC9tZXRob2Q+Ci0KLQkgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlCi0JICAgICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViCi0JICAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMuCi0KLQkgIDIuCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLQkgIDwvbWV0aG9kPgotCi0JICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIHNwZWNpZmllZCBtZXRob2Qgb2YKLQkgICAgIHRoZSBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKLQkgICAgIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoZSBlbGVtZW50IG9mCi0JICAgICB0aGlzIHN0eWxlIHJlZmVycyB0byBhbGwgdGhlIG1ldGhvZHMgd2l0aCB0aGUgb3ZlcmxvYWRlZAotCSAgICAgbmFtZS4KLQotCSAgMy4KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotCSAgICAgIDxtZXRob2QtcGFyYW1zPgotCQkgIDxtZXRob2QtcGFyYW0+UEFSQU0tMTwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+UEFSQU0tMjwvbWV0aG9kLXBhcmFtPgotCQkgIC4uLgotCQkgIDxtZXRob2QtcGFyYW0+UEFSQU0tbjwvbWV0aG9kLXBhcmFtPgotCSAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLQkgIDwvbWV0aG9kPgotCi0JICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSBzaW5nbGUgbWV0aG9kIHdpdGhpbiBhCi0JICAgICBzZXQgb2YgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQgbmFtZS4gUEFSQU0tMSB0aHJvdWdoCi0JICAgICBQQVJBTS1uIGFyZSB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlCi0JICAgICBtZXRob2QncyBpbnB1dCBwYXJhbWV0ZXJzIChpZiB0aGUgbWV0aG9kIGhhcyBubyBpbnB1dAotCSAgICAgYXJndW1lbnRzLCB0aGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50IGNvbnRhaW5zIG5vCi0JICAgICBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUKLQkgICAgIGFycmF5IGVsZW1lbnQncyB0eXBlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwYWlyIG9mCi0JICAgICBzcXVhcmUgYnJhY2tldHMgKGUuZy4gaW50W11bXSkuIElmIHRoZXJlIGFyZSBtdWx0aXBsZQotCSAgICAgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhpcyBzdHlsZSByZWZlcnMKLQkgICAgIHRvIGFsbCBvZiB0aGUgb3ZlcmxvYWRlZCBtZXRob2RzLgotCi0JICBFeGFtcGxlczoKLQotCSAgU3R5bGUgMTogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZQotCSAgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lLCBjb21wb25lbnQsCi0JICBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlczoKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgU3R5bGUgMjogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZQotCSAgY3JlYXRlIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZQotCSAgaW50ZXJmYWNlKHMpLgotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFN0eWxlIDM6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIHRoZQotCSAgY3JlYXRlKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBMYXN0TmFtZSkgbWV0aG9kIG9mIHRoZQotCSAgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZShzKS4KLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgU3R5bGUgMyBlbGVtZW50IHdpdGgKLQkgIG1vcmUgY29tcGxleCBwYXJhbWV0ZXIgdHlwZXMuIFRoZSBtZXRob2QKLQkgIGZvb2JhcihjaGFyIHMsIGludCBpLCBpbnRbXSBpYXIsIG15cGFja2FnZS5NeUNsYXNzIG15Y2wsCi0JICBteXBhY2thZ2UuTXlDbGFzc1tdW10gbXljbGFhcikgd291bGQgYmUgc3BlY2lmaWVkIGFzOgotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT5mb29iYXI8L21ldGhvZC1uYW1lPgotCSAgICAgIDxtZXRob2QtcGFyYW1zPgotCQkgIDxtZXRob2QtcGFyYW0+Y2hhcjwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+aW50PC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5pbnRbXTwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3M8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzW11bXTwvbWV0aG9kLXBhcmFtPgotCSAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLQkgIDwvbWV0aG9kPgotCi0JICBUaGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aGVuIGl0IGJlY29tZXMKLQkgIG5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBtZXRob2QgdGhhdCBpcyBtdWx0aXBseQotCSAgZGVmaW5lZCBhY3Jvc3MgdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yCi0JICB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKLQkgIHNpZ25hdHVyZS4KLQotCSAgRm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudAotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotCSAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCSAgICAgIDxtZXRob2QtcGFyYW1zPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCSAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLQkgIDwvbWV0aG9kPgotCi0JICBjYW4gYmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpCi0JICBtZXRob2QgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSBmcm9tIHRoZQotCSAgY3JlYXRlKFN0cmluZywgU3RyaW5nKSBtZXRob2QgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGhvbWUKLQkgIGludGVyZmFjZSwgd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcwotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLQkgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgYW5kIHRoZSBjcmVhdGUgbWV0aG9kIHRoYXQgaXMgZGVmaW5lZCBpbiB0aGUgbG9jYWwgaG9tZQotCSAgaW50ZXJmYWNlIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLQkgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2l0aCBhbGwgdGggcmVlIFN0eWxlcwotCSAgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHVzYWdlLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwotCSAgbWV0aG9kIGVsZW1lbnQgZXhhbXBsZSBjb3VsZCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUKLQkgIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgcmVtb3RlIGhvbWUgaW50ZXJmYWNlLgotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLQkgICAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmVqYi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1pbnRmIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZC1pbnRmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6bWV0aG9kLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLQkJICAgdHlwZT0iajJlZTptZXRob2QtcGFyYW1zVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibXVsdGlwbGljaXR5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG11bHRpcGxpY2l0eVR5cGUgZGVzY3JpYmVzIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlCi0Jcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIE9uZQotCSAgICBNYW55Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW55Ii8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBwZXJzaXN0ZW5jZS10eXBlVHlwZSBzcGVjaWZpZXMgYW4gZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZQotCW1hbmFnZW1lbnQgdHlwZS4KLQotCVRoZSBwZXJzaXN0ZW5jZS10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgQmVhbgotCSAgICBDb250YWluZXIKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW4iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1tZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBxdWVyeS1tZXRob2Qgc3BlY2lmaWVzIHRoZSBtZXRob2QgZm9yIGEgZmluZGVyIG9yIHNlbGVjdAotCSAgcXVlcnkuCi0KLQkgIFRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGZpbmRlciBvciBzZWxlY3QKLQkgIG1ldGhvZCBpbiB0aGUgZW50aXR5IGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQotCSAgRWFjaCBtZXRob2QtcGFyYW0gbXVzdCBiZSBkZWZpbmVkIGZvciBhIHF1ZXJ5LW1ldGhvZCB1c2luZyB0aGUKLQkgIG1ldGhvZC1wYXJhbXMgZWxlbWVudC4KLQotCSAgSXQgaXMgdXNlZCBieSB0aGUgcXVlcnktbWV0aG9kIGVsZW1lbnQuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxxdWVyeT4KLQkgICAgICA8ZGVzY3JpcHRpb24+TWV0aG9kIGZpbmRzIGxhcmdlIG9yZGVyczwvZGVzY3JpcHRpb24+Ci0JICAgICAgPHF1ZXJ5LW1ldGhvZD4KLQkJICA8bWV0aG9kLW5hbWU+ZmluZExhcmdlT3JkZXJzPC9tZXRob2QtbmFtZT4KLQkJICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0JICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0JICAgICAgPGVqYi1xbD4KLQkJU0VMRUNUIE9CSkVDVChvKSBGUk9NIE9yZGVyIG8KLQkJICBXSEVSRSBvLmFtb3VudCAmZ3Q7IDEwMDAKLQkgICAgICA8L2VqYi1xbD4KLQkgIDwvcXVlcnk+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtbmFtZSIKLQkJICAgdHlwZT0iajJlZTptZXRob2QtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW1zIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZC1wYXJhbXNUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcXVlcnlUeXBlIGRlZmluZXMgYSBmaW5kZXIgb3Igc2VsZWN0Ci0JcXVlcnkuIEl0IGNvbnRhaW5zCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5Ci0JICAgIC0gdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QKLQkgICAgICBtZXRob2QgaXQgaXMgdXNlZCBieQotCQktIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHJlc3VsdCB0eXBlCi0JCSAgbWFwcGluZywgaWYgdGhlIHF1ZXJ5IGlzIGZvciBhIHNlbGVjdCBtZXRob2QKLQkJICBhbmQgZW50aXR5IG9iamVjdHMgYXJlIHJldHVybmVkLgotCQktIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuCi0KLQlRdWVyaWVzIHRoYXQgYXJlIGV4cHJlc3NpYmxlIGluIEVKQiBRTCBtdXN0IHVzZSB0aGUgZWpiLXFsCi0JZWxlbWVudCB0byBzcGVjaWZ5IHRoZSBxdWVyeS4gSWYgYSBxdWVyeSBpcyBub3QgZXhwcmVzc2libGUKLQlpbiBFSkIgUUwsIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvCi0JZGVzY3JpYmUgdGhlIHNlbWFudGljcyBvZiB0aGUgcXVlcnkgYW5kIHRoZSBlamItcWwgZWxlbWVudAotCXNob3VsZCBiZSBlbXB0eS4KLQotCVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nIGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIEl0IGNhbiBvbmx5Ci0JYmUgcHJlc2VudCBpZiB0aGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyBhIHNlbGVjdCBtZXRob2QKLQl0aGF0IHJldHVybnMgZW50aXR5IG9iamVjdHMuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCi0JcmVzdWx0LXR5cGUtbWFwcGluZyBlbGVtZW50IGlzICJMb2NhbCIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1tZXRob2QiCi0JCSAgIHR5cGU9ImoyZWU6cXVlcnktbWV0aG9kVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc3VsdC10eXBlLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6cmVzdWx0LXR5cGUtbWFwcGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1xbCIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgZGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEKLQlyb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBCi0JcmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSBpcyB1c2VkIGJ5Ci0JcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnRzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuCi0JZW50aXR5IGJlYW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZWxhdGlvbnNoaXBzVHlwZSBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4KLQl3aGljaCBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZQotCXBhcnRpY2lwYXRlLiBUaGUgcmVsYXRpb25zaGlwc1R5cGUgY29udGFpbnMgYW4gb3B0aW9uYWwKLQlkZXNjcmlwdGlvbjsgYW5kIGEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoCi0Jc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLXJlbGF0aW9uVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0icm9sZS1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICAgIHJlbGF0aW9uc2hpcCByb2xlLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgICAgICBhIHJlbGF0aW9uc2hpcCwgYnV0IGNhbiBiZSByZXVzZWQgaW4gZGlmZmVyZW50Ci0JICAgICAgcmVsYXRpb25zaGlwcy4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IKLQkgICAgICAgeHBhdGg9Ii4vL2oyZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUiLz4KLQkgIDx4c2Q6ZmllbGQKLQkgICAgICAgeHBhdGg9Ii4iLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcmVzdWx0LXR5cGUtbWFwcGluZ1R5cGUgaXMgdXNlZCBpbiB0aGUgcXVlcnkgZWxlbWVudCB0bwotCXNwZWNpZnkgd2hldGhlciBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSByZXR1cm5lZCBieSBhIHF1ZXJ5Ci0JZm9yIGEgc2VsZWN0IG1ldGhvZCBpcyB0byBiZSBtYXBwZWQgdG8gYW4gRUpCTG9jYWxPYmplY3Qgb3IKLQlFSkJPYmplY3QgdHlwZS4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JICAgIExvY2FsCi0JICAgIFJlbW90ZQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWwiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdGUiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1pZGVudGl0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZWN1cml0eS1pZGVudGl0eVR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhbGxlcidzCi0Jc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLQltZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcwotCWlkZW50aXR5IGlzIHRvIGJlIHVzZWQuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2UtY2FsbGVyLWlkZW50aXR5IgotCQkgICAgIHR5cGU9ImoyZWU6ZW1wdHlUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHVzZS1jYWxsZXItaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgdGhhdAotCSAgICAgIHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBiZSB1c2VkIGFzIHRoZQotCSAgICAgIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotCSAgICAgIGVudGVycHJpc2UgYmVhbidzIG1ldGhvZHMuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0icnVuLWFzIgotCQkgICAgIHR5cGU9ImoyZWU6cnVuLWFzVHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXNzaW9uLWJlYW5UeXBlIGRlY2xhcmVzIGFuIHNlc3Npb24gYmVhbi4gVGhlCi0JZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLQkgICAgICBpY29uIGZpbGUgbmFtZQotCSAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JICAgICAgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRpb24KLQkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lIGFuZAotCSAgICAgIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnkKLQkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIGxvY2FsIGhvbWUgYW5kCi0JICAgICAgbG9jYWwgaW50ZXJmYWNlcywgaWYgYW55Ci0JICAgIC0gdGhlIG5hbWUgb2YgdGhlIHNlc3Npb24gYmVhbidzIHdlYiBzZXJ2aWNlIGVuZHBvaW50Ci0JICAgICAgaW50ZXJmYWNlLCBpZiBhbnkKLQkgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLQkgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlCi0JICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZQotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICBlbnZpcm9ubWVudCBlbnRyaWVzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwKLQkgICAgICBFSkIgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViCi0JICAgICAgc2VydmljZSByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5Ci0JICAgICAgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzIG1ldGhvZHMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlCi0JICAgICAgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UKLQkgICAgICBlbnZpcm9ubWVudCByZWZlcmVuY2VzLgotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotCSAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLQotCVRoZSBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UKLQl0aGF0IHRoZXkgYXJlIG9taXR0ZWQgd2hlbiBpZiBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZQotCWVtcHR5LgotCi0JRWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoCi0JdGhlIGhvbWUgYW5kIHRoZSByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIHRoZQotCXNlc3Npb24gYmVhbi4KLQotCVRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGlmIHRoZQotCWJlYW4gaXMgYSBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmVqYi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0JCSAgIHR5cGU9ImoyZWU6aG9tZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLQkJICAgdHlwZT0iajJlZTpyZW1vdGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbC1ob21lIgotCQkgICB0eXBlPSJqMmVlOmxvY2FsLWhvbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKLQkJICAgdHlwZT0iajJlZTpsb2NhbFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtZW5kcG9pbnQiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBjb250YWlucyB0aGUKLQkgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHdlYgotCSAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIHNlcnZpY2UtZW5kcG9pbnQKLQkgICAgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgZm9yIGEgc3RhdGVsZXNzCi0JICAgIHNlc3Npb24gYmVhbi4gVGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgbXVzdCBiZSBhCi0JICAgIHZhbGlkIEpBWC1SUEMgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmVqYi1jbGFzc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6c2Vzc2lvbi10eXBlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6dHJhbnNhY3Rpb24tdHlwZVR5cGUiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGUtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWlkZW50aXR5IgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LWlkZW50aXR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlc3Npb24tdHlwZVR5cGUgZGVzY3JpYmVzIHdoZXRoZXIgdGhlIHNlc3Npb24gYmVhbiBpcyBhCi0Jc3RhdGVmdWwgc2Vzc2lvbiBvciBzdGF0ZWxlc3Mgc2Vzc2lvbi4gSXQgaXMgdXNlZCBieQotCXNlc3Npb24tdHlwZSBlbGVtZW50cy4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBTdGF0ZWZ1bAotCSAgICBTdGF0ZWxlc3MKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlZnVsIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVsZXNzIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnMtYXR0cmlidXRlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRyYW5zLWF0dHJpYnV0ZVR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QKLQltYW5hZ2UgdGhlIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kCi0JaW52b2NhdGlvbiB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCSAgICBOb3RTdXBwb3J0ZWQKLQkgICAgU3VwcG9ydHMKLQkgICAgUmVxdWlyZWQKLQkgICAgUmVxdWlyZXNOZXcKLQkgICAgTWFuZGF0b3J5Ci0JICAgIE5ldmVyCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RTdXBwb3J0ZWQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwb3J0cyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVkIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZXNOZXciLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5kYXRvcnkiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXZlciIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zYWN0aW9uLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdHJhbnNhY3Rpb24tdHlwZVR5cGUgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzCi0JdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLgotCi0JVGhlIHRyYW5zYWN0aW9uLXR5cGUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgQmVhbgotCSAgICBDb250YWluZXIKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW4iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8zXzAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzNfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MjgyOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzNfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNzA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSIzLjAiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVqYi1qYXJfM18wLnhzZHMJMS41MSAwMi8yMy8wNgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICAgICAgVS5TLkEKLSAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBFSkIgMy4wIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQlUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQgIk1FVEEtSU5GL2VqYi1qYXIueG1sIiBpbgotCXRoZSBFSkIncyBqYXIgZmlsZS4gIEFsbCBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlCi0JdGhlIGVqYi1qYXIgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFIG5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotCi0JYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotCXVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLQkgICAgPGVqYi1qYXIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0JCSAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18wLnhzZCIKLQkgICAgICB2ZXJzaW9uPSIzLjAiPgotCSAgICAgIC4uLgotCSAgICA8L2VqYi1qYXI+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLQl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciB0aGUKLQlKYXZhIEVFIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzAueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNS54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1qYXIiIHR5cGU9ImphdmFlZTplamItamFyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgZWpiLWphciBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9ImVqYi1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZWpiLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBlbnRlcnByaXNlCi0JICBiZWFuLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVudGVycHJpc2UtYmVhbnMvKiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5PgotCi0gICAgPHhzZDprZXlyZWYgbmFtZT0iZWpiLW5hbWUtcmVmZXJlbmNlcyIKLQkJcmVmZXI9ImphdmFlZTplamItbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGtleXJlZiBpbmRpY2F0ZXMgdGhlIHJlZmVyZW5jZXMgZnJvbQotCSAgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIG11c3QgYmUgdG8gYSBzcGVjaWZpYyBlamItbmFtZQotCSAgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGVudGVycHJpc2UtYmVhbnMgZWxlbWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvcgoteHBhdGg9Ii4vL2phdmFlZTplamItcmVsYXRpb25zaGlwLXJvbGUvamF2YWVlOnJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIvPgotICAgICAgPHhzZDpmaWVsZAotCSAgIHhwYXRoPSJqYXZhZWU6ZWpiLW5hbWUiLz4KLSAgICA8L3hzZDprZXlyZWY+Ci0KLSAgICA8eHNkOmtleSBuYW1lPSJyb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIEEgcm9sZS1uYW1lLWtleSBpcyBzcGVjaWZpZWQgdG8gYWxsb3cgdGhlIHJlZmVyZW5jZXMKLQkgIGZyb20gdGhlIHNlY3VyaXR5LXJvbGUtcmVmcy4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmFzc2VtYmx5LWRlc2NyaXB0b3IvamF2YWVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJyb2xlLW5hbWUtcmVmZXJlbmNlcyIKLQkJcmVmZXI9ImphdmFlZTpyb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBrZXlyZWYgaW5kaWNhdGVzIHRoZSByZWZlcmVuY2VzIGZyb20KLQkgIHNlY3VyaXR5LXJvbGUtcmVmIHRvIGEgc3BlY2lmaWVkIHJvbGUtbmFtZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVudGVycHJpc2UtYmVhbnMvKi9qYXZhZWU6c2VjdXJpdHktcm9sZS1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyb2xlLWxpbmsiLz4KLSAgICA8L3hzZDprZXlyZWY+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHlUeXBlIGNvbnRhaW5zIGEgbmFtZS92YWx1ZQotCWNvbmZpZ3VyYXRpb24gcHJvcGVydHkgcGFpciBmb3IgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0JVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi0JbWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSBlbGVtZW50IGNvbnRhaW5zCi0JICAgIHRoZSBuYW1lIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgb2YKLQkgICAgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0JICAgIEZvciBKTVMgbWVzc2FnZS1kcml2ZW4gYmVhbnMsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkKLQkgICAgbmFtZXMgYXJlIHJlY29nbml6ZWQ6IGFja25vd2xlZGdlTW9kZSwKLQkgICAgbWVzc2FnZVNlbGVjdG9yLCBkZXN0aW5hdGlvblR5cGUsIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHkKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS12YWx1ZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUgZWxlbWVudAotCSAgICBjb250YWlucyB0aGUgdmFsdWUgZm9yIGFuIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbgotCSAgICBwcm9wZXJ0eSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYWN0aXZhdGlvbi1jb25maWdUeXBlIGRlZmluZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JZXhwZWN0ZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCi0JaW4gaXRzIG9wZXJhdGlvbmFsIGVudmlyb25tZW50LiBUaGlzIG1heSBpbmNsdWRlIGluZm9ybWF0aW9uCi0JYWJvdXQgbWVzc2FnZSBhY2tub3dsZWRnZW1lbnQsIG1lc3NhZ2Ugc2VsZWN0b3IsIGV4cGVjdGVkCi0JZGVzdGluYXRpb24gdHlwZSwgZXRjLgotCi0JVGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgZXhwcmVzc2VkIGluIHRlcm1zIG9mCi0JbmFtZS92YWx1ZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCi0KLQlUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLQltZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5IgotCQkgICB0eXBlPSJqYXZhZWU6YWN0aXZhdGlvbi1jb25maWctcHJvcGVydHlUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFwcGxpY2F0aW9uLWV4Y2VwdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYXBwbGljYXRpb24tZXhjZXB0aW9uVHlwZSBkZWNsYXJlcyBhbiBhcHBsaWNhdGlvbgotICAgICAgICBleGNlcHRpb24uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotICAgICAgICAgICAgLSB0aGUgZXhjZXB0aW9uIGNsYXNzLiBXaGVuIHRoZSBjb250YWluZXIgcmVjZWl2ZXMKLSAgICAgICAgICAgICAgYW4gZXhjZXB0aW9uIG9mIHRoaXMgdHlwZSwgaXQgaXMgcmVxdWlyZWQgdG8KLSAgICAgICAgICAgICAgZm9yd2FyZCB0aGlzIGV4Y2VwdGlvbiBhcyBhbiBhcHBsY2F0aW9uIGV4Y2VwdGlvbgotICAgICAgICAgICAgICB0byB0aGUgY2xpZW50IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBhIGNoZWNrZWQKLSAgICAgICAgICAgICAgb3IgdW5jaGVja2VkIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgcm9sbGJhY2sgZWxlbWVudC4gSWYgdGhpcyBlbGVtZW50IGlzCi0gICAgICAgICAgICAgIHNldCB0byB0cnVlLCB0aGUgY29udGFpbmVyIG11c3Qgcm9sbGJhY2sgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgdHJhbnNhY3Rpb24gYmVmb3JlIGZvcndhcmRpbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUKLSAgICAgICAgICAgICAgY2xpZW50LiAgSWYgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gZmFsc2UuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xsYmFjayIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXJvdW5kLWludm9rZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYXJvdW5kLWludm9rZSB0eXBlIHNwZWNpZmllcyBhIG1ldGhvZCBvbiBhCi0gICAgICAgIGNsYXNzIHRvIGJlIGNhbGxlZCBkdXJpbmcgdGhlIGFyb3VuZCBpbnZva2UgcG9ydGlvbiBvZiBhbgotICAgICAgICBlamIgaW52b2NhdGlvbi4gIE5vdGUgdGhhdCBlYWNoIGNsYXNzIG1heSBoYXZlIG9ubHkgb25lCi0gICAgICAgIGFyb3VuZCBpbnZva2UgbWV0aG9kIGFuZCB0aGF0IHRoZSBtZXRob2QgbWF5IG5vdCBiZQotICAgICAgICBvdmVybG9hZGVkLgotCi0gICAgICAgIElmIHRoZSBjbGFzcyBlbGVtZW50IGlzIG1pc3NpbmcgdGhlbgotICAgICAgICB0aGUgY2xhc3MgZGVmaW5pbmcgdGhlIGNhbGxiYWNrIGlzIGFzc3VtZWQgdG8gYmUgdGhlCi0gICAgICAgIGludGVyY2VwdG9yIGNsYXNzIG9yIGNvbXBvbmVudCBjbGFzcyBpbiBzY29wZSBhdCB0aGUKLSAgICAgICAgbG9jYXRpb24gaW4gdGhlIGRlc2NyaXB0b3IgaW4gd2hpY2ggdGhlIGFyb3VuZCBpbnZva2UKLSAgICAgICAgZGVmaW5pdGlvbiBhcHBlYXJzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzZW1ibHktZGVzY3JpcHRvclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhc3NlbWJseS1kZXNjcmlwdG9yVHlwZSBkZWZpbmVzCi0JYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24uCi0KLQlUaGUgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24gY29uc2lzdHMgb2YgdGhlCi0JZm9sbG93aW5nIHBhcnRzOiB0aGUgZGVmaW5pdGlvbiBvZiBzZWN1cml0eSByb2xlcywgdGhlCi0JZGVmaW5pdGlvbiBvZiBtZXRob2QgcGVybWlzc2lvbnMsIHRoZSBkZWZpbml0aW9uIG9mCi0JdHJhbnNhY3Rpb24gYXR0cmlidXRlcyBmb3IgZW50ZXJwcmlzZSBiZWFucyB3aXRoCi0JY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24sIHRoZSBkZWZpbml0aW9uCi0gICAgICAgIG9mIGludGVyY2VwdG9yIGJpbmRpbmdzLCBhIGxpc3Qgb2YKLQltZXRob2RzIHRvIGJlIGV4Y2x1ZGVkIGZyb20gYmVpbmcgaW52b2tlZCwgYW5kIGEgbGlzdCBvZgotICAgICAgICBleGNlcHRpb24gdHlwZXMgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhcHBsaWNhdGlvbiBleGNlcHRpb25zLgotCi0JQWxsIHRoZSBwYXJ0cyBhcmUgb3B0aW9uYWwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUKLQlvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotCVByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50Ci0JZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlIgotCQkgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktcm9sZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGVybWlzc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOm1ldGhvZC1wZXJtaXNzaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci10cmFuc2FjdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvci1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTppbnRlcmNlcHRvci1iaW5kaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWxpc3QiCi0JCSAgIHR5cGU9ImphdmFlZTpleGNsdWRlLWxpc3RUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1leGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFwcGxpY2F0aW9uLWV4Y2VwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21wLWZpZWxkVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNtcC1maWVsZFR5cGUgZGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZQotCWNtcC1maWVsZFR5cGUgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkLAotCWFuZCB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZmllbGQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgIGNvbnRhaW5lciBtYW5hZ2VkIGZpZWxkLgotCi0JICAgIFRoZSBuYW1lIG9mIHRoZSBjbXAtZmllbGQgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotCSAgICBjbXAtdmVyc2lvbiAyLnggbXVzdCBiZWdpbiB3aXRoIGEgbG93ZXJjYXNlCi0JICAgIGxldHRlci4gVGhpcyBmaWVsZCBpcyBhY2Nlc3NlZCBieSBtZXRob2RzIHdob3NlCi0JICAgIG5hbWVzIGNvbnNpc3RzIG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkKLQkgICAgZmllbGQtbmFtZSBpbiB3aGljaCB0aGUgZmlyc3QgbGV0dGVyIGlzIHVwcGVyY2FzZWQsCi0JICAgIHByZWZpeGVkIGJ5ICJnZXQiIG9yICJzZXQiLgotCi0JICAgIFRoZSBuYW1lIG9mIHRoZSBjbXAtZmllbGQgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotCSAgICBjbXAtdmVyc2lvbiAxLnggbXVzdCBkZW5vdGUgYSBwdWJsaWMgZmllbGQgb2YgdGhlCi0JICAgIGVudGVycHJpc2UgYmVhbiBjbGFzcyBvciBvbmUgb2YgaXRzIHN1cGVyY2xhc3Nlcy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXAtdmVyc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjbXAtdmVyc2lvblR5cGUgc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIGFuIGVudGl0eSBiZWFuCi0Jd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gSXQgaXMgdXNlZCBieQotCWNtcC12ZXJzaW9uIGVsZW1lbnRzLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIDEueAotCSAgICAyLngKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMS54Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMi54Ii8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21yLWZpZWxkLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNsYXNzIG9mIGEKLQljb2xsZWN0aW9uLXZhbHVlZCBsb2dpY2FsIHJlbGF0aW9uc2hpcCBmaWVsZCBpbiB0aGUgZW50aXR5Ci0JYmVhbiBjbGFzcy4gVGhlIHZhbHVlIG9mIGFuIGVsZW1lbnQgdXNpbmcgY21yLWZpZWxkLXR5cGVUeXBlCi0JbXVzdCBiZSBlaXRoZXI6IGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGphdmEudXRpbC5TZXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS51dGlsLlNldCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtci1maWVsZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjbXItZmllbGRUeXBlIGRlc2NyaWJlcyB0aGUgYmVhbiBwcm92aWRlcidzIHZpZXcgb2YKLQlhIHJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZAotCXRoZSBuYW1lIGFuZCB0aGUgY2xhc3MgdHlwZSBvZiBhIGZpZWxkIGluIHRoZSBzb3VyY2Ugb2YgYQotCXJvbGUgb2YgYSByZWxhdGlvbnNoaXAuIFRoZSBjbXItZmllbGQtbmFtZSBlbGVtZW50Ci0JY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgdXNlZCBmb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yCi0JbWV0aG9kcyBmb3IgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIGNtci1maWVsZC10eXBlIGVsZW1lbnQgaXMKLQl1c2VkIG9ubHkgZm9yIGNvbGxlY3Rpb24tdmFsdWVkIGNtci1maWVsZHMuIEl0IHNwZWNpZmllcyB0aGUKLQl0eXBlIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgaXMgdXNlZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtci1maWVsZC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgICAgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuCi0JICAgIGNsYXNzLiBUaGUgbmFtZSBvZiB0aGUgY21yLWZpZWxkIG11c3QgYmVnaW4gd2l0aCBhCi0JICAgIGxvd2VyY2FzZSBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcwotCSAgICB3aG9zZSBuYW1lcyBjb25zaXN0IG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAotCSAgICBzcGVjaWZpZWQgYnkgY21yLWZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0Ci0JICAgIGxldHRlciBpcyB1cHBlcmNhc2VkLCBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXItZmllbGQtdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOmNtci1maWVsZC10eXBlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udGFpbmVyLXRyYW5zYWN0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyCi0JbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLQltZXRob2QgaW52b2NhdGlvbnMuIEl0IGRlZmluZXMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEKLQlsaXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLiBUaGUKLQl0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgaXMgdG8gYmUgYXBwbGllZCB0byBhbGwgdGhlIHNwZWNpZmllZAotCW1ldGhvZHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTptZXRob2RUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zLWF0dHJpYnV0ZSIKLQkJICAgdHlwZT0iamF2YWVlOnRyYW5zLWF0dHJpYnV0ZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItY2xhc3NUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItY2xhc3NUeXBlIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUKLQkgIGVudGVycHJpc2UgYmVhbidzIGNsYXNzLiBJdCBpcyB1c2VkIGJ5IGVqYi1jbGFzcyBlbGVtZW50cy4KLQotCSAgRXhhbXBsZToKLQotCSAgICAgIDxlamItY2xhc3M+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZUJlYW48L2VqYi1jbGFzcz4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItamFyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVqYi1qYXJUeXBlIGRlZmluZXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCCi0JZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJdCBjb250YWlucwotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGVqYi1qYXIgZmlsZQotCSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGljb24gdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0JICAgICAgaWNvbiBmaWxlIG5hbWUKLQkgICAgLSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBpbmNsdWRlZAotCSAgICAgIGVudGVycHJpc2UgYmVhbnMgdGhhdCBpcyBub3Qgc3BlY2lmaWVkIHRocm91Z2gKLSAgICAgICAgICAgICAgYW5ub3RhdGlvbnMKLSAgICAgICAgICAgIC0gc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBpbnRlcmNlcHRvciBjbGFzc2VzCi0JICAgIC0gYSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLAotCSAgICAgIGlmIGFueS4KLQkgICAgLSBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbi1hc3NlbWJseSBkZXNjcmlwdG9yCi0JICAgIC0gYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUKLQkgICAgICBlamItamFyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50ZXJwcmlzZS1iZWFucyIKLQkJICAgdHlwZT0iamF2YWVlOmVudGVycHJpc2UtYmVhbnNUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludGVyY2VwdG9ycyIKLQkJICAgdHlwZT0iamF2YWVlOmludGVyY2VwdG9yc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRpb25zaGlwcyIKLQkJICAgdHlwZT0iamF2YWVlOnJlbGF0aW9uc2hpcHNUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6dW5pcXVlIG5hbWU9InJlbGF0aW9uc2hpcC1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlbGF0aW9uLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICAgIHJlbGF0aW9uLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgICAgICByZWxhdGlvbnNoaXBzLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1yZWxhdGlvbiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1yZWxhdGlvbi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NlbWJseS1kZXNjcmlwdG9yIgotCQkgICB0eXBlPSJqYXZhZWU6YXNzZW1ibHktZGVzY3JpcHRvclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50Ci0JICAgIGRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUKLQkgICAgcHJvZHVjZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsaWVudC1qYXIiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIG9wdGlvbmFsIGVqYi1jbGllbnQtamFyIGVsZW1lbnQgc3BlY2lmaWVzIGEgSkFSCi0JICAgICAgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBjbGFzcyBmaWxlcyBuZWNlc3NhcnkgZm9yIGEKLQkgICAgICBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlCi0JICAgICAgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgZWpiLWphciBmaWxlLgotCi0JICAgICAgRXhhbXBsZToKLQotCQkgIDxlamItY2xpZW50LWphcj5lbXBsb3llZV9zZXJ2aWNlX2NsaWVudC5qYXIKLQkJICA8L2VqYi1jbGllbnQtamFyPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjMuMCIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgdmVyc2lvbiBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlCi0JICBFSkIgc3BlY2lmaWNhdGlvbiB0aGF0IHRoZSBpbnN0YW5jZSBkb2N1bWVudCBtdXN0Ci0JICBjb21wbHkgd2l0aC4gVGhpcyBpbmZvcm1hdGlvbiBlbmFibGVzIGRlcGxveW1lbnQgdG9vbHMKLQkgIHRvIHZhbGlkYXRlIGEgcGFydGljdWxhciBFSkIgRGVwbG95bWVudAotCSAgRGVzY3JpcHRvciB3aXRoIHJlc3BlY3QgdG8gYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBFSkIKLQkgIHNjaGVtYS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBkZWZpbmVzIHdoZXRoZXIgdGhpcwotCSAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCBvdGhlciByZWxhdGVkIGRlcGxveW1lbnQKLQkgIGRlc2NyaXB0b3JzIGZvciB0aGlzIG1vZHVsZSAoZS5nLiwgd2ViIHNlcnZpY2UKLQkgIGRlc2NyaXB0b3JzKSBhcmUgY29tcGxldGUsIG9yIHdoZXRoZXIgdGhlIGNsYXNzCi0JICBmaWxlcyBhdmFpbGFibGUgdG8gdGhpcyBtb2R1bGUgYW5kIHBhY2thZ2VkIHdpdGgKLQkgIHRoaXMgYXBwbGljYXRpb24gc2hvdWxkIGJlIGV4YW1pbmVkIGZvciBhbm5vdGF0aW9ucwotCSAgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQgaW5mb3JtYXRpb24uCi0KLQkgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIHNldCB0byAidHJ1ZSIsIHRoZSBkZXBsb3ltZW50Ci0JICB0b29sIG11c3QgaWdub3JlIGFueSBhbm5vdGF0aW9ucyB0aGF0IHNwZWNpZnkgZGVwbG95bWVudAotCSAgaW5mb3JtYXRpb24sIHdoaWNoIG1pZ2h0IGJlIHByZXNlbnQgaW4gdGhlIGNsYXNzIGZpbGVzCi0JICBvZiB0aGUgYXBwbGljYXRpb24uCi0KLQkgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgc2V0IHRvCi0JICAiZmFsc2UiLCB0aGUgZGVwbG95bWVudCB0b29sIG11c3QgZXhhbWluZSB0aGUgY2xhc3MKLQkgIGZpbGVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgYW5ub3RhdGlvbnMsIGFzCi0JICBzcGVjaWZpZWQgYnkgdGhlIHNwZWNpZmljYXRpb25zLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIGVqYi1uYW1lVHlwZSBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbmFtZS4gSXQgaXMKLQkgIHVzZWQgYnkgZWpiLW5hbWUgZWxlbWVudHMuIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUKLQkgIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBuYW1lIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4gdGhlCi0JICBlamItamFyIGZpbGUncyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBuYW1lIG11c3QgYmUKLQkgIHVuaXF1ZSBhbW9uZyB0aGUgbmFtZXMgb2YgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIHNhbWUKLQkgIGVqYi1qYXIgZmlsZS4KLQotCSAgVGhlcmUgaXMgbm8gYXJjaGl0ZWN0ZWQgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHVzZWQKLQkgIGVqYi1uYW1lIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIHRoZSBKTkRJIG5hbWUgdGhhdAotCSAgdGhlIERlcGxveWVyIHdpbGwgYXNzaWduIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBob21lLgotCi0JICBUaGUgbmFtZSBmb3IgYW4gZW50aXR5IGJlYW4gbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsCi0JICBydWxlcyBmb3IgYW4gTk1UT0tFTi4KLQotCSAgRXhhbXBsZToKLQotCSAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnhzZE5NVE9LRU5UeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWxhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlamItcmVsYXRpb25UeXBlIGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3bwotCWVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLiAgSXQgaXMgdXNlZAotCWJ5IGVqYi1yZWxhdGlvbiBlbGVtZW50cy4gSXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbjsgYW4KLQlvcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OyBhbmQgZXhhY3RseSB0d28KLQlyZWxhdGlvbnNoaXAgcm9sZSBkZWNsYXJhdGlvbnMsIGRlZmluZWQgYnkgdGhlCi0JZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnRzLiBUaGUgbmFtZSBvZiB0aGUKLQlyZWxhdGlvbnNoaXAsIGlmIHNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphcgotCWZpbGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb24tbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZQotCSAgICB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZSBmb3IgYSByZWxhdGlvbnNoaXAuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGRlc2NyaWJlcyBhIHJvbGUgd2l0aGluIGEKLQkgIHJlbGF0aW9uc2hpcC4gVGhlcmUgYXJlIHR3byByb2xlcyBpbiBlYWNoIHJlbGF0aW9uc2hpcC4KLQotCSAgVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUgY29udGFpbnMgYW4gb3B0aW9uYWwKLQkgIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcmVsYXRpb25zaGlwIHJvbGU7IGEKLQkgIHNwZWNpZmljYXRpb24gb2YgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgcm9sZTsgYW4gb3B0aW9uYWwKLQkgIHNwZWNpZmljYXRpb24gb2YgY2FzY2FkZS1kZWxldGUgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIHJvbGU7Ci0JICB0aGUgcm9sZSBzb3VyY2U7IGFuZCBhIGRlY2xhcmF0aW9uIG9mIHRoZSBjbXItZmllbGQsIGlmIGFueSwKLQkgIGJ5IG1lYW5zIG9mIHdoaWNoIHRoZSBvdGhlciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgaXMKLQkgIGFjY2Vzc2VkIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSByb2xlIHNvdXJjZS4KLQotCSAgVGhlIG11bHRpcGxpY2l0eSBhbmQgcm9sZS1zb3VyY2UgZWxlbWVudCBhcmUgbWFuZGF0b3J5LgotCi0JICBUaGUgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgZGVzaWduYXRlcyBhbiBlbnRpdHkKLQkgIGJlYW4gYnkgbWVhbnMgb2YgYW4gZWpiLW5hbWUgZWxlbWVudC4gRm9yIGJpZGlyZWN0aW9uYWwKLQkgIHJlbGF0aW9uc2hpcHMsIGJvdGggcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgbXVzdCBkZWNsYXJlIGEKLQkgIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHRoYXQgc3BlY2lmaWVzIGEgY21yLWZpZWxkCi0JICBpbiB0ZXJtcyBvZiB3aGljaCB0aGUgcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkLiBUaGUgbGFjayBvZgotCSAgYSBjbXItZmllbGQgZWxlbWVudCBpbiBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUgc3BlY2lmaWVzCi0JICB0aGF0IHRoZSByZWxhdGlvbnNoaXAgaXMgdW5pZGlyZWN0aW9uYWwgaW4gbmF2aWdhYmlsaXR5IGFuZAotCSAgdGhlIGVudGl0eSBiZWFuIHRoYXQgcGFydGljaXBhdGVzIGluIHRoZSByZWxhdGlvbnNoaXAgaXMKLQkgICJub3QgYXdhcmUiIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxlamItcmVsYXRpb24+Ci0JICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPlByb2R1Y3QtTGluZUl0ZW08L2VqYi1yZWxhdGlvbi1uYW1lPgotCSAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0JCSAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnByb2R1Y3QtaGFzLWxpbmVpdGVtcwotCQkgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0JCSAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLQkJICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotCQkgIDxlamItbmFtZT5Qcm9kdWN0RUpCPC9lamItbmFtZT4KLQkJICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLQkgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0JICA8L2VqYi1yZWxhdGlvbj4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBlbGVtZW50IGRlZmluZXMgYQotCSAgICBuYW1lIGZvciBhIHJvbGUgdGhhdCBpcyB1bmlxdWUgd2l0aGluIGFuCi0JICAgIGVqYi1yZWxhdGlvbi4gRGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUKLQkgICAgc2FtZSBuYW1lIGZvciBhIHJvbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGlwbGljaXR5IgotCQkgICB0eXBlPSJqYXZhZWU6bXVsdGlwbGljaXR5VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtZGVsZXRlIgotCQkgICB0eXBlPSJqYXZhZWU6ZW1wdHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCwgd2l0aGluIGEKLQkgICAgcGFydGljdWxhciByZWxhdGlvbnNoaXAsIHRoZSBsaWZldGltZSBvZiBvbmUgb3IgbW9yZQotCSAgICBlbnRpdHkgYmVhbnMgaXMgZGVwZW5kZW50IHVwb24gdGhlIGxpZmV0aW1lIG9mCi0JICAgIGFub3RoZXIgZW50aXR5IGJlYW4uIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IGNhbgotCSAgICBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0JICAgIGVsZW1lbnQgY29udGFpbmVkIGluIGFuIGVqYi1yZWxhdGlvbiBlbGVtZW50IGluCi0JICAgIHdoaWNoIHRoZSBvdGhlciBlamItcmVsYXRpb25zaGlwLXJvbGUKLQkgICAgZWxlbWVudCBzcGVjaWZpZXMgYSBtdWx0aXBsaWNpdHkgb2YgT25lLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIKLQkJICAgdHlwZT0iamF2YWVlOnJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXItZmllbGQiCi0JCSAgIHR5cGU9ImphdmFlZTpjbXItZmllbGRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRlcnByaXNlLWJlYW5zVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVudGVycHJpc2UtYmVhbnNUeXBlIGRlY2xhcmVzIG9uZSBvciBtb3JlIGVudGVycHJpc2UKLQliZWFucy4gRWFjaCBiZWFuIGNhbiBiZSBhIHNlc3Npb24sIGVudGl0eSBvciBtZXNzYWdlLWRyaXZlbgotCWJlYW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6c2Vzc2lvbi1iZWFuVHlwZSI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZgotCSAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0JICAgICAgdGhlIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgICAgICB0aGUgY29tcG9uZW50LgotCi0JICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGJlIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1sb2NhbC1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgICAgICB3aXRoaW4gdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQotCSAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyZXMtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLQkgICAgICBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5Ii8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5LW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IgotCQkgICB0eXBlPSJqYXZhZWU6ZW50aXR5LWJlYW5UeXBlIj4KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YKLQkgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotCSAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItbG9jYWwtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgICAgICB3aXRoaW4gdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LXJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0JICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgICBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQotCSAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyZXMtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZQotCSAgICAgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnYtZW50cnkiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplbnYtZW50cnktbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRyaXZlbiIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZHJpdmVuLWJlYW5UeXBlIj4KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZgotCSAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0JICAgICAgdGhlIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgICAgICB0aGUgY29tcG9uZW50LgotCi0JICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGJlIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1sb2NhbC1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLXJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0JICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgICBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLQkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cmVzLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZQotCSAgICAgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnYtZW50cnkiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplbnYtZW50cnktbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWJlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZW50aXR5LWJlYW5UeXBlIGRlY2xhcmVzIGFuIGVudGl0eSBiZWFuLiBUaGUgZGVjbGFyYXRpb24KLQljb25zaXN0cyBvZjoKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0JICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotCSAgICAgIGljb24gZmlsZSBuYW1lCi0JICAgIC0gYSB1bmlxdWUgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JICAgICAgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBtYXBwZWQtbmFtZSBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQotICAgICAgICAgICAgICB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwaHlzaWNhbAotICAgICAgICAgICAgICBqbmRpLW5hbWUgb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGhvbWUgaW50ZXJmYWNlLiBUaGlzCi0gICAgICAgICAgICAgIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHN1cHBvcnRlZCBieSBhbGwgaW1wbGVtZW50YXRpb25zLgotICAgICAgICAgICAgICBBbnkgdXNlIG9mIHRoaXMgZWxlbWVudCBpcyBub24tcG9ydGFibGUuCi0JICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBob21lCi0JICAgICAgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnkKLQkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQgbG9jYWwKLQkgICAgICBpbnRlcmZhY2VzLCBpZiBhbnkKLQkgICAgLSB0aGUgZW50aXR5IGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotCSAgICAtIHRoZSBvcHRpb25hbCBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlIG1hbmFnZW1lbnQgdHlwZS4gSWYKLSAgICAgICAgICAgICAgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQgaXQgaXMgZGVmYXVsdGVkIHRvIENvbnRhaW5lci4KLQkgICAgLSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcyBuYW1lCi0JICAgIC0gYW4gaW5kaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyByZWVudHJhbmN5Ci0JICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUKLQkgICAgICBlbnRpdHkgYmVhbidzIGNtcC12ZXJzaW9uCi0JICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncwotCSAgICAgIGFic3RyYWN0IHNjaGVtYSBuYW1lCi0JICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiBjb250YWluZXItbWFuYWdlZCBmaWVsZHMKLQkgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBwcmltYXJ5IGtleQotCSAgICAgIGZpZWxkCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudAotCSAgICAgIGVudHJpZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQgotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsCi0JICAgICAgRUpCIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYgotCSAgICAgIHNlcnZpY2UgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlCi0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eQotCSAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotCSAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBzZXQgb2YgcXVlcnkgZGVjbGFyYXRpb25zCi0JICAgICAgZm9yIGZpbmRlciBhbmQgc2VsZWN0IG1ldGhvZHMgZm9yIGFuIGVudGl0eQotCSAgICAgIGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguCi0KLQlUaGUgb3B0aW9uYWwgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZAotCWZvciBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlIGFuZAotCWNtcC12ZXJzaW9uIDIueC4KLQotCVRoZSBvcHRpb25hbCBwcmlta2V5LWZpZWxkIG1heSBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yCi0JaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLgotCi0JVGhlIG9wdGlvbmFsIGNtcC12ZXJzaW9uIGVsZW1lbnQgbWF5IGJlIHByZXNlbnQgaW4gdGhlCi0JZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuIElmCi0JdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24KLQllbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIGl0cyB2YWx1ZSBkZWZhdWx0cyB0byAyLnguCi0KLQlUaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmCi0JdGhlIGVudGl0eSBiZWFuIGNtcC12ZXJzaW9uIGlzIDEueC4KLQotCVRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYKLQl0aGUgZW50aXR5IGJlYW4gaGFzIGEgcmVtb3RlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2UuCi0KLQlUaGUgb3B0aW9uYWwgbG9jYWwtaG9tZSBhbmQgbG9jYWwgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQKLQlpZiB0aGUgZW50aXR5IGJlYW4gaGFzIGEgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLgotCi0JRWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoCi0JdGhlIGhvbWUgYW5kIHRoZSByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQuCi0KLQlUaGUgb3B0aW9uYWwgcXVlcnkgZWxlbWVudHMgbXVzdCBiZSBwcmVzZW50IGlmIHRoZQotCXBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMi54IGFuZAotCXF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkCi0JZm9yIHRoZSBlbnRpdHkgYmVhbi4KLQotCVRoZSBvdGhlciBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUKLQlzZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0KLQlhcmUgZW1wdHkuCi0KLQlBdCBsZWFzdCBvbmUgY21wLWZpZWxkIGVsZW1lbnQgbXVzdCBiZSBwcmVzZW50IGluIHRoZQotCWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZAotCXRoZSBjbXAtdmVyc2lvbiBpcyAxLngsIGFuZCBub25lIG11c3Qgbm90IGJlIHByZXNlbnQgaWYgdGhlCi0JZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBCZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpob21lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlIgotCQkgICB0eXBlPSJqYXZhZWU6cmVtb3RlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLQkJICAgdHlwZT0iamF2YWVlOmxvY2FsLWhvbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKLQkJICAgdHlwZT0iamF2YWVlOmxvY2FsVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTpwZXJzaXN0ZW5jZS10eXBlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW0ta2V5LWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwcmltLWtleS1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZQotCSAgICBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhbgotCSAgICBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzLgotCi0JICAgIElmIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBpcwotCSAgICBkZWZlcnJlZCB0byBkZXBsb3ltZW50IHRpbWUsIHRoZSBwcmltLWtleS1jbGFzcwotCSAgICBlbGVtZW50IHNob3VsZCBzcGVjaWZ5IGphdmEubGFuZy5PYmplY3QuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVlbnRyYW50IgotCQkgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVlbnRyYW50IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYW4gZW50aXR5Ci0JICAgIGJlYW4gaXMgcmVlbnRyYW50IG9yIG5vdC4KLQotCSAgICBUaGUgcmVlbnRyYW50IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3bwotCSAgICBmb2xsb3dpbmc6IHRydWUgb3IgZmFsc2UKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtdmVyc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOmNtcC12ZXJzaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWJzdHJhY3Qtc2NoZW1hLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgb2YgdGhlIGFic3RyYWN0IHNjaGVtYSB0eXBlIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkgICAgY21wLXZlcnNpb24gMi54LiBJdCBpcyB1c2VkIGluIEVKQiBRTCBxdWVyaWVzLgotCi0JICAgIEZvciBleGFtcGxlLCB0aGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZm9yIGFuIGVudGl0eQotCSAgICBiZWFuIHdob3NlIGxvY2FsIGludGVyZmFjZSBpcwotCSAgICBjb20uYWNtZS5jb21tZXJjZS5PcmRlciBtaWdodCBiZSBPcmRlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtZmllbGQiCi0JCSAgIHR5cGU9ImphdmFlZTpjbXAtZmllbGRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWtleS1maWVsZCIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCi0JICAgIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkIGZvciBhbiBlbnRpdHkgd2l0aAotCSAgICBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQotCSAgICBUaGUgcHJpbWtleS1maWVsZCBtdXN0IGJlIG9uZSBvZiB0aGUgZmllbGRzIGRlY2xhcmVkCi0JICAgIGluIHRoZSBjbXAtZmllbGQgZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZAotCSAgICBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleSB0eXBlLgotCi0JICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgbm90IHVzZWQgaWYgdGhlIHByaW1hcnkKLQkgICAga2V5IG1hcHMgdG8gbXVsdGlwbGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JICAgIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbiB0aGlzIGNhc2UsIHRoZQotCSAgICBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQKLQkgICAgdGhlaXIgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZCBuYW1lcyBvZgotCSAgICB0aGUgZW50aXR5IGJlYW4gY2xhc3MgdGhhdCBjb21wcmlzZSB0aGUga2V5LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LXJvbGUtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWlkZW50aXR5IgotCQkgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIKLQkJICAgdHlwZT0iamF2YWVlOnF1ZXJ5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4Y2x1ZGUtbGlzdFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBleGNsdWRlLWxpc3RUeXBlIHNwZWNpZmllcyBvbmUgb3IgbW9yZSBtZXRob2RzIHdoaWNoCi0JdGhlIEFzc2VtYmxlciBtYXJrcyB0byBiZSB1bmNhbGxhYmxlLgotCi0JSWYgdGhlIG1ldGhvZCBwZXJtaXNzaW9uIHJlbGF0aW9uIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBhcmUKLQlpbiB0aGUgZXhjbHVkZSBsaXN0LCB0aGUgRGVwbG95ZXIgc2hvdWxkIGNvbnNpZGVyIHRob3NlCi0JbWV0aG9kcyB0byBiZSB1bmNhbGxhYmxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotCQkgICB0eXBlPSJqYXZhZWU6bWV0aG9kVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbml0LW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JlYXRlLW1ldGhvZCIKLQkJICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiZWFuLW1ldGhvZCIKLQkJICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmNlcHRvci1iaW5kaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBpbnRlcmNlcHRvci1iaW5kaW5nVHlwZSBlbGVtZW50IGRlc2NyaWJlcyB0aGUgYmluZGluZyBvZgotICAgICAgICBpbnRlcmNlcHRvciBjbGFzc2VzIHRvIGJlYW5zIHdpdGhpbiB0aGUgZWpiLWphci4KLSAgICAgICAgSXQgY29uc2lzdHMgb2YgOgotCi0gICAgICAgICAgLSBBbiBvcHRpb25hbCBkZXNjcmlwdGlvbi4KLSAgICAgICAgICAtIFRoZSBuYW1lIG9mIGFuIGVqYiB3aXRoaW4gdGhlIGVqYi1qYXIgb3IgdGhlIHdpbGRjYXJkIHZhbHVlICIqIiwKLSAgICAgICAgICAgIHdoaWNoIGlzIHVzZWQgdG8gZGVmaW5lIGludGVyY2VwdG9ycyB0aGF0IGFyZSBib3VuZCB0byBhbGwKLSAgICAgICAgICAgIGJlYW5zIGluIHRoZSBlamItamFyLgotICAgICAgICAgIC0gQSBsaXN0IG9mIGludGVyY2VwdG9yIGNsYXNzZXMgdGhhdCBhcmUgYm91bmQgdG8gdGhlIGNvbnRlbnRzIG9mCi0gICAgICAgICAgICB0aGUgZWpiLW5hbWUgZWxlbWVudCBvciBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHRvdGFsIG9yZGVyaW5nCi0gICAgICAgICAgICBvdmVyIHRoZSBpbnRlcmNlcHRvcnMgZGVmaW5lZCBmb3IgdGhlIGdpdmVuIGxldmVsIGFuZCBhYm92ZS4KLSAgICAgICAgICAtIEFuIG9wdGlvbmFsIGV4Y2x1ZGUtZGVmYXVsdC1pbnRlcmNlcHRvcnMgZWxlbWVudC4gIElmIHNldCB0byB0cnVlLAotICAgICAgICAgICAgc3BlY2lmaWVzIHRoYXQgZGVmYXVsdCBpbnRlcmNlcHRvcnMgYXJlIG5vdCB0byBiZSBhcHBsaWVkIHRvCi0gICAgICAgICAgICBhIGJlYW4tY2xhc3MgYW5kL29yIGJ1c2luZXNzIG1ldGhvZC4KLSAgICAgICAgICAtIEFuIG9wdGlvbmFsIGV4Y2x1ZGUtY2xhc3MtaW50ZXJjZXB0b3JzIGVsZW1lbnQuICBJZiBzZXQgdG8gdHJ1ZSwKLSAgICAgICAgICAgIHNwZWNpZmllcyB0aGF0IGNsYXNzIGludGVyY2VwdG9ycyBhcmUgbm90IHRvIGJlIGFwcGxpZWQgdG8KLSAgICAgICAgICAgIGEgYnVzaW5lc3MgbWV0aG9kLgotICAgICAgICAgIC0gQW4gb3B0aW9uYWwgc2V0IG9mIG1ldGhvZCBlbGVtZW50cyBmb3IgZGVzY3JpYmluZyB0aGUgbmFtZS9wYXJhbXMKLSAgICAgICAgICAgIG9mIGEgbWV0aG9kLWxldmVsIGludGVyY2VwdG9yLgotCi0gICAgICAgICBJbnRlcmNlcHRvcnMgYm91bmQgdG8gYWxsIGNsYXNzZXMgdXNpbmcgdGhlIHdpbGRjYXJkIHN5bnRheAotICAgICAgICAgIioiIGFyZSBkZWZhdWx0IGludGVyY2VwdG9ycyBmb3IgdGhlIGNvbXBvbmVudHMgaW4gdGhlIGVqYi1qYXIuCi0gICAgICAgICBJbiBhZGRpdGlvbiwgaW50ZXJjZXB0b3JzIG1heSBiZSBib3VuZCBhdCB0aGUgbGV2ZWwgb2YgdGhlIGJlYW4KLSAgICAgICAgIGNsYXNzIChjbGFzcy1sZXZlbCBpbnRlcmNlcHRvcnMpIG9yIGJ1c2luZXNzIG1ldGhvZHMgKG1ldGhvZC1sZXZlbAotICAgICAgICAgaW50ZXJjZXB0b3JzICkuCi0KLSAgICAgICAgIFRoZSBiaW5kaW5nIG9mIGludGVyY2VwdG9ycyB0byBjbGFzc2VzIGlzIGFkZGl0aXZlLiAgSWYgaW50ZXJjZXB0b3JzCi0gICAgICAgICBhcmUgYm91bmQgYXQgdGhlIGNsYXNzLWxldmVsIGFuZC9vciBkZWZhdWx0LWxldmVsIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICBtZXRob2QtbGV2ZWwsIGJvdGggY2xhc3MtbGV2ZWwgYW5kL29yIGRlZmF1bHQtbGV2ZWwgYXMgd2VsbCBhcwotICAgICAgICAgbWV0aG9kLWxldmVsIHdpbGwgYXBwbHkuCi0KLSAgICAgICAgIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmxlIHN0eWxlcyBvZiB0aGUgaW50ZXJjZXB0b3IgZWxlbWVudCBzeW50YXggOgotCi0gICAgICAgICAxLgotICAgICAgICAgPGludGVyY2VwdG9yLWJpbmRpbmc+Ci0gICAgICAgICAgIDxlamItbmFtZT4qPC9lamItbmFtZT4KLSAgICAgICAgICAgPGludGVyY2VwdG9yLWNsYXNzPklOVEVSQ0VQVE9SPC9pbnRlcmNlcHRvci1jbGFzcz4KLSAgICAgICAgIDwvaW50ZXJjZXB0b3ItYmluZGluZz4KLQotICAgICAgICAgU3BlY2lmeWluZyB0aGUgZWpiLW5hbWUgYXMgdGhlIHdpbGRjYXJkIHZhbHVlICIqIiBkZXNpZ25hdGVzCi0gICAgICAgICBkZWZhdWx0IGludGVyY2VwdG9ycyAoaW50ZXJjZXB0b3JzIHRoYXQgYXBwbHkgdG8gYWxsIHNlc3Npb24gYW5kCi0gICAgICAgICBtZXNzYWdlLWRyaXZlbiBiZWFucyBjb250YWluZWQgaW4gdGhlIGVqYi1qYXIpLgotCi0gICAgICAgICAyLgotICAgICAgICAgPGludGVyY2VwdG9yLWJpbmRpbmc+Ci0gICAgICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICAgICAgICAgPGludGVyY2VwdG9yLWNsYXNzPklOVEVSQ0VQVE9SPC9pbnRlcmNlcHRvci1jbGFzcz4KLSAgICAgICAgIDwvaW50ZXJjZXB0b3ItYmluZGluZz4KLQotICAgICAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGludGVyY2VwdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgICAgICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuKGNsYXNzLWxldmVsIGludGVyY2VwdG9ycykuCi0KLSAgICAgICAgIDMuCi0gICAgICAgICA8aW50ZXJjZXB0b3ItYmluZGluZz4KLSAgICAgICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgICAgICAgICA8aW50ZXJjZXB0b3ItY2xhc3M+SU5URVJDRVBUT1I8L2ludGVyY2VwdG9yLWNsYXNzPgotICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvaW50ZXJjZXB0b3ItYmluZGluZz4KLQotICAgICAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIGFzc29jaWF0ZSBhIG1ldGhvZC1sZXZlbCBpbnRlcmNlcHRvciB3aXRoCi0gICAgICAgICB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtZXRob2RzCi0gICAgICAgICB3aXRoIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhlIGVsZW1lbnQgb2YgdGhpcyBzdHlsZSByZWZlcnMKLSAgICAgICAgIHRvIGFsbCB0aGUgbWV0aG9kcyB3aXRoIHRoZSBvdmVybG9hZGVkIG5hbWUuICBNZXRob2QtbGV2ZWwKLSAgICAgICAgIGludGVyY2VwdG9ycyBjYW4gb25seSBiZSBhc3NvY2lhdGVkIHdpdGggYnVzaW5lc3MgbWV0aG9kcyBvZiB0aGUKLSAgICAgICAgIGJlYW4gY2xhc3MuICAgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZCB2YWx1ZSAiKiIgY2Fubm90IGJlIHVzZWQKLSAgICAgICAgIHRvIHNwZWNpZnkgbWV0aG9kLWxldmVsIGludGVyY2VwdG9ycy4KLQotICAgICAgICAgNC4KLSAgICAgICAgIDxpbnRlcmNlcHRvci1iaW5kaW5nPgotICAgICAgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgICAgICAgIDxpbnRlcmNlcHRvci1jbGFzcz5JTlRFUkNFUFRPUjwvaW50ZXJjZXB0b3ItY2xhc3M+Ci0gICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPlBBUkFNLTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgLi4uCi0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPlBBUkFNLU48L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9pbnRlcmNlcHRvci1iaW5kaW5nPgotCi0gICAgICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gYXNzb2NpYXRlIGEgbWV0aG9kLWxldmVsIGludGVyY2VwdG9yIHdpdGgKLSAgICAgICAgIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mIHRoZSBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiAgVGhpcwotICAgICAgICAgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEgc2V0IG9mIG1ldGhvZHMKLSAgICAgICAgIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiAgVGhlIHZhbHVlcyBQQVJBTS0xIHRocm91Z2ggUEFSQU0tTgotICAgICAgICAgYXJlIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycwotICAgICAgICAgKGlmIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0IGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudAotICAgICAgICAgY29udGFpbnMgbm8gbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlCi0gICAgICAgICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZiBzcXVhcmUKLSAgICAgICAgIGJyYWNrZXRzIChlLmcuIGludFtdW10pLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludGVyY2VwdG9yLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludGVyY2VwdG9yLW9yZGVyIgotCQkgICAgIHR5cGU9ImphdmFlZTppbnRlcmNlcHRvci1vcmRlclR5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIxIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWludGVyY2VwdG9ycyIKLQkJICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWNsYXNzLWludGVyY2VwdG9ycyIKLQkJICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyY2VwdG9yLW9yZGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICBUaGUgaW50ZXJjZXB0b3Itb3JkZXJUeXBlIGVsZW1lbnQgZGVzY3JpYmVzIGEgdG90YWwgb3JkZXJpbmcKLSAgICAgICAgb2YgaW50ZXJjZXB0b3IgY2xhc3Nlcy4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmNlcHRvclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgaW50ZXJjZXB0b3JUeXBlIGVsZW1lbnQgZGVjbGFyZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUKLSAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3MuICBJdCBjb25zaXN0cyBvZiA6Ci0KLSAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24uCi0gICAgICAgICAgICAtIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgaW50ZXJjZXB0b3IgY2xhc3MuCi0gICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGxpc3Qgb2YgYXJvdW5kIGludm9rZSBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZQotICAgICAgICAgICAgICBpbnRlcmNlcHRvciBjbGFzcyBhbmQvb3IgaXRzIHN1cGVyLWNsYXNzZXMuCi0gICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGxpc3QgZW52aXJvbm1lbnQgZGVwZW5kZW5jaWVzIGZvciB0aGUgaW50ZXJjZXB0b3IKLSAgICAgICAgICAgICAgY2xhc3MgYW5kL29yIGl0cyBzdXBlci1jbGFzc2VzLgotICAgICAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IG9mIHBvc3QtYWN0aXZhdGUgbWV0aG9kcyBkZWNsYXJlZCBvbiB0aGUKLSAgICAgICAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3MgYW5kL29yIGl0cyBzdXBlci1jbGFzc2VzLgotICAgICAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IG9mIHByZS1wYXNzaXZhdGUgbWV0aG9kcyBkZWNsYXJlZCBvbiB0aGUKLSAgICAgICAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3MgYW5kL29yIGl0cyBzdXBlci1jbGFzc2VzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludGVyY2VwdG9yLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFyb3VuZC1pbnZva2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFyb3VuZC1pbnZva2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWFjdGl2YXRlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsaWZlY3ljbGUtY2FsbGJhY2tUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wYXNzaXZhdGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJjZXB0b3JzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBpbnRlcmNlcHRvcnNUeXBlIGVsZW1lbnQgZGVjbGFyZXMgb25lIG9yIG1vcmUgaW50ZXJjZXB0b3IKLSAgICAgICAgY2xhc3NlcyB1c2VkIGJ5IGNvbXBvbmVudHMgd2l0aGluIHRoaXMgZWpiLWphci4gIFRoZSBkZWNsYXJhdGlvbgotICAgICAgICBjb25zaXN0cyBvZiA6Ci0KLSAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24uCi0gICAgICAgICAgICAtIE9uZSBvciBtb3JlIGludGVyY2VwdG9yIGVsZW1lbnRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludGVyY2VwdG9yIgotCQkgICB0eXBlPSJqYXZhZWU6aW50ZXJjZXB0b3JUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZHJpdmVuLWJlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWVzc2FnZS1kcml2ZW4gZWxlbWVudCBkZWNsYXJlcyBhIG1lc3NhZ2UtZHJpdmVuCi0JYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQkgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0JICAgICAgaWNvbiBmaWxlIG5hbWUuCi0JICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4KLQkgICAgICB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICAgICAgICAtIGFuIG9wdGlvbmFsIG1hcHBlZC1uYW1lIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBwcm92aWRlCi0gICAgICAgICAgICAgIHZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHBoeXNpY2FsCi0gICAgICAgICAgICAgIGpuZGktbmFtZSBvZiBkZXN0aW5hdGlvbiBmcm9tIHdoaWNoIHRoaXMgbWVzc2FnZS1kcml2ZW4gYmVhbgotICAgICAgICAgICAgICBzaG91bGQgY29uc3VtZS4gIFRoaXMgZWxlbWVudCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc3VwcG9ydGVkCi0gICAgICAgICAgICAgIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMuICBBbnkgdXNlIG9mIHRoaXMgZWxlbWVudCBpcyBub24tcG9ydGFibGUuCi0JICAgIC0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnaW5nCi0JICAgICAgdHlwZQotICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHRpbWVvdXQgbWV0aG9kLgotCSAgICAtIHRoZSBvcHRpb25hbCBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudAotICAgICAgICAgICAgICB0eXBlLiBJZiBpdCBpcyBub3QgZGVmaW5lZCwgaXQgaXMgZGVmYXVsdGVkIHRvIENvbnRhaW5lci4KLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tbGluawotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MKLQkgICAgICBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcwotICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuIGNsYXNzIGFuZC9vcgotICAgICAgICAgICAgICBzdXBlcmNsYXNzIGFyb3VuZC1pbnZva2UgbWV0aG9kcy4KLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50Ci0JICAgICAgZW50cmllcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIEVKQgotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYiBzZXJ2aWNlCi0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eQotCSAgICAgIGlkZW50aXR5IHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIG1ldGhvZHMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotCSAgICAgIGVudmlyb25tZW50IHJlZmVyZW5jZXMuCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlCi0JICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgIFRoZSBlamItY2xhc3MgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lCi0gICAgICAgICAgICAgb2YgdGhlIGJlYW4gY2xhc3MgZm9yIHRoaXMgZWpiLiAgSXQgaXMgcmVxdWlyZWQgdW5sZXNzCi0gICAgICAgICAgICAgdGhlcmUgaXMgYSBjb21wb25lbnQtZGVmaW5pbmcgYW5ub3RhdGlvbiBmb3IgdGhlIHNhbWUKLSAgICAgICAgICAgICBlamItbmFtZS4KLQotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2luZy10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIG1lc3NhZ2luZy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXNzYWdlCi0JICAgIGxpc3RlbmVyIGludGVyZmFjZSBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aW1lb3V0LW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bmFtZWQtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6dHJhbnNhY3Rpb24tdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rIgotCQkgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWciCi0JCSAgIHR5cGU9ImphdmFlZTphY3RpdmF0aW9uLWNvbmZpZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFyb3VuZC1pbnZva2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFyb3VuZC1pbnZva2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLQkJICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LWlkZW50aXR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLWludGZUeXBlIj4KLQotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyBhIG1ldGhvZCBlbGVtZW50IHRvCi0JZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKLQlzaWduYXR1cmUgdGhhdCBhcmUgbXVsdGlwbHkgZGVmaW5lZCBhY3Jvc3MgdGhlIGhvbWUgYW5kCi0JY29tcG9uZW50IGludGVyZmFjZXMgKGUuZywgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotCXJlbW90ZSBhbmQgbG9jYWwgaW50ZXJmYWNlcyBvciBpbiBib3RoIGFuIGVudGVycHJpc2UgYmVhbidzCi0JaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGV0Yy4pOyB0aGUgY29tcG9uZW50IGFuZCB3ZWIKLQlzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMsIGFuZCBzbyBvbi4gVGhlIExvY2FsIGFwcGxpZXMgdG8KLSAgICAgICAgYm90aCBsb2NhbCBjb21wb25lbnQgaW50ZXJmYWNlIGFuZCBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2UuCi0gICAgICAgIFNpbWlsYXJseSwgUmVtb3RlIGFwcGxpZXMgdG8gYm90aCByZW1vdGUgY29tcG9uZW50IGludGVyZmFjZQotICAgICAgICBhbmQgdGhlIHJlbW90ZSBidXNpbmVzcyBpbnRlcmZhY2UuCi0KLQlUaGUgbWV0aG9kLWludGYgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JICAgIEhvbWUKLQkgICAgUmVtb3RlCi0JICAgIExvY2FsSG9tZQotCSAgICBMb2NhbAotCSAgICBTZXJ2aWNlRW5kcG9pbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW90ZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsSG9tZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUVuZHBvaW50Ii8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLW5hbWVUeXBlIGNvbnRhaW5zIGEgbmFtZSBvZiBhbiBlbnRlcnByaXNlCi0JYmVhbiBtZXRob2Qgb3IgdGhlIGFzdGVyaXNrICgqKSBjaGFyYWN0ZXIuIFRoZSBhc3RlcmlzayBpcwotCXVzZWQgd2hlbiB0aGUgZWxlbWVudCBkZW5vdGVzIGFsbCB0aGUgbWV0aG9kcyBvZiBhbgotCWVudGVycHJpc2UgYmVhbidzIGNsaWVudCB2aWV3IGludGVyZmFjZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLXBhcmFtc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXRob2QtcGFyYW1zVHlwZSBkZWZpbmVzIGEgbGlzdCBvZiB0aGUKLQlmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG5hbWVzIG9mIHRoZSBtZXRob2QgcGFyYW1ldGVycy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW0iCi0JCSAgIHR5cGU9ImphdmFlZTpqYXZhLXR5cGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIG1ldGhvZC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgcHJpbWl0aXZlCi0JICAgIG9yIGEgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lIG9mIGEgbWV0aG9kCi0JICAgIHBhcmFtZXRlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtcGVybWlzc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUgc3BlY2lmaWVzIHRoYXQgb25lIG9yIG1vcmUKLQlzZWN1cml0eSByb2xlcyBhcmUgYWxsb3dlZCB0byBpbnZva2Ugb25lIG9yIG1vcmUgZW50ZXJwcmlzZQotCWJlYW4gbWV0aG9kcy4gVGhlIG1ldGhvZC1wZXJtaXNzaW9uVHlwZSBjb25zaXN0cyBvZiBhbgotCW9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhIGxpc3Qgb2Ygc2VjdXJpdHkgcm9sZSBuYW1lcyBvciBhbgotCWluZGljYXRvciB0byBzdGF0ZSB0aGF0IHRoZSBtZXRob2QgaXMgdW5jaGVja2VkIGZvcgotCWF1dGhvcml6YXRpb24sIGFuZCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLgotCi0JVGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIG1ldGhvZC1wZXJtaXNzaW9uVHlwZQotCW11c3QgYmUgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBvZiB0aGUKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGFuZCB0aGUgbWV0aG9kcyBtdXN0IGJlIG1ldGhvZHMKLQlkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcywgaG9tZSwgY29tcG9uZW50Ci0gICAgICAgIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICAgIHR5cGU9ImphdmFlZTpyb2xlLW5hbWVUeXBlIgotCQkgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9InVuY2hlY2tlZCIKLQkJICAgICB0eXBlPSJqYXZhZWU6ZW1wdHlUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHVuY2hlY2tlZCBlbGVtZW50IHNwZWNpZmllcyB0aGF0IGEgbWV0aG9kIGlzCi0JICAgICAgbm90IGNoZWNrZWQgZm9yIGF1dGhvcml6YXRpb24gYnkgdGhlIGNvbnRhaW5lcgotCSAgICAgIHByaW9yIHRvIGludm9jYXRpb24gb2YgdGhlIG1ldGhvZC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLQkJICAgdHlwZT0iamF2YWVlOm1ldGhvZFR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgbWV0aG9kVHlwZSBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlCi0JICBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50Ci0JICBpbnRlcmZhY2UsIG9yLCBpbiB0aGUgY2FzZSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4sIHRoZQotCSAgYmVhbidzIG1lc3NhZ2UgbGlzdGVuZXIgbWV0aG9kLCBvciBhIHNldCBvZiBzdWNoCi0JICBtZXRob2RzLiBUaGUgZWpiLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUKLQkgIGVudGVycHJpc2UgYmVhbnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlCi0JICBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEKLQkgIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSB0aGF0IGlzIG11bHRpcGx5IGRlZmluZWQKLQkgIGFjcm9zcyB0aGUgYnVzaW5lc3MsIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yIHdlYiBzZXJ2aWNlCi0gICAgICAgICAgZW5kcG9pbnQgbnRlcmZhY2VzOyB0aGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlCi0gICAgICAgICAgbWV0aG9kIG5hbWU7IGFuZCB0aGUgb3B0aW9uYWwgbWV0aG9kLXBhcmFtcyBlbGVtZW50cyBpZGVudGlmeQotICAgICAgICAgIGEgc2luZ2xlIG1ldGhvZCBhbW9uZyBtdWx0aXBsZSBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZAotCSAgbWV0aG9kIG5hbWUuCi0KLQkgIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHlsZXMgb2YgdXNpbmcgbWV0aG9kVHlwZSBlbGVtZW50Ci0JICB3aXRoaW4gYSBtZXRob2QgZWxlbWVudDoKLQotCSAgMS4KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLQkgIDwvbWV0aG9kPgotCi0JICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZSBtZXRob2RzIG9mIHRoZQotCSAgICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsCi0gICAgICAgICAgICAgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMuCi0KLQkgIDIuCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLQkgIDwvbWV0aG9kPgotCi0JICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIHNwZWNpZmllZCBtZXRob2Qgb2YKLQkgICAgIHRoZSBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKLQkgICAgIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoZSBlbGVtZW50IG9mCi0JICAgICB0aGlzIHN0eWxlIHJlZmVycyB0byBhbGwgdGhlIG1ldGhvZHMgd2l0aCB0aGUgb3ZlcmxvYWRlZAotCSAgICAgbmFtZS4KLQotCSAgMy4KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotCSAgICAgIDxtZXRob2QtcGFyYW1zPgotCQkgIDxtZXRob2QtcGFyYW0+UEFSQU0tMTwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+UEFSQU0tMjwvbWV0aG9kLXBhcmFtPgotCQkgIC4uLgotCQkgIDxtZXRob2QtcGFyYW0+UEFSQU0tbjwvbWV0aG9kLXBhcmFtPgotCSAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLQkgIDwvbWV0aG9kPgotCi0JICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSBzaW5nbGUgbWV0aG9kIHdpdGhpbiBhCi0JICAgICBzZXQgb2YgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQgbmFtZS4gUEFSQU0tMSB0aHJvdWdoCi0JICAgICBQQVJBTS1uIGFyZSB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlCi0JICAgICBtZXRob2QncyBpbnB1dCBwYXJhbWV0ZXJzIChpZiB0aGUgbWV0aG9kIGhhcyBubyBpbnB1dAotCSAgICAgYXJndW1lbnRzLCB0aGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50IGNvbnRhaW5zIG5vCi0JICAgICBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUKLQkgICAgIGFycmF5IGVsZW1lbnQncyB0eXBlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwYWlyIG9mCi0JICAgICBzcXVhcmUgYnJhY2tldHMgKGUuZy4gaW50W11bXSkuIElmIHRoZXJlIGFyZSBtdWx0aXBsZQotCSAgICAgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhpcyBzdHlsZSByZWZlcnMKLQkgICAgIHRvIGFsbCBvZiB0aGUgb3ZlcmxvYWRlZCBtZXRob2RzLgotCi0JICBFeGFtcGxlczoKLQotCSAgU3R5bGUgMTogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZQotCSAgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBidXNpbmVzcywgaG9tZSwKLSAgICAgICAgICBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzOgotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLQkgIDwvbWV0aG9kPgotCi0JICBTdHlsZSAyOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi0JICBjcmVhdGUgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lCi0JICBpbnRlcmZhY2UocykuCi0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgU3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlCi0JICBjcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlCi0JICBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlKHMpLgotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCSAgICAgIDxtZXRob2QtcGFyYW1zPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCSAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLQkgIDwvbWV0aG9kPgotCi0JICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgYSBTdHlsZSAzIGVsZW1lbnQgd2l0aAotCSAgbW9yZSBjb21wbGV4IHBhcmFtZXRlciB0eXBlcy4gVGhlIG1ldGhvZAotCSAgZm9vYmFyKGNoYXIgcywgaW50IGksIGludFtdIGlhciwgbXlwYWNrYWdlLk15Q2xhc3MgbXljbCwKLQkgIG15cGFja2FnZS5NeUNsYXNzW11bXSBteWNsYWFyKSB3b3VsZCBiZSBzcGVjaWZpZWQgYXM6Ci0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmZvb2JhcjwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5jaGFyPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5pbnQ8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmludFtdPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzczwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3NbXVtdPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdoZW4gaXQgYmVjb21lcwotCSAgbmVjZXNzYXJ5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIG1ldGhvZCB0aGF0IGlzIG11bHRpcGx5Ci0JICBkZWZpbmVkIGFjcm9zcyB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsIGNvbXBvbmVudCwKLSAgICAgICAgICBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kCi0JICBzaWduYXR1cmUuIEhvd2V2ZXIsIGlmIHRoZSBzYW1lIG1ldGhvZCBpcyBhIG1ldGhvZCBvZiBib3RoIHRoZQotICAgICAgICAgIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZSwgYW5kIHRoZSBsb2NhbCBjb21wb25lbnQgaW50ZXJmYWNlLAotICAgICAgICAgIHRoZSBzYW1lIGF0dHJpYnV0ZSBhcHBsaWVzIHRvIHRoZSBtZXRob2QgZm9yIGJvdGggaW50ZXJmYWNlcy4KLSAgICAgICAgICBMaWtld2lzZSwgaWYgdGhlIHNhbWUgbWV0aG9kIGlzIGEgbWV0aG9kIG9mIGJvdGggdGhlIHJlbW90ZQotICAgICAgICAgIGJ1c2luZXNzIGludGVyZmFjZSBhbmQgdGhlIHJlbW90ZSBjb21wb25lbnQgaW50ZXJmYWNlLCB0aGUgc2FtZQotICAgICAgICAgIGF0dHJpYnV0ZSBhcHBsaWVzIHRvIHRoZSBtZXRob2QgZm9yIGJvdGggaW50ZXJmYWNlcy4KLQotCSAgRm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudAotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotCSAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCSAgICAgIDxtZXRob2QtcGFyYW1zPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCSAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLQkgIDwvbWV0aG9kPgotCi0JICBjYW4gYmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpCi0JICBtZXRob2QgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSBmcm9tIHRoZQotCSAgY3JlYXRlKFN0cmluZywgU3RyaW5nKSBtZXRob2QgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGhvbWUKLQkgIGludGVyZmFjZSwgd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcwotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLQkgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgYW5kIHRoZSBjcmVhdGUgbWV0aG9kIHRoYXQgaXMgZGVmaW5lZCBpbiB0aGUgbG9jYWwgaG9tZQotCSAgaW50ZXJmYWNlIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLQkgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2l0aCBhbGwgdGhyZWUgU3R5bGVzCi0JICBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgdXNhZ2UuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nCi0JICBtZXRob2QgZWxlbWVudCBleGFtcGxlIGNvdWxkIGJlIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZQotCSAgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyByZW1vdGUgaG9tZSBpbnRlcmZhY2UKLSAgICAgICAgICBhbmQgdGhlIHJlbW90ZSBidXNpbmVzcyBpbnRlcmZhY2UuCi0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotCSAgICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLQkgIDwvbWV0aG9kPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1pbnRmIgotCQkgICB0eXBlPSJqYXZhZWU6bWV0aG9kLWludGZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOm1ldGhvZC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbXMiCi0JCSAgIHR5cGU9ImphdmFlZTptZXRob2QtcGFyYW1zVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibXVsdGlwbGljaXR5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG11bHRpcGxpY2l0eVR5cGUgZGVzY3JpYmVzIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlCi0Jcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIE9uZQotCSAgICBNYW55Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnkiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1tZXRob2RUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLQkJICAgdHlwZT0iamF2YWVlOm1ldGhvZC1wYXJhbXNUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHBlcnNpc3RlbmNlLXR5cGVUeXBlIHNwZWNpZmllcyBhbiBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlCi0JbWFuYWdlbWVudCB0eXBlLgotCi0JVGhlIHBlcnNpc3RlbmNlLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBCZWFuCi0JICAgIENvbnRhaW5lcgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFuIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciBhIGZpbmRlciBvciBzZWxlY3QKLQkgIHF1ZXJ5LgotCi0JICBUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci0JICBtZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLQkgIEVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi0JICBtZXRob2QtcGFyYW1zIGVsZW1lbnQuCi0KLQkgIEl0IGlzIHVzZWQgYnkgdGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50LgotCi0JICBFeGFtcGxlOgotCi0JICA8cXVlcnk+Ci0JICAgICAgPGRlc2NyaXB0aW9uPk1ldGhvZCBmaW5kcyBsYXJnZSBvcmRlcnM8L2Rlc2NyaXB0aW9uPgotCSAgICAgIDxxdWVyeS1tZXRob2Q+Ci0JCSAgPG1ldGhvZC1uYW1lPmZpbmRMYXJnZU9yZGVyczwvbWV0aG9kLW5hbWU+Ci0JCSAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotCSAgICAgIDwvcXVlcnktbWV0aG9kPgotCSAgICAgIDxlamItcWw+Ci0JCVNFTEVDVCBPQkpFQ1QobykgRlJPTSBPcmRlciBvCi0JCSAgV0hFUkUgby5hbW91bnQgJmd0OyAxMDAwCi0JICAgICAgPC9lamItcWw+Ci0JICA8L3F1ZXJ5PgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTptZXRob2QtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW1zIgotCQkgICB0eXBlPSJqYXZhZWU6bWV0aG9kLXBhcmFtc1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBxdWVyeVR5cGUgZGVmaW5lcyBhIGZpbmRlciBvciBzZWxlY3QKLQlxdWVyeS4gSXQgY29udGFpbnMKLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcXVlcnkKLQkgICAgLSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmluZGVyIG9yIHNlbGVjdAotCSAgICAgIG1ldGhvZCBpdCBpcyB1c2VkIGJ5Ci0JCS0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmVzdWx0IHR5cGUKLQkJICBtYXBwaW5nLCBpZiB0aGUgcXVlcnkgaXMgZm9yIGEgc2VsZWN0IG1ldGhvZAotCQkgIGFuZCBlbnRpdHkgb2JqZWN0cyBhcmUgcmV0dXJuZWQuCi0JCS0gdGhlIEVKQiBRTCBxdWVyeSBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBxdWVyeS4KLQotCVF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwKLQllbGVtZW50IHRvIHNwZWNpZnkgdGhlIHF1ZXJ5LiBJZiBhIHF1ZXJ5IGlzIG5vdCBleHByZXNzaWJsZQotCWluIEVKQiBRTCwgdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgdG8KLQlkZXNjcmliZSB0aGUgc2VtYW50aWNzIG9mIHRoZSBxdWVyeSBhbmQgdGhlIGVqYi1xbCBlbGVtZW50Ci0Jc2hvdWxkIGJlIGVtcHR5LgotCi0JVGhlIHJlc3VsdC10eXBlLW1hcHBpbmcgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gSXQgY2FuIG9ubHkKLQliZSBwcmVzZW50IGlmIHRoZSBxdWVyeS1tZXRob2Qgc3BlY2lmaWVzIGEgc2VsZWN0IG1ldGhvZAotCXRoYXQgcmV0dXJucyBlbnRpdHkgb2JqZWN0cy4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUKLQlyZXN1bHQtdHlwZS1tYXBwaW5nIGVsZW1lbnQgaXMgIkxvY2FsIi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktbWV0aG9kIgotCQkgICB0eXBlPSJqYXZhZWU6cXVlcnktbWV0aG9kVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc3VsdC10eXBlLW1hcHBpbmciCi0JCSAgIHR5cGU9ImphdmFlZTpyZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXFsIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIGRlc2lnbmF0ZXMgdGhlIHNvdXJjZSBvZiBhCi0Jcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gQQotCXJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgaXMgdXNlZCBieQotCXJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50cyB0byB1bmlxdWVseSBpZGVudGlmeSBhbgotCWVudGl0eSBiZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTplamItbmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXBzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJlbGF0aW9uc2hpcHNUeXBlIGRlc2NyaWJlcyB0aGUgcmVsYXRpb25zaGlwcyBpbgotCXdoaWNoIGVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlCi0JcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzVHlwZSBjb250YWlucyBhbiBvcHRpb25hbAotCWRlc2NyaXB0aW9uOyBhbmQgYSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2gKLQlzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLXJlbGF0aW9uVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0icm9sZS1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICAgIHJlbGF0aW9uc2hpcCByb2xlLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgICAgICBhIHJlbGF0aW9uc2hpcCwgYnV0IGNhbiBiZSByZXVzZWQgaW4gZGlmZmVyZW50Ci0JICAgICAgcmVsYXRpb25zaGlwcy4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IKLQkgICAgICAgeHBhdGg9Ii4vL2phdmFlZTplamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSIvPgotCSAgPHhzZDpmaWVsZAotCSAgICAgICB4cGF0aD0iLiIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVtb3ZlLW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmVhbi1tZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmV0YWluLWlmLWV4Y2VwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIGlzIHVzZWQgaW4gdGhlIHF1ZXJ5IGVsZW1lbnQgdG8KLQlzcGVjaWZ5IHdoZXRoZXIgYW4gYWJzdHJhY3Qgc2NoZW1hIHR5cGUgcmV0dXJuZWQgYnkgYSBxdWVyeQotCWZvciBhIHNlbGVjdCBtZXRob2QgaXMgdG8gYmUgbWFwcGVkIHRvIGFuIEVKQkxvY2FsT2JqZWN0IG9yCi0JRUpCT2JqZWN0IHR5cGUuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCSAgICBMb2NhbAotCSAgICBSZW1vdGUKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWwiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdGUiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1pZGVudGl0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZWN1cml0eS1pZGVudGl0eVR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhbGxlcidzCi0Jc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLQltZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcwotCWlkZW50aXR5IGlzIHRvIGJlIHVzZWQuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9InVzZS1jYWxsZXItaWRlbnRpdHkiCi0JCSAgICAgdHlwZT0iamF2YWVlOmVtcHR5VHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSB1c2UtY2FsbGVyLWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQKLQkgICAgICB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgYmUgdXNlZCBhcyB0aGUKLQkgICAgICBzZWN1cml0eSBpZGVudGl0eSBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLQkgICAgICBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2RzLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9InJ1bi1hcyIKLQkJICAgICB0eXBlPSJqYXZhZWU6cnVuLWFzVHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXNzaW9uLWJlYW5UeXBlIGRlY2xhcmVzIGFuIHNlc3Npb24gYmVhbi4gVGhlCi0JZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLQkgICAgICBpY29uIGZpbGUgbmFtZQotCSAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JICAgICAgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRpb24KLSAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbWFwcGVkLW5hbWUgZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICAgICAgICAgdmVuZG9yLXNwZWNpZmljIGRlcGxveW1lbnQgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgcGh5c2ljYWwKLSAgICAgICAgICAgICAgam5kaS1uYW1lIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgaG9tZS9idXNpbmVzcyBpbnRlcmZhY2UuCi0gICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IGFsbAotICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMuIEFueSB1c2Ugb2YgdGhpcyBlbGVtZW50IGlzIG5vbi1wb3J0YWJsZS4KLSAgICAgICAgICAgIC0gdGhlIG5hbWVzIG9mIGFsbCB0aGUgcmVtb3RlIG9yIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZXMsCi0gICAgICAgICAgICAgIGlmIGFueQotCSAgICAtIHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIGhvbWUgYW5kCi0JICAgICAgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotCSAgICAtIHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQKLQkgICAgICBsb2NhbCBpbnRlcmZhY2VzLCBpZiBhbnkKLQkgICAgLSB0aGUgbmFtZSBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3Mgd2ViIHNlcnZpY2UgZW5kcG9pbnQKLQkgICAgICBpbnRlcmZhY2UsIGlmIGFueQotCSAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotCSAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyBzdGF0ZSBtYW5hZ2VtZW50IHR5cGUKLSAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlc3Npb24gYmVhbidzIHRpbWVvdXQgbWV0aG9kLgotCSAgICAtIHRoZSBvcHRpb25hbCBzZXNzaW9uIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUuCi0gICAgICAgICAgICAgIElmIGl0IGlzIG5vdCBwcmVzZW50LCBpdCBpcyBkZWZhdWx0ZWQgdG8gQ29udGFpbmVyLgotICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgYW5kL29yCi0gICAgICAgICAgICAgIHN1cGVyY2xhc3MgYXJvdW5kLWludm9rZSBtZXRob2RzLgotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICBlbnZpcm9ubWVudCBlbnRyaWVzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwKLQkgICAgICBFSkIgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViCi0JICAgICAgc2VydmljZSByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5Ci0JICAgICAgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzIG1ldGhvZHMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlCi0JICAgICAgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UKLQkgICAgICBlbnZpcm9ubWVudCByZWZlcmVuY2VzLgotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotCSAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLQotCVRoZSBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UKLQl0aGF0IHRoZXkgYXJlIG9taXR0ZWQgd2hlbiBpZiBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZQotCWVtcHR5LgotCi0JRWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoCi0JdGhlIGhvbWUgYW5kIHRoZSByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIHRoZQotCXNlc3Npb24gYmVhbi4KLQotCVRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGlmIHRoZQotCWJlYW4gaXMgYSBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpob21lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlIgotCQkgICB0eXBlPSJqYXZhZWU6cmVtb3RlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLQkJICAgdHlwZT0iamF2YWVlOmxvY2FsLWhvbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKLQkJICAgdHlwZT0iamF2YWVlOmxvY2FsVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYnVzaW5lc3MtbG9jYWwiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJidXNpbmVzcy1yZW1vdGUiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50IgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBjb250YWlucyB0aGUKLQkgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHdlYgotCSAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIHNlcnZpY2UtZW5kcG9pbnQKLQkgICAgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgZm9yIGEgc3RhdGVsZXNzCi0JICAgIHNlc3Npb24gYmVhbi4gVGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgbXVzdCBiZSBhCi0JICAgIHZhbGlkIEpBWC1SUEMgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgVGhlIGVqYi1jbGFzcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUKLSAgICAgICAgICAgICBvZiB0aGUgYmVhbiBjbGFzcyBmb3IgdGhpcyBlamIuICBJdCBpcyByZXF1aXJlZCB1bmxlc3MKLSAgICAgICAgICAgICB0aGVyZSBpcyBhIGNvbXBvbmVudC1kZWZpbmluZyBhbm5vdGF0aW9uIGZvciB0aGUgc2FtZQotICAgICAgICAgICAgIGVqYi1uYW1lLgotCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6c2Vzc2lvbi10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aW1lb3V0LW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bmFtZWQtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aW5pdC1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgaW5pdC1tZXRob2QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1hcHBpbmdzIGZvcgotCSAgICBFSkIgMi54IHN0eWxlIGNyZWF0ZSBtZXRob2RzIGZvciBhbiBFSkIgMy4wIGJlYW4uCi0JICAgIFRoaXMgZWxlbWVudCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIHN0YXRlZnVsCi0gICAgICAgICAgICBzZXNzaW9uIGJlYW5zLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW92ZS1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJlbW92ZS1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVtb3ZlLW1ldGhvZCBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWFwcGluZ3MgZm9yCi0JICAgIEVKQiAyLnggc3R5bGUgcmVtb3ZlIG1ldGhvZHMgZm9yIGFuIEVKQiAzLjAgYmVhbi4KLQkgICAgVGhpcyBlbGVtZW50IGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3Igc3RhdGVmdWwKLSAgICAgICAgICAgIHNlc3Npb24gYmVhbnMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNhY3Rpb24tdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOnRyYW5zYWN0aW9uLXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFyb3VuZC1pbnZva2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFyb3VuZC1pbnZva2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWFjdGl2YXRlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsaWZlY3ljbGUtY2FsbGJhY2tUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wYXNzaXZhdGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLQkJICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LWlkZW50aXR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlc3Npb24tdHlwZVR5cGUgZGVzY3JpYmVzIHdoZXRoZXIgdGhlIHNlc3Npb24gYmVhbiBpcyBhCi0Jc3RhdGVmdWwgc2Vzc2lvbiBvciBzdGF0ZWxlc3Mgc2Vzc2lvbi4gSXQgaXMgdXNlZCBieQotCXNlc3Npb24tdHlwZSBlbGVtZW50cy4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBTdGF0ZWZ1bAotCSAgICBTdGF0ZWxlc3MKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVmdWwiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZWxlc3MiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFucy1hdHRyaWJ1dGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdHJhbnMtYXR0cmlidXRlVHlwZSBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdAotCW1hbmFnZSB0aGUgdHJhbnNhY3Rpb24gYm91bmRhcmllcyB3aGVuIGRlbGVnYXRpbmcgYSBtZXRob2QKLQlpbnZvY2F0aW9uIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzIG1ldGhvZC4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JICAgIE5vdFN1cHBvcnRlZAotCSAgICBTdXBwb3J0cwotCSAgICBSZXF1aXJlZAotCSAgICBSZXF1aXJlc05ldwotCSAgICBNYW5kYXRvcnkKLQkgICAgTmV2ZXIKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3VwcG9ydGVkIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcG9ydHMiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlZCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVzTmV3Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuZGF0b3J5Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV2ZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRyYW5zYWN0aW9uLXR5cGVUeXBlIHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncwotCXRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLQotCVRoZSB0cmFuc2FjdGlvbi10eXBlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIEJlYW4KLQkgICAgQ29udGFpbmVyCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW4iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8zXzEueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzNfMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDk3NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzNfMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICAgdmVyc2lvbj0iMy4xIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLSAgICAgIAotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgICAKLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbgotICAgICAgRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlCi0gICAgICAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgICB0aGUgTGljZW5zZS4gWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwgb3IKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLSAgICAgIExpY2Vuc2UuCi0gICAgICAKLSAgICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyCi0gICAgICBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gICAgICBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzCi0gICAgICBwcm92aWRlZCBieSBTdW4gaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZSBmaWxlCi0gICAgICB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4gIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nCi0gICAgICBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBbXQotICAgICAgcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgICAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0gICAgICAKLSAgICAgIENvbnRyaWJ1dG9yKHMpOgotICAgICAgCi0gICAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlCi0gICAgICBDRERMIG9yIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nCi0gICAgICAiW0NvbnRyaWJ1dG9yXSBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UKLSAgICAgIGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhIHJlY2lwaWVudCBoYXMgdGhlCi0gICAgICBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUKLSAgICAgIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8gaXRzCi0gICAgICBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIKLSAgICAgIGNvZGUgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZQotICAgICAgb3B0aW9uIGFwcGxpZXMgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2gKLSAgICAgIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0IGhvbGRlci4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBW1sKLSAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBFSkIgMy4xIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAgICAgIAotICAgICAgQWxsIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUKLSAgICAgIHRoZSBzY2hlbWEgYnkgdXNpbmcgdGhlIEphdmEgRUUgbmFtZXNwYWNlOgotICAgICAgCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLSAgICAgIAotICAgICAgYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotICAgICAgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLSAgICAgIAotICAgICAgPGVqYi1qYXIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotICAgICAgCSAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18xLnhzZCIKLSAgICAgIHZlcnNpb249IjMuMSI+Ci0gICAgICAuLi4KLSAgICAgIDwvZWpiLWphcj4KLSAgICAgIAotICAgICAgVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0gICAgICB0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciB0aGUKLSAgICAgIEphdmEgRUUgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLSAgICAgIAotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18xLnhzZAotICAgICAgCi0gICAgICBdXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAgICAgIAotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICAgICAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICAgICAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAgICAgIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gICAgICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgICAgIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV82LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWphciIKLSAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItamFyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgaXMgdGhlIHJvb3Qgb2YgdGhlIGVqYi1qYXIgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmtleSBuYW1lPSJlamItbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgZWpiLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBlbnRlcnByaXNlCi0gICAgICAgICAgYmVhbi4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIG9yCi0gICAgICAgICAgLndhciBmaWxlLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnRlcnByaXNlLWJlYW5zLyoiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleT4KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJlamItbmFtZS1yZWZlcmVuY2VzIgotICAgICAgICAgICAgICAgIHJlZmVyPSJqYXZhZWU6ZWpiLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGtleXJlZiBpbmRpY2F0ZXMgdGhlIHJlZmVyZW5jZXMgZnJvbQotICAgICAgICAgIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBtdXN0IGJlIHRvIGEgc3BlY2lmaWMgZWpiLW5hbWUKLSAgICAgICAgICBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgZW50ZXJwcmlzZS1iZWFucyBlbGVtZW50LiAKLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSIuLy9qYXZhZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlL2phdmFlZTpyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleXJlZj4KLSAgICA8eHNkOmtleSBuYW1lPSJyb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgQSByb2xlLW5hbWUta2V5IGlzIHNwZWNpZmllZCB0byBhbGxvdyB0aGUgcmVmZXJlbmNlcwotICAgICAgICAgIGZyb20gdGhlIHNlY3VyaXR5LXJvbGUtcmVmcy4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6YXNzZW1ibHktZGVzY3JpcHRvci9qYXZhZWU6c2VjdXJpdHktcm9sZSIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJvbGUtbmFtZSIvPgotICAgIDwveHNkOmtleT4KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJyb2xlLW5hbWUtcmVmZXJlbmNlcyIKLSAgICAgICAgICAgICAgICByZWZlcj0iamF2YWVlOnJvbGUtbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0gICAgICAgICAgc2VjdXJpdHktcm9sZS1yZWYgdG8gYSBzcGVjaWZpZWQgcm9sZS1uYW1lLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnRlcnByaXNlLWJlYW5zLyovamF2YWVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotICA8L3hzZDplbGVtZW50PgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjY2Vzcy10aW1lb3V0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhY2Nlc3MtdGltZW91dFR5cGUgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBhbW91bnQgb2YKLSAgICAgICAgdGltZSAoaW4gYSBnaXZlbiB0aW1lIHVuaXQpIHRoYXQgdGhlIGNvbnRhaW5lciBzaG91bGQgd2FpdCBmb3IKLSAgICAgICAgYSBjb25jdXJyZW5jeSBsb2NrIGJlZm9yZSB0aHJvd2luZyBhIHRpbWVvdXQgZXhjZXB0aW9uIHRvIHRoZQotICAgICAgICBjbGllbnQuCi0gICAgICAgIAotICAgICAgICBBIHRpbWVvdXQgdmFsdWUgb2YgMCBtZWFucyBjb25jdXJyZW50IGFjY2VzcyBpcyBub3QgcGVybWl0dGVkLgotICAgICAgICAKLSAgICAgICAgQSB0aW1lb3V0IHZhbHVlIG9mIC0xIG1lYW5zIHdhaXQgaW5kZWZpbml0ZWx5IHRvIGFjcXVpcmUgYSBsb2NrLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRpbWVvdXQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZEludGVnZXJUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pdCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dGltZS11bml0LXR5cGVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzeW5jLW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYXN5bmMtbWV0aG9kVHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IGEgc2Vzc2lvbgotICAgICAgICBiZWFuIG1ldGhvZCBoYXMgYXN5bmNocm9ub3VzIGludm9jYXRpb24gc2VtYW50aWNzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW1zIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXRob2QtcGFyYW1zVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnVHlwZSBkZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgICAgICBleHBlY3RlZCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLSAgICAgICAgaW4gaXRzIG9wZXJhdGlvbmFsIGVudmlyb25tZW50LiBUaGlzIG1heSBpbmNsdWRlIGluZm9ybWF0aW9uCi0gICAgICAgIGFib3V0IG1lc3NhZ2UgYWNrbm93bGVkZ2VtZW50LCBtZXNzYWdlIHNlbGVjdG9yLCBleHBlY3RlZAotICAgICAgICBkZXN0aW5hdGlvbiB0eXBlLCBldGMuCi0gICAgICAgIAotICAgICAgICBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YKLSAgICAgICAgbmFtZS92YWx1ZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCi0gICAgICAgIAotICAgICAgICBUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLSAgICAgICAgbWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YWN0aXZhdGlvbi1jb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBuYW1lL3ZhbHVlCi0gICAgICAgIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgcGFpciBmb3IgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotICAgICAgICAKLSAgICAgICAgVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi0gICAgICAgIG1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSBlbGVtZW50IGNvbnRhaW5zCi0gICAgICAgICAgICB0aGUgbmFtZSBmb3IgYW4gYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnR5IG9mCi0gICAgICAgICAgICBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEZvciBKTVMgbWVzc2FnZS1kcml2ZW4gYmVhbnMsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkKLSAgICAgICAgICAgIG5hbWVzIGFyZSByZWNvZ25pemVkOiBhY2tub3dsZWRnZU1vZGUsCi0gICAgICAgICAgICBtZXNzYWdlU2VsZWN0b3IsIGRlc3RpbmF0aW9uVHlwZSwgc3Vic2NyaXB0aW9uRHVyYWJpbGl0eQotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUgZWxlbWVudAotICAgICAgICAgICAgY29udGFpbnMgdGhlIHZhbHVlIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIHByb3BlcnR5IG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcm91bmQtaW52b2tlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhcm91bmQtaW52b2tlIHR5cGUgc3BlY2lmaWVzIGEgbWV0aG9kIG9uIGEKLSAgICAgICAgY2xhc3MgdG8gYmUgY2FsbGVkIGR1cmluZyB0aGUgYXJvdW5kIGludm9rZSBwb3J0aW9uIG9mIGFuIAotICAgICAgICBlamIgaW52b2NhdGlvbi4gIE5vdGUgdGhhdCBlYWNoIGNsYXNzIG1heSBoYXZlIG9ubHkgb25lCi0gICAgICAgIGFyb3VuZCBpbnZva2UgbWV0aG9kIGFuZCB0aGF0IHRoZSBtZXRob2QgbWF5IG5vdCBiZQotICAgICAgICBvdmVybG9hZGVkLgotICAgICAgICAKLSAgICAgICAgSWYgdGhlIGNsYXNzIGVsZW1lbnQgaXMgbWlzc2luZyB0aGVuCi0gICAgICAgIHRoZSBjbGFzcyBkZWZpbmluZyB0aGUgY2FsbGJhY2sgaXMgYXNzdW1lZCB0byBiZSB0aGUKLSAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3Mgb3IgY29tcG9uZW50IGNsYXNzIGluIHNjb3BlIGF0IHRoZQotICAgICAgICBsb2NhdGlvbiBpbiB0aGUgZGVzY3JpcHRvciBpbiB3aGljaCB0aGUgYXJvdW5kIGludm9rZQotICAgICAgICBkZWZpbml0aW9uIGFwcGVhcnMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXJvdW5kLXRpbWVvdXRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFyb3VuZC10aW1lb3V0IHR5cGUgc3BlY2lmaWVzIGEgbWV0aG9kIG9uIGEKLSAgICAgICAgY2xhc3MgdG8gYmUgY2FsbGVkIGR1cmluZyB0aGUgYXJvdW5kLXRpbWVvdXQgcG9ydGlvbiBvZgotICAgICAgICBhIHRpbWVyIHRpbWVvdXQgY2FsbGJhY2suICBOb3RlIHRoYXQgZWFjaCBjbGFzcyBtYXkgaGF2ZSAKLSAgICAgICAgb25seSBvbmUgYXJvdW5kLXRpbWVvdXQgbWV0aG9kIGFuZCB0aGF0IHRoZSBtZXRob2QgbWF5IG5vdCAKLSAgICAgICAgYmUgb3ZlcmxvYWRlZC4KLSAgICAgICAgCi0gICAgICAgIElmIHRoZSBjbGFzcyBlbGVtZW50IGlzIG1pc3NpbmcgdGhlbgotICAgICAgICB0aGUgY2xhc3MgZGVmaW5pbmcgdGhlIGNhbGxiYWNrIGlzIGFzc3VtZWQgdG8gYmUgdGhlCi0gICAgICAgIGludGVyY2VwdG9yIGNsYXNzIG9yIGNvbXBvbmVudCBjbGFzcyBpbiBzY29wZSBhdCB0aGUKLSAgICAgICAgbG9jYXRpb24gaW4gdGhlIGRlc2NyaXB0b3IgaW4gd2hpY2ggdGhlIGFyb3VuZC10aW1lb3V0Ci0gICAgICAgIGRlZmluaXRpb24gYXBwZWFycy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NlbWJseS1kZXNjcmlwdG9yVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhc3NlbWJseS1kZXNjcmlwdG9yVHlwZSBkZWZpbmVzCi0gICAgICAgIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uLgotICAgICAgICAKLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZQotICAgICAgICBmb2xsb3dpbmcgcGFydHM6IHRoZSBkZWZpbml0aW9uIG9mIHNlY3VyaXR5IHJvbGVzLCB0aGUKLSAgICAgICAgZGVmaW5pdGlvbiBvZiBtZXRob2QgcGVybWlzc2lvbnMsIHRoZSBkZWZpbml0aW9uIG9mCi0gICAgICAgIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aAotICAgICAgICBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiwgdGhlIGRlZmluaXRpb24KLSAgICAgICAgb2YgaW50ZXJjZXB0b3IgYmluZGluZ3MsIGEgbGlzdCBvZgotICAgICAgICBtZXRob2RzIHRvIGJlIGV4Y2x1ZGVkIGZyb20gYmVpbmcgaW52b2tlZCwgYW5kIGEgbGlzdCBvZgotICAgICAgICBleGNlcHRpb24gdHlwZXMgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhcHBsaWNhdGlvbiBleGNlcHRpb25zLgotICAgICAgICAKLSAgICAgICAgQWxsIHRoZSBwYXJ0cyBhcmUgb3B0aW9uYWwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUKLSAgICAgICAgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0gICAgICAgIAotICAgICAgICBQcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudAotICAgICAgICBkZXNjcmlwdG9yIGlzIG9wdGlvbmFsIGZvciB0aGUgZWpiLWphciBvciAud2FyIGZpbGUgcHJvZHVjZXIuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktcm9sZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBlcm1pc3Npb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1ldGhvZC1wZXJtaXNzaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItdHJhbnNhY3Rpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3ItYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aW50ZXJjZXB0b3ItYmluZGluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1saXN0IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpleGNsdWRlLWxpc3RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uLWV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXBwbGljYXRpb24tZXhjZXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21wLWZpZWxkVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjbXAtZmllbGRUeXBlIGRlc2NyaWJlcyBhIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkLiBUaGUKLSAgICAgICAgY21wLWZpZWxkVHlwZSBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsCi0gICAgICAgIGFuZCB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgICAgICAgICAgY29udGFpbmVyIG1hbmFnZWQgZmllbGQuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjbXAtZmllbGQgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotICAgICAgICAgICAgY21wLXZlcnNpb24gMi54IG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZQotICAgICAgICAgICAgbGV0dGVyLiBUaGlzIGZpZWxkIGlzIGFjY2Vzc2VkIGJ5IG1ldGhvZHMgd2hvc2UKLSAgICAgICAgICAgIG5hbWVzIGNvbnNpc3RzIG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkKLSAgICAgICAgICAgIGZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0IGxldHRlciBpcyB1cHBlcmNhc2VkLAotICAgICAgICAgICAgcHJlZml4ZWQgYnkgImdldCIgb3IgInNldCIuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjbXAtZmllbGQgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotICAgICAgICAgICAgY21wLXZlcnNpb24gMS54IG11c3QgZGVub3RlIGEgcHVibGljIGZpZWxkIG9mIHRoZQotICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG9yIG9uZSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtcC12ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjbXAtdmVyc2lvblR5cGUgc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIGFuIGVudGl0eSBiZWFuCi0gICAgICAgIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuIEl0IGlzIHVzZWQgYnkKLSAgICAgICAgY21wLXZlcnNpb24gZWxlbWVudHMuCi0gICAgICAgIAotICAgICAgICBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0gICAgICAgIAotICAgICAgICAxLngKLSAgICAgICAgMi54Ci0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEueCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyLngiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtci1maWVsZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgY21yLWZpZWxkVHlwZSBkZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mCi0gICAgICAgIGEgcmVsYXRpb25zaGlwLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kCi0gICAgICAgIHRoZSBuYW1lIGFuZCB0aGUgY2xhc3MgdHlwZSBvZiBhIGZpZWxkIGluIHRoZSBzb3VyY2Ugb2YgYQotICAgICAgICByb2xlIG9mIGEgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudAotICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbmFtZSB1c2VkIGZvciB0aGUgZ2V0IGFuZCBzZXQgYWNjZXNzb3IKLSAgICAgICAgbWV0aG9kcyBmb3IgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIGNtci1maWVsZC10eXBlIGVsZW1lbnQgaXMKLSAgICAgICAgdXNlZCBvbmx5IGZvciBjb2xsZWN0aW9uLXZhbHVlZCBjbXItZmllbGRzLiBJdCBzcGVjaWZpZXMgdGhlCi0gICAgICAgIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBpcyB1c2VkLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBjbXItZmllbGQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0gICAgICAgICAgICBsb2dpY2FsIHJlbGF0aW9uc2hpcCBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4KLSAgICAgICAgICAgIGNsYXNzLiBUaGUgbmFtZSBvZiB0aGUgY21yLWZpZWxkIG11c3QgYmVnaW4gd2l0aCBhCi0gICAgICAgICAgICBsb3dlcmNhc2UgbGV0dGVyLiBUaGlzIGZpZWxkIGlzIGFjY2Vzc2VkIGJ5IG1ldGhvZHMKLSAgICAgICAgICAgIHdob3NlIG5hbWVzIGNvbnNpc3Qgb2YgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCi0gICAgICAgICAgICBzcGVjaWZpZWQgYnkgY21yLWZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0Ci0gICAgICAgICAgICBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwgcHJlZml4ZWQgYnkgImdldCIgb3IgInNldCIuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXItZmllbGQtdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y21yLWZpZWxkLXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXItZmllbGQtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNsYXNzIG9mIGEKLSAgICAgICAgY29sbGVjdGlvbi12YWx1ZWQgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eQotICAgICAgICBiZWFuIGNsYXNzLiBUaGUgdmFsdWUgb2YgYW4gZWxlbWVudCB1c2luZyBjbXItZmllbGQtdHlwZVR5cGUKLSAgICAgICAgbXVzdCBiZSBlaXRoZXI6IGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGphdmEudXRpbC5TZXQuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5TZXQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbmN1cnJlbmN5LW1hbmFnZW1lbnQtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgY29uY3VycmVuY3ktbWFuYWdlbWVudC10eXBlVHlwZSBzcGVjaWZpZXMgdGhlIHdheSBjb25jdXJyZW5jeQotICAgICAgICBpcyBtYW5hZ2VkIGZvciBhIHNpbmdsZXRvbiBvciBzdGF0ZWZ1bCBzZXNzaW9uIGJlYW4uICAKLSAgICAgICAgCi0gICAgICAgIFRoZSBjb25jdXJyZW5jeSBtYW5hZ2VtZW50IHR5cGUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgCi0gICAgICAgIEJlYW4KLSAgICAgICAgQ29udGFpbmVyCi0gICAgICAgIAotICAgICAgICBCZWFuIG1hbmFnZWQgY29uY3VycmVuY3kgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhIHNpbmdsZXRvbiBiZWFuLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFuIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uY3VycmVudC1sb2NrLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNvbmN1cnJlbnQtbG9jay10eXBlVHlwZSBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdAotICAgICAgICBtYW5hZ2UgY29uY3VycmVudCBhY2Nlc3MgdG8gYSBtZXRob2Qgb2YgYSBTaW5nbGV0b24gYmVhbiAKLSAgICAgICAgd2l0aCBjb250YWluZXItbWFuYWdlZCBjb25jdXJyZW5jeS4KLSAgICAgICAgCi0gICAgICAgIFRoZSBjb250YWluZXIgbWFuYWdlZCBjb25jdXJyZW5jeSBsb2NrIHR5cGUgbXVzdCBiZSBvbmUgCi0gICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgOgotICAgICAgICAKLSAgICAgICAgUmVhZAotICAgICAgICBXcml0ZQotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFkIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldyaXRlIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25jdXJyZW50LW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgY29uY3VycmVudC1tZXRob2RUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhIG1ldGhvZAotICAgICAgICBvZiBhIGJlYW4gd2l0aCBjb250YWluZXIgbWFuYWdlZCBjb25jdXJyZW5jeS4KLSAgICAgICAgCi0gICAgICAgIFRoZSBvcHRpb25hbCBsb2NrIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBraW5kIG9mIGNvbmN1cnJlbmN5IAotICAgICAgICBsb2NrIGFzc3NvY2lhdGVkIHdpdGggdGhlIG1ldGhvZC4KLSAgICAgICAgCi0gICAgICAgIFRoZSBvcHRpb25hbCBhY2Nlc3MtdGltZW91dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYW1vdW50IG9mCi0gICAgICAgIHRpbWUgKGluIGEgZ2l2ZW4gdGltZSB1bml0KSB0aGUgY29udGFpbmVyIHNob3VsZCB3YWl0IGZvciBhCi0gICAgICAgIGNvbmN1cnJlbmN5IGxvY2sgYmVmb3JlIHRocm93aW5nIGFuIGV4Y2VwdGlvbiB0byB0aGUgY2xpZW50LgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bmFtZWQtbWV0aG9kVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2siCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNvbmN1cnJlbnQtbG9jay10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtdGltZW91dCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YWNjZXNzLXRpbWVvdXRUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyCi0gICAgICAgIG11c3QgbWFuYWdlIHRyYW5zYWN0aW9uIHNjb3BlcyBmb3IgdGhlIGVudGVycHJpc2UgYmVhbidzCi0gICAgICAgIG1ldGhvZCBpbnZvY2F0aW9ucy4gSXQgZGVmaW5lcyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYQotICAgICAgICBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLiBUaGUKLSAgICAgICAgdHJhbnNhY3Rpb24gYXR0cmlidXRlIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQKLSAgICAgICAgbWV0aG9kcy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zLWF0dHJpYnV0ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJhbnMtYXR0cmlidXRlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZXBlbmRzLW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBkZXBlbmRzLW9uVHlwZSBpcyB1c2VkIHRvIGV4cHJlc3MgaW5pdGlhbGl6YXRpb24gCi0gICAgICAgIG9yZGVyaW5nIGRlcGVuZGVuY2llcyBiZXR3ZWVuIFNpbmdsZXRvbiBjb21wb25lbnRzLgotICAgICAgICBUaGUgZGVwZW5kcy1vblR5cGUgc3BlY2lmaWVzIHRoZSBuYW1lcyBvZiBvbmUgb3IgbW9yZQotICAgICAgICBTaW5nbGV0b24gYmVhbnMgaW4gdGhlIHNhbWUgYXBwbGljYXRpb24gYXMgdGhlIHJlZmVycmluZwotICAgICAgICBTaW5nbGV0b24sIGVhY2ggb2Ygd2hpY2ggbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgdGhlIHJlZmVycmluZyBiZWFuLiAgCi0gICAgICAgIAotICAgICAgICBFYWNoIGRlcGVuZGVudCBiZWFuIGlzIGV4cHJlc3NlZCB1c2luZyBlamItbGluayBzeW50YXguCi0gICAgICAgIFRoZSBvcmRlciBpbiB3aGljaCBkZXBlbmRlbnQgYmVhbnMgYXJlIGluaXRpYWxpemVkIGF0IAotICAgICAgICBydW50aW1lIGlzIG5vdCBndWFyYW50ZWVkIHRvIG1hdGNoIHRoZSBvcmRlciBpbiB3aGljaAotICAgICAgICB0aGV5IGFyZSBsaXN0ZWQuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1saW5rVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWNsYXNzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgIFRoZSBlamItY2xhc3NUeXBlIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUKLSAgICAgICAgZW50ZXJwcmlzZSBiZWFuJ3MgY2xhc3MuIEl0IGlzIHVzZWQgYnkgZWpiLWNsYXNzIGVsZW1lbnRzLiAKLSAgICAgICAgCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgIAotICAgICAgICA8ZWpiLWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2VCZWFuPC9lamItY2xhc3M+Ci0gICAgICAgIAotICAgICAgICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWphclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWpiLWphclR5cGUgZGVmaW5lcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBFSkIKLSAgICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJdCBjb250YWlucwotICAgICAgICAKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZWpiLWphciBmaWxlCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgaWNvbiB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLSAgICAgICAgaWNvbiBmaWxlIG5hbWUKLSAgICAgICAgLSBhbiBvcHRpb25hbCBtb2R1bGUgbmFtZS4gT25seSBhcHBsaWNhYmxlIHRvCi0gICAgICAgIHN0YW5kLWFsb25lIGVqYi1qYXJzIG9yIGVqYi1qYXJzIHBhY2thZ2VkIGluIGFuIGVhci4KLSAgICAgICAgSWdub3JlZCBpZiBzcGVjaWZpZWQgZm9yIGFuIGVqYi1qYXIueG1sIHdpdGhpbiBhIC53YXIuCi0gICAgICAgIEluIHRoYXQgY2FzZSwgc3RhbmRhcmQgLndhciBtb2R1bGUtbmFtZSBydWxlcyBhcHBseS4KLSAgICAgICAgLSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBpbmNsdWRlZAotICAgICAgICBlbnRlcnByaXNlIGJlYW5zIHRoYXQgaXMgbm90IHNwZWNpZmllZCB0aHJvdWdoCi0gICAgICAgIGFubm90YXRpb25zCi0gICAgICAgIC0gc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBpbnRlcmNlcHRvciBjbGFzc2VzCi0gICAgICAgIC0gYSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLCAKLSAgICAgICAgaWYgYW55LiAKLSAgICAgICAgLSBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbi1hc3NlbWJseSBkZXNjcmlwdG9yCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUgCi0gICAgICAgIGVqYi1qYXIuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibW9kdWxlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGVycHJpc2UtYmVhbnMiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVudGVycHJpc2UtYmVhbnNUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludGVyY2VwdG9ycyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aW50ZXJjZXB0b3JzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXBzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZWxhdGlvbnNoaXBzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJyZWxhdGlvbnNoaXAtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIGVqYi1yZWxhdGlvbi1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgICAgICAgcmVsYXRpb24uIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotICAgICAgICAgICAgICByZWxhdGlvbnNoaXBzLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlbGF0aW9uIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVqYi1yZWxhdGlvbi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzZW1ibHktZGVzY3JpcHRvciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXNzZW1ibHktZGVzY3JpcHRvclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLSAgICAgICAgICAgIGRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIG9yIC53YXIgZmlsZQotICAgICAgICAgICAgcHJvZHVjZXIuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItY2xpZW50LWphciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgICAgIFRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUgotICAgICAgICAgICAgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBjbGFzcyBmaWxlcyBuZWNlc3NhcnkgZm9yIGEKLSAgICAgICAgICAgIGNsaWVudCBwcm9ncmFtIHRvIGFjY2VzcyB0aGUKLSAgICAgICAgICAgIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIGVqYi1qYXIgZmlsZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCSAgPGVqYi1jbGllbnQtamFyPmVtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphcgotICAgICAgICAgICAgCSAgPC9lamItY2xpZW50LWphcj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgZml4ZWQ9IjMuMSIKLSAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIHZlcnNpb24gc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZQotICAgICAgICAgIEVKQiBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIGluc3RhbmNlIGRvY3VtZW50IG11c3QgCi0gICAgICAgICAgY29tcGx5IHdpdGguIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3ltZW50IHRvb2xzCi0gICAgICAgICAgdG8gdmFsaWRhdGUgYSBwYXJ0aWN1bGFyIEVKQiBEZXBsb3ltZW50Ci0gICAgICAgICAgRGVzY3JpcHRvciB3aXRoIHJlc3BlY3QgdG8gYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBFSkIKLSAgICAgICAgICBzY2hlbWEuIAotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGRlZmluZXMgd2hldGhlciB0aGlzCi0gICAgICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCBvdGhlciByZWxhdGVkIGRlcGxveW1lbnQKLSAgICAgICAgICBkZXNjcmlwdG9ycyBmb3IgdGhpcyBtb2R1bGUgKGUuZy4sIHdlYiBzZXJ2aWNlCi0gICAgICAgICAgZGVzY3JpcHRvcnMpIGFyZSBjb21wbGV0ZSwgb3Igd2hldGhlciB0aGUgY2xhc3MKLSAgICAgICAgICBmaWxlcyBhdmFpbGFibGUgdG8gdGhpcyBtb2R1bGUgYW5kIHBhY2thZ2VkIHdpdGgKLSAgICAgICAgICB0aGlzIGFwcGxpY2F0aW9uIHNob3VsZCBiZSBleGFtaW5lZCBmb3IgYW5ub3RhdGlvbnMKLSAgICAgICAgICB0aGF0IHNwZWNpZnkgZGVwbG95bWVudCBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBzZXQgdG8gInRydWUiLCB0aGUgZGVwbG95bWVudAotICAgICAgICAgIHRvb2wgbXVzdCBpZ25vcmUgYW55IGFubm90YXRpb25zIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50Ci0gICAgICAgICAgaW5mb3JtYXRpb24sIHdoaWNoIG1pZ2h0IGJlIHByZXNlbnQgaW4gdGhlIGNsYXNzIGZpbGVzCi0gICAgICAgICAgb2YgdGhlIGFwcGxpY2F0aW9uLgotICAgICAgICAgIAotICAgICAgICAgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgc2V0IHRvCi0gICAgICAgICAgImZhbHNlIiwgdGhlIGRlcGxveW1lbnQgdG9vbCBtdXN0IGV4YW1pbmUgdGhlIGNsYXNzCi0gICAgICAgICAgZmlsZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBhbm5vdGF0aW9ucywgYXMKLSAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIHNwZWNpZmljYXRpb25zLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgIFRoZSBlamItbmFtZVR5cGUgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzIG5hbWUuIEl0IGlzCi0gICAgICAgIHVzZWQgYnkgZWpiLW5hbWUgZWxlbWVudHMuIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUKLSAgICAgICAgZmlsZSBwcm9kdWNlciB0byBuYW1lIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4gdGhlCi0gICAgICAgIGVqYi1qYXIgb3IgLndhciBmaWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlCi0gICAgICAgIHVuaXF1ZSBhbW9uZyB0aGUgbmFtZXMgb2YgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIHNhbWUKLSAgICAgICAgZWpiLWphciBvciAud2FyIGZpbGUuCi0gICAgICAgIAotICAgICAgICBUaGVyZSBpcyBubyBhcmNoaXRlY3RlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdXNlZAotICAgICAgICBlamItbmFtZSBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCB0aGUgSk5ESSBuYW1lIHRoYXQKLSAgICAgICAgdGhlIERlcGxveWVyIHdpbGwgYXNzaWduIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBob21lLgotICAgICAgICAKLSAgICAgICAgVGhlIG5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbAotICAgICAgICBydWxlcyBmb3IgYW4gTk1UT0tFTi4KLSAgICAgICAgCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgIAotICAgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnhzZE5NVE9LRU5UeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlbGF0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVsYXRpb25UeXBlIGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3bwotICAgICAgICBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gIEl0IGlzIHVzZWQKLSAgICAgICAgYnkgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLiBJdCBjb250YWlucyBhIGRlc2NyaXB0aW9uOyBhbgotICAgICAgICBvcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OyBhbmQgZXhhY3RseSB0d28KLSAgICAgICAgcmVsYXRpb25zaGlwIHJvbGUgZGVjbGFyYXRpb25zLCBkZWZpbmVkIGJ5IHRoZQotICAgICAgICBlamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudHMuIFRoZSBuYW1lIG9mIHRoZQotICAgICAgICByZWxhdGlvbnNoaXAsIGlmIHNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphcgotICAgICAgICBmaWxlLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudCBwcm92aWRlcyBhIHVuaXF1ZSBuYW1lCi0gICAgICAgICAgICB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZSBmb3IgYSByZWxhdGlvbnNoaXAuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb25zaGlwLXJvbGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb25zaGlwLXJvbGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGRlc2NyaWJlcyBhIHJvbGUgd2l0aGluIGEKLSAgICAgICAgcmVsYXRpb25zaGlwLiBUaGVyZSBhcmUgdHdvIHJvbGVzIGluIGVhY2ggcmVsYXRpb25zaGlwLgotICAgICAgICAKLSAgICAgICAgVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUgY29udGFpbnMgYW4gb3B0aW9uYWwKLSAgICAgICAgZGVzY3JpcHRpb247IGFuIG9wdGlvbmFsIG5hbWUgZm9yIHRoZSByZWxhdGlvbnNoaXAgcm9sZTsgYQotICAgICAgICBzcGVjaWZpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsCi0gICAgICAgIHNwZWNpZmljYXRpb24gb2YgY2FzY2FkZS1kZWxldGUgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIHJvbGU7Ci0gICAgICAgIHRoZSByb2xlIHNvdXJjZTsgYW5kIGEgZGVjbGFyYXRpb24gb2YgdGhlIGNtci1maWVsZCwgaWYgYW55LAotICAgICAgICBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzCi0gICAgICAgIGFjY2Vzc2VkIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSByb2xlIHNvdXJjZS4KLSAgICAgICAgCi0gICAgICAgIFRoZSBtdWx0aXBsaWNpdHkgYW5kIHJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4KLSAgICAgICAgCi0gICAgICAgIFRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCBkZXNpZ25hdGVzIGFuIGVudGl0eQotICAgICAgICBiZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsCi0gICAgICAgIHJlbGF0aW9uc2hpcHMsIGJvdGggcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgbXVzdCBkZWNsYXJlIGEKLSAgICAgICAgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgYSBjbXItZmllbGQKLSAgICAgICAgaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YKLSAgICAgICAgYSBjbXItZmllbGQgZWxlbWVudCBpbiBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUgc3BlY2lmaWVzCi0gICAgICAgIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyB1bmlkaXJlY3Rpb25hbCBpbiBuYXZpZ2FiaWxpdHkgYW5kCi0gICAgICAgIHRoZSBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgcmVsYXRpb25zaGlwIGlzCi0gICAgICAgICJub3QgYXdhcmUiIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlOgotICAgICAgICAKLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPlByb2R1Y3QtTGluZUl0ZW08L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAJICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cHJvZHVjdC1oYXMtbGluZWl0ZW1zCi0gICAgICAgIAkgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgIAkgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgIAkgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgIAkgIDxlamItbmFtZT5Qcm9kdWN0RUpCPC9lamItbmFtZT4KLSAgICAgICAgCSAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBlbGVtZW50IGRlZmluZXMgYQotICAgICAgICAgICAgbmFtZSBmb3IgYSByb2xlIHRoYXQgaXMgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICAgICAgZWpiLXJlbGF0aW9uLiBEaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBjYW4gdXNlIHRoZQotICAgICAgICAgICAgc2FtZSBuYW1lIGZvciBhIHJvbGUuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtdWx0aXBsaWNpdHkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm11bHRpcGxpY2l0eVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWRlbGV0ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0LCB3aXRoaW4gYQotICAgICAgICAgICAgcGFydGljdWxhciByZWxhdGlvbnNoaXAsIHRoZSBsaWZldGltZSBvZiBvbmUgb3IgbW9yZQotICAgICAgICAgICAgZW50aXR5IGJlYW5zIGlzIGRlcGVuZGVudCB1cG9uIHRoZSBsaWZldGltZSBvZgotICAgICAgICAgICAgYW5vdGhlciBlbnRpdHkgYmVhbi4gVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgY2FuCi0gICAgICAgICAgICBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0gICAgICAgICAgICBlbGVtZW50IGNvbnRhaW5lZCBpbiBhbiBlamItcmVsYXRpb24gZWxlbWVudCBpbgotICAgICAgICAgICAgd2hpY2ggdGhlIG90aGVyIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotICAgICAgICAgICAgZWxlbWVudCBzcGVjaWZpZXMgYSBtdWx0aXBsaWNpdHkgb2YgT25lLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRpb25zaGlwLXJvbGUtc291cmNlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpjbXItZmllbGRUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRlcnByaXNlLWJlYW5zVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnRlcnByaXNlLWJlYW5zVHlwZSBkZWNsYXJlcyBvbmUgb3IgbW9yZSBlbnRlcnByaXNlCi0gICAgICAgIGJlYW5zLiBFYWNoIGJlYW4gY2FuIGJlIGEgc2Vzc2lvbiwgZW50aXR5IG9yIG1lc3NhZ2UtZHJpdmVuCi0gICAgICAgIGJlYW4uCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZXNzaW9uLWJlYW5UeXBlIj4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZgotICAgICAgICAgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotICAgICAgICAgICAgICB0aGUgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLSAgICAgICAgICAgICAgdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1sb2NhbC1yZWYiLz4KLSAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICAgICAgICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLSAgICAgICAgICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0gICAgICAgICAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZiIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLXJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLSAgICAgICAgICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICAgICAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgICAgICAgIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLSAgICAgICAgICAgICAgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0gICAgICAgICAgICAgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLSAgICAgICAgICAgICAgY29tcG9uZW50LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLSAgICAgICAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLXJlZiIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpyZXMtcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0gICAgICAgICAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0gICAgICAgICAgICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZQotICAgICAgICAgICAgICBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnYtZW50cnkiLz4KLSAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVudGl0eS1iZWFuVHlwZSI+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZgotICAgICAgICAgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotICAgICAgICAgICAgICB0aGUgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLSAgICAgICAgICAgICAgdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1sb2NhbC1yZWYiLz4KLSAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgICAgICAgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotICAgICAgICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItcmVmIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICAgICAgICBjb21wb25lbnQuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLSAgICAgICAgICAgICAgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0gICAgICAgICAgICAgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLSAgICAgICAgICAgICAgY29tcG9uZW50LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgICAgICAgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQotICAgICAgICAgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotICAgICAgICAgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJlcy1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLSAgICAgICAgICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5Ii8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVudi1lbnRyeS1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kcml2ZW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZHJpdmVuLWJlYW5UeXBlIj4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YKLSAgICAgICAgICAgICAgYW4gRUpCIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4KLSAgICAgICAgICAgICAgdGhlIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgICAgICAgICAgIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgICAgICAgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotICAgICAgICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItcmVmIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLXJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLSAgICAgICAgICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICAgICAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgICAgICAgIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgICAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICAgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgICAgICAgIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgICAgICAgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQotICAgICAgICAgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotICAgICAgICAgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJlcy1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0gICAgICAgICAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0gICAgICAgICAgICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZQotICAgICAgICAgICAgICBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnYtZW50cnkiLz4KLSAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1iZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnRpdHktYmVhblR5cGUgZGVjbGFyZXMgYW4gZW50aXR5IGJlYW4uIFRoZSBkZWNsYXJhdGlvbgotICAgICAgICBjb25zaXN0cyBvZjoKLSAgICAgICAgCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLSAgICAgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlIAotICAgICAgICBpY29uIGZpbGUgbmFtZQotICAgICAgICAtIGEgdW5pcXVlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotICAgICAgICBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgbWFwcGVkLW5hbWUgZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICAgdmVuZG9yLXNwZWNpZmljIGRlcGxveW1lbnQgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgcGh5c2ljYWwKLSAgICAgICAgam5kaS1uYW1lIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBob21lIGludGVyZmFjZS4gVGhpcyAKLSAgICAgICAgZWxlbWVudCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gICAgICAgIEFueSB1c2Ugb2YgdGhpcyBlbGVtZW50IGlzIG5vbi1wb3J0YWJsZS4KLSAgICAgICAgLSB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGhvbWUgCi0gICAgICAgIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55Ci0gICAgICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsCi0gICAgICAgIGludGVyZmFjZXMsIGlmIGFueQotICAgICAgICAtIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICAgIC0gdGhlIG9wdGlvbmFsIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UgbWFuYWdlbWVudCB0eXBlLiBJZiAKLSAgICAgICAgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQgaXQgaXMgZGVmYXVsdGVkIHRvIENvbnRhaW5lci4KLSAgICAgICAgLSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcyBuYW1lCi0gICAgICAgIC0gYW4gaW5kaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyByZWVudHJhbmN5Ci0gICAgICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgCi0gICAgICAgIGVudGl0eSBiZWFuJ3MgY21wLXZlcnNpb24KLSAgICAgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzCi0gICAgICAgIGFic3RyYWN0IHNjaGVtYSBuYW1lCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiBjb250YWluZXItbWFuYWdlZCBmaWVsZHMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBwcmltYXJ5IGtleSAKLSAgICAgICAgZmllbGQKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IAotICAgICAgICBlbnRyaWVzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgCi0gICAgICAgIHJlZmVyZW5jZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIAotICAgICAgICBFSkIgcmVmZXJlbmNlcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViIAotICAgICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSAKLSAgICAgICAgcmVmZXJlbmNlcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eQotICAgICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgCi0gICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICAgIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UgCi0gICAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBzZXQgb2YgcXVlcnkgZGVjbGFyYXRpb25zCi0gICAgICAgIGZvciBmaW5kZXIgYW5kIHNlbGVjdCBtZXRob2RzIGZvciBhbiBlbnRpdHkKLSAgICAgICAgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueC4KLSAgICAgICAgCi0gICAgICAgIFRoZSBvcHRpb25hbCBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkCi0gICAgICAgIGZvciBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlIGFuZAotICAgICAgICBjbXAtdmVyc2lvbiAyLnguCi0gICAgICAgIAotICAgICAgICBUaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvcgotICAgICAgICBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuCi0gICAgICAgIAotICAgICAgICBUaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUKLSAgICAgICAgZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuIElmCi0gICAgICAgIHRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uCi0gICAgICAgIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlIGRlZmF1bHRzIHRvIDIueC4KLSAgICAgICAgCi0gICAgICAgIFRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYKLSAgICAgICAgdGhlIGVudGl0eSBiZWFuIGNtcC12ZXJzaW9uIGlzIDEueC4KLSAgICAgICAgCi0gICAgICAgIFRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYKLSAgICAgICAgdGhlIGVudGl0eSBiZWFuIGhhcyBhIHJlbW90ZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlLgotICAgICAgICAKLSAgICAgICAgVGhlIG9wdGlvbmFsIGxvY2FsLWhvbWUgYW5kIGxvY2FsIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkCi0gICAgICAgIGlmIHRoZSBlbnRpdHkgYmVhbiBoYXMgYSBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UuCi0gICAgICAgIAotICAgICAgICBFaXRoZXIgYm90aCB0aGUgbG9jYWwtaG9tZSBhbmQgdGhlIGxvY2FsIGVsZW1lbnRzIG9yIGJvdGgKLSAgICAgICAgdGhlIGhvbWUgYW5kIHRoZSByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQuCi0gICAgICAgIAotICAgICAgICBUaGUgb3B0aW9uYWwgcXVlcnkgZWxlbWVudHMgbXVzdCBiZSBwcmVzZW50IGlmIHRoZQotICAgICAgICBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDIueCBhbmQKLSAgICAgICAgcXVlcnkgbWV0aG9kcyBvdGhlciB0aGFuIGZpbmRCeVByaW1hcnlLZXkgaGF2ZSBiZWVuIGRlZmluZWQKLSAgICAgICAgZm9yIHRoZSBlbnRpdHkgYmVhbi4KLSAgICAgICAgCi0gICAgICAgIFRoZSBvdGhlciBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUKLSAgICAgICAgc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtCi0gICAgICAgIGFyZSBlbXB0eS4KLSAgICAgICAgCi0gICAgICAgIEF0IGxlYXN0IG9uZSBjbXAtZmllbGQgZWxlbWVudCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlCi0gICAgICAgIGRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZAotICAgICAgICB0aGUgY21wLXZlcnNpb24gaXMgMS54LCBhbmQgbm9uZSBtdXN0IG5vdCBiZSBwcmVzZW50IGlmIHRoZQotICAgICAgICBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIEJlYW4uCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG9tZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aG9tZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZW1vdGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxvY2FsLWhvbWVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsb2NhbFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsYXNzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItY2xhc3NUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGVyc2lzdGVuY2UtdHlwZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltLWtleS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBwcmltLWtleS1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZQotICAgICAgICAgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KLSAgICAgICAgICAgIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIElmIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBpcwotICAgICAgICAgICAgZGVmZXJyZWQgdG8gZGVwbG95bWVudCB0aW1lLCB0aGUgcHJpbS1rZXktY2xhc3MgCi0gICAgICAgICAgICBlbGVtZW50IHNob3VsZCBzcGVjaWZ5IGphdmEubGFuZy5PYmplY3QuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWVudHJhbnQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHJlZW50cmFudCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGFuIGVudGl0eQotICAgICAgICAgICAgYmVhbiBpcyByZWVudHJhbnQgb3Igbm90LgotICAgICAgICAgICAgCi0gICAgICAgICAgICBUaGUgcmVlbnRyYW50IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3bwotICAgICAgICAgICAgZm9sbG93aW5nOiB0cnVlIG9yIGZhbHNlCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtdmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y21wLXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFic3RyYWN0LXNjaGVtYS1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICAgICAgb2YgdGhlIGFic3RyYWN0IHNjaGVtYSB0eXBlIG9mIGFuIGVudGl0eSBiZWFuIHdpdGggCi0gICAgICAgICAgICBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCIFFMIHF1ZXJpZXMuIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGZvciBhbiBlbnRpdHkgCi0gICAgICAgICAgICBiZWFuIHdob3NlIGxvY2FsIGludGVyZmFjZSBpcyAKLSAgICAgICAgICAgIGNvbS5hY21lLmNvbW1lcmNlLk9yZGVyIG1pZ2h0IGJlIE9yZGVyLiAKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtcC1maWVsZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y21wLWZpZWxkVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmlta2V5LWZpZWxkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCi0gICAgICAgICAgICBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZCBmb3IgYW4gZW50aXR5IHdpdGgKLSAgICAgICAgICAgIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBUaGUgcHJpbWtleS1maWVsZCBtdXN0IGJlIG9uZSBvZiB0aGUgZmllbGRzIGRlY2xhcmVkCi0gICAgICAgICAgICBpbiB0aGUgY21wLWZpZWxkIGVsZW1lbnQsIGFuZCB0aGUgdHlwZSBvZiB0aGUgZmllbGQKLSAgICAgICAgICAgIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkga2V5IHR5cGUuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgbm90IHVzZWQgaWYgdGhlIHByaW1hcnkKLSAgICAgICAgICAgIGtleSBtYXBzIHRvIG11bHRpcGxlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotICAgICAgICAgICAgKGkuZS4gdGhlIGtleSBpcyBhIGNvbXBvdW5kIGtleSkuIEluIHRoaXMgY2FzZSwgdGhlCi0gICAgICAgICAgICBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQKLSAgICAgICAgICAgIHRoZWlyIG5hbWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgbmFtZXMgb2YKLSAgICAgICAgICAgIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyB0aGF0IGNvbXByaXNlIHRoZSBrZXkuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LXJvbGUtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpxdWVyeVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4Y2x1ZGUtbGlzdFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZXhjbHVkZS1saXN0VHlwZSBzcGVjaWZpZXMgb25lIG9yIG1vcmUgbWV0aG9kcyB3aGljaAotICAgICAgICB0aGUgQXNzZW1ibGVyIG1hcmtzIHRvIGJlIHVuY2FsbGFibGUuCi0gICAgICAgIAotICAgICAgICBJZiB0aGUgbWV0aG9kIHBlcm1pc3Npb24gcmVsYXRpb24gY29udGFpbnMgbWV0aG9kcyB0aGF0IGFyZQotICAgICAgICBpbiB0aGUgZXhjbHVkZSBsaXN0LCB0aGUgRGVwbG95ZXIgc2hvdWxkIGNvbnNpZGVyIHRob3NlCi0gICAgICAgIG1ldGhvZHMgdG8gYmUgdW5jYWxsYWJsZS4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBsaWNhdGlvbi1leGNlcHRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uLWV4Y2VwdGlvblR5cGUgZGVjbGFyZXMgYW4gYXBwbGljYXRpb24KLSAgICAgICAgZXhjZXB0aW9uLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0gICAgICAgIAotICAgICAgICAtIHRoZSBleGNlcHRpb24gY2xhc3MuIFdoZW4gdGhlIGNvbnRhaW5lciByZWNlaXZlcwotICAgICAgICBhbiBleGNlcHRpb24gb2YgdGhpcyB0eXBlLCBpdCBpcyByZXF1aXJlZCB0byAKLSAgICAgICAgZm9yd2FyZCB0aGlzIGV4Y2VwdGlvbiBhcyBhbiBhcHBsY2F0aW9uIGV4Y2VwdGlvbiAKLSAgICAgICAgdG8gdGhlIGNsaWVudCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgYSBjaGVja2VkCi0gICAgICAgIG9yIHVuY2hlY2tlZCBleGNlcHRpb24uCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgcm9sbGJhY2sgZWxlbWVudC4gSWYgdGhpcyBlbGVtZW50IGlzIAotICAgICAgICBzZXQgdG8gdHJ1ZSwgdGhlIGNvbnRhaW5lciBtdXN0IHJvbGxiYWNrIHRoZSBjdXJyZW50IAotICAgICAgICB0cmFuc2FjdGlvbiBiZWZvcmUgZm9yd2FyZGluZyB0aGUgZXhjZXB0aW9uIHRvIHRoZQotICAgICAgICBjbGllbnQuICBJZiBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBmYWxzZS4KLSAgICAgICAgLSBhbiBvcHRpb25hbCBpbmhlcml0ZWQgZWxlbWVudC4gSWYgdGhpcyBlbGVtZW50IGlzIAotICAgICAgICBzZXQgdG8gdHJ1ZSwgc3ViY2xhc3NlcyBvZiB0aGUgZXhjZXB0aW9uIGNsYXNzIHR5cGUKLSAgICAgICAgYXJlIGFsc28gYXV0b21hdGljYWxseSBjb25zaWRlcmVkIGFwcGxpY2F0aW9uIAotICAgICAgICBleGNlcHRpb25zICh1bmxlc3Mgb3ZlcnJpZGVuIGF0IGEgbG93ZXIgbGV2ZWwpLgotICAgICAgICBJZiBzZXQgdG8gZmFsc2UsIG9ubHkgdGhlIGV4Y2VwdGlvbiBjbGFzcyB0eXBlIGlzCi0gICAgICAgIGNvbnNpZGVyZWQgYW4gYXBwbGljYXRpb24tZXhjZXB0aW9uLCBub3QgaXRzCi0gICAgICAgIGV4Y2VwdGlvbiBzdWJjbGFzc2VzLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzCi0gICAgICAgIHZhbHVlIGRlZmF1bHRzIHRvIHRydWUuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLWNsYXNzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sbGJhY2siCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaGVyaXRlZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyY2VwdG9yc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgaW50ZXJjZXB0b3JzVHlwZSBlbGVtZW50IGRlY2xhcmVzIG9uZSBvciBtb3JlIGludGVyY2VwdG9yCi0gICAgICAgIGNsYXNzZXMgdXNlZCBieSBjb21wb25lbnRzIHdpdGhpbiB0aGlzIGVqYi1qYXIgb3IgLndhci4gIFRoZSBkZWNsYXJhdGlvbgotICAgICAgICBjb25zaXN0cyBvZiA6Ci0gICAgICAgIAotICAgICAgICAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICAgICAgICAtIE9uZSBvciBtb3JlIGludGVyY2VwdG9yIGVsZW1lbnRzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3IiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmludGVyY2VwdG9yVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmNlcHRvclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgaW50ZXJjZXB0b3JUeXBlIGVsZW1lbnQgZGVjbGFyZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUKLSAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3MuICBJdCBjb25zaXN0cyBvZiA6Ci0gICAgICAgIAotICAgICAgICAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICAgICAgICAtIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgaW50ZXJjZXB0b3IgY2xhc3MuCi0gICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBvZiBhcm91bmQgaW52b2tlIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlCi0gICAgICAgIGludGVyY2VwdG9yIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IG9mIGFyb3VuZCB0aW1lb3V0IG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlCi0gICAgICAgIGludGVyY2VwdG9yIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IGVudmlyb25tZW50IGRlcGVuZGVuY2llcyBmb3IgdGhlIGludGVyY2VwdG9yCi0gICAgICAgIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IG9mIHBvc3QtYWN0aXZhdGUgbWV0aG9kcyBkZWNsYXJlZCBvbiB0aGUKLSAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3MgYW5kL29yIGl0cyBzdXBlci1jbGFzc2VzLgotICAgICAgICAtIEFuIG9wdGlvbmFsIGxpc3Qgb2YgcHJlLXBhc3NpdmF0ZSBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZQotICAgICAgICBpbnRlcmNlcHRvciBjbGFzcyBhbmQvb3IgaXRzIHN1cGVyLWNsYXNzZXMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFyb3VuZC1pbnZva2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFyb3VuZC1pbnZva2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFyb3VuZC10aW1lb3V0IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphcm91bmQtdGltZW91dFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtYWN0aXZhdGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBhc3NpdmF0ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJjZXB0b3ItYmluZGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgaW50ZXJjZXB0b3ItYmluZGluZ1R5cGUgZWxlbWVudCBkZXNjcmliZXMgdGhlIGJpbmRpbmcgb2YKLSAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3NlcyB0byBiZWFucyB3aXRoaW4gdGhlIGVqYi1qYXIgb3IgLndhci4KLSAgICAgICAgSXQgY29uc2lzdHMgb2YgOgotICAgICAgICAKLSAgICAgICAgLSBBbiBvcHRpb25hbCBkZXNjcmlwdGlvbi4KLSAgICAgICAgLSBUaGUgbmFtZSBvZiBhbiBlamIgd2l0aGluIHRoZSBtb2R1bGUgb3IgdGhlIHdpbGRjYXJkIHZhbHVlICIqIiwKLSAgICAgICAgd2hpY2ggaXMgdXNlZCB0byBkZWZpbmUgaW50ZXJjZXB0b3JzIHRoYXQgYXJlIGJvdW5kIHRvIGFsbAotICAgICAgICBiZWFucyBpbiB0aGUgZWpiLWphciBvciAud2FyLgotICAgICAgICAtIEEgbGlzdCBvZiBpbnRlcmNlcHRvciBjbGFzc2VzIHRoYXQgYXJlIGJvdW5kIHRvIHRoZSBjb250ZW50cyBvZgotICAgICAgICB0aGUgZWpiLW5hbWUgZWxlbWVudCBvciBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHRvdGFsIG9yZGVyaW5nCi0gICAgICAgIG92ZXIgdGhlIGludGVyY2VwdG9ycyBkZWZpbmVkIGZvciB0aGUgZ2l2ZW4gbGV2ZWwgYW5kIGFib3ZlLgotICAgICAgICAtIEFuIG9wdGlvbmFsIGV4Y2x1ZGUtZGVmYXVsdC1pbnRlcmNlcHRvcnMgZWxlbWVudC4gIElmIHNldCB0byB0cnVlLAotICAgICAgICBzcGVjaWZpZXMgdGhhdCBkZWZhdWx0IGludGVyY2VwdG9ycyBhcmUgbm90IHRvIGJlIGFwcGxpZWQgdG8gCi0gICAgICAgIGEgYmVhbi1jbGFzcyBhbmQvb3IgYnVzaW5lc3MgbWV0aG9kLgotICAgICAgICAtIEFuIG9wdGlvbmFsIGV4Y2x1ZGUtY2xhc3MtaW50ZXJjZXB0b3JzIGVsZW1lbnQuICBJZiBzZXQgdG8gdHJ1ZSwKLSAgICAgICAgc3BlY2lmaWVzIHRoYXQgY2xhc3MgaW50ZXJjZXB0b3JzIGFyZSBub3QgdG8gYmUgYXBwbGllZCB0byAKLSAgICAgICAgYSBidXNpbmVzcyBtZXRob2QuCi0gICAgICAgIC0gQW4gb3B0aW9uYWwgc2V0IG9mIG1ldGhvZCBlbGVtZW50cyBmb3IgZGVzY3JpYmluZyB0aGUgbmFtZS9wYXJhbXMKLSAgICAgICAgb2YgYSBtZXRob2QtbGV2ZWwgaW50ZXJjZXB0b3IuCi0gICAgICAgIAotICAgICAgICBJbnRlcmNlcHRvcnMgYm91bmQgdG8gYWxsIGNsYXNzZXMgdXNpbmcgdGhlIHdpbGRjYXJkIHN5bnRheAotICAgICAgICAiKiIgYXJlIGRlZmF1bHQgaW50ZXJjZXB0b3JzIGZvciB0aGUgY29tcG9uZW50cyBpbiB0aGUgZWpiLWphciBvciAud2FyLiAKLSAgICAgICAgSW4gYWRkaXRpb24sIGludGVyY2VwdG9ycyBtYXkgYmUgYm91bmQgYXQgdGhlIGxldmVsIG9mIHRoZSBiZWFuCi0gICAgICAgIGNsYXNzIChjbGFzcy1sZXZlbCBpbnRlcmNlcHRvcnMpIG9yIGJ1c2luZXNzIG1ldGhvZHMgKG1ldGhvZC1sZXZlbAotICAgICAgICBpbnRlcmNlcHRvcnMgKS4KLSAgICAgICAgCi0gICAgICAgIFRoZSBiaW5kaW5nIG9mIGludGVyY2VwdG9ycyB0byBjbGFzc2VzIGlzIGFkZGl0aXZlLiAgSWYgaW50ZXJjZXB0b3JzCi0gICAgICAgIGFyZSBib3VuZCBhdCB0aGUgY2xhc3MtbGV2ZWwgYW5kL29yIGRlZmF1bHQtbGV2ZWwgYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgbWV0aG9kLWxldmVsLCBib3RoIGNsYXNzLWxldmVsIGFuZC9vciBkZWZhdWx0LWxldmVsIGFzIHdlbGwgYXMKLSAgICAgICAgbWV0aG9kLWxldmVsIHdpbGwgYXBwbHkuIAotICAgICAgICAKLSAgICAgICAgVGhlcmUgYXJlIGZvdXIgcG9zc2libGUgc3R5bGVzIG9mIHRoZSBpbnRlcmNlcHRvciBlbGVtZW50IHN5bnRheCA6Ci0gICAgICAgIAotICAgICAgICAxLgotICAgICAgICA8aW50ZXJjZXB0b3ItYmluZGluZz4KLSAgICAgICAgPGVqYi1uYW1lPio8L2VqYi1uYW1lPgotICAgICAgICA8aW50ZXJjZXB0b3ItY2xhc3M+SU5URVJDRVBUT1I8L2ludGVyY2VwdG9yLWNsYXNzPgotICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+Ci0gICAgICAgIAotICAgICAgICBTcGVjaWZ5aW5nIHRoZSBlamItbmFtZSBhcyB0aGUgd2lsZGNhcmQgdmFsdWUgIioiIGRlc2lnbmF0ZXMKLSAgICAgICAgZGVmYXVsdCBpbnRlcmNlcHRvcnMgKGludGVyY2VwdG9ycyB0aGF0IGFwcGx5IHRvIGFsbCBzZXNzaW9uIGFuZAotICAgICAgICBtZXNzYWdlLWRyaXZlbiBiZWFucyBjb250YWluZWQgaW4gdGhlIGVqYi1qYXIgb3IgLndhcikuCi0gICAgICAgIAotICAgICAgICAyLiAKLSAgICAgICAgPGludGVyY2VwdG9yLWJpbmRpbmc+Ci0gICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICAgICAgPGludGVyY2VwdG9yLWNsYXNzPklOVEVSQ0VQVE9SPC9pbnRlcmNlcHRvci1jbGFzcz4KLSAgICAgICAgPC9pbnRlcmNlcHRvci1iaW5kaW5nPgotICAgICAgICAKLSAgICAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGludGVyY2VwdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgICAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4oY2xhc3MtbGV2ZWwgaW50ZXJjZXB0b3JzKS4KLSAgICAgICAgCi0gICAgICAgIDMuIAotICAgICAgICA8aW50ZXJjZXB0b3ItYmluZGluZz4KLSAgICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgICAgICA8aW50ZXJjZXB0b3ItY2xhc3M+SU5URVJDRVBUT1I8L2ludGVyY2VwdG9yLWNsYXNzPgotICAgICAgICA8bWV0aG9kPgotICAgICAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLSAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvaW50ZXJjZXB0b3ItYmluZGluZz4KLSAgICAgICAgCi0gICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSBtZXRob2QtbGV2ZWwgaW50ZXJjZXB0b3Igd2l0aCAKLSAgICAgICAgdGhlIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWV0aG9kcwotICAgICAgICB3aXRoIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhlIGVsZW1lbnQgb2YgdGhpcyBzdHlsZSByZWZlcnMKLSAgICAgICAgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQgbmFtZS4gIE1ldGhvZC1sZXZlbAotICAgICAgICBpbnRlcmNlcHRvcnMgY2FuIG9ubHkgYmUgYXNzb2NpYXRlZCB3aXRoIGJ1c2luZXNzIG1ldGhvZHMgb2YgdGhlCi0gICAgICAgIGJlYW4gY2xhc3MuICAgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZCB2YWx1ZSAiKiIgY2Fubm90IGJlIHVzZWQKLSAgICAgICAgdG8gc3BlY2lmeSBtZXRob2QtbGV2ZWwgaW50ZXJjZXB0b3JzLgotICAgICAgICAKLSAgICAgICAgNC4gCi0gICAgICAgIDxpbnRlcmNlcHRvci1iaW5kaW5nPgotICAgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgICAgIDxpbnRlcmNlcHRvci1jbGFzcz5JTlRFUkNFUFRPUjwvaW50ZXJjZXB0b3ItY2xhc3M+Ci0gICAgICAgIDxtZXRob2Q+Ci0gICAgICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAuLi4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS1OPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvaW50ZXJjZXB0b3ItYmluZGluZz4KLSAgICAgICAgCi0gICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSBtZXRob2QtbGV2ZWwgaW50ZXJjZXB0b3Igd2l0aCAKLSAgICAgICAgdGhlIHNwZWNpZmllZCBtZXRob2Qgb2YgdGhlIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uICBUaGlzIAotICAgICAgICBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYSBzZXQgb2YgbWV0aG9kcwotICAgICAgICB3aXRoIGFuIG92ZXJsb2FkZWQgbmFtZS4gIFRoZSB2YWx1ZXMgUEFSQU0tMSB0aHJvdWdoIFBBUkFNLU4KLSAgICAgICAgYXJlIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycwotICAgICAgICAoaWYgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQgYXJndW1lbnRzLCB0aGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50Ci0gICAgICAgIGNvbnRhaW5zIG5vIG1ldGhvZC1wYXJhbSBlbGVtZW50cykuIEFycmF5cyBhcmUgc3BlY2lmaWVkIGJ5IHRoZQotICAgICAgICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZiBzcXVhcmUgCi0gICAgICAgIGJyYWNrZXRzIChlLmcuIGludFtdW10pLgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3ItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvci1vcmRlciIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTppbnRlcmNlcHRvci1vcmRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjEiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtaW50ZXJjZXB0b3JzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWNsYXNzLWludGVyY2VwdG9ycyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmNlcHRvci1vcmRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgaW50ZXJjZXB0b3Itb3JkZXJUeXBlIGVsZW1lbnQgZGVzY3JpYmVzIGEgdG90YWwgb3JkZXJpbmcKLSAgICAgICAgb2YgaW50ZXJjZXB0b3IgY2xhc3Nlcy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWV0aG9kLXBhcmFtc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaXQtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjcmVhdGUtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmVhbi1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVtb3ZlLW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmVhbi1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXRhaW4taWYtZXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kcml2ZW4tYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnZS1kcml2ZW4gZWxlbWVudCBkZWNsYXJlcyBhIG1lc3NhZ2UtZHJpdmVuCi0gICAgICAgIGJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLSAgICAgICAgCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLSAgICAgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlIAotICAgICAgICBpY29uIGZpbGUgbmFtZS4gCi0gICAgICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4KLSAgICAgICAgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgICAtIGFuIG9wdGlvbmFsIG1hcHBlZC1uYW1lIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBwcm92aWRlCi0gICAgICAgIHZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHBoeXNpY2FsCi0gICAgICAgIGpuZGktbmFtZSBvZiBkZXN0aW5hdGlvbiBmcm9tIHdoaWNoIHRoaXMgbWVzc2FnZS1kcml2ZW4gYmVhbgotICAgICAgICBzaG91bGQgY29uc3VtZS4gIFRoaXMgZWxlbWVudCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc3VwcG9ydGVkIAotICAgICAgICBieSBhbGwgaW1wbGVtZW50YXRpb25zLiAgQW55IHVzZSBvZiB0aGlzIGVsZW1lbnQgaXMgbm9uLXBvcnRhYmxlLgotICAgICAgICAtIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2luZyAKLSAgICAgICAgdHlwZSAKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHRpbWVvdXQgbWV0aG9kIGZvcgotICAgICAgICBoYW5kbGluZyBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZWQgdGltZXJzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGltZXJzIHRvIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhdAotICAgICAgICBkZXBsb3ltZW50IHRpbWUKLSAgICAgICAgLSB0aGUgb3B0aW9uYWwgbWVzc2FnZS1kcml2ZW4gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgCi0gICAgICAgIHR5cGUuIElmIGl0IGlzIG5vdCBkZWZpbmVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gQ29udGFpbmVyLgotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgCi0gICAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZQotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgCi0gICAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tbGluawotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MKLSAgICAgICAgYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuIGNsYXNzIGFuZC9vcgotICAgICAgICBzdXBlcmNsYXNzIGFyb3VuZC1pbnZva2UgbWV0aG9kcy4KLSAgICAgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuIGNsYXNzIGFuZC9vcgotICAgICAgICBzdXBlcmNsYXNzIGFyb3VuZC10aW1lb3V0IG1ldGhvZHMuCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudAotICAgICAgICBlbnRyaWVzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCCi0gICAgICAgIHJlZmVyZW5jZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYiBzZXJ2aWNlCi0gICAgICAgIHJlZmVyZW5jZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSAKLSAgICAgICAgcmVmZXJlbmNlcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eQotICAgICAgICBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MKLSAgICAgICAgbWV0aG9kcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgCi0gICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IAotICAgICAgICByZWZlcmVuY2VzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgICBlbnZpcm9ubWVudCByZWZlcmVuY2VzLgotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZSAKLSAgICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWpiLWNsYXNzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZQotICAgICAgICAgICAgb2YgdGhlIGJlYW4gY2xhc3MgZm9yIHRoaXMgZWpiLiAgSXQgaXMgcmVxdWlyZWQgdW5sZXNzCi0gICAgICAgICAgICB0aGVyZSBpcyBhIGNvbXBvbmVudC1kZWZpbmluZyBhbm5vdGF0aW9uIGZvciB0aGUgc2FtZQotICAgICAgICAgICAgZWpiLW5hbWUuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdpbmctdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIGxpc3RlbmVyIGludGVyZmFjZSBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbi4gCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aW1lb3V0LW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bmFtZWQtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgdGltZW91dC1tZXRob2QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1ldGhvZCB0aGF0Ci0gICAgICAgICAgICB3aWxsIHJlY2VpdmUgY2FsbGJhY2tzIGZvciBwcm9ncmFtbWF0aWNhbGx5Ci0gICAgICAgICAgICBjcmVhdGVkIHRpbWVycy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRpbWVyIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0aW1lclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNhY3Rpb24tdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJhbnNhY3Rpb24tdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGluayIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YWN0aXZhdGlvbi1jb25maWdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFyb3VuZC1pbnZva2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFyb3VuZC1pbnZva2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFyb3VuZC10aW1lb3V0IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphcm91bmQtdGltZW91dFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LWlkZW50aXR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgIFRoZSBtZXRob2RUeXBlIGlzIHVzZWQgdG8gZGVub3RlIGEgbWV0aG9kIG9mIGFuIGVudGVycHJpc2UKLSAgICAgICAgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludAotICAgICAgICBpbnRlcmZhY2UsIG9yLCBpbiB0aGUgY2FzZSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4sIHRoZQotICAgICAgICBiZWFuJ3MgbWVzc2FnZSBsaXN0ZW5lciBtZXRob2QsIG9yIGEgc2V0IG9mIHN1Y2gKLSAgICAgICAgbWV0aG9kcy4gVGhlIGVqYi1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlCi0gICAgICAgIGVudGVycHJpc2UgYmVhbnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlCi0gICAgICAgIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYQotICAgICAgICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBpcyBtdWx0aXBseSBkZWZpbmVkCi0gICAgICAgIGFjcm9zcyB0aGUgYnVzaW5lc3MsIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yIHdlYiBzZXJ2aWNlIAotICAgICAgICBlbmRwb2ludCBudGVyZmFjZXM7IHRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgCi0gICAgICAgIG1ldGhvZCBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsIG1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkgCi0gICAgICAgIGEgc2luZ2xlIG1ldGhvZCBhbW9uZyBtdWx0aXBsZSBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZAotICAgICAgICBtZXRob2QgbmFtZS4KLSAgICAgICAgCi0gICAgICAgIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHlsZXMgb2YgdXNpbmcgbWV0aG9kVHlwZSBlbGVtZW50Ci0gICAgICAgIHdpdGhpbiBhIG1ldGhvZCBlbGVtZW50OgotICAgICAgICAKLSAgICAgICAgMS4KLSAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgICAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDwvbWV0aG9kPgotICAgICAgICAKLSAgICAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUKLSAgICAgICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsIAotICAgICAgICBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcy4KLSAgICAgICAgCi0gICAgICAgIDIuCi0gICAgICAgIDxtZXRob2Q+Ci0gICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDwvbWV0aG9kPgotICAgICAgICAKLSAgICAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mCi0gICAgICAgIHRoZSBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKLSAgICAgICAgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhlIGVsZW1lbnQgb2YKLSAgICAgICAgdGhpcyBzdHlsZSByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQKLSAgICAgICAgbmFtZS4KLSAgICAgICAgCi0gICAgICAgIDMuCi0gICAgICAgIDxtZXRob2Q+Ci0gICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAJICA8bWV0aG9kLXBhcmFtPlBBUkFNLTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5QQVJBTS0yPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIAkgIC4uLgotICAgICAgICAJICA8bWV0aG9kLXBhcmFtPlBBUkFNLW48L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgCi0gICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEKLSAgICAgICAgc2V0IG9mIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaAotICAgICAgICBQQVJBTS1uIGFyZSB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlCi0gICAgICAgIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMgKGlmIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0Ci0gICAgICAgIGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCBjb250YWlucyBubwotICAgICAgICBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUKLSAgICAgICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2YKLSAgICAgICAgc3F1YXJlIGJyYWNrZXRzIChlLmcuIGludFtdW10pLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKLSAgICAgICAgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhpcyBzdHlsZSByZWZlcnMKLSAgICAgICAgdG8gYWxsIG9mIHRoZSBvdmVybG9hZGVkIG1ldGhvZHMuIAotICAgICAgICAKLSAgICAgICAgRXhhbXBsZXM6Ci0gICAgICAgIAotICAgICAgICBTdHlsZSAxOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi0gICAgICAgIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsIAotICAgICAgICBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzOgotICAgICAgICAKLSAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLSAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIAotICAgICAgICBTdHlsZSAyOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi0gICAgICAgIGNyZWF0ZSBtZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUKLSAgICAgICAgaW50ZXJmYWNlKHMpLgotICAgICAgICAKLSAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgCi0gICAgICAgIFN0eWxlIDM6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIHRoZQotICAgICAgICBjcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlCi0gICAgICAgIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UocykuCi0gICAgICAgIAotICAgICAgICA8bWV0aG9kPgotICAgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIAotICAgICAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgYSBTdHlsZSAzIGVsZW1lbnQgd2l0aAotICAgICAgICBtb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kIAotICAgICAgICBmb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLCAKLSAgICAgICAgbXlwYWNrYWdlLk15Q2xhc3NbXVtdIG15Y2xhYXIpIHdvdWxkIGJlIHNwZWNpZmllZCBhczoKLSAgICAgICAgCi0gICAgICAgIDxtZXRob2Q+Ci0gICAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgICAgICA8bWV0aG9kLW5hbWU+Zm9vYmFyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIAkgIDxtZXRob2QtcGFyYW0+Y2hhcjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmludDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmludFtdPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIAkgIDxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3M8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzc1tdW108L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgCi0gICAgICAgIFRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdoZW4gaXQgYmVjb21lcwotICAgICAgICBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbWV0aG9kIHRoYXQgaXMgbXVsdGlwbHkKLSAgICAgICAgZGVmaW5lZCBhY3Jvc3MgdGhlIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsCi0gICAgICAgIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKLSAgICAgICAgc2lnbmF0dXJlLiBIb3dldmVyLCBpZiB0aGUgc2FtZSBtZXRob2QgaXMgYSBtZXRob2Qgb2YgYm90aCB0aGUKLSAgICAgICAgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlLCBhbmQgdGhlIGxvY2FsIGNvbXBvbmVudCBpbnRlcmZhY2UsIAotICAgICAgICB0aGUgc2FtZSBhdHRyaWJ1dGUgYXBwbGllcyB0byB0aGUgbWV0aG9kIGZvciBib3RoIGludGVyZmFjZXMuCi0gICAgICAgIExpa2V3aXNlLCBpZiB0aGUgc2FtZSBtZXRob2QgaXMgYSBtZXRob2Qgb2YgYm90aCB0aGUgcmVtb3RlIAotICAgICAgICBidXNpbmVzcyBpbnRlcmZhY2UgYW5kIHRoZSByZW1vdGUgY29tcG9uZW50IGludGVyZmFjZSwgdGhlIHNhbWUKLSAgICAgICAgYXR0cmlidXRlIGFwcGxpZXMgdG8gdGhlIG1ldGhvZCBmb3IgYm90aCBpbnRlcmZhY2VzLgotICAgICAgICAKLSAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudAotICAgICAgICAKLSAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIAkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykKLSAgICAgICAgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgZnJvbSB0aGUKLSAgICAgICAgY3JlYXRlKFN0cmluZywgU3RyaW5nKSBtZXRob2QgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGhvbWUKLSAgICAgICAgaW50ZXJmYWNlLCB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0gICAgICAgIAotICAgICAgICA8bWV0aG9kPgotICAgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIAkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgCi0gICAgICAgIGFuZCB0aGUgY3JlYXRlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGxvY2FsIGhvbWUKLSAgICAgICAgaW50ZXJmYWNlIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKLSAgICAgICAgCi0gICAgICAgIDxtZXRob2Q+Ci0gICAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIAotICAgICAgICBUaGUgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aXRoIGFsbCB0aHJlZSBTdHlsZXMKLSAgICAgICAgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHVzYWdlLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwotICAgICAgICBtZXRob2QgZWxlbWVudCBleGFtcGxlIGNvdWxkIGJlIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZQotICAgICAgICBtZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIHJlbW90ZSBob21lIGludGVyZmFjZQotICAgICAgICBhbmQgdGhlIHJlbW90ZSBidXNpbmVzcyBpbnRlcmZhY2UuCi0gICAgICAgIAotICAgICAgICA8bWV0aG9kPgotICAgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDwvbWV0aG9kPgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtaW50ZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWV0aG9kLWludGZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXRob2QtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW1zIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXRob2QtcGFyYW1zVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLWludGZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIGEgbWV0aG9kIGVsZW1lbnQgdG8KLSAgICAgICAgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKLSAgICAgICAgc2lnbmF0dXJlIHRoYXQgYXJlIG11bHRpcGx5IGRlZmluZWQgYWNyb3NzIHRoZSBob21lIGFuZAotICAgICAgICBjb21wb25lbnQgaW50ZXJmYWNlcyAoZS5nLCBpbiBib3RoIGFuIGVudGVycHJpc2UgYmVhbidzCi0gICAgICAgIHJlbW90ZSBhbmQgbG9jYWwgaW50ZXJmYWNlcyBvciBpbiBib3RoIGFuIGVudGVycHJpc2UgYmVhbidzCi0gICAgICAgIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBldGMuKTsgdGhlIGNvbXBvbmVudCBhbmQgd2ViCi0gICAgICAgIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcywgYW5kIHNvIG9uLiAKLSAgICAgICAgCi0gICAgICAgIExvY2FsIGFwcGxpZXMgdG8gdGhlIGxvY2FsIGNvbXBvbmVudCBpbnRlcmZhY2UsIGxvY2FsIGJ1c2luZXNzIAotICAgICAgICBpbnRlcmZhY2VzLCBhbmQgdGhlIG5vLWludGVyZmFjZSB2aWV3LiAKLSAgICAgICAgCi0gICAgICAgIFJlbW90ZSBhcHBsaWVzIHRvIGJvdGggcmVtb3RlIGNvbXBvbmVudCBpbnRlcmZhY2UgYW5kIHRoZSByZW1vdGUgCi0gICAgICAgIGJ1c2luZXNzIGludGVyZmFjZXMuICAKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VFbmRwb2ludCByZWZlcnMgdG8gbWV0aG9kcyBleHBvc2VkIHRocm91Z2ggYSB3ZWIgc2VydmljZQotICAgICAgICBlbmRwb2ludC4KLSAgICAgICAgCi0gICAgICAgIFRpbWVyIHJlZmVycyB0byB0aGUgYmVhbidzIHRpbWVvdXQgY2FsbGJhY2sgbWV0aG9kcy4KLSAgICAgICAgCi0gICAgICAgIE1lc3NhZ2VFbmRwb2ludCByZWZlcnMgdG8gdGhlIG1ldGhvZHMgb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MKLSAgICAgICAgbWVzc2FnZS1saXN0ZW5lciBpbnRlcmZhY2UuCi0gICAgICAgIAotICAgICAgICBUaGUgbWV0aG9kLWludGYgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgICAKLSAgICAgICAgSG9tZQotICAgICAgICBSZW1vdGUKLSAgICAgICAgTG9jYWxIb21lCi0gICAgICAgIExvY2FsCi0gICAgICAgIFNlcnZpY2VFbmRwb2ludAotICAgICAgICBUaW1lcgotICAgICAgICBNZXNzYWdlRW5kcG9pbnQKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdGUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxIb21lIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VFbmRwb2ludCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lciIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlRW5kcG9pbnQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXRob2QtbmFtZVR5cGUgY29udGFpbnMgYSBuYW1lIG9mIGFuIGVudGVycHJpc2UKLSAgICAgICAgYmVhbiBtZXRob2Qgb3IgdGhlIGFzdGVyaXNrICgqKSBjaGFyYWN0ZXIuIFRoZSBhc3RlcmlzayBpcwotICAgICAgICB1c2VkIHdoZW4gdGhlIGVsZW1lbnQgZGVub3RlcyBhbGwgdGhlIG1ldGhvZHMgb2YgYW4KLSAgICAgICAgZW50ZXJwcmlzZSBiZWFuJ3MgY2xpZW50IHZpZXcgaW50ZXJmYWNlcy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLXBhcmFtc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWV0aG9kLXBhcmFtc1R5cGUgZGVmaW5lcyBhIGxpc3Qgb2YgdGhlCi0gICAgICAgIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgbWV0aG9kLXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBwcmltaXRpdmUKLSAgICAgICAgICAgIG9yIGEgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lIG9mIGEgbWV0aG9kCi0gICAgICAgICAgICBwYXJhbWV0ZXIuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLXBlcm1pc3Npb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG1ldGhvZC1wZXJtaXNzaW9uVHlwZSBzcGVjaWZpZXMgdGhhdCBvbmUgb3IgbW9yZQotICAgICAgICBzZWN1cml0eSByb2xlcyBhcmUgYWxsb3dlZCB0byBpbnZva2Ugb25lIG9yIG1vcmUgZW50ZXJwcmlzZQotICAgICAgICBiZWFuIG1ldGhvZHMuIFRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUgY29uc2lzdHMgb2YgYW4KLSAgICAgICAgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdCBvZiBzZWN1cml0eSByb2xlIG5hbWVzIG9yIGFuCi0gICAgICAgIGluZGljYXRvciB0byBzdGF0ZSB0aGF0IHRoZSBtZXRob2QgaXMgdW5jaGVja2VkIGZvcgotICAgICAgICBhdXRob3JpemF0aW9uLCBhbmQgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cy4KLSAgICAgICAgCi0gICAgICAgIFRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUKLSAgICAgICAgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzIG9mIHRoZQotICAgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGFuZCB0aGUgbWV0aG9kcyBtdXN0IGJlIG1ldGhvZHMKLSAgICAgICAgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsIGNvbXBvbmVudCAKLSAgICAgICAgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJvbGUtbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5jaGVja2VkIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVtcHR5VHlwZSI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSB1bmNoZWNrZWQgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCBhIG1ldGhvZCBpcwotICAgICAgICAgICAgICBub3QgY2hlY2tlZCBmb3IgYXV0aG9yaXphdGlvbiBieSB0aGUgY29udGFpbmVyCi0gICAgICAgICAgICAgIHByaW9yIHRvIGludm9jYXRpb24gb2YgdGhlIG1ldGhvZC4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im11bHRpcGxpY2l0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbXVsdGlwbGljaXR5VHlwZSBkZXNjcmliZXMgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUKLSAgICAgICAgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uLgotICAgICAgICAKLSAgICAgICAgVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotICAgICAgICAKLSAgICAgICAgT25lCi0gICAgICAgIE1hbnkKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnkiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHBlcnNpc3RlbmNlLXR5cGVUeXBlIHNwZWNpZmllcyBhbiBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlCi0gICAgICAgIG1hbmFnZW1lbnQgdHlwZS4KLSAgICAgICAgCi0gICAgICAgIFRoZSBwZXJzaXN0ZW5jZS10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0gICAgICAgIAotICAgICAgICBCZWFuCi0gICAgICAgIENvbnRhaW5lcgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFuIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHF1ZXJ5VHlwZSBkZWZpbmVzIGEgZmluZGVyIG9yIHNlbGVjdAotICAgICAgICBxdWVyeS4gSXQgY29udGFpbnMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcXVlcnkKLSAgICAgICAgLSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmluZGVyIG9yIHNlbGVjdAotICAgICAgICBtZXRob2QgaXQgaXMgdXNlZCBieQotICAgICAgICAJLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSByZXN1bHQgdHlwZSAKLSAgICAgICAgCSAgbWFwcGluZywgaWYgdGhlIHF1ZXJ5IGlzIGZvciBhIHNlbGVjdCBtZXRob2QgCi0gICAgICAgIAkgIGFuZCBlbnRpdHkgb2JqZWN0cyBhcmUgcmV0dXJuZWQuCi0gICAgICAgIAktIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuCi0gICAgICAgIAotICAgICAgICBRdWVyaWVzIHRoYXQgYXJlIGV4cHJlc3NpYmxlIGluIEVKQiBRTCBtdXN0IHVzZSB0aGUgZWpiLXFsCi0gICAgICAgIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGUgcXVlcnkuIElmIGEgcXVlcnkgaXMgbm90IGV4cHJlc3NpYmxlCi0gICAgICAgIGluIEVKQiBRTCwgdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgdG8KLSAgICAgICAgZGVzY3JpYmUgdGhlIHNlbWFudGljcyBvZiB0aGUgcXVlcnkgYW5kIHRoZSBlamItcWwgZWxlbWVudAotICAgICAgICBzaG91bGQgYmUgZW1wdHkuCi0gICAgICAgIAotICAgICAgICBUaGUgcmVzdWx0LXR5cGUtbWFwcGluZyBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBJdCBjYW4gb25seQotICAgICAgICBiZSBwcmVzZW50IGlmIHRoZSBxdWVyeS1tZXRob2Qgc3BlY2lmaWVzIGEgc2VsZWN0IG1ldGhvZAotICAgICAgICB0aGF0IHJldHVybnMgZW50aXR5IG9iamVjdHMuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCi0gICAgICAgIHJlc3VsdC10eXBlLW1hcHBpbmcgZWxlbWVudCBpcyAiTG9jYWwiLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpxdWVyeS1tZXRob2RUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzdWx0LXR5cGUtbWFwcGluZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVzdWx0LXR5cGUtbWFwcGluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXFsIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciBhIGZpbmRlciBvciBzZWxlY3QKLSAgICAgICAgcXVlcnkuCi0gICAgICAgIAotICAgICAgICBUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci0gICAgICAgIG1ldGhvZCBpbiB0aGUgZW50aXR5IGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLSAgICAgICAgCi0gICAgICAgIEVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi0gICAgICAgIG1ldGhvZC1wYXJhbXMgZWxlbWVudC4KLSAgICAgICAgCi0gICAgICAgIEl0IGlzIHVzZWQgYnkgdGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50LiAKLSAgICAgICAgCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgIAotICAgICAgICA8cXVlcnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5NZXRob2QgZmluZHMgbGFyZ2Ugb3JkZXJzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgCSAgPG1ldGhvZC1uYW1lPmZpbmRMYXJnZU9yZGVyczwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIAkgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgIDxlamItcWw+Ci0gICAgICAgIAlTRUxFQ1QgT0JKRUNUKG8pIEZST00gT3JkZXIgbwotICAgICAgICAJICBXSEVSRSBvLmFtb3VudCAmZ3Q7IDEwMDAKLSAgICAgICAgPC9lamItcWw+Ci0gICAgICAgIDwvcXVlcnk+Ci0gICAgICAgIAotICAgICAgICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXRob2QtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW1zIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXRob2QtcGFyYW1zVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgZGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEKLSAgICAgICAgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gQQotICAgICAgICByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIGlzIHVzZWQgYnkKLSAgICAgICAgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnRzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuCi0gICAgICAgIGVudGl0eSBiZWFuLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXBzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSByZWxhdGlvbnNoaXBzVHlwZSBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4KLSAgICAgICAgd2hpY2ggZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UKLSAgICAgICAgcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzVHlwZSBjb250YWlucyBhbiBvcHRpb25hbAotICAgICAgICBkZXNjcmlwdGlvbjsgYW5kIGEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoCi0gICAgICAgIHNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1yZWxhdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJyb2xlLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0gICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCByb2xlLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gCi0gICAgICAgICAgICAgIGEgcmVsYXRpb25zaGlwLCBidXQgY2FuIGJlIHJldXNlZCBpbiBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgcmVsYXRpb25zaGlwcy4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iLi8vamF2YWVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iLiIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSByZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSBpcyB1c2VkIGluIHRoZSBxdWVyeSBlbGVtZW50IHRvCi0gICAgICAgIHNwZWNpZnkgd2hldGhlciBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSByZXR1cm5lZCBieSBhIHF1ZXJ5Ci0gICAgICAgIGZvciBhIHNlbGVjdCBtZXRob2QgaXMgdG8gYmUgbWFwcGVkIHRvIGFuIEVKQkxvY2FsT2JqZWN0IG9yCi0gICAgICAgIEVKQk9iamVjdCB0eXBlLgotICAgICAgICAKLSAgICAgICAgVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIAotICAgICAgICBMb2NhbAotICAgICAgICBSZW1vdGUKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1pZGVudGl0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgc2VjdXJpdHktaWRlbnRpdHlUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncwotICAgICAgICBzZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotICAgICAgICBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcwotICAgICAgICBpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgICAgICBhbmQgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZS1jYWxsZXItaWRlbnRpdHkiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZW1wdHlUeXBlIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIHVzZS1jYWxsZXItaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgdGhhdAotICAgICAgICAgICAgICB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgYmUgdXNlZCBhcyB0aGUKLSAgICAgICAgICAgICAgc2VjdXJpdHkgaWRlbnRpdHkgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlCi0gICAgICAgICAgICAgIGVudGVycHJpc2UgYmVhbidzIG1ldGhvZHMuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icnVuLWFzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJ1bi1hc1R5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi1iZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBzZXNzaW9uLWJlYW5UeXBlIGRlY2xhcmVzIGFuIHNlc3Npb24gYmVhbi4gVGhlCi0gICAgICAgIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotICAgICAgICAKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgICAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotICAgICAgICAtIGFuIG9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UgCi0gICAgICAgIGljb24gZmlsZSBuYW1lCi0gICAgICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLSAgICAgICAgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRpb24KLSAgICAgICAgLSBhbiBvcHRpb25hbCBtYXBwZWQtbmFtZSBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQotICAgICAgICB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwaHlzaWNhbAotICAgICAgICBqbmRpLW5hbWUgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lL2J1c2luZXNzIGludGVyZmFjZS4gCi0gICAgICAgIFRoaXMgZWxlbWVudCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IGFsbCAKLSAgICAgICAgaW1wbGVtZW50YXRpb25zLiBBbnkgdXNlIG9mIHRoaXMgZWxlbWVudCBpcyBub24tcG9ydGFibGUuCi0gICAgICAgIC0gdGhlIG5hbWVzIG9mIGFsbCB0aGUgcmVtb3RlIG9yIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZXMsIAotICAgICAgICBpZiBhbnkKLSAgICAgICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lIGFuZAotICAgICAgICByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55Ci0gICAgICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZAotICAgICAgICBsb2NhbCBpbnRlcmZhY2VzLCBpZiBhbnkKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiB0aGF0IHRoaXMgYmVhbiBleHBvc2VzIGEKLSAgICAgICAgbm8taW50ZXJmYWNlIHZpZXcKLSAgICAgICAgLSB0aGUgbmFtZSBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3Mgd2ViIHNlcnZpY2UgZW5kcG9pbnQKLSAgICAgICAgaW50ZXJmYWNlLCBpZiBhbnkKLSAgICAgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgYSBzdGF0ZWZ1bCBzZXNzaW9uIGJlYW4ncyB0aW1lb3V0IHZhbHVlCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlc3Npb24gYmVhbidzIHRpbWVvdXQgbWV0aG9kIGZvcgotICAgICAgICBoYW5kbGluZyBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZWQgdGltZXJzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGltZXJzIHRvIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhdAotICAgICAgICBkZXBsb3ltZW50IHRpbWUKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiB0aGF0IGEgU2luZ2xldG9uIGJlYW4gaGFzIGVhZ2VyCi0gICAgICAgIGluaXRpYWxpemF0aW9uCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgYSBTaW5nbGV0b24vU3RhdGVmdWwgYmVhbidzIGNvbmN1cnJlbmN5IAotICAgICAgICBtYW5hZ2VtZW50IHR5cGUKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgbWV0aG9kIGxvY2tpbmcgbWV0YWRhdGEKLSAgICAgICAgZm9yIGEgU2luZ2xldG9uIHdpdGggY29udGFpbmVyIG1hbmFnZWQgY29uY3VycmVuY3kKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgb3RoZXIgU2luZ2xldG9uIGJlYW5zIGluIHRoZQotICAgICAgICBhcHBsaWNhdGlvbiB0aGF0IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgYmVhbgotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBhc3luY2hyb25vdXMgCi0gICAgICAgIG1ldGhvZHMKLSAgICAgICAgLSB0aGUgb3B0aW9uYWwgc2Vzc2lvbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLiAKLSAgICAgICAgSWYgaXQgaXMgbm90IHByZXNlbnQsIGl0IGlzIGRlZmF1bHRlZCB0byBDb250YWluZXIuCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgYSBzdGF0ZWZ1bCBzZXNzaW9uIGJlYW4ncyAKLSAgICAgICAgYWZ0ZXJCZWdpbiwgYmVmb3JlQ29tcGxldGlvbiwgYW5kL29yIGFmdGVyQ29tcGxldGlvbiBtZXRob2RzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIGFuZC9vcgotICAgICAgICBzdXBlcmNsYXNzIGFyb3VuZC1pbnZva2UgbWV0aG9kcy4KLSAgICAgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgYW5kL29yCi0gICAgICAgIHN1cGVyY2xhc3MgYXJvdW5kLXRpbWVvdXQgbWV0aG9kcy4KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIAotICAgICAgICBlbnZpcm9ubWVudCBlbnRyaWVzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgCi0gICAgICAgIEVKQiByZWZlcmVuY2VzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIgCi0gICAgICAgIHNlcnZpY2UgcmVmZXJlbmNlcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIAotICAgICAgICByZWZlcmVuY2VzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IAotICAgICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UgCi0gICAgICAgIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIAotICAgICAgICBlbnZpcm9ubWVudCByZWZlcmVuY2VzLgotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZSAKLSAgICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotICAgICAgICAKLSAgICAgICAgVGhlIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZQotICAgICAgICB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgd2hlbiBpZiBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZQotICAgICAgICBlbXB0eS4KLSAgICAgICAgCi0gICAgICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGlmIHRoZQotICAgICAgICBiZWFuIGlzIGEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbi4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob21lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpob21lVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJlbW90ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bG9jYWwtaG9tZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxvY2FsVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJidXNpbmVzcy1sb2NhbCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJidXNpbmVzcy1yZW1vdGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtYmVhbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBsb2NhbC1iZWFuIGVsZW1lbnQgZGVjbGFyZXMgdGhhdCB0aGlzCi0gICAgICAgICAgICBzZXNzaW9uIGJlYW4gZXhwb3NlcyBhIG5vLWludGVyZmFjZSBMb2NhbCBjbGllbnQgdmlldy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtZW5kcG9pbnQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBjb250YWlucyB0aGUKLSAgICAgICAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyB3ZWIKLSAgICAgICAgICAgIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLiBUaGUgc2VydmljZS1lbmRwb2ludAotICAgICAgICAgICAgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgZm9yIGEgc3RhdGVsZXNzCi0gICAgICAgICAgICBzZXNzaW9uIGJlYW4uIFRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIG11c3QgYmUgYQotICAgICAgICAgICAgdmFsaWQgSkFYLVJQQyBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWpiLWNsYXNzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZQotICAgICAgICAgICAgb2YgdGhlIGJlYW4gY2xhc3MgZm9yIHRoaXMgZWpiLiAgSXQgaXMgcmVxdWlyZWQgdW5sZXNzCi0gICAgICAgICAgICB0aGVyZSBpcyBhIGNvbXBvbmVudC1kZWZpbmluZyBhbm5vdGF0aW9uIGZvciB0aGUgc2FtZQotICAgICAgICAgICAgZWpiLW5hbWUuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlc3Npb24tdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RhdGVmdWwtdGltZW91dCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RhdGVmdWwtdGltZW91dFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGltZW91dC1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHRpbWVvdXQtbWV0aG9kIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXRob2QgdGhhdAotICAgICAgICAgICAgd2lsbCByZWNlaXZlIGNhbGxiYWNrcyBmb3IgcHJvZ3JhbW1hdGljYWxseQotICAgICAgICAgICAgY3JlYXRlZCB0aW1lcnMuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aW1lciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dGltZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtb24tc3RhcnR1cCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGluaXQtb24tc3RhcnR1cCBlbGVtZW50IHNwZWNpZmllcyB0aGF0IGEgU2luZ2xldG9uCi0gICAgICAgICAgICBiZWFuIGhhcyBlYWdlciBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIHNpbmdsZXRvbiBzZXNzaW9uCi0gICAgICAgICAgICBiZWFucy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmN1cnJlbmN5LW1hbmFnZW1lbnQtdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y29uY3VycmVuY3ktbWFuYWdlbWVudC10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25jdXJyZW50LW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y29uY3VycmVudC1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlcGVuZHMtb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlcGVuZHMtb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTppbml0LW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGluaXQtbWV0aG9kIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtYXBwaW5ncyBmb3IKLSAgICAgICAgICAgIEVKQiAyLnggc3R5bGUgY3JlYXRlIG1ldGhvZHMgZm9yIGFuIEVKQiAzLnggYmVhbi4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIHN0YXRlZnVsIAotICAgICAgICAgICAgc2Vzc2lvbiBiZWFucy4gCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdmUtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZW1vdmUtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgcmVtb3ZlLW1ldGhvZCBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWFwcGluZ3MgZm9yCi0gICAgICAgICAgICBFSkIgMi54IHN0eWxlIHJlbW92ZSBtZXRob2RzIGZvciBhbiBFSkIgMy54IGJlYW4uCi0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBzdGF0ZWZ1bCAKLSAgICAgICAgICAgIHNlc3Npb24gYmVhbnMuIAotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXN5bmMtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphc3luYy1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRyYW5zYWN0aW9uLXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFmdGVyLWJlZ2luLW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bmFtZWQtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiZWZvcmUtY29tcGxldGlvbi1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWZ0ZXItY29tcGxldGlvbi1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXJvdW5kLWludm9rZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXJvdW5kLWludm9rZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXJvdW5kLXRpbWVvdXQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFyb3VuZC10aW1lb3V0VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1hY3RpdmF0ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGFzc2l2YXRlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsaWZlY3ljbGUtY2FsbGJhY2tUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LWlkZW50aXR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBzZXNzaW9uLXR5cGVUeXBlIGRlc2NyaWJlcyB3aGV0aGVyIHRoZSBzZXNzaW9uIGJlYW4gaXMgYQotICAgICAgICBzaW5nbGV0b24sIHN0YXRlZnVsIG9yIHN0YXRlbGVzcyBzZXNzaW9uLiBJdCBpcyB1c2VkIGJ5Ci0gICAgICAgIHNlc3Npb24tdHlwZSBlbGVtZW50cy4KLSAgICAgICAgCi0gICAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdGhyZWUgZm9sbG93aW5nOgotICAgICAgICAKLSAgICAgICAgU2luZ2xldG9uCi0gICAgICAgIFN0YXRlZnVsCi0gICAgICAgIFN0YXRlbGVzcwotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGV0b24iLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVmdWwiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVsZXNzIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdGF0ZWZ1bC10aW1lb3V0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBzdGF0ZWZ1bC10aW1lb3V0VHlwZSByZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgdGltZQotICAgICAgICBhIHN0YXRlZnVsIHNlc3Npb24gYmVhbiBjYW4gYmUgaWRsZShub3QgcmVjZWl2ZSBhbnkgY2xpZW50Ci0gICAgICAgIGludm9jYXRpb25zKSBiZWZvcmUgaXQgaXMgZWxpZ2libGUgZm9yIHJlbW92YWwgYnkgdGhlIGNvbnRhaW5lci4KLSAgICAgICAgCi0gICAgICAgIEEgdGltZW91dCB2YWx1ZSBvZiAwIG1lYW5zIHRoZSBiZWFuIGlzIGltbWVkaWF0ZWx5IGVsaWdpYmxlIGZvciByZW1vdmFsLgotICAgICAgICAKLSAgICAgICAgQSB0aW1lb3V0IHZhbHVlIG9mIC0xIG1lYW5zIHRoZSBiZWFuIHdpbGwgbmV2ZXIgYmUgcmVtb3ZlZCBkdWUgdG8gdGltZW91dC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aW1lb3V0IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RJbnRlZ2VyVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRpbWUtdW5pdC10eXBlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lLXVuaXQtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgdGltZS11bml0LXR5cGVUeXBlIHJlcHJlc2VudHMgYSB0aW1lIGR1cmF0aW9uIGF0IGEgZ2l2ZW4KLSAgICAgICAgdW5pdCBvZiBncmFudWxhcml0eS4gIAotICAgICAgICAKLSAgICAgICAgVGhlIHRpbWUgdW5pdCB0eXBlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgOgotICAgICAgICAKLSAgICAgICAgRGF5cwotICAgICAgICBIb3VycwotICAgICAgICBNaW51dGVzCi0gICAgICAgIFNlY29uZHMKLSAgICAgICAgTWlsbGlzZWNvbmRzCi0gICAgICAgIE1pY3Jvc2Vjb25kcwotICAgICAgICBOYW5vc2Vjb25kcwotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbnV0ZXMiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kcyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsaXNlY29uZHMiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWljcm9zZWNvbmRzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbm9zZWNvbmRzIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lci1zY2hlZHVsZVR5cGUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vjb25kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWludXRlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG91ciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRheS1vZi1tb250aCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1vbnRoIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF5LW9mLXdlZWsiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ5ZWFyIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSB0aW1lclR5cGUgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbiB0aW1lci4gIEVhY2gKLSAgICAgICAgdGltZXIgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHRoZSBjb250YWluZXIgdXBvbgotICAgICAgICBkZXBsb3ltZW50LiAgVGltZXIgY2FsbGJhY2tzIG9jY3VyIGJhc2VkIG9uIHRoZSAKLSAgICAgICAgc2NoZWR1bGUgYXR0cmlidXRlcy4gIEFsbCBjYWxsYmFja3MgYXJlIG1hZGUgdG8gdGhlCi0gICAgICAgIHRpbWVvdXQtbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGltZXIuICAKLSAgICAgICAgCi0gICAgICAgIEEgdGltZXIgY2FuIGhhdmUgYW4gb3B0aW9uYWwgc3RhcnQgYW5kL29yIGVuZCBkYXRlLiBJZgotICAgICAgICBhIHN0YXJ0IGRhdGUgaXMgc3BlY2lmaWVkLCBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlCi0gICAgICAgIGFzc29jaWF0ZWQgdGltZXIgc2NoZWR1bGUgc3VjaCB0aGF0IGFueSBtYXRjaGluZwotICAgICAgICBleHBpcmF0aW9ucyBwcmlvciB0byB0aGUgc3RhcnQgdGltZSB3aWxsIG5vdCBvY2N1ci4KLSAgICAgICAgTGlrZXdpc2UsIG5vIG1hdGNoaW5nIGV4cGlyYXRpb25zIHdpbGwgb2NjdXIgYWZ0ZXIgYW55Ci0gICAgICAgIGVuZCBkYXRlLiAgIFN0YXJ0L0VuZCBkYXRlcyBhcmUgc3BlY2lmaWVkIHVzaW5nIHRoZQotICAgICAgICBYTUwgU2NoZW1hIGRhdGVUaW1lIHR5cGUsIHdoaWNoIGZvbGxvd3MgdGhlIElTTy04NjAxCi0gICAgICAgIHN0YW5kYXJkIGZvciBkYXRlKGFuZCBvcHRpb25hbCB0aW1lLXdpdGhpbi10aGUtZGF5KSAKLSAgICAgICAgcmVwcmVzZW50YXRpb24uCi0gICAgICAgIAotICAgICAgICBBbiBvcHRpb25hbCBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgd2hldGhlcgotICAgICAgICB0aGlzIHRpbWVyIGhhcyBwZXJzaXN0ZW50KHRydWUpIGRlbGl2ZXJ5IHNlbWFudGljcyBvcgotICAgICAgICBub24tcGVyc2lzdGVudChmYWxzZSkgZGVsaXZlcnkgc2VtYW50aWNzLiAgSWYgbm90IHNwZWNpZmllZCwKLSAgICAgICAgdGhlIHZhbHVlIGRlZmF1bHRzIHRvIHBlcnNpc3RlbnQodHJ1ZSkuCi0gICAgICAgIAotICAgICAgICBBIHRpbWUgem9uZSBjYW4gb3B0aW9uYWxseSBiZSBhc3NvY2lhdGVkIHdpdGggYSB0aW1lci4KLSAgICAgICAgSWYgc3BlY2lmaWVkLCB0aGUgdGltZXIncyBzY2hlZHVsZSBpcyBldmFsdWF0ZWQgaW4gdGhlIGNvbnRleHQKLSAgICAgICAgb2YgdGhhdCB0aW1lIHpvbmUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGRlZmF1bHQgdGltZSB6b25lIGluIHdoaWNoCi0gICAgICAgIHRoZSBjb250YWluZXIgaXMgZXhlY3V0aW5nLiAgIFRpbWUgem9uZXMgYXJlIHNwZWNpZmllZCBhcyBhbgotICAgICAgICBJRCBzdHJpbmcuICBUaGUgc2V0IG9mIHJlcXVpcmVkIHRpbWUgem9uZSBJRHMgaXMgZGVmaW5lZCBieQotICAgICAgICB0aGUgWm9uZSBOYW1lKFRaKSBjb2x1bW4gb2YgdGhlIHB1YmxpYyBkb21haW4gem9uZWluZm8gZGF0YWJhc2UuCi0gICAgICAgIAotICAgICAgICBBbiBvcHRpb25hbCBpbmZvIHN0cmluZyBjYW4gYmUgYXNzaWduZWQgdG8gdGhlIHRpbWVyIGFuZCAKLSAgICAgICAgcmV0cmlldmVkIGF0IHJ1bnRpbWUgdGhyb3VnaCB0aGUgVGltZXIuZ2V0SW5mbygpIG1ldGhvZC4KLSAgICAgICAgCi0gICAgICAgIFRoZSB0aW1lclR5cGUgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIG9uIHN0YXRlbGVzcyBzZXNzaW9uCi0gICAgICAgIGJlYW5zLCBzaW5nbGV0b24gc2Vzc2lvbiBiZWFucywgYW5kIG1lc3NhZ2UtZHJpdmVuIGJlYW5zLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZWR1bGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRpbWVyLXNjaGVkdWxlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0YXJ0IgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpkYXRlVGltZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmRhdGVUaW1lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRpbWVvdXQtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVudCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGltZXpvbmUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmZvIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zLWF0dHJpYnV0ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgdHJhbnMtYXR0cmlidXRlVHlwZSBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdAotICAgICAgICBtYW5hZ2UgdGhlIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kIAotICAgICAgICBpbnZvY2F0aW9uIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzIG1ldGhvZC4gCi0gICAgICAgIAotICAgICAgICBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogCi0gICAgICAgIAotICAgICAgICBOb3RTdXBwb3J0ZWQgCi0gICAgICAgIFN1cHBvcnRzIAotICAgICAgICBSZXF1aXJlZCAgCi0gICAgICAgIFJlcXVpcmVzTmV3IAotICAgICAgICBNYW5kYXRvcnkgCi0gICAgICAgIE5ldmVyIAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RTdXBwb3J0ZWQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcG9ydHMiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZWQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZXNOZXciLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuZGF0b3J5Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSB0cmFuc2FjdGlvbi10eXBlVHlwZSBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLSAgICAgICAgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLgotICAgICAgICAKLSAgICAgICAgVGhlIHRyYW5zYWN0aW9uLXR5cGUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0gICAgICAgIAotICAgICAgICBCZWFuCi0gICAgICAgIENvbnRhaW5lcgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFuIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZmFjZWxldC10YWdsaWJfMV8wLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZmFjZWxldC10YWdsaWJfMV8wLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAzNmQwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08IS0tCi0gQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIExpY2Vuc2VkIHVuZGVyIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlLAotIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAKLSAgIGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsLwotICAgCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIAotIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAKLSAkSWQ6IGZhY2VsZXQtdGFnbGliXzFfMC5kdGQsdiAxLjEgMjAxMC8wMi8xMCAwMjoxNDo1MSBkYXZpZF93aWxsaWFtcyBFeHAgJAotLS0+Ci0KLTwhRUxFTUVOVCBmYWNlbGV0LXRhZ2xpYiAobGlicmFyeS1jbGFzc3wobmFtZXNwYWNlLCh0YWd8ZnVuY3Rpb24pKykpPgotPCFBVFRMSVNUIGZhY2VsZXQtdGFnbGliIHhtbG5zIENEQVRBICNGSVhFRCAiaHR0cDovL2phdmEuc3VuLmNvbS9KU0YvRmFjZWxldCI+Ci08IUVMRU1FTlQgbmFtZXNwYWNlICgjUENEQVRBKT4KLTwhRUxFTUVOVCBsaWJyYXJ5LWNsYXNzICgjUENEQVRBKT4KLTwhRUxFTUVOVCB0YWcgKHRhZy1uYW1lLChoYW5kbGVyLWNsYXNzfGNvbXBvbmVudHxjb252ZXJ0ZXJ8dmFsaWRhdG9yfHNvdXJjZSkpPgotPCFFTEVNRU5UIHRhZy1uYW1lICgjUENEQVRBKT4KLTwhRUxFTUVOVCBoYW5kbGVyLWNsYXNzICgjUENEQVRBKT4KLTwhRUxFTUVOVCBjb21wb25lbnQgKGNvbXBvbmVudC10eXBlLHJlbmRlcmVyLXR5cGU/LGhhbmRsZXItY2xhc3M/KT4KLTwhRUxFTUVOVCBjb21wb25lbnQtdHlwZSAoI1BDREFUQSk+Ci08IUVMRU1FTlQgcmVuZGVyZXItdHlwZSAoI1BDREFUQSk+Ci08IUVMRU1FTlQgY29udmVydGVyIChjb252ZXJ0ZXItaWQsIGhhbmRsZXItY2xhc3M/KT4KLTwhRUxFTUVOVCBjb252ZXJ0ZXItaWQgKCNQQ0RBVEEpPgotPCFFTEVNRU5UIHZhbGlkYXRvciAodmFsaWRhdG9yLWlkLCBoYW5kbGVyLWNsYXNzPyk+Ci08IUVMRU1FTlQgdmFsaWRhdG9yLWlkICgjUENEQVRBKT4KLTwhRUxFTUVOVCBzb3VyY2UgKCNQQ0RBVEEpPgotPCFFTEVNRU5UIGZ1bmN0aW9uIChmdW5jdGlvbi1uYW1lLGZ1bmN0aW9uLWNsYXNzLGZ1bmN0aW9uLXNpZ25hdHVyZSk+Ci08IUVMRU1FTlQgZnVuY3Rpb24tbmFtZSAoI1BDREFUQSk+Ci08IUVMRU1FTlQgZnVuY3Rpb24tY2xhc3MgKCNQQ0RBVEEpPgotPCFFTEVNRU5UIGZ1bmN0aW9uLXNpZ25hdHVyZSAoI1BDREFUQSk+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfMV80LnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV8xXzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjIzMzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV8xXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTYwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYQotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjEuNCI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpajJlZV8xXzQueHNkcwkxLjQzIDAzLzA5LzE2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgYXBwZWFyIGluIHRoZSBjb21tb24KLXNoYXJlYWJsZSBzY2hlbWEocykgb2YgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHNob3VsZCBiZQotaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb250ZXh0IHRoZXkgYXJlIGluY2x1ZGVkOgotCi1EZXBsb3ltZW50IENvbXBvbmVudCBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgajJlZSBhcHBsaWNhdGlvbjsKLSAgICBhcHBsaWNhdGlvbiBjbGllbnQ7Ci0gICAgd2ViIGFwcGxpY2F0aW9uOwotICAgIGVudGVycHJpc2UgYmVhbjsKLSAgICByZXNvdXJjZSBhZGFwdGVyOwotCi1EZXBsb3ltZW50IEZpbGUgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgIGVhciBmaWxlOwotICAgIHdhciBmaWxlOwotICAgIGphciBmaWxlOwotICAgIHJhciBmaWxlOwotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLQkgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPQotCSJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Z3JvdXAgbmFtZT0iZGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBncm91cCBrZWVwcyB0aGUgdXNhZ2Ugb2YgdGhlIGNvbnRhaW5lZCBkZXNjcmlwdGlvbiByZWxhdGVkCi0JZWxlbWVudHMgY29uc2lzdGVudCBhY3Jvc3MgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLgotCi0JQWxsIGVsZW1lbnRzIG1heSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudCBsYW5ndWFnZXMsCi0JdG8gc3VwcG9ydCBsb2NhbGl6YXRpb24gb2YgdGhlIGNvbnRlbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLQkJICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLQkJICAgdHlwZT0iajJlZTppY29uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpncm91cD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVzY3JpcHRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZGVzY3JpcHRpb24gdHlwZSBpcyB1c2VkIGJ5IGEgZGVzY3JpcHRpb24gZWxlbWVudCB0bwotCXByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBlbGVtZW50cwotCXRoYXQgdXNlIHRoaXMgdHlwZSBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUKLQlEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZSBmaWxlIHByb2R1Y2VyIHdhbnRzCi0JdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLQlEZXBsb3ltZW50IEZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlCi0JdG9vbHMgdXNlZCBieSBzdWNoIGEgRGVwbG95bWVudCBGaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheQotCXRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQKLQljb250YWlucyB0aGUgZGVzY3JpcHRpb24uCi0KLQlUaGUgbGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLQlkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBpbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqMmVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkZXdleS12ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGRlZmluZXMgYSBkZXdleSBkZWNpbWFsIHdoaWNoIGlzIHVzZWQKLQl0byBkZXNjcmliZSB2ZXJzaW9ucyBvZiBkb2N1bWVudHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgPHhzZDp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc3BsYXktbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIGRpc3BsYXktbmFtZSB0eXBlIGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkCi0JICB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMuIEl0IGlzIHVzZWQgYnkgZGlzcGxheS1uYW1lCi0JICBlbGVtZW50cy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgotCi0JICBFeGFtcGxlOgotCi0JICAuLi4KLQkgICAgIDxkaXNwbGF5LW5hbWUgeG1sOmxhbmc9ImVuIj5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLQotCSAgVGhlIHZhbHVlIG9mIHRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgaXMgImVuIiAoRW5nbGlzaCkgYnkgZGVmYXVsdC4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWxpbmtUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItbGlua1R5cGUgaXMgdXNlZCBieSBlamItbGluawotCSAgZWxlbWVudHMgaW4gdGhlIGVqYi1yZWYgb3IgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyB0byBzcGVjaWZ5Ci0JICB0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGVudGVycHJpc2UgYmVhbi4KLQotCSAgVGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuCi0JICBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIHNhbWUgZWpiLWphciBmaWxlIG9yIGluIGFub3RoZXIgZWpiLWphcgotCSAgZmlsZSBpbiB0aGUgc2FtZSBKMkVFIGFwcGxpY2F0aW9uIHVuaXQuCi0KLQkgIEFsdGVybmF0aXZlbHksIHRoZSBuYW1lIGluIHRoZSBlamItbGluayBlbGVtZW50IG1heSBiZQotCSAgY29tcG9zZWQgb2YgYSBwYXRoIG5hbWUgc3BlY2lmeWluZyB0aGUgZWpiLWphciBjb250YWluaW5nIHRoZQotCSAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4gd2l0aCB0aGUgZWpiLW5hbWUgb2YgdGhlIHRhcmdldAotCSAgYmVhbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGggbmFtZSBieSAiIyIuICBUaGUKLQkgIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlIGNvbnRhaW5pbmcKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UKLQkgIGJlYW4uICBUaGlzIGFsbG93cyBtdWx0aXBsZSBlbnRlcnByaXNlIGJlYW5zIHdpdGggdGhlIHNhbWUKLQkgIGVqYi1uYW1lIHRvIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCi0KLQkgIEV4YW1wbGVzOgotCi0JICAgICAgPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLQotCSAgICAgIDxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItbG9jYWwtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVqYi1sb2NhbC1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyBmb3IKLQl0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwKLQlob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgRGVwbG95bWVudAotCSAgICAgIENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbgotCSAgICAtIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCSAgICAtIHRoZSBleHBlY3RlZCBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9mIHRoZQotCSAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0JICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKLQkgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIKLQkJICAgdHlwZT0iajJlZTplamItcmVmLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi10eXBlIgotCQkgICB0eXBlPSJqMmVlOmVqYi1yZWYtdHlwZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbC1ob21lIgotCQkgICB0eXBlPSJqMmVlOmxvY2FsLWhvbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwiCi0JCSAgIHR5cGU9ImoyZWU6bG9jYWxUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWxpbmsiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLWxpbmtUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50LgotCi0JICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmpuZGktbmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlZi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVqYi1yZWYtdHlwZVR5cGUgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlCi0JcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0KLQlUaGUgZWpiLXJlZi10eXBlIGRlc2lnbmF0ZXMgYSB2YWx1ZQotCXRoYXQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCSAgICBFbnRpdHkKLQkgICAgU2Vzc2lvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vzc2lvbiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWpiLXJlZlR5cGUgaXMgdXNlZCBieSBlamItcmVmIGVsZW1lbnRzIGZvciB0aGUKLQlkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBob21lLiBUaGUKLQlkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mCi0JICAgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZQotCSAgICAgIGJlYW4KLQkgICAgLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQkgICAgLSB0aGUgZXhwZWN0ZWQgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQKLQkgICAgICBlbnRlcnByaXNlIGJlYW4KLQkgICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQotCSAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmVqYi1yZWYtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLXJlZi10eXBlVHlwZSIvPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG9tZSIKLQkJICAgdHlwZT0iajJlZTpob21lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLQkJICAgdHlwZT0iajJlZTpyZW1vdGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWxpbmsiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLWxpbmtUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBpcyB1c2VkIHRvIGRlc2lnbmF0ZSBhbiBlbXB0eQotCWVsZW1lbnQgd2hlbiB1c2VkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGlzIHR5cGUgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YgdGhlCi0JICBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZQotCSAgYXBwbGljYXRpb24ncyBjb2RlLgotCi0JICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGU6Ci0KLQkgICAgICBqYXZhLmxhbmcuQm9vbGVhbgotCSAgICAgIGphdmEubGFuZy5CeXRlCi0JICAgICAgamF2YS5sYW5nLkNoYXJhY3RlcgotCSAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgICAgICBqYXZhLmxhbmcuU2hvcnQKLQkgICAgICBqYXZhLmxhbmcuSW50ZWdlcgotCSAgICAgIGphdmEubGFuZy5Mb25nCi0JICAgICAgamF2YS5sYW5nLkZsb2F0Ci0JICAgICAgamF2YS5sYW5nLkRvdWJsZQotCi0JICBFeGFtcGxlOgotCi0JICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQm9vbGVhbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5CeXRlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkNoYXJhY3RlciIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TdHJpbmciLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU2hvcnQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuSW50ZWdlciIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Mb25nIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkRvdWJsZSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudi1lbnRyeVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbnYtZW50cnlUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhbiBhcHBsaWNhdGlvbidzCi0JZW52aXJvbm1lbnQgZW50cnkuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotCWRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbgotCW9wdGlvbmFsIHZhbHVlLiAgSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCBvbmUgbXVzdCBiZQotCXN1cHBsaWVkIGR1cmluZyBkZXBsb3ltZW50LgotCi0JSXQgaXMgdXNlZCBieSBlbnYtZW50cnkgZWxlbWVudHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUKLQkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotCSAgICAgIGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYQotCSAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50LiBUaGUgdW5pcXVlbmVzcwotCSAgICAgIGNvbnN0cmFpbnRzIG11c3QgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGRlY2xhcmVkCi0JICAgICAgY29udGV4dC4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkgICAgICA8ZW52LWVudHJ5LW5hbWU+bWluQW1vdW50PC9lbnYtZW50cnktbmFtZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS10eXBlIgotCQkgICB0eXBlPSJqMmVlOmVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS12YWx1ZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZW52LWVudHJ5LXZhbHVlIGRlc2lnbmF0ZXMgdGhlIHZhbHVlIG9mIGEKLQkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUKLQkgICAgICBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZQotCSAgICAgIGNvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEKLQkgICAgICBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlciwgb3IgZm9yIGphdmEubGFuZy5DaGFyYWN0ZXIsCi0JICAgICAgYSBzaW5nbGUgY2hhcmFjdGVyLgotCi0JICAgICAgRXhhbXBsZToKLQotCSAgICAgIDxlbnYtZW50cnktdmFsdWU+MTAwLjAwPC9lbnYtZW50cnktdmFsdWU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSB0aGUgbmFtZSBvZiBhCi0JSmF2YSBjbGFzcyBvciBpbnRlcmZhY2UuICBUaGUgbmFtZSBpcyBpbiB0aGUgZm9ybSBvZiBhCi0JImJpbmFyeSBuYW1lIiwgYXMgZGVmaW5lZCBpbiB0aGUgSkxTLiAgVGhpcyBpcyB0aGUgZm9ybQotCW9mIG5hbWUgdXNlZCBpbiBDbGFzcy5mb3JOYW1lKCkuICBUb29scyB0aGF0IG5lZWQgdGhlCi0JY2Fub25pY2FsIG5hbWUgKHRoZSBuYW1lIHVzZWQgaW4gc291cmNlIGNvZGUpIHdpbGwgbmVlZAotCXRvIGNvbnZlcnQgdGhpcyBiaW5hcnkgbmFtZSB0byB0aGUgY2Fub25pY2FsIG5hbWUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyaWMtYm9vbGVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBkZWZpbmVzIGZvdXIgZGlmZmVyZW50IHZhbHVlcyB3aGljaCBjYW4gZGVzaWduYXRlCi0JYm9vbGVhbiB2YWx1ZXMuIFRoaXMgaW5jbHVkZXMgdmFsdWVzIHllcyBhbmQgbm8gd2hpY2ggYXJlCi0Jbm90IGRlc2lnbmF0ZWQgYnkgeHNkOmJvb2xlYW4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRydWUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmYWxzZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InllcyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaG9tZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIGhvbWVUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mCi0JICBhbiBlbnRlcnByaXNlIGJlYW4ncyBob21lIGludGVyZmFjZS4KLQotCSAgRXhhbXBsZToKLQotCSAgICAgIDxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC9ob21lPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpY29uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGljb24gdHlwZSBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzCi0JdGhhdCBzcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGIG9yCi0JSlBFRyBpY29uIGltYWdlcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYQotCUdVSSB0b29sLgotCi0JVGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQotCWljb24gZmlsZSBuYW1lcyBhcmUgcHJvdmlkZWQgaW4uIEl0cyB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKQotCWJ5IGRlZmF1bHQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic21hbGwtaWNvbiIgdHlwZT0iajJlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLQkgICAgICBjb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi0JICAgICAgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50Ci0JICAgICAgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlLgotCi0JICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLQkgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkgICAgICA8c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGFyZ2UtaWNvbiIgdHlwZT0iajJlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLQkgICAgICBjb250YWluaW5nIGEgbGFyZ2UKLQkgICAgICAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlCi0JICAgICAgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudAotCSAgICAgIEZpbGUuCi0KLQkgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotCSAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi0JICAgICAgRXhhbXBsZToKLQotCSAgICAgIDxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1pZGVudGlmaWVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGphdmEtaWRlbnRpZmllclR5cGUgZGVmaW5lcyBhIEphdmEgaWRlbnRpZmllci4KLQlUaGUgdXNlcnMgb2YgdGhpcyB0eXBlIHNob3VsZCBmdXJ0aGVyIHZlcmlmeSB0aGF0Ci0JdGhlIGNvbnRlbnQgZG9lcyBub3QgY29udGFpbiBKYXZhIHJlc2VydmVkIGtleXdvcmRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSIoJHxffFxwe0x9KShccHtMfXxccHtOZH18X3wkKSoiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIGlzIGEgZ2VuZXJpYyB0eXBlIHRoYXQgZGVzaWduYXRlcyBhIEphdmEgcHJpbWl0aXZlCi0JdHlwZSBvciBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBpbnRlcmZhY2UvdHlwZSwKLQlvciBhbiBhcnJheSBvZiBzdWNoIHR5cGVzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSJbXlxwe1p9XSoiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbmRpLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgam5kaS1uYW1lVHlwZSB0eXBlIGRlc2lnbmF0ZXMgYSBKTkRJIG5hbWUgaW4gdGhlCi0JRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JamF2YTpjb21wL2VudiBjb250ZXh0LiAgQSBKTkRJIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotCURlcGxveW1lbnQgQ29tcG9uZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgSk5ESSBlbnZpcm9ubWVudAotCXJlZmVyZW5jZSBlbGVtZW50cyBjb25zaXN0ZW50IGFjcm9zcyBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeSIKLQkJICAgdHlwZT0iajJlZTplbnYtZW50cnlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZiIKLQkJICAgdHlwZT0iajJlZTplamItcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLWxvY2FsLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOnNlcnZpY2UtcmVmR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6cmVzb3VyY2UtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6cmVzb3VyY2UtZW52LXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imxpc3RlbmVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxpc3RlbmVyVHlwZSBpbmRpY2F0ZXMgdGhlIGRlcGxveW1lbnQgcHJvcGVydGllcyBmb3IgYSB3ZWIKLQlhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZQotCSAgICBhcHBsaWNhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIKLQkgICAgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4gVGhlIHZhbHVlIGlzIHRoZSBmdWxseQotCSAgICBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBsaXN0ZW5lciBjbGFzcy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbC1ob21lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvY2FsLWhvbWVUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZAotCW5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaG9tZSBpbnRlcmZhY2UuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbFR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KLQllbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBpbnRlcmZhY2UuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSBpcyB1c2VkIHRvIGxpbmsgYSBtZXNzYWdlCi0JZGVzdGluYXRpb24gcmVmZXJlbmNlIG9yIG1lc3NhZ2UtZHJpdmVuIGJlYW4gdG8gYSBtZXNzYWdlCi0JZGVzdGluYXRpb24uCi0KLQlUaGUgQXNzZW1ibGVyIHNldHMgdGhlIHZhbHVlIHRvIHJlZmxlY3QgdGhlIGZsb3cgb2YgbWVzc2FnZXMKLQliZXR3ZWVuIHByb2R1Y2VycyBhbmQgY29uc3VtZXJzIGluIHRoZSBhcHBsaWNhdGlvbi4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgb2YgYSBtZXNzYWdlCi0JZGVzdGluYXRpb24gaW4gdGhlIHNhbWUgRGVwbG95bWVudCBGaWxlIG9yIGluIGFub3RoZXIKLQlEZXBsb3ltZW50IEZpbGUgaW4gdGhlIHNhbWUgSjJFRSBhcHBsaWNhdGlvbiB1bml0LgotCi0JQWx0ZXJuYXRpdmVseSwgdGhlIHZhbHVlIG1heSBiZSBjb21wb3NlZCBvZiBhIHBhdGggbmFtZQotCXNwZWNpZnlpbmcgYSBEZXBsb3ltZW50IEZpbGUgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZAotCW1lc3NhZ2UgZGVzdGluYXRpb24gd2l0aCB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIG9mIHRoZQotCWRlc3RpbmF0aW9uIGFwcGVuZGVkIGFuZCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aCBuYW1lIGJ5Ci0JIiMiLiBUaGUgcGF0aCBuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBEZXBsb3ltZW50IEZpbGUKLQljb250YWluaW5nIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlCi0JbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgYWxsb3dzIG11bHRpcGxlIG1lc3NhZ2UKLQlkZXN0aW5hdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uCi0JICBvZiBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhIG1lc3NhZ2UgZGVzdGluYXRpb24KLQkgIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLQkgIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjoKLQotCQkgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkJICAtIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lCi0JCSAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiB0eXBlCi0JCSAgLSBhIHNwZWNpZmljYXRpb24gYXMgdG8gd2hldGhlciB0aGUKLQkJICAgIGRlc3RpbmF0aW9uIGlzIHVzZWQgZm9yCi0JCSAgICBjb25zdW1pbmcgb3IgcHJvZHVjaW5nIG1lc3NhZ2VzLCBvciBib3RoCi0JCSAgLSBhIGxpbmsgdG8gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24KLQotCSAgRXhhbXBsZXM6Ci0KLQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPkNvbnN1bWVzCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Q29ycG9yYXRlU3RvY2tzCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Ci0JICA8L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0JICAgIHRoZSBuYW1lIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cwotCSAgICB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi0JICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlCi0JICAgIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLWphciAoZm9yIGVudGVycHJpc2UgYmVhbnMpIG9yIGEKLQkgICAgRGVwbG95bWVudCBGaWxlIChmb3Igb3RoZXJzKS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UiCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIHNwZWNpZmllcyB0aGUgdHlwZSBvZgotCSAgdGhlIGRlc3RpbmF0aW9uLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIEphdmEgaW50ZXJmYWNlCi0JICBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVzdGluYXRpb24uCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWUKLQkgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUgc3BlY2lmaWVzIHRoZSB1c2Ugb2YgdGhlCi0JbWVzc2FnZSBkZXN0aW5hdGlvbiBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS4gIFRoZSB2YWx1ZQotCWluZGljYXRlcyB3aGV0aGVyIG1lc3NhZ2VzIGFyZSBjb25zdW1lZCBmcm9tIHRoZSBtZXNzYWdlCi0JZGVzdGluYXRpb24sIHByb2R1Y2VkIGZvciB0aGUgZGVzdGluYXRpb24sIG9yIGJvdGguICBUaGUKLQlBc3NlbWJsZXIgbWFrZXMgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24gaW4gbGlua2luZyBwcm9kdWNlcnMKLQlvZiBhIGRlc3RpbmF0aW9uIHdpdGggaXRzIGNvbnN1bWVycy4KLQotCVRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSBlbGVtZW50IG11c3QgYmUKLQlvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkgICAgQ29uc3VtZXMKLQkgICAgUHJvZHVjZXMKLQkgICAgQ29uc3VtZXNQcm9kdWNlcwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXMiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlcyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVzUHJvZHVjZXMiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvblR5cGUgc3BlY2lmaWVzIGEgbWVzc2FnZQotCSAgZGVzdGluYXRpb24uIFRoZSBsb2dpY2FsIGRlc3RpbmF0aW9uIGRlc2NyaWJlZCBieSB0aGlzCi0JICBlbGVtZW50IGlzIG1hcHBlZCB0byBhIHBoeXNpY2FsIGRlc3RpbmF0aW9uIGJ5IHRoZSBEZXBsb3llci4KLQotCSAgVGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gZWxlbWVudCBjb250YWluczoKLQotCQkgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkJICAtIGFuIG9wdGlvbmFsIGRpc3BsYXktbmFtZQotCQkgIC0gYW4gb3B0aW9uYWwgaWNvbgotCQkgIC0gYSBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWUgd2hpY2ggbXVzdCBiZSB1bmlxdWUKLQkJICAgIGFtb25nIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZXMgd2l0aGluIHRoZSBzYW1lCi0JCSAgICBEZXBsb3ltZW50IEZpbGUuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Q29ycG9yYXRlU3RvY2tzCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Ci0JICA8L21lc3NhZ2UtZGVzdGluYXRpb24+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYQotCSAgICBuYW1lIGZvciBhIG1lc3NhZ2UgZGVzdGluYXRpb24uICBUaGlzIG5hbWUgbXVzdCBiZQotCSAgICB1bmlxdWUgYW1vbmcgdGhlIG5hbWVzIG9mIG1lc3NhZ2UgZGVzdGluYXRpb25zCi0JICAgIHdpdGhpbiB0aGUgRGVwbG95bWVudCBGaWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcmFtLXZhbHVlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGlzIGEgZ2VuZXJhbCB0eXBlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjbGFyZQotCXBhcmFtZXRlci92YWx1ZSBsaXN0cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwYXJhbS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICBwYXJhbWV0ZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbS12YWx1ZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEKLQkgICAgcGFyYW1ldGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhdGhUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSBlaXRoZXIgYSByZWxhdGl2ZQotCXBhdGggb3IgYW4gYWJzb2x1dGUgcGF0aCBzdGFydGluZyB3aXRoIGEgIi8iLgotCi0JSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIERlcGxveW1lbnQgRmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgRGVwbG95bWVudCBGaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLAotCXRob3NlIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YKLQl0aGUgRGVwbG95bWVudCBGaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMKLQlhcmUgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbW90ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZQotCSAgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgICA8cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzLWF1dGhUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcmVzLWF1dGhUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudAotCWNvZGUgc2lnbnMgb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3IKLQl3aGV0aGVyIHRoZSBDb250YWluZXIgd2lsbCBzaWduIG9uIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi0Jb24gYmVoYWxmIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudC4gSW4gdGhlIGxhdHRlciBjYXNlLAotCXRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQotCURlcGxveWVyLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIEFwcGxpY2F0aW9uCi0JICAgIENvbnRhaW5lcgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb24iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXMtc2hhcmluZy1zY29wZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZXMtc2hhcmluZy1zY29wZSB0eXBlIHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zCi0Jb2J0YWluZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uCi0JZmFjdG9yeSByZWZlcmVuY2UgY2FuIGJlIHNoYXJlZC4gVGhlIHZhbHVlLCBpZiBzcGVjaWZpZWQsCi0JbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgU2hhcmVhYmxlCi0JICAgIFVuc2hhcmVhYmxlCi0KLQlUaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWFibGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNoYXJlYWJsZSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLWVudi1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSByZXNvdXJjZS1lbnYtcmVmVHlwZSBpcyB1c2VkIHRvIGRlZmluZQotCSAgcmVzb3VyY2UtZW52LXR5cGUgZWxlbWVudHMuICBJdCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QKLQkgIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JICBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUKLQkgIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZgotCSAgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5IHRoZQotCSAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4KLQotCSAgRXhhbXBsZToKLQotCSAgPHJlc291cmNlLWVudi1yZWY+Ci0JICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQotCSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotCSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlCi0JICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0JICA8L3Jlc291cmNlLWVudi1yZWY+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi0JICAgIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdAotCSAgICBiZSB1bmlxdWUgd2l0aGluIGEgRGVwbG95bWVudCBDb21wb25lbnQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUKLQkgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UuICBJdCBpcyB0aGUKLQkgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yCi0JICAgIGludGVyZmFjZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHJlc291cmNlLXJlZlR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQKLQkgIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlcgotCSAgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLCB0aGUgaW5kaWNhdGlvbiBvZiB0aGUKLQkgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgZXhwZWN0ZWQgYnkgdGhlCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLCB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbgotCSAgKEFwcGxpY2F0aW9uIG9yIENvbnRhaW5lciksIGFuZCBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mCi0JICB0aGUgc2hhcmVhYmlsaXR5IG9mIGNvbm5lY3Rpb25zIG9idGFpbmVkIGZyb20gdGhlIHJlc291cmNlCi0JICAoU2hhcmVhYmxlIG9yIFVuc2hhcmVhYmxlKS4KLQotCSAgRXhhbXBsZToKLQotCSAgPHJlc291cmNlLXJlZj4KLQkgICAgICA8cmVzLXJlZi1uYW1lPmpkYmMvRW1wbG95ZWVBcHBEQjwvcmVzLXJlZi1uYW1lPgotCSAgICAgIDxyZXMtdHlwZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvcmVzLXR5cGU+Ci0JICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0JICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0JICA8L3Jlc291cmNlLXJlZj4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1yZWYtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4KLQkgICAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgRGVwbG95bWVudCBGaWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YQotCSAgICBzb3VyY2UuIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkCi0JICAgIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlCi0JICAgIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1hdXRoIgotCQkgICB0eXBlPSJqMmVlOnJlcy1hdXRoVHlwZSIvPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXNoYXJpbmctc2NvcGUiCi0JCSAgIHR5cGU9ImoyZWU6cmVzLXNoYXJpbmctc2NvcGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyb2xlLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcm9sZS1uYW1lVHlwZSBkZXNpZ25hdGVzIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQotCVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYSB0b2tlbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJydW4tYXNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcnVuLWFzVHlwZSBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZQotCXVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgYSBjb21wb25lbnQuIEl0IGNvbnRhaW5zIGFuCi0Jb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZWN1cml0eS1yb2xlLXJlZlR5cGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEKLQlzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBpbiBhIGNvbXBvbmVudCdzIG9yIGEKLQlEZXBsb3ltZW50IENvbXBvbmVudCdzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbgotCW9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lIHVzZWQgaW4gdGhlCi0JY29kZSwgYW5kIGFuIG9wdGlvbmFsIGxpbmsgdG8gYSBzZWN1cml0eSByb2xlLiBJZiB0aGUKLQlzZWN1cml0eSByb2xlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBEZXBsb3llciBtdXN0IGNob29zZSBhbgotCWFwcHJvcHJpYXRlIHNlY3VyaXR5IHJvbGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgdmFsdWUgb2YgdGhlIHJvbGUtbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIFN0cmluZyB1c2VkCi0JICAgIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlCi0JICAgIEVKQkNvbnRleHQuaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGVOYW1lKSBtZXRob2Qgb3IgdGhlCi0JICAgIEh0dHBTZXJ2bGV0UmVxdWVzdC5pc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIG1ldGhvZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbGluayIKLQkJICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkCi0JICAgIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4KLQkgICAgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZQotCSAgICBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXJvbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBzZWN1cml0eS1yb2xlVHlwZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5Ci0JICByb2xlLiBUaGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUKLQkgIHNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLgotCi0JICBFeGFtcGxlOgotCi0JICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0JICAgICAgPGRlc2NyaXB0aW9uPgotCQkgIFRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobyBhcmUgYXV0aG9yaXplZAotCQkgIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUgc2VydmljZSBhcHBsaWNhdGlvbi4KLQkgICAgICA8L2Rlc2NyaXB0aW9uPgotCSAgICAgIDxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4KLQkgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBpcyBhIHNwZWNpYWwgc3RyaW5nIGRhdGF0eXBlIHRoYXQgaXMgZGVmaW5lZCBieSBKMkVFIGFzCi0JYSBiYXNlIHR5cGUgZm9yIGRlZmluaW5nIGNvbGxhcHNlZCBzdHJpbmdzLiBXaGVuIHNjaGVtYXMKLQlyZXF1aXJlIHRyYWlsaW5nL2xlYWRpbmcgc3BhY2UgZWxpbWluYXRpb24gYXMgd2VsbCBhcwotCWNvbGxhcHNpbmcgdGhlIGV4aXN0aW5nIHdoaXRlc3BhY2UsIHRoaXMgYmFzZSB0eXBlIG1heSBiZQotCXVzZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJ1ZS1mYWxzZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgc2ltcGxlIHR5cGUgZGVzaWduYXRlcyBhIGJvb2xlYW4gd2l0aCBvbmx5IHR3bwotCXBlcm1pc3NpYmxlIHZhbHVlcwotCi0JLSB0cnVlCi0JLSBmYWxzZQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnhzZEJvb2xlYW5UeXBlIj4KLQk8eHNkOnBhdHRlcm4gdmFsdWU9Iih0cnVlfGZhbHNlKSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVybC1wYXR0ZXJuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHVybC1wYXR0ZXJuVHlwZSBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuCi0JSXQgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDExLjIgb2YgdGhlCi0JU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbi4gVGhpcyBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gYmUgaW4KLQlVUkwtZGVjb2RlZCBmb3JtIGFuZCBtdXN0IG5vdCBjb250YWluIENSKCN4RCkgb3IgTEYoI3hBKS4KLQlJZiBpdCBjb250YWlucyB0aG9zZSBjaGFyYWN0ZXJzLCB0aGUgY29udGFpbmVyIG11c3QgaW5mb3JtCi0JdGhlIGRldmVsb3BlciB3aXRoIGEgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZS4KLQlUaGUgY29udGFpbmVyIG11c3QgcHJlc2VydmUgYWxsIGNoYXJhY3RlcnMgaW5jbHVkaW5nIHdoaXRlc3BhY2VzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2RBbnlVUklUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6YW55VVJJLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmFueVVSSSI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2RCb29sZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOmJvb2xlYW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6Ym9vbGVhbiI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2RJbnRlZ2VyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOmludGVnZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6aW50ZWdlciI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2ROTVRPS0VOVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOk5NVE9LRU4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2ROb25OZWdhdGl2ZUludGVnZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2RQb3NpdGl2ZUludGVnZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6cG9zaXRpdmVJbnRlZ2VyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnBvc2l0aXZlSW50ZWdlciI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2RRTmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpRTmFtZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpRTmFtZSI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2RTdHJpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6c3RyaW5nLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MjE5MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4ODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjEuMSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkcwkxLjExIDA5LzAzLzAzCi0KLSAgICAgIEJhc2VkIG9uIGoyZWVfamF4cnBjX21hcHBpbmdfMV8wLmR0ZCwgTGFzdCB1cGRhdGVkOiAwOS8xOS8yMDAyIDEwOjI2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGUgZWxlbWVudCBkZXNjcmliZXMgdGhlIEphdmEgbWFwcGluZyB0byBhIGtub3duIFdTREwgZG9jdW1lbnQuCi0KLQlJdCBjb250YWlucyB0aGUgbWFwcGluZyBiZXR3ZWVuIHBhY2thZ2UgbmFtZXMgYW5kIFhNTCBuYW1lc3BhY2VzLAotCVdTREwgcm9vdCB0eXBlcyBhbmQgSmF2YSBhcnRpZmFjdHMsIGFuZCB0aGUgc2V0IG9mIG1hcHBpbmdzIGZvcgotCXNlcnZpY2VzLgotCi0JQWxsIGphdmEtd3NkbC1tYXBwaW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZSB0aGUKLQlzY2hlbWEgYnkgdXNpbmcgdGhlIEoyRUUgbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCi0JYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUKLQl2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLQkgICAgPGphdmEtd3NkbC1tYXBwaW5nIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0JCWh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIgotCSAgICAgIHZlcnNpb249IjEuMSI+Ci0JICAgICAgLi4uCi0JICAgIDwvamF2YS13c2RsLW1hcHBpbmc+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLQl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iamF2YS13c2RsLW1hcHBpbmciIHR5cGU9ImoyZWU6amF2YS13c2RsLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIGlzIHRoZSByb290IG9mIHRoZSBqYXZhLXdzZGwtbWFwcGluZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6ZWxlbWVudD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uc3RydWN0b3ItcGFyYW1ldGVyLW9yZGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNvbnN0cnVjdG9yLXBhcmFtZXRlci1vcmRlciBlbGVtZW50IGRlZmluZXMgdGhlIG9yZGVyCi0JdGhhdCBjb21wbGV4VHlwZSBlbGVtZW50IHZhbHVlcyBhcmUgYXBwbGllZCB0byBhIEphdmEKLQlleGNlcHRpb24gY29uc3RydWN0b3IuIEVsZW1lbnQgbmFtZXMgYXJlIHNwZWNpZmllZCBmb3IgZWFjaAotCXBhcmFtZXRlciBvZiB0aGUgY29uc3RydWN0b3IsIGluY2x1ZGluZyBlbGVtZW50IG5hbWVzIG9mCi0JaW5oZXJpdGVkIHR5cGVzIGlmIG5lY2Vzc2FyeS4KLQotCVVzZWQgaW46IGV4Y2VwdGlvbi1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsZW1lbnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIGNvbXBsZXhUeXBlCi0JICAgIGVsZW1lbnQgbmFtZSBhdHRyaWJ1dGUgdmFsdWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXhjZXB0aW9uLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZXhjZXB0aW9uLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhlCi0Jc2VydmljZSBzcGVjaWZpYyBleGNlcHRpb24gdHlwZXMgYW5kIHdzZGwgZmF1bHRzIGFuZAotCVNPQVAgaGVhZGVyZmF1bHRzLgotCi0JVGhpcyBlbGVtZW50IHNob3VsZCBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlCi0JbWFwcGluZyBiZXR3ZWVuIGEgbWV0aG9kIGFuZCBhbiBvcGVyYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhlCi0JbWFwcGluZyBjb250ZXh0LgotCi0JVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24tdHlwZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGV4Y2VwdGlvbi10eXBlIGVsZW1lbnQgZGVmaW5lcyBKYXZhIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbi4KLQkgICAgSXQgbWF5IGJlIGEgc2VydmljZSBzcGVjaWZpYyBleGNlcHRpb24uCi0KLQkgICAgSXQgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtbWVzc2FnZSIKLQkJICAgdHlwZT0iajJlZTp3c2RsLW1lc3NhZ2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1tZXNzYWdlLXBhcnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTp3c2RsLW1lc3NhZ2UtcGFydC1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgZWxlbWVudCBpcyByZXF1aXJlZCBvbmx5Ci0gICAgICAgICAgICB3aGVuIHRoZSBtZXNzYWdlIHJlZmVyZW5jZWQgYnkgdGhlIHdzZGwtbWVzc2FnZSBlbGVtZW50Ci0gICAgICAgICAgICBoYXMgbW9yZSB0aGFuIG9uZSBwYXJ0LgotCi0gICAgICAgICAgICBUaGlzIG9ubHkgb2NjdXJzIHdoZW4gbXVsdGlwbGUgaGVhZGVyZmF1bHRzIHVzZSB0aGUKLSAgICAgICAgICAgIHNhbWUgbWVzc2FnZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25zdHJ1Y3Rvci1wYXJhbWV0ZXItb3JkZXIiCi0JCSAgIHR5cGU9ImoyZWU6Y29uc3RydWN0b3ItcGFyYW1ldGVyLW9yZGVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLXdzZGwtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbGVtZW50IGRlc2NyaWJlcyB0aGUgSmF2YSBtYXBwaW5nIHRvIGEga25vd24gV1NETCBkb2N1bWVudC4KLQotCUl0IGNvbnRhaW5zIHRoZSBtYXBwaW5nIGJldHdlZW4gcGFja2FnZSBuYW1lcyBhbmQgWE1MIG5hbWVzcGFjZXMsCi0JV1NETCByb290IHR5cGVzIGFuZCBKYXZhIGFydGlmYWN0cywgYW5kIHRoZSBzZXQgb2YgbWFwcGluZ3MgZm9yCi0Jc2VydmljZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpwYWNrYWdlLW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF2YS14bWwtdHlwZS1tYXBwaW5nIgotCQkgICB0eXBlPSJqMmVlOmphdmEteG1sLXR5cGUtbWFwcGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24tbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpleGNlcHRpb24tbWFwcGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIgotCQkgICAgIHR5cGU9ImoyZWU6c2VydmljZS1pbnRlcmZhY2UtbWFwcGluZ1R5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmciCi0JCSAgICAgdHlwZT0iajJlZTpzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIxLjEiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjEuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS14bWwtdHlwZS1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGphdmEteG1sLXR5cGUtbWFwcGluZyBlbGVtZW50IGNvbnRhaW5zIGEgamF2YS10eXBlIHRoYXQgaXMgdGhlCi0JZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MsIHByaW1pdGl2ZSB0eXBlLCBvciBhcnJheQotCXR5cGUsIFFOYW1lIG9mIHRoZSBYTUwgcm9vdCB0eXBlIG9yIGFub255bW91cyB0eXBlLCB0aGUgV1NETCB0eXBlCi0Jc2NvcGUgdGhlIFFOYW1lIGFwcGxpZXMgdG8gYW5kIHRoZSBzZXQgb2YgdmFyaWFibGUgbWFwcGluZ3MgZm9yCi0JZWFjaCBwdWJsaWMgdmFyaWFibGUgd2l0aGluIHRoZSBKYXZhIGNsYXNzLgotCi0JVXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF2YS10eXBlIgotCQkgICB0eXBlPSJqMmVlOmphdmEtdHlwZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgamF2YS10eXBlIGVsZW1lbnQgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mCi0JICAgIGEgSmF2YSBjbGFzcywgcHJpbWl0aXZlLCBvciBhcnJheSB0eXBlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPGNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvb3QtdHlwZS1xbmFtZSIKLQkJICAgdHlwZT0iajJlZTp4c2RRTmFtZVR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcm9vdC10eXBlLXFuYW1lIGlkZW50aWZpZXMgdGhlIFdTREwgUU5hbWUgb2YgYW4gWE1MIHR5cGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbm9ueW1vdXMtdHlwZS1xbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgYW5vbnltb3VzLXR5cGUtcW5hbWUgaWRlbnRpZmllcyB0aGUgV1NETCBRTmFtZSBvZiBhbgotCSAgICAgIGFub255bW91cyBYTUwgdHlwZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwvY2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InFuYW1lLXNjb3BlIgotCQkgICB0eXBlPSJqMmVlOnFuYW1lLXNjb3BlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6dmFyaWFibGUtbWFwcGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiBhCi0JSmF2YSBtZXRob2QgcGFyYW1ldGVycyBhbmQgYSB3c2RsLW1lc3NhZ2UuCi0KLQlVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtLXBvc2l0aW9uIgotCQkgICB0eXBlPSJqMmVlOnhzZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcGFyYW0tcG9zaXRpb24gZWxlbWVudCBkZWZpbmVzIHRoZSBwb3NpdGlvbiBvZiBhCi0JICAgIHBhcmFtZXRlciB3aXRoaW4gYSBKYXZhIG1ldGhvZC4gIEl0IG11c3QgYmUgYW4gaW50ZWdlcgotCSAgICBzdGFydGluZyBmcm9tIDAuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0tdHlwZSIKLQkJICAgdHlwZT0iajJlZTpqYXZhLXR5cGVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBhcmFtLXR5cGUgZWxlbWVudCBkZWZpbmVzIHRoZSBmdWxseSBxdWFsaWZpZWQKLQkgICAgY2xhc3MgbmFtZSBvZiBhIEphdmEgY2xhc3MsIHByaW1pdGl2ZSwgb3IgYXJyYXkgdHlwZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLW1lc3NhZ2UtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTp3c2RsLW1lc3NhZ2UtbWFwcGluZ1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYWNrYWdlLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcGFja2FnZS1tYXBwaW5nIGluZGljYXRlcyB0aGUgbWFwcGluZyBiZXR3ZWVuIGphdmEtcGFja2FnZS1uYW1lCi0JYW5kIFhNTCBuYW1lc3BhY2UgaW4gdGhlIFdTREwgZG9jdW1lbnQuCi0KLQlVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrYWdlLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwYWNrYWdlLXR5cGUgaW5kaWNhdGVzIHRoZSBKYXZhIHBhY2thZ2UgbmFtZS4gSXQgbXVzdCBiZSBhIGZ1bGx5Ci0JICAgIHF1YWxpZmllZCBwYWNrYWdlIG5hbWUsIGV2ZW4gdGhvdWdoIHRoZSBYTUwgc2NoZW1hIHR5cGUgaXMKLQkgICAgZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lc3BhY2VVUkkiCi0JCSAgIHR5cGU9ImoyZWU6eHNkQW55VVJJVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBuYW1lc3BhY2VVUkkgZWxlbWVudCBpbmRpY2F0ZXMgYSBVUkkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFyYW1ldGVyLW1vZGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcGFyYW1ldGVyLW1vZGUgZWxlbWVudCBkZWZpbmVzIHRoZSBtb2RlIG9mIHRoZSBwYXJhbWV0ZXIuCi0JSXQgY2FuIGhhdmUgb25seSB0aHJlZSB2YWx1ZXMsIElOLCBPVVQsIElOT1VULgotCi0JVXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOT1VUIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHBvcnQtbWFwcGluZyBkZWZpbmVzIHRoZSBtYXBwaW5nIG9mIHRoZSBXU0RMIHBvcnQgbmFtZSBhdHRyaWJ1dGUKLQl0byB0aGUgSmF2YSBuYW1lIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZQotCW1ldGhvZCBnZXR7amF2YS1uYW1lfS4KLQotCVVzZWQgaW46IHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwb3J0LW1hcHBpbmcgZGVmaW5lcyB0aGUgbWFwcGluZyBvZiB0aGUgV1NETCBwb3J0IG5hbWUKLQkgICAgYXR0cmlidXRlIHRvIHRoZSBKYXZhIG5hbWUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgR2VuZXJhdGVkCi0JICAgIFNlcnZpY2UgSW50ZXJmYWNlIG1ldGhvZCBnZXR7amF2YS1uYW1lfS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqYXZhLXBvcnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgamF2YS1wb3J0LW5hbWUgZWxlbWVudCBpcyB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgcG9ydAotCSAgICBuYW1lIGluIEphdmEuICBJdCBpcyB1c2VkIGluIGdlbmVyYXRpbmcgdGhlIEdlbmVyYXRlZAotCSAgICBTZXJ2aWNlIEludGVyZmFjZSBtZXRob2QgZ2V0e2phdmEtcG9ydC1uYW1lfS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxbmFtZS1zY29wZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBxbmFtZS1zY29wZSBlbGVtZW50cyBzY29wZXMgdGhlIHJlZmVyZW5jZSBvZiBhIFFOYW1lIHRvIHRoZSBXU0RMCi0JZWxlbWVudCB0eXBlIGl0IGFwcGxpZXMgdG8uIFRoZSB2YWx1ZSBvZiBxbmFtZS1zY29wZSBtYXkgYmUKLQlzaW1wbGVUeXBlLCBjb21wbGV4VHlwZSwgb3IgZWxlbWVudC4KLQotCVVzZWQgaW46IGphdmEteG1sLXR5cGUtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2ltcGxlVHlwZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBsZXhUeXBlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyBkZWZpbmVzIGEgdHVwbGUKLQl0byBzcGVjaWZ5IFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcyB0bwotCVdTREwgcG9ydCB0eXBlcyBhbmQgV1NETCBiaW5kaW5ncy4KLQotCUFuIGludGVyZmFjZSBtYXkgYmUgbWFwcGVkIHRvIGEgcG9ydC10eXBlIGFuZCBiaW5kaW5nIG11bHRpcGxlCi0JdGltZXMuIFRoaXMgaGFwcGVucyByYXJlbHkuCi0KLQlVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YQotCSAgICB0eXBlIGZvciB0aGUgZW5kcG9pbnQgaW50ZXJmYWNlLiBUaGUgbmFtZSBtdXN0IGJlIGEgZnVsbHkKLQkgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1wb3J0LXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdzZGwtcG9ydC10eXBlIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NkbCBwb3J0IHR5cGUKLQkgICAgYnkgYSBRTkFNRSB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzICB0aGUgcG9ydCB0eXBlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtYmluZGluZyIKLQkJICAgdHlwZT0iajJlZTp4c2RRTmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd3NkbC1iaW5kaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NkbCBiaW5kaW5nCi0JICAgIGJ5IGEgUU5BTUUgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyAgdGhlIGJpbmRpbmcuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgb2YKLQlKYXZhIG1ldGhvZHMgdG8gb3BlcmF0aW9ucyAod2hpY2ggYXJlIG5vdCB1bmlxdWVseSBxdWFsaWZpZWQgYnkKLQlxbmFtZXMpLgotCi0JVGhlIHdzZGwtb3BlcmF0aW9uIHNob3VsZCBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlCi0JcG9ydFR5cGUgYW5kIGJpbmRpbmcgaW4gd2hpY2ggdGhpcyBkZWZpbml0aW9uIGlzIGVtYmVkZGVkIHdpdGhpbi4KLQlTZWUgdGhlIGRlZmluaXRpb25zIGZvciBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nIGFuZAotCXNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcgdG8gYWNxdWlyZSB0aGUgcHJvcGVyIGNvbnRleHQuICBUaGUKLQl3cmFwcGVkLWVsZW1lbnQgaW5kaWNhdG9yIHNob3VsZCBvbmx5IGJlIHNwZWNpZmllZCB3aGVuIGEgV1NETAotCW1lc3NhZ2Ugd3JhcHMgYW4gZWxlbWVudCB0eXBlLiAgVGhlIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcgaXMKLQlub3Qgc3BlY2lmaWVkIGZvciBvbmUtd2F5IG9wZXJhdGlvbnMuCi0KLQlVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImphdmEtbWV0aG9kLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGphdmEtbWV0aG9kLW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSBuYW1lIG9mIGEgSmF2YSBtZXRob2QKLQkgICAgd2l0aGluIGFuIGludGVyZmFjZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLW9wZXJhdGlvbiIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd3NkbC1vcGVyYXRpb24gZWxlbWVudCBkZWZpbmVzIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBXU0RMCi0JICAgIGRvY3VtZW50LiAgSXQgbXVzdCBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gYSBwb3J0IHR5cGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3JhcHBlZC1lbGVtZW50IgotCQkgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd3JhcHBlZC1lbGVtZW50IGVsZW1lbnQgaXMgZGVmaW5lZCB3aGVuIGEgV1NETCBtZXNzYWdlCi0JICAgIHdpdGggYSBzaW5nbGUgcGFydCBpcyB1c2VkIHRvIHdyYXAgYW4gZWxlbWVudCB0eXBlIGFuZCB0aGUKLQkgICAgZWxlbWVudCdzIG5hbWUgbWF0Y2hlcyB0aGUgb3BlcmF0aW9uIG5hbWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6bWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTp3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZS1pbnRlcmZhY2UtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBob3cgYSBKYXZhIHR5cGUgZm9yCi0JdGhlIHNlcnZpY2UgaW50ZXJmYWNlIG1hcHMgdG8gYSBXU0RMIHNlcnZpY2UuCi0KLQlVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWludGVyZmFjZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIGZvciB0aGUgc2VydmljZS4KLQkgICAgRm9yIHN0YXRpYyBzZXJ2aWNlcywgaXQgaXMgamF2YXgueG1sLnJwYy5TZXJ2aWNlIGludGVyZmFjZS4gRm9yCi0JICAgIGdlbmVyYXRlZCBzZXJ2aWNlLCBpdCB3b3VsZCBiZSB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZSBuYW1lLgotCi0JICAgIFRoZSBuYW1lIG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLXNlcnZpY2UtbmFtZSIKLQkJICAgdHlwZT0iajJlZTp4c2RRTmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd3NkbC1zZXJ2aWNlLW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSB3c2RsIHNlcnZpY2UgbmFtZQotCSAgICBieSBhIFFOQU1FIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgIHRoZSBzZXJ2aWNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpwb3J0LW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB2YXJpYWJsZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBhCi0JSmF2YSBjbGFzcyBkYXRhIG1lbWJlciBvciBKYXZhQmVhbnMgcHJvcGVydHkgdG8gYW4gWE1MIGVsZW1lbnQKLQlvciBhdHRyaWJ1dGUgbmFtZSBvZiBhbiBYTUwgcm9vdCB0eXBlLiBJZiB0aGUgZGF0YS1tZW1iZXIKLQllbGVtZW50IGlzIHByZXNlbnQsIHRoZSBKYXZhIHZhcmlhYmxlIG5hbWUgaXMgYSBwdWJsaWMgZGF0YQotCW1lbWJlci4gIElmIGRhdGEtbWVtYmVyCWlzIG5vdCBwcmVzZW50LCB0aGUgSmF2YSB2YXJpYWJsZSBuYW1lCi0JaXMgYSBKYXZhQmVhbnMgcHJvcGVydHkuCi0KLQlVc2VkIGluOiBqYXZhLXhtbC10eXBlLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF2YS12YXJpYWJsZS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBqYXZhLXZhcmlhYmxlLW5hbWUgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIHB1YmxpYyBkYXRhIG1lbWJlciBvcgotCSAgICBKYXZhQmVhbnMgcHJvcGVydHkgd2l0aGluIGEgSmF2YSBjbGFzcy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhLW1lbWJlciIKLQkJICAgdHlwZT0iajJlZTplbXB0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGRhdGEtbWVtYmVyIGVsZW1lbnQgaXMgYSBib29sZWFuIGluZGljYXRvciB0aGF0IGEgSmF2YQotCSAgICB2YXJpYWJsZSBpcyBhIHB1YmxpYyBkYXRhIG1lbWJlciBhbmQgbm90IGEgSmF2YUJlYW5zIHByb3BlcnR5LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtYXR0cmlidXRlLW5hbWUiCi0JCSAgICAgdHlwZT0iajJlZTpzdHJpbmciPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgeG1sLWF0dHJpYnV0ZS1uYW1lIGVsZW1lbnQgZGVmaW5lcyBuYW1lIGF0dHJpYnV0ZSB2YWx1ZQotCSAgICAgIG9mIGEgV1NETCBhdHRyaWJ1dGUgZWxlbWVudCB3aXRoaW4gYSByb290IHR5cGUuICBUaGUgdmFsdWUKLQkgICAgICBvZiBhbiB4bWwtYXR0cmlidXRlLW5hbWUgZWxlbWVudCBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZgotCSAgICAgIHRoZSByZWYgYXR0cmlidXRlIGlmIG1hcHBpbmcgYW4gYXR0cmlidXRlIHJlZmVyZW5jZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LW5hbWUiCi0JCSAgICAgdHlwZT0iajJlZTpzdHJpbmciPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgeG1sLWVsZW1lbnQtbmFtZSBlbGVtZW50IGRlZmluZXMgbmFtZSBhdHRyaWJ1dGUgdmFsdWUgb2YKLQkgICAgICBhIFdTREwgZWxlbWVudCB3aXRoaW4gYSByb290IHR5cGUuICBUaGUgdmFsdWUgb2YgYW4KLQkgICAgICB4bWwtZWxlbWVudC1uYW1lIGVsZW1lbnQgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIHJlZgotCSAgICAgIGF0dHJpYnV0ZSBpZiBtYXBwaW5nIGFuIGVsZW1lbnQgcmVmZXJlbmNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtd2lsZGNhcmQiCi0JCSAgICAgdHlwZT0iajJlZTplbXB0eVR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgeG1sLXdpbGRjYXJkIGVsZW1lbnQgYXNzb2NpYXRlcyB0aGUgdmFyaWFibGUtbWFwcGluZyB3aXRoCi0JICAgICAgYW4geHNkOmFueSBlbGVtZW50IHdpdGhpbiBhIHJvb3QgdHlwZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3c2RsLW1lc3NhZ2UtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3c2RsLW1lc3NhZ2UtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgdG8gYQotCXNwZWNpZmljIG1lc3NhZ2UgYW5kIGl0cyBwYXJ0LiBUb2dldGhlciB0aGV5IGRlZmluZSB1bmlxdWVseQotCXRoZSBtYXBwaW5nIGZvciBhIHNwZWNpZmljIHBhcmFtZXRlci4gUGFydHMgd2l0aGluIGEgbWVzc2FnZQotCWNvbnRleHQgYXJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgd2l0aCB0aGVpciBuYW1lcy4KLQotCVRoZSBwYXJhbWV0ZXItbW9kZSBpcyBkZWZpbmVkIGJ5IHRoZSBtYXBwaW5nIHRvIGluZGljYXRlCi0Jd2hldGhlciB0aGUgbWFwcGluZyB3aWxsIGJlIElOLCBPVVQsIG9yIElOT1VULi4gIFRoZSBwcmVzZW5jZQotCW9mIHRoZSBzb2FwLWhlYWRlciBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoZSBwYXJhbWV0ZXIgaXMKLQltYXBwZWQgdG8gYSBzb2FwIGhlYWRlciBvbmx5LiAgV2hlbiBhYnNlbnQsIGl0IG1lYW5zIHRoYXQgdGhlCi0Jd3NkbC1tZXNzYWdlIGlzIG1hcHBlZCB0byBhIEphdmEgcGFyYW1ldGVyLiBUaGUgc29hcCBoZWFkZXJzCi0JYXJlIGludGVycHJldGVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSBwcm92aWRlZCBpbiB0aGUgbWFwcGluZy4KLQotCVVzZWQgaW46IG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtbWVzc2FnZSIKLQkJICAgdHlwZT0iajJlZTp3c2RsLW1lc3NhZ2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1tZXNzYWdlLXBhcnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTp3c2RsLW1lc3NhZ2UtcGFydC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlci1tb2RlIgotCQkgICB0eXBlPSJqMmVlOnBhcmFtZXRlci1tb2RlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtaGVhZGVyIgotCQkgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc29hcC1oZWFkZXIgZWxlbWVudCBpcyBhIGJvb2xlYW4gZWxlbWVudCBpbmRpY2F0aW5nIHRoYXQKLQkgICAgYSBwYXJhbWV0ZXIgaXMgbWFwcGVkIHRvIGEgU09BUCBoZWFkZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3NkbC1tZXNzYWdlLXBhcnQtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCUludGVycHJldGF0aW9uIG9mIHRoZSB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGVsZW1lbnQgZGVwZW5kcyBvbgotCXdoZXRoZXIgb3Igbm90IHdyYXBwZWQtZWxlbWVudCBoYXMgYmVlbiBkZWZpbmVkIGluIHRoZQotCXNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcuICBJZiB3cmFwcGVkLWVsZW1lbnQgaXMgbm90Ci0Jc3BlY2lmaWVkLCB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGRlZmluZXMgYSBXU0RMIG1lc3NhZ2UgcGFydC4gSXQKLQlzaG91bGQgYWx3YXlzIGJlIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byBhIHdzZGwtbWVzc2FnZQotCWVsZW1lbnQuIElmIHdyYXBwZWQtZWxlbWVudCBpcyBzcGVjaWZpZWQsIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUKLQlyZWZlcnMgdG8gYW4gZWxlbWVudCBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuCi0KLQlVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZywgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3c2RsLW1lc3NhZ2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd3NkbC1tZXNzYWdlIGVsZW1lbnQgZGVmaW5lcyBhIFdTREwgbWVzc2FnZSBieSBhIFFOQU1FLgotCi0JVXNlZCBpbjogd3NkbC1tZXNzYWdlLW1hcHBpbmcsIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcsCi0JZXhjZXB0aW9uLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTp4c2RRTmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nICBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgZm9yIHRoZQotCW1ldGhvZCdzIHJldHVybiB2YWx1ZS4gSXQgZGVmaW5lcyB0aGUgbWFwcGluZyB0byBhIHNwZWNpZmljIG1lc3NhZ2UKLQlhbmQgaXRzIHBhcnQuICBUb2dldGhlciB0aGV5IGRlZmluZSB1bmlxdWVseSB0aGUgbWFwcGluZyBmb3IgYQotCXNwZWNpZmljIHBhcmFtZXRlci4gUGFydHMgd2l0aGluIGEgbWVzc2FnZSBjb250ZXh0IGFyZSB1bmlxdWVseQotCWlkZW50aWZpZWQgd2l0aCB0aGVpciBuYW1lcy4gVGhlIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgaXMgbm90Ci0Jc3BlY2lmaWVkIGlmIHRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZSBvciBPVVQgcGFyYW1ldGVycy4KLQotCVVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXJldHVybi12YWx1ZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIG1ldGhvZC1yZXR1cm4tdmFsdWUgIGVsZW1lbnQgZGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZAotCSAgICBjbGFzcyBuYW1lIG9yIHZvaWQgdHlwZSBmb3IgdGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZQotCSAgICB0eXBlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtbWVzc2FnZSIKLQkJICAgdHlwZT0iajJlZTp3c2RsLW1lc3NhZ2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1tZXNzYWdlLXBhcnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTp3c2RsLW1lc3NhZ2UtcGFydC1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMmE3OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSIxLjEiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWoyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2RzCTEuMTEgMDIvMTEvMDMKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotICAgICAgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiAyMDAyCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoZSB3ZWJzZXJ2aWNlcyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoZSB3ZWIgc2VydmljZXMKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBJdCBzcGVjaWZpZXMgdGhlIHNldCBvZiB3ZWIgc2VydmljZQotCWRlc2NyaXB0aW9ucyB0aGF0IGFyZSB0byBiZSBkZXBsb3llZCBpbnRvIHRoZSBKMkVFIEFwcGxpY2F0aW9uCi0JU2VydmVyIGFuZCB0aGUgZGVwZW5kZW5jaWVzIHRoZXkgaGF2ZSBvbiBjb250YWluZXIgcmVzb3VyY2VzIGFuZAotCXNlcnZpY2VzLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkCi0JIk1FVEEtSU5GL3dlYnNlcnZpY2VzLnhtbCIgaW4gdGhlIHdlYiBzZXJ2aWNlcycgamFyIGZpbGUuCi0KLQlVc2VkIGluOiB3ZWJzZXJ2aWNlcy54bWwKLQotCUFsbCB3ZWJzZXJ2aWNlcyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlCi0Jd2Vic2VydmljZXMgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKMkVFIG5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHZlcnNpb24KLQllbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDx3ZWJzZXJ2aWNlcyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCQlodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiCi0JICAgICAgdmVyc2lvbj0iMS4xIj4KLQkgICAgICAuLi4KLQkgICAgPC93ZWJzZXJ2aWNlcz4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZiB0aGUKLQlzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIHRoZSBKMkVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9IndlYnNlcnZpY2VzIiB0eXBlPSJqMmVlOndlYnNlcnZpY2VzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYnNlcnZpY2VzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBmb3IgdGhlIHdlYiBzZXJ2aWNlcwotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEl0IHNwZWNpZmllcyB0aGUgc2V0IG9mIHdlYiBzZXJ2aWNlCi0JZGVzY3JpcHRpb25zIHRoYXQgYXJlIHRvIGJlIGRlcGxveWVkIGludG8gdGhlIEoyRUUgQXBwbGljYXRpb24gU2VydmVyCi0JYW5kIHRoZSBkZXBlbmRlbmNpZXMgdGhleSBoYXZlIG9uIGNvbnRhaW5lciByZXNvdXJjZXMgYW5kIHNlcnZpY2VzLgotCi0JVXNlZCBpbjogd2Vic2VydmljZXMueG1sCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSBpZGVudGlmaWVzIHRoZSBjb2xsZWN0aW9uIG9mCi0JICBwb3J0LWNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgV1NETCBmaWxlIGFuZCBKQVgtUlBDIG1hcHBpbmcuIFRoZQotCSAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTp3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqMmVlOndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSIvPgotICAgIDwveHNkOmtleT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1jb21wb25lbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcG9ydC1jb21wb25lbnQgZWxlbWVudCBhc3NvY2lhdGVzIGEgV1NETCBwb3J0IHdpdGggYSB3ZWIgc2VydmljZQotCWludGVyZmFjZSBhbmQgaW1wbGVtZW50YXRpb24uICBJdCBkZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBwb3J0IGFzIGEKLQljb21wb25lbnQsIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBvcHRpb25hbCBkaXNwbGF5IG5hbWUsIG9wdGlvbmFsIGljb25pYwotCXJlcHJlc2VudGF0aW9ucywgV1NETCBwb3J0IFFOYW1lLCBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSwgU2VydmljZQotCUltcGxlbWVudGF0aW9uIEJlYW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLQkJICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0JCSAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgcG9ydC1jb21wb25lbnQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhIHBvcnQgY29tcG9uZW50J3MKLQkgICAgICBuYW1lLiAgVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZSBtb2R1bGUgcHJvZHVjZXIgdG8gbmFtZQotCSAgICAgIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGJlYW4gaW4gdGhlIG1vZHVsZSdzIGRlcGxveW1lbnQKLQkgICAgICBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSBhbW9uZyB0aGUgcG9ydCBjb21wb25lbnQKLQkgICAgICBuYW1lcyBkZWZpbmVkIGluIHRoZSBzYW1lIG1vZHVsZS4KLQotCSAgICAgIFVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0KLQkgICAgICBFeGFtcGxlOgotCQkgICAgICA8cG9ydC1jb21wb25lbnQtbmFtZT5FbXBsb3llZVNlcnZpY2UKLQkJICAgICAgPC9wb3J0LWNvbXBvbmVudC1uYW1lPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtcG9ydCIKLQkJICAgdHlwZT0iajJlZTp4c2RRTmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBuYW1lIHNwYWNlIGFuZCBsb2NhbCBuYW1lIHBhcnQgb2YgdGhlIFdTREwgcG9ydCBRTmFtZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgY29udGFpbnMgdGhlCi0JICAgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHBvcnQgY29tcG9uZW50J3MgU2VydmljZSBFbmRwb2ludAotCSAgICAgIEludGVyZmFjZS4KLQotCSAgICAgIFVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0KLQkgICAgICBFeGFtcGxlOgotCQkgICAgICA8cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWltcGwtYmVhbiIKLQkJICAgdHlwZT0iajJlZTpzZXJ2aWNlLWltcGwtYmVhblR5cGUiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0JCSAgIHR5cGU9ImoyZWU6cG9ydC1jb21wb25lbnRfaGFuZGxlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3J0LWNvbXBvbmVudF9oYW5kbGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlCi0JaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZSBIYW5kbGVySW5mbyBpbnRlcmZhY2UuCi0KLQlVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotCSAgICBtb2R1bGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgaGFuZGxlciBpbXBsZW1lbnRhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotCQkgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1oZWFkZXIiCi0JCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgUU5hbWUgb2YgYSBTT0FQIGhlYWRlciB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZQotCSAgICBoYW5kbGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtcm9sZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc29hcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYSBTT0FQIGFjdG9yIGRlZmluaXRpb24gdGhhdCB0aGUKLQkgICAgSGFuZGxlciB3aWxsIHBsYXkgYXMgYSByb2xlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtaW1wbC1iZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQgZGVmaW5lcyB0aGUgd2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0JQSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNhbiBiZSBhbiBFSkIgYmVhbiBjbGFzcyBvciBKQVgtUlBDIHdlYgotCWNvbXBvbmVudC4gIEV4aXN0aW5nIEVKQiBpbXBsZW1lbnRhdGlvbnMgYXJlIGV4cG9zZWQgYXMgYSB3ZWIgc2VydmljZQotCXVzaW5nIGFuIGVqYi1saW5rLgotCi0JVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgotCQkgICB0eXBlPSJqMmVlOmVqYi1saW5rVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbGluayIKLQkJICAgdHlwZT0iajJlZTpzZXJ2bGV0LWxpbmtUeXBlIi8+Ci0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXQtbGlua1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHNlcnZsZXQtbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQKLQkgIHRvIHNwZWNpZnkgdGhhdCBhIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gQmVhbiBpcyBkZWZpbmVkIGFzIGEKLQkgIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludC4KLQotCSAgVGhlIHZhbHVlIG9mIHRoZSBzZXJ2bGV0LWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBzZXJ2bGV0LW5hbWUgb2YKLQkgIGEgSkFYLVJQQyBTZXJ2aWNlIEVuZHBvaW50IGluIHRoZSBzYW1lIFdBUiBmaWxlLgotCi0JICBVc2VkIGluOiBzZXJ2aWNlLWltcGwtYmVhbgotCi0JICBFeGFtcGxlOgotCQkgIDxzZXJ2bGV0LWxpbms+U3RvY2tRdW90ZVNlcnZpY2U8L3NlcnZsZXQtbGluaz4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24gZWxlbWVudCBkZWZpbmVzIGEgV1NETCBkb2N1bWVudCBmaWxlCi0JYW5kIHRoZSBzZXQgb2YgUG9ydCBjb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgV1NETCBwb3J0cwotCWRlZmluZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQuICBUaGVyZSBtYXkgYmUgbXVsdGlwbGUKLQl3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9ucyBkZWZpbmVkIHdpdGhpbiBhIG1vZHVsZS4KLQotCUFsbCBXU0RMIGZpbGUgcG9ydHMgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBwb3J0LWNvbXBvbmVudCBlbGVtZW50Ci0JZGVmaW5lZC4KLQotCVVzZWQgaW46IHdlYnNlcnZpY2VzCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLQkJICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0JCSAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUgaWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbiBvZgotCSAgICBwb3J0LWNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgV1NETCBmaWxlIGFuZCBKQVgtUlBDCi0JICAgIG1hcHBpbmcuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtZmlsZSIKLQkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIFdTREwgZmlsZSBpbiB0aGUKLQkgICAgbW9kdWxlLiAgVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF4cnBjLW1hcHBpbmctZmlsZSIKLQkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQKLQkgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieQotCSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKLQkgICAgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LWNvbXBvbmVudCIKLQkJICAgdHlwZT0iajJlZTpwb3J0LWNvbXBvbmVudFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6a2V5IG5hbWU9InBvcnQtY29tcG9uZW50X2hhbmRsZXItbmFtZS1rZXkiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICAgIHdpdGhpbiB0aGUgbW9kdWxlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpoYW5kbGVyIi8+Ci0JICA8eHNkOmZpZWxkIHhwYXRoPSJqMmVlOmhhbmRsZXItbmFtZSIvPgotCTwveHNkOmtleT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic2VydmljZXNUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6d2Vic2VydmljZS1kZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6a2V5IG5hbWU9InBvcnQtY29tcG9uZW50LW5hbWUta2V5Ij4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgIDwhW0NEQVRBWwotCi0JCVRoZSBwb3J0LWNvbXBvbmVudC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEgcG9ydAotCQljb21wb25lbnQncyBuYW1lLiAgVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZSBtb2R1bGUKLQkJcHJvZHVjZXIgdG8gbmFtZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGluIHRoZQotCQltb2R1bGUncyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JCWFtb25nIHRoZSBwb3J0IGNvbXBvbmVudCBuYW1lcyBkZWZpbmVkIGluIHRoZSBzYW1lIG1vZHVsZS4KLQotCQlVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotCi0JCUV4YW1wbGU6Ci0JCQk8cG9ydC1jb21wb25lbnQtbmFtZT5FbXBsb3llZVNlcnZpY2UKLQkJCTwvcG9ydC1jb21wb25lbnQtbmFtZT4KLQotCQldXT4KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnBvcnQtY29tcG9uZW50Ii8+Ci0JICA8eHNkOmZpZWxkIHhwYXRoPSJqMmVlOnBvcnQtY29tcG9uZW50LW5hbWUiLz4KLQk8L3hzZDprZXk+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjEuMSIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDEuMS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTRhNTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjEuMSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2RzCTEuMTAgMDIvMTEvMDMKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotICAgICAgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiAyMDAyCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvcnQtY29tcG9uZW50LXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5Ci0Jb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLQl0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50Ci0JSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZAotCWJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZAotCSAgICBKYXZhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2Ugb2YgYQotCSAgICBXU0RMIHBvcnQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LWNvbXBvbmVudC1saW5rIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcG9ydC1jb21wb25lbnQtbGluayBlbGVtZW50IGxpbmtzIGEgcG9ydC1jb21wb25lbnQtcmVmCi0JICAgIHRvIGEgc3BlY2lmaWMgcG9ydC1jb21wb25lbnQgcmVxdWlyZWQgdG8gYmUgbWFkZSBhdmFpbGFibGUKLQkgICAgYnkgYSBzZXJ2aWNlIHJlZmVyZW5jZS4KLQotCSAgICBUaGUgdmFsdWUgb2YgYSBwb3J0LWNvbXBvbmVudC1saW5rIG11c3QgYmUgdGhlCi0JICAgIHBvcnQtY29tcG9uZW50LW5hbWUgb2YgYSBwb3J0LWNvbXBvbmVudCBpbiB0aGUgc2FtZSBtb2R1bGUKLQkgICAgb3IgYW5vdGhlciBtb2R1bGUgaW4gdGhlIHNhbWUgYXBwbGljYXRpb24gdW5pdC4gVGhlIHN5bnRheAotCSAgICBmb3Igc3BlY2lmaWNhdGlvbiBmb2xsb3dzIHRoZSBzeW50YXggZGVmaW5lZCBmb3IgZWpiLWxpbmsKLQkgICAgaW4gdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJzZXJ2aWNlLXJlZkdyb3VwIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmIgotCQkgICB0eXBlPSJqMmVlOnNlcnZpY2UtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDprZXkgbmFtZT0ic2VydmljZS1yZWZfaGFuZGxlci1uYW1lLWtleSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgICAgd2l0aGluIHRoZSBtb2R1bGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmhhbmRsZXIiLz4KLQkgIDx4c2Q6ZmllbGQgeHBhdGg9ImoyZWU6aGFuZGxlci1uYW1lIi8+Ci0JPC94c2Q6a2V5PgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZpY2UtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSByZWZlcmVuY2UgdG8gYSBXZWIKLQlzZXJ2aWNlLiBJdCBjb250YWlucyBvcHRpb25hbCBkZXNjcmlwdGlvbiwgZGlzcGxheSBuYW1lIGFuZAotCWljb25zLCBhIGRlY2xhcmF0aW9uIG9mIHRoZSByZXF1aXJlZCBTZXJ2aWNlIGludGVyZmFjZSwKLQlhbiBvcHRpb25hbCBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLCBhbiBvcHRpb25hbCBzZXQKLQlvZiBKQVgtUlBDIG1hcHBpbmdzLCBhbiBvcHRpb25hbCBRTmFtZSBmb3IgdGhlIHNlcnZpY2UgZWxlbWVudCwKLQlhbiBvcHRpb25hbCBzZXQgb2YgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIGJlIHJlc29sdmVkCi0JYnkgdGhlIGNvbnRhaW5lciB0byBhIFdTREwgcG9ydCwgYW5kIGFuIG9wdGlvbmFsIHNldCBvZiBoYW5kbGVycy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc2VydmljZS1yZWYtbmFtZSBlbGVtZW50IGRlY2xhcmVzIGxvZ2ljYWwgbmFtZSB0aGF0IHRoZQotCSAgICBjb21wb25lbnRzIGluIHRoZSBtb2R1bGUgdXNlIHRvIGxvb2sgdXAgdGhlIFdlYiBzZXJ2aWNlLiBJdAotCSAgICBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBzZXJ2aWNlIHJlZmVyZW5jZSBuYW1lcyBzdGFydCB3aXRoCi0JICAgICJzZXJ2aWNlLyIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWludGVyZmFjZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtaW50ZXJmYWNlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotCSAgICBuYW1lIG9mIHRoZSBKQVgtUlBDIFNlcnZpY2UgaW50ZXJmYWNlIHRoZSBjbGllbnQgZGVwZW5kcyBvbi4KLQkgICAgSW4gbW9zdCBjYXNlcyB0aGUgdmFsdWUgd2lsbCBiZSBqYXZheC54bWwucnBjLlNlcnZpY2UuICBBIEpBWC1SUEMKLQkgICAgZ2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIGNsYXNzIG1heSBhbHNvIGJlIHNwZWNpZmllZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtZmlsZSIKLQkJICAgdHlwZT0iajJlZTp4c2RBbnlVUklUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgVVJJIGxvY2F0aW9uIG9mIGEgV1NETAotCSAgICBmaWxlLiBUaGUgbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpheHJwYy1tYXBwaW5nLWZpbGUiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGpheHJwYy1tYXBwaW5nLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgdGhhdAotCSAgICBkZXNjcmliZXMgdGhlIEpBWC1SUEMgbWFwcGluZyBiZXR3ZWVuIHRoZSBKYXZhIGludGVyYWNlcyB1c2VkIGJ5Ci0JICAgIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIFdTREwgZGVzY3JpcHRpb24gaW4gdGhlIHdzZGwtZmlsZS4gIFRoZQotCSAgICBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlIGZpbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXFuYW1lIgotCQkgICB0eXBlPSJqMmVlOnhzZFFOYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc2VydmljZS1xbmFtZSBlbGVtZW50IGRlY2xhcmVzIHRoZSBzcGVjaWZpYyBXU0RMIHNlcnZpY2UKLQkgICAgZWxlbWVudCB0aGF0IGlzIGJlaW5nIHJlZmVyZWQgdG8uICBJdCBpcyBub3Qgc3BlY2lmaWVkIGlmIG5vCi0JICAgIHdzZGwtZmlsZSBpcyBkZWNsYXJlZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LXJlZiIKLQkJICAgdHlwZT0iajJlZTpwb3J0LWNvbXBvbmVudC1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLQkgICAgb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLQkgICAgdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludAotCSAgICBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi0JICAgIGJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0JCSAgIHR5cGU9ImoyZWU6c2VydmljZS1yZWZfaGFuZGxlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuCi0JICAgIGFjY2VzcyB0aGUgaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZQotCSAgICBIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmIHBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKLQkgICAgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwgcG9ydHMgb2YgdGhlCi0JICAgIHNlcnZpY2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZS1yZWZfaGFuZGxlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCURlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQotCWluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZgotCXBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQKLQl3aXRoIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4KLQotCVVzZWQgaW46IHNlcnZpY2UtcmVmCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICB3aXRoaW4gdGhlIG1vZHVsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBoYW5kbGVyCi0JICAgIGltcGxlbWVudGF0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0JCSAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb2FwLWhlYWRlciIKLQkJICAgdHlwZT0iajJlZTp4c2RRTmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBRTmFtZSBvZiBhIFNPQVAgaGVhZGVyIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQKLQkgICAgYnkgdGhlIGhhbmRsZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb2FwLXJvbGUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNvYXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGEgU09BUCBhY3RvciBkZWZpbml0aW9uIHRoYXQKLQkgICAgdGhlIEhhbmRsZXIgd2lsbCBwbGF5IGFzIGEgcm9sZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcG9ydC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgV1NETCBwb3J0LW5hbWUgdGhhdCBhCi0JICAgIGhhbmRsZXIgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlXzUueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfNS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMTAxODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iNSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpamF2YWVlXzUueHNkcwkxLjY1IDA2LzAyLzE3Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCi1zaGFyZWFibGUgc2NoZW1hKHMpIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLWludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKLQotRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgIGoyZWUgYXBwbGljYXRpb247Ci0gICAgYXBwbGljYXRpb24gY2xpZW50OwotICAgIHdlYiBhcHBsaWNhdGlvbjsKLSAgICBlbnRlcnByaXNlIGJlYW47Ci0gICAgcmVzb3VyY2UgYWRhcHRlcjsKLQotRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICBlYXIgZmlsZTsKLSAgICB3YXIgZmlsZTsKLSAgICBqYXIgZmlsZTsKLSAgICByYXIgZmlsZTsKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0JICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmdyb3VwIG5hbWU9ImRlc2NyaXB0aW9uR3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgZGVzY3JpcHRpb24gcmVsYXRlZAotCWVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEphdmEgRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLQotCUFsbCBlbGVtZW50cyBtYXkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbGFuZ3VhZ2VzLAotCXRvIHN1cHBvcnQgbG9jYWxpemF0aW9uIG9mIHRoZSBjb250ZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmRpc3BsYXktbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotCQkgICB0eXBlPSJqYXZhZWU6aWNvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlc2NyaXB0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8KLQlwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZWxlbWVudHMKLQl0aGF0IHVzZSB0aGlzIHR5cGUgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlCi0JRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgZmlsZSBwcm9kdWNlciB3YW50cwotCXRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JRGVwbG95bWVudCBGaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZQotCXRvb2xzIHVzZWQgYnkgc3VjaCBhIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkKLQl0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0Ci0JY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotCi0JVGhlIGxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlCi0JZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQgaW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkZXdleS12ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGRlZmluZXMgYSBkZXdleSBkZWNpbWFsIHRoYXQgaXMgdXNlZAotCXRvIGRlc2NyaWJlIHZlcnNpb25zIG9mIGRvY3VtZW50cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJcLj9bMC05XSsoXC5bMC05XSspKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNwbGF5LW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBkaXNwbGF5LW5hbWUgdHlwZSBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZAotCSAgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLiBJdCBpcyB1c2VkIGJ5IGRpc3BsYXktbmFtZQotCSAgZWxlbWVudHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotCSAgRXhhbXBsZToKLQotCSAgLi4uCi0JICAgICA8ZGlzcGxheS1uYW1lIHhtbDpsYW5nPSJlbiI+Ci0JICAgICAgIEVtcGxveWVlIFNlbGYgU2VydmljZQotCSAgICAgPC9kaXNwbGF5LW5hbWU+Ci0KLQkgIFRoZSB2YWx1ZSBvZiB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIGlzICJlbiIgKEVuZ2xpc2gpIGJ5IGRlZmF1bHQuCi0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWxpbmtUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItbGlua1R5cGUgaXMgdXNlZCBieSBlamItbGluawotCSAgZWxlbWVudHMgaW4gdGhlIGVqYi1yZWYgb3IgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyB0byBzcGVjaWZ5Ci0JICB0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGVudGVycHJpc2UgYmVhbi4KLQotCSAgVGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuCi0JICBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIHNhbWUgZWpiLWphciBmaWxlIG9yIGluIGFub3RoZXIgZWpiLWphcgotCSAgZmlsZSBpbiB0aGUgc2FtZSBKYXZhIEVFIGFwcGxpY2F0aW9uIHVuaXQuCi0KLQkgIEFsdGVybmF0aXZlbHksIHRoZSBuYW1lIGluIHRoZSBlamItbGluayBlbGVtZW50IG1heSBiZQotCSAgY29tcG9zZWQgb2YgYSBwYXRoIG5hbWUgc3BlY2lmeWluZyB0aGUgZWpiLWphciBjb250YWluaW5nIHRoZQotCSAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4gd2l0aCB0aGUgZWpiLW5hbWUgb2YgdGhlIHRhcmdldAotCSAgYmVhbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGggbmFtZSBieSAiIyIuICBUaGUKLQkgIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlIGNvbnRhaW5pbmcKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UKLQkgIGJlYW4uICBUaGlzIGFsbG93cyBtdWx0aXBsZSBlbnRlcnByaXNlIGJlYW5zIHdpdGggdGhlIHNhbWUKLQkgIGVqYi1uYW1lIHRvIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCi0KLQkgIEV4YW1wbGVzOgotCi0JICAgICAgPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLQotCSAgICAgIDxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1sb2NhbC1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWpiLWxvY2FsLXJlZlR5cGUgaXMgdXNlZCBieSBlamItbG9jYWwtcmVmIGVsZW1lbnRzIGZvcgotCXRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbAotCWhvbWUgb3IgdG8gdGhlIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLgotICAgICAgICBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgRGVwbG95bWVudAotCSAgICAgIENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbi4KLQkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgbG9jYWwgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkCi0gICAgICAgICAgICAgIGVudGVycHJpc2UgYmVhbiBvciB0aGUgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIHRoZQotICAgICAgICAgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLQkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgbG9jYWwgaG9tZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQKLSAgICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFuLiBOb3QgYXBwbGljYWJsZSBpZiB0aGlzIGVqYi1sb2NhbC1yZWYgcmVmZXJzCi0gICAgICAgICAgICAgIHRvIHRoZSBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4KLQkgICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQotCSAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gICAgICAgICAgICAtIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YgdGhlIG5hbWVkIGVudGVycHJpc2UKLSAgICAgICAgICAgICAgYmVhbiBpbnRvIGEgY29tcG9uZW50IGZpZWxkIG9yIHByb3BlcnR5LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLXJlZi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWYtdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLQkJICAgdHlwZT0iamF2YWVlOmxvY2FsLWhvbWVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgotCQkgICB0eXBlPSJqYXZhZWU6bG9jYWxUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLWxpbmtUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6cmVzb3VyY2VHcm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWYtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotCSAgRGVwbG95bWVudCBDb21wb25lbnQuCi0KLQkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgRXhhbXBsZToKLQotCSAgPGVqYi1yZWYtbmFtZT5lamIvUGF5cm9sbDwvZWpiLXJlZi1uYW1lPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpqbmRpLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWYtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlamItcmVmLXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZQotCXJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotCi0JVGhlIGVqYi1yZWYtdHlwZSBkZXNpZ25hdGVzIGEgdmFsdWUKLQl0aGF0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgRW50aXR5Ci0JICAgIFNlc3Npb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vzc2lvbiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWpiLXJlZlR5cGUgaXMgdXNlZCBieSBlamItcmVmIGVsZW1lbnRzIGZvciB0aGUKLQlkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBob21lIG9yCi0gICAgICAgIHRvIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uCi0JVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkgICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YKLQkgICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlCi0JICAgICAgYmVhbi4KLQkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAgICAgICAgICAgIC0gdGhlIG9wdGlvbmFsIHJlbW90ZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gICAgICAgICAgICAgIG9yIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UKLSAgICAgICAgICAgICAgYmVhbgotCSAgICAtIHRoZSBvcHRpb25hbCBleHBlY3RlZCBob21lIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZAotICAgICAgICAgICAgICBlbnRlcnByaXNlIGJlYW4uICBOb3QgYXBwbGljYWJsZSBpZiB0aGlzIGVqYi1yZWYKLSAgICAgICAgICAgICAgcmVmZXJzIHRvIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uCi0JICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKLQkgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgICAgICAgICAgLSBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mIHRoZSBuYW1lZCBlbnRlcnByaXNlCi0gICAgICAgICAgICAgIGJlYW4gaW50byBhIGNvbXBvbmVudCBmaWVsZCBvciBwcm9wZXJ0eQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLXJlZi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWYtdHlwZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpob21lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlIgotCQkgICB0eXBlPSJqYXZhZWU6cmVtb3RlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1saW5rVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBpcyB1c2VkIHRvIGRlc2lnbmF0ZSBhbiBlbXB0eQotCWVsZW1lbnQgd2hlbiB1c2VkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGlzIHR5cGUgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YgdGhlCi0JICBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZQotCSAgYXBwbGljYXRpb24ncyBjb2RlLgotCi0JICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGU6Ci0KLQkgICAgICBqYXZhLmxhbmcuQm9vbGVhbgotCSAgICAgIGphdmEubGFuZy5CeXRlCi0JICAgICAgamF2YS5sYW5nLkNoYXJhY3RlcgotCSAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgICAgICBqYXZhLmxhbmcuU2hvcnQKLQkgICAgICBqYXZhLmxhbmcuSW50ZWdlcgotCSAgICAgIGphdmEubGFuZy5Mb25nCi0JICAgICAgamF2YS5sYW5nLkZsb2F0Ci0JICAgICAgamF2YS5sYW5nLkRvdWJsZQotCi0JICBFeGFtcGxlOgotCi0JICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Cb29sZWFuIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJ5dGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQ2hhcmFjdGVyIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLlN0cmluZyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TaG9ydCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5JbnRlZ2VyIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkxvbmciLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuRmxvYXQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuRG91YmxlIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW52LWVudHJ5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVudi1lbnRyeVR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGFuIGFwcGxpY2F0aW9uJ3MKLQllbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi0JZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYSB0eXBlCi0JKG9wdGlvbmFsIGlmIHRoZSB2YWx1ZSBpcyBpbmplY3RlZCwgb3RoZXJ3aXNlIHJlcXVpcmVkKSwgYW5kCi0JYW4gb3B0aW9uYWwgdmFsdWUuCi0KLQlJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YKLQl0aGUgbmFtZWQgcmVzb3VyY2UgaW50byBmaWVsZHMgb3IgSmF2YUJlYW5zIHByb3BlcnRpZXMuCi0KLQlJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgYW5kIGluamVjdGlvbiBpcyByZXF1ZXN0ZWQsCi0Jbm8gaW5qZWN0aW9uIHdpbGwgb2NjdXIgYW5kIG5vIGVudHJ5IG9mIHRoZSBzcGVjaWZpZWQgbmFtZQotCXdpbGwgYmUgY3JlYXRlZC4gIFRoaXMgYWxsb3dzIGFuIGluaXRpYWwgdmFsdWUgdG8gYmUKLQlzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZSBjb2RlIHdpdGhvdXQgYmVpbmcgaW5jb3JyZWN0bHkKLQljaGFuZ2VkIHdoZW4gbm8gb3ZlcnJpZGUgaGFzIGJlZW4gc3BlY2lmaWVkLgotCi0JSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkIGFuZCBubyBpbmplY3Rpb24gaXMgcmVxdWVzdGVkLAotCWEgdmFsdWUgbXVzdCBiZSBzdXBwbGllZCBkdXJpbmcgZGVwbG95bWVudC4KLQotCVRoaXMgdHlwZSBpcyB1c2VkIGJ5IGVudi1lbnRyeSBlbGVtZW50cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUKLQkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotCSAgICAgIGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYQotCSAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50LiBUaGUgdW5pcXVlbmVzcwotCSAgICAgIGNvbnN0cmFpbnRzIG11c3QgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGRlY2xhcmVkCi0JICAgICAgY29udGV4dC4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkgICAgICA8ZW52LWVudHJ5LW5hbWU+bWluQW1vdW50PC9lbnYtZW50cnktbmFtZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6ZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIEphdmEgbGFuZ3VhZ2UKLQkgICAgICB0eXBlIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeS4gIElmIGFuIGluamVjdGlvbiB0YXJnZXQKLQkgICAgICBpcyBzcGVjaWZpZWQgZm9yIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgdGhlIHR5cGUgbWF5Ci0JICAgICAgYmUgb21pdHRlZCwgb3IgbXVzdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgaW5qZWN0aW9uCi0JICAgICAgdGFyZ2V0LiAgSWYgbm8gaW5qZWN0aW9uIHRhcmdldCBpcyBzcGVjaWZpZWQsIHRoZSB0eXBlCi0JICAgICAgaXMgcmVxdWlyZWQuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS12YWx1ZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbnYtZW50cnktdmFsdWUgZGVzaWduYXRlcyB0aGUgdmFsdWUgb2YgYQotCSAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuIFRoZSB2YWx1ZQotCSAgICAgIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlCi0JICAgICAgY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYQotCSAgICAgIHNpbmdsZSBTdHJpbmcgcGFyYW1ldGVyLCBvciBmb3IgamF2YS5sYW5nLkNoYXJhY3RlciwKLQkgICAgICBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPGVudi1lbnRyeS12YWx1ZT4xMDAuMDA8L2Vudi1lbnRyeS12YWx1ZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSB0aGUgbmFtZSBvZiBhCi0JSmF2YSBjbGFzcyBvciBpbnRlcmZhY2UuICBUaGUgbmFtZSBpcyBpbiB0aGUgZm9ybSBvZiBhCi0JImJpbmFyeSBuYW1lIiwgYXMgZGVmaW5lZCBpbiB0aGUgSkxTLiAgVGhpcyBpcyB0aGUgZm9ybQotCW9mIG5hbWUgdXNlZCBpbiBDbGFzcy5mb3JOYW1lKCkuICBUb29scyB0aGF0IG5lZWQgdGhlCi0JY2Fub25pY2FsIG5hbWUgKHRoZSBuYW1lIHVzZWQgaW4gc291cmNlIGNvZGUpIHdpbGwgbmVlZAotCXRvIGNvbnZlcnQgdGhpcyBiaW5hcnkgbmFtZSB0byB0aGUgY2Fub25pY2FsIG5hbWUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJpYy1ib29sZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGRlZmluZXMgZm91ciBkaWZmZXJlbnQgdmFsdWVzIHdoaWNoIGNhbiBkZXNpZ25hdGUKLQlib29sZWFuIHZhbHVlcy4gVGhpcyBpbmNsdWRlcyB2YWx1ZXMgeWVzIGFuZCBubyB3aGljaCBhcmUKLQlub3QgZGVzaWduYXRlZCBieSB4c2Q6Ym9vbGVhbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZXMiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImhvbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBob21lVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZgotCSAgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgICA8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpY29uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGljb24gdHlwZSBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzCi0JdGhhdCBzcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGLCBKUEVHLAotCW9yIFBORyBpY29uIGltYWdlcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYQotCUdVSSB0b29sLgotCi0JVGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQotCWljb24gZmlsZSBuYW1lcyBhcmUgcHJvdmlkZWQgaW4uIEl0cyB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKQotCWJ5IGRlZmF1bHQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic21hbGwtaWNvbiIgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotCSAgICAgIGNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLQkgICAgICBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQKLQkgICAgICBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUuCi0KLQkgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGluIHRoZSBHSUYsIEpQRUcsIG9yIFBORyBmb3JtYXQuCi0JICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxhcmdlLWljb24iIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLQkgICAgICBjb250YWluaW5nIGEgbGFyZ2UKLQkgICAgICAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlCi0JICAgICAgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudAotCSAgICAgIEZpbGUuCi0KLQkgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGluIHRoZSBHSUYsIEpQRUcsIG9yIFBORyBmb3JtYXQuCi0JICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPGxhcmdlLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmplY3Rpb24tdGFyZ2V0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JQW4gaW5qZWN0aW9uIHRhcmdldCBzcGVjaWZpZXMgYSBjbGFzcyBhbmQgYSBuYW1lIHdpdGhpbgotCXRoYXQgY2xhc3MgaW50byB3aGljaCBhIHJlc291cmNlIHNob3VsZCBiZSBpbmplY3RlZC4KLQotCVRoZSBpbmplY3Rpb24gdGFyZ2V0IGNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkCi0JY2xhc3MgbmFtZSB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIGluamVjdGlvbi4gIFRoZQotCUphdmEgRUUgc3BlY2lmaWNhdGlvbnMgZGVzY3JpYmUgd2hpY2ggY2xhc3NlcyBjYW4gYmUgYW4KLQlpbmplY3Rpb24gdGFyZ2V0LgotCi0JVGhlIGluamVjdGlvbiB0YXJnZXQgbmFtZSBzcGVjaWZpZXMgdGhlIHRhcmdldCB3aXRoaW4KLQl0aGUgc3BlY2lmaWVkIGNsYXNzLiAgVGhlIHRhcmdldCBpcyBmaXJzdCBsb29rZWQgZm9yIGFzIGEKLQlKYXZhQmVhbnMgcHJvcGVydHkgbmFtZS4gIElmIG5vdCBmb3VuZCwgdGhlIHRhcmdldCBpcwotCWxvb2tlZCBmb3IgYXMgYSBmaWVsZCBuYW1lLgotCi0JVGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIHRhcmdldAotCWR1cmluZyBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2xhc3MgYnkgZWl0aGVyIGNhbGxpbmcgdGhlCi0Jc2V0IG1ldGhvZCBmb3IgdGhlIHRhcmdldCBwcm9wZXJ0eSBvciBieSBzZXR0aW5nIGEgdmFsdWUKLQlpbnRvIHRoZSBuYW1lZCBmaWVsZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5qZWN0aW9uLXRhcmdldC1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmplY3Rpb24tdGFyZ2V0LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgamF2YS1pZGVudGlmaWVyVHlwZSBkZWZpbmVzIGEgSmF2YSBpZGVudGlmaWVyLgotCVRoZSB1c2VycyBvZiB0aGlzIHR5cGUgc2hvdWxkIGZ1cnRoZXIgdmVyaWZ5IHRoYXQKLQl0aGUgY29udGVudCBkb2VzIG5vdCBjb250YWluIEphdmEgcmVzZXJ2ZWQga2V5d29yZHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iKCR8X3xccHtMfSkoXHB7TH18XHB7TmR9fF98JCkqIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBpcyBhIGdlbmVyaWMgdHlwZSB0aGF0IGRlc2lnbmF0ZXMgYSBKYXZhIHByaW1pdGl2ZQotCXR5cGUgb3IgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgaW50ZXJmYWNlL3R5cGUsCi0Jb3IgYW4gYXJyYXkgb2Ygc3VjaCB0eXBlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSJbXlxwe1p9XSoiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbmRpLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgam5kaS1uYW1lVHlwZSB0eXBlIGRlc2lnbmF0ZXMgYSBKTkRJIG5hbWUgaW4gdGhlCi0JRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JamF2YTpjb21wL2VudiBjb250ZXh0LiAgQSBKTkRJIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotCURlcGxveW1lbnQgQ29tcG9uZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmdyb3VwIG5hbWU9ImpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBncm91cCBrZWVwcyB0aGUgdXNhZ2Ugb2YgdGhlIGNvbnRhaW5lZCBKTkRJIGVudmlyb25tZW50Ci0JcmVmZXJlbmNlIGVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEphdmEgRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotCQkgICB0eXBlPSJqYXZhZWU6ZW52LWVudHJ5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTplamItcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTplamItbG9jYWwtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpzZXJ2aWNlLXJlZkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6cmVzb3VyY2UtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtY29udGV4dC1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOnBlcnNpc3RlbmNlLXVuaXQtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtY29uc3RydWN0IgotCQkgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1kZXN0cm95IgotCQkgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpncm91cD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxpZmVjeWNsZS1jYWxsYmFjayB0eXBlIHNwZWNpZmllcyBhIG1ldGhvZCBvbiBhCi0JY2xhc3MgdG8gYmUgY2FsbGVkIHdoZW4gYSBsaWZlY3ljbGUgZXZlbnQgb2NjdXJzLgotCU5vdGUgdGhhdCBlYWNoIGNsYXNzIG1heSBoYXZlIG9ubHkgb25lIGxpZmVjeWNsZSBjYWxsYmFjawotICAgICAgICBtZXRob2QgZm9yIGFueSBnaXZlbiBldmVudCBhbmQgdGhhdCB0aGUgbWV0aG9kIG1heSBub3QKLQliZSBvdmVybG9hZGVkLgotCi0gICAgICAgIElmIHRoZSBsaWZlZnljbGUtY2FsbGJhY2stY2xhc3MgZWxlbWVudCBpcyBtaXNzaW5nIHRoZW4KLSAgICAgICAgdGhlIGNsYXNzIGRlZmluaW5nIHRoZSBjYWxsYmFjayBpcyBhc3N1bWVkIHRvIGJlIHRoZQotICAgICAgICBjb21wb25lbnQgY2xhc3MgaW4gc2NvcGUgYXQgdGhlIHBsYWNlIGluIHRoZSBkZXNjcmlwdG9yCi0gICAgICAgIGluIHdoaWNoIHRoZSBjYWxsYmFjayBkZWZpbml0aW9uIGFwcGVhcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZS1jYWxsYmFjay1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlLWNhbGxiYWNrLW1ldGhvZCIKLQkJICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imxpc3RlbmVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxpc3RlbmVyVHlwZSBpbmRpY2F0ZXMgdGhlIGRlcGxveW1lbnQgcHJvcGVydGllcyBmb3IgYSB3ZWIKLQlhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXItY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGxpc3RlbmVyLWNsYXNzIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUKLQkgICAgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViCi0JICAgIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIFRoZSB2YWx1ZSBpcyB0aGUgZnVsbHkKLQkgICAgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgbGlzdGVuZXIgY2xhc3MuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWwtaG9tZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbC1ob21lVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQKLQluYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUgaW50ZXJmYWNlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbFR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KLQllbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBpbnRlcmZhY2UuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIGlzIHVzZWQgdG8gbGluayBhIG1lc3NhZ2UKLQlkZXN0aW5hdGlvbiByZWZlcmVuY2Ugb3IgbWVzc2FnZS1kcml2ZW4gYmVhbiB0byBhIG1lc3NhZ2UKLQlkZXN0aW5hdGlvbi4KLQotCVRoZSBBc3NlbWJsZXIgc2V0cyB0aGUgdmFsdWUgdG8gcmVmbGVjdCB0aGUgZmxvdyBvZiBtZXNzYWdlcwotCWJldHdlZW4gcHJvZHVjZXJzIGFuZCBjb25zdW1lcnMgaW4gdGhlIGFwcGxpY2F0aW9uLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBvZiBhIG1lc3NhZ2UKLQlkZXN0aW5hdGlvbiBpbiB0aGUgc2FtZSBEZXBsb3ltZW50IEZpbGUgb3IgaW4gYW5vdGhlcgotCURlcGxveW1lbnQgRmlsZSBpbiB0aGUgc2FtZSBKYXZhIEVFIGFwcGxpY2F0aW9uIHVuaXQuCi0KLQlBbHRlcm5hdGl2ZWx5LCB0aGUgdmFsdWUgbWF5IGJlIGNvbXBvc2VkIG9mIGEgcGF0aCBuYW1lCi0Jc3BlY2lmeWluZyBhIERlcGxveW1lbnQgRmlsZSBjb250YWluaW5nIHRoZSByZWZlcmVuY2VkCi0JbWVzc2FnZSBkZXN0aW5hdGlvbiB3aXRoIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgb2YgdGhlCi0JZGVzdGluYXRpb24gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRoIG5hbWUgYnkKLQkiIyIuIFRoZSBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIERlcGxveW1lbnQgRmlsZQotCWNvbnRhaW5pbmcgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCBpcyByZWZlcmVuY2luZyB0aGUKLQltZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgbWVzc2FnZQotCWRlc3RpbmF0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgdG8gYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotCSAgb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBtZXNzYWdlIGRlc3RpbmF0aW9uCi0JICBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0KLQkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JCSAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZQotCQkgIC0gYW4gb3B0aW9uYWwgbWVzc2FnZSBkZXN0aW5hdGlvbiB0eXBlCi0JCSAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIKLQkJICAgIHRoZSBkZXN0aW5hdGlvbiBpcyB1c2VkIGZvcgotCQkgICAgY29uc3VtaW5nIG9yIHByb2R1Y2luZyBtZXNzYWdlcywgb3IgYm90aC4KLQkJICAgIGlmIG5vdCBzcGVjaWZpZWQsICJib3RoIiBpcyBhc3N1bWVkLgotCQkgIC0gYW4gb3B0aW9uYWwgbGluayB0byB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbgotCQkgIC0gb3B0aW9uYWwgaW5qZWN0aW9uIHRhcmdldHMKLQotCSAgVGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZSBtdXN0IGJlIHN1cHBsaWVkIHVubGVzcyBhbgotCSAgaW5qZWN0aW9uIHRhcmdldCBpcyBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgdGhlIHR5cGUKLQkgIG9mIHRoZSB0YXJnZXQgaXMgdXNlZC4gIElmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhlIHR5cGUKLQkgIG11c3QgYmUgYXNzaWdubWVudCBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUgb2YgdGhlIGluamVjdGlvbgotCSAgdGFyZ2V0LgotCi0JICBFeGFtcGxlczoKLQotCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+Ci0JCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Q29uc3VtZXMKLQkJICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Ci0JCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tbGluaz5Db3Jwb3JhdGVTdG9ja3MKLQkJICA8L21lc3NhZ2UtZGVzdGluYXRpb24tbGluaz4KLQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0JICAgIHRoZSBuYW1lIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cwotCSAgICB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi0JICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlCi0JICAgIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLWphciAoZm9yIGVudGVycHJpc2UgYmVhbnMpIG9yIGEKLQkgICAgRGVwbG95bWVudCBGaWxlIChmb3Igb3RoZXJzKS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlIgotCQkgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGluayIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotCi0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSBzcGVjaWZpZXMgdGhlIHR5cGUgb2YKLQkgIHRoZSBkZXN0aW5hdGlvbi4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZQotCSAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgotCi0JICBFeGFtcGxlOgotCi0JICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCi0JICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUgc3BlY2lmaWVzIHRoZSB1c2Ugb2YgdGhlCi0JbWVzc2FnZSBkZXN0aW5hdGlvbiBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS4gIFRoZSB2YWx1ZQotCWluZGljYXRlcyB3aGV0aGVyIG1lc3NhZ2VzIGFyZSBjb25zdW1lZCBmcm9tIHRoZSBtZXNzYWdlCi0JZGVzdGluYXRpb24sIHByb2R1Y2VkIGZvciB0aGUgZGVzdGluYXRpb24sIG9yIGJvdGguICBUaGUKLQlBc3NlbWJsZXIgbWFrZXMgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24gaW4gbGlua2luZyBwcm9kdWNlcnMKLQlvZiBhIGRlc3RpbmF0aW9uIHdpdGggaXRzIGNvbnN1bWVycy4KLQotCVRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSBlbGVtZW50IG11c3QgYmUKLQlvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkgICAgQ29uc3VtZXMKLQkgICAgUHJvZHVjZXMKLQkgICAgQ29uc3VtZXNQcm9kdWNlcwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lcyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2VzIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXNQcm9kdWNlcyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSBzcGVjaWZpZXMgYSBtZXNzYWdlCi0JICBkZXN0aW5hdGlvbi4gVGhlIGxvZ2ljYWwgZGVzdGluYXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMKLQkgIGVsZW1lbnQgaXMgbWFwcGVkIHRvIGEgcGh5c2ljYWwgZGVzdGluYXRpb24gYnkgdGhlIERlcGxveWVyLgotCi0JICBUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBlbGVtZW50IGNvbnRhaW5zOgotCi0JCSAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCQkgIC0gYW4gb3B0aW9uYWwgZGlzcGxheS1uYW1lCi0JCSAgLSBhbiBvcHRpb25hbCBpY29uCi0JCSAgLSBhIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZSB3aGljaCBtdXN0IGJlIHVuaXF1ZQotCQkgICAgYW1vbmcgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lcyB3aXRoaW4gdGhlIHNhbWUKLQkJICAgIERlcGxveW1lbnQgRmlsZS4KLQkJICAtIGFuIG9wdGlvbmFsIG1hcHBlZCBuYW1lCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Q29ycG9yYXRlU3RvY2tzCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Ci0JICA8L21lc3NhZ2UtZGVzdGluYXRpb24+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEKLQkgICAgbmFtZSBmb3IgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBuYW1lIG11c3QgYmUKLQkgICAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiBtZXNzYWdlIGRlc3RpbmF0aW9ucwotCSAgICB3aXRoaW4gdGhlIERlcGxveW1lbnQgRmlsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyBtZXNzYWdlIGRlc3RpbmF0aW9uCi0JICAgICAgc2hvdWxkIGJlIG1hcHBlZCB0by4gIEVhY2ggbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYKLQkgICAgICBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0aGlzIG1lc3NhZ2UgZGVzdGluYXRpb24gd2lsbAotCSAgICAgIGRlZmluZSBhIG5hbWUgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgcmVmZXJlbmNpbmcKLQkgICAgICBjb21wb25lbnQuICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudgotCSAgICAgIG5hbWVzcGFjZS4pICBNYW55IGFwcGxpY2F0aW9uIHNlcnZlcnMgcHJvdmlkZSBhIHdheSB0bwotCSAgICAgIG1hcCB0aGVzZSBsb2NhbCBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlCi0JICAgICAgYXBwbGljYXRpb24gc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbAotCSAgICAgIEpOREkgbmFtZSwgYnV0IG1heSBiZSBhIG5hbWUgb2YgYW55IGZvcm0uICBFYWNoIG9mIHRoZQotCSAgICAgIGxvY2FsIG5hbWVzIHNob3VsZCBiZSBtYXBwZWQgdG8gdGhpcyBzYW1lIGdsb2JhbCBuYW1lLgotCi0JICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKLQkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFyYW0tdmFsdWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgaXMgYSBnZW5lcmFsIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNsYXJlCi0JcGFyYW1ldGVyL3ZhbHVlIGxpc3RzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0tbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwYXJhbS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICBwYXJhbWV0ZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbS12YWx1ZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYQotCSAgICBwYXJhbWV0ZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGF0aFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIGVpdGhlciBhIHJlbGF0aXZlCi0JcGF0aCBvciBhbiBhYnNvbHV0ZSBwYXRoIHN0YXJ0aW5nIHdpdGggYSAiLyIuCi0KLQlJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgRGVwbG95bWVudCBGaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBEZXBsb3ltZW50IEZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sCi0JdGhvc2Ugc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZgotCXRoZSBEZXBsb3ltZW50IEZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcwotCWFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotCSAgb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBwZXJzaXN0ZW5jZSBjb250ZXh0Ci0JICBhc3NvY2lhdGVkIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLQkgIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjoKLQotCQkgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkJICAtIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZSBuYW1lCi0JCSAgLSBhbiBvcHRpb25hbCBwZXJzaXN0ZW5jZSB1bml0IG5hbWUuICBJZiBub3Qgc3BlY2lmaWVkLAotICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBwZXJzaXN0ZW5jZSB1bml0IGlzIGFzc3VtZWQuCi0JCSAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIKLQkJICAgIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHR5cGUgaXMgVHJhbnNhY3Rpb24gb3IKLQkJICAgIEV4dGVuZGVkLiAgSWYgbm90IHNwZWNpZmllZCwgVHJhbnNhY3Rpb24gaXMgYXNzdW1lZC4KLSAgICAgICAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiBwZXJzaXN0ZW5jZSBwcm9wZXJ0aWVzCi0JCSAgLSBvcHRpb25hbCBpbmplY3Rpb24gdGFyZ2V0cwotCi0JICBFeGFtcGxlczoKLQotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmPgotICAgICAgICAgICAgICA8cGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZT5teVBlcnNpc3RlbmNlQ29udGV4dAotICAgICAgICAgICAgICA8L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWU+Ci0gICAgICAgICAgICA8L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmPgotCi0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtY29udGV4dC1yZWY+Ci0gICAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lPm15UGVyc2lzdGVuY2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lPgotICAgICAgICAgICAgICA8cGVyc2lzdGVuY2UtdW5pdC1uYW1lPlBlcnNpc3RlbmNlVW5pdDEKLSAgICAgICAgICAgICAgICA8L3BlcnNpc3RlbmNlLXVuaXQtbmFtZT4KLSAgICAgICAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZT5FeHRlbmRlZDwvcGVyc2lzdGVuY2UtY29udGV4dC10eXBlPgotICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZj4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpqbmRpLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLQkgICAgdGhlIG5hbWUgb2YgYSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZTsgaXRzCi0JICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLQkgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0JICAgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIob3IgQmVhblByb3ZpZGVyKSBtYXkgdXNlIHRoZQotICAgICAgICAgICAgZm9sbG93aW5nIHN5bnRheCB0byBhdm9pZCB0aGUgbmVlZCB0byByZW5hbWUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgIHVuaXRzIHRvIGhhdmUgdW5pcXVlIG5hbWVzIHdpdGhpbiBhIEphdmEgRUUgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgc3BlY2lmaWVzIHRoZSBwYXRobmFtZSBvZiB0aGUKLSAgICAgICAgICAgIHJvb3Qgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGZvciB0aGUgcmVmZXJlbmNlZAotICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdCBhbmQgYXBwZW5kcyB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgIHVuaXQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGhuYW1lIGJ5ICMuIFRoZSBwYXRobmFtZSBpcwotICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGNvbXBvbmVudCBqYXIgZmlsZS4KLSAgICAgICAgICAgIEluIHRoaXMgbWFubmVyLCBtdWx0aXBsZSBwZXJzaXN0ZW5jZSB1bml0cyB3aXRoIHRoZSBzYW1lCi0gICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IG5hbWUgbWF5IGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgd2hlbiB0aGUKLSAgICAgICAgICAgIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBjYW5ub3QgY2hhbmdlIHBlcnNpc3RlbmNlIHVuaXQgbmFtZXMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTpwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXByb3BlcnR5IgotCQkgICB0eXBlPSJqYXZhZWU6cHJvcGVydHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgcHJvcGVydGllcyBmb3IgdGhlIGNvbnRhaW5lciBvciBwZXJzaXN0ZW5jZQotICAgICAgICAgICAgcHJvdmlkZXIuICBWZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcyBtYXkgYmUgaW5jbHVkZWQgaW4KLSAgICAgICAgICAgIHRoZSBzZXQgb2YgcHJvcGVydGllcy4gIFByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHJlY29nbml6ZWQKLSAgICAgICAgICAgIGJ5IGEgdmVuZG9yIG11c3QgYmUgaWdub3JlZC4gIEVudHJpZXMgdGhhdCBtYWtlIHVzZSBvZiB0aGUKLSAgICAgICAgICAgIG5hbWVzcGFjZSBqYXZheC5wZXJzaXN0ZW5jZSBhbmQgaXRzIHN1Ym5hbWVzcGFjZXMgbXVzdCBub3QKLSAgICAgICAgICAgIGJlIHVzZWQgZm9yIHZlbmRvci1zcGVjaWZpYyBwcm9wZXJ0aWVzLiAgVGhlIG5hbWVzcGFjZQotICAgICAgICAgICAgamF2YXgucGVyc2lzdGVuY2UgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgc3BlY2lmaWNhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIHNwZWNpZmllcyB0aGUgdHJhbnNhY3Rpb25hbAotCW5hdHVyZSBvZiBhIHBlcnNpc3RlbmNlIGNvbnRleHQgcmVmZXJlbmNlLgotCi0JVGhlIHZhbHVlIG9mIHRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGUgZWxlbWVudCBtdXN0IGJlCi0Jb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICAgIFRyYW5zYWN0aW9uCi0gICAgICAgICAgICBFeHRlbmRlZAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBwZXJzaXN0ZW5jZS11bml0LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLQkgIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgcGVyc2lzdGVuY2UgdW5pdAotCSAgYXNzb2NpYXRlZCB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0KLQkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JCSAgLSB0aGUgcGVyc2lzdGVuY2UgdW5pdCByZWZlcmVuY2UgbmFtZQotCQkgIC0gYW4gb3B0aW9uYWwgcGVyc2lzdGVuY2UgdW5pdCBuYW1lLiAgSWYgbm90IHNwZWNpZmllZCwKLSAgICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgcGVyc2lzdGVuY2UgdW5pdCBpcyBhc3N1bWVkLgotCQkgIC0gb3B0aW9uYWwgaW5qZWN0aW9uIHRhcmdldHMKLQotCSAgRXhhbXBsZXM6Ci0KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LXJlZj4KLSAgICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+bXlQZXJzaXN0ZW5jZVVuaXQKLSAgICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lPgotICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LXJlZj4KLQotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtcmVmPgotICAgICAgICAgICAgICA8cGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZT5teVBlcnNpc3RlbmNlVW5pdAotICAgICAgICAgICAgICAgIDwvcGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtbmFtZT5QZXJzaXN0ZW5jZVVuaXQxCi0gICAgICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LW5hbWU+Ci0gICAgICAgICAgICA8L3BlcnNpc3RlbmNlLXVuaXQtcmVmPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcwotCSAgICB0aGUgbmFtZSBvZiBhIHBlcnNpc3RlbmNlIHVuaXQgcmVmZXJlbmNlOyBpdHMKLQkgICAgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotCSAgICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLQkgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlcihvciBCZWFuUHJvdmlkZXIpIG1heSB1c2UgdGhlCi0gICAgICAgICAgICBmb2xsb3dpbmcgc3ludGF4IHRvIGF2b2lkIHRoZSBuZWVkIHRvIHJlbmFtZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAgdW5pdHMgdG8gaGF2ZSB1bmlxdWUgbmFtZXMgd2l0aGluIGEgSmF2YSBFRSBhcHBsaWNhdGlvbi4KLQotICAgICAgICAgICAgVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBzcGVjaWZpZXMgdGhlIHBhdGhuYW1lIG9mIHRoZQotICAgICAgICAgICAgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgZm9yIHRoZSByZWZlcmVuY2VkCi0gICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IGFuZCBhcHBlbmRzIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAgdW5pdCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aG5hbWUgYnkgIy4gVGhlIHBhdGhuYW1lIGlzCi0gICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNpbmcgYXBwbGljYXRpb24gY29tcG9uZW50IGphciBmaWxlLgotICAgICAgICAgICAgSW4gdGhpcyBtYW5uZXIsIG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzIHdpdGggdGhlIHNhbWUKLSAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgbmFtZSBtYXkgYmUgdW5pcXVlbHkgaWRlbnRpZmllZCB3aGVuIHRoZQotICAgICAgICAgICAgQXBwbGljYXRpb24gQXNzZW1ibGVyIGNhbm5vdCBjaGFuZ2UgcGVyc2lzdGVuY2UgdW5pdCBuYW1lcy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JU3BlY2lmaWVzIGEgbmFtZS92YWx1ZSBwYWlyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVtb3RlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lCi0JICBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLQotCSAgRXhhbXBsZToKLQotCSAgICAgIDxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcy1hdXRoVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJlcy1hdXRoVHlwZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgRGVwbG95bWVudCBDb21wb25lbnQKLQljb2RlIHNpZ25zIG9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yCi0Jd2hldGhlciB0aGUgQ29udGFpbmVyIHdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlcgotCW9uIGJlaGFsZiBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQuIEluIHRoZSBsYXR0ZXIgY2FzZSwKLQl0aGUgQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUKLQlEZXBsb3llci4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBBcHBsaWNhdGlvbgotCSAgICBDb250YWluZXIKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb24iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXMtc2hhcmluZy1zY29wZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZXMtc2hhcmluZy1zY29wZSB0eXBlIHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zCi0Jb2J0YWluZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uCi0JZmFjdG9yeSByZWZlcmVuY2UgY2FuIGJlIHNoYXJlZC4gVGhlIHZhbHVlLCBpZiBzcGVjaWZpZWQsCi0JbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgU2hhcmVhYmxlCi0JICAgIFVuc2hhcmVhYmxlCi0KLQlUaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlYWJsZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2hhcmVhYmxlIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzb3VyY2UtZW52LXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHJlc291cmNlLWVudi1yZWZUeXBlIGlzIHVzZWQgdG8gZGVmaW5lCi0JICByZXNvdXJjZS1lbnYtdHlwZSBlbGVtZW50cy4gIEl0IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQotCSAgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdAotCSAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLQkgIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZQotCSAgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBvcHRpb25hbAotCSAgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUKLQkgIGV4cGVjdGVkIGJ5IHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLgotCi0JICBJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YKLQkgIHRoZSBuYW1lZCByZXNvdXJjZSBpbnRvIGZpZWxkcyBvciBKYXZhQmVhbnMgcHJvcGVydGllcy4KLQotCSAgVGhlIHJlc291cmNlIGVudmlyb25tZW50IHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KLQkgIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSB0eXBlCi0JICBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlCi0JICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KLQkgIHRhcmdldC4KLQotCSAgRXhhbXBsZToKLQotCSAgPHJlc291cmNlLWVudi1yZWY+Ci0JICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQotCSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotCSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlCi0JICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0JICA8L3Jlc291cmNlLWVudi1yZWY+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotCSAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QKLQkgICAgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZi10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlc291cmNlLWVudi1yZWYtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZQotCSAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZS4gIEl0IGlzIHRoZQotCSAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IKLQkgICAgaW50ZXJmYWNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHJlc291cmNlLXJlZlR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQKLQkgIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlcgotCSAgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLCBhbiBvcHRpb25hbCBpbmRpY2F0aW9uIG9mCi0JICB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZSBleHBlY3RlZCBieSB0aGUKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUsIGFuIG9wdGlvbmFsIHR5cGUgb2YgYXV0aGVudGljYXRpb24KLQkgIChBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLCBhbmQgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZgotCSAgdGhlIHNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZQotCSAgKFNoYXJlYWJsZSBvciBVbnNoYXJlYWJsZSkuCi0KLQkgIEl0IGFsc28gaW5jbHVkZXMgb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZgotCSAgdGhlIG5hbWVkIHJlc291cmNlIGludG8gZmllbGRzIG9yIEphdmFCZWFucyBwcm9wZXJ0aWVzLgotCi0JICBUaGUgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KLQkgIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSB0eXBlCi0JICBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlCi0JICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KLQkgIHRhcmdldC4KLQotCSAgRXhhbXBsZToKLQotCSAgPHJlc291cmNlLXJlZj4KLQkgICAgICA8cmVzLXJlZi1uYW1lPmpkYmMvRW1wbG95ZWVBcHBEQjwvcmVzLXJlZi1uYW1lPgotCSAgICAgIDxyZXMtdHlwZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvcmVzLXR5cGU+Ci0JICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0JICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0JICA8L3Jlc291cmNlLXJlZj4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuCi0JICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgRmlsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhCi0JICAgIHNvdXJjZS4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQKLQkgICAgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UKLQkgICAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGEgc291cmNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLWF1dGgiCi0JCSAgIHR5cGU9ImphdmFlZTpyZXMtYXV0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXNoYXJpbmctc2NvcGUiCi0JCSAgIHR5cGU9ImphdmFlZTpyZXMtc2hhcmluZy1zY29wZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotCi0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmdyb3VwIG5hbWU9InJlc291cmNlR3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgZ3JvdXAgY29sbGVjdHMgZWxlbWVudHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCB0aGUKLQlKTkRJIHJlc291cmNlIGVsZW1lbnRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKLQkgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQotCSAgICAgIHJlc291cmNlJ3MgbmFtZSBlbGVtZW50IG9yIGRlZmF1bHRlZCwgaXMgYSBuYW1lIHRoYXQgaXMKLQkgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KLQkgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQotCSAgICAgIGFwcGxpY2F0aW9uIHNlcnZlcnMgcHJvdmlkZSBhIHdheSB0byBtYXAgdGhlc2UgbG9jYWwKLQkgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCi0JICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCi0JICAgICAgYnV0IG1heSBiZSBhIG5hbWUgb2YgYW55IGZvcm0uCi0KLQkgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLQkgICAgICBwYXJ0aWN1bGFyIGZvcm0gb3IgdHlwZSBvZiBtYXBwZWQgbmFtZSwgbm9yIHRoZSBhYmlsaXR5Ci0JICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcwotCSAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLQkgICAgICB1c2Ugb2YgYSBtYXBwZWQgbmFtZSBpcyBwb3J0YWJsZS4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluamVjdGlvbi10YXJnZXQiCi0JCSAgIHR5cGU9ImphdmFlZTppbmplY3Rpb24tdGFyZ2V0VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpncm91cD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm9sZS1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJvbGUtbmFtZVR5cGUgZGVzaWduYXRlcyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLQlUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGEgdG9rZW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJydW4tYXNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcnVuLWFzVHlwZSBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZQotCXVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgYSBjb21wb25lbnQuIEl0IGNvbnRhaW5zIGFuCi0Jb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpyb2xlLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VjdXJpdHktcm9sZS1yZWZUeXBlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhCi0Jc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgaW4gYSBjb21wb25lbnQncyBvciBhCi0JRGVwbG95bWVudCBDb21wb25lbnQncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4KLQlvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZSB1c2VkIGluIHRoZQotCWNvZGUsIGFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlCi0Jc2VjdXJpdHkgcm9sZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgRGVwbG95ZXIgbXVzdCBjaG9vc2UgYW4KLQlhcHByb3ByaWF0ZSBzZWN1cml0eSByb2xlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgU3RyaW5nIHVzZWQKLQkgICAgYXMgdGhlIHBhcmFtZXRlciB0byB0aGUKLQkgICAgRUpCQ29udGV4dC5pc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZU5hbWUpIG1ldGhvZCBvciB0aGUKLQkgICAgSHR0cFNlcnZsZXRSZXF1ZXN0LmlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgbWV0aG9kLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1saW5rIgotCQkgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZAotCSAgICBzZWN1cml0eSByb2xlLiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluCi0JICAgIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUKLQkgICAgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1yb2xlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgc2VjdXJpdHktcm9sZVR5cGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eQotCSAgcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YKLQkgIHRoZSBzZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4KLQotCSAgRXhhbXBsZToKLQotCSAgICAgIDxzZWN1cml0eS1yb2xlPgotCSAgICAgIDxkZXNjcmlwdGlvbj4KLQkJICBUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8gYXJlIGF1dGhvcml6ZWQKLQkJICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uCi0JICAgICAgPC9kZXNjcmlwdGlvbj4KLQkgICAgICA8cm9sZS1uYW1lPmVtcGxveWVlPC9yb2xlLW5hbWU+Ci0JICAgICAgPC9zZWN1cml0eS1yb2xlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpyb2xlLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RyaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIGlzIGEgc3BlY2lhbCBzdHJpbmcgZGF0YXR5cGUgdGhhdCBpcyBkZWZpbmVkIGJ5IEphdmEgRUUgYXMKLQlhIGJhc2UgdHlwZSBmb3IgZGVmaW5pbmcgY29sbGFwc2VkIHN0cmluZ3MuIFdoZW4gc2NoZW1hcwotCXJlcXVpcmUgdHJhaWxpbmcvbGVhZGluZyBzcGFjZSBlbGltaW5hdGlvbiBhcyB3ZWxsIGFzCi0JY29sbGFwc2luZyB0aGUgZXhpc3Rpbmcgd2hpdGVzcGFjZSwgdGhpcyBiYXNlIHR5cGUgbWF5IGJlCi0JdXNlZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cnVlLWZhbHNlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBzaW1wbGUgdHlwZSBkZXNpZ25hdGVzIGEgYm9vbGVhbiB3aXRoIG9ubHkgdHdvCi0JcGVybWlzc2libGUgdmFsdWVzCi0KLQktIHRydWUKLQktIGZhbHNlCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTp4c2RCb29sZWFuVHlwZSI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSIodHJ1ZXxmYWxzZSkiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1cmwtcGF0dGVyblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB1cmwtcGF0dGVyblR5cGUgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLgotCUl0IG11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMS4yIG9mIHRoZQotCVNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24uIFRoaXMgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGJlIGluCi0JVVJMLWRlY29kZWQgZm9ybSBhbmQgbXVzdCBub3QgY29udGFpbiBDUigjeEQpIG9yIExGKCN4QSkuCi0JSWYgaXQgY29udGFpbnMgdGhvc2UgY2hhcmFjdGVycywgdGhlIGNvbnRhaW5lciBtdXN0IGluZm9ybQotCXRoZSBkZXZlbG9wZXIgd2l0aCBhIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UuCi0JVGhlIGNvbnRhaW5lciBtdXN0IHByZXNlcnZlIGFsbCBjaGFyYWN0ZXJzIGluY2x1ZGluZyB3aGl0ZXNwYWNlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkQW55VVJJVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOmFueVVSSS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDphbnlVUkkiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkQm9vbGVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpib29sZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmJvb2xlYW4iPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkSW50ZWdlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDppbnRlZ2VyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmludGVnZXIiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkTk1UT0tFTlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpOTVRPS0VOLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOm5vbk5lZ2F0aXZlSW50ZWdlci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpub25OZWdhdGl2ZUludGVnZXIiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOnBvc2l0aXZlSW50ZWdlci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpwb3NpdGl2ZUludGVnZXIiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkUU5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6UU5hbWUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6UU5hbWUiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkU3RyaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOnN0cmluZy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV82LnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlXzYueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTY1ZDE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlXzYueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjQyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgICAgICAgIHZlcnNpb249IjYiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgotICAgICAgCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAgIAotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uCi0gICAgICBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUKLSAgICAgICJMaWNlbnNlIikuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICAgIHRoZSBMaWNlbnNlLiBZb3UgY2FuIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAgIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCBvcgotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotICAgICAgTGljZW5zZS4KLSAgICAgIAotICAgICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIKLSAgICAgIE5vdGljZSBpbiBlYWNoIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdAotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAgICAgIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMKLSAgICAgIHByb3ZpZGVkIGJ5IFN1biBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlIGZpbGUKLSAgICAgIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiAgSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdCi0gICAgICByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAgICAgICJQb3J0aW9ucyBDb3B5cmlnaHRlZCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLSAgICAgIAotICAgICAgQ29udHJpYnV0b3Iocyk6Ci0gICAgICAKLSAgICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUKLSAgICAgIENEREwgb3Igb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcKLSAgICAgICJbQ29udHJpYnV0b3JdIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdQotICAgICAgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEgcmVjaXBpZW50IGhhcyB0aGUKLSAgICAgIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZQotICAgICAgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0byBpdHMKLSAgICAgIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMgotICAgICAgY29kZSBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlCi0gICAgICBvcHRpb24gYXBwbGllcyBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaAotICAgICAgb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgYXBwZWFyIGluIHRoZSBjb21tb24KLSAgICAgIHNoYXJlYWJsZSBzY2hlbWEocykgb2YgSmF2YSBFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHNob3VsZCBiZQotICAgICAgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb250ZXh0IHRoZXkgYXJlIGluY2x1ZGVkOgotICAgICAgCi0gICAgICBEZXBsb3ltZW50IENvbXBvbmVudCBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICBqYXZhIGVlIGFwcGxpY2F0aW9uOwotICAgICAgYXBwbGljYXRpb24gY2xpZW50OwotICAgICAgd2ViIGFwcGxpY2F0aW9uOwotICAgICAgZW50ZXJwcmlzZSBiZWFuOwotICAgICAgcmVzb3VyY2UgYWRhcHRlcjsgCi0gICAgICAKLSAgICAgIERlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICBlYXIgZmlsZTsKLSAgICAgIHdhciBmaWxlOwotICAgICAgamFyIGZpbGU7Ci0gICAgICByYXIgZmlsZTsKLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLz4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMy54c2QiLz4KLQotICA8eHNkOmdyb3VwIG5hbWU9ImRlc2NyaXB0aW9uR3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGdyb3VwIGtlZXBzIHRoZSB1c2FnZSBvZiB0aGUgY29udGFpbmVkIGRlc2NyaXB0aW9uIHJlbGF0ZWQKLSAgICAgICAgZWxlbWVudHMgY29uc2lzdGVudCBhY3Jvc3MgSmF2YSBFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLgotICAgICAgICAKLSAgICAgICAgQWxsIGVsZW1lbnRzIG1heSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudCBsYW5ndWFnZXMsCi0gICAgICAgIHRvIHN1cHBvcnQgbG9jYWxpemF0aW9uIG9mIHRoZSBjb250ZW50LgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkaXNwbGF5LW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpncm91cD4KLQotICA8eHNkOmdyb3VwIG5hbWU9ImpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgSk5ESSBlbnZpcm9ubWVudAotICAgICAgICByZWZlcmVuY2UgZWxlbWVudHMgY29uc2lzdGVudCBhY3Jvc3MgSmF2YSBFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZW52LWVudHJ5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbG9jYWwtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItbG9jYWwtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6c2VydmljZS1yZWZHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVzb3VyY2UtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBlcnNpc3RlbmNlLXVuaXQtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWNvbnN0cnVjdCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtZGVzdHJveSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhLXNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGF0YS1zb3VyY2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpncm91cD4KLQotICA8eHNkOmdyb3VwIG5hbWU9InJlc291cmNlR3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGdyb3VwIGNvbGxlY3RzIGVsZW1lbnRzIHRoYXQgYXJlIGNvbW1vbiB0byBtb3N0Ci0gICAgICAgIEpOREkgcmVzb3VyY2UgZWxlbWVudHMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlQmFzZUdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9va3VwLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIEpOREkgbmFtZSB0byBiZSBsb29rZWQgdXAgdG8gcmVzb2x2ZSBhIHJlc291cmNlIHJlZmVyZW5jZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpncm91cD4KLQotICA8eHNkOmdyb3VwIG5hbWU9InJlc291cmNlQmFzZUdyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBncm91cCBjb2xsZWN0cyBlbGVtZW50cyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIHRoZQotICAgICAgICBKTkRJIHJlc291cmNlIGVsZW1lbnRzLiBJdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBsb29rdXAtbmFtZQotICAgICAgICBlbGVtZW50LCB0aGF0IGlzIG9ubHkgYXBwbGljYWJsZSB0byBzb21lIHJlc291cmNlIGVsZW1lbnRzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKLSAgICAgICAgICAgIG1hcHBlZCB0by4gIFRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UsIGFzIGRlZmluZWQgYnkgdGhlCi0gICAgICAgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCi0gICAgICAgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KLSAgICAgICAgICAgIChJdCdzIGEgbmFtZSBpbiB0aGUgSk5ESSBqYXZhOmNvbXAvZW52IG5hbWVzcGFjZS4pICBNYW55Ci0gICAgICAgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCi0gICAgICAgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBzZXJ2ZXIuICBUaGlzIG1hcHBlZCBuYW1lIGlzIG9mdGVuIGEgZ2xvYmFsIEpOREkgbmFtZSwKLSAgICAgICAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLSAgICAgICAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLSAgICAgICAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKLSAgICAgICAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLSAgICAgICAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5qZWN0aW9uLXRhcmdldCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aW5qZWN0aW9uLXRhcmdldFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmdyb3VwPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGEtc291cmNlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIENvbmZpZ3VyYXRpb24gb2YgYSBEYXRhU291cmNlLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgRGVzY3JpcHRpb24gb2YgdGhpcyBEYXRhU291cmNlLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBKTkRJIG5hbWUgb2YgdGhlCi0gICAgICAgICAgICBkYXRhIHNvdXJjZSBiZWluZyBkZWZpbmVkLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBEYXRhU291cmNlLCBYQURhdGFTb3VyY2Ugb3IgQ29ubmVjdGlvblBvb2xEYXRhU291cmNlCi0gICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZlci1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgRGF0YWJhc2Ugc2VydmVyIG5hbWUuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LW51bWJlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkSW50ZWdlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgUG9ydCBudW1iZXIgd2hlcmUgYSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIGZvciByZXF1ZXN0cy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGFiYXNlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBOYW1lIG9mIGEgZGF0YWJhc2Ugb24gYSBzZXJ2ZXIuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmpkYmMtdXJsVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICAgICAgQSBKREJDIFVSTC4gSWYgdGhlIDxjb2RlPnVybDwvY29kZT4gcHJvcGVydHkgaXMgc3BlY2lmaWVkCi0gICAgICAgICAgICBhbG9uZyB3aXRoIG90aGVyIHN0YW5kYXJkIDxjb2RlPkRhdGFTb3VyY2U8L2NvZGU+IHByb3BlcnRpZXMKLSAgICAgICAgICAgIHN1Y2ggYXMgPGNvZGU+c2VydmVyTmFtZTwvY29kZT4sIDxjb2RlPmRhdGFiYXNlTmFtZTwvY29kZT4KLSAgICAgICAgICAgIGFuZCA8Y29kZT5wb3J0TnVtYmVyPC9jb2RlPiwgdGhlIG1vcmUgc3BlY2lmaWMgcHJvcGVydGllcyB3aWxsCi0gICAgICAgICAgICB0YWtlIHByZWNlZGVuY2UgYW5kIDxjb2RlPnVybDwvY29kZT4gd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVXNlciBuYW1lIHRvIHVzZSBmb3IgY29ubmVjdGlvbiBhdXRoZW50aWNhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhc3N3b3JkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgUGFzc3dvcmQgdG8gdXNlIGZvciBjb25uZWN0aW9uIGF1dGhlbnRpY2F0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBKREJDIERhdGFTb3VyY2UgcHJvcGVydHkuICBUaGlzIG1heSBiZSBhIHZlbmRvci1zcGVjaWZpYwotICAgICAgICAgICAgcHJvcGVydHkgb3IgYSBsZXNzIGNvbW1vbmx5IHVzZWQgRGF0YVNvdXJjZSBwcm9wZXJ0eS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luLXRpbWVvdXQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZEludGVnZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFNldHMgdGhlIG1heGltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgdGhpcyBkYXRhIHNvdXJjZQotICAgICAgICAgICAgd2lsbCB3YWl0IHdoaWxlIGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBhIGRhdGFiYXNlLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNhY3Rpb25hbCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkQm9vbGVhblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgU2V0IHRvIGZhbHNlIGlmIGNvbm5lY3Rpb25zIHNob3VsZCBub3QgcGFydGljaXBhdGUgaW4KLSAgICAgICAgICAgIHRyYW5zYWN0aW9ucy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imlzb2xhdGlvbi1sZXZlbCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aXNvbGF0aW9uLWxldmVsVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBJc29sYXRpb24gbGV2ZWwgZm9yIGNvbm5lY3Rpb25zLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdGlhbC1wb29sLXNpemUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZEludGVnZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIE51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IHNob3VsZCBiZSBjcmVhdGVkIHdoZW4gYQotICAgICAgICAgICAgY29ubmVjdGlvbiBwb29sIGlzIGluaXRpYWxpemVkLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LXBvb2wtc2l6ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkSW50ZWdlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCBzaG91bGQgYmUgY29uY3VycmVudGx5Ci0gICAgICAgICAgICBhbGxvY2F0ZWQgZm9yIGEgY29ubmVjdGlvbiBwb29sLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWluLXBvb2wtc2l6ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkSW50ZWdlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgTWluaW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCBzaG91bGQgYmUgY29uY3VycmVudGx5Ci0gICAgICAgICAgICBhbGxvY2F0ZWQgZm9yIGEgY29ubmVjdGlvbiBwb29sLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LWlkbGUtdGltZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkSW50ZWdlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIG51bWJlciBvZiBzZWNvbmRzIHRoYXQgYSBwaHlzaWNhbCBjb25uZWN0aW9uIHNob3VsZAotICAgICAgICAgICAgcmVtYWluIHVudXNlZCBpbiB0aGUgcG9vbCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMKLSAgICAgICAgICAgIGNsb3NlZCBmb3IgYSBjb25uZWN0aW9uIHBvb2wuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtc3RhdGVtZW50cyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkSW50ZWdlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHRvdGFsIG51bWJlciBvZiBzdGF0ZW1lbnRzIHRoYXQgYSBjb25uZWN0aW9uIHBvb2wKLSAgICAgICAgICAgIHNob3VsZCBrZWVwIG9wZW4uCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVzY3JpcHRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8KLSAgICAgICAgcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGVsZW1lbnRzCi0gICAgICAgIHRoYXQgdXNlIHRoaXMgdHlwZSBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUKLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgZmlsZSBwcm9kdWNlciB3YW50cwotICAgICAgICB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncwotICAgICAgICBEZXBsb3ltZW50IEZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlCi0gICAgICAgIHRvb2xzIHVzZWQgYnkgc3VjaCBhIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkKLSAgICAgICAgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdAotICAgICAgICBjb250YWlucyB0aGUgZGVzY3JpcHRpb24uCi0gICAgICAgIAotICAgICAgICBUaGUgbGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLSAgICAgICAgZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQgaW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpLiAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRld2V5LXZlcnNpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyB0eXBlIGRlZmluZXMgYSBkZXdleSBkZWNpbWFsIHRoYXQgaXMgdXNlZAotICAgICAgICB0byBkZXNjcmliZSB2ZXJzaW9ucyBvZiBkb2N1bWVudHMuIAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlwuP1swLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzcGxheS1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgIFRoZSBkaXNwbGF5LW5hbWUgdHlwZSBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZAotICAgICAgICB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMuIEl0IGlzIHVzZWQgYnkgZGlzcGxheS1uYW1lCi0gICAgICAgIGVsZW1lbnRzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlOiAKLSAgICAgICAgCi0gICAgICAgIC4uLgotICAgICAgICA8ZGlzcGxheS1uYW1lIHhtbDpsYW5nPSJlbiI+Ci0gICAgICAgIEVtcGxveWVlIFNlbGYgU2VydmljZQotICAgICAgICA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgCi0gICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIGlzICJlbiIgKEVuZ2xpc2gpIGJ5IGRlZmF1bHQuIAotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItbGlua1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgZWpiLWxpbmtUeXBlIGlzIHVzZWQgYnkgZWpiLWxpbmsKLSAgICAgICAgZWxlbWVudHMgaW4gdGhlIGVqYi1yZWYgb3IgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyB0byBzcGVjaWZ5Ci0gICAgICAgIHRoYXQgYW4gRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gZW50ZXJwcmlzZSBiZWFuLgotICAgICAgICAKLSAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuCi0gICAgICAgIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgc2FtZSBlamItamFyIGZpbGUgb3IgaW4gYW5vdGhlciBlamItamFyCi0gICAgICAgIGZpbGUgaW4gdGhlIHNhbWUgSmF2YSBFRSBhcHBsaWNhdGlvbiB1bml0LiAKLSAgICAgICAgCi0gICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBuYW1lIGluIHRoZSBlamItbGluayBlbGVtZW50IG1heSBiZQotICAgICAgICBjb21wb3NlZCBvZiBhIHBhdGggbmFtZSBzcGVjaWZ5aW5nIHRoZSBlamItamFyIGNvbnRhaW5pbmcgdGhlCi0gICAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuIHdpdGggdGhlIGVqYi1uYW1lIG9mIHRoZSB0YXJnZXQKLSAgICAgICAgYmVhbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGggbmFtZSBieSAiIyIuICBUaGUKLSAgICAgICAgcGF0aCBuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBEZXBsb3ltZW50IEZpbGUgY29udGFpbmluZwotICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlCi0gICAgICAgIGJlYW4uICBUaGlzIGFsbG93cyBtdWx0aXBsZSBlbnRlcnByaXNlIGJlYW5zIHdpdGggdGhlIHNhbWUKLSAgICAgICAgZWpiLW5hbWUgdG8gYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KLSAgICAgICAgCi0gICAgICAgIEV4YW1wbGVzOgotICAgICAgICAKLSAgICAgICAgPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLSAgICAgICAgCi0gICAgICAgIDxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1sb2NhbC1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1sb2NhbC1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyBmb3IKLSAgICAgICAgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsCi0gICAgICAgIGhvbWUgb3IgdG8gdGhlIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLgotICAgICAgICBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0gICAgICAgIAotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gICAgICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSBEZXBsb3ltZW50IAotICAgICAgICBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4uCi0gICAgICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gICAgICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGxvY2FsIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZCAKLSAgICAgICAgZW50ZXJwcmlzZSBiZWFuIG9yIHRoZSBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgdGhlIAotICAgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLSAgICAgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgbG9jYWwgaG9tZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQgCi0gICAgICAgIGVudGVycHJpc2UgYmVhbi4gTm90IGFwcGxpY2FibGUgaWYgdGhpcyBlamItbG9jYWwtcmVmIHJlZmVycwotICAgICAgICB0byB0aGUgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uCi0gICAgICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUgCi0gICAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gICAgICAgIC0gb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZiB0aGUgbmFtZWQgZW50ZXJwcmlzZSAgCi0gICAgICAgIGJlYW4gaW50byBhIGNvbXBvbmVudCBmaWVsZCBvciBwcm9wZXJ0eS4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLXJlZi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLXJlZi10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbC1ob21lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsb2NhbC1ob21lVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bG9jYWxUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItbGlua1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlZi1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQuCi0gICAgICAgIAotICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlOgotICAgICAgICAKLSAgICAgICAgPGVqYi1yZWYtbmFtZT5lamIvUGF5cm9sbDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLXJlZiBlbGVtZW50cyBmb3IgdGhlCi0gICAgICAgIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUgb3IKLSAgICAgICAgdG8gdGhlIHJlbW90ZSBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4gIAotICAgICAgICBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0gICAgICAgIAotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gICAgICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mCi0gICAgICAgIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UKLSAgICAgICAgYmVhbi4gCi0gICAgICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gICAgICAgIC0gdGhlIG9wdGlvbmFsIHJlbW90ZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gICAgICAgIG9yIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgCi0gICAgICAgIGJlYW4KLSAgICAgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgaG9tZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQgCi0gICAgICAgIGVudGVycHJpc2UgYmVhbi4gIE5vdCBhcHBsaWNhYmxlIGlmIHRoaXMgZWpiLXJlZgotICAgICAgICByZWZlcnMgdG8gdGhlIHJlbW90ZSBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4KLSAgICAgICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQotICAgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgICAgICAtIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YgdGhlIG5hbWVkIGVudGVycHJpc2UKLSAgICAgICAgYmVhbiBpbnRvIGEgY29tcG9uZW50IGZpZWxkIG9yIHByb3BlcnR5Ci0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1yZWYtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1yZWYtdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG9tZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aG9tZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZW1vdGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItbGlua1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlZi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVmLXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZQotICAgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLSAgICAgICAgCi0gICAgICAgIFRoZSBlamItcmVmLXR5cGUgZGVzaWduYXRlcyBhIHZhbHVlCi0gICAgICAgIHRoYXQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgCi0gICAgICAgIEVudGl0eQotICAgICAgICBTZXNzaW9uCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXNzaW9uIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIHR5cGUgaXMgdXNlZCB0byBkZXNpZ25hdGUgYW4gZW1wdHkKLSAgICAgICAgZWxlbWVudCB3aGVuIHVzZWQuIAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW52LWVudHJ5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnYtZW50cnlUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhbiBhcHBsaWNhdGlvbidzCi0gICAgICAgIGVudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLSAgICAgICAgZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYSB0eXBlCi0gICAgICAgIChvcHRpb25hbCBpZiB0aGUgdmFsdWUgaXMgaW5qZWN0ZWQsIG90aGVyd2lzZSByZXF1aXJlZCksIGFuZAotICAgICAgICBhbiBvcHRpb25hbCB2YWx1ZS4KLSAgICAgICAgCi0gICAgICAgIEl0IGFsc28gaW5jbHVkZXMgb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZgotICAgICAgICB0aGUgbmFtZWQgcmVzb3VyY2UgaW50byBmaWVsZHMgb3IgSmF2YUJlYW5zIHByb3BlcnRpZXMuCi0gICAgICAgIAotICAgICAgICBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgYW5kIGluamVjdGlvbiBpcyByZXF1ZXN0ZWQsCi0gICAgICAgIG5vIGluamVjdGlvbiB3aWxsIG9jY3VyIGFuZCBubyBlbnRyeSBvZiB0aGUgc3BlY2lmaWVkIG5hbWUKLSAgICAgICAgd2lsbCBiZSBjcmVhdGVkLiAgVGhpcyBhbGxvd3MgYW4gaW5pdGlhbCB2YWx1ZSB0byBiZQotICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZSBjb2RlIHdpdGhvdXQgYmVpbmcgaW5jb3JyZWN0bHkKLSAgICAgICAgY2hhbmdlZCB3aGVuIG5vIG92ZXJyaWRlIGhhcyBiZWVuIHNwZWNpZmllZC4KLSAgICAgICAgCi0gICAgICAgIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBhbmQgbm8gaW5qZWN0aW9uIGlzIHJlcXVlc3RlZCwKLSAgICAgICAgYSB2YWx1ZSBtdXN0IGJlIHN1cHBsaWVkIGR1cmluZyBkZXBsb3ltZW50LiAKLSAgICAgICAgCi0gICAgICAgIFRoaXMgdHlwZSBpcyB1c2VkIGJ5IGVudi1lbnRyeSBlbGVtZW50cy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqbmRpLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZQotICAgICAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLSAgICAgICAgICAgIGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSAKLSAgICAgICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50LiBUaGUgdW5pcXVlbmVzcwotICAgICAgICAgICAgY29uc3RyYWludHMgbXVzdCBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgZGVjbGFyZWQKLSAgICAgICAgICAgIGNvbnRleHQuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5taW5BbW91bnQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICAgICAgVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIEphdmEgbGFuZ3VhZ2UKLSAgICAgICAgICAgIHR5cGUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LiAgSWYgYW4gaW5qZWN0aW9uIHRhcmdldAotICAgICAgICAgICAgaXMgc3BlY2lmaWVkIGZvciB0aGUgZW52aXJvbm1lbnQgZW50cnksIHRoZSB0eXBlIG1heQotICAgICAgICAgICAgYmUgb21pdHRlZCwgb3IgbXVzdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgaW5qZWN0aW9uCi0gICAgICAgICAgICB0YXJnZXQuICBJZiBubyBpbmplY3Rpb24gdGFyZ2V0IGlzIHNwZWNpZmllZCwgdGhlIHR5cGUKLSAgICAgICAgICAgIGlzIHJlcXVpcmVkLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGFtcGxlOgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgICAgIFRoZSBlbnYtZW50cnktdmFsdWUgZGVzaWduYXRlcyB0aGUgdmFsdWUgb2YgYQotICAgICAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlCi0gICAgICAgICAgICBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZQotICAgICAgICAgICAgY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYQotICAgICAgICAgICAgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIsIG9yIGZvciBqYXZhLmxhbmcuQ2hhcmFjdGVyLAotICAgICAgICAgICAgYSBzaW5nbGUgY2hhcmFjdGVyLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGFtcGxlOgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPjEwMC4wMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6cmVzb3VyY2VHcm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mIHRoZQotICAgICAgICBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZQotICAgICAgICBhcHBsaWNhdGlvbidzIGNvZGUuCi0gICAgICAgIAotICAgICAgICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGU6Ci0gICAgICAgIAotICAgICAgICBqYXZhLmxhbmcuQm9vbGVhbgotICAgICAgICBqYXZhLmxhbmcuQnl0ZQotICAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyCi0gICAgICAgIGphdmEubGFuZy5TdHJpbmcKLSAgICAgICAgamF2YS5sYW5nLlNob3J0Ci0gICAgICAgIGphdmEubGFuZy5JbnRlZ2VyCi0gICAgICAgIGphdmEubGFuZy5Mb25nCi0gICAgICAgIGphdmEubGFuZy5GbG9hdAotICAgICAgICBqYXZhLmxhbmcuRG91YmxlCi0gICAgICAgIAkJICBqYXZhLmxhbmcuQ2xhc3MKLSAgICAgICAgCQkgIGFueSBlbnVtZXJhdGlvbiB0eXBlIChpLmUuIGEgc3ViY2xhc3Mgb2YgamF2YS5sYW5nLkVudW0pCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlczoKLSAgICAgICAgCi0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2xhc3M8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+Y29tLmV4YW1wbGUuQ29sb3I8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSB0aGUgbmFtZSBvZiBhCi0gICAgICAgIEphdmEgY2xhc3Mgb3IgaW50ZXJmYWNlLiAgVGhlIG5hbWUgaXMgaW4gdGhlIGZvcm0gb2YgYQotICAgICAgICAiYmluYXJ5IG5hbWUiLCBhcyBkZWZpbmVkIGluIHRoZSBKTFMuICBUaGlzIGlzIHRoZSBmb3JtCi0gICAgICAgIG9mIG5hbWUgdXNlZCBpbiBDbGFzcy5mb3JOYW1lKCkuICBUb29scyB0aGF0IG5lZWQgdGhlCi0gICAgICAgIGNhbm9uaWNhbCBuYW1lICh0aGUgbmFtZSB1c2VkIGluIHNvdXJjZSBjb2RlKSB3aWxsIG5lZWQKLSAgICAgICAgdG8gY29udmVydCB0aGlzIGJpbmFyeSBuYW1lIHRvIHRoZSBjYW5vbmljYWwgbmFtZS4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJpYy1ib29sZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgdHlwZSBkZWZpbmVzIGZvdXIgZGlmZmVyZW50IHZhbHVlcyB3aGljaCBjYW4gZGVzaWduYXRlCi0gICAgICAgIGJvb2xlYW4gdmFsdWVzLiBUaGlzIGluY2x1ZGVzIHZhbHVlcyB5ZXMgYW5kIG5vIHdoaWNoIGFyZSAKLSAgICAgICAgbm90IGRlc2lnbmF0ZWQgYnkgeHNkOmJvb2xlYW4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZXMiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8iLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imljb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGljb24gdHlwZSBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzCi0gICAgICAgIHRoYXQgc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiwgSlBFRywKLSAgICAgICAgb3IgUE5HIGljb24gaW1hZ2VzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhCi0gICAgICAgIEdVSSB0b29sLiAKLSAgICAgICAgCi0gICAgICAgIFRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLSAgICAgICAgaWNvbiBmaWxlIG5hbWVzIGFyZSBwcm92aWRlZCBpbi4gSXRzIHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpCi0gICAgICAgIGJ5IGRlZmF1bHQuIAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNtYWxsLWljb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICBUaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotICAgICAgICAgICAgY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQotICAgICAgICAgICAgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50Ci0gICAgICAgICAgICBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRoZSBpbWFnZSBtYXkgYmUgaW4gdGhlIEdJRiwgSlBFRywgb3IgUE5HIGZvcm1hdC4KLSAgICAgICAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGFtcGxlOgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxhcmdlLWljb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICBUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotICAgICAgICAgICAgY29udGFpbmluZyBhIGxhcmdlCi0gICAgICAgICAgICAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIAotICAgICAgICAgICAgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudAotICAgICAgICAgICAgRmlsZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgVGhlIGltYWdlIG1heSBiZSBpbiB0aGUgR0lGLCBKUEVHLCBvciBQTkcgZm9ybWF0LgotICAgICAgICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmplY3Rpb24tdGFyZ2V0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEFuIGluamVjdGlvbiB0YXJnZXQgc3BlY2lmaWVzIGEgY2xhc3MgYW5kIGEgbmFtZSB3aXRoaW4KLSAgICAgICAgdGhhdCBjbGFzcyBpbnRvIHdoaWNoIGEgcmVzb3VyY2Ugc2hvdWxkIGJlIGluamVjdGVkLgotICAgICAgICAKLSAgICAgICAgVGhlIGluamVjdGlvbiB0YXJnZXQgY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQKLSAgICAgICAgY2xhc3MgbmFtZSB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIGluamVjdGlvbi4gIFRoZQotICAgICAgICBKYXZhIEVFIHNwZWNpZmljYXRpb25zIGRlc2NyaWJlIHdoaWNoIGNsYXNzZXMgY2FuIGJlIGFuCi0gICAgICAgIGluamVjdGlvbiB0YXJnZXQuCi0gICAgICAgIAotICAgICAgICBUaGUgaW5qZWN0aW9uIHRhcmdldCBuYW1lIHNwZWNpZmllcyB0aGUgdGFyZ2V0IHdpdGhpbgotICAgICAgICB0aGUgc3BlY2lmaWVkIGNsYXNzLiAgVGhlIHRhcmdldCBpcyBmaXJzdCBsb29rZWQgZm9yIGFzIGEKLSAgICAgICAgSmF2YUJlYW5zIHByb3BlcnR5IG5hbWUuICBJZiBub3QgZm91bmQsIHRoZSB0YXJnZXQgaXMKLSAgICAgICAgbG9va2VkIGZvciBhcyBhIGZpZWxkIG5hbWUuCi0gICAgICAgIAotICAgICAgICBUaGUgc3BlY2lmaWVkIHJlc291cmNlIHdpbGwgYmUgaW5qZWN0ZWQgaW50byB0aGUgdGFyZ2V0Ci0gICAgICAgIGR1cmluZyBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2xhc3MgYnkgZWl0aGVyIGNhbGxpbmcgdGhlCi0gICAgICAgIHNldCBtZXRob2QgZm9yIHRoZSB0YXJnZXQgcHJvcGVydHkgb3IgYnkgc2V0dGluZyBhIHZhbHVlCi0gICAgICAgIGludG8gdGhlIG5hbWVkIGZpZWxkLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluamVjdGlvbi10YXJnZXQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmplY3Rpb24tdGFyZ2V0LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Imlzb2xhdGlvbi1sZXZlbFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAJVGhlIGZvbGxvd2luZyB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWxzIGFyZSBhbGxvd2VkCi0gICAgICAgIAkoc2VlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBqYXZhLnNxbC5Db25uZWN0aW9uIGludGVyZmFjZSk6Ci0gICAgICAgIFRSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUQKLSAgICAgICAgVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUQKLSAgICAgICAgVFJBTlNBQ1RJT05fUkVQRUFUQUJMRV9SRUFECi0gICAgICAgIFRSQU5TQUNUSU9OX1NFUklBTElaQUJMRQotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFJBTlNBQ1RJT05fUkVBRF9VTkNPTU1JVFRFRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSQU5TQUNUSU9OX1JFUEVBVEFCTEVfUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFJBTlNBQ1RJT05fU0VSSUFMSVpBQkxFIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1pZGVudGlmaWVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBqYXZhLWlkZW50aWZpZXJUeXBlIGRlZmluZXMgYSBKYXZhIGlkZW50aWZpZXIuCi0gICAgICAgIFRoZSB1c2VycyBvZiB0aGlzIHR5cGUgc2hvdWxkIGZ1cnRoZXIgdmVyaWZ5IHRoYXQgCi0gICAgICAgIHRoZSBjb250ZW50IGRvZXMgbm90IGNvbnRhaW4gSmF2YSByZXNlcnZlZCBrZXl3b3Jkcy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIoJHxffFxwe0x9KShccHtMfXxccHtOZH18X3wkKSoiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGlzIGEgZ2VuZXJpYyB0eXBlIHRoYXQgZGVzaWduYXRlcyBhIEphdmEgcHJpbWl0aXZlCi0gICAgICAgIHR5cGUgb3IgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgaW50ZXJmYWNlL3R5cGUsCi0gICAgICAgIG9yIGFuIGFycmF5IG9mIHN1Y2ggdHlwZXMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iW15ccHtafV0qIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqZGJjLXVybFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgamRiYy11cmxUeXBlIGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4KLSAgICAgICAgSXQgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDkuMyBvZiB0aGUKLSAgICAgICAgSkRCQyBTcGVjaWZpY2F0aW9uIHdoZXJlIHRoZSBmb3JtYXQgaXM6Ci0gICAgICAgIAotICAgICAgICBqZGJjOjxzdWJwcm90b2NvbD46PHN1Ym5hbWU+Ci0gICAgICAgIAotICAgICAgICBFeGFtcGxlOgotICAgICAgICAKLSAgICAgICAgPHVybD5qZGJjOm15c3FsOi8vbG9jYWxob3N0OjMzMDcvdGVzdGRiPC91cmw+Ci0gICAgICAgIAotICAgICAgICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9ImpkYmM6KC4qKTooLiopIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbmRpLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGpuZGktbmFtZVR5cGUgdHlwZSBkZXNpZ25hdGVzIGEgSk5ESSBuYW1lIGluIHRoZQotICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgQSBKTkRJIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaG9tZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgaG9tZVR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YKLSAgICAgICAgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuIAotICAgICAgICAKLSAgICAgICAgRXhhbXBsZToKLSAgICAgICAgCi0gICAgICAgIDxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC9ob21lPgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxpZmVjeWNsZS1jYWxsYmFja1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbGlmZWN5Y2xlLWNhbGxiYWNrIHR5cGUgc3BlY2lmaWVzIGEgbWV0aG9kIG9uIGEKLSAgICAgICAgY2xhc3MgdG8gYmUgY2FsbGVkIHdoZW4gYSBsaWZlY3ljbGUgZXZlbnQgb2NjdXJzLgotICAgICAgICBOb3RlIHRoYXQgZWFjaCBjbGFzcyBtYXkgaGF2ZSBvbmx5IG9uZSBsaWZlY3ljbGUgY2FsbGJhY2sKLSAgICAgICAgbWV0aG9kIGZvciBhbnkgZ2l2ZW4gZXZlbnQgYW5kIHRoYXQgdGhlIG1ldGhvZCBtYXkgbm90Ci0gICAgICAgIGJlIG92ZXJsb2FkZWQuCi0gICAgICAgIAotICAgICAgICBJZiB0aGUgbGlmZWZ5Y2xlLWNhbGxiYWNrLWNsYXNzIGVsZW1lbnQgaXMgbWlzc2luZyB0aGVuCi0gICAgICAgIHRoZSBjbGFzcyBkZWZpbmluZyB0aGUgY2FsbGJhY2sgaXMgYXNzdW1lZCB0byBiZSB0aGUKLSAgICAgICAgY29tcG9uZW50IGNsYXNzIGluIHNjb3BlIGF0IHRoZSBwbGFjZSBpbiB0aGUgZGVzY3JpcHRvcgotICAgICAgICBpbiB3aGljaCB0aGUgY2FsbGJhY2sgZGVmaW5pdGlvbiBhcHBlYXJzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZS1jYWxsYmFjay1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaWZlY3ljbGUtY2FsbGJhY2stbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imxpc3RlbmVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBsaXN0ZW5lclR5cGUgaW5kaWNhdGVzIHRoZSBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViCi0gICAgICAgIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0ZW5lci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBsaXN0ZW5lci1jbGFzcyBlbGVtZW50IGRlY2xhcmVzIGEgY2xhc3MgaW4gdGhlCi0gICAgICAgICAgICBhcHBsaWNhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIFRoZSB2YWx1ZSBpcyB0aGUgZnVsbHkKLSAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGxpc3RlbmVyIGNsYXNzLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBsb2NhbFR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KLSAgICAgICAgZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaW50ZXJmYWNlLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWwtaG9tZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbG9jYWwtaG9tZVR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkCi0gICAgICAgIG5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaG9tZSBpbnRlcmZhY2UuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJhbS12YWx1ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIHR5cGUgaXMgYSBnZW5lcmFsIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNsYXJlCi0gICAgICAgIHBhcmFtZXRlci92YWx1ZSBsaXN0cy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBwYXJhbS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICAgICAgcGFyYW1ldGVyLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0tdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYQotICAgICAgICAgICAgcGFyYW1ldGVyLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhdGhUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgZWl0aGVyIGEgcmVsYXRpdmUKLSAgICAgICAgcGF0aCBvciBhbiBhYnNvbHV0ZSBwYXRoIHN0YXJ0aW5nIHdpdGggYSAiLyIuCi0gICAgICAgIAotICAgICAgICBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICAgICAgICBzYW1lIERlcGxveW1lbnQgRmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAgICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gICAgICAgIHRoZSBEZXBsb3ltZW50IEZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sCi0gICAgICAgIHRob3NlIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YKLSAgICAgICAgdGhlIERlcGxveW1lbnQgRmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzCi0gICAgICAgIGFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgICAgICAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgIFRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLSAgICAgICAgb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBwZXJzaXN0ZW5jZSBjb250ZXh0Ci0gICAgICAgIGFzc29jaWF0ZWQgd2l0aGluIGEgRGVwbG95bWVudCBDb21wb25lbnQncwotICAgICAgICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0gICAgICAgIAotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gICAgICAgIC0gdGhlIHBlcnNpc3RlbmNlIGNvbnRleHQgcmVmZXJlbmNlIG5hbWUKLSAgICAgICAgLSBhbiBvcHRpb25hbCBwZXJzaXN0ZW5jZSB1bml0IG5hbWUuICBJZiBub3Qgc3BlY2lmaWVkLAotICAgICAgICB0aGUgZGVmYXVsdCBwZXJzaXN0ZW5jZSB1bml0IGlzIGFzc3VtZWQuCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBhcyB0byB3aGV0aGVyCi0gICAgICAgIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHR5cGUgaXMgVHJhbnNhY3Rpb24gb3IKLSAgICAgICAgRXh0ZW5kZWQuICBJZiBub3Qgc3BlY2lmaWVkLCBUcmFuc2FjdGlvbiBpcyBhc3N1bWVkLgotICAgICAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgcGVyc2lzdGVuY2UgcHJvcGVydGllcwotICAgICAgICAtIG9wdGlvbmFsIGluamVjdGlvbiB0YXJnZXRzCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlczoKLSAgICAgICAgCi0gICAgICAgIDxwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZj4KLSAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWU+bXlQZXJzaXN0ZW5jZUNvbnRleHQKLSAgICAgICAgPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lPgotICAgICAgICA8L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmPgotICAgICAgICAKLSAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmPgotICAgICAgICA8cGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZT5teVBlcnNpc3RlbmNlQ29udGV4dAotICAgICAgICA8L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWU+Ci0gICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LW5hbWU+UGVyc2lzdGVuY2VVbml0MQotICAgICAgICA8L3BlcnNpc3RlbmNlLXVuaXQtbmFtZT4KLSAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZT5FeHRlbmRlZDwvcGVyc2lzdGVuY2UtY29udGV4dC10eXBlPgotICAgICAgICA8L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmPgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmpuZGktbmFtZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgcGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcwotICAgICAgICAgICAgdGhlIG5hbWUgb2YgYSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZTsgaXRzCi0gICAgICAgICAgICB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi0gICAgICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLSAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyKG9yIEJlYW5Qcm92aWRlcikgbWF5IHVzZSB0aGUKLSAgICAgICAgICAgIGZvbGxvd2luZyBzeW50YXggdG8gYXZvaWQgdGhlIG5lZWQgdG8gcmVuYW1lIHBlcnNpc3RlbmNlCi0gICAgICAgICAgICB1bml0cyB0byBoYXZlIHVuaXF1ZSBuYW1lcyB3aXRoaW4gYSBKYXZhIEVFIGFwcGxpY2F0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIHNwZWNpZmllcyB0aGUgcGF0aG5hbWUgb2YgdGhlCi0gICAgICAgICAgICByb290IG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSBmb3IgdGhlIHJlZmVyZW5jZWQKLSAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgYW5kIGFwcGVuZHMgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlCi0gICAgICAgICAgICB1bml0IHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRobmFtZSBieSAjLiBUaGUgcGF0aG5hbWUgaXMKLSAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2luZyBhcHBsaWNhdGlvbiBjb21wb25lbnQgamFyIGZpbGUuIAotICAgICAgICAgICAgSW4gdGhpcyBtYW5uZXIsIG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzIHdpdGggdGhlIHNhbWUKLSAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgbmFtZSBtYXkgYmUgdW5pcXVlbHkgaWRlbnRpZmllZCB3aGVuIHRoZSAKLSAgICAgICAgICAgIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBjYW5ub3QgY2hhbmdlIHBlcnNpc3RlbmNlIHVuaXQgbmFtZXMuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtcHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgcHJvcGVydGllcyBmb3IgdGhlIGNvbnRhaW5lciBvciBwZXJzaXN0ZW5jZQotICAgICAgICAgICAgcHJvdmlkZXIuICBWZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcyBtYXkgYmUgaW5jbHVkZWQgaW4KLSAgICAgICAgICAgIHRoZSBzZXQgb2YgcHJvcGVydGllcy4gIFByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHJlY29nbml6ZWQKLSAgICAgICAgICAgIGJ5IGEgdmVuZG9yIG11c3QgYmUgaWdub3JlZC4gIEVudHJpZXMgdGhhdCBtYWtlIHVzZSBvZiB0aGUgCi0gICAgICAgICAgICBuYW1lc3BhY2UgamF2YXgucGVyc2lzdGVuY2UgYW5kIGl0cyBzdWJuYW1lc3BhY2VzIG11c3Qgbm90Ci0gICAgICAgICAgICBiZSB1c2VkIGZvciB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcy4gIFRoZSBuYW1lc3BhY2UKLSAgICAgICAgICAgIGphdmF4LnBlcnNpc3RlbmNlIGlzIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIHNwZWNpZmljYXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6cmVzb3VyY2VCYXNlR3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtY29udGV4dC10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIHNwZWNpZmllcyB0aGUgdHJhbnNhY3Rpb25hbAotICAgICAgICBuYXR1cmUgb2YgYSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZS4gIAotICAgICAgICAKLSAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGUgZWxlbWVudCBtdXN0IGJlCi0gICAgICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgICBUcmFuc2FjdGlvbgotICAgICAgICBFeHRlbmRlZAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvcGVydHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgU3BlY2lmaWVzIGEgbmFtZS92YWx1ZSBwYWlyLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgcGVyc2lzdGVuY2UtdW5pdC1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uCi0gICAgICAgIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBhc3NvY2lhdGVkIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLSAgICAgICAgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgotICAgICAgICAKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgICAgICAtIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHJlZmVyZW5jZSBuYW1lCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgcGVyc2lzdGVuY2UgdW5pdCBuYW1lLiAgSWYgbm90IHNwZWNpZmllZCwKLSAgICAgICAgdGhlIGRlZmF1bHQgcGVyc2lzdGVuY2UgdW5pdCBpcyBhc3N1bWVkLgotICAgICAgICAtIG9wdGlvbmFsIGluamVjdGlvbiB0YXJnZXRzCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlczoKLSAgICAgICAgCi0gICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LXJlZj4KLSAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+bXlQZXJzaXN0ZW5jZVVuaXQKLSAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lPgotICAgICAgICA8L3BlcnNpc3RlbmNlLXVuaXQtcmVmPgotICAgICAgICAKLSAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtcmVmPgotICAgICAgICA8cGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZT5teVBlcnNpc3RlbmNlVW5pdAotICAgICAgICA8L3BlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+Ci0gICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LW5hbWU+UGVyc2lzdGVuY2VVbml0MQotICAgICAgICA8L3BlcnNpc3RlbmNlLXVuaXQtbmFtZT4KLSAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LXJlZj4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqbmRpLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLSAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgcGVyc2lzdGVuY2UgdW5pdCByZWZlcmVuY2U7IGl0cwotICAgICAgICAgICAgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotICAgICAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0gICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlcihvciBCZWFuUHJvdmlkZXIpIG1heSB1c2UgdGhlCi0gICAgICAgICAgICBmb2xsb3dpbmcgc3ludGF4IHRvIGF2b2lkIHRoZSBuZWVkIHRvIHJlbmFtZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAgdW5pdHMgdG8gaGF2ZSB1bmlxdWUgbmFtZXMgd2l0aGluIGEgSmF2YSBFRSBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBzcGVjaWZpZXMgdGhlIHBhdGhuYW1lIG9mIHRoZQotICAgICAgICAgICAgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgZm9yIHRoZSByZWZlcmVuY2VkCi0gICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IGFuZCBhcHBlbmRzIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAgdW5pdCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aG5hbWUgYnkgIy4gVGhlIHBhdGhuYW1lIGlzCi0gICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNpbmcgYXBwbGljYXRpb24gY29tcG9uZW50IGphciBmaWxlLiAKLSAgICAgICAgICAgIEluIHRoaXMgbWFubmVyLCBtdWx0aXBsZSBwZXJzaXN0ZW5jZSB1bml0cyB3aXRoIHRoZSBzYW1lCi0gICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IG5hbWUgbWF5IGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgd2hlbiB0aGUgCi0gICAgICAgICAgICBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgY2Fubm90IGNoYW5nZSBwZXJzaXN0ZW5jZSB1bml0IG5hbWVzLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlQmFzZUdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbW90ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lCi0gICAgICAgIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgotICAgICAgICAKLSAgICAgICAgRXhhbXBsZToKLSAgICAgICAgCi0gICAgICAgIDxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLWVudi1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhlIHJlc291cmNlLWVudi1yZWZUeXBlIGlzIHVzZWQgdG8gZGVmaW5lCi0gICAgICAgIHJlc291cmNlLWVudi1yZWYgZWxlbWVudHMuICBJdCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEKLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdAotICAgICAgICBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncwotICAgICAgICBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUKLSAgICAgICAgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBvcHRpb25hbAotICAgICAgICBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZQotICAgICAgICBleHBlY3RlZCBieSB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4KLSAgICAgICAgCi0gICAgICAgIEl0IGFsc28gaW5jbHVkZXMgb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZgotICAgICAgICB0aGUgbmFtZWQgcmVzb3VyY2UgaW50byBmaWVsZHMgb3IgSmF2YUJlYW5zIHByb3BlcnRpZXMuCi0gICAgICAgIAotICAgICAgICBUaGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgdHlwZSBtdXN0IGJlIHN1cHBsaWVkIHVubGVzcyBhbgotICAgICAgICBpbmplY3Rpb24gdGFyZ2V0IGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSB0aGUgdHlwZQotICAgICAgICBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlCi0gICAgICAgIG11c3QgYmUgYXNzaWdubWVudCBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUgb2YgdGhlIGluamVjdGlvbgotICAgICAgICB0YXJnZXQuCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlOgotICAgICAgICAKLSAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zL1N0b2NrUXVldWUKLSAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlCi0gICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIAotICAgICAgICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZi1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqbmRpLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotICAgICAgICAgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgCi0gICAgICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgCi0gICAgICAgICAgICBiZSB1bmlxdWUgd2l0aGluIGEgRGVwbG95bWVudCBDb21wb25lbnQuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZQotICAgICAgICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UuICBJdCBpcyB0aGUKLSAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBsYW5ndWFnZSBjbGFzcyBvcgotICAgICAgICAgICAgaW50ZXJmYWNlLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzb3VyY2UtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgIFRoZSByZXNvdXJjZS1yZWZUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQotICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQKLSAgICAgICAgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi0gICAgICAgIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgYW4gb3B0aW9uYWwgaW5kaWNhdGlvbiBvZgotICAgICAgICB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZSBleHBlY3RlZCBieSB0aGUKLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZSwgYW4gb3B0aW9uYWwgdHlwZSBvZiBhdXRoZW50aWNhdGlvbgotICAgICAgICAoQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YKLSAgICAgICAgdGhlIHNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZQotICAgICAgICAoU2hhcmVhYmxlIG9yIFVuc2hhcmVhYmxlKS4KLSAgICAgICAgCi0gICAgICAgIEl0IGFsc28gaW5jbHVkZXMgb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZgotICAgICAgICB0aGUgbmFtZWQgcmVzb3VyY2UgaW50byBmaWVsZHMgb3IgSmF2YUJlYW5zIHByb3BlcnRpZXMuCi0gICAgICAgIAotICAgICAgICBUaGUgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KLSAgICAgICAgaW5qZWN0aW9uIHRhcmdldCBpcyBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgdGhlIHR5cGUKLSAgICAgICAgb2YgdGhlIHRhcmdldCBpcyB1c2VkLiAgSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUgdHlwZQotICAgICAgICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KLSAgICAgICAgdGFyZ2V0LgotICAgICAgICAKLSAgICAgICAgRXhhbXBsZToKLSAgICAgICAgCi0gICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+amRiYy9FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgIAotICAgICAgICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXJlZi1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqbmRpLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0gICAgICAgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuCi0gICAgICAgICAgICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIAotICAgICAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgRGVwbG95bWVudCBGaWxlLiAKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy10eXBlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YQotICAgICAgICAgICAgc291cmNlLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIGZ1bGx5IHF1YWxpZmllZAotICAgICAgICAgICAgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UKLSAgICAgICAgICAgIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1hdXRoIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZXMtYXV0aFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXNoYXJpbmctc2NvcGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJlcy1zaGFyaW5nLXNjb3BlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6cmVzb3VyY2VHcm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXMtYXV0aFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzLWF1dGhUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudAotICAgICAgICBjb2RlIHNpZ25zIG9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yCi0gICAgICAgIHdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIKLSAgICAgICAgb24gYmVoYWxmIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudC4gSW4gdGhlIGxhdHRlciBjYXNlLAotICAgICAgICB0aGUgQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUKLSAgICAgICAgRGVwbG95ZXIuCi0gICAgICAgIAotICAgICAgICBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0gICAgICAgIAotICAgICAgICBBcHBsaWNhdGlvbgotICAgICAgICBDb250YWluZXIKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb24iLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXMtc2hhcmluZy1zY29wZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzLXNoYXJpbmctc2NvcGUgdHlwZSBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucwotICAgICAgICBvYnRhaW5lZCB0aHJvdWdoIHRoZSBnaXZlbiByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24KLSAgICAgICAgZmFjdG9yeSByZWZlcmVuY2UgY2FuIGJlIHNoYXJlZC4gVGhlIHZhbHVlLCBpZiBzcGVjaWZpZWQsCi0gICAgICAgIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotICAgICAgICAKLSAgICAgICAgU2hhcmVhYmxlCi0gICAgICAgIFVuc2hhcmVhYmxlCi0gICAgICAgIAotICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlYWJsZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNoYXJlYWJsZSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icnVuLWFzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBydW4tYXNUeXBlIHNwZWNpZmllcyB0aGUgcnVuLWFzIGlkZW50aXR5IHRvIGJlCi0gICAgICAgIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgYSBjb21wb25lbnQuIEl0IGNvbnRhaW5zIGFuIAotICAgICAgICBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyb2xlLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJvbGUtbmFtZVR5cGUgZGVzaWduYXRlcyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0gICAgICAgIAotICAgICAgICBUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGEgdG9rZW4uCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXJvbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhlIHNlY3VyaXR5LXJvbGVUeXBlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkKLSAgICAgICAgcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YKLSAgICAgICAgdGhlIHNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLgotICAgICAgICAKLSAgICAgICAgRXhhbXBsZToKLSAgICAgICAgCi0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobyBhcmUgYXV0aG9yaXplZAotICAgICAgICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgc2VjdXJpdHktcm9sZS1yZWZUeXBlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhCi0gICAgICAgIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIGluIGEgY29tcG9uZW50J3Mgb3IgYQotICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbgotICAgICAgICBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZSB1c2VkIGluIHRoZQotICAgICAgICBjb2RlLCBhbmQgYW4gb3B0aW9uYWwgbGluayB0byBhIHNlY3VyaXR5IHJvbGUuIElmIHRoZQotICAgICAgICBzZWN1cml0eSByb2xlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBEZXBsb3llciBtdXN0IGNob29zZSBhbgotICAgICAgICBhcHByb3ByaWF0ZSBzZWN1cml0eSByb2xlLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyb2xlLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSByb2xlLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBTdHJpbmcgdXNlZAotICAgICAgICAgICAgYXMgdGhlIHBhcmFtZXRlciB0byB0aGUgCi0gICAgICAgICAgICBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kIG9yIHRoZQotICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0LmlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgbWV0aG9kLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1saW5rIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyb2xlLW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQKLSAgICAgICAgICAgIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4KLSAgICAgICAgICAgIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUKLSAgICAgICAgICAgIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkUU5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOlFOYW1lLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6UU5hbWUiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkQm9vbGVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6Ym9vbGVhbi4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkTk1UT0tFTlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6Tk1UT0tFTi4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkQW55VVJJVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDphbnlVUkkuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDphbnlVUkkiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkSW50ZWdlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6aW50ZWdlci4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpwb3NpdGl2ZUludGVnZXIuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpwb3NpdGl2ZUludGVnZXIiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpub25OZWdhdGl2ZUludGVnZXIuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpub25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkU3RyaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpzdHJpbmcuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RyaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBpcyBhIHNwZWNpYWwgc3RyaW5nIGRhdGF0eXBlIHRoYXQgaXMgZGVmaW5lZCBieSBKYXZhIEVFIGFzCi0gICAgICAgIGEgYmFzZSB0eXBlIGZvciBkZWZpbmluZyBjb2xsYXBzZWQgc3RyaW5ncy4gV2hlbiBzY2hlbWFzCi0gICAgICAgIHJlcXVpcmUgdHJhaWxpbmcvbGVhZGluZyBzcGFjZSBlbGltaW5hdGlvbiBhcyB3ZWxsIGFzCi0gICAgICAgIGNvbGxhcHNpbmcgdGhlIGV4aXN0aW5nIHdoaXRlc3BhY2UsIHRoaXMgYmFzZSB0eXBlIG1heSBiZQotICAgICAgICB1c2VkLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJ1ZS1mYWxzZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIHNpbXBsZSB0eXBlIGRlc2lnbmF0ZXMgYSBib29sZWFuIHdpdGggb25seSB0d28KLSAgICAgICAgcGVybWlzc2libGUgdmFsdWVzCi0gICAgICAgIAotICAgICAgICAtIHRydWUKLSAgICAgICAgLSBmYWxzZQotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTp4c2RCb29sZWFuVHlwZSI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKHRydWV8ZmFsc2UpIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1cmwtcGF0dGVyblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgdXJsLXBhdHRlcm5UeXBlIGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4KLSAgICAgICAgSXQgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDExLjIgb2YgdGhlCi0gICAgICAgIFNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24uIFRoaXMgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGJlIGluCi0gICAgICAgIFVSTC1kZWNvZGVkIGZvcm0gYW5kIG11c3Qgbm90IGNvbnRhaW4gQ1IoI3hEKSBvciBMRigjeEEpLgotICAgICAgICBJZiBpdCBjb250YWlucyB0aG9zZSBjaGFyYWN0ZXJzLCB0aGUgY29udGFpbmVyIG11c3QgaW5mb3JtCi0gICAgICAgIHRoZSBkZXZlbG9wZXIgd2l0aCBhIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UuCi0gICAgICAgIFRoZSBjb250YWluZXIgbXVzdCBwcmVzZXJ2ZSBhbGwgY2hhcmFjdGVycyBpbmNsdWRpbmcgd2hpdGVzcGFjZXMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSBzcGVjaWZpZXMgYSBtZXNzYWdlCi0gICAgICAgIGRlc3RpbmF0aW9uLiBUaGUgbG9naWNhbCBkZXN0aW5hdGlvbiBkZXNjcmliZWQgYnkgdGhpcwotICAgICAgICBlbGVtZW50IGlzIG1hcHBlZCB0byBhIHBoeXNpY2FsIGRlc3RpbmF0aW9uIGJ5IHRoZSBEZXBsb3llci4KLSAgICAgICAgCi0gICAgICAgIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIGVsZW1lbnQgY29udGFpbnM6IAotICAgICAgICAKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgICAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXktbmFtZQotICAgICAgICAtIGFuIG9wdGlvbmFsIGljb24KLSAgICAgICAgLSBhIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZSB3aGljaCBtdXN0IGJlIHVuaXF1ZQotICAgICAgICBhbW9uZyBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWVzIHdpdGhpbiB0aGUgc2FtZSAKLSAgICAgICAgRGVwbG95bWVudCBGaWxlLiAKLSAgICAgICAgLSBhbiBvcHRpb25hbCBtYXBwZWQgbmFtZQotICAgICAgICAtIGFuIG9wdGlvbmFsIGxvb2t1cCBuYW1lCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlOiAKLSAgICAgICAgCi0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uPgotICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPkNvcnBvcmF0ZVN0b2NrcwotICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tbmFtZT4KLSAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uPgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhCi0gICAgICAgICAgICBuYW1lIGZvciBhIG1lc3NhZ2UgZGVzdGluYXRpb24uICBUaGlzIG5hbWUgbXVzdCBiZQotICAgICAgICAgICAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiBtZXNzYWdlIGRlc3RpbmF0aW9ucwotICAgICAgICAgICAgd2l0aGluIHRoZSBEZXBsb3ltZW50IEZpbGUuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgbWVzc2FnZSBkZXN0aW5hdGlvbgotICAgICAgICAgICAgc2hvdWxkIGJlIG1hcHBlZCB0by4gIEVhY2ggbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYKLSAgICAgICAgICAgIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRoaXMgbWVzc2FnZSBkZXN0aW5hdGlvbiB3aWxsCi0gICAgICAgICAgICBkZWZpbmUgYSBuYW1lIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jaW5nCi0gICAgICAgICAgICBjb21wb25lbnQgb3IgaW4gb25lIG9mIHRoZSBvdGhlciBwcmVkZWZpbmVkIG5hbWVzcGFjZXMuIAotICAgICAgICAgICAgTWFueSBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlCi0gICAgICAgICAgICBsb2NhbCBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlCi0gICAgICAgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXIuICBUaGlzIG1hcHBlZCBuYW1lIGlzIG9mdGVuIGEgZ2xvYmFsCi0gICAgICAgICAgICBKTkRJIG5hbWUsIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLiAgRWFjaCBvZiB0aGUKLSAgICAgICAgICAgIGxvY2FsIG5hbWVzIHNob3VsZCBiZSBtYXBwZWQgdG8gdGhpcyBzYW1lIGdsb2JhbCBuYW1lLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLSAgICAgICAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLSAgICAgICAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKLSAgICAgICAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLSAgICAgICAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9va3VwLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIEpOREkgbmFtZSB0byBiZSBsb29rZWQgdXAgdG8gcmVzb2x2ZSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uCi0gICAgICAgIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgbWVzc2FnZSBkZXN0aW5hdGlvbgotICAgICAgICBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0gICAgICAgIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjoKLSAgICAgICAgCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAgICAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZQotICAgICAgICAtIGFuIG9wdGlvbmFsIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZQotICAgICAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gYXMgdG8gd2hldGhlcgotICAgICAgICB0aGUgZGVzdGluYXRpb24gaXMgdXNlZCBmb3IgCi0gICAgICAgIGNvbnN1bWluZyBvciBwcm9kdWNpbmcgbWVzc2FnZXMsIG9yIGJvdGguCi0gICAgICAgIGlmIG5vdCBzcGVjaWZpZWQsICJib3RoIiBpcyBhc3N1bWVkLgotICAgICAgICAtIGFuIG9wdGlvbmFsIGxpbmsgdG8gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24KLSAgICAgICAgLSBvcHRpb25hbCBpbmplY3Rpb24gdGFyZ2V0cwotICAgICAgICAKLSAgICAgICAgVGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZSBtdXN0IGJlIHN1cHBsaWVkIHVubGVzcyBhbgotICAgICAgICBpbmplY3Rpb24gdGFyZ2V0IGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSB0aGUgdHlwZQotICAgICAgICBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlCi0gICAgICAgIG11c3QgYmUgYXNzaWdubWVudCBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUgb2YgdGhlIGluamVjdGlvbgotICAgICAgICB0YXJnZXQuCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlczoKLSAgICAgICAgCi0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4KLSAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+am1zL1N0b2NrUXVldWUKLSAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPgotICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQotICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT4KLSAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Q29uc3VtZXMKLSAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPgotICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPkNvcnBvcmF0ZVN0b2NrcwotICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tbGluaz4KLSAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqbmRpLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLSAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cwotICAgICAgICAgICAgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotICAgICAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUgc3BlY2lmaWVzIHRoZSB1c2Ugb2YgdGhlCi0gICAgICAgIG1lc3NhZ2UgZGVzdGluYXRpb24gaW5kaWNhdGVkIGJ5IHRoZSByZWZlcmVuY2UuICBUaGUgdmFsdWUKLSAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZXMgYXJlIGNvbnN1bWVkIGZyb20gdGhlIG1lc3NhZ2UKLSAgICAgICAgZGVzdGluYXRpb24sIHByb2R1Y2VkIGZvciB0aGUgZGVzdGluYXRpb24sIG9yIGJvdGguICBUaGUKLSAgICAgICAgQXNzZW1ibGVyIG1ha2VzIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uIGluIGxpbmtpbmcgcHJvZHVjZXJzCi0gICAgICAgIG9mIGEgZGVzdGluYXRpb24gd2l0aCBpdHMgY29uc3VtZXJzLgotICAgICAgICAKLSAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlIGVsZW1lbnQgbXVzdCBiZQotICAgICAgICBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgQ29uc3VtZXMKLSAgICAgICAgUHJvZHVjZXMKLSAgICAgICAgQ29uc3VtZXNQcm9kdWNlcwotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lcyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlcyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lc1Byb2R1Y2VzIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUgc3BlY2lmaWVzIHRoZSB0eXBlIG9mCi0gICAgICAgIHRoZSBkZXN0aW5hdGlvbi4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZQotICAgICAgICBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVzdGluYXRpb24uCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlOiAKLSAgICAgICAgCi0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCi0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSBpcyB1c2VkIHRvIGxpbmsgYSBtZXNzYWdlCi0gICAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBvciBtZXNzYWdlLWRyaXZlbiBiZWFuIHRvIGEgbWVzc2FnZQotICAgICAgICBkZXN0aW5hdGlvbi4KLSAgICAgICAgCi0gICAgICAgIFRoZSBBc3NlbWJsZXIgc2V0cyB0aGUgdmFsdWUgdG8gcmVmbGVjdCB0aGUgZmxvdyBvZiBtZXNzYWdlcwotICAgICAgICBiZXR3ZWVuIHByb2R1Y2VycyBhbmQgY29uc3VtZXJzIGluIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgICAgCi0gICAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgb2YgYSBtZXNzYWdlCi0gICAgICAgIGRlc3RpbmF0aW9uIGluIHRoZSBzYW1lIERlcGxveW1lbnQgRmlsZSBvciBpbiBhbm90aGVyCi0gICAgICAgIERlcGxveW1lbnQgRmlsZSBpbiB0aGUgc2FtZSBKYXZhIEVFIGFwcGxpY2F0aW9uIHVuaXQuCi0gICAgICAgIAotICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgdmFsdWUgbWF5IGJlIGNvbXBvc2VkIG9mIGEgcGF0aCBuYW1lCi0gICAgICAgIHNwZWNpZnlpbmcgYSBEZXBsb3ltZW50IEZpbGUgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZAotICAgICAgICBtZXNzYWdlIGRlc3RpbmF0aW9uIHdpdGggdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBvZiB0aGUKLSAgICAgICAgZGVzdGluYXRpb24gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRoIG5hbWUgYnkKLSAgICAgICAgIiMiLiBUaGUgcGF0aCBuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBEZXBsb3ltZW50IEZpbGUKLSAgICAgICAgY29udGFpbmluZyBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZQotICAgICAgICBtZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgbWVzc2FnZQotICAgICAgICBkZXN0aW5hdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhjYjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNzQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMS4yIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylqYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2RzCTEuMTggMDIvMTMvMDYKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAgICAgIFUuUy5BCi0gICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGUgd2Vic2VydmljZXMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGUgd2ViIHNlcnZpY2VzCi0JZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgSXQgc3BlY2lmaWVzIHRoZSBzZXQgb2Ygd2ViIHNlcnZpY2UKLQlkZXNjcmlwdGlvbnMgdGhhdCBhcmUgdG8gYmUgZGVwbG95ZWQgaW50byB0aGUgSmF2YSBFRSBBcHBsaWNhdGlvbgotCVNlcnZlciBhbmQgdGhlIGRlcGVuZGVuY2llcyB0aGV5IGhhdmUgb24gY29udGFpbmVyIHJlc291cmNlcyBhbmQKLQlzZXJ2aWNlcy4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAotCSJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiIGluIHRoZSB3ZWIgc2VydmljZXMnIGphciBmaWxlLgotCi0JVXNlZCBpbjogd2Vic2VydmljZXMueG1sCi0KLQlBbGwgd2Vic2VydmljZXMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZQotCXdlYnNlcnZpY2VzIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHZlcnNpb24KLQllbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDx3ZWJzZXJ2aWNlcyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQkJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZCIKLQkgICAgICB2ZXJzaW9uPSIxLjIiPgotCSAgICAgIC4uLgotCSAgICA8L3dlYnNlcnZpY2VzPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mIHRoZQotCXNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgdGhlIEphdmEgRUUKLQluYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlcyIgdHlwZT0iamF2YWVlOndlYnNlcnZpY2VzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYnNlcnZpY2VzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBmb3IgdGhlIHdlYiBzZXJ2aWNlcwotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEl0IHNwZWNpZmllcyB0aGUgc2V0IG9mIHdlYiBzZXJ2aWNlCi0JZGVzY3JpcHRpb25zIHRoYXQgYXJlIHRvIGJlIGRlcGxveWVkIGludG8gdGhlIEphdmEgRUUgQXBwbGljYXRpb24gU2VydmVyCi0JYW5kIHRoZSBkZXBlbmRlbmNpZXMgdGhleSBoYXZlIG9uIGNvbnRhaW5lciByZXNvdXJjZXMgYW5kIHNlcnZpY2VzLgotCi0JVXNlZCBpbjogd2Vic2VydmljZXMueG1sCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSBpZGVudGlmaWVzIHRoZSBjb2xsZWN0aW9uIG9mCi0JICBwb3J0LWNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgV1NETCBmaWxlIGFuZCBKQVgtUlBDIG1hcHBpbmcuIFRoZQotCSAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOndlYnNlcnZpY2UtZGVzY3JpcHRpb24iLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTp3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImhhbmRsZXItY2hhaW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWluLgotICAgICAgSGFuZGxlcmNoYWluIGNhbiBiZSBkZWZpbmVkIHN1Y2ggdGhhdCB0aGUgaGFuZGxlcnMgaW4gdGhlCi0gICAgICBoYW5kbGVyY2hhaW4gb3BlcmF0ZSxhbGwgcG9ydHMgb2YgYSBzZXJ2aWNlLCBvbiBhIHNwZWNpZmljCi0gICAgICBwb3J0IG9yIG9uIGEgbGlzdCBvZiBwcm90b2NvbC1iaW5kaW5ncy4gVGhlIGNob2ljZSBvZiBlbGVtZW50cwotICAgICAgc2VydmljZS1uYW1lLXBhdHRlcm4sIHBvcnQtbmFtZS1wYXR0ZXJuIGFuZCBwcm90b2NvbC1iaW5kaW5ncwotICAgICAgYXJlIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBoYW5kbGVycyBpbiBoYW5kbGVyLWNoYWluIGFyZQotICAgICAgZm9yIGEgc2VydmljZSwgcG9ydCBvciBwcm90b2NvbCBiaW5kaW5nLiBJZiBub25lIG9mIHRoZXNlCi0gICAgICBjaG9pY2VzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgaGFuZGxlci1jaGFpbiBlbGVtZW50IHRoZW4gdGhlCi0gICAgICBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhlIGhhbmRsZXItY2hhaW4gd2lsbCBiZSBhcHBsaWVkIG9uCi0gICAgICBldmVyeXRoaW5nLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotCi0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1uYW1lLXBhdHRlcm4iCi0JCSAgICAgIHR5cGU9ImphdmFlZTpxbmFtZS1wYXR0ZXJuIiAvPgotICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtbmFtZS1wYXR0ZXJuIgotCQkgICAgICB0eXBlPSJqYXZhZWU6cW5hbWUtcGF0dGVybiIgLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm90b2NvbC1iaW5kaW5ncyIKLQkJICAgICAgdHlwZT0iamF2YWVlOnByb3RvY29sLWJpbmRpbmdMaXN0VHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cG9ydC1jb21wb25lbnRfaGFuZGxlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImhhbmRsZXItY2hhaW5zVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgaGFuZGxlci1jaGFpbnMgZWxlbWVudCBkZWZpbmVzIHRoZSBoYW5kbGVyY2hhaW5zIGFzc29jaWF0ZWQKLSAgICAgIHdpdGggdGhpcyBzZXJ2aWNlIG9yIHNlcnZpY2UgZW5kcG9pbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jaGFpbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aGFuZGxlci1jaGFpblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvcnQtY29tcG9uZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHBvcnQtY29tcG9uZW50IGVsZW1lbnQgYXNzb2NpYXRlcyBhIFdTREwgcG9ydCB3aXRoIGEgd2ViIHNlcnZpY2UKLQlpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uLiAgSXQgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgcG9ydCBhcyBhCi0JY29tcG9uZW50LCBvcHRpb25hbCBkZXNjcmlwdGlvbiwgb3B0aW9uYWwgZGlzcGxheSBuYW1lLCBvcHRpb25hbCBpY29uaWMKLQlyZXByZXNlbnRhdGlvbnMsIFdTREwgcG9ydCBRTmFtZSwgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UsIFNlcnZpY2UKLQlJbXBsZW1lbnRhdGlvbiBCZWFuLgotCi0JVGhpcyBlbGVtZW50IGFsc28gYXNzb2NpYXRlcyBhIFdTREwgc2VydmljZSB3aXRoIGEgSkFYLVdTIFByb3ZpZGVyCi0JaW1wbGVtZW50YXRpb24uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZGlzcGxheS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotCQkgICB0eXBlPSJqYXZhZWU6aWNvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBwb3J0LWNvbXBvbmVudC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEgcG9ydCBjb21wb25lbnQncwotCSAgICAgIG5hbWUuICBUaGlzIG5hbWUgaXMgYXNzaWduZWQgYnkgdGhlIG1vZHVsZSBwcm9kdWNlciB0byBuYW1lCi0JICAgICAgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBpbiB0aGUgbW9kdWxlJ3MgZGVwbG95bWVudAotCSAgICAgIGRlc2NyaXB0b3IuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIGFtb25nIHRoZSBwb3J0IGNvbXBvbmVudAotCSAgICAgIG5hbWVzIGRlZmluZWQgaW4gdGhlIHNhbWUgbW9kdWxlLgotCi0JICAgICAgVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLQotCSAgICAgIEV4YW1wbGU6Ci0JCSAgICAgIDxwb3J0LWNvbXBvbmVudC1uYW1lPkVtcGxveWVlU2VydmljZQotCQkgICAgICA8L3BvcnQtY29tcG9uZW50LW5hbWU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1zZXJ2aWNlIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkUU5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIG5hbWUgc3BhY2UgYW5kIGxvY2FsIG5hbWUgcGFydCBvZiB0aGUgV1NETAotCSAgICBzZXJ2aWNlIFFOYW1lLiBUaGlzIGlzIHJlcXVpcmVkIHRvIGJlIHNwZWNpZmllZCBmb3IKLQkgICAgcG9ydCBjb21wb25lbnRzIHRoYXQgYXJlIEpBWC1XUyBQcm92aWRlciBpbXBsZW1lbnRhdGlvbnMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1wb3J0IgotCQkgICB0eXBlPSJqYXZhZWU6eHNkUU5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIG5hbWUgc3BhY2UgYW5kIGxvY2FsIG5hbWUgcGFydCBvZiB0aGUgV1NETAotCSAgICBwb3J0IFFOYW1lLiBUaGlzIGlzIG5vdCByZXF1aXJlZCB0byBiZSBzcGVjaWZpZWQgZm9yIHBvcnQKLQkgICAgY29tcG9uZW50cyB0aGF0IGFyZSBKQVgtV1MgUHJvdmlkZXIgaW1wbGVtZW50YXRpb25zCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLW10b20iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgU09BUCBNVE9NL1hPUCBtZWNoYW5pc20gZm9yIGFuCi0gICAgICAgICAgICBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbi4KLQotCSAgICBOb3QgdG8gYmUgc3BlY2lmaWVkIGZvciBKQVgtUlBDIHJ1bnRpbWUKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm90b2NvbC1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwcm90b2NvbC1iaW5kaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgdGhlIHByb3RvY29sIGJpbmRpbmcgdXNlZCBieSB0aGUgcG9ydC1jb21wb25lbnQuCi0JICAgIElmIHRoaXMgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSBkZWZhdWx0IGJpbmRpbmcgaXMKLSAgICAgICAgICAgIHVzZWQgKFNPQVAgMS4xIG92ZXIgSFRUUCkKLQotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGNvbnRhaW5zIHRoZQotCSAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBwb3J0IGNvbXBvbmVudCdzIFNlcnZpY2UgRW5kcG9pbnQKLQkgICAgICBJbnRlcmZhY2UuCi0KLQkgICAgICBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotCi0JICAgICAgRXhhbXBsZToKLQkJICAgICAgPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0KLQkgICAgICBUaGlzIG1heSBub3QgYmUgc3BlY2lmaWVkIGluIGNhc2UgdGhlcmUgaXMgbm8gU2VydmljZQotCSAgICAgIEVucG9pbnQgSW50ZXJmYWNlIGFzIGlzIHRoZSBjYXNlIHdpdGggZGlyZWN0bHkgdXNpbmcgYW4KLQkgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB3aXRoIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uLgotCi0JICAgICAgV2hlbiB0aGUgcG9ydCBjb21wb25lbnQgaXMgYSBQcm92aWRlciBpbXBsZW1lbnRhdGlvbgotCSAgICAgIHRoaXMgaXMgbm90IHNwZWNpZmllZC4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWltcGwtYmVhbiIKLQkJICAgdHlwZT0iamF2YWVlOnNlcnZpY2UtaW1wbC1iZWFuVHlwZSIvPgotCi0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlciIKLQkJICAgICB0eXBlPSJqYXZhZWU6cG9ydC1jb21wb25lbnRfaGFuZGxlclR5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJIFRvIGJlIHVzZWQgd2l0aCBKQVgtUlBDIGJhc2VkIHJ1bnRpbWUgb25seS4KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jaGFpbnMiCi0JCSAgICAgdHlwZT0iamF2YWVlOmhhbmRsZXItY2hhaW5zVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJIFRvIGJlIHVzZWQgd2l0aCBKQVgtV1MgYmFzZWQgcnVudGltZSBvbmx5LgotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1jb21wb25lbnRfaGFuZGxlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCURlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQotCWluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLgotCi0JVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCi0JICAgIG1vZHVsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iamF2YWVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1oZWFkZXIiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RRTmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBRTmFtZSBvZiBhIFNPQVAgaGVhZGVyIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhlCi0JICAgIGhhbmRsZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1yb2xlIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNvYXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGEgU09BUCBhY3RvciBkZWZpbml0aW9uIHRoYXQgdGhlCi0JICAgIEhhbmRsZXIgd2lsbCBwbGF5IGFzIGEgcm9sZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InByb3RvY29sLVVSSUFsaWFzVHlwZSI+Ci0gICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgIERlZmluZXMgdGhlIHR5cGUgdGhhdCBpcyB1c2VkIGZvciBzcGVjaWZ5aW5nIHRva2VucyB0aGF0Ci0JICAgc3RhcnQgd2l0aCAjIyB3aGljaCBhcmUgdXNlZCB0byBhbGlhcyBleGlzdGluZyBzdGFuZGFyZAotCSAgIHByb3RvY29sIGJpbmRpbmdzIGFuZCBzdXBwb3J0IGFsaWFzZXMgZm9yIG5ldyBzdGFuZGFyZAotCSAgIGJpbmRpbmcgVVJJcyB0aGF0IGFyZSBpbnRyb2R1Y2VkIGluIGZ1dHVyZSBzcGVjaWZpY2F0aW9ucy4KLQotCSAgIFRoZSBmb2xsb3dpbmcgdG9rZW5zIGFsaWFzIHRoZSBzdGFuZGFyZCBwcm90b2NvbCBiaW5kaW5nCi0JICAgVVJJczoKLQotCSAgICMjU09BUDExX0hUVFAgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwL2h0dHAiCi0JICAgIyNTT0FQMTFfSFRUUF9NVE9NID0KLSAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9odHRwP210b209dHJ1ZSIKLSAgICAgICAgICAgIyNTT0FQMTJfSFRUUCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8iCi0gICAgICAgICAgICMjU09BUDEyX0hUVFBfTVRPTSA9Ci0JCSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvP210b209dHJ1ZSIKLSAgICAgICAgICAgIyNYTUxfSFRUUCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaHR0cCIKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iIyMuKyIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm90b2NvbC1iaW5kaW5nTGlzdFR5cGUiPgotICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICBEZWZpbmVzIHRoZSB0eXBlIHVzZWQgZm9yIHNwZWNpZnlpbmcgYSBsaXN0IG9mCi0JICAgcHJvdG9jb2wtYmluZGluZ1R5cGUocykuIEZvciBlLmcuCi0KLQkgICAgIyNTT0FQMTFfSFRUUCAjI1NPQVAxMl9IVFRQICMjWE1MX0hUVFAKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmxpc3QgaXRlbVR5cGU9ImphdmFlZTpwcm90b2NvbC1iaW5kaW5nVHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InByb3RvY29sLWJpbmRpbmdUeXBlIj4KLSAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgRGVmaW5lcyB0aGUgdHlwZSB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoZSBVUkkgZm9yIHRoZQotCSAgIHByb3RvY29sIGJpbmRpbmcgdXNlZCBieSB0aGUgcG9ydC1jb21wb25lbnQuICBGb3IKLQkgICBwb3J0YWJpbGl0eSBvbmUgY291bGQgdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRva2VucyB0aGF0Ci0JICAgYWxpYXMgdGhlIHN0YW5kYXJkIGJpbmRpbmcgdHlwZXM6Ci0KLQkgICAgIyNTT0FQMTFfSFRUUAotCSAgICAjI1NPQVAxMV9IVFRQX01UT00KLQkgICAgIyNTT0FQMTJfSFRUUAotCSAgICAjI1NPQVAxMl9IVFRQX01UT00KLQkgICAgIyNYTUxfSFRUUAotCi0JICAgT3RoZXIgc3BlY2lmaWNhdGlvbnMgY291bGQgZGVmaW5lIHRva2VucyB0aGF0IHN0YXJ0IHdpdGggIyMKLQkgICB0byBhbGlhcyBuZXcgc3RhbmRhcmQgYmluZGluZyBVUklzIHRoYXQgYXJlIGludHJvZHVjZWQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDp1bmlvbiBtZW1iZXJUeXBlcz0ieHNkOmFueVVSSSBqYXZhZWU6cHJvdG9jb2wtVVJJQWxpYXNUeXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icW5hbWUtcGF0dGVybiI+Ci0gICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIFFOYW1lIHBhdHRlcm4gaW4gdGhlCi0JICAgICBhdHRyaWJ1dGUgc2VydmljZS1uYW1lLXBhdHRlcm4gYW5kIHBvcnQtbmFtZS1wYXR0ZXJuIGluCi0JICAgICB0aGUgaGFuZGxlci1jaGFpbiBlbGVtZW50Ci0KLQkgICAgIEZvciBleGFtcGxlLCB0aGUgdmFyaW91cyBmb3JtcyBhY2NlcHRhYmxlIGhlcmUgZm9yCi0JICAgICBzZXJ2aWNlLW5hbWUtcGF0dGVybiBhdHRyaWJ1dGUgaW4gaGFuZGxlci1jaGFpbiBlbGVtZW50Ci0JICAgICBhcmUgOgotCi0JICAgICBFeGFjdCBOYW1lOiBzZXJ2aWNlLW5hbWUtcGF0dGVybj0ibnMxOkVjaG9TZXJ2aWNlIgotCi0JCSBJbiB0aGlzIGNhc2UsIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGlzCi0JCSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgd2lsbCBhcHBseSB0byBhbGwgcG9ydHMgd2l0aAotCQkgdGhpcyBleGFjdCBzZXJ2aWNlIG5hbWUuIFRoZSBuYW1lc3BhY2UgcHJlZml4IG11c3QKLQkJIGhhdmUgYmVlbiBkZWNsYXJlZCBpbiBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbgotCQkgYXR0cmlidXRlIGluIGVpdGhlciB0aGUgc3RhcnQtdGFnIG9mIHRoZSBlbGVtZW50Ci0JCSB3aGVyZSB0aGUgcHJlZml4IGlzIHVzZWQgb3IgaW4gYW4gYW4gYW5jZXN0b3IKLQkJIGVsZW1lbnQgKGkuZS4gYW4gZWxlbWVudCBpbiB3aG9zZSBjb250ZW50IHRoZQotCQkgcHJlZml4ZWQgbWFya3VwIG9jY3VycykKLQotCSAgICAgUGF0dGVybiA6IHNlcnZpY2UtbmFtZS1wYXR0ZXJuPSJuczE6RWNob1NlcnZpY2UqIgotCi0JCSBJbiB0aGlzIGNhc2UsIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGlzCi0JCSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgd2lsbCBhcHBseSB0byBhbGwgcG9ydHMgd2hvc2UKLQkJIFNlcnZpY2UgbmFtZXMgYXJlIGxpa2UgRWNob1NlcnZpY2UxLCBFY2hvU2VydmljZUZvbwotCQkgZXRjLiBUaGUgbmFtZXNwYWNlIHByZWZpeCBtdXN0IGhhdmUgYmVlbiBkZWNsYXJlZCBpbgotCQkgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXR0cmlidXRlIGluIGVpdGhlciB0aGUKLQkJIHN0YXJ0LXRhZyBvZiB0aGUgZWxlbWVudCB3aGVyZSB0aGUgcHJlZml4IGlzIHVzZWQgb3IKLQkJIGluIGFuIGFuIGFuY2VzdG9yIGVsZW1lbnQgKGkuZS4gYW4gZWxlbWVudCBpbiB3aG9zZQotCQkgY29udGVudCB0aGUgcHJlZml4ZWQgbWFya3VwIG9jY3VycykKLQotCSAgICAgV2lsZCBDYXJkIDogc2VydmljZS1uYW1lLXBhdHRlcm49IioiCi0KLQkJSW4gdGhpcyBjYXNlLCBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhpcyBoYW5kbGVyLWNoYWluCi0JCWVsZW1lbnQgd2lsbCBhcHBseSB0byBwb3J0cyBvZiBhbGwgc2VydmljZSBuYW1lcy4KLQotCSAgICBUaGUgc2FtZSBjYW4gYmUgYXBwbGllZCB0byBwb3J0LW5hbWUgYXR0cmlidXRlIGluCi0JICAgIGhhbmRsZXItY2hhaW4gZWxlbWVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJcKnwoW1xpLVs6XV1bXGMtWzpdXSo6KT9bXGktWzpdXVtcYy1bOl1dKlwqPyIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLWltcGwtYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IGRlZmluZXMgdGhlIHdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotCUEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgYW4gRUpCIGJlYW4gY2xhc3Mgb3IgSkFYLVJQQyB3ZWIKLQljb21wb25lbnQuICBFeGlzdGluZyBFSkIgaW1wbGVtZW50YXRpb25zIGFyZSBleHBvc2VkIGFzIGEgd2ViIHNlcnZpY2UKLQl1c2luZyBhbiBlamItbGluay4KLQotCVVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1saW5rVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbGluayIKLQkJICAgdHlwZT0iamF2YWVlOnNlcnZsZXQtbGlua1R5cGUiLz4KLSAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldC1saW5rVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgc2VydmxldC1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudAotCSAgdG8gc3BlY2lmeSB0aGF0IGEgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBCZWFuIGlzIGRlZmluZWQgYXMgYQotCSAgSkFYLVJQQyBTZXJ2aWNlIEVuZHBvaW50LgotCi0JICBUaGUgdmFsdWUgb2YgdGhlIHNlcnZsZXQtbGluayBlbGVtZW50IG11c3QgYmUgdGhlIHNlcnZsZXQtbmFtZSBvZgotCSAgYSBKQVgtUlBDIFNlcnZpY2UgRW5kcG9pbnQgaW4gdGhlIHNhbWUgV0FSIGZpbGUuCi0KLQkgIFVzZWQgaW46IHNlcnZpY2UtaW1wbC1iZWFuCi0KLQkgIEV4YW1wbGU6Ci0JCSAgPHNlcnZsZXQtbGluaz5TdG9ja1F1b3RlU2VydmljZTwvc2VydmxldC1saW5rPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic2VydmljZS1kZXNjcmlwdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIGVsZW1lbnQgZGVmaW5lcyBhIFdTREwgZG9jdW1lbnQgZmlsZQotCWFuZCB0aGUgc2V0IG9mIFBvcnQgY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgcG9ydHMKLQlkZWZpbmVkIGluIHRoZSBXU0RMIGRvY3VtZW50LiAgVGhlcmUgbWF5IGJlIG11bHRpcGxlCi0Jd2Vic2VydmljZS1kZXNjcmlwdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBtb2R1bGUuCi0KLQlBbGwgV1NETCBmaWxlIHBvcnRzIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcG9ydC1jb21wb25lbnQgZWxlbWVudAotCWRlZmluZWQuCi0KLQlVc2VkIGluOiB3ZWJzZXJ2aWNlcwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmRpc3BsYXktbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLQkJICAgdHlwZT0iamF2YWVlOmljb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUgaWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbiBvZgotCSAgICBwb3J0LWNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgV1NETCBmaWxlIGFuZCBKQVgtUlBDCi0JICAgIG1hcHBpbmcuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtZmlsZSIKLQkJICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIFdTREwgZmlsZSBpbiB0aGUKLQkgICAgbW9kdWxlLiAgVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF4cnBjLW1hcHBpbmctZmlsZSIKLQkJICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQKLQkgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieQotCSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKLQkgICAgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZS4KLQotCSAgICBUaGlzIGlzIG5vdCByZXF1aXJlZCB3aGVuIEpBWC1XUyBiYXNlZCBydW50aW1lIGlzIHVzZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQiCi0JCSAgIHR5cGU9ImphdmFlZTpwb3J0LWNvbXBvbmVudFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6a2V5IG5hbWU9InBvcnQtY29tcG9uZW50X2hhbmRsZXItbmFtZS1rZXkiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICAgIHdpdGhpbiB0aGUgbW9kdWxlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmhhbmRsZXIiLz4KLQkgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpoYW5kbGVyLW5hbWUiLz4KLQk8L3hzZDprZXk+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNlcnZpY2VzVHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTp3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDprZXkgbmFtZT0icG9ydC1jb21wb25lbnQtbmFtZS1rZXkiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgICAgPCFbQ0RBVEFbCi0KLQkJVGhlIHBvcnQtY29tcG9uZW50LW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYSBwb3J0Ci0JCWNvbXBvbmVudCdzIG5hbWUuICBUaGlzIG5hbWUgaXMgYXNzaWduZWQgYnkgdGhlIG1vZHVsZQotCQlwcm9kdWNlciB0byBuYW1lIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGJlYW4gaW4gdGhlCi0JCW1vZHVsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkJYW1vbmcgdGhlIHBvcnQgY29tcG9uZW50IG5hbWVzIGRlZmluZWQgaW4gdGhlIHNhbWUgbW9kdWxlLgotCi0JCVVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0KLQkJRXhhbXBsZToKLQkJCTxwb3J0LWNvbXBvbmVudC1uYW1lPkVtcGxveWVlU2VydmljZQotCQkJPC9wb3J0LWNvbXBvbmVudC1uYW1lPgotCi0JCV1dPgotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpwb3J0LWNvbXBvbmVudCIvPgotCSAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnBvcnQtY29tcG9uZW50LW5hbWUiLz4KLQk8L3hzZDprZXk+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRld2V5LXZlcnNpb25UeXBlIgotCQkgICBmaXhlZD0iMS4yIgotCQkgICB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS4yLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfMV8zLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGFmMjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNTcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICAgdmVyc2lvbj0iMS4zIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLSAgICAgIAotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgICAKLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbgotICAgICAgRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlCi0gICAgICAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgICB0aGUgTGljZW5zZS4gWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwgb3IKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLSAgICAgIExpY2Vuc2UuCi0gICAgICAKLSAgICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyCi0gICAgICBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gICAgICBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzCi0gICAgICBwcm92aWRlZCBieSBTdW4gaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZSBmaWxlCi0gICAgICB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4gIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nCi0gICAgICBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBbXQotICAgICAgcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgICAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0gICAgICAKLSAgICAgIENvbnRyaWJ1dG9yKHMpOgotICAgICAgCi0gICAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlCi0gICAgICBDRERMIG9yIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nCi0gICAgICAiW0NvbnRyaWJ1dG9yXSBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UKLSAgICAgIGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhIHJlY2lwaWVudCBoYXMgdGhlCi0gICAgICBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUKLSAgICAgIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8gaXRzCi0gICAgICBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIKLSAgICAgIGNvZGUgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZQotICAgICAgb3B0aW9uIGFwcGxpZXMgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2gKLSAgICAgIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0IGhvbGRlci4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBW1sKLSAgICAgIFRoZSB3ZWJzZXJ2aWNlcyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoZSB3ZWIgc2VydmljZXMKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEl0IHNwZWNpZmllcyB0aGUgc2V0IG9mIHdlYiBzZXJ2aWNlCi0gICAgICBkZXNjcmlwdGlvbnMgdGhhdCBhcmUgdG8gYmUgZGVwbG95ZWQgaW50byB0aGUgSmF2YSBFRSBBcHBsaWNhdGlvbgotICAgICAgU2VydmVyIGFuZCB0aGUgZGVwZW5kZW5jaWVzIHRoZXkgaGF2ZSBvbiBjb250YWluZXIgcmVzb3VyY2VzIGFuZAotICAgICAgc2VydmljZXMuICBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQKLSAgICAgICJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiIGluIHRoZSB3ZWIgc2VydmljZXMnIGphciBmaWxlLgotICAgICAgCi0gICAgICBVc2VkIGluOiB3ZWJzZXJ2aWNlcy54bWwKLSAgICAgIAotICAgICAgQWxsIHdlYnNlcnZpY2VzIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZSB0aGUKLSAgICAgIHdlYnNlcnZpY2VzIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0gICAgICAKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotICAgICAgCi0gICAgICBhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSB2ZXJzaW9uCi0gICAgICBlbGVtZW50IGFzIHNob3duIGJlbG93OgotICAgICAgCi0gICAgICA8d2Vic2VydmljZXMgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotICAgICAgCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMy54c2QiCi0gICAgICB2ZXJzaW9uPSIxLjMiPgotICAgICAgLi4uCi0gICAgICA8L3dlYnNlcnZpY2VzPgotICAgICAgCi0gICAgICBUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YgdGhlCi0gICAgICBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIHRoZSBKYXZhIEVFCi0gICAgICBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotICAgICAgCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzMueHNkCi0gICAgICAKLSAgICAgIF1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotICAgICAgCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gICAgICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gICAgICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gICAgICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICAgICAgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLSAgICAgIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICAgICAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzYueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlcyIKLSAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp3ZWJzZXJ2aWNlc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgd2Vic2VydmljZXMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGUgd2ViIHNlcnZpY2VzCi0gICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEl0IHNwZWNpZmllcyB0aGUgc2V0IG9mIHdlYiBzZXJ2aWNlCi0gICAgICAgIGRlc2NyaXB0aW9ucyB0aGF0IGFyZSB0byBiZSBkZXBsb3llZCBpbnRvIHRoZSBKYXZhIEVFIEFwcGxpY2F0aW9uIFNlcnZlcgotICAgICAgICBhbmQgdGhlIGRlcGVuZGVuY2llcyB0aGV5IGhhdmUgb24gY29udGFpbmVyIHJlc291cmNlcyBhbmQgc2VydmljZXMuCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiB3ZWJzZXJ2aWNlcy54bWwKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDprZXkgbmFtZT0id2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUgaWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbiBvZgotICAgICAgICAgIHBvcnQtY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggYSBXU0RMIGZpbGUgYW5kIEpBWC1SUEMgbWFwcGluZy4gVGhlCi0gICAgICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6d2Vic2VydmljZS1kZXNjcmlwdGlvbiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSIvPgotICAgIDwveHNkOmtleT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3J0LWNvbXBvbmVudFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcG9ydC1jb21wb25lbnQgZWxlbWVudCBhc3NvY2lhdGVzIGEgV1NETCBwb3J0IHdpdGggYSB3ZWIgc2VydmljZQotICAgICAgICBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uLiAgSXQgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgcG9ydCBhcyBhCi0gICAgICAgIGNvbXBvbmVudCwgb3B0aW9uYWwgZGVzY3JpcHRpb24sIG9wdGlvbmFsIGRpc3BsYXkgbmFtZSwgb3B0aW9uYWwgaWNvbmljCi0gICAgICAgIHJlcHJlc2VudGF0aW9ucywgV1NETCBwb3J0IFFOYW1lLCBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSwgU2VydmljZQotICAgICAgICBJbXBsZW1lbnRhdGlvbiBCZWFuLgotICAgICAgICAKLSAgICAgICAgVGhpcyBlbGVtZW50IGFsc28gYXNzb2NpYXRlcyBhIFdTREwgc2VydmljZSB3aXRoIGEgSkFYLVdTIFByb3ZpZGVyCi0gICAgICAgIGltcGxlbWVudGF0aW9uLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICBUaGUgcG9ydC1jb21wb25lbnQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhIHBvcnQgY29tcG9uZW50J3MKLSAgICAgICAgICAgIG5hbWUuICBUaGlzIG5hbWUgaXMgYXNzaWduZWQgYnkgdGhlIG1vZHVsZSBwcm9kdWNlciB0byBuYW1lCi0gICAgICAgICAgICB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGluIHRoZSBtb2R1bGUncyBkZXBsb3ltZW50Ci0gICAgICAgICAgICBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSBhbW9uZyB0aGUgcG9ydCBjb21wb25lbnQKLSAgICAgICAgICAgIG5hbWVzIGRlZmluZWQgaW4gdGhlIHNhbWUgbW9kdWxlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGFtcGxlOgotICAgICAgICAgICAgCSAgICAgIDxwb3J0LWNvbXBvbmVudC1uYW1lPkVtcGxveWVlU2VydmljZQotICAgICAgICAgICAgCSAgICAgIDwvcG9ydC1jb21wb25lbnQtbmFtZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1zZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RRTmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIERlZmluZXMgdGhlIG5hbWUgc3BhY2UgYW5kIGxvY2FsIG5hbWUgcGFydCBvZiB0aGUgV1NETAotICAgICAgICAgICAgc2VydmljZSBRTmFtZS4gVGhpcyBpcyByZXF1aXJlZCB0byBiZSBzcGVjaWZpZWQgZm9yCi0gICAgICAgICAgICBwb3J0IGNvbXBvbmVudHMgdGhhdCBhcmUgSkFYLVdTIFByb3ZpZGVyIGltcGxlbWVudGF0aW9ucy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtcG9ydCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkUU5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBuYW1lIHNwYWNlIGFuZCBsb2NhbCBuYW1lIHBhcnQgb2YgdGhlIFdTREwKLSAgICAgICAgICAgIHBvcnQgUU5hbWUuIFRoaXMgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHNwZWNpZmllZCBmb3IgcG9ydAotICAgICAgICAgICAgY29tcG9uZW50cyB0aGF0IGFyZSBKQVgtV1MgUHJvdmlkZXIgaW1wbGVtZW50YXRpb25zCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtbXRvbSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgU09BUCBNVE9NL1hPUCBtZWNoYW5pc20gZm9yIGFuCi0gICAgICAgICAgICBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgTm90IHRvIGJlIHNwZWNpZmllZCBmb3IgSkFYLVJQQyBydW50aW1lCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtdG9tLXRocmVzaG9sZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgV2hlbiBNVE9NIGlzIGVuYWJsZWQsIGJpbmFyeSBkYXRhIGFib3ZlIHRoaXMgc2l6ZSBpbiBieXRlcwotICAgICAgICAgICAgd2lsbCBiZSBYT1AgZW5jb2RlZCBvciBzZW50IGFzIGF0dGFjaG1lbnQuIERlZmF1bHQgdmFsdWUgaXMgMC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgTm90IHRvIGJlIHNwZWNpZmllZCBmb3IgSkFYLVJQQyBydW50aW1lCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZGRyZXNzaW5nIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphZGRyZXNzaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhpcyBzcGVjaWZpZXMgdGhlIFdTLUFkZHJlc3NpbmcgcmVxdWlyZW1lbnRzIGZvciBhIEpBWC1XUwotICAgICAgICAgICAgd2ViIHNlcnZpY2UuIEl0IGNvcnJlc3BvbmRzIHRvIGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmcKLSAgICAgICAgICAgIGFubm90YXRpb24gb3IgaXRzIGZlYXR1cmUgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZ0ZlYXR1cmUuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNlZSB0aGUgYWRkcmVzc2luZ1R5cGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1SUEMgcnVudGltZQotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzcGVjdC1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZXNwZWN0LWJpbmRpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgueG1sLndzLlJlc3BlY3RCaW5kaW5nIGFubm90YXRpb24KLSAgICAgICAgICAgIG9yIGl0cyBjb3JyZXNwb25kaW5nIGphdmF4LnhtbC53cy5SZXNwZWN0QmluZGluZ0ZlYXR1cmUgd2ViCi0gICAgICAgICAgICBzZXJ2aWNlIGZlYXR1cmUuIFRoaXMgaXMgdXNlZCB0byBjb250cm9sIHdoZXRoZXIgYSBKQVgtV1MKLSAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG11c3QgcmVzcGVjdC9ob25vciB0aGUgY29udGVudHMgb2YgdGhlCi0gICAgICAgICAgICB3c2RsOmJpbmRpbmcgaW4gdGhlIFdTREwgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZpY2UuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1SUEMgcnVudGltZQotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvdG9jb2wtYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cHJvdG9jb2wtYmluZGluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSB0aGUgcHJvdG9jb2wgYmluZGluZyB1c2VkIGJ5IHRoZSBwb3J0LWNvbXBvbmVudC4KLSAgICAgICAgICAgIElmIHRoaXMgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSBkZWZhdWx0IGJpbmRpbmcgaXMKLSAgICAgICAgICAgIHVzZWQgKFNPQVAgMS4xIG92ZXIgSFRUUCkKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICAgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgY29udGFpbnMgdGhlCi0gICAgICAgICAgICBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgcG9ydCBjb21wb25lbnQncyBTZXJ2aWNlIEVuZHBvaW50Ci0gICAgICAgICAgICBJbnRlcmZhY2UuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICAJICAgICAgPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRoaXMgbWF5IG5vdCBiZSBzcGVjaWZpZWQgaW4gY2FzZSB0aGVyZSBpcyBubyBTZXJ2aWNlCi0gICAgICAgICAgICBFbnBvaW50IEludGVyZmFjZSBhcyBpcyB0aGUgY2FzZSB3aXRoIGRpcmVjdGx5IHVzaW5nIGFuCi0gICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB3aXRoIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBXaGVuIHRoZSBwb3J0IGNvbXBvbmVudCBpcyBhIFByb3ZpZGVyIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICB0aGlzIGlzIG5vdCBzcGVjaWZpZWQuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtaW1wbC1iZWFuIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZXJ2aWNlLWltcGwtYmVhblR5cGUiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlciIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpoYW5kbGVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgCSBUbyBiZSB1c2VkIHdpdGggSkFYLVJQQyBiYXNlZCBydW50aW1lIG9ubHkuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jaGFpbnMiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aGFuZGxlci1jaGFpbnNUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgCSBUbyBiZSB1c2VkIHdpdGggSkFYLVdTIGJhc2VkIHJ1bnRpbWUgb25seS4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtaW1wbC1iZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IGRlZmluZXMgdGhlIHdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotICAgICAgICBBIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2FuIGJlIGFuIEVKQiBiZWFuIGNsYXNzIG9yIEpBWC1SUEMgd2ViCi0gICAgICAgIGNvbXBvbmVudC4gIEV4aXN0aW5nIEVKQiBpbXBsZW1lbnRhdGlvbnMgYXJlIGV4cG9zZWQgYXMgYSB3ZWIgc2VydmljZQotICAgICAgICB1c2luZyBhbiBlamItbGluay4KLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItbGlua1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LWxpbmsiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlcnZsZXQtbGlua1R5cGUiLz4KLSAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXQtbGlua1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgc2VydmxldC1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudAotICAgICAgICB0byBzcGVjaWZ5IHRoYXQgYSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gaXMgZGVmaW5lZCBhcyBhCi0gICAgICAgIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludC4KLSAgICAgICAgCi0gICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgc2VydmxldC1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgc2VydmxldC1uYW1lIG9mCi0gICAgICAgIGEgSkFYLVJQQyBTZXJ2aWNlIEVuZHBvaW50IGluIHRoZSBzYW1lIFdBUiBmaWxlLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogc2VydmljZS1pbXBsLWJlYW4KLSAgICAgICAgCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgIAkgIDxzZXJ2bGV0LWxpbms+U3RvY2tRdW90ZVNlcnZpY2U8L3NlcnZsZXQtbGluaz4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24gZWxlbWVudCBkZWZpbmVzIGEgV1NETCBkb2N1bWVudCBmaWxlCi0gICAgICAgIGFuZCB0aGUgc2V0IG9mIFBvcnQgY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgcG9ydHMKLSAgICAgICAgZGVmaW5lZCBpbiB0aGUgV1NETCBkb2N1bWVudC4gIFRoZXJlIG1heSBiZSBtdWx0aXBsZQotICAgICAgICB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9ucyBkZWZpbmVkIHdpdGhpbiBhIG1vZHVsZS4KLSAgICAgICAgCi0gICAgICAgIEFsbCBXU0RMIGZpbGUgcG9ydHMgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBwb3J0LWNvbXBvbmVudCBlbGVtZW50Ci0gICAgICAgIGRlZmluZWQuCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiB3ZWJzZXJ2aWNlcwotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aWNvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSBpZGVudGlmaWVzIHRoZSBjb2xsZWN0aW9uIG9mCi0gICAgICAgICAgICBwb3J0LWNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgV1NETCBmaWxlIGFuZCBKQVgtUlBDCi0gICAgICAgICAgICBtYXBwaW5nLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtZmlsZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIFdTREwgZmlsZSBpbiB0aGUKLSAgICAgICAgICAgIG1vZHVsZS4gIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF4cnBjLW1hcHBpbmctZmlsZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQKLSAgICAgICAgICAgIGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkKLSAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIFdTREwgZGVzY3JpcHRpb24gaW4gdGhlIHdzZGwtZmlsZS4gIFRoZQotICAgICAgICAgICAgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgVGhpcyBpcyBub3QgcmVxdWlyZWQgd2hlbiBKQVgtV1MgYmFzZWQgcnVudGltZSBpcyB1c2VkLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBvcnQtY29tcG9uZW50VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmtleSBuYW1lPSJwb3J0LWNvbXBvbmVudF9oYW5kbGVyLW5hbWUta2V5Ij4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgICAgICAgd2l0aGluIHRoZSBtb2R1bGUuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpoYW5kbGVyIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmhhbmRsZXItbmFtZSIvPgotICAgICAgICA8L3hzZDprZXk+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzZXJ2aWNlc1R5cGUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmtleSBuYW1lPSJwb3J0LWNvbXBvbmVudC1uYW1lLWtleSI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICAgIAlUaGUgcG9ydC1jb21wb25lbnQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhIHBvcnQKLSAgICAgICAgICAgICAgCWNvbXBvbmVudCdzIG5hbWUuICBUaGlzIG5hbWUgaXMgYXNzaWduZWQgYnkgdGhlIG1vZHVsZQotICAgICAgICAgICAgICAJcHJvZHVjZXIgdG8gbmFtZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGluIHRoZQotICAgICAgICAgICAgICAJbW9kdWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotICAgICAgICAgICAgICAJYW1vbmcgdGhlIHBvcnQgY29tcG9uZW50IG5hbWVzIGRlZmluZWQgaW4gdGhlIHNhbWUgbW9kdWxlLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgCVVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAJRXhhbXBsZToKLSAgICAgICAgICAgICAgCQk8cG9ydC1jb21wb25lbnQtbmFtZT5FbXBsb3llZVNlcnZpY2UKLSAgICAgICAgICAgICAgCQk8L3BvcnQtY29tcG9uZW50LW5hbWU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAJCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBdXT4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cG9ydC1jb21wb25lbnQiLz4KLSAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6cG9ydC1jb21wb25lbnQtbmFtZSIvPgotICAgICAgICA8L3hzZDprZXk+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRld2V5LXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjMiCi0gICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS4zLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMi54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjBkZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNTc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMS4yIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylqYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkcwkxLjE5IDAyLzEzLzA2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1jb21wb25lbnQtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLQlvbiB0aGUgY29udGFpbmVyIGZvciByZXNvbHZpbmcgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotCXRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLQlJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi0JYnkgdGhlIGNvbnRhaW5lciBmb3IgYSBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpIG1ldGhvZCBjYWxsLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQKLQkgICAgSmF2YSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIG9mIGEKLQkgICAgV1NETCBwb3J0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLW10b20iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgU09BUCBNVE9NL1hPUCBtZWNoYW5pc20gb24gdGhlIGNsaWVudAotCSAgICBzaWRlIGZvciBhIHBvcnQtY29tcG9uZW50LgotCi0JICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1SUEMgcnVudGltZQotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtbGluayIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcG9ydC1jb21wb25lbnQtbGluayBlbGVtZW50IGxpbmtzIGEgcG9ydC1jb21wb25lbnQtcmVmCi0JICAgIHRvIGEgc3BlY2lmaWMgcG9ydC1jb21wb25lbnQgcmVxdWlyZWQgdG8gYmUgbWFkZSBhdmFpbGFibGUKLQkgICAgYnkgYSBzZXJ2aWNlIHJlZmVyZW5jZS4KLQotCSAgICBUaGUgdmFsdWUgb2YgYSBwb3J0LWNvbXBvbmVudC1saW5rIG11c3QgYmUgdGhlCi0JICAgIHBvcnQtY29tcG9uZW50LW5hbWUgb2YgYSBwb3J0LWNvbXBvbmVudCBpbiB0aGUgc2FtZSBtb2R1bGUKLQkgICAgb3IgYW5vdGhlciBtb2R1bGUgaW4gdGhlIHNhbWUgYXBwbGljYXRpb24gdW5pdC4gVGhlIHN5bnRheAotCSAgICBmb3Igc3BlY2lmaWNhdGlvbiBmb2xsb3dzIHRoZSBzeW50YXggZGVmaW5lZCBmb3IgZWpiLWxpbmsKLQkgICAgaW4gdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJzZXJ2aWNlLXJlZkdyb3VwIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6c2VydmljZS1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmtleSBuYW1lPSJzZXJ2aWNlLXJlZl9oYW5kbGVyLW5hbWUta2V5Ij4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgICAgICB3aXRoaW4gdGhlIG1vZHVsZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpoYW5kbGVyIi8+Ci0JICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6aGFuZGxlci1uYW1lIi8+Ci0JPC94c2Q6a2V5PgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZpY2UtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSByZWZlcmVuY2UgdG8gYSBXZWIKLQlzZXJ2aWNlLiBJdCBjb250YWlucyBvcHRpb25hbCBkZXNjcmlwdGlvbiwgZGlzcGxheSBuYW1lIGFuZAotCWljb25zLCBhIGRlY2xhcmF0aW9uIG9mIHRoZSByZXF1aXJlZCBTZXJ2aWNlIGludGVyZmFjZSwKLQlhbiBvcHRpb25hbCBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLCBhbiBvcHRpb25hbCBzZXQKLQlvZiBKQVgtUlBDIG1hcHBpbmdzLCBhbiBvcHRpb25hbCBRTmFtZSBmb3IgdGhlIHNlcnZpY2UgZWxlbWVudCwKLQlhbiBvcHRpb25hbCBzZXQgb2YgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIGJlIHJlc29sdmVkCi0JYnkgdGhlIGNvbnRhaW5lciB0byBhIFdTREwgcG9ydCwgYW5kIGFuIG9wdGlvbmFsIHNldCBvZiBoYW5kbGVycy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpqbmRpLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtcmVmLW5hbWUgZWxlbWVudCBkZWNsYXJlcyBsb2dpY2FsIG5hbWUgdGhhdCB0aGUKLQkgICAgY29tcG9uZW50cyBpbiB0aGUgbW9kdWxlIHVzZSB0byBsb29rIHVwIHRoZSBXZWIgc2VydmljZS4gSXQKLQkgICAgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgc2VydmljZSByZWZlcmVuY2UgbmFtZXMgc3RhcnQgd2l0aAotCSAgICAic2VydmljZS8iLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtaW50ZXJmYWNlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotCSAgICBuYW1lIG9mIHRoZSBKQVgtUlBDIFNlcnZpY2UgaW50ZXJmYWNlIHRoZSBjbGllbnQgZGVwZW5kcyBvbi4KLQkgICAgSW4gbW9zdCBjYXNlcyB0aGUgdmFsdWUgd2lsbCBiZSBqYXZheC54bWwucnBjLlNlcnZpY2UuICBBIEpBWC1SUEMKLQkgICAgZ2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIGNsYXNzIG1heSBhbHNvIGJlIHNwZWNpZmllZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLXJlZi10eXBlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIHR5cGUgb2YgdGhlIHNlcnZpY2UtcmVmCi0JICAgIGVsZW1lbnQgdGhhdCBpcyBpbmplY3RlZCBvciByZXR1cm5lZCB3aGVuIGEgSk5ESSBsb29rdXAgaXMgZG9uZS4KLQkgICAgVGhpcyBtdXN0IGJlIGVpdGhlciBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIFNlcnZpY2UgY2xhc3Mgb3IKLQkgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIGNsYXNzLgotCSAgICBUaGlzIGlzIG9ubHkgdXNlZCB3aXRoIEpBWC1XUyBydW50aW1lIHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nCi0JICAgIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24gY2FuIGJlIHVzZWQgdG8gZGVub3RlIGJvdGggYSBTZXJ2aWNlCi0JICAgIG9yIGEgUG9ydC4KLQotCSAgICBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIHR5cGUgb2Ygc2VydmljZS1yZWYgZWxlbWVudAotCSAgICB0aGF0IGlzIGluamVjdGVkIG9yIHJldHVybmVkIHdoZW4gYSBKTkRJIGxvb2t1cCBpcyBkb25lIGlzCi0JICAgIGFsd2F5cyBhIFNlcnZpY2UgaW50ZXJmYWNlL2NsYXNzLgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtZmlsZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZEFueVVSSVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdzZGwtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBVUkkgbG9jYXRpb24gb2YgYSBXU0RMCi0JICAgIGZpbGUuIFRoZSBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgbW9kdWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF4cnBjLW1hcHBpbmctZmlsZSIKLQkJICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQKLQkgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieQotCSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKLQkgICAgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZSBmaWxlLgotCi0JICAgIFRoaXMgaXMgbm90IHJlcXVpcmVkIHdoZW4gSkFYLVdTIGJhc2VkIHJ1bnRpbWUgaXMgdXNlZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RRTmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtcW5hbWUgZWxlbWVudCBkZWNsYXJlcyB0aGUgc3BlY2lmaWMgV1NETCBzZXJ2aWNlCi0JICAgIGVsZW1lbnQgdGhhdCBpcyBiZWluZyByZWZlcmVkIHRvLiAgSXQgaXMgbm90IHNwZWNpZmllZCBpZiBubwotCSAgICB3c2RsLWZpbGUgaXMgZGVjbGFyZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LWNvbXBvbmVudC1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpwb3J0LWNvbXBvbmVudC1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLQkgICAgb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLQkgICAgdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludAotCSAgICBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi0JICAgIGJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDpjaG9pY2U+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlciIKLQkJICAgICAgIHR5cGU9ImphdmFlZTpzZXJ2aWNlLXJlZl9oYW5kbGVyVHlwZSIKLQkJICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCSAgICA8eHNkOmFubm90YXRpb24+Ci0JICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCURlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4KLQkJYWNjZXNzIHRoZSBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlCi0JCUhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZQotCQloYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGFsbCBwb3J0cyBvZiB0aGUKLQkJc2VydmljZS4KLQotCQlUbyBiZSB1c2VkIHdpdGggSkFYLVJQQyBiYXNlZCBydW50aW1lIG9ubHkuCi0KLQkgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPC94c2Q6ZWxlbWVudD4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWNoYWlucyIKLQkJICAgICAgIHR5cGU9ImphdmFlZTpzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluc1R5cGUiCi0JCSAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCSBUbyBiZSB1c2VkIHdpdGggSkFYLVdTIGJhc2VkIHJ1bnRpbWUgb25seS4KLQkgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLQotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgaGFuZGxlci1jaGFpbiBlbGVtZW50IGRlZmluZXMgdGhlIGhhbmRsZXJjaGFpbi4KLSAgICAgIEhhbmRsZXJjaGFpbiBjYW4gYmUgZGVmaW5lZCBzdWNoIHRoYXQgdGhlIGhhbmRsZXJzIGluIHRoZQotICAgICAgaGFuZGxlcmNoYWluIG9wZXJhdGUsYWxsIHBvcnRzIG9mIGEgc2VydmljZSwgb24gYSBzcGVjaWZpYwotICAgICAgcG9ydCBvciBvbiBhIGxpc3Qgb2YgcHJvdG9jb2wtYmluZGluZ3MuIFRoZSBjaG9pY2Ugb2YgZWxlbWVudHMKLSAgICAgIHNlcnZpY2UtbmFtZS1wYXR0ZXJuLCBwb3J0LW5hbWUtcGF0dGVybiBhbmQgcHJvdG9jb2wtYmluZGluZ3MKLSAgICAgIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgaGFuZGxlcnMgaW4gaGFuZGxlci1jaGFpbiBhcmUKLSAgICAgIGZvciBhIHNlcnZpY2UsIHBvcnQgb3IgcHJvdG9jb2wgYmluZGluZy4gSWYgbm9uZSBvZiB0aGVzZQotICAgICAgY2hvaWNlcyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudCB0aGVuIHRoZQotICAgICAgaGFuZGxlcnMgc3BlY2lmaWVkIGluIHRoZSBoYW5kbGVyLWNoYWluIHdpbGwgYmUgYXBwbGllZCBvbgotICAgICAgZXZlcnl0aGluZy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLQotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtbmFtZS1wYXR0ZXJuIgotCQkgICAgICB0eXBlPSJqYXZhZWU6c2VydmljZS1yZWZfcW5hbWUtcGF0dGVybiIgLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LW5hbWUtcGF0dGVybiIKLQkgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZXJ2aWNlLXJlZl9xbmFtZS1wYXR0ZXJuIiAvPgotICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3RvY29sLWJpbmRpbmdzIgotCSAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlcnZpY2UtcmVmX3Byb3RvY29sLWJpbmRpbmdMaXN0VHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VydmljZS1yZWZfaGFuZGxlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmX2hhbmRsZXItY2hhaW5zVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgaGFuZGxlci1jaGFpbnMgZWxlbWVudCBkZWZpbmVzIHRoZSBoYW5kbGVyY2hhaW5zIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gICAgICBzZXJ2aWNlIG9yIHNlcnZpY2UgZW5kcG9pbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jaGFpbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VydmljZS1yZWZfaGFuZGxlci1jaGFpblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmX2hhbmRsZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUKLQlpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYKLQlwb3J0LW5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkCi0Jd2l0aCBhbGwgcG9ydHMgb2YgdGhlIHNlcnZpY2UuCi0KLQlVc2VkIGluOiBzZXJ2aWNlLXJlZgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgIHdpdGhpbiB0aGUgbW9kdWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgaGFuZGxlcgotCSAgICBpbXBsZW1lbnRhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotCQkgICB0eXBlPSJqYXZhZWU6cGFyYW0tdmFsdWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb2FwLWhlYWRlciIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFFOYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIFFOYW1lIG9mIGEgU09BUCBoZWFkZXIgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZAotCSAgICBieSB0aGUgaGFuZGxlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtcm9sZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0Ci0JICAgIHRoZSBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcG9ydC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgV1NETCBwb3J0LW5hbWUgdGhhdCBhCi0JICAgIGhhbmRsZXIgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InNlcnZpY2UtcmVmX3Byb3RvY29sLVVSSUFsaWFzVHlwZSI+Ci0gICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgIERlZmluZXMgdGhlIHR5cGUgdGhhdCBpcyB1c2VkIGZvciBzcGVjaWZ5aW5nIHRva2VucyB0aGF0Ci0JICAgc3RhcnQgd2l0aCAjIyB3aGljaCBhcmUgdXNlZCB0byBhbGlhcyBleGlzdGluZyBzdGFuZGFyZAotCSAgIHByb3RvY29sIGJpbmRpbmdzIGFuZCBzdXBwb3J0IGFsaWFzZXMgZm9yIG5ldyBzdGFuZGFyZAotCSAgIGJpbmRpbmcgVVJJcyB0aGF0IGFyZSBpbnRyb2R1Y2VkIGluIGZ1dHVyZSBzcGVjaWZpY2F0aW9ucy4KLQotCSAgIFRoZSBmb2xsb3dpbmcgdG9rZW5zIGFsaWFzIHRoZSBzdGFuZGFyZCBwcm90b2NvbCBiaW5kaW5nCi0JICAgVVJJczoKLQotCSAgICMjU09BUDExX0hUVFAgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwL2h0dHAiCi0JICAgIyNTT0FQMTFfSFRUUF9NVE9NID0KLSAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9odHRwP210b209dHJ1ZSIKLSAgICAgICAgICAgIyNTT0FQMTJfSFRUUCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8iCi0gICAgICAgICAgICMjU09BUDEyX0hUVFBfTVRPTSA9Ci0gICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8/bXRvbT10cnVlIgotICAgICAgICAgICAjI1hNTF9IVFRQID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9odHRwIgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIjIy4rIi8+Ci0gICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InNlcnZpY2UtcmVmX3Byb3RvY29sLWJpbmRpbmdMaXN0VHlwZSI+Ci0gICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgIERlZmluZXMgdGhlIHR5cGUgdXNlZCBmb3Igc3BlY2lmeWluZyBhIGxpc3Qgb2YKLQkgICBwcm90b2NvbC1iaW5kaW5nVHlwZShzKS4gRm9yIGUuZy4KLQotCSAgICAjI1NPQVAxMV9IVFRQICMjU09BUDEyX0hUVFAgIyNYTUxfSFRUUAotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0iamF2YWVlOnNlcnZpY2UtcmVmX3Byb3RvY29sLWJpbmRpbmdUeXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ic2VydmljZS1yZWZfcHJvdG9jb2wtYmluZGluZ1R5cGUiPgotICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICBEZWZpbmVzIHRoZSB0eXBlIHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhlIFVSSSBmb3IgdGhlCi0JICAgcHJvdG9jb2wgYmluZGluZyB1c2VkIGJ5IHRoZSBwb3J0LWNvbXBvbmVudC4gIEZvcgotCSAgIHBvcnRhYmlsaXR5IG9uZSBjb3VsZCB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdG9rZW5zIHRoYXQKLQkgICBhbGlhcyB0aGUgc3RhbmRhcmQgYmluZGluZyB0eXBlczoKLQotCSAgICAjI1NPQVAxMV9IVFRQCi0JICAgICMjU09BUDExX0hUVFBfTVRPTQotICAgICAgICAgICAgIyNTT0FQMTJfSFRUUAotICAgICAgICAgICAgIyNTT0FQMTJfSFRUUF9NVE9NCi0gICAgICAgICAgICAjI1hNTF9IVFRQCi0KLQkgICBPdGhlciBzcGVjaWZpY2F0aW9ucyBjb3VsZCBkZWZpbmUgdG9rZW5zIHRoYXQgc3RhcnQgd2l0aCAjIwotCSAgIHRvIGFsaWFzIG5ldyBzdGFuZGFyZCBiaW5kaW5nIFVSSXMgdGhhdCBhcmUgaW50cm9kdWNlZC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOnVuaW9uIG1lbWJlclR5cGVzPSJ4c2Q6YW55VVJJIGphdmFlZTpzZXJ2aWNlLXJlZl9wcm90b2NvbC1VUklBbGlhc1R5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9xbmFtZS1wYXR0ZXJuIj4KLSAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgICBUaGlzIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgUU5hbWUgcGF0dGVybiBpbiB0aGUKLQkgICAgIGF0dHJpYnV0ZSBzZXJ2aWNlLW5hbWUtcGF0dGVybiBhbmQgcG9ydC1uYW1lLXBhdHRlcm4gaW4KLQkgICAgIHRoZSBoYW5kbGVyLWNoYWluIGVsZW1lbnQKLQotCSAgICAgRm9yIGV4YW1wbGUsIHRoZSB2YXJpb3VzIGZvcm1zIGFjY2VwdGFibGUgaGVyZSBmb3IKLQkgICAgIHNlcnZpY2UtbmFtZS1wYXR0ZXJuIGF0dHJpYnV0ZSBpbiBoYW5kbGVyLWNoYWluIGVsZW1lbnQKLQkgICAgIGFyZSA6Ci0KLQkgICAgIEV4YWN0IE5hbWU6IHNlcnZpY2UtbmFtZS1wYXR0ZXJuPSJuczE6RWNob1NlcnZpY2UiCi0KLQkJIEluIHRoaXMgY2FzZSwgaGFuZGxlcnMgc3BlY2lmaWVkIGluIHRoaXMKLQkJIGhhbmRsZXItY2hhaW4gZWxlbWVudCB3aWxsIGFwcGx5IHRvIGFsbCBwb3J0cyB3aXRoCi0JCSB0aGlzIGV4YWN0IHNlcnZpY2UgbmFtZS4gVGhlIG5hbWVzcGFjZSBwcmVmaXggbXVzdAotCQkgaGF2ZSBiZWVuIGRlY2xhcmVkIGluIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0JCSBhdHRyaWJ1dGUgaW4gZWl0aGVyIHRoZSBzdGFydC10YWcgb2YgdGhlIGVsZW1lbnQKLQkJIHdoZXJlIHRoZSBwcmVmaXggaXMgdXNlZCBvciBpbiBhbiBhbiBhbmNlc3RvcgotCQkgZWxlbWVudCAoaS5lLiBhbiBlbGVtZW50IGluIHdob3NlIGNvbnRlbnQgdGhlCi0JCSBwcmVmaXhlZCBtYXJrdXAgb2NjdXJzKQotCi0JICAgICBQYXR0ZXJuIDogc2VydmljZS1uYW1lLXBhdHRlcm49Im5zMTpFY2hvU2VydmljZSoiCi0KLQkJIEluIHRoaXMgY2FzZSwgaGFuZGxlcnMgc3BlY2lmaWVkIGluIHRoaXMKLQkJIGhhbmRsZXItY2hhaW4gZWxlbWVudCB3aWxsIGFwcGx5IHRvIGFsbCBwb3J0cyB3aG9zZQotCQkgU2VydmljZSBuYW1lcyBhcmUgbGlrZSBFY2hvU2VydmljZTEsIEVjaG9TZXJ2aWNlRm9vCi0JCSBldGMuIFRoZSBuYW1lc3BhY2UgcHJlZml4IG11c3QgaGF2ZSBiZWVuIGRlY2xhcmVkIGluCi0JCSBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhdHRyaWJ1dGUgaW4gZWl0aGVyIHRoZQotCQkgc3RhcnQtdGFnIG9mIHRoZSBlbGVtZW50IHdoZXJlIHRoZSBwcmVmaXggaXMgdXNlZCBvcgotCQkgaW4gYW4gYW4gYW5jZXN0b3IgZWxlbWVudCAoaS5lLiBhbiBlbGVtZW50IGluIHdob3NlCi0JCSBjb250ZW50IHRoZSBwcmVmaXhlZCBtYXJrdXAgb2NjdXJzKQotCi0JICAgICBXaWxkIENhcmQgOiBzZXJ2aWNlLW5hbWUtcGF0dGVybj0iKiIKLQotCQlJbiB0aGlzIGNhc2UsIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGlzIGhhbmRsZXItY2hhaW4KLQkJZWxlbWVudCB3aWxsIGFwcGx5IHRvIHBvcnRzIG9mIGFsbCBzZXJ2aWNlIG5hbWVzLgotCi0JICAgIFRoZSBzYW1lIGNhbiBiZSBhcHBsaWVkIHRvIHBvcnQtbmFtZSBhdHRyaWJ1dGUgaW4KLQkgICAgaGFuZGxlci1jaGFpbiBlbGVtZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlwqfChbXGktWzpdXVtcYy1bOl1dKjopP1tcaS1bOl1dW1xjLVs6XV0qXCo/Ii8+Ci0gICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzMueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzY3M2FlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8zLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDczNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgICAgICAgIHZlcnNpb249IjEuMyI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gICAgICAKLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotICAgICAgCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICAgICAgCi0gICAgICBDb250cmlidXRvcihzKToKLSAgICAgIAotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiAyMDAyCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBzZXJ2aWNlLXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgcmVmZXJlbmNlIHRvIGEgV2ViCi0gICAgICAgIHNlcnZpY2UuIEl0IGNvbnRhaW5zIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBkaXNwbGF5IG5hbWUgYW5kCi0gICAgICAgIGljb25zLCBhIGRlY2xhcmF0aW9uIG9mIHRoZSByZXF1aXJlZCBTZXJ2aWNlIGludGVyZmFjZSwKLSAgICAgICAgYW4gb3B0aW9uYWwgV1NETCBkb2N1bWVudCBsb2NhdGlvbiwgYW4gb3B0aW9uYWwgc2V0Ci0gICAgICAgIG9mIEpBWC1SUEMgbWFwcGluZ3MsIGFuIG9wdGlvbmFsIFFOYW1lIGZvciB0aGUgc2VydmljZSBlbGVtZW50LAotICAgICAgICBhbiBvcHRpb25hbCBzZXQgb2YgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIGJlIHJlc29sdmVkIAotICAgICAgICBieSB0aGUgY29udGFpbmVyIHRvIGEgV1NETCBwb3J0LCBhbmQgYW4gb3B0aW9uYWwgc2V0IG9mIGhhbmRsZXJzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1yZWYtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBzZXJ2aWNlLXJlZi1uYW1lIGVsZW1lbnQgZGVjbGFyZXMgbG9naWNhbCBuYW1lIHRoYXQgdGhlCi0gICAgICAgICAgICBjb21wb25lbnRzIGluIHRoZSBtb2R1bGUgdXNlIHRvIGxvb2sgdXAgdGhlIFdlYiBzZXJ2aWNlLiBJdCAKLSAgICAgICAgICAgIGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHNlcnZpY2UgcmVmZXJlbmNlIG5hbWVzIHN0YXJ0IHdpdGggCi0gICAgICAgICAgICAic2VydmljZS8iLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbnRlcmZhY2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgc2VydmljZS1pbnRlcmZhY2UgZWxlbWVudCBkZWNsYXJlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0gICAgICAgICAgICBuYW1lIG9mIHRoZSBKQVgtUlBDIFNlcnZpY2UgaW50ZXJmYWNlIHRoZSBjbGllbnQgZGVwZW5kcyBvbi4gCi0gICAgICAgICAgICBJbiBtb3N0IGNhc2VzIHRoZSB2YWx1ZSB3aWxsIGJlIGphdmF4LnhtbC5ycGMuU2VydmljZS4gIEEgSkFYLVJQQwotICAgICAgICAgICAgZ2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIGNsYXNzIG1heSBhbHNvIGJlIHNwZWNpZmllZC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBzZXJ2aWNlLXJlZi10eXBlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIHR5cGUgb2YgdGhlIHNlcnZpY2UtcmVmIAotICAgICAgICAgICAgZWxlbWVudCB0aGF0IGlzIGluamVjdGVkIG9yIHJldHVybmVkIHdoZW4gYSBKTkRJIGxvb2t1cCBpcyBkb25lLgotICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGVpdGhlciBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIFNlcnZpY2UgY2xhc3Mgb3IgCi0gICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2Ygc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgY2xhc3MuIAotICAgICAgICAgICAgVGhpcyBpcyBvbmx5IHVzZWQgd2l0aCBKQVgtV1MgcnVudGltZSB3aGVyZSB0aGUgY29ycmVzcG9uZGluZyAKLSAgICAgICAgICAgIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24gY2FuIGJlIHVzZWQgdG8gZGVub3RlIGJvdGggYSBTZXJ2aWNlCi0gICAgICAgICAgICBvciBhIFBvcnQuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgdHlwZSBvZiBzZXJ2aWNlLXJlZiBlbGVtZW50IAotICAgICAgICAgICAgdGhhdCBpcyBpbmplY3RlZCBvciByZXR1cm5lZCB3aGVuIGEgSk5ESSBsb29rdXAgaXMgZG9uZSBpcyAKLSAgICAgICAgICAgIGFsd2F5cyBhIFNlcnZpY2UgaW50ZXJmYWNlL2NsYXNzLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1maWxlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RBbnlVUklUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIFVSSSBsb2NhdGlvbiBvZiBhIFdTREwKLSAgICAgICAgICAgIGZpbGUuIFRoZSBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgbW9kdWxlLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF4cnBjLW1hcHBpbmctZmlsZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQKLSAgICAgICAgICAgIGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkKLSAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIFdTREwgZGVzY3JpcHRpb24gaW4gdGhlIHdzZGwtZmlsZS4gIFRoZSAKLSAgICAgICAgICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUgZmlsZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgVGhpcyBpcyBub3QgcmVxdWlyZWQgd2hlbiBKQVgtV1MgYmFzZWQgcnVudGltZSBpcyB1c2VkLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1xbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkUU5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgc2VydmljZS1xbmFtZSBlbGVtZW50IGRlY2xhcmVzIHRoZSBzcGVjaWZpYyBXU0RMIHNlcnZpY2UKLSAgICAgICAgICAgIGVsZW1lbnQgdGhhdCBpcyBiZWluZyByZWZlcmVkIHRvLiAgSXQgaXMgbm90IHNwZWNpZmllZCBpZiBubwotICAgICAgICAgICAgd3NkbC1maWxlIGlzIGRlY2xhcmVkLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwb3J0LWNvbXBvbmVudC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5Ci0gICAgICAgICAgICBvbiB0aGUgY29udGFpbmVyIGZvciByZXNvbHZpbmcgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotICAgICAgICAgICAgdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludAotICAgICAgICAgICAgSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZAotICAgICAgICAgICAgYnkgdGhlIGNvbnRhaW5lciBmb3IgYSBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpIG1ldGhvZCBjYWxsLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aGFuZGxlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIAlEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuCi0gICAgICAgICAgICAgIAlhY2Nlc3MgdGhlIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUKLSAgICAgICAgICAgICAgCUhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZQotICAgICAgICAgICAgICAJaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwgcG9ydHMgb2YgdGhlCi0gICAgICAgICAgICAgIAlzZXJ2aWNlLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgCVRvIGJlIHVzZWQgd2l0aCBKQVgtUlBDIGJhc2VkIHJ1bnRpbWUgb25seS4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWNoYWlucyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpoYW5kbGVyLWNoYWluc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAJIFRvIGJlIHVzZWQgd2l0aCBKQVgtV1MgYmFzZWQgcnVudGltZSBvbmx5LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6cmVzb3VyY2VHcm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3J0LWNvbXBvbmVudC1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLSAgICAgICAgb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLSAgICAgICAgdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludAotICAgICAgICBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi0gICAgICAgIGJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQKLSAgICAgICAgICAgIEphdmEgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBvZiBhCi0gICAgICAgICAgICBXU0RMIHBvcnQuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtbXRvbSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgU09BUCBNVE9NL1hPUCBtZWNoYW5pc20gb24gdGhlIGNsaWVudAotICAgICAgICAgICAgc2lkZSBmb3IgYSBwb3J0LWNvbXBvbmVudC4gCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1SUEMgcnVudGltZQotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXRvbS10aHJlc2hvbGQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFdoZW4gTVRPTSBpcyBlbmFibGVkLCBiaW5hcnkgZGF0YSBhYm92ZSB0aGlzIHNpemUgaW4gYnl0ZXMKLSAgICAgICAgICAgIHNob3VsZCBiZSBYT1AgZW5jb2RlZCBvciBzZW50IGFzIGF0dGFjaG1lbnQuIERlZmF1bHQgdmFsdWUgaXMgMC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgTm90IHRvIGJlIHNwZWNpZmllZCBmb3IgSkFYLVJQQyBydW50aW1lCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZGRyZXNzaW5nIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphZGRyZXNzaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhpcyBzcGVjaWZpZXMgdGhlIFdTLUFkZHJlc3NpbmcgcmVxdWlyZW1lbnRzIGZvciBhIEpBWC1XUwotICAgICAgICAgICAgd2ViIHNlcnZpY2UuIEl0IGNvcnJlc3BvbmRzIHRvIGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmcKLSAgICAgICAgICAgIGFubm90YXRpb24gb3IgaXRzIGZlYXR1cmUgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZ0ZlYXR1cmUuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNlZSB0aGUgYWRkcmVzc2luZ1R5cGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1SUEMgcnVudGltZQotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzcGVjdC1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZXNwZWN0LWJpbmRpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgueG1sLndzLlJlc3BlY3RCaW5kaW5nIGFubm90YXRpb24KLSAgICAgICAgICAgIG9yIGl0cyBjb3JyZXNwb25kaW5nIGphdmF4LnhtbC53cy5SZXNwZWN0QmluZGluZ0ZlYXR1cmUgd2ViCi0gICAgICAgICAgICBzZXJ2aWNlIGZlYXR1cmUuIFRoaXMgaXMgdXNlZCB0byBjb250cm9sIHdoZXRoZXIgYSBKQVgtV1MKLSAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG11c3QgcmVzcGVjdC9ob25vciB0aGUgY29udGVudHMgb2YgdGhlCi0gICAgICAgICAgICB3c2RsOmJpbmRpbmcgaW4gdGhlIFdTREwgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZpY2UuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1SUEMgcnVudGltZQotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtbGluayIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgcG9ydC1jb21wb25lbnQtbGluayBlbGVtZW50IGxpbmtzIGEgcG9ydC1jb21wb25lbnQtcmVmCi0gICAgICAgICAgICB0byBhIHNwZWNpZmljIHBvcnQtY29tcG9uZW50IHJlcXVpcmVkIHRvIGJlIG1hZGUgYXZhaWxhYmxlCi0gICAgICAgICAgICBieSBhIHNlcnZpY2UgcmVmZXJlbmNlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBUaGUgdmFsdWUgb2YgYSBwb3J0LWNvbXBvbmVudC1saW5rIG11c3QgYmUgdGhlCi0gICAgICAgICAgICBwb3J0LWNvbXBvbmVudC1uYW1lIG9mIGEgcG9ydC1jb21wb25lbnQgaW4gdGhlIHNhbWUgbW9kdWxlCi0gICAgICAgICAgICBvciBhbm90aGVyIG1vZHVsZSBpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbiB1bml0LiBUaGUgc3ludGF4Ci0gICAgICAgICAgICBmb3Igc3BlY2lmaWNhdGlvbiBmb2xsb3dzIHRoZSBzeW50YXggZGVmaW5lZCBmb3IgZWpiLWxpbmsKLSAgICAgICAgICAgIGluIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaGFuZGxlci1jaGFpbnNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGhhbmRsZXItY2hhaW5zIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWlucyBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICAgICBzZXJ2aWNlIG9yIHNlcnZpY2UgZW5kcG9pbnQuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jaGFpbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aGFuZGxlci1jaGFpblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImhhbmRsZXItY2hhaW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudCBkZWZpbmVzIHRoZSBoYW5kbGVyY2hhaW4uIAotICAgICAgICBIYW5kbGVyY2hhaW4gY2FuIGJlIGRlZmluZWQgc3VjaCB0aGF0IHRoZSBoYW5kbGVycyBpbiB0aGUKLSAgICAgICAgaGFuZGxlcmNoYWluIG9wZXJhdGUsYWxsIHBvcnRzIG9mIGEgc2VydmljZSwgb24gYSBzcGVjaWZpYwotICAgICAgICBwb3J0IG9yIG9uIGEgbGlzdCBvZiBwcm90b2NvbC1iaW5kaW5ncy4gVGhlIGNob2ljZSBvZiBlbGVtZW50cwotICAgICAgICBzZXJ2aWNlLW5hbWUtcGF0dGVybiwgcG9ydC1uYW1lLXBhdHRlcm4gYW5kIHByb3RvY29sLWJpbmRpbmdzCi0gICAgICAgIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgaGFuZGxlcnMgaW4gaGFuZGxlci1jaGFpbiBhcmUKLSAgICAgICAgZm9yIGEgc2VydmljZSwgcG9ydCBvciBwcm90b2NvbCBiaW5kaW5nLiBJZiBub25lIG9mIHRoZXNlIAotICAgICAgICBjaG9pY2VzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgaGFuZGxlci1jaGFpbiBlbGVtZW50IHRoZW4gdGhlCi0gICAgICAgIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGUgaGFuZGxlci1jaGFpbiB3aWxsIGJlIGFwcGxpZWQgb24gCi0gICAgICAgIGV2ZXJ5dGhpbmcuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1uYW1lLXBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cW5hbWUtcGF0dGVybiIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1uYW1lLXBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cW5hbWUtcGF0dGVybiIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvdG9jb2wtYmluZGluZ3MiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cHJvdG9jb2wtYmluZGluZ0xpc3RUeXBlIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aGFuZGxlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm90b2NvbC1iaW5kaW5nTGlzdFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSB0eXBlIHVzZWQgZm9yIHNwZWNpZnlpbmcgYSBsaXN0IG9mCi0gICAgICAgIHByb3RvY29sLWJpbmRpbmdUeXBlKHMpLiBGb3IgZS5nLgotICAgICAgICAKLSAgICAgICAgIyNTT0FQMTFfSFRUUCAjI1NPQVAxMl9IVFRQICMjWE1MX0hUVFAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpsaXN0IGl0ZW1UeXBlPSJqYXZhZWU6cHJvdG9jb2wtYmluZGluZ1R5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icHJvdG9jb2wtYmluZGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSB0eXBlIHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhlIFVSSSBmb3IgdGhlCi0gICAgICAgIHByb3RvY29sIGJpbmRpbmcgdXNlZCBieSB0aGUgcG9ydC1jb21wb25lbnQuICBGb3IKLSAgICAgICAgcG9ydGFiaWxpdHkgb25lIGNvdWxkIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0b2tlbnMgdGhhdAotICAgICAgICBhbGlhcyB0aGUgc3RhbmRhcmQgYmluZGluZyB0eXBlczogCi0gICAgICAgIAotICAgICAgICAjI1NPQVAxMV9IVFRQCi0gICAgICAgICMjU09BUDExX0hUVFBfTVRPTQotICAgICAgICAjI1NPQVAxMl9IVFRQCi0gICAgICAgICMjU09BUDEyX0hUVFBfTVRPTQotICAgICAgICAjI1hNTF9IVFRQCi0gICAgICAgIAotICAgICAgICBPdGhlciBzcGVjaWZpY2F0aW9ucyBjb3VsZCBkZWZpbmUgdG9rZW5zIHRoYXQgc3RhcnQgd2l0aCAjIwotICAgICAgICB0byBhbGlhcyBuZXcgc3RhbmRhcmQgYmluZGluZyBVUklzIHRoYXQgYXJlIGludHJvZHVjZWQuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6dW5pb24gbWVtYmVyVHlwZXM9InhzZDphbnlVUkkgamF2YWVlOnByb3RvY29sLVVSSUFsaWFzVHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm90b2NvbC1VUklBbGlhc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSB0eXBlIHRoYXQgaXMgdXNlZCBmb3Igc3BlY2lmeWluZyB0b2tlbnMgdGhhdAotICAgICAgICBzdGFydCB3aXRoICMjIHdoaWNoIGFyZSB1c2VkIHRvIGFsaWFzIGV4aXN0aW5nIHN0YW5kYXJkCi0gICAgICAgIHByb3RvY29sIGJpbmRpbmdzIGFuZCBzdXBwb3J0IGFsaWFzZXMgZm9yIG5ldyBzdGFuZGFyZAotICAgICAgICBiaW5kaW5nIFVSSXMgdGhhdCBhcmUgaW50cm9kdWNlZCBpbiBmdXR1cmUgc3BlY2lmaWNhdGlvbnMuCi0gICAgICAgIAotICAgICAgICBUaGUgZm9sbG93aW5nIHRva2VucyBhbGlhcyB0aGUgc3RhbmRhcmQgcHJvdG9jb2wgYmluZGluZwotICAgICAgICBVUklzOgotICAgICAgICAKLSAgICAgICAgIyNTT0FQMTFfSFRUUCA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvaHR0cCIKLSAgICAgICAgIyNTT0FQMTFfSFRUUF9NVE9NID0gCi0gICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvaHR0cD9tdG9tPXRydWUiCi0gICAgICAgICMjU09BUDEyX0hUVFAgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIgotICAgICAgICAjI1NPQVAxMl9IVFRQX01UT00gPSAKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC9iaW5kaW5ncy9IVFRQLz9tdG9tPXRydWUiCi0gICAgICAgICMjWE1MX0hUVFAgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2h0dHAiCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iIyMuKyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJxbmFtZS1wYXR0ZXJuIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIFFOYW1lIHBhdHRlcm4gaW4gdGhlCi0gICAgICAgIGF0dHJpYnV0ZSBzZXJ2aWNlLW5hbWUtcGF0dGVybiBhbmQgcG9ydC1uYW1lLXBhdHRlcm4gaW4KLSAgICAgICAgdGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudAotICAgICAgICAKLSAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSB2YXJpb3VzIGZvcm1zIGFjY2VwdGFibGUgaGVyZSBmb3IKLSAgICAgICAgc2VydmljZS1uYW1lLXBhdHRlcm4gYXR0cmlidXRlIGluIGhhbmRsZXItY2hhaW4gZWxlbWVudAotICAgICAgICBhcmUgOgotICAgICAgICAKLSAgICAgICAgRXhhY3QgTmFtZTogc2VydmljZS1uYW1lLXBhdHRlcm49Im5zMTpFY2hvU2VydmljZSIKLSAgICAgICAgCi0gICAgICAgIAkgSW4gdGhpcyBjYXNlLCBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhpcwotICAgICAgICAJIGhhbmRsZXItY2hhaW4gZWxlbWVudCB3aWxsIGFwcGx5IHRvIGFsbCBwb3J0cyB3aXRoCi0gICAgICAgIAkgdGhpcyBleGFjdCBzZXJ2aWNlIG5hbWUuIFRoZSBuYW1lc3BhY2UgcHJlZml4IG11c3QKLSAgICAgICAgCSBoYXZlIGJlZW4gZGVjbGFyZWQgaW4gYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLSAgICAgICAgCSBhdHRyaWJ1dGUgaW4gZWl0aGVyIHRoZSBzdGFydC10YWcgb2YgdGhlIGVsZW1lbnQKLSAgICAgICAgCSB3aGVyZSB0aGUgcHJlZml4IGlzIHVzZWQgb3IgaW4gYW4gYW4gYW5jZXN0b3IgCi0gICAgICAgIAkgZWxlbWVudCAoaS5lLiBhbiBlbGVtZW50IGluIHdob3NlIGNvbnRlbnQgdGhlIAotICAgICAgICAJIHByZWZpeGVkIG1hcmt1cCBvY2N1cnMpCi0gICAgICAgIAkgCi0gICAgICAgIAotICAgICAgICBQYXR0ZXJuIDogc2VydmljZS1uYW1lLXBhdHRlcm49Im5zMTpFY2hvU2VydmljZSoiCi0gICAgICAgIAotICAgICAgICAJIEluIHRoaXMgY2FzZSwgaGFuZGxlcnMgc3BlY2lmaWVkIGluIHRoaXMKLSAgICAgICAgCSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgd2lsbCBhcHBseSB0byBhbGwgcG9ydHMgd2hvc2UKLSAgICAgICAgCSBTZXJ2aWNlIG5hbWVzIGFyZSBsaWtlIEVjaG9TZXJ2aWNlMSwgRWNob1NlcnZpY2VGb28KLSAgICAgICAgCSBldGMuIFRoZSBuYW1lc3BhY2UgcHJlZml4IG11c3QgaGF2ZSBiZWVuIGRlY2xhcmVkIGluCi0gICAgICAgIAkgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXR0cmlidXRlIGluIGVpdGhlciB0aGUKLSAgICAgICAgCSBzdGFydC10YWcgb2YgdGhlIGVsZW1lbnQgd2hlcmUgdGhlIHByZWZpeCBpcyB1c2VkIG9yCi0gICAgICAgIAkgaW4gYW4gYW4gYW5jZXN0b3IgZWxlbWVudCAoaS5lLiBhbiBlbGVtZW50IGluIHdob3NlIAotICAgICAgICAJIGNvbnRlbnQgdGhlIHByZWZpeGVkIG1hcmt1cCBvY2N1cnMpCi0gICAgICAgIAotICAgICAgICBXaWxkIENhcmQgOiBzZXJ2aWNlLW5hbWUtcGF0dGVybj0iKiIKLSAgICAgICAgCi0gICAgICAgIAlJbiB0aGlzIGNhc2UsIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGlzIGhhbmRsZXItY2hhaW4KLSAgICAgICAgCWVsZW1lbnQgd2lsbCBhcHBseSB0byBwb3J0cyBvZiBhbGwgc2VydmljZSBuYW1lcy4KLSAgICAgICAgCi0gICAgICAgIFRoZSBzYW1lIGNhbiBiZSBhcHBsaWVkIHRvIHBvcnQtbmFtZSBhdHRyaWJ1dGUgaW4KLSAgICAgICAgaGFuZGxlci1jaGFpbiBlbGVtZW50LgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlwqfChbXGktWzpdXVtcYy1bOl1dKjopP1tcaS1bOl1dW1xjLVs6XV0qXCo/Ii8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWRkcmVzc2luZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIHNwZWNpZmllcyB0aGUgV1MtQWRkcmVzc2luZyByZXF1aXJlbWVudHMgZm9yIGEgSkFYLVdTIHdlYiBzZXJ2aWNlLgotICAgICAgICBJdCBjb3JyZXNwb25kcyB0byBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nIGFubm90YXRpb24gb3IgaXRzCi0gICAgICAgIGZlYXR1cmUgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZ0ZlYXR1cmUuCi0gICAgICAgIAotICAgICAgICBJZiB0aGUgImVuYWJsZWQiIGVsZW1lbnQgaXMgInRydWUiLCBXUy1BZGRyZXNzaW5nIGlzIGVuYWJsZWQuCi0gICAgICAgIEl0IG1lYW5zIHRoYXQgdGhlIGVuZHBvaW50IHN1cHBvcnRzIFdTLUFkZHJlc3NpbmcgYnV0IGRvZXMgbm90IHJlcXVpcmUKLSAgICAgICAgaXRzIHVzZS4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yICJlbmFibGVkIiBpcyAidHJ1ZSIuCi0gICAgICAgIAotICAgICAgICBJZiB0aGUgV1MtQWRkcmVzc2luZyBpcyBlbmFibGVkIGFuZCB0aGUgInJlcXVpcmVkIiBlbGVtZW50IGlzICJ0cnVlIiwKLSAgICAgICAgaXQgbWVhbnMgdGhhdCB0aGUgZW5kcG9pbnQgcmVxdWlyZXMgV1MtQWRkcmVzc2luZy4gVGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgZm9yICJyZXF1aXJlZCIgaXMgImZhbHNlIi4KLSAgICAgICAgCi0gICAgICAgIElmIFdTLUFkZHJlc3NpbmcgaXMgZW5hYmxlZCwgdGhlICJyZXNwb25zZXMiIGVsZW1lbnQgZGV0ZXJtaW5lcwotICAgICAgICBpZiBhbiBlbmRwb2ludCByZXF1aXJlcyB0aGUgdXNlIG9mIG9ubHkgYW5vbnltb3VzIHJlc3BvbnNlcywKLSAgICAgICAgb3Igb25seSBub24tYW5vbnltb3VzIHJlc3BvbnNlcywgb3IgYWxsLiBUaGUgdmFsdWUgb2YgdGhlICJyZXNwb25zZXMiCi0gICAgICAgIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgCi0gICAgICAgIEFOT05ZTU9VUwotICAgICAgICBOT05fQU5PTllNT1VTCi0gICAgICAgIEFMTAotICAgICAgICAKLSAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSAicmVzcG9uc2VzIiBpcyBBTEwuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2VzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphZGRyZXNzaW5nLXJlc3BvbnNlc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhZGRyZXNzaW5nLXJlc3BvbnNlc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBJZiBXUy1BZGRyZXNzaW5nIGlzIGVuYWJsZWQsIHRoaXMgdHlwZSBkZXRlcm1pbmVzIGlmIGFuIGVuZHBvaW50Ci0gICAgICAgIHJlcXVpcmVzIHRoZSB1c2Ugb2Ygb25seSBhbm9ueW1vdXMgcmVzcG9uc2VzLCBvciBvbmx5IG5vbi1hbm9ueW1vdXMKLSAgICAgICAgcmVzcG9uc2VzLCBvciBhbGwuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOT05ZTU9VUyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05fQU5PTllNT1VTIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzcGVjdC1iaW5kaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIENvcnJlc3BvbmRzIHRvIHRoZSBqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmcgYW5ub3RhdGlvbgotICAgICAgICBvciBpdHMgY29ycmVzcG9uZGluZyBqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmdGZWF0dXJlIHdlYgotICAgICAgICBzZXJ2aWNlIGZlYXR1cmUuIFRoaXMgaXMgdXNlZCB0byBjb250cm9sIHdoZXRoZXIgYSBKQVgtV1MKLSAgICAgICAgaW1wbGVtZW50YXRpb24gbXVzdCByZXNwZWN0L2hvbm9yIHRoZSBjb250ZW50cyBvZiB0aGUKLSAgICAgICAgd3NkbDpiaW5kaW5nIGluIHRoZSBXU0RMIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlLgotICAgICAgICAKLSAgICAgICAgSWYgdGhlICJlbmFibGVkIiBlbGVtZW50IGlzICJ0cnVlIiwgd3NkbDpiaW5kaW5nIGluIHRoZQotICAgICAgICBhc3NvY2lhdGVkIFdTREwsIGlmIGFueSwgbXVzdCBiZSByZXNwZWN0ZWQvaG9ub3JlZC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGVkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImhhbmRsZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQsIHNlcnZpY2UtcmVmLiBIYW5kbGVycyBjYW4KLSAgICAgICAgYWNjZXNzIHRoZSBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4KLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IHBvcnQtY29tcG9uZW50LCBzZXJ2aWNlLXJlZgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCi0gICAgICAgICAgICBtb2R1bGUuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgRGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgaGFuZGxlciBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhcmFtLXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBOb3QgdG8gYmUgc3BlY2lmaWVkIGZvciBKQVgtV1MgcnVudGltZQotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1oZWFkZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFFOYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBRTmFtZSBvZiBhIFNPQVAgaGVhZGVyIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhlCi0gICAgICAgICAgICBoYW5kbGVyLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBOb3QgdG8gYmUgc3BlY2lmaWVkIGZvciBKQVgtV1MgcnVudGltZQotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1yb2xlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHNvYXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGEgU09BUCBhY3RvciBkZWZpbml0aW9uIHRoYXQgdGhlCi0gICAgICAgICAgICBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgcG9ydC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgV1NETCBwb3J0LW5hbWUgdGhhdCBhCi0gICAgICAgICAgICBoYW5kbGVyIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGguIElmIHBvcnQtbmFtZSBpcyBub3QKLSAgICAgICAgICAgIHNwZWNpZmllZCwgdGhlIGhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgICAgICAgIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgTm90IHRvIGJlIHNwZWNpZmllZCBmb3IgSkFYLVdTIHJ1bnRpbWUKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOmdyb3VwIG5hbWU9InNlcnZpY2UtcmVmR3JvdXAiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlcnZpY2UtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmtleSBuYW1lPSJzZXJ2aWNlLXJlZl9oYW5kbGVyLW5hbWUta2V5Ij4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgICAgICAgd2l0aGluIHRoZSBtb2R1bGUuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpoYW5kbGVyIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmhhbmRsZXItbmFtZSIvPgotICAgICAgICA8L3hzZDprZXk+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpncm91cD4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qc3BfMl8wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvanNwXzJfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MGE3NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qc3BfMl8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMi4wIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylqc3BfMl8wLnhzZHMJMS4xNyAwMy8xOC8wMwotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi0gICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi0gICAgICByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIEpTUCAyLjAgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICB0eXBlcy4gIFRoZSBKU1AgMi4wIHNjaGVtYSBjb250YWlucyBhbGwgdGhlIHNwZWNpYWwKLSAgICAgIHN0cnVjdHVyZXMgYW5kIGRhdGF0eXBlcyB0aGF0IGFyZSBuZWNlc3NhcnkgdG8gdXNlIEpTUCBmaWxlcwotICAgICAgZnJvbSBhIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2NoZW1hIGlzIHVzZWQgYnkgdGhlIHdlYi1hcHBfMl80LnhzZAotICAgICAgZmlsZSB0byBkZWZpbmUgSlNQIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqc3AtY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGpzcC1jb25maWdUeXBlIGlzIHVzZWQgdG8gcHJvdmlkZSBnbG9iYWwgY29uZmlndXJhdGlvbgotCWluZm9ybWF0aW9uIGZvciB0aGUgSlNQIGZpbGVzIGluIGEgd2ViIGFwcGxpY2F0aW9uLiBJdCBoYXMKLQl0d28gc3ViZWxlbWVudHMsIHRhZ2xpYiBhbmQganNwLXByb3BlcnR5LWdyb3VwLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYiIKLQkJICAgdHlwZT0iajJlZTp0YWdsaWJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLXByb3BlcnR5LWdyb3VwIgotCQkgICB0eXBlPSJqMmVlOmpzcC1wcm9wZXJ0eS1ncm91cFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqc3AtZmlsZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZQotCXdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGJlZ2lubmluZyB3aXRoIGEgYC8nLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6cGF0aFR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLXByb3BlcnR5LWdyb3VwVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGpzcC1wcm9wZXJ0eS1ncm91cFR5cGUgaXMgdXNlZCB0byBncm91cCBhIG51bWJlciBvZgotCWZpbGVzIHNvIHRoZXkgY2FuIGJlIGdpdmVuIGdsb2JhbCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi4KLQlBbGwgZmlsZXMgc28gZGVzY3JpYmVkIGFyZSBkZWVtZWQgdG8gYmUgSlNQIGZpbGVzLiAgVGhlCi0JZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgZGVzY3JpYmVkOgotCi0JICAgIC0gQ29udHJvbCB3aGV0aGVyIEVMIGlzIGlnbm9yZWQKLQkgICAgLSBDb250cm9sIHdoZXRoZXIgc2NyaXB0aW5nIGVsZW1lbnRzIGFyZSBpbnZhbGlkCi0JICAgIC0gSW5kaWNhdGUgcGFnZUVuY29kaW5nIGluZm9ybWF0aW9uLgotCSAgICAtIEluZGljYXRlIHRoYXQgYSByZXNvdXJjZSBpcyBhIEpTUCBkb2N1bWVudCAoWE1MKQotCSAgICAtIFByZWx1ZGUgYW5kIENvZGEgYXV0b21hdGljIGluY2x1ZGVzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotCQkgICB0eXBlPSJqMmVlOnVybC1wYXR0ZXJuVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbC1pZ25vcmVkIgotCQkgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBDYW4gYmUgdXNlZCB0byBlYXNpbHkgc2V0IHRoZSBpc0VMSWdub3JlZAotCSAgICBwcm9wZXJ0eSBvZiBhIGdyb3VwIG9mIEpTUCBwYWdlcy4gIEJ5IGRlZmF1bHQsIHRoZQotCSAgICBFTCBldmFsdWF0aW9uIGlzIGVuYWJsZWQgZm9yIFdlYiBBcHBsaWNhdGlvbnMgdXNpbmcKLQkgICAgYSBTZXJ2bGV0IDIuNCBvciBncmVhdGVyIHdlYi54bWwsIGFuZCBkaXNhYmxlZAotCSAgICBvdGhlcndpc2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFnZS1lbmNvZGluZyIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB2YWxpZCB2YWx1ZXMgb2YgcGFnZS1lbmNvZGluZyBhcmUgdGhvc2Ugb2YgdGhlCi0JICAgIHBhZ2VFbmNvZGluZyBwYWdlIGRpcmVjdGl2ZS4gIEl0IGlzIGEKLQkgICAgdHJhbnNsYXRpb24tdGltZSBlcnJvciB0byBuYW1lIGRpZmZlcmVudCBlbmNvZGluZ3MKLQkgICAgaW4gdGhlIHBhZ2VFbmNvZGluZyBhdHRyaWJ1dGUgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlCi0JICAgIG9mIGEgSlNQIHBhZ2UgYW5kIGluIGEgSlNQIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAgICBtYXRjaGluZyB0aGUgcGFnZS4gIEl0IGlzIGFsc28gYSB0cmFuc2xhdGlvbi10aW1lCi0JICAgIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50IGVuY29kaW5ncyBpbiB0aGUgcHJvbG9nCi0JICAgIG9yIHRleHQgZGVjbGFyYXRpb24gb2YgYSBkb2N1bWVudCBpbiBYTUwgc3ludGF4IGFuZAotCSAgICBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGRvY3VtZW50LgotCSAgICBJdCBpcyBsZWdhbCB0byBuYW1lIHRoZSBzYW1lIGVuY29kaW5nIHRocm91Z2gKLQkgICAgbXVsaXRwbGUgbWVjaGFuaXNtcy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY3JpcHRpbmctaW52YWxpZCIKLQkJICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IGRpc2FibGUgc2NyaXB0aW5nIGluIGEKLQkgICAgZ3JvdXAgb2YgSlNQIHBhZ2VzLiAgQnkgZGVmYXVsdCwgc2NyaXB0aW5nIGlzCi0JICAgIGVuYWJsZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaXMteG1sIgotCQkgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBJZiB0cnVlLCBkZW5vdGVzIHRoYXQgdGhlIGdyb3VwIG9mIHJlc291cmNlcwotCSAgICB0aGF0IG1hdGNoIHRoZSBVUkwgcGF0dGVybiBhcmUgSlNQIGRvY3VtZW50cywKLQkgICAgYW5kIHRodXMgbXVzdCBiZSBpbnRlcnByZXRlZCBhcyBYTUwgZG9jdW1lbnRzLgotCSAgICBJZiBmYWxzZSwgdGhlIHJlc291cmNlcyBhcmUgYXNzdW1lZCB0byBub3QKLQkgICAgYmUgSlNQIGRvY3VtZW50cywgdW5sZXNzIHRoZXJlIGlzIGFub3RoZXIKLQkgICAgcHJvcGVydHkgZ3JvdXAgdGhhdCBpbmRpY2F0ZXMgb3RoZXJ3aXNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluY2x1ZGUtcHJlbHVkZSIKLQkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBpbmNsdWRlLXByZWx1ZGUgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKLQkgICAgcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQotCSAgICBXZWIgQXBwbGljYXRpb24uICBXaGVuIHRoZSBlbGVtZW50IGlzIHByZXNlbnQsCi0JICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKLQkgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaAotCSAgICBKU1AgcGFnZSBpbiB0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmNsdWRlLWNvZGEiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgaW5jbHVkZS1jb2RhIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlCi0JICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKLQkgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotCSAgICB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzCi0JICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgZW5kIG9mIGVhY2gKLQkgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFnbGliVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRhZ2xpYlR5cGUgZGVmaW5lcyB0aGUgc3ludGF4IGZvciBkZWNsYXJpbmcgaW4KLQl0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRoYXQgYSB0YWcgbGlicmFyeSBpcwotCWF2YWlsYWJsZSB0byB0aGUgYXBwbGljYXRpb24uICBUaGlzIGNhbiBiZSBkb25lCi0JdG8gb3ZlcnJpZGUgaW1wbGljaXQgbWFwIGVudHJpZXMgZnJvbSBUTEQgZmlsZXMgYW5kCi0JZnJvbSB0aGUgY29udGFpbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi11cmkiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJIGlkZW50aWZ5aW5nIGEKLQkgICAgdGFnIGxpYnJhcnkgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiAgVGhlIGJvZHkKLQkgICAgb2YgdGhlIHRhZ2xpYi11cmkgZWxlbWVudCBtYXkgYmUgZWl0aGVyIGFuCi0JICAgIGFic29sdXRlIFVSSSBzcGVjaWZpY2F0aW9uLCBvciBhIHJlbGF0aXZlIFVSSS4KLQkgICAgVGhlcmUgc2hvdWxkIGJlIG5vIGVudHJpZXMgaW4gd2ViLnhtbCB3aXRoIHRoZQotCSAgICBzYW1lIHRhZ2xpYi11cmkgdmFsdWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItbG9jYXRpb24iCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICB0aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uCi0JICAgIChhcyBhIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIKLQkgICAgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJyYXJ5Ci0JICAgIERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qc3BfMl8xLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvanNwXzJfMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNjMzODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qc3BfMl8xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMi4xIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylqc3BfMl8xLnhzZHMJMS41IDA4LzExLzA1Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIEpTUCAyLjEgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICB0eXBlcy4gIFRoZSBKU1AgMi4xIHNjaGVtYSBjb250YWlucyBhbGwgdGhlIHNwZWNpYWwKLSAgICAgIHN0cnVjdHVyZXMgYW5kIGRhdGF0eXBlcyB0aGF0IGFyZSBuZWNlc3NhcnkgdG8gdXNlIEpTUCBmaWxlcwotICAgICAgZnJvbSBhIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2NoZW1hIGlzIHVzZWQgYnkgdGhlIHdlYi1hcHBfMl81LnhzZAotICAgICAgZmlsZSB0byBkZWZpbmUgSlNQIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNS54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqc3AtY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGpzcC1jb25maWdUeXBlIGlzIHVzZWQgdG8gcHJvdmlkZSBnbG9iYWwgY29uZmlndXJhdGlvbgotCWluZm9ybWF0aW9uIGZvciB0aGUgSlNQIGZpbGVzIGluIGEgd2ViIGFwcGxpY2F0aW9uLiBJdCBoYXMKLQl0d28gc3ViZWxlbWVudHMsIHRhZ2xpYiBhbmQganNwLXByb3BlcnR5LWdyb3VwLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYiIKLQkJICAgdHlwZT0iamF2YWVlOnRhZ2xpYlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtcHJvcGVydHktZ3JvdXAiCi0JCSAgIHR5cGU9ImphdmFlZTpqc3AtcHJvcGVydHktZ3JvdXBUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLWZpbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUganNwLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbCBwYXRoIHRvIGEgSlNQIGZpbGUKLQl3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBiZWdpbm5pbmcgd2l0aCBhIGAvJy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6cGF0aFR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLXByb3BlcnR5LWdyb3VwVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGpzcC1wcm9wZXJ0eS1ncm91cFR5cGUgaXMgdXNlZCB0byBncm91cCBhIG51bWJlciBvZgotCWZpbGVzIHNvIHRoZXkgY2FuIGJlIGdpdmVuIGdsb2JhbCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi4KLQlBbGwgZmlsZXMgc28gZGVzY3JpYmVkIGFyZSBkZWVtZWQgdG8gYmUgSlNQIGZpbGVzLiAgVGhlCi0JZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgZGVzY3JpYmVkOgotCi0JICAgIC0gQ29udHJvbCB3aGV0aGVyIEVMIGlzIGlnbm9yZWQuCi0JICAgIC0gQ29udHJvbCB3aGV0aGVyIHNjcmlwdGluZyBlbGVtZW50cyBhcmUgaW52YWxpZC4KLQkgICAgLSBJbmRpY2F0ZSBwYWdlRW5jb2RpbmcgaW5mb3JtYXRpb24uCi0JICAgIC0gSW5kaWNhdGUgdGhhdCBhIHJlc291cmNlIGlzIGEgSlNQIGRvY3VtZW50IChYTUwpLgotCSAgICAtIFByZWx1ZGUgYW5kIENvZGEgYXV0b21hdGljIGluY2x1ZGVzLgotICAgICAgICAgICAgLSBDb250cm9sIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSAjeyBpcyBhbGxvd2VkCi0gICAgICAgICAgICAgIHdoZW4gdXNlZCBhcyBhIFN0cmluZyBsaXRlcmFsLgotICAgICAgICAgICAgLSBDb250cm9sIHdoZXRoZXIgdGVtcGxhdGUgdGV4dCBjb250YWluaW5nIG9ubHkKLSAgICAgICAgICAgICAgd2hpdGVzcGFjZXMgbXVzdCBiZSByZW1vdmVkIGZyb20gdGhlIHJlc3BvbnNlIG91dHB1dC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotCQkgICB0eXBlPSJqYXZhZWU6dXJsLXBhdHRlcm5UeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsLWlnbm9yZWQiCi0JCSAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IHNldCB0aGUgaXNFTElnbm9yZWQKLQkgICAgcHJvcGVydHkgb2YgYSBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LCB0aGUKLQkgICAgRUwgZXZhbHVhdGlvbiBpcyBlbmFibGVkIGZvciBXZWIgQXBwbGljYXRpb25zIHVzaW5nCi0JICAgIGEgU2VydmxldCAyLjQgb3IgZ3JlYXRlciB3ZWIueG1sLCBhbmQgZGlzYWJsZWQKLQkgICAgb3RoZXJ3aXNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhZ2UtZW5jb2RpbmciCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB2YWxpZCB2YWx1ZXMgb2YgcGFnZS1lbmNvZGluZyBhcmUgdGhvc2Ugb2YgdGhlCi0JICAgIHBhZ2VFbmNvZGluZyBwYWdlIGRpcmVjdGl2ZS4gIEl0IGlzIGEKLQkgICAgdHJhbnNsYXRpb24tdGltZSBlcnJvciB0byBuYW1lIGRpZmZlcmVudCBlbmNvZGluZ3MKLQkgICAgaW4gdGhlIHBhZ2VFbmNvZGluZyBhdHRyaWJ1dGUgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlCi0JICAgIG9mIGEgSlNQIHBhZ2UgYW5kIGluIGEgSlNQIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAgICBtYXRjaGluZyB0aGUgcGFnZS4gIEl0IGlzIGFsc28gYSB0cmFuc2xhdGlvbi10aW1lCi0JICAgIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50IGVuY29kaW5ncyBpbiB0aGUgcHJvbG9nCi0JICAgIG9yIHRleHQgZGVjbGFyYXRpb24gb2YgYSBkb2N1bWVudCBpbiBYTUwgc3ludGF4IGFuZAotCSAgICBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGRvY3VtZW50LgotCSAgICBJdCBpcyBsZWdhbCB0byBuYW1lIHRoZSBzYW1lIGVuY29kaW5nIHRocm91Z2gKLQkgICAgbXVsaXRwbGUgbWVjaGFuaXNtcy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY3JpcHRpbmctaW52YWxpZCIKLQkJICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBDYW4gYmUgdXNlZCB0byBlYXNpbHkgZGlzYWJsZSBzY3JpcHRpbmcgaW4gYQotCSAgICBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LCBzY3JpcHRpbmcgaXMKLQkgICAgZW5hYmxlZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpcy14bWwiCi0JCSAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgSWYgdHJ1ZSwgZGVub3RlcyB0aGF0IHRoZSBncm91cCBvZiByZXNvdXJjZXMKLQkgICAgdGhhdCBtYXRjaCB0aGUgVVJMIHBhdHRlcm4gYXJlIEpTUCBkb2N1bWVudHMsCi0JICAgIGFuZCB0aHVzIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgWE1MIGRvY3VtZW50cy4KLQkgICAgSWYgZmFsc2UsIHRoZSByZXNvdXJjZXMgYXJlIGFzc3VtZWQgdG8gbm90Ci0JICAgIGJlIEpTUCBkb2N1bWVudHMsIHVubGVzcyB0aGVyZSBpcyBhbm90aGVyCi0JICAgIHByb3BlcnR5IGdyb3VwIHRoYXQgaW5kaWNhdGVzIG90aGVyd2lzZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmNsdWRlLXByZWx1ZGUiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBpbmNsdWRlLXByZWx1ZGUgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKLQkgICAgcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQotCSAgICBXZWIgQXBwbGljYXRpb24uICBXaGVuIHRoZSBlbGVtZW50IGlzIHByZXNlbnQsCi0JICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKLQkgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaAotCSAgICBKU1AgcGFnZSBpbiB0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmNsdWRlLWNvZGEiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBpbmNsdWRlLWNvZGEgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKLQkgICAgcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQotCSAgICBXZWIgQXBwbGljYXRpb24uICBXaGVuIHRoZSBlbGVtZW50IGlzIHByZXNlbnQsCi0JICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKLQkgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBlbmQgb2YgZWFjaAotCSAgICBKU1AgcGFnZSBpbiB0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZlcnJlZC1zeW50YXgtYWxsb3dlZC1hcy1saXRlcmFsIgotCQkgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgVGhlIGNoYXJhY3RlciBzZXF1ZW5jZSAjeyBpcyByZXNlcnZlZCBmb3IgRUwgZXhwcmVzc2lvbnMuCi0gICAgICAgICAgICAgQ29uc2VxdWVudGx5LCBhIHRyYW5zbGF0aW9uIGVycm9yIG9jY3VycyBpZiB0aGUgI3sKLSAgICAgICAgICAgICBjaGFyYWN0ZXIgc2VxdWVuY2UgaXMgdXNlZCBhcyBhIFN0cmluZyBsaXRlcmFsLCB1bmxlc3MKLSAgICAgICAgICAgICB0aGlzIGVsZW1lbnQgaXMgZW5hYmxlZCAodHJ1ZSkuIERpc2FibGVkIChmYWxzZSkgYnkKLSAgICAgICAgICAgICBkZWZhdWx0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyaW0tZGlyZWN0aXZlLXdoaXRlc3BhY2VzIgotCQkgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgSW5kaWNhdGVzIHRoYXQgdGVtcGxhdGUgdGV4dCBjb250YWluaW5nIG9ubHkgd2hpdGVzcGFjZXMKLSAgICAgICAgICAgICBtdXN0IGJlIHJlbW92ZWQgZnJvbSB0aGUgcmVzcG9uc2Ugb3V0cHV0LiBJdCBoYXMgbm8KLSAgICAgICAgICAgICBlZmZlY3Qgb24gSlNQIGRvY3VtZW50cyAoWE1MIHN5bnRheCkuIERpc2FibGVkIChmYWxzZSkKLSAgICAgICAgICAgICBieSBkZWZhdWx0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhZ2xpYlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0YWdsaWJUeXBlIGRlZmluZXMgdGhlIHN5bnRheCBmb3IgZGVjbGFyaW5nIGluCi0JdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0aGF0IGEgdGFnIGxpYnJhcnkgaXMKLQlhdmFpbGFibGUgdG8gdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBjYW4gYmUgZG9uZQotCXRvIG92ZXJyaWRlIGltcGxpY2l0IG1hcCBlbnRyaWVzIGZyb20gVExEIGZpbGVzIGFuZAotCWZyb20gdGhlIGNvbnRhaW5lci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItdXJpIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJIGlkZW50aWZ5aW5nIGEKLQkgICAgdGFnIGxpYnJhcnkgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiAgVGhlIGJvZHkKLQkgICAgb2YgdGhlIHRhZ2xpYi11cmkgZWxlbWVudCBtYXkgYmUgZWl0aGVyIGFuCi0JICAgIGFic29sdXRlIFVSSSBzcGVjaWZpY2F0aW9uLCBvciBhIHJlbGF0aXZlIFVSSS4KLQkgICAgVGhlcmUgc2hvdWxkIGJlIG5vIGVudHJpZXMgaW4gd2ViLnhtbCB3aXRoIHRoZQotCSAgICBzYW1lIHRhZ2xpYi11cmkgdmFsdWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItbG9jYXRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIHRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24KLQkgICAgKGFzIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYgotCSAgICBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnIExpYnJhcnkKLQkgICAgRGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIHRhZyBsaWJyYXJ5LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2pzcF8yXzIueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qc3BfMl8yLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0MWU0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2pzcF8yXzIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICAgdmVyc2lvbj0iMi4yIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLSAgICAgIAotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgICAKLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbgotICAgICAgRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlCi0gICAgICAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgICB0aGUgTGljZW5zZS4gWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwgb3IKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLSAgICAgIExpY2Vuc2UuCi0gICAgICAKLSAgICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyCi0gICAgICBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gICAgICBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzCi0gICAgICBwcm92aWRlZCBieSBTdW4gaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZSBmaWxlCi0gICAgICB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4gIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nCi0gICAgICBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBbXQotICAgICAgcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgICAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0gICAgICAKLSAgICAgIENvbnRyaWJ1dG9yKHMpOgotICAgICAgCi0gICAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlCi0gICAgICBDRERMIG9yIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nCi0gICAgICAiW0NvbnRyaWJ1dG9yXSBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UKLSAgICAgIGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhIHJlY2lwaWVudCBoYXMgdGhlCi0gICAgICBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUKLSAgICAgIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8gaXRzCi0gICAgICBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIKLSAgICAgIGNvZGUgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZQotICAgICAgb3B0aW9uIGFwcGxpZXMgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2gKLSAgICAgIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0IGhvbGRlci4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIEpTUCAyLjIgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICB0eXBlcy4gIFRoZSBKU1AgMi4yIHNjaGVtYSBjb250YWlucyBhbGwgdGhlIHNwZWNpYWwKLSAgICAgIHN0cnVjdHVyZXMgYW5kIGRhdGF0eXBlcyB0aGF0IGFyZSBuZWNlc3NhcnkgdG8gdXNlIEpTUCBmaWxlcwotICAgICAgZnJvbSBhIHdlYiBhcHBsaWNhdGlvbi4gCi0gICAgICAKLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIHNjaGVtYSBpcyB1c2VkIGJ5IHRoZSB3ZWItY29tbW9uXzNfMC54c2QgCi0gICAgICBmaWxlIHRvIGRlZmluZSBKU1Agc3BlY2lmaWMgY29udGVudC4gCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAgICAgIAotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICAgICAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICAgICAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAgICAgIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gICAgICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgICAgIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV82LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGpzcC1jb25maWdUeXBlIGlzIHVzZWQgdG8gcHJvdmlkZSBnbG9iYWwgY29uZmlndXJhdGlvbgotICAgICAgICBpbmZvcm1hdGlvbiBmb3IgdGhlIEpTUCBmaWxlcyBpbiBhIHdlYiBhcHBsaWNhdGlvbi4gSXQgaGFzCi0gICAgICAgIHR3byBzdWJlbGVtZW50cywgdGFnbGliIGFuZCBqc3AtcHJvcGVydHktZ3JvdXAuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0YWdsaWJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC1wcm9wZXJ0eS1ncm91cCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6anNwLXByb3BlcnR5LWdyb3VwVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLWZpbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGpzcC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGwgcGF0aCB0byBhIEpTUCBmaWxlCi0gICAgICAgIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGJlZ2lubmluZyB3aXRoIGEgYC8nLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpwYXRoVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1wcm9wZXJ0eS1ncm91cFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUganNwLXByb3BlcnR5LWdyb3VwVHlwZSBpcyB1c2VkIHRvIGdyb3VwIGEgbnVtYmVyIG9mCi0gICAgICAgIGZpbGVzIHNvIHRoZXkgY2FuIGJlIGdpdmVuIGdsb2JhbCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi4KLSAgICAgICAgQWxsIGZpbGVzIHNvIGRlc2NyaWJlZCBhcmUgZGVlbWVkIHRvIGJlIEpTUCBmaWxlcy4gIFRoZQotICAgICAgICBmb2xsb3dpbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGNhbiBiZSBkZXNjcmliZWQ6Ci0gICAgICAgIAotICAgICAgICAtIENvbnRyb2wgd2hldGhlciBFTCBpcyBpZ25vcmVkLgotICAgICAgICAtIENvbnRyb2wgd2hldGhlciBzY3JpcHRpbmcgZWxlbWVudHMgYXJlIGludmFsaWQuCi0gICAgICAgIC0gSW5kaWNhdGUgcGFnZUVuY29kaW5nIGluZm9ybWF0aW9uLgotICAgICAgICAtIEluZGljYXRlIHRoYXQgYSByZXNvdXJjZSBpcyBhIEpTUCBkb2N1bWVudCAoWE1MKS4KLSAgICAgICAgLSBQcmVsdWRlIGFuZCBDb2RhIGF1dG9tYXRpYyBpbmNsdWRlcy4KLSAgICAgICAgLSBDb250cm9sIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSAjeyBpcyBhbGxvd2VkCi0gICAgICAgIHdoZW4gdXNlZCBhcyBhIFN0cmluZyBsaXRlcmFsLgotICAgICAgICAtIENvbnRyb2wgd2hldGhlciB0ZW1wbGF0ZSB0ZXh0IGNvbnRhaW5pbmcgb25seQotICAgICAgICB3aGl0ZXNwYWNlcyBtdXN0IGJlIHJlbW92ZWQgZnJvbSB0aGUgcmVzcG9uc2Ugb3V0cHV0LgotICAgICAgICAtIEluZGljYXRlIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlIGluZm9ybWF0aW9uLgotICAgICAgICAtIEluZGljYXRlIHRoZSBkZWZhdWx0IGJ1ZmZlcmluZyBtb2RlbCBmb3IgSnNwV3JpdGVyCi0gICAgICAgIC0gQ29udHJvbCB3aGV0aGVyIGVycm9yIHNob3VsZCBiZSByYWlzZWQgZm9yIHRoZSB1c2Ugb2YKLSAgICAgICAgdW5kZWNsYXJlZCBuYW1lc3BhY2VzIGluIGEgSlNQIHBhZ2UuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dXJsLXBhdHRlcm5UeXBlIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWwtaWdub3JlZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IHNldCB0aGUgaXNFTElnbm9yZWQKLSAgICAgICAgICAgIHByb3BlcnR5IG9mIGEgZ3JvdXAgb2YgSlNQIHBhZ2VzLiAgQnkgZGVmYXVsdCwgdGhlCi0gICAgICAgICAgICBFTCBldmFsdWF0aW9uIGlzIGVuYWJsZWQgZm9yIFdlYiBBcHBsaWNhdGlvbnMgdXNpbmcKLSAgICAgICAgICAgIGEgU2VydmxldCAyLjQgb3IgZ3JlYXRlciB3ZWIueG1sLCBhbmQgZGlzYWJsZWQKLSAgICAgICAgICAgIG90aGVyd2lzZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhZ2UtZW5jb2RpbmciCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgdmFsaWQgdmFsdWVzIG9mIHBhZ2UtZW5jb2RpbmcgYXJlIHRob3NlIG9mIHRoZQotICAgICAgICAgICAgcGFnZUVuY29kaW5nIHBhZ2UgZGlyZWN0aXZlLiAgSXQgaXMgYQotICAgICAgICAgICAgdHJhbnNsYXRpb24tdGltZSBlcnJvciB0byBuYW1lIGRpZmZlcmVudCBlbmNvZGluZ3MKLSAgICAgICAgICAgIGluIHRoZSBwYWdlRW5jb2RpbmcgYXR0cmlidXRlIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZQotICAgICAgICAgICAgb2YgYSBKU1AgcGFnZSBhbmQgaW4gYSBKU1AgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0gICAgICAgICAgICBtYXRjaGluZyB0aGUgcGFnZS4gIEl0IGlzIGFsc28gYSB0cmFuc2xhdGlvbi10aW1lCi0gICAgICAgICAgICBlcnJvciB0byBuYW1lIGRpZmZlcmVudCBlbmNvZGluZ3MgaW4gdGhlIHByb2xvZwotICAgICAgICAgICAgb3IgdGV4dCBkZWNsYXJhdGlvbiBvZiBhIGRvY3VtZW50IGluIFhNTCBzeW50YXggYW5kCi0gICAgICAgICAgICBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGRvY3VtZW50LgotICAgICAgICAgICAgSXQgaXMgbGVnYWwgdG8gbmFtZSB0aGUgc2FtZSBlbmNvZGluZyB0aHJvdWdoCi0gICAgICAgICAgICBtdWxpdHBsZSBtZWNoYW5pc21zLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NyaXB0aW5nLWludmFsaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIENhbiBiZSB1c2VkIHRvIGVhc2lseSBkaXNhYmxlIHNjcmlwdGluZyBpbiBhCi0gICAgICAgICAgICBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LCBzY3JpcHRpbmcgaXMKLSAgICAgICAgICAgIGVuYWJsZWQuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpcy14bWwiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIElmIHRydWUsIGRlbm90ZXMgdGhhdCB0aGUgZ3JvdXAgb2YgcmVzb3VyY2VzCi0gICAgICAgICAgICB0aGF0IG1hdGNoIHRoZSBVUkwgcGF0dGVybiBhcmUgSlNQIGRvY3VtZW50cywKLSAgICAgICAgICAgIGFuZCB0aHVzIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgWE1MIGRvY3VtZW50cy4KLSAgICAgICAgICAgIElmIGZhbHNlLCB0aGUgcmVzb3VyY2VzIGFyZSBhc3N1bWVkIHRvIG5vdAotICAgICAgICAgICAgYmUgSlNQIGRvY3VtZW50cywgdW5sZXNzIHRoZXJlIGlzIGFub3RoZXIKLSAgICAgICAgICAgIHByb3BlcnR5IGdyb3VwIHRoYXQgaW5kaWNhdGVzIG90aGVyd2lzZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluY2x1ZGUtcHJlbHVkZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGluY2x1ZGUtcHJlbHVkZSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQotICAgICAgICAgICAgcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQotICAgICAgICAgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotICAgICAgICAgICAgdGhlIGdpdmVuIHBhdGggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIChhcwotICAgICAgICAgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaAotICAgICAgICAgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmNsdWRlLWNvZGEiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBpbmNsdWRlLWNvZGEgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKLSAgICAgICAgICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKLSAgICAgICAgICAgIFdlYiBBcHBsaWNhdGlvbi4gIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwKLSAgICAgICAgICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKLSAgICAgICAgICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgZW5kIG9mIGVhY2gKLSAgICAgICAgICAgIEpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmZXJyZWQtc3ludGF4LWFsbG93ZWQtYXMtbGl0ZXJhbCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGNoYXJhY3RlciBzZXF1ZW5jZSAjeyBpcyByZXNlcnZlZCBmb3IgRUwgZXhwcmVzc2lvbnMuCi0gICAgICAgICAgICBDb25zZXF1ZW50bHksIGEgdHJhbnNsYXRpb24gZXJyb3Igb2NjdXJzIGlmIHRoZSAjewotICAgICAgICAgICAgY2hhcmFjdGVyIHNlcXVlbmNlIGlzIHVzZWQgYXMgYSBTdHJpbmcgbGl0ZXJhbCwgdW5sZXNzCi0gICAgICAgICAgICB0aGlzIGVsZW1lbnQgaXMgZW5hYmxlZCAodHJ1ZSkuIERpc2FibGVkIChmYWxzZSkgYnkKLSAgICAgICAgICAgIGRlZmF1bHQuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmltLWRpcmVjdGl2ZS13aGl0ZXNwYWNlcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgSW5kaWNhdGVzIHRoYXQgdGVtcGxhdGUgdGV4dCBjb250YWluaW5nIG9ubHkgd2hpdGVzcGFjZXMKLSAgICAgICAgICAgIG11c3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSByZXNwb25zZSBvdXRwdXQuIEl0IGhhcyBubwotICAgICAgICAgICAgZWZmZWN0IG9uIEpTUCBkb2N1bWVudHMgKFhNTCBzeW50YXgpLiBEaXNhYmxlZCAoZmFsc2UpCi0gICAgICAgICAgICBieSBkZWZhdWx0LgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1jb250ZW50LXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgdmFsaWQgdmFsdWVzIG9mIGRlZmF1bHQtY29udGVudC10eXBlIGFyZSB0aG9zZSBvZiB0aGUKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlIHBhZ2UgZGlyZWN0aXZlLiAgSXQgc3BlY2lmaWVzIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICByZXNwb25zZSBjb250ZW50VHlwZSBpZiB0aGUgcGFnZSBkaXJlY3RpdmUgZG9lcyBub3QgaW5jbHVkZQotICAgICAgICAgICAgYSBjb250ZW50VHlwZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJidWZmZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgdmFsaWQgdmFsdWVzIG9mIGJ1ZmZlciBhcmUgdGhvc2Ugb2YgdGhlCi0gICAgICAgICAgICBidWZmZXIgcGFnZSBkaXJlY3RpdmUuICBJdCBzcGVjaWZpZXMgaWYgYnVmZmVyaW5nIHNob3VsZCBiZQotICAgICAgICAgICAgdXNlZCBmb3IgdGhlIG91dHB1dCB0byByZXNwb25zZSwgYW5kIGlmIHNvLCB0aGUgc2l6ZSBvZiB0aGUKLSAgICAgICAgICAgIGJ1ZmZlciB0byB1c2UuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlcnJvci1vbi11bmRlY2xhcmVkLW5hbWVzcGFjZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiBhIHRhZyB3aXRoIHVua25vd24gbmFtZXNwYWNlIGlzIHVzZWQKLSAgICAgICAgICAgIGluIGEgSlNQIHBhZ2UgKHJlZ3VsYXIgc3ludGF4KSBpcyB0byBzaWxlbnRseSBpZ25vcmUgaXQuICBJZgotICAgICAgICAgICAgc2V0IHRvIHRydWUsIHRoZW4gYW4gZXJyb3IgbXVzdCBiZSByYWlzZWQgZHVyaW5nIHRoZSB0cmFuc2xhdGlvbgotICAgICAgICAgICAgdGltZSB3aGVuIGFuIHVuZGVjbGFyZWQgdGFnIGlzIHVzZWQgaW4gYSBKU1AgcGFnZS4gIERpc2FibGVkCi0gICAgICAgICAgICAoZmFsc2UpIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFnbGliVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSB0YWdsaWJUeXBlIGRlZmluZXMgdGhlIHN5bnRheCBmb3IgZGVjbGFyaW5nIGluCi0gICAgICAgIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdGhhdCBhIHRhZyBsaWJyYXJ5IGlzCi0gICAgICAgIGF2YWlsYWJsZSB0byB0aGUgYXBwbGljYXRpb24uICBUaGlzIGNhbiBiZSBkb25lCi0gICAgICAgIHRvIG92ZXJyaWRlIGltcGxpY2l0IG1hcCBlbnRyaWVzIGZyb20gVExEIGZpbGVzIGFuZAotICAgICAgICBmcm9tIHRoZSBjb250YWluZXIuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliLXVyaSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgQSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJIGlkZW50aWZ5aW5nIGEKLSAgICAgICAgICAgIHRhZyBsaWJyYXJ5IHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoZSBib2R5Ci0gICAgICAgICAgICBvZiB0aGUgdGFnbGliLXVyaSBlbGVtZW50IG1heSBiZSBlaXRoZXIgYW4KLSAgICAgICAgICAgIGFic29sdXRlIFVSSSBzcGVjaWZpY2F0aW9uLCBvciBhIHJlbGF0aXZlIFVSSS4KLSAgICAgICAgICAgIFRoZXJlIHNob3VsZCBiZSBubyBlbnRyaWVzIGluIHdlYi54bWwgd2l0aCB0aGUKLSAgICAgICAgICAgIHNhbWUgdGFnbGliLXVyaSB2YWx1ZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi1sb2NhdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICB0aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uCi0gICAgICAgICAgICAoYXMgYSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViCi0gICAgICAgICAgICBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnIExpYnJhcnkKLSAgICAgICAgICAgIERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9vcm1fMV8wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvb3JtXzFfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZDljNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9vcm1fMV8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1NjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgb2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZyBmaWxlIHNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAotICB2ZXJzaW9uPSIxLjAiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpb3JtXzFfMC54c2QgMS4wICBGZWIgMTQgMjAwNgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLQotICAgICAgQ29weXJpZ2h0IDIwMDUtMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbgotICAgICAgRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlCi0gICAgICAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgICB0aGUgTGljZW5zZS4gWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwgb3IKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLSAgICAgIExpY2Vuc2UuCi0KLSAgICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyCi0gICAgICBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gICAgICBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzCi0gICAgICBwcm92aWRlZCBieSBTdW4gaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZSBmaWxlCi0gICAgICB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4gIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nCi0gICAgICBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBbXQotICAgICAgcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgICAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0KLSAgICAgIENvbnRyaWJ1dG9yKHMpOgotCi0gICAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlCi0gICAgICBDRERMIG9yIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nCi0gICAgICAiW0NvbnRyaWJ1dG9yXSBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UKLSAgICAgIGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhIHJlY2lwaWVudCBoYXMgdGhlCi0gICAgICBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUKLSAgICAgIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8gaXRzCi0gICAgICBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIKLSAgICAgIGNvZGUgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZQotICAgICAgb3B0aW9uIGFwcGxpZXMgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2gKLSAgICAgIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0IGhvbGRlci4KLQotICAgICAgVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgQ0RETCBsaWNlbnNlLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKLQotICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBwZXJzaXN0ZW5jZSBvYmplY3QtcmVsYXRpb25hbCAKLSAgICAgICBtYXBwaW5nIGZpbGUuCi0gICAgICAgVGhlIGZpbGUgbWF5IGJlIG5hbWVkICJNRVRBLUlORi9vcm0ueG1sIiBpbiB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgYXJjaGl2ZSBvciBpdCBtYXkgYmUgbmFtZWQgc29tZSBvdGhlciBuYW1lIHdoaWNoIHdvdWxkIGJlIAotICAgICAgIHVzZWQgdG8gbG9jYXRlIHRoZSBmaWxlIGFzIHJlc291cmNlIG9uIHRoZSBjbGFzc3BhdGguCi0KLSAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5VHlwZSIvPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ2ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XSsoXC5bMC05XSspKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LW1hcHBpbmdzIj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudGl0eS1tYXBwaW5ncyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYW4gbWFwcGluZwotICAgICAgICBmaWxlLiBJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGZvdXIgdHlwZXMgb2YgZWxlbWVudHM6Ci0KLSAgICAgICAgMS4gVGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBjb250YWlucyBtZXRhZGF0YQotICAgICAgICBmb3IgdGhlIGVudGlyZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgaWYgdGhpcyBlbGVtZW50Ci0gICAgICAgIG9jY3VycyBpbiBtdWx0aXBsZSBtYXBwaW5nIGZpbGVzIHdpdGhpbiB0aGUgc2FtZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAKLSAgICAgICAgMi4gVGhlIHBhY2thZ2UsIHNjaGVtYSwgY2F0YWxvZyBhbmQgYWNjZXNzIGVsZW1lbnRzIGFwcGx5IHRvIGFsbCBvZgotICAgICAgICB0aGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBkZWZpbmVkIGluCi0gICAgICAgIHRoZSBzYW1lIGZpbGUgaW4gd2hpY2ggdGhleSBvY2N1ci4KLQotICAgICAgICAzLiBUaGUgc2VxdWVuY2UtZ2VuZXJhdG9yLCB0YWJsZS1nZW5lcmF0b3IsIG5hbWVkLXF1ZXJ5LAotICAgICAgICBuYW1lZC1uYXRpdmUtcXVlcnkgYW5kIHNxbC1yZXN1bHQtc2V0LW1hcHBpbmcgZWxlbWVudHMgYXJlIGdsb2JhbAotICAgICAgICB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZQotICAgICAgICBzZXF1ZW5jZS1nZW5lcmF0b3Igb3IgdGFibGUtZ2VuZXJhdG9yIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUKLSAgICAgICAgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyBhbHNvIAotICAgICAgICB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIG5hbWVkLXF1ZXJ5IG9yIG5hbWVkLW5hdGl2ZS1xdWVyeQotICAgICAgICBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgCi0gICAgICAgIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgNC4gVGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZWFjaCBkZWZpbmUKLSAgICAgICAgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgbWFuYWdlZCBwZXJzaXN0ZW50IGNsYXNzLiBUaGUgbWFwcGluZwotICAgICAgICBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlc2UgZWxlbWVudHMgbWF5IGJlIGNvbXBsZXRlIG9yIGl0IG1heQotICAgICAgICBiZSBwYXJ0aWFsLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIiB0eXBlPSJvcm06bWFwcGVkLXN1cGVyY2xhc3MiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IiB0eXBlPSJvcm06ZW50aXR5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGFibGUiIHR5cGU9Im9ybTplbWJlZGRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb25UeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjAiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgTWV0YWRhdGEgdGhhdCBhcHBsaWVzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZCBub3QganVzdCB0byAKLSAgICAgICAgdGhlIG1hcHBpbmcgZmlsZSBpbiB3aGljaCBpdCBpcyBjb250YWluZWQuIAotCi0gICAgICAgIElmIHRoZSB4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSBlbGVtZW50IGlzIHNwZWNpZmllZCB0aGVuIAotICAgICAgICB0aGUgY29tcGxldGUgc2V0IG9mIG1hcHBpbmcgbWV0YWRhdGEgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0IAotICAgICAgICBpcyBjb250YWluZWQgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGVzIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGVzZSBkZWZhdWx0cyBhcmUgYXBwbGllZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhcyBhIHdob2xlIAotICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTCAKLSAgICAgICAgZWxlbWVudCBzZXR0aW5ncy4gCi0gICAgICAgIAotICAgICAgICBzY2hlbWEgLSBVc2VkIGFzIHRoZSBzY2hlbWEgZm9yIGFsbCB0YWJsZXMgb3Igc2Vjb25kYXJ5IHRhYmxlcwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcyBvciBzZWNvbmRhcnkgdGFibGVzCi0gICAgICAgICAgICB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGFjY2VzcyAtIFVzZWQgYXMgdGhlIGFjY2VzcyB0eXBlIGZvciBhbGwgbWFuYWdlZCBjbGFzc2VzIGluCi0gICAgICAgICAgICB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXNjYWRlLXBlcnNpc3QgLSBBZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucwotICAgICAgICAgICAgaW4gZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgZW50aXR5LWxpc3RlbmVycyAtIExpc3Qgb2YgZGVmYXVsdCBlbnRpdHkgbGlzdGVuZXJzIHRvIGJlIGludm9rZWQgCi0gICAgICAgICAgICBvbiBlYWNoIGVudGl0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhbiBlbnRpdHkuIElzIGFsbG93ZWQgdG8gYmUKLSAgICAgICAgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGFubm90YXRpb25zLgotICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIAotICAgICAgICBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIG9uIHRoZSBlbnRpdHkgY2xhc3MgKGFuZCBpdHMgZmllbGRzCi0gICAgICAgIG9yIHByb3BlcnRpZXMpIGFyZSB0byBiZSBwcm9jZXNzZWQuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiAKLSAgICAgICAgdGhlIGRlZmF1bHRpbmcgcnVsZXMgZm9yIHRoZSBlbnRpdHkgYW5kIGl0cyBzdWJlbGVtZW50cyB3aWxsIAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ib3JtOnRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWNvbmRhcnktdGFibGUiIHR5cGU9Im9ybTpzZWNvbmRhcnktdGFibGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9Im9ybTppbmhlcml0YW5jZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdmFsdWUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIGVudGl0eSBmaWVsZCBvciBwcm9wZXJ0eSBtYXBwaW5ncy4KLSAgICAgICAgSXQgbWF5IGJlIHNwYXJzZWx5IHBvcHVsYXRlZCB0byBpbmNsdWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlCi0gICAgICAgIGZpZWxkcyBvciBwcm9wZXJ0aWVzLiBJZiBtZXRhZGF0YS1jb21wbGV0ZSBmb3IgdGhlIGVudGl0eSBpcyB0cnVlCi0gICAgICAgIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGRlZmF1bHRlZCBhY2NvcmRpbmcKLSAgICAgICAgdG8gdGhlIGRlZmF1bHQgcnVsZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ib3JtOmlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tb25lIiB0eXBlPSJvcm06bWFueS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1tYW55IiB0eXBlPSJvcm06b25lLXRvLW1hbnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1vbmUiIHR5cGU9Im9ybTpvbmUtdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW1hbnkiIHR5cGU9Im9ybTptYW55LXRvLW1hbnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZCIgdHlwZT0ib3JtOmVtYmVkZGVkIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImFjY2Vzcy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGRldGVybWluZXMgaG93IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBhY2Nlc3NlcyB0aGUKLSAgICAgICAgc3RhdGUgb2YgYW4gZW50aXR5IG9yIGVtYmVkZGVkIG9iamVjdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyBhbiBlbnRpdHkgbGlzdGVuZXIgdG8gYmUgaW52b2tlZCBhdCBsaWZlY3ljbGUgZXZlbnRzCi0gICAgICAgIGZvciB0aGUgZW50aXRpZXMgdGhhdCBsaXN0IHRoaXMgbGlzdGVuZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0VXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1oaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKSAKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUXVlcnlIaW50IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFF1ZXJ5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBxdWVyeSgpOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZE5hdGl2ZVF1ZXJ5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBxdWVyeSgpOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7IC8vbmFtZWQgU3FsUmVzdWx0U2V0TWFwcGluZwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTcWxSZXN1bHRTZXRNYXBwaW5nIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEVudGl0eVJlc3VsdFtdIGVudGl0aWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDb2x1bW5SZXN1bHRbXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktcmVzdWx0IiB0eXBlPSJvcm06ZW50aXR5LXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1yZXN1bHQiIHR5cGU9Im9ybTpjb2x1bW4tcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlSZXN1bHQgewotICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzKCk7Ci0gICAgICAgICAgRmllbGRSZXN1bHRbXSBmaWVsZHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1yZXN1bHQiIHR5cGU9Im9ybTpmaWVsZC1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJlbnRpdHktY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZpZWxkUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWNvbmRhcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgfQotCi0gICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFVuaXF1ZUNvbnN0cmFpbnQgewotICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7Ci0gICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KLSAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBDb2x1bW4gY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEFzc29jaWF0aW9uT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQtY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZENsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQtaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNpZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNpZW50IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWZXJzaW9uIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljIHsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9iIiB0eXBlPSJvcm06bG9iIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRmV0Y2hUeXBlIHsgTEFaWSwgRUFHRVIgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBWlkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9iIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTG9iIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRlbXBvcmFsIHsKLSAgICAgICAgICBUZW1wb3JhbFR5cGUgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06dGVtcG9yYWwtdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIFRlbXBvcmFsVHlwZSB7Ci0gICAgICAgICAgREFURSwgLy8gamF2YS5zcWwuRGF0ZQotICAgICAgICAgIFRJTUUsIC8vIGphdmEuc3FsLlRpbWUKLSAgICAgICAgICBUSU1FU1RBTVAgLy8gamF2YS5zcWwuVGltZXN0YW1wCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQVRFIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRVNUQU1QIi8+Ci0gICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bWVyYXRlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudW1lcmF0ZWQgewotICAgICAgICAgIEVudW1UeXBlIHZhbHVlKCkgZGVmYXVsdCBPUkRJTkFMOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTplbnVtLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKLSAgICAgICAgICBPUkRJTkFMLAotICAgICAgICAgIFNUUklORwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRJTkFMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+ICAgICAgIAotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4gICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FzY2FkZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gQ2FzY2FkZVR5cGUgeyBBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0h9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWFsbCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlZnJlc2giIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4gICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pblRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGludmVyc2VKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW52ZXJzZS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb01hbnkgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1ieSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQnkgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5oZXJpdGFuY2UgewotICAgICAgICAgIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpbmhlcml0YW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlCi0gICAgICAgICAgeyBTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJTkdMRV9UQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9JTkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRV9QRVJfQ0xBU1MiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsgU1RSSU5HLCBDSEFSLCBJTlRFR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIkRUWVBFIjsKLSAgICAgICAgICBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSgpIGRlZmF1bHQgU1RSSU5HOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGVtYmVkZGFibGUgb2JqZWN0cy4gSXMgCi0gICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAotICAgICAgICBpbiB0aGUgY2xhc3MuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGFibGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTplbWJlZGRhYmxlLWF0dHJpYnV0ZXMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZS1hdHRyaWJ1dGVzIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IAotICAgICAgICBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvb3JtXzJfMC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL29ybV8yXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI2YjM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvb3JtXzJfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIEphdmEgUGVyc2lzdGVuY2UgQVBJIG9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZSBzY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybSIgCi0gIHhtbG5zOm9ybT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMi4wIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKW9ybV8yXzAueHNkIDIuMCAgT2N0b2JlciAxIDIwMDkKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IFN1biBNaWNyb3N5c3RlbXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAotICAKLSAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIAotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCAKLSAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uIAotICBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCAKLSAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICAKLSAgQ29udHJpYnV0b3JzOgotICAgICAgTGluZGEgRGVNaWNoaWVsIC0gSmF2YSBQZXJzaXN0ZW5jZSAyLjAsIFZlcnNpb24gMi4wIChPY3RvYmVyIDEsIDIwMDkpCi0gICAgICBTcGVjaWZpY2F0aW9uIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9qY3Aub3JnL2VuL2pzci9kZXRhaWw/aWQ9MzE3Ci0gIAotICAgVGhpcyBjb3B5IG9mIG9ybV8yXzAueHNkIHdhcyBvcmlnaW5hbGx5IGNvcGllZCBmcm9tIHRoZSBFY2xpcHNlIFJ1bnRpbWUgCi0gICBFY2xpcHNlTGluayBQcm9qZWN0IGFuZCBpcyBpbmNsdWRlZCBoZXJlIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKLQotICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBwZXJzaXN0ZW5jZSBvYmplY3QvcmVsYXRpb25hbCAKLSAgICAgICBtYXBwaW5nIGZpbGUuCi0gICAgICAgVGhlIGZpbGUgbWF5IGJlIG5hbWVkICJNRVRBLUlORi9vcm0ueG1sIiBpbiB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgYXJjaGl2ZSBvciBpdCBtYXkgYmUgbmFtZWQgc29tZSBvdGhlciBuYW1lIHdoaWNoIHdvdWxkIGJlIAotICAgICAgIHVzZWQgdG8gbG9jYXRlIHRoZSBmaWxlIGFzIHJlc291cmNlIG9uIHRoZSBjbGFzc3BhdGguCi0KLSAgICAgICBPYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIGZpbGVzIG11c3QgaW5kaWNhdGUgdGhlIG9iamVjdC9yZWxhdGlvbmFsCi0gICAgICAgbWFwcGluZyBmaWxlIHNjaGVtYSBieSB1c2luZyB0aGUgcGVyc2lzdGVuY2UgbmFtZXNwYWNlOgotCi0gICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UKLQotICAgICAgIGFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0gICAgICAgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgICAgPGVudGl0eS1tYXBwaW5ncyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybQotICAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybS9vcm1fMl8wLnhzZCIKLSAgICAgICAgdmVyc2lvbj0iMi4wIj4KLSAgICAgICAgICAuLi4KLSAgICAgIDwvZW50aXR5LW1hcHBpbmdzPgotCi0KLSAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5VHlwZSIvPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ2ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XSsoXC5bMC05XSspKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LW1hcHBpbmdzIj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudGl0eS1tYXBwaW5ncyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBtYXBwaW5nCi0gICAgICAgIGZpbGUuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZm91ciB0eXBlcyBvZiBlbGVtZW50czoKLQotICAgICAgICAxLiBUaGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IGNvbnRhaW5zIG1ldGFkYXRhCi0gICAgICAgIGZvciB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCBpZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgb2NjdXJzIGluIG11bHRpcGxlIG1hcHBpbmcgZmlsZXMgd2l0aGluIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgIAotICAgICAgICAyLiBUaGUgcGFja2FnZSwgc2NoZW1hLCBjYXRhbG9nIGFuZCBhY2Nlc3MgZWxlbWVudHMgYXBwbHkgdG8gYWxsIG9mCi0gICAgICAgIHRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGRlZmluZWQgaW4KLSAgICAgICAgdGhlIHNhbWUgZmlsZSBpbiB3aGljaCB0aGV5IG9jY3VyLgotCi0gICAgICAgIDMuIFRoZSBzZXF1ZW5jZS1nZW5lcmF0b3IsIHRhYmxlLWdlbmVyYXRvciwgbmFtZWQtcXVlcnksCi0gICAgICAgIG5hbWVkLW5hdGl2ZS1xdWVyeSBhbmQgc3FsLXJlc3VsdC1zZXQtbWFwcGluZyBlbGVtZW50cyBhcmUgZ2xvYmFsCi0gICAgICAgIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCi0gICAgICAgIHNlcXVlbmNlLWdlbmVyYXRvciBvciB0YWJsZS1nZW5lcmF0b3Igb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZQotICAgICAgICBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIGFsc28gCi0gICAgICAgIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZWQtcXVlcnksIG5hbWVkLW5hdGl2ZS1xdWVyeSwgb3IKLSAgICAgICAgcmVzdWx0LXNldC1tYXBwaW5nIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUgb3IgZGlmZmVyZW50IG1hcHBpbmcgCi0gICAgICAgIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICA0LiBUaGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBlYWNoIGRlZmluZQotICAgICAgICB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBtYW5hZ2VkIHBlcnNpc3RlbnQgY2xhc3MuIFRoZSBtYXBwaW5nCi0gICAgICAgIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGVzZSBlbGVtZW50cyBtYXkgYmUgY29tcGxldGUgb3IgaXQgbWF5Ci0gICAgICAgIGJlIHBhcnRpYWwuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkYWJsZSIgdHlwZT0ib3JtOmVtYmVkZGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvblR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgZml4ZWQ9IjIuMCIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBNZXRhZGF0YSB0aGF0IGFwcGxpZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIG5vdCBqdXN0IHRvIAotICAgICAgICB0aGUgbWFwcGluZyBmaWxlIGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZC4gCi0KLSAgICAgICAgSWYgdGhlIHhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIGVsZW1lbnQgaXMgc3BlY2lmaWVkLAotICAgICAgICB0aGUgY29tcGxldGUgc2V0IG9mIG1hcHBpbmcgbWV0YWRhdGEgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0IAotICAgICAgICBpcyBjb250YWluZWQgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGVzIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZSAKLSAgICAgICAgdW5sZXNzIHRoZXkgYXJlIG92ZXJyaWRkZW4gYnkgbG9jYWwgYW5ub3RhdGlvbiBvciBYTUwgCi0gICAgICAgIGVsZW1lbnQgc2V0dGluZ3MuIAotICAgICAgICAKLSAgICAgICAgc2NoZW1hIC0gVXNlZCBhcyB0aGUgc2NoZW1hIGZvciBhbGwgdGFibGVzLCBzZWNvbmRhcnkgdGFibGVzLCBqb2luCi0gICAgICAgICAgICB0YWJsZXMsIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgCi0gICAgICAgICAgICBnZW5lcmF0b3JzIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2F0YWxvZyAtIFVzZWQgYXMgdGhlIGNhdGFsb2cgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsIGpvaW4KLSAgICAgICAgICAgIHRhYmxlcywgY29sbGVjdGlvbiB0YWJsZXMsIHNlcXVlbmNlIGdlbmVyYXRvcnMsIGFuZCB0YWJsZSAKLSAgICAgICAgICAgIGdlbmVyYXRvcnMgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBkZWxpbWl0ZWQtaWRlbnRpZmllcnMgLSBVc2VkIHRvIHRyZWF0IGRhdGFiYXNlIGlkZW50aWZpZXJzIGFzCi0gICAgICAgICAgICBkZWxpbWl0ZWQgaWRlbnRpZmllcnMuCi0gICAgICAgIGFjY2VzcyAtIFVzZWQgYXMgdGhlIGFjY2VzcyB0eXBlIGZvciBhbGwgbWFuYWdlZCBjbGFzc2VzIGluCi0gICAgICAgICAgICB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXNjYWRlLXBlcnNpc3QgLSBBZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucwotICAgICAgICAgICAgaW4gYWxsIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGVudGl0eS1saXN0ZW5lcnMgLSBMaXN0IG9mIGRlZmF1bHQgZW50aXR5IGxpc3RlbmVycyB0byBiZSBpbnZva2VkIAotICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVsaW1pdGVkLWlkZW50aWZpZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYW4gZW50aXR5LiBJcyBhbGxvd2VkIHRvIGJlCi0gICAgICAgIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViZWxlbWVudHMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9Im9ybTp0YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIiB0eXBlPSJvcm06c2Vjb25kYXJ5LXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJvcm06aW5oZXJpdGFuY2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0e307Ci0gICAgICAgICAgSm9pblRhYmxlIGpvaW5UYWJsZSgpIGRlZmF1bHQgQEpvaW5UYWJsZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIENvbHVtbiBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyB0aGUgZW50aXR5IGZpZWxkIG9yIHByb3BlcnR5IG1hcHBpbmdzLgotICAgICAgICBJdCBtYXkgYmUgc3BhcnNlbHkgcG9wdWxhdGVkIHRvIGluY2x1ZGUgb25seSBhIHN1YnNldCBvZiB0aGUKLSAgICAgICAgZmllbGRzIG9yIHByb3BlcnRpZXMuIElmIG1ldGFkYXRhLWNvbXBsZXRlIGZvciB0aGUgZW50aXR5IGlzIHRydWUKLSAgICAgICAgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGVmYXVsdGVkIGFjY29yZGluZwotICAgICAgICB0byB0aGUgZGVmYXVsdCBydWxlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ib3JtOmlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tb25lIiB0eXBlPSJvcm06bWFueS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1tYW55IiB0eXBlPSJvcm06b25lLXRvLW1hbnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1vbmUiIHR5cGU9Im9ybTpvbmUtdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW1hbnkiIHR5cGU9Im9ybTptYW55LXRvLW1hbnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbGVtZW50LWNvbGxlY3Rpb24iIHR5cGU9Im9ybTplbGVtZW50LWNvbGxlY3Rpb24iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZCIgdHlwZT0ib3JtOmVtYmVkZGVkIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhc2NhZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIENhc2NhZGVUeXBlIHsgQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNILCBERVRBQ0h9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWFsbCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlZnJlc2giIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1kZXRhY2giIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7Ci0gICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KLSAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbi1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtblJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIkRUWVBFIjsKLSAgICAgICAgICBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSgpIGRlZmF1bHQgU1RSSU5HOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsgU1RSSU5HLCBDSEFSLCBJTlRFR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvclZhbHVlIHsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbGVtZW50LWNvbGxlY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbGVtZW50Q29sbGVjdGlvbiB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmxvYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGVtYmVkZGFibGUgb2JqZWN0cy4gSXMgCi0gICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAotICAgICAgICBpbiB0aGUgY2xhc3MuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGFibGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTplbWJlZGRhYmxlLWF0dHJpYnV0ZXMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUtYXR0cmlidXRlcyI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYyIgdHlwZT0ib3JtOmJhc2ljIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW9uZSIgdHlwZT0ib3JtOm9uZS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tbWFueSIgdHlwZT0ib3JtOm1hbnktdG8tbWFueSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsZW1lbnQtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmVsZW1lbnQtY29sbGVjdGlvbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQtaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyBhbiBlbnRpdHkgbGlzdGVuZXIgdG8gYmUgaW52b2tlZCBhdCBsaWZlY3ljbGUgZXZlbnRzCi0gICAgICAgIGZvciB0aGUgZW50aXRpZXMgdGhhdCBsaXN0IHRoaXMgbGlzdGVuZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVycyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eUxpc3RlbmVycyB7Ci0gICAgICAgICAgQ2xhc3NbXSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lciIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5UmVzdWx0IHsKLSAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcygpOwotICAgICAgICAgIEZpZWxkUmVzdWx0W10gZmllbGRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtcmVzdWx0IiB0eXBlPSJvcm06ZmllbGQtcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRW51bVR5cGUgewotICAgICAgICAgIE9SRElOQUwsCi0gICAgICAgICAgU1RSSU5HCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9SRElOQUwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1lcmF0ZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnVtZXJhdGVkIHsKLSAgICAgICAgICBFbnVtVHlwZSB2YWx1ZSgpIGRlZmF1bHQgT1JESU5BTDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06ZW51bS10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZpZWxkUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWRDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5oZXJpdGFuY2UgewotICAgICAgICAgIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpbmhlcml0YW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlCi0gICAgICAgICAgeyBTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJTkdMRV9UQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9JTkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRV9QRVJfQ0xBU1MiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2stbW9kZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gTG9ja01vZGVUeXBlIHsgUkVBRCwgV1JJVEUsIE9QVElNSVNUSUMsIE9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBQRVNTSU1JU1RJQ19SRUFELCBQRVNTSU1JU1RJQ19XUklURSwgUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBOT05FfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldSSVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJTUlTVElDIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4gICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcy1pZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5LWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Q2xhc3MgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5LWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleUNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYSBtYXBwZWQgc3VwZXJjbGFzcy4gSXMgCi0gICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAotICAgICAgICBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCBiZSByZWN1cnNpdmVseSAKLSAgICAgICAgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwcGVkU3VwZXJjbGFzc3t9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgTG9ja01vZGVUeXBlIGxvY2tNb2RlKCkgZGVmYXVsdCBOT05FOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NrLW1vZGUiIHR5cGU9Im9ybTpsb2NrLW1vZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBvcnBoYW5SZW1vdmFsKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9ycGhhbi1yZW1vdmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHMtaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtbG9hZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdExvYWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXVwZGF0ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXVwZGF0ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlVXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1oaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKSAKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUXVlcnlIaW50IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY29uZGFyeS10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlY29uZGFyeVRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHBrSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICB9Ci0KLSAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2VxdWVuY2VHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHNlcXVlbmNlTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDE7Ci0gICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlcXVlbmNlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNxbFJlc3VsdFNldE1hcHBpbmcgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgRW50aXR5UmVzdWx0W10gZW50aXRpZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENvbHVtblJlc3VsdFtdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktcmVzdWx0IiB0eXBlPSJvcm06ZW50aXR5LXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1yZXN1bHQiIHR5cGU9Im9ybTpjb2x1bW4tcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGVHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uVmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDA7Ci0gICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVtcG9yYWwgewotICAgICAgICAgIFRlbXBvcmFsVHlwZSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp0ZW1wb3JhbC10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKLSAgICAgICAgICBEQVRFLCAvLyBqYXZhLnNxbC5EYXRlCi0gICAgICAgICAgVElNRSwgLy8gamF2YS5zcWwuVGltZQotICAgICAgICAgIFRJTUVTVEFNUCAvLyBqYXZhLnNxbC5UaW1lc3RhbXAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FU1RBTVAiLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zaWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zaWVudCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFVuaXF1ZUNvbnN0cmFpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmdbXSBjb2x1bW5OYW1lcygpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWZXJzaW9uIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3BlcnNpc3RlbmNlXzFfMC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3BlcnNpc3RlbmNlXzFfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYTE1N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9wZXJzaXN0ZW5jZV8xXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIHBlcnNpc3RlbmNlLnhtbCBzY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgeG1sbnM6cGVyc2lzdGVuY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlIgotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgCi0gIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgCi0gIHZlcnNpb249IjEuMCI+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylwZXJzaXN0ZW5jZV8xXzAueHNkICAxLjAgIEZlYiA5IDIwMDYKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0KLSAgICAgIENvcHlyaWdodCAyMDA1LTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotCi0gICAgICBDb250cmlidXRvcihzKToKLQotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0KLSAgICAgIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIENEREwgbGljZW5zZS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWwotCi0gICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBwZXJzaXN0ZW5jZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgIFRoZSBmaWxlIG11c3QgYmUgbmFtZWQgIk1FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIgaW4gdGhlIAotICAgICBwZXJzaXN0ZW5jZSBhcmNoaXZlLgotICAgICBQZXJzaXN0ZW5jZSBjb25maWd1cmF0aW9uIGZpbGVzIG11c3QgaW5kaWNhdGUKLSAgICAgdGhlIHBlcnNpc3RlbmNlIHNjaGVtYSBieSB1c2luZyB0aGUgcGVyc2lzdGVuY2UgbmFtZXNwYWNlOgotCi0gICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlCi0KLSAgICAgYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLSAgICAgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgICAgPHBlcnNpc3RlbmNlIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZQotICAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlXzFfMC54c2QiCi0gICAgICAgIHZlcnNpb249IjEuMCI+Ci0gICAgICAgICAgLi4uCi0gICAgICA8L3BlcnNpc3RlbmNlPgotCi0gICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLQotICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBvZiBhIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotCi0gICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhpcyBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm92aWRlciIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBQcm92aWRlciBjbGFzcyB0aGF0IHN1cHBsaWVzIEVudGl0eU1hbmFnZXJzIGZvciB0aGlzIAotICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqdGEtZGF0YS1zb3VyY2UiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgVGhlIGNvbnRhaW5lci1zcGVjaWZpYyBuYW1lIG9mIHRoZSBKVEEgZGF0YXNvdXJjZSB0byB1c2UuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbi1qdGEtZGF0YS1zb3VyY2UiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgVGhlIGNvbnRhaW5lci1zcGVjaWZpYyBuYW1lIG9mIGEgbm9uLUpUQSBkYXRhc291cmNlIHRvIHVzZS4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGluZy1maWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBGaWxlIGNvbnRhaW5pbmcgbWFwcGluZyBpbmZvcm1hdGlvbi4gTG9hZGVkIGFzIGEgcmVzb3VyY2UgCi0gICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlci4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamFyLWZpbGUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIEphciBmaWxlIHRoYXQgc2hvdWxkIGJlIHNjYW5uZWQgZm9yIGVudGl0aWVzLiAKLSAgICAgICAgICAgICAgICAgICAgTm90IGFwcGxpY2FibGUgdG8gSmF2YSBTRSBwZXJzaXN0ZW5jZSB1bml0cy4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIENsYXNzIHRvIHNjYW4gZm9yIGFubm90YXRpb25zLiAgSXQgc2hvdWxkIGJlIGFubm90YXRlZCAKLSAgICAgICAgICAgICAgICAgICAgd2l0aCBlaXRoZXIgQEVudGl0eSwgQEVtYmVkZGFibGUgb3IgQE1hcHBlZFN1cGVyY2xhc3MuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtdW5saXN0ZWQtY2xhc3NlcyIgdHlwZT0ieHNkOmJvb2xlYW4iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFdoZW4gc2V0IHRvIHRydWUgdGhlbiBvbmx5IGxpc3RlZCBjbGFzc2VzIGFuZCBqYXJzIHdpbGwgCi0gICAgICAgICAgICAgICAgICAgIGJlIHNjYW5uZWQgZm9yIHBlcnNpc3RlbnQgY2xhc3Nlcywgb3RoZXJ3aXNlIHRoZSBlbmNsb3NpbmcgCi0gICAgICAgICAgICAgICAgICAgIGphciBvciBkaXJlY3Rvcnkgd2lsbCBhbHNvIGJlIHNjYW5uZWQuIE5vdCBhcHBsaWNhYmxlIHRvIAotICAgICAgICAgICAgICAgICAgICBKYXZhIFNFIHBlcnNpc3RlbmNlIHVuaXRzLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBBIGxpc3Qgb2YgdmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgQSBuYW1lLXZhbHVlIHBhaXIuCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICBOYW1lIHVzZWQgaW4gY29kZSB0byByZWZlcmVuY2UgdGhpcyBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InBlcnNpc3RlbmNlOnBlcnNpc3RlbmNlLXVuaXQtdHJhbnNhY3Rpb24tdHlwZSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgIFR5cGUgb2YgdHJhbnNhY3Rpb25zIHVzZWQgYnkgRW50aXR5TWFuYWdlcnMgZnJvbSB0aGlzIAotICAgICAgICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0KLSAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0icGVyc2lzdGVuY2U6dmVyc2lvblR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgZml4ZWQ9IjEuMCIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC10cmFuc2FjdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gVHJhbnNhY3Rpb25UeXBlIHsgSlRBLCBSRVNPVVJDRV9MT0NBTCB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlRBIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRVNPVVJDRV9MT0NBTCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3BlcnNpc3RlbmNlXzJfMC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3BlcnNpc3RlbmNlXzJfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTNhMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9wZXJzaXN0ZW5jZV8yXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIHBlcnNpc3RlbmNlLnhtbCBzY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgeG1sbnM6cGVyc2lzdGVuY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlIgotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgCi0gIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgCi0gIHZlcnNpb249IjIuMCI+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylwZXJzaXN0ZW5jZV8yXzAueHNkICAxLjAgIE9jdG9iZXIgMSAyMDA5Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBTdW4gTWljcm9zeXN0ZW1zLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKLSAgCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgCi0gIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAKLSAgVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgCi0gIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAgCi0gIENvbnRyaWJ1dG9yczoKLSAgICAgIExpbmRhIERlTWljaGllbCAtIEphdmEgUGVyc2lzdGVuY2UgMi4wLCBWZXJzaW9uIDIuMCAoT2N0b2JlciAxLCAyMDA5KQotICAgICAgU3BlY2lmaWNhdGlvbiBhdmFpbGFibGUgZnJvbSBodHRwOi8vamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTMxNwotIAotICAgVGhpcyBjb3B5IG9mIHBlcnNpc3RlbmNlXzJfMC54c2Qgd2FzIG9yaWdpbmFsbHkgY29waWVkIGZyb20gdGhlIEVjbGlwc2UgUnVudGltZSAKLSAgIEVjbGlwc2VMaW5rIFByb2plY3QgYW5kIGlzIGluY2x1ZGVkIGhlcmUgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICA8eHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKLQotICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgcGVyc2lzdGVuY2UgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICBUaGUgZmlsZSBtdXN0IGJlIG5hbWVkICJNRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiIGluIHRoZSAKLSAgICAgcGVyc2lzdGVuY2UgYXJjaGl2ZS4KLQotICAgICBQZXJzaXN0ZW5jZSBjb25maWd1cmF0aW9uIGZpbGVzIG11c3QgaW5kaWNhdGUKLSAgICAgdGhlIHBlcnNpc3RlbmNlIHNjaGVtYSBieSB1c2luZyB0aGUgcGVyc2lzdGVuY2UgbmFtZXNwYWNlOgotCi0gICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlCi0KLSAgICAgYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLSAgICAgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgICAgPHBlcnNpc3RlbmNlIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZQotICAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlXzJfMC54c2QiCi0gICAgICAgIHZlcnNpb249IjIuMCI+Ci0gICAgICAgICAgLi4uCi0gICAgICA8L3BlcnNpc3RlbmNlPgotCi0gICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLQotICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBvZiBhIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotCi0gICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uIG9mIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvdmlkZXIiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXIgY2xhc3MgdGhhdCBzdXBwbGllcyBFbnRpdHlNYW5hZ2VycyBmb3IgdGhpcyAKLSAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianRhLWRhdGEtc291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFRoZSBjb250YWluZXItc3BlY2lmaWMgbmFtZSBvZiB0aGUgSlRBIGRhdGFzb3VyY2UgdG8gdXNlLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub24tanRhLWRhdGEtc291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFRoZSBjb250YWluZXItc3BlY2lmaWMgbmFtZSBvZiBhIG5vbi1KVEEgZGF0YXNvdXJjZSB0byB1c2UuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBpbmctZmlsZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgRmlsZSBjb250YWluaW5nIG1hcHBpbmcgaW5mb3JtYXRpb24uIExvYWRlZCBhcyBhIHJlc291cmNlIAotICAgICAgICAgICAgICAgICAgICBieSB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imphci1maWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBKYXIgZmlsZSB0aGF0IGlzIHRvIGJlIHNjYW5uZWQgZm9yIG1hbmFnZWQgY2xhc3Nlcy4gCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBNYW5hZ2VkIGNsYXNzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZAotICAgICAgICAgICAgICAgICAgICB0byBzY2FuIGZvciBhbm5vdGF0aW9ucy4gIEl0IHNob3VsZCBiZSBhbm5vdGF0ZWQgCi0gICAgICAgICAgICAgICAgICAgIHdpdGggZWl0aGVyIEBFbnRpdHksIEBFbWJlZGRhYmxlIG9yIEBNYXBwZWRTdXBlcmNsYXNzLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXVubGlzdGVkLWNsYXNzZXMiIHR5cGU9InhzZDpib29sZWFuIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFdoZW4gc2V0IHRvIHRydWUgdGhlbiBvbmx5IGxpc3RlZCBjbGFzc2VzIGFuZCBqYXJzIHdpbGwgCi0gICAgICAgICAgICAgICAgICAgIGJlIHNjYW5uZWQgZm9yIHBlcnNpc3RlbnQgY2xhc3Nlcywgb3RoZXJ3aXNlIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgZW5jbG9zaW5nIGphciBvciBkaXJlY3Rvcnkgd2lsbCBhbHNvIGJlIHNjYW5uZWQuIAotICAgICAgICAgICAgICAgICAgICBOb3QgYXBwbGljYWJsZSB0byBKYXZhIFNFIHBlcnNpc3RlbmNlIHVuaXRzLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzaGFyZWQtY2FjaGUtbW9kZSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJwZXJzaXN0ZW5jZTpwZXJzaXN0ZW5jZS11bml0LWNhY2hpbmctdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIHdoZXRoZXIgY2FjaGluZyBpcyBlbmFibGVkIGZvciB0aGUgCi0gICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgaWYgY2FjaGluZyBpcyBzdXBwb3J0ZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHByb3ZpZGVyLiBXaGVuIHNldCB0byBBTEwsIGFsbCBlbnRpdGllcyAKLSAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBjYWNoZWQuIFdoZW4gc2V0IHRvIE5PTkUsIG5vIGVudGl0aWVzIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgYmUgY2FjaGVkLiBXaGVuIHNldCB0byBFTkFCTEVfU0VMRUNUSVZFLCBvbmx5IGVudGl0aWVzCi0gICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBhcyBjYWNoZWFibGUgd2lsbCBiZSBjYWNoZWQuIFdoZW4gc2V0IHRvCi0gICAgICAgICAgICAgICAgICAgIERJU0FCTEVfU0VMRUNUSVZFLCBlbnRpdGllcyBzcGVjaWZpZWQgYXMgbm90IGNhY2hlYWJsZQotICAgICAgICAgICAgICAgICAgICB3aWxsIG5vdCBiZSBjYWNoZWQuIFdoZW4gbm90IHNwZWNpZmllZCBvciB3aGVuIHNldCB0bwotICAgICAgICAgICAgICAgICAgICBVTlNQRUNJRklFRCwgcHJvdmlkZXIgZGVmYXVsdHMgbWF5IGFwcGx5LgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0aW9uLW1vZGUiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icGVyc2lzdGVuY2U6cGVyc2lzdGVuY2UtdW5pdC12YWxpZGF0aW9uLW1vZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBUaGUgdmFsaWRhdGlvbiBtb2RlIHRvIGJlIHVzZWQgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIEEgbGlzdCBvZiBzdGFuZGFyZCBhbmQgdmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMgCi0gICAgICAgICAgICAgICAgICAgIGFuZCBoaW50cy4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICBBIG5hbWUtdmFsdWUgcGFpci4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgIE5hbWUgdXNlZCBpbiBjb2RlIHRvIHJlZmVyZW5jZSB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zYWN0aW9uLXR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icGVyc2lzdGVuY2U6cGVyc2lzdGVuY2UtdW5pdC10cmFuc2FjdGlvbi10eXBlIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgVHlwZSBvZiB0cmFuc2FjdGlvbnMgdXNlZCBieSBFbnRpdHlNYW5hZ2VycyBmcm9tIHRoaXMgCi0gICAgICAgICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJwZXJzaXN0ZW5jZTp2ZXJzaW9uVHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBmaXhlZD0iMi4wIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXRyYW5zYWN0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUge0pUQSwgUkVTT1VSQ0VfTE9DQUx9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlRBIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRVNPVVJDRV9MT0NBTCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtY2FjaGluZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gU2hhcmVkQ2FjaGVNb2RlIHsgQUxMLCBOT05FLCBFTkFCTEVfU0VMRUNUSVZFLCBESVNBQkxFX1NFTEVDVElWRSwgVU5TUEVDSUZJRUR9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFTkFCTEVfU0VMRUNUSVZFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESVNBQkxFX1NFTEVDVElWRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU5TUEVDSUZJRUQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXZhbGlkYXRpb24tbW9kZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gVmFsaWRhdGlvbk1vZGUgeyBBVVRPLCBDQUxMQkFDSywgTk9ORX07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUxMQkFDSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl8yLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzIuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQzOWY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzIuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsNjM5ICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENBICA5NDMwMywgVS5TLkEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotVGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50IGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgYW5kIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyBpdHMgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIE5vIHBhcnQgb2YgdGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50YXRpb24gbWF5IGJlCi1yZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgotb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuICAKLQotVGhpcmQgcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZCAKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4gCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBMb2dvLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhIAotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCBKREJDLCBKREssIEphdmFNYWlsIGFuZCBFbnRlcnByaXNlIEphdmFCZWFucywgCi1hcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jIGluIHRoZSBVLlMuIAotYW5kIG90aGVyIGNvdW50cmllcy4KLQotQWxsIFNQQVJDIHRyYWRlbWFya3MgYXJlIHVzZWQgdW5kZXIgbGljZW5zZSBhbmQgYXJlIHRyYWRlbWFya3MKLW9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTUEFSQyBJbnRlcm5hdGlvbmFsLCBJbmMuCi1pbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLiBQcm9kdWN0cyBiZWFyaW5nIFNQQVJDCi10cmFkZW1hcmtzIGFyZSBiYXNlZCB1cG9uIGFuIGFyY2hpdGVjdHVyZSBkZXZlbG9wZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAKLQotUG9zdFNjcmlwdCBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMsIEluYy4gCi0KLSAKLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvIAotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotCi0gCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWQotSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRSBPUiBOT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUCi1UTyBUSEUgRVhURU5UIFRIQVQgU1VDSCBESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZCi1JTlZBTElELgotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCAKLTkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBICA5NDMwMywgRXRhdHMtVW5pcy4gCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotIAotCi1DZSBwcm9kdWl0IG91IGRvY3VtZW50IGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldCBkaXN0cmlidWUnIGF2ZWMgCi1kZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEgZGlzdHJpYnV0aW9uLAotZXQgbGEgZGUnY29tcGlsYXRpb24uICBBdWN1bmUgcGFydGllIGRlIGNlIHByb2R1aXQgb3UgZGUgc2EgZG9jdW1lbnRhdGlvbgotYXNzb2NpZSdlIG5lIHBldXQgZV50cmUgcmVwcm9kdWl0ZSBzb3VzIGF1Y3VuZSBmb3JtZSwgcGFyIHF1ZWxxdWUgbW95ZW4gCi1xdWUgY2Ugc29pdCwgc2FucyBsJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcyAKLWJhaWxsZXVycyBkZSBsaWNlbmNlLCBzJ2lsIHkgZW4gYS4gIAotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZSAKLXJlbGF0aXZlIGF1eCBwb2xpY2VzIGRlIGNhcmFjdGVgcmVzLCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgCi1ldCBsaWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotIAotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCBsZSBsb2dvIFN1biwgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCwgZXQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsICAKLXNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTdW4gCi1NaWNyb3N5c3RlbXMsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgZGFucyBkJ2F1dHJlcyBwYXlzLgotIAotVG91dGVzIGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQgdXRpbGlzZSdlcyBzb3VzIGxpY2VuY2UgZXQgc29udAotZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTUEFSQwotSW50ZXJuYXRpb25hbCwgSW5jLiBhdXggRXRhdHMtVW5pcyBldCAgZGFucwotZCdhdXRyZXMgcGF5cy4gTGVzIHByb2R1aXRzIHBvcnRhbnQgbGVzIG1hcnF1ZXMgU1BBUkMgc29udAotYmFzZSdzIHN1ciB1bmUgYXJjaGl0ZWN0dXJlIGRlJ3ZlbG9wcGUnZSBwYXIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgCi0KLVBvc3RjcmlwdCBlc3QgdW5lIG1hcnF1ZSBlbnJlZ2lzdHJlJ2UgZCdBZG9iZSBTeXN0ZW1zIEluYy4gCi0gCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0VUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQgRVhDTFVFUywKLURBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUyBOT1RBTU1FTlQKLVRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBIEwnQVBUSVRVREUKLUEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERSBDT05UUkVGQUNPTi4KLS0tPgotCi08IS0tCi1UaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yCi1hIHdlYiBhcHBsaWNhdGlvbgotLS0+Ci0KLTwhRUxFTUVOVCB3ZWItYXBwIChpY29uPywgZGlzcGxheS1uYW1lPywgZGVzY3JpcHRpb24/LCBkaXN0cmlidXRhYmxlPywKLWNvbnRleHQtcGFyYW0qLCBzZXJ2bGV0Kiwgc2VydmxldC1tYXBwaW5nKiwgc2Vzc2lvbi1jb25maWc/LAotbWltZS1tYXBwaW5nKiwgd2VsY29tZS1maWxlLWxpc3Q/LCBlcnJvci1wYWdlKiwgdGFnbGliKiwKLXJlc291cmNlLXJlZiosIHNlY3VyaXR5LWNvbnN0cmFpbnQqLCBsb2dpbi1jb25maWc/LCBzZWN1cml0eS1yb2xlKiwKLWVudi1lbnRyeSosIGVqYi1yZWYqKT4KLQotPCEtLQotVGhlIGljb24gZWxlbWVudCBjb250YWlucyBhIHNtYWxsLWljb24gYW5kIGEgbGFyZ2UtaWNvbiBlbGVtZW50Ci13aGljaCBzcGVjaWZ5IHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBmb3IgYSBzbWFsbCBhbmQKLWxhcmdlIGltYWdlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB3ZWIgYXBwbGljYXRpb24gaW4gYSBHVUkgdG9vbC4gQXQgYQotbWluaW11bSwgdG9vbHMgbXVzdCBhY2NlcHQgR0lGIGFuZCBKUEVHIGZvcm1hdCBpbWFnZXMuCi0tLT4KLQotPCFFTEVNRU5UIGljb24gKHNtYWxsLWljb24/LCBsYXJnZS1pY29uPyk+Ci0KLTwhLS0KLVRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgd2ViCi1hcHBsaWNhdGlvbiBvZiBhIGZpbGUgY29udGFpbmluZyBhIHNtYWxsICgxNngxNiBwaXhlbCkgaWNvbiBpbWFnZS4KLS0tPgotCi08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgd2ViCi1hcHBsaWNhdGlvbiBvZiBhIGZpbGUgY29udGFpbmluZyBhIGxhcmdlICgzMngzMiBwaXhlbCkgaWNvbiBpbWFnZS4KLS0tPgotCi08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZAotdG8gYmUgZGlzcGxheWVkIGJ5IEdVSSB0b29scwotLS0+Ci0KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgZGVzY3JpcHRpdmUgdGV4dCBhYm91dAotdGhlIHBhcmVudCBlbGVtZW50LgotLS0+Ci0KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkaXN0cmlidXRhYmxlIGVsZW1lbnQsIGJ5IGl0cyBwcmVzZW5jZSBpbiBhIHdlYiBhcHBsaWNhdGlvbgotZGVwbG95bWVudCBkZXNjcmlwdG9yLCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHdlYiBhcHBsaWNhdGlvbiBpcwotcHJvZ3JhbW1lZCBhcHByb3ByaWF0ZWx5IHRvIGJlIGRlcGxveWVkIGludG8gYSBkaXN0cmlidXRlZCBzZXJ2bGV0Ci1jb250YWluZXIKLS0tPgotCi08IUVMRU1FTlQgZGlzdHJpYnV0YWJsZSBFTVBUWT4KLQotPCEtLQotVGhlIGNvbnRleHQtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSB3ZWIKLWFwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCi0tLT4KLQotPCFFTEVNRU5UIGNvbnRleHQtcGFyYW0gKHBhcmFtLW5hbWUsIHBhcmFtLXZhbHVlLCBkZXNjcmlwdGlvbj8pPgotCi08IS0tCi1UaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLgotLS0+Ci0KLTwhRUxFTUVOVCBwYXJhbS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgotLS0+Ci0KLTwhRUxFTUVOVCBwYXJhbS12YWx1ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aXZlIGRhdGEgb2YgYQotc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpcwotcHJlc2VudCwgdGhlbiB0aGUgSlNQIHNob3VsZCBiZSBwcmVjb21waWxlZCBhbmQgbG9hZGVkLgotLS0+Ci0KLTwhRUxFTUVOVCBzZXJ2bGV0IChpY29uPywgc2VydmxldC1uYW1lLCBkaXNwbGF5LW5hbWU/LCBkZXNjcmlwdGlvbj8sCi0oc2VydmxldC1jbGFzc3xqc3AtZmlsZSksIGluaXQtcGFyYW0qLCBsb2FkLW9uLXN0YXJ0dXA/LCBzZWN1cml0eS1yb2xlLXJlZiopPgotCi08IS0tCi1UaGUgc2VydmxldC1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZQotc2VydmxldC4KLS0tPgotCi08IUVMRU1FTlQgc2VydmxldC1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlcnZsZXQtY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLW9mIHRoZSBzZXJ2bGV0LgotLS0+Ci0KLTwhRUxFTUVOVCBzZXJ2bGV0LWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGpzcC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGwgcGF0aCB0byBhIEpTUCBmaWxlIHdpdGhpbgotdGhlIHdlYiBhcHBsaWNhdGlvbi4KLS0tPgotCi08IUVMRU1FTlQganNwLWZpbGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzIGFuCi1pbml0aWFsaXphdGlvbiBwYXJhbSBvZiB0aGUgc2VydmxldAotLS0+Ci0KLTwhRUxFTUVOVCBpbml0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4KLQotPCEtLQotVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMgc2VydmxldCBzaG91bGQgYmUKLWxvYWRlZCBvbiB0aGUgc3RhcnR1cCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgb3B0aW9uYWwgY29udGVudHMgb2YKLXRoZXNlIGVsZW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4gd2hpY2gKLXRoZSBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQuIExvd2VyIGludGVnZXJzIGFyZSBsb2FkZWQgYmVmb3JlIGhpZ2hlcgotaW50ZWdlcnMuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgb3IgaWYgdGhlIHZhbHVlIHNwZWNpZmllZCBpcyBub3QgYQotcG9zaXRpdmUgaW50ZWdlciwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgaXQgYXQgYW55IHRpbWUgaW4gdGhlCi1zdGFydHVwIHNlcXVlbmNlLgotLS0+Ci0KLTwhRUxFTUVOVCBsb2FkLW9uLXN0YXJ0dXAgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2VydmxldC1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhIHNlcnZsZXQKLWFuZCBhIHVybCBwYXR0ZXJuCi0tLT4KLQotPCFFTEVNRU5UIHNlcnZsZXQtbWFwcGluZyAoc2VydmxldC1uYW1lLCB1cmwtcGF0dGVybik+Ci0KLTwhLS0KLVRoZSB1cmwtcGF0dGVybiBlbGVtZW50IGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUKLW1hcHBpbmcuIE11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMCBvZiB0aGUgU2VydmxldAotQVBJIFNwZWNpZmljYXRpb24uCi0tLT4KLQotPCFFTEVNRU5UIHVybC1wYXR0ZXJuICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlc3Npb24tY29uZmlnIGVsZW1lbnQgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvcgotdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0tLT4KLQotPCFFTEVNRU5UIHNlc3Npb24tY29uZmlnIChzZXNzaW9uLXRpbWVvdXQ/KT4KLQotPCEtLQotVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQgc2Vzc2lvbiB0aW1lb3V0Ci1pbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZQotc3BlY2lmaWVkIHRpbWVvdXQgbXVzdCBiZSBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KLS0tPgotCi08IUVMRU1FTlQgc2Vzc2lvbi10aW1lb3V0ICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG1pbWUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uCi1hbmQgYSBtaW1lIHR5cGUuCi0tLT4KLQotPCFFTEVNRU5UIG1pbWUtbWFwcGluZyAoZXh0ZW5zaW9uLCBtaW1lLXR5cGUpPgotCi08IS0tCi1UaGUgZXh0ZW5zaW9uIGVsZW1lbnQgY29udGFpbnMgYSBzdHJpbmcgZGVzY3JpYmluZyBhbgotZXh0ZW5zaW9uLiBleGFtcGxlOiAidHh0IgotLS0+Ci0KLTwhRUxFTUVOVCBleHRlbnNpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbWltZS10eXBlIGVsZW1lbnQgY29udGFpbnMgYSBkZWZpbmVkIG1pbWUgdHlwZS4gZXhhbXBsZToKLSJ0ZXh0L3BsYWluIgotLS0+Ci0KLTwhRUxFTUVOVCBtaW1lLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUgZmlsZXMKLWVsZW1lbnRzLgotLS0+Ci0KLTwhRUxFTUVOVCB3ZWxjb21lLWZpbGUtbGlzdCAod2VsY29tZS1maWxlKyk+Ci0KLTwhLS0KLVRoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlIGFzIGEgZGVmYXVsdAotd2VsY29tZSBmaWxlLCBzdWNoIGFzIGluZGV4Lmh0bWwKLS0tPgotCi08IUVMRU1FTlQgd2VsY29tZS1maWxlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHRhZ2xpYiBlbGVtZW50IGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBKU1AgdGFnIGxpYnJhcnkuCi0tLT4KLQotPCFFTEVNRU5UIHRhZ2xpYiAodGFnbGliLXVyaSwgdGFnbGliLWxvY2F0aW9uKT4KLQotPCEtLQotVGhlIHRhZ2xpYi11cmkgZWxlbWVudCBkZXNjcmliZXMgYSBVUkksIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbgotb2YgdGhlIHdlYi54bWwgZG9jdW1lbnQsIGlkZW50aWZ5aW5nIGEgVGFnIExpYnJhcnkgdXNlZCBpbiB0aGUgV2ViCi1BcHBsaWNhdGlvbi4KLS0tPgotCi08IUVMRU1FTlQgdGFnbGliLXVyaSAoI1BDREFUQSk+Ci0KLTwhLS0KLXRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gKGFzIGEgcmVzb3VyY2UKLXJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZwotTGliYXJ5IERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4KLS0tPgotCi08IUVMRU1FTlQgdGFnbGliLWxvY2F0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVycm9yLXBhZ2UgZWxlbWVudCBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlCi1vciBleGNlcHRpb24gdHlwZSB0byB0aGUgcGF0aCBvZiBhIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24KLS0tPgotCi08IUVMRU1FTlQgZXJyb3ItcGFnZSAoKGVycm9yLWNvZGUgfCBleGNlcHRpb24tdHlwZSksIGxvY2F0aW9uKT4KLQotPCEtLQotVGhlIGVycm9yLWNvZGUgY29udGFpbnMgYW4gSFRUUCBlcnJvciBjb2RlLCBleDogNDA0Ci0tLT4KLQotPCFFTEVNRU5UIGVycm9yLWNvZGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZXhjZXB0aW9uIHR5cGUgY29udGFpbnMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhCi1KYXZhIGV4Y2VwdGlvbiB0eXBlLgotLS0+Ci0KLTwhRUxFTUVOVCBleGNlcHRpb24tdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlCi13ZWIgYXBwbGljYXRpb24KLS0tPgotCi08IUVMRU1FTlQgbG9jYXRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIFdlYgotQXBwbGljYXRpb24ncyByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuCi0tLT4KLQotPCFFTEVNRU5UIHJlc291cmNlLXJlZiAoZGVzY3JpcHRpb24/LCByZXMtcmVmLW5hbWUsIHJlcy10eXBlLCByZXMtYXV0aCk+Ci0KLTwhLS0KLVRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlCi1mYWN0b3J5IHJlZmVyZW5jZSBuYW1lLgotLS0+Ci0KLTwhRUxFTUVOVCByZXMtcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIChKYXZhIGNsYXNzKSB0eXBlIG9mIHRoZSBkYXRhCi1zb3VyY2UuCi0tLT4KLQotPCFFTEVNRU5UIHJlcy10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1hdXRoIGVsZW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudAotY29kZSBwZXJmb3JtcyByZXNvdXJjZSBzaWdub24gcHJvZ3JhbW1hdGljYWxseSBvciB3aGV0aGVyIHRoZQotY29udGFpbmVyIHNpZ25zIG9udG8gdGhlIHJlc291cmNlIGJhc2VkIG9uIHRoZSBwcmluY2lwbGUgbWFwcGluZwotaW5mb3JtYXRpb24gc3VwcGxpZWQgYnkgdGhlIGRlcGxveWVyLiBNdXN0IGJlIENPTlRBSU5FUiBvciBTRVJWTEVUCi0tLT4KLQotPCFFTEVNRU5UIHJlcy1hdXRoICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBzZWN1cml0eQotY29uc3RyYWludHMgd2l0aCBvbmUgb3IgbW9yZSB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbnMKLS0tPgotCi08IUVMRU1FTlQgc2VjdXJpdHktY29uc3RyYWludCAod2ViLXJlc291cmNlLWNvbGxlY3Rpb24rLAotYXV0aC1jb25zdHJhaW50PywgdXNlci1kYXRhLWNvbnN0cmFpbnQ/KT4KLQotPCEtLQotVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBpZGVudGlmeSBhIHN1YnNldAotb2YgdGhlIHJlc291cmNlcyBhbmQgSFRUUCBtZXRob2RzIG9uIHRob3NlIHJlc291cmNlcyB3aXRoaW4gYSB3ZWIKLWFwcGxpY2F0aW9uIHRvIHdoaWNoIGEgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzLiBJZiBubyBIVFRQIG1ldGhvZHMKLWFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcyB0byBhbGwgSFRUUAotbWV0aG9kcy4KLS0tPgotCi08IUVMRU1FTlQgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gKHdlYi1yZXNvdXJjZS1uYW1lLCBkZXNjcmlwdGlvbj8sCi11cmwtcGF0dGVybiosIGh0dHAtbWV0aG9kKik+Ci0KLTwhLS0KLVRoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYiByZXNvdXJjZQotY29sbGVjdGlvbgotLS0+Ci0KLTwhRUxFTUVOVCB3ZWItcmVzb3VyY2UtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBodHRwLW1ldGhvZCBjb250YWlucyBhbiBIVFRQIG1ldGhvZCAoR0VUIHwgUE9TVCB8Li4uKQotLS0+Ci0KLTwhRUxFTUVOVCBodHRwLW1ldGhvZCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB1c2VyLWRhdGEtY29uc3RyYWludCBlbGVtZW50IGlzIHVzZWQgdG8gaW5kaWNhdGUgaG93IGRhdGEKLWNvbW11bmljYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIGNvbnRhaW5lciBzaG91bGQgYmUgcHJvdGVjdGVkCi0tLT4KLQotPCFFTEVNRU5UIHVzZXItZGF0YS1jb25zdHJhaW50IChkZXNjcmlwdGlvbj8sIHRyYW5zcG9ydC1ndWFyYW50ZWUpPgotCi08IS0tCi1UaGUgdHJhbnNwb3J0LWd1YXJhbnRlZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uCi1iZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHNob3VsZCBiZSBOT05FLCBJTlRFR1JBTCwgb3IKLUNPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFueQotdHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24KLXJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgc2VudCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlciBiZSBzZW50IGluCi1zdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUgY2hhbmdlZCBpbiB0cmFuc2l0LiBDT05GSURFTlRJQUwgbWVhbnMKLXRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYQotZmFzaGlvbiB0aGF0IHByZXZlbnRzIG90aGVyIGVudGl0aWVzIGZyb20gb2JzZXJ2aW5nIHRoZSBjb250ZW50cyBvZgotdGhlIHRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZSBJTlRFR1JBTCBvcgotQ09ORklERU5USUFMIGZsYWcgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgU1NMIGlzIHJlcXVpcmVkLgotLS0+Ci0KLTwhRUxFTUVOVCB0cmFuc3BvcnQtZ3VhcmFudGVlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGF1dGgtY29uc3RyYWludCBlbGVtZW50IGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0IHNob3VsZAotYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlIGNvbGxlY3Rpb24uIFRoZSByb2xlIHVzZWQgaGVyZQotbXVzdCBhcHBlYXIgaW4gYSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50LgotLS0+Ci0KLTwhRUxFTUVOVCBhdXRoLWNvbnN0cmFpbnQgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKik+Ci0KLTwhLS0KLVRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0tLT4KLQotPCFFTEVNRU5UIHJvbGUtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsb2dpbi1jb25maWcgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLW1ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvcgotdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbgotbWVjaGFuaXNtLgotLS0+Ci0KLTwhRUxFTUVOVCBsb2dpbi1jb25maWcgKGF1dGgtbWV0aG9kPywgcmVhbG0tbmFtZT8sIGZvcm0tbG9naW4tY29uZmlnPyk+Ci0KLTwhLS0KLVRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvIHVzZSBpbiBIVFRQCi1CYXNpYyBhdXRob3JpemF0aW9uCi0tLT4KLQotPCFFTEVNRU5UIHJlYWxtLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZm9ybS1sb2dpbi1jb25maWcgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvciBwYWdlcwotdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkIGF1dGhlbnRpY2F0aW9uCi1pcyBub3QgdXNlZCwgdGhlc2UgZWxlbWVudHMgYXJlIGlnbm9yZWQuCi0tLT4KLQotPCFFTEVNRU5UIGZvcm0tbG9naW4tY29uZmlnIChmb3JtLWxvZ2luLXBhZ2UsIGZvcm0tZXJyb3ItcGFnZSk+Ci0KLTwhLS0KLVRoZSBmb3JtLWxvZ2luLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcAotd2hlcmUgdGhlIHBhZ2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9naW4gY2FuIGJlIGZvdW5kCi0tLT4KLQotPCFFTEVNRU5UIGZvcm0tbG9naW4tcGFnZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcAotd2hlcmUgdGhlIGVycm9yIHBhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQgd2hlbiBsb2dpbiBpcyBub3Qgc3VjY2Vzc2Z1bAotY2FuIGJlIGZvdW5kCi0tLT4KLQotPCFFTEVNRU5UIGZvcm0tZXJyb3ItcGFnZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBhdXRoLW1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgotbWVjaGFuaXNtIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uLiBBcyBhIHByZXJlcXVpc2l0ZSB0byBnYWluaW5nIGFjY2VzcwotdG8gYW55IHdlYiByZXNvdXJjZXMgd2hpY2ggYXJlIHByb3RlY3RlZCBieSBhbiBhdXRob3JpemF0aW9uCi1jb25zdHJhaW50LCBhIHVzZXIgbXVzdCBoYXZlIGF1dGhlbnRpY2F0ZWQgdXNpbmcgdGhlIGNvbmZpZ3VyZWQKLW1lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGZvciB0aGlzIGVsZW1lbnQgYXJlICJCQVNJQyIsICJESUdFU1QiLAotIkZPUk0iLCBvciAiQ0xJRU5ULUNFUlQiLgotLS0+Ci0KLTwhRUxFTUVOVCBhdXRoLW1ldGhvZCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgc2VjdXJpdHkKLXJvbGUgd2hpY2ggaXMgdXNlZCBpbiB0aGUgc2VjdXJpdHktY29uc3RyYWludHMgcGxhY2VkIG9uIHRoZSB3ZWIKLWFwcGxpY2F0aW9uLgotLS0+Ci0KLTwhRUxFTUVOVCBzZWN1cml0eS1yb2xlIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSk+Ci0KLTwhLS0KLVRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHJvbGUuIFRoaXMgZWxlbWVudAotbXVzdCBjb250YWluIGEgbm9uLWVtcHR5IHN0cmluZy4KLS0tPgotCi08IUVMRU1FTlQgc2VjdXJpdHktcm9sZS1yZWYgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lLCByb2xlLWxpbmspPgotCi08IS0tCi1UaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgdXNlZCB0byBsaW5rIGEgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UKLXRvIGEgZGVmaW5lZCBzZWN1cml0eSByb2xlLiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluIHRoZQotbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUKLWVsZW1lbnRzLgotLS0+Ci0KLTwhRUxFTUVOVCByb2xlLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuCi1hcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGVudHJ5LiBUaGlzIGVsZW1lbnQgaXMgcmVxdWlyZWQgdG8gYmUKLWhvbm9yZWQgb24gaW4gSjJFRSBjb21wbGlhbnQgc2VydmxldCBjb250YWluZXJzLgotLS0+Ci0KLTwhRUxFTUVOVCBlbnYtZW50cnkgKGRlc2NyaXB0aW9uPywgZW52LWVudHJ5LW5hbWUsIGVudi1lbnRyeS12YWx1ZT8sCi1lbnYtZW50cnktdHlwZSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBhcHBsaWNhdGlvbidzCi1lbnZpcm9ubWVudCBlbnRyeQotLS0+Ci0KLTwhRUxFTUVOVCBlbnYtZW50cnktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYW4KLWFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgZW50cnkKLS0tPgotCi08IUVMRU1FTlQgZW52LWVudHJ5LXZhbHVlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIHR5cGUKLW9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbgotY29kZS4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZToKLWphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciwKLWphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5GbG9hdC4KLS0tPgotCi08IUVMRU1FTlQgZW52LWVudHJ5LXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZiBlbGVtZW50IGlzIHVzZWQgdG8gZGVjbGFyZSBhIHJlZmVyZW5jZSB0byBhbgotZW50ZXJwcmlzZSBiZWFuLiAKLS0tPgotCi08IUVMRU1FTlQgZWpiLXJlZiAoZGVzY3JpcHRpb24/LCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwgaG9tZSwgcmVtb3RlLAotZWpiLWxpbms/KT4KLQotPCEtLQotVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotcmVmZXJlbmNlLiBUaGlzIGlzIHRoZSBKTkRJIG5hbWUgdGhhdCB0aGUgc2VydmxldCBjb2RlIHVzZXMgdG8gZ2V0IGEKLXJlZmVyZW5jZSB0byB0aGUgZW50ZXJwcmlzZSBiZWFuLgotLS0+Ci0KLTwhRUxFTUVOVCBlamItcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIGphdmEgY2xhc3MgdHlwZSBvZgotdGhlIHJlZmVyZW5jZWQgRUpCLgotLS0+Ci0KLTwhRUxFTUVOVCBlamItcmVmLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi1FSkIncyBob21lIGludGVyZmFjZQotLS0+Ci0KLTwhRUxFTUVOVCBob21lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi1FSkIncyByZW1vdGUgaW50ZXJmYWNlCi0tLT4KLQotPCFFTEVNRU5UIHJlbW90ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGVqYi1yZWYgZWxlbWVudCB0byBzcGVjaWZ5Ci10aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGFuIEVKQiBpbiBhbiBlbmNvbXBhc3NpbmcgSmF2YTIKLUVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgYXBwbGljYXRpb24gcGFja2FnZS4gVGhlIHZhbHVlIG9mIHRoZQotZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbmQgRUpCIGluIHRoZSBKMkVFCi1hcHBsaWNhdGlvbiBwYWNrYWdlLgotLS0+Ci0KLTwhRUxFTUVOVCBlamItbGluayAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdG8gZWFzaWx5IG1ha2UgdG9vbC1zcGVjaWZpYwotcmVmZXJlbmNlcyB0byB0aGUgZWxlbWVudHMgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhpcyBhbGxvd3MKLXRvb2xzIHRoYXQgcHJvZHVjZSBhZGRpdGlvbmFsIGRlcGxveW1lbnQgaW5mb3JtYXRpb24gKGkuZSBpbmZvcm1hdGlvbgotYmV5b25kIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaW5mb3JtYXRpb24pIHRvIHN0b3JlIHRoZQotbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGluIGEgc2VwYXJhdGUgZmlsZSwgYW5kIGVhc2lseSByZWZlciBmcm9tCi10aGVzZSB0b29scy1zcGVjaWZpYyBmaWxlcyB0byB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHN0YW5kYXJkIHdlYi1hcHAKLWRlcGxveW1lbnQgZGVzY3JpcHRvci4KLS0tPgotCi08IUFUVExJU1Qgd2ViLWFwcCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNtYWxsLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzdHJpYnV0YWJsZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb250ZXh0LXBhcmFtIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHBhcmFtLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcGFyYW0tdmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VydmxldCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXJ2bGV0LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VydmxldC1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBqc3AtZmlsZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpbml0LXBhcmFtIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvYWQtb24tc3RhcnR1cCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXJ2bGV0LW1hcHBpbmcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdXJsLXBhdHRlcm4gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2Vzc2lvbi1jb25maWcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2Vzc2lvbi10aW1lb3V0IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1pbWUtbWFwcGluZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBleHRlbnNpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWltZS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHdlbGNvbWUtZmlsZS1saXN0IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHdlbGNvbWUtZmlsZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0YWdsaWIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnbGliLXVyaSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0YWdsaWItbG9jYXRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZXJyb3ItcGFnZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlcnJvci1jb2RlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGV4Y2VwdGlvbi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvY2F0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLWF1dGggaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWItcmVzb3VyY2UtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBodHRwLW1ldGhvZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB1c2VyLWRhdGEtY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0cmFuc3BvcnQtZ3VhcmFudGVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF1dGgtY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9naW4tY29uZmlnIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlYWxtLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZm9ybS1sb2dpbi1jb25maWcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZm9ybS1sb2dpbi1wYWdlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZvcm0tZXJyb3ItcGFnZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdXRoLW1ldGhvZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1yb2xlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJvbGUtbGluayBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LXZhbHVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBob21lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbW90ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbGluayBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzMuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfMy5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlM2FiMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfMy5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYzICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAoYykgMjAwMCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLAotOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyByZWxhdGluZyB0bwotdGVjaG5vbG9neSBlbWJvZGllZCBpbiB0aGUgcHJvZHVjdCB0aGF0IGlzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LgotSW4gcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cyBsaXN0ZWQgYXQKLWh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZSBhZGRpdGlvbmFsIHBhdGVudHMgb3IKLXBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUgVS5TLiBhbmQgaW4gb3RoZXIgY291bnRyaWVzLgotCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgcHJvZHVjdCB0byB3aGljaCBpdCBwZXJ0YWlucyBhcmUgZGlzdHJpYnV0ZWQKLXVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBUaGlzIGRvY3VtZW50IG1heSBiZSByZXByb2R1Y2VkIGFuZCBkaXN0cmlidXRlZCBidXQgbWF5Ci1ub3QgYmUgY2hhbmdlZCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cwotbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCAgU3VuIE1pY3Jvc3lzdGVtcywgIHRoZSBTdW4gbG9nbywgIEphdmEsICBKYXZhU2VydmVyIFBhZ2VzLCAgSmF2YQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCAgSkRCQywgIEpESywgIEphdmFNYWlsIGFuZCAgYW5kCi1FbnRlcnByaXNlIEphdmFCZWFucyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi1NaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzIFN1YmplY3QgdG8KLVN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLURPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQUxMIEVYUFJFU1MgT1IgSU1QTElFRAotQ09ORElUSU9OUywgUkVQUkVTRU5UQVRJT05TIEFORCBXQVJSQU5USUVTLCBJTkNMVURJTkcgQU5ZIElNUExJRUQKLVdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SCi1OT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUIFRPIFRIRSBFWFRFTlQgVEhBVCBTVUNICi1ESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZIElOVkFMSUQuCi0KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi1Db3B5cmlnaHQgKGMpIDIwMDAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwKLTkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBFJ3RhdHMtVW5pcy4KLVRvdXMgZHJvaXRzIHJlJ3NlcnZlJ3MuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gYSBsZXMgZHJvaXRzIGRlIHByb3ByaWUndGUnIGludGVsbGVjdHVlbHMKLXJlbGF0YW50cyBhYCBsYSB0ZWNobm9sb2dpZSBpbmNvcnBvcmUnZSBkYW5zIGxlIHByb2R1aXQgcXVpIGVzdCBkZSdjcml0Ci1kYW5zIGNlIGRvY3VtZW50LiBFbiBwYXJ0aWN1bGllciwgZXQgc2FucyBsYSBsaW1pdGF0aW9uLCBjZXMgZHJvaXRzIGRlCi1wcm9wcmllJ3RlJyBpbnRlbGxlY3R1ZWxzIHBldXZlbnQgaW5jbHVyZSB1biBvdSBwbHVzIGRlcyBicmV2ZXRzCi1hbWUncmljYWlucyBlJ251bWUncmUncyBhYCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBldCB1biBvdSBsZXMKLWJyZXZldHMgcGx1cyBzdXBwbGUnbWVudGFpcmVzIG91IGxlcyBhcHBsaWNhdGlvbnMgZGUgYnJldmV0IGVuIGF0dGVudGUKLWRhbnMgbGVzIEUndGF0cy1VbmlzIGV0IGRhbnMgbGVzIGF1dHJlcyBwYXlzLgotCi1DZSBwcm9kdWl0IG91IGRvY3VtZW50IGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldCBkaXN0cmlidWUnCi1hdmVjIGRlcyBsaWNlbmNlcyBxdWkgZW4gcmVzdHJlaWduZW50IGwndXRpbGlzYXRpb24sIGxhIGNvcGllLCBsYQotZGlzdHJpYnV0aW9uLCBldCBsYSBkZSdjb21waWxhdGlvbi4gIENlIGRvY3VtZW50aW9uIGFzc29jaWUgbiBwZXV0Ci1lXnRyZSByZXByb2R1aXRlIGV0IGRpc3RyaWJ1ZXIsIHBhciBxdWVscXVlIG1veWVuIHF1ZSBjZSBzb2l0LCBzYW5zCi1sJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcyBiYWlsbGV1cnMgZGUKLWxpY2VuY2UsIGxlIGNhcyBlJ2NoZSdhbnQuCi0KLUxlIGxvZ2ljaWVsIGRlJ3RlbnUgcGFyIGRlcyB0aWVycywgZXQgcXVpIGNvbXByZW5kIGxhIHRlY2hub2xvZ2llCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0Ci1saWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotCi1TdW4sICBTdW4gTWljcm9zeXN0ZW1zLCAgbGUgbG9nbyBTdW4sICBKYXZhLCAgSmF2YVNlcnZlciBQYWdlcywgIEphdmEKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgIEpEQkMsICBKREssICBKYXZhTWFpbCBldCAgYW5kCi1FbnRlcnByaXNlIEphdmFCZWFucyBzb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzCi1kZSdwb3NlJ2VzIGRlIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYXV4IEUndGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMKLXBheXMuCi0KLUxBIERPQ1VNRU5UQVRJT04gRVNUIEZPVVJOSUUgIkVOIEwnRSdUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQKLUVYQ0xVRVMsIERBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUwotTk9UQU1NRU5UIFRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBCi1MJ0FQVElUVURFIEEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERQotQ09OVFJFRkFDLE9OLgotLS0+Ci0KLTwhLS0KLVRoaXMgaXMgdGhlIFhNTCBEVEQgZm9yIHRoZSBTZXJ2bGV0IDIuMyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi1BbGwgU2VydmxldCAyLjMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluY2x1ZGUgYSBET0NUWVBFCi1vZiB0aGUgZm9sbG93aW5nIGZvcm06Ci0KLSAgPCFET0NUWVBFIHdlYi1hcHAgUFVCTElDCi0JIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIKLQkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj4KLQotLS0+Ci0KLTwhLS0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1lbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gUENEQVRBLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCi0gIGluIHRoZSBkYXRhIG1heSBiZSBpZ25vcmVkLgotCi0tIEluIGVsZW1lbnRzIHdob3NlIHZhbHVlIGlzIGFuICJlbnVtZXJhdGVkIHR5cGUiLCB0aGUgdmFsdWUgaXMKLSAgY2FzZSBzZW5zaXRpdmUuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUgc2FtZQotICBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3Qgc3RhcnRpbmcgd2l0aCAiLyIpCi0gIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4KLSAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5Ci0gIG5hbWVzIGluIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgc2VydmxldCBBUEkuCi0tLT4KLQotCi08IS0tCi1UaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yCi1hIHdlYiBhcHBsaWNhdGlvbi4KLS0tPgotPCFFTEVNRU5UIHdlYi1hcHAgKGljb24/LCBkaXNwbGF5LW5hbWU/LCBkZXNjcmlwdGlvbj8sIGRpc3RyaWJ1dGFibGU/LAotY29udGV4dC1wYXJhbSosIGZpbHRlciosIGZpbHRlci1tYXBwaW5nKiwgbGlzdGVuZXIqLCBzZXJ2bGV0KiwKLXNlcnZsZXQtbWFwcGluZyosIHNlc3Npb24tY29uZmlnPywgbWltZS1tYXBwaW5nKiwgd2VsY29tZS1maWxlLWxpc3Q/LAotZXJyb3ItcGFnZSosIHRhZ2xpYiosIHJlc291cmNlLWVudi1yZWYqLCByZXNvdXJjZS1yZWYqLCBzZWN1cml0eS1jb25zdHJhaW50KiwKLWxvZ2luLWNvbmZpZz8sIHNlY3VyaXR5LXJvbGUqLCBlbnYtZW50cnkqLCBlamItcmVmKiwgIGVqYi1sb2NhbC1yZWYqKT4KLQotPCEtLQotVGhlIGF1dGgtY29uc3RyYWludCBlbGVtZW50IGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0IHNob3VsZAotYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlIGNvbGxlY3Rpb24uIFRoZSByb2xlLW5hbWUKLXVzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kIHRvIHRoZSByb2xlLW5hbWUgb2Ygb25lIG9mIHRoZQotc2VjdXJpdHktcm9sZSBlbGVtZW50cyBkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwgb3IgYmUKLXRoZSBzcGVjaWFsbHkgcmVzZXJ2ZWQgcm9sZS1uYW1lICIqIiB0aGF0IGlzIGEgY29tcGFjdCBzeW50YXggZm9yCi1pbmRpY2F0aW5nIGFsbCByb2xlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJZiBib3RoICIqIiBhbmQKLXJvbGVuYW1lcyBhcHBlYXIsIHRoZSBjb250YWluZXIgaW50ZXJwcmV0cyB0aGlzIGFzIGFsbCByb2xlcy4KLUlmIG5vIHJvbGVzIGFyZSBkZWZpbmVkLCBubyB1c2VyIGlzIGFsbG93ZWQgYWNjZXNzIHRvIHRoZSBwb3J0aW9uIG9mCi10aGUgd2ViIGFwcGxpY2F0aW9uIGRlc2NyaWJlZCBieSB0aGUgY29udGFpbmluZyBzZWN1cml0eS1jb25zdHJhaW50LgotVGhlIGNvbnRhaW5lciBtYXRjaGVzIHJvbGUgbmFtZXMgY2FzZSBzZW5zaXRpdmVseSB3aGVuIGRldGVybWluaW5nCi1hY2Nlc3MuCi0KLQotVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAotLS0+Ci08IUVMRU1FTlQgYXV0aC1jb25zdHJhaW50IChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSopPgotCi08IS0tCi1UaGUgYXV0aC1tZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLW1lY2hhbmlzbSBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbi4gQXMgYSBwcmVyZXF1aXNpdGUgdG8gZ2FpbmluZyBhY2Nlc3MgdG8gYW55IHdlYiByZXNvdXJjZXMgd2hpY2ggYXJlIHByb3RlY3RlZCBieSBhbiBhdXRob3JpemF0aW9uCi1jb25zdHJhaW50LCBhIHVzZXIgbXVzdCBoYXZlIGF1dGhlbnRpY2F0ZWQgdXNpbmcgdGhlIGNvbmZpZ3VyZWQKLW1lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGZvciB0aGlzIGVsZW1lbnQgYXJlICJCQVNJQyIsICJESUdFU1QiLAotIkZPUk0iLCBvciAiQ0xJRU5ULUNFUlQiLgotCi1Vc2VkIGluOiBsb2dpbi1jb25maWcKLS0tPgotPCFFTEVNRU5UIGF1dGgtbWV0aG9kICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGNvbnRleHQtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSB3ZWIKLWFwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIGNvbnRleHQtcGFyYW0gKHBhcmFtLW5hbWUsIHBhcmFtLXZhbHVlLCBkZXNjcmlwdGlvbj8pPgotCi08IS0tCi1UaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQKLWVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdAotdGhlIHdlYiBhcHBsaWNhdGlvbiB3YXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotdGhlIHdlYiBhcHBsaWNhdGlvbiB3YXIgZmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMKLXVzZWQgYnkgdGhlIHdlYiBhcHBsaWNhdGlvbiB3YXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uCi13aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotCi1Vc2VkIGluOiBhdXRoLWNvbnN0cmFpbnQsIGNvbnRleHQtcGFyYW0sIGVqYi1sb2NhbC1yZWYsIGVqYi1yZWYsCi1lbnYtZW50cnksIGZpbHRlciwgaW5pdC1wYXJhbSwgcmVzb3VyY2UtZW52LXJlZiwgcmVzb3VyY2UtcmVmLCBydW4tYXMsCi1zZWN1cml0eS1yb2xlLCBzZWN1cml0eS1yb2xlLXJlZiwgc2VydmxldCwgdXNlci1kYXRhLWNvbnN0cmFpbnQsCi13ZWItYXBwLCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbgotLS0+Ci08IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLWRpc3BsYXllZCBieSB0b29scy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgotCi1Vc2VkIGluOiBmaWx0ZXIsIHNlY3VyaXR5LWNvbnN0cmFpbnQsIHNlcnZsZXQsIHdlYi1hcHAKLQotRXhhbXBsZToKLQotPGRpc3BsYXktbmFtZT5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkaXN0cmlidXRhYmxlIGVsZW1lbnQsIGJ5IGl0cyBwcmVzZW5jZSBpbiBhIHdlYiBhcHBsaWNhdGlvbgotZGVwbG95bWVudCBkZXNjcmlwdG9yLCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHdlYiBhcHBsaWNhdGlvbiBpcwotcHJvZ3JhbW1lZCBhcHByb3ByaWF0ZWx5IHRvIGJlIGRlcGxveWVkIGludG8gYSBkaXN0cmlidXRlZCBzZXJ2bGV0Ci1jb250YWluZXIKLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgZGlzdHJpYnV0YWJsZSBFTVBUWT4KLQotPCEtLQotVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgZWpiLXJlZiBvciBlamItbG9jYWwtcmVmCi1lbGVtZW50cyB0byBzcGVjaWZ5IHRoYXQgYW4gRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gYW4KLWVudGVycHJpc2UgYmVhbi4KLQotVGhlIG5hbWUgaW4gdGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgY29tcG9zZWQgb2YgYQotcGF0aCBuYW1lIHNwZWNpZnlpbmcgdGhlIGVqYi1qYXIgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCi1iZWFuIHdpdGggdGhlIGVqYi1uYW1lIG9mIHRoZSB0YXJnZXQgYmVhbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20KLXRoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgd2FyIGZpbGUKLWNvbnRhaW5pbmcgdGhlIHdlYiBhcHBsaWNhdGlvbiB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4uCi1UaGlzIGFsbG93cyBtdWx0aXBsZSBlbnRlcnByaXNlIGJlYW5zIHdpdGggdGhlIHNhbWUgZWpiLW5hbWUgdG8gYmUKLXVuaXF1ZWx5IGlkZW50aWZpZWQuCi0KLVVzZWQgaW46IGVqYi1sb2NhbC1yZWYsIGVqYi1yZWYKLQotRXhhbXBsZXM6Ci0KLQk8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPgotCi0JPGVqYi1saW5rPi4uL3Byb2R1Y3RzL3Byb2R1Y3QuamFyI1Byb2R1Y3RFSkI8L2VqYi1saW5rPgotCi0tLT4KLTwhRUxFTUVOVCBlamItbGluayAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItbG9jYWwtcmVmIGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvCi1hbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQktIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbgotCSAgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4KLQktIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCS0gdGhlIGV4cGVjdGVkIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQKLQkgIGVudGVycHJpc2UgYmVhbgotCS0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZAotCSAgZW50ZXJwcmlzZSBiZWFuCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIGVqYi1sb2NhbC1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsCi0JCWxvY2FsLWhvbWUsIGxvY2FsLCBlamItbGluaz8pPgotCi08IS0tCi1UaGUgZWpiLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bwotYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCS0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mCi0JICB0aGUgd2ViIGFwcGxpY2F0aW9uIHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQktIHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZAotCSAgZW50ZXJwcmlzZSBiZWFuCi0JLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZSByZWZlcmVuY2VkCi0JICBlbnRlcnByaXNlIGJlYW4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZiAoZGVzY3JpcHRpb24/LCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwKLQkJaG9tZSwgcmVtb3RlLCBlamItbGluaz8pPgotCi08IS0tCi1UaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCIHJlZmVyZW5jZS4gVGhlCi1FSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMKLXJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLUl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZWpiLXJlZgotCi1FeGFtcGxlOgotCi08ZWpiLXJlZi1uYW1lPmVqYi9QYXlyb2xsPC9lamItcmVmLW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlamItcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlCi1yZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLQotVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQk8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotCTxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmLCBlamItcmVmCi0tLT4KLTwhRUxFTUVOVCBlamItcmVmLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3MKLWVudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbAotdmFsdWUuICBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIG9uZSBtdXN0IGJlIHN1cHBsaWVkCi1kdXJpbmcgZGVwbG95bWVudC4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeSAoZGVzY3JpcHRpb24/LCBlbnYtZW50cnktbmFtZSwgZW52LWVudHJ5LXZhbHVlPywKLWVudi1lbnRyeS10eXBlKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSB3ZWIgYXBwbGljYXRpb25zJ3MKLWVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi1qYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLUV4YW1wbGU6Ci0KLTxlbnYtZW50cnktbmFtZT5taW5BbW91bnQ8L2Vudi1lbnRyeS1uYW1lPgotCi1Vc2VkIGluOiBlbnYtZW50cnkKLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YKLXRoZSBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSB3ZWIgYXBwbGljYXRpb24ncwotY29kZS4KLQotVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZToKLQotCWphdmEubGFuZy5Cb29sZWFuCi0JamF2YS5sYW5nLkJ5dGUKLQlqYXZhLmxhbmcuQ2hhcmFjdGVyCi0JamF2YS5sYW5nLlN0cmluZwotCWphdmEubGFuZy5TaG9ydAotCWphdmEubGFuZy5JbnRlZ2VyCi0JamF2YS5sYW5nLkxvbmcKLQlqYXZhLmxhbmcuRmxvYXQKLQlqYXZhLmxhbmcuRG91YmxlCi0KLVVzZWQgaW46IGVudi1lbnRyeQotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3MKLWVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUKLWNvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEgc2luZ2xlIFN0cmluZwotcGFyYW1ldGVyLCBvciBmb3IgamF2YS5sYW5nLkNoYXJhY3RlciwgYSBzaW5nbGUgY2hhcmFjdGVyLgotCi1FeGFtcGxlOgotCi08ZW52LWVudHJ5LXZhbHVlPjEwMC4wMDwvZW52LWVudHJ5LXZhbHVlPgotCi1Vc2VkIGluOiBlbnYtZW50cnkKLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS12YWx1ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNAotCi1Vc2VkIGluOiBlcnJvci1wYWdlCi0tLT4KLTwhRUxFTUVOVCBlcnJvci1jb2RlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVycm9yLXBhZ2UgZWxlbWVudCBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlCi1vciBleGNlcHRpb24gdHlwZSB0byB0aGUgcGF0aCBvZiBhIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgZXJyb3ItcGFnZSAoKGVycm9yLWNvZGUgfCBleGNlcHRpb24tdHlwZSksIGxvY2F0aW9uKT4KLQotPCEtLQotVGhlIGV4Y2VwdGlvbiB0eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYQotSmF2YSBleGNlcHRpb24gdHlwZS4KLQotVXNlZCBpbjogZXJyb3ItcGFnZQotLS0+Ci08IUVMRU1FTlQgZXhjZXB0aW9uLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZXh0ZW5zaW9uIGVsZW1lbnQgY29udGFpbnMgYSBzdHJpbmcgZGVzY3JpYmluZyBhbgotZXh0ZW5zaW9uLiBleGFtcGxlOiAidHh0IgotCi1Vc2VkIGluOiBtaW1lLW1hcHBpbmcKLS0tPgotPCFFTEVNRU5UIGV4dGVuc2lvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLURlY2xhcmVzIGEgZmlsdGVyIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvCi1laXRoZXIgYSBzZXJ2bGV0IG9yIGEgVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nCi10aGUgZmlsdGVyLW5hbWUgdmFsdWUgdG8gcmVmZXJlbmNlLiBGaWx0ZXJzIGNhbiBhY2Nlc3MgdGhlCi1pbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXQKLXJ1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBmaWx0ZXIgKGljb24/LCBmaWx0ZXItbmFtZSwgZGlzcGxheS1uYW1lPywgZGVzY3JpcHRpb24/LAotZmlsdGVyLWNsYXNzLCBpbml0LXBhcmFtKik+Ci0KLTwhLS0KLVRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuCi0KLVVzZWQgaW46IGZpbHRlcgotLS0+Ci08IUVMRU1FTlQgZmlsdGVyLWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotRGVjbGFyYXRpb24gb2YgdGhlIGZpbHRlciBtYXBwaW5ncyBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlCi1jb250YWluZXIgdXNlcyB0aGUgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRvIGRlY2lkZSB3aGljaCBmaWx0ZXJzCi10byBhcHBseSB0byBhIHJlcXVlc3QsIGFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlCi1yZXF1ZXN0IFVSSSB0byBhIFNlcnZsZXQgaW4gdGhlIG5vcm1hbCB3YXkuIFRvIGRldGVybWluZSB3aGljaCBmaWx0ZXJzCi10byBhcHBseSBpdCBtYXRjaGVzIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyBlaXRoZXIgb24gc2VydmxldC1uYW1lLAotb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoCi1zdHlsZSBpcyB1c2VkLiBUaGUgb3JkZXIgaW4gd2hpY2ggZmlsdGVycyBhcmUgaW52b2tlZCBpcyB0aGUgb3JkZXIgaW4KLXdoaWNoIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0aGF0IG1hdGNoIGEgcmVxdWVzdCBVUkkgZm9yIGEKLXNlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZSBmaWx0ZXItbmFtZQotdmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIDxmaWx0ZXItbmFtZT4gc3ViLWVsZW1lbnRzIG9mIG9uZSBvZiB0aGUKLTxmaWx0ZXI+IGRlY2xhcmF0aW9ucyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBmaWx0ZXItbWFwcGluZyAoZmlsdGVyLW5hbWUsICh1cmwtcGF0dGVybiB8IHNlcnZsZXQtbmFtZSkpPgotCi08IS0tCi1UaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBmaWx0ZXIuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIG1hcCB0aGUgZmlsdGVyLgotRWFjaCBmaWx0ZXIgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLVVzZWQgaW46IGZpbHRlciwgZmlsdGVyLW1hcHBpbmcKLS0tPgotPCFFTEVNRU5UIGZpbHRlci1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwCi13aGVyZSB0aGUgZXJyb3IgcGFnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsCi1jYW4gYmUgZm91bmQuIFRoZSBwYXRoIGJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZAotcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLQotVXNlZCBpbjogZm9ybS1sb2dpbi1jb25maWcKLS0tPgotPCFFTEVNRU5UIGZvcm0tZXJyb3ItcGFnZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBmb3JtLWxvZ2luLWNvbmZpZyBlbGVtZW50IHNwZWNpZmllcyB0aGUgbG9naW4gYW5kIGVycm9yIHBhZ2VzCi10aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQgYXV0aGVudGljYXRpb24KLWlzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4KLQotVXNlZCBpbjogbG9naW4tY29uZmlnCi0tLT4KLTwhRUxFTUVOVCBmb3JtLWxvZ2luLWNvbmZpZyAoZm9ybS1sb2dpbi1wYWdlLCBmb3JtLWVycm9yLXBhZ2UpPgotCi08IS0tCi1UaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAKLXdoZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZSBmb3VuZC4gVGhlIHBhdGgKLWJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLgotCi1Vc2VkIGluOiBmb3JtLWxvZ2luLWNvbmZpZwotLS0+Ci08IUVMRU1FTlQgZm9ybS1sb2dpbi1wYWdlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UKLWJlYW4ncyBob21lIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLXJlZgotCi1FeGFtcGxlOgotCi08aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KLS0tPgotPCFFTEVNRU5UIGhvbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgKEdFVCB8IFBPU1QgfC4uLikuCi0KLVVzZWQgaW46IHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uCi0tLT4KLTwhRUxFTUVOVCBodHRwLW1ldGhvZCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBpY29uIGVsZW1lbnQgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cyB0aGF0Ci1zcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgYSBsYXJnZSBHSUYgb3IgSlBFRyBpY29uIGltYWdlcwotdXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEgR1VJIHRvb2wuCi0KLVVzZWQgaW46IGZpbHRlciwgc2VydmxldCwgd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgaWNvbiAoc21hbGwtaWNvbj8sIGxhcmdlLWljb24/KT4KLQotPCEtLQotVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgotaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgdGhlIHNlcnZsZXQKLQotVXNlZCBpbjogZmlsdGVyLCBzZXJ2bGV0Ci0tLT4KLTwhRUxFTUVOVCBpbml0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4KLQotPCEtLQotVGhlIGpzcC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGwgcGF0aCB0byBhIEpTUCBmaWxlIHdpdGhpbgotdGhlIHdlYiBhcHBsaWNhdGlvbiBiZWdpbm5pbmcgd2l0aCBhIGAvJy4KLQotVXNlZCBpbjogc2VydmxldAotLS0+Ci08IUVMRU1FTlQganNwLWZpbGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotY29udGFpbmluZyBhIGxhcmdlICgzMiB4IDMyKSBpY29uIGltYWdlLiBUaGUgZmlsZQotbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24ncwotd2FyIGZpbGUuCi0KLVRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotVXNlZCBpbjogaWNvbgotCi1FeGFtcGxlOgotCi08bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGxpc3RlbmVyIGVsZW1lbnQgaW5kaWNhdGVzIHRoZSBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViCi1hcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBsaXN0ZW5lciAobGlzdGVuZXItY2xhc3MpPgotCi08IS0tCi1UaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlCi1yZWdpc3RlcmVkIGFzIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIFRoZSB2YWx1ZSBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgbGlzdGVuZXIgY2xhc3MuCi0KLQotVXNlZCBpbjogbGlzdGVuZXIKLS0tPgotPCFFTEVNRU5UIGxpc3RlbmVyLWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMgc2VydmxldCBzaG91bGQgYmUKLWxvYWRlZCAoaW5zdGFudGlhdGVkIGFuZCBoYXZlIGl0cyBpbml0KCkgY2FsbGVkKSBvbiB0aGUgc3RhcnR1cAotb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mCi10aGVzZSBlbGVtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbiB3aGljaAotdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gSWYgdGhlIHZhbHVlIGlzIGEgbmVnYXRpdmUgaW50ZWdlciwKLW9yIHRoZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50LCB0aGUgY29udGFpbmVyIGlzIGZyZWUgdG8gbG9hZCB0aGUKLXNlcnZsZXQgd2hlbmV2ZXIgaXQgY2hvb3Nlcy4gSWYgdGhlIHZhbHVlIGlzIGEgcG9zaXRpdmUgaW50ZWdlcgotb3IgMCwgdGhlIGNvbnRhaW5lciBtdXN0IGxvYWQgYW5kIGluaXRpYWxpemUgdGhlIHNlcnZsZXQgYXMgdGhlCi1hcHBsaWNhdGlvbiBpcyBkZXBsb3llZC4gVGhlIGNvbnRhaW5lciBtdXN0IGd1YXJhbnRlZSB0aGF0Ci1zZXJ2bGV0cyBtYXJrZWQgd2l0aCBsb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkIGJlZm9yZSBzZXJ2bGV0cwotbWFya2VkIHdpdGggaGlnaGVyIGludGVnZXJzLiBUaGUgY29udGFpbmVyIG1heSBjaG9vc2UgdGhlIG9yZGVyCi1vZiBsb2FkaW5nIG9mIHNlcnZsZXRzIHdpdGggdGhlIHNhbWUgbG9hZC1vbi1zdGFydC11cCB2YWx1ZS4KLQotVXNlZCBpbjogc2VydmxldAotLS0+Ci08IUVMRU1FTlQgbG9hZC1vbi1zdGFydHVwICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgbG9jYWwgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi1lbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IGVqYi1sb2NhbC1yZWYKLQotLS0+Ci08IUVMRU1FTlQgbG9jYWwgKCNQQ0RBVEEpPgotCi08IS0tCi0KLVRoZSBsb2NhbC1ob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQotZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaG9tZSBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IGVqYi1sb2NhbC1yZWYKLS0tPgotPCFFTEVNRU5UIGxvY2FsLWhvbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGluIHRoZSB3ZWIKLWFwcGxpY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSB2YWx1ZSBvZgotdGhlIGxvY2F0aW9uIG11c3QgaGF2ZSBhIGxlYWRpbmcgYC8nLgotCi1Vc2VkIGluOiBlcnJvci1wYWdlCi0tLT4KLTwhRUxFTUVOVCBsb2NhdGlvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsb2dpbi1jb25maWcgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLW1ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvcgotdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbgotbWVjaGFuaXNtLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBsb2dpbi1jb25maWcgKGF1dGgtbWV0aG9kPywgcmVhbG0tbmFtZT8sIGZvcm0tbG9naW4tY29uZmlnPyk+Ci0KLTwhLS0KLVRoZSBtaW1lLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgotYW5kIGEgbWltZSB0eXBlLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBtaW1lLW1hcHBpbmcgKGV4dGVuc2lvbiwgbWltZS10eXBlKT4KLQotPCEtLQotVGhlIG1pbWUtdHlwZSBlbGVtZW50IGNvbnRhaW5zIGEgZGVmaW5lZCBtaW1lIHR5cGUuIGV4YW1wbGU6Ci0idGV4dC9wbGFpbiIKLQotVXNlZCBpbjogbWltZS1tYXBwaW5nCi0tLT4KLTwhRUxFTUVOVCBtaW1lLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLiBFYWNoIHBhcmFtZXRlcgotbmFtZSBtdXN0IGJlIHVuaXF1ZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0KLVVzZWQgaW46IGNvbnRleHQtcGFyYW0sIGluaXQtcGFyYW0KLS0tPgotPCFFTEVNRU5UIHBhcmFtLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuCi0KLVVzZWQgaW46IGNvbnRleHQtcGFyYW0sIGluaXQtcGFyYW0KLS0tPgotPCFFTEVNRU5UIHBhcmFtLXZhbHVlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlYWxtIG5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJlYWxtIG5hbWUgdG8gdXNlIGluIEhUVFAKLUJhc2ljIGF1dGhvcml6YXRpb24uCi0KLVVzZWQgaW46IGxvZ2luLWNvbmZpZwotLS0+Ci08IUVMRU1FTlQgcmVhbG0tbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UKLWJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItcmVmCi0KLUV4YW1wbGU6Ci0KLTxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotLS0+Ci08IUVMRU1FTlQgcmVtb3RlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlIHNpZ25zCi1vbiBwcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvciB3aGV0aGVyIHRoZSBDb250YWluZXIKLXdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gSW4gdGhlCi1sYXR0ZXIgY2FzZSwgdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlCi1EZXBsb3llci4KLQotVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0JPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLWF1dGggKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgbWFuYWdlcgotY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtc2hhcmluZy1zY29wZSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zIG9idGFpbmVkCi10aHJvdWdoIHRoZSBnaXZlbiByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgY2FuIGJlCi1zaGFyZWQuIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQsIGlmIHNwZWNpZmllZCwgbXVzdCBiZSBvbmUgb2YgdGhlCi10d28gZm9sbG93aW5nOgotCi0JPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0JPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLQotVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy1zaGFyaW5nLXNjb3BlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhIHNvdXJjZS4gVGhlIHR5cGUKLWlzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlCi1leHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtZW52LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSB3ZWIgYXBwbGljYXRpb24ncwotcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UKLWluIHRoZSB3ZWIgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4KLWluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5Ci10aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuCi0KLVVzZWQgaW46IHdlYi1hcHAKLQotRXhhbXBsZToKLQotPHJlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci08L3Jlc291cmNlLWVudi1yZWY+Ci0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmIChkZXNjcmlwdGlvbj8sIHJlc291cmNlLWVudi1yZWYtbmFtZSwKLQkJcmVzb3VyY2UtZW52LXJlZi10eXBlKT4KLQotPCEtLQotVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlCi1lbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi10aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiByZXNvdXJjZS1lbnYtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtZW52LXJlZi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGEgcmVzb3VyY2UKLWVudmlyb25tZW50IHJlZmVyZW5jZS4gIEl0IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEKLWxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtZW52LXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSB3ZWIgYXBwbGljYXRpb24ncwotcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwKLXRoZSBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlCi1leHBlY3RlZCBieSB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUsIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uCi0oQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlCi1zaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UgKFNoYXJlYWJsZSBvcgotVW5zaGFyZWFibGUpLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLUV4YW1wbGU6Ci0KLSAgICA8cmVzb3VyY2UtcmVmPgotCTxyZXMtcmVmLW5hbWU+amRiYy9FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+Ci0JPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC9yZXMtdHlwZT4KLQk8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLQk8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLXJlZiAoZGVzY3JpcHRpb24/LCByZXMtcmVmLW5hbWUsIHJlcy10eXBlLCByZXMtYXV0aCwKLQkJcmVzLXNoYXJpbmctc2NvcGU/KT4KLQotPCEtLQotVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZCBzZWN1cml0eSByb2xlLiBUaGUKLXJvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbiB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzCi1kZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotCi1Vc2VkIGluOiBzZWN1cml0eS1yb2xlLXJlZgotLS0+Ci08IUVMRU1FTlQgcm9sZS1saW5rICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQotVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi1Vc2VkIGluOiBhdXRoLWNvbnN0cmFpbnQsIHJ1bi1hcywgc2VjdXJpdHktcm9sZSwgc2VjdXJpdHktcm9sZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJvbGUtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBydW4tYXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUKLWV4ZWN1dGlvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kCi10aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLVVzZWQgaW46IHNlcnZsZXQKLS0tPgotPCFFTEVNRU5UIHJ1bi1hcyAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgotCi08IS0tCi1UaGUgc2VjdXJpdHktY29uc3RyYWludCBlbGVtZW50IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXR5Ci1jb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9ucwotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1jb25zdHJhaW50IChkaXNwbGF5LW5hbWU/LCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbissCi1hdXRoLWNvbnN0cmFpbnQ/LCB1c2VyLWRhdGEtY29uc3RyYWludD8pPgotCi08IS0tCi1UaGUgc2VjdXJpdHktcm9sZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkKLXJvbGUuIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZQotc2VjdXJpdHkgcm9sZSwgYW5kIHRoZSBzZWN1cml0eSByb2xlIG5hbWUuCi0KLVVzZWQgaW46IHdlYi1hcHAKLQotRXhhbXBsZToKLQotICAgIDxzZWN1cml0eS1yb2xlPgotCTxkZXNjcmlwdGlvbj4KLQkgICAgVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkCi0JICAgIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUgc2VydmljZSBhcHBsaWNhdGlvbi4KLQk8L2Rlc2NyaXB0aW9uPgotCTxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4KLSAgICA8L3NlY3VyaXR5LXJvbGU+Ci0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1yb2xlIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSk+Ci0KLTwhLS0KLVRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHNlY3VyaXR5Ci1yb2xlIHJlZmVyZW5jZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MgY29kZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzCi1vZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZSB1c2VkIGluIHRoZSBjb2RlLAotYW5kIGFuIG9wdGlvbmFsIGxpbmsgdG8gYSBzZWN1cml0eSByb2xlLiBJZiB0aGUgc2VjdXJpdHkgcm9sZSBpcyBub3QKLXNwZWNpZmllZCwgdGhlIERlcGxveWVyIG11c3QgY2hvb3NlIGFuIGFwcHJvcHJpYXRlIHNlY3VyaXR5IHJvbGUuCi0KLVRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgU3RyaW5nIHVzZWQgYXMgdGhlCi1wYXJhbWV0ZXIgdG8gdGhlIEVKQkNvbnRleHQuaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGVOYW1lKSBtZXRob2QKLW9yIHRoZSBIdHRwU2VydmxldFJlcXVlc3QuaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSBtZXRob2QuCi0KLVVzZWQgaW46IHNlcnZsZXQKLQotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktcm9sZS1yZWYgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lLCByb2xlLWxpbms/KT4KLQotPCEtLQotVGhlIHNlcnZsZXQgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhCi1zZXJ2bGV0LiBJZiBhIGpzcC1maWxlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGlzCi1wcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZCBsb2FkZWQuCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIHNlcnZsZXQgKGljb24/LCBzZXJ2bGV0LW5hbWUsIGRpc3BsYXktbmFtZT8sIGRlc2NyaXB0aW9uPywKLShzZXJ2bGV0LWNsYXNzfGpzcC1maWxlKSwgaW5pdC1wYXJhbSosIGxvYWQtb24tc3RhcnR1cD8sIHJ1bi1hcz8sIHNlY3VyaXR5LXJvbGUtcmVmKik+Ci0KLTwhLS0KLVRoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi1vZiB0aGUgc2VydmxldC4KLQotVXNlZCBpbjogc2VydmxldAotLS0+Ci08IUVMRU1FTlQgc2VydmxldC1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZXJ2bGV0LW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEgc2VydmxldAotYW5kIGEgdXJsIHBhdHRlcm4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgc2VydmxldC1tYXBwaW5nIChzZXJ2bGV0LW5hbWUsIHVybC1wYXR0ZXJuKT4KLQotPCEtLQotVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUKLXNlcnZsZXQuIEVhY2ggc2VydmxldCBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogZmlsdGVyLW1hcHBpbmcsIHNlcnZsZXQsIHNlcnZsZXQtbWFwcGluZwotLS0+Ci08IUVMRU1FTlQgc2VydmxldC1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlc3Npb24tY29uZmlnIGVsZW1lbnQgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvcgotdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIHNlc3Npb24tY29uZmlnIChzZXNzaW9uLXRpbWVvdXQ/KT4KLQotPCEtLQotVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQgc2Vzc2lvbiB0aW1lb3V0Ci1pbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZQotc3BlY2lmaWVkIHRpbWVvdXQgbXVzdCBiZSBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KLUlmIHRoZSB0aW1lb3V0IGlzIDAgb3IgbGVzcywgdGhlIGNvbnRhaW5lciBlbnN1cmVzIHRoZSBkZWZhdWx0Ci1iZWhhdmlvdXIgb2Ygc2Vzc2lvbnMgaXMgbmV2ZXIgdG8gdGltZSBvdXQuCi0KLVVzZWQgaW46IHNlc3Npb24tY29uZmlnCi0tLT4KLTwhRUxFTUVOVCBzZXNzaW9uLXRpbWVvdXQgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQotbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24ncwotd2FyIGZpbGUuCi0KLVRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotVXNlZCBpbjogaWNvbgotCi1FeGFtcGxlOgotCi08c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHRhZ2xpYiBlbGVtZW50IGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBKU1AgdGFnIGxpYnJhcnkuCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIHRhZ2xpYiAodGFnbGliLXVyaSwgdGFnbGliLWxvY2F0aW9uKT4KLQotPCEtLQotdGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiAoYXMgYSByZXNvdXJjZQotcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnCi1MaWJhcnkgRGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIHRhZyBsaWJyYXJ5LgotCi1Vc2VkIGluOiB0YWdsaWIKLS0tPgotPCFFTEVNRU5UIHRhZ2xpYi1sb2NhdGlvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJLCByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24KLW9mIHRoZSB3ZWIueG1sIGRvY3VtZW50LCBpZGVudGlmeWluZyBhIFRhZyBMaWJyYXJ5IHVzZWQgaW4gdGhlIFdlYgotQXBwbGljYXRpb24uCi0KLVVzZWQgaW46IHRhZ2xpYgotLS0+Ci08IUVMRU1FTlQgdGFnbGliLXVyaSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24KLWJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvcgotQ09ORklERU5USUFMLiBOT05FIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW55Ci10cmFuc3BvcnQgZ3VhcmFudGVlcy4gQSB2YWx1ZSBvZiBJTlRFR1JBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbgotcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4KLXN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4ndCBiZSBjaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucwotdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhCi1mYXNoaW9uIHRoYXQgcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbSBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mCi10aGUgdHJhbnNtaXNzaW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgcHJlc2VuY2Ugb2YgdGhlIElOVEVHUkFMIG9yCi1DT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMgcmVxdWlyZWQuCi0KLVVzZWQgaW46IHVzZXItZGF0YS1jb25zdHJhaW50Ci0tLT4KLTwhRUxFTUVOVCB0cmFuc3BvcnQtZ3VhcmFudGVlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHVybC1wYXR0ZXJuIGVsZW1lbnQgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLiBNdXN0Ci1mb2xsb3cgdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDExLjIgb2YgdGhlIFNlcnZsZXQgQVBJCi1TcGVjaWZpY2F0aW9uLgotCi1Vc2VkIGluOiBmaWx0ZXItbWFwcGluZywgc2VydmxldC1tYXBwaW5nLCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbgotLS0+Ci08IUVMRU1FTlQgdXJsLXBhdHRlcm4gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdXNlci1kYXRhLWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGluZGljYXRlIGhvdyBkYXRhCi1jb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlIHByb3RlY3RlZC4KLQotVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAotLS0+Ci08IUVMRU1FTlQgdXNlci1kYXRhLWNvbnN0cmFpbnQgKGRlc2NyaXB0aW9uPywgdHJhbnNwb3J0LWd1YXJhbnRlZSk+Ci0KLTwhLS0KLVRoZSB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBzdWJzZXQKLW9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluIGEgd2ViCi1hcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYgbm8gSFRUUCBtZXRob2RzCi1hcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMgdG8gYWxsIEhUVFAKLW1ldGhvZHMuCi0KLVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLS0tPgotPCFFTEVNRU5UIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uICh3ZWItcmVzb3VyY2UtbmFtZSwgZGVzY3JpcHRpb24/LAotdXJsLXBhdHRlcm4qLCBodHRwLW1ldGhvZCopPgotCi08IS0tCi1UaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIgcmVzb3VyY2UKLWNvbGxlY3Rpb24uCi0KLVVzZWQgaW46IHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uCi0tLT4KLTwhRUxFTUVOVCB3ZWItcmVzb3VyY2UtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlIGFzIGEgZGVmYXVsdAotd2VsY29tZSBmaWxlLCBzdWNoIGFzIGluZGV4Lmh0bWwKLQotVXNlZCBpbjogd2VsY29tZS1maWxlLWxpc3QKLS0tPgotPCFFTEVNRU5UIHdlbGNvbWUtZmlsZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB3ZWxjb21lLWZpbGUtbGlzdCBjb250YWlucyBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VsY29tZSBmaWxlcwotZWxlbWVudHMuCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIHdlbGNvbWUtZmlsZS1saXN0ICh3ZWxjb21lLWZpbGUrKT4KLQotPCEtLQotVGhlIElEIG1lY2hhbmlzbSBpcyB0byBhbGxvdyB0b29scyB0aGF0IHByb2R1Y2UgYWRkaXRpb25hbCBkZXBsb3ltZW50Ci1pbmZvcm1hdGlvbiAoaS5lLiwgaW5mb3JtYXRpb24gYmV5b25kIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGluZm9ybWF0aW9uKSB0byBzdG9yZSB0aGUgbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGluIGEKLXNlcGFyYXRlIGZpbGUsIGFuZCBlYXNpbHkgcmVmZXIgZnJvbSB0aGVzZSB0b29sLXNwZWNpZmljIGZpbGVzIHRvIHRoZQotaW5mb3JtYXRpb24gaW4gdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotVG9vbHMgYXJlIG5vdCBhbGxvd2VkIHRvIGFkZCB0aGUgbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGludG8gdGhlCi1zdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0tLT4KLQotPCFBVFRMSVNUIGF1dGgtY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdXRoLW1ldGhvZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb250ZXh0LXBhcmFtIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRpc3BsYXktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXN0cmlidXRhYmxlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1saW5rIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1sb2NhbC1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZXJyb3ItY29kZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlcnJvci1wYWdlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGV4Y2VwdGlvbi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGV4dGVuc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmaWx0ZXIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmlsdGVyLWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZpbHRlci1tYXBwaW5nIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZpbHRlci1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZvcm0tZXJyb3ItcGFnZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmb3JtLWxvZ2luLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmb3JtLWxvZ2luLXBhZ2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaG9tZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBodHRwLW1ldGhvZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGluaXQtcGFyYW0gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QganNwLWZpbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsaXN0ZW5lciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsaXN0ZW5lci1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsb2FkLW9uLXN0YXJ0dXAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9jYWwgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9jYWwtaG9tZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsb2NhdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsb2dpbi1jb25maWcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWltZS1tYXBwaW5nIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1pbWUtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwYXJhbS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHBhcmFtLXZhbHVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlYWxtLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVtb3RlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1hdXRoIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtc2hhcmluZy1zY29wZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJvbGUtbGluayBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcnVuLWFzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1yb2xlLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXJ2bGV0IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlcnZsZXQtY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VydmxldC1tYXBwaW5nIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlcnZsZXQtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXNzaW9uLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXNzaW9uLXRpbWVvdXQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0YWdsaWIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnbGliLWxvY2F0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZ2xpYi11cmkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdHJhbnNwb3J0LWd1YXJhbnRlZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB1cmwtcGF0dGVybiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB1c2VyLWRhdGEtY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWItYXBwIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHdlYi1yZXNvdXJjZS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHdlbGNvbWUtZmlsZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWxjb21lLWZpbGUtbGlzdCBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzQueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfNC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YTI1MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfNC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSIyLjQiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKXdlYi1hcHBfMl80LnhzZHMJMS42MCAwMy8wOC8yNgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi0gICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi0gICAgICByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIFNlcnZsZXQgMi40IGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQlUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQgIldFQi1JTkYvd2ViLnhtbCIgaW4gdGhlCi0Jd2ViIGFwcGxpY2F0aW9uJ3Mgd2FyIGZpbGUuICBBbGwgU2VydmxldCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCi0JbXVzdCBpbmRpY2F0ZSB0aGUgd2ViIGFwcGxpY2F0aW9uIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRQotCW5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCi0JICAgICAgdmVyc2lvbj0iMi40Ij4KLQkgICAgICAuLi4KLQkgICAgPC93ZWItYXBwPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0JdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSjJFRQotCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ianNwXzJfMC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLWFwcCIgdHlwZT0iajJlZTp3ZWItYXBwVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYi1hcHAgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgZGVwbG95bWVudAotCWRlc2NyaXB0b3IgZm9yIGEgd2ViIGFwcGxpY2F0aW9uLiAgTm90ZSB0aGF0IHRoZSBzdWItZWxlbWVudHMKLQlvZiB0aGlzIGVsZW1lbnQgY2FuIGJlIGluIHRoZSBhcmJpdHJhcnkgb3JkZXIuIEJlY2F1c2Ugb2YKLQl0aGF0LCB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSBlbGVtZW50cyBvZiBkaXN0cmlidXRhYmxlLAotCXNlc3Npb24tY29uZmlnLCB3ZWxjb21lLWZpbGUtbGlzdCwganNwLWNvbmZpZywgbG9naW4tY29uZmlnLAotCWFuZCBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IHdhcyBjaGFuZ2VkIGZyb20gIj8iIHRvICIqIgotCWluIHRoaXMgc2NoZW1hLiAgSG93ZXZlciwgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpbnN0YW5jZQotCWZpbGUgbXVzdCBub3QgY29udGFpbiBtdWx0aXBsZSBlbGVtZW50cyBvZiBzZXNzaW9uLWNvbmZpZywKLQlqc3AtY29uZmlnLCBhbmQgbG9naW4tY29uZmlnLiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cyBvZgotCXdlbGNvbWUtZmlsZS1saXN0IG9yIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QsIHRoZSBjb250YWluZXIKLQltdXN0IGNvbmNhdGluYXRlIHRoZSBlbGVtZW50IGNvbnRlbnRzLiAgVGhlIG11bHRpcGxlIG9jY3VyYW5jZQotCW9mIHRoZSBlbGVtZW50IGRpc3RyaWJ1dGFibGUgaXMgcmVkdW5kYW50IGFuZCB0aGUgY29udGFpbmVyCi0JdHJlYXRzIHRoYXQgY2FzZSBleGFjdGx5IGluIHRoZSBzYW1lIHdheSB3aGVuIHRoZXJlIGlzIG9ubHkKLQlvbmUgZGlzdHJpYnV0YWJsZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1zZXJ2bGV0LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgc2VydmxldCBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VydmxldC4KLQkgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnNlcnZsZXQiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6c2VydmxldC1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1maWx0ZXItbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBmaWx0ZXIgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbHRlci4KLQkgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmZpbHRlciIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpmaWx0ZXItbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVqYi1sb2NhbC1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgd2ViCi0JICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotCSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1sb2NhbC1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIKLQkgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0JICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLXJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0JICBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZQotCSAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KLQkgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52Ci0JICBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLQkgIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLQkgIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuCi0JICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotCSAgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLQkgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlcy1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHdlYgotCSAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUKLQkgIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6a2V5IG5hbWU9IndlYi1hcHAtcm9sZS1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBBIHJvbGUtbmFtZS1rZXkgaXMgc3BlY2lmaWVkIHRvIGFsbG93IHRoZSByZWZlcmVuY2VzCi0JICBmcm9tIHRoZSBzZWN1cml0eS1yb2xlLXJlZnMuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6c2VjdXJpdHktcm9sZSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJ3ZWItYXBwLXJvbGUtbmFtZS1yZWZlcmVuY2VzIgotCQlyZWZlcj0iajJlZTp3ZWItYXBwLXJvbGUtbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGtleXJlZiBpbmRpY2F0ZXMgdGhlIHJlZmVyZW5jZXMgZnJvbQotCSAgc2VjdXJpdHktcm9sZS1yZWYgdG8gYSBzcGVjaWZpZWQgcm9sZS1uYW1lLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnNlcnZsZXQvajJlZTpzZWN1cml0eS1yb2xlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyb2xlLWxpbmsiLz4KLSAgICA8L3hzZDprZXlyZWY+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXV0aC1jb25zdHJhaW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGF1dGgtY29uc3RyYWludFR5cGUgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQKLQlzaG91bGQgYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlCi0JY29sbGVjdGlvbi4gVGhlIHJvbGUtbmFtZSB1c2VkIGhlcmUgbXVzdCBlaXRoZXIgY29ycmVzcG9uZAotCXRvIHRoZSByb2xlLW5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzCi0JZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIG9yIGJlIHRoZSBzcGVjaWFsbHkKLQlyZXNlcnZlZCByb2xlLW5hbWUgIioiIHRoYXQgaXMgYSBjb21wYWN0IHN5bnRheCBmb3IKLQlpbmRpY2F0aW5nIGFsbCByb2xlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJZiBib3RoICIqIgotCWFuZCByb2xlbmFtZXMgYXBwZWFyLCB0aGUgY29udGFpbmVyIGludGVycHJldHMgdGhpcyBhcyBhbGwKLQlyb2xlcy4gIElmIG5vIHJvbGVzIGFyZSBkZWZpbmVkLCBubyB1c2VyIGlzIGFsbG93ZWQgYWNjZXNzCi0JdG8gdGhlIHBvcnRpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXNjcmliZWQgYnkgdGhlCi0JY29udGFpbmluZyBzZWN1cml0eS1jb25zdHJhaW50LiAgVGhlIGNvbnRhaW5lciBtYXRjaGVzCi0Jcm9sZSBuYW1lcyBjYXNlIHNlbnNpdGl2ZWx5IHdoZW4gZGV0ZXJtaW5pbmcgYWNjZXNzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXV0aC1tZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXV0aC1tZXRob2RUeXBlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgotCW1lY2hhbmlzbSBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbi4gQXMgYSBwcmVyZXF1aXNpdGUgdG8KLQlnYWluaW5nIGFjY2VzcyB0byBhbnkgd2ViIHJlc291cmNlcyB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5Ci0JYW4gYXV0aG9yaXphdGlvbiBjb25zdHJhaW50LCBhIHVzZXIgbXVzdCBoYXZlIGF1dGhlbnRpY2F0ZWQKLQl1c2luZyB0aGUgY29uZmlndXJlZCBtZWNoYW5pc20uIExlZ2FsIHZhbHVlcyBhcmUgIkJBU0lDIiwKLQkiRElHRVNUIiwgIkZPUk0iLCAiQ0xJRU5ULUNFUlQiLCBvciBhIHZlbmRvci1zcGVjaWZpYwotCWF1dGhlbnRpY2F0aW9uIHNjaGVtZS4KLQotCVVzZWQgaW46IGxvZ2luLWNvbmZpZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc3BhdGNoZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZGlzcGF0Y2hlciBoYXMgZm91ciBsZWdhbCB2YWx1ZXM6IEZPUldBUkQsIFJFUVVFU1QsIElOQ0xVREUsCi0JYW5kIEVSUk9SLiBBIHZhbHVlIG9mIEZPUldBUkQgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQKLQl1bmRlciBSZXF1ZXN0RGlzcGF0Y2hlci5mb3J3YXJkKCkgY2FsbHMuICBBIHZhbHVlIG9mIFJFUVVFU1QKLQltZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZCB1bmRlciBvcmRpbmFyeSBjbGllbnQgY2FsbHMgdG8KLQl0aGUgcGF0aCBvciBzZXJ2bGV0LiBBIHZhbHVlIG9mIElOQ0xVREUgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlCi0JYXBwbGllZCB1bmRlciBSZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCkgY2FsbHMuICBBIHZhbHVlIG9mCi0JRVJST1IgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIgdGhlIGVycm9yIHBhZ2UKLQltZWNoYW5pc20uICBUaGUgYWJzZW5jZSBvZiBhbnkgZGlzcGF0Y2hlciBlbGVtZW50cyBpbiBhCi0JZmlsdGVyLW1hcHBpbmcgaW5kaWNhdGVzIGEgZGVmYXVsdCBvZiBhcHBseWluZyBmaWx0ZXJzIG9ubHkgdW5kZXIKLQlvcmRpbmFyeSBjbGllbnQgY2FsbHMgdG8gdGhlIHBhdGggb3Igc2VydmxldC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk9SV0FSRCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOQ0xVREUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRVFVRVNUIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVJST1IiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVuY29kaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVuY29kaW5nVHlwZSBkZWZpbmVzIElBTkEgY2hhcmFjdGVyIHNldHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHNdKyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlcnJvci1jb2RlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVycm9yLWNvZGUgY29udGFpbnMgYW4gSFRUUCBlcnJvciBjb2RlLCBleDogNDA0Ci0KLQlVc2VkIGluOiBlcnJvci1wYWdlCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTp4c2RQb3NpdGl2ZUludGVnZXJUeXBlIj4KLQk8eHNkOnBhdHRlcm4gdmFsdWU9IlxkezN9Ii8+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVycm9yLXBhZ2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZXJyb3ItcGFnZVR5cGUgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXJyb3IgY29kZQotCW9yIGV4Y2VwdGlvbiB0eXBlIHRvIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UgaW4gdGhlIHdlYgotCWFwcGxpY2F0aW9uLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImVycm9yLWNvZGUiCi0JCSAgICAgdHlwZT0iajJlZTplcnJvci1jb2RlVHlwZSIvPgotCi0JPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi10eXBlIgotCQkgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBleGNlcHRpb24tdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotCSAgICAgIG5hbWUgb2YgYSBKYXZhIGV4Y2VwdGlvbiB0eXBlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhdGlvbiIKLQkJICAgdHlwZT0iajJlZTp3YXItcGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlCi0JICAgIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQkgICAgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBtdXN0IGhhdmUKLQkgICAgYSBsZWFkaW5nIGAvJy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWx0ZXItbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCURlY2xhcmF0aW9uIG9mIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaW4gdGhpcyB3ZWIKLQlhcHBsaWNhdGlvbiBpcyBkb25lIGJ5IHVzaW5nIGZpbHRlci1tYXBwaW5nVHlwZS4KLQlUaGUgY29udGFpbmVyIHVzZXMgdGhlIGZpbHRlci1tYXBwaW5nCi0JZGVjbGFyYXRpb25zIHRvIGRlY2lkZSB3aGljaCBmaWx0ZXJzIHRvIGFwcGx5IHRvIGEgcmVxdWVzdCwKLQlhbmQgaW4gd2hhdCBvcmRlci4gVGhlIGNvbnRhaW5lciBtYXRjaGVzIHRoZSByZXF1ZXN0IFVSSSB0bwotCWEgU2VydmxldCBpbiB0aGUgbm9ybWFsIHdheS4gVG8gZGV0ZXJtaW5lIHdoaWNoIGZpbHRlcnMgdG8KLQlhcHBseSBpdCBtYXRjaGVzIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyBlaXRoZXIgb24KLQlzZXJ2bGV0LW5hbWUsIG9yIG9uIHVybC1wYXR0ZXJuIGZvciBlYWNoIGZpbHRlci1tYXBwaW5nCi0JZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoIHN0eWxlIGlzIHVzZWQuIFRoZSBvcmRlciBpbgotCXdoaWNoIGZpbHRlcnMgYXJlIGludm9rZWQgaXMgdGhlIG9yZGVyIGluIHdoaWNoCi0JZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRoYXQgbWF0Y2ggYSByZXF1ZXN0IFVSSSBmb3IgYQotCXNlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZQotCWZpbHRlci1uYW1lIHZhbHVlIG11c3QgYmUgdGhlIHZhbHVlIG9mIHRoZSBmaWx0ZXItbmFtZQotCXN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlIGZpbHRlciBkZWNsYXJhdGlvbnMgaW4gdGhlCi0JZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmZpbHRlci1uYW1lVHlwZSIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotCQkgICAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLQkJICAgICB0eXBlPSJqMmVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwYXRjaGVyIgotCQkgICB0eXBlPSJqMmVlOmRpc3BhdGNoZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iNCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlci1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZmlsdGVyIGlzIGRlY2xhcmUKLQlieSB1c2luZyBmaWx0ZXItbmFtZVR5cGUuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIG1hcCB0aGUKLQlmaWx0ZXIuICBFYWNoIGZpbHRlciBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYgotCWFwcGxpY2F0aW9uLgotCi0JVXNlZCBpbjogZmlsdGVyLCBmaWx0ZXItbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqMmVlOm5vbkVtcHR5U3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWx0ZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZmlsdGVyVHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYSBmaWx0ZXIgaW4gdGhlIHdlYgotCWFwcGxpY2F0aW9uLiBUaGUgZmlsdGVyIGlzIG1hcHBlZCB0byBlaXRoZXIgYSBzZXJ2bGV0IG9yIGEKLQlVUkwgcGF0dGVybiBpbiB0aGUgZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgdXNpbmcgdGhlCi0JZmlsdGVyLW5hbWUgdmFsdWUgdG8gcmVmZXJlbmNlLiBGaWx0ZXJzIGNhbiBhY2Nlc3MgdGhlCi0JaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudAotCWRlc2NyaXB0b3IgYXQgcnVudGltZSB2aWEgdGhlIEZpbHRlckNvbmZpZyBpbnRlcmZhY2UuCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZmlsdGVyLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZmlsdGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzCi0JICAgIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtIG9mIGEgc2VydmxldCBmaWx0ZXIKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmb3JtLWxvZ2luLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBmb3JtLWxvZ2luLWNvbmZpZ1R5cGUgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IKLQlwYWdlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQKLQlhdXRoZW50aWNhdGlvbiBpcyBub3QgdXNlZCwgdGhlc2UgZWxlbWVudHMgYXJlIGlnbm9yZWQuCi0KLQlVc2VkIGluOiBsb2dpbi1jb25maWcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm0tbG9naW4tcGFnZSIKLQkJICAgdHlwZT0iajJlZTp3YXItcGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYgotCSAgICBhcHAgd2hlcmUgdGhlIHBhZ2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9naW4gY2FuIGJlCi0JICAgIGZvdW5kLiAgVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkCi0JICAgIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWVycm9yLXBhZ2UiCi0JCSAgIHR5cGU9ImoyZWU6d2FyLXBhdGhUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluCi0JICAgIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBlcnJvciBwYWdlIHRoYXQgaXMgZGlzcGxheWVkCi0JICAgIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwgY2FuIGJlIGZvdW5kLgotCSAgICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKLQkgICAgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imh0dHAtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotCi0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgcmVjb2duaXplZCBieSB0aGUKLQl3ZWItYXBwLCBmb3IgZXhhbXBsZSBHRVQsIFBPU1QsIC4uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRVQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQT1NUIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFVUIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVMRVRFIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEVBRCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElPTlMiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUkFDRSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCBjb250YWlucyBvbmUgb3IgbW9yZQotCWxvY2FsZS1lbmNvZGluZy1tYXBwaW5nKHMpLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nIgotCQkgICB0eXBlPSJqMmVlOmxvY2FsZS1lbmNvZGluZy1tYXBwaW5nVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbGUtZW5jb2RpbmctbWFwcGluZyBjb250YWlucyBsb2NhbGUgbmFtZSBhbmQKLQllbmNvZGluZyBuYW1lLiBUaGUgbG9jYWxlIG5hbWUgbXVzdCBiZSBlaXRoZXIgIkxhbmd1YWdlLWNvZGUiLAotCXN1Y2ggYXMgImphIiwgZGVmaW5lZCBieSBJU08tNjM5IG9yICJMYW5ndWFnZS1jb2RlX0NvdW50cnktY29kZSIsCi0Jc3VjaCBhcyAiamFfSlAiLiAgIkNvdW50cnkgY29kZSIgaXMgZGVmaW5lZCBieSBJU08tMzE2Ni4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUiCi0JCSAgIHR5cGU9ImoyZWU6bG9jYWxlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY29kaW5nIgotCQkgICB0eXBlPSJqMmVlOmVuY29kaW5nVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jYWxlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvY2FsZVR5cGUgZGVmaW5lcyB2YWxpZCBsb2NhbGUgZGVmaW5lZCBieSBJU08tNjM5LTEKLQlhbmQgSVNPLTMxNjYuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlthLXpdezJ9KF98LSk/KFtccHtMfVwtXHB7TmR9XXsyfSk/Ii8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2luLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2dpbi1jb25maWdUeXBlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgotCW1ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZQotCXVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZQotCW5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbiBtZWNoYW5pc20uCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aC1tZXRob2QiCi0JCSAgIHR5cGU9ImoyZWU6YXV0aC1tZXRob2RUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFsbS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlYWxtIG5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJlYWxtIG5hbWUgdG8KLQkgICAgdXNlIGluIEhUVFAgQmFzaWMgYXV0aG9yaXphdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWxvZ2luLWNvbmZpZyIKLQkJICAgdHlwZT0iajJlZTpmb3JtLWxvZ2luLWNvbmZpZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1pbWUtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtaW1lLW1hcHBpbmdUeXBlIGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uCi0JYW5kIGEgbWltZSB0eXBlLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4KLQkgIGV4dGVuc2lvbi4gZXhhbXBsZTogInR4dCIKLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbWUtdHlwZSIKLQkJICAgdHlwZT0iajJlZTptaW1lLXR5cGVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWltZS10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1pbWUtdHlwZVR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIGRlZmluZWQgbWltZSB0eXBlLgotCi0JRXhhbXBsZToKLQkidGV4dC9wbGFpbiIKLQotCVVzZWQgaW46IG1pbWUtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbXlxwe0NjfV5cc10rL1teXHB7Q2N9XlxzXSsiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub25FbXB0eVN0cmluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQlUaGlzIHR5cGUgZGVmaW5lcyBhIHN0cmluZyB3aGljaCBjb250YWlucyBhdCBsZWFzdCBvbmUKLQljaGFyYWN0ZXIuCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDptaW5MZW5ndGggdmFsdWU9IjEiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1jb25zdHJhaW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIGlzIHVzZWQgdG8gYXNzb2NpYXRlCi0Jc2VjdXJpdHkgY29uc3RyYWludHMgd2l0aCBvbmUgb3IgbW9yZSB3ZWIgcmVzb3VyY2UKLQljb2xsZWN0aW9ucwotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLQkJICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLXJlc291cmNlLWNvbGxlY3Rpb24iCi0JCSAgIHR5cGU9ImoyZWU6d2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGgtY29uc3RyYWludCIKLQkJICAgdHlwZT0iajJlZTphdXRoLWNvbnN0cmFpbnRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLWRhdGEtY29uc3RyYWludCIKLQkJICAgdHlwZT0iajJlZTp1c2VyLWRhdGEtY29uc3RyYWludFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXQtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2bGV0LW1hcHBpbmdUeXBlIGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYQotCXNlcnZsZXQgYW5kIGEgdXJsIHBhdHRlcm4uCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLQkJICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmxldC1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZQotCXNlcnZsZXQuIEVhY2ggc2VydmxldCBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYgotCWFwcGxpY2F0aW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqMmVlOm5vbkVtcHR5U3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZsZXRUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhIHNlcnZsZXQuCi0JSXQgY29udGFpbnMgdGhlIGRlY2xhcmF0aXZlIGRhdGEgb2YgYQotCXNlcnZsZXQuIElmIGEganNwLWZpbGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgbG9hZC1vbi1zdGFydHVwCi0JZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZAotCWxvYWRlZC4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtY2xhc3MiCi0JCSAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHNlcnZsZXQtY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLQkgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmxldC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCi0JPHhzZDplbGVtZW50IG5hbWU9ImpzcC1maWxlIgotCQkgICAgIHR5cGU9ImoyZWU6anNwLWZpbGVUeXBlIi8+Ci0KLSAgICAgIDwveHNkOmNob2ljZT4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0JCSAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9hZC1vbi1zdGFydHVwIgotCQkgICB0eXBlPSJqMmVlOnhzZEludGVnZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcwotCSAgICBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQgKGluc3RhbnRpYXRlZCBhbmQgaGF2ZQotCSAgICBpdHMgaW5pdCgpIGNhbGxlZCkgb24gdGhlIHN0YXJ0dXAgb2YgdGhlIHdlYgotCSAgICBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mIHRoZXNlCi0JICAgIGVsZW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG9yZGVyIGluCi0JICAgIHdoaWNoIHRoZSBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQuIElmIHRoZSB2YWx1ZQotCSAgICBpcyBhIG5lZ2F0aXZlIGludGVnZXIsIG9yIHRoZSBlbGVtZW50IGlzIG5vdAotCSAgICBwcmVzZW50LCB0aGUgY29udGFpbmVyIGlzIGZyZWUgdG8gbG9hZCB0aGUgc2VydmxldAotCSAgICB3aGVuZXZlciBpdCBjaG9vc2VzLiBJZiB0aGUgdmFsdWUgaXMgYSBwb3NpdGl2ZQotCSAgICBpbnRlZ2VyIG9yIDAsIHRoZSBjb250YWluZXIgbXVzdCBsb2FkIGFuZAotCSAgICBpbml0aWFsaXplIHRoZSBzZXJ2bGV0IGFzIHRoZSBhcHBsaWNhdGlvbiBpcwotCSAgICBkZXBsb3llZC4gVGhlIGNvbnRhaW5lciBtdXN0IGd1YXJhbnRlZSB0aGF0Ci0JICAgIHNlcnZsZXRzIG1hcmtlZCB3aXRoIGxvd2VyIGludGVnZXJzIGFyZSBsb2FkZWQKLQkgICAgYmVmb3JlIHNlcnZsZXRzIG1hcmtlZCB3aXRoIGhpZ2hlciBpbnRlZ2Vycy4gVGhlCi0JICAgIGNvbnRhaW5lciBtYXkgY2hvb3NlIHRoZSBvcmRlciBvZiBsb2FkaW5nIG9mCi0JICAgIHNlcnZsZXRzIHdpdGggdGhlIHNhbWUgbG9hZC1vbi1zdGFydC11cCB2YWx1ZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJydW4tYXMiCi0JCSAgIHR5cGU9ImoyZWU6cnVuLWFzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6c2VjdXJpdHktcm9sZS1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2Vzc2lvbi1jb25maWdUeXBlIGRlZmluZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVycwotCWZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLXRpbWVvdXQiCi0JCSAgIHR5cGU9ImoyZWU6eHNkSW50ZWdlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXNzaW9uLXRpbWVvdXQgZWxlbWVudCBkZWZpbmVzIHRoZSBkZWZhdWx0Ci0JICAgIHNlc3Npb24gdGltZW91dCBpbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQKLQkgICAgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSBzcGVjaWZpZWQgdGltZW91dAotCSAgICBtdXN0IGJlIGV4cHJlc3NlZCBpbiBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzLgotCSAgICBJZiB0aGUgdGltZW91dCBpcyAwIG9yIGxlc3MsIHRoZSBjb250YWluZXIgZW5zdXJlcwotCSAgICB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2Ygc2Vzc2lvbnMgaXMgbmV2ZXIgdG8gdGltZQotCSAgICBvdXQuIElmIHRoaXMgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyCi0JICAgIG11c3Qgc2V0IGl0cyBkZWZhdWx0IHRpbWVvdXQgcGVyaW9kLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24KLQliZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHNob3VsZCBiZSBOT05FLCBJTlRFR1JBTCwgb3IKLQlDT05GSURFTlRJQUwuIE5PTkUgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QKLQlyZXF1aXJlIGFueSB0cmFuc3BvcnQgZ3VhcmFudGVlcy4gQSB2YWx1ZSBvZiBJTlRFR1JBTCBtZWFucwotCXRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgc2VudCBiZXR3ZWVuIHRoZQotCWNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbid0IGJlCi0JY2hhbmdlZCBpbiB0cmFuc2l0LiBDT05GSURFTlRJQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24KLQlyZXF1aXJlcyB0aGF0IHRoZSBkYXRhIGJlIHRyYW5zbWl0dGVkIGluIGEgZmFzaGlvbiB0aGF0Ci0JcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbSBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZQotCXRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZSBJTlRFR1JBTCBvcgotCUNPTkZJREVOVElBTCBmbGFnIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIFNTTCBpcwotCXJlcXVpcmVkLgotCi0JVXNlZCBpbjogdXNlci1kYXRhLWNvbnN0cmFpbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHUkFMIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09ORklERU5USUFMIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgaG93Ci0JZGF0YSBjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlCi0JcHJvdGVjdGVkLgotCi0JVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydC1ndWFyYW50ZWUiCi0JCSAgIHR5cGU9ImoyZWU6dHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3YXItcGF0aFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIGEgcGF0aCBzdGFydGluZwotCXdpdGggYSAiLyIgYW5kIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIGEgV0FSCi0JZmlsZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iLy4qIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ3ZWItYXBwLXZlcnNpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgY29udGFpbnMgdGhlIHJlY29nbml6ZWQgdmVyc2lvbnMgb2YKLQl3ZWItYXBwbGljYXRpb24gc3VwcG9ydGVkLiBJdCBpcyB1c2VkIHRvIGRlc2lnbmF0ZSB0aGUKLQl2ZXJzaW9uIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyLjQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViLWFwcFR5cGUiPgotCi0gICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzdHJpYnV0YWJsZSIKLQkJICAgdHlwZT0iajJlZTplbXB0eVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250ZXh0LXBhcmFtIgotCQkgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSI+Ci0KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGNvbnRleHQtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24KLQkgICAgb2YgYSB3ZWIgYXBwbGljYXRpb24ncyBzZXJ2bGV0IGNvbnRleHQKLQkgICAgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlciIKLQkJICAgdHlwZT0iajJlZTpmaWx0ZXJUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6ZmlsdGVyLW1hcHBpbmdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXIiCi0JCSAgIHR5cGU9ImoyZWU6bGlzdGVuZXJUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldCIKLQkJICAgdHlwZT0iajJlZTpzZXJ2bGV0VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpzZXJ2bGV0LW1hcHBpbmdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1jb25maWciCi0JCSAgIHR5cGU9ImoyZWU6c2Vzc2lvbi1jb25maWdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWltZS1tYXBwaW5nIgotCQkgICB0eXBlPSJqMmVlOm1pbWUtbWFwcGluZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWxjb21lLWZpbGUtbGlzdCIKLQkJICAgdHlwZT0iajJlZTp3ZWxjb21lLWZpbGUtbGlzdFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlcnJvci1wYWdlIgotCQkgICB0eXBlPSJqMmVlOmVycm9yLXBhZ2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLWNvbmZpZyIKLQkJICAgdHlwZT0iajJlZTpqc3AtY29uZmlnVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWNvbnN0cmFpbnQiCi0JCSAgIHR5cGU9ImoyZWU6c2VjdXJpdHktY29uc3RyYWludFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbi1jb25maWciCi0JCSAgIHR5cGU9ImoyZWU6bG9naW4tY29uZmlnVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0JCSAgIHR5cGU9ImoyZWU6c2VjdXJpdHktcm9sZVR5cGUiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvblR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IgotCQkgICB0eXBlPSJqMmVlOmxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3RUeXBlIi8+Ci0gICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTp3ZWItYXBwLXZlcnNpb25UeXBlIgotCQkgICB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBzdWJzZXQKLQlvZiB0aGUgcmVzb3VyY2VzIGFuZCBIVFRQIG1ldGhvZHMgb24gdGhvc2UgcmVzb3VyY2VzIHdpdGhpbgotCWEgd2ViIGFwcGxpY2F0aW9uIHRvIHdoaWNoIGEgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzLiBJZgotCW5vIEhUVFAgbWV0aG9kcyBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBzZWN1cml0eSBjb25zdHJhaW50Ci0JYXBwbGllcyB0byBhbGwgSFRUUCBtZXRob2RzLgotCi0JVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi1yZXNvdXJjZS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYgotCSAgICByZXNvdXJjZSBjb2xsZWN0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotCQkgICB0eXBlPSJqMmVlOnVybC1wYXR0ZXJuVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJodHRwLW1ldGhvZCIKLQkJICAgdHlwZT0iajJlZTpodHRwLW1ldGhvZFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWxjb21lLWZpbGUtbGlzdFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWxjb21lLWZpbGUtbGlzdCBjb250YWlucyBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VsY29tZQotCWZpbGVzIGVsZW1lbnRzLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlbGNvbWUtZmlsZSIKLQkJICAgdHlwZT0ieHNkOnN0cmluZyIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd2VsY29tZS1maWxlIGVsZW1lbnQgY29udGFpbnMgZmlsZSBuYW1lIHRvIHVzZQotCSAgICBhcyBhIGRlZmF1bHQgd2VsY29tZSBmaWxlLCBzdWNoIGFzIGluZGV4Lmh0bWwKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzUueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfNS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDkwMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSIyLjUiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKXdlYi1hcHBfMl81LnhzZHMJMS42MiAwNS8wOC8wNgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICAgICAgVS5TLkEKLSAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBTZXJ2bGV0IDIuNSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkICJXRUItSU5GL3dlYi54bWwiIGluIHRoZQotCXdlYiBhcHBsaWNhdGlvbidzIHdhciBmaWxlLiAgQWxsIFNlcnZsZXQgZGVwbG95bWVudCBkZXNjcmlwdG9ycwotCW11c3QgaW5kaWNhdGUgdGhlIHdlYiBhcHBsaWNhdGlvbiBzY2hlbWEgYnkgdXNpbmcgdGhlIEphdmEgRUUKLQluYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKLQkgICAgICB2ZXJzaW9uPSIyLjUiPgotCSAgICAgIC4uLgotCSAgICA8L3dlYi1hcHA+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLQl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKYXZhIEVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLQlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV81LnhzZCIvPgotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImpzcF8yXzEueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItYXBwIiB0eXBlPSJqYXZhZWU6d2ViLWFwcFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQKLQlkZXNjcmlwdG9yIGZvciBhIHdlYiBhcHBsaWNhdGlvbi4gIE5vdGUgdGhhdCB0aGUgc3ViLWVsZW1lbnRzCi0Jb2YgdGhpcyBlbGVtZW50IGNhbiBiZSBpbiB0aGUgYXJiaXRyYXJ5IG9yZGVyLiBCZWNhdXNlIG9mCi0JdGhhdCwgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgZWxlbWVudHMgb2YgZGlzdHJpYnV0YWJsZSwKLQlzZXNzaW9uLWNvbmZpZywgd2VsY29tZS1maWxlLWxpc3QsIGpzcC1jb25maWcsIGxvZ2luLWNvbmZpZywKLQlhbmQgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCB3YXMgY2hhbmdlZCBmcm9tICI/IiB0byAiKiIKLQlpbiB0aGlzIHNjaGVtYS4gIEhvd2V2ZXIsIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaW5zdGFuY2UKLQlmaWxlIG11c3Qgbm90IGNvbnRhaW4gbXVsdGlwbGUgZWxlbWVudHMgb2Ygc2Vzc2lvbi1jb25maWcsCi0JanNwLWNvbmZpZywgYW5kIGxvZ2luLWNvbmZpZy4gV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZWxlbWVudHMgb2YKLQl3ZWxjb21lLWZpbGUtbGlzdCBvciBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0LCB0aGUgY29udGFpbmVyCi0JbXVzdCBjb25jYXRlbmF0ZSB0aGUgZWxlbWVudCBjb250ZW50cy4gIFRoZSBtdWx0aXBsZSBvY2N1cmVuY2UKLQlvZiB0aGUgZWxlbWVudCBkaXN0cmlidXRhYmxlIGlzIHJlZHVuZGFudCBhbmQgdGhlIGNvbnRhaW5lcgotCXRyZWF0cyB0aGF0IGNhc2UgZXhhY3RseSBpbiB0aGUgc2FtZSB3YXkgd2hlbiB0aGVyZSBpcyBvbmx5Ci0Jb25lIGRpc3RyaWJ1dGFibGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtc2VydmxldC1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHNlcnZsZXQgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlcnZsZXQuCi0JICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnNlcnZsZXQiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpzZXJ2bGV0LW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLWZpbHRlci1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGZpbHRlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsdGVyLgotCSAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpmaWx0ZXIiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpmaWx0ZXItbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVqYi1sb2NhbC1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgd2ViCi0JICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotCSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLWxvY2FsLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgd2ViCi0JICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotCSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLQkgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0JICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLgotCSAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLQkgIGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLQkgIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLQkgIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuCi0JICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotCSAgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0JICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgd2ViCi0JICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZQotCSAgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnYtZW50cnkiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplbnYtZW50cnktbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6a2V5IG5hbWU9IndlYi1hcHAtcm9sZS1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBBIHJvbGUtbmFtZS1rZXkgaXMgc3BlY2lmaWVkIHRvIGFsbG93IHRoZSByZWZlcmVuY2VzCi0JICBmcm9tIHRoZSBzZWN1cml0eS1yb2xlLXJlZnMuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpzZWN1cml0eS1yb2xlIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cm9sZS1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5PgotCi0gICAgPHhzZDprZXlyZWYgbmFtZT0id2ViLWFwcC1yb2xlLW5hbWUtcmVmZXJlbmNlcyIKLQkJcmVmZXI9ImphdmFlZTp3ZWItYXBwLXJvbGUtbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGtleXJlZiBpbmRpY2F0ZXMgdGhlIHJlZmVyZW5jZXMgZnJvbQotCSAgc2VjdXJpdHktcm9sZS1yZWYgdG8gYSBzcGVjaWZpZWQgcm9sZS1uYW1lLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6c2VydmxldC9qYXZhZWU6c2VjdXJpdHktcm9sZS1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyb2xlLWxpbmsiLz4KLSAgICA8L3hzZDprZXlyZWY+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXV0aC1jb25zdHJhaW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGF1dGgtY29uc3RyYWludFR5cGUgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQKLQlzaG91bGQgYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlCi0JY29sbGVjdGlvbi4gVGhlIHJvbGUtbmFtZSB1c2VkIGhlcmUgbXVzdCBlaXRoZXIgY29ycmVzcG9uZAotCXRvIHRoZSByb2xlLW5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzCi0JZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIG9yIGJlIHRoZSBzcGVjaWFsbHkKLQlyZXNlcnZlZCByb2xlLW5hbWUgIioiIHRoYXQgaXMgYSBjb21wYWN0IHN5bnRheCBmb3IKLQlpbmRpY2F0aW5nIGFsbCByb2xlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJZiBib3RoICIqIgotCWFuZCByb2xlbmFtZXMgYXBwZWFyLCB0aGUgY29udGFpbmVyIGludGVycHJldHMgdGhpcyBhcyBhbGwKLQlyb2xlcy4gIElmIG5vIHJvbGVzIGFyZSBkZWZpbmVkLCBubyB1c2VyIGlzIGFsbG93ZWQgYWNjZXNzCi0JdG8gdGhlIHBvcnRpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXNjcmliZWQgYnkgdGhlCi0JY29udGFpbmluZyBzZWN1cml0eS1jb25zdHJhaW50LiAgVGhlIGNvbnRhaW5lciBtYXRjaGVzCi0Jcm9sZSBuYW1lcyBjYXNlIHNlbnNpdGl2ZWx5IHdoZW4gZGV0ZXJtaW5pbmcgYWNjZXNzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF1dGgtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGF1dGgtbWV0aG9kVHlwZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLQltZWNoYW5pc20gZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24uIEFzIGEgcHJlcmVxdWlzaXRlIHRvCi0JZ2FpbmluZyBhY2Nlc3MgdG8gYW55IHdlYiByZXNvdXJjZXMgd2hpY2ggYXJlIHByb3RlY3RlZCBieQotCWFuIGF1dGhvcml6YXRpb24gY29uc3RyYWludCwgYSB1c2VyIG11c3QgaGF2ZSBhdXRoZW50aWNhdGVkCi0JdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWVjaGFuaXNtLiBMZWdhbCB2YWx1ZXMgYXJlICJCQVNJQyIsCi0JIkRJR0VTVCIsICJGT1JNIiwgIkNMSUVOVC1DRVJUIiwgb3IgYSB2ZW5kb3Itc3BlY2lmaWMKLQlhdXRoZW50aWNhdGlvbiBzY2hlbWUuCi0KLQlVc2VkIGluOiBsb2dpbi1jb25maWcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc3BhdGNoZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZGlzcGF0Y2hlciBoYXMgZm91ciBsZWdhbCB2YWx1ZXM6IEZPUldBUkQsIFJFUVVFU1QsIElOQ0xVREUsCi0JYW5kIEVSUk9SLiBBIHZhbHVlIG9mIEZPUldBUkQgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQKLQl1bmRlciBSZXF1ZXN0RGlzcGF0Y2hlci5mb3J3YXJkKCkgY2FsbHMuICBBIHZhbHVlIG9mIFJFUVVFU1QKLQltZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZCB1bmRlciBvcmRpbmFyeSBjbGllbnQgY2FsbHMgdG8KLQl0aGUgcGF0aCBvciBzZXJ2bGV0LiBBIHZhbHVlIG9mIElOQ0xVREUgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlCi0JYXBwbGllZCB1bmRlciBSZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCkgY2FsbHMuICBBIHZhbHVlIG9mCi0JRVJST1IgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIgdGhlIGVycm9yIHBhZ2UKLQltZWNoYW5pc20uICBUaGUgYWJzZW5jZSBvZiBhbnkgZGlzcGF0Y2hlciBlbGVtZW50cyBpbiBhCi0JZmlsdGVyLW1hcHBpbmcgaW5kaWNhdGVzIGEgZGVmYXVsdCBvZiBhcHBseWluZyBmaWx0ZXJzIG9ubHkgdW5kZXIKLQlvcmRpbmFyeSBjbGllbnQgY2FsbHMgdG8gdGhlIHBhdGggb3Igc2VydmxldC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGT1JXQVJEIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5DTFVERSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFUVVFU1QiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUlJPUiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW5jb2RpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZW5jb2RpbmdUeXBlIGRlZmluZXMgSUFOQSBjaGFyYWN0ZXIgc2V0cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iW15cc10rIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVycm9yLWNvZGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZXJyb3ItY29kZSBjb250YWlucyBhbiBIVFRQIGVycm9yIGNvZGUsIGV4OiA0MDQKLQotCVVzZWQgaW46IGVycm9yLXBhZ2UKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6eHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSJcZHszfSIvPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlcnJvci1wYWdlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVycm9yLXBhZ2VUeXBlIGNvbnRhaW5zIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGVycm9yIGNvZGUKLQlvciBleGNlcHRpb24gdHlwZSB0byB0aGUgcGF0aCBvZiBhIHJlc291cmNlIGluIHRoZSB3ZWIKLQlhcHBsaWNhdGlvbi4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJlcnJvci1jb2RlIgotCQkgICAgIHR5cGU9ImphdmFlZTplcnJvci1jb2RlVHlwZSIvPgotCi0JPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi10eXBlIgotCQkgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGV4Y2VwdGlvbi10eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0JICAgICAgbmFtZSBvZiBhIEphdmEgZXhjZXB0aW9uIHR5cGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2F0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6d2FyLXBhdGhUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZQotCSAgICByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JICAgIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gbXVzdCBoYXZlCi0JICAgIGEgbGVhZGluZyBgLycuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmlsdGVyLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWNsYXJhdGlvbiBvZiB0aGUgZmlsdGVyIG1hcHBpbmdzIGluIHRoaXMgd2ViCi0JYXBwbGljYXRpb24gaXMgZG9uZSBieSB1c2luZyBmaWx0ZXItbWFwcGluZ1R5cGUuCi0JVGhlIGNvbnRhaW5lciB1c2VzIHRoZSBmaWx0ZXItbWFwcGluZwotCWRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycyB0byBhcHBseSB0byBhIHJlcXVlc3QsCi0JYW5kIGluIHdoYXQgb3JkZXIuIFRoZSBjb250YWluZXIgbWF0Y2hlcyB0aGUgcmVxdWVzdCBVUkkgdG8KLQlhIFNlcnZsZXQgaW4gdGhlIG5vcm1hbCB3YXkuIFRvIGRldGVybWluZSB3aGljaCBmaWx0ZXJzIHRvCi0JYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uCi0Jc2VydmxldC1uYW1lLCBvciBvbiB1cmwtcGF0dGVybiBmb3IgZWFjaCBmaWx0ZXItbWFwcGluZwotCWVsZW1lbnQsIGRlcGVuZGluZyBvbiB3aGljaCBzdHlsZSBpcyB1c2VkLiBUaGUgb3JkZXIgaW4KLQl3aGljaCBmaWx0ZXJzIGFyZSBpbnZva2VkIGlzIHRoZSBvcmRlciBpbiB3aGljaAotCWZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0aGF0IG1hdGNoIGEgcmVxdWVzdCBVUkkgZm9yIGEKLQlzZXJ2bGV0IGFwcGVhciBpbiB0aGUgbGlzdCBvZiBmaWx0ZXItbWFwcGluZyBlbGVtZW50cy5UaGUKLQlmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgZmlsdGVyLW5hbWUKLQlzdWItZWxlbWVudHMgb2Ygb25lIG9mIHRoZSBmaWx0ZXIgZGVjbGFyYXRpb25zIGluIHRoZQotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmZpbHRlci1uYW1lVHlwZSIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotCQkgICAgIHR5cGU9ImphdmFlZTp1cmwtcGF0dGVyblR5cGUiLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1uYW1lIgotCQkgICAgIHR5cGU9ImphdmFlZTpzZXJ2bGV0LW5hbWVUeXBlIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGF0Y2hlciIKLQkJICAgdHlwZT0iamF2YWVlOmRpc3BhdGNoZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iNCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlci1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZmlsdGVyIGlzIGRlY2xhcmUKLQlieSB1c2luZyBmaWx0ZXItbmFtZVR5cGUuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIG1hcCB0aGUKLQlmaWx0ZXIuICBFYWNoIGZpbHRlciBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYgotCWFwcGxpY2F0aW9uLgotCi0JVXNlZCBpbjogZmlsdGVyLCBmaWx0ZXItbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6bm9uRW1wdHlTdHJpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBmaWx0ZXJUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhIGZpbHRlciBpbiB0aGUgd2ViCi0JYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvIGVpdGhlciBhIHNlcnZsZXQgb3IgYQotCVVSTCBwYXR0ZXJuIGluIHRoZSBmaWx0ZXItbWFwcGluZyBlbGVtZW50LCB1c2luZyB0aGUKLQlmaWx0ZXItbmFtZSB2YWx1ZSB0byByZWZlcmVuY2UuIEZpbHRlcnMgY2FuIGFjY2VzcyB0aGUKLQlpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50Ci0JZGVzY3JpcHRvciBhdCBydW50aW1lIHZpYSB0aGUgRmlsdGVyQ29uZmlnIGludGVyZmFjZS4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZmlsdGVyLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotCQkgICB0eXBlPSJqYXZhZWU6cGFyYW0tdmFsdWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcwotCSAgICBhbiBpbml0aWFsaXphdGlvbiBwYXJhbSBvZiBhIHNlcnZsZXQgZmlsdGVyCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZm9ybS1sb2dpbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZm9ybS1sb2dpbi1jb25maWdUeXBlIHNwZWNpZmllcyB0aGUgbG9naW4gYW5kIGVycm9yCi0JcGFnZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkCi0JYXV0aGVudGljYXRpb24gaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgotCi0JVXNlZCBpbjogbG9naW4tY29uZmlnCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWxvZ2luLXBhZ2UiCi0JCSAgIHR5cGU9ImphdmFlZTp3YXItcGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYgotCSAgICBhcHAgd2hlcmUgdGhlIHBhZ2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9naW4gY2FuIGJlCi0JICAgIGZvdW5kLiAgVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkCi0JICAgIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWVycm9yLXBhZ2UiCi0JCSAgIHR5cGU9ImphdmFlZTp3YXItcGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZm9ybS1lcnJvci1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4KLQkgICAgdGhlIHdlYiBhcHAgd2hlcmUgdGhlIGVycm9yIHBhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQKLQkgICAgd2hlbiBsb2dpbiBpcyBub3Qgc3VjY2Vzc2Z1bCBjYW4gYmUgZm91bmQuCi0JICAgIFRoZSBwYXRoIGJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZAotCSAgICByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJodHRwLW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JQSBIVFRQIG1ldGhvZCB0eXBlIGFzIGRlZmluZWQgaW4gSFRUUCAxLjEgc2VjdGlvbiAyLjIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlsmIzMzOy0mIzEyNjstW1woXCkmIzYwOyYjNjI7QCw7OiYjMzQ7L1xbXF0/PVx7XH1cXFxwe1p9XV0rIi8+Ci0gICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9hZC1vbi1zdGFydHVwVHlwZSI+Ci0gICAgPHhzZDp1bmlvbiBtZW1iZXJUeXBlcz0iamF2YWVlOm51bGwtY2hhclR5cGUgeHNkOmludGVnZXIiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IGNvbnRhaW5zIG9uZSBvciBtb3JlCi0JbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcocykuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmciCi0JCSAgIHR5cGU9ImphdmFlZTpsb2NhbGUtZW5jb2RpbmctbWFwcGluZ1R5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcgY29udGFpbnMgbG9jYWxlIG5hbWUgYW5kCi0JZW5jb2RpbmcgbmFtZS4gVGhlIGxvY2FsZSBuYW1lIG11c3QgYmUgZWl0aGVyICJMYW5ndWFnZS1jb2RlIiwKLQlzdWNoIGFzICJqYSIsIGRlZmluZWQgYnkgSVNPLTYzOSBvciAiTGFuZ3VhZ2UtY29kZV9Db3VudHJ5LWNvZGUiLAotCXN1Y2ggYXMgImphX0pQIi4gICJDb3VudHJ5IGNvZGUiIGlzIGRlZmluZWQgYnkgSVNPLTMxNjYuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlIgotCQkgICB0eXBlPSJqYXZhZWU6bG9jYWxlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY29kaW5nIgotCQkgICB0eXBlPSJqYXZhZWU6ZW5jb2RpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NhbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9jYWxlVHlwZSBkZWZpbmVzIHZhbGlkIGxvY2FsZSBkZWZpbmVkIGJ5IElTTy02MzktMQotCWFuZCBJU08tMzE2Ni4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iW2Etel17Mn0oX3wtKT8oW1xwe0x9XC1ccHtOZH1dezJ9KT8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naW4tY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvZ2luLWNvbmZpZ1R5cGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi0JbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlCi0JdXNlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlCi0JbmVlZGVkIGJ5IHRoZSBmb3JtIGxvZ2luIG1lY2hhbmlzbS4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoLW1ldGhvZCIKLQkJICAgdHlwZT0iamF2YWVlOmF1dGgtbWV0aG9kVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhbG0tbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlYWxtIG5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJlYWxtIG5hbWUgdG8KLQkgICAgdXNlIGluIEhUVFAgQmFzaWMgYXV0aG9yaXphdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWxvZ2luLWNvbmZpZyIKLQkJICAgdHlwZT0iamF2YWVlOmZvcm0tbG9naW4tY29uZmlnVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWltZS1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1pbWUtbWFwcGluZ1R5cGUgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBleHRlbnNpb24KLQlhbmQgYSBtaW1lIHR5cGUuCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZXh0ZW5zaW9uIGVsZW1lbnQgY29udGFpbnMgYSBzdHJpbmcgZGVzY3JpYmluZyBhbgotCSAgZXh0ZW5zaW9uLiBleGFtcGxlOiAidHh0IgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW1lLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTptaW1lLXR5cGVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWltZS10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1pbWUtdHlwZVR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIGRlZmluZWQgbWltZSB0eXBlLgotCi0JRXhhbXBsZToKLQkidGV4dC9wbGFpbiIKLQotCVVzZWQgaW46IG1pbWUtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iW15ccHtDY31eXHNdKy9bXlxwe0NjfV5cc10rIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9uRW1wdHlTdHJpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JVGhpcyB0eXBlIGRlZmluZXMgYSBzdHJpbmcgd2hpY2ggY29udGFpbnMgYXQgbGVhc3Qgb25lCi0JY2hhcmFjdGVyLgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDptaW5MZW5ndGggdmFsdWU9IjEiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im51bGwtY2hhclR5cGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktY29uc3RyYWludFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZWN1cml0eS1jb25zdHJhaW50VHlwZSBpcyB1c2VkIHRvIGFzc29jaWF0ZQotCXNlY3VyaXR5IGNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlCi0JY29sbGVjdGlvbnMKLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpkaXNwbGF5LW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLXJlc291cmNlLWNvbGxlY3Rpb24iCi0JCSAgIHR5cGU9ImphdmFlZTp3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aC1jb25zdHJhaW50IgotCQkgICB0eXBlPSJqYXZhZWU6YXV0aC1jb25zdHJhaW50VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1kYXRhLWNvbnN0cmFpbnQiCi0JCSAgIHR5cGU9ImphdmFlZTp1c2VyLWRhdGEtY29uc3RyYWludFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXQtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2bGV0LW1hcHBpbmdUeXBlIGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYQotCXNlcnZsZXQgYW5kIGEgdXJsIHBhdHRlcm4uCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotCQkgICB0eXBlPSJqYXZhZWU6dXJsLXBhdHRlcm5UeXBlIgotICAgICAgICAgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldC1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUKLQlzZXJ2bGV0LiBFYWNoIHNlcnZsZXQgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIKLQlhcHBsaWNhdGlvbi4KLSAgICAgICAgVGhlIHNwZWNpYWwgc2VydmxldCBuYW1lIG9mICIqIiBtYXkgYmUgdXNlZCB0byByZWZlcmVuY2UgYWxsCi0gICAgICAgIHNlcnZsZXRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6bm9uRW1wdHlTdHJpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmxldFR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGEgc2VydmxldC4KLQlJdCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhCi0Jc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAKLQllbGVtZW50IGlzIHByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kCi0JbG9hZGVkLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtY2xhc3MiCi0JCSAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgc2VydmxldC1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseQotCSAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBzZXJ2bGV0LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0KLQk8eHNkOmVsZW1lbnQgbmFtZT0ianNwLWZpbGUiCi0JCSAgICAgdHlwZT0iamF2YWVlOmpzcC1maWxlVHlwZSIvPgotCi0gICAgICA8L3hzZDpjaG9pY2U+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotCQkgICB0eXBlPSJqYXZhZWU6cGFyYW0tdmFsdWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9hZC1vbi1zdGFydHVwIgotCQkgICB0eXBlPSJqYXZhZWU6bG9hZC1vbi1zdGFydHVwVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMKLQkgICAgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkIChpbnN0YW50aWF0ZWQgYW5kIGhhdmUKLQkgICAgaXRzIGluaXQoKSBjYWxsZWQpIG9uIHRoZSBzdGFydHVwIG9mIHRoZSB3ZWIKLQkgICAgYXBwbGljYXRpb24uIFRoZSBvcHRpb25hbCBjb250ZW50cyBvZiB0aGVzZQotCSAgICBlbGVtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbgotCSAgICB3aGljaCB0aGUgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkLiBJZiB0aGUgdmFsdWUKLQkgICAgaXMgYSBuZWdhdGl2ZSBpbnRlZ2VyLCBvciB0aGUgZWxlbWVudCBpcyBub3QKLQkgICAgcHJlc2VudCwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgdGhlIHNlcnZsZXQKLQkgICAgd2hlbmV2ZXIgaXQgY2hvb3Nlcy4gSWYgdGhlIHZhbHVlIGlzIGEgcG9zaXRpdmUKLQkgICAgaW50ZWdlciBvciAwLCB0aGUgY29udGFpbmVyIG11c3QgbG9hZCBhbmQKLQkgICAgaW5pdGlhbGl6ZSB0aGUgc2VydmxldCBhcyB0aGUgYXBwbGljYXRpb24gaXMKLQkgICAgZGVwbG95ZWQuIFRoZSBjb250YWluZXIgbXVzdCBndWFyYW50ZWUgdGhhdAotCSAgICBzZXJ2bGV0cyBtYXJrZWQgd2l0aCBsb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkCi0JICAgIGJlZm9yZSBzZXJ2bGV0cyBtYXJrZWQgd2l0aCBoaWdoZXIgaW50ZWdlcnMuIFRoZQotCSAgICBjb250YWluZXIgbWF5IGNob29zZSB0aGUgb3JkZXIgb2YgbG9hZGluZyBvZgotCSAgICBzZXJ2bGV0cyB3aXRoIHRoZSBzYW1lIGxvYWQtb24tc3RhcnQtdXAgdmFsdWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icnVuLWFzIgotCQkgICB0eXBlPSJqYXZhZWU6cnVuLWFzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXNzaW9uLWNvbmZpZ1R5cGUgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzCi0JZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tdGltZW91dCIKLQkJICAgdHlwZT0iamF2YWVlOnhzZEludGVnZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc2Vzc2lvbi10aW1lb3V0IGVsZW1lbnQgZGVmaW5lcyB0aGUgZGVmYXVsdAotCSAgICBzZXNzaW9uIHRpbWVvdXQgaW50ZXJ2YWwgZm9yIGFsbCBzZXNzaW9ucyBjcmVhdGVkCi0JICAgIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgc3BlY2lmaWVkIHRpbWVvdXQKLQkgICAgbXVzdCBiZSBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KLQkgICAgSWYgdGhlIHRpbWVvdXQgaXMgMCBvciBsZXNzLCB0aGUgY29udGFpbmVyIGVuc3VyZXMKLQkgICAgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHNlc3Npb25zIGlzIG5ldmVyIHRvIHRpbWUKLQkgICAgb3V0LiBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGNvbnRhaW5lcgotCSAgICBtdXN0IHNldCBpdHMgZGVmYXVsdCB0aW1lb3V0IHBlcmlvZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uCi0JYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCi0JQ09ORklERU5USUFMLiBOT05FIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90Ci0JcmVxdWlyZSBhbnkgdHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMKLQl0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUKLQljbGllbnQgYW5kIHNlcnZlciBiZSBzZW50IGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4ndCBiZQotCWNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uCi0JcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhIGZhc2hpb24gdGhhdAotCXByZXZlbnRzIG90aGVyIGVudGl0aWVzIGZyb20gb2JzZXJ2aW5nIHRoZSBjb250ZW50cyBvZiB0aGUKLQl0cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUgSU5URUdSQUwgb3IKLQlDT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMKLQlyZXF1aXJlZC4KLQotCVVzZWQgaW46IHVzZXItZGF0YS1jb25zdHJhaW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHUkFMIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09ORklERU5USUFMIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgaG93Ci0JZGF0YSBjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlCi0JcHJvdGVjdGVkLgotCi0JVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0LWd1YXJhbnRlZSIKLQkJICAgdHlwZT0iamF2YWVlOnRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2FyLXBhdGhUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSBhIHBhdGggc3RhcnRpbmcKLQl3aXRoIGEgIi8iIGFuZCBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiBhIFdBUgotCWZpbGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iLy4qIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ3ZWItYXBwLXZlcnNpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgY29udGFpbnMgdGhlIHJlY29nbml6ZWQgdmVyc2lvbnMgb2YKLQl3ZWItYXBwbGljYXRpb24gc3VwcG9ydGVkLiBJdCBpcyB1c2VkIHRvIGRlc2lnbmF0ZSB0aGUKLQl2ZXJzaW9uIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyLjUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViLWFwcFR5cGUiPgotCi0gICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXN0cmlidXRhYmxlIgotCQkgICB0eXBlPSJqYXZhZWU6ZW1wdHlUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGV4dC1wYXJhbSIKLQkJICAgdHlwZT0iamF2YWVlOnBhcmFtLXZhbHVlVHlwZSI+Ci0KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGNvbnRleHQtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24KLQkgICAgb2YgYSB3ZWIgYXBwbGljYXRpb24ncyBzZXJ2bGV0IGNvbnRleHQKLQkgICAgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlciIKLQkJICAgdHlwZT0iamF2YWVlOmZpbHRlclR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItbWFwcGluZyIKLQkJICAgdHlwZT0iamF2YWVlOmZpbHRlci1tYXBwaW5nVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyIgotCQkgICB0eXBlPSJqYXZhZWU6bGlzdGVuZXJUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldCIKLQkJICAgdHlwZT0iamF2YWVlOnNlcnZsZXRUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1tYXBwaW5nIgotCQkgICB0eXBlPSJqYXZhZWU6c2VydmxldC1tYXBwaW5nVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tY29uZmlnIgotCQkgICB0eXBlPSJqYXZhZWU6c2Vzc2lvbi1jb25maWdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWltZS1tYXBwaW5nIgotCQkgICB0eXBlPSJqYXZhZWU6bWltZS1tYXBwaW5nVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlbGNvbWUtZmlsZS1saXN0IgotCQkgICB0eXBlPSJqYXZhZWU6d2VsY29tZS1maWxlLWxpc3RUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3ItcGFnZSIKLQkJICAgdHlwZT0iamF2YWVlOmVycm9yLXBhZ2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLWNvbmZpZyIKLQkJICAgdHlwZT0iamF2YWVlOmpzcC1jb25maWdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktY29uc3RyYWludCIKLQkJICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4tY29uZmlnIgotCQkgICB0eXBlPSJqYXZhZWU6bG9naW4tY29uZmlnVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1yb2xlVHlwZSIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvblR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IgotCQkgICB0eXBlPSJqYXZhZWU6bG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdFR5cGUiLz4KLSAgICA8L3hzZDpjaG9pY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6d2ViLWFwcC12ZXJzaW9uVHlwZSIKLQkJICAgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGRlZmluZXMgd2hldGhlciB0aGlzCi0JICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIG90aGVyIHJlbGF0ZWQgZGVwbG95bWVudAotCSAgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbW9kdWxlIChlLmcuLCB3ZWIgc2VydmljZQotCSAgZGVzY3JpcHRvcnMpIGFyZSBjb21wbGV0ZSwgb3Igd2hldGhlciB0aGUgY2xhc3MKLQkgIGZpbGVzIGF2YWlsYWJsZSB0byB0aGlzIG1vZHVsZSBhbmQgcGFja2FnZWQgd2l0aAotCSAgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zCi0JICB0aGF0IHNwZWNpZnkgZGVwbG95bWVudCBpbmZvcm1hdGlvbi4KLQotCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQKLQkgIHRvb2wgbXVzdCBpZ25vcmUgYW55IGFubm90YXRpb25zIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50Ci0JICBpbmZvcm1hdGlvbiwgd2hpY2ggbWlnaHQgYmUgcHJlc2VudCBpbiB0aGUgY2xhc3MgZmlsZXMKLQkgIG9mIHRoZSBhcHBsaWNhdGlvbi4KLQotCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgbm90IHNwZWNpZmllZCBvciBpcyBzZXQgdG8KLQkgICJmYWxzZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBleGFtaW5lIHRoZSBjbGFzcwotCSAgZmlsZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBhbm5vdGF0aW9ucywgYXMKLQkgIHNwZWNpZmllZCBieSB0aGUgc3BlY2lmaWNhdGlvbnMuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0Ci0Jb2YgdGhlIHJlc291cmNlcyBhbmQgSFRUUCBtZXRob2RzIG9uIHRob3NlIHJlc291cmNlcyB3aXRoaW4KLQlhIHdlYiBhcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYKLQlubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludAotCWFwcGxpZXMgdG8gYWxsIEhUVFAgbWV0aG9kcy4KLQotCVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItcmVzb3VyY2UtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYgotCSAgICByZXNvdXJjZSBjb2xsZWN0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCi0JCSAgIHR5cGU9ImphdmFlZTp1cmwtcGF0dGVyblR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaHR0cC1tZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTpodHRwLW1ldGhvZFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWxjb21lLWZpbGUtbGlzdFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWxjb21lLWZpbGUtbGlzdCBjb250YWlucyBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VsY29tZQotCWZpbGVzIGVsZW1lbnRzLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlbGNvbWUtZmlsZSIKLQkJICAgdHlwZT0ieHNkOnN0cmluZyIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd2VsY29tZS1maWxlIGVsZW1lbnQgY29udGFpbnMgZmlsZSBuYW1lIHRvIHVzZQotCSAgICBhcyBhIGRlZmF1bHQgd2VsY29tZSBmaWxlLCBzdWNoIGFzIGluZGV4Lmh0bWwKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8zXzAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzNfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiY2RmNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzNfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgICAgICAgICB2ZXJzaW9uPSIzLjAiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgotICAgICAgCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAgIAotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uCi0gICAgICBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUKLSAgICAgICJMaWNlbnNlIikuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICAgIHRoZSBMaWNlbnNlLiBZb3UgY2FuIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAgIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCBvcgotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotICAgICAgTGljZW5zZS4KLSAgICAgIAotICAgICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIKLSAgICAgIE5vdGljZSBpbiBlYWNoIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdAotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAgICAgIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMKLSAgICAgIHByb3ZpZGVkIGJ5IFN1biBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlIGZpbGUKLSAgICAgIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiAgSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdCi0gICAgICByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAgICAgICJQb3J0aW9ucyBDb3B5cmlnaHRlZCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLSAgICAgIAotICAgICAgQ29udHJpYnV0b3Iocyk6Ci0gICAgICAKLSAgICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUKLSAgICAgIENEREwgb3Igb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcKLSAgICAgICJbQ29udHJpYnV0b3JdIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdQotICAgICAgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEgcmVjaXBpZW50IGhhcyB0aGUKLSAgICAgIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZQotICAgICAgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0byBpdHMKLSAgICAgIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMgotICAgICAgY29kZSBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlCi0gICAgICBvcHRpb24gYXBwbGllcyBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaAotICAgICAgb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbWwotICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIFNlcnZsZXQgMy4wIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAgICAgIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZCAiV0VCLUlORi93ZWIueG1sIiBpbiB0aGUKLSAgICAgIHdlYiBhcHBsaWNhdGlvbidzIHdhciBmaWxlLiAgQWxsIFNlcnZsZXQgZGVwbG95bWVudCBkZXNjcmlwdG9ycwotICAgICAgbXVzdCBpbmRpY2F0ZSB0aGUgd2ViIGFwcGxpY2F0aW9uIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRQotICAgICAgbmFtZXNwYWNlOgotICAgICAgCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgCi0gICAgICAKLSAgICAgIGFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgCi0gICAgICB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OiAKLSAgICAgIAotICAgICAgPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKLSAgICAgIHZlcnNpb249IjMuMCI+IAotICAgICAgLi4uCi0gICAgICA8L3dlYi1hcHA+Ci0gICAgICAKLSAgICAgIFRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotICAgICAgdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQotICAgICAgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLSAgICAgIAotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZAotICAgICAgCi0gICAgICBdXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAgICAgIAotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICAgICAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICAgICAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAgICAgIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gICAgICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgICAgIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249IndlYi1jb21tb25fM18wLnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLWFwcCIKLSAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp3ZWItYXBwVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQKLSAgICAgICAgZGVzY3JpcHRvciBmb3IgYSB3ZWIgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgdGhlIHN1Yi1lbGVtZW50cwotICAgICAgICBvZiB0aGlzIGVsZW1lbnQgY2FuIGJlIGluIHRoZSBhcmJpdHJhcnkgb3JkZXIuIEJlY2F1c2Ugb2YKLSAgICAgICAgdGhhdCwgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgZWxlbWVudHMgb2YgZGlzdHJpYnV0YWJsZSwKLSAgICAgICAgc2Vzc2lvbi1jb25maWcsIHdlbGNvbWUtZmlsZS1saXN0LCBqc3AtY29uZmlnLCBsb2dpbi1jb25maWcsCi0gICAgICAgIGFuZCBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IHdhcyBjaGFuZ2VkIGZyb20gIj8iIHRvICIqIgotICAgICAgICBpbiB0aGlzIHNjaGVtYS4gIEhvd2V2ZXIsIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaW5zdGFuY2UKLSAgICAgICAgZmlsZSBtdXN0IG5vdCBjb250YWluIG11bHRpcGxlIGVsZW1lbnRzIG9mIHNlc3Npb24tY29uZmlnLAotICAgICAgICBqc3AtY29uZmlnLCBhbmQgbG9naW4tY29uZmlnLiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cyBvZgotICAgICAgICB3ZWxjb21lLWZpbGUtbGlzdCBvciBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0LCB0aGUgY29udGFpbmVyCi0gICAgICAgIG11c3QgY29uY2F0ZW5hdGUgdGhlIGVsZW1lbnQgY29udGVudHMuICBUaGUgbXVsdGlwbGUgb2NjdXJlbmNlCi0gICAgICAgIG9mIHRoZSBlbGVtZW50IGRpc3RyaWJ1dGFibGUgaXMgcmVkdW5kYW50IGFuZCB0aGUgY29udGFpbmVyCi0gICAgICAgIHRyZWF0cyB0aGF0IGNhc2UgZXhhY3RseSBpbiB0aGUgc2FtZSB3YXkgd2hlbiB0aGVyZSBpcyBvbmx5Ci0gICAgICAgIG9uZSBkaXN0cmlidXRhYmxlLiAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWNvbW1vbi1zZXJ2bGV0LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZXJ2bGV0LgotICAgICAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpzZXJ2bGV0Ii8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6c2VydmxldC1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1jb21tb24tZmlsdGVyLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBmaWx0ZXIgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbHRlci4KLSAgICAgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZmlsdGVyIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZmlsdGVyLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWNvbW1vbi1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBlamItbG9jYWwtcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICAgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIKLSAgICAgICAgICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLSAgICAgICAgICB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgIAotICAgICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLWxvY2FsLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItY29tbW9uLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgICAgICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIHdlYgotICAgICAgICAgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotICAgICAgICAgIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1jb21tb24tcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotICAgICAgICAgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0gICAgICAgICAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KLSAgICAgICAgICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotICAgICAgICAgIGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItY29tbW9uLW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotICAgICAgICAgIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLSAgICAgICAgICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLgotICAgICAgICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52Ci0gICAgICAgICAgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWNvbW1vbi1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0gICAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJlcy1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItY29tbW9uLWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHdlYgotICAgICAgICAgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLSAgICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZQotICAgICAgICAgIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5Ii8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDprZXkgbmFtZT0id2ViLWNvbW1vbi1yb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgQSByb2xlLW5hbWUta2V5IGlzIHNwZWNpZmllZCB0byBhbGxvdyB0aGUgcmVmZXJlbmNlcwotICAgICAgICAgIGZyb20gdGhlIHNlY3VyaXR5LXJvbGUtcmVmcy4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6c2VjdXJpdHktcm9sZSIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJvbGUtbmFtZSIvPgotICAgIDwveHNkOmtleT4KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJ3ZWItY29tbW9uLXJvbGUtbmFtZS1yZWZlcmVuY2VzIgotICAgICAgICAgICAgICAgIHJlZmVyPSJqYXZhZWU6d2ViLWNvbW1vbi1yb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGtleXJlZiBpbmRpY2F0ZXMgdGhlIHJlZmVyZW5jZXMgZnJvbQotICAgICAgICAgIHNlY3VyaXR5LXJvbGUtcmVmIHRvIGEgc3BlY2lmaWVkIHJvbGUtbmFtZS4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6c2VydmxldC9qYXZhZWU6c2VjdXJpdHktcm9sZS1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpyb2xlLWxpbmsiLz4KLSAgICA8L3hzZDprZXlyZWY+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWNvbW1vbl8zXzAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItY29tbW9uXzNfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTRiYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItY29tbW9uXzNfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICAgdmVyc2lvbj0iMy4wIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLSAgICAgIAotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgICAKLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbgotICAgICAgRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlCi0gICAgICAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgICB0aGUgTGljZW5zZS4gWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwgb3IKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLSAgICAgIExpY2Vuc2UuCi0gICAgICAKLSAgICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyCi0gICAgICBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gICAgICBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzCi0gICAgICBwcm92aWRlZCBieSBTdW4gaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZSBmaWxlCi0gICAgICB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4gIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nCi0gICAgICBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBbXQotICAgICAgcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgICAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0gICAgICAKLSAgICAgIENvbnRyaWJ1dG9yKHMpOgotICAgICAgCi0gICAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlCi0gICAgICBDRERMIG9yIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nCi0gICAgICAiW0NvbnRyaWJ1dG9yXSBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UKLSAgICAgIGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhIHJlY2lwaWVudCBoYXMgdGhlCi0gICAgICBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUKLSAgICAgIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8gaXRzCi0gICAgICBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIKLSAgICAgIGNvZGUgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZQotICAgICAgb3B0aW9uIGFwcGxpZXMgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2gKLSAgICAgIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0IGhvbGRlci4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBW1sKLSAgICAgIFRoaXMgaXMgdGhlIGNvbW1vbiBYTUwgU2NoZW1hIGZvciB0aGUgU2VydmxldCAzLjAgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICAgICAgVGhpcyBmaWxlIGlzIGluIHR1cm4gdXNlZCBieSB3ZWIueG1sIGFuZCB3ZWItZnJhZ21lbnQueG1sCi0gICAgICB3ZWIgYXBwbGljYXRpb24ncyB3YXIgZmlsZS4gIEFsbCBTZXJ2bGV0IGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKLSAgICAgIG11c3QgaW5kaWNhdGUgdGhlIHdlYiBjb21tb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFCi0gICAgICBuYW1lc3BhY2U6Ci0gICAgICAKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSAKLSAgICAgIAotICAgICAgYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSAKLSAgICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6IAotICAgICAgCi0gICAgICA8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgotICAgICAgdmVyc2lvbj0iMy4wIj4gCi0gICAgICAuLi4KLSAgICAgIDwvd2ViLWFwcD4KLSAgICAgIAotICAgICAgVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0gICAgICB0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKYXZhIEVFCi0gICAgICBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotICAgICAgCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWNvbW1vbl8zXzAueHNkCi0gICAgICAKLSAgICAgIF1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotICAgICAgCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gICAgICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gICAgICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gICAgICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICAgICAgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLSAgICAgIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICAgICAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzYueHNkIi8+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqc3BfMl8yLnhzZCIvPgotCi0gIDx4c2Q6Z3JvdXAgbmFtZT0id2ViLWNvbW1vblR5cGUiPgotICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzdHJpYnV0YWJsZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZW1wdHlUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGV4dC1wYXJhbSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGFyYW0tdmFsdWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGNvbnRleHQtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24KLSAgICAgICAgICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0Ci0gICAgICAgICAgICBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmaWx0ZXJUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW1hcHBpbmciCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZpbHRlci1tYXBwaW5nVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsaXN0ZW5lclR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZXJ2bGV0VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbWFwcGluZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VydmxldC1tYXBwaW5nVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tY29uZmlnIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZXNzaW9uLWNvbmZpZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW1lLW1hcHBpbmciCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1pbWUtbWFwcGluZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWxjb21lLWZpbGUtbGlzdCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6d2VsY29tZS1maWxlLWxpc3RUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3ItcGFnZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZXJyb3ItcGFnZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtY29uZmlnIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqc3AtY29uZmlnVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWNvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4tY29uZmlnIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsb2dpbi1jb25maWdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktcm9sZVR5cGUiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvblR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0VHlwZSIvPgotICAgIDwveHNkOmNob2ljZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLSAgPHhzZDphdHRyaWJ1dGVHcm91cCBuYW1lPSJ3ZWItY29tbW9uLWF0dHJpYnV0ZXMiPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOndlYi1hcHAtdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBkZWZpbmVzIHdoZXRoZXIgdGhpcwotICAgICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgb3RoZXIgcmVsYXRlZCBkZXBsb3ltZW50Ci0gICAgICAgICAgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbW9kdWxlIChlLmcuLCB3ZWIgc2VydmljZQotICAgICAgICAgIGRlc2NyaXB0b3JzKSBhcmUgY29tcGxldGUsIG9yIHdoZXRoZXIgdGhlIGNsYXNzCi0gICAgICAgICAgZmlsZXMgYXZhaWxhYmxlIHRvIHRoaXMgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoCi0gICAgICAgICAgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zCi0gICAgICAgICAgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQgaW5mb3JtYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgICAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQKLSAgICAgICAgICB0b29sIG11c3QgaWdub3JlIGFueSBhbm5vdGF0aW9ucyB0aGF0IHNwZWNpZnkgZGVwbG95bWVudAotICAgICAgICAgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcwotICAgICAgICAgIG9mIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0bwotICAgICAgICAgICJmYWxzZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBleGFtaW5lIHRoZSBjbGFzcwotICAgICAgICAgIGZpbGVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgYW5ub3RhdGlvbnMsIGFzCi0gICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucy4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDphdHRyaWJ1dGVHcm91cD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWItYXBwVHlwZSI+Ci0gICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtb2R1bGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTp3ZWItY29tbW9uVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFic29sdXRlLW9yZGVyaW5nIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphYnNvbHV0ZU9yZGVyaW5nVHlwZSIvPgotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZUdyb3VwIHJlZj0iamF2YWVlOndlYi1jb21tb24tYXR0cmlidXRlcyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWItZnJhZ21lbnRUeXBlIj4KLSAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6d2ViLWNvbW1vblR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlcmluZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6b3JkZXJpbmdUeXBlIi8+Ci0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlR3JvdXAgcmVmPSJqYXZhZWU6d2ViLWNvbW1vbi1hdHRyaWJ1dGVzIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF1dGgtY29uc3RyYWludFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYXV0aC1jb25zdHJhaW50VHlwZSBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdAotICAgICAgICBzaG91bGQgYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlCi0gICAgICAgIGNvbGxlY3Rpb24uIFRoZSByb2xlLW5hbWUgdXNlZCBoZXJlIG11c3QgZWl0aGVyIGNvcnJlc3BvbmQKLSAgICAgICAgdG8gdGhlIHJvbGUtbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMKLSAgICAgICAgZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIG9yIGJlIHRoZSBzcGVjaWFsbHkKLSAgICAgICAgcmVzZXJ2ZWQgcm9sZS1uYW1lICIqIiB0aGF0IGlzIGEgY29tcGFjdCBzeW50YXggZm9yCi0gICAgICAgIGluZGljYXRpbmcgYWxsIHJvbGVzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uIElmIGJvdGggIioiCi0gICAgICAgIGFuZCByb2xlbmFtZXMgYXBwZWFyLCB0aGUgY29udGFpbmVyIGludGVycHJldHMgdGhpcyBhcyBhbGwKLSAgICAgICAgcm9sZXMuICBJZiBubyByb2xlcyBhcmUgZGVmaW5lZCwgbm8gdXNlciBpcyBhbGxvd2VkIGFjY2VzcwotICAgICAgICB0byB0aGUgcG9ydGlvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlc2NyaWJlZCBieSB0aGUKLSAgICAgICAgY29udGFpbmluZyBzZWN1cml0eS1jb25zdHJhaW50LiAgVGhlIGNvbnRhaW5lciBtYXRjaGVzCi0gICAgICAgIHJvbGUgbmFtZXMgY2FzZSBzZW5zaXRpdmVseSB3aGVuIGRldGVybWluaW5nIGFjY2Vzcy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXV0aC1tZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGF1dGgtbWV0aG9kVHlwZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLSAgICAgICAgbWVjaGFuaXNtIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uLiBBcyBhIHByZXJlcXVpc2l0ZSB0bwotICAgICAgICBnYWluaW5nIGFjY2VzcyB0byBhbnkgd2ViIHJlc291cmNlcyB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5Ci0gICAgICAgIGFuIGF1dGhvcml6YXRpb24gY29uc3RyYWludCwgYSB1c2VyIG11c3QgaGF2ZSBhdXRoZW50aWNhdGVkCi0gICAgICAgIHVzaW5nIHRoZSBjb25maWd1cmVkIG1lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGFyZSAiQkFTSUMiLAotICAgICAgICAiRElHRVNUIiwgIkZPUk0iLCAiQ0xJRU5ULUNFUlQiLCBvciBhIHZlbmRvci1zcGVjaWZpYwotICAgICAgICBhdXRoZW50aWNhdGlvbiBzY2hlbWUuCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiBsb2dpbi1jb25maWcKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzcGF0Y2hlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZGlzcGF0Y2hlciBoYXMgZml2ZSBsZWdhbCB2YWx1ZXM6IEZPUldBUkQsIFJFUVVFU1QsCi0gICAgICAgIElOQ0xVREUsIEFTWU5DLCBhbmQgRVJST1IuCi0gICAgICAgIAotICAgICAgICBBIHZhbHVlIG9mIEZPUldBUkQgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIKLSAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIuZm9yd2FyZCgpIGNhbGxzLgotICAgICAgICBBIHZhbHVlIG9mIFJFUVVFU1QgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIKLSAgICAgICAgb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvIHRoZSBwYXRoIG9yIHNlcnZsZXQuCi0gICAgICAgIEEgdmFsdWUgb2YgSU5DTFVERSBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZCB1bmRlcgotICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCkgY2FsbHMuCi0gICAgICAgIEEgdmFsdWUgb2YgQVNZTkMgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIKLSAgICAgICAgY2FsbHMgZGlzcGF0Y2hlZCBmcm9tIGFuIEFzeW5jQ29udGV4dC4KLSAgICAgICAgQSB2YWx1ZSBvZiBFUlJPUiBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZCB1bmRlciB0aGUKLSAgICAgICAgZXJyb3IgcGFnZSBtZWNoYW5pc20uCi0gICAgICAgIAotICAgICAgICBUaGUgYWJzZW5jZSBvZiBhbnkgZGlzcGF0Y2hlciBlbGVtZW50cyBpbiBhIGZpbHRlci1tYXBwaW5nCi0gICAgICAgIGluZGljYXRlcyBhIGRlZmF1bHQgb2YgYXBwbHlpbmcgZmlsdGVycyBvbmx5IHVuZGVyIG9yZGluYXJ5Ci0gICAgICAgIGNsaWVudCBjYWxscyB0byB0aGUgcGF0aCBvciBzZXJ2bGV0LgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGT1JXQVJEIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOQ0xVREUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUVTVCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1lOQyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUlJPUiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXJyb3ItY29kZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZXJyb3ItY29kZSBjb250YWlucyBhbiBIVFRQIGVycm9yIGNvZGUsIGV4OiA0MDQKLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IGVycm9yLXBhZ2UKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6eHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iXGR7M30iLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXJyb3ItcGFnZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZXJyb3ItcGFnZVR5cGUgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXJyb3IgY29kZQotICAgICAgICBvciBleGNlcHRpb24gdHlwZSB0byB0aGUgcGF0aCBvZiBhIHJlc291cmNlIGluIHRoZSB3ZWIKLSAgICAgICAgYXBwbGljYXRpb24uCi0gICAgICAgIAotICAgICAgICBFcnJvci1wYWdlIGRlY2xhcmF0aW9ucyB1c2luZyB0aGUgZXhjZXB0aW9uLXR5cGUgZWxlbWVudCBpbgotICAgICAgICB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgdW5pcXVlIHVwIHRvIHRoZSBjbGFzcyBuYW1lIG9mCi0gICAgICAgIHRoZSBleGNlcHRpb24tdHlwZS4gU2ltaWxhcmx5LCBlcnJvci1wYWdlIGRlY2xhcmF0aW9ucyB1c2luZyB0aGUKLSAgICAgICAgc3RhdHVzLWNvZGUgZWxlbWVudCBtdXN0IGJlIHVuaXF1ZSBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICAgIHVwIHRvIHRoZSBzdGF0dXMgY29kZS4KLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IHdlYi1hcHAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlcnJvci1jb2RlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVycm9yLWNvZGVUeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24tdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbi10eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0gICAgICAgICAgICAgIG5hbWUgb2YgYSBKYXZhIGV4Y2VwdGlvbiB0eXBlLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6d2FyLXBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZQotICAgICAgICAgICAgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICAgICAgICAgICAgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBtdXN0IGhhdmUKLSAgICAgICAgICAgIGEgbGVhZGluZyBgLycuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmlsdGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBmaWx0ZXJUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhIGZpbHRlciBpbiB0aGUgd2ViCi0gICAgICAgIGFwcGxpY2F0aW9uLiBUaGUgZmlsdGVyIGlzIG1hcHBlZCB0byBlaXRoZXIgYSBzZXJ2bGV0IG9yIGEKLSAgICAgICAgVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nIHRoZQotICAgICAgICBmaWx0ZXItbmFtZSB2YWx1ZSB0byByZWZlcmVuY2UuIEZpbHRlcnMgY2FuIGFjY2VzcyB0aGUKLSAgICAgICAgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudAotICAgICAgICBkZXNjcmlwdG9yIGF0IHJ1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogd2ViLWFwcAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZpbHRlci1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGZpbHRlci4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzeW5jLXN1cHBvcnRlZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGFyYW0tdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMKLSAgICAgICAgICAgIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtIG9mIGEgc2VydmxldCBmaWx0ZXIKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWx0ZXItbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWNsYXJhdGlvbiBvZiB0aGUgZmlsdGVyIG1hcHBpbmdzIGluIHRoaXMgd2ViCi0gICAgICAgIGFwcGxpY2F0aW9uIGlzIGRvbmUgYnkgdXNpbmcgZmlsdGVyLW1hcHBpbmdUeXBlLiAKLSAgICAgICAgVGhlIGNvbnRhaW5lciB1c2VzIHRoZSBmaWx0ZXItbWFwcGluZwotICAgICAgICBkZWNsYXJhdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZpbHRlcnMgdG8gYXBwbHkgdG8gYSByZXF1ZXN0LAotICAgICAgICBhbmQgaW4gd2hhdCBvcmRlci4gVGhlIGNvbnRhaW5lciBtYXRjaGVzIHRoZSByZXF1ZXN0IFVSSSB0bwotICAgICAgICBhIFNlcnZsZXQgaW4gdGhlIG5vcm1hbCB3YXkuIFRvIGRldGVybWluZSB3aGljaCBmaWx0ZXJzIHRvCi0gICAgICAgIGFwcGx5IGl0IG1hdGNoZXMgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIGVpdGhlciBvbgotICAgICAgICBzZXJ2bGV0LW5hbWUsIG9yIG9uIHVybC1wYXR0ZXJuIGZvciBlYWNoIGZpbHRlci1tYXBwaW5nCi0gICAgICAgIGVsZW1lbnQsIGRlcGVuZGluZyBvbiB3aGljaCBzdHlsZSBpcyB1c2VkLiBUaGUgb3JkZXIgaW4KLSAgICAgICAgd2hpY2ggZmlsdGVycyBhcmUgaW52b2tlZCBpcyB0aGUgb3JkZXIgaW4gd2hpY2gKLSAgICAgICAgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRoYXQgbWF0Y2ggYSByZXF1ZXN0IFVSSSBmb3IgYQotICAgICAgICBzZXJ2bGV0IGFwcGVhciBpbiB0aGUgbGlzdCBvZiBmaWx0ZXItbWFwcGluZyBlbGVtZW50cy5UaGUKLSAgICAgICAgZmlsdGVyLW5hbWUgdmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIGZpbHRlci1uYW1lCi0gICAgICAgIHN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlIGZpbHRlciBkZWNsYXJhdGlvbnMgaW4gdGhlCi0gICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmlsdGVyLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp1cmwtcGF0dGVyblR5cGUiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZXJ2bGV0LW5hbWVUeXBlIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGlzcGF0Y2hlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iNSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub25FbXB0eVN0cmluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIHR5cGUgZGVmaW5lcyBhIHN0cmluZyB3aGljaCBjb250YWlucyBhdCBsZWFzdCBvbmUKLSAgICAgICAgY2hhcmFjdGVyLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iMSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmlsdGVyLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZmlsdGVyIGlzIGRlY2xhcmUKLSAgICAgICAgYnkgdXNpbmcgZmlsdGVyLW5hbWVUeXBlLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBtYXAgdGhlCi0gICAgICAgIGZpbHRlci4gIEVhY2ggZmlsdGVyIG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViCi0gICAgICAgIGFwcGxpY2F0aW9uLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogZmlsdGVyLCBmaWx0ZXItbWFwcGluZwotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6bm9uRW1wdHlTdHJpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZm9ybS1sb2dpbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGZvcm0tbG9naW4tY29uZmlnVHlwZSBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvcgotICAgICAgICBwYWdlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQKLSAgICAgICAgYXV0aGVudGljYXRpb24gaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogbG9naW4tY29uZmlnCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1sb2dpbi1wYWdlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp3YXItcGF0aFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYgotICAgICAgICAgICAgYXBwIHdoZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZQotICAgICAgICAgICAgZm91bmQuICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKLSAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWVycm9yLXBhZ2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOndhci1wYXRoVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbgotICAgICAgICAgICAgdGhlIHdlYiBhcHAgd2hlcmUgdGhlIGVycm9yIHBhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQKLSAgICAgICAgICAgIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwgY2FuIGJlIGZvdW5kLiAKLSAgICAgICAgICAgIFRoZSBwYXRoIGJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZAotICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iaHR0cC1tZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQSBIVFRQIG1ldGhvZCB0eXBlIGFzIGRlZmluZWQgaW4gSFRUUCAxLjEgc2VjdGlvbiAyLjIuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWyEtfi1bXChcKSYjNjA7JiM2MjtALDs6JiMzNDsvXFtcXT89XHtcfVxcXHB7Wn1dXSsiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9hZC1vbi1zdGFydHVwVHlwZSI+Ci0gICAgPHhzZDp1bmlvbiBtZW1iZXJUeXBlcz0iamF2YWVlOm51bGwtY2hhclR5cGUgeHNkOmludGVnZXIiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibnVsbC1jaGFyVHlwZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2luLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbG9naW4tY29uZmlnVHlwZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLSAgICAgICAgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlCi0gICAgICAgIHVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZQotICAgICAgICBuZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4gbWVjaGFuaXNtLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogd2ViLWFwcAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGgtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphdXRoLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhbG0tbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvCi0gICAgICAgICAgICB1c2UgaW4gSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1sb2dpbi1jb25maWciCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZvcm0tbG9naW4tY29uZmlnVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWltZS1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtaW1lLW1hcHBpbmdUeXBlIGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uCi0gICAgICAgIGFuZCBhIG1pbWUgdHlwZS4KLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IHdlYi1hcHAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4KLSAgICAgICAgICBleHRlbnNpb24uIGV4YW1wbGU6ICJ0eHQiCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWltZS10eXBlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptaW1lLXR5cGVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1pbWUtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWltZS10eXBlVHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGEgZGVmaW5lZCBtaW1lIHR5cGUuCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlOgotICAgICAgICAidGV4dC9wbGFpbiIKLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IG1pbWUtbWFwcGluZwotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHB7Q2N9XlxzXSsvW15ccHtDY31eXHNdKyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktY29uc3RyYWludFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgc2VjdXJpdHktY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBhc3NvY2lhdGUKLSAgICAgICAgc2VjdXJpdHkgY29uc3RyYWludHMgd2l0aCBvbmUgb3IgbW9yZSB3ZWIgcmVzb3VyY2UKLSAgICAgICAgY29sbGVjdGlvbnMKLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IHdlYi1hcHAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLXJlc291cmNlLWNvbGxlY3Rpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGgtY29uc3RyYWludCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXV0aC1jb25zdHJhaW50VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLWRhdGEtY29uc3RyYWludCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBzZXJ2bGV0VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYSBzZXJ2bGV0LgotICAgICAgICBJdCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhCi0gICAgICAgIHNlcnZsZXQuIElmIGEganNwLWZpbGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgbG9hZC1vbi1zdGFydHVwCi0gICAgICAgIGVsZW1lbnQgaXMgcHJlc2VudCwgdGhlbiB0aGUgSlNQIHNob3VsZCBiZSBwcmVjb21waWxlZCBhbmQKLSAgICAgICAgbG9hZGVkLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogd2ViLWFwcAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZXJ2bGV0LW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIHNlcnZsZXQtY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHNlcnZsZXQuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLWZpbGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6anNwLWZpbGVUeXBlIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGFyYW0tdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYWQtb24tc3RhcnR1cCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bG9hZC1vbi1zdGFydHVwVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcwotICAgICAgICAgICAgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkIChpbnN0YW50aWF0ZWQgYW5kIGhhdmUKLSAgICAgICAgICAgIGl0cyBpbml0KCkgY2FsbGVkKSBvbiB0aGUgc3RhcnR1cCBvZiB0aGUgd2ViCi0gICAgICAgICAgICBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mIHRoZXNlCi0gICAgICAgICAgICBlbGVtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbgotICAgICAgICAgICAgd2hpY2ggdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gSWYgdGhlIHZhbHVlCi0gICAgICAgICAgICBpcyBhIG5lZ2F0aXZlIGludGVnZXIsIG9yIHRoZSBlbGVtZW50IGlzIG5vdAotICAgICAgICAgICAgcHJlc2VudCwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgdGhlIHNlcnZsZXQKLSAgICAgICAgICAgIHdoZW5ldmVyIGl0IGNob29zZXMuIElmIHRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlCi0gICAgICAgICAgICBpbnRlZ2VyIG9yIDAsIHRoZSBjb250YWluZXIgbXVzdCBsb2FkIGFuZAotICAgICAgICAgICAgaW5pdGlhbGl6ZSB0aGUgc2VydmxldCBhcyB0aGUgYXBwbGljYXRpb24gaXMKLSAgICAgICAgICAgIGRlcGxveWVkLiBUaGUgY29udGFpbmVyIG11c3QgZ3VhcmFudGVlIHRoYXQKLSAgICAgICAgICAgIHNlcnZsZXRzIG1hcmtlZCB3aXRoIGxvd2VyIGludGVnZXJzIGFyZSBsb2FkZWQKLSAgICAgICAgICAgIGJlZm9yZSBzZXJ2bGV0cyBtYXJrZWQgd2l0aCBoaWdoZXIgaW50ZWdlcnMuIFRoZQotICAgICAgICAgICAgY29udGFpbmVyIG1heSBjaG9vc2UgdGhlIG9yZGVyIG9mIGxvYWRpbmcgb2YKLSAgICAgICAgICAgIHNlcnZsZXRzIHdpdGggdGhlIHNhbWUgbG9hZC1vbi1zdGFydC11cCB2YWx1ZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzeW5jLXN1cHBvcnRlZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icnVuLWFzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpydW4tYXNUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGlwYXJ0LWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bXVsdGlwYXJ0LWNvbmZpZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHNlcnZsZXQtbWFwcGluZ1R5cGUgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhCi0gICAgICAgIHNlcnZsZXQgYW5kIGEgdXJsIHBhdHRlcm4uIAotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogd2ViLWFwcAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp1cmwtcGF0dGVyblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXQtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgc2VydmxldC1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZQotICAgICAgICBzZXJ2bGV0LiBFYWNoIHNlcnZsZXQgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIKLSAgICAgICAgYXBwbGljYXRpb24uCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTpub25FbXB0eVN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgc2Vzc2lvbi1jb25maWdUeXBlIGRlZmluZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVycwotICAgICAgICBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiB3ZWItYXBwCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi10aW1lb3V0IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RJbnRlZ2VyVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgc2Vzc2lvbi10aW1lb3V0IGVsZW1lbnQgZGVmaW5lcyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgc2Vzc2lvbiB0aW1lb3V0IGludGVydmFsIGZvciBhbGwgc2Vzc2lvbnMgY3JlYXRlZAotICAgICAgICAgICAgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSBzcGVjaWZpZWQgdGltZW91dAotICAgICAgICAgICAgbXVzdCBiZSBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KLSAgICAgICAgICAgIElmIHRoZSB0aW1lb3V0IGlzIDAgb3IgbGVzcywgdGhlIGNvbnRhaW5lciBlbnN1cmVzCi0gICAgICAgICAgICB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2Ygc2Vzc2lvbnMgaXMgbmV2ZXIgdG8gdGltZQotICAgICAgICAgICAgb3V0LiBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGNvbnRhaW5lcgotICAgICAgICAgICAgbXVzdCBzZXQgaXRzIGRlZmF1bHQgdGltZW91dCBwZXJpb2QuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb29raWUtY29uZmlnIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpjb29raWUtY29uZmlnVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgY29va2llLWNvbmZpZyBlbGVtZW50IGRlZmluZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlCi0gICAgICAgICAgICBzZXNzaW9uIHRyYWNraW5nIGNvb2tpZXMgY3JlYXRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYWNraW5nLW1vZGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRyYWNraW5nLW1vZGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgdHJhY2tpbmctbW9kZSBlbGVtZW50IGRlZmluZXMgdGhlIHRyYWNraW5nIG1vZGVzCi0gICAgICAgICAgICBmb3Igc2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvb2tpZS1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNvb2tpZS1jb25maWdUeXBlIGRlZmluZXMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZQotICAgICAgICBzZXNzaW9uIHRyYWNraW5nIGNvb2tpZXMgb2YgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiBzZXNzaW9uLWNvbmZpZwotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNvb2tpZS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgbmFtZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gYW55IHNlc3Npb24gdHJhY2tpbmcKLSAgICAgICAgICAgIGNvb2tpZXMgY3JlYXRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIEpTRVNTSU9OSUQKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRvbWFpbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y29va2llLWRvbWFpblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGRvbWFpbiBuYW1lIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byBhbnkgc2Vzc2lvbiB0cmFja2luZwotICAgICAgICAgICAgY29va2llcyBjcmVhdGVkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGF0aCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y29va2llLXBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBwYXRoIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byBhbnkgc2Vzc2lvbiB0cmFja2luZwotICAgICAgICAgICAgY29va2llcyBjcmVhdGVkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWVudCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y29va2llLWNvbW1lbnRUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBjb21tZW50IHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byBhbnkgc2Vzc2lvbiB0cmFja2luZwotICAgICAgICAgICAgY29va2llcyBjcmVhdGVkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaHR0cC1vbmx5IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBhbnkgc2Vzc2lvbiB0cmFja2luZyBjb29raWVzIGNyZWF0ZWQgCi0gICAgICAgICAgICBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbiB3aWxsIGJlIG1hcmtlZCBhcyBIdHRwT25seQotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBhbnkgc2Vzc2lvbiB0cmFja2luZyBjb29raWVzIGNyZWF0ZWQgCi0gICAgICAgICAgICBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbiB3aWxsIGJlIG1hcmtlZCBhcyBzZWN1cmUKLSAgICAgICAgICAgIGV2ZW4gaWYgdGhlIHJlcXVlc3QgdGhhdCBpbml0aWF0ZWQgdGhlIGNvcnJlc3BvbmRpbmcgc2Vzc2lvbgotICAgICAgICAgICAgaXMgdXNpbmcgcGxhaW4gSFRUUCBpbnN0ZWFkIG9mIEhUVFBTCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtYWdlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RJbnRlZ2VyVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgbGlmZXRpbWUgKGluIHNlY29uZHMpIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byBhbnkKLSAgICAgICAgICAgIHNlc3Npb24gdHJhY2tpbmcgY29va2llcyBjcmVhdGVkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgICAgRGVmYXVsdCBpcyAtMQotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvb2tpZS1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBuYW1lIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byBhbnkgc2Vzc2lvbiB0cmFja2luZwotICAgICAgICBjb29raWVzIGNyZWF0ZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgIFRoZSBkZWZhdWx0IGlzIEpTRVNTSU9OSUQKLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IGNvb2tpZS1jb25maWcKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOm5vbkVtcHR5U3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvb2tpZS1kb21haW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGRvbWFpbiBuYW1lIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byBhbnkgc2Vzc2lvbiB0cmFja2luZwotICAgICAgICBjb29raWVzIGNyZWF0ZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiBjb29raWUtY29uZmlnCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTpub25FbXB0eVN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb29raWUtcGF0aFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcGF0aCB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gYW55IHNlc3Npb24gdHJhY2tpbmcKLSAgICAgICAgY29va2llcyBjcmVhdGVkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogY29va2llLWNvbmZpZwotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6bm9uRW1wdHlTdHJpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29va2llLWNvbW1lbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNvbW1lbnQgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGFueSBzZXNzaW9uIHRyYWNraW5nCi0gICAgICAgIGNvb2tpZXMgY3JlYXRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IGNvb2tpZS1jb25maWcKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOm5vbkVtcHR5U3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYWNraW5nLW1vZGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHRyYWNraW5nIG1vZGVzIGZvciBzZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgd2ViCi0gICAgICAgIGFwcGxpY2F0aW9uCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiBzZXNzaW9uLWNvbmZpZwotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT09LSUUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVJMIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNTTCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgdHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24KLSAgICAgICAgYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCi0gICAgICAgIENPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdAotICAgICAgICByZXF1aXJlIGFueSB0cmFuc3BvcnQgZ3VhcmFudGVlcy4gQSB2YWx1ZSBvZiBJTlRFR1JBTCBtZWFucwotICAgICAgICB0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUKLSAgICAgICAgY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUKLSAgICAgICAgY2hhbmdlZCBpbiB0cmFuc2l0LiBDT05GSURFTlRJQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24KLSAgICAgICAgcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhIGZhc2hpb24gdGhhdAotICAgICAgICBwcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YgdGhlCi0gICAgICAgIHRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZSBJTlRFR1JBTCBvcgotICAgICAgICBDT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMKLSAgICAgICAgcmVxdWlyZWQuCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiB1c2VyLWRhdGEtY29uc3RyYWludAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHUkFMIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPTkZJREVOVElBTCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHVzZXItZGF0YS1jb25zdHJhaW50VHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGhvdwotICAgICAgICBkYXRhIGNvbW11bmljYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIGNvbnRhaW5lciBzaG91bGQgYmUKLSAgICAgICAgcHJvdGVjdGVkLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0LWd1YXJhbnRlZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2FyLXBhdGhUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgYSBwYXRoIHN0YXJ0aW5nCi0gICAgICAgIHdpdGggYSAiLyIgYW5kIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIGEgV0FSCi0gICAgICAgIGZpbGUuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iLy4qIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0id2ViLWFwcC12ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgdHlwZSBjb250YWlucyB0aGUgcmVjb2duaXplZCB2ZXJzaW9ucyBvZgotICAgICAgICB3ZWItYXBwbGljYXRpb24gc3VwcG9ydGVkLiBJdCBpcyB1c2VkIHRvIGRlc2lnbmF0ZSB0aGUKLSAgICAgICAgdmVyc2lvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzLjAiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlCi0gICAgICAgIHJlc291cmNlcyBhbmQgSFRUUCBtZXRob2RzIG9uIHRob3NlIHJlc291cmNlcyB0byB3aGljaCBhCi0gICAgICAgIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYgbm8gSFRUUCBtZXRob2RzIGFyZSBzcGVjaWZpZWQsCi0gICAgICAgIHRoZW4gdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcyB0byBhbGwgSFRUUCBtZXRob2RzLgotICAgICAgICBJZiBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCBieSBodHRwLW1ldGhvZC1vbWlzc2lvbgotICAgICAgICBlbGVtZW50cywgdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcyB0byBhbGwgbWV0aG9kcwotICAgICAgICBleGNlcHQgdGhvc2UgaWRlbnRpZmllZCBpbiB0aGUgY29sbGVjdGlvbi4KLSAgICAgICAgaHR0cC1tZXRob2Qtb21pc3Npb24gYW5kIGh0dHAtbWV0aG9kIGVsZW1lbnRzIGFyZSBuZXZlcgotICAgICAgICBtaXhlZCBpbiB0aGUgc2FtZSBjb2xsZWN0aW9uLiAKLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItcmVzb3VyY2UtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHdlYi1yZXNvdXJjZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgd2ViCi0gICAgICAgICAgICByZXNvdXJjZSBjb2xsZWN0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dXJsLXBhdHRlcm5UeXBlIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaHR0cC1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aHR0cC1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBFYWNoIGh0dHAtbWV0aG9kIG5hbWVzIGFuIEhUVFAgbWV0aG9kIHRvIHdoaWNoIHRoZQotICAgICAgICAgICAgICBjb25zdHJhaW50IGFwcGxpZXMuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaHR0cC1tZXRob2Qtb21pc3Npb24iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aHR0cC1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBFYWNoIGh0dHAtbWV0aG9kLW9taXNzaW9uIG5hbWVzIGFuIEhUVFAgbWV0aG9kIHRvCi0gICAgICAgICAgICAgIHdoaWNoIHRoZSBjb25zdHJhaW50IGRvZXMgbm90IGFwcGx5LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VsY29tZS1maWxlLWxpc3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHdlbGNvbWUtZmlsZS1saXN0IGNvbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiB3ZWxjb21lCi0gICAgICAgIGZpbGVzIGVsZW1lbnRzLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogd2ViLWFwcAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlbGNvbWUtZmlsZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UKLSAgICAgICAgICAgIGFzIGEgZGVmYXVsdCB3ZWxjb21lIGZpbGUsIHN1Y2ggYXMgaW5kZXguaHRtbAotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NhbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGxvY2FsZVR5cGUgZGVmaW5lcyB2YWxpZCBsb2NhbGUgZGVmaW5lZCBieSBJU08tNjM5LTEKLSAgICAgICAgYW5kIElTTy0zMTY2LgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbYS16XXsyfShffC0pPyhbXHB7TH1cLVxwe05kfV17Mn0pPyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbmNvZGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW5jb2RpbmdUeXBlIGRlZmluZXMgSUFOQSBjaGFyYWN0ZXIgc2V0cy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iW15cc10rIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCBjb250YWlucyBvbmUgb3IgbW9yZQotICAgICAgICBsb2NhbGUtZW5jb2RpbmctbWFwcGluZyhzKS4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bG9jYWxlLWVuY29kaW5nLW1hcHBpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBsb2NhbGUtZW5jb2RpbmctbWFwcGluZyBjb250YWlucyBsb2NhbGUgbmFtZSBhbmQKLSAgICAgICAgZW5jb2RpbmcgbmFtZS4gVGhlIGxvY2FsZSBuYW1lIG11c3QgYmUgZWl0aGVyICJMYW5ndWFnZS1jb2RlIiwKLSAgICAgICAgc3VjaCBhcyAiamEiLCBkZWZpbmVkIGJ5IElTTy02Mzkgb3IgIkxhbmd1YWdlLWNvZGVfQ291bnRyeS1jb2RlIiwKLSAgICAgICAgc3VjaCBhcyAiamFfSlAiLiAgIkNvdW50cnkgY29kZSIgaXMgZGVmaW5lZCBieSBJU08tMzE2Ni4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxvY2FsZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNvZGluZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZW5jb2RpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9yZGVyaW5nLW90aGVyc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhlIG9yZGVyaW5nIHN1Yi1lbGVtZW50IGluIHdoaWNoCi0gICAgICAgIGl0IHdhcyBwbGFjZWQgc2hvdWxkIHRha2Ugc3BlY2lhbCBhY3Rpb24gcmVnYXJkaW5nIHRoZSBvcmRlcmluZwotICAgICAgICBvZiB0aGlzIGFwcGxpY2F0aW9uIHJlc291cmNlIHJlbGF0aXZlIHRvIG90aGVyIGFwcGxpY2F0aW9uCi0gICAgICAgIGNvbmZpZ3VyYXRpb24gcmVzb3VyY2VzLgotICAgICAgICBTZWUgc2VjdGlvbiA4LjIuMiBvZiB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic29sdXRlT3JkZXJpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgUGxlYXNlIHNlZSBzZWN0aW9uIDguMi4yIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3RoZXJzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpvcmRlcmluZy1vdGhlcnNUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpjaG9pY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9yZGVyaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFBsZWFzZSBzZWUgc2VjdGlvbiA4LjIuMiBvZiB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZnRlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6b3JkZXJpbmctb3JkZXJpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiZWZvcmUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm9yZGVyaW5nLW9yZGVyaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9yZGVyaW5nLW9yZGVyaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyBhIHNlcXVlbmNlIG9mICJuYW1lIiBlbGVtZW50cywgZWFjaCBvZgotICAgICAgICB3aGljaAotICAgICAgICByZWZlcnMgdG8gYW4gYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiByZXNvdXJjZSBieSB0aGUgIm5hbWUiCi0gICAgICAgIGRlY2xhcmVkIG9uIGl0cyB3ZWIueG1sIGZyYWdtZW50LiAgVGhpcyBlbGVtZW50IGNhbiBhbHNvIGNvbnRhaW4KLSAgICAgICAgYSBzaW5nbGUgIm90aGVycyIgZWxlbWVudCB3aGljaCBzcGVjaWZpZXMgdGhhdCB0aGlzIGRvY3VtZW50Ci0gICAgICAgIGNvbWVzCi0gICAgICAgIGJlZm9yZSBvciBhZnRlciBvdGhlciBkb2N1bWVudHMgd2l0aGluIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgICAgU2VlIHNlY3Rpb24gOC4yLjIgb2YgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdGhlcnMiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm9yZGVyaW5nLW90aGVyc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtdWx0aXBhcnQtY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZQotICAgICAgICBoYW5kbGluZyBvZiBtdWx0aXBhcnQvZm9ybS1kYXRhIHJlcXVlc3RzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2F0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBkaXJlY3RvcnkgbG9jYXRpb24gd2hlcmUgdXBsb2FkZWQgZmlsZXMgd2lsbCBiZSBzdG9yZWQKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1maWxlLXNpemUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmxvbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBtYXhpbXVtIHNpemUgbGltaXQgb2YgdXBsb2FkZWQgZmlsZXMKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1yZXF1ZXN0LXNpemUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmxvbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBtYXhpbXVtIHNpemUgbGltaXQgb2YgbXVsdGlwYXJ0L2Zvcm0tZGF0YSByZXF1ZXN0cwotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsZS1zaXplLXRocmVzaG9sZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHNpemUgdGhyZXNob2xkIGFmdGVyIHdoaWNoIGFuIHVwbG9hZGVkIGZpbGUgd2lsbCBiZQotICAgICAgICAgICAgd3JpdHRlbiB0byBkaXNrCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VsZXR0YWdsaWJyYXJ5XzJfMC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlbGV0dGFnbGlicmFyeV8yXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWI5MzNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VsZXR0YWdsaWJyYXJ5XzJfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICIxLjAiIGVuY29kaW5nID0gIlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hCi0gICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgIHhtbG5zOnhtbD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgICB2ZXJzaW9uPSIyLjAiPgotICAgIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLSAgICAgIAotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgICAKLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbgotICAgICAgRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlCi0gICAgICAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgICB0aGUgTGljZW5zZS4gWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwgb3IKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLSAgICAgIExpY2Vuc2UuCi0gICAgICAKLSAgICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyCi0gICAgICBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gICAgICBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzCi0gICAgICBwcm92aWRlZCBieSBTdW4gaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZSBmaWxlCi0gICAgICB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4gIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nCi0gICAgICBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBbXQotICAgICAgcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgICAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0gICAgICAKLSAgICAgIENvbnRyaWJ1dG9yKHMpOgotICAgICAgCi0gICAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlCi0gICAgICBDRERMIG9yIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nCi0gICAgICAiW0NvbnRyaWJ1dG9yXSBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UKLSAgICAgIGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhIHJlY2lwaWVudCBoYXMgdGhlCi0gICAgICBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUKLSAgICAgIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8gaXRzCi0gICAgICBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIKLSAgICAgIGNvZGUgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZQotICAgICAgb3B0aW9uIGFwcGxpZXMgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2gKLSAgICAgIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0IGhvbGRlci4KLSAgICAgIAotICAgICAgVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgQ0RETCBsaWNlbnNlLiAgICAgIAotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIDwhW0NEQVRBWwotCi0gICAgICAgICAgICBUaGUgWE1MIFNjaGVtYSBmb3IgdGhlIFRhZyBMaWJyYXJpZXMgaW4gdGhlIEphdmFTZXJ2ZXIgRmFjZXMKLSAgICAgICAgICAgIFN0YW5kYXJkIEZhY2VsZXRzIFZpZXcgRGVjbGFyYXRpb24gTGFuZ3VhZ2UgKEZhY2VsZXRzIFZETCkKLSAgICAgICAgICAgIChWZXJzaW9uIDIuMCkuCi0KLSAgICAgICAgICAgIEpTRiAyLjAgRmFjZWxldCBUYWcgTGlicmFyaWVzIHRoYXQgd2lzaCB0byBjb25mb3JtIHRvIHRoaXMKLSAgICAgICAgICAgIHNjaGVtYSBtdXN0IGRlY2xhcmUgaXQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuCi0KLSAgICAgICAgICAgIDxmYWNlbGV0LXRhZ2xpYiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VsZXR0YWdsaWJhcnlfMl8wLnhzZCIKLSAgICAgICAgICAgICAgdmVyc2lvbj0iMi4wIj4KLQotICAgICAgICAgICAgLi4uCi0KLSAgICAgICAgICAgIDwvZmFjZWxldC10YWdsaWI+Ci0KLSAgICAgICAgICAgIFRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQKLSAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIHNjaGVtYSB1c2luZyB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0gICAgICAgICAgICBmb3IgamF2YWVlIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLSAgICAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZWxldHRhZ2xpYmFyeV8yXzAueHNkCi0KLSAgICAgICAgICAgIF1dPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotCi0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjZWxldC10YWdsaWIiIHR5cGU9ImphdmFlZTpmYWNlbGV0LXRhZ2xpYlR5cGUiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmYWNlbGV0LXRhZ2xpYi10YWduYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICB0YWctbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgZG9jdW1lbnQuCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6dGFnIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6dGFnLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmYWNlcy1jb25maWctYmVoYXZpb3ItSUQtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIEJlaGF2aW9yIElEcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudC4KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpiZWhhdmlvciIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmJlaGF2aW9yLWlkIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZmFjZXMtY29uZmlnLWNvbnZlcnRlci1JRC11bmlxdWVuZXNzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyIElEcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudC4KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpjb252ZXJ0ZXItaWQiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmYWNlcy1jb25maWctdmFsaWRhdG9yLUlELXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3IgSURzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50LgotICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnZhbGlkYXRvciIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnZhbGlkYXRvci1pZCIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VsZXQtdGFnbGliVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgdG9wIGxldmVsIFhNTCBlbGVtZW50IGluIGEgZmFjZWxldCB0YWcgbGlicmFyeSBYTUwgZmlsZS4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaWJyYXJ5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iY29tcG9zaXRlLWxpYnJhcnktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZWxldC10YWdsaWItdGFnVHlwZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlbGV0LXRhZ2xpYi1mdW5jdGlvblR5cGUiLz4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZWxldC10YWdsaWItZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VsZXQtdGFnbGliLXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlbGV0LXRhZ2xpYi1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBmYWNlbGV0LXRhZ2xpYi4gSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZWxldC10YWdsaWItdGFnVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBJZiB0aGUgdGFnIGxpYnJhcnkgWE1MIGZpbGUgY29udGFpbnMgaW5kaXZpZHVhbCB0YWcKLSAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnMgcmF0aGVyIHRoYW4gcG9pbnRpbmcgdG8gYSBsaWJyYXJ5LWNsYXNzIG9yIGEKLSAgICAgICAgICAgICAgICBkZWNsYXJpbmcgYSBjb21wb3NpdGUtbGlicmFyeSBuYW1lLCB0aGUgaW5kaXZpZHVhbCB0YWdzIGFyZQotICAgICAgICAgICAgICAgIGVuY2xvc2VkIGluIHRhZyBlbGVtZW50cy4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZWxldC10YWdsaWItY2Fub25pY2FsLW5hbWVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmVoYXZpb3IiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlbGV0LXRhZ2xpYi10YWctYmVoYXZpb3JUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VsZXQtdGFnbGliLXRhZy1jb21wb25lbnRUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VsZXQtdGFnbGliLXRhZy1jb252ZXJ0ZXJUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VsZXQtdGFnbGliLXRhZy12YWxpZGF0b3JUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZSIgdHlwZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZWxldC10YWdsaWItdGFnLWF0dHJpYnV0ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZWxldC10YWdsaWItdGFnLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlbGV0LXRhZ2xpYi10YWctYXR0cmlidXRlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGUgZWxlbWVudCBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcKLSAgICAgICAgICAgICAgICB0YWcuIFRoZSBhdHRyaWJ1dGUgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzCi0gICAgICAgICAgICAgICAgZGVmaW5pbmc6Ci0KLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBhdHRyaWJ1dGUKLQotICAgICAgICAgICAgICAgIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yCi0gICAgICAgICAgICAgICAgb3B0aW9uYWwKLQotICAgICAgICAgICAgICAgIHR5cGUgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZQotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2ROTVRPS0VOVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpnZW5lcmljLWJvb2xlYW5UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbC4KLQotICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgSmF2YSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuIElmIHRoaXMgZWxlbWVudCBpcyBvbWl0dGVkLCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCB0eXBlIGlzIGFzc3VtZWQgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YS5sYW5nLk9iamVjdCIuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXNpZ25hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgbWV0aG9kIHNpZ25hdHVyZSBmb3IgYSBNZXRob2RFeHByZXNzaW9uLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgYXR0cmlidXRlLgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZWxldC10YWdsaWItdGFnLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHRhZyBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlbGV0LXRhZ2xpYi1mdW5jdGlvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSWYgdGhlIHRhZyBsaWJyYXJ5IFhNTCBmaWxlIGNvbnRhaW5zIGluZGl2aWR1YWwgZnVuY3Rpb24KLSAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnMgcmF0aGVyIHRoYW4gcG9pbnRpbmcgdG8gYSBsaWJyYXJ5LWNsYXNzIG9yIGEKLSAgICAgICAgICAgICAgICBkZWNsYXJpbmcgYSBjb21wb3NpdGUtbGlicmFyeSBuYW1lLCB0aGUgaW5kaXZpZHVhbCBmdW5jdGlvbnMgYXJlCi0gICAgICAgICAgICAgICAgZW5jbG9zZWQgaW4gZnVuY3Rpb24gZWxlbWVudHMuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tbmFtZSIgdHlwZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tc2lnbmF0dXJlIiB0eXBlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZWxldC10YWdsaWItdGFnLWJlaGF2aW9yVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBXaXRoaW4gYSB0YWcgZWxlbWVudCwgdGhlIGJlaGF2aW9yIGVsZW1lbnQgZW5jYXBzdWxhdGVzCi0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYSBKU0YgQmVoYXZpb3IuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iYmVoYXZpb3ItaWQiIHR5cGU9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJoYW5kbGVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmVoYXZpb3ItZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlbGV0LXRhZ2xpYi10YWctYmVoYXZpb3ItZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlbGV0LXRhZ2xpYi10YWctYmVoYXZpb3ItZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgYmVoYXZpb3IuIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlbGV0LXRhZ2xpYi10YWctY29tcG9uZW50VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBXaXRoaW4gYSB0YWcgZWxlbWVudCwgdGhlIGNvbXBvbmVudCBlbGVtZW50IGVuY2Fwc3VsYXRlcwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgSlNGIFVJQ29tcG9uZW50LgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC10eXBlIiB0eXBlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icmVuZGVyZXItdHlwZSIgdHlwZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImhhbmRsZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlbGV0LXRhZ2xpYi10YWctY29tcG9uZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlbGV0LXRhZ2xpYi10YWctY29tcG9uZW50LWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGNvbXBvbmVudCBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlbGV0LXRhZ2xpYi10YWctY29udmVydGVyVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBXaXRoaW4gYSB0YWcgZWxlbWVudCwgdGhlIGNvbnZlcnRlciBlbGVtZW50IGVuY2Fwc3VsYXRlcwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgSlNGIENvbnZlcnRlci4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJjb252ZXJ0ZXItaWQiIHR5cGU9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJoYW5kbGVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZWxldC10YWdsaWItdGFnLWNvbnZlcnRlci1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VsZXQtdGFnbGliLXRhZy1jb252ZXJ0ZXItZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgY29udmVydGVyIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VsZXQtdGFnbGliLXRhZy12YWxpZGF0b3JUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFdpdGhpbiBhIHRhZyBlbGVtZW50LCB0aGUgdmFsaWRhdG9yIGVsZW1lbnQgZW5jYXBzdWxhdGVzCi0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYSBKU0YgVmFsaWRhdG9yLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InZhbGlkYXRvci1pZCIgdHlwZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImhhbmRsZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlbGV0LXRhZ2xpYi10YWctdmFsaWRhdG9yLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZWxldC10YWdsaWItdGFnLXZhbGlkYXRvci1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciB2YWxpZGF0b3IgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmFjZWxldC10YWdsaWItdmVyc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSByZWNvZ25pemVkIHZlcnNpb25zIG9mCi0gICAgICAgICAgICAgICAgZmFjZWxldC10YWdsaWIgc3VwcG9ydGVkLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMi4wIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VsZXQtdGFnbGliLWNhbm9uaWNhbC1uYW1lVHlwZSI+Ci0KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSB0YWcgb3IgYXR0cmlidXRlIGJlaW5nCi0gICAgICAgICAgICAgICAgZGVmaW5lZC4KLQotICAgICAgICAgICAgICAgIFRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTkNOYW1lCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8wLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxYzk5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsODc0ICswLDAgQEAKLTwhLS0KLSAgICBEVEQgZm9yIHRoZSBKYXZhU2VydmVyIEZhY2VzIEFwcGxpY2F0aW9uIENvbmZpZ3VyYXRpb24gRmlsZSAoVmVyc2lvbiAxLjApCi0KLSAgICBUbyBzdXBwb3J0IHZhbGlkYXRpb24gb2YgeW91ciBjb25maWd1cmF0aW9uIGZpbGUocyksIGluY2x1ZGUgdGhlIGZvbGxvd2luZwotICAgIERPQ1RZUEUgZWxlbWVudCBhdCB0aGUgYmVnaW5uaW5nIChhZnRlciB0aGUgInhtbCIgZGVjbGFyYXRpb24pOgotCi0gICAgPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMKLSAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIgotICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMC5kdGQiPgotCi0gICAgJElkOiB3ZWItZmFjZXNjb25maWdfMV8wLmR0ZCx2IDEuMSAyMDA3LzA1LzI1IDIxOjEyOjQ5IGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0KLS0tPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT0gRGVmaW5lZCBUeXBlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tCi0gICAgQW4gIkFjdGlvbiIgaXMgYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIGEgbWV0aG9kIGJpbmRpbmcKLSAgICBleHByZXNzaW9uIHRoYXQgcG9pbnRzIGF0IGEgbWV0aG9kIHdpdGggbm8gYXJndW1lbnRzIHRoYXQgcmV0dXJucyBhCi0gICAgU3RyaW5nLiAgSXQgbXVzdCBiZSBicmFja2V0ZWQgd2l0aCAiI3t9IiwgZm9yIGV4YW1wbGUsCi0gICAgIiN7Y2FyZGVtby5idXlDYXJ9Ii4KLS0tPgotPCFFTlRJVFkgJSBBY3Rpb24gIkNEQVRBIj4KLQotCi08IS0tCi0gICAgQSAiQ2xhc3NOYW1lIiBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaXMKLSAgICBpbnN0YW50aWF0ZWQgdG8gcHJvdmlkZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZW5jbG9zaW5nIGVsZW1lbnQuCi0tLT4KLTwhRU5USVRZICUgQ2xhc3NOYW1lICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEFuICJJZGVudGlmaWVyIiBpcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHRoYXQgY29uZm9ybXMgdG8gdGhlIHZhcmlhYmxlCi0gICAgbmFtaW5nIGNvbnZlbnRpb25zIG9mIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIChKTFMgU2VjdGlvbiA/Lj8uPykuCi0tLT4KLTwhRU5USVRZICUgSWRlbnRpZmllciAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBICJKYXZhVHlwZSIgaXMgZWl0aGVyIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpcwotICAgIGluc3RhbnRpYXRlZCB0byBwcm92aWRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBlbmNsb3NpbmcgZWxlbWVudCwgb3IKLSAgICB0aGUgbmFtZSBvZiBhIEphdmEgcHJpbWl0aXZlIHR5cGUgKHN1Y2ggYXMgaW50IG9yIGNoYXIpLiAgVGhlIGNsYXNzIG5hbWUKLSAgICBvciBwcmltaXRpdmUgdHlwZSBtYXkgb3B0aW9uYWxseSBiZSBmb2xsb3dlZCBieSAiW10iIHRvIGluZGljYXRlIHRoYXQKLSAgICB0aGUgdW5kZXJseWluZyBkYXRhIG11c3QgYmUgYW4gYXJyYXksIHJhdGhlciB0aGFuIGEgc2NhbGFyIHZhcmlhYmxlLgotLS0+Ci08IUVOVElUWSAlIEphdmFUeXBlICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEEgIkxhbmd1YWdlIiBpcyBhIGxvd2VyIGNhc2UgdHdvLWxldHRlciBjb2RlIGZvciBhIGxhbmd1YWdlIGFzIGRlZmluZWQKLSAgICBieSBJU0wtNjM5LgotLS0+Ci08IUVOVElUWSAlIExhbmd1YWdlICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEEgIlJlc291cmNlUGF0aCIgaXMgdGhlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gYSByZXNvdXJjZSBmaWxlCi0gICAgKHN1Y2ggYXMgYSBsb2dvIGltYWdlKS4KLS0tPgotPCFFTlRJVFkgJSBSZXNvdXJjZVBhdGggIkNEQVRBIj4KLQotCi08IS0tCi0gICAgQSAiU2NvcGUiIGlzIHRoZSB3ZWxsLWtub3duIG5hbWUgb2YgYSBzY29wZSBpbiB3aGljaCBtYW5hZ2VkIGJlYW5zIG1heQotICAgIG9wdGlvbmFsbHkgYmUgZGVmaW5lZCB0byBiZSBjcmVhdGVkIGluLgotLS0+Ci08IUVOVElUWSAlIFNjb3BlICIocmVxdWVzdHxzZXNzaW9ufGFwcGxpY2F0aW9uKSI+Ci0KLQotCi08IS0tCi0gICAgQSAiU2NvcGVPck5vbmUiIGVsZW1lbnQgZGVmaW5lcyB0aGUgbGVnYWwgdmFsdWVzIGZvciB0aGUKLSAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPiBlbGVtZW50J3MgYm9keSBjb250ZW50LCB3aGljaCBpbmNsdWRlcwotICAgIGFsbCBvZiB0aGUgc2NvcGVzIHJlc3ByZXNlbnRlZCBieSB0aGUgIlNjb3BlIiB0eXBlLCBwbHVzIHRoZQotICAgICJub25lIiB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgYSBjcmVhdGVkIGJlYW4gc2hvdWxkIG5vdCBiZQotICAgIHN0b3JlZCBpbnRvIGFueSBzY29wZS4KLS0tPgotPCFFTlRJVFkgJSBTY29wZU9yTm9uZSAiKHJlcXVlc3R8c2Vzc2lvbnxhcHBsaWNhdGlvbnxub25lKSI+Ci0KLQotPCEtLQotICAgIEEgIlZpZXdJZFBhdHRlcm4iIGlzIGEgcGF0dGVybiBmb3IgbWF0Y2hpbmcgdmlldyBpZGVudGlmaWVycyBpbgotICAgIG9yZGVyIHRvIGRldGVybWluZSB3aGV0aGVyIGEgcGFydGljdWxhciBuYXZpZ2F0aW9uIHJ1bGUgc2hvdWxkIGJlCi0gICAgZmlyZWQuICBJdCBtdXN0IGNvbnRhaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotCi0gICAgLSBUaGUgZXhhY3QgbWF0Y2ggZm9yIGEgdmlldyBpZGVudGlmaWVyIHRoYXQgaXMgcmVjb2duaXplZAotICAgICAgYnkgdGhlIHRoZSBWaWV3SGFuZGxlciBpbXBsZW1lbnRhdGlvbiBiZWluZyB1c2VkIChzdWNoIGFzCi0gICAgICAiL2luZGV4LmpzcCIgaWYgeW91IGFyZSB1c2luZyB0aGUgZGVmYXVsdCBWaWV3SGFuZGxlcikuCi0KLSAgICAtIEEgcHJvcGVyIHByZWZpeCBvZiBhIHZpZXcgaWRlbnRpZmllciwgcGx1cyBhIHRyYWlsaW5nICIqIgotICAgICAgY2hhcmFjdGVyLiAgVGhpcyBwYXR0ZXJuIGluZGljYXRlcyB0aGF0IGFsbCB2aWV3IGlkZW50aWZpZXJzIHRoYXQKLSAgICAgIG1hdGNoIHRoZSBwb3J0aW9uIG9mIHRoZSBwYXR0ZXJuIHVwIHRvIHRoZSBhc3RlcmlzayB3aWxsIG1hdGNoIHRoZQotICAgICAgc3Vycm91bmRpbmcgcnVsZS4gIFdoZW4gbW9yZSB0aGFuIG9uZSBtYXRjaCBleGlzdHMsIHRoZSBtYXRjaCB3aXRoCi0gICAgICB0aGUgbG9uZ2VzdCBwYXR0ZXJuIGlzIHNlbGVjdGVkLgotCi0gICAgLSBBbiAiKiIgY2hhcmFjdGVyLCB3aGljaCBtZWFucyB0aGF0IHRoaXMgcGF0dGVybiBhcHBsaWVzIHRvIGFsbAotICAgICAgdmlldyBpZGVudGlmaWVycy4KLS0tPgotPCFFTlRJVFkgJSBWaWV3SWRQYXR0ZXJuICJDREFUQSI+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PSBUb3AgTGV2ZWwgRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTwhLS0KLSAgICBUaGUgImZhY2VzLWNvbmZpZyIgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgotICAgIGhpZXJhcmNoeSwgYW5kIGNvbnRhaW5zIG5lc3RlZCBlbGVtZW50cyBmb3IgYWxsIG9mIHRoZSBvdGhlciBjb25maWd1cmF0aW9uCi0gICAgc2V0dGluZ3MuCi0tLT4KLTwhRUxFTUVOVCBmYWNlcy1jb25maWcgICAgKChhcHBsaWNhdGlvbnxmYWN0b3J5fGNvbXBvbmVudHxjb252ZXJ0ZXJ8bWFuYWdlZC1iZWFufG5hdmlnYXRpb24tcnVsZXxyZWZlcmVuY2VkLWJlYW58cmVuZGVyLWtpdHxsaWZlY3ljbGV8dmFsaWRhdG9yKSopPgotPCFBVFRMSVNUIGZhY2VzLWNvbmZpZwotICAgICAgIHhtbG5zIENEQVRBICNGSVhFRCAiaHR0cDovL2phdmEuc3VuLmNvbS9KU0YvQ29uZmlndXJhdGlvbiI+Ci0KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09IERlZmluaXRpb24gRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLQotICAgIFRoZSAiYXBwbGljYXRpb24iIGVsZW1lbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gZGVmaW5lIHRoZSB2YXJpb3VzCi0gICAgcGVyLWFwcGxpY2F0aW9uLXNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBhcnRpZmFjdHMgZm9yIGEgcGFydGljdWxhciB3ZWIKLSAgICBhcHBsaWNhdGlvbiB0aGF0IGlzIHV0aWxpemluZyBKYXZhU2VydmVyIEZhY2VzLiAgRm9yIG5lc3RlZCBlbGVtZW50cwotICAgIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQsIHRoZSBKU0YgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgc3VpdGFibGUKLSAgICBkZWZhdWx0LgotLS0+Ci08IUVMRU1FTlQgYXBwbGljYXRpb24gICAgICgoYWN0aW9uLWxpc3RlbmVyfGRlZmF1bHQtcmVuZGVyLWtpdC1pZHxtZXNzYWdlLWJ1bmRsZXxuYXZpZ2F0aW9uLWhhbmRsZXJ8dmlldy1oYW5kbGVyfHN0YXRlLW1hbmFnZXJ8cHJvcGVydHktcmVzb2x2ZXJ8dmFyaWFibGUtcmVzb2x2ZXJ8bG9jYWxlLWNvbmZpZykqKT4KLQotCi08IS0tCi0gICAgVGhlICJmYWN0b3J5IiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGRlZmluZSB0aGUgdmFyaW91cwotICAgIEZhY3RvcmllcyB0aGF0IGNvbXByaXNlIHBhcnRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBKYXZhU2VydmVyCi0gICAgRmFjZXMuICBGb3IgbmVzdGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQsIHRoZSBKU0YKLSAgICBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBzdWl0YWJsZSBkZWZhdWx0LgotLS0+Ci08IUVMRU1FTlQgZmFjdG9yeSAgICAgKChhcHBsaWNhdGlvbi1mYWN0b3J5fGZhY2VzLWNvbnRleHQtZmFjdG9yeXxsaWZlY3ljbGUtZmFjdG9yeXxyZW5kZXIta2l0LWZhY3RvcnkpKik+Ci0KLQotPCEtLQotICAgIFRoZSAiYXR0cmlidXRlIiBlbGVtZW50IHJlcHJlc2VudHMgYSBuYW1lZCwgdHlwZWQsIHZhbHVlIGFzc29jaWF0ZWQgd2l0aAotICAgIHRoZSBwYXJlbnQgVUlDb21wb25lbnQgdmlhIHRoZSBnZW5lcmljIGF0dHJpYnV0ZXMgbWVjaGFuaXNtLgotCi0gICAgQXR0cmlidXRlIG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHBhcmVudCAob3IgcmVsYXRlZCkKLSAgICBjb21wb25lbnQuCi0tLT4KLTwhRUxFTUVOVCBhdHRyaWJ1dGUgICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIGF0dHJpYnV0ZS1uYW1lLCBhdHRyaWJ1dGUtY2xhc3MsIGRlZmF1bHQtdmFsdWU/LCBzdWdnZXN0ZWQtdmFsdWU/LCBhdHRyaWJ1dGUtZXh0ZW5zaW9uKik+Ci0KLTwhLS0gCi0gICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGF0dHJpYnV0ZS4gIE1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgc3BlY2lmaWMgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIGF0dHJpYnV0ZS1leHRlbnNpb24gQU5ZPgotCi0KLTwhLS0KLSAgICBUaGUgImNvbXBvbmVudCIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgVUlDb21wb25lbnQgaW1wbGVtZW50YXRpb24KLSAgICBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgdHlwZSBpZGVudGlmaWVyLAotICAgIGFsb25nIHdpdGggaXRzIGFzc29jaWF0ZWQgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcy4gIENvbXBvbmVudCB0eXBlcyBtdXN0Ci0gICAgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGF0dHJpYnV0ZXMgdGhhdCBhcmUgcmVjb2duaXplZAotICAgIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBsb2dpYyBvZiB0aGlzIGNvbXBvbmVudC4gIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzCi0gICAgaWRlbnRpZnkgSmF2YUJlYW5zIHByb3BlcnRpZXMgb2YgdGhlIGNvbXBvbmVudCBjbGFzcyB0aGF0IG1heSBiZSBleHBvc2VkCi0gICAgZm9yIG1hbmlwdWxhdGlvbiB2aWEgdG9vbHMuCi0tLT4KLTwhRUxFTUVOVCBjb21wb25lbnQgICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIGNvbXBvbmVudC10eXBlLCBjb21wb25lbnQtY2xhc3MsIGF0dHJpYnV0ZSosIHByb3BlcnR5KiwgY29tcG9uZW50LWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBjb21wb25lbnQuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBjb21wb25lbnQtZXh0ZW5zaW9uIEFOWT4KLQotCi0KLTwhLS0KLSAgICBUaGUgImNvbnZlcnRlciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgQ29udmVydGVyIGltcGxlbWVudGF0aW9uCi0gICAgY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIGNvbnZlcnRlciBpZGVudGlmaWVyLgotICAgIENvbnZlcnRlciBpZGVudGlmaWVycyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgbWF5IGJlCi0gICAgY29uZmlndXJlZCBvbiB0aGUgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciB0byBhZmZlY3QgdGhlCi0gICAgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuICBOZXN0ZWQgInByb3BlcnR5IiBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMKLSAgICBwcm9wZXJ0aWVzIG9mIHRoZSBDb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBtYXkgYmUgY29uZmlndXJlZAotICAgIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuCi0tLT4KLTwhRUxFTUVOVCBjb252ZXJ0ZXIgICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIChjb252ZXJ0ZXItaWQgfCBjb252ZXJ0ZXItZm9yLWNsYXNzKSwgY29udmVydGVyLWNsYXNzLCBhdHRyaWJ1dGUqLCBwcm9wZXJ0eSopPgotCi0KLTwhLS0KLSAgICBUaGUgImljb24iIGVsZW1lbnQgY29udGFpbnMgInNtYWxsLWljb24iIGFuZCAibGFyZ2UtaWNvbiIgZWxlbWVudHMgdGhhdAotICAgIHNwZWNpZnkgdGhlIHJlc29ydWNlIHBhdGhzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGIG9yIEpQRyBpY29uIGltYWdlcwotICAgIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhIEdVSSB0b29sLgotLS0+Ci08IUVMRU1FTlQgaWNvbiAgICAgICAgICAgIChzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8pPgotPCFBVFRMSVNUIGljb24gICAgICAgICAgICB4bWw6bGFuZyAgICAgICAgJUxhbmd1YWdlOyAgICAgICNJTVBMSUVEPgotCi08IS0tCi0gICAgVGhlICJsaWZlY3ljbGUiIGVsZW1lbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gc3BlY2lmeQotICAgIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGJlaGF2aW91ciBvZiB0aGUgZGVmYXVsdCBMaWZlY3ljbGUKLSAgICBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0tLT4KLTwhRUxFTUVOVCBsaWZlY3ljbGUgICAgICAgKHBoYXNlLWxpc3RlbmVyKik+Ci0KLTwhLS0KLSAgICAgVGhlICJsb2NhbGUtY29uZmlnIiBlbGVtZW50IGFsbG93cyB0aGUgYXBwIGRldmVsb3BlciB0byBkZWNsYXJlIHRoZQotICAgICBzdXBwb3J0ZWQgbG9jYWxlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gIAotLS0+Ci08IUVMRU1FTlQgbG9jYWxlLWNvbmZpZyAoZGVmYXVsdC1sb2NhbGU/LCBzdXBwb3J0ZWQtbG9jYWxlKik+Ci0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtYmVhbiIgZWxlbWVudCByZXByZXNlbnRzIGEgSmF2YUJlYW4sIG9mIGEgcGFydGljdWxhciBjbGFzcywKLSAgICB0aGF0IHdpbGwgYmUgZHluYW1pY2FsbHkgaW5zdGFudGlhdGVkIGF0IHJ1bnRpbWUgKGJ5IHRoZSBkZWZhdWx0Ci0gICAgVmFyaWFibGVSZXNvbHZlciBpbXBsZW1lbnRhdGlvbikgaWYgaXQgaXMgcmVmZXJlbmNlZCBhcyB0aGUgZmlyc3QgZWxlbWVudAotICAgIG9mIGEgdmFsdWUgYmluZGluZyBleHByZXNzaW9uLCBhbmQgbm8gY29ycmVzcG9uZGluZyBiZWFuIGNhbiBiZQotICAgIGlkZW50aWZpZWQgaW4gYW55IHNjb3BlLiAgSW4gYWRkaXRpb24gdG8gdGhlIGNyZWF0aW9uIG9mIHRoZSBtYW5hZ2VkIGJlYW4sCi0gICAgYW5kIHRoZSBvcHRpb25hbCBzdG9yaW5nIG9mIGl0IGludG8gdGhlIHNwZWNpZmllZCBzY29wZSwgdGhlIG5lc3RlZAotICAgIG1hbmFnZWQtcHJvcGVydHkgZWxlbWVudHMgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YKLSAgICBzZXR0YWJsZSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiB0aGUgY3JlYXRlZCBpbnN0YW5jZS4KLS0tPgotPCFFTEVNRU5UIG1hbmFnZWQtYmVhbiAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgbWFuYWdlZC1iZWFuLW5hbWUsIG1hbmFnZWQtYmVhbi1jbGFzcywgbWFuYWdlZC1iZWFuLXNjb3BlLCAobWFuYWdlZC1wcm9wZXJ0eSogfCBtYXAtZW50cmllcyB8IGxpc3QtZW50cmllcykpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtcHJvcGVydHkiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIHByb3BlcnR5IG9mIGEKLSAgICBtYW5hZ2VkIGJlYW4gdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSAob3IgdmFsdWUgc2V0KQotICAgIGlmIHRoZSBjb3JyZXNwb25kaW5nIG1hbmFnZWQgYmVhbiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLXByb3BlcnR5IChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBwcm9wZXJ0eS1uYW1lLCBwcm9wZXJ0eS1jbGFzcz8sIChtYXAtZW50cmllc3xudWxsLXZhbHVlfHZhbHVlfGxpc3QtZW50cmllcykpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hcC1lbnRyeSIgZWxlbWVudCByZXByc2VudHMgYSBzaW5nbGUga2V5LWVudHJ5IHBhaXIgdGhhdAotICAgIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbXB1dGVkIHZhbHVlIG9mIGEgbWFuYWdlZCBwcm9wZXJ0eSBvZiB0eXBlCi0gICAgamF2YS51dGlsLk1hcC4KLS0tPgotPCFFTEVNRU5UIG1hcC1lbnRyeSAoa2V5LCAobnVsbC12YWx1ZXx2YWx1ZSkpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hcC1lbnRyaWVzJyBlbGVtZW50IHJlcHJlc2VudHMgYSBzZXQgb2Yga2V5LWVudHJ5IHBhaXJzIHRoYXQKLSAgICB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhIG1hbmFnZWQgcHJvcGVydHkgb2YgdHlwZQotICAgIGphdmEudXRpbC5NYXAuICBJbiBhZGRpdGlvbiwgdGhlIEphdmEgY2xhc3MgdHlwZXMgb2YgdGhlIGtleSBhbmQgZW50cnkKLSAgICB2YWx1ZXMgbWF5IGJlIG9wdGlvbmFsbHkgZGVjbGFyZWQuCi0tLT4KLTwhRUxFTUVOVCBtYXAtZW50cmllcyAoa2V5LWNsYXNzPywgdmFsdWUtY2xhc3M/LCBtYXAtZW50cnkqKT4KLQotCi08IS0tCi0gICAgVGhlIGJhc2UgbmFtZSBvZiBhIHJlc291cmNlIGJ1bmRsZSByZXByZXNlbnRpbmcgdGhlIG1lc3NhZ2UgcmVzb3VyY2VzCi0gICAgZm9yIHRoaXMgYXBwbGljYXRpb24uICBTZWUgdGhlIEphdmFEb2NzIGZvciB0aGUgImphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSIKLSAgICBjbGFzcyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgc3ludGF4IG9mIHJlc291cmNlIGJ1bmRsZSBuYW1lcy4KLS0tPgotCi08IUVMRU1FTlQgbWVzc2FnZS1idW5kbGUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgIm5hdmlnYXRpb24tY2FzZSIgZWxlbWVudCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIGNvbWJpbmF0aW9uIG9mCi0gICAgY29uZGl0aW9ucyB0aGF0IG11c3QgbWF0Y2ggZm9yIHRoaXMgY2FzZSB0byBiZSBleGVjdXRlZCwgYW5kIHRoZQotICAgIHZpZXcgaWQgb2YgdGhlIGNvbXBvbmVudCB0cmVlIHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkIG5leHQuCi0tLT4KLTwhRUxFTUVOVCBuYXZpZ2F0aW9uLWNhc2UgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIGZyb20tYWN0aW9uPywgZnJvbS1vdXRjb21lPywgdG8tdmlldy1pZCwgcmVkaXJlY3Q/KT4KLQotCi08IS0tCi0gICAgVGhlICJuYXZpZ2F0aW9uLXJ1bGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIGRlY2lzaW9uIHJ1bGUKLSAgICB0aGF0IHdpbGwgYmUgdXRpbGl6ZWQgYnkgdGhlIGRlZmF1bHQgTmF2aWdhdGlvbkhhbmRsZXIKLSAgICBpbXBsZW1lbnRhdGlvbiB0byBtYWtlIGRlY2lzaW9ucyBvbiB3aGF0IHZpZXcgc2hvdWxkIGJlIGRpc3BsYXllZAotICAgIG5leHQsIGJhc2VkIG9uIHRoZSB2aWV3IGlkIGJlaW5nIHByb2Nlc3NlZC4KLS0tPgotPCFFTEVNRU5UIG5hdmlnYXRpb24tcnVsZSAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgZnJvbS12aWV3LWlkPywgbmF2aWdhdGlvbi1jYXNlKik+Ci0KLQotPCEtLQotICAgIFRoZSAicHJvcGVydHkiIGVsZW1lbnQgcmVwcmVzZW50cyBhIEphdmFCZWFuIHByb3BlcnR5IG9mIHRoZSBKYXZhIGNsYXNzCi0gICAgcmVwcmVzZW50ZWQgYnkgb3VyIHBhcmVudCBlbGVtZW50LgotCi0gICAgUHJvcGVydHkgbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgSmF2YSBjbGFzcwotICAgIHRoYXQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBlbGVtZW50LCBhbmQgbXVzdCBjb3JyZXNwb25kIHRvCi0gICAgcHJvcGVydHkgbmFtZXMgdGhhdCB3aWxsIGJlIHJlY29nbml6ZWQgd2hlbiBwZXJmb3JtaW5nIGludHJvc3BlY3Rpb24KLSAgICBhZ2FpbnN0IHRoYXQgY2xhc3MgdmlhIGphdmEuYmVhbnMuSW50cm9zcGVjdG9yLgotLS0+Ci08IUVMRU1FTlQgcHJvcGVydHkgICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBwcm9wZXJ0eS1uYW1lLCBwcm9wZXJ0eS1jbGFzcywgZGVmYXVsdC12YWx1ZT8sIHN1Z2dlc3RlZC12YWx1ZT8sIHByb3BlcnR5LWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBwcm9wZXJ0eS4gIE1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgc3BlY2lmaWMgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5LWV4dGVuc2lvbiBBTlk+Ci0KLTwhLS0KLSAgICBUaGUgInJlZmVyZW5jZWQtYmVhbiIgZWxlbWVudCByZXByZXNlbnRzIGF0IGRlc2lnbiB0aW1lIHRoZSBwcm9taXNlCi0gICAgdGhhdCBhIEphdmEgb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB3aWxsIGV4aXN0IGF0IHJ1bnRpbWUgaW4gc29tZQotICAgIHNjb3BlLCB1bmRlciB0aGUgc3BlY2lmaWVkIGtleS4gIFRoaXMgY2FuIGJlIHVzZWQgYnkgZGVzaWduIHRpbWUgdG9vbHMKLSAgICB0byBjb25zdHJ1Y3QgdXNlciBpbnRlcmZhY2UgZGlhbG9ncyBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUKLSAgICBzcGVjaWZpZWQgY2xhc3MuICBUaGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBhIHJlZmVyZW5jZWQgYmVhbgotICAgIGVsZW1lbnQgaGFzIG5vIGltcGFjdCBvbiB0aGUgSmF2YVNlcnZlciBGYWNlcyBydW50aW1lIGVudmlyb25tZW50Ci0gICAgaW5zaWRlIGEgd2ViIGFwcGxpY2F0aW9uLgotLS0+Ci08IUVMRU1FTlQgcmVmZXJlbmNlZC1iZWFuIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCByZWZlcmVuY2VkLWJlYW4tbmFtZSwgcmVmZXJlbmNlZC1iZWFuLWNsYXNzKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXIta2l0IiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBSZW5kZXJLaXQgaW1wbGVtZW50YXRpb24KLSAgICB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgcmVuZGVyLWtpdC1pZC4gIElmIG5vCi0gICAgcmVuZGVyLWtpdC1pZCBpcyBzcGVjaWZpZWQsIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZWZhdWx0IFJlbmRlcktpdAotICAgIChSZW5kZXJLaXRGYWN0b3J5LkRFRkFVTFRfUkVOREVSX0tJVCkgaXMgYXNzdW1lZC4KLS0tPgotPCFFTEVNRU5UIHJlbmRlci1raXQgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcmVuZGVyLWtpdC1pZD8sIHJlbmRlci1raXQtY2xhc3M/LCByZW5kZXJlciopPgotCi0KLTwhLS0KLSAgICBUaGUgInJlbmRlcmVyIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBSZW5kZXJlciBpbXBsZW1lbnRhdGlvbgotICAgIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgZmFtaWx5Ci0gICAgYW5kIHJlbmRlcmVyIHR5cGUgaWRlbnRpZmllcnMsIGluIHRoZSBSZW5kZXJLaXQgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgIHBhcmVudCAicmVuZGVyLWtpdCIgZWxlbWVudC4gIENvbWJpbmF0aW9ucyBvZiBjb21wb25lbnQgZmFtaWx5IGFuZCByZW5kZXJlcgotICAgIHR5cGUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBSZW5kZXJLaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJlbnQKLSAgICAicmVuZGVyLWtpdCIgZWxlbWVudC4KLQotICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGNvbXBvbmVudCBhdHRyaWJ1dGVzIHRoYXQKLSAgICBhcmUgcmVjb2duaXplZCBieSB0aGlzIHJlbmRlcmVyLgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyZXIgICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBjb21wb25lbnQtZmFtaWx5LCByZW5kZXJlci10eXBlLCByZW5kZXJlci1jbGFzcywgYXR0cmlidXRlKiwgcmVuZGVyZXItZXh0ZW5zaW9uKik+Ci0KLTwhLS0gCi0gICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHJlbmRlcmVyLiAgTWF5IGNvbnRhaW4gaW1wbGVtZW50YXRpb24KLSAgICBzcGVjaWZpYyBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyZXItZXh0ZW5zaW9uIEFOWT4KLQotPCEtLQotICAgIFRoZSAidmFsaWRhdG9yIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBWYWxpZGF0b3IgaW1wbGVtZW50YXRpb24KLSAgICBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkZW50aWZpZXIuCi0gICAgVmFsaWRhdG9yIGlkZW50aWZpZXJzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUKLSAgICBjb25maWd1cmVkIG9uIHRoZSBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGluIG9yZGVyIHRvIGFmZmVjdCB0aGUKLSAgICBvcGVyYXRpb24gb2YgdGhlIFZhbGlkYXRvci4gIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucwotICAgIHByb3BlcnRpZXMgb2YgdGhlIFZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IG1heSBiZSBjb25maWd1cmVkCi0gICAgdG8gYWZmZWN0IHRoZSBvcGVyYXRpb24gb2YgdGhlIFZhbGlkYXRvci4KLS0tPgotPCFFTEVNRU5UIHZhbGlkYXRvciAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgdmFsaWRhdG9yLWlkLCB2YWxpZGF0b3ItY2xhc3MsIGF0dHJpYnV0ZSosIHByb3BlcnR5Kik+Ci0KLQotPCEtLQotICAgIFRoZSAibGlzdC1lbnRyaWVzIiBlbGVtZW50IHJlcHJlc2VudHMgYSBzZXQgb2YgaW5pdGlhbGl6YXRpb24KLSAgICBlbGVtZW50cyBmb3IgYSBtYW5hZ2VkIHByb3BlcnR5IHRoYXQgaXMgYSBqYXZhLnV0aWwuTGlzdCBvciBhbgotICAgIGFycmF5LiAgSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgInZhbHVlLWNsYXNzIiBlbGVtZW50IGNhbiBvcHRpb25hbGx5Ci0gICAgYmUgdXNlZCB0byBkZWNsYXJlIHRoZSBKYXZhIHR5cGUgdG8gd2hpY2ggZWFjaCB2YWx1ZSBzaG91bGQgYmUKLSAgICBjb252ZXJ0ZWQgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgQ29sbGVjdGlvbi4KLS0tPgotPCFFTEVNRU5UIGxpc3QtZW50cmllcyAgICAodmFsdWUtY2xhc3M/LCAobnVsbC12YWx1ZXx2YWx1ZSkqKT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09IFN1Ym9yZGluYXRlIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLQotICAgIFRoZSAiYWN0aW9uLWxpc3RlbmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBBY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgZHVyaW5nIHRoZSBJbnZva2UgQXBwbGljYXRpb24gcGhhc2Ugb2YgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBsaWZlY3ljbGUuCi0gICAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgYWN0aW9uLWxpc3RlbmVyICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiYXBwbGljYXRpb24tZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0gICAgbmFtZSBvZiB0aGUgY29uY3JldGUgQXBwbGljYXRpb25GYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQKLSAgICB3aWxsIGJlIGNhbGxlZCB3aGVuIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShBUFBMSUNBVElPTl9GQUNUT1JZKSBpcwotICAgIGNhbGxlZC4gSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgYXBwbGljYXRpb24tZmFjdG9yeSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImF0dHJpYnV0ZS1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIHZhbHVlCi0gICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXR0cmlidXRlIG5hbWUuICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBhdHRyaWJ1dGUtY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImF0dHJpYnV0ZS1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIG5hbWUgdW5kZXIgd2hpY2ggdGhlCi0gICAgY29ycmVzcG9uZGluZyB2YWx1ZSB3aWxsIGJlIHN0b3JlZCwgaW4gdGhlIGdlbmVyaWMgYXR0cmlidXRlcyBvZiB0aGUKLSAgICBVSUNvbXBvbmVudCB3ZSBhcmUgcmVsYXRlZCB0by4KLS0tPgotPCFFTEVNRU5UIGF0dHJpYnV0ZS1uYW1lICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29tcG9uZW50LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgYSBjb25jcmV0ZSBVSUNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50LWNsYXNzICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJjb21wb25lbnQtZmFtaWx5IiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGNvbXBvbmVudCBmYW1pbHkgZm9yCi0gICAgd2hpY2ggdGhlIFJlbmRlcmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgInJlbmRlcmVyIiBlbGVtZW50IHdpbGwgYmUKLSAgICB1c2VkLgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50LWZhbWlseSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImNvbXBvbmVudC10eXBlIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIG5hbWUgdW5kZXIgd2hpY2ggdGhlCi0gICAgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBjbGFzcyBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KLS0tPgotPCFFTEVNRU5UIGNvbXBvbmVudC10eXBlICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29udmVydGVyLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgYSBjb25jcmV0ZSBDb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGNvbnZlcnRlci1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29udmVydGVyLWZvci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIGZvciB3aGljaCBhIENvbnZlcnRlciBjbGFzcyB3aWxsIGJlIHJlZ2lzdGVyZWQuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGNvbnZlcnRlci1mb3ItY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImNvbnZlcnRlci1pZCIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBpZGVudGlmaWVyIHVuZGVyIHdoaWNoIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgQ29udmVydGVyIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkLgotLS0+Ci08IUVMRU1FTlQgY29udmVydGVyLWlkICAgICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiZGVmYXVsdC1yZW5kZXIta2l0LWlkIiBlbGVtZW50IGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gZGVmaW5lCi0gICAgYSByZW5kZXJraXQgdG8gYmUgdXNlZCBvdGhlciB0aGFuIHRoZSBzdGFuZGFyZCBvbmUuIAotLS0+Ci08IUVMRU1FTlQgZGVmYXVsdC1yZW5kZXIta2l0LWlkICAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgIFRoZSAiZGVmYXVsdC1sb2NhbGUiIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGRlZmF1bHQgbG9jYWxlIGZvciB0aGlzCi0gICAgIGFwcGxpY2F0aW9uIGluc3RhbmNlLiAgSXQgbXVzdCBiZSBzcGVjaWZpZWQgYXMKLSAgICAgOmxhbmd1YWdlOltfOmNvdW50cnk6W186dmFyaWFudDpdXSB3aXRob3V0IHRoZSBjb2xvbnMsIGZvciBleGFtcGxlCi0gICAgICJqYV9KUF9TSklTIi4gIFRoZSBzZXBhcmF0b3JzIGJldHdlZW4gdGhlIHNlZ21lbnRzIG1heSBiZSAnLScgb3IKLSAgICAgJ18nLgotLS0+Ci08IUVMRU1FTlQgZGVmYXVsdC1sb2NhbGUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJkZWZhdWx0LXZhbHVlIiBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUKLSAgICBpbiB3aGljaCB0aGlzIGVsZW1lbnQgcmVzaWRlcy4gIFRoaXMgdmFsdWUgZGlmZmVycyBmcm9tIHRoZQotICAgICJzdWdnZXN0ZWQtdmFsdWUiIGluIHRoYXQgdGhlIHByb3BlcnR5IG9yIGF0dHJpYnV0ZSBtdXN0IHRha2UgdGhlCi0gICAgdmFsdWUsIHdoZXJlYXMgaW4gInN1Z2dlc3RlZC12YWx1ZSIgdGFraW5nIHRoZSB2YWx1ZSBpcyBvcHRpb25hbC4KLS0tPgotPCFFTEVNRU5UIGRlZmF1bHQtdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJkZXNjcmlwdGlvbiIgZWxlbWVudCBjb250YWlucyBhIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIGVsZW1lbnQKLSAgICBpdCBpcyBuZXN0ZWQgaW4sIG9wdGlvbmFsbHkgZmxhZ2dlZCB3aXRoIGEgbGFuZ3VhZ2UgY29kZSB1c2luZyB0aGUKLSAgICAieG1sOmxhbmciIGF0dHJpYnV0ZS4KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICAgICBBTlk+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gICAgIHhtbDpsYW5nICAgICAgICAlTGFuZ3VhZ2U7ICAgICAgI0lNUExJRUQ+Ci0KLQotPCEtLQotICAgIFRoZSAiZGlzcGxheS1uYW1lIiBlbGVtZW50IGlzIGEgc2hvcnQgZGVzY3JpcHRpdmUgbmFtZSBkZXNjcmliaW5nIHRoZQotICAgIGVudGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgaXQgaXMgbmVzdGVkIGluLCBpbnRlbmRlZCB0byBiZQotICAgIGRpc3BsYXllZCBieSB0b29scywgYW5kIG9wdGlvbmFsbHkgZmxhZ2dlZCB3aXRoIGEgbGFuZ3VhZ2UgY29kZSB1c2luZwotICAgIHRoZSAieG1sOmxhbmciIGF0dHJpYnV0ZS4KLS0tPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAgICAoI1BDREFUQSk+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lICAgIHhtbDpsYW5nICAgICAgICAlTGFuZ3VhZ2U7ICAgICAgI0lNUExJRUQ+Ci0KLTwhLS0KLSAgICBUaGUgImZhY2VzLWNvbnRleHQtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkCi0gICAgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgRmFjZXNDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbgotICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGQUNFU19DT05URVhUX0ZBQ1RPUlkpIGlzIGNhbGxlZC4gSXQgbXVzdAotICAgIGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBmYWNlcy1jb250ZXh0LWZhY3RvcnkgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJmcm9tLWFjdGlvbiIgZWxlbWVudCBjb250YWlucyBhbiBhY3Rpb24gcmVmZXJlbmNlIGV4cHJlc3Npb24KLSAgICB0aGF0IG11c3QgaGF2ZSBiZWVuIGV4ZWN1dGVkIChieSB0aGUgZGVmYXVsdCBBY3Rpb25MaXN0ZW5lciBmb3IgaGFuZGxpbmcKLSAgICBhcHBsaWNhdGlvbiBsZXZlbCBldmVudHMpIGluIG9yZGVyIHRvIHNlbGVjdCB0aGlzIG5hdmlnYXRpb24gcnVsZS4gIElmCi0gICAgbm90IHNwZWNpZmllZCwgdGhpcyBydWxlIHdpbGwgYmUgcmVsZXZhbnQgbm8gbWF0dGVyIHdoaWNoIGFjdGlvbiByZWZlcmVuY2UKLSAgICB3YXMgZXhlY3V0ZWQgKG9yIGlmIG5vIGFjdGlvbiByZWZlcmVuY2Ugd2FzIGV4ZWN1dGVkKS4KLQotICAgIFRoaXMgdmFsdWUgbXVzdCBiZSBvZiB0eXBlICJBY3Rpb24iLgotLS0+Ci08IUVMRU1FTlQgZnJvbS1hY3Rpb24gKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImZyb20tb3V0Y29tZSIgZWxlbWVudCBjb250YWlucyBhIGxvZ2ljYWwgb3V0Y29tZSBzdHJpbmcgcmV0dXJuZWQKLSAgICBieSB0aGUgZXhlY3V0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGFjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgdmlhIGFuCi0gICAgImFjdGlvblJlZiIgcHJvcGVydHkgKG9yIGEgbGl0ZXJhbCB2YWx1ZSBzcGVjaWZpZWQgYnkgYW4gImFjdGlvbiIKLSAgICBwcm9wZXJ0eSkgb2YgYSBVSUNvbW1hbmQgY29tcG9uZW50LiAgSWYgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgd2lsbCBiZQotICAgIHJlbGV2YW50IG9ubHkgaWYgdGhlIG91dGNvbWUgdmFsdWUgbWF0Y2hlcyB0aGlzIGVsZW1lbnQncyB2YWx1ZS4gIElmCi0gICAgbm90IHNwZWNpZmllZCwgdGhpcyBydWxlIHdpbGwgYmUgcmVsZXZhbnQgbm8gbWF0dGVyIHdoYXQgdGhlIG91dGNvbWUKLSAgICB2YWx1ZSB3YXMuCi0tLT4KLTwhRUxFTUVOVCBmcm9tLW91dGNvbWUgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImZyb20tdmlldy1pZCIgZWxlbWVudCBjb250YWlucyB0aGUgdmlldyBpZGVudGlmaWVyIG9mIHRoZSB2aWV3Ci0gICAgZm9yIHdoaWNoIHRoZSBjb250YWluaW5nIG5hdmlnYXRpb24gcnVsZSBpcyByZWxldmFudC4gIElmIG5vCi0gICAgImZyb20tdmlldyIgZWxlbWVudCBpcyBzcGVjaWZpZWQsIHRoaXMgcnVsZSBhcHBsaWVzIHRvIG5hdmlnYXRpb24KLSAgICBkZWNpc2lvbnMgb24gYWxsIHZpZXdzLiAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIGEgdmFsdWUKLSAgICBvZiAiKiIgaXMgYXNzdW1lZCwgbWVhbmluZyB0aGF0IHRoaXMgbmF2aWdhdGlvbiBydWxlIGFwcGxpZXMgdG8gYWxsCi0gICAgdmlld3MuCi0KLSAgICBUaGlzIHZhbHVlIG11c3QgYmUgb2YgdHlwZSAiVmlld0lkUGF0dGVybiIuCi0tLT4KLTwhRUxFTUVOVCBmcm9tLXZpZXctaWQgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImtleSIgZWxlbWVudCBpcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWFwIGtleSB0aGF0Ci0gICAgd2lsbCBiZSBzdG9yZWQgaW4gYSBtYW5hZ2VkIHByb3BlcnR5IG9mIHR5cGUgamF2YS51dGlsLk1hcC4gIAotLS0+Ci08IUVMRU1FTlQga2V5ICAgICAgICAgICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJrZXktY2xhc3MiIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIHRvIHdoaWNoIGVhY2ggImtleSIKLSAgICBlbGVtZW50IGluIGEgc2V0IG9mICJtYXAtZW50cnkiIGVsZW1lbnRzIHdpbGwgYmUgY29udmVydGVkIHRvLiAgSXQKLSAgICBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuICBJZiBvbWl0dGVkLCAiamF2YS5sYW5nLlN0cmluZyIKLSAgICBpcyBhc3N1bWVkLgotLS0+Ci08IUVMRU1FTlQga2V5LWNsYXNzICAgICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJsYXJnZS1pY29uIiBlbGVtZW50IGNvbnRhaW5zIHRoZSByZXNvdXJjZSBwYXRoIHRvIGEgbGFyZ2UgKDMyeDMyKQotICAgIGljb24gaW1hZ2UuICBUaGUgaW1hZ2UgbWF5IGJlIGluIGVpdGhlciBHSUYgb3IgSlBHIGZvcm1hdC4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gICAgICAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImxpZmVjeWNsZS1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBMaWZlY3ljbGVGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICB3aGVuIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShMSUZFQ1lDTEVfRkFDVE9SWSkgaXMgY2FsbGVkLiBJdCBtdXN0IGJlIAotICAgIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBsaWZlY3ljbGUtZmFjdG9yeSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtYmVhbi1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLSAgICBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEgbmV3IGluc3RhbmNlCi0gICAgaWYgY3JlYXRpb24gb2YgdGhlIHNwZWNpZmllZCBtYW5hZ2VkIGJlYW4gaXMgcmVxdWVzdGVkLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0KLSAgICBUaGUgc3BlY2lmaWVkIGNsYXNzIG11c3QgY29uZm9ybSB0byBzdGFuZGFyZCBKYXZhQmVhbnMgY29udmVudGlvbnMuCi0gICAgSW4gcGFydGljdWxhciwgaXQgbXVzdCBoYXZlIGEgcHVibGljIHplcm8tYXJndW1lbnRzIGNvbnN0cnVjdG9yLCBhbmQKLSAgICB6ZXJvIG9yIG1vcmUgcHVibGljIHByb3BlcnR5IHNldHRlcnMuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4tY2xhc3MgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLWJlYW4tbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBhdHRyaWJ1dGUgbmFtZSB1bmRlcgotICAgIHdoaWNoIGEgbWFuYWdlZCBiZWFuIHdpbGwgYmUgc2VhcmNoZWQgZm9yLCBhcyB3ZWxsIGFzIHN0b3JlZCAodW5sZXNzCi0gICAgdGhlICJtYW5hZ2VkLWJlYW4tc2NvcGUiIHZhbHVlIGlzICJub25lIikuICBJdCBtdXN0IGJlIG9mIHR5cGUKLSAgICAiSWRlbnRpZmllciIuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4tbmFtZSAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAibWFuYWdlZC1iZWFuLXNjb3BlIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIHNjb3BlIGludG8gd2hpY2ggYSBuZXdseQotICAgIGNyZWF0ZWQgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBtYW5hZ2VkIGJlYW4gd2lsbCBiZSBzdG9yZWQgKHVubGVzcwotICAgIHRoZSB2YWx1ZSBpcyAibm9uZSIpLiAgSXQgbXVzdCBiZSBvZiB0eXBlICJTY29wZU9yTm9uZSIuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4tc2NvcGUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJuYXZpZ2F0aW9uLWhhbmRsZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIE5hdmlnYXRpb25IYW5kbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICBkdXJpbmcgdGhlIEludm9rZSBBcHBsaWNhdGlvbiBwaGFzZSBvZiB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIGxpZmVjeWNsZSwKLSAgICBpZiB0aGUgZGVmYXVsdCBBY3Rpb25MaXN0ZW5lciAocHJvdmlkZWQgYnkgdGhlIEpTRiBpbXBsZW1lbnRhdGlvbikgaXMgdXNlZC4KLSAgICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBuYXZpZ2F0aW9uLWhhbmRsZXIgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgInBoYXNlLWxpc3RlbmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLW5hbWUgb2YgdGhlIGNvbmNyZXRlIFBoYXNlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlCi1yZWdpc3RlcmVkIG9uIHRoZSBMaWZlY3ljbGUuIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHBoYXNlLWxpc3RlbmVyICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAicmVkaXJlY3QiIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgbmF2aWdhdGlvbiB0byB0aGUgc3BlY2lmaWVkCi0gICAgInRvLXZpZXctaWQiIHNob3VsZCBiZSBhY2NvbXBsaXNoZWQgYnkgcGVyZm9ybWluZyBhbiBIVFRQIHJlZGlyZWN0Ci0gICAgcmF0aGVyIHRoYW4gdGhlIHVzdWFsIFZpZXdIYW5kbGVyIG1lY2hhbmlzbXMuCi0tLT4KLTwhRUxFTUVOVCByZWRpcmVjdCBFTVBUWT4KLQotPCEtLQotICAgIFRoZSAic3VnZ2VzdGVkLXZhbHVlIiBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBvcgotICAgIGF0dHJpYnV0ZSBpbiB3aGljaCB0aGlzIGVsZW1lbnQgcmVzaWRlcy4gIFRoaXMgdmFsdWUgaXMgYWR2aXNvcnkKLSAgICBvbmx5IGFuZCBpcyBpbnRlbmRlZCBmb3IgdG9vbHMgdG8gdXNlIHdoZW4gcG9wdWxhdGluZyBwYWxsZXR0ZXMuCi0tLT4KLTwhRUxFTUVOVCBzdWdnZXN0ZWQtdmFsdWUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLQotICAgIFRoZSAidmlldy1oYW5kbGVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBWaWV3SGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgZHVyaW5nIHRoZSBSZXN0b3JlIFZpZXcgYW5kIFJlbmRlciBSZXNwb25zZSBwaGFzZXMgb2YgdGhlIHJlcXVlc3QKLSAgICBwcm9jZXNzaW5nIGxpZmVjeWNsZS4gIFRoZSBmYWNlcyBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYQotICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcwotLS0+Ci08IUVMRU1FTlQgdmlldy1oYW5kbGVyICgjUENEQVRBKT4KLQotPCEtLQotCi0gICAgVGhlICJzdGF0ZS1tYW5hZ2VyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBTdGF0ZU1hbmFnZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIGR1cmluZyB0aGUgUmVzdG9yZSBWaWV3IGFuZCBSZW5kZXIgUmVzcG9uc2UgcGhhc2VzIG9mIHRoZSByZXF1ZXN0Ci0gICAgcHJvY2Vzc2luZyBsaWZlY3ljbGUuICBUaGUgZmFjZXMgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEKLSAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MKLS0tPgotPCFFTEVNRU5UIHN0YXRlLW1hbmFnZXIgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJudWxsLXZhbHVlIiBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoZSBtYW5hZ2VkIHByb3BlcnR5IGluIHdoaWNoIHdlCi0gICAgYXJlIG5lc3RlZCB3aWxsIGJlIGV4cGxpY2l0bHkgc2V0IHRvIG51bGwgaWYgb3VyIG1hbmFnZWQgYmVhbiBpcwotICAgIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gb21pdHRpbmcgdGhlIG1hbmFnZWQKLSAgICBwcm9wZXJ0eSBlbGVtZW50IGVudGlyZWx5LCB3aGljaCB3aWxsIGNhdXNlIG5vIHByb3BlcnR5IHNldHRlciB0byBiZQotICAgIGNhbGxlZCBmb3IgdGhpcyBwcm9wZXJ0eS4KLQotICAgIFRoZSAibnVsbC12YWx1ZSIgZWxlbWVudCBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIGFzc29jaWF0ZWQKLSAgICAicHJvcGVydHktY2xhc3MiIGlkZW50aWZpZXMgYSBKYXZhIGNsYXNzLCBub3QgYSBKYXZhIHByaW1pdGl2ZS4KLS0tPgotPCFFTEVNRU5UIG51bGwtdmFsdWUgRU1QVFk+Ci0KLQotPCEtLQotICAgIFRoZSAicHJvcGVydHktY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YSB0eXBlIG9mIHRoZSB2YWx1ZQotICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb3BlcnR5IG5hbWUuICBJdCBtdXN0IGJlIG9mIHR5cGUgIkphdmFUeXBlIi4KLSAgICBJZiBub3Qgc3BlY2lmaWVkLCBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSBleGlzdGluZyBjbGFzc2VzOyBob3dldmVyLAotICAgIHRoaXMgZWxlbWVudCBzaG91bGQgYmUgc3BlY2lmaWVkIGlmIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgZ29pbmcKLSAgICB0byBiZSB0aGUgc291cmNlIGZvciBnZW5lcmF0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzZXMuCi0tLT4KLTwhRUxFTUVOVCBwcm9wZXJ0eS1jbGFzcyAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInByb3BlcnR5LW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YUJlYW5zIHByb3BlcnR5IG5hbWUKLSAgICB1bmRlciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBtYXkgYmUgc3RvcmVkLgotLS0+Ci08IUVMRU1FTlQgcHJvcGVydHktbmFtZSAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJwcm9wZXJ0eS1yZXNvbHZlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgUHJvcGVydHlSZXNvbHZlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgdXNlZAotICAgIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb25zLgotICAgIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5LXJlc29sdmVyICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJyZWZlcmVuY2VkLWJlYW4tY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0gICAgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyAoZWl0aGVyIGFic3RyYWN0IG9yIGNvbmNyZXRlKSBvciBKYXZhIGludGVyZmFjZQotICAgIGltcGxlbWVudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHJlZmVyZW5jZWQgYmVhbi4gIEl0IG11c3QgYmUgb2YgdHlwZQotICAgICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcmVmZXJlbmNlZC1iZWFuLWNsYXNzICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVmZXJlbmNlZC1iZWFuLW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgYXR0cmlidXRlIG5hbWUgdW5kZXIKLSAgICB3aGljaCB0aGUgY29ycmVzcG9uZGluZyByZWZlcmVuY2VkIGJlYW4gbWF5IGJlIGFzc3VtZWQgdG8gYmUgc3RvcmVkLAotICAgIGluIG9uZSBvZiB0aGUgc2NvcGVzIGRlZmluZWQgYnkgdGhlICJTY29wZSIgdHlwZS4gIEl0IG11c3QgYmUgb2YgdHlwZQotICAgICJJZGVudGlmaWVyIi4KLS0tPgotPCFFTEVNRU5UIHJlZmVyZW5jZWQtYmVhbi1uYW1lICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXIta2l0LWlkIiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciBmb3IgdGhlCi0gICAgUmVuZGVyS2l0IHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgInJlbmRlci1raXQiIGVsZW1lbnQuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXIta2l0LWlkICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInJlbmRlci1raXQtY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiBhIGNvbmNyZXRlIFJlbmRlcktpdCBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyLWtpdC1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVuZGVyZXItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiBhIGNvbmNyZXRlIFJlbmRlcmVyIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXJlci1jbGFzcyAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJyZW5kZXIta2l0LWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIFJlbmRlcktpdEZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIHdoZW4gRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KFJFTkRFUl9LSVRfRkFDVE9SWSkgaXMgY2FsbGVkLiBJdCBtdXN0IGJlIAotICAgIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXIta2l0LWZhY3RvcnkgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJyZW5kZXJlci10eXBlIiBlbGVtZW50IHJlcHJlc2VudHMgYSByZW5kZXJlciB0eXBlIGlkZW50aWZpZXIgZm9yIHRoZQotICAgIFJlbmRlcmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgInJlbmRlcmVyIiBlbGVtZW50LgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyZXItdHlwZSAgICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAic21hbGwtaWNvbiIgZWxlbWVudCBjb250YWlucyB0aGUgcmVzb3VyY2UgcGF0aCB0byBhIGxhcmdlICgxNngxNikKLSAgICBpY29uIGltYWdlLiAgVGhlIGltYWdlIG1heSBiZSBpbiBlaXRoZXIgR0lGIG9yIEpQRyBmb3JtYXQuCi0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICAgICAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgIFRoZSAic3VwcG9ydGVkLWxvY2FsZSIgZWxlbWVudCBhbGxvd3MgYXV0aG9ycyB0byBkZWNsYXJlIHdoaWNoCi0gICAgIGxvY2FsZXMgYXJlIHN1cHBvcnRlZCBpbiB0aGlzIGFwcGxpY2F0aW9uIGluc3RhbmNlLgotCi0gICAgIEl0IG11c3QgYmUgc3BlY2lmaWVkIGFzIDpsYW5ndWFnZTpbXzpjb3VudHJ5OltfOnZhcmlhbnQ6XV0gd2l0aG91dAotICAgICB0aGUgY29sb25zLCBmb3IgZXhhbXBsZSAiamFfSlBfU0pJUyIuICBUaGUgc2VwYXJhdG9ycyBiZXR3ZWVuIHRoZQotICAgICBzZWdtZW50cyBtYXkgYmUgJy0nIG9yICdfJy4KLS0tPgotPCFFTEVNRU5UIHN1cHBvcnRlZC1sb2NhbGUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJ0by12aWV3IiBlbGVtZW50IGNvbnRhaW5zIHRoZSB2aWV3IGlkZW50aWZpZXIgb2YgdGhlIG5leHQgdmlldwotICAgIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpZiB0aGlzIG5hdmlnYXRpb24gcnVsZSBpcyBtYXRjaGVkLiAgSXQKLSAgICBtdXN0IGJlIG9mIHR5cGUgIlZpZXdJZCIuCi0tLT4KLTwhRUxFTUVOVCB0by12aWV3LWlkICAgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInZhbGlkYXRvci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIGEgY29uY3JldGUgVmFsaWRhdG9yIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCB2YWxpZGF0b3ItY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInZhbGlkYXRvci1pZCIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBpZGVudGlmaWVyIHVuZGVyIHdoaWNoIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgVmFsaWRhdG9yIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkLgotLS0+Ci08IUVMRU1FTlQgdmFsaWRhdG9yLWlkICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJ2YWx1ZSIgZWxlbWVudCBpcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbGl0ZXJhbAotICAgIHZhbHVlIHRvIHdoaWNoIGEgc2NhbGFyIG1hbmFnZWQgcHJvcGVydHkgd2lsbCBiZSBzZXQsIG9yIGEgdmFsdWUKLSAgICBiaW5kaW5nIGV4cHJlc3Npb24gKCIjey4uLn0iKSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlCi0gICAgcmVxdWlyZWQgdmFsdWUuICBJdCB3aWxsIGJlIGNvbnZlcnRlZCBhcyBzcGVjaWZpZWQgZm9yIHRoZSBhY3R1YWwKLSAgICBwcm9wZXJ0eSB0eXBlLgotLS0+Ci08IUVMRU1FTlQgdmFsdWUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInZhbHVlLWNsYXNzIiBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSB0byB3aGljaCBlYWNoCi0gICAgInZhbHVlIiBlbGVtZW50J3MgdmFsdWUgd2lsbCBiZSBjb252ZXJ0ZWQgdG8sIHByaW9yIHRvIGFkZGluZyBpdCB0bwotICAgIHRoZSAibGlzdC1lbnRyaWVzIiBsaXN0IGZvciBhIG1hbmFnZWQgcHJvcGVydHkgdGhhdCBpcyBhCi0gICAgamF2YS51dGlsLkxpc3QsIG9yIGEgIm1hcC1lbnRyaWVzIiBtYXAgZm9yIGEgbWFuYWdlZCBwcm9wZXJ0eSB0aGF0Ci0gICAgaXMgYSBqYXZhLnV0aWwuTWFwLiAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLiAgSWYgb21pdHRlZCwKLSAgICAiamF2YS5sYW5nLlN0cmluZyIgaXMgYXNzdW1lZC4KLS0tPgotPCFFTEVNRU5UIHZhbHVlLWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAidmFyaWFibGUtcmVzb2x2ZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIFZhcmlhYmxlUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQKLSAgICBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgdmFsdWUgYmluZGluZyBleHByZXNzaW9ucy4KLSAgICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCB2YXJpYWJsZS1yZXNvbHZlciAoI1BDREFUQSk+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IElkZW50aWZpZXIgQXR0cmlidXRlcyA9PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IUFUVExJU1QgYWN0aW9uLWxpc3RlbmVyICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhcHBsaWNhdGlvbi1mYWN0b3J5ICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXR0cmlidXRlICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZS1jbGFzcyAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdHRyaWJ1dGUtZXh0ZW5zaW9uICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXR0cmlidXRlLW5hbWUgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbXBvbmVudCAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb21wb25lbnQtY2xhc3MgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29tcG9uZW50LWV4dGVuc2lvbiAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbXBvbmVudC1mYW1pbHkgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb21wb25lbnQtdHlwZSAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udmVydGVyICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnZlcnRlci1jbGFzcyAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb252ZXJ0ZXItZm9yLWNsYXNzICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udmVydGVyLWlkICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlZmF1bHQtbG9jYWxlICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZWZhdWx0LXJlbmRlci1raXQtaWQgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVmYXVsdC12YWx1ZSAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmFjZXMtY29uZmlnICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZhY2VzLWNvbnRleHQtZmFjdG9yeSAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmYWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZnJvbS1hY3Rpb24gICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZyb20tb3V0Y29tZSAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmcm9tLXZpZXctaWQgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBrZXktY2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpZmVjeWNsZSAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsaWZlY3ljbGUtZmFjdG9yeSAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlzdC1lbnRyaWVzICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvY2FsZS1jb25maWcgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkLWJlYW4gICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFuYWdlZC1iZWFuLWNsYXNzICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hbmFnZWQtYmVhbi1uYW1lICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkLWJlYW4tc2NvcGUgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFuYWdlZC1wcm9wZXJ0eSAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hcC1lbnRyaWVzICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYXAtZW50cnkgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWVzc2FnZS1idW5kbGUgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG5hdmlnYXRpb24tY2FzZSAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBuYXZpZ2F0aW9uLWhhbmRsZXIgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbmF2aWdhdGlvbi1ydWxlICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG51bGwtdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwaGFzZS1saXN0ZW5lciAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJvcGVydHkgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByb3BlcnR5LWNsYXNzICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcm9wZXJ0eS1leHRlbnNpb24gICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJvcGVydHktbmFtZSAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByb3BlcnR5LXJlc29sdmVyICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWRpcmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVmZXJlbmNlZC1iZWFuICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlZmVyZW5jZWQtYmVhbi1jbGFzcyAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWZlcmVuY2VkLWJlYW4tbmFtZSAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyLWtpdCAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlci1raXQtY2xhc3MgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXIta2l0LWZhY3RvcnkgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyLWtpdC1pZCAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXJlci1jbGFzcyAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyZXItZXh0ZW5zaW9uICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlcmVyLXR5cGUgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc3RhdGUtbWFuYWdlciAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHN1Z2dlc3RlZC12YWx1ZSAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzdXBwb3J0ZWQtbG9jYWxlICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdG8tdmlldy1pZCAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhbGlkYXRvciAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YWxpZGF0b3ItY2xhc3MgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFsaWRhdG9yLWlkICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YWx1ZS1jbGFzcyAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFyaWFibGUtcmVzb2x2ZXIgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZpZXctaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZGFkOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8xLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDg5NSArMCwwIEBACi08IS0tCi0gICAgRFREIGZvciB0aGUgSmF2YVNlcnZlciBGYWNlcyBBcHBsaWNhdGlvbiBDb25maWd1cmF0aW9uIEZpbGUgKFZlcnNpb24gMS4xKQotCi0gICAgVG8gc3VwcG9ydCB2YWxpZGF0aW9uIG9mIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlKHMpLCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcKLSAgICBET0NUWVBFIGVsZW1lbnQgYXQgdGhlIGJlZ2lubmluZyAoYWZ0ZXIgdGhlICJ4bWwiIGRlY2xhcmF0aW9uKToKLQotICAgIDwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4xLy9FTiIKLSAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIj4KLQotICAgICRJZDogd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQsdiAxLjEgMjAwNy8wNS8yNSAyMToxMjo0OCBkYXZpZF93aWxsaWFtcyBFeHAgJAotCi0tLT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09IERlZmluZWQgVHlwZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLQotICAgIEFuICJBY3Rpb24iIGlzIGEgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhIG1ldGhvZCBiaW5kaW5nCi0gICAgZXhwcmVzc2lvbiB0aGF0IHBvaW50cyBhdCBhIG1ldGhvZCB3aXRoIG5vIGFyZ3VtZW50cyB0aGF0IHJldHVybnMgYQotICAgIFN0cmluZy4gIEl0IG11c3QgYmUgYnJhY2tldGVkIHdpdGggIiN7fSIsIGZvciBleGFtcGxlLAotICAgICIje2NhcmRlbW8uYnV5Q2FyfSIuCi0tLT4KLTwhRU5USVRZICUgQWN0aW9uICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEEgIkNsYXNzTmFtZSIgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGlzCi0gICAgaW5zdGFudGlhdGVkIHRvIHByb3ZpZGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGVuY2xvc2luZyBlbGVtZW50LgotLS0+Ci08IUVOVElUWSAlIENsYXNzTmFtZSAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBbiAiSWRlbnRpZmllciIgaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IGNvbmZvcm1zIHRvIHRoZSB2YXJpYWJsZQotICAgIG5hbWluZyBjb252ZW50aW9ucyBvZiB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSAoSkxTIFNlY3Rpb24gPy4/Lj8pLgotLS0+Ci08IUVOVElUWSAlIElkZW50aWZpZXIgIkNEQVRBIj4KLQotCi08IS0tCi0gICAgQSAiSmF2YVR5cGUiIGlzIGVpdGhlciB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaXMKLSAgICBpbnN0YW50aWF0ZWQgdG8gcHJvdmlkZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZW5jbG9zaW5nIGVsZW1lbnQsIG9yCi0gICAgdGhlIG5hbWUgb2YgYSBKYXZhIHByaW1pdGl2ZSB0eXBlIChzdWNoIGFzIGludCBvciBjaGFyKS4gIFRoZSBjbGFzcyBuYW1lCi0gICAgb3IgcHJpbWl0aXZlIHR5cGUgbWF5IG9wdGlvbmFsbHkgYmUgZm9sbG93ZWQgYnkgIltdIiB0byBpbmRpY2F0ZSB0aGF0Ci0gICAgdGhlIHVuZGVybHlpbmcgZGF0YSBtdXN0IGJlIGFuIGFycmF5LCByYXRoZXIgdGhhbiBhIHNjYWxhciB2YXJpYWJsZS4KLS0tPgotPCFFTlRJVFkgJSBKYXZhVHlwZSAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBICJMYW5ndWFnZSIgaXMgYSBsb3dlciBjYXNlIHR3by1sZXR0ZXIgY29kZSBmb3IgYSBsYW5ndWFnZSBhcyBkZWZpbmVkCi0gICAgYnkgSVNMLTYzOS4KLS0tPgotPCFFTlRJVFkgJSBMYW5ndWFnZSAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBICJSZXNvdXJjZVBhdGgiIGlzIHRoZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoIHRvIGEgcmVzb3VyY2UgZmlsZQotICAgIChzdWNoIGFzIGEgbG9nbyBpbWFnZSkuCi0tLT4KLTwhRU5USVRZICUgUmVzb3VyY2VQYXRoICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEEgIlNjb3BlIiBpcyB0aGUgd2VsbC1rbm93biBuYW1lIG9mIGEgc2NvcGUgaW4gd2hpY2ggbWFuYWdlZCBiZWFucyBtYXkKLSAgICBvcHRpb25hbGx5IGJlIGRlZmluZWQgdG8gYmUgY3JlYXRlZCBpbi4KLS0tPgotPCFFTlRJVFkgJSBTY29wZSAiKHJlcXVlc3R8c2Vzc2lvbnxhcHBsaWNhdGlvbikiPgotCi0KLQotPCEtLQotICAgIEEgIlNjb3BlT3JOb25lIiBlbGVtZW50IGRlZmluZXMgdGhlIGxlZ2FsIHZhbHVlcyBmb3IgdGhlCi0gICAgPG1hbmFnZWQtYmVhbi1zY29wZT4gZWxlbWVudCdzIGJvZHkgY29udGVudCwgd2hpY2ggaW5jbHVkZXMKLSAgICBhbGwgb2YgdGhlIHNjb3BlcyByZXNwcmVzZW50ZWQgYnkgdGhlICJTY29wZSIgdHlwZSwgcGx1cyB0aGUKLSAgICAibm9uZSIgdmFsdWUgaW5kaWNhdGluZyB0aGF0IGEgY3JlYXRlZCBiZWFuIHNob3VsZCBub3QgYmUKLSAgICBzdG9yZWQgaW50byBhbnkgc2NvcGUuCi0tLT4KLTwhRU5USVRZICUgU2NvcGVPck5vbmUgIihyZXF1ZXN0fHNlc3Npb258YXBwbGljYXRpb258bm9uZSkiPgotCi0KLTwhLS0KLSAgICBBICJWaWV3SWRQYXR0ZXJuIiBpcyBhIHBhdHRlcm4gZm9yIG1hdGNoaW5nIHZpZXcgaWRlbnRpZmllcnMgaW4KLSAgICBvcmRlciB0byBkZXRlcm1pbmUgd2hldGhlciBhIHBhcnRpY3VsYXIgbmF2aWdhdGlvbiBydWxlIHNob3VsZCBiZQotICAgIGZpcmVkLiAgSXQgbXVzdCBjb250YWluIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLQotICAgIC0gVGhlIGV4YWN0IG1hdGNoIGZvciBhIHZpZXcgaWRlbnRpZmllciB0aGF0IGlzIHJlY29nbml6ZWQKLSAgICAgIGJ5IHRoZSB0aGUgVmlld0hhbmRsZXIgaW1wbGVtZW50YXRpb24gYmVpbmcgdXNlZCAoc3VjaCBhcwotICAgICAgIi9pbmRleC5qc3AiIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGRlZmF1bHQgVmlld0hhbmRsZXIpLgotCi0gICAgLSBBIHByb3BlciBwcmVmaXggb2YgYSB2aWV3IGlkZW50aWZpZXIsIHBsdXMgYSB0cmFpbGluZyAiKiIKLSAgICAgIGNoYXJhY3Rlci4gIFRoaXMgcGF0dGVybiBpbmRpY2F0ZXMgdGhhdCBhbGwgdmlldyBpZGVudGlmaWVycyB0aGF0Ci0gICAgICBtYXRjaCB0aGUgcG9ydGlvbiBvZiB0aGUgcGF0dGVybiB1cCB0byB0aGUgYXN0ZXJpc2sgd2lsbCBtYXRjaCB0aGUKLSAgICAgIHN1cnJvdW5kaW5nIHJ1bGUuICBXaGVuIG1vcmUgdGhhbiBvbmUgbWF0Y2ggZXhpc3RzLCB0aGUgbWF0Y2ggd2l0aAotICAgICAgdGhlIGxvbmdlc3QgcGF0dGVybiBpcyBzZWxlY3RlZC4KLQotICAgIC0gQW4gIioiIGNoYXJhY3Rlciwgd2hpY2ggbWVhbnMgdGhhdCB0aGlzIHBhdHRlcm4gYXBwbGllcyB0byBhbGwKLSAgICAgIHZpZXcgaWRlbnRpZmllcnMuCi0tLT4KLTwhRU5USVRZICUgVmlld0lkUGF0dGVybiAiQ0RBVEEiPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT0gVG9wIExldmVsIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tCi0gICAgVGhlICJmYWNlcy1jb25maWciIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLSAgICBoaWVyYXJjaHksIGFuZCBjb250YWlucyBuZXN0ZWQgZWxlbWVudHMgZm9yIGFsbCBvZiB0aGUgb3RoZXIgY29uZmlndXJhdGlvbgotICAgIHNldHRpbmdzLgotLS0+Ci08IUVMRU1FTlQgZmFjZXMtY29uZmlnICAgICgoYXBwbGljYXRpb258ZmFjdG9yeXxjb21wb25lbnR8Y29udmVydGVyfG1hbmFnZWQtYmVhbnxuYXZpZ2F0aW9uLXJ1bGV8cmVmZXJlbmNlZC1iZWFufHJlbmRlci1raXR8bGlmZWN5Y2xlfHZhbGlkYXRvcikqKT4KLTwhQVRUTElTVCBmYWNlcy1jb25maWcKLSAgICAgICB4bWxucyBDREFUQSAjRklYRUQgImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNGL0NvbmZpZ3VyYXRpb24iPgotCi0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PSBEZWZpbml0aW9uIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTwhLS0KLSAgICBUaGUgImFwcGxpY2F0aW9uIiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGRlZmluZSB0aGUgdmFyaW91cwotICAgIHBlci1hcHBsaWNhdGlvbi1zaW5nbGV0b24gaW1wbGVtZW50YXRpb24gYXJ0aWZhY3RzIGZvciBhIHBhcnRpY3VsYXIgd2ViCi0gICAgYXBwbGljYXRpb24gdGhhdCBpcyB1dGlsaXppbmcgSmF2YVNlcnZlciBGYWNlcy4gIEZvciBuZXN0ZWQgZWxlbWVudHMKLSAgICB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkLCB0aGUgSlNGIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhIHN1aXRhYmxlCi0gICAgZGVmYXVsdC4KLS0tPgotPCFFTEVNRU5UIGFwcGxpY2F0aW9uICAgICAoKGFjdGlvbi1saXN0ZW5lcnxkZWZhdWx0LXJlbmRlci1raXQtaWR8bWVzc2FnZS1idW5kbGV8bmF2aWdhdGlvbi1oYW5kbGVyfHZpZXctaGFuZGxlcnxzdGF0ZS1tYW5hZ2VyfHByb3BlcnR5LXJlc29sdmVyfHZhcmlhYmxlLXJlc29sdmVyfGxvY2FsZS1jb25maWcpKik+Ci0KLQotPCEtLQotICAgIFRoZSAiZmFjdG9yeSIgZWxlbWVudCBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBkZWZpbmUgdGhlIHZhcmlvdXMKLSAgICBGYWN0b3JpZXMgdGhhdCBjb21wcmlzZSBwYXJ0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgSmF2YVNlcnZlcgotICAgIEZhY2VzLiAgRm9yIG5lc3RlZCBlbGVtZW50cyB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkLCB0aGUgSlNGCi0gICAgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgc3VpdGFibGUgZGVmYXVsdC4KLS0tPgotPCFFTEVNRU5UIGZhY3RvcnkgICAgICgoYXBwbGljYXRpb24tZmFjdG9yeXxmYWNlcy1jb250ZXh0LWZhY3Rvcnl8bGlmZWN5Y2xlLWZhY3Rvcnl8cmVuZGVyLWtpdC1mYWN0b3J5KSopPgotCi0KLTwhLS0KLSAgICBUaGUgImF0dHJpYnV0ZSIgZWxlbWVudCByZXByZXNlbnRzIGEgbmFtZWQsIHR5cGVkLCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGgKLSAgICB0aGUgcGFyZW50IFVJQ29tcG9uZW50IHZpYSB0aGUgZ2VuZXJpYyBhdHRyaWJ1dGVzIG1lY2hhbmlzbS4KLQotICAgIEF0dHJpYnV0ZSBuYW1lcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwYXJlbnQgKG9yIHJlbGF0ZWQpCi0gICAgY29tcG9uZW50LgotLS0+Ci08IUVMRU1FTlQgYXR0cmlidXRlICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBhdHRyaWJ1dGUtbmFtZSwgYXR0cmlidXRlLWNsYXNzLCBkZWZhdWx0LXZhbHVlPywgc3VnZ2VzdGVkLXZhbHVlPywgYXR0cmlidXRlLWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBhdHRyaWJ1dGUuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBhdHRyaWJ1dGUtZXh0ZW5zaW9uIEFOWT4KLQotCi08IS0tCi0gICAgVGhlICJjb21wb25lbnQiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIFVJQ29tcG9uZW50IGltcGxlbWVudGF0aW9uCi0gICAgY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIHR5cGUgaWRlbnRpZmllciwKLSAgICBhbG9uZyB3aXRoIGl0cyBhc3NvY2lhdGVkIHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXMuICBDb21wb25lbnQgdHlwZXMgbXVzdAotICAgIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgYXJlIHJlY29nbml6ZWQKLSAgICBieSB0aGUgaW1wbGVtZW50YXRpb24gbG9naWMgb2YgdGhpcyBjb21wb25lbnQuICBOZXN0ZWQgInByb3BlcnR5IiBlbGVtZW50cwotICAgIGlkZW50aWZ5IEphdmFCZWFucyBwcm9wZXJ0aWVzIG9mIHRoZSBjb21wb25lbnQgY2xhc3MgdGhhdCBtYXkgYmUgZXhwb3NlZAotICAgIGZvciBtYW5pcHVsYXRpb24gdmlhIHRvb2xzLgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50ICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBjb21wb25lbnQtdHlwZSwgY29tcG9uZW50LWNsYXNzLCBmYWNldCosIGF0dHJpYnV0ZSosIHByb3BlcnR5KiwgY29tcG9uZW50LWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBjb21wb25lbnQuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBjb21wb25lbnQtZXh0ZW5zaW9uIEFOWT4KLQotPCEtLQotICAgRGVmaW5lIHRoZSBuYW1lIGFuZCBvdGhlciBkZXNpZ24tdGltZSBpbmZvcm1hdGlvbiBmb3IgYSBmYWNldCB0aGF0IGlzCi0gICBhc3NvY2lhdGVkIHdpdGggYSByZW5kZXJlciBvciBhIGNvbXBvbmVudC4KLS0tPgotCi08IUVMRU1FTlQgZmFjZXQgICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIGZhY2V0LW5hbWUsIGZhY2V0LWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBmYWNldC4gIE1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgc3BlY2lmaWMgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIGZhY2V0LWV4dGVuc2lvbiBBTlk+Ci0KLTwhLS0KLSAgICBUaGUgImZhY2V0LW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZmFjZXQgbmFtZSB1bmRlciB3aGljaCBhCi0gICAgVUlDb21wb25lbnQgd2lsbCBiZSBhZGRlZCB0byBpdHMgcGFyZW50LiAgSXQgbXVzdCBiZSBvZiB0eXBlCi0gICAgIklkZW50aWZpZXIiLgotLS0+Ci08IUVMRU1FTlQgZmFjZXQtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImNvbnZlcnRlciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgQ29udmVydGVyIGltcGxlbWVudGF0aW9uCi0gICAgY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIGNvbnZlcnRlciBpZGVudGlmaWVyLgotICAgIENvbnZlcnRlciBpZGVudGlmaWVycyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgbWF5IGJlCi0gICAgY29uZmlndXJlZCBvbiB0aGUgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciB0byBhZmZlY3QgdGhlCi0gICAgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuICBOZXN0ZWQgInByb3BlcnR5IiBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMKLSAgICBwcm9wZXJ0aWVzIG9mIHRoZSBDb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBtYXkgYmUgY29uZmlndXJlZAotICAgIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuCi0tLT4KLTwhRUxFTUVOVCBjb252ZXJ0ZXIgICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIChjb252ZXJ0ZXItaWQgfCBjb252ZXJ0ZXItZm9yLWNsYXNzKSwgY29udmVydGVyLWNsYXNzLCBhdHRyaWJ1dGUqLCBwcm9wZXJ0eSopPgotCi0KLTwhLS0KLSAgICBUaGUgImljb24iIGVsZW1lbnQgY29udGFpbnMgInNtYWxsLWljb24iIGFuZCAibGFyZ2UtaWNvbiIgZWxlbWVudHMgdGhhdAotICAgIHNwZWNpZnkgdGhlIHJlc29ydWNlIHBhdGhzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGIG9yIEpQRyBpY29uIGltYWdlcwotICAgIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhIEdVSSB0b29sLgotLS0+Ci08IUVMRU1FTlQgaWNvbiAgICAgICAgICAgIChzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8pPgotPCFBVFRMSVNUIGljb24gICAgICAgICAgICB4bWw6bGFuZyAgICAgICAgJUxhbmd1YWdlOyAgICAgICNJTVBMSUVEPgotCi08IS0tCi0gICAgVGhlICJsaWZlY3ljbGUiIGVsZW1lbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gc3BlY2lmeQotICAgIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGJlaGF2aW91ciBvZiB0aGUgZGVmYXVsdCBMaWZlY3ljbGUKLSAgICBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0tLT4KLTwhRUxFTUVOVCBsaWZlY3ljbGUgICAgICAgKHBoYXNlLWxpc3RlbmVyKik+Ci0KLTwhLS0KLSAgICAgVGhlICJsb2NhbGUtY29uZmlnIiBlbGVtZW50IGFsbG93cyB0aGUgYXBwIGRldmVsb3BlciB0byBkZWNsYXJlIHRoZQotICAgICBzdXBwb3J0ZWQgbG9jYWxlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gIAotLS0+Ci08IUVMRU1FTlQgbG9jYWxlLWNvbmZpZyAoZGVmYXVsdC1sb2NhbGU/LCBzdXBwb3J0ZWQtbG9jYWxlKik+Ci0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtYmVhbiIgZWxlbWVudCByZXByZXNlbnRzIGEgSmF2YUJlYW4sIG9mIGEgcGFydGljdWxhciBjbGFzcywKLSAgICB0aGF0IHdpbGwgYmUgZHluYW1pY2FsbHkgaW5zdGFudGlhdGVkIGF0IHJ1bnRpbWUgKGJ5IHRoZSBkZWZhdWx0Ci0gICAgVmFyaWFibGVSZXNvbHZlciBpbXBsZW1lbnRhdGlvbikgaWYgaXQgaXMgcmVmZXJlbmNlZCBhcyB0aGUgZmlyc3QgZWxlbWVudAotICAgIG9mIGEgdmFsdWUgYmluZGluZyBleHByZXNzaW9uLCBhbmQgbm8gY29ycmVzcG9uZGluZyBiZWFuIGNhbiBiZQotICAgIGlkZW50aWZpZWQgaW4gYW55IHNjb3BlLiAgSW4gYWRkaXRpb24gdG8gdGhlIGNyZWF0aW9uIG9mIHRoZSBtYW5hZ2VkIGJlYW4sCi0gICAgYW5kIHRoZSBvcHRpb25hbCBzdG9yaW5nIG9mIGl0IGludG8gdGhlIHNwZWNpZmllZCBzY29wZSwgdGhlIG5lc3RlZAotICAgIG1hbmFnZWQtcHJvcGVydHkgZWxlbWVudHMgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YKLSAgICBzZXR0YWJsZSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiB0aGUgY3JlYXRlZCBpbnN0YW5jZS4KLS0tPgotPCFFTEVNRU5UIG1hbmFnZWQtYmVhbiAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgbWFuYWdlZC1iZWFuLW5hbWUsIG1hbmFnZWQtYmVhbi1jbGFzcywgbWFuYWdlZC1iZWFuLXNjb3BlLCAobWFuYWdlZC1wcm9wZXJ0eSogfCBtYXAtZW50cmllcyB8IGxpc3QtZW50cmllcykpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtcHJvcGVydHkiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIHByb3BlcnR5IG9mIGEKLSAgICBtYW5hZ2VkIGJlYW4gdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSAob3IgdmFsdWUgc2V0KQotICAgIGlmIHRoZSBjb3JyZXNwb25kaW5nIG1hbmFnZWQgYmVhbiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLXByb3BlcnR5IChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBwcm9wZXJ0eS1uYW1lLCBwcm9wZXJ0eS1jbGFzcz8sIChtYXAtZW50cmllc3xudWxsLXZhbHVlfHZhbHVlfGxpc3QtZW50cmllcykpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hcC1lbnRyeSIgZWxlbWVudCByZXByc2VudHMgYSBzaW5nbGUga2V5LWVudHJ5IHBhaXIgdGhhdAotICAgIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbXB1dGVkIHZhbHVlIG9mIGEgbWFuYWdlZCBwcm9wZXJ0eSBvZiB0eXBlCi0gICAgamF2YS51dGlsLk1hcC4KLS0tPgotPCFFTEVNRU5UIG1hcC1lbnRyeSAoa2V5LCAobnVsbC12YWx1ZXx2YWx1ZSkpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hcC1lbnRyaWVzJyBlbGVtZW50IHJlcHJlc2VudHMgYSBzZXQgb2Yga2V5LWVudHJ5IHBhaXJzIHRoYXQKLSAgICB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhIG1hbmFnZWQgcHJvcGVydHkgb2YgdHlwZQotICAgIGphdmEudXRpbC5NYXAuICBJbiBhZGRpdGlvbiwgdGhlIEphdmEgY2xhc3MgdHlwZXMgb2YgdGhlIGtleSBhbmQgZW50cnkKLSAgICB2YWx1ZXMgbWF5IGJlIG9wdGlvbmFsbHkgZGVjbGFyZWQuCi0tLT4KLTwhRUxFTUVOVCBtYXAtZW50cmllcyAoa2V5LWNsYXNzPywgdmFsdWUtY2xhc3M/LCBtYXAtZW50cnkqKT4KLQotCi08IS0tCi0gICAgVGhlIGJhc2UgbmFtZSBvZiBhIHJlc291cmNlIGJ1bmRsZSByZXByZXNlbnRpbmcgdGhlIG1lc3NhZ2UgcmVzb3VyY2VzCi0gICAgZm9yIHRoaXMgYXBwbGljYXRpb24uICBTZWUgdGhlIEphdmFEb2NzIGZvciB0aGUgImphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSIKLSAgICBjbGFzcyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgc3ludGF4IG9mIHJlc291cmNlIGJ1bmRsZSBuYW1lcy4KLS0tPgotCi08IUVMRU1FTlQgbWVzc2FnZS1idW5kbGUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgIm5hdmlnYXRpb24tY2FzZSIgZWxlbWVudCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIGNvbWJpbmF0aW9uIG9mCi0gICAgY29uZGl0aW9ucyB0aGF0IG11c3QgbWF0Y2ggZm9yIHRoaXMgY2FzZSB0byBiZSBleGVjdXRlZCwgYW5kIHRoZQotICAgIHZpZXcgaWQgb2YgdGhlIGNvbXBvbmVudCB0cmVlIHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkIG5leHQuCi0tLT4KLTwhRUxFTUVOVCBuYXZpZ2F0aW9uLWNhc2UgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIGZyb20tYWN0aW9uPywgZnJvbS1vdXRjb21lPywgdG8tdmlldy1pZCwgcmVkaXJlY3Q/KT4KLQotCi08IS0tCi0gICAgVGhlICJuYXZpZ2F0aW9uLXJ1bGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIGRlY2lzaW9uIHJ1bGUKLSAgICB0aGF0IHdpbGwgYmUgdXRpbGl6ZWQgYnkgdGhlIGRlZmF1bHQgTmF2aWdhdGlvbkhhbmRsZXIKLSAgICBpbXBsZW1lbnRhdGlvbiB0byBtYWtlIGRlY2lzaW9ucyBvbiB3aGF0IHZpZXcgc2hvdWxkIGJlIGRpc3BsYXllZAotICAgIG5leHQsIGJhc2VkIG9uIHRoZSB2aWV3IGlkIGJlaW5nIHByb2Nlc3NlZC4KLS0tPgotPCFFTEVNRU5UIG5hdmlnYXRpb24tcnVsZSAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgZnJvbS12aWV3LWlkPywgbmF2aWdhdGlvbi1jYXNlKik+Ci0KLQotPCEtLQotICAgIFRoZSAicHJvcGVydHkiIGVsZW1lbnQgcmVwcmVzZW50cyBhIEphdmFCZWFuIHByb3BlcnR5IG9mIHRoZSBKYXZhIGNsYXNzCi0gICAgcmVwcmVzZW50ZWQgYnkgb3VyIHBhcmVudCBlbGVtZW50LgotCi0gICAgUHJvcGVydHkgbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgSmF2YSBjbGFzcwotICAgIHRoYXQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBlbGVtZW50LCBhbmQgbXVzdCBjb3JyZXNwb25kIHRvCi0gICAgcHJvcGVydHkgbmFtZXMgdGhhdCB3aWxsIGJlIHJlY29nbml6ZWQgd2hlbiBwZXJmb3JtaW5nIGludHJvc3BlY3Rpb24KLSAgICBhZ2FpbnN0IHRoYXQgY2xhc3MgdmlhIGphdmEuYmVhbnMuSW50cm9zcGVjdG9yLgotLS0+Ci08IUVMRU1FTlQgcHJvcGVydHkgICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBwcm9wZXJ0eS1uYW1lLCBwcm9wZXJ0eS1jbGFzcywgZGVmYXVsdC12YWx1ZT8sIHN1Z2dlc3RlZC12YWx1ZT8sIHByb3BlcnR5LWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBwcm9wZXJ0eS4gIE1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgc3BlY2lmaWMgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5LWV4dGVuc2lvbiBBTlk+Ci0KLTwhLS0KLSAgICBUaGUgInJlZmVyZW5jZWQtYmVhbiIgZWxlbWVudCByZXByZXNlbnRzIGF0IGRlc2lnbiB0aW1lIHRoZSBwcm9taXNlCi0gICAgdGhhdCBhIEphdmEgb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB3aWxsIGV4aXN0IGF0IHJ1bnRpbWUgaW4gc29tZQotICAgIHNjb3BlLCB1bmRlciB0aGUgc3BlY2lmaWVkIGtleS4gIFRoaXMgY2FuIGJlIHVzZWQgYnkgZGVzaWduIHRpbWUgdG9vbHMKLSAgICB0byBjb25zdHJ1Y3QgdXNlciBpbnRlcmZhY2UgZGlhbG9ncyBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUKLSAgICBzcGVjaWZpZWQgY2xhc3MuICBUaGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBhIHJlZmVyZW5jZWQgYmVhbgotICAgIGVsZW1lbnQgaGFzIG5vIGltcGFjdCBvbiB0aGUgSmF2YVNlcnZlciBGYWNlcyBydW50aW1lIGVudmlyb25tZW50Ci0gICAgaW5zaWRlIGEgd2ViIGFwcGxpY2F0aW9uLgotLS0+Ci08IUVMRU1FTlQgcmVmZXJlbmNlZC1iZWFuIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCByZWZlcmVuY2VkLWJlYW4tbmFtZSwgcmVmZXJlbmNlZC1iZWFuLWNsYXNzKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXIta2l0IiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBSZW5kZXJLaXQgaW1wbGVtZW50YXRpb24KLSAgICB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgcmVuZGVyLWtpdC1pZC4gIElmIG5vCi0gICAgcmVuZGVyLWtpdC1pZCBpcyBzcGVjaWZpZWQsIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZWZhdWx0IFJlbmRlcktpdAotICAgIChSZW5kZXJLaXRGYWN0b3J5LkRFRkFVTFRfUkVOREVSX0tJVCkgaXMgYXNzdW1lZC4KLS0tPgotPCFFTEVNRU5UIHJlbmRlci1raXQgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcmVuZGVyLWtpdC1pZD8sIHJlbmRlci1raXQtY2xhc3M/LCByZW5kZXJlciopPgotCi0KLTwhLS0KLSAgICBUaGUgInJlbmRlcmVyIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBSZW5kZXJlciBpbXBsZW1lbnRhdGlvbgotICAgIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgZmFtaWx5Ci0gICAgYW5kIHJlbmRlcmVyIHR5cGUgaWRlbnRpZmllcnMsIGluIHRoZSBSZW5kZXJLaXQgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgIHBhcmVudCAicmVuZGVyLWtpdCIgZWxlbWVudC4gIENvbWJpbmF0aW9ucyBvZiBjb21wb25lbnQgZmFtaWx5IGFuZCByZW5kZXJlcgotICAgIHR5cGUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBSZW5kZXJLaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJlbnQKLSAgICAicmVuZGVyLWtpdCIgZWxlbWVudC4KLQotICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGNvbXBvbmVudCBhdHRyaWJ1dGVzIHRoYXQKLSAgICBhcmUgcmVjb2duaXplZCBieSB0aGlzIHJlbmRlcmVyLgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyZXIgICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBjb21wb25lbnQtZmFtaWx5LCByZW5kZXJlci10eXBlLCByZW5kZXJlci1jbGFzcywgZmFjZXQqLCBhdHRyaWJ1dGUqLCByZW5kZXJlci1leHRlbnNpb24qKT4KLQotPCEtLSAKLSAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgcmVuZGVyZXIuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXJlci1leHRlbnNpb24gQU5ZPgotCi08IS0tCi0gICAgVGhlICJ2YWxpZGF0b3IiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIFZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbgotICAgIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNwZWNpZmllZCB2YWxpZGF0b3IgaWRlbnRpZmllci4KLSAgICBWYWxpZGF0b3IgaWRlbnRpZmllcnMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlbnRpcmUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMgYXR0cmlidXRlcyB0aGF0IG1heSBiZQotICAgIGNvbmZpZ3VyZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgaW4gb3JkZXIgdG8gYWZmZWN0IHRoZQotICAgIG9wZXJhdGlvbiBvZiB0aGUgVmFsaWRhdG9yLiAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zCi0gICAgcHJvcGVydGllcyBvZiB0aGUgVmFsaWRhdG9yIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgbWF5IGJlIGNvbmZpZ3VyZWQKLSAgICB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgVmFsaWRhdG9yLgotLS0+Ci08IUVMRU1FTlQgdmFsaWRhdG9yICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCB2YWxpZGF0b3ItaWQsIHZhbGlkYXRvci1jbGFzcywgYXR0cmlidXRlKiwgcHJvcGVydHkqKT4KLQotCi08IS0tCi0gICAgVGhlICJsaXN0LWVudHJpZXMiIGVsZW1lbnQgcmVwcmVzZW50cyBhIHNldCBvZiBpbml0aWFsaXphdGlvbgotICAgIGVsZW1lbnRzIGZvciBhIG1hbmFnZWQgcHJvcGVydHkgdGhhdCBpcyBhIGphdmEudXRpbC5MaXN0IG9yIGFuCi0gICAgYXJyYXkuICBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSAidmFsdWUtY2xhc3MiIGVsZW1lbnQgY2FuIG9wdGlvbmFsbHkKLSAgICBiZSB1c2VkIHRvIGRlY2xhcmUgdGhlIEphdmEgdHlwZSB0byB3aGljaCBlYWNoIHZhbHVlIHNob3VsZCBiZQotICAgIGNvbnZlcnRlZCBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBDb2xsZWN0aW9uLgotLS0+Ci08IUVMRU1FTlQgbGlzdC1lbnRyaWVzICAgICh2YWx1ZS1jbGFzcz8sIChudWxsLXZhbHVlfHZhbHVlKSopPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT0gU3Vib3JkaW5hdGUgRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tCi0gICAgVGhlICJhY3Rpb24tbGlzdGVuZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIEFjdGlvbkxpc3RlbmVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICBkdXJpbmcgdGhlIEludm9rZSBBcHBsaWNhdGlvbiBwaGFzZSBvZiB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIGxpZmVjeWNsZS4KLSAgICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBhY3Rpb24tbGlzdGVuZXIgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJhcHBsaWNhdGlvbi1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLSAgICBuYW1lIG9mIHRoZSBjb25jcmV0ZSBBcHBsaWNhdGlvbkZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdAotICAgIHdpbGwgYmUgY2FsbGVkIHdoZW4gRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEFQUExJQ0FUSU9OX0ZBQ1RPUlkpIGlzCi0gICAgY2FsbGVkLiBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBhcHBsaWNhdGlvbi1mYWN0b3J5ICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiYXR0cmlidXRlLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmEgdHlwZSBvZiB0aGUgdmFsdWUKLSAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyBhdHRyaWJ1dGUgbmFtZS4gIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGF0dHJpYnV0ZS1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiYXR0cmlidXRlLW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbmFtZSB1bmRlciB3aGljaCB0aGUKLSAgICBjb3JyZXNwb25kaW5nIHZhbHVlIHdpbGwgYmUgc3RvcmVkLCBpbiB0aGUgZ2VuZXJpYyBhdHRyaWJ1dGVzIG9mIHRoZQotICAgIFVJQ29tcG9uZW50IHdlIGFyZSByZWxhdGVkIHRvLgotLS0+Ci08IUVMRU1FTlQgYXR0cmlidXRlLW5hbWUgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJjb21wb25lbnQtY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiBhIGNvbmNyZXRlIFVJQ29tcG9uZW50IGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBjb21wb25lbnQtY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImNvbXBvbmVudC1mYW1pbHkiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgY29tcG9uZW50IGZhbWlseSBmb3IKLSAgICB3aGljaCB0aGUgUmVuZGVyZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCAicmVuZGVyZXIiIGVsZW1lbnQgd2lsbCBiZQotICAgIHVzZWQuCi0tLT4KLTwhRUxFTUVOVCBjb21wb25lbnQtZmFtaWx5ICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiY29tcG9uZW50LXR5cGUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbmFtZSB1bmRlciB3aGljaCB0aGUKLSAgICBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkLgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50LXR5cGUgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJjb252ZXJ0ZXItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiBhIGNvbmNyZXRlIENvbnZlcnRlciBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgY29udmVydGVyLWNsYXNzICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJjb252ZXJ0ZXItZm9yLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgZm9yIHdoaWNoIGEgQ29udmVydGVyIGNsYXNzIHdpbGwgYmUgcmVnaXN0ZXJlZC4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgY29udmVydGVyLWZvci1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29udmVydGVyLWlkIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGlkZW50aWZpZXIgdW5kZXIgd2hpY2ggdGhlCi0gICAgY29ycmVzcG9uZGluZyBDb252ZXJ0ZXIgY2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCi0tLT4KLTwhRUxFTUVOVCBjb252ZXJ0ZXItaWQgICAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJkZWZhdWx0LXJlbmRlci1raXQtaWQiIGVsZW1lbnQgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBkZWZpbmUKLSAgICBhIHJlbmRlcmtpdCB0byBiZSB1c2VkIG90aGVyIHRoYW4gdGhlIHN0YW5kYXJkIG9uZS4gCi0tLT4KLTwhRUxFTUVOVCBkZWZhdWx0LXJlbmRlci1raXQtaWQgICAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICAgVGhlICJkZWZhdWx0LWxvY2FsZSIgZWxlbWVudCBkZWNsYXJlcyB0aGUgZGVmYXVsdCBsb2NhbGUgZm9yIHRoaXMKLSAgICAgYXBwbGljYXRpb24gaW5zdGFuY2UuICBJdCBtdXN0IGJlIHNwZWNpZmllZCBhcwotICAgICA6bGFuZ3VhZ2U6W186Y291bnRyeTpbXzp2YXJpYW50Ol1dIHdpdGhvdXQgdGhlIGNvbG9ucywgZm9yIGV4YW1wbGUKLSAgICAgImphX0pQX1NKSVMiLiAgVGhlIHNlcGFyYXRvcnMgYmV0d2VlbiB0aGUgc2VnbWVudHMgbWF5IGJlICctJyBvcgotICAgICAnXycuCi0tLT4KLTwhRUxFTUVOVCBkZWZhdWx0LWxvY2FsZSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImRlZmF1bHQtdmFsdWUiIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG9yIGF0dHJpYnV0ZQotICAgIGluIHdoaWNoIHRoaXMgZWxlbWVudCByZXNpZGVzLiAgVGhpcyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlCi0gICAgInN1Z2dlc3RlZC12YWx1ZSIgaW4gdGhhdCB0aGUgcHJvcGVydHkgb3IgYXR0cmlidXRlIG11c3QgdGFrZSB0aGUKLSAgICB2YWx1ZSwgd2hlcmVhcyBpbiAic3VnZ2VzdGVkLXZhbHVlIiB0YWtpbmcgdGhlIHZhbHVlIGlzIG9wdGlvbmFsLgotLS0+Ci08IUVMRU1FTlQgZGVmYXVsdC12YWx1ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImRlc2NyaXB0aW9uIiBlbGVtZW50IGNvbnRhaW5zIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZWxlbWVudAotICAgIGl0IGlzIG5lc3RlZCBpbiwgb3B0aW9uYWxseSBmbGFnZ2VkIHdpdGggYSBsYW5ndWFnZSBjb2RlIHVzaW5nIHRoZQotICAgICJ4bWw6bGFuZyIgYXR0cmlidXRlLgotLS0+Ci08IUVMRU1FTlQgZGVzY3JpcHRpb24gICAgIEFOWT4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiAgICAgeG1sOmxhbmcgICAgICAgICVMYW5ndWFnZTsgICAgICAjSU1QTElFRD4KLQotCi08IS0tCi0gICAgVGhlICJkaXNwbGF5LW5hbWUiIGVsZW1lbnQgaXMgYSBzaG9ydCBkZXNjcmlwdGl2ZSBuYW1lIGRlc2NyaWJpbmcgdGhlCi0gICAgZW50aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudCBpdCBpcyBuZXN0ZWQgaW4sIGludGVuZGVkIHRvIGJlCi0gICAgZGlzcGxheWVkIGJ5IHRvb2xzLCBhbmQgb3B0aW9uYWxseSBmbGFnZ2VkIHdpdGggYSBsYW5ndWFnZSBjb2RlIHVzaW5nCi0gICAgdGhlICJ4bWw6bGFuZyIgYXR0cmlidXRlLgotLS0+Ci08IUVMRU1FTlQgZGlzcGxheS1uYW1lICAgICgjUENEQVRBKT4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgICAgeG1sOmxhbmcgICAgICAgICVMYW5ndWFnZTsgICAgICAjSU1QTElFRD4KLQotPCEtLQotICAgIFRoZSAiZmFjZXMtY29udGV4dC1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQKLSAgICBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSBGYWNlc0NvbnRleHRGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCi0gICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZBQ0VTX0NPTlRFWFRfRkFDVE9SWSkgaXMgY2FsbGVkLiBJdCBtdXN0Ci0gICAgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGZhY2VzLWNvbnRleHQtZmFjdG9yeSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImZyb20tYWN0aW9uIiBlbGVtZW50IGNvbnRhaW5zIGFuIGFjdGlvbiByZWZlcmVuY2UgZXhwcmVzc2lvbgotICAgIHRoYXQgbXVzdCBoYXZlIGJlZW4gZXhlY3V0ZWQgKGJ5IHRoZSBkZWZhdWx0IEFjdGlvbkxpc3RlbmVyIGZvciBoYW5kbGluZwotICAgIGFwcGxpY2F0aW9uIGxldmVsIGV2ZW50cykgaW4gb3JkZXIgdG8gc2VsZWN0IHRoaXMgbmF2aWdhdGlvbiBydWxlLiAgSWYKLSAgICBub3Qgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgd2lsbCBiZSByZWxldmFudCBubyBtYXR0ZXIgd2hpY2ggYWN0aW9uIHJlZmVyZW5jZQotICAgIHdhcyBleGVjdXRlZCAob3IgaWYgbm8gYWN0aW9uIHJlZmVyZW5jZSB3YXMgZXhlY3V0ZWQpLgotCi0gICAgVGhpcyB2YWx1ZSBtdXN0IGJlIG9mIHR5cGUgIkFjdGlvbiIuCi0tLT4KLTwhRUxFTUVOVCBmcm9tLWFjdGlvbiAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiZnJvbS1vdXRjb21lIiBlbGVtZW50IGNvbnRhaW5zIGEgbG9naWNhbCBvdXRjb21lIHN0cmluZyByZXR1cm5lZAotICAgIGJ5IHRoZSBleGVjdXRpb24gb2YgYW4gYXBwbGljYXRpb24gYWN0aW9uIG1ldGhvZCBzZWxlY3RlZCB2aWEgYW4KLSAgICAiYWN0aW9uUmVmIiBwcm9wZXJ0eSAob3IgYSBsaXRlcmFsIHZhbHVlIHNwZWNpZmllZCBieSBhbiAiYWN0aW9uIgotICAgIHByb3BlcnR5KSBvZiBhIFVJQ29tbWFuZCBjb21wb25lbnQuICBJZiBzcGVjaWZpZWQsIHRoaXMgcnVsZSB3aWxsIGJlCi0gICAgcmVsZXZhbnQgb25seSBpZiB0aGUgb3V0Y29tZSB2YWx1ZSBtYXRjaGVzIHRoaXMgZWxlbWVudCdzIHZhbHVlLiAgSWYKLSAgICBub3Qgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgd2lsbCBiZSByZWxldmFudCBubyBtYXR0ZXIgd2hhdCB0aGUgb3V0Y29tZQotICAgIHZhbHVlIHdhcy4KLS0tPgotPCFFTEVNRU5UIGZyb20tb3V0Y29tZSAgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiZnJvbS12aWV3LWlkIiBlbGVtZW50IGNvbnRhaW5zIHRoZSB2aWV3IGlkZW50aWZpZXIgb2YgdGhlIHZpZXcKLSAgICBmb3Igd2hpY2ggdGhlIGNvbnRhaW5pbmcgbmF2aWdhdGlvbiBydWxlIGlzIHJlbGV2YW50LiAgSWYgbm8KLSAgICAiZnJvbS12aWV3IiBlbGVtZW50IGlzIHNwZWNpZmllZCwgdGhpcyBydWxlIGFwcGxpZXMgdG8gbmF2aWdhdGlvbgotICAgIGRlY2lzaW9ucyBvbiBhbGwgdmlld3MuICBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgYSB2YWx1ZQotICAgIG9mICIqIiBpcyBhc3N1bWVkLCBtZWFuaW5nIHRoYXQgdGhpcyBuYXZpZ2F0aW9uIHJ1bGUgYXBwbGllcyB0byBhbGwKLSAgICB2aWV3cy4KLQotICAgIFRoaXMgdmFsdWUgbXVzdCBiZSBvZiB0eXBlICJWaWV3SWRQYXR0ZXJuIi4KLS0tPgotPCFFTEVNRU5UIGZyb20tdmlldy1pZCAgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAia2V5IiBlbGVtZW50IGlzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXAga2V5IHRoYXQKLSAgICB3aWxsIGJlIHN0b3JlZCBpbiBhIG1hbmFnZWQgcHJvcGVydHkgb2YgdHlwZSBqYXZhLnV0aWwuTWFwLiAgCi0tLT4KLTwhRUxFTUVOVCBrZXkgICAgICAgICAgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImtleS1jbGFzcyIgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgdG8gd2hpY2ggZWFjaCAia2V5IgotICAgIGVsZW1lbnQgaW4gYSBzZXQgb2YgIm1hcC1lbnRyeSIgZWxlbWVudHMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8uICBJdAotICAgIG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4gIElmIG9taXR0ZWQsICJqYXZhLmxhbmcuU3RyaW5nIgotICAgIGlzIGFzc3VtZWQuCi0tLT4KLTwhRUxFTUVOVCBrZXktY2xhc3MgICAgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImxhcmdlLWljb24iIGVsZW1lbnQgY29udGFpbnMgdGhlIHJlc291cmNlIHBhdGggdG8gYSBsYXJnZSAoMzJ4MzIpCi0gICAgaWNvbiBpbWFnZS4gIFRoZSBpbWFnZSBtYXkgYmUgaW4gZWl0aGVyIEdJRiBvciBKUEcgZm9ybWF0LgotLS0+Ci08IUVMRU1FTlQgbGFyZ2UtaWNvbiAgICAgICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAibGlmZWN5Y2xlLWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIExpZmVjeWNsZUZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIHdoZW4gRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KExJRkVDWUNMRV9GQUNUT1JZKSBpcyBjYWxsZWQuIEl0IG11c3QgYmUgCi0gICAgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGxpZmVjeWNsZS1mYWN0b3J5ICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAibWFuYWdlZC1iZWFuLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotICAgIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgYSBuZXcgaW5zdGFuY2UKLSAgICBpZiBjcmVhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG1hbmFnZWQgYmVhbiBpcyByZXF1ZXN0ZWQuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLQotICAgIFRoZSBzcGVjaWZpZWQgY2xhc3MgbXVzdCBjb25mb3JtIHRvIHN0YW5kYXJkIEphdmFCZWFucyBjb252ZW50aW9ucy4KLSAgICBJbiBwYXJ0aWN1bGFyLCBpdCBtdXN0IGhhdmUgYSBwdWJsaWMgemVyby1hcmd1bWVudHMgY29uc3RydWN0b3IsIGFuZAotICAgIHplcm8gb3IgbW9yZSBwdWJsaWMgcHJvcGVydHkgc2V0dGVycy4KLS0tPgotPCFFTEVNRU5UIG1hbmFnZWQtYmVhbi1jbGFzcyAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtYmVhbi1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGF0dHJpYnV0ZSBuYW1lIHVuZGVyCi0gICAgd2hpY2ggYSBtYW5hZ2VkIGJlYW4gd2lsbCBiZSBzZWFyY2hlZCBmb3IsIGFzIHdlbGwgYXMgc3RvcmVkICh1bmxlc3MKLSAgICB0aGUgIm1hbmFnZWQtYmVhbi1zY29wZSIgdmFsdWUgaXMgIm5vbmUiKS4gIEl0IG11c3QgYmUgb2YgdHlwZQotICAgICJJZGVudGlmaWVyIi4KLS0tPgotPCFFTEVNRU5UIG1hbmFnZWQtYmVhbi1uYW1lICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLWJlYW4tc2NvcGUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgc2NvcGUgaW50byB3aGljaCBhIG5ld2x5Ci0gICAgY3JlYXRlZCBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIG1hbmFnZWQgYmVhbiB3aWxsIGJlIHN0b3JlZCAodW5sZXNzCi0gICAgdGhlIHZhbHVlIGlzICJub25lIikuICBJdCBtdXN0IGJlIG9mIHR5cGUgIlNjb3BlT3JOb25lIi4KLS0tPgotPCFFTEVNRU5UIG1hbmFnZWQtYmVhbi1zY29wZSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgIm5hdmlnYXRpb24taGFuZGxlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgTmF2aWdhdGlvbkhhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIGR1cmluZyB0aGUgSW52b2tlIEFwcGxpY2F0aW9uIHBoYXNlIG9mIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgbGlmZWN5Y2xlLAotICAgIGlmIHRoZSBkZWZhdWx0IEFjdGlvbkxpc3RlbmVyIChwcm92aWRlZCBieSB0aGUgSlNGIGltcGxlbWVudGF0aW9uKSBpcyB1c2VkLgotICAgIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIG5hdmlnYXRpb24taGFuZGxlciAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSAicGhhc2UtbGlzdGVuZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotbmFtZSBvZiB0aGUgY29uY3JldGUgUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUKLXJlZ2lzdGVyZWQgb24gdGhlIExpZmVjeWNsZS4gSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcGhhc2UtbGlzdGVuZXIgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJyZWRpcmVjdCIgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCBuYXZpZ2F0aW9uIHRvIHRoZSBzcGVjaWZpZWQKLSAgICAidG8tdmlldy1pZCIgc2hvdWxkIGJlIGFjY29tcGxpc2hlZCBieSBwZXJmb3JtaW5nIGFuIEhUVFAgcmVkaXJlY3QKLSAgICByYXRoZXIgdGhhbiB0aGUgdXN1YWwgVmlld0hhbmRsZXIgbWVjaGFuaXNtcy4KLS0tPgotPCFFTEVNRU5UIHJlZGlyZWN0IEVNUFRZPgotCi08IS0tCi0gICAgVGhlICJzdWdnZXN0ZWQtdmFsdWUiIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG9yCi0gICAgYXR0cmlidXRlIGluIHdoaWNoIHRoaXMgZWxlbWVudCByZXNpZGVzLiAgVGhpcyB2YWx1ZSBpcyBhZHZpc29yeQotICAgIG9ubHkgYW5kIGlzIGludGVuZGVkIGZvciB0b29scyB0byB1c2Ugd2hlbiBwb3B1bGF0aW5nIHBhbGxldHRlcy4KLS0tPgotPCFFTEVNRU5UIHN1Z2dlc3RlZC12YWx1ZSAoI1BDREFUQSk+Ci0KLQotPCEtLQotCi0gICAgVGhlICJ2aWV3LWhhbmRsZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIFZpZXdIYW5kbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICBkdXJpbmcgdGhlIFJlc3RvcmUgVmlldyBhbmQgUmVuZGVyIFJlc3BvbnNlIHBoYXNlcyBvZiB0aGUgcmVxdWVzdAotICAgIHByb2Nlc3NpbmcgbGlmZWN5Y2xlLiAgVGhlIGZhY2VzIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhCi0gICAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzCi0tLT4KLTwhRUxFTUVOVCB2aWV3LWhhbmRsZXIgKCNQQ0RBVEEpPgotCi08IS0tCi0KLSAgICBUaGUgInN0YXRlLW1hbmFnZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIFN0YXRlTWFuYWdlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgZHVyaW5nIHRoZSBSZXN0b3JlIFZpZXcgYW5kIFJlbmRlciBSZXNwb25zZSBwaGFzZXMgb2YgdGhlIHJlcXVlc3QKLSAgICBwcm9jZXNzaW5nIGxpZmVjeWNsZS4gIFRoZSBmYWNlcyBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYQotICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcwotLS0+Ci08IUVMRU1FTlQgc3RhdGUtbWFuYWdlciAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgIm51bGwtdmFsdWUiIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhlIG1hbmFnZWQgcHJvcGVydHkgaW4gd2hpY2ggd2UKLSAgICBhcmUgbmVzdGVkIHdpbGwgYmUgZXhwbGljaXRseSBzZXQgdG8gbnVsbCBpZiBvdXIgbWFuYWdlZCBiZWFuIGlzCi0gICAgYXV0b21hdGljYWxseSBjcmVhdGVkLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBvbWl0dGluZyB0aGUgbWFuYWdlZAotICAgIHByb3BlcnR5IGVsZW1lbnQgZW50aXJlbHksIHdoaWNoIHdpbGwgY2F1c2Ugbm8gcHJvcGVydHkgc2V0dGVyIHRvIGJlCi0gICAgY2FsbGVkIGZvciB0aGlzIHByb3BlcnR5LgotCi0gICAgVGhlICJudWxsLXZhbHVlIiBlbGVtZW50IGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgYXNzb2NpYXRlZAotICAgICJwcm9wZXJ0eS1jbGFzcyIgaWRlbnRpZmllcyBhIEphdmEgY2xhc3MsIG5vdCBhIEphdmEgcHJpbWl0aXZlLgotLS0+Ci08IUVMRU1FTlQgbnVsbC12YWx1ZSBFTVBUWT4KLQotCi08IS0tCi0gICAgVGhlICJwcm9wZXJ0eS1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIHZhbHVlCi0gICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvcGVydHkgbmFtZS4gIEl0IG11c3QgYmUgb2YgdHlwZSAiSmF2YVR5cGUiLgotICAgIElmIG5vdCBzcGVjaWZpZWQsIGl0IGNhbiBiZSBpbmZlcnJlZCBmcm9tIGV4aXN0aW5nIGNsYXNzZXM7IGhvd2V2ZXIsCi0gICAgdGhpcyBlbGVtZW50IHNob3VsZCBiZSBzcGVjaWZpZWQgaWYgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBnb2luZwotICAgIHRvIGJlIHRoZSBzb3VyY2UgZm9yIGdlbmVyYXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3Nlcy4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5LWNsYXNzICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicHJvcGVydHktbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhQmVhbnMgcHJvcGVydHkgbmFtZQotICAgIHVuZGVyIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG1heSBiZSBzdG9yZWQuCi0tLT4KLTwhRUxFTUVOVCBwcm9wZXJ0eS1uYW1lICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInByb3BlcnR5LXJlc29sdmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBQcm9wZXJ0eVJlc29sdmVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkCi0gICAgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbnMuCi0gICAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcHJvcGVydHktcmVzb2x2ZXIgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInJlZmVyZW5jZWQtYmVhbi1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLSAgICBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIChlaXRoZXIgYWJzdHJhY3Qgb3IgY29uY3JldGUpIG9yIEphdmEgaW50ZXJmYWNlCi0gICAgaW1wbGVtZW50ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcmVmZXJlbmNlZCBiZWFuLiAgSXQgbXVzdCBiZSBvZiB0eXBlCi0gICAgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCByZWZlcmVuY2VkLWJlYW4tY2xhc3MgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJyZWZlcmVuY2VkLWJlYW4tbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBhdHRyaWJ1dGUgbmFtZSB1bmRlcgotICAgIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIHJlZmVyZW5jZWQgYmVhbiBtYXkgYmUgYXNzdW1lZCB0byBiZSBzdG9yZWQsCi0gICAgaW4gb25lIG9mIHRoZSBzY29wZXMgZGVmaW5lZCBieSB0aGUgIlNjb3BlIiB0eXBlLiAgSXQgbXVzdCBiZSBvZiB0eXBlCi0gICAgIklkZW50aWZpZXIiLgotLS0+Ci08IUVMRU1FTlQgcmVmZXJlbmNlZC1iZWFuLW5hbWUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInJlbmRlci1raXQtaWQiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIGZvciB0aGUKLSAgICBSZW5kZXJLaXQgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCAicmVuZGVyLWtpdCIgZWxlbWVudC4KLS0tPgotPCFFTEVNRU5UIHJlbmRlci1raXQtaWQgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVuZGVyLWtpdC1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIGEgY29uY3JldGUgUmVuZGVyS2l0IGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXIta2l0LWNsYXNzICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXJlci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIGEgY29uY3JldGUgUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gY2xhc3MuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHJlbmRlcmVyLWNsYXNzICAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgInJlbmRlci1raXQtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgUmVuZGVyS2l0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgd2hlbiBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoUkVOREVSX0tJVF9GQUNUT1JZKSBpcyBjYWxsZWQuIEl0IG11c3QgYmUgCi0gICAgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHJlbmRlci1raXQtZmFjdG9yeSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgInJlbmRlcmVyLXR5cGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhIHJlbmRlcmVyIHR5cGUgaWRlbnRpZmllciBmb3IgdGhlCi0gICAgUmVuZGVyZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCAicmVuZGVyZXIiIGVsZW1lbnQuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXJlci10eXBlICAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJzbWFsbC1pY29uIiBlbGVtZW50IGNvbnRhaW5zIHRoZSByZXNvdXJjZSBwYXRoIHRvIGEgbGFyZ2UgKDE2eDE2KQotICAgIGljb24gaW1hZ2UuICBUaGUgaW1hZ2UgbWF5IGJlIGluIGVpdGhlciBHSUYgb3IgSlBHIGZvcm1hdC4KLS0tPgotPCFFTEVNRU5UIHNtYWxsLWljb24gICAgICAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICAgVGhlICJzdXBwb3J0ZWQtbG9jYWxlIiBlbGVtZW50IGFsbG93cyBhdXRob3JzIHRvIGRlY2xhcmUgd2hpY2gKLSAgICAgbG9jYWxlcyBhcmUgc3VwcG9ydGVkIGluIHRoaXMgYXBwbGljYXRpb24gaW5zdGFuY2UuCi0KLSAgICAgSXQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgOmxhbmd1YWdlOltfOmNvdW50cnk6W186dmFyaWFudDpdXSB3aXRob3V0Ci0gICAgIHRoZSBjb2xvbnMsIGZvciBleGFtcGxlICJqYV9KUF9TSklTIi4gIFRoZSBzZXBhcmF0b3JzIGJldHdlZW4gdGhlCi0gICAgIHNlZ21lbnRzIG1heSBiZSAnLScgb3IgJ18nLgotLS0+Ci08IUVMRU1FTlQgc3VwcG9ydGVkLWxvY2FsZSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgInRvLXZpZXciIGVsZW1lbnQgY29udGFpbnMgdGhlIHZpZXcgaWRlbnRpZmllciBvZiB0aGUgbmV4dCB2aWV3Ci0gICAgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGlmIHRoaXMgbmF2aWdhdGlvbiBydWxlIGlzIG1hdGNoZWQuICBJdAotICAgIG11c3QgYmUgb2YgdHlwZSAiVmlld0lkIi4KLS0tPgotPCFFTEVNRU5UIHRvLXZpZXctaWQgICAgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAidmFsaWRhdG9yLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgYSBjb25jcmV0ZSBWYWxpZGF0b3IgaW1wbGVtZW50YXRpb24gY2xhc3MuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHZhbGlkYXRvci1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAidmFsaWRhdG9yLWlkIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGlkZW50aWZpZXIgdW5kZXIgd2hpY2ggdGhlCi0gICAgY29ycmVzcG9uZGluZyBWYWxpZGF0b3IgY2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCi0tLT4KLTwhRUxFTUVOVCB2YWxpZGF0b3ItaWQgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInZhbHVlIiBlbGVtZW50IGlzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBsaXRlcmFsCi0gICAgdmFsdWUgdG8gd2hpY2ggYSBzY2FsYXIgbWFuYWdlZCBwcm9wZXJ0eSB3aWxsIGJlIHNldCwgb3IgYSB2YWx1ZQotICAgIGJpbmRpbmcgZXhwcmVzc2lvbiAoIiN7Li4ufSIpIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUKLSAgICByZXF1aXJlZCB2YWx1ZS4gIEl0IHdpbGwgYmUgY29udmVydGVkIGFzIHNwZWNpZmllZCBmb3IgdGhlIGFjdHVhbAotICAgIHByb3BlcnR5IHR5cGUuCi0tLT4KLTwhRUxFTUVOVCB2YWx1ZSAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAidmFsdWUtY2xhc3MiIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIHRvIHdoaWNoIGVhY2gKLSAgICAidmFsdWUiIGVsZW1lbnQncyB2YWx1ZSB3aWxsIGJlIGNvbnZlcnRlZCB0bywgcHJpb3IgdG8gYWRkaW5nIGl0IHRvCi0gICAgdGhlICJsaXN0LWVudHJpZXMiIGxpc3QgZm9yIGEgbWFuYWdlZCBwcm9wZXJ0eSB0aGF0IGlzIGEKLSAgICBqYXZhLnV0aWwuTGlzdCwgb3IgYSAibWFwLWVudHJpZXMiIG1hcCBmb3IgYSBtYW5hZ2VkIHByb3BlcnR5IHRoYXQKLSAgICBpcyBhIGphdmEudXRpbC5NYXAuICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuICBJZiBvbWl0dGVkLAotICAgICJqYXZhLmxhbmcuU3RyaW5nIiBpcyBhc3N1bWVkLgotLS0+Ci08IUVMRU1FTlQgdmFsdWUtY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJ2YXJpYWJsZS1yZXNvbHZlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgVmFyaWFibGVSZXNvbHZlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgdXNlZAotICAgIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb25zLgotICAgIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHZhcmlhYmxlLXJlc29sdmVyICgjUENEQVRBKT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSWRlbnRpZmllciBBdHRyaWJ1dGVzID09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTwhQVRUTElTVCBhY3Rpb24tbGlzdGVuZXIgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXBwbGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGFwcGxpY2F0aW9uLWZhY3RvcnkgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdHRyaWJ1dGUgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXR0cmlidXRlLWNsYXNzICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZS1leHRlbnNpb24gICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdHRyaWJ1dGUtbmFtZSAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbXBvbmVudC1jbGFzcyAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb21wb25lbnQtZXh0ZW5zaW9uICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29tcG9uZW50LWZhbWlseSAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbXBvbmVudC10eXBlICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb252ZXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udmVydGVyLWNsYXNzICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnZlcnRlci1mb3ItY2xhc3MgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb252ZXJ0ZXItaWQgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVmYXVsdC1sb2NhbGUgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlZmF1bHQtcmVuZGVyLWtpdC1pZCAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZWZhdWx0LXZhbHVlICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRpc3BsYXktbmFtZSAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmYWNlcy1jb25maWcgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmFjZXMtY29udGV4dC1mYWN0b3J5ICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZhY2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmYWNldC1leHRlbnNpb24gICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmFjZXQtbmFtZSAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZhY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmcm9tLWFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZnJvbS1vdXRjb21lICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZyb20tdmlldy1pZCAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qga2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGtleS1jbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsYXJnZS1pY29uICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlmZWN5Y2xlICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpZmVjeWNsZS1mYWN0b3J5ICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsaXN0LWVudHJpZXMgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9jYWxlLWNvbmZpZyAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hbmFnZWQtYmVhbiAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkLWJlYW4tY2xhc3MgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFuYWdlZC1iZWFuLW5hbWUgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hbmFnZWQtYmVhbi1zY29wZSAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkLXByb3BlcnR5ICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFwLWVudHJpZXMgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hcC1lbnRyeSAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXNzYWdlLWJ1bmRsZSAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbmF2aWdhdGlvbi1jYXNlICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG5hdmlnYXRpb24taGFuZGxlciAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBuYXZpZ2F0aW9uLXJ1bGUgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbnVsbC12YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHBoYXNlLWxpc3RlbmVyICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcm9wZXJ0eSAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJvcGVydHktY2xhc3MgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByb3BlcnR5LWV4dGVuc2lvbiAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcm9wZXJ0eS1uYW1lICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJvcGVydHktcmVzb2x2ZXIgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlZGlyZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWZlcmVuY2VkLWJlYW4gICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVmZXJlbmNlZC1iZWFuLWNsYXNzICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlZmVyZW5jZWQtYmVhbi1uYW1lICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXIta2l0ICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyLWtpdC1jbGFzcyAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlci1raXQtZmFjdG9yeSAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXIta2l0LWlkICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyZXIgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlcmVyLWNsYXNzICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXJlci1leHRlbnNpb24gICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyZXItdHlwZSAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNtYWxsLWljb24gICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzdGF0ZS1tYW5hZ2VyICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc3VnZ2VzdGVkLXZhbHVlICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHN1cHBvcnRlZC1sb2NhbGUgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0by12aWV3LWlkICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFsaWRhdG9yICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhbGlkYXRvci1jbGFzcyAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YWxpZGF0b3ItaWQgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhbHVlLWNsYXNzICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YXJpYWJsZS1yZXNvbHZlciAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgdmlldy1oYW5kbGVyICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8yLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4NTdmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjA3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uID0gIjEuMCIgZW5jb2RpbmcgPSAiVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEKLSAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMS4yIj4KLQotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgJElkOiB3ZWItZmFjZXNjb25maWdfMV8yLnhzZCx2IDEuMSAyMDA3LzA1LzI1IDIxOjEyOjQ5IGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBDb3B5cmlnaHQgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCAKLSAgICAgICAgICAgIDkwMSBTYW4gQW50b25pbyBSb2FkLCAKLSAgICAgICAgICAgIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIAotICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IAotICAgICAgICAgICAgcmlnaHRzIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEphdmEgRUUsCi0gICAgICAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIDwhW0NEQVRBWwotCi0gICAgICAgICAgICBUaGUgWE1MIFNjaGVtYSBmb3IgdGhlIEphdmFTZXJ2ZXIgRmFjZXMgQXBwbGljYXRpb24KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gRmlsZSAoVmVyc2lvbiAxLjIpLgotCi0gICAgICAgICAgICBBbGwgSmF2YVNlcnZlciBGYWNlcyBjb25maWd1cmF0aW9uIGZpbGVzIG11c3QgaW5kaWNhdGUKLSAgICAgICAgICAgIHRoZSBKYXZhU2VydmVyIEZhY2VzIHNjaGVtYSBieSBpbmRpY2F0aW5nIHRoZSBKYXZhU2VydmVyCi0gICAgICAgICAgICBGYWNlcyBuYW1lc3BhY2U6Ci0KLSAgICAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotCi0gICAgICAgICAgICBhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0gICAgICAgICAgICB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgICAgICAgICA8ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPgotICAgICAgICAgICAgICAgIC4uLgotICAgICAgICAgICAgPC9mYWNlcy1jb25maWc+Ci0KLSAgICAgICAgICAgIFRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQKLSAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIHNjaGVtYSB1c2luZyB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0gICAgICAgICAgICBmb3IgamF2YWVlIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLSAgICAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZAotCi0gICAgICAgICAgICBdXT4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV81LnhzZCIvPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWUgPSAiZmFjZXMtY29uZmlnIiB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiZmFjZXMtY29uZmlnIiBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gaGllcmFyY2h5LCBhbmQgY29udGFpbnMgbmVzdGVkIGVsZW1lbnRzIGZvciBhbGwKLSAgICAgICAgICAgICAgICBvZiB0aGUgb3RoZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmYWNlcy1jb25maWctY29udmVydGVyLUlELXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBDb252ZXJ0ZXIgSURzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpjb252ZXJ0ZXItaWQiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZhY2VzLWNvbmZpZy1jb252ZXJ0ZXItZm9yLWNsYXNzLXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAnY29udmVydGVyLWZvci1jbGFzcycgZWxlbWVudCB2YWx1ZXMgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgICAgICAgICAgICAgd2l0aGluIGEgZG9jdW1lbnQuCi0KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmNvbnZlcnRlciIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmNvbnZlcnRlci1mb3ItY2xhc3MiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZhY2VzLWNvbmZpZy12YWxpZGF0b3ItSUQtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvciBJRHMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgZG9jdW1lbnQuCi0KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnZhbGlkYXRvciIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnZhbGlkYXRvci1pZCIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZmFjZXMtY29uZmlnLW1hbmFnZWQtYmVhbi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBNYW5hZ2VkIGJlYW4gbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgZG9jdW1lbnQuCi0KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1hbmFnZWQtYmVhbiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOm1hbmFnZWQtYmVhbi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWdUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJmYWNlcy1jb25maWciIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBoaWVyYXJjaHksIGFuZCBjb250YWlucyBuZXN0ZWQgZWxlbWVudHMgZm9yIGFsbAotICAgICAgICAgICAgICAgIG9mIHRoZSBvdGhlciBjb25maWd1cmF0aW9uIHNldHRpbmdzLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWFwcGxpY2F0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mYWN0b3J5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWNvbXBvbmVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1jb252ZXJ0ZXJUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24tcnVsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW5hdmlnYXRpb24tcnVsZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VkLWJlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZWZlcmVuY2VkLWJlYW5UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXJlbmRlci1raXRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbGlmZWN5Y2xlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXZhbGlkYXRvclR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYWNlcy1jb25maWctZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpZCIgdHlwZSA9ICJ4c2Q6SUQiLz4KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12ZXJzaW9uVHlwZSIKLSAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgZmFjZXMtY29uZmlnLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImFwcGxpY2F0aW9uIiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGRlZmluZSB0aGUKLSAgICAgICAgICAgICAgICB2YXJpb3VzIHBlci1hcHBsaWNhdGlvbi1zaW5nbGV0b24gaW1wbGVtZW50YXRpb24gYXJ0aWZhY3RzIGZvcgotICAgICAgICAgICAgICAgIGEgcGFydGljdWxhciB3ZWIgYXBwbGljYXRpb24gdGhhdCBpcyB1dGlsaXppbmcgCi0gICAgICAgICAgICAgICAgSmF2YVNlcnZlciBGYWNlcy4gIEZvciBuZXN0ZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICAgICAgdGhlIEpTRiBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBzdWl0YWJsZSBkZWZhdWx0LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGlvbi1saXN0ZW5lciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJhY3Rpb24tbGlzdGVuZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIGR1cmluZyB0aGUgSW52b2tlIEFwcGxpY2F0aW9uIHBoYXNlIG9mIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IHByb2Nlc3NpbmcgbGlmZWN5Y2xlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtcmVuZGVyLWtpdC1pZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgImRlZmF1bHQtcmVuZGVyLWtpdC1pZCIgZWxlbWVudCBhbGxvd3MgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHRvIGRlZmluZSBhIHJlbmRlcmtpdCB0byBiZSB1c2VkIG90aGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gdGhlIHN0YW5kYXJkIG9uZS4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1idW5kbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJhc2UgbmFtZSBvZiBhIHJlc291cmNlIGJ1bmRsZSByZXByZXNlbnRpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lc3NhZ2UgcmVzb3VyY2VzIGZvciB0aGlzIGFwcGxpY2F0aW9uLiAgU2VlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBKYXZhRG9jcyBmb3IgdGhlICJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBzeW50YXggb2YgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgYnVuZGxlIG5hbWVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24taGFuZGxlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJuYXZpZ2F0aW9uLWhhbmRsZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uSGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkIGR1cmluZyB0aGUgSW52b2tlIEFwcGxpY2F0aW9uIHBoYXNlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgbGlmZWN5Y2xlLCBpZiB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBBY3Rpb25MaXN0ZW5lciAocHJvdmlkZWQgYnkgdGhlIEpTRiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbikgaXMgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2aWV3LWhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAidmlldy1oYW5kbGVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgVmlld0hhbmRsZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFJlc3RvcmUgVmlldyBhbmQgUmVuZGVyIFJlc3BvbnNlIHBoYXNlcyBvZiB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCBwcm9jZXNzaW5nIGxpZmVjeWNsZS4gIFRoZSBmYWNlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBkZWZhdWx0IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RhdGUtbWFuYWdlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJzdGF0ZS1tYW5hZ2VyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgU3RhdGVNYW5hZ2VyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQgZHVyaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBSZXN0b3JlIFZpZXcgYW5kIFJlbmRlciBSZXNwb25zZSBwaGFzZXMgb2YgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgcHJvY2Vzc2luZyBsaWZlY3ljbGUuICBUaGUgZmFjZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsLXJlc29sdmVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgImVsLXJlc29sdmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LmVsLkVMUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTCBleHByZXNzaW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1yZXNvbHZlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eS1yZXNvbHZlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5UmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHZhbHVlIGJpbmRpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtcmVzb2x2ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJ2YXJpYWJsZS1yZXNvbHZlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVSZXNvbHZlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgdmFsdWUgYmluZGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucy4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IAotICAgICAgICAgICAgICAgIG5hbWU9ImxvY2FsZS1jb25maWciCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1sb2NhbGUtY29uZmlnVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IAotICAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlLWJ1bmRsZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWFwcGxpY2F0aW9uLXJlc291cmNlLWJ1bmRsZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvbi1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImlkIiB0eXBlID0gInhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctYXBwbGljYXRpb24tcmVzb3VyY2UtYnVuZGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgcmVzb3VyY2UtYnVuZGxlIGVsZW1lbnQgaW5zaWRlIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50Ci0gICAgICAgICAgICAgIHJlZmVyZW5jZXMgYSBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgaW5zdGFuY2UgYnkgbmFtZQotICAgICAgICAgICAgICB1c2luZyB0aGUgdmFyIGVsZW1lbnQuICBSZXNvdXJjZUJ1bmRsZXMgcmVmZXJlbmNlZCBpbiB0aGlzCi0gICAgICAgICAgICAgIG1hbm5lciBtYXkgYmUgcmV0dXJuZWQgYnkgYSBjYWxsIHRvCi0gICAgICAgICAgICAgIEFwcGxpY2F0aW9uLmdldFJlc291cmNlQnVuZGxlKCkgcGFzc2luZyB0aGUgY3VycmVudAotICAgICAgICAgICAgICBGYWNlc0NvbnRleHQgZm9yIHRoaXMgcmVxdWVzdCBhbmQgdGhlIHZhbHVlIG9mIHRoZSB2YXIKLSAgICAgICAgICAgICAgZWxlbWVudCBiZWxvdy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzZS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIGluc3RhbmNlLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbmFtZSBieSB3aGljaCB0aGlzIFJlc291cmNlQnVuZGxlIGluc3RhbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpcyByZXRyaWV2ZWQgYnkgYSBjYWxsIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbi5nZXRSZXNvdXJjZUJ1bmRsZSgpLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWFwcGxpY2F0aW9uLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgYXBwbGljYXRpb24uICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctZmFjdG9yeVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImZhY3RvcnkiIGVsZW1lbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gZGVmaW5lIHRoZSAKLSAgICAgICAgICAgICAgICB2YXJpb3VzIEZhY3RvcmllcyB0aGF0IGNvbXByaXNlIHBhcnRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiAKLSAgICAgICAgICAgICAgICBvZiBKYXZhU2VydmVyIEZhY2VzLiAgRm9yIG5lc3RlZCBlbGVtZW50cyB0aGF0IGFyZSBub3QgCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGUgSlNGIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhIHN1aXRhYmxlIAotICAgICAgICAgICAgICAgIGRlZmF1bHQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24tZmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImFwcGxpY2F0aW9uLWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25GYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCB3aGVuIAotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEFQUExJQ0FUSU9OX0ZBQ1RPUlkpIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjZXMtY29udGV4dC1mYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiZmFjZXMtY29udGV4dC1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHRGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkIHdoZW4gCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRkFDRVNfQ09OVEVYVF9GQUNUT1JZKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIGNhbGxlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaWZlY3ljbGUtZmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAibGlmZWN5Y2xlLWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgTGlmZWN5Y2xlRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoTElGRUNZQ0xFX0ZBQ1RPUlkpIGlzIGNhbGxlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0LWZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInJlbmRlci1raXQtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSBSZW5kZXJLaXRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShSRU5ERVJfS0lUX0ZBQ1RPUlkpIGlzIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjdG9yeS1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mYWN0b3J5LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpZCIgdHlwZSA9ICJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctZmFjdG9yeS1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGZhY3RvcnkuICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWF0dHJpYnV0ZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImF0dHJpYnV0ZSIgZWxlbWVudCByZXByZXNlbnRzIGEgbmFtZWQsIHR5cGVkLCB2YWx1ZQotICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50IFVJQ29tcG9uZW50IHZpYSB0aGUgZ2VuZXJpYwotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgbWVjaGFuaXNtLgotCi0gICAgICAgICAgICAgICAgQXR0cmlidXRlIG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHBhcmVudAotICAgICAgICAgICAgICAgIChvciByZWxhdGVkKSBjb21wb25lbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImF0dHJpYnV0ZS1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIG5hbWUgdW5kZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSB3aWxsIGJlIHN0b3JlZCwgaW4gdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyBhdHRyaWJ1dGVzIG9mIHRoZSBVSUNvbXBvbmVudCB3ZSBhcmUgcmVsYXRlZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJhdHRyaWJ1dGUtY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXR0cmlidXRlIG5hbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZGVmYXVsdC12YWx1ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3VnZ2VzdGVkLXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctc3VnZ2VzdGVkLXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXR0cmlidXRlLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImlkIiB0eXBlID0gInhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1hdHRyaWJ1dGUtZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBhdHRyaWJ1dGUuICBJdCBtYXkgY29udGFpbiAKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctY29tcG9uZW50VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiY29tcG9uZW50IiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBVSUNvbXBvbmVudAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIHR5cGUgaWRlbnRpZmllciwgYWxvbmcgd2l0aCBpdHMgYXNzb2NpYXRlZCAKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzLiAgQ29tcG9uZW50IHR5cGVzIG11c3QgYmUgdW5pcXVlIAotICAgICAgICAgICAgICAgIHdpdGhpbiB0aGUgZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGF0dHJpYnV0ZXMgdGhhdCAKLSAgICAgICAgICAgICAgICBhcmUgcmVjb2duaXplZCBieSB0aGUgaW1wbGVtZW50YXRpb24gbG9naWMgb2YgdGhpcyBjb21wb25lbnQuCi0gICAgICAgICAgICAgICAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zIHByb3BlcnRpZXMgb2YgCi0gICAgICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBjbGFzcyB0aGF0IG1heSBiZSBleHBvc2VkIGZvciBtYW5pcHVsYXRpb24gCi0gICAgICAgICAgICAgICAgdmlhIHRvb2xzLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjb21wb25lbnQtdHlwZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBuYW1lIHVuZGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgY2xhc3Mgc2hvdWxkIGJlIAotICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY29tcG9uZW50LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjb25jcmV0ZSBVSUNvbXBvbmVudCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mYWNldFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXR0cmlidXRlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctY29tcG9uZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1jb21wb25lbnQtZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgY29tcG9uZW50LiAgSXQgbWF5IGNvbnRhaW4gCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1kZWZhdWx0LWxvY2FsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImRlZmF1bHQtbG9jYWxlIiBlbGVtZW50IGRlY2xhcmVzIHRoZSBkZWZhdWx0IGxvY2FsZSAKLSAgICAgICAgICAgICAgICBmb3IgdGhpcyBhcHBsaWNhdGlvbiBpbnN0YW5jZS4KLQotICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgc3BlY2lmaWVkIGFzIDpsYW5ndWFnZTpbXzpjb3VudHJ5OltfOnZhcmlhbnQ6XV0KLSAgICAgICAgICAgICAgICB3aXRob3V0IHRoZSBjb2xvbnMsIGZvciBleGFtcGxlICJqYV9KUF9TSklTIi4gIFRoZQotICAgICAgICAgICAgICAgIHNlcGFyYXRvcnMgYmV0d2VlbiB0aGUgc2VnbWVudHMgbWF5IGJlICctJyBvciAnXycuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTpmYWNlcy1jb25maWctbG9jYWxlVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctZGVmYXVsdC12YWx1ZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImRlZmF1bHQtdmFsdWUiIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG9yCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlIGluIHdoaWNoIHRoaXMgZWxlbWVudCByZXNpZGVzLiAgVGhpcyB2YWx1ZSBkaWZmZXJzCi0gICAgICAgICAgICAgICAgZnJvbSB0aGUgInN1Z2dlc3RlZC12YWx1ZSIgaW4gdGhhdCB0aGUgcHJvcGVydHkgb3IgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgbXVzdCB0YWtlIHRoZSB2YWx1ZSwgd2hlcmVhcyBpbiAic3VnZ2VzdGVkLXZhbHVlIiB0YWtpbmcgdGhlCi0gICAgICAgICAgICAgICAgdmFsdWUgaXMgb3B0aW9uYWwuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1lbC1leHByZXNzaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEVMIGV4cHJlc3Npb25zIHByZXNlbnQgd2l0aGluIGEgZmFjZXMgY29uZmlnIGZpbGUKLSAgICAgICAgICAgICAgICBtdXN0IHN0YXJ0IHdpdGggdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBvZiAnI3snIGFuZAotICAgICAgICAgICAgICAgIGVuZCB3aXRoICd9Jy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iI1x7LipcfSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctZmFjZXRUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIGFuZCBvdGhlciBkZXNpZ24tdGltZSBpbmZvcm1hdGlvbiBmb3IgYSBmYWNldAotICAgICAgICAgICAgICAgIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcmVuZGVyZXIgb3IgYSBjb21wb25lbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY2V0LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImZhY2V0LW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZmFjZXQgbmFtZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIHdoaWNoIGEgVUlDb21wb25lbnQgd2lsbCBiZSBhZGRlZCB0byBpdHMgcGFyZW50LiAgCi0gICAgICAgICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIG9mIHR5cGUgIklkZW50aWZpZXIiLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjZXQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZmFjZXQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWZhY2V0LWV4dGVuc2lvblR5cGUiPgotICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGZhY2V0LiAgSXQgbWF5IGNvbnRhaW4gaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctZnJvbS12aWV3LWlkVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiBmcm9tLXZpZXctaWQgbXVzdCBjb250YWluIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICAgICAgICAgICAgICAgIHZhbHVlczoKLQotICAgICAgICAgICAgICAgICAgLSBUaGUgZXhhY3QgbWF0Y2ggZm9yIGEgdmlldyBpZGVudGlmaWVyIHRoYXQgaXMgcmVjb2duaXplZAotICAgICAgICAgICAgICAgICAgICBieSB0aGUgdGhlIFZpZXdIYW5kbGVyIGltcGxlbWVudGF0aW9uIGJlaW5nIHVzZWQgKHN1Y2ggYXMKLSAgICAgICAgICAgICAgICAgICAgIi9pbmRleC5qc3AiIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGRlZmF1bHQgVmlld0hhbmRsZXIpLgotCi0gICAgICAgICAgICAgICAgICAtIEEgcHJvcGVyIHByZWZpeCBvZiBhIHZpZXcgaWRlbnRpZmllciwgcGx1cyBhIHRyYWlsaW5nIAotICAgICAgICAgICAgICAgICAgICAiKiIgY2hhcmFjdGVyLiAgVGhpcyBwYXR0ZXJuIGluZGljYXRlcyB0aGF0IGFsbCB2aWV3IAotICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVycyB0aGF0IG1hdGNoIHRoZSBwb3J0aW9uIG9mIHRoZSBwYXR0ZXJuIHVwIHRvIAotICAgICAgICAgICAgICAgICAgICB0aGUgYXN0ZXJpc2sgd2lsbCBtYXRjaCB0aGUgc3Vycm91bmRpbmcgcnVsZS4gIFdoZW4gbW9yZSAKLSAgICAgICAgICAgICAgICAgICAgdGhhbiBvbmUgbWF0Y2ggZXhpc3RzLCB0aGUgbWF0Y2ggd2l0aCB0aGUgbG9uZ2VzdCBwYXR0ZXJuIAotICAgICAgICAgICAgICAgICAgICBpcyBzZWxlY3RlZC4KLQotICAgICAgICAgICAgICAgICAgLSBBbiAiKiIgY2hhcmFjdGVyLCB3aGljaCBtZWFucyB0aGF0IHRoaXMgcGF0dGVybiBhcHBsaWVzIAotICAgICAgICAgICAgICAgICAgICB0byBhbGwgdmlldyBpZGVudGlmaWVycy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1mcm9tLWFjdGlvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImZyb20tYWN0aW9uIiBlbGVtZW50IGNvbnRhaW5zIGFuIGFjdGlvbiByZWZlcmVuY2UgCi0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiB0aGF0IG11c3QgaGF2ZSBiZWVuIGV4ZWN1dGVkIChieSB0aGUgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICBBY3Rpb25MaXN0ZW5lciBmb3IgaGFuZGxpbmcgYXBwbGljYXRpb24gbGV2ZWwgZXZlbnRzKSAKLSAgICAgICAgICAgICAgICBpbiBvcmRlciB0byBzZWxlY3QgdGhlIG5hdmlnYXRpb24gcnVsZS4gIElmIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAgICAgIHRoaXMgcnVsZSB3aWxsIGJlIHJlbGV2YW50IG5vIG1hdHRlciB3aGljaCBhY3Rpb24gcmVmZXJlbmNlIAotICAgICAgICAgICAgICAgIHdhcyBleGVjdXRlZCAob3IgaWYgbm8gYWN0aW9uIHJlZmVyZW5jZSB3YXMgZXhlY3V0ZWQpLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWVsLWV4cHJlc3Npb25UeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1jb252ZXJ0ZXJUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJjb252ZXJ0ZXIiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIENvbnZlcnRlcgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIGNvbnZlcnRlciBpZGVudGlmaWVyLiAgQ29udmVydGVyIGlkZW50aWZpZXJzIG11c3QgCi0gICAgICAgICAgICAgICAgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGF0dHJpYnV0ZXMgdGhhdAotICAgICAgICAgICAgICAgIG1heSBiZSBjb25maWd1cmVkIG9uIHRoZSBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGluIG9yZGVyIAotICAgICAgICAgICAgICAgIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuICBOZXN0ZWQgInByb3BlcnR5IgotICAgICAgICAgICAgICAgIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucyBwcm9wZXJ0aWVzIG9mIHRoZSBDb252ZXJ0ZXIKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IG1heSBiZSBjb25maWd1cmVkIHRvIGFmZmVjdCB0aGUKLSAgICAgICAgICAgICAgICBvcGVyYXRpb24gb2YgdGhlIENvbnZlcnRlci4gICJhdHRyaWJ1dGUiIGFuZCAicHJvcGVydHkiIAotICAgICAgICAgICAgICAgIGVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBhbGxvdyBjb21wb25lbnQgZGV2ZWxvcGVycyB0byAKLSAgICAgICAgICAgICAgICBtb3JlIGNvbXBsZXRlbHkgZGVzY3JpYmUgdGhlaXIgY29tcG9uZW50cyB0byB0b29scyBhbmQgdXNlcnMuCi0gICAgICAgICAgICAgICAgVGhlc2UgZWxlbWVudHMgaGF2ZSBubyByZXF1aXJlZCBydW50aW1lIHNlbWFudGljcy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWlkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjb252ZXJ0ZXItaWQiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciB1bmRlciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0ZXIgY2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWZvci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgImNvbnZlcnRlci1mb3ItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHdoaWNoIGEgQ29udmVydGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIHdpbGwgYmUgcmVnaXN0ZXJlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjb252ZXJ0ZXItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgQ29udmVydGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hdHRyaWJ1dGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMKLSAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyB0aGF0IG1heSBiZSBjb25maWd1cmVkIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGluIG9yZGVyIHRvIGFmZmVjdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuICBUaGlzIGF0dHJpYnV0ZSBpcwotICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJpbHkgZm9yIGRlc2lnbi10aW1lIHRvb2xzIGFuZCBpcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHRvIGhhdmUgYW55IG1lYW5pbmcgYXQgcnVudGltZS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgb2YgdGhlIENvbnZlcnRlciBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG1heSBiZSBjb25maWd1cmVkIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBDb252ZXJ0ZXIuICBUaGlzIGF0dHJpYnV0ZSBpcyBwcmltYXJpbHkgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbi10aW1lIHRvb2xzIGFuZCBpcyBub3Qgc3BlY2lmaWVkIHRvIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgYW55IG1lYW5pbmcgYXQgcnVudGltZS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1jb252ZXJ0ZXItZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctY29udmVydGVyLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgY29udmVydGVyLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWxpZmVjeWNsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJsaWZlY3ljbGUiIGVsZW1lbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gc3BlY2lmeQotICAgICAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGJlaGF2aW91ciBvZiB0aGUgZGVmYXVsdCBMaWZlY3ljbGUKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGhhc2UtbGlzdGVuZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwaGFzZS1saXN0ZW5lciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgUGhhc2VMaXN0ZW5lciAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSByZWdpc3RlcmVkIG9uIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIExpZmVjeWNsZS4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWxpZmVjeWNsZS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctbGlmZWN5Y2xlLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgbGlmZWN5Y2xlLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgIAotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmYWNlcy1jb25maWctbG9jYWxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSBsb2NhbGVUeXBlIGRlZmluZXMgdmFsaWQgbG9jYWxlIGRlZmluZWQgYnkgSVNPLTYzOS0xCi0gICAgICAgICAgICAgICAgYW5kIElTTy0zMTY2LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlthLXpdezJ9KF98LSk/KFtccHtMfVwtXHB7TmR9XXsyfSk/Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbG9jYWxlLWNvbmZpZ1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImxvY2FsZS1jb25maWciIGVsZW1lbnQgYWxsb3dzIHRoZSBhcHAgZGV2ZWxvcGVyIHRvIAotICAgICAgICAgICAgICAgIGRlY2xhcmUgdGhlwqBzdXBwb3J0ZWQgbG9jYWxlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1sb2NhbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1kZWZhdWx0LWxvY2FsZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3VwcG9ydGVkLWxvY2FsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXN1cHBvcnRlZC1sb2NhbGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW5UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAibWFuYWdlZC1iZWFuIiBlbGVtZW50IHJlcHJlc2VudHMgYSBKYXZhQmVhbiwgb2YgYSAKLSAgICAgICAgICAgICAgICBwYXJ0aWN1bGFyIGNsYXNzLCB0aGF0IHdpbGwgYmUgZHluYW1pY2FsbHkgaW5zdGFudGlhdGVkIAotICAgICAgICAgICAgICAgIGF0IHJ1bnRpbWUgKGJ5IHRoZSBkZWZhdWx0IFZhcmlhYmxlUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24pIAotICAgICAgICAgICAgICAgIGlmIGl0IGlzIHJlZmVyZW5jZWQgYXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSB2YWx1ZSBiaW5kaW5nIAotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24sIGFuZCBubyBjb3JyZXNwb25kaW5nIGJlYW4gY2FuIGJlIGlkZW50aWZpZWQgaW4gCi0gICAgICAgICAgICAgICAgYW55IHNjb3BlLiAgSW4gYWRkaXRpb24gdG8gdGhlIGNyZWF0aW9uIG9mIHRoZSBtYW5hZ2VkIGJlYW4sIAotICAgICAgICAgICAgICAgIGFuZCB0aGUgb3B0aW9uYWwgc3RvcmluZyBvZiBpdCBpbnRvIHRoZSBzcGVjaWZpZWQgc2NvcGUsIAotICAgICAgICAgICAgICAgIHRoZSBuZXN0ZWQgbWFuYWdlZC1wcm9wZXJ0eSBlbGVtZW50cyBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgICAgICAgICBpbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiBzZXR0YWJsZSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiAKLSAgICAgICAgICAgICAgICB0aGUgY3JlYXRlZCBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJtYW5hZ2VkLWJlYW4tbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBuYW1lIHVuZGVyIHdoaWNoIGEgbWFuYWdlZCBiZWFuIHdpbGwgCi0gICAgICAgICAgICAgICAgICAgICAgICBiZSBzZWFyY2hlZCBmb3IsIGFzIHdlbGwgYXMgc3RvcmVkICh1bmxlc3MgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgIm1hbmFnZWQtYmVhbi1zY29wZSIgdmFsdWUgaXMgIm5vbmUiKS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAibWFuYWdlZC1iZWFuLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IHdpbGwgYmUgCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VkYHRvIGluc3RhbnRpYXRlIGEgbmV3IGluc3RhbmNlIGlmIGNyZWF0aW9uIG9mIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZGBtYW5hZ2VkIGJlYW4gaXMgcmVxdWVzdGVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3BlY2lmaWVkIGNsYXNzIG11c3QgY29uZm9ybSB0byBzdGFuZGFyZCBKYXZhQmVhbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlbnRpb25zLiAgSW4gcGFydGljdWxhciwgaXQgbXVzdCBoYXZlIGEgcHVibGljCi0gICAgICAgICAgICAgICAgICAgICAgICB6ZXJvLWFyZ3VtZW50cyBjb25zdHJ1Y3RvciwgYW5kIHplcm8gb3IgbW9yZSBwdWJsaWMKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IHNldHRlcnMuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCAKLSAgICAgICAgICAgICAgICBuYW1lPSJtYW5hZ2VkLWJlYW4tc2NvcGUiCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW4tc2NvcGVPck5vbmVUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJtYW5hZ2VkLWJlYW4tc2NvcGUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgc2NvcGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRvIHdoaWNoIGEgbmV3bHkgY3JlYXRlZCBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIAotICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlZCBiZWFuIHdpbGwgYmUgc3RvcmVkICh1bmxlc3MgdGhlIHZhbHVlIGlzIAotICAgICAgICAgICAgICAgICAgICAgICAgIm5vbmUiKS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbmFnZWQtcHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbWFuYWdlZC1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWVudHJpZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbWFwLWVudHJpZXNUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3QtZW50cmllcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1saXN0LWVudHJpZXNUeXBlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hbmFnZWQtYmVhbi1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW4tZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBtYW5hZ2VkLWJlYW4uICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAKLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW4tc2NvcGVPck5vbmVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgbGVnYWwgdmFsdWVzIGZvciB0aGUgPG1hbmFnZWQtYmVhbi1zY29wZT4KLSAgICAgICAgICAgICAgICBlbGVtZW50J3MgYm9keSBjb250ZW50LCB3aGljaCBpbmNsdWRlcyBhbGwgb2YgdGhlIHNjb3BlcwotICAgICAgICAgICAgICAgIG5vcm1hbGx5IHVzZWQgaW4gYSB3ZWIgYXBwbGljYXRpb24sIHBsdXMgdGhlICJub25lIiB2YWx1ZQotICAgICAgICAgICAgICAgIGluZGljYXRpbmcgdGhhdCBhIGNyZWF0ZWQgYmVhbiBzaG91bGQgbm90IGJlIHN0b3JlZCBpbnRvCi0gICAgICAgICAgICAgICAgYW55IHNjb3BlLgotICAgICAgICAgICAgICAgIF1dPgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmVxdWVzdCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNlc3Npb24iLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiLz4KLSAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbWFuYWdlZC1wcm9wZXJ0eVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJtYW5hZ2VkLXByb3BlcnR5IiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCAKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSBvZiBhIG1hbmFnZWQgYmVhbiB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCB0byB0aGUgCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIHZhbHVlIChvciB2YWx1ZSBzZXQpIGlmIHRoZSBjb3JyZXNwb25kaW5nIAotICAgICAgICAgICAgICAgIG1hbmFnZWQgYmVhbiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eS1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmFCZWFucyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IG5hbWUgdW5kZXIgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgbWF5IAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgc3RvcmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInByb3BlcnR5LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmEgdHlwZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9wZXJ0eSBuYW1lLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSBleGlzdGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM7IGhvd2V2ZXIsIHRoaXMgZWxlbWVudCBzaG91bGQgYmUgc3BlY2lmaWVkIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBnb2luZyB0byBiZSB0aGUgc291cmNlIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGdlbmVyYXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3Nlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1lbnRyaWVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hcC1lbnRyaWVzVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJudWxsLXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW51bGwtdmFsdWVUeXBlIj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWx1ZVR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdC1lbnRyaWVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWxpc3QtZW50cmllc1R5cGUiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW1hcC1lbnRyeVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJtYXAtZW50cnkiIGVsZW1lbnQgcmVwcnNlbnRzIGEgc2luZ2xlIGtleS1lbnRyeSBwYWlyIAotICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgYSBtYW5hZ2VkIAotICAgICAgICAgICAgICAgIHByb3BlcnR5IG9mIHR5cGUgamF2YS51dGlsLk1hcC4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImtleSIgZWxlbWVudCBpcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXAga2V5IHRoYXQgd2lsbCBiZSBzdG9yZWQgaW4gYSBtYW5hZ2VkIHByb3BlcnR5IG9mIAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBqYXZhLnV0aWwuTWFwLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1udWxsLXZhbHVlVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWx1ZVR5cGUiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW1hcC1lbnRyaWVzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgIm1hcC1lbnRyaWVzJyBlbGVtZW50IHJlcHJlc2VudHMgYSBzZXQgb2Yga2V5LWVudHJ5IHBhaXJzIAotICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgYSBtYW5hZ2VkIHByb3BlcnR5IAotICAgICAgICAgICAgICAgIG9mIHR5cGUgamF2YS51dGlsLk1hcC4gIEluIGFkZGl0aW9uLCB0aGUgSmF2YSBjbGFzcyB0eXBlcyAKLSAgICAgICAgICAgICAgICBvZiB0aGUga2V5IGFuZCBlbnRyeSB2YWx1ZXMgbWF5IGJlIG9wdGlvbmFsbHkgZGVjbGFyZWQuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAia2V5LWNsYXNzIiBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSB0byB3aGljaCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggImtleSIgZWxlbWVudCBpbiBhIHNldCBvZiAibWFwLWVudHJ5IiBlbGVtZW50cyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgY29udmVydGVkIHRvLiAgSWYgb21pdHRlZCwgImphdmEubGFuZy5TdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgaXMgYXNzdW1lZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmFsdWUtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAtZW50cnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1tYXAtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbmF2aWdhdGlvbi1jYXNlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgIm5hdmlnYXRpb24tY2FzZSIgZWxlbWVudCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIAotICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIGNvbmRpdGlvbnMgdGhhdCBtdXN0IG1hdGNoIGZvciB0aGlzIGNhc2UgdG8gCi0gICAgICAgICAgICAgICAgYmUgZXhlY3V0ZWQsIGFuZCB0aGUgdmlldyBpZCBvZiB0aGUgY29tcG9uZW50IHRyZWUgdGhhdCAKLSAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2VsZWN0ZWQgbmV4dC4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmcm9tLWFjdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWZyb20tYWN0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmcm9tLW91dGNvbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJmcm9tLW91dGNvbWUiIGVsZW1lbnQgY29udGFpbnMgYSBsb2dpY2FsIG91dGNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZXhlY3V0aW9uIG9mIGFuIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gbWV0aG9kIHNlbGVjdGVkIHZpYSBhbiAiYWN0aW9uUmVmIiBwcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICAgICAgKG9yIGEgbGl0ZXJhbCB2YWx1ZSBzcGVjaWZpZWQgYnkgYW4gImFjdGlvbiIgcHJvcGVydHkpCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiBhIFVJQ29tbWFuZCBjb21wb25lbnQuICBJZiBzcGVjaWZpZWQsIHRoaXMgcnVsZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcmVsZXZhbnQgb25seSBpZiB0aGUgb3V0Y29tZSB2YWx1ZSBtYXRjaGVzIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBlbGVtZW50J3MgdmFsdWUuICBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHJlbGV2YW50IG5vIG1hdHRlciB3aGF0IHRoZSBvdXRjb21lIHZhbHVlIHdhcy4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvLXZpZXctaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAidG8tdmlldy1pZCIgZWxlbWVudCBjb250YWlucyB0aGUgdmlldyBpZGVudGlmaWVyIAotICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG5leHQgdmlldyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaWYgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbiBydWxlIGlzIG1hdGNoZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCAKLSAgICAgICAgICAgICAgICBuYW1lPSJyZWRpcmVjdCIKLSAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXJlZGlyZWN0VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1uYXZpZ2F0aW9uLXJ1bGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJuYXZpZ2F0aW9uLXJ1bGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIAotICAgICAgICAgICAgICAgIGRlY2lzaW9uIHJ1bGUgdGhhdCB3aWxsIGJlIHV0aWxpemVkIGJ5IHRoZSBkZWZhdWx0IAotICAgICAgICAgICAgICAgIE5hdmlnYXRpb25IYW5kbGVyIGltcGxlbWVudGF0aW9uIHRvIG1ha2UgZGVjaXNpb25zIG9uIAotICAgICAgICAgICAgICAgIHdoYXQgdmlldyBzaG91bGQgYmUgZGlzcGxheWVkIG5leHQsIGJhc2VkIG9uIHRoZSAKLSAgICAgICAgICAgICAgICB2aWV3IGlkIGJlaW5nIHByb2Nlc3NlZC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZyb20tdmlldy1pZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWZyb20tdmlldy1pZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmF2aWdhdGlvbi1jYXNlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbmF2aWdhdGlvbi1jYXNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCAKLSAgICAgICAgICAgICAgICBuYW1lPSJuYXZpZ2F0aW9uLXJ1bGUtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbmF2aWdhdGlvbi1ydWxlLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLW5hdmlnYXRpb24tcnVsZS1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIG5hdmlnYXRpb24tcnVsZS4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbnVsbC12YWx1ZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgIm51bGwtdmFsdWUiIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhlIG1hbmFnZWQKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSBpbiB3aGljaCB3ZSBhcmUgbmVzdGVkIHdpbGwgYmUgZXhwbGljaXRseQotICAgICAgICAgICAgICAgIHNldCB0byBudWxsIGlmIG91ciBtYW5hZ2VkIGJlYW4gaXMgYXV0b21hdGljYWxseQotICAgICAgICAgICAgICAgIGNyZWF0ZWQuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIG9taXR0aW5nIHRoZSBtYW5hZ2VkCi0gICAgICAgICAgICAgICAgcHJvcGVydHkgZWxlbWVudCBlbnRpcmVseSwgd2hpY2ggd2lsbCBjYXVzZSBubwotICAgICAgICAgICAgICAgIHByb3BlcnR5IHNldHRlciB0byBiZSBjYWxsZWQgZm9yIHRoaXMgcHJvcGVydHkuCi0KLSAgICAgICAgICAgICAgICBUaGUgIm51bGwtdmFsdWUiIGVsZW1lbnQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZQotICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgInByb3BlcnR5LWNsYXNzIiBpZGVudGlmaWVzIGEgSmF2YSBjbGFzcywKLSAgICAgICAgICAgICAgICBub3QgYSBKYXZhIHByaW1pdGl2ZS4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIAotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXByb3BlcnR5VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgInByb3BlcnR5IiBlbGVtZW50IHJlcHJlc2VudHMgYSBKYXZhQmVhbiBwcm9wZXJ0eSBvZiB0aGUgCi0gICAgICAgICAgICAgICAgSmF2YSBjbGFzcyByZXByZXNlbnRlZCBieSBvdXIgcGFyZW50IGVsZW1lbnQuCi0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eSBuYW1lcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBKYXZhIAotICAgICAgICAgICAgICAgIGNsYXNzIHRoYXQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBlbGVtZW50LCBhbmQgbXVzdCAKLSAgICAgICAgICAgICAgICBjb3JyZXNwb25kIHRvIHByb3BlcnR5IG5hbWVzIHRoYXQgd2lsbCBiZSByZWNvZ25pemVkIHdoZW4gCi0gICAgICAgICAgICAgICAgcGVyZm9ybWluZyBpbnRyb3NwZWN0aW9uIGFnYWluc3QgdGhhdCBjbGFzcyB2aWEgCi0gICAgICAgICAgICAgICAgamF2YS5iZWFucy5JbnRyb3NwZWN0b3IuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eS1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmFCZWFucyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IG5hbWUgdW5kZXIgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgc3RvcmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtdHlwZVR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInByb3BlcnR5LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmEgdHlwZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9wZXJ0eSBuYW1lLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSBleGlzdGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM7IGhvd2V2ZXIsIHRoaXMgZWxlbWVudCBzaG91bGQgYmUgc3BlY2lmaWVkIGlmIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBnb2luZyB0byBiZSB0aGUgc291cmNlIGZvciAKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3Nlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1kZWZhdWx0LXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdWdnZXN0ZWQtdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1zdWdnZXN0ZWQtdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXByb3BlcnR5LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1wcm9wZXJ0eS1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHByb3BlcnR5LiAgSXQgbWF5IGNvbnRhaW4gCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXJlZGlyZWN0VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBUaGUgInJlZGlyZWN0IiBlbGVtZW50IGluZGljYXRlcyB0aGF0IG5hdmlnYXRpb24gdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCAidG8tdmlldy1pZCIgc2hvdWxkIGJlIGFjY29tcGxpc2hlZCBieSAKLSAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWluZyBhbiBIVFRQIHJlZGlyZWN0IHJhdGhlciB0aGFuIHRoZSB1c3VhbCAKLSAgICAgICAgICAgICAgICAgICAgVmlld0hhbmRsZXIgbWVjaGFuaXNtcy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVmZXJlbmNlZC1iZWFuVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgInJlZmVyZW5jZWQtYmVhbiIgZWxlbWVudCByZXByZXNlbnRzIGF0IGRlc2lnbiB0aW1lIHRoZSAKLSAgICAgICAgICAgICAgICBwcm9taXNlIHRoYXQgYSBKYXZhIG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgd2lsbCBleGlzdCBhdCAKLSAgICAgICAgICAgICAgICBydW50aW1lIGluIHNvbWUgc2NvcGUsIHVuZGVyIHRoZSBzcGVjaWZpZWQga2V5LiAgVGhpcyBjYW4gYmUgCi0gICAgICAgICAgICAgICAgdXNlZCBieSBkZXNpZ24gdGltZSB0b29scyB0byBjb25zdHJ1Y3QgdXNlciBpbnRlcmZhY2UgZGlhbG9ncyAKLSAgICAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLiAgVGhlIHByZXNlbmNlIAotICAgICAgICAgICAgICAgIG9yIGFic2VuY2Ugb2YgYSByZWZlcmVuY2VkIGJlYW4gZWxlbWVudCBoYXMgbm8gaW1wYWN0IG9uIHRoZSAKLSAgICAgICAgICAgICAgICBKYXZhU2VydmVyIEZhY2VzIHJ1bnRpbWUgZW52aXJvbm1lbnQgaW5zaWRlIGEgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZWQtYmVhbi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZWZlcmVuY2VkLWJlYW4tbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBuYW1lIHVuZGVyIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZCBiZWFuIG1heSBiZSBhc3N1bWVkIHRvIGJlIHN0b3JlZCwgaW4gb25lIAotICAgICAgICAgICAgICAgICAgICAgICAgb2YgJ3JlcXVlc3QnLCAnc2Vzc2lvbicsIG9yICdhcHBsaWNhdGlvbicgc2NvcGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlZC1iZWFuLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZWZlcmVuY2VkLWJlYW4tY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyAKLSAgICAgICAgICAgICAgICAgICAgICAgIChlaXRoZXIgYWJzdHJhY3Qgb3IgY29uY3JldGUpIG9yIEphdmEgaW50ZXJmYWNlIAotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcmVmZXJlbmNlZCBiZWFuLiAKLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVuZGVyLWtpdFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJyZW5kZXIta2l0IiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBSZW5kZXJLaXQgCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIAotICAgICAgICAgICAgICAgIHJlbmRlci1raXQtaWQuICBJZiBubyByZW5kZXIta2l0LWlkIGlzIHNwZWNpZmllZCwgdGhlIAotICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIGRlZmF1bHQgUmVuZGVyS2l0IAotICAgICAgICAgICAgICAgIChSZW5kZXJLaXRGYWN0b3J5LkRFRkFVTFRfUkVOREVSX0tJVCkgaXMgYXNzdW1lZC4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIAotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1pZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyLWtpdC1pZCIgZWxlbWVudCByZXByZXNlbnRzIGFuIGlkZW50aWZpZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIFJlbmRlcktpdCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IAotICAgICAgICAgICAgICAgICAgICAgICAgInJlbmRlci1raXQiIGVsZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyLWtpdC1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgUmVuZGVyS2l0IAotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXJlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXJlbmRlcmVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIAotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZW5kZXIta2l0LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1yZW5kZXJlclR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJyZW5kZXJlciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgUmVuZGVyZXIgCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIGNvbXBvbmVudCBmYW1pbHkgYW5kIHJlbmRlcmVyIHR5cGUgaWRlbnRpZmllcnMsIAotICAgICAgICAgICAgICAgIGluIHRoZSBSZW5kZXJLaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJlbnQgInJlbmRlci1raXQiIAotICAgICAgICAgICAgICAgIGVsZW1lbnQuICBDb21iaW5hdGlvbnMgb2YgY29tcG9uZW50IGZhbWlseSBhbmQgCi0gICAgICAgICAgICAgICAgcmVuZGVyZXIgdHlwZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIFJlbmRlcktpdCAKLSAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmVudCAicmVuZGVyLWtpdCIgZWxlbWVudC4KLQotICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGNvbXBvbmVudCAKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIHRoYXQgYXJlIHJlY29nbml6ZWQgYnkgdGhpcyByZW5kZXJlci4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIAotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWZhbWlseSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjb21wb25lbnQtZmFtaWx5IiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGZhbWlseSBmb3Igd2hpY2ggdGhlIFJlbmRlcmVyIHJlcHJlc2VudGVkIAotICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIHBhcmVudCAicmVuZGVyZXIiIGVsZW1lbnQgd2lsbCBiZSB1c2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci10eXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInJlbmRlcmVyLXR5cGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhIHJlbmRlcmVyIHR5cGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgUmVuZGVyZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCAKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZW5kZXJlciIgZWxlbWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbmRlcmVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZW5kZXJlci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjb25jcmV0ZSBSZW5kZXJlcgotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWZhY2V0VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hdHRyaWJ1dGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbmRlcmVyLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXJlbmRlcmVyLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1yZW5kZXJlci1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHJlbmRlcmVyLiAgSXQgbWF5IGNvbnRhaW4gaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVuZGVyLWtpdC1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHJlbmRlci1raXQuICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXN1Z2dlc3RlZC12YWx1ZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgInN1Z2dlc3RlZC12YWx1ZSIgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkgb3IKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgaW4gd2hpY2ggdGhpcyBlbGVtZW50IHJlc2lkZXMuICBUaGlzIHZhbHVlIGlzIAotICAgICAgICAgICAgICAgIGFkdmlzb3J5IG9ubHkgYW5kIGlzIGludGVuZGVkIGZvciB0b29scyB0byB1c2Ugd2hlbiAKLSAgICAgICAgICAgICAgICBwb3B1bGF0aW5nIHBhbGxldHRlcy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1zdXBwb3J0ZWQtbG9jYWxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAic3VwcG9ydGVkLWxvY2FsZSIgZWxlbWVudCBhbGxvd3MgYXV0aG9ycyB0byBkZWNsYXJlCi0gICAgICAgICAgICAgICAgd2hpY2ggbG9jYWxlcyBhcmUgc3VwcG9ydGVkIGluIHRoaXMgYXBwbGljYXRpb24gaW5zdGFuY2UuCi0KLSAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIHNwZWNpZmllZCBhcyA6bGFuZ3VhZ2U6W186Y291bnRyeTpbXzp2YXJpYW50Ol1dCi0gICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgY29sb25zLCBmb3IgZXhhbXBsZSAiamFfSlBfU0pJUyIuICBUaGUKLSAgICAgICAgICAgICAgICBzZXBhcmF0b3JzIGJldHdlZW4gdGhlIHNlZ21lbnRzIG1heSBiZSAnLScgb3IgJ18nLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWxvY2FsZVR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4gCi0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy12YWxpZGF0b3JUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJ2YWxpZGF0b3IiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIFZhbGlkYXRvcgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIHZhbGlkYXRvciBpZGVudGlmaWVyLiAgVmFsaWRhdG9yIGlkZW50aWZpZXJzIG11c3QgCi0gICAgICAgICAgICAgICAgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGF0dHJpYnV0ZXMgdGhhdCAKLSAgICAgICAgICAgICAgICBtYXkgYmUgY29uZmlndXJlZCBvbiB0aGUgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciAKLSAgICAgICAgICAgICAgICB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgVmFsaWRhdG9yLiAgTmVzdGVkICJwcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiB0aGUgVmFsaWRhdG9yCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBtYXkgYmUgY29uZmlndXJlZCB0byBhZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uIG9mIHRoZSBWYWxpZGF0b3IuICAiYXR0cmlidXRlIiBhbmQgInByb3BlcnR5IiAKLSAgICAgICAgICAgICAgICBlbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYWxsb3cgY29tcG9uZW50IGRldmVsb3BlcnMgdG8gCi0gICAgICAgICAgICAgICAgbW9yZSBjb21wbGV0ZWx5IGRlc2NyaWJlIHRoZWlyIGNvbXBvbmVudHMgdG8gdG9vbHMgYW5kIHVzZXJzLgotICAgICAgICAgICAgICAgIFRoZXNlIGVsZW1lbnRzIGhhdmUgbm8gcmVxdWlyZWQgcnVudGltZSBzZW1hbnRpY3MuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAidmFsaWRhdG9yLWlkIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGlkZW50aWZpZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyBWYWxpZGF0b3IgY2xhc3Mgc2hvdWxkIAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmVnaXN0ZXJlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInZhbGlkYXRvci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgVmFsaWRhdG9yIAotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MuICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWF0dHJpYnV0ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMKLSAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyB0aGF0IG1heSBiZSBjb25maWd1cmVkIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGluIG9yZGVyIHRvIGFmZmVjdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIG9mIHRoZSBWYWxpZGF0b3IuICBUaGlzIGF0dHJpYnV0ZSBpcwotICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJpbHkgZm9yIGRlc2lnbi10aW1lIHRvb2xzIGFuZCBpcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHRvIGhhdmUgYW55IG1lYW5pbmcgYXQgcnVudGltZS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgb2YgdGhlIFZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG1heSBiZSBjb25maWd1cmVkIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBWYWxpZGF0b3IuICBUaGlzIGF0dHJpYnV0ZSBpcyBwcmltYXJpbHkgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbi10aW1lIHRvb2xzIGFuZCBpcyBub3Qgc3BlY2lmaWVkIHRvIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgYW55IG1lYW5pbmcgYXQgcnVudGltZS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvci1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWxpZGF0b3ItZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctdmFsaWRhdG9yLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgdmFsaWRhdG9yLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy12YWx1ZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgInZhbHVlIiBlbGVtZW50IGlzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YKLSAgICAgICAgICAgICAgICBhIGxpdGVyYWwgdmFsdWUgdG8gd2hpY2ggYSBzY2FsYXIgbWFuYWdlZCBwcm9wZXJ0eQotICAgICAgICAgICAgICAgIHdpbGwgYmUgc2V0LCBvciBhIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbiAoIiN7Li4ufSIpCi0gICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSByZXF1aXJlZCB2YWx1ZS4KLSAgICAgICAgICAgICAgICBJdCB3aWxsIGJlIGNvbnZlcnRlZCBhcyBzcGVjaWZpZWQgZm9yIHRoZSBhY3R1YWwKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSB0eXBlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnVuaW9uIAotICAgICAgICAgICAgbWVtYmVyVHlwZXM9ImphdmFlZTpmYWNlcy1jb25maWctZWwtZXhwcmVzc2lvblR5cGUgeHNkOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgIAotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXZhbHVlLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgInZhbHVlLWNsYXNzIiBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSB0byB3aGljaCBlYWNoCi0gICAgICAgICAgICAgICAgInZhbHVlIiBlbGVtZW50J3MgdmFsdWUgd2lsbCBiZSBjb252ZXJ0ZWQgdG8sIHByaW9yIHRvIGFkZGluZyAKLSAgICAgICAgICAgICAgICBpdCB0byB0aGUgImxpc3QtZW50cmllcyIgbGlzdCBmb3IgYSBtYW5hZ2VkIHByb3BlcnR5IHRoYXQgaXMgCi0gICAgICAgICAgICAgICAgYSBqYXZhLnV0aWwuTGlzdCwgb3IgYSAibWFwLWVudHJpZXMiIG1hcCBmb3IgYSBtYW5hZ2VkIAotICAgICAgICAgICAgICAgIHByb3BlcnR5IHRoYXQgaXMgYSBqYXZhLnV0aWwuTWFwLiAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1saXN0LWVudHJpZXNUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAibGlzdC1lbnRyaWVzIiBlbGVtZW50IHJlcHJlc2VudHMgYSBzZXQgb2YgaW5pdGlhbGl6YXRpb24KLSAgICAgICAgICAgICAgICBlbGVtZW50cyBmb3IgYSBtYW5hZ2VkIHByb3BlcnR5IHRoYXQgaXMgYSBqYXZhLnV0aWwuTGlzdCBvciBhbgotICAgICAgICAgICAgICAgIGFycmF5LiAgSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgInZhbHVlLWNsYXNzIiBlbGVtZW50IGNhbiAKLSAgICAgICAgICAgICAgICBvcHRpb25hbGx5IGJlIHVzZWQgdG8gZGVjbGFyZSB0aGUgSmF2YSB0eXBlIHRvIHdoaWNoIGVhY2ggCi0gICAgICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBDb2xsZWN0aW9uLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXZhbHVlLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJudWxsLXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW51bGwtdmFsdWVUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXZhbHVlVHlwZSIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy12ZXJzaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoaXMgdHlwZSBjb250YWlucyB0aGUgcmVjb2duaXplZCB2ZXJzaW9ucyBvZgotICAgICAgICAgICAgICAgIGZhY2VzLWNvbmZpZyBzdXBwb3J0ZWQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEuMiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMl8wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlODBmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjY5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uID0gIjEuMCIgZW5jb2RpbmcgPSAiVVRGLTgiPz4KLQotCi08eHNkOnNjaGVtYQotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHhtbG5zOnhtbD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICB2ZXJzaW9uPSIyLjAiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gICAgICAKLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotICAgICAgCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICAgICAgCi0gICAgICBDb250cmlidXRvcihzKToKLSAgICAgIAotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0gICAgICAKLSAgICAgIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIENEREwgbGljZW5zZS4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgPCFbQ0RBVEFbCi0KLSAgICAgICAgICAgIFRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSmF2YVNlcnZlciBGYWNlcyBBcHBsaWNhdGlvbgotICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBGaWxlIChWZXJzaW9uIDIuMCkuCi0KLSAgICAgICAgICAgIEFsbCBKYXZhU2VydmVyIEZhY2VzIGNvbmZpZ3VyYXRpb24gZmlsZXMgbXVzdCBpbmRpY2F0ZQotICAgICAgICAgICAgdGhlIEphdmFTZXJ2ZXIgRmFjZXMgc2NoZW1hIGJ5IGluZGljYXRpbmcgdGhlIEphdmFTZXJ2ZXIKLSAgICAgICAgICAgIEZhY2VzIG5hbWVzcGFjZToKLQotICAgICAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0KLSAgICAgICAgICAgIGFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLSAgICAgICAgICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLSAgICAgICAgICAgIDxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCi0gICAgICAgICAgICAgICAgICAgIHZlcnNpb249IjIuMCI+Ci0gICAgICAgICAgICAgICAgLi4uCi0gICAgICAgICAgICA8L2ZhY2VzLWNvbmZpZz4KLQotICAgICAgICAgICAgVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZAotICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIHVzaW5nIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUKLSAgICAgICAgICAgIGZvciBqYXZhZWUgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotICAgICAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkCi0KLSAgICAgICAgICAgIF1dPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJmYWNlcy1jb25maWciIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWdUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJmYWNlcy1jb25maWciIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBoaWVyYXJjaHksIGFuZCBjb250YWlucyBuZXN0ZWQgZWxlbWVudHMgZm9yIGFsbAotICAgICAgICAgICAgICAgIG9mIHRoZSBvdGhlciBjb25maWd1cmF0aW9uIHNldHRpbmdzLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZhY2VzLWNvbmZpZy1iZWhhdmlvci1JRC11bmlxdWVuZXNzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgQmVoYXZpb3IgSURzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpiZWhhdmlvciIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmJlaGF2aW9yLWlkIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmYWNlcy1jb25maWctY29udmVydGVyLUlELXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBDb252ZXJ0ZXIgSURzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpjb252ZXJ0ZXItaWQiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZhY2VzLWNvbmZpZy1jb252ZXJ0ZXItZm9yLWNsYXNzLXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAnY29udmVydGVyLWZvci1jbGFzcycgZWxlbWVudCB2YWx1ZXMgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgICAgICAgICAgICAgd2l0aGluIGEgZG9jdW1lbnQuCi0KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmNvbnZlcnRlciIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmNvbnZlcnRlci1mb3ItY2xhc3MiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZhY2VzLWNvbmZpZy12YWxpZGF0b3ItSUQtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvciBJRHMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgZG9jdW1lbnQuCi0KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnZhbGlkYXRvciIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnZhbGlkYXRvci1pZCIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZmFjZXMtY29uZmlnLW1hbmFnZWQtYmVhbi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBNYW5hZ2VkIGJlYW4gbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgZG9jdW1lbnQuCi0KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1hbmFnZWQtYmVhbiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOm1hbmFnZWQtYmVhbi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWdUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJmYWNlcy1jb25maWciIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBoaWVyYXJjaHksIGFuZCBjb250YWlucyBuZXN0ZWQgZWxlbWVudHMgZm9yIGFsbAotICAgICAgICAgICAgICAgIG9mIHRoZSBvdGhlciBjb25maWd1cmF0aW9uIHNldHRpbmdzLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWFwcGxpY2F0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctb3JkZXJpbmdUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWJzb2x1dGUtb3JkZXJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hYnNvbHV0ZU9yZGVyaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWZhY3RvcnlUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctY29tcG9uZW50VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWNvbnZlcnRlclR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW5UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgIFRoZSAibmFtZSIgZWxlbWVudCB3aXRoaW4gdGhlIHRvcCBsZXZlbCAiZmFjZXMtY29uZmlnIgotICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgZGVjbGFyZXMgdGhlIG5hbWUgb2YgdGhpcyBhcHBsaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcmVzb3VyY2UuICBTdWNoIG5hbWVzIGFyZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGRvY3VtZW50IG9yZGVyaW5nIHNjaGVtZSBzcGVjaWZpZWQgaW4gc2VjdGlvbgotICAgICAgICAgICAgICAgICAgICAgIEpTRi4xMS40LjYuCi0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmF2aWdhdGlvbi1ydWxlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbmF2aWdhdGlvbi1ydWxlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZWQtYmVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXJlZmVyZW5jZWQtYmVhblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcmVuZGVyLWtpdFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaWZlY3ljbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1saWZlY3ljbGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmFsaWRhdG9yVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJlaGF2aW9yIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYmVoYXZpb3JUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjZXMtY29uZmlnLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICB1c2U9Im9wdGlvbmFsIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgVGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBkZWZpbmVzIHdoZXRoZXIgdGhpcwotICAgICAgICAgICAgICAgICAgICBKYXZhU2VydmVyIEZhY2VzIGFwcGxpY2F0aW9uIGlzIGNvbXBsZXRlLCBvciB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgIHRoZSBjbGFzcyBmaWxlcyBhdmFpbGFibGUgdG8gdGhpcyBtb2R1bGUgYW5kIHBhY2thZ2VkIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zCi0gICAgICAgICAgICAgICAgICAgIHRoYXQgc3BlY2lmeSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgb25seSBpbnNwZWN0ZWQgb24gdGhlIGFwcGxpY2F0aW9uIAotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHJlc291cmNlIGZpbGUgbG9jYXRlZCBhdCAiV0VCLUlORi9mYWNlcy1jb25maWcueG1sIi4KLSAgICAgICAgICAgICAgICAgICAgVGhlIHByZXNlbmNlIG9mIHRoaXMgYXR0cmlidXRlIG9uIGFueSBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlIG90aGVyIHRoYW4gdGhlIG9uZSBsb2NhdGVkIGF0ICJXRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwiLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgYW55IGZpbGVzIG5hbWVkIHVzaW5nIHRoZSBqYXZheC5mYWNlcy5DT05GSUdfRklMRVMKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLCBtdXN0IGJlIGlnbm9yZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIEphdmFTZXJ2ZXIgRmFjZXMKLSAgICAgICAgICAgICAgICAgICAgcnVudGltZSBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24sIHdoaWNoIG1pZ2h0IGJlIHByZXNlbnQgaW4gdGhlIGNsYXNzIGZpbGVzCi0gICAgICAgICAgICAgICAgICAgIG9mIHRoZSBhcHBsaWNhdGlvbi4KLQotICAgICAgICAgICAgICAgICAgICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0bwotICAgICAgICAgICAgICAgICAgICAiZmFsc2UiLCB0aGUgSmF2YVNlcnZlciBGYWNlcyBydW50aW1lIG11c3QgZXhhbWluZSB0aGUgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgZmlsZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBhbm5vdGF0aW9ucywgYXMgc3BlY2lmaWVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgIHRoZSBzcGVjaWZpY2F0aW9uLgotCi0gICAgICAgICAgICAgICAgICAgIElmICJXRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwiIGlzIG5vdCBwcmVzZW50LCB0aGUgSmF2YVNlcnZlcgotICAgICAgICAgICAgICAgICAgICBGYWNlcyBydW50aW1lIHdpbGwgYXNzdW1lIG1ldGFkYXRhLWNvbXBsZXRlIHRvIGJlICJmYWxzZSIuCi0KLSAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIHdpbGwgaGF2ZSBubyBpbXBhY3Qgb24KLSAgICAgICAgICAgICAgICAgICAgcnVudGltZSBhbm5vdGF0aW9ucyBzdWNoIGFzIEBSZXNvdXJjZURlcGVuZGVuY3kgb3IKLSAgICAgICAgICAgICAgICAgICAgQExpc3RlbmVyRm9yLgotICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiIC8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBmYWNlcy1jb25maWcuICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctb3JkZXJpbmdUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFBsZWFzZSBzZWUgc2VjdGlvbiBKU0YuMTEuNC42IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGlzIGVsZW1lbnQuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFmdGVyIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW9yZGVyaW5nLW9yZGVyaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmVmb3JlIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW9yZGVyaW5nLW9yZGVyaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctb3JkZXJpbmctb3JkZXJpbmdUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGNvbnRhaW5zIGEgc2VxdWVuY2Ugb2YgImlkIiBlbGVtZW50cywgZWFjaCBvZiB3aGljaAotICAgICAgICAgICAgICAgIHJlZmVycyB0byBhbiBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIHJlc291cmNlIGJ5IHRoZSAiaWQiCi0gICAgICAgICAgICAgICAgZGVjbGFyZWQgb24gaXRzIGZhY2VzLWNvbmZpZyBlbGVtZW50LiAgVGhpcyBlbGVtZW50IGNhbiBhbHNvIGNvbnRhaW4KLSAgICAgICAgICAgICAgICBhIHNpbmdsZSAib3RoZXJzIiBlbGVtZW50IHdoaWNoIHNwZWNpZmllcyB0aGF0IHRoaXMgZG9jdW1lbnQgY29tZXMKLSAgICAgICAgICAgICAgICBiZWZvcmUgb3IgYWZ0ZXIgb3RoZXIgZG9jdW1lbnRzIHdpdGhpbiB0aGUgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdGhlcnMiIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctb3JkZXJpbmctb3RoZXJzVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIAotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW9yZGVyaW5nLW90aGVyc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoZSBvcmRlcmluZyBzdWItZWxlbWVudCBpbiB3aGljaAotICAgICAgICAgICAgICAgIGl0IHdhcyBwbGFjZWQgc2hvdWxkIHRha2Ugc3BlY2lhbCBhY3Rpb24gcmVnYXJkaW5nIHRoZSBvcmRlcmluZwotICAgICAgICAgICAgICAgIG9mIHRoaXMgYXBwbGljYXRpb24gcmVzb3VyY2UgcmVsYXRpdmUgdG8gb3RoZXIKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIHJlc291cmNlcy4gIFNlZSBzZWN0aW9uIEpTRi4xMS40LjYKLSAgICAgICAgICAgICAgICBmb3IgdGhlIGNvbXBsZXRlIHNwZWNpZmljYXRpb24uCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1hYnNvbHV0ZU9yZGVyaW5nVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBPbmx5IHJlbGV2YW50IGlmIHRoaXMgaXMgcGxhY2VkIHdpdGhpbiB0aGUgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbC4KLSAgICAgICAgICAgICAgUGxlYXNlIHNlZSBzZWN0aW9uIEpTRi4xMS40LjYgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im90aGVycyIgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1vcmRlcmluZy1vdGhlcnNUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWFwcGxpY2F0aW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiYXBwbGljYXRpb24iIGVsZW1lbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gZGVmaW5lIHRoZQotICAgICAgICAgICAgICAgIHZhcmlvdXMgcGVyLWFwcGxpY2F0aW9uLXNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBhcnRpZmFjdHMgZm9yCi0gICAgICAgICAgICAgICAgYSBwYXJ0aWN1bGFyIHdlYiBhcHBsaWNhdGlvbiB0aGF0IGlzIHV0aWxpemluZyAKLSAgICAgICAgICAgICAgICBKYXZhU2VydmVyIEZhY2VzLiAgRm9yIG5lc3RlZCBlbGVtZW50cyB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkLCAKLSAgICAgICAgICAgICAgICB0aGUgSlNGIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhIHN1aXRhYmxlIGRlZmF1bHQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aW9uLWxpc3RlbmVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgImFjdGlvbi1saXN0ZW5lciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkxpc3RlbmVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgZHVyaW5nIHRoZSBJbnZva2UgQXBwbGljYXRpb24gcGhhc2Ugb2YgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgcHJvY2Vzc2luZyBsaWZlY3ljbGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1yZW5kZXIta2l0LWlkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiZGVmYXVsdC1yZW5kZXIta2l0LWlkIiBlbGVtZW50IGFsbG93cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gdG8gZGVmaW5lIGEgcmVuZGVya2l0IHRvIGJlIHVzZWQgb3RoZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiB0aGUgc3RhbmRhcmQgb25lLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWJ1bmRsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYmFzZSBuYW1lIG9mIGEgcmVzb3VyY2UgYnVuZGxlIHJlcHJlc2VudGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVzc2FnZSByZXNvdXJjZXMgZm9yIHRoaXMgYXBwbGljYXRpb24uICBTZWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEphdmFEb2NzIGZvciB0aGUgImphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHN5bnRheCBvZiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSBidW5kbGUgbmFtZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmF2aWdhdGlvbi1oYW5kbGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgIm5hdmlnYXRpb24taGFuZGxlciIgZWxlbWVudCBjb250YWlucyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdmlnYXRpb25IYW5kbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgZHVyaW5nIHRoZSBJbnZva2UgQXBwbGljYXRpb24gcGhhc2UgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBsaWZlY3ljbGUsIGlmIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IEFjdGlvbkxpc3RlbmVyIChwcm92aWRlZCBieSB0aGUgSlNGIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uKSBpcyB1c2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZpZXctaGFuZGxlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJ2aWV3LWhhbmRsZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSBWaWV3SGFuZGxlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkIGR1cmluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgUmVzdG9yZSBWaWV3IGFuZCBSZW5kZXIgUmVzcG9uc2UgcGhhc2VzIG9mIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IHByb2Nlc3NpbmcgbGlmZWN5Y2xlLiAgVGhlIGZhY2VzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhIGRlZmF1bHQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdGF0ZS1tYW5hZ2VyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgInN0YXRlLW1hbmFnZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSBTdGF0ZU1hbmFnZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFJlc3RvcmUgVmlldyBhbmQgUmVuZGVyIFJlc3BvbnNlIHBoYXNlcyBvZiB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCBwcm9jZXNzaW5nIGxpZmVjeWNsZS4gIFRoZSBmYWNlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBkZWZhdWx0IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWwtcmVzb2x2ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiZWwtcmVzb2x2ZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguZWwuRUxSZXNvbHZlciBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSB1c2VkIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMIGV4cHJlc3Npb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5LXJlc29sdmVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgInByb3BlcnR5LXJlc29sdmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlSZXNvbHZlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgdmFsdWUgYmluZGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1yZXNvbHZlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgInZhcmlhYmxlLXJlc29sdmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZVJlc29sdmVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB2YWx1ZSBiaW5kaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtaGFuZGxlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IVtDREFUQVsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVzb3VyY2UtaGFuZGxlciIgZWxlbWVudCBjb250YWlucyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUhhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBkdXJpbmcgcmVuZGVyaW5nIGFuZCBkZWNvZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHJlc291cmNlIHJlcXVlc3RzIFRoZSBzdGFuZGFyZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yIGJhc2VkIGRlY29yYXRvciBwYXR0ZXJuIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgYXBwbGljYXRpb24gc2luZ2xldG9ucyB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9ub3JlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICAgXV0+Ci0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzeXN0ZW0tZXZlbnQtbGlzdGVuZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1zeXN0ZW0tZXZlbnQtbGlzdGVuZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IAotICAgICAgICAgICAgICAgIG5hbWU9ImxvY2FsZS1jb25maWciCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1sb2NhbGUtY29uZmlnVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IAotICAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlLWJ1bmRsZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWFwcGxpY2F0aW9uLXJlc291cmNlLWJ1bmRsZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvbi1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IAotICAgICAgICAgICAgICAgIG5hbWU9ImRlZmF1bHQtdmFsaWRhdG9ycyIKLSAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWRlZmF1bHQtdmFsaWRhdG9yc1R5cGUiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpZCIgdHlwZSA9ICJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWFwcGxpY2F0aW9uLXJlc291cmNlLWJ1bmRsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIHJlc291cmNlLWJ1bmRsZSBlbGVtZW50IGluc2lkZSB0aGUgYXBwbGljYXRpb24gZWxlbWVudAotICAgICAgICAgICAgICByZWZlcmVuY2VzIGEgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIGluc3RhbmNlIGJ5IG5hbWUKLSAgICAgICAgICAgICAgdXNpbmcgdGhlIHZhciBlbGVtZW50LiAgUmVzb3VyY2VCdW5kbGVzIHJlZmVyZW5jZWQgaW4gdGhpcwotICAgICAgICAgICAgICBtYW5uZXIgbWF5IGJlIHJldHVybmVkIGJ5IGEgY2FsbCB0bwotICAgICAgICAgICAgICBBcHBsaWNhdGlvbi5nZXRSZXNvdXJjZUJ1bmRsZSgpIHBhc3NpbmcgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZvciB0aGlzIHJlcXVlc3QgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgdmFyCi0gICAgICAgICAgICAgIGVsZW1lbnQgYmVsb3cuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2UtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgYnkgd2hpY2ggdGhpcyBSZXNvdXJjZUJ1bmRsZSBpbnN0YW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0cmlldmVkIGJ5IGEgY2FsbCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb24uZ2V0UmVzb3VyY2VCdW5kbGUoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvbi1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGFwcGxpY2F0aW9uLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWZhY3RvcnlUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJmYWN0b3J5IiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGRlZmluZSB0aGUgCi0gICAgICAgICAgICAgICAgdmFyaW91cyBGYWN0b3JpZXMgdGhhdCBjb21wcmlzZSBwYXJ0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24gCi0gICAgICAgICAgICAgICAgb2YgSmF2YVNlcnZlciBGYWNlcy4gIEZvciBuZXN0ZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90IAotICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgdGhlIEpTRiBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBzdWl0YWJsZSAKLSAgICAgICAgICAgICAgICBkZWZhdWx0LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uLWZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJhcHBsaWNhdGlvbi1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgCi0gICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgd2hlbiAKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShBUFBMSUNBVElPTl9GQUNUT1JZKSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi1oYW5kbGVyLWZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJleGNlcHRpb24taGFuZGxlci1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25IYW5kbGVyRmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCB3aGVuIAotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEVYQ0VQVElPTl9IQU5ETEVSX0ZBQ1RPUlkpIAotICAgICAgICAgICAgICAgICAgICAgICAgaXMgY2FsbGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVybmFsLWNvbnRleHQtZmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiZXh0ZXJuYWwtY29udGV4dC1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbENvbnRleHRGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShFWFRFUk5BTF9DT05URVhUX0ZBQ1RPUlkpCi0gICAgICAgICAgICAgICAgICAgICAgICBpcyBjYWxsZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY2VzLWNvbnRleHQtZmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImZhY2VzLWNvbnRleHQtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCB3aGVuIAotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZBQ0VTX0NPTlRFWFRfRkFDVE9SWSkgCi0gICAgICAgICAgICAgICAgICAgICAgICBpcyBjYWxsZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aWFsLXZpZXctY29udGV4dC1mYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwYXJ0aWFsLXZpZXctY29udGV4dC1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWFsVmlld0NvbnRleHRGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkIHdoZW4gRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAoRmFjdG9yeUZpbmRlci5QQVJUSUFMX1ZJRVdfQ09OVEVYVF9GQUNUT1JZKSBpcyBjYWxsZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZS1mYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJsaWZlY3ljbGUtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSBMaWZlY3ljbGVGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShMSUZFQ1lDTEVfRkFDVE9SWSkgaXMgY2FsbGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZpZXctZGVjbGFyYXRpb24tbGFuZ3VhZ2UtZmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAidmlldy1kZWNsYXJhdGlvbi1sYW5ndWFnZS1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdEZWNsYXJhdGlvbkxhbmd1YWdlRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoVklFV19ERUNMQVJBVElPTl9GQUNUT1JZKSBpcyBjYWxsZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWhhbmRsZXItZGVsZWdhdGUtZmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAidGFnLWhhbmRsZXItZGVsZWdhdGUtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3RGVjbGFyYXRpb25MYW5ndWFnZUZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KFRBR19IQU5ETEVSX0RFTEVHQVRFX0ZBQ1RPUlkpIGlzIGNhbGxlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0LWZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInJlbmRlci1raXQtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSBSZW5kZXJLaXRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShSRU5ERVJfS0lUX0ZBQ1RPUlkpIGlzIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmlzaXQtY29udGV4dC1mYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJ2aXNpdC1jb250ZXh0LWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgVmlzaXRDb250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoVklTSVRfQ09OVEVYVF9GQUNUT1JZKSBpcyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZC4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY3RvcnktZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZmFjdG9yeS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaWQiIHR5cGUgPSAieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWZhY3RvcnktZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBmYWN0b3J5LiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1hdHRyaWJ1dGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJhdHRyaWJ1dGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhIG5hbWVkLCB0eXBlZCwgdmFsdWUKLSAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmVudCBVSUNvbXBvbmVudCB2aWEgdGhlIGdlbmVyaWMKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIG1lY2hhbmlzbS4KLQotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBuYW1lcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwYXJlbnQKLSAgICAgICAgICAgICAgICAob3IgcmVsYXRlZCkgY29tcG9uZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJhdHRyaWJ1dGUtbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBuYW1lIHVuZGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgd2lsbCBiZSBzdG9yZWQsIGluIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgYXR0cmlidXRlcyBvZiB0aGUgVUlDb21wb25lbnQgd2UgYXJlIHJlbGF0ZWQgCi0gICAgICAgICAgICAgICAgICAgICAgICB0by4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiYXR0cmlidXRlLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmEgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGF0dHJpYnV0ZSBuYW1lLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWRlZmF1bHQtdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN1Z2dlc3RlZC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXN1Z2dlc3RlZC12YWx1ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWF0dHJpYnV0ZS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpZCIgdHlwZSA9ICJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctYXR0cmlidXRlLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgYXR0cmlidXRlLiAgSXQgbWF5IGNvbnRhaW4gCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWNvbXBvbmVudFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImNvbXBvbmVudCIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgVUlDb21wb25lbnQKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZQotICAgICAgICAgICAgICAgIHNwZWNpZmllZCB0eXBlIGlkZW50aWZpZXIsIGFsb25nIHdpdGggaXRzIGFzc29jaWF0ZWQgCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcy4gIENvbXBvbmVudCB0eXBlcyBtdXN0IGJlIHVuaXF1ZSAKLSAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgCi0gICAgICAgICAgICAgICAgYXJlIHJlY29nbml6ZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIGxvZ2ljIG9mIHRoaXMgY29tcG9uZW50LgotICAgICAgICAgICAgICAgIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucyBwcm9wZXJ0aWVzIG9mIAotICAgICAgICAgICAgICAgIHRoZSBjb21wb25lbnQgY2xhc3MgdGhhdCBtYXkgYmUgZXhwb3NlZCBmb3IgbWFuaXB1bGF0aW9uIAotICAgICAgICAgICAgICAgIHZpYSB0b29scy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY29tcG9uZW50LXR5cGUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbmFtZSB1bmRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGNsYXNzIHNob3VsZCBiZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImNvbXBvbmVudC1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgVUlDb21wb25lbnQgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZmFjZXRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWF0dHJpYnV0ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWNvbXBvbmVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctY29tcG9uZW50LWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGNvbXBvbmVudC4gIEl0IG1heSBjb250YWluIAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctZGVmYXVsdC1sb2NhbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJkZWZhdWx0LWxvY2FsZSIgZWxlbWVudCBkZWNsYXJlcyB0aGUgZGVmYXVsdCBsb2NhbGUgCi0gICAgICAgICAgICAgICAgZm9yIHRoaXMgYXBwbGljYXRpb24gaW5zdGFuY2UuCi0KLSAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIHNwZWNpZmllZCBhcyA6bGFuZ3VhZ2U6W186Y291bnRyeTpbXzp2YXJpYW50Ol1dCi0gICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgY29sb25zLCBmb3IgZXhhbXBsZSAiamFfSlBfU0pJUyIuICBUaGUKLSAgICAgICAgICAgICAgICBzZXBhcmF0b3JzIGJldHdlZW4gdGhlIHNlZ21lbnRzIG1heSBiZSAnLScgb3IgJ18nLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWxvY2FsZVR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWRlZmF1bHQtdmFsdWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJkZWZhdWx0LXZhbHVlIiBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBvcgotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBpbiB3aGljaCB0aGlzIGVsZW1lbnQgcmVzaWRlcy4gIFRoaXMgdmFsdWUgZGlmZmVycwotICAgICAgICAgICAgICAgIGZyb20gdGhlICJzdWdnZXN0ZWQtdmFsdWUiIGluIHRoYXQgdGhlIHByb3BlcnR5IG9yIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgIG11c3QgdGFrZSB0aGUgdmFsdWUsIHdoZXJlYXMgaW4gInN1Z2dlc3RlZC12YWx1ZSIgdGFraW5nIHRoZQotICAgICAgICAgICAgICAgIHZhbHVlIGlzIG9wdGlvbmFsLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmYWNlcy1jb25maWctZWwtZXhwcmVzc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFTCBleHByZXNzaW9ucyBwcmVzZW50IHdpdGhpbiBhIGZhY2VzIGNvbmZpZyBmaWxlCi0gICAgICAgICAgICAgICAgbXVzdCBzdGFydCB3aXRoIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2Ugb2YgJyN7JyBhbmQKLSAgICAgICAgICAgICAgICBlbmQgd2l0aCAnfScuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IiNcey4qXH0iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWZhY2V0VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBhbmQgb3RoZXIgZGVzaWduLXRpbWUgaW5mb3JtYXRpb24gZm9yIGEgZmFjZXQKLSAgICAgICAgICAgICAgICB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbmRlcmVyIG9yIGEgY29tcG9uZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYWNldC1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJmYWNldC1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZhY2V0IG5hbWUgCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlciB3aGljaCBhIFVJQ29tcG9uZW50IHdpbGwgYmUgYWRkZWQgdG8gaXRzIHBhcmVudC4gIAotICAgICAgICAgICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBvZiB0eXBlICJJZGVudGlmaWVyIi4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY2V0LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWZhY2V0LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1mYWNldC1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBmYWNldC4gIEl0IG1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWZyb20tdmlldy1pZFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgZnJvbS12aWV3LWlkIG11c3QgY29udGFpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAgICAgICAgICAgICAgICB2YWx1ZXM6Ci0KLSAgICAgICAgICAgICAgICAgIC0gVGhlIGV4YWN0IG1hdGNoIGZvciBhIHZpZXcgaWRlbnRpZmllciB0aGF0IGlzIHJlY29nbml6ZWQKLSAgICAgICAgICAgICAgICAgICAgYnkgdGhlIHRoZSBWaWV3SGFuZGxlciBpbXBsZW1lbnRhdGlvbiBiZWluZyB1c2VkIChzdWNoIGFzCi0gICAgICAgICAgICAgICAgICAgICIvaW5kZXguanNwIiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBkZWZhdWx0IFZpZXdIYW5kbGVyKS4KLQotICAgICAgICAgICAgICAgICAgLSBBIHByb3BlciBwcmVmaXggb2YgYSB2aWV3IGlkZW50aWZpZXIsIHBsdXMgYSB0cmFpbGluZyAKLSAgICAgICAgICAgICAgICAgICAgIioiIGNoYXJhY3Rlci4gIFRoaXMgcGF0dGVybiBpbmRpY2F0ZXMgdGhhdCBhbGwgdmlldyAKLSAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcnMgdGhhdCBtYXRjaCB0aGUgcG9ydGlvbiBvZiB0aGUgcGF0dGVybiB1cCB0byAKLSAgICAgICAgICAgICAgICAgICAgdGhlIGFzdGVyaXNrIHdpbGwgbWF0Y2ggdGhlIHN1cnJvdW5kaW5nIHJ1bGUuICBXaGVuIG1vcmUgCi0gICAgICAgICAgICAgICAgICAgIHRoYW4gb25lIG1hdGNoIGV4aXN0cywgdGhlIG1hdGNoIHdpdGggdGhlIGxvbmdlc3QgcGF0dGVybiAKLSAgICAgICAgICAgICAgICAgICAgaXMgc2VsZWN0ZWQuCi0KLSAgICAgICAgICAgICAgICAgIC0gQW4gIioiIGNoYXJhY3Rlciwgd2hpY2ggbWVhbnMgdGhhdCB0aGlzIHBhdHRlcm4gYXBwbGllcyAKLSAgICAgICAgICAgICAgICAgICAgdG8gYWxsIHZpZXcgaWRlbnRpZmllcnMuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctZnJvbS1hY3Rpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJmcm9tLWFjdGlvbiIgZWxlbWVudCBjb250YWlucyBhbiBhY3Rpb24gcmVmZXJlbmNlIAotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gdGhhdCBtdXN0IGhhdmUgYmVlbiBleGVjdXRlZCAoYnkgdGhlIGRlZmF1bHQgCi0gICAgICAgICAgICAgICAgQWN0aW9uTGlzdGVuZXIgZm9yIGhhbmRsaW5nIGFwcGxpY2F0aW9uIGxldmVsIGV2ZW50cykgCi0gICAgICAgICAgICAgICAgaW4gb3JkZXIgdG8gc2VsZWN0IHRoZSBuYXZpZ2F0aW9uIHJ1bGUuICBJZiBub3Qgc3BlY2lmaWVkLCAKLSAgICAgICAgICAgICAgICB0aGlzIHJ1bGUgd2lsbCBiZSByZWxldmFudCBubyBtYXR0ZXIgd2hpY2ggYWN0aW9uIHJlZmVyZW5jZSAKLSAgICAgICAgICAgICAgICB3YXMgZXhlY3V0ZWQgKG9yIGlmIG5vIGFjdGlvbiByZWZlcmVuY2Ugd2FzIGV4ZWN1dGVkKS4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1lbC1leHByZXNzaW9uVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctaWZUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJpZiIgZWxlbWVudCBkZWZpbmVzIGEgY29uZGl0aW9uIHRoYXQgbXVzdCByZXNvbHZlCi0gICAgICAgICAgICAgICAgdG8gdHJ1ZSBpbiBvcmRlciBmb3IgdGhlIG5hdmlnYXRpb24gY2FzZSBvbiB3aGljaCBpdCBpcwotICAgICAgICAgICAgICAgIGRlZmluZWQgdG8gYmUgbWF0Y2hlZCwgd2l0aCB0aGUgZXhpc3RpbmcgbWF0Y2ggY3JpdGVyaWEKLSAgICAgICAgICAgICAgICAoYWN0aW9uIG1ldGhvZCBhbmQgb3V0Y29tZSkgYXMgYSBwcmVyZXF1aXN0ZSwgaWYgcHJlc2VudC4KLSAgICAgICAgICAgICAgICBUaGUgY29uZGl0aW9uIGlzIGRlZmluZWQgZGVjbGFyYXRpdmVseSB1c2luZyBhIHZhbHVlCi0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiBpbiB0aGUgYm9keSBvZiB0aGlzIGVsZW1lbnQuIFRoZSBleHByZXNzaW9uIGlzCi0gICAgICAgICAgICAgICAgZXZhbHVhdGVkIGF0IHRoZSB0aW1lIHRoZSBuYXZpZ2F0aW9uIGNhc2UgaXMgYmVpbmcgbWF0Y2hlZC4KLSAgICAgICAgICAgICAgICBJZiB0aGUgImZyb20tb3V0Y29tZSIgaXMgb21pdHRlZCBhbmQgdGhpcyBlbGVtZW50IGlzCi0gICAgICAgICAgICAgICAgcHJlc2VudCwgdGhlIG5hdmlnYXRpb24gaGFuZGxlciB3aWxsIG1hdGNoIGEgbnVsbCBvdXRjb21lCi0gICAgICAgICAgICAgICAgYW5kIHVzZSB0aGUgY29uZGl0aW9uIHJldHVybiB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgdGhlCi0gICAgICAgICAgICAgICAgY2FzZSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIG1hdGNoLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWVsLWV4cHJlc3Npb25UeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1jb252ZXJ0ZXJUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJjb252ZXJ0ZXIiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIENvbnZlcnRlcgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIGNvbnZlcnRlciBpZGVudGlmaWVyLiAgQ29udmVydGVyIGlkZW50aWZpZXJzIG11c3QgCi0gICAgICAgICAgICAgICAgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGF0dHJpYnV0ZXMgdGhhdAotICAgICAgICAgICAgICAgIG1heSBiZSBjb25maWd1cmVkIG9uIHRoZSBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGluIG9yZGVyIAotICAgICAgICAgICAgICAgIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuICBOZXN0ZWQgInByb3BlcnR5IgotICAgICAgICAgICAgICAgIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucyBwcm9wZXJ0aWVzIG9mIHRoZSBDb252ZXJ0ZXIKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IG1heSBiZSBjb25maWd1cmVkIHRvIGFmZmVjdCB0aGUKLSAgICAgICAgICAgICAgICBvcGVyYXRpb24gb2YgdGhlIENvbnZlcnRlci4gICJhdHRyaWJ1dGUiIGFuZCAicHJvcGVydHkiIAotICAgICAgICAgICAgICAgIGVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBhbGxvdyBjb21wb25lbnQgZGV2ZWxvcGVycyB0byAKLSAgICAgICAgICAgICAgICBtb3JlIGNvbXBsZXRlbHkgZGVzY3JpYmUgdGhlaXIgY29tcG9uZW50cyB0byB0b29scyBhbmQgdXNlcnMuCi0gICAgICAgICAgICAgICAgVGhlc2UgZWxlbWVudHMgaGF2ZSBubyByZXF1aXJlZCBydW50aW1lIHNlbWFudGljcy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWlkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjb252ZXJ0ZXItaWQiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciB1bmRlciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0ZXIgY2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWZvci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgImNvbnZlcnRlci1mb3ItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHdoaWNoIGEgQ29udmVydGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIHdpbGwgYmUgcmVnaXN0ZXJlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjb252ZXJ0ZXItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgQ29udmVydGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hdHRyaWJ1dGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMKLSAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyB0aGF0IG1heSBiZSBjb25maWd1cmVkIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGluIG9yZGVyIHRvIGFmZmVjdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuICBUaGlzIGF0dHJpYnV0ZSBpcwotICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJpbHkgZm9yIGRlc2lnbi10aW1lIHRvb2xzIGFuZCBpcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHRvIGhhdmUgYW55IG1lYW5pbmcgYXQgcnVudGltZS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgb2YgdGhlIENvbnZlcnRlciBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG1heSBiZSBjb25maWd1cmVkIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBDb252ZXJ0ZXIuICBUaGlzIGF0dHJpYnV0ZSBpcyBwcmltYXJpbHkgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbi10aW1lIHRvb2xzIGFuZCBpcyBub3Qgc3BlY2lmaWVkIHRvIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgYW55IG1lYW5pbmcgYXQgcnVudGltZS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1jb252ZXJ0ZXItZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctY29udmVydGVyLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgY29udmVydGVyLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWxpZmVjeWNsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJsaWZlY3ljbGUiIGVsZW1lbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gc3BlY2lmeQotICAgICAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGJlaGF2aW91ciBvZiB0aGUgZGVmYXVsdCBMaWZlY3ljbGUKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGhhc2UtbGlzdGVuZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwaGFzZS1saXN0ZW5lciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgUGhhc2VMaXN0ZW5lciAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSByZWdpc3RlcmVkIG9uIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIExpZmVjeWNsZS4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWxpZmVjeWNsZS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctbGlmZWN5Y2xlLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgbGlmZWN5Y2xlLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgIAotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmYWNlcy1jb25maWctbG9jYWxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSBsb2NhbGVUeXBlIGRlZmluZXMgdmFsaWQgbG9jYWxlIGRlZmluZWQgYnkgSVNPLTYzOS0xCi0gICAgICAgICAgICAgICAgYW5kIElTTy0zMTY2LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IihbYS16XXsyfSlbX3xcLV0/KFtccHtMfV17Mn0pP1tffFwtXT8oXHcrKT8iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1sb2NhbGUtY29uZmlnVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAibG9jYWxlLWNvbmZpZyIgZWxlbWVudCBhbGxvd3MgdGhlIGFwcCBkZXZlbG9wZXIgdG8gCi0gICAgICAgICAgICAgICAgZGVjbGFyZSB0aGXCoHN1cHBvcnRlZCBsb2NhbGVzIGZvciB0aGlzIGFwcGxpY2F0aW9uLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAKLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LWxvY2FsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWRlZmF1bHQtbG9jYWxlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdXBwb3J0ZWQtbG9jYWxlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctc3VwcG9ydGVkLWxvY2FsZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWRlZmF1bHQtdmFsaWRhdG9yc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImRlZmF1bHQtdmFsaWRhdG9ycyIgZWxlbWVudCBhbGxvd3MgdGhlIGFwcCBkZXZlbG9wZXIgdG8gCi0gICAgICAgICAgICAgICAgcmVnaXN0ZXIgYSBzZXQgb2YgdmFsaWRhdG9ycywgcmVmZXJlbmNlZCBieSBpZGVudGlmaWVyLCB0aGF0Ci0gICAgICAgICAgICAgICAgYXJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8gYW55IEVkaXRhYmxlVmFsdWVIb2xkZXIgY29tcG9uZW50Ci0gICAgICAgICAgICAgICAgaW4gdGhlIGFwcGxpY2F0aW9uLCB1bmxlc3Mgb3ZlcnJpZGRlbiBvciBkaXNhYmxlZCBsb2NhbGx5LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAKLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInZhbGlkYXRvci1pZCIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBpZGVudGlmaWVyIAotICAgICAgICAgICAgICAgICAgICAgICAgb2YgYSByZWdpc3RlcmVkIHZhbGlkYXRvci4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgIm1hbmFnZWQtYmVhbiIgZWxlbWVudCByZXByZXNlbnRzIGEgSmF2YUJlYW4sIG9mIGEgCi0gICAgICAgICAgICAgICAgcGFydGljdWxhciBjbGFzcywgdGhhdCB3aWxsIGJlIGR5bmFtaWNhbGx5IGluc3RhbnRpYXRlZCAKLSAgICAgICAgICAgICAgICBhdCBydW50aW1lIChieSB0aGUgZGVmYXVsdCBWYXJpYWJsZVJlc29sdmVyIGltcGxlbWVudGF0aW9uKSAKLSAgICAgICAgICAgICAgICBpZiBpdCBpcyByZWZlcmVuY2VkIGFzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgdmFsdWUgYmluZGluZyAKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uLCBhbmQgbm8gY29ycmVzcG9uZGluZyBiZWFuIGNhbiBiZSBpZGVudGlmaWVkIGluIAotICAgICAgICAgICAgICAgIGFueSBzY29wZS4gIEluIGFkZGl0aW9uIHRvIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWFuYWdlZCBiZWFuLCAKLSAgICAgICAgICAgICAgICBhbmQgdGhlIG9wdGlvbmFsIHN0b3Jpbmcgb2YgaXQgaW50byB0aGUgc3BlY2lmaWVkIHNjb3BlLCAKLSAgICAgICAgICAgICAgICB0aGUgbmVzdGVkIG1hbmFnZWQtcHJvcGVydHkgZWxlbWVudHMgY2FuIGJlIHVzZWQgdG8gCi0gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2Ygc2V0dGFibGUgSmF2YUJlYW5zIHByb3BlcnRpZXMgb2YgCi0gICAgICAgICAgICAgICAgdGhlIGNyZWF0ZWQgaW5zdGFuY2UuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4tbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAibWFuYWdlZC1iZWFuLW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZSB1bmRlciB3aGljaCBhIG1hbmFnZWQgYmVhbiB3aWxsIAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2VhcmNoZWQgZm9yLCBhcyB3ZWxsIGFzIHN0b3JlZCAodW5sZXNzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYW5hZ2VkLWJlYW4tc2NvcGUiIHZhbHVlIGlzICJub25lIikuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4tY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgIm1hbmFnZWQtYmVhbi1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCB3aWxsIGJlIAotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZGB0byBpbnN0YW50aWF0ZSBhIG5ldyBpbnN0YW5jZSBpZiBjcmVhdGlvbiBvZiB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWRgbWFuYWdlZCBiZWFuIGlzIHJlcXVlc3RlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpZmllZCBjbGFzcyBtdXN0IGNvbmZvcm0gdG8gc3RhbmRhcmQgSmF2YUJlYW5zCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZW50aW9ucy4gIEluIHBhcnRpY3VsYXIsIGl0IG11c3QgaGF2ZSBhIHB1YmxpYwotICAgICAgICAgICAgICAgICAgICAgICAgemVyby1hcmd1bWVudHMgY29uc3RydWN0b3IsIGFuZCB6ZXJvIG9yIG1vcmUgcHVibGljCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBzZXR0ZXJzLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgCi0gICAgICAgICAgICAgICAgbmFtZT0ibWFuYWdlZC1iZWFuLXNjb3BlIgotICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuLXNjb3BlT3JOb25lVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAibWFuYWdlZC1iZWFuLXNjb3BlIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIHNjb3BlIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50byB3aGljaCBhIG5ld2x5IGNyZWF0ZWQgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZWQgYmVhbiB3aWxsIGJlIHN0b3JlZCAodW5sZXNzIHRoZSB2YWx1ZSBpcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICJub25lIikuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLXByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hbmFnZWQtcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1lbnRyaWVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hcC1lbnRyaWVzVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0LWVudHJpZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbGlzdC1lbnRyaWVzVHlwZSIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbi1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW4tZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImVhZ2VyIgotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJvcHRpb25hbCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIG9ubHkgY29uc2lkZXJlZCB3aGVuIGFzc29jaWF0ZWQgd2l0aAotICAgICAgICAgICAgICAgICAgICBhbiBhcHBsaWNhdGlvbi1zY29wZWQgbWFuYWdlZCBiZWFuLiBJZiB0aGUgdmFsdWUgb2YgdGhlIGVhZ2VyCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBpcyB0cnVlIHRoZSBydW50aW1lIG11c3QgaW5zdGFudGlhdGUgdGhpcyBjbGFzcwotICAgICAgICAgICAgICAgICAgICBhbmQgc3RvcmUgdGhlIGluc3RhbmNlIHdpdGhpbiB0aGUgYXBwbGljYXRpb24gc2NvcGUgd2hlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gc3RhcnRzLgotCi0gICAgICAgICAgICAgICAgICAgIElmIGVhZ2VyIGlzIHVuc3BlY2lmaWVkIG9yIGlzIGZhbHNlLCB0aGUgZGVmYXVsdCAibGF6eSIKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGlvbiBhbmQgc2NvcGVkIHN0b3JhZ2Ugb2YgdGhlIG1hbmFnZWQgYmVhbgotICAgICAgICAgICAgICAgICAgICB3aWxsIG9jY3VyLgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW4tZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBtYW5hZ2VkLWJlYW4uICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAKLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW4tc2NvcGVPck5vbmVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgbGVnYWwgdmFsdWVzIGZvciB0aGUgPG1hbmFnZWQtYmVhbi1zY29wZT4KLSAgICAgICAgICAgICAgICBlbGVtZW50J3MgYm9keSBjb250ZW50LCB3aGljaCBpbmNsdWRlcyBhbGwgb2YgdGhlIHNjb3BlcwotICAgICAgICAgICAgICAgIG5vcm1hbGx5IHVzZWQgaW4gYSB3ZWIgYXBwbGljYXRpb24sIHBsdXMgdGhlICJub25lIiB2YWx1ZQotICAgICAgICAgICAgICAgIGluZGljYXRpbmcgdGhhdCBhIGNyZWF0ZWQgYmVhbiBzaG91bGQgbm90IGJlIHN0b3JlZCBpbnRvCi0gICAgICAgICAgICAgICAgYW55IHNjb3BlLiAgQWx0ZXJuYXRpdmVseSwgYW4gRUwgZXhwcmVzc2lvbiBtYXkgYmUgdXNlZAotICAgICAgICAgICAgICAgIGFzIHRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQuICBUaGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhpcwotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gbXVzdCBieSBvZiB0eXBlIGphdmEudXRpbC5NYXAuCi0gICAgICAgICAgICAgICAgXV0+Ci0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9InZpZXd8cmVxdWVzdHxzZXNzaW9ufGFwcGxpY2F0aW9ufG5vbmV8I1x7LipcfSIvPgotICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1tYW5hZ2VkLXByb3BlcnR5VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgIm1hbmFnZWQtcHJvcGVydHkiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIAotICAgICAgICAgICAgICAgIHByb3BlcnR5IG9mIGEgbWFuYWdlZCBiZWFuIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIHRvIHRoZSAKLSAgICAgICAgICAgICAgICBzcGVjaWZpZWQgdmFsdWUgKG9yIHZhbHVlIHNldCkgaWYgdGhlIGNvcnJlc3BvbmRpbmcgCi0gICAgICAgICAgICAgICAgbWFuYWdlZCBiZWFuIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInByb3BlcnR5LW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YUJlYW5zIAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgbmFtZSB1bmRlciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBtYXkgCi0gICAgICAgICAgICAgICAgICAgICAgICBiZSBzdG9yZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicHJvcGVydHktY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YSB0eXBlIAotICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb3BlcnR5IG5hbWUuICAKLSAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIGl0IGNhbiBiZSBpbmZlcnJlZCBmcm9tIGV4aXN0aW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlczsgaG93ZXZlciwgdGhpcyBlbGVtZW50IHNob3VsZCBiZSBzcGVjaWZpZWQgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGdvaW5nIHRvIGJlIHRoZSBzb3VyY2UgCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgZ2VuZXJhdGluZyB0aGUgY29ycmVzcG9uZGluZyBjbGFzc2VzLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWVudHJpZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbWFwLWVudHJpZXNUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im51bGwtdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbnVsbC12YWx1ZVR5cGUiPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXZhbHVlVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0LWVudHJpZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbGlzdC1lbnRyaWVzVHlwZSIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbWFwLWVudHJ5VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgIm1hcC1lbnRyeSIgZWxlbWVudCByZXByc2VudHMgYSBzaW5nbGUga2V5LWVudHJ5IHBhaXIgCi0gICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhIG1hbmFnZWQgCi0gICAgICAgICAgICAgICAgcHJvcGVydHkgb2YgdHlwZSBqYXZhLnV0aWwuTWFwLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAia2V5IiBlbGVtZW50IGlzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcCBrZXkgdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiBhIG1hbmFnZWQgcHJvcGVydHkgb2YgCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGphdmEudXRpbC5NYXAuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJudWxsLXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW51bGwtdmFsdWVUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXZhbHVlVHlwZSIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbWFwLWVudHJpZXNUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAibWFwLWVudHJpZXMnIGVsZW1lbnQgcmVwcmVzZW50cyBhIHNldCBvZiBrZXktZW50cnkgcGFpcnMgCi0gICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhIG1hbmFnZWQgcHJvcGVydHkgCi0gICAgICAgICAgICAgICAgb2YgdHlwZSBqYXZhLnV0aWwuTWFwLiAgSW4gYWRkaXRpb24sIHRoZSBKYXZhIGNsYXNzIHR5cGVzIAotICAgICAgICAgICAgICAgIG9mIHRoZSBrZXkgYW5kIGVudHJ5IHZhbHVlcyBtYXkgYmUgb3B0aW9uYWxseSBkZWNsYXJlZC4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJrZXktY2xhc3MiIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIHRvIHdoaWNoIAotICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCAia2V5IiBlbGVtZW50IGluIGEgc2V0IG9mICJtYXAtZW50cnkiIGVsZW1lbnRzIAotICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8uICBJZiBvbWl0dGVkLCAiamF2YS5sYW5nLlN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICBpcyBhc3N1bWVkLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWx1ZS1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1lbnRyeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hcC1lbnRyeVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1uYXZpZ2F0aW9uLWNhc2VUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAibmF2aWdhdGlvbi1jYXNlIiBlbGVtZW50IGRlc2NyaWJlcyBhIHBhcnRpY3VsYXIgCi0gICAgICAgICAgICAgICAgY29tYmluYXRpb24gb2YgY29uZGl0aW9ucyB0aGF0IG11c3QgbWF0Y2ggZm9yIHRoaXMgY2FzZSB0byAKLSAgICAgICAgICAgICAgICBiZSBleGVjdXRlZCwgYW5kIHRoZSB2aWV3IGlkIG9mIHRoZSBjb21wb25lbnQgdHJlZSB0aGF0IAotICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzZWxlY3RlZCBuZXh0LgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZyb20tYWN0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZnJvbS1hY3Rpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZyb20tb3V0Y29tZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImZyb20tb3V0Y29tZSIgZWxlbWVudCBjb250YWlucyBhIGxvZ2ljYWwgb3V0Y29tZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBleGVjdXRpb24gb2YgYW4gYXBwbGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgdmlhIGFuICJhY3Rpb25SZWYiIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAob3IgYSBsaXRlcmFsIHZhbHVlIHNwZWNpZmllZCBieSBhbiAiYWN0aW9uIiBwcm9wZXJ0eSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIGEgVUlDb21tYW5kIGNvbXBvbmVudC4gIElmIHNwZWNpZmllZCwgdGhpcyBydWxlIAotICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSByZWxldmFudCBvbmx5IGlmIHRoZSBvdXRjb21lIHZhbHVlIG1hdGNoZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGVsZW1lbnQncyB2YWx1ZS4gIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgcnVsZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcmVsZXZhbnQgaWYgdGhlIG91dGNvbWUgdmFsdWUgaXMgbm9uLW51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yLCBpZiB0aGUgImlmIiBlbGVtZW50IGlzIHByZXNlbnQsIHdpbGwgYmUgcmVsZXZhbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbnkgb3V0Y29tZSB2YWx1ZSwgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uIHNwZWNpZmllZCBpbiB0aGUgImlmIiBlbGVtZW50IHVsdGltYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZXMgaWYgdGhpcyBydWxlIGlzIGEgbWF0Y2guCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWlmVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBzZWUgc2VjdGlvbiBKU0YuNy40LjIgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoaXMgZWxlbWVudC4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvLXZpZXctaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWx1ZVR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInRvLXZpZXctaWQiIGVsZW1lbnQgY29udGFpbnMgdGhlIHZpZXcgaWRlbnRpZmllciAKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBuZXh0IHZpZXcgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGlmIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb24gcnVsZSBpcyBtYXRjaGVkLiBJZiB0aGUgY29udGVudHMgaXMgYQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgZXhwcmVzc2lvbiwgaXQgc2hvdWxkIGJlIHJlc29sdmVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbiBoYW5kbGVyIHRvIG9idGFpbiB0aGUgdmlldyBpZGVudGlmaWVyLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgCi0gICAgICAgICAgICAgICAgbmFtZT0icmVkaXJlY3QiCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZWRpcmVjdFR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbmF2aWdhdGlvbi1ydWxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAibmF2aWdhdGlvbi1ydWxlIiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCAKLSAgICAgICAgICAgICAgICBkZWNpc2lvbiBydWxlIHRoYXQgd2lsbCBiZSB1dGlsaXplZCBieSB0aGUgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uSGFuZGxlciBpbXBsZW1lbnRhdGlvbiB0byBtYWtlIGRlY2lzaW9ucyBvbiAKLSAgICAgICAgICAgICAgICB3aGF0IHZpZXcgc2hvdWxkIGJlIGRpc3BsYXllZCBuZXh0LCBiYXNlZCBvbiB0aGUgCi0gICAgICAgICAgICAgICAgdmlldyBpZCBiZWluZyBwcm9jZXNzZWQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmcm9tLXZpZXctaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mcm9tLXZpZXctaWRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24tY2FzZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW5hdmlnYXRpb24tY2FzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgCi0gICAgICAgICAgICAgICAgbmFtZT0ibmF2aWdhdGlvbi1ydWxlLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW5hdmlnYXRpb24tcnVsZS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1uYXZpZ2F0aW9uLXJ1bGUtZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBuYXZpZ2F0aW9uLXJ1bGUuICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW51bGwtdmFsdWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJudWxsLXZhbHVlIiBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoZSBtYW5hZ2VkCi0gICAgICAgICAgICAgICAgcHJvcGVydHkgaW4gd2hpY2ggd2UgYXJlIG5lc3RlZCB3aWxsIGJlIGV4cGxpY2l0bHkKLSAgICAgICAgICAgICAgICBzZXQgdG8gbnVsbCBpZiBvdXIgbWFuYWdlZCBiZWFuIGlzIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICBjcmVhdGVkLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBvbWl0dGluZyB0aGUgbWFuYWdlZAotICAgICAgICAgICAgICAgIHByb3BlcnR5IGVsZW1lbnQgZW50aXJlbHksIHdoaWNoIHdpbGwgY2F1c2Ugbm8KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSBzZXR0ZXIgdG8gYmUgY2FsbGVkIGZvciB0aGlzIHByb3BlcnR5LgotCi0gICAgICAgICAgICAgICAgVGhlICJudWxsLXZhbHVlIiBlbGVtZW50IGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUKLSAgICAgICAgICAgICAgICBhc3NvY2lhdGVkICJwcm9wZXJ0eS1jbGFzcyIgaWRlbnRpZmllcyBhIEphdmEgY2xhc3MsCi0gICAgICAgICAgICAgICAgbm90IGEgSmF2YSBwcmltaXRpdmUuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAKLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1wcm9wZXJ0eVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eSIgZWxlbWVudCByZXByZXNlbnRzIGEgSmF2YUJlYW4gcHJvcGVydHkgb2YgdGhlIAotICAgICAgICAgICAgICAgIEphdmEgY2xhc3MgcmVwcmVzZW50ZWQgYnkgb3VyIHBhcmVudCBlbGVtZW50LgotCi0gICAgICAgICAgICAgICAgUHJvcGVydHkgbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgSmF2YSAKLSAgICAgICAgICAgICAgICBjbGFzcyB0aGF0IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgZWxlbWVudCwgYW5kIG11c3QgCi0gICAgICAgICAgICAgICAgY29ycmVzcG9uZCB0byBwcm9wZXJ0eSBuYW1lcyB0aGF0IHdpbGwgYmUgcmVjb2duaXplZCB3aGVuIAotICAgICAgICAgICAgICAgIHBlcmZvcm1pbmcgaW50cm9zcGVjdGlvbiBhZ2FpbnN0IHRoYXQgY2xhc3MgdmlhIAotICAgICAgICAgICAgICAgIGphdmEuYmVhbnMuSW50cm9zcGVjdG9yLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicHJvcGVydHktbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhQmVhbnMgCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBuYW1lIHVuZGVyIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIAotICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIHN0b3JlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLXR5cGVUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eS1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhIHR5cGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvcGVydHkgbmFtZS4gIAotICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gZXhpc3RpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOyBob3dldmVyLCB0aGlzIGVsZW1lbnQgc2hvdWxkIGJlIHNwZWNpZmllZCBpZiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgZ29pbmcgdG8gYmUgdGhlIHNvdXJjZSBmb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZGVmYXVsdC12YWx1ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3VnZ2VzdGVkLXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctc3VnZ2VzdGVkLXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1wcm9wZXJ0eS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcHJvcGVydHktZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBwcm9wZXJ0eS4gIEl0IG1heSBjb250YWluIAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1yZWRpcmVjdFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgVGhlICJyZWRpcmVjdCIgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCBuYXZpZ2F0aW9uIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgInRvLXZpZXctaWQiIHNob3VsZCBiZSBhY2NvbXBsaXNoZWQgYnkgCi0gICAgICAgICAgICAgICAgICAgIHBlcmZvcm1pbmcgYW4gSFRUUCByZWRpcmVjdCByYXRoZXIgdGhhbiB0aGUgdXN1YWwgCi0gICAgICAgICAgICAgICAgICAgIFZpZXdIYW5kbGVyIG1lY2hhbmlzbXMuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmlldy1wYXJhbSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXJlZGlyZWN0LXZpZXdQYXJhbVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlLXZpZXctcGFyYW1zIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotCi0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1yZWRpcmVjdC12aWV3UGFyYW1UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFRoZSAidmlldy1wYXJhbSIgZWxlbWVudCwgb25seSB2YWxpZCB3aXRoaW4KLSAgICAgICAgICAgICAgICAgICAgYSAicmVkaXJlY3QiIGVsZW1lbnQsIGNvbnRhaW5zIGNoaWxkICJuYW1lIgotICAgICAgICAgICAgICAgICAgICBhbmQgInZhbHVlIiBlbGVtZW50cyB0aGF0IG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0IHVybCB3aGVuIHRoZSByZWRpcmVjdCBpcyBwZXJmb3JtZWQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1yZWZlcmVuY2VkLWJlYW5UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAicmVmZXJlbmNlZC1iZWFuIiBlbGVtZW50IHJlcHJlc2VudHMgYXQgZGVzaWduIHRpbWUgdGhlIAotICAgICAgICAgICAgICAgIHByb21pc2UgdGhhdCBhIEphdmEgb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB3aWxsIGV4aXN0IGF0IAotICAgICAgICAgICAgICAgIHJ1bnRpbWUgaW4gc29tZSBzY29wZSwgdW5kZXIgdGhlIHNwZWNpZmllZCBrZXkuICBUaGlzIGNhbiBiZSAKLSAgICAgICAgICAgICAgICB1c2VkIGJ5IGRlc2lnbiB0aW1lIHRvb2xzIHRvIGNvbnN0cnVjdCB1c2VyIGludGVyZmFjZSBkaWFsb2dzIAotICAgICAgICAgICAgICAgIGJhc2VkIG9uIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuICBUaGUgcHJlc2VuY2UgCi0gICAgICAgICAgICAgICAgb3IgYWJzZW5jZSBvZiBhIHJlZmVyZW5jZWQgYmVhbiBlbGVtZW50IGhhcyBubyBpbXBhY3Qgb24gdGhlIAotICAgICAgICAgICAgICAgIEphdmFTZXJ2ZXIgRmFjZXMgcnVudGltZSBlbnZpcm9ubWVudCBpbnNpZGUgYSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlZC1iZWFuLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInJlZmVyZW5jZWQtYmVhbi1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUgdW5kZXIgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkIGJlYW4gbWF5IGJlIGFzc3VtZWQgdG8gYmUgc3RvcmVkLCBpbiBvbmUgCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiAncmVxdWVzdCcsICdzZXNzaW9uJywgJ3ZpZXcnLCAnYXBwbGljYXRpb24nIAotICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBjdXN0b20gc2NvcGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VkLWJlYW4tY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInJlZmVyZW5jZWQtYmVhbi1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIAotICAgICAgICAgICAgICAgICAgICAgICAgKGVpdGhlciBhYnN0cmFjdCBvciBjb25jcmV0ZSkgb3IgSmF2YSBpbnRlcmZhY2UgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCBieSB0aGUgY29ycmVzcG9uZGluZyByZWZlcmVuY2VkIGJlYW4uIAotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1yZW5kZXIta2l0VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgInJlbmRlci1raXQiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIFJlbmRlcktpdCAKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgCi0gICAgICAgICAgICAgICAgcmVuZGVyLWtpdC1pZC4gIElmIG5vIHJlbmRlci1raXQtaWQgaXMgc3BlY2lmaWVkLCB0aGUgCi0gICAgICAgICAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgZGVmYXVsdCBSZW5kZXJLaXQgCi0gICAgICAgICAgICAgICAgKFJlbmRlcktpdEZhY3RvcnkuREVGQVVMVF9SRU5ERVJfS0lUKSBpcyBhc3N1bWVkLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0LWlkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZW5kZXIta2l0LWlkIiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgUmVuZGVyS2l0IHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyLWtpdCIgZWxlbWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbmRlci1raXQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZW5kZXIta2l0LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjb25jcmV0ZSBSZW5kZXJLaXQgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbmRlcmVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcmVuZGVyZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGllbnQtYmVoYXZpb3ItcmVuZGVyZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1jbGllbnQtYmVoYXZpb3ItcmVuZGVyZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXJlbmRlci1raXQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWNsaWVudC1iZWhhdmlvci1yZW5kZXJlclR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImNsaWVudC1iZWhhdmlvci1yZW5kZXJlciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgCi0gICAgICAgICAgICAgICAgQ2xpZW50QmVoYXZpb3JSZW5kZXJlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHNob3VsZCBiZSAKLSAgICAgICAgICAgICAgICByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3IgcmVuZGVyZXIgdHlwZSBpZGVudGlmaWVyLAotICAgICAgICAgICAgICAgIGluIHRoZSBSZW5kZXJLaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJlbnQgInJlbmRlci1raXQiCi0gICAgICAgICAgICAgICAgZWxlbWVudC4gIENsaWVudCBCZWhhdmlvciByZW5kZXJlciB0eXBlIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgUmVuZGVyS2l0Ci0gICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJlbnQgInJlbmRlci1raXQiIGVsZW1lbnQuCi0KLSAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBjb21wb25lbnQKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIHRoYXQgYXJlIHJlY29nbml6ZWQgYnkgdGhpcyByZW5kZXJlci4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsaWVudC1iZWhhdmlvci1yZW5kZXJlci10eXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImNsaWVudC1iZWhhdmlvci1yZW5kZXJlci10eXBlIiBlbGVtZW50IHJlcHJlc2VudHMgYSByZW5kZXJlciB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgQ2xpZW50IEJlaGF2aW9yIFJlbmRlcmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQtYmVoYXZpb3ItcmVuZGVyZXIiIGVsZW1lbnQuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGllbnQtYmVoYXZpb3ItcmVuZGVyZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImNsaWVudC1iZWhhdmlvci1yZW5kZXJlci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjb25jcmV0ZSBDbGllbnQgQmVoYXZpb3IgUmVuZGVyZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVuZGVyZXJUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyZXIiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIFJlbmRlcmVyIAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIAotICAgICAgICAgICAgICAgIHNwZWNpZmllZCBjb21wb25lbnQgZmFtaWx5IGFuZCByZW5kZXJlciB0eXBlIGlkZW50aWZpZXJzLCAKLSAgICAgICAgICAgICAgICBpbiB0aGUgUmVuZGVyS2l0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50ICJyZW5kZXIta2l0IiAKLSAgICAgICAgICAgICAgICBlbGVtZW50LiAgQ29tYmluYXRpb25zIG9mIGNvbXBvbmVudCBmYW1pbHkgYW5kIAotICAgICAgICAgICAgICAgIHJlbmRlcmVyIHR5cGUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBSZW5kZXJLaXQgCi0gICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJlbnQgInJlbmRlci1raXQiIGVsZW1lbnQuCi0KLSAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBjb21wb25lbnQgCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlcyB0aGF0IGFyZSByZWNvZ25pemVkIGJ5IHRoaXMgcmVuZGVyZXIuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAKLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1mYW1pbHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY29tcG9uZW50LWZhbWlseSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBmYW1pbHkgZm9yIHdoaWNoIHRoZSBSZW5kZXJlciByZXByZXNlbnRlZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBwYXJlbnQgInJlbmRlcmVyIiBlbGVtZW50IHdpbGwgYmUgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZW5kZXJlci10eXBlIiBlbGVtZW50IHJlcHJlc2VudHMgYSByZW5kZXJlciB0eXBlIAotICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBmb3IgdGhlIFJlbmRlcmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyZXIiIGVsZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyZXItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgUmVuZGVyZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mYWNldFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXR0cmlidXRlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZW5kZXJlci1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVuZGVyZXItZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciByZW5kZXJlci4gIEl0IG1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXJlbmRlci1raXQtZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciByZW5kZXIta2l0LiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1zdWdnZXN0ZWQtdmFsdWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJzdWdnZXN0ZWQtdmFsdWUiIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG9yCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlIGluIHdoaWNoIHRoaXMgZWxlbWVudCByZXNpZGVzLiAgVGhpcyB2YWx1ZSBpcyAKLSAgICAgICAgICAgICAgICBhZHZpc29yeSBvbmx5IGFuZCBpcyBpbnRlbmRlZCBmb3IgdG9vbHMgdG8gdXNlIHdoZW4gCi0gICAgICAgICAgICAgICAgcG9wdWxhdGluZyBwYWxsZXR0ZXMuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctc3VwcG9ydGVkLWxvY2FsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgInN1cHBvcnRlZC1sb2NhbGUiIGVsZW1lbnQgYWxsb3dzIGF1dGhvcnMgdG8gZGVjbGFyZQotICAgICAgICAgICAgICAgIHdoaWNoIGxvY2FsZXMgYXJlIHN1cHBvcnRlZCBpbiB0aGlzIGFwcGxpY2F0aW9uIGluc3RhbmNlLgotCi0gICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgOmxhbmd1YWdlOltfOmNvdW50cnk6W186dmFyaWFudDpdXQotICAgICAgICAgICAgICAgIHdpdGhvdXQgdGhlIGNvbG9ucywgZm9yIGV4YW1wbGUgImphX0pQX1NKSVMiLiAgVGhlCi0gICAgICAgICAgICAgICAgc2VwYXJhdG9ycyBiZXR3ZWVuIHRoZSBzZWdtZW50cyBtYXkgYmUgJy0nIG9yICdfJy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1sb2NhbGVUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+IAotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctYmVoYXZpb3JUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJiZWhhdmlvciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgQmVoYXZpb3IgCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUKLSAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYmVoYXZpb3IgaWRlbnRpZmllci4gIEJlaGF2aW9yIGlkZW50aWZpZXJzIG11c3QKLSAgICAgICAgICAgICAgICBiZSB1bmlxdWUgd2l0aGluIHRoZSBlbnRpcmUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgICAgICAgICAgICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMgYXR0cmlidXRlcyB0aGF0Ci0gICAgICAgICAgICAgICAgbWF5IGJlIGNvbmZpZ3VyZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgaW4gb3JkZXIKLSAgICAgICAgICAgICAgICB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgQmVoYXZpb3IuICBOZXN0ZWQgInByb3BlcnR5IgotICAgICAgICAgICAgICAgIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucyBwcm9wZXJ0aWVzIG9mIHRoZSBCZWhhdmlvciAKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IG1heSBiZSBjb25maWd1cmVkIHRvIGFmZmVjdCB0aGUKLSAgICAgICAgICAgICAgICBvcGVyYXRpb24gb2YgdGhlIEJlaGF2aW9yLiAgImF0dHJpYnV0ZSIgYW5kICJwcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICBlbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYWxsb3cgY29tcG9uZW50IGRldmVsb3BlcnMgdG8KLSAgICAgICAgICAgICAgICBtb3JlIGNvbXBsZXRlbHkgZGVzY3JpYmUgdGhlaXIgY29tcG9uZW50cyB0byB0b29scyBhbmQgdXNlcnMuCi0gICAgICAgICAgICAgICAgVGhlc2UgZWxlbWVudHMgaGF2ZSBubyByZXF1aXJlZCBydW50aW1lIHNlbWFudGljcy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJlaGF2aW9yLWlkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImJlaGF2aW9yLWlkIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGlkZW50aWZpZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIEJlaGF2aW9yIGNsYXNzIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmVnaXN0ZXJlZC4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJlaGF2aW9yLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJiZWhhdmlvci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjb25jcmV0ZSBCZWhhdmlvciAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXR0cmlidXRlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljCi0gICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUgY29uZmlndXJlZCBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciB0byBhZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBvZiB0aGUgQmVoYXZpb3IuICBUaGlzIGF0dHJpYnV0ZSBpcwotICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJpbHkgZm9yIGRlc2lnbi10aW1lIHRvb2xzIGFuZCBpcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHRvIGhhdmUgYW55IG1lYW5pbmcgYXQgcnVudGltZS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWQgInByb3BlcnR5IiBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyBvZiB0aGUgQmVoYXZpb3IgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtYXkgYmUgY29uZmlndXJlZCB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgQmVoYXZpb3IuICBUaGlzIGF0dHJpYnV0ZSBpcyBwcmltYXJpbHkgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbi10aW1lIHRvb2xzIGFuZCBpcyBub3Qgc3BlY2lmaWVkIHRvIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgYW55IG1lYW5pbmcgYXQgcnVudGltZS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJlaGF2aW9yLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWJlaGF2aW9yLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1iZWhhdmlvci1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGJlaGF2aW9yLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctdmFsaWRhdG9yVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAidmFsaWRhdG9yIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBWYWxpZGF0b3IKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZQotICAgICAgICAgICAgICAgIHNwZWNpZmllZCB2YWxpZGF0b3IgaWRlbnRpZmllci4gIFZhbGlkYXRvciBpZGVudGlmaWVycyBtdXN0IAotICAgICAgICAgICAgICAgIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgCi0gICAgICAgICAgICAgICAgbWF5IGJlIGNvbmZpZ3VyZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgaW4gb3JkZXIgCi0gICAgICAgICAgICAgICAgdG8gYWZmZWN0IHRoZSBvcGVyYXRpb24gb2YgdGhlIFZhbGlkYXRvci4gIE5lc3RlZCAicHJvcGVydHkiCi0gICAgICAgICAgICAgICAgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zIHByb3BlcnRpZXMgb2YgdGhlIFZhbGlkYXRvcgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gYWZmZWN0IHRoZQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBvZiB0aGUgVmFsaWRhdG9yLiAgImF0dHJpYnV0ZSIgYW5kICJwcm9wZXJ0eSIgCi0gICAgICAgICAgICAgICAgZWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGFsbG93IGNvbXBvbmVudCBkZXZlbG9wZXJzIHRvIAotICAgICAgICAgICAgICAgIG1vcmUgY29tcGxldGVseSBkZXNjcmliZSB0aGVpciBjb21wb25lbnRzIHRvIHRvb2xzIGFuZCB1c2Vycy4KLSAgICAgICAgICAgICAgICBUaGVzZSBlbGVtZW50cyBoYXZlIG5vIHJlcXVpcmVkIHJ1bnRpbWUgc2VtYW50aWNzLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWlkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInZhbGlkYXRvci1pZCIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBpZGVudGlmaWVyIAotICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgVmFsaWRhdG9yIGNsYXNzIHNob3VsZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlZ2lzdGVyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJ2YWxpZGF0b3ItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGNvbmNyZXRlIFZhbGlkYXRvciAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hdHRyaWJ1dGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljCi0gICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUgY29uZmlndXJlZCBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciB0byBhZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBvZiB0aGUgVmFsaWRhdG9yLiAgVGhpcyBhdHRyaWJ1dGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyaWx5IGZvciBkZXNpZ24tdGltZSB0b29scyBhbmQgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCB0byBoYXZlIGFueSBtZWFuaW5nIGF0IHJ1bnRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucwotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIG9mIHRoZSBWYWxpZGF0b3IgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtYXkgYmUgY29uZmlndXJlZCB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgVmFsaWRhdG9yLiAgVGhpcyBhdHRyaWJ1dGUgaXMgcHJpbWFyaWx5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24tdGltZSB0b29scyBhbmQgaXMgbm90IHNwZWNpZmllZCB0byBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgIGFueSBtZWFuaW5nIGF0IHJ1bnRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmFsaWRhdG9yLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLXZhbGlkYXRvci1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHZhbGlkYXRvci4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmYWNlcy1jb25maWctdmFsdWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJ2YWx1ZSIgZWxlbWVudCBpcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mCi0gICAgICAgICAgICAgICAgYSBsaXRlcmFsIHZhbHVlIHRvIHdoaWNoIGEgc2NhbGFyIG1hbmFnZWQgcHJvcGVydHkKLSAgICAgICAgICAgICAgICB3aWxsIGJlIHNldCwgb3IgYSB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb24gKCIjey4uLn0iKQotICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgdmFsdWUuCi0gICAgICAgICAgICAgICAgSXQgd2lsbCBiZSBjb252ZXJ0ZWQgYXMgc3BlY2lmaWVkIGZvciB0aGUgYWN0dWFsCi0gICAgICAgICAgICAgICAgcHJvcGVydHkgdHlwZS4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDp1bmlvbiAKLSAgICAgICAgICAgIG1lbWJlclR5cGVzPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWVsLWV4cHJlc3Npb25UeXBlIHhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIAotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAKLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy12YWx1ZS1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJ2YWx1ZS1jbGFzcyIgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgdG8gd2hpY2ggZWFjaAotICAgICAgICAgICAgICAgICJ2YWx1ZSIgZWxlbWVudCdzIHZhbHVlIHdpbGwgYmUgY29udmVydGVkIHRvLCBwcmlvciB0byBhZGRpbmcgCi0gICAgICAgICAgICAgICAgaXQgdG8gdGhlICJsaXN0LWVudHJpZXMiIGxpc3QgZm9yIGEgbWFuYWdlZCBwcm9wZXJ0eSB0aGF0IGlzIAotICAgICAgICAgICAgICAgIGEgamF2YS51dGlsLkxpc3QsIG9yIGEgIm1hcC1lbnRyaWVzIiBtYXAgZm9yIGEgbWFuYWdlZCAKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSB0aGF0IGlzIGEgamF2YS51dGlsLk1hcC4gIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbGlzdC1lbnRyaWVzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgImxpc3QtZW50cmllcyIgZWxlbWVudCByZXByZXNlbnRzIGEgc2V0IG9mIGluaXRpYWxpemF0aW9uCi0gICAgICAgICAgICAgICAgZWxlbWVudHMgZm9yIGEgbWFuYWdlZCBwcm9wZXJ0eSB0aGF0IGlzIGEgamF2YS51dGlsLkxpc3Qgb3IgYW4KLSAgICAgICAgICAgICAgICBhcnJheS4gIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlICJ2YWx1ZS1jbGFzcyIgZWxlbWVudCBjYW4gCi0gICAgICAgICAgICAgICAgb3B0aW9uYWxseSBiZSB1c2VkIHRvIGRlY2xhcmUgdGhlIEphdmEgdHlwZSB0byB3aGljaCBlYWNoIAotICAgICAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgQ29sbGVjdGlvbi4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWx1ZS1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1udWxsLXZhbHVlVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWx1ZVR5cGUiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXN5c3RlbS1ldmVudC1saXN0ZW5lclR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgcHJlc2VuY2Ugb2YgdGhpcyBlbGVtZW50IHdpdGhpbiB0aGUgImFwcGxpY2F0aW9uIiBlbGVtZW50IGluCi0gICAgICAgICAgICAgICAgYW4gYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiByZXNvdXJjZSBmaWxlIGluZGljYXRlcyB0aGUKLSAgICAgICAgICAgICAgICBkZXZlbG9wZXIgd2FudHMgdG8gYWRkIGFuIFN5c3RlbUV2ZW50TGlzdGVuZXIgdG8gdGhpcwotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGluc3RhbmNlLiAgRWxlbWVudHMgbmVzdGVkIHdpdGhpbiB0aGlzIGVsZW1lbnQgYWxsb3cKLSAgICAgICAgICAgICAgICBzZWxlY3RpbmcgdGhlIGtpbmRzIG9mIGV2ZW50cyB0aGF0IHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZQotICAgICAgICAgICAgICAgIGxpc3RlbmVyIGluc3RhbmNlLCBhbmQgYWxsb3cgc2VsZWN0aW5nIHRoZSBraW5kcyBvZiBjbGFzc2VzIHRoYXQKLSAgICAgICAgICAgICAgICBjYW4gYmUgdGhlIHNvdXJjZSBvZiBldmVudHMgdGhhdCBhcmUgZGVsaXZlcmVkIHRvIHRoZSBsaXN0ZW5lcgotICAgICAgICAgICAgICAgIGluc3RhbmNlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN5c3RlbS1ldmVudC1saXN0ZW5lci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAic3lzdGVtLWV2ZW50LWxpc3RlbmVyLWNsYXNzIiBlbGVtZW50IGNvbnRhaW5zCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1FdmVudExpc3RlbmVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIHdoZW4gZXZlbnRzIG9mIHRoZSB0eXBlIHNwZWNpZmllZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0tZXZlbnQtY2xhc3MiIGFyZSBzZW50IGJ5IHRoZSBydW50aW1lLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3lzdGVtLWV2ZW50LWNsYXNzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAic3lzdGVtLWV2ZW50LWNsYXNzIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIFN5c3RlbUV2ZW50IHN1YmNsYXNzIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggZXZlbnRzIHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBjbGFzcyB3aG9zZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgaXMgZ2l2ZW4gYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtLWV2ZW50LWxpc3RlbmVyLWNsYXNzIiBlbGVtZW50LgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWNsYXNzIiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInNvdXJjZS1jbGFzcyIgZWxlbWVudCwgaWYgcHJlc2VudCwgY29udGFpbnMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCB3aWxsIGJlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGZvciB0aGUgZXZlbnQgdG8gYmUgZGVsaXZlcmVkIHRvIHRoZSBjbGFzcyB3aG9zZQotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgaXMgZ2l2ZW4gYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtLWV2ZW50LWxpc3RlbmVyLWNsYXNzIiBlbGVtZW50LgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXZlcnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSByZWNvZ25pemVkIHZlcnNpb25zIG9mCi0gICAgICAgICAgICAgICAgZmFjZXMtY29uZmlnIHN1cHBvcnRlZC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMi4wIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzdWljb21wb25lbnRfMl8wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzdWljb21wb25lbnRfMl8wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgwMDYwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc3VpY29tcG9uZW50XzJfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICIxLjAiIGVuY29kaW5nID0gIlVURi04Ij8+Ci0KLQotCi08eHNkOnNjaGVtYQotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHhtbG5zOnhtbD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICB2ZXJzaW9uPSIyLjAiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gICAgICAKLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotICAgICAgCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICAgICAgCi0gICAgICBDb250cmlidXRvcihzKToKLSAgICAgIAotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0gICAgICAKLSAgICAgIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIENEREwgbGljZW5zZS4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgPCFbQ0RBVEFbCi0KLSAgICAgICAgICAgIFRoZSBYTUwgU2NoZW1hIGZvciBhIEphdmFTZXJ2ZXIgRmFjZXMgVUlDb21wb25lbnQgKFZlcnNpb24gMi4wKS4KLQotICAgICAgICAgICAgVGhlIGVsZW1lbnRzIGluIHRoaXMgc2NoZW1hIG1heSBiZSB1c2VkIGluIGFuIFhIVE1MIHBhZ2UgZm9yCi0gICAgICAgICAgICBhIGNvbXBvc2l0ZSBjb21wb25lbnQsIGJ5IHB1bGxpbmcgaW4gdGhlIGNvbXBvc2l0ZSBuYW1lc3BhY2U6Ci0gICAgICAgICAgICAKLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgeG1sbnM6Y29tcG9zaXRlPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb21wb3NpdGUiPgotICAgICAgCi0gICAgICA8Y29tcG9zaXRlOmludGVyZmFjZT4KLSAgICAgICAgIDxjb21wb3NpdGU6YXR0cmlidXRlIG5hbWU9ImZvbyIgZGVmYXVsdD0iYmFyIiAvPgotICAgICAgPC9jb21wb3NpdGU6L2ludGVyZmFjZT4KLSAgICAgIDwhLS0gdGhlIHJlc3Qgb21pdHRlZCAtLT4KLTwvaHRtbD4KLQotICAgICAgICAgICAgVGhlIGVsZW1lbnRzIGluIHRoaXMgc2NoZW1hIG1heSBhbHNvIGJlIHVzZWQgaW4gYSBmYWNlbGV0IHRhZ2xpYnJhcnkKLSAgICAgICAgICAgIGZpbGUgaW4gdGhlIHNhbWUgbWFubmVyOgotICAgICAgICAgICAgCi08ZmFjZWxldC10YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICAgeG1sbnM6Y29tcG9zaXRlPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb21wb3NpdGUiCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZWxldHRhZ2xpYmFyeV8yXzAueHNkIgotICAgICAgICAgICAgICB2ZXJzaW9uPSIyLjAiPgotICA8bmFtZXNwYWNlPmh0dHA6Ly9kb21haW4uY29tL3Rlc3Rfc2NoZW1hPC9uYW1lc3BhY2U+Ci0gIDx0YWc+Ci0gICAgPHRhZy1uYW1lPnRlc3RTY2hlbWE8L3RhZy1uYW1lPgotICAgIDxjb21wb25lbnQ+Ci0gICAgICA8Y29tcG9uZW50LXR5cGU+amF2YXguZmFjZXMuSW5wdXQ8L2NvbXBvbmVudC10eXBlPgotICAgICAgPHJlbmRlcmVyLXR5cGU+amF2YXguZmFjZXMuVGV4dDwvcmVuZGVyZXItdHlwZT4KLSAgICAgIDxoYW5kbGVyLWNsYXNzPmNvbS5zdW4uZmFjZXMuZmFjZWxldHMudGFnLmpzZi5Db21wb25lbnRIYW5kbGVyPC9oYW5kbGVyLWNsYXNzPgotICAgICAgPGNvbXBvbmVudC1leHRlbnNpb24+Ci0KLSAgICAgICAgPGNvbXBvc2l0ZTphdHRyaWJ1dGUgbmFtZT0iZm9vIiBkZWZhdWx0PSJiYXIiIC8+Ci0KLSAgICAgIDwvY29tcG9uZW50LWV4dGVuc2lvbj4KLSAgICA8L2NvbXBvbmVudD4KLSAgPC90YWc+Ci08L2ZhY2VsZXQtdGFnbGliPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkCi0gICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgdXNpbmcgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQotICAgICAgICAgICAgZm9yIGphdmFlZSBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0gICAgICAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzdWljb21wb25lbnRfMl8wLnhzZAotCi0gICAgICAgICAgICBdXT4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV81LnhzZCIvPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWUgPSAiYXR0cmlidXRlIiB0eXBlPSJqYXZhZWU6dWljb21wb25lbnQtYXR0cmlidXRlVHlwZSI+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idWljb21wb25lbnQtYXR0cmlidXRlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiYXR0cmlidXRlIiBlbGVtZW50IGRlY2xhcmVzIGFuIGF0dHJpYnV0ZSBvZiB0aGlzIAotICAgICAgICAgICAgICAgIHVpIGNvbXBvbmVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dWljb21wb25lbnQtYXR0cmlidXRlVHlwZSIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPgotCi0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc3BsYXlOYW1lIgotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICB1c2U9Im9wdGlvbmFsIi8+Ci0KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hvcnREZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJvcHRpb25hbCIvPgotCi0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZT0ib3B0aW9uYWwiLz4KLQotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2Qtc2lnbmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICB1c2U9Im9wdGlvbmFsIj4KLQotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8IVtDREFUQVsKLQotCSAgICBQcm92aWRlcyB0aGUgc2lnbmF0dXJlIG9mIHRoZSBKYXZhIG1ldGhvZC4gIFRoZSBzeW50YXggb2YKLQkgICAgdGhlIG1ldGhvZC1zaWduYXR1cmUgZWxlbWVudCBpcyBhcyBmb2xsb3dzICh0YWtlbiBmcm9tCi0JICAgIGZ1bmN0aW9uLXNpZ25hdHVyZSBpbiB3ZWItanNwdGFnbGlicmFyeV8yXzEueHNkKToKLQotCQlNZXRob2RTaWduYXR1cmUgOjo9IFJldHVyblR5cGUgUyBNZXRob2ROYW1lIFM/Ci0JCQkJICAgICAgJygnIFM/IFBhcmFtZXRlcnM/IFM/ICcpJwotCi0gICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgICAgOjo9IFR5cGUKLQotCQlNZXRob2ROYW1lICAgICAgICA6Oj0gSWRlbnRpZmllcgotCi0JCVBhcmFtZXRlcnMgICAgICAgIDo6PSAgIFBhcmFtZXRlcgotCQkJCSAgICAgIHwgKCBQYXJhbWV0ZXIgUz8gJywnIFM/IFBhcmFtZXRlcnMgKQotCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyICAgICAgICAgOjo9IFR5cGUKLQotCQlXaGVyZToKLQotIAkJICAgICogVHlwZSBpcyBhIGJhc2ljIHR5cGUgb3IgYSBmdWxseSBxdWFsaWZpZWQKLQkJICAgICAgSmF2YSBjbGFzcyBuYW1lIChpbmNsdWRpbmcgcGFja2FnZSBuYW1lKSwKLQkJICAgICAgYXMgcGVyIHRoZSAnVHlwZScgcHJvZHVjdGlvbiBpbiB0aGUgSmF2YQotCQkgICAgICBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBTZWNvbmQgRWRpdGlvbiwKLQkJICAgICAgQ2hhcHRlciAxOC4KLQotICAgICAgICAgICAgICAgICAgICAqIElkZW50aWZpZXIgaXMgYSBKYXZhIGlkZW50aWZpZXIsIGFzIHBlcgotCQkgICAgICB0aGUgJ0lkZW50aWZpZXInIHByb2R1Y3Rpb24gaW4gdGhlIEphdmEKLQkJICAgICAgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgU2Vjb25kCi0JCSAgICAgIEVkaXRpb24sIENoYXB0ZXIgMTguCi0KLQkgICAgRXhhbXBsZToKLQotCSAgICBqYXZhLmxhbmcuU3RyaW5nIG5pY2tOYW1lKCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQgKQotCi0gICAgICAgICAgICAgICAgXV0+Ci0JICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFwcGx5VG8iCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZT0ib3B0aW9uYWwiLz4KLQotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZT0ib3B0aW9uYWwiLz4KLQotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVmZXJyZWQiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICB1c2U9Im9wdGlvbmFsIi8+Ci0KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhwZXJ0IgotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJvcHRpb25hbCIvPgotCi0gICAgICAgIAotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mcmFnbWVudF8zXzAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZnJhZ21lbnRfM18wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkNDIyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mcmFnbWVudF8zXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICAgdmVyc2lvbj0iMy4wIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLSAgICAgIAotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgICAKLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbgotICAgICAgRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlCi0gICAgICAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgICB0aGUgTGljZW5zZS4gWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwgb3IKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLSAgICAgIExpY2Vuc2UuCi0gICAgICAKLSAgICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyCi0gICAgICBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gICAgICBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzCi0gICAgICBwcm92aWRlZCBieSBTdW4gaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZSBmaWxlCi0gICAgICB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4gIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nCi0gICAgICBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBbXQotICAgICAgcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgICAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0gICAgICAKLSAgICAgIENvbnRyaWJ1dG9yKHMpOgotICAgICAgCi0gICAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlCi0gICAgICBDRERMIG9yIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nCi0gICAgICAiW0NvbnRyaWJ1dG9yXSBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UKLSAgICAgIGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhIHJlY2lwaWVudCBoYXMgdGhlCi0gICAgICBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUKLSAgICAgIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8gaXRzCi0gICAgICBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIKLSAgICAgIGNvZGUgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZQotICAgICAgb3B0aW9uIGFwcGxpZXMgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2gKLSAgICAgIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0IGhvbGRlci4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBW1sKLSAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBTZXJ2bGV0IDMuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gICAgICBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQgIk1FVEEtSU5GL3dlYi1mcmFnbWVudC54bWwiCi0gICAgICBpbiB0aGUgd2ViIGZyYWdtZW50J3MgamFyIGZpbGUuICBBbGwgU2VydmxldCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCi0gICAgICBtdXN0IGluZGljYXRlIHRoZSB3ZWIgYXBwbGljYXRpb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFCi0gICAgICBuYW1lc3BhY2U6Ci0gICAgICAKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSAKLSAgICAgIAotICAgICAgYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSAKLSAgICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6IAotICAgICAgCi0gICAgICA8d2ViLWZyYWdtZW50IHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCi0gICAgICB2ZXJzaW9uPSIzLjAiPiAKLSAgICAgIC4uLgotICAgICAgPC93ZWItZnJhZ21lbnQ+Ci0gICAgICAKLSAgICAgIFRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotICAgICAgdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQotICAgICAgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLSAgICAgIAotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mcmFnbWVudF8zXzAueHNkCi0gICAgICAKLSAgICAgIF1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotICAgICAgCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gICAgICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gICAgICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gICAgICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICAgICAgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLSAgICAgIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICAgICAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0id2ViLWNvbW1vbl8zXzAueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItZnJhZ21lbnQiCi0gICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6d2ViLWZyYWdtZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSB3ZWItZnJhZ21lbnQgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgZGVwbG95bWVudAotICAgICAgICBkZXNjcmlwdG9yIGZvciBhIHdlYiBmcmFnbWVudC4gIE5vdGUgdGhhdCB0aGUgc3ViLWVsZW1lbnRzCi0gICAgICAgIG9mIHRoaXMgZWxlbWVudCBjYW4gYmUgaW4gdGhlIGFyYml0cmFyeSBvcmRlci4gQmVjYXVzZSBvZgotICAgICAgICB0aGF0LCB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSBlbGVtZW50cyBvZiBkaXN0cmlidXRhYmxlLAotICAgICAgICBzZXNzaW9uLWNvbmZpZywgd2VsY29tZS1maWxlLWxpc3QsIGpzcC1jb25maWcsIGxvZ2luLWNvbmZpZywKLSAgICAgICAgYW5kIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3Qgd2FzIGNoYW5nZWQgZnJvbSAiPyIgdG8gIioiCi0gICAgICAgIGluIHRoaXMgc2NoZW1hLiAgSG93ZXZlciwgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpbnN0YW5jZQotICAgICAgICBmaWxlIG11c3Qgbm90IGNvbnRhaW4gbXVsdGlwbGUgZWxlbWVudHMgb2Ygc2Vzc2lvbi1jb25maWcsCi0gICAgICAgIGpzcC1jb25maWcsIGFuZCBsb2dpbi1jb25maWcuIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIG9mCi0gICAgICAgIHdlbGNvbWUtZmlsZS1saXN0IG9yIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QsIHRoZSBjb250YWluZXIKLSAgICAgICAgbXVzdCBjb25jYXRlbmF0ZSB0aGUgZWxlbWVudCBjb250ZW50cy4gIFRoZSBtdWx0aXBsZSBvY2N1cmVuY2UKLSAgICAgICAgb2YgdGhlIGVsZW1lbnQgZGlzdHJpYnV0YWJsZSBpcyByZWR1bmRhbnQgYW5kIHRoZSBjb250YWluZXIKLSAgICAgICAgdHJlYXRzIHRoYXQgY2FzZSBleGFjdGx5IGluIHRoZSBzYW1lIHdheSB3aGVuIHRoZXJlIGlzIG9ubHkKLSAgICAgICAgb25lIGRpc3RyaWJ1dGFibGUuIAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItY29tbW9uLXNlcnZsZXQtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIHNlcnZsZXQgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlcnZsZXQuCi0gICAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnNlcnZsZXQiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpzZXJ2bGV0LW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWNvbW1vbi1maWx0ZXItbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGZpbHRlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsdGVyLgotICAgICAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpmaWx0ZXIiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpmaWx0ZXItbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItY29tbW9uLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGVqYi1sb2NhbC1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgICAgICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIHdlYgotICAgICAgICAgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotICAgICAgICAgIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1jb21tb24tZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0gICAgICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgd2ViCi0gICAgICAgICAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgICAgICAgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWNvbW1vbi1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0gICAgICAgICAgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLSAgICAgICAgICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLgotICAgICAgICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52Ci0gICAgICAgICAgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1jb21tb24tbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0gICAgICAgICAgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZQotICAgICAgICAgIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuCi0gICAgICAgICAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLSAgICAgICAgICBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItY29tbW9uLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0gICAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLSAgICAgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotICAgICAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1jb21tb24tZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgd2ViCi0gICAgICAgICAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lCi0gICAgICAgICAgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnYtZW50cnkiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTplbnYtZW50cnktbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8eHNkOmtleSBuYW1lPSJ3ZWItY29tbW9uLXJvbGUtbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBBIHJvbGUtbmFtZS1rZXkgaXMgc3BlY2lmaWVkIHRvIGFsbG93IHRoZSByZWZlcmVuY2VzCi0gICAgICAgICAgZnJvbSB0aGUgc2VjdXJpdHktcm9sZS1yZWZzLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpzZWN1cml0eS1yb2xlIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6cm9sZS1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5PgotICAgIDx4c2Q6a2V5cmVmIG5hbWU9IndlYi1jb21tb24tcm9sZS1uYW1lLXJlZmVyZW5jZXMiCi0gICAgICAgICAgICAgICAgcmVmZXI9ImphdmFlZTp3ZWItY29tbW9uLXJvbGUtbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0gICAgICAgICAgc2VjdXJpdHktcm9sZS1yZWYgdG8gYSBzcGVjaWZpZWQgcm9sZS1uYW1lLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpzZXJ2bGV0L2phdmFlZTpzZWN1cml0eS1yb2xlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJvbGUtbGluayIvPgotICAgIDwveHNkOmtleXJlZj4KLSAgPC94c2Q6ZWxlbWVudD4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8xXzEuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8xXzEuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWM4ZTg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi08IS0tCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIDkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDQSAgOTQzMDMsIFUuUy5BLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLVRoaXMgcHJvZHVjdCBvciBkb2N1bWVudCBpcyBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGFuZCBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgaXRzIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBObyBwYXJ0IG9mIHRoaXMgcHJvZHVjdCBvciBkb2N1bWVudGF0aW9uIG1heSBiZQotcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KLW9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LiAgCi0KLVRoaXJkIHBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQgCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuIAotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gTG9nbywgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCBhbmQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsIAotYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYyBpbiB0aGUgVS5TLiAKLWFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUFsbCBTUEFSQyB0cmFkZW1hcmtzIGFyZSB1c2VkIHVuZGVyIGxpY2Vuc2UgYW5kIGFyZSB0cmFkZW1hcmtzCi1vciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU1BBUkMgSW50ZXJuYXRpb25hbCwgSW5jLgotaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4gUHJvZHVjdHMgYmVhcmluZyBTUEFSQwotdHJhZGVtYXJrcyBhcmUgYmFzZWQgdXBvbiBhbiBhcmNoaXRlY3R1cmUgZGV2ZWxvcGVkIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gCi0KLVBvc3RTY3JpcHQgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zLCBJbmMuIAotCi0gCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0byAKLVN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLQotIAotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkKLUlNUExJRUQgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVAotVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0ggRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWQotSU5WQUxJRC4KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCi05MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSAgOTQzMDMsIEV0YXRzLVVuaXMuIAotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLSAKLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJyBhdmVjIAotZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhIGRpc3RyaWJ1dGlvbiwKLWV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQXVjdW5lIHBhcnRpZSBkZSBjZSBwcm9kdWl0IG91IGRlIHNhIGRvY3VtZW50YXRpb24KLWFzc29jaWUnZSBuZSBwZXV0IGVedHJlIHJlcHJvZHVpdGUgc291cyBhdWN1bmUgZm9ybWUsIHBhciBxdWVscXVlIG1veWVuIAotcXVlIGNlIHNvaXQsIHNhbnMgbCdhdXRvcmlzYXRpb24gcHJlJ2FsYWJsZSBldCBlJ2NyaXRlIGRlIFN1biBldCBkZSBzZXMgCi1iYWlsbGV1cnMgZGUgbGljZW5jZSwgcydpbCB5IGVuIGEuICAKLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUgCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IAotZXQgbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLSAKLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgbGUgbG9nbyBTdW4sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEgCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwsIGV0IEVudGVycHJpc2UgSmF2YUJlYW5zLCAgCi1zb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU3VuIAotTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMgcGF5cy4KLSAKLVRvdXRlcyBsZXMgbWFycXVlcyBTUEFSQyBzb250IHV0aWxpc2UnZXMgc291cyBsaWNlbmNlIGV0IHNvbnQKLWRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU1BBUkMKLUludGVybmF0aW9uYWwsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgIGRhbnMKLWQnYXV0cmVzIHBheXMuIExlcyBwcm9kdWl0cyBwb3J0YW50IGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQKLWJhc2UncyBzdXIgdW5lIGFyY2hpdGVjdHVyZSBkZSd2ZWxvcHBlJ2UgcGFyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIAotCi1Qb3N0Y3JpcHQgZXN0IHVuZSBtYXJxdWUgZW5yZWdpc3RyZSdlIGQnQWRvYmUgU3lzdGVtcyBJbmMuIAotIAotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsCi1ERUNMQVJBVElPTlMgRVQgR0FSQU5USUVTIEVYUFJFU1NFUyBPVSBUQUNJVEVTIFNPTlQgRk9STUVMTEVNRU5UIEVYQ0xVRVMsCi1EQU5TIExBIE1FU1VSRSBBVVRPUklTRUUgUEFSIExBIExPSSBBUFBMSUNBQkxFLCBZIENPTVBSSVMgTk9UQU1NRU5UCi1UT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQSBMJ0FQVElUVURFCi1BIFVORSBVVElMSVNBVElPTiBQQVJUSUNVTElFUkUgT1UgQSBMJ0FCU0VOQ0UgREUgQ09OVFJFRkFDT04uCi0tLT4KLQotPCEtLQotCi0gICBUaGlzIGlzIHRoZSBEVEQgZGVmaW5pbmcgdGhlIEphdmFTZXJ2ZXIgUGFnZXMgMS4xIFRhZyBMaWJyYXJ5Ci0gICBkZXNjcmlwdG9yICgudGxkKSAoWE1MKSBmaWxlIGZvcm1hdC9zeW50YXguCi0KLSAgIEEgVGFnIExpYnJhcnkgaXMgYSBKQVIgZmlsZSBjb250YWluaW5nIGEgdmFsaWQgaW5zdGFuY2Ugb2YgYSBUYWcgTGlicmFyeQotICAgRGVzY3JpcHRvciAodGFnbGliLnRsZCkgZmlsZSBpbiB0aGUgTUVUQS1JTkYgc3ViZGlyZWN0b3J5LCBhbG9uZyB3aXRoIHRoZQotICAgYXBwcm9wcmlhdGUgaW1wbGVtZW50aW5nIGNsYXNzZXMsIGFuZCBvdGhlciByZXNvdXJjZXMgcmVxdWlyZWQgdG8KLSAgIGltcGxlbWVudCB0aGUgdGFncyBkZWZpbmVkIHRoZXJlaW4uCi0KLSAgLS0+Ci0KLTwhLS0KLVRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LCBpdCBkZWZpbmVzOgotCi10bGlidmVyc2lvbgl0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KLWpzcHZlcnNpb24JdGhlIHZlcnNpb24gb2YgSlNQIHRoZSB0YWcgbGlicmFyeSBkZXBlbmRzIHVwb24KLQotc2hvcnRuYW1lCWEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkKLQkJYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYSBtbmVtb25pYwotCQl2YWx1ZTsgZm9yIGV4YW1wbGUsIHRoZSBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQKLQkJcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzCi11cmkJCWEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliCi1pbmZvCQlhIHNpbXBsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgInVzZSIgb2YgdGhpcyB0YWdsaWIsCi0JCXNob3VsZCBiZSB1c2VyIGRpc2Nlcm5hYmxlCi0tLT4KLQotPCFFTEVNRU5UIHRhZ2xpYiAodGxpYnZlcnNpb24sIGpzcHZlcnNpb24/LCBzaG9ydG5hbWUsIHVyaT8sIGluZm8/LCB0YWcrKSA+Ci08IUFUVExJU1QgdGFnbGliIGlkIElEICNJTVBMSUVECi0JICB4bWxucyBDREFUQSAjRklYRUQKLQkJImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQiCi0+Ci0KLTwhLS0KLURlc2NyaWJlcyB0aGlzIHZlcnNpb24gKG51bWJlcikgb2YgdGhlIHRhZ2xpYnJhcnkgKGRld2V5IGRlY2ltYWwpCi0KLSNQQ0RBVEEgOjo9IFswLTldKnsgIi4iWzAtOV0gfTAuLjMKLS0tPgotCi08IUVMRU1FTlQgdGxpYnZlcnNpb24gKCNQQ0RBVEEpID4KLQotPCEtLQotRGVzY3JpYmVzIHRoZSBKU1AgdmVyc2lvbiAobnVtYmVyKSB0aGlzIHRhZ2xpYnJhcnkgcmVxdWlyZXMgaW4KLW9yZGVyIHRvIGZ1bmN0aW9uIChkZXdleSBkZWNpbWFsKQotCi1UaGUgZGVmYXVsdCBpcyAxLjEKLQotI1BDREFUQSA6Oj0gWzAtOV0qeyAiLiJbMC05XSB9MC4uMwotLS0+Ci0KLTwhRUxFTUVOVCBqc3B2ZXJzaW9uICAoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIGEgc2hvcnQgKGRlZmF1bHQpIHNob3J0bmFtZSB0byBiZSB1c2VkIGZvciB0YWdzIGFuZAotdmFyaWFibGUgbmFtZXMgdXNlZC9jcmVhdGVkIGJ5IHRoaXMgdGFnIGxpYnJhcnkuICBEbyBub3QgdXNlCi13aGl0ZSBzcGFjZSwgYW5kIGRvIG5vdCBzdGFydCB3aXRoIGRpZ2l0cyBvciB1bmRlcnNjb3JlLgotCi0jUENEQVRBIDo6PSBOTVRPS0VOCi0tLT4KLQotPCFFTEVNRU5UIHNob3J0bmFtZSAgICAgICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgYSBwdWJsaWMgVVJJIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIHZlcnNpb24gb2YKLXRoZSB0YWdsaWJyYXJ5IExlYXZlIGl0IGVtcHR5IGlmIGl0IGRvZXMgbm90IGFwcGx5LgotLS0+Ci0KLTwhRUxFTUVOVCB1cmkJICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgYW4gYXJiaXRyYXJ5IHRleHQgc3RyaW5nIGRlc2NpcmJpbmcgdGhlIHRhZyBsaWJyYXJ5Ci0tLT4KLQotPCFFTEVNRU5UIGluZm8JKCNQQ0RBVEEpID4KLQotPCEtLQotVGhlIHRhZyBkZWZpbmVzIGEgdW5pcXVlIHRhZyBpbiB0aGlzIHRhZyBsaWJyYXJ5LCBkZWZpbmluZzoKLQotLSB0aGUgdW5pcXVlIHRhZy9lbGVtZW50IG5hbWUKLS0gdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcgaW1wbGVtZW50YXRpb24gY2xhc3MKLS0gYW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbwotLSB0aGUgYm9keSBjb250ZW50IHR5cGUgKGhpbnQpCi0tIG9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotLSBhbnkgYXR0cmlidXRlcwotLS0+Ci0KLTwhRUxFTUVOVCB0YWcgKG5hbWUsIHRhZ2NsYXNzLCB0ZWljbGFzcz8sIGJvZHljb250ZW50PywgaW5mbz8sIGF0dHJpYnV0ZSopID4KLQotPCEtLQotRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LlRhZyB0aGF0IGltcGxlbWVudHMKLXRoZSByZXF1ZXN0IHRpbWUgc2VtYW50aWNzIGZvciB0aGlzIHRhZy4gKHJlcXVpcmVkKQotCi0jUENEQVRBIDo6PSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCi0tLT4KLQotPCFFTEVNRU5UIHRhZ2NsYXNzICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8gZm9yCi10aGlzIHRhZy4gKG9wdGlvbmFsKQotCi1JZiB0aGlzIGlzIG5vdCBnaXZlbiwgdGhlIGNsYXNzIGlzIG5vdCBjb25zdWx0ZWQgYXQgdHJhbnNsYXRpb24gdGltZS4KLQotI1BDREFUQSA6Oj0gZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQotLS0+Ci0KLTwhRUxFTUVOVCB0ZWljbGFzcyAoI1BDREFUQSkgPgotCi08IS0tCi1Qcm92aWRlcyBhIGhpbnQgYXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJvZHkgb2YgdGhpcyB0YWcuIFByaW1hcmlseQotaW50ZW5kZWQgZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLgotCi1UaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHZhbHVlcyBzcGVjaWZpZWQ6Ci0KLXRhZ2RlcGVuZGVudAlUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcKLQkJaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkgaW4gYQotCQlkaWZmZXJlbnQgImxhbmdhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMIHN0YXRlbWVudHMuCi0KLUpTUAkJVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQIHN5bnRheAotCi1lbXB0eQkJVGhlIGJvZHkgbXVzdCBiZSBlbXB0eQotCi1UaGUgZGVmYXVsdCAoaWYgbm90IGRlZmluZWQpIGlzIEpTUAotCi0jUENEQVRBIDo6PSAgdGFnZGVwZW5kZW50IHwgSlNQIHwgZW1wdHkKLQotLS0+Ci0KLTwhRUxFTUVOVCBib2R5Y29udGVudCAoI1BDREFUQSkgPgotCi08IS0tCi1UaGUgYXR0cmlidXRlIHRhZyBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcgdGFnCi0KLUFuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGlzIGNvbXBvc2VkIG9mOgotCi0tIHRoZSBhdHRyaWJ1dGVzIG5hbWUgKHJlcXVpcmVkKQotLSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsIChvcHRpb25hbCkKLS0gaWYgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgYXQgcnVudGltZQotICBieSBhIHNjcmlwdGxldCBleHByZXNzaW9uIChvcHRpb25hbCkKLQotLS0+Ci0KLTwhRUxFTUVOVCBhdHRyaWJ1dGUgKG5hbWUsIHJlcXVpcmVkPyAsIHJ0ZXhwcnZhbHVlPykgPgotCi08IS0tCi1EZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcgZGVmaW5lZAotCi0jUENEQVRBIDo6PSBOTVRPS0VOCi0tLT4KLQotPCFFTEVNRU5UIG5hbWUJKCNQQ0RBVEEpID4KLQotPCEtLQotRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwuCi0KLSNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCi0KLUlmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKLWlzIG9wdGlvbmFsLgotLS0+Ci0KLTwhRUxFTUVOVCByZXF1aXJlZCAgICAoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQgZXhwcmVzc2lvbnMgYXMKLWEgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZAotYXQgcmVxdWVzdCB0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24KLXRpbWUuCi0KLSNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCi0KLUlmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKLWhhcyBhIHN0YXRpYyB2YWx1ZQotLS0+Ci0KLTwhRUxFTUVOVCBydGV4cHJ2YWx1ZSAoI1BDREFUQSkgPgotCi08IUFUVExJU1QgdGxpYnZlcnNpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QganNwdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzaG9ydG5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdXJpIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGluZm8gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZ2NsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRlaWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGJvZHljb250ZW50IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBuYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcXVpcmVkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJ0ZXhwcnZhbHVlIGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDJlYjVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0KLTwhLS0KLSAgIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zLgotICAtLT4KLQotPCEtLQotCi0gICBUaGlzIGlzIHRoZSBEVEQgZGVmaW5pbmcgdGhlIEphdmFTZXJ2ZXIgUGFnZXMgMS4yIFRhZyBMaWJyYXJ5Ci0gICBkZXNjcmlwdG9yICgudGxkKSAoWE1MKSBmaWxlIGZvcm1hdC9zeW50YXguCi0KLSAgIEEgVGFnIExpYnJhcnkgaXMgYSBKQVIgZmlsZSBjb250YWluaW5nIGEgdmFsaWQgaW5zdGFuY2Ugb2YgYSBUYWcgTGlicmFyeQotICAgRGVzY3JpcHRvciAodGFnbGliLnRsZCkgZmlsZSBpbiB0aGUgTUVUQS1JTkYgc3ViZGlyZWN0b3J5LCBhbG9uZyB3aXRoIHRoZQotICAgYXBwcm9wcmlhdGUgaW1wbGVtZW50aW5nIGNsYXNzZXMsIGFuZCBvdGhlciByZXNvdXJjZXMgcmVxdWlyZWQgdG8KLSAgIGltcGxlbWVudCB0aGUgdGFncyBkZWZpbmVkIHRoZXJlaW4uCi0KLSAgIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCi0gIC0tPgotICAKLTwhTk9UQVRJT04gV0VCLUpTUFRBR0xJQi4xXzIgUFVCTElDCi0gICAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4yLy9FTiI+Ci0KLTwhLS0KLVRoaXMgaXMgdGhlIFhNTCBEVEQgZm9yIHRoZSBKU1AgMS4yIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IuCi1BbGwgSlNQIDEuMiB0YWcgbGlicmFyeSBkZXNjcmlwdG9ycyBtdXN0IGluY2x1ZGUgYSBET0NUWVBFCi1vZiB0aGUgZm9sbG93aW5nIGZvcm06Ci0KLSAgPCFET0NUWVBFIHRhZ2xpYgotICAgICAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4yLy9FTiIKLQkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCI+Ci0KLS0tPgotCi08IS0tCi1UaGUgdGFnbGliIHRhZyBpcyB0aGUgZG9jdW1lbnQgcm9vdCwgaXQgZGVmaW5lczoKLQotdGxpYi12ZXJzaW9uCXRoZSB2ZXJzaW9uIG9mIHRoZSB0YWcgbGlicmFyeSBpbXBsZW1lbnRhdGlvbgotCi1qc3AtdmVyc2lvbgl0aGUgdmVyc2lvbiBvZiBKU1AgdGhlIHRhZyBsaWJyYXJ5IGRlcGVuZHMgdXBvbgotCi1zaG9ydC1uYW1lCWEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkKLQkJYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYSBtbmVtb25pYwotCQl2YWx1ZTsgZm9yIGV4YW1wbGUsIHRoZSBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQKLQkJcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzCi0KLXVyaQkJYSB1cmkgdW5pcXVlbHkgaWRlbnRpZnlpbmcgdGhpcyB0YWdsaWIKLQotZGlzcGxheS1uYW1lICAgIHRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdAotICAgICAgICAgICAgICAgIGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBieSB0b29scwotc21hbGwtaWNvbiAgICAgIG9wdGlvbmFsIHNtYWxsLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCi1sYXJnZS1pY29uICAgICAgb3B0aW9uYWwgbGFyZ2UtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0KLWRlc2NyaXB0aW9uCWEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzIHRhZ2xpYiwKLQkJc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUKLQotdmFsaWRhdG9yICAgICAgIG9wdGlvbmFsIFRhZ0xpYnJhcnlWYWxpZGF0b3IgaW5mb3JtYXRpb24KLQotbGlzdGVuZXIgICAgICAgIG9wdGlvbmFsIGV2ZW50IGxpc3RlbmVyIHNwZWNpZmljYXRpb24KLQotCi0tLT4KLQotPCFFTEVNRU5UIHRhZ2xpYiAodGxpYi12ZXJzaW9uLCBqc3AtdmVyc2lvbiwgc2hvcnQtbmFtZSwgdXJpPywKLSAgICAgICAgICAgICAgICAgIGRpc3BsYXktbmFtZT8sIHNtYWxsLWljb24/LCBsYXJnZS1pY29uPywgZGVzY3JpcHRpb24/LAotICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yPywgbGlzdGVuZXIqLCB0YWcrKSA+Ci0KLTwhQVRUTElTVCB0YWdsaWIgaWQgSUQgI0lNUExJRUQKLQkgIHhtbG5zIENEQVRBICNGSVhFRAotCQkiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvVGFnTGlicmFyeURlc2NyaXB0b3IiCi0+Ci0KLTwhLS0KLURlc2NyaWJlcyB0aGlzIHZlcnNpb24gKG51bWJlcikgb2YgdGhlIHRhZ2xpYnJhcnkgKGRld2V5IGRlY2ltYWwpCi0KLSNQQ0RBVEEgOjo9IFswLTldKnsgIi4iWzAtOV0gfTAuLjMKLS0tPgotCi08IUVMRU1FTlQgdGxpYi12ZXJzaW9uICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlc2NyaWJlcyB0aGUgSlNQIHZlcnNpb24gKG51bWJlcikgdGhpcyB0YWdsaWJyYXJ5IHJlcXVpcmVzIGluCi1vcmRlciB0byBmdW5jdGlvbiAoZGV3ZXkgZGVjaW1hbCkKLQotVGhlIGRlZmF1bHQgaXMgMS4yCi0KLSNQQ0RBVEEgOjo9IFswLTldKnsgIi4iWzAtOV0gfTAuLjMKLS0tPgotCi08IUVMRU1FTlQganNwLXZlcnNpb24gICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgYSBzaG9ydCAoZGVmYXVsdCkgc2hvcnQtbmFtZSB0byBiZSB1c2VkIGZvciB0YWdzIGFuZAotdmFyaWFibGUgbmFtZXMgdXNlZC9jcmVhdGVkIGJ5IHRoaXMgdGFnIGxpYnJhcnkuICBEbyBub3QgdXNlCi13aGl0ZSBzcGFjZSwgYW5kIGRvIG5vdCBzdGFydCB3aXRoIGRpZ2l0cyBvciB1bmRlcnNjb3JlLgotCi0jUENEQVRBIDo6PSBOTVRPS0VOCi0tLT4KLQotPCFFTEVNRU5UIHNob3J0LW5hbWUgICAgICAoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIGEgcHVibGljIFVSSSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyB2ZXJzaW9uIG9mCi10aGUgdGFnbGlicmFyeS4gIExlYXZlIGl0IGVtcHR5IGlmIGl0IGRvZXMgbm90IGFwcGx5LgotLS0+Ci0KLTwhRUxFTUVOVCB1cmkJICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgYW4gYXJiaXRyYXJ5IHRleHQgc3RyaW5nIGRlc2NpcmJpbmcgdGhlIHRhZyBsaWJyYXJ5Ci0tLT4KLQotPCFFTEVNRU5UIGRlc2NyaXB0aW9uCSgjUENEQVRBKSA+Ci0KLTwhLS0KLQotRGVmaW5lcyBhbiBvcHRpb25hbCB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0bwotdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4KLS0tPgotCi08IUVMRU1FTlQgdmFsaWRhdG9yICh2YWxpZGF0b3ItY2xhc3MsIGluaXQtcGFyYW0qLCBkZXNjcmlwdGlvbj8pID4KLQotCi08IS0tCi0KLURlZmluZXMgdGhlIFRhZ0xpYnJhcnlWYWxpZGF0b3IgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0bwotdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4KLS0tPgotCi08IUVMRU1FTlQgdmFsaWRhdG9yLWNsYXNzICgjUENEQVRBKSA+Ci0KLQotPCEtLQotCi1UaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzIGFuCi1pbml0aWFsaXphdGlvbiBwYXJhbQotLS0+Ci0KLTwhRUxFTUVOVCBpbml0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4KLQotPCEtLQotCi1UaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLgotLS0+Ci0KLTwhRUxFTUVOVCBwYXJhbS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuCi0tLT4KLQotPCFFTEVNRU5UIHBhcmFtLXZhbHVlICgjUENEQVRBKT4KLQotCi08IS0tCi0KLURlZmluZXMgYW4gb3B0aW9uYWwgZXZlbnQgbGlzdGVuZXIgb2JqZWN0IHRvIGJlIGluc3RhbnRpYXRlZCBhbmQKLXJlZ2lzdGVyZWQgYXV0b21hdGljYWxseS4KLS0tPgotCi08IUVMRU1FTlQgbGlzdGVuZXIgKGxpc3RlbmVyLWNsYXNzKSA+Ci0KLTwhLS0KLQotVGhlIGxpc3RlbmVyLWNsYXNzIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gdGhhdAotbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uICBTZWUgdGhlCi1TZXJ2bGV0IDIuMyBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgotLS0+Ci0KLTwhRUxFTUVOVCBsaXN0ZW5lci1jbGFzcyAoI1BDREFUQSkgPgotCi0KLTwhLS0KLVRoZSB0YWcgZGVmaW5lcyBhIHVuaXF1ZSB0YWcgaW4gdGhpcyB0YWcgbGlicmFyeS4gIEl0IGhhcyBvbmUKLWF0dHJpYnV0ZSwgaWQuCi0KLVRoZSB0YWcgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgotCi1uYW1lICAgICAgICAgICAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCi0KLXRhZy1jbGFzcyAgICAgICAgIFRoZSB0YWcgaGFuZGxlciBjbGFzcyBpbXBsZW1lbnRpbmcKLSAgICAgICAgICAgICAgICAgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcKLQotdGVpLWNsYXNzICAgICAgICAgQW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YKLSAgICAgICAgICAgICAgICAgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KLQotYm9keS1jb250ZW50ICAgICAgVGhlIGJvZHkgY29udGVudCB0eXBlCi0KLWRpc3BsYXktbmFtZSAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZAotICAgICAgICAgICAgICAgICAgYnkgdG9vbHMKLQotc21hbGwtaWNvbiAgICAgICAgT3B0aW9uYWwgc21hbGwtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0KLWxhcmdlLWljb24gICAgICAgIE9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCi1kZXNjcmlwdGlvbiAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLQotdmFyaWFibGUgICAgICAgICAgT3B0aW9uYWwgc2NyaXB0aW5nIHZhcmlhYmxlIGluZm9ybWF0aW9uCi0KLWF0dHJpYnV0ZSAgICAgICAgIEFsbCBhdHRyaWJ1dGVzIG9mIHRoaXMgYWN0aW9uCi0KLWV4YW1wbGUgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuIGV4YW1wbGUgb2YgYQotICAgICAgICAgICAgICAgICAgdXNlIG9mIHRoaXMgdGFnCi0KLS0tPgotCi08IUVMRU1FTlQgdGFnIChuYW1lLCB0YWctY2xhc3MsIHRlaS1jbGFzcz8sIGJvZHktY29udGVudD8sIGRpc3BsYXktbmFtZT8sCi0gICAgICAgICAgICAgICBzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8sIGRlc2NyaXB0aW9uPywgdmFyaWFibGUqLCBhdHRyaWJ1dGUqLAotICAgICAgICAgICAgICAgZXhhbXBsZT8pID4KLQotPCEtLQotRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LlRhZyB0aGF0IGltcGxlbWVudHMKLXRoZSByZXF1ZXN0IHRpbWUgc2VtYW50aWNzIGZvciB0aGlzIHRhZy4gKHJlcXVpcmVkKQotCi0jUENEQVRBIDo6PSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCi0tLT4KLQotPCFFTEVNRU5UIHRhZy1jbGFzcyAoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvIGZvcgotdGhpcyB0YWcuIChvcHRpb25hbCkKLQotSWYgdGhpcyBpcyBub3QgZ2l2ZW4sIHRoZSBjbGFzcyBpcyBub3QgY29uc3VsdGVkIGF0IHRyYW5zbGF0aW9uIHRpbWUuCi0KLSNQQ0RBVEEgOjo9IGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKLS0tPgotCi08IUVMRU1FTlQgdGVpLWNsYXNzICgjUENEQVRBKSA+Ci0KLTwhLS0KLVByb3ZpZGVzIGEgaGludCBhcyB0byB0aGUgY29udGVudCBvZiB0aGUgYm9keSBvZiB0aGlzIHRhZy4gUHJpbWFyaWx5Ci1pbnRlbmRlZCBmb3IgdXNlIGJ5IHBhZ2UgY29tcG9zaXRpb24gdG9vbHMuCi0KLVRoZXJlIGFyZSBjdXJyZW50bHkgdGhyZWUgdmFsdWVzIHNwZWNpZmllZDoKLQotdGFnZGVwZW5kZW50CVRoZSBib2R5IG9mIHRoZSB0YWcgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIHRhZwotCQlpbXBsZW1lbnRhdGlvbiBpdHNlbGYsIGFuZCBpcyBtb3N0IGxpa2VseSBpbiBhCi0JCWRpZmZlcmVudCAibGFuZ2FnZSIsIGUuZyBlbWJlZGRlZCBTUUwgc3RhdGVtZW50cy4KLQotSlNQCQlUaGUgYm9keSBvZiB0aGUgdGFnIGNvbnRhaW5zIG5lc3RlZCBKU1Agc3ludGF4Ci0KLWVtcHR5CQlUaGUgYm9keSBtdXN0IGJlIGVtcHR5Ci0KLVRoZSBkZWZhdWx0IChpZiBub3QgZGVmaW5lZCkgaXMgSlNQCi0KLSNQQ0RBVEEgOjo9ICB0YWdkZXBlbmRlbnQgfCBKU1AgfCBlbXB0eQotCi0tLT4KLQotPCFFTEVNRU5UIGJvZHktY29udGVudCAoI1BDREFUQSkgPgotCi08IS0tCi0KLVRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZAotdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLgotLS0+Ci0KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpID4KLQotCi08IS0tCi0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBsYXJnZQotKDMyIHggMzIpIGljb24gaW1hZ2UuICBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlCi10YWcgbGlicmFyeS4gIFRoZSBpbWFnZSBtdXN0IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LCBhbmQKLXRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgd2l0aCB0aGUgc3VmZml4ICIuanBnIiBvciAiLmdpZiIgcmVzcGVjdGl2ZWx5LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0tLT4KLQotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpID4KLQotPCEtLQotCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgbGFyZ2UKLSgzMiB4IDMyKSBpY29uIGltYWdlLiAgVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZQotdGFnIGxpYnJhcnkuICBUaGUgaW1hZ2UgbXVzdCBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdCwgYW5kCi10aGUgZmlsZSBuYW1lIG11c3QgZW5kIHdpdGggdGhlIHN1ZmZpeCAiLmpwZyIgb3IgIi5naWYiIHJlc3BlY3RpdmVseS4KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotLS0+Ci0KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKSA+Ci0KLTwhLS0KLQotVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlCi1vZiB0aGUgdXNlIG9mIGEgdGFnLgotLS0+Ci0KLTwhRUxFTUVOVCBleGFtcGxlICgjUENEQVRBKSA+Ci0KLTwhLS0KLQotVGhlIHZhcmlhYmxlIHRhZyBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlcwotZGVmaW5lZCBieSB0aGlzIHRhZy4gIEl0IGlzIGEgKHRyYW5zbGF0aW9uIHRpbWUpIGVycm9yIGZvciBhIHRhZwotdGhhdCBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUgc3ViZWxlbWVudHMgdG8gaGF2ZSBhIFRhZ0V4dHJhSW5mbwotY2xhc3MgdGhhdCByZXR1cm5zIGEgbm9uLW51bGwgb2JqZWN0LgotCi1UaGUgc3ViZWxlbWVudHMgb2YgdmFyaWFibGUgYXJlIG9mIHRoZSBmb3JtOgotCi1uYW1lLWdpdmVuICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIG5hbWUgYXMgYSBjb25zdGFudAotCi1uYW1lLWZyb20tYXR0cmlidXRlICAgICAgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlICh0cmFuc2xhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUpIHZhbHVlIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4gIE9uZSBvZiBuYW1lLWdpdmVuIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS1mcm9tLWF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KLQotdmFyaWFibGUtY2xhc3MgICAgICAgICAgIE5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSB2YXJpYWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGlzIGRlZmF1bHQuCi0KLWRlY2xhcmUgICAgICAgICAgICAgICAgICBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBkZWNsYXJlZCBvciBub3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSBpcyB0aGUgZGVmYXVsdC4KLQotc2NvcGUgICAgICAgICAgICAgICAgICAgIFRoZSBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmFpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZC4gIE5FU1RFRCBpcyBkZWZhdWx0LgotCi1kZXNjcmlwdGlvbiAgICAgICAgICAgICAgT3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhpcyB2YXJpYWJsZQotCi0tLT4KLQotPCFFTEVNRU5UIHZhcmlhYmxlICggKG5hbWUtZ2l2ZW4gfCBuYW1lLWZyb20tYXR0cmlidXRlKSwgdmFyaWFibGUtY2xhc3M/LAotICAgICAgICAgICAgICAgICAgICBkZWNsYXJlPywgc2NvcGU/LCBkZXNjcmlwdGlvbj8pID4KLQotPCEtLQotCi1UaGUgbmFtZSBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4gIE9uZSBvZiBuYW1lLWdpdmVuIG9yCi1uYW1lLWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLgotLS0+Ci0KLTwhRUxFTUVOVCBuYW1lLWdpdmVuICgjUENEQVRBKSA+Ci0KLTwhLS0KLQotVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlICh0cmFuc2xhdGlvbi10aW1lKSB2YWx1ZSB3aWxsIGdpdmUKLXRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4gIE9uZSBvZiBuYW1lLWdpdmVuIG9yIG5hbWUtZnJvbS1hdHRyaWJ1dGUKLWlzIHJlcXVpcmVkLgotLS0+Ci0KLTwhRUxFTUVOVCBuYW1lLWZyb20tYXR0cmlidXRlICgjUENEQVRBKSA+Ci0KLTwhLS0KLQotVGhlIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGNsYXNzIGZvciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLiAgVGhlCi1kZWZhdWx0IGlzIGphdmEubGFuZy5TdHJpbmcuCi0tLT4KLQotPCFFTEVNRU5UIHZhcmlhYmxlLWNsYXNzICgjUENEQVRBKSA+Ci0KLTwhLS0KLQotV2hldGhlciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHRvIGJlIGRlZmluZWQgb3Igbm90LiAgU2VlCi1UYWdFeHRyYUluZm8gZm9yIGRldGFpbHMuICBUaGlzIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kICJ0cnVlIgotaXMgdGhlIGRlZmF1bHQuCi0tLT4KLQotPCFFTEVNRU5UIGRlY2xhcmUgKCNQQ0RBVEEpID4KLQotPCEtLQotCi1UaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4gIFNlZSBUYWdFeHRyYUluZm8gZm9yIGRldGFpbHMuCi1UaGUgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgIk5FU1RFRCIgaXMgdGhlIGRlZmF1bHQuICBPdGhlciBsZWdhbAotdmFsdWVzIGFyZSAiQVRfQkVHSU4iIGFuZCAiQVRfRU5EIi4KLS0tPgotCi08IUVMRU1FTlQgc2NvcGUgKCNQQ0RBVEEpID4KLQotPCEtLQotCi1UaGUgYXR0cmlidXRlIHRhZyBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcgdGFnCi0KLUFuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGlzIGNvbXBvc2VkIG9mOgotCQotLSB0aGUgYXR0cmlidXRlcyBuYW1lIChyZXF1aXJlZCkKLS0gaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbCAob3B0aW9uYWwpCi0tIGlmIHRoZSBhdHRyaWJ1dGVzIHZhbHVlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkIGF0IHJ1bnRpbWUKLSAgYnkgYSBzY3JpcHRsZXQgZXhwcmVzc2lvbiAob3B0aW9uYWwpCi0tIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzIHZhbHVlIChvcHRpb25hbCkKLS0gYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIG1lYW5pbmcgb2YgdGhlIGF0dHJpYnV0ZSAob3B0aW9uYWwpCi0KLS0tPgotCi0KLTwhLS0KLVRoZSBhdHRyaWJ1dGUgdGFnIGRlZmluZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbmVzdGluZyB0YWcKLQotQW4gYXR0cmlidXRlIGRlZmluaXRpb24gaXMgY29tcG9zZWQgb2Y6Ci0KLS0gdGhlIGF0dHJpYnV0ZXMgbmFtZSAocmVxdWlyZWQpCi0KLS0gaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbCAob3B0aW9uYWwpCi0KLS0gaWYgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgYXQgcnVudGltZQotICBieSBhIHNjcmlwdGxldCBleHByZXNzaW9uIChvcHRpb25hbCkKLQotLSB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZSAob3B0aW9uYWwpCi0KLS0gYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIG1lYW5pbmcgb2YgdGhlIGF0dHJpYnV0ZSAob3B0aW9uYWwpCi0tLT4KLQotPCFFTEVNRU5UIGF0dHJpYnV0ZSAobmFtZSwgcmVxdWlyZWQ/ICwgcnRleHBydmFsdWU/LCB0eXBlPywgZGVzY3JpcHRpb24/KSA+Ci0KLTwhLS0KLURlZmluZXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgdGFnIG9yIGF0dHJpYnV0ZSBiZWluZyBkZWZpbmVkCi0KLSNQQ0RBVEEgOjo9IE5NVE9LRU4KLS0tPgotCi08IUVMRU1FTlQgbmFtZQkoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbC4KLQotI1BDREFUQSA6Oj0gdHJ1ZSB8IGZhbHNlIHwgeWVzIHwgbm8KLQotSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUgdGhlIGF0dHJpYnV0ZQotaXMgb3B0aW9uYWwuCi0tLT4KLQotPCFFTEVNRU5UIHJlcXVpcmVkICAgICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGNhbiBoYXZlIHNjcmlwdGxldCBleHByZXNzaW9ucyBhcwotYSB2YWx1ZSwgaS5lIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkCi1hdCByZXF1ZXN0IHRpbWUsIGFzIG9wcG9zZWQgdG8gYSBzdGF0aWMgdmFsdWUgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbgotdGltZS4KLQotI1BDREFUQSA6Oj0gdHJ1ZSB8IGZhbHNlIHwgeWVzIHwgbm8KLQotSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUgdGhlIGF0dHJpYnV0ZQotaGFzIGEgc3RhdGljIHZhbHVlCi0tLT4KLQotPCFFTEVNRU5UIHJ0ZXhwcnZhbHVlICgjUENEQVRBKSA+Ci0KLQotPCEtLQotCi1EZWZpbmVzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUuICBGb3Igc3RhdGljIHZhbHVlcwotKHRob3NlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24gdGltZSkgdGhlIHR5cGUgaXMgYWx3YXlzCi1qYXZhLmxhbmcuU3RyaW5nLgotLS0+Ci0KLTwhRUxFTUVOVCB0eXBlICgjUENEQVRBKSA+Ci0KLQotPCEtLSBJRCBhdHRyaWJ1dGVzIC0tPgotCi08IUFUVExJU1QgdGxpYi12ZXJzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGpzcC12ZXJzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNob3J0LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdXJpIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGV4YW1wbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZy1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0ZWktY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYm9keS1jb250ZW50IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBuYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcXVpcmVkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJ0ZXhwcnZhbHVlIGlkIElEICNJTVBMSUVEPgotCi0KLTwhQVRUTElTVCBwYXJhbS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHBhcmFtLXZhbHVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpc3RlbmVyIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpc3RlbmVyLWNsYXNzIGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjU4NjQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEKLSAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMi4wIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKXdlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2RzCTEuMzYgMDgvMTgvMDMKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotICAgICAgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgVGFnbGlicmFyeQotCWRlc2NyaXB0b3IuICBBbGwgVGFnbGlicmFyeSBkZXNjcmlwdG9ycyBtdXN0Ci0JaW5kaWNhdGUgdGhlIHRhZyBsaWJyYXJ5IHNjaGVtYSBieSB1c2luZyB0aGUgVGFnbGlicmFyeQotCW5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDx0YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKLQkgICAgICB2ZXJzaW9uPSIyLjAiPgotCSAgICAgIC4uLgotCSAgICA8L3RhZ2xpYj4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQKLQl2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgdXNpbmcgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQotCWZvciBKMkVFIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliIiB0eXBlPSJqMmVlOnRsZFRhZ2xpYlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LgotCVRoZSBkZWZpbml0aW9uIG9mIHRhZ2xpYiBpcyBwcm92aWRlZAotCWJ5IHRoZSB0bGRUYWdsaWJUeXBlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0idGFnLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgdGFnbGliIGVsZW1lbnQgY29udGFpbnMsIGFtb25nIG90aGVyIHRoaW5ncywgdGFnIGFuZAotCSAgdGFnLWZpbGUgZWxlbWVudHMuCi0JICBUaGUgbmFtZSBzdWJlbGVtZW50cyBvZiB0aGVzZSBlbGVtZW50cyBtdXN0IGVhY2ggYmUgdW5pcXVlLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnRhZ3xqMmVlOnRhZy1maWxlIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmdW5jdGlvbi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHRhZ2xpYiBlbGVtZW50IGNvbnRhaW5zIGZ1bmN0aW9uIGVsZW1lbnRzLgotCSAgVGhlIG5hbWUgc3ViZWxlbWVudHMgb2YgdGhlc2UgZWxlbWVudHMgbXVzdCBlYWNoIGJlIHVuaXF1ZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpmdW5jdGlvbiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpuYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gIDwveHNkOmVsZW1lbnQ+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYm9keS1jb250ZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBib2R5IHRoYXQgaXMgdmFsaWQgZm9yIGEgdGFnLgotCVRoaXMgdmFsdWUgaXMgdXNlZCBieSB0aGUgSlNQIGNvbnRhaW5lciB0byB2YWxpZGF0ZQotCXRoYXQgYSB0YWcgaW52b2NhdGlvbiBoYXMgdGhlIGNvcnJlY3QgYm9keSBzeW50YXggYW5kCi0JYnkgcGFnZSBjb21wb3NpdGlvbiB0b29scyB0byBhc3Npc3QgdGhlIHBhZ2UgYXV0aG9yCi0JaW4gcHJvdmlkaW5nIGEgdmFsaWQgdGFnIGJvZHkuCi0KLQlUaGVyZSBhcmUgY3VycmVudGx5IGZvdXIgdmFsdWVzIHNwZWNpZmllZDoKLQotCXRhZ2RlcGVuZGVudCAgICBUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcKLQkJCWltcGxlbWVudGF0aW9uIGl0c2VsZiwgYW5kIGlzIG1vc3QgbGlrZWx5Ci0JCQlpbiBhIGRpZmZlcmVudCAibGFuZ3VhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMCi0JCQlzdGF0ZW1lbnRzLgotCi0JSlNQICAgICAgICAgICAgIFRoZSBib2R5IG9mIHRoZSB0YWcgY29udGFpbnMgbmVzdGVkIEpTUAotCQkJc3ludGF4LgotCi0JZW1wdHkgICAgICAgICAgIFRoZSBib2R5IG11c3QgYmUgZW1wdHkKLQotCXNjcmlwdGxlc3MgICAgICBUaGUgYm9keSBhY2NlcHRzIG9ubHkgdGVtcGxhdGUgdGV4dCwgRUwKLQkJCUV4cHJlc3Npb25zLCBhbmQgSlNQIGFjdGlvbiBlbGVtZW50cy4gIE5vCi0JCQlzY3JpcHRpbmcgZWxlbWVudHMgYXJlIGFsbG93ZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRhZ2RlcGVuZGVudCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpTUCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVtcHR5Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2NyaXB0bGVzcyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4dGVuc2libGVUeXBlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGV4dGVuc2libGVUeXBlIGlzIGFuIGFic3RyYWN0IGJhc2UgdHlwZSB0aGF0IGlzIHVzZWQgdG8KLQlkZWZpbmUgdGhlIHR5cGUgb2YgZXh0ZW5zaW9uLWVsZW1lbnRzLiBJbnN0YW5jZSBkb2N1bWVudHMKLQltdXN0IHN1YnN0aXR1dGUgYSBrbm93biB0eXBlIHRvIGRlZmluZSB0aGUgZXh0ZW5zaW9uIGJ5Ci0JdXNpbmcgeHNpOnR5cGUgYXR0cmlidXRlIHRvIGRlZmluZSB0aGUgYWN0dWFsIHR5cGUgb2YKLQlleHRlbnNpb24tZWxlbWVudHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdW5jdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBmdW5jdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBlYWNoCi0JZnVuY3Rpb24gaW4gdGhlIHRhZyBsaWJyYXJ5IHRoYXQgaXMgdG8gYmUgZXhwb3NlZCB0byB0aGUgRUwuCi0KLQlUaGUgZnVuY3Rpb24gZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgotCi0JZGVzY3JpcHRpb24gICAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLQotCWRpc3BsYXktbmFtZSAgICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLQkJCSAgICBkaXNwbGF5ZWQgYnkgdG9vbHMKLQotCWljb24gICAgICAgICAgICAgICAgT3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQKLQkJCSAgICBieSB0b29scwotCi0JbmFtZSAgICAgICAgICAgICAgICBBIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uCi0KLQlmdW5jdGlvbi1jbGFzcyAgICAgIFByb3ZpZGVzIHRoZSBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQKLQkJCSAgICBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbgotCi0JZnVuY3Rpb24tc2lnbmF0dXJlICBQcm92aWRlcyB0aGUgc2lnbmF0dXJlLCBhcyBpbiB0aGUgSmF2YQotCQkJICAgIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIG9mIHRoZSBKYXZhCi0JCQkgICAgbWV0aG9kIHRoYXQgaXMgdG8gYmUgdXNlZCB0byBpbXBsZW1lbnQKLQkJCSAgICB0aGUgZnVuY3Rpb24uCi0KLQlleGFtcGxlICAgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuCi0JCQkgICAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIGZ1bmN0aW9uCi0KLQlmdW5jdGlvbi1leHRlbnNpb24gIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQotCQkJICAgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZnVuY3Rpb24sIGZvciB0b29sCi0JCQkgICAgY29uc3VtcHRpb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotCQkgICB0eXBlPSJqMmVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBBIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBQcm92aWRlcyB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEphdmEKLQkgICAgY2xhc3MgY29udGFpbmluZyB0aGUgc3RhdGljIG1ldGhvZCB0aGF0IGltcGxlbWVudHMKLQkgICAgdGhlIGZ1bmN0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tc2lnbmF0dXJlIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIG9mIHRoZSBzdGF0aWMgSmF2YSBtZXRob2QgdGhhdCBpcwotCSAgICB0byBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb24uICBUaGUgc3ludGF4IG9mIHRoZQotCSAgICBmdW5jdGlvbi1zaWduYXR1cmUgZWxlbWVudCBpcyBhcyBmb2xsb3dzOgotCi0JCUZ1bmN0aW9uU2lnbmF0dXJlIDo6PSBSZXR1cm5UeXBlIFMgTWV0aG9kTmFtZSBTPwotCQkJCSAgICAgICcoJyBTPyBQYXJhbWV0ZXJzPyBTPyAnKScKLQotICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgICAgIDo6PSBUeXBlCi0KLQkJTWV0aG9kTmFtZSAgICAgICAgOjo9IElkZW50aWZpZXIKLQotCQlQYXJhbWV0ZXJzICAgICAgICA6Oj0gICBQYXJhbWV0ZXIKLQkJCQkgICAgICB8ICggUGFyYW1ldGVyIFM/ICcsJyBTPyBQYXJhbWV0ZXJzICkKLQotICAgICAgICAgICAgICAgIFBhcmFtZXRlciAgICAgICAgIDo6PSBUeXBlCi0KLQkJV2hlcmU6Ci0KLSAJCSAgICAqIFR5cGUgaXMgYSBiYXNpYyB0eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQotCQkgICAgICAoaW5jbHVkaW5nIHBhY2thZ2UgbmFtZSksIGFzIHBlciB0aGUgJ1R5cGUnIHByb2R1Y3Rpb24KLQkJICAgICAgaW4gdGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgU2Vjb25kIEVkaXRpb24sCi0JCSAgICAgIENoYXB0ZXIgMTguCi0KLSAgICAgICAgICAgICAgICAgICAgKiBJZGVudGlmaWVyIGlzIGEgSmF2YSBpZGVudGlmaWVyLCBhcyBwZXIgdGhlICdJZGVudGlmaWVyJwotCQkgICAgICBwcm9kdWN0aW9uIGluIHRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFNlY29uZAotCQkgICAgICBFZGl0aW9uLCBDaGFwdGVyIDE4LgotCi0JICAgIEV4YW1wbGU6Ci0KLQkgICAgamF2YS5sYW5nLlN0cmluZyBuaWNrTmFtZSggamF2YS5sYW5nLlN0cmluZywgaW50ICkKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4YW1wbGUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbgotCSAgICBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLWV4dGVuc2lvbiIKLQkJICAgdHlwZT0iajJlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIEZ1bmN0aW9uIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdCBhZmZlY3QKLQkgICAgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhZ0ZpbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWZpbmVzIGFuIGFjdGlvbiBpbiB0aGlzIHRhZyBsaWJyYXJ5IHRoYXQgaXMgaW1wbGVtZW50ZWQKLQlhcyBhIC50YWcgZmlsZS4KLQotCVRoZSB0YWctZmlsZSBlbGVtZW50IGhhcyB0d28gcmVxdWlyZWQgc3ViZWxlbWVudHM6Ci0KLQlkZXNjcmlwdGlvbiAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLQotCWRpc3BsYXktbmFtZSAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi0JCQkgIGRpc3BsYXllZCBieSB0b29scwotCi0JaWNvbiAgICAgICAgICAgICAgT3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQKLQkJCSAgYnkgdG9vbHMKLQotCW5hbWUgICAgICAgICAgICAgIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUKLQotCXBhdGggICAgICAgICAgICAgIFdoZXJlIHRvIGZpbmQgdGhlIC50YWcgZmlsZSBpbXBsZW1lbnRpbmcgdGhpcwotCQkJICBhY3Rpb24sIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIKLQkJCSAgYXBwbGljYXRpb24gb3IgdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlIGZvciBhCi0JCQkgIHRhZyBsaWJyYXJ5IHBhY2thZ2VkIGluIGEgSkFSLiAgVGhpcyBtdXN0Ci0JCQkgIGJlZ2luIHdpdGggL1dFQi1JTkYvdGFncyBpZiB0aGUgLnRhZyBmaWxlCi0JCQkgIHJlc2lkZXMgaW4gdGhlIFdBUiwgb3IgL01FVEEtSU5GL3RhZ3MgaWYgdGhlCi0JCQkgIC50YWcgZmlsZSByZXNpZGVzIGluIGEgSkFSLgotCi0JZXhhbXBsZSAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4KLQkJCSAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIHRhZwotCi0JdGFnLWV4dGVuc2lvbiAgICAgWmVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCi0JCQkgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnLCBmb3IgdG9vbAotCQkJICBjb25zdW1wdGlvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhdGgiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGFtcGxlIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24KLQkgICAgb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIGEgdGFnLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWV4dGVuc2lvbiIKLQkJICAgdHlwZT0iajJlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRhZyBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QgYWZmZWN0Ci0JICAgIHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGFnIGRlZmluZXMgYSB1bmlxdWUgdGFnIGluIHRoaXMgdGFnIGxpYnJhcnkuICBJdCBoYXMgb25lCi0JYXR0cmlidXRlLCBpZC4KLQotCVRoZSB0YWcgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgotCi0JZGVzY3JpcHRpb24gICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0KLQlkaXNwbGF5LW5hbWUgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQotCQkJICBkaXNwbGF5ZWQgYnkgdG9vbHMKLQotCWljb24gICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCi0JCQkgIGJ5IHRvb2xzCi0KLQluYW1lICAgICAgICAgICAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCi0KLQl0YWctY2xhc3MgICAgICAgICBUaGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nCi0JCQkgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BUYWcKLQotCXRlaS1jbGFzcyAgICAgICAgIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mCi0JCQkgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KLQotCWJvZHktY29udGVudCAgICAgIFRoZSBib2R5IGNvbnRlbnQgdHlwZQotCi0JdmFyaWFibGUgICAgICAgICAgT3B0aW9uYWwgc2NyaXB0aW5nIHZhcmlhYmxlIGluZm9ybWF0aW9uCi0KLQlhdHRyaWJ1dGUgICAgICAgICBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbiB0aGF0IGFyZQotCQkJICBldmFsdWF0ZWQgcHJpb3IgdG8gaW52b2NhdGlvbi4KLQotCWR5bmFtaWMtYXR0cmlidXRlcyBXaGV0aGVyIHRoaXMgdGFnIHN1cHBvcnRzIGFkZGl0aW9uYWwKLQkJCSAgIGF0dHJpYnV0ZXMgd2l0aCBkeW5hbWljIG5hbWVzLiAgSWYKLQkJCSAgIHRydWUsIHRoZSB0YWctY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlCi0JCQkgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuRHluYW1pY0F0dHJpYnV0ZXMKLQkJCSAgIGludGVyZmFjZS4gIERlZmF1bHRzIHRvIGZhbHNlLgotCi0JZXhhbXBsZSAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4KLQkJCSAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIHRhZwotCi0JdGFnLWV4dGVuc2lvbiAgICAgWmVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCi0JCQkgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnLCBmb3IgdG9vbAotCQkJICBjb25zdW1wdGlvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LkpzcFRhZwotCSAgICB0aGF0IGltcGxlbWVudHMgdGhlIHJlcXVlc3QgdGltZSBzZW1hbnRpY3MgZm9yCi0JICAgIHRoaXMgdGFnLiAocmVxdWlyZWQpCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZWktY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbwotCSAgICBmb3IgdGhpcyB0YWcuIChvcHRpb25hbCkKLQotCSAgICBJZiB0aGlzIGlzIG5vdCBnaXZlbiwgdGhlIGNsYXNzIGlzIG5vdCBjb25zdWx0ZWQgYXQKLQkgICAgdHJhbnNsYXRpb24gdGltZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJib2R5LWNvbnRlbnQiCi0JCSAgIHR5cGU9ImoyZWU6Ym9keS1jb250ZW50VHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFNwZWNpZmllcyB0aGUgZm9ybWF0IGZvciB0aGUgYm9keSBvZiB0aGlzIHRhZy4KLQkgICAgVGhlIGRlZmF1bHQgaW4gSlNQIDEuMiB3YXMgIkpTUCIgYnV0IGJlY2F1c2UgdGhpcwotCSAgICBpcyBhbiBpbnZhbGlkIHNldHRpbmcgZm9yIHNpbXBsZSB0YWcgaGFuZGxlcnMsIHRoZXJlCi0JICAgIGlzIG5vIGxvbmdlciBhIGRlZmF1bHQgaW4gSlNQIDIuMC4gIEEgcmVhc29uYWJsZQotCSAgICBkZWZhdWx0IGZvciBzaW1wbGUgdGFnIGhhbmRsZXJzIGlzICJzY3JpcHRsZXNzIiBpZgotCSAgICB0aGUgdGFnIGNhbiBoYXZlIGEgYm9keS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZSIKLQkJICAgdHlwZT0iajJlZTp2YXJpYWJsZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWF0dHJpYnV0ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkeW5hbWljLWF0dHJpYnV0ZXMiCi0JCSAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhhbXBsZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uCi0JICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBhIHRhZy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1leHRlbnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWV4dGVuc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUYWcgZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90IGFmZmVjdAotCSAgICB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkLWF0dHJpYnV0ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhdHRyaWJ1dGUgZWxlbWVudCBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcKLQl0YWcuICBUaGUgYXR0cmlidXRyZSBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMKLQlkZWZpbmluZzoKLQotCWRlc2NyaXB0aW9uICAgICBhIGRlc2NyaXB0aW9uIG9mIHRoZSBhdHRyaWJ1dGUKLQotCW5hbWUgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0KLQlyZXF1aXJlZCAgICAgICAgd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yCi0JCQlvcHRpb25hbAotCi0JcnRleHBydmFsdWUgICAgIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBhIHJ1bnRpbWUgYXR0cmlidXRlCi0KLQl0eXBlICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMKLQotCWZyYWdtZW50ICAgICAgICB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIGlzIGEgZnJhZ21lbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLQkJICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWlyZWQiCi0JCSAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3IKLQkgICAgb3B0aW9uYWwuCi0KLQkgICAgSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUKLQkgICAgdGhlIGF0dHJpYnV0ZSBpcyBvcHRpb25hbC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDpzZXF1ZW5jZT4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJydGV4cHJ2YWx1ZSIKLQkJICAgICAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0JICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkJRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgY2FuIGhhdmUgc2NyaXB0bGV0Ci0JCWV4cHJlc3Npb25zIGFzIGEgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlCi0JCWF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCByZXF1ZXN0Ci0JCXRpbWUsIGFzIG9wcG9zZWQgdG8gYSBzdGF0aWMgdmFsdWUgZGV0ZXJtaW5lZCBhdAotCQl0cmFuc2xhdGlvbiB0aW1lLgotCi0JCUlmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZQotCQlhdHRyaWJ1dGUgaGFzIGEgc3RhdGljIHZhbHVlCi0KLQkgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0JICA8L3hzZDplbGVtZW50PgotCSAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUiCi0JCSAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgICAgICBtaW5PY2N1cnM9IjAiPgotCSAgICA8eHNkOmFubm90YXRpb24+Ci0JICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCURlZmluZXMgdGhlIEphdmEgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZS4gIEZvcgotCQlzdGF0aWMgdmFsdWVzICh0aG9zZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uIHRpbWUpCi0JCXRoZSB0eXBlIGlzIGFsd2F5cyBqYXZhLmxhbmcuU3RyaW5nLgotCi0JICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDwveHNkOmVsZW1lbnQ+Ci0JPC94c2Q6c2VxdWVuY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImZyYWdtZW50IgotCQkgICAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjAiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICAidHJ1ZSIgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgb2YgdHlwZQotCSAgICAgIGphdmF4LmpzcC50YWdleHQuSnNwRnJhZ21lbnQsIHJlcHJlc2VudGluZyBkeW5hbWljCi0JICAgICAgY29udGVudCB0aGF0IGNhbiBiZSByZS1ldmFsdWF0ZWQgYXMgbWFueSB0aW1lcwotCSAgICAgIGFzIG5lZWRlZCBieSB0aGUgdGFnIGhhbmRsZXIuICBJZiBvbWl0dGVkIG9yICJmYWxzZSIsCi0JICAgICAgdGhlIGRlZmF1bHQgaXMgc3RpbGwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1jYW5vbmljYWwtbmFtZVR5cGUiPgotCi0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSB0YWcgb3IgYXR0cmlidXRlIGJlaW5nCi0JZGVmaW5lZC4KLQotCVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnhzZE5NVE9LRU5UeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1leHRlbnNpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGxkLWV4dGVuc2lvblR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZQotCWV4dGVuc2lvbnMgdG8gYSBzcGVjaWZpYyBUTEQgZWxlbWVudC4KLQotCUl0IGlzIHVzZWQgYnkgZWxlbWVudHMgdG8gZGVzaWduYXRlIGFuIGV4dGVuc2lvbiBibG9jawotCXRoYXQgaXMgdGFyZ2V0ZWQgdG8gYSBzcGVjaWZpYyBleHRlbnNpb24gZGVzaWduYXRlZCBieQotCWEgc2V0IG9mIGV4dGVuc2lvbiBlbGVtZW50cyB0aGF0IGFyZSBkZWNsYXJlZCBieSBhCi0JbmFtZXNwYWNlLiBUaGUgbmFtZXNwYWNlIGlkZW50aWZpZXMgdGhlIGV4dGVuc2lvbiB0bwotCXRoZSB0b29sIHRoYXQgcHJvY2Vzc2VzIHRoZSBleHRlbnNpb24uCi0KLQlUaGUgdHlwZSBvZiB0aGUgZXh0ZW5zaW9uLWVsZW1lbnQgaXMgYWJzdHJhY3QuIFRoZXJlZm9yZSwKLQlhIGNvbmNyZXRlIHR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgYnkgdGhlIFRMRCB1c2luZwotCXhzaTp0eXBlIGF0dHJpYnV0ZSBmb3IgZWFjaCBleHRlbnNpb24tZWxlbWVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24tZWxlbWVudCIKLQkJICAgdHlwZT0iajJlZTpleHRlbnNpYmxlVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIKLQkJICAgdXNlPSJyZXF1aXJlZCIKLQkJICAgdHlwZT0ieHNkOmFueVVSSSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkVGFnbGliVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QsIGl0IGRlZmluZXM6Ci0KLQlkZXNjcmlwdGlvbiAgICAgYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICJ1c2UiIG9mIHRoaXMgdGFnbGliLAotCQkJc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUKLQotCWRpc3BsYXktbmFtZSAgICB0aGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYQotCQkJc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZAotCQkJYnkgdG9vbHMKLQotCWljb24gICAgICAgICAgICBvcHRpb25hbCBpY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLQotCXRsaWItdmVyc2lvbiAgICB0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KLQotCXNob3J0LW5hbWUgICAgICBhIHNpbXBsZSBkZWZhdWx0IHNob3J0IG5hbWUgdGhhdCBjb3VsZCBiZQotCQkJdXNlZCBieSBhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUKLQkJCW5hbWVzIHdpdGggYSBtbmVtb25pYyB2YWx1ZTsgZm9yIGV4YW1wbGUsCi0JCQl0aGUgaXQgbWF5IGJlIHVzZWQgYXMgdGhlIHByZWZlcmVkIHByZWZpeAotCQkJdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMKLQotCXVyaSAgICAgICAgICAgICBhIHVyaSB1bmlxdWVseSBpZGVudGlmeWluZyB0aGlzIHRhZ2xpYgotCi0JdmFsaWRhdG9yICAgICAgIG9wdGlvbmFsIFRhZ0xpYnJhcnlWYWxpZGF0b3IgaW5mb3JtYXRpb24KLQotCWxpc3RlbmVyICAgICAgICBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBzcGVjaWZpY2F0aW9uCi0KLQl0YWcgICAgICAgICAgICAgdGFncyBpbiB0aGlzIHRhZyBsaWJyYXJ5Ci0KLQl0YWctZmlsZSAgICAgICAgdGFnIGZpbGVzIGluIHRoaXMgdGFnIGxpYnJhcnkKLQotCWZ1bmN0aW9uICAgICAgICB6ZXJvIG9yIG1vcmUgRUwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcwotCQkJdGFnIGxpYnJhcnkKLQotCXRhZ2xpYi1leHRlbnNpb24gemVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCi0JCQlpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZ2xpYiwgZm9yIHRvb2wKLQkJCWNvbnN1bXB0aW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRsaWItdmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlc2NyaWJlcyB0aGlzIHZlcnNpb24gKG51bWJlcikgb2YgdGhlIHRhZ2xpYnJhcnkuCi0JICAgIEl0IGlzIGRlc2NyaWJlZCBhcyBhIGRld2V5IGRlY2ltYWwuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNob3J0LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgYSBzaW1wbGUgZGVmYXVsdCBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieQotCSAgICBhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUgbmFtZXMgd2l0aCBhCi0JICAgIG1uZW1vbmljdmFsdWU7IGZvciBleGFtcGxlLCBpdCBtYXkgYmUgdXNlZCBhcyB0aGUKLQkgICAgcHJlZmVycmVkIHByZWZpeCB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcy4gIERvCi0JICAgIG5vdCB1c2Ugd2hpdGUgc3BhY2UsIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMKLQkgICAgb3IgdW5kZXJzY29yZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVyaSIKLQkJICAgdHlwZT0iajJlZTp4c2RBbnlVUklUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIGEgcHVibGljIFVSSSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcwotCSAgICB2ZXJzaW9uIG9mIHRoZSB0YWdsaWJyYXJ5LiAgTGVhdmUgaXQgZW1wdHkgaWYgaXQKLQkgICAgZG9lcyBub3QgYXBwbHkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3IiCi0JCSAgIHR5cGU9ImoyZWU6dmFsaWRhdG9yVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXIiCi0JCSAgIHR5cGU9ImoyZWU6bGlzdGVuZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnIgotCQkgICB0eXBlPSJqMmVlOnRhZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctZmlsZSIKLQkJICAgdHlwZT0iajJlZTp0YWdGaWxlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uIgotCQkgICB0eXBlPSJqMmVlOmZ1bmN0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi1leHRlbnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWV4dGVuc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUYWdsaWIgZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90IGFmZmVjdAotCSAgICB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjIuMCIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnbGlicmFyeQotCSAgcmVxdWlyZXMgaW4gb3JkZXIgdG8gZnVuY3Rpb24gKGRld2V5IGRlY2ltYWwpCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWxpZGF0b3JUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlBIHZhbGlkYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlCi0JdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeSBpcwotCWRlZmluZWQgYnkgYSB2YWxpZGF0b3JUeXBlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvci1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgVGFnTGlicmFyeVZhbGlkYXRvciBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkCi0JICAgIHRvIHZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMKLQkgICAgdGFnIGxpYnJhcnkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzIGFuCi0JICAgIGluaXRpYWxpemF0aW9uIHBhcmFtLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1zY29wZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBkZWZpbmVzIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBTZWUKLQlUYWdFeHRyYUluZm8gZm9yIGRldGFpbHMuICBUaGUgYWxsb3dlZCB2YWx1ZXMgYXJlLAotCSJORVNURUQiLCAiQVRfQkVHSU4iIGFuZCAiQVRfRU5EIi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkVTVEVEIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRfQkVHSU4iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVF9FTkQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB2YXJpYWJsZVR5cGUgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZwotCXZhcmlhYmxlcyBkZWZpbmVkIGJ5IHVzaW5nIHRoaXMgdGFnLiAgSXQgaXMgYSAodHJhbnNsYXRpb24KLQl0aW1lKSBlcnJvciBmb3IgYSB0YWcgdGhhdCBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUKLQlzdWJlbGVtZW50cyB0byBoYXZlIGEgVGFnRXh0cmFJbmZvIGNsYXNzIHRoYXQgcmV0dXJucyBhCi0Jbm9uLW51bGwgdmFsdWUgZnJvbSBhIGNhbGwgdG8gZ2V0VmFyaWFibGVJbmZvKCkuCi0KLQlUaGUgc3ViZWxlbWVudHMgb2YgdmFyaWFibGVUeXBlIGFyZSBvZiB0aGUgZm9ybToKLQotCWRlc2NyaXB0aW9uICAgICAgICAgICAgICBPcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGlzCi0JCQkJIHZhcmlhYmxlCi0KLQluYW1lLWdpdmVuICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIG5hbWUgYXMgYSBjb25zdGFudAotCi0JbmFtZS1mcm9tLWF0dHJpYnV0ZSAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZQotCQkJCSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUgd2lsbAotCQkJCSBnaXZlIHRoZSBuYW1lIG9mIHRoZQotCQkJCSB2YXJpYWJsZS4gIE9uZSBvZiBuYW1lLWdpdmVuIG9yCi0JCQkJIG5hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCi0KLQl2YXJpYWJsZS1jbGFzcyAgICAgICAgICAgTmFtZSBvZiB0aGUgY2xhc3Mgb2YgdGhlIHZhcmlhYmxlLgotCQkJCSBqYXZhLmxhbmcuU3RyaW5nIGlzIGRlZmF1bHQuCi0KLQlkZWNsYXJlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQKLQkJCQkgb3Igbm90LiAgVHJ1ZSBpcyB0aGUgZGVmYXVsdC4KLQotCXNjb3BlICAgICAgICAgICAgICAgICAgICBUaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJhaWJsZQotCQkJCSBkZWZpbmVkLiAgTkVTVEVEIGlzIGRlZmF1bHQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1naXZlbiIKLQkJICAgICB0eXBlPSJqMmVlOmphdmEtaWRlbnRpZmllclR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgbmFtZSBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCi0JPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZnJvbS1hdHRyaWJ1dGUiCi0JCSAgICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlCi0JICAgICAgKHRyYW5zbGF0aW9uLXRpbWUpIHZhbHVlIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZgotCSAgICAgIHRoZSB2YXJpYWJsZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBvcHRpb25hbCBuYW1lIG9mIHRoZSBjbGFzcyBmb3IgdGhlIHNjcmlwdGluZwotCSAgICB2YXJpYWJsZS4gIFRoZSBkZWZhdWx0IGlzIGphdmEubGFuZy5TdHJpbmcuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlY2xhcmUiCi0JCSAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBXaGV0aGVyIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgaXMgdG8gYmUgZGVmaW5lZAotCSAgICBvciBub3QuICBTZWUgVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiAgVGhpcwotCSAgICBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCAidHJ1ZSIgaXMgdGhlIGRlZmF1bHQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NvcGUiCi0JCSAgIHR5cGU9ImoyZWU6dmFyaWFibGUtc2NvcGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgIk5FU1RFRCIgaXMgdGhlIGRlZmF1bHQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYThlOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8yXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYQotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjIuMSI+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyl3ZWItanNwdGFnbGlicmFyeV8yXzEueHNkcwkxLjEKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAgICAgIFUuUy5BCi0gICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSlNQIFRhZ2xpYnJhcnkKLQlkZXNjcmlwdG9yLiAgQWxsIFRhZ2xpYnJhcnkgZGVzY3JpcHRvcnMgbXVzdAotCWluZGljYXRlIHRoZSB0YWcgbGlicmFyeSBzY2hlbWEgYnkgdXNpbmcgdGhlIFRhZ2xpYnJhcnkKLQluYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDx0YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgotCSAgICAgIHZlcnNpb249IjIuMSI+Ci0JICAgICAgLi4uCi0JICAgIDwvdGFnbGliPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZAotCXZlcnNpb24gb2YgdGhlIHNjaGVtYSB1c2luZyB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0JZm9yIEphdmEgRUUgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItanNwdGFnbGlicmFyeV8yXzEueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWIiIHR5cGU9ImphdmFlZTp0bGRUYWdsaWJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGFnbGliIHRhZyBpcyB0aGUgZG9jdW1lbnQgcm9vdC4KLQlUaGUgZGVmaW5pdGlvbiBvZiB0YWdsaWIgaXMgcHJvdmlkZWQKLQlieSB0aGUgdGxkVGFnbGliVHlwZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InRhZy1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHRhZ2xpYiBlbGVtZW50IGNvbnRhaW5zLCBhbW9uZyBvdGhlciB0aGluZ3MsIHRhZyBhbmQKLQkgIHRhZy1maWxlIGVsZW1lbnRzLgotCSAgVGhlIG5hbWUgc3ViZWxlbWVudHMgb2YgdGhlc2UgZWxlbWVudHMgbXVzdCBlYWNoIGJlIHVuaXF1ZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnRhZ3xqYXZhZWU6dGFnLWZpbGUiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpuYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZnVuY3Rpb24tbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSB0YWdsaWIgZWxlbWVudCBjb250YWlucyBmdW5jdGlvbiBlbGVtZW50cy4KLQkgIFRoZSBuYW1lIHN1YmVsZW1lbnRzIG9mIHRoZXNlIGVsZW1lbnRzIG11c3QgZWFjaCBiZSB1bmlxdWUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpmdW5jdGlvbiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOm5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJib2R5LWNvbnRlbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGJvZHkgdGhhdCBpcyB2YWxpZCBmb3IgYSB0YWcuCi0JVGhpcyB2YWx1ZSBpcyB1c2VkIGJ5IHRoZSBKU1AgY29udGFpbmVyIHRvIHZhbGlkYXRlCi0JdGhhdCBhIHRhZyBpbnZvY2F0aW9uIGhhcyB0aGUgY29ycmVjdCBib2R5IHN5bnRheCBhbmQKLQlieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzIHRvIGFzc2lzdCB0aGUgcGFnZSBhdXRob3IKLQlpbiBwcm92aWRpbmcgYSB2YWxpZCB0YWcgYm9keS4KLQotCVRoZXJlIGFyZSBjdXJyZW50bHkgZm91ciB2YWx1ZXMgc3BlY2lmaWVkOgotCi0JdGFnZGVwZW5kZW50ICAgIFRoZSBib2R5IG9mIHRoZSB0YWcgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIHRhZwotCQkJaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkKLQkJCWluIGEgZGlmZmVyZW50ICJsYW5ndWFnZSIsIGUuZyBlbWJlZGRlZCBTUUwKLQkJCXN0YXRlbWVudHMuCi0KLQlKU1AgICAgICAgICAgICAgVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQCi0JCQlzeW50YXguCi0KLQllbXB0eSAgICAgICAgICAgVGhlIGJvZHkgbXVzdCBiZSBlbXB0eQotCi0Jc2NyaXB0bGVzcyAgICAgIFRoZSBib2R5IGFjY2VwdHMgb25seSB0ZW1wbGF0ZSB0ZXh0LCBFTAotCQkJRXhwcmVzc2lvbnMsIGFuZCBKU1AgYWN0aW9uIGVsZW1lbnRzLiAgTm8KLQkJCXNjcmlwdGluZyBlbGVtZW50cyBhcmUgYWxsb3dlZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0YWdkZXBlbmRlbnQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKU1AiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlbXB0eSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNjcmlwdGxlc3MiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleHRlbnNpYmxlVHlwZSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBleHRlbnNpYmxlVHlwZSBpcyBhbiBhYnN0cmFjdCBiYXNlIHR5cGUgdGhhdCBpcyB1c2VkIHRvCi0JZGVmaW5lIHRoZSB0eXBlIG9mIGV4dGVuc2lvbi1lbGVtZW50cy4gSW5zdGFuY2UgZG9jdW1lbnRzCi0JbXVzdCBzdWJzdGl0dXRlIGEga25vd24gdHlwZSB0byBkZWZpbmUgdGhlIGV4dGVuc2lvbiBieQotCXVzaW5nIHhzaTp0eXBlIGF0dHJpYnV0ZSB0byBkZWZpbmUgdGhlIGFjdHVhbCB0eXBlIG9mCi0JZXh0ZW5zaW9uLWVsZW1lbnRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVuY3Rpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZnVuY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gZWFjaAotCWZ1bmN0aW9uIGluIHRoZSB0YWcgbGlicmFyeSB0aGF0IGlzIHRvIGJlIGV4cG9zZWQgdG8gdGhlIEVMLgotCi0JVGhlIGZ1bmN0aW9uIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKLQotCWRlc2NyaXB0aW9uICAgICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0KLQlkaXNwbGF5LW5hbWUgICAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi0JCQkgICAgZGlzcGxheWVkIGJ5IHRvb2xzCi0KLQlpY29uICAgICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCi0JCQkgICAgYnkgdG9vbHMKLQotCW5hbWUgICAgICAgICAgICAgICAgQSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbgotCi0JZnVuY3Rpb24tY2xhc3MgICAgICBQcm92aWRlcyB0aGUgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0Ci0JCQkgICAgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb24KLQotCWZ1bmN0aW9uLXNpZ25hdHVyZSAgUHJvdmlkZXMgdGhlIHNpZ25hdHVyZSwgYXMgaW4gdGhlIEphdmEKLQkJCSAgICBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBvZiB0aGUgSmF2YQotCQkJICAgIG1ldGhvZCB0aGF0IGlzIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50Ci0JCQkgICAgdGhlIGZ1bmN0aW9uLgotCi0JZXhhbXBsZSAgICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbgotCQkJICAgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyBmdW5jdGlvbgotCi0JZnVuY3Rpb24tZXh0ZW5zaW9uICBaZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEKLQkJCSAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGZ1bmN0aW9uLCBmb3IgdG9vbAotCQkJICAgIGNvbnN1bXB0aW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIEEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgZnVuY3Rpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgUHJvdmlkZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBKYXZhCi0JICAgIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHN0YXRpYyBtZXRob2QgdGhhdCBpbXBsZW1lbnRzCi0JICAgIHRoZSBmdW5jdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLXNpZ25hdHVyZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIG9mIHRoZSBzdGF0aWMgSmF2YSBtZXRob2QgdGhhdCBpcwotCSAgICB0byBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb24uICBUaGUgc3ludGF4IG9mIHRoZQotCSAgICBmdW5jdGlvbi1zaWduYXR1cmUgZWxlbWVudCBpcyBhcyBmb2xsb3dzOgotCi0JCUZ1bmN0aW9uU2lnbmF0dXJlIDo6PSBSZXR1cm5UeXBlIFMgTWV0aG9kTmFtZSBTPwotCQkJCSAgICAgICcoJyBTPyBQYXJhbWV0ZXJzPyBTPyAnKScKLQotICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgICAgIDo6PSBUeXBlCi0KLQkJTWV0aG9kTmFtZSAgICAgICAgOjo9IElkZW50aWZpZXIKLQotCQlQYXJhbWV0ZXJzICAgICAgICA6Oj0gICBQYXJhbWV0ZXIKLQkJCQkgICAgICB8ICggUGFyYW1ldGVyIFM/ICcsJyBTPyBQYXJhbWV0ZXJzICkKLQotICAgICAgICAgICAgICAgIFBhcmFtZXRlciAgICAgICAgIDo6PSBUeXBlCi0KLQkJV2hlcmU6Ci0KLSAJCSAgICAqIFR5cGUgaXMgYSBiYXNpYyB0eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkCi0JCSAgICAgIEphdmEgY2xhc3MgbmFtZSAoaW5jbHVkaW5nIHBhY2thZ2UgbmFtZSksCi0JCSAgICAgIGFzIHBlciB0aGUgJ1R5cGUnIHByb2R1Y3Rpb24gaW4gdGhlIEphdmEKLQkJICAgICAgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgU2Vjb25kIEVkaXRpb24sCi0JCSAgICAgIENoYXB0ZXIgMTguCi0KLSAgICAgICAgICAgICAgICAgICAgKiBJZGVudGlmaWVyIGlzIGEgSmF2YSBpZGVudGlmaWVyLCBhcyBwZXIKLQkJICAgICAgdGhlICdJZGVudGlmaWVyJyBwcm9kdWN0aW9uIGluIHRoZSBKYXZhCi0JCSAgICAgIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFNlY29uZAotCQkgICAgICBFZGl0aW9uLCBDaGFwdGVyIDE4LgotCi0JICAgIEV4YW1wbGU6Ci0KLQkgICAgamF2YS5sYW5nLlN0cmluZyBuaWNrTmFtZSggamF2YS5sYW5nLlN0cmluZywgaW50ICkKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4YW1wbGUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uCi0JICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiB0aGlzIGZ1bmN0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tZXh0ZW5zaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6dGxkLWV4dGVuc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBGdW5jdGlvbiBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QKLSAgICAgICAgICAgIGFmZmVjdCB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFnRmlsZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCURlZmluZXMgYW4gYWN0aW9uIGluIHRoaXMgdGFnIGxpYnJhcnkgdGhhdCBpcyBpbXBsZW1lbnRlZAotCWFzIGEgLnRhZyBmaWxlLgotCi0JVGhlIHRhZy1maWxlIGVsZW1lbnQgaGFzIHR3byByZXF1aXJlZCBzdWJlbGVtZW50czoKLQotCWRlc2NyaXB0aW9uICAgICAgIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotCi0JZGlzcGxheS1uYW1lICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLQkJCSAgZGlzcGxheWVkIGJ5IHRvb2xzCi0KLQlpY29uICAgICAgICAgICAgICBPcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZAotCQkJICBieSB0b29scwotCi0JbmFtZSAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQotCi0JcGF0aCAgICAgICAgICAgICAgV2hlcmUgdG8gZmluZCB0aGUgLnRhZyBmaWxlIGltcGxlbWVudGluZyB0aGlzCi0JCQkgIGFjdGlvbiwgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYgotCQkJICBhcHBsaWNhdGlvbiBvciB0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUgZm9yIGEKLQkJCSAgdGFnIGxpYnJhcnkgcGFja2FnZWQgaW4gYSBKQVIuICBUaGlzIG11c3QKLQkJCSAgYmVnaW4gd2l0aCAvV0VCLUlORi90YWdzIGlmIHRoZSAudGFnIGZpbGUKLQkJCSAgcmVzaWRlcyBpbiB0aGUgV0FSLCBvciAvTUVUQS1JTkYvdGFncyBpZiB0aGUKLQkJCSAgLnRhZyBmaWxlIHJlc2lkZXMgaW4gYSBKQVIuCi0KLQlleGFtcGxlICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbgotCQkJICBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgdGFnCi0KLQl0YWctZXh0ZW5zaW9uICAgICBaZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEKLQkJCSAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YWcsIGZvciB0b29sCi0JCQkgIGNvbnN1bXB0aW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhdGgiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4YW1wbGUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uCi0JICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBhIHRhZy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1leHRlbnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRhZyBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QgYWZmZWN0Ci0JICAgIHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGFnIGRlZmluZXMgYSB1bmlxdWUgdGFnIGluIHRoaXMgdGFnIGxpYnJhcnkuICBJdCBoYXMgb25lCi0JYXR0cmlidXRlLCBpZC4KLQotCVRoZSB0YWcgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgotCi0JZGVzY3JpcHRpb24gICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0KLQlkaXNwbGF5LW5hbWUgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQotCQkJICBkaXNwbGF5ZWQgYnkgdG9vbHMKLQotCWljb24gICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCi0JCQkgIGJ5IHRvb2xzCi0KLQluYW1lICAgICAgICAgICAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCi0KLQl0YWctY2xhc3MgICAgICAgICBUaGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nCi0JCQkgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BUYWcKLQotCXRlaS1jbGFzcyAgICAgICAgIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mCi0JCQkgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KLQotCWJvZHktY29udGVudCAgICAgIFRoZSBib2R5IGNvbnRlbnQgdHlwZQotCi0JdmFyaWFibGUgICAgICAgICAgT3B0aW9uYWwgc2NyaXB0aW5nIHZhcmlhYmxlIGluZm9ybWF0aW9uCi0KLQlhdHRyaWJ1dGUgICAgICAgICBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbiB0aGF0IGFyZQotCQkJICBldmFsdWF0ZWQgcHJpb3IgdG8gaW52b2NhdGlvbi4KLQotCWR5bmFtaWMtYXR0cmlidXRlcyBXaGV0aGVyIHRoaXMgdGFnIHN1cHBvcnRzIGFkZGl0aW9uYWwKLQkJCSAgIGF0dHJpYnV0ZXMgd2l0aCBkeW5hbWljIG5hbWVzLiAgSWYKLQkJCSAgIHRydWUsIHRoZSB0YWctY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlCi0JCQkgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuRHluYW1pY0F0dHJpYnV0ZXMKLQkJCSAgIGludGVyZmFjZS4gIERlZmF1bHRzIHRvIGZhbHNlLgotCi0JZXhhbXBsZSAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4KLQkJCSAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIHRhZwotCi0JdGFnLWV4dGVuc2lvbiAgICAgWmVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCi0JCQkgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnLCBmb3IgdG9vbAotCQkJICBjb25zdW1wdGlvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LkpzcFRhZwotCSAgICB0aGF0IGltcGxlbWVudHMgdGhlIHJlcXVlc3QgdGltZSBzZW1hbnRpY3MgZm9yCi0JICAgIHRoaXMgdGFnLiAocmVxdWlyZWQpCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZWktY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCi0JICAgIGZvciB0aGlzIHRhZy4gKG9wdGlvbmFsKQotCi0JICAgIElmIHRoaXMgaXMgbm90IGdpdmVuLCB0aGUgY2xhc3MgaXMgbm90IGNvbnN1bHRlZCBhdAotCSAgICB0cmFuc2xhdGlvbiB0aW1lLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJvZHktY29udGVudCIKLQkJICAgdHlwZT0iamF2YWVlOmJvZHktY29udGVudFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBTcGVjaWZpZXMgdGhlIGZvcm1hdCBmb3IgdGhlIGJvZHkgb2YgdGhpcyB0YWcuCi0JICAgIFRoZSBkZWZhdWx0IGluIEpTUCAxLjIgd2FzICJKU1AiIGJ1dCBiZWNhdXNlIHRoaXMKLQkgICAgaXMgYW4gaW52YWxpZCBzZXR0aW5nIGZvciBzaW1wbGUgdGFnIGhhbmRsZXJzLCB0aGVyZQotCSAgICBpcyBubyBsb25nZXIgYSBkZWZhdWx0IGluIEpTUCAyLjAuICBBIHJlYXNvbmFibGUKLQkgICAgZGVmYXVsdCBmb3Igc2ltcGxlIHRhZyBoYW5kbGVycyBpcyAic2NyaXB0bGVzcyIgaWYKLQkgICAgdGhlIHRhZyBjYW4gaGF2ZSBhIGJvZHkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUiCi0JCSAgIHR5cGU9ImphdmFlZTp2YXJpYWJsZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0JCSAgIHR5cGU9ImphdmFlZTp0bGQtYXR0cmlidXRlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImR5bmFtaWMtYXR0cmlidXRlcyIKLQkJICAgdHlwZT0iamF2YWVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4YW1wbGUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uCi0JICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBhIHRhZy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1leHRlbnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRhZyBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QgYWZmZWN0Ci0JICAgIHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtYXR0cmlidXRlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGF0dHJpYnV0ZSBlbGVtZW50IGRlZmluZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbmVzdGluZwotCXRhZy4gIFRoZSBhdHRyaWJ1dGUgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzCi0JZGVmaW5pbmc6Ci0KLQlkZXNjcmlwdGlvbiAgICAgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYXR0cmlidXRlCi0KLQluYW1lICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotCi0JcmVxdWlyZWQgICAgICAgIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvcgotCQkJb3B0aW9uYWwKLQotCXJ0ZXhwcnZhbHVlICAgICB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgYSBydW50aW1lIGF0dHJpYnV0ZQotCi0JdHlwZSAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzCi0KLQlmcmFnbWVudCAgICAgICAgd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBhIGZyYWdtZW50Ci0KLSAgICAgICAgZGVmZXJyZWQtdmFsdWUgIHByZXNlbnQgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgdG8gYmUgcGFyc2VkIGFzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbgotCi0gICAgICAgIGRlZmVycmVkLW1ldGhvZCBwcmVzZW50IGlmIHRoaXMgYXR0cmlidXRlIGlzIHRvIGJlIHBhcnNlZCBhcyBhCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkIgotCQkgICB0eXBlPSJqYXZhZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3IKLQkgICAgb3B0aW9uYWwuCi0KLQkgICAgSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUKLQkgICAgdGhlIGF0dHJpYnV0ZSBpcyBvcHRpb25hbC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiPgotCSAgICA8eHNkOmVsZW1lbnQgbmFtZT0icnRleHBydmFsdWUiCi0JCSAgICAgICAgIHR5cGU9ImphdmFlZTpnZW5lcmljLWJvb2xlYW5UeXBlIj4KLQkgICAgICA8eHNkOmFubm90YXRpb24+Ci0JICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkJICBEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQKLQkJICBleHByZXNzaW9ucyBhcyBhIHZhbHVlLCBpLmUgdGhlIHZhbHVlIG9mIHRoZQotCQkgIGF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCByZXF1ZXN0Ci0JCSAgdGltZSwgYXMgb3Bwb3NlZCB0byBhIHN0YXRpYyB2YWx1ZSBkZXRlcm1pbmVkIGF0Ci0JCSAgdHJhbnNsYXRpb24gdGltZS4KLQkJICBJZiBub3QgcHJlc2VudCB0aGVuIHRoZSBkZWZhdWx0IGlzICJmYWxzZSIsIGkuZSB0aGUKLQkJICBhdHRyaWJ1dGUgaGFzIGEgc3RhdGljIHZhbHVlCi0KLQkgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgICAgPC94c2Q6ZWxlbWVudD4KLQkgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUiCi0JCSAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICAgICAgICBtaW5PY2N1cnM9IjAiPgotCSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkgIERlZmluZXMgdGhlIEphdmEgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgIElmIHRoaXMgZWxlbWVudCBpcyBvbWl0dGVkLCB0aGUgZXhwZWN0ZWQgdHlwZSBpcwotICAgICAgICAgICAgICAgICAgYXNzdW1lZCB0byBiZSAiamF2YS5sYW5nLk9iamVjdCIuCi0KLQkgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgICAgPC94c2Q6ZWxlbWVudD4KLQkgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0JICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZlcnJlZC12YWx1ZSIKLQkJICAgICAgICAgdHlwZT0iamF2YWVlOnRsZC1kZWZlcnJlZC12YWx1ZVR5cGUiCi0JCSAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0JICAgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICBQcmVzZW50IGlmIHRoZSB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUgaXMgdG8gYmUKLSAgICAgICAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgdGFnIGhhbmRsZXIgYXMgYQotICAgICAgICAgICAgICAgICAgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uLiBUaGlzIGFsbG93cyBmb3IgZGVmZXJyZWQKLSAgICAgICAgICAgICAgICAgIGV2YWx1YXRpb24gb2YgRUwgZXhwcmVzc2lvbnMuIEFuIG9wdGlvbmFsIHN1YmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgIHdpbGwgY29udGFpbiB0aGUgZXhwZWN0ZWQgdHlwZSB0aGF0IHRoZSB2YWx1ZSB3aWxsCi0gICAgICAgICAgICAgICAgICBiZSBjb2VyY2VkIHRvIGFmdGVyIGV2YWx1YXRpb24gb2YgdGhlIGV4cHJlc3Npb24uCi0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBkZWZhdWx0cyB0byBPYmplY3QgaWYgb25lIGlzIG5vdCBwcm92aWRlZC4KLQotCSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCSAgICA8L3hzZDplbGVtZW50PgotCSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmZXJyZWQtbWV0aG9kIgotCQkgICAgICAgdHlwZT0iamF2YWVlOnRsZC1kZWZlcnJlZC1tZXRob2RUeXBlIgotCQkgICAgICAgbWluT2NjdXJzPSIwIj4KLQkgICAgICA8eHNkOmFubm90YXRpb24+Ci0JICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBQcmVzZW50IGlmIHRoZSB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUgaXMgdG8gYmUKLSAgICAgICAgICAgICAgICBwYXNzZWQgdG8gdGhlIHRhZyBoYW5kbGVyIGFzIGEKLSAgICAgICAgICAgICAgICBqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uLiBUaGlzIGFsbG93cyBmb3IgZGVmZXJyZWQKLSAgICAgICAgICAgICAgICBldmFsdWF0aW9uIG9mIGFuIEVMIGV4cHJlc3Npb24gdGhhdCBpZGVudGlmaWVzIGEKLSAgICAgICAgICAgICAgICBtZXRob2QgdG8gYmUgaW52b2tlZCBvbiBhbiBPYmplY3QuIEFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgc3ViZWxlbWVudCB3aWxsIGNvbnRhaW4gdGhlIGV4cGVjdGVkIG1ldGhvZAotICAgICAgICAgICAgICAgIHNpZ25hdHVyZS4gVGhlIHNpZ25hdHVyZSBkZWZhdWx0cyB0byAidm9pZCBtZXRob2QoKSIKLSAgICAgICAgICAgICAgICBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLgotCi0JICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0JICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJmcmFnbWVudCIKLQkJICAgICB0eXBlPSJqYXZhZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjAiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICAidHJ1ZSIgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgb2YgdHlwZQotCSAgICAgIGphdmF4LmpzcC50YWdleHQuSnNwRnJhZ21lbnQsIHJlcHJlc2VudGluZyBkeW5hbWljCi0JICAgICAgY29udGVudCB0aGF0IGNhbiBiZSByZS1ldmFsdWF0ZWQgYXMgbWFueSB0aW1lcwotCSAgICAgIGFzIG5lZWRlZCBieSB0aGUgdGFnIGhhbmRsZXIuICBJZiBvbWl0dGVkIG9yICJmYWxzZSIsCi0JICAgICAgdGhlIGRlZmF1bHQgaXMgc3RpbGwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCi0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkLWNhbm9uaWNhbC1uYW1lVHlwZSI+Ci0KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcKLQlkZWZpbmVkLgotCi0JVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTp4c2ROTVRPS0VOVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtZGVmZXJyZWQtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHByb3ZpZGUgdGhlIHZhbHVlIGZvciBhCi0gICAgICAgIHRhZyBoYW5kbGVyIGF0dHJpYnV0ZSB0aGF0IGFjY2VwdHMgYSBqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uLgotCi0JVGhlIGRlZmVycmVkLW1ldGhvZCBlbGVtZW50IGhhcyBvbmUgb3B0aW9uYWwgc3ViZWxlbWVudDoKLQotCW1ldGhvZC1zaWduYXR1cmUgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIGFzIGluIHRoZSBKYXZhCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExhbmd1YWdlIFNwZWNpZmllcywgdGhhdCBpcyBleHBlY3RlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1ldGhvZCBiZWluZyBpZGVudGlmaWVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1zaWduYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBQcm92aWRlcyB0aGUgZXhwZWN0ZWQgc2lnbmF0dXJlIG9mIHRoZSBtZXRob2QgaWRlbnRpZmllZAotICAgICAgICAgICAgYnkgdGhlIGphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24uCi0KLSAgICAgICAgICAgIFRoaXMgZGlzYW1iaWd1YXRlcyBvdmVybG9hZGVkIG1ldGhvZHMgYW5kIGVuc3VyZXMgdGhhdAotICAgICAgICAgICAgdGhlIHJldHVybiB2YWx1ZSBpcyBvZiB0aGUgZXhwZWN0ZWQgdHlwZS4KLQotICAgICAgICAgICAgVGhlIHN5bnRheCBvZiB0aGUgbWV0aG9kLXNpZ25hdHVyZSBlbGVtZW50IGlzIGlkZW50aWNhbAotICAgICAgICAgICAgdG8gdGhhdCBvZiB0aGUgZnVuY3Rpb24tc2lnbmF0dXJlIGVsZW1lbnQuICBTZWUgdGhlCi0gICAgICAgICAgICBkb2N1bWVudGF0aW9uIGZvciBmdW5jdGlvbi1zaWduYXR1cmUgZm9yIG1vcmUgZGV0YWlscy4KLQotCSAgICBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIGlzIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzIG9ubHkKLQkgICAgYW5kIGlzIGlnbm9yZWQgYnkgdGhlIEpTUCBjb250YWluZXIuCi0KLSAgICAgICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZShqYXZhLmxhbmcuU3RyaW5nKQotCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtZGVmZXJyZWQtdmFsdWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gcHJvdmlkZSB0aGUgdmFsdWUgZm9yIGEKLSAgICAgICAgdGFnIGhhbmRsZXIgYXR0cmlidXRlIHRoYXQgYWNjZXB0cyBhIGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbi4KLQotCVRoZSBkZWZlcnJlZC12YWx1ZSBlbGVtZW50IGhhcyBvbmUgb3B0aW9uYWwgc3ViZWxlbWVudDoKLQotCXR5cGUgICAgICAgICAgICB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgYXR0cmlidXRlCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgdHlwZSB0aGF0IGlzIHRoZQotICAgICAgICAgICAgZXhwZWN0ZWQgdHlwZSBmb3IgdGhpcyBkZWZlcnJlZCBleHByZXNzaW9uLiAgSWYgdGhpcwotICAgICAgICAgICAgZWxlbWVudCBpcyBvbWl0dGVkLCB0aGUgZXhwZWN0ZWQgdHlwZSBpcyBhc3N1bWVkIHRvIGJlCi0gICAgICAgICAgICAiamF2YS5sYW5nLk9iamVjdCIuCi0KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1leHRlbnNpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGxkLWV4dGVuc2lvblR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZQotCWV4dGVuc2lvbnMgdG8gYSBzcGVjaWZpYyBUTEQgZWxlbWVudC4KLQotCUl0IGlzIHVzZWQgYnkgZWxlbWVudHMgdG8gZGVzaWduYXRlIGFuIGV4dGVuc2lvbiBibG9jawotCXRoYXQgaXMgdGFyZ2V0ZWQgdG8gYSBzcGVjaWZpYyBleHRlbnNpb24gZGVzaWduYXRlZCBieQotCWEgc2V0IG9mIGV4dGVuc2lvbiBlbGVtZW50cyB0aGF0IGFyZSBkZWNsYXJlZCBieSBhCi0JbmFtZXNwYWNlLiBUaGUgbmFtZXNwYWNlIGlkZW50aWZpZXMgdGhlIGV4dGVuc2lvbiB0bwotCXRoZSB0b29sIHRoYXQgcHJvY2Vzc2VzIHRoZSBleHRlbnNpb24uCi0KLQlUaGUgdHlwZSBvZiB0aGUgZXh0ZW5zaW9uLWVsZW1lbnQgaXMgYWJzdHJhY3QuIFRoZXJlZm9yZSwKLQlhIGNvbmNyZXRlIHR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgYnkgdGhlIFRMRCB1c2luZwotCXhzaTp0eXBlIGF0dHJpYnV0ZSBmb3IgZWFjaCBleHRlbnNpb24tZWxlbWVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24tZWxlbWVudCIKLQkJICAgdHlwZT0iamF2YWVlOmV4dGVuc2libGVUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIgotCQkgICB1c2U9InJlcXVpcmVkIgotCQkgICB0eXBlPSJ4c2Q6YW55VVJJIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGRUYWdsaWJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGFnbGliIHRhZyBpcyB0aGUgZG9jdW1lbnQgcm9vdCwgaXQgZGVmaW5lczoKLQotCWRlc2NyaXB0aW9uICAgICBhIHNpbXBsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgInVzZSIgb2YgdGhpcwotCQkJdGFnbGliLCBzaG91bGQgYmUgdXNlciBkaXNjZXJuYWJsZQotCi0JZGlzcGxheS1uYW1lICAgIHRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhCi0JCQlzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkCi0JCQlieSB0b29scwotCi0JaWNvbiAgICAgICAgICAgIG9wdGlvbmFsIGljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCi0JdGxpYi12ZXJzaW9uICAgIHRoZSB2ZXJzaW9uIG9mIHRoZSB0YWcgbGlicmFyeSBpbXBsZW1lbnRhdGlvbgotCi0Jc2hvcnQtbmFtZSAgICAgIGEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlCi0JCQl1c2VkIGJ5IGEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZQotCQkJbmFtZXMgd2l0aCBhIG1uZW1vbmljIHZhbHVlOyBmb3IgZXhhbXBsZSwKLQkJCXRoZSBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQgcHJlZml4Ci0JCQl2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcwotCi0JdXJpICAgICAgICAgICAgIGEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliCi0KLQl2YWxpZGF0b3IgICAgICAgb3B0aW9uYWwgVGFnTGlicmFyeVZhbGlkYXRvciBpbmZvcm1hdGlvbgotCi0JbGlzdGVuZXIgICAgICAgIG9wdGlvbmFsIGV2ZW50IGxpc3RlbmVyIHNwZWNpZmljYXRpb24KLQotCXRhZyAgICAgICAgICAgICB0YWdzIGluIHRoaXMgdGFnIGxpYnJhcnkKLQotCXRhZy1maWxlICAgICAgICB0YWcgZmlsZXMgaW4gdGhpcyB0YWcgbGlicmFyeQotCi0JZnVuY3Rpb24gICAgICAgIHplcm8gb3IgbW9yZSBFTCBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzCi0JCQl0YWcgbGlicmFyeQotCi0JdGFnbGliLWV4dGVuc2lvbiB6ZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEKLQkJCWluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnbGliLCBmb3IgdG9vbAotCQkJY29uc3VtcHRpb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0bGliLXZlcnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXdleS12ZXJzaW9uVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlc2NyaWJlcyB0aGlzIHZlcnNpb24gKG51bWJlcikgb2YgdGhlIHRhZ2xpYnJhcnkuCi0JICAgIEl0IGlzIGRlc2NyaWJlZCBhcyBhIGRld2V5IGRlY2ltYWwuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNob3J0LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp0bGQtY2Fub25pY2FsLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBhIHNpbXBsZSBkZWZhdWx0IG5hbWUgdGhhdCBjb3VsZCBiZSB1c2VkIGJ5Ci0JICAgIGEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEKLQkgICAgbW5lbW9uaWN2YWx1ZTsgZm9yIGV4YW1wbGUsIGl0IG1heSBiZSB1c2VkIGFzIHRoZQotCSAgICBwcmVmZXJyZWQgcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzLiAgRG8KLQkgICAgbm90IHVzZSB3aGl0ZSBzcGFjZSwgYW5kIGRvIG5vdCBzdGFydCB3aXRoIGRpZ2l0cwotCSAgICBvciB1bmRlcnNjb3JlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJpIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkQW55VVJJVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBhIHB1YmxpYyBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMKLQkgICAgdmVyc2lvbiBvZiB0aGUgdGFnbGlicmFyeS4gIExlYXZlIGl0IGVtcHR5IGlmIGl0Ci0JICAgIGRvZXMgbm90IGFwcGx5LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yIgotCQkgICB0eXBlPSJqYXZhZWU6dmFsaWRhdG9yVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXIiCi0JCSAgIHR5cGU9ImphdmFlZTpsaXN0ZW5lclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWciCi0JCSAgIHR5cGU9ImphdmFlZTp0YWdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWZpbGUiCi0JCSAgIHR5cGU9ImphdmFlZTp0YWdGaWxlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVuY3Rpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliLWV4dGVuc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOnRsZC1leHRlbnNpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGFnbGliIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdAotICAgICAgICAgICAgYWZmZWN0IHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIyLjEiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgRGVzY3JpYmVzIHRoZSBKU1AgdmVyc2lvbiAobnVtYmVyKSB0aGlzIHRhZ2xpYnJhcnkKLQkgIHJlcXVpcmVzIGluIG9yZGVyIHRvIGZ1bmN0aW9uIChkZXdleSBkZWNpbWFsKQotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsaWRhdG9yVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JQSB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZQotCXRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkgaXMKLQlkZWZpbmVkIGJ5IGEgdmFsaWRhdG9yVHlwZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvci1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQKLQkgICAgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcwotCSAgICB0YWcgbGlicmFyeS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotCQkgICB0eXBlPSJqYXZhZWU6cGFyYW0tdmFsdWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgotCSAgICBpbml0aWFsaXphdGlvbiBwYXJhbS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtc2NvcGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgZGVmaW5lcyBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLiAgU2VlCi0JVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiAgVGhlIGFsbG93ZWQgdmFsdWVzIGFyZSwKLQkiTkVTVEVEIiwgIkFUX0JFR0lOIiBhbmQgIkFUX0VORCIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkVTVEVEIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRfQkVHSU4iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVF9FTkQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB2YXJpYWJsZVR5cGUgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZwotCXZhcmlhYmxlcyBkZWZpbmVkIGJ5IHVzaW5nIHRoaXMgdGFnLiAgSXQgaXMgYSAodHJhbnNsYXRpb24KLQl0aW1lKSBlcnJvciBmb3IgYSB0YWcgdGhhdCBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUKLQlzdWJlbGVtZW50cyB0byBoYXZlIGEgVGFnRXh0cmFJbmZvIGNsYXNzIHRoYXQgcmV0dXJucyBhCi0Jbm9uLW51bGwgdmFsdWUgZnJvbSBhIGNhbGwgdG8gZ2V0VmFyaWFibGVJbmZvKCkuCi0KLQlUaGUgc3ViZWxlbWVudHMgb2YgdmFyaWFibGVUeXBlIGFyZSBvZiB0aGUgZm9ybToKLQotCWRlc2NyaXB0aW9uICAgICAgICAgICAgICBPcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGlzCi0JCQkJIHZhcmlhYmxlCi0KLQluYW1lLWdpdmVuICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIG5hbWUgYXMgYSBjb25zdGFudAotCi0JbmFtZS1mcm9tLWF0dHJpYnV0ZSAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZQotCQkJCSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUgd2lsbAotCQkJCSBnaXZlIHRoZSBuYW1lIG9mIHRoZQotCQkJCSB2YXJpYWJsZS4gIE9uZSBvZiBuYW1lLWdpdmVuIG9yCi0JCQkJIG5hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCi0KLQl2YXJpYWJsZS1jbGFzcyAgICAgICAgICAgTmFtZSBvZiB0aGUgY2xhc3Mgb2YgdGhlIHZhcmlhYmxlLgotCQkJCSBqYXZhLmxhbmcuU3RyaW5nIGlzIGRlZmF1bHQuCi0KLQlkZWNsYXJlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQKLQkJCQkgb3Igbm90LiAgVHJ1ZSBpcyB0aGUgZGVmYXVsdC4KLQotCXNjb3BlICAgICAgICAgICAgICAgICAgICBUaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJhaWJsZQotCQkJCSBkZWZpbmVkLiAgTkVTVEVEIGlzIGRlZmF1bHQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWdpdmVuIgotCQkgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG5hbWUgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWZyb20tYXR0cmlidXRlIgotCQkgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlCi0JICAgICAgKHRyYW5zbGF0aW9uLXRpbWUpIHZhbHVlIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZgotCSAgICAgIHRoZSB2YXJpYWJsZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGNsYXNzIGZvciB0aGUgc2NyaXB0aW5nCi0JICAgIHZhcmlhYmxlLiAgVGhlIGRlZmF1bHQgaXMgamF2YS5sYW5nLlN0cmluZy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVjbGFyZSIKLQkJICAgdHlwZT0iamF2YWVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgV2hldGhlciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHRvIGJlIGRlZmluZWQKLQkgICAgb3Igbm90LiAgU2VlIFRhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4gIFRoaXMKLQkgICAgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgInRydWUiIGlzIHRoZSBkZWZhdWx0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjb3BlIgotCQkgICB0eXBlPSJqYXZhZWU6dmFyaWFibGUtc2NvcGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgIk5FU1RFRCIgaXMgdGhlIGRlZmF1bHQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1wYXJ0aWFscmVzcG9uc2VfMl8wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLXBhcnRpYWxyZXNwb25zZV8yXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTI0OWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLXBhcnRpYWxyZXNwb25zZV8yXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLTw/eG1sIHZlcnNpb24gPSAiMS4wIiBlbmNvZGluZyA9ICJVVEYtOCI/PgotCi0KLTx4c2Q6c2NoZW1hCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjIuMCI+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLSAgICAgIAotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgICAKLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbgotICAgICAgRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlCi0gICAgICAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgICB0aGUgTGljZW5zZS4gWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwgb3IKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLSAgICAgIExpY2Vuc2UuCi0gICAgICAKLSAgICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyCi0gICAgICBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gICAgICBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzCi0gICAgICBwcm92aWRlZCBieSBTdW4gaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZSBmaWxlCi0gICAgICB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4gIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nCi0gICAgICBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBbXQotICAgICAgcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgICAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0gICAgICAKLSAgICAgIENvbnRyaWJ1dG9yKHMpOgotICAgICAgCi0gICAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlCi0gICAgICBDRERMIG9yIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nCi0gICAgICAiW0NvbnRyaWJ1dG9yXSBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UKLSAgICAgIGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhIHJlY2lwaWVudCBoYXMgdGhlCi0gICAgICBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUKLSAgICAgIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8gaXRzCi0gICAgICBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIKLSAgICAgIGNvZGUgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZQotICAgICAgb3B0aW9uIGFwcGxpZXMgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2gKLSAgICAgIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0IGhvbGRlci4KLSAgICAgIAotICAgICAgVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgQ0RETCBsaWNlbnNlLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICA8IVtDREFUQVsKLQotICAgICAgICAgICAgVGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKYXZhU2VydmVyIEZhY2VzIChWZXJzaW9uIDIuMCkgIAotICAgICAgICAgICAgUGFydGlhbCBSZXNwb25zZSB1c2VkIGluIEpTRiBBamF4IGZyYW1ld29ya3MuCi0KLSAgICAgICAgICAgIF1dPgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJwYXJ0aWFsLXJlc3BvbnNlIiB0eXBlPSJqYXZhZWU6cGFydGlhbC1yZXNwb25zZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgInBhcnRpYWwtcmVzcG9uc2UiIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIHBhcnRpYWwgCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UgaW5mb3JtYXRpb24gaGllcmFyY2h5LCBhbmQgY29udGFpbnMgbmVzdGVkIGVsZW1lbnRzIGZvciBhbGwKLSAgICAgICAgICAgICAgICBwb3NzaWJsZSBlbGVtZW50cyB0aGF0IGNhbiBleGlzdCBpbiB0aGUgcmVzcG9uc2UuIAotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcnRpYWwtcmVzcG9uc2VUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJwYXJ0aWFsLXJlc3BvbnNlIiBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZWkgcGFydGlhbCAKLSAgICAgICAgICAgICAgICByZXNwb25zZSBpbmZvcm1hdGlvbiBoaWVyYXJjaHksIGFuZCBjb250YWlucyBuZXN0ZWQgZWxlbWVudHMgZm9yIGFsbAotICAgICAgICAgICAgICAgIHBvc3NpYmxlIGVsZW1lbnRzIHRoYXQgY2FuIGV4aXN0IGluIHRoZSByZXNwb25zZS4gCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZXMiIAotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwYXJ0aWFsLXJlc3BvbnNlLWNoYW5nZXNUeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIAotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZGlyZWN0IiAKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGFydGlhbC1yZXNwb25zZS1yZWRpcmVjdFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlcnJvciIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhcnRpYWwtcmVzcG9uc2UtZXJyb3JUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFydGlhbC1yZXNwb25zZS1jaGFuZ2VzVHlwZSI+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVwZGF0ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGFydGlhbC1yZXNwb25zZS11cGRhdGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zZXJ0IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwYXJ0aWFsLXJlc3BvbnNlLWluc2VydFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxldGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhcnRpYWwtcmVzcG9uc2UtZGVsZXRlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhcnRpYWwtcmVzcG9uc2UtYXR0cmlidXRlc1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmFsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJldmFsIiBlbGVtZW50IGVuYWJsZXMgdGhpcyBlbGVtZW50J3MgY29udGVudHMgdG8gYmUgZXhlY3V0ZWQgYXMgSmF2YVNjcmlwdC4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGFydGlhbC1yZXNwb25zZS1leHRlbnNpb25UeXBlIi8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJ0aWFsLXJlc3BvbnNlLXVwZGF0ZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+IAotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJ1cGRhdGUiIGVsZW1lbnQgZW5hYmxlcyBET00gZWxlbWVudHMgbWF0Y2hpbmcgdGhlICJpZCIKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgdG8gYmUgdXBkYXRlZCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGlzIGVsZW1lbnQuIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcnRpYWwtcmVzcG9uc2UtaW5zZXJ0VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4gCi0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAiaW5zZXJ0IiBlbGVtZW50IGVuYWJsZXMgY29udGVudCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00KLSAgICAgICAgICAgICAgICBiZWZvcmUgb3IgYWZ0ZXIgYW4gZXhpc3RpbmcgRE9NIGVsZW1lbnQgYXMgc3BlY2lmaWVkIGJ5IHRoZQotICAgICAgICAgICAgICAgIG5lc3RlZCAiYmVmb3JlIiBvciAiYWZ0ZXIiIGVsZW1lbnRzLiAgVGhlIGVsZW1lbnRzICJiZWZvcmUiIGFuZAotICAgICAgICAgICAgICAgICJhZnRlciIgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAtIG9uZSBvZiB0aGVtIG11c3QgYmUgc3BlY2lmaWVkLiAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmVmb3JlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZnRlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFydGlhbC1yZXNwb25zZS1kZWxldGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPiAKLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJkZWxldGUiIGVsZW1lbnQgZW5hYmxlcyBET00gZWxlbWVudHMgbWF0Y2hpbmcgdGhlICJpZCIKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgdG8gYmUgcmVtb3ZlZC4gCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJ0aWFsLXJlc3BvbnNlLWF0dHJpYnV0ZXNUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPiAKLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJhdHRyaWJ1dGVzIiBlbGVtZW50IGVuYWJsZXMgYXR0cmlidXRlcyBvZiBET00gZWxlbWVudHMgbWF0Y2hpbmcgdGhlICJpZCIKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgdG8gYmUgdXBkYXRlZC4gIElmIHRoaXMgZWxlbWVudCBpcyB1c2VkLCB0aGVuIGl0IG11c3QgY29udGFpbiBhdAotICAgICAgICAgICAgICAgIGxlYXN0IG9uZSAiYXR0cmlidXRlIiBlbGVtZW50LiAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcnRpYWwtcmVzcG9uc2UtcmVkaXJlY3RUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPiAKLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJyZWRpcmVjdCIgZWxlbWVudCBlbmFibGVzIGEgcmVkaXJlY3QgdG8gdGhlIGxvY2F0aW9uIGFzIHNwZWNpZmllZCBieSB0aGUKLSAgICAgICAgICAgICAgICAidXJsIiBhdHRyaWJ1dGUuIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVybCIgdHlwZT0ieHNkOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJ0aWFsLXJlc3BvbnNlLWVycm9yVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4gCi0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAiZXJyb3IiIGVsZW1lbnQgY29udGFpbnMgZXJyb3IgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VydmVyLiAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVycm9yLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3ItbWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcnRpYWwtcmVzcG9uc2UtZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgcGFydGlhbCByZXNwb25zZS4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OTdiOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBwcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzCi1CdW5kbGUtTmFtZS4wID0gSmF2YSBFRSBSZWxhdGVkIFNjaGVtYXMKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWIwNjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCi0gICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgIDwhLS0gQ2F0YWxvZyBDb250cmlidXRpb25zICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFJlZ2lzdGVyIHdlbGwga25vd24gV2ViIERURHMgYW5kIFhTRHMgICAgLS0+Ci0gICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNhdGFsb2dDb250cmlidXRpb25zIj4KLSAgICAgICAgPGNhdGFsb2dDb250cmlidXRpb24gaWQ9ImRlZmF1bHQiPgotCi0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4yLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzFfMi5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy9hcHBsaWNhdGlvbl8xXzIuZHRkIiAvPgotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV8zLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV80LnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl81LnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNi54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl82LnhzZCIgLz4KLQotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIENsaWVudCAxLjIvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfMi5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy9hcHBsaWNhdGlvbi1jbGllbnRfMV8yLmR0ZCIgLz4KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gQ2xpZW50IDEuMy8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzUueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzUueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNi54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfNi54c2QiIC8+Ci0KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgQ29ubmVjdG9yIDEuMC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9jb25uZWN0b3JfMV8wLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2Nvbm5lY3Rvcl8xXzAuZHRkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvY29ubmVjdG9yXzFfNS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9jb25uZWN0b3JfMV81LnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2Nvbm5lY3Rvcl8xXzYueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvY29ubmVjdG9yXzFfNi54c2QiIC8+Ci0KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfMV8xLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL2VqYi1qYXJfMV8xLmR0ZCIgLz4KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9lamItamFyXzJfMC5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9lamItamFyXzJfMC5kdGQiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9lamItamFyXzJfMS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9lamItamFyXzJfMS54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18wLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfM18wLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8zXzEueHNkIiAvPgotCi0KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlLyIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2oyZWVfMV80LnhzZCIgLz4KLQotCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9qMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QiIC8+Ci0KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2oyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZCIgLz4KLQotCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV81LnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2phdmFlZV81LnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlXzYueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvamF2YWVlXzYueHNkIiAvPgotCi0KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMy54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMy54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMi54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzMueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8zLnhzZCIgLz4KLQotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvanNwXzJfMC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qc3BfMl8wLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2pzcF8yXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvanNwXzJfMS54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9qc3BfMl8yLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2pzcF8yXzIueHNkIiAvPgotCi0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjIvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzIuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvd2ViLWFwcF8yLjIuZHRkIiAvPgotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfMy5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiIC8+Ci0KLQotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzQueHNkIiAvPgotCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl81LnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8zXzAueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItY29tbW9uXzNfMC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItY29tbW9uXzNfMC54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mcmFnbWVudF8zXzAueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWZyYWdtZW50XzNfMC54c2QiIC8+Ci0KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMS8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8xXzEuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZCIgLz4KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMi8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItanNwdGFnbGlicmFyeV8yXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMl8xLnhzZCIgLz4KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMC5kdGQiIC8+Ci0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMS8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiAvPgotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiIC8+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtXzFfMC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9vcm1fMV8wLnhzZCIgLz4KLSAgIAotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlXzFfMC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9wZXJzaXN0ZW5jZV8xXzAueHNkIiAvPiAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybV8yXzAueHNkIgotICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9vcm1fMl8wLnhzZCIgLz4KLSAgICAgICAKLSAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfMl8wLnhzZCIKLSAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvcGVyc2lzdGVuY2VfMl8wLnhzZCIgLz4KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRmFjZWxldCBUYWdsaWIgMS4wLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQiLz4KLQotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZWxldHRhZ2xpYnJhcnlfMl8wLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlbGV0dGFnbGlicmFyeV8yXzAueHNkIi8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzJfMC54c2QiLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzdWljb21wb25lbnRfMl8wLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc3VpY29tcG9uZW50XzJfMC54c2QiLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLXBhcnRpYWxyZXNwb25zZV8yXzAueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLXBhcnRpYWxyZXNwb25zZV8yXzAueHNkIi8+Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgPC9jYXRhbG9nQ29udHJpYnV0aW9uPgotCi0gICAgPC9leHRlbnNpb24+Ci0KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0ZjEyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL3czYy9kb20vY3NzLyoqLyoiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWJmNjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWNzc21vZGVsLmphcgotYnVpbGQueG1sCi1kZXYucHJvcGVydGllcwotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwOTc1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9kZWJ1Zy90cmFjZWZpbHRlcj0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjA0NmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWRjMjA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLSNXZWQgTWFyIDI4IDAzOjEzOjUyIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZDU1ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuNTAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnRpbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcno7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGFza3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS51dGlsOyB2ZXJzaW9uPSIzLjgiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS54ZXJjZXM7YnVuZGxlLXZlcnNpb249IlsyLjkuMCwzLjAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS41MDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5O2V4Y2x1ZGU6PSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGUyMmZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGNzc3Byb2ZpbGUvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCi1zb3VyY2UuLiA9IHNyYy8KLSAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NjAzM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jc3MiPgotCTxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy9jc3Mvb3ZlcnZpZXcuaHRtbCI+PC9kZXNjcmlwdGlvbj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLnByb3BlcnRpZXMiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmUiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJDU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzcy1wcm9maWxlLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzLXByb2ZpbGUuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWIzZWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzLXByb2ZpbGUuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTwhLS0gRFREIGZvciBDU1MgTWV0YSBNb2RlbCBQcm9maWxlIC0tPgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPCEtLSBFbnRpdGllcyAtLT4KLQotPCEtLSBuYW1lLWRlZmluaXRpb24JOiBJbiBkZWZpbmluZyBtZXRhIG1vZGVsIG9iamVjdCwgb2JqZWN0IG5hbWUgLS0+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+Ci08IUFUVExJU1QgZGVzY3JpcHRvciAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MxLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhMGVlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLS0+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+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnllbGxvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotPC9jc3MtcHJvZmlsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMzE5ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI5MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLTwhLS08IURPQ1RZUEUgY3NzLXByb2ZpbGUgU1lTVEVNICJjc3MtcHJvZmlsZS5kdGQiID4tLT4KLTxjc3MtcHJvZmlsZT4KLQk8c3R5bGVzaGVldC1kZWY+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+Ci0JCTxrZXl3b3JkIG5hbWU9Im9wZW4tcXVvdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2xvc2UtcXVvdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm8tb3Blbi1xdW90ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJuby1jbG9zZS1xdW90ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjb3VudGVyLWluY3JlbWVudCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYWxsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxzdHJpbmcgbmFtZT0iY291bnRlci1pZGVudGlmaWVyIi8+Ci0JCTxudW1iZXIgbmFtZT0iaW50ZWdlciIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNvdW50ZXItcmVzZXQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImFsbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8c3RyaW5nIG5hbWU9ImNvdW50ZXItaWRlbnRpZmllciIvPgotCQk8bnVtYmVyIG5hbWU9ImludGVnZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjdWUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWJlZm9yZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWFmdGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImN1ZS1hZnRlciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjdWUtYmVmb3JlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImN1cnNvciIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCxpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9InVpIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNyb3NzaGFpciIvPgotCQk8a2V5d29yZCBuYW1lPSJkZWZhdWx0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InBvaW50ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0icHJvZ3Jlc3MiLz4KLQkJPGtleXdvcmQgbmFtZT0ibW92ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJlLXJlc2l6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJuZS1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibnctcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im4tcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNlLXJlc2l6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzdy1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0icy1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0idy1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0idGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJ3YWl0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImhlbHAiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJkaXJlY3Rpb24iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJsdHIiLz4KLQkJPGtleXdvcmQgbmFtZT0icnRsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImRpc3BsYXkiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImFsbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImlubGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmxpbmUtYmxvY2siLz4KLQkJPGtleXdvcmQgbmFtZT0iYmxvY2siLz4KLQkJPGtleXdvcmQgbmFtZT0ibGlzdC1pdGVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InJ1bi1pbiIvPgotCQk8a2V5d29yZCBuYW1lPSJjb21wYWN0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1hcmtlciIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmxpbmUtdGFibGUiLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtcm93LWdyb3VwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLWhlYWRlci1ncm91cCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1mb290ZXItZ3JvdXAiLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtcm93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLWNvbHVtbi1ncm91cCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1jb2x1bW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtY2VsbCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1jYXB0aW9uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZWxldmF0aW9uIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0iYW5nbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iYmVsb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0ibGV2ZWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iYWJvdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlnaGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImVtcHR5LWNlbGxzIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGFibGVzIj4KLQkJPGtleXdvcmQgbmFtZT0ic2hvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJoaWRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZsb2F0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC12YXJpYW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXdlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zaXplIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaW5lLWhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1mYW1pbHkiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2FwdGlvbiIvPgotCQk8a2V5d29yZCBuYW1lPSJpY29uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lbnUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVzc2FnZS1ib3giLz4KLQkJPGtleXdvcmQgbmFtZT0ic21hbGwtY2FwdGlvbiIvPgotCQk8a2V5d29yZCBuYW1lPSJzdGF0dXMtYmFyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJzbGFzaCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1mYW1pbHkiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPHN0cmluZyBuYW1lPSJmYW1pbHktbmFtZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImdlbmVyaWMtZmFtaWx5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1zaXplIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYWJzb2x1dGUtc2l6ZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9InJlbGF0aXZlLXNpemUiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtc2l6ZS1hZGp1c3QiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXN0cmV0Y2giCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IndpZGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5hcnJvd2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVsdHJhLWNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJleHRyYS1jb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNlbWktY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNlbWktZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZXh0cmEtZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0idWx0cmEtZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1zdHlsZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iaXRhbGljIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im9ibGlxdWUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC12YXJpYW50IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJzbWFsbC1jYXBzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtd2VpZ2h0IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJib2xkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvbGRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJsaWdodGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjEwMCIvPgotCQk8a2V5d29yZCBuYW1lPSIyMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iMzAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjQwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI1MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNjAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjcwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI4MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iOTAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImhlaWdodCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGVmdCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGV0dGVyLXNwYWNpbmciCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImxpbmUtaGVpZ2h0IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtcG9zaXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtaW1hZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS1pbWFnZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS1wb3NpdGlvbiIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8a2V5d29yZCBuYW1lPSJpbnNpZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ib3V0c2lkZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPGtleXdvcmQgbmFtZT0iZGlzYyIvPgotCQk8a2V5d29yZCBuYW1lPSJjaXJjbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3F1YXJlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRlY2ltYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGVjaW1hbC1sZWFkaW5nLXplcm8iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItZ3JlZWsiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItbGF0aW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItbGF0aW4iLz4KLQkJPGtleXdvcmQgbmFtZT0iaGVicmV3Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImFybWVuaWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imdlb3JnaWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNqay1pZGVvZ3JhcGhpYyIvPgotCQk8a2V5d29yZCBuYW1lPSJoaXJhZ2FuYSIvPgotCQk8a2V5d29yZCBuYW1lPSJrYXRha2FuYSIvPgotCQk8a2V5d29yZCBuYW1lPSJoaXJhZ2FuYS1pcm9oYSIvPgotCQk8a2V5d29yZCBuYW1lPSJrYXRha2FuYS1pcm9oYSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbiIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJtYXJnaW4td2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLXRvcCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJtYXJnaW4td2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLXJpZ2h0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9Im1hcmdpbi13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tYm90dG9tIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9Im1hcmdpbi13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tbGVmdCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJtYXJnaW4td2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFya2VyLW9mZnNldCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFya3MiCi0JCWluaGVyaXRlZD0ibmEiIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8a2V5d29yZCBuYW1lPSJjcm9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNyb3NzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWF4LWhlaWdodCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWF4LXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtaW4taGVpZ2h0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtaW4td2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im9ycGhhbnMiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im91dGxpbmUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCxpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9InVpIj4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ib3V0bGluZS1jb2xvciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsLGludGVyYWN0aXZlIiBjYXRlZ29yeT0idWkiPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImludmVydCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJvdXRsaW5lLXN0eWxlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwsaW50ZXJhY3RpdmUiIGNhdGVnb3J5PSJ1aSI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im91dGxpbmUtd2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCxpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9InVpIj4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ib3ZlcmZsb3ciCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9InZpc2libGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlkZGVuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNjcm9sbCIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmciCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0icGFkZGluZy13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nLXRvcCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJwYWRkaW5nLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctcmlnaHQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0icGFkZGluZy13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nLWJvdHRvbSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJwYWRkaW5nLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctbGVmdCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJwYWRkaW5nLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZ2UiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPHN0cmluZyBuYW1lPSJwYWdlLWlkZW50aWZpZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFnZS1icmVhay1hZnRlciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iYWx3YXlzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF2b2lkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFnZS1icmVhay1iZWZvcmUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsd2F5cyIvPgotCQk8a2V5d29yZCBuYW1lPSJhdm9pZCIvPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZ2UtYnJlYWstaW5zaWRlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImF2b2lkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGF1c2UiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9InRpbWUiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhdXNlLWFmdGVyIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJ0aW1lIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYXVzZS1iZWZvcmUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9InRpbWUiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBpdGNoIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0iZnJlcXVlbmN5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IngtbG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlnaCIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LWhpZ2giLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGl0Y2gtcmFuZ2UiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGxheS1kdXJpbmciCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1peCIvPgotCQk8a2V5d29yZCBuYW1lPSJyZXBlYXQiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBvc2l0aW9uIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJzdGF0aWMiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVsYXRpdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iYWJzb2x1dGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZml4ZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icXVvdGVzIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxzdHJpbmcgbmFtZT0iYW55Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icmljaG5lc3MiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icmlnaHQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InNpemUiCi0JCWluaGVyaXRlZD0ibmEiIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InBvcnRyYWl0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxhbmRzY2FwZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzcGVhayIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzcGVsbC1vdXQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ic3BlYWstaGVhZGVyIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJ0YWJsZXMiPgotCQk8a2V5d29yZCBuYW1lPSJvbmNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsd2F5cyIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzcGVhay1udW1lcmFsIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImRpZ2l0cyIvPgotCQk8a2V5d29yZCBuYW1lPSJjb250aW51b3VzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InNwZWFrLXB1bmN0dWF0aW9uIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzcGVlY2gtcmF0ZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LXNsb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0ic2xvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0iZmFzdCIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LWZhc3QiLz4KLQkJPGtleXdvcmQgbmFtZT0iZmFzdGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNsb3dlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzdHJlc3MiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGFibGUtbGF5b3V0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0YWJsZXMiPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZpeGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtYWxpZ24iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJjZW50ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ianVzdGlmeSIvPgotCQk8c3RyaW5nIG5hbWU9ImFueSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWRlY29yYXRpb24iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVuZGVybGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJvdmVybGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsaW5lLXRocm91Z2giLz4KLQkJPGtleXdvcmQgbmFtZT0iYmxpbmsiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1pbmRlbnQiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtc2hhZG93IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC10cmFuc2Zvcm0iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0iY2FwaXRhbGl6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlcmNhc2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXJjYXNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idG9wIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ1bmljb2RlLWJpZGkiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJlbWJlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJiaWRpLW92ZXJyaWRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZlcnRpY2FsLWFsaWduIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJiYXNlbGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzdWIiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3VwZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0idG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRleHQtdG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1pZGRsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJib3R0b20iLz4KLQkJPGtleXdvcmQgbmFtZT0idGV4dC1ib3R0b20iLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZpc2liaWxpdHkiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9InZpc2libGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlkZGVuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvbGxhcHNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZvaWNlLWZhbWlseSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8c3RyaW5nIG5hbWU9InNwZWNpZmljLXZvaWNlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iZ2VuZXJpYy12b2ljZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ2b2x1bWUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNpbGVudCIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LXNvZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic29mdCIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG91ZCIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LWxvdWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id2hpdGUtc3BhY2UiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InByZSIvPgotCQk8a2V5d29yZCBuYW1lPSJwcmUtbGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJwcmUtd3JhcCIvPgotCQk8a2V5d29yZCBuYW1lPSJub3dyYXAiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id2lkb3dzIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxudW1iZXIgbmFtZT0iaW50ZWdlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id29yZC1zcGFjaW5nIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ6LWluZGV4IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxudW1iZXIgbmFtZT0iaW50ZWdlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0KLQk8IS0tIGRlc2NyaXB0b3IgZGVmaW5pdGlvbiA6IFRoZXNlIGFyZSBmb3IgQGZvbnQtZmFjZSAtLT4KLQotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJhc2NlbnQiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImJhc2VsaW5lIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJiYm94Ij4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImNhcC1oZWlnaHQiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImNlbnRlcmxpbmUiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImRlZmluaXRpb24tc3JjIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImRlc2NlbnQiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImZvbnQtZmFtaWx5Ij4KLQkJPHN0cmluZyBuYW1lPSJmYW1pbHktbmFtZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImdlbmVyaWMtZmFtaWx5Ii8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJmb250LXNpemUiPgotCQk8a2V5d29yZCBuYW1lPSJhbGwiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImZvbnQtc3RyZXRjaCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsbCIvPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0idWx0cmEtY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImV4dHJhLWNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJjb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2VtaS1jb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2VtaS1leHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJleHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJleHRyYS1leHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJ1bHRyYS1leHBhbmRlZCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZm9udC1zdHlsZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsbCIvPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iaXRhbGljIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im9ibGlxdWUiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImZvbnQtdmFyaWFudCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJzbWFsbC1jYXBzIi8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJmb250LXdlaWdodCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsbCIvPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm9sZCIvPgotCQk8a2V5d29yZCBuYW1lPSIxMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iMjAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjMwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI0MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNTAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjYwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI3MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iODAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjkwMCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ibWF0aGxpbmUiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InBhbm9zZS0xIj4KLQkJPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ic2xvcGUiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InNyYyI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGZ1bmN0aW9uIG5hbWU9ImZvcm1hdCIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImZvbnQtZmFjZS1uYW1lIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ic3RlbWgiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InN0ZW12Ij4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJ0b3BsaW5lIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJ1bmljb2RlLXJhbmdlIj4KLQkJPHN0cmluZyBuYW1lPSJ1cmFuZ2UiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJ1bml0cy1wZXItZW0iPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9IndpZHRocyI+Ci0JCTxzdHJpbmcgbmFtZT0idXJhbmdlIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ieC1oZWlnaHQiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0KLQk8IS0tIGNvbnRhaW5lciBkZWZpbml0aW9uIDogQ29udGFpbmVyIGlzIHRoZSBsdW1wIG9mIHZhbHVlcy4KLQlJdCBjYW4gYmUgdXNlZCBsaWtlIG1hY3Jvcy4gLS0+Ci0gICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iYWJzb2x1dGUtc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Inh4LXNtYWxsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Ingtc21hbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ic21hbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImxhcmdlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9IngtbGFyZ2UiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieHgtbGFyZ2UiLz4KLSAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iYm9yZGVyLXN0eWxlIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJoaWRkZW4iLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZG90dGVkIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImRhc2hlZCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJzb2xpZCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJkb3VibGUiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZ3Jvb3ZlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InJpZGdlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Imluc2V0Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Im91dHNldCIvPgotICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJib3JkZXItd2lkdGgiPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ0aGluIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ0aGljayIvPgotICAgICAgICA8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotICAgIDwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJjb2xvciI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFxdWEiLz4KLQkJPGtleXdvcmQgbmFtZT0iYmxhY2siLz4KLQkJPGtleXdvcmQgbmFtZT0iYmx1ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJmdWNoc2lhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImdyYXkiLz4KLQkJPGtleXdvcmQgbmFtZT0iZ3JlZW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibGltZSIvPgotCQk8a2V5d29yZCBuYW1lPSJtYXJvb24iLz4KLQkJPGtleXdvcmQgbmFtZT0ibmF2eSIvPgotCQk8a2V5d29yZCBuYW1lPSJvbGl2ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJvcmFuZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0icHVycGxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InJlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJzaWx2ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0idGVhbCIvPgotCQk8a2V5d29yZCBuYW1lPSJ3aGl0ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ5ZWxsb3ciLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJzeXN0ZW0tY29sb3IiLz4KLQkJPGZ1bmN0aW9uIG5hbWU9InJnYiIvPgotCQk8bnVtYmVyIG5hbWU9Imhhc2giLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0iZ2VuZXJpYy1mYW1pbHkiPgotCQk8a2V5d29yZCBuYW1lPSJzZXJpZiIvPgotCQk8a2V5d29yZCBuYW1lPSJzYW5zLXNlcmlmIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImN1cnNpdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZmFudGFzeSIvPgotCQk8a2V5d29yZCBuYW1lPSJtb25vc3BhY2UiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0iZm9udC1mYWNlLW5hbWUiPgotCQk8ZnVuY3Rpb24gbmFtZT0ibG9jYWwiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0iZ2VuZXJpYy12b2ljZSI+Ci0JCTxrZXl3b3JkIG5hbWU9Im1hbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZmVtYWxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNoaWxkIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9Im1hcmdpbi13aWR0aCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9InBhZGRpbmctd2lkdGgiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0icmVsYXRpdmUtc2l6ZSI+Ci0JCTxrZXl3b3JkIG5hbWU9InNtYWxsZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGFyZ2VyIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9InNoYXBlIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InJlY3QiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0ic3lzdGVtLWNvbG9yIj4KLQkJPGtleXdvcmQgbmFtZT0iQWN0aXZlQm9yZGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkFjdGl2ZUNhcHRpb24iLz4KLQkJPGtleXdvcmQgbmFtZT0iQXBwV29ya3NwYWNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkJhY2tncm91bmQiLz4KLQkJPGtleXdvcmQgbmFtZT0iQnV0dG9uRmFjZSIvPgotCQk8a2V5d29yZCBuYW1lPSJCdXR0b25IaWdobGlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iQnV0dG9uU2hhZG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkJ1dHRvblRleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iQ2FwdGlvblRleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iR3JheVRleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iSGlnaGxpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkhpZ2hsaWdodFRleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iSW5hY3RpdmVCb3JkZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iSW5hY3RpdmVDYXB0aW9uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkluYWN0aXZlQ2FwdGlvblRleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iSW5mb0JhY2tncm91bmQiLz4KLQkJPGtleXdvcmQgbmFtZT0iSW5mb1RleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iTWVudSIvPgotCQk8a2V5d29yZCBuYW1lPSJNZW51VGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJTY3JvbGxiYXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iVGhyZWVERGFya1NoYWRvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJUaHJlZURGYWNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IlRocmVlREhpZ2hsaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJUaHJlZURMaWdodFNoYWRvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJUaHJlZURTaGFkb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0iV2luZG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IldpbmRvd0ZyYW1lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IldpbmRvd1RleHQiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0KLQk8IS0tIGNhdGVnb3J5IGRlZmluaXRpb24gOiBUaGlzIGlzIHVzZWQgdG8gY2F0ZWdvcml6ZSBwcm9wZXJ0aWVzCi0JaW4gUHJvcGVydGllcyBWaWV3LiAtLT4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImF1cmFsIj4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLmF1cmFsLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJib3giPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYuYm94LmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYuY29sb3JhbmRiYWNrZ3JvdW5kLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJjb250ZW50Ij4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLmNvbnRlbnQuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImZvbnQiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYuZm9udC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0icGFnZSI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi5wYWdlLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJ0YWJsZXMiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYudGFibGVzLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJ0ZXh0Ij4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLnRleHQuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9InVpIj4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLnVpLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJ2aXN1YWwiPgotPCEtLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLnZpc3VhbC5jYXB0aW9uPC9jYXB0aW9uPi0tPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYudmlzdWFsLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JCi0JPCEtLSBmdW5jdGlvbiBkZWZpbml0aW9uIC0tPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0iYXR0ciI+Ci0JCTxmdW5jdGlvbi12YWx1ZT5hdHRyPC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9ImNvdW50ZXIiPgotCQk8ZnVuY3Rpb24tdmFsdWU+Y291bnRlcjwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJyZWN0Ij4KLQkJPGZ1bmN0aW9uLXZhbHVlPnJlY3Q8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0icmdiIj4KLQkJPGZ1bmN0aW9uLXZhbHVlPnJnYjwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJ1cmkiPgotCQk8ZnVuY3Rpb24tdmFsdWU+dXJsPC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9ImZvcm1hdCI+Ci0JCTxmdW5jdGlvbi12YWx1ZT5mb3JtYXQ8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0ibG9jYWwiPgotCQk8ZnVuY3Rpb24tdmFsdWU+bG9jYWw8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCi0JPCEtLSBudW1iZXIgZGVmaW5pdGlvbiA6IFdoYXQgdW5pdCB0eXBlcyBiZSBhY2NlcHRhYmxlIGZvciBlYWNoCi0JbnVtYmVyIHR5cGU/IC0tPgotICAgIDxudW1iZXItZGVmIG5hbWU9ImFuZ2xlIj4KLSAgICAgICAgPHVuaXQgbmFtZT0iZGVnIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImdyYWQiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0icmFkIi8+Ci0gICAgPC9udW1iZXItZGVmPgotICAgIDxudW1iZXItZGVmIG5hbWU9ImZyZXF1ZW5jeSI+Ci0gICAgICAgIDx1bml0IG5hbWU9Imh6Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImtoeiIvPgotICAgIDwvbnVtYmVyLWRlZj4KLSAgICA8bnVtYmVyLWRlZiBuYW1lPSJoYXNoIj4KLSAgICAgICAgPHVuaXQgbmFtZT0iaGFzaCIvPgotICAgIDwvbnVtYmVyLWRlZj4KLQk8bnVtYmVyLWRlZiBuYW1lPSJpbnRlZ2VyIj4KLQk8L251bWJlci1kZWY+Ci0gICAgPG51bWJlci1kZWYgbmFtZT0ibGVuZ3RoIj4KLSAgICAgICAgPHVuaXQgbmFtZT0iZW0iLz4KLSAgICAgICAgPHVuaXQgbmFtZT0iZXgiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0icHgiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0iaW4iLz4KLSAgICAgICAgPHVuaXQgbmFtZT0iY20iLz4KLSAgICAgICAgPHVuaXQgbmFtZT0ibW0iLz4KLSAgICAgICAgPHVuaXQgbmFtZT0icHQiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0icGMiLz4KLSAgICA8L251bWJlci1kZWY+Ci0JPG51bWJlci1kZWYgbmFtZT0ibnVtYmVyIj4KLQk8L251bWJlci1kZWY+Ci0JPG51bWJlci1kZWYgbmFtZT0icGVyY2VudGFnZSI+Ci0JCTx1bml0IG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L251bWJlci1kZWY+Ci0JPG51bWJlci1kZWYgbmFtZT0idGltZSI+Ci0JCTx1bml0IG5hbWU9Im1zIi8+Ci0JCTx1bml0IG5hbWU9InMiLz4KLQk8L251bWJlci1kZWY+Ci0KLQk8dW5pdC1kZWYgbmFtZT0iY20iPgotCQk8dW5pdC12YWx1ZT5jbTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJkZWciPgotCQk8dW5pdC12YWx1ZT5kZWc8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iZW0iPgotCQk8dW5pdC12YWx1ZT5lbTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJleCI+Ci0JCTx1bml0LXZhbHVlPmV4PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImdyYWQiPgotCQk8dW5pdC12YWx1ZT5ncmFkPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9Imhhc2giPgotCQk8dW5pdC12YWx1ZT4jPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9Imh6Ij4KLQkJPHVuaXQtdmFsdWU+SHo8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iaW4iPgotCQk8dW5pdC12YWx1ZT5pbjwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJraHoiPgotCQk8dW5pdC12YWx1ZT5rSHo8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0ibW0iPgotCQk8dW5pdC12YWx1ZT5tbTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJtcyI+Ci0JCTx1bml0LXZhbHVlPm1zPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InBjIj4KLQkJPHVuaXQtdmFsdWU+cGM8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icGVyY2VudGFnZSI+Ci0JCTx1bml0LXZhbHVlPiU8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icHQiPgotCQk8dW5pdC12YWx1ZT5wdDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJweCI+Ci0JCTx1bml0LXZhbHVlPnB4PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InJhZCI+Ci0JCTx1bml0LXZhbHVlPnJhZDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJzIj4KLQkJPHVuaXQtdmFsdWU+czwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCi0gICAgPCEtLSBrZXl3b3JkcyA6IHN0cmluZyBjb25zdGFudHMgKHRoaXMgaXMgbGFzdCBwYXJ0Li4pIC0tPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSIxMDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT4xMDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iMjAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+MjAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjMwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjMwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI0MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT40MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNTAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NTAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjYwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjYwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI3MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT43MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iODAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ODAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjkwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjkwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhYm92ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmFib3ZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImFic29sdXRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YWJzb2x1dGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQWN0aXZlQm9yZGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QWN0aXZlQm9yZGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkFjdGl2ZUNhcHRpb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5BY3RpdmVDYXB0aW9uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImFsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmFsbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhbHdheXMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hbHdheXM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQXBwV29ya3NwYWNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QXBwV29ya3NwYWNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImFxdWEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hcXVhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImFybWVuaWFuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YXJtZW5pYW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYXV0byI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmF1dG88L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYXZvaWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hdm9pZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJCYWNrZ3JvdW5kIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QmFja2dyb3VuZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJiYXNlbGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJhc2VsaW5lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJlaGluZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJlaGluZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJiZWxvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJlbG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJpZGktb3ZlcnJpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5iaWRpLW92ZXJyaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsYWNrIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmxhY2s8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmxpbmsiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibGluazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibG9jayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJsb2NrPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsdWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibHVlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJvbGQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib2xkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJvbGRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJvbGRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib3RoIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym90aDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib3R0b20iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib3R0b208L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQnV0dG9uRmFjZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkJ1dHRvbkZhY2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQnV0dG9uSGlnaGxpZ2h0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QnV0dG9uSGlnaGxpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkJ1dHRvblNoYWRvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkJ1dHRvblNoYWRvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJCdXR0b25UZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QnV0dG9uVGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjYXBpdGFsaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2FwaXRhbGl6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjYXB0aW9uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2FwdGlvbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJDYXB0aW9uVGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkNhcHRpb25UZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNlbnRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNlbnRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjZW50ZXItbGVmdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNlbnRlci1sZWZ0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNlbnRlci1yaWdodCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNlbnRlci1yaWdodDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjaGlsZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNoaWxkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNpcmNsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNpcmNsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjamstaWRlb2dyYXBoaWMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jamstaWRlb2dyYXBoaWM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2xvc2UtcXVvdGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jbG9zZS1xdW90ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjb2RlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y29kZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjb25kZW5zZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jb25kZW5zZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY29sbGFwc2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jb2xsYXBzZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjb21wYWN0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y29tcGFjdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjb250aW51b3VzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y29udGludW91czwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjcm9wIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y3JvcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjcm9zcyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNyb3NzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNyb3NzaGFpciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNyb3NzaGFpcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjdXJzaXZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y3Vyc2l2ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkYXNoZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kYXNoZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGVjaW1hbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRlY2ltYWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGVjaW1hbC1sZWFkaW5nLXplcm8iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kZWNpbWFsLWxlYWRpbmctemVybzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkZWZhdWx0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGVmYXVsdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkaWdpdHMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kaWdpdHM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGlzYyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRpc2M8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZG90dGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZG90dGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRvdWJsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRvdWJsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJlLXJlc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmUtcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImVtYmVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZW1iZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZXhwYW5kZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5leHBhbmRlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJleHRyYS1jb25kZW5zZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5leHRyYS1jb25kZW5zZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZXh0cmEtZXhwYW5kZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5leHRyYS1leHBhbmRlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmYW50YXN5Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmFudGFzeTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmYXItbGVmdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZhci1sZWZ0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZhci1yaWdodCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZhci1yaWdodDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmYXN0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmFzdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmYXN0ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mYXN0ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmVtYWxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmVtYWxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZpeGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Zml4ZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZnVjaHNpYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZ1Y2hzaWE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZ2VvcmdpYW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5nZW9yZ2lhbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJncmF5Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Z3JheTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJHcmF5VGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkdyYXlUZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImdyZWVuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Z3JlZW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZ3Jvb3ZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Z3Jvb3ZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhlYnJldyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhlYnJldzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoZWxwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGVscDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoaWRkZW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oaWRkZW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGlkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGlnaCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhpZ2g8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iSGlnaGxpZ2h0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+SGlnaGxpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkhpZ2hsaWdodFRleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5IaWdobGlnaHRUZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhpZ2hlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhpZ2hlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoaXJhZ2FuYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhpcmFnYW5hPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhpcmFnYW5hLWlyb2hhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGlyYWdhbmEtaXJvaGE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaWNvbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmljb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iSW5hY3RpdmVCb3JkZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5JbmFjdGl2ZUJvcmRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJJbmFjdGl2ZUNhcHRpb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5JbmFjdGl2ZUNhcHRpb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iSW5hY3RpdmVDYXB0aW9uVGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkluYWN0aXZlQ2FwdGlvblRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iSW5mb0JhY2tncm91bmQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5JbmZvQmFja2dyb3VuZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJJbmZvVGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkluZm9UZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImluaGVyaXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbmhlcml0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImlubGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmlubGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbmxpbmUtYmxvY2siPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbmxpbmUtYmxvY2s8L2tleXdvcmQtdmFsdWU+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+b3Blbi1xdW90ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvcmFuZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vcmFuZ2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3V0c2V0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b3V0c2V0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im91dHNpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vdXRzaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im92ZXJsaW5lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b3ZlcmxpbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icG9pbnRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnBvaW50ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icG9ydHJhaXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5wb3J0cmFpdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwcmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5wcmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icHJlLWxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5wcmUtbGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwcmUtd3JhcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnByZS13cmFwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InByb2dyZXNzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cHJvZ3Jlc3M8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icHVycGxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cHVycGxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZWxhdGl2ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlbGF0aXZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlcGVhdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlcGVhdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZXBlYXQteCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlcGVhdC14PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlcGVhdC15Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVwZWF0LXk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmlkZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yaWRnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyaWdodCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJpZ2h0LXNpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yaWdodC1zaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJpZ2h0d2FyZHMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yaWdodHdhcmRzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJ0bCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJ0bDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJydW4taW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ydW4taW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icy1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zLXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzYW5zLXNlcmlmIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2Fucy1zZXJpZjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzY3JvbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zY3JvbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iU2Nyb2xsYmFyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+U2Nyb2xsYmFyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNlLXJlc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNlLXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzZW1pLWNvbmRlbnNlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNlbWktY29uZGVuc2VkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNlbWktZXhwYW5kZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zZW1pLWV4cGFuZGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNlcGFyYXRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2VwYXJhdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2VyaWYiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zZXJpZjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzaG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2hvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzaWxlbnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zaWxlbnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2lsdmVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2lsdmVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNsb3dlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNsb3dlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbWFsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNtYWxsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsLWNhcHMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbC1jYXBzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsLWNhcHRpb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbC1jYXB0aW9uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNvZnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zb2Z0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNvbGlkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c29saWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3BlbGwtb3V0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3BlbGwtb3V0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNxdWFyZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNxdWFyZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdGF0aWMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zdGF0aWM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3RhdHVzLWJhciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnN0YXR1cy1iYXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3ViIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3ViPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InN1cGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3VwZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3ctcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3ctcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtY2FwdGlvbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLWNhcHRpb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtY2VsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLWNlbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtY29sdW1uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtY29sdW1uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlLWNvbHVtbi1ncm91cCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLWNvbHVtbi1ncm91cDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1mb290ZXItZ3JvdXAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZS1mb290ZXItZ3JvdXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtaGVhZGVyLWdyb3VwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtaGVhZGVyLWdyb3VwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlLXJvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLXJvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1yb3ctZ3JvdXAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZS1yb3ctZ3JvdXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGVhbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRlYWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGV4dC10b3AiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50ZXh0LXRvcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0ZXh0LWJvdHRvbSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRleHQtYm90dG9tPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRoaWNrIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGhpY2s8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGhpbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRoaW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iVGhyZWVERGFya1NoYWRvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPlRocmVlRERhcmtTaGFkb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iVGhyZWVERmFjZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPlRocmVlREZhY2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iVGhyZWVESGlnaGxpZ2h0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+VGhyZWVESGlnaGxpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IlRocmVlRExpZ2h0U2hhZG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+VGhyZWVETGlnaHRTaGFkb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iVGhyZWVEU2hhZG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+VGhyZWVEU2hhZG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRvcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRvcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0cmFuc3BhcmVudCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRyYW5zcGFyZW50PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVsdHJhLWNvbmRlbnNlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVsdHJhLWNvbmRlbnNlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1bHRyYS1leHBhbmRlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVsdHJhLWV4cGFuZGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVuZGVybGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVuZGVybGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cHBlci1hbHBoYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwcGVyLWFscGhhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVwcGVyLWxhdGluIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dXBwZXItbGF0aW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idXBwZXItcm9tYW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51cHBlci1yb21hbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cHBlcmNhc2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51cHBlcmNhc2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idmlzaWJsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnZpc2libGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idy1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT53LXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ3YWl0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+d2FpdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ3aGl0ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPndoaXRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IndpZGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+d2lkZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iV2luZG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+V2luZG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IldpbmRvd0ZyYW1lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+V2luZG93RnJhbWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iV2luZG93VGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPldpbmRvd1RleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1mYXN0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1mYXN0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IngtaGlnaCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtaGlnaDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LWxhcmdlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1sYXJnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LWxvdWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LWxvdWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1sb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LWxvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LXNsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LXNsb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1zbWFsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtc21hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1zb2Z0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1zb2Z0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Inh4LXNtYWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eHgtc21hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieHgtbGFyZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54eC1sYXJnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ5ZWxsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT55ZWxsb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLTwvY3NzLXByb2ZpbGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLW1vYmlsZTFfMC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ1ZDc2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLTwhLS08IURPQ1RZUEUgY3NzLXByb2ZpbGUgU1lTVEVNICJjc3MtcHJvZmlsZS5kdGQiID4tLT4KLTxjc3MtcHJvZmlsZT4KLQk8cHJvZmlsZS1pbXBvcnQgbmFtZT0iY3NzcHJvZmlsZS1jc3MyLnhtbCIvPgotCTxzdHlsZXNoZWV0LWRlZj4KLQkJPGRlc2NyaXB0aW9uPiVtb2JpbGUxXzAuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8Y2hhcnNldC1ydWxlLz4KLQkJPGltcG9ydC1ydWxlLz4KLQkJPG1lZGlhLXJ1bGUvPgotCQk8c3R5bGUtcnVsZS8+Ci0JPC9zdHlsZXNoZWV0LWRlZj4KLQotCTwhLS0gV2hpY2ggcHJvcGVydGllcyBjYW4gc3R5bGUgcnVsZSBpbmNsdWRlID8gLS0+Ci0JPCEtLSB1c2luZyAib3ZlcndyaXRlIiBtZXRob2Q6IG9ubHkgZGlzYWJsZWQgcHJvcGVydGllcyBhcmUgd3JpdHRlbi4gLS0+Ci0KLQk8c3R5bGUtcnVsZS1kZWYgb3ZlcndyaXRlPSJ0cnVlIj4KLQkJPHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZT0iY2hpbGQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9ImFkamFjZW50IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJhdHRyaWJ1dGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0iZmlyc3QtY2hpbGQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0ibGluayIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJhY3RpdmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0ibGFuZyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImF6aW11dGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItY29sbGFwc2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3BhY2luZyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvdHRvbSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNhcHRpb24tc2lkZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNsaXAiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb250ZW50IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY291bnRlci1pbmNyZW1lbnQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb3VudGVyLXJlc2V0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWFmdGVyIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1cnNvciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRpcmVjdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImVsZXZhdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImVtcHR5LWNlbGxzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zaXplLWFkanVzdCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc3RyZXRjaCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxlZnQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsZXR0ZXItc3BhY2luZyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxpbmUtaGVpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFya2VyLW9mZnNldCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmtzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWF4LWhlaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1heC13aWR0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1pbi1oZWlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtaW4td2lkdGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvcnBoYW5zIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtY29sb3IiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLXN0eWxlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS13aWR0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im92ZXJmbG93IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstYWZ0ZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstaW5zaWRlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGF1c2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYXVzZS1hZnRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhdXNlLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBpdGNoIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGl0Y2gtcmFuZ2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbGF5LWR1cmluZyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBvc2l0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icXVvdGVzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icmljaG5lc3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJyaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNpemUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhayIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrLWhlYWRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrLW51bWVyYWwiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhay1wdW5jdHVhdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWVjaC1yYXRlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3RyZXNzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idGFibGUtbGF5b3V0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC1zaGFkb3ciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0b3AiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ1bmljb2RlLWJpZGkiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2b2ljZS1mYW1pbHkiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2b2x1bWUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3aWRvd3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3b3JkLXNwYWNpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ6LWluZGV4IiBlbmFibGVkPSJmYWxzZSIvPgotCTwvc3R5bGUtcnVsZS1kZWY+Ci0KLQk8IS0tIHByb3BlcnR5IGRlZmluaXRpb24gLS0+Ci0JPCEtLSB1c2luZyAicmVkaWZpbmUiIG1ldGhvZDogaWYgIm92ZXJ3cml0ZSIgYXR0cmlidXRlIGlzIHNldCB0bwotCSJmYWxzZSIJb3Igbm90IHNldCwgaXQgbWVhbnMgdGhlIG5vZGUgaXMgY2xlYW5seSByZWRpZmluZWQgLS0+Ci0KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtYXR0YWNobWVudCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ic2Nyb2xsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImRpc3BsYXkiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImFsbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImlubGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJibG9jayIvPgotCQk8a2V5d29yZCBuYW1lPSJsaXN0LWl0ZW0iLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS10eXBlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImRpc2MiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2lyY2xlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNxdWFyZSIvPgotCQk8a2V5d29yZCBuYW1lPSJkZWNpbWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLXJvbWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLXJvbWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLWdyZWVrIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLWFscGhhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLWFscGhhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1hbGlnbiIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNlbnRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJqdXN0aWZ5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtZGVjb3JhdGlvbiIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0idW5kZXJsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZlcnRpY2FsLWFsaWduIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJiYXNlbGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzdWIiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3VwZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCi0JPCEtLSBjb250YWluZXIgZGVmaW5pdGlvbiA6IENvbnRhaW5lciBpcyB0aGUgbHVtcCBvZiB2YWx1ZXMuCi0JSXQgY2FuIGJlIHVzZWQgbGlrZSBtYWNyb3MuIC0tPgotCTxjb250YWluZXItZGVmIG5hbWU9ImNvbG9yIiBvdmVyd3JpdGU9InRydWUiPgotCQk8Y29udGFpbmVyIG5hbWU9InN5c3RlbS1jb2xvciIgZW5hYmxlZD0iZmFsc2UiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci08L2Nzcy1wcm9maWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS13YXAueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLXdhcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDAxYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLXdhcC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLS0+Ci08IS0tPCFET0NUWVBFIGNzcy1wcm9maWxlIFNZU1RFTSAiY3NzLXByb2ZpbGUuZHRkIiA+LS0+Ci08Y3NzLXByb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlLWltcG9ydCBuYW1lPSJjc3Nwcm9maWxlLWNzczIueG1sIi8+Ci0gICAgICAgIDxzdHlsZXNoZWV0LWRlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+JXdhcC5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGNoYXJzZXQtcnVsZS8+Ci0gICAgICAgICAgICAgICAgPGltcG9ydC1ydWxlLz4KLSAgICAgICAgICAgICAgICA8bWVkaWEtcnVsZS8+Ci0gICAgICAgICAgICAgICAgPHN0eWxlLXJ1bGUvPgotICAgICAgICA8L3N0eWxlc2hlZXQtZGVmPgotCi0gICAgICAgIDwhLS0gV2hpY2ggcHJvcGVydGllcyBjYW4gc3R5bGUgcnVsZSBpbmNsdWRlID8gLS0+Ci0gICAgICAgIDwhLS0gdXNpbmcgIm92ZXJ3cml0ZSIgbWV0aG9kOiBvbmx5IGRpc2FibGVkIHByb3BlcnRpZXMgYXJlIHdyaXR0ZW4uIC0tPgotCi0gICAgICAgIDxzdHlsZS1ydWxlLWRlZiBvdmVyd3JpdGU9InRydWUiPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhemltdXRoIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3JkZXItY29sbGFwc2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zcGFjaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b20iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNhcHRpb24tc2lkZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2xpcCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29udGVudCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY3VlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjdWUtYWZ0ZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImN1ZS1iZWZvcmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImN1cnNvciIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGlyZWN0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbGV2YXRpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVtcHR5LWNlbGxzIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb250LXNpemUtYWRqdXN0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb250LXN0cmV0Y2giIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxlZnQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxldHRlci1zcGFjaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsaW5lLWhlaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWFya2VyLW9mZnNldCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWFya3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heC1oZWlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heC13aWR0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWluLWhlaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWluLXdpZHRoIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcnBoYW5zIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLWNvbG9yIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLXN0eWxlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLXdpZHRoIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdmVyZmxvdyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFnZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1hZnRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1iZWZvcmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstaW5zaWRlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYXVzZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGF1c2UtYWZ0ZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhdXNlLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGl0Y2giIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBpdGNoLXJhbmdlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbGF5LWR1cmluZyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icG9zaXRpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InF1b3RlcyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmljaG5lc3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaXplIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGVhayIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3BlYWstaGVhZGVyIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGVhay1udW1lcmFsIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGVhay1wdW5jdHVhdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3BlZWNoLXJhdGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0cmVzcyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFibGUtbGF5b3V0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LXNoYWRvdyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1bmljb2RlLWJpZGkiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZvaWNlLWZhbWlseSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idm9sdW1lIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ3aWRvd3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IndvcmQtc3BhY2luZyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iei1pbmRleCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iLXdhcC1tYXJxdWVlLXN0eWxlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Ii13YXAtbWFycXVlZS1sb29wIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Ii13YXAtbWFycXVlZS1kaXIiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iLXdhcC1tYXJxdWVlLXNwZWVkIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Ii13YXAtYWNjZXNza2V5Ii8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Ii13YXAtaW5wdXQtZm9ybWF0Ii8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Ii13YXAtaW5wdXQtcmVxdWlyZWQiLz4KLSAgICAgICAgPC9zdHlsZS1ydWxlLWRlZj4KLQotICAgICAgICA8IS0tIHByb3BlcnR5IGRlZmluaXRpb24gLS0+Ci0gICAgICAgIDwhLS0gdXNpbmcgInJlZGlmaW5lIiBtZXRob2Q6IGlmICJvdmVyd3JpdGUiIGF0dHJpYnV0ZSBpcyBzZXQgdG8KLSAgICAgICAgImZhbHNlIiBvciBub3Qgc2V0LCBpdCBtZWFucyB0aGUgbm9kZSBpcyBjbGVhbmx5IHJlZGlmaW5lZCAtLT4KLQotICAgICAgICA8cHJvcGVydHktZGVmIG5hbWU9ImRpc3BsYXkiCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYWxsIiBjYXRlZ29yeT0idmlzdWFsIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmxpbmUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJibG9jayIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Imxpc3QtaXRlbSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Ii13YXAtbWFycXVlZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS10eXBlIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJkaXNjIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY2lyY2xlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic3F1YXJlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZGVjaW1hbCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Imxvd2VyLXJvbWFuIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idXBwZXItcm9tYW4iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsb3dlci1hbHBoYSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InVwcGVyLWFscGhhIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1hbGlnbiIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY2VudGVyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ianVzdGlmeSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1kZWNvcmF0aW9uIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ1bmRlcmxpbmUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJibGluayIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0idmVydGljYWwtYWxpZ24iCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJiYXNlbGluZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InN1YiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InN1cGVyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idG9wIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibWlkZGxlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYm90dG9tIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9Ii13YXAtbWFycXVlZS1zdHlsZSIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ3YXAiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InNjcm9sbCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InNsaWRlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYWx0ZXJuYXRlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9Ii13YXAtbWFycXVlZS1sb29wIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9IndhcCI+Ci0gICAgICAgICAgICAgICAgPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5maW5pdGUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iLXdhcC1tYXJxdWVlLWRpciIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ3YXAiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Imx0ciIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJ0bCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLW1hcnF1ZWUtc3BlZWQiCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0id2FwIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzbG93Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZmFzdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLWFjY2Vzc2tleSIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9IndhcCI+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJrZXljb21iaW5hdGlvbiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLWlucHV0LWZvcm1hdCIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9IndhcCI+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJmb3JtYXQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iLXdhcC1pbnB1dC1yZXF1aXJlZCIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9IndhcCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLQotICAgICAgICA8IS0tIGNvbnRhaW5lciBkZWZpbml0aW9uIDogQ29udGFpbmVyIGlzIHRoZSBsdW1wIG9mIHZhbHVlcy4KLSAgICAgICAgSXQgY2FuIGJlIHVzZWQgbGlrZSBtYWNyb3MuIC0tPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJjb2xvciIgb3ZlcndyaXRlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9InN5c3RlbS1jb2xvciIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJmb3JtYXQiPgotICAgICAgICAgICAgICAgIDxzdHJpbmcgbmFtZT0iYW55Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ia2V5Y29tYmluYXRpb24iPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ia2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iLSIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic3BhY2UiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9InNwZWNpYWxrZXkiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJzcGVjaWFsa2V5Ij4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9Im1vZGlmaWVya2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJmdW5jdGlvbmtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ibmF2aWdhdGlvbmtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0iZWRpdGtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ibWlzY2tleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0idm9sdW1lY29udHJvbGtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0iYXBwbGljYXRpb25rZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9InBob25la2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJ2ZW5kb3JrZXkiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJtb2RpZmllcmtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYWNjZXNza2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJjbWRrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9Im9wdGtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0iY3RybGtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ic2hpZnRrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImFsdGtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0id2lua2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJtZXRha2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZm4iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmY24iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjYXBzIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iY21ka2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjbWQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyY21kIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibGNtZCIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9Im9wdGtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ib3B0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icm9wdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImxvcHQiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJjdHJsa2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjdHJsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icmN0cmwiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsY3RybCIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9InNoaWZ0a2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzaGlmdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJzaGlmdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImxzaGlmdCIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImFsdGtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYWx0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icmFsdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImxhbHQiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJ3aW5rZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9IndpbiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJ3aW4iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsd2luIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ibWV0YWtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibWV0YSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJtZXRhIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibG1ldGEiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJmdW5jdGlvbmtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjEiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImYzIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmNSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImY2Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjciLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmOCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImY5Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjEwIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjExIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjEyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjEzIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjE0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjE1Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ibmF2aWdhdGlvbmtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idGFiIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZXNjIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZW50ZXIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyZXR1cm4iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJtZW51Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaGVscCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im5hbWVtZW51Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icmNsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic25kIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYXJyb3drZXkiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwYWdla2V5Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iYXJyb3drZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InVwIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZG93biIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9InBhZ2VrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImhvbWUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJlbmQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwZ3VwIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icGdkbiIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImVkaXRrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImJzIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZGVsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5zIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idW5kbyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImN1dCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImNvcHkiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwYXN0ZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImNsciIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InN0byIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9Im1pc2NrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InBydHNjIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic3lzcnEiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzY3Jsb2NrIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icGF1c2UiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJicmsiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJudW1sb2NrIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icHdyIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0idm9sdW1lY29udHJvbGtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idm9sdW1ldXAiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ2b2x1bWVkb3duIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iYXBwbGljYXRpb25rZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im1lbW8iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ0b2RvIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY2FsZW5kYXIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJtYWlsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYWRkcmVzcyIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9InBob25la2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwaG9uZS1zZW5kIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icGhvbmUtZW5kIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icGhvbmUtYWNjZXB0Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0idmVuZG9ya2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ2bmQuIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLQotICAgICAgICA8Y2F0ZWdvcnktZGVmIG5hbWU9IndhcCI+Ci0gICAgICAgICAgICAgICAgPGNhcHRpb24+JXdhcC5jYXRlZ29yeS1kZWYud2FwLmNhcHRpb248L2NhcHRpb24+Ci0gICAgICAgIDwvY2F0ZWdvcnktZGVmPgotCi0gICAgICAgIDxudW1iZXItZGVmIG5hbWU9Imxlbmd0aCI+Ci0gICAgICAgIDx1bml0IG5hbWU9ImVtIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImV4Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9InB4Ii8+Ci0gICAgICAgIDwvbnVtYmVyLWRlZj4KLQotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSItd2FwLW1hcnF1ZWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT4td2FwLW1hcnF1ZWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InNsaWRlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5zbGlkZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImFsdGVybmF0ZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+YWx0ZXJuYXRlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5maW5pdGUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmluZmluaXRlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iLSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+LTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InNwYWNlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5zcGFjZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImFjY2Vzc2tleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+YWNjZXNza2V5PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZm4iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmZuPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmNuIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mY248L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjYXBzIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5jYXBzPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iY21kIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5jbWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyY21kIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5yY21kPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGNtZCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bGNtZDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9Im9wdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+b3B0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icm9wdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cm9wdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImxvcHQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvcHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjdHJsIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5jdHJsPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icmN0cmwiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJjdHJsPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGN0cmwiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmxjdHJsPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2hpZnQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnNoaWZ0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icnNoaWZ0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5yc2hpZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsc2hpZnQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmxzaGlmdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImFsdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+YWx0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icmFsdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cmFsdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImxhbHQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmxhbHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ3aW4iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPndpbjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InJ3aW4iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJ3aW48L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsd2luIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5sd2luPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWV0YSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bWV0YTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InJtZXRhIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5ybWV0YTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImxtZXRhIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5sbWV0YTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYxIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYyIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYzIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMzwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImY0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mNDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImY1Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mNTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImY2Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mNjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImY3Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mNzwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImY4Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mODwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImY5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mOTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYxMCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjEwPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjExIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMTE8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmMTIiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYxMjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYxMyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjEzPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjE0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMTQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmMTUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYxNTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFiPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZXNjIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5lc2M8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJlbnRlciI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZW50ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZXR1cm4iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJldHVybjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9Im5hbWVtZW51Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5uYW1lbWVudTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InJjbCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cmNsPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ic25kIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5zbmQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhcnJvd2tleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+YXJyb3drZXk8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwYWdla2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5wYWdla2V5PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0idXAiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZG93biI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZG93bjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImhvbWUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmhvbWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJlbmQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmVuZDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBndXAiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBndXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwZ2RuIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5wZ2RuPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iYnMiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmJzPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGVsIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5kZWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbnMiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmluczwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InVuZG8iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnVuZG88L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjdXQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmN1dDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImNvcHkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmNvcHk8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwYXN0ZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cGFzdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjbHIiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmNscjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InN0byI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+c3RvPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icHJ0c2MiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBydHNjPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3lzcnEiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnN5c3JxPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2NybG9jayI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+c2NybG9jazwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImJyayI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+YnJrPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibnVtbG9jayI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bnVtbG9jazwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InB3ciI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cHdyPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0idm9sdW1ldXAiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnZvbHVtZXVwPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0idm9sdW1lZG93biI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+dm9sdW1lZG93bjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9Im1lbW8iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPm1lbW88L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0b2RvIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT50b2RvPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2FsZW5kYXIiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmNhbGVuZGFyPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWFpbCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bWFpbDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImFkZHJlc3MiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmFkZHJlc3M8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwaG9uZS1zZW5kIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5waG9uZS1zZW5kPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icGhvbmUtZW5kIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5waG9uZS1lbmQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwaG9uZS1hY2NlcHQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBob25lLWFjY2VwdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InZuZC4iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnZuZC48L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT50cnVlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmFsc2UiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmZhbHNlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icGF1c2UiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBhdXNlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotCi08L2Nzcy1wcm9maWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkN2UzOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBjc3Nwcm9maWxlLWNzczEueG1sCi1jc3MxLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPUNhc2NhZGluZyBTdHlsZSBTaGVldHMsIGxldmVsIDEKLWNzczEuY2F0ZWdvcnktZGVmLmJveC5jYXB0aW9uPUJveCBtb2RlbAotY3NzMS5jYXRlZ29yeS1kZWYuY29sb3JhbmRiYWNrZ3JvdW5kLmNhcHRpb249Q29sb3JzIGFuZCBCYWNrZ3JvdW5kcwotY3NzMS5jYXRlZ29yeS1kZWYuY2xhc3NpZmljYXRpb24uY2FwdGlvbj1DbGFzc2lmaWNhdGlvbgotY3NzMS5jYXRlZ29yeS1kZWYuZm9udC5jYXB0aW9uPUZvbnQKLWNzczEuY2F0ZWdvcnktZGVmLnRleHQuY2FwdGlvbj1UZXh0Ci0jIGNzc3Byb2ZpbGUtY3NzMi54bWwKLWNzczIuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb249Q2FzY2FkaW5nIFN0eWxlIFNoZWV0cywgbGV2ZWwgMgotY3NzMi5jYXRlZ29yeS1kZWYuYXVyYWwuY2FwdGlvbj1BdXJhbAotY3NzMi5jYXRlZ29yeS1kZWYuYm94LmNhcHRpb249Qm94IG1vZGVsCi1jc3MyLmNhdGVnb3J5LWRlZi5jb2xvcmFuZGJhY2tncm91bmQuY2FwdGlvbj1Db2xvcnMgYW5kIEJhY2tncm91bmRzCi1jc3MyLmNhdGVnb3J5LWRlZi5jb250ZW50LmNhcHRpb249R2VuZXJhdGVkIGNvbnRlbnQvTGlzdAotY3NzMi5jYXRlZ29yeS1kZWYuZm9udC5jYXB0aW9uPUZvbnRzCi1jc3MyLmNhdGVnb3J5LWRlZi5wYWdlLmNhcHRpb249UGFnZWQgbWVkaWEKLWNzczIuY2F0ZWdvcnktZGVmLnRhYmxlcy5jYXB0aW9uPVRhYmxlcwotY3NzMi5jYXRlZ29yeS1kZWYudGV4dC5jYXB0aW9uPVRleHQKLWNzczIuY2F0ZWdvcnktZGVmLnZpc3VhbC5jYXB0aW9uPVZpc3VhbAotY3NzMi5jYXRlZ29yeS1kZWYudWkuY2FwdGlvbj1Vc2VyIGludGVyZmFjZQotIyBjc3Nwcm9maWxlLW1vYmlsZTFfMC54bWwKLW1vYmlsZTFfMC5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbj1DU1MgTW9iaWxlIFByb2ZpbGUgMS4wCi0jIGNzc3Byb2ZpbGUtd2FwLnhtbAotd2FwLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPVdDU1MgMS4wCi13YXAuY2F0ZWdvcnktZGVmLndhcC5jYXB0aW9uPVdDU1MgRXh0ZW5zaW9ucwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9kZXNjcmlwdGlvbi50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Rlc2NyaXB0aW9uLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzMWYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Rlc2NyaXB0aW9uLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0KLSAqIE5vbmUgb2YgdGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IAotICogbmVlZCB0byBiZSB0cmFuc2xhdGVkIAotICogZXhjZXB0IGZvciBjc3Nwcm9maWxlLnByb3BlcnRpZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5M2E0ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLXBsdWdpbk5hbWU9U3RydWN0dXJlZCBTb3VyY2UgQ1NTIE1vZGVsCi1jc3Nwcm9maWxlX2NzczIubmFtZT1DU1MyOiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzLCBsZXZlbCAyCi1jc3Nwcm9maWxlX2NzczEubmFtZT1DU1MxOiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzLCBsZXZlbCAxCi1jc3Nwcm9maWxlX21vYmlsZTFfMC5uYW1lPUNTUyBNb2JpbGUgUHJvZmlsZSAxLjAKLWNzc3Byb2ZpbGVfd2FwLm5hbWU9V0NTUyAxLjAKLVN0cnVjdHVyZWRfQ1NTX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWU9U3RydWN0dXJlZCBDU1MgRG9jdW1lbnQgRmFjdG9yeSBFeHRlbnNpb24KLUNTU19Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1DU1MKLV90YXNrTWFya2VyLm5hbWU9Q1NTIFRhc2sKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzY0YjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3Nwcm9maWxlIj4KLQkJPHByb2ZpbGUKLQkJCW5hbWU9IiVjc3Nwcm9maWxlX2NzczIubmFtZSIKLQkJCWRlZmF1bHQ9InRydWUiCi0JCQl1cmk9ImNzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MyLnhtbCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3NzcHJvZmlsZS5jc3MyIj4KLQkJPC9wcm9maWxlPgotCQk8cHJvZmlsZQotCQkJbmFtZT0iJWNzc3Byb2ZpbGVfY3NzMS5uYW1lIgotCQkJdXJpPSJjc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMS54bWwiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3Byb2ZpbGUuY3NzMSI+Ci0JCTwvcHJvZmlsZT4KLQkJPHByb2ZpbGUKLQkJCW5hbWU9IiVjc3Nwcm9maWxlX21vYmlsZTFfMC5uYW1lIgotCQkJdXJpPSJjc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3NzcHJvZmlsZS5tb2JpbGUxXzAiPgotCQk8L3Byb2ZpbGU+Ci0JCTxwcm9maWxlCi0JCQluYW1lPSIlY3NzcHJvZmlsZV93YXAubmFtZSIKLQkJCXVyaT0iY3NzcHJvZmlsZS9jc3Nwcm9maWxlLXdhcC54bWwiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3Byb2ZpbGUud2FwIj4KLQkJPC9wcm9maWxlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0JCTxtb2RlbEhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckNTUyIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50YXNrc2Nhbm5lciI+Ci0JCTxzY2FubmVyCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRhc2tzLkNTU0ZpbGVUYXNrU2Nhbm5lciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGFza3MuQ1NTRmlsZVRhc2tTY2FubmVyOm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50YXNrTWFya2VyIgotCQkJY29udGVudFR5cGVJZHM9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlpZD0idGFza01hcmtlciIKLQkJbmFtZT0iJV90YXNrTWFya2VyLm5hbWUiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLQkJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRhc2ttYXJrZXIiLz4KLQkJPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfQ1NTX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImNzcyI+Ci0JCTwvZmlsZVR5cGVzPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdFByb2Nlc3NvcnMiPgotCQk8cHJvY2Vzc29yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JDU1MiCi0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIj4KLQkJPC9wcm9jZXNzb3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlLmNvbnRlbnRUeXBlcyI+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0iY3NzIgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlQ1NTX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0Ij4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkNvbnRlbnREZXNjcmliZXJGb3JDU1MiIC8+Ci0JCTwvY29udGVudC10eXBlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBpbml0aWFsaXplIGNzcyBjb3JlIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2N2E5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgQ1NTIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWW91X2Nhbm5vdF91c2VfQ1NTU3R5bGVTaGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ1NTQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTkyZWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENTU0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTQ29yZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENTU0NvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ1NTQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQotCQkvLyBsaXN0ZW4gZm9yIHJlc291cmNlIGNoYW5nZXMgdG8gdXBkYXRlIGNvbnRlbnQgcHJvcGVydGllcyBrZXlzCi0JCUNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zdGFydHVwKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBzdG9wIGxpc3Rlbm5pbmcgZm9yIHJlc291cmNlIGNoYW5nZXMgdG8gdXBkYXRlIGNvbnRlbnQgcHJvcGVydGllcwotCQkvLyBrZXlzCi0JCUNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zaHV0ZG93bigpOwotCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE4ZDFmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVlvdV9jYW5ub3RfdXNlX0NTU1N0eWxlU2hlX1VJXz1Zb3UgY2Fubm90IHVzZSBDU1NTdHlsZVNoZWV0LmdldE93bmVyUnVsZSgpIGJlY2F1c2Ugb2YgbWFueSByZWZlcmVuY2VycyBvZiB0aGlzIHJ1bGVcblBsZWFzZSB1c2UgZ2V0T253ZXJSdWxlcygpCi0jCi1DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmc9VXBkYXRpbmcgQ1NTIENvbnRlbnQgU2V0dGluZ3MKLUNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZz1Qcm9ibGVtIHNhdmluZyBDU1MgQ29udGVudCBTZXR0aW5ncyBmb3IgezB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmZmRhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NDbGVhbnVwU3RyYXRlZ3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NDbGVhbnVwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1NTFjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTQ2xlYW51cFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NDbGVhbnVwU3RyYXRlZ3kgewotCi0Jc3RhdGljIGZpbmFsIHNob3J0IEFTSVMgPSAwOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBMT1dFUiA9IDE7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQUEVSID0gMjsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlzaG9ydCBnZXRJZGVudENhc2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlzaG9ydCBnZXRQcm9wTmFtZUNhc2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlzaG9ydCBnZXRQcm9wVmFsdWVDYXNlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0U2VsZWN0b3JUYWdDYXNlKCk7Ci0KLQlzaG9ydCBnZXRDbGFzc1NlbGVjdG9yQ2FzZSgpOwotCi0Jc2hvcnQgZ2V0SWRTZWxlY3RvckNhc2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNGb3JtYXRTb3VyY2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNRdW90ZVZhbHVlcygpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGZvcm1hdFNvdXJjZQotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXZvaWQgc2V0Rm9ybWF0U291cmNlKGJvb2xlYW4gZm9ybWF0U291cmNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZGVudENhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0Jdm9pZCBzZXRJZGVudENhc2Uoc2hvcnQgaWRlbnRDYXNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wTmFtZUNhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0Jdm9pZCBzZXRQcm9wTmFtZUNhc2Uoc2hvcnQgcHJvcE5hbWVDYXNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wVmFsdWVDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXZvaWQgc2V0UHJvcFZhbHVlQ2FzZShzaG9ydCBwcm9wVmFsdWVDYXNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBxdW90ZVZhbHVlcwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXZvaWQgc2V0UXVvdGVWYWx1ZXMoYm9vbGVhbiBxdW90ZVZhbHVlcyk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0b3JUYWdDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXZvaWQgc2V0U2VsZWN0b3JUYWdDYXNlKHNob3J0IHNlbGVjdG9yVGFnQ2FzZSk7Ci0KLQl2b2lkIHNldENsYXNzU2VsZWN0b3JDYXNlKHNob3J0IGNsYXNzU2VsZWN0b3JDYXNlKTsKLQotCXZvaWQgc2V0SWRTZWxlY3RvckNhc2Uoc2hvcnQgaWRTZWxlY3RvckNhc2UpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NDbGVhbnVwU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDE5MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIENTU0NsZWFudXBTdHJhdGVneSB7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBDU1NDbGVhbnVwU3RyYXRlZ3kgaW5zdGFuY2UgPSBudWxsOwotCS8vIGluaXRpYWxpemUgd2l0aCBkZWZhdWx0cwotCXByb3RlY3RlZCBzaG9ydCBmSWRlbnRDYXNlID0gQVNJUzsKLQlwcm90ZWN0ZWQgc2hvcnQgZlByb3BOYW1lQ2FzZSA9IEFTSVM7Ci0JcHJvdGVjdGVkIHNob3J0IGZQcm9wVmFsdWVDYXNlID0gQVNJUzsKLQlwcm90ZWN0ZWQgc2hvcnQgZlNlbGVjdG9yVGFnQ2FzZSA9IFVQUEVSOwotCXByb3RlY3RlZCBib29sZWFuIGZRdW90ZVZhbHVlcyA9IHRydWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZkZvcm1hdFNvdXJjZSA9IHRydWU7Ci0JcHJvdGVjdGVkIHNob3J0IGZDbGFzc0Nhc2UgPSBBU0lTOwotCXByb3RlY3RlZCBzaG9ydCBmSWRDYXNlID0gQVNJUzsKLQotCS8qKgotCSAqIENTU0NsZWFudXBTdHJhdGVneUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0SWRlbnRDYXNlKCkgewotCQlyZXR1cm4gZklkZW50Q2FzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU0NsZWFudXBTdHJhdGVneSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldFByb3BOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIGZQcm9wTmFtZUNhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRQcm9wVmFsdWVDYXNlKCkgewotCQlyZXR1cm4gZlByb3BWYWx1ZUNhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRTZWxlY3RvclRhZ0Nhc2UoKSB7Ci0JCXJldHVybiBmU2VsZWN0b3JUYWdDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWZJZGVudENhc2UgPSBnZXRDbGVhbnVwQ2FzZVZhbHVlKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9JREVOVElGSUVSKSk7Ci0JCWZQcm9wTmFtZUNhc2UgPSBnZXRDbGVhbnVwQ2FzZVZhbHVlKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9QUk9QRVJUWV9OQU1FKSk7Ci0JCWZQcm9wVmFsdWVDYXNlID0gZ2V0Q2xlYW51cENhc2VWYWx1ZShwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUpKTsKLQkJZlNlbGVjdG9yVGFnQ2FzZSA9IGdldENsZWFudXBDYXNlVmFsdWUocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX1NFTEVDVE9SKSk7Ci0JCWZJZENhc2UgPSBnZXRDbGVhbnVwQ2FzZVZhbHVlKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9JRF9TRUxFQ1RPUikpOwotCQlmQ2xhc3NDYXNlID0gZ2V0Q2xlYW51cENhc2VWYWx1ZShwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfQ0xBU1NfU0VMRUNUT1IpKTsKLQkJZlF1b3RlVmFsdWVzID0gcHJlZnMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKTsKLQkJZkZvcm1hdFNvdXJjZSA9IHByZWZzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENTU0NsZWFudXBTdHJhdGVneSBlcXVpdmFsZW50IGNhc2Ugc2hvcnQgdmFsdWUgd2hlbiBnaXZlbiBhbgotCSAqIGludAotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZXF1aXZhbGVudCBjYXNlIHNob3J0IG9yIEFTSVMgaWYgY2Fubm90IGJlIGRldGVybWluZWQKLQkgKi8KLQlwcml2YXRlIHNob3J0IGdldENsZWFudXBDYXNlVmFsdWUoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUiA6Ci0JCQkJcmV0dXJuIExPV0VSOwotCQkJY2FzZSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSIDoKLQkJCQlyZXR1cm4gVVBQRVI7Ci0JCX0KLQkJcmV0dXJuIEFTSVM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3JtYXRTb3VyY2UoKSB7Ci0JCXJldHVybiBmRm9ybWF0U291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUXVvdGVWYWx1ZXMoKSB7Ci0JCXJldHVybiBmUXVvdGVWYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGZvcm1hdFNvdXJjZQotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFNvdXJjZShib29sZWFuIGZvcm1hdFNvdXJjZSkgewotCQlmRm9ybWF0U291cmNlID0gZm9ybWF0U291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZGVudENhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SWRlbnRDYXNlKHNob3J0IGlkZW50Q2FzZSkgewotCQlmSWRlbnRDYXNlID0gaWRlbnRDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wTmFtZUNhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcE5hbWVDYXNlKHNob3J0IHByb3BOYW1lQ2FzZSkgewotCQlmUHJvcE5hbWVDYXNlID0gcHJvcE5hbWVDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wVmFsdWVDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BWYWx1ZUNhc2Uoc2hvcnQgcHJvcFZhbHVlQ2FzZSkgewotCQlmUHJvcFZhbHVlQ2FzZSA9IHByb3BWYWx1ZUNhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHF1b3RlVmFsdWVzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVvdGVWYWx1ZXMoYm9vbGVhbiBxdW90ZVZhbHVlcykgewotCQlmUXVvdGVWYWx1ZXMgPSBxdW90ZVZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0b3JUYWdDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdG9yVGFnQ2FzZShzaG9ydCBzZWxlY3RvclRhZ0Nhc2UpIHsKLQkJZlNlbGVjdG9yVGFnQ2FzZSA9IHNlbGVjdG9yVGFnQ2FzZTsKLQl9Ci0KLQkvLyBUT0RPOiBhIHNhdmVPcHRpb25zIHNob3VsZCBiZSBhZGRlZCB0byBDU1NDbGVhbnVwU3RyYXRlZ3kgaW50ZXJmYWNlCi0JcHVibGljIHZvaWQgc2F2ZU9wdGlvbnMoKSB7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfSURFTlRJRklFUiwgZklkZW50Q2FzZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfTkFNRSwgZlByb3BOYW1lQ2FzZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUsIGZQcm9wVmFsdWVDYXNlKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9TRUxFQ1RPUiwgZlNlbGVjdG9yVGFnQ2FzZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfSURfU0VMRUNUT1IsIGZJZENhc2UpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX0NMQVNTX1NFTEVDVE9SLCBmQ2xhc3NDYXNlKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTLCBmUXVvdGVWYWx1ZXMpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSwgZkZvcm1hdFNvdXJjZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXRDbGFzc1NlbGVjdG9yQ2FzZSgpIHsKLQkJcmV0dXJuIGZDbGFzc0Nhc2U7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldElkU2VsZWN0b3JDYXNlKCkgewotCQlyZXR1cm4gZklkQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc1NlbGVjdG9yQ2FzZShzaG9ydCBjbGFzc1NlbGVjdG9yQ2FzZSkgewotCQlmQ2xhc3NDYXNlID0gY2xhc3NTZWxlY3RvckNhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWRTZWxlY3RvckNhc2Uoc2hvcnQgaWRTZWxlY3RvckNhc2UpIHsKLQkJZklkQ2FzZSA9IGlkU2VsZWN0b3JDYXNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DbGVhbnVwUHJvY2Vzc29yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmFkZjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DbGVhbnVwUHJvY2Vzc29yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTRm9ybWF0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5BYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENsZWFudXBQcm9jZXNzb3JDU1MgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIHsKLQotCXB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUNTU0Zvcm1hdFV0aWwgZm9ybWF0VXRpbCA9IENTU0Zvcm1hdFV0aWwuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJSUNTU0RvY3VtZW50IGRvYyA9ICgoSUNTU01vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgZG9jKTsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBmb3JtYXR0ZXIuY2xlYW51cChkb2MpOwotCQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQkJaW50IHN0YXJ0T2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBkb2MpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGVuZE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgZG9jKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlmb3JtYXRVdGlsLnJlcGxhY2VTb3VyY2UoZG9jLmdldE1vZGVsKCksIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgYnVmLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJTGlzdCBjc3Nub2RlcyA9IGZvcm1hdFV0aWwuY29sbGVjdENTU05vZGVzKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JCQlpZiAoY3Nzbm9kZXMgIT0gbnVsbCAmJiAhY3Nzbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJSUNTU01vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNzc25vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIGNzc25vZGVzLmdldChpKTsKLQkJCQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIG5vZGUpOwotCQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gZm9ybWF0dGVyLmNsZWFudXAobm9kZSk7Ci0JCQkJCWlmIChidWYgIT0gbnVsbCkgewotCQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJaW50IGVuZE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQlpZiAobW9kZWwgPT0gbnVsbCkgewotCQkJCQkJCW1vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCQkJCX0KLQkJCQkJCWZvcm1hdFV0aWwucmVwbGFjZVNvdXJjZShtb2RlbCwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCBidWYudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQotCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHNob3VsZCBpbXBsZW1lbnQsIG9yIGRlbGV0ZT8KLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBzaG91bGQgaW1wbGVtZW50LCBvciBkZWxldGU/Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBnZXRDbGVhbnVwSGFuZGxlcihOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGdldEZvcm1hdFByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JTWVkaWFHcm91cElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JTWVkaWFHcm91cElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMDJhYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSU1lZGlhR3JvdXBJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVkaWFHcm91cElEIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQ09OVElOVU9VUyA9ICJjb250aW51b3VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fUEFHRUQgPSAicGFnZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX1ZJU1VBTCA9ICJ2aXN1YWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9BVVJBTCA9ICJhdXJhbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX1RBQ1RJTEUgPSAidGFjdGlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fR1JJRCA9ICJncmlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQklUTUFQID0gImJpdG1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fSU5URVJBQ1RJVkUgPSAiaW50ZXJhY3RpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9TVEFUSUMgPSAic3RhdGljIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9BTEwgPSAiYWxsIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lWYWxJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSVZhbElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NjAwZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSVZhbElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsSUQgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl8xMDAgPSAiMTAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfMjAwID0gIjIwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzMwMCA9ICIzMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl80MDAgPSAiNDAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfNTAwID0gIjUwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzYwMCA9ICI2MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl83MDAgPSAiNzAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfODAwID0gIjgwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzkwMCA9ICI5MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BQk9WRSA9ICJhYm92ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FCU09MVVRFID0gImFic29sdXRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQUNUSVZFQk9SREVSID0gIkFjdGl2ZUJvcmRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FDVElWRUNBUFRJT04gPSAiQWN0aXZlQ2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FMTCA9ICJhbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BTFdBWVMgPSAiYWx3YXlzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQVBQV09SS1NQQUNFID0gIkFwcFdvcmtzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FRVUEgPSAiYXF1YSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FSTUVOSUFOID0gImFybWVuaWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQVVUTyA9ICJhdXRvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQVZPSUQgPSAiYXZvaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CQUNLR1JPVU5EID0gIkJhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CQVNFTElORSA9ICJiYXNlbGluZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JFSElORCA9ICJiZWhpbmQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CRUxPVyA9ICJiZWxvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JJRElfT1ZFUlJJREUgPSAiYmlkaS1vdmVycmlkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JMQUNLID0gImJsYWNrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkxJTksgPSAiYmxpbmsiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CTE9DSyA9ICJibG9jayI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JMVUUgPSAiYmx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JPTEQgPSAiYm9sZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JPTERFUiA9ICJib2xkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CT1RIID0gImJvdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CT1RUT00gPSAiYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQlVUVE9ORkFDRSA9ICJCdXR0b25GYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQlVUVE9OSElHSExJR0hUID0gIkJ1dHRvbkhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JVVFRPTlNIQURPVyA9ICJCdXR0b25TaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CVVRUT05URVhUID0gIkJ1dHRvblRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DQVBJVEFMSVpFID0gImNhcGl0YWxpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DQVBUSU9OID0gImNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DQVBUSU9OVEVYVCA9ICJDYXB0aW9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NFTlRFUiA9ICJjZW50ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DRU5URVJfTEVGVCA9ICJjZW50ZXItbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NFTlRFUl9SSUdIVCA9ICJjZW50ZXItcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DSElMRCA9ICJjaGlsZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NJUkNMRSA9ICJjaXJjbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DSktfSURFT0dSQVBISUMgPSAiY2prLWlkZW9ncmFwaGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0xPU0VfUVVPVEUgPSAiY2xvc2UtcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DT0RFID0gImNvZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DT05ERU5TRUQgPSAiY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ09MTEFQU0UgPSAiY29sbGFwc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DT01QQUNUID0gImNvbXBhY3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DT05USU5VT1VTID0gImNvbnRpbnVvdXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DUk9QID0gImNyb3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DUk9TUyA9ICJjcm9zcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NST1NTSEFJUiA9ICJjcm9zc2hhaXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DVVJTSVZFID0gImN1cnNpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9EQVNIRUQgPSAiZGFzaGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfREVDSU1BTCA9ICJkZWNpbWFsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfREVDSU1BTF9MRUFESU5HX1pFUk8gPSAiZGVjaW1hbC1sZWFkaW5nLXplcm8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ESUdJVFMgPSAiZGlnaXRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRElTQyA9ICJkaXNjIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRE9UVEVEID0gImRvdHRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RPVUJMRSA9ICJkb3VibGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9FX1JFU0laRSA9ICJlLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0VNQkVEID0gImVtYmVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRVhQQU5ERUQgPSAiZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9FWFRSQV9DT05ERU5TRUQgPSAiZXh0cmEtY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRVhUUkFfRVhQQU5ERUQgPSAiZXh0cmEtZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GQU5UQVNZID0gImZhbnRhc3kiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GQVJfTEVGVCA9ICJmYXItbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZBUl9SSUdIVCA9ICJmYXItcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GQVNUID0gImZhc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GQVNURVIgPSAiZmFzdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRkVNQUxFID0gImZlbWFsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZJWEVEID0gImZpeGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRlVDSFNJQSA9ICJmdWNoc2lhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfR0VPUkdJQU4gPSAiZ2VvcmdpYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9HUkFZID0gImdyYXkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9HUkFZVEVYVCA9ICJHcmF5VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0dSRUVOID0gImdyZWVuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfR1JPT1ZFID0gImdyb292ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hFQlJFVyA9ICJoZWJyZXciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9IRUxQID0gImhlbHAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISURERU4gPSAiaGlkZGVuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElERSA9ICJoaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElHSCA9ICJoaWdoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElHSExJR0hUID0gIkhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJR0hMSUdIVFRFWFQgPSAiSGlnaGxpZ2h0VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJR0hFUiA9ICJoaWdoZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISVJBR0FOQSA9ICJoaXJhZ2FuYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJUkFHQU5BX0lST0hBID0gImhpcmFnYW5hLWlyb2hhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSUNPTiA9ICJpY29uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5BQ1RJVkVCT1JERVIgPSAiSW5hY3RpdmVCb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkFDVElWRUNBUFRJT04gPSAiSW5hY3RpdmVDYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5BQ1RJVkVDQVBUSU9OVEVYVCA9ICJJbmFjdGl2ZUNhcHRpb25UZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5GT0JBQ0tHUk9VTkQgPSAiSW5mb0JhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkZPVEVYVCA9ICJJbmZvVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOTElORSA9ICJpbmxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkxJTkVfQkxPQ0sgPSAiaW5saW5lLWJsb2NrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5MSU5FX1RBQkxFID0gImlubGluZS10YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOU0VUID0gImluc2V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5TSURFID0gImluc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOVkVSVCA9ICJpbnZlcnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JVEFMSUMgPSAiaXRhbGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSlVTVElGWSA9ICJqdXN0aWZ5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfS0FUQUtBTkEgPSAia2F0YWthbmEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9LQVRBS0FOQV9JUk9IQSA9ICJrYXRha2FuYS1pcm9oYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xBTkRTQ0FQRSA9ICJsYW5kc2NhcGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MQVJHRSA9ICJsYXJnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xBUkdFUiA9ICJsYXJnZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MRUZUID0gImxlZnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MRUZUX1NJREUgPSAibGVmdC1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEVGVFdBUkRTID0gImxlZnR3YXJkcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xFVkVMID0gImxldmVsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTElHSFRFUiA9ICJsaWdodGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTElNRSA9ICJsaW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTElORV9USFJPVUdIID0gImxpbmUtdGhyb3VnaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xJU1RfSVRFTSA9ICJsaXN0LWl0ZW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1VEID0gImxvdWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1cgPSAibG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XRVIgPSAibG93ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1dFUl9BTFBIQSA9ICJsb3dlci1hbHBoYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPV0VSX0dSRUVLID0gImxvd2VyLWdyZWVrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XRVJfTEFUSU4gPSAibG93ZXItbGF0aW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1dFUl9ST01BTiA9ICJsb3dlci1yb21hbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPV0VSQ0FTRSA9ICJsb3dlcmNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MVFIgPSAibHRyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUFMRSA9ICJtYWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUFSS0VSID0gIm1hcmtlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01BUk9PTiA9ICJtYXJvb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NRURJVU0gPSAibWVkaXVtIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUVOVSA9ICJtZW51IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUVOVVRFWFQgPSAiTWVudVRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NRVNTQUdFX0JPWCA9ICJtZXNzYWdlLWJveCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01JRERMRSA9ICJtaWRkbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NSVggPSAibWl4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTU9OT1NQQUNFID0gIm1vbm9zcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01PVkUgPSAibW92ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05fUkVTSVpFID0gIm4tcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTkFSUk9XRVIgPSAibmFycm93ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OQVZZID0gIm5hdnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ORV9SRVNJWkUgPSAibmUtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9fQ0xPU0VfUVVPVEUgPSAibm8tY2xvc2UtcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OT19PUEVOX1FVT1RFID0gIm5vLW9wZW4tcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OT19SRVBFQVQgPSAibm8tcmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9ORSA9ICJub25lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9STUFMID0gIm5vcm1hbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05PV1JBUCA9ICJub3dyYXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OV19SRVNJWkUgPSAibnctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT0JMSVFVRSA9ICJvYmxpcXVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT0xJVkUgPSAib2xpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PTkNFID0gIm9uY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PUEVOX1FVT1RFID0gIm9wZW4tcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PUkFOR0UgPSAib3JhbmdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT1VUU0VUID0gIm91dHNldCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09VVFNJREUgPSAib3V0c2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09WRVJMSU5FID0gIm92ZXJsaW5lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUE9JTlRFUiA9ICJwb2ludGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUE9SVFJBSVQgPSAicG9ydHJhaXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9QUkUgPSAicHJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUFJFX0xJTkUgPSAicHJlLWxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9QUkVfV1JBUCA9ICJwcmUtd3JhcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1BST0dSRVNTID0gInByb2dyZXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUFVSUExFID0gInB1cnBsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JFRCA9ICJyZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SRUxBVElWRSA9ICJyZWxhdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JFUEVBVCA9ICJyZXBlYXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SRVBFQVRfWCA9ICJyZXBlYXQteCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JFUEVBVF9ZID0gInJlcGVhdC15IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUklER0UgPSAicmlkZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SSUdIVCA9ICJyaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JJR0hUX1NJREUgPSAicmlnaHQtc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JJR0hUV0FSRFMgPSAicmlnaHR3YXJkcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JUTCA9ICJydGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SVU5fSU4gPSAicnVuLWluIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU19SRVNJWkUgPSAicy1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TQU5TX1NFUklGID0gInNhbnMtc2VyaWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TQ1JPTEwgPSAic2Nyb2xsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0NST0xMQkFSID0gIlNjcm9sbGJhciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NFX1JFU0laRSA9ICJzZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TRU1JX0NPTkRFTlNFRCA9ICJzZW1pLWNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NFTUlfRVhQQU5ERUQgPSAic2VtaS1leHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NFUEFSQVRFID0gInNlcGFyYXRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0VSSUYgPSAic2VyaWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TSE9XID0gInNob3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TSUxFTlQgPSAic2lsZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0lMVkVSID0gInNpbHZlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NMT1cgPSAic2xvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NMT1dFUiA9ICJzbG93ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TTUFMTCA9ICJzbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NNQUxMX0NBUFMgPSAic21hbGwtY2FwcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NNQUxMX0NBUFRJT04gPSAic21hbGwtY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NNQUxMRVIgPSAic21hbGxlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NPRlQgPSAic29mdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NPTElEID0gInNvbGlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1BFTExfT1VUID0gInNwZWxsLW91dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NRVUFSRSA9ICJzcXVhcmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TVEFUSUMgPSAic3RhdGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1RBVFVTX0JBUiA9ICJzdGF0dXMtYmFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1VCID0gInN1YiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NVUEVSID0gInN1cGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1dfUkVTSVpFID0gInN3LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFID0gInRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfQ0FQVElPTiA9ICJ0YWJsZS1jYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfQ0VMTCA9ICJ0YWJsZS1jZWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfQ09MVU1OID0gInRhYmxlLWNvbHVtbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX0NPTFVNTl9HUk9VUCA9ICJ0YWJsZS1jb2x1bW4tZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9GT09URVJfR1JPVVAgPSAidGFibGUtZm9vdGVyLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfSEVBREVSX0dST1VQID0gInRhYmxlLWhlYWRlci1ncm91cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX1JPVyA9ICJ0YWJsZS1yb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9ST1dfR1JPVVAgPSAidGFibGUtcm93LWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEVBTCA9ICJ0ZWFsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEVYVF9UT1AgPSAidGV4dC10b3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9URVhUX0JPVFRPTSA9ICJ0ZXh0LWJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RISUNLID0gInRoaWNrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhJTiA9ICJ0aGluIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhSRUVEREFSS1NIQURPVyA9ICJUaHJlZUREYXJrU2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhSRUVERkFDRSA9ICJUaHJlZURGYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhSRUVESElHSExJR0hUID0gIlRocmVlREhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RIUkVFRExJR0hUU0hBRE9XID0gIlRocmVlRExpZ2h0U2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhSRUVEU0hBRE9XID0gIlRocmVlRFNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RPUCA9ICJ0b3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UUkFOU1BBUkVOVCA9ICJ0cmFuc3BhcmVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VMVFJBX0NPTkRFTlNFRCA9ICJ1bHRyYS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VTFRSQV9FWFBBTkRFRCA9ICJ1bHRyYS1leHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VOREVSTElORSA9ICJ1bmRlcmxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VUFBFUl9BTFBIQSA9ICJ1cHBlci1hbHBoYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VQUEVSX0xBVElOID0gInVwcGVyLWxhdGluIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVVBQRVJfUk9NQU4gPSAidXBwZXItcm9tYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VUFBFUkNBU0UgPSAidXBwZXJjYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVklTSUJMRSA9ICJ2aXNpYmxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV19SRVNJWkUgPSAidy1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XQUlUID0gIndhaXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XSElURSA9ICJ3aGl0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dJREVSID0gIndpZGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV0lORE9XID0gIldpbmRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dJTkRPV0ZSQU1FID0gIldpbmRvd0ZyYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV0lORE9XVEVYVCA9ICJXaW5kb3dUZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9GQVNUID0gIngtZmFzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfSElHSCA9ICJ4LWhpZ2giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX0xBUkdFID0gIngtbGFyZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX0xPVUQgPSAieC1sb3VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9MT1cgPSAieC1sb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX1NMT1cgPSAieC1zbG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9TTUFMTCA9ICJ4LXNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9TT0ZUID0gIngtc29mdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hYX1NNQUxMID0gInh4LXNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWFhfTEFSR0UgPSAieHgtbGFyZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ZRUxMT1cgPSAieWVsbG93IjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMTNmN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNQ29udGFpbmVyIGV4dGVuZHMgUHJvcENNTm9kZSB7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3Igbm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9BQlNPTFVURV9TSVpFID0gImFic29sdXRlLXNpemUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfQk9SREVSX1NUWUxFID0gImJvcmRlci1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9CT1JERVJfV0lEVEggPSAiYm9yZGVyLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0NPTE9SID0gImNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1NZU1RFTV9DT0xPUiA9ICJzeXN0ZW0tY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfR0VORVJJQ19GQU1JTFkgPSAiZ2VuZXJpYy1mYW1pbHkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfR0VORVJJQ19WT0lDRSA9ICJnZW5lcmljLXZvaWNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX01BUkdJTl9XSURUSCA9ICJtYXJnaW4td2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfUEFERElOR19XSURUSCA9ICJwYWRkaW5nLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1JFTEFUSVZFX1NJWkUgPSAicmVsYXRpdmUtc2l6ZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTUNvbnRhaW5lcihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlPYmplY3QgYXBwZW5kQ2hpbGQoT2JqZWN0IG5vZGUpIHsKLQkJaWYgKCFub2Rlcy5jb250YWlucyhub2RlKSkKLQkJCW5vZGVzLmFkZChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSGF2ZShTdHJpbmcgaWRlbnRpZmllcikgewotCQlpbnQgbkNoaWxkID0gZ2V0TnVtQ2hpbGQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hpbGQ7IGkrKykgewotCQkJT2JqZWN0IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFN0cmluZyAmJiBpZGVudGlmaWVyLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykgY2hpbGQpKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgUHJvcENNQ29udGFpbmVyICYmICgoUHJvcENNQ29udGFpbmVyKSBjaGlsZCkuY2FuSGF2ZShpZGVudGlmaWVyKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDaGlsZEF0KGludCBpbmRleCkgewotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBpbmRleCA8IDAgfHwgbm9kZXMuc2l6ZSgpIDw9IGluZGV4KQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBQcm9wQ01Db250YWluZXIgZ2V0Q29udEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgyMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNQ29udGFpbmVyKSBub2RlOwotCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQkvLyByZWdpc3RlcgotCQkJbm9kZSA9IG5ldyBQcm9wQ01Db250YWluZXIobmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01Db250YWluZXIpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaWRlbnRzKSB7Ci0JCWlmIChpZGVudHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG5DaGlsZHJlbiA9IG5vZGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hpbGRyZW47IGkrKykgewotCQkJT2JqZWN0IG5vZGUgPSBub2Rlcy5lbGVtZW50QXQoaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFByb3BDTU5vZGUpCi0JCQkJKChQcm9wQ01Ob2RlKSBub2RlKS5nZXRJZGVudGlmaWVycyhpZGVudHMpOwotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFN0cmluZykKLQkJCQlpZGVudHMuYWRkKG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXROdW1DaGlsZCgpIHsKLQkJaWYgKG5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIG5vZGVzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9DT05UQUlORVI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbkNoaWxkcmVuID0gbm9kZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5DaGlsZHJlbjsgaSsrKSB7Ci0JCQlPYmplY3Qgbm9kZSA9IG5vZGVzLmVsZW1lbnRBdChpKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgUHJvcENNTm9kZSkKLQkJCQkoKFByb3BDTU5vZGUpIG5vZGUpLmdldFZhbHVlcyh2YWx1ZXMpOwotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCWlmICghdmFsdWVzLmNvbnRhaW5zKG5vZGUpKQotCQkJCQl2YWx1ZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JT2JqZWN0IHJlbW92ZUNoaWxkKE9iamVjdCBub2RlKSB7Ci0JCW5vZGVzLnJlbW92ZShub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUZvbnRQcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRm9udFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOGUyMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRm9udFByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNRm9udFByb3BlcnR5IGV4dGVuZHMgUHJvcENNUHJvcGVydHkgewotCi0JLy8gc3RhdGljIGZpZWxkcwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGNhY2hlZElkTWFwID0gbnVsbDsKLQkvLyBzZWxlY3RpbmcgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfRkFNSUxZID0gImZvbnQtZmFtaWx5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9TVFlMRSA9ICJmb250LXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9WQVJJQU5UID0gImZvbnQtdmFyaWFudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfV0VJR0hUID0gImZvbnQtd2VpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9TVFJFVENIID0gImZvbnQtc3RyZXRjaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfU0laRSA9ICJmb250LXNpemUiOy8vJE5PTi1OTFMtMSQKLQkvLyBxdWFsaWZpY2F0aW9uIHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9VTklDT0RFX1JBTkdFID0gInVuaWNvZGUtcmFuZ2UiOy8vJE5PTi1OTFMtMSQKLQkvLyBudW1lcmljIHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9VTklUU19QRVJfRU0gPSAidW5pdHMtcGVyLWVtIjsvLyROT04tTkxTLTEkCi0JLy8gcmVmZXJlbmNpbmcgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1NSQyA9ICJzcmMiOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXRjaGluZyBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfUEFOT1NFXzEgPSAicGFub3NlLTEiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9TVEVNViA9ICJzdGVtdiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1NURU1IID0gInN0ZW1oIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfU0xPUEUgPSAic2xvcGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9DQVBfSEVJR0hUID0gImNhcC1oZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9YX0hFSUdIVCA9ICJ4LWhlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0FTQ0VOVCA9ICJhc2NlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9ERVNDRU5UID0gImRlc2NlbnQiOy8vJE5PTi1OTFMtMSQKLQkvLyBzeW50aGVzaXMgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1dJRFRIUyA9ICJ3aWR0aHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9CQk9YID0gImJib3giOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9ERUZJTklUSU9OX1NSQyA9ICJkZWZpbml0aW9uLXNyYyI7Ly8kTk9OLU5MUy0xJAotCS8vIGFsaWdubWVudCBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfQkFTRUxJTkUgPSAiYmFzZWxpbmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9DRU5URVJMSU5FID0gImNlbnRlcmxpbmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9NQVRITElORSA9ICJtYXRobGluZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1RPUExJTkUgPSAidG9wbGluZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTUZvbnRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BDTVByb3BlcnR5IGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDEwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlpZiAoUHJvcENNTm9kZS5pc0xvYWRpbmcoKSkgewotCQkJbm9kZSA9IG5ldyBQcm9wQ01Gb250UHJvcGVydHkobmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldE5hbWVFbnVtKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIGluc3RhbmNlcy5rZXlzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBnZXRQcm9wZXJ0eUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfRk9OVFBST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIG5hbWVzKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIG5ldyBWZWN0b3IoaW5zdGFuY2VzLmtleVNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgbmFtZXMoT2JqZWN0IG1lZGlhR3JvdXApIHsKLQkJaWYgKG1lZGlhR3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybiBuYW1lcygpOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlWZWN0b3IgcHJvcGVydGllcyA9IG5ldyBWZWN0b3IoKTsKLQotCQlJdGVyYXRvciBpdCA9IGluc3RhbmNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wID0gKFByb3BDTVByb3BlcnR5KSBpdC5uZXh0KCk7Ci0JCQlpZiAocHJvcC5nZXRNZWRpYUdyb3VwcygpLmNvbnRhaW5zKG1lZGlhR3JvdXApKQotCQkJCXByb3BlcnRpZXMuYWRkKHByb3AuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIElmIGl0ZW50aWZpZXIgaXMgbnVsbCwgZ2V0IGFsbCBwcm9wZXJ0aWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgcHJvcGVydGllc0ZvcihTdHJpbmcgaWRlbnRpZmllciwgYm9vbGVhbiBzaG9ydGhhbmRzKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBpZiBpZGVudGlmaWVyIGlzIG51bGwsIGdldCBhbGwgcHJvcGVydGllcwotCQlpZiAoaWRlbnRpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBWZWN0b3IoaW5zdGFuY2VzLnZhbHVlcygpKTsKLQotCQlpZiAoY2FjaGVkSWRNYXAgPT0gbnVsbCkgewotCQkJLy8gc3RhcnQgY2FjaGVpbmcKLQkJCWNhY2hlZElkTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2VhcmNoIGNhY2hlZAotCQkJT2JqZWN0IHJldCA9IGNhY2hlZElkTWFwLmdldChpZGVudGlmaWVyICsgU3RyaW5nLnZhbHVlT2Yoc2hvcnRoYW5kcykpOwotCQkJaWYgKHJldCAhPSBudWxsKQotCQkJCXJldHVybiBuZXcgVmVjdG9yKChDb2xsZWN0aW9uKSByZXQpOwotCQl9Ci0KLQkJLy8gY3JlYXRlCi0JCUVudW1lcmF0aW9uIHByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0eUVudW0oKTsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQl3aGlsZSAocHJvcGVydGllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IChQcm9wQ01Qcm9wZXJ0eSkgcHJvcGVydGllcy5uZXh0RWxlbWVudCgpOwotCQkJaWYgKCFzaG9ydGhhbmRzICYmIHByb3AuaXNTaG9ydGhhbmQoKSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChwcm9wLmNhbkhhdmUoaWRlbnRpZmllcikpCi0JCQkJc2V0LmFkZChwcm9wKTsKLQkJfQotCi0JCS8vIGNhY2hlCi0JCWNhY2hlZElkTWFwLnB1dChpZGVudGlmaWVyICsgU3RyaW5nLnZhbHVlT2Yoc2hvcnRoYW5kcyksIHNldCk7Ci0KLQkJcmV0dXJuIG5ldyBWZWN0b3Ioc2V0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRnVuY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUZ1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZWZjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRnVuY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01GdW5jdGlvbiBleHRlbmRzIFByb3BDTU5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9BVFRSID0gImF0dHIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfQ09VTlRFUiA9ICJjb3VudGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1JHQiA9ICJyZ2IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfU0hBUEUgPSAicmVjdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9VUkkgPSAidXJsIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0ZPUk1BVCA9ICJmb3JtYXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfTE9DQUwgPSAibG9jYWwiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01GdW5jdGlvbihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldElkZW50aWZpZXJzKFNldCBpbmRlbnRzKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHB1YmxpYyBQcm9wQ01GdW5jdGlvbiBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMTApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTUZ1bmN0aW9uKSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQlub2RlID0gbmV3IFByb3BDTUZ1bmN0aW9uKG5hbWUpOwotCQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQkJfQotCi0JCXJldHVybiAoUHJvcENNRnVuY3Rpb24pIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfRlVOQzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldFZhbHVlcyhDb2xsZWN0aW9uIHZhbHVlcykgewotCQlpZiAodmFsdWVzICE9IG51bGwgJiYgIXZhbHVlcy5jb250YWlucyh0aGlzKSkKLQkJCXZhbHVlcy5hZGQodGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViOTZjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9wQ01Ob2RlIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX0lERU5USUZJRVIgPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX1BST1BFUlRZID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9OVU1CRVIgPSAyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX1NUUklORyA9IDM7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfRlVOQyA9IDQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfQ09OVEFJTkVSID0gNTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9TVUJQUk9QRVJUWSA9IDY7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfRk9OVFBST1BFUlRZID0gNzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9VTklDT0RFX1JBTkdFID0gODsKLQlwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBuYW1lID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBzaG9ydCBMT0FESU5HID0gMDsgLy8gMCA6IG5vdCBpbml0aWFsaXplZCwgMSA6IHVuZGVyCi0JCQkJCQkJCQkJLy8gaW5pdGlhbGl6aW5nLCAyIDogaW5pdGlhbGl6ZS1kb25lCi0JCQkJCQkJCQkJLy8gYW5kIGZpeCBEQgotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFByb3BDTU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2V0IGdldElkZW50aWZpZXJzKCkgewotCQlIYXNoU2V0IGlkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWdldElkZW50aWZpZXJzKGlkcyk7Ci0JCXJldHVybiBpZHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaW5kZW50cyk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBzaG9ydCBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRWYWx1ZXMoKSB7Ci0JCVZlY3RvciB2YWxzID0gbmV3IFZlY3RvcigpOwotCQlnZXRWYWx1ZXModmFscyk7Ci0JCXJldHVybiB2YWxzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWFic3RyYWN0IHZvaWQgZ2V0VmFsdWVzKENvbGxlY3Rpb24gdmFsdWVzKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0UHJvcGVydHlDTSgpIHsKLQkJaWYgKCFpc05lZWRJbml0aWFsaXplKCkpCi0JCQlyZXR1cm47Ci0JCUxPQURJTkcgPSAxOwotCi0JCVByb3BDTU51bWJlci5pbml0TnVtYmVyQ01EaW0oKTsKLQotCQkvLyBhemltdXRoCi0JCVByb3BDTVByb3BlcnR5IHByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQVpJTVVUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9BTkdMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlRfU0lERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRkFSX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NFTlRFUl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DRU5URVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NFTlRFUl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0ZBUl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFRfU0lERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkVISU5EKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUV0FSRFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUV0FSRFMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCi0JCS8vIGJhY2tncm91bmQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CRyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0lNQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1JFUEVBVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19BVFRBQ0hNRU5UKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDYpOwotCi0JCS8vIGJhY2tncm91bmQtYXR0YWNobWVudAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NDUk9MTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRklYRUQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYmFja2dyb3VuZC1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RSQU5TUEFSRU5UKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJhY2tncm91bmQtaW1hZ2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19JTUFHRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBiYWNrZ3JvdW5kLXBvc2l0aW9uIC0tLS0gc3ViLXByb3BlcnRpZXMgaG9yaXpvbnRhbAotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBiYWNrZ3JvdW5kLXBvc2l0aW9uIC0tLS0gc3ViLXByb3BlcnRpZXMgdmVydGljYWwKLQkJcHJvcCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT1RUT00pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYmFja2dyb3VuZC1wb3NpdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJhY2tncm91bmQtcmVwZWF0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUkVQRUFUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRVBFQVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JFUEVBVF9YKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRVBFQVRfWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9fUkVQRUFUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWNvbGxhcHNlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTExBUFNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT0xMQVBTRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VQQVJBVEUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUikpOwotCQkvLyBwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVFJBTlNQQVJFTlQpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItc3BhY2luZwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TUEFDSU5HKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKSk7Ci0JCS8vIHByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci10b3AKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXJpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWJvdHRvbQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItbGVmdAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXRvcC1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItdG9wLXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItdG9wLXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItcmlnaHQtY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItcmlnaHQtc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXJpZ2h0LXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1ib3R0b20tY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWJvdHRvbS1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWJvdHRvbS13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWxlZnQtY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1sZWZ0LXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWxlZnQtd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpOwotCQkvLyBwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvdHRvbQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNhcHRpb24tc2lkZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NBUFRJT05fU0lERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsZWFyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xFQVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT1RIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TVEFUSUMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2xpcCAtLS0tIHN1Yi1wcm9wZXJ0aWVzIHRvcAotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQkoKFByb3BDTVN1YlByb3BlcnR5KSBwcm9wKS5zZXRDb250YWluZXIoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsaXAgLS0tLSBzdWItcHJvcGVydGllcyByaWdodAotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCSgoUHJvcENNU3ViUHJvcGVydHkpIHByb3ApLnNldENvbnRhaW5lcihQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2xpcCAtLS0tIHN1Yi1wcm9wZXJ0aWVzIGJvdHRvbQotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQkoKFByb3BDTVN1YlByb3BlcnR5KSBwcm9wKS5zZXRDb250YWluZXIoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsaXAgLS0tLSBzdWItcHJvcGVydGllcyBsZWZ0Ci0JCXByb3AgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQkoKFByb3BDTVN1YlByb3BlcnR5KSBwcm9wKS5zZXRDb250YWluZXIoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsaXAKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9TSEFQRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNvbnRlbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT05URU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0FOWSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX0NPVU5URVIpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9BVFRSKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfT1BFTl9RVU9URSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0xPU0VfUVVPVEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PX09QRU5fUVVPVEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PX0NMT1NFX1FVT1RFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOyAvLyBpbmZpbml0ZQotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FMTCk7Ci0KLQkJLy8gY291bnRlci1pbmNyZW1lbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT1VOVEVSX0lOQ1JFTUVOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9DT1VOVEVSX0lEKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQUxMKTsKLQotCQkvLyBjb3VudGVyLXJlc2V0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09VTlRFUl9SRVNFVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9DT1VOVEVSX0lEKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQUxMKTsKLQotCQkvLyBjdWUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQkVGT1JFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9BRlRFUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIGN1ZS1hZnRlcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9BRlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIGN1ZS1iZWZvcmUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQkVGT1JFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gY3Vyc29yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VSU09SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DUk9TU0hBSVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0RFRkFVTFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1BPSU5URVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1BST0dSRVNTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NT1ZFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTkVfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OV19SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05fUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRV9SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NXX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU19SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1dfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9URVhUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XQUlUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9IRUxQKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsgLy8gaW5maW5pdGUKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0lOVEVSQUNUSVZFKTsKLQotCQkvLyBkaXJlY3Rpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVJFQ1RJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xUUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUlRMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGRpc3BsYXkKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVNQTEFZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkxJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lOTElORV9CTE9DSyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkxPQ0spOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xJU1RfSVRFTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUlVOX0lOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT01QQUNUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NQVJLRVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkxJTkVfVEFCTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX1JPV19HUk9VUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfSEVBREVSX0dST1VQKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9GT09URVJfR1JPVVApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX1JPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfQ09MVU1OX0dST1VQKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9DT0xVTU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX0NFTEwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX0NBUFRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FMTCk7Ci0KLQkJLy8gZWxldmF0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRUxFVkFUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0FOR0xFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkVMT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFVkVMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BQk9WRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElHSEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIGVtcHR5LWNlbGxzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRU1QVFlfQ0VMTFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NIT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJREUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZmxvYXQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GTE9BVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DQVBUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JQ09OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRU5VKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRVNTQUdFX0JPWCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU01BTExfQ0FQVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1RBVFVTX0JBUik7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LWZhbWlseQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0ZPTlQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9HRU5FUklDX0ZBTUlMWSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC1zaXplCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9BQlNPTFVURV9TSVpFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUkVMQVRJVkVfU0laRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXNpemUtYWRqdXN0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFX0FESlVTVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtc3RyZXRjaAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RSRVRDSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XSURFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTkFSUk9XRVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VMVFJBX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhUUkFfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NFTUlfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRU1JX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhUUkFfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VMVFJBX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JVEFMSUMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX09CTElRVUUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXZhcmlhbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NNQUxMX0NBUFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXdlaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT0xEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl8xMDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzIwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfMzAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl80MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzUwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNjAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl83MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzgwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfOTAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MSUdIVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT0xERVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBoZWlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9IRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsZWZ0dAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsZXR0ZXItc3BhY2luZwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xFVFRFUl9TUEFDSU5HKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsaW5lLWhlaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJTkVfSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxpc3Qtc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9UWVBFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsaXN0LXN0eWxlLWltYWdlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsaXN0LXN0eWxlLXBvc2l0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9QT1NJVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5TSURFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PVVRTSURFKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxpc3Qtc3R5bGUtdHlwZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRElTQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0lSQ0xFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TUVVBUkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0RFQ0lNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0RFQ0lNQUxfTEVBRElOR19aRVJPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUl9ST01BTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVVBQRVJfUk9NQU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPV0VSX0dSRUVLKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUl9BTFBIQSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XRVJfTEFUSU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VQUEVSX0FMUEhBKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VUFBFUl9MQVRJTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSEVCUkVXKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BUk1FTklBTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfR0VPUkdJQU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NKS19JREVPR1JBUEhJQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElSQUdBTkEpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0tBVEFLQU5BKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISVJBR0FOQV9JUk9IQSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfS0FUQUtBTkFfSVJPSEEpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFyZ2luCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9NQVJHSU5fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fUklHSFQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJnaW4tdG9wCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJnaW4tcmlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX01BUkdJTl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFyZ2luLWJvdHRvbQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX01BUkdJTl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFyZ2luLWxlZnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJrZXItb2Zmc2V0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS0VSX09GRlNFVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmtzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS1MpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NST1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NST1NTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIG1heC1oZWlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVhfSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWF4LXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFYX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWluLWhlaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01JTl9IRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtaW4td2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NSU5fV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBvcnBoYW5zCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1JQSEFOUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gb3V0bGluZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9XSURUSCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9JTlRFUkFDVElWRSk7Ci0KLQkJLy8gb3V0bGluZS1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5WRVJUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0lOVEVSQUNUSVZFKTsKLQotCQkvLyBvdXRsaW5lLXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9JTlRFUkFDVElWRSk7Ci0KLQkJLy8gb3V0bGluZS13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fSU5URVJBQ1RJVkUpOwotCi0JCS8vIG92ZXJmbG93Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1ZFUkZMT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1ZJU0lCTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJRERFTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0NST0xMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZGRpbmcKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfUklHSFQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19MRUZUKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZGRpbmctdG9wCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZGRpbmctcmlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBwYWRkaW5nLWJvdHRvbQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBwYWRkaW5nLWxlZnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZ2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX1BBR0VfSUQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBwYWdlLWJyZWFrLWFmdGVyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19BRlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxXQVlTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVk9JRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHBhZ2UtYnJlYWstYmVmb3JlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19CRUZPUkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMV0FZUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVZPSUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBwYWdlLWJyZWFrLWluc2lkZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfSU5TSURFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVk9JRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gcGF1c2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9USU1FKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcGF1c2UtYWZ0ZXIKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRV9BRlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9USU1FKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHBhdXNlLWJlZm9yZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFX0JFRk9SRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9USU1FKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHBpdGNoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUElUQ0gpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfRlJFUVVFTkNZKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9MT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVESVVNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISUdIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX0hJR0gpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBwaXRjaC1yYW5nZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BJVENIX1JBTkdFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBwbGF5LWR1cmluZwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BMQVlfRFVSSU5HKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NSVgpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JFUEVBVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcG9zaXRpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QT1NJVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUJTT0xVVEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JFTEFUSVZFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GSVhFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1RBVElDKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHF1b3RlcwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1FVT1RFUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9BTlkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHJpY2huZXNzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklDSE5FU1MpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHJpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBzaXplCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9QT1JUUkFJVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEFORFNDQVBFKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHNwZWFrCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUspOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1BFTExfT1VUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gc3BlYWstaGVhZGVyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfSEVBREVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PTkNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTFdBWVMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBzcGVhay1udW1lcmFsCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfTlVNRVJBTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRElHSVRTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT05USU5VT1VTKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gc3BlYWstcHVuY3R1YXRpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19QVU5DVFVBVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09ERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHNwZWVjaC1yYXRlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFRUNIX1JBVEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9TTE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TTE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRURJVU0pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0ZBU1QpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1hfRkFTVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHN0cmVzcwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NUUkVTUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gdGFibGUtbGF5b3V0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEFCTEVfTEFZT1VUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GSVhFRCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0ZXh0LWFsaWduCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9BTElHTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSlVTVElGWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9BTlkpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHRleHQtZGVjb3JhdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfREVDT1JBVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVU5ERVJMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PVkVSTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTElORV9USFJPVUdIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CTElOSyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHRleHQtaW5kZW50Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9JTkRFTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0ZXh0LXNoYWRvdwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfU0hBRE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0ZXh0LXRyYW5zZm9ybQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfVFJBTlNGT1JNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DQVBJVEFMSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VUFBFUkNBU0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPV0VSQ0FTRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0b3AKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB1bmljb2RlLWJpZGkKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9VTklDT0RFX0JJREkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRU1CRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JJRElfT1ZFUlJJREUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdmVydGljYWwtYWxpZ24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WRVJUSUNBTF9BTElHTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9URVhUX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1VCKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CQVNFTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUlERExFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TVVBFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEVYVF9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHZpc2liaWxpdHkKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WSVNJQklMSVRZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9WSVNJQkxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISURERU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPTExBUFNFKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHZvaWNlLWZhbWlseQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZPSUNFX0ZBTUlMWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9WT0lDRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0dFTkVSSUNfVk9JQ0UpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gdm9sdW1lCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVk9MVU1FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NJTEVOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9TT0ZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TT0ZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRURJVU0pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPVUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1hfTE9VRCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHdoaXRlLXNwYWNlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0hJVEVfU1BBQ0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUFJFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9QUkVfTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUFJFX1dSQVApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PV1JBUCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB3aWRvd3MKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSURPV1MpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSU5URUdFUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB3b3JkLXNwYWNpbmcKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XT1JEX1NQQUNJTkcpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHotaW5kZXgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9aX0lOREVYKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0lOVEVHRVIpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8qKiAqKioqKioqKiBmb250IHByb3BlcnRpZXMgKioqKioqKioqICovCi0JCS8vIGZvbnQtZmFtaWx5Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfRk9OVF9GQU1JTFkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfRk9OVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0dFTkVSSUNfRkFNSUxZKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gZm9udC1zdHlsZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lUQUxJQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfT0JMSVFVRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTEwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIGZvbnQtdmFyaWFudAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfVkFSSUFOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU01BTExfQ0FQUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBmb250LXdlaWdodAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfV0VJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT0xEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl8xMDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzIwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfMzAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl80MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzUwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNjAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl83MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzgwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfOTAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gZm9udC1zdHJldGNoCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfRk9OVF9TVFJFVENIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VMVFJBX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhUUkFfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NFTUlfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRU1JX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhUUkFfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VMVFJBX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTEwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIGZvbnQtc2l6ZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQUJTT0xVVEVfU0laRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1JFTEFUSVZFX1NJWkUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gdW5pY29kZS1yYW5nZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1VOSUNPREVfUkFOR0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVVSYW5nZS5nZXRJbnN0YW5jZU9mKFByb3BDTVVSYW5nZS5WQUxfVVJBTkdFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gdW5pdHMtcGVyLWVtCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfVU5JVFNfUEVSX0VNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHNyYwotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1NSQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfRk9STUFUKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfTE9DQUwpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBwYW5vc2UtMQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1BBTk9TRV8xKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0lOVEVHRVIpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDEwKTsKLQotCQkvLyBzdGVtdgotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1NURU1WKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHN0ZW1oCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfU1RFTUgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gc2xvcGUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9TTE9QRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBjYXAtaGVpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfQ0FQX0hFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyB4LWhlaWdodAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1hfSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIGFzY2VudAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0FTQ0VOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBkZXNjZW50Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfREVTQ0VOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyB3aWR0aHMKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9XSURUSFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNVVJhbmdlLmdldEluc3RhbmNlT2YoUHJvcENNVVJhbmdlLlZBTF9VUkFOR0UpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBiYm94Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfQkJPWCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0KLQkJLy8gZGVmaW5pdGlvbi1zcmMKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9ERUZJTklUSU9OX1NSQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0KLQkJLy8gYmFzZWxpbmUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9CQVNFTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBjZW50ZXJsaW5lCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfQ0VOVEVSTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBtYXRobGluZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX01BVEhMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHRvcGxpbmUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9UT1BMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8qKiAqKioqKioqKiBjb250YWluZXJzICoqKioqKioqKiAqLwotCi0JCS8vIGFic29sdXRlLXNpemUKLQkJUHJvcENNQ29udGFpbmVyIGNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9BQlNPTFVURV9TSVpFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YWF9TTUFMTCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9TTUFMTCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU01BTEwpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01FRElVTSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEFSR0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1hfTEFSR0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1hYX0xBUkdFKTsKLQotCQkvLyBib3JkZXItc3R5bGUKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU09MSUQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0RBU0hFRCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfRE9UVEVEKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ET1VCTEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0dST09WRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklER0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lOU0VUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PVVRTRVQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0hJRERFTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0KLQkJLy8gYm9yZGVyLXdpZHRoCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RISU4pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01FRElVTSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhJQ0spOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0KLQkJLy8gY29sb3IKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BUVVBKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CTEFDSyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkxVRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfRlVDSFNJQSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfR1JBWSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfR1JFRU4pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0xJTUUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01BUk9PTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTkFWWSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfT0xJVkUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX09SQU5HRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfUFVSUExFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRUQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NJTFZFUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEVBTCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfV0hJVEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1lFTExPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfU1lTVEVNX0NPTE9SKSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfUkdCKSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9IQVNIKSk7Ci0KLQkJLy8gc3lzdGVtIGNvbG9yCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9TWVNURU1fQ09MT1IpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0FDVElWRUJPUkRFUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUNUSVZFQ0FQVElPTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVBQV09SS1NQQUNFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CQUNLR1JPVU5EKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CVVRUT05GQUNFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CVVRUT05ISUdITElHSFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JVVFRPTlNIQURPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQlVUVE9OVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0FQVElPTlRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0dSQVlURVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISUdITElHSFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0hJR0hMSUdIVFRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lOQUNUSVZFQk9SREVSKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkFDVElWRUNBUFRJT04pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lOQUNUSVZFQ0FQVElPTlRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lORk9CQUNLR1JPVU5EKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkZPVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVOVSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVOVVRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NDUk9MTEJBUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhSRUVEREFSS1NIQURPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhSRUVERkFDRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhSRUVESElHSExJR0hUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USFJFRURMSUdIVFNIQURPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhSRUVEU0hBRE9XKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XSU5ET1cpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1dJTkRPV0ZSQU1FKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XSU5ET1dURVhUKTsKLQotCQkvLyBnZW5lcmljLWZhbWlseQotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfR0VORVJJQ19GQU1JTFkpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NFUklGKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TQU5TX1NFUklGKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DVVJTSVZFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GQU5UQVNZKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NT05PU1BBQ0UpOwotCi0JCS8vIGdlbmVyaWMtdm9pY2UKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0dFTkVSSUNfVk9JQ0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01BTEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0ZFTUFMRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0hJTEQpOwotCi0JCS8vIG1hcmdpbi13aWR0aAotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCi0JCS8vIHBhZGRpbmctd2lkdGgKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0KLQkJLy8gcmVsYXRpdmUtc2l6ZQotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUkVMQVRJVkVfU0laRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU01BTExFUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEFSR0VSKTsKLQotCQlMT0FESU5HID0gMjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNMb2FkaW5nKCkgewotCQlyZXR1cm4gTE9BRElORyA9PSAxOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc05lZWRJbml0aWFsaXplKCkgewotCQlyZXR1cm4gTE9BRElORyA9PSAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU51bWJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNTnVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTZiYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNTnVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTU51bWJlciBleHRlbmRzIFByb3BDTU5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfQU5HTEUgPSAiYW5nbGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0ZSRVFVRU5DWSA9ICJmcmVxdWVuY3kiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0lOVEVHRVIgPSAiaW50ZWdlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfTEVOR1RIID0gImxlbmd0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfUEVSQ0VOVEFHRSA9ICJwZXJjZW50YWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9USU1FID0gInRpbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0hBU0ggPSAiaGFzaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX05VTSA9ICJudW1iZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fQ00gPSAiY20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fREVHID0gImRlZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9FTVMgPSAiZW0iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fRVhTID0gImV4IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0dSQUQgPSAiZ3JhZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9IQVNIID0gIiMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fSFogPSAiSHoiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fSU4gPSAiaW4iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fSU5URUdFUiA9ICJJTlRFR0VSIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0tIWiA9ICJrSHoiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fTU0gPSAibW0iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fTVMgPSAibXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fTlVNQkVSID0gIk5VTUJFUiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9QQyA9ICJwYyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9QRVJDRU5UQUdFID0gIiUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUFQgPSAicHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUFggPSAicHgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUkFEID0gInJhZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9TID0gInMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3IgZkRpbXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNTnVtYmVyKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpbWVuc2lvbihzaG9ydCBwcmltaXRpdmVUeXBlKSB7Ci0JCXN3aXRjaCAocHJpbWl0aXZlVHlwZSkgewotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ00gOgotCQkJCXJldHVybiBESU1fQ007Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ERUcgOgotCQkJCXJldHVybiBESU1fREVHOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TIDoKLQkJCQlyZXR1cm4gRElNX0VNUzsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUyA6Ci0JCQkJcmV0dXJuIERJTV9FWFM7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEIDoKLQkJCQlyZXR1cm4gRElNX0dSQUQ7Ci0JCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSCA6Ci0JCQkJcmV0dXJuIERJTV9IQVNIOyAvLyBwcmVmaXggZGltZW5zaW9uIC4uLi4KLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0haIDoKLQkJCQlyZXR1cm4gRElNX0haOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU4gOgotCQkJCXJldHVybiBESU1fSU47Ci0JCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUiA6Ci0JCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWiA6Ci0JCQkJcmV0dXJuIERJTV9LSFo7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTSA6Ci0JCQkJcmV0dXJuIERJTV9NTTsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TIDoKLQkJCQlyZXR1cm4gRElNX01TOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIDoKLQkJCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEMgOgotCQkJCXJldHVybiBESU1fUEM7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFIDoKLQkJCQlyZXR1cm4gRElNX1BFUkNFTlRBR0U7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVCA6Ci0JCQkJcmV0dXJuIERJTV9QVDsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYIDoKLQkJCQlyZXR1cm4gRElNX1BYOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEIDoKLQkJCQlyZXR1cm4gRElNX1JBRDsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1MgOgotCQkJCXJldHVybiBESU1fUzsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTZXQgZ2V0RGltZW5zaW9ucygpIHsKLQkJSGFzaFNldCB2YWxzID0gbmV3IEhhc2hTZXQoKTsKLQkJSXRlcmF0b3IgaXQgPSBmRGltcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQl2YWxzLmFkZChpdC5uZXh0KCkpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaW5kZW50cykgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBwdWJsaWMgUHJvcENNTnVtYmVyIGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgyMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNTnVtYmVyKSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQlub2RlID0gbmV3IFByb3BDTU51bWJlcihuYW1lKTsKLQkJCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gKFByb3BDTU51bWJlcikgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9OVU1CRVI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnModGhpcykpCi0JCQl2YWx1ZXMuYWRkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyB2b2lkIGluaXROdW1iZXJDTURpbSgpIHsKLQkJUHJvcENNTnVtYmVyIG51bSA9IGdldEluc3RhbmNlT2YoVkFMX0FOR0xFKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fREVHKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fR1JBRCk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1JBRCk7Ci0KLQkJbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfRlJFUVVFTkNZKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fSFopOwotCQludW0uZkRpbXMuYWRkKERJTV9LSFopOwotCi0JCW51bSA9IGdldEluc3RhbmNlT2YoVkFMX0hBU0gpOwotCQludW0uZkRpbXMuYWRkKERJTV9IQVNIKTsKLQotCQkvLyBudW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9JTlRFR0VSKTsKLQkJLy8gbnVtLmZEaW1zLmFkZChESU1fSU5URUdFUik7Ci0KLQkJbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfTEVOR1RIKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fQ00pOwotCQludW0uZkRpbXMuYWRkKERJTV9FTVMpOwotCQludW0uZkRpbXMuYWRkKERJTV9FWFMpOwotCQludW0uZkRpbXMuYWRkKERJTV9JTik7Ci0JCW51bS5mRGltcy5hZGQoRElNX01NKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fUEMpOwotCQludW0uZkRpbXMuYWRkKERJTV9QVCk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1BYKTsKLQotCQkvLyBudW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9OVU1CRVIpOwotCQkvLyBudW0uZkRpbXMuYWRkKERJTV9OVU1CRVIpOwotCi0JCW51bSA9IGdldEluc3RhbmNlT2YoVkFMX1BFUkNFTlRBR0UpOwotCQludW0uZkRpbXMuYWRkKERJTV9QRVJDRU5UQUdFKTsKLQotCQludW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9USU1FKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fTVMpOwotCQludW0uZkRpbXMuYWRkKERJTV9TKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmFiMzhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVByb3BlcnR5IGV4dGVuZHMgUHJvcENNQ29udGFpbmVyIHsKLQotCS8vIHN0YXRpYyBmaWVsZHMKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBjYWNoZWRJZE1hcCA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9BWklNVVRIID0gImF6aW11dGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JHID0gImJhY2tncm91bmQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JHX0FUVEFDSE1FTlQgPSAiYmFja2dyb3VuZC1hdHRhY2htZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19DT0xPUiA9ICJiYWNrZ3JvdW5kLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19JTUFHRSA9ICJiYWNrZ3JvdW5kLWltYWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19QT1NJVElPTiA9ICJiYWNrZ3JvdW5kLXBvc2l0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19SRVBFQVQgPSAiYmFja2dyb3VuZC1yZXBlYXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUiA9ICJib3JkZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9DT0xMQVBTRSA9ICJib3JkZXItY29sbGFwc2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9DT0xPUiA9ICJib3JkZXItY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9TUEFDSU5HID0gImJvcmRlci1zcGFjaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfU1RZTEUgPSAiYm9yZGVyLXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QID0gImJvcmRlci10b3AiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVCA9ICJib3JkZXItcmlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT00gPSAiYm9yZGVyLWJvdHRvbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlQgPSAiYm9yZGVyLWxlZnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1BfQ09MT1IgPSAiYm9yZGVyLXRvcC1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUX0NPTE9SID0gImJvcmRlci1yaWdodC1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTV9DT0xPUiA9ICJib3JkZXItYm90dG9tLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVF9DT0xPUiA9ICJib3JkZXItbGVmdC1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUF9TVFlMRSA9ICJib3JkZXItdG9wLXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFRfU1RZTEUgPSAiYm9yZGVyLXJpZ2h0LXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NX1NUWUxFID0gImJvcmRlci1ib3R0b20tc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUX1NUWUxFID0gImJvcmRlci1sZWZ0LXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QX1dJRFRIID0gImJvcmRlci10b3Atd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVF9XSURUSCA9ICJib3JkZXItcmlnaHQtd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT01fV0lEVEggPSAiYm9yZGVyLWJvdHRvbS13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlRfV0lEVEggPSAiYm9yZGVyLWxlZnQtd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9XSURUSCA9ICJib3JkZXItd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPVFRPTSA9ICJib3R0b20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NBUFRJT05fU0lERSA9ICJjYXB0aW9uLXNpZGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NMRUFSID0gImNsZWFyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DTElQID0gImNsaXAiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NPTE9SID0gImNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT05URU5UID0gImNvbnRlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NPVU5URVJfSU5DUkVNRU5UID0gImNvdW50ZXItaW5jcmVtZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT1VOVEVSX1JFU0VUID0gImNvdW50ZXItcmVzZXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRSA9ICJjdWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRV9BRlRFUiA9ICJjdWUtYWZ0ZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRV9CRUZPUkUgPSAiY3VlLWJlZm9yZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ1VSU09SID0gImN1cnNvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRElSRUNUSU9OID0gImRpcmVjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRElTUExBWSA9ICJkaXNwbGF5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9FTEVWQVRJT04gPSAiZWxldmF0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9FTVBUWV9DRUxMUyA9ICJlbXB0eS1jZWxscyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRkxPQVQgPSAiZmxvYXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlQgPSAiZm9udCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9GQU1JTFkgPSAiZm9udC1mYW1pbHkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU0laRSA9ICJmb250LXNpemUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU0laRV9BREpVU1QgPSAiZm9udC1zaXplLWFkanVzdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TVFJFVENIID0gImZvbnQtc3RyZXRjaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TVFlMRSA9ICJmb250LXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1ZBUklBTlQgPSAiZm9udC12YXJpYW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1dFSUdIVCA9ICJmb250LXdlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfSEVJR0hUID0gImhlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTEVGVCA9ICJsZWZ0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MRVRURVJfU1BBQ0lORyA9ICJsZXR0ZXItc3BhY2luZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElORV9IRUlHSFQgPSAibGluZS1oZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEUgPSAibGlzdC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRV9JTUFHRSA9ICJsaXN0LXN0eWxlLWltYWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFX1BPU0lUSU9OID0gImxpc3Qtc3R5bGUtcG9zaXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEVfVFlQRSA9ICJsaXN0LXN0eWxlLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTiA9ICJtYXJnaW4iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9UT1AgPSAibWFyZ2luLXRvcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX1JJR0hUID0gIm1hcmdpbi1yaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX0JPVFRPTSA9ICJtYXJnaW4tYm90dG9tIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fTEVGVCA9ICJtYXJnaW4tbGVmdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSS0VSX09GRlNFVCA9ICJtYXJrZXItb2Zmc2V0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJLUyA9ICJtYXJrcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFYX0hFSUdIVCA9ICJtYXgtaGVpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVhfV0lEVEggPSAibWF4LXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NSU5fSEVJR0hUID0gIm1pbi1oZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01JTl9XSURUSCA9ICJtaW4td2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX09SUEhBTlMgPSAib3JwaGFucyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORSA9ICJvdXRsaW5lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FX0NPTE9SID0gIm91dGxpbmUtY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkVfU1RZTEUgPSAib3V0bGluZS1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORV9XSURUSCA9ICJvdXRsaW5lLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVkVSRkxPVyA9ICJvdmVyZmxvdyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElORyA9ICJwYWRkaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX1RPUCA9ICJwYWRkaW5nLXRvcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19SSUdIVCA9ICJwYWRkaW5nLXJpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX0JPVFRPTSA9ICJwYWRkaW5nLWJvdHRvbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19MRUZUID0gInBhZGRpbmctbGVmdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRSA9ICJwYWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0FGVEVSID0gInBhZ2UtYnJlYWstYWZ0ZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0VfQlJFQUtfQkVGT1JFID0gInBhZ2UtYnJlYWstYmVmb3JlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0lOU0lERSA9ICJwYWdlLWJyZWFrLWluc2lkZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFVU0UgPSAicGF1c2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBVVNFX0FGVEVSID0gInBhdXNlLWFmdGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQVVTRV9CRUZPUkUgPSAicGF1c2UtYmVmb3JlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QSVRDSCA9ICJwaXRjaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUElUQ0hfUkFOR0UgPSAicGl0Y2gtcmFuZ2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BMQVlfRFVSSU5HID0gInBsYXktZHVyaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QT1NJVElPTiA9ICJwb3NpdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUVVPVEVTID0gInF1b3RlcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUklDSE5FU1MgPSAicmljaG5lc3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1JJR0hUID0gInJpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TSVpFID0gInNpemUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLID0gInNwZWFrIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19IRUFERVIgPSAic3BlYWstaGVhZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19OVU1FUkFMID0gInNwZWFrLW51bWVyYWwiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLX1BVTkNUVUFUSU9OID0gInNwZWFrLXB1bmN0dWF0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVFQ0hfUkFURSA9ICJzcGVlY2gtcmF0ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1RSRVNTID0gInN0cmVzcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEFCTEVfTEFZT1VUID0gInRhYmxlLWxheW91dCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9BTElHTiA9ICJ0ZXh0LWFsaWduIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX0RFQ09SQVRJT04gPSAidGV4dC1kZWNvcmF0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX0lOREVOVCA9ICJ0ZXh0LWluZGVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9TSEFET1cgPSAidGV4dC1zaGFkb3ciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfVFJBTlNGT1JNID0gInRleHQtdHJhbnNmb3JtIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9UT1AgPSAidG9wIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9VTklDT0RFX0JJREkgPSAidW5pY29kZS1iaWRpIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WRVJUSUNBTF9BTElHTiA9ICJ2ZXJ0aWNhbC1hbGlnbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVklTSUJJTElUWSA9ICJ2aXNpYmlsaXR5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WT0lDRV9GQU1JTFkgPSAidm9pY2UtZmFtaWx5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WT0xVTUUgPSAidm9sdW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XSElURV9TUEFDRSA9ICJ3aGl0ZS1zcGFjZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0lET1dTID0gIndpZG93cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0lEVEggPSAid2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1dPUkRfU1BBQ0lORyA9ICJ3b3JkLXNwYWNpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1pfSU5ERVggPSAiei1pbmRleCI7Ly8kTk9OLU5MUy0xJAotCS8vIGluc3RhbmNlIGZpZWxkcwotCXByaXZhdGUgaW50IGZNaW5WYWx1ZUNvdW50ID0gMTsKLQlwcml2YXRlIGludCBmTWF4VmFsdWVDb3VudCA9IDE7Ci0JcHJpdmF0ZSBPYmplY3RbXSBtZWRpYUdyb3VwczsKLQlwcm90ZWN0ZWQgTGlzdCBjb250YWluZXJzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTVByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCU9iamVjdCBhcHBlbmRDaGlsZChPYmplY3Qgbm9kZSkgewotCQlPYmplY3QgcmV0ID0gc3VwZXIuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgUHJvcENNUHJvcGVydHkpIHsKLQkJCS8vIHJlZ2lzdGVyIHNob3J0aGFuZCBjb250YWluZXIKLQkJCVByb3BDTVByb3BlcnR5IGNtID0gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCQkJaWYgKGNtLmNvbnRhaW5lcnMgPT0gbnVsbCkKLQkJCQljbS5jb250YWluZXJzID0gbmV3IFZlY3RvcigpOwotCQkJaWYgKCFjbS5jb250YWluZXJzLmNvbnRhaW5zKHRoaXMpKQotCQkJCWNtLmNvbnRhaW5lcnMuYWRkKHRoaXMpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhcHBlbmRNZWRpYUdyb3VwKE9iamVjdCBtZykgewotCQlpZiAobWVkaWFHcm91cHMgPT0gbnVsbCkKLQkJCW1lZGlhR3JvdXBzID0gbmV3IE9iamVjdFsxXTsKLQkJZWxzZSB7Ci0JCQlPYmplY3RbXSBvbGRNZWRpYUdyb3VwcyA9IG1lZGlhR3JvdXBzOwotCQkJbWVkaWFHcm91cHMgPSBuZXcgT2JqZWN0W29sZE1lZGlhR3JvdXBzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRNZWRpYUdyb3VwcywgMCwgbWVkaWFHcm91cHMsIDAsIG9sZE1lZGlhR3JvdXBzLmxlbmd0aCk7Ci0JCX0KLQkJbWVkaWFHcm91cHNbbWVkaWFHcm91cHMubGVuZ3RoIC0gMV0gPSBtZzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BDTVByb3BlcnR5IGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDIwMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJaWYgKFByb3BDTU5vZGUuaXNMb2FkaW5nKCkpIHsKLQkJCW5vZGUgPSBuZXcgUHJvcENNUHJvcGVydHkobmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heFZhbHVlQ291bnQoKSB7Ci0JCXJldHVybiBmTWF4VmFsdWVDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZWRpYUdyb3VwcygpIHsKLQkJaWYgKG1lZGlhR3JvdXBzICE9IG51bGwpCi0JCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChtZWRpYUdyb3Vwcyk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRNaW5WYWx1ZUNvdW50KCkgewotCQlyZXR1cm4gZk1pblZhbHVlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBnZXROYW1lRW51bSgpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBpbnN0YW5jZXMua2V5cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZ2V0UHJvcGVydHlFbnVtKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIGluc3RhbmNlcy5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2hvcnRoYW5kQ29udGFpbmVyQ291bnQoKSB7Ci0JCXJldHVybiAoY29udGFpbmVycyA9PSBudWxsKSA/IDAgOiBjb250YWluZXJzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9QUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3J0aGFuZCgpIHsKLQkJaW50IG5DaGlsZCA9IGdldE51bUNoaWxkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkNoaWxkOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBnZXRDaGlsZEF0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb3BDTVByb3BlcnR5ICYmICEob2JqIGluc3RhbmNlb2YgUHJvcENNU3ViUHJvcGVydHkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBuYW1lcygpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBuZXcgVmVjdG9yKGluc3RhbmNlcy5rZXlTZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IG5hbWVzKE9iamVjdCBtZWRpYUdyb3VwKSB7Ci0JCWlmIChtZWRpYUdyb3VwID09IG51bGwpCi0JCQlyZXR1cm4gbmFtZXMoKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJVmVjdG9yIHByb3BlcnRpZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJSXRlcmF0b3IgaXQgPSBpbnN0YW5jZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IChQcm9wQ01Qcm9wZXJ0eSkgaXQubmV4dCgpOwotCQkJaWYgKHByb3AuZ2V0TWVkaWFHcm91cHMoKS5jb250YWlucyhtZWRpYUdyb3VwKSkKLQkJCQlwcm9wZXJ0aWVzLmFkZChwcm9wLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBJZiBpZGVudGlmaWVyIGlzIG51bGwsIGdldCBhbGwgcHJvcGVydGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIHByb3BlcnRpZXNGb3IoU3RyaW5nIGlkZW50aWZpZXIsIGJvb2xlYW4gc2hvcnRoYW5kcykgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gaWYgaWRlbnRpZmllciBpcyBudWxsLCBnZXQgYWxsIHByb3BlcnRpZXMKLQkJaWYgKGlkZW50aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgVmVjdG9yKGluc3RhbmNlcy52YWx1ZXMoKSk7Ci0KLQkJaWYgKGNhY2hlZElkTWFwID09IG51bGwpIHsKLQkJCS8vIHN0YXJ0IGNhY2hlaW5nCi0JCQljYWNoZWRJZE1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHNlYXJjaCBjYWNoZWQKLQkJCU9iamVjdCByZXQgPSBjYWNoZWRJZE1hcC5nZXQoaWRlbnRpZmllciArIFN0cmluZy52YWx1ZU9mKHNob3J0aGFuZHMpKTsKLQkJCWlmIChyZXQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IFZlY3RvcigoQ29sbGVjdGlvbikgcmV0KTsKLQkJfQotCi0JCS8vIGNyZWF0ZQotCQlFbnVtZXJhdGlvbiBwcm9wZXJ0eUVudW0gPSBnZXRQcm9wZXJ0eUVudW0oKTsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQl3aGlsZSAocHJvcGVydHlFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wID0gKFByb3BDTVByb3BlcnR5KSBwcm9wZXJ0eUVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghc2hvcnRoYW5kcyAmJiBwcm9wLmlzU2hvcnRoYW5kKCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAocHJvcC5jYW5IYXZlKGlkZW50aWZpZXIpKQotCQkJCXNldC5hZGQocHJvcCk7Ci0JCX0KLQotCQkvLyBjYWNoZQotCQljYWNoZWRJZE1hcC5wdXQoaWRlbnRpZmllciArIFN0cmluZy52YWx1ZU9mKHNob3J0aGFuZHMpLCBzZXQpOwotCi0JCXJldHVybiBuZXcgVmVjdG9yKHNldCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWF4VmFsdWVDb3VudChpbnQgbmV3TWF4VmFsdWVDb3VudCkgewotCQlmTWF4VmFsdWVDb3VudCA9IG5ld01heFZhbHVlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWluVmFsdWVDb3VudChpbnQgbmV3TWluVmFsdWVDb3VudCkgewotCQlmTWluVmFsdWVDb3VudCA9IG5ld01pblZhbHVlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFByb3BDTVByb3BlcnR5IHNob3J0aGFuZENvbnRhaW5lckF0KGludCBpKSB7Ci0JCWlmIChjb250YWluZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGkgPCAwIHx8IGNvbnRhaW5lcnMuc2l6ZSgpIDw9IGkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgY29udGFpbmVycy5nZXQoaSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIHNob3J0aGFuZENvbnRhaW5lckl0ZXJhdG9yKCkgewotCQlpZiAoY29udGFpbmVycyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBjb250YWluZXJzLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVN0cmluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTFlODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01TdHJpbmcgZXh0ZW5kcyBQcm9wQ01Ob2RlIHsKLQotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0ZPTlQgPSAiZm9udCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfQ09VTlRFUl9JRCA9ICJjb3VudGVySWQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX1BBR0VfSUQgPSAicGFnZUlkIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9WT0lDRSA9ICJ2b2ljZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfQU5ZID0gImFueSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01TdHJpbmcoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaW5kZW50cykgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBwdWJsaWMgUHJvcENNU3RyaW5nIGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNU3RyaW5nKSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCW5vZGUgPSBuZXcgUHJvcENNU3RyaW5nKG5hbWUpOwotCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCi0JCXJldHVybiAoUHJvcENNU3RyaW5nKSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX1NUUklORzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldFZhbHVlcyhDb2xsZWN0aW9uIHZhbHVlcykgewotCQlpZiAodmFsdWVzICE9IG51bGwgJiYgIXZhbHVlcy5jb250YWlucyh0aGlzKSkKLQkJCXZhbHVlcy5hZGQodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3ViUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVN1YlByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZWJiMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3ViUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVN1YlByb3BlcnR5IGV4dGVuZHMgUHJvcENNUHJvcGVydHkgewotCi0JLy8gc3RhdGljIGZpZWxkcwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0JHX1BPU0lUSU9OX1ggPSAiYmFja2dyb3VuZC1wb3NpdGlvbkgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0JHX1BPU0lUSU9OX1kgPSAiYmFja2dyb3VuZC1wb3NpdGlvblYiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0NMSVBfVE9QID0gImNsaXBUb3AiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0NMSVBfUklHSFQgPSAiY2xpcFJpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFNVQl9DTElQX0JPVFRPTSA9ICJjbGlwQm90dG9tIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFNVQl9DTElQX0xFRlQgPSAiY2xpcExlZnQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01TdWJQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUHJvcENNUHJvcGVydHkgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gc2hvcnRoYW5kQ29udGFpbmVyQXQoMCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wQ01Qcm9wZXJ0eSBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJaWYgKFByb3BDTU5vZGUuaXNMb2FkaW5nKCkpIHsKLQkJCW5vZGUgPSBuZXcgUHJvcENNU3ViUHJvcGVydHkobmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldE5hbWVFbnVtKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIGluc3RhbmNlcy5rZXlzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBnZXRQcm9wZXJ0eUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfU1VCUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgbmFtZXMoKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gbmV3IFZlY3RvcihpbnN0YW5jZXMua2V5U2V0KCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihQcm9wQ01Qcm9wZXJ0eSBwcm9wKSB7Ci0JCWlmIChjb250YWluZXJzID09IG51bGwpCi0JCQljb250YWluZXJzID0gbmV3IFZlY3RvcigpOwotCQljb250YWluZXJzLmNsZWFyKCk7Ci0JCWNvbnRhaW5lcnMuYWRkKHByb3ApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01VUmFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVVSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzc1NzE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVVSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVVSYW5nZSBleHRlbmRzIFByb3BDTU5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9VUkFOR0UgPSAidXJhbmdlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNVVJhbmdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0SWRlbnRpZmllcnMoU2V0IGluZGVudHMpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BDTVVSYW5nZSBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMTApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTVVSYW5nZSkgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlub2RlID0gbmV3IFByb3BDTVVSYW5nZShuYW1lKTsKLQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQotCQlyZXR1cm4gKFByb3BDTVVSYW5nZSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9VTklDT0RFX1JBTkdFOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0VmFsdWVzKENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMgIT0gbnVsbCAmJiAhdmFsdWVzLmNvbnRhaW5zKHRoaXMpKQotCQkJdmFsdWVzLmFkZCh0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTZiYTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01VdGlsIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtaW51cyhDb2xsZWN0aW9uIHNyYywgQ29sbGVjdGlvbiByZWYpIHsKLQkJSXRlcmF0b3IgaXQgPSByZWYuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmIChzcmMuY29udGFpbnMob2JqKSkKLQkJCQlzcmMucmVtb3ZlKG9iaik7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwbHVzKENvbGxlY3Rpb24gc3JjLCBDb2xsZWN0aW9uIHJlZikgewotCQlJdGVyYXRvciBpdCA9IHJlZi5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKCFzcmMuY29udGFpbnMob2JqKSkKLQkJCQlzcmMuYWRkKG9iaik7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYmM1ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9DU1NDb250ZW50UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0vKioKLSAqIFByb3BlcnRpZXMgY29uc3RhbnRzIHVzZWQgYnkgQ1NTLiBDbGllbnRzIHNob3VsZCBvbmx5IHJlYWQgYW5kIG1vZGlmeSB0aGUKLSAqIENTUyBwcm9wZXJ0aWVzIHByb2dyYW1tYXRpY2FsbHkgdXNpbmcgdGhpcyBjbGFzcy4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29udGVudFByb3BlcnRpZXMgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTQ09SRV9JRCA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0tFWSA9ICI8cHJvamVjdD4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBjc3MgcHJvZmlsZSB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19QUk9GSUxFID0gImNzcy1wcm9maWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogR2VuZXJhdGVzIGEgcHJlZmVyZW5jZSBrZXkgYmFzZWQgb24gcmVzb3VyY2VQYXRoCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdGhlIGtleSB3aWxsIGJlIGJhc2VkIG9mZiBvZgotCSAqIEByZXR1cm4gcHJlZmVyZW5jZSBrZXkgYmFzZWQgb24gcmVzb3VyY2VQYXRoIChiYXNpY2FsbHkgdGhlCi0JICogICAgICAgICByZXNvdXJjZVBhdGggd2l0aG91dCB0aGUgZmlsZW5hbWUpOyBQUk9KRUNUX0tFWSBpZiByZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgIGlzIG51bGwKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldEtleUZvcihJUGF0aCByZXNvdXJjZVBhdGgpIHsKLQkJU3RyaW5nIGtleSA9IFBST0pFQ1RfS0VZOwotCQlpZiAocmVzb3VyY2VQYXRoICE9IG51bGwgJiYgcmVzb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJa2V5ID0gcmVzb3VyY2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4ga2V5OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJlZmVyZW5jZXMgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb2plY3Qgc2NvcGUgYW5kCi0JICogcHJlZmVyZW5jZSBrZXkgKHN1Yk5vZGUpIElmIGNyZWF0ZSBpcyB0cnVlLCB0aGUgcHJlZmVyZW5jZSBub2RlIHdpbGwgYmUKLQkgKiBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHRoZSBwcmVmZXJlbmNlIG5vZGUgaXMgdW5kZXIKLQkgKiBAcGFyYW0gcHJlZmVyZW5jZUtleQotCSAqICAgICAgICAgICAgdGhlIHN1Ym5vZGUvY2F0ZWdvcnkgdGhlIHByZWZlcmVuY2Ugbm9kZSBpcyBsb2NhdGVkIGluCi0JICogQHBhcmFtIGNyZWF0ZQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgYSBwcmVmZXJlbmNlIG5vZGUgd2lsbCBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdAotCSAqICAgICAgICAgICAgYWxyZWFkeSBleGlzdAotCSAqIEByZXR1cm4gUHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IHNjb3BlIGFuZAotCSAqICAgICAgICAgcHJlZmVyZW5jZSBrZXkuIG51bGwgaWYgb25lIGNvdWxkIG5vdCBiZSBmb3VuZCBhbmQgY3JlYXRlIGlzCi0JICogICAgICAgICBmYWxzZQotCSAqLwotCXN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcHJlZmVyZW5jZUtleSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJaWYgKGNyZWF0ZSkKLQkJCS8vIGNyZWF0ZSBhbGwgbm9kZXMgZG93biB0byB0aGUgb25lIHdlIGFyZSBpbnRlcmVzdGVkIGluCi0JCQlyZXR1cm4gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KS5nZXROb2RlKENTU0NPUkVfSUQpLm5vZGUocHJlZmVyZW5jZUtleSk7Ci0JCS8vIGJlIGNhcmVmdWwgbG9va2luZyB1cCBmb3Igb3VyIG5vZGUgc28gbm90IHRvIGNyZWF0ZSBhbnkgbm9kZXMgYXMKLQkJLy8gc2lkZSBlZmZlY3QKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFJvb3ROb2RlKCkubm9kZShQcm9qZWN0U2NvcGUuU0NPUEUpOwotCQl0cnkgewotCQkJLy8gVE9ETyBvbmNlIGJ1ZyA5MDUwMCBpcyBmaXhlZCwgc2hvdWxkIGJlIGFzIHNpbXBsZSBhcyB0aGlzOgotCQkJLy8gU3RyaW5nIHBhdGggPSBwcm9qZWN0LmdldE5hbWUoKSArIElQYXRoLlNFUEFSQVRPUiArCi0JCQkvLyBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTICsgSVBhdGguU0VQQVJBVE9SICsKLQkJCS8vIEVOQ09ESU5HX1BSRUZfTk9ERTsKLQkJCS8vIHJldHVybiBub2RlLm5vZGVFeGlzdHMocGF0aCkgPyBub2RlLm5vZGUocGF0aCkgOiBudWxsOwotCQkJLy8gZm9yIG5vdywgdGFrZSB0aGUgbG9uZyB3YXkKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKHByb2plY3QuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCW5vZGUgPSBub2RlLm5vZGUocHJvamVjdC5nZXROYW1lKCkpOwotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMoQ1NTQ09SRV9JRCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5ub2RlKENTU0NPUkVfSUQpOwotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMocHJlZmVyZW5jZUtleSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gbm9kZS5ub2RlKHByZWZlcmVuY2VLZXkpOwotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbm9kZUV4aXN0cyBmYWlsZWQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgcmV0cmlldmUgcHJlZmVyZW5jZSBub2RlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcHJvcGVydHkga2V5Ci0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBjb250ZXh0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNvbnRleHQgaXMKLQkgKiAgICAgICAgICAgIGF2YWlsYWJsZSBhbmQgdGhlIHdvcmtzcGFjZSBzZXR0aW5nIHNob3VsZCBiZSB0YWtlbi4gTm90ZQotCSAqICAgICAgICAgICAgdGhhdCBwYXNzaW5nIDxjb2RlPm51bGw8L2NvZGU+IHNob3VsZCBiZSBhdm9pZGVkLgotCSAqIEBwYXJhbSByZWN1cnNlCi0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSBwYXJlbnQgc2hvdWxkIGJlIHF1ZXJpZWQgdGlsbCBwcm9wZXJ0eSBpcyBmb3VuZAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIGtleS4KLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIHJlY3Vyc2UpIHsKLQkJU3RyaW5nIHZhbCA9IG51bGw7Ci0JCS8vIGJvb2xlYW4gcHJlZmVyZW5jZUZvdW5kID0gZmFsc2U7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMocHJvamVjdCwga2V5LCBmYWxzZSk7Ci0JCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQkJdmFsID0gaW50ZXJuYWxHZXRQcm9wZXJ0eShyZXNvdXJjZSwgcmVjdXJzZSwgcHJlZmVyZW5jZXMpOwotCQkJCQkvLyBwcmVmZXJlbmNlRm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyAvLyBubyBwcmVmZXJlbmNlcyBmb3VuZCAtIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLAotCQkvLyAvLyBzaG9ydC1jaXJjdWl0Ci0JCS8vIC8vIGxvb2t1cCBieSBmYWxsaW5nIGJhY2sgdG8gd29ya3NwYWNlJ3MgZGVmYXVsdAotCQkvLyAvLyBzZXR0aW5nCi0JCS8vIGlmICghcHJlZmVyZW5jZUZvdW5kKQotCQkvLyB2YWwgPSBnZXRXb3JrYmVuY2hQcmVmZXJlbmNlKGtleSk7Ci0JCXJldHVybiB2YWw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGludGVybmFsR2V0UHJvcGVydHkoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIHJlY3Vyc2UsIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSksIG51bGwpOwotCQlpZiAodmFsdWUgPT0gbnVsbCAmJiByZXNvdXJjZSAhPSByZXNvdXJjZS5nZXRQcm9qZWN0KCkgJiYgcmVjdXJzZSkgewotCQkJdmFsdWUgPSBwcmVmZXJlbmNlcy5nZXQoZ2V0S2V5Rm9yKG51bGwpLCBudWxsKTsKLQkJfQotCi0JCS8vIFdvcmtiZW5jaCBwcmVmZXJlbmNlIG1heSBub3QgYmUgbmVlZGVkIHNvIGxlYXZlIG91dCBmb3Igbm93Ci0JCS8vIC8vIGVuc3VyZSB3ZSBkZWZhdWx0IHRvIHRoZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZSBpZiBub25lIGlzIGZvdW5kCi0JCS8vIHJldHVybiB2YWx1ZSA9PSBudWxsID8gZ2V0V29ya2JlbmNoUHJlZmVyZW5jZShrZXkpIDogdmFsdWU7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcHJvcGVydHkga2V5Ci0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBjb250ZXh0LiBOb3RlIGNvbnRleHQgY2Fubm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSB2YWx1ZSB0byBzZXQgZm9yIHRoZSBrZXkuIElmIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICB0aGUga2V5IGlzIHJlbW92ZWQgZnJvbSBwcm9wZXJ0aWVzLgotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcyhwcm9qZWN0LCBrZXksIHRydWUpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJCQlwcmVmZXJlbmNlcy5yZW1vdmUoZ2V0S2V5Rm9yKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQllbHNlCi0JCQkJCXByZWZlcmVuY2VzLnB1dChnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSksIHZhbHVlKTsKLQkJCQl0cnkgewotCQkJCQkvLyBzYXZlIGNoYW5nZXMKLQkJCQkJcHJlZmVyZW5jZXMuZmx1c2goKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1NTQ09SRV9JRCwgSVN0YXR1cy5FUlJPUiwgIlVuYWJsZSB0byBzZXQgcHJvcGVydHkiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gV29ya2JlbmNoIHByZWZlcmVuY2UgbWF5IG5vdCBiZSBuZWVkZWQgc28gbGVhdmUgb3V0IGZvciBub3cKLQkJLy8ganVzdCBzZXQgYSBwcmVmZXJlbmNlIGluIHRoZSBpbnN0YW5jZSBzY29wZQotCQkvLyBpZiAoIXByZWZlcmVuY2VGb3VuZCkgewotCQkvLyBzZXRXb3JrYmVuY2hQcmVmZXJlbmNlKGtleSk7Ci0JCS8vIH0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVhNGI4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIgewotCXB1YmxpYyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJZkpvYiA9IG5ldyBDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIgX2luc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCUNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYiBmSm9iOwotCi0JLyoqCi0JICogVGhpcyBqb2IgaW1wbGVtZW50YXRpb24gaXMgdXNlZCB0byBhbGxvdyB0aGUgcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyCi0JICogdG8gc2NoZWR1bGUgb3BlcmF0aW9ucyB0aGF0IG5lZWQgdG8gbW9kaWZ5IHRoZSB3b3Jrc3BhY2UuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IgZXh0ZW5kcyBKb2IgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVElFU19VUERBVEVfREVMQVkgPSA1MDA7Ci0JCXByaXZhdGUgTGlzdCBhc3luY0NoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYigpIHsKLQkJCXN1cGVyKENTU0NvcmVNZXNzYWdlcy5DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQkJc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZENoYW5nZXMoU2V0IG5ld0NoYW5nZXMpIHsKLQkJCWlmIChuZXdDaGFuZ2VzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCWFzeW5jQ2hhbmdlcy5hZGRBbGwobmV3Q2hhbmdlcyk7Ci0JCQkJYXN5bmNDaGFuZ2VzLm5vdGlmeSgpOwotCQkJfQotCQkJc2NoZWR1bGUoUFJPUEVSVElFU19VUERBVEVfREVMQVkpOwotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldE5leHRDaGFuZ2UoKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiBhc3luY0NoYW5nZXMuaXNFbXB0eSgpID8gbnVsbCA6IChJUHJvamVjdCkgYXN5bmNDaGFuZ2VzLnJlbW92ZShhc3luY0NoYW5nZXMuc2l6ZSgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlNdWx0aVN0YXR1cyByZXN1bHQgPSBuZXcgTXVsdGlTdGF0dXMoQ1NTQ29udGVudFByb3BlcnRpZXMuQ1NTQ09SRV9JRCwgSVJlc291cmNlU3RhdHVzLkZBSUxFRF9TRVRUSU5HX0NIQVJTRVQsIENTU0NvcmVNZXNzYWdlcy5DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcsIG51bGwpOwotCQkJbW9uaXRvciA9IG1vbml0b3IgPT0gbnVsbCA/IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgOiBtb25pdG9yOwotCQkJdHJ5IHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhDU1NDb3JlTWVzc2FnZXMuQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nLCBhc3luY0NoYW5nZXMuc2l6ZSgpKTsKLQkJCQl0cnkgewotCQkJCQlJUHJvamVjdCBuZXh0OwotCQkJCQl3aGlsZSAoKG5leHQgPSBnZXROZXh0Q2hhbmdlKCkpICE9IG51bGwpIHsKLQkJCQkJCS8vIGp1c3QgZXhpdCBpZiB0aGUgc3lzdGVtIGlzIHNodXR0aW5nIGRvd24gb3IgaGFzCi0JCQkJCQkvLyBiZWVuIHNodXQgZG93bgotCQkJCQkJLy8gaXQgaXMgdG9vIGxhdGUgdG8gY2hhbmdlIHRoZSB3b3Jrc3BhY2UgYXQgdGhpcwotCQkJCQkJLy8gcG9pbnQgYW55d2F5Ci0JCQkJCQlpZiAoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5vc2dpIikuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIHNhdmUgdGhlIHByZWZlcmVuY2VzIG5vZGVzCi0JCQkJCQkJaWYgKG5leHQuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJLy8gc2F2ZSBjc3MgcHJvZmlsZSBwcmVmZXJlbmNlcwotCQkJCQkJCQlQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZnMgPSBDU1NDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyhuZXh0LCBDU1NDb250ZW50UHJvcGVydGllcy5DU1NfUFJPRklMRSwgZmFsc2UpOwotCQkJCQkJCQlpZiAocHJvamVjdFByZWZzICE9IG51bGwpCi0JCQkJCQkJCQlwcm9qZWN0UHJlZnMuZmx1c2goKTsKLQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIHdlIGdvdCBhbiBlcnJvciBzYXZpbmcKLQkJCQkJCQlTdHJpbmcgZGV0YWlsTWVzc2FnZSA9IE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmcsIG5leHQuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKDEgPDwgKElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VUICUgMTAwIC8gMzMpLCBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTLCBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1NFVFRJTkdfQ0hBUlNFVCwgZGV0YWlsTWVzc2FnZSwgZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCQljYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3Nob3VsZFJ1bigpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSdW4oKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiAhYXN5bmNDaGFuZ2VzLmlzRW1wdHkoKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgdm9pZCBwcm9jZXNzRW50cnlDaGFuZ2VzKElSZXNvdXJjZURlbHRhIHByb2plY3REZWx0YSwgU2V0IHByb2plY3RzVG9TYXZlKSB7Ci0JCQkvLyBjaGVjayBlYWNoIHJlc291cmNlIHdpdGggY3NzIGNvbnRlbnQgc2V0dGluZyB0byBzZWUgaWYgaXQgaGFzCi0JCQkvLyBiZWVuIG1vdmVkL2RlbGV0ZWQKLQkJCWJvb2xlYW4gcmVzb3VyY2VDaGFuZ2VzID0gZmFsc2U7Ci0KLQkJCS8vIHByb2plY3QgYWZmZWN0ZWQKLQkJCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gKElQcm9qZWN0KSBwcm9qZWN0RGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCQkJcmVzb3VyY2VDaGFuZ2VzID0gcHJvY2Vzc1ByZWZlcmVuY2VzKGN1cnJlbnRQcm9qZWN0LCBDU1NDb250ZW50UHJvcGVydGllcy5DU1NfUFJPRklMRSwgcHJvamVjdERlbHRhLCBwcm9qZWN0c1RvU2F2ZSk7Ci0KLQkJCS8vIGlmIHRoZXJlIHdhcyBhIHByZWZlcmVuY2Uga2V5IGNoYW5nZSwgbmVlZCB0byBzYXZlIHByZWZlcmVuY2VzCi0JCQlpZiAocmVzb3VyY2VDaGFuZ2VzKQotCQkJCXByb2plY3RzVG9TYXZlLmFkZChjdXJyZW50UHJvamVjdCk7Ci0JCX0KLQotCQkvKioKLQkJICogR29lcyB0aHJvdWdoIGFsbCB0aGUgcmVzb3VyY2UtZGVwZW5kZW50IHByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aAotCQkgKiBjdXJyZW50UHJvamVjdCAmIGtleSBhbmQgdXBkYXRlcyB0aGUgcHJlZmVyZW5jZSBrZXlzIGlmIG5lZWRlZAotCQkgKiBiYXNlZCBvbiBwcm9qZWN0RGVsdGEKLQkJICogCi0JCSAqIEBwYXJhbSBjdXJyZW50UHJvamVjdAotCQkgKiAgICAgICAgICAgIGN1cnJlbnQgcHJvamVjdCBvZiB0aGUgcHJlZmVyZW5jZXMgdG8gYmUgbG9va2VkIGF0Ci0JCSAqIEBwYXJhbSBrZXkKLQkJICogICAgICAgICAgICBjdXJyZW50IGtleS9zdWJjYXRlZ29yeSBvZiB0aGUgcHJlZmVyZW5jZXMgdG8gYmUgbG9va2VkCi0JCSAqICAgICAgICAgICAgYXQKLQkJICogQHBhcmFtIHByb2plY3REZWx0YQotCQkgKiAgICAgICAgICAgIHRoZSBjaGFuZ2VzIHRvIHByb2Nlc3MgdGhlIHByZWZlcmVuY2Uga2V5cyBhZ2FpbnN0Ci0JCSAqIEBwYXJhbSBwcm9qZWN0c1RvU2F2ZQotCQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0cyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZC9zYXZlZAotCQkgKiBAcmV0dXJuIHRydWUgaWYgY3VycmVudFByb2plY3QncyBwcmVmZXJlbmNlcyB3ZXJlIG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1ByZWZlcmVuY2VzKElQcm9qZWN0IGN1cnJlbnRQcm9qZWN0LCBTdHJpbmcga2V5LCBJUmVzb3VyY2VEZWx0YSBwcm9qZWN0RGVsdGEsIFNldCBwcm9qZWN0c1RvU2F2ZSkgewotCQkJYm9vbGVhbiByZXNvdXJjZUNoYW5nZXMgPSBmYWxzZTsKLQotCQkJLy8gZ2V0IHRoZSBwcm9qZWN0LWtleSBwcmVmZXJlbmNlIG5vZGUKLQkJCVByZWZlcmVuY2VzIHByb2plY3RQcmVmcyA9IENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKGN1cnJlbnRQcm9qZWN0LCBrZXksIGZhbHNlKTsKLQkJCWlmIChwcm9qZWN0UHJlZnMgPT0gbnVsbCkKLQkJCQkvLyBubyBwcmVmZXJlbmNlcyBmb3IgdGhpcyBwcm9qZWN0LWtleSwganVzdCBiYWlsCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nW10gYWZmZWN0ZWRSZXNvdXJjZXM7Ci0JCQl0cnkgewotCQkJCWFmZmVjdGVkUmVzb3VyY2VzID0gcHJvamVjdFByZWZzLmtleXMoKTsKLQkJCX0KLQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIHByb2JsZW1zIHdpdGggdGhlIHByb2plY3Qgc2NvcGUuLi4gd2UgZ29ubmEgbWlzcyB0aGUKLQkJCQkvLyBjaGFuZ2VzIChidXQgd2lsbCBsb2cpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIlByb2JsZW0gcmV0cmVpdmluZyBKU1AgRnJhZ21lbnQgcHJlZmVyZW5jZXMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gZ28gdGhyb3VnaCBlYWNoIHByZWZlcmVuY2Uga2V5ICh3aGljaCBpcyByZWFsbHkgYSBmaWxlIG5hbWUpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFmZmVjdGVkUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gc2VlIGlmIHByZWZlcmVuY2Uga2V5L2ZpbGUgbmFtZSB3YXMgZmlsZSB0aGF0IHdhcyBjaGFuZ2VkCi0JCQkJSVJlc291cmNlRGVsdGEgbWVtYmVyRGVsdGEgPSBwcm9qZWN0RGVsdGEuZmluZE1lbWJlcihuZXcgUGF0aChhZmZlY3RlZFJlc291cmNlc1tpXSkpOwotCQkJCS8vIG5vIGNoYW5nZXMgZm9yIHRoZSBnaXZlbiByZXNvdXJjZQotCQkJCWlmIChtZW1iZXJEZWx0YSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAobWVtYmVyRGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJcmVzb3VyY2VDaGFuZ2VzID0gdHJ1ZTsKLQkJCQkJLy8gcmVtb3ZlIHRoZSBzZXR0aW5nIGZvciB0aGUgb3JpZ2luYWwgbG9jYXRpb24KLQkJCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IHByb2plY3RQcmVmcy5nZXQoYWZmZWN0ZWRSZXNvdXJjZXNbaV0sIG51bGwpOwotCQkJCQlwcm9qZWN0UHJlZnMucmVtb3ZlKGFmZmVjdGVkUmVzb3VyY2VzW2ldKTsKLQkJCQkJaWYgKChtZW1iZXJEZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pICE9IDApIHsKLQkJCQkJCS8vIGlmIG1vdmluZywgY29weSB0aGUgc2V0dGluZyBmb3IgdGhlIG5ldyBsb2NhdGlvbgotCQkJCQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChtZW1iZXJEZWx0YS5nZXRNb3ZlZFRvUGF0aCgpLnNlZ21lbnQoMCkpOwotCQkJCQkJUHJlZmVyZW5jZXMgdGFyZ2V0UHJlZnMgPSBDU1NDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyh0YXJnZXRQcm9qZWN0LCBrZXksIHRydWUpOwotCQkJCQkJdGFyZ2V0UHJlZnMucHV0KENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldEtleUZvcihtZW1iZXJEZWx0YS5nZXRNb3ZlZFRvUGF0aCgpKSwgY3VycmVudFZhbHVlKTsKLQkJCQkJCWlmICh0YXJnZXRQcm9qZWN0ICE9IGN1cnJlbnRQcm9qZWN0KQotCQkJCQkJCXByb2plY3RzVG9TYXZlLmFkZCh0YXJnZXRQcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXNvdXJjZUNoYW5nZXM7Ci0JCX0KLQotCQkvKioKLQkJICogRm9yIGFueSBjaGFuZ2UgdG8gdGhlIGVuY29kaW5nIGZpbGUgb3IgYW55IHJlc291cmNlIHdpdGggZW5jb2RpbmcKLQkJICogc2V0LCBqdXN0IGRpc2NhcmQgdGhlIGNhY2hlIGZvciB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0LgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJUmVzb3VyY2VEZWx0YVtdIHByb2plY3REZWx0YXMgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkvLyBwcm9jZXNzIGVhY2ggcHJvamVjdCBpbiB0aGUgZGVsdGEKLQkJCVNldCBwcm9qZWN0c1RvU2F2ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3REZWx0YXMubGVuZ3RoOyBpKyspCi0JCQkJLy8gbm90aGluZyB0byBkbyBpZiBhIHByb2plY3QgaGFzIGJlZW4gYWRkZWQvcmVtb3ZlZC9tb3ZlZAotCQkJCWlmIChwcm9qZWN0RGVsdGFzW2ldLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIChwcm9qZWN0RGVsdGFzW2ldLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSA9PSAwKQotCQkJCQlwcm9jZXNzRW50cnlDaGFuZ2VzKHByb2plY3REZWx0YXNbaV0sIHByb2plY3RzVG9TYXZlKTsKLQkJCWZKb2IuYWRkQ2hhbmdlcyhwcm9qZWN0c1RvU2F2ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCV9pbnN0YW5jZSA9IG5ldyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoX2luc3RhbmNlLmZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoX2luc3RhbmNlLmZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJX2luc3RhbmNlID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmI4NzZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLQotLyoqCi0gKiBUaGlzIGlzIGFuICJhZGFwdGVyIiBjbGFzcywgc2ltcGx5IHRvIGdldCBpbiBpbnB1dCBzdHJlYW0gdG8gYWN0IGxpa2UgYQotICogcmVhZGVyLiBXZSBjb3VsZCBub3QgdXNlIElucHV0U3RyZWFtUmVhZGVyIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGludGVybmFsCi0gKiBidWZmZXJzIGFyZSBub3QgY29udHJvbGxhYmxlLCBhbmQgaXQgc29tZXRpbWVzIHB1bGxzIHRvbyBtdWNoIG91dCBvZiBpbnB1dAotICogc3RyZWFtIChldmVuIHdoZW4gaXQgd2Fzbid0IG5lZWRlZCBmb3Igb3VyIHB1cnBvc2VzKS4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIGhpZ2hseSBzcGVjaWFsaXplZCBhbmQgYnkgbm8gbWVhbnMgbWVhbnQgdG8gYmUKLSAqIGdlbmVyYWwgcHVycG9zZS4gSXRzIHVzZSBpcyByZXN0cmljdGVkIHRvIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBpbnB1dAotICogc3RyZWFtIGNhbiBiZSByZWdhcmRlZCBhcyBhc2NpaSBqdXN0IGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB3aGF0IHRoZSByZWFsCi0gKiBlbmNvZGluZyBzaG91bGQgYmUuCi0gKi8KLQotcHVibGljIGNsYXNzIEJ5dGVSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IENvZGVkSU8uTUFYX0JVRl9TSVpFOwotCi0JcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOwotCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKLQotCXByb3RlY3RlZCBCeXRlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRoaXMoaW5wdXRTdHJlYW0sIERFRkFVTFRfQlVGRkVSX1NJWkUpOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBzaXplKSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5mQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ubWFyayhyZWFkQWhlYWRMaW1pdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGIwID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCgpOwotCQlyZXR1cm4gKGIwICYgMHgwMEZGKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjaFtdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobGVuZ3RoID4gdGhpcy5mQnVmZmVyLmxlbmd0aCkgewotCQkJbGVuZ3RoID0gdGhpcy5mQnVmZmVyLmxlbmd0aDsKLQkJfQotCi0JCWludCBjb3VudCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQodGhpcy5mQnVmZmVyLCAwLCBsZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGIwID0gdGhpcy5mQnVmZmVyW2ldOwotCQkJLy8gdGhlIDB4MDBGRiBpcyB0byAibG9zZSIgdGhlIG5lZ2F0aXZlIGJpdHMgZmlsbGVkIGluIHRoZSBieXRlIHRvCi0JCQkvLyBpbnQgY29udmVyc2lvbgotCQkJLy8gKGFuZCB3aGljaCB3b3VsZCBiZSB0aGVyZSBpZiBjYXN0IGRpcmVjdGx5IGZyb20gYnl0ZSB0byBjaGFyKS4KLQkJCWNoYXIgYzAgPSAoY2hhcikgKGIwICYgMHgwMEZGKTsKLQkJCWNoW29mZnNldCArIGldID0gYzA7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLnJlc2V0KCk7Ci0JfQotCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5za2lwKG4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU0hlYWRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhZmY3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU0hlYWRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NDAgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gNy8yOC8wOCA1OjE5IFBNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDcvMjgvMDggNToxOSBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi93b3Jrc3BhY2VzL3d0cDMwMS93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplci5qRmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDU1NIZWFkVG9rZW5pemVyIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRFFfU1RSSU5HID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IENIQVJTRVRfUlVMRSA9IDQ7Ci0KLSAgLyoqCi0gICAqIFlZX0xFWFNUQVRFW2xdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqIFlZX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKiBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFlZX0xFWFNUQVRFW10gPSB7IAotICAgICAwLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCA3Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxXDExXDEwXDBcMVw2XDFcMTBcMlwwXDFcN1wyMlwwXDFcNlwxXDBcMVwzNyIrCi0gICAgIlwyXDBcMVw0MlwxXDBcMVw0MFw3XDBcMVw0MVwxM1wwXDFcMzZcMVwxM1wxXDEyIisKLSAgICAiXDFcMzVcMVwxNFwxXDIwXDFcMjNcMVwwXDFcMjFcMVwzMlwxXDI2XDFcMFwxXDM0IisKLSAgICAiXDFcMjJcMVwzM1wyXDBcMVwxN1wxXDE2XDFcMzBcMVwzMVwyXDBcMVwyNFwxXDI1IisKLSAgICAiXDFcMjdcM1wwXDFcMTVcMTBcMFwxXDIzXDFcMFwxXDIxXDFcMzJcMVwyNlwxXDAiKwotICAgICJcMVwzNFwxXDIyXDFcMzNcMlwwXDFcMTdcMVwxNlwxXDMwXDFcMzFcMlwwXDFcMjQiKwotICAgICJcMVwyNVwxXDI3XDNcMFwxXDE1XDEwMlwwXDFcNFwzXDBcMVw1XDE3XDBcMVwzIisKLSAgICAiXDE2XDBcMVwxXDIwXDBcMVwzXDE2XDBcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgLy9wcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotLy8gIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQotCXB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotCSAgCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkgIAl5eV9yZWFkZXIgPSBpbjsKLQotICAJCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgCQl5eV9zdGF0ZSA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAJCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIAkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAJCXl5X21hcmtlZFBvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAJCS8veXlfcHVzaGJhY2tQb3MgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfY3VycmVudFBvcyA9IDA7Ci0KLSAgCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9zdGFydFJlYWQgPSAwOwotCi0gIAkJLyoqIAotICAJCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAJCSAqIGZyb20gaW5wdXQgCi0gIAkJICovCi0gIAkJeXlfZW5kUmVhZCA9IDA7Ci0KLSAgCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vICAJCXl5bGluZSA9IDA7Ci0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWNoYXIgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gIAkJICovCi0vLyAgCQl5eWNvbHVtbiA9IDA7IAotCi0gIAkJLyoqIAotICAJCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIAotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0gIAkJCi0gIAkJaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQKLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0JCX0KLSAgCQkKLQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTYwKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgLy95eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0KLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgCWhhc01vcmU9ZmFsc2U7Ci0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIHl5X2F0Qk9MID0geXlfbWFya2VkUG9zIDw9IDAgfHwgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXG4nOwotICAgICAgaWYgKCF5eV9hdEJPTCAmJiB5eV9idWZmZXJbeXlfbWFya2VkUG9zLTFdID09ICdccicpIHsKLSAgICAgICAgeXlfYXRCT0wgPSB5eV9hZHZhbmNlKCkgIT0gJ1xuJzsKLSAgICAgICAgaWYgKCF5eV9hdEVPRikgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgaWYgKHl5X2F0Qk9MKQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGUrMV07Ci0gICAgICBlbHNlCi0gICAgICAgIHl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZV07Ci0KLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5Y21hcFt5eV9pbnB1dF07Ci0KLSAgICAgICAgICBib29sZWFuIHl5X2lzRmluYWwgPSBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIHl5X25vTG9va0FoZWFkID0gZmFsc2U7Ci0KLSAgICAgICAgICB5eV9mb3JOZXh0OiB7IHN3aXRjaCAoeXlfc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IAotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiB5eV9zdGF0ZSA9IDQyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQ3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQ4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA1MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfc3RhdGUgPSA1MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA1NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9zdGF0ZSA9IDU3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA1ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDU5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDYyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDYzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDY0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IAotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X3N0YXRlID0gNjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMzogeXlfc3RhdGUgPSA2NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9zdGF0ZSA9IDY5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDcwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDcxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMzogeXlfc3RhdGUgPSA2NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDY5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDcyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDczOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDc0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQ3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQ4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA1MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSA3NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA3ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA1NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9zdGF0ZSA9IDU3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9zdGF0ZSA9IDU3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDgwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gODE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gODI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDgzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA2NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDcwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDc2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDg0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDc4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDg2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gODc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDgxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDg4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X3N0YXRlID0gODk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB5eV9zdGF0ZSA9IDg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDkwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gOTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDg3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDkyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gOTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9zdGF0ZSA9IDg5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDk0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHl5X3N0YXRlID0gOTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDk3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA5MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDk5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogeXlfc3RhdGUgPSA5NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSAxMDE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDk5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEwNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9zdGF0ZSA9IDEwNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9zdGF0ZSA9IDEwMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTA2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gMTA3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfc3RhdGUgPSAxMDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEwODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSAxMDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDExMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9zdGF0ZSA9IDExMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDExMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9zdGF0ZSA9IDExMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDExMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTEzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDExMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDExNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDExNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDExMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfSUxMRUdBTF9TVEFURSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gfQotCi0gICAgICAgICAgaWYgKCB5eV9pc0ZpbmFsICkgewotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoIHl5X25vTG9va0FoZWFkICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgNjQ6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgMTE5OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgIGNhc2UgODM6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0gICAgICAgIGNhc2UgMTIwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuUnVsZUVuZDsgfQotICAgICAgICBjYXNlIDEyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICBjYXNlIDczOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDEyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA5OiAKLSAgICAgICAgY2FzZSAxMTI6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkgIHt5eWJlZ2luKENIQVJTRVRfUlVMRSk7IHJldHVybiBDU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLkNIQVJTRVRfUlVMRTt9IH0KLSAgICAgICAgY2FzZSAxMjM6IGJyZWFrOwotICAgICAgICBjYXNlIDk2OiAKLSAgICAgICAgY2FzZSAxMDI6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9IH0KLSAgICAgICAgY2FzZSAxMjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDg6IAotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgY2FzZSAzNzogCi0gICAgICAgICAgeyBpZih5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9IH0KLSAgICAgICAgY2FzZSAxMjU6IGJyZWFrOwotICAgICAgICBjYXNlIDU1OiAKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7ICByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOyB9Ci0gICAgICAgIGNhc2UgMTI2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTQ6IAotICAgICAgICBjYXNlIDExNjogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzsgfQotICAgICAgICBjYXNlIDEyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogCi0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IH0KLSAgICAgICAgY2FzZSAxMjg6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7IH0KLSAgICAgICAgY2FzZSAxMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7IH0KLSAgICAgICAgY2FzZSAxMzA6IGJyZWFrOwotICAgICAgICBjYXNlIDc0OiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTsgfQotICAgICAgICBjYXNlIDEzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgICAgeyAgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgIH0KLSAgICAgICAgY2FzZSAxMzI6IGJyZWFrOwotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgICAgeyAgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDEzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDYyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7ICB9Ci0gICAgICAgIGNhc2UgMTM0OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgIGNhc2UgNjc6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSAxMzU6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgY2FzZSA2ODogCi0gICAgICAgICAgeyAgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSAxMzY6IGJyZWFrOwotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgY2FzZSA3MTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTM3OiBicmVhazsKLSAgICAgICAgY2FzZSAzODogCi0gICAgICAgIGNhc2UgNzI6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSAxMzg6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHl5X2RvX2VvZigpOwotICAgICAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjsgfQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLSAgLyoqCi0gICAqIFJ1bnMgdGhlIHNjYW5uZXIgb24gaW5wdXQgZmlsZXMuCi0gICAqCi0gICAqIFRoaXMgbWFpbiBtZXRob2QgaXMgdGhlIGRlYnVnZ2luZyByb3V0aW5lIGZvciB0aGUgc2Nhbm5lci4KLSAgICogSXQgcHJpbnRzIGVhY2ggcmV0dXJuZWQgdG9rZW4gdG8gU3lzdGVtLm91dCB1bnRpbCB0aGUgZW5kIG9mCi0gICAqIGZpbGUgaXMgcmVhY2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJlZC4KLSAgICoKLSAgICogQHBhcmFtIGFyZ3YgICB0aGUgY29tbWFuZCBsaW5lLCBjb250YWlucyB0aGUgZmlsZW5hbWVzIHRvIHJ1bgotICAgKiAgICAgICAgICAgICAgIHRoZSBzY2FubmVyIG9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotICAgICAgQ1NTSGVhZFRva2VuaXplciBzY2FubmVyID0gbnVsbDsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHNjYW5uZXIgPSBuZXcgQ1NTSGVhZFRva2VuaXplciggbmV3IGphdmEuaW8uRmlsZVJlYWRlcihhcmd2W2ldKSApOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZCA6IFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUgXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIENTU0hlYWRUb2tlbml6ZXIgPGlucHV0ZmlsZT4iKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2Nhbm5lci5wcmltR2V0TmV4dFRva2VuKCkpOwotICAgICAgICB9IHdoaWxlICghc2Nhbm5lci55eV9hdEVPRik7Ci0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbiBJL08gZXJyb3Igb2NjdXJlZCB3aGlsZSBzY2FubmluZyA6Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5MWEwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBDU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzIHsKLQotCVN0cmluZyBSdWxlRW5kID0gIlJ1bGVFbmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENIQVJTRVRfUlVMRSA9ICJDSEFSU0VUX1JVTEUiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY1ZmJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQljbGFzcyBOdWxsTWVtZW50byBleHRlbmRzIEVuY29kaW5nTWVtZW50byB7Ci0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBOdWxsTWVtZW50bygpIHsKLQkJCXN1cGVyKCk7Ci0JCQlTdHJpbmcgZGVmYXVsdENoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMobnVsbCk7Ci0JCQlzZXRKYXZhQ2hhcnNldE5hbWUoZGVmYXVsdENoYXJzZXQpOwotCQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJCXNldERldGVjdGVkQ2hhcnNldE5hbWUobnVsbCk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgQ1NTSGVhZFRva2VuaXplciBmVG9rZW5pemVyOwotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0JcHJpdmF0ZSBib29sZWFuIGZIZWFkZXJQYXJzZWQ7Ci0JcHJpdmF0ZSBSZWFkZXIgZlJlYWRlcjsKLQotCS8qKgotCSAqIFRoZXJlIGlzIG5vIHNwZWMgZGVmaW5lZCBlbmNvZGluZyBmb3IgQ1NTLCBzbyBOdWxsIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJLy8gc2hvdWxkIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4ueG1sIChvciBsb29rIGl0IHVwIGZyb20gdGhlcmUpLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSBmYWxzZTsKLQkJaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00pIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFIHx8IHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtMTYiOyAvLyROT04tTkxTLTEkCi0JCQlieXRlW10gYm9tID0gKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFKSA/IElDb250ZW50RGVzY3JpcHRpb24uQk9NX1VURl8xNkJFIDogSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzE2TEU7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldFVuaWNvZGVTdHJlYW0odHJ1ZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldFVuaWNvZGVCT00oYm9tKTsKLQkJfQotCQlyZXR1cm4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG9rZW5pemVyLgotCSAqLwotCXByaXZhdGUgQ1NTSGVhZFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCWlmIChmVG9rZW5pemVyID09IG51bGwpIHsKLQkJCWZUb2tlbml6ZXIgPSBuZXcgQ1NTSGVhZFRva2VuaXplcigpOwotCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xlZ2FsU3RyaW5nKFN0cmluZyB2YWx1ZVRva2VuVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAodmFsdWVUb2tlblR5cGUgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2hlY2tJbkNvbnRlbnRzKCk7Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWNoZWNrSGV1cmlzdGljcygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrSW5Db250ZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUNTU0hlYWRUb2tlbml6ZXIgdG9rZW5pemVyID0gZ2V0VG9rZW5pemVyKCk7Ci0JCXRva2VuaXplci5yZXNldChmUmVhZGVyKTsKLQkJSGVhZFBhcnNlclRva2VuIHRva2VuID0gbnVsbDsKLQkJU3RyaW5nIHRva2VuVHlwZSA9IG51bGw7Ci0JCWRvIHsKLQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJLy8gc2lkZSBlZmZlY3Qgb2YgY2FuSGFuZGxlIGlzIHRvIGNyZWF0ZSBhcHByb3ByaWF0ZSBtZW1lbnRvCi0JCQl9Ci0JCQllbHNlIGlmICh0b2tlblR5cGUgPT0gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5DSEFSU0VUX1JVTEUpIHsKLQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlIZWFkUGFyc2VyVG9rZW4gdmFsdWVUb2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCWlmIChpc0xlZ2FsU3RyaW5nKHZhbHVlVG9rZW5UeXBlKSkgewotCQkJCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKHZhbHVlVG9rZW4uZ2V0VGV4dCgpLCBFbmNvZGluZ01lbWVudG8uRk9VTkRfRU5DT0RJTkdfSU5fQ09OVEVOVCk7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tIZXVyaXN0aWNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBub0hldXJpc3RpYyA9IGZhbHNlOwotCQlTdHJpbmcgaGV1cmlzdGljRW5jb2RpbmcgPSBudWxsOwotCQl0cnkgewotCQkJZlJlYWRlci5yZXNldCgpOwotCQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbM107Ci0JCQlpbnQgblJlYWQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmUmVhZGVyLnJlYWR5KCkpIHsKLQkJCQkJaW50IG9uZUJ5dGUgPSBmUmVhZGVyLnJlYWQoKTsKLQkJCQkJblJlYWQrKzsKLQkJCQkJaWYgKG9uZUJ5dGUgPD0gMHhGRikgewotCQkJCQkJYnl0ZXNbaV0gPSAoYnl0ZSkgb25lQnl0ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW5vSGV1cmlzdGljID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbm9IZXVyaXN0aWMgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW5vSGV1cmlzdGljICYmIG5SZWFkID09IDMpIHsKLQkJCQloZXVyaXN0aWNFbmNvZGluZyA9IEVuY29kaW5nR3Vlc3Nlci5ndWVzc0VuY29kaW5nKGJ5dGVzLCAzKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWYgYW55IElPIGV4Y2VwdGlvbiwgdGhlbiBub3QgYSBoZXVyaXN0aWMgY2FzZQotCQl9Ci0JCWZpbmFsbHkgewotCQkJZlJlYWRlci5yZXNldCgpOwotCQl9Ci0JCWlmIChoZXVyaXN0aWNFbmNvZGluZyAhPSBudWxsKSB7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oaGV1cmlzdGljRW5jb2RpbmcsIEVuY29kaW5nTWVtZW50by5HVUVTU0VEX0VOQ09ESU5HX0ZST01fU1RSRUFNKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcGFyYW0gcmVhc29uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBlbnN1cmVJbnB1dFNldCgpIHsKLQkJaWYgKGZSZWFkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5wdXQgbXVzdCBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIGlmIGludmFsaWQgY2hhcnNldCBuYW1lIChpbiB3aGljaCBjYXNlCi0JICogImFwcHJvcHJpYXRlRGVmYXVsdCIgc2hvdWxkIGJlIHVzZWQsIGlmIGEgbmFtZSBpcyByZWFsbHkgbmVlZCBmb3Igc29tZQotCSAqICJzYXZlIGFueXdheSIgY2FzZXMpLgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIDEuIENoZWNrIGV4cGxpY2l0IG1hcHBpbmcgb3ZlcnJpZGVzIGZyb20KLQkJLy8gcHJvcGVydHkgZmlsZSAtLSBpdHMgaGVyZSB3ZSBwaWNrIHVwICJydWxlcyIgZm9yIGNhc2VzCi0JCS8vIHRoYXQgYXJlIG5vdCBldmVuIGluIEphdmEKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIDIuIFVzZSB0aGUgImNhbm9uaWNhbCIgbmFtZSBmcm9tIEpSRSBtYXBwaW5ncwotCQkvLyBOb3RlOiBzZWUgQ2hhcnNldCBKYXZhRG9jLCB0aGUgbmFtZSB5b3UgZ2V0IG9uZQotCQkvLyB3aXRoIGNhbiBiZSBhbGlhcywKLQkJLy8gdGhlIG5hbWUgeW91IGdldCBiYWNrIGlzICJzdGFuZGFyZCIgbmFtZS4KLQkJQ2hhcnNldCBqYXZhQ2hhcnNldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhQ2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZ2l2ZSBwcmlvcml0eSB0byBqYXZhIGNvbm9uaWNhbCBuYW1lLCBpZiBwcmVzZW50Ci0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBqYXZhQ2hhcnNldC5uYW1lKCk7Ci0JCQkvLyBidXQgc3RpbGwgYWxsb3cgb3ZlcnJpZGVzCi0JCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhyZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRFbmNvZGluZ01lbWVudG8oKS5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuCi0JCQkvLyBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcKLQkJCS8vIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUKLQkJCS8vIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMKLQkJCS8vIG5vdCBwcmVzZW50LgotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWhhbmRsZVNwZWNEZWZhdWx0KCk7Ci0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJLy8gc2FmdHkgbmV0Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IE51bGxNZW1lbnRvKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRTcGVjRGVmYXVsdEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmVzZXRBbGwoKTsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBlbmMgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmMgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuYyk7Ci0JCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy8gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuY29kaW5nTmFtZSwKLQkJCS8vIEVuY29kaW5nTWVtZW50by5VU0VEX0NPTlRFTlRfVFlQRV9ERUZBVUxUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShlbmNvZGluZ05hbWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jb2RpbmdOYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldEFsbCgpIHsKLQkJZlJlYWRlciA9IG51bGw7Ci0JCWZIZWFkZXJQYXJzZWQgPSBmYWxzZTsKLQkJZkVuY29kaW5nTWVtZW50byA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSBuZXcgQnl0ZVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyCi0JCQkvLyBzdXBwb3J0cyBtYXJraW5nCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSVN0b3JhZ2UgaVN0b3JhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVzZXRBbGwoKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBpU3RvcmFnZS5nZXRDb250ZW50cygpOwotCQlJbnB1dFN0cmVhbSByZXNldHRhYmxlU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIENvZGVkSU8uTUFYX0JVRl9TSVpFKTsKLQkJcmVzZXR0YWJsZVN0cmVhbS5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCXNldChyZXNldHRhYmxlU3RyZWFtKTsKLQkJLy8gVE9ETyB3ZSdsbCBuZWVkIHRvICJyZW1lbWJlciIgSUZpbGUsIG9yCi0JCS8vIGdldCBpdHMgKG9yIGl0cyBwcm9qZWN0J3MpIHNldHRpbmdzLCBpbiBjYXNlCi0JCS8vIHRob3NlIGFyZSBuZWVkZWQgdG8gaGFuZGxlIGNhc2VzIHdoZW4gdGhlCi0JCS8vIGVuY29kaW5nIGlzIG5vdCBpbiB0aGUgZmlsZSBzdHJlYW0uCi0JfQotCi0JLyoqCi0JICogTm90ZTogdGhpcyBpcyBub3QgcGFydCBvZiBpbnRlcmZhY2UgdG8gaGVscCBhdm9pZCBjb25mdXNpb24gLi4uIGl0Ci0JICogZXhwZWN0ZWQgdGhpcyBSZWFkZXIgaXMgYSB3ZWxsIGZvcm1lZCBjaGFyYWN0ZXIgcmVhZGVyIC4uLiB0aGF0IGlzLCBpdHMKLQkgKiBhbGwgcmVhZHkgYmVlbiBkZXRlcm1pbmVkIHRvIG5vdCBiZSBhIHVuaWNvZGUgbWFya2VkIGlucHV0IHN0cmVhbS4gQW5kLAotCSAqIGl0cyBhc3N1bWVkIHRvIGJlIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uLCBhdCBwb3NpdGlvbiB6ZXJvLCByZWFkeSB0bwotCSAqIHJlYWQgZmlyc3QgY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSByZWFkZXI7Ci0JCWlmICghZlJlYWRlci5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCWZSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZlJlYWRlcik7Ci0JCX0KLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NibGUsIHNpbmNlIHdlIGp1c3QgY2hlY2tlZCBpZiBtYXJrYWJsZQotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ4NjNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudERlc2NyaWJlckZvckNTUyBpbXBsZW1lbnRzIElUZXh0Q29udGVudERlc2NyaWJlciB7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgUXVhbGlmaWVkTmFtZVtdIFNVUFBPUlRFRF9PUFRJT05TID0ge0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFR9OwotCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQkvLyBjdXJyZW50bHkgbm8gc3BlY2lmaWMgY2hlY2sgZm9yIHZhbGlkaWx0eQotCQkvLyBiYXNlZCBvbiBjb250ZW50cy4KLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVZhbGlkaXR5KFJlYWRlciByZWFkZXIpIHsKLQkJLy8gY3VycmVudGx5IG5vIHNwZWNpZmljIGNoZWNrIGZvciB2YWxpZGlsdHkKLQkJLy8gYmFzZWQgb24gY29udGVudHMuCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCXByaXZhdGUgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGdldERldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IENTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbm90ZTogaWYgd2UncmUgYXNrZWQgZm9yIG9uZSwgd2Ugc2V0IHRoZW0gYWxsLiBJIG5lZWQgdG8gYmUgc3VyZSBpZgotCQkvLyBjYWxsZWQKLQkJLy8gbXVsaXRpcGxlIHRpbWVzIChvbmUgZm9yIGVhY2gsIHNheSkgdGhhdCB3ZSBkb24ndCB3YXN0ZSB0aW1lCi0JCS8vIHByb2Nlc3Npbmcgc2FtZQotCQkvLyBjb250ZW50IGFnYWluLgotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gKChDU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpIGRldGVjdG9yKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJLy8gVE9ETzogSSBuZWVkIHRvIHZlcmlmeSB0byBzZWUgaWYgdGhpcyBCT00gd29yayBpcyBhbHdheXMgZG9uZQotCQkvLyBieSB0ZXh0IHR5cGUuCi0JCU9iamVjdCBkZXRlY3RlZEJ5dGVPcmRlck1hcmsgPSBlbmNvZGluZ01lbWVudG8uZ2V0VW5pY29kZUJPTSgpOwotCQlpZiAoZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0J5dGVPcmRlck1hcmsgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSyk7Ci0JCQkvLyBub3Qgc3VyZSB3aHkgd291bGQgZXZlciBiZSBkaWZmZXJlbnQsIHNvIGlmIGlzIGRpZmZlcmVudCwgbWF5Ci0JCQkvLyBuZWVkIHRvICJwdXNoIiB1cCBpbnRvIGJhc2UuCi0JCQlpZiAoIWRldGVjdGVkQnl0ZU9yZGVyTWFyay5lcXVhbHMoZXhpc3RpbmdCeXRlT3JkZXJNYXJrKSkKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrKTsKLQkJfQotCi0KLQkJaWYgKCFlbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkvLyBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJLy8gSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQKLQkJCS8vIGluIHRoZSByZXNvdXJjZSdzIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCi0JCQkvLyBpbnZhbGlkCi0JCQkvLyBpbiB0aG9zZSBjYXNlcywgdGhlICJkZXRlY3RlZCIgcHJvcGVydHkgY29udGFpbnMgYW4KLQkJCS8vICJhcHByb3ByaWF0ZSBkZWZhdWx0IiB0byB1c2UuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgZW5jb2RpbmdNZW1lbnRvLmdldEludmFsaWRFbmNvZGluZygpKTsKLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQl9Ci0KLQkJT2JqZWN0IGRldGVjdGVkQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0KLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJaWYgKGphdmFDaGFyc2V0LmVxdWFscyhleGlzdGluZ0NoYXJzZXQpKSB7Ci0JCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBtYXkgbmVlZCB0byBhZGQgd2hhdCB3ZSBmb3VuZCwgYnV0IG9ubHkgbmVlZCB0byBhZGQKLQkJCQkvLyBpZiBkaWZmZXJlbnQgZnJvbSBkZWZhdWx0LnRoZQotCQkJCU9iamVjdCBkZWZhdWx0Q2hhcnNldCA9IGdldERldGVjdG9yKCkuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQkJCWlmIChkZWZhdWx0Q2hhcnNldCAhPSBudWxsKSB7Ci0JCQkJCWlmICghZGVmYXVsdENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFzc3VtaW5nIGlmIHRoZXJlIGlzIG5vIHNwZWMgZGVmYXVsdCwgd2UgYWx3YXlzIG5lZWQgdG8KLQkJCQkJLy8gYWRkLCBJJ20gYXNzdW1pbmcKLQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJLy8gc2luY2UgZXF1YWwsIHdlIGRvbid0IG5lZWQgdG8gYWRkLCBidXQgaWYgb3VyIGRldGVjdGVkIHZlcnNpb24gaXMKLQkJLy8gZGlmZmVyZW50IHRoYW4gamF2YUNoYXJzZXQsIHRoZW4gd2Ugc2hvdWxkIGFkZCBpdC4gVGhpcyB3aWxsCi0JCS8vIGhhcHBlbiwgZm9yIGV4YW1wbGUsIGlmIHRoZXJlJ3MgZGlmZmVyZW5jZXMgaW4gY2FzZSwgb3IgZGlmZmVyZW5jZXMKLQkJLy8gZHVlIHRvIG92ZXJyaWRlIHByb3BlcnRpZXMKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0KLQkJCS8vIE9uY2Ugd2UgZGV0ZWN0ZWQgYSBjaGFyc2V0LCB3ZSBzaG91bGQgc2V0IHRoZSBwcm9wZXJ0eSBldmVuCi0JCQkvLyB0aG91Z2ggaXQncyB0aGUgc2FtZSBhcyBqYXZhQ2hhcnNldAotCQkJLy8gYmVjYXVzZSB0aGVyZSBhcmUgY2xpZW50cyB0aGF0IHJlbHkgb24gdGhpcyBwcm9wZXJ0eSB0bwotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFyc2V0IGlzIGFjdHVhbGx5IGRldGVjdGVkIGluIGZpbGUgb3Igbm90LgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIGRldGVjdGVkQ2hhcnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJLy8gZWxzZSBpZgotCQkvLyAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkVOQ09ESU5HX01FTUVOVE8pKQotCQkvLyByZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdHdWVzc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nR3Vlc3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzA4MDBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdHdWVzc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiAKLSAqIFRoaXMgaXMgcG9ydGVkIGZyb20gUGFnZURlc2lnbmVyJ3MgaHBiY29tL0thbmppLmNwcCdzCi0gKiBLYW5qaTo6Z3Vlc3Nfa2FuamlfY29kZSgpLAotICogIAotICovCi1wdWJsaWMgY2xhc3MgRW5jb2RpbmdHdWVzc2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNDSUkgPSAwOyAvLyBBU0NJSQotCS8vIElTTy0yMDIyLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTQ0lJX0lOID0gODsgLy8gVGhpcyBpcyBhZnRlciBJU08yMDIyJ3MgY2hhbmdlCi0JLy8gU2hpZnQtSklTCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVVQ19IQUxGS0FOQSA9IDY7IC8vIFRoaXMgaXMgSGFsZiBLYW5hIGluIEVVQy1KUAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVUNfSlAgPSAzOyAvLyBUaGlzIGlzIEVVQy1KUAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJU08yMDIyX0pQID0gNDsgLy8gVGhpcyBpcyBJU08tMjAyMi1KUAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKSVNfSEFMRktBTkEgPSA3OyAvLyBUSGlzIGlzIEhhbGYgS2FuYSBpbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfRVVDMSA9IDB4NDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9FVUMyID0gKGJ5dGUpIDB4ODA7Ci0JLy8gQVNDSUkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0pJTiA9IDB4MDE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9KT1VUID0gMHgwMjsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0VTQyA9IDB4MDQ7Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9KSVMgPSAweDA4OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfU0ZUMSA9IDB4MTA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9TRlQyID0gMHgyMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGt0eXBlW10gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMDAgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAxMCAqLwotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDgsIDB4MDgsIDB4MDgsIC8qICEiIyQlJicgKi8vKiAiICovCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgLyogKCkqKywtLi8gKi8KLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAvKiAwMTIzNDU2NyAqLwotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIC8qIDg5OjsgPD0+PyAqLwotCTB4MjksIDB4MjgsIDB4MmIsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIEBBQkNERUZHICovCi0JMHgyYSwgMHgyOCwgMHgyYSwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogSElKS0xNTk8gKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBQUVJTVFVWVyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIFhZWltcXV5fICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogYWJjZGVmZyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIGhpamtsbW5vICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogcHFyc3R1dncgKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDAwLCAvKiB4eXp7fH1+ICovCi0JMHgyMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgLyogODAgKi8KLQkweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAvKiA5MCAqLwotCTB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MjAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAvKiBBMCAqLwotCShieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAvKiBCMCAqLwotCShieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAvKiBDMCAqLwotCShieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAvKiBEMCAqLwotCShieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAvKiBFMCAqLwotCShieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAvKiBGMCAqLwotCShieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4YzAsIChieXRlKSAweGMwLCAweDAwLH07Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTTzg4NTlfMSA9IDE7IC8vIElTTy0xCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNISUZUX0pJUyA9IDI7IC8vIFRoaXMgaXMgU2hpZnQtSklTCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNKSVNfSEFMRktBTkEgPSA1OyAvLyBUaGlzIGlzIEhhbGYgS2FuYSBpbgotCi0JLyoqCi0JICogQ3VycmVudGx5LCBvbmx5IEphcGFuZXNlIGVuY29kaW5ncyBhcmUgc3VwcG9ydGVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gLTE7IC8vIFVua25vd24KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb2RlCi0JICogICAgICAgICAgICBpbnQKLQkgKiAKLQkgKiBDb252ZXJ0IHByaXZhdGUgaW50IHRvIElBTkEgRW5jb2RpbmcgbmFtZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSUFOQUVuY29kaW5nTmFtZShpbnQgY29kZSkgewotCQlTdHJpbmcgZW5jb2RpbmcgPSBudWxsOwotCi0JCXN3aXRjaCAoY29kZSkgewotCQkJY2FzZSBTSElGVF9KSVMgOgotCQkJY2FzZSBTSklTX0hBTEZLQU5BIDoKLQkJCQllbmNvZGluZyA9ICJTaGlmdF9KSVMiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgRVVDX0pQIDoKLQkJCWNhc2UgRVVDX0hBTEZLQU5BIDoKLQkJCQllbmNvZGluZyA9ICJFVUMtSlAiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgSVNPMjAyMl9KUCA6Ci0JCQljYXNlIEpJU19IQUxGS0FOQSA6Ci0JCQkJZW5jb2RpbmcgPSAiSVNPLTIwMjItSlAiOy8vJE5PTi1OTFMtMSQKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIGVuY29kaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBndWVzc2VkIEphdmEgRW5jb2RpbmcgbmFtZSB0YXJnZXQ6IGJ5dGVzIHRvIGJlIGluc3BlY3RlZCBsZW5ndGg6Ci0JICogbGVuZ3RoIG9mIHRhcmdldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1ZXNzRW5jb2RpbmcoYnl0ZVtdIHRhcmdldCwgaW50IGxlbmd0aCkgewotCQlpbnQgY29kZSA9IFVOS05PV047Ci0KLQkJLy8gQ3VycmVudGx5LCBvbmx5IEphcGFuZXNlIGlzIHN1cHBvcnRlZC4KLQkJU3RyaW5nIHN5c3RlbV9jdHlwZSA9IGphdmEudXRpbC5Mb2NhbGUuZ2V0RGVmYXVsdCgpLmdldExhbmd1YWdlKCk7Ci0JCVN0cmluZyBqcF9jdHlwZSA9IGphdmEudXRpbC5Mb2NhbGUuSkFQQU5FU0UuZ2V0TGFuZ3VhZ2UoKTsKLQkJaWYgKHN5c3RlbV9jdHlwZS5jb21wYXJlVG8oanBfY3R5cGUpID09IDApIHsKLQkJCS8vIE9rLCBJJ20gdW5kZXIgamFfSlAuCi0JCQljb2RlID0gQVNDSUk7Ci0JCQlpbnQgcG9zID0gMDsKLQkJCXdoaWxlICgoY29kZSA9PSBBU0NJSSkgJiYgKGxlbmd0aCA+IDApKSB7Ci0JCQkJaW50IGNoMSA9IHRhcmdldFtwb3NdOwotCQkJCWNoMSA9IGNoMSAmIDB4MDAwMDAwRkY7Ci0JCQkJaW50IGNoMiA9IChsZW5ndGggPj0gMikgPyB0YXJnZXRbcG9zICsgMV0gOiAwOwotCQkJCWNoMiA9IGNoMiAmIDB4MDAwMDAwRkY7Ci0JCQkJaW50IGNoMyA9IChsZW5ndGggPj0gMykgPyB0YXJnZXRbcG9zICsgMl0gOiAwOwotCQkJCWNoMyA9IGNoMyAmIDB4MDAwMDAwRkY7Ci0JCQkJY29kZSA9IGd1ZXNzSmFwYW5lc2VLYW5qaUNvZGUoY2gxLCBjaDIsIGNoMywgMCk7Ci0JCQkJcG9zKys7Ci0JCQkJbGVuZ3RoLS07Ci0JCQl9Ci0JCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCQljYXNlIElTTzIwMjJfSlAgOgotCQkJCWNhc2UgSklTX0hBTEZLQU5BIDoKLQkJCQkJY29kZSA9IElTTzIwMjJfSlA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRVVDX0pQIDoKLQkJCQkJY29kZSA9IEVVQ19KUDsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWNvZGUgPSBTSElGVF9KSVM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChjb252ZXJ0VG9JQU5BRW5jb2RpbmdOYW1lKGNvZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBHdWVzcyB0aGUgZW5jb2RpbmcuIGhhbGZrYW5hX2ZsYWcgPSAweDAxICggZGV0ZWN0IFNKSVMgaGFsZiBrYW5hICkKLQkgKiBoYWxma2FuYV9mbGFnID0gMHgwMiAoIGRldGVjdCBFVUMgaGFsZiBrYW5hICkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ3Vlc3NKYXBhbmVzZUthbmppQ29kZShpbnQgY2gxLCBpbnQgY2gyLCBpbnQgY2gzLCBpbnQgaGFsZmthbmFfZmxhZykgewotCQlib29sZWFuIHNqaXNfaGFua2FrdV9mbGFnID0gKChoYWxma2FuYV9mbGFnICYgMHgwMSkgIT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0JCWJvb2xlYW4gZXVjX2hhbmtha3VfZmxhZyA9ICgoaGFsZmthbmFfZmxhZyAmIDB4MDIpICE9IDApID8gdHJ1ZSA6IGZhbHNlOwotCi0JCWlmIChjaDEgPT0gMCkKLQkJCXJldHVybiBVTktOT1dOOwotCQlpZiAoc2ppc19oYW5rYWt1X2ZsYWcgJiYgY2gxID49IDB4YTEgJiYgY2gxIDw9IDB4ZGYpCi0JCQlyZXR1cm4gU0pJU19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoZXVjX2hhbmtha3VfZmxhZyAmJiBjaDEgPT0gMHg4ZSAmJiBjaDIgPj0gMHhhMSAmJiBjaDIgPD0gMHhkZikKLQkJCXJldHVybiBFVUNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKCgoa3R5cGVbY2gxXSAmIEtUX1NGVDEpICE9IDApICYmICgoa3R5cGVbY2gyXSAmIEtUX1NGVDIpICE9IDApKQotCQkJcmV0dXJuIFNISUZUX0pJUzsKLQkJZWxzZSBpZiAoKChrdHlwZVtjaDFdICYgS1RfRVVDMSkgIT0gMCkgJiYgKChrdHlwZVtjaDJdICYgS1RfRVVDMikgIT0gMCkpCi0JCQlyZXR1cm4gRVVDX0pQOwotCQllbHNlIGlmIChjaDEgPT0gMHgxYiAmJiAoKGt0eXBlW2NoMl0gJiBLVF9KSU4pICE9IDApKQotCQkJcmV0dXJuIElTTzIwMjJfSlA7Ci0JCWVsc2UgaWYgKGNoMSA+PSAweGExICYmIGNoMSA8PSAweGRmKQotCQkJcmV0dXJuIFNKSVNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKGNoMSA9PSAweDFiICYmIGNoMiA9PSAweDI4LyogJygnICovJiYgY2gzID09IDB4NDkvKiAnSScgKi8pCi0JCQlyZXR1cm4gSklTX0hBTEZLQU5BOwotCQllbHNlIGlmIChjaDEgPT0gMHgxYiAmJiBjaDIgPT0gMHgyOC8qICcoJyAqLyYmICgoa3R5cGVbY2gzXSAmIEtUX0pPVVQpICE9IDApKQotCQkJcmV0dXJuIEFTQ0lJX0lOOwotCi0JCXJldHVybiBBU0NJSTsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdHdWVzc2VyKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWRjMDFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1wdWJsaWMgY2xhc3MgSGVhZFBhcnNlclRva2VuIHsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQlwcml2YXRlIFN0cmluZyBmVHlwZTsKLQotCXByb3RlY3RlZCBIZWFkUGFyc2VyVG9rZW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEhlYWRQYXJzZXJUb2tlbihTdHJpbmcgdHlwZSwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQl0aGlzKCk7Ci0JCWZUeXBlID0gdHlwZTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0ID0gdGV4dDsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGZUZXh0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAoInRleHQ6ICIgKyBmVGV4dCArICIgb2Zmc2V0OiAiICsgZlN0YXJ0ICsgIiB0eXBlOiAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4MzBiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotLyoKLSAqIAotICogQSBub24tcmVzaXphYmxlIGNsYXNzIGltcGxlbWVudGluZyB0aGUgYmVoYXZpb3Igb2YgamF2YS51dGlsLlN0YWNrLCBidXQKLSAqIGRpcmVjdGx5IGZvciB0aGUgPGNvZGU+IGludGVnZXIgPC9jb2RlPiBwcmltaXRpdmUuCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludFN0YWNrIHsKLQlwcml2YXRlIGludFtdIGxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgc2l6ZSA9IDA7Ci0KLQlwdWJsaWMgSW50U3RhY2soKSB7Ci0JCXRoaXMoMTAwKTsKLQl9Ci0KLQlwdWJsaWMgSW50U3RhY2soaW50IG1heGRlcHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxpc3QgPSBuZXcgaW50W21heGRlcHRoXTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7Ci0JCXJldHVybiBzaXplID09IDA7Ci0JfQotCi0JcHVibGljIGludCBnZXQoaW50IHNsb3QpIHsKLQkJcmV0dXJuIGxpc3Rbc2xvdF07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCWxpc3RbaV0gPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdAotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcGVlaygpIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBsaXN0W3NpemUgLSAxXTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBvcCgpIHsKLQkJaW50IHZhbHVlID0gcGVlaygpOwotCQlsaXN0W3NpemUgLSAxXSA9IC0xOwotCQlzaXplLS07Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoZXMgYW4gaXRlbSBvbnRvIHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUgLQotCSAqICAgICAgICAgICAgdGhlIGludCB0byBiZSBwdXNoZWQgb250byB0aGlzIHN0YWNrLgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPm5ld1ZhbHVlPC9jb2RlPiBhcmd1bWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IHB1c2goaW50IG5ld1ZhbHVlKSB7Ci0JCWlmIChzaXplID09IGxpc3QubGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgU3RhY2tPdmVyZmxvd0Vycm9yKCk7Ci0JCX0KLQkJbGlzdFtzaXplKytdID0gbmV3VmFsdWU7Ci0JCXJldHVybiBuZXdWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiIgK3NpemUgKyAiIFsiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXMuYXBwZW5kKGxpc3RbaV0pOwotCQkJaWYoaSA8IHNpemUgLSAxKSB7Ci0JCQkJcy5hcHBlbmQoIiwgIik7Ci0JCQl9Ci0JCX0KLQkJcy5hcHBlbmQoIl0iKTsKLQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0Fic3RyYWN0Q1NTTm9kZUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQWJzdHJhY3RDU1NOb2RlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDc5OTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQWJzdHJhY3RDU1NOb2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDU1NOb2RlTGlzdCB7Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIG5vZGVzID0gbnVsbDsKLQotCUlDU1NOb2RlIGFwcGVuZE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm5vZGVzID09IG51bGwpCi0JCQl0aGlzLm5vZGVzID0gbmV3IFZlY3RvcigpOwotCQl0aGlzLm5vZGVzLmFkZEVsZW1lbnQobm9kZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWlmICh0aGlzLm5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIHRoaXMubm9kZXMuc2l6ZSgpOwotCX0KLQotCi0JcHJvdGVjdGVkIElDU1NOb2RlIGl0ZW1JbXBsKGludCBpbmRleCkgewotCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5ub2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJQ1NTTm9kZSkgdGhpcy5ub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCi0JSUNTU05vZGUgcmVtb3ZlTm9kZShpbnQgaW5kZXgpIHsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBub2RlCi0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5ub2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQotCQlJQ1NTTm9kZSByZW1vdmVkID0gKElDU1NOb2RlKSB0aGlzLm5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JCXRoaXMubm9kZXMucmVtb3ZlRWxlbWVudEF0KGluZGV4KTsKLQkJcmV0dXJuIHJlbW92ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NBdHRySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NBdHRySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTA0YTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQXR0ckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NBdHRySW1wbCBleHRlbmRzIENTU1JlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIElDU1NBdHRyIHsKLQotCXByaXZhdGUgU3RyaW5nIGZOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmVmFsdWUgPSBudWxsOwotCXByaXZhdGUgQ1NTTm9kZUltcGwgb3duZXJDU1NOb2RlID0gbnVsbDsKLQotCUNTU0F0dHJJbXBsKENTU0F0dHJJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JCXRoaXMuZk5hbWUgPSB0aGF0LmZOYW1lOwotCQl0aGlzLnNldFZhbHVlKHRoYXQuZlZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDU1NBdHRyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTQXR0ckltcGwoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mTmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJcmV0dXJuIG5ldyBDU1NBdHRySW1wbCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgSUNTU05hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEFUVFJfTk9ERTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgZ2V0T3duZXJDU1NOb2RlKCkgewotCQlyZXR1cm4gb3duZXJDU1NOb2RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gLyogKHRoaXMubmFtZSA9PSBudWxsKSAqL2ZhbHNlOwotCQlpZiAodGhpcy5mTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdGhpcy5mTmFtZS5lcXVhbHMobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5VmFsdWVDaGFuZ2VkKFN0cmluZyBvbGRWYWx1ZSkgewotCQlpZiAodGhpcy5vd25lckNTU05vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBmb3IgbW9kZWwKLQkJSUNTU0RvY3VtZW50IGRvYyA9IG93bmVyQ1NTTm9kZS5nZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNTU01vZGVsSW1wbCBtb2RlbCA9IChDU1NNb2RlbEltcGwpIGRvYy5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwudmFsdWVDaGFuZ2VkKHRoaXMsIG9sZFZhbHVlKTsKLQotCQkvLyBmb3IgYWRhcHRlcnMKLQkJU3RyaW5nIHZhbHVlID0gZ2V0VmFsdWUoKTsKLQkJdGhpcy5vd25lckNTU05vZGUubm90aWZ5KENIQU5HRSwgdGhpcywgb2xkVmFsdWUsIHZhbHVlLCB0aGlzLm93bmVyQ1NTTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdOYW1lKSB7Ci0JCWZOYW1lID0gbmV3TmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckNTU05vZGUoQ1NTTm9kZUltcGwgbmV3T3duZXJDU1NOb2RlKSB7Ci0JCW93bmVyQ1NTTm9kZSA9IG5ld093bmVyQ1NTTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IGZWYWx1ZTsKLQkJZlZhbHVlID0gbmV3VmFsdWU7Ci0KLQkJbm90aWZ5VmFsdWVDaGFuZ2VkKG9sZFZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0NoYXJzZXRSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NDaGFyc2V0UnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc2YzMwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0NoYXJzZXRSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU0NoYXJzZXRSdWxlSW1wbCBleHRlbmRzIENTU1J1bGVJbXBsIGltcGxlbWVudHMgSUNTU0NoYXJzZXRSdWxlIHsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0NoYXJzZXRSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NDaGFyc2V0UnVsZUltcGwoQ1NTQ2hhcnNldFJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTQ2hhcnNldFJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NDaGFyc2V0UnVsZUltcGwodGhpcyk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZW5jb2RpbmcgaW5mb3JtYXRpb24gdXNlZCBpbiB0aGlzIDxjb2RlPkBjaGFyc2V0PC9jb2RlPiBydWxlLgotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgdmFsdWUgaGFzIGEKLQkgKiAgICAgICAgICAgICAgICBzeW50YXggZXJyb3IgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGVuY29kaW5nCi0JICogICAgICAgICAgICAgICAgcnVsZSBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gQ1NTVXRpbC5leHRyYWN0U3RyaW5nQ29udGVudHMoZ2V0QXR0cmlidXRlKEVOQ09ESU5HKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENIQVJTRVRSVUxFX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gQ0hBUlNFVF9SVUxFOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBxdW90ZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJU3RyaW5nIGVuYyA9IENTU1V0aWwuZXh0cmFjdFN0cmluZ0NvbnRlbnRzKGVuY29kaW5nKTsKLQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKGVuYywgcXVvdGUpOwotCQlzZXRBdHRyaWJ1dGUoRU5DT0RJTkcsIHF1b3RlICsgZW5jICsgcXVvdGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RlY2xhcmF0aW9uSXRlbVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQ1MDQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDb3VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuVGV4dFJlZ2lvbkxpc3RJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIgewotCS8qKgotCSAqIAotCSAqLwotCWZpbmFsIGNsYXNzIEZsb2F0SW5mbyB7Ci0JCS8qKgotCQkgKiAKLQkJICovCi0JCUZsb2F0SW5mbyhTdHJpbmcgdGV4dCkgewotCQkJcGFyc2UodGV4dCk7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQl2b2lkIHBhcnNlKFN0cmluZyB0ZXh0KSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmVmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmSWRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlib29sZWFuIGJOdW0gPSB0cnVlOwotCQkJaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJY2hhciBjID0gdGV4dC5jaGFyQXQoaSk7Ci0JCQkJaWYgKGJOdW0pIHsKLQkJCQkJLy8gT25seSBhZGQgKy8tIGlmIGl0J3MgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgdmFsdWUgYnVmZmVyCi0JCQkJCWlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JyB8fCBjID09ICcuJyB8fCAoKGMgPT0gJysnIHx8IGMgPT0gJy0nKSAmJiBpID09IDApKSB7Ci0JCQkJCQlidWZWYWx1ZS5hcHBlbmQoYyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlidWZJZGVudC5hcHBlbmQoYyk7Ci0JCQkJCQliTnVtID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJ1ZklkZW50LmFwcGVuZChjKTsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgdmFsdWVTdHIgPSBidWZWYWx1ZS50b1N0cmluZygpOwotCQkJdHJ5IHsKLQkJCQlmVmFsdWUgPSBGbG9hdC52YWx1ZU9mKHZhbHVlU3RyKS5mbG9hdFZhbHVlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlidWZJZGVudC5pbnNlcnQoMCwgdmFsdWVTdHIpOwotCQkJfQotCQkJZklkZW50aWZpZXIgPSBidWZJZGVudC50b1N0cmluZygpOwotCQkJZlR5cGUgPSBnZXRGbG9hdFZhbHVlVHlwZSh2YWx1ZVN0ciwgZklkZW50aWZpZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJZmxvYXQgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gZlZhbHVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0JCQlyZXR1cm4gZklkZW50aWZpZXI7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlzaG9ydCBnZXRWYWx1ZVR5cGUoKSB7Ci0JCQlyZXR1cm4gZlR5cGU7Ci0JCX0KLQotCQlwcml2YXRlIGZsb2F0IGZWYWx1ZSA9IDAuMGY7Ci0JCXByaXZhdGUgU3RyaW5nIGZJZGVudGlmaWVyID0gbnVsbDsKLQkJcHJpdmF0ZSBzaG9ydCBmVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VTktOT1dOOwotCX0KLQotCWZpbmFsIHN0YXRpYyBpbnQgU19OT1JNQUwgPSAwOwotCWZpbmFsIHN0YXRpYyBpbnQgU19GVU5DVElPTiA9IDE7Ci0JZmluYWwgc3RhdGljIGludCBTX0ZPTlRfU0xBU0ggPSAyOwotCWZpbmFsIHN0YXRpYyBpbnQgU19DT01NQV9TRVBBUkFUSU9OID0gMzsKLQlwcml2YXRlIElDU1NEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmUGFyZW50UmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmYWxzZTsKLQlwcml2YXRlIENTU01vZGVsVXBkYXRlQ29udGV4dCBmVXBkYXRlQ29udGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIoSUNTU0RvY3VtZW50IGRvYykgewotCQlzdXBlcigpOwotCQlmRG9jdW1lbnQgPSBkb2M7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlQXR0clZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyBmdW5jTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShyZWdpb25zKTsKLQkJaWYgKGZ1bmNOYW1lID09IG51bGwgfHwgIWZ1bmNOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJhdHRyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlR9OwotCQlJVGV4dFJlZ2lvbkxpc3QgdmFsdWVSZWdpb25zID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKHJlZ2lvbnMsIGFjY2VwdHMpOwotCQlpZiAodmFsdWVSZWdpb25zLnNpemUoKSAhPSAxKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IGdldENTU1ByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlLkNTU19BVFRSKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldCgwKTsKLQkJdmFsdWUuc2V0VmFsdWUoZ2V0VGV4dChyZWdpb24pKTsKLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlQ291bnRlcnNWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygiY291bnRlcnMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5ULCBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HfTsKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJaW50IHNpemUgPSB2YWx1ZVJlZ2lvbnMuc2l6ZSgpOwotCQlpZiAoc2l6ZSAhPSAyICYmIHNpemUgIT0gMykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDb3VudGVySW1wbCB2YWx1ZSA9IGdldENvdW50ZXIoKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoaSk7Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFRleHQocmVnaW9uKTsKLQkJCUNTU0F0dHJJbXBsIGF0dHIgPSBudWxsOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJdmFsdWUuc2V0SWRlbnRpZmllcih0ZXh0KTsKLQkJCQkJYXR0ciA9IHZhbHVlLmdldEF0dHJpYnV0ZU5vZGUoSUNvdW50ZXIuSURFTlRJRklFUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJCXZhbHVlLnNldFNlcGFyYXRvcih0ZXh0KTsKLQkJCQkJYXR0ciA9IHZhbHVlLmdldEF0dHJpYnV0ZU5vZGUoSUNvdW50ZXIuU0VQQVJBVE9SKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyIDoKLQkJCQkJdmFsdWUuc2V0TGlzdFN0eWxlKHRleHQpOwotCQkJCQlhdHRyID0gdmFsdWUuZ2V0QXR0cmlidXRlTm9kZShJQ291bnRlci5MSVNUU1RZTEUpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihmUGFyZW50UmVnaW9uLCByZWdpb24sIHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlQ291bnRlclZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyBmdW5jTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShyZWdpb25zKTsKLQkJaWYgKGZ1bmNOYW1lID09IG51bGwgfHwgIWZ1bmNOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJjb3VudGVyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVH07Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWludCBzaXplID0gdmFsdWVSZWdpb25zLnNpemUoKTsKLQkJaWYgKHNpemUgIT0gMSAmJiBzaXplICE9IDIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ291bnRlckltcGwgdmFsdWUgPSBnZXRDb3VudGVyKCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KGkpOwotCQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KHJlZ2lvbik7Ci0JCQlDU1NBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJCXN3aXRjaCAoaSkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCXZhbHVlLnNldElkZW50aWZpZXIodGV4dCk7Ci0JCQkJCWF0dHIgPSB2YWx1ZS5nZXRBdHRyaWJ1dGVOb2RlKElDb3VudGVyLklERU5USUZJRVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDEgOgotCQkJCQl2YWx1ZS5zZXRMaXN0U3R5bGUodGV4dCk7Ci0JCQkJCWF0dHIgPSB2YWx1ZS5nZXRBdHRyaWJ1dGVOb2RlKElDb3VudGVyLkxJU1RTVFlMRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQlhdHRyLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbiwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1N0eWxlRGVjbEl0ZW1JbXBsIGNyZWF0ZURlY2xhcmF0aW9uSXRlbShJVGV4dFJlZ2lvbkxpc3Qgbm9kZVJlZ2lvbnMpIHsKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgaXRlbSA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gZ2V0UHJvcGVydHlOYW1lKG5vZGVSZWdpb25zKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJaXRlbSA9IGdldENTU1N0eWxlRGVjbEl0ZW0obmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW07Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlRmxvYXRWYWx1ZShTdHJpbmcgdGV4dCwgU3RyaW5nIHR5cGUpIHsKLQkJRmxvYXRJbmZvIGluZm8gPSBuZXcgRmxvYXRJbmZvKHRleHQpOwotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBnZXRDU1NQcmltaXRpdmVWYWx1ZShpbmZvLmdldFZhbHVlVHlwZSgpKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCXZhbHVlLnNldFZhbHVlKGluZm8uZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZUZvcm1hdFZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyBmdW5jTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShyZWdpb25zKTsKLQkJaWYgKGZ1bmNOYW1lID09IG51bGwgfHwgIWZ1bmNOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJmb3JtYXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkd9OwotCQlJVGV4dFJlZ2lvbkxpc3QgdmFsdWVSZWdpb25zID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKHJlZ2lvbnMsIGFjY2VwdHMpOwotCQkvLyBmb3JtYXQgY2FuIHRha2UgdmFyaWFibGUgYXJncy4KLQkJaWYgKHZhbHVlUmVnaW9ucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBnZXRDU1NQcmltaXRpdmVWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0ZPUk1BVCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoMCk7Ci0JCXZhbHVlLnNldFZhbHVlKENTU1V0aWwuZXh0cmFjdFN0cmluZ0NvbnRlbnRzKGdldFRleHQocmVnaW9uKSkpOwotCi0JCXJldHVybiB2YWx1ZTsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZUxvY2FsVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImxvY2FsIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HfTsKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJaWYgKHZhbHVlUmVnaW9ucy5zaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBnZXRDU1NQcmltaXRpdmVWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0xPQ0FMKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldCgwKTsKLQkJdmFsdWUuc2V0VmFsdWUoQ1NTVXRpbC5leHRyYWN0U3RyaW5nQ29udGVudHMoZ2V0VGV4dChyZWdpb24pKSk7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZVByaW1pdGl2ZVZhbHVlKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IG51bGw7Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KHJlZ2lvbik7Ci0JCWlmIChpc0JsYW5rKHR5cGUpKSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKSB7Ci0JCQl2YWx1ZSA9IGNyZWF0ZUZsb2F0VmFsdWUodGV4dCwgdHlwZSk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQl2YWx1ZSA9IGNyZWF0ZVN0cmluZ1ZhbHVlKHRleHQsIHR5cGUpOwotCQl9Ci0KLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gY3JlYXRlU3RyaW5nVmFsdWUodGV4dCwgdHlwZSk7Ci0JCX0KLQotCQlpZiAoIWZUZW1wU3RydWN0dXJlZERvY3VtZW50ICYmIHZhbHVlICE9IG51bGwpIHsKLQkJCXZhbHVlLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVQcmltaXRpdmVWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBudWxsOwotCQlDU1NVdGlsLnN0cmlwU3Vycm91bmRpbmdTcGFjZShyZWdpb25zKTsKLQkJaWYgKHJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KHJlZ2lvbikudG9Mb3dlckNhc2UoKTsKLQkJCWlmICh0ZXh0LmVxdWFscygicmdiKCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IGNyZWF0ZVJnYlZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dC5lcXVhbHMoImNvdW50ZXIoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlQ291bnRlclZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dC5lcXVhbHMoImNvdW50ZXJzKCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IGNyZWF0ZUNvdW50ZXJzVmFsdWUocmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmVxdWFscygiYXR0cigiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVBdHRyVmFsdWUocmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmVxdWFscygiZm9ybWF0KCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IGNyZWF0ZUZvcm1hdFZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dC5lcXVhbHMoImxvY2FsKCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IGNyZWF0ZUxvY2FsVmFsdWUocmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmVxdWFscygicmVjdCgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVSZWN0VmFsdWUocmVnaW9ucyk7Ci0JCQl9Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCXZhbHVlID0gY3JlYXRlU3RyaW5nVmFsdWUocmVnaW9ucyk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWx1ZSA9IGNyZWF0ZVN0cmluZ1ZhbHVlKHJlZ2lvbnMpOwotCQl9Ci0KLQkJaWYgKCFmVGVtcFN0cnVjdHVyZWREb2N1bWVudCAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0JCQl2YWx1ZS5zZXRSYW5nZVJlZ2lvbihmUGFyZW50UmVnaW9uLCByZWdpb25zLmdldCgwKSwgcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKSk7Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlUmVjdFZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyBmdW5jTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShyZWdpb25zKTsKLQkJaWYgKGZ1bmNOYW1lID09IG51bGwgfHwgIWZ1bmNOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJyZWN0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSLCBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OLCBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlR9OyAvLyBJREVOVDoKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhdXRvJwotCQlJVGV4dFJlZ2lvbkxpc3QgdmFsdWVSZWdpb25zID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKHJlZ2lvbnMsIGFjY2VwdHMpOwotCQlpZiAodmFsdWVSZWdpb25zLnNpemUoKSAhPSA0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVJlY3RJbXBsIHZhbHVlID0gZ2V0UmVjdCgpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldChpKTsKLQkJCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjaGlsZFZhbHVlID0gbnVsbDsKLQkJCXN3aXRjaCAoaSkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRUb3AoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJY2hpbGRWYWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHZhbHVlLmdldFJpZ2h0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMiA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRCb3R0b20oKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzIDoKLQkJCQkJY2hpbGRWYWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHZhbHVlLmdldExlZnQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGNoaWxkVmFsdWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KHJlZ2lvbik7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlzZXRTdHJpbmdWYWx1ZShjaGlsZFZhbHVlLCB0ZXh0LCB0eXBlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldEZsb2F0VmFsdWUoY2hpbGRWYWx1ZSwgdGV4dCwgdHlwZSk7Ci0JCQl9Ci0JCQlpZiAoIWZUZW1wU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJY2hpbGRWYWx1ZS5zZXRSYW5nZVJlZ2lvbihmUGFyZW50UmVnaW9uLCByZWdpb24sIHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlUmdiVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoInJnYiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0V9OwotCQlJVGV4dFJlZ2lvbkxpc3QgdmFsdWVSZWdpb25zID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKHJlZ2lvbnMsIGFjY2VwdHMpOwotCQlpZiAodmFsdWVSZWdpb25zLnNpemUoKSAhPSAzKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVJHQkNvbG9ySW1wbCB2YWx1ZSA9IGdldFJHQkNvbG9yKCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KGkpOwotCQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNoaWxkVmFsdWUgPSBudWxsOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJY2hpbGRWYWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHZhbHVlLmdldFJlZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDEgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0R3JlZW4oKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyIDoKLQkJCQkJY2hpbGRWYWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHZhbHVlLmdldEJsdWUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGNoaWxkVmFsdWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJc2V0RmxvYXRWYWx1ZShjaGlsZFZhbHVlLCBnZXRUZXh0KHJlZ2lvbiksIHJlZ2lvbi5nZXRUeXBlKCkpOwotCQkJaWYgKCFmVGVtcFN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCWNoaWxkVmFsdWUuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZVN0cmluZ1ZhbHVlKFN0cmluZyB0ZXh0LCBTdHJpbmcgdHlwZSkgewotCQlzaG9ydCB2YWx1ZVR5cGUgPSBnZXRTdHJpbmdWYWx1ZVR5cGUodGV4dCwgdHlwZSk7Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IGdldENTU1ByaW1pdGl2ZVZhbHVlKHZhbHVlVHlwZSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAodmFsdWVUeXBlID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkkpIHsKLQkJCQl0ZXh0ID0gQ1NTVXRpbC5leHRyYWN0VXJpQ29udGVudHModGV4dCk7Ci0JCQl9Ci0JCQllbHNlIGlmICh2YWx1ZVR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NUUklORykgewotCQkJCXRleHQgPSBDU1NVdGlsLmV4dHJhY3RTdHJpbmdDb250ZW50cyh0ZXh0KTsKLQkJCX0KLQkJCXZhbHVlLnNldFZhbHVlKHRleHQpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVTdHJpbmdWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgdHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVDsKLQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID09IDEpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQkJdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZVN0cmluZ1ZhbHVlKG1ha2VTdHJpbmcocmVnaW9ucyksIHR5cGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ291bnRlckltcGwgZ2V0Q291bnRlcigpIHsKLQkJQ291bnRlckltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0ICE9IG51bGwgJiYgZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENvdW50ZXIoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ291bnRlckltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09VTlRFUik7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoc2hvcnQgdHlwZSkgewotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0ICE9IG51bGwgJiYgZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU1ByaW1pdGl2ZVZhbHVlKHR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZSh0eXBlKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1N0eWxlRGVjbEl0ZW1JbXBsIGdldENTU1N0eWxlRGVjbEl0ZW0oU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCAmJiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTU3R5bGVEZWNsSXRlbShwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NTdHlsZURlY2xJdGVtSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1N0eWxlRGVjbEl0ZW0ocHJvcGVydHlOYW1lKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgc2hvcnQgZ2V0RmxvYXRWYWx1ZVR5cGUoU3RyaW5nIGlkZW50KSB7Ci0JCWlkZW50ID0gaWRlbnQudG9Mb3dlckNhc2UoKTsKLQkJc2hvcnQgdmFsdWVUeXBlOwotCQlpZiAoaWRlbnQubGVuZ3RoKCkgPT0gMCkgewotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUjsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHMoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEVSQ0VOVEFHRTsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJlbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FTVM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZXgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRVhTOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInB4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImNtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NNOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoIm1tIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01NOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImluIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInB0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BUOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInBjIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BDOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImRlZyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ERUc7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicmFkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JBRDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJncmFkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0dSQUQ7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgibXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTVM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImh6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0haOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImtoeiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19LSFo7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRElNRU5TSU9OOwotCQl9Ci0JCXJldHVybiB2YWx1ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHNob3J0IGdldEZsb2F0VmFsdWVUeXBlKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGlkZW50KSB7Ci0JCWlkZW50ID0gaWRlbnQudG9Mb3dlckNhc2UoKTsKLQkJc2hvcnQgdmFsdWVUeXBlOwotCQlpZiAoaWRlbnQubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKDAgPD0gdmFsdWUuaW5kZXhPZignLicpKSB7Ci0JCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZhbHVlVHlwZSA9IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUjsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHMoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEVSQ0VOVEFHRTsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJlbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FTVM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZXgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRVhTOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInB4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImNtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NNOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoIm1tIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01NOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImluIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInB0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BUOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInBjIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BDOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImRlZyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ERUc7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicmFkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JBRDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJncmFkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0dSQUQ7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgibXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTVM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImh6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0haOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImtoeiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19LSFo7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRElNRU5TSU9OOwotCQl9Ci0JCXJldHVybiB2YWx1ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RnVuY3Rpb25OYW1lKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPCAyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVGV4dFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQlpZiAoZmlyc3RSZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChmaXJzdFJlZ2lvbik7Ci0JCXJldHVybiB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBtZXRob2QgaGFzIG5vIHZhbGlkYXRpb24gY2hlY2ssIHRoZW4gcmVnaW9ucyBtdXN0IGJlIHBhc3NlZAotCSAqIGdldEZ1bmN0aW9uTmFtZSgpLi4uCi0JICovCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbkxpc3QgZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKElUZXh0UmVnaW9uTGlzdCByZWdpb25zLCBTdHJpbmdbXSBhY2NlcHRzKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCQlpbnQgbkFjY2VwdHMgPSAoYWNjZXB0cyAhPSBudWxsKSA/IGFjY2VwdHMubGVuZ3RoIDogMDsKLQkJSXRlcmF0b3IgaSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJaS5uZXh0KCk7IC8vIHNraXAgRlVOQ1RJT04KLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGkubmV4dCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoaXNCbGFuayh0eXBlKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKG5BY2NlcHRzID09IDApIHsKLQkJCQluZXdSZWdpb25zLmFkZChyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9yIChpbnQgaUFjY2VwdCA9IDA7IGlBY2NlcHQgPCBuQWNjZXB0czsgaUFjY2VwdCsrKSB7Ci0JCQkJCWlmICh0eXBlID09IGFjY2VwdHNbaUFjY2VwdF0pIHsKLQkJCQkJCW5ld1JlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQkvLyBwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCS8vIFZlY3RvciBub2RlUmVnaW9ucyA9IG5ldyBWZWN0b3IoZmxhdE5vZGUuZ2V0UmVnaW9ucygpKTsKLQkvLyByZXR1cm4gZ2V0UHJvcGVydHlOYW1lKG5vZGVSZWdpb25zKTsKLQkvLyB9Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKElUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucykgewotCQlJVGV4dFJlZ2lvbkxpc3QgbmFtZVJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJd2hpbGUgKCFub2RlUmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5vZGVSZWdpb25zLnJlbW92ZSgwKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUikgewotCQkJCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKG5hbWVSZWdpb25zKTsKLQkJCQluYW1lID0gbWFrZVN0cmluZyhuYW1lUmVnaW9ucyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluYW1lUmVnaW9ucy5hZGQocmVnaW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFJlY3RJbXBsIGdldFJlY3QoKSB7Ci0JCVJlY3RJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dCAhPSBudWxsICYmIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRSZWN0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKFJlY3RJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JFQ1QpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgUkdCQ29sb3JJbXBsIGdldFJHQkNvbG9yKCkgewotCQlSR0JDb2xvckltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0ICE9IG51bGwgJiYgZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldFJHQkNvbG9yKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKFJHQkNvbG9ySW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SR0JDT0xPUik7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzaG9ydCBnZXRTdHJpbmdWYWx1ZVR5cGUoU3RyaW5nIHRleHQsIFN0cmluZyB0eXBlKSB7Ci0JCXNob3J0IHZhbHVlVHlwZTsKLQkJaWYgKHRleHQudG9Mb3dlckNhc2UoKS5lcXVhbHMoImluaGVyaXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOSEVSSVRfUFJJTUlUSVZFOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSkgewotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSSTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkcpIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TVFJJTkc7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJdmFsdWVUeXBlID0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19IQVNIOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SICYmIHRleHQuZXF1YWxzKCIsIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT01NQTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiB0ZXh0LmVxdWFscygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU0xBU0g7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRSkgewotCQkJdmFsdWVUeXBlID0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkFOR0U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSURFTlQ7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtYWtlU3RyaW5nKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gYlNwYWNlID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGkubmV4dCgpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKCFiU3BhY2UgJiYgaXNCbGFuayh0eXBlKSkgewotCQkJCWJ1Zi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJTcGFjZSA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBbMjc0OTQ1XSBNdWx0aXBsZSByZWdpb25zIHNob3VsZCBoYXZlIHRoZSBzcGFjZXMgYmV0d2VlbiBjb2xsYXBzZWQKLQkJCQlTdHJpbmcgdGV4dCA9IGkuaGFzTmV4dCgpID8gZ2V0Q29sbGFwc2VkVGV4dChyZWdpb24pIDogZ2V0VGV4dChyZWdpb24pOwotCQkJCWJ1Zi5hcHBlbmQodGV4dCk7Ci0JCQkJYlNwYWNlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRUZW1wb3JhcnkoYm9vbGVhbiBiVGVtcCkgewotCQlmVGVtcFN0cnVjdHVyZWREb2N1bWVudCA9IGJUZW1wOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRGbG9hdFZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSwgU3RyaW5nIHRleHQsIFN0cmluZyB0eXBlKSB7Ci0JCUZsb2F0SW5mbyBpbmZvID0gbmV3IEZsb2F0SW5mbyh0ZXh0KTsKLQkJdmFsdWUuc2V0RmxvYXRWYWx1ZShpbmZvLmdldFZhbHVlVHlwZSgpLCBpbmZvLmdldFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTdHJpbmdWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUsIFN0cmluZyB0ZXh0LCBTdHJpbmcgdHlwZSkgewotCQlzaG9ydCB2YWx1ZVR5cGUgPSBnZXRTdHJpbmdWYWx1ZVR5cGUodGV4dCwgdHlwZSk7Ci0JCXZhbHVlLnNldFN0cmluZ1ZhbHVlKHZhbHVlVHlwZSwgdGV4dCk7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFVwZGF0ZUNvbnRleHQoQ1NTTW9kZWxVcGRhdGVDb250ZXh0IHVwZGF0ZUNvbnRleHQpIHsKLQkJZlVwZGF0ZUNvbnRleHQgPSB1cGRhdGVDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDb2xvblNlcGFyYXRvcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpID0gcmVnaW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZURlY2xJdGVtSW1wbCBzZXR1cERlY2xhcmF0aW9uSXRlbShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoIWhhc0NvbG9uU2VwYXJhdG9yKGZsYXROb2RlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmUGFyZW50UmVnaW9uID0gZmxhdE5vZGU7Ci0KLQkJSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChmbGF0Tm9kZS5nZXRSZWdpb25zKCkpOyAvLyBtYWtlCi0JCS8vIGNvcHkKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgbmV3SXRlbSA9IGNyZWF0ZURlY2xhcmF0aW9uSXRlbShub2RlUmVnaW9ucyk7Ci0JCWlmIChuZXdJdGVtID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJbmV3SXRlbS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSwgZmxhdE5vZGUpOwotCQl9Ci0KLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2Uobm9kZVJlZ2lvbnMpOwotCQkvLyBOb3csIG5vZGVSZWdpb25zIGp1c3QgaGFzIHJlZ2lvbnMgZm9yIHZhbHVlLgotCQlzZXR1cFZhbHVlcyhuZXdJdGVtLCBub2RlUmVnaW9ucyk7Ci0JCXJldHVybiBuZXdJdGVtOwotCX0KLQotCXZvaWQgc2V0dXBWYWx1ZXMoSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnRSZWdpb24sIElUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucykgewotCQlmUGFyZW50UmVnaW9uID0gcGFyZW50UmVnaW9uOwotCQlzZXR1cFZhbHVlcyhpdGVtLCBub2RlUmVnaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogbm9kZVJlZ2lvbnMgbXVzdCBiZSBicm9rZW4uIElmIHlvdSBuZWVkIGFmdGVyLCBtYWtlIGNvcHkgb2YgdGhlbS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBWYWx1ZXMoSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSwgSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkJ1ZiA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gaXRlbS5nZXRQcm9wZXJ0eU5hbWUoKS50b0xvd2VyQ2FzZSgpOwotCQlib29sZWFuIGJGb250ID0gKHByb3BlcnR5TmFtZS5lcXVhbHMoUHJvcENNUHJvcGVydHkuUF9GT05UKSk7Ci0JCS8vIChzaG9ydC1oYW5kKSBmb250Ci0JCWludCBzdGF0dXMgPSAocHJvcGVydHlOYW1lLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX1ZPSUNFX0ZBTUlMWSkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKSkgPyBTX0NPTU1BX1NFUEFSQVRJT04gOiBTX05PUk1BTDsKLQkJd2hpbGUgKCFub2RlUmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5vZGVSZWdpb25zLnJlbW92ZSgwKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fCB0eXBlCi0JCQkvLyA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkvLyBicmVhazsKLQkJCS8vIH0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQkJY2FzZSBTX05PUk1BTCA6Ci0JCQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCQkJcmVnaW9uQnVmLmFkZChyZWdpb24pOwotCQkJCQkJc3RhdHVzID0gU19GVU5DVElPTjsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChiRm9udCAmJiB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiBmUGFyZW50UmVnaW9uLmdldFRleHQocmVnaW9uKS5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbik7Ci0JCQkJCQlzdGF0dXMgPSBTX0ZPTlRfU0xBU0g7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoIWlzQmxhbmsodHlwZSkpIHsKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNfRlVOQ1RJT04gOgotCQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpIHsKLQkJCQkJCXJlZ2lvbkJ1Zi5hZGQocmVnaW9uKTsKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uQnVmKTsKLQkJCQkJCXJlZ2lvbkJ1Zi5jbGVhcigpOwotCQkJCQkJc3RhdHVzID0gU19OT1JNQUw7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoIWlzQmxhbmsodHlwZSkpIHsKLQkJCQkJCXJlZ2lvbkJ1Zi5hZGQocmVnaW9uKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNfRk9OVF9TTEFTSCA6Ci0JCQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04pIHsKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uKTsKLQkJCQkJCXN0YXR1cyA9IFNfQ09NTUFfU0VQQVJBVElPTjsKLQkJCQkJfQotCQkJCQllbHNlIGlmICghaXNCbGFuayh0eXBlKSkgewotCQkJCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb24pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU19DT01NQV9TRVBBUkFUSU9OIDoKLQkJCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SICYmIGZQYXJlbnRSZWdpb24uZ2V0VGV4dChyZWdpb24pLmVxdWFscygiLCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uQnVmKTsKLQkJCQkJCXJlZ2lvbkJ1Zi5jbGVhcigpOwotCQkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoZlVwZGF0ZUNvbnRleHQgPT0gbnVsbCB8fCAhZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJCQkJCQlpdGVtLmFwcGVuZFZhbHVlKHZhbHVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZWdpb25CdWYuYWRkKHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQlpZiAoZlVwZGF0ZUNvbnRleHQgPT0gbnVsbCB8fCAhZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJCQlpdGVtLmFwcGVuZFZhbHVlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFyZWdpb25CdWYuaXNFbXB0eSgpKSB7Ci0JCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbkJ1Zik7Ci0JCQlpZiAoZlVwZGF0ZUNvbnRleHQgPT0gbnVsbCB8fCAhZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJCWl0ZW0uYXBwZW5kVmFsdWUodmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29sbGFwc2VkVGV4dChJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKGZQYXJlbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoZlBhcmVudFJlZ2lvbi5nZXRGdWxsVGV4dChyZWdpb24pKTsKLQkJaWYgKHJlZ2lvbi5nZXRMZW5ndGgoKSA+IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpCi0JCQl0ZXh0LnJlcGxhY2UocmVnaW9uLmdldFRleHRMZW5ndGgoKSwgcmVnaW9uLmdldExlbmd0aCgpLCAiICIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dChJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIChmUGFyZW50UmVnaW9uICE9IG51bGwpID8gZlBhcmVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbikgOiAiIjsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmxhbmsoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RvY3VtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEb2N1bWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhNTQzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIENTU0RvY3VtZW50SW1wbCBleHRlbmRzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIElDU1NEb2N1bWVudCB7Ci0KLQlwcml2YXRlIENTU01vZGVsSW1wbCBmTW9kZWwgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTRG9jdW1lbnRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTRG9jdW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JQ1NTRG9jdW1lbnRJbXBsKENTU0RvY3VtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCUlDU1NOb2RlIGNyZWF0ZUNTU0F0dHIoU3RyaW5nIG5hbWUpIHsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IG5ldyBDU1NBdHRySW1wbChuYW1lKTsKLQkJYXR0ci5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0NoYXJzZXRSdWxlCi0JICovCi0JcHVibGljIElDU1NDaGFyc2V0UnVsZSBjcmVhdGVDU1NDaGFyc2V0UnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlCi0JICovCi0JcHVibGljIENTU0ZvbnRGYWNlUnVsZSBjcmVhdGVDU1NGb250RmFjZVJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU0ltcG9ydFJ1bGUgY3JlYXRlQ1NTSW1wb3J0UnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuSUNTU01lZGlhUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTTWVkaWFSdWxlIGNyZWF0ZUNTU01lZGlhUnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUGFnZVJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU1BhZ2VSdWxlIGNyZWF0ZUNTU1BhZ2VSdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCXB1YmxpYyBJQ1NTUHJpbWl0aXZlVmFsdWUgY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoc2hvcnQgcHJpbWl0aXZlVHlwZSkgewotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBudWxsOwotCQlpZiAocHJpbWl0aXZlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09VTlRFUikKLQkJCXZhbHVlID0gbmV3IENvdW50ZXJJbXBsKCk7Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JFQ1QpCi0JCQl2YWx1ZSA9IG5ldyBSZWN0SW1wbCgpOwotCQllbHNlIGlmIChwcmltaXRpdmVUeXBlID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SR0JDT0xPUikKLQkJCXZhbHVlID0gbmV3IFJHQkNvbG9ySW1wbCgpOwotCQllbHNlCi0JCQl2YWx1ZSA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwocHJpbWl0aXZlVHlwZSk7Ci0JCXZhbHVlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDU1NSdWxlIGNyZWF0ZUNTU1J1bGUoU3RyaW5nIHJ1bGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbEl0ZW0gY3JlYXRlQ1NTU3R5bGVEZWNsSXRlbShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGl0ZW0gPSBuZXcgQ1NTU3R5bGVEZWNsSXRlbUltcGwocHJvcGVydHlOYW1lKTsKLQkJaXRlbS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBpdGVtOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVSdWxlIGNyZWF0ZUNTU1N0eWxlUnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGUKLQkgKi8KLQlwdWJsaWMgQ1NTVW5rbm93blJ1bGUgY3JlYXRlQ1NTVW5rbm93blJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0Ci0JICovCi0JcHVibGljIE1lZGlhTGlzdCBjcmVhdGVNZWRpYUxpc3QoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ1NTTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiBmTW9kZWw7Ci0JfQotCi0Jdm9pZCBzZXRNb2RlbChDU1NNb2RlbEltcGwgbW9kZWwpIHsKLQkJdGhpcy5mTW9kZWwgPSBtb2RlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0ZvbnRGYWNlUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRm9udEZhY2VSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGNkOWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRm9udEZhY2VSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZTsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NGb250RmFjZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZURlY2xDb250YWluZXIgaW1wbGVtZW50cyBDU1NGb250RmFjZVJ1bGUgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTRm9udEZhY2VSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NGb250RmFjZVJ1bGVJbXBsKENTU0ZvbnRGYWNlUnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NGb250RmFjZVJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NGb250RmFjZVJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZXh0cmFjdFByZVN0cmluZygpIHsKLQkJcmV0dXJuICJAZm9udC1mYWNlIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEZPTlRGQUNFUlVMRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEZPTlRfRkFDRV9SVUxFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTSW1wb3J0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTSW1wb3J0UnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZhMzg1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0ltcG9ydFJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JTW9kZWxQcm92aWRlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU0xpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5VUkxNb2RlbFByb3ZpZGVyQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0KLS8qKgotICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLSAqLwotcHVibGljIGNsYXNzIENTU0ltcG9ydFJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZUltcGwgaW1wbGVtZW50cyBJQ1NTSW1wb3J0UnVsZSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkRpcnR5ID0gdHJ1ZTsKLQlwcml2YXRlIElDU1NTdHlsZVNoZWV0IGZTdHlsZVNoZWV0OwotCi0JLyoqCi0gICAgICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLSAgICAgKi8KLQlwdWJsaWMgQ1NTSW1wb3J0UnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU0ltcG9ydFJ1bGVJbXBsKENTU0ltcG9ydFJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTSW1wb3J0UnVsZUltcGwgY2xvbmVkID0gbmV3IENTU0ltcG9ydFJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNsb3NlU3R5bGVTaGVldCgpIHsKLQkJaWYgKGZTdHlsZVNoZWV0ICE9IG51bGwpIHsKLQkJCUlDU1NTdHlsZVNoZWV0IHNoZWV0ID0gZlN0eWxlU2hlZXQ7Ci0JCQlmU3R5bGVTaGVldCA9IG51bGw7IC8vIHRvIHByZXZlbnQgbG9vcCwgd2UgbXVzdCByZXNldCBmU3R5bGVTaGVldAotCQkJCQkJCQkvLyBiZWZvcmUgYWxsIGNsb3NpbmcgYWN0aW9uCi0KLQkJCXNoZWV0LmdldE1vZGVsKCkucmVtb3ZlU3R5bGVMaXN0ZW5lcihnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0JCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyBpZiAoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PQotCQkJLy8gSUNTU01vZGVsLkVNQkVEREVEKSB7IC8vIGNhc2UgU1RZTEUgdGFnCi0JCQkvLyBhZGFwdGVyID0gKE1vZGVsUHJvdmlkZUFkYXB0ZXIpCi0JCQkvLyAoKElOb2RlTm90aWZpZXIpZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0T3duZXJET01Ob2RlKCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyB9Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCWFkYXB0ZXIubW9kZWxSZW1vdmVkKHNoZWV0LmdldE1vZGVsKCkpOwotCi0JCQlzaGVldC5nZXRNb2RlbCgpLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGxvY2F0aW9uIG9mIHRoZSBzdHlsZSBzaGVldCB0byBiZSBpbXBvcnRlZC4gVGhlIGF0dHJpYnV0ZSB3aWxsIG5vdAotCSAqIGNvbnRhaW4gdGhlIDxjb2RlPiJ1cmwoLi4uKSI8L2NvZGU+IHNwZWNpZmllciBhcm91bmQgdGhlIFVSSS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0JCXJldHVybiBDU1NVdGlsLmV4dHJhY3RVcmlDb250ZW50cyhnZXRBdHRyaWJ1dGUoSFJFRikpOwotCX0KLQotCS8qKgotCSAqIEEgbGlzdCBvZiBtZWRpYSB0eXBlcyBmb3Igd2hpY2ggdGhpcyBzdHlsZSBzaGVldCBtYXkgYmUgdXNlZC4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0IGdldE1lZGlhKCkgewotCQlJQ1NTTm9kZSBtZWRpYSA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKG1lZGlhICE9IG51bGwpIHsKLQkJCWlmIChtZWRpYSBpbnN0YW5jZW9mIE1lZGlhTGlzdCkgewotCQkJCXJldHVybiAoTWVkaWFMaXN0KSBtZWRpYTsKLQkJCX0KLQkJfQotCi0JCS8vIFRISVMgQ0FTRSBJUyBFUlJPUiBDQVNFCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBJTVBPUlRSVUxFX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0eWxlIHNoZWV0IHJlZmVycmVkIHRvIGJ5IHRoaXMgcnVsZSwgaWYgaXQgaGFzIGJlZW4gbG9hZGVkLiBUaGUKLQkgKiB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3R5bGUgc2hlZXQgaGFzCi0JICogbm90IHlldCBiZWVuIGxvYWRlZCBvciBpZiBpdCB3aWxsIG5vdCBiZSBsb2FkZWQgKGUuZy4gaWYgdGhlIHN0eWxlCi0JICogc2hlZXQgaXMgZm9yIGEgbWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB1c2VyIGFnZW50KS4KLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVTaGVldCBnZXRTdHlsZVNoZWV0KCkgewotCi0JCWlmIChmRGlydHkpIHsKLQkJCS8vIE5PVEU6IHRyeS9jYXRjaCBibG9jayBpcyBhIFRFTVAgZml4IHRvIGF2b2lkIGNvbXBpbGUgZXJyb3JzOgotCQkJdHJ5IHsKLQkJCQljbG9zZVN0eWxlU2hlZXQoKTsKLQotCQkJCWlmIChnZXRIcmVmKCkgPT0gbnVsbCB8fCBnZXRIcmVmKCkubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlmRGlydHkgPSBmYWxzZTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwgPSBnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsgLy8gY2FzZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gU1RZTEUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRhZwotCQkJCQliYXNlTW9kZWwgPSAoKElET01Ob2RlKSBnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRPd25lckRPTU5vZGUoKSkuZ2V0TW9kZWwoKTsKLQkJCQl9Ci0JCQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQkvLyBpZiAoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PQotCQkJCS8vIElDU1NNb2RlbC5FTUJFRERFRCkgeyAvLyBjYXNlIFNUWUxFIHRhZwotCQkJCS8vIGFkYXB0ZXIgPSAoTW9kZWxQcm92aWRlQWRhcHRlcikKLQkJCQkvLyAoKElOb2RlTm90aWZpZXIpZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0T3duZXJET01Ob2RlKCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkJLy8gfQotCi0JCQkJLy8gbG9hZCBtb2RlbCBmcm9tIElNb2RlbE1hbmFnZXIKLQkJCQlVUkxNb2RlbFByb3ZpZGVyQ1NTIHByb3ZpZGVyID0gbmV3IFVSTE1vZGVsUHJvdmlkZXJDU1MoKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gcHJvdmlkZXIuZ2V0TW9kZWxGb3JSZWFkKGJhc2VNb2RlbCwgZ2V0SHJlZigpKTsKLQkJCQlmRGlydHkgPSBmYWxzZTsKLQotCQkJCWlmIChuZXdNb2RlbCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpZiAoIShuZXdNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkpIHsKLQkJCQkJbmV3TW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCS8vIG5vdGlmeSBhZGFwdGVyCi0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJYWRhcHRlci5tb2RlbFByb3ZpZGVkKG5ld01vZGVsKTsKLQotCQkJCWZTdHlsZVNoZWV0ID0gKElDU1NTdHlsZVNoZWV0KSAoKElDU1NNb2RlbCkgbmV3TW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJaWYgKGZTdHlsZVNoZWV0ICE9IG51bGwpCi0JCQkJCWZTdHlsZVNoZWV0LmdldE1vZGVsKCkuYWRkU3R5bGVMaXN0ZW5lcihnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlN0eWxlU2hlZXQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gSU1QT1JUX1JVTEU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaFN0eWxlU2hlZXQoKSB7Ci0JCWlmICghZkRpcnR5KSB7Ci0JCQljbG9zZVN0eWxlU2hlZXQoKTsKLQkJCWZEaXJ0eSA9IHRydWU7Ci0JCQlub3RpZnkoSU5vZGVOb3RpZmllci5DSEFOR0UsIGdldEF0dHJpYnV0ZU5vZGUoSFJFRiksIG51bGwsIG51bGwsIGdldFN0YXJ0T2Zmc2V0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZWxlYXNlUnVsZSgpIHsKLQkJaWYgKGZTdHlsZVNoZWV0ICE9IG51bGwpIHsKLQkJCUlDU1NTdHlsZVNoZWV0IHNoZWV0ID0gZlN0eWxlU2hlZXQ7Ci0JCQlmU3R5bGVTaGVldCA9IG51bGw7IC8vIHRvIHByZXZlbnQgbG9vcCwgd2UgbXVzdCByZXNldCBmU3R5bGVTaGVldAotCQkJCQkJCQkvLyBiZWZvcmUgYWxsIGNsb3NpbmcgYWN0aW9uCi0KLQkJCXNoZWV0LmdldE1vZGVsKCkucmVtb3ZlU3R5bGVMaXN0ZW5lcihnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0JCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyBpZiAoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PQotCQkJLy8gSUNTU01vZGVsLkVNQkVEREVEKSB7IC8vIGNhc2UgU1RZTEUgdGFnCi0JCQkvLyBhZGFwdGVyID0gKE1vZGVsUHJvdmlkZUFkYXB0ZXIpCi0JCQkvLyAoKElOb2RlTm90aWZpZXIpZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0T3duZXJET01Ob2RlKCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyB9Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCWFkYXB0ZXIubW9kZWxSZWxlYXNlZChzaGVldC5nZXRNb2RlbCgpKTsKLQotCQkJc2hlZXQuZ2V0TW9kZWwoKS5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBocmVmCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcgaHJlZikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWZEaXJ0eSA9IHRydWU7Ci0JCXNldEF0dHJpYnV0ZShIUkVGLCBDU1NMaW5rQ29udmVydGVyLmFkZEZ1bmMoaHJlZikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTWVkaWFSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNZWRpYVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNzVjODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNZWRpYVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTTWVkaWFSdWxlSW1wbCBleHRlbmRzIENTU1J1bGVJbXBsIGltcGxlbWVudHMgSUNTU01lZGlhUnVsZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NNZWRpYVJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU01lZGlhUnVsZUltcGwoQ1NTTWVkaWFSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIGFwcGVuZFJ1bGUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChydWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSBhcHBlbmRDaGlsZCgoQ1NTTm9kZUltcGwpIHJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU01lZGlhUnVsZUltcGwgY2xvbmVkID0gbmV3IENTU01lZGlhUnVsZUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gZGVsZXRlIGEgcnVsZSBmcm9tIHRoZSBtZWRpYSBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIFRoZSBpbmRleCB3aXRoaW4gdGhlIG1lZGlhIGJsb2NrJ3MgcnVsZSBjb2xsZWN0aW9uIG9mIHRoZQotCSAqICAgICAgICAgICAgcnVsZSB0byByZW1vdmUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggZG9lcyBub3QKLQkgKiAgICAgICAgICAgICAgICBjb3JyZXNwb25kIHRvIGEgcnVsZSBpbiB0aGUgbWVkaWEgcnVsZSBsaXN0LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZWRpYSBydWxlCi0JICogICAgICAgICAgICAgICAgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlUnVsZShpbnQgaW5kZXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlDU1NOb2RlSW1wbCBub2RlID0gZ2V0SW5kZXhlZFJ1bGUoaW5kZXgpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmVtb3ZlQ2hpbGQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQSBsaXN0IG9mIGFsbCBDU1MgcnVsZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgbWVkaWEgYmxvY2suCi0JICovCi0JcHVibGljIENTU1J1bGVMaXN0IGdldENzc1J1bGVzKCkgewotCQlDU1NSdWxlTGlzdEltcGwgbGlzdCA9IG5ldyBDU1NSdWxlTGlzdEltcGwoKTsKLQotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlKQotCQkJCWxpc3QuYXBwZW5kTm9kZShub2RlKTsKLQkJfQotCi0JCXJldHVybiBsaXN0OwotCX0KLQotCUNTU1J1bGVJbXBsIGdldEluZGV4ZWRSdWxlKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IGkgPSAwOwotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlKSB7Ci0JCQkJaWYgKGkrKyA9PSBpbmRleCkKLQkJCQkJcmV0dXJuIChDU1NSdWxlSW1wbCkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBIGxpc3Qgb2YgbWVkaWEgdHlwZXMgZm9yIHRoaXMgcnVsZS4KLQkgKi8KLQlwdWJsaWMgTWVkaWFMaXN0IGdldE1lZGlhKCkgewotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBNZWRpYUxpc3RJbXBsKQotCQkJCXJldHVybiAoTWVkaWFMaXN0KSBub2RlOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIE1FRElBUlVMRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIE1FRElBX1JVTEU7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBpbnNlcnQgYSBuZXcgcnVsZSBpbnRvIHRoZSBtZWRpYSBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgVGhlIHBhcnNhYmxlIHRleHQgcmVwcmVzZW50aW5nIHRoZSBydWxlLiBGb3IgcnVsZSBzZXRzIHRoaXMKLQkgKiAgICAgICAgICAgIGNvbnRhaW5zIGJvdGggdGhlIHNlbGVjdG9yIGFuZCB0aGUgc3R5bGUgZGVjbGFyYXRpb24uIEZvcgotCSAqICAgICAgICAgICAgYXQtcnVsZXMsIHRoaXMgc3BlY2lmaWVzIGJvdGggdGhlIGF0LWlkZW50aWZpZXIgYW5kIHRoZSBydWxlCi0JICogICAgICAgICAgICBjb250ZW50LgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGUgbWVkaWEgYmxvY2sncyBydWxlIGNvbGxlY3Rpb24gb2YgdGhlCi0JICogICAgICAgICAgICBydWxlIGJlZm9yZSB3aGljaCB0byBpbnNlcnQgdGhlIHNwZWNpZmllZCBydWxlLiBJZiB0aGUKLQkgKiAgICAgICAgICAgIHNwZWNpZmllZCBpbmRleCBpcyBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBtZWRpYSBibG9ja3MncwotCSAqICAgICAgICAgICAgcnVsZSBjb2xsZWN0aW9uLCB0aGUgcnVsZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlCi0JICogICAgICAgICAgICBtZWRpYSBibG9jay4KLQkgKiBAcmV0dXJuIFRoZSBpbmRleCB3aXRoaW4gdGhlIG1lZGlhIGJsb2NrJ3MgcnVsZSBjb2xsZWN0aW9uIG9mIHRoZSBuZXdseQotCSAqICAgICAgICAgaW5zZXJ0ZWQgcnVsZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoZSBydWxlIGNhbm5vdCBiZQotCSAqICAgICAgICAgICAgICAgIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGUuZy4sIGlmIGFuCi0JICogICAgICAgICAgICAgICAgPGNvZGU+QGltcG9ydDwvY29kZT4gcnVsZSBpcyBpbnNlcnRlZCBhZnRlciBhIHN0YW5kYXJkIHJ1bGUgc2V0IG9yIG90aGVyCi0JICogICAgICAgICBhdC1ydWxlLiA8YnI+Ci0JICogICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggaXMgbm90IGEgdmFsaWQKLQkgKiAgICAgICAgIGluc2VydGlvbiBwb2ludC4gPGJyPgotCSAqICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZWRpYSBydWxlIGlzCi0JICogICAgICAgICByZWFkb25seS4gPGJyPgotCSAqICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcnVsZSBoYXMgYSBzeW50YXggZXJyb3IgYW5kCi0JICogICAgICAgICBpcyB1bnBhcnNhYmxlLgotCSAqLwotCXB1YmxpYyBpbnQgaW5zZXJ0UnVsZShTdHJpbmcgcnVsZSwgaW50IGluZGV4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaW50IGxlbmd0aCA9IGdldENzc1J1bGVzKCkuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChpbmRleCA8IDAgfHwgbGVuZ3RoIDwgaW5kZXgpCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQotCQlDU1NSdWxlSW1wbCByZWZSdWxlID0gKGxlbmd0aCAhPSBpbmRleCkgPyBnZXRJbmRleGVkUnVsZShpbmRleCkgOiBudWxsOwotCi0JCUNTU1J1bGVJbXBsIG5ld1J1bGUgPSAoQ1NTUnVsZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NSdWxlKHJ1bGUpOwotCi0JCS8vIHByZXZlbnQgZnJvbSBuZXN0aW5nIEBtZWRpYSBydWxlCi0JCWlmIChuZXdSdWxlLmdldFR5cGUoKSA9PSBDU1NSdWxlLk1FRElBX1JVTEUpCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5TWU5UQVhfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCi0JCWluc2VydEJlZm9yZShuZXdSdWxlLCByZWZSdWxlKTsKLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBuZXdSdWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSByZWZSdWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBpbnNlcnRSdWxlQmVmb3JlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG5ld1J1bGUsIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJlZlJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAobmV3UnVsZSA9PSBudWxsICYmIHJlZlJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIGluc2VydEJlZm9yZSgoQ1NTTm9kZUltcGwpIG5ld1J1bGUsIChDU1NOb2RlSW1wbCkgcmVmUnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcmVtb3ZlUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBydWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIHJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgcnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSByZXBsYWNlUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBuZXdSdWxlLCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBvbGRSdWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld1J1bGUgPT0gbnVsbCAmJiBvbGRSdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSByZXBsYWNlQ2hpbGQoKENTU05vZGVJbXBsKSBuZXdSdWxlLCAoQ1NTTm9kZUltcGwpIG9sZFJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5NGEwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsQ3JlYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NNb2RlbENyZWF0aW9uQ29udGV4dCB7Ci0KLQlwcml2YXRlIENTU05vZGVJbXBsIGZSb290Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmVGFyZ2V0Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmTmV4dE5vZGUgPSBudWxsOwotCXByaXZhdGUgaW50IGZSZXBhcnNlU3RhcnQgPSAtMTsKLQlwcml2YXRlIGludCBmUmVwYXJzZUVuZCA9IC0xOwotCi0JLyoqCi0JICogQ1NTTW9kZWxDb250ZXh0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQoQ1NTTm9kZUltcGwgcm9vdE5vZGUpIHsKLQkJc3VwZXIoKTsKLQotCQlmUm9vdE5vZGUgPSByb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNsZWFyKCkgewotCQlmTmV4dE5vZGUgPSBudWxsOwotCQlmVGFyZ2V0Tm9kZSA9IG51bGw7Ci0JCXJlc2V0UmVwYXJzZVJhbmdlKCk7Ci0JfQotCi0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTTm9kZUltcGwgZ2V0TmV4dE5vZGUoKSB7Ci0JCXJldHVybiBmTmV4dE5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldFJlcGFyc2VFbmQoKSB7Ci0JCXJldHVybiBmUmVwYXJzZUVuZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0UmVwYXJzZVN0YXJ0KCkgewotCQlyZXR1cm4gZlJlcGFyc2VTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NOb2RlSW1wbCBnZXRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIGZSb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBDU1NOb2RlSW1wbCBnZXRUYXJnZXROb2RlKCkgewotCQlyZXR1cm4gZlRhcmdldE5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBpc1RvUmVwYXJzZSgpIHsKLQkJcmV0dXJuICgwIDw9IGdldFJlcGFyc2VTdGFydCgpICYmIDAgPD0gZ2V0UmVwYXJzZUVuZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlc2V0UmVwYXJzZVJhbmdlKCkgewotCQlmUmVwYXJzZVN0YXJ0ID0gZlJlcGFyc2VFbmQgPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldExhc3QoKSB7Ci0JCWZOZXh0Tm9kZSA9IG51bGw7Ci0KLQkJaWYgKCEoZlJvb3ROb2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJZlRhcmdldE5vZGUgPSBmUm9vdE5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZlJvb3ROb2RlKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlDU1NOb2RlSW1wbCBub2RlID0gZlJvb3ROb2RlOwotCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCUlDU1NOb2RlIGxhc3RDaGlsZCA9IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQkJaWYgKGxhc3RDaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciAmJiAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbGFzdENoaWxkKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQlub2RlID0gKENTU05vZGVJbXBsKSBsYXN0Q2hpbGQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlmVGFyZ2V0Tm9kZSA9IG5vZGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldE5leHROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJZk5leHROb2RlID0gKENTU05vZGVJbXBsKSBub2RlOwotCQlpZiAoZk5leHROb2RlICE9IG51bGwpIHsKLQkJCWZUYXJnZXROb2RlID0gKENTU05vZGVJbXBsKSBmTmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRSZXBhcnNlRW5kKGludCBlbmQpIHsKLQkJZlJlcGFyc2VFbmQgPSBlbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRSZXBhcnNlU3RhcnQoaW50IHN0YXJ0KSB7Ci0JCWZSZXBhcnNlU3RhcnQgPSBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFRhcmdldE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlmVGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkgbm9kZTsKLQkJaWYgKGZOZXh0Tm9kZSAhPSBudWxsICYmIGZOZXh0Tm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gZlRhcmdldE5vZGUpIHsKLQkJCWZOZXh0Tm9kZSA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsRGVsZXRpb25Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsRGVsZXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NThiZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbERlbGV0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsRGVsZXRpb25Db250ZXh0IHsKLQotCXByaXZhdGUgaW50IGZPbGRTdGFydCA9IC0xOwotCXByaXZhdGUgaW50IGZPbGRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGZOZXdTdGFydCA9IC0xOwotCXByaXZhdGUgaW50IGZOZXdMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGZMZW5ndGhEaWZmZXJlbmNlID0gMDsKLQkvLyBwcml2YXRlIElDU1NOb2RlIGZSb290Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlJlbW92ZWRSYW5nZUJlZ2luID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlJlbW92ZWRSYW5nZUVuZCA9IC0xOwotCXByaXZhdGUgQ1NTTm9kZUxpc3RJbXBsIGZOb2Rlc1RvQmVSZW1vdmVkID0gbmV3IENTU05vZGVMaXN0SW1wbCgpOwotCXByaXZhdGUgU2V0IGZPbGRSZWdpb25zTGlzdDsKLQotCS8qKgotCSAqIENTU01vZGVsRGVsZXRpb25Db250ZXh0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQoSUNTU05vZGUgcm9vdE5vZGUpIHsKLQkJc3VwZXIoKTsKLQotCQkvLyBmUm9vdE5vZGUgPSByb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGFkZE5vZGVUb0JlUmVtb3ZlZChJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuTm9kZXMgPSBmTm9kZXNUb0JlUmVtb3ZlZC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuTm9kZXM7IGkrKykgewotCQkJSUNTU05vZGUgcGFyZW50ID0gZk5vZGVzVG9CZVJlbW92ZWQuaXRlbShpKTsKLQkJCWlmIChDU1NNb2RlbFV0aWwuaXNQYXJlbnRPZihwYXJlbnQsIG5vZGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWZOb2Rlc1RvQmVSZW1vdmVkLmFwcGVuZE5vZGUobm9kZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZXhwYW5kUmVtb3ZlZFJhbmdlQmVnaW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBuZXdCZWdpbiA9IGZsYXROb2RlLmdldFN0YXJ0KCk7IC8vIGZPbGRTdGFydCA9PSBmTmV3U3RhcnQsIHJpZ2h0Pz8KLQkJaWYgKGZSZW1vdmVkUmFuZ2VCZWdpbiA8IDAgfHwgbmV3QmVnaW4gPCBmUmVtb3ZlZFJhbmdlQmVnaW4pIHsKLQkJCWZSZW1vdmVkUmFuZ2VCZWdpbiA9IG5ld0JlZ2luOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBleHBhbmRSZW1vdmVkUmFuZ2VFbmQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBuZXdFbmQgPSBmbGF0Tm9kZS5nZXRFbmQoKSArICgoaXNPbGROb2RlKGZsYXROb2RlKSkgPyBmTGVuZ3RoRGlmZmVyZW5jZSA6IDApOwotCQlpZiAoZlJlbW92ZWRSYW5nZUVuZCA8IDAgfHwgZlJlbW92ZWRSYW5nZUVuZCA8IG5ld0VuZCkgewotCQkJZlJlbW92ZWRSYW5nZUVuZCA9IG5ld0VuZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGZpbmRDb250YWluZXIoQ1NTTm9kZUltcGwgcGFyZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCS8vIEFtIGkgYSBjb250YWluZXIgb2YgZmxhdE5vZGU/Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaW50IGZpcnN0U3RhcnQgPSBnZXRPcmlnaW5hbE9mZnNldChmaXJzdE5vZGUpOwotCQkJaW50IGxhc3RTdGFydCA9IGdldE9yaWdpbmFsT2Zmc2V0KGxhc3ROb2RlKTsKLQkJCWludCBzdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0KLQkJCWlmIChmaXJzdFN0YXJ0IDw9IHN0YXJ0ICYmIHN0YXJ0IDw9IGxhc3RTdGFydCkgewotCQkJCS8vIEkgYW0gYSBjb250YWluZXIsIGlzIG15IGNoaWxkIGEgY29udGFpbmVyID8KLQkJCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkgewotCQkJCQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IGZpbmRDb250YWluZXIoKENTU05vZGVJbXBsKSBub2RlLCBmbGF0Tm9kZSk7Ci0JCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gY29udGFpbmVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgZmluZERlbGV0aW9uVGFyZ2V0KENTU05vZGVJbXBsIHBhcmVudCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgdGFyZ2V0ID0gZmluZENvbnRhaW5lcihwYXJlbnQsIGZsYXROb2RlKTsKLQkJaWYgKHRhcmdldCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnQoZmxhdE5vZGUudG9TdHJpbmcoKSArICI6ICIpOwotCi0JCS8vIGNoaWxkIGEoPT09PT0pYig9PT09PSljCi0JCS8vIHBhcmVudCAoPT09PT09PT09PT09PT09PSkgYSxjIGNhbiByZW1vdmUgcGFyZW50LCBidXQgYiBjYW5ub3QuCi0KLQkJSUNTU05vZGUgY2hpbGQ7Ci0KLQkJZm9yIChjaGlsZCA9IHRhcmdldC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGwgJiYgIShjaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcik7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJLy8ganVzdCBhZHZhbmNpbmcKLQkJfQotCi0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInRhcmdldCBoYXMgbm8gY2hpbGRyZW4uIik7IC8vIFRFU1RCWUNPWlkKLQkJCXJldHVybiB0YXJnZXQ7IC8vIGhhcyBubyBjaGlsZCBjb250YWluZXJzLgotCQl9Ci0JCWVsc2UgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgY2hpbGQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0U3RhcnQoKSA8IGdldE9yaWdpbmFsT2Zmc2V0KGZpcnN0Tm9kZSkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImZsYXROb2RlIGlzIGluIGZyb250IG9mIGZpcnN0IGNoaWxkIik7Ci0JCQkJLy8gLy8gVEVTVEJZQ09aWQotCQkJCXJldHVybiB0YXJnZXQ7IC8vIGEKLQkJCX0KLQkJfQotCi0JCWZvciAoY2hpbGQgPSB0YXJnZXQuZ2V0TGFzdENoaWxkKCk7IGNoaWxkICE9IG51bGwgJiYgIShjaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcik7IGNoaWxkID0gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkpIHsKLQkJCS8vIGp1c3QgYWR2YW5jaW5nCi0JCX0KLQotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ0YXJnZXQgaGFzIG5vIGNoaWxkcmVuLiIpOyAvLyBURVNUQllDT1pZCi0JCQlyZXR1cm4gdGFyZ2V0OyAvLyBoYXMgbm8gY2hpbGQgY29udGFpbmVycy4KLQkJfQotCQllbHNlIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGNoaWxkKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGdldE9yaWdpbmFsT2Zmc2V0KGZpcnN0Tm9kZSkgPCBmbGF0Tm9kZS5nZXRTdGFydCgpKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJmbGF0Tm9kZSBpcyBpbiBhZnRlciBvZiBsYXN0IGNoaWxkIik7Ci0JCQkJLy8gLy8gVEVTVEJZQ09aWQotCQkJCXJldHVybiB0YXJnZXQ7IC8vIGMKLQkJCX0KLQkJfQotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZmxhdE5vZGUgaW5uZXIgb2YgY2hpbGRyZW4iKTsgLy8gVEVTVEJZQ09aWQotCQlyZXR1cm4gbnVsbDsgLy8gYgotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yIGdldE5vZGVzVG9CZVJlbW92ZWQoKSB7Ci0JCUNvbGxlY3Rpb24gbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBuTm9kZXMgPSBmTm9kZXNUb0JlUmVtb3ZlZC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuTm9kZXM7IGkrKykgewotCQkJbm9kZXMuYWRkKGZOb2Rlc1RvQmVSZW1vdmVkLml0ZW0oaSkpOwotCQl9Ci0JCXJldHVybiBub2Rlcy5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgaW50IGdldE9yaWdpbmFsT2Zmc2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJaWYgKDAgPD0gZkxlbmd0aERpZmZlcmVuY2UpIHsKLQkJCQlpZiAoZk5ld1N0YXJ0ICsgZk5ld0xlbmd0aCA8IG9mZnNldCkgewotCQkJCQlvZmZzZXQgLT0gZkxlbmd0aERpZmZlcmVuY2U7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGZPbGRTdGFydCArIGZPbGRMZW5ndGggPD0gb2Zmc2V0IHx8IChmTmV3U3RhcnQgPCAwICYmIGZPbGRTdGFydCA8PSBvZmZzZXQgJiYgIWlzT2xkTm9kZShmbGF0Tm9kZSkpIHx8ICgwIDw9IGZOZXdTdGFydCAmJiBmTmV3U3RhcnQgKyBmTmV3TGVuZ3RoIDw9IG9mZnNldCAmJiAhaXNPbGROb2RlKGZsYXROb2RlKSkpIHsKLQkJCQkJb2Zmc2V0IC09IGZMZW5ndGhEaWZmZXJlbmNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBvZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldFJlbW92ZWRSYW5nZUJlZ2luKCkgewotCQlyZXR1cm4gZlJlbW92ZWRSYW5nZUJlZ2luOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRSZW1vdmVkUmFuZ2VFbmQoKSB7Ci0JCXJldHVybiBmUmVtb3ZlZFJhbmdlRW5kOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc09sZE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlyZXR1cm4gZk9sZFJlZ2lvbnNMaXN0LmNvbnRhaW5zKGZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldHVwQ29udGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQlmT2xkTGVuZ3RoID0gQ1NTVXRpbC5nZXRUZXh0TGVuZ3RoKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsICYmIDAgPCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpICYmIChmbGF0Tm9kZSA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSkgIT0gbnVsbCkgewotCQkJZk9sZFN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCWZPbGRTdGFydCA9IC0xOwotCQl9Ci0JCWZOZXdMZW5ndGggPSBDU1NVdGlsLmdldFRleHRMZW5ndGgobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgMCA8IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkgJiYgKGZsYXROb2RlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApKSAhPSBudWxsKSB7Ci0JCQlmTmV3U3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJZlJlbW92ZWRSYW5nZUJlZ2luID0gZk5ld1N0YXJ0OwotCQkJZlJlbW92ZWRSYW5nZUVuZCA9IGZOZXdTdGFydCArIGZOZXdMZW5ndGg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTmV3U3RhcnQgPSAtMTsKLQkJCWZSZW1vdmVkUmFuZ2VCZWdpbiA9IGZSZW1vdmVkUmFuZ2VFbmQgPSAtMTsKLQkJfQotCQlmTGVuZ3RoRGlmZmVyZW5jZSA9IGZOZXdMZW5ndGggLSBmT2xkTGVuZ3RoOwotCi0JCWZPbGRSZWdpb25zTGlzdCA9IG5ldyBIYXNoU2V0KCk7IAotCQlmaW5hbCBFbnVtZXJhdGlvbiBlbGVtZW50cyA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZWxlbWVudHMoKTsKLQkJd2hpbGUgKGVsZW1lbnRzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlmT2xkUmVnaW9uc0xpc3QuYWRkKGVsZW1lbnRzLm5leHRFbGVtZW50KCkpOwotCQl9Ci0JCS8vIGNsZWFudXAgbm9kZXMKLQkJd2hpbGUgKDAgPCBmTm9kZXNUb0JlUmVtb3ZlZC5nZXRMZW5ndGgoKSkgewotCQkJZk5vZGVzVG9CZVJlbW92ZWQucmVtb3ZlTm9kZSgwKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGU3YjVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnRpbXBsLkNTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50aW1wbC5DU1NTdHlsZU5vdGlmeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuSW1wb3J0UnVsZUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5JbXBvcnRlZENvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5TZWxlY3RvcnNDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ1NTTW9kZWxJbXBsIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwgaW1wbGVtZW50cyBJQ1NTTW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIENTU0RvY3VtZW50SW1wbCBkb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBvcmcudzNjLmRvbS5Ob2RlIG93bmVyTm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NTdHlsZU5vdGlmeUFkYXB0ZXIgc3R5bGVOb3RpZmllciA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbFBhcnNlciBmUGFyc2VyID0gbnVsbDsKLQlwcml2YXRlIENTU01vZGVsVXBkYXRlciBmVXBkYXRlciA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSURfTk9OX0VYVEVSTkFMX0NTUyA9ICIqKl9OT05fRVhURVJOQUxfQ1NTXyoqKiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ1NTTW9kZWxJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JcHVibGljIENTU01vZGVsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5ldmVudC5DU1NTdHlsZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXRTdHlsZU5vdGlmaWVyKCkuYWRkU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0Jdm9pZCBhdHRyUmVwbGFjZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbmV3QXR0ciwgQ1NTTm9kZUltcGwgb2xkQXR0cikgewotCQlpZiAoIWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUpIHsKLQkJCUNTU01vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0VXBkYXRlcigpOwotCQkJdXBkYXRlci5hdHRyUmVwbGFjZWQocGFyZW50Tm9kZSwgbmV3QXR0ciwgb2xkQXR0cik7Ci0JCX0KLQotCQlJQ1NTU2VsZWN0b3IgcmVtb3ZlZFtdID0gbnVsbCwgYWRkZWRbXSA9IG51bGw7Ci0JCWlmIChvbGRBdHRyICE9IG51bGwgJiYgb2xkQXR0ci5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSAmJiAoKENTU0F0dHJJbXBsKSBvbGRBdHRyKS5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZVJ1bGUuU0VMRUNUT1IpKSB7Ci0JCQlDU1NBdHRySW1wbCBhdHRyID0gKENTU0F0dHJJbXBsKSBvbGRBdHRyOwotCQkJLy8gY29sbGVjdCBjaGFuZ2VkIHNlbGVjdG9yCi0JCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChhdHRyLmdldFZhbHVlKCkpOwotCQkJcmVtb3ZlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQlyZW1vdmVkW2ldID0gbGlzdC5nZXRTZWxlY3RvcihpKTsKLQkJfQotCQlpZiAobmV3QXR0ciAhPSBudWxsICYmIG5ld0F0dHIuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgbmV3QXR0cikuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SKSkgewotCQkJQ1NTQXR0ckltcGwgYXR0ciA9IChDU1NBdHRySW1wbCkgbmV3QXR0cjsKLQkJCS8vIGNvbGxlY3QgY2hhbmdlZCBzZWxlY3RvcgotCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCWFkZGVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotCQkJCWFkZGVkW2ldID0gbGlzdC5nZXRTZWxlY3RvcihpKTsKLQkJfQotCQlpZiAocmVtb3ZlZCAhPSBudWxsIHx8IGFkZGVkICE9IG51bGwgfHwgZ2V0RG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkgewotCQkJZ2V0U3R5bGVOb3RpZmllcigpLmZpcmUocmVtb3ZlZCwgYWRkZWQsIG51bGwpOwotCQl9Ci0JCS8vIGZvciBocmVmIGF0dHJpYnV0ZQotCQlpZiAoZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsICYmIGdldFN0eWxlTGlzdGVuZXJzKCkuc2l6ZSgpID4gMCkgewotCQkJYm9vbGVhbiB1cGRhdGUgPSBmYWxzZTsKLQkJCWlmIChvbGRBdHRyICE9IG51bGwgJiYgb2xkQXR0ci5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSAmJiAoKENTU0F0dHJJbXBsKSBvbGRBdHRyKS5nZXROYW1lKCkuZXF1YWxzKElDU1NJbXBvcnRSdWxlLkhSRUYpKSB7Ci0JCQkJdXBkYXRlID0gdHJ1ZTsKLQkJCX0KLQkJCWlmIChuZXdBdHRyICE9IG51bGwgJiYgbmV3QXR0ci5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSAmJiAoKENTU0F0dHJJbXBsKSBuZXdBdHRyKS5nZXROYW1lKCkuZXF1YWxzKElDU1NJbXBvcnRSdWxlLkhSRUYpKSB7Ci0JCQkJdXBkYXRlID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICh1cGRhdGUpCi0JCQkJKChJQ1NTSW1wb3J0UnVsZSkgcGFyZW50Tm9kZSkuZ2V0U3R5bGVTaGVldCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJZ2V0U3R5bGVOb3RpZmllcigpLmJlZ2luUmVjb3JkaW5nKCk7Ci0KLQkJTm9kZSBub2RlID0gZ2V0T3duZXJET01Ob2RlKCk7Ci0JCWlmIChub2RlICE9IG51bGwgJiYgbm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgZGVzY3JpcHRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5iZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0Jdm9pZCBjaGlsZFJlcGxhY2VkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5ld0NoaWxkLCBDU1NOb2RlSW1wbCBvbGRDaGlsZCkgewotCQlpZiAoIWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUpIHsKLQkJCUNTU01vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0VXBkYXRlcigpOwotCQkJdXBkYXRlci5jaGlsZFJlcGxhY2VkKHBhcmVudE5vZGUsIG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JCX0KLQotCQkvLyBhbHdheXMgY2hlY2sgYW5kIHNlbmQgc2VsZWN0b3IgZXZlbnQKLQkJSUNTU1NlbGVjdG9yIHJlbW92ZWRbXSA9IG51bGwsIGFkZGVkW10gPSBudWxsOwotCQlpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSB8fCBwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFSVUxFX05PREUpIHsKLQkJCS8vIGNvbGxlY3Qgb2xkIHNlbGVjdG9ycwotCQkJU2VsZWN0b3JzQ29sbGVjdG9yIHNlbFRyYXYgPSBuZXcgU2VsZWN0b3JzQ29sbGVjdG9yKCk7Ci0JCQlzZWxUcmF2LmFwcGx5KG9sZENoaWxkKTsKLQkJCWludCBuU2VsID0gc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5zaXplKCk7Ci0JCQlpZiAoblNlbCA+IDApIHsKLQkJCQlyZW1vdmVkID0gbmV3IElDU1NTZWxlY3RvcltuU2VsXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5TZWw7IGkrKykKLQkJCQkJcmVtb3ZlZFtpXSA9IChJQ1NTU2VsZWN0b3IpIHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuZ2V0KGkpOwotCQkJfQotCQkJLy8gY29sbGVjdCBuZXcgc2VsZWN0b3JzCi0JCQlzZWxUcmF2ID0gbmV3IFNlbGVjdG9yc0NvbGxlY3RvcigpOwotCQkJc2VsVHJhdi5hcHBseShuZXdDaGlsZCk7Ci0JCQluU2VsID0gc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5zaXplKCk7Ci0JCQlpZiAoblNlbCA+IDApIHsKLQkJCQlhZGRlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbblNlbF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsOyBpKyspCi0JCQkJCWFkZGVkW2ldID0gKElDU1NTZWxlY3Rvcikgc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5nZXQoaSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBtb2RpZmljYXRpb24KLQkJCUlDU1NOb2RlIHJ1bGUgPSBwYXJlbnROb2RlOwotCQkJd2hpbGUgKHJ1bGUgIT0gbnVsbCkgewotCQkJCWlmIChydWxlIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkKLQkJCQkJYnJlYWs7Ci0JCQkJcnVsZSA9IHJ1bGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJaWYgKHJ1bGUgIT0gbnVsbCkgewotCQkJCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9ICgoSUNTU1N0eWxlUnVsZSkgcnVsZSkuZ2V0U2VsZWN0b3JzKCk7Ci0JCQkJYWRkZWQgPSBuZXcgSUNTU1NlbGVjdG9yW2xpc3QuZ2V0TGVuZ3RoKCldOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotCQkJCQlhZGRlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlbW92ZWQgIT0gbnVsbCB8fCBhZGRlZCAhPSBudWxsIHx8IGdldERvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpIHsKLQkJCS8vIHNlbmQgc2VsZWN0b3IgY2hhbmdlZCBldmVudAotCQkJZ2V0U3R5bGVOb3RpZmllcigpLmZpcmUocmVtb3ZlZCwgYWRkZWQsIG51bGwpOwotCQl9Ci0JCS8vIGNsb3NlIHJlbW92ZWQgaW1wb3J0LXJ1bGUncyBleHRlcm5hbCBzdHlsZSBzaGVldHMKLQkJewotCQkJSW1wb3J0UnVsZUNvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydFJ1bGVDb2xsZWN0b3IoKTsKLQkJCXRyYXYuYXBwbHkob2xkQ2hpbGQpOwotCQkJSXRlcmF0b3IgaXQgPSB0cmF2LmdldFJ1bGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkoKENTU0ltcG9ydFJ1bGVJbXBsKSBpdC5uZXh0KCkpLmNsb3NlU3R5bGVTaGVldCgpOwotCQkJfQotCQl9Ci0JCS8vIHNlbmQgZXZlbnRzIHRvIGxpc3RlbmVyIGZvciBuZXcgaW1wb3J0LXJ1bGVzCi0JCWlmIChnZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwgJiYgZ2V0U3R5bGVMaXN0ZW5lcnMoKS5zaXplKCkgPiAwKSB7Ci0JCQlJbXBvcnRlZENvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydGVkQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LmFwcGx5KG5ld0NoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjbG9zZUltcG9ydGVkKCkgewotCQlpZiAoIWlzU2hhcmVkKCkpIHsKLQkJCS8vIHJlbGVhc2UgbGlzdGVuZXJzCi0JCQlpZiAoZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsKSB7Ci0JCQkJVmVjdG9yIHRvUmVtb3ZlID0gbmV3IFZlY3RvcihnZXRTdHlsZUxpc3RlbmVycygpKTsKLQkJCQlJdGVyYXRvciBpdCA9IHRvUmVtb3ZlLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlyZW1vdmVTdHlsZUxpc3RlbmVyKChJQ1NTU3R5bGVMaXN0ZW5lcikgaXQubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjbG9zZSBpbXBvcnQgcnVsZXMKLQkJCUltcG9ydFJ1bGVDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRSdWxlQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LmFwcGx5KGdldERvY3VtZW50KCkpOwotCQkJSXRlcmF0b3IgaXQyID0gdHJhdi5nZXRSdWxlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQyLmhhc05leHQoKSkgewotCQkJCSgoQ1NTSW1wb3J0UnVsZUltcGwpIGl0Mi5uZXh0KCkpLnJlbGVhc2VSdWxlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENTU0RvY3VtZW50SW1wbCBjcmVhdGVEb2N1bWVudCgpIHsKLQkJQ1NTRG9jdW1lbnRJbXBsIGRvYyA9IG51bGw7Ci0JCWludCBwYXJzZXJNb2RlID0gQ1NTU291cmNlUGFyc2VyLk1PREVfU1RZTEVTSEVFVDsKLQkJaWYgKG93bmVyTm9kZSA9PSBudWxsKSB7Ci0JCQkvLyB0aGlzIGNhc2UgaXMgZXh0ZXJuYWwgQ1NTIGZpbGUKLQkJCWRvYyA9IChDU1NTdHlsZVNoZWV0SW1wbCkgRE9NQ1NTSW1wbC5jcmVhdGVDU1NTdHlsZVNoZWV0KG51bGwsIG51bGwpOyAvLyBwYXJhbWV0ZXJzCi0JCQkvLyBhcmUKLQkJCS8vIGZvcgotCQkJLy8gU1RZTEUtdGFnCi0JCQlwYXJzZXJNb2RlID0gQ1NTU291cmNlUGFyc2VyLk1PREVfU1RZTEVTSEVFVDsKLQkJfQotCQllbHNlIGlmIChvd25lck5vZGUgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5FbGVtZW50ICYmICgoRWxlbWVudCkgb3duZXJOb2RlKS5nZXRUYWdOYW1lKCkudG9VcHBlckNhc2UoKS5lcXVhbHMoIlNUWUxFIikpIHsvLyROT04tTkxTLTEkCi0JCQkvLyB0aGlzIGNhc2UgaXMgU1RZTEUtdGFnCi0JCQlFbGVtZW50IHN0eWxlID0gKEVsZW1lbnQpIG93bmVyTm9kZTsKLQkJCWRvYyA9IChDU1NTdHlsZVNoZWV0SW1wbCkgRE9NQ1NTSW1wbC5jcmVhdGVDU1NTdHlsZVNoZWV0KHN0eWxlLmdldEF0dHJpYnV0ZSgiVElUTEUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJc3R5bGUuZ2V0QXR0cmlidXRlKCJNRURJQSIpKTsvLyROT04tTkxTLTEkCi0JCQlwYXJzZXJNb2RlID0gQ1NTU291cmNlUGFyc2VyLk1PREVfU1RZTEVTSEVFVDsKLQkJfQotCQllbHNlIGlmIChvd25lck5vZGUgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5FbGVtZW50IHx8IG93bmVyTm9kZSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLkF0dHIpIHsKLQkJCS8vIElubGluZSBhdHRyaWJ1dGVzCi0JCQlkb2MgPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIERPTUNTU0ltcGwuY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotCQkJcGFyc2VyTW9kZSA9IENTU1NvdXJjZVBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OOwotCQl9Ci0JCVJlZ2lvblBhcnNlciByZWdpb25QYXJzZXIgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRQYXJzZXIoKTsKLQkJaWYgKHJlZ2lvblBhcnNlciBpbnN0YW5jZW9mIENTU1NvdXJjZVBhcnNlcikgewotCQkJKChDU1NTb3VyY2VQYXJzZXIpIHJlZ2lvblBhcnNlcikuc2V0UGFyc2VyTW9kZShwYXJzZXJNb2RlKTsKLQkJfQotCQlyZXR1cm4gZG9jOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCU5vZGUgbm9kZSA9IGdldE93bmVyRE9NTm9kZSgpOwotCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLmVuZFJlY29yZGluZyhyZXF1ZXN0ZXIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5lbmRSZWNvcmRpbmcocmVxdWVzdGVyKTsKLQotCQlnZXRTdHlsZU5vdGlmaWVyKCkuZW5kUmVjb3JkaW5nKCk7Ci0JfQotCi0JcHVibGljIElDU1NEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCXRoaXMuZG9jdW1lbnQgPSBjcmVhdGVEb2N1bWVudCgpOwotCQkJdGhpcy5kb2N1bWVudC5zZXRNb2RlbCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5kb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQkJc3RydWN0dXJlZERvY3VtZW50ID0gc3VwZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkKLQkJCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQkJLy8gdGhlIGZpcnN0IHRpbWUKLQkJQXNzZXJ0LmlzTm90TnVsbChnZXRNb2RlbEhhbmRsZXIoKSk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBnZXRNb2RlbEhhbmRsZXIoKS5nZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCXNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIGdldE5vZGUgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEluZGV4ZWRSZWdpb24gZ2V0SW5kZXhlZFJlZ2lvbihpbnQgb2Zmc2V0KSB7Ci0JCWlmIChnZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBnZXREb2N1bWVudCgpKS5nZXRDb250YWluZXJOb2RlKG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0T3duZXJET01Ob2RlKCkgewotCQlyZXR1cm4gb3duZXJOb2RlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvd25lck5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgaWYgdGhlIGNhc2Ugb2YgZXh0ZXJuYWwgQ1NTIG1vZGVsLCB5b3UKLQkgKiAgICAgICAgICAgIHNob3VsZCBzZXQgbnVsbCwgZWxzZSBpZiBpbnRlcm5hbCBjc3MsIHlvdSBzaG91bGQgc2V0Ci0JICogICAgICAgICAgICBTVFlMRS10YWcgbm9kZSwgZWxzZSBpZiBpbmxpbmUgY3NzLCB5b3Ugc2hvdWxkIHNldCB0aGUKLQkgKiAgICAgICAgICAgIGVsZW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2Ygc3R5bGUtYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE93bmVyRE9NTm9kZShOb2RlIG5vZGUpIHsKLQkJLy8gcHJvaGliaXQgb3duZXIgY2hhbmdlCi0JCUFzc2VydC5pc1RydWUob3duZXJOb2RlID09IG51bGwpOwotCQlvd25lck5vZGUgPSBub2RlOwotCQlpZiAob3duZXJOb2RlICE9IG51bGwpIHsgLy8gZm9yIGludGVybmFsL2lubGluZSBDU1MgY29udGV4dAotCQkJdHJ5IHsKLQkJCQlzZXRJZChJRF9OT05fRVhURVJOQUxfQ1NTKTsKLQkJCX0KLQkJCWNhdGNoIChSZXNvdXJjZUluVXNlIGUpIHsKLQkJCQkvLyBpbXBvc3NpYmxlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBDU1NNb2RlbFBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChmUGFyc2VyID09IG51bGwpIHsKLQkJCWlmIChnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCQlmUGFyc2VyID0gbmV3IENTU01vZGVsUGFyc2VyKGRvY3VtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U3R5bGVMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBnZXRTdHlsZU5vdGlmaWVyKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRTdHlsZVNoZWV0VHlwZSgpIHsKLQkJaWYgKGdldERvY3VtZW50KCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbikKLQkJCXJldHVybiBJTkxJTkU7Ci0JCWlmIChnZXRPd25lckRPTU5vZGUoKSAhPSBudWxsKQotCQkJcmV0dXJuIEVNQkVEREVEOwotCQllbHNlCi0JCQlyZXR1cm4gRVhURVJOQUw7Ci0JfQotCi0JcHJpdmF0ZSBDU1NTdHlsZU5vdGlmeUFkYXB0ZXIgZ2V0U3R5bGVOb3RpZmllcigpIHsKLQkJaWYgKHN0eWxlTm90aWZpZXIgPT0gbnVsbCkgewotCQkJc3R5bGVOb3RpZmllciA9IChvd25lck5vZGUgIT0gbnVsbCkgPyBuZXcgQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlcih0aGlzKSA6IG5ldyBDU1NTdHlsZU5vdGlmeUFkYXB0ZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHN0eWxlTm90aWZpZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NNb2RlbFVwZGF0ZXIgZ2V0VXBkYXRlcigpIHsKLQkJaWYgKGZVcGRhdGVyID09IG51bGwpIHsKLQkJCWZVcGRhdGVyID0gbmV3IENTU01vZGVsVXBkYXRlcih0aGlzKTsKLQkJCWZVcGRhdGVyLnNldFBhcnNlcihnZXRQYXJzZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIGZVcGRhdGVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVjb3JkaW5nKCkgewotCQlyZXR1cm4gZ2V0U3R5bGVOb3RpZmllcigpLmlzUmVjb3JkaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuIChnZXRTdHlsZVNoZWV0VHlwZSgpID09IEVYVEVSTkFMKSAmJiBzdXBlci5pc1NoYXJlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGZvciB0aGUgY2FzZQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpKQotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCk7Ci0JCWlmIChmbGF0Tm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gdHJ1ZTsKLQotCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZ2V0RG9jdW1lbnQoKSkucmVtb3ZlQ2hpbGROb2RlcygpOwotCi0JCUNTU01vZGVsUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQlwYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQlwYXJzZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZmxhdE5vZGVzLCBudWxsKTsKLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogbm9DaGFuZ2UgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkvLyBub3AKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPT0gbnVsbCAmJiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSB0cnVlOwotCi0JCUNTU01vZGVsUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQlwYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuaXNFbnRpcmVEb2N1bWVudFJlcGxhY2VkKCkpCi0JCQlwYXJzZXIucmVwbGFjZURvY3VtZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQllbHNlCi0JCQlwYXJzZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGNsZWFudXAgLT4gcmVidWlsZCBDU1MgTm9kZXMgVGhpcyBpcyBwcmUtYmV0YSBmaXggZm9yIDE3ODE3Ni4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoTm9kZXMoKSB7Ci0JCS8vIGNsZWFudXAgb2xkIG5vZGVzCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSB0cnVlOwotCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZ2V0RG9jdW1lbnQoKSkucmVtb3ZlQ2hpbGROb2RlcygpOwotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gZmFsc2U7Ci0KLQkJZ2V0UGFyc2VyKCkuY2xlYW51cFVwZGF0ZUNvbnRleHQoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlTdHJpbmcgc291cmNlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFRleHQoKTsKLQotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQodGhpcywgMCwgc291cmNlLmxlbmd0aCgpLCBudWxsKTsKLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHRoaXMsIDAsIDAsIHNvdXJjZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IHRydWU7Ci0KLQkJQ1NTTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0JCXBhcnNlci5jaGFuZ2VSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbik7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPbGRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0TmV3UmVnaW9ucygpOwotCQlpZiAob2xkUmVnaW9ucyA9PSBudWxsICYmIG5ld1JlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gdHJ1ZTsKLQotCQlDU1NNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJcGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJcGFyc2VyLnJlcGxhY2VSZWdpb25zKGZsYXROb2RlLCBuZXdSZWdpb25zLCBvbGRSZWdpb25zKTsKLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gZmFsc2U7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbUVkaXQoKSB7Ci0JCWNsb3NlSW1wb3J0ZWQoKTsKLQkJaWYgKGdldFN0eWxlU2hlZXRUeXBlKCkgPT0gRVhURVJOQUwpIHsKLQkJCXN1cGVyLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21SZWFkKCkgewotCQljbG9zZUltcG9ydGVkKCk7Ci0JCWlmIChnZXRTdHlsZVNoZWV0VHlwZSgpID09IEVYVEVSTkFMKSB7Ci0JCQlzdXBlci5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmV2ZW50LkNTU1N0eWxlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHlsZUxpc3RlbmVyKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldFN0eWxlTm90aWZpZXIoKS5yZW1vdmVTdHlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdXBlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlyZXR1cm47IC8vIG5vdGluZyB0byBkbwotCi0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkKLQkJCW9sZFN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLnNldFN0cnVjdHVyZWREb2N1bWVudChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQluZXdNb2RlbChuZXcgTmV3RG9jdW1lbnRFdmVudChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQsIHRoaXMpKTsKLQkJCX0KLQkJCW5ld1N0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3JjTW9kZWwKLQkgKiAgICAgICAgICAgIGNvbS5pbWIuc2VkLmNzcy5tb2RlLmludGVmYWNlcy5JQ1NTTW9kZWwKLQkgKiBAcGFyYW0gcmVtb3ZlZAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU1NlbGVjdG9yW10KLQkgKiBAcGFyYW0gYWRkZWQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NTZWxlY3RvcltdCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVDaGFuZ2VkKElDU1NNb2RlbCBzcmNNb2RlbCwgSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSkgewotCQlnZXRTdHlsZU5vdGlmaWVyKCkuc3R5bGVDaGFuZ2VkKHNyY01vZGVsLCByZW1vdmVkLCBhZGRlZCwgbWVkaWEpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzcmNNb2RlbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU01vZGVsCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVVcGRhdGUoSUNTU01vZGVsIHNyY01vZGVsKSB7Ci0JCWdldFN0eWxlTm90aWZpZXIoKS5zdHlsZVVwZGF0ZShzcmNNb2RlbCk7Ci0JfQotCi0Jdm9pZCB2YWx1ZUNoYW5nZWQoQ1NTTm9kZUltcGwgbm9kZSwgU3RyaW5nIG9sZFZhbHVlKSB7Ci0JCWlmICghZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSkgewotCQkJQ1NTTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRVcGRhdGVyKCk7Ci0JCQl1cGRhdGVyLnZhbHVlQ2hhbmdlZChub2RlLCBvbGRWYWx1ZSk7Ci0JCX0KLQotCQlJQ1NTU2VsZWN0b3IgcmVtb3ZlZFtdID0gbnVsbCwgYWRkZWRbXSA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuQVRUUl9OT0RFICYmICgoQ1NTQXR0ckltcGwpIG5vZGUpLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUikpIHsKLQkJCQlDU1NBdHRySW1wbCBhdHRyID0gKENTU0F0dHJJbXBsKSBub2RlOwotCQkJCS8vIGNvbGxlY3QgY2hhbmdlZCBzZWxlY3RvcgotCQkJCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQkJYWRkZWQgPSBuZXcgSUNTU1NlbGVjdG9yW2xpc3QuZ2V0TGVuZ3RoKCldOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotCQkJCQlhZGRlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0KLQkJCQkvLyBnZXQgb2xkIHZhbHVlCi0JCQkJbGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKG9sZFZhbHVlKTsKLQkJCQlyZW1vdmVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQkJcmVtb3ZlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7Ci0JCQkJSUNTU05vZGUgcnVsZSA9IG5vZGU7Ci0JCQkJd2hpbGUgKHJ1bGUgIT0gbnVsbCkgewotCQkJCQlpZiAocnVsZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpCi0JCQkJCQlicmVhazsKLQkJCQkJcnVsZSA9IHJ1bGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCQlpZiAocnVsZSAhPSBudWxsKSB7Ci0JCQkJCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9ICgoSUNTU1N0eWxlUnVsZSkgcnVsZSkuZ2V0U2VsZWN0b3JzKCk7Ci0JCQkJCWFkZGVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQkJCQlhZGRlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZW1vdmVkICE9IG51bGwgfHwgYWRkZWQgIT0gbnVsbCB8fCBnZXREb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSB7Ci0JCQkvLyBzZW5kIHNlbGVjdG9yIGNoYW5nZWQgZXZlbnQKLQkJCWdldFN0eWxlTm90aWZpZXIoKS5maXJlKHJlbW92ZWQsIGFkZGVkLCBudWxsKTsKLQkJfQotCQkvLyBmb3IgaHJlZiBhdHRyaWJ1dGUKLQkJaWYgKGdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCAmJiBnZXRTdHlsZUxpc3RlbmVycygpLnNpemUoKSA+IDApIHsKLQkJCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSAmJiAoKENTU0F0dHJJbXBsKSBub2RlKS5nZXROYW1lKCkuZXF1YWxzKElDU1NJbXBvcnRSdWxlLkhSRUYpKSB7Ci0JCQkJKChJQ1NTSW1wb3J0UnVsZSkgKChJQ1NTQXR0cikgbm9kZSkuZ2V0T3duZXJDU1NOb2RlKCkpLmdldFN0eWxlU2hlZXQoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxOb2RlRmVlZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsTm9kZUZlZWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmU2NDg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxOb2RlRmVlZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTTW9kZWxOb2RlRmVlZGVyIHsKLQkvKioKLQkgKiBjdXJyZW50bHkgSUNTU0RvY3VtZW50IGlzIHVzZWQgYnV0IG1heSBnbyBiYWNrIHRvIENTU0RvY3VtZW50SW1wbCBpbiBmdXR1cmUuCi0JICovCi0JSUNTU0RvY3VtZW50IGZEb2N1bWVudCA9IG51bGw7Ci0JQ1NTTW9kZWxVcGRhdGVDb250ZXh0IGZVcGRhdGVDb250ZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIENTU01vZGVsTm9kZUZlZWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU01vZGVsTm9kZUZlZWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDU1NNb2RlbE5vZGVGZWVkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBjdXJyZW50bHkgSUNTU0RvY3VtZW50IGlzIHVzZWQgYnV0IG1heSBnbyBiYWNrIHRvIENTU0RvY3VtZW50SW1wbCBpbiBmdXR1cmUuCi0JICovCi0JQ1NTTW9kZWxOb2RlRmVlZGVyKElDU1NEb2N1bWVudCBkb2N1bWVudCwgQ1NTTW9kZWxVcGRhdGVDb250ZXh0IHVwZGF0ZUNvbnRleHQpIHsKLQkJc3VwZXIoKTsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZVcGRhdGVDb250ZXh0ID0gdXBkYXRlQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NDaGFyc2V0UnVsZUltcGwgZ2V0Q1NTQ2hhcnNldFJ1bGUoKSB7Ci0JCUNTU0NoYXJzZXRSdWxlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU0NoYXJzZXRSdWxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU0NoYXJzZXRSdWxlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU0NoYXJzZXRSdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTRm9udEZhY2VSdWxlSW1wbCBnZXRDU1NGb250RmFjZVJ1bGUoKSB7Ci0JCUNTU0ZvbnRGYWNlUnVsZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NGb250RmFjZVJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTRm9udEZhY2VSdWxlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU0ZvbnRGYWNlUnVsZSgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0ltcG9ydFJ1bGVJbXBsIGdldENTU0ltcG9ydFJ1bGUoKSB7Ci0JCUNTU0ltcG9ydFJ1bGVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTSW1wb3J0UnVsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NJbXBvcnRSdWxlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU0ltcG9ydFJ1bGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NNZWRpYVJ1bGVJbXBsIGdldENTU01lZGlhUnVsZSgpIHsKLQkJQ1NTTWVkaWFSdWxlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU01lZGlhUnVsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NNZWRpYVJ1bGVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTTWVkaWFSdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUGFnZVJ1bGVJbXBsIGdldENTU1BhZ2VSdWxlKCkgewotCQlDU1NQYWdlUnVsZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NQYWdlUnVsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NQYWdlUnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NQYWdlUnVsZSgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlUnVsZUltcGwgZ2V0Q1NTU3R5bGVSdWxlKCkgewotCQlDU1NTdHlsZVJ1bGVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTU3R5bGVSdWxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU1N0eWxlUnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NTdHlsZVJ1bGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTk3MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1J1bGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFdhbGtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5Db3JlTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuVGV4dFJlZ2lvbkxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotCi0KLS8qKgotICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLSAqLwotcHVibGljIGNsYXNzIENTU01vZGVsUGFyc2VyIHsKLQotCXByaXZhdGUgSUNTU0RvY3VtZW50IGZEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbENyZWF0aW9uQ29udGV4dCBmQ3JlYXRpb25Db250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIENTU01vZGVsRGVsZXRpb25Db250ZXh0IGZEZWxldGlvbkNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxVcGRhdGVDb250ZXh0IGZVcGRhdGVDb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIENTU01vZGVsTm9kZUZlZWRlciBmRmVlZGVyID0gbnVsbDsKLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudFdhbGtlciBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlBhcnNlRmxvYXRpbmcgPSBmYWxzZTsKLQotCS8qKgotCSAqIENTU01vZGVsUGFyc2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDU1NNb2RlbFBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHJvdmRlZCB0aGlzIG1ldGhvZCBidXQgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUGFyc2VGbG9hdGluZygpewotCQlyZXR1cm4gZlBhcnNlRmxvYXRpbmc7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwcm92ZGVkIHRoaXMgbWV0aG9kIGJ1dCBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIENTU01vZGVsQ3JlYXRpb25Db250ZXh0IGdldENyZWF0aW9uQ29udGV4dCgpewotCQlyZXR1cm4gZkNyZWF0aW9uQ29udGV4dDsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHByb3ZkZWQgdGhpcyBtZXRob2QgYnV0IG1heSBiZSByZW1vdmVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwZGF0ZUNvbnRleHRBY3RpdmUoKXsKLQkJcmV0dXJuIGZVcGRhdGVDb250ZXh0ICE9IG51bGwgPyBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpIDogZmFsc2U7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU01vZGVsUGFyc2VyKElDU1NEb2N1bWVudCBkb2MpIHsKLQkJdGhpcygpOwotCQlmRG9jdW1lbnQgPSBkb2M7Ci0JCWZDcmVhdGlvbkNvbnRleHQgPSBuZXcgQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQoKENTU05vZGVJbXBsKWRvYyk7Ci0JCWZEZWxldGlvbkNvbnRleHQgPSBuZXcgQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQoZG9jKTsKLQkJZlVwZGF0ZUNvbnRleHQgPSBuZXcgQ1NTTW9kZWxVcGRhdGVDb250ZXh0KCk7Ci0JCWZGZWVkZXIgPSBuZXcgQ1NTTW9kZWxOb2RlRmVlZGVyKGRvYywgZlVwZGF0ZUNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3IENvcmVOb2RlTGlzdChmbGF0Tm9kZSwgZmxhdE5vZGUpLCBuZXcgQ29yZU5vZGVMaXN0KGZsYXROb2RlLCBmbGF0Tm9kZSkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgY2hhbmdlUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCB8fCByZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChmRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tOZXh0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBTdHJpbmcgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHQgPSBDU1NVdGlsLmZpbmROZXh0U2lnbmlmaWNhbnROb2RlKGZsYXROb2RlKTsKLQkJaWYgKENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShuZXh0KSA9PSB0eXBlKSB7Ci0JCQlmQ3JlYXRpb25Db250ZXh0LnNldFJlcGFyc2VTdGFydChmbGF0Tm9kZS5nZXRFbmQoKSk7Ci0JCQlmQ3JlYXRpb25Db250ZXh0LnNldFJlcGFyc2VFbmQobmV4dC5nZXRFbmQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW51cERlbGV0aW9uQ29udGV4dCgpIHsKLQkJLy8gc2V0dXBEZWxldGlvbkNvbnRleHQobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBjbGVhbnVwRmlyc3ROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlLCBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgdGFyZ2V0KSB7Ci0JCWlmIChmaXJzdE5vZGUgPT0gbnVsbCB8fCB0YXJnZXQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZpcnN0Tm9kZSA9PSB0YXJnZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuZ2V0TmV4dE5vZGVJbkN1cnJlbnQoZmlyc3ROb2RlKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSB0YXJnZXQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGxhc3ROb2RlID09IG51bGwgfHwgZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5pc09sZE5vZGUobGFzdE5vZGUpIHx8IG5leHROb2RlID09IG51bGwgfHwgbGFzdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8IG5leHROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQl0YXJnZXQuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0YXJnZXQuc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV4dE5vZGUpOwotCQkJfQotCQkJSUNTU05vZGUgcGFyZW50ID0gdGFyZ2V0LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQljbGVhbnVwRmlyc3ROb2RlKGZpcnN0Tm9kZSwgKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGNsZWFudXBMYXN0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlLCBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgdGFyZ2V0KSB7Ci0JCWlmIChsYXN0Tm9kZSA9PSBudWxsIHx8IHRhcmdldCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAobGFzdE5vZGUgPT0gdGFyZ2V0LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuZ2V0UHJldk5vZGVJbkN1cnJlbnQobGFzdE5vZGUpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSB0YXJnZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmaXJzdE5vZGUgPT0gbnVsbCB8fCBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmlzT2xkTm9kZShmaXJzdE5vZGUpIHx8IHByZXZOb2RlID09IG51bGwgfHwgcHJldk5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8IGZpcnN0Tm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJdGFyZ2V0LnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwsIG51bGwpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGFyZ2V0LnNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocHJldk5vZGUpOwotCQkJfQotCQkJSUNTU05vZGUgcGFyZW50ID0gdGFyZ2V0LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQljbGVhbnVwTGFzdE5vZGUobGFzdE5vZGUsIChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGNsZWFudXBVcGRhdGVDb250ZXh0KCkgewotCQlpbnQgcmVtYWlucyA9IGZVcGRhdGVDb250ZXh0LmdldE5vZGVDb3VudCgpOwotCQlmVXBkYXRlQ29udGV4dC5jbGVhbnVwQ29udGV4dCgpOwotCQlyZXR1cm4gcmVtYWluczsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgZmxvYXRpbmcgQ1NTIHJ1bGUgKG93bmVyIGRvY3VtZW50IHdpbGwgYmUgc2V0KSB0aGlzIGlzIGZvcgotCSAqIENTU1N0eWxlU2hlZXQuY3JlYXRlQ1NTUnVsZShTdHJpbmcpCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqLwotCUNTU1J1bGUgY3JlYXRlQ1NTUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMpIHsKLQkJaWYgKGZsYXROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZQYXJzZUZsb2F0aW5nID0gdHJ1ZTsKLQotCQkvLyBzZXR1cCBjcmVhdGlvbiBjb250ZXh0Ci0JCWZDcmVhdGlvbkNvbnRleHQuY2xlYXIoKTsKLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKG51bGwpOwotCQlmQ3JlYXRpb25Db250ZXh0LnNldE5leHROb2RlKG51bGwpOwotCQlDU1NSdWxlSW1wbCBwYXJlbnRSdWxlID0gbnVsbDsKLQotCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBmbGF0Tm9kZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUNTU05vZGVJbXBsIG1vZGlmaWVkID0gaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCWlmIChwYXJlbnRSdWxlID09IG51bGwgJiYgbW9kaWZpZWQgaW5zdGFuY2VvZiBDU1NSdWxlSW1wbCkgewotCQkJCXBhcmVudFJ1bGUgPSAoQ1NTUnVsZUltcGwpIG1vZGlmaWVkOwotCQkJfQotCQl9Ci0KLQkJZlBhcnNlRmxvYXRpbmcgPSBmYWxzZTsKLQotCQlpZiAocGFyZW50UnVsZSAhPSBudWxsKSB7Ci0JCQlDU1NNb2RlbFV0aWwuY2xlYW51cENvbnRhaW5lcihwYXJlbnRSdWxlKTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnRSdWxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kQnJhY2VDbG9zZShpbnQgZGVwdGgsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnQsIGJvb2xlYW4gYkJyZWFrU2libGluZykgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0JCWludCBicmFjZUxldmVsID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gc3RhcnQuZ2V0TmV4dCgpOwotCQlmb3IgKDsgcmVnaW9uICE9IG51bGw7IHJlZ2lvbiA9IHJlZ2lvbi5nZXROZXh0KCkpIHsKLQkJCWludCBvZmZzZXQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlDU1NOb2RlSW1wbCBub2RlID0gZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCQlpbnQgZGVwdGhIaXQgPSAobm9kZSAhPSBudWxsKSA/IENTU01vZGVsVXRpbC5nZXREZXB0aChub2RlKSA6IC0xOwotCQkJaWYgKGRlcHRoIDw9IGRlcHRoSGl0KSB7Ci0JCQkJLy8gc2libGluZyBpcyBmb3VuZCBiZWZvcmUgIn0iCi0JCQkJaWYgKGJCcmVha1NpYmxpbmcpIHsKLQkJCQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gKENTU05vZGVJbXBsKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJd2hpbGUgKGRlcHRoIDw9IENTU01vZGVsVXRpbC5nZXREZXB0aChwYXJlbnQpKSB7Ci0JCQkJCQlub2RlID0gcGFyZW50OwotCQkJCQkJcGFyZW50ID0gKENTU05vZGVJbXBsKSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBub2RlICE9IG51bGwpIHsKLQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gcHJldk5vZGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKHJlZ2lvbik7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJYnJhY2VMZXZlbCsrOwotCQkJfQotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJCWJyYWNlTGV2ZWwtLTsKLQkJCQlpZiAoYnJhY2VMZXZlbCA8IDApIHsKLQkJCQkJcmVzdWx0ID0gcmVnaW9uOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlwcmV2Tm9kZSA9IHJlZ2lvbjsKLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCAmJiByZWdpb24gPT0gbnVsbCkgewotCQkJLy8gcmVhY2ggdGhlIGVuZCBvZiBkb2N1bWVudAotCQkJcmVzdWx0ID0gcHJldk5vZGU7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdChpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgbm9kZUxpc3QgPSBudWxsOwotCQlpZiAoMCA8PSBzdGFydCAmJiBzdGFydCA8PSBlbmQpIHsKLQkJCUlDU1NNb2RlbCBtb2RlbCA9IGZEb2N1bWVudC5nZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgQ1NTTW9kZWxJbXBsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoKENTU01vZGVsSW1wbCkgbW9kZWwpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmQgLSAxKTsKLQkJCQkJaWYgKHN0YXJ0Tm9kZSAhPSBudWxsICYmIGVuZE5vZGUgIT0gbnVsbCkgewotCQkJCQkJbm9kZUxpc3QgPSBuZXcgQ29yZU5vZGVMaXN0KHN0YXJ0Tm9kZSwgZW5kTm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbm9kZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBnZXROb2RlQXQoaW50IG9mZnNldCkgewotCQlDU1NOb2RlSW1wbCByb290Tm9kZSA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJSUNTU05vZGUgdGFyZ2V0ID0gcm9vdE5vZGUuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkgewotCQkJcmV0dXJuIChDU1NOb2RlSW1wbCkgdGFyZ2V0OwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydEJyYWNlQ2xvc2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJSUNTU05vZGUgdGFyZ2V0ID0gQ1NTTW9kZWxVdGlsLmZpbmRCcmFjZUNvbnRhaW5lcihmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKSk7Ci0KLQkJaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgcGFyZW50ID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgdGFyZ2V0OwotCQlpZiAoQ1NTTW9kZWxVdGlsLmlzSW50ZXJydXB0aW9uKHBhcmVudCwgcmVnaW9uKSkgewotCQkJSUNTU05vZGUgbm9kZSA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU05vZGVJbXBsKSB7Ci0JCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRSZXBhcnNlU3RhcnQocGFyZW50LmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0UmVwYXJzZUVuZChwYXJlbnQuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCSgoQ1NTTm9kZUltcGwpIG5vZGUpLnJlbW92ZUNoaWxkKHBhcmVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUGFnZVJ1bGUgfHwgcGFyZW50IGluc3RhbmNlb2YgSUNTU01lZGlhUnVsZSB8fCBwYXJlbnQgaW5zdGFuY2VvZiBDU1NGb250RmFjZVJ1bGUgfHwgcGFyZW50IGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJQ1NTTW9kZWxVdGlsLmV4cGFuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcihwYXJlbnQsIHJlZ2lvbik7Ci0JCQlpZiAoIUNTU01vZGVsVXRpbC5pc0JyYWNlQ2xvc2VkKHRhcmdldCkpIHsKLQkJCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocGFyZW50LmdldFBhcmVudE5vZGUoKSk7Ci0JCQkJZkNyZWF0aW9uQ29udGV4dC5zZXROZXh0Tm9kZShwYXJlbnQuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0JCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0QnJhY2VPcGVuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ga2V5UmVnaW9uID0gQ1NTVXRpbC5maW5kUHJldmlvdXNTaWduaWZpY2FudE5vZGUocmVnaW9uKTsKLQkJaWYgKGtleVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoIWZQYXJzZUZsb2F0aW5nKSB7Ci0JCQlDU1NOb2RlSW1wbCBub2RlID0gZ2V0Tm9kZUF0KGtleVJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWlmIChub2RlICE9IG51bGwgJiYgIShub2RlIGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoa2V5UmVnaW9uKTsKLQotCQlDU1NOb2RlSW1wbCBpbnNlcnRlZCA9IG51bGw7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFKSB7Ci0JCQlpbnNlcnRlZCA9IGluc2VydFBhZ2VSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSkgewotCQkJaW5zZXJ0ZWQgPSBpbnNlcnRNZWRpYVJ1bGUoa2V5UmVnaW9uLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSkgewotCQkJaW5zZXJ0ZWQgPSBpbnNlcnRGb250RmFjZVJ1bGUoa2V5UmVnaW9uLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKENTU1V0aWwuaXNTZWxlY3RvclRleHQoa2V5UmVnaW9uKSkgewotCQkJaW5zZXJ0ZWQgPSBpbnNlcnRTdHlsZVJ1bGUoa2V5UmVnaW9uLCByZWdpb24pOwotCQl9Ci0KLQkJaWYgKGluc2VydGVkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkvLyBDU1NNb2RlbFV0aWwuZXhwYW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpaW5zZXJ0ZWQsCi0JCQkvLyBmbGF0Tm9kZSk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJyYWNlQ2xvc2UgPSBmaW5kQnJhY2VDbG9zZShDU1NNb2RlbFV0aWwuZ2V0RGVwdGgoaW5zZXJ0ZWQpLCByZWdpb24sICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSkpOwotCQkJaWYgKGJyYWNlQ2xvc2UgIT0gbnVsbCkgewotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0UmVwYXJzZVN0YXJ0KHJlZ2lvbi5nZXRFbmQoKSk7Ci0JCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRSZXBhcnNlRW5kKGJyYWNlQ2xvc2UuZ2V0RW5kKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGluc2VydGVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0Q2hhcnNldFJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBiZWdpbkRvY1JlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmREb2NSZWdpb24pIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKGJlZ2luRG9jUmVnaW9uLmdldFJlZ2lvbnMoKSk7Ci0JCXJlZ2lvbnMucmVtb3ZlKDApOyAvLyBtdXN0IGJlICJAY2hhcnNldCIKLQkJSVRleHRSZWdpb24gZW5jb2RpbmdSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoIXJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gcmVnaW9ucy5yZW1vdmUoMCk7Ci0JCQlpZiAodGV4dFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IHRleHRSZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORykgewotCQkJCWVuY29kaW5nUmVnaW9uID0gdGV4dFJlZ2lvbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChlbmNvZGluZ1JlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU0NoYXJzZXRSdWxlSW1wbCBydWxlID0gZkZlZWRlci5nZXRDU1NDaGFyc2V0UnVsZSgpOwotCQlpZiAocnVsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJcnVsZS5zZXRBdHRyaWJ1dGUoSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HLCBiZWdpbkRvY1JlZ2lvbi5nZXRUZXh0KGVuY29kaW5nUmVnaW9uKSk7Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGJlZ2luRG9jUmVnaW9uLCBlbmREb2NSZWdpb24pOwotCQlDU1NBdHRySW1wbCBhdHRyID0gcnVsZS5nZXRBdHRyaWJ1dGVOb2RlKElDU1NDaGFyc2V0UnVsZS5FTkNPRElORyk7Ci0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oYmVnaW5Eb2NSZWdpb24sIGVuY29kaW5nUmVnaW9uLCBlbmNvZGluZ1JlZ2lvbik7Ci0JCX0KLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBDU1NOb2RlSW1wbCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKGZDcmVhdGlvbkNvbnRleHQgPT0gbnVsbCB8fCByZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgdHlwZSA9ICgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHJlZ2lvbikuZ2V0VHlwZSgpOwotCQlDU1NOb2RlSW1wbCBtb2RpZmllZCA9IG51bGw7Ci0KLQkJSUNTU05vZGUgdGFyZ2V0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0KLQkJaWYgKChmUGFyc2VGbG9hdGluZyAmJiB0YXJnZXQgPT0gbnVsbCkgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpIHsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpIHsKLQkJCQltb2RpZmllZCA9IGluc2VydFNlbWlDb2xvbkZvclJ1bGUocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCW1vZGlmaWVkID0gaW5zZXJ0QnJhY2VPcGVuKHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCQltb2RpZmllZCA9IGluc2VydEJyYWNlQ2xvc2UocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFIHx8IENTU1V0aWwuaXNTZWxlY3RvclRleHQocmVnaW9uKSkgewotCQkJCWNoZWNrTmV4dE5vZGUocmVnaW9uLCBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VUKSB7Ci0JCQkJY2hlY2tOZXh0Tm9kZShyZWdpb24sIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCh0YXJnZXQgaW5zdGFuY2VvZiBDU1NSdWxlRGVjbENvbnRhaW5lciB8fCB0YXJnZXQgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uKSAmJiB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSkgewotCQkJbW9kaWZpZWQgPSBpbnNlcnRTdHlsZURlY2xhcmF0aW9uSXRlbShyZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtICYmIHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJbW9kaWZpZWQgPSBpbnNlcnRTZW1pQ29sb25Gb3JTdHlsZURlY2xhcmF0aW9uSXRlbShyZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJbW9kaWZpZWQgPSBpbnNlcnRCcmFjZUNsb3NlKHJlZ2lvbik7Ci0JCX0KLQotCQkvLyBwb3N0IHByb2Nlc3MKLQkJaWYgKG1vZGlmaWVkICE9IG51bGwpIHsKLQkJCWlmIChtb2RpZmllZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBtb2RpZmllZCkucHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCByZWdpb25MaXN0KSB7Ci0JCWZvciAoRW51bWVyYXRpb24gZSA9IHJlZ2lvbkxpc3QuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHJlZ2lvbik7Ci0JCQlpZiAoZkNyZWF0aW9uQ29udGV4dC5pc1RvUmVwYXJzZSgpKSB7Ci0JCQkJaW50IG9yaWdTdGFydCA9IHJlZ2lvbi5nZXRFbmQoKTsKLQkJCQlpbnQgb3JpZ0VuZCA9IHJlZ2lvbkxpc3QuaXRlbShyZWdpb25MaXN0LmdldExlbmd0aCgpIC0gMSkuZ2V0RW5kKCk7Ci0JCQkJaW50IG5ld1N0YXJ0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRSZXBhcnNlU3RhcnQoKTsKLQkJCQlpbnQgbmV3RW5kID0gZkNyZWF0aW9uQ29udGV4dC5nZXRSZXBhcnNlRW5kKCk7Ci0JCQkJaWYgKG5ld1N0YXJ0IDwgb3JpZ1N0YXJ0IHx8IG9yaWdFbmQgPCBuZXdFbmQpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3Tm9kZUxpc3QgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0KG5ld1N0YXJ0LCBuZXdFbmQpOwotCQkJCQlzZXR1cENyZWF0aW9uQ29udGV4dChuZXdOb2RlTGlzdC5pdGVtKDApKTsKLQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXdOb2RlTGlzdCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZDcmVhdGlvbkNvbnRleHQucmVzZXRSZXBhcnNlUmFuZ2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydEZvbnRGYWNlUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBicmFjZU5vZGUpIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTRm9udEZhY2VSdWxlSW1wbCBydWxlID0gZkZlZWRlci5nZXRDU1NGb250RmFjZVJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHJlZ2lvbiwgYnJhY2VOb2RlKTsKLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocnVsZSk7Ci0JCS8vIFRhcmdldE5leHQgaXMgc2V0IHRvIG51bGwgYXV0b21hdGljYWxseQotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0SW1wb3J0UnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJlZ2luRG9jUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZERvY1JlZ2lvbikgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoYmVnaW5Eb2NSZWdpb24uZ2V0UmVnaW9ucygpKTsKLQkJcmVnaW9ucy5yZW1vdmUoMCk7IC8vIG11c3QgYmUgIkBpbXBvcnQiCi0JCUlUZXh0UmVnaW9uIGhyZWZSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoIXJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gcmVnaW9ucy5yZW1vdmUoMCk7Ci0JCQlpZiAodGV4dFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IHRleHRSZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcpIHsKLQkJCQlocmVmUmVnaW9uID0gdGV4dFJlZ2lvbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChocmVmUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTSW1wb3J0UnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTSW1wb3J0UnVsZSgpOwotCQlpZiAocnVsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKHJlZ2lvbnMpOwotCQlNZWRpYUxpc3RJbXBsIG1lZGlhTGlzdCA9IChNZWRpYUxpc3RJbXBsKSBydWxlLmdldE1lZGlhKCk7Ci0JCXNldE1lZGlhTGlzdChtZWRpYUxpc3QsIGJlZ2luRG9jUmVnaW9uLCByZWdpb25zKTsKLQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCXJ1bGUuc2V0QXR0cmlidXRlKElDU1NJbXBvcnRSdWxlLkhSRUYsIGJlZ2luRG9jUmVnaW9uLmdldFRleHQoaHJlZlJlZ2lvbikpOwotCQl9Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihiZWdpbkRvY1JlZ2lvbiwgZW5kRG9jUmVnaW9uKTsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IHJ1bGUuZ2V0QXR0cmlidXRlTm9kZShJQ1NTSW1wb3J0UnVsZS5IUkVGKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihiZWdpbkRvY1JlZ2lvbiwgaHJlZlJlZ2lvbiwgaHJlZlJlZ2lvbik7Ci0JCX0KLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydE1lZGlhUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJyYWNlTm9kZSkgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NNZWRpYVJ1bGVJbXBsIHJ1bGUgPSBmRmVlZGVyLmdldENTU01lZGlhUnVsZSgpOwotCQlpZiAocnVsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChmbGF0Tm9kZS5nZXRSZWdpb25zKCkpOwotCQlyZWdpb25zLnJlbW92ZSgwKTsgLy8gbXVzdCBiZSAiQG1lZGlhIgotCi0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKHJlZ2lvbnMpOwotCQlNZWRpYUxpc3RJbXBsIG1lZGlhTGlzdCA9IChNZWRpYUxpc3RJbXBsKSBydWxlLmdldE1lZGlhKCk7Ci0JCXNldE1lZGlhTGlzdChtZWRpYUxpc3QsIGZsYXROb2RlLCByZWdpb25zKTsKLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlLCBicmFjZU5vZGUpOwotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBydWxlKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShydWxlKTsKLQkJLy8gVGFyZ2V0TmV4dCBpcyBzZXQgdG8gbnVsbCBhdXRvbWF0aWNhbGx5Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRQYWdlUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJyYWNlTm9kZSkgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBnZXQgc2VsZWN0b3IgcmVnaW9ucwotCQlJVGV4dFJlZ2lvbkxpc3Qgc2VsZWN0b3JSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChmbGF0Tm9kZS5nZXRSZWdpb25zKCkpOwotCQlzZWxlY3RvclJlZ2lvbnMucmVtb3ZlKDApOyAvLyBtdXN0IGJlICJAcGFnZSIKLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2Uoc2VsZWN0b3JSZWdpb25zKTsKLQotCQlDU1NQYWdlUnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTUGFnZVJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCVN0cmluZyBzZWxlY3RvclN0ciA9IENTU1V0aWwuZ2V0UmVnaW9uVGV4dChmbGF0Tm9kZSwgc2VsZWN0b3JSZWdpb25zKTsKLQkJCWlmICgwIDwgc2VsZWN0b3JTdHIubGVuZ3RoKCkpIHsKLQkJCQlydWxlLnNldFNlbGVjdG9yVGV4dChzZWxlY3RvclN0cik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlLCBicmFjZU5vZGUpOwotCQlDU1NBdHRySW1wbCBhdHRyID0gcnVsZS5nZXRBdHRyaWJ1dGVOb2RlKElDU1NQYWdlUnVsZS5TRUxFQ1RPUik7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgc2VsZWN0b3JSZWdpb25zICE9IG51bGwgJiYgIXNlbGVjdG9yUmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oZmxhdE5vZGUsIHNlbGVjdG9yUmVnaW9ucy5nZXQoMCksIHNlbGVjdG9yUmVnaW9ucy5nZXQoc2VsZWN0b3JSZWdpb25zLnNpemUoKSAtIDEpKTsKLQkJfQotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBydWxlKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShydWxlKTsKLQkJLy8gVGFyZ2V0TmV4dCBpcyBzZXQgdG8gbnVsbCBhdXRvbWF0aWNhbGx5Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRTZW1pQ29sb25Gb3JSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ga2V5UmVnaW9uID0gQ1NTVXRpbC5maW5kUHJldmlvdXNTaWduaWZpY2FudE5vZGUocmVnaW9uKTsKLQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoa2V5UmVnaW9uKTsKLQotCQlDU1NOb2RlSW1wbCBpbnNlcnRlZCA9IG51bGw7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0SW1wb3J0UnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCkgewotCQkJaW5zZXJ0ZWQgPSBpbnNlcnRDaGFyc2V0UnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gaW5zZXJ0ZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRTZW1pQ29sb25Gb3JTdHlsZURlY2xhcmF0aW9uSXRlbShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQkvLyBvbmx5IHRhcmdldC9uZXQgbm9kZSBpcyBjaGFuZ2VkLiBub3RoaW5nIHRvIGRvLgotCi0JCUNTU05vZGVJbXBsIHRhcmdldE5vZGUgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJaW50IG9mZnNldCA9IHRhcmdldE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCS8vIHdpZGVuIGRvY3VtZW50IHJlZ2lvbiByYW5nZQotCQkJLy8gKChDU1NTdHlsZURlY2xJdGVtSW1wbCl0YXJnZXROb2RlKS5zZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHJlZ2lvbik7Ci0JCQlDU1NNb2RlbFV0aWwuZXhwYW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKChDU1NTdHlsZURlY2xJdGVtSW1wbCkgdGFyZ2V0Tm9kZSwgcmVnaW9uKTsKLQkJCS8vIHBzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluZGljYXRlcyBDU1NTdHlsZURlY2xJdGVtCi0JCQlJQ1NTTm9kZSBwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocGFyZW50Tm9kZSk7Ci0JCQlJQ1NTTm9kZSBuZXh0ID0gbnVsbDsKLQkJCWlmIChwYXJlbnROb2RlLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWZvciAoSUNTU05vZGUgY2hpbGQgPSB0YXJnZXROb2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciAmJiBvZmZzZXQgPCAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJCW5leHQgPSBjaGlsZDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQotCQkJcmV0dXJuIHRhcmdldE5vZGU7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydFN0eWxlRGVjbGFyYXRpb25JdGVtKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uKSB7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHBhcmVudCA9IG51bGw7Ci0JCUNTU05vZGVJbXBsIG5vZGUgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlRGVjbENvbnRhaW5lcikgewotCQkJQ1NTUnVsZURlY2xDb250YWluZXIgZGVjbENvbnRhaW5lciA9IChDU1NSdWxlRGVjbENvbnRhaW5lcikgbm9kZTsKLQkJCXBhcmVudCA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgZGVjbENvbnRhaW5lci5nZXRTdHlsZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgewotCQkJcGFyZW50ID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBub2RlOwotCQl9Ci0KLQkJQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyIGl0ZW1QYXJzZXIgPSBuZXcgQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyKHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQlpdGVtUGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudFRlbXBvcmFyeShmYWxzZSk7Ci0JCWl0ZW1QYXJzZXIuc2V0VXBkYXRlQ29udGV4dChmVXBkYXRlQ29udGV4dCk7Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGRlY2xJdGVtID0gaXRlbVBhcnNlci5zZXR1cERlY2xhcmF0aW9uSXRlbShkb2NSZWdpb24pOwotCQlpZiAoZGVjbEl0ZW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlkZWNsSXRlbS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2NSZWdpb24sIGRvY1JlZ2lvbik7Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIGRlY2xJdGVtKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShkZWNsSXRlbSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQoZGVjbEl0ZW0pOwotCQkJfQotCQl9Ci0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKGRlY2xJdGVtKTsKLQkJLy8gVGFyZ2V0TmV4dCBpcyBzZXQgdG8gbnVsbCBhdXRvbWF0aWNhbGx5Ci0KLQkJcmV0dXJuIGRlY2xJdGVtOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0U3R5bGVSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYnJhY2VOb2RlKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWZQYXJzZUZsb2F0aW5nICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGdldCBzZWxlY3RvciByZWdpb25zCi0JCUlUZXh0UmVnaW9uTGlzdCBzZWxlY3RvclJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKGZsYXROb2RlLmdldFJlZ2lvbnMoKSk7Ci0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKHNlbGVjdG9yUmVnaW9ucyk7Ci0KLQkJQ1NTU3R5bGVSdWxlSW1wbCBydWxlID0gZkZlZWRlci5nZXRDU1NTdHlsZVJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCVN0cmluZyBzZWxlY3RvclN0ciA9IENTU1V0aWwuZ2V0UmVnaW9uVGV4dChmbGF0Tm9kZSwgc2VsZWN0b3JSZWdpb25zKTsKLQkJCWlmIChzZWxlY3RvclN0ciAhPSBudWxsICYmIDAgPCBzZWxlY3RvclN0ci5sZW5ndGgoKSkgewotCQkJCXJ1bGUuc2V0U2VsZWN0b3JUZXh0KHNlbGVjdG9yU3RyKTsKLQkJCX0KLQkJfQotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUsIGJyYWNlTm9kZSk7Ci0JCUNTU0F0dHJJbXBsIGF0dHIgPSBydWxlLmdldEF0dHJpYnV0ZU5vZGUoSUNTU1BhZ2VSdWxlLlNFTEVDVE9SKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiBzZWxlY3RvclJlZ2lvbnMgIT0gbnVsbCAmJiAhc2VsZWN0b3JSZWdpb25zLmlzRW1wdHkoKSkgewotCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihmbGF0Tm9kZSwgc2VsZWN0b3JSZWdpb25zLmdldCgwKSwgc2VsZWN0b3JSZWdpb25zLmdldChzZWxlY3RvclJlZ2lvbnMuc2l6ZSgpIC0gMSkpOwotCQl9Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHJ1bGUpOwotCQkvLyBUYXJnZXROZXh0IGlzIHNldCB0byBudWxsIGF1dG9tYXRpY2FsbHkKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJldGVuZFJlbW92ZU5vZGUoKSB7Ci0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBub2RlID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZlVwZGF0ZUNvbnRleHQuZ2V0RGVsZXRpb25UYXJnZXQoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdE5vZGUgIT0gbnVsbCkgewotCQkJZkRlbGV0aW9uQ29udGV4dC5leHBhbmRSZW1vdmVkUmFuZ2VCZWdpbihmaXJzdE5vZGUpOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCWZEZWxldGlvbkNvbnRleHQuZXhwYW5kUmVtb3ZlZFJhbmdlRW5kKGxhc3ROb2RlKTsKLQkJfQotCi0JCXNocmlua0NvbnRhaW5lcigoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmVXBkYXRlQ29udGV4dC5nZXREZWxldGlvblRhcmdldFBhcmVudCgpLCBub2RlKTsKLQl9Ci0KLQkvKioKLQkgKgljdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIGNoaWxkCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9wYWdhdGVSYW5nZVByZUluc2VydChDU1NOb2RlSW1wbCBwYXJlbnQsIENTU05vZGVJbXBsIGNoaWxkKSB7Ci0JCWlmICghKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB8fCAhKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBwYXJlbnRDb250YWluZXIgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQ7Ci0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjaGlsZENvbnRhaW5lciA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGNoaWxkOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IGNoaWxkQ29udGFpbmVyLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBjaGlsZENvbnRhaW5lci5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdE5vZGUgPT0gbnVsbCB8fCBsYXN0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIGJNb2RpZmllZCA9IHBhcmVudENvbnRhaW5lci5pbmNsdWRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmlyc3ROb2RlLCBsYXN0Tm9kZSk7Ci0JCWlmIChiTW9kaWZpZWQpIHsKLQkJCXBhcmVudENvbnRhaW5lci5wcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCWRvIHsKLQkJCQlmbGF0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuZ2V0UHJldk5vZGUoZmxhdE5vZGUpOwotCQkJCXR5cGUgPSAoZmxhdE5vZGUgIT0gbnVsbCkgPyBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpIDogbnVsbDsKLQkJCX0KLQkJCXdoaWxlICh0eXBlICE9IG51bGwgJiYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkpOwotCQl9Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZiAoZkRlbGV0aW9uQ29udGV4dC5pc0luUmVtb3ZlZFJhbmdlKGZsYXROb2RlKSkgeyAvLyBhbHJlYWR5Ci0JCS8vIHJlbW92ZWQKLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0KLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIG5vZGUgPSBmRGVsZXRpb25Db250ZXh0LmZpbmREZWxldGlvblRhcmdldCgoQ1NTTm9kZUltcGwpZkRvY3VtZW50LCBmbGF0Tm9kZSk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgbm9kZSA9PSBmRG9jdW1lbnQpIHsKLQkJCXJldHVybjsgLy8gbm90IGF0dGFjaGVkIHdpdGggYW55IHRyZWVOb2RlCi0JCX0KLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSB7Ci0JCQlJQ1NTTm9kZSBydWxlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocnVsZSBpbnN0YW5jZW9mIENTU1N0eWxlUnVsZUltcGwpIHsKLQkJCQlub2RlID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcnVsZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIElDU1NOb2RlIHAgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJLy8gaWYgKHAgPT0gbnVsbCB8fCAhIChwIGluc3RhbmNlb2YKLQkJLy8gQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkvLyByZXR1cm47Ci0JCS8vIH0KLQkJLy8gQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHBhcmVudCA9Ci0JCS8vIChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpcDsKLQotCQlpZiAoZkRlbGV0aW9uQ29udGV4dC5hZGROb2RlVG9CZVJlbW92ZWQobm9kZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZpcnN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJZkRlbGV0aW9uQ29udGV4dC5leHBhbmRSZW1vdmVkUmFuZ2VCZWdpbihmaXJzdE5vZGUpOwotCQkJfQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQlmRGVsZXRpb25Db250ZXh0LmV4cGFuZFJlbW92ZWRSYW5nZUVuZChsYXN0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzaHJpbmtDb250YWluZXIobm9kZSk7Ci0JCS8vIHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMpIHsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gZmxhdE5vZGVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9Ci0KLQkJSXRlcmF0b3IgaSA9IGZEZWxldGlvbkNvbnRleHQuZ2V0Tm9kZXNUb0JlUmVtb3ZlZCgpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU05vZGVJbXBsIG5vZGUgPSAoQ1NTTm9kZUltcGwpIGkubmV4dCgpOwotCQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUNTU05vZGVJbXBsIHBhcmVudCA9IChDU1NOb2RlSW1wbCkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAoIShwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlzaHJpbmtDb250YWluZXIoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50LCAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBub2RlKTsKLQkJCXBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKLQkJfQotCX0KLQotCXZvaWQgcmVwbGFjZURvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpIHsKLQkJaWYgKGZEb2N1bWVudCA9PSBudWxsIHx8IGZDcmVhdGlvbkNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJKChDU1NEb2N1bWVudEltcGwpIGZEb2N1bWVudCkucmVtb3ZlQ2hpbGROb2RlcygpOwotCi0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgMCA8IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkpIHsKLQkJCXNldHVwQ3JlYXRpb25Db250ZXh0KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSk7Ci0JCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcilmRG9jdW1lbnQpLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHN0cnVjdHVyZWREb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpIHsKLQkJaWYgKGZEb2N1bWVudCA9PSBudWxsIHx8IGZDcmVhdGlvbkNvbnRleHQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCAmJiAwIDwgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSkgewotCQkJc2V0dXBEZWxldGlvbkNvbnRleHQobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCQlzaG9ydCB1cGRhdGVNb2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0VXBkYXRlTW9kZSgpOwotCQkJaWYgKHVwZGF0ZU1vZGUgPT0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9JRExFKSB7Ci0JCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXByZXRlbmRSZW1vdmVOb2RlKCk7Ci0JCQl9Ci0JCQluZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdChmRGVsZXRpb25Db250ZXh0LmdldFJlbW92ZWRSYW5nZUJlZ2luKCksIGZEZWxldGlvbkNvbnRleHQuZ2V0UmVtb3ZlZFJhbmdlRW5kKCkpOwotCQkJY2xlYW51cERlbGV0aW9uQ29udGV4dCgpOwotCQl9Ci0KLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCAmJiAwIDwgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSkgewotCQkJLyogd2hlbiByZW1vdmluZyBvbGQgbm9kZXMgdGhlIGNyZWF0aW9uIGNvbnRleHQgc2hvdWxkIGJlIHNldCB1cCBiYXNlZCBvbiB0aGVtCi0JCQkgKiBlbHNlIGNyZWF0aW9uIGNvbnRleHQgaXMgdGhhdCBvZiB0aGUgbmV3IG5vZGVzCi0JCQkgKi8KLQkJCWlmKCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSA8IDApIHsKLQkJCQlzZXR1cENyZWF0aW9uQ29udGV4dChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCkpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXR1cENyZWF0aW9uQ29udGV4dChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCkpOwotCQkJfQotCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJfQotCi0JCS8vIG1ha2UgZG9jdW1lbnQgaG9sZCB3aG9sZSBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkJLyoKLQkJICogYm9vbGVhbiBiVXBkYXRlID0gZmFsc2U7IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JCSAqIGZsYXROb2RlID0gZkRvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7IGJVcGRhdGUgPQotCQkgKiBiVXBkYXRlIHx8IChmbGF0Tm9kZSA9PSBudWxsIHx8Ci0JCSAqIGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuaXNPbGROb2RlKGZsYXROb2RlKSB8fAotCQkgKiBmbGF0Tm9kZS5nZXRQcmV2aW91cygpICE9IG51bGwpOyBmbGF0Tm9kZSA9Ci0JCSAqIGZEb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7IGJVcGRhdGUgPSBiVXBkYXRlIHx8Ci0JCSAqIChmbGF0Tm9kZSA9PSBudWxsIHx8IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuaXNPbGROb2RlKGZsYXROb2RlKSB8fAotCQkgKiBmbGF0Tm9kZS5nZXROZXh0KCkgIT0gbnVsbCk7Ci0JCSAqLwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKWZEb2N1bWVudCkuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oc3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkvKiB9ICovCi0KLQkJLy8gcmVtb3ZlIGluIG9mZmljaWFsIHJlbGVhc2UKLQkJLy8gQ1NTTW9kZWxVdGlsLmRpYWdub3NlVHJlZShmRG9jdW1lbnQsCi0JCS8vIGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgcmVwbGFjZVJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMsIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5ld1JlZ2lvbnMgPT0gbnVsbCB8fCBvbGRSZWdpb25zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZkRvY3VtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0Q3JlYXRpb25UYXJnZXQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsIHx8IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpIDw9IDApIHsKLQkJCS8vIHRvcCBvZiBkb2N1bWVudAotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKGZEb2N1bWVudCk7Ci0JCQlmQ3JlYXRpb25Db250ZXh0LnNldE5leHROb2RlKGZEb2N1bWVudC5nZXRGaXJzdENoaWxkKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IGN1cnNvclBvcyA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQlDU1NOb2RlSW1wbCBjdXJzb3JOb2RlID0gZ2V0Tm9kZUF0KGN1cnNvclBvcyk7Ci0JCWlmIChjdXJzb3JOb2RlID09IG51bGwpIHsgLy8gZW5kIG9mIGRvY3VtZW50Ci0JCQljdXJzb3JOb2RlID0gKENTU05vZGVJbXBsKWZEb2N1bWVudDsKLQkJfQotCi0JCS8vIGZpbmQgZWRnZSBvZiB0cmVlIG5vZGUKLQkJQ1NTTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0JCS8vIGJvb2xlYW4gYk92ZXJTZW1pQ29sb24gPSBmYWxzZTsKLQkJYm9vbGVhbiBiT3Zlck9wZW5CcmFjZSA9IGZhbHNlOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQlmb3IgKGZsYXROb2RlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOyBmbGF0Tm9kZSAhPSBudWxsOyBmbGF0Tm9kZSA9IGZsYXROb2RlLmdldFByZXZpb3VzKCkpIHsKLQkJCW5vZGUgPSBnZXROb2RlQXQoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9IChDU1NOb2RlSW1wbClmRG9jdW1lbnQ7Ci0JCQl9Ci0JCQlpZiAobm9kZSAhPSBjdXJzb3JOb2RlIHx8IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA9PSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQkJCS8vIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwKLQkJCQkvLyB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQkvLyBiT3ZlclNlbWlDb2xvbiA9IHRydWU7Ci0JCQkJLy8gfSBlbHNlCi0JCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCQliT3Zlck9wZW5CcmFjZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQ1NTTm9kZUltcGwgdGFyZ2V0Tm9kZSA9IG51bGw7Ci0KLQkJLy8gaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJLy8gdjwtLXwKLQkJLy8gQUFBQUFBCi0JCS8vIEJCQkJCQkJCQkIgY3Vyc29yTm9kZTpBICwgbm9kZTpCIC0+IHRhcmdldCBpcyBBCi0JCS8vIHRhcmdldE5vZGUgPSAobm9kZSA9PSBudWxsKSA/IGZEb2N1bWVudCA6IG5vZGU7Ci0JCS8vIH0gZWxzZQotCQlpZiAoY3Vyc29yTm9kZSA9PSBub2RlKSB7Ci0JCQkvLyB2PC0tfAotCQkJLy8gQUFBQUFBCi0JCQkvLyBCQkJCQkJCQkJCIGN1cnNvck5vZGU6QSAsIG5vZGU6QiAtPiB0YXJnZXQgaXMgQQotCQkJaWYgKGJPdmVyT3BlbkJyYWNlICYmIGN1cnNvck5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlRGVjbENvbnRhaW5lcikgewotCQkJCXRhcmdldE5vZGUgPSAoQ1NTTm9kZUltcGwpICgoQ1NTUnVsZURlY2xDb250YWluZXIpIGN1cnNvck5vZGUpLmdldFN0eWxlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0YXJnZXROb2RlID0gY3Vyc29yTm9kZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHY8LS18Ci0JCQkvLyBBQUEKLQkJCS8vIEJCQkJCQkJCQkIgY3Vyc29yTm9kZTpCICwgbm9kZTpBIC0+IGRlcGVuZCBvbiBBJ3Mgbm9kZSB0eXBlCi0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xJVEVNX05PREUgfHwgbm9kZVR5cGUgPT0gSUNTU05vZGUuQ0hBUlNFVFJVTEVfTk9ERSB8fCBub2RlVHlwZSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUpIHsKLQkJCQkvLyB0YXJnZXROb2RlID0gKENTU05vZGVJbXBsKSgoYk92ZXJTZW1pQ29sb24pID8KLQkJCQkvLyBub2RlLmdldFBhcmVudE5vZGUoKSA6IG5vZGUpOyAvLyBOUAotCQkJCVN0cmluZyByZWdpb25UeXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJCQl0YXJnZXROb2RlID0gKENTU05vZGVJbXBsKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRhcmdldE5vZGUgPSBub2RlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShmbGF0Tm9kZSkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJCXRhcmdldE5vZGUgPSAoQ1NTTm9kZUltcGwpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGFyZ2V0Tm9kZSA9IG5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUodGFyZ2V0Tm9kZSk7Ci0JCUlDU1NOb2RlIG5leHQgPSBudWxsOwotCQlpZiAodGFyZ2V0Tm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCWZvciAoSUNTU05vZGUgY2hpbGQgPSB0YXJnZXROb2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyICYmIGN1cnNvclBvcyA8ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQluZXh0ID0gY2hpbGQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmQ3JlYXRpb25Db250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCi0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0UmVwYXJzZVJhbmdlKCkgewotCQlmQ3JlYXRpb25Db250ZXh0LmNsZWFyKCk7Ci0JfQotCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlciA9PSBudWxsKSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFdhbGtlcigpOwotCQl9Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuaW5pdGlhbGl6ZShldmVudCk7Ci0JfQotCi0JLyoqCi0JICogcmVnaW9uczogc3Vycm91bmRpbmcgc3BhY2VzIHNob3VsZCBiZSByZW1vdmVkLiBRLiBXaHkgZGlkIHlvdSBzZXQKLQkgKiBtZWRpYVRhYmxlID8gQS4gTWVkaWFMaXN0IG1heSBoYXZlIHR3byBvciBtb3JlIG1lZGl1bSB0aGF0IGhhdmUgc2FtZQotCSAqIHZhbHVlLCB0aGVuIHNlYXJjaW5nIGluIE1lZGlhTGlzdCBpcyBub3QgcGVyZmVjdC4gUS4KLQkgKiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpIGlzIG5vdCBjYXJlLiBBcmUgeW91IE9LPyBBLiBPSy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TWVkaWFMaXN0KE1lZGlhTGlzdEltcGwgbWVkaWFMaXN0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVRleHRSZWdpb25MaXN0IHRleHRSZWdpb25zKSB7Ci0JCWlmIChtZWRpYUxpc3QgPT0gbnVsbCB8fCB0ZXh0UmVnaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ29sbGVjdGlvbiBtZWRpYVRhYmxlID0gbmV3IEhhc2hTZXQoKTsKLQkJQ1NTTm9kZUxpc3RJbXBsIGF0dHJzID0gbWVkaWFMaXN0LmdldE1lZGlhKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpICE9IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCW1lZGlhVGFibGUuYWRkKGF0dHJzLml0ZW0oaSkpOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gc3RhcnQgPSBudWxsOwotCQlJVGV4dFJlZ2lvbiBlbmQgPSBudWxsOwotCi0JCUl0ZXJhdG9yIGkgPSB0ZXh0UmVnaW9ucy5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gKElUZXh0UmVnaW9uKSAoKGkuaGFzTmV4dCgpKSA/IGkubmV4dCgpIDogbnVsbCk7Ci0JCXdoaWxlICh0ZXh0UmVnaW9uICE9IG51bGwpIHsKLQkJCWlmICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESVVNKSB7Ci0JCQkJU3RyaW5nIG1lZGl1bVN0ciA9IHJlZ2lvbi5nZXRUZXh0KHRleHRSZWdpb24pOwotCQkJCWlmICgwIDwgbWVkaXVtU3RyLmxlbmd0aCgpKSB7Ci0JCQkJCUNTU0F0dHJJbXBsIGF0dHIgPSBudWxsOwotCQkJCQkvLyBpcyB0aGUgbWVkaXVtIGFscmVhZHkgc2V0ID8KLQkJCQkJSXRlcmF0b3IgaVRhYmxlID0gbWVkaWFUYWJsZS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaVRhYmxlLmhhc05leHQoKSkgewotCQkJCQkJQ1NTQXR0ckltcGwgY2FpID0gKENTU0F0dHJJbXBsKSBpVGFibGUubmV4dCgpOwotCQkJCQkJaWYgKG1lZGl1bVN0ci5lcXVhbHNJZ25vcmVDYXNlKGNhaS5nZXRWYWx1ZSgpKSkgewotCQkJCQkJCWF0dHIgPSBjYWk7Ci0JCQkJCQkJbWVkaWFUYWJsZS5yZW1vdmUoY2FpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoYXR0ciA9PSBudWxsKSB7Ci0JCQkJCQkvLyBpcyBub3Qgc2V0LiBjcmVhdGUgbmV3IGF0dHJpYnV0ZQotCQkJCQkJU3RyaW5nIGtleSA9ICJtZWRpdW1QIiArIG1lZGlhTGlzdC5tZWRpdW1Db3VudGVyKys7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1lZGlhTGlzdC5zZXRBdHRyaWJ1dGUoa2V5LCBtZWRpdW1TdHIpOwotCQkJCQkJYXR0ciA9IG1lZGlhTGlzdC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCQkJCX0KLQkJCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihyZWdpb24sIHRleHRSZWdpb24sIHRleHRSZWdpb24pOwotCQkJCQlpZiAoc3RhcnQgPT0gbnVsbCkgewotCQkJCQkJc3RhcnQgPSB0ZXh0UmVnaW9uOwotCQkJCQl9Ci0JCQkJCWVuZCA9IHRleHRSZWdpb247Ci0JCQkJfQotCQkJfQotCQkJdGV4dFJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgKChpLmhhc05leHQoKSkgPyBpLm5leHQoKSA6IG51bGwpOwotCQl9Ci0KLQkJaWYgKHN0YXJ0ICE9IG51bGwgJiYgZW5kICE9IG51bGwpIHsKLQkJCW1lZGlhTGlzdC5zZXRSYW5nZVJlZ2lvbihyZWdpb24sIHN0YXJ0LCBlbmQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldHVwQ3JlYXRpb25Db250ZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCXJlc2V0UmVwYXJzZVJhbmdlKCk7Ci0JCXJlc2V0Q3JlYXRpb25UYXJnZXQocmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBEZWxldGlvbkNvbnRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykgewotCQlmRGVsZXRpb25Db250ZXh0LnNldHVwQ29udGV4dChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldHVwVXBkYXRlQ29udGV4dChzaG9ydCB1cGRhdGVNb2RlLCBJQ1NTTm9kZSBwYXJlbnROb2RlLCBJQ1NTTm9kZSB0YXJnZXROb2RlKSB7Ci0JCWZVcGRhdGVDb250ZXh0LnNldHVwQ29udGV4dCh1cGRhdGVNb2RlLCBwYXJlbnROb2RlLCB0YXJnZXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNocmlua0NvbnRhaW5lcihDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgcGFyZW50LCBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gYk1vZGlmaWVkID0gZmFsc2U7Ci0JCWJNb2RpZmllZCA9IGJNb2RpZmllZCB8fCBjbGVhbnVwTGFzdE5vZGUoY2hpbGQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBwYXJlbnQpOwotCQliTW9kaWZpZWQgPSBiTW9kaWZpZWQgfHwgY2xlYW51cEZpcnN0Tm9kZShjaGlsZC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBwYXJlbnQpOwotCi0JCWlmIChiTW9kaWZpZWQpIHsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCWZvciAoSUNTU05vZGUgbm9kZSA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQlpZiAoY2hpbGQgIT0gbm9kZSAmJiBub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkucHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWNoaWxkLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVcGRhdGVDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Y0ZTkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVcGRhdGVDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkFic3RyYWN0Q3NzVHJhdmVyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NNb2RlbFVwZGF0ZUNvbnRleHQgewotCi0KLQljbGFzcyBDU1NOb2RlVXBkYXRlVHJhdmVyc2VyIGV4dGVuZHMgQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCQlwdWJsaWMgQ1NTTm9kZVVwZGF0ZVRyYXZlcnNlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCQlzZXRUcmF2ZXJzZUltcG9ydGVkKGZhbHNlKTsKLQkJCXNldFRyYXZlcnNlSW1wb3J0Rmlyc3QoZmFsc2UpOwotCQl9Ci0KLQkJcHVibGljIExpbmtlZExpc3QgZ2V0Tm9kZUxpc3QoKSB7Ci0JCQlyZXR1cm4gZlRyYXZOb2RlTGlzdDsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGJlZ2luKElDU1NOb2RlIG5vZGUpIHsKLQkJCWZUcmF2Tm9kZUxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCB8fCBub2RlIGluc3RhbmNlb2YgQ1NTQXR0ckltcGwgfHwgbm9kZSBpbnN0YW5jZW9mIE1lZGlhTGlzdEltcGwpIHsKLQkJCQkvLyBza2lwCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmVHJhdk5vZGVMaXN0LmFkZChub2RlKTsKLQkJCX0KLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUHJpbWl0aXZlQ29udGFpbmVyKSB7Ci0JCQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gVFJBVl9DT05UOwotCQkJfQotCQl9Ci0KLQkJTGlua2VkTGlzdCBmVHJhdk5vZGVMaXN0ID0gbnVsbDsKLQl9Ci0KLQlJQ1NTTm9kZSBmTGFzdE5vZGUgPSBudWxsOwotCUlDU1NOb2RlIGZEZWxldGlvblRhcmdldFBhcmVudCA9IG51bGw7Ci0JSUNTU05vZGUgZkRlbGV0aW9uVGFyZ2V0ID0gbnVsbDsKLQlMaW5rZWRMaXN0IGZOb2RlTGlzdCA9IG51bGw7Ci0JcHJpdmF0ZSBzaG9ydCBmVXBkYXRlTW9kZSA9IFVQREFURV9JRExFOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBVUERBVEVfSURMRSA9IDA7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9JTlNFUlRfRk5DT05UQUlORVIgPSAxOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBVUERBVEVfSU5TRVJUX1JDT05UQUlORVIgPSAyOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBVUERBVEVfUkVNT1ZFX0ZOQ09OVEFJTkVSID0gMzsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX1JFTU9WRV9SQ09OVEFJTkVSID0gNDsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX0NIQU5HRV9SQ09OVEFJTkVSID0gNTsKLQotCS8qKgotCSAqIENTU05vZGVVcGRhdGVRdWV1ZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU01vZGVsVXBkYXRlQ29udGV4dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNsZWFudXBDb250ZXh0KCkgewotCQlmTm9kZUxpc3QgPSBudWxsOwotCQlmRGVsZXRpb25UYXJnZXQgPSBudWxsOwotCQlmRGVsZXRpb25UYXJnZXRQYXJlbnQgPSBudWxsOwotCQlmVXBkYXRlTW9kZSA9IFVQREFURV9JRExFOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNvdW50ZXJJbXBsIGdldENvdW50ZXIoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ291bnRlckltcGwpIHsKLQkJCXJldHVybiAoQ291bnRlckltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDb3VudGVySW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTQ2hhcnNldFJ1bGVJbXBsIGdldENTU0NoYXJzZXRSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU0NoYXJzZXRSdWxlSW1wbCkgewotCQkJcmV0dXJuIChDU1NDaGFyc2V0UnVsZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NDaGFyc2V0UnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0ZvbnRGYWNlUnVsZUltcGwgZ2V0Q1NTRm9udEZhY2VSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU0ZvbnRGYWNlUnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTRm9udEZhY2VSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU0ZvbnRGYWNlUnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0ltcG9ydFJ1bGVJbXBsIGdldENTU0ltcG9ydFJ1bGUoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTSW1wb3J0UnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTSW1wb3J0UnVsZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NJbXBvcnRSdWxlSW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTTWVkaWFSdWxlSW1wbCBnZXRDU1NNZWRpYVJ1bGUoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTTWVkaWFSdWxlSW1wbCkgewotCQkJcmV0dXJuIChDU1NNZWRpYVJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTTWVkaWFSdWxlSW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUGFnZVJ1bGVJbXBsIGdldENTU1BhZ2VSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1BhZ2VSdWxlSW1wbCkgewotCQkJcmV0dXJuIChDU1NQYWdlUnVsZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NQYWdlUnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBnZXRDU1NQcmltaXRpdmVWYWx1ZShzaG9ydCB0eXBlKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB7Ci0JCQlzaG9ydCBub2RlVHlwZSA9ICgoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBub2RlKS5nZXRQcmltaXRpdmVUeXBlKCk7Ci0JCQlpZiAobm9kZVR5cGUgPT0gdHlwZSB8fCAoKG5vZGVUeXBlID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVIgfHwgbm9kZVR5cGUgPT0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTlRFR0VSKSAmJiAodHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIHx8IHR5cGUgPT0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTlRFR0VSKSkpIHsKLQkJCQlyZXR1cm4gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgbm9kZTsKLQkJCX0KLQkJfQotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB7Ci0JCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBub2RlOwotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIFsiICsgdHlwZSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSJdIGlzIGV4cGVjdGVkLCBidXQgdHlwZSBpcyBbIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXZhbHVlLmdldFByaW1pdGl2ZVR5cGUoKSArICJdOiBcIiIgKyB2YWx1ZS5nZW5lcmF0ZVNvdXJjZSgpICsgIlwiIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1ByaW1pdGl2ZVZhbHVlSW1wbCgiICsgdHlwZSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSIpIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQl9Ci0KLQkJdW5nZXROb2RlKCk7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgZ2V0Q1NTUHJpbWl0aXZlVmFsdWVBbnkoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU3R5bGVEZWNsSXRlbUltcGwgZ2V0Q1NTU3R5bGVEZWNsSXRlbShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsSXRlbUltcGwgJiYgKChDU1NTdHlsZURlY2xJdGVtSW1wbCkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTU3R5bGVEZWNsSXRlbUltcGwoIiArIHByb3BlcnR5TmFtZSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSIpIGlzIGV4cGVjdGVkLCBidXQgIiArIENTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOy8vJE5PTi1OTFMtMSQKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU3R5bGVSdWxlSW1wbCBnZXRDU1NTdHlsZVJ1bGUoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVSdWxlSW1wbCkgewotCQkJcmV0dXJuIChDU1NTdHlsZVJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTU3R5bGVSdWxlSW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCUlDU1NOb2RlIGdldERlbGV0aW9uVGFyZ2V0KCkgewotCQlyZXR1cm4gZkRlbGV0aW9uVGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlJQ1NTTm9kZSBnZXREZWxldGlvblRhcmdldFBhcmVudCgpIHsKLQkJcmV0dXJuIGZEZWxldGlvblRhcmdldFBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIElDU1NOb2RlIGdldE5vZGUoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBudWxsOwotCQlpZiAoZk5vZGVMaXN0ICE9IG51bGwgJiYgMCA8IGZOb2RlTGlzdC5zaXplKCkpIHsKLQkJCW5vZGUgPSAoSUNTU05vZGUpIGZOb2RlTGlzdC5yZW1vdmVGaXJzdCgpOwotCQl9Ci0JCWZMYXN0Tm9kZSA9IG5vZGU7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXROb2RlQ291bnQoKSB7Ci0JCWlmIChmTm9kZUxpc3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZOb2RlTGlzdC5zaXplKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQkvLyBJQ1NTTm9kZSBnZXRQYXJlbnROb2RlKCkgewotCS8vIHJldHVybiBmUGFyZW50Tm9kZTsKLQkvLyB9Ci0JLyoqCi0JICogCi0JICovCi0JUmVjdEltcGwgZ2V0UmVjdCgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBSZWN0SW1wbCkgewotCQkJcmV0dXJuIChSZWN0SW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIlJlY3RJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlSR0JDb2xvckltcGwgZ2V0UkdCQ29sb3IoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgUkdCQ29sb3JJbXBsKSB7Ci0JCQlyZXR1cm4gKFJHQkNvbG9ySW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIlJHQkNvbG9ySW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXNob3J0IGdldFVwZGF0ZU1vZGUoKSB7Ci0JCXJldHVybiBmVXBkYXRlTW9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gKGZOb2RlTGlzdCAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldHVwQ29udGV4dChzaG9ydCB1cGRhdGVNb2RlLCBJQ1NTTm9kZSBwYXJlbnROb2RlLCBJQ1NTTm9kZSB0YXJnZXROb2RlKSB7Ci0JCWZVcGRhdGVNb2RlID0gdXBkYXRlTW9kZTsKLQotCQlJQ1NTTm9kZSB0cmF2ZXJzZVJvb3Q7Ci0JCWlmICh1cGRhdGVNb2RlID09IFVQREFURV9SRU1PVkVfUkNPTlRBSU5FUiB8fCB1cGRhdGVNb2RlID09IFVQREFURV9JTlNFUlRfUkNPTlRBSU5FUiB8fCB1cGRhdGVNb2RlID09IFVQREFURV9DSEFOR0VfUkNPTlRBSU5FUikgewotCQkJdHJhdmVyc2VSb290ID0gcGFyZW50Tm9kZTsKLQkJCXdoaWxlICh0cmF2ZXJzZVJvb3QgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCQl0cmF2ZXJzZVJvb3QgPSB0cmF2ZXJzZVJvb3QuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdHJhdmVyc2VSb290ID0gdGFyZ2V0Tm9kZTsKLQkJfQotCi0JCWlmICh1cGRhdGVNb2RlID09IFVQREFURV9SRU1PVkVfUkNPTlRBSU5FUiB8fCB1cGRhdGVNb2RlID09IFVQREFURV9JTlNFUlRfUkNPTlRBSU5FUiB8fCAvLyByZWdpb24KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGluc2VydAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gPT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJlcGxhY2UKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZsYXQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5vZGUKLQkJCQkJdXBkYXRlTW9kZSA9PSBVUERBVEVfQ0hBTkdFX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfUkVNT1ZFX0ZOQ09OVEFJTkVSKSB7Ci0JCQlmRGVsZXRpb25UYXJnZXQgPSB0cmF2ZXJzZVJvb3Q7Ci0JCQlpZiAoZkRlbGV0aW9uVGFyZ2V0ID09IHRhcmdldE5vZGUpIHsKLQkJCQlmRGVsZXRpb25UYXJnZXRQYXJlbnQgPSBwYXJlbnROb2RlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gZkRlbGV0aW9uVGFyZ2V0LmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWZEZWxldGlvblRhcmdldCA9IG51bGw7Ci0JCQlmRGVsZXRpb25UYXJnZXRQYXJlbnQgPSBudWxsOwotCQl9Ci0KLQkJaWYgKHVwZGF0ZU1vZGUgPT0gVVBEQVRFX0lOU0VSVF9SQ09OVEFJTkVSIHx8IHVwZGF0ZU1vZGUgPT0gVVBEQVRFX0lOU0VSVF9GTkNPTlRBSU5FUiB8fCB1cGRhdGVNb2RlID09IFVQREFURV9SRU1PVkVfUkNPTlRBSU5FUiB8fCAvLyByZWdpb24KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gcmVtb3ZlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vID0+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJlLWluc2VydAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmbGF0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5vZGUKLQkJCQkJdXBkYXRlTW9kZSA9PSBVUERBVEVfQ0hBTkdFX1JDT05UQUlORVIpIHsKLQkJCUNTU05vZGVVcGRhdGVUcmF2ZXJzZXIgdHJhdmVyc2VyID0gbmV3IENTU05vZGVVcGRhdGVUcmF2ZXJzZXIoKTsKLQkJCXRyYXZlcnNlci5hcHBseSh0cmF2ZXJzZVJvb3QpOwotCQkJZk5vZGVMaXN0ID0gdHJhdmVyc2VyLmdldE5vZGVMaXN0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTm9kZUxpc3QgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVuZ2V0Tm9kZSgpIHsKLQkJaWYgKGZOb2RlTGlzdCAhPSBudWxsICYmIGZMYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQlmTm9kZUxpc3QuYWRkRmlyc3QoZkxhc3ROb2RlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmI4YThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkF0dHJDaGFuZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsVXBkYXRlciB7Ci0KLQlwcml2YXRlIENTU01vZGVsSW1wbCBmTW9kZWwgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxQYXJzZXIgZlBhcnNlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbFVwZGF0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NNb2RlbFVwZGF0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTTW9kZWxVcGRhdGVyKENTU01vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQlmTW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgdm9pZCBhdHRySW5zZXJ0ZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTQXR0ckltcGwgYXR0cikgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihwYXJlbnROb2RlKTsKLQotCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNhbm5vdCBnZXQgZm9ybWF0IGFkYXB0ZXIgOiAiICsgcGFyZW50Tm9kZS5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXNob3J0IHVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lOU0VSVF9SQ09OVEFJTkVSOwotCQlmUGFyc2VyLnNldHVwVXBkYXRlQ29udGV4dCh1cGRhdGVNb2RlLCBwYXJlbnROb2RlLCBhdHRyKTsKLQotCQkvLyBnZXQgZm9ybWF0dGVkIGluZm8KLQkJQXR0ckNoYW5nZUNvbnRleHQgcmVnaW9uID0gbmV3IEF0dHJDaGFuZ2VDb250ZXh0KCk7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZyhmb3JtYXR0ZXIuZm9ybWF0QXR0ckNoYW5nZWQocGFyZW50Tm9kZSwgYXR0ciwgdHJ1ZSwgcmVnaW9uKSk7Ci0KLQkJLy8gc2V0IHRleHQKLQkJaW5zZXJ0VGV4dChyZWdpb24uc3RhcnQsIHJlZ2lvbi5lbmQgLSByZWdpb24uc3RhcnQsIHRleHQpOwotCi0JCWZQYXJzZXIuY2xlYW51cFVwZGF0ZUNvbnRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgdm9pZCBhdHRyUmVtb3ZlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NBdHRySW1wbCBhdHRyKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKHBhcmVudE5vZGUpOwotCi0JCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ2Fubm90IGdldCBmb3JtYXQgYWRhcHRlciA6ICIgKyBwYXJlbnROb2RlLmdldENsYXNzKCkudG9TdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc2hvcnQgdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfUkVNT1ZFX1JDT05UQUlORVI7Ci0JCWZQYXJzZXIuc2V0dXBVcGRhdGVDb250ZXh0KHVwZGF0ZU1vZGUsIHBhcmVudE5vZGUsIGF0dHIpOwotCi0JCS8vIGdldCBmb3JtYXR0ZWQgaW5mbwotCQlBdHRyQ2hhbmdlQ29udGV4dCByZWdpb24gPSBuZXcgQXR0ckNoYW5nZUNvbnRleHQoKTsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKGZvcm1hdHRlci5mb3JtYXRBdHRyQ2hhbmdlZChwYXJlbnROb2RlLCBhdHRyLCBmYWxzZSwgcmVnaW9uKSk7Ci0KLQkJLy8gc2V0IHRleHQKLQkJaW5zZXJ0VGV4dChyZWdpb24uc3RhcnQsIHJlZ2lvbi5lbmQgLSByZWdpb24uc3RhcnQsIHRleHQpOwotCi0JCWZQYXJzZXIuY2xlYW51cFVwZGF0ZUNvbnRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGF0dHJSZXBsYWNlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBuZXdBdHRyLCBDU1NOb2RlSW1wbCBvbGRBdHRyKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvbGRBdHRyICE9IG51bGwpIHsKLQkJCWF0dHJSZW1vdmVkKHBhcmVudE5vZGUsIChDU1NBdHRySW1wbCkgb2xkQXR0cik7Ci0JCX0KLQotCQlpZiAobmV3QXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRySW5zZXJ0ZWQocGFyZW50Tm9kZSwgKENTU0F0dHJJbXBsKSBuZXdBdHRyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGlsZEluc2VydGVkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5vZGUpIHsKLQkJc2hvcnQgdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfSURMRTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfSU5TRVJUX0ZOQ09OVEFJTkVSOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCXVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lOU0VSVF9SQ09OVEFJTkVSOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiV2hhdCdzIHRoaXMgbm9kZT8gOiAiICsgbm9kZS5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWZQYXJzZXIuc2V0dXBVcGRhdGVDb250ZXh0KHVwZGF0ZU1vZGUsIHBhcmVudE5vZGUsIG5vZGUpOwotCi0JCWRlZmF1bHRJbnNlcnRlZChwYXJlbnROb2RlLCBub2RlKTsKLQotCQlmUGFyc2VyLmNsZWFudXBVcGRhdGVDb250ZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoaWxkUmVtb3ZlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCXNob3J0IHVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lETEU7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCXVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX1JFTU9WRV9GTkNPTlRBSU5FUjsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQl1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9SRU1PVkVfUkNPTlRBSU5FUjsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIldoYXQncyB0aGlzIG5vZGU/IDogIiArIG5vZGUuZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlmUGFyc2VyLnNldHVwVXBkYXRlQ29udGV4dCh1cGRhdGVNb2RlLCBwYXJlbnROb2RlLCBub2RlKTsKLQotCQlDU1NOb2RlSW1wbCBwcmV2ID0gZ2V0T2xkUHJldmlvdXMocGFyZW50Tm9kZSwgbm9kZSk7Ci0JCUNTU05vZGVJbXBsIG5leHQgPSBnZXRPbGROZXh0KHBhcmVudE5vZGUsIG5vZGUpOwotCQlpbnQgaW5zZXJ0UG9zID0gLTEsIGVuZFBvcyA9IC0xOwotCQlTdHJpbmcgc291cmNlID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlpZiAocHJldiAhPSBudWxsKSB7Ci0JCQlpbnNlcnRQb3MgPSBwcmV2LmdldEVuZE9mZnNldCgpOwotCQl9Ci0JCWVsc2UgewotCQkJaW5zZXJ0UG9zID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW5zZXJ0UG9zIC09IG5lYXJlc3RTcGFjZUxlbmd0aEJlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRQb3MpOwotCQl9Ci0JCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCWVuZFBvcyA9IG5leHQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCWVuZFBvcyA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQllbmRQb3MgKz0gbmVhcmVzdFNwYWNlTGVuZ3RoQWZ0ZXIocGFyZW50Tm9kZSwgZW5kUG9zKTsKLQkJfQotCQlzb3VyY2UgPSBnZXRTcGFjZUJlZm9yZShwYXJlbnROb2RlLCBuZXh0LCBub2RlKTsKLQkJaWYgKHNvdXJjZS5sZW5ndGgoKSA+IDApIHsKLQkJCWluc2VydFRleHQoaW5zZXJ0UG9zLCBlbmRQb3MgLSBpbnNlcnRQb3MsIHNvdXJjZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVUZXh0KGluc2VydFBvcywgZW5kUG9zIC0gaW5zZXJ0UG9zKTsKLQkJfQotCi0JCWZQYXJzZXIuY2xlYW51cFVwZGF0ZUNvbnRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNoaWxkUmVwbGFjZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbmV3Q2hpbGQsIENTU05vZGVJbXBsIG9sZENoaWxkKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvbGRDaGlsZCAhPSBudWxsKSB7Ci0JCQljaGlsZFJlbW92ZWQocGFyZW50Tm9kZSwgb2xkQ2hpbGQpOwotCQl9Ci0KLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkSW5zZXJ0ZWQocGFyZW50Tm9kZSwgbmV3Q2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBkZWZhdWx0SW5zZXJ0ZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbm9kZSkgewotCQlpbnQgaW5zZXJ0UG9zID0gLTE7Ci0JCUlDU1NOb2RlIHNpYmxpbmc7Ci0JCVN0cmluZyBwcmVTcGFjZSA9ICIiLCBwb3N0U3BhY2UgPSAiIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQlpZiAoaW5zZXJ0UG9zIDwgMCkgewotCQkJaWYgKChzaWJsaW5nID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSkgIT0gbnVsbCkgewotCQkJCS8vIGFmdGVyIHByZXZpb3VzIGNoaWxkCi0JCQkJaW5zZXJ0UG9zID0gZ2V0VGV4dEVuZChzaWJsaW5nKTsKLQkJCX0KLQkJfQotCi0JCWlmIChpbnNlcnRQb3MgPCAwKSB7Ci0JCQlpZiAoKHNpYmxpbmcgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpICE9IG51bGwpIHsKLQkJCQkvLyBiZWZvcmUgbmV4dCBjaGlsZAotCQkJCWluc2VydFBvcyA9IGdldFRleHRTdGFydChzaWJsaW5nKTsKLQkJCX0KLQkJfQotCi0JCWlmIChpbnNlcnRQb3MgPCAwKSB7Ci0JCQkvLyBwb3NpdGlvbiBvZiBwYXJlbnQKLQkJCWluc2VydFBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKHBhcmVudE5vZGUpOwotCQl9Ci0KLQkJaWYgKGluc2VydFBvcyA8IDApIHsKLQkJCS8vIGZpcnN0dGltZQotCQkJaW5zZXJ0UG9zID0gMDsKLQkJfQotCi0JCS8vIGZvcm1hdCBwcmV2aW91cyBzcGFjZXMKLQkJbGVuZ3RoID0gbmVhcmVzdFNwYWNlTGVuZ3RoQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydFBvcyk7Ci0JCWluc2VydFBvcyAtPSBsZW5ndGg7Ci0JCXByZVNwYWNlID0gZ2V0U3BhY2VCZWZvcmUocGFyZW50Tm9kZSwgbm9kZSwgbnVsbCk7Ci0JCS8vIGZvcm1hdCBwb3N0IHNwYWNlcwotCQlsZW5ndGggKz0gbmVhcmVzdFNwYWNlTGVuZ3RoQWZ0ZXIocGFyZW50Tm9kZSwgaW5zZXJ0UG9zICsgbGVuZ3RoKTsKLQkJcG9zdFNwYWNlID0gZ2V0U3BhY2VCZWZvcmUocGFyZW50Tm9kZSwgbm9kZS5nZXROZXh0U2libGluZygpLCBudWxsKTsKLQotCQkvLyBzZXQgdGV4dAotCQlTdHJpbmcgdGV4dCA9IHByZVNwYWNlICsgbm9kZS5nZW5lcmF0ZVNvdXJjZSgpLnRyaW0oKSArIHBvc3RTcGFjZTsKLQkJcmV0dXJuIGluc2VydFRleHQoaW5zZXJ0UG9zLCBsZW5ndGgsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgaW50IGdldENoaWxkSW5zZXJ0UG9zKENTU05vZGVJbXBsIG5vZGUpIHsKLQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIobm9kZSk7Ci0JCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBmb3JtYXR0ZXIuZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBub2RlLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGdldE9sZE5leHQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbm9kZSkgewotCQlDU1NOb2RlSW1wbCBjaGlsZCA9IChDU1NOb2RlSW1wbCkgcGFyZW50Tm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJQ1NTTm9kZUltcGwgcmV0ID0gbnVsbDsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmdldEVuZE9mZnNldCgpIDwgY2hpbGQuZ2V0RW5kT2Zmc2V0KCkpCi0JCQkJcmV0ID0gY2hpbGQ7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCQljaGlsZCA9IChDU1NOb2RlSW1wbCkgY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBnZXRPbGRQcmV2aW91cyhDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCUNTU05vZGVJbXBsIGNoaWxkID0gKENTU05vZGVJbXBsKSBwYXJlbnROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJQ1NTTm9kZUltcGwgcmV0ID0gbnVsbDsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXRTdGFydE9mZnNldCgpIDwgbm9kZS5nZXRTdGFydE9mZnNldCgpKQotCQkJCXJldCA9IGNoaWxkOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQkJY2hpbGQgPSAoQ1NTTm9kZUltcGwpIGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNwYWNlQmVmb3JlKElDU1NOb2RlIHBhcmVudE5vZGUsIElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIHRvUmVtb3ZlKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBwYXJlbnROb2RlKTsKLQotCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiBleGNlcHRGb3IgPSBudWxsOwotCQkJaWYgKHRvUmVtb3ZlICE9IG51bGwpIHsKLQkJCQlDU1NOb2RlSW1wbCByZW1vdmUgPSAoQ1NTTm9kZUltcGwpIHRvUmVtb3ZlOwotCQkJCWV4Y2VwdEZvciA9IG5ldyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbihyZW1vdmUuZ2V0U3RhcnRPZmZzZXQoKSwgcmVtb3ZlLmdldEVuZE9mZnNldCgpIC0gcmVtb3ZlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJfQotCQkJcmV0dXJuIGZvcm1hdHRlci5mb3JtYXRCZWZvcmUocGFyZW50Tm9kZSwgbm9kZSwgZXhjZXB0Rm9yKS50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VGV4dEVuZChJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBlbmQgPSAtMTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQllbmQgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJZW5kID0gKChDU1NSZWdpb25Db250YWluZXIpIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VGV4dFN0YXJ0KElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IHN0YXJ0ID0gLTE7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJc3RhcnQgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCQlzdGFydCA9ICgoQ1NTUmVnaW9uQ29udGFpbmVyKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGluc2VydFRleHQoaW50IHN0YXJ0LCBpbnQgb2xkTGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlCYXNpY1N0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlpZiAodGV4dCAhPSBudWxsICYmIDAgPCBvbGRMZW5ndGggJiYgc3RhcnQgKyBvbGRMZW5ndGggPD0gc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJLy8gbWluaW1pemUgdGV4dCBjaGFuZ2UKLQkJCQlTdHJpbmcgZGVsVGV4dCA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXQoc3RhcnQsIG9sZExlbmd0aCk7Ci0JCQkJaW50IG5ld0xlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0JCQkJaW50IHNob3J0ZXJMZW4gPSBNYXRoLm1pbihvbGRMZW5ndGgsIG5ld0xlbmd0aCk7Ci0JCQkJaW50IHN0TWF0Y2hMZW47Ci0JCQkJZm9yIChzdE1hdGNoTGVuID0gMDsgc3RNYXRjaExlbiA8IHNob3J0ZXJMZW4gJiYgdGV4dC5jaGFyQXQoc3RNYXRjaExlbikgPT0gZGVsVGV4dC5jaGFyQXQoc3RNYXRjaExlbik7IHN0TWF0Y2hMZW4rKykgewotCQkJCQkvLyAKLQkJCQl9Ci0JCQkJaWYgKDAgPCBzdE1hdGNoTGVuICYmIHN0TWF0Y2hMZW4gPCBzaG9ydGVyTGVuICYmIHRleHQuY2hhckF0KHN0TWF0Y2hMZW4gLSAxKSA9PSAweDAwMGQgJiYgKHRleHQuY2hhckF0KHN0TWF0Y2hMZW4pID09IDB4MDAwYSB8fCBkZWxUZXh0LmNoYXJBdChzdE1hdGNoTGVuKSA9PSAweDAwMGEpKSB7Ci0JCQkJCS8vIG11c3Qgbm90IGRpdmlkZSAwZC0+MGEgc2VxdWVuY2UKLQkJCQkJc3RNYXRjaExlbi0tOwotCQkJCX0KLQkJCQlpZiAoc3RNYXRjaExlbiA9PSBzaG9ydGVyTGVuKSB7Ci0JCQkJCWlmIChvbGRMZW5ndGggPCBuZXdMZW5ndGgpIHsgLy8ganVzdCBpbnNlcnQKLQkJCQkJCW9sZExlbmd0aCA9IDA7Ci0JCQkJCQlzdGFydCArPSBzdE1hdGNoTGVuOwotCQkJCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKHN0TWF0Y2hMZW4pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG5ld0xlbmd0aCA8IG9sZExlbmd0aCkgeyAvLyBqdXN0IHJlbW92ZQotCQkJCQkJb2xkTGVuZ3RoIC09IHN0TWF0Y2hMZW47Ci0JCQkJCQlzdGFydCArPSBzdE1hdGNoTGVuOwotCQkJCQkJdGV4dCA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7IC8vIG5vdGhpbmcgdG8gZG8KLQkJCQkJCW9sZExlbmd0aCA9IDA7Ci0JCQkJCQl0ZXh0ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaW50IGVkTWF0Y2hMZW47Ci0JCQkJCWZvciAoZWRNYXRjaExlbiA9IDA7IHN0TWF0Y2hMZW4gKyBlZE1hdGNoTGVuIDwgc2hvcnRlckxlbiAmJiB0ZXh0LmNoYXJBdChuZXdMZW5ndGggLSBlZE1hdGNoTGVuIC0gMSkgPT0gZGVsVGV4dC5jaGFyQXQob2xkTGVuZ3RoIC0gZWRNYXRjaExlbiAtIDEpOyBlZE1hdGNoTGVuKyspIHsKLQkJCQkJCS8vCi0JCQkJCX0KLQkJCQkJaWYgKDAgPCBlZE1hdGNoTGVuICYmIHRleHQuY2hhckF0KG5ld0xlbmd0aCAtIGVkTWF0Y2hMZW4pID09IDB4MDAwYSAmJiAoKGVkTWF0Y2hMZW4gPCBuZXdMZW5ndGggJiYgdGV4dC5jaGFyQXQobmV3TGVuZ3RoIC0gZWRNYXRjaExlbiAtIDEpID09IDB4MDAwZCkgfHwgKGVkTWF0Y2hMZW4gPCBvbGRMZW5ndGggJiYgZGVsVGV4dC5jaGFyQXQob2xkTGVuZ3RoIC0gZWRNYXRjaExlbiAtIDEpID09IDB4MDAwZCkpKSB7Ci0JCQkJCQkvLyBtdXN0IG5vdCBkaXZpZGUgMGQtPjBhIHNlcXVlbmNlCi0JCQkJCQllZE1hdGNoTGVuLS07Ci0JCQkJCX0KLQkJCQkJb2xkTGVuZ3RoIC09IHN0TWF0Y2hMZW4gKyBlZE1hdGNoTGVuOwotCQkJCQlzdGFydCArPSBzdE1hdGNoTGVuOwotCQkJCQlpZiAoc3RNYXRjaExlbiArIGVkTWF0Y2hMZW4gPCBuZXdMZW5ndGgpIHsKLQkJCQkJCXRleHQgPSB0ZXh0LnN1YnN0cmluZyhzdE1hdGNoTGVuLCBuZXdMZW5ndGggLSBlZE1hdGNoTGVuKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXRleHQgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKDAgPCBvbGRMZW5ndGggfHwgdGV4dCAhPSBudWxsKSB7Ci0JCQkJLy8gU3RyaW5nIGRlbFRleHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KHN0YXJ0LCBvbGRMZW5ndGgpOwotCQkJCXJlc3VsdCA9IHN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChmTW9kZWwsIHN0YXJ0LCBvbGRMZW5ndGgsIHRleHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcml2YXRlIGludCBuZWFyZXN0U3BhY2VMZW5ndGhBZnRlcihDU1NOb2RlSW1wbCBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKG5vZGUpOwotCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBmb3JtYXR0ZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKG5vZGUsIGluc2VydFBvcyk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcml2YXRlIGludCBuZWFyZXN0U3BhY2VMZW5ndGhCZWZvcmUoQ1NTTm9kZUltcGwgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihub2RlKTsKLQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZm9ybWF0dGVyLmdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUobm9kZSwgaW5zZXJ0UG9zKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlbW92ZVRleHQoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZk1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChmTW9kZWwsIHN0YXJ0LCBsZW5ndGgsIG5ldyBTdHJpbmcoIiIpKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFBhcnNlcihDU1NNb2RlbFBhcnNlciBwYXJzZXIpIHsKLQkJZlBhcnNlciA9IHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHZhbHVlQ2hhbmdlZChDU1NOb2RlSW1wbCBub2RlLCBTdHJpbmcgb2xkVmFsdWUpIHsKLQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIlRvbyBCYWQuLiIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkoKG5vZGUgPT0gbnVsbCkgPyAibnVsbCIgOiBub2RlLmdldENsYXNzKCkudG9TdHJpbmcoKSkpOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzdGFydCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSkgewotCQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZTsKLQkJCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBhdHRyLmdldE93bmVyQ1NTTm9kZSgpKTsKLQkJCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCkKLQkJCQlzdGFydCA9IGZvcm1hdHRlci5nZXRBdHRySW5zZXJ0UG9zKGF0dHIuZ2V0T3duZXJDU1NOb2RlKCksIGF0dHIuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCWludCBvbGRMZW5ndGggPSAob2xkVmFsdWUgPT0gbnVsbCkgPyAwIDogb2xkVmFsdWUubGVuZ3RoKCk7Ci0JCS8vIGZsYXNoIG9sZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uL0lUZXh0UmVnaW9uCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkoKENTU1JlZ2lvbkNvbnRhaW5lcikgbm9kZSkuc2V0UmFuZ2VSZWdpb24obnVsbCwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgbmV3IHNvdXJjZQotCQlTdHJpbmcgbmV3VmFsdWUgPSBub2RlLmdlbmVyYXRlU291cmNlKCk7Ci0KLQkJSUNTU05vZGUgcGFyZW50OwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSkgewotCQkJcGFyZW50ID0gKChJQ1NTQXR0cikgbm9kZSkuZ2V0T3duZXJDU1NOb2RlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCi0JCWZQYXJzZXIuc2V0dXBVcGRhdGVDb250ZXh0KENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfQ0hBTkdFX1JDT05UQUlORVIsIHBhcmVudCwgbm9kZSk7Ci0KLQkJaW5zZXJ0VGV4dChzdGFydCwgb2xkTGVuZ3RoLCBuZXdWYWx1ZSk7Ci0KLQkJZlBhcnNlci5jbGVhbnVwVXBkYXRlQ29udGV4dCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODdiMDExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUnVsZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTTW9kZWxVdGlsIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBib29sZWFuIGNhbkNvbnRhaW5CcmFjZShJQ1NTTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsICYmIChub2RlIGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIgfHwgbm9kZSBpbnN0YW5jZW9mIENTU1J1bGVEZWNsQ29udGFpbmVyKSkgPyB0cnVlIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlzdGF0aWMgdm9pZCBjbGVhbnVwQ29udGFpbmVyKElDU1NOb2RlIHBhcmVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQljbGVhbnVwQ29udGFpbmVyKGNoaWxkKTsKLQkJfQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCSgoQ1NTUmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpLnNldFJhbmdlUmVnaW9uKG51bGwsIG51bGwsIG51bGwpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gZGlhZ25vc2VOb2RlKElDU1NOb2RlIHBhcmVudCwgSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJLy8gY2hlY2sgdGhpcwotCQlWZWN0b3IgZXJyb3JzID0gbmV3IFZlY3RvcigpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgbm9kZSA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudDsKLQkJCVN0cmluZyBub2RlVGV4dCA9IENTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkgKyAiOiAiOy8vJE5PTi1OTFMtMSQKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCAmJiAoIShub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgfHwgbm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXRJbXBsKSB8fCBub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSkgewotCQkJCWVycm9ycy5hZGQobm9kZVRleHQgKyAiZmlyc3QgZmxhdCBub2RlIGlzIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbW9kZWxOb2RlKSB7Ci0JCQkJCWVycm9ycy5hZGQobm9kZVRleHQgKyAiZmlyc3QgZmxhdCBub2RlIGlzIG5vdCBpbiBtb2RlbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWZsYXROb2RlID0gbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCAmJiAoIShub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgfHwgbm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXRJbXBsKSB8fCBub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSkgewotCQkJCWVycm9ycy5hZGQobm9kZVRleHQgKyAibGFzdCBmbGF0IG5vZGUgaXMgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGZsYXROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWlmIChmbGF0Tm9kZSAhPSBtb2RlbE5vZGUpIHsKLQkJCQkJZXJyb3JzLmFkZChub2RlVGV4dCArICJsYXN0IGZsYXQgbm9kZSBpcyBub3QgaW4gbW9kZWwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlDU1NSZWdpb25Db250YWluZXIgbm9kZSA9IChDU1NSZWdpb25Db250YWluZXIpIHBhcmVudDsKLQkJCVN0cmluZyBub2RlVGV4dCA9IENTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkgKyAiOiAiOy8vJE5PTi1OTFMtMSQKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5vZGUuZ2V0Rmlyc3RSZWdpb24oKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50UmVnaW9uID0gbm9kZS5nZXREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsICYmICghKG5vZGUgaW5zdGFuY2VvZiBNZWRpYUxpc3RJbXBsKSB8fCBub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSkgewotCQkJCWVycm9ycy5hZGQobm9kZVRleHQgKyAiZmlyc3QgcmVnaW9uIGlzIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJSVRleHRSZWdpb24gbW9kZWxSZWdpb24gPSBtb2RlbE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlpZiAocmVnaW9uICE9IG1vZGVsUmVnaW9uKSB7Ci0JCQkJCWVycm9ycy5hZGQobm9kZVRleHQgKyAiZmlyc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsICYmICghKG5vZGUgaW5zdGFuY2VvZiBNZWRpYUxpc3RJbXBsKSB8fCBub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSkgewotCQkJCWVycm9ycy5hZGQobm9kZVRleHQgKyAibGFzdCByZWdpb24gaXMgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtb2RlbE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlJVGV4dFJlZ2lvbiBtb2RlbFJlZ2lvbiA9IG1vZGVsTm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCWlmIChyZWdpb24gIT0gbW9kZWxSZWdpb24pIHsKLQkJCQkJZXJyb3JzLmFkZChub2RlVGV4dCArICJsYXN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJQ1NTTm9kZUxpc3QgYXR0cnMgPSBwYXJlbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgbkF0dHJzID0gYXR0cnMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJzOyBpKyspIHsKLQkJCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQlDU1NSZWdpb25Db250YWluZXIgbm9kZSA9IChDU1NSZWdpb25Db250YWluZXIpIGF0dHI7Ci0JCQlTdHJpbmcgbm9kZVRleHQgPSBDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpICsgIigiICsgYXR0ci5nZXROYW1lKCkgKyAiKTogIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbm9kZS5nZXRGaXJzdFJlZ2lvbigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnRSZWdpb24gPSBub2RlLmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwgJiYgMCA8IGF0dHIuZ2V0VmFsdWUoKS5sZW5ndGgoKSkgewotCQkJCWVycm9ycy5hZGQobm9kZVRleHQgKyAiZmlyc3QgcmVnaW9uIGlzIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJSVRleHRSZWdpb24gbW9kZWxSZWdpb24gPSBtb2RlbE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlpZiAocmVnaW9uICE9IG1vZGVsUmVnaW9uKSB7Ci0JCQkJCWVycm9ycy5hZGQobm9kZVRleHQgKyAiZmlyc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsICYmIDAgPCBhdHRyLmdldFZhbHVlKCkubGVuZ3RoKCkpIHsKLQkJCQllcnJvcnMuYWRkKG5vZGVUZXh0ICsgImxhc3QgcmVnaW9uIGlzIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJSVRleHRSZWdpb24gbW9kZWxSZWdpb24gPSBtb2RlbE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlpZiAocmVnaW9uICE9IG1vZGVsUmVnaW9uKSB7Ci0JCQkJCWVycm9ycy5hZGQobm9kZVRleHQgKyAibGFzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFlcnJvcnMuaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBpID0gZXJyb3JzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NVdGlsLmRlYnVnT3V0KChTdHJpbmcpIGkubmV4dCgpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gZGlhZ25vc2VUcmVlKElDU1NOb2RlIHBhcmVudCwgSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gY2hlY2sgY2hpbGRyZW4KLQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJZGlhZ25vc2VUcmVlKGNoaWxkLCBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0KLQkJZGlhZ25vc2VOb2RlKHBhcmVudCwgc3RydWN0dXJlZERvY3VtZW50KTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBuZWVkZWQsIG1vZGlmeSBsYXN0IGZsYXQgbm9kZQotCSAqLwotCXN0YXRpYyB2b2lkIGV4cGFuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcihDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgdGFyZ2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCB8fCBmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gdGFyZ2V0LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGxhc3ROb2RlID09IGZsYXROb2RlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGxhc3ROb2RlID09IG51bGwgfHwgbGFzdE5vZGUuZ2V0U3RhcnQoKSA8IGZsYXROb2RlLmdldFN0YXJ0KCkpIHsKLQkJCXRhcmdldC5zZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJfQotCX0KLQotCS8qCi0JICogCi0JICovCi0Jc3RhdGljIElDU1NOb2RlIGZpbmRCcmFjZUNvbnRhaW5lcihJQ1NTTm9kZSBub2RlKSB7Ci0JCWZvciAoSUNTU05vZGUgaSA9IG5vZGU7IGkgIT0gbnVsbDsgaSA9IGkuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAoQ1NTTW9kZWxVdGlsLmNhbkNvbnRhaW5CcmFjZShpKSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBpbnQgZ2V0RGVwdGgoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgZGVwdGggPSAtMTsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJZGVwdGgrKzsKLQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNCcmFjZUNsb3NlZChJQ1NTTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gYkNsb3NlZCA9IHRydWU7Ci0JCWlmICghKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCQlyZXR1cm4gYkNsb3NlZDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3QgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0ID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZpcnN0ID09IG51bGwgfHwgbGFzdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gYkNsb3NlZDsKLQkJfQotCQlpZiAobGFzdC5nZXRTdGFydCgpIDwgZmlyc3QuZ2V0U3RhcnQoKSkgewotCQkJcmV0dXJuIGJDbG9zZWQ7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZmlyc3Q7Ci0JCWludCBuT3BlbiA9IDA7Ci0JCWludCBuQ2xvc2UgPSAwOwotCQlkbyB7Ci0JCQlTdHJpbmcgdHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJbk9wZW4rKzsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJCW5DbG9zZSsrOwotCQkJfQotCQkJZmxhdE5vZGUgPSBmbGF0Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKGZsYXROb2RlICE9IG51bGwgJiYgZmxhdE5vZGUgIT0gbGFzdCk7Ci0KLQkJaWYgKChuT3BlbiA9PSAwICYmIG5DbG9zZSA9PSAwKSB8fCBuQ2xvc2UgPCBuT3BlbikgewotCQkJYkNsb3NlZCA9IGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGJDbG9zZWQ7Ci0JfQotCi0JLyoqCi0JICogb25seSBmb3IgaW5zZXJ0aW9uLi4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBpc0ludGVycnVwdGlvbihDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgdGFyZ2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCB8fCBmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IHN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSB0YXJnZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IHRhcmdldC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdE5vZGUgIT0gbnVsbCAmJiBmaXJzdE5vZGUuZ2V0U3RhcnQoKSA8IHN0YXJ0ICYmIGxhc3ROb2RlICE9IG51bGwgJiYgc3RhcnQgPCBsYXN0Tm9kZS5nZXRTdGFydCgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNQYXJlbnRPZihJQ1NTTm9kZSBwYXJlbnQsIElDU1NOb2RlIGNoaWxkKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBjaGlsZDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChwYXJlbnQgPT0gbm9kZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTmFtZWROb2RlTWFwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjExNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOYW1lZE5vZGVNYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTTmFtZWROb2RlTWFwSW1wbCBleHRlbmRzIENTU05vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIElDU1NOYW1lZE5vZGVNYXAgewotCi0JLyoqCi0JICogQ1NTTmFtZWROb2RlTWFwSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU05hbWVkTm9kZU1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIElDU1NOb2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdCA9IG5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ1NTQXR0ckltcGwgJiYgKChDU1NBdHRySW1wbCkgb2JqKS5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShuYW1lKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIChJQ1NTTm9kZSkgb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzN2RhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydFJ1bGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3ROb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENTU05vZGVJbXBsIGV4dGVuZHMgQWJzdHJhY3ROb3RpZmllciBpbXBsZW1lbnRzIElDU1NOb2RlLCBJbmRleGVkUmVnaW9uIHsKLQotCXByaXZhdGUgQ1NTRG9jdW1lbnRJbXBsIGZPd25lckRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZQYXJlbnROb2RlID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZOZXh0U2libGluZyA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmUHJldmlvdXNTaWJsaW5nID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZGaXJzdENoaWxkID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZMYXN0Q2hpbGQgPSBudWxsOwotCXByb3RlY3RlZCBDU1NOYW1lZE5vZGVNYXBJbXBsIGZBdHRycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NOb2RlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU05vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU05vZGVJbXBsKENTU05vZGVJbXBsIHRoYXQpIHsKLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5mT3duZXJEb2N1bWVudCA9IHRoYXQuZk93bmVyRG9jdW1lbnQ7Ci0JCQlpZiAodGhhdC5mQXR0cnMgIT0gbnVsbCkgewotCQkJCWludCBuQXR0cnMgPSB0aGF0LmZBdHRycy5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyczsgaSsrKSB7Ci0JCQkJCUNTU0F0dHJJbXBsIGF0dHIgPSAoQ1NTQXR0ckltcGwpIHRoYXQuZkF0dHJzLml0ZW0oaSk7Ci0JCQkJCXNldEF0dHJpYnV0ZShhdHRyLmdldE5hbWUoKSwgYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTTm9kZUltcGwgYXBwZW5kQ2hpbGQoQ1NTTm9kZUltcGwgbmV3Q2hpbGQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCBudWxsKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9uZUNoaWxkTm9kZXMoSUNTU05vZGUgbmV3UGFyZW50LCBib29sZWFuIGRlZXApIHsKLQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudCA9PSB0aGlzKQotCQkJcmV0dXJuOwotCi0JCUNTU05vZGVJbXBsIGNvbnRhaW5lciA9IChDU1NOb2RlSW1wbCkgbmV3UGFyZW50OwotCQljb250YWluZXIucmVtb3ZlQ2hpbGROb2RlcygpOwotCi0JCWZvciAoSUNTU05vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJQ1NTTm9kZUltcGwgY2xvbmVkID0gKENTU05vZGVJbXBsKSBjaGlsZC5jbG9uZU5vZGUoZGVlcCk7Ci0JCQlpZiAoY2xvbmVkICE9IG51bGwpCi0JCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKGNsb25lZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiAoZ2V0U3RhcnRPZmZzZXQoKSA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgZ2V0RW5kT2Zmc2V0KCkpOwotCX0KLQotCS8qKgotCSAqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdGVTb3VyY2UoKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKHRoaXMpOwotCQlyZXR1cm4gZm9ybWF0dGVyLmZvcm1hdCh0aGlzKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IGdldEF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ1NTQXR0ckltcGwgZ2V0QXR0cmlidXRlTm9kZShTdHJpbmcgbmFtZSkgewotCQlpZiAoZkF0dHJzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgbkF0dHJzID0gZkF0dHJzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyczsgaSsrKSB7Ci0JCQlDU1NBdHRySW1wbCBhdHRyID0gKENTU0F0dHJJbXBsKSBmQXR0cnMuaXRlbShpKTsKLQkJCWlmIChhdHRyLm1hdGNoTmFtZShuYW1lKSkKLQkJCQlyZXR1cm4gYXR0cjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgSUNTU05hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlpZiAoZkF0dHJzID09IG51bGwpCi0JCQlmQXR0cnMgPSBuZXcgQ1NTTmFtZWROb2RlTWFwSW1wbCgpOwotCQlyZXR1cm4gZkF0dHJzOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJQ1NTTm9kZUxpc3RJbXBsIGxpc3QgPSBuZXcgQ1NTTm9kZUxpc3RJbXBsKCk7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlsaXN0LmFwcGVuZE5vZGUobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JSUNTU05vZGUgZ2V0Q29tbW9uQW5jZXN0b3IoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChJQ1NTTm9kZSBuYSA9IG5vZGU7IG5hICE9IG51bGw7IG5hID0gbmEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlmb3IgKElDU1NOb2RlIHRhID0gdGhpczsgdGEgIT0gbnVsbDsgdGEgPSB0YS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAodGEgPT0gbmEpCi0JCQkJCXJldHVybiB0YTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQlDU1NEb2N1bWVudEltcGwgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKSB7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IHRoaXM7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU0RvY3VtZW50SW1wbCkgewotCQkJCUNTU0RvY3VtZW50SW1wbCBkb2MgPSAoQ1NTRG9jdW1lbnRJbXBsKSBub2RlOwotCQkJCWlmIChkb2MuaXNEb2N1bWVudCgpKQotCQkJCQlyZXR1cm4gZG9jOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUNTU05vZGVJbXBsIGdldENvbnRhaW5lck5vZGUoaW50IG9mZnNldCkgewotCQlpZiAoIWNvbnRhaW5zKG9mZnNldCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCUlDU1NOb2RlIGZvdW5kID0gKChDU1NOb2RlSW1wbCkgY2hpbGQpLmdldENvbnRhaW5lck5vZGUob2Zmc2V0KTsKLQkJCWlmIChmb3VuZCAhPSBudWxsKQotCQkJCXJldHVybiAoQ1NTTm9kZUltcGwpIGZvdW5kOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJRmFjdG9yeVJlZ2lzdHJ5IHJlZyA9IG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQkJaWYgKHJlZyAhPSBudWxsKQotCQkJCXJldHVybiByZWc7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmZGaXJzdENoaWxkOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmZMYXN0Q2hpbGQ7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldE5leHRTaWJsaW5nKCkgewotCQlyZXR1cm4gdGhpcy5mTmV4dFNpYmxpbmc7Ci0JfQotCi0JSUNTU05vZGUgZ2V0Tm9kZUF0KGludCBvZmZzZXQpIHsKLQkJLy8gdGhlIHNhbWUgYXMgZ2V0Q29udGFpbmVyTm9kZSgpCi0JCXJldHVybiBnZXRDb250YWluZXJOb2RlKG9mZnNldCk7Ci0JfQotCi0JcHVibGljIElDU1NEb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotCQlyZXR1cm4gdGhpcy5mT3duZXJEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZlBhcmVudE5vZGU7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZlByZXZpb3VzU2libGluZzsKLQl9Ci0KLQlJQ1NTTm9kZSBnZXRSb290Tm9kZSgpIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gKENTU05vZGVJbXBsKSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiB0aGlzOwotCQlyZXR1cm4gcGFyZW50LmdldFJvb3ROb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLQkJcmV0dXJuICh0aGlzLmZGaXJzdENoaWxkICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTTm9kZUltcGwgaW5zZXJ0QmVmb3JlKENTU05vZGVJbXBsIG5ld0NoaWxkLCBDU1NOb2RlSW1wbCByZWZDaGlsZCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTTm9kZUltcGwgY2hpbGQgPSBuZXdDaGlsZDsKLQkJQ1NTTm9kZUltcGwgbmV4dCA9IHJlZkNoaWxkOwotCQlDU1NOb2RlSW1wbCBwcmV2ID0gbnVsbDsKLQkJaWYgKG5leHQgPT0gbnVsbCkgewotCQkJcHJldiA9IHRoaXMuZkxhc3RDaGlsZDsKLQkJCXRoaXMuZkxhc3RDaGlsZCA9IGNoaWxkOwotCQl9Ci0JCWVsc2UgewotCQkJcHJldiA9IChDU1NOb2RlSW1wbCkgbmV4dC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCW5leHQuc2V0UHJldmlvdXNTaWJsaW5nKGNoaWxkKTsKLQkJfQotCi0JCWlmIChwcmV2ID09IG51bGwpCi0JCQl0aGlzLmZGaXJzdENoaWxkID0gY2hpbGQ7Ci0JCWVsc2UKLQkJCXByZXYuc2V0TmV4dFNpYmxpbmcoY2hpbGQpOwotCQljaGlsZC5zZXRQcmV2aW91c1NpYmxpbmcocHJldik7Ci0JCWNoaWxkLnNldE5leHRTaWJsaW5nKG5leHQpOwotCQljaGlsZC5zZXRQYXJlbnROb2RlKHRoaXMpOwotCi0JCW5vdGlmeUNoaWxkUmVwbGFjZWQoY2hpbGQsIG51bGwpOwotCi0JCXJldHVybiBuZXdDaGlsZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlBdHRyUmVwbGFjZWQoQ1NTTm9kZUltcGwgbmV3QXR0ciwgQ1NTTm9kZUltcGwgb2xkQXR0cikgewotCQkvLyBmb3IgbW9kZWwKLQkJSUNTU0RvY3VtZW50IGRvYyA9IGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ1NTTW9kZWxJbXBsIG1vZGVsID0gKENTU01vZGVsSW1wbCkgZG9jLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5hdHRyUmVwbGFjZWQodGhpcywgbmV3QXR0ciwgb2xkQXR0cik7Ci0KLQkJLy8gZm9yIGFkYXB0ZXJzCi0JCWludCB0eXBlID0gQ0hBTkdFOwotCQlpZiAobmV3QXR0ciA9PSBudWxsKQotCQkJdHlwZSA9IFJFTU9WRTsKLQkJZWxzZSBpZiAob2xkQXR0ciA9PSBudWxsKQotCQkJdHlwZSA9IEFERDsKLQkJbm90aWZ5KHR5cGUsIG9sZEF0dHIsIG9sZEF0dHIsIG5ld0F0dHIsIGdldFN0YXJ0T2Zmc2V0KCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUNoaWxkUmVwbGFjZWQoQ1NTTm9kZUltcGwgbmV3Q2hpbGQsIENTU05vZGVJbXBsIG9sZENoaWxkKSB7Ci0JCS8vIGZvciBtb2RlbAotCQlJQ1NTRG9jdW1lbnQgZG9jID0gZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDU1NNb2RlbEltcGwgbW9kZWwgPSAoQ1NTTW9kZWxJbXBsKSBkb2MuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLmNoaWxkUmVwbGFjZWQodGhpcywgbmV3Q2hpbGQsIG9sZENoaWxkKTsKLQotCQkvLyBmb3IgYWRhcHRlcnMKLQkJaW50IHR5cGUgPSBDSEFOR0U7Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsKQotCQkJdHlwZSA9IFJFTU9WRTsKLQkJZWxzZSBpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXR5cGUgPSBBREQ7Ci0JCW5vdGlmeSh0eXBlLCBvbGRDaGlsZCwgb2xkQ2hpbGQsIG5ld0NoaWxkLCBnZXRTdGFydE9mZnNldCgpKTsKLQl9Ci0KLQl2b2lkIHJlbW92ZUF0dHJpYnV0ZU5vZGUoQ1NTTm9kZUltcGwgYXR0cikgewotCQkvLyBmaW5kCi0JCWludCBuQXR0cnMgPSBmQXR0cnMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJzOyBpKyspIHsKLQkJCWlmIChmQXR0cnMuaXRlbShpKSA9PSBhdHRyKSB7Ci0JCQkJZkF0dHJzLnJlbW92ZU5vZGUoaSk7Ci0JCQkJbm90aWZ5QXR0clJlcGxhY2VkKG51bGwsIGF0dHIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBDU1NOb2RlSW1wbCByZW1vdmVDaGlsZChDU1NOb2RlSW1wbCBvbGRDaGlsZCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvbGRDaGlsZC5nZXRQYXJlbnROb2RlKCkgIT0gdGhpcykKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGNsb3NlIGltcG9ydCBydWxlcwotCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3RvcigpOwotCQl0cmF2LmFwcGx5KG9sZENoaWxkKTsKLQkJSXRlcmF0b3IgaXQgPSB0cmF2LmdldFJ1bGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJKChDU1NJbXBvcnRSdWxlSW1wbCkgaXQubmV4dCgpKS5jbG9zZVN0eWxlU2hlZXQoKTsKLQkJfQotCi0JCUNTU05vZGVJbXBsIGNoaWxkID0gb2xkQ2hpbGQ7Ci0JCUNTU05vZGVJbXBsIHByZXYgPSAoQ1NTTm9kZUltcGwpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQlDU1NOb2RlSW1wbCBuZXh0ID0gKENTU05vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCi0JCWlmIChwcmV2ID09IG51bGwpCi0JCQl0aGlzLmZGaXJzdENoaWxkID0gbmV4dDsKLQkJZWxzZQotCQkJcHJldi5zZXROZXh0U2libGluZyhuZXh0KTsKLQotCQlpZiAobmV4dCA9PSBudWxsKQotCQkJdGhpcy5mTGFzdENoaWxkID0gcHJldjsKLQkJZWxzZQotCQkJbmV4dC5zZXRQcmV2aW91c1NpYmxpbmcocHJldik7Ci0KLQkJY2hpbGQuc2V0UHJldmlvdXNTaWJsaW5nKG51bGwpOwotCQljaGlsZC5zZXROZXh0U2libGluZyhudWxsKTsKLQkJY2hpbGQuc2V0UGFyZW50Tm9kZShudWxsKTsKLQotCQlub3RpZnlDaGlsZFJlcGxhY2VkKG51bGwsIGNoaWxkKTsKLQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZW1vdmVDaGlsZE5vZGVzKCkgewotCQlJQ1NTTm9kZSBuZXh0Q2hpbGQgPSBudWxsOwotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IG5leHRDaGlsZCkgewotCQkJbmV4dENoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENTU05vZGVJbXBsIHJlcGxhY2VDaGlsZChDU1NOb2RlSW1wbCBuZXdDaGlsZCwgQ1NTTm9kZUltcGwgb2xkQ2hpbGQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpCi0JCQlpbnNlcnRCZWZvcmUobmV3Q2hpbGQsIG9sZENoaWxkKTsKLQkJcmV0dXJuIHJlbW92ZUNoaWxkKG9sZENoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICoKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ1NTQXR0ckltcGwgYXR0ciA9IGdldEF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCVN0cmluZyBvbGRWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpCi0JCQkJcmV0dXJuOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZkF0dHJzID09IG51bGwpCi0JCQkJZkF0dHJzID0gbmV3IENTU05hbWVkTm9kZU1hcEltcGwoKTsKLQkJCUNTU0RvY3VtZW50SW1wbCBkb2MgPSAoQ1NTRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJYXR0ciA9IChDU1NBdHRySW1wbCkgZG9jLmNyZWF0ZUNTU0F0dHIobmFtZSk7Ci0JCQlhdHRyLnNldE93bmVyQ1NTTm9kZSh0aGlzKTsKLQkJCWZBdHRycy5hcHBlbmROb2RlKGF0dHIpOwotCQkJbm90aWZ5QXR0clJlcGxhY2VkKGF0dHIsIG51bGwpOwotCQl9Ci0JCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjc3NUZXh0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3NzVGV4dChTdHJpbmcgY3NzVGV4dCkgewotCQkvLyBUT0RPIDogY2FsbCBmbGF0IG1vZGVsIHBhcnNlciBhbmQgcmVwbGFjZSBteXNlbGYgd2l0aCBuZXcgdGhyZWUhIQotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5leHRTaWJsaW5nKElDU1NOb2RlIG5leHRTaWJsaW5nKSB7Ci0JCXRoaXMuZk5leHRTaWJsaW5nID0gKENTU05vZGVJbXBsKSBuZXh0U2libGluZzsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPd25lckRvY3VtZW50KElDU1NEb2N1bWVudCBvd25lckRvY3VtZW50KSB7Ci0JCXRoaXMuZk93bmVyRG9jdW1lbnQgPSAoQ1NTRG9jdW1lbnRJbXBsKSBvd25lckRvY3VtZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQYXJlbnROb2RlKElDU1NOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5mUGFyZW50Tm9kZSA9IChDU1NOb2RlSW1wbCkgcGFyZW50Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJldmlvdXNTaWJsaW5nKElDU1NOb2RlIHByZXZpb3VzU2libGluZykgewotCQl0aGlzLmZQcmV2aW91c1NpYmxpbmcgPSAoQ1NTTm9kZUltcGwpIHByZXZpb3VzU2libGluZzsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgc3RhcnQgPSBnZXRTdGFydE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPj0gMCkgewotCQkJaW50IGVuZCA9IGdldEVuZE9mZnNldCgpOwotCQkJaWYgKGVuZCA+PSAwKSB7Ci0JCQkJcmVzdWx0ID0gZW5kIC0gc3RhcnQ7Ci0JCQkJaWYgKHJlc3VsdCA8IC0xKSB7Ci0JCQkJCXJlc3VsdCA9IC0xOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDEzODcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGVMaXN0OwotCi1jbGFzcyBDU1NOb2RlTGlzdEltcGwgZXh0ZW5kcyBBYnN0cmFjdENTU05vZGVMaXN0IGltcGxlbWVudHMgSUNTU05vZGVMaXN0IHsKLQotCUNTU05vZGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGl0ZW1JbXBsKGluZGV4KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1BhZ2VSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQYWdlUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ5ZDU3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1BhZ2VSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NQYWdlUnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlRGVjbENvbnRhaW5lciBpbXBsZW1lbnRzIElDU1NQYWdlUnVsZSB7Ci0KLQlJQ1NTU2VsZWN0b3JMaXN0IGZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChudWxsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1BhZ2VSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NQYWdlUnVsZUltcGwoQ1NTUGFnZVJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTUGFnZVJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NQYWdlUnVsZUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBleHRyYWN0UHJlU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgcHJlU3RyID0gbmV3IFN0cmluZ0J1ZmZlcigiQHBhZ2UgIik7Ly8kTk9OLU5MUy0xJAotCQlwcmVTdHIuYXBwZW5kKGdldFNlbGVjdG9yVGV4dCgpKTsKLQotCQlyZXR1cm4gcHJlU3RyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFBBR0VSVUxFX05PREU7Ci0JfQotCi0JcHVibGljIElDU1NTZWxlY3Rvckxpc3QgZ2V0U2VsZWN0b3JzKCkgewotCQlyZXR1cm4gZlNlbGVjdG9yTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFyc2FibGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFnZSBzZWxlY3RvciBmb3IgdGhlIHJ1bGUuCi0JICogCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBDU1Mgc3RyaW5nIHZhbHVlIGhhcwotCSAqICAgICAgICAgICAgICAgIGEgc3ludGF4IGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBydWxlIGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclRleHQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoU0VMRUNUT1IpOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFBBR0VfUlVMRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RvclRleHQoU3RyaW5nIHNlbGVjdG9yVGV4dCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShTRUxFQ1RPUiwgc2VsZWN0b3JUZXh0KTsKLQkJZlNlbGVjdG9yTGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKHNlbGVjdG9yVGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQcmltaXRpdmVDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMWYxODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQcmltaXRpdmVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTUHJpbWl0aXZlQ29udGFpbmVyIGV4dGVuZHMgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHsKLQotCUNTU1ByaW1pdGl2ZUNvbnRhaW5lcihDU1NQcmltaXRpdmVDb250YWluZXIgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlDU1NQcmltaXRpdmVDb250YWluZXIoc2hvcnQgcHJpbWl0aXZlVHlwZSkgewotCQlzdXBlcihwcmltaXRpdmVUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0UHJpbWl0aXZlcygpOwotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3duZXJEb2N1bWVudChJQ1NTRG9jdW1lbnQgb3duZXJEb2N1bWVudCkgewotCQlzdXBlci5zZXRPd25lckRvY3VtZW50KG93bmVyRG9jdW1lbnQpOwotCi0JCWluaXRQcmltaXRpdmVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQcmltaXRpdmVWYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYmMwOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQcmltaXRpdmVWYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5Db3VudGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5SR0JDb2xvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuUmVjdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZXh0ZW5kcyBDU1NSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJQ1NTUHJpbWl0aXZlVmFsdWUgewotCi0JcHJvdGVjdGVkIHNob3J0IGZQcmltaXRpdmVUeXBlID0gQ1NTX1VOS05PV047Ci0JcHJpdmF0ZSBmbG9hdCBmRmxvYXRWYWx1ZSA9IDAuMGY7Ci0JcHJpdmF0ZSBTdHJpbmcgZlN0cmluZ1ZhbHVlID0gbnVsbDsKLQotCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbChDU1NQcmltaXRpdmVWYWx1ZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQl0aGlzLmZQcmltaXRpdmVUeXBlID0gdGhhdC5mUHJpbWl0aXZlVHlwZTsKLQkJdGhpcy5mRmxvYXRWYWx1ZSA9IHRoYXQuZkZsb2F0VmFsdWU7Ci0JCXRoaXMuZlN0cmluZ1ZhbHVlID0gdGhhdC5mU3RyaW5nVmFsdWU7Ci0JfQotCi0JQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHNob3J0IHByaW1pdGl2ZVR5cGUpIHsKLQkJc3VwZXIoKTsKLQkJZlByaW1pdGl2ZVR5cGUgPSBwcmltaXRpdmVUeXBlOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoaXMpOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIENvdW50ZXIgdmFsdWUuIElmIHRoaXMgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiBjb250YWluIGEgY291bnRlciB2YWx1ZSwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4KLQkgKiBNb2RpZmljYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgY2FuIGJlIGFjaGlldmVkIHVzaW5nCi0JICogdGhlIDxjb2RlPkNvdW50ZXI8L2NvZGU+IGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBDb3VudGVyIHZhbHVlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIENvdW50ZXIgdmFsdWUgKGUuZy4gdGhpcyBpcyBub3QKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5DU1NfQ09VTlRFUjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBDb3VudGVyIGdldENvdW50ZXJWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q1NTVmFsdWVUZXh0KCkgewotCQlyZXR1cm4gZ2V0Q3NzVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEEgY29kZSBkZWZpbmluZyB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgYXMgZGVmaW5lZCBhYm92ZS4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Q3NzVmFsdWVUeXBlKCkgewotCQlpZiAoZ2V0UHJpbWl0aXZlVHlwZSgpID09IENTU19JTkhFUklUX1BSSU1JVElWRSkgewotCQkJcmV0dXJuIENTU19JTkhFUklUOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENTU19QUklNSVRJVkVfVkFMVUU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCBhIGZsb2F0IHZhbHVlIGluIGEgc3BlY2lmaWVkIHVuaXQuIElmIHRoaXMKLQkgKiBDU1MgdmFsdWUgZG9lc24ndCBjb250YWluIGEgZmxvYXQgdmFsdWUgb3IgY2FuJ3QgYmUgY29udmVydGVkIGludG8gdGhlCi0JICogc3BlY2lmaWVkIHVuaXQsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuCi0JICogCi0JICogQHBhcmFtIHVuaXRUeXBlCi0JICogICAgICAgICAgICBBIHVuaXQgY29kZSB0byBnZXQgdGhlIGZsb2F0IHZhbHVlLiBUaGUgdW5pdCBjb2RlIGNhbiBvbmx5Ci0JICogICAgICAgICAgICBiZSBhIGZsb2F0IHVuaXQgdHlwZSAoaS5lLiA8Y29kZT5DU1NfTlVNQkVSPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19QRVJDRU5UQUdFPC9jb2RlPiw8Y29kZT5DU1NfRU1TPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19FWFM8L2NvZGU+LDxjb2RlPkNTU19QWDwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfQ008L2NvZGU+LDxjb2RlPkNTU19NTTwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfSU48L2NvZGU+LDxjb2RlPkNTU19QVDwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUEM8L2NvZGU+LDxjb2RlPkNTU19ERUc8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1JBRDwvY29kZT4sPGNvZGU+Q1NTX0dSQUQ8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX01TPC9jb2RlPiw8Y29kZT5DU1NfUzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfSFo8L2NvZGU+LDxjb2RlPkNTU19LSFo8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0RJTUVOU0lPTjwvY29kZT4pLgotCSAqIEByZXR1cm4gVGhlIGZsb2F0IHZhbHVlIGluIHRoZSBzcGVjaWZpZWQgdW5pdC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBmbG9hdCB2YWx1ZSBvciBpZiB0aGUgZmxvYXQgdmFsdWUgY2FuJ3QgYmUKLQkgKiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgaW50byB0aGUgc3BlY2lmaWVkIHVuaXQuCi0JICovCi0JcHVibGljIGZsb2F0IGdldEZsb2F0VmFsdWUoc2hvcnQgdW5pdFR5cGUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzd2l0Y2ggKGZQcmltaXRpdmVUeXBlKSB7Ci0JCQljYXNlIENTU19OVU1CRVIgOgotCQkJY2FzZSBDU1NfUEVSQ0VOVEFHRSA6Ci0JCQljYXNlIENTU19FTVMgOgotCQkJY2FzZSBDU1NfRVhTIDoKLQkJCWNhc2UgQ1NTX1BYIDoKLQkJCWNhc2UgQ1NTX0NNIDoKLQkJCWNhc2UgQ1NTX01NIDoKLQkJCWNhc2UgQ1NTX0lOIDoKLQkJCWNhc2UgQ1NTX1BUIDoKLQkJCWNhc2UgQ1NTX1BDIDoKLQkJCWNhc2UgQ1NTX0RFRyA6Ci0JCQljYXNlIENTU19SQUQgOgotCQkJY2FzZSBDU1NfR1JBRCA6Ci0JCQljYXNlIENTU19NUyA6Ci0JCQljYXNlIENTU19TIDoKLQkJCWNhc2UgQ1NTX0haIDoKLQkJCWNhc2UgQ1NTX0tIWiA6Ci0JCQljYXNlIENTU19ESU1FTlNJT04gOgotCQkJY2FzZSBDU1NfSU5URUdFUiA6Ci0JCQljYXNlIENTU19IQVNIIDoKLQkJCQlyZXR1cm4gZkZsb2F0VmFsdWU7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgyMDAxLzAxLzE3Ci0JICogMTI6MTI6MTgpCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFBSSU1JVElWRVZBTFVFX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGFzIGRlZmluZWQgYnkgdGhlIGNvbnN0YW50cyBzcGVjaWZpZWQgYWJvdmUuCi0JICovCi0JcHVibGljIHNob3J0IGdldFByaW1pdGl2ZVR5cGUoKSB7Ci0JCXJldHVybiBmUHJpbWl0aXZlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgUmVjdCB2YWx1ZS4gSWYgdGhpcyBDU1MgdmFsdWUgZG9lc24ndAotCSAqIGNvbnRhaW4gYSByZWN0IHZhbHVlLCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLgotCSAqIE1vZGlmaWNhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcKLQkgKiB0aGUgPGNvZGU+UmVjdDwvY29kZT4gaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIFJlY3QgdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiAgICAgICAgICAgICAgICBjb250YWluIGEgUmVjdCB2YWx1ZS4gKGUuZy4gdGhpcyBpcyBub3QKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5DU1NfUkVDVDwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBSZWN0IGdldFJlY3RWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIFJHQiBjb2xvci4gSWYgdGhpcyBDU1MgdmFsdWUgZG9lc24ndAotCSAqIGNvbnRhaW4gYSBSR0IgY29sb3IgdmFsdWUsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuCi0JICogTW9kaWZpY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IGNhbiBiZSBhY2hpZXZlZCB1c2luZwotCSAqIHRoZSA8Y29kZT5SR0JDb2xvcjwvY29kZT4gaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFJHQiBjb2xvciB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBhdHRhY2hlZCBwcm9wZXJ0eQotCSAqICAgICAgICAgICAgICAgIGNhbid0IHJldHVybiBhIFJHQiBjb2xvciB2YWx1ZSAoZS5nLiB0aGlzIGlzIG5vdAotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkNTU19SR0JDT0xPUjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBSR0JDb2xvciBnZXRSR0JDb2xvclZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgc3RyaW5nIHZhbHVlLiBJZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiBjb250YWluIGEgc3RyaW5nIHZhbHVlLCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLiBTb21lCi0JICogcHJvcGVydGllcyAobGlrZSAnZm9udC1mYW1pbHknIG9yICd2b2ljZS1mYW1pbHknKSBjb252ZXJ0IGEgd2hpdGVzcGFjZQotCSAqIHNlcGFyYXRlZCBsaXN0IG9mIGlkZW50cyB0byBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgdmFsdWUgaW4gdGhlIGN1cnJlbnQgdW5pdC4gVGhlIGN1cnJlbnQKLQkgKiAgICAgICAgIDxjb2RlPnByaW1pdGl2ZVR5cGU8L2NvZGU+IGNhbiBvbmx5IGJlIGEgc3RyaW5nIHVuaXQgdHlwZQotCSAqICAgICAgICAgKGkuZS4gPGNvZGU+Q1NTX1NUUklORzwvY29kZT4sPGNvZGU+Q1NTX1VSSTwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5DU1NfSURFTlQ8L2NvZGU+IGFuZCA8Y29kZT5DU1NfQVRUUjwvY29kZT4pLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIHN0cmluZyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAoZlByaW1pdGl2ZVR5cGUpIHsKLQkJCWNhc2UgQ1NTX1NUUklORyA6Ci0JCQljYXNlIENTU19VUkkgOgotCQkJY2FzZSBDU1NfSURFTlQgOgotCQkJY2FzZSBDU1NfQVRUUiA6Ci0JCQljYXNlIENTU19VUkFOR0UgOgotCQkJY2FzZSBDU1NfRk9STUFUIDoKLQkJCWNhc2UgQ1NTX0xPQ0FMIDoKLQkJCWNhc2UgQ1NTX0hBU0ggOgotCQkJY2FzZSBDU1NfQ09NTUEgOgotCQkJY2FzZSBDU1NfU0xBU0ggOgotCQkJY2FzZSBDU1NfSU5IRVJJVF9QUklNSVRJVkUgOgotCQkJCXJldHVybiBmU3RyaW5nVmFsdWU7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlWYWx1ZUNoYW5nZWQoU3RyaW5nIG9sZFZhbHVlKSB7Ci0JCS8vIGZvciBtb2RlbAotCQlJQ1NTRG9jdW1lbnQgZG9jID0gZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDU1NNb2RlbEltcGwgbW9kZWwgPSAoQ1NTTW9kZWxJbXBsKSBkb2MuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLnZhbHVlQ2hhbmdlZCh0aGlzLCBvbGRWYWx1ZSk7Ci0KLQkJLy8gZm9yIGFkYXB0ZXJzCi0JCW5vdGlmeShDSEFOR0UsIG5ldyBTaG9ydChmUHJpbWl0aXZlVHlwZSksIG51bGwsIG51bGwsIGdldFN0YXJ0T2Zmc2V0KCkpOwotCX0KLQotCS8qKgotCSAqIEEgbWV0aG9kIHRvIHNldCB0aGUgZmxvYXQgdmFsdWUgd2l0aCBhIHNwZWNpZmllZCB1bml0LiBJZiB0aGUgcHJvcGVydHkKLQkgKiBhdHRhY2hlZCB3aXRoIHRoaXMgdmFsdWUgY2FuIG5vdCBhY2NlcHQgdGhlIHNwZWNpZmllZCB1bml0IG9yIHRoZSBmbG9hdAotCSAqIHZhbHVlLCB0aGUgdmFsdWUgd2lsbCBiZSB1bmNoYW5nZWQgYW5kIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPgotCSAqIHdpbGwgYmUgcmFpc2VkLgotCSAqIAotCSAqIEBwYXJhbSB1bml0VHlwZQotCSAqICAgICAgICAgICAgQSB1bml0IGNvZGUgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIHVuaXQgY29kZSBjYW4gb25seSBiZSBhCi0JICogICAgICAgICAgICBmbG9hdCB1bml0IHR5cGUgKGkuZS4gPGNvZGU+Q1NTX05VTUJFUjwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUEVSQ0VOVEFHRTwvY29kZT4sPGNvZGU+Q1NTX0VNUzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfRVhTPC9jb2RlPiw8Y29kZT5DU1NfUFg8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0NNPC9jb2RlPiw8Y29kZT5DU1NfTU08L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0lOPC9jb2RlPiw8Y29kZT5DU1NfUFQ8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1BDPC9jb2RlPiw8Y29kZT5DU1NfREVHPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19SQUQ8L2NvZGU+LDxjb2RlPkNTU19HUkFEPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19NUzwvY29kZT4sPGNvZGU+Q1NTX1M8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0haPC9jb2RlPiw8Y29kZT5DU1NfS0haPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19ESU1FTlNJT048L2NvZGU+KS4KLQkgKiBAcGFyYW0gZmxvYXRWYWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyBmbG9hdCB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBhdHRhY2hlZCBwcm9wZXJ0eQotCSAqICAgICAgICAgICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZmxvYXQgdmFsdWUgb3IgdGhlIHVuaXQgdHlwZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGbG9hdFZhbHVlKHNob3J0IHVuaXRUeXBlLCBmbG9hdCBmbG9hdFZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc3dpdGNoICh1bml0VHlwZSkgewotCQkJY2FzZSBDU1NfTlVNQkVSIDoKLQkJCWNhc2UgQ1NTX1BFUkNFTlRBR0UgOgotCQkJY2FzZSBDU1NfRU1TIDoKLQkJCWNhc2UgQ1NTX0VYUyA6Ci0JCQljYXNlIENTU19QWCA6Ci0JCQljYXNlIENTU19DTSA6Ci0JCQljYXNlIENTU19NTSA6Ci0JCQljYXNlIENTU19JTiA6Ci0JCQljYXNlIENTU19QVCA6Ci0JCQljYXNlIENTU19QQyA6Ci0JCQljYXNlIENTU19ERUcgOgotCQkJY2FzZSBDU1NfUkFEIDoKLQkJCWNhc2UgQ1NTX0dSQUQgOgotCQkJY2FzZSBDU1NfTVMgOgotCQkJY2FzZSBDU1NfUyA6Ci0JCQljYXNlIENTU19IWiA6Ci0JCQljYXNlIENTU19LSFogOgotCQkJY2FzZSBDU1NfRElNRU5TSU9OIDoKLQkJCWNhc2UgQ1NTX0lOVEVHRVIgOgotCQkJCVN0cmluZyBvbGRWYWx1ZSA9IGdldENTU1ZhbHVlVGV4dCgpOwotCQkJCWZQcmltaXRpdmVUeXBlID0gdW5pdFR5cGU7Ci0JCQkJZkZsb2F0VmFsdWUgPSBmbG9hdFZhbHVlOwotCQkJCW5vdGlmeVZhbHVlQ2hhbmdlZChvbGRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIG1ldGhvZCB0byBzZXQgdGhlIHN0cmluZyB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgdW5pdC4gSWYgdGhlCi0JICogcHJvcGVydHkgYXR0YWNoZWQgdG8gdGhpcyB2YWx1ZSBjYW4ndCBhY2NlcHQgdGhlIHNwZWNpZmllZCB1bml0IG9yIHRoZQotCSAqIHN0cmluZyB2YWx1ZSwgdGhlIHZhbHVlIHdpbGwgYmUgdW5jaGFuZ2VkIGFuZCBhCi0JICogPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHJhaXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nVHlwZQotCSAqICAgICAgICAgICAgQSBzdHJpbmcgY29kZSBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgc3RyaW5nIGNvZGUgY2FuIG9ubHkgYmUKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nIHVuaXQgdHlwZSAoaS5lLiA8Y29kZT5DU1NfU1RSSU5HPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19VUkk8L2NvZGU+LDxjb2RlPkNTU19JREVOVDwvY29kZT4sIGFuZAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0FUVFI8L2NvZGU+KS4KLQkgKiBAcGFyYW0gc3RyaW5nVmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgc3RyaW5nIHZhbHVlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIHN0cmluZyB2YWx1ZSBvciBpZiB0aGUgc3RyaW5nIHZhbHVlIGNhbid0IGJlCi0JICogICAgICAgICAgICAgICAgY29udmVydGVkIGludG8gdGhlIHNwZWNpZmllZCB1bml0LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmluZ1ZhbHVlKHNob3J0IHN0cmluZ1R5cGUsIFN0cmluZyBzdHJpbmdWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAoc3RyaW5nVHlwZSkgewotCQkJY2FzZSBDU1NfU1RSSU5HIDoKLQkJCWNhc2UgQ1NTX1VSSSA6Ci0JCQljYXNlIENTU19JREVOVCA6Ci0JCQljYXNlIENTU19BVFRSIDoKLQkJCWNhc2UgQ1NTX1VSQU5HRSA6Ci0JCQljYXNlIENTU19GT1JNQVQgOgotCQkJY2FzZSBDU1NfTE9DQUwgOgotCQkJY2FzZSBDU1NfSEFTSCA6Ci0JCQljYXNlIENTU19DT01NQSA6Ci0JCQljYXNlIENTU19TTEFTSCA6Ci0JCQljYXNlIENTU19JTkhFUklUX1BSSU1JVElWRSA6Ci0JCQkJU3RyaW5nIG9sZFZhbHVlID0gZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJZlByaW1pdGl2ZVR5cGUgPSBzdHJpbmdUeXBlOwotCQkJCWZTdHJpbmdWYWx1ZSA9IHN0cmluZ1ZhbHVlOwotCQkJCW5vdGlmeVZhbHVlQ2hhbmdlZChvbGRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgyMDAxLzAxLzI0Ci0JICogMTU6MDY6MjUpCi0JICogCi0JICogQHBhcmFtIGZsb2F0VmFsdWUKLQkgKiAgICAgICAgICAgIGZsb2F0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGZsb2F0IGZsb2F0VmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXRGbG9hdFZhbHVlKGdldFByaW1pdGl2ZVR5cGUoKSwgZmxvYXRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wMS8yNAotCSAqIDE1OjA2OjI1KQotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nIHN0cmluZ1ZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0U3RyaW5nVmFsdWUoZ2V0UHJpbWl0aXZlVHlwZSgpLCBzdHJpbmdWYWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSZWdpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNWNhZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSZWdpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NSZWdpb25Db250YWluZXIgZXh0ZW5kcyBDU1NOb2RlSW1wbCB7Ci0KLQlwcml2YXRlIElUZXh0UmVnaW9uIGZGaXJzdFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBmTGFzdFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZQYXJlbnRSZWdpb24gPSBudWxsOwotCi0JLyoqCi0JICogQ1NTUmVnaW9uQ29udGFpbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTUmVnaW9uQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU1JlZ2lvbkNvbnRhaW5lcihDU1NSZWdpb25Db250YWluZXIgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENzc1RleHQoKSB7Ci0JCWlmIChmRmlyc3RSZWdpb24gPT0gbnVsbCB8fCBmTGFzdFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGdlbmVyYXRlU291cmNlKCk7Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmUGFyZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYm9vbGVhbiBiSW4gPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50ID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoYkluKSB7Ci0JCQkJc291cmNlLmFwcGVuZChmUGFyZW50UmVnaW9uLmdldEZ1bGxUZXh0KGN1cnJlbnQpKTsKLQkJCQlpZiAoY3VycmVudCA9PSBmTGFzdFJlZ2lvbikKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoY3VycmVudCA9PSBmRmlyc3RSZWdpb24pIHsKLQkJCQkJYkluID0gdHJ1ZTsKLQkJCQkJc291cmNlLmFwcGVuZChmUGFyZW50UmVnaW9uLmdldEZ1bGxUZXh0KGN1cnJlbnQpKTsKLQkJCQkJaWYgKGN1cnJlbnQgPT0gZkxhc3RSZWdpb24pCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0TGFzdFJlZ2lvbigpOwotCQlpZiAoIShyZWdpb24gPT0gbnVsbCB8fCBmUGFyZW50UmVnaW9uID09IG51bGwpKSB7Ci0JCQlyZXN1bHQgPSBmUGFyZW50UmVnaW9uLmdldEVuZE9mZnNldChyZWdpb24pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZQYXJlbnRSZWdpb247Ci0JfQotCi0JSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKSB7Ci0JCXJldHVybiBmRmlyc3RSZWdpb247Ci0JfQotCi0JSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZMYXN0UmVnaW9uOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldFJlZ2lvbihpbnQgaW5kZXgpIHsKLQkJaWYgKGdldEZpcnN0UmVnaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZQYXJlbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJaWYgKHJlZ2lvbnMuZ2V0KGkpID09IGdldEZpcnN0UmVnaW9uKCkpIHsKLQkJCQlpZiAoaSArIGluZGV4IDwgcmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJSVRleHRSZWdpb24gdGFyZ2V0ID0gcmVnaW9ucy5nZXQoaSArIGluZGV4KTsKLQkJCQkJaWYgKHRhcmdldC5nZXRTdGFydCgpIDw9IGdldExhc3RSZWdpb24oKS5nZXRTdGFydCgpKQotCQkJCQkJcmV0dXJuIHRhcmdldDsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0UmVnaW9uQ291bnQoKSB7Ci0JCXZhbGlkYXRlUmFuZ2UoKTsKLQotCQlpZiAoZ2V0Rmlyc3RSZWdpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChnZXRGaXJzdFJlZ2lvbigpID09IGdldExhc3RSZWdpb24oKSkKLQkJCXJldHVybiAxOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZQYXJlbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCi0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50ID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoaiAhPSAwIHx8IGN1cnJlbnQgPT0gZ2V0Rmlyc3RSZWdpb24oKSkKLQkJCQlqKys7Ci0JCQlpZiAoY3VycmVudCA9PSBnZXRMYXN0UmVnaW9uKCkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGo7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldEZpcnN0UmVnaW9uKCk7Ci0JCWlmICghKHJlZ2lvbiA9PSBudWxsIHx8IGZQYXJlbnRSZWdpb24gPT0gbnVsbCkpIHsKLQkJCXJlc3VsdCA9IGZQYXJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlUZXh0UmVnaW9uIHNldEZpcnN0UmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQl0aGlzLmZGaXJzdFJlZ2lvbiA9IHJlZ2lvbjsKLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlUZXh0UmVnaW9uIHNldExhc3RSZWdpb24oSVRleHRSZWdpb24gbGFzdFJlZ2lvbikgewotCQl0aGlzLmZMYXN0UmVnaW9uID0gbGFzdFJlZ2lvbjsKLQkJcmV0dXJuIGxhc3RSZWdpb247Ci0JfQotCi0Jdm9pZCBzZXRSYW5nZVJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudFJlZ2lvbiwgSVRleHRSZWdpb24gZmlyc3RSZWdpb24sIElUZXh0UmVnaW9uIGxhc3RSZWdpb24pIHsKLQkJdGhpcy5mUGFyZW50UmVnaW9uID0gcGFyZW50UmVnaW9uOwotCQl0aGlzLmZGaXJzdFJlZ2lvbiA9IGZpcnN0UmVnaW9uOwotCQl0aGlzLmZMYXN0UmVnaW9uID0gbGFzdFJlZ2lvbjsKLQotCQlpZiAoZmlyc3RSZWdpb24gPT0gbnVsbCAmJiBsYXN0UmVnaW9uID09IG51bGwpIHsKLQkJCXNldEZpcnN0UmVnaW9uKG51bGwpOwotCQkJc2V0TGFzdFJlZ2lvbihudWxsKTsKLQkJfQotCQllbHNlIHsgLy8gcmFuZ2UgdmFsaWRhdGlvbgotCQkJdmFsaWRhdGVSYW5nZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUmFuZ2UoKSB7Ci0JCWJvb2xlYW4gYk1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJaWYgKHRoaXMuZkZpcnN0UmVnaW9uICE9IG51bGwgfHwgdGhpcy5mTGFzdFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5mRmlyc3RSZWdpb24gPT0gbnVsbCkgewotCQkJCXRoaXMuZkZpcnN0UmVnaW9uID0gdGhpcy5mTGFzdFJlZ2lvbjsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5mTGFzdFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5mTGFzdFJlZ2lvbiA9IHRoaXMuZkZpcnN0UmVnaW9uOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmICh0aGlzLmZGaXJzdFJlZ2lvbi5nZXRTdGFydCgpID4gdGhpcy5mTGFzdFJlZ2lvbi5nZXRTdGFydCgpKSB7Ci0JCQkJLy8gbmVlZCB0byBzd2FwIGZpcnN0IGZvciBsYXN0Ci0JCQkJSVRleHRSZWdpb24gcmVnID0gZkZpcnN0UmVnaW9uOwotCQkJCWZGaXJzdFJlZ2lvbiA9IGZMYXN0UmVnaW9uOwotCQkJCWZMYXN0UmVnaW9uID0gcmVnOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJNb2RpZmllZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1J1bGVEZWNsQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1J1bGVEZWNsQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MzgxNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlRGVjbENvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTUnVsZURlY2xDb250YWluZXIgZXh0ZW5kcyBDU1NSdWxlSW1wbCB7Ci0KLQkvKioKLQkgKiBDU1NSdWxlRGVjbENvbnRhaW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU1J1bGVEZWNsQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENTU1J1bGVEZWNsQ29udGFpbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JQ1NTUnVsZURlY2xDb250YWluZXIoQ1NTUnVsZURlY2xDb250YWluZXIgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlhYnN0cmFjdCBTdHJpbmcgZXh0cmFjdFByZVN0cmluZygpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldFN0eWxlKCkgewotCi0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb24pCi0JCQkJcmV0dXJuIChDU1NTdHlsZURlY2xhcmF0aW9uKSBub2RlOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmU2ZTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVNoZWV0OwotCi0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIENTU1J1bGVJbXBsIGV4dGVuZHMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgQ1NTUnVsZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NSdWxlSW1wbChDU1NSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgcnVsZSBpcyBjb250YWluZWQgaW5zaWRlIGFub3RoZXIgcnVsZSAoZS5nLiBhIHN0eWxlIHJ1bGUgaW5zaWRlCi0JICogYW4KLQkgKiAKLQkgKiBAbWVkaWEgYmxvY2spLCB0aGlzIGlzIHRoZSBjb250YWluaW5nIHJ1bGUuIElmIHRoaXMgcnVsZSBpcyBub3QgbmVzdGVkCi0JICogICAgICAgIGluc2lkZSBhbnkgb3RoZXIgcnVsZXMsIHRoaXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBnZXRQYXJlbnRSdWxlKCkgewotCQlJQ1NTTm9kZSBydWxlID0gZ2V0UGFyZW50Tm9kZSgpOwotCi0JCS8vIHBhcmVudCBydWxlIGlzIHVzZWQgb25seSBpZiBwYXJlbnQgaXMgbWVkaWEgcnVsZQotCQlpZiAocnVsZSBpbnN0YW5jZW9mIENTU01lZGlhUnVsZUltcGwpCi0JCQlyZXR1cm4gKENTU1J1bGUpIHJ1bGU7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0eWxlIHNoZWV0IHRoYXQgY29udGFpbnMgdGhpcyBydWxlLgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZVNoZWV0IGdldFBhcmVudFN0eWxlU2hlZXQoKSB7Ci0JCUlDU1NOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldEltcGwpCi0JCQkJcmV0dXJuIChDU1NTdHlsZVNoZWV0KSBwYXJlbnQ7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgc2hvcnQgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZjE1YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1J1bGVMaXN0SW1wbCBleHRlbmRzIEFic3RyYWN0Q1NTTm9kZUxpc3QgaW1wbGVtZW50cyBDU1NSdWxlTGlzdCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NSdWxlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSBhIENTUyBydWxlIGJ5IG9yZGluYWwgaW5kZXguIFRoZSBvcmRlciBpbiB0aGlzCi0JICogY29sbGVjdGlvbiByZXByZXNlbnRzIHRoZSBvcmRlciBvZiB0aGUgcnVsZXMgaW4gdGhlIENTUyBzdHlsZSBzaGVldC4gSWYKLQkgKiBpbmRleCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBydWxlcyBpbiB0aGUgbGlzdCwgdGhpcwotCSAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGluZGV4SW5kZXgKLQkgKiAgICAgICAgICAgIGludG8gdGhlIGNvbGxlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSBzdHlsZSBydWxlIGF0IHRoZSA8Y29kZT5pbmRleDwvY29kZT4gcG9zaXRpb24gaW4gdGhlCi0JICogICAgICAgICA8Y29kZT5DU1NSdWxlTGlzdDwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoYXQgaXMKLQkgKiAgICAgICAgIG5vdCBhIHZhbGlkIGluZGV4LgotCSAqLwotCXB1YmxpYyBDU1NSdWxlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQ1NTUnVsZSkgaXRlbUltcGwoaW5kZXgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZTdlOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2VsZWN0b3JBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvckNvbWJpbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTaW1wbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTZWxlY3RvciBpbXBsZW1lbnRzIElDU1NTZWxlY3RvciB7Ci0KLQlwcml2YXRlIGludCBmU3BlY2lmaWNpdHkgPSAtMTsKLQlwcml2YXRlIFN0cmluZyBmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZlRva2VucyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZJdGVtcyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZQYXJzZUVycm9ycyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZOYW1lRXJyb3JzID0gbnVsbDsKLQotCUNTU1NlbGVjdG9yKExpc3QgdG9rZW5zKSB7Ci0JCWZUb2tlbnMgPSBuZXcgQXJyYXlMaXN0KHRva2Vucyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvYmogPT0gbnVsbCB8fCB0aGlzLmdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ1NTU2VsZWN0b3IgZm9yZWlnbiA9IChDU1NTZWxlY3Rvcikgb2JqOwotCi0JCS8vIGlmIChmU3BlY2lmaWNpdHkgIT0gZm9yZWlnbi5mU3BlY2lmaWNpdHkpIHJldHVybiBmYWxzZTsKLQotCQlpZiAoZ2V0TGVuZ3RoKCkgIT0gZm9yZWlnbi5nZXRMZW5ndGgoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmICghZ2V0SXRlbShpKS5lcXVhbHMoZm9yZWlnbi5nZXRJdGVtKGkpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSUNTU1NlbGVjdG9ySXRlbSBnZXRJdGVtKGludCBpbmRleCkgewotCQlpZiAoZkl0ZW1zID09IG51bGwpIHsKLQkJCWZJdGVtcyA9IHBhcnNlU2VsZWN0b3IoZlRva2Vucyk7Ci0JCX0KLQkJaWYgKGZJdGVtcyAhPSBudWxsICYmIDAgPD0gaW5kZXggJiYgaW5kZXggPCBmSXRlbXMuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gKElDU1NTZWxlY3Rvckl0ZW0pIGZJdGVtcy5nZXQoaW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRJdGVyYXRvcigpIHsKLQkJaWYgKGZJdGVtcyA9PSBudWxsKSB7Ci0JCQlmSXRlbXMgPSBwYXJzZVNlbGVjdG9yKGZUb2tlbnMpOwotCQl9Ci0JCXJldHVybiAoZkl0ZW1zICE9IG51bGwpID8gZkl0ZW1zLml0ZXJhdG9yKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWlmIChmSXRlbXMgPT0gbnVsbCkgewotCQkJZkl0ZW1zID0gcGFyc2VTZWxlY3RvcihmVG9rZW5zKTsKLQkJfQotCQlyZXR1cm4gKGZJdGVtcyAhPSBudWxsKSA/IGZJdGVtcy5zaXplKCkgOiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByaXZhdGUgRWxlbWVudCBnZXRQYXJlbnRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlOb2RlIG5vZGUgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCXJldHVybiAoRWxlbWVudCkgbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByaXZhdGUgRWxlbWVudCBnZXRQcmV2aW91c0VsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUVsZW1lbnQgcCA9IG51bGw7Ci0JCWZvciAoTm9kZSBub2RlID0gZWxlbWVudC5nZXRQcmV2aW91c1NpYmxpbmcoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCXAgPSAoRWxlbWVudCkgbm9kZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgYSBzZWxlY3RvcidzIHNwZWNpZmljaXR5IGEgPSB0aGUgbnVtYmVyIG9mIElEIGF0dHJpYnV0ZXMgaW4KLQkgKiB0aGUgc2VsZWN0b3IgYiA9IHRoZSBudW1iZXIgb2Ygb3RoZXIgYXR0cmlidXRlcyBhbmQgcHNldWRvLWNsYXNzZXMgaW4KLQkgKiB0aGUgc2VsZWN0b3IgYyA9IHRoZSBudW1iZXIgb2YgZWxlbWVudCBuYW1lcyBpbiB0aGUgc2VsZWN0b3IgKGlnbm9yZQotCSAqIHBzZXVkby1lbGVtZW50cykgQ29uY2F0ZW5hdGluZyB0aGUgdGhyZWUgbnVtYmVycyBhLWItYyAoaW4gYSBudW1iZXIKLQkgKiBzeXN0ZW0gd2l0aCBhIGxhcmdlIGJhc2UpIGdpdmVzIHRoZSBzcGVjaWZpY2l0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWNpdHkoKSB7Ci0JCWlmIChmU3BlY2lmaWNpdHkgPCAwKSB7Ci0JCQlpbnQgbklEcyA9IDA7Ci0JCQlpbnQgbkF0dHJpYnV0ZXMgPSAwOwotCQkJaW50IG5FbGVtZW50cyA9IDA7Ci0JCQlJdGVyYXRvciBpID0gZ2V0SXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUlDU1NTZWxlY3Rvckl0ZW0gaXRlbSA9IChJQ1NTU2VsZWN0b3JJdGVtKSBpLm5leHQoKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENTU1NpbXBsZVNlbGVjdG9yKSB7Ci0JCQkJCUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yID0gKENTU1NpbXBsZVNlbGVjdG9yKSBpdGVtOwotCQkJCQluSURzICs9IHNlbGVjdG9yLmdldE51bU9mSURzKCk7Ci0JCQkJCW5BdHRyaWJ1dGVzICs9IHNlbGVjdG9yLmdldE51bU9mQXR0cmlidXRlcygpOwotCQkJCQluQXR0cmlidXRlcyArPSBzZWxlY3Rvci5nZXROdW1PZkNsYXNzZXMoKTsKLQkJCQkJbkF0dHJpYnV0ZXMgKz0gc2VsZWN0b3IuZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpOwotCQkJCQlpZiAoIXNlbGVjdG9yLmlzVW5pdmVyc2FsKCkpIHsKLQkJCQkJCW5FbGVtZW50cysrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZlNwZWNpZmljaXR5ID0gbklEcyAqIDEwMDAwICsgbkF0dHJpYnV0ZXMgKiAxMDAgKyBuRWxlbWVudHM7Ci0JCX0KLQotCQlyZXR1cm4gZlNwZWNpZmljaXR5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlpZiAoZkNhY2hlZFN0cmluZyA9PSBudWxsKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJSXRlcmF0b3IgaSA9IGdldEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSAoSUNTU1NlbGVjdG9ySXRlbSkgaS5uZXh0KCk7Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDU1NTZWxlY3RvckNvbWJpbmF0b3IpIHsKLQkJCQkJLy8gSWYgaXRlbSBpcyBERVNDRU5EQU5UIGNvbWJpbmF0b3IsIGl0IGlzIGp1c3Qgc2luZ2xlCi0JCQkJCS8vIHNwYWNlLgotCQkJCQkvLyBUaGVuLCB5b3UgZG9udCBoYXZlIHRvIGFwcGVuZCBzdHJpbmcuLgotCQkJCQlpZiAoKChDU1NTZWxlY3RvckNvbWJpbmF0b3IpIGl0ZW0pLmdldENvbWJpbmF0b3JUeXBlKCkgIT0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5ERVNDRU5EQU5UKSB7Ci0JCQkJCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYnVmLmFwcGVuZChpdGVtLmdldFN0cmluZygpKTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYnVmLmFwcGVuZChpdGVtLmdldFN0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmQ2FjaGVkU3RyaW5nID0gYnVmLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gZkNhY2hlZFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoKG9yZy53M2MuZG9tLkVsZW1lbnQgZWxlbWVudCwgamF2YS5sYW5nLlN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCUVsZW1lbnQgdGFyZ2V0ID0gZWxlbWVudDsKLQkJY2hhciBjb21iaW5hdG9yVHlwZSA9IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuVU5LTk9XTjsKLQkJRWxlbWVudCBjaHVua1N0YXJ0RWxlbWVudCA9IG51bGw7IC8vIGZvciBDSElMRCBhbmQgQURKQUNFTlQKLQkJCQkJCQkJCQkJLy8gY29tYmluYXRvcgotCQlpbnQgY2h1bmtTdGFydEl0ZW0gPSAtMTsgLy8gZm9yIENISUxEIGFuZCBBREpBQ0VOVCBjb21iaW5hdG9yCi0JCWludCBudW1JdGVtcyA9IGdldExlbmd0aCgpOwotCQlmb3IgKGludCBpSXRlbSA9IG51bUl0ZW1zIC0gMTsgaUl0ZW0gPj0gMDsgaUl0ZW0tLSkgewotCQkJLy8gQ2hlY2sgU2VsZWN0b3IgSXRlbXMKLQkJCUlDU1NTZWxlY3Rvckl0ZW0gaXRlbSA9IGdldEl0ZW0oaUl0ZW0pOwotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBJQ1NTU2ltcGxlU2VsZWN0b3IpIHsKLQkJCQkvLyBTaW1wbGUgU2VsZWN0b3IKLQkJCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoIW1hdGNoRXhhY3RseSgoSUNTU1NpbXBsZVNlbGVjdG9yKSBpdGVtLCB0YXJnZXQsIHBzZXVkb05hbWUpKSB7Ci0JCQkJCXN3aXRjaCAoY29tYmluYXRvclR5cGUpIHsKLQkJCQkJCWNhc2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvci5ERVNDRU5EQU5UIDoKLQkJCQkJCQlkbyB7Ci0JCQkJCQkJCXRhcmdldCA9IGdldFBhcmVudEVsZW1lbnQodGFyZ2V0KTsKLQkJCQkJCQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCX0KLQkJCQkJCQl3aGlsZSAoIW1hdGNoRXhhY3RseSgoSUNTU1NpbXBsZVNlbGVjdG9yKSBpdGVtLCB0YXJnZXQsIHBzZXVkb05hbWUpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvci5DSElMRCA6Ci0JCQkJCQljYXNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQURKQUNFTlQgOgotCQkJCQkJCWlmIChjaHVua1N0YXJ0RWxlbWVudCAhPSBudWxsICYmIGNodW5rU3RhcnRFbGVtZW50ICE9IGVsZW1lbnQpIHsKLQkJCQkJCQkJLy8gcHJldmlvdXMgY29uYmluYXRvciBtdXN0IGJlIERFU0NFTkRFTlQuCi0JCQkJCQkJCS8vIGdvdG8gcGFyZW50Ci0JCQkJCQkJCXRhcmdldCA9IGdldFBhcmVudEVsZW1lbnQoY2h1bmtTdGFydEVsZW1lbnQpOwotCQkJCQkJCQlpSXRlbSA9IGNodW5rU3RhcnRJdGVtICsgMTsKLQkJCQkJCQkJY2h1bmtTdGFydEVsZW1lbnQgPSBudWxsOwotCQkJCQkJCQljaHVua1N0YXJ0SXRlbSA9IC0xOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkvLyBvdGhlciBjb21iaW5hdG9ycyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIElDU1NTZWxlY3RvckNvbWJpbmF0b3IpIHsKLQkJCQkvLyBDb21iaW5hdG9yICggIisiLCAiPiIsICIgIiwgLi4uKQotCQkJCWlmIChpSXRlbSA9PSBudW1JdGVtcyAtIDEpCi0JCQkJCXJldHVybiBmYWxzZTsgLy8gbGFzdCBpdGVtIGlzIGNvbWJpbmF0b3IKLQotCQkJCUlDU1NTZWxlY3RvckNvbWJpbmF0b3Igc2MgPSAoSUNTU1NlbGVjdG9yQ29tYmluYXRvcikgaXRlbTsKLQkJCQljb21iaW5hdG9yVHlwZSA9IHNjLmdldENvbWJpbmF0b3JUeXBlKCk7Ci0JCQkJc3dpdGNoIChjb21iaW5hdG9yVHlwZSkgewotCQkJCQljYXNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IuREVTQ0VOREFOVCA6Ci0JCQkJCQl0YXJnZXQgPSBnZXRQYXJlbnRFbGVtZW50KHRhcmdldCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkNISUxEIDoKLQkJCQkJY2FzZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkFESkFDRU5UIDoKLQkJCQkJCWlmIChjaHVua1N0YXJ0RWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCQkJY2h1bmtTdGFydEVsZW1lbnQgPSB0YXJnZXQ7Ci0JCQkJCQkJY2h1bmtTdGFydEl0ZW0gPSBpSXRlbSArIDE7IC8vIHNhZmUgYmVjYXVzZSB0aGlzCi0JCQkJCQkJCQkJCQkJCS8vIGlzIG5vdCBhIGxhc3QgaXRlbS4KLQkJCQkJCX0KLQkJCQkJCWlmIChjb21iaW5hdG9yVHlwZSA9PSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkNISUxEKSB7Ci0JCQkJCQkJdGFyZ2V0ID0gZ2V0UGFyZW50RWxlbWVudCh0YXJnZXQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdGFyZ2V0ID0gZ2V0UHJldmlvdXNFbGVtZW50KHRhcmdldCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3aGF0IGlzIHRoaXMgaXRlbSA/Pz8KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLy8gT0sgdGhpcyBzZWxlY3RvciBtYWNoZXMgdGhlIGVsZW1lbnQuCi0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG1hdGNoRXhhY3RseShJQ1NTU2ltcGxlU2VsZWN0b3Igc2VsZWN0b3IsIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpIHsKLQkJSVN0eWxlU2VsZWN0b3JBZGFwdGVyIGFkYXB0ZXIgPSAoSVN0eWxlU2VsZWN0b3JBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGVsZW1lbnQpLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIubWF0Y2goc2VsZWN0b3IsIGVsZW1lbnQsIHBzZXVkb05hbWUpOwotCQl9Ci0KLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IGk7Ci0JCVN0cmluZyBrZXk7Ci0KLQkJLy8gVE9ETzogUHNldWRvTmFtZQotCi0JCS8vIGNoZWNrIHRhZyBuYW1lCi0JCWlmICghc2VsZWN0b3IuaXNVbml2ZXJzYWwoKSAmJiAhZWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscyhzZWxlY3Rvci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIGNoZWNrIGlkCi0JCWkgPSBzZWxlY3Rvci5nZXROdW1PZklEcygpOwotCQlpZiAoaSA+IDApIHsKLQkJCWlmIChpID4gMSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKCJpZCIpIHx8IChrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKSkubGVuZ3RoKCkgPT0gMCkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIXNlbGVjdG9yLmdldElEKDApLmVxdWFscyhrZXkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIGNsYXNzCi0JCWkgPSBzZWxlY3Rvci5nZXROdW1PZkNsYXNzZXMoKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKCJjbGFzcyIpIHx8IChrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkubGVuZ3RoKCkgPT0gMCkgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGtleSk7Ci0JCQlmb3IgKGkgPSBpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQlib29sZWFuIG9rID0gZmFsc2U7Ci0JCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJaWYgKHNlbGVjdG9yLmdldENsYXNzKGkpLmVxdWFscyh0b2tlbml6ZXIubmV4dFRva2VuKCkpKSB7Ci0JCQkJCQlvayA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIW9rKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBhdHRyaWJ1dGVzCi0JCWZvciAoaSA9IHNlbGVjdG9yLmdldE51bU9mQXR0cmlidXRlcygpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNlbGVjdG9yLmdldEF0dHJpYnV0ZShpKSwgIj1+fCBcdFxyXG5cZiIpOy8vJE5PTi1OTFMtMSQKLQkJCWludCBjb3VudFRva2VucyA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQkJaWYgKGNvdW50VG9rZW5zID4gMCkgewotCQkJCVN0cmluZyBhdHRyTmFtZSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQlTdHJpbmcgYXR0clZhbHVlID0gbnVsbDsKLQkJCQlpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJOYW1lKSB8fCAoYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpKS5sZW5ndGgoKSA9PSAwKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKGNvdW50VG9rZW5zID4gMSkgewotCQkJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCI9IFx0XHJcblxmIik7Ly8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdUb2tlbml6ZXIgYXR0clZhbHVlVG9rZW5pemVyID0gbnVsbDsKLQkJCQkJaWYgKHRva2VuLmVxdWFscygifiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYXR0clZhbHVlVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHRva2VuLmVxdWFscygifCIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYXR0clZhbHVlVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWUsICItIik7Ly8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmIChhdHRyVmFsdWVUb2tlbml6ZXIgIT0gbnVsbCkgewotCQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJCQlib29sZWFuIG9rID0gZmFsc2U7Ci0JCQkJCQkJd2hpbGUgKGF0dHJWYWx1ZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQkJaWYgKHRva2VuLmVxdWFscyhhdHRyVmFsdWVUb2tlbml6ZXIubmV4dFRva2VuKCkpKSB7Ci0JCQkJCQkJCQlvayA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIW9rKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoIWF0dHJWYWx1ZS5lcXVhbHModG9rZW4pKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgTGlzdCBwYXJzZVNlbGVjdG9yKExpc3QgdG9rZW5zKSB7Ci0JCUNTU1NlbGVjdG9yUGFyc2VyIHBhcnNlciA9IG5ldyBDU1NTZWxlY3RvclBhcnNlcih0b2tlbnMpOwotCQlMaXN0IHNlbGVjdG9yID0gcGFyc2VyLmdldFNlbGVjdG9yKCk7Ci0JCUl0ZXJhdG9yIGkgPSBwYXJzZXIuZ2V0RXJyb3JzKCk7Ci0JCWZQYXJzZUVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlmUGFyc2VFcnJvcnMuYWRkKGkubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0b3I7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldEVycm9ycygpIHsKLQkJaWYgKGZOYW1lRXJyb3JzID09IG51bGwpIHsKLQkJCWZOYW1lRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSXRlcmF0b3IgaUl0ZW0gPSBnZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGlJdGVtLmhhc05leHQoKSkgewotCQkJCUlDU1NTZWxlY3Rvckl0ZW0gaXRlbSA9IChJQ1NTU2VsZWN0b3JJdGVtKSBpSXRlbS5uZXh0KCk7Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBJQ1NTU2ltcGxlU2VsZWN0b3IpIHsKLQkJCQkJaWYgKCEoKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbSkuaXNVbml2ZXJzYWwoKSkgewotCQkJCQkJU3RyaW5nIG5hbWUgPSAoKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbSkuZ2V0TmFtZSgpOwotCQkJCQkJaWYgKCFOYW1lVmFsaWRhdG9yLmlzVmFsaWQobmFtZSkpIHsKLQkJCQkJCQlmTmFtZUVycm9ycy5hZGQoaXRlbSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KGZQYXJzZUVycm9ycyk7Ci0JCWVycm9ycy5hZGRBbGwoZk5hbWVFcnJvcnMpOwotCQlyZXR1cm4gZXJyb3JzLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFN0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNTU1NlbGVjdG9yI2dldEVycm9yQ291bnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb3VudCgpIHsKLQkJaW50IG5FcnJvcnMgPSAwOwotCQlJdGVyYXRvciBpID0gZ2V0RXJyb3JzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJbkVycm9ycysrOwotCQkJaS5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG5FcnJvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMTVhYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvckNvbWJpbmF0b3I7Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1NlbGVjdG9yQ29tYmluYXRvciBleHRlbmRzIENTU1NlbGVjdG9ySXRlbSBpbXBsZW1lbnRzIElDU1NTZWxlY3RvckNvbWJpbmF0b3IgewotCi0JY2hhciBmVHlwZSA9IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuVU5LTk9XTjsKLQotCS8qKgotCSAqIENTU1NlbGVjdG9yQ29tYmluYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDU1NTZWxlY3RvckNvbWJpbmF0b3IoY2hhciB0eXBlKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldENvbWJpbmF0b3JUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqID09IG51bGwgfHwgdGhpcy5nZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNTU1NlbGVjdG9yQ29tYmluYXRvciBmb3JlaWduID0gKENTU1NlbGVjdG9yQ29tYmluYXRvcikgb2JqOwotCi0JCXJldHVybiAoZ2V0Q29tYmluYXRvclR5cGUoKSA9PSBmb3JlaWduLmdldENvbWJpbmF0b3JUeXBlKCkpOwotCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRDb21iaW5hdG9yVHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRJdGVtVHlwZSgpIHsKLQkJcmV0dXJuIENPTUJJTkFUT1I7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoZlR5cGUpOwotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0Jdm9pZCBzZXRDb21iaW5hdG9yVHlwZShjaGFyIHR5cGUpIHsKLQkJZlR5cGUgPSB0eXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JJdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9ySXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDM2NjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NTZWxlY3Rvckl0ZW0gaW1wbGVtZW50cyBJQ1NTU2VsZWN0b3JJdGVtIHsKLQotCS8qKgotCSAqIENTU1NlbGVjdG9ySXRlbSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDU1NTZWxlY3Rvckl0ZW0oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1UeXBlKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyMzFmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTZWxlY3Rvckxpc3RJbXBsIGltcGxlbWVudHMgSUNTU1NlbGVjdG9yTGlzdCB7Ci0KLQlwcml2YXRlIFN0cmluZyBmVGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZFN0cmluZyA9IG51bGw7IC8vIG5vcm1hbGl6ZWQgc3RyaW5nCi0JcHJpdmF0ZSBMaXN0IGZTZWxlY3RvcnMgPSBudWxsOwotCi0JcHVibGljIENTU1NlbGVjdG9yTGlzdEltcGwoU3RyaW5nIGNzc1RleHQpIHsKLQkJc3VwZXIoKTsKLQkJZlRleHQgPSBjc3NUZXh0OwotCQlwYXJzZVNlbGVjdG9yVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqID09IG51bGwgfHwgdGhpcy5nZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNTU1NlbGVjdG9yTGlzdEltcGwgZm9yZWlnbiA9IChDU1NTZWxlY3Rvckxpc3RJbXBsKSBvYmo7Ci0KLQkJaWYgKGdldExlbmd0aCgpICE9IGZvcmVpZ24uZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIWdldFNlbGVjdG9yKGkpLmVxdWFscyhmb3JlaWduLmdldFNlbGVjdG9yKGkpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIGdldFNlbGVjdG9ycygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldFNlbGVjdG9ycygpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSUNTU1NlbGVjdG9yIGdldFNlbGVjdG9yKGludCBpbmRleCkgewotCQlMaXN0IHNlbGVjdG9ycyA9IGdldFNlbGVjdG9ycygpOwotCQlpZiAoMCA8PSBpbmRleCAmJiBpbmRleCA8IHNlbGVjdG9ycy5zaXplKCkpIHsKLQkJCXJldHVybiAoSUNTU1NlbGVjdG9yKSBzZWxlY3RvcnMuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFNlbGVjdG9ycygpIHsKLQkJaWYgKGZTZWxlY3RvcnMgPT0gbnVsbCkgewotCQkJcGFyc2VTZWxlY3RvclRleHQoKTsKLQkJfQotCQlyZXR1cm4gZlNlbGVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJaWYgKGZDYWNoZWRTdHJpbmcgPT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gYkZpcnN0ID0gdHJ1ZTsKLQkJCS8vIGdyb3VwcyBpcyBsaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBzZWxlY3RvcnMKLQkJCUl0ZXJhdG9yIGkgPSBnZXRTZWxlY3RvcnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCFiRmlyc3QpIHsKLQkJCQkJYnVmLmFwcGVuZCgiLCAiKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCUlDU1NTZWxlY3RvciBpdGVtID0gKElDU1NTZWxlY3RvcikgaS5uZXh0KCk7Ci0JCQkJYnVmLmFwcGVuZChpdGVtLmdldFN0cmluZygpKTsKLQkJCQliRmlyc3QgPSBmYWxzZTsKLQkJCX0KLQkJCWZDYWNoZWRTdHJpbmcgPSBidWYudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gZkNhY2hlZFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpIHsKLQkJaW50IG5TZWxlY3RvcnMgPSBnZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaVNlbGVjdG9yID0gMDsgaVNlbGVjdG9yIDwgblNlbGVjdG9yczsgaVNlbGVjdG9yKyspIHsKLQkJCS8vIENoZWNrIGVhY2ggU2VsZWN0b3IgTGlzdHMKLQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGlTZWxlY3Rvcik7Ci0JCQlpZiAoc2VsZWN0b3IubWF0Y2goZWxlbWVudCwgcHNldWRvTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZVNlbGVjdG9yVGV4dCgpIHsKLQkJZlNlbGVjdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGZUZXh0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX1NUWUxFU0hFRVQsIGZUZXh0KTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IHRva2VuR3JvdXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlDU1NUZXh0VG9rZW4gdG9rZW4gPSB0b2tlbnNbaV07Ci0JCQlpZiAodG9rZW4ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfU0VQQVJBVE9SICYmIDAgPCB0b2tlbkdyb3VwLnNpemUoKSkgewotCQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBDU1NTZWxlY3Rvcih0b2tlbkdyb3VwKTsKLQkJCQlpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotCQkJCQlmU2VsZWN0b3JzLmFkZChzZWxlY3Rvcik7Ci0JCQkJfQotCQkJCXRva2VuR3JvdXAuY2xlYXIoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRva2VuR3JvdXAuYWRkKHRva2Vuc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKDAgPCB0b2tlbkdyb3VwLnNpemUoKSkgewotCQkJSUNTU1NlbGVjdG9yIHNlbGVjdG9yID0gbmV3IENTU1NlbGVjdG9yKHRva2VuR3JvdXApOwotCQkJaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLQkJCQlmU2VsZWN0b3JzLmFkZChzZWxlY3Rvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldEVycm9ycygpIHsKLQkJTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGlTZWxlY3RvciA9IGdldFNlbGVjdG9ycygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpU2VsZWN0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJdGVyYXRvciBpRXJyb3IgPSAoKElDU1NTZWxlY3RvcikgaVNlbGVjdG9yLm5leHQoKSkuZ2V0RXJyb3JzKCk7Ci0JCQl3aGlsZSAoaUVycm9yLmhhc05leHQoKSkgewotCQkJCWVycm9ycy5hZGQoaUVycm9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVycm9ycy5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb3VudCgpIHsKLQkJaW50IG5FcnJvcnMgPSAwOwotCQlJdGVyYXRvciBpID0gZ2V0RXJyb3JzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJbkVycm9ycysrOwotCQkJaS5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG5FcnJvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvclBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvclBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjA1NjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JDb21iaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTZWxlY3RvclBhcnNlciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSURMRSA9IDA7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURSA9IDE7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNJTVBMRSA9IDI7Ci0KLQlwcml2YXRlIExpc3QgZlRva2VucyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZJdGVtcyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZFcnJvcnMgPSBudWxsOwotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU2VsZWN0b3JQYXJzZXIoTGlzdCB0b2tlbnMpIHsKLQkJc3VwZXIoKTsKLQkJZlRva2VucyA9IG5ldyBBcnJheUxpc3QodG9rZW5zKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlMaXN0IGdldFNlbGVjdG9yKCkgewotCQlpZiAoZkl0ZW1zID09IG51bGwpIHsKLQkJCXBhcnNlU2VsZWN0b3IoKTsKLQkJfQotCQlyZXR1cm4gZkl0ZW1zOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZVNlbGVjdG9yKCkgewotCQlmSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTGlzdCBhdHRyQnVmID0gbnVsbDsKLQkJQ1NTU2ltcGxlU2VsZWN0b3IgaXRlbSA9IG51bGw7Ci0KLQkJaW50IHN0YXR1cyA9IElETEU7Ci0JCUl0ZXJhdG9yIGkgPSBmVG9rZW5zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTVGV4dFRva2VuIHRva2VuID0gKENTU1RleHRUb2tlbikgaS5uZXh0KCk7Ci0JCQlpZiAodG9rZW4gPT0gbnVsbCB8fCB0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHRva2VuLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQkJY2FzZSBJRExFIDoKLQkJCQkJaWYgKGlzVGFnKHRva2VuKSkgewotCQkJCQkJaXRlbSA9IGNyZWF0ZVNpbXBsZSgpOwotCQkJCQkJYXBwZW5kVGFnKGl0ZW0sIHRva2VuKTsKLQkJCQkJCXN0YXR1cyA9IFNJTVBMRTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0lEKHRva2VuKSkgewotCQkJCQkJaXRlbSA9IGNyZWF0ZVNpbXBsZSgpOwotCQkJCQkJYXBwZW5kSUQoaXRlbSwgdG9rZW4pOwotCQkJCQkJc3RhdHVzID0gU0lNUExFOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzQ2xhc3ModG9rZW4pKSB7Ci0JCQkJCQlpdGVtID0gY3JlYXRlU2ltcGxlKCk7Ci0JCQkJCQlhcHBlbmRDbGFzcyhpdGVtLCB0b2tlbik7Ci0JCQkJCQlzdGF0dXMgPSBTSU1QTEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNQc2V1ZG8odG9rZW4pKSB7Ci0JCQkJCQlpdGVtID0gY3JlYXRlU2ltcGxlKCk7Ci0JCQkJCQlhcHBlbmRQc2V1ZG8oaXRlbSwgdG9rZW4pOwotCQkJCQkJc3RhdHVzID0gU0lNUExFOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzQXR0cmlidXRlQmVnaW4odG9rZW4pKSB7Ci0JCQkJCQlpdGVtID0gY3JlYXRlU2ltcGxlKCk7Ci0JCQkJCQlzdGF0dXMgPSBBVFRSSUJVVEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlhZGRFcnJvcih0b2tlbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTSU1QTEUgOgotCQkJCQlpZiAoaXNJRCh0b2tlbikpIHsKLQkJCQkJCWFwcGVuZElEKGl0ZW0sIHRva2VuKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0NsYXNzKHRva2VuKSkgewotCQkJCQkJYXBwZW5kQ2xhc3MoaXRlbSwgdG9rZW4pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzUHNldWRvKHRva2VuKSkgewotCQkJCQkJYXBwZW5kUHNldWRvKGl0ZW0sIHRva2VuKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0F0dHJpYnV0ZUJlZ2luKHRva2VuKSkgewotCQkJCQkJc3RhdHVzID0gQVRUUklCVVRFOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzQ29tYmluYXRvcih0b2tlbikpIHsgLy8gY29tYmluYXRvcgotCQkJCQkJY2xvc2VJdGVtKGl0ZW0pOwotCQkJCQkJY2xvc2VJdGVtKGNyZWF0ZUNvbWJpbmF0b3IodG9rZW4pKTsKLQkJCQkJCXN0YXR1cyA9IElETEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlhZGRFcnJvcih0b2tlbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBVFRSSUJVVEUgOgotCQkJCQlpZiAoaXNBdHRyaWJ1dGVFbmQodG9rZW4pKSB7Ci0JCQkJCQlhcHBlbmRBdHRyaWJ1dGUoaXRlbSwgYXR0ckJ1Zik7Ci0JCQkJCQlhdHRyQnVmID0gbnVsbDsKLQkJCQkJCXN0YXR1cyA9IFNJTVBMRTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChhdHRyQnVmID09IG51bGwpIHsKLQkJCQkJCQlhdHRyQnVmID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJfQotCQkJCQkJYXR0ckJ1Zi5hZGQodG9rZW4pOwotCQkJCQkJaWYgKCFpc0F0dHJpYnV0ZUNvbnRlbnQodG9rZW4pKSB7Ci0JCQkJCQkJYWRkRXJyb3IodG9rZW4pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWNsb3NlSXRlbShpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQXR0cmlidXRlQ29udGVudChDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNBdHRyaWJ1dGVFbmQoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQXR0cmlidXRlQmVnaW4oQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21iaW5hdG9yKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ09NQklOQVRPUik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1BzZXVkbyhDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NsYXNzKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJRChDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVGFnKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOKTsKLQl9Ci0KLQlwcml2YXRlIENTU1NpbXBsZVNlbGVjdG9yIGNyZWF0ZVNpbXBsZSgpIHsKLQkJcmV0dXJuIG5ldyBDU1NTaW1wbGVTZWxlY3RvcigpOwotCX0KLQotCS8qKgotCSAqIGlmICIgIiBvciAiKyIgb3IgIj4iIGFwcGVhcmVkLCBjbG9zZSBzaW1wbGVzZWxlY3RvciBhbmQgYWRkIG5ldwotCSAqIGNvbWJpbmF0b3IKLQkgKi8KLQlwcml2YXRlIENTU1NlbGVjdG9yQ29tYmluYXRvciBjcmVhdGVDb21iaW5hdG9yKENTU1RleHRUb2tlbiB0b2tlbikgewotCQljaGFyIHR5cGUgPSAwOwotCi0JCVN0cmluZyBzdHIgPSB0b2tlbi5pbWFnZTsKLQkJaWYgKHN0ci50cmltKCkubGVuZ3RoKCkgPT0gMCkgeyAvLyBzcGFjZQotCQkJdHlwZSA9IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuREVTQ0VOREFOVDsKLQkJfQotCQllbHNlIGlmIChzdHIuZXF1YWxzKCIrIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdHlwZSA9IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQURKQUNFTlQ7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyLmVxdWFscygiPiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkNISUxEOwotCQl9Ci0KLQkJaWYgKDAgPCB0eXBlKSB7Ci0JCQlyZXR1cm4gbmV3IENTU1NlbGVjdG9yQ29tYmluYXRvcih0eXBlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsb3NlSXRlbShJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0pIHsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJZkl0ZW1zLmFkZChpdGVtKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBlbmRUYWcoQ1NTU2ltcGxlU2VsZWN0b3IgaXRlbSwgQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCWl0ZW0uc2V0TmFtZSh0b2tlbi5pbWFnZSk7Ci0JCWlmICh0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOKSB7Ci0JCQlhZGRFcnJvcih0b2tlbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpZiAiI3h4eHgiIGFwcGVhcmVkLCBhZGQgSUQgdG8gY3VycmVudCBzZWxlY3RvcgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRJRChDU1NTaW1wbGVTZWxlY3RvciBpdGVtLCBDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHRleHQgPSB0b2tlbi50b1N0cmluZygpOwotCQlTdHJpbmcgaWRDb250ZW50ID0gdGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGgoKSk7Ci0JCWl0ZW0uYWRkSUQoaWRDb250ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBpZiAiLnh4eHgiIGFwcGVhcmVkLCBhZGQgQ2xhc3MgdG8gY3VycmVudCBzZWxlY3RvcgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRDbGFzcyhDU1NTaW1wbGVTZWxlY3RvciBpdGVtLCBDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHRleHQgPSB0b2tlbi50b1N0cmluZygpOwotCQlTdHJpbmcgY2xhc3NDb250ZW50ID0gdGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGgoKSk7Ci0JCWl0ZW0uYWRkQ2xhc3MoY2xhc3NDb250ZW50KTsKLQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzQ29udGVudC5jaGFyQXQoMCkpKSB7Ci0JCQlhZGRFcnJvcih0b2tlbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpZiAiOnh4eHgiIGFwcGVhcmVkLCBhZGQgUHNldWRvKGVsZW1lbnQvY2xhc3MpIHRvIGN1cnJlbnQgc2VsZWN0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kUHNldWRvKENTU1NpbXBsZVNlbGVjdG9yIGl0ZW0sIENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdGV4dCA9IHRva2VuLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBwc2V1ZG9Db250ZW50ID0gdGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGgoKSk7Ci0JCWl0ZW0uYWRkUHNldWRvTmFtZShwc2V1ZG9Db250ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQXR0cmlidXRlKENTU1NpbXBsZVNlbGVjdG9yIGl0ZW0sIExpc3QgdG9rZW5zKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJQ1NTVGV4dFRva2VuIHRva2VuOwotCQlJdGVyYXRvciBpID0gdG9rZW5zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJdG9rZW4gPSAoQ1NTVGV4dFRva2VuKSBpLm5leHQoKTsKLQkJCWJ1Zi5hcHBlbmQodG9rZW4uaW1hZ2UpOwotCQl9Ci0KLQkJaXRlbS5hZGRBdHRyaWJ1dGUoYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUxpc3QgZ2V0U2VsZWN0b3JUYWdzKCkgewotCQlMaXN0IHRhZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiB0YWdMaXN0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRFcnJvcihDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJaWYgKGZFcnJvcnMgPT0gbnVsbCkgewotCQkJZkVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlmRXJyb3JzLmFkZCh0b2tlbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JSXRlcmF0b3IgZ2V0RXJyb3JzKCkgewotCQlyZXR1cm4gKGZFcnJvcnMgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCkgOiBmRXJyb3JzLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTaW1wbGVTZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTaW1wbGVTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTI4ZTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2ltcGxlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU2ltcGxlU2VsZWN0b3IgZXh0ZW5kcyBDU1NTZWxlY3Rvckl0ZW0gaW1wbGVtZW50cyBJQ1NTU2ltcGxlU2VsZWN0b3IgewotCi0JcHJpdmF0ZSBTdHJpbmcgZk5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZDYWNoZWRTdHJpbmcgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZTdHJpbmdCdWYgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmUHNldWRvTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZBdHRyaWJ1dGUgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmQ2xhc3MgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmSUQgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTU2ltcGxlU2VsZWN0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ1NTU2ltcGxlU2VsZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSkgewotCQlpZiAoZkF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlmQXR0cmlidXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZBdHRyaWJ1dGUuYWRkKGF0dHJpYnV0ZSk7Ci0JCWFkZFRvQnVmKCJbIik7Ly8kTk9OLU5MUy0xJAotCQlhZGRUb0J1ZihhdHRyaWJ1dGUpOwotCQlhZGRUb0J1ZigiXSIpOy8vJE5PTi1OTFMtMSQKLQkJZkNhY2hlZFN0cmluZyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhZGRDbGFzcyhTdHJpbmcgY2xzKSB7Ci0JCWlmIChmQ2xhc3MgPT0gbnVsbCkgewotCQkJZkNsYXNzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZDbGFzcy5hZGQoY2xzKTsKLQkJYWRkVG9CdWYoIi4iKTsvLyROT04tTkxTLTEkCi0JCWFkZFRvQnVmKGNscyk7Ci0JCWZDYWNoZWRTdHJpbmcgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYWRkSUQoU3RyaW5nIGlkKSB7Ci0JCWlmIChmSUQgPT0gbnVsbCkgewotCQkJZklEID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZJRC5hZGQoaWQpOwotCQlhZGRUb0J1ZigiIyIpOy8vJE5PTi1OTFMtMSQKLQkJYWRkVG9CdWYoaWQpOwotCQlmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFkZFBzZXVkb05hbWUoU3RyaW5nIGNscykgewotCQlpZiAoZlBzZXVkb05hbWUgPT0gbnVsbCkgewotCQkJZlBzZXVkb05hbWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZlBzZXVkb05hbWUuYWRkKGNscyk7Ci0JCWFkZFRvQnVmKCI6Iik7Ly8kTk9OLU5MUy0xJAotCQlhZGRUb0J1ZihjbHMpOwotCQlmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVG9CdWYoU3RyaW5nIHN0cikgewotCQlpZiAoZlN0cmluZ0J1ZiA9PSBudWxsKSB7Ci0JCQlmU3RyaW5nQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0JCWZTdHJpbmdCdWYuYXBwZW5kKHN0cik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvYmogPT0gbnVsbCB8fCB0aGlzLmdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ1NTU2ltcGxlU2VsZWN0b3IgZm9yZWlnbiA9IChDU1NTaW1wbGVTZWxlY3Rvcikgb2JqOwotCi0JCWlmIChnZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShmb3JlaWduLmdldE5hbWUoKSkgIT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgaTsKLQotCQkvLyBjb21wYXJlIHBzZXVkby1jbGFzc2VzIC8gcHNldWRvLWVsZW1lbnRzCi0JCWlmIChnZXROdW1PZlBzZXVkb05hbWVzKCkgIT0gZm9yZWlnbi5nZXROdW1PZlBzZXVkb05hbWVzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaSA9IDA7IGkgPCBnZXROdW1PZlBzZXVkb05hbWVzKCk7IGkrKykgewotCQkJaWYgKGdldFBzZXVkb05hbWUoaSkuY29tcGFyZVRvSWdub3JlQ2FzZShmb3JlaWduLmdldFBzZXVkb05hbWUoaSkpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY29tcGFyZSBjbGFzc2VzCi0JCWlmIChnZXROdW1PZkNsYXNzZXMoKSAhPSBmb3JlaWduLmdldE51bU9mQ2xhc3NlcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGkgPSAwOyBpIDwgZ2V0TnVtT2ZDbGFzc2VzKCk7IGkrKykgewotCQkJaWYgKGdldENsYXNzKGkpLmNvbXBhcmVUb0lnbm9yZUNhc2UoZm9yZWlnbi5nZXRDbGFzcyhpKSkgIT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjb21wYXJlIElEcwotCQlpZiAoZ2V0TnVtT2ZJRHMoKSAhPSBmb3JlaWduLmdldE51bU9mSURzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaSA9IDA7IGkgPCBnZXROdW1PZklEcygpOyBpKyspIHsKLQkJCWlmIChnZXRJRChpKS5jb21wYXJlVG9JZ25vcmVDYXNlKGZvcmVpZ24uZ2V0SUQoaSkpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY29tcGFyZSBBdHRyaWJ1dGVzCi0JCWlmIChnZXROdW1PZkF0dHJpYnV0ZXMoKSAhPSBmb3JlaWduLmdldE51bU9mQXR0cmlidXRlcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGkgPSAwOyBpIDwgZ2V0TnVtT2ZBdHRyaWJ1dGVzKCk7IGkrKykgewotCQkJaWYgKGdldEF0dHJpYnV0ZShpKS5jb21wYXJlVG9JZ25vcmVDYXNlKGZvcmVpZ24uZ2V0QXR0cmlidXRlKGkpKSAhPSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKGludCBpbmRleCkgewotCQlpZiAoZkF0dHJpYnV0ZSAhPSBudWxsICYmIDAgPD0gaW5kZXggJiYgaW5kZXggPCBmQXR0cmlidXRlLnNpemUoKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIGZBdHRyaWJ1dGUuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3MoaW50IGluZGV4KSB7Ci0JCWlmIChmQ2xhc3MgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZkNsYXNzLnNpemUoKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIGZDbGFzcy5nZXQoaW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRChpbnQgaW5kZXgpIHsKLQkJaWYgKGZJRCAhPSBudWxsICYmIDAgPD0gaW5kZXggJiYgaW5kZXggPCBmSUQuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZklELmdldChpbmRleCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1UeXBlKCkgewotCQlyZXR1cm4gU0lNUExFOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIChmTmFtZSAhPSBudWxsKSA/IGZOYW1lIDogIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gKGZBdHRyaWJ1dGUgIT0gbnVsbCkgPyBmQXR0cmlidXRlLnNpemUoKSA6IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGludCBnZXROdW1PZkNsYXNzZXMoKSB7Ci0JCXJldHVybiAoZkNsYXNzICE9IG51bGwpID8gZkNsYXNzLnNpemUoKSA6IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGludCBnZXROdW1PZklEcygpIHsKLQkJcmV0dXJuIChmSUQgIT0gbnVsbCkgPyBmSUQuc2l6ZSgpIDogMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bU9mUHNldWRvTmFtZXMoKSB7Ci0JCXJldHVybiAoZlBzZXVkb05hbWUgIT0gbnVsbCkgPyBmUHNldWRvTmFtZS5zaXplKCkgOiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQc2V1ZG9OYW1lKGludCBpbmRleCkgewotCQlpZiAoZlBzZXVkb05hbWUgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZlBzZXVkb05hbWUuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZlBzZXVkb05hbWUuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJaWYgKGZDYWNoZWRTdHJpbmcgPT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0TmFtZSgpKTsKLQkJCWlmIChmU3RyaW5nQnVmICE9IG51bGwpIHsKLQkJCQlidWYuYXBwZW5kKGZTdHJpbmdCdWYudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlmQ2FjaGVkU3RyaW5nID0gYnVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGZDYWNoZWRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbml2ZXJzYWwoKSB7Ci0JCXJldHVybiAoZk5hbWUgPT0gbnVsbCB8fCBmTmFtZS5lcXVhbHMoIioiKSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlmTmFtZSA9IG5hbWU7Ci0JCWZDYWNoZWRTdHJpbmcgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2JmMzg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0vKioKLSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgZXh0ZW5kcyBDU1NOb2RlSW1wbCB7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQotCS8qKgotCSAqIENTU0NvbnRhaW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3NzVGV4dCgpIHsKLQkJaWYgKGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBnZW5lcmF0ZVNvdXJjZSgpOwotCi0JCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQl3aGlsZSAobm9kZSAhPSBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJCXN0ci5hcHBlbmQobm9kZS5nZXRUZXh0KCkpOwotCQl9Ci0KLQkJcmV0dXJuIHN0ci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldEVuZCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCBpbmRleCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJZm9yIChpbnQgaSA9IGluZGV4OyBpID4gMDsgaS0tKSB7Ci0JCQlpZiAobm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCkgewotCQlpZiAoZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoOyBub2RlICE9IG51bGw7IGkrKykKLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJcmV0dXJuIGk7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JYm9vbGVhbiBpbmNsdWRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0KSB7Ci0JCWJvb2xlYW4gYk1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJLy8gdmFsaWRhdGUgcmFuZ2Ugb2YgcGFyYW1ldGVycwotCQlpZiAoZmlyc3QgIT0gbnVsbCAmJiBsYXN0ICE9IG51bGwpIHsKLQkJCWlmIChmaXJzdC5nZXRTdGFydCgpID4gbGFzdC5nZXRTdGFydCgpKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZmlyc3Q7Ci0JCQkJZmlyc3QgPSBsYXN0OwotCQkJCWxhc3QgPSBub2RlOwotCQkJfQotCQl9Ci0KLQkJLy8gdmFsaWRhdGUgbWluZQotCQlib29sZWFuIGIgPSB2YWxpZGF0ZVJhbmdlKCk7Ci0JCWJNb2RpZmllZCA9IGIgfHwgYk1vZGlmaWVkOwotCi0JCWlmIChmaXJzdCAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsIHx8IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnQoKSA+IGZpcnN0LmdldFN0YXJ0KCkpIHsKLQkJCQlzZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmaXJzdCk7Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmIChsYXN0ICE9IG51bGwpIHsKLQkJCWlmIChnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCB8fCBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnQoKSA8IGxhc3QuZ2V0U3RhcnQoKSkgewotCQkJCXNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obGFzdCk7Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlLXZhbGlkYXRlCi0JCWlmIChiTW9kaWZpZWQpCi0JCQl2YWxpZGF0ZVJhbmdlKCk7Ci0KLQkJcmV0dXJuIGJNb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJYm9vbGVhbiBiTW9kaWZpZWQgPSBmYWxzZTsKLQotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgcGFyZW50ID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gYk1vZGlmaWVkOwotCi0JCWJvb2xlYW4gYiA9IHBhcmVudC5pbmNsdWRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJYk1vZGlmaWVkID0gYiB8fCBiTW9kaWZpZWQ7Ci0KLQkJaWYgKGIpCi0JCQlwYXJlbnQucHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJLy8gZWxzZSBuZWVkIG5vdCB1cGRhdGUgcmFuZ2Ugb2YgYW5jZXN0b3JzCi0KLQkJcmV0dXJuIGJNb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3NzVGV4dAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc1RleHQoU3RyaW5nIGNzc1RleHQpIHsKLQkJaWYgKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIGdldFN0YXJ0T2Zmc2V0KCksIGdldEVuZE9mZnNldCgpIC0gZ2V0U3RhcnRPZmZzZXQoKSwgY3NzVGV4dCk7Ci0JCX0KLQkJZWxzZQotCQkJc3VwZXIuc2V0Q3NzVGV4dChjc3NUZXh0KTsKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGU7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGU7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlKSB7Ci0JCWlmIChmaXJzdE5vZGUgIT0gbnVsbCkKLQkJCXNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZpcnN0Tm9kZSk7Ci0JCWlmIChsYXN0Tm9kZSAhPSBudWxsKQotCQkJc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihsYXN0Tm9kZSk7Ci0KLQkJaWYgKGZpcnN0Tm9kZSA9PSBudWxsICYmIGxhc3ROb2RlID09IG51bGwpIHsKLQkJCXNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJfQotCQllbHNlIHsgLy8gcmFuZ2UgdmFsaWRhdGlvbgotCQkJdmFsaWRhdGVSYW5nZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUmFuZ2UoKSB7Ci0JCWJvb2xlYW4gYk1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJaWYgKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgfHwgbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5maXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5maXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMubGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5sYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQl0aGlzLmxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSB0aGlzLmZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmICh0aGlzLmZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgPiB0aGlzLmxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSkgewotCQkJCS8vIG5lZWQgdG8gc3dhcCBmaXJzdCBmb3IgbGFzdAotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQlsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZTsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJNb2RpZmllZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbEl0ZW1JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbEl0ZW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YTVjYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xJdGVtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuU3R5bGVEZWNsSXRlbUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1NvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlRleHRSZWdpb25MaXN0SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1N0eWxlRGVjbEl0ZW1JbXBsIGV4dGVuZHMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSUNTU1N0eWxlRGVjbEl0ZW0gewotCi0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGZQcm9wZXJ0eU5hbWU7Ci0KLQkvKioKLQkgKiBDU1NTdHlsZURlY2xJdGVtSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCUNTU1N0eWxlRGVjbEl0ZW1JbXBsKENTU1N0eWxlRGVjbEl0ZW1JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JCXRoaXMuZlByb3BlcnR5TmFtZSA9IHRoYXQuZlByb3BlcnR5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBDU1NTdHlsZURlY2xJdGVtSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU1N0eWxlRGVjbEl0ZW1JbXBsKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlwdWJsaWMgSUNTU1ByaW1pdGl2ZVZhbHVlIGFwcGVuZFZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBpbnNlcnRWYWx1ZUJlZm9yZSh2YWx1ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBjbG9uZWQgPSBuZXcgQ1NTU3R5bGVEZWNsSXRlbUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVZhbHVlU291cmNlKCkgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcih0aGlzKTsKLQkJaWYgKGZvcm1hdHRlciAhPSBudWxsICYmIGZvcm1hdHRlciBpbnN0YW5jZW9mIFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIpCi0JCQlyZXR1cm4gKChTdHlsZURlY2xJdGVtRm9ybWF0dGVyKSBmb3JtYXR0ZXIpLmZvcm1hdFZhbHVlKHRoaXMpLnRvU3RyaW5nKCk7Ci0JCWVsc2UKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWUKLQkgKi8KLQlwdWJsaWMgQ1NTVmFsdWUgZ2V0Q1NTVmFsdWUoKSB7Ci0JCWludCBuVmFsdWUgPSBnZXRMZW5ndGgoKTsKLQkJaWYgKG5WYWx1ZSA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKG5WYWx1ZSA9PSAxKQotCQkJcmV0dXJuIGl0ZW0oMCk7Ci0JCWVsc2UKLQkJCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENTU1ZhbHVlVGV4dCgpIHsKLQkJaWYgKGdldEZpcnN0Q2hpbGQoKSA9PSBudWxsKQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJLy8gY2hlY2sgd2hldGhlciBjaGlsZHJlbiBoYXMgZmxhdG5vZGVzCi0JCUlDU1NOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldEVuZE9mZnNldCgpIDw9IDApCi0JCQkJcmV0dXJuIGdlbmVyYXRlVmFsdWVTb3VyY2UoKTsKLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIC0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBnZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgLSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCXJldHVybiBub2RlLmdldFRleHQoKS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRDc3NWYWx1ZVR5cGUoKSB7Ci0JCXJldHVybiBDU1NfVkFMVUVfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkKLQkJCQlpKys7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFNUWUxFREVDTElURU1fTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcmlvcml0eSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShJTVBPUlRBTlQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGZQcm9wZXJ0eU5hbWUudHJpbSgpOwotCQlyZXR1cm4gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihuYW1lKSAhPSBudWxsID8gZlByb3BlcnR5TmFtZS50cmltKCkudG9Mb3dlckNhc2UoKSA6IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSByZWZWYWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIGluc2VydFZhbHVlQmVmb3JlKElDU1NQcmltaXRpdmVWYWx1ZSBuZXdWYWx1ZSwgSUNTU1ByaW1pdGl2ZVZhbHVlIHJlZlZhbHVlKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBpbnNlcnRCZWZvcmUoKENTU05vZGVJbXBsKSBuZXdWYWx1ZSwgKENTU05vZGVJbXBsKSByZWZWYWx1ZSk7Ci0JCXJldHVybiAoSUNTU1ByaW1pdGl2ZVZhbHVlKSBub2RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgQ1NTVmFsdWUgaXRlbShpbnQgaW5kZXgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHsKLQkJCQlpZiAoaSsrID09IGluZGV4KQotCQkJCQlyZXR1cm4gKENTU1ZhbHVlKSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlwdWJsaWMgSUNTU1ByaW1pdGl2ZVZhbHVlIHJlbW92ZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUlDU1NOb2RlIG5vZGUgPSByZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIHZhbHVlKTsKLQkJcmV0dXJuIChJQ1NTUHJpbWl0aXZlVmFsdWUpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JcHVibGljIElDU1NQcmltaXRpdmVWYWx1ZSByZXBsYWNlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIG5ld1ZhbHVlLCBJQ1NTUHJpbWl0aXZlVmFsdWUgb2xkVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXdWYWx1ZTsKLQkJaWYgKG5ld1ZhbHVlICE9IG51bGwpCi0JCQlpbnNlcnRWYWx1ZUJlZm9yZShuZXdWYWx1ZSwgb2xkVmFsdWUpOwotCQlyZXR1cm4gcmVtb3ZlVmFsdWUob2xkVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDc3NWYWx1ZVRleHQoU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJSUNTU05vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlJQ1NTTm9kZSBuZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElDU1NQcmltaXRpdmVWYWx1ZSkgewotCQkJCXJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgY2hpbGQpOwotCQkJfQotCQkJY2hpbGQgPSBuZXh0OwotCQl9Ci0JCXNldENzc1ZhbHVlVGV4dENvcmUodmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDc3NWYWx1ZVRleHRDb3JlKFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIHVzZSB0ZW1wb3JhcnkgZG9jdW1lbnQKLQkJc3luY2hyb25pemVkIChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbC5jbGFzcykgewotCQkJaWYgKHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG5ldyBDU1NEb2N1bWVudExvYWRlcigpOwotCQkJCXNoYXJlZFN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJKChDU1NTb3VyY2VQYXJzZXIpIHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSkuc2V0UGFyc2VyTW9kZShDU1NTb3VyY2VQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSk7Ci0KLQkJCX0KLQkJCXNoYXJlZFN0cnVjdHVyZWREb2N1bWVudC5zZXQodmFsdWUpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gc2hhcmVkU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAobm9kZS5nZXROZXh0KCkgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyIGl0ZW1QYXJzZXIgPSBuZXcgQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyKGdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQlpdGVtUGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudFRlbXBvcmFyeSh0cnVlKTsKLQkJCS8vIG1ha2UgYSBjb3B5IG9mIG5vZGVsaXN0IGJlY2F1c2Ugc2V0dXBWYWx1ZXMgd2lsbCBkZXN0cm95IGxpc3QKLQkJCUlUZXh0UmVnaW9uTGlzdCBub2RlTGlzdCA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwobm9kZS5nZXRSZWdpb25zKCkpOwotCQkJaXRlbVBhcnNlci5zZXR1cFZhbHVlcyh0aGlzLCBub2RlLCBub2RlTGlzdCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50IHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudDsKLQotCS8qKgotCSAqIEBwYXJhbSBuZXdQcmlvcml0eQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaW9yaXR5KGphdmEubGFuZy5TdHJpbmcgbmV3UHJpb3JpdHkpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoSU1QT1JUQU5ULCBuZXdQcmlvcml0eSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnlDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNTY0ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnlDb250ZXh0IHsKLQotCXByb3RlY3RlZCBJQ1NTRG9jdW1lbnQgZk93bmVyRG9jdW1lbnQgPSBudWxsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xvbmVDaGlsZE5vZGVzKElDU1NOb2RlIHNyYywgSUNTU05vZGUgZGVzdCkgewotCQlpZiAoZk93bmVyRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKGRlc3QgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUNTU05vZGVJbXBsIGNvbnRhaW5lciA9IChDU1NOb2RlSW1wbCkgZGVzdDsKLQkJY29udGFpbmVyLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gc3JjLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xJdGVtSW1wbCkgewotCQkJCS8vIGV4dHJhY3Qgc2hvcnRoYW5kIHByb3BlcnR5IC4uCi0JCQkJLy8gLS0+IFRlbXAKLQkJCQlJQ1NTTm9kZSBjbG9uZWQgPSBjaGlsZC5jbG9uZU5vZGUoZmFsc2UpOwotCQkJCWlmIChjbG9uZWQgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkgewotCQkJCQkoKENTU05vZGVJbXBsKSBjbG9uZWQpLnNldE93bmVyRG9jdW1lbnQoZk93bmVyRG9jdW1lbnQpOwotCQkJCQljb250YWluZXIuYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKSBjbG9uZWQpOwotCQkJCQljbG9uZUNoaWxkTm9kZXMoY2hpbGQsIGNsb25lZCk7Ci0JCQkJfQotCQkJCS8vIDwtLSBUZW1wCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJQ1NTTm9kZSBjbG9uZWQgPSBjaGlsZC5jbG9uZU5vZGUoZmFsc2UpOwotCQkJCWlmIChjbG9uZWQgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkgewotCQkJCQkoKENTU05vZGVJbXBsKSBjbG9uZWQpLnNldE93bmVyRG9jdW1lbnQoZk93bmVyRG9jdW1lbnQpOwotCQkJCQljb250YWluZXIuYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKSBjbG9uZWQpOwotCQkJCQljbG9uZUNoaWxkTm9kZXMoY2hpbGQsIGNsb25lZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVTdHlsZURlY2xhcmF0aW9uKCkgewotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBkZWNsID0gbmV3IENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKHRydWUpOwotCQlkZWNsLnNldE93bmVyRG9jdW1lbnQoZGVjbCk7Ci0JCXJldHVybiBkZWNsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGFlZDQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBleHRlbmRzIENTU0RvY3VtZW50SW1wbCBpbXBsZW1lbnRzIElDU1NTdHlsZURlY2xhcmF0aW9uIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmSXNEb2N1bWVudDsKLQotCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JCXRoaXMuZklzRG9jdW1lbnQgPSB0aGF0LmZJc0RvY3VtZW50OwotCQlpZiAoZklzRG9jdW1lbnQpIHsKLQkJCXNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCX0KLQl9Ci0KLQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbChib29sZWFuIGlzRG9jdW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJZklzRG9jdW1lbnQgPSBpc0RvY3VtZW50OwotCQlpZiAoZklzRG9jdW1lbnQpIHsKLQkJCXNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBjbG9uZWQgPSBuZXcgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsSXRlbSBnZXREZWNsSXRlbU5vZGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0TGFzdENoaWxkKCk7Ci0JCXByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS50cmltKCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsSXRlbUltcGwpIHsKLQkJCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gKElDU1NTdHlsZURlY2xJdGVtKSBub2RlOwotCQkJCWlmIChwcm9wZXJ0eU5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShpdGVtLmdldFByb3BlcnR5TmFtZSgpLnRyaW0oKSkgPT0gMCkKLQkJCQkJcmV0dXJuIGl0ZW07Ci0JCQl9Ci0JCQlub2RlID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpbnQgaSA9IDA7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsSXRlbUltcGwpCi0JCQkJaSsrOwotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gaTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gU1RZTEVERUNMQVJBVElPTl9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSBDU1MgcnVsZSB0aGF0IGNvbnRhaW5zIHRoaXMgZGVjbGFyYXRpb24gYmxvY2sgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiB0aGlzIDxjb2RlPkNTU1N0eWxlRGVjbGFyYXRpb248L2NvZGU+IGlzIG5vdCBhdHRhY2hlZCB0byBhCi0JICogPGNvZGU+Q1NTUnVsZTwvY29kZT4uCi0JICovCi0JcHVibGljIENTU1J1bGUgZ2V0UGFyZW50UnVsZSgpIHsKLQkJSUNTU05vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTUnVsZSkKLQkJCXJldHVybiAoQ1NTUnVsZSkgcGFyZW50OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIHRoZSBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIGEgQ1NTCi0JICogcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQgd2l0aGluIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcHJvcGVydHkgaXMgYSBzaG9ydGhhbmQKLQkgKiBwcm9wZXJ0eS4gU2hvcnRoYW5kIHByb3BlcnR5IHZhbHVlcyBjYW4gb25seSBiZSBhY2Nlc3NlZCBhbmQgbW9kaWZpZWQKLQkgKiBhcyBzdHJpbmdzLCB1c2luZyB0aGUgPGNvZGU+Z2V0UHJvcGVydHlWYWx1ZTwvY29kZT4gYW5kCi0JICogPGNvZGU+c2V0UHJvcGVydHk8L2NvZGU+IG1ldGhvZHMuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eS4gU2VlIHRoZSBDU1MgcHJvcGVydHkgaW5kZXguCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQKLQkgKiAgICAgICAgIGZvciB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqICAgICAgICAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHNldC4KLQkgKi8KLQlwdWJsaWMgQ1NTVmFsdWUgZ2V0UHJvcGVydHlDU1NWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW0gPSBnZXREZWNsSXRlbU5vZGUocHJvcGVydHlOYW1lKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkKLQkJCXJldHVybiBpdGVtLmdldENTU1ZhbHVlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgdGhlIHByaW9yaXR5IG9mIGEgQ1NTIHByb3BlcnR5IChlLmcuIHRoZQotCSAqIDxjb2RlPiJpbXBvcnRhbnQiPC9jb2RlPiBxdWFsaWZpZXIpIGlmIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbgotCSAqIGV4cGxpY2l0bHkgc2V0IGluIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eS4gU2VlIHRoZSBDU1MgcHJvcGVydHkgaW5kZXguCi0JICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByaW9yaXR5IChlLmcuCi0JICogICAgICAgICA8Y29kZT4iaW1wb3J0YW50IjwvY29kZT4pIGlmIG9uZSBleGlzdHMuIFRoZSBlbXB0eSBzdHJpbmcgaWYKLQkgKiAgICAgICAgIG5vbmUgZXhpc3RzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlQcmlvcml0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW0gPSBnZXREZWNsSXRlbU5vZGUocHJvcGVydHlOYW1lKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkKLQkJCXJldHVybiBpdGVtLmdldFByaW9yaXR5KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgdGhlIHZhbHVlIG9mIGEgQ1NTIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkKLQkgKiBzZXQgd2l0aGluIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eS4gU2VlIHRoZSBDU1MgcHJvcGVydHkgaW5kZXguCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQKLQkgKiAgICAgICAgIGZvciB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlCi0JICogICAgICAgICBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gc2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUNTU1ZhbHVlIHZhbHVlID0gZ2V0UHJvcGVydHlDU1NWYWx1ZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCXJldHVybiAoKElDU1NWYWx1ZSkgdmFsdWUpLmdldENTU1ZhbHVlVGV4dCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RvY3VtZW50KCkgewotCQlyZXR1cm4gZklzRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBleHBsaWNpdGx5IHNldCBpbiB0aGlzCi0JICogZGVjbGFyYXRpb24gYmxvY2suIFRoZSBvcmRlciBvZiB0aGUgcHJvcGVydGllcyByZXRyaWV2ZWQgdXNpbmcgdGhpcwotCSAqIG1ldGhvZCBkb2VzIG5vdCBoYXZlIHRvIGJlIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgc2V0LiBUaGlzCi0JICogbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGl0ZXJhdGUgb3ZlciBhbGwgcHJvcGVydGllcyBpbiB0aGlzIGRlY2xhcmF0aW9uCi0JICogYmxvY2suCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBJbmRleCBvZiB0aGUgcHJvcGVydHkgbmFtZSB0byByZXRyaWV2ZS4KLQkgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhdCB0aGlzIG9yZGluYWwgcG9zaXRpb24uIFRoZSBlbXB0eQotCSAqICAgICAgICAgc3RyaW5nIGlmIG5vIHByb3BlcnR5IGV4aXN0cyBhdCB0aGlzIHBvc2l0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBpID0gMDsKLQkJSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xJdGVtSW1wbCkgewotCQkJCWlmIChpICE9IGluZGV4KQotCQkJCQlpKys7Ci0JCQkJZWxzZSB7Ci0JCQkJCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGl0ZW0gPSAoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIG5vZGU7Ci0JCQkJCXJldHVybiBpdGVtLmdldFByb3BlcnR5TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDU1NTdHlsZURlY2xJdGVtIHJlbW92ZURlY2xJdGVtTm9kZShJQ1NTU3R5bGVEZWNsSXRlbSBvbGREZWNsKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChJQ1NTU3R5bGVEZWNsSXRlbSkgcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSBvbGREZWNsKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJlbW92ZSBhIENTUyBwcm9wZXJ0eSBpZiBpdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldCB3aXRoaW4gdGhpcwotCSAqIGRlY2xhcmF0aW9uIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkuIFNlZSB0aGUgQ1NTIHByb3BlcnR5IGluZGV4LgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0Ci0JICogICAgICAgICBmb3IgdGhpcyBkZWNsYXJhdGlvbiBibG9jay4gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZQotCSAqICAgICAgICAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHNldCBvciB0aGUgcHJvcGVydHkgbmFtZSBkb2VzIG5vdAotCSAqICAgICAgICAgY29ycmVzcG9uZCB0byBhIGtub3duIENTUyBwcm9wZXJ0eS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgZGVjbGFyYXRpb24KLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seSBvciB0aGUgcHJvcGVydHkgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyByZW1vdmVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSA9IGdldERlY2xJdGVtTm9kZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQlyZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIGl0ZW0pOwotCQkJcmV0dXJuIGl0ZW0uZ2V0Q3NzVGV4dCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsSXRlbSBzZXREZWNsSXRlbU5vZGUoSUNTU1N0eWxlRGVjbEl0ZW0gbmV3RGVjbCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdEZWNsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gZ2V0RGVjbEl0ZW1Ob2RlKG5ld0RlY2wuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlpZiAoaXRlbSAhPSBudWxsKQotCQkJcmV0dXJuIChJQ1NTU3R5bGVEZWNsSXRlbSkgcmVwbGFjZUNoaWxkKChDU1NOb2RlSW1wbCkgbmV3RGVjbCwgKENTU05vZGVJbXBsKSBpdGVtKTsKLQkJZWxzZQotCQkJcmV0dXJuIChJQ1NTU3R5bGVEZWNsSXRlbSkgYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKSBuZXdEZWNsKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlIGFuZCBwcmlvcml0eSB3aXRoaW4gdGhpcyBkZWNsYXJhdGlvbgotCSAqIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkuIFNlZSB0aGUgQ1NTIHByb3BlcnR5IGluZGV4LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0JICogQHBhcmFtIHByaW9yaXR5Ci0JICogICAgICAgICAgICBUaGUgbmV3IHByaW9yaXR5IG9mIHRoZSBwcm9wZXJ0eSAoZS5nLgotCSAqICAgICAgICAgICAgPGNvZGU+ImltcG9ydGFudCI8L2NvZGU+KS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGhhcyBhIHN5bnRheAotCSAqICAgICAgICAgICAgICAgIGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBkZWNsYXJhdGlvbgotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5IG9yIHRoZSBwcm9wZXJ0eSBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBwcmlvcml0eSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBZb3UgY2FuIHVzZSB0aGlzIG9ubHkgaWYgQ1NTVmFsdWUuc2V0Q3NzVGV4dCgpIGlzIGltcGxlbWVudGVkCi0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGl0ZW0gPSAoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIGdldERlY2xJdGVtTm9kZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQlpdGVtID0gKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTU3R5bGVEZWNsSXRlbShwcm9wZXJ0eU5hbWUpOwotCQkJYXBwZW5kQ2hpbGQoaXRlbSk7Ci0JCX0KLQotCQkvLyBJQ1NTTm9kZSBuZXh0ID0gaXRlbS5nZXROZXh0U2libGluZygpOwotCQkvLyByZW1vdmVDaGlsZChpdGVtKTsKLQotCQlpdGVtLnNldENzc1ZhbHVlVGV4dCh2YWx1ZSk7Ci0JCWl0ZW0uc2V0UHJpb3JpdHkocHJpb3JpdHkpOwotCi0JCS8vIGluc2VydEJlZm9yZShpdGVtLCAoQ1NTTm9kZUltcGwpbmV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2NmYwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTdHlsZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZURlY2xDb250YWluZXIgaW1wbGVtZW50cyBJQ1NTU3R5bGVSdWxlIHsKLQotCUlDU1NTZWxlY3Rvckxpc3QgZlNlbGVjdG9yTGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKG51bGwpOwotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU3R5bGVSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NTdHlsZVJ1bGVJbXBsKENTU1N0eWxlUnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NTdHlsZVJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NTdHlsZVJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZXh0cmFjdFByZVN0cmluZygpIHsKLQkJcmV0dXJuIGdldFNlbGVjdG9yVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBTVFlMRVJVTEVfTk9ERTsKLQl9Ci0KLQlwdWJsaWMgSUNTU1NlbGVjdG9yTGlzdCBnZXRTZWxlY3RvcnMoKSB7Ci0JCXJldHVybiBmU2VsZWN0b3JMaXN0OwotCX0KLQotCS8qKgotCSAqIFRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWxlY3RvciBmb3IgdGhlIHJ1bGUgc2V0LiBUaGUKLQkgKiBpbXBsZW1lbnRhdGlvbiBtYXkgaGF2ZSBzdHJpcHBlZCBvdXQgaW5zaWduaWZpY2FudCB3aGl0ZXNwYWNlIHdoaWxlCi0JICogcGFyc2luZyB0aGUgc2VsZWN0b3IuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBDU1Mgc3RyaW5nIHZhbHVlIGhhcwotCSAqICAgICAgICAgICAgICAgIGEgc3ludGF4IGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBydWxlIGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclRleHQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoU0VMRUNUT1IpOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFNUWUxFX1JVTEU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0b3JUZXh0KFN0cmluZyBzZWxlY3RvclRleHQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoU0VMRUNUT1IsIHNlbGVjdG9yVGV4dCk7Ci0JCWZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChzZWxlY3RvclRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVTaGVldEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVTaGVldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2NmFmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlU2hlZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydFJ1bGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1N0eWxlU2hlZXRJbXBsIGV4dGVuZHMgQ1NTRG9jdW1lbnRJbXBsIGltcGxlbWVudHMgSUNTU1N0eWxlU2hlZXQgewotCi0KLQljbGFzcyBJbnRlcm5hbE5vZGVMaXN0IGltcGxlbWVudHMgTm9kZUxpc3QgewotCi0JCVZlY3RvciBub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCWlmIChub2RlcyA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCQkJZWxzZQotCQkJCXJldHVybiBub2Rlcy5zaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpKSB7Ci0JCQlpZiAobm9kZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChpIDwgMCB8fCBub2Rlcy5zaXplKCkgPD0gaSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoTm9kZSkgbm9kZXMuZ2V0KGkpOwotCQl9Ci0JfQotCi0JY2xhc3MgSW50ZXJuYWxTdHlsZVNoZWV0TGlzdCBleHRlbmRzIEFic3RyYWN0Q1NTTm9kZUxpc3QgaW1wbGVtZW50cyBTdHlsZVNoZWV0TGlzdCB7Ci0KLQkJcHVibGljIElDU1NOb2RlIGFwcGVuZE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQkJaWYgKG5vZGVzID09IG51bGwgfHwgIW5vZGVzLmNvbnRhaW5zKG5vZGUpKQotCQkJCXJldHVybiBzdXBlci5hcHBlbmROb2RlKG5vZGUpOwotCQkJZWxzZQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0KLQkJcHVibGljIFN0eWxlU2hlZXQgaXRlbShpbnQgaSkgewotCQkJcmV0dXJuIChTdHlsZVNoZWV0KSBpdGVtSW1wbChpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmRGlzYWJsZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlU2hlZXRJbXBsKCkgewotCQlzdXBlcigpOwotCQlzZXRPd25lckRvY3VtZW50KHRoaXMpOwotCX0KLQotCUNTU1N0eWxlU2hlZXRJbXBsKENTU1N0eWxlU2hlZXRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JCXNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgYXBwZW5kUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBydWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIGFwcGVuZENoaWxkKChDU1NOb2RlSW1wbCkgcnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTU3R5bGVTaGVldEltcGwgY2xvbmVkID0gbmV3IENTU1N0eWxlU2hlZXRJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NDaGFyc2V0UnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTQ2hhcnNldFJ1bGUgY3JlYXRlQ1NTQ2hhcnNldFJ1bGUoKSB7Ci0JCUNTU0NoYXJzZXRSdWxlSW1wbCBydWxlID0gbmV3IENTU0NoYXJzZXRSdWxlSW1wbCgpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZQotCSAqLwotCXB1YmxpYyBDU1NGb250RmFjZVJ1bGUgY3JlYXRlQ1NTRm9udEZhY2VSdWxlKCkgewotCQlDU1NGb250RmFjZVJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTRm9udEZhY2VSdWxlSW1wbCgpOwotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBzdHlsZSA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotCi0JCXJ1bGUuYXBwZW5kQ2hpbGQoc3R5bGUpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTSW1wb3J0UnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTSW1wb3J0UnVsZSBjcmVhdGVDU1NJbXBvcnRSdWxlKCkgewotCQlDU1NJbXBvcnRSdWxlSW1wbCBydWxlID0gbmV3IENTU0ltcG9ydFJ1bGVJbXBsKCk7Ci0JCU1lZGlhTGlzdEltcGwgbWVkaWEgPSAoTWVkaWFMaXN0SW1wbCkgY3JlYXRlTWVkaWFMaXN0KCk7Ci0KLQkJcnVsZS5hcHBlbmRDaGlsZChtZWRpYSk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5JQ1NTTWVkaWFSdWxlCi0JICovCi0JcHVibGljIElDU1NNZWRpYVJ1bGUgY3JlYXRlQ1NTTWVkaWFSdWxlKCkgewotCQlDU1NNZWRpYVJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTTWVkaWFSdWxlSW1wbCgpOwotCQlNZWRpYUxpc3RJbXBsIG1lZGlhID0gKE1lZGlhTGlzdEltcGwpIGNyZWF0ZU1lZGlhTGlzdCgpOwotCi0JCXJ1bGUuaW5zZXJ0QmVmb3JlKG1lZGlhLCAoQ1NTTm9kZUltcGwpIHJ1bGUuZ2V0Rmlyc3RDaGlsZCgpKTsgLy8gbWVkaWEKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG11c3QKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvcAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gb2YKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNoaWxkcmVuCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBsaXN0Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQYWdlUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTUGFnZVJ1bGUgY3JlYXRlQ1NTUGFnZVJ1bGUoKSB7Ci0JCUNTU1BhZ2VSdWxlSW1wbCBydWxlID0gbmV3IENTU1BhZ2VSdWxlSW1wbCgpOwotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBzdHlsZSA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotCi0JCXJ1bGUuYXBwZW5kQ2hpbGQoc3R5bGUpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENTU1J1bGUgY3JlYXRlQ1NTUnVsZShTdHJpbmcgcnVsZSkgewotCQlDU1NEb2N1bWVudExvYWRlciBsb2FkZXIgPSBuZXcgQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0KHJ1bGUpOwotCi0JCS8vQ1NTTW9kZWxQYXJzZXIgbW9kZWxQYXJzZXIgPSBuZXcgQ1NTTW9kZWxQYXJzZXIoKENTU0RvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJQ1NTTW9kZWxQYXJzZXIgbW9kZWxQYXJzZXIgPSBuZXcgQ1NTTW9kZWxQYXJzZXIoZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJcmV0dXJuIG1vZGVsUGFyc2VyLmNyZWF0ZUNTU1J1bGUoc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCkgewotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBkZWNsID0gbmV3IENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKGZhbHNlKTsKLQkJZGVjbC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBkZWNsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVSdWxlIGNyZWF0ZUNTU1N0eWxlUnVsZSgpIHsKLQkJQ1NTU3R5bGVSdWxlSW1wbCBydWxlID0gbmV3IENTU1N0eWxlUnVsZUltcGwoKTsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgc3R5bGUgPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKTsKLQotCQlydWxlLmFwcGVuZENoaWxkKHN0eWxlKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlCi0JICovCi0JcHVibGljIENTU1Vua25vd25SdWxlIGNyZWF0ZUNTU1Vua25vd25SdWxlKCkgewotCQlDU1NVbmtub3duUnVsZUltcGwgcnVsZSA9IG5ldyBDU1NVbmtub3duUnVsZUltcGwoKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0Ci0JICovCi0JcHVibGljIE1lZGlhTGlzdCBjcmVhdGVNZWRpYUxpc3QoKSB7Ci0JCU1lZGlhTGlzdEltcGwgbWVkaWEgPSBuZXcgTWVkaWFMaXN0SW1wbCgpOwotCQltZWRpYS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBtZWRpYTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRlbGV0ZSBhIHJ1bGUgZnJvbSB0aGUgc3R5bGUgc2hlZXQuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBUaGUgaW5kZXggd2l0aGluIHRoZSBzdHlsZSBzaGVldCdzIHJ1bGUgbGlzdCBvZiB0aGUgcnVsZSB0bwotCSAqICAgICAgICAgICAgcmVtb3ZlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGRvZXMgbm90Ci0JICogICAgICAgICAgICAgICAgY29ycmVzcG9uZCB0byBhIHJ1bGUgaW4gdGhlIHN0eWxlIHNoZWV0J3MgcnVsZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHN0eWxlIHNoZWV0Ci0JICogICAgICAgICAgICAgICAgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlUnVsZShpbnQgaW5kZXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlDU1NOb2RlSW1wbCBub2RlID0gZ2V0SW5kZXhlZFJ1bGUoaW5kZXgpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmVtb3ZlQ2hpbGQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGxpc3Qgb2YgYWxsIENTUyBydWxlcyBjb250YWluZWQgd2l0aGluIHRoZSBzdHlsZSBzaGVldC4gVGhpcwotCSAqIGluY2x1ZGVzIGJvdGggcnVsZSBzZXRzIGFuZCBhdC1ydWxlcy4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZUxpc3QgZ2V0Q3NzUnVsZXMoKSB7Ci0JCUNTU1J1bGVMaXN0SW1wbCBsaXN0ID0gbmV3IENTU1J1bGVMaXN0SW1wbCgpOwotCi0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1J1bGUpIHsKLQkJCQlsaXN0LmFwcGVuZE5vZGUobm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgQ1NTUnVsZUxpc3QgZ2V0Q3NzUnVsZXMoYm9vbGVhbiBzaG91bGRJbXBvcnQpIHsKLQkJaWYgKCFzaG91bGRJbXBvcnQpCi0JCQlyZXR1cm4gZ2V0Q3NzUnVsZXMoKTsKLQotCQlDU1NSdWxlTGlzdEltcGwgbGlzdCA9IG5ldyBDU1NSdWxlTGlzdEltcGwoKTsKLQkJU3RhY2sgcmVmcyA9IG5ldyBTdGFjaygpOwotCQlnZXRSdWxlcyhsaXN0LCB0aGlzLCByZWZzKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFJ1bGVzKENTU1J1bGVMaXN0SW1wbCBsaXN0LCBJQ1NTU3R5bGVTaGVldCBzaGVldCwgU3RhY2sgcmVmcykgewotCQlTdHJpbmcgaHJlZiA9IHNoZWV0LmdldEhyZWYoKTsKLQkJaWYgKGhyZWYgIT0gbnVsbCkgewotCQkJLy8gQXZvaWQgY2lyY3VsYXIgQGltcG9ydHMKLQkJCWlmIChyZWZzLmNvbnRhaW5zKGhyZWYpKQotCQkJCXJldHVybjsKLQkJCXJlZnMucHVzaChocmVmKTsKLQkJfQotCQlib29sZWFuIGFjY2VwdEltcG9ydHMgPSB0cnVlOwotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBzaGVldC5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJLy8gSW1wb3J0IHRoZSBzdHlsZXNoZWV0IGludG8gdGhlIGxpc3QKLQkJCS8vIEBpbXBvcnQgcnVsZXMgbXVzdCBwcmVjZWRlIGFsbCBvdGhlciBydWxlcywgYWNjb3JkaW5nIHRvIHRoZSBzcGVjCi0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSAmJiBhY2NlcHRJbXBvcnRzKSB7Ci0JCQkJQ1NTU3R5bGVTaGVldCBpbXBvcnRTaGVldCA9ICgoSUNTU0ltcG9ydFJ1bGUpIG5vZGUpLmdldFN0eWxlU2hlZXQoKTsKLQkJCQlpZiAoaW1wb3J0U2hlZXQgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkKLQkJCQkJZ2V0UnVsZXMobGlzdCwgKElDU1NTdHlsZVNoZWV0KSBpbXBvcnRTaGVldCwgcmVmcyk7Ci0JCQkJZWxzZQotCQkJCQlsaXN0LmFwcGVuZE5vZGUobm9kZSk7Ci0JCQl9Ci0JCQkvLyBBZGQgdGhlIHJ1bGUgdG8gdGhlIGxpc3QKLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlKSB7Ci0JCQkJbGlzdC5hcHBlbmROb2RlKG5vZGUpOwotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuQ0hBUlNFVFJVTEVfTk9ERSkKLQkJCQkJYWNjZXB0SW1wb3J0cyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChocmVmICE9IG51bGwpCi0JCQlyZWZzLnBvcCgpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgc3R5bGUgc2hlZXQgaXMgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQuCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaXMgbm90LiBNb2RpZnlpbmcgdGhpcyBhdHRyaWJ1dGUgbWF5IGNhdXNlIGEKLQkgKiBuZXcgcmVzb2x1dGlvbiBvZiBzdHlsZSBmb3IgdGhlIGRvY3VtZW50LiBBIHN0eWxlc2hlZXQgb25seSBhcHBsaWVzIGlmCi0JICogYm90aCBhbiBhcHByb3ByaWF0ZSBtZWRpdW0gZGVmaW5pdGlvbiBpcyBwcmVzZW50IGFuZCB0aGUgZGlzYWJsZWQKLQkgKiBhdHRyaWJ1dGUgaXMgZmFsc2UuIFNvLCBpZiB0aGUgbWVkaWEgZG9lc24ndCBhcHBseSB0byB0aGUgY3VycmVudCB1c2VyCi0JICogYWdlbnQsIHRoZSA8Y29kZT5kaXNhYmxlZDwvY29kZT4gYXR0cmlidXRlIGlzIGlnbm9yZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZWQoKSB7Ci0JCXJldHVybiBmRGlzYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHN0eWxlIHNoZWV0IGlzIGEgbGlua2VkIHN0eWxlIHNoZWV0LCB0aGUgdmFsdWUgb2YgaXRzIGF0dHJpYnV0ZQotCSAqIGlzIGl0cyBsb2NhdGlvbi4gRm9yIGlubGluZSBzdHlsZSBzaGVldHMsIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZQotCSAqIGlzIDxjb2RlPm51bGw8L2NvZGU+LiBTZWUgdGhlIGhyZWYgYXR0cmlidXRlIGRlZmluaXRpb24gZm9yIHRoZQotCSAqIDxjb2RlPkxJTks8L2NvZGU+IGVsZW1lbnQgaW4gSFRNTCA0LjAsIGFuZCB0aGUgaHJlZiBwc2V1ZG8tYXR0cmlidXRlCi0JICogZm9yIHRoZSBYTUwgc3R5bGUgc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVYVEVSTkFMKSB7Ci0JCQlyZXR1cm4gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkvKgotCQkJICogT2JqZWN0IGlkID0gbW9kZWwuZ2V0SWQoKTsgaWYgKGlkICE9IG51bGwpIHsgaWYgKGlkIGluc3RhbmNlb2YKLQkJCSAqIElSZXNvdXJjZSkgeyAvLyBUT0RPOiBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBpcyBjb3JyZWN0IG9yCi0JCQkgKiBub3QsIGxhdGVyLiByZXR1cm4gKChJUmVzb3VyY2UpaWQpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsgfQotCQkJICogcmV0dXJuIGlkLnRvU3RyaW5nKCk7IH0KLQkJCSAqL30KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQ1NTUnVsZUltcGwgZ2V0SW5kZXhlZFJ1bGUoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1J1bGUpIHsKLQkJCQlpZiAoaSsrID09IGluZGV4KQotCQkJCQlyZXR1cm4gKENTU1J1bGVJbXBsKSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBpbnRlbmRlZCBkZXN0aW5hdGlvbiBtZWRpYSBmb3Igc3R5bGUgaW5mb3JtYXRpb24uIFRoZSBtZWRpYSBpcwotCSAqIG9mdGVuIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+b3duZXJOb2RlPC9jb2RlPi4gSWYgbm8gbWVkaWEgaGFzIGJlZW4KLQkgKiBzcGVjaWZpZWQsIHRoZSA8Y29kZT5NZWRpYUxpc3Q8L2NvZGU+IHdpbGwgYmUgZW1wdHkuIFNlZSB0aGUgbWVkaWEKLQkgKiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlIDxjb2RlPkxJTks8L2NvZGU+IGVsZW1lbnQgaW4gSFRNTCA0LjAsCi0JICogYW5kIHRoZSBtZWRpYSBwc2V1ZG8tYXR0cmlidXRlIGZvciB0aGUgWE1MIHN0eWxlIHNoZWV0IHByb2Nlc3NpbmcKLQkgKiBpbnN0cnVjdGlvbiAuIE1vZGlmeWluZyB0aGUgbWVkaWEgbGlzdCBtYXkgY2F1c2UgYSBjaGFuZ2UgdG8gdGhlCi0JICogYXR0cmlidXRlIDxjb2RlPmRpc2FibGVkPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWVkaWFMaXN0IGdldE1lZGlhKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gU1RZTEVTSEVFVF9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSBub2RlIHRoYXQgYXNzb2NpYXRlcyB0aGlzIHN0eWxlIHNoZWV0IHdpdGggdGhlIGRvY3VtZW50LiBGb3IgSFRNTCwKLQkgKiB0aGlzIG1heSBiZSB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5MSU5LPC9jb2RlPiBvciA8Y29kZT5TVFlMRTwvY29kZT4KLQkgKiBlbGVtZW50LiBGb3IgWE1MLCBpdCBtYXkgYmUgdGhlIGxpbmtpbmcgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gRm9yCi0JICogc3R5bGUgc2hlZXRzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IG90aGVyIHN0eWxlIHNoZWV0cywgdGhlIHZhbHVlIG9mIHRoaXMKLQkgKiBhdHRyaWJ1dGUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIE5vZGUgZ2V0T3duZXJOb2RlKCkgewotCQkvLyBmb3IgPExJTks+IHRhZyBvciA8U1RZTEU+IHRhZwotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCXJldHVybiBtb2RlbC5nZXRPd25lckRPTU5vZGUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlTGlzdCBnZXRPd25lck5vZGVzKCkgewotCQlMaXN0IGxpc3QgPSAoZ2V0TW9kZWwoKS5nZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwpID8gbmV3IFZlY3RvcihnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkpIDogbnVsbDsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbnRlcm5hbE5vZGVMaXN0IG5vZGVzID0gbmV3IEludGVybmFsTm9kZUxpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSB7Ci0JCQkJbm9kZXMubm9kZXMuYWRkKCgoSVN0eWxlU2hlZXRBZGFwdGVyKSBvYmopLmdldEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkKLQkJCXJldHVybiBub2RlczsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqIEBwYXJhbSBkb2MKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldE93bmVyTm9kZXMoRG9jdW1lbnQgZG9jKSB7Ci0JCUxpc3QgbGlzdCA9IChnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgPyBuZXcgVmVjdG9yKGdldE1vZGVsKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKSkgOiBudWxsOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUludGVybmFsTm9kZUxpc3Qgbm9kZXMgPSBuZXcgSW50ZXJuYWxOb2RlTGlzdCgpOwotCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU3R5bGVTaGVldEFkYXB0ZXIpIHsKLQkJCQlFbGVtZW50IGVsZSA9ICgoSVN0eWxlU2hlZXRBZGFwdGVyKSBvYmopLmdldEVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlLmdldE93bmVyRG9jdW1lbnQoKSA9PSBkb2MpCi0JCQkJCW5vZGVzLm5vZGVzLmFkZChlbGUpOwotCQkJfQotCQl9Ci0JCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gbm9kZXM7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgc3R5bGUgc2hlZXQgY29tZXMgZnJvbSBhbiA8Y29kZT5AaW1wb3J0PC9jb2RlPiBydWxlLCB0aGUgPGNvZGU+b3duZXJSdWxlPC9jb2RlPiBhdHRyaWJ1dGUgd2lsbAotCSAqICAgICAgICAgY29udGFpbiB0aGUgPGNvZGU+Q1NTSW1wb3J0UnVsZTwvY29kZT4uIEluIHRoYXQgY2FzZSwgdGhlCi0JICogICAgICAgICA8Y29kZT5vd25lck5vZGU8L2NvZGU+IGF0dHJpYnV0ZSBpbiB0aGUKLQkgKiAgICAgICAgIDxjb2RlPlN0eWxlU2hlZXQ8L2NvZGU+IGludGVyZmFjZSB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqICAgICAgICAgSWYgdGhlIHN0eWxlIHNoZWV0IGNvbWVzIGZyb20gYW4gZWxlbWVudCBvciBhIHByb2Nlc3NpbmcKLQkgKiAgICAgICAgIGluc3RydWN0aW9uLCB0aGUgPGNvZGU+b3duZXJSdWxlPC9jb2RlPiBhdHRyaWJ1dGUgd2lsbCBiZQotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gYW5kIHRoZSA8Y29kZT5vd25lck5vZGU8L2NvZGU+IGF0dHJpYnV0ZQotCSAqICAgICAgICAgd2lsbCBjb250YWluIHRoZSA8Y29kZT5Ob2RlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBnZXRPd25lclJ1bGUoKSB7Ci0JCUFzc2VydC5pc1RydWUoZmFsc2UsIENTU0NvcmVNZXNzYWdlcy5Zb3VfY2Fubm90X3VzZV9DU1NTdHlsZVNoZV9VSV8pOyAvLyROT04tTkxTLTEkID0gIllvdSBjYW5ub3QgdXNlIENTU1N0eWxlU2hlZXQuZ2V0T3duZXJSdWxlKCkgYmVjYXVzZSBvZiBtYW55IHJlZmVyZW5jZXJzIG9mIHRoaXMgcnVsZVxuUGxlYXNlIHVzZSBnZXRPbndlclJ1bGVzKCkiCi0JCS8vIGZvciBAaW1wb3J0Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGVMaXN0Ci0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdCBnZXRPd25lclJ1bGVzKCkgewotCQlTdHlsZVNoZWV0TGlzdCBsaXN0ID0gZ2V0UGFyZW50U3R5bGVTaGVldHMoKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDU1NSdWxlTGlzdEltcGwgcnVsZUxpc3QgPSBuZXcgQ1NTUnVsZUxpc3RJbXBsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3Rvcih0aGlzKTsKLQkJCXRyYXYuYXBwbHkoKElDU1NTdHlsZVNoZWV0KSBsaXN0Lml0ZW0oaSkpOwotCQkJcnVsZUxpc3Qubm9kZXMuYWRkQWxsKHRyYXYuZ2V0UnVsZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIHJ1bGVMaXN0OwotCX0KLQotCS8qKgotCSAqIEZvciBzdHlsZSBzaGVldCBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0IHRoZSBjb25jZXB0IG9mIHN0eWxlIHNoZWV0Ci0JICogaW5jbHVzaW9uLCB0aGlzIGF0dHJpYnV0ZSByZXByZXNlbnRzIHRoZSBpbmNsdWRpbmcgc3R5bGUgc2hlZXQsIGlmIG9uZQotCSAqIGV4aXN0cy4gSWYgdGhlIHN0eWxlIHNoZWV0IGlzIGEgdG9wLWxldmVsIHN0eWxlIHNoZWV0LCBvciB0aGUgc3R5bGUKLQkgKiBzaGVldCBsYW5ndWFnZSBkb2VzIG5vdCBzdXBwb3J0IGluY2x1c2lvbiwgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlCi0JICogaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgZ2V0UGFyZW50U3R5bGVTaGVldCgpIHsKLQkJQ1NTUnVsZSBvd25lciA9IGdldE93bmVyUnVsZSgpOwotCQlpZiAob3duZXIgIT0gbnVsbCkKLQkJCXJldHVybiBvd25lci5nZXRQYXJlbnRTdHlsZVNoZWV0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3QKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3QgZ2V0UGFyZW50U3R5bGVTaGVldHMoKSB7Ci0JCUxpc3QgbGlzdCA9IChnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgPyBuZXcgVmVjdG9yKGdldE1vZGVsKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKSkgOiBudWxsOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUludGVybmFsU3R5bGVTaGVldExpc3Qgc2hlZXRzID0gbmV3IEludGVybmFsU3R5bGVTaGVldExpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQkJc2hlZXRzLmFwcGVuZE5vZGUoKChJQ1NTTW9kZWwpIG9iaikuZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNoZWV0cy5nZXRMZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gc2hlZXRzOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYWR2aXNvcnkgdGl0bGUuIFRoZSB0aXRsZSBpcyBvZnRlbiBzcGVjaWZpZWQgaW4gdGhlCi0JICogPGNvZGU+b3duZXJOb2RlPC9jb2RlPi4gU2VlIHRoZSB0aXRsZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlCi0JICogPGNvZGU+TElOSzwvY29kZT4gZWxlbWVudCBpbiBIVE1MIDQuMCwgYW5kIHRoZSB0aXRsZSBwc2V1ZG8tYXR0cmlidXRlCi0JICogZm9yIHRoZSBYTUwgc3R5bGUgc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlOb2RlIG5vZGUgPSBnZXRPd25lck5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50KSBub2RlKS5oYXNBdHRyaWJ1dGUoIlRJVExFIikgPyAoKEVsZW1lbnQpIG5vZGUpLmdldEF0dHJpYnV0ZSgiVElUTEUiKSA6IG51bGw7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgdGhlIHN0eWxlIHNoZWV0IGxhbmd1YWdlIGZvciB0aGlzIHN0eWxlIHNoZWV0LiBUaGUgc3R5bGUKLQkgKiBzaGVldCBsYW5ndWFnZSBpcyBzcGVjaWZpZWQgYXMgYSBjb250ZW50IHR5cGUgKGUuZy4gInRleHQvY3NzIikuIFRoZQotCSAqIGNvbnRlbnQgdHlwZSBpcyBvZnRlbiBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPm93bmVyTm9kZTwvY29kZT4uIEFsc28KLQkgKiBzZWUgdGhlIHR5cGUgYXR0cmlidXRlIGRlZmluaXRpb24gZm9yIHRoZSA8Y29kZT5MSU5LPC9jb2RlPiBlbGVtZW50Ci0JICogaW4gSFRNTCA0LjAsIGFuZCB0aGUgdHlwZSBwc2V1ZG8tYXR0cmlidXRlIGZvciB0aGUgWE1MIHN0eWxlIHNoZWV0Ci0JICogcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCU5vZGUgbm9kZSA9IGdldE93bmVyTm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKEVsZW1lbnQpIG5vZGUpLmhhc0F0dHJpYnV0ZSgiVFlQRSIpID8gKChFbGVtZW50KSBub2RlKS5nZXRBdHRyaWJ1dGUoIlRZUEUiKSA6IG51bGw7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBpbnNlcnQgYSBuZXcgcnVsZSBpbnRvIHRoZSBzdHlsZSBzaGVldC4gVGhlIG5ldyBydWxlIG5vdwotCSAqIGJlY29tZXMgcGFydCBvZiB0aGUgY2FzY2FkZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgVGhlIHBhcnNhYmxlIHRleHQgcmVwcmVzZW50aW5nIHRoZSBydWxlLiBGb3IgcnVsZSBzZXRzIHRoaXMKLQkgKiAgICAgICAgICAgIGNvbnRhaW5zIGJvdGggdGhlIHNlbGVjdG9yIGFuZCB0aGUgc3R5bGUgZGVjbGFyYXRpb24uIEZvcgotCSAqICAgICAgICAgICAgYXQtcnVsZXMsIHRoaXMgc3BlY2lmaWVzIGJvdGggdGhlIGF0LWlkZW50aWZpZXIgYW5kIHRoZSBydWxlCi0JICogICAgICAgICAgICBjb250ZW50LgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQncyBydWxlIGxpc3Qgb2YgdGhlIHJ1bGUKLQkgKiAgICAgICAgICAgIGJlZm9yZSB3aGljaCB0byBpbnNlcnQgdGhlIHNwZWNpZmllZCBydWxlLiBJZiB0aGUgc3BlY2lmaWVkCi0JICogICAgICAgICAgICBpbmRleCBpcyBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdHlsZSBzaGVldCdzIHJ1bGUKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24sIHRoZSBydWxlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgc3R5bGUKLQkgKiAgICAgICAgICAgIHNoZWV0LgotCSAqIEByZXR1cm4gVGhlIGluZGV4IHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQncyBydWxlIGNvbGxlY3Rpb24gb2YgdGhlIG5ld2x5Ci0JICogICAgICAgICBpbnNlcnRlZCBydWxlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhlIHJ1bGUgY2Fubm90IGJlCi0JICogICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBlLmcuIGlmIGFuCi0JICogICAgICAgICAgICAgICAgPGNvZGU+QGltcG9ydDwvY29kZT4gcnVsZSBpcyBpbnNlcnRlZCBhZnRlciBhIHN0YW5kYXJkIHJ1bGUgc2V0IG9yIG90aGVyCi0JICogICAgICAgICBhdC1ydWxlLiA8YnI+Ci0JICogICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggaXMgbm90IGEgdmFsaWQKLQkgKiAgICAgICAgIGluc2VydGlvbiBwb2ludC4gPGJyPgotCSAqICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBzdHlsZSBzaGVldCBpcwotCSAqICAgICAgICAgcmVhZG9ubHkuIDxicj4KLQkgKiAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHJ1bGUgaGFzIGEgc3ludGF4IGVycm9yIGFuZAotCSAqICAgICAgICAgaXMgdW5wYXJzYWJsZS4KLQkgKi8KLQlwdWJsaWMgaW50IGluc2VydFJ1bGUoU3RyaW5nIHJ1bGUsIGludCBpbmRleCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWludCBsZW5ndGggPSBnZXRDc3NSdWxlcygpLmdldExlbmd0aCgpOwotCQlpZiAoaW5kZXggPCAwIHx8IGxlbmd0aCA8IGluZGV4KQotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBnZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDU1NSdWxlSW1wbCByZWZSdWxlID0gKGxlbmd0aCAhPSBpbmRleCkgPyBnZXRJbmRleGVkUnVsZShpbmRleCkgOiBudWxsOwotCQlpbnQgb2Zmc2V0ID0gKHJlZlJ1bGUgIT0gbnVsbCkgPyByZWZSdWxlLmdldFN0YXJ0T2Zmc2V0KCkgOiBkb2MuZ2V0TGVuZ3RoKCk7Ci0JCWRvYy5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIHJ1bGUpOwotCi0JCS8vIGluc2VydEJlZm9yZSgoQ1NTTm9kZUltcGwpIGNyZWF0ZUNTU1J1bGUocnVsZSkscmVmUnVsZSk7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld1J1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJlZlJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIGluc2VydFJ1bGVCZWZvcmUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgbmV3UnVsZSwgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcmVmUnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdSdWxlID09IG51bGwgJiYgcmVmUnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgaW5zZXJ0QmVmb3JlKChDU1NOb2RlSW1wbCkgbmV3UnVsZSwgKENTU05vZGVJbXBsKSByZWZSdWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RvY3VtZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSByZW1vdmVSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAocnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSBydWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJlcGxhY2VSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG5ld1J1bGUsIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG9sZFJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAobmV3UnVsZSA9PSBudWxsICYmIG9sZFJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIHJlcGxhY2VDaGlsZCgoQ1NTTm9kZUltcGwpIG5ld1J1bGUsIChDU1NOb2RlSW1wbCkgb2xkUnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogc2V0RGlzYWJsZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZWQoYm9vbGVhbiBkaXNhYmxlZCkgewotCQl0aGlzLmZEaXNhYmxlZCA9IGRpc2FibGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTVW5rbm93blJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1Vua25vd25SdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTNlZDc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTVW5rbm93blJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTVW5rbm93blJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZUltcGwgaW1wbGVtZW50cyBDU1NVbmtub3duUnVsZSB7Ci0KLQkvLyBUT0RPOiBUaGlzIGZpZWxkIGlzIG5ldmVyIHJlYWQKLQlTdHJpbmcgZkNzc1RleHQgPSBudWxsOwotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTVW5rbm93blJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU1Vua25vd25SdWxlSW1wbChDU1NVbmtub3duUnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NVbmtub3duUnVsZUltcGwgY2xvbmVkID0gbmV3IENTU1Vua25vd25SdWxlSW1wbCh0aGlzKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBVTktOT1dOUlVMRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFVOS05PV05fUlVMRTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3NzVGV4dAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc1RleHQoU3RyaW5nIGNzc1RleHQpIHsKLQkJdGhpcy5mQ3NzVGV4dCA9IGNzc1RleHQ7Ci0KLQkJc3VwZXIuc2V0Q3NzVGV4dChjc3NUZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvdW50ZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvdW50ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOTIxZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db3VudGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ291bnRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNvdW50ZXI7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ291bnRlckltcGwgZXh0ZW5kcyBDU1NQcmltaXRpdmVDb250YWluZXIgaW1wbGVtZW50cyBJQ291bnRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDb3VudGVySW1wbCgpIHsKLQkJc3VwZXIoQ1NTX0NPVU5URVIpOwotCX0KLQotCUNvdW50ZXJJbXBsKENvdW50ZXJJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ291bnRlckltcGwgY2xvbmVkID0gbmV3IENvdW50ZXJJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgQ291bnRlciB2YWx1ZS4gSWYgdGhpcyBDU1MgdmFsdWUgZG9lc24ndAotCSAqIGNvbnRhaW4gYSBjb3VudGVyIHZhbHVlLCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLgotCSAqIE1vZGlmaWNhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcKLQkgKiB0aGUgPGNvZGU+Q291bnRlcjwvY29kZT4gaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIENvdW50ZXIgdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiAgICAgICAgICAgICAgICBjb250YWluIGEgQ291bnRlciB2YWx1ZSAoZS5nLiB0aGlzIGlzIG5vdAotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkNTU19DT1VOVEVSPC9jb2RlPikuCi0JICovCi0JcHVibGljIENvdW50ZXIgZ2V0Q291bnRlclZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb3VudGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShJREVOVElGSUVSKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgc3R5bGUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXN0U3R5bGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoTElTVFNUWUxFKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgc2VwYXJhdG9yIG9mIHRoZSBuZXN0ZWQgY291bnRlcnMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXBhcmF0b3IoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoU0VQQVJBVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0UHJpbWl0aXZlcygpIHsKLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpZGVudGlmaWVyCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoSURFTlRJRklFUiwgaWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RTdHlsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0U3R5bGUoU3RyaW5nIGxpc3RTdHlsZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShMSVNUU1RZTEUsIGxpc3RTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIFNlcGFyYXRvcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIFNlcGFyYXRvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShTRVBBUkFUT1IsIFNlcGFyYXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01DU1NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTUNTU0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI3OTA3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTUNTU0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVNoZWV0OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBET01DU1NJbXBsIHsKLQotCS8qKgotCSAqIERPTUNTU0ltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRE9NQ1NTSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgZG9jdW1lbnQgPSBuZXcgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwodHJ1ZSk7Ci0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlU2hlZXQKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbWVkaWEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBDU1NTdHlsZVNoZWV0IGNyZWF0ZUNTU1N0eWxlU2hlZXQoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVkaWEpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IENTU1N0eWxlU2hlZXRJbXBsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZWRpYUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L01lZGlhTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0YjNiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L01lZGlhTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIE1lZGlhTGlzdEltcGwgZXh0ZW5kcyBDU1NSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBNZWRpYUxpc3QgewotCi0JaW50IG1lZGl1bUNvdW50ZXI7Ci0KLQkvKioKLQkgKiBNZWRpYUxpc3RJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JTWVkaWFMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBNZWRpYUxpc3RJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JTWVkaWFMaXN0SW1wbChNZWRpYUxpc3RJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbWVkaXVtIDxjb2RlPm5ld01lZGl1bTwvY29kZT4gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gSWYgdGhlCi0JICogPGNvZGU+bmV3TWVkaXVtPC9jb2RlPiBpcyBhbHJlYWR5IHVzZWQsIGl0IGlzIGZpcnN0IHJlbW92ZWQuCi0JICogCi0JICogQHBhcmFtIG5ld01lZGl1bVRoZQotCSAqICAgICAgICAgICAgbmV3IG1lZGl1bSB0byBhZGQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IElmIHRoZSBtZWRpdW0gY29udGFpbnMgY2hhcmFjdGVycwotCSAqICAgICAgICAgICAgICAgIHRoYXQgYXJlIGludmFsaWQgaW4gdGhlIHVuZGVybHlpbmcgc3R5bGUgbGFuZ3VhZ2UuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGxpc3QgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRNZWRpdW0oU3RyaW5nIG5ld01lZGl1bSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdNZWRpdW0gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDU1NOb2RlTGlzdEltcGwgbSA9IGdldE1lZGlhKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpICE9IG0uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKG5ld01lZGl1bS5lcXVhbHMoaXRlbShpKSkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJc2V0QXR0cmlidXRlKCJtZWRpdW0iICsgSW50ZWdlci50b1N0cmluZyhtZWRpdW1Db3VudGVyKyspLCBuZXdNZWRpdW0pOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlNZWRpYUxpc3RJbXBsIGNsb25lZCA9IG5ldyBNZWRpYUxpc3RJbXBsKHRoaXMpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIG1lZGl1bSBpbmRpY2F0ZWQgYnkgPGNvZGU+b2xkTWVkaXVtPC9jb2RlPiBmcm9tIHRoZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBvbGRNZWRpdW1UaGUKLQkgKiAgICAgICAgICAgIG1lZGl1bSB0byBkZWxldGUgaW4gdGhlIG1lZGlhIGxpc3QuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGxpc3QgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PVF9GT1VORF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5vbGRNZWRpdW08L2NvZGU+IGlzIG5vdAotCSAqICAgICAgICAgICAgICAgIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZU1lZGl1bShTdHJpbmcgb2xkTWVkaXVtKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgIT0gZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKG9sZE1lZGl1bS5lcXVhbHMoaXRlbShpKSkpIHsKLQkJCQlyZW1vdmVBdHRyaWJ1dGVOb2RlKChDU1NBdHRySW1wbCkgZkF0dHJzLml0ZW0oaSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBtZWRpYSBpbiB0aGUgbGlzdC4gVGhlIHJhbmdlIG9mIHZhbGlkIG1lZGlhIGlzCi0JICogPGNvZGU+MDwvY29kZT4gdG8gPGNvZGU+bGVuZ3RoLTE8L2NvZGU+IGluY2x1c2l2ZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldE1lZGlhKCkuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBDU1NOb2RlTGlzdEltcGwKLQkgKi8KLQlDU1NOb2RlTGlzdEltcGwgZ2V0TWVkaWEoKSB7Ci0JCWlmIChmQXR0cnMgPT0gbnVsbCkKLQkJCWZBdHRycyA9IG5ldyBDU1NOYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCXJldHVybiBmQXR0cnM7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhcnNhYmxlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGxpc3QuIFRoaXMgaXMgYQotCSAqIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHZhbHVlIGhhcyBhCi0JICogICAgICAgICAgICAgICAgc3ludGF4IGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZWRpYSBsaXN0Ci0JICogICAgICAgICAgICAgICAgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZWRpYVRleHQoKSB7Ci0JCXJldHVybiBnZXRDc3NUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wMS8xNwotCSAqIDE4OjUwOjI5KQotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBNRURJQUxJU1RfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5pbmRleDwvY29kZT4gdGggaW4gdGhlIGxpc3QuIElmIDxjb2RlPmluZGV4PC9jb2RlPgotCSAqIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIG1lZGlhIGluIHRoZSBsaXN0LCB0aGlzCi0JICogcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIEluZGV4IGludG8gdGhlIGNvbGxlY3Rpb24uCi0JICogQHJldHVybiBUaGUgbWVkaXVtIGF0IHRoZSA8Y29kZT5pbmRleDwvY29kZT4gdGggcG9zaXRpb24gaW4gdGhlCi0JICogICAgICAgICA8Y29kZT5NZWRpYUxpc3Q8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGF0IGlzCi0JICogICAgICAgICBub3QgYSB2YWxpZCBpbmRleC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgZ2V0TGVuZ3RoKCkgPD0gaW5kZXgpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKChDU1NBdHRySW1wbCkgZ2V0TWVkaWEoKS5pdGVtKGluZGV4KSkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRNZWRpYVRleHQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVkaWFUZXh0KFN0cmluZyBtZWRpYVRleHQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRDc3NUZXh0KG1lZGlhVGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SR0JDb2xvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUkdCQ29sb3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTUwMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SR0JDb2xvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLlJHQkNvbG9yOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIFJHQkNvbG9ySW1wbCBleHRlbmRzIENTU1ByaW1pdGl2ZUNvbnRhaW5lciBpbXBsZW1lbnRzIFJHQkNvbG9yIHsKLQotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZSZWQ7Ci0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZkdyZWVuOwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZCbHVlOwotCi0JLyoqCi0JICogCi0JICovCi0JUkdCQ29sb3JJbXBsKCkgewotCQlzdXBlcihDU1NfUkdCQ09MT1IpOwotCX0KLQotCVJHQkNvbG9ySW1wbChSR0JDb2xvckltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlmUmVkID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZSZWQpOwotCQlhcHBlbmRDaGlsZChmUmVkKTsKLQotCQlmR3JlZW4gPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZkdyZWVuKTsKLQkJYXBwZW5kQ2hpbGQoZkdyZWVuKTsKLQotCQlmQmx1ZSA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mQmx1ZSk7Ci0JCWFwcGVuZENoaWxkKGZCbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlSR0JDb2xvckltcGwgY2xvbmVkID0gbmV3IFJHQkNvbG9ySW1wbCh0aGlzKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBibHVlIHZhbHVlIG9mIHRoZSBSR0IgY29sb3IuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldEJsdWUoKSB7Ci0JCXJldHVybiBmQmx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgZ3JlZW4gdmFsdWUgb2YgdGhlIFJHQiBjb2xvci4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJpbWl0aXZlVmFsdWUgZ2V0R3JlZW4oKSB7Ci0JCXJldHVybiBmR3JlZW47Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIHJlZCB2YWx1ZSBvZiB0aGUgUkdCIGNvbG9yLgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRSZWQoKSB7Ci0JCXJldHVybiBmUmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLlJHQkNvbG9yCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBSR0JDb2xvciBnZXRSR0JDb2xvclZhbHVlKCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQcmltaXRpdmVzKCkgewotCi0JCWZSZWQgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZSZWQpOwotCi0JCWZHcmVlbiA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZkdyZWVuKTsKLQotCQlmQmx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZkJsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVjdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5NWVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JlY3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5SZWN0OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIFJlY3RJbXBsIGV4dGVuZHMgQ1NTUHJpbWl0aXZlQ29udGFpbmVyIGltcGxlbWVudHMgUmVjdCB7Ci0KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmVG9wOwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZSaWdodDsKLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmQm90dG9tOwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZMZWZ0OwotCi0JLyoqCi0JICogCi0JICovCi0JUmVjdEltcGwoKSB7Ci0JCXN1cGVyKENTU19SRUNUKTsKLQl9Ci0KLQlSZWN0SW1wbChSZWN0SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWZUb3AgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZlRvcCk7Ci0JCWFwcGVuZENoaWxkKGZUb3ApOwotCi0JCWZSaWdodCA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mUmlnaHQpOwotCQlhcHBlbmRDaGlsZChmUmlnaHQpOwotCi0JCWZCb3R0b20gPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZkJvdHRvbSk7Ci0JCWFwcGVuZENoaWxkKGZCb3R0b20pOwotCi0JCWZMZWZ0ID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZMZWZ0KTsKLQkJYXBwZW5kQ2hpbGQoZkxlZnQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCVJlY3RJbXBsIGNsb25lZCA9IG5ldyBSZWN0SW1wbCh0aGlzKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBib3R0b20gb2YgdGhlIHJlY3QuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldEJvdHRvbSgpIHsKLQkJcmV0dXJuIGZCb3R0b207Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIGxlZnQgb2YgdGhlIHJlY3QuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldExlZnQoKSB7Ci0JCXJldHVybiBmTGVmdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5SZWN0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBSZWN0IGdldFJlY3RWYWx1ZSgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgcmlnaHQgb2YgdGhlIHJlY3QuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldFJpZ2h0KCkgewotCQlyZXR1cm4gZlJpZ2h0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSB0b3Agb2YgdGhlIHJlY3QuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldFRvcCgpIHsKLQkJcmV0dXJuIGZUb3A7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFByaW1pdGl2ZXMoKSB7Ci0KLQkJZlRvcCA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZlRvcCk7Ci0KLQkJZlJpZ2h0ID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmUmlnaHQpOwotCi0JCWZCb3R0b20gPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZCb3R0b20pOwotCi0JCWZMZWZ0ID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmTGVmdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHlsZVNoZWV0TGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3R5bGVTaGVldExpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYTFiZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHlsZVNoZWV0TGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIFN0eWxlU2hlZXRMaXN0SW1wbCBleHRlbmRzIEFic3RyYWN0Q1NTTm9kZUxpc3QgaW1wbGVtZW50cyBTdHlsZVNoZWV0TGlzdCB7Ci0KLQkvKioKLQkgKiBTdHlsZVNoZWV0TGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlTdHlsZVNoZWV0TGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSBhIHN0eWxlIHNoZWV0IGJ5IG9yZGluYWwgaW5kZXguIElmIGluZGV4IGlzIGdyZWF0ZXIKLQkgKiB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2Ygc3R5bGUgc2hlZXRzIGluIHRoZSBsaXN0LCB0aGlzIHJldHVybnMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXhJbmRleAotCSAqICAgICAgICAgICAgaW50byB0aGUgY29sbGVjdGlvbgotCSAqIEByZXR1cm4gVGhlIHN0eWxlIHNoZWV0IGF0IHRoZSA8Y29kZT5pbmRleDwvY29kZT4gcG9zaXRpb24gaW4gdGhlCi0JICogICAgICAgICA8Y29kZT5TdHlsZVNoZWV0TGlzdDwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoYXQKLQkgKiAgICAgICAgIGlzIG5vdCBhIHZhbGlkIGluZGV4LgotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0IGl0ZW0oaW50IGluZGV4KSB7Ci0JCXJldHVybiAoU3R5bGVTaGVldCkgaXRlbUltcGwoaW5kZXgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYTUxZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NEb2N1bWVudENoYXJzZXREZXRlY3RvciBleHRlbmRzIENTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nTmFtZShJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIGRvY3VtZW50IGlzIGVtcHR5LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gbm9kZXMsCi0JCS8vIHNvIG5vIG5lZWQgdG8gY29udGludWUuCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gbnVsbDsKLQkJCS8vIHNraXAgYW55IGluaXRpYWwgd2hpdGVzcGFjZQotCQkJLy8gTm90ZSB0aGF0IEBjaGFyc2V0ICJlbmNvZGluZ25hbWUiOwotCQkJLy8gbXVzdCBhcHBlYXIgYXQgdmVyeSBiZWdpbm5pbmcgb2YgZG9jdW1lbnQsCi0JCQkvLyB0byBiZSB2YWxpZC4KLQkJCS8vIE1heSBoYXZlIHRvIHRlc3Qgd2l0aCAiZGFtYWdlZCIgZmlsZXMgKGUuZy4KLQkJCS8vIGJlZ2lubmluZyBFT0xzLCBldGMuLCB0byB2ZXJpZnkgdGhpcyB3b3JrcwotCQkJLy8gYXMgZXhwZWN0ZWQuCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlub2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCQlpZiAoZ2V0VHlwZShub2RlKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlJdGVyYXRvciByZWdpb25zID0gbm9kZS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldE5leHRSZWdpb25PZlR5cGUoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVQsIHJlZ2lvbnMpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBnZXROZXh0UmVnaW9uT2ZUeXBlKENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcsIHJlZ2lvbnMpOwotCQkJCWlmICh2YWx1ZVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIGlmIGRpZG4ndCBmaW5kIHRoZSByZWdpb24sIGl0cyBwcm9iYWJseSBkdWUgdG8gaWxsCi0JCQkJCS8vIGZvcm1lZCBpbnB1dCwgc3VjaCBhcwotCQkJCQkvLyBAY2hhcnNldCAiSVNPLTg4NTktNjsKLQkJCQkJLy8gc28gd2UnbGwgdHJ5IGFnYWluIGZvciAidW5rbm93biIgcmVnaW9uLgotCQkJCQkvLyBJZiB0aGF0IGZhaWxzLCB3ZSdsbCBnaXZlIHVwPwotCQkJCQlyZWdpb25zID0gbm9kZS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQkJcmVnaW9uID0gZ2V0TmV4dFJlZ2lvbk9mVHlwZShDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCwgcmVnaW9ucyk7Ci0JCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJdmFsdWVSZWdpb24gPSBnZXROZXh0UmVnaW9uT2ZUeXBlKENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOLCByZWdpb25zKTsKLQkJCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJcmVzdWx0ID0gbm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gbm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmVzdWx0ID0gU3RyaW5nVXRpbHMuc3RyaXBOb25MZXR0ZXJEaWdpdHMocmVzdWx0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmdOYW1lKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmcgZW5jID0gbnVsbDsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJZW5jID0gZ2V0RW5jb2RpbmdOYW1lKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUT0RPIEltcG9ydGFudDogbmVlZCB0byBpbXBsZW1lbnQgc29tZSAicmF3IiBwYXJzZXIgZm9yCi0JCQkvLyBJRG9jdW1lbnQgbGV2ZWwKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFR5cGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQlTdHJpbmcgcmVzdWx0ID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElUZXh0UmVnaW9uIGdldE5leHRSZWdpb25PZlR5cGUoU3RyaW5nIHR5cGUsIEl0ZXJhdG9yIHJlZ2lvbnMpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IHR5cGUpIHsKLQkJCQlyZXN1bHQgPSByZWdpb247Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHNldChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc2V0KG5ldyBEb2N1bWVudFJlYWRlcihkb2N1bWVudCwgMCkpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NmZmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdHdWVzc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0LkNTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIENTU0RvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENTU19JRCA9IENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1M7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCi0KLQlwdWJsaWMgQ1NTRG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbmNvZGluZ05hbWVCeUd1ZXNzKGJ5dGVbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIGlhbmFFbmMgPSBudWxsOwotCQlpYW5hRW5jID0gRW5jb2RpbmdHdWVzc2VyLmd1ZXNzRW5jb2Rpbmcoc3RyaW5nLCBsZW5ndGgpOwotCQlyZXR1cm4gaWFuYUVuYzsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGVuY29kaW5nLiBGb3IgQ1NTIHRoZXJlIGlzIG5vIHNwZWMnZCBkZWZhdWx0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElFbmNvZGVkRG9jdW1lbnQgbmV3RW5jb2RlZERvY3VtZW50KCkgewotCQkvLyBETVc6IEkgY29waWVkIHRoaXMgZnJvbSBDU1NNb2RlbEltcGxlIC4uLgotCQkvLyBidXQgYW0gbm90IHN1cmUgaXRzIHJpZ2h0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRQYXJzZXIoKSk7Ci0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHJlUGFyc2VyID0gbmV3IENTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JCXJlUGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKHJlUGFyc2VyKTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJLy8gcmV0dXJuIG5ldyBDU1NSZWdpb25QYXJzZXIoKTsKLQkJcmV0dXJuIG5ldyBDU1NTb3VyY2VQYXJzZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZGVsaW1pdGVyID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoQ1NTX0lEKTsKLQkJaWYgKGRlbGltaXRlciA9PSBudWxsKQotCQkJZGVsaW1pdGVyID0gc3VwZXIuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihmaWxlKTsKLQkJcmV0dXJuIGRlbGltaXRlcjsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJaWYgKGRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPSBuZXcgQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBDU1NEb2N1bWVudExvYWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9JQ1NTU3R5bGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9JQ1NTU3R5bGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzc3MTE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnQvSUNTU1N0eWxlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTdHlsZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc3R5bGVDaGFuZ2VkKElDU1NNb2RlbCBzcmNNb2RlbCwgSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHN0eWxlVXBkYXRlKElDU1NNb2RlbCBzcmNNb2RlbCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0lDU1NTdHlsZU5vdGlmaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0lDU1NTdHlsZU5vdGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDllZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9JQ1NTU3R5bGVOb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU3R5bGVOb3RpZmllciBleHRlbmRzIElDU1NTdHlsZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYWRkU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlMaXN0IGdldFN0eWxlTGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKi8KLQlib29sZWFuIGlzUmVjb3JkaW5nKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlbW92ZVN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODAzMWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnRpbXBsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlciBleHRlbmRzIENTU1N0eWxlTm90aWZ5QWRhcHRlciB7Ci0KLQkvKioKLQkgKiBDU1NFbWJlZGRlZFN0eWxlTm90aWZ5QWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU01vZGVsCi0JICovCi0JcHVibGljIENTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZUNoYW5nZWQoSUNTU01vZGVsIHNyY01vZGVsLCBJQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBJQ1NTU2VsZWN0b3JbXSBhZGRlZCwgU3RyaW5nIG1lZGlhKSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIG1vZGVsLmdldE93bmVyRE9NTm9kZSgpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vZGUuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDU1NTdHlsZUxpc3RlbmVyKSB7Ci0JCQkoKElDU1NTdHlsZUxpc3RlbmVyKSBhZGFwdGVyKS5zdHlsZUNoYW5nZWQoc3JjTW9kZWwsIHJlbW92ZWQsIGFkZGVkLCBtZWRpYSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZVVwZGF0ZShJQ1NTTW9kZWwgc3JjTW9kZWwpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbW9kZWwuZ2V0T3duZXJET01Ob2RlKCk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm9kZS5nZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNTU1N0eWxlTGlzdGVuZXIpIHsKLQkJCSgoSUNTU1N0eWxlTGlzdGVuZXIpIGFkYXB0ZXIpLnN0eWxlVXBkYXRlKHNyY01vZGVsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU1N0eWxlRXZlbnREZWxpdmVyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU1N0eWxlRXZlbnREZWxpdmVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2MDE4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NTdHlsZUV2ZW50RGVsaXZlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTdHlsZUV2ZW50RGVsaXZlcmVyIHsKLQotCXByaXZhdGUgVmVjdG9yIGZWaXNpdGVkID0gbmV3IFZlY3RvcigpOwotCXByaXZhdGUgSUNTU01vZGVsIGZTcmNNb2RlbDsKLQlwcml2YXRlIElDU1NTZWxlY3RvcltdIGZSZW1vdmVkOwotCXByaXZhdGUgSUNTU1NlbGVjdG9yW10gZkFkZGVkOwotCXByaXZhdGUgU3RyaW5nIGZNZWRpYTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NTdHlsZUV2ZW50RGVsaXZlcmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmUoSUNTU01vZGVsIHNyY01vZGVsLCBJQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBJQ1NTU2VsZWN0b3JbXSBhZGRlZCwgU3RyaW5nIG1lZGlhKSB7Ci0JCWlmIChzcmNNb2RlbCA9PSBudWxsIHx8IHNyY01vZGVsLmdldFN0eWxlTGlzdGVuZXJzKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0aGlzLmZTcmNNb2RlbCA9IHNyY01vZGVsOwotCQl0aGlzLmZSZW1vdmVkID0gcmVtb3ZlZDsKLQkJdGhpcy5mQWRkZWQgPSBhZGRlZDsKLQkJdGhpcy5mTWVkaWEgPSBtZWRpYTsKLQotCQkvLyBwcm9oaWJpdCBkZWxpdmVyaW5nIHRvIHNyY01vZGVsCi0JCWZWaXNpdGVkLmNsZWFyKCk7Ci0JCWZWaXNpdGVkLmFkZChzcmNNb2RlbCk7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHNyY01vZGVsLmdldFN0eWxlTGlzdGVuZXJzKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJdmlzaXQoKElDU1NTdHlsZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVRvKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJdGhpcy5mU3JjTW9kZWwgPSBzcmNNb2RlbDsKLQkJdGhpcy5mUmVtb3ZlZCA9IHJlbW92ZWQ7Ci0JCXRoaXMuZkFkZGVkID0gYWRkZWQ7Ci0JCXRoaXMuZk1lZGlhID0gbWVkaWE7Ci0KLQkJLy8gcHJvaGliaXQgZGVsaXZlcmluZyB0byBzcmNNb2RlbAotCQlmVmlzaXRlZC5jbGVhcigpOwotCQkvLyB2aXNpdGVkLmFkZChzcmNNb2RlbCk7IDogYmVjYXVzZSBsb29waW5nIHByb2JsZW0KLQkJdmlzaXQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVVcGRhdGUoSUNTU01vZGVsIHNyY01vZGVsKSB7Ci0JCWlmIChzcmNNb2RlbCA9PSBudWxsIHx8IHNyY01vZGVsLmdldFN0eWxlTGlzdGVuZXJzKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0aGlzLmZTcmNNb2RlbCA9IHNyY01vZGVsOwotCi0JCS8vIHByb2hpYml0IGRlbGl2ZXJpbmcgdG8gc3JjTW9kZWwKLQkJZlZpc2l0ZWQuY2xlYXIoKTsKLQkJZlZpc2l0ZWQuYWRkKHNyY01vZGVsKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gc3JjTW9kZWwuZ2V0U3R5bGVMaXN0ZW5lcnMoKS50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2aXNpdFVwZGF0ZSgoSUNTU1N0eWxlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVXBkYXRlVG8oSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIsIElDU1NNb2RlbCBzcmNNb2RlbCkgewotCQlpZiAoc3JjTW9kZWwgPT0gbnVsbCB8fCBzcmNNb2RlbC5nZXRTdHlsZUxpc3RlbmVycygpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5mU3JjTW9kZWwgPSBzcmNNb2RlbDsKLQotCQkvLyBwcm9oaWJpdCBkZWxpdmVyaW5nIHRvIHNyY01vZGVsCi0JCWZWaXNpdGVkLmNsZWFyKCk7Ci0JCS8vIHZpc2l0ZWQuYWRkKHNyY01vZGVsKTsKLQkJdmlzaXRVcGRhdGUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0KElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsIHx8IGZWaXNpdGVkLmNvbnRhaW5zKGxpc3RlbmVyKSkKLQkJCXJldHVybjsKLQotCQkvLyBmaXJlIGV2ZW50IHRvIGxpc3RlbmVyCi0JCWxpc3RlbmVyLnN0eWxlQ2hhbmdlZChmU3JjTW9kZWwsIGZSZW1vdmVkLCBmQWRkZWQsIGZNZWRpYSk7Ci0JCWZWaXNpdGVkLmFkZChsaXN0ZW5lcik7Ci0KLQkJLy8gdHJhdmVyc2Ugbm90aWZpZXIKLQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNTU1N0eWxlTm90aWZpZXIpIHsKLQkJCUlDU1NTdHlsZU5vdGlmaWVyIG5vdGlmaWVyID0gKElDU1NTdHlsZU5vdGlmaWVyKSBsaXN0ZW5lcjsKLQkJCWlmIChub3RpZmllci5nZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwpIHsKLQkJCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBub3RpZmllci5nZXRTdHlsZUxpc3RlbmVycygpLnRvQXJyYXkoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQl2aXNpdCgoSUNTU1N0eWxlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXRVcGRhdGUoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwgfHwgZlZpc2l0ZWQuY29udGFpbnMobGlzdGVuZXIpKQotCQkJcmV0dXJuOwotCi0JCS8vIGZpcmUgZXZlbnQgdG8gbGlzdGVuZXIKLQkJbGlzdGVuZXIuc3R5bGVVcGRhdGUoZlNyY01vZGVsKTsKLQkJZlZpc2l0ZWQuYWRkKGxpc3RlbmVyKTsKLQotCQkvLyB0cmF2ZXJzZSBub3RpZmllcgotCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVOb3RpZmllcikgewotCQkJSUNTU1N0eWxlTm90aWZpZXIgbm90aWZpZXIgPSAoSUNTU1N0eWxlTm90aWZpZXIpIGxpc3RlbmVyOwotCQkJaWYgKG5vdGlmaWVyLmdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgewotCQkJCU9iamVjdFtdIGxpc3RlbmVycyA9IG5vdGlmaWVyLmdldFN0eWxlTGlzdGVuZXJzKCkudG9BcnJheSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXZpc2l0VXBkYXRlKChJQ1NTU3R5bGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU1N0eWxlTm90aWZ5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjMzYjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU1N0eWxlTm90aWZ5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnRpbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50LklDU1NTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydGVkQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlNlbGVjdG9yc0NvbGxlY3RvcjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyIGltcGxlbWVudHMgSUNTU1N0eWxlTm90aWZpZXIgewotCi0JcHJvdGVjdGVkIGphdmEudXRpbC5WZWN0b3IgbGlzdGVuZXJzOwotCXByb3RlY3RlZCBmaW5hbCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsIG1vZGVsOwotCXByb3RlY3RlZCBib29sZWFuIHJlY29yZGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU1N0eWxlTm90aWZ5QWRhcHRlcihJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKQotCQkJbGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOwotCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQotCQkJLy8gc2VuZCBuZXcgc2VsZWN0b3JzIGV2ZW50IHRvIGxpc3RlbmVyCi0JCQlJbXBvcnRlZENvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydGVkQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LmFwcGx5KG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJSXRlcmF0b3IgaXQgPSB0cmF2LmdldEV4dGVybmFscygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1N0eWxlU2hlZXQgc2hlZXQgPSAoSUNTU1N0eWxlU2hlZXQpIGl0Lm5leHQoKTsKLQkJCQkvLyBjb2xsZWN0IHNlbGVjdG9ycwotCQkJCVNlbGVjdG9yc0NvbGxlY3RvciBzZWxUcmF2ID0gbmV3IFNlbGVjdG9yc0NvbGxlY3RvcigpOwotCQkJCXNlbFRyYXYuYXBwbHkoc2hlZXQpOwotCQkJCWludCBuU2VsID0gc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5zaXplKCk7Ci0JCQkJSUNTU1NlbGVjdG9yW10gYWRkZWQgPSBuZXcgSUNTU1NlbGVjdG9yW25TZWxdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblNlbDsgaSsrKQotCQkJCQlhZGRlZFtpXSA9IChJQ1NTU2VsZWN0b3IpIHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuZ2V0KGkpOwotCi0JCQkJLy8gZmlyZSBldmVudAotCQkJCUNTU1N0eWxlRXZlbnREZWxpdmVyZXIgZGVsaXZlcmVyID0gbmV3IENTU1N0eWxlRXZlbnREZWxpdmVyZXIoKTsKLQkJCQlkZWxpdmVyZXIuZmlyZVRvKGxpc3RlbmVyLCBzaGVldC5nZXRNb2RlbCgpLCBudWxsLCBhZGRlZCwgbnVsbC8qCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIG1lZGlhCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIHdpbGwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogYmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogaW1wbGVtZW50ZWQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogaW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGZ1dHVyZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKi8pOwotCQkJfQotCi0JCQkvLyBhZGQgbGlzdGVuZXIKLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoKSB7Ci0JCXJlY29yZGluZyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKCkgewotCQlyZWNvcmRpbmcgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlKElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJLy8gc2VuZCBzZWxlY3RvciBjaGFuZ2VkIGV2ZW50Ci0JCUNTU1N0eWxlRXZlbnREZWxpdmVyZXIgZGVsaXYgPSBuZXcgQ1NTU3R5bGVFdmVudERlbGl2ZXJlcigpOwotCQlkZWxpdi5maXJlKG1vZGVsLCByZW1vdmVkLCBhZGRlZCwgbnVsbCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0U3R5bGVMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWNvcmRpbmcoKSB7Ci0JCXJldHVybiByZWNvcmRpbmc7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0KLQkJCS8vIHNlbmQgb2xkIHNlbGVjdG9ycyBldmVudCB0byBsaXN0ZW5lcgotCQkJSW1wb3J0ZWRDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRlZENvbGxlY3RvcigpOwotCQkJdHJhdi5hcHBseShtb2RlbC5nZXREb2N1bWVudCgpKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdHJhdi5nZXRFeHRlcm5hbHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlDU1NTdHlsZVNoZWV0IHNoZWV0ID0gKElDU1NTdHlsZVNoZWV0KSBpdC5uZXh0KCk7Ci0JCQkJLy8gY29sbGVjdCBzZWxlY3RvcnMKLQkJCQlTZWxlY3RvcnNDb2xsZWN0b3Igc2VsVHJhdiA9IG5ldyBTZWxlY3RvcnNDb2xsZWN0b3IoKTsKLQkJCQlzZWxUcmF2LmFwcGx5KHNoZWV0KTsKLQkJCQlpbnQgblNlbCA9IHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCQkJCUlDU1NTZWxlY3RvcltdIHJlbW92ZWQgPSBuZXcgSUNTU1NlbGVjdG9yW25TZWxdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblNlbDsgaSsrKQotCQkJCQlyZW1vdmVkW2ldID0gKElDU1NTZWxlY3Rvcikgc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5nZXQoaSk7Ci0KLQkJCQkvLyBmaXJlIGV2ZW50Ci0JCQkJQ1NTU3R5bGVFdmVudERlbGl2ZXJlciBkZWxpdmVyZXIgPSBuZXcgQ1NTU3R5bGVFdmVudERlbGl2ZXJlcigpOwotCQkJCWRlbGl2ZXJlci5maXJlVG8obGlzdGVuZXIsIHNoZWV0LmdldE1vZGVsKCksIHJlbW92ZWQsIG51bGwsIG51bGwvKgotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBtZWRpYQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiB3aWxsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGltcGxlbWVudGVkCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGluCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBmdXR1cmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICovKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsIHNyY01vZGVsLCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcltdIGFkZGVkLCBqYXZhLmxhbmcuU3RyaW5nIG1lZGlhKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVVcGRhdGUob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbCBzcmNNb2RlbCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0Zvcm1hdFByb2Nlc3NvckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhOGZiMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU0Zvcm1hdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5BYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEZvcm1hdFByb2Nlc3NvckNTUyBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciB7Ci0JLyoKLQkgKiBNYXggbGVuZ3RoIG9mIHRleHQgdG8gYmUgZm9ybWF0dGVkIHRvIGJlIGNvbnNpZGVyZWQgYSAic21hbGwgY2hhbmdlIgotCSAqIFVzZWQgZm9yIGRvY3VtZW50IHJld3JpdGUgc2Vzc2lvbiB0eXBlLgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9TTUFMTF9GT1JNQVRfU0laRSA9IDEwMDA7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiY3NzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJQ1NTRm9ybWF0VXRpbCBmb3JtYXRVdGlsID0gQ1NTRm9ybWF0VXRpbC5nZXRJbnN0YW5jZSgpOwotCQlpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQkvLyBCVUcxMDI4MjIgdGFrZSBhZHZhbnRhZ2Ugb2YgSURvY3VtZW50RXh0ZW5zaW9uNAotCQkJSURvY3VtZW50RXh0ZW5zaW9uNCBkb2NFeHQ0ID0gbnVsbDsKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJZG9jRXh0NCA9IChJRG9jdW1lbnRFeHRlbnNpb240KSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQl9Ci0JCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHJld3JpdGVTZXNzaW9uID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSByZXdyaXRlVHlwZSA9IChsZW5ndGggPiBNQVhfU01BTExfRk9STUFUX1NJWkUpID8gRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEIDogRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEX1NNQUxMOwotCQkJCXJld3JpdGVTZXNzaW9uID0gKGRvY0V4dDQgPT0gbnVsbCB8fCBkb2NFeHQ0LmdldEFjdGl2ZVJld3JpdGVTZXNzaW9uKCkgIT0gbnVsbCkgPyBudWxsIDogZG9jRXh0NC5zdGFydFJld3JpdGVTZXNzaW9uKHJld3JpdGVUeXBlKTsKLQotCQkJCUlDU1NEb2N1bWVudCBkb2MgPSAoKElDU1NNb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRSZWdpb24gPSAKLQkJCQkJc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IAotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQgKyBsZW5ndGgpOwotCQkJCXN0YXJ0ID0gc3RhcnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgZG9jKTsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gZm9ybWF0dGVyLmZvcm1hdChkb2MsIG5ldyBSZWdpb24oc3RhcnQsIChlbmRSZWdpb24uZ2V0RW5kKCkgLSBzdGFydCkpKTsKLQkJCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCQkJZm9ybWF0VXRpbC5yZXBsYWNlU291cmNlKGRvYy5nZXRNb2RlbCgpLCBzdGFydCwgZW5kUmVnaW9uLmdldEVuZCgpIC0gc3RhcnQsIGJ1Zi50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBCVUcxMDI4MjIgdGFrZSBhZHZhbnRhZ2Ugb2YgSURvY3VtZW50RXh0ZW5zaW9uNAotCQkJCWlmIChkb2NFeHQ0ICE9IG51bGwgJiYgcmV3cml0ZVNlc3Npb24gIT0gbnVsbCkKLQkJCQkJZG9jRXh0NC5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJTGlzdCBjc3Nub2RlcyA9IGZvcm1hdFV0aWwuY29sbGVjdENTU05vZGVzKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JCQlpZiAoY3Nzbm9kZXMgIT0gbnVsbCAmJiAhY3Nzbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJSUNTU01vZGVsIG1vZGVsID0gbnVsbDsKLQotCQkJCS8vIEJVRzEwMjgyMiB0YWtlIGFkdmFudGFnZSBvZiBJRG9jdW1lbnRFeHRlbnNpb240Ci0JCQkJSURvY3VtZW50RXh0ZW5zaW9uNCBkb2NFeHQ0ID0gbnVsbDsKLQkJCQlpZiAoc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uNCkgewotCQkJCQlkb2NFeHQ0ID0gKElEb2N1bWVudEV4dGVuc2lvbjQpIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiByZXdyaXRlU2Vzc2lvbiA9IG51bGw7Ci0KLQkJCQl0cnkgewotCQkJCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSByZXdyaXRlVHlwZSA9IChsZW5ndGggPiBNQVhfU01BTExfRk9STUFUX1NJWkUpID8gRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEIDogRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEX1NNQUxMOwotCQkJCQlyZXdyaXRlU2Vzc2lvbiA9IChkb2NFeHQ0ID09IG51bGwgfHwgZG9jRXh0NC5nZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpICE9IG51bGwpID8gbnVsbCA6IGRvY0V4dDQuc3RhcnRSZXdyaXRlU2Vzc2lvbihyZXdyaXRlVHlwZSk7Ci0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc3Nub2Rlcy5zaXplKCk7IGkrKykgewotCQkJCQkJSUNTU05vZGUgbm9kZSA9IChJQ1NTTm9kZSkgY3Nzbm9kZXMuZ2V0KGkpOwotCQkJCQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIG5vZGUpOwotCQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IGZvcm1hdHRlci5mb3JtYXQobm9kZSk7Ci0JCQkJCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJaW50IGVuZE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQkJaWYgKG1vZGVsID09IG51bGwpIHsKLQkJCQkJCQkJbW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCQkJCX0KLQkJCQkJCQlmb3JtYXRVdGlsLnJlcGxhY2VTb3VyY2UobW9kZWwsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgYnVmLnRvU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQkvLyBCVUcxMDI4MjIgdGFrZSBhZHZhbnRhZ2Ugb2YgSURvY3VtZW50RXh0ZW5zaW9uNAotCQkJCQlpZiAoZG9jRXh0NCAhPSBudWxsICYmIHJld3JpdGVTZXNzaW9uICE9IG51bGwpCi0JCQkJCQlkb2NFeHQ0LnN0b3BSZXdyaXRlU2Vzc2lvbihyZXdyaXRlU2Vzc2lvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb3JtYXRQcmVmZXJlbmNlcygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlYjEzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU0xpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyIGltcGxlbWVudHMgQ1NTU291cmNlR2VuZXJhdG9yIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgc2hvcnQgR0VORVJBVEUgPSAwOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgc2hvcnQgRk9STUFUID0gMTsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIHNob3J0IENMRUFOVVAgPSAyOwotCXByb3RlY3RlZCBzdGF0aWMgc2hvcnQgc3RyYXRlZ3k7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmREZWxpbUJlZm9yZShJQ1NTTm9kZSBub2RlLCBDb21wb3VuZFJlZ2lvbiB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNDbGVhbnVwKCkgJiYgIWdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJcmV0dXJuOyAvLyBmb3Igbm90IGZvcm1hdHRpbmcgY2FzZSBvbiBjbGVhbnVwIGFjdGlvbgotCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCi0JCWJvb2xlYW4gbmVlZEluZGVudCA9ICEobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KTsKLQkJaWYgKHRvQXBwZW5kID09IG51bGwpIHsKLQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgdHlwZSA9IHRvQXBwZW5kLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IodG9BcHBlbmQuZ2V0RG9jdW1lbnRSZWdpb24oKSwgdG9BcHBlbmQuZ2V0VGV4dFJlZ2lvbigpKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQkJCQlpbnRbXSByZXN1bHQgPSBudWxsOwotCQkJCWlmIChwcmV2ID09IG51bGwgfHwgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIChyZXN1bHQgPSBUZXh0VXRpbGl0aWVzLmluZGV4T2YoRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMsIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocHJldiksIDApKVswXSA+PSAwKSkgewotCQkJCQkvLyBDb2xsYXBzZSB0byBvbmUgZW1wdHkgbGluZSBpZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUuCi0JCQkJCWludCBvZmZzZXQgPSByZXN1bHRbMF0gKyBEZWZhdWx0TGluZVRyYWNrZXIuREVMSU1JVEVSU1tyZXN1bHRbMV1dLmxlbmd0aCgpOwotCQkJCQlpZiAob2Zmc2V0IDwgaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChwcmV2KS5sZW5ndGgoKSApIHsKLQkJCQkJCWlmIChUZXh0VXRpbGl0aWVzLmluZGV4T2YoRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMsIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocHJldiksIG9mZnNldClbMF0gPj0gMCkgewotCQkJCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCVN0cmluZyBmdWxsVGV4dCA9IHRvQXBwZW5kLmdldERvY3VtZW50UmVnaW9uKCkuZ2V0RnVsbFRleHQocHJldik7Ci0JCQkJCVN0cmluZyB0cmltbWVkVGV4dCA9IHRvQXBwZW5kLmdldERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChwcmV2KTsKLQkJCQkJU3RyaW5nIHdoaXRlU3BhY2VzID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZnVsbFRleHQgIT0gbnVsbCAmJiB0cmltbWVkVGV4dCAhPSBudWxsKQotCQkJCQkgICAgd2hpdGVTcGFjZXMgPSBmdWxsVGV4dC5zdWJzdHJpbmcodHJpbW1lZFRleHQubGVuZ3RoKCkpOwotCQkJCQlpbnRbXSBkZWxpbWl0ZXJGb3VuZCA9IFRleHRVdGlsaXRpZXMuaW5kZXhPZihEZWZhdWx0TGluZVRyYWNrZXIuREVMSU1JVEVSUywgd2hpdGVTcGFjZXMsIDApOwotCQkJCQlpZiAoZGVsaW1pdGVyRm91bmRbMF0gIT0gLTEpIHsKLQkJCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwkKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLmdldFRleHQoKSwgc291cmNlKTsKLQkJCQkJCQotCQkJCQkJLypJZiB0d28gY29tbWVudHMgY2FuJ3QgYmUgYWRqdXN0ZWQgaW4gb25lIGxpbmUoY29tYmluZWQgbGVuZ3RoIGV4Y2VlZHMgbGluZSB3aWR0aCksCi0JCQkJCQkgKiBhIHRhYiBpcyBhbHNvIGFwcGVuZGVkIGFsb25nIHdpdGggbmV4dCBsaW5lIGRlbGltaXRlciAsIHdlIG5lZWQgdG8gcmVtb3ZlIHRoYXQuIAotCQkJCQkJICovCi0JCQkJCQlpZiAoc291cmNlLnRvU3RyaW5nKCkuZW5kc1dpdGgoZ2V0SW5kZW50U3RyaW5nKCkpKSB7Ci0JCQkJCQkJc291cmNlLmRlbGV0ZSgoc291cmNlLmxlbmd0aCgpIC0gZ2V0SW5kZW50U3RyaW5nKCkubGVuZ3RoKCkpLCBzb3VyY2UubGVuZ3RoKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZC5nZXRUZXh0KCksIHNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHRvQXBwZW5kLmdldERvY3VtZW50UmVnaW9uKCksIHRvQXBwZW5kLmdldFRleHRSZWdpb24oKSk7Ci0JCQkJaXQucHJldigpOwotCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0KLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgVGV4dFV0aWxpdGllcy5pbmRleE9mKERlZmF1bHRMaW5lVHJhY2tlci5ERUxJTUlURVJTLCBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHByZXYpLCAwKVswXSA+PSAwKSB7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpID4gMCAmJiAoIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSkgewotCQkJCQlpbnQgbGVuZ3RoID0gZ2V0TGFzdExpbmVMZW5ndGgobm9kZSwgc291cmNlKTsKLQkJCQkJaW50IGFwcGVuZCA9IDE7Ci0JCQkJCWlmIChsZW5ndGggKyBhcHBlbmQgPiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSkgewotCQkJCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTcGFjZUJlZm9yZShJQ1NTTm9kZSBub2RlLCBDb21wb3VuZFJlZ2lvbiB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IHRvQXBwZW5kID09IG51bGwgfHwgc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc0NsZWFudXAoKSAmJiAhZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzRm9ybWF0U291cmNlKCkpCi0JCQlyZXR1cm47IC8vIGZvciBub3QgZm9ybWF0dGluZyBjYXNlIG9uIGNsZWFudXAgYWN0aW9uCi0JCVN0cmluZyB0eXBlID0gdG9BcHBlbmQuZ2V0VHlwZSgpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQlib29sZWFuIG5lZWRJbmRlbnQgPSAhKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCk7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkvLyBjaGVjayB3aGV0aGVyIHByZXZpb3VzIHJlZ2lvbiBpcyAnUycgYW5kIGhhcyBDUi1MRgotCQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHRvQXBwZW5kLmdldERvY3VtZW50UmVnaW9uKCksIHRvQXBwZW5kLmdldFRleHRSZWdpb24oKSk7Ci0JCQlpdC5wcmV2KCk7Ci0JCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJaWYgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIFRleHRVdGlsaXRpZXMuaW5kZXhPZihEZWZhdWx0TGluZVRyYWNrZXIuREVMSU1JVEVSUywgaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChwcmV2KSwgMClbMF0gPj0gMCkgewotCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZC5nZXRUZXh0KCksIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFICYmIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UpKSB7Ci0JCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkvLyB9IGVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NVUkxZX0JSQUNFX0NMT1NFKSB7Ci0JCQkvLyB9IGVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lOQ0xVREVTIHx8IHR5cGUgPT0KLQkJCS8vIENTU1JlZ2lvbkNvbnRleHRzLkNTU19EQVNITUFUQ0gpIHsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IgJiYgbm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSB7Ci0JCQlpbnQgbiA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BSRV9ERUxJTSk7Ci0JCQkvLyBubyBkZWxpbWl0ZXIgY2FzZQotCQkJd2hpbGUgKG4tLSA+IDApCi0JCQkJc291cmNlLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkgewotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpID4gMCAmJiAoIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSkgewotCQkJCWludCBsZW5ndGggPSBnZXRMYXN0TGluZUxlbmd0aChub2RlLCBzb3VyY2UpOwotCQkJCWludCBhcHBlbmQgPSAxOwotCQkJCWlmIChsZW5ndGggKyBhcHBlbmQgPiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSkgewotCQkJCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT1JFSUdOX0VMRU1FTlQgPT0gdHlwZSB8fCBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSID09IHR5cGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQllbHNlCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZC5nZXRUZXh0KCksIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kU3BhY2VCZWZvcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc0NsZWFudXAoKSAmJiAhZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzRm9ybWF0U291cmNlKCkpCi0JCQlyZXR1cm47IC8vIGZvciBub3QgZm9ybWF0dGluZyBjYXNlIG9uIGNsZWFudXAgYWN0aW9uCi0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAodG9BcHBlbmQgIT0gbnVsbCAmJiB0b0FwcGVuZC5zdGFydHNXaXRoKCJ7IikgJiYgcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX05FV0xJTkVfT05fT1BFTl9CUkFDRSkpIHsvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UgaWYgKC8qICEgbWdyLmlzT25lUHJvcGVydHlQZXJMaW5lKCkgJiYgKi9wcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSA+IDAgJiYgKCFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCWludCBuID0gZ2V0TGFzdExpbmVMZW5ndGgobm9kZSwgc291cmNlKTsKLQkJCWludCBhcHBlbmQgPSAodG9BcHBlbmQgIT0gbnVsbCkgPyBUZXh0VXRpbGl0aWVzLmluZGV4T2YoRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMsIHRvQXBwZW5kLCAwKVswXSA6IDA7Ci0JCQlpZiAodG9BcHBlbmQgIT0gbnVsbCkKLQkJCQlhcHBlbmQgPSAoYXBwZW5kIDwgMCkgPyB0b0FwcGVuZC5sZW5ndGgoKSA6IGFwcGVuZDsKLQkJCWlmIChuICsgYXBwZW5kICsgMSA+IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKSB7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXNvdXJjZS5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBjbGVhbnVwKElDU1NOb2RlIG5vZGUpIHsKLQkJc2hvcnQgb2xkU3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJc3RyYXRlZ3kgPSBDTEVBTlVQOwotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gZm9ybWF0UHJvYyhub2RlKTsKLQkJc3RyYXRlZ3kgPSBvbGRTdHJhdGVneTsKLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgY2xlYW51cChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbikgewotCQlzaG9ydCBvbGRTdHJhdGVneSA9IHN0cmF0ZWd5OwotCQlzdHJhdGVneSA9IENMRUFOVVA7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBmb3JtYXRQcm9jKG5vZGUsIHJlZ2lvbik7Ci0JCXN0cmF0ZWd5ID0gb2xkU3RyYXRlZ3k7Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlZElkZW50UmVnaW9uKENvbXBvdW5kUmVnaW9uIHJlZ2lvbiwgQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kpIHsKLQkJaWYgKGlzRm9ybWF0KCkpCi0JCQlyZXR1cm4gcmVnaW9uLmdldFRleHQoKTsKLQotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmICghc3RneS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJdGV4dCA9IHJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQllbHNlCi0JCQl0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJCi0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJKQotCQkJcmV0dXJuIGRlY29yYXRlZFJlZ2lvbihyZWdpb24sIDAsIHN0Z3kpOwotCi0JCWlmIChpc0NsZWFudXAoKSkgewotCQkJaWYgKHN0Z3kuZ2V0SWRlbnRDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQlyZXR1cm4gdGV4dDsKLQkJCWVsc2UgaWYgKHN0Z3kuZ2V0SWRlbnRDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKQotCQkJCXJldHVybiB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTsKLQkJfQotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQlyZXR1cm4gdGV4dDsKLQkJZWxzZSBpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlZFByb3BOYW1lUmVnaW9uKENvbXBvdW5kUmVnaW9uIHJlZ2lvbiwgQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kpIHsKLQkJaWYgKGlzRm9ybWF0KCkpCi0JCQlyZXR1cm4gcmVnaW9uLmdldFRleHQoKTsKLQotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmICghc3RneS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJdGV4dCA9IHJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQllbHNlCi0JCQl0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJCi0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJKQotCQkJcmV0dXJuIGRlY29yYXRlZFJlZ2lvbihyZWdpb24sIDEsIHN0Z3kpOwotCQlpZiAoaXNDbGVhbnVwKCkpIHsKLQkJCWlmIChzdGd5LmdldFByb3BOYW1lQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5BU0lTIHx8IHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZKQotCQkJCXJldHVybiB0ZXh0OwotCQkJZWxzZSBpZiAoc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQlpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFkpCi0JCQlyZXR1cm4gdGV4dDsKLQkJZWxzZSBpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihDb21wb3VuZFJlZ2lvbiByZWdpb24sIENTU0NsZWFudXBTdHJhdGVneSBzdGd5KSB7Ci0JCWlmIChpc0Zvcm1hdCgpKQotCQkJcmV0dXJuIHJlZ2lvbi5nZXRUZXh0KCk7Ci0KLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoIXN0Z3kuaXNGb3JtYXRTb3VyY2UoKSkKLQkJCXRleHQgPSByZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJZWxzZQotCQkJdGV4dCA9IHJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSkKLQkJCXJldHVybiBkZWNvcmF0ZWRSZWdpb24ocmVnaW9uLCAyLCBzdGd5KTsKLQkJaWYgKGlzQ2xlYW51cCgpKSB7Ci0JCQlpZiAoc3RneS5nZXRQcm9wVmFsdWVDYXNlKCkgIT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMpIHsKLQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHN0Z3kuZ2V0UHJvcFZhbHVlQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQkJCXRleHQgPSB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVjb3JhdGVkUmVnaW9uKENvbXBvdW5kUmVnaW9uIHJlZ2lvbiwgaW50IHR5cGUsIENTU0NsZWFudXBTdHJhdGVneSBzdGd5KSB7Ci0JCWlmIChpc0Zvcm1hdCgpKQotCQkJcmV0dXJuIHJlZ2lvbi5nZXRUZXh0KCk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKCFzdGd5LmlzRm9ybWF0U291cmNlKCkpCi0JCQl0ZXh0ID0gcmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCWVsc2UKLQkJCXRleHQgPSByZWdpb24uZ2V0VGV4dCgpOwotCQkKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAocmVnaW9uVHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJIHx8IHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSkgewotCQkJU3RyaW5nIHVyaSA9IENTU0xpbmtDb252ZXJ0ZXIuc3RyaXBGdW5jKHRleHQpOwotCi0JCQlib29sZWFuIHByZWZJc1VwcGVyID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCQkJYm9vbGVhbiB1cHBlciA9ICh0eXBlID09IDApID8gcHJlZklzVXBwZXIgOiAoKHR5cGUgPT0gMSkgPyBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIgOiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJCVN0cmluZyBmdW5jID0gdGV4dC5zdWJzdHJpbmcoMCwgNCk7Ci0JCQlpZiAoaXNDbGVhbnVwKCkpIHsKLQkJCQl1cHBlciA9ICgodHlwZSA9PSAwKSA/IHN0Z3kuZ2V0SWRlbnRDYXNlKCkgOiAoKHR5cGUgPT0gMSkgPyBzdGd5LmdldFByb3BOYW1lQ2FzZSgpIDogc3RneS5nZXRQcm9wVmFsdWVDYXNlKCkpKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVI7Ci0JCQkJZnVuYyA9ICgodHlwZSA9PSAwKSA/IHN0Z3kuZ2V0SWRlbnRDYXNlKCkgOiAoKHR5cGUgPT0gMSkgPyBzdGd5LmdldFByb3BOYW1lQ2FzZSgpIDogc3RneS5nZXRQcm9wVmFsdWVDYXNlKCkpKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyA/IHRleHQuc3Vic3RyaW5nKDAsIDQpIDogKHVwcGVyID8gIlVSTCgiIDogInVybCgiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKCghaXNDbGVhbnVwKCkgJiYgcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URV9JTl9VUkkpKSB8fCAoaXNDbGVhbnVwKCkgJiYgc3RneS5pc1F1b3RlVmFsdWVzKCkpKSB7Ci0JCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUodXJpLCBxdW90ZSk7Ci0JCQkJdGV4dCA9IGZ1bmMgKyBxdW90ZSArIHVyaSArIHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKGlzQ2xlYW51cCgpICYmICFzdGd5LmlzUXVvdGVWYWx1ZXMoKSkgewotCQkJCXRleHQgPSBmdW5jICsgQ1NTTGlua0NvbnZlcnRlci5yZW1vdmVGdW5jKHRleHQpICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRleHQgPSBmdW5jICsgdXJpICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcgJiYgKCFpc0NsZWFudXAoKSB8fCBzdGd5LmlzUXVvdGVWYWx1ZXMoKSkpIHsKLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQkvLyBiZWdnaW5uaW5nCi0JCQlpZiAoIXRleHQuc3RhcnRzV2l0aChxdW90ZSkpIHsKLQkJCQlpZiAodGV4dC5zdGFydHNXaXRoKCJcIiIpIHx8IHRleHQuc3RhcnRzV2l0aCgiXCciKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXRleHQgPSBxdW90ZSArIHRleHQuc3Vic3RyaW5nKDEpOwotCQkJCWVsc2UKLQkJCQkJdGV4dCA9IHF1b3RlICsgdGV4dDsKLQkJCX0KLQkJCS8vIGVuZGluZwotCQkJaWYgKCF0ZXh0LmVuZHNXaXRoKHF1b3RlKSkgewotCQkJCWlmICh0ZXh0LmVuZHNXaXRoKCJcIiIpIHx8IHRleHQuZW5kc1dpdGgoIlwnIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGgoKSAtIDEpICsgcXVvdGU7Ci0JCQkJZWxzZQotCQkJCQl0ZXh0ID0gdGV4dCArIHF1b3RlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgZm9ybWF0KElDU1NOb2RlIG5vZGUpIHsKLQkJc2hvcnQgb2xkU3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJc3RyYXRlZ3kgPSBGT1JNQVQ7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBmb3JtYXRQcm9jKG5vZGUpOwotCQlzdHJhdGVneSA9IG9sZFN0cmF0ZWd5OwotCi0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXQoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pIHsKLQkJc2hvcnQgb2xkU3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJc3RyYXRlZ3kgPSBGT1JNQVQ7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBmb3JtYXRQcm9jKG5vZGUsIHJlZ2lvbik7Ci0JCXN0cmF0ZWd5ID0gb2xkU3RyYXRlZ3k7Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKGluc2VydCAmJiAoYXR0ciAhPSBudWxsKSA/IGF0dHIuZ2V0VmFsdWUoKSA6ICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBiZXR3ZWVuIGNoaWxkcmVuKCdjaGlsZCcgYW5kIGl0cyBwcmV2aW91cwotCSAqIHNpYmxpbmcpIGFuZCBhcHBlbmQgdG8gc3RyaW5nIGJ1ZmZlcgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcik7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGJldHdlZW4gY2hpbGRyZW4oJ2NoaWxkJyBhbmQgaXRzIHByZXZpb3VzCi0JICogc2libGluZykgYW5kIGFwcGVuZCB0byBzdHJpbmcgYnVmZmVyCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCUFzc2VydC5pc1RydWUoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5nZXRQYXJlbnROb2RlKCkgPT0gbm9kZSk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcm1hdEJlZm9yZShub2RlLCBjaGlsZCwgLyogKGNoaWxkICE9IG51bGwpID8gKGNoaWxkLmdldENzc1RleHQoKSkgOiAqLyIiLCBidWYsIGV4Y2VwdEZvcik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYmV0d2VlbiBjaGlsZHJlbignY2hpbGQnIGFuZCBpdHMgcHJldmlvdXMKLQkgKiBzaWJsaW5nKSBhbmQgYXBwZW5kIHRvIHN0cmluZyBidWZmZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZm9ybWF0Q2hpbGRyZW4oSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCS8vIGFwcGVuZCBjaGlsZAotCQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IChDU1NTb3VyY2VGb3JtYXR0ZXIpICgoSU5vZGVOb3RpZmllcikgY2hpbGQpLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewotCQkJCWZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIGNoaWxkKTsKLQkJCX0KLQkJCVN0cmluZ0J1ZmZlciBjaGlsZFNvdXJjZSA9ICgoQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIpIGZvcm1hdHRlcikuZm9ybWF0UHJvYyhjaGlsZCk7Ci0JCQlpZiAoIWZpcnN0KSB7Ci0JCQkJZm9ybWF0QmVmb3JlKG5vZGUsIGNoaWxkLCBuZXcgU3RyaW5nKGNoaWxkU291cmNlKSwgc291cmNlLCBudWxsKTsKLQkJCX0KLQkJCXNvdXJjZS5hcHBlbmQoY2hpbGRTb3VyY2UpOwotCQkJLy8gYXBwZW5kIGJldHdlZW4gY2hpbGRyZW4KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWZpcnN0ID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmb3JtYXRDaGlsZHJlbihJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpbnQgc3RhcnQgPSByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaW50IGN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldEVuZE9mZnNldCgpOwotCQkJU3RyaW5nQnVmZmVyIGNoaWxkU291cmNlID0gbnVsbDsKLQkJCWJvb2xlYW4gdG9GaW5pc2ggPSBmYWxzZTsKLQkJCWlmIChzdGFydCA8IGN1ckVuZCkgewotCQkJCWludCBjdXJTdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaWYgKGN1clN0YXJ0IDwgZW5kKSB7Ci0JCQkJCS8vIGFwcGVuZCBjaGlsZAotCQkJCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgKChJTm9kZU5vdGlmaWVyKSBjaGlsZCkuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQkJCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKLQkJCQkJCWZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIGNoaWxkKTsKLQkJCQkJfQotCQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJCWNoaWxkU291cmNlID0gKChBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlcikgZm9ybWF0dGVyKS5mb3JtYXRQcm9jKGNoaWxkKTsKLQkJCQkJZWxzZQotCQkJCQkJY2hpbGRTb3VyY2UgPSAoKEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyKSBmb3JtYXR0ZXIpLmZvcm1hdFByb2MoY2hpbGQsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJdG9GaW5pc2ggPSB0cnVlOwotCQkJfQotCQkJLy8gYXBwZW5kIGJldHdlZW4gY2hpbGRyZW4KLQkJCWlmICghZmlyc3QpIHsKLQkJCQljdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpOyAvLyBjaGFuZ2UKLQkJCQkvLyBvbmx5Ci0JCQkJLy8gc3RhcnQKLQkJCQlpZiAoc3RhcnQgPCBjdXJFbmQpIHsKLQkJCQkJaW50IGN1clN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWlmIChjdXJTdGFydCA8IGVuZCkgewotCQkJCQkJU3RyaW5nIHRvQXBwZW5kID0gKGNoaWxkU291cmNlICE9IG51bGwpID8gbmV3IFN0cmluZyhjaGlsZFNvdXJjZSkgOiAiIjsvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJCQlmb3JtYXRCZWZvcmUobm9kZSwgY2hpbGQsIHRvQXBwZW5kLCBzb3VyY2UsIG51bGwpOwotCQkJCQkJZWxzZQotCQkJCQkJCWZvcm1hdEJlZm9yZShub2RlLCBjaGlsZCwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChjaGlsZFNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJc291cmNlLmFwcGVuZChjaGlsZFNvdXJjZSk7Ci0JCQl9Ci0JCQlmaXJzdCA9IGZhbHNlOwotCQkJaWYgKHRvRmluaXNoKQotCQkJCWJyZWFrOwotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBhZnRlciB0aGUgbGFzdCBjaGlsZCBhbmQgYXBwZW5kIHRvIHN0cmluZwotCSAqIGJ1ZmZlcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSk7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGFmdGVyIHRoZSBsYXN0IGNoaWxkIGFuZCBhcHBlbmQgdG8gc3RyaW5nCi0JICogYnVmZmVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSk7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGJlZm9yZSB0aGUgZmlyc3QgY2hpbGQgYW5kIGFwcGVuZCB0byBzdHJpbmcKLQkgKiBidWZmZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSk7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGJlZm9yZSB0aGUgZmlyc3QgY2hpbGQgYW5kIGFwcGVuZCB0byBzdHJpbmcKLQkgKiBidWZmZXIKLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXRQcm9jKElDU1NOb2RlIG5vZGUpIHsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9ybWF0UHJlKG5vZGUsIHNvdXJjZSk7Ci0JCWZvcm1hdENoaWxkcmVuKG5vZGUsIHNvdXJjZSk7Ci0JCWZvcm1hdFBvc3Qobm9kZSwgc291cmNlKTsKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nQnVmZmVyIGZvcm1hdFByb2MoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGN1clN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG5vZGUuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID4gMCkgewotCQkJY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWlmIChvdmVybGFwcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKSB7Ci0JCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCWZvcm1hdFByZShub2RlLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0UHJlKG5vZGUsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSwgc291cmNlKTsKLQkJCX0KLQkJCWN1clN0YXJ0ID0gY3VyRW5kOwotCQkJY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChvdmVybGFwcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKSB7Ci0JCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCWZvcm1hdENoaWxkcmVuKG5vZGUsIHNvdXJjZSk7Ci0JCQkJZWxzZQotCQkJCQlmb3JtYXRDaGlsZHJlbihub2RlLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCksIHNvdXJjZSk7Ci0JCQl9Ci0JCQljdXJTdGFydCA9IGN1ckVuZDsKLQkJCWN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAob3ZlcmxhcHMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkgewotCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQlmb3JtYXRQb3N0KG5vZGUsIHNvdXJjZSk7Ci0JCQkJZWxzZQotCQkJCQlmb3JtYXRQb3N0KG5vZGUsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSwgc291cmNlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWN1ckVuZCA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJaWYgKG92ZXJsYXBzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpIHsKLQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJZm9ybWF0UHJlKG5vZGUsIHNvdXJjZSk7Ci0JCQkJZWxzZQotCQkJCQlmb3JtYXRQcmUobm9kZSwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpLCBzb3VyY2UpOwotCQkJfQotCQkJY3VyU3RhcnQgPSBjdXJFbmQ7Ci0JCQljdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKG92ZXJsYXBzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpIHsKLQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJZm9ybWF0UG9zdChub2RlLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0UG9zdChub2RlLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCksIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3kKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTQ2xlYW51cFN0cmF0ZWd5IGdldENsZWFudXBTdHJhdGVneShJQ1NTTm9kZSBub2RlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBjdXJyZW50U3RyYXRlZ3kgPSBDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsLmdldEluc3RhbmNlKCk7Ci0JCUlDU1NEb2N1bWVudCBkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuIGN1cnJlbnRTdHJhdGVneTsKLQkJSUNTU01vZGVsIG1vZGVsID0gZG9jLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIGN1cnJlbnRTdHJhdGVneTsKLQkJaWYgKG1vZGVsLmdldFN0eWxlU2hlZXRUeXBlKCkgIT0gSUNTU01vZGVsLkVYVEVSTkFMKSB7Ci0JCQkvLyBUT0RPIC0gVFJBTlNJVElPTiBOYWthbW9yaS1zYW4sIG9yIEtpdCwgaG93IGNhbiB3ZSBtb3ZlIHRvCi0JCQkvLyAiSFRNTCIgcGx1Z2luPwotCQkJLy8gY2FuIHdlIHN1YmNsYXNzPwotCQkJLy8gY3VycmVudFN0cmF0ZWd5ID0gQ1NTSW5IVE1MQ2xlYW51cFN0cmF0ZWd5SW1wbC5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBjdXJyZW50U3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbmRlbnQoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJSUNTU05vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU0F0dHIpCi0JCQlwYXJlbnQgPSAoKElDU1NBdHRyKSBub2RlKS5nZXRPd25lckNTU05vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbikKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHBhcmVudEluZGVudCA9IGdldEluZGVudChwYXJlbnQpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2Ygb3JnLnczYy5kb20uY3NzLkNTU1J1bGUpCi0JCQlyZXR1cm4gcGFyZW50SW5kZW50ICsgZ2V0SW5kZW50U3RyaW5nKCk7Ci0JCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKQotCQkJcmV0dXJuIHBhcmVudEluZGVudCArIGdldEluZGVudFN0cmluZygpOwotCQlyZXR1cm4gcGFyZW50SW5kZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TGFzdExpbmVMZW5ndGgoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCVN0cmluZyBzdHIgPSBuZXcgU3RyaW5nKHNvdXJjZSk7Ci0JCWludCBuID0gc3RyLmxhc3RJbmRleE9mKGRlbGltKTsKLQkJaWYgKG4gPCAwKQotCQkJcmV0dXJuIHN0ci5sZW5ndGgoKTsKLQotCQlyZXR1cm4gc3RyLmxlbmd0aCgpIC0gbiAtIGRlbGltLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUluZGV4ZWRSZWdpb24gbm5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGluc2VydFBvcyA8IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcykpCi0JCQlyZXR1cm4gMDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MpOwotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJcmVnaW9uID0gaXQubmV4dCgpOwotCQkJLy8gaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYKLQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiAmJgotCQkJLy8gcmVnaW9uLmdldFR5cGUoKSAhPQotCQkJLy8gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaW50IHBvcyA9IChmb3VuZCA/IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgOiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpIC0gaW5zZXJ0UG9zOwotCQlyZXR1cm4gKHBvcyA+PSAwKSA/IHBvcyA6IDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUluZGV4ZWRSZWdpb24gbm5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGluc2VydFBvcyA8PSAwIHx8ICFubm9kZS5jb250YWlucyhpbnNlcnRQb3MgLSAxKSkKLQkJCXJldHVybiAwOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyAtIDEpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MgLSAxKTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCXJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCS8vIGlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmCi0JCQkvLyByZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgJiYKLQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgIT0KLQkJCS8vIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWludCBwb3MgPSBpbnNlcnRQb3MgLSAoZm91bmQgPyBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikgOiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pKTsKLQkJLy8gZmxhdE5vZGUgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJLy8gaWYgKGZvdW5kKSB7Ci0JCS8vIGlmIChyZWdpb24uZ2V0TGVuZ3RoKCkgIT0gcmVnaW9uLmdldFRleHRMZW5ndGgoKSkgewotCQkvLyBwb3MgPSBpbnNlcnRQb3MgLSBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCS8vIH0gZWxzZSB7Ci0JCS8vIHBvcyA9IGluc2VydFBvcyAtIGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkvLyB9Ci0JCS8vIH0gZWxzZSB7Ci0JCS8vIHBvcyA9IGluc2VydFBvcyAtIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCS8vIH0KLQkJcmV0dXJuIChwb3MgPj0gMCkgPyBwb3MgOiAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKElDU1NOb2RlIG5vZGUpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gKG5vZGUgIT0gbnVsbCkgPyBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpIDogbnVsbDsKLQkJcmV0dXJuIChtb2RlbCAhPSBudWxsKSA/IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKSA6ICJcbiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBUT0RPIDogY2hlY2sgd2hldGhlciB0byB1c2UgbW9kZWwuZ2V0TGluZURlbGltaXRlcigpIG9yCi0JCS8vIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZFJlZ2lvbltdIGdldE91dHNpZGVSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnQgbW9kZWwsIElSZWdpb24gcmVnKSB7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmV0ID0gbmV3IENvbXBvdW5kUmVnaW9uWzJdOwotCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihtb2RlbCwgcmVnLmdldE9mZnNldCgpKTsKLQkJaXQucHJldigpOwotCQlpZiAoaXQuaGFzUHJldigpKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gaXQucHJldigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJcmV0WzBdID0gbmV3IENvbXBvdW5kUmVnaW9uKGRvY3VtZW50UmVnaW9uLCB0ZXh0UmVnaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldFswXSA9IG51bGw7Ci0JCX0KLQkJaXQucmVzZXQobW9kZWwsIHJlZy5nZXRPZmZzZXQoKSArIHJlZy5nZXRMZW5ndGgoKSk7Ci0JCWlmIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSBpdC5uZXh0KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlyZXRbMV0gPSBuZXcgQ29tcG91bmRSZWdpb24oZG9jdW1lbnRSZWdpb24sIHRleHRSZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0WzFdID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDU1NTb3VyY2VHZW5lcmF0b3IgZ2V0UGFyZW50Rm9ybWF0dGVyKElDU1NOb2RlIG5vZGUpIHsKLQkJSUNTU05vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IChDU1NTb3VyY2VHZW5lcmF0b3IpICgoSU5vZGVOb3RpZmllcikgcGFyZW50KS5nZXRBZGFwdGVyRm9yKENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcyk7Ci0JCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKLQkJCQlmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBwYXJlbnQpOwotCQkJfQotCQkJcmV0dXJuIGZvcm1hdHRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb25bXSBnZXRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnQgbW9kZWwsIElSZWdpb24gcmVnLCBJUmVnaW9uIGV4Y2VwdEZvciwgU3RyaW5nIHBpY2t1cFR5cGUpIHsKLQkJaW50IHN0YXJ0ID0gcmVnLmdldE9mZnNldCgpOwotCQlpbnQgZW5kID0gcmVnLmdldE9mZnNldCgpICsgcmVnLmdldExlbmd0aCgpOwotCQlpbnQgc3RhcnRFID0gKGV4Y2VwdEZvciAhPSBudWxsKSA/IGV4Y2VwdEZvci5nZXRPZmZzZXQoKSA6IC0xOwotCQlpbnQgZW5kRSA9IChleGNlcHRGb3IgIT0gbnVsbCkgPyBleGNlcHRGb3IuZ2V0T2Zmc2V0KCkgKyBleGNlcHRGb3IuZ2V0TGVuZ3RoKCkgOiAwOwotCi0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbW9kZWwuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQlib29sZWFuIHBpY2t1cGVkID0gZmFsc2U7Ci0JCXdoaWxlIChmbGF0Tm9kZSAhPSBudWxsICYmIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBlbmQpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJSXRlcmF0b3IgaXQgPSByZWdpb25MaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPCBzdGFydCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGVuZCA8PSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pKQotCQkJCQlicmVhazsKLQkJCQlpZiAoc3RhcnRFID49IDAgJiYgc3RhcnRFIDw9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgJiYgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikgPD0gZW5kRSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RDIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETykKLQkJCQkJbGlzdC5hZGQobmV3IENvbXBvdW5kUmVnaW9uKGZsYXROb2RlLCByZWdpb24pKTsKLQkJCQllbHNlIGlmICghcGlja3VwZWQgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBwaWNrdXBUeXBlKSB7Ci0JCQkJCWxpc3QuYWRkKG5ldyBDb21wb3VuZFJlZ2lvbihmbGF0Tm9kZSwgcmVnaW9uKSk7Ci0JCQkJCXBpY2t1cGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlmbGF0Tm9kZSA9IGZsYXROb2RlLmdldE5leHQoKTsKLQkJfQotCQlpZiAobGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBuZXcgQ29tcG91bmRSZWdpb25bbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHJlZ2lvbnMpOwotCQkJcmV0dXJuIHJlZ2lvbnM7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21wb3VuZFJlZ2lvblswXTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb25bXSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnQgbW9kZWwsIElSZWdpb24gcmVnLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlpbnQgc3RhcnQgPSByZWcuZ2V0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSByZWcuZ2V0T2Zmc2V0KCkgKyByZWcuZ2V0TGVuZ3RoKCkgLSAxOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG1vZGVsLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJd2hpbGUgKGZsYXROb2RlICE9IG51bGwgJiYgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8PSBlbmQpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJSXRlcmF0b3IgaXQgPSByZWdpb25MaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPCBzdGFydCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGVuZCA8IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IChpc0NsZWFudXAoKSAmJiAhc3RneS5pc0Zvcm1hdFNvdXJjZSgpKSkgLy8gZm9yCi0JCQkJCS8vIG5vdAotCQkJCQkvLyBmb3JtYXR0aW5nCi0JCQkJCS8vIGNhc2UKLQkJCQkJLy8gb24KLQkJCQkJLy8gY2xlYW51cAotCQkJCQkvLyBhY3Rpb24KLQkJCQkJbGlzdC5hZGQobmV3IENvbXBvdW5kUmVnaW9uKGZsYXROb2RlLCByZWdpb24pKTsKLQkJCX0KLQkJCWZsYXROb2RlID0gZmxhdE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChsaXN0LnNpemUoKSA+IDApIHsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG5ldyBDb21wb3VuZFJlZ2lvbltsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocmVnaW9ucyk7Ci0JCQlyZXR1cm4gcmVnaW9uczsKLQkJfQotCQlyZXR1cm4gbmV3IENvbXBvdW5kUmVnaW9uWzBdOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbmNsdWRlcyhJUmVnaW9uIHJlZ2lvbiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gKHJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBzdGFydCkgJiYgKGVuZCA8PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0NsZWFudXAoKSB7Ci0JCXJldHVybiBzdHJhdGVneSA9PSBDTEVBTlVQOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0Zvcm1hdCgpIHsKLQkJcmV0dXJuIHN0cmF0ZWd5ID09IEZPUk1BVDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luY2x1ZGVzUHJlRW5kKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpID09IChyZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgcHJvdGVjdGVkIGJvb2xlYW4gbmVlZFMoQ29tcG91bmRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmVnaW9uIG92ZXJsYXBwZWRSZWdpb24oSVJlZ2lvbiByZWdpb24sIGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAob3ZlcmxhcHMocmVnaW9uLCBzdGFydCwgZW5kKSkgewotCQkJaW50IG9mZnNldCA9IChyZWdpb24uZ2V0T2Zmc2V0KCkgPD0gc3RhcnQpID8gc3RhcnQgOiByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgbGVuZ3RoID0gKChlbmQgPD0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSA/IGVuZCA6IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkgLSBvZmZzZXQ7Ci0JCQlyZXR1cm4gbmV3IEZvcm1hdFJlZ2lvbihvZmZzZXQsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG92ZXJsYXBzKElSZWdpb24gcmVnaW9uLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiAoc3RhcnQgPCByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpICYmIChyZWdpb24uZ2V0T2Zmc2V0KCkgPCBlbmQpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQl9Ci0JCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BdHRyQ2hhbmdlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckNoYW5nZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI0YTczZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BdHRyQ2hhbmdlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEF0dHJDaGFuZ2VDb250ZXh0IHsKLQotCXB1YmxpYyBpbnQgc3RhcnQsIGVuZDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBdHRyQ2hhbmdlQ29udGV4dCgpIHsKLQkJc3VwZXIoKTsKLQkJc3RhcnQgPSBlbmQgPSAwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BdHRyRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BdHRyRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MWE5ZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBBdHRyRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JQXR0ckZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlOwotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0KLQkJCWlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUikgfHwgYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NQYWdlUnVsZS5TRUxFQ1RPUikpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCkKLQkJCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlRGVjbEl0ZW0uSU1QT1JUQU5UKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpID09IG51bGwgfHwgYXR0ci5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gY291bnRlciBhdHRyaWJ1dGVzCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQotCQkJU3RyaW5nIHZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJdmFsdWUgPSAiIjsvLyROT04tTkxTLTEkCi0JCQlpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZVJ1bGUuU0VMRUNUT1IpIHx8IGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IpKSB7Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU0ltcG9ydFJ1bGUuSFJFRikpIHsKLQkJCQlTdHJpbmcgdXJpID0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTTGlua0NvbnZlcnRlci5zdHJpcEZ1bmModmFsdWUpOwotCQkJCVN0cmluZyBmdW5jID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA/ICJVUkwoIiA6ICJ1cmwoIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFX0lOX1VSSSkpIHsKLQkJCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHVyaSwgcXVvdGUpOwotCQkJCQl2YWx1ZSA9IGZ1bmMgKyBxdW90ZSArIHVyaSArIHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZhbHVlID0gZnVuYyArIHVyaSArICIpIjsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NDaGFyc2V0UnVsZS5FTkNPRElORykpIHsKLQkJCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJCWlmICghdmFsdWUuc3RhcnRzV2l0aCgiXCIiKSAmJiAhdmFsdWUuc3RhcnRzV2l0aCgiXCciKSkvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IHF1b3RlICsgdmFsdWU7Ci0JCQkJaWYgKCF2YWx1ZS5lbmRzV2l0aCgiXCIiKSAmJiAhdmFsdWUuZW5kc1dpdGgoIlwnIikpLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSB2YWx1ZSArIHF1b3RlOwotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVCkpIHsKLQkJCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJdmFsdWUgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpOwotCQkJCWVsc2UKLQkJCQkJdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkgPT0gbnVsbCB8fCBhdHRyLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJaWYgKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7Ci0JCQkJZWxzZQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJdmFsdWUgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpOwotCQkJCWVsc2UKLQkJCQkJdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQkJc291cmNlLmFwcGVuZCh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJZm9ybWF0UHJlKG5vZGUsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQXR0ckZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEF0dHJGb3JtYXR0ZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTRm9ybWF0VXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTRm9ybWF0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODA4NTE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU0Zvcm1hdFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSUNTU01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotcHVibGljIGNsYXNzIENTU0Zvcm1hdFV0aWwgewotCXB1YmxpYyBMaXN0IGNvbGxlY3RDU1NOb2RlcyhJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJbmRleGVkUmVnaW9uIHN0YXJ0Tm9kZSA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnQpOwotCQlJbmRleGVkUmVnaW9uIGVuZE5vZGUgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0ICsgbGVuZ3RoIC0gMSk7Ci0KLQkJaWYgKHN0YXJ0Tm9kZSA9PSBudWxsIHx8IGVuZE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5vZGVzOwotCQl9Ci0KLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsICYmIHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIElDU1NOb2RlICYmIGVuZE5vZGUgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJLy8gQ1NTIG1vZGVsCi0JCQlJQ1NTTm9kZSBjYSA9IGdldENvbW1vbkFuY2VzdG9yKChJQ1NTTm9kZSkgc3RhcnROb2RlLCAoSUNTU05vZGUpIGVuZE5vZGUpOwotCQkJaWYgKGNhICE9IG51bGwpIHsKLQkJCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBjYS5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbCAmJiBzdGFydCArIGxlbmd0aCA8ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQlpZiAoc3RhcnQgPCAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwgJiYgc3RhcnROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUgJiYgZW5kTm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlpZiAoc3RhcnROb2RlIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCXN0YXJ0Tm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKFRleHQpIHN0YXJ0Tm9kZSkuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJaWYgKGVuZE5vZGUgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJZW5kTm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKFRleHQpIGVuZE5vZGUpLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCS8vIEhUTUwgbW9kZWwsIG1heWJlCi0JCQlJRE9NTm9kZSBjYSA9IChJRE9NTm9kZSkgZ2V0Q29tbW9uQW5jZXN0b3IoKE5vZGUpIHN0YXJ0Tm9kZSwgKE5vZGUpIGVuZE5vZGUpOwotCQkJZmluZENTUyhub2RlcywgY2EpOwotCQl9Ci0KLQkJcmV0dXJuIG5vZGVzOwotCX0KLQotCS8qKgotCSAqIGdldENvbW1vbkFuY2VzdG9yIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJpdmF0ZSBOb2RlIGdldENvbW1vbkFuY2VzdG9yKE5vZGUgbm9kZTEsIE5vZGUgbm9kZTIpIHsKLQkJaWYgKG5vZGUxID09IG51bGwgfHwgbm9kZTIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZvciAoTm9kZSBuYSA9IG5vZGUyOyBuYSAhPSBudWxsOyBuYSA9IG5hLmdldFBhcmVudE5vZGUoKSkgewotCQkJZm9yIChOb2RlIHRhID0gbm9kZTE7IHRhICE9IG51bGw7IHRhID0gdGEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHRhID09IG5hKQotCQkJCQlyZXR1cm4gdGE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZAotCX0KLQotCXByaXZhdGUgdm9pZCBmaW5kQ1NTKExpc3QgY3NzTm9kZXMsIElET01Ob2RlIG5vZGUpIHsKLQkJSUNTU01vZGVsQWRhcHRlciBhZGFwdGVyOwotCQlhZGFwdGVyID0gKElDU1NNb2RlbEFkYXB0ZXIpIG5vZGUuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSBhZGFwdGVyLmdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkgewotCQkJCWNzc05vZGVzLmFkZChtb2RlbC5nZXREb2N1bWVudCgpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWFkYXB0ZXIgPSAoSUNTU01vZGVsQWRhcHRlcikgbm9kZS5nZXRBZGFwdGVyRm9yKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJSUNTU01vZGVsIG1vZGVsID0gYWRhcHRlci5nZXRNb2RlbCgpOwotCQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLklOTElORSkgewotCQkJCQljc3NOb2Rlcy5hZGQobW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZm9yIChJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gKElET01Ob2RlKSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlmaW5kQ1NTKGNzc05vZGVzLCBjaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElDU1NOb2RlIGdldENvbW1vbkFuY2VzdG9yKElDU1NOb2RlIG5vZGVBLCBJQ1NTTm9kZSBub2RlQikgewotCQlpZiAobm9kZUEgPT0gbnVsbCB8fCBub2RlQiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoSUNTU05vZGUgbmEgPSBub2RlQTsgbmEgIT0gbnVsbDsgbmEgPSBuYS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWZvciAoSUNTU05vZGUgdGEgPSBub2RlQjsgdGEgIT0gbnVsbDsgdGEgPSB0YS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAodGEgPT0gbmEpIHsKLQkJCQkJcmV0dXJuIHRhOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlU291cmNlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG9mZnNldCA+PSAwICYmIGxlbmd0aCA+PSAwICYmIG9mZnNldCArIGxlbmd0aCA8PSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQuY29udGFpbnNSZWFkT25seShvZmZzZXQsIGxlbmd0aCkpCi0JCQkJcmV0dXJuOwotCQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJCS8vIFdlIHVzZSAnc3RydWN0dXJlZERvY3VtZW50JyBhcyB0aGUgcmVxdWVzdGVyIG9iamVjdCBqdXN0IHNvCi0JCQkvLyB0aGlzIGFuZCB0aGUgb3RoZXIKLQkJCS8vIGZvcm1hdC1yZWxhdGVkICdyZXBhbGNlVGV4dCcgKGluIHJlcGxhY2VTb3VyY2UpIGNhbiB1c2UgdGhlCi0JCQkvLyBzYW1lIHJlcXVlc3Rlci4KLQkJCS8vIE90aGVyd2lzZSwgaWYgcmVxdWVzdGVyIGlzIG5vdCBpZGVudGljYWwsCi0JCQkvLyB0aGUgdW5kbyBncm91cCBnZXRzICJicm9rZW4iIGludG8gbXVsdGlwbGUgcGllY2VzIGJhc2VkCi0JCQkvLyBvbiB0aGUgcmVxdWVzdGVycyBiZWluZyBkaWZmZXJlbnQuIFRlY2huaWNhbGx5LCBhbnkgdW5pcXVlLAotCQkJLy8gY29tbW9uCi0JCQkvLyByZXF1ZXN0ZXIgb2JqZWN0IHdvdWxkIHdvcmsuCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc291cmNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU0Zvcm1hdFV0aWwgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU0Zvcm1hdFV0aWwoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgQ1NTRm9ybWF0VXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NGb3JtYXRVdGlsIGZJbnN0YW5jZTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NDczYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTU291cmNlRm9ybWF0dGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBjbGVhbnVwKElDU1NOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uCi0JICovCi0JU3RyaW5nQnVmZmVyIGNsZWFudXAoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGZvcm1hdChJQ1NTTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBmb3JtYXQoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjY4OWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkgewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTU291cmNlR2VuZXJhdG9yIGdldFNvdXJjZUZvcm1hdHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlJQ1NTTm9kZSBub2RlID0gKElDU1NOb2RlKSB0YXJnZXQ7Ci0JCXNob3J0IHR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBJQ1NTTm9kZS5DSEFSU0VUUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gQ2hhcnNldFJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUgOgotCQkJCXJldHVybiBGb250RmFjZVJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gSW1wb3J0UnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSA6Ci0JCQkJcmV0dXJuIE1lZGlhTGlzdEZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSA6Ci0JCQkJcmV0dXJuIE1lZGlhUnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5QUklNSVRJVkVWQUxVRV9OT0RFIDoKLQkJCQlJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUgPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSBub2RlOwotCQkJCWlmICh2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT1VOVEVSKQotCQkJCQlyZXR1cm4gQ291bnRlckZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJCWVsc2UgaWYgKHZhbHVlLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JFQ1QpCi0JCQkJCXJldHVybiBSZWN0Rm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQkJZWxzZSBpZiAodmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpID09IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkdCQ09MT1IpCi0JCQkJCXJldHVybiBSR0JGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBQcmltaXRpdmVWYWx1ZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gUGFnZVJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFIDoKLQkJCQlyZXR1cm4gU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRURFQ0xJVEVNX05PREUgOgotCQkJCXJldHVybiBTdHlsZURlY2xJdGVtRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gU3R5bGVSdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSA6Ci0JCQkJcmV0dXJuIFN0eWxlU2hlZXRGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuQVRUUl9OT0RFIDoKLQkJCQlyZXR1cm4gQXR0ckZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIFVua25vd25SdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5IGZJbnN0YW5jZTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MmU4YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU1NvdXJjZUdlbmVyYXRvciBleHRlbmRzIENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IHJlZ2lvbik7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmdCdWZmZXIgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIGV4Y2VwdEZvcik7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpOwotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NoYXJzZXRSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DaGFyc2V0UnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDRlZWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NoYXJzZXRSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFyc2V0UnVsZUZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIENIQVJTRVQgPSAiQGNoYXJzZXQiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBDaGFyc2V0UnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNoYXJzZXRSdWxlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gYnVmOwotCi0JCWlmICghSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJaWYgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHJldik7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0gZWxzZQotCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpICsgMTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0KSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBhdHRyLmdldFZhbHVlKCksIGJ1Zik7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJZm9ybWF0UHJlKG5vZGUsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc291cmNlKTsKLQkJfSBlbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQlTdHJpbmcgc3RyID0gQ0hBUlNFVDsKLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJc3RyID0gQ0hBUlNFVC50b1VwcGVyQ2FzZSgpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJU3RyaW5nIGVuYyA9ICgoSUNTU0NoYXJzZXRSdWxlKSBub2RlKS5nZXRFbmNvZGluZygpOwotCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKGVuYywgcXVvdGUpOwotCQkJc3RyID0gcXVvdGUgKyAoKGVuYyAhPSBudWxsKSA/IGVuYyA6ICIiKSArIHF1b3RlICsgIjsiOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc3RyLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkgJiYgIXJlZ2lvbnNbaV0uZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWlmICghSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlDb21wb3VuZFJlZ2lvbiByZWdpb25zW10gPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIG5ldyBGb3JtYXRSZWdpb24oaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBpTm9kZS5nZXRTdGFydE9mZnNldCgpKSwgc3RneSk7Ci0JCWZvciAoaW50IGkgPSByZWdpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJcmV0dXJuIHJlZ2lvbnNbaV0uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDaGFyc2V0UnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBDaGFyc2V0UnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ29tcG91bmRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvbXBvdW5kUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NjJmZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ29tcG91bmRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotY2xhc3MgQ29tcG91bmRSZWdpb24gewotCi0JQ29tcG91bmRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmZEb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCQl0aGlzLmZUZXh0UmVnaW9uID0gdGV4dFJlZ2lvbjsKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZkRvY3VtZW50UmVnaW9uOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldFRleHRSZWdpb24oKSB7Ci0JCXJldHVybiBmVGV4dFJlZ2lvbjsKLQl9Ci0KLQlTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUZXh0UmVnaW9uLmdldFR5cGUoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudFJlZ2lvbi5nZXRUZXh0KGZUZXh0UmVnaW9uKTsKLQl9Ci0JCi0JLy8gQnVnIDIxODk5MzogQWRkZWQgdG8gZ2V0IHRleHQgd2l0aCB3aGl0ZXNwYWNlIGZvciBjbGVhbnVwCi0JLy8gd2l0aG91dCBmb3JtYXR0aW5nCi0JU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlyZXR1cm4gZkRvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KGZUZXh0UmVnaW9uKTsKLQl9Ci0KLQlpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pOwotCX0KLQotCWludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KGZUZXh0UmVnaW9uKTsKLQl9Ci0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmRG9jdW1lbnRSZWdpb247Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBmVGV4dFJlZ2lvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ291bnRlckZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ291bnRlckZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzE3MjViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvdW50ZXJGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ291bnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ291bnRlckZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ291bnRlckZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNvdW50ZXJGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBzb3VyY2U7Ci0KLQkJaWYgKCFJQ291bnRlci5JREVOVElGSUVSLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpICYmICFJQ291bnRlci5MSVNUU1RZTEUuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkgJiYgIUlDb3VudGVyLlNFUEFSQVRPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBzb3VyY2U7Ci0KLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJY29udGV4dC5zdGFydCA9IGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWNvbnRleHQuZW5kID0gaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkJSUNvdW50ZXIgY291bnRlciA9IChJQ291bnRlcikgbm9kZTsKLQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJU3RyaW5nIHNlcCA9IGNvdW50ZXIuZ2V0U2VwYXJhdG9yKCk7Ci0JCVN0cmluZyBpZGVudCA9IGNvdW50ZXIuZ2V0SWRlbnRpZmllcigpOwotCQlTdHJpbmcgc3R5bGUgPSBjb3VudGVyLmdldExpc3RTdHlsZSgpOwotCi0JCWlmIChJQ291bnRlci5JREVOVElGSUVSLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKSB7Ci0JCQlpZiAoaW5zZXJ0KQotCQkJCWlkZW50ID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJZWxzZQotCQkJCWlkZW50ID0gIiI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKElDb3VudGVyLkxJU1RTVFlMRS5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgewotCQkJaWYgKGluc2VydCkKLQkJCQlzdHlsZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWVsc2UKLQkJCQlzdHlsZSA9IG51bGw7Ci0JCX0KLQkJZWxzZSBpZiAoSUNvdW50ZXIuU0VQQVJBVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKSB7Ci0JCQlpZiAoaW5zZXJ0KQotCQkJCXNlcCA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWVsc2UKLQkJCQlzZXAgPSBudWxsOwotCQl9Ci0KLQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHNlcCwgcXVvdGUpOwotCQlzZXAgPSAoc2VwID09IG51bGwgfHwgc2VwLmxlbmd0aCgpID09IDApID8gbnVsbCA6IChxdW90ZSArIHNlcCArIHF1b3RlKTsKLQotCQlTdHJpbmcgZnVuYyA9IChzZXAgPT0gbnVsbCB8fCBzZXAubGVuZ3RoKCkgPT0gMCkgPyAiY291bnRlcigiIDogImNvdW50ZXJzKCI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpIHsKLQkJCWlkZW50ID0gaWRlbnQudG9VcHBlckNhc2UoKTsKLQkJCXN0eWxlID0gc3R5bGUudG9VcHBlckNhc2UoKTsKLQkJCWZ1bmMgPSBmdW5jLnRvVXBwZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZGVudCA9IGlkZW50LnRvTG93ZXJDYXNlKCk7Ci0JCQlzdHlsZSA9IHN0eWxlLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJaWYgKHNlcCA9PSBudWxsIHx8IHNlcC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzb3VyY2UuYXBwZW5kKGZ1bmMpOwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgaWRlbnQsIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGlkZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCXNvdXJjZS5hcHBlbmQoZnVuYyk7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBpZGVudCwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoaWRlbnQpOwotCQkJc291cmNlLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHNlcCwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoc2VwKTsKLQkJfQotCi0JCWlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmxlbmd0aCgpICE9IDApIHsKLQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzdHlsZSwgc291cmNlKTsKLQkJfQotCQlzb3VyY2UuYXBwZW5kKCIpIik7Ly8kTk9OLU5MUy0xJAotCi0JCS8qCi0JCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0KLQkJICogbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJICogSVRleHRSZWdpb25bXSByZWdpb25zID0KLQkJICogZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldwotCQkgKiBGb3JtYXRSZWdpb24oY29udGV4dC5zdGFydCwgY29udGV4dC5lbmQgLSBjb250ZXh0LnN0YXJ0ICsgMSkpOyBpbnQKLQkJICogY29tbWFzWzJdOyBpbnQgbnVtQ29tbWEgPSAwOyBmb3IoaW50IGogPSAwOyBqIDxyZWdpb25zLmxlbmd0aDsgaisrKSB7Ci0JCSAqIGlmIChyZWdpb25zW2pdLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DT01NQSkgewotCQkgKiBjb21tYXNbbnVtQ29tbWErK10gPSBqOyBpZiAobnVtQ29tbWEgPiAxKSBicmVhazsgfSB9Ci0JCSAqIAotCQkgKiBpZiAoSUNvdW50ZXIuSURFTlRJRklFUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgeyB9IGVsc2UKLQkJICogaWYgKElDb3VudGVyLkxJU1RTVFlMRS5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgeyB9IGVsc2UKLQkJICogaWYgKElDb3VudGVyLlNFUEFSQVRPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgeyBib29sZWFuCi0JCSAqIHNraXBTcGFjZSA9IGZhbHNlOyBTdHJpbmcgZnVuYyA9IGluc2VydCA/ICJjb3VudGVycygiIDogImNvdW50ZXIoIjsKLQkJICogaWYgKG1nci5pc1Byb3BWYWx1ZVVwcGVyQ2FzZSgpKSBmdW5jID0gZnVuYy50b1VwcGVyQ2FzZSgpOwotCQkgKiAKLQkJICogZm9yKGludCBpPTA7IGkgPHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsgaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09Ci0JCSAqIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJICogc291cmNlLmFwcGVuZChmdW5jKTsgZWxzZSB7IGlmIChudW1Db21tYSA9PSAyICYmIGNvbW1hc1sxXSA8IGkpIHsKLQkJICogIH0gZWxzZSBpZiAobnVtQ29tbWEgPT0gMSAmJiBjb21tYXNbMF0gPCBpICYmIGluc2VydCkgewotCQkgKiAgfSBlbHNlIGlmIChudW1Db21tYSA9PSAxICYmIGNvbW1hc1swXSA8IGkgJiYgISBpbnNlcnQpIHsgfSBlbHNlIGlmCi0JCSAqIChudW1Db21tYSA9PSAwICYmIGluc2VydCAmJiByZWdpb25zW2ldLmdldFR5cGUgPT0KLQkJICogQ1NTUmVnaW9uQ29udGV4dHMuUEFSRU5USEVTSVNfQ0xPU0UpIHsgc291cmNlLmFwcGVuZCgiLCIpOwotCQkgKiBhcHBlbmRTcGFjZUJlZm9yZShub2RlLGF0dHIuZ2V0VmFsdWUoKSxzb3VyY2UpOwotCQkgKiBzb3VyY2UuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7IH0KLQkJICogCi0JCSAqIGlmIChpICE9IDAgJiYgIXNraXBTcGFjZSkKLQkJICogYXBwZW5kU3BhY2VCZWZvcmUobm9kZSxyZWdpb25zW2ldLHNvdXJjZSk7Ci0JCSAqIHNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0pKTsgfSBza2lwU3BhY2UgPQotCQkgKiBmYWxzZTsKLQkJICogCi0JCSAqIGlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PQotCQkgKiBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHNraXBTcGFjZSA9IHRydWU7IH0gfQotCQkgKi8KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlib29sZWFuIHNraXBTcGFjZSA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCAmJiAhc2tpcFNwYWNlKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNraXBTcGFjZSA9IGZhbHNlOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQlza2lwU3BhY2UgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCUlDb3VudGVyIGNvdW50ZXIgPSAoSUNvdW50ZXIpIG5vZGU7Ci0JCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJU3RyaW5nIHNlcGFyYXRvciA9IGNvdW50ZXIuZ2V0U2VwYXJhdG9yKCk7Ci0JCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc2VwYXJhdG9yLCBxdW90ZSk7Ci0JCQlTdHJpbmcgc2VwID0gKHNlcGFyYXRvciA9PSBudWxsIHx8IHNlcGFyYXRvci5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiAocXVvdGUgKyBzZXBhcmF0b3IgKyBxdW90ZSk7Ci0JCQlTdHJpbmcgaWRlbnQgPSBjb3VudGVyLmdldElkZW50aWZpZXIoKTsKLQkJCVN0cmluZyBzdHlsZSA9IGNvdW50ZXIuZ2V0TGlzdFN0eWxlKCk7Ci0JCQlTdHJpbmcgZnVuYyA9IChzZXAgPT0gbnVsbCB8fCBzZXAubGVuZ3RoKCkgPT0gMCkgPyAiY291bnRlcigiIDogImNvdW50ZXJzKCI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCS8vIG5vcm1hbGl6ZQotCQkJaWYgKGlkZW50ID09IG51bGwpCi0JCQkJaWRlbnQgPSAiIjsvLyROT04tTkxTLTEkCi0JCQlpZiAoc3R5bGUgPT0gbnVsbCkKLQkJCQlzdHlsZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpIHsKLQkJCQlpZGVudCA9IGlkZW50LnRvVXBwZXJDYXNlKCk7Ci0JCQkJc3R5bGUgPSBzdHlsZS50b1VwcGVyQ2FzZSgpOwotCQkJCWZ1bmMgPSBmdW5jLnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZGVudCA9IGlkZW50LnRvTG93ZXJDYXNlKCk7Ci0JCQkJc3R5bGUgPSBzdHlsZS50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQkJaWYgKHNlcCA9PSBudWxsIHx8IHNlcC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJc291cmNlLmFwcGVuZChmdW5jKTsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBpZGVudCwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGlkZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvdXJjZS5hcHBlbmQoZnVuYyk7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgaWRlbnQsIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChpZGVudCk7Ci0JCQkJc291cmNlLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzZXAsIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChzZXApOwotCQkJfQotCi0JCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBzdHlsZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJc291cmNlLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzdHlsZSwgc291cmNlKTsKLQkJCX0KLQkJCXNvdXJjZS5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChJQ291bnRlci5JREVOVElGSUVSLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNvdW50ZXIuSURFTlRJRklFUik7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpZiAoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCQlyZXR1cm4gLTE7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGlOb2RlLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKSk7Ci0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQkJZWxzZSBpZiAoSUNvdW50ZXIuTElTVFNUWUxFLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNvdW50ZXIuTElTVFNUWUxFKTsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIDEpKTsKLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SKQotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pCi0JCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQl9Ci0JCWVsc2UgaWYgKElDb3VudGVyLlNFUEFSQVRPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDb3VudGVyLlNFUEFSQVRPUik7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGlOb2RlLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKSk7Ci0JCQlib29sZWFuIGhhc0NvbW1hID0gZmFsc2U7Ci0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUikgewotCQkJCQlpZiAoIWhhc0NvbW1hKQotCQkJCQkJaGFzQ29tbWEgPSB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ291bnRlckZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBDb3VudGVyRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWNsQ29udGFpbmVyRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWNsQ29udGFpbmVyRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YjRlMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVjbENvbnRhaW5lckZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGVjbENvbnRhaW5lckZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JRGVjbENvbnRhaW5lckZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlZFNlbGVjdG9yUmVnaW9uKENvbXBvdW5kUmVnaW9uIHJlZ2lvbiwgQ29tcG91bmRSZWdpb24gcHJldlJlZ2lvbiwgQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kpIHsKLQkJaWYgKGlzRm9ybWF0KCkpCi0JCQlyZXR1cm4gcmVnaW9uLmdldFRleHQoKTsKLQkJCi0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKCFzdGd5LmlzRm9ybWF0U291cmNlKCkpCi0JCQl0ZXh0ID0gcmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCWVsc2UKLQkJCXRleHQgPSByZWdpb24uZ2V0VGV4dCgpOwotCQkKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlzaG9ydCBzZWxDYXNlID0gLTE7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETykgewotCQkJc2VsQ2FzZSA9IHN0Z3kuZ2V0U2VsZWN0b3JUYWdDYXNlKCk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MpIHsKLQkJCXNlbENhc2UgPSBzdGd5LmdldENsYXNzU2VsZWN0b3JDYXNlKCk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQpIHsKLQkJCXNlbENhc2UgPSBzdGd5LmdldElkU2VsZWN0b3JDYXNlKCk7Ci0JCX0KLQotCQlpZiAoc2VsQ2FzZSA9PSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpIHsKLQkJCXJldHVybiB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsQ2FzZSA9PSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpIHsKLQkJCXJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsQ2FzZSA9PSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUykgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQotCQlyZXR1cm4gZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbiwgMCwgc3RneSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQlzb3VyY2UuYXBwZW5kKCJ9Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjI3ODAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciBleHRlbmRzIEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCURlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kU3BhY2VCZXR3ZWVuKElDU1NOb2RlIG5vZGUsIENvbXBvdW5kUmVnaW9uIHByZXYsIENvbXBvdW5kUmVnaW9uIG5leHQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaWYgKGlzQ2xlYW51cCgpICYmICFnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNGb3JtYXRTb3VyY2UoKSkKLQkJCXJldHVybjsgLy8gZm9yIG5vdCBmb3JtYXR0aW5nIGNhc2Ugb24gY2xlYW51cCBhY3Rpb24KLQotCQkvLyBpbiBzZWxlY3RvcgotCQlTdHJpbmcgcHJldlR5cGUgPSBwcmV2LmdldFR5cGUoKTsKLQkJU3RyaW5nIG5leHRUeXBlID0gbmV4dC5nZXRUeXBlKCk7Ci0KLQkJaWYgKHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VUIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19BVEtFWVdPUkQgfHwgcHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbmV4dCwgc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTiAmJiBuZXh0VHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJaWYgKHByZXYuZ2V0RW5kT2Zmc2V0KCkgIT0gbmV4dC5nZXRTdGFydE9mZnNldCgpKSB7IC8vIG5vdAotCQkJCQkJCQkJCQkJCQkJCS8vIHNlcXVlbnRpYWwKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBuZXh0LCBzb3VyY2UpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCB8fCBuZXh0VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCB8fCBuZXh0VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IG5leHRUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOKSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBuZXh0LCBzb3VyY2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKQotCQkJcmV0dXJuIG47Ci0JCXJldHVybiAtMTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9udEZhY2VSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Gb250RmFjZVJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU0NmVlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Gb250RmFjZVJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZvbnRGYWNlUnVsZUZvcm1hdHRlciBleHRlbmRzIERlY2xDb250YWluZXJGb3JtYXR0ZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIEZPTlRfRkFDRSA9ICJAZm9udC1mYWNlIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgRm9udEZhY2VSdWxlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JRm9udEZhY2VSdWxlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIHN0ciA9IEZPTlRfRkFDRTsKLQkJCWlmIChDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBGT05UX0ZBQ0UudG9VcHBlckNhc2UoKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmIChpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCWVsc2UKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRm9udEZhY2VSdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEZvbnRGYWNlUnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9ybWF0UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Gb3JtYXRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwYzlkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Gb3JtYXRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIEZvcm1hdFJlZ2lvbiBpbXBsZW1lbnRzIElSZWdpb24gewotCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCwgZkxlbmd0aDsKLQotCS8qKgotCSAqIAotCSAqLwotCUZvcm1hdFJlZ2lvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldChvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSByZWdpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSByZWdpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0aGlzLmZPZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMuZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldExlbmd0aChpbnQgbmV3TGVuZ3RoKSB7Ci0JCWZMZW5ndGggPSBuZXdMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRPZmZzZXQoaW50IG5ld09mZnNldCkgewotCQlmT2Zmc2V0ID0gbmV3T2Zmc2V0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9GdW5jdGlvbkZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRnVuY3Rpb25Gb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0N2YwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9GdW5jdGlvbkZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgRnVuY3Rpb25Gb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlGdW5jdGlvbkZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJSUNTU05vZGUgcHJldiA9IChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpIDogbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkvLyBnZXQgbWVhbmluZyByZWdpb25zCi0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBudWxsOwotCQkJaWYgKGV4Y2VwdEZvciA9PSBudWxsKQotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWVsc2UgewotCQkJCVN0cmluZyBwaWNrdXBUeXBlID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOwotCQkJCWlmIChwcmV2ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCQkJcGlja3VwVHlwZSA9IG51bGw7Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgcGlja3VwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBleHRyYWN0IHNvdXJjZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJldiAhPSBudWxsICYmIGNoaWxkICE9IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIGJldHdlZW4KLQkJCS8vIHBhcmFtZXRlcnMKLQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZSBub2RlLCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJc291cmNlLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDIsIHN0Z3kpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0KLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJU3RyaW5nIGZ1bmMgPSBnZXRGdW5jKCk7Ci0JCQlpZiAoQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCWZ1bmMgPSBmdW5jLnRvVXBwZXJDYXNlKCk7Ci0JCQlzb3VyY2UuYXBwZW5kKGZ1bmMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEZ1bmMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0ltcG9ydFJ1bGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0ltcG9ydFJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3NTg1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9JbXBvcnRSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgSU1QT1JUID0gIkBpbXBvcnQiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBJbXBvcnRSdWxlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JSW1wb3J0UnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQlpZiAoIUlDU1NJbXBvcnRSdWxlLkhSRUYuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gYnVmOwotCi0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlpZiAoY29udGV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWl0LnByZXYoKTsKLQkJCQlpZiAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwcmV2KTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWl0Lm5leHQoKTsKLQkJCQl9IGVsc2UKLQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJaXQubmV4dCgpOwotCQkJCWl0Lm5leHQoKTsKLQkJCQlpZiAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChuZXh0LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5leHQpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0gZWxzZQotCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCQkJZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIC0gMSk7Ci0JCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgLSAxKTsKLQkJCQl9Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBnZW5lcmF0ZSB0ZXh0Ci0JCWlmIChpbnNlcnQgJiYgYXR0ci5nZXRWYWx1ZSgpICE9IG51bGwgJiYgYXR0ci5nZXRWYWx1ZSgpLmxlbmd0aCgpID4gMCkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgYXR0ci5nZXRWYWx1ZSgpLCBidWYpOwotCQkJYnVmLmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIGJ1Zik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCS8vIGZvciBtZWRpYS10eXBlCi0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQV9TRVBBUkFUT1I7Ci0JCQkJaWYgKHByZXYgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsKQotCQkJCQlwaWNrdXBUeXBlID0gbnVsbDsKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgZXhjZXB0Rm9yLCBwaWNrdXBUeXBlKTsKLQkJCX0KLQkJCS8vIGV4dHJhY3Qgc291cmNlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCS8vIGJlCi0JCQkJLy8gY29tbWVudHMKLQkJCX0KLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQl9IGVsc2UgaWYgKHByZXYgIT0gbnVsbCAmJiBjaGlsZCAhPSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSA6ID8/Pz8KLQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJfSBlbHNlIGlmIChjaGlsZCAhPSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSA6IGJldHdlZW4gJ3VybCgpJyBhbmQKLQkJCS8vIG1lZGlhIHR5cGVzCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0IGJlCi0JCQkvLyBjb21tZW50cwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJZWxzZQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXNvdXJjZS5hcHBlbmQoIjsiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpICYmICFyZWdpb25zW2ldLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0KLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHN0ciA9IHJlZ2lvbnNbaV0uZ2V0VGV4dCgpOwotCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUKQotCQkJCQlzdHIgPSBkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KTsKLQkJCQllbHNlCi0JCQkJCXN0ciA9IGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KTsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJCVN0cmluZyBzdHIgPSBJTVBPUlQ7Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXN0ciA9IElNUE9SVC50b1VwcGVyQ2FzZSgpOwotCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCXN0ciA9ICJ1cmwoIjsvLyROT04tTkxTLTEkCi0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBzdHIudG9VcHBlckNhc2UoKTsKLQkJCVN0cmluZyBocmVmID0gKChJQ1NTSW1wb3J0UnVsZSkgbm9kZSkuZ2V0SHJlZigpOwotCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKGhyZWYsIHF1b3RlKTsKLQkJCXN0ciA9IHN0ciArIHF1b3RlICsgaHJlZiArIHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHN0ciwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJfQotCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiAoY2hpbGQgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QpICYmICgob3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0KSBjaGlsZCkuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBzdHIgPSByZWdpb25zW2ldLmdldFRleHQoKTsKLQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUKQotCQkJCXN0ciA9IGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpOwotCQkJZWxzZQotCQkJCXN0ciA9IGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KTsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoIUlDU1NJbXBvcnRSdWxlLkhSRUYuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDU1NJbXBvcnRSdWxlLkhSRUYpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlGb3JtYXRSZWdpb24gZm9ybWF0UmVnaW9uID0gbnVsbDsKLQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJZm9ybWF0UmVnaW9uID0gbmV3IEZvcm1hdFJlZ2lvbihpTm9kZS5nZXRTdGFydE9mZnNldCgpLCAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIC0gaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCWVsc2UKLQkJCWZvcm1hdFJlZ2lvbiA9IG5ldyBGb3JtYXRSZWdpb24oaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBpTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJQ29tcG91bmRSZWdpb24gcmVnaW9uc1tdID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBmb3JtYXRSZWdpb24sIGdldENsZWFudXBTdHJhdGVneShub2RlKSk7Ci0KLQkJYm9vbGVhbiBhdHJ1bGUgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCkgewotCQkJCWF0cnVsZSA9IHRydWU7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKCFhdHJ1bGUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJcmV0dXJuIHJlZ2lvbnNbaV0uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gKGNoaWxkICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiBpTm9kZS5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IG4gPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAobiA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSkuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpCi0JCQkJcmV0dXJuIG4gLSAxOwotCQkJcmV0dXJuIG47Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEltcG9ydFJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgSW1wb3J0UnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFMaXN0Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYUxpc3RGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0ZWIzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYUxpc3RGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFMaXN0Rm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBNZWRpYUxpc3RGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlNZWRpYUxpc3RGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJYm9vbGVhbiBmaXJzdCA9IGZhbHNlLCBsYXN0ID0gZmFsc2U7Ci0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlpZiAoY29udGV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWl0LnByZXYoKTsKLQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCBwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SIHx8IHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHByZXYpOwotCQkJCQllbHNlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRleHQuc3RhcnQgPCAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJY29udGV4dC5zdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJZmlyc3QgPSB0cnVlOwotCi0JCQkJfQotCQkJCWl0LnJlc2V0KGZsYXROb2RlLCByZWdpb24pOwotCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBuZXh0ID0gaXQubmV4dCgpOwotCQkJCQlpZiAobmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgbmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBX1NFUEFSQVRPUiB8fCBuZXh0LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5leHQpOwotCQkJCQllbHNlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPCBjb250ZXh0LmVuZCkgewotCQkJCQljb250ZXh0LmVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWxhc3QgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbGFzdCA9IHRydWU7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCBwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SIHx8IHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHByZXYpOwotCQkJCQllbHNlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRleHQuc3RhcnQgPCAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJY29udGV4dC5zdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJZmlyc3QgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBnZW5lcmF0ZSB0ZXh0Ci0JCWlmIChpbnNlcnQgJiYgYXR0ci5nZXRWYWx1ZSgpICE9IG51bGwgJiYgYXR0ci5nZXRWYWx1ZSgpLmxlbmd0aCgpID4gMCkgewotCQkJaWYgKCFmaXJzdCkKLQkJCQlidWYuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGF0dHIuZ2V0VmFsdWUoKSwgYnVmKTsKLQkJCWJ1Zi5hcHBlbmQoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCWlmICghbGFzdCkgewotCQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBidWYpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSBpZiAoIWZpcnN0ICYmICFsYXN0KSB7Ci0JCQlidWYuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBidWYpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlNZWRpYUxpc3QgbGlzdCA9IChNZWRpYUxpc3QpIG5vZGU7Ci0JCQlpbnQgbiA9IGxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCVN0cmluZyBtZWRpdW0gPSBsaXN0Lml0ZW0oaSk7Ci0JCQkJaWYgKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQltZWRpdW0gPSBtZWRpdW0udG9VcHBlckNhc2UoKTsKLQkJCQllbHNlCi0JCQkJCW1lZGl1bSA9IG1lZGl1bS50b0xvd2VyQ2FzZSgpOwotCi0JCQkJaWYgKGkgIT0gMCkgewotCQkJCQlzb3VyY2UuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbWVkaXVtLCBzb3VyY2UpOwotCQkJCX0KLQkJCQlzb3VyY2UuYXBwZW5kKG1lZGl1bSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0KLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGlOb2RlLmdldEVuZE9mZnNldCgpIDw9IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJLyoKLQkJICogSVRleHRSZWdpb24gcmVnaW9uc1tdID0KLQkJICogZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLAotCQkgKiBuZXcgRm9ybWF0UmVnaW9uKGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGlOb2RlLmdldEVuZE9mZnNldCgpIC0KLQkJICogaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIDEpKTsgZm9yKGludCBpPXJlZ2lvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOwotCQkgKiBpLS0pIHsgaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLklNUE9SVEFOVF9TWU0pCi0JCSAqIHJldHVybiByZWdpb25zW2ldLmdldFN0YXJ0T2Zmc2V0KCk7IH0KLQkJICovCi0JCXJldHVybiBpTm9kZS5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBNZWRpYUxpc3RGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgTWVkaWFMaXN0Rm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYVJ1bGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL01lZGlhUnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTQ2ODkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL01lZGlhUnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUnVsZUZvcm1hdHRlciBleHRlbmRzIEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBNRURJQSA9ICJAbWVkaWEiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBNZWRpYVJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlNZWRpYVJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBzb3VyY2UgZm9ybWF0dGluZwotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG51bGw7Ci0JCQlpZiAoZXhjZXB0Rm9yID09IG51bGwpCi0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIHBpY2t1cFR5cGUgPSBudWxsOwotCQkJCWlmICgocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgfHwgKHByZXYgPT0gbnVsbCAmJiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSkpIHsKLQkJCQkJcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0U7Ci0JCQkJfQotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIHBpY2t1cFR5cGUpOwotCQkJfQotCQkJLy8gZXh0cmFjdCBzb3VyY2UKLQkJCWlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUgJiYgKChNZWRpYUxpc3QpIGNoaWxkKS5nZXRMZW5ndGgoKSA+IDApIHsgLy8gYmV0d2VlbgotCQkJCS8vICJAbWVkaWEiIGFuZCBtZWRpYXR5cGUKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCS8vIGJlIGNvbW1lbnRzCi0JCQkJfQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJfSBlbHNlIGlmIChjaGlsZCAhPSBudWxsICYmIChjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA9PSBudWxsIHx8IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpKSB7IC8vIGJldHdlZW4KLQkJCQkvLyBtZWRpYXR5cGUgYW5kIHRoZSBmaXJzdCBzdHlsZSBydWxlCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCQkvLyBiZSBjb21tZW50cwotCQkJCX0KLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfSBlbHNlIHsgLy8gYmV0d2VlbiBzdHlsZXMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCS8vIGJlIGNvbW1lbnRzCi0JCQkJfQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIHNvdXJjZSBnZW5lcmF0aW9uCi0JCQlpZiAoY2hpbGQgPT0gbnVsbCAmJiBwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7IC8vIGFmdGVyCi0JCQkJLy8gdGhlIGxhc3Qgc3R5bGUgcnVsZQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBudWxsLCBzb3VyY2UpOwotCQkJfSBlbHNlIGlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUgJiYgKChNZWRpYUxpc3QpIGNoaWxkKS5nZXRMZW5ndGgoKSA+IDApIHsgLy8gYmV0d2VlbgotCQkJCS8vICJAbWVkaWEiIGFuZCBtZWRpYXR5cGUKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCX0gZWxzZSBpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSAmJiAoKE1lZGlhTGlzdCkgcHJldikuZ2V0TGVuZ3RoKCkgPiAwKSB7IC8vIGJldHdlZW4KLQkJCQkvLyBtZWRpYXR5cGUgYW5kIHRoZSBmaXJzdCBzdHlsZSBydWxlCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgInsiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJCQlzb3VyY2UuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAotCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZS5nZXRQYXJlbnROb2RlKCksIG51bGwsIHNvdXJjZSk7Ci0JCQl9IGVsc2UgeyAvLyBub3JtYWwgY2FzZQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpIHsgLy8gYmV0d2VlbgotCQkJLy8gIkBtZWRpYSIgYW5kIG1lZGlhdHlwZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZSBjb21tZW50cwotCQkJfQotCQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2hpbGQgIT0gbnVsbCAmJiAoY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCB8fCBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSkgeyAvLyBiZXR3ZWVuCi0JCQkvLyBtZWRpYXR5cGUgYW5kIHRoZSBmaXJzdCBzdHlsZSBydWxlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCS8vIGJlIGNvbW1lbnRzCi0JCQl9Ci0JCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBiZXR3ZWVuIHN0eWxlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZSBjb21tZW50cwotCQkJfQotCQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIHNvdXJjZSBmb3JtYXR0aW5nCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlpZiAobm9kZS5nZXRMYXN0Q2hpbGQoKSA9PSBudWxsIHx8IG5vZGUuZ2V0TGFzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlib29sZWFuIGJJbkN1cmx5QnJhY2UgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFiSW5DdXJseUJyYWNlKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJZWxzZQotCQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkKLQkJCQkJCWJJbkN1cmx5QnJhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsgLy8gc291cmNlIGdlbmVyYXRpb24KLQkJCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCQlpZiAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmIG5vZGUuZ2V0TGFzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQlzb3VyY2UuYXBwZW5kKCJ9Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgKGNoaWxkIGluc3RhbmNlb2YgTWVkaWFMaXN0KSAmJiAoKE1lZGlhTGlzdCkgY2hpbGQpLmdldExlbmd0aCgpID09IDApIHsKLQkJCWlmIChjaGlsZC5nZXROZXh0U2libGluZygpICE9IG51bGwpCi0JCQkJZW5kID0gKChJbmRleGVkUmVnaW9uKSBjaGlsZC5nZXROZXh0U2libGluZygpKS5nZXRTdGFydE9mZnNldCgpOwotCQkJZWxzZQotCQkJCWVuZCA9IC0xOwotCQl9Ci0JCQotCQlpZiAoZW5kID4gMCkgeyAvLyBzb3VyY2UgZm9ybWF0dGluZwotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gc291cmNlIGdlbmVyYXRpb24KLQkJCVN0cmluZyBzdHIgPSBNRURJQTsKLQkJCWlmIChDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBNRURJQS50b1VwcGVyQ2FzZSgpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQl9Ci0KLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgKGNoaWxkIGluc3RhbmNlb2YgTWVkaWFMaXN0KSAmJiAoKE1lZGlhTGlzdCkgY2hpbGQpLmdldExlbmd0aCgpID4gMCkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBNZWRpYVJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgTWVkaWFSdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPD0gMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zIC0gMSkpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAobm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0TmV4dFNpYmxpbmcoKSA9PSBub2RlLmdldExhc3RDaGlsZCgpKSB7IC8vIGluc2VydGVkCi0JCQkvLyBmaXJzdCBzdHlsZSBydWxlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJcmV0dXJuIDA7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJcmVnaW9uID0gaXQubmV4dCgpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChubm9kZS5nZXRFbmRPZmZzZXQoKSA8PSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpbnQgcG9zID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSAtIGluc2VydFBvczsKLQkJCXJldHVybiAocG9zID49IDApID8gcG9zIDogMDsKLQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIobm9kZSwgaW5zZXJ0UG9zKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSW5kZXhlZFJlZ2lvbiBubm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaW5zZXJ0UG9zIDw9IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcyAtIDEpKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5leHRTaWJsaW5nKCkgPT0gbm9kZS5nZXRMYXN0Q2hpbGQoKSkgeyAvLyBpbnNlcnRlZAotCQkJLy8gZmlyc3Qgc3R5bGUgcnVsZQotCQkJaW50IHBvcyA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKHBvcyA8PSAwKQotCQkJCXBvcyA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSArIDYgLyoKLQkJCQkJCQkJCQkJCQkJCQkJICogbGVuZ3RoCi0JCQkJCQkJCQkJCQkJCQkJCSAqIG9mCi0JCQkJCQkJCQkJCQkJCQkJCSAqICJAbWVkaWEiCi0JCQkJCQkJCQkJCQkJCQkJCSAqLzsKLQkJCXJldHVybiBpbnNlcnRQb3MgLSBwb3M7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUobm9kZSwgaW5zZXJ0UG9zKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9QYWdlUnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUGFnZVJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmExZjdhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9QYWdlUnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUGFnZVJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBEZWNsQ29udGFpbmVyRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBQQUdFID0gIkBwYWdlIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgUGFnZVJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlQYWdlUnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQlpZiAoIUlDU1NQYWdlUnVsZS5TRUxFQ1RPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBidWY7Ci0KLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCWlmIChjb250ZXh0ICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWl0Lm5leHQoKTsKLQkJCQlpZiAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChuZXh0LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5leHQpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgcG9zID0gZ2V0QXR0ckluc2VydFBvcyhub2RlLCBhdHRyLmdldE5hbWUoKSk7Ci0JCQkJY29udGV4dC5zdGFydCA9IHBvczsKLQkJCQljb250ZXh0LmVuZCA9IHBvczsKLQkJCQkvKgotCQkJCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPQotCQkJCSAqIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0Tm9kZUF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbilub2RlKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkgKiBJVGV4dFJlZ2lvbiByZWdpb24gPQotCQkJCSAqIGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbilub2RlKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkgKiBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5TKSB7Ci0JCQkJICogY29udGV4dC5zdGFydCA9IHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOyBjb250ZXh0LmVuZCA9Ci0JCQkJICogcmVnaW9uLmdldEVuZE9mZnNldCgpOyB9IGVsc2UgeyBjb250ZXh0LnN0YXJ0ID0KLQkJCQkgKiBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKSArIDE7IGNvbnRleHQuZW5kID0KLQkJCQkgKiBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsgfQotCQkJCSAqL30KLQkJfQotCQkvLyBnZW5lcmF0ZSB0ZXh0Ci0JCWlmIChpbnNlcnQpIHsKLQkJCVN0cmluZyB2YWwgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsICE9IG51bGwgJiYgdmFsLmxlbmd0aCgpID4gMCkgewotCQkJCWJ1Zi5hcHBlbmQodmFsKTsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgYnVmKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZXR3ZWVuKG5vZGUsIHJlZ2lvbnNbaSAtIDFdLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCVN0cmluZyBzdHIgPSBQQUdFOwotCQkJaWYgKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXN0ciA9IFBBR0UudG9VcHBlckNhc2UoKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCXN0ciA9ICgoSUNTU1BhZ2VSdWxlKSBub2RlKS5nZXRTZWxlY3RvclRleHQoKTsKLQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc3RyLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCX0KLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCAoaSA9PSAwKSA/IG91dHNpZGVbMF0gOiByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKGlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJZWxzZQotCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW3JlZ2lvbnMubGVuZ3RoIC0gMV0sIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmICghSUNTU1BhZ2VSdWxlLlNFTEVDVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJZWxzZSBpZiAoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJcmVnaW9uID0gaXQubmV4dCgpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWlmIChpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKSA+PSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFBhZ2VSdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFBhZ2VSdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9QcmltaXRpdmVWYWx1ZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxNWM5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9QcmltaXRpdmVWYWx1ZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVWYWx1ZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlib29sZWFuIGFwcGVuZFF1b3RlID0gcmVnaW9ucy5sZW5ndGggPiAxICYmIG5vZGUuZ2V0UGFyZW50Tm9kZSgpIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0gJiYgaXNDbGVhbnVwKCkgJiYgZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzUXVvdGVWYWx1ZXMoKSAmJiAoKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZS5nZXRQYXJlbnROb2RlKCkpLmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpIHx8ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGUuZ2V0UGFyZW50Tm9kZSgpKS5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSkgfHwgKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZS5nZXRQYXJlbnROb2RlKCkpLmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX1ZPSUNFX0ZBTUlMWSkpOwotCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gc2tpcFNwYWNlID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwICYmICFza2lwU3BhY2UpCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHN0ckJ1Zik7Ci0JCQkJc2tpcFNwYWNlID0gZmFsc2U7Ci0JCQkJc3RyQnVmLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pCi0JCQkJCXNraXBTcGFjZSA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChhcHBlbmRRdW90ZSkgewotCQkJCXNvdXJjZS5hcHBlbmQocXVvdGUpOwotCQkJCVN0cmluZyBzdHIgPSBzdHJCdWYudG9TdHJpbmcoKTsKLQkJCQlzdHIgPSBzdHIucmVwbGFjZSgnXCcnLCAnICcpOwotCQkJCXN0ciA9IHN0ci5yZXBsYWNlKCdcIicsICcgJyk7Ci0JCQkJc3RyID0gc3RyLnRyaW0oKTsKLQkJCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQkJc291cmNlLmFwcGVuZChxdW90ZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzb3VyY2UuYXBwZW5kKHN0ckJ1Zik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlID0gKElDU1NQcmltaXRpdmVWYWx1ZSkgbm9kZTsKLQkJCXNob3J0IHR5cGUgPSB2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCk7Ci0JCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCi0JCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEVSQ0VOVEFHRSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU0gOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFogOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRElNRU5TSU9OIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUiA6Ci0JCQkJCWlmICh2YWx1ZS5nZXRGbG9hdFZhbHVlKHR5cGUpID09ICgoaW50KSB2YWx1ZS5nZXRGbG9hdFZhbHVlKHR5cGUpKSkgewotCQkJCQkJc3RyID0gSW50ZWdlci50b1N0cmluZygoaW50KSB2YWx1ZS5nZXRGbG9hdFZhbHVlKHR5cGUpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXN0ciA9IEZsb2F0LnRvU3RyaW5nKHZhbHVlLmdldEZsb2F0VmFsdWUodHlwZSkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOSEVSSVRfUFJJTUlUSVZFIDoKLQkJCQkJc3RyID0gdmFsdWUuZ2V0U3RyaW5nVmFsdWUoKTsKLQkJCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJCQlzdHIgPSBzdHIudG9VcHBlckNhc2UoKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlzdHIudG9Mb3dlckNhc2UoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TVFJJTkcgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSSSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQVRUUiA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSQU5HRSA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0ZPUk1BVCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0xPQ0FMIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09NTUEgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19TTEFTSCA6Ci0JCQkJCXN0ciA9IHZhbHVlLmdldFN0cmluZ1ZhbHVlKCk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBwcmVTdHIgPSBudWxsLCBwb3N0U3RyID0gbnVsbDsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0FUVFIgOgotCQkJCQlwcmVTdHIgPSAiYXR0cigiOy8vJE5PTi1OTFMtMSQKLQkJCQkJcG9zdFN0ciA9ICIpIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NNIDoKLQkJCQkJcG9zdFN0ciA9ICJjbSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQkvLyBjYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09VTlRFUjoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ERUcgOgotCQkJCQlwb3N0U3RyID0gImRlZyI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FTVMgOgotCQkJCQlwb3N0U3RyID0gImVtIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUyA6Ci0JCQkJCXBvc3RTdHIgPSAiZXgiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfR1JBRCA6Ci0JCQkJCXBvc3RTdHIgPSAiZ3JhZCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19IWiA6Ci0JCQkJCXBvc3RTdHIgPSAiSHoiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU4gOgotCQkJCQlwb3N0U3RyID0gImluIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWiA6Ci0JCQkJCXBvc3RTdHIgPSAia0h6IjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01NIDoKLQkJCQkJcG9zdFN0ciA9ICJtbSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUyA6Ci0JCQkJCXBvc3RTdHIgPSAibXMiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEMgOgotCQkJCQlwb3N0U3RyID0gInBjIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BFUkNFTlRBR0UgOgotCQkJCQlwb3N0U3RyID0gIiUiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFQgOgotCQkJCQlwb3N0U3RyID0gInB0IjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYIDoKLQkJCQkJcG9zdFN0ciA9ICJweCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SQUQgOgotCQkJCQlwb3N0U3RyID0gInJhZCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQkvLyBjYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkVDVDoKLQkJCQkvLyBjYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkdCQ09MT1I6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUyA6Ci0JCQkJCXBvc3RTdHIgPSAicyI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TVFJJTkcgOgotCQkJCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc3RyLCBxdW90ZSk7Ci0JCQkJCXByZVN0ciA9IHF1b3RlOwotCQkJCQlwb3N0U3RyID0gcXVvdGU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSSSA6Ci0JCQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShzdHIsIHF1b3RlKTsKLQkJCQkJcHJlU3RyID0gInVybCgiICsgcXVvdGU7Ly8kTk9OLU5MUy0xJAotCQkJCQlwb3N0U3RyID0gcXVvdGUgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQkvLyB0aGUgZm9sbG93aW5ncyBhcmUgb3JpZ2luYWwgcHJpbWl0aXZlIHZhbHVlcwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VTktOT1dOIDoKLQkJCQkvLyB1c2Ugc3RyCi0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOVEVHRVIgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19IQVNIIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU0xBU0ggOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT01NQSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRElNRU5TSU9OIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVIgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTkhFUklUX1BSSU1JVElWRSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkFOR0UgOgotCQkJCQlwcmVTdHIgPSAiVSsiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0ZPUk1BVCA6Ci0JCQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShzdHIsIHF1b3RlKTsKLQkJCQkJcHJlU3RyID0gImZvcm1hdCgiICsgcXVvdGU7Ly8kTk9OLU5MUy0xJAotCQkJCQlwb3N0U3RyID0gcXVvdGUgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTE9DQUwgOgotCQkJCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc3RyLCBxdW90ZSk7Ci0JCQkJCXByZVN0ciA9ICJsb2NhbCgiICsgcXVvdGU7Ly8kTk9OLU5MUy0xJAotCQkJCQlwb3N0U3RyID0gcXVvdGUgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKSB7Ci0JCQkJaWYgKHByZVN0ciAhPSBudWxsKQotCQkJCQlwcmVTdHIgPSBwcmVTdHIudG9VcHBlckNhc2UoKTsKLQkJCQlpZiAocG9zdFN0ciAhPSBudWxsKQotCQkJCQlwb3N0U3RyID0gcG9zdFN0ci50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQkJaWYgKHByZVN0ciAhPSBudWxsKQotCQkJCXNvdXJjZS5hcHBlbmQocHJlU3RyKTsKLQkJCWlmIChzdHIgIT0gbnVsbCkKLQkJCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQlpZiAocG9zdFN0ciAhPSBudWxsKQotCQkJCXNvdXJjZS5hcHBlbmQocG9zdFN0cik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JHQkZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUkdCRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OTA5ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUkdCRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUkdCRm9ybWF0dGVyIGV4dGVuZHMgRnVuY3Rpb25Gb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUkdCRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JUkdCRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVuYygpIHsKLQkJcmV0dXJuICJyZ2IoIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgUkdCRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFJHQkZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JlY3RGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JlY3RGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNlYzgzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9SZWN0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVjdEZvcm1hdHRlciBleHRlbmRzIEZ1bmN0aW9uRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlY3RGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlSZWN0Rm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVuYygpIHsKLQkJcmV0dXJuICJyZWN0KCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFJlY3RGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgUmVjdEZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY3YzZmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xJdGVtRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHlsZURlY2xJdGVtRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRBZnRlckNvbG9uU3BhY2UoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWludCBuID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUE9TVF9ERUxJTSk7Ci0KLQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpID4gMCAmJiAoIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSkgewotCQkJaW50IGxlbmd0aCA9IGdldExhc3RMaW5lTGVuZ3RoKG5vZGUsIHNvdXJjZSk7Ci0JCQlpbnQgYXBwZW5kID0gZ2V0Rmlyc3RDaGlsZFJlZ2lvbkxlbmd0aChub2RlKTsKLQkJCWlmIChsZW5ndGggKyBuICsgYXBwZW5kID4gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCQluID0gMDsgLy8gbm8gc3BhY2UgaXMgbmVjZXNzYXJ5Ci0JCQl9Ci0JCX0KLQkJLy8gbm8gZGVsaW1pdGVyIGNhc2UKLQkJd2hpbGUgKG4tLSA+IDApCi0JCQlzb3VyY2UuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgaW50IGdldEZpcnN0Q2hpbGRSZWdpb25MZW5ndGgoSUNTU05vZGUgbm9kZSkgewotCQlJQ1NTTm9kZSBmaXJzdENoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChmaXJzdENoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gMTsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBmaXJzdENoaWxkKS5nZXRTdGFydE9mZnNldCgpOwotCQlSZWdpb25JdGVyYXRvciBpdHIgPSBuZXcgUmVnaW9uSXRlcmF0b3Iobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgc3RhcnQpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnID0gaXRyLm5leHQoKTsKLQkJCWlmIChyZWcgIT0gbnVsbCAmJiByZWcuZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCXJldHVybiByZWcuZ2V0VGV4dExlbmd0aCgpOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gYnVmOwotCi0JCWlmICghSUNTU1N0eWxlRGVjbEl0ZW0uSU1QT1JUQU5ULmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJaWYgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHJldik7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0gZWxzZQotCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0ICYmIGF0dHIuZ2V0VmFsdWUoKSAhPSBudWxsICYmIGF0dHIuZ2V0VmFsdWUoKS5sZW5ndGgoKSA+IDApIHsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGF0dHIuZ2V0VmFsdWUoKSwgYnVmKTsKLQkJCWJ1Zi5hcHBlbmQoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVmOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCQlJQ1NTTm9kZSBwcmV2ID0gKGNoaWxkICE9IG51bGwpID8gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgOiBub2RlLmdldExhc3RDaGlsZCgpOwotCQlpbnQgc3RhcnQgPSAocHJldiAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgcHJldikuZ2V0RW5kT2Zmc2V0KCkgOiAwOwotCQlpbnQgZW5kID0gKGNoaWxkICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA6IDA7Ci0JCWlmIChzdGFydCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkvLyBnZXQgbWVhbmluZyByZWdpb25zCi0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBudWxsOwotCQkJaWYgKGV4Y2VwdEZvciA9PSBudWxsKQotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWVsc2UgewotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIG51bGwpOwotCQkJfQotCQkJLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDIsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCS8vIGJlCi0JCQkJLy8gY29tbWVudHMKLQkJCX0KLQkJfQotCQlpZihjaGlsZCAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGFwcGVuZCA9IHRydWU7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCQlpZiAoKChJQ1NTUHJpbWl0aXZlVmFsdWUpIGNoaWxkKS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT01NQSkKLQkJCQkJdG9BcHBlbmQgPSAiLCI7Ly8kTk9OLU5MUy0xJAotCQkJCWVsc2UgaWYgKCgoSUNTU1ByaW1pdGl2ZVZhbHVlKSBjaGlsZCkuZ2V0UHJpbWl0aXZlVHlwZSgpID09IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU0xBU0gpCi0JCQkJCXRvQXBwZW5kID0gIi8iOy8vJE5PTi1OTFMtMSQKLQkJCQlJQ1NTTm9kZSBwcmV2U2libGluZyA9IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCWlmIChwcmV2U2libGluZyBpbnN0YW5jZW9mIElDU1NQcmltaXRpdmVWYWx1ZSAmJiAoKElDU1NQcmltaXRpdmVWYWx1ZSlwcmV2U2libGluZykuZ2V0UHJpbWl0aXZlVHlwZSgpID09IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU0xBU0gpCi0JCQkJCWFwcGVuZCA9IGZhbHNlOwotCQkJfQotCQkJaWYgKHRvQXBwZW5kICE9IG51bGwgJiYgIXRvQXBwZW5kLmVxdWFscygiLCIpICYmICF0b0FwcGVuZC5lcXVhbHMoIi8iKSAmJiBhcHBlbmQpIHsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOyAvLyBtdXN0IGJlCi0JCQkvLyBjb21tZW50cwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJaWYgKHRvQXBwZW5kICE9ICIsIiAmJiB0b0FwcGVuZCAhPSAiLyIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQkvLyBhcHBlbmQgIiFpbXBvcnRhbnQiCi0JCQlTdHJpbmcgcHJpb3JpdHkgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlKS5nZXRQcmlvcml0eSgpOwotCQkJaWYgKHByaW9yaXR5ICE9IG51bGwgJiYgcHJpb3JpdHkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcHJpb3JpdHksIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChwcmlvcml0eSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BOYW1lUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gZ2VuZXJhdG9lIHNvdXJjZQotCQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSA9IChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZTsKLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJc291cmNlLmFwcGVuZChpdGVtLmdldFByb3BlcnR5TmFtZSgpLnRvVXBwZXJDYXNlKCkpOwotCQkJZWxzZQotCQkJCXNvdXJjZS5hcHBlbmQoaXRlbS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0KLQkJCWludCBrID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUFJFX0RFTElNKTsKLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSA+IDAgJiYgKCFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCQlpbnQgbGVuZ3RoID0gZ2V0TGFzdExpbmVMZW5ndGgobm9kZSwgc291cmNlKTsKLQkJCQlpbnQgYXBwZW5kID0gMTsKLQkJCQlpZiAobGVuZ3RoICsgayArIGFwcGVuZCA+IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKSB7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJCWsgPSAwOyAvLyBubyBzcGFjZSBpcyBuZWNlc3NhcnkKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBubyBkZWxpbWl0ZXIgY2FzZQotCQkJd2hpbGUgKGstLSA+IDApCi0JCQkJc291cmNlLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCXNvdXJjZS5hcHBlbmQoIjoiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKCFpc0NsZWFudXAoKSB8fCBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNGb3JtYXRTb3VyY2UoKSkgewotCQkJYXBwZW5kQWZ0ZXJDb2xvblNwYWNlKG5vZGUsIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcE5hbWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKGlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSAmJiAoIWlzQ2xlYW51cCgpIHx8IGdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKSkgewotCQkJCWFwcGVuZEFmdGVyQ29sb25TcGFjZShub2RlLCBzb3VyY2UpOwotCQkJfSBlbHNlCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0VmFsdWUoSUNTU05vZGUgbm9kZSkgewotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3JtYXRDaGlsZHJlbihub2RlLCBzb3VyY2UpOwotCi0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoIUlDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVC5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkKLQkJCXJldHVybiAtMTsKLQotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNTU1N0eWxlRGVjbEl0ZW0uSU1QT1JUQU5UKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGlOb2RlLmdldEVuZE9mZnNldCgpIDw9IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJQ29tcG91bmRSZWdpb24gcmVnaW9uc1tdID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBuZXcgRm9ybWF0UmVnaW9uKGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGlOb2RlLmdldEVuZE9mZnNldCgpIC0gaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSksIGdldENsZWFudXBTdHJhdGVneShub2RlKSk7Ci0JCWZvciAoaW50IGkgPSByZWdpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCkKLQkJCQlyZXR1cm4gcmVnaW9uc1tpXS5nZXRTdGFydE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiBpTm9kZS5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IG4gPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAobiA8IDApIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsICYmIGZsYXROb2RlLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQluIC09IGZsYXROb2RlLmdldExlbmd0aCgpOwotCQl9Ci0JCWlmIChuID4gMCkgewotCQkJU3RyaW5nIGltcG9ydGFudCA9ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGUpLmdldFByaW9yaXR5KCk7Ci0JCQlpZiAoaW1wb3J0YW50ICE9IG51bGwgJiYgaW1wb3J0YW50Lmxlbmd0aCgpID4gMCkgewotCQkJCS8vIGZpbmQgYmVmb3JlICIhaW1wb3J0YW50IiBwb3NpdGlvbgotCQkJCWZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKSk7Ci0JCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJCWlmIChpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBmbGF0Tm9kZSkKLQkJCQkJCWJyZWFrOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UKQotCQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJLy8gc2tpcCBsYXN0IHNwYWNlCi0JCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJbiAtPSByZWdpb24uZ2V0TGVuZ3RoKCkgLSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJfQotCi0JCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgU3R5bGVEZWNsSXRlbUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBTdHlsZURlY2xJdGVtRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQlpZiAoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGluZGVudENoYXJQcmVmKSkgewotCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJfQotCQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRlbnQudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YzkyODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJQ1NTTm9kZSBwcmV2ID0gKGNoaWxkICE9IG51bGwpID8gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgOiBub2RlLmdldExhc3RDaGlsZCgpOwotCQlpbnQgc3RhcnQgPSAocHJldiAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgcHJldikuZ2V0RW5kT2Zmc2V0KCkgOiAwOwotCQlpbnQgZW5kID0gKGNoaWxkICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA6IDA7Ci0KLQkJLy8gY2hlY2sgbm8gY2hpbGQKLQkJaWYgKGNoaWxkID09IG51bGwgJiYgcHJldiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChzdGFydCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSUNTU01vZGVsIGNzc01vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCS8vIEJVRzIwMjYxNSAtIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBzdHlsZSBkZWNsYXJhdGlvbiB3aXRoIG5vCi0JCQkvLyBtb2RlbCBhc3NvY2lhdGVkIHdpdGggaXQKLQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjc3NNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBudWxsOwotCQkJCQlpZiAoZXhjZXB0Rm9yID09IG51bGwpCi0JCQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQkJCWVsc2UgewotCQkJCQkJU3RyaW5nIHBpY2t1cFR5cGUgPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSOwotCQkJCQkJaWYgKHByZXYgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsKQotCQkJCQkJCXBpY2t1cFR5cGUgPSBudWxsOwotCQkJCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgcGlja3VwVHlwZSk7Ci0JCQkJCX0KLQkJCQkJLy8gZXh0cmFjdCBzb3VyY2UKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCQkvLyBiZSBjb21tZW50cwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHByZXYgIT0gbnVsbCAmJiBjaGlsZCAhPSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSA6Ci0JCQkvLyBiZXR3ZWVuIHR3byBkZWNsYXJhdGlvbnMKLQkJCS8vIEJVRzkzMDM3LXByb3BlcnRpZXMgdmlldyBhZGRzIGV4dHJhIDsgd2hlbiBhZGQgbmV3IHByb3BlcnR5Ci0JCQlib29sZWFuIHNlbWljb2xvbkZvdW5kID0gZmFsc2U7Ci0KLQkJCUlDU1NNb2RlbCBjc3NNb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQkvLyBCVUcyMDI2MTUgLSBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3R5bGUgZGVjbGFyYXRpb24gd2l0aCBubwotCQkJLy8gbW9kZWwgYXNzb2NpYXRlZCB3aXRoIGl0Ci0JCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3NzTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCWludCBwcmV2U3RhcnQgPSAocHJldiAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgcHJldikuZ2V0U3RhcnRPZmZzZXQoKSA6IDA7Ci0JCQkJCWludCBwcmV2RW5kID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24ocHJldlN0YXJ0LCBwcmV2RW5kIC0gcHJldlN0YXJ0KSwgc3RneSk7Ci0JCQkJCWludCBpID0gcmVnaW9ucy5sZW5ndGggLSAxOwotCQkJCQl3aGlsZSAoaSA+PSAwICYmICFzZW1pY29sb25Gb3VuZCkgewotCQkJCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpCi0JCQkJCQkJc2VtaWNvbG9uRm91bmQgPSB0cnVlOwotCQkJCQkJLS1pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFzZW1pY29sb25Gb3VuZCkKLQkJCQlzb3VyY2UuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHByZXYgPT0gbnVsbCkgeyAvLyBnZW5lcmF0ZSBzb3VyY2UgOiBiZWZvcmUgdGhlIGZpcnN0Ci0JCQkvLyBkZWNsYXJhdGlvbgotCQkJb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3IgaXQgPSBudWxsOwotCQkJaWYgKGVuZCA+IDApIHsKLQkJCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCS8vIEJVRzIwMjYxNSAtIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBzdHlsZSBkZWNsYXJhdGlvbiB3aXRoCi0JCQkJLy8gbm8gbW9kZWwgYXNzb2NpYXRlZCB3aXRoIGl0Ci0JCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjc3NNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQlpdCA9IG5ldyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVuZCAtIDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbnQgcG9zID0gZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQkJCUlDU1NNb2RlbCBjc3NNb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQkJCS8vIEJVRzIwMjYxNSAtIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBzdHlsZSBkZWNsYXJhdGlvbgotCQkJCQkvLyB3aXRoIG5vIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCBpdAotCQkJCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjc3NNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCWl0ID0gbmV3IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgcG9zIC0gMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXQgIT0gbnVsbCkgewotCQkJCWludCBsaW1pdCA9ICgoSW5kZXhlZFJlZ2lvbikgKChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSA/IG5vZGUuZ2V0UGFyZW50Tm9kZSgpIDogbm9kZSkpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBjdXJSZWcgPSBpdC5wcmV2KCk7Ci0JCQkJCWlmIChjdXJSZWcuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgY3VyUmVnLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWlmIChjdXJSZWcuZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIGN1clJlZy5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCXNvdXJjZS5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAoaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoY3VyUmVnKSA8PSBsaW1pdCkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChjaGlsZCA9PSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSA6IGFmdGVyIHRoZSBsYXN0Ci0JCQkvLyBkZWNsYXJhdGlvbgotCQkJb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3IgaXQgPSBudWxsOwotCQkJaWYgKHN0YXJ0ID4gMCkgewotCQkJCUlDU1NNb2RlbCBjc3NNb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQkJLy8gQlVHMjAyNjE1IC0gaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHN0eWxlIGRlY2xhcmF0aW9uIHdpdGgKLQkJCQkvLyBubyBtb2RlbCBhc3NvY2lhdGVkIHdpdGggaXQKLQkJCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNzc01vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJCWl0ID0gbmV3IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbnQgcG9zID0gZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQkJCUlDU1NNb2RlbCBjc3NNb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQkJCS8vIEJVRzIwMjYxNSAtIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBzdHlsZSBkZWNsYXJhdGlvbgotCQkJCQkvLyB3aXRoIG5vIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCBpdAotCQkJCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjc3NNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCWl0ID0gbmV3IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgcG9zKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChpdCAhPSBudWxsKSB7Ci0JCQkJaW50IGxpbWl0ID0gKChJbmRleGVkUmVnaW9uKSAoKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpID8gbm9kZS5nZXRQYXJlbnROb2RlKCkgOiBub2RlKSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBjdXJSZWcgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChjdXJSZWcuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgY3VyUmVnLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWlmIChjdXJSZWcuZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIGN1clJlZy5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCS8vIEJ1ZyAyMTkwMDQgLSBCZWZvcmUgYXBwZW5kaW5nIGEgOywgbWFrZSBzdXJlIHRoYXQgdGhlcmUKLQkJCQkJCS8vIGlzbid0IG9uZSBhbHJlYWR5Ci0JCQkJCQlib29sZWFuIHNlbWljb2xvbkZvdW5kID0gZmFsc2U7Ci0JCQkJCQl3aGlsZShpdC5oYXNOZXh0KCkgJiYgIXNlbWljb2xvbkZvdW5kKSB7Ci0JCQkJCQkJaWYoaXQubmV4dCgpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKQotCQkJCQkJCQlzZW1pY29sb25Gb3VuZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmKCFzZW1pY29sb25Gb3VuZCkKLQkJCQkJCQlzb3VyY2UuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKGxpbWl0IDw9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChjdXJSZWcpKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA8PSAwKSB7Ci0JCQkJLy8gZ2V0IG5leHQgcmVnaW9uCi0JCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCUNvbXBvdW5kUmVnaW9uIHRvQXBwZW5kUmVnaW9uID0gbnVsbDsKLQkJCQlpZiAocG9zID49IDApIHsKLQkJCQkJSUNTU01vZGVsIGNzc01vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCQkJLy8gQlVHMjAyNjE1IC0gaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHN0eWxlIGRlY2xhcmF0aW9uCi0JCQkJCS8vIHdpdGggbm8gbW9kZWwgYXNzb2NpYXRlZCB3aXRoIGl0Ci0JCQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNzc01vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3MpOwotCQkJCQkJCXRvQXBwZW5kUmVnaW9uID0gbmV3IENvbXBvdW5kUmVnaW9uKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3MpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLmdldFBhcmVudE5vZGUoKSwgdG9BcHBlbmRSZWdpb24sIHNvdXJjZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKHByZXYgIT0gbnVsbCB8fCAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIDw9IDApKSB7Ci0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfT05FX1BFUl9MSU5FKSAmJiAobm9kZS5nZXRPd25lckRvY3VtZW50KCkgIT0gbm9kZSB8fCAhcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikpKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQllbHNlIGlmIChwcmV2ICE9IG51bGwgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkgIT0gbm9kZSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkvLyBCVUcyMDI2MTUgLSBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3R5bGUgZGVjbGFyYXRpb24KLQkJLy8gd2l0aCBubyBtb2RlbCBhc3NvY2lhdGVkIHdpdGggaXQKLQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3NzTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29tbWVudHMKLQkJCQl9Ci0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJCQlpZiAoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgJiYgcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSkgJiYgKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpICE9IG5vZGUgfHwgIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpKSkgewotCQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWludCBwb3MgPSBzdXBlci5nZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKHBvcyA8IDApIHsKLQkJCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBnZXRQYXJlbnRGb3JtYXR0ZXIobm9kZSk7Ci0JCQlyZXR1cm4gKGZvcm1hdHRlciAhPSBudWxsKSA/IGZvcm1hdHRlci5nZXRDaGlsZEluc2VydFBvcyhub2RlLmdldFBhcmVudE5vZGUoKSkgOiAtMTsKLQkJfQotCQlyZXR1cm4gcG9zOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSW5kZXhlZFJlZ2lvbiBubm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaW5zZXJ0UG9zIDwgMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zKSkgewotCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwgJiYgbm5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkgewotCQkJCUNTU1NvdXJjZUdlbmVyYXRvciBwbnRGb3JtYXR0ZXIgPSBnZXRQYXJlbnRGb3JtYXR0ZXIobm9kZSk7Ci0JCQkJaWYgKHBudEZvcm1hdHRlciAhPSBudWxsKQotCQkJCQlyZXR1cm4gcG50Rm9ybWF0dGVyLmdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihub2RlLmdldFBhcmVudE5vZGUoKSwgaW5zZXJ0UG9zKTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIobm9kZSwgaW5zZXJ0UG9zKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSW5kZXhlZFJlZ2lvbiBubm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaW5zZXJ0UG9zIDw9IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcyAtIDEpKSB7Ci0JCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCAmJiBubm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKSB7Ci0JCQkJQ1NTU291cmNlR2VuZXJhdG9yIHBudEZvcm1hdHRlciA9IGdldFBhcmVudEZvcm1hdHRlcihub2RlKTsKLQkJCQlpZiAocG50Rm9ybWF0dGVyICE9IG51bGwpCi0JCQkJCXJldHVybiBwbnRGb3JtYXR0ZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShub2RlLmdldFBhcmVudE5vZGUoKSwgaW5zZXJ0UG9zKTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKG5vZGUsIGluc2VydFBvcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlUnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYTk4YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVSdWxlRm9ybWF0dGVyIGV4dGVuZHMgRGVjbENvbnRhaW5lckZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHlsZVJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHlsZVJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJaWYgKCFJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaXQubmV4dCgpOwotCQkJCWlmIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKG5leHQuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmV4dCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0KSB7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgYnVmKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFNlbGVjdG9yUmVnaW9uKHJlZ2lvbnNbaV0sIChpICE9IDApID8gcmVnaW9uc1tpIC0gMV0gOiBudWxsLCBzdGd5KSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJU3RyaW5nIHN0ciA9ICgoSUNTU1N0eWxlUnVsZSkgbm9kZSkuZ2V0U2VsZWN0b3JUZXh0KCk7Ci0JCQkvLyBhcHBlbmRTcGFjZUJlZm9yZShub2RlLHN0cixzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgInsiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJCXNvdXJjZS5hcHBlbmQoInsiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZXR3ZWVuKG5vZGUsIChpID09IDApID8gb3V0c2lkZVswXSA6IHJlZ2lvbnNbaSAtIDFdLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRTZWxlY3RvclJlZ2lvbihyZWdpb25zW2ldLCAoaSAhPSAwKSA/IHJlZ2lvbnNbaSAtIDFdIDogbnVsbCwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKGlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJZWxzZQotCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW3JlZ2lvbnMubGVuZ3RoIC0gMV0sIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmICghSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkKLQkJCXJldHVybiAtMTsKLQotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUik7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQllbHNlCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlUnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBTdHlsZVJ1bGVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlU2hlZXRGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlU2hlZXRGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiOTVjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVNoZWV0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlU2hlZXRGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHlsZVNoZWV0Rm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JU3R5bGVTaGVldEZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJSUNTU05vZGUgcHJldiA9IChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpIDogbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKHByZXYgPT0gbnVsbCAmJiBjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgc3RhcnQgPSAocHJldiAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgcHJldikuZ2V0RW5kT2Zmc2V0KCkgOiAwOwotCQlpbnQgZW5kID0gKGNoaWxkICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA6IDA7Ci0JCWlmIChzdGFydCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkvLyBnZXQgbWVhbmluZyByZWdpb25zCi0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBudWxsOwotCQkJaWYgKGV4Y2VwdEZvciA9PSBudWxsKQotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWVsc2UgewotCQkJCVN0cmluZyBwaWNrdXBUeXBlID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUjsKLQkJCQlpZiAocHJldiA9PSBudWxsKQotCQkJCQlwaWNrdXBUeXBlID0gbnVsbDsKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgZXhjZXB0Rm9yLCBwaWNrdXBUeXBlKTsKLQkJCX0KLQkJCS8vIGdlbmVyYXRlIHNvdXJjZQotCQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJCWlmIChyZWdpb25zLmxlbmd0aCA+IDAgJiYgIXJlZ2lvbnNbMF0uZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkpCi0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbMF0sIHNvdXJjZSk7Ci0JCQkJZWxzZSBpZiAocmVnaW9ucy5sZW5ndGggPT0gMCkgewotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29tbWVudHMKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9yCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBzZW1pX2NvbG9uCi0JCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpIHsKLQkJCQkJLy8gYXBwZW5kIGRlbGltIGFmdGVyCi0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHByZXYgIT0gbnVsbCkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQl9Ci0JCWVsc2UgaWYgKHByZXYgIT0gbnVsbCAmJiBjaGlsZCAhPSBudWxsKSB7IC8vIHNvdXJjZSBnZW5lcmF0aW9uIDoKLQkJCQkJCQkJCQkJCQkvLyBiZXR3ZWVuIHR3byBydWxlcwotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJfQotCQllbHNlIGlmICgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKHByZXYgPT0gbnVsbCkgeyAvLyBzb3VyY2UgZm9ybWF0dGluZyA6IGJlZm9yZSB0aGUgZmlyc3QgcnVsZQotCQkJCUlDU1NOb2RlIG5leHQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWludCBwb3MgPSBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJCQlpZiAobmV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbmV4dCkuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJCQlwb3MgPSAoKEluZGV4ZWRSZWdpb24pIG5leHQpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaWYgKHBvcyAhPSAwKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJQ29tcG91bmRSZWdpb25bXSBwcmV2UmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKDAsIHBvcyksIG51bGwsIG51bGwpOwotCQkJCQlpZiAocHJldlJlZ2lvbnMgIT0gbnVsbCAmJiBwcmV2UmVnaW9ucy5sZW5ndGggPiAwKQotCQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChjaGlsZCA9PSBudWxsKSB7IC8vIHNvdXJjZSBmb3JtYXR0aW5nIDogYWZ0ZXIgdGhlIGxhc3QKLQkJCQkJCQkJCQkvLyBydWxlCi0JCQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8PSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHN0YXJ0IDw9IDApIHsKLQkJCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCQlpZiAocG9zIDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0IGJlCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGNvbW1lbnRzCi0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCX0KLQkJCWlmICgocmVnaW9ucyAhPSBudWxsICYmIHJlZ2lvbnMubGVuZ3RoID4gMCAmJiByZWdpb25zW3JlZ2lvbnMubGVuZ3RoIC0gMV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJfQotCQllbHNlIHsgLy8gc291cmNlIGdlbmVyYXRpb24KLQkJCWlmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpICE9IG51bGwgJiYgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJcmV0dXJuOyAvLyBub3RoaW5nCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlIG5vZGUsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwIHx8IHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8gfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQl9Ci0JCQlpZiAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmIChzb3VyY2UubGVuZ3RoKCkgPiAwIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpICE9IG51bGwgJiYgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkgewotCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCS8vIHNvdXJjZS5hcHBlbmQoIjwhLS0iKTsKLQkJCS8vIGFwcGVuZERlbGltQmVmb3JlKG5vZGUsbnVsbCwgc291cmNlKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm47IC8vIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pIHx8IHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8gfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKGlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkgewotCQkJCWlmIChzb3VyY2UubGVuZ3RoKCkgPiAwIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsKLQkJCQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZyA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RDKQotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnKTsKLQkJCX0KLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHlsZVNoZWV0Rm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFN0eWxlU2hlZXRGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1Vua25vd25SdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Vbmtub3duUnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWFiZWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1Vua25vd25SdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVW5rbm93blJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFVua25vd25SdWxlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JVW5rbm93blJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlDU1NVbmtub3duUnVsZSBydWxlID0gKENTU1Vua25vd25SdWxlKSBub2RlOwotCQkJc291cmNlLmFwcGVuZChydWxlLmdldENzc1RleHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgVW5rbm93blJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgVW5rbm93blJ1bGVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2F0ZWdvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhYzE0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NNTUNhdGVnb3J5IGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCVN0cmluZyBnZXRDYXB0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNoYXJzZXRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNoYXJzZXRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NmQ0NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1DaGFyc2V0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NQ2hhcnNldFJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWRiNWQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1Db250YWluZXIgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4Nzk3OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1EZXNjcmlwdG9yIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCUl0ZXJhdG9yIGdldFZhbHVlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Gb250RmFjZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRm9udEZhY2VSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOGRmZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Gb250RmFjZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUZvbnRGYWNlUnVsZSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1GdW5jdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1GdW5jdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmU3MDZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRnVuY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUZ1bmN0aW9uIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCVN0cmluZyBnZXRGdW5jdGlvblN0cmluZygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1JbXBvcnRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUltcG9ydFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZiZDJhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUltcG9ydFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUltcG9ydFJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NS2V5d29yZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1LZXl3b3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwODM3ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1LZXl3b3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1LZXl3b3JkIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCVN0cmluZyBnZXRLZXl3b3JkU3RyaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU1lZGlhUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1NZWRpYVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2YjdkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU1lZGlhUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NTWVkaWFSdWxlIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmE1ODY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NTm9kZSB7Ci0JU3RyaW5nIGdldFR5cGUoKTsKLQotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCVN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpOwotCi0JSXRlcmF0b3IgZ2V0Q2hpbGROb2RlcygpOwotCi0JSXRlcmF0b3IgZ2V0RGVzY2VuZGFudHMoKTsKLQotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBfUFJFRklYID0gIkNTU01NLiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfS0VZV09SRCA9IF9QUkVGSVggKyAiS2V5d29yZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfVU5JVCA9IF9QUkVGSVggKyAiVW5pdCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRlVOQ1RJT04gPSBfUFJFRklYICsgIkZ1bmN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TVFJJTkcgPSBfUFJFRklYICsgIlN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU1RZTEVfU0hFRVQgPSBfUFJFRklYICsgIlN0eWxlU2hlZXQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1BST1BFUlRZID0gX1BSRUZJWCArICJQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfREVTQ1JJUFRPUiA9IF9QUkVGSVggKyAiRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQ09OVEFJTkVSID0gX1BSRUZJWCArICJDb250YWluZXIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05VTUJFUiA9IF9QUkVGSVggKyAiTnVtYmVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TRVBBUkFUT1IgPSBfUFJFRklYICsgIlNlcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQ0hBUlNFVF9SVUxFID0gX1BSRUZJWCArICJDaGFyc2V0UnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSU1QT1JUX1JVTEUgPSBfUFJFRklYICsgIkltcG9ydFJ1bGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1NUWUxFX1JVTEUgPSBfUFJFRklYICsgIlN0eWxlUnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUVESUFfUlVMRSA9IF9QUkVGSVggKyAiTWVkaWFSdWxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9QQUdFX1JVTEUgPSBfUFJFRklYICsgIlBhZ2VSdWxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9GT05UX0ZBQ0VfUlVMRSA9IF9QUkVGSVggKyAiRm9udEZhY2VSdWxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9DQVRFR09SWSA9IF9QUkVGSVggKyAiQ2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01FVEFfTU9ERUwgPSBfUFJFRklYICsgIk1ldGFNb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU0VMRUNUT1IgPSBfUFJFRklYICsgIlNlbGVjdG9yIjsgLy8kTk9OLU5MUy0xJAkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTnVtYmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU51bWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2MwZjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTnVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1OdW1iZXIgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NUGFnZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NUGFnZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdhMDg0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVBhZ2VSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1QYWdlUnVsZSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Qcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTJmNzI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGludGVyZmFjZSBDU1NNTVByb3BlcnR5IGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCVN0cmluZyBnZXRDYXRlZ29yeU5hbWUoKTsKLQotCUl0ZXJhdG9yIGdldFZhbHVlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDNiYmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NU2VsZWN0b3IgZXh0ZW5kcyBDU1NNTU5vZGUgewotCVN0cmluZyBnZXRTZWxlY3RvclR5cGUoKTsKLQotCVN0cmluZyBnZXRTZWxlY3RvclN0cmluZygpOwotCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRVhQUkVTU0lPTiA9ICJFeHByZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9QU0VVRE9fQ0xBU1MgPSAiUHNldWRvQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1BTRVVET19FTEVNRU5UID0gIlBzZXVkb0VsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBlbWJlZGRlZCBleHByZXNzaW9uIHR5cGUKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fREVTQ0VOREFOVCA9ICJkZXNjZW5kYW50IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9DSElMRCA9ICJjaGlsZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fQURKQUNFTlQgPSAiYWRqYWNlbnQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX1VOSVZFUlNBTCA9ICJ1bml2ZXJzYWwiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX0FUVFJJQlVURSA9ICJhdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0cmluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4Mzc0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NU3RyaW5nIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3R5bGVSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZDc0OWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVN0eWxlUnVsZSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVNoZWV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0eWxlU2hlZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4YjJhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0eWxlU2hlZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVN0eWxlU2hlZXQgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NVW5pdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Vbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0N2QxMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Vbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1Vbml0IGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCVN0cmluZyBnZXRVbml0U3RyaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNZXRhTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01ldGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzcwNDhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01ldGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01ldGFNb2RlbCBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQkvLyBwdWJsaWMgaW50ZXJmYWNlIENTU01ldGFNb2RlbCB7Ci0JQ1NTTU1TdHlsZVNoZWV0IGdldFN0eWxlU2hlZXQoKTsKLQotCS8qCi0JICogU2hvcnRjdXQgdG8gYWNjZXNzIHByb3BlcnR5IG5vZGUKLQkgKi8KLQkvLyBJdGVyYXRvciBnZXRQcm9wZXJ0aWVzKCk7Ci0JLy8gSXRlcmF0b3IgZ2V0RGVzY3JpcHRvcnMoKTsKLQkvLyBDU1NNTVByb3BlcnR5IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCS8qCi0JICogYWNjZXNzIHRvIGNhdGVnb3J5IGluZm9ybWF0aW9uCi0JICovCi0JSXRlcmF0b3IgZ2V0Q2F0ZWdvcmllcygpOwotCi0JLyoKLQkgKiBVdGlsaXRpZXMKLQkgKi8KLQkvLyBJdGVyYXRvciBjb2xsZWN0Tm9kZXNCeVR5cGUoU3RyaW5nIHR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTUHJvZmlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRjOWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU1Byb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU1Byb2ZpbGUgewotCi0JU3RyaW5nIGdldFByb2ZpbGVJRCgpOwotCi0JU3RyaW5nIGdldFByb2ZpbGVOYW1lKCk7Ci0KLQlVUkwgZ2V0UHJvZmlsZVVSTCgpOwotCi0JQ1NTTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpOwotCi0JYm9vbGVhbiBpc0RlZmF1bHQoKTsKLQotCVN0cmluZyBnZXRPd25lclBsdWdpbklEKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU1Byb2ZpbGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDM2YTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU1Byb2ZpbGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbC5SZWdpc3RyeVJlYWRlcjsKLQotcHVibGljIGNsYXNzIENTU1Byb2ZpbGVSZWdpc3RyeSB7Ci0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTUHJvZmlsZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NQcm9maWxlUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQkKLQlzdGF0aWMgY2xhc3MgUHJvZmlsZU5hbWVDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXN0YXRpYyBDb2xsYXRvciBkZWxlZ2F0ZSA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlpZiAobzEgaW5zdGFuY2VvZiBDU1NQcm9maWxlICYmIG8yIGluc3RhbmNlb2YgQ1NTUHJvZmlsZSkgewotCQkJCWlmICgoKENTU1Byb2ZpbGUpIG8xKS5nZXRQcm9maWxlTmFtZSgpICE9IG51bGwgJiYgKChDU1NQcm9maWxlKSBvMikuZ2V0UHJvZmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkZWxlZ2F0ZS5jb21wYXJlKCgoQ1NTUHJvZmlsZSkgbzEpLmdldFByb2ZpbGVOYW1lKCksICgoQ1NTUHJvZmlsZSkgbzIpLmdldFByb2ZpbGVOYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldFByb2ZpbGVzKCkgewotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoZlByb2ZpbGVzLnZhbHVlcygpKTsKLQkJQ29sbGVjdGlvbnMuc29ydCh2YWx1ZXMsIG5ldyBQcm9maWxlTmFtZUNvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKHZhbHVlcykuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTUHJvZmlsZSBnZXRQcm9maWxlKFN0cmluZyBwcm9maWxlSUQpIHsKLQkJcmV0dXJuIChDU1NQcm9maWxlKSBmUHJvZmlsZXMuZ2V0KHByb2ZpbGVJRCk7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZ2V0RGVmYXVsdFByb2ZpbGUoKSB7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRQcm9maWxlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IChDU1NQcm9maWxlKSBpLm5leHQoKTsKLQkJCWlmIChwcm9maWxlLmlzRGVmYXVsdCgpKSB7Ci0JCQkJcmV0dXJuIHByb2ZpbGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU1Byb2ZpbGVSZWdpc3RyeS4KLQkgKi8KLQlwcml2YXRlIENTU1Byb2ZpbGVSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJZlByb2ZpbGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJSXRlcmF0b3IgaSA9IG5ldyBSZWdpc3RyeVJlYWRlcigpLmVudW1Qcm9maWxlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBwcm9maWxlID0gaS5uZXh0KCk7Ci0JCQlpZiAocHJvZmlsZSBpbnN0YW5jZW9mIENTU1Byb2ZpbGUpIHsKLQkJCQlmUHJvZmlsZXMucHV0KCgoQ1NTUHJvZmlsZSkgcHJvZmlsZSkuZ2V0UHJvZmlsZUlEKCksIHByb2ZpbGUpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBDU1NQcm9maWxlUmVnaXN0cnkgZkluc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmUHJvZmlsZXMgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NGdW5jdGlvbklELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU0Z1bmN0aW9uSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0ZTE2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU0Z1bmN0aW9uSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTRnVuY3Rpb25JRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZfQVRUUiA9ICJhdHRyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRl9DT1VOVEVSID0gImNvdW50ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX1JHQiA9ICJyZ2IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX1JFQ1QgPSAicmVjdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZfRk9STUFUID0gImZvcm1hdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZfTE9DQUwgPSAibG9jYWwiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU0tleXdvcmRJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NLZXl3b3JkSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmODk4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU0tleXdvcmRJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTS2V5d29yZElEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS18xMDAgPSAiMTAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS18yMDAgPSAiMjAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS18zMDAgPSAiMzAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS180MDAgPSAiNDAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS181MDAgPSAiNTAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS182MDAgPSAiNjAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS183MDAgPSAiNzAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS184MDAgPSAiODAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS185MDAgPSAiOTAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BQk9WRSA9ICJhYm92ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUJTT0xVVEUgPSAiYWJzb2x1dGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FDVElWRUJPUkRFUiA9ICJBY3RpdmVCb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FDVElWRUNBUFRJT04gPSAiQWN0aXZlQ2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUxMID0gImFsbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUxXQVlTID0gImFsd2F5cyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVBQV09SS1NQQUNFID0gIkFwcFdvcmtzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVFVQSA9ICJhcXVhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BUk1FTklBTiA9ICJhcm1lbmlhbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVVUTyA9ICJhdXRvIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BVk9JRCA9ICJhdm9pZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkFDS0dST1VORCA9ICJCYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CQVNFTElORSA9ICJiYXNlbGluZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkVISU5EID0gImJlaGluZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkVMT1cgPSAiYmVsb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JJRElfT1ZFUlJJREUgPSAiYmlkaS1vdmVycmlkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkxBQ0sgPSAiYmxhY2siOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JMSU5LID0gImJsaW5rIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CTE9DSyA9ICJibG9jayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkxVRSA9ICJibHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JPTERFUiA9ICJib2xkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JPVEggPSAiYm90aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQk9UVE9NID0gImJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQlVUVE9ORkFDRSA9ICJCdXR0b25GYWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CVVRUT05ISUdITElHSFQgPSAiQnV0dG9uSGlnaGxpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CVVRUT05TSEFET1cgPSAiQnV0dG9uU2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CVVRUT05URVhUID0gIkJ1dHRvblRleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NBUElUQUxJWkUgPSAiY2FwaXRhbGl6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0FQVElPTiA9ICJjYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DQVBUSU9OVEVYVCA9ICJDYXB0aW9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0VOVEVSID0gImNlbnRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0VOVEVSX0xFRlQgPSAiY2VudGVyLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NFTlRFUl9SSUdIVCA9ICJjZW50ZXItcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NISUxEID0gImNoaWxkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DSVJDTEUgPSAiY2lyY2xlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DSktfSURFT0dSQVBISUMgPSAiY2prLWlkZW9ncmFwaGljIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DTE9TRV9RVU9URSA9ICJjbG9zZS1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09ERSA9ICJjb2RlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DT05ERU5TRUQgPSAiY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DT0xMQVBTRSA9ICJjb2xsYXBzZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09NUEFDVCA9ICJjb21wYWN0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DT05USU5VT1VTID0gImNvbnRpbnVvdXMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NST1AgPSAiY3JvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ1JPU1MgPSAiY3Jvc3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NST1NTSEFJUiA9ICJjcm9zc2hhaXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NVUlNJVkUgPSAiY3Vyc2l2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREFTSEVEID0gImRhc2hlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREVDSU1BTCA9ICJkZWNpbWFsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ERUNJTUFMX0xFQURJTkdfWkVSTyA9ICJkZWNpbWFsLWxlYWRpbmctemVybyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ESUdJVFMgPSAiZGlnaXRzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ESVNDID0gImRpc2MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RPVFRFRCA9ICJkb3R0ZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RPVUJMRSA9ICJkb3VibGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VfUkVTSVpFID0gImUtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19FTUJFRCA9ICJlbWJlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRVhQQU5ERUQgPSAiZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VYVFJBX0NPTkRFTlNFRCA9ICJleHRyYS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VYVFJBX0VYUEFOREVEID0gImV4dHJhLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQU5UQVNZID0gImZhbnRhc3kiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZBUl9MRUZUID0gImZhci1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQVJfUklHSFQgPSAiZmFyLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQVNUID0gImZhc3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZBU1RFUiA9ICJmYXN0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZFTUFMRSA9ICJmZW1hbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZJWEVEID0gImZpeGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GVUNIU0lBID0gImZ1Y2hzaWEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0dFT1JHSUFOID0gImdlb3JnaWFuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19HUkFZID0gImdyYXkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0dSQVlURVhUID0gIkdyYXlUZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19HUkVFTiA9ICJncmVlbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfR1JPT1ZFID0gImdyb292ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSEVCUkVXID0gImhlYnJldyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSEVMUCA9ICJoZWxwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISURERU4gPSAiaGlkZGVuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISURFID0gImhpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hJR0ggPSAiaGlnaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElHSExJR0hUID0gIkhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElHSExJR0hUVEVYVCA9ICJIaWdobGlnaHRUZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISUdIRVIgPSAiaGlnaGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISVJBR0FOQSA9ICJoaXJhZ2FuYSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElSQUdBTkFfSVJPSEEgPSAiaGlyYWdhbmEtaXJvaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5BQ1RJVkVCT1JERVIgPSAiSW5hY3RpdmVCb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOQUNUSVZFQ0FQVElPTiA9ICJJbmFjdGl2ZUNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOQUNUSVZFQ0FQVElPTlRFWFQgPSAiSW5hY3RpdmVDYXB0aW9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5GT0JBQ0tHUk9VTkQgPSAiSW5mb0JhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lORk9URVhUID0gIkluZm9UZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkxJTkUgPSAiaW5saW5lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkxJTkVfVEFCTEUgPSAiaW5saW5lLXRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTlNFVCA9ICJpbnNldCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5TSURFID0gImluc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5WRVJUID0gImludmVydCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSVRBTElDID0gIml0YWxpYyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSlVTVElGWSA9ICJqdXN0aWZ5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19LQVRBS0FOQSA9ICJrYXRha2FuYSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfS0FUQUtBTkFfSVJPSEEgPSAia2F0YWthbmEtaXJvaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xBTkRTQ0FQRSA9ICJsYW5kc2NhcGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xBUkdFID0gImxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MQVJHRVIgPSAibGFyZ2VyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MRUZUID0gImxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xFRlRfU0lERSA9ICJsZWZ0LXNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xFRlRXQVJEUyA9ICJsZWZ0d2FyZHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xFVkVMID0gImxldmVsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MSUdIVEVSID0gImxpZ2h0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xJTUUgPSAibGltZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTElORV9USFJPVUdIID0gImxpbmUtdGhyb3VnaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTElTVF9JVEVNID0gImxpc3QtaXRlbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9VRCA9ICJsb3VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1cgPSAibG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1dFUiA9ICJsb3dlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XRVJfQUxQSEEgPSAibG93ZXItYWxwaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPV0VSX0dSRUVLID0gImxvd2VyLWdyZWVrIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1dFUl9MQVRJTiA9ICJsb3dlci1sYXRpbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XRVJfUk9NQU4gPSAibG93ZXItcm9tYW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPV0VSQ0FTRSA9ICJsb3dlcmNhc2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xUUiA9ICJsdHIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01BTEUgPSAibWFsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUFSS0VSID0gIm1hcmtlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUFST09OID0gIm1hcm9vbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVESVVNID0gIm1lZGl1bSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVOVSA9ICJtZW51IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NRU5VVEVYVCA9ICJNZW51VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVTU0FHRV9CT1ggPSAibWVzc2FnZS1ib3giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01JRERMRSA9ICJtaWRkbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01JWCA9ICJtaXgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01PTk9TUEFDRSA9ICJtb25vc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01PVkUgPSAibW92ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTl9SRVNJWkUgPSAibi1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05BUlJPV0VSID0gIm5hcnJvd2VyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OQVZZID0gIm5hdnkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05FX1JFU0laRSA9ICJuZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PX0NMT1NFX1FVT1RFID0gIm5vLWNsb3NlLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OT19PUEVOX1FVT1RFID0gIm5vLW9wZW4tcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PX1JFUEVBVCA9ICJuby1yZXBlYXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PTkUgPSAibm9uZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTk9STUFMID0gIm5vcm1hbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTk9XUkFQID0gIm5vd3JhcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTldfUkVTSVpFID0gIm53LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT0JMSVFVRSA9ICJvYmxpcXVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19PTElWRSA9ICJvbGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT05DRSA9ICJvbmNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19PUEVOX1FVT1RFID0gIm9wZW4tcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09VVFNFVCA9ICJvdXRzZXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09VVFNJREUgPSAib3V0c2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT1ZFUkxJTkUgPSAib3ZlcmxpbmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BPSU5URVIgPSAicG9pbnRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUE9SVFJBSVQgPSAicG9ydHJhaXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BSRSA9ICJwcmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BVUlBMRSA9ICJwdXJwbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JFRCA9ICJyZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JFTEFUSVZFID0gInJlbGF0aXZlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SRVBFQVQgPSAicmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SRVBFQVRfWCA9ICJyZXBlYXQteCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUkVQRUFUX1kgPSAicmVwZWF0LXkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JJREdFID0gInJpZGdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SSUdIVCA9ICJyaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUklHSFRfU0lERSA9ICJyaWdodC1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SSUdIVFdBUkRTID0gInJpZ2h0d2FyZHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JUTCA9ICJydGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JVTl9JTiA9ICJydW4taW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NfUkVTSVpFID0gInMtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TQU5TX1NFUklGID0gInNhbnMtc2VyaWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NDUk9MTCA9ICJzY3JvbGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NDUk9MTEJBUiA9ICJTY3JvbGxiYXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NFX1JFU0laRSA9ICJzZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NFTUlfQ09OREVOU0VEID0gInNlbWktY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRU1JX0VYUEFOREVEID0gInNlbWktZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NFUEFSQVRFID0gInNlcGFyYXRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRVJJRiA9ICJzZXJpZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0hPVyA9ICJzaG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TSUxFTlQgPSAic2lsZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TSUxWRVIgPSAic2lsdmVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTE9XID0gInNsb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NMT1dFUiA9ICJzbG93ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NNQUxMID0gInNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTUFMTF9DQVBTID0gInNtYWxsLWNhcHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NNQUxMX0NBUFRJT04gPSAic21hbGwtY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU01BTExFUiA9ICJzbWFsbGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TT0ZUID0gInNvZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NPTElEID0gInNvbGlkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TUEVMTF9PVVQgPSAic3BlbGwtb3V0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TUVVBUkUgPSAic3F1YXJlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TVEFUSUMgPSAic3RhdGljIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TVEFUVVNfQkFSID0gInN0YXR1cy1iYXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NVQiA9ICJzdWIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NVUEVSID0gInN1cGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TV19SRVNJWkUgPSAic3ctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRSA9ICJ0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEFCTEVfQ0FQVElPTiA9ICJ0YWJsZS1jYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9DRUxMID0gInRhYmxlLWNlbGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0NPTFVNTiA9ICJ0YWJsZS1jb2x1bW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0NPTFVNTl9HUk9VUCA9ICJ0YWJsZS1jb2x1bW4tZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0ZPT1RFUl9HUk9VUCA9ICJ0YWJsZS1mb290ZXItZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0hFQURFUl9HUk9VUCA9ICJ0YWJsZS1oZWFkZXItZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX1JPVyA9ICJ0YWJsZS1yb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX1JPV19HUk9VUCA9ICJ0YWJsZS1yb3ctZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RFQUwgPSAidGVhbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19URVhUX1RPUCA9ICJ0ZXh0LXRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEVYVF9CT1RUT00gPSAidGV4dC1ib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RISUNLID0gInRoaWNrIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USElOID0gInRoaW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RIUkVFRERBUktTSEFET1cgPSAiVGhyZWVERGFya1NoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhSRUVERkFDRSA9ICJUaHJlZURGYWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USFJFRURISUdITElHSFQgPSAiVGhyZWVESGlnaGxpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USFJFRURMSUdIVFNIQURPVyA9ICJUaHJlZURMaWdodFNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhSRUVEU0hBRE9XID0gIlRocmVlRFNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVE9QID0gInRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVFJBTlNQQVJFTlQgPSAidHJhbnNwYXJlbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VMVFJBX0NPTkRFTlNFRCA9ICJ1bHRyYS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VMVFJBX0VYUEFOREVEID0gInVsdHJhLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VTkRFUkxJTkUgPSAidW5kZXJsaW5lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VUFBFUl9BTFBIQSA9ICJ1cHBlci1hbHBoYSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVVBQRVJfTEFUSU4gPSAidXBwZXItbGF0aW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VQUEVSX1JPTUFOID0gInVwcGVyLXJvbWFuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VUFBFUkNBU0UgPSAidXBwZXJjYXNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19WSVNJQkxFID0gInZpc2libGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dfUkVTSVpFID0gInctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XQUlUID0gIndhaXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dISVRFID0gIndoaXRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XSURFUiA9ICJ3aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfV0lORE9XID0gIldpbmRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfV0lORE9XRlJBTUUgPSAiV2luZG93RnJhbWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dJTkRPV1RFWFQgPSAiV2luZG93VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9GQVNUID0gIngtZmFzdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9ISUdIID0gIngtaGlnaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9MQVJHRSA9ICJ4LWxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YX0xPVUQgPSAieC1sb3VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YX0xPVyA9ICJ4LWxvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9TTE9XID0gIngtc2xvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9TTUFMTCA9ICJ4LXNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YX1NPRlQgPSAieC1zb2Z0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YWF9TTUFMTCA9ICJ4eC1zbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWFhfTEFSR0UgPSAieHgtbGFyZ2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1lFTExPVyA9ICJ5ZWxsb3ciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01NVHlwZUNvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNTVR5cGVDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2ODA1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01NVHlwZUNvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENTU01NVHlwZUNvbGxlY3RvciBleHRlbmRzIENTU01ldGFNb2RlbFRyYXZlcnNlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVHlwZUNvbGxlY3Rvci4KLQkgKi8KLQlwdWJsaWMgQ1NTTU1UeXBlQ29sbGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGx5KENTU01NTm9kZSBub2RlLCBTdHJpbmcgdHlwZSkgewotCQlmVHlwZSA9IHR5cGU7Ci0JCWZOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYXBwbHkobm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdE5lc3RlZFR5cGUoYm9vbGVhbiBuZXN0ZWQpIHsKLQkJZk5lc3RlZCA9IG5lc3RlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShDU1NNTU5vZGUgbm9kZSkgewotCQlzaG9ydCByYyA9IFRSQVZfQ09OVDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKGZUeXBlID09IG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCQkJaWYgKCFmTm9kZXMuY29udGFpbnMobm9kZSkpIHsKLQkJCQkJZk5vZGVzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQkJaWYgKCFmTmVzdGVkKSB7Ci0JCQkJCXJjID0gVFJBVl9QUlVORTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXROb2RlcygpIHsKLQkJcmV0dXJuIGZOb2Rlcy5pdGVyYXRvcigpOwotCX0KLQotCi0JcHJpdmF0ZSBib29sZWFuIGZOZXN0ZWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBmVHlwZSA9IG51bGw7Ci0JTGlzdCBmTm9kZXMgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZWRpYUdyb3VwSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWVkaWFHcm91cElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OGNmN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZWRpYUdyb3VwSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTWVkaWFHcm91cElEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9DT05USU5VT1VTID0gImNvbnRpbnVvdXMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX1BBR0VEID0gInBhZ2VkIjsgLy8kTk9OLU5MUy0xJAotCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX1ZJU1VBTCA9ICJ2aXN1YWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX0FVUkFMID0gImF1cmFsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9UQUNUSUxFID0gInRhY3RpbGUiOyAvLyROT04tTkxTLTEkCi0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fR1JJRCA9ICJncmlkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9CSVRNQVAgPSAiYml0bWFwIjsgLy8kTk9OLU5MUy0xJAotCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX0lOVEVSQUNUSVZFID0gImludGVyYWN0aXZlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9TVEFUSUMgPSAic3RhdGljIjsgLy8kTk9OLU5MUy0xJAotCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX0FMTCA9ICJhbGwiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbEZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVkYTY5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbEZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTTWV0YU1vZGVsRmluZGVyIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTWV0YU1vZGVsRmluZGVyLgotCSAqLwotCXByaXZhdGUgQ1NTTWV0YU1vZGVsRmluZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgcHVibGljIENTU01ldGFNb2RlbEZpbmRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTTWV0YU1vZGVsRmluZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGZpbmRNZXRhTW9kZWxGb3IoSUNTU05vZGUgbm9kZSkgewotCQlyZXR1cm4gQ1NTUHJvZmlsZUZpbmRlci5nZXRJbnN0YW5jZSgpLmZpbmRQcm9maWxlRm9yKG5vZGUpLmdldE1ldGFNb2RlbCgpOwotCX0KLQotCXB1YmxpYyBDU1NNZXRhTW9kZWwgZmluZE1ldGFNb2RlbEZvcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXJldHVybiBDU1NQcm9maWxlRmluZGVyLmdldEluc3RhbmNlKCkuZmluZFByb2ZpbGVGb3IobW9kZWwpLmdldE1ldGFNb2RlbCgpOwotCi0JfQotCi0JLy8gZmluZE1ldGFNb2RlbEZvcihOb2RlKSBpcyBub3QgdXNlZC4KLQkvLyBFdmVuIGlmIGl0IGlzIHVzZWQsIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoCi0JLy8gZmluZE1ldGFNb2RlbEZvcihJU3RydWN0dXJlZE1vZGVsKSBlYXNpbHkKLQotCXB1YmxpYyBDU1NNZXRhTW9kZWwgZmluZE1ldGFNb2RlbEZvcihTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCXJldHVybiBDU1NQcm9maWxlRmluZGVyLmdldEluc3RhbmNlKCkuZmluZFByb2ZpbGVGb3IoYmFzZUxvY2F0aW9uKS5nZXRNZXRhTW9kZWwoKTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBDU1NNZXRhTW9kZWxGaW5kZXIgZkluc3RhbmNlID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVHJhdmVyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbFRyYXZlcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWJlZGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVHJhdmVyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi0KLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIENTU01ldGFNb2RlbFRyYXZlcnNlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVHJhdmVyc2VyLgotCSAqLwotCXB1YmxpYyBDU1NNZXRhTW9kZWxUcmF2ZXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgYXBwbHkoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJZlRyYXZTdGFjayA9IG5ldyBTdGFjaygpOwotCi0JCWJlZ2luKG5vZGUpOwotCQl0cmF2ZXJzZShub2RlKTsKLQkJZW5kKG5vZGUpOwotCX0KLQotCXByaXZhdGUgZmluYWwgc2hvcnQgdHJhdmVyc2UoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCi0JCWZUcmF2U3RhY2sucHVzaChub2RlKTsKLQotCQlzaG9ydCByYzsKLQkJcmMgPSBwcmVOb2RlKG5vZGUpOwotCi0JCWlmIChyYyA9PSBUUkFWX0NPTlQpIHsKLQkJCUl0ZXJhdG9yIGkgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUNTU01NTm9kZSBjaGlsZCA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJCXNob3J0IHJjQ2hpbGQgPSB0cmF2ZXJzZShjaGlsZCk7Ci0JCQkJaWYgKHJjQ2hpbGQgPT0gVFJBVl9TVE9QKSB7Ci0JCQkJCWZUcmF2U3RhY2sucG9wKCk7Ci0JCQkJCXJldHVybiBUUkFWX1NUT1A7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJjID09IFRSQVZfU1RPUCkgewotCQkJZlRyYXZTdGFjay5wb3AoKTsKLQkJCXJldHVybiBUUkFWX1NUT1A7Ci0JCX0KLQotCQlyYyA9IHBvc3ROb2RlKG5vZGUpOwotCi0JCWZUcmF2U3RhY2sucG9wKCk7Ci0JCXJldHVybiAocmMgPT0gVFJBVl9QUlVORSkgPyBUUkFWX0NPTlQgOiByYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihDU1NNTU5vZGUgbm9kZSkgewotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5kKENTU01NTm9kZSBub2RlKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShDU1NNTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCXByb3RlY3RlZCBzaG9ydCBwb3N0Tm9kZShDU1NNTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCi0JU3RhY2sgZlRyYXZTdGFjayA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IFRSQVZfQ09OVCA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBzaG9ydCBUUkFWX1NUT1AgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgc2hvcnQgVFJBVl9QUlVORSA9IDI7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYTc1Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci0KLQotcHVibGljIGNsYXNzIENTU01ldGFNb2RlbFV0aWwgewotCXB1YmxpYyBDU1NNZXRhTW9kZWxVdGlsKENTU01ldGFNb2RlbCBtZXRhbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJZk1ldGFNb2RlbCA9IG1ldGFtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9QUk9QRVJUWSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldERlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gY29sbGVjdE5vZGVzQnlUeXBlKENTU01NTm9kZS5UWVBFX0RFU0NSSVBUT1IpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBjb2xsZWN0Tm9kZXNCeVR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJQ1NTTU1UeXBlQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBDU1NNTVR5cGVDb2xsZWN0b3IoKTsKLQkJY29sbGVjdG9yLmFwcGx5KGZNZXRhTW9kZWwsIHR5cGUpOwotCQlyZXR1cm4gY29sbGVjdG9yLmdldE5vZGVzKCk7Ci0JfQotCi0JcHVibGljIENTU01NUHJvcGVydHkgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJdGVyYXRvciBpUHJvcGVydHkgPSBnZXRQcm9wZXJ0aWVzKCk7Ci0JCXdoaWxlIChpUHJvcGVydHkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGlQcm9wZXJ0eS5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJcmV0dXJuIChDU1NNTVByb3BlcnR5KSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDU1NNTURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihTdHJpbmcgZGVzY3JpcHRvck5hbWUpIHsKLQkJSXRlcmF0b3IgaURlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9ycygpOwotCQl3aGlsZSAoaURlc2NyaXB0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGlEZXNjcmlwdG9yLm5leHQoKTsKLQkJCWlmIChub2RlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGRlc2NyaXB0b3JOYW1lKSkgewotCQkJCXJldHVybiAoQ1NTTU1EZXNjcmlwdG9yKSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDU1NNTU5vZGUgZ2V0TWV0YU1vZGVsTm9kZUZvcihJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbGFyYXRpb24pIHsKLQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSB7Ci0JCQlJQ1NTTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJCXJldHVybiBnZXRQcm9wZXJ0eSgoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlKS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NGb250RmFjZVJ1bGUpIHsKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRvcigoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlKS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoZlR5cGVNYXAgPT0gbnVsbCkgewotCQkJZlR5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZlR5cGVNYXAucHV0KG5ldyBTaG9ydChJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSksIENTU01NTm9kZS5UWVBFX1NUWUxFX1JVTEUpOwotCQkJZlR5cGVNYXAucHV0KG5ldyBTaG9ydChJQ1NTTm9kZS5GT05URkFDRVJVTEVfTk9ERSksIENTU01NTm9kZS5UWVBFX0ZPTlRfRkFDRV9SVUxFKTsKLQkJCWZUeXBlTWFwLnB1dChuZXcgU2hvcnQoSUNTU05vZGUuUEFHRVJVTEVfTk9ERSksIENTU01NTm9kZS5UWVBFX1BBR0VfUlVMRSk7Ci0JCX0KLQotCQlTdHJpbmcgbm9kZVR5cGUgPSAoU3RyaW5nKSBmVHlwZU1hcC5nZXQobmV3IFNob3J0KG5vZGUuZ2V0Tm9kZVR5cGUoKSkpOwotCQlpZiAobm9kZVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJdGVyYXRvciBpTm9kZXMgPSBjb2xsZWN0Tm9kZXNCeVR5cGUobm9kZVR5cGUpOwotCQlpZiAoaU5vZGVzLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIHRhcmdldE5vZGUgPSAoQ1NTTU1Ob2RlKSBpTm9kZXMubmV4dCgpOwotCQkJaWYgKCFpTm9kZXMuaGFzTmV4dCgpKSB7IC8vIGl0J3Mgb25seSBvbmUKLQkJCQlyZXR1cm4gdGFyZ2V0Tm9kZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDU1NNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgewotCQlyZXR1cm4gZk1ldGFNb2RlbDsKLQl9Ci0KLQotCXByaXZhdGUgQ1NTTWV0YU1vZGVsIGZNZXRhTW9kZWwgPSBudWxsOwotCXByaXZhdGUgTWFwIGZUeXBlTWFwID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTnVtYmVySUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTnVtYmVySUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmNjk4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU051bWJlcklELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU051bWJlcklEIHsKLQotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fQU5HTEUgPSAiYW5nbGUiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0ZSRVFVRU5DWSA9ICJmcmVxdWVuY3kiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0lOVEVHRVIgPSAiaW50ZWdlciI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fTEVOR1RIID0gImxlbmd0aCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fUEVSQ0VOVEFHRSA9ICJwZXJjZW50YWdlIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9USU1FID0gInRpbWUiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0hBU0ggPSAiaGFzaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX05VTSA9ICJudW1iZXIiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvZmlsZUZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NQcm9maWxlRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkN2Y1MjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NQcm9maWxlRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NQcm9maWxlRmluZGVyIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTUHJvZmlsZUZpbmRlci4KLQkgKi8KLQlwcml2YXRlIENTU1Byb2ZpbGVGaW5kZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBwdWJsaWMgQ1NTUHJvZmlsZUZpbmRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTUHJvZmlsZUZpbmRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZmluZFByb2ZpbGVGb3IoSUNTU05vZGUgbm9kZSkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlJQ1NTRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCQltb2RlbCA9IGRvYy5nZXRNb2RlbCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaW5kUHJvZmlsZUZvcihtb2RlbCk7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZmluZFByb2ZpbGVGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlPYmplY3QgbW9kZWxUeXBlID0gKChJQ1NTTW9kZWwpIG1vZGVsKS5nZXRTdHlsZVNoZWV0VHlwZSgpOwotCQkJaWYgKG1vZGVsVHlwZSA9PSBJQ1NTTW9kZWwuRVhURVJOQUwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG1vZGVsVHlwZSA9PSBJQ1NTTW9kZWwuRU1CRURERUQgfHwgbW9kZWxUeXBlID09IElDU1NNb2RlbC5JTkxJTkUpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsgLy8gbWF5IGJlIG51bGwKLQkJCX0KLQkJfQotCQllbHNlIGlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gZmluZFByb2ZpbGVGb3IoYmFzZUxvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTUHJvZmlsZSBmaW5kUHJvZmlsZUZvcihTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCUNTU1Byb2ZpbGVSZWdpc3RyeSByZWcgPSBDU1NQcm9maWxlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gbnVsbDsKLQotCQlpZiAoYmFzZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCAmJiBwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCQlyZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHByb2ZpbGVJRCA9IENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCByZXNvdXJjZSwgdHJ1ZSk7Ci0JCQkJaWYgKHByb2ZpbGVJRCAhPSBudWxsICYmIDAgPCBwcm9maWxlSUQubGVuZ3RoKCkpIHsKLQkJCQkJcHJvZmlsZSA9IHJlZy5nZXRQcm9maWxlKHByb2ZpbGVJRCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChwcm9maWxlICE9IG51bGwpID8gcHJvZmlsZSA6IHJlZy5nZXREZWZhdWx0UHJvZmlsZSgpOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIENTU1Byb2ZpbGVGaW5kZXIgZkluc3RhbmNlID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvcGVydHlJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NQcm9wZXJ0eUlELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MGU4ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NQcm9wZXJ0eUlELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NQcm9wZXJ0eUlEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9BWklNVVRIID0gImF6aW11dGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JHID0gImJhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JHX0FUVEFDSE1FTlQgPSAiYmFja2dyb3VuZC1hdHRhY2htZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19DT0xPUiA9ICJiYWNrZ3JvdW5kLWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19JTUFHRSA9ICJiYWNrZ3JvdW5kLWltYWdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19QT1NJVElPTiA9ICJiYWNrZ3JvdW5kLXBvc2l0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19SRVBFQVQgPSAiYmFja2dyb3VuZC1yZXBlYXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUiA9ICJib3JkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9DT0xMQVBTRSA9ICJib3JkZXItY29sbGFwc2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9DT0xPUiA9ICJib3JkZXItY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9TUEFDSU5HID0gImJvcmRlci1zcGFjaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfU1RZTEUgPSAiYm9yZGVyLXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QID0gImJvcmRlci10b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVCA9ICJib3JkZXItcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT00gPSAiYm9yZGVyLWJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlQgPSAiYm9yZGVyLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1BfQ09MT1IgPSAiYm9yZGVyLXRvcC1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUX0NPTE9SID0gImJvcmRlci1yaWdodC1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTV9DT0xPUiA9ICJib3JkZXItYm90dG9tLWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVF9DT0xPUiA9ICJib3JkZXItbGVmdC1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUF9TVFlMRSA9ICJib3JkZXItdG9wLXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFRfU1RZTEUgPSAiYm9yZGVyLXJpZ2h0LXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NX1NUWUxFID0gImJvcmRlci1ib3R0b20tc3R5bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUX1NUWUxFID0gImJvcmRlci1sZWZ0LXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QX1dJRFRIID0gImJvcmRlci10b3Atd2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVF9XSURUSCA9ICJib3JkZXItcmlnaHQtd2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT01fV0lEVEggPSAiYm9yZGVyLWJvdHRvbS13aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlRfV0lEVEggPSAiYm9yZGVyLWxlZnQtd2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9XSURUSCA9ICJib3JkZXItd2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPVFRPTSA9ICJib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NBUFRJT05fU0lERSA9ICJjYXB0aW9uLXNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NMRUFSID0gImNsZWFyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DTElQID0gImNsaXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NPTE9SID0gImNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT05URU5UID0gImNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NPVU5URVJfSU5DUkVNRU5UID0gImNvdW50ZXItaW5jcmVtZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT1VOVEVSX1JFU0VUID0gImNvdW50ZXItcmVzZXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRSA9ICJjdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRV9BRlRFUiA9ICJjdWUtYWZ0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRV9CRUZPUkUgPSAiY3VlLWJlZm9yZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ1VSU09SID0gImN1cnNvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRElSRUNUSU9OID0gImRpcmVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRElTUExBWSA9ICJkaXNwbGF5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9FTEVWQVRJT04gPSAiZWxldmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9FTVBUWV9DRUxMUyA9ICJlbXB0eS1jZWxscyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRkxPQVQgPSAiZmxvYXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlQgPSAiZm9udCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9GQU1JTFkgPSAiZm9udC1mYW1pbHkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU0laRSA9ICJmb250LXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU0laRV9BREpVU1QgPSAiZm9udC1zaXplLWFkanVzdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TVFJFVENIID0gImZvbnQtc3RyZXRjaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TVFlMRSA9ICJmb250LXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1ZBUklBTlQgPSAiZm9udC12YXJpYW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1dFSUdIVCA9ICJmb250LXdlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfSEVJR0hUID0gImhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTEVGVCA9ICJsZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MRVRURVJfU1BBQ0lORyA9ICJsZXR0ZXItc3BhY2luZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElORV9IRUlHSFQgPSAibGluZS1oZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEUgPSAibGlzdC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRV9JTUFHRSA9ICJsaXN0LXN0eWxlLWltYWdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFX1BPU0lUSU9OID0gImxpc3Qtc3R5bGUtcG9zaXRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEVfVFlQRSA9ICJsaXN0LXN0eWxlLXR5cGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTiA9ICJtYXJnaW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9UT1AgPSAibWFyZ2luLXRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX1JJR0hUID0gIm1hcmdpbi1yaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX0JPVFRPTSA9ICJtYXJnaW4tYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fTEVGVCA9ICJtYXJnaW4tbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSS0VSX09GRlNFVCA9ICJtYXJrZXItb2Zmc2V0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJLUyA9ICJtYXJrcyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFYX0hFSUdIVCA9ICJtYXgtaGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVhfV0lEVEggPSAibWF4LXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NSU5fSEVJR0hUID0gIm1pbi1oZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01JTl9XSURUSCA9ICJtaW4td2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX09SUEhBTlMgPSAib3JwaGFucyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORSA9ICJvdXRsaW5lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FX0NPTE9SID0gIm91dGxpbmUtY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkVfU1RZTEUgPSAib3V0bGluZS1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORV9XSURUSCA9ICJvdXRsaW5lLXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVkVSRkxPVyA9ICJvdmVyZmxvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElORyA9ICJwYWRkaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX1RPUCA9ICJwYWRkaW5nLXRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19SSUdIVCA9ICJwYWRkaW5nLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX0JPVFRPTSA9ICJwYWRkaW5nLWJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19MRUZUID0gInBhZGRpbmctbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRSA9ICJwYWdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0FGVEVSID0gInBhZ2UtYnJlYWstYWZ0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0VfQlJFQUtfQkVGT1JFID0gInBhZ2UtYnJlYWstYmVmb3JlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0lOU0lERSA9ICJwYWdlLWJyZWFrLWluc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFVU0UgPSAicGF1c2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBVVNFX0FGVEVSID0gInBhdXNlLWFmdGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQVVTRV9CRUZPUkUgPSAicGF1c2UtYmVmb3JlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QSVRDSCA9ICJwaXRjaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUElUQ0hfUkFOR0UgPSAicGl0Y2gtcmFuZ2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BMQVlfRFVSSU5HID0gInBsYXktZHVyaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QT1NJVElPTiA9ICJwb3NpdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUVVPVEVTID0gInF1b3RlcyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUklDSE5FU1MgPSAicmljaG5lc3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1JJR0hUID0gInJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TSVpFID0gInNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLID0gInNwZWFrIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19IRUFERVIgPSAic3BlYWstaGVhZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19OVU1FUkFMID0gInNwZWFrLW51bWVyYWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLX1BVTkNUVUFUSU9OID0gInNwZWFrLXB1bmN0dWF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVFQ0hfUkFURSA9ICJzcGVlY2gtcmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1RSRVNTID0gInN0cmVzcyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEFCTEVfTEFZT1VUID0gInRhYmxlLWxheW91dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9BTElHTiA9ICJ0ZXh0LWFsaWduIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX0RFQ09SQVRJT04gPSAidGV4dC1kZWNvcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX0lOREVOVCA9ICJ0ZXh0LWluZGVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9TSEFET1cgPSAidGV4dC1zaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfVFJBTlNGT1JNID0gInRleHQtdHJhbnNmb3JtIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9UT1AgPSAidG9wIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9VTklDT0RFX0JJREkgPSAidW5pY29kZS1iaWRpIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WRVJUSUNBTF9BTElHTiA9ICJ2ZXJ0aWNhbC1hbGlnbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVklTSUJJTElUWSA9ICJ2aXNpYmlsaXR5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WT0lDRV9GQU1JTFkgPSAidm9pY2UtZmFtaWx5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WT0xVTUUgPSAidm9sdW1lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XSElURV9TUEFDRSA9ICJ3aGl0ZS1zcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0lET1dTID0gIndpZG93cyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0lEVEggPSAid2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1dPUkRfU1BBQ0lORyA9ICJ3b3JkLXNwYWNpbmciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1pfSU5ERVggPSAiei1pbmRleCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTU3RyaW5nSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTU3RyaW5nSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyMmNmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1N0cmluZ0lELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU1N0cmluZ0lEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19BTlkgPSAiYW55IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19DT1VOVEVSX0lERU5USUZJRVIgPSAiY291bnRlci1pZGVudGlmaWVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19GQU1JTFlfTkFNRSA9ICJmYW1pbHktbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfRk9OVF9GQUNFX05BTUUgPSAiZm9udC1mYWNlLW5hbWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTX1BBR0VfSURFTlRJRklFUiA9ICJwYWdlLWlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTX1NQRUNJRklDX1ZPSUNFID0gInNwZWNpZmljLXZvaWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19VUkFOR0UgPSAidXJhbmdlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NVbml0SUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTVW5pdElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNDZkMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NVbml0SUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTVW5pdElEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9DTSA9ICJjbSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9ERUcgPSAiZGVnIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0VNUyA9ICJlbSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9FWFMgPSAiZXgiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfR1JBRCA9ICJncmFkIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0hBU0ggPSAiIyI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9IWiA9ICJIeiI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9JTiA9ICJpbiI7Ly8kTk9OLU5MUy0xJAotCS8vIGZpbmFsIHN0YXRpYyBTdHJpbmcgVV9JTlRFR0VSID0gIklOVEVHRVIiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfS0haID0gImtIeiI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9NTSA9ICJtbSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9NUyA9ICJtcyI7Ly8kTk9OLU5MUy0xJAotCS8vIGZpbmFsIHN0YXRpYyBTdHJpbmcgVV9OVU1CRVIgPSAiTlVNQkVSIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX1BDID0gInBjIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX1BFUkNFTlRBR0UgPSAiJSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9QVCA9ICJwdCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9QWCA9ICJweCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9SQUQgPSAicmFkIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX1MgPSAicyI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2F0ZWdvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1DYXRlZ29yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRiMGU2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1DYXRlZ29yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1DYXRlZ29yeUltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1DYXRlZ29yeSB7Ci0KLQlwdWJsaWMgQ1NTTU1DYXRlZ29yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9DQVRFR09SWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FwdGlvbigpIHsKLQkJcmV0dXJuIGZDYXB0aW9uOwotCX0KLQotCXZvaWQgc2V0Q2FwdGlvbihTdHJpbmcgY2FwdGlvbikgewotCQlmQ2FwdGlvbiA9IGNhcHRpb247Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0Q2FwdGlvbigpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldENhcHRpb24oKTsKLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZDYXB0aW9uID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNoYXJzZXRSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2hhcnNldFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNjRiNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2hhcnNldFJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NQ2hhcnNldFJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NQ2hhcnNldFJ1bGUgewotCi0KLQlwdWJsaWMgQ1NTTU1DaGFyc2V0UnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9DSEFSU0VUX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNvbnRhaW5lckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNvbnRhaW5lckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlNzllYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Db250YWluZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUNvbnRhaW5lckltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1Db250YWluZXIgewotCi0KLQlwdWJsaWMgQ1NTTU1Db250YWluZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfQ09OVEFJTkVSOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9OVU1CRVIgfHwgdHlwZSA9PSBUWVBFX0tFWVdPUkQgfHwgdHlwZSA9PSBUWVBFX0ZVTkNUSU9OIHx8IHR5cGUgPT0gVFlQRV9DT05UQUlORVIpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRGVzY3JpcHRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTURlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMWQ2NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi0KLWNsYXNzIENTU01NRGVzY3JpcHRvckltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1EZXNjcmlwdG9yIHsKLQotCi0JcHVibGljIENTU01NRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9ERVNDUklQVE9SOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9OVU1CRVIgfHwgdHlwZSA9PSBUWVBFX0tFWVdPUkQgfHwgdHlwZSA9PSBUWVBFX0ZVTkNUSU9OIHx8IHR5cGUgPT0gVFlQRV9DT05UQUlORVIgfHwgdHlwZSA9PSBUWVBFX1NUUklORyB8fCB0eXBlID09IFRZUEVfU0VQQVJBVE9SKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIGlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1EZXNjcmlwdG9yI2dldFZhbHVlcygpCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldFZhbHVlcygpIHsKLQkJVmFsdWVDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IFZhbHVlQ29sbGVjdG9yKCk7Ci0JCWNvbGxlY3Rvci5hcHBseSh0aGlzKTsKLQkJcmV0dXJuIGNvbGxlY3Rvci5nZXROb2RlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRm9udEZhY2VSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRm9udEZhY2VSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWQxY2E5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUZvbnRGYWNlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Gb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NRm9udEZhY2VSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTUZvbnRGYWNlUnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTUZvbnRGYWNlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9GT05UX0ZBQ0VfUlVMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0VHlwZSgpID09IFRZUEVfREVTQ1JJUFRPUik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRnVuY3Rpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1GdW5jdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3ZjIxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1GdW5jdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1GdW5jdGlvbkltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1GdW5jdGlvbiB7Ci0KLQlwdWJsaWMgQ1NTTU1GdW5jdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9GVU5DVElPTjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBmVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjcG9zdFNldEF0dHJpYnV0ZSgpCi0JICovCi0JLy8gdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKLQkvLyBzdXBlci5wb3N0U2V0QXR0cmlidXRlKCk7Ci0JLy8gU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JLy8gaWYgKG5hbWUgPT0gbnVsbCkgeyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsgfQotCS8vCi0JLy8gTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9BVFRSKTsKLQkvLyBsaXN0LmFkZChDU1NGdW5jdGlvbklELkZfQ09VTlRFUik7Ci0JLy8gbGlzdC5hZGQoQ1NTRnVuY3Rpb25JRC5GX1JHQik7Ci0JLy8gbGlzdC5hZGQoQ1NTRnVuY3Rpb25JRC5GX1JFQ1QpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9VUkkpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9GT1JNQVQpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9MT0NBTCk7Ci0JLy8KLQkvLyBpZiAoISBsaXN0LmNvbnRhaW5zKG5hbWUudG9Mb3dlckNhc2UoKSkpIHsKLQkvLyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsKLQkvLyB9Ci0JLy8gfQotCS8qCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRGdW5jdGlvblN0cmluZygpOwotCX0KLQotCXZvaWQgc2V0RnVuY3Rpb25TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldEZ1bmN0aW9uU3RyaW5nKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1JbXBvcnRSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NSW1wb3J0UnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkZmU4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1JbXBvcnRSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTUltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NSW1wb3J0UnVsZUltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1JbXBvcnRSdWxlIHsKLQotCi0JcHVibGljIENTU01NSW1wb3J0UnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9JTVBPUlRfUlVMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUtleXdvcmRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1LZXl3b3JkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGI1NTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUtleXdvcmRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NS2V5d29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1LZXl3b3JkSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTUtleXdvcmQgewotCi0JcHVibGljIENTU01NS2V5d29yZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9LRVlXT1JEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NS2V5d29yZCNnZXRLZXl3b3JkU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleXdvcmRTdHJpbmcoKSB7Ci0JCXJldHVybiBmVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldEtleXdvcmRTdHJpbmcoKTsKLQl9Ci0KLQl2b2lkIHNldEtleXdvcmRTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0S2V5d29yZFN0cmluZygpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBmVmFsdWUgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTWVkaWFSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTWVkaWFSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlOTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU1lZGlhUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1NZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NTWVkaWFSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTU1lZGlhUnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTU1lZGlhUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9NRURJQV9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZDdmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLQotYWJzdHJhY3QgY2xhc3MgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NTm9kZSB7Ci0KLQlwdWJsaWMgQ1NTTU1Ob2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFR5cGUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBmRGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGZBdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nKSBmQXR0cmlidXRlcy5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkTm9kZXMoKSB7Ci0JCWlmIChmQ2hpbGROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oZkNoaWxkTm9kZXMpLml0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0RGVzY2VuZGFudHMoKSB7Ci0JCUxpc3QgZGVzY2VuZGFudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGlDaGlsZCA9IGdldENoaWxkTm9kZXMoKTsKLQkJd2hpbGUgKGlDaGlsZC5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSBjaGlsZCA9IChDU1NNTU5vZGUpIGlDaGlsZC5uZXh0KCk7Ci0JCQlJdGVyYXRvciBpRGVzY2VuZGFudCA9IGNoaWxkLmdldERlc2NlbmRhbnRzKCk7Ci0JCQlpZiAoaURlc2NlbmRhbnQuaGFzTmV4dCgpKSB7Ci0JCQkJd2hpbGUgKGlEZXNjZW5kYW50Lmhhc05leHQoKSkgewotCQkJCQlDU1NNTU5vZGUgZGVzY2VuZGFudCA9IChDU1NNTU5vZGUpIGlEZXNjZW5kYW50Lm5leHQoKTsKLQkJCQkJaWYgKCFkZXNjZW5kYW50cy5jb250YWlucyhkZXNjZW5kYW50KSkgewotCQkJCQkJZGVzY2VuZGFudHMuYWRkKGRlc2NlbmRhbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKCFkZXNjZW5kYW50cy5jb250YWlucyhjaGlsZCkpIHsKLQkJCQkJZGVzY2VuZGFudHMuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oZGVzY2VuZGFudHMpLml0ZXJhdG9yKCk7Ci0JfQotCi0Jdm9pZCBhcHBlbmRDaGlsZChDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZkNoaWxkTm9kZXMgPT0gbnVsbCkgewotCQkJZkNoaWxkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJaWYgKCFmQ2hpbGROb2Rlcy5jb250YWlucyhjaGlsZCkpIHsKLQkJCWZDaGlsZE5vZGVzLmFkZChjaGlsZCk7Ci0JCQkoKENTU01NTm9kZUltcGwpIGNoaWxkKS5mUmVmQ291bnQrKzsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlQ2hpbGQoQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsIHx8IGZDaGlsZE5vZGVzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJdGVyYXRvciBpID0gZkNoaWxkTm9kZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoaS5uZXh0KCkgPT0gY2hpbGQpIHsKLQkJCQlpLnJlbW92ZSgpOwotCQkJCSgoQ1NTTU1Ob2RlSW1wbCkgY2hpbGQpLmZSZWZDb3VudC0tOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlQWxsQ2hpbGROb2RlcygpIHsKLQkJaWYgKGZDaGlsZE5vZGVzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJdGVyYXRvciBpID0gZkNoaWxkTm9kZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkoKENTU01NTm9kZUltcGwpIGkubmV4dCgpKS5mUmVmQ291bnQtLTsKLQkJfQotCQlmQ2hpbGROb2Rlcy5jbGVhcigpOwotCX0KLQotCWFic3RyYWN0IGJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpOwotCi0Jdm9pZCBpbml0aWFsaXplQXR0cmlidXRlKE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJaWYgKGZBdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCWZBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlmQXR0cmlidXRlcy5wdXRBbGwoYXR0cmlidXRlcyk7Ci0JCXBvc3RTZXRBdHRyaWJ1dGUoKTsKLQl9Ci0KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlmRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQl2b2lkIHBvc3RTZXRBdHRyaWJ1dGUoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJLy8gZGVmYXVsdCA6IG5vcAotCX0KLQotCWFic3RyYWN0IHNob3J0IGdldEVycm9yKCk7Ci0KLQlpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKLQkJcmV0dXJuIChmQ2hpbGROb2RlcyAhPSBudWxsKSA/IGZDaGlsZE5vZGVzLnNpemUoKSA6IDA7Ci0JfQotCi0JaW50IGdldFJlZmVyZW5jZUNvdW50KCkgewotCQlyZXR1cm4gZlJlZkNvdW50OwotCX0KLQotCi0JcHJpdmF0ZSBMaXN0IGZDaGlsZE5vZGVzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmRGVzY3JpcHRpb24gPSBudWxsOwotCXByaXZhdGUgTWFwIGZBdHRyaWJ1dGVzID0gbnVsbDsKLQlwcml2YXRlIGludCBmUmVmQ291bnQgPSAwOyAvLyBmb3IgZXJyb3IgY2hlY2sKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX05PVF9BVkFJTEFCTEUgPSAiIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTnVtYmVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTnVtYmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFlM2U0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU51bWJlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1OdW1iZXI7Ci0KLWNsYXNzIENTU01NTnVtYmVySW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTU51bWJlciB7Ci0KLQotCXB1YmxpYyBDU1NNTU51bWJlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9OVU1CRVI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXRUeXBlKCkgPT0gVFlQRV9VTklUKTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBhZ2VSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUGFnZVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOGNjZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUGFnZVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NUGFnZVJ1bGU7Ci0KLWNsYXNzIENTU01NUGFnZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NUGFnZVJ1bGUgewotCi0KLQlwdWJsaWMgQ1NTTU1QYWdlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9QQUdFX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfUFJPUEVSVFkgfHwgdHlwZSA9PSBUWVBFX1NFTEVDVE9SKTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVByb3BlcnR5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNTI5ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NUHJvcGVydHk7Ci0KLQotY2xhc3MgQ1NTTU1Qcm9wZXJ0eUltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1Qcm9wZXJ0eSB7Ci0JcHVibGljIENTU01NUHJvcGVydHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfUFJPUEVSVFk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX05VTUJFUiB8fCB0eXBlID09IFRZUEVfS0VZV09SRCB8fCB0eXBlID09IFRZUEVfRlVOQ1RJT04gfHwgdHlwZSA9PSBUWVBFX0NPTlRBSU5FUiB8fCB0eXBlID09IFRZUEVfU1RSSU5HIHx8IHR5cGUgPT0gVFlQRV9TRVBBUkFUT1IgfHwgdHlwZSA9PSBUWVBFX1BST1BFUlRZKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Qcm9wZXJ0eSNnZXRDYXRlZ29yeU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnlOYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKEFUVFJfQ0FURUdPUlkpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRWYWx1ZXMoKSB7Ci0JCVZhbHVlQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBWYWx1ZUNvbGxlY3RvcigpOwotCQljb2xsZWN0b3IuYXBwbHkodGhpcyk7Ci0JCXJldHVybiBjb2xsZWN0b3IuZ2V0Tm9kZXMoKTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NBVEVHT1JZID0gImNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvQ2xhc3NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5NTk4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotY2xhc3MgQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwgZXh0ZW5kcyBDU1NNTVNlbGVjdG9ySW1wbCB7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNTVBzZXVkb0NsYXNzSW1wbC4KLQkgKi8KLQlwdWJsaWMgQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NU2VsZWN0b3IjZ2V0U2VsZWN0b3JUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yVHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfUFNFVURPX0NMQVNTOwotCX0KLQotCXZvaWQgc2V0U2VsZWN0b3JTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9ICI6IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViZTkxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1wdWJsaWMgY2xhc3MgQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbCBleHRlbmRzIENTU01NU2VsZWN0b3JJbXBsIHsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01NUHNldWRvRWxlbWVudEltcGwuCi0JICovCi0JcHVibGljIENTU01NUHNldWRvRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NU2VsZWN0b3IjZ2V0U2VsZWN0b3JUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yVHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfUFNFVURPX0VMRU1FTlQ7Ci0JfQotCi0Jdm9pZCBzZXRTZWxlY3RvclN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJZlZhbHVlID0gIjoiICsgdmFsdWU7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NWI0Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1jbGFzcyBDU1NNTVNlbGVjdG9yRXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBDU1NNTVNlbGVjdG9ySW1wbCB7Ci0KLQlwdWJsaWMgQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTVNlbGVjdG9yI2dldFNlbGVjdG9yVHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX0VYUFJFU1NJT047Ci0JfQotCi0Jdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnBvc3RTZXRBdHRyaWJ1dGUoKTsKLQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQltYXAucHV0KEVYUFJFU1NJT05fQURKQUNFTlQudG9Mb3dlckNhc2UoKSwgIisiKTsgLy8kTk9OLU5MUy0xJAotCQltYXAucHV0KEVYUFJFU1NJT05fQVRUUklCVVRFLnRvTG93ZXJDYXNlKCksICJbXSIpOyAvLyROT04tTkxTLTEkCi0JCW1hcC5wdXQoRVhQUkVTU0lPTl9DSElMRC50b0xvd2VyQ2FzZSgpLCAiPiIpOyAvLyROT04tTkxTLTEkCi0JCW1hcC5wdXQoRVhQUkVTU0lPTl9ERVNDRU5EQU5ULnRvTG93ZXJDYXNlKCksICInICciKTsgLy8kTk9OLU5MUy0xJAotCQltYXAucHV0KEVYUFJFU1NJT05fVU5JVkVSU0FMLnRvTG93ZXJDYXNlKCksICIqIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmVmFsdWUgPSAoU3RyaW5nKSBtYXAuZ2V0KG5hbWUudG9Mb3dlckNhc2UoKSk7Ci0JCWlmIChmVmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TZWxlY3RvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmMjQzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TZWxlY3RvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1TZWxlY3RvcjsKLQotCi1hYnN0cmFjdCBjbGFzcyBDU1NNTVNlbGVjdG9ySW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVNlbGVjdG9yIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNTVNlbGVjdG9ySW1wbC4KLQkgKi8KLQlwdWJsaWMgQ1NTTU1TZWxlY3RvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGUjZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9TRUxFQ1RPUjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1TZWxlY3RvciNnZXRTZWxlY3RvclN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclN0cmluZygpIHsKLQkJcmV0dXJuIGZWYWx1ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0U2VsZWN0b3JTdHJpbmcoKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0cmluZ0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0cmluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjZGU0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHJpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU3RyaW5nOwotCi1jbGFzcyBDU1NNTVN0cmluZ0ltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1TdHJpbmcgewotCi0KLQlwdWJsaWMgQ1NTTU1TdHJpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfU1RSSU5HOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjcG9zdFNldEF0dHJpYnV0ZSgpCi0JICovCi0JLy8gdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKLQkvLyBzdXBlci5wb3N0U2V0QXR0cmlidXRlKCk7Ci0JLy8gU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JLy8gaWYgKG5hbWUgPT0gbnVsbCkgeyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsgfQotCS8vCi0JLy8gTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX0FOWS50b0xvd2VyQ2FzZSgpLCAiPGFueT4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19DT1VOVEVSX0lERU5USUZJRVIudG9Mb3dlckNhc2UoKSwgIjxjb3VudGVyPiIpOwotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfRkFNSUxZX05BTUUudG9Mb3dlckNhc2UoKSwgIjxmYW1pbHktbmFtZT4iKTsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX0ZPTlRfRkFDRV9OQU1FLnRvTG93ZXJDYXNlKCksCi0JLy8gIjxmb250LWZhY2UtbmFtZT4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19QQUdFX0lERU5USUZJRVIudG9Mb3dlckNhc2UoKSwKLQkvLyAiPHBhZ2UtaWRlbnRpZmllcj4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19TUEVDSUZJQ19WT0lDRS50b0xvd2VyQ2FzZSgpLAotCS8vICI8c3BlY2lmaWMtdm9pY2U+Iik7IC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfVVJBTkdFLnRvTG93ZXJDYXNlKCksICI8dXJhbmdlPiIpOyAvLyROT04tTkxTLTEkCi0JLy8KLQkvLyBmVmFsdWUgPSAoU3RyaW5nKW1hcC5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKTsKLQkvLyBpZiAoZlZhbHVlID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLyB9Ci0JLy8KLQkvLyAvKgotCS8vICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCS8vICovCi0JLy8gcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkvLyByZXR1cm4gZlZhbHVlOwotCS8vIH0KLQkvLwotCS8vIHByaXZhdGUgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHlsZVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHlsZVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMjU3YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3R5bGVSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVN0eWxlUnVsZTsKLQotY2xhc3MgQ1NTTU1TdHlsZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NU3R5bGVSdWxlIHsKLQotCi0JcHVibGljIENTU01NU3R5bGVSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1NUWUxFX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfUFJPUEVSVFkgfHwgdHlwZSA9PSBUWVBFX1NFTEVDVE9SKTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0eWxlU2hlZXRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHlsZVNoZWV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDdmZDAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0eWxlU2hlZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU3R5bGVTaGVldDsKLQotY2xhc3MgQ1NTTU1TdHlsZVNoZWV0SW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVN0eWxlU2hlZXQgewotCi0KLQlwdWJsaWMgQ1NTTU1TdHlsZVNoZWV0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1NUWUxFX1NIRUVUOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX0NIQVJTRVRfUlVMRSB8fCB0eXBlID09IFRZUEVfSU1QT1JUX1JVTEUgfHwgdHlwZSA9PSBUWVBFX1BBR0VfUlVMRSB8fCB0eXBlID09IFRZUEVfTUVESUFfUlVMRSB8fCB0eXBlID09IFRZUEVfRk9OVF9GQUNFX1JVTEUgfHwgdHlwZSA9PSBUWVBFX1NUWUxFX1JVTEUpOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0Q2hpbGRDb3VudCgpID09IDApIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NVW5pdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVVuaXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMTU0YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NVW5pdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NVW5pdDsKLQotLyoqCi0gKiBDU1NNTVVuaXQgOiBlbWJlZGRlZCB0eXBlCi0gKi8KLWNsYXNzIENTU01NVW5pdEltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1Vbml0IHsKLQotCXB1YmxpYyBDU1NNTVVuaXRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfVU5JVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTVVuaXQjZ2V0VW5pdFN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbml0U3RyaW5nKCkgewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI3Bvc3RTZXRBdHRyaWJ1dGUoKQotCSAqLwotCS8vIHZvaWQgcG9zdFNldEF0dHJpYnV0ZSgpIHRocm93cyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7Ci0JLy8gc3VwZXIucG9zdFNldEF0dHJpYnV0ZSgpOwotCS8vIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCS8vIGlmIChuYW1lID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLyBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0NNLnRvTG93ZXJDYXNlKCksICJjbSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0RFRy50b0xvd2VyQ2FzZSgpLCAiZGVnIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfRU1TLnRvTG93ZXJDYXNlKCksICJlbSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0VYUy50b0xvd2VyQ2FzZSgpLCAiZXgiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9HUkFELnRvTG93ZXJDYXNlKCksICJncmFkIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfSEFTSC50b0xvd2VyQ2FzZSgpLCAiIyIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0haLnRvTG93ZXJDYXNlKCksICJIeiIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0lOLnRvTG93ZXJDYXNlKCksICJpbiIpOy8vJE5PTi1OTFMtMSQKLQkvLyAvLyBtYXAucHV0KENTU1VuaXRJRC5VX0lOVEVHRVIudG9Mb3dlckNhc2UoKSwKLQkvLyAiKGludGVnZXIpIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfS0haLnRvTG93ZXJDYXNlKCksICJrSHoiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9NTS50b0xvd2VyQ2FzZSgpLCAibW0iKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9NUy50b0xvd2VyQ2FzZSgpLCAibXMiKTsvLyROT04tTkxTLTEkCi0JLy8gLy8gbWFwLnB1dChDU1NVbml0SUQuVV9OVU1CRVIudG9Mb3dlckNhc2UoKSwgIihudW1iZXIpIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUEMudG9Mb3dlckNhc2UoKSwgInBjIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUEVSQ0VOVEFHRS50b0xvd2VyQ2FzZSgpLCAiJSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1BULnRvTG93ZXJDYXNlKCksICJwdCIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1BYLnRvTG93ZXJDYXNlKCksICJweCIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1JBRC50b0xvd2VyQ2FzZSgpLCAicmFkIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUy50b0xvd2VyQ2FzZSgpLCAicyIpOy8vJE5PTi1OTFMtMSQKLQkvLyBmVmFsdWUgPSAoU3RyaW5nKW1hcC5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKTsKLQkvLyBpZiAoZlZhbHVlID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLyB9Ci0JLyoKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFVuaXRTdHJpbmcoKTsKLQl9Ci0KLQl2b2lkIHNldFVuaXRTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0VW5pdFN0cmluZygpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNZXRhTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTWV0YU1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjQwZGIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNZXRhTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1TdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotCi0KLWNsYXNzIENTU01ldGFNb2RlbEltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTWV0YU1vZGVsIHsKLQkvLyBjbGFzcyBDU1NNZXRhTW9kZWxJbXBsIGltcGxlbWVudHMgQ1NTTWV0YU1vZGVsIHsKLQlwdWJsaWMgQ1NTTWV0YU1vZGVsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJZk5vZGVQb29sID0gbmV3IE5vZGVQb29sKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9NRVRBX01PREVMOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX1NUWUxFX1NIRUVUIHx8IHR5cGUgPT0gVFlQRV9DQVRFR09SWSk7Ci0JfQotCi0JcHVibGljIENTU01NU3R5bGVTaGVldCBnZXRTdHlsZVNoZWV0KCkgewotCQlJdGVyYXRvciBpID0gZ2V0Q2hpbGROb2RlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSBub2RlID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXRUeXBlKCkgPT0gVFlQRV9TVFlMRV9TSEVFVCkgewotCQkJCXJldHVybiAoQ1NTTU1TdHlsZVNoZWV0KSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCQkvLyByZXR1cm4gZlN0eWxlU2hlZXQ7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENhdGVnb3JpZXMoKSB7Ci0JCUxpc3QgY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaSA9IGdldENoaWxkTm9kZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IFRZUEVfQ0FURUdPUlkpIHsKLQkJCQljYXRlZ29yaWVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2F0ZWdvcmllcy5pdGVyYXRvcigpOwotCX0KLQotCXZvaWQgbG9hZENvbXBsZXRlZCgpIHsKLQkJZk5vZGVQb29sID0gbnVsbDsKLQl9Ci0KLQkvLyBMaXN0IGZDYXRlZ29yaWVzID0gbnVsbDsKLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNpc1ZhbGlkKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldFN0eWxlU2hlZXQoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCU5vZGVQb29sIGdldE5vZGVQb29sKCkgewotCQlyZXR1cm4gZk5vZGVQb29sOwotCX0KLQotCi0JcHJpdmF0ZSBOb2RlUG9vbCBmTm9kZVBvb2wgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU1Byb2ZpbGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTUHJvZmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM0NWY0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTUHJvZmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0KLWNsYXNzIENTU1Byb2ZpbGVJbXBsIGltcGxlbWVudHMgQ1NTUHJvZmlsZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTWV0YU1vZGVsUHJvZmlsZUluZm9JbXBsLgotCSAqLwotCXByaXZhdGUgQ1NTUHJvZmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvSW1wbC4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJvZmlsZUltcGwoU3RyaW5nIGlkLCBVUkwgdXJsKSB7Ci0JCXRoaXMoKTsKLQkJZklEID0gaWQ7Ci0JCWZVUkwgPSB1cmw7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvSW1wbC4KLQkgKi8KLQlDU1NQcm9maWxlSW1wbChTdHJpbmcgaWQsIFVSTCB1cmwsIFN0cmluZyByZWxhdGl2ZVVSSSkgewotCQlzdXBlcigpOwotCQlmSUQgPSBpZDsKLQkJZlVSTCA9IHVybDsKLQkJZlJlbGF0aXZlVVJJID0gcmVsYXRpdmVVUkk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvI2dldFByb2ZpbGVJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9maWxlSUQoKSB7Ci0JCXJldHVybiBmSUQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvI2dldFByb2ZpbGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gKGZOYW1lID09IG51bGwpID8gZklEIDogZk5hbWU7Ci0JfQotCi0JcHVibGljIENTU01ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7Ci0JCWlmIChmTWV0YU1vZGVsID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBnZXRQcm9maWxlVVJMKCkub3BlblN0cmVhbSgpOwotCQkJCVByb2ZpbGVMb2FkZXIgbG9hZGVyID0gbmV3IFByb2ZpbGVMb2FkZXIoZ2V0UmVzb3VyY2VCdW5kbGUoKSwgZ2V0TG9nZ2luZygpKTsKLQkJCQlmTWV0YU1vZGVsID0gbG9hZGVyLmxvYWRQcm9maWxlKGlucHV0KTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ2Fubm90IG9wZW4gc3RyZWFtIGZvciBwcm9maWxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZk1ldGFNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0KLQkJQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCVN0cmluZyBwbHVnaW5JRCA9IGdldE93bmVyUGx1Z2luSUQoKTsKLQkJaWYgKHBsdWdpbklEICE9IG51bGwpIHsKLQkJCWJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQkvLyBuZWVkZWQgdG8gd29yayBhcm91bmQgRmlsZUxvY2F0b3Iub3BlblN0cmVhbSBub3QgbG9va2luZyBmb3IKLQkJCQkvLyBmaWxlcyB3aXRoIEphdmEgbmFtaW5nIGNvbnZlbnRpb25zIChCVUcxMDMzNDUpCi0JCQkJSVBhdGhbXSBwYXRocyA9IGdldFJlc291cmNlQnVuZGxlUGF0aHMoKTsKLQkJCQlpZiAocGF0aHMgIT0gbnVsbCkgewotCQkJCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7Ci0JCQkJCWludCBpID0gMDsKLQkJCQkJd2hpbGUgKGkgPCBwYXRocy5sZW5ndGggJiYgaW5TdHJlYW0gPT0gbnVsbCkgewotCQkJCQkJSVBhdGggcGF0aCA9IHBhdGhzW2ldOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpblN0cmVhbSA9IEZpbGVMb2NhdG9yLm9wZW5TdHJlYW0oYnVuZGxlLCBwYXRoLCB0cnVlKTsKLQkJCQkJCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkKLQkJCQkJCQkJcmVzb3VyY2VCdW5kbGUgPSBuZXcgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZShpblN0cmVhbSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQkrK2k7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIHVuYWJsZSB0byBvcGVuIHN0cmVhbSB3aXRoIGN1cnJlbnQgcGF0aCBzbyBqdXN0Ci0JCQkJCQkJLy8gdHJ5IG5leHQgcGF0aAotCQkJCQkJCSsraTsKLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCWlmIChpblN0cmVhbSAhPSBudWxsKQotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcG90ZW50aWFsIHJlc291cmNlIGJ1bmRsZSBwYXRocyBvciBudWxsIGlmIHRoZXJlCi0JICogYXJlIG5vbmUKLQkgKiAKLQkgKiBAcmV0dXJuIElQYXRoW10gb3IgbnVsbAotCSAqLwotCXByaXZhdGUgSVBhdGhbXSBnZXRSZXNvdXJjZUJ1bmRsZVBhdGhzKCkgewotCQlJUGF0aFtdIHBhdGhzID0gbmV3IElQYXRoWzBdOwotCi0JCWlmIChmUmVsYXRpdmVVUkkgIT0gbnVsbCkgewotCQkJLy8gb3JpZ2luYWwgcGF0aCA9IGxvY2F0aW9uIG9mIHByb2ZpbGUueG1sIC0gcHJvZmlsZS54bWwKLQkJCUlQYXRoIG9yaWdpbmFsUGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKGZSZWxhdGl2ZVVSSSkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCi0JCQlTdHJpbmcgYmFzZU5hbWUgPSAiY3NzcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQgCi0JCQlWZWN0b3IgbmFtZXMgPSBjYWxjdWxhdGVCdW5kbGVOYW1lcyhiYXNlTmFtZSwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0KLQkJCWludCBhID0gMDsKLQkJCXBhdGhzID0gbmV3IElQYXRoW25hbWVzLnNpemUoKV07Ci0JCQlmb3IgKGludCBpID0gbmFtZXMuc2l6ZSgpOyBpID4gMDsgLS1pKSB7Ci0JCQkJU3RyaW5nIGJ1bmRsZU5hbWUgPSAoU3RyaW5nKSBuYW1lcy5nZXQoaSAtIDEpOwotCQkJCUlQYXRoIHBhdGggPSBvcmlnaW5hbFBhdGguYXBwZW5kKGJ1bmRsZU5hbWUpLmFkZEZpbGVFeHRlbnNpb24oInByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXBhdGhzW2FdID0gcGF0aDsKLQkJCQkrK2E7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhdGhzOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgYnVuZGxlcyBhbG9uZyB0aGUgc2VhcmNoIHBhdGggZnJvbSB0aGUgYmFzZSBidW5kbGUgdG8gdGhlCi0JICogYnVuZGxlIHNwZWNpZmllZCBieSBiYXNlTmFtZSBhbmQgbG9jYWxlLjxiciAvPgotCSAqIAotCSAqIEBwYXJhbSBiYXNlTmFtZQotCSAqICAgICAgICAgICAgdGhlIGJhc2UgYnVuZGxlIG5hbWUKLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICB0aGUgbG9jYWxlCi0JICogQHBhcmFtIG5hbWVzCi0JICogICAgICAgICAgICB0aGUgdmVjdG9yIHVzZWQgdG8gcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgYnVuZGxlcyBhbG9uZyB0aGUKLQkgKiAgICAgICAgICAgIHNlYXJjaCBwYXRoLgotCSAqIAotCSAqLwotCXByaXZhdGUgVmVjdG9yIGNhbGN1bGF0ZUJ1bmRsZU5hbWVzKFN0cmluZyBiYXNlTmFtZSwgTG9jYWxlIGxvY2FsZSkgewotCSAgICAvLyB0aGlzIG1ldGhvZCBjYW4gYmUgZGVsZXRlZCBhZnRlciBCVUcxMDMzNDUgaXMgZml4ZWQKLQkJZmluYWwgVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3IoNCk7IC8vIGRlZmF1bHQgc2l6ZSA0Ci0JCWZpbmFsIFN0cmluZyBsYW5ndWFnZSA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotCQlmaW5hbCBpbnQgbGFuZ3VhZ2VMZW5ndGggPSBsYW5ndWFnZS5sZW5ndGgoKTsKLQkJZmluYWwgU3RyaW5nIGNvdW50cnkgPSBsb2NhbGUuZ2V0Q291bnRyeSgpOwotCQlmaW5hbCBpbnQgY291bnRyeUxlbmd0aCA9IGNvdW50cnkubGVuZ3RoKCk7Ci0JCWZpbmFsIFN0cmluZyB2YXJpYW50ID0gbG9jYWxlLmdldFZhcmlhbnQoKTsKLQkJZmluYWwgaW50IHZhcmlhbnRMZW5ndGggPSB2YXJpYW50Lmxlbmd0aCgpOwotCi0JCXJlc3VsdC5hZGRFbGVtZW50KGJhc2VOYW1lKTsgLy8gYXQgbGVhc3QgYWRkIGJhc2UgbmFtZQotCQlpZiAobGFuZ3VhZ2VMZW5ndGggKyBjb3VudHJ5TGVuZ3RoICsgdmFyaWFudExlbmd0aCA9PSAwKSB7Ci0JCQkvLyBUaGUgbG9jYWxlIGlzICIiLCAiIiwgIiIuCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciB0ZW1wID0gbmV3IFN0cmluZ0J1ZmZlcihiYXNlTmFtZSk7Ci0JCXRlbXAuYXBwZW5kKCdfJyk7Ci0JCXRlbXAuYXBwZW5kKGxhbmd1YWdlKTsKLQkJaWYgKGxhbmd1YWdlTGVuZ3RoID4gMCkgewotCQkJcmVzdWx0LmFkZEVsZW1lbnQodGVtcC50b1N0cmluZygpKTsKLQkJfQotCi0JCWlmIChjb3VudHJ5TGVuZ3RoICsgdmFyaWFudExlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXRlbXAuYXBwZW5kKCdfJyk7Ci0JCXRlbXAuYXBwZW5kKGNvdW50cnkpOwotCQlpZiAoY291bnRyeUxlbmd0aCA+IDApIHsKLQkJCXJlc3VsdC5hZGRFbGVtZW50KHRlbXAudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAodmFyaWFudExlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXRlbXAuYXBwZW5kKCdfJyk7Ci0JCXRlbXAuYXBwZW5kKHZhcmlhbnQpOwotCQlyZXN1bHQuYWRkRWxlbWVudCh0ZW1wLnRvU3RyaW5nKCkpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvI2dldFByb2ZpbGVVUkwoKQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0UHJvZmlsZVVSTCgpIHsKLQkJcmV0dXJuIGZVUkw7Ci0JfQotCi0Jdm9pZCBzZXRQcm9maWxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlmTmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gZkRlZmF1bHQ7Ci0JfQotCi0Jdm9pZCBzZXREZWZhdWx0KGJvb2xlYW4gaXNEZWZhdWx0KSB7Ci0JCWZEZWZhdWx0ID0gaXNEZWZhdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0T3duZXJQbHVnaW5JRCgpIHsKLQkJcmV0dXJuIGZPd25lclBsdWdpbklEOwotCX0KLQotCXZvaWQgc2V0T3duZXJQbHVnaW5JRChTdHJpbmcgcGx1Z2luSUQpIHsKLQkJZk93bmVyUGx1Z2luSUQgPSBwbHVnaW5JRDsKLQl9Ci0KLQkvKioKLQkgKiBoaWRkZW4gb3B0aW9uIDogbG9nZ2luZwotCSAqLwotCXZvaWQgc2V0TG9nZ2luZyhib29sZWFuIGxvZ2dpbmcpIHsKLQkJZkxvZ2dpbmcgPSBsb2dnaW5nOwotCX0KLQotCWJvb2xlYW4gZ2V0TG9nZ2luZygpIHsKLQkJcmV0dXJuIGZMb2dnaW5nOwotCX0KLQotCi0JU3RyaW5nIGZJRCA9IG51bGw7Ci0JU3RyaW5nIGZOYW1lID0gbnVsbDsKLQlVUkwgZlVSTCA9IG51bGw7Ci0JQ1NTTWV0YU1vZGVsIGZNZXRhTW9kZWwgPSBudWxsOwotCVN0cmluZyBmT3duZXJQbHVnaW5JRCA9IG51bGw7Ci0JYm9vbGVhbiBmRGVmYXVsdCA9IGZhbHNlOwotCWJvb2xlYW4gZkxvZ2dpbmcgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBmUmVsYXRpdmVVUkkgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU1Byb2ZpbGVUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTUHJvZmlsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiNWUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTUHJvZmlsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLQotCi1jbGFzcyBDU1NQcm9maWxlVGVzdCB7Ci0KLQotCS8qKgotCSAqIFRlc3QgdXNlIG9ubHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQlDU1NNZXRhTW9kZWwgbWV0YW1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IG5ldyBDU1NQcm9maWxlSW1wbCgidGVzdCIsIG5ldyBVUkwoYXJnc1swXSkpOyAvLyROT04tTkxTLTEkCi0JCQltZXRhbW9kZWwgPSBwcm9maWxlLmdldE1ldGFNb2RlbCgpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlpZiAobWV0YW1vZGVsID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvKgotCQkgKiBDU1NNTVR5cGVDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IENTU01NVHlwZUNvbGxlY3RvcigpOwotCQkgKiBjb2xsZWN0b3IuYXBwbHkobWV0YW1vZGVsLCBDU1NNTU5vZGUuVFlQRV9QUk9QRVJUWSk7IEl0ZXJhdG9yCi0JCSAqIGlQcm9wZXJ0eSA9IGNvbGxlY3Rvci5nZXROb2RlcygpOyB3aGlsZSAoaVByb3BlcnR5Lmhhc05leHQoKSkgewotCQkgKiBDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpaVByb3BlcnR5Lm5leHQoKTsKLQkJICogU3lzdGVtLm91dC5wcmludGxuKCJQcm9wZXJ0eSAiICsgbm9kZS5nZXROYW1lKCkgKyAiIGNhbiBjb250YWluOiIpOwotCQkgKiAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQgSXRlcmF0b3IgaVZhbHVlID0KLQkJICogbm9kZS5nZXREZXNjZW5kYW50cygpOyB3aGlsZSAoaVZhbHVlLmhhc05leHQoKSkgewotCQkgKiBkZWJ1Z091dCgoQ1NTTU1Ob2RlKWlWYWx1ZS5uZXh0KCksIDAsIGZhbHNlKTsgfSB9Ci0JCSAqLwotCQlkZWJ1Z091dChtZXRhbW9kZWwsIDAsIHRydWUpOwotCX0KLQotCXN0YXRpYyB2b2lkIGRlYnVnT3V0KENTU01NTm9kZSBub2RlLCBpbnQgZGVwdGgsIGJvb2xlYW4gcmVjdXJzaXZlKSB7Ci0JCVN0cmluZyB0eXBlID0gbm9kZS5nZXRUeXBlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnQoIlsgIiArIG5vZGUuZ2V0TmFtZSgpICsgIigiICsgdHlwZSArICIpIF0iKTsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJaWYgKHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfVU5JVCB8fCB0eXBlID09IENTU01NTm9kZS5UWVBFX0tFWVdPUkQgfHwgdHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9GVU5DVElPTiB8fCB0eXBlID09IENTU01NTm9kZS5UWVBFX1NFTEVDVE9SKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCIgLT4gIiArIG5vZGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotCQlpZiAocmVjdXJzaXZlKSB7Ci0JCQlqYXZhLnV0aWwuSXRlcmF0b3IgaU5vZGUgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCXdoaWxlIChpTm9kZS5oYXNOZXh0KCkpIHsKLQkJCQlkZWJ1Z091dCgoQ1NTTU1Ob2RlKSBpTm9kZS5uZXh0KCksIGRlcHRoICsgMSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvTWV0YU1vZGVsRXJyb3JzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvTWV0YU1vZGVsRXJyb3JzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYTM4MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL01ldGFNb2RlbEVycm9ycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbnRlcmZhY2UgTWV0YU1vZGVsRXJyb3JzIHsKLQotCXN0YXRpYyBmaW5hbCBzaG9ydCBOT19FUlJPUiA9IDA7Ci0KLQkvLyBNQVNLCi0Jc3RhdGljIGZpbmFsIHNob3J0IE1BU0tfV0FSTklORyA9IDB4MTAwMDsKLQlzdGF0aWMgZmluYWwgc2hvcnQgTUFTS19FUlJPUiA9IDB4MjAwMDsKLQotCS8vIEVSUk9SCi0Jc3RhdGljIGZpbmFsIHNob3J0IEVSUk9SX05PVF9ERUZJTkVEID0gTUFTS19FUlJPUiArIDB4MDE7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IEVSUk9SX0lOVkFMSURfTkFNRSA9IE1BU0tfRVJST1IgKyAweDA0OwotCXN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9JTlZBSUxEX0NISUxEID0gTUFTS19FUlJPUiArIDB4MDI7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IEVSUk9SX05PX0NISUxEID0gTUFTS19FUlJPUiArIDB4MDg7Ci0JLy8gc3RhdGljIGZpbmFsIHNob3J0IEVSUk9SX05PX0VTU0VOVElBTF9DSElMRCA9IE1BU0tfRVJST1IgKyAweDEwCi0KLQkvLyBXQVJOSU5HCi0Jc3RhdGljIGZpbmFsIHNob3J0IFdBUk5JTkdfSEFTX05PX0NISUxEID0gTUFTS19XQVJOSU5HICsgMHgwMTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Ob2RlUG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL05vZGVQb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Y2I1NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL05vZGVQb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotCi1jbGFzcyBOb2RlUG9vbCB7Ci0KLQlOb2RlUG9vbCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZUNsYXNzTmFtZVRhYmxlKCk7Ci0JfQotCi0JQ1NTTU1Ob2RlSW1wbCBnZXROb2RlKFN0cmluZyB0YWdOYW1lLCBTdHJpbmcgbm9kZU5hbWUpIHsKLQkJaWYgKG5vZGVOYW1lICE9IG51bGwpIHsKLQkJCW5vZGVOYW1lID0gbm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQlTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgY2xhc3NOYW1lcy5nZXQodGFnTmFtZSk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTWFwIG5vZGVzID0gKE1hcCkgbm9kZVJlZ2lzdHJ5LmdldChjbGFzc05hbWUpOwotCQlpZiAobm9kZXMgPT0gbnVsbCkgewotCQkJbm9kZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJbm9kZVJlZ2lzdHJ5LnB1dChjbGFzc05hbWUsIG5vZGVzKTsKLQkJfQotCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSAoQ1NTTU1Ob2RlSW1wbCkgbm9kZXMuZ2V0KG5vZGVOYW1lKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJbm9kZSA9IGNyZWF0ZU5ld05vZGUoY2xhc3NOYW1lKTsKLQkJCW5vZGVzLnB1dChub2RlTmFtZSwgbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBDU1NNTU5vZGVJbXBsIGNyZWF0ZU5ld05vZGUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSBudWxsOwotCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCWNsYXNzTmFtZSA9IGdldFBhY2thZ2VOYW1lKCkgKyAiLiIgKyBjbGFzc05hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJbm9kZSA9IChDU1NNTU5vZGVJbXBsKSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCX0KLQkJCWNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oY2xhc3NOYW1lICsgIiBpcyBDcmVhdGVkIik7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIEVycm9yIGNoZWNrIGZ1bmN0aW9uOiBmaW5kIG5vZGVzIHRoYXQgYXJlIG5vdCByZWZlcnJlZCBieSBhbnkgbm9kZQotCSAqLwotCUl0ZXJhdG9yIGdldFN0cmF5Tm9kZXMoKSB7Ci0JCUxpc3Qgc3RyYXlOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaU1hcCA9IG5vZGVSZWdpc3RyeS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaU1hcC5oYXNOZXh0KCkpIHsKLQkJCU1hcCBub2RlcyA9IChNYXApIGlNYXAubmV4dCgpOwotCQkJSXRlcmF0b3IgaU5vZGUgPSBub2Rlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGlOb2RlLmhhc05leHQoKSkgewotCQkJCUNTU01NTm9kZUltcGwgbm9kZSA9IChDU1NNTU5vZGVJbXBsKSBpTm9kZS5uZXh0KCk7Ci0JCQkJaWYgKG5vZGUuZ2V0UmVmZXJlbmNlQ291bnQoKSA9PSAwKSB7Ci0JCQkJCXN0cmF5Tm9kZXMuYWRkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RyYXlOb2Rlcy5pdGVyYXRvcigpOwotCX0KLQotCS8vIFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgaW5uZXIgY2xhc3MgOikKLQlwcml2YXRlIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLQkJaWYgKGZQYWNrYWdlTmFtZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQlpbnQgcG9zID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoMCA8IHBvcykgewotCQkJCWZQYWNrYWdlTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgcG9zKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZQYWNrYWdlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZQYWNrYWdlTmFtZTsKLQl9Ci0KLQl2b2lkIGluaXRpYWxpemVDbGFzc05hbWVUYWJsZSgpIHsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlNUWUxFU0hFRVRfREVGLCBDTEFTU19TVFlMRV9TSEVFVCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5DSEFSU0VUX1JVTEVfREVGLCBDTEFTU19DSEFSU0VUX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuQ0hBUlNFVF9SVUxFLCBDTEFTU19DSEFSU0VUX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuRk9OVEZBQ0VfUlVMRV9ERUYsIENMQVNTX0ZPTlRfRkFDRV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkZPTlRGQUNFX1JVTEUsIENMQVNTX0ZPTlRfRkFDRV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLklNUE9SVF9SVUxFX0RFRiwgQ0xBU1NfSU1QT1JUX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuSU1QT1JUX1JVTEUsIENMQVNTX0lNUE9SVF9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLk1FRElBX1JVTEVfREVGLCBDTEFTU19NRURJQV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLk1FRElBX1JVTEUsIENMQVNTX01FRElBX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUEFHRV9SVUxFX0RFRiwgQ0xBU1NfUEFHRV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBBR0VfUlVMRSwgQ0xBU1NfUEFHRV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlNUWUxFX1JVTEVfREVGLCBDTEFTU19TVFlMRV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlNUWUxFX1JVTEUsIENMQVNTX1NUWUxFX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUFJPUEVSVFlfREVGLCBDTEFTU19QUk9QRVJUWSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QUk9QRVJUWSwgQ0xBU1NfUFJPUEVSVFkpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuREVTQ1JJUFRPUl9ERUYsIENMQVNTX0RFU0NSSVBUT1IpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuREVTQ1JJUFRPUiwgQ0xBU1NfREVTQ1JJUFRPUik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5DT05UQUlORVJfREVGLCBDTEFTU19DT05UQUlORVIpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuQ09OVEFJTkVSLCBDTEFTU19DT05UQUlORVIpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuTlVNQkVSX0RFRiwgQ0xBU1NfTlVNQkVSKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLk5VTUJFUiwgQ0xBU1NfTlVNQkVSKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLktFWVdPUkRfREVGLCBDTEFTU19LRVlXT1JEKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLktFWVdPUkQsIENMQVNTX0tFWVdPUkQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuVU5JVCwgQ0xBU1NfVU5JVCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5VTklUX0RFRiwgQ0xBU1NfVU5JVCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5GVU5DVElPTiwgQ0xBU1NfRlVOQ1RJT04pOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuRlVOQ1RJT05fREVGLCBDTEFTU19GVU5DVElPTik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5TRUxFQ1RPUl9FWFBSRVNTSU9OLCBDTEFTU19TRUxFQ1RPUl9FWFBSRVNTSU9OKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBTRVVET19FTEVNRU5ULCBDTEFTU19QU0VVRE9fRUxFTUVOVCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QU0VVRE9fRUxFTUVOVF9ERUYsIENMQVNTX1BTRVVET19FTEVNRU5UKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBTRVVET19DTEFTUywgQ0xBU1NfUFNFVURPX0NMQVNTKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBTRVVET19DTEFTU19ERUYsIENMQVNTX1BTRVVET19DTEFTUyk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5TVFJJTkcsIENMQVNTX1NUUklORyk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5DQVRFR09SWV9ERUYsIENMQVNTX0NBVEVHT1JZKTsKLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZQYWNrYWdlTmFtZTsKLQkvKgotCSAqIENvbnZlcnNpb24gVGFibGVzIG5vZGVSZWdpc3RyeSA6IGNsYXNzIG5hbWUgLT4gaGFzaCBvZiBub2RlIGluc3RhbmNlcwotCSAqIGNsYXNzTmFtZXMgOiBQcm9maWxlIFRhZyBuYW1lIC0+IGphdmEgY2xhc3MgbmFtZQotCSAqLwotCXByaXZhdGUgTWFwIG5vZGVSZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgY2xhc3NOYW1lcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfU1RZTEVfU0hFRVQgPSAiQ1NTTU1TdHlsZVNoZWV0SW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfQ0hBUlNFVF9SVUxFID0gIkNTU01NQ2hhcnNldFJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19GT05UX0ZBQ0VfUlVMRSA9ICJDU1NNTUZvbnRGYWNlUnVsZUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0lNUE9SVF9SVUxFID0gIkNTU01NSW1wb3J0UnVsZUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX01FRElBX1JVTEUgPSAiQ1NTTU1NZWRpYVJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19QQUdFX1JVTEUgPSAiQ1NTTU1QYWdlUnVsZUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1NUWUxFX1JVTEUgPSAiQ1NTTU1TdHlsZVJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19QUk9QRVJUWSA9ICJDU1NNTVByb3BlcnR5SW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfREVTQ1JJUFRPUiA9ICJDU1NNTURlc2NyaXB0b3JJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19DT05UQUlORVIgPSAiQ1NTTU1Db250YWluZXJJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19OVU1CRVIgPSAiQ1NTTU1OdW1iZXJJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19LRVlXT1JEID0gIkNTU01NS2V5d29yZEltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1VOSVQgPSAiQ1NTTU1Vbml0SW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfRlVOQ1RJT04gPSAiQ1NTTU1GdW5jdGlvbkltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1NUUklORyA9ICJDU1NNTVN0cmluZ0ltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0NBVEVHT1JZID0gIkNTU01NQ2F0ZWdvcnlJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19TRUxFQ1RPUl9FWFBSRVNTSU9OID0gIkNTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfUFNFVURPX0NMQVNTID0gIkNTU01NUHNldWRvQ2xhc3NJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19QU0VVRE9fRUxFTUVOVCA9ICJDU1NNTVBzZXVkb0VsZW1lbnRJbXBsIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhNmIzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLQotY2xhc3MgUHJvZmlsZUhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0KLQlwdWJsaWMgUHJvZmlsZUhhbmRsZXIoQ1NTTWV0YU1vZGVsSW1wbCBtZXRhbW9kZWwsIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLCBib29sZWFuIGxvZ2dpbmcpIHsKLQkJc3VwZXIoKTsKLQkJZk1ldGFNb2RlbCA9IG1ldGFtb2RlbDsKLQkJZk5vZGVQb29sID0gbWV0YW1vZGVsLmdldE5vZGVQb29sKCk7Ci0JCWZSZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotCQlmTG9nZ2luZyA9IGxvZ2dpbmc7Ci0JfQotCi0JcHVibGljIFByb2ZpbGVIYW5kbGVyKENTU01ldGFNb2RlbEltcGwgbWV0YW1vZGVsLCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSkgewotCQlzdXBlcigpOwotCQlmTWV0YU1vZGVsID0gbWV0YW1vZGVsOwotCQlmTm9kZVBvb2wgPSBtZXRhbW9kZWwuZ2V0Tm9kZVBvb2woKTsKLQkJZlJlc291cmNlQnVuZGxlID0gcmVzb3VyY2VCdW5kbGU7Ci0JCWZMb2dnaW5nID0gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5LmVxdWFscygiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQkJaWYgKCFrZXkuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQkJaWYgKGtleS5zdGFydHNXaXRoKCIlJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBrZXkuc3Vic3RyaW5nKDEpOwotCQl9Ci0KLQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZlJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkuc3Vic3RyaW5nKDEpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic3RhcnREb2N1bWVudCIpOwotCQkvLyBmTm9kZVN0YWNrLnB1c2gobWV0YW1vZGVsKTsKLQkJLy8gZkN1cnJlbnROb2RlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQluZXcgRXJyb3JDb3JyZWN0b3IoKS5kb0NvcnJlY3QoZk1ldGFNb2RlbCk7Ci0JCWlmIChmTG9nZ2luZykgewotCQkJSXRlcmF0b3IgaSA9IGZOb2RlUG9vbC5nZXRTdHJheU5vZGVzKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJCVN0cmluZyBzdHIgPSAiW0NTU1Byb2ZpbGUgV2FybmluZ10gIiArIG5vZGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJc3RyICs9ICIoIiArIG5vZGUuZ2V0VHlwZSgpICsgIikgaXMgbm90IHJlZmVycmVkIGJ5IGFueSBub2RlLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsIHN0cik7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHN0cik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlUYWdOb2RlIHRhZ05vZGUgPSBudWxsOwotCQlDU1NNTU5vZGVJbXBsIHBhcmVudE5vZGUgPSBudWxsOwotCQlpZiAoMCA8IGZOb2RlU3RhY2suc2l6ZSgpKSB7Ci0JCQl0YWdOb2RlID0gKFRhZ05vZGUpIGZOb2RlU3RhY2sucGVlaygpOwotCQkJcGFyZW50Tm9kZSA9IHRhZ05vZGUubm9kZTsKLQkJfQotCi0JCUNTU01NTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0JCWlmIChxTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlBST0ZJTEVfSU1QT1JUKSkgeyAvLyBpbXBvcnQKLQkJCVN0cmluZyBwcm9maWxlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9OQU1FX1JFRkVSRU5DRSk7Ci0JCQlpbXBvcnRQcm9maWxlKHByb2ZpbGVOYW1lKTsKLQkJfQotCQllbHNlIGlmIChpc0RlZmluaXRpb24ocU5hbWUpKSB7IC8vIG5vZGUgY3JlYXRpb24KLQkJCVN0cmluZyBub2RlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9OQU1FX0RFRklOSVRJT04pOwotCQkJbm9kZSA9IGZOb2RlUG9vbC5nZXROb2RlKHFOYW1lLCBub2RlTmFtZSk7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG92ZXJ3cml0ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9PVkVSV1JJVEUpOwotCQkJCWlmIChvdmVyd3JpdGUgPT0gbnVsbCB8fCBvdmVyd3JpdGUuZXF1YWxzKEFUVFJfVkFMVUVfT1ZFUldSSVRFX0ZBTFNFKSkgewotCQkJCQlub2RlLnJlbW92ZUFsbENoaWxkTm9kZXMoKTsKLQkJCQl9Ci0JCQkJTWFwIGF0dHJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWF0dHJNYXAucHV0KGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSksIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSkpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlub2RlLmluaXRpYWxpemVBdHRyaWJ1dGUoYXR0ck1hcCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlID09IG51bGwpIHsgLy8gbm9kZSByZWZlcmVuY2UKLQkJCVN0cmluZyBub2RlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9OQU1FX1JFRkVSRU5DRSk7Ci0JCQlub2RlID0gZk5vZGVQb29sLmdldE5vZGUocU5hbWUsIG5vZGVOYW1lKTsKLQkJfQotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChwYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5jYW5Db250YWluKG5vZGUpKSB7Ci0JCQkJU3RyaW5nIGVuYWJsZWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfRU5BQkxFRCk7Ci0JCQkJaWYgKGVuYWJsZWQgIT0gbnVsbCAmJiBlbmFibGVkLmVxdWFscyhBVFRSX1ZBTFVFX0VOQUJMRURfRkFMU0UpKSB7Ci0JCQkJCXBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX1NUWUxFX1NIRUVUIHx8IG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX0NBVEVHT1JZKSB7Ci0JCQkJZk1ldGFNb2RlbC5hcHBlbmRDaGlsZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChmTG9nZ2luZyAmJiBwYXJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIHBhcmVudE5vZGUuZ2V0VHlwZSgpICsgIiBjYW5ub3QgY29udGFpbiAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlub2RlLmdldFR5cGUoKSArICIgKCIgKyBxTmFtZSArICIpIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZk5vZGVTdGFjay5wdXNoKG5ldyBUYWdOb2RlKHFOYW1lLCAobm9kZSAhPSBudWxsKSA/IG5vZGUgOiBwYXJlbnROb2RlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlmTm9kZVN0YWNrLnBvcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlUYWdOb2RlIHRhZ05vZGUgPSAoVGFnTm9kZSkgZk5vZGVTdGFjay5wZWVrKCk7Ci0JCVN0cmluZyB0YWdOYW1lID0gdGFnTm9kZS50YWc7Ci0JCWlmICh0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuS0VZV09SRF9WQUxVRSkgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlVOSVRfVkFMVUUpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5GVU5DVElPTl9WQUxVRSkgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlNFTEVDVE9SX1ZBTFVFKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuREVTQ1JJUFRJT04pIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5DQVBUSU9OKSkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlidWYuYXBwZW5kKGNoW3N0YXJ0ICsgaV0pOwotCQkJfQotCQkJU3RyaW5nIHZhbHVlID0gZ2V0UmVzb3VyY2VTdHJpbmcoYnVmLnRvU3RyaW5nKCkudHJpbSgpKTsKLQkJCUNTU01NTm9kZUltcGwgbm9kZSA9IHRhZ05vZGUubm9kZTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfS0VZV09SRCAmJiB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuS0VZV09SRF9WQUxVRSkpIHsKLQkJCQkJKChDU1NNTUtleXdvcmRJbXBsKSBub2RlKS5zZXRLZXl3b3JkU3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfVU5JVCAmJiB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuVU5JVF9WQUxVRSkpIHsKLQkJCQkJKChDU1NNTVVuaXRJbXBsKSBub2RlKS5zZXRVbml0U3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfRlVOQ1RJT04gJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkZVTkNUSU9OX1ZBTFVFKSkgewotCQkJCQkoKENTU01NRnVuY3Rpb25JbXBsKSBub2RlKS5zZXRGdW5jdGlvblN0cmluZyh2YWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX1NFTEVDVE9SICYmICgoQ1NTTU1TZWxlY3Rvcikgbm9kZSkuZ2V0U2VsZWN0b3JUeXBlKCkgPT0gQ1NTTU1TZWxlY3Rvci5UWVBFX1BTRVVET19FTEVNRU5UKSB7Ci0JCQkJCSgoQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbCkgbm9kZSkuc2V0U2VsZWN0b3JTdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9TRUxFQ1RPUiAmJiAoKENTU01NU2VsZWN0b3IpIG5vZGUpLmdldFNlbGVjdG9yVHlwZSgpID09IENTU01NU2VsZWN0b3IuVFlQRV9QU0VVRE9fQ0xBU1MpIHsKLQkJCQkJKChDU1NNTVBzZXVkb0NsYXNzSW1wbCkgbm9kZSkuc2V0U2VsZWN0b3JTdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9DQVRFR09SWSAmJiB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ0FQVElPTikpIHsKLQkJCQkJKChDU1NNTUNhdGVnb3J5SW1wbCkgbm9kZSkuc2V0Q2FwdGlvbih2YWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5ERVNDUklQVElPTikpIHsKLQkJCQkJbm9kZS5zZXREZXNjcmlwdGlvbih2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVmaW5pdGlvbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gKHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TVFlMRVNIRUVUX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkNIQVJTRVRfUlVMRV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5JTVBPUlRfUlVMRV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5QQUdFX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuTUVESUFfUlVMRV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5GT05URkFDRV9SVUxFX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlNUWUxFX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuS0VZV09SRF9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5OVU1CRVJfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuUFJPUEVSVFlfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuREVTQ1JJUFRPUl9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5DT05UQUlORVJfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuVU5JVF9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5GVU5DVElPTl9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TVFJJTkcpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5DQVRFR09SWV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5QU0VVRE9fQ0xBU1NfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuUFNFVURPX0VMRU1FTlRfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuU0VMRUNUT1JfRVhQUkVTU0lPTikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlNFUEFSQVRPUikpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbXBvcnRQcm9maWxlKFN0cmluZyBwcm9maWxlTmFtZSkgewotCQlVUkwgcHJvZmlsZVVSTCA9IG51bGw7Ci0JCUNTU1Byb2ZpbGVSZWdpc3RyeSByZWcgPSBDU1NQcm9maWxlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gcmVnLmdldFByb2ZpbGUocHJvZmlsZU5hbWUpOwotCQlpZiAocHJvZmlsZSAhPSBudWxsKSB7Ci0JCQkvLyBmaXJzdDogZmluZCBVUkwgYnkgSUQKLQkJCXByb2ZpbGVVUkwgPSBwcm9maWxlLmdldFByb2ZpbGVVUkwoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHNlY29uZDogZmluZCBVUkwgYnkgZmlsZW5hbWUgb2YgcHJvZmlsZSBVUkwKLQkJCUl0ZXJhdG9yIGkgPSByZWcuZ2V0UHJvZmlsZXMoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCXByb2ZpbGUgPSAoQ1NTUHJvZmlsZSkgaS5uZXh0KCk7Ci0JCQkJVVJMIHVybCA9IHByb2ZpbGUuZ2V0UHJvZmlsZVVSTCgpOwotCQkJCWlmICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKHByb2ZpbGVOYW1lKSkgewotCQkJCQlwcm9maWxlVVJMID0gdXJsOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb2ZpbGVVUkwgPT0gbnVsbCkgewotCQkJLy8gZmluYWw6IGl0IG1heSBiZSB1cmwgaXRzZWxmCi0JCQl0cnkgewotCQkJCXByb2ZpbGVVUkwgPSBuZXcgVVJMKHByb2ZpbGVOYW1lKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb2ZpbGVVUkwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlQcm9maWxlTG9hZGVyLmxvYWRQcm9maWxlKGZNZXRhTW9kZWwsIHByb2ZpbGVVUkwub3BlblN0cmVhbSgpLCBmUmVzb3VyY2VCdW5kbGUsIGZMb2dnaW5nKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ2Fubm90IG9wZW4gc3RyZWFtIGZvciBwcm9maWxlIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWUpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgVGFnTm9kZSB7Ci0KLQkJU3RyaW5nIHRhZyA9IG51bGw7Ci0JCUNTU01NTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0KLQkJVGFnTm9kZShTdHJpbmcgdGFnLCBDU1NNTU5vZGVJbXBsIG5vZGUpIHsKLQkJCXRoaXMudGFnID0gdGFnOwotCQkJdGhpcy5ub2RlID0gbm9kZTsKLQkJfQotCX0KLQotCWNsYXNzIEVycm9yQ29ycmVjdG9yIHsKLQotCQl2b2lkIGRvQ29ycmVjdChDU1NNTU5vZGVJbXBsIG5vZGUpIHsKLQkJCUl0ZXJhdG9yIGkgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCUFycmF5TGlzdCBlcnJvck5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTTU1Ob2RlSW1wbCBjaGlsZCA9IChDU1NNTU5vZGVJbXBsKSBpLm5leHQoKTsKLQkJCQlkb0NvcnJlY3QoY2hpbGQpOwotCQkJCXNob3J0IGVycm9yID0gY2hpbGQuZ2V0RXJyb3IoKTsKLQkJCQlpZiAoZXJyb3IgIT0gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SKSB7Ci0JCQkJCS8vIG5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQllcnJvck5vZGVzLmFkZChjaGlsZCk7Ci0KLQkJCQkJU3RyaW5nIHN0ciA9ICJbQ1NTUHJvZmlsZSBFcnJvcl0gIiArIG5vZGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0ciArPSAiKCIgKyBub2RlLmdldFR5cGUoKSArICIpIGNvbnRhaW5zIGVycm9yIG5vZGU6ICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlzdHIgKz0gY2hpbGQuZ2V0TmFtZSgpICsgIigiICsgY2hpbGQuZ2V0VHlwZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJc3RyICs9ICIgLSBlcnJvciBjb2RlID0gIiArIGVycm9yOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChmTG9nZ2luZykgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIHN0cik7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWludCBlcnJvclNpemUgPSBlcnJvck5vZGVzLnNpemUoKTsKLQkJCWlmIChlcnJvclNpemUgPiAwKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlcnJvclNpemU7IGorKykgewotCQkJCQlDU1NNTU5vZGVJbXBsIGVycm9yTm9kZSA9IChDU1NNTU5vZGVJbXBsKSBlcnJvck5vZGVzLmdldChqKTsKLQkJCQkJbm9kZS5yZW1vdmVDaGlsZChlcnJvck5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBDU1NNZXRhTW9kZWxJbXBsIGZNZXRhTW9kZWwgPSBudWxsOwotCXByaXZhdGUgTm9kZVBvb2wgZk5vZGVQb29sID0gbnVsbDsKLQlwcml2YXRlIFN0YWNrIGZOb2RlU3RhY2sgPSBuZXcgU3RhY2soKTsKLQlib29sZWFuIGZMb2dnaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfTkFNRV9ERUZJTklUSU9OID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfTkFNRV9SRUZFUkVOQ0UgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9PVkVSV1JJVEUgPSAib3ZlcndyaXRlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX0VOQUJMRUQgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9WQUxVRV9PVkVSV1JJVEVfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfVkFMVUVfRU5BQkxFRF9GQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlS2V5d29yZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlS2V5d29yZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM3NzEzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUtleXdvcmRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWludGVyZmFjZSBQcm9maWxlS2V5d29yZHMgewotCi0JZmluYWwgc3RhdGljIFN0cmluZyBDU1NfUFJPRklMRSA9ICJjc3MtcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0ZJTEVfSU1QT1JUID0gInByb2ZpbGUtaW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEVTSEVFVF9ERUYgPSAic3R5bGVzaGVldC1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDSEFSU0VUX1JVTEUgPSAiY2hhcnNldC1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QT1JUX1JVTEUgPSAiaW1wb3J0LXJ1bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQQUdFX1JVTEUgPSAicGFnZS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTUVESUFfUlVMRSA9ICJtZWRpYS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRk9OVEZBQ0VfUlVMRSA9ICJmb250ZmFjZS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEVfUlVMRSA9ICJzdHlsZS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ0hBUlNFVF9SVUxFX0RFRiA9ICJjaGFyc2V0LXJ1bGUtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QT1JUX1JVTEVfREVGID0gImltcG9ydC1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBBR0VfUlVMRV9ERUYgPSAicGFnZS1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1FRElBX1JVTEVfREVGID0gIm1lZGlhLXJ1bGUtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRk9OVEZBQ0VfUlVMRV9ERUYgPSAiZm9udGZhY2UtcnVsZS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRV9SVUxFX0RFRiA9ICJzdHlsZS1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZVTkNUSU9OX0RFRiA9ICJmdW5jdGlvbi1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGVU5DVElPTl9WQUxVRSA9ICJmdW5jdGlvbi12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtFWVdPUkRfREVGID0gImtleXdvcmQtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS0VZV09SRF9WQUxVRSA9ICJrZXl3b3JkLXZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBOVU1CRVJfREVGID0gIm51bWJlci1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVTklUID0gInVuaXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVTklUX0RFRiA9ICJ1bml0LWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVOSVRfVkFMVUUgPSAidW5pdC12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9ERUYgPSAiY29udGFpbmVyLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0RFRiA9ICJjYXRlZ29yeS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDQVBUSU9OID0gImNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9ERUYgPSAicHJvcGVydHktZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRPUl9ERUYgPSAiZGVzY3JpcHRvci1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTRUxFQ1RPUl9FWFBSRVNTSU9OID0gInNlbGVjdG9yLWV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQU0VVRE9fQ0xBU1MgPSAicHNldWRvLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFNFVURPX0VMRU1FTlQgPSAicHNldWRvLWVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQU0VVRE9fQ0xBU1NfREVGID0gInBzZXVkby1jbGFzcy1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQU0VVRE9fRUxFTUVOVF9ERUYgPSAicHNldWRvLWVsZW1lbnQtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU0VMRUNUT1JfVkFMVUUgPSAic2VsZWN0b3ItdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBOVU1CRVIgPSAibnVtYmVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS0VZV09SRCA9ICJrZXl3b3JkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRlVOQ1RJT04gPSAiZnVuY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDT05UQUlORVIgPSAiY29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSU5HID0gInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUEFSQVRPUiA9ICJzZXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0NSSVBUT1IgPSAiZGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDQyYWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNZXRhTW9kZWw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotCi0KLWNsYXNzIFByb2ZpbGVMb2FkZXIgewotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUHJvZmlsZUxvYWRlci4KLQkgKi8KLQlwcml2YXRlIFByb2ZpbGVMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JUHJvZmlsZUxvYWRlcihSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgYm9vbGVhbiBsb2dnaW5nKSB7Ci0JCXRoaXMoKTsKLQkJZlJlc291cmNlQnVuZGxlID0gcmVzb3VyY2VCdW5kbGU7Ci0JCWZMb2dnaW5nID0gbG9nZ2luZzsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBsb2FkUHJvZmlsZShDU1NNZXRhTW9kZWxJbXBsIG1ldGFtb2RlbCwgSW5wdXRTdHJlYW0gaW5wdXQsIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLCBib29sZWFuIGxvZ2dpbmcpIHsKLQkJdHJ5IHsKLQkJCVhNTFJlYWRlciB4bWxSZWFkZXIgPSBYTUxSZWFkZXJVdGlsLmNyZWF0ZVhNTFJlYWRlcihQQVJTRVJfTkFNRSk7Ci0JCQkvLyBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcihQQVJTRVJfTkFNRSk7Ci0JCQl4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IFByb2ZpbGVIYW5kbGVyKG1ldGFtb2RlbCwgcmVzb3VyY2VCdW5kbGUsIGxvZ2dpbmcpKTsKLQkJCXhtbFJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW5wdXQpKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlDU1NNZXRhTW9kZWwgbG9hZFByb2ZpbGUoSW5wdXRTdHJlYW0gaW5wdXQpIHsKLQkJaWYgKGZNZXRhTW9kZWwgPT0gbnVsbCkgewotCQkJZk1ldGFNb2RlbCA9IG5ldyBDU1NNZXRhTW9kZWxJbXBsKCk7Ci0JCX0KLQkJbG9hZFByb2ZpbGUoZk1ldGFNb2RlbCwgaW5wdXQsIGZSZXNvdXJjZUJ1bmRsZSwgZkxvZ2dpbmcpOwotCQlmTWV0YU1vZGVsLmxvYWRDb21wbGV0ZWQoKTsKLQkJcmV0dXJuIGZNZXRhTW9kZWw7Ci0JfQotCi0KLQlDU1NNZXRhTW9kZWxJbXBsIGZNZXRhTW9kZWwgPSBudWxsOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQVJTRVJfTkFNRSA9ICJvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZMb2dnaW5nID0gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQ4M2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUmVnaXN0cnlSZWFkZXIgewotCi0JLy8KLQlwcml2YXRlIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJjc3Nwcm9maWxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIFRBR19OQU1FID0gInByb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEFUVF9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX1VSSSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBBVFRfTE9HR0lORyA9ICJsb2dnaW5nIjsgLy8gSGlkZGVuIE9wdGlvbiAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTWV0YU1vZGVsUmVnaXN0cnlSZWFkZXIuCi0JICovCi0JcHVibGljIFJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDU1NQcm9maWxlIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNTU1Byb2ZpbGVJbXBsIGluZm8gPSBudWxsOwotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkgewotCQkJU3RyaW5nIHN0cklEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJCVN0cmluZyBzdHJOQU1FID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUUpOwotCQkJU3RyaW5nIHN0clVSSSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9VUkkpOwotCi0JCQlpZiAoc3RySUQgIT0gbnVsbCB8fCBzdHJVUkkgIT0gbnVsbCkgewotCQkJCUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0JCQkJYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoc3RyVVJJKTsKLQkJCQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBwYXRoLCBudWxsKTsKLQkJCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXVybCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTCh1cmwpOwotCQkJCQkJCWluZm8gPSBuZXcgQ1NTUHJvZmlsZUltcGwoc3RySUQsIHVybCwgc3RyVVJJKTsKLQkJCQkJCQlpbmZvLnNldFByb2ZpbGVOYW1lKHN0ck5BTUUpOwotCQkJCQkJCWluZm8uc2V0RGVmYXVsdCgoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RFRkFVTFQpICE9IG51bGwpKTsKLQkJCQkJCQlpbmZvLnNldExvZ2dpbmcoKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9MT0dHSU5HKSAhPSBudWxsKSk7Ci0JCQkJCQkJaW5mby5zZXRPd25lclBsdWdpbklEKHBsdWdpbklkKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyB0aHJvdWdoCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ1NTIFByb2ZpbGU6ICIgKyBzdHJJRCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBXZSBzaW1wbHkgcmVxdWlyZSBhbiAnYWRkJyBtZXRob2QsIG9mIHdoYXQgZXZlciBpdCBpcyB3ZSBhcmUgdG8gcmVhZAotCSAqIGludG8KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZW51bVByb2ZpbGVzKCkgewotCQlTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlDU1NQcm9maWxlIGluZm8gPSByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQkJLy8gbnVsbCBjYW4gYmUgcmV0dXJuZWQgaWYgdGhlcmUncyBhbiBlcnJvciByZWFkaW5nIHRoZQotCQkJCS8vIGVsZW1lbnQKLQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCXNldC5hZGQoaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzZXQuaXRlcmF0b3IoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9WYWx1ZUNvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1ZhbHVlQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYjQ3YWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1ZhbHVlQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxUcmF2ZXJzZXI7Ci0KLQotCi1jbGFzcyBWYWx1ZUNvbGxlY3RvciBleHRlbmRzIENTU01ldGFNb2RlbFRyYXZlcnNlciB7Ci0JcHVibGljIHZvaWQgYmVnaW4oQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJZk5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKENTU01NTm9kZSBub2RlKSB7Ci0JCXNob3J0IHJjID0gVFJBVl9DT05UOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IG5vZGUuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkgfHwgdHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9ERVNDUklQVE9SIHx8IHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfQ09OVEFJTkVSKSB7Ci0JCQkJcmMgPSBUUkFWX0NPTlQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZOb2Rlcy5jb250YWlucyhub2RlKSkgewotCQkJCQlmTm9kZXMuYWRkKG5vZGUpOwotCQkJCQlyYyA9IFRSQVZfUFJVTkU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Tm9kZXMoKSB7Ci0JCXJldHVybiBmTm9kZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQotCXByaXZhdGUgTGlzdCBmTm9kZXMgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1hNTFJlYWRlclV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9YTUxSZWFkZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDMxOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1hNTFJlYWRlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotCi0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotCi1jbGFzcyBYTUxSZWFkZXJVdGlsIHsKLQotCXN0YXRpYyBwdWJsaWMgWE1MUmVhZGVyIGNyZWF0ZVhNTFJlYWRlcihTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCkuZ2V0WE1MUmVhZGVyKCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0NTU01vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9DU1NNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjJhMzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0NTU01vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU01vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NNb2RlbExvYWRlciBleHRlbmRzIEFic3RyYWN0TW9kZWxMb2FkZXIgewotCS8qKgotCSAqIENTU0xvYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDU1NNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vZGVsTG9hZGVyI25ld01vZGVsKCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG5ldyBDU1NNb2RlbEltcGwoKTsKLQkJLy8gbm93IGRvbmUgaW4gY3JlYXRlCi0JCS8vIG1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCS8vIG1vZGVsLnNldEZhY3RvcnlSZWdpc3RyeShkZWZhdWx0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBDU1NNb2RlbExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCWlmIChkb2N1bWVudExvYWRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBuZXcgQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjAwM2I0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlckZvckNTUyBleHRlbmRzIEFic3RyYWN0TW9kZWxIYW5kbGVyIGltcGxlbWVudHMgSU1vZGVsSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXN0YXRpYyBTdHJpbmcgQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckNTUygpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJRCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IENTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NEb2N1bWVudExvYWRlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDb250ZW50VHlwZURlc2NyaXB0aW9uI2dldE1vZGVsTG9hZGVyKCkKLQkgKi8KLQlwdWJsaWMgSU1vZGVsTG9hZGVyIGdldE1vZGVsTG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IENTU01vZGVsTG9hZGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NSZWdpb25VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NSZWdpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTJiOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTUmVnaW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTUmVnaW9uVXRpbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWNsYXJhdGlvblZhbHVlVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogdGhlc2UgdHlwZSBjYW4gYmUgYmVnZ2luaW5nIG9mIHNlbGVjdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VsZWN0b3JCZWdnaW5pbmdUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUKTsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlY2xhcmF0aW9uVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiB8fCBpc0RlY2xhcmF0aW9uVmFsdWVUeXBlKHR5cGUpIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUik7Ci0JfQotCi0JLyoqCi0JICogVGhlc2UgdHlwZXMgY29uc2lzdCBzZWxlY3RvciByZWdpb24KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZWxlY3RvclR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9TRVBBUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1NvdXJjZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTU291cmNlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMTMzNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci0KLQotcHVibGljIGNsYXNzIENTU1NvdXJjZVBhcnNlciBpbXBsZW1lbnRzIFJlZ2lvblBhcnNlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9TVFlMRVNIRUVUID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFQ0xBUkFUSU9OID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFID0gMjsKLQotCXByaXZhdGUgbG9uZyBmU3RhcnRUaW1lOwotCXByaXZhdGUgbG9uZyBmU3RvcFRpbWU7Ci0JcHJpdmF0ZSBJQ1NTVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJzZXJNb2RlKGludCBtb2RlKSB7Ci0JCWludCBpbml0aWFsU3RhdGU7Ci0JCWludCBidWZzaXplOwotCQlzd2l0Y2ggKG1vZGUpIHsKLQkJCWNhc2UgTU9ERV9TVFlMRVNIRUVUIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuWVlJTklUSUFMOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFX0RFQ0xBUkFUSU9OIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuU1RfREVDTEFSQVRJT047Ci0JCQkJYnVmc2l6ZSA9IENTU1Rva2VuaXplci5CVUZGRVJfU0laRV9OT1JNQUw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PREVfREVDTEFSQVRJT05fVkFMVUUgOgotCQkJCWluaXRpYWxTdGF0ZSA9IENTU1Rva2VuaXplci5TVF9ERUNMQVJBVElPTl9QUkVfVkFMVUU7Ci0JCQkJYnVmc2l6ZSA9IENTU1Rva2VuaXplci5CVUZGRVJfU0laRV9TTUFMTDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybjsKLQkJfQotCQlpZiAoMCA8IGluaXRpYWxTdGF0ZSkgewotCQkJSUNTU1Rva2VuaXplciB0b2tlbml6ZXIgPSBnZXRUb2tlbml6ZXIoKTsKLQkJCXRva2VuaXplci5zZXRJbml0aWFsU3RhdGUoaW5pdGlhbFN0YXRlKTsKLQkJCXRva2VuaXplci5zZXRJbml0aWFsQnVmZmVyU2l6ZShidWZzaXplKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9ucygpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkbm9kZSA9IG51bGw7Ci0JCWlmIChoZWFkbm9kZSA9PSBudWxsKSB7Ci0JCQlpZiAoRGVidWcucGVyZlRlc3QpIHsKLQkJCQlmU3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQloZWFkbm9kZSA9IHBhcnNlTm9kZXMoKTsKLQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCkgewotCQkJCWZTdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIC0tIGNyZWF0aW5nIG5vZGVzIG9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQgLS0gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBUaW1lIHBhcnNlIGFuZCBpbml0IGFsbCByZWdpb25zOiAiICsgKGZTdG9wVGltZSAtIGZTdGFydFRpbWUpICsgIiAobXNlY3MpIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZm9yICIgKyBmUmVnaW9ucy5zaXplKCkgKyAiCi0JCQkJLy8gUmVnaW9ucyIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICBhbmQgIiArIF9jb3VudE5vZGVzKGhlYWRub2RlKSArICIgTm9kZXMiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGVhZG5vZGU7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IG51bGw7Ci0JCWlmICghZ2V0VG9rZW5pemVyKCkuaXNFT0YoKSkgewotCQkJaGVhZE5vZGUgPSBnZXREb2N1bWVudFJlZ2lvbnMoKTsKLQkJCS8vIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInBhcnNpbmcgaGFzIG5vdCBmaW5pc2hlZCIpOwotCQl9Ci0JCS8vIGZvciBtZW1vcnkgcmVjb3ZlcnksIHdlIGFzc3VtZSBpZiBzb21lb25lCi0JCS8vIHJlcXVlc3RzIGFsbCByZWdpb25zLCB3ZSBjYW4gcmVzZXQgb3VyIGJpZwotCQkvLyBtZW1vcnkgY29uc3VtaW5nIG9iamVjdHMKLQkJLy8gYnV0IHRoZSBuZXcgImdldFJlZ2lvbnMiIG1ldGhvZCBpcyB0aGVuIG1vcmUgZXhwZW5zaXZlLgotCQkvLyBJIGRvbid0IHRoaW5rIGl0cyB1c2VkIG11Y2gsIHRob3VnaC4KLQkJTGlzdCBsb2NhbFJlZ2lvbnNMaXN0ID0gZ2V0UmVnaW9ucyhoZWFkTm9kZSk7Ci0JCXByaW1SZXNldCgpOwotCQlyZXR1cm4gbG9jYWxSZWdpb25zTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0UmVnaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gaGVhZE5vZGUKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUpIHsKLQkJTGlzdCBhbGxSZWdpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gaGVhZE5vZGU7Ci0JCXdoaWxlIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3Qgbm9kZVJlZ2lvbnMgPSBjdXJyZW50Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVSZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWxsUmVnaW9ucy5hZGQobm9kZVJlZ2lvbnMuZ2V0KGkpKTsKLQkJCX0KLQkJCWN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBhbGxSZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJcHJpbVJlc2V0KCk7Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KHJlYWRlciwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlciwgaW50IG9mZnNldCkgewotCQlyZXNldChyZWFkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBpbnB1dCkgewotCQlyZXNldChuZXcgU3RyaW5nUmVhZGVyKGlucHV0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIGlucHV0LCBpbnQgb2Zmc2V0KSB7Ci0JCXJlc2V0KGlucHV0KTsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IENTU1NvdXJjZVBhcnNlcigpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJzZU5vZGVzKCkgewotCQkvLyByZWdpb25zIGFyZSBpbml0aWFsbHkgcmVwb3J0ZWQgYXMgY29tcGxldGUgb2Zmc2V0cyB3aXRoaW4gdGhlCi0JCS8vIHNjYW5uZWQgaW5wdXQKLQkJLy8gdGhleSBhcmUgYWRqdXN0ZWQgaGVyZSB0byBiZSBpbmRleGVzIGZyb20gdGhlIGN1cnJlbnROb2RlJ3Mgc3RhcnQKLQkJLy8gb2Zmc2V0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IG51bGw7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJU3RyaW5nIGN1cnJlbnRSZWdpb25UeXBlID0gbnVsbDsKLQotCQl3aGlsZSAoKHJlZ2lvbiA9IGdldE5leHRSZWdpb24oKSkgIT0gbnVsbCkgewotCQkJdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAobXVzdEJlU3RhcnQodHlwZSwgY3VycmVudFJlZ2lvblR5cGUpICYmIGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCX0KLQotCQkJaWYgKChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmlzRW5kZWQoKSkgfHwgY3VycmVudE5vZGUgPT0gbnVsbCkgewotCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsICYmICFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQkJfQotCQkJCWxhc3ROb2RlID0gY3VycmVudE5vZGU7Ci0JCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJY3VycmVudFJlZ2lvblR5cGUgPSB0eXBlOwotCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCWxhc3ROb2RlLnNldE5leHQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJfQotCi0JCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQotCQkJaWYgKG11c3RCZUVuZCh0eXBlKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJfQotCi0JCQlpZiAoaGVhZE5vZGUgPT0gbnVsbCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaGVhZE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCX0KLQkJfQotCi0JCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsICYmICFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQl9Ci0KLQkJcHJpbVJlc2V0KCk7Ci0JCXJldHVybiBoZWFkTm9kZTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbih0eXBlKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtdXN0QmVTdGFydChTdHJpbmcgdHlwZSwgU3RyaW5nIGRvY1JlZ2lvblR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQVRLRVlXT1JEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgfHwgKGRvY1JlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZICYmIHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHx8ICghQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yQmVnZ2luaW5nVHlwZShkb2NSZWdpb25UeXBlKSAmJiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUKSkpOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG11c3RCZUVuZChTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUik7Ci0JfQotCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBnZXROZXh0UmVnaW9uKCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl0cnkgewotCQkJcmVnaW9uID0gZ2V0VG9rZW5pemVyKCkuZ2V0TmV4dFRva2VuKCk7Ci0JCQkvLyBETVc6IDIvMTIvMDMgUmVtb3ZlZCBzdGF0ZQotCQkJLy8gaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBmUmVnaW9ucy5hZGQocmVnaW9uKTsKLQkJCS8vIH0KLQkJCXJldHVybiByZWdpb247Ci0JCX0KLQkJY2F0Y2ggKFN0YWNrT3ZlcmZsb3dFcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogaW5wdXQgY291bGQgbm90IGJlIHBhcnNlZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldFRva2VuaXplcigpLmdldE9mZnNldCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiBpbnB1dCBjb3VsZCBub3QgYmUgcGFyc2VkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0VG9rZW5pemVyKCkuZ2V0T2Zmc2V0KCkgKyAiICgiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgKyAiKSIsIGUpOyAvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbVJlc2V0KCkgewotCi0JCWdldFRva2VuaXplcigpLnJlc2V0KG5ldyBjaGFyWzBdKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgSUNTU1Rva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCWlmIChmVG9rZW5pemVyID09IG51bGwpIHsKLQkJCWZUb2tlbml6ZXIgPSBuZXcgQ1NTVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGlzIGEgc2ltcGxlIHV0aWxpdHkgdG8gY291bnQgbm9kZXMuIFVzZWQgb25seSBmb3IgZGVidWcKLQkgKiBzdGF0ZW1lbnRzLgotCSAqLwotCXByaXZhdGUgaW50IF9jb3VudE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZXMpIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY291bnROb2RlID0gbm9kZXM7Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gbnVsbCkgewotCQkJcmVzdWx0Kys7Ci0JCQljb3VudE5vZGUgPSBjb3VudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOWYyMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVJlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlID0gbnVsbDsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQllbHNlIHsKLQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1Rva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWI3ZTYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1Rva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3OSArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjQuMiBvbiA4LzEzLzEwIDI6MjMgUE0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLkNTU1RleHRSZWdpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40LjIKLSAqIG9uIDgvMTMvMTAgMjoyMyBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5EOi9kZXYvd29ya3NwYWNlcy9oZWxpb3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9DU1NUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgQ1NTVG9rZW5pemVyIGltcGxlbWVudHMgQ1NTUmVnaW9uQ29udGV4dHMsIElDU1NUb2tlbml6ZXIgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSAxNjM4NDsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUgPSAyNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSU1QT1JUX0RFTElNSVRFUiA9IDEwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUgPSAzODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1IgPSAyMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfQ0hBUlNFVF9ERUxJTUlURVIgPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTl9WQUxVRSA9IDQwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9QQUdFX1BTRVVET19QQUdFID0gMTY7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0lNUE9SVF9VUkkgPSA2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EID0gMzI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiA9IDI4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTiA9IDM0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9QQUdFX0RFTElNSVRFUiA9IDE4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgPSAzMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfTUVESUFfTUVESVVNID0gMTI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0NIQVJTRVRfTkFNRSA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0lNUE9SVF9NRURJVU0gPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IgPSAzNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfRk9OVF9GQUNFX0RFTElNSVRFUiA9IDIwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9NRURJQV9ERUxJTUlURVIgPSAxNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1JfTU9ESUZJRVIgPSAyNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlJTklUSUFMID0gMDsKLQotICAvKioKLSAgICogWlpfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWlpfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAwLCAgMSwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNywgIDcsIAotICAgICA4LCAgOCwgIDksICA5LCAgOSwgIDksICAwLCAgMCwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAKLSAgICAxNCwgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNywgMTcsIDE4LCAxOAotICB9OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQ01BUF9QQUNLRUQgPSAKLSAgICAiXDExXDBcMVwxMlwxXDE3XDFcMFwxXDRcMVwyMFwyMlwwXDFcNlwxXDMxXDFcMTEiKwotICAgICJcMVwyMVwxXDE2XDFcNzJcMVwxNlwxXDVcMVwyNVwxXDEzXDFcMzVcMVwxNVwxXDU1IisKLSAgICAiXDFcMTBcMVwxNFwxXDM0XDEyXDFcMVw2MlwxXDUwXDFcMzBcMVw2N1wxXDMyXDFcMjciKwotICAgICJcMVwzNlwxXDQzXDFcMjZcMVw0MFwxXDU3XDFcNDZcMVw2NFwxXDYxXDFcNDFcMVw1MSIrCi0gICAgIlwyXDJcMVwyNFwxXDUyXDFcNjVcMVw1NFwxXDUzXDFcMlwxXDIzXDFcNDRcMVw0NyIrCi0gICAgIlwxXDIyXDVcMlwxXDY2XDFcM1wxXDcxXDFcMTZcMVwyXDFcMTZcMVw0MlwxXDciKwotICAgICJcMVwzN1wxXDU2XDFcNDVcMVw2M1wxXDYxXDFcNDFcMVw1MVwyXDJcMVwyNFwxXDUyIisKLSAgICAiXDFcNjVcMVw1NFwxXDUzXDFcMlwxXDIzXDFcNDRcMVw0N1wxXDIyXDVcMlwxXDYwIisKLSAgICAiXDFcNzBcMVwzM1wxXDcwXDFcMFx1ZmY4MFwyIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBbXSBaWl9DTUFQID0genpVbnBhY2tDTWFwKFpaX0NNQVBfUEFDS0VEKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgREZBIHN0YXRlcyB0byBhY3Rpb24gc3dpdGNoIGxhYmVscy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BQ1RJT04gPSB6elVucGFja0FjdGlvbigpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BQ1RJT05fUEFDS0VEXzAgPQotICAgICJcMjNcMFwxXDFcMVwyXDFcMVwxXDNcNFwxXDFcNFwxXDEiKwotICAgICJcMVw1XDFcMVwxXDZcMVw3XDNcMVwxXDEwXDNcMVwxXDExIisKLSAgICAiXDJcMVwxXDEyXDFcMTNcMlwxXDFcMTRcMVwxNVwxXDE2XDJcMSIrCi0gICAgIlwxXDE3XDFcMVwxXDNcMVwyMFwxXDIxXDFcMjJcMlwxXDFcMjMiKwotICAgICJcMVwxXDFcMjRcMVwyNVw0XDFcMVwyNlwzXDFcMVwyN1wxXDMwIisKLSAgICAiXDFcMzFcMVwzMlw0XDFcMVwzM1wzXDFcMVwzMlwxXDFcMlwzNCIrCi0gICAgIlwxXDNcMVwwXDFcMlwxXDBcMVwzNVwxXDBcMVwzNlwxMFwwIisKLSAgICAiXDFcNlw0XDBcMVwzN1w0XDBcMVw0MFw0XDBcMVwxMVwxXDAiKwotICAgICJcMVwxM1wxXDBcMVwxNlwxXDBcMVw0MVwxXDBcMVwyMlwxXDAiKwotICAgICJcMVwyNVwyXDBcMVwyNVwzXDBcMVwyNlwxXDBcMVw0MlwzXDAiKwotICAgICJcMVw0M1wxXDBcMVwzMlwxXDQ0XDFcMzJcMlwwXDFcNDVcMlwwIisKLSAgICAiXDFcMzFcMVw0NlwyXDBcMVwzMlwyXDBcMVw0N1wxXDJcMVw1MCIrCi0gICAgIlwxXDM1XDFcMzZcMTBcMFwxXDZcMVwwXDFcMzdcMlwwXDFcMzciKwotICAgICJcMlwwXDFcNDBcMlwwXDFcNDBcMlwwXDFcMTFcMVwxM1wxXDE2IisKLSAgICAiXDFcMjJcMVwyNVwxXDBcMVwyNVwyXDBcMVwyNVwxXDBcMVwyNiIrCi0gICAgIlwxXDQyXDFcMzJcMVwwXDFcMzJcMVwwXDFcNDVcMlwwXDFcNDUiKwotICAgICJcMVwwXDFcNDZcMVw1MVwxXDMyXDFcMFwxXDJcMVwzNVwxXDM2IisKLSAgICAiXDFcNTJcMVw1M1wxMFwwXDFcNlw1XDBcMVwxMVwxXDEzXDFcMTYiKwotICAgICJcMVwyMlwxXDI1XDJcMFwxXDI2XDFcNDJcMlwzMlwyXDBcMVw0NiIrCi0gICAgIlwxXDUxXDFcMFwxXDQ0XDFcMFwxXDJcMVwzNVwxXDM2XDNcMCIrCi0gICAgIlwxXDU0XDJcMFwxXDZcMVwwXDFcNlwxMFwwXDFcNTVcMVwxMSIrCi0gICAgIlwxXDEzXDFcMTZcMVwyMlwxXDI1XDJcMFwxXDI2XDFcNDJcMlwzMiIrCi0gICAgIlwyXDBcMVw0NlwyXDUxXDVcMFwxXDU2XDFcMFwxXDJcMVwzNSIrCi0gICAgIlwxXDM2XDJcMFwxXDU3XDJcMFwxXDZcNlwwXDFcNTVcMlwwIisKLSAgICAiXDFcMTFcMVwxM1wxXDE2XDFcMjJcMVwyNVwyXDBcMVwyNlwxXDQyIisKLSAgICAiXDJcMzJcMlwwXDFcNDZcMlw1MVwyXDBcMVw1NlwzXDBcMVwyIisKLSAgICAiXDFcMzVcMVwzNlwxXDBcMVw2MFwyXDBcMVw2XDEzXDBcMVwxMSIrCi0gICAgIlwxXDEzXDFcMTZcMVwyMlwxXDI1XDJcMFwxXDI2XDFcNDJcMlwzMiIrCi0gICAgIlwyXDBcMVw0NlwyXDUxXDEwXDBcMVwzNVwxXDM2XDFcNjFcMlwwIisKLSAgICAiXDFcNlw2XDBcMVw1NVwxXDBcMVw1NVwyXDBcMVw0MlwxXDMyIisKLSAgICAiXDJcMFwxXDQ2XDJcNTFcMlwwXDFcNTZcMVwwXDFcNTZcNlwwIisKLSAgICAiXDFcMzJcMVw1MVw0XDBcMVw2Mlw0XDBcMVw1MVwzXDBcMVw2MyIrCi0gICAgIlwxMlwwIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBY3Rpb24oKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNDM2XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0FjdGlvbihaWl9BQ1RJT05fUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQWN0aW9uKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfUk9XTUFQID0genpVbnBhY2tSb3dNYXAoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfUk9XTUFQX1BBQ0tFRF8wID0KLSAgICAiXDBcMFwwXDczXDBcMTY2XDBcMjYxXDBcMzU0XDBcdTAxMjdcMFx1MDE2MlwwXHUwMTlkIisKLSAgICAiXDBcdTAxZDhcMFx1MDIxM1wwXHUwMjRlXDBcdTAyODlcMFx1MDJjNFwwXHUwMmZmXDBcdTAzM2FcMFx1MDM3NSIrCi0gICAgIlwwXHUwM2IwXDBcdTAzZWJcMFx1MDQyNlwwXHUwNDYxXDBcdTA0OWNcMFx1MDRkN1wwXHUwNTEyXDBcdTA1NGQiKwotICAgICJcMFx1MDU4OFwwXHUwNWMzXDBcdTA1ZmVcMFx1MDQ2MVwwXHUwNjM5XDBcdTA0NjFcMFx1MDY3NFwwXHUwNmFmIisKLSAgICAiXDBcdTA0NjFcMFx1MDZlYVwwXHUwNzI1XDBcdTA3NjBcMFx1MDQ2MVwwXHUwNzliXDBcdTA3ZDZcMFx1MDgxMSIrCi0gICAgIlwwXHUwODRjXDBcdTA4ODdcMFx1MDhjMlwwXHUwNDYxXDBcdTA4ZmRcMFx1MDkzOFwwXHUwOTczXDBcdTA0NjEiKwotICAgICJcMFx1MDQ2MVwwXHUwOWFlXDBcdTA5ZTlcMFx1MGEyNFwwXHUwNDYxXDBcdTBhNWZcMFx1MGE5YVwwXHUwNDYxIisKLSAgICAiXDBcdTA0NjFcMFx1MGFkNVwwXHUwYjEwXDBcdTBiNGJcMFx1MDQ2MVwwXHUwYjg2XDBcdTA0NjFcMFx1MGJjMSIrCi0gICAgIlwwXHUwYmZjXDBcdTBjMzdcMFx1MGM3MlwwXHUwY2FkXDBcdTBjZThcMFx1MGQyM1wwXHUwZDVlXDBcdTBkOTkiKwotICAgICJcMFx1MDQ2MVwwXHUwNDYxXDBcdTBkZDRcMFx1MGUwZlwwXHUwZTRhXDBcdTBlODVcMFx1MGVjMFwwXHUwZWZiIisKLSAgICAiXDBcdTA0NjFcMFx1MGYzNlwwXHUwZjcxXDBcdTBmYWNcMFx1MGZlN1wwXHUxMDIyXDBcdTA2MzlcMFx1MDQ2MSIrCi0gICAgIlwwXHUxMDVkXDBcdTA0ZDdcMFx1MTA5OFwwXHUxMGQzXDBcdTA1ODhcMFx1MTEwZVwwXHUwNWMzXDBcdTExNDkiKwotICAgICJcMFx1MTE4NFwwXHUxMWJmXDBcdTExZmFcMFx1MTIzNVwwXHUxMjcwXDBcdTEyYWJcMFx1MTJlNlwwXHUxMzIxIisKLSAgICAiXDBcdTEzNWNcMFx1MTM5N1wwXHUwNmVhXDBcdTEzZDJcMFx1MDQ2MVwwXHUwNzYwXDBcdTE0MGRcMFx1MDc5YiIrCi0gICAgIlwwXHUxNDQ4XDBcdTA0NjFcMFx1MDdkNlwwXHUxNDgzXDBcdTE0YmVcMFx1MDg4N1wwXHUxNGY5XDBcdTA5MzgiKwotICAgICJcMFx1MTUzNFwwXHUwOWU5XDBcdTE1NmZcMFx1MTVhYVwwXHUwNDYxXDBcdTBiMTBcMFx1MTVlNVwwXHUwYmZjIisKLSAgICAiXDBcdTE2MjBcMFx1MGMzN1wwXHUxNjViXDBcdTA0NjFcMFx1MGNhZFwwXHUxNjk2XDBcdTBkMjNcMFx1MTZkMSIrCi0gICAgIlwwXHUxNzBjXDBcdTE3NDdcMFx1MTc4MlwwXHUxN2JkXDBcdTBmMzZcMFx1MDQ2MVwwXHUwZTRhXDBcdTE3ZjgiKwotICAgICJcMFx1MDQ2MVwwXHUxODMzXDBcdTBlODVcMFx1MTg2ZVwwXHUwNDYxXDBcdTBlZmJcMFx1MThhOVwwXHUxOGU0IisKLSAgICAiXDBcdTBmYWNcMFx1MTkxZlwwXHUxOTVhXDBcdTE5OTVcMFx1MTAyMlwwXHUxOWQwXDBcdTA0NjFcMFx1MWEwYiIrCi0gICAgIlwwXHUwNDYxXDBcdTFhNDZcMFx1MWE4MVwwXHUxYWJjXDBcdTFhZjdcMFx1MWIzMlwwXHUxYjZkXDBcdTFiYTgiKwotICAgICJcMFx1MWJlM1wwXHUxYzFlXDBcdTFjNTlcMFx1MWM5NFwwXHUxY2NmXDBcdTA2ZWFcMFx1MWQwYVwwXHUxZDQ1IisKLSAgICAiXDBcdTA3NjBcMFx1MWQ4MFwwXHUxZGJiXDBcdTA3OWJcMFx1MWRmNlwwXHUxZTMxXDBcdTA3ZDZcMFx1MWU2YyIrCi0gICAgIlwwXHUxZWE3XDBcdTFlZTJcMFx1MWYxZFwwXHUxZjU4XDBcdTFmOTNcMFx1MWZjZVwwXHUyMDA5XDBcdTBjMzciKwotICAgICJcMFx1MjA0NFwwXHUyMDdmXDBcdTBjYWRcMFx1MjBiYVwwXHUyMGY1XDBcdTIxMzBcMFx1MjE2YlwwXHUyMWE2IisKLSAgICAiXDBcdTIxZTFcMFx1MjIxY1wwXHUwZTg1XDBcdTIyNTdcMFx1MjI5MlwwXHUwZWZiXDBcdTIyY2RcMFx1MjMwOCIrCi0gICAgIlwwXHUyMzQzXDBcdTIzN2VcMFx1MjNiOVwwXHUyM2Y0XDBcdTI0MmZcMFx1MjQ2YVwwXHUwNDYxXDBcdTA0NjEiKwotICAgICJcMFx1MjRhNVwwXHUyNGUwXDBcdTI1MWJcMFx1MjU1NlwwXHUyNTkxXDBcdTI1Y2NcMFx1MjYwN1wwXHUyNjQyIisKLSAgICAiXDBcdTI2N2RcMFx1MjZiOFwwXHUyNmYzXDBcdTI3MmVcMFx1Mjc2OVwwXHUyN2E0XDBcdTI3ZGZcMFx1MjgxYSIrCi0gICAgIlwwXHUyODU1XDBcdTI4OTBcMFx1MjhjYlwwXHUyOTA2XDBcdTI5NDFcMFx1Mjk3Y1wwXHUyOWI3XDBcdTI5ZjIiKwotICAgICJcMFx1MmEyZFwwXHUyYTY4XDBcdTJhYTNcMFx1MmFkZVwwXHUyYjE5XDBcdTJiNTRcMFx1MmI4ZlwwXHUyYmNhIisKLSAgICAiXDBcdTJjMDVcMFx1MmM0MFwwXHUyYzdiXDBcdTJjYjZcMFx1MmNmMVwwXHUyZDJjXDBcdTA0NjFcMFx1MmQ2NyIrCi0gICAgIlwwXHUyZGEyXDBcdTA0NjFcMFx1MmRkZFwwXHUyZTE4XDBcdTJlNTNcMFx1MmU4ZVwwXHUyZWM5XDBcdTJmMDQiKwotICAgICJcMFx1MmYzZlwwXHUyZjdhXDBcdTJmYjVcMFx1MmZmMFwwXHUwNDYxXDBcdTMwMmJcMFx1MzA2NlwwXHUzMGExIisKLSAgICAiXDBcdTMwZGNcMFx1MzExN1wwXHUzMTUyXDBcdTMxOGRcMFx1MzFjOFwwXHUzMjAzXDBcdTMyM2VcMFx1MzI3OSIrCi0gICAgIlwwXHUzMmI0XDBcdTMyZWZcMFx1MzMyYVwwXHUzMzY1XDBcdTMzYTBcMFx1MzNkYlwwXHUzNDE2XDBcdTJiOGYiKwotICAgICJcMFx1MzQ1MVwwXHUzNDhjXDBcdTA0NjFcMFx1MzRjN1wwXHUzNTAyXDBcdTM1M2RcMFx1MzU3OFwwXHUzNWIzIisKLSAgICAiXDBcdTM1ZWVcMFx1MDQ2MVwwXHUzNjI5XDBcdTM2NjRcMFx1MzY5ZlwwXHUzNmRhXDBcdTM3MTVcMFx1Mzc1MCIrCi0gICAgIlwwXHUzNzhiXDBcdTM3YzZcMFx1MzgwMVwwXHUyZjNmXDBcdTM4M2NcMFx1Mzg3N1wwXHUzOGIyXDBcdTM4ZWQiKwotICAgICJcMFx1MzkyOFwwXHUzOTYzXDBcdTM5OWVcMFx1MzlkOVwwXHUzYTE0XDBcdTNhNGZcMFx1M2E4YVwwXHUzYWM1IisKLSAgICAiXDBcdTNiMDBcMFx1M2IzYlwwXHUzYjc2XDBcdTNiYjFcMFx1M2JlY1wwXHUzYzI3XDBcdTNjNjJcMFx1M2M5ZCIrCi0gICAgIlwwXHUzM2RiXDBcdTNjZDhcMFx1M2QxM1wwXHUzZDRlXDBcdTNkODlcMFx1M2RjNFwwXHUzZGZmXDBcdTNlM2EiKwotICAgICJcMFx1MDQ2MVwwXHUzZTc1XDBcdTNlYjBcMFx1M2VlYlwwXHUzZjI2XDBcdTNmNjFcMFx1M2Y5Y1wwXHUzZmQ3IisKLSAgICAiXDBcdTQwMTJcMFx1NDA0ZFwwXHU0MDg4XDBcdTQwYzNcMFx1NDBmZVwwXHU0MTM5XDBcdTQxNzRcMFx1NDFhZiIrCi0gICAgIlwwXHU0MWVhXDBcdTQyMjVcMFx1NDI2MFwwXHU0MjliXDBcdTQyZDZcMFx1NDMxMVwwXHU0MzRjXDBcdTQzODciKwotICAgICJcMFx1NDNjMlwwXHU0M2ZkXDBcdTQ0MzhcMFx1NDQ3M1wwXHU0NGFlXDBcdTQ0ZTlcMFx1NDUyNFwwXHU0NTVmIisKLSAgICAiXDBcdTQ1OWFcMFx1NDVkNVwwXHU0NjEwXDBcdTQ2NGJcMFx1NDY4NlwwXHU0NmMxXDBcdTQ2ZmNcMFx1NDczNyIrCi0gICAgIlwwXHU0NzcyXDBcdTA0NjFcMFx1NDdhZFwwXHU0N2U4XDBcdTQ4MjNcMFx1NDg1ZVwwXHU0ODk5XDBcdTQ4ZDQiKwotICAgICJcMFx1NDkwZlwwXHU0OTRhXDBcdTQ5ODVcMFx1MmZiNVwwXHU0OWMwXDBcdTJmZjBcMFx1NDlmYlwwXHU0YTM2IisKLSAgICAiXDBcdTRhNzFcMFx1NGFhY1wwXHU0YWU3XDBcdTRiMjJcMFx1NGI1ZFwwXHU0Yjk4XDBcdTRiZDNcMFx1NGMwZSIrCi0gICAgIlwwXHU0YzQ5XDBcdTM0NTFcMFx1NGM4NFwwXHUzNDhjXDBcdTRjYmZcMFx1NGNmYVwwXHU0ZDM1XDBcdTRkNzAiKwotICAgICJcMFx1NGRhYlwwXHU0ZGU2XDBcdTRlMjFcMFx1NGU1Y1wwXHU0ZTk3XDBcdTRlZDJcMFx1NGYwZFwwXHU0ZjQ4IisKLSAgICAiXDBcdTA0NjFcMFx1NGY4M1wwXHU0ZmJlXDBcdTRmZjlcMFx1NTAzNFwwXHUwNDYxXDBcdTUwNmZcMFx1NTBhYSIrCi0gICAgIlwwXHU1MGU1XDBcdTA0NjFcMFx1NTEyMFwwXHU1MTViXDBcdTUxOTZcMFx1NTFkMVwwXHU1MjBjXDBcdTUyNDciKwotICAgICJcMFx1NTI4MlwwXHU1MmJkXDBcdTUyZjhcMFx1NTMzMyI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrUm93TWFwKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzQzNl07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tSb3dNYXAoWlpfUk9XTUFQX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja1Jvd01hcChTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgaGlnaCA9IHBhY2tlZC5jaGFyQXQoaSsrKSA8PCAxNjsKLSAgICAgIHJlc3VsdFtqKytdID0gaGlnaCB8IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9UUkFOUyA9IHp6VW5wYWNrVHJhbnMoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfVFJBTlNfUEFDS0VEXzAgPQotICAgICJcMlwyNFwxXDI1XDFcMjZcMVwyN1wxXDI0XDFcMjdcMVwyNVwxXDMwIisKLSAgICAiXDFcMjRcMVwyN1wxXDI0XDFcMzFcMlwyNFwyXDI3XDFcMzJcM1wyNSIrCi0gICAgIlwxXDI0XDFcMjVcMVwyNFwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMzYiKwotICAgICJcMVwzN1wxMVwyNVwxXDI0XDRcMjVcMVwyNFwyXDI1XDFcMjRcMVwyNSIrCi0gICAgIlwxXDQwXDNcMjVcMVw0MVwxMFwyNFwxXDI3XDFcNDJcMVwyN1wxXDI0IisKLSAgICAiXDFcNDNcMVw0NFwxXDI3XDRcMjRcMlwyN1w3XDI0XDFcMzNcMlwyNCIrCi0gICAgIlwxXDM0XDFcMzVcMVwyNFwxXDM3XDQwXDI0XDFcMjdcMVwyNFwxXDI3IisKLSAgICAiXDFcMjRcMVw0M1wxXDI0XDFcMjdcNFwyNFwyXDI3XDdcMjRcMVwzMyIrCi0gICAgIlwyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTFcMjRcMVw0NVwyNlwyNCIrCi0gICAgIlwxXDI3XDFcNDZcMVwyN1wxXDI0XDFcNDNcMVw0N1wxXDI3XDRcMjQiKwotICAgICJcMlwyN1wxXDI0XDFcNTBcNVwyNFwxXDMzXDJcMjRcMVwzNFwxXDM1IisKLSAgICAiXDFcMjRcMVwzN1wxMVwyNFwxXDQ1XDI0XDI0XDFcNTFcMVw1MlwxXDI3IisKLSAgICAiXDFcMjRcMVwyN1wxXDUxXDFcNTNcMVwyNFwxXDI3XDRcMjRcMlwyNyIrCi0gICAgIlwxXDI0XDNcNTFcMVwyNFwxXDUxXDFcMjRcMVwzM1wyXDI0XDFcMzQiKwotICAgICJcMVwzNVwxXDI0XDFcMzdcMTFcNTFcMVw0NVw0XDUxXDFcMjRcMlw1MSIrCi0gICAgIlwxXDI0XDFcNTFcMVwyNFwzXDUxXDExXDI0XDFcMjdcMVwyNFwxXDI3IisKLSAgICAiXDFcMjRcMVw0M1wxXDI0XDFcMjdcNFwyNFwyXDI3XDdcMjRcMVwzMyIrCi0gICAgIlwyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTFcMjRcMVw0NVw0XDI0IisKLSAgICAiXDFcNTRcMTdcMjRcMVw1NVwxXDU2XDFcMjdcMVwyNFwxXDI3XDFcNTUiKwotICAgICJcMVw1N1wxXDI0XDFcMjdcNFwyNFwyXDI3XDFcMjRcM1w1NVwxXDI0IisKLSAgICAiXDFcNTVcMVwyNFwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzNyIrCi0gICAgIlwxMVw1NVwxXDI0XDRcNTVcMVwyNFwyXDU1XDFcNjBcMVw1NVwxXDI0IisKLSAgICAiXDNcNTVcMTFcMjRcMVwyN1wxXDI0XDFcMjdcMVwyNFwxXDQzXDFcMjQiKwotICAgICJcMVwyN1w0XDI0XDJcMjdcN1wyNFwxXDMzXDJcMjRcMVwzNFwxXDM1IisKLSAgICAiXDFcMjRcMVwzN1wxNlwyNFwxXDYxXDJcMjRcMVw2MFwxNFwyNFwxXDYyIisKLSAgICAiXDFcNjNcMVwyN1wxXDI0XDFcMjdcMVw2MlwxXDY0XDFcMjRcMVwyNyIrCi0gICAgIlw0XDI0XDJcMjdcMVwyNFwzXDYyXDFcMjRcMVw2MlwxXDI0XDFcMzMiKwotICAgICJcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDYyXDFcMjRcNFw2MiIrCi0gICAgIlwxXDI0XDJcNjJcMVw2NVwxXDYyXDFcNjZcM1w2MlwxMVwyNFwxXDI3IisKLSAgICAiXDFcMjRcMVwyN1wxXDI0XDFcNDNcMVwyNFwxXDI3XDRcMjRcMlwyNyIrCi0gICAgIlw3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDIxXDI0IisKLSAgICAiXDFcNjVcMTZcMjRcMVw2N1wxXDI0XDFcNjdcMVwyNFwxXDQzXDFcMjQiKwotICAgICJcMVw2N1wxXDI0XDFcMzFcMVw3MFwxXDI0XDJcNjdcMVwzMlw2XDI0IisKLSAgICAiXDFcMzNcMVwyNFwxXDcwXDFcMzRcMVwzNVwxXDM2XDFcMzdcMTZcMjQiKwotICAgICJcMVw3MVwyXDI0XDFcNjVcMVwyNFwxXDQwXDNcMjRcMVw0MVw2XDI0IisKLSAgICAiXDFcNzJcMVw3M1wxXDI3XDFcMjRcMVwyN1wxXDcyXDFcNzRcMVwyNCIrCi0gICAgIlwxXDI3XDRcMjRcMlwyN1wxXDI0XDNcNzJcMVwyNFwxXDcyXDFcMjQiKwotICAgICJcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTFcNzJcMVwyNCIrCi0gICAgIlw0XDcyXDFcMjRcMlw3MlwxXDI0XDFcNzJcMVwyNFwzXDcyXDExXDI0IisKLSAgICAiXDFcMjdcMVwyNFwxXDI3XDFcMjRcMVw0M1wxXDI0XDFcMjdcNFwyNCIrCi0gICAgIlwyXDI3XDdcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzciKwotICAgICJcMzBcMjRcMVw3NVwxXDc2XDFcNzdcM1wyNFwxXDEwMFwxXDEwMVwxXDI3IisKLSAgICAiXDFcMTAyXDFcMjdcMVwxMDBcMVwxMDNcMVwxMDRcMVwyN1w0XDI0XDJcMjciKwotICAgICJcMVwyNFwzXDEwMFwxXDI0XDFcMTAwXDFcMjRcMVwzM1wyXDI0XDFcMzQiKwotICAgICJcMVwzNVwxXDI0XDFcMzdcMTFcMTAwXDFcMjRcNFwxMDBcMVwyNFwyXDEwMCIrCi0gICAgIlwxXDI0XDFcMTAwXDFcMjRcM1wxMDBcMTFcMjRcMVwyN1wxXDI0XDFcMjciKwotICAgICJcMVwyNFwxXDQzXDFcMjRcMVwyN1w0XDI0XDJcMjdcN1wyNFwxXDMzIisKLSAgICAiXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wzMlwyNFwxXDc3XDNcMjQiKwotICAgICJcMVwxMDVcMVwxMDZcMVwyN1wxXDI0XDFcMjdcMVwxMDVcMVwxMDdcMVwyNCIrCi0gICAgIlwxXDI3XDRcMjRcMlwyN1wxXDI0XDNcMTA1XDFcMjRcMVwxMDVcMVwyNCIrCi0gICAgIlwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMTEwXDFcMzdcMTFcMTA1XDFcMTExIisKLSAgICAiXDRcMTA1XDFcMjRcMlwxMDVcMVwyNFwxXDEwNVwxXDI0XDNcMTA1XDExXDI0IisKLSAgICAiXDFcMjdcMVwyNFwxXDI3XDFcMjRcMVw0M1wxXDI0XDFcMjdcNFwyNCIrCi0gICAgIlwyXDI3XDdcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzciKwotICAgICJcMTFcMjRcMVwxMTFcMTFcMjRcMVwxMTJcMTFcMjRcMVwxMTNcMVwxMTRcMVwxMTUiKwotICAgICJcMVwyN1wxXDExNlwxXDI3XDFcMTE0XDFcMTE3XDFcMTIwXDFcMjdcMVwxMjEiKwotICAgICJcMVwxMjJcMVwxMjNcMVwyNFwyXDI3XDFcMTI0XDFcMTI1XDJcMTE0XDFcMjQiKwotICAgICJcMVwxMTRcMVwyNFwxXDMzXDFcMTI2XDFcMjRcMVwzNFwxXDEyN1wxXDI0IisKLSAgICAiXDFcMzdcMTFcMTE0XDFcMTExXDRcMTE0XDFcMTMwXDJcMTE0XDFcMjRcMVwxMTQiKwotICAgICJcMVwyNFwzXDExNFw2XDI0XDFcMTEzXDFcMTE0XDFcMTE1XDFcMTMxXDFcMTE2IisKLSAgICAiXDFcMTMxXDFcMTE0XDFcMTE3XDFcMTIwXDFcMTMxXDFcMTIxXDFcMTIyXDFcMTIzIisKLSAgICAiXDFcMjRcMlwxMzFcMVwxMjRcMVwxMjVcMlwxMTRcMVwyNFwxXDExNFwxXDI0IisKLSAgICAiXDFcMzNcMVwxMjZcMVwyNFwxXDM0XDFcMTI3XDFcMjRcMVwzN1wxMVwxMTQiKwotICAgICJcMVwxMTFcNFwxMTRcMVwxMzBcMlwxMTRcMVwyNFwxXDExNFwxXDI0XDNcMTE0IisKLSAgICAiXDVcMjRcNzRcMFwyXDI1XDFcMTMyXDNcMFwyXDI1XDExXDBcM1wyNSIrCi0gICAgIlwxXDBcMVwyNVwxMFwwXDExXDI1XDFcMFw0XDI1XDFcMFwyXDI1IisKLSAgICAiXDFcMFwxXDI1XDFcMFwzXDI1XDZcMFwxXDEzM1wyXDI1XDFcMCIrCi0gICAgIlwyXDI1XDFcMTMzXDJcMjVcMVwwXDRcMjVcMlwwXDE2XDI1XDFcMTMzIisKLSAgICAiXDJcMjVcMVwxMzNcMlwyNVwxXDEzM1wxMFwyNVwxXDEzM1w0XDI1XDFcMTMzIisKLSAgICAiXDdcMjVcNFwwXDFcMjdcMVwwXDFcMjdcM1wwXDFcMjdcNFwwIisKLSAgICAiXDJcMjdcNTRcMFwxXDI1XDFcMTMyXDNcMFwxXDI1XDFcMTM0XDExXDAiKwotICAgICJcM1wyNVwxXDBcMVwyNVwxMFwwXDExXDI1XDFcMFw0XDI1XDFcMCIrCi0gICAgIlwyXDI1XDFcMFwxXDI1XDFcMFwzXDI1XDZcMFwyXDEzNVwxXDEzNiIrCi0gICAgIlwzXDBcMlwxMzVcMTFcMFwzXDEzNVwxXDBcMVwxMzVcMTBcMFwxMVwxMzUiKwotICAgICJcMVwwXDRcMTM1XDFcMFwyXDEzNVwxXDBcMVwxMzVcMVwwXDNcMTM1IisKLSAgICAiXDZcMFwyXDEzN1wxXDE0MFwzXDBcMlwxMzdcMTFcMFwzXDEzN1wxXDAiKwotICAgICJcMVwxMzdcMTBcMFwxMVwxMzdcMVwwXDRcMTM3XDFcMFwyXDEzN1wxXDAiKwotICAgICJcMVwxMzdcMVwwXDNcMTM3XDM2XDBcMVwxNDFcNzZcMFwxXDE0Mlw3NFwwIisKLSAgICAiXDJcMTQzXDEwXDBcMVwxNDRcMVwxNDVcMVwxNDZcN1wwXDJcMTQ3XDEwXDAiKwotICAgICJcMVwxNTBcMVwxNTFcM1wwXDFcMTUwXDFcMTUyXDExXDBcM1wxNTBcMVwwIisKLSAgICAiXDFcMTUwXDEwXDBcMTFcMTUwXDFcMFw0XDE1MFwxXDBcMlwxNTBcMVwwIisKLSAgICAiXDFcMTUwXDFcMFwzXDE1MFw2XDBcMlwxNTNcMVwxNTRcMVwwXDFcMTU1IisKLSAgICAiXDExXDE1M1wyXDBcNTJcMTUzXDEwXDBcMVwxMzRcNjNcMFwyXDE1NlwxXDE1NyIrCi0gICAgIlwxXDBcNFwxNTZcMVwxNTVcNVwxNTZcMlwwXDUyXDE1NlwxXDBcMlwxNjAiKwotICAgICJcMVwxNjFcMVwwXDFcMTYyXDExXDE2MFwyXDBcNTJcMTYwXDFcMFwyXDE2MyIrCi0gICAgIlwxXDE2NFwxXDBcNFwxNjNcMVwxNjJcNVwxNjNcMlwwXDUyXDE2M1wyM1wwIisKLSAgICAiXDFcMTY1XDUwXDBcMlw1MVwxXDE2NlwzXDBcMlw1MVwxMVwwXDNcNTEiKwotICAgICJcMVwwXDFcNTFcMTBcMFwxMVw1MVwxXDBcNFw1MVwxXDBcMlw1MSIrCi0gICAgIlwxXDBcMVw1MVwxXDBcM1w1MVw2XDBcMVwxNjdcMlw1MVwxXDAiKwotICAgICJcMlw1MVwxXDE2N1wyXDUxXDFcMFw0XDUxXDJcMFwxNlw1MVwxXDE2NyIrCi0gICAgIlwyXDUxXDFcMTY3XDJcNTFcMVwxNjdcMTBcNTFcMVwxNjdcNFw1MVwxXDE2NyIrCi0gICAgIlw3XDUxXDJcMFwxXDUxXDFcMTY2XDNcMFwxXDUxXDFcMTM0XDExXDAiKwotICAgICJcM1w1MVwxXDBcMVw1MVwxMFwwXDExXDUxXDFcMFw0XDUxXDFcMCIrCi0gICAgIlwyXDUxXDFcMFwxXDUxXDFcMFwzXDUxXDZcMFwyXDU1XDFcMTcwIisKLSAgICAiXDNcMFwyXDU1XDExXDBcM1w1NVwxXDBcMVw1NVwxMFwwXDExXDU1IisKLSAgICAiXDFcMFw0XDU1XDFcMFwyXDU1XDFcMFwxXDU1XDFcMFwzXDU1IisKLSAgICAiXDZcMFwxXDE3MVwyXDU1XDFcMFwyXDU1XDFcMTcxXDJcNTVcMVwwIisKLSAgICAiXDRcNTVcMlwwXDE2XDU1XDFcMTcxXDJcNTVcMVwxNzFcMlw1NVwxXDE3MSIrCi0gICAgIlwxMFw1NVwxXDE3MVw0XDU1XDFcMTcxXDdcNTVcMlwwXDFcNTVcMVwxNzAiKwotICAgICJcM1wwXDFcNTVcMVwxMzRcMTFcMFwzXDU1XDFcMFwxXDU1XDEwXDAiKwotICAgICJcMTFcNTVcMVwwXDRcNTVcMVwwXDJcNTVcMVwwXDFcNTVcMVwwIisKLSAgICAiXDNcNTVcNlwwXDJcNjJcMVwxNzJcM1wwXDJcNjJcMTFcMFwzXDYyIisKLSAgICAiXDFcMFwxXDYyXDEwXDBcMTFcNjJcMVwwXDRcNjJcMVwwXDJcNjIiKwotICAgICJcMVwwXDFcNjJcMVwwXDNcNjJcNlwwXDFcMTczXDJcNjJcMVwwIisKLSAgICAiXDJcNjJcMVwxNzNcMlw2MlwxXDBcNFw2MlwyXDBcMTZcNjJcMVwxNzMiKwotICAgICJcMlw2MlwxXDE3M1wyXDYyXDFcMTczXDEwXDYyXDFcMTczXDRcNjJcMVwxNzMiKwotICAgICJcN1w2MlwyXDBcMVw2MlwxXDE3MlwzXDBcMVw2MlwxXDEzNFwxMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMTBcMFwxMVw2MlwxXDBcNFw2MlwxXDAiKwotICAgICJcMlw2MlwxXDBcMVw2MlwxXDBcM1w2Mlw3XDBcMVw2MlwxXDE3MiIrCi0gICAgIlwzXDBcMVw2MlwxXDE3NFwxMVwwXDNcNjJcMVwwXDFcNjJcMTBcMCIrCi0gICAgIlwxMVw2MlwxXDBcNFw2MlwxXDBcMlw2MlwxXDBcMVw2MlwxXDAiKwotICAgICJcM1w2Mlw1XDBcNFwxNzVcMVw2N1wxXDE3NVwxXDY3XDNcMTc1XDFcNjciKwotICAgICJcMlwxNzVcMVwwXDFcMTc1XDJcNjdcMTFcMTc1XDFcMFwxXDE3NVwxXDAiKwotICAgICJcMjBcMTc1XDFcMFwyXDE3NVwxXDBcMTJcMTc1XDFcMFwyXDcyXDFcMTc2IisKLSAgICAiXDNcMFwyXDcyXDExXDBcM1w3MlwxXDBcMVw3MlwxMFwwXDExXDcyIisKLSAgICAiXDFcMFw0XDcyXDFcMFwyXDcyXDFcMFwxXDcyXDFcMFwzXDcyIisKLSAgICAiXDZcMFwxXDE3N1wyXDcyXDFcMFwyXDcyXDFcMTc3XDJcNzJcMVwwIisKLSAgICAiXDRcNzJcMlwwXDE2XDcyXDFcMTc3XDJcNzJcMVwxNzdcMlw3MlwxXDE3NyIrCi0gICAgIlwxMFw3MlwxXDE3N1w0XDcyXDFcMTc3XDdcNzJcMlwwXDFcNzJcMVwxNzYiKwotICAgICJcM1wwXDFcNzJcMVwxMzRcMTFcMFwzXDcyXDFcMFwxXDcyXDEwXDAiKwotICAgICJcMTFcNzJcMVwwXDRcNzJcMVwwXDJcNzJcMVwwXDFcNzJcMVwwIisKLSAgICAiXDNcNzJcNzRcMFwxXDc1XDRcMFwyXDEwMFwxXDIwMFwzXDBcMlwxMDAiKwotICAgICJcMTFcMFwzXDEwMFwxXDBcMVwxMDBcMTBcMFwxMVwxMDBcMVwwXDRcMTAwIisKLSAgICAiXDFcMFwyXDEwMFwxXDBcMVwxMDBcMVwwXDNcMTAwXDZcMFwxXDIwMSIrCi0gICAgIlwyXDEwMFwxXDBcMlwxMDBcMVwyMDFcMlwxMDBcMVwwXDRcMTAwXDJcMCIrCi0gICAgIlwxNlwxMDBcMVwyMDFcMlwxMDBcMVwyMDFcMlwxMDBcMVwyMDFcMTBcMTAwXDFcMjAxIisKLSAgICAiXDRcMTAwXDFcMjAxXDdcMTAwXDFcMFwyXDIwMlwxXDIwM1wxXDBcMVwyMDQiKwotICAgICJcMTFcMjAyXDJcMFw1MlwyMDJcMlwwXDFcMTAwXDFcMjAwXDNcMFwxXDEwMCIrCi0gICAgIlwxXDEzNFwxMVwwXDNcMTAwXDFcMFwxXDEwMFwxMFwwXDExXDEwMFwxXDAiKwotICAgICJcNFwxMDBcMVwwXDJcMTAwXDFcMFwxXDEwMFwxXDBcM1wxMDBcNlwwIisKLSAgICAiXDJcMjA1XDFcMjA2XDFcMFw0XDIwNVwxXDIwNFw1XDIwNVwyXDBcNTJcMjA1IisKLSAgICAiXDFcMFwyXDEwNVwxXDIwN1wzXDBcMlwxMDVcMTFcMFwzXDEwNVwxXDAiKwotICAgICJcMVwxMDVcMTBcMFwxMVwxMDVcMVwwXDRcMTA1XDFcMFwyXDEwNVwxXDAiKwotICAgICJcMVwxMDVcMVwwXDNcMTA1XDZcMFwxXDIxMFwyXDEwNVwxXDBcMlwxMDUiKwotICAgICJcMVwyMTBcMlwxMDVcMVwwXDRcMTA1XDJcMFwxNlwxMDVcMVwyMTBcMlwxMDUiKwotICAgICJcMVwyMTBcMlwxMDVcMVwyMTBcMTBcMTA1XDFcMjEwXDRcMTA1XDFcMjEwXDdcMTA1IisKLSAgICAiXDJcMFwxXDEwNVwxXDIwN1wzXDBcMVwxMDVcMVwxMzRcMTFcMFwzXDEwNSIrCi0gICAgIlwxXDBcMVwxMDVcMTBcMFwxMVwxMDVcMVwwXDRcMTA1XDFcMFwyXDEwNSIrCi0gICAgIlwxXDBcMVwxMDVcMVwwXDNcMTA1XDdcMFwxXDEwNVwxXDIwN1wzXDAiKwotICAgICJcMVwxMDVcMVwyMTFcMTFcMFwzXDEwNVwxXDBcMVwxMDVcMTBcMFwxMVwxMDUiKwotICAgICJcMVwwXDRcMTA1XDFcMFwyXDEwNVwxXDBcMVwxMDVcMVwwXDNcMTA1IisKLSAgICAiXDZcMFwxXDExM1wxXDIxMlwxXDIxM1wzXDBcMVwyMTJcMVwyMTRcM1wwIisKLSAgICAiXDFcMjE1XDVcMFwzXDIxMlwxXDBcMVwyMTJcMTBcMFwxMVwyMTJcMVwwIisKLSAgICAiXDRcMjEyXDFcMFwyXDIxMlwxXDBcMVwyMTJcMVwwXDNcMjEyXDRcMCIrCi0gICAgIlwxXDIxNlwxXDBcMlwxMTRcMVwyMTdcM1wwXDJcMTE0XDNcMFwxXDIyMCIrCi0gICAgIlw1XDBcM1wxMTRcMVwyMjFcMVwxMTRcMTBcMFwxMVwxMTRcMVwwXDRcMTE0IisKLSAgICAiXDFcMFwyXDExNFwxXDBcMVwxMTRcMVwwXDNcMTE0XDZcMFwxXDIyMiIrCi0gICAgIlwyXDExNFwxXDBcMlwxMTRcMVwyMjJcMlwxMTRcMVwwXDRcMTE0XDJcMCIrCi0gICAgIlwxNlwxMTRcMVwyMjJcMlwxMTRcMVwyMjJcMlwxMTRcMVwyMjJcMTBcMTE0XDFcMjIyIisKLSAgICAiXDRcMTE0XDFcMjIyXDdcMTE0XDFcMFwyXDIyM1wxXDIyNFwxXDBcMVwyMjUiKwotICAgICJcMTFcMjIzXDJcMFw1MlwyMjNcMVwwXDFcMTEzXDFcMTE0XDFcMjE3XDNcMCIrCi0gICAgIlwxXDExNFwxXDEzNFwzXDBcMVwyMTVcNVwwXDNcMTE0XDFcMFwxXDExNCIrCi0gICAgIlwxMFwwXDExXDExNFwxXDBcNFwxMTRcMVwwXDJcMTE0XDFcMFwxXDExNCIrCi0gICAgIlwxXDBcM1wxMTRcNlwwXDJcMjI2XDFcMjI3XDFcMFw0XDIyNlwxXDIyNSIrCi0gICAgIlw1XDIyNlwyXDBcNTJcMjI2XDFcMFwxXDIzMFw3MlwwXDFcMTEzXDEyXDAiKwotICAgICJcMVwyMTVcNTdcMFwyXDIzMVwxXDIzMlwzXDBcMlwyMzFcMTFcMFwzXDIzMSIrCi0gICAgIlwxXDBcMVwyMzFcMTBcMFwxMVwyMzFcMVwwXDRcMjMxXDFcMFwyXDIzMSIrCi0gICAgIlwxXDBcMVwyMzFcMVwwXDNcMjMxXDZcMFwyXDExNFwxXDIxN1wzXDAiKwotICAgICJcMlwxMTRcM1wwXDFcMjIwXDFcMjMzXDRcMFwxXDExNFwxXDIzNFwxXDExNCIrCi0gICAgIlwxXDIyMVwxXDExNFwxMFwwXDExXDExNFwxXDBcNFwxMTRcMVwwXDJcMTE0IisKLSAgICAiXDFcMFwxXDExNFwxXDBcM1wxMTRcMTFcMFwxXDIzNVwxXDBcMVwyMzUiKwotICAgICJcM1wwXDFcMjM1XDRcMFwyXDIzNVwzMFwwXDFcMjM2XDIxXDBcNFwyMzciKwotICAgICJcMVwxMzFcMVwyMzdcMVwxMzFcM1wyMzdcMVwxMzFcNFwyMzdcMlwxMzFcMTJcMjM3IisKLSAgICAiXDFcMFwxNFwyMzdcMVwwXDIyXDIzN1wxXDBcMVwyNDBcMVwyNVwxXDEzMiIrCi0gICAgIlwxXDI1XDFcMFwxXDI1XDFcMjQwXDFcMjVcMVwwXDFcMjVcNFwwIisKLSAgICAiXDJcMjVcMVwwXDNcMjVcMVwwXDFcMjVcMTBcMFwxXDI0MFwyXDI1IisKLSAgICAiXDFcMjQwXDJcMjVcMVwyNDBcMlwyNVwxXDBcNFwyNVwxXDBcMVwyNDAiKwotICAgICJcMVwyNVwxXDBcMVwyNVwxXDBcMVwyNDBcMlwyNVwzN1wwXDFcMjQxIisKLSAgICAiXDQxXDBcMVwyNDJcMlwxMzVcMVwwXDJcMTM1XDFcMjQyXDJcMTM1XDFcMCIrCi0gICAgIlw0XDEzNVwyXDBcMTZcMTM1XDFcMjQyXDJcMTM1XDFcMjQyXDJcMTM1XDFcMjQyIisKLSAgICAiXDEwXDEzNVwxXDI0Mlw0XDEzNVwxXDI0Mlw3XDEzNVwxXDBcMVwyNDNcMlwxMzciKwotICAgICJcMVwwXDJcMTM3XDFcMjQzXDJcMTM3XDFcMFw0XDEzN1wyXDBcMTZcMTM3IisKLSAgICAiXDFcMjQzXDJcMTM3XDFcMjQzXDJcMTM3XDFcMjQzXDEwXDEzN1wxXDI0M1w0XDEzNyIrCi0gICAgIlwxXDI0M1w3XDEzN1wxMFwwXDFcMjQ0XDYyXDBcMzVcMTQyXDFcMjQ1XDM1XDE0MiIrCi0gICAgIlw0MVwwXDFcMjQ2XDEwM1wwXDFcMjQ3XDY1XDBcMlwyNTBcNjZcMFwyXDI1MSIrCi0gICAgIlwxMDNcMFwxXDI1MlwxN1wwXDJcMTUwXDFcMTUxXDNcMFwyXDE1MFwxMVwwIisKLSAgICAiXDNcMTUwXDFcMjUzXDFcMTUwXDEwXDBcMTFcMTUwXDFcMFw0XDE1MFwxXDAiKwotICAgICJcMlwxNTBcMVwwXDFcMTUwXDFcMFwzXDE1MFw2XDBcMVwyNTRcMlwxNTAiKwotICAgICJcMVwwXDJcMTUwXDFcMjU0XDJcMTUwXDFcMFw0XDE1MFwyXDBcMTZcMTUwIisKLSAgICAiXDFcMjU0XDJcMTUwXDFcMjU0XDJcMTUwXDFcMjU0XDEwXDE1MFwxXDI1NFw0XDE1MCIrCi0gICAgIlwxXDI1NFw3XDE1MFwyXDBcMVwxNTBcMVwxNTFcM1wwXDFcMTUwXDEyXDAiKwotICAgICJcM1wxNTBcMVwwXDFcMTUwXDEwXDBcMTFcMTUwXDFcMFw0XDE1MFwxXDAiKwotICAgICJcMlwxNTBcMVwwXDFcMTUwXDFcMFwzXDE1MFw2XDBcMVwyNTVcMVwxNTMiKwotICAgICJcMVwxNTRcMVwxNTNcMVwyNTZcMVwxNTNcMVwyNTVcMTBcMTUzXDFcMjU3XDE2XDE1MyIrCi0gICAgIlwxXDI1NVwyXDE1M1wxXDI1NVwyXDE1M1wxXDI1NVwxMFwxNTNcMVwyNTVcNFwxNTMiKwotICAgICJcMVwyNTVcN1wxNTNcMVwwXDFcMjYwXDFcMTU2XDFcMTU3XDNcMTU2XDFcMjYwIisKLSAgICAiXDFcMTU2XDFcMjYxXDZcMTU2XDFcMjYyXDE2XDE1NlwxXDI2MFwyXDE1NlwxXDI2MCIrCi0gICAgIlwyXDE1NlwxXDI2MFwxMFwxNTZcMVwyNjBcNFwxNTZcMVwyNjBcN1wxNTZcMVwwIisKLSAgICAiXDFcMjYzXDFcMTYwXDFcMTYxXDFcMTYwXDFcMjY0XDFcMTYwXDFcMjYzXDEwXDE2MCIrCi0gICAgIlwxXDI2NVwxNlwxNjBcMVwyNjNcMlwxNjBcMVwyNjNcMlwxNjBcMVwyNjNcMTBcMTYwIisKLSAgICAiXDFcMjYzXDRcMTYwXDFcMjYzXDdcMTYwXDFcMFwxXDI2NlwxXDE2M1wxXDE2NCIrCi0gICAgIlwzXDE2M1wxXDI2NlwxXDE2M1wxXDI2N1w2XDE2M1wxXDI3MFwxNlwxNjNcMVwyNjYiKwotICAgICJcMlwxNjNcMVwyNjZcMlwxNjNcMVwyNjZcMTBcMTYzXDFcMjY2XDRcMTYzXDFcMjY2IisKLSAgICAiXDdcMTYzXDI0XDBcMVwyNzFcNDdcMFwxXDI3MlwxXDUxXDFcMTY2XDFcNTEiKwotICAgICJcMVwwXDFcNTFcMVwyNzJcMVw1MVwxXDBcMVw1MVw0XDBcMlw1MSIrCi0gICAgIlwxXDBcM1w1MVwxXDBcMVw1MVwxMFwwXDFcMjcyXDJcNTFcMVwyNzIiKwotICAgICJcMlw1MVwxXDI3MlwyXDUxXDFcMFw0XDUxXDFcMFwxXDI3MlwxXDUxIisKLSAgICAiXDFcMFwxXDUxXDFcMFwxXDI3MlwyXDUxXDZcMFwxXDI3M1wxXDU1IisKLSAgICAiXDFcMTcwXDFcNTVcMVwwXDFcNTVcMVwyNzNcMVw1NVwxXDBcMVw1NSIrCi0gICAgIlw0XDBcMlw1NVwxXDBcM1w1NVwxXDBcMVw1NVwxMFwwXDFcMjczIisKLSAgICAiXDJcNTVcMVwyNzNcMlw1NVwxXDI3M1wyXDU1XDFcMFw0XDU1XDFcMCIrCi0gICAgIlwxXDI3M1wxXDU1XDFcMFwxXDU1XDFcMFwxXDI3M1wyXDU1XDZcMCIrCi0gICAgIlwxXDI3NFwxXDYyXDFcMTcyXDFcNjJcMVwwXDFcNjJcMVwyNzRcMVw2MiIrCi0gICAgIlwxXDBcMVw2Mlw0XDBcMlw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxMFwwXDFcMjc0XDJcNjJcMVwyNzRcMlw2MlwxXDI3NFwyXDYyXDFcMCIrCi0gICAgIlw0XDYyXDFcMFwxXDI3NFwxXDYyXDFcMFwxXDYyXDFcMFwxXDI3NCIrCi0gICAgIlwyXDYyXDdcMFwxXDYyXDFcMTcyXDNcMFwxXDYyXDEyXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxMFwwXDExXDYyXDFcMFw0XDYyXDFcMFwyXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMFwzXDYyXDZcMFwxXDI3NVwxXDcyXDFcMTc2IisKLSAgICAiXDFcNzJcMVwwXDFcNzJcMVwyNzVcMVw3MlwxXDBcMVw3Mlw0XDAiKwotICAgICJcMlw3MlwxXDBcM1w3MlwxXDBcMVw3MlwxMFwwXDFcMjc1XDJcNzIiKwotICAgICJcMVwyNzVcMlw3MlwxXDI3NVwyXDcyXDFcMFw0XDcyXDFcMFwxXDI3NSIrCi0gICAgIlwxXDcyXDFcMFwxXDcyXDFcMFwxXDI3NVwyXDcyXDZcMFwxXDI3NiIrCi0gICAgIlwxXDEwMFwxXDIwMFwxXDEwMFwxXDBcMVwxMDBcMVwyNzZcMVwxMDBcMVwwIisKLSAgICAiXDFcMTAwXDRcMFwyXDEwMFwxXDBcM1wxMDBcMVwwXDFcMTAwXDEwXDAiKwotICAgICJcMVwyNzZcMlwxMDBcMVwyNzZcMlwxMDBcMVwyNzZcMlwxMDBcMVwwXDRcMTAwIisKLSAgICAiXDFcMFwxXDI3NlwxXDEwMFwxXDBcMVwxMDBcMVwwXDFcMjc2XDJcMTAwIisKLSAgICAiXDZcMFwxXDI3N1wxXDIwMlwxXDIwM1wxXDIwMlwxXDMwMFwxXDIwMlwxXDI3NyIrCi0gICAgIlwxMFwyMDJcMVwzMDFcMTZcMjAyXDFcMjc3XDJcMjAyXDFcMjc3XDJcMjAyXDFcMjc3IisKLSAgICAiXDEwXDIwMlwxXDI3N1w0XDIwMlwxXDI3N1w3XDIwMlwxXDBcMVwzMDJcMVwyMDUiKwotICAgICJcMVwyMDZcM1wyMDVcMVwzMDJcMVwyMDVcMVwzMDNcNlwyMDVcMVwzMDRcMTZcMjA1IisKLSAgICAiXDFcMzAyXDJcMjA1XDFcMzAyXDJcMjA1XDFcMzAyXDEwXDIwNVwxXDMwMlw0XDIwNSIrCi0gICAgIlwxXDMwMlw3XDIwNVwxXDBcMVwzMDVcMVwxMDVcMVwyMDdcMVwxMDVcMVwwIisKLSAgICAiXDFcMTA1XDFcMzA1XDFcMTA1XDFcMFwxXDEwNVw0XDBcMlwxMDVcMVwwIisKLSAgICAiXDNcMTA1XDFcMFwxXDEwNVwxMFwwXDFcMzA1XDJcMTA1XDFcMzA1XDJcMTA1IisKLSAgICAiXDFcMzA1XDJcMTA1XDFcMFw0XDEwNVwxXDBcMVwzMDVcMVwxMDVcMVwwIisKLSAgICAiXDFcMTA1XDFcMFwxXDMwNVwyXDEwNVw3XDBcMVwxMDVcMVwyMDdcM1wwIisKLSAgICAiXDFcMTA1XDEyXDBcM1wxMDVcMVwwXDFcMTA1XDEwXDBcMTFcMTA1XDFcMCIrCi0gICAgIlw0XDEwNVwxXDBcMlwxMDVcMVwwXDFcMTA1XDFcMFwzXDEwNVw2XDAiKwotICAgICJcMlwyMTJcMVwyMTNcM1wwXDJcMjEyXDExXDBcM1wyMTJcMVwwXDFcMjEyIisKLSAgICAiXDEwXDBcMTFcMjEyXDFcMFw0XDIxMlwxXDBcMlwyMTJcMVwwXDFcMjEyIisKLSAgICAiXDFcMFwzXDIxMlw2XDBcMVwzMDZcMlwyMTJcMVwwXDJcMjEyXDFcMzA2IisKLSAgICAiXDJcMjEyXDFcMFw0XDIxMlwyXDBcMTZcMjEyXDFcMzA2XDJcMjEyXDFcMzA2IisKLSAgICAiXDJcMjEyXDFcMzA2XDEwXDIxMlwxXDMwNlw0XDIxMlwxXDMwNlw3XDIxMlwyXDAiKwotICAgICJcMVwyMTJcMVwyMTNcM1wwXDFcMjEyXDEyXDBcM1wyMTJcMVwwXDFcMjEyIisKLSAgICAiXDEwXDBcMTFcMjEyXDFcMFw0XDIxMlwxXDBcMlwyMTJcMVwwXDFcMjEyIisKLSAgICAiXDFcMFwzXDIxMlw2XDBcMlwzMDdcMVwzMTBcM1wwXDJcMzA3XDExXDAiKwotICAgICJcM1wzMDdcMVwwXDFcMzA3XDEwXDBcMTFcMzA3XDFcMFw0XDMwN1wxXDAiKwotICAgICJcMlwzMDdcMVwwXDFcMzA3XDFcMFwzXDMwN1w2XDBcMVwzMTFcMVwxMTQiKwotICAgICJcMVwyMTdcMVwxMTRcMVwwXDFcMTE0XDFcMzExXDFcMTE0XDFcMFwxXDExNCIrCi0gICAgIlwxXDBcMVwyMjBcMlwwXDJcMTE0XDFcMFwzXDExNFwxXDIyMVwxXDExNCIrCi0gICAgIlwxMFwwXDFcMzExXDJcMTE0XDFcMzExXDJcMTE0XDFcMzExXDJcMTE0XDFcMCIrCi0gICAgIlw0XDExNFwxXDBcMVwzMTFcMVwxMTRcMVwwXDFcMTE0XDFcMFwxXDMxMSIrCi0gICAgIlwyXDExNFw2XDBcMVwzMTJcMVwyMjNcMVwyMjRcMVwyMjNcMVwzMTNcMVwyMjMiKwotICAgICJcMVwzMTJcMTBcMjIzXDFcMzE0XDE2XDIyM1wxXDMxMlwyXDIyM1wxXDMxMlwyXDIyMyIrCi0gICAgIlwxXDMxMlwxMFwyMjNcMVwzMTJcNFwyMjNcMVwzMTJcN1wyMjNcMVwwXDFcMzE1IisKLSAgICAiXDFcMjI2XDFcMjI3XDNcMjI2XDFcMzE1XDFcMjI2XDFcMzE2XDZcMjI2XDFcMzE3IisKLSAgICAiXDE2XDIyNlwxXDMxNVwyXDIyNlwxXDMxNVwyXDIyNlwxXDMxNVwxMFwyMjZcMVwzMTUiKwotICAgICJcNFwyMjZcMVwzMTVcN1wyMjZcMVwwXDFcMjMwXDFcMjEyXDFcMjEzXDNcMCIrCi0gICAgIlwxXDIxMlwxXDIxNFwxMVwwXDNcMjEyXDFcMFwxXDIxMlwxMFwwXDExXDIxMiIrCi0gICAgIlwxXDBcNFwyMTJcMVwwXDJcMjEyXDFcMFwxXDIxMlwxXDBcM1wyMTIiKwotICAgICJcNFwwXDFcMjE2XDFcMFwxXDMyMFwyXDIzMVwxXDBcMlwyMzFcMVwzMjAiKwotICAgICJcMlwyMzFcMVwwXDRcMjMxXDJcMFwxNlwyMzFcMVwzMjBcMlwyMzFcMVwzMjAiKwotICAgICJcMlwyMzFcMVwzMjBcMTBcMjMxXDFcMzIwXDRcMjMxXDFcMzIwXDdcMjMxXDFcMCIrCi0gICAgIlwxXDMyMVw1XDBcMVwzMjFcMTZcMFwyXDMyMVw3XDBcMlwzMjFcMVwwIisKLSAgICAiXDJcMzIxXDFcMFwyXDMyMVw3XDBcMlwzMjFcM1wwXDJcMzIxXDdcMCIrCi0gICAgIlwyXDExNFwxXDIxN1wzXDBcMlwxMTRcM1wwXDFcMjIwXDVcMFwyXDExNCIrCi0gICAgIlwxXDMyMlwxXDIyMVwxXDExNFwxMFwwXDExXDExNFwxXDBcNFwxMTRcMVwwIisKLSAgICAiXDJcMTE0XDFcMFwxXDExNFwxXDBcM1wxMTRcNTdcMFwxXDMyM1wyMVwwIisKLSAgICAiXDFcMzI0XDFcMjVcMVwxMzJcMVwyNVwxXDBcMVwyNVwxXDMyNFwxXDI1IisKLSAgICAiXDFcMFwxXDI1XDRcMFwyXDI1XDFcMFwzXDI1XDFcMFwxXDI1IisKLSAgICAiXDEwXDBcMVwzMjRcMlwyNVwxXDMyNFwyXDI1XDFcMzI0XDJcMjVcMVwwIisKLSAgICAiXDRcMjVcMVwwXDFcMzI0XDFcMjVcMVwwXDFcMjVcMVwwXDFcMzI0IisKLSAgICAiXDJcMjVcNlwwXDFcMzI1XDFcMTM1XDFcMTM2XDFcMTM1XDFcMFwxXDEzNSIrCi0gICAgIlwxXDMyNVwxXDEzNVwxXDBcMVwxMzVcNFwwXDJcMTM1XDFcMFwzXDEzNSIrCi0gICAgIlwxXDBcMVwxMzVcMTBcMFwxXDMyNVwyXDEzNVwxXDMyNVwyXDEzNVwxXDMyNSIrCi0gICAgIlwyXDEzNVwxXDBcNFwxMzVcMVwwXDFcMzI1XDFcMTM1XDFcMFwxXDEzNSIrCi0gICAgIlwxXDBcMVwzMjVcMlwxMzVcNlwwXDFcMzI2XDFcMTM3XDFcMTQwXDFcMTM3IisKLSAgICAiXDFcMFwxXDEzN1wxXDMyNlwxXDEzN1wxXDBcMVwxMzdcNFwwXDJcMTM3IisKLSAgICAiXDFcMFwzXDEzN1wxXDBcMVwxMzdcMTBcMFwxXDMyNlwyXDEzN1wxXDMyNiIrCi0gICAgIlwyXDEzN1wxXDMyNlwyXDEzN1wxXDBcNFwxMzdcMVwwXDFcMzI2XDFcMTM3IisKLSAgICAiXDFcMFwxXDEzN1wxXDBcMVwzMjZcMlwxMzdcMTVcMFwxXDMyN1w2MlwwIisKLSAgICAiXDM0XDE0MlwxXDMzMFwxXDI0NVwzNVwxNDJcNDJcMFwyXDMzMVwxMDJcMFwxXDMzMiIrCi0gICAgIlw3NVwwXDJcMzMzXDc0XDBcMVwzMzRcNzZcMFwxXDMzNVw3XDBcMVwzMzYiKwotICAgICJcMVwzMzdcMVwyNTNcMVwwXDFcMjUzXDFcMzM2XDFcMzQwXDFcMFwxXDI1MyIrCi0gICAgIlw0XDBcMlwyNTNcMVwwXDNcMzM2XDFcMFwxXDMzNlwxMFwwXDExXDMzNiIrCi0gICAgIlwxXDBcNFwzMzZcMVwwXDJcMzM2XDFcMFwxXDMzNlwxXDBcM1wzMzYiKwotICAgICJcNlwwXDFcMzQxXDFcMTUwXDFcMTUxXDFcMTUwXDFcMFwxXDE1MFwxXDM0MSIrCi0gICAgIlwxXDE1MFwxXDBcMVwxNTBcNFwwXDJcMTUwXDFcMFwzXDE1MFwxXDI1MyIrCi0gICAgIlwxXDE1MFwxMFwwXDFcMzQxXDJcMTUwXDFcMzQxXDJcMTUwXDFcMzQxXDJcMTUwIisKLSAgICAiXDFcMFw0XDE1MFwxXDBcMVwzNDFcMVwxNTBcMVwwXDFcMTUwXDFcMCIrCi0gICAgIlwxXDM0MVwyXDE1MFw2XDBcMVwzNDJcMVwxNTNcMVwxNTRcMVwxNTNcMVwxNTUiKwotICAgICJcMVwxNTNcMVwzNDJcMjdcMTUzXDFcMzQyXDJcMTUzXDFcMzQyXDJcMTUzXDFcMzQyIisKLSAgICAiXDEwXDE1M1wxXDM0Mlw0XDE1M1wxXDM0Mlw3XDE1M1wxXDBcMlwxNTNcMVwxNTQiKwotICAgICJcMVwwXDFcMTU1XDEyXDE1M1wxXDBcNTJcMTUzXDFcMFwxXDM0M1wxXDE1NiIrCi0gICAgIlwxXDE1N1wzXDE1NlwxXDM0M1wxXDE1NlwxXDE1NVwyNVwxNTZcMVwzNDNcMlwxNTYiKwotICAgICJcMVwzNDNcMlwxNTZcMVwzNDNcMTBcMTU2XDFcMzQzXDRcMTU2XDFcMzQzXDdcMTU2IisKLSAgICAiXDFcMFwyXDE1NlwxXDE1N1wxXDBcNFwxNTZcMVwxNTVcNlwxNTZcMVwwIisKLSAgICAiXDUyXDE1NlwxXDBcMVwzNDRcMVwxNjBcMVwxNjFcMVwxNjBcMVwxNjJcMVwxNjAiKwotICAgICJcMVwzNDRcMjdcMTYwXDFcMzQ0XDJcMTYwXDFcMzQ0XDJcMTYwXDFcMzQ0XDEwXDE2MCIrCi0gICAgIlwxXDM0NFw0XDE2MFwxXDM0NFw3XDE2MFwxXDBcMlwxNjBcMVwxNjFcMVwwIisKLSAgICAiXDFcMTYyXDEyXDE2MFwxXDBcNTJcMTYwXDFcMFwxXDM0NVwxXDE2M1wxXDE2NCIrCi0gICAgIlwzXDE2M1wxXDM0NVwxXDE2M1wxXDE2MlwyNVwxNjNcMVwzNDVcMlwxNjNcMVwzNDUiKwotICAgICJcMlwxNjNcMVwzNDVcMTBcMTYzXDFcMzQ1XDRcMTYzXDFcMzQ1XDdcMTYzXDFcMCIrCi0gICAgIlwyXDE2M1wxXDE2NFwxXDBcNFwxNjNcMVwxNjJcNlwxNjNcMVwwXDUyXDE2MyIrCi0gICAgIlwyNVwwXDFcMzQ2XDQ2XDBcMVwzNDdcMVw1MVwxXDE2NlwxXDUxXDFcMCIrCi0gICAgIlwxXDUxXDFcMzQ3XDFcNTFcMVwwXDFcNTFcNFwwXDJcNTFcMVwwIisKLSAgICAiXDNcNTFcMVwwXDFcNTFcMTBcMFwxXDM0N1wyXDUxXDFcMzQ3XDJcNTEiKwotICAgICJcMVwzNDdcMlw1MVwxXDBcNFw1MVwxXDBcMVwzNDdcMVw1MVwxXDAiKwotICAgICJcMVw1MVwxXDBcMVwzNDdcMlw1MVw2XDBcMVwzNTBcMVw1NVwxXDE3MCIrCi0gICAgIlwxXDU1XDFcMFwxXDU1XDFcMzUwXDFcNTVcMVwwXDFcNTVcNFwwIisKLSAgICAiXDJcNTVcMVwwXDNcNTVcMVwwXDFcNTVcMTBcMFwxXDM1MFwyXDU1IisKLSAgICAiXDFcMzUwXDJcNTVcMVwzNTBcMlw1NVwxXDBcNFw1NVwxXDBcMVwzNTAiKwotICAgICJcMVw1NVwxXDBcMVw1NVwxXDBcMVwzNTBcMlw1NVw2XDBcMVwzNTEiKwotICAgICJcMVw2MlwxXDE3MlwxXDYyXDFcMFwxXDYyXDFcMzUxXDFcNjJcMVwwIisKLSAgICAiXDFcNjJcNFwwXDJcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMTBcMCIrCi0gICAgIlwxXDM1MVwyXDYyXDFcMzUxXDJcNjJcMVwzNTFcMlw2MlwxXDBcNFw2MiIrCi0gICAgIlwxXDBcMVwzNTFcMVw2MlwxXDBcMVw2MlwxXDBcMVwzNTFcMlw2MiIrCi0gICAgIlw2XDBcMVwzNTJcMVw3MlwxXDE3NlwxXDcyXDFcMFwxXDcyXDFcMzUyIisKLSAgICAiXDFcNzJcMVwwXDFcNzJcNFwwXDJcNzJcMVwwXDNcNzJcMVwwIisKLSAgICAiXDFcNzJcMTBcMFwxXDM1MlwyXDcyXDFcMzUyXDJcNzJcMVwzNTJcMlw3MiIrCi0gICAgIlwxXDBcNFw3MlwxXDBcMVwzNTJcMVw3MlwxXDBcMVw3MlwxXDAiKwotICAgICJcMVwzNTJcMlw3Mlw2XDBcMVwzNTNcMVwxMDBcMVwyMDBcMVwxMDBcMVwwIisKLSAgICAiXDFcMTAwXDFcMzUzXDFcMTAwXDFcMFwxXDEwMFw0XDBcMlwxMDBcMVwwIisKLSAgICAiXDNcMTAwXDFcMFwxXDEwMFwxMFwwXDFcMzUzXDJcMTAwXDFcMzUzXDJcMTAwIisKLSAgICAiXDFcMzUzXDJcMTAwXDFcMFw0XDEwMFwxXDBcMVwzNTNcMVwxMDBcMVwwIisKLSAgICAiXDFcMTAwXDFcMFwxXDM1M1wyXDEwMFw2XDBcMVwzNTRcMVwyMDJcMVwyMDMiKwotICAgICJcMVwyMDJcMVwyMDRcMVwyMDJcMVwzNTRcMjdcMjAyXDFcMzU0XDJcMjAyXDFcMzU0IisKLSAgICAiXDJcMjAyXDFcMzU0XDEwXDIwMlwxXDM1NFw0XDIwMlwxXDM1NFw3XDIwMlwxXDAiKwotICAgICJcMlwyMDJcMVwyMDNcMVwwXDFcMjA0XDEyXDIwMlwxXDBcNTJcMjAyXDFcMCIrCi0gICAgIlwxXDM1NVwxXDIwNVwxXDIwNlwzXDIwNVwxXDM1NVwxXDIwNVwxXDIwNFwyNVwyMDUiKwotICAgICJcMVwzNTVcMlwyMDVcMVwzNTVcMlwyMDVcMVwzNTVcMTBcMjA1XDFcMzU1XDRcMjA1IisKLSAgICAiXDFcMzU1XDdcMjA1XDFcMFwyXDIwNVwxXDIwNlwxXDBcNFwyMDVcMVwyMDQiKwotICAgICJcNlwyMDVcMVwwXDUyXDIwNVwxXDBcMVwzNTZcMVwxMDVcMVwyMDdcMVwxMDUiKwotICAgICJcMVwwXDFcMTA1XDFcMzU2XDFcMTA1XDFcMFwxXDEwNVw0XDBcMlwxMDUiKwotICAgICJcMVwwXDNcMTA1XDFcMFwxXDEwNVwxMFwwXDFcMzU2XDJcMTA1XDFcMzU2IisKLSAgICAiXDJcMTA1XDFcMzU2XDJcMTA1XDFcMFw0XDEwNVwxXDBcMVwzNTZcMVwxMDUiKwotICAgICJcMVwwXDFcMTA1XDFcMFwxXDM1NlwyXDEwNVw2XDBcMVwzNTdcMVwyMTIiKwotICAgICJcMVwyMTNcMVwyMTJcMVwwXDFcMjEyXDFcMzU3XDFcMjEyXDFcMFwxXDIxMiIrCi0gICAgIlw0XDBcMlwyMTJcMVwwXDNcMjEyXDFcMFwxXDIxMlwxMFwwXDFcMzU3IisKLSAgICAiXDJcMjEyXDFcMzU3XDJcMjEyXDFcMzU3XDJcMjEyXDFcMFw0XDIxMlwxXDAiKwotICAgICJcMVwzNTdcMVwyMTJcMVwwXDFcMjEyXDFcMFwxXDM1N1wyXDIxMlw2XDAiKwotICAgICJcMlwzMDdcMVwzMTBcM1wwXDJcMzA3XDNcMFwxXDIyMFw1XDBcM1wzMDciKwotICAgICJcMVwwXDFcMzA3XDEwXDBcMTFcMzA3XDFcMFw0XDMwN1wxXDBcMlwzMDciKwotICAgICJcMVwwXDFcMzA3XDFcMFwzXDMwN1w2XDBcMVwzNjBcMlwzMDdcMVwwIisKLSAgICAiXDJcMzA3XDFcMzYwXDJcMzA3XDFcMFw0XDMwN1wyXDBcMTZcMzA3XDFcMzYwIisKLSAgICAiXDJcMzA3XDFcMzYwXDJcMzA3XDFcMzYwXDEwXDMwN1wxXDM2MFw0XDMwN1wxXDM2MCIrCi0gICAgIlw3XDMwN1wxXDBcMVwzNjFcMVwxMTRcMVwyMTdcMVwxMTRcMVwwXDFcMTE0IisKLSAgICAiXDFcMzYxXDFcMTE0XDFcMFwxXDExNFwxXDBcMVwyMjBcMlwwXDJcMTE0IisKLSAgICAiXDFcMFwzXDExNFwxXDIyMVwxXDExNFwxMFwwXDFcMzYxXDJcMTE0XDFcMzYxIisKLSAgICAiXDJcMTE0XDFcMzYxXDJcMTE0XDFcMFw0XDExNFwxXDBcMVwzNjFcMVwxMTQiKwotICAgICJcMVwwXDFcMTE0XDFcMFwxXDM2MVwyXDExNFw2XDBcMVwzNjJcMVwyMjMiKwotICAgICJcMVwyMjRcMVwyMjNcMVwyMjVcMVwyMjNcMVwzNjJcMjdcMjIzXDFcMzYyXDJcMjIzIisKLSAgICAiXDFcMzYyXDJcMjIzXDFcMzYyXDEwXDIyM1wxXDM2Mlw0XDIyM1wxXDM2Mlw3XDIyMyIrCi0gICAgIlwxXDBcMlwyMjNcMVwyMjRcMVwwXDFcMjI1XDEyXDIyM1wxXDBcNTJcMjIzIisKLSAgICAiXDFcMFwxXDM2M1wxXDIyNlwxXDIyN1wzXDIyNlwxXDM2M1wxXDIyNlwxXDIyNSIrCi0gICAgIlwyNVwyMjZcMVwzNjNcMlwyMjZcMVwzNjNcMlwyMjZcMVwzNjNcMTBcMjI2XDFcMzYzIisKLSAgICAiXDRcMjI2XDFcMzYzXDdcMjI2XDFcMFwyXDIyNlwxXDIyN1wxXDBcNFwyMjYiKwotICAgICJcMVwyMjVcNlwyMjZcMVwwXDUyXDIyNlwxXDBcMVwzNjRcMVwyMzFcMVwyMzIiKwotICAgICJcMVwyMzFcMVwwXDFcMjMxXDFcMzY0XDFcMjMxXDFcMFwxXDIzMVw0XDAiKwotICAgICJcMlwyMzFcMVwwXDNcMjMxXDFcMFwxXDIzMVwxMFwwXDFcMzY0XDJcMjMxIisKLSAgICAiXDFcMzY0XDJcMjMxXDFcMzY0XDJcMjMxXDFcMFw0XDIzMVwxXDBcMVwzNjQiKwotICAgICJcMVwyMzFcMVwwXDFcMjMxXDFcMFwxXDM2NFwyXDIzMVw2XDBcMVwzNjUiKwotICAgICJcNVwwXDFcMzY1XDFcMzY2XDE1XDBcMlwzNjVcN1wwXDJcMzY1XDFcMCIrCi0gICAgIlwyXDM2NVwxXDBcMlwzNjVcN1wwXDJcMzY1XDNcMFwyXDM2NVw3XDAiKwotICAgICJcMlwxMTRcMVwyMTdcM1wwXDJcMTE0XDNcMFwxXDIyMFw1XDBcM1wxMTQiKwotICAgICJcMVwzNjdcMVwxMTRcMTBcMFwxMVwxMTRcMVwwXDRcMTE0XDFcMFwyXDExNCIrCi0gICAgIlwxXDBcMVwxMTRcMVwwXDNcMTE0XDYwXDBcMVwzNzBcMjBcMFwxXDM3MSIrCi0gICAgIlwxXDI1XDFcMTMyXDFcMjVcMVwwXDFcMjVcMVwzNzFcMVwyNVwxXDAiKwotICAgICJcMVwyNVw0XDBcMlwyNVwxXDBcM1wyNVwxXDBcMVwyNVwxMFwwIisKLSAgICAiXDFcMzcxXDJcMjVcMVwzNzFcMlwyNVwxXDM3MVwyXDI1XDFcMFw0XDI1IisKLSAgICAiXDFcMFwxXDM3MVwxXDI1XDFcMFwxXDI1XDFcMFwxXDM3MVwyXDI1IisKLSAgICAiXDZcMFwxXDM3MlwxXDEzNVwxXDEzNlwxXDEzNVwxXDBcMVwxMzVcMVwzNzIiKwotICAgICJcMVwxMzVcMVwwXDFcMTM1XDRcMFwyXDEzNVwxXDBcM1wxMzVcMVwwIisKLSAgICAiXDFcMTM1XDEwXDBcMVwzNzJcMlwxMzVcMVwzNzJcMlwxMzVcMVwzNzJcMlwxMzUiKwotICAgICJcMVwwXDRcMTM1XDFcMFwxXDM3MlwxXDEzNVwxXDBcMVwxMzVcMVwwIisKLSAgICAiXDFcMzcyXDJcMTM1XDZcMFwxXDM3M1wxXDEzN1wxXDE0MFwxXDEzN1wxXDAiKwotICAgICJcMVwxMzdcMVwzNzNcMVwxMzdcMVwwXDFcMTM3XDRcMFwyXDEzN1wxXDAiKwotICAgICJcM1wxMzdcMVwwXDFcMTM3XDEwXDBcMVwzNzNcMlwxMzdcMVwzNzNcMlwxMzciKwotICAgICJcMVwzNzNcMlwxMzdcMVwwXDRcMTM3XDFcMFwxXDM3M1wxXDEzN1wxXDAiKwotICAgICJcMVwxMzdcMVwwXDFcMzczXDJcMTM3XDMwXDBcMVwzNzRcMTIzXDBcMVwzNzUiKwotICAgICJcNjdcMFwxXDM3Nlw2NlwwXDJcMzc3XDczXDBcMVx1MDEwMFwyNFwwXDJcMzM2IisKLSAgICAiXDFcMzM3XDFcdTAxMDFcMVwwXDFcdTAxMDFcMlwzMzZcMVwwXDFcdTAxMDFcMVx1MDEwMiIrCi0gICAgIlwzXDBcMlx1MDEwMVwxXDBcM1wzMzZcMVwwXDFcMzM2XDEwXDBcMTFcMzM2IisKLSAgICAiXDFcMFw0XDMzNlwxXDBcMlwzMzZcMVwwXDFcMzM2XDFcMFwzXDMzNiIrCi0gICAgIlw2XDBcMVx1MDEwM1wyXDMzNlwxXDBcMlwzMzZcMVx1MDEwM1wyXDMzNlwxXDAiKwotICAgICJcNFwzMzZcMlwwXDE2XDMzNlwxXHUwMTAzXDJcMzM2XDFcdTAxMDNcMlwzMzZcMVx1MDEwMyIrCi0gICAgIlwxMFwzMzZcMVx1MDEwM1w0XDMzNlwxXHUwMTAzXDdcMzM2XDJcMFwxXDMzNlwxXDMzNyIrCi0gICAgIlwzXDBcMVwzMzZcMTJcMFwzXDMzNlwxXDBcMVwzMzZcMTBcMFwxMVwzMzYiKwotICAgICJcMVwwXDRcMzM2XDFcMFwyXDMzNlwxXDBcMVwzMzZcMVwwXDNcMzM2IisKLSAgICAiXDZcMFwxXHUwMTA0XDFcMTUwXDFcMTUxXDFcMTUwXDFcMFwxXDE1MFwxXHUwMTA0IisKLSAgICAiXDFcMTUwXDFcMFwxXDE1MFw0XDBcMlwxNTBcMVwwXDNcMTUwXDFcMjUzIisKLSAgICAiXDFcMTUwXDEwXDBcMVx1MDEwNFwyXDE1MFwxXHUwMTA0XDJcMTUwXDFcdTAxMDRcMlwxNTAiKwotICAgICJcMVwwXDRcMTUwXDFcMFwxXHUwMTA0XDFcMTUwXDFcMFwxXDE1MFwxXDAiKwotICAgICJcMVx1MDEwNFwyXDE1MFw2XDBcMVx1MDEwNVwxXDE1M1wxXDE1NFwxXDE1M1wxXDE1NSIrCi0gICAgIlwxXDE1M1wxXHUwMTA1XDI3XDE1M1wxXHUwMTA1XDJcMTUzXDFcdTAxMDVcMlwxNTNcMVx1MDEwNSIrCi0gICAgIlwxMFwxNTNcMVx1MDEwNVw0XDE1M1wxXHUwMTA1XDdcMTUzXDFcMFwxXHUwMTA2XDFcMTU2IisKLSAgICAiXDFcMTU3XDNcMTU2XDFcdTAxMDZcMVwxNTZcMVwxNTVcMjVcMTU2XDFcdTAxMDZcMlwxNTYiKwotICAgICJcMVx1MDEwNlwyXDE1NlwxXHUwMTA2XDEwXDE1NlwxXHUwMTA2XDRcMTU2XDFcdTAxMDZcN1wxNTYiKwotICAgICJcMVwwXDFcdTAxMDdcMVwxNjBcMVwxNjFcMVwxNjBcMVwxNjJcMVwxNjBcMVx1MDEwNyIrCi0gICAgIlwyN1wxNjBcMVx1MDEwN1wyXDE2MFwxXHUwMTA3XDJcMTYwXDFcdTAxMDdcMTBcMTYwXDFcdTAxMDciKwotICAgICJcNFwxNjBcMVx1MDEwN1w3XDE2MFwxXDBcMVx1MDEwOFwxXDE2M1wxXDE2NFwzXDE2MyIrCi0gICAgIlwxXHUwMTA4XDFcMTYzXDFcMTYyXDI1XDE2M1wxXHUwMTA4XDJcMTYzXDFcdTAxMDhcMlwxNjMiKwotICAgICJcMVx1MDEwOFwxMFwxNjNcMVx1MDEwOFw0XDE2M1wxXHUwMTA4XDdcMTYzXDFcMFwyXHUwMTA5IisKLSAgICAiXDFcdTAxMGFcMVwzNDZcMVx1MDEwYlwxXDM0NlwyXHUwMTA5XDFcdTAxMGNcMVwzNDZcMVx1MDEwZCIrCi0gICAgIlwzXHUwMTA5XDJcMzQ2XDRcdTAxMDlcMVwwXDQ1XHUwMTA5XDFcMFwxXHUwMTBlXDFcNTEiKwotICAgICJcMVwxNjZcMVw1MVwxXDBcMVw1MVwxXHUwMTBlXDFcNTFcMVwwXDFcNTEiKwotICAgICJcNFwwXDJcNTFcMVwwXDNcNTFcMVwwXDFcNTFcMTBcMFwxXHUwMTBlIisKLSAgICAiXDJcNTFcMVx1MDEwZVwyXDUxXDFcdTAxMGVcMlw1MVwxXDBcNFw1MVwxXDAiKwotICAgICJcMVx1MDEwZVwxXDUxXDFcMFwxXDUxXDFcMFwxXHUwMTBlXDJcNTFcNlwwIisKLSAgICAiXDFcdTAxMGZcMVw1NVwxXDE3MFwxXDU1XDFcMFwxXDU1XDFcdTAxMGZcMVw1NSIrCi0gICAgIlwxXDBcMVw1NVw0XDBcMlw1NVwxXDBcM1w1NVwxXDBcMVw1NSIrCi0gICAgIlwxMFwwXDFcdTAxMGZcMlw1NVwxXHUwMTBmXDJcNTVcMVx1MDEwZlwyXDU1XDFcMCIrCi0gICAgIlw0XDU1XDFcMFwxXHUwMTBmXDFcNTVcMVwwXDFcNTVcMVwwXDFcdTAxMGYiKwotICAgICJcMlw1NVw2XDBcMVx1MDExMFwxXDYyXDFcMTcyXDFcNjJcMVwwXDFcNjIiKwotICAgICJcMVx1MDExMFwxXDYyXDFcMFwxXDYyXDRcMFwyXDYyXDFcMFwzXDYyIisKLSAgICAiXDFcMFwxXDYyXDEwXDBcMVx1MDExMFwyXDYyXDFcdTAxMTBcMlw2MlwxXHUwMTEwIisKLSAgICAiXDJcNjJcMVwwXDRcNjJcMVwwXDFcdTAxMTBcMVw2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcMVx1MDExMFwyXDYyXDZcMFwxXHUwMTExXDFcNzJcMVwxNzZcMVw3MiIrCi0gICAgIlwxXDBcMVw3MlwxXHUwMTExXDFcNzJcMVwwXDFcNzJcNFwwXDJcNzIiKwotICAgICJcMVwwXDNcNzJcMVwwXDFcNzJcMTBcMFwxXHUwMTExXDJcNzJcMVx1MDExMSIrCi0gICAgIlwyXDcyXDFcdTAxMTFcMlw3MlwxXDBcNFw3MlwxXDBcMVx1MDExMVwxXDcyIisKLSAgICAiXDFcMFwxXDcyXDFcMFwxXHUwMTExXDJcNzJcNlwwXDFcdTAxMTJcMVwxMDAiKwotICAgICJcMVwyMDBcMVwxMDBcMVwwXDFcMTAwXDFcdTAxMTJcMVwxMDBcMVwwXDFcMTAwIisKLSAgICAiXDRcMFwyXDEwMFwxXDBcM1wxMDBcMVwwXDFcMTAwXDEwXDBcMVx1MDExMiIrCi0gICAgIlwyXDEwMFwxXHUwMTEyXDJcMTAwXDFcdTAxMTJcMlwxMDBcMVwwXDRcMTAwXDFcMCIrCi0gICAgIlwxXHUwMTEyXDFcMTAwXDFcMFwxXDEwMFwxXDBcMVx1MDExMlwyXDEwMFw2XDAiKwotICAgICJcMVx1MDExM1wxXDIwMlwxXDIwM1wxXDIwMlwxXDIwNFwxXDIwMlwxXHUwMTEzXDI3XDIwMiIrCi0gICAgIlwxXHUwMTEzXDJcMjAyXDFcdTAxMTNcMlwyMDJcMVx1MDExM1wxMFwyMDJcMVx1MDExM1w0XDIwMiIrCi0gICAgIlwxXHUwMTEzXDdcMjAyXDFcMFwxXHUwMTE0XDFcMjA1XDFcMjA2XDNcMjA1XDFcdTAxMTQiKwotICAgICJcMVwyMDVcMVwyMDRcMjVcMjA1XDFcdTAxMTRcMlwyMDVcMVx1MDExNFwyXDIwNVwxXHUwMTE0IisKLSAgICAiXDEwXDIwNVwxXHUwMTE0XDRcMjA1XDFcdTAxMTRcN1wyMDVcMVwwXDFcdTAxMTVcMVwxMDUiKwotICAgICJcMVwyMDdcMVwxMDVcMVwwXDFcMTA1XDFcdTAxMTVcMVwxMDVcMVwwXDFcMTA1IisKLSAgICAiXDRcMFwyXDEwNVwxXDBcM1wxMDVcMVwwXDFcMTA1XDEwXDBcMVx1MDExNSIrCi0gICAgIlwyXDEwNVwxXHUwMTE1XDJcMTA1XDFcdTAxMTVcMlwxMDVcMVwwXDRcMTA1XDFcMCIrCi0gICAgIlwxXHUwMTE1XDFcMTA1XDFcMFwxXDEwNVwxXDBcMVx1MDExNVwyXDEwNVw2XDAiKwotICAgICJcMVx1MDExNlwxXDIxMlwxXDIxM1wxXDIxMlwxXDBcMVwyMTJcMVx1MDExNlwxXDIxMiIrCi0gICAgIlwxXDBcMVwyMTJcNFwwXDJcMjEyXDFcMFwzXDIxMlwxXDBcMVwyMTIiKwotICAgICJcMTBcMFwxXHUwMTE2XDJcMjEyXDFcdTAxMTZcMlwyMTJcMVx1MDExNlwyXDIxMlwxXDAiKwotICAgICJcNFwyMTJcMVwwXDFcdTAxMTZcMVwyMTJcMVwwXDFcMjEyXDFcMFwxXHUwMTE2IisKLSAgICAiXDJcMjEyXDZcMFwxXHUwMTE3XDFcMzA3XDFcMzEwXDFcMzA3XDFcMFwxXDMwNyIrCi0gICAgIlwxXHUwMTE3XDFcMzA3XDFcMFwxXDMwN1wxXDBcMVwyMjBcMlwwXDJcMzA3IisKLSAgICAiXDFcMFwzXDMwN1wxXDBcMVwzMDdcMTBcMFwxXHUwMTE3XDJcMzA3XDFcdTAxMTciKwotICAgICJcMlwzMDdcMVx1MDExN1wyXDMwN1wxXDBcNFwzMDdcMVwwXDFcdTAxMTdcMVwzMDciKwotICAgICJcMVwwXDFcMzA3XDFcMFwxXHUwMTE3XDJcMzA3XDZcMFwxXHUwMTE4XDFcMTE0IisKLSAgICAiXDFcMjE3XDFcMTE0XDFcMFwxXDExNFwxXHUwMTE4XDFcMTE0XDFcMFwxXDExNCIrCi0gICAgIlwxXDBcMVwyMjBcMlwwXDJcMTE0XDFcMFwzXDExNFwxXDIyMVwxXDExNCIrCi0gICAgIlwxMFwwXDFcdTAxMThcMlwxMTRcMVx1MDExOFwyXDExNFwxXHUwMTE4XDJcMTE0XDFcMCIrCi0gICAgIlw0XDExNFwxXDBcMVx1MDExOFwxXDExNFwxXDBcMVwxMTRcMVwwXDFcdTAxMTgiKwotICAgICJcMlwxMTRcNlwwXDFcdTAxMTlcMVwyMjNcMVwyMjRcMVwyMjNcMVwyMjVcMVwyMjMiKwotICAgICJcMVx1MDExOVwyN1wyMjNcMVx1MDExOVwyXDIyM1wxXHUwMTE5XDJcMjIzXDFcdTAxMTlcMTBcMjIzIisKLSAgICAiXDFcdTAxMTlcNFwyMjNcMVx1MDExOVw3XDIyM1wxXDBcMVx1MDExYVwxXDIyNlwxXDIyNyIrCi0gICAgIlwzXDIyNlwxXHUwMTFhXDFcMjI2XDFcMjI1XDI1XDIyNlwxXHUwMTFhXDJcMjI2XDFcdTAxMWEiKwotICAgICJcMlwyMjZcMVx1MDExYVwxMFwyMjZcMVx1MDExYVw0XDIyNlwxXHUwMTFhXDdcMjI2XDFcMCIrCi0gICAgIlwxXHUwMTFiXDFcMjMxXDFcMjMyXDFcMjMxXDFcMFwxXDIzMVwxXHUwMTFiXDFcMjMxIisKLSAgICAiXDFcMFwxXDIzMVw0XDBcMlwyMzFcMVwwXDNcMjMxXDFcMFwxXDIzMSIrCi0gICAgIlwxMFwwXDFcdTAxMWJcMlwyMzFcMVx1MDExYlwyXDIzMVwxXHUwMTFiXDJcMjMxXDFcMCIrCi0gICAgIlw0XDIzMVwxXDBcMVx1MDExYlwxXDIzMVwxXDBcMVwyMzFcMVwwXDFcdTAxMWIiKwotICAgICJcMlwyMzFcNlwwXDFcdTAxMWNcNVwwXDFcdTAxMWNcMVwzNjZcMTVcMFwyXHUwMTFjIisKLSAgICAiXDdcMFwyXHUwMTFjXDFcMFwyXHUwMTFjXDFcMFwyXHUwMTFjXDdcMFwyXHUwMTFjIisKLSAgICAiXDNcMFwyXHUwMTFjXDdcMFwxXHUwMTFkXDVcMFwxXHUwMTFkXDE2XDBcMlx1MDExZCIrCi0gICAgIlw3XDBcMlx1MDExZFwxXDBcMlx1MDExZFwxXDBcMlx1MDExZFw3XDBcMlx1MDExZCIrCi0gICAgIlwzXDBcMlx1MDExZFw3XDBcMlx1MDExZVwxXHUwMTFmXDFcdTAxMjBcMVx1MDEyMVwxXHUwMTIwIisKLSAgICAiXDJcdTAxMWVcMVx1MDEyMlwxXHUwMTIwXDFcdTAxMjNcM1x1MDExZVwyXHUwMTIwXDRcdTAxMWVcMVwwIisKLSAgICAiXDQ1XHUwMTFlXDU0XDBcMVx1MDEyNFwxN1wwXDFcdTAxMjVcMVwyNVwxXDEzMlwxXDI1IisKLSAgICAiXDFcMFwxXDI1XDFcdTAxMjVcMVwyNVwxXDBcMVwyNVw0XDBcMlwyNSIrCi0gICAgIlwxXDBcM1wyNVwxXDBcMVwyNVwxMFwwXDFcdTAxMjVcMlwyNVwxXHUwMTI1IisKLSAgICAiXDJcMjVcMVx1MDEyNVwyXDI1XDFcMFw0XDI1XDFcMFwxXHUwMTI1XDFcMjUiKwotICAgICJcMVwwXDFcMjVcMVwwXDFcdTAxMjVcMlwyNVw2XDBcMVx1MDEyNlwxXDEzNSIrCi0gICAgIlwxXDEzNlwxXDEzNVwxXDBcMVwxMzVcMVx1MDEyNlwxXDEzNVwxXDBcMVwxMzUiKwotICAgICJcNFwwXDJcMTM1XDFcMFwzXDEzNVwxXDBcMVwxMzVcMTBcMFwxXHUwMTI2IisKLSAgICAiXDJcMTM1XDFcdTAxMjZcMlwxMzVcMVx1MDEyNlwyXDEzNVwxXDBcNFwxMzVcMVwwIisKLSAgICAiXDFcdTAxMjZcMVwxMzVcMVwwXDFcMTM1XDFcMFwxXHUwMTI2XDJcMTM1XDZcMCIrCi0gICAgIlwxXHUwMTI3XDFcMTM3XDFcMTQwXDFcMTM3XDFcMFwxXDEzN1wxXHUwMTI3XDFcMTM3IisKLSAgICAiXDFcMFwxXDEzN1w0XDBcMlwxMzdcMVwwXDNcMTM3XDFcMFwxXDEzNyIrCi0gICAgIlwxMFwwXDFcdTAxMjdcMlwxMzdcMVx1MDEyN1wyXDEzN1wxXHUwMTI3XDJcMTM3XDFcMCIrCi0gICAgIlw0XDEzN1wxXDBcMVx1MDEyN1wxXDEzN1wxXDBcMVwxMzdcMVwwXDFcdTAxMjciKwotICAgICJcMlwxMzdcNTFcMFwxXHUwMTI4XDUxXDBcMVx1MDEyOVwxMTFcMFwyXHUwMTJhXDM3XDAiKwotICAgICJcMVx1MDEyYlw2NlwwXDFcdTAxMDFcMVwwXDFcdTAxMDFcM1wwXDFcdTAxMDFcMVx1MDEwMiIrCi0gICAgIlwzXDBcMlx1MDEwMVw1M1wwXDFcdTAxMmNcMVwzMzZcMVwzMzdcMVwzMzZcMVwwIisKLSAgICAiXDFcMzM2XDFcdTAxMmNcMVwzMzZcMVwwXDFcMzM2XDFcdTAxMDJcM1wwXDJcMzM2IisKLSAgICAiXDFcMFwzXDMzNlwxXDBcMVwzMzZcMTBcMFwxXHUwMTJjXDJcMzM2XDFcdTAxMmMiKwotICAgICJcMlwzMzZcMVx1MDEyY1wyXDMzNlwxXDBcNFwzMzZcMVwwXDFcdTAxMmNcMVwzMzYiKwotICAgICJcMVwwXDFcMzM2XDFcMFwxXHUwMTJjXDJcMzM2XDZcMFwxXHUwMTJkXDFcMTUwIisKLSAgICAiXDFcMTUxXDFcMTUwXDFcMFwxXDE1MFwxXHUwMTJkXDFcMTUwXDFcMFwxXDE1MCIrCi0gICAgIlw0XDBcMlwxNTBcMVwwXDNcMTUwXDFcMjUzXDFcMTUwXDEwXDBcMVx1MDEyZCIrCi0gICAgIlwyXDE1MFwxXHUwMTJkXDJcMTUwXDFcdTAxMmRcMlwxNTBcMVwwXDRcMTUwXDFcMCIrCi0gICAgIlwxXHUwMTJkXDFcMTUwXDFcMFwxXDE1MFwxXDBcMVx1MDEyZFwyXDE1MFw2XDAiKwotICAgICJcMVx1MDEyZVwxXDE1M1wxXDE1NFwxXDE1M1wxXDE1NVwxXDE1M1wxXHUwMTJlXDI3XDE1MyIrCi0gICAgIlwxXHUwMTJlXDJcMTUzXDFcdTAxMmVcMlwxNTNcMVx1MDEyZVwxMFwxNTNcMVx1MDEyZVw0XDE1MyIrCi0gICAgIlwxXHUwMTJlXDdcMTUzXDFcMFwxXHUwMTJmXDFcMTU2XDFcMTU3XDNcMTU2XDFcdTAxMmYiKwotICAgICJcMVwxNTZcMVwxNTVcMjVcMTU2XDFcdTAxMmZcMlwxNTZcMVx1MDEyZlwyXDE1NlwxXHUwMTJmIisKLSAgICAiXDEwXDE1NlwxXHUwMTJmXDRcMTU2XDFcdTAxMmZcN1wxNTZcMVwwXDFcdTAxMzBcMVwxNjAiKwotICAgICJcMVwxNjFcMVwxNjBcMVwxNjJcMVwxNjBcMVx1MDEzMFwyN1wxNjBcMVx1MDEzMFwyXDE2MCIrCi0gICAgIlwxXHUwMTMwXDJcMTYwXDFcdTAxMzBcMTBcMTYwXDFcdTAxMzBcNFwxNjBcMVx1MDEzMFw3XDE2MCIrCi0gICAgIlwxXDBcMVx1MDEzMVwxXDE2M1wxXDE2NFwzXDE2M1wxXHUwMTMxXDFcMTYzXDFcMTYyIisKLSAgICAiXDI1XDE2M1wxXHUwMTMxXDJcMTYzXDFcdTAxMzFcMlwxNjNcMVx1MDEzMVwxMFwxNjNcMVx1MDEzMSIrCi0gICAgIlw0XDE2M1wxXHUwMTMxXDdcMTYzXDFcMFwyXHUwMTA5XDFcdTAxMGFcMVx1MDEzMlwxXDAiKwotICAgICJcM1x1MDEwOVwxXDBcMVx1MDEzMlwxXHUwMTBkXDNcdTAxMDlcMlx1MDEzMlw0XHUwMTA5XDFcMCIrCi0gICAgIlw0NVx1MDEwOVwxXDBcMVx1MDEzM1wxXHUwMTA5XDFcdTAxMGFcMVx1MDEzMlwyXHUwMTA5XDFcdTAxMzMiKwotICAgICJcMlx1MDEwOVwxXHUwMTMyXDFcdTAxMzRcM1x1MDEwOVwyXHUwMTMyXDE2XHUwMTA5XDFcdTAxMzNcMlx1MDEwOSIrCi0gICAgIlwxXHUwMTMzXDJcdTAxMDlcMVx1MDEzM1wxMFx1MDEwOVwxXHUwMTMzXDRcdTAxMDlcMVx1MDEzM1w3XHUwMTA5IisKLSAgICAiXDFcMFwyXHUwMTBiXDFcdTAxMzVcMVwwXDFcdTAxMzJcMTFcdTAxMGJcMlwwXDUyXHUwMTBiIisKLSAgICAiXDFcMFwyXHUwMTBjXDFcdTAxMzZcMVwwXDRcdTAxMGNcMVx1MDEzMlw1XHUwMTBjXDJcMCIrCi0gICAgIlw1Mlx1MDEwY1wxXDBcMVx1MDEzN1wxXDUxXDFcMTY2XDFcNTFcMVwwXDFcNTEiKwotICAgICJcMVx1MDEzN1wxXDUxXDFcMFwxXDUxXDRcMFwyXDUxXDFcMFwzXDUxIisKLSAgICAiXDFcMFwxXDUxXDEwXDBcMVx1MDEzN1wyXDUxXDFcdTAxMzdcMlw1MVwxXHUwMTM3IisKLSAgICAiXDJcNTFcMVwwXDRcNTFcMVwwXDFcdTAxMzdcMVw1MVwxXDBcMVw1MSIrCi0gICAgIlwxXDBcMVx1MDEzN1wyXDUxXDZcMFwxXHUwMTM4XDFcNTVcMVwxNzBcMVw1NSIrCi0gICAgIlwxXDBcMVw1NVwxXHUwMTM4XDFcNTVcMVwwXDFcNTVcNFwwXDJcNTUiKwotICAgICJcMVwwXDNcNTVcMVwwXDFcNTVcMTBcMFwxXHUwMTM4XDJcNTVcMVx1MDEzOCIrCi0gICAgIlwyXDU1XDFcdTAxMzhcMlw1NVwxXDBcNFw1NVwxXDBcMVx1MDEzOFwxXDU1IisKLSAgICAiXDFcMFwxXDU1XDFcMFwxXHUwMTM4XDJcNTVcNlwwXDFcdTAxMzlcMVw2MiIrCi0gICAgIlwxXDE3MlwxXDYyXDFcMFwxXDYyXDFcdTAxMzlcMVw2MlwxXDBcMVw2MiIrCi0gICAgIlw0XDBcMlw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxMFwwXDFcdTAxMzkiKwotICAgICJcMlw2MlwxXHUwMTM5XDJcNjJcMVx1MDEzOVwyXDYyXDFcMFw0XDYyXDFcMCIrCi0gICAgIlwxXHUwMTM5XDFcNjJcMVwwXDFcNjJcMVwwXDFcdTAxMzlcMlw2Mlw2XDAiKwotICAgICJcMVx1MDEzYVwxXDcyXDFcMTc2XDFcNzJcMVwwXDFcNzJcMVx1MDEzYVwxXDcyIisKLSAgICAiXDFcMFwxXDcyXDRcMFwyXDcyXDFcMFwzXDcyXDFcMFwxXDcyIisKLSAgICAiXDEwXDBcMVx1MDEzYVwyXDcyXDFcdTAxM2FcMlw3MlwxXHUwMTNhXDJcNzJcMVwwIisKLSAgICAiXDRcNzJcMVwwXDFcdTAxM2FcMVw3MlwxXDBcMVw3MlwxXDBcMVx1MDEzYSIrCi0gICAgIlwyXDcyXDZcMFwxXHUwMTNiXDFcMTAwXDFcMjAwXDFcMTAwXDFcMFwxXDEwMCIrCi0gICAgIlwxXHUwMTNiXDFcMTAwXDFcMFwxXDEwMFw0XDBcMlwxMDBcMVwwXDNcMTAwIisKLSAgICAiXDFcMFwxXDEwMFwxMFwwXDFcdTAxM2JcMlwxMDBcMVx1MDEzYlwyXDEwMFwxXHUwMTNiIisKLSAgICAiXDJcMTAwXDFcMFw0XDEwMFwxXDBcMVx1MDEzYlwxXDEwMFwxXDBcMVwxMDAiKwotICAgICJcMVwwXDFcdTAxM2JcMlwxMDBcNlwwXDFcdTAxM2NcMVwyMDJcMVwyMDNcMVwyMDIiKwotICAgICJcMVwyMDRcMVwyMDJcMVx1MDEzY1wyN1wyMDJcMVx1MDEzY1wyXDIwMlwxXHUwMTNjXDJcMjAyIisKLSAgICAiXDFcdTAxM2NcMTBcMjAyXDFcdTAxM2NcNFwyMDJcMVx1MDEzY1w3XDIwMlwxXDBcMVx1MDEzZCIrCi0gICAgIlwxXDIwNVwxXDIwNlwzXDIwNVwxXHUwMTNkXDFcMjA1XDFcMjA0XDI1XDIwNVwxXHUwMTNkIisKLSAgICAiXDJcMjA1XDFcdTAxM2RcMlwyMDVcMVx1MDEzZFwxMFwyMDVcMVx1MDEzZFw0XDIwNVwxXHUwMTNkIisKLSAgICAiXDdcMjA1XDFcMFwxXHUwMTNlXDFcMTA1XDFcMjA3XDFcMTA1XDFcMFwxXDEwNSIrCi0gICAgIlwxXHUwMTNlXDFcMTA1XDFcMFwxXDEwNVw0XDBcMlwxMDVcMVwwXDNcMTA1IisKLSAgICAiXDFcMFwxXDEwNVwxMFwwXDFcdTAxM2VcMlwxMDVcMVx1MDEzZVwyXDEwNVwxXHUwMTNlIisKLSAgICAiXDJcMTA1XDFcMFw0XDEwNVwxXDBcMVx1MDEzZVwxXDEwNVwxXDBcMVwxMDUiKwotICAgICJcMVwwXDFcdTAxM2VcMlwxMDVcNlwwXDFcdTAxM2ZcMVwyMTJcMVwyMTNcMVwyMTIiKwotICAgICJcMVwwXDFcMjEyXDFcdTAxM2ZcMVwyMTJcMVwwXDFcMjEyXDRcMFwyXDIxMiIrCi0gICAgIlwxXDBcM1wyMTJcMVwwXDFcMjEyXDEwXDBcMVx1MDEzZlwyXDIxMlwxXHUwMTNmIisKLSAgICAiXDJcMjEyXDFcdTAxM2ZcMlwyMTJcMVwwXDRcMjEyXDFcMFwxXHUwMTNmXDFcMjEyIisKLSAgICAiXDFcMFwxXDIxMlwxXDBcMVx1MDEzZlwyXDIxMlw2XDBcMVx1MDE0MFwxXDMwNyIrCi0gICAgIlwxXDMxMFwxXDMwN1wxXDBcMVwzMDdcMVx1MDE0MFwxXDMwN1wxXDBcMVwzMDciKwotICAgICJcMVwwXDFcMjIwXDJcMFwyXDMwN1wxXDBcM1wzMDdcMVwwXDFcMzA3IisKLSAgICAiXDEwXDBcMVx1MDE0MFwyXDMwN1wxXHUwMTQwXDJcMzA3XDFcdTAxNDBcMlwzMDdcMVwwIisKLSAgICAiXDRcMzA3XDFcMFwxXHUwMTQwXDFcMzA3XDFcMFwxXDMwN1wxXDBcMVx1MDE0MCIrCi0gICAgIlwyXDMwN1w2XDBcMVx1MDE0MVwxXDExNFwxXDIxN1wxXDExNFwxXDBcMVwxMTQiKwotICAgICJcMVx1MDE0MVwxXDExNFwxXDBcMVwxMTRcMVwwXDFcMjIwXDJcMFwyXDExNCIrCi0gICAgIlwxXDBcM1wxMTRcMVwyMjFcMVwxMTRcMTBcMFwxXHUwMTQxXDJcMTE0XDFcdTAxNDEiKwotICAgICJcMlwxMTRcMVx1MDE0MVwyXDExNFwxXDBcNFwxMTRcMVwwXDFcdTAxNDFcMVwxMTQiKwotICAgICJcMVwwXDFcMTE0XDFcMFwxXHUwMTQxXDJcMTE0XDZcMFwxXHUwMTQyXDFcMjIzIisKLSAgICAiXDFcMjI0XDFcMjIzXDFcMjI1XDFcMjIzXDFcdTAxNDJcMjdcMjIzXDFcdTAxNDJcMlwyMjMiKwotICAgICJcMVx1MDE0MlwyXDIyM1wxXHUwMTQyXDEwXDIyM1wxXHUwMTQyXDRcMjIzXDFcdTAxNDJcN1wyMjMiKwotICAgICJcMVwwXDFcdTAxNDNcMVwyMjZcMVwyMjdcM1wyMjZcMVx1MDE0M1wxXDIyNlwxXDIyNSIrCi0gICAgIlwyNVwyMjZcMVx1MDE0M1wyXDIyNlwxXHUwMTQzXDJcMjI2XDFcdTAxNDNcMTBcMjI2XDFcdTAxNDMiKwotICAgICJcNFwyMjZcMVx1MDE0M1w3XDIyNlwxXDBcMVx1MDE0NFwxXDIzMVwxXDIzMlwxXDIzMSIrCi0gICAgIlwxXDBcMVwyMzFcMVx1MDE0NFwxXDIzMVwxXDBcMVwyMzFcNFwwXDJcMjMxIisKLSAgICAiXDFcMFwzXDIzMVwxXDBcMVwyMzFcMTBcMFwxXHUwMTQ0XDJcMjMxXDFcdTAxNDQiKwotICAgICJcMlwyMzFcMVx1MDE0NFwyXDIzMVwxXDBcNFwyMzFcMVwwXDFcdTAxNDRcMVwyMzEiKwotICAgICJcMVwwXDFcMjMxXDFcMFwxXHUwMTQ0XDJcMjMxXDZcMFwxXHUwMTQ1XDVcMCIrCi0gICAgIlwxXHUwMTQ1XDFcMzY2XDE1XDBcMlx1MDE0NVw3XDBcMlx1MDE0NVwxXDBcMlx1MDE0NSIrCi0gICAgIlwxXDBcMlx1MDE0NVw3XDBcMlx1MDE0NVwzXDBcMlx1MDE0NVw3XDBcMVx1MDE0NiIrCi0gICAgIlw1XDBcMVx1MDE0NlwxNlwwXDJcdTAxNDZcN1wwXDJcdTAxNDZcMVwwXDJcdTAxNDYiKwotICAgICJcMVwwXDJcdTAxNDZcN1wwXDJcdTAxNDZcM1wwXDJcdTAxNDZcN1wwXDJcdTAxMWUiKwotICAgICJcMVx1MDExZlwxXHUwMTQ3XDFcMFwzXHUwMTFlXDFcMFwxXHUwMTQ3XDFcdTAxMjNcM1x1MDExZSIrCi0gICAgIlwyXHUwMTQ3XDRcdTAxMWVcMVwwXDQ1XHUwMTFlXDFcMFwxXHUwMTQ4XDFcdTAxMWVcMVx1MDExZiIrCi0gICAgIlwxXHUwMTQ3XDJcdTAxMWVcMVx1MDE0OFwyXHUwMTFlXDFcdTAxNDdcMVx1MDE0OVwzXHUwMTFlXDJcdTAxNDciKwotICAgICJcMTZcdTAxMWVcMVx1MDE0OFwyXHUwMTFlXDFcdTAxNDhcMlx1MDExZVwxXHUwMTQ4XDEwXHUwMTFlXDFcdTAxNDgiKwotICAgICJcNFx1MDExZVwxXHUwMTQ4XDdcdTAxMWVcMVwwXDJcdTAxMjFcMVx1MDE0YVwxXDBcMVx1MDE0NyIrCi0gICAgIlwxMVx1MDEyMVwyXDBcNTJcdTAxMjFcMVwwXDJcdTAxMjJcMVx1MDE0YlwxXDBcNFx1MDEyMiIrCi0gICAgIlwxXHUwMTQ3XDVcdTAxMjJcMlwwXDUyXHUwMTIyXDIzXDBcMVx1MDE0Y1w1MFwwXDFcdTAxNGQiKwotICAgICJcMVwyNVwxXDEzMlwxXDI1XDFcMFwxXDI1XDFcdTAxNGRcMVwyNVwxXDAiKwotICAgICJcMVwyNVw0XDBcMlwyNVwxXDBcM1wyNVwxXDBcMVwyNVwxMFwwIisKLSAgICAiXDFcdTAxNGRcMlwyNVwxXHUwMTRkXDJcMjVcMVx1MDE0ZFwyXDI1XDFcMFw0XDI1IisKLSAgICAiXDFcMFwxXHUwMTRkXDFcMjVcMVwwXDFcMjVcMVwwXDFcdTAxNGRcMlwyNSIrCi0gICAgIlw2XDBcMVx1MDE0ZVwxXDEzNVwxXDEzNlwxXDEzNVwxXDBcMVwxMzVcMVx1MDE0ZSIrCi0gICAgIlwxXDEzNVwxXDBcMVwxMzVcNFwwXDJcMTM1XDFcMFwzXDEzNVwxXDAiKwotICAgICJcMVwxMzVcMTBcMFwxXHUwMTRlXDJcMTM1XDFcdTAxNGVcMlwxMzVcMVx1MDE0ZVwyXDEzNSIrCi0gICAgIlwxXDBcNFwxMzVcMVwwXDFcdTAxNGVcMVwxMzVcMVwwXDFcMTM1XDFcMCIrCi0gICAgIlwxXHUwMTRlXDJcMTM1XDZcMFwxXHUwMTRmXDFcMTM3XDFcMTQwXDFcMTM3XDFcMCIrCi0gICAgIlwxXDEzN1wxXHUwMTRmXDFcMTM3XDFcMFwxXDEzN1w0XDBcMlwxMzdcMVwwIisKLSAgICAiXDNcMTM3XDFcMFwxXDEzN1wxMFwwXDFcdTAxNGZcMlwxMzdcMVx1MDE0ZlwyXDEzNyIrCi0gICAgIlwxXHUwMTRmXDJcMTM3XDFcMFw0XDEzN1wxXDBcMVx1MDE0ZlwxXDEzN1wxXDAiKwotICAgICJcMVwxMzdcMVwwXDFcdTAxNGZcMlwxMzdcNTJcMFwyXHUwMTUwXDczXDBcMVx1MDE1MSIrCi0gICAgIlwxMDZcMFwyXHUwMTUyXDdcMFwxXHUwMTUzXDFcMzM2XDFcMzM3XDFcMzM2XDFcMCIrCi0gICAgIlwxXDMzNlwxXHUwMTUzXDFcMzM2XDFcMFwxXDMzNlwxXHUwMTAyXDNcMFwyXDMzNiIrCi0gICAgIlwxXDBcM1wzMzZcMVwwXDFcMzM2XDEwXDBcMVx1MDE1M1wyXDMzNlwxXHUwMTUzIisKLSAgICAiXDJcMzM2XDFcdTAxNTNcMlwzMzZcMVwwXDRcMzM2XDFcMFwxXHUwMTUzXDFcMzM2IisKLSAgICAiXDFcMFwxXDMzNlwxXDBcMVx1MDE1M1wyXDMzNlw2XDBcMVx1MDE1NFwxXDE1MCIrCi0gICAgIlwxXDE1MVwxXDE1MFwxXDBcMVwxNTBcMVx1MDE1NFwxXDE1MFwxXDBcMVwxNTAiKwotICAgICJcNFwwXDJcMTUwXDFcMFwzXDE1MFwxXDI1M1wxXDE1MFwxMFwwXDFcdTAxNTQiKwotICAgICJcMlwxNTBcMVx1MDE1NFwyXDE1MFwxXHUwMTU0XDJcMTUwXDFcMFw0XDE1MFwxXDAiKwotICAgICJcMVx1MDE1NFwxXDE1MFwxXDBcMVwxNTBcMVwwXDFcdTAxNTRcMlwxNTBcNlwwIisKLSAgICAiXDFcdTAxNTVcMVwxNTNcMVwxNTRcMVwxNTNcMVwxNTVcMVwxNTNcMVx1MDE1NVwyN1wxNTMiKwotICAgICJcMVx1MDE1NVwyXDE1M1wxXHUwMTU1XDJcMTUzXDFcdTAxNTVcMTBcMTUzXDFcdTAxNTVcNFwxNTMiKwotICAgICJcMVx1MDE1NVw3XDE1M1wxXDBcMVx1MDE1NlwxXDE1NlwxXDE1N1wzXDE1NlwxXHUwMTU2IisKLSAgICAiXDFcMTU2XDFcMTU1XDI1XDE1NlwxXHUwMTU2XDJcMTU2XDFcdTAxNTZcMlwxNTZcMVx1MDE1NiIrCi0gICAgIlwxMFwxNTZcMVx1MDE1Nlw0XDE1NlwxXHUwMTU2XDdcMTU2XDFcMFwxXHUwMTU3XDFcMTYwIisKLSAgICAiXDFcMTYxXDFcMTYwXDFcMTYyXDFcMTYwXDFcdTAxNTdcMjdcMTYwXDFcdTAxNTdcMlwxNjAiKwotICAgICJcMVx1MDE1N1wyXDE2MFwxXHUwMTU3XDEwXDE2MFwxXHUwMTU3XDRcMTYwXDFcdTAxNTdcN1wxNjAiKwotICAgICJcMVwwXDFcdTAxNThcMVwxNjNcMVwxNjRcM1wxNjNcMVx1MDE1OFwxXDE2M1wxXDE2MiIrCi0gICAgIlwyNVwxNjNcMVx1MDE1OFwyXDE2M1wxXHUwMTU4XDJcMTYzXDFcdTAxNThcMTBcMTYzXDFcdTAxNTgiKwotICAgICJcNFwxNjNcMVx1MDE1OFw3XDE2M1w0XDBcMVx1MDEzMlwxXDBcMVx1MDEzMlwzXDAiKwotICAgICJcMVx1MDEzMlwxXHUwMTBkXDNcMFwyXHUwMTMyXDUzXDBcMVx1MDE1OVwxXHUwMTA5XDFcdTAxMGEiKwotICAgICJcMVx1MDEwOVwxXDBcMVx1MDEwOVwxXHUwMTU5XDFcdTAxMDlcMVwwXDFcdTAxMDlcMVx1MDEwZCIrCi0gICAgIlwxMVx1MDEwOVwxXDBcMTFcdTAxMDlcMVx1MDE1OVwyXHUwMTA5XDFcdTAxNTlcMlx1MDEwOVwxXHUwMTU5IisKLSAgICAiXDEwXHUwMTA5XDFcdTAxNTlcNFx1MDEwOVwxXHUwMTU5XDdcdTAxMDlcMVwwXDFcdTAxNWFcMVx1MDEwYiIrCi0gICAgIlwxXHUwMTM1XDFcdTAxMGJcMVx1MDE1YlwxXHUwMTBiXDFcdTAxNWFcMTBcdTAxMGJcMVx1MDE1Y1wxNlx1MDEwYiIrCi0gICAgIlwxXHUwMTVhXDJcdTAxMGJcMVx1MDE1YVwyXHUwMTBiXDFcdTAxNWFcMTBcdTAxMGJcMVx1MDE1YVw0XHUwMTBiIisKLSAgICAiXDFcdTAxNWFcN1x1MDEwYlwxXDBcMVx1MDE1ZFwxXHUwMTBjXDFcdTAxMzZcM1x1MDEwY1wxXHUwMTVkIisKLSAgICAiXDFcdTAxMGNcMVx1MDE1ZVw2XHUwMTBjXDFcdTAxNWZcMTZcdTAxMGNcMVx1MDE1ZFwyXHUwMTBjXDFcdTAxNWQiKwotICAgICJcMlx1MDEwY1wxXHUwMTVkXDEwXHUwMTBjXDFcdTAxNWRcNFx1MDEwY1wxXHUwMTVkXDdcdTAxMGNcMVwwIisKLSAgICAiXDFcdTAxNjBcMVw1MVwxXDE2NlwxXDUxXDFcMFwxXDUxXDFcdTAxNjBcMVw1MSIrCi0gICAgIlwxXDBcMVw1MVw0XDBcMlw1MVwxXDBcM1w1MVwxXDBcMVw1MSIrCi0gICAgIlwxMFwwXDFcdTAxNjBcMlw1MVwxXHUwMTYwXDJcNTFcMVx1MDE2MFwyXDUxXDFcMCIrCi0gICAgIlw0XDUxXDFcMFwxXHUwMTYwXDFcNTFcMVwwXDFcNTFcMVwwXDFcdTAxNjAiKwotICAgICJcMlw1MVw2XDBcMVx1MDE2MVwxXDU1XDFcMTcwXDFcNTVcMVwwXDFcNTUiKwotICAgICJcMVx1MDE2MVwxXDU1XDFcMFwxXDU1XDRcMFwyXDU1XDFcMFwzXDU1IisKLSAgICAiXDFcMFwxXDU1XDEwXDBcMVx1MDE2MVwyXDU1XDFcdTAxNjFcMlw1NVwxXHUwMTYxIisKLSAgICAiXDJcNTVcMVwwXDRcNTVcMVwwXDFcdTAxNjFcMVw1NVwxXDBcMVw1NSIrCi0gICAgIlwxXDBcMVx1MDE2MVwyXDU1XDZcMFwxXHUwMTYyXDFcNjJcMVwxNzJcMVw2MiIrCi0gICAgIlwxXDBcMVw2MlwxXHUwMTYyXDFcNjJcMVwwXDFcNjJcNFwwXDJcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMTBcMFwxXHUwMTYyXDJcNjJcMVx1MDE2MiIrCi0gICAgIlwyXDYyXDFcdTAxNjJcMlw2MlwxXDBcNFw2MlwxXDBcMVx1MDE2MlwxXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMFwxXHUwMTYyXDJcNjJcNlwwXDFcdTAxNjNcMVw3MiIrCi0gICAgIlwxXDE3NlwxXDcyXDFcMFwxXDcyXDFcdTAxNjNcMVw3MlwxXDBcMVw3MiIrCi0gICAgIlw0XDBcMlw3MlwxXDBcM1w3MlwxXDBcMVw3MlwxMFwwXDFcdTAxNjMiKwotICAgICJcMlw3MlwxXHUwMTYzXDJcNzJcMVx1MDE2M1wyXDcyXDFcMFw0XDcyXDFcMCIrCi0gICAgIlwxXHUwMTYzXDFcNzJcMVwwXDFcNzJcMVwwXDFcdTAxNjNcMlw3Mlw2XDAiKwotICAgICJcMVx1MDE2NFwxXDEwMFwxXDIwMFwxXDEwMFwxXDBcMVwxMDBcMVx1MDE2NFwxXDEwMCIrCi0gICAgIlwxXDBcMVwxMDBcNFwwXDJcMTAwXDFcMFwzXDEwMFwxXDBcMVwxMDAiKwotICAgICJcMTBcMFwxXHUwMTY0XDJcMTAwXDFcdTAxNjRcMlwxMDBcMVx1MDE2NFwyXDEwMFwxXDAiKwotICAgICJcNFwxMDBcMVwwXDFcdTAxNjRcMVwxMDBcMVwwXDFcMTAwXDFcMFwxXHUwMTY0IisKLSAgICAiXDJcMTAwXDZcMFwxXHUwMTY1XDFcMjAyXDFcMjAzXDFcMjAyXDFcMjA0XDFcMjAyIisKLSAgICAiXDFcdTAxNjVcMjdcMjAyXDFcdTAxNjVcMlwyMDJcMVx1MDE2NVwyXDIwMlwxXHUwMTY1XDEwXDIwMiIrCi0gICAgIlwxXHUwMTY1XDRcMjAyXDFcdTAxNjVcN1wyMDJcMVwwXDFcdTAxNjZcMVwyMDVcMVwyMDYiKwotICAgICJcM1wyMDVcMVx1MDE2NlwxXDIwNVwxXDIwNFwyNVwyMDVcMVx1MDE2NlwyXDIwNVwxXHUwMTY2IisKLSAgICAiXDJcMjA1XDFcdTAxNjZcMTBcMjA1XDFcdTAxNjZcNFwyMDVcMVx1MDE2Nlw3XDIwNVwxXDAiKwotICAgICJcMVx1MDE2N1wxXDEwNVwxXDIwN1wxXDEwNVwxXDBcMVwxMDVcMVx1MDE2N1wxXDEwNSIrCi0gICAgIlwxXDBcMVwxMDVcNFwwXDJcMTA1XDFcMFwzXDEwNVwxXDBcMVwxMDUiKwotICAgICJcMTBcMFwxXHUwMTY3XDJcMTA1XDFcdTAxNjdcMlwxMDVcMVx1MDE2N1wyXDEwNVwxXDAiKwotICAgICJcNFwxMDVcMVwwXDFcdTAxNjdcMVwxMDVcMVwwXDFcMTA1XDFcMFwxXHUwMTY3IisKLSAgICAiXDJcMTA1XDZcMFwxXHUwMTY4XDFcMjEyXDFcMjEzXDFcMjEyXDFcMFwxXDIxMiIrCi0gICAgIlwxXHUwMTY4XDFcMjEyXDFcMFwxXDIxMlw0XDBcMlwyMTJcMVwwXDNcMjEyIisKLSAgICAiXDFcMFwxXDIxMlwxMFwwXDFcdTAxNjhcMlwyMTJcMVx1MDE2OFwyXDIxMlwxXHUwMTY4IisKLSAgICAiXDJcMjEyXDFcMFw0XDIxMlwxXDBcMVx1MDE2OFwxXDIxMlwxXDBcMVwyMTIiKwotICAgICJcMVwwXDFcdTAxNjhcMlwyMTJcNlwwXDFcdTAxNjlcMVwzMDdcMVwzMTBcMVwzMDciKwotICAgICJcMVwwXDFcMzA3XDFcdTAxNjlcMVwzMDdcMVwwXDFcMzA3XDFcMFwxXDIyMCIrCi0gICAgIlwyXDBcMlwzMDdcMVwwXDNcMzA3XDFcMFwxXDMwN1wxMFwwXDFcdTAxNjkiKwotICAgICJcMlwzMDdcMVx1MDE2OVwyXDMwN1wxXHUwMTY5XDJcMzA3XDFcMFw0XDMwN1wxXDAiKwotICAgICJcMVx1MDE2OVwxXDMwN1wxXDBcMVwzMDdcMVwwXDFcdTAxNjlcMlwzMDdcNlwwIisKLSAgICAiXDFcdTAxNmFcMVwxMTRcMVwyMTdcMVwxMTRcMVwwXDFcMTE0XDFcdTAxNmFcMVwxMTQiKwotICAgICJcMVwwXDFcMTE0XDFcMFwxXDIyMFwyXDBcMlwxMTRcMVwwXDNcMTE0IisKLSAgICAiXDFcMjIxXDFcMTE0XDEwXDBcMVx1MDE2YVwyXDExNFwxXHUwMTZhXDJcMTE0XDFcdTAxNmEiKwotICAgICJcMlwxMTRcMVwwXDRcMTE0XDFcMFwxXHUwMTZhXDFcMTE0XDFcMFwxXDExNCIrCi0gICAgIlwxXDBcMVx1MDE2YVwyXDExNFw2XDBcMVx1MDE2YlwxXDIyM1wxXDIyNFwxXDIyMyIrCi0gICAgIlwxXDIyNVwxXDIyM1wxXHUwMTZiXDI3XDIyM1wxXHUwMTZiXDJcMjIzXDFcdTAxNmJcMlwyMjMiKwotICAgICJcMVx1MDE2YlwxMFwyMjNcMVx1MDE2Ylw0XDIyM1wxXHUwMTZiXDdcMjIzXDFcMFwxXHUwMTZjIisKLSAgICAiXDFcMjI2XDFcMjI3XDNcMjI2XDFcdTAxNmNcMVwyMjZcMVwyMjVcMjVcMjI2XDFcdTAxNmMiKwotICAgICJcMlwyMjZcMVx1MDE2Y1wyXDIyNlwxXHUwMTZjXDEwXDIyNlwxXHUwMTZjXDRcMjI2XDFcdTAxNmMiKwotICAgICJcN1wyMjZcMVwwXDFcdTAxNmRcMVwyMzFcMVwyMzJcMVwyMzFcMVwwXDFcMjMxIisKLSAgICAiXDFcdTAxNmRcMVwyMzFcMVwwXDFcMjMxXDRcMFwyXDIzMVwxXDBcM1wyMzEiKwotICAgICJcMVwwXDFcMjMxXDEwXDBcMVx1MDE2ZFwyXDIzMVwxXHUwMTZkXDJcMjMxXDFcdTAxNmQiKwotICAgICJcMlwyMzFcMVwwXDRcMjMxXDFcMFwxXHUwMTZkXDFcMjMxXDFcMFwxXDIzMSIrCi0gICAgIlwxXDBcMVx1MDE2ZFwyXDIzMVw2XDBcMVx1MDE2ZVw1XDBcMVx1MDE2ZVwxXDM2NiIrCi0gICAgIlwxNVwwXDJcdTAxNmVcN1wwXDJcdTAxNmVcMVwwXDJcdTAxNmVcMVwwXDJcdTAxNmUiKwotICAgICJcN1wwXDJcdTAxNmVcM1wwXDJcdTAxNmVcN1wwXDFcdTAxNmZcNVwwXDFcdTAxNmYiKwotICAgICJcMTZcMFwyXHUwMTZmXDdcMFwyXHUwMTZmXDFcMFwyXHUwMTZmXDFcMFwyXHUwMTZmIisKLSAgICAiXDdcMFwyXHUwMTZmXDNcMFwyXHUwMTZmXDEyXDBcMVx1MDE0N1wxXDBcMVx1MDE0NyIrCi0gICAgIlwzXDBcMVx1MDE0N1wxXHUwMTIzXDNcMFwyXHUwMTQ3XDUzXDBcMVx1MDE3MFwxXHUwMTFlIisKLSAgICAiXDFcdTAxMWZcMVx1MDExZVwxXDBcMVx1MDExZVwxXHUwMTcwXDFcdTAxMWVcMVwwXDFcdTAxMWUiKwotICAgICJcMVx1MDEyM1wxMVx1MDExZVwxXDBcMTFcdTAxMWVcMVx1MDE3MFwyXHUwMTFlXDFcdTAxNzBcMlx1MDExZSIrCi0gICAgIlwxXHUwMTcwXDEwXHUwMTFlXDFcdTAxNzBcNFx1MDExZVwxXHUwMTcwXDdcdTAxMWVcMVwwXDFcdTAxNzEiKwotICAgICJcMVx1MDEyMVwxXHUwMTRhXDFcdTAxMjFcMVx1MDE3MlwxXHUwMTIxXDFcdTAxNzFcMTBcdTAxMjFcMVx1MDE3MyIrCi0gICAgIlwxNlx1MDEyMVwxXHUwMTcxXDJcdTAxMjFcMVx1MDE3MVwyXHUwMTIxXDFcdTAxNzFcMTBcdTAxMjFcMVx1MDE3MSIrCi0gICAgIlw0XHUwMTIxXDFcdTAxNzFcN1x1MDEyMVwxXDBcMVx1MDE3NFwxXHUwMTIyXDFcdTAxNGJcM1x1MDEyMiIrCi0gICAgIlwxXHUwMTc0XDFcdTAxMjJcMVx1MDE3NVw2XHUwMTIyXDFcdTAxNzZcMTZcdTAxMjJcMVx1MDE3NFwyXHUwMTIyIisKLSAgICAiXDFcdTAxNzRcMlx1MDEyMlwxXHUwMTc0XDEwXHUwMTIyXDFcdTAxNzRcNFx1MDEyMlwxXHUwMTc0XDdcdTAxMjIiKwotICAgICJcNDdcMFwxXHUwMTc3XDI0XDBcMlwyNVwxXDEzMlwxXDI1XDFcMFwzXDI1IisKLSAgICAiXDFcMFwxXDI1XDRcMFwyXDI1XDFcMFwzXDI1XDFcMFwxXDI1IisKLSAgICAiXDEwXDBcMTFcMjVcMVwwXDRcMjVcMVwwXDJcMjVcMVwwXDFcMjUiKwotICAgICJcMVwwXDNcMjVcNlwwXDFcdTAxNzhcMVwxMzVcMVwxMzZcMVwxMzVcMVwwIisKLSAgICAiXDFcMTM1XDFcdTAxNzhcMVwxMzVcMVwwXDFcMTM1XDRcMFwyXDEzNVwxXDAiKwotICAgICJcM1wxMzVcMVwwXDFcMTM1XDEwXDBcMVx1MDE3OFwyXDEzNVwxXHUwMTc4XDJcMTM1IisKLSAgICAiXDFcdTAxNzhcMlwxMzVcMVwwXDRcMTM1XDFcMFwxXHUwMTc4XDFcMTM1XDFcMCIrCi0gICAgIlwxXDEzNVwxXDBcMVx1MDE3OFwyXDEzNVw2XDBcMVx1MDE3OVwxXDEzN1wxXDE0MCIrCi0gICAgIlwxXDEzN1wxXDBcMVwxMzdcMVx1MDE3OVwxXDEzN1wxXDBcMVwxMzdcNFwwIisKLSAgICAiXDJcMTM3XDFcMFwzXDEzN1wxXDBcMVwxMzdcMTBcMFwxXHUwMTc5XDJcMTM3IisKLSAgICAiXDFcdTAxNzlcMlwxMzdcMVx1MDE3OVwyXDEzN1wxXDBcNFwxMzdcMVwwXDFcdTAxNzkiKwotICAgICJcMVwxMzdcMVwwXDFcMTM3XDFcMFwxXHUwMTc5XDJcMTM3XDU0XDBcMVx1MDE3YSIrCi0gICAgIlw2NVwwXDJcdTAxN2JcMzBcMFwxXHUwMTdjXDFcMzM2XDFcMzM3XDFcMzM2XDFcMCIrCi0gICAgIlwxXDMzNlwxXHUwMTdjXDFcMzM2XDFcMFwxXDMzNlwxXHUwMTAyXDNcMFwyXDMzNiIrCi0gICAgIlwxXDBcM1wzMzZcMVwwXDFcMzM2XDEwXDBcMVx1MDE3Y1wyXDMzNlwxXHUwMTdjIisKLSAgICAiXDJcMzM2XDFcdTAxN2NcMlwzMzZcMVwwXDRcMzM2XDFcMFwxXHUwMTdjXDFcMzM2IisKLSAgICAiXDFcMFwxXDMzNlwxXDBcMVx1MDE3Y1wyXDMzNlw2XDBcMVx1MDE3ZFwxXDE1MCIrCi0gICAgIlwxXDE1MVwxXDE1MFwxXDBcMVwxNTBcMVx1MDE3ZFwxXDE1MFwxXDBcMVwxNTAiKwotICAgICJcNFwwXDJcMTUwXDFcMFwzXDE1MFwxXDI1M1wxXDE1MFwxMFwwXDFcdTAxN2QiKwotICAgICJcMlwxNTBcMVx1MDE3ZFwyXDE1MFwxXHUwMTdkXDJcMTUwXDFcMFw0XDE1MFwxXDAiKwotICAgICJcMVx1MDE3ZFwxXDE1MFwxXDBcMVwxNTBcMVwwXDFcdTAxN2RcMlwxNTBcNlwwIisKLSAgICAiXDFcdTAxN2VcMVwxNTNcMVwxNTRcMVwxNTNcMVwxNTVcMVwxNTNcMVx1MDE3ZVwyN1wxNTMiKwotICAgICJcMVx1MDE3ZVwyXDE1M1wxXHUwMTdlXDJcMTUzXDFcdTAxN2VcMTBcMTUzXDFcdTAxN2VcNFwxNTMiKwotICAgICJcMVx1MDE3ZVw3XDE1M1wxXDBcMVx1MDE3ZlwxXDE1NlwxXDE1N1wzXDE1NlwxXHUwMTdmIisKLSAgICAiXDFcMTU2XDFcMTU1XDI1XDE1NlwxXHUwMTdmXDJcMTU2XDFcdTAxN2ZcMlwxNTZcMVx1MDE3ZiIrCi0gICAgIlwxMFwxNTZcMVx1MDE3Zlw0XDE1NlwxXHUwMTdmXDdcMTU2XDFcMFwxXHUwMTgwXDFcMTYwIisKLSAgICAiXDFcMTYxXDFcMTYwXDFcMTYyXDFcMTYwXDFcdTAxODBcMjdcMTYwXDFcdTAxODBcMlwxNjAiKwotICAgICJcMVx1MDE4MFwyXDE2MFwxXHUwMTgwXDEwXDE2MFwxXHUwMTgwXDRcMTYwXDFcdTAxODBcN1wxNjAiKwotICAgICJcMVwwXDFcdTAxODFcMVwxNjNcMVwxNjRcM1wxNjNcMVx1MDE4MVwxXDE2M1wxXDE2MiIrCi0gICAgIlwyNVwxNjNcMVx1MDE4MVwyXDE2M1wxXHUwMTgxXDJcMTYzXDFcdTAxODFcMTBcMTYzXDFcdTAxODEiKwotICAgICJcNFwxNjNcMVx1MDE4MVw3XDE2M1wxXDBcMVx1MDE4MlwxXHUwMTA5XDFcdTAxMGFcMVx1MDEwOSIrCi0gICAgIlwxXDBcMVx1MDEwOVwxXHUwMTgyXDFcdTAxMDlcMVwwXDFcdTAxMDlcMVx1MDEwZFwxMVx1MDEwOSIrCi0gICAgIlwxXDBcMTFcdTAxMDlcMVx1MDE4MlwyXHUwMTA5XDFcdTAxODJcMlx1MDEwOVwxXHUwMTgyXDEwXHUwMTA5IisKLSAgICAiXDFcdTAxODJcNFx1MDEwOVwxXHUwMTgyXDdcdTAxMDlcMVwwXDFcdTAxODNcMVx1MDEwYlwxXHUwMTM1IisKLSAgICAiXDFcdTAxMGJcMVx1MDEzMlwxXHUwMTBiXDFcdTAxODNcMjdcdTAxMGJcMVx1MDE4M1wyXHUwMTBiXDFcdTAxODMiKwotICAgICJcMlx1MDEwYlwxXHUwMTgzXDEwXHUwMTBiXDFcdTAxODNcNFx1MDEwYlwxXHUwMTgzXDdcdTAxMGJcMVwwIisKLSAgICAiXDJcdTAxMGJcMVx1MDEzNVwyXHUwMTMyXDFcdTAxNWJcM1x1MDEwYlwxXHUwMTViXDFcdTAxODRcM1x1MDEwYiIrCi0gICAgIlwyXHUwMTMyXDUyXHUwMTBiXDFcMFwyXHUwMTBiXDFcdTAxMzVcMVwwXDFcdTAxMzJcMTJcdTAxMGIiKwotICAgICJcMVwwXDUyXHUwMTBiXDFcMFwxXHUwMTg1XDFcdTAxMGNcMVx1MDEzNlwzXHUwMTBjXDFcdTAxODUiKwotICAgICJcMVx1MDEwY1wxXHUwMTMyXDI1XHUwMTBjXDFcdTAxODVcMlx1MDEwY1wxXHUwMTg1XDJcdTAxMGNcMVx1MDE4NSIrCi0gICAgIlwxMFx1MDEwY1wxXHUwMTg1XDRcdTAxMGNcMVx1MDE4NVw3XHUwMTBjXDFcMFwyXHUwMTBjXDFcdTAxMzYiKwotICAgICJcMVx1MDEzMlwxXHUwMTBjXDFcdTAxNWVcMlx1MDEwY1wxXHUwMTMyXDFcdTAxNWVcMVx1MDE4NlwzXHUwMTBjIisKLSAgICAiXDJcdTAxMzJcNTJcdTAxMGNcMVwwXDJcdTAxMGNcMVx1MDEzNlwxXDBcNFx1MDEwY1wxXHUwMTMyIisKLSAgICAiXDZcdTAxMGNcMVwwXDUyXHUwMTBjXDFcMFwyXDUxXDFcMTY2XDFcNTFcMVwwIisKLSAgICAiXDNcNTFcMVwwXDFcNTFcNFwwXDJcNTFcMVwwXDNcNTFcMVwwIisKLSAgICAiXDFcNTFcMTBcMFwxMVw1MVwxXDBcNFw1MVwxXDBcMlw1MVwxXDAiKwotICAgICJcMVw1MVwxXDBcM1w1MVw2XDBcMlw1NVwxXDE3MFwxXDU1XDFcMCIrCi0gICAgIlwzXDU1XDFcMFwxXDU1XDRcMFwyXDU1XDFcMFwzXDU1XDFcMCIrCi0gICAgIlwxXDU1XDEwXDBcMTFcNTVcMVwwXDRcNTVcMVwwXDJcNTVcMVwwIisKLSAgICAiXDFcNTVcMVwwXDNcNTVcNlwwXDJcNjJcMVwxNzJcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2Mlw0XDBcMlw2MlwxXDBcM1w2MlwxXDAiKwotICAgICJcMVw2MlwxMFwwXDExXDYyXDFcMFw0XDYyXDFcMFwyXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFwzXDYyXDZcMFwyXDcyXDFcMTc2XDFcNzJcMVwwIisKLSAgICAiXDNcNzJcMVwwXDFcNzJcNFwwXDJcNzJcMVwwXDNcNzJcMVwwIisKLSAgICAiXDFcNzJcMTBcMFwxMVw3MlwxXDBcNFw3MlwxXDBcMlw3MlwxXDAiKwotICAgICJcMVw3MlwxXDBcM1w3Mlw2XDBcMlwxMDBcMVwyMDBcMVwxMDBcMVwwIisKLSAgICAiXDNcMTAwXDFcMFwxXDEwMFw0XDBcMlwxMDBcMVwwXDNcMTAwXDFcMCIrCi0gICAgIlwxXDEwMFwxMFwwXDExXDEwMFwxXDBcNFwxMDBcMVwwXDJcMTAwXDFcMCIrCi0gICAgIlwxXDEwMFwxXDBcM1wxMDBcNlwwXDFcdTAxODdcMVwyMDJcMVwyMDNcMVwyMDIiKwotICAgICJcMVwyMDRcMVwyMDJcMVx1MDE4N1wyN1wyMDJcMVx1MDE4N1wyXDIwMlwxXHUwMTg3XDJcMjAyIisKLSAgICAiXDFcdTAxODdcMTBcMjAyXDFcdTAxODdcNFwyMDJcMVx1MDE4N1w3XDIwMlwxXDBcMVx1MDE4OCIrCi0gICAgIlwxXDIwNVwxXDIwNlwzXDIwNVwxXHUwMTg4XDFcMjA1XDFcMjA0XDI1XDIwNVwxXHUwMTg4IisKLSAgICAiXDJcMjA1XDFcdTAxODhcMlwyMDVcMVx1MDE4OFwxMFwyMDVcMVx1MDE4OFw0XDIwNVwxXHUwMTg4IisKLSAgICAiXDdcMjA1XDFcMFwyXDEwNVwxXDIwN1wxXDEwNVwxXDBcM1wxMDVcMVwwIisKLSAgICAiXDFcMTA1XDRcMFwyXDEwNVwxXDBcM1wxMDVcMVwwXDFcMTA1XDEwXDAiKwotICAgICJcMTFcMTA1XDFcMFw0XDEwNVwxXDBcMlwxMDVcMVwwXDFcMTA1XDFcMCIrCi0gICAgIlwzXDEwNVw2XDBcMVx1MDE4OVwxXDIxMlwxXDIxM1wxXDIxMlwxXDBcMVwyMTIiKwotICAgICJcMVx1MDE4OVwxXDIxMlwxXDBcMVwyMTJcNFwwXDJcMjEyXDFcMFwzXDIxMiIrCi0gICAgIlwxXDBcMVwyMTJcMTBcMFwxXHUwMTg5XDJcMjEyXDFcdTAxODlcMlwyMTJcMVx1MDE4OSIrCi0gICAgIlwyXDIxMlwxXDBcNFwyMTJcMVwwXDFcdTAxODlcMVwyMTJcMVwwXDFcMjEyIisKLSAgICAiXDFcMFwxXHUwMTg5XDJcMjEyXDZcMFwxXHUwMThhXDFcMzA3XDFcMzEwXDFcMzA3IisKLSAgICAiXDFcMFwxXDMwN1wxXHUwMThhXDFcMzA3XDFcMFwxXDMwN1wxXDBcMVwyMjAiKwotICAgICJcMlwwXDJcMzA3XDFcMFwzXDMwN1wxXDBcMVwzMDdcMTBcMFwxXHUwMThhIisKLSAgICAiXDJcMzA3XDFcdTAxOGFcMlwzMDdcMVx1MDE4YVwyXDMwN1wxXDBcNFwzMDdcMVwwIisKLSAgICAiXDFcdTAxOGFcMVwzMDdcMVwwXDFcMzA3XDFcMFwxXHUwMThhXDJcMzA3XDZcMCIrCi0gICAgIlwyXDExNFwxXDIxN1wxXDExNFwxXDBcM1wxMTRcMVwwXDFcMTE0XDFcMCIrCi0gICAgIlwxXDIyMFwyXDBcMlwxMTRcMVwwXDNcMTE0XDFcMjIxXDFcMTE0XDEwXDAiKwotICAgICJcMTFcMTE0XDFcMFw0XDExNFwxXDBcMlwxMTRcMVwwXDFcMTE0XDFcMCIrCi0gICAgIlwzXDExNFw2XDBcMVx1MDE4YlwxXDIyM1wxXDIyNFwxXDIyM1wxXDIyNVwxXDIyMyIrCi0gICAgIlwxXHUwMThiXDI3XDIyM1wxXHUwMThiXDJcMjIzXDFcdTAxOGJcMlwyMjNcMVx1MDE4YlwxMFwyMjMiKwotICAgICJcMVx1MDE4Ylw0XDIyM1wxXHUwMThiXDdcMjIzXDFcMFwxXHUwMThjXDFcMjI2XDFcMjI3IisKLSAgICAiXDNcMjI2XDFcdTAxOGNcMVwyMjZcMVwyMjVcMjVcMjI2XDFcdTAxOGNcMlwyMjZcMVx1MDE4YyIrCi0gICAgIlwyXDIyNlwxXHUwMThjXDEwXDIyNlwxXHUwMThjXDRcMjI2XDFcdTAxOGNcN1wyMjZcMVwwIisKLSAgICAiXDFcdTAxOGRcMVwyMzFcMVwyMzJcMVwyMzFcMVwwXDFcMjMxXDFcdTAxOGRcMVwyMzEiKwotICAgICJcMVwwXDFcMjMxXDRcMFwyXDIzMVwxXDBcM1wyMzFcMVwwXDFcMjMxIisKLSAgICAiXDEwXDBcMVx1MDE4ZFwyXDIzMVwxXHUwMThkXDJcMjMxXDFcdTAxOGRcMlwyMzFcMVwwIisKLSAgICAiXDRcMjMxXDFcMFwxXHUwMThkXDFcMjMxXDFcMFwxXDIzMVwxXDBcMVx1MDE4ZCIrCi0gICAgIlwyXDIzMVw2XDBcMVx1MDE4ZVw1XDBcMVx1MDE4ZVwxXDM2NlwxNVwwXDJcdTAxOGUiKwotICAgICJcN1wwXDJcdTAxOGVcMVwwXDJcdTAxOGVcMVwwXDJcdTAxOGVcN1wwXDJcdTAxOGUiKwotICAgICJcM1wwXDJcdTAxOGVcN1wwXDFcdTAxOGZcNVwwXDFcdTAxOGZcMTZcMFwyXHUwMThmIisKLSAgICAiXDdcMFwyXHUwMThmXDFcMFwyXHUwMThmXDFcMFwyXHUwMThmXDdcMFwyXHUwMThmIisKLSAgICAiXDNcMFwyXHUwMThmXDdcMFwxXHUwMTkwXDFcdTAxMWVcMVx1MDExZlwxXHUwMTFlXDFcMCIrCi0gICAgIlwxXHUwMTFlXDFcdTAxOTBcMVx1MDExZVwxXDBcMVx1MDExZVwxXHUwMTIzXDExXHUwMTFlXDFcMCIrCi0gICAgIlwxMVx1MDExZVwxXHUwMTkwXDJcdTAxMWVcMVx1MDE5MFwyXHUwMTFlXDFcdTAxOTBcMTBcdTAxMWVcMVx1MDE5MCIrCi0gICAgIlw0XHUwMTFlXDFcdTAxOTBcN1x1MDExZVwxXDBcMVx1MDE5MVwxXHUwMTIxXDFcdTAxNGFcMVx1MDEyMSIrCi0gICAgIlwxXHUwMTQ3XDFcdTAxMjFcMVx1MDE5MVwyN1x1MDEyMVwxXHUwMTkxXDJcdTAxMjFcMVx1MDE5MVwyXHUwMTIxIisKLSAgICAiXDFcdTAxOTFcMTBcdTAxMjFcMVx1MDE5MVw0XHUwMTIxXDFcdTAxOTFcN1x1MDEyMVwxXDBcMlx1MDEyMSIrCi0gICAgIlwxXHUwMTRhXDJcdTAxNDdcMVx1MDE3MlwzXHUwMTIxXDFcdTAxNzJcMVx1MDE5MlwzXHUwMTIxXDJcdTAxNDciKwotICAgICJcNTJcdTAxMjFcMVwwXDJcdTAxMjFcMVx1MDE0YVwxXDBcMVx1MDE0N1wxMlx1MDEyMVwxXDAiKwotICAgICJcNTJcdTAxMjFcMVwwXDFcdTAxOTNcMVx1MDEyMlwxXHUwMTRiXDNcdTAxMjJcMVx1MDE5M1wxXHUwMTIyIisKLSAgICAiXDFcdTAxNDdcMjVcdTAxMjJcMVx1MDE5M1wyXHUwMTIyXDFcdTAxOTNcMlx1MDEyMlwxXHUwMTkzXDEwXHUwMTIyIisKLSAgICAiXDFcdTAxOTNcNFx1MDEyMlwxXHUwMTkzXDdcdTAxMjJcMVwwXDJcdTAxMjJcMVx1MDE0YlwxXHUwMTQ3IisKLSAgICAiXDFcdTAxMjJcMVx1MDE3NVwyXHUwMTIyXDFcdTAxNDdcMVx1MDE3NVwxXHUwMTk0XDNcdTAxMjJcMlx1MDE0NyIrCi0gICAgIlw1Mlx1MDEyMlwxXDBcMlx1MDEyMlwxXHUwMTRiXDFcMFw0XHUwMTIyXDFcdTAxNDdcNlx1MDEyMiIrCi0gICAgIlwxXDBcNTJcdTAxMjJcNDJcMFwyXHUwMTk1XDMwXDBcMlwxMzVcMVwxMzZcMVwxMzUiKwotICAgICJcMVwwXDNcMTM1XDFcMFwxXDEzNVw0XDBcMlwxMzVcMVwwXDNcMTM1IisKLSAgICAiXDFcMFwxXDEzNVwxMFwwXDExXDEzNVwxXDBcNFwxMzVcMVwwXDJcMTM1IisKLSAgICAiXDFcMFwxXDEzNVwxXDBcM1wxMzVcNlwwXDJcMTM3XDFcMTQwXDFcMTM3IisKLSAgICAiXDFcMFwzXDEzN1wxXDBcMVwxMzdcNFwwXDJcMTM3XDFcMFwzXDEzNyIrCi0gICAgIlwxXDBcMVwxMzdcMTBcMFwxMVwxMzdcMVwwXDRcMTM3XDFcMFwyXDEzNyIrCi0gICAgIlwxXDBcMVwxMzdcMVwwXDNcMTM3XDQ0XDBcMlx1MDE5NlwzM1wwXDFcdTAxOTciKwotICAgICJcMVwzMzZcMVwzMzdcMVwzMzZcMVwwXDFcMzM2XDFcdTAxOTdcMVwzMzZcMVwwIisKLSAgICAiXDFcMzM2XDFcdTAxMDJcM1wwXDJcMzM2XDFcMFwzXDMzNlwxXDBcMVwzMzYiKwotICAgICJcMTBcMFwxXHUwMTk3XDJcMzM2XDFcdTAxOTdcMlwzMzZcMVx1MDE5N1wyXDMzNlwxXDAiKwotICAgICJcNFwzMzZcMVwwXDFcdTAxOTdcMVwzMzZcMVwwXDFcMzM2XDFcMFwxXHUwMTk3IisKLSAgICAiXDJcMzM2XDZcMFwyXDE1MFwxXDE1MVwxXDE1MFwxXDBcM1wxNTBcMVwwIisKLSAgICAiXDFcMTUwXDRcMFwyXDE1MFwxXDBcM1wxNTBcMVwyNTNcMVwxNTBcMTBcMCIrCi0gICAgIlwxMVwxNTBcMVwwXDRcMTUwXDFcMFwyXDE1MFwxXDBcMVwxNTBcMVwwIisKLSAgICAiXDNcMTUwXDZcMFwyXDE1M1wxXDE1NFwxXDE1M1wxXDE1NVw2NVwxNTNcMVwwIisKLSAgICAiXDJcMTU2XDFcMTU3XDVcMTU2XDFcMTU1XDYxXDE1NlwxXDBcMlwxNjBcMVwxNjEiKwotICAgICJcMVwxNjBcMVwxNjJcNjVcMTYwXDFcMFwyXDE2M1wxXDE2NFw1XDE2M1wxXDE2MiIrCi0gICAgIlw2MVwxNjNcMVwwXDFcdTAxOThcMVx1MDEwOVwxXHUwMTBhXDFcdTAxMDlcMVwwXDFcdTAxMDkiKwotICAgICJcMVx1MDE5OFwxXHUwMTA5XDFcMFwxXHUwMTA5XDFcdTAxMGRcMTFcdTAxMDlcMVwwXDExXHUwMTA5IisKLSAgICAiXDFcdTAxOThcMlx1MDEwOVwxXHUwMTk4XDJcdTAxMDlcMVx1MDE5OFwxMFx1MDEwOVwxXHUwMTk4XDRcdTAxMDkiKwotICAgICJcMVx1MDE5OFw3XHUwMTA5XDFcMFwxXHUwMTk5XDFcdTAxMGJcMVx1MDEzNVwxXHUwMTBiXDFcdTAxMzIiKwotICAgICJcMVx1MDEwYlwxXHUwMTk5XDI3XHUwMTBiXDFcdTAxOTlcMlx1MDEwYlwxXHUwMTk5XDJcdTAxMGJcMVx1MDE5OSIrCi0gICAgIlwxMFx1MDEwYlwxXHUwMTk5XDRcdTAxMGJcMVx1MDE5OVw3XHUwMTBiXDFcMFwxXHUwMTlhXDFcdTAxMGMiKwotICAgICJcMVx1MDEzNlwzXHUwMTBjXDFcdTAxOWFcMVx1MDEwY1wxXHUwMTMyXDI1XHUwMTBjXDFcdTAxOWFcMlx1MDEwYyIrCi0gICAgIlwxXHUwMTlhXDJcdTAxMGNcMVx1MDE5YVwxMFx1MDEwY1wxXHUwMTlhXDRcdTAxMGNcMVx1MDE5YVw3XHUwMTBjIisKLSAgICAiXDFcMFwyXDIwMlwxXDIwM1wxXDIwMlwxXDIwNFw2NVwyMDJcMVwwXDJcMjA1IisKLSAgICAiXDFcMjA2XDVcMjA1XDFcMjA0XDYxXDIwNVwxXDBcMlwyMTJcMVwyMTNcMVwyMTIiKwotICAgICJcMVwwXDNcMjEyXDFcMFwxXDIxMlw0XDBcMlwyMTJcMVwwXDNcMjEyIisKLSAgICAiXDFcMFwxXDIxMlwxMFwwXDExXDIxMlwxXDBcNFwyMTJcMVwwXDJcMjEyIisKLSAgICAiXDFcMFwxXDIxMlwxXDBcM1wyMTJcNlwwXDFcdTAxOWJcMVwzMDdcMVwzMTAiKwotICAgICJcMVwzMDdcMVwwXDFcMzA3XDFcdTAxOWJcMVwzMDdcMVwwXDFcMzA3XDFcMCIrCi0gICAgIlwxXDIyMFwyXDBcMlwzMDdcMVwwXDNcMzA3XDFcMFwxXDMwN1wxMFwwIisKLSAgICAiXDFcdTAxOWJcMlwzMDdcMVx1MDE5YlwyXDMwN1wxXHUwMTliXDJcMzA3XDFcMFw0XDMwNyIrCi0gICAgIlwxXDBcMVx1MDE5YlwxXDMwN1wxXDBcMVwzMDdcMVwwXDFcdTAxOWJcMlwzMDciKwotICAgICJcNlwwXDJcMjIzXDFcMjI0XDFcMjIzXDFcMjI1XDY1XDIyM1wxXDBcMlwyMjYiKwotICAgICJcMVwyMjdcNVwyMjZcMVwyMjVcNjFcMjI2XDFcMFwyXDIzMVwxXDIzMlwxXDIzMSIrCi0gICAgIlwxXDBcM1wyMzFcMVwwXDFcMjMxXDRcMFwyXDIzMVwxXDBcM1wyMzEiKwotICAgICJcMVwwXDFcMjMxXDEwXDBcMTFcMjMxXDFcMFw0XDIzMVwxXDBcMlwyMzEiKwotICAgICJcMVwwXDFcMjMxXDFcMFwzXDIzMVwxNVwwXDFcMzY2XDYzXDBcMVx1MDE5YyIrCi0gICAgIlw1XDBcMVx1MDE5Y1wxNlwwXDJcdTAxOWNcN1wwXDJcdTAxOWNcMVwwXDJcdTAxOWMiKwotICAgICJcMVwwXDJcdTAxOWNcN1wwXDJcdTAxOWNcM1wwXDJcdTAxOWNcN1wwXDFcdTAxOWQiKwotICAgICJcMVx1MDExZVwxXHUwMTFmXDFcdTAxMWVcMVwwXDFcdTAxMWVcMVx1MDE5ZFwxXHUwMTFlXDFcMCIrCi0gICAgIlwxXHUwMTFlXDFcdTAxMjNcMTFcdTAxMWVcMVwwXDExXHUwMTFlXDFcdTAxOWRcMlx1MDExZVwxXHUwMTlkIisKLSAgICAiXDJcdTAxMWVcMVx1MDE5ZFwxMFx1MDExZVwxXHUwMTlkXDRcdTAxMWVcMVx1MDE5ZFw3XHUwMTFlXDFcMCIrCi0gICAgIlwxXHUwMTllXDFcdTAxMjFcMVx1MDE0YVwxXHUwMTIxXDFcdTAxNDdcMVx1MDEyMVwxXHUwMTllXDI3XHUwMTIxIisKLSAgICAiXDFcdTAxOWVcMlx1MDEyMVwxXHUwMTllXDJcdTAxMjFcMVx1MDE5ZVwxMFx1MDEyMVwxXHUwMTllXDRcdTAxMjEiKwotICAgICJcMVx1MDE5ZVw3XHUwMTIxXDFcMFwxXHUwMTlmXDFcdTAxMjJcMVx1MDE0YlwzXHUwMTIyXDFcdTAxOWYiKwotICAgICJcMVx1MDEyMlwxXHUwMTQ3XDI1XHUwMTIyXDFcdTAxOWZcMlx1MDEyMlwxXHUwMTlmXDJcdTAxMjJcMVx1MDE5ZiIrCi0gICAgIlwxMFx1MDEyMlwxXHUwMTlmXDRcdTAxMjJcMVx1MDE5Zlw3XHUwMTIyXDY1XDBcMVx1MDFhMFw1MlwwIisKLSAgICAiXDJcdTAxYTFcMjVcMFwxXHUwMWEyXDFcMzM2XDFcMzM3XDFcMzM2XDFcMFwxXDMzNiIrCi0gICAgIlwxXHUwMWEyXDFcMzM2XDFcMFwxXDMzNlwxXHUwMTAyXDNcMFwyXDMzNlwxXDAiKwotICAgICJcM1wzMzZcMVwwXDFcMzM2XDEwXDBcMVx1MDFhMlwyXDMzNlwxXHUwMWEyXDJcMzM2IisKLSAgICAiXDFcdTAxYTJcMlwzMzZcMVwwXDRcMzM2XDFcMFwxXHUwMWEyXDFcMzM2XDFcMCIrCi0gICAgIlwxXDMzNlwxXDBcMVx1MDFhMlwyXDMzNlw2XDBcMVx1MDFhM1wxXHUwMTA5XDFcdTAxMGEiKwotICAgICJcMVx1MDEwOVwxXDBcMVx1MDEwOVwxXHUwMWEzXDFcdTAxMDlcMVwwXDFcdTAxMDlcMVx1MDEwZCIrCi0gICAgIlwxMVx1MDEwOVwxXDBcMTFcdTAxMDlcMVx1MDFhM1wyXHUwMTA5XDFcdTAxYTNcMlx1MDEwOVwxXHUwMWEzIisKLSAgICAiXDEwXHUwMTA5XDFcdTAxYTNcNFx1MDEwOVwxXHUwMWEzXDdcdTAxMDlcMVwwXDFcdTAxYTRcMVx1MDEwYiIrCi0gICAgIlwxXHUwMTM1XDFcdTAxMGJcMVx1MDEzMlwxXHUwMTBiXDFcdTAxYTRcMjdcdTAxMGJcMVx1MDFhNFwyXHUwMTBiIisKLSAgICAiXDFcdTAxYTRcMlx1MDEwYlwxXHUwMWE0XDEwXHUwMTBiXDFcdTAxYTRcNFx1MDEwYlwxXHUwMWE0XDdcdTAxMGIiKwotICAgICJcMVwwXDFcdTAxYTVcMVx1MDEwY1wxXHUwMTM2XDNcdTAxMGNcMVx1MDFhNVwxXHUwMTBjXDFcdTAxMzIiKwotICAgICJcMjVcdTAxMGNcMVx1MDFhNVwyXHUwMTBjXDFcdTAxYTVcMlx1MDEwY1wxXHUwMWE1XDEwXHUwMTBjXDFcdTAxYTUiKwotICAgICJcNFx1MDEwY1wxXHUwMWE1XDdcdTAxMGNcMVwwXDJcMzA3XDFcMzEwXDFcMzA3XDFcMCIrCi0gICAgIlwzXDMwN1wxXDBcMVwzMDdcMVwwXDFcMjIwXDJcMFwyXDMwN1wxXDAiKwotICAgICJcM1wzMDdcMVwwXDFcMzA3XDEwXDBcMTFcMzA3XDFcMFw0XDMwN1wxXDAiKwotICAgICJcMlwzMDdcMVwwXDFcMzA3XDFcMFwzXDMwN1w2XDBcMVx1MDFhNlw1XDAiKwotICAgICJcMVx1MDFhNlwxNlwwXDJcdTAxYTZcN1wwXDJcdTAxYTZcMVwwXDJcdTAxYTZcMVwwIisKLSAgICAiXDJcdTAxYTZcN1wwXDJcdTAxYTZcM1wwXDJcdTAxYTZcN1wwXDFcdTAxYTdcMVx1MDExZSIrCi0gICAgIlwxXHUwMTFmXDFcdTAxMWVcMVwwXDFcdTAxMWVcMVx1MDFhN1wxXHUwMTFlXDFcMFwxXHUwMTFlIisKLSAgICAiXDFcdTAxMjNcMTFcdTAxMWVcMVwwXDExXHUwMTFlXDFcdTAxYTdcMlx1MDExZVwxXHUwMWE3XDJcdTAxMWUiKwotICAgICJcMVx1MDFhN1wxMFx1MDExZVwxXHUwMWE3XDRcdTAxMWVcMVx1MDFhN1w3XHUwMTFlXDFcMFwxXHUwMWE4IisKLSAgICAiXDFcdTAxMjFcMVx1MDE0YVwxXHUwMTIxXDFcdTAxNDdcMVx1MDEyMVwxXHUwMWE4XDI3XHUwMTIxXDFcdTAxYTgiKwotICAgICJcMlx1MDEyMVwxXHUwMWE4XDJcdTAxMjFcMVx1MDFhOFwxMFx1MDEyMVwxXHUwMWE4XDRcdTAxMjFcMVx1MDFhOCIrCi0gICAgIlw3XHUwMTIxXDFcMFwxXHUwMWE5XDFcdTAxMjJcMVx1MDE0YlwzXHUwMTIyXDFcdTAxYTlcMVx1MDEyMiIrCi0gICAgIlwxXHUwMTQ3XDI1XHUwMTIyXDFcdTAxYTlcMlx1MDEyMlwxXHUwMWE5XDJcdTAxMjJcMVx1MDFhOVwxMFx1MDEyMiIrCi0gICAgIlwxXHUwMWE5XDRcdTAxMjJcMVx1MDFhOVw3XHUwMTIyXDQ3XDBcMVx1MDFhYVwyNFwwXDJcMzM2IisKLSAgICAiXDFcMzM3XDFcMzM2XDFcMFwzXDMzNlwxXDBcMVwzMzZcMVx1MDEwMlwzXDAiKwotICAgICJcMlwzMzZcMVwwXDNcMzM2XDFcMFwxXDMzNlwxMFwwXDExXDMzNlwxXDAiKwotICAgICJcNFwzMzZcMVwwXDJcMzM2XDFcMFwxXDMzNlwxXDBcM1wzMzZcNlwwIisKLSAgICAiXDFcdTAxYWJcMVx1MDEwOVwxXHUwMTBhXDFcdTAxMDlcMVwwXDFcdTAxMDlcMVx1MDFhYlwxXHUwMTA5IisKLSAgICAiXDFcMFwxXHUwMTA5XDFcdTAxMGRcMTFcdTAxMDlcMVwwXDExXHUwMTA5XDFcdTAxYWJcMlx1MDEwOSIrCi0gICAgIlwxXHUwMWFiXDJcdTAxMDlcMVx1MDFhYlwxMFx1MDEwOVwxXHUwMWFiXDRcdTAxMDlcMVx1MDFhYlw3XHUwMTA5IisKLSAgICAiXDFcMFwxXHUwMWFjXDFcdTAxMGJcMVx1MDEzNVwxXHUwMTBiXDFcdTAxMzJcMVx1MDEwYlwxXHUwMWFjIisKLSAgICAiXDI3XHUwMTBiXDFcdTAxYWNcMlx1MDEwYlwxXHUwMWFjXDJcdTAxMGJcMVx1MDFhY1wxMFx1MDEwYlwxXHUwMWFjIisKLSAgICAiXDRcdTAxMGJcMVx1MDFhY1w3XHUwMTBiXDFcMFwxXHUwMWFkXDFcdTAxMGNcMVx1MDEzNlwzXHUwMTBjIisKLSAgICAiXDFcdTAxYWRcMVx1MDEwY1wxXHUwMTMyXDI1XHUwMTBjXDFcdTAxYWRcMlx1MDEwY1wxXHUwMWFkXDJcdTAxMGMiKwotICAgICJcMVx1MDFhZFwxMFx1MDEwY1wxXHUwMWFkXDRcdTAxMGNcMVx1MDFhZFw3XHUwMTBjXDFcMFwxXHUwMWFlIisKLSAgICAiXDFcdTAxMWVcMVx1MDExZlwxXHUwMTFlXDFcMFwxXHUwMTFlXDFcdTAxYWVcMVx1MDExZVwxXDAiKwotICAgICJcMVx1MDExZVwxXHUwMTIzXDExXHUwMTFlXDFcMFwxMVx1MDExZVwxXHUwMWFlXDJcdTAxMWVcMVx1MDFhZSIrCi0gICAgIlwyXHUwMTFlXDFcdTAxYWVcMTBcdTAxMWVcMVx1MDFhZVw0XHUwMTFlXDFcdTAxYWVcN1x1MDExZVwxXDAiKwotICAgICJcMVx1MDFhZlwxXHUwMTIxXDFcdTAxNGFcMVx1MDEyMVwxXHUwMTQ3XDFcdTAxMjFcMVx1MDFhZlwyN1x1MDEyMSIrCi0gICAgIlwxXHUwMWFmXDJcdTAxMjFcMVx1MDFhZlwyXHUwMTIxXDFcdTAxYWZcMTBcdTAxMjFcMVx1MDFhZlw0XHUwMTIxIisKLSAgICAiXDFcdTAxYWZcN1x1MDEyMVwxXDBcMVx1MDFiMFwxXHUwMTIyXDFcdTAxNGJcM1x1MDEyMlwxXHUwMWIwIisKLSAgICAiXDFcdTAxMjJcMVx1MDE0N1wyNVx1MDEyMlwxXHUwMWIwXDJcdTAxMjJcMVx1MDFiMFwyXHUwMTIyXDFcdTAxYjAiKwotICAgICJcMTBcdTAxMjJcMVx1MDFiMFw0XHUwMTIyXDFcdTAxYjBcN1x1MDEyMlwxXDBcMlx1MDEwOVwxXHUwMTBhIisKLSAgICAiXDFcdTAxMDlcMVwwXDNcdTAxMDlcMVwwXDFcdTAxMDlcMVx1MDEwZFwxMVx1MDEwOVwxXDAiKwotICAgICJcNDVcdTAxMDlcMVwwXDFcdTAxYjFcMVx1MDEwYlwxXHUwMTM1XDFcdTAxMGJcMVx1MDEzMlwxXHUwMTBiIisKLSAgICAiXDFcdTAxYjFcMjdcdTAxMGJcMVx1MDFiMVwyXHUwMTBiXDFcdTAxYjFcMlx1MDEwYlwxXHUwMWIxXDEwXHUwMTBiIisKLSAgICAiXDFcdTAxYjFcNFx1MDEwYlwxXHUwMWIxXDdcdTAxMGJcMVwwXDFcdTAxYjJcMVx1MDEwY1wxXHUwMTM2IisKLSAgICAiXDNcdTAxMGNcMVx1MDFiMlwxXHUwMTBjXDFcdTAxMzJcMjVcdTAxMGNcMVx1MDFiMlwyXHUwMTBjXDFcdTAxYjIiKwotICAgICJcMlx1MDEwY1wxXHUwMWIyXDEwXHUwMTBjXDFcdTAxYjJcNFx1MDEwY1wxXHUwMWIyXDdcdTAxMGNcMVwwIisKLSAgICAiXDJcdTAxMWVcMVx1MDExZlwxXHUwMTFlXDFcMFwzXHUwMTFlXDFcMFwxXHUwMTFlXDFcdTAxMjMiKwotICAgICJcMTFcdTAxMWVcMVwwXDQ1XHUwMTFlXDFcMFwxXHUwMWIzXDFcdTAxMjFcMVx1MDE0YVwxXHUwMTIxIisKLSAgICAiXDFcdTAxNDdcMVx1MDEyMVwxXHUwMWIzXDI3XHUwMTIxXDFcdTAxYjNcMlx1MDEyMVwxXHUwMWIzXDJcdTAxMjEiKwotICAgICJcMVx1MDFiM1wxMFx1MDEyMVwxXHUwMWIzXDRcdTAxMjFcMVx1MDFiM1w3XHUwMTIxXDFcMFwxXHUwMWI0IisKLSAgICAiXDFcdTAxMjJcMVx1MDE0YlwzXHUwMTIyXDFcdTAxYjRcMVx1MDEyMlwxXHUwMTQ3XDI1XHUwMTIyXDFcdTAxYjQiKwotICAgICJcMlx1MDEyMlwxXHUwMWI0XDJcdTAxMjJcMVx1MDFiNFwxMFx1MDEyMlwxXHUwMWI0XDRcdTAxMjJcMVx1MDFiNCIrCi0gICAgIlw3XHUwMTIyXDFcMFwyXHUwMTBiXDFcdTAxMzVcMVx1MDEwYlwxXHUwMTMyXDY1XHUwMTBiXDFcMCIrCi0gICAgIlwyXHUwMTBjXDFcdTAxMzZcNVx1MDEwY1wxXHUwMTMyXDYxXHUwMTBjXDFcMFwyXHUwMTIxXDFcdTAxNGEiKwotICAgICJcMVx1MDEyMVwxXHUwMTQ3XDY1XHUwMTIxXDFcMFwyXHUwMTIyXDFcdTAxNGJcNVx1MDEyMlwxXHUwMTQ3IisKLSAgICAiXDYxXHUwMTIyIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tUcmFucygpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFsyMTM1OF07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tUcmFucyhaWl9UUkFOU19QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tUcmFucyhTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIHZhbHVlLS07Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1VOS05PV05fRVJST1IgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTk9fTUFUQ0ggPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfUFVTSEJBQ0tfMkJJRyA9IDI7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKgotICAgKiBaWl9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQVRUUklCVVRFID0genpVbnBhY2tBdHRyaWJ1dGUoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQVRUUklCVVRFX1BBQ0tFRF8wID0KLSAgICAiXDIzXDBcMVwxMVw3XDFcMVwxMVwxXDFcMVwxMVwyXDFcMVwxMSIrCi0gICAgIlwzXDFcMVwxMVw2XDFcMVwxMVwzXDFcMlwxMVwzXDFcMVwxMSIrCi0gICAgIlwyXDFcMlwxMVwzXDFcMVwxMVwxXDFcMVwxMVwxMVwxXDJcMTEiKwotICAgICJcNlwxXDFcMTFcNlwxXDFcMTFcMVwxXDFcMFwxXDFcMVwwIisKLSAgICAiXDFcMVwxXDBcMVwxXDEwXDBcMVwxXDRcMFwxXDExXDRcMCIrCi0gICAgIlwxXDExXDRcMFwxXDFcMVwwXDFcMVwxXDBcMVwxXDFcMCIrCi0gICAgIlwxXDExXDFcMFwxXDFcMVwwXDFcMVwyXDBcMVwxMVwzXDAiKwotICAgICJcMVwxXDFcMFwxXDFcM1wwXDFcMTFcMVwwXDFcMVwxXDExIisKLSAgICAiXDFcMVwyXDBcMVwxMVwyXDBcMlwxXDJcMFwxXDFcMlwwIisKLSAgICAiXDFcMTFcMVwxXDFcMTFcMlwxXDEwXDBcMVwxXDFcMFwxXDEiKwotICAgICJcMlwwXDFcMVwyXDBcMVwxXDJcMFwxXDFcMlwwXDVcMSIrCi0gICAgIlwxXDBcMVwxXDJcMFwxXDFcMVwwXDNcMVwxXDBcMVwxIisKLSAgICAiXDFcMFwxXDFcMlwwXDFcMVwxXDBcM1wxXDFcMFwzXDEiKwotICAgICJcMlwxMVwxMFwwXDFcMVw1XDBcNVwxXDJcMFw0XDFcMlwwIisKLSAgICAiXDJcMVwxXDBcMVwxXDFcMFwzXDFcM1wwXDFcMTFcMlwwIisKLSAgICAiXDFcMTFcMVwwXDFcMVwxMFwwXDFcMTFcNVwxXDJcMFw0XDEiKwotICAgICJcMlwwXDNcMVw1XDBcMVwxMVwxXDBcM1wxXDJcMFwxXDExIisKLSAgICAiXDJcMFwxXDFcNlwwXDFcMVwyXDBcNVwxXDJcMFw0XDEiKwotICAgICJcMlwwXDNcMVwyXDBcMVwxXDNcMFwzXDFcMVwwXDFcMTEiKwotICAgICJcMlwwXDFcMVwxM1wwXDVcMVwyXDBcNFwxXDJcMFwzXDEiKwotICAgICJcMTBcMFwyXDFcMVwxMVwyXDBcMVwxXDZcMFwxXDFcMVwwIisKLSAgICAiXDFcMVwyXDBcMlwxXDJcMFwzXDFcMlwwXDFcMVwxXDAiKwotICAgICJcMVwxXDZcMFwyXDFcNFwwXDFcMTFcNFwwXDFcMTFcM1wwIisKLSAgICAiXDFcMTFcMTJcMCI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQXR0cmlidXRlKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzQzNl07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBdHRyaWJ1dGUoWlpfQVRUUklCVVRFX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0F0dHJpYnV0ZShTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB6elJlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB6elN0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHp6QnVmZmVyW10gPSBuZXcgY2hhcltaWl9CVUZGRVJTSVpFXTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpNYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6ekN1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6elN0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHp6RW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOwotCi0gIC8qKiAKLSAgICogenpBdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0Qk9MID0gdHJ1ZTsKLQotICAvKiogenpBdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0RU9GOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5ERUZJTkVEID0gInVuZGVmaW5lZCI7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQ7Ci0vLwlwcml2YXRlIGludCBmQnVmZmVyZWRUZXh0TGVuZ3RoOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aDsKLS8vCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZCdWZmZXJlZFRleHQgPSBudWxsOwotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCXByaXZhdGUgaW50IGZJbml0aWFsU3RhdGUgPSBZWUlOSVRJQUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfTk9STUFMID0gMTYzODQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7Ci0JcHJpdmF0ZSBpbnQgZkluaXRpYWxCdWZmZXJTaXplID0gQlVGRkVSX1NJWkVfTk9STUFMOwotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgewotCQlmSW5pdGlhbFN0YXRlID0gc3RhdGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxCdWZmZXJTaXplKGludCBzaXplKSB7Ci0JCWZJbml0aWFsQnVmZmVyU2l6ZSA9IHNpemU7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLSAgCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dDsKLQkJU3RyaW5nIG5leHRUb2tlblR5cGU7Ci0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOwotLy8JCVN0cmluZ0J1ZmZlciB0ZXh0OwotCQlpbnQgc3RhcnQ7Ci0JCWludCB0ZXh0TGVuZ3RoOwotCQlpbnQgbGVuZ3RoOwotCQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCAhPSBudWxsKSB7Ci0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsKLS8vCQkJdGV4dCA9IGZCdWZmZXJlZFRleHQ7Ci0JCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0OwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsKLQotCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotLy8JCQl0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQlzdGFydCA9IHl5Y2hhcjsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQl9Ci0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7Ci0JCQkJLy8gdW5kZWYgLT4gY29uY2F0ZW5hdGUgdW5kZWYncwotCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJd2hpbGUgKG5leHRUb2tlblR5cGUgPT0gVU5ERUZJTkVEKSB7Ci0vLwkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOwotCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7Ci0JCQkJCWxlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJfQotCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOwotLy8JCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOwotCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQl9IGVsc2UgewotCQkJCW5leHRUb2tlblR5cGUgPSBudWxsOwotCQkJCXNwYWNlRm9sbG93cyA9IGZhbHNlOwotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25WYWx1ZVR5cGUoY29udGV4dCkpIHsgLy8gZGVjbGFyYXRpb24gdmFsdWUgY2FuIGNvbnRhaW4gVkFMVUVfUwotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQlzcGFjZUZvbGxvd3MgPSAobmV4dFRva2VuVHlwZSA9PSBDU1NfREVDTEFSQVRJT05fVkFMVUVfUyk7Ci0JCQkJfSBlbHNlIGlmIChjYW5Db250YWluU3BhY2UoY29udGV4dCkpIHsKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX1MpOwotCQkJCX0KLQkJCQlpZiAobmV4dFRva2VuVHlwZSAhPSBudWxsKSB7IC8vIG5leHRUb2tlbiBpcyByZXRyaWV2ZWQKLQkJCQkJaWYgKHNwYWNlRm9sbG93cyAmJiAoY29udGV4dCAhPSBDU1NfQ09NTUVOVCkpIHsKLQkJCQkJCS8vIG5leHQgaXMgc3BhY2UgLT4gYXBwZW5kCi0vLwkJCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJCWxlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gbmV4dCBpcyBOT1Qgc3BhY2UgLT4gcHVzaCB0aGlzIGZvciBuZXh0IHRpbWUsIHJldHVybiBpdHNlbGYKLQkJCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOwotLy8JCQkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsKLQkJCQljb250ZXh0ID0gQ1NTX1VOS05PV047Ci0JCQl9Ci0JCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLSAgCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JLyogZm9yIHN0YW5kYWxvbmUgdXNlICovCi0gIAlwdWJsaWMgZmluYWwgTGlzdCBwYXJzZVRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAJCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIAkJQ1NTVGV4dFRva2VuIHRva2VuOwotCQlmb3IgKFN0cmluZyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpOyBraW5kICE9IG51bGw7IGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCkpIHsKLQkJCXRva2VuID0gbmV3IENTU1RleHRUb2tlbigpOwotCQkJdG9rZW4ua2luZCA9IGtpbmQ7ICAJCQkJCi0JCQl0b2tlbi5zdGFydCA9IHl5Y2hhcjsKLQkJCXRva2VuLmxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQl0b2tlbi5pbWFnZSA9IHl5dGV4dCgpOwotCQkJdG9rZW5zLmFkZCh0b2tlbik7Ci0JCX0KLQotICAJCXJldHVybiB0b2tlbnM7Ci0gIAl9Ci0gIAkKLSAgCS8qIHVzZXIgbWV0aG9kICovCi0gIAlwcml2YXRlIGJvb2xlYW4gY2FuQ29udGFpblNwYWNlKFN0cmluZyB0eXBlKSB7Ci0gIAkJaWYgKHR5cGUgPT0gQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0gIAkJCXJldHVybiBmYWxzZTsKLSAgCQl9IGVsc2UgewotICAJCQlyZXR1cm4gdHJ1ZTsKLSAgCQl9Ci0gIAl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4geXljaGFyOwotCX0KLQkKLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4genpBdEVPRjsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsKLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCS8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JCXp6UmVhZGVyID0gaW47Ci0KLQkJLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQkJenpTdGF0ZSA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQkJenpMZXhpY2FsU3RhdGUgPSBmSW5pdGlhbFN0YXRlOyAvL1lZSU5JVElBTDsKLQotCQkvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotCQkJdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JCWlmICh6ekJ1ZmZlci5sZW5ndGggIT0gZkluaXRpYWxCdWZmZXJTaXplKSB7Ci0JCQl6ekJ1ZmZlciA9IG5ldyBjaGFyW2ZJbml0aWFsQnVmZmVyU2l6ZV07Ci0JCX0KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsKLQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQkJenpNYXJrZWRQb3MgPSAwOwotCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotLy8JCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXp6Q3VycmVudFBvcyA9IDA7Ci0KLQkJLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCQl6elN0YXJ0UmVhZCA9IDA7Ci0KLQkJLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkJZnJvbSBpbnB1dCAqLwotCQl6ekVuZFJlYWQgPSAwOwotCi0JCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXlsaW5lID0gMDsKLQotCQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5Y2hhciA9IDA7Ci0KLQkJLyoqCi0JCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLQkJICogbWF0Y2hlZCB0ZXh0Ci0JCSAqLwotLy8JCXl5Y29sdW1uID0gMDsgCi0KLQkJLyoqIAotCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLQkJICovCi0vLwkJeXlfYXRCT0wgPSBmYWxzZTsKLQkJCi0JCS8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJenpBdEVPRiA9IGZhbHNlOwotCi0JCS8qIHVzZXIgdmFyaWFibGVzICovCi0JCS8vCQlmVW5kZWZpbmVkLmRlbGV0ZSgwLCBmVW5kZWZpbmVkLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBDU1NUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkZWQgdG8gd29ya2Fyb3VuZCBzdHJpY3RlciBjb21waWxhdGlvbiBvcHRpb25zIHdpdGhvdXQgY3JlYXRpbmcKLQkgKiBhbiBhbHRlcm5hdGUgc2tlbGV0b24gZmlsZQotCSAqLwotCXZvaWQgX3VzZVByaXZhdGVzKCkgewotCQlTeXN0ZW0ub3V0LnByaW50KHl5Y29sdW1uKTsKLQkJU3lzdGVtLm91dC5wcmludCh5eWxpbmUpOwotCQlTeXN0ZW0ub3V0LnByaW50KEJvb2xlYW4udG9TdHJpbmcoenpBdEJPTCkpOwotCX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBDU1NUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBDU1NUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB6elVucGFja0NNYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTcwKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZWZpbGxzIHRoZSBpbnB1dCBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGlmZiB0aGVyZSB3YXMgbmV3IGlucHV0LgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpSZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh6elN0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIHp6U3RhcnRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpFbmRSZWFkLXp6U3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHp6RW5kUmVhZC09IHp6U3RhcnRSZWFkOwotICAgICAgenpDdXJyZW50UG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ek1hcmtlZFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpTdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoenpDdXJyZW50UG9zID49IHp6QnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbenpDdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB6ekJ1ZmZlci5sZW5ndGgpOwotICAgICAgenpCdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB6elJlYWRlci5yZWFkKHp6QnVmZmVyLCB6ekVuZFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLmxlbmd0aC16ekVuZFJlYWQpOwotCi0gICAgaWYgKG51bVJlYWQgPiAwKSB7Ci0gICAgICB6ekVuZFJlYWQrPSBudW1SZWFkOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyB1bmxpa2VseSBidXQgbm90IGltcG9zc2libGU6IHJlYWQgMCBjaGFyYWN0ZXJzLCBidXQgbm90IGF0IGVuZCBvZiBzdHJlYW0gICAgCi0gICAgaWYgKG51bVJlYWQgPT0gMCkgewotICAgICAgaW50IGMgPSB6elJlYWRlci5yZWFkKCk7Ci0gICAgICBpZiAoYyA9PSAtMSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHp6QnVmZmVyW3p6RW5kUmVhZCsrXSA9IChjaGFyKSBjOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9ICAgICAKLSAgICB9Ci0KLQkvLyBudW1SZWFkIDwgMAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB6ekF0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQotICAgIGlmICh6elJlYWRlciAhPSBudWxsKQotICAgICAgenpSZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKiBEb2VzIG5vdCBjbG9zZSB0aGUgb2xkIHJlYWRlci4KLSAgICoKLSAgICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIAotICAgKiA8Yj5jYW5ub3Q8L2I+IGJlIHJldXNlZCAoaW50ZXJuYWwgYnVmZmVyIGlzIGRpc2NhcmRlZCBhbmQgbG9zdCkuCi0gICAqIExleGljYWwgc3RhdGUgaXMgc2V0IHRvIDx0dD5aWl9JTklUSUFMPC90dD4uCi0gICAqCi0gICAqIEBwYXJhbSByZWFkZXIgICB0aGUgbmV3IGlucHV0IHN0cmVhbSAKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0gICAgenpSZWFkZXIgPSByZWFkZXI7Ci0gICAgenpBdEJPTCAgPSB0cnVlOwotICAgIHp6QXRFT0YgID0gZmFsc2U7Ci0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQgPSAwOwotICAgIHp6Q3VycmVudFBvcyA9IHp6TWFya2VkUG9zID0gMDsKLSAgICB5eWxpbmUgPSB5eWNoYXIgPSB5eWNvbHVtbiA9IDA7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHp6TGV4aWNhbFN0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB6ekxleGljYWxTdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB6ekJ1ZmZlciwgenpTdGFydFJlYWQsIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkICk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBjaGFyIHl5Y2hhcmF0KGludCBwb3MpIHsKLSAgICByZXR1cm4genpCdWZmZXJbenpTdGFydFJlYWQrcG9zXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEluIGEgd2VsbGZvcm1lZCBzY2FubmVyIChubyBvciBvbmx5IGNvcnJlY3QgdXNhZ2Ugb2YgCi0gICAqIHl5cHVzaGJhY2soaW50KSBhbmQgYSBtYXRjaC1hbGwgZmFsbGJhY2sgcnVsZSkgdGhpcyBtZXRob2QgCi0gICAqIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCB0aGluZ3MgdGhhdCAiQ2FuJ3QgUG9zc2libHkgSGFwcGVuIi4KLSAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nCi0gICAqIChlLmcuIGEgSkZsZXggYnVnIHByb2R1Y2luZyBhIGZhdWx0eSBzY2FubmVyIGV0Yy4pLgotICAgKgotICAgKiBVc3VhbCBzeW50YXgvc2Nhbm5lciBsZXZlbCBlcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZG9uZQotICAgKiBpbiBlcnJvciBmYWxsYmFjayBydWxlcy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB6elNjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgdHJ5IHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbZXJyb3JDb2RlXTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW1paX1VOS05PV05fRVJST1JdOwotICAgIH0KLQotICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwdWJsaWMgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpICB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgenpNYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHp6SW5wdXQ7Ci0gICAgaW50IHp6QWN0aW9uOwotCi0gICAgLy8gY2FjaGVkIGZpZWxkczoKLSAgICBpbnQgenpDdXJyZW50UG9zTDsKLSAgICBpbnQgenpNYXJrZWRQb3NMOwotICAgIGludCB6ekVuZFJlYWRMID0genpFbmRSZWFkOwotICAgIGNoYXIgW10genpCdWZmZXJMID0genpCdWZmZXI7Ci0gICAgY2hhciBbXSB6ekNNYXBMID0gWlpfQ01BUDsKLQotICAgIGludCBbXSB6elRyYW5zTCA9IFpaX1RSQU5TOwotICAgIGludCBbXSB6elJvd01hcEwgPSBaWl9ST1dNQVA7Ci0gICAgaW50IFtdIHp6QXR0ckwgPSBaWl9BVFRSSUJVVEU7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgenpNYXJrZWRQb3NMID0genpNYXJrZWRQb3M7Ci0KLSAgICAgIHl5Y2hhcis9IHp6TWFya2VkUG9zTC16elN0YXJ0UmVhZDsKLQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIHp6U3RhdGUgPSBaWl9MRVhTVEFURVt6ekxleGljYWxTdGF0ZV07Ci0KLQotICAgICAgenpGb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICBpZiAoenpDdXJyZW50UG9zTCA8IHp6RW5kUmVhZEwpCi0gICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgZWxzZSBpZiAoenpBdEVPRikgewotICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb25zCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3MgID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zICAgPSB6ek1hcmtlZFBvc0w7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdHJhbnNsYXRlZCBwb3NpdGlvbnMgYW5kIHBvc3NpYmx5IG5ldyBidWZmZXIKLSAgICAgICAgICAgIHp6Q3VycmVudFBvc0wgID0genpDdXJyZW50UG9zOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMICAgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6QnVmZmVyTCAgICAgID0genpCdWZmZXI7Ci0gICAgICAgICAgICB6ekVuZFJlYWRMICAgICA9IHp6RW5kUmVhZDsKLSAgICAgICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGludCB6ek5leHQgPSB6elRyYW5zTFsgenpSb3dNYXBMW3p6U3RhdGVdICsgenpDTWFwTFt6eklucHV0XSBdOwotICAgICAgICAgIGlmICh6ek5leHQgPT0gLTEpIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIHp6U3RhdGUgPSB6ek5leHQ7Ci0KLSAgICAgICAgICBpbnQgenpBdHRyaWJ1dGVzID0genpBdHRyTFt6elN0YXRlXTsKLSAgICAgICAgICBpZiAoICh6ekF0dHJpYnV0ZXMgJiAxKSA9PSAxICkgewotICAgICAgICAgICAgenpBY3Rpb24gPSB6elN0YXRlOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDgpID09IDggKSBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgenpNYXJrZWRQb3MgPSB6ek1hcmtlZFBvc0w7Ci0KLSAgICAgIHN3aXRjaCAoenpBY3Rpb24gPCAwID8genpBY3Rpb24gOiBaWl9BQ1RJT05benpBY3Rpb25dKSB7Ci0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19TVFJJTkc7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDUyOiBicmVhazsKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT047Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDUzOiBicmVhazsKLSAgICAgICAgY2FzZSAzOTogCi0gICAgICAgICAgLy8gbG9va2FoZWFkIGV4cHJlc3Npb24gd2l0aCBmaXhlZCBsb29rYWhlYWQgbGVuZ3RoCi0gICAgICAgICAgeXlwdXNoYmFjaygxKTsKLSAgICAgICAgICB7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA1NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNTY6IGJyZWFrOwotICAgICAgICBjYXNlIDE6IAotICAgICAgICAgIHsgcmV0dXJuIFVOREVGSU5FRDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNTc6IGJyZWFrOwotICAgICAgICBjYXNlIDk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDU4OiBicmVhazsKLSAgICAgICAgY2FzZSAzNzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkc7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDU5OiBicmVhazsKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9DTEFTUzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjA6IGJyZWFrOwotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19MQlJBQ0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDYxOiBicmVhazsKLSAgICAgICAgY2FzZSA0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19SQlJBQ0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDYyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX01FRElBX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY0OiBicmVhazsKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9GT05UX0ZBQ0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19GT05UX0ZBQ0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY2OiBicmVhazsKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0NIQVJTRVRfTkFNRSk7IHJldHVybiBDU1NfQ0hBUlNFVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjc6IGJyZWFrOwotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjk6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfQ0RDOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9VTklWRVJTQUw7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDcyOiBicmVhazsKLSAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzM6IGJyZWFrOwotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfQ0RPOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgODogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzc6IGJyZWFrOwotICAgICAgICBjYXNlIDQ0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfUEFHRV9QU0VVRE9fUEFHRSk7IHJldHVybiBDU1NfUEFHRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzg6IGJyZWFrOwotICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9DSEFSU0VUX0RFTElNSVRFUik7IHJldHVybiBDU1NfU1RSSU5HOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODI6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgICAvLyBsb29rYWhlYWQgZXhwcmVzc2lvbiB3aXRoIGZpeGVkIGxvb2thaGVhZCBsZW5ndGgKLSAgICAgICAgICB5eXB1c2hiYWNrKDEpOwotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODM6IGJyZWFrOwotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDg0OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODY6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9QQUdFX0RFTElNSVRFUik7IHJldHVybiBDU1NfUEFHRV9TRUxFQ1RPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODg6IGJyZWFrOwotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICAgIHsgcmV0dXJuIENTU19DT01NRU5UOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTE6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDkyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9TRVBBUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDkzOiBicmVhazsKLSAgICAgICAgY2FzZSAzOiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfUzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0lEOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk2OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTc6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTg6IGJyZWFrOwotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTk6IGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9QUk9QRVJUWTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTAwOiBicmVhazsKLSAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1BTRVVETzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTAxOiBicmVhazsKLSAgICAgICAgY2FzZSA0NjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9VUkk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwMjogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh6eklucHV0ID09IFlZRU9GICYmIHp6U3RhcnRSZWFkID09IHp6Q3VycmVudFBvcykgewotICAgICAgICAgICAgenpBdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9JQ1NTVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9JQ1NTVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MTVlY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSUNTU1Rva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIGN1cnJlbnRseSBwcm92aWRlIHRoaXMgaW50ZXJmYWNlIGJ1dCBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1Rva2VuaXplciB7Ci0KLQl2b2lkIHNldEluaXRpYWxTdGF0ZShpbnQgaW5pdGlhbFN0YXRlKTsKLQotCXZvaWQgc2V0SW5pdGlhbEJ1ZmZlclNpemUoaW50IGJ1ZnNpemUpOwotCi0JYm9vbGVhbiBpc0VPRigpOwotCi0Jdm9pZCByZXNldChSZWFkZXIgcmVhZGVyLCBpbnQgaSk7Ci0KLQlJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0Jdm9pZCByZXNldChjaGFyW10gY3MpOwotCi0JaW50IGdldE9mZnNldCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0NTU1RleHRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0NTU1RleHRSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyN2ZmNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9DU1NUZXh0UmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIENTU1RleHRSZWdpb25GYWN0b3J5IHsKLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NUZXh0UmVnaW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVSZWdpb24oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJcmVnaW9uID0gbmV3IENvbnRleHRSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JcHJpdmF0ZSBDU1NUZXh0UmVnaW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NUZXh0UmVnaW9uRmFjdG9yeSBmSW5zdGFuY2UgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1JlZ2lvbkNvbnRleHRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTUmVnaW9uQ29udGV4dHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyNzM1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTUmVnaW9uQ29udGV4dHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyejsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTUmVnaW9uQ29udGV4dHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DT01NRU5UID0gIkNPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NETyA9ICJDRE8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NEQyA9ICJDREMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1MgPSAiUyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUxJTUlURVIgPSAiREVMSU1JVEVSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19MQlJBQ0UgPSAiTEJSQUNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19SQlJBQ0UgPSAiUkJSQUNFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0lNUE9SVCA9ICJJTVBPUlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BBR0UgPSAiUEFHRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfTUVESUEgPSAiTUVESUEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0ZPTlRfRkFDRSA9ICJGT05UX0ZBQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NIQVJTRVQgPSAiQ0hBUlNFVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQVRLRVlXT1JEID0gIkFUS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TVFJJTkcgPSAiU1RSSU5HIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19VUkkgPSAiVVJJIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19NRURJVU0gPSAiTUVESVVNIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19NRURJQV9TRVBBUkFUT1IgPSAiTUVESUFfU0VQQVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NIQVJTRVRfTkFNRSA9ICJDSEFSU0VUX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUEFHRV9TRUxFQ1RPUiA9ICJDU1NfUEFHRV9TRUxFQ1RPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUgPSAiU0VMRUNUT1JfRUxFTUVOVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9VTklWRVJTQUwgPSAiU0VMRUNUT1JfVU5JVkVSU0FMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9QU0VVRE8gPSAiU0VMRUNUT1JfUFNFVURPIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9DTEFTUyA9ICJTRUxFQ1RPUl9DTEFTUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfSUQgPSAiU0VMRUNUT1JfSUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1IgPSAiU0VMRUNUT1JfQ09NQklOQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfU0VQQVJBVE9SID0gIlNFTEVDVE9SX1NFUEFSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQgPSAiU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EID0gIlNFTEVDVE9SX0FUVFJJQlVURV9FTkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FID0gIlNFTEVDVE9SX0FUVFJJQlVURV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgPSAiU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IgPSAiU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZID0gIkRFQ0xBUkFUSU9OX1BST1BFUlRZIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IgPSAiREVDTEFSQVRJT05fU0VQQVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9ERUxJTUlURVIgPSAiREVDTEFSQVRJT05fREVMSU1JVEVSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCA9ICJERUNMQVJBVElPTl9WQUxVRV9JREVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSA9ICJERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgPSAiREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiA9ICJERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UgPSAiREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORyA9ICJERUNMQVJBVElPTl9WQUxVRV9TVFJJTkciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSA9ICJERUNMQVJBVElPTl9WQUxVRV9VUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0ggPSAiREVDTEFSQVRJT05fVkFMVUVfSEFTSCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRSA9ICJERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQgPSAiQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgPSAiREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MgPSAiREVDTEFSQVRJT05fVkFMVUVfUyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19VTktOT1dOID0gIlVOS05PV04iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBGb3IgbnVsbCBvYmplY3QgOiBDU1NUb2tlbml6ZXIgbmV2ZXIgc2V0IHRoaXMgdmFsdWUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfVU5ERUZJTkVEID0gIlVOREVGSU5FRCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLSAJICogY3VycmVudGx5IHByb3ZpZGVkIHRoaXMgZmllbGQgYnV0IG1heSBiZSByZW1vdmVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfRk9SRUlHTl9FTEVNRU5UID0gIkZPUkVJR05fRUxFTUVOVCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0UGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTVGV4dFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjUzNjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0UGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1Rva2VuaXplcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBDU1NUZXh0UGFyc2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX1NUWUxFU0hFRVQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfREVDTEFSQVRJT04gPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfREVDTEFSQVRJT05fVkFMVUUgPSAyOwotCi0JcHVibGljIENTU1RleHRQYXJzZXIoaW50IHBhcnNlck1vZGUpIHsKLQkJaW5pdGlhbGl6ZVBhcnNlck1vZGUocGFyc2VyTW9kZSk7Ci0JfQotCi0JcHVibGljIENTU1RleHRQYXJzZXIoaW50IHBhcnNlck1vZGUsIFJlYWRlciByZWFkZXIpIHsKLQkJaW5pdGlhbGl6ZVBhcnNlck1vZGUocGFyc2VyTW9kZSk7Ci0JCXJlc2V0KHJlYWRlcik7Ci0JfQotCi0JcHVibGljIENTU1RleHRQYXJzZXIoaW50IHBhcnNlck1vZGUsIFN0cmluZyBpbnB1dCkgewotCQlpbml0aWFsaXplUGFyc2VyTW9kZShwYXJzZXJNb2RlKTsKLQkJcmVzZXQoaW5wdXQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQocmVhZGVyLCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgaW5wdXQpIHsKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQobmV3IFN0cmluZ1JlYWRlcihpbnB1dCksIDApOwotCX0KLQotCXB1YmxpYyBDU1NUZXh0VG9rZW5bXSBnZXRUb2tlbnMoKSB7Ci0JCUxpc3QgdG9rZW5MaXN0ID0gZ2V0VG9rZW5MaXN0KCk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IG5ldyBDU1NUZXh0VG9rZW5bdG9rZW5MaXN0LnNpemUoKV07Ci0JCXJldHVybiAoQ1NTVGV4dFRva2VuW10pIHRva2VuTGlzdC50b0FycmF5KHRva2Vucyk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0VG9rZW5MaXN0KCkgewotCQlMaXN0IHRva2VuczsKLQkJdHJ5IHsKLQkJCXRva2VucyA9IGdldFRva2VuaXplcigpLnBhcnNlVGV4dCgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0b2tlbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiB0b2tlbnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQYXJzZXJNb2RlKGludCBwYXJzZXJNb2RlKSB7Ci0JCWludCBpbml0aWFsU3RhdGU7Ci0JCWludCBidWZzaXplOwotCQlzd2l0Y2ggKHBhcnNlck1vZGUpIHsKLQkJCWNhc2UgTU9ERV9TVFlMRVNIRUVUIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuWVlJTklUSUFMOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFX0RFQ0xBUkFUSU9OIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuU1RfREVDTEFSQVRJT047Ci0JCQkJYnVmc2l6ZSA9IENTU1Rva2VuaXplci5CVUZGRVJfU0laRV9OT1JNQUw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PREVfREVDTEFSQVRJT05fVkFMVUUgOgotCQkJCWluaXRpYWxTdGF0ZSA9IENTU1Rva2VuaXplci5TVF9ERUNMQVJBVElPTl9QUkVfVkFMVUU7Ci0JCQkJYnVmc2l6ZSA9IENTU1Rva2VuaXplci5CVUZGRVJfU0laRV9TTUFMTDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybjsKLQkJfQotCQlpZiAoMCA8IGluaXRpYWxTdGF0ZSkgewotCQkJQ1NTVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQkJdG9rZW5pemVyLnNldEluaXRpYWxTdGF0ZShpbml0aWFsU3RhdGUpOwotCQkJdG9rZW5pemVyLnNldEluaXRpYWxCdWZmZXJTaXplKGJ1ZnNpemUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDU1NUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IENTU1Rva2VuaXplcigpOwotCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCXByaXZhdGUgQ1NTVG9rZW5pemVyIGZUb2tlbml6ZXIgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1RleHRUb2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1RleHRUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2M5MDc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0VG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyejsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTVGV4dFRva2VuIHsKLQlwdWJsaWMgU3RyaW5nIGtpbmQ7Ci0JcHVibGljIFN0cmluZyBpbWFnZTsKLQlwdWJsaWMgaW50IHN0YXJ0OwotCXB1YmxpYyBpbnQgbGVuZ3RoOwotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIChpbWFnZSAhPSBudWxsKSA/IGltYWdlIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjI0ZDE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uQ2hhcnNldE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBDU1MgQ29yZSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQotCQkvLyBmb3JtYXR0aW5nIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgNzIpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMsIGZhbHNlKTsKLQkJbm9kZS5wdXQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQik7Ci0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSwgMSk7Ci0KLQkJLy8gY2xlYW51cCBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UsIHRydWUpOwotCi0JCS8vIGNvZGUgZ2VuZXJhdGlvbiBwcmVmZXJlbmNlcwotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VULCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRlZmF1bHRFbmMgPSAiVVRGLTgiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN5c3RlbUVuYyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzeXN0ZW1FbmMgIT0gbnVsbCkgewotCQkJZGVmYXVsdEVuYyA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRQcmVmZXJyZWREZWZhdWx0SWFuYU5hbWUoc3lzdGVtRW5jLCAiVVRGLTgiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQsIGRlZmF1bHRFbmMpOwotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBhY3R1YWxseSBsb29raW5nIHVwIHRoZSBjb250ZW50Ci0JCS8vIHR5cGUncyB2YWxpZCBleHRlbnNpb25zCi0JCW5vZGUucHV0KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04sICJjc3MiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGFkZGl0aW9uYWwgY3NzIGNvcmUgcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QUkVfREVMSU0sIDApOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BPU1RfREVMSU0sIDEpOwotCQlub2RlLnB1dChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSwgIlwiIik7Ly8kTk9OLU5MUy0xJAotCQlub2RlLnB1dChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9CRVRXRUVOX1ZBTFVFLCAiICIpOy8vJE5PTi1OTFMtMSQKLQkJbm9kZS5wdXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFX0lOX1VSSSwgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSwgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUiwgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX05FV0xJTkVfT05fT1BFTl9CUkFDRSwgZmFsc2UpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUiwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9TRUxFQ1RPUiwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQotCQkvLyBDU1MgY2xlYW51cCBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9JREVOVElGSUVSLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9QUk9QRVJUWV9OQU1FLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9QUk9QRVJUWV9WQUxVRSwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfU0VMRUNUT1IsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2UxN2Q4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENTUyBjb3JlIHByZWZlcmVuY2Uga2V5cy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMoKSB7Ci0JCS8vIGVtcHR5IHByaXZhdGUgY29uc3RydWN0b3Igc28gdXNlcnMgY2Fubm90IGluc3RhbnRpYXRlIGNsYXNzCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTRV9JREVOVElGSUVSID0gImlkZW50aWZpZXJDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfU0VMRUNUT1IgPSAic2VsZWN0b3JDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfUFJPUEVSVFlfTkFNRSA9ICJwcm9wTmFtZUNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTRV9QUk9QRVJUWV9WQUxVRSA9ICJwcm9wVmFsdWVDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9CRVRXRUVOX1ZBTFVFID0gImJldHdlZW5WYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfUFJPUF9QT1NUX0RFTElNID0gInBvc3REZWxpbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfUFJPUF9QUkVfREVMSU0gPSAicHJlRGVsaW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1FVT1RFID0gInF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9RVU9URV9JTl9VUkkgPSAicXVvdGVJblVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UgPSAibmV3TGluZU9uT3BlbkJyYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdSQVBQSU5HX09ORV9QRVJfTElORSA9ICJvbmVQcm9wZXJ0eVBlckxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSID0gInByb2hpYml0V3JhcE9uQXR0ciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENTUyBjbGVhbnVwIHByZWZlcmVuY2UgbmFtZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0NBU0VfSURFTlRJRklFUiA9ICJjbGVhbnVwSWRlbnRpZmllckNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX1BST1BFUlRZX05BTUUgPSAiY2xlYW51cFByb3BOYW1lQ2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUgPSAiY2xlYW51cFByb3BWYWx1ZUNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX1NFTEVDVE9SID0gImNsZWFudXBTZWxlY3RvckNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX0lEX1NFTEVDVE9SID0gImNsZWFudXBJZFNlbGVjdG9yQ2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0NBU0VfQ0xBU1NfU0VMRUNUT1IgPSAiY2xlYW51cENsYXNzU2VsZWN0b3JDYXNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHVzZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkIGluIHRoZSBOZXcgQ1NTIEZpbGUKLQkgKiBXaXphcmQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYVEVOU0lPTiA9ICJkZWZhdWx0RXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBtYXhpbXVtIHdpZHRoIG9mIGEgbGluZSBiZWZvcmUgYSBsaW5lIHNwbGl0IGlzIG5lZWRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1dJRFRIID0gImxpbmVXaWR0aCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIGFsbCBibGFua3MgbGluZXMgc2hvdWxkIGJlIGNsZWFyZWQgZHVyaW5nIGZvcm1hdHRpbmcuCi0JICogQmxhbmsgbGluZXMgd2lsbCBiZSBrZXB0IHdoZW4gZmFsc2UuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfQUxMX0JMQU5LX0xJTkVTID0gImNsZWFyQWxsQmxhbmtMaW5lcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiAjSU5ERU5UQVRJT05fQ0hBUiBmb3IgMSBpbmRlbnRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlRBVElPTl9TSVpFID0gImluZGVudGF0aW9uU2l6ZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNoYXJhY3RlciB1c2VkIGZvciBpbmRlbnRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7VEFCLCBTUEFDRX0KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UQVRJT05fQ0hBUiA9ICJpbmRlbnRhdGlvbkNoYXIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjSU5ERU5UQVRJT05fQ0hBUi4gSW5kaWNhdGVzIHRvIHVzZQotCSAqIHRhYiBjaGFyYWN0ZXIgd2hlbiBmb3JtYXR0aW5nLgotCSAqIAotCSAqIEBzZWUgI1NQQUNFCi0JICogQHNlZSAjSU5ERU5UQVRJT05fQ0hBUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQiA9ICJ0YWIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI0lOREVOVEFUSU9OX0NIQVIuIEluZGljYXRlcyB0byB1c2UKLQkgKiBzcGFjZSBjaGFyYWN0ZXIgd2hlbiBmb3JtYXR0aW5nLgotCSAqIAotCSAqIEBzZWUgI1RBQgotCSAqIEBzZWUgI0lOREVOVEFUSU9OX0NIQVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICJzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBxdW90ZSBhbGwgYXR0cmlidXRlIHZhbHVlcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9URV9BVFRSX1ZBTFVFUyA9ICJxdW90ZUF0dHJWYWx1ZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBjbGVhbnVwIHByb2Nlc3NvciBzaG91bGQgZm9ybWF0IHNvdXJjZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfU09VUkNFID0gImZvcm1hdFNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBjYXNlIHByZWZlcmVuY2VzIEluZGljYXRlcyB0byBsZWF2ZSBjYXNlIGFzIGlzLgotCSAqIAotCSAqIEBzZWUgI0xPV0VSCi0JICogQHNlZSAjVVBQRVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU0lTID0gMDsKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgY2FzZSBwcmVmZXJlbmNlcyBJbmRpY2F0ZXMgdG8gbWFrZSBuYW1lCi0JICogbG93ZXJjYXNlLgotCSAqIAotCSAqIEBzZWUgI0FTSVMKLQkgKiBAc2VlICNVUFBFUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPV0VSID0gMTsKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgY2FzZSBwcmVmZXJlbmNlcyBJbmRpY2F0ZXMgdG8gbWFrZSBuYW1lCi0JICogdXBwZXJjYXNlLgotCSAqIAotCSAqIEBzZWUgI0xPV0VSCi0JICogQHNlZSAjQVNJUwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQUEVSID0gMjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSUNTU01vZGVsQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JQ1NTTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMTg4MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JQ1NTTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTTW9kZWxBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCUlDU1NNb2RlbCBnZXRNb2RlbCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JTW9kZWxQcm92aWRlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JTW9kZWxQcm92aWRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWY5NGQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSU1vZGVsUHJvdmlkZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxQcm92aWRlQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIG1vZGVsUHJvdmlkZWQoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIG1vZGVsUmVsZWFzZWQoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIG1vZGVsUmVtb3ZlZChJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzZhOTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZURlY2xhcmF0aW9uQWRhcHRlciBleHRlbmRzIElDU1NNb2RlbEFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0U3R5bGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNlbGVjdG9yQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGUyOTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlU2VsZWN0b3JBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIHBzZXVkb05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlib29sZWFuIG1hdGNoKElDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNoZWV0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTaGVldEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE0NzUyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNoZWV0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZVNoZWV0QWRhcHRlciBleHRlbmRzIElDU1NNb2RlbEFkYXB0ZXIgewotCi0JLyoqCi0JICogUmV0dXJucyBIVE1ML1hNTCBlbGVtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgYWRhcHRlcgotCSAqLwotCUVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBDU1MgZG9jdW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIHRoaXMgZWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0IGdldFNoZWV0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgdGltZSBvZiByZWxlYXNpbmcgSFRNTC9YTUwgbW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlZCgpOwotCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIHRpbWUgb2YgcmVtb3ZpbmcgdGhpcyBFbGVtZW50IGZyb20gdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTaGVldExpc3RBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2Mzg4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0OwotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVTaGVldExpc3RBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqLwotCUVudW1lcmF0aW9uIGdldENsYXNzZXMoKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldE92ZXJyaWRlU3R5bGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldExpc3QgZ2V0U3R5bGVTaGVldHMoKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VTdHlsZVNoZWV0cygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2MjJjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcywgd2l0aCBpdHMgb25lIGZpZWxkLCBpcyBhIGNvbnZpZW5jZSB0byBwcm92aWRlIGNvbXBpbGUtdGltZQotICogc2FmZXR5IHdoZW4gcmVmZXJpbmcgdG8gYSBjb250ZW50VHlwZSBJRC4gVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZAotICogZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbiBwbHVnaW4ueG1sIGZpbGUuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlSWRGb3JDU1MgewotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0Ci0JICogcHJvdGVjdGVkIG1ldGhvZCBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfQ1NTID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQotCS8qKgotCSAqIERvbid0IGFsbG93IGluc3RhbnRpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb250ZW50VHlwZUlkRm9yQ1NTKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlzdGF0aWMgU3RyaW5nIGdldENvbnN0YW50U3RyaW5nKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NBY2Nlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0FjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDJhZmEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0FjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NBY2Nlc3MgewotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuVmVjdG9yCi0JICovCi0JVmVjdG9yIGdldENsYXNzTmFtZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0F0dHIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0F0dHIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4MGE4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NBdHRyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTQXR0ciBleHRlbmRzIElDU1NOb2RlIHsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JSUNTU05vZGUgZ2V0T3duZXJDU1NOb2RlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0NoYXJzZXRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NDaGFyc2V0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTM0ZWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0NoYXJzZXRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NDaGFyc2V0UnVsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTQ2hhcnNldFJ1bGUgZXh0ZW5kcyBJQ1NTTm9kZSwgQ1NTQ2hhcnNldFJ1bGUgewotCi0JamF2YS5sYW5nLlN0cmluZyBFTkNPRElORyA9ICJlbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0RvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTZjMGQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0RvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTRG9jdW1lbnQgZXh0ZW5kcyBJQ1NTTm9kZSB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NDaGFyc2V0UnVsZQotCSAqLwotCUlDU1NDaGFyc2V0UnVsZSBjcmVhdGVDU1NDaGFyc2V0UnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlCi0JICovCi0JQ1NTRm9udEZhY2VSdWxlIGNyZWF0ZUNTU0ZvbnRGYWNlUnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTSW1wb3J0UnVsZQotCSAqLwotCUlDU1NJbXBvcnRSdWxlIGNyZWF0ZUNTU0ltcG9ydFJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLklDU1NNZWRpYVJ1bGUKLQkgKi8KLQlJQ1NTTWVkaWFSdWxlIGNyZWF0ZUNTU01lZGlhUnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUGFnZVJ1bGUKLQkgKi8KLQlJQ1NTUGFnZVJ1bGUgY3JlYXRlQ1NTUGFnZVJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIGNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKHNob3J0IHByaW1pdGl2ZVR5cGUpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JQ1NTUnVsZSBjcmVhdGVDU1NSdWxlKFN0cmluZyBydWxlKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSUNTU1N0eWxlRGVjbEl0ZW0gY3JlYXRlQ1NTU3R5bGVEZWNsSXRlbShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlUnVsZQotCSAqLwotCUlDU1NTdHlsZVJ1bGUgY3JlYXRlQ1NTU3R5bGVSdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZQotCSAqLwotCUNTU1Vua25vd25SdWxlIGNyZWF0ZUNTU1Vua25vd25SdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdAotCSAqLwotCU1lZGlhTGlzdCBjcmVhdGVNZWRpYUxpc3QoKTsKLQotCUlDU1NNb2RlbCBnZXRNb2RlbCgpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc0RvY3VtZW50KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NJbXBvcnRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NJbXBvcnRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZDkwZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTSW1wb3J0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTSW1wb3J0UnVsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTSW1wb3J0UnVsZSBleHRlbmRzIElDU1NOb2RlLCBDU1NJbXBvcnRSdWxlIHsKLQotCWphdmEubGFuZy5TdHJpbmcgSFJFRiA9ICJocmVmIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZWZyZXNoU3R5bGVTaGVldCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGhyZWYKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQl2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTWVkaWFSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNZWRpYVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0MDMzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNZWRpYVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU01lZGlhUnVsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTTWVkaWFSdWxlIGV4dGVuZHMgSUNTU05vZGUsIElDU1NSdWxlQ29udGFpbmVyLCBDU1NNZWRpYVJ1bGUgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2ZTU3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NNb2RlbCBleHRlbmRzIElDU1NTdHlsZU5vdGlmaWVyLCBJU3RydWN0dXJlZE1vZGVsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMID0gImV4dGVybmFsQ1NTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREVEID0gImVtYmVkZGVkQ1NTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTElORSA9ICJpbmxpbmVDU1MiOyAvLyROT04tTkxTLTEkCi0KLQlJQ1NTRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGUgZ2V0T3duZXJET01Ob2RlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlPYmplY3QgZ2V0U3R5bGVTaGVldFR5cGUoKTsKLQotCS8qKgotCSAqIGNsZWFudXAgLT4gcmVidWlsZCBDU1MgTm9kZXMgVGhpcyBpcyBwcmUtYmV0YSBmaXggZm9yIDE3ODE3Ni4KLQkgKi8KLQl2b2lkIHJlZnJlc2hOb2RlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTmFtZWROb2RlTWFwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOYW1lZE5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4NjljMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOYW1lZE5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NOYW1lZE5vZGVNYXAgZXh0ZW5kcyBJQ1NTTm9kZUxpc3QgewotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSUNTU05vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxN2U1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTTm9kZSB7Ci0KLQlzaG9ydCBBVFRSX05PREUgPSAtMTsKLQlzaG9ydCBVTktOT1dOUlVMRV9OT0RFID0gMDsKLQlzaG9ydCBTVFlMRVJVTEVfTk9ERSA9IDE7Ci0Jc2hvcnQgQ0hBUlNFVFJVTEVfTk9ERSA9IDI7Ci0Jc2hvcnQgSU1QT1JUUlVMRV9OT0RFID0gMzsKLQlzaG9ydCBNRURJQVJVTEVfTk9ERSA9IDQ7Ci0Jc2hvcnQgRk9OVEZBQ0VSVUxFX05PREUgPSA1OwotCXNob3J0IFBBR0VSVUxFX05PREUgPSA2OwotCXNob3J0IFNUWUxFU0hFRVRfTk9ERSA9IDc7Ci0Jc2hvcnQgU1RZTEVERUNMQVJBVElPTl9OT0RFID0gODsKLQlzaG9ydCBTVFlMRURFQ0xJVEVNX05PREUgPSA5OwotCXNob3J0IFZBTFVFTElTVF9OT0RFID0gMTA7Ci0Jc2hvcnQgUFJJTUlUSVZFVkFMVUVfTk9ERSA9IDExOwotCXNob3J0IE1FRElBTElTVF9OT0RFID0gMTI7Ci0Jc2hvcnQgRE9DVU1FTlRDU1NTVFlMRV9OT0RFID0gMTM7Ci0Jc2hvcnQgTElOS1NUWUxFX05PREUgPSAxNDsKLQlzaG9ydCBFTEVNRU5UQ1NTSU5MSU5FU1RZTEVfTk9ERSA9IDE1OwotCi0JSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOYW1lZE5vZGVNYXAKLQkgKi8KLQlJQ1NTTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKTsKLQotCUlDU1NOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCk7Ci0KLQlJQ1NTTm9kZSBnZXRGaXJzdENoaWxkKCk7Ci0KLQlJQ1NTTm9kZSBnZXRMYXN0Q2hpbGQoKTsKLQotCUlDU1NOb2RlIGdldE5leHRTaWJsaW5nKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0Tm9kZVR5cGUoKTsKLQotCUlDU1NEb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCk7Ci0KLQlJQ1NTTm9kZSBnZXRQYXJlbnROb2RlKCk7Ci0KLQlJQ1NTTm9kZSBnZXRQcmV2aW91c1NpYmxpbmcoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaGFzQ2hpbGROb2RlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTm9kZUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05vZGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMGRmYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTm9kZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NOb2RlTGlzdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCUlDU1NOb2RlIGl0ZW0oaW50IGluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1BhZ2VSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NQYWdlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmEyNGEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1BhZ2VSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQYWdlUnVsZTsKLQotcHVibGljIGludGVyZmFjZSBJQ1NTUGFnZVJ1bGUgZXh0ZW5kcyBJQ1NTTm9kZSwgQ1NTUGFnZVJ1bGUgewotCi0JamF2YS5sYW5nLlN0cmluZyBTRUxFQ1RPUiA9ICJzZWxlY3RvciI7IC8vJE5PTi1OTFMtMSQKLQotCUlDU1NTZWxlY3Rvckxpc3QgZ2V0U2VsZWN0b3JzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NQcmltaXRpdmVWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUHJpbWl0aXZlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlYWNiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NQcmltaXRpdmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1ByaW1pdGl2ZVZhbHVlIGV4dGVuZHMgSUNTU05vZGUsIElDU1NWYWx1ZSwgQ1NTUHJpbWl0aXZlVmFsdWUgewotCi0Jc2hvcnQgQ1NTX0lOVEVHRVIgPSAyNjsKLQlzaG9ydCBDU1NfSEFTSCA9IDI3OwotCXNob3J0IENTU19VUkFOR0UgPSAyODsKLQlzaG9ydCBDU1NfRk9STUFUID0gMjk7Ci0Jc2hvcnQgQ1NTX0xPQ0FMID0gMzA7Ci0Jc2hvcnQgQ1NTX1NMQVNIID0gMzE7Ci0Jc2hvcnQgQ1NTX0NPTU1BID0gMzI7Ci0Jc2hvcnQgQ1NTX0lOSEVSSVRfUFJJTUlUSVZFID0gMzM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmxvYXRWYWx1ZQotCSAqICAgICAgICAgICAgZmxvYXQKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShmbG9hdCBmbG9hdFZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZ1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHN0cmluZ1ZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUnVsZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUnVsZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWFlNTk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1J1bGVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NSdWxlQ29udGFpbmVyIHsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JQ1NTUnVsZSBhcHBlbmRSdWxlKENTU1J1bGUgcnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gbmV3UnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcmVmUnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKi8KLQlDU1NSdWxlIGluc2VydFJ1bGVCZWZvcmUoQ1NTUnVsZSBuZXdSdWxlLCBDU1NSdWxlIHJlZlJ1bGUpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUNTU1J1bGUgcmVtb3ZlUnVsZShDU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JQ1NTUnVsZSByZXBsYWNlUnVsZShDU1NSdWxlIG5ld1J1bGUsIENTU1J1bGUgb2xkUnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTk1NDFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1NlbGVjdG9yIHsKLQotCUlDU1NTZWxlY3Rvckl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlJdGVyYXRvciBnZXRJdGVyYXRvcigpOwotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRTcGVjaWZpY2l0eSgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFN0cmluZygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlib29sZWFuIG1hdGNoKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpOwotCi0JLyoqCi0JICogCi0JICovCi0JSXRlcmF0b3IgZ2V0RXJyb3JzKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0RXJyb3JDb3VudCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0NDNjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IgZXh0ZW5kcyBJQ1NTU2VsZWN0b3JJdGVtIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBERVNDRU5EQU5UID0gJyAnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDSElMRCA9ICc+JzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQURKQUNFTlQgPSAnKyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFVOS05PV04gPSAnPyc7IC8vIGVycm9yIGNhc2UKLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JY2hhciBnZXRDb21iaW5hdG9yVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JJdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvckl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmZThmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvckl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTZWxlY3Rvckl0ZW0gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lNUExFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01CSU5BVE9SID0gMjsKLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldEl0ZW1UeXBlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0U3RyaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvckxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzdmZDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTZWxlY3Rvckxpc3QgewotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlJdGVyYXRvciBnZXRJdGVyYXRvcigpOwotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5WZWN0b3IKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCUlDU1NTZWxlY3RvciBnZXRTZWxlY3RvcihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFN0cmluZygpOwotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldEVycm9yQ291bnQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yIGdldEVycm9ycygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlib29sZWFuIG1hdGNoKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2ltcGxlU2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NpbXBsZVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWZiODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2ltcGxlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTaW1wbGVTZWxlY3RvciBleHRlbmRzIElDU1NTZWxlY3Rvckl0ZW0gewotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCVN0cmluZyBnZXRDbGFzcyhpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlTdHJpbmcgZ2V0SUQoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlpbnQgZ2V0TnVtT2ZBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlpbnQgZ2V0TnVtT2ZDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlpbnQgZ2V0TnVtT2ZJRHMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWludCBnZXROdW1PZlBzZXVkb05hbWVzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCVN0cmluZyBnZXRQc2V1ZG9OYW1lKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGlzVW5pdmVyc2FsKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZURlY2xJdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZURlY2xJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOWNkNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVEZWNsSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlRGVjbEl0ZW0gZXh0ZW5kcyBJQ1NTTm9kZSwgSUNTU1ZhbHVlTGlzdCB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIElNUE9SVEFOVCA9ICJpbXBvcnRhbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSBhcHBlbmRWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZQotCSAqLwotCUNTU1ZhbHVlIGdldENTU1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0UHJpb3JpdHkoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIHJlbW92ZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgcmVwbGFjZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSBuZXdWYWx1ZSwgSUNTU1ByaW1pdGl2ZVZhbHVlIG9sZFZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIHByaW9yaXR5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0Jdm9pZCBzZXRQcmlvcml0eShTdHJpbmcgcHJpb3JpdHkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVEZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTg3MzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlRGVjbGFyYXRpb24gZXh0ZW5kcyBJQ1NTRG9jdW1lbnQsIENTU1N0eWxlRGVjbGFyYXRpb24gewotCi0JSUNTU1N0eWxlRGVjbEl0ZW0gZ2V0RGVjbEl0ZW1Ob2RlKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JSUNTU1N0eWxlRGVjbEl0ZW0gcmVtb3ZlRGVjbEl0ZW1Ob2RlKElDU1NTdHlsZURlY2xJdGVtIG9sZERlY2wpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQlJQ1NTU3R5bGVEZWNsSXRlbSBzZXREZWNsSXRlbU5vZGUoSUNTU1N0eWxlRGVjbEl0ZW0gbmV3RGVjbCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNGUxYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVJ1bGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlUnVsZSBleHRlbmRzIElDU1NOb2RlLCBDU1NTdHlsZVJ1bGUgewotCi0JamF2YS5sYW5nLlN0cmluZyBTRUxFQ1RPUiA9ICJzZWxlY3RvciI7IC8vJE5PTi1OTFMtMSQKLQotCUlDU1NTZWxlY3Rvckxpc3QgZ2V0U2VsZWN0b3JzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZVNoZWV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZVNoZWV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYTgyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVTaGVldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlU2hlZXQgZXh0ZW5kcyBJQ1NTRG9jdW1lbnQsIElDU1NSdWxlQ29udGFpbmVyLCBDU1NTdHlsZVNoZWV0IHsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKi8KLQlOb2RlTGlzdCBnZXRPd25lck5vZGVzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICogQHBhcmFtIGRvYwotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlOb2RlTGlzdCBnZXRPd25lck5vZGVzKERvY3VtZW50IGRvYyk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdAotCSAqLwotCUNTU1J1bGVMaXN0IGdldE93bmVyUnVsZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3QKLQkgKi8KLQlTdHlsZVNoZWV0TGlzdCBnZXRQYXJlbnRTdHlsZVNoZWV0cygpOwotCi0JLyoqCi0JICogVGhlIGxpc3Qgb2YgYWxsIENTUyBydWxlcyBjb250YWluZWQgd2l0aGluIHRoZSBzdHlsZXNoZWV0IGFuZCwgaWYgcmVxdWVzdGVkLCB0aGUgcnVsZXMKLQkgKiBmcm9tIGltcG9ydGVkIHN0eWxlc2hlZXRzIGFyZSBtZXJnZWQgaW50byB0aGUgcnVsZSBsaXN0LgotCSAqIEBwYXJhbSBzaG91bGRJbXBvcnQgaW5kaWNhdGVzIGlmIHJ1bGVzIGZyb20gaW1wb3J0ZWQgc3R5bGVzaGVldHMgc2hvdWxkIGJlIHJldHVybmVkCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBhbGwgb2YgdGhlIHJ1bGVzIGluIHRoZSBzdHlsZXNoZWV0LCBhbmQgaWYgcmVxdWVzdGVkLAotCSAqIGFueSBydWxlcyBmcm9tIGltcG9ydGVkIHN0eWxlc2hlZXRzCi0JICovCi0JQ1NTUnVsZUxpc3QgZ2V0Q3NzUnVsZXMoYm9vbGVhbiBzaG91bGRJbXBvcnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjkxNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NWYWx1ZSBleHRlbmRzIENTU1ZhbHVlIHsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXRDU1NWYWx1ZVRleHQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ZhbHVlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTVmFsdWVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OWM1NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTVmFsdWVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZUxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1ZhbHVlTGlzdCBleHRlbmRzIElDU1NWYWx1ZSwgQ1NTVmFsdWVMaXN0IHsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgYXBwZW5kVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgcmVtb3ZlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNvdW50ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNvdW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4MjRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDb3VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5Db3VudGVyOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb3VudGVyIGV4dGVuZHMgSUNTU05vZGUsIENvdW50ZXIgewotCi0JamF2YS5sYW5nLlN0cmluZyBJREVOVElGSUVSID0gImlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCi0JamF2YS5sYW5nLlN0cmluZyBMSVNUU1RZTEUgPSAibGlzdHN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWphdmEubGFuZy5TdHJpbmcgU0VQQVJBVE9SID0gInNlcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSBpZGVudGlmaWVyCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXZvaWQgc2V0SWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0U3R5bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0Jdm9pZCBzZXRMaXN0U3R5bGUoU3RyaW5nIGxpc3RTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBTZXBhcmF0b3IKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0Jdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIHNlcGFyYXRvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01JbXBsZW1lbnRhdGlvbkNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzQ0ZTk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5ET01JbXBsZW1lbnRhdGlvbkNTUzsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NSW1wbGVtZW50YXRpb25DU1MgZXh0ZW5kcyBET01JbXBsZW1lbnRhdGlvbkNTUyB7Ci0KLQlJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURvY3VtZW50U3R5bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURvY3VtZW50U3R5bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0NjA2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lEb2N1bWVudFN0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLkRvY3VtZW50U3R5bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRTdHlsZSBleHRlbmRzIERvY3VtZW50U3R5bGUgewotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQHBhcmFtIG5ld1NoZWV0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCVN0eWxlU2hlZXQgYXBwZW5kU2hlZXQoU3R5bGVTaGVldCBuZXdTaGVldCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSBuZXdTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSByZWZTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlTdHlsZVNoZWV0IGluc2VydFNoZWV0QmVmb3JlKFN0eWxlU2hlZXQgbmV3U2hlZXQsIFN0eWxlU2hlZXQgcmVmU2hlZXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAcGFyYW0gb2xkU2hlZXQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JU3R5bGVTaGVldCByZW1vdmVTaGVldChTdHlsZVNoZWV0IG9sZFNoZWV0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQHBhcmFtIG5ld1NoZWV0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQHBhcmFtIG9sZFNoZWV0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCVN0eWxlU2hlZXQgcmVwbGFjZVNoZWV0KFN0eWxlU2hlZXQgbmV3U2hlZXQsIFN0eWxlU2hlZXQgb2xkU2hlZXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3ByZWZlcmVuY2VzL0NTU1ByZWZlcmVuY2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcHJlZmVyZW5jZXMvQ1NTUHJlZmVyZW5jZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWZhZmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcHJlZmVyZW5jZXMvQ1NTUHJlZmVyZW5jZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBqdXN0IGFjY2VzcyBwcmVmZXJlbmNlcyBkaXJlY3RseQotICovCi1wdWJsaWMgY2xhc3MgQ1NTUHJlZmVyZW5jZUhlbHBlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NQcmVmZXJlbmNlSGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NQcmVmZXJlbmNlSGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJldHdlZW5WYWx1ZVN0cmluZygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX0JFVFdFRU5fVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQlpZiAoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGluZGVudENoYXJQcmVmKSkgewotCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJfQotCQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRNYXhMaW5lV2lkdGgoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVvdGVTdHJpbmcoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCS8vIG5ha2Ftb3JpX1RPRE8gY3NzIHByZWYgdHJhbnNpdGlvbgotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3BhY2VzUG9zdERlbGltaXRlcigpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUE9TVF9ERUxJTSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRTcGFjZXNQcmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BSRV9ERUxJTSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZGVudFVwcGVyQ2FzZSgpIHsKLQkJaWYgKGdldFByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld0xpbmVPbk9wZW5CcmFjZSgpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX05FV0xJTkVfT05fT1BFTl9CUkFDRSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPbmVQcm9wZXJ0eVBlckxpbmUoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvaGliaXRXcmFwT25BdHRyKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BOYW1lVXBwZXJDYXNlKCkgewotCQlpZiAoZ2V0UHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcFZhbHVlVXBwZXJDYXNlKCkgewotCQlpZiAoZ2V0UHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1F1b3RlSW5VUkkoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEVfSU5fVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCZXR3ZWVuVmFsdWVTdHJpbmcoU3RyaW5nIG5ld0JldHdlZW5WYWx1ZVN0cmluZykgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX0JFVFdFRU5fVkFMVUUsIG5ld0JldHdlZW5WYWx1ZVN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SWRlbnRVcHBlckNhc2UoYm9vbGVhbiBuZXdJZGVudFVwcGVyQ2FzZSkgewotCQlpbnQgdGhlQ2FzZSA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVI7Ci0JCWlmIChuZXdJZGVudFVwcGVyQ2FzZSkKLQkJCXRoZUNhc2UgPSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSLCB0aGVDYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPbmVQcm9wZXJ0eVBlckxpbmUoYm9vbGVhbiBuZXdPbmVQcm9wZXJ0eVBlckxpbmUpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSwgbmV3T25lUHJvcGVydHlQZXJMaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9oaWJpdFdyYXBPbkF0dHIoYm9vbGVhbiBuZXdQcm9oaWJpdFdyYXBPbkF0dHIpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUiwgbmV3UHJvaGliaXRXcmFwT25BdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wTmFtZVVwcGVyQ2FzZShib29sZWFuIG5ld1Byb3BOYW1lVXBwZXJDYXNlKSB7Ci0JCWludCB0aGVDYXNlID0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUjsKLQkJaWYgKG5ld1Byb3BOYW1lVXBwZXJDYXNlKQotCQkJdGhlQ2FzZSA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVI7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUsIHRoZUNhc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFByb3BWYWx1ZVVwcGVyQ2FzZShib29sZWFuIG5ld1Byb3BWYWx1ZVVwcGVyQ2FzZSkgewotCQlpbnQgdGhlQ2FzZSA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVI7Ci0JCWlmIChuZXdQcm9wVmFsdWVVcHBlckNhc2UpCi0JCQl0aGVDYXNlID0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUjsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUsIHRoZUNhc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1b3RlU3RyaW5nKFN0cmluZyBxdW90ZSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFLCBxdW90ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BhY2VzUG9zdERlbGltaXRlcihpbnQgbnVtKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QT1NUX0RFTElNLCBudW0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwYWNlc1ByZURlbGltaXRlcihpbnQgbnVtKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QUkVfREVMSU0sIG51bSk7Ci0JfQotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJQ1NTQ29yZVBsdWdpbiBjc3NNb2RlbFBsdWdpbiA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gY3NzTW9kZWxQbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcml2YXRlIENTU1ByZWZlcmVuY2VIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTUHJlZmVyZW5jZUhlbHBlciBmSW5zdGFuY2UgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lDU1NQYXJ0aXRpb25UeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lDU1NQYXJ0aXRpb25UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGZjZjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JQ1NTUGFydGl0aW9uVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uVHlwZXM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLiBJdCBkZWZpbmVzIHRoZQotICogcGFydGl0aW9uaW5nIGZvciBDU1MgYW5kIGFsbCBpdHMgcGFydGl0aW9ucy4gQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZQotICogcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBkZXByZWNhdGVkIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1BhcnRpdGlvblR5cGVzIGV4dGVuZHMgSVN0cnVjdHVyZWRQYXJ0aXRpb25UeXBlcyB7Ci0KLQlTdHJpbmcgU1RZTEUgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5TVFlMRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGFza3MvQ1NTRmlsZVRhc2tTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Rhc2tzL0NTU0ZpbGVUYXNrU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjliZmM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGFza3MvQ1NTRmlsZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5TdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyOwotCi1wdWJsaWMgY2xhc3MgQ1NTRmlsZVRhc2tTY2FubmVyIGV4dGVuZHMgU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lciB7Ci0JcHVibGljIENTU0ZpbGVUYXNrU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbW1lbnRlZFRleHQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgYmVnaW4sIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0ZXh0ID0gc3VwZXIuZ2V0Q29tbWVudGVkVGV4dChkb2N1bWVudCwgYmVnaW4sIGxlbmd0aCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5lbmRzV2l0aCgiKi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGgoKSAtIDIpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tbWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQlyZXR1cm4gdGV4dFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjAzNzRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NSZWdpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNlbnRyYWxpemVkIHBsYWNlIHRvIHB1dCAicmVwYXJzaW5nIiBsb2dpYy4gVGhpcyBpcwotICogdGhlIGxvZ2ljIHRoYXQgcmVwYXJzZXMgdGhlIHRleHQgaW5jcmVtZW50YWxseSwgYXMgYSB1c2VyIHR5cGVzIGluIG5ldwotICogY2hhcmFjdGVycywgb3IgRE9NIG5vZGVzIGFyZSBpbnNlcnRlZCBvciBkZWxldGVkLiBOb3RlOiBpdCBpcyBub3QgYSB0aHJlYWQKLSAqIHNhZmUgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHsKLQotCWNsYXNzIFJlcGFyc2VSYW5nZSB7Ci0JCVJlcGFyc2VSYW5nZSgpIHsKLQkJCXJlc2V0KCk7Ci0JCX0KLQotCQlSZXBhcnNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQlmUmFuZ2VTdGFydCA9IHN0YXJ0OwotCQkJZlJhbmdlRW5kID0gZW5kOwotCQl9Ci0KLQkJdm9pZCBzZXRTdGFydChpbnQgc3RhcnQpIHsKLQkJCWZSYW5nZVN0YXJ0ID0gc3RhcnQ7Ci0JCX0KLQotCQl2b2lkIHNldEVuZChpbnQgZW5kKSB7Ci0JCQlmUmFuZ2VFbmQgPSBlbmQ7Ci0JCX0KLQotCQlpbnQgZ2V0U3RhcnQoKSB7Ci0JCQlyZXR1cm4gZlJhbmdlU3RhcnQ7Ci0JCX0KLQotCQlpbnQgZ2V0RW5kKCkgewotCQkJcmV0dXJuIGZSYW5nZUVuZDsKLQkJfQotCi0JCWJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJCXJldHVybiAoMCA8IGZSYW5nZUVuZCAtIGZSYW5nZVN0YXJ0KSA/IHRydWUgOiBmYWxzZTsKLQkJfQotCi0JCXZvaWQgcmVzZXQoKSB7Ci0JCQlmUmFuZ2VTdGFydCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQkJZlJhbmdlRW5kID0gMDsKLQkJfQotCi0JCXZvaWQgZXhwYW5kKFJlcGFyc2VSYW5nZSByYW5nZSkgewotCQkJaWYgKHJhbmdlID09IG51bGwgfHwgIXJhbmdlLmlzVmFsaWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWludCBzdGFydCA9IHJhbmdlLmdldFN0YXJ0KCk7Ci0JCQlpZiAoc3RhcnQgPCBmUmFuZ2VTdGFydCkgewotCQkJCWZSYW5nZVN0YXJ0ID0gc3RhcnQ7Ci0JCQl9Ci0JCQlpbnQgZW5kID0gcmFuZ2UuZ2V0RW5kKCk7Ci0JCQlpZiAoZlJhbmdlRW5kIDwgZW5kKSB7Ci0JCQkJZlJhbmdlRW5kID0gZW5kOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgZlJhbmdlU3RhcnQ7Ci0JCXByaXZhdGUgaW50IGZSYW5nZUVuZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50Ci0JLy8gY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJvdW5kcnlDYXNlczIoKSB7Ci0JLy8gU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gc3BlY2lhbFBvc2l0aW9uVXBkYXRlKGZTdGFydCwgZlN0YXJ0ICsKLQkvLyBmTGVuZ3RoVG9SZXBsYWNlIC0gMSk7Ci0JLy8gaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JLy8gcmVzdWx0ID0gY2hlY2tJbnNpZGVCcmFjZSgpOwotCS8vIH0KLQkvLyByZXR1cm4gcmVzdWx0OwotCS8vIH0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblN5bnRheCgpIHsKLQkJaW50IGNoZWNrU3RhcnQgPSBmU3RhcnQ7Ci0JCWludCBjaGVja0VuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoY2hlY2tFbmQpOwotCQlpZiAoZW5kUmVnaW9uICE9IG51bGwpIHsKLQkJCWNoZWNrRW5kID0gZW5kUmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQl9Ci0KLQkJUmVwYXJzZVJhbmdlIHJhbmdlID0gbmV3IFJlcGFyc2VSYW5nZShjaGVja1N0YXJ0LCBjaGVja0VuZCk7Ci0KLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yRGVsaW1pdGVyKHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldEVuZCgpKSk7Ci0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclVua25vd25SZWdpb24ocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JRdW90ZXMocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yQ29tbWVudHMocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yQnJhY2VzKHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldEVuZCgpKSk7Ci0KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0OwotCi0JCXJlc3VsdCA9IGNoZWNrSW5zaWRlQnJhY2UocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcmVwYXJzZShyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yVW5rbm93blJlZ2lvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaW50IG5ld1N0YXJ0ID0gc3RhcnQ7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0IC0gMSk7Ci0JCWlmIChpdGVyYXRvci5oYXNQcmV2KCkpIHsKLQkJCWl0ZXJhdG9yLnByZXYoKTsgLy8gc2tpcCBteXNlbGYKLQkJfQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzUHJldigpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyYXRvci5wcmV2KCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJCW5ld1N0YXJ0ID0gaXRlcmF0b3IuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0YXJ0ICE9IG5ld1N0YXJ0KSB7Ci0JCQlyZXR1cm4gbmV3IFJlcGFyc2VSYW5nZShuZXdTdGFydCwgZW5kKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yRGVsaW1pdGVyKGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAoZGlydHlTdGFydCAhPSBudWxsICYmIGRpcnR5U3RhcnQuZ2V0U3RhcnQoKSA8IHN0YXJ0KSB7Ci0JCQlzdGFydCA9IGRpcnR5U3RhcnQuZ2V0U3RhcnQoKTsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY1JlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQlpZiAoZG9jUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChkb2NSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldlJlZ2lvbiA9IGRvY1JlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgUmVwYXJzZVJhbmdlKHByZXZSZWdpb24uZ2V0U3RhcnQoKSwgZW5kKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yUXVvdGVzKGludCBzdGFydCwgaW50IGVuZCkgewotCQlSZXBhcnNlUmFuZ2UgcmFuZ2UgPSBuZXcgUmVwYXJzZVJhbmdlKCk7Ci0KLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAnXCInLCAnXCInKSk7Ci0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgJ1wnJywgJ1wnJykpOwotCi0JCXJldHVybiAocmFuZ2UuaXNWYWxpZCgpKSA/IHJhbmdlIDogbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFJlcGFyc2VSYW5nZSBnZXRVcGRhdGVSYW5nZUZvckNvbW1lbnRzKGludCBzdGFydCwgaW50IGVuZCkgewotCQlSZXBhcnNlUmFuZ2UgcmFuZ2UgPSBuZXcgUmVwYXJzZVJhbmdlKCk7Ci0KLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiLyoiLCAiKi8iKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgIjwlIiwgIiU+IikpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiAocmFuZ2UuaXNWYWxpZCgpKSA/IHJhbmdlIDogbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFJlcGFyc2VSYW5nZSBnZXRVcGRhdGVSYW5nZUZvckJyYWNlcyhpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJUmVwYXJzZVJhbmdlIHJhbmdlID0gbmV3IFJlcGFyc2VSYW5nZSgpOwotCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgJ1snLCAnXScpKTsKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAnKCcsICcpJykpOwotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICd7JywgJ30nKSk7Ci0KLQkJcmV0dXJuIChyYW5nZS5pc1ZhbGlkKCkpID8gcmFuZ2UgOiBudWxsOwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tJbnNpZGVCcmFjZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlib29sZWFuIGJEZWNsYXJhdGlvbiA9IGZhbHNlOwotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25UeXBlKHR5cGUpIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCWJEZWNsYXJhdGlvbiA9IHRydWU7Ci0JCX0KLQkJaWYgKCFiRGVjbGFyYXRpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldlJlZ2lvbiA9IENTU1V0aWwuZmluZFByZXZpb3VzU2lnbmlmaWNhbnROb2RlKHJlZ2lvbik7Ci0JCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IHByZXZSZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25UeXBlKHR5cGUpIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCQliRGVjbGFyYXRpb24gPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIWJEZWNsYXJhdGlvbikgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0UmVnaW9uID0gQ1NTVXRpbC5maW5kTmV4dFNpZ25pZmljYW50Tm9kZShyZWdpb24pOwotCQkJaWYgKG5leHRSZWdpb24gIT0gbnVsbCkgewotCQkJCXR5cGUgPSBuZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc0RlY2xhcmF0aW9uVHlwZSh0eXBlKSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCQkJYkRlY2xhcmF0aW9uID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYkRlY2xhcmF0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uID0gZmluZFJ1bGVTdGFydChyZWdpb24pOwotCQkJaWYgKHN0YXJ0UmVnaW9uICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZW5kKTsKLQkJCQlpZiAoZW5kUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gcmVwYXJzZShzdGFydFJlZ2lvbiwgZW5kUmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZFJ1bGVTdGFydChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gc3RhcnRSZWdpb247Ci0JCS8vIGZpbmQgJ3snCi0JCXdoaWxlIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCXJlZ2lvbiA9IHJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQl9Ci0JCS8vIGlmIChyZWdpb24gPT0gc3RhcnRSZWdpb24pIHsKLQkJLy8gcmV0dXJuIG51bGw7Ci0JCS8vIH0KLQkJLy8gZWxzZQotCQlpZiAocmVnaW9uICE9IG51bGwpIHsgLy8gJ3snIGlzIGZvdW5kCi0JCQlyZWdpb24gPSByZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChpc0xlYWRpbmdEZWNsYXJhdGlvblR5cGUocmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xlYWRpbmdEZWNsYXJhdGlvblR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSB8fCBDU1NSZWdpb25VdGlsLmlzU2VsZWN0b3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQkvLyBwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkvLyBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQm91bmRyeUNhc2VzKCkgewotCS8vIHJldHVybiBzcGVjaWFsUG9zaXRpb25VcGRhdGUoZlN0YXJ0LCBmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlIC0gMSk7Ci0JLy8gfQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yUGFpcihpbnQgc3RhcnQsIGludCBlbmQsIFN0cmluZyBvcGVuZXIsIFN0cmluZyBjbG9zZXIpIHsKLQkJU3RyaW5nQnVmZmVyIGRlbGV0aW9uQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdCdWZmZXIgaW5zZXJ0aW9uQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgcXVvdGVMZW4gPSBNYXRoLm1heChvcGVuZXIubGVuZ3RoKCksIGNsb3Nlci5sZW5ndGgoKSk7Ci0JCWlmICgxIDwgcXVvdGVMZW4pIHsKLQkJCS8qKgotCQkJICogZXgpIG9wZW5lciA9ICJBQkMiLCBjbG9zZXIgPSAiWFlaIiBtb2RlbDogQUJDREVGLi4uLi4uLlVWV1hZWgotCQkJICogZGVsZXRpb246IENERUYuLi4uLi4uVVZXWCBwcmUvcG9zdDogQUIgLyBZWgotCQkJICovCi0JCQlpbnQgYWRkU3RhcnQgPSBzdGFydCAtIChxdW90ZUxlbiAtIDEpOwotCQkJaWYgKDAgPD0gYWRkU3RhcnQpIHsKLQkJCQlTdHJpbmcgYWRkU3RyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXQoYWRkU3RhcnQsIHF1b3RlTGVuIC0gMSk7Ci0JCQkJZGVsZXRpb25CdWYuYXBwZW5kKGFkZFN0cik7Ci0JCQkJaW5zZXJ0aW9uQnVmLmFwcGVuZChhZGRTdHIpOwotCQkJfQotCQkJZGVsZXRpb25CdWYuYXBwZW5kKGZEZWxldGVkVGV4dCk7Ci0JCQlpbnNlcnRpb25CdWYuYXBwZW5kKGZDaGFuZ2VzKTsKLQkJCWlmIChlbmQgKyAocXVvdGVMZW4gLSAxKSA8IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlTdHJpbmcgYWRkU3RyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXQoZW5kICsgMSwgcXVvdGVMZW4gLSAxKTsKLQkJCQlkZWxldGlvbkJ1Zi5hcHBlbmQoYWRkU3RyKTsKLQkJCQlpbnNlcnRpb25CdWYuYXBwZW5kKGFkZFN0cik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkZWxldGlvbkJ1Zi5hcHBlbmQoZkRlbGV0ZWRUZXh0KTsKLQkJCWluc2VydGlvbkJ1Zi5hcHBlbmQoZkNoYW5nZXMpOwotCQl9Ci0JCVN0cmluZyBkZWxldGlvbiA9IGRlbGV0aW9uQnVmLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBpbnNlcnRpb24gPSBpbnNlcnRpb25CdWYudG9TdHJpbmcoKTsKLQotCQlpbnQgcmFuZ2VTdGFydCA9IHN0YXJ0OwotCQlpbnQgcmFuZ2VFbmQgPSBlbmQ7Ci0KLQkJaWYgKDAgPD0gZGVsZXRpb24uaW5kZXhPZihvcGVuZXIpIHx8IDAgPD0gZGVsZXRpb24uaW5kZXhPZihjbG9zZXIpIHx8IDAgPD0gaW5zZXJ0aW9uLmluZGV4T2Yob3BlbmVyKSB8fCAwIDw9IGluc2VydGlvbi5pbmRleE9mKGNsb3NlcikpIHsKLQkJCWludCBzLCBlOwotCQkJdHJ5IHsKLQkJCQlpZiAoc3RhcnQgPD0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJCQlJUmVnaW9uIHN0YXJ0UmVnaW9uID0gZ2V0RmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIoKS5maW5kKHN0YXJ0IC0gMSwgb3BlbmVyLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCWlmIChzdGFydFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlzID0gc3RhcnRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlzID0gLTE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXMgPSAtMTsKLQkJCQl9Ci0JCQkJaWYgKGVuZCA8IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKSB7Ci0JCQkJCUlSZWdpb24gZW5kUmVnaW9uID0gZ2V0RmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIoKS5maW5kKGVuZCArIDEsIGNsb3NlciwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCWlmIChlbmRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJZSA9IGVuZFJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWUgPSAtMTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZSA9IC0xOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJaWYgKDAgPD0gcykgewotCQkJCXJhbmdlU3RhcnQgPSBNYXRoLm1pbihyYW5nZVN0YXJ0LCBzKTsKLQkJCX0KLQkJCWlmICgwIDw9IGUpIHsKLQkJCQlyYW5nZUVuZCA9IE1hdGgubWF4KHJhbmdlRW5kLCBlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChyYW5nZVN0YXJ0IDwgc3RhcnQgfHwgZW5kIDwgcmFuZ2VFbmQpIHsKLQkJCXJldHVybiBuZXcgUmVwYXJzZVJhbmdlKHJhbmdlU3RhcnQsIHJhbmdlRW5kKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmluZENoYXIoY2hhciBjLCBpbnQgc3RhcnQsIGJvb2xlYW4gZm9yd2FyZCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaW50IHN0b3AgPSBmb3J3YXJkID8gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA6IDA7Ci0JCWlmIChmb3J3YXJkKSB7Ci0JCQlmb3IgKDsgc3RhcnQgPCBzdG9wOyBzdGFydCsrKSB7Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Q2hhcihzdGFydCkgPT0gYykKLQkJCQkJcmV0dXJuIHN0YXJ0OwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZm9yICg7IHN0YXJ0ID49IHN0b3A7IHN0YXJ0LS0pIHsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDaGFyKHN0YXJ0KSA9PSBjKQotCQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCVJlcGFyc2VSYW5nZSBnZXRVcGRhdGVSYW5nZUZvclBhaXIoaW50IHN0YXJ0LCBpbnQgZW5kLCBjaGFyIG9wZW5lciwgY2hhciBjbG9zZXIpIHsKLQkJU3RyaW5nQnVmZmVyIGRlbGV0aW9uQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdCdWZmZXIgaW5zZXJ0aW9uQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlkZWxldGlvbkJ1Zi5hcHBlbmQoZkRlbGV0ZWRUZXh0KTsKLQkJaW5zZXJ0aW9uQnVmLmFwcGVuZChmQ2hhbmdlcyk7Ci0JCVN0cmluZyBkZWxldGlvbiA9IGRlbGV0aW9uQnVmLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBpbnNlcnRpb24gPSBpbnNlcnRpb25CdWYudG9TdHJpbmcoKTsKLQotCQlpbnQgcmFuZ2VTdGFydCA9IHN0YXJ0OwotCQlpbnQgcmFuZ2VFbmQgPSBlbmQ7Ci0KLQkJaWYgKDAgPD0gZGVsZXRpb24uaW5kZXhPZihvcGVuZXIpIHx8IDAgPD0gZGVsZXRpb24uaW5kZXhPZihjbG9zZXIpIHx8IDAgPD0gaW5zZXJ0aW9uLmluZGV4T2Yob3BlbmVyKSB8fCAwIDw9IGluc2VydGlvbi5pbmRleE9mKGNsb3NlcikpIHsKLQkJCWludCBzID0gLTEsIGUgPSAtMTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHN0YXJ0IDw9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJcyA9IGZpbmRDaGFyKG9wZW5lciwgc3RhcnQgLSAxLCBmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChlbmQgPCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpIC0gMSkgewotCQkJCQllID0gZmluZENoYXIoY2xvc2VyLCBlbmQgKyAxLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmICgwIDw9IHMpIHsKLQkJCQlyYW5nZVN0YXJ0ID0gTWF0aC5taW4ocmFuZ2VTdGFydCwgcyk7Ci0JCQl9Ci0JCQlpZiAoMCA8PSBlKSB7Ci0JCQkJcmFuZ2VFbmQgPSBNYXRoLm1heChyYW5nZUVuZCwgZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmFuZ2VTdGFydCA8IHN0YXJ0IHx8IGVuZCA8IHJhbmdlRW5kKSB7Ci0JCQlyZXR1cm4gbmV3IFJlcGFyc2VSYW5nZShyYW5nZVN0YXJ0LCByYW5nZUVuZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGM4M2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1NTX0dFTkVSSUMgPSAxMDExMDk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2UgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgQ1NTX0dFTkVSSUMgOgotCQkJCWluc3RhbmNlID0gbmV3IEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFdhbGtlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFdhbGtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2NmYzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIgewotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgPSBudWxsOwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZlN0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JU3RyaW5nIGZPcmlnaW5hbENoYW5nZXMgPSBudWxsOwotCWludCBmT3JpZ2luYWxPZmZzZXQgPSAwOwotCWludCBmT3JpZ2luYWxMZW5ndGhUb1JlcGxhY2UgPSAwOwotCWludCBmTGVuZ3RoRGlmZmVyZW5jZSA9IDA7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyKCkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIoU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaW5pdGlhbGl6ZShldmVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBPbGQgTm9kZXM6IC0tW08xXS0tW08yXS0tW08zXS0tLSA6IC8gXCBDdXJyZW50IE5vZGVzOgotCSAqIC0tLVtDMV0tLS0tLVtDMl0tLS0tLVtDM10tLS0tLVtDNF0tLS0KLQkgKiAKLQkgKiBJbnB1dDogTzEgLT4gT3V0cHV0OiBPMiBJbnB1dDogTzIgLT4gT3V0cHV0OiBPMyBJbnB1dDogTzMgLT4gT3V0cHV0OiBDNAotCSAqIElucHV0OiBDbiAtPiBPdXRwdXQ6IENuKzEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCW5leHROb2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCQlpZiAobmV4dE5vZGUgPT0gbnVsbCkgewotCQkJCWlmIChpc09sZE5vZGUobm9kZSkpIHsKLQkJCQkJLy8gdGhpcyBtYXkgYmUgdGhlIGVuZCBvZiBvbGQgZmxhdG5vZGVzCi0JCQkJCWludCBuZXdTdGFydCA9IG5vZGUuZ2V0RW5kKCkgKyBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCQkJbmV4dE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG5ld1N0YXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5leHROb2RlOwotCX0KLQotCS8qKgotCSAqIE9sZCBOb2RlczogLS1bTzFdLS1bTzJdLS1bTzNdLS0tIDogLyBcIEN1cnJlbnQgTm9kZXM6Ci0JICogLS0tW0MxXS0tLS0tW0MyXS0tLS0tW0MzXS0tLS0tW0M0XS0tLQotCSAqIAotCSAqIElucHV0OiBPKiAtPiBPdXRwdXQ6IEM0IElucHV0OiBDbiAtPiBPdXRwdXQ6IENuKzEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0Tm9kZUluQ3VycmVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSA9IG51bGw7Ci0JCWlmIChpc09sZE5vZGUobm9kZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkRW5kTm9kZSA9IGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0Lml0ZW0oZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCWludCBuZXdTdGFydCA9IG9sZEVuZE5vZGUuZ2V0RW5kKCkgKyBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCW5leHROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuZXdTdGFydCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQluZXh0Tm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBuZXh0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBPbGQgTm9kZXM6IC0tW08xXS0tW08yXS0tW08zXS0tLSA6IC8gXCBDdXJyZW50IE5vZGVzOgotCSAqIC0tLVtDMV0tLS0tLVtDMl0tLS0tLVtDM10tLS0tLVtDNF0tLS0KLQkgKiAKLQkgKiBJbnB1dDogTzEgLT4gT3V0cHV0OiBDMSBJbnB1dDogTzIgLT4gT3V0cHV0OiBPMSBJbnB1dDogTzMgLT4gT3V0cHV0OiBPMgotCSAqIElucHV0OiBDbiAtPiBPdXRwdXQ6IENuLTEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXByZXZOb2RlID0gbm9kZS5nZXRQcmV2aW91cygpOwotCQkJaWYgKHByZXZOb2RlID09IG51bGwpIHsKLQkJCQlpZiAoaXNPbGROb2RlKG5vZGUpKSB7Ci0JCQkJCS8vIHRoaXMgbWF5IGJlIHRoZSBzdGFydCBvZiBvbGQgZmxhdG5vZGVzCi0JCQkJCWludCBuZXdFbmQgPSBub2RlLmdldFN0YXJ0KCkgLSAxOwotCQkJCQlwcmV2Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV3RW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZXZOb2RlOwotCX0KLQotCS8qKgotCSAqIE9sZCBOb2RlczogLS1bTzFdLS1bTzJdLS1bTzNdLS0tIDogLyBcIEN1cnJlbnQgTm9kZXM6Ci0JICogLS0tW0MxXS0tLS0tW0MyXS0tLS0tW0MzXS0tLS0tW0M0XS0tLQotCSAqIAotCSAqIElucHV0OiBPKiAtPiBPdXRwdXQ6IEMxIElucHV0OiBDbiAtPiBPdXRwdXQ6IENuLTEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2Tm9kZUluQ3VycmVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IG51bGw7Ci0JCWlmIChpc09sZE5vZGUobm9kZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RhcnROb2RlID0gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuaXRlbSgwKTsKLQkJCWludCBuZXdFbmQgPSBvbGRTdGFydE5vZGUuZ2V0U3RhcnQoKSAtIDE7Ci0JCQlwcmV2Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV3RW5kKTsKLQkJfQotCQllbHNlIGlmIChub2RlICE9IG51bGwpIHsKLQkJCXByZXZOb2RlID0gbm9kZS5nZXRQcmV2aW91cygpOwotCQl9Ci0JCXJldHVybiBwcmV2Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJZk9yaWdpbmFsQ2hhbmdlcyA9IGV2ZW50LmdldFRleHQoKTsKLQkJZk9yaWdpbmFsT2Zmc2V0ID0gZXZlbnQuZ2V0T2Zmc2V0KCk7Ci0JCWZPcmlnaW5hbExlbmd0aFRvUmVwbGFjZSA9IGV2ZW50LmdldExlbmd0aCgpOwotCQlmTGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGZPcmlnaW5hbENoYW5nZXMsIGZPcmlnaW5hbExlbmd0aFRvUmVwbGFjZSk7Ci0KLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHsKLQkJCWZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0ID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkgZXZlbnQpLmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJfQotCQllbHNlIHsKLQkJCWZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT2xkTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJYm9vbGVhbiBiT2xkID0gZmFsc2U7Ci0JCWlmIChmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCAhPSBudWxsKSB7Ci0JCQlFbnVtZXJhdGlvbiBlID0gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuZWxlbWVudHMoKTsKLQkJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJaWYgKGUubmV4dEVsZW1lbnQoKSA9PSBub2RlKSB7Ci0JCQkJCWJPbGQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJPbGQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OGFjMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQuSUNTU1BhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciB7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBsZWdhbFR5cGVzID0gbmV3IFN0cmluZ1tde0lDU1NQYXJ0aXRpb25zLlNUWUxFLCBJQ1NTUGFydGl0aW9ucy5DT01NRU5ULCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT059OwotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIElDU1NQYXJ0aXRpb25zLlNUWUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJcmV0dXJuIGxlZ2FsVHlwZXM7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+VGhpcyBwYXJ0aXRpb25lciBicmVha3MgQ1NTIGludG8gb25seSB0d28gdHlwZXMgb2YgcGFydGl0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHJlZ2lvbiB0eXBlOjxiciAvPgotCSAqIDxjb2RlPkNPTU1FTlQ8L2NvZGU+PGJyIC8+Ci0JICogPGNvZGU+U1RZTEU8L2NvZGU+PC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciNnZXRQYXJ0aXRpb25UeXBlKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uLCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlTdHJpbmcgcGFydGl0aW9uVHlwZTsKLQkJCi0JCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCi0JCWlmKHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCXBhcnRpdGlvblR5cGUgPSBJQ1NTUGFydGl0aW9ucy5DT01NRU5UOwotCQl9IGVsc2UgewotCQkJcGFydGl0aW9uVHlwZSA9IHN1cGVyLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCQl9Ci0JCQotCQlyZXR1cm4gcGFydGl0aW9uVHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQWJzdHJhY3RDc3NUcmF2ZXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9BYnN0cmFjdENzc1RyYXZlcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjExYjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9BYnN0cmFjdENzc1RyYXZlcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgc2hvcnQgVFJBVl9DT05UID0gMDsKLQlwdWJsaWMgc3RhdGljIHNob3J0IFRSQVZfUFJVTkUgPSAxOwotCXB1YmxpYyBzdGF0aWMgc2hvcnQgVFJBVl9TVE9QID0gMjsKLQlwcm90ZWN0ZWQgamF2YS51dGlsLlN0YWNrIHRyYXZTdGFjazsKLQlwcml2YXRlIGJvb2xlYW4gZlRyYXZlcnNlSW1wb3J0ZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZlRyYXZlcnNlSW1wb3J0Rmlyc3QgPSBmYWxzZTsKLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3IgdHJhdmVyc2VkU2hlZXRzOwotCi0JLyoqCi0JICogQ3NzUHJvcENNTm9kZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdENzc1RyYXZlcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NNb2RlbAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFwcGx5KElDU1NNb2RlbCBtb2RlbCkgewotCQlhcHBseShtb2RlbC5nZXREb2N1bWVudCgpKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBhcHBseShJQ1NTTm9kZSByb290KSB7Ci0JCXRyYXZTdGFjayA9IG5ldyBTdGFjaygpOwotCQlpZiAoZlRyYXZlcnNlSW1wb3J0ZWQpIHsKLQkJCXRyYXZlcnNlZFNoZWV0cyA9IG5ldyBWZWN0b3IoKTsKLQkJCWlmIChyb290ICE9IG51bGwgJiYgcm9vdC5nZXRPd25lckRvY3VtZW50KCkgIT0gbnVsbCAmJiByb290LmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSkgewotCQkJCXRyYXZlcnNlZFNoZWV0cy5hZGQocm9vdC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gZmlyc3QgY2FsbCBiZWdpbigpCi0JCWJlZ2luKHJvb3QpOwotCi0JCS8vIHRyYXZlcnNlCi0JCXRyYXZlcnNlKHJvb3QpOwotCi0JCS8vIGxhc3QgY2FsbCBlbmQoKQotCQllbmQocm9vdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihJQ1NTTm9kZSBub2RlKSB7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBlbmQoSUNTU05vZGUgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzVHJhdmVyc2VJbXBvcnRlZCgpIHsKLQkJcmV0dXJuIGZUcmF2ZXJzZUltcG9ydGVkOwotCX0KLQotCi0JcHJvdGVjdGVkIHNob3J0IHBvc3ROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChzaG9ydCkgMDsKLQl9Ci0KLQotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChzaG9ydCkgMDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VHJhdmVyc2VJbXBvcnRlZAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFRyYXZlcnNlSW1wb3J0ZWQoYm9vbGVhbiBuZXdUcmF2ZXJzZUltcG9ydGVkKSB7Ci0JCWZUcmF2ZXJzZUltcG9ydGVkID0gbmV3VHJhdmVyc2VJbXBvcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VHJhdmVyc2VJbXBvcnRGaXJzdAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFRyYXZlcnNlSW1wb3J0Rmlyc3QoYm9vbGVhbiBuZXdUcmF2ZXJzZUltcG9ydEZpcnN0KSB7Ci0JCWZUcmF2ZXJzZUltcG9ydEZpcnN0ID0gbmV3VHJhdmVyc2VJbXBvcnRGaXJzdDsKLQl9Ci0KLQotCXByaXZhdGUgZmluYWwgc2hvcnQgdHJhdmVyc2UoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQotCQl0cmF2U3RhY2sucHVzaChub2RlKTsKLQotCQkvLyBwcmUtYWN0aW9uCi0JCXNob3J0IHJldCA9IHByZU5vZGUobm9kZSk7Ci0KLQkJaWYgKHJldCA9PSBUUkFWX0NPTlQpIHsKLQkJCWlmIChmVHJhdmVyc2VJbXBvcnRlZCAmJiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkpIHsKLQkJCQlJQ1NTSW1wb3J0UnVsZSBydWxlID0gKElDU1NJbXBvcnRSdWxlKSBub2RlOwotCQkJCS8vIHRyYXZlcnNlIGV4dGVybmFsIHN0eWxlLXNoZWV0Ci0JCQkJSUNTU1N0eWxlU2hlZXQgc2hlZXQgPSAoSUNTU1N0eWxlU2hlZXQpIHJ1bGUuZ2V0U3R5bGVTaGVldCgpOwotCQkJCWlmIChzaGVldCAhPSBudWxsICYmICF0cmF2ZXJzZWRTaGVldHMuY29udGFpbnMoc2hlZXQpKSB7IC8vIHByZXZlbnQKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsb29wCi0JCQkJCXRyYXZlcnNlZFNoZWV0cy5hZGQoc2hlZXQpOwotCQkJCQlzaG9ydCByZXRFeHQgPSB0cmF2ZXJzZShzaGVldCk7Ci0JCQkJCWlmIChyZXRFeHQgPT0gVFJBVl9TVE9QKSB7Ci0JCQkJCQl0cmF2U3RhY2sucG9wKCk7Ci0JCQkJCQlyZXR1cm4gcmV0RXh0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjb2xsZWN0IGNoaWxkcmVuCi0JCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKGZUcmF2ZXJzZUltcG9ydEZpcnN0KSB7Ci0JCQkJQXJyYXlMaXN0IG90aGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkKLQkJCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJCWVsc2UKLQkJCQkJCW90aGVycy5hZGQoY2hpbGQpOwotCQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJCWNoaWxkcmVuLmFkZEFsbChvdGhlcnMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gdHJhdmVyc2UgY2hpbGRyZW4KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQljaGlsZCA9IChJQ1NTTm9kZSkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJCXNob3J0IHJldENoaWxkID0gdHJhdmVyc2UoY2hpbGQpOwotCQkJCWlmIChyZXRDaGlsZCA9PSBUUkFWX1NUT1ApIHsKLQkJCQkJdHJhdlN0YWNrLnBvcCgpOwotCQkJCQlyZXR1cm4gcmV0Q2hpbGQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJldCA9PSBUUkFWX1NUT1ApIHsKLQkJCXRyYXZTdGFjay5wb3AoKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQkvLyBwb3N0LWFjdGlvbgotCQlyZXQgPSBwb3N0Tm9kZShub2RlKTsKLQotCQl0cmF2U3RhY2sucG9wKCk7Ci0JCXJldHVybiAocmV0ID09IFRSQVZfUFJVTkUpID8gVFJBVl9DT05UIDogcmV0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NDbGFzc1RyYXZlcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU0NsYXNzVHJhdmVyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YTM1M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU0NsYXNzVHJhdmVyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9ySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NpbXBsZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ2xhc3NUcmF2ZXJzZXIgZXh0ZW5kcyBBYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlBcnJheUxpc3QgZkNsYXNzTmFtZXM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTQ2xhc3NUcmF2ZXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENsYXNzTmFtZXMoSUNTU1N0eWxlUnVsZSBydWxlKSB7Ci0JCUlDU1NTZWxlY3Rvckxpc3Qgc2VsZWN0b3JMaXN0ID0gcnVsZS5nZXRTZWxlY3RvcnMoKTsKLQkJSXRlcmF0b3IgaVNlbGVjdG9yID0gc2VsZWN0b3JMaXN0LmdldEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpU2VsZWN0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJQ1NTU2VsZWN0b3Igc2VsZWN0b3IgPSAoSUNTU1NlbGVjdG9yKSBpU2VsZWN0b3IubmV4dCgpOwotCQkJSXRlcmF0b3IgaUl0ZW0gPSBzZWxlY3Rvci5nZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGlJdGVtLmhhc05leHQoKSkgewotCQkJCUlDU1NTZWxlY3Rvckl0ZW0gaXRlbSA9IChJQ1NTU2VsZWN0b3JJdGVtKSBpSXRlbS5uZXh0KCk7Ci0JCQkJaWYgKGl0ZW0uZ2V0SXRlbVR5cGUoKSA9PSBJQ1NTU2VsZWN0b3JJdGVtLlNJTVBMRSkgewotCQkJCQlJQ1NTU2ltcGxlU2VsZWN0b3Igc2VsID0gKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbTsKLQkJCQkJaW50IG5DbGFzc2VzID0gc2VsLmdldE51bU9mQ2xhc3NlcygpOwotCQkJCQlmb3IgKGludCBpQ2xhc3MgPSAwOyBpQ2xhc3MgPCBuQ2xhc3NlczsgaUNsYXNzKyspIHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBzZWwuZ2V0Q2xhc3MoaUNsYXNzKTsKLQkJCQkJCWlmICghZkNsYXNzTmFtZXMuY29udGFpbnMoY2xhc3NOYW1lKSkKLQkJCQkJCQlmQ2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJlZ2luKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKGZDbGFzc05hbWVzID09IG51bGwpCi0JCQlmQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmQoSUNTU05vZGUgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENsYXNzTmFtZXMoKSB7Ci0JCXJldHVybiAoZkNsYXNzTmFtZXMgIT0gbnVsbCkgPyBmQ2xhc3NOYW1lcyA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHBvc3ROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIFRSQVZfQ09OVDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCXNob3J0IHJldDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQlhZGRDbGFzc05hbWVzKChJQ1NTU3R5bGVSdWxlKSBub2RlKTsKLQkJCXJldCA9IFRSQVZfUFJVTkU7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0IHx8IG5vZGUgaW5zdGFuY2VvZiBJQ1NTTWVkaWFSdWxlIHx8IG5vZGUgaW5zdGFuY2VvZiBJQ1NTSW1wb3J0UnVsZSkgewotCQkJcmV0ID0gVFJBVl9DT05UOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0ID0gVFJBVl9QUlVORTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NMaW5rQ29udmVydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTTGlua0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzdkY2QzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NMaW5rQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTTGlua0NvbnZlcnRlciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0JFR0lOID0gInVybCgiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkQgPSAiKSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEX1FVT1RFID0gIlwiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTX1FVT1RFID0gIlwnIjsgLy8kTk9OLU5MUy0xJAotCi0JSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTTGlua0NvbnZlcnRlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWJhc2VNb2RlbCA9IG1vZGVsOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwgJiYgKChJQ1NTTW9kZWwpIG1vZGVsKS5nZXRTdHlsZVNoZWV0VHlwZSgpICE9IElDU1NNb2RlbC5FWFRFUk5BTCkgewotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgKChJQ1NTTW9kZWwpIG1vZGVsKS5nZXRPd25lckRPTU5vZGUoKTsKLQkJCWJhc2VNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEZ1bmMoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICghdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChVUkxfQkVHSU4pKSB7Ci0JCQkvLyBwYV9UT0RPIGNzcyBwcmVmCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQl2YWx1ZSA9IENTU1V0aWwuc3RyaXBRdW90ZXModmFsdWUpOwotCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHZhbHVlLCBxdW90ZSk7Ci0JCQlTdHJpbmcgc3RyID0gVVJMX0JFR0lOOwotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJc3RyID0gc3RyLnRvVXBwZXJDYXNlKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihzdHIpOwotCQkJYnVmLmFwcGVuZChxdW90ZSk7Ci0JCQlidWYuYXBwZW5kKHZhbHVlKTsKLQkJCWJ1Zi5hcHBlbmQocXVvdGUpOwotCQkJYnVmLmFwcGVuZChVUkxfRU5EKTsKLQkJCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJlZ2luKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKGJhc2VNb2RlbCA9PSBudWxsKSB7Ci0JCQliYXNlTW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJaWYgKGJhc2VNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCAmJiAoKElDU1NNb2RlbCkgYmFzZU1vZGVsKS5nZXRTdHlsZVNoZWV0VHlwZSgpICE9IElDU1NNb2RlbC5FWFRFUk5BTCkgewotCQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpICgoSUNTU01vZGVsKSBiYXNlTW9kZWwpLmdldE93bmVyRE9NTm9kZSgpOwotCQkJCWJhc2VNb2RlbCA9IHhtbE5vZGUuZ2V0TW9kZWwoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVcmwoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXNvdXJjZSA9IHNvdXJjZS50cmltKCkudG9Mb3dlckNhc2UoKTsKLQkJcmV0dXJuIHNvdXJjZS5zdGFydHNXaXRoKFVSTF9CRUdJTik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUpIHsKLQkJCXRvQWJzb2x1dGUoKENTU1ZhbHVlKSBub2RlKTsKLQkJfSBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKSB7Ci0JCQlJQ1NTSW1wb3J0UnVsZSBpUnVsZSA9IChJQ1NTSW1wb3J0UnVsZSkgbm9kZTsKLQkJCWlSdWxlLnNldEhyZWYodG9BYnNvbHV0ZShhZGRGdW5jKGlSdWxlLmdldEhyZWYoKSkpKTsKLQkJfQotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUZ1bmMoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIEVNUFRZOwotCQlTdHJpbmcgZmllbGQgPSB2YWx1ZS50cmltKCk7Ci0JCS8vIGZpcnN0IDogdGVhciAidXJsKC4uLi4pIgotCQlpZiAoZmllbGQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFVSTF9CRUdJTikpIHsKLQkJCWludCB1cmwgPSBmaWVsZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoVVJMX0JFR0lOKTsKLQkJCWludCBlbmRQYXJlbnRoZXNpcyA9IGZpZWxkLmxhc3RJbmRleE9mKFVSTF9FTkQpOwotCQkJaWYgKGVuZFBhcmVudGhlc2lzID4gdXJsKSB7Ci0JCQkJZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcodXJsICsgNCwgZW5kUGFyZW50aGVzaXMpOwotCQkJfSBlbHNlCi0JCQkJZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcodXJsICsgNCk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcEZ1bmMoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIEVNUFRZOwotCQkvLyBmaXJzdCA6IHRlYXIgInVybCguLi4uKSIKLQkJU3RyaW5nIGZpZWxkID0gcmVtb3ZlRnVuYyh2YWx1ZSk7Ci0JCS8vIHNlY29uZCA6IHRlYXIgcXVvdGF0aW9ucwotCQlpZiAoZmllbGQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKERfUVVPVEUpKSB7Ci0JCQlpbnQgcXVvdGUgPSBmaWVsZC5pbmRleE9mKERfUVVPVEUpOwotCQkJaW50IGVuZCA9IGZpZWxkLmxhc3RJbmRleE9mKERfUVVPVEUpOwotCQkJaWYgKGVuZCA+IHF1b3RlKSB7Ci0JCQkJZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcocXVvdGUgKyAxLCBlbmQpOwotCQkJfSBlbHNlCi0JCQkJZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcocXVvdGUgKyAxKTsKLQkJfSBlbHNlIGlmIChmaWVsZC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoU19RVU9URSkpIHsKLQkJCWludCBxdW90ZSA9IGZpZWxkLmluZGV4T2YoU19RVU9URSk7Ci0JCQlpbnQgZW5kID0gZmllbGQubGFzdEluZGV4T2YoU19RVU9URSk7Ci0JCQlpZiAoZW5kID4gcXVvdGUpIHsKLQkJCQlmaWVsZCA9IGZpZWxkLnN1YnN0cmluZyhxdW90ZSArIDEsIGVuZCk7Ci0JCQl9IGVsc2UKLQkJCQlmaWVsZCA9IGZpZWxkLnN1YnN0cmluZyhxdW90ZSArIDEpOwotCQl9Ci0KLQkJcmV0dXJuIGZpZWxkLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvQWJzb2x1dGUoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoaXNVcmwoc291cmNlKSkgewotCQkJU3RyaW5nIHVybCA9IENTU1BhdGhTZXJ2aWNlLmdldEFic29sdXRlVVJMKGJhc2VNb2RlbCwgc3RyaXBGdW5jKHNvdXJjZSkpOwotCQkJcmV0dXJuICh1cmwgIT0gbnVsbCkgPyBhZGRGdW5jKHVybCkgOiAoVVJMX0JFR0lOICsgVVJMX0VORCk7Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB0b0Fic29sdXRlKENTU1ZhbHVlIG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCUlDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIG5vZGU7Ci0JCQlpZiAodmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkkpIHsKLQkJCQl2YWx1ZS5zZXRWYWx1ZShzdHJpcEZ1bmModG9BYnNvbHV0ZShVUkxfQkVHSU4gKyB2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpICsgVVJMX0VORCkpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1BhdGhTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTUGF0aFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzMjgxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTUGF0aFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTUGF0aFNlcnZpY2UgewotCi0JLy8gQ29uc3RhbnRzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVVUkxTQ0hFTUUgPSAiZmlsZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxDT0xPTiA9ICI6IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFVVJMUFJFRklYID0gRklMRVVSTFNDSEVNRSArIFVSTENPTE9OICsgIi8vIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTFNFUEFSQVRPUiA9ICIvIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWJzb2x1dGVVUkwoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYpIHsKLQkJU3RyaW5nIGFic0xpbmsgPSBVUkxNb2RlbFByb3ZpZGVyQ1NTLnJlc29sdmVVUkkoYmFzZU1vZGVsLCByZWYsIHRydWUpOwotCQlTdHJpbmcgdXJsID0gYWJzTGluazsKLQkJaWYgKGFic0xpbmsgIT0gbnVsbCkgeyAvLyBpZiBpdCBoYXMgbm90IHNjaGVtZSwgd2UgbXVzdCBhZGQgImZpbGUiCi0JCQkJCQkJCS8vIHNjaGVtZQotCQkJdHJ5IHsKLQkJCQluZXcgamF2YS5uZXQuVVJMKGFic0xpbmspOwotCQkJfQotCQkJY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGFic0xpbmspOwotCQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJCXVybCA9IHRvVVJMKHBhdGgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZQotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGUgbG9jYXRpb24yRmlsZShTdHJpbmcgbG9jYXRpb24pIHsKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCWlmIChmaWxlID09IG51bGwgJiYgcGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0JCQlmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgZmlsZSBVUkwgZm9yIHRoZSBwYXRoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b1VSTChJUGF0aCBwYXRoKSB7Ci0JCXBhdGggPSBuZXcgUGF0aChwYXRoLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsKLQkJaWYgKHBhdGguaXNVTkMoKSA9PSB0cnVlKSB7Ci0JCQkvLyBpdCdzIFVOQy4gcmV0dXJuIGZpbGU6Ly9ob3N0L2Zvby9iYXIvYmF6Lmh0bWwKLQkJCXJldHVybiBGSUxFVVJMU0NIRU1FICsgVVJMQ09MT04gKyBwYXRoLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIEZJTEVVUkxQUkVGSVggKyBVUkxTRVBBUkFUT1IgKyBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1NlbGVjdG9yTGlzdEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NTZWxlY3Rvckxpc3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzdiODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1NlbGVjdG9yTGlzdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTZWxlY3Rvckxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5IHsKLQlzdGF0aWMgc3luY2hyb25pemVkIHB1YmxpYyBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSUNTU1NlbGVjdG9yTGlzdCBjcmVhdGVTZWxlY3Rvckxpc3QoU3RyaW5nIHNlbGVjdG9yU3RyaW5nKSB7Ci0JCXJldHVybiBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChzZWxlY3RvclN0cmluZyk7Ci0JfQotCi0KLQlwcml2YXRlIENTU1NlbGVjdG9yTGlzdEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeSBmSW5zdGFuY2U7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjk4YTA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeSBleHRlbmRzIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5Q29udGV4dCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeSBmSW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKiBAcGFyYW0gZGVjbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlU3R5bGVEZWNsYXJhdGlvbihJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmIChkZWNsID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlDU1NTdHlsZURlY2xhcmF0aW9uIG5ld05vZGUgPSBjcmVhdGVTdHlsZURlY2xhcmF0aW9uKCk7Ci0KLQkJaWYgKG5ld05vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZk93bmVyRG9jdW1lbnQgPSBuZXdOb2RlOwotCQljbG9uZUNoaWxkTm9kZXMoZGVjbCwgbmV3Tm9kZSk7Ci0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1V0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzN2MxYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NSZWdpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTVXRpbCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVidWdPdXQoU3RyaW5nIHN0cikgewotCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiY3NzIHdhcm5pbmc6ICIgKyBzdHIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gcHVibGljIHN0YXRpYyBWZWN0b3IgZXh0cmFjdE1lZGlhQ29udGVudHMoVmVjdG9yIHJlZ2lvbnMpIHsKLQkvLyBWZWN0b3IgbWVkaWEgPSBuZXcgVmVjdG9yKCk7Ci0JLy8gaWYgKHJlZ2lvbnMgPT0gbnVsbCkgeyByZXR1cm4gbWVkaWE7IH0KLQkvLwotCS8vIGJvb2xlYW4gYlJlYWR5ID0gdHJ1ZTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGkgPSByZWdpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkvLyBJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24paS5uZXh0KCk7Ci0JLy8gaWYgKHJlZ2lvbiA9PSBudWxsKSB7IGNvbnRpbnVlOyB9Ci0JLy8gU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCS8vIGlmIChiUmVhZHkpIHsKLQkvLyBpZiAodHlwZSA9PSBJREVOVCkgewotCS8vIG1lZGlhLmFkZEVsZW1lbnQocmVnaW9uLmdldFRleHQoKSk7Ci0JLy8gYlJlYWR5ID0gZmFsc2U7Ci0JLy8gfQotCS8vIH0gZWxzZSB7Ci0JLy8gaWYgKHR5cGUgPT0gQ09NTUEpIHsKLQkvLyBiUmVhZHkgPSB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8gcmV0dXJuIG1lZGlhOwotCS8vIH0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0U3RyaW5nQ29udGVudHMoU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHN0cmlwUXVvdGVzKHRleHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RVcmlDb250ZW50cyhTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgY29udGVudHMgPSB0ZXh0LnRyaW0oKTsKLQkJaWYgKGNvbnRlbnRzLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgidXJsKCIpICYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGVudHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiKSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJLy8gc3RyaXAgInVybCgiLCAiKSIKLQkJCWNvbnRlbnRzID0gY29udGVudHMuc3Vic3RyaW5nKDQsIGNvbnRlbnRzLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJY29udGVudHMgPSBzdHJpcFF1b3Rlcyhjb250ZW50cyk7Ci0KLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kTmV4dFNpZ25pZmljYW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSkgewotCQlpZiAoc3RhcnROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IHN0YXJ0Tm9kZS5nZXROZXh0KCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShub2RlKTsKLQkJCWlmICh0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQykgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kTm9kZUJhY2t3YXJkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZE5vZGUsIFN0cmluZyB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZTsKLQkJZm9yIChub2RlID0gc3RhcnROb2RlOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFByZXZpb3VzKCkpIHsKLQkJCWlmIChub2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBlbmROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQlub2RlID0gbnVsbDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobm9kZSkgPT0gdHlwZSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kTm9kZUZvcndhcmQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kTm9kZSwgU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlOwotCQlmb3IgKG5vZGUgPSBzdGFydE5vZGU7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dCgpKSB7Ci0JCQlpZiAoZW5kTm9kZS5nZXRTdGFydE9mZnNldCgpIDwgbm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJbm9kZSA9IG51bGw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKG5vZGUpID09IHR5cGUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZFByZXZpb3VzU2lnbmlmaWNhbnROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlKSB7Ci0JCWlmIChzdGFydE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gc3RhcnROb2RlLmdldFByZXZpb3VzKCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShub2RlKTsKLQkJCWlmICh0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQykgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc1N0cmluZyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIG5hbWUgPSBvYmplY3QuZ2V0Q2xhc3MoKS50b1N0cmluZygpOwotCQkJaW50IGxhc3RQZXJpb2QgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcobGFzdFBlcmlvZCArIDEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOREVGSU5FRDsKLQkJfQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOREVGSU5FRDsKLQkJfQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJcmV0dXJuIHJlZ2lvbi5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGVuZ3RoRGlmZmVyZW5jZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdOb2RlcywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkTm9kZXMpIHsKLQkJaW50IG5ld0xlbiA9IGdldFRleHRMZW5ndGgobmV3Tm9kZXMpOwotCQlpbnQgb2xkTGVuID0gZ2V0VGV4dExlbmd0aChvbGROb2Rlcyk7Ci0JCXJldHVybiBuZXdMZW4gLSBvbGRMZW47Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVnaW9uVGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAocmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByZWdpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlidWYuYXBwZW5kKGZsYXROb2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VGV4dExlbmd0aChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBub2RlcykgewotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gbm9kZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCQlsZW5ndGggKz0gZmxhdE5vZGUuZ2V0VGV4dCgpLmxlbmd0aCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlbmd0aChDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJaWYgKHRva2VuID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRva2VuLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJZG91YmxlIG51bWJlciA9IERvdWJsZS5wYXJzZURvdWJsZSh0b2tlbi5pbWFnZSk7Ci0JCQlpZiAobnVtYmVyID09IDAuMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VsZWN0b3JUZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyB0eXBlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShyZWdpb24pOwotCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yQmVnZ2luaW5nVHlwZSh0eXBlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJLy8gU3RyaW5nIHRleHQgPSBmbGF0Tm9kZS5nZXRUZXh0KCk7Ci0JCQkvLyBpZiAodGV4dCAhPSBudWxsICYmIHRleHQuaW5kZXhPZignLicpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQkJLy8gfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwUXVvdGVzKFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRzID0gdGV4dC50cmltKCk7Ci0JCWlmICgyIDw9IGNvbnRlbnRzLmxlbmd0aCgpKSB7Ci0JCQljaGFyIGZpcnN0ID0gY29udGVudHMuY2hhckF0KDApOwotCQkJY2hhciBsYXN0ID0gY29udGVudHMuY2hhckF0KGNvbnRlbnRzLmxlbmd0aCgpIC0gMSk7Ci0JCQlpZiAoKGZpcnN0ID09ICdcIicgJiYgbGFzdCA9PSAnXCInKSB8fCAoZmlyc3QgPT0gJ1wnJyAmJiBsYXN0ID09ICdcJycpKSB7Ci0JCQkJY29udGVudHMgPSBjb250ZW50cy5zdWJzdHJpbmcoMSwgY29udGVudHMubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGV0ZWN0UXVvdGUoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlZmF1bHRRdW90ZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gZGVmYXVsdFF1b3RlOwotCQlmaW5hbCBTdHJpbmcgRF9RVU9URSA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFNfUVVPVEUgPSAiXCciOyAvLyROT04tTkxTLTEkCi0KLQkJaW50IGRJbmRleCA9IHNvdXJjZS5pbmRleE9mKERfUVVPVEUpOwotCQlpbnQgc0luZGV4ID0gc291cmNlLmluZGV4T2YoU19RVU9URSk7Ci0JCWlmIChkSW5kZXggPCAwICYmIHNJbmRleCA8IDApIHsKLQkJCXJldHVybiBkZWZhdWx0UXVvdGU7Ci0JCX0KLQkJZWxzZSBpZiAoZEluZGV4IDwgMCkgewotCQkJcmV0dXJuIERfUVVPVEU7Ci0JCX0KLQkJZWxzZSBpZiAoc0luZGV4IDwgMCkgewotCQkJcmV0dXJuIFNfUVVPVEU7Ci0JCX0KLQkJZWxzZSBpZiAoZEluZGV4IDwgc0luZGV4KSB7Ci0JCQlyZXR1cm4gU19RVU9URTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBEX1FVT1RFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0cmlwU3Vycm91bmRpbmdTcGFjZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlpZiAocmVnaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd2hpbGUgKCFyZWdpb25zLmlzRW1wdHkoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJcmVnaW9ucy5yZW1vdmUoMCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQl3aGlsZSAoIXJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCXJlZ2lvbnMucmVtb3ZlKHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9JbXBvcnRSdWxlQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvSW1wb3J0UnVsZUNvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmM5MTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9JbXBvcnRSdWxlQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRSdWxlQ29sbGVjdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JcHJvdGVjdGVkIGphdmEudXRpbC5WZWN0b3IgcnVsZXMgPSBuZXcgVmVjdG9yKCk7Ci0JcHJvdGVjdGVkIElDU1NTdHlsZVNoZWV0IHRhcmdldCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSW1wb3J0UnVsZUNvbGxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VHJhdmVyc2VJbXBvcnRlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEltcG9ydFJ1bGVDb2xsZWN0b3IoSUNTU1N0eWxlU2hlZXQgc2hlZXQpIHsKLQkJc3VwZXIoKTsKLQkJdGFyZ2V0ID0gc2hlZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGphdmEudXRpbC5WZWN0b3IgZ2V0UnVsZXMoKSB7Ci0JCXJldHVybiBydWxlczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFSVUxFX05PREUgfHwgbm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSkgewotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkgewotCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQkJSUNTU0ltcG9ydFJ1bGUgaW1wID0gKElDU1NJbXBvcnRSdWxlKSBub2RlOwotCQkJCWlmIChpbXAuZ2V0U3R5bGVTaGVldCgpICE9IHRhcmdldCkKLQkJCQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JCQl9Ci0JCQlpZiAoIXJ1bGVzLmNvbnRhaW5zKG5vZGUpKQotCQkJCXJ1bGVzLmFkZChub2RlKTsKLQkJfQotCQlyZXR1cm4gVFJBVl9QUlVORTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvSW1wb3J0ZWRDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9JbXBvcnRlZENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjJhN2FhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9JbXBvcnRlZENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydGVkQ29sbGVjdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JcHJvdGVjdGVkIGphdmEudXRpbC5WZWN0b3IgZXh0ZXJuYWxzID0gbmV3IFZlY3RvcigpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEltcG9ydGVkQ29sbGVjdG9yKCkgewotCQlzdXBlcigpOwotCQlzZXRUcmF2ZXJzZUltcG9ydGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4dGVybmFscygpIHsKLQkJcmV0dXJuIGV4dGVybmFsczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFSVUxFX05PREUpIHsKLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCX0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUpIHsKLQkJCWlmICghZXh0ZXJuYWxzLmNvbnRhaW5zKG5vZGUpKSB7Ci0JCQkJZXh0ZXJuYWxzLmFkZChub2RlKTsKLQkJCX0KLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCX0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUpIHsKLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCX0KLQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1JlZ2lvbkl0ZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvUmVnaW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkMDAyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvUmVnaW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uSXRlcmF0b3IgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VyRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgaW50IGN1cnJlbnQgPSAtMTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSZWdpb25JdGVyYXRvcihJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgaW50IGluZGV4KSB7Ci0JCXN1cGVyKCk7Ci0KLQkJcmVzZXQoc3RydWN0dXJlZERvY3VtZW50LCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlzdXBlcigpOwotCQlyZXNldChmbGF0Tm9kZSwgcmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBjdXJEb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlpZiAoZG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGN1cnJlbnQgPCAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY3VycmVudCA8IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1ByZXYoKSB7Ci0JCS8vIHRoZSBzYW1lIGFzIGhhc05leHQoKQotCQlyZXR1cm4gaGFzTmV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBuZXh0KCkgewotCQlpZiAoZG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoY3VycmVudCA8IDAgfHwgZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpID09IG51bGwgfHwgZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA8PSBjdXJyZW50KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldChjdXJyZW50KTsKLQkJY3VyRG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbjsKLQotCQlpZiAoY3VycmVudCA+PSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpIC0gMSkgewotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCQljdXJyZW50ID0gLTE7Ci0JCX0KLQkJY3VycmVudCsrOwotCi0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIHByZXYoKSB7Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChjdXJyZW50IDwgMCB8fCBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkgPT0gbnVsbCB8fCBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpIDw9IGN1cnJlbnQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KGN1cnJlbnQpOwotCQljdXJEb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCi0JCWlmIChjdXJyZW50ID09IDApIHsKLQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCWN1cnJlbnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpOwotCQkJZWxzZQotCQkJCWN1cnJlbnQgPSAwOwotCQl9Ci0JCWN1cnJlbnQtLTsKLQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBpbnQgaW5kZXgpIHsKLQkJZG9jdW1lbnRSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXgpOwotCQljdXJEb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCQlpZiAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXgpOwotCQkJY3VycmVudCA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5pbmRleE9mKHJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIGZsYXROb2RlICE9IG51bGwpIHsKLQkJCXRoaXMuZG9jdW1lbnRSZWdpb24gPSBmbGF0Tm9kZTsKLQkJCWN1ckRvY3VtZW50UmVnaW9uID0gZmxhdE5vZGU7Ci0JCQljdXJyZW50ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmluZGV4T2YocmVnaW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3Rpb25Db2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3Rpb25Db2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU0NGNhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0aW9uQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGlvbkNvbGxlY3RvciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCWludCBzdGFydCwgZW5kOwotCUxpc3Qgc2VsZWN0ZWROb2RlczsKLQotCS8qKgotCSAqIFNlbGVjdGlvbkNvbGxlY3RvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTZWxlY3Rpb25Db2xsZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW4oSUNTU05vZGUgbm9kZSkgewotCQlzZWxlY3RlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkTm9kZXMoKSB7Ci0JCWlmIChzZWxlY3RlZE5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdChzZWxlY3RlZE5vZGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPD0gZW5kICYmIHN0YXJ0IDwgaU5vZGUuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFKSB7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBpRmlyc3RDaGlsZCA9IChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlJbmRleGVkUmVnaW9uIGlMYXN0Q2hpbGQgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCQlpZiAoaUZpcnN0Q2hpbGQgPT0gbnVsbCB8fCBzdGFydCA8IGlGaXJzdENoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgfHwgaUxhc3RDaGlsZC5nZXRFbmRPZmZzZXQoKSA8PSBlbmQpCi0JCQkJCXNlbGVjdGVkTm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCQlpZiAoaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA+IGVuZCkKLQkJCXJldHVybiBUUkFWX1NUT1A7Ci0JCWVsc2UKLQkJCXJldHVybiBUUkFWX1BSVU5FOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbihpbnQgbmV3U3RhcnQsIGludCBuZXdFbmQpIHsKLQkJc3RhcnQgPSBuZXdTdGFydDsKLQkJZW5kID0gbmV3RW5kOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvclZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdG9yVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTJlMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdG9yVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU1NlbGVjdG9yTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9ySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NpbXBsZVNlbGVjdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RvclZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2VsZWN0b3JWYWxpZGF0b3IuCi0JICovCi0JcHVibGljIFNlbGVjdG9yVmFsaWRhdG9yKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZUZXh0ID0gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgY29uc2lzdHMgb2Ygb25lIENMQVNTIHNlbGVjdG9yLiBzeW50YXggY2hlY2sKLQkgKiBpcyBhIGxpdHRsZSBsb29zZSAoLjEyMyBpcyBwYXNzZWQpCi0JICogCi0JICogIi5jbGFzcyIgLT4gdHJ1ZSAiLjEyMyIgLT4gdHJ1ZSAiLmNsYXNzICwgLmNsYXNzMiIgLT4gZmFsc2UKLQkgKiAiLmNsYXNzLmNsYXNzMiIgLT4gZmFsc2UgIi4xMjN7fSIgLT4gZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCkgewotCQlJQ1NTU2ltcGxlU2VsZWN0b3Igc2VsZWN0b3IgPSBnZXRPbmx5T25lU2ltcGxlU2VsZWN0b3IoKTsKLQkJaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiAoc2VsZWN0b3IuZ2V0TmFtZSgpLmxlbmd0aCgpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgPT0gMCAmJiBzZWxlY3Rvci5nZXROdW1PZkNsYXNzZXMoKSA9PSAxICYmIHNlbGVjdG9yLmdldE51bU9mSURzKCkgPT0gMCAmJiBzZWxlY3Rvci5nZXROdW1PZlBzZXVkb05hbWVzKCkgPT0gMCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGV4dCBjb25zaXN0cyBvZiBvbmUgSUQgc2VsZWN0b3IuCi0JICogCi0JICogIiNJRCIgLT4gdHJ1ZSAiSDEjbXlJRCIgLT4gZmFsc2UgIiNhYmN7fSIgLT4gZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lEKCkgewotCQlJQ1NTU2ltcGxlU2VsZWN0b3Igc2VsZWN0b3IgPSBnZXRPbmx5T25lU2ltcGxlU2VsZWN0b3IoKTsKLQkJaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiAoc2VsZWN0b3IuZ2V0TmFtZSgpLmxlbmd0aCgpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgPT0gMCAmJiBzZWxlY3Rvci5nZXROdW1PZkNsYXNzZXMoKSA9PSAwICYmIHNlbGVjdG9yLmdldE51bU9mSURzKCkgPT0gMSAmJiBzZWxlY3Rvci5nZXROdW1PZlBzZXVkb05hbWVzKCkgPT0gMCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIG92ZXJhbGwgY2hlY2sKLQkgKiAKLQkgKiAiUCNob2dlOTggKyAqOmhvdmVyID4gQTpsaW5rLCBBLmV4dGVybmFsOnZpc2l0ZWQiIC0+IHRydWUgIkgxIEgyIHt9IiAtPgotCSAqIGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcGFyc2UoKTsKLQkJcmV0dXJuIChmU2VsZWN0b3JMaXN0ICE9IG51bGwgJiYgZlNlbGVjdG9yTGlzdC5nZXRFcnJvckNvdW50KCkgPT0gMCk7Ci0JfQotCi0JcHJpdmF0ZSBJQ1NTU2ltcGxlU2VsZWN0b3IgZ2V0T25seU9uZVNpbXBsZVNlbGVjdG9yKCkgewotCQlwYXJzZSgpOwotCQlpZiAoZlNlbGVjdG9yTGlzdCAhPSBudWxsICYmIGZTZWxlY3Rvckxpc3QuZ2V0TGVuZ3RoKCkgPT0gMSkgewotCQkJSUNTU1NlbGVjdG9yIHNlbGVjdG9yID0gZlNlbGVjdG9yTGlzdC5nZXRTZWxlY3RvcigwKTsKLQkJCWludCBuSXRlbSA9IHNlbGVjdG9yLmdldExlbmd0aCgpOwotCQkJaWYgKG5JdGVtID09IDEpIHsKLQkJCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSBzZWxlY3Rvci5nZXRJdGVtKDApOwotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgSUNTU1NpbXBsZVNlbGVjdG9yKSB7Ci0JCQkJCXJldHVybiAoSUNTU1NpbXBsZVNlbGVjdG9yKSBpdGVtOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2UoKSB7Ci0JCWlmIChmU2VsZWN0b3JMaXN0ID09IG51bGwpIHsKLQkJCWlmIChmVGV4dCAhPSBudWxsKSB7Ci0JCQkJZlNlbGVjdG9yTGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKGZUZXh0KTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZlRleHQgPSBudWxsOwotCXByaXZhdGUgSUNTU1NlbGVjdG9yTGlzdCBmU2VsZWN0b3JMaXN0ID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvcnNDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvcnNDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5M2ZmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0b3JzQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdG9yc0NvbGxlY3RvciBleHRlbmRzIEFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCXByb3RlY3RlZCBWZWN0b3Igc2VsZWN0b3JzID0gbmV3IFZlY3RvcigpOwotCXByb3RlY3RlZCBWZWN0b3Igc2VsZWN0b3JzVG9Bdm9pZCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2VsZWN0b3JzQ29sbGVjdG9yKCkgewotCQlzdXBlcigpOwotCQlzZXRUcmF2ZXJzZUltcG9ydGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RvclRvQXZvaWQoSUNTU1NlbGVjdG9yIHNlbFRvQXZvaWQpIHsKLQkJaWYgKHNlbFRvQXZvaWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHNlbGVjdG9yc1RvQXZvaWQgPT0gbnVsbCkKLQkJCXNlbGVjdG9yc1RvQXZvaWQgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJaWYgKCFzZWxlY3RvcnNUb0F2b2lkLmNvbnRhaW5zKHNlbFRvQXZvaWQpKQotCQkJc2VsZWN0b3JzVG9Bdm9pZC5hZGQoc2VsVG9Bdm9pZCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0b3JUb0F2b2lkKElDU1NTdHlsZVJ1bGUgcnVsZSkgewotCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBydWxlLmdldFNlbGVjdG9ycygpOwotCQlJdGVyYXRvciBpdCA9IGxpc3QuZ2V0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSUNTU1NlbGVjdG9yIHNlbCA9IChJQ1NTU2VsZWN0b3IpIGl0Lm5leHQoKTsKLQkJCWFkZFNlbGVjdG9yVG9Bdm9pZChzZWwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFNlbGVjdG9ycygpIHsKLQkJcmV0dXJuIHNlbGVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVSVUxFX05PREUpIHsKLQkJCUlDU1NTdHlsZVJ1bGUgcnVsZSA9IChJQ1NTU3R5bGVSdWxlKSBub2RlOwotCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gcnVsZS5nZXRTZWxlY3RvcnMoKTsKLQkJCUl0ZXJhdG9yIGl0ID0gbGlzdC5nZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHNlbGVjdG9yc1RvQXZvaWQgIT0gbnVsbCAmJiBzZWxlY3RvcnNUb0F2b2lkLmNvbnRhaW5zKG9iaikpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmICghc2VsZWN0b3JzLmNvbnRhaW5zKG9iaikpCi0JCQkJCXNlbGVjdG9ycy5hZGQob2JqKTsKLQkJCX0KLQkJCXJldHVybiBUUkFWX1BSVU5FOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUpIHsKLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCX0KLQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0b3JzVG9Bdm9pZChqYXZhLnV0aWwuVmVjdG9yIG5ld1NlbGVjdG9yc1RvQXZvaWQpIHsKLQkJc2VsZWN0b3JzVG9Bdm9pZCA9IG5ld1NlbGVjdG9yc1RvQXZvaWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1VSTEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1VSTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDVlMTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9VUkxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5QYXRoSGVscGVyOwotCi0vKioKLSAqIEh5cGVybGluayBtYW5hZ2VyLiBQcm92ZWQgdXNlZnVsIHNlcnZpY2VzIGxpa2UgbGluayBjb252ZXJzaW9uIEFuIHV0aWxpdHkKLSAqIGNsYXNzIHRvIGhlbHAgb3RoZXIgcGFyc3JlIG1vZHVsZXMgdG8gY29udmVydCBsaW5rcwotICovCi1wdWJsaWMgY2xhc3MgVVJMSGVscGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MX1NFQVJDSF9TSUcgPSAiZmlsZTovIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0xfU0lHID0gImZpbGU6Ly8vIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFTEFUSVZFX1BBVEhfU0lHID0gIi4uIjsvLyROT04tTkxTLTEkCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEX1NMQVNIID0gIi8iOy8vJE5PTi1OTFMtMSQJCi0JcHJpdmF0ZSBVUkwgZkJhc2VVcmwgPSBudWxsOyAvLyBiYXNlIHVybC4gYXNzdW1lZCB0byBhIGFic3VsdXRlIHVybAotCXByaXZhdGUgU3RyaW5nIGZCYXNlVXJsU3RyaW5nID0gbnVsbDsKLQlwcml2YXRlIFVSTCBmRG9jUm9vdCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRvY1Jvb3RTdHJpbmcgPSBudWxsOwotCi0JcHVibGljIFVSTEhlbHBlcihTdHJpbmcgYmFzZVVybCkgewotCQlpbml0aWFsaXplKGJhc2VVcmwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBVUkxIZWxwZXIoU3RyaW5nIGJhc2VVcmwsIFN0cmluZyBkb2NSb290KSB7Ci0JCWluaXRpYWxpemUoYmFzZVVybCwgZG9jUm9vdCk7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lhbCBhZHVqdXN0IGZvciBmaWxlIHVybAotCSAqLwotCXB1YmxpYyBTdHJpbmcgYWRqdXN0RmlsZVByb3RvY29sVXJsKFN0cmluZyB1cmwpIHsKLQkJaWYgKHVybC5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0xfU0VBUkNIX1NJRykpIHsKLQkJCXVybCA9IEZJTEVfUFJPVE9DT0xfU0lHICsgdXJsLnN1YnN0cmluZyhGSUxFX1BST1RPQ09MX1NFQVJDSF9TSUcubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydChTdHJpbmcgdXJsLCBVUkwgYmFzZVVybCwgU3RyaW5nIHVybFN0cmluZykgewotCQlTdHJpbmcgYWJzVXJsID0gdXJsOwotCQlpZiAoYmFzZVVybCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCS8vIGRvIHNwZWNpYWwgdGhpbmcgZmlsZSBwcm90b2NvbAotCQkJCWlmIChiYXNlVXJsLmdldFByb3RvY29sKCkuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQkvLyByZW1vdmUgdGhlIGZpc3QKLQkJCQkJaWYgKHVybC5zdGFydHNXaXRoKCIvIikpLy8kTk9OLU5MUy0xJAotCQkJCQkJdXJsID0gdXJsLnN1YnN0cmluZygxKTsKLQkJCQkJLy8gZW1wdHkgc3RyaW5nIGNhdXNlcyBtYWxmb3JtZWQgZXhjZXB0aW9uCi0JCQkJCVN0cmluZyB0ZW1wVXJsID0gdXJsOwotCQkJCQlpZiAoIiIuZXF1YWxzKHVybCkpLy8kTk9OLU5MUy0xJAotCQkJCQkJdGVtcFVybCA9ICIgIjsvLyROT04tTkxTLTEkCi0JCQkJCVVSTCBuZXdVcmwgPSBuZXcgVVJMKGJhc2VVcmwsIHRlbXBVcmwpOwotCQkJCQkvLyBkbyBleHRyYSBtYXRoIGZvciBmaWxlIHByb3RvY29sIHRvIHN1cHBvcnQgaWUgYmFzZWQKLQkJCQkJYWJzVXJsID0gYWRqdXN0RmlsZVByb3RvY29sVXJsKG5ld1VybC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVVSTCBuZXdVcmwgPSBuZXcgVVJMKGZCYXNlVXJsLCB1cmwpOwotCQkJCQlhYnNVcmwgPSBuZXdVcmwudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKSB7Ci0JCQl9Ci0JCQkvLyBjb252ZXJ0IGV2ZXJ5dGhpbmcgdG8gZm9yd2FyZCBzbGFzaAotCQkJYWJzVXJsID0gUGF0aEhlbHBlci5zd2l0Y2hUb0ZvcndhcmRTbGFzaGVzKGFic1VybCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB0aGUgZ2l2ZW4gbWF5IGJlIGJhc2VkIG9uIGZpbGUKLQkJCWlmICh1cmxTdHJpbmcgIT0gbnVsbCkgewotCQkJCS8vIHN3aWNoIHRoZSB1cmwgdG8gcHJvcGVyIGRpcmVjdGlvbgotCQkJCXVybCA9IFBhdGhIZWxwZXIucmVtb3ZlTGVhZGluZ1NlcGFyYXRvcih1cmwpOwotCQkJCUZpbGUgZmxlID0gbmV3IEZpbGUodXJsU3RyaW5nLCB1cmwpOwotCQkJCWFic1VybCA9IGZsZS5nZXRQYXRoKCk7Ci0KLQkJCX0KLQkJCS8vIGNvbnZlcnQgZXZlcnl0aGluZyB0byBmb3J3YXJkIHNsYXNoCi0JCQlhYnNVcmwgPSBQYXRoSGVscGVyLnN3aXRjaFRvRm9yd2FyZFNsYXNoZXMoYWJzVXJsKTsKLQotCQkJLy8gaWYgdGhlIHBhdGggZW5kcyB3aXRoICIuLiIgd2UgbmVlZCB0byBhZGQgYSB0ZXJtaW5hdGluZyBzbGFzaAotCQkJLy8gb3IKLQkJCS8vIGVsc2UgdGhlIGxpbmsgd2lsbCBub3QgYmUgcmVzb2x2ZWQgY29ycmVjdGx5LiAoaXQgd2lsbCBsb29rCi0JCQkvLyBsaWtlCi0JCQkvLyAvdXJsL3BhdGgvdG8vc29tZXdoZXJlLy4uIGluc3RlYWQgb2YgL3VybC9wYXRoL3RvLwotCQkJaWYgKGFic1VybC5lbmRzV2l0aChGT1JXQVJEX1NMQVNIICsgUkVMQVRJVkVfUEFUSF9TSUcpKSB7Ci0JCQkJYWJzVXJsICs9IEZPUldBUkRfU0xBU0g7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZXNvbHZlIHJlbGF0aXZlIHBhdGggdG8gYWJzb2x1dGUKLQkJYWJzVXJsID0gUGF0aEhlbHBlci5hZGp1c3RQYXRoKGFic1VybCk7Ci0JCXJldHVybiBhYnNVcmw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoU3RyaW5nIGJhc2VVcmwsIFN0cmluZyBkb2NSb290KSB7Ci0JCS8vCi0JCS8vIEZpbmQgb3V0IHdoZXRoZXIgYmFlcyB1cmwgaXMgYSB1cmwgb3IgZmlsZSBuYW1lCi0JCS8vCi0JCXRyeSB7Ci0JCQlTdHJpbmcgdGVtcCA9IFBhdGhIZWxwZXIuYXBwZW5kVHJhaWxpbmdVUkxTbGFzaChiYXNlVXJsKTsKLQkJCWZCYXNlVXJsID0gbmV3IFVSTCh0ZW1wKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgewotCQl9Ci0JCWlmIChmQmFzZVVybCA9PSBudWxsKSB7Ci0JCQkvLyBpdCBpcyBhIGZpbGUgYmFzZWQgdXJsCi0JCQlmQmFzZVVybFN0cmluZyA9IGJhc2VVcmw7Ci0JCX0KLQotCQkvLyBkbyB0aGUgc2FtZSBmb3IgZG9jIHJvb3QKLQkJaWYgKGRvY1Jvb3QgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdGVtcCA9IFBhdGhIZWxwZXIuYXBwZW5kVHJhaWxpbmdVUkxTbGFzaChkb2NSb290KTsKLQkJCQlmRG9jUm9vdCA9IG5ldyBVUkwodGVtcCk7Ci0KLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7Ci0JCQl9Ci0JCQlpZiAoZkRvY1Jvb3QgPT0gbnVsbCkgewotCQkJCS8vIGl0IGlzIGEgZmlsZSBiYXNlZCB1cmwKLQkJCQlmRG9jUm9vdFN0cmluZyA9IGRvY1Jvb3Q7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBnaXZlbiB1cmwgdG8gYSBhYm9sdXRlIHVybCB1c2luZyB0aGUgYmFzZSB1cmwgSW5wdXQgdXJsIGNhbgotCSAqIGJlIG9mIGFueSBvdGhlIGZvbGxvd2luZyBmb3JtYXQgQWJzb2x1dGUgdXJscyAtLS0tLS0tLS0tLS0tLSAuCi0JICogaHR0cDovL3d3dy5mb28uY29tLyAuIGh0dHA6Ly93d3cuZm9vLmNvbSAuIGh0dHA6Ly93d3cuZm9vLmNvbS9mb2xkZXIgLgotCSAqIGh0dHA6Ly93d3cuZm9vLmNvbS9mb2xkZXIvIC4gaHR0cDovL3d3dy5mb28uY29tL2luZGV4Lmh0bWwgLgotCSAqIGh0dHA6Ly93d3cuZm9vLmNvbS9mb2xkZXIvaW5kZXguaHRtbCAuCi0JICogaHR0cDovL3d3dy5mb28uY29tL2ZvbGRlci8uLi9pbmRleC5odG1sIFVybCByZWxhdGl2ZSBvbiBkb2N1bWVudCByb290Ci0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAuIC8gLiAvZm9sZGVyIC4gL2luZGV4Lmh0bWwgLgotCSAqIC9mb2xkZXIvaW5kZXguaHRtbCAuIC9mb2xkZXIvLi4vaW5kZXguaHRtbAotCSAqIAotCSAqIFNlbGYgcmVsYXRpdmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAuIGluZGV4Lmh0bWwgLiAuL2luZGV4Lmh0bWwgLgotCSAqIC4uL2luZGV4Lmh0bWwgLiBmb2xkZXIvaW5kZXguaHRtbCAuIGZvbGRlci8uLi9pbmRleC5odG1sCi0JICogCi0JICogZmlsZSBiYXNlZCB1cmwgYWRkcyBhbm90aGVyIGRpbWVuc2lvbiBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgYSBkb2N1bWVudAotCSAqIHJvb3QgU28gdXNlcyBmRG9jUm9vdCBpZiBwcm92aWRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9BYnNvbHV0ZShTdHJpbmcgdXJsKSB7Ci0JCVN0cmluZyBhYnNVcmwgPSB1cmw7Ci0KLQkJVVJMIG5ld1VybCA9IG51bGw7Ci0JCS8vIHRyeSB0byBzZWUgaXQgaXMgYSBhYnNvbHV0ZSB1cmwKLQkJdHJ5IHsKLQkJCW5ld1VybCA9IG5ldyBVUkwodXJsKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKSB7Ci0JCX0KLQkJLy8gaWYgZG9jdW1lbnQgcm9vdCBpcyBwcm92aWRlZAotCQkvLyBkbyBzcGVjaWFsIGNhc2UKLQkJaWYgKG5ld1VybCA9PSBudWxsKSB7Ci0JCQlpZiAoZkRvY1Jvb3QgPT0gbnVsbCAmJiBmRG9jUm9vdFN0cmluZyA9PSBudWxsKSB7Ci0JCQkJLy8gdHJ5IHRvIGNoZWNrIHJlbGF0aXZlIHVybAotCQkJCWFic1VybCA9IGNvbnZlcnQodXJsLCBmQmFzZVVybCwgZkJhc2VVcmxTdHJpbmcpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZG9jIHJvb3QgaXMgcHJvdmlkZWQKLQkJCQkvLyBpZiB0aGUgdXJsIGlzIGEgZG9jIHJvb3QgYmFzZWQgdXNlIGRvYyByb290Ci0KLQkJCQlpZiAodXJsLnN0YXJ0c1dpdGgoIi8iKSkvLyROT04tTkxTLTEkCi0JCQkJCWFic1VybCA9IGNvbnZlcnQodXJsLCBmRG9jUm9vdCwgZkRvY1Jvb3RTdHJpbmcpOwotCQkJCWVsc2UKLQkJCQkJYWJzVXJsID0gY29udmVydCh1cmwsIGZCYXNlVXJsLCBmQmFzZVVybFN0cmluZyk7Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYWJzVXJsOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgZnJvbSBhbiBhYnNvbHV0ZSB1cmwgdG8gcmVsYXRpdmUgdXJsIGJhc2VkIG9uIHRoZSBnaXZlbiB1cmwKLQkgKiBCb3RoIGFyZSBhc3N1bWVkIHRvIGJlIGFibHN1dGUgdXJsCi0JICovCi0JcHVibGljIFN0cmluZyB0b1JlbGF0aXZlKFN0cmluZyB1cmwsIFN0cmluZyBkb2N1bWVudFVybCkgewotCQlTdHJpbmcgb3V0cHV0ID0gdXJsOwotCQkvLyBhc3N1bWluZyBib3RoIHVybHMgYXJlIGFic29sdXRlCi0JCXRyeSB7Ci0JCQlVUkwgaW5wdXRVcmwgPSBuZXcgVVJMKHVybCk7Ci0JCQlVUkwgZG9jVXJsID0gbmV3IFVSTChkb2N1bWVudFVybCk7Ci0JCQkvLyBmaWx0ZXIgb3V0IGlmIHRoZSB1cmxzIGFyZSBub3QgZnJvIHRoZSBzYW1lIGRvbWFpbgotCQkJaWYgKCFpbnB1dFVybC5nZXRQcm90b2NvbCgpLmVxdWFscyhkb2NVcmwuZ2V0UHJvdG9jb2woKSkgfHwgIWlucHV0VXJsLmdldEhvc3QoKS5lcXVhbHMoZG9jVXJsLmdldEhvc3QoKSkgfHwgaW5wdXRVcmwuZ2V0UG9ydCgpICE9IGRvY1VybC5nZXRQb3J0KCkpCi0JCQkJcmV0dXJuIG91dHB1dDsKLQkJCS8vIGJvdGggdXJsIGFyZSBjb21pbmcgZm9ybSB0aGUgc2FtZSBwbGFjZQotCQkJLy8gc3RyaXAgb2ZmIHRoZSBkb21haW4gcGFydHMKLQkJCVN0cmluZyBpbnB1dE5hbWUgPSBpbnB1dFVybC5nZXRGaWxlKCk7Ci0JCQlTdHJpbmcgZG9jTmFtZSA9IGRvY1VybC5nZXRGaWxlKCk7Ci0JCQlvdXRwdXQgPSBQYXRoSGVscGVyLmNvbnZlcnRUb1JlbGF0aXZlKGlucHV0TmFtZSwgZG9jTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkgewotCQkJb3V0cHV0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gb3V0cHV0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9VUkxNb2RlbFByb3ZpZGVyQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvVVJMTW9kZWxQcm92aWRlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjE4MGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9VUkxNb2RlbFByb3ZpZGVyQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VBbHJlYWR5RXhpc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuUGF0aEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Qcm9qZWN0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgVVJMTW9kZWxQcm92aWRlckNTUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX01PREVMX0ZPUl9SRUFEID0gMTsKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX05FV19NT0RFTF9GT1JfUkVBRCA9IDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9NT0RFTF9GT1JfRURJVCA9IDM7Ci0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9ORVdfTU9ERUxfRk9SX0VESVQgPSA0OwotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFEX0JVRkZFUl9TSVpFID0gNDA5NjsKLQkvLyBJTW9kZWxNYW5hZ2VyCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgVVJMTW9kZWxQcm92aWRlckNTUygpIHsKLQkJc3VwZXIoKTsKLQotCQkvLyBvYnRhaW4gbW9kZWwgbWFuYWdlcgotCQltb2RlbE1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSBJRCBmcm9tIGEgZmlsZW5hbWUuIFRoaXMgbXVzdCBiZSBzYW1lIGFzCi0JICogRmlsZU1vZGVsUHJvdmlkZXIuY2FsY3VsYXRlSWQoSUZpbGUpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNhbGN1bGF0ZUlkKElQYXRoIGZ1bGxJUGF0aCkgewotCQlyZXR1cm4gZnVsbElQYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldENvbW1vbk1vZGVsRm9yKGZpbmFsIElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBmaW5hbCBTdHJpbmcgcmVmLCBmaW5hbCBpbnQgd2hpY2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGZpcnN0LCBjcmVhdGUgYWJzb2x1dGUgdXJsCi0JCVN0cmluZyBhYnNVUkwgPSByZXNvbHZlVVJJKGJhc2VNb2RlbCwgcmVmLCB0cnVlKTsKLQkJaWYgKChhYnNVUkwgPT0gbnVsbCkgfHwgKGFic1VSTC5sZW5ndGgoKSA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBuZWVkIHRvIHJlbW92ZSBmaWxlOi8vIHNjaGVtZSBpZiBuZWNlc3NhcnkKLQkJdHJ5IHsKLQkJCWZpbmFsIFVSTCBhVVJMID0gbmV3IFVSTChhYnNVUkwpOwotCQkJLy8gQW4gYWN0dWFsIFVSTCB3YXMgZ2l2ZW4sIG9ubHkgZmlsZTovLy8gaXMgc3VwcG9ydGVkCi0JCQkvLyByZXNvbHZlIGl0IGJ5IGZpbmRpbmcgdGhlIGZpbGUgaXQgcG9pbnRzIHRvCi0JCQlpZiAoIWFVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoInBsYXRmb3JtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikgJiYgKGFVUkwuZ2V0SG9zdCgpLmVxdWFscygibG9jYWxob3N0IikgfHwgYVVSTC5nZXRIb3N0KCkubGVuZ3RoKCkgPT0gMCkpIHsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJYWJzVVJMID0gYVVSTC5nZXRGaWxlKCk7Ci0JCQkJCWZpbmFsIElQYXRoIGlwYXRoID0gbmV3IFBhdGgoYWJzVVJMKTsKLQkJCQkJLy8gaWYgcGF0aCBoYXMgYSBkZXZpY2UsIGFuZCBpZiBpdCBiZWdpbnMgd2l0aAotCQkJCQkvLyBJUGF0aC5TRVBBUkFUT1IsIHJlbW92ZSBpdAotCQkJCQlmaW5hbCBTdHJpbmcgZGV2aWNlID0gaXBhdGguZ2V0RGV2aWNlKCk7Ci0JCQkJCWlmICgoZGV2aWNlICE9IG51bGwpICYmIChkZXZpY2UubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJaWYgKGRldmljZS5jaGFyQXQoMCkgPT0gSVBhdGguU0VQQVJBVE9SKSB7Ci0JCQkJCQkJZmluYWwgU3RyaW5nIG5ld0RldmljZSA9IGRldmljZS5zdWJzdHJpbmcoMSk7Ci0JCQkJCQkJYWJzVVJMID0gaXBhdGguc2V0RGV2aWNlKG5ld0RldmljZSkudG9TdHJpbmcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWZ1RXhjKSB7Ci0JCX0KLQotCQkvLyBuZXh0LCBkZWNpZGUgcHJvamVjdAotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJZmluYWwgSVBhdGggZnVsbElQYXRoID0gbmV3IFBhdGgoYWJzVVJMKTsKLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSB3b3Jrc3BhY2UuZ2V0Q29udGFpbmVyRm9yTG9jYXRpb24oZnVsbElQYXRoKTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkvLyBmdWxsSVBhdGggZG9lc24ndCBleGlzdCBpbiB3b3Jrc3BhY2UKLQkJCXByb2plY3QgPSBjb250YWluZXIuZ2V0UHJvamVjdCgpOwotCQl9Ci0KLQkJLy8gSWYgSFRNTCBkb2N1bWVudCBoYXMgYSBsaW5rIHRvIGFuIGV4dGVybiBDU1Mgd2hpY2ggaXMgbm90IGluCi0JCS8vIElQcm9qZWN0Ci0JCS8vIHdvcmtzcGFjZS5nZXRDb250YWluZXJGb3JMb2F0aW9uKCkgbWF5IHJldHVybiBudWxsLiBXZSBuZWVkIHRvIHRha2UKLQkJLy8gY2FyZQotCQkvLyBvZiB0aGlzIGNhc2UKLQotCQkvLyBub3csIGdldCBhYnNVUkwncyBJRmlsZQotCQlpZiAoKHByb2plY3QgIT0gbnVsbCkgJiYgKHByb2plY3QuZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKGZ1bGxJUGF0aCkgPT0gZmFsc2UpKSB7Ci0JCQkvLyBpdCdzIGF0IG91dHNpZGUgb2YgUHJvamVjdAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJSVBhdGggZmlsZVBhdGggPSBmdWxsSVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhwcm9qZWN0LmdldExvY2F0aW9uKCkuc2VnbWVudENvdW50KCkpOwotCQkJSUZpbGUgZmlsZSA9IChmaWxlUGF0aCAhPSBudWxsICYmICFmaWxlUGF0aC5pc0VtcHR5KCkpID8gcHJvamVjdC5nZXRGaWxlKGZpbGVQYXRoKSA6IG51bGw7Ci0JCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIG9idGFpbiBtb2RlbAotCQkJaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfRURJVCkgewotCQkJCW1vZGVsID0gZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCQkJfQotCQkJZWxzZSBpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9SRUFEKSB7Ci0JCQkJbW9kZWwgPSBnZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCQl9Ci0KLQkJCS8vIHNldHRpbmcgc3luY2hyb25pemF0aW9uIHN0YW1wIGlzIElNb2RlbE1hbmFnZXIncyBjbGllbnQncwotCQkJLy8gcmVzcG9uc2liaWxpdHkKLQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFN5bmNocm9uaXphdGlvblN0YW1wKCkgPT0gSVJlc291cmNlLk5VTExfU1RBTVApCi0JCQkJbW9kZWwucmVzZXRTeW5jaHJvbml6YXRpb25TdGFtcChmaWxlKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBpZCA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7Ci0JCQkvLyBvYnRhaW4gcmVzb2x2ZXIKLQkJCVVSSVJlc29sdmVyIHJlc29sdmVyID0gKHByb2plY3QgIT0gbnVsbCkgPyAoVVJJUmVzb2x2ZXIpIHByb2plY3QuZ2V0QWRhcHRlcihVUklSZXNvbHZlci5jbGFzcykgOiBudWxsOwotCQkJaWYgKHJlc29sdmVyID09IG51bGwpIHsKLQkJCQkvLyBQcm9qZWN0UmVzb2x2ZXIgY2FuIHRha2UgY2FyZSBvZiB0aGUgY2FzZSBpZiBwcm9qZWN0IGlzCi0JCQkJLy8gbnVsbC4KLQkJCQlyZXNvbHZlciA9IG5ldyBQcm9qZWN0UmVzb2x2ZXIocHJvamVjdCk7Ci0JCQl9Ci0JCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyB0aGVyZSBpcyBubyBwcm9qZWN0LiB3ZSBjYW4ndCBleHBlY3QgSVByb2plY3QgaGVscCB0byBjcmVhdGUKLQkJCS8vIGlkL2lucHV0U3RyZWFtCi0JCQlGaWxlIGZpbGUgPSBmdWxsSVBhdGgudG9GaWxlKCk7Ci0KLQkJCS8vIG9iYXRpbiBpZAotCQkJaWQgPSBjYWxjdWxhdGVJZChmdWxsSVBhdGgpOwotCi0JCQkvLyBvYnRhaW4gSW5wdXRTdHJlYW0KLQkJCXRyeSB7Ci0JCQkJaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJfQotCQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0JCQkJLy8gdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIG9yIHdlIGRvbid0IGhhdmUgcmVhZCBwZXJtaXNzaW9uCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIG9idGFpbiBtb2RlbAotCQkJdHJ5IHsKLQkJCQlpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9FRElUKSB7Ci0JCQkJCW1vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGlkLCBpblN0cmVhbSwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCQllbHNlIGlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX1JFQUQpIHsKLQkJCQkJbW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoaWQsIGluU3RyZWFtLCByZXNvbHZlcik7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWUpIHsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIGNsb3NlIG5vdyAhCi0JCQkJaWYgKGluU3RyZWFtICE9IG51bGwpIHsKLQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXQgbG9jYXRpb25pZAotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSA9PSBudWxsKSB7Ci0JCQltb2RlbC5zZXRCYXNlTG9jYXRpb24oZnVsbElQYXRoLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvbW1vbk1vZGVsRm9yKGJhc2VNb2RlbCwgcmVmLCBHRVRfTU9ERUxfRk9SX0VESVQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQotCQkvLyBjcmVhdGUgYSBmYWtlIElucHV0U3RyZWFtCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoZmlsZSwgRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb21tb25Nb2RlbEZvcihiYXNlTW9kZWwsIHJlZiwgR0VUX01PREVMX0ZPUl9SRUFEKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkJLy8gY3JlYXRlIGEgZmFrZSBJbnB1dFN0cmVhbQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBleCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUsIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXROZXdNb2RlbEZvckVkaXQoaUZpbGUsIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSByaXUpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VBbHJlYWR5RXhpc3RzIHJhZSkgewotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSkgewotCQlpZiAoaUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE5ld01vZGVsRm9yRWRpdChpRmlsZSwgZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUluVXNlIHJpdSkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUFscmVhZHlFeGlzdHMgcmFlKSB7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICogPGNvZGU+cmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzPC9jb2RlPjogSWYgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzCi0JICogaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCBwcm9wZXJseSByZXNvbHZlIHRoZSBVUkkgaWYgaXQgaXMKLQkgKiBhIHZhbGlkIFVSSSBwb2ludGluZyB0byBhbm90aGVyIChhcHByb3ByaWF0ZSkgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlVVJJKElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBTdHJpbmcgcmVmLCBib29sZWFuIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykgewotCQlpZiAoYmFzZU1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBnZXQgcmVzb2x2ZXIgaW4gTW9kZWwKLQkJZmluYWwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBiYXNlTW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQotCQkvLyByZXNvbHZlIHRvIGFic29sdXRlIHVybAotCQlmaW5hbCBTdHJpbmcgYWJzdXJsID0gKHJlc29sdmVyICE9IG51bGwpID8gcmVzb2x2ZXIuZ2V0TG9jYXRpb25CeVVSSShyZWYsIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykgOiBudWxsOwotCQlpZiAoKHJlc29sdmVyICE9IG51bGwpICYmIChhYnN1cmwgPT0gbnVsbCkgJiYgKHJlZiAhPSBudWxsKSAmJiAocmVmLnRyaW0oKS5sZW5ndGgoKSA+IDApICYmIChyZWYudHJpbSgpLmNoYXJBdCgwKSA9PSAnLycpKSB7Ci0JCQkvLyB0byByZWFjaCBoZXJlIG1lYW5zIDoKLQkJCS8vIHJlZiBpcyBhIERvY3Jvb3QgcmVsYXRpdmUKLQkJCS8vIHJlc29sdmVyIGNhbid0IHJlc29sdmUgcmVmCi0JCQkvLyBzbyB0aGF0IGhyZWYgaXMgYSBicm9rZW4gYW5kIHNob3VsZCBub3QgY3JlYXRlIG1vZGVsCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoKGFic3VybCAhPSBudWxsKSAmJiAoYWJzdXJsLmxlbmd0aCgpID4gMCkpIHsKLQkJCXJldHVybiBhYnN1cmw7Ci0JCX0KLQotCQkvLyBtYXliZSByZWYgaXMgYXQgb3V0c2lkZSBvZiB0aGUgUHJvamVjdAotCQkvLyBvYnRhaW4gZG9jcm9vdDsKLQkJZmluYWwgSUNvbnRhaW5lciBjb250YWluZXIgPSAocmVzb2x2ZXIgIT0gbnVsbCkgPyByZXNvbHZlci5nZXRSb290TG9jYXRpb24oKSA6IG51bGw7Ci0JCVN0cmluZyBkb2Nyb290ID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlkb2Nyb290ID0gY29udGFpbmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAoZG9jcm9vdCA9PSBudWxsKSB7Ci0JCQlkb2Nyb290ID0gYmFzZU1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChkb2Nyb290ID09IG51bGwpIHsKLQkJCS8vIHNob3VsZCBub3QgYmUKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gb2J0YWluIGRvY3VtZW50IHVybAotCQlTdHJpbmcgbW9kZWxCYXNlTG9jYXRpb24gPSBiYXNlTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCWlmICgobW9kZWxCYXNlTG9jYXRpb24gPT0gbnVsbCkgfHwgKG1vZGVsQmFzZUxvY2F0aW9uLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBmYWxsYmFjay4uLgotCQkJbW9kZWxCYXNlTG9jYXRpb24gPSBiYXNlTW9kZWwuZ2V0SWQoKTsKLQkJfQotCQlpZiAoKG1vZGVsQmFzZUxvY2F0aW9uID09IG51bGwpIHx8IChtb2RlbEJhc2VMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gaSBjYW4ndCByZXNvbHZlIHVyaSAhCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIHJlc29sdmUgdXJsCi0JCVVSTEhlbHBlciBoZWxwZXIgPSBuZXcgVVJMSGVscGVyKFBhdGhIZWxwZXIuZ2V0Q29udGFpbmluZ0ZvbGRlclBhdGgobW9kZWxCYXNlTG9jYXRpb24pLCBQYXRoSGVscGVyLmdldENvbnRhaW5pbmdGb2xkZXJQYXRoKFBhdGhIZWxwZXIuYXBwZW5kVHJhaWxpbmdVUkxTbGFzaChkb2Nyb290KSkpOwotCQlyZXR1cm4gaGVscGVyLnRvQWJzb2x1dGUocmVmKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFBvc2l0aW9uWFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjgwMTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSVZhbElEOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiBmb3IgaG9yaXpvbnRhbCB2YWx1ZSBvZiAnYmFja2dyb3VuZC1wb3NpdGlvbicKLSAqLwotcHVibGljIGNsYXNzIEJhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIgaW1wbGVtZW50cyBJU3ViUHJvcGVydHlBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDU1NUZXh0VG9rZW5bXSBjb3JyZWN0TWVhbmluZ1Rva2VuKENTU1RleHRUb2tlbltdIHNyYykgewotCQlqYXZhLnV0aWwuQXJyYXlMaXN0IGxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TICYmIHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCWxpc3QuYWRkKHNyY1tpXSk7Ci0JCX0KLQkJQ1NTVGV4dFRva2VuW10gcmV0ID0gbmV3IENTU1RleHRUb2tlbltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCVN0cmluZyBzdHIgPSBudWxsOwotCQlPYmplY3Qgb2JqID0gcHJvcGVydGllcy5nZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcFggPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCk7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wWSA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWVMaXN0KSB7Ci0JCQkJSUNTU1ZhbHVlTGlzdCBsaXN0ID0gKElDU1NWYWx1ZUxpc3QpIG9iajsKLQkJCQlJQ1NTVmFsdWUgdmFsdWUgPSAoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oMCk7Ci0JCQkJaWYgKHZhbHVlLmdldENzc1ZhbHVlVHlwZSgpID09IENTU1ZhbHVlLkNTU19QUklNSVRJVkVfVkFMVUUpIHsKLQkJCQkJSUNTU1ByaW1pdGl2ZVZhbHVlIHByaW0gPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSB2YWx1ZTsKLQkJCQkJaWYgKHByaW0uZ2V0UHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCkgewotCQkJCQkJLy8gY2hlY2sgbm90IHRvcCBvciBib3R0b20KLQkJCQkJCWlmICghcHJvcFguY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpICYmIHByb3BZLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSkgewotCQkJCQkJCS8vIGNhc2Ugb3JkZXIgaXMgdmVydGljYWwgLT4gaG9yaXpvbnRhbAotCQkJCQkJCXZhbHVlID0gKElDU1NWYWx1ZSkgbGlzdC5pdGVtKDEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXN0ciA9IHZhbHVlLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7Ci0JCQkJc3RyID0gKChJQ1NTVmFsdWUpIG9iaikuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJaWYgKHN0ci5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0JPVFRPTSkgfHwgc3RyLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfVE9QKSkKLQkJCQkJc3RyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHN0cik7Ci0JCQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCi0JCQkJdG9rZW5zID0gY29ycmVjdE1lYW5pbmdUb2tlbih0b2tlbnMpOwotCQkJCWlmICh0b2tlbnMubGVuZ3RoID09IDApCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIGlmICh0b2tlbnMubGVuZ3RoID09IDEgJiYgKHRva2Vuc1swXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0JPVFRPTSkgfHwgdG9rZW5zWzBdLmltYWdlLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfVE9QKSkpCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQllbHNlCi0JCQkJCXN0ciA9IHRva2Vuc1swXS5pbWFnZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IG51bGw7Ci0JCVN0cmluZyB2YWxIID0gdmFsdWU7Ci0JCVN0cmluZyB2YWxWID0gcHJvcGVydGllcy5nZXRCYWNrZ3JvdW5kUG9zaXRpb25ZKCk7Ci0JCWlmICh2YWxWID09IG51bGwgfHwgdmFsVi5sZW5ndGgoKSA9PSAwKQotCQkJbmV3VmFsdWUgPSB2YWxIOwotCQllbHNlIGlmICh2YWxIID09IG51bGwgfHwgdmFsSC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlDb2xsZWN0aW9uIHZhbFggPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCkuZ2V0VmFsdWVzKCk7Ci0JCQlDb2xsZWN0aW9uIHZhbFkgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSkuZ2V0VmFsdWVzKCk7Ci0JCQlQcm9wQ01VdGlsLm1pbnVzKHZhbFksIHZhbFgpOwotCQkJSXRlcmF0b3IgaXQgPSB2YWxZLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqLnRvU3RyaW5nKCkuZXF1YWxzKHZhbFYudG9Mb3dlckNhc2UoKSkpIHsKLQkJCQkJLy8gbmVlZCBub3QgY29tcGVuc2F0ZSBmb3IgLi4uCi0JCQkJCW5ld1ZhbHVlID0gdmFsVjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJLy8gY29tcGVuc2F0ZSBmb3IgSG9yaXpvbnRhbCB2YWx1ZQotCQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkvLyBjaGVjayB2YWxWIGlzIGxlbmd0aCBvciBub3QKLQkJCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgdmFsVi50cmltKCkpOwotCQkJCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJCQlpZiAodG9rZW5zICE9IG51bGwgJiYgdG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJCW5ld1ZhbHVlID0gSVZhbElELlZfTEVGVCArICIgIiArIHZhbFY7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlCi0JCQkJCW5ld1ZhbHVlID0gIjAlICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlCi0JCQluZXdWYWx1ZSA9IHZhbEggKyAiICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJcHJvcGVydGllcy5zZXRCYWNrZ3JvdW5kUG9zaXRpb24obmV3VmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFBvc2l0aW9uWVN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDhkZjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSVZhbElEOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiBmb3IgdmVydGljYWwgdmFsdWUgb2YgJ2JhY2tncm91bmQtcG9zaXRpb24nCi0gKi8KLXB1YmxpYyBjbGFzcyBCYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyIGltcGxlbWVudHMgSVN1YlByb3BlcnR5QWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQmFja2dyb3VuZFBvc2l0aW9uWVN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTVGV4dFRva2VuW10gY29ycmVjdE1lYW5pbmdUb2tlbihDU1NUZXh0VG9rZW5bXSBzcmMpIHsKLQkJamF2YS51dGlsLkFycmF5TGlzdCBsaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUyAmJiBzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQlsaXN0LmFkZChzcmNbaV0pOwotCQl9Ci0JCUNTU1RleHRUb2tlbltdIHJldCA9IG5ldyBDU1NUZXh0VG9rZW5bbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJT2JqZWN0IG9iaiA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTikpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCVByb3BDTVByb3BlcnR5IHByb3BYID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpOwotCQkJUHJvcENNUHJvcGVydHkgcHJvcFkgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlTGlzdCkgewotCQkJCUlDU1NWYWx1ZUxpc3QgbGlzdCA9IChJQ1NTVmFsdWVMaXN0KSBvYmo7Ci0JCQkJaW50IGluZGV4ID0gMTsKLQkJCQlJQ1NTVmFsdWUgdmFsdWUgPSAoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oMCk7Ci0JCQkJaWYgKHZhbHVlLmdldENzc1ZhbHVlVHlwZSgpID09IENTU1ZhbHVlLkNTU19QUklNSVRJVkVfVkFMVUUpIHsKLQkJCQkJSUNTU1ByaW1pdGl2ZVZhbHVlIHByaW0gPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSB2YWx1ZTsKLQkJCQkJaWYgKHByaW0uZ2V0UHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCkgewotCQkJCQkJLy8gY2hlY2sgbm90IHRvcCBvciBib3R0b20KLQkJCQkJCWlmICghcHJvcFguY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpICYmIHByb3BZLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSkgewotCQkJCQkJCS8vIGNhc2Ugb3JkZXIgaXMgdmVydGljYWwgLT4gaG9yaXpvbnRhbAotCQkJCQkJCWluZGV4ID0gMDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlzdHIgPSAoKElDU1NWYWx1ZSkgbGlzdC5pdGVtKGluZGV4KSkuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWUpIHsKLQkJCQlzdHIgPSAoKElDU1NWYWx1ZSkgb2JqKS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJCQlpZiAoIXN0ci5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0JPVFRPTSkgJiYgIXN0ci5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX1RPUCkpCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0ciA9IG9iai50b1N0cmluZygpOwotCQkJCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzdHIpOwotCQkJCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQotCQkJCXRva2VucyA9IGNvcnJlY3RNZWFuaW5nVG9rZW4odG9rZW5zKTsKLQkJCQlpZiAodG9rZW5zLmxlbmd0aCA9PSAxICYmICh0b2tlbnNbMF0uaW1hZ2UuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9CT1RUT00pIHx8IHRva2Vuc1swXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX1RPUCkpKQotCQkJCQlzdHIgPSB0b2tlbnNbMF0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAodG9rZW5zLmxlbmd0aCA+IDEpCi0JCQkJCXN0ciA9IHRva2Vuc1sxXS5pbWFnZTsKLQkJCQllbHNlCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IG51bGw7Ci0JCVN0cmluZyB2YWxIID0gcHJvcGVydGllcy5nZXRCYWNrZ3JvdW5kUG9zaXRpb25YKCk7Ci0JCVN0cmluZyB2YWxWID0gdmFsdWU7Ci0JCWlmICh2YWxIICE9IG51bGwgJiYgKHZhbEgudHJpbSgpLmVxdWFscygiMCUiKSAvKiBkZWZhdWx0IHZhbHVlICovfHwgLy8kTk9OLU5MUy0xJAotCQkJCQl2YWxILnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0xFRlQpIC8qCi0JCQkJCQkJCQkJCQkJCQkJICogYW5vdGhlcgotCQkJCQkJCQkJCQkJCQkJCSAqIGRlZmF1bHQKLQkJCQkJCQkJCQkJCQkJCQkgKiB2YWx1ZQotCQkJCQkJCQkJCQkJCQkJCSAqLykpCi0JCQl2YWxIID0gbnVsbDsKLQkJaWYgKHZhbFYgPT0gbnVsbCB8fCB2YWxWLmxlbmd0aCgpID09IDApCi0JCQluZXdWYWx1ZSA9IHZhbEg7Ci0JCWVsc2UgaWYgKHZhbEggPT0gbnVsbCB8fCB2YWxILmxlbmd0aCgpID09IDApIHsKLQkJCUNvbGxlY3Rpb24gdmFsWCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKS5nZXRWYWx1ZXMoKTsKLQkJCUNvbGxlY3Rpb24gdmFsWSA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKS5nZXRWYWx1ZXMoKTsKLQkJCVByb3BDTVV0aWwubWludXModmFsWSwgdmFsWCk7Ci0JCQlJdGVyYXRvciBpdCA9IHZhbFkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCWlmIChvYmoudG9TdHJpbmcoKS5lcXVhbHModmFsVi50b0xvd2VyQ2FzZSgpKSkgewotCQkJCQkvLyBuZWVkIG5vdCBjb21wZW5zYXRlIGZvciAuLi4KLQkJCQkJbmV3VmFsdWUgPSB2YWxWOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjb21wZW5zYXRlIGZvciBIb3Jpem9udGFsIHZhbHVlCi0JCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIHZhbFYgaXMgbGVuZ3RoIG9yIG5vdAotCQkJCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCB2YWxWLnRyaW0oKSk7Ci0JCQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQkJCWlmICh0b2tlbnMgIT0gbnVsbCAmJiB0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQkJbmV3VmFsdWUgPSBJVmFsSUQuVl9MRUZUICsgIiAiICsgdmFsVjsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UKLQkJCQkJbmV3VmFsdWUgPSAiMCUgIiArIHZhbFY7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCW5ld1ZhbHVlID0gdmFsSCArICIgIiArIHZhbFY7Ly8kTk9OLU5MUy0xJAotCQlwcm9wZXJ0aWVzLnNldEJhY2tncm91bmRQb3NpdGlvbihuZXdWYWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhZDI5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYmFja2dyb3VuZCcgcHJvcGVydHkgJ2JhY2tncm91bmQnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdiYWNrZ3JvdW5kLWF0dGFjaG1lbnQnLCAnYmFja2dyb3VuZC1jb2xvcicsICdiYWNrZ3JvdW5kLWltYWdlJywKLSAqICdiYWNrZ3JvdW5kLXBvc2l0aW9uJywgJ2JhY2tncm91bmQtcmVwZWF0JywKLSAqLwotcHVibGljIGNsYXNzIEJhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIGltYWdlID0gIiIsIHJlcGVhdCA9ICIiLCBhdHRhY2ggPSAiIiwgcG9zID0gIiI7Ly8kTk9OLU5MUy01JC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEltYWdlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0lNQUdFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFJlcGVhdCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19SRVBFQVQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQXR0YWNoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUG9zID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wSW1hZ2UuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wUmVwZWF0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJcmVwZWF0ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BBdHRhY2guY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlhdHRhY2ggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFBvcy5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQkJaWYgKHBvcyA9PSBudWxsIHx8IHBvcy5sZW5ndGgoKSA8PSAwKQotCQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlCi0JCQkJCQlwb3MgPSBwb3MgKyAiICIgKyB0b2tlbnNbaV0uaW1hZ2U7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKSB7Ci0JCQkJaWYgKHBvcyA9PSBudWxsIHx8IHBvcy5sZW5ndGgoKSA8PSAwKQotCQkJCQlwb3MgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZQotCQkJCQlwb3MgPSBwb3MgKyAiICIgKyB0b2tlbnNbaV0uaW1hZ2U7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSkgewotCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BJbWFnZS5nZXROYW1lKCksIGltYWdlKTsKLQkJZGVzdC5zZXQocHJvcFJlcGVhdC5nZXROYW1lKCksIHJlcGVhdCk7Ci0JCWRlc3Quc2V0KHByb3BBdHRhY2guZ2V0TmFtZSgpLCBhdHRhY2gpOwotCQlkZXN0LnNldChwcm9wUG9zLmdldE5hbWUoKSwgcG9zKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gbnVsbCwgaW1hZ2UgPSBudWxsLCByZXBlYXQgPSBudWxsLCBhdHRhY2ggPSBudWxsLCBwb3MgPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wSW1hZ2UgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfSU1BR0UpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUmVwZWF0ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1JFUEVBVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BBdHRhY2ggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQVRUQUNITUVOVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BQb3MgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BJbWFnZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BSZXBlYXQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlyZXBlYXQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcEF0dGFjaC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWF0dGFjaCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wUG9zLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkgewotCQkJCQlpZiAocG9zID09IG51bGwpCi0JCQkJCQlwb3MgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UKLQkJCQkJCXBvcyA9IHBvcyArICIgIiArIHRva2Vuc1tpXS5pbWFnZTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpIHsKLQkJCQlpZiAocG9zID09IG51bGwpCi0JCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlCi0JCQkJCXBvcyA9IHBvcyArICIgIiArIHRva2Vuc1tpXS5pbWFnZTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKSB7Ci0JCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BJbWFnZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBpbWFnZTsKLQkJZWxzZSBpZiAocHJvcFJlcGVhdCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiByZXBlYXQ7Ci0JCWVsc2UgaWYgKHByb3BBdHRhY2ggPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gYXR0YWNoOwotCQllbHNlIGlmIChwcm9wUG9zID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHBvczsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJCb3R0b21TaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMDdlMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLWJvdHRvbScgcHJvcGVydHkgJ2JvcmRlci1ib3R0b20nIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItYm90dG9tLWNvbG9yJywgJ2JvcmRlci1ib3R0b20tc3R5bGUnLCAnYm9yZGVyLWJvdHRvbS13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJCb3R0b21TaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSAiIiwgc3R5bGUgPSAiIiwgd2lkdGggPSAiIjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BDb2xvci5nZXROYW1lKCksIGNvbG9yKTsKLQkJZGVzdC5zZXQocHJvcFN0eWxlLmdldE5hbWUoKSwgc3R5bGUpOwotCQlkZXN0LnNldChwcm9wV2lkdGguZ2V0TmFtZSgpLCB3aWR0aCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9IG51bGwsIHN0eWxlID0gbnVsbCwgd2lkdGggPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BDb2xvciA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBjb2xvcjsKLQkJZWxzZSBpZiAocHJvcFN0eWxlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHN0eWxlOwotCQllbHNlIGlmIChwcm9wV2lkdGggPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gd2lkdGg7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJDb2xvclNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJDb2xvclNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjYzY3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQ29sb3JTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci1jb2xvcicgcHJvcGVydHkgJ2JvcmRlci1jb2xvcicgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JvcmRlci10b3AtY29sb3InLCAnYm9yZGVyLXJpZ2h0LWNvbG9yJywgJ2JvcmRlci1ib3R0b20tY29sb3InLAotICogJ2JvcmRlci1sZWZ0LWNvbG9yJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJDb2xvclNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJaWRlbnRzW2orK10gPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmdbXSBkZXN0cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoaiA9PSAxKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzFdID0gZGVzdHNbMl0gPSBkZXN0c1szXSA9IGlkZW50c1swXTsKLQkJfQotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMl0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJZGVzdHNbMF0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQkJZGVzdHNbMl0gPSBpZGVudHNbMl07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKLQkJCQlkZXN0c1trXSA9IGlkZW50c1trXTsKLQkJfQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IsIGRlc3RzWzBdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IsIGRlc3RzWzFdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SLCBkZXN0c1syXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IsIGRlc3RzWzNdKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWlkZW50c1tqKytdID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChqID09IDEpCi0JCQlyZXR1cm4gaWRlbnRzWzBdOwotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SIHx8IHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1szXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiNzIzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLWxlZnQnIHByb3BlcnR5ICdib3JkZXItbGVmdCcgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JvcmRlci1sZWZ0LWNvbG9yJywgJ2JvcmRlci1sZWZ0LXN0eWxlJywgJ2JvcmRlci1sZWZ0LXdpZHRoJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIHN0eWxlID0gIiIsIHdpZHRoID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BTdHlsZS5nZXROYW1lKCksIHN0eWxlKTsKLQkJZGVzdC5zZXQocHJvcFdpZHRoLmdldE5hbWUoKSwgd2lkdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBzdHlsZSA9IG51bGwsIHdpZHRoID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFdpZHRoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdpZHRoOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYTVmYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclJpZ2h0U2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItcmlnaHQnIHByb3BlcnR5ICdib3JkZXItcmlnaHQnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItcmlnaHQtY29sb3InLCAnYm9yZGVyLXJpZ2h0LXN0eWxlJywgJ2JvcmRlci1yaWdodC13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJSaWdodFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIHN0eWxlID0gIiIsIHdpZHRoID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BTdHlsZS5nZXROYW1lKCksIHN0eWxlKTsKLQkJZGVzdC5zZXQocHJvcFdpZHRoLmdldE5hbWUoKSwgd2lkdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBzdHlsZSA9IG51bGwsIHdpZHRoID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFdpZHRoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdpZHRoOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI3MThhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXInIHByb3BlcnR5ICdib3JkZXInIHdpbGwgYmUgZXhwYW5kZWQgdG8gJ2JvcmRlci1jb2xvcicsCi0gKiAnYm9yZGVyLXN0eWxlJywgJ2JvcmRlci13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlclNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSAiIiwgc3R5bGUgPSAiIiwgd2lkdGggPSAiIjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BDb2xvci5nZXROYW1lKCksIGNvbG9yKTsKLQkJZGVzdC5zZXQocHJvcFN0eWxlLmdldE5hbWUoKSwgc3R5bGUpOwotCQlkZXN0LnNldChwcm9wV2lkdGguZ2V0TmFtZSgpLCB3aWR0aCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9IG51bGwsIHN0eWxlID0gbnVsbCwgd2lkdGggPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BDb2xvciA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBjb2xvcjsKLQkJZWxzZSBpZiAocHJvcFN0eWxlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHN0eWxlOwotCQllbHNlIGlmIChwcm9wV2lkdGggPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gd2lkdGg7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0MDljMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci1zdHlsZScgcHJvcGVydHkgJ2JvcmRlci1zdHlsZScgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JvcmRlci10b3Atc3R5bGUnLCAnYm9yZGVyLXJpZ2h0LXN0eWxlJywgJ2JvcmRlci1ib3R0b20tc3R5bGUnLAotICogJ2JvcmRlci1sZWZ0LXN0eWxlJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlclN0eWxlU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZ1tdIGRlc3RzID0gbmV3IFN0cmluZ1s0XTsKLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChqID09IDEpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMV0gPSBkZXN0c1syXSA9IGRlc3RzWzNdID0gaWRlbnRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJZGVzdHNbMF0gPSBkZXN0c1syXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlkZXN0c1swXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCQlkZXN0c1syXSA9IGlkZW50c1syXTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCWRlc3RzW2tdID0gaWRlbnRzW2tdOwotCQl9Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSwgZGVzdHNbMF0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSwgZGVzdHNbMV0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUsIGRlc3RzWzJdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSwgZGVzdHNbM10pOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoaiA9PSAxKQotCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSB8fCBwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbM107Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyVG9wU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODczOGY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci10b3AnIHByb3BlcnR5ICdib3JkZXItdG9wJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLXRvcC1jb2xvcicsICdib3JkZXItdG9wLXN0eWxlJywgJ2JvcmRlci10b3Atd2lkdGgnLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyVG9wU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIHN0eWxlID0gIiIsIHdpZHRoID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BTdHlsZS5nZXROYW1lKCksIHN0eWxlKTsKLQkJZGVzdC5zZXQocHJvcFdpZHRoLmdldE5hbWUoKSwgd2lkdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBzdHlsZSA9IG51bGwsIHdpZHRoID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFdpZHRoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdpZHRoOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyV2lkdGhTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyV2lkdGhTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOThlYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItd2lkdGgnIHByb3BlcnR5ICdib3JkZXItd2lkdGgnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItdG9wLXdpZHRoJywgJ2JvcmRlci1yaWdodC13aWR0aCcsICdib3JkZXItYm90dG9tLXdpZHRoJywKLSAqICdib3JkZXItbGVmdC13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyV2lkdGhTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmdbXSBkZXN0cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoaiA9PSAxKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzFdID0gZGVzdHNbMl0gPSBkZXN0c1szXSA9IGlkZW50c1swXTsKLQkJfQotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMl0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJZGVzdHNbMF0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQkJZGVzdHNbMl0gPSBpZGVudHNbMl07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKLQkJCQlkZXN0c1trXSA9IGlkZW50c1trXTsKLQkJfQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgsIGRlc3RzWzBdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgsIGRlc3RzWzFdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRILCBkZXN0c1syXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgsIGRlc3RzWzNdKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGogPT0gMSkKLQkJCXJldHVybiBpZGVudHNbMF07Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEggfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzNdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ1NTUHJvcGVydHlDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ1NTUHJvcGVydHlDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiODNhOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NTU1Byb3BlcnR5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVN1YlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTUHJvcGVydHlDb250ZXh0IGltcGxlbWVudHMgSUNTUzJQcm9wZXJ0aWVzIHsKLQotCXByb3RlY3RlZCBIYXNodGFibGUgZlByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JSGFzaFNldCBmTW9kaWZpZWQgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgc3ViUHJvcGVydHlBZGFwdGVyczsKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIHNob3J0aGFuZEFkYXB0ZXJzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU1Byb3BlcnR5Q29udGV4dCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdFNob3J0aGFuZEFkYXB0ZXJzKCk7Ci0JCWluaXRTdWJQcm9wZXJ0eUFkYXB0ZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU1Byb3BlcnR5Q29udGV4dChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRTaG9ydGhhbmRBZGFwdGVycygpOwotCQlpbml0U3ViUHJvcGVydHlBZGFwdGVycygpOwotCQlpbml0aWFsaXplKGRlY2wpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gZXhwb3J0cyBhbGwgcHJvcGVydHkvdmFsdWUgcGFpcnMgdG8gJ2RlY2wnIGRlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHlGdWxsKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRW51bWVyYXRpb24ga2V5cyA9IGZQcm9wZXJ0aWVzLmtleXMoKTsKLQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCU9iamVjdCBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQlPYmplY3QgdmFsID0gZlByb3BlcnRpZXMuZ2V0KGtleSk7Ci0JCQlTdHJpbmcgdmFsdWUgPSAodmFsIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSA/ICgoSUNTU1ZhbHVlKSB2YWwpLmdldENTU1ZhbHVlVGV4dCgpIDogdmFsLnRvU3RyaW5nKCk7Ci0KLQkJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpIDw9IDApCi0JCQkJZGVjbC5yZW1vdmVQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSk7Ci0JCQllbHNlCi0JCQkJZGVjbC5zZXRQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSwgdmFsdWUudHJpbSgpLCAodmFsIGluc3RhbmNlb2YgVmFsdWVEYXRhICYmICgoVmFsdWVEYXRhKSB2YWwpLmltcG9ydGFudCkgPyAiIWltcG9ydGFudCIgOiAiIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gZXhwb3J0cyBtb2RpZmllZCBwcm9wZXJ0eS92YWx1ZSBwYWlycyB0byAnZGVjbCcKLQkgKiBkZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5TW9kaWZpZWQoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsIHx8IGZNb2RpZmllZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IGZNb2RpZmllZC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qga2V5ID0gaXQubmV4dCgpOwotCQkJT2JqZWN0IHZhbCA9IGZQcm9wZXJ0aWVzLmdldChrZXkpOwotCQkJU3RyaW5nIHZhbHVlID0gKHZhbCBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgPyAoKElDU1NWYWx1ZSkgdmFsKS5nZXRDU1NWYWx1ZVRleHQoKSA6ICgodmFsICE9IG51bGwpID8gdmFsLnRvU3RyaW5nKCkgOiBudWxsKTsKLQotCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPD0gMCkKLQkJCQlkZWNsLnJlbW92ZVByb3BlcnR5KGtleS50b1N0cmluZygpKTsKLQkJCWVsc2UKLQkJCQlkZWNsLnNldFByb3BlcnR5KGtleS50b1N0cmluZygpLCB2YWx1ZS50cmltKCksICh2YWwgaW5zdGFuY2VvZiBWYWx1ZURhdGEgJiYgKChWYWx1ZURhdGEpIHZhbCkuaW1wb3J0YW50KSA/ICIhaW1wb3J0YW50IiA6ICIiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGNsb25lIG9mIHRoaXMgY29udGV4dAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCUNTU1Byb3BlcnR5Q29udGV4dCBjbG9uZSA9IG5ldyBDU1NQcm9wZXJ0eUNvbnRleHQoKTsKLQkJaWYgKHRoaXMuZk1vZGlmaWVkICE9IG51bGwpCi0JCQljbG9uZS5mTW9kaWZpZWQgPSAoSGFzaFNldCkgdGhpcy5mTW9kaWZpZWQuY2xvbmUoKTsKLQkJZWxzZQotCQkJY2xvbmUuZk1vZGlmaWVkID0gbnVsbDsKLQkJY2xvbmUuZlByb3BlcnRpZXMgPSAoSGFzaHRhYmxlKSB0aGlzLmZQcm9wZXJ0aWVzLmNsb25lKCk7Ci0JCXJldHVybiBjbG9uZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSBzaG9ydC1oYW5kIHByb3BlcnR5J3MgdmFsdWUgdG8gZWFjaCBsZWFmCi0JICogcHJvcGVydHkncyB2YWx1ZSBhbmQgc2V0IHRoZW0gdG8gJ2ZvcmVpZ24nCi0JICogCi0JICogRm9yIGV4YW1wbGUsIGdpdmVuIFtwcm9wPWJvcmRlci10b3AsIHZhbHVlPSJzb2xpZCAxcHggeWVsbG93Il0gd2lsbCBiZQotCSAqIGV4cGFuZGVkIHRvIFtib3JkZXItdG9wLWNvbG9yPXllbGxvdywgYm9yZGVyLXRvcC1zdHlsZT1zb2xpZCwKLQkgKiBib3JkZXItdG9wLXdpZHRoPTFweF0gYW5kIHRoZXkgYXJlIHN0b3JlZCB0byAnZm9yZWlnbicgY29udGV4dC4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgcmVjdXJzaXZlbHkgc2hvcnRoYW5kZWQgcHJvcGVydHkgbGlrZSAnYm9yZGVyJyB3aWxsIGJlCi0JICogZXhwYW5kZWQgdG8gYWxsIGRlc2NlbmRhbnQgbGVhZiBwcm9wZXJ0aWVzIGxpa2UKLQkgKiAnYm9yZGVyLVt0b3AvcmlnaHQvYm90dG9tL2xlZnRdLVtjb2xvci9zdHlsZS93aWR0aF0nCi0JICogCi0JICogQHBhcmFtIHByb3AKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHkKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZm9yZWlnbgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb24uQ1NTUHJvcGVydHlDb250ZXh0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGV4cGFuZFRvTGVhZihQcm9wQ01Qcm9wZXJ0eSBwcm9wLCBTdHJpbmcgdmFsdWUsIENTU1Byb3BlcnR5Q29udGV4dCBmb3JlaWduKSB7Ci0JCS8vIGV4cGFuZCBzaG9ydGhhbmQgcHJvcGVydHkKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJSVNob3J0aGFuZEFkYXB0ZXIgYWRhcHRlciA9IChJU2hvcnRoYW5kQWRhcHRlcikgc2hvcnRoYW5kQWRhcHRlcnMuZ2V0KHByb3ApOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIuZXhwYW5kKHZhbHVlLCBmb3JlaWduKTsKLQkJCQlmb3JlaWduLnNldChwcm9wLmdldE5hbWUoKSwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3AuZ2V0TnVtQ2hpbGQoKTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBvYmogPSBwcm9wLmdldENoaWxkQXQoaSk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9wQ01Qcm9wZXJ0eSAmJiAhKG9iaiBpbnN0YW5jZW9mIFByb3BDTVN1YlByb3BlcnR5KSkgewotCQkJCQkJUHJvcENNUHJvcGVydHkgZXhwYW5kZWRQcm9wID0gKFByb3BDTVByb3BlcnR5KSBvYmo7Ci0JCQkJCQl2YWx1ZSA9IGZvcmVpZ24uZ2V0KGV4cGFuZGVkUHJvcC5nZXROYW1lKCkpOwotCQkJCQkJZXhwYW5kVG9MZWFmKGV4cGFuZGVkUHJvcCwgdmFsdWUsIGZvcmVpZ24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoIXZhbHVlLmVxdWFscyhmb3JlaWduLmdldChwcm9wLmdldE5hbWUoKSkpKSB7Ci0JCQkJZm9yZWlnbi5zZXQocHJvcC5nZXROYW1lKCksIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZSBvZiAncHJvcCcuIFF1ZXJ5aW5nIHZhbHVlIG1lY2hhbmlzbSBjaGVja3MKLQkgKiBzaG9ydC1oYW5kIHByb3BlcnRpZXMuCi0JICogCi0JICogRm9yIGV4YW1wbGUsIGdpdmVuICJiYWNrZ3JvdW5kPWZpeGVkIHdoaXRlIiBpcyBzZXQgaW4gdGhpcyBpbnNhdG5jZSBhbmQKLQkgKiBwYXJhbSAicHJvcD1iYWNrZ3JvdW5kLWNvbG9yIiwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlICJ3aGl0ZSIuCi0JICogCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0KG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHkgcHJvcCkgewotCQlpZiAocHJvcCBpbnN0YW5jZW9mIFByb3BDTVN1YlByb3BlcnR5KSB7Ci0JCQlJU3ViUHJvcGVydHlBZGFwdGVyIGFkYXB0ZXIgPSAoSVN1YlByb3BlcnR5QWRhcHRlcikgc3ViUHJvcGVydHlBZGFwdGVycy5nZXQocHJvcC5nZXROYW1lKCkpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYWRhcHRlci5nZXQodGhpcyk7Ci0JCX0KLQkJU3RyaW5nIHN0ciA9IGdldChwcm9wLmdldE5hbWUoKSk7Ci0JCWlmICgoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApICYmIHByb3AuZ2V0U2hvcnRoYW5kQ29udGFpbmVyQ291bnQoKSA+IDApIHsKLQkJCS8vIGdldCBleHBhbmRlZCBwcm9wZXJ0eQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wLmdldFNob3J0aGFuZENvbnRhaW5lckNvdW50KCk7IGkrKykgewotCQkJCVByb3BDTVByb3BlcnR5IHByb3BQYXJlbnQgPSBwcm9wLnNob3J0aGFuZENvbnRhaW5lckF0KGkpOwotCQkJCVN0cmluZyBzdHJQYXJlbnQgPSBnZXQocHJvcFBhcmVudCk7Ci0JCQkJaWYgKHN0clBhcmVudCAhPSBudWxsICYmIHN0clBhcmVudC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCUlTaG9ydGhhbmRBZGFwdGVyIGFkYXB0ZXIgPSAoSVNob3J0aGFuZEFkYXB0ZXIpIHNob3J0aGFuZEFkYXB0ZXJzLmdldChwcm9wUGFyZW50KTsKLQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGV4dHJhY3RlZFZhbHVlID0gYWRhcHRlci5leHRyYWN0KHN0clBhcmVudCwgcHJvcCk7Ci0JCQkJCQlyZXR1cm4gKGV4dHJhY3RlZFZhbHVlICE9IG51bGwpID8gZXh0cmFjdGVkVmFsdWUgOiAiIjsvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdmFsdWUgb2YgJ3Byb3AnLiBRdWVyeWluZyB2YWx1ZSBtZWNoYW5pc20gZG9lcwotCSAqIG5vdCBjYXJlIHNob3J0aGFuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0KFN0cmluZyBwcm9wTmFtZSkgewotCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJT2JqZWN0IG9iaiA9IGZQcm9wZXJ0aWVzLmdldChwcm9wTmFtZSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZSkKLQkJCQlzdHIgPSAoKElDU1NWYWx1ZSkgb2JqKS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJCWVsc2UKLQkJCQlzdHIgPSBvYmoudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGF6aW11dGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBemltdXRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9BWklNVVRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJhY2tncm91bmQtYXR0YWNobWVudCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmRBdHRhY2htZW50KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19BVFRBQ0hNRU5UKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kLWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kLWltYWdlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kSW1hZ2UoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kLXBvc2l0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kUG9zaXRpb24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QmFja2dyb3VuZFBvc2l0aW9uWCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCkpOwotCQkvKgotCQkgKiBTdHJpbmcgc3RyID0gbnVsbDsgT2JqZWN0IG9iaiA9Ci0JCSAqIGZQcm9wZXJ0aWVzLmdldChQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKTsgaWYgKG9iaiAhPSBudWxsKSB7Ci0JCSAqIFByb3BDTVByb3BlcnR5IHByb3BYID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpOwotCQkgKiBQcm9wQ01Qcm9wZXJ0eSBwcm9wWSA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKTsKLQkJICogaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZUxpc3QpIHsgSUNTU1ZhbHVlTGlzdCBsaXN0ID0KLQkJICogKElDU1NWYWx1ZUxpc3QpIG9iajsgSUNTU1ZhbHVlIHZhbHVlID0gKElDU1NWYWx1ZSkgbGlzdC5pdGVtKDApOyBpZgotCQkgKiAodmFsdWUuZ2V0Q3NzVmFsdWVUeXBlKCkgPT0gQ1NTVmFsdWUuQ1NTX1BSSU1JVElWRV9WQUxVRSkgewotCQkgKiBJQ1NTUHJpbWl0aXZlVmFsdWUgcHJpbSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIHZhbHVlOyBpZgotCQkgKiAocHJpbS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UKSB7IC8vIGNoZWNrCi0JCSAqIG5vdCB0b3Agb3IgYm90dG9tIGlmICghcHJvcFguY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpICYmCi0JCSAqIHByb3BZLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSkgeyAvLyBjYXNlIG9yZGVyIGlzIHZlcnRpY2FsIC0+Ci0JCSAqIGhvcml6b250YWwgdmFsdWUgPSAoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oMSk7IH0gfSB9IHN0ciA9Ci0JCSAqIHZhbHVlLmdldENTU1ZhbHVlVGV4dCgpOyB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgeyBzdHIgPQotCQkgKiAoKElDU1NWYWx1ZSlvYmopLmdldENTU1ZhbHVlVGV4dCgpOyB9IGVsc2Ugc3RyID0gb2JqLnRvU3RyaW5nKCk7IH0KLQkJICogcmV0dXJuIChzdHIgIT0gbnVsbCkgPyBzdHIgOiAiIjsKLQkJICovCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QmFja2dyb3VuZFBvc2l0aW9uWSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSkpOwotCQkvKgotCQkgKiBTdHJpbmcgc3RyID0gbnVsbDsgT2JqZWN0IG9iaiA9Ci0JCSAqIGZQcm9wZXJ0aWVzLmdldChQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKTsgaWYgKG9iaiAhPSBudWxsKSB7Ci0JCSAqIFByb3BDTVByb3BlcnR5IHByb3BYID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpOwotCQkgKiBQcm9wQ01Qcm9wZXJ0eSBwcm9wWSA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKTsKLQkJICogaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZUxpc3QpIHsgSUNTU1ZhbHVlTGlzdCBsaXN0ID0KLQkJICogKElDU1NWYWx1ZUxpc3QpIG9iajsgaW50IGluZGV4ID0gMTsgSUNTU1ZhbHVlIHZhbHVlID0gKElDU1NWYWx1ZSkKLQkJICogbGlzdC5pdGVtKDApOyBpZiAodmFsdWUuZ2V0Q3NzVmFsdWVUeXBlKCkgPT0KLQkJICogQ1NTVmFsdWUuQ1NTX1BSSU1JVElWRV9WQUxVRSkgeyBJQ1NTUHJpbWl0aXZlVmFsdWUgcHJpbSA9Ci0JCSAqIChJQ1NTUHJpbWl0aXZlVmFsdWUpIHZhbHVlOyBpZiAocHJpbS5nZXRQcmltaXRpdmVUeXBlKCkgPT0KLQkJICogQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UKSB7IC8vIGNoZWNrIG5vdCB0b3Agb3IgYm90dG9tIGlmCi0JCSAqICghcHJvcFguY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpICYmCi0JCSAqIHByb3BZLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSkgeyAvLyBjYXNlIG9yZGVyIGlzIHZlcnRpY2FsIC0+Ci0JCSAqIGhvcml6b250YWwgaW5kZXggPSAwOyB9IH0gfSBzdHIgPQotCQkgKiAoKElDU1NWYWx1ZSlsaXN0Lml0ZW0oaW5kZXgpKS5nZXRDU1NWYWx1ZVRleHQoKTsgfSBlbHNlIGlmIChvYmoKLQkJICogaW5zdGFuY2VvZiBJQ1NTVmFsdWUpIHsgLy8gZG8gbm90aGluZyAtLS0gdmFsdWUgaXMgbnVsbCB9IGVsc2Ugc3RyID0KLQkJICogb2JqLnRvU3RyaW5nKCk7IH0gcmV0dXJuIChzdHIgIT0gbnVsbCkgPyBzdHIgOiAiIjsKLQkJICovCi0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kLXJlcGVhdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmRSZXBlYXQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1JFUEVBVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXIoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWJvdHRvbSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyQm90dG9tKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItYm90dG9tLWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJCb3R0b21Db2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWJvdHRvbS1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyQm90dG9tU3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1ib3R0b20td2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckJvdHRvbVdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItY29sbGFwc2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckNvbGxhcHNlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MTEFQU0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyQ29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWxlZnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckxlZnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItbGVmdC1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyTGVmdENvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWxlZnQtc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckxlZnRTdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1sZWZ0LXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJMZWZ0V2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItcmlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclJpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1yaWdodC1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyUmlnaHRDb2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItcmlnaHQtc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclJpZ2h0U3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXJpZ2h0LXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJSaWdodFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1zcGFjaW5nIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJTcGFjaW5nKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1BBQ0lORykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJTdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItdG9wIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJUb3AoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1ApKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci10b3AtY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclRvcENvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItdG9wLXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJUb3BTdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXRvcC13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyVG9wV2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyV2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm90dG9tIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3R0b20oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPVFRPTSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY2FwdGlvbi1zaWRlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXB0aW9uU2lkZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0FQVElPTl9TSURFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjbGVhciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xlYXIoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMRUFSKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjbGlwIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGlwKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGlwQm90dG9tKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0JPVFRPTSkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpcExlZnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfTEVGVCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpcFJpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGlwVG9wKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY29udGVudCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09OVEVOVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY291bnRlci1pbmNyZW1lbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvdW50ZXJJbmNyZW1lbnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPVU5URVJfSU5DUkVNRU5UKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjb3VudGVyLXJlc2V0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb3VudGVyUmVzZXQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPVU5URVJfUkVTRVQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZsb2F0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDc3NGbG9hdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRkxPQVQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGN1ZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGN1ZS1hZnRlciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VlQWZ0ZXIoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9BRlRFUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY3VlLWJlZm9yZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VlQmVmb3JlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQkVGT1JFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjdXJzb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnNvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VSU09SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBkaXJlY3Rpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpcmVjdGlvbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRElSRUNUSU9OKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBkaXNwbGF5IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVNQTEFZKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBlbGV2YXRpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZXZhdGlvbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRUxFVkFUSU9OKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBlbXB0eS1jZWxscyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW1wdHlDZWxscygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRU1QVFlfQ0VMTFMpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtZmFtaWx5IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250RmFtaWx5KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC1zaXplIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250U2l6ZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LXNpemUtYWRqdXN0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250U2l6ZUFkanVzdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFX0FESlVTVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC1zdHJldGNoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250U3RyZXRjaCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFJFVENIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250U3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtdmFyaWFudCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFZhcmlhbnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC13ZWlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRXZWlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBoZWlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfSEVJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBsZWZ0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZWZ0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MRUZUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBsZXR0ZXItc3BhY2luZyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGV0dGVyU3BhY2luZygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTEVUVEVSX1NQQUNJTkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxpbmUtaGVpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaW5lSGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSU5FX0hFSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbGlzdC1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlzdFN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBsaXN0LXN0eWxlLWltYWdlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXN0U3R5bGVJbWFnZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbGlzdC1zdHlsZS1wb3NpdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlzdFN0eWxlUG9zaXRpb24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxpc3Qtc3R5bGUtdHlwZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlzdFN0eWxlVHlwZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9UWVBFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJnaW4gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJnaW4tYm90dG9tIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJnaW5Cb3R0b20oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmdpbi1sZWZ0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJnaW5MZWZ0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWFyZ2luLXJpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJnaW5SaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJnaW4tdG9wIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJnaW5Ub3AoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1ApKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmtlci1vZmZzZXQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmtlck9mZnNldCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS0VSX09GRlNFVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWFya3MgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmtzKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJLUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWF4LWhlaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWF4SGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVhfSEVJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXgtd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1heFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVhfV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1pbi1oZWlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pbkhlaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUlOX0hFSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWluLXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNaW5XaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUlOX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBvcnBoYW5zIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcnBoYW5zKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PUlBIQU5TKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBvdXRsaW5lIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRsaW5lKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBvdXRsaW5lLWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRsaW5lQ29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG91dGxpbmUtc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE91dGxpbmVTdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgb3V0bGluZS13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0bGluZVdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBvdmVyZmxvdyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3ZlcmZsb3coKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09WRVJGTE9XKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWRkaW5nIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWRkaW5nKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWRkaW5nLWJvdHRvbSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFkZGluZ0JvdHRvbSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZGRpbmctbGVmdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFkZGluZ0xlZnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfTEVGVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFkZGluZy1yaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFkZGluZ1JpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1JJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWRkaW5nLXRvcCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFkZGluZ1RvcCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZ2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2UoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZ2UtYnJlYWstYWZ0ZXIgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VCcmVha0FmdGVyKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0FGVEVSKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWdlLWJyZWFrLWJlZm9yZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUJyZWFrQmVmb3JlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0JFRk9SRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFnZS1icmVhay1pbnNpZGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VCcmVha0luc2lkZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19JTlNJREUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhdXNlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXVzZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhdXNlLWFmdGVyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXVzZUFmdGVyKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRV9BRlRFUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGF1c2UtYmVmb3JlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXVzZUJlZm9yZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0VfQkVGT1JFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwaXRjaCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGl0Y2goKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BJVENIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwaXRjaC1yYW5nZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGl0Y2hSYW5nZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUElUQ0hfUkFOR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBsYXktZHVyaW5nIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbGF5RHVyaW5nKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QTEFZX0RVUklORykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcG9zaXRpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvc2l0aW9uKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QT1NJVElPTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcXVvdGVzIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdW90ZXMoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1FVT1RFUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcmljaG5lc3MgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJpY2huZXNzKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9SSUNITkVTUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcmlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9SSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb24uSVNob3J0aGFuZEFkYXB0ZXIKLQkgKiBAcGFyYW0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNob3J0aGFuZEFkYXB0ZXIgZ2V0U2hvcnRoYW5kQWRhcHRlcihQcm9wQ01Qcm9wZXJ0eSBwcm9wKSB7Ci0JCXJldHVybiAoSVNob3J0aGFuZEFkYXB0ZXIpIHNob3J0aGFuZEFkYXB0ZXJzLmdldChwcm9wKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHNpemUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNpemUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NJWkUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHNwZWFrIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVhaygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUspKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHNwZWFrLWhlYWRlciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYWtIZWFkZXIoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX0hFQURFUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgc3BlYWstbnVtZXJhbCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYWtOdW1lcmFsKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19OVU1FUkFMKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBzcGVhay1wdW5jdHVhdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYWtQdW5jdHVhdGlvbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfUFVOQ1RVQVRJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHNwZWVjaC1yYXRlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVlY2hSYXRlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVFQ0hfUkFURSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgc3RyZXNzIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJlc3MoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NUUkVTUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdGFibGUtbGF5b3V0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZUxheW91dCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEFCTEVfTEFZT1VUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB0ZXh0LWFsaWduIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfQUxJR04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRleHQtZGVjb3JhdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dERlY29yYXRpb24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfREVDT1JBVElPTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdGV4dC1pbmRlbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRJbmRlbnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfSU5ERU5UKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB0ZXh0LXNoYWRvdyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFNoYWRvdygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9TSEFET1cpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRleHQtdHJhbnNmb3JtIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0VHJhbnNmb3JtKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX1RSQU5TRk9STSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdG9wIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb3AoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RPUCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdW5pY29kZS1iaWRpIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbmljb2RlQmlkaSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVU5JQ09ERV9CSURJKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB2ZXJ0aWNhbC1hbGlnbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVydGljYWxBbGlnbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVkVSVElDQUxfQUxJR04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHZpc2liaWxpdHkgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZpc2liaWxpdHkoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZJU0lCSUxJVFkpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHZvaWNlLWZhbWlseSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Vm9pY2VGYW1pbHkoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZPSUNFX0ZBTUlMWSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdm9sdW1lIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWb2x1bWUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZPTFVNRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgd2hpdGUtc3BhY2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdoaXRlU3BhY2UoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dISVRFX1NQQUNFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB3aWRvd3MgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpZG93cygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0lET1dTKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB3aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB3b3JkLXNwYWNpbmcgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdvcmRTcGFjaW5nKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XT1JEX1NQQUNJTkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHotaW5kZXggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFpJbmRleCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfWl9JTkRFWCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlmUHJvcGVydGllcy5jbGVhcigpOwotCQlpZiAoZk1vZGlmaWVkICE9IG51bGwpCi0JCQlmTW9kaWZpZWQuY2xlYXIoKTsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpbnQgblByb3BlcnRpZXMgPSBkZWNsLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5Qcm9wZXJ0aWVzOyBpKyspIHsKLQkJCVN0cmluZyBwcm9wTmFtZSA9IGRlY2wuaXRlbShpKTsKLQkJCWlmIChwcm9wTmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHByb3BOID0gcHJvcE5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaWYgKHByb3BOLmxlbmd0aCgpICE9IDApIHsKLQkJCQkJQ1NTVmFsdWUgdmFsID0gZGVjbC5nZXRQcm9wZXJ0eUNTU1ZhbHVlKHByb3BOYW1lKTsKLQkJCQkJaWYgKHZhbCAhPSBudWxsKQotCQkJCQkJZlByb3BlcnRpZXMucHV0KHByb3BOLCB2YWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyB2b2lkIGluaXRTaG9ydGhhbmRBZGFwdGVycygpIHsKLQkJaWYgKHNob3J0aGFuZEFkYXB0ZXJzID09IG51bGwpIHsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJLy8gcmVnaXN0ZXIKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkcpLCBuZXcgQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUiksIG5ldyBCb3JkZXJTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpLCBuZXcgQm9yZGVyQ29sb3JTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpLCBuZXcgQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpLCBuZXcgQm9yZGVyV2lkdGhTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QKSwgbmV3IEJvcmRlclRvcFNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVCksIG5ldyBCb3JkZXJSaWdodFNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT00pLCBuZXcgQm9yZGVyQm90dG9tU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlQpLCBuZXcgQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpLCBuZXcgRm9udFNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEUpLCBuZXcgTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOKSwgbmV3IE1hcmdpblNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkcpLCBuZXcgUGFkZGluZ1Nob3J0aGFuZEFkYXB0ZXIoKSk7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyB2b2lkIGluaXRTdWJQcm9wZXJ0eUFkYXB0ZXJzKCkgewotCQlpZiAoc3ViUHJvcGVydHlBZGFwdGVycyA9PSBudWxsKSB7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCQkvLyByZWdpc3RlcgotCQkJc3ViUHJvcGVydHlBZGFwdGVycy5wdXQoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YLCBuZXcgQmFja2dyb3VuZFBvc2l0aW9uWFN1YlN0eWxlQWRhcHRlcigpKTsKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMucHV0KFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSwgbmV3IEJhY2tncm91bmRQb3NpdGlvbllTdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QLCBuZXcgQ2xpcFRvcFN1YlN0eWxlQWRhcHRlcigpKTsKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMucHV0KFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCwgbmV3IENsaXBSaWdodFN1YlN0eWxlQWRhcHRlcigpKTsKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMucHV0KFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00sIG5ldyBDbGlwQm90dG9tU3ViU3R5bGVBZGFwdGVyKCkpOwotCQkJc3ViUHJvcGVydHlBZGFwdGVycy5wdXQoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQsIG5ldyBDbGlwTGVmdFN1YlN0eWxlQWRhcHRlcigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0JCXJldHVybiAoZk1vZGlmaWVkICE9IG51bGwgJiYgZk1vZGlmaWVkLnNpemUoKSAhPSAwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gcHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGZQcm9wZXJ0aWVzLmtleXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgcHJvcGVydGllc01vZGlmaWVkKCkgewotCQlpZiAoZk1vZGlmaWVkICE9IG51bGwpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb24pIGZNb2RpZmllZC5jbG9uZSgpKS5pdGVyYXRvcigpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCX0KLQkJCX07Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBleHBhbmRzIHRoZSB2YWx1ZSBvZiBzaG9ydGhhbmQgJ3Byb3AnIHRvICdmb3JlaWduJwotCSAqIGNvbnRleHQuIE5vdGUgdGhhdCBpZiB0aGlzIGhhcyBwYXJlbnQgc2hvcnRoYW5kIHByb3BlcnRpZXMgb2YgJ3Byb3AnLAotCSAqIHRoZXkgYXJlIGFsbCBleHBhbmRlZCB0byAnZm9yZWlnbicgY29udGV4dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWN1cnNpdmVFeHRyYWN0KFByb3BDTVByb3BlcnR5IHByb3AsIENTU1Byb3BlcnR5Q29udGV4dCBmb3JlaWduKSB7Ci0JCS8vIGV4cGFuZCBzaG9ydGhhbmQgcHJvcGVydHkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wLmdldFNob3J0aGFuZENvbnRhaW5lckNvdW50KCk7IGkrKykgewotCQkJcmVjdXJzaXZlRXh0cmFjdChwcm9wLnNob3J0aGFuZENvbnRhaW5lckF0KGkpLCBmb3JlaWduKTsKLQkJfQotCQlTdHJpbmcgc3RyID0gZ2V0KHByb3AuZ2V0TmFtZSgpKTsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCXN0ciA9IGZvcmVpZ24uZ2V0KHByb3AuZ2V0TmFtZSgpKTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlJU2hvcnRoYW5kQWRhcHRlciBhZGFwdGVyID0gKElTaG9ydGhhbmRBZGFwdGVyKSBzaG9ydGhhbmRBZGFwdGVycy5nZXQocHJvcCk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci5leHBhbmQoc3RyLCBmb3JlaWduKTsKLQkJCQlmb3JlaWduLnNldChwcm9wLmdldE5hbWUoKSwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURlc2NlbmRhbnRzKFByb3BDTVByb3BlcnR5IHByb3ApIHsKLQkJaWYgKHByb3AuaXNTaG9ydGhhbmQoKSkgewotCQkJLy8gcmVtb3ZlIHByb3BlcnRpZXMKLQkJCWludCBuID0gcHJvcC5nZXROdW1DaGlsZCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gcHJvcC5nZXRDaGlsZEF0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9wQ01Qcm9wZXJ0eSkgewotCQkJCQlyZW1vdmVEZXNjZW5kYW50cygoUHJvcENNUHJvcGVydHkpIG9iaik7Ci0KLQkJCQkJU3RyaW5nIHN0ciA9IGdldChvYmoudG9TdHJpbmcoKSk7Ci0JCQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKQotCQkJCQkJc2V0KG9iai50b1N0cmluZygpLCAiIik7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0TW9kaWZpZWQoKSB7Ci0JCWlmIChmTW9kaWZpZWQgIT0gbnVsbCkKLQkJCWZNb2RpZmllZC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcGFpciBvZiAncHJvcCcvJ3ZhbHVlJy4gSWYgc2hvcnRoYW5kIHByb3BlcnRpZXMKLQkgKiByZWxhdGVkIHRvICdwcm9wJyBhcmUgYWxyZWFkeSBkZWZpbmVkLCB0aGV5IHdpbGwgYmUgZXhwYW5kZWQgdG8gYXZvaWQKLQkgKiBwcm9wZXJ0eSBjb25mbGljdGlvbi4gSWYgZGVzY2VuZGFudCBwcm9wZXJ0aWVzIG9mICdwcm9wJyBhcmUgYWxyZWFkeQotCSAqIGRlZmluZWQsIHRoZXkgd2lsbCBiZSByZW1vdmVkIHRvIGF2b2lkIHByb3BlcnR5IGNvbmZsaWN0aW9uLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5IHByb3AsIGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAocHJvcCBpbnN0YW5jZW9mIFByb3BDTVN1YlByb3BlcnR5KSB7Ci0JCQlJU3ViUHJvcGVydHlBZGFwdGVyIGFkYXB0ZXIgPSAoSVN1YlByb3BlcnR5QWRhcHRlcikgc3ViUHJvcGVydHlBZGFwdGVycy5nZXQocHJvcC5nZXROYW1lKCkpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIuc2V0KHRoaXMsIHZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb3AuZ2V0U2hvcnRoYW5kQ29udGFpbmVyQ291bnQoKSA+IDApIHsKLQkJCS8vIGV4cGFuZCBzaG9ydGhhbmQgcHJvcGVydHkKLQkJCUNTU1Byb3BlcnR5Q29udGV4dCBjb250ZXh0ID0gbmV3IENTU1Byb3BlcnR5Q29udGV4dCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wLmdldFNob3J0aGFuZENvbnRhaW5lckNvdW50KCk7IGkrKykgewotCQkJCXJlY3Vyc2l2ZUV4dHJhY3QocHJvcC5zaG9ydGhhbmRDb250YWluZXJBdChpKSwgY29udGV4dCk7Ci0JCQl9Ci0JCQlFbnVtZXJhdGlvbiBwcm9wZXJ0aWVzID0gY29udGV4dC5wcm9wZXJ0aWVzKCk7Ci0JCQl3aGlsZSAocHJvcGVydGllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyBwcm9wRm9yZWlnbiA9IHByb3BlcnRpZXMubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCXNldChwcm9wRm9yZWlnbiwgY29udGV4dC5nZXQocHJvcEZvcmVpZ24pKTsKLQkJCX0KLQkJfQotCi0JCXJlbW92ZURlc2NlbmRhbnRzKHByb3ApOwotCi0JCXNldChwcm9wLmdldE5hbWUoKSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcGFpciBvZiAncHJvcE5hbWUnLyd2YWx1ZScgcmVnYXJkbGVzcyBvZiBpdHMKLQkgKiBzaG9ydGhhbmQgcHJvcGVydGllcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXQoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcga2V5ID0gcHJvcE5hbWU7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJZlByb3BlcnRpZXMucmVtb3ZlKGtleSk7Ci0JCWVsc2UKLQkJCWZQcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLQkJaWYgKGZNb2RpZmllZCA9PSBudWxsKQotCQkJZk1vZGlmaWVkID0gbmV3IEhhc2hTZXQoKTsKLQkJZk1vZGlmaWVkLmFkZChrZXkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF6aW11dGgoU3RyaW5nIGF6aW11dGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0FaSU1VVEgpLCBhemltdXRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKFN0cmluZyBiYWNrZ3JvdW5kKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CRyksIGJhY2tncm91bmQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRBdHRhY2htZW50KFN0cmluZyBiYWNrZ3JvdW5kQXR0YWNobWVudCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQVRUQUNITUVOVCksIGJhY2tncm91bmRBdHRhY2htZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoU3RyaW5nIGJhY2tncm91bmRDb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQ09MT1IpLCBiYWNrZ3JvdW5kQ29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRJbWFnZShTdHJpbmcgYmFja2dyb3VuZEltYWdlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19JTUFHRSksIGJhY2tncm91bmRJbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZFBvc2l0aW9uKFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKSwgYmFja2dyb3VuZFBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kUG9zaXRpb25YKGphdmEubGFuZy5TdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uWCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCksIGJhY2tncm91bmRQb3NpdGlvblgpOwotCQkvKgotCQkgKiBTdHJpbmcgbmV3VmFsdWUgPSBudWxsOyBTdHJpbmcgdmFsSCA9IGJhY2tncm91bmRQb3NpdGlvblg7IFN0cmluZwotCQkgKiB2YWxWID0gZ2V0QmFja2dyb3VuZFBvc2l0aW9uWSgpOyBpZiAodmFsViA9PSBudWxsIHx8Ci0JCSAqIHZhbFYubGVuZ3RoKCk9PSAwKSBuZXdWYWx1ZSA9IHZhbEg7IGVsc2UgaWYgKHZhbEggPT0gbnVsbCB8fAotCQkgKiB2YWxILmxlbmd0aCgpID09IDApIHsgQ29sbGVjdGlvbiB2YWxYID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpLmdldFZhbHVlcygpOwotCQkgKiBDb2xsZWN0aW9uIHZhbFkgPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSkuZ2V0VmFsdWVzKCk7Ci0JCSAqIFByb3BDTVV0aWwubWludXModmFsWSx2YWxYKTsgSXRlcmF0b3IgaXQgPSB2YWxZLml0ZXJhdG9yKCk7Ci0JCSAqIHdoaWxlKGl0Lmhhc05leHQoKSkgeyBPYmplY3Qgb2JqID0gaXQubmV4dCgpOyBpZgotCQkgKiAob2JqLnRvU3RyaW5nKCkuZXF1YWxzKHZhbFYudG9Mb3dlckNhc2UoKSkpIHsgLy8gbmVlZCBub3QKLQkJICogY29tcGVuc2F0ZSBmb3IgLi4uIG5ld1ZhbHVlID0gdmFsVjsgYnJlYWs7IH0gfSAvLyBjb21wZW5zYXRlIGZvcgotCQkgKiBIb3Jpem9udGFsIHZhbHVlIGlmIChuZXdWYWx1ZSA9PSBudWxsKSBuZXdWYWx1ZSA9ICIwJSAiICsgdmFsVjsgfQotCQkgKiBlbHNlIG5ld1ZhbHVlID0gdmFsSCArICIgIiArIHZhbFY7IHNldEJhY2tncm91bmRQb3NpdGlvbihuZXdWYWx1ZSk7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRQb3NpdGlvblkoamF2YS5sYW5nLlN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb25ZKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKSwgYmFja2dyb3VuZFBvc2l0aW9uWSk7Ci0JCS8qCi0JCSAqIFN0cmluZyBuZXdWYWx1ZSA9IG51bGw7IFN0cmluZyB2YWxIID0gZ2V0QmFja2dyb3VuZFBvc2l0aW9uWCgpOwotCQkgKiBTdHJpbmcgdmFsViA9IGJhY2tncm91bmRQb3NpdGlvblk7IGlmICh2YWxWID09IG51bGwgfHwKLQkJICogdmFsVi5sZW5ndGgoKT09IDApIG5ld1ZhbHVlID0gdmFsSDsgZWxzZSBpZiAodmFsSCA9PSBudWxsIHx8Ci0JCSAqIHZhbEgubGVuZ3RoKCkgPT0gMCkgeyBDb2xsZWN0aW9uIHZhbFggPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCkuZ2V0VmFsdWVzKCk7Ci0JCSAqIENvbGxlY3Rpb24gdmFsWSA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKS5nZXRWYWx1ZXMoKTsKLQkJICogUHJvcENNVXRpbC5taW51cyh2YWxZLHZhbFgpOyBJdGVyYXRvciBpdCA9IHZhbFkuaXRlcmF0b3IoKTsKLQkJICogd2hpbGUoaXQuaGFzTmV4dCgpKSB7IE9iamVjdCBvYmogPSBpdC5uZXh0KCk7IGlmCi0JCSAqIChvYmoudG9TdHJpbmcoKS5lcXVhbHModmFsVi50b0xvd2VyQ2FzZSgpKSkgeyAvLyBuZWVkIG5vdAotCQkgKiBjb21wZW5zYXRlIGZvciAuLi4gbmV3VmFsdWUgPSB2YWxWOyBicmVhazsgfSB9IC8vIGNvbXBlbnNhdGUgZm9yCi0JCSAqIEhvcml6b250YWwgdmFsdWUgaWYgKG5ld1ZhbHVlID09IG51bGwpIG5ld1ZhbHVlID0gIjAlICIgKyB2YWxWOyB9Ci0JCSAqIGVsc2UgbmV3VmFsdWUgPSB2YWxIICsgIiAiICsgdmFsVjsgc2V0QmFja2dyb3VuZFBvc2l0aW9uKG5ld1ZhbHVlKTsKLQkJICovCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZFJlcGVhdChTdHJpbmcgYmFja2dyb3VuZFJlcGVhdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUkVQRUFUKSwgYmFja2dyb3VuZFJlcGVhdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyKFN0cmluZyBib3JkZXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUiksIGJvcmRlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyQm90dG9tKFN0cmluZyBib3JkZXJCb3R0b20pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT00pLCBib3JkZXJCb3R0b20pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckJvdHRvbUNvbG9yKFN0cmluZyBib3JkZXJCb3R0b21Db2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUiksIGJvcmRlckJvdHRvbUNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJCb3R0b21TdHlsZShTdHJpbmcgYm9yZGVyQm90dG9tU3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpLCBib3JkZXJCb3R0b21TdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyQm90dG9tV2lkdGgoU3RyaW5nIGJvcmRlckJvdHRvbVdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKSwgYm9yZGVyQm90dG9tV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckNvbGxhcHNlKFN0cmluZyBib3JkZXJDb2xsYXBzZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTExBUFNFKSwgYm9yZGVyQ29sbGFwc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckNvbG9yKFN0cmluZyBib3JkZXJDb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKSwgYm9yZGVyQ29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckxlZnQoU3RyaW5nIGJvcmRlckxlZnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUKSwgYm9yZGVyTGVmdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyTGVmdENvbG9yKFN0cmluZyBib3JkZXJMZWZ0Q29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKSwgYm9yZGVyTGVmdENvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJMZWZ0U3R5bGUoU3RyaW5nIGJvcmRlckxlZnRTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpLCBib3JkZXJMZWZ0U3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckxlZnRXaWR0aChTdHJpbmcgYm9yZGVyTGVmdFdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCksIGJvcmRlckxlZnRXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyUmlnaHQoU3RyaW5nIGJvcmRlclJpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFQpLCBib3JkZXJSaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyUmlnaHRDb2xvcihTdHJpbmcgYm9yZGVyUmlnaHRDb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKSwgYm9yZGVyUmlnaHRDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyUmlnaHRTdHlsZShTdHJpbmcgYm9yZGVyUmlnaHRTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKSwgYm9yZGVyUmlnaHRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyUmlnaHRXaWR0aChTdHJpbmcgYm9yZGVyUmlnaHRXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKSwgYm9yZGVyUmlnaHRXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyU3BhY2luZyhTdHJpbmcgYm9yZGVyU3BhY2luZykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NQQUNJTkcpLCBib3JkZXJTcGFjaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJTdHlsZShTdHJpbmcgYm9yZGVyU3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSksIGJvcmRlclN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJUb3AoU3RyaW5nIGJvcmRlclRvcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUCksIGJvcmRlclRvcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyVG9wQ29sb3IoU3RyaW5nIGJvcmRlclRvcENvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKSwgYm9yZGVyVG9wQ29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclRvcFN0eWxlKFN0cmluZyBib3JkZXJUb3BTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSksIGJvcmRlclRvcFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJUb3BXaWR0aChTdHJpbmcgYm9yZGVyVG9wV2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpLCBib3JkZXJUb3BXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyV2lkdGgoU3RyaW5nIGJvcmRlcldpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpLCBib3JkZXJXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm90dG9tKFN0cmluZyBib3R0b20pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPVFRPTSksIGJvdHRvbSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FwdGlvblNpZGUoU3RyaW5nIGNhcHRpb25TaWRlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DQVBUSU9OX1NJREUpLCBjYXB0aW9uU2lkZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xlYXIoU3RyaW5nIGNsZWFyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTEVBUiksIGNsZWFyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGlwKFN0cmluZyBjbGlwKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSwgY2xpcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpcEJvdHRvbShqYXZhLmxhbmcuU3RyaW5nIGNsaXApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKSwgY2xpcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpcExlZnQoamF2YS5sYW5nLlN0cmluZyBjbGlwKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQpLCBjbGlwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGlwUmlnaHQoamF2YS5sYW5nLlN0cmluZyBjbGlwKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hUKSwgY2xpcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpcFRvcChqYXZhLmxhbmcuU3RyaW5nIGNsaXApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QKSwgY2xpcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sb3IoU3RyaW5nIGNvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT0xPUiksIGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KFN0cmluZyBjb250ZW50KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT05URU5UKSwgY29udGVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q291bnRlckluY3JlbWVudChTdHJpbmcgY291bnRlckluY3JlbWVudCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09VTlRFUl9JTkNSRU1FTlQpLCBjb3VudGVySW5jcmVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3VudGVyUmVzZXQoU3RyaW5nIGNvdW50ZXJSZXNldCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09VTlRFUl9SRVNFVCksIGNvdW50ZXJSZXNldCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3NzRmxvYXQoU3RyaW5nIGNzc0Zsb2F0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GTE9BVCksIGNzc0Zsb2F0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdWUoU3RyaW5nIGN1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFKSwgY3VlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdWVBZnRlcihTdHJpbmcgY3VlQWZ0ZXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9BRlRFUiksIGN1ZUFmdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdWVCZWZvcmUoU3RyaW5nIGN1ZUJlZm9yZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0JFRk9SRSksIGN1ZUJlZm9yZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3Vyc29yKFN0cmluZyBjdXJzb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVUlNPUiksIGN1cnNvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0aW9uKFN0cmluZyBkaXJlY3Rpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0RJUkVDVElPTiksIGRpcmVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheShTdHJpbmcgZGlzcGxheSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRElTUExBWSksIGRpc3BsYXkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZXZhdGlvbihTdHJpbmcgZWxldmF0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9FTEVWQVRJT04pLCBlbGV2YXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVtcHR5Q2VsbHMoU3RyaW5nIGVtcHR5Q2VsbHMpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0VNUFRZX0NFTExTKSwgZW1wdHlDZWxscyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udChTdHJpbmcgZm9udCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVCksIGZvbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRGYW1pbHkoU3RyaW5nIGZvbnRGYW1pbHkpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKSwgZm9udEZhbWlseSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udFNpemUoU3RyaW5nIGZvbnRTaXplKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUpLCBmb250U2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udFNpemVBZGp1c3QoU3RyaW5nIGZvbnRTaXplQWRqdXN0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkVfQURKVVNUKSwgZm9udFNpemVBZGp1c3QpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRTdHJldGNoKFN0cmluZyBmb250U3RyZXRjaCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFJFVENIKSwgZm9udFN0cmV0Y2gpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRTdHlsZShTdHJpbmcgZm9udFN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKSwgZm9udFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250VmFyaWFudChTdHJpbmcgZm9udFZhcmlhbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCksIGZvbnRWYXJpYW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250V2VpZ2h0KFN0cmluZyBmb250V2VpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCksIGZvbnRXZWlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhlaWdodChTdHJpbmcgaGVpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9IRUlHSFQpLCBoZWlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlZnQoU3RyaW5nIGxlZnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xFRlQpLCBsZWZ0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXR0ZXJTcGFjaW5nKFN0cmluZyBsZXR0ZXJTcGFjaW5nKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MRVRURVJfU1BBQ0lORyksIGxldHRlclNwYWNpbmcpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmVIZWlnaHQoU3RyaW5nIGxpbmVIZWlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJTkVfSEVJR0hUKSwgbGluZUhlaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdFN0eWxlKFN0cmluZyBsaXN0U3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEUpLCBsaXN0U3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZUltYWdlKFN0cmluZyBsaXN0U3R5bGVJbWFnZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSksIGxpc3RTdHlsZUltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0U3R5bGVQb3NpdGlvbihTdHJpbmcgbGlzdFN0eWxlUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pLCBsaXN0U3R5bGVQb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdFN0eWxlVHlwZShTdHJpbmcgbGlzdFN0eWxlVHlwZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9UWVBFKSwgbGlzdFN0eWxlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luKFN0cmluZyBtYXJnaW4pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTiksIG1hcmdpbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luQm90dG9tKFN0cmluZyBtYXJnaW5Cb3R0b20pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pLCBtYXJnaW5Cb3R0b20pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmdpbkxlZnQoU3RyaW5nIG1hcmdpbkxlZnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9MRUZUKSwgbWFyZ2luTGVmdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luUmlnaHQoU3RyaW5nIG1hcmdpblJpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fUklHSFQpLCBtYXJnaW5SaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luVG9wKFN0cmluZyBtYXJnaW5Ub3ApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1ApLCBtYXJnaW5Ub3ApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmtlck9mZnNldChTdHJpbmcgbWFya2VyT2Zmc2V0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJLRVJfT0ZGU0VUKSwgbWFya2VyT2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJrcyhTdHJpbmcgbWFya3MpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUktTKSwgbWFya3MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heEhlaWdodChTdHJpbmcgbWF4SGVpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVhfSEVJR0hUKSwgbWF4SGVpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXhXaWR0aChTdHJpbmcgbWF4V2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BWF9XSURUSCksIG1heFdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW5IZWlnaHQoU3RyaW5nIG1pbkhlaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUlOX0hFSUdIVCksIG1pbkhlaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWluV2lkdGgoU3RyaW5nIG1pbldpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NSU5fV0lEVEgpLCBtaW5XaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3JwaGFucyhTdHJpbmcgb3JwaGFucykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1JQSEFOUyksIG9ycGhhbnMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmUoU3RyaW5nIG91dGxpbmUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkUpLCBvdXRsaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lQ29sb3IoU3RyaW5nIG91dGxpbmVDb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9DT0xPUiksIG91dGxpbmVDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZVN0eWxlKFN0cmluZyBvdXRsaW5lU3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfU1RZTEUpLCBvdXRsaW5lU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVXaWR0aChTdHJpbmcgb3V0bGluZVdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1dJRFRIKSwgb3V0bGluZVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVyZmxvdyhTdHJpbmcgb3ZlcmZsb3cpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09WRVJGTE9XKSwgb3ZlcmZsb3cpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZGRpbmcoU3RyaW5nIHBhZGRpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkcpLCBwYWRkaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nQm90dG9tKFN0cmluZyBwYWRkaW5nQm90dG9tKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSksIHBhZGRpbmdCb3R0b20pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZGRpbmdMZWZ0KFN0cmluZyBwYWRkaW5nTGVmdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19MRUZUKSwgcGFkZGluZ0xlZnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZGRpbmdSaWdodChTdHJpbmcgcGFkZGluZ1JpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1JJR0hUKSwgcGFkZGluZ1JpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nVG9wKFN0cmluZyBwYWRkaW5nVG9wKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCksIHBhZGRpbmdUb3ApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZ2UoU3RyaW5nIHBhZ2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0UpLCBwYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWdlQnJlYWtBZnRlcihTdHJpbmcgcGFnZUJyZWFrQWZ0ZXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfQUZURVIpLCBwYWdlQnJlYWtBZnRlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZUJyZWFrQmVmb3JlKFN0cmluZyBwYWdlQnJlYWtCZWZvcmUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfQkVGT1JFKSwgcGFnZUJyZWFrQmVmb3JlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWdlQnJlYWtJbnNpZGUoU3RyaW5nIHBhZ2VCcmVha0luc2lkZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19JTlNJREUpLCBwYWdlQnJlYWtJbnNpZGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdXNlKFN0cmluZyBwYXVzZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0UpLCBwYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF1c2VBZnRlcihTdHJpbmcgcGF1c2VBZnRlcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0VfQUZURVIpLCBwYXVzZUFmdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXVzZUJlZm9yZShTdHJpbmcgcGF1c2VCZWZvcmUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFX0JFRk9SRSksIHBhdXNlQmVmb3JlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQaXRjaChTdHJpbmcgcGl0Y2gpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BJVENIKSwgcGl0Y2gpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBpdGNoUmFuZ2UoU3RyaW5nIHBpdGNoUmFuZ2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BJVENIX1JBTkdFKSwgcGl0Y2hSYW5nZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGxheUR1cmluZyhTdHJpbmcgcGxheUR1cmluZykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUExBWV9EVVJJTkcpLCBwbGF5RHVyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihTdHJpbmcgcG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BPU0lUSU9OKSwgcG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1b3RlcyhTdHJpbmcgcXVvdGVzKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9RVU9URVMpLCBxdW90ZXMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJpY2huZXNzKFN0cmluZyByaWNobmVzcykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklDSE5FU1MpLCByaWNobmVzcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmlnaHQoU3RyaW5nIHJpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9SSUdIVCksIHJpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXplKFN0cmluZyBzaXplKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TSVpFKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlYWsoU3RyaW5nIHNwZWFrKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBSyksIHNwZWFrKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGVha0hlYWRlcihTdHJpbmcgc3BlYWtIZWFkZXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX0hFQURFUiksIHNwZWFrSGVhZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGVha051bWVyYWwoU3RyaW5nIHNwZWFrTnVtZXJhbCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfTlVNRVJBTCksIHNwZWFrTnVtZXJhbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlYWtQdW5jdHVhdGlvbihTdHJpbmcgc3BlYWtQdW5jdHVhdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfUFVOQ1RVQVRJT04pLCBzcGVha1B1bmN0dWF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGVlY2hSYXRlKFN0cmluZyBzcGVlY2hSYXRlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVFQ0hfUkFURSksIHNwZWVjaFJhdGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmVzcyhTdHJpbmcgc3RyZXNzKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TVFJFU1MpLCBzdHJlc3MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlTGF5b3V0KFN0cmluZyB0YWJsZUxheW91dCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEFCTEVfTEFZT1VUKSwgdGFibGVMYXlvdXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRBbGlnbihTdHJpbmcgdGV4dEFsaWduKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0FMSUdOKSwgdGV4dEFsaWduKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0RGVjb3JhdGlvbihTdHJpbmcgdGV4dERlY29yYXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfREVDT1JBVElPTiksIHRleHREZWNvcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0SW5kZW50KFN0cmluZyB0ZXh0SW5kZW50KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0lOREVOVCksIHRleHRJbmRlbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRTaGFkb3coU3RyaW5nIHRleHRTaGFkb3cpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfU0hBRE9XKSwgdGV4dFNoYWRvdyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFRyYW5zZm9ybShTdHJpbmcgdGV4dFRyYW5zZm9ybSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9UUkFOU0ZPUk0pLCB0ZXh0VHJhbnNmb3JtKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb3AoU3RyaW5nIHRvcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVE9QKSwgdG9wKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmljb2RlQmlkaShTdHJpbmcgdW5pY29kZUJpZGkpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1VOSUNPREVfQklESSksIHVuaWNvZGVCaWRpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJ0aWNhbEFsaWduKFN0cmluZyB2ZXJ0aWNhbEFsaWduKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WRVJUSUNBTF9BTElHTiksIHZlcnRpY2FsQWxpZ24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2liaWxpdHkoU3RyaW5nIHZpc2liaWxpdHkpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZJU0lCSUxJVFkpLCB2aXNpYmlsaXR5KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWb2ljZUZhbWlseShTdHJpbmcgdm9pY2VGYW1pbHkpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZPSUNFX0ZBTUlMWSksIHZvaWNlRmFtaWx5KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWb2x1bWUoU3RyaW5nIHZvbHVtZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVk9MVU1FKSwgdm9sdW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaGl0ZVNwYWNlKFN0cmluZyB3aGl0ZVNwYWNlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSElURV9TUEFDRSksIHdoaXRlU3BhY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpZG93cyhTdHJpbmcgd2lkb3dzKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSURPV1MpLCB3aWRvd3MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpZHRoKFN0cmluZyB3aWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0lEVEgpLCB3aWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29yZFNwYWNpbmcoU3RyaW5nIHdvcmRTcGFjaW5nKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XT1JEX1NQQUNJTkcpLCB3b3JkU3BhY2luZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0WkluZGV4KFN0cmluZyB6SW5kZXgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1pfSU5ERVgpLCB6SW5kZXgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwQm90dG9tU3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcEJvdHRvbVN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzBkYWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwQm90dG9tU3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLQotLyoqCi0gKiBGb3IgYm90dG9tIHZhbHVlIG9mICdjbGlwJyBwcm9wZXJ0eSdzIHJlY3QoKSBmdW5jdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ2xpcEJvdHRvbVN1YlN0eWxlQWRhcHRlciBleHRlbmRzIENsaXBTdWJTdHlsZUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldChvcmcudzNjLmRvbS5jc3MuUmVjdCByZWN0KSB7Ci0JCXJldHVybiByZWN0LmdldEJvdHRvbSgpLmdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgaW5kZXgoKSB7Ci0JCXJldHVybiAyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvcCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCkpOwotCQlTdHJpbmcgcmlnaHQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCkpOwotCQlTdHJpbmcgbGVmdCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQpKTsKLQotCQlzZXQocHJvcGVydGllcywgdG9wLCByaWdodCwgdmFsdWUsIGxlZnQsIHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBMZWZ0U3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcExlZnRTdWJTdHlsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyYjk5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcExlZnRTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVN1YlByb3BlcnR5OwotCi0vKioKLSAqIEZvciBsZWZ0IHZhbHVlIG9mICdjbGlwJyBwcm9wZXJ0eSdzIHJlY3QoKSBmdW5jdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ2xpcExlZnRTdWJTdHlsZUFkYXB0ZXIgZXh0ZW5kcyBDbGlwU3ViU3R5bGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDbGlwTGVmdFN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0KG9yZy53M2MuZG9tLmNzcy5SZWN0IHJlY3QpIHsKLQkJcmV0dXJuIHJlY3QuZ2V0TGVmdCgpLmdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgaW5kZXgoKSB7Ci0JCXJldHVybiAzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvcCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCkpOwotCQlTdHJpbmcgcmlnaHQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCkpOwotCQlTdHJpbmcgYm90dG9tID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKSk7Ci0KLQkJc2V0KHByb3BlcnRpZXMsIHRvcCwgcmlnaHQsIGJvdHRvbSwgdmFsdWUsIHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBSaWdodFN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBSaWdodFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQxZTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVN1YlByb3BlcnR5OwotCi0vKioKLSAqIEZvciByaWdodCB2YWx1ZSBvZiAnY2xpcCcgcHJvcGVydHkncyByZWN0KCkgZnVuY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIENsaXBSaWdodFN1YlN0eWxlQWRhcHRlciBleHRlbmRzIENsaXBTdWJTdHlsZUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENsaXBSaWdodFN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0KG9yZy53M2MuZG9tLmNzcy5SZWN0IHJlY3QpIHsKLQkJcmV0dXJuIHJlY3QuZ2V0UmlnaHQoKS5nZXRDc3NUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGluZGV4KCkgewotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b3AgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9UT1ApKTsKLQkJU3RyaW5nIGJvdHRvbSA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0JPVFRPTSkpOwotCQlTdHJpbmcgbGVmdCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQpKTsKLQotCQlzZXQocHJvcGVydGllcywgdG9wLCB2YWx1ZSwgYm90dG9tLCBsZWZ0LCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwU3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmU5NmJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwU3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSVZhbElEOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuUmVjdDsKLQotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIGZvciBjbGlwIHN1Yi1wcm9wZXJ0aWVzCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBDbGlwU3ViU3R5bGVBZGFwdGVyIGltcGxlbWVudHMgSVN1YlByb3BlcnR5QWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ2xpcFN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJT2JqZWN0IG9iaiA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLmNzcy5SZWN0KSB7Ci0JCQkJc3RyID0gZ2V0KChvcmcudzNjLmRvbS5jc3MuUmVjdCkgb2JqKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWUpIHsKLQkJCQkJc3RyID0gKChJQ1NTVmFsdWUpIG9iaikuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdHIgPSBvYmoudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJc3RyID0gc3RyLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCQkJCWludCBwb3MgPSBzdHIuaW5kZXhPZigicmVjdCgiKTsvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQkJCVN0cmluZyBzdWJTdHIgPSBudWxsOwotCQkJCQlwb3MgKz0gNTsKLQkJCQkJaW50IGkgPSAwOwotCQkJCQlkbyB7Ci0JCQkJCQlpbnQgcG9zRW5kID0gc3RyLmluZGV4T2YoIiwiLCBwb3MpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChwb3NFbmQgPCAwKQotCQkJCQkJCXBvc0VuZCA9IHN0ci5pbmRleE9mKCIpIiwgcG9zKTsvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAocG9zRW5kIDwgMCAmJiBwb3MgPCBzdHIubGVuZ3RoKCkpCi0JCQkJCQkJcG9zRW5kID0gc3RyLmxlbmd0aCgpOwotCQkJCQkJaWYgKHBvc0VuZCA+PSBwb3MpIHsKLQkJCQkJCQlzdWJTdHIgPSBzdHIuc3Vic3RyaW5nKHBvcywgcG9zRW5kKTsKLQkJCQkJCQlwb3MgPSBwb3NFbmQgKyAxOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCXBvcyA9IC0xOwotCQkJCQl9Ci0JCQkJCXdoaWxlIChpKysgPCBpbmRleCgpICYmIHBvcyA+IDApOwotCi0JCQkJCWlmIChwb3MgPiAwKQotCQkJCQkJc3RyID0gc3ViU3RyLnRyaW0oKTsKLQkJCQkJZWxzZQotCQkJCQkJc3RyID0gbnVsbDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlzdHIgPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiAoc3RyICE9IG51bGwpID8gc3RyIDogIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWFic3RyYWN0IFN0cmluZyBnZXQoUmVjdCByZWN0KTsKLQotCS8qKgotCSAqIAotCSAqLwotCWFic3RyYWN0IGludCBpbmRleCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMTAvMDQKLQkgKiAxOToyNTo0NikKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydGllcwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb24uSUNTUzJQcm9wZXJ0aWVzCi0JICogQHBhcmFtIHRvcAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByaWdodAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBib3R0b20KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbGVmdAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByZW1vdmVDaGVjawotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdG9wLCBTdHJpbmcgcmlnaHQsIFN0cmluZyBib3R0b20sIFN0cmluZyBsZWZ0LCBib29sZWFuIHJlbW92ZUNoZWNrKSB7Ci0JCWlmICh0b3AgPT0gbnVsbCB8fCB0b3AubGVuZ3RoKCkgPT0gMCkKLQkJCXRvcCA9IElWYWxJRC5WX0FVVE87Ci0JCWlmIChyaWdodCA9PSBudWxsIHx8IHJpZ2h0Lmxlbmd0aCgpID09IDApCi0JCQlyaWdodCA9IElWYWxJRC5WX0FVVE87Ci0JCWlmIChib3R0b20gPT0gbnVsbCB8fCBib3R0b20ubGVuZ3RoKCkgPT0gMCkKLQkJCWJvdHRvbSA9IElWYWxJRC5WX0FVVE87Ci0JCWlmIChsZWZ0ID09IG51bGwgfHwgbGVmdC5sZW5ndGgoKSA9PSAwKQotCQkJbGVmdCA9IElWYWxJRC5WX0FVVE87Ci0KLQkJaWYgKHJlbW92ZUNoZWNrICYmIHRvcC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9BVVRPKSAmJiByaWdodC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9BVVRPKSAmJiBib3R0b20udHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQVVUTykgJiYgbGVmdC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9BVVRPKSkgewotCQkJcHJvcGVydGllcy5zZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApLCBudWxsKTsKLQkJfQotCQllbHNlCi0JCQlwcm9wZXJ0aWVzLnNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCksICJyZWN0KCIgKyB0b3AgKyAiLCAiICsgcmlnaHQgKyAiLCAiICsgYm90dG9tICsgIiwgIiArIGxlZnQgKyAiKSIpOy8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBUb3BTdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwVG9wU3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNWMxMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBUb3BTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVN1YlByb3BlcnR5OwotCi0vKioKLSAqIEZvciB0b3AgdmFsdWUgb2YgJ2NsaXAnIHByb3BlcnR5J3MgcmVjdCgpIGZ1bmN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGlwVG9wU3ViU3R5bGVBZGFwdGVyIGV4dGVuZHMgQ2xpcFN1YlN0eWxlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ2xpcFRvcFN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0KG9yZy53M2MuZG9tLmNzcy5SZWN0IHJlY3QpIHsKLQkJcmV0dXJuIHJlY3QuZ2V0VG9wKCkuZ2V0Q3NzVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBpbmRleCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgcmlnaHQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCkpOwotCQlTdHJpbmcgYm90dG9tID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKSk7Ci0JCVN0cmluZyBsZWZ0ID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfTEVGVCkpOwotCi0JCXNldChwcm9wZXJ0aWVzLCB2YWx1ZSwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vRm9udFNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Gb250U2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg0OGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Gb250U2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLklWYWxJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdmb250JyBwcm9wZXJ0eSAnZm9udCcgd2lsbCBiZSBleHBhbmRlZCB0byAnZm9udC1mYW1pbHknLCAnZm9udC1zaXplJywKLSAqICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdsaW5lLWhlaWdodCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250U2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBGb250U2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBzdHlsZSA9IG51bGwsIHZhcmlhbnQgPSBudWxsLCB3ZWlnaHQgPSBudWxsLCBzaXplID0gbnVsbCwgaGVpZ2h0ID0gbnVsbCwgZmFtaWx5ID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEZvbnQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFZhcmlhbnQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5UKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdlaWdodCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTaXplID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSk7Ci0JCWJvb2xlYW4gYk5vcm1hbFNwZWNpZmllZCA9IGZhbHNlOwotCi0JCWludCBpID0gMDsKLQkJZm9yICg7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQkvLyBmaXJzdCBvZiBhbGwsIGNoZWNrIGZvbnQgaWRlbnRzCi0JCQkJaWYgKGkgPT0gMCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHByb3BGb250LmdldE51bUNoaWxkKCk7IGorKykgewotCQkJCQkJT2JqZWN0IG9iaiA9IHByb3BGb250LmdldENoaWxkQXQoaSk7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nICYmIHRva2Vuc1tpXS5pbWFnZS5jb21wYXJlVG9JZ25vcmVDYXNlKG9iai50b1N0cmluZygpKSA9PSAwKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyB2YWx1ZSAibm9ybWFsIiBpcyBzaGFyZWQgISEKLQkJCQlpZiAodG9rZW5zW2ldLmltYWdlLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfTk9STUFMKSkgewotCQkJCQliTm9ybWFsU3BlY2lmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UgaWYgKHByb3BWYXJpYW50LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXZhcmlhbnQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UgaWYgKHByb3BXZWlnaHQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJd2VpZ2h0ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wU2l6ZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQkJCXNpemUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCQlicmVhazsgLy8gaWYgc2l6ZSBmb3VuZCwgYnJlYWsgbG9vcAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiAmJiB3ZWlnaHQgPT0gbnVsbCAmJiBwcm9wV2VpZ2h0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkgewotCQkJCXdlaWdodCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKSB7Ci0JCQkJc2l6ZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQlicmVhazsgLy8gaWYgc2l6ZSBmb3VuZCwgYnJlYWsgbG9vcAotCQkJfQotCQl9Ci0KLQkJaWYgKGJOb3JtYWxTcGVjaWZpZWQpIHsKLQkJCWlmIChzdHlsZSA9PSBudWxsKQotCQkJCXN0eWxlID0gSVZhbElELlZfTk9STUFMOwotCQkJaWYgKHZhcmlhbnQgPT0gbnVsbCkKLQkJCQl2YXJpYW50ID0gSVZhbElELlZfTk9STUFMOwotCQkJaWYgKHdlaWdodCA9PSBudWxsKQotCQkJCXdlaWdodCA9IElWYWxJRC5WX05PUk1BTDsKLQkJfQotCi0JCS8vIHNraXAgd2hpdGVzcGFjZQotCQlmb3IgKGkrKzsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHRva2Vuc1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gbGluZS1oZWlnaHQgPwotCQlpZiAoaSA8IHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SICYmIHRva2Vuc1tpXS5pbWFnZS5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGkrKzsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQkJaGVpZ2h0ID0gdG9rZW5zW2krK10uaW1hZ2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGZvbnQtZmFtaWx5Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCX0KLQkJZmFtaWx5ID0gYnVmLnRvU3RyaW5nKCkudHJpbSgpOwotCi0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSwgc3R5bGUpOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCwgdmFyaWFudCk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQsIHdlaWdodCk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFLCBzaXplKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9MSU5FX0hFSUdIVCwgaGVpZ2h0KTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSwgZmFtaWx5KTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHN0eWxlID0gbnVsbCwgdmFyaWFudCA9IG51bGwsIHdlaWdodCA9IG51bGwsIHNpemUgPSBudWxsLCBoZWlnaHQgPSBudWxsLCBmYW1pbHkgPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wRm9udCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wVmFyaWFudCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2VpZ2h0ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hUKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFNpemUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEhlaWdodCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSU5FX0hFSUdIVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BGYW1pbHkgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpOwotCQlib29sZWFuIGJOb3JtYWxTcGVjaWZpZWQgPSBmYWxzZTsKLQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJLy8gZmlyc3Qgb2YgYWxsLCBjaGVjayBmb250IGlkZW50cwotCQkJCWlmIChpID09IDApIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm9wRm9udC5nZXROdW1DaGlsZCgpOyBqKyspIHsKLQkJCQkJCU9iamVjdCBvYmogPSBwcm9wRm9udC5nZXRDaGlsZEF0KGkpOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZyAmJiB0b2tlbnNbaV0uaW1hZ2UuY29tcGFyZVRvSWdub3JlQ2FzZShvYmoudG9TdHJpbmcoKSkgPT0gMCkKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyB2YWx1ZSAibm9ybWFsIiBpcyBzaGFyZWQgISEKLQkJCQlpZiAodG9rZW5zW2ldLmltYWdlLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfTk9STUFMKSkgewotCQkJCQliTm9ybWFsU3BlY2lmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UgaWYgKHByb3BWYXJpYW50LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXZhcmlhbnQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UgaWYgKHByb3BXZWlnaHQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJd2VpZ2h0ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wU2l6ZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQkJCXNpemUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCQlicmVhazsgLy8gaWYgc2l6ZSBmb3VuZCwgYnJlYWsgbG9vcAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiAmJiB3ZWlnaHQgPT0gbnVsbCAmJiBwcm9wV2VpZ2h0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkgewotCQkJCXdlaWdodCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKSB7Ci0JCQkJc2l6ZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQlicmVhazsgLy8gaWYgc2l6ZSBmb3VuZCwgYnJlYWsgbG9vcAotCQkJfQotCQl9Ci0KLQkJaWYgKGJOb3JtYWxTcGVjaWZpZWQpIHsKLQkJCWlmIChzdHlsZSA9PSBudWxsKQotCQkJCXN0eWxlID0gSVZhbElELlZfTk9STUFMOwotCQkJaWYgKHZhcmlhbnQgPT0gbnVsbCkKLQkJCQl2YXJpYW50ID0gSVZhbElELlZfTk9STUFMOwotCQkJaWYgKHdlaWdodCA9PSBudWxsKQotCQkJCXdlaWdodCA9IElWYWxJRC5WX05PUk1BTDsKLQkJfQotCi0JCS8vIHNraXAgd2hpdGVzcGFjZQotCQlmb3IgKGkrKzsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHRva2Vuc1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gbGluZS1oZWlnaHQgPwotCQlpZiAoaSA8IHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SICYmIHRva2Vuc1tpXS5pbWFnZS5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGkrKzsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQkJaGVpZ2h0ID0gdG9rZW5zW2krK10uaW1hZ2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGZvbnQtZmFtaWx5Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCX0KLQkJZmFtaWx5ID0gYnVmLnRvU3RyaW5nKCkudHJpbSgpOwotCi0JCWlmIChwcm9wU3R5bGUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc3R5bGU7Ci0JCWVsc2UgaWYgKHByb3BWYXJpYW50ID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHZhcmlhbnQ7Ci0JCWVsc2UgaWYgKHByb3BXZWlnaHQgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gd2VpZ2h0OwotCQllbHNlIGlmIChwcm9wU2l6ZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzaXplOwotCQllbHNlIGlmIChwcm9wSGVpZ2h0ID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGhlaWdodDsKLQkJZWxzZSBpZiAocHJvcEZhbWlseSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBmYW1pbHk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JQ1NTMlByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JQ1NTMlByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmNjQzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSUNTUzJQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTMlByb3BlcnRpZXM7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTMlByb3BlcnRpZXMgZXh0ZW5kcyBDU1MyUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFwcGx5RnVsbChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYXBwbHlNb2RpZmllZChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQoUHJvcENNUHJvcGVydHkgcHJvcCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0QmFja2dyb3VuZFBvc2l0aW9uWCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldEJhY2tncm91bmRQb3NpdGlvblkoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRDbGlwQm90dG9tKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xpcExlZnQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRDbGlwUmlnaHQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRDbGlwVG9wKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzTW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUVudW1lcmF0aW9uIHByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yIHByb3BlcnRpZXNNb2RpZmllZCgpOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZXNldE1vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldChQcm9wQ01Qcm9wZXJ0eSBwcm9wLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldEJhY2tncm91bmRQb3NpdGlvblgoU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0QmFja2dyb3VuZFBvc2l0aW9uWShTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRDbGlwQm90dG9tKFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldENsaXBMZWZ0KFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldENsaXBSaWdodChTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRDbGlwVG9wKFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSVNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWQ0MDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lTdWJQcm9wZXJ0eUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JU3ViUHJvcGVydHlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNjlmMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lTdWJQcm9wZXJ0eUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN1YlByb3BlcnR5QWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0xpc3RTdHlsZVNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxMzI3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdsaXN0LXN0eWxlJyBwcm9wZXJ0eSAnbGlzdC1zdHlsZScgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2xpc3Qtc3R5bGUtaW1hZ2UnLCAnbGlzdC1zdHlsZS1wb3NpdGlvbicsICdsaXN0LXN0eWxlLXR5cGUnLAotICovCi1wdWJsaWMgY2xhc3MgTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBMaXN0U3R5bGVTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGltYWdlID0gIiIsIHBvcyA9ICIiLCB0eXBlID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BQb3MgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9QT1NJVElPTik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BUeXBlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BJbWFnZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX0lNQUdFKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wUG9zLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgeyAvLyB2YWx1ZT0ibm9uZSIgaXMgc2hhcmVkICEhCi0JCQkJCWlmIChwcm9wVHlwZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl0eXBlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQlpZiAocHJvcEltYWdlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpIHsKLQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BQb3MuZ2V0TmFtZSgpLCBwb3MpOwotCQlkZXN0LnNldChwcm9wVHlwZS5nZXROYW1lKCksIHR5cGUpOwotCQlkZXN0LnNldChwcm9wSW1hZ2UuZ2V0TmFtZSgpLCBpbWFnZSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBpbWFnZSA9IG51bGwsIHBvcyA9IG51bGwsIHR5cGUgPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUG9zID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wVHlwZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1RZUEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wSW1hZ2UgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFBvcy5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIHsgLy8gdmFsdWU9Im5vbmUiIGlzIHNoYXJlZCAhIQotCQkJCQlpZiAocHJvcFR5cGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJdHlwZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJaWYgKHByb3BJbWFnZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKSB7Ci0JCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcFBvcyA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBwb3M7Ci0JCWVsc2UgaWYgKHByb3BUeXBlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHR5cGU7Ci0JCWVsc2UgaWYgKHByb3BJbWFnZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBpbWFnZTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL01hcmdpblNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9NYXJnaW5TaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2YxZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL01hcmdpblNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnbWFyZ2luJyBwcm9wZXJ0eSAnbWFyZ2luJyB3aWxsIGJlIGV4cGFuZGVkIHRvICdtYXJnaW4tdG9wJywKLSAqICdtYXJnaW4tcmlnaHQnLCAnbWFyZ2luLWJvdHRvbScsICdtYXJnaW4tbGVmdCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJnaW5TaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE1hcmdpblNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZ1tdIGRlc3RzID0gbmV3IFN0cmluZ1s0XTsKLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChqID09IDEpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMV0gPSBkZXN0c1syXSA9IGRlc3RzWzNdID0gaWRlbnRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJZGVzdHNbMF0gPSBkZXN0c1syXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlkZXN0c1swXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCQlkZXN0c1syXSA9IGlkZW50c1syXTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCWRlc3RzW2tdID0gaWRlbnRzW2tdOwotCQl9Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCwgZGVzdHNbMF0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9SSUdIVCwgZGVzdHNbMV0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00sIGRlc3RzWzJdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCwgZGVzdHNbM10pOwotCi0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChqID09IDEpCi0JCQlyZXR1cm4gaWRlbnRzWzBdOwotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QIHx8IHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1ApCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1ApCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9SSUdIVCkKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0xFRlQpCi0JCQkJcmV0dXJuIGlkZW50c1szXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9QYWRkaW5nU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL1BhZGRpbmdTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMjQzNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL1BhZGRpbmdTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ3BhZGRpbmcnIHByb3BlcnR5ICdwYWRkaW5nJyB3aWxsIGJlIGV4cGFuZGVkIHRvICdwYWRkaW5nLXRvcCcsCi0gKiAncGFkZGluZy1yaWdodCcsICdwYWRkaW5nLWJvdHRvbScsICdwYWRkaW5nLWxlZnQnLAotICovCi1wdWJsaWMgY2xhc3MgUGFkZGluZ1Nob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUGFkZGluZ1Nob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJU3RyaW5nW10gZGVzdHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGogPT0gMSkgewotCQkJZGVzdHNbMF0gPSBkZXN0c1sxXSA9IGRlc3RzWzJdID0gZGVzdHNbM10gPSBpZGVudHNbMF07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzJdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWRlc3RzWzBdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJCWRlc3RzWzJdID0gaWRlbnRzWzJdOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspCi0JCQkJZGVzdHNba10gPSBpZGVudHNba107Ci0JCX0KLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCwgZGVzdHNbMF0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfUklHSFQsIGRlc3RzWzFdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSwgZGVzdHNbMl0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfTEVGVCwgZGVzdHNbM10pOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChqID09IDEpCi0JCQlyZXR1cm4gaWRlbnRzWzBdOwotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCB8fCBwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19SSUdIVCkKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfTEVGVCkKLQkJCQlyZXR1cm4gaWRlbnRzWzNdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vVmFsdWVEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vVmFsdWVEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MjgyZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL1ZhbHVlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFZhbHVlRGF0YSB7Ci0KLQlwdWJsaWMgU3RyaW5nIHZhbHVlOwotCXB1YmxpYyBib29sZWFuIGltcG9ydGFudCA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFZhbHVlRGF0YSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgVmFsdWVEYXRhKFN0cmluZyB2YWwsIGJvb2xlYW4gaW1wKSB7Ci0JCXN1cGVyKCk7Ci0JCXZhbHVlID0gdmFsOwotCQlpbXBvcnRhbnQgPSBpbXA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdGV4dC9JQ1NTUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS90ZXh0L0lDU1NQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNzNkNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS90ZXh0L0lDU1NQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuIEl0IGRlZmluZXMgdGhlCi0gKiBwYXJ0aXRpb25pbmcgZm9yIENTUyBhbmQgYWxsIGl0cyBwYXJ0aXRpb25zLiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlCi0gKiBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NQYXJ0aXRpb25zIHsKLQotCVN0cmluZyBTVFlMRSA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLlNUWUxFIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5jc3MuQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzU1ZWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY29udGVudG1vZGVsLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImVtZm1vZGVsLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNheHBhcnNlci8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtdmFsaWRhdGlvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YTEzOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1ydW50aW1lCi1kdGRjb3JlLmphcgotKi56aXAKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLUBkb3QKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MjQ5ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjliMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotI1NhdCBNYXIgMjQgMDI6MTY6MzIgRURUIDIwMDcNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjODA5MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1dlZCBOb3YgMTUgMDI6MDg6NDUgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTk4ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNXZWQgTm92IDE1IDAyOjA4OjQ1IEVTVCAyMDA2DQotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wDQotY29tcGlsZXJzLnAuYnVpbGQ9MA0KLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQ0KLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTANCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MA0KLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTANCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wDQotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wDQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTENCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTANCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wDQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MA0KLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wDQotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZjZmNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuNTAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRhc2tzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRleHQsCi0gcm9zZQotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnV0aWw7IHZlcnNpb249IjMuOCIsCi0gY29tLmlibS5pY3UudGV4dDsgdmVyc2lvbj0iMy44IgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5OyBleGNsdWRlOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnQiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjMzMmE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgIGNvbnRlbnRtb2RlbC8sXAotICAgICAgICAgICBlbWZtb2RlbC8sXAotICAgICAgICAgICBzYXhwYXJzZXIvLFwKLSAgICAgICAgICAgc3JjLXZhbGlkYXRpb24vCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkYzEyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZCI+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy9kdGQvb3ZlcnZpZXcuaHRtbCIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFREIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmUiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJEVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci08L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRGYWN0b3J5RFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50RmFjdG9yeURURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmU2NGIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRGYWN0b3J5RFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeS5DTURvY3VtZW50RmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGJ1aWxkZXIgaGFuZGxlcyBidWlsZGluZyAuZHRkIGdyYW1tYXIgZmlsZXMKLSAqLwotcHVibGljIGNsYXNzIENNRG9jdW1lbnRGYWN0b3J5RFREIGltcGxlbWVudHMgQ01Eb2N1bWVudEZhY3RvcnkgewotCXB1YmxpYyBDTURvY3VtZW50RmFjdG9yeURURCgpIHsKLQl9Ci0KLQotCXB1YmxpYyBDTURvY3VtZW50IGNyZWF0ZUNNRG9jdW1lbnQoU3RyaW5nIHVyaSkgewotCQkvLyB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBvdXIgcGFyc2VycwotCQkvLyB0b2RvLi4uIHJldmlzaXQgdGhpcwotCQkvLwotLy8JCWh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDA0ODEKLS8vCQlTdHJpbmcgZmlsZVByb3RvY29sID0gImZpbGU6IjsgLy8kTk9OLU5MUy0xJAotLy8JCWlmICh1cmkuc3RhcnRzV2l0aChmaWxlUHJvdG9jb2wpKSB7Ci0vLwkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoZmlsZVByb3RvY29sLmxlbmd0aCgpKTsKLS8vCQl9Ci0KLQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gRFRESW1wbC5idWlsZENNRG9jdW1lbnQodXJpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImNvdWxkIG5vdCBjcmVhdGUgY29udGVudCBtb2RlbCBmb3IgVVJJOiAiICsgdXJpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmU3YzUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENNTm9kZUltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIENNTm9kZSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRE9DVU1FTlRBVElPTiA9ICJkb2N1bWVudGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fU09VUkNFID0gImRvY3VtZW50YXRpb25Tb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9MQU5HVUFHRSA9ICJkb2N1bWVudGF0aW9uTGFuZ3VhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTU9GX05PVElGSUVSID0gImtleSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERUZJTklUSU9OX0lORk8gPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2RlZmluaXRpb25JbmZvIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFRklOSVRJT04gPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2RlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldEtleSgpOwotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9NT0ZfTk9USUZJRVIpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2JqZWN0KSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRFRESW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRFRESW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzBiMDYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0RUREltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGwuRFREQmFzaWNUeXBlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGwuRFREUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTURhdGFUeXBlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRW50aXR5RGVjbGFyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01Ob2RlTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRGVzY3JpcHRpb25CdWlsZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBEVERJbXBsIHsKLQlzdGF0aWMgewotCQkvLyBDYWxsIGluaXQgb24gdGhlIERURCBwYWNrYWdlIHRvIGF2b2lkIHN0cmFuZ2UgaW5pdGlhbGl6YXRpb24gYnVncwotCQkvLwotCQlEVERQYWNrYWdlSW1wbC5pbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEVERBZGFwdGVyRmFjdG9yeUltcGwgZHRkQWRhcHRlckZhY3RvcnlJbXBsID0gbmV3IERUREFkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCXByb3RlY3RlZCBzdGF0aWMgQ01EYXRhVHlwZUluZm9UYWJsZSBjbURhdGFUeXBlSW5mb1RhYmxlID0gbmV3IENNRGF0YVR5cGVJbmZvVGFibGUoKTsKLQotCXB1YmxpYyBzdGF0aWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHVyaSkgewotCQlEVERGaWxlIGR0ZEZpbGUgPSBidWlsZERURE1vZGVsKHVyaSk7Ci0JCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGR0ZEZpbGUpOwotCQkKLQkJcmV0dXJuIGNtRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEVERGaWxlIGJ1aWxkRFRETW9kZWwoU3RyaW5nIHVyaSkgewotCQlEVERVdGlsIGR0ZFV0aWwgPSBuZXcgRFREVXRpbCgpOwotCQlkdGRVdGlsLnNldGV4cGFuZEVudGl0eVJlZmVyZW5jZXModHJ1ZSk7Ci0JCWR0ZFV0aWwucGFyc2UobmV3IFJlc291cmNlU2V0SW1wbCgpLCB1cmkpOwotCQlyZXR1cm4gZHRkVXRpbC5nZXREVERGaWxlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudChEVERGaWxlIGR0ZEZpbGUpIHsKLQkJcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGR0ZEZpbGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ01Ob2RlIGdldEFkYXB0ZXIoTm90aWZpZXIgbykgewotCQlyZXR1cm4gKENNTm9kZSkgZHRkQWRhcHRlckZhY3RvcnlJbXBsLmFkYXB0KG8pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGdldE1pbk9jY3VySGVscGVyKERURFJlcGVhdGFibGVDb250ZW50IGNvbnRlbnQpIHsKLQkJaW50IG9jY3VyZW5jZSA9IGNvbnRlbnQuZ2V0T2NjdXJyZW5jZSgpLmdldFZhbHVlKCk7Ci0JCWJvb2xlYW4gaXNPcHRpb25hbCA9IChvY2N1cmVuY2UgPT0gRFRET2NjdXJyZW5jZVR5cGUuT1BUSU9OQUwgfHwgb2NjdXJlbmNlID09IERURE9jY3VycmVuY2VUeXBlLlpFUk9fT1JfTU9SRSk7Ci0JCXJldHVybiBpc09wdGlvbmFsID8gMCA6IDE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4T2NjdXJIZWxwZXIoRFREUmVwZWF0YWJsZUNvbnRlbnQgY29udGVudCkgewotCQlpbnQgb2NjdXJlbmNlID0gY29udGVudC5nZXRPY2N1cnJlbmNlKCkuZ2V0VmFsdWUoKTsKLQkJYm9vbGVhbiBpc011bHRpID0gKG9jY3VyZW5jZSA9PSBEVERPY2N1cnJlbmNlVHlwZS5PTkVfT1JfTU9SRSB8fCBvY2N1cmVuY2UgPT0gRFRET2NjdXJyZW5jZVR5cGUuWkVST19PUl9NT1JFKTsKLQkJcmV0dXJuIGlzTXVsdGkgPyAtMSA6IDE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEVERBZGFwdGVyRmFjdG9yeUltcGwgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQkJQWRhcHRlciByZXN1bHQgPSBudWxsOwotCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIERUREF0dHJpYnV0ZSkgewotCQkJCQlyZXN1bHQgPSBuZXcgRFREQXR0cmlidXRlQWRhcHRlcigoRFREQXR0cmlidXRlKSB0YXJnZXQpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVERFbGVtZW50KSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBEVERFbGVtZW50QWRhcHRlcigoRFRERWxlbWVudCkgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50QWRhcHRlcigoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHRhcmdldCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IERUREZpbGVBZGFwdGVyKChEVERGaWxlKSB0YXJnZXQpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IERUREdyb3VwQ29udGVudEFkYXB0ZXIoKERUREdyb3VwQ29udGVudCkgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRFRERW50aXR5KSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBEVERFbnRpdHlBZGFwdGVyKChEVERFbnRpdHkpIHRhcmdldCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQpIHsKLQkJCXJldHVybiBhZGFwdCh0YXJnZXQsIHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRFREQmFzZUFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIERUREJhc2VBZGFwdGVyIGV4dGVuZHMgQ01Ob2RlSW1wbCB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiB0eXBlID09IGR0ZEFkYXB0ZXJGYWN0b3J5SW1wbDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscygiQ01Eb2N1bWVudCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBnZXRDTURvY3VtZW50KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RPQ1VNRU5UQVRJT04pKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0RG9jdW1lbnRhdGlvbigpOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ERUZJTklUSU9OX0lORk8pKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0RGVmaW5pdGlvbkluZm8oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVGSU5JVElPTikpIHsKLQkJCQlyZXN1bHQgPSBnZXREZWZpbml0aW9uKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX01PRl9OT1RJRklFUikpIHsKLQkJCQlyZXN1bHQgPSBnZXRLZXkoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoInNwZWMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gZ2V0U3BlYygpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudCgpOwotCQkJCQlpZiAoY21Eb2N1bWVudCBpbnN0YW5jZW9mIERUREZpbGVBZGFwdGVyKSB7Ci0JCQkJCQlBbm5vdGF0aW9uTWFwIG1hcCA9ICgoRFRERmlsZUFkYXB0ZXIpIGNtRG9jdW1lbnQpLmFubm90YXRpb25NYXA7Ci0JCQkJCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCQkJCQlTdHJpbmcgc3BlYyA9IGdldFNwZWMoKTsKLQkJCQkJCQlpZiAoc3BlYyAhPSBudWxsKSB7Ci0JCQkJCQkJCXJlc3VsdCA9IG1hcC5nZXRQcm9wZXJ0eShnZXRTcGVjKCksIHByb3BlcnR5TmFtZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQkJTWFwIGdsb2JhbFByb3BlcnR5TWFwID0gKChEVERGaWxlQWRhcHRlcikgY21Eb2N1bWVudCkuZ2xvYmFsUHJvcGVydHlNYXA7Ci0JCQkJCQkJcmVzdWx0ID0gZ2xvYmFsUHJvcGVydHlNYXAuZ2V0KHByb3BlcnR5TmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbigpIHsKLQkJCXJldHVybiBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmaW5pdGlvbkluZm8oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0RGVmaW5pdGlvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTcGVjKCkgewotCQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEVERBdHRyaWJ1dGVBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEVERBdHRyaWJ1dGVBZGFwdGVyIGV4dGVuZHMgRFREQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHsKLQkJcHJvdGVjdGVkIERUREF0dHJpYnV0ZSBhdHRyaWJ1dGU7Ci0JCXByb3RlY3RlZCBDTURhdGFUeXBlIGRhdGFUeXBlOwotCi0JCXB1YmxpYyBEVERBdHRyaWJ1dGVBZGFwdGVyKERUREF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJCXRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwotCQkJZGF0YVR5cGUgPSBuZXcgRGF0YVR5cGVJbXBsKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFNwZWMoKSB7Ci0JCQlyZXR1cm4gYXR0cmlidXRlLmdldERUREVsZW1lbnQoKS5nZXROYW1lKCkgKyAiL0AiICsgYXR0cmlidXRlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBBVFRSSUJVVEVfREVDTEFSQVRJT047Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpIHsKLQkJCXJldHVybiBkYXRhVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXREZWZhdWx0VmFsdWVTdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihhdHRyaWJ1dGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0VXNhZ2UoKSB7Ci0JCQlpbnQgdXNhZ2UgPSBPUFRJT05BTDsKLQkJCXN3aXRjaCAoYXR0cmlidXRlLmdldERlZmF1bHRLaW5kKCkuZ2V0VmFsdWUoKSkgewotCQkJCWNhc2UgRFRERGVmYXVsdEtpbmQuUkVRVUlSRUQgOiB7Ci0JCQkJCXVzYWdlID0gUkVRVUlSRUQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIERURERlZmF1bHRLaW5kLkZJWEVEIDogewotCQkJCQl1c2FnZSA9IEZJWEVEOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdXNhZ2U7Ci0JCX0KLQotCQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkgewotCQkJRFRERmlsZSBkdGRGaWxlID0gYXR0cmlidXRlLmdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCk7Ci0JCQlyZXR1cm4gZHRkRmlsZSAhPSBudWxsID8gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoZHRkRmlsZSkgOiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGNsYXNzIERhdGFUeXBlSW1wbCBpbXBsZW1lbnRzIENNRGF0YVR5cGUgewotCQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCQlyZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0RGF0YVR5cGVOYW1lKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJpc1ZhbGlkRW1wdHlWYWx1ZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGRhdGFUeXBlTmFtZSA9IGdldERhdGFUeXBlTmFtZSgpOwotCQkJCQlyZXN1bHQgPSAoZGF0YVR5cGVOYW1lID09IG51bGwgfHwgZGF0YVR5cGVOYW1lLmVxdWFscyhDTURhdGFUeXBlLkNEQVRBKSkgPyAidHJ1ZSIgOiAiZmFsc2UiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCQkJcmV0dXJuIGNtRGF0YVR5cGVJbmZvVGFibGUuZ2V0RGF0YVR5cGVOYW1lKGF0dHJpYnV0ZS5nZXREVERUeXBlKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gY21EYXRhVHlwZUluZm9UYWJsZS5nZXRJbnN0YW5jZVZhbHVlKGF0dHJpYnV0ZS5nZXREVERUeXBlKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKSB7Ci0JCQkJaW50IHJlc3VsdCA9IElNUExJRURfVkFMVUVfTk9ORTsKLQkJCQlpbnQgZGVmYXVsdFZhbHVlS2luZCA9IGF0dHJpYnV0ZS5nZXREZWZhdWx0S2luZCgpLmdldFZhbHVlKCk7Ci0JCQkJaWYgKGRlZmF1bHRWYWx1ZUtpbmQgPT0gRFRERGVmYXVsdEtpbmQuTk9GSVhFRCkgewotCQkJCQlyZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQ7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGRlZmF1bHRWYWx1ZUtpbmQgPT0gRFRERGVmYXVsdEtpbmQuRklYRUQpIHsKLQkJCQkJcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9GSVhFRDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXREZWZhdWx0VmFsdWVTdHJpbmcoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXMoKSB7Ci0JCQkJT2JqZWN0W10gb2JqZWN0TGlzdCA9IGF0dHJpYnV0ZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkudG9BcnJheSgpOwotCQkJCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbb2JqZWN0TGlzdC5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0TGlzdC5sZW5ndGg7IGkrKykgewotCQkJCQlyZXN1bHRbaV0gPSBvYmplY3RMaXN0W2ldLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERUREVsZW1lbnRCYXNlQWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRFRERWxlbWVudEJhc2VBZGFwdGVyIGV4dGVuZHMgRFREQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbiB7Ci0JCXByb3RlY3RlZCBDTURhdGFUeXBlIGRhdGFUeXBlOwotCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBEVERFbGVtZW50IGdldERUREVsZW1lbnQoKTsKLQotCQlwcm90ZWN0ZWQgQ01Eb2N1bWVudGF0aW9uIGRvY3VtZW50YXRpb24gPSBudWxsOwotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gRUxFTUVOVF9ERUNMQVJBVElPTjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gZ2V0RFRERWxlbWVudCgpLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQkJQ01OYW1lZE5vZGVNYXBJbXBsIHJlc3VsdCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJCUxpc3QgYXR0cmlidXRlTGlzdCA9IGdldERUREVsZW1lbnQoKS5nZXREVERBdHRyaWJ1dGUoKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGF0dHJpYnV0ZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJRFREQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChEVERBdHRyaWJ1dGUpIGkubmV4dCgpOwotCQkJCXJlc3VsdC5nZXRIYXNodGFibGUoKS5wdXQoYXR0cmlidXRlLmdldE5hbWUoKSwgZ2V0QWRhcHRlcihhdHRyaWJ1dGUpKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCQlyZXR1cm4gKENNQ29udGVudCkgZ2V0QWRhcHRlcihnZXREVERFbGVtZW50KCkuZ2V0Q29udGVudCgpKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCQkvLyB0b2RvCi0JCQlpbnQgcmVzdWx0ID0gRUxFTUVOVDsKLQkJCURUREVsZW1lbnRDb250ZW50IGR0ZEVsZW1lbnRDb250ZW50ID0gZ2V0RFRERWxlbWVudCgpLmdldENvbnRlbnQoKTsKLQkJCWlmIChkdGRFbGVtZW50Q29udGVudCBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQpIHsKLQkJCQlyZXN1bHQgPSBQQ0RBVEE7Ci0JCQl9Ci0JCQllbHNlIGlmIChkdGRFbGVtZW50Q29udGVudCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgewotCQkJCURUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQgPSAoRFRER3JvdXBDb250ZW50KSBkdGRFbGVtZW50Q29udGVudDsKLQkJCQlpbnQgZ3JvdXBLaW5kID0gZ3JvdXBDb250ZW50LmdldEdyb3VwS2luZCgpLmdldFZhbHVlKCk7Ci0JCQkJaWYgKGdyb3VwS2luZCA9PSBEVERHcm91cEtpbmQuQ0hPSUNFKSB7Ci0JCQkJCUxpc3QgbGlzdCA9IGdyb3VwQ29udGVudC5nZXRDb250ZW50KCk7Ci0JCQkJCWlmIChsaXN0LnNpemUoKSA+IDAgJiYgbGlzdC5nZXQoMCkgaW5zdGFuY2VvZiBEVERQQ0RhdGFDb250ZW50KSB7Ci0JCQkJCQlyZXN1bHQgPSBNSVhFRDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGR0ZEVsZW1lbnRDb250ZW50IGluc3RhbmNlb2YgRFREQW55Q29udGVudCkgewotCQkJCXJlc3VsdCA9IEFOWTsKLQkJCX0KLQkJCWVsc2UgaWYgKGR0ZEVsZW1lbnRDb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQkJcmVzdWx0ID0gRU1QVFk7Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQkJcmV0dXJuIGdldERUREVsZW1lbnQoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJCWludCBjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlib29sZWFuIGhhc0RhdGFUeXBlID0gY29udGVudFR5cGUgPT0gUENEQVRBIHx8IGNvbnRlbnRUeXBlID09IE1JWEVEOwotCQkJcmV0dXJuIGhhc0RhdGFUeXBlID8gZGF0YVR5cGUgOiBudWxsOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQ01OYW1lZE5vZGVNYXBJbXBsLkVNUFRZX05BTUVEX05PREVfTUFQOwotCQl9Ci0KLQkJcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpIHsKLQkJCURUREZpbGUgZHRkRmlsZSA9IGdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCk7Ci0JCQlyZXR1cm4gZHRkRmlsZSAhPSBudWxsID8gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoZHRkRmlsZSkgOiBudWxsOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbigpIHsKLQkJCUNNTm9kZUxpc3RJbXBsIG5vZGVMaXN0ID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0JCQlpZiAoZG9jdW1lbnRhdGlvbiA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIGNvbW1lbnQgPSBnZXREVERFbGVtZW50KCkuZ2V0Q29tbWVudCgpOwotCQkJCWlmIChjb21tZW50ICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb21tZW50LCAiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQl2YWx1ZSArPSBzdC5uZXh0VG9rZW4oKS50cmltKCkgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZG9jdW1lbnRhdGlvbiA9IG5ldyBDTURvY3VtZW50YXRpb25JbXBsKHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZG9jdW1lbnRhdGlvbiAhPSBudWxsKSB7Ci0JCQkJbm9kZUxpc3QuZ2V0TGlzdCgpLmFkZChkb2N1bWVudGF0aW9uKTsKLQkJCX0KLQkJCXJldHVybiBub2RlTGlzdDsKLQkJfQotCX0KLQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDTURvY3VtZW50YXRpb25JbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudGF0aW9uIHsKLQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKLQotCQlwdWJsaWMgQ01Eb2N1bWVudGF0aW9uSW1wbChTdHJpbmcgdmFsdWUpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gRE9DVU1FTlRBVElPTjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogRFRERWxlbWVudEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERUREVsZW1lbnRBZGFwdGVyIGV4dGVuZHMgRFRERWxlbWVudEJhc2VBZGFwdGVyIHsKLQkJcHJvdGVjdGVkIERUREVsZW1lbnQgZWxlbWVudDsKLQotCQlwdWJsaWMgRFRERWxlbWVudEFkYXB0ZXIoRFRERWxlbWVudCBlbGVtZW50KSB7Ci0JCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQkJZGF0YVR5cGUgPSBuZXcgQ01EYXRhVHlwZUltcGwoIiNQQ0RBVEEiLCBnZXREVERFbGVtZW50KCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCQlyZXR1cm4gZWxlbWVudDsKLQkJfQotCi0JCXByb3RlY3RlZCBEVERFbGVtZW50IGdldERUREVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gZWxlbWVudDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmaW5pdGlvbkluZm8oKSB7Ci0JCQlyZXR1cm4gImdsb2JhbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0RGVmaW5pdGlvbigpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50QWRhcHRlciBleHRlbmRzIERUREVsZW1lbnRCYXNlQWRhcHRlciB7Ci0JCXByb3RlY3RlZCBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBjb250ZW50OwotCi0JCXB1YmxpYyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEFkYXB0ZXIoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgY29udGVudCkgewotCQkJdGhpcy5jb250ZW50ID0gY29udGVudDsKLQkJCWRhdGFUeXBlID0gbmV3IENNRGF0YVR5cGVJbXBsKCIjUENEQVRBIiwgZ2V0RFRERWxlbWVudCgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQkJcmV0dXJuIGNvbnRlbnQ7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCkgewotCQkJcmV0dXJuIGNvbnRlbnQuZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKSB7Ci0JCQlyZXR1cm4gZ2V0TWluT2NjdXJIZWxwZXIoY29udGVudCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQkJcmV0dXJuIGdldE1heE9jY3VySGVscGVyKGNvbnRlbnQpOwotCQl9Ci0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldERlZmluaXRpb24oKSB7Ci0JCQlyZXR1cm4gZ2V0QWRhcHRlcihnZXREVERFbGVtZW50KCkpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBEVERFbnRpdHlBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEVERFbnRpdHlBZGFwdGVyIGV4dGVuZHMgRFREQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUVudGl0eURlY2xhcmF0aW9uIHsKLQkJcHJvdGVjdGVkIERUREVudGl0eSBkdGRFbnRpdHk7Ci0KLQkJcHVibGljIERUREVudGl0eUFkYXB0ZXIoRFRERW50aXR5IGR0ZEVudGl0eSkgewotCQkJdGhpcy5kdGRFbnRpdHkgPSBkdGRFbnRpdHk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIEVOVElUWV9ERUNMQVJBVElPTjsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQkJcmV0dXJuIGR0ZEVudGl0eTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBkdGRFbnRpdHkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCVN0cmluZyB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZHRkRW50aXR5LmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIERUREludGVybmFsRW50aXR5KSB7Ci0JCQkJRFRESW50ZXJuYWxFbnRpdHkgY29udGVudCA9IChEVERJbnRlcm5hbEVudGl0eSkgZHRkRW50aXR5LmdldENvbnRlbnQoKTsKLQkJCQl2YWx1ZSA9IGNvbnRlbnQuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogRFRER3JvdXBDb250ZW50QWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFRER3JvdXBDb250ZW50QWRhcHRlciBleHRlbmRzIERUREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01Hcm91cCB7Ci0JCXByb3RlY3RlZCBEVERHcm91cENvbnRlbnQgY29udGVudDsKLQotCQlwdWJsaWMgRFRER3JvdXBDb250ZW50QWRhcHRlcihEVERHcm91cENvbnRlbnQgY29udGVudCkgewotCQkJdGhpcy5jb250ZW50ID0gY29udGVudDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQkJcmV0dXJuIGNvbnRlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIEdST1VQOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCUNNRGVzY3JpcHRpb25CdWlsZGVyIGRlc2NyaXB0aW9uQnVpbGRlciA9IG5ldyBDTURlc2NyaXB0aW9uQnVpbGRlcigpOwotCQkJcmV0dXJuIGRlc2NyaXB0aW9uQnVpbGRlci5idWlsZERlc2NyaXB0aW9uKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJCUxpc3QgbGlzdCA9IGNvbnRlbnQuZ2V0Q29udGVudCgpOwotCQkJQ01Ob2RlTGlzdEltcGwgcmVzdWx0ID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCUNNTm9kZSBub2RlID0gZ2V0QWRhcHRlcigoTm90aWZpZXIpIGkubmV4dCgpKTsKLQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdC5nZXRMaXN0KCkuYWRkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCi0JCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCQlyZXR1cm4gZ2V0TWF4T2NjdXJIZWxwZXIoY29udGVudCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQkJcmV0dXJuIGdldE1pbk9jY3VySGVscGVyKGNvbnRlbnQpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRPcGVyYXRvcigpIHsKLQkJCS8vIHRvZG8uLi4gaGFuZGxlIEFMT05FIGNhc2UgYnkgY2hlY2tpZyBpZiBjaGlsZCBjb3VudCA9PSAxCi0JCQlpbnQgZ3JvdXBLaW5kID0gY29udGVudC5nZXRHcm91cEtpbmQoKS5nZXRWYWx1ZSgpOwotCQkJcmV0dXJuIChncm91cEtpbmQgPT0gRFRER3JvdXBLaW5kLkNIT0lDRSkgPyBDSE9JQ0UgOiBTRVFVRU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERUREZpbGVBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEVERGaWxlQWRhcHRlciBleHRlbmRzIERUREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01Eb2N1bWVudCB7Ci0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgREVGQVVMVF9ST09UX05BTUUgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2RlZmF1bHRSb290TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcm90ZWN0ZWQgRFRERmlsZSBkdGRGaWxlOwotCQlwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIG5hbWVkTm9kZU1hcDsKLQkJcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBlbnRpdHlOb2RlTWFwOwotCi0JCXByb3RlY3RlZCBBbm5vdGF0aW9uTWFwIGFubm90YXRpb25NYXAgPSBuZXcgQW5ub3RhdGlvbk1hcCgpOwotCQlwcm90ZWN0ZWQgTWFwIGdsb2JhbFByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlwdWJsaWMgRFRERmlsZUFkYXB0ZXIoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCQl0aGlzLmR0ZEZpbGUgPSBkdGRGaWxlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCQlyZXR1cm4gZHRkRmlsZTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uTWFwIGdldEFubm90YXRpb25NYXAoKSB7Ci0JCQlyZXR1cm4gYW5ub3RhdGlvbk1hcDsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJCWlmIChuYW1lZE5vZGVNYXAgPT0gbnVsbCkgewotCQkJCW5hbWVkTm9kZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZHRkRmlsZS5saXN0RFRERWxlbWVudCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJRFRERWxlbWVudCBkdGRFbGVtZW50ID0gKERUREVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJbmFtZWROb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dChkdGRFbGVtZW50LmdldE5hbWUoKSwgZ2V0QWRhcHRlcihkdGRFbGVtZW50KSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5hbWVkTm9kZU1hcDsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJCWlmIChlbnRpdHlOb2RlTWFwID09IG51bGwpIHsKLQkJCQllbnRpdHlOb2RlTWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCQkJLy8gYWRkIHRoZSBidWlsdCBpbiBlbnRpdHkgZGVjbGFyYXRpb25zCi0JCQkJLy8KLQkJCQllbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgiYW1wIiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJhbXAiLCAiJiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQllbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgibHQiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoImx0IiwgIjwiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImd0IiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJndCIsICI+IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJxdW90IiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJxdW90IiwgIlwiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJhcG9zIiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJhcG9zIiwgIiciKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBkdGRGaWxlLmxpc3REVERFbnRpdHkoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJRFRERW50aXR5IGR0ZEVudGl0eSA9IChEVERFbnRpdHkpIGkubmV4dCgpOwotCQkJCQlpZiAoIWR0ZEVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpICYmIGR0ZEVudGl0eS5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCQkJLy8gZm9yIG5vdy4uLiBqdXN0IGhhbmRsZSBEVERJbnRlcm5hbEVudGl0eQotCQkJCQkJLy8KLQkJCQkJCWlmIChkdGRFbnRpdHkuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgRFRESW50ZXJuYWxFbnRpdHkpIHsKLQkJCQkJCQllbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dChkdGRFbnRpdHkuZ2V0TmFtZSgpLCBnZXRBZGFwdGVyKGR0ZEVudGl0eSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGVudGl0eU5vZGVNYXA7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIERPQ1VNRU5UOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiBkdGRGaWxlLmdldE5hbWUoKSArICIuZHRkIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKERFRkFVTFRfUk9PVF9OQU1FKSkgewotCQkJCURURE1ldHJpY3MgbWV0cmljcyA9IG5ldyBEVERNZXRyaWNzKGR0ZEZpbGUpOwotCQkJCURUREVsZW1lbnQgZHRkRWxlbWVudCA9IG1ldHJpY3MuZ2V0TGVhc3RSZWZlcmVuY2VkRWxlbWVudCgpOwotCQkJCWlmIChkdGRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gZHRkRWxlbWVudC5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiYW5ub3RhdGlvbk1hcCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBhbm5vdGF0aW9uTWFwOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiZ2xvYmFsUHJvcGVydHlNYXAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gZ2xvYmFsUHJvcGVydHlNYXA7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDTURhdGFUeXBlSW5mb1RhYmxlIHsKLQkJcHJvdGVjdGVkIFN0cmluZ1tdIGluc3RhbmNlVmFsdWVUYWJsZTsKLQkJcHJvdGVjdGVkIFN0cmluZ1tdIGRhdGFUeXBlTmFtZVRhYmxlOwotCi0JCXB1YmxpYyBDTURhdGFUeXBlSW5mb1RhYmxlKCkgewotCQkJLy8gaGFzaHRhYmxlLnB1dChEVERUeXBlLkNEQVRBLCBudWxsKSk7Ci0JCQlpbnN0YW5jZVZhbHVlVGFibGUgPSBuZXcgU3RyaW5nW0RUREJhc2ljVHlwZUltcGwuYmFzaWNUeXBlS2luZHMubGVuZ3RoXTsKLQkJCWluc3RhbmNlVmFsdWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLkVOVElUWV0gPSAiZW50aXR5IjsgLy8kTk9OLU5MUy0xJAotCQkJaW5zdGFuY2VWYWx1ZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuRU5USVRJRVNdID0gImVudGl0aWVzIjsgLy8kTk9OLU5MUy0xJAotCQkJaW5zdGFuY2VWYWx1ZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuTk1UT0tFTl0gPSAibm10b2tlbiI7IC8vJE5PTi1OTFMtMSQKLQkJCWluc3RhbmNlVmFsdWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5TXSA9ICJubXRva2VucyI7IC8vJE5PTi1OTFMtMSQKLQotCQkJZGF0YVR5cGVOYW1lVGFibGUgPSBuZXcgU3RyaW5nW0RUREJhc2ljVHlwZUltcGwuYmFzaWNUeXBlS2luZHMubGVuZ3RoXTsKLQkJCWRhdGFUeXBlTmFtZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuQ0RBVEFdID0gQ01EYXRhVHlwZS5DREFUQTsKLQkJCWRhdGFUeXBlTmFtZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuSURdID0gQ01EYXRhVHlwZS5JRDsKLQkJCWRhdGFUeXBlTmFtZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuSURSRUZdID0gQ01EYXRhVHlwZS5JRFJFRjsKLQkJCWRhdGFUeXBlTmFtZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuSURSRUZTXSA9IENNRGF0YVR5cGUuSURSRUZTOwotCQkJZGF0YVR5cGVOYW1lVGFibGVbRFREQmFzaWNUeXBlS2luZC5FTlRJVFldID0gQ01EYXRhVHlwZS5FTlRJVFk7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLkVOVElUSUVTXSA9IENNRGF0YVR5cGUuRU5USVRJRVM7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5dID0gQ01EYXRhVHlwZS5OTVRPS0VOOwotCQkJZGF0YVR5cGVOYW1lVGFibGVbRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOU10gPSBDTURhdGFUeXBlLk5NVE9LRU5TOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRJbnN0YW5jZVZhbHVlKERURFR5cGUgZHRkVHlwZSkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAoZHRkVHlwZSBpbnN0YW5jZW9mIERUREJhc2ljVHlwZSkgewotCQkJCWludCBraW5kID0gKChEVERCYXNpY1R5cGUpIGR0ZFR5cGUpLmdldEtpbmQoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChraW5kID49IDAgJiYga2luZCA8IERUREJhc2ljVHlwZUltcGwuYmFzaWNUeXBlRGVzY3JpcHRpb25zLmxlbmd0aCkgewotCQkJCQlyZXN1bHQgPSBpbnN0YW5jZVZhbHVlVGFibGVba2luZF07Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKERURFR5cGUgZHRkVHlwZSkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAoZHRkVHlwZSBpbnN0YW5jZW9mIERUREJhc2ljVHlwZSkgewotCQkJCWludCBraW5kID0gKChEVERCYXNpY1R5cGUpIGR0ZFR5cGUpLmdldEtpbmQoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChraW5kID49IDAgJiYga2luZCA8IERUREJhc2ljVHlwZUltcGwuYmFzaWNUeXBlRGVzY3JpcHRpb25zLmxlbmd0aCkgewotCQkJCQlyZXN1bHQgPSBkYXRhVHlwZU5hbWVUYWJsZVtraW5kXTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChkdGRUeXBlIGluc3RhbmNlb2YgRFRERW51bWVyYXRpb25UeXBlKSB7Ci0JCQkJcmVzdWx0ID0gQ01EYXRhVHlwZS5FTlVNOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQW55Q29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERBbnlDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMTNiZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERBbnlDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFueSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQW55Q29udGVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERBbnlDb250ZW50IGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnQgewotfSAvLyBEVERBbnlDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREF0dHJpYnV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5ODQxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF0dHJpYnV0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0S2luZCA8ZW0+RGVmYXVsdCBLaW5kPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIDxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERUREVsZW1lbnQgPGVtPkRURCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERBdHRyaWJ1dGUgZXh0ZW5kcyBFQXR0cmlidXRlLCBEVERPYmplY3QsIERURFNvdXJjZU9mZnNldCB7Ci0JLy8gTk9OLUdFTiBpbnRlcmZhY2VzIERURE9iamVjdCwgRFREU291cmNlT2Zmc2V0Ci0KLQlwdWJsaWMgRFREVHlwZSBnZXREVERUeXBlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXREVERUeXBlKERURFR5cGUgdHlwZSk7Ci0KLQlwdWJsaWMgdm9pZCBzZXREVERCYXNpY1R5cGUoaW50IHZhbHVlKTsKLQotCXB1YmxpYyBEVERFbnVtZXJhdGlvblR5cGUgY3JlYXRlRFRERW51bWVyYXRpb24oU3RyaW5nW10gZW51bVZhbHVlcywgaW50IGVudW1LaW5kKTsKLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21tZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBdHRyaWJ1dGVfQ29tbWVudCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb21tZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgS2luZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWZhdWx0IEtpbmQ8L2VtPicgYXR0cmlidXRlIGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBLaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQKLQkgKiBAc2VlICNzZXREZWZhdWx0S2luZChEVEREZWZhdWx0S2luZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBdHRyaWJ1dGVfRGVmYXVsdEtpbmQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVEREZWZhdWx0S2luZCBnZXREZWZhdWx0S2luZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdEtpbmQgPGVtPkRlZmF1bHQgS2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IEtpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZAotCSAqIEBzZWUgI2dldERlZmF1bHRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0S2luZChEVEREZWZhdWx0S2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlIFN0cmluZzwvYj48L2VtPicKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2VtPicgYXR0cmlidXRlCi0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRWYWx1ZVN0cmluZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRWYWx1ZVN0cmluZygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRWYWx1ZVN0cmluZyA8ZW0+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2VtPicKLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0VmFsdWVTdHJpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRWYWx1ZVN0cmluZyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uCi0JICogaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iYXR0cmlidXRlTmFtZVJlZmVyZW5jZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5IGdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogcmVmZXJlbmNlIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbgotCSAqIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eSBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0RFREQXR0cmlidXRlIDxlbT5EVEQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRURCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgRWxlbWVudDwvZW0+JyBjb250YWluZXIKLQkgKiAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREVERFbGVtZW50KERUREVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQXR0cmlidXRlX0RUREVsZW1lbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldERUREF0dHJpYnV0ZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iRFREQXR0cmlidXRlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbGVtZW50IGdldERUREVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERUREVsZW1lbnQgPGVtPkRURCBFbGVtZW50PC9lbT59JwotCSAqIGNvbnRhaW5lciByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgRWxlbWVudDwvZW0+JyBjb250YWluZXIKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREVERFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREVERFbGVtZW50KERUREVsZW1lbnQgdmFsdWUpOwotCi19IC8vIERUREF0dHJpYnV0ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERCYXNpY1R5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQmFzaWNUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMDMyODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERCYXNpY1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNpYyBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGUjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERCYXNpY1R5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREQmFzaWNUeXBlIGV4dGVuZHMgRUNsYXNzLCBEVERUeXBlIHsKLQkvLyBOT04tR0VOIGludGVyZmFjZXMgRFREVHlwZQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gVGhlCi0JICogbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwgdGhlcmUKLQkgKiByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kCi0JICogQHNlZSAjc2V0S2luZChEVERCYXNpY1R5cGVLaW5kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREJhc2ljVHlwZV9LaW5kKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREQmFzaWNUeXBlS2luZCBnZXRLaW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0S2luZChEVERCYXNpY1R5cGVLaW5kIHZhbHVlKTsKLX0gLy8gRFREQmFzaWNUeXBlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREJhc2ljVHlwZUtpbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQmFzaWNUeXBlS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGZlOWNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQmFzaWNUeXBlS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkJhc2ljIFR5cGUgS2luZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREJhc2ljVHlwZUtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERCYXNpY1R5cGVLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PTkVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0RBVEE8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQ0RBVEFfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENEQVRBID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JRFJFRjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJRFJFRl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURSRUYgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SURSRUZTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lEUkVGU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURSRUZTID0gNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVOVElUWTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNFTlRJVFlfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FTlRJVElFUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNFTlRJVElFU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRJRVMgPSA2OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk1UT0tFTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOTVRPS0VOX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOTVRPS0VOID0gNzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5NVE9LRU5TPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05NVE9LRU5TX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOTVRPS0VOUyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9ORQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBOT05FX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChOT05FLCAiTk9ORSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DREFUQTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNEQVRBPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0NEQVRBCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIENEQVRBX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChDREFUQSwgIkNEQVRBIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIElEX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChJRCwgIklEIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklEUkVGPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SURSRUY8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSURSRUYKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgSURSRUZfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKElEUkVGLCAiSURSRUYiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SURSRUZTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SURSRUZTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lEUkVGUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBJRFJFRlNfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKElEUkVGUywgIklEUkVGUyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FTlRJVFk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FTlRJVFk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRU5USVRZCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIEVOVElUWV9MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoRU5USVRZLCAiRU5USVRZIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVOVElUSUVTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RU5USVRJRVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRU5USVRJRVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgRU5USVRJRVNfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKEVOVElUSUVTLCAiRU5USVRJRVMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk1UT0tFTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5NVE9LRU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk1UT0tFTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBOTVRPS0VOX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChOTVRPS0VOLCAiTk1UT0tFTiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OTVRPS0VOUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5NVE9LRU5TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05NVE9LRU5TCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIE5NVE9LRU5TX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChOTVRPS0VOUywgIk5NVE9LRU5TIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5CYXNpYyBUeXBlIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kW10gVkFMVUVTX0FSUkFZID0gbmV3IERUREJhc2ljVHlwZUtpbmRbXXtOT05FX0xJVEVSQUwsIENEQVRBX0xJVEVSQUwsIElEX0xJVEVSQUwsIElEUkVGX0xJVEVSQUwsIElEUkVGU19MSVRFUkFMLCBFTlRJVFlfTElURVJBTCwgRU5USVRJRVNfTElURVJBTCwgTk1UT0tFTl9MSVRFUkFMLCBOTVRPS0VOU19MSVRFUkFMLH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+QmFzaWMgVHlwZSBLaW5kPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QmFzaWMgVHlwZSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERUREJhc2ljVHlwZUtpbmQgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlEVERCYXNpY1R5cGVLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QmFzaWMgVHlwZSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERCYXNpY1R5cGVLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBOT05FIDoKLQkJCQlyZXR1cm4gTk9ORV9MSVRFUkFMOwotCQkJY2FzZSBDREFUQSA6Ci0JCQkJcmV0dXJuIENEQVRBX0xJVEVSQUw7Ci0JCQljYXNlIElEIDoKLQkJCQlyZXR1cm4gSURfTElURVJBTDsKLQkJCWNhc2UgSURSRUYgOgotCQkJCXJldHVybiBJRFJFRl9MSVRFUkFMOwotCQkJY2FzZSBJRFJFRlMgOgotCQkJCXJldHVybiBJRFJFRlNfTElURVJBTDsKLQkJCWNhc2UgRU5USVRZIDoKLQkJCQlyZXR1cm4gRU5USVRZX0xJVEVSQUw7Ci0JCQljYXNlIEVOVElUSUVTIDoKLQkJCQlyZXR1cm4gRU5USVRJRVNfTElURVJBTDsKLQkJCWNhc2UgTk1UT0tFTiA6Ci0JCQkJcmV0dXJuIE5NVE9LRU5fTElURVJBTDsKLQkJCWNhc2UgTk1UT0tFTlMgOgotCQkJCXJldHVybiBOTVRPS0VOU19MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEVERCYXNpY1R5cGVLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvLyBEVERCYXNpY1R5cGVLaW5kCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzZmI3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotcHVibGljIGNsYXNzIERURENvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREX0VSUk9SX0xJTkVfUFJFRklYID0gIjwhLS1FUlJPUiAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREX0VSUk9SX0xJTkVfU1VGRklYID0gIiAtLT4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX0VYVEVOU0lPTiA9ICJkdGQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VYVEVOU0lPTiA9ICJ4bWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1JX0VYVEVOU0lPTiA9ICJ4bWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX1hNSV9FWFRFTlNJT04gPSAiZHRkLnhtaSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNjY3NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudCNnZXREVERGaWxlIDxlbT5EVEQgRmlsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERDb250ZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERDb250ZW50IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERURENvbnRlbnQgPGVtPkRURCBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgRmlsZTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERUREZpbGUoRFRERmlsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERDb250ZW50X0RUREZpbGUoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERURENvbnRlbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9IkRURENvbnRlbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREZpbGUgZ2V0RFRERmlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50I2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59JwotCSAqIGNvbnRhaW5lciByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgRmlsZTwvZW0+JyBjb250YWluZXIKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREVERGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREVERGaWxlKERUREZpbGUgdmFsdWUpOwotCi19IC8vIERURENvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERGVmYXVsdEtpbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERGVmYXVsdEtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1N2M1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURERlZmF1bHRLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERGVmYXVsdEtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVEREZWZhdWx0S2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU1QTElFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJTVBMSUVEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTVBMSUVEID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFUVVJUkVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1JFUVVJUkVEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GSVhFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNGSVhFRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklYRUQgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9GSVhFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT0ZJWEVEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT0ZJWEVEID0gNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklNUExJRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTVBMSUVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lNUExJRUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURERlZmF1bHRLaW5kIElNUExJRURfTElURVJBTCA9IG5ldyBEVEREZWZhdWx0S2luZChJTVBMSUVELCAiSU1QTElFRCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVFVSVJFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJFUVVJUkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1JFUVVJUkVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVEREZWZhdWx0S2luZCBSRVFVSVJFRF9MSVRFUkFMID0gbmV3IERURERlZmF1bHRLaW5kKFJFUVVJUkVELCAiUkVRVUlSRUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RklYRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GSVhFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNGSVhFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRERGVmYXVsdEtpbmQgRklYRURfTElURVJBTCA9IG5ldyBEVEREZWZhdWx0S2luZChGSVhFRCwgIkZJWEVEIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PRklYRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT0ZJWEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PRklYRUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURERlZmF1bHRLaW5kIE5PRklYRURfTElURVJBTCA9IG5ldyBEVEREZWZhdWx0S2luZChOT0ZJWEVELCAiTk9GSVhFRCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRERGVmYXVsdEtpbmRbXSBWQUxVRVNfQVJSQVkgPSBuZXcgRFRERGVmYXVsdEtpbmRbXXtJTVBMSUVEX0xJVEVSQUwsIFJFUVVJUkVEX0xJVEVSQUwsIEZJWEVEX0xJVEVSQUwsIE5PRklYRURfTElURVJBTCx9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkRlZmF1bHQgS2luZDwvYj48L2VtPicKLQkgKiBlbnVtZXJhdG9ycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRlZmF1bHQgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVEREZWZhdWx0S2luZCBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURURERlZmF1bHRLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVEREZWZhdWx0S2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgSU1QTElFRCA6Ci0JCQkJcmV0dXJuIElNUExJRURfTElURVJBTDsKLQkJCWNhc2UgUkVRVUlSRUQgOgotCQkJCXJldHVybiBSRVFVSVJFRF9MSVRFUkFMOwotCQkJY2FzZSBGSVhFRCA6Ci0JCQkJcmV0dXJuIEZJWEVEX0xJVEVSQUw7Ci0JCQljYXNlIE5PRklYRUQgOgotCQkJCXJldHVybiBOT0ZJWEVEX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERURERlZmF1bHRLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvLyBEVEREZWZhdWx0S2luZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgxMDk3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXREVERBdHRyaWJ1dGUgPGVtPkRURCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERWxlbWVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFbGVtZW50IGV4dGVuZHMgRUNsYXNzLCBEVERDb250ZW50LCBEVERPYmplY3QsIERURFNvdXJjZU9mZnNldCB7Ci0KLQlwdWJsaWMgdm9pZCBhZGREVERBdHRyaWJ1dGUoRFREQXR0cmlidXRlIGF0dHJpYnV0ZSk7Ci0KLQkvLyByZXR1cm5zIGFsbCByZWZlcmVuY2VzIGluIHRoZSBzYW1lIERUREZpbGUgdGhhdCByZWZlcmVuY2UgdGhpcyBlbGVtZW50Ci0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVmZXJlbmNlcygpOwotCi0JLy8gcmV0dXJuIGEgYnJpZWYgc3RyaW5nIGxpc3RpbmcgdGhlIGF0dHJpYnV0ZXMKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZURldGFpbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21tZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50X0NvbW1lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZQotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERWxlbWVudF9Db250ZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0RWxlbWVudAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbGVtZW50Q29udGVudCBnZXRDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fScKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGVudChEVERFbGVtZW50Q29udGVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgQXR0cmlidXRlPC9iPjwvZW0+JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZQotCSAqIHtAbGluayBEVERBdHRyaWJ1dGV9LiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREVERFbGVtZW50IDxlbT5EVEQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EVEQgQXR0cmlidXRlPC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhCi0JICogZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgQXR0cmlidXRlPC9lbT4nIGNvbnRhaW5tZW50Ci0JICogICAgICAgICByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50X0RUREF0dHJpYnV0ZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREVERFbGVtZW50Ci0JICogQG1vZGVsIHR5cGU9IkRUREF0dHJpYnV0ZSIgb3Bwb3NpdGU9IkRUREVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREVERBdHRyaWJ1dGUoKTsKLQotfSAvLyBEVERFbGVtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnRDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnRDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MzZhYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50Q29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudCBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERWxlbWVudENvbnRlbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVsZW1lbnRDb250ZW50IGV4dGVuZHMgRU9iamVjdCwgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQgewotCi0JLy8gZm9yIHNob3dpbmcgbmFtZXMgdG8gYmUgdXNlZCBpbiB0aGUgdHJlZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKTsKLQotCS8vIGZvciBzaG93aW5nIGl0ZW1zIGluIHRoZSB0YWJsZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudERldGFpbCgpOwotCi0JcHVibGljIERUREVsZW1lbnQgZ2V0RFRERWxlbWVudCgpOwotCi0JLy8gZ2V0IHRoZSBtb3N0IG91dGVyIERUREdyb3VwQ29udGVudAotCXB1YmxpYyBEVERHcm91cENvbnRlbnQgZ2V0RFRER3JvdXBDb250ZW50KCk7Ci0KLQkvLyByZXR1cm5zIHRydWUgaWYgdGhpcyBlbGVtZW50IGNvbnRlbnQgaXMgdGhlIGZpcnN0Ci0JLy8gaW4gdGhlIGVsZW1lbnQKLQkvLyBlZyA8IUVMRU1FTlQgYmxhaCBmaXJzdEVsZW1lbnQ+Ci0JLy8gPCFFTEVNRU5UIGJsYWggKChmaXJzdEVsZW1lbnQsIHNlY29uZEVsZW1lbnQpIHwgbGFzdEVsZW1lbnQpCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnRDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEdyb3VwKERUREdyb3VwQ29udGVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50Q29udGVudF9Hcm91cCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRDb250ZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJjb250ZW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERHcm91cENvbnRlbnQgZ2V0R3JvdXAoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59JwotCSAqIGNvbnRhaW5lciByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBjb250YWluZXIKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3JvdXAoRFRER3JvdXBDb250ZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVsZW1lbnQoRFRERWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50Q29udGVudF9FbGVtZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb250ZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJjb250ZW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbGVtZW50IGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScKLQkgKiBjb250YWluZXIgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBjb250YWluZXIKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbGVtZW50KERUREVsZW1lbnQgdmFsdWUpOwotCi19IC8vIERUREVsZW1lbnRDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZTFiYmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudCBSZWZlcmVuY2UgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQjZ2V0UmVmZXJlbmNlZEVsZW1lbnQgPGVtPlJlZmVyZW5jZWQgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIEVsZW1lbnQ8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgRWxlbWVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIEVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlZmVyZW5jZWRFbGVtZW50KERUREVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRfUmVmZXJlbmNlZEVsZW1lbnQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERWxlbWVudCBnZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCNnZXRSZWZlcmVuY2VkRWxlbWVudCA8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgRWxlbWVudDwvZW0+JwotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWZlcmVuY2VkRWxlbWVudChEVERFbGVtZW50IHZhbHVlKTsKLQotfSAvLyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbXB0eUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW1wdHlDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MjY4MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbXB0eUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW1wdHkgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVtcHR5Q29udGVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFbXB0eUNvbnRlbnQgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudCB7Ci19IC8vIERUREVtcHR5Q29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNGI0NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNpc1BhcmFtZXRlckVudGl0eSA8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRQYXJtRW50aXR5UmVmIDxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2UgPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVudGl0eSBleHRlbmRzIEVOYW1lZEVsZW1lbnQsIERURENvbnRlbnQsIERURE9iamVjdCwgRFREU291cmNlT2Zmc2V0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9Db21tZW50KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyYW1ldGVyIEVudGl0eTwvYj48L2VtPicKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJhbWV0ZXJFbnRpdHkoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1BhcmFtZXRlckVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjaXNQYXJhbWV0ZXJFbnRpdHkgPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+JwotCSAqICAgICAgICAgICAgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzUGFyYW1ldGVyRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJhbWV0ZXJFbnRpdHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50I2dldERUREVudGl0eSA8ZW0+RFREIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZQotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnRlbnQoRFRERW50aXR5Q29udGVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfQ29udGVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQjZ2V0RFRERW50aXR5Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJEVERFbnRpdHkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5Q29udGVudCBnZXRDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb250ZW50KERUREVudGl0eUNvbnRlbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFybSBFbnRpdHkgUmVmPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UjZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT4nIHJlZmVyZW5jZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UGFybUVudGl0eVJlZihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UjZ2V0RW50aXR5Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJlbnRpdHkiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZ2V0UGFybUVudGl0eVJlZigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0UGFybUVudGl0eVJlZiA8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+JwotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBhcm1FbnRpdHlSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcm1FbnRpdHlSZWYoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eSBSZWZlcmVuY2U8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlCi0JICoge0BsaW5rIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnR9LiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMKLQkgKiBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCNnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSA8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZSBsaXN0Ci0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+JyByZWZlcmVuY2UKLQkgKiAgICAgICAgIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5X0VudGl0eVJlZmVyZW5jZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQjZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkKLQkgKiBAbW9kZWwgdHlwZT0iRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCIKLQkgKiAgICAgICAgb3Bwb3NpdGU9ImVsZW1lbnRSZWZlcmVuY2VkRW50aXR5IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFbnRpdHlSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIERUREF0dHJpYnV0ZX0uIEl0Ci0JICogaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+JwotCSAqICAgICAgICAgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5X0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkKLQkgKiBAbW9kZWwgdHlwZT0iRFREQXR0cmlidXRlIiBvcHBvc2l0ZT0iYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIERUREF0dHJpYnV0ZX0uIEl0Ci0JICogaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+JwotCSAqICAgICAgICAgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5X0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkKLQkgKiBAbW9kZWwgdHlwZT0iRFREQXR0cmlidXRlIiBvcHBvc2l0ZT0iYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKTsKLQotfSAvLyBEVERFbnRpdHkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5Q29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHlDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNjI2YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHlDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudGl0eSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50I2dldERUREVudGl0eSA8ZW0+RFREIEVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlDb250ZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFbnRpdHlDb250ZW50IGV4dGVuZHMgRU9iamVjdCwgRFRET2JqZWN0IHsKLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RFREIEVudGl0eTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRURCBFbnRpdHk8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZQotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBFbnRpdHk8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREVERFbnRpdHkoRFRERW50aXR5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eUNvbnRlbnRfRFRERW50aXR5KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbnRlbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRlbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eSBnZXREVERFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudCNnZXREVERFbnRpdHkgPGVtPkRURCBFbnRpdHk8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRURCBFbnRpdHk8L2VtPicgY29udGFpbmVyCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREVERFbnRpdHkoRFRERW50aXR5IHZhbHVlKTsKLQotfSAvLyBEVERFbnRpdHlDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5UmVmZXJlbmNlQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWI5N2Y3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5UmVmZXJlbmNlQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5IFJlZmVyZW5jZSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50I2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5IDxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50IHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2UgPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqIHJlZmVyZW5jZSBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24KLQkgKiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudF9FbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2UKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImVudGl0eVJlZmVyZW5jZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eSBnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50I2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5IDxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5IHZhbHVlKTsKLQotfSAvLyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW51bUdyb3VwS2luZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnVtR3JvdXBLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMDNkYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnVtR3JvdXBLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+RW51bSBHcm91cCBLaW5kPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW51bUdyb3VwS2luZCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERUREVudW1Hcm91cEtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5BTUUgVE9LRU4gR1JPVVA8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9UT0tFTl9HUk9VUCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT1RBVElPTiBHUk9VUDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT1RBVElPTl9HUk9VUF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UQVRJT05fR1JPVVAgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TkFNRSBUT0tFTiBHUk9VUDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5BTUUgVE9LRU4gR1JPVVA8L2I+PC9lbT4nIGxpdGVyYWwKLQkgKiBvYmplY3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uCi0JICogaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOQU1FX1RPS0VOX0dST1VQCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERFbnVtR3JvdXBLaW5kIE5BTUVfVE9LRU5fR1JPVVBfTElURVJBTCA9IG5ldyBEVERFbnVtR3JvdXBLaW5kKE5BTUVfVE9LRU5fR1JPVVAsICJOQU1FX1RPS0VOX0dST1VQIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PVEFUSU9OIEdST1VQPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9UQVRJT04gR1JPVVA8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Ci0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9UQVRJT05fR1JPVVAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREVudW1Hcm91cEtpbmQgTk9UQVRJT05fR1JPVVBfTElURVJBTCA9IG5ldyBEVERFbnVtR3JvdXBLaW5kKE5PVEFUSU9OX0dST1VQLCAiTk9UQVRJT05fR1JPVVAiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkVudW0gR3JvdXAgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERUREVudW1Hcm91cEtpbmRbXSBWQUxVRVNfQVJSQVkgPSBuZXcgRFRERW51bUdyb3VwS2luZFtde05BTUVfVE9LRU5fR1JPVVBfTElURVJBTCwgTk9UQVRJT05fR1JPVVBfTElURVJBTCx9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkVudW0gR3JvdXAgS2luZDwvYj48L2VtPicKLQkgKiBlbnVtZXJhdG9ycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkVudW0gR3JvdXAgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERFbnVtR3JvdXBLaW5kIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRFRERW51bUdyb3VwS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkVudW0gR3JvdXAgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRERW51bUdyb3VwS2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgTkFNRV9UT0tFTl9HUk9VUCA6Ci0JCQkJcmV0dXJuIE5BTUVfVE9LRU5fR1JPVVBfTElURVJBTDsKLQkJCWNhc2UgTk9UQVRJT05fR1JPVVAgOgotCQkJCXJldHVybiBOT1RBVElPTl9HUk9VUF9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEVERFbnVtR3JvdXBLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvLyBEVERFbnVtR3JvdXBLaW5kCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudW1lcmF0aW9uVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnVtZXJhdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwMWIyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudW1lcmF0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnVtZXJhdGlvbiBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudW1lcmF0aW9uVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFbnVtZXJhdGlvblR5cGUgZXh0ZW5kcyBFRW51bSwgRFREVHlwZSB7Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RW51bUxpdGVyYWxzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudW1lcmF0aW9uVHlwZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIFRoZQotCSAqIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsIHRoZXJlCi0JICogcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZAotCSAqIEBzZWUgI3NldEtpbmQoRFRERW51bUdyb3VwS2luZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnVtZXJhdGlvblR5cGVfS2luZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudW1Hcm91cEtpbmQgZ2V0S2luZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEtpbmQoRFRERW51bUdyb3VwS2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFRERW51bWVyYXRpb25UeXBlIDxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EVEQgRmlsZTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEZpbGU8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREVERGaWxlKERUREZpbGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW51bWVyYXRpb25UeXBlX0RUREZpbGUoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERUREVudW1lcmF0aW9uVHlwZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iRFRERW51bWVyYXRpb25UeXBlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERGaWxlIGdldERUREZpbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59JwotCSAqIGNvbnRhaW5lciByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgRmlsZTwvZW0+JyBjb250YWluZXIKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREVERGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREVERGaWxlKERUREZpbGUgdmFsdWUpOwotCi19IC8vIERUREVudW1lcmF0aW9uVHlwZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFcnJvck1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXJyb3JNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxM2U5YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFcnJvck1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLXB1YmxpYyBjbGFzcyBEVERFcnJvck1lc3NhZ2UgewotCXB1YmxpYyBTdHJpbmcgZXJyb3JLZXk7Ci0JcHVibGljIFN0cmluZyBlcnJvck1lc3NhZ2U7Ci0JcHVibGljIFN0cmluZyBsaW5lTm87Ci0JcHVibGljIFN0cmluZyBjaGFyT2ZmU2V0OwotCXB1YmxpYyBTdHJpbmcgZGVjbGFyYXRpb25UeXBlOwotCXB1YmxpYyBTdHJpbmcgZGVjbGFyYXRpb25OYW1lOwotCXB1YmxpYyBTdHJpbmcgc291cmNlTGluZTsKLQotCi0JcHVibGljIERUREVycm9yTWVzc2FnZShTdHJpbmcgZGVjbGFyYXRpb25UeXBlLCBTdHJpbmcgZGVjbGFyYXRpb25OYW1lLCBTdHJpbmcgbGluZU5vLCBTdHJpbmcgY2hhck9mZlNldCwgU3RyaW5nIGVycm9yS2V5LCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCXRoaXMoZGVjbGFyYXRpb25UeXBlLCBkZWNsYXJhdGlvbk5hbWUsIGxpbmVObywgY2hhck9mZlNldCwgZXJyb3JLZXksIGVycm9yTWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIERUREVycm9yTWVzc2FnZShTdHJpbmcgZGVjbGFyYXRpb25UeXBlLCBTdHJpbmcgZGVjbGFyYXRpb25OYW1lLCBTdHJpbmcgbGluZU5vLCBTdHJpbmcgY2hhck9mZlNldCwgU3RyaW5nIGVycm9yS2V5LCBTdHJpbmcgZXJyb3JNZXNzYWdlLCBTdHJpbmcgc3JjTGluZSkgewotCQl0aGlzLmRlY2xhcmF0aW9uVHlwZSA9IGRlY2xhcmF0aW9uVHlwZTsKLQkJdGhpcy5kZWNsYXJhdGlvbk5hbWUgPSBkZWNsYXJhdGlvbk5hbWU7Ci0JCXRoaXMubGluZU5vID0gbGluZU5vOwotCQl0aGlzLmNoYXJPZmZTZXQgPSBjaGFyT2ZmU2V0OwotCQl0aGlzLmVycm9yS2V5ID0gZXJyb3JLZXk7Ci0JCXRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotCQl0aGlzLnNvdXJjZUxpbmUgPSBzcmNMaW5lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiKCIgKyBkZWNsYXJhdGlvblR5cGUgKyAiOiIgKyBkZWNsYXJhdGlvbk5hbWUgKyAiKSAiICsgbGluZU5vICsgIjoiICsgY2hhck9mZlNldCArICIgIiArIGVycm9yTWVzc2FnZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdG9TdHJpbmdHZW4oKSB7Ci0KLQkJcmV0dXJuICIoIiArIGRlY2xhcmF0aW9uVHlwZSArICI6IiArIGRlY2xhcmF0aW9uTmFtZSArICIpICIgKyBsaW5lTm8gKyAiOiIgKyBjaGFyT2ZmU2V0ICsgIiAiICsgZXJyb3JNZXNzYWdlOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREV4dGVuZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREV4dGVuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZGUzNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFeHRlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGFuIElEb21haW5Nb2RlbCB0byBhdWdtZW50Ci0gKiBnZXRFbGVtZW50UHJvcGVydHkgZm9yIGFueSBEVEQgb2JqZWN0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREV4dGVuZGVyIHsKLQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShEVERPYmplY3QgZHRkT2JqZWN0LCBPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXh0ZXJuYWxFbnRpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXh0ZXJuYWxFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY4YjM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREV4dGVybmFsRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+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+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2VtPicKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKERUREZpbGUgdmFsdWUpOwotCi19IC8vIERUREV4dGVybmFsRW50aXR5Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4Mjc3N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuIEl0IHByb3ZpZGVzIGEKLSAqIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4gPCEtLSBlbmQtdXNlci1kb2MKLSAqIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGwuRFRERmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JvdXAgQ29udGVudDwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyb3VwIENvbnRlbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREdyb3VwQ29udGVudCBjcmVhdGVEVERHcm91cENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXR0cmlidXRlPC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXR0cmlidXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERBdHRyaWJ1dGUgY3JlYXRlRFREQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbGVtZW50IGNyZWF0ZURUREVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW1wdHkgQ29udGVudDwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVtcHR5IENvbnRlbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVtcHR5Q29udGVudCBjcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QW55IENvbnRlbnQ8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BbnkgQ29udGVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREQW55Q29udGVudCBjcmVhdGVEVERBbnlDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBDIERhdGEgQ29udGVudDwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBDIERhdGEgQ29udGVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREUENEYXRhQ29udGVudCBjcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBjcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GaWxlPC9lbT4nLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RmlsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERmlsZSBjcmVhdGVEVERGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2ljIFR5cGU8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNpYyBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERCYXNpY1R5cGUgY3JlYXRlRFREQmFzaWNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudW1lcmF0aW9uIFR5cGU8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnVtZXJhdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnVtZXJhdGlvblR5cGUgY3JlYXRlRFRERW51bWVyYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5vdGF0aW9uPC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Tm90YXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURE5vdGF0aW9uIGNyZWF0ZURURE5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudGl0eTwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudGl0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5IGNyZWF0ZURUREVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlcm5hbCBFbnRpdHk8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlcm5hbCBFbnRpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREV4dGVybmFsRW50aXR5IGNyZWF0ZURUREV4dGVybmFsRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkludGVybmFsIEVudGl0eTwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkludGVybmFsIEVudGl0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRESW50ZXJuYWxFbnRpdHkgY3JlYXRlRFRESW50ZXJuYWxFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnRpdHkgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnRpdHkgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREUGFja2FnZSBnZXREVERQYWNrYWdlKCk7Ci0KLX0gLy8gRFRERmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERGaWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJhZTI4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZpbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNpc1BhcnNlRXJyb3IgPGVtPlBhcnNlIEVycm9yPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERURENvbnRlbnQgPGVtPkRURCBDb250ZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERUREVudW1lcmF0aW9uVHlwZSA8ZW0+RFREIEVudW1lcmF0aW9uIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERmlsZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERGaWxlIGV4dGVuZHMgRU5hbWVkRWxlbWVudCwgRFRET2JqZWN0IHsKLQotCXB1YmxpYyBFTGlzdCBnZXREVERPYmplY3QoKTsKLQotCXB1YmxpYyBMaXN0IGxpc3REVERFbGVtZW50KCk7Ci0KLQlwdWJsaWMgTGlzdCBsaXN0RFRETm90YXRpb24oKTsKLQotCXB1YmxpYyBMaXN0IGxpc3REVERFbnRpdHkoKTsKLQotCXB1YmxpYyBMaXN0IGxpc3REVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQotCXB1YmxpYyBMaXN0IGxpc3REVERFbGVtZW50QW5kRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0KLQlwdWJsaWMgRFRERWxlbWVudCBmaW5kRWxlbWVudChTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgRFRERW50aXR5IGZpbmRFbnRpdHkoU3RyaW5nIG5hbWUpOwotCi0JcHVibGljIERURE5vdGF0aW9uIGZpbmROb3RhdGlvbihTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGZpbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoU3RyaW5nIG5hbWUpOwotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKGJvb2xlYW4gaW5jbHVkZUVycm9yKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERmlsZV9Db21tZW50KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnNlIEVycm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJzZSBFcnJvcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJzZSBFcnJvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyc2VFcnJvcihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREZpbGVfUGFyc2VFcnJvcigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNQYXJzZUVycm9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjaXNQYXJzZUVycm9yIDxlbT5QYXJzZSBFcnJvcjwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJzZSBFcnJvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNQYXJzZUVycm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJzZUVycm9yKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RFREIENvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBEVERDb250ZW50fS4gSXQKLQkgKiBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIENvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JICogbGlzdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgQ29udGVudDwvZW0+JyBjb250YWlubWVudAotCSAqICAgICAgICAgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERmlsZV9EVERDb250ZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudCNnZXREVERGaWxlCi0JICogQG1vZGVsIHR5cGU9IkRURENvbnRlbnQiIG9wcG9zaXRlPSJEVERGaWxlIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RFREQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RFREIEVudW1lcmF0aW9uIFR5cGU8L2I+PC9lbT4nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlCi0JICoge0BsaW5rIERUREVudW1lcmF0aW9uVHlwZX0uIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhCi0JICogZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+JwotCSAqICAgICAgICAgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERmlsZV9EVERFbnVtZXJhdGlvblR5cGUoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0RFRERmlsZQotCSAqIEBtb2RlbCB0eXBlPSJEVERFbnVtZXJhdGlvblR5cGUiIG9wcG9zaXRlPSJEVERGaWxlIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RFRERW51bWVyYXRpb25UeXBlKCk7Ci0KLX0gLy8gRFRERmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERHcm91cENvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRER3JvdXBDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjcyMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERHcm91cENvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyb3VwIENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRHcm91cEtpbmQgPGVtPkdyb3VwIEtpbmQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREdyb3VwQ29udGVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERHcm91cENvbnRlbnQgZXh0ZW5kcyBEVERSZXBlYXRhYmxlQ29udGVudCB7Ci0KLQlwdWJsaWMgaW50IGdldENvbnRlbnRQb3NpdGlvbihEVERFbGVtZW50Q29udGVudCBjb250ZW50KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwIEtpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kfS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwIEtpbmQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAgS2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZAotCSAqIEBzZWUgI3NldEdyb3VwS2luZChEVERHcm91cEtpbmQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRER3JvdXBDb250ZW50X0dyb3VwS2luZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREdyb3VwS2luZCBnZXRHcm91cEtpbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldEdyb3VwS2luZCA8ZW0+R3JvdXAgS2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cCBLaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kCi0JICogQHNlZSAjZ2V0R3JvdXBLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHcm91cEtpbmQoRFRER3JvdXBLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBEVERFbGVtZW50Q29udGVudH0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JICogICAgICAgICBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREdyb3VwQ29udGVudF9Db250ZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0R3JvdXAKLQkgKiBAbW9kZWwgdHlwZT0iRFRERWxlbWVudENvbnRlbnQiIG9wcG9zaXRlPSJncm91cCIgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDb250ZW50KCk7Ci0KLX0gLy8gRFRER3JvdXBDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwS2luZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERHcm91cEtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkOGIxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREdyb3VwS2luZCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERUREdyb3VwS2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VRVUVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjU0VRVUVOQ0VfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUVVFTkNFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNIT0lDRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNDSE9JQ0VfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TRVFVRU5DRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNFUVVFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1NFUVVFTkNFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERHcm91cEtpbmQgU0VRVUVOQ0VfTElURVJBTCA9IG5ldyBEVERHcm91cEtpbmQoU0VRVUVOQ0UsICJTRVFVRU5DRSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DSE9JQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DSE9JQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQ0hPSUNFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERHcm91cEtpbmQgQ0hPSUNFX0xJVEVSQUwgPSBuZXcgRFRER3JvdXBLaW5kKENIT0lDRSwgIkNIT0lDRSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERUREdyb3VwS2luZFtdIFZBTFVFU19BUlJBWSA9IG5ldyBEVERHcm91cEtpbmRbXXtTRVFVRU5DRV9MSVRFUkFMLCBDSE9JQ0VfTElURVJBTCx9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkdyb3VwIEtpbmQ8L2I+PC9lbT4nCi0JICogZW51bWVyYXRvcnMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Hcm91cCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERUREdyb3VwS2luZCBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURUREdyb3VwS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkdyb3VwIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERUREdyb3VwS2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgU0VRVUVOQ0UgOgotCQkJCXJldHVybiBTRVFVRU5DRV9MSVRFUkFMOwotCQkJY2FzZSBDSE9JQ0UgOgotCQkJCXJldHVybiBDSE9JQ0VfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRFRER3JvdXBLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvLyBEVERHcm91cEtpbmQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRESW50ZXJuYWxFbnRpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRESW50ZXJuYWxFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyODcyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREludGVybmFsRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlcm5hbCBFbnRpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERJbnRlcm5hbEVudGl0eSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERJbnRlcm5hbEVudGl0eSBleHRlbmRzIERUREVudGl0eUNvbnRlbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsIHRoZXJlCi0JICogcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREludGVybmFsRW50aXR5X1ZhbHVlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRFRESW50ZXJuYWxFbnRpdHkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRETGV4aWNhbEluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRETGV4aWNhbEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3OTk3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURExleGljYWxJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotcHVibGljIGNsYXNzIERURExleGljYWxJbmZvIGltcGxlbWVudHMgRFREU291cmNlT2Zmc2V0IHsKLQkvLyBCZWdpbiBVc2VyIERlZmluZWQgTWV0aG9kcwotCWludCBzdGFydE9mZnNldDsKLQlpbnQgZW5kT2Zmc2V0OwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBzdGFydE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJdGhpcy5zdGFydE9mZnNldCA9IHY7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBlbmRPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0KLQkJdGhpcy5lbmRPZmZzZXQgPSB2OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFN0YXJ0T2Zmc2V0R2VuKCkgewotCi0JCXJldHVybiBzdGFydE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3RhcnRPZmZzZXRHZW4oaW50IHYpIHsKLQotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gdjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldEVuZE9mZnNldEdlbigpIHsKLQotCQlyZXR1cm4gZW5kT2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVuZE9mZnNldEdlbihpbnQgdikgewotCi0KLQkJdGhpcy5lbmRPZmZzZXQgPSB2OwotCX0KLX0vLyBEVERTb3VyY2VPZmZzZXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRETm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRETm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ2YmI3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURE5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ob3RhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0U3lzdGVtSUQgPGVtPlN5c3RlbSBJRDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0UHVibGljSUQgPGVtPlB1YmxpYyBJRDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRETm90YXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRETm90YXRpb24gZXh0ZW5kcyBFTmFtZWRFbGVtZW50LCBEVERDb250ZW50LCBEVERPYmplY3QsIERURFNvdXJjZU9mZnNldCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURE5vdGF0aW9uX0NvbW1lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN5c3RlbSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3lzdGVtIElEPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN5c3RlbSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3lzdGVtSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURE5vdGF0aW9uX1N5c3RlbUlEKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFN5c3RlbUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFN5c3RlbUlEIDxlbT5TeXN0ZW0gSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3lzdGVtIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTeXN0ZW1JRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1YmxpYyBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHVibGljIElEPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1YmxpYyBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVibGljSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURE5vdGF0aW9uX1B1YmxpY0lEKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1YmxpY0lEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFB1YmxpY0lEIDxlbT5QdWJsaWMgSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGljIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdWJsaWNJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVibGljSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIERUREV4dGVybmFsRW50aXR5fS4gSXQgaXMKLQkgKiBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnRpdHk8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRETm90YXRpb25fRW50aXR5KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0Tm90YXRpb24KLQkgKiBAbW9kZWwgdHlwZT0iRFRERXh0ZXJuYWxFbnRpdHkiIG9wcG9zaXRlPSJub3RhdGlvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RW50aXR5KCk7Ci0KLX0gLy8gRFRETm90YXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRET2JqZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDNkYjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRET2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLy8gUmVmIHBhY2thZ2UKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotcHVibGljIGludGVyZmFjZSBEVERPYmplY3QgZXh0ZW5kcyBFT2JqZWN0IHsKLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCk7Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCk7Ci0KLX0gLy8gRFRET2JqZWN0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURE9jY3VycmVuY2VUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURE9jY3VycmVuY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOGZiNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERPY2N1cnJlbmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPk9jY3VycmVuY2UgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURE9jY3VycmVuY2VUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRET2NjdXJyZW5jZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNPTkVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9ORSA9IDQ5OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1BUSU9OQUw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjT1BUSU9OQUxfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTkFMID0gNjM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PTkUgT1IgTU9SRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNPTkVfT1JfTU9SRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05FX09SX01PUkUgPSA0MzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlpFUk8gT1IgTU9SRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNaRVJPX09SX01PUkVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFpFUk9fT1JfTU9SRSA9IDQyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNPTkUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURE9jY3VycmVuY2VUeXBlIE9ORV9MSVRFUkFMID0gbmV3IERURE9jY3VycmVuY2VUeXBlKE9ORSwgIk9ORSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PUFRJT05BTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9QVElPTkFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09QVElPTkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZSBPUFRJT05BTF9MSVRFUkFMID0gbmV3IERURE9jY3VycmVuY2VUeXBlKE9QVElPTkFMLCAiT1BUSU9OQUwiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T05FIE9SIE1PUkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PTkUgT1IgTU9SRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNPTkVfT1JfTU9SRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRET2NjdXJyZW5jZVR5cGUgT05FX09SX01PUkVfTElURVJBTCA9IG5ldyBEVERPY2N1cnJlbmNlVHlwZShPTkVfT1JfTU9SRSwgIk9ORV9PUl9NT1JFIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlpFUk8gT1IgTU9SRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlpFUk8gT1IgTU9SRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNaRVJPX09SX01PUkUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURE9jY3VycmVuY2VUeXBlIFpFUk9fT1JfTU9SRV9MSVRFUkFMID0gbmV3IERURE9jY3VycmVuY2VUeXBlKFpFUk9fT1JfTU9SRSwgIlpFUk9fT1JfTU9SRSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRET2NjdXJyZW5jZVR5cGVbXSBWQUxVRVNfQVJSQVkgPSBuZXcgRFRET2NjdXJyZW5jZVR5cGVbXXtPTkVfTElURVJBTCwgT1BUSU9OQUxfTElURVJBTCwgT05FX09SX01PUkVfTElURVJBTCwgWkVST19PUl9NT1JFX0xJVEVSQUwsfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlIFR5cGU8L2I+PC9lbT4nCi0JICogZW51bWVyYXRvcnMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRET2NjdXJyZW5jZVR5cGUgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlEVERPY2N1cnJlbmNlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk9jY3VycmVuY2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRET2NjdXJyZW5jZVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE9ORSA6Ci0JCQkJcmV0dXJuIE9ORV9MSVRFUkFMOwotCQkJY2FzZSBPUFRJT05BTCA6Ci0JCQkJcmV0dXJuIE9QVElPTkFMX0xJVEVSQUw7Ci0JCQljYXNlIE9ORV9PUl9NT1JFIDoKLQkJCQlyZXR1cm4gT05FX09SX01PUkVfTElURVJBTDsKLQkJCWNhc2UgWkVST19PUl9NT1JFIDoKLQkJCQlyZXR1cm4gWkVST19PUl9NT1JFX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERURE9jY3VycmVuY2VUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvLyBEVERPY2N1cnJlbmNlVHlwZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQQ0RhdGFDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBDRGF0YUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhZjVkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBDRGF0YUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBDIERhdGEgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURFBDRGF0YUNvbnRlbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREUENEYXRhQ29udGVudCBleHRlbmRzIERUREVsZW1lbnRDb250ZW50IHsKLX0gLy8gRFREUENEYXRhQ29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlODRjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQgY29udGFpbnMKLSAqIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmFjdG9yeQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERURFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImR0ZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vY29tL2libS9ldG9vbHMvZHRkLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbGVtZW50Q29udGVudEltcGwgPGVtPkVsZW1lbnQgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudENvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERWxlbWVudENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfQ09OVEVOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RWxlbWVudCBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUmVwZWF0YWJsZUNvbnRlbnRJbXBsIDxlbT5SZXBlYXRhYmxlIENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFJlcGVhdGFibGVDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERURFJlcGVhdGFibGVDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9SRVBFQVRBQkxFX0NPTlRFTlQgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9jY3VycmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRSA9IERURF9FTEVNRU5UX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlJlcGVhdGFibGUgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREdyb3VwQ29udGVudEltcGwgPGVtPkdyb3VwIENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREdyb3VwQ29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERHcm91cENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0NPTlRFTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfR1JPVVBfQ09OVEVOVF9fT0NDVVJSRU5DRSA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfR1JPVVBfQ09OVEVOVF9fR1JPVVBfS0lORCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9HUk9VUF9DT05URU5UX19DT05URU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+R3JvdXAgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBdHRyaWJ1dGVJbXBsIDxlbT5BdHRyaWJ1dGU8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREF0dHJpYnV0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX05BTUUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19FVFlQRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19FVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2VhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0NIQU5HRUFCTEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fQ0hBTkdFQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Wb2xhdGlsZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19WT0xBVElMRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19WT0xBVElMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fVFJBTlNJRU5UID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1RSQU5TSUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fVU5JUVVFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlIExpdGVyYWw8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19MT1dFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19MT1dFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcHBlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19VUFBFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19VUFBFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX01BTlkgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fTUFOWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19SRVFVSVJFRCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQ29udGFpbmluZyBDbGFzczwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19FQ09OVEFJTklOR19DTEFTUyA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19FQ09OVEFJTklOR19DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbnNldHRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX1VOU0VUVEFCTEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVU5TRVRUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19JRCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fRUFUVFJJQlVURV9UWVBFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0NPTU1FTlQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IEtpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fREVGQVVMVF9LSU5EID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9TVFJJTkcgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkF0dHJpYnV0ZTwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbGVtZW50SW1wbCA8ZW0+RWxlbWVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTEVNRU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzIE5hbWU8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTU19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0RFRkFVTFRfVkFMVUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYWNrYWdlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRVBBQ0tBR0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fQUJTVFJBQ1QgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0lOVEVSRkFDRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOVEVSRkFDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRVNVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVNVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VPUEVSQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRU9QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBBdHRyaWJ1dGVzPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBTExfQVRUUklCVVRFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFMTF9SRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVSZWZlcmVuY2VzPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VSRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVJFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIENvbnRhaW5tZW50czwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQUxMX0NPTlRBSU5NRU5UUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfQ09OVEFJTk1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgT3BlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQUxMX09QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX09QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdHJ1Y3R1cmFsIEZlYXR1cmVzPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN1cGVyIFR5cGVzPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBTExfU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVJRCBBdHRyaWJ1dGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VJRF9BVFRSSUJVVEUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FSURfQVRUUklCVVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRFREX0ZJTEUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0NPTU1FTlQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0NPTlRFTlQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBBdHRyaWJ1dGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW1wdHlDb250ZW50SW1wbCA8ZW0+RW1wdHkgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW1wdHlDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVtcHR5Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRU1QVFlfQ09OVEVOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTVBUWV9DT05URU5UX19HUk9VUCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTVBUWV9DT05URU5UX19FTEVNRU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RW1wdHkgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VNUFRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBbnlDb250ZW50SW1wbCA8ZW0+QW55IENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREFueUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREQW55Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfQU5ZX0NPTlRFTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQU5ZX0NPTlRFTlRfX0dST1VQID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FOWV9DT05URU5UX19FTEVNRU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QW55IENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BTllfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBDRGF0YUNvbnRlbnRJbXBsIDxlbT5QQyBEYXRhIENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBDRGF0YUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREUENEYXRhQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfUENfREFUQV9DT05URU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAgPSBEVERfRUxFTUVOVF9DT05URU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UEMgRGF0YSBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUENfREFUQV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsIDxlbT5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIEVsZW1lbnQ8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX1JFRkVSRU5DRURfRUxFTUVOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERmlsZUltcGwgPGVtPkZpbGU8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREZpbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRklMRSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRklMRV9fQ09NTUVOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyc2UgRXJyb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0ZJTEVfX1BBUlNFX0VSUk9SID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgQ29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9GSUxFX19EVERfQ09OVEVOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEVudW1lcmF0aW9uIFR5cGU8L2I+PC9lbT4nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkZpbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9GSUxFX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQmFzaWNUeXBlSW1wbCA8ZW0+QmFzaWMgVHlwZTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQmFzaWNUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREJhc2ljVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRSA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3MgTmFtZTwvYj48L2VtPicKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX0NMQVNTX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fREVGQVVMVF9WQUxVRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FUEFDS0FHRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VQQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19BQlNUUkFDVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fSU5URVJGQUNFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5URVJGQUNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRU9QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFMTF9BVFRSSUJVVEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9BVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQUxMX1JFRkVSRU5DRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1JFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVJlZmVyZW5jZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRVJFRkVSRU5DRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQVRUUklCVVRFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQ29udGFpbm1lbnRzPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBTExfQ09OVEFJTk1FTlRTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9DT05UQUlOTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBPcGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBTExfT1BFUkFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN0cnVjdHVyYWwgRmVhdHVyZXM8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3VwZXIgVHlwZXM8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFMTF9TVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUlEIEF0dHJpYnV0ZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUlEX0FUVFJJQlVURSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VJRF9BVFRSSUJVVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fS0lORCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJhc2ljIFR5cGU8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW51bWVyYXRpb25UeXBlSW1wbCA8ZW0+RW51bWVyYXRpb24gVHlwZTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW51bWVyYXRpb25UeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVudW1lcmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRSA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRUVOVU1fX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19OQU1FID0gRWNvcmVQYWNrYWdlLkVFTlVNX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzIE5hbWU8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgPSBFY29yZVBhY2thZ2UuRUVOVU1fX0lOU1RBTkNFX0NMQVNTX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVFTlVNX19JTlNUQU5DRV9DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVFTlVNX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYWNrYWdlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UgPSBFY29yZVBhY2thZ2UuRUVOVU1fX0VQQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcmlhbGl6YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fU0VSSUFMSVpBQkxFID0gRWNvcmVQYWNrYWdlLkVFTlVNX19TRVJJQUxJWkFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUxpdGVyYWxzPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA9IEVjb3JlUGFja2FnZS5FRU5VTV9fRUxJVEVSQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQgPSBFY29yZVBhY2thZ2UuRUVOVU1fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA9IEVjb3JlUGFja2FnZS5FRU5VTV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RW51bWVyYXRpb24gVHlwZTwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FRU5VTV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURENvbnRlbnRJbXBsIDxlbT5Db250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERURENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0NPTlRFTlQgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0NPTlRFTlRfX0RURF9GSUxFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Q29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwgPGVtPk5vdGF0aW9uPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVEROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfTk9UQVRJT04gPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX05PVEFUSU9OX19EVERfRklMRSA9IERURF9DT05URU5UX19EVERfRklMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9OT1RBVElPTl9fQ09NTUVOVCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN5c3RlbSBJRDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfTk9UQVRJT05fX1NZU1RFTV9JRCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1YmxpYyBJRDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfTk9UQVRJT05fX1BVQkxJQ19JRCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9OT1RBVElPTl9fRU5USVRZID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk5vdGF0aW9uPC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfTk9UQVRJT05fRkVBVFVSRV9DT1VOVCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5SW1wbCA8ZW0+RW50aXR5PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTlRJVFkgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fRFREX0ZJTEUgPSBEVERfQ09OVEVOVF9fRFREX0ZJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19DT01NRU5UID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1ldGVyIEVudGl0eTwvYj48L2VtPicKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19DT05URU5UID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFybSBFbnRpdHkgUmVmPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBSZWZlcmVuY2U8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVudGl0eTwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9GRUFUVVJFX0NPVU5UID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlDb250ZW50SW1wbCA8ZW0+RW50aXR5IENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERW50aXR5Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRU5USVRZX0NPTlRFTlQgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRW50aXR5PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbnRpdHkgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERXh0ZXJuYWxFbnRpdHlJbXBsIDxlbT5FeHRlcm5hbCBFbnRpdHk8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREV4dGVybmFsRW50aXR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREV4dGVybmFsRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FWFRFUk5BTF9FTlRJVFkgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRW50aXR5PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZID0gRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN5c3RlbSBJRDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRVhURVJOQUxfRU5USVRZX19TWVNURU1fSUQgPSBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGljIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCA9IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RhdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA9IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgUmVmZXJlbmNlZCBGcm9tIEFub3RoZXIgRmlsZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRVhURVJOQUxfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFRF9GUk9NX0FOT1RIRVJfRklMRSA9IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXh0ZXJuYWwgRW50aXR5PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRVhURVJOQUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERJbnRlcm5hbEVudGl0eUltcGwgPGVtPkludGVybmFsIEVudGl0eTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRESW50ZXJuYWxFbnRpdHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRESW50ZXJuYWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0lOVEVSTkFMX0VOVElUWSA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBFbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgPSBEVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0lOVEVSTkFMX0VOVElUWV9fVkFMVUUgPSBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkludGVybmFsIEVudGl0eTwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0lOVEVSTkFMX0VOVElUWV9GRUFUVVJFX0NPVU5UID0gRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCA8ZW0+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgPSBEVERfQ09OVEVOVF9fRFREX0ZJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyByZWZlcmVuY2UuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlPC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfRkVBVFVSRV9DT1VOVCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEltcGwgPGVtPkVudGl0eSBSZWZlcmVuY2UgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlQgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVudGl0eSBSZWZlcmVuY2UgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZSA8ZW0+T2NjdXJyZW5jZSBUeXBlPC9lbT59JwotCSAqIGVudW0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERURE9jY3VycmVuY2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9PQ0NVUlJFTkNFX1RZUEUgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZCA8ZW0+RGVmYXVsdCBLaW5kPC9lbT59JwotCSAqIGVudW0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERURERlZmF1bHRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9ERUZBVUxUX0tJTkQgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kIDxlbT5CYXNpYyBUeXBlIEtpbmQ8L2VtPn0nCi0JICogZW51bS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERCYXNpY1R5cGVLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX0tJTkQgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kIDxlbT5FbnVtIEdyb3VwIEtpbmQ8L2VtPn0nCi0JICogZW51bS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbnVtR3JvdXBLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTlVNX0dST1VQX0tJTkQgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQgPGVtPkdyb3VwIEtpbmQ8L2VtPn0nCi0JICogZW51bS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREdyb3VwS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfR1JPVVBfS0lORCA9IDI0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLlhNTFNjaGVtYURlZmluZWRUeXBlIDxlbT5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvZW0+fScKLQkgKiBlbnVtLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuWE1MU2NoZW1hRGVmaW5lZFR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXRYTUxTY2hlbWFEZWZpbmVkVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBYTUxfU0NIRU1BX0RFRklORURfVFlQRSA9IDI1OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50IDxlbT5FbGVtZW50IENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsZW1lbnQgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVsZW1lbnRDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXREVERFbGVtZW50Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudENvbnRlbnRfR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0RWxlbWVudCgpCi0JICogQHNlZSAjZ2V0RFRERWxlbWVudENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVsZW1lbnRDb250ZW50X0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50IDxlbT5Hcm91cCBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Hcm91cCBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREdyb3VwQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRHcm91cEtpbmQgPGVtPkdyb3VwIEtpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R3JvdXAgS2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldEdyb3VwS2luZCgpCi0JICogQHNlZSAjZ2V0RFRER3JvdXBDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERHcm91cENvbnRlbnRfR3JvdXBLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRDb250ZW50KCkKLQkgKiBAc2VlICNnZXREVERHcm91cENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREdyb3VwQ29udGVudF9Db250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSA8ZW0+QXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFREQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldENvbW1lbnQoKQotCSAqIEBzZWUgI2dldERUREF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFREQXR0cmlidXRlX0NvbW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdEtpbmQgPGVtPkRlZmF1bHQgS2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IEtpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0S2luZCgpCi0JICogQHNlZSAjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERBdHRyaWJ1dGVfRGVmYXVsdEtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIDxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRWYWx1ZVN0cmluZygpCi0JICogQHNlZSAjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERBdHRyaWJ1dGVfRGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAc2VlICNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQHNlZSAjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERUREVsZW1lbnQgPGVtPkRURCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5EVEQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERUREVsZW1lbnQoKQotCSAqIEBzZWUgI2dldERUREF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFREQXR0cmlidXRlX0RUREVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db21tZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbW1lbnQoKQotCSAqIEBzZWUgI2dldERUREVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREVsZW1lbnRfQ29tbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbnRlbnQoKQotCSAqIEBzZWUgI2dldERUREVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVsZW1lbnRfQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXREVERBdHRyaWJ1dGUgPGVtPkRURCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EVEQgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldERUREF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0RFRERWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudF9EVERBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50IDxlbT5FbXB0eSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbXB0eSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVtcHR5Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50IDxlbT5BbnkgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QW55IENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREFueUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudCA8ZW0+UEMgRGF0YSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QQyBEYXRhIENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERURFBDRGF0YUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgPGVtPkVsZW1lbnQgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50I2dldFJlZmVyZW5jZWRFbGVtZW50IDxlbT5SZWZlcmVuY2VkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCNnZXRSZWZlcmVuY2VkRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50X1JlZmVyZW5jZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50IDxlbT5SZXBlYXRhYmxlIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlcGVhdGFibGUgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERURFJlcGVhdGFibGVDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQjZ2V0T2NjdXJyZW5jZSA8ZW0+T2NjdXJyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PY2N1cnJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudCNnZXRPY2N1cnJlbmNlKCkKLQkgKiBAc2VlICNnZXREVERSZXBlYXRhYmxlQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnRfT2NjdXJyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlIDxlbT5GaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5GaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0Q29tbWVudCgpCi0JICogQHNlZSAjZ2V0RFRERmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERmlsZV9Db21tZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNpc1BhcnNlRXJyb3IgPGVtPlBhcnNlIEVycm9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcnNlIEVycm9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2lzUGFyc2VFcnJvcigpCi0JICogQHNlZSAjZ2V0RFRERmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERmlsZV9QYXJzZUVycm9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERURENvbnRlbnQgPGVtPkRURCBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RFREIENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFREQ29udGVudCgpCi0JICogQHNlZSAjZ2V0RFRERmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERmlsZV9EVERDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERUREVudW1lcmF0aW9uVHlwZSA8ZW0+RFREIEVudW1lcmF0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERFbnVtZXJhdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREZpbGVfRFRERW51bWVyYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZSA8ZW0+QmFzaWMgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmFzaWMgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERCYXNpY1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGUjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGUjZ2V0S2luZCgpCi0JICogQHNlZSAjZ2V0RFREQmFzaWNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERCYXNpY1R5cGVfS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUgPGVtPkVudW1lcmF0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVudW1lcmF0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERW51bWVyYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldEtpbmQoKQotCSAqIEBzZWUgI2dldERUREVudW1lcmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERW51bWVyYXRpb25UeXBlX0tpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5EVEQgRmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldERUREZpbGUoKQotCSAqIEBzZWUgI2dldERUREVudW1lcmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW51bWVyYXRpb25UeXBlX0RUREZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Ob3RhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERURE5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db21tZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRDb21tZW50KCkKLQkgKiBAc2VlICNnZXREVEROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRETm90YXRpb25fQ29tbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFN5c3RlbUlEIDxlbT5TeXN0ZW0gSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3lzdGVtIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRTeXN0ZW1JRCgpCi0JICogQHNlZSAjZ2V0RFRETm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERURE5vdGF0aW9uX1N5c3RlbUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0UHVibGljSUQgPGVtPlB1YmxpYyBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdWJsaWMgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFB1YmxpY0lEKCkKLQkgKiBAc2VlICNnZXREVEROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRETm90YXRpb25fUHVibGljSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRFbnRpdHkoKQotCSAqIEBzZWUgI2dldERURE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVEROb3RhdGlvbl9FbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5IDxlbT5FbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db21tZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29tbWVudCgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERFbnRpdHlfQ29tbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNpc1BhcmFtZXRlckVudGl0eSA8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjaXNQYXJhbWV0ZXJFbnRpdHkoKQotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERW50aXR5X1BhcmFtZXRlckVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb250ZW50KCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudGl0eV9Db250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldFBhcm1FbnRpdHlSZWYgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRQYXJtRW50aXR5UmVmKCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlIDxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEVudGl0eVJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfRW50aXR5UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfQXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKQotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudCA8ZW0+RW50aXR5IENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVudGl0eSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbnRpdHlDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQjZ2V0RFRERW50aXR5IDxlbT5EVEQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5EVEQgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50I2dldERUREVudGl0eSgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW50aXR5Q29udGVudF9EVERFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkgPGVtPkV4dGVybmFsIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZXJuYWwgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRTeXN0ZW1JRCA8ZW0+U3lzdGVtIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN5c3RlbSBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0U3lzdGVtSUQoKQotCSAqIEBzZWUgI2dldERUREV4dGVybmFsRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERFeHRlcm5hbEVudGl0eV9TeXN0ZW1JRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFB1YmxpY0lEIDxlbT5QdWJsaWMgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVibGljIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRQdWJsaWNJRCgpCi0JICogQHNlZSAjZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREV4dGVybmFsRW50aXR5X1B1YmxpY0lEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk5vdGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXROb3RhdGlvbigpCi0JICogQHNlZSAjZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREV4dGVybmFsRW50aXR5X05vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA8ZW0+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKQotCSAqIEBzZWUgI2dldERUREV4dGVybmFsRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFeHRlcm5hbEVudGl0eV9FbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5IDxlbT5JbnRlcm5hbCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkludGVybmFsIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREludGVybmFsRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RFRESW50ZXJuYWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREludGVybmFsRW50aXR5X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSA8ZW0+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHkoKQotCSAqIEBzZWUgI2dldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IDxlbT5FbnRpdHkgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVudGl0eSBSZWZlcmVuY2UgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQjZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCNnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudF9FbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkRURCBGaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50I2dldERUREZpbGUoKQotCSAqIEBzZWUgI2dldERURENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERURENvbnRlbnRfRFRERmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlIDxlbT5PY2N1cnJlbmNlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+T2NjdXJyZW5jZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXREVERPY2N1cnJlbmNlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RGVmYXVsdCBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXREVEREZWZhdWx0S2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQgPGVtPkJhc2ljIFR5cGUgS2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5CYXNpYyBUeXBlIEtpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0RFREQmFzaWNUeXBlS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQgPGVtPkVudW0gR3JvdXAgS2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5FbnVtIEdyb3VwIEtpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0RFRERW51bUdyb3VwS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZCA8ZW0+R3JvdXAgS2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Hcm91cCBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0RFRER3JvdXBLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuWE1MU2NoZW1hRGVmaW5lZFR5cGUgPGVtPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRYTUxTY2hlbWFEZWZpbmVkVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREZhY3RvcnkgZ2V0RFRERmFjdG9yeSgpOwotCi19IC8vIERURFBhY2thZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRmOTE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UjZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBleHRlbmRzIEVOYW1lZEVsZW1lbnQsIERURENvbnRlbnQsIERURE9iamVjdCwgRFREU291cmNlT2Zmc2V0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4gSXQgaXMKLQkgKiBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRQYXJtRW50aXR5UmVmIDxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RW50aXR5KERUREVudGl0eSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldFBhcm1FbnRpdHlSZWYKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InBhcm1FbnRpdHlSZWYiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHkgZ2V0RW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHk8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RW50aXR5KERUREVudGl0eSB2YWx1ZSk7Ci0KLX0gLy8gRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFJlcGVhdGFibGVDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFJlcGVhdGFibGVDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YjUxMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERSZXBlYXRhYmxlQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBlYXRhYmxlIENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50I2dldE9jY3VycmVuY2UgPGVtPk9jY3VycmVuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERURFJlcGVhdGFibGVDb250ZW50IGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnQgewotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyB1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9jY3VycmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGV9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2NjdXJyZW5jZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PY2N1cnJlbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGUKLQkgKiBAc2VlICNzZXRPY2N1cnJlbmNlKERURE9jY3VycmVuY2VUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURFJlcGVhdGFibGVDb250ZW50X09jY3VycmVuY2UoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERPY2N1cnJlbmNlVHlwZSBnZXRPY2N1cnJlbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50I2dldE9jY3VycmVuY2UgPGVtPk9jY3VycmVuY2U8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2NjdXJyZW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlCi0JICogQHNlZSAjZ2V0T2NjdXJyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T2NjdXJyZW5jZShEVERPY2N1cnJlbmNlVHlwZSB2YWx1ZSk7Ci0KLX0gLy8gRFREUmVwZWF0YWJsZUNvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVzb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkZDFmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRFREUmVzb3VyY2UgewotCS8vIEVudW1lcmF0aW9uIENvbnN0YW50cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWUlDT04gPSAiaWNvbnMvYW55LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5USUNPTiA9ICJpY29ucy9lbGVtZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlJQ09OID0gImljb25zL2VudGl0eS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFSUNPTiA9ICJpY29ucy9hdHRyaWJ1dGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OSUNPTiA9ICJpY29ucy9ub3RhdGlvbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlJQ09OID0gImljb25zL2VtcHR5Y29udGVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENEQVRBSUNPTiA9ICJpY29ucy9vbmUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWVJFRkVSRU5DRUlDT04gPSAiaWNvbnMvZW50aXR5X3JlZmVyZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVJQ09OID0gImljb25zL29uZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUxJQ09OID0gImljb25zL29wdGlvbmFsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVPUk1PUkVJQ09OID0gImljb25zL29uZW9ybW9yZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST09STU9SRUlDT04gPSAiaWNvbnMvemVyb29ybW9yZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVTRVFVRU5DRUlDT04gPSAiaWNvbnMvb25lc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMU0VRVUVOQ0VJQ09OID0gImljb25zL29wdGlvbmFsc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORU9STU9SRVNFUVVFTkNFSUNPTiA9ICJpY29ucy9vbmVvcm1vcmVzZXF1ZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST09STU9SRVNFUVVFTkNFSUNPTiA9ICJpY29ucy96ZXJvb3Jtb3Jlc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FQ0hPSUNFSUNPTiA9ICJpY29ucy9vbmVjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMQ0hPSUNFSUNPTiA9ICJpY29ucy9vcHRpb25hbGNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFQ0hPSUNFSUNPTiA9ICJpY29ucy9vbmVvcm1vcmVjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9PUk1PUkVDSE9JQ0VJQ09OID0gImljb25zL3plcm9vcm1vcmVjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRERklMRUlDT04gPSAiaWNvbnMvRFRERmlsZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdEVEQgPSAiaWNvbnMvbmV3ZHRkX3dpei5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXSFRNTEZPUk0gPSAiaWNvbnMvZ2VuaHRtZm9ybV93aXouZ2lmIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERTb3VyY2VPZmZzZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREU291cmNlT2Zmc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MzYyODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERTb3VyY2VPZmZzZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRFREU291cmNlT2Zmc2V0IHsKLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpOwotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpOwotCi19Ly8gRFREU291cmNlT2Zmc2V0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzc0NjIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotcHVibGljIGludGVyZmFjZSBEVERUeXBlIGV4dGVuZHMgRFRET2JqZWN0IHsKLQkvLyBjb25zdGFudCBzdHJpbmdzIGZvciBkdGQgYXR0cmlidXRlIHR5cGVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJOb25lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEEgPSAiQ2hhcmFjdGVyIERhdGEgKENEQVRBKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJJZGVudGlmaWVyIChJRCkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUYgPSAiSUQgUmVmZXJlbmNlIChJRFJFRikiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZTID0gIklEIFJlZmVyZW5jZXMgKElEUkVGUykiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZID0gIkVudGl0eSBOYW1lIChFTlRJVFkpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUSUVTID0gIkVudGl0eSBOYW1lcyAoRU5USVRJRVMpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU4gPSAiTmFtZSBUb2tlbiAoTk1UT0tFTikiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTlMgPSAiTmFtZSBUb2tlbnMgKE5NVE9LRU5TKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNX05BTUVfVE9LRU5fR1JPVVAgPSAiRW51bWVyYXRlZCBOYW1lIFRva2VucyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNX05PVEFUSU9OX0dST1VQID0gIkVudW1lcmF0ZWQgTk9UQVRJT04iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvWE1MU2NoZW1hRGVmaW5lZFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvWE1MU2NoZW1hRGVmaW5lZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjNjhhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL1hNTFNjaGVtYURlZmluZWRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXRYTUxTY2hlbWFEZWZpbmVkVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTFNjaGVtYURlZmluZWRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PTkVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAtMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNUUklORzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNTVFJJTkdfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklORyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CT09MRUFOPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0JPT0xFQU5fTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPT0xFQU4gPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RkxPQVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRkxPQVRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMT0FUID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRPVUJMRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNET1VCTEVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPVUJMRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5ERUNJTUFMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0RFQ0lNQUxfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQ0lNQUwgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRUlOU1RBTlQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVElNRUlOU1RBTlRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVJTlNUQU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUVEVVJBVElPTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNUSU1FRFVSQVRJT05fTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVEVVJBVElPTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRUNVUlJJTkdJTlNUQU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1JFQ1VSUklOR0lOU1RBTlRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQ1VSUklOR0lOU1RBTlQgPSA4OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QklOQVJZPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0JJTkFSWV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklOQVJZID0gOTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNVUklfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVSSSA9IDEwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5URUdFUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJTlRFR0VSX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFR0VSID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5EQVRFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0RBVEVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEUgPSAxMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVElNRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRSA9IDEzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PTkUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIE5PTkVfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShOT05FLCAiTk9ORSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TVFJJTkc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TVFJJTkc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjU1RSSU5HCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBTVFJJTkdfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShTVFJJTkcsICJTVFJJTkciKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Qk9PTEVBTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkJPT0xFQU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQk9PTEVBTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgQk9PTEVBTl9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKEJPT0xFQU4sICJCT09MRUFOIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZMT0FUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RkxPQVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRkxPQVQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIEZMT0FUX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoRkxPQVQsICJGTE9BVCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5ET1VCTEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5ET1VCTEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRE9VQkxFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBET1VCTEVfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShET1VCTEUsICJET1VCTEUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+REVDSU1BTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRFQ0lNQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjREVDSU1BTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgREVDSU1BTF9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKERFQ0lNQUwsICJERUNJTUFMIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUVJTlNUQU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VElNRUlOU1RBTlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Ci0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVElNRUlOU1RBTlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIFRJTUVJTlNUQU5UX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoVElNRUlOU1RBTlQsICJUSU1FSU5TVEFOVCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FRFVSQVRJT048L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5USU1FRFVSQVRJT048L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Ci0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVElNRURVUkFUSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBUSU1FRFVSQVRJT05fTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShUSU1FRFVSQVRJT04sICJUSU1FRFVSQVRJT04iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVDVVJSSU5HSU5TVEFOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJFQ1VSUklOR0lOU1RBTlQ8L2I+PC9lbT4nIGxpdGVyYWwKLQkgKiBvYmplY3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uCi0JICogaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNSRUNVUlJJTkdJTlNUQU5UCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBSRUNVUlJJTkdJTlNUQU5UX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoUkVDVVJSSU5HSU5TVEFOVCwgIlJFQ1VSUklOR0lOU1RBTlQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QklOQVJZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QklOQVJZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0JJTkFSWQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgQklOQVJZX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoQklOQVJZLCAiQklOQVJZIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVVJJCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBVUklfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShVUkksICJVUkkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5URUdFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOVEVHRVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSU5URUdFUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgSU5URUdFUl9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKElOVEVHRVIsICJJTlRFR0VSIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRBVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+REFURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNEQVRFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBEQVRFX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoREFURSwgIkRBVEUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5USU1FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1RJTUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIFRJTUVfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShUSU1FLCAiVElNRSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2I+PC9lbT4nCi0JICogZW51bWVyYXRvcnMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZVtdIFZBTFVFU19BUlJBWSA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZVtde05PTkVfTElURVJBTCwgU1RSSU5HX0xJVEVSQUwsIEJPT0xFQU5fTElURVJBTCwgRkxPQVRfTElURVJBTCwgRE9VQkxFX0xJVEVSQUwsIERFQ0lNQUxfTElURVJBTCwgVElNRUlOU1RBTlRfTElURVJBTCwgVElNRURVUkFUSU9OX0xJVEVSQUwsIFJFQ1VSUklOR0lOU1RBTlRfTElURVJBTCwgQklOQVJZX0xJVEVSQUwsIFVSSV9MSVRFUkFMLCBJTlRFR0VSX0xJVEVSQUwsIERBVEVfTElURVJBTCwgVElNRV9MSVRFUkFMLH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2I+PC9lbT4nCi0JICogZW51bWVyYXRvcnMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUxTY2hlbWFEZWZpbmVkVHlwZSBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVhNTFNjaGVtYURlZmluZWRUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNTFNjaGVtYURlZmluZWRUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBOT05FIDoKLQkJCQlyZXR1cm4gTk9ORV9MSVRFUkFMOwotCQkJY2FzZSBTVFJJTkcgOgotCQkJCXJldHVybiBTVFJJTkdfTElURVJBTDsKLQkJCWNhc2UgQk9PTEVBTiA6Ci0JCQkJcmV0dXJuIEJPT0xFQU5fTElURVJBTDsKLQkJCWNhc2UgRkxPQVQgOgotCQkJCXJldHVybiBGTE9BVF9MSVRFUkFMOwotCQkJY2FzZSBET1VCTEUgOgotCQkJCXJldHVybiBET1VCTEVfTElURVJBTDsKLQkJCWNhc2UgREVDSU1BTCA6Ci0JCQkJcmV0dXJuIERFQ0lNQUxfTElURVJBTDsKLQkJCWNhc2UgVElNRUlOU1RBTlQgOgotCQkJCXJldHVybiBUSU1FSU5TVEFOVF9MSVRFUkFMOwotCQkJY2FzZSBUSU1FRFVSQVRJT04gOgotCQkJCXJldHVybiBUSU1FRFVSQVRJT05fTElURVJBTDsKLQkJCWNhc2UgUkVDVVJSSU5HSU5TVEFOVCA6Ci0JCQkJcmV0dXJuIFJFQ1VSUklOR0lOU1RBTlRfTElURVJBTDsKLQkJCWNhc2UgQklOQVJZIDoKLQkJCQlyZXR1cm4gQklOQVJZX0xJVEVSQUw7Ci0JCQljYXNlIFVSSSA6Ci0JCQkJcmV0dXJuIFVSSV9MSVRFUkFMOwotCQkJY2FzZSBJTlRFR0VSIDoKLQkJCQlyZXR1cm4gSU5URUdFUl9MSVRFUkFMOwotCQkJY2FzZSBEQVRFIDoKLQkJCQlyZXR1cm4gREFURV9MSVRFUkFMOwotCQkJY2FzZSBUSU1FIDoKLQkJCQlyZXR1cm4gVElNRV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBYTUxTY2hlbWFEZWZpbmVkVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy8gWE1MU2NoZW1hRGVmaW5lZFR5cGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERBbnlDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREFueUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYWViOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREFueUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQW55Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QW55IENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFREQW55Q29udGVudEltcGwgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERBbnlDb250ZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnROYW1lKCkgewotCQlyZXR1cm4gIkFOWSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERUREFueUNvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREFueUNvbnRlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlEKCksIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREF0dHJpYnV0ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERBdHRyaWJ1dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZGU4ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREF0dHJpYnV0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25DaGFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQXR0cmlidXRlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREVHlwZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+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+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpICE9IERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEVERFbGVtZW50KSBlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREVERFbGVtZW50KERUREVsZW1lbnQgbmV3RFRERWxlbWVudCkgewotCQlpZiAobmV3RFRERWxlbWVudCAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCAmJiBuZXdEVERFbGVtZW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RFRERWxlbWVudCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSArICIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0RUREVsZW1lbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREVsZW1lbnQpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERFbGVtZW50LCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5ULCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCwgbmV3RFRERWxlbWVudCwgbmV3RFRERWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCQlpZiAoYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQkJaWYgKGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKERUREVudGl0eSkgb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCgpLCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX05BTUUgOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRVRZUEUgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0RVR5cGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFVHlwZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NIQU5HRUFCTEUgOgotCQkJCXJldHVybiBpc0NoYW5nZWFibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVk9MQVRJTEUgOgotCQkJCXJldHVybiBpc1ZvbGF0aWxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1RSQU5TSUVOVCA6Ci0JCQkJcmV0dXJuIGlzVHJhbnNpZW50KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1VOSVFVRSA6Ci0JCQkJcmV0dXJuIGlzVW5pcXVlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTCA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZUxpdGVyYWwoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTE9XRVJfQk9VTkQgOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRMb3dlckJvdW5kKCkpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1VQUEVSX0JPVU5EIDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VXBwZXJCb3VuZCgpKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19NQU5ZIDoKLQkJCQlyZXR1cm4gaXNNYW55KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1JFUVVJUkVEIDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQ09OVEFJTklOR19DTEFTUyA6Ci0JCQkJcmV0dXJuIGdldEVDb250YWluaW5nQ2xhc3MoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VTlNFVFRBQkxFIDoKLQkJCQlyZXR1cm4gaXNVbnNldHRhYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0lEIDoKLQkJCQlyZXR1cm4gaXNJRCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQVRUUklCVVRFX1RZUEUgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0RUF0dHJpYnV0ZVR5cGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFQXR0cmlidXRlVHlwZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NPTU1FTlQgOgotCQkJCXJldHVybiBnZXRDb21tZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9LSU5EIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdEtpbmQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX1NUUklORyA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZVN0cmluZygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpOwotCQkJCXJldHVybiBiYXNpY0dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXREVERFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX05BTUUgOgotCQkJCXNldE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FVFlQRSA6Ci0JCQkJc2V0RVR5cGUoKEVDbGFzc2lmaWVyKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NIQU5HRUFCTEUgOgotCQkJCXNldENoYW5nZWFibGUoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19WT0xBVElMRSA6Ci0JCQkJc2V0Vm9sYXRpbGUoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19UUkFOU0lFTlQgOgotCQkJCXNldFRyYW5zaWVudCgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1VOSVFVRSA6Ci0JCQkJc2V0VW5pcXVlKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMIDoKLQkJCQlzZXREZWZhdWx0VmFsdWVMaXRlcmFsKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTE9XRVJfQk9VTkQgOgotCQkJCXNldExvd2VyQm91bmQoKChJbnRlZ2VyKSBuZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1VQUEVSX0JPVU5EIDoKLQkJCQlzZXRVcHBlckJvdW5kKCgoSW50ZWdlcikgbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VTlNFVFRBQkxFIDoKLQkJCQlzZXRVbnNldHRhYmxlKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fSUQgOgotCQkJCXNldElEKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfS0lORCA6Ci0JCQkJc2V0RGVmYXVsdEtpbmQoKERURERlZmF1bHRLaW5kKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfU1RSSU5HIDoKLQkJCQlzZXREZWZhdWx0VmFsdWVTdHJpbmcoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJc2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKERUREVudGl0eSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKERUREVudGl0eSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCA6Ci0JCQkJc2V0RFRERWxlbWVudCgoRFRERWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTkFNRSA6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRVRZUEUgOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllcikgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NIQU5HRUFCTEUgOgotCQkJCXNldENoYW5nZWFibGUoQ0hBTkdFQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1ZPTEFUSUxFIDoKLQkJCQlzZXRWb2xhdGlsZShWT0xBVElMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1RSQU5TSUVOVCA6Ci0JCQkJc2V0VHJhbnNpZW50KFRSQU5TSUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1VOSVFVRSA6Ci0JCQkJc2V0VW5pcXVlKFVOSVFVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTCA6Ci0JCQkJc2V0RGVmYXVsdFZhbHVlTGl0ZXJhbChERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19MT1dFUl9CT1VORCA6Ci0JCQkJc2V0TG93ZXJCb3VuZChMT1dFUl9CT1VORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1VQUEVSX0JPVU5EIDoKLQkJCQlzZXRVcHBlckJvdW5kKFVQUEVSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA6Ci0JCQkJc2V0VW5zZXR0YWJsZShVTlNFVFRBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fSUQgOgotCQkJCXNldElEKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudChDT01NRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9LSU5EIDoKLQkJCQlzZXREZWZhdWx0S2luZChERUZBVUxUX0tJTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX1NUUklORyA6Ci0JCQkJc2V0RGVmYXVsdFZhbHVlU3RyaW5nKERFRkFVTFRfVkFMVUVfU1RSSU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXNldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UIDoKLQkJCQlzZXREVERFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWdldEVBbm5vdGF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19OQU1FIDoKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VUWVBFIDoKLQkJCQlyZXR1cm4gZVR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DSEFOR0VBQkxFIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBDSEFOR0VBQkxFX0VGTEFHKSAhPSAwKSAhPSBDSEFOR0VBQkxFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1ZPTEFUSUxFIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBWT0xBVElMRV9FRkxBRykgIT0gMCkgIT0gVk9MQVRJTEVfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVFJBTlNJRU5UIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBUUkFOU0lFTlRfRUZMQUcpICE9IDApICE9IFRSQU5TSUVOVF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VTklRVUUgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFVOSVFVRV9FRkxBRykgIT0gMCkgIT0gVU5JUVVFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTCA6Ci0JCQkJcmV0dXJuIERFRkFVTFRfVkFMVUVfTElURVJBTF9FREVGQVVMVCA9PSBudWxsID8gZGVmYXVsdFZhbHVlTGl0ZXJhbCAhPSBudWxsIDogIURFRkFVTFRfVkFMVUVfTElURVJBTF9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdFZhbHVlTGl0ZXJhbCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTE9XRVJfQk9VTkQgOgotCQkJCXJldHVybiBsb3dlckJvdW5kICE9IExPV0VSX0JPVU5EX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1VQUEVSX0JPVU5EIDoKLQkJCQlyZXR1cm4gdXBwZXJCb3VuZCAhPSBVUFBFUl9CT1VORF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19NQU5ZIDoKLQkJCQlyZXR1cm4gaXNNYW55KCkgIT0gZmFsc2U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fUkVRVUlSRUQgOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgIT0gZmFsc2U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUNPTlRBSU5JTkdfQ0xBU1MgOgotCQkJCXJldHVybiBnZXRFQ29udGFpbmluZ0NsYXNzKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VTlNFVFRBQkxFIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBVTlNFVFRBQkxFX0VGTEFHKSAhPSAwKSAhPSBVTlNFVFRBQkxFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0lEIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBJRF9FRkxBRykgIT0gMCkgIT0gSURfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUFUVFJJQlVURV9UWVBFIDoKLQkJCQlyZXR1cm4gYmFzaWNHZXRFQXR0cmlidXRlVHlwZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIENPTU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGNvbW1lbnQgIT0gbnVsbCA6ICFDT01NRU5UX0VERUZBVUxULmVxdWFscyhjb21tZW50KTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX0tJTkQgOgotCQkJCXJldHVybiBkZWZhdWx0S2luZCAhPSBERUZBVUxUX0tJTkRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9TVFJJTkcgOgotCQkJCXJldHVybiBERUZBVUxUX1ZBTFVFX1NUUklOR19FREVGQVVMVCA9PSBudWxsID8gZGVmYXVsdFZhbHVlU3RyaW5nICE9IG51bGwgOiAhREVGQVVMVF9WQUxVRV9TVFJJTkdfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRWYWx1ZVN0cmluZyk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXJldHVybiBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlyZXR1cm4gYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldERUREVsZW1lbnQoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb21tZW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNvbW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRLaW5kOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRLaW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0VmFsdWVTdHJpbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdFZhbHVlU3RyaW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIERUREF0dHJpYnV0ZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERCYXNpY1R5cGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQmFzaWNUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTI4OWI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERCYXNpY1R5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2ljIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQmFzaWNUeXBlSW1wbCNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREJhc2ljVHlwZUltcGwgZXh0ZW5kcyBFQ2xhc3NJbXBsIGltcGxlbWVudHMgRFREQmFzaWNUeXBlLCBFQ2xhc3MgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgYmFzaWNUeXBlU3RyaW5nc1tdID0ge0RURFR5cGUuTk9ORSwgRFREVHlwZS5DREFUQSwgRFREVHlwZS5JRCwgRFREVHlwZS5JRFJFRiwgRFREVHlwZS5JRFJFRlMsIERURFR5cGUuRU5USVRZLCBEVERUeXBlLkVOVElUSUVTLCBEVERUeXBlLk5NVE9LRU4sIERURFR5cGUuTk1UT0tFTlN9OwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgYmFzaWNUeXBlRGVzY3JpcHRpb25zW10gPSB7RFREQ29yZU1lc3NhZ2VzLl9VSV9OT05FX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfQ0hBUkFDVEVSX0RBVEFfREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9JREVOVElGSUVSX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfSURfUkVGRVJFTkNFX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfSURfUkVGRVJFTkNFU19ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVElUWV9OQU1FX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfRU5USVRZX05BTUVTX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfTkFNRV9UT0tFTl9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX05BTUVfVE9LRU5TX0RFU0N9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgYmFzaWNUeXBlS2luZHNbXSA9IHtEVERCYXNpY1R5cGVLaW5kLk5PTkUsIERUREJhc2ljVHlwZUtpbmQuQ0RBVEEsIERUREJhc2ljVHlwZUtpbmQuSUQsIERUREJhc2ljVHlwZUtpbmQuSURSRUYsIERUREJhc2ljVHlwZUtpbmQuSURSRUZTLCBEVERCYXNpY1R5cGVLaW5kLkVOVElUWSwgRFREQmFzaWNUeXBlS2luZC5FTlRJVElFUywgRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOLCBEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5TfTsKLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZSgpIHsKLQkJcmV0dXJuIGdldFR5cGVTdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVTdHJpbmcoKSB7Ci0JCWludCBraW5kID0gZ2V0S2luZCgpLmdldFZhbHVlKCk7Ci0JCWlmIChraW5kID49IDAgJiYga2luZCA8IGJhc2ljVHlwZVN0cmluZ3MubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYmFzaWNUeXBlU3RyaW5nc1traW5kXTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ2V0VHlwZURlc2NyaXB0aW9uKGdldEtpbmQoKS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVEZXNjcmlwdGlvbihpbnQgdHlwZUtpbmQpIHsKLQkJaWYgKHR5cGVLaW5kID49IDAgJiYgdHlwZUtpbmQgPCBiYXNpY1R5cGVEZXNjcmlwdGlvbnMubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYmFzaWNUeXBlRGVzY3JpcHRpb25zW3R5cGVLaW5kXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQkvLyBUQkQKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLaW5kKCkgPGVtPktpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgS0lORF9FREVGQVVMVCA9IERUREJhc2ljVHlwZUtpbmQuTk9ORV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2luZCgpIDxlbT5LaW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERUREJhc2ljVHlwZUtpbmQga2luZCA9IEtJTkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERUREJhc2ljVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREQmFzaWNUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERCYXNpY1R5cGVLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBraW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLaW5kKERUREJhc2ljVHlwZUtpbmQgbmV3S2luZCkgewotCQlEVERCYXNpY1R5cGVLaW5kIG9sZEtpbmQgPSBraW5kOwotCQlraW5kID0gbmV3S2luZCA9PSBudWxsID8gS0lORF9FREVGQVVMVCA6IG5ld0tpbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0tJTkQsIG9sZEtpbmQsIGtpbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RU9wZXJhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FT1BFUkFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVPcGVyYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VSRUZFUkVOQ0VTIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RVJlZmVyZW5jZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFUVFJJQlVURVMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQXR0cmlidXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQoKSA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQoKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VDTEFTU0lGSUVSUywgRVBhY2thZ2UuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQoKSwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX05BTUUgOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzTmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJcmV0dXJuIGdldEluc3RhbmNlQ2xhc3MoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fREVGQVVMVF9WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSA6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0FCU1RSQUNUIDoKLQkJCQlyZXR1cm4gaXNBYnN0cmFjdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5URVJGQUNFIDoKLQkJCQlyZXR1cm4gaXNJbnRlcmZhY2UoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VTVVBFUl9UWVBFUyA6Ci0JCQkJcmV0dXJuIGdldEVTdXBlclR5cGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RU9wZXJhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9BVFRSSUJVVEVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9SRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVJFRkVSRU5DRVMgOgotCQkJCXJldHVybiBnZXRFUmVmZXJlbmNlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGdldEVBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfQ09OVEFJTk1FTlRTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbENvbnRhaW5tZW50cygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX09QRVJBVElPTlMgOgotCQkJCXJldHVybiBnZXRFQWxsT3BlcmF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgOgotCQkJCXJldHVybiBnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiBnZXRFQWxsU3VwZXJUeXBlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FSURfQVRUUklCVVRFIDoKLQkJCQlyZXR1cm4gZ2V0RUlEQXR0cmlidXRlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0tJTkQgOgotCQkJCXJldHVybiBnZXRLaW5kKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fTkFNRSA6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzcygoQ2xhc3MpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0FCU1RSQUNUIDoKLQkJCQlzZXRBYnN0cmFjdCgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlRFUkZBQ0UgOgotCQkJCXNldEludGVyZmFjZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FU1VQRVJfVFlQRVMgOgotCQkJCWdldEVTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRU9QRVJBVElPTlMgOgotCQkJCWdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVJFRkVSRU5DRVMgOgotCQkJCWdldEVSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRFUmVmZXJlbmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFUVFJJQlVURVMgOgotCQkJCWdldEVBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFQXR0cmlidXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fS0lORCA6Ci0JCQkJc2V0S2luZCgoRFREQmFzaWNUeXBlS2luZCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19OQU1FIDoKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzcyhJTlNUQU5DRV9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19BQlNUUkFDVCA6Ci0JCQkJc2V0QWJzdHJhY3QoQUJTVFJBQ1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5URVJGQUNFIDoKLQkJCQlzZXRJbnRlcmZhY2UoSU5URVJGQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VTVVBFUl9UWVBFUyA6Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRU9QRVJBVElPTlMgOgotCQkJCWdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VSRUZFUkVOQ0VTIDoKLQkJCQlnZXRFUmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQVRUUklCVVRFUyA6Ci0JCQkJZ2V0RUF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fS0lORCA6Ci0JCQkJc2V0S2luZChLSU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFnZXRFQW5ub3RhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX05BTUUgOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXJldHVybiBJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUID09IG51bGwgPyBpbnN0YW5jZUNsYXNzTmFtZSAhPSBudWxsIDogIUlOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGluc3RhbmNlQ2xhc3NOYW1lKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXJldHVybiBJTlNUQU5DRV9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gaW5zdGFuY2VDbGFzcyAhPSBudWxsIDogIUlOU1RBTkNFX0NMQVNTX0VERUZBVUxULmVxdWFscyhpbnN0YW5jZUNsYXNzKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fREVGQVVMVF9WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQlyZXR1cm4gZ2V0RVBhY2thZ2UoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19BQlNUUkFDVCA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQUJTVFJBQ1RfRUZMQUcpICE9IDApICE9IEFCU1RSQUNUX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlRFUkZBQ0UgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIElOVEVSRkFDRV9FRkxBRykgIT0gMCkgIT0gSU5URVJGQUNFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiBlU3VwZXJUeXBlcyAhPSBudWxsICYmICFnZXRFU3VwZXJUeXBlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRU9QRVJBVElPTlMgOgotCQkJCXJldHVybiBlT3BlcmF0aW9ucyAhPSBudWxsICYmICFnZXRFT3BlcmF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9BVFRSSUJVVEVTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxBdHRyaWJ1dGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX1JFRkVSRU5DRVMgOgotCQkJCXJldHVybiAhZ2V0RUFsbFJlZmVyZW5jZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VSRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gZVJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhZ2V0RVJlZmVyZW5jZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBVFRSSUJVVEVTIDoKLQkJCQlyZXR1cm4gZUF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhZ2V0RUF0dHJpYnV0ZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfQ09OVEFJTk1FTlRTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxDb250YWlubWVudHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsT3BlcmF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiAhZ2V0RUFsbFN1cGVyVHlwZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VJRF9BVFRSSUJVVEUgOgotCQkJCXJldHVybiBnZXRFSURBdHRyaWJ1dGUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19LSU5EIDoKLQkJCQlyZXR1cm4ga2luZCAhPSBLSU5EX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChraW5kOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGtpbmQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gRFREQmFzaWNUeXBlSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURENvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxODVkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOYW1lZEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgRFREQ29udGVudEltcGwgZXh0ZW5kcyBFTmFtZWRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIERURENvbnRlbnQsIEVPYmplY3QgewotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEVERGaWxlKSBlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREVERGaWxlKERUREZpbGUgbmV3RFRERmlsZSkgewotCQlpZiAobmV3RFRERmlsZSAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgJiYgbmV3RFRERmlsZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREZpbGUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERGaWxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERGaWxlKS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREZpbGUsIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUsIG5ld0RUREZpbGUsIG5ld0RUREZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5ULCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlEKCksIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvLyBEVERDb250ZW50SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWU3NjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50Q29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQYXRobmFtZVV0aWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudCBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRDb250ZW50SW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudENvbnRlbnRJbXBsI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRFRERWxlbWVudENvbnRlbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBEVERFbGVtZW50Q29udGVudCB7Ci0KLQlwdWJsaWMgRFRERWxlbWVudENvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBEVERFbGVtZW50IGdldERUREVsZW1lbnQoKSB7Ci0JCURUREVsZW1lbnRDb250ZW50IGMgPSBnZXREVERHcm91cENvbnRlbnQoKTsKLQkJaWYgKGMgIT0gbnVsbCkKLQkJCXJldHVybiBjLmdldEVsZW1lbnQoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvLyBnZXQgdGhlIG1vc3Qgb3V0ZXIgRFRER3JvdXBDb250ZW50Ci0JcHVibGljIERUREdyb3VwQ29udGVudCBnZXREVERHcm91cENvbnRlbnQoKSB7Ci0JCURUREVsZW1lbnRDb250ZW50IGMgPSB0aGlzOwotCQl3aGlsZSAoYy5nZXRHcm91cCgpICE9IG51bGwpIHsKLQkJCWMgPSBjLmdldEdyb3VwKCk7Ci0JCX0KLQkJcmV0dXJuICgoYyBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgPyAoRFRER3JvdXBDb250ZW50KSBjIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJaW50IGNudCA9IDA7Ci0JCURURE9iamVjdCBwYXJlbnQgPSBnZXRHcm91cCgpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXBhcmVudCA9IGdldEVsZW1lbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCURUREdyb3VwQ29udGVudCBncm91cCA9IChEVERHcm91cENvbnRlbnQpIHBhcmVudDsKLQkJCUl0ZXJhdG9yIGkgPSBncm91cC5nZXRDb250ZW50KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCURUREVsZW1lbnRDb250ZW50IGNvbnRlbnQgPSAoRFRERWxlbWVudENvbnRlbnQpIGkubmV4dCgpOwotCQkJCWlmIChjb250ZW50ID09IHRoaXMpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICgoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB8fCAoY29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQljbnQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKCgocGFyZW50ID09IG51bGwpID8gIk5VTExfUEFSRU5UIiA6IHBhcmVudC5nZXRQYXRobmFtZSgpKSwgIkNvbnRlbnQiLCBudWxsLCBjbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudENvbnRlbnQoKSB7Ci0JCURUREVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkvLyBUaGlzIG1lYW5zIHRoaXMgaXMgdGhlIG9ubHkgZWxlbWVudCBjb250ZW50IGluIHRoZSBlbGVtZW50Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQotCQlEVERHcm91cENvbnRlbnQgZ3JvdXAgPSBnZXRHcm91cCgpOwotCQlpbnQgcG9zID0gZ3JvdXAuZ2V0Q29udGVudFBvc2l0aW9uKHRoaXMpOwotCQlpZiAocG9zID09IDApIHsKLQkJCS8vIG5vdyByZWN1cnNlIGFuZCBlbnN1cmUgdGhpcyBncm91cCBpcyB0aGUgZmlyc3QgZ3JvdXAKLQkJCXJldHVybiBncm91cC5pc0ZpcnN0RWxlbWVudENvbnRlbnQoKTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnREZXRhaWwoKSB7Ci0JCS8vIG1vc3QgdGltZXMsIGNvbnRlbnQgbmFtZSBpcyBmaW5lLiBIb3dldmVyIGZvciBncm91cHMsCi0JCS8vIHdlIGRpZG4ndCB3YW50IGEgbG9uZyBuYW1lIHRvIHNob3cgdXAgaW4gdGhlIHRyZWUsCi0JCS8vIHNvIHdlIGNyZWF0ZWQgYSBnZXQgY29udGVudGRldGFpbCB0byBnZXQgdG8gdGhlIGxvbmcKLQkJLy8gbmFtZSAoZ2V0Q29udGVudE5hbWUgd2lsbCBnZXQgdGhlIHNob3J0IG9uZS4KLQkJcmV0dXJuIGdldENvbnRlbnROYW1lKCk7Ci0JfQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCS8qCi0JICogQHNlZSBEVERFbGVtZW50Q29udGVudCNnZXRDb250ZW50TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERWxlbWVudENvbnRlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREdyb3VwQ29udGVudCBnZXRHcm91cCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQoKSAhPSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRER3JvdXBDb250ZW50KSBlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcm91cChEVERHcm91cENvbnRlbnQgbmV3R3JvdXApIHsKLQkJaWYgKG5ld0dyb3VwICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQoKSAhPSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQICYmIG5ld0dyb3VwICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3R3JvdXApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdHcm91cCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3R3JvdXApLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyb3VwLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCwgbmV3R3JvdXAsIG5ld0dyb3VwKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERWxlbWVudCkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChEVERFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpICE9IERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCAmJiBuZXdFbGVtZW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RWxlbWVudCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSArICIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0VsZW1lbnQpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdFbGVtZW50LCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQsIG5ld0VsZW1lbnQsIG5ld0VsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKCkpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCgpLCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vIERUREVsZW1lbnRDb250ZW50SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRmMGI5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERWaXNpdG9yOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRERWxlbWVudEltcGwgZXh0ZW5kcyBFQ2xhc3NJbXBsIGltcGxlbWVudHMgRFRERWxlbWVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JcHVibGljIERUREVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVsZW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREVERBdHRyaWJ1dGUoRFREQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlnZXREVERBdHRyaWJ1dGUoKS5hZGQoYXR0cmlidXRlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQlyZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKG51bGwsICJFbGVtIiwgZ2V0TmFtZSgpLCAtMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlPYmplY3RbXSByZXN1bHQgPSBEVERQYXRobmFtZVV0aWwucGFyc2VQYXRoQ29tcG9uZW50KHJlbGF0aXZlUGF0aCk7Ci0KLQkJU3RyaW5nIHR5cGUgPSAoU3RyaW5nKSByZXN1bHRbMF07Ci0KLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCURURE9iamVjdCBvYmogPSBudWxsOwotCQlpZiAodHlwZS5lcXVhbHMoIkF0dHIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBUT0RPOiBmaXggcG9ydAotCQkJLy8gb2JqID0gZmluZEF0dHJpYnV0ZShuYW1lKTsKLQkJfQotCQllbHNlIGlmICgodHlwZS5lcXVhbHMoIkNvbnRlbnQiKSkgfHwgKHR5cGUuZXF1YWxzKCJFbGVtUmVmIikpIHx8ICh0eXBlLmVxdWFscygiRW50UmVmIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlvYmogPSBnZXRDb250ZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyByZXN0UGF0aCA9IChTdHJpbmcpIHJlc3VsdFszXTsKLQotCQlpZiAoKHJlc3RQYXRoID09IG51bGwpIHx8IChvYmogPT0gbnVsbCkpIHsKLQkJCXJldHVybiBvYmo7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gb2JqLmZpbmRPYmplY3QocmVzdFBhdGgpOwotCQl9Ci0JfQotCi0JLy8gcmV0dXJucyBhbGwgcmVmZXJlbmNlcyBpbiB0aGUgc2FtZSBEVERGaWxlIHRoYXQgcmVmZXJlbmNlIHRoaXMgZWxlbWVudAotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlZmVyZW5jZXMoKSB7Ci0JCURUREZpbGUgZmlsZSA9IGdldERUREZpbGUoKTsKLQkJZmluYWwgQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJRFREVmlzaXRvciB2aXNpdFJlZnMgPSBuZXcgRFREVmlzaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCQlpZiAoZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQuZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKSA9PSBEVERFbGVtZW50SW1wbC50aGlzKSB7Ci0JCQkJCXJlc3VsdC5hZGQoZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCQl9Ci0JCX07Ci0JCXZpc2l0UmVmcy52aXNpdERUREZpbGUoZmlsZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVEZXRhaWwoKSB7Ci0JCVN0cmluZyBhdHRyaWJ1dGVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9uIGF0dHJpYnV0ZXMgPSBnZXREVERBdHRyaWJ1dGUoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzZWVuT25lID0gZmFsc2U7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlpZiAoc2Vlbk9uZSkgewotCQkJCQlhdHRyaWJ1dGVTdHJpbmcgPSBhdHRyaWJ1dGVTdHJpbmcgKyAiLCAiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZWVuT25lID0gdHJ1ZTsKLQkJCQl9IC8vIGVuZCBvZiBlbHNlCi0KLQkJCQlhdHRyaWJ1dGVTdHJpbmcgPSBhdHRyaWJ1dGVTdHJpbmcgKyAoKERUREF0dHJpYnV0ZSkgaS5uZXh0KCkpLmdldE5hbWUoKTsKLQkJCX0KLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJcmV0dXJuIGF0dHJpYnV0ZVN0cmluZzsKLQl9Ci0KLQotCS8vIHVnbHkgaGFjayBmb3Igbm93IHNpbmNlIHdlIGRvbid0IGhhdmUgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCi0JLy8gV291bGQgcmF0aGVyIGhhdmUgYWxsIHRoaXMgc3R1ZmYgaW4gYSBiYXNlIGNsYXNzIGJ1dCB0aGVzZQotCS8vIGNsYXNzZXMgYXJlIGluaGVyaXRpbmcgZnJvbSBzb21ldGltZXMgZGlmZmVyZW50IG1vZiBjbGFzc2VzCi0JRFRETGV4aWNhbEluZm8gbGV4SW5mbyA9IG5ldyBEVERMZXhpY2FsSW5mbygpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IENPTU1FTlRfRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkdGRBdHRyaWJ1dGUgPSBudWxsOwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0U3RhcnRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldEVuZE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgbmV3Q29tbWVudCkgewotCQlTdHJpbmcgb2xkQ29tbWVudCA9IGNvbW1lbnQ7Ci0JCWNvbW1lbnQgPSBuZXdDb21tZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT01NRU5ULCBvbGRDb21tZW50LCBjb21tZW50KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudENvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgbmV3Q29udGVudCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERFbGVtZW50Q29udGVudCBvbGRDb250ZW50ID0gY29udGVudDsKLQkJY29udGVudCA9IG5ld0NvbnRlbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBvbGRDb250ZW50LCBuZXdDb250ZW50KSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChEVERFbGVtZW50Q29udGVudCBuZXdDb250ZW50KSB7Ci0JCWlmIChuZXdDb250ZW50ICE9IGNvbnRlbnQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGNvbnRlbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCwgRFRERWxlbWVudENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbnRlbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0NvbnRlbnQpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCwgRFRERWxlbWVudENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udGVudChuZXdDb250ZW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgbmV3Q29udGVudCwgbmV3Q29udGVudCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEVMaXN0IGdldERUREF0dHJpYnV0ZSgpIHsKLQkJaWYgKGR0ZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlkdGRBdHRyaWJ1dGUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChEVERBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQpOwotCQl9Ci0JCXJldHVybiBkdGRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VQQUNLQUdFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVPcGVyYXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5UIDoKLQkJCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgY29udGVudCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIG51bGwsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRDb250ZW50KChEVERFbGVtZW50Q29udGVudCkgb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldERUREF0dHJpYnV0ZSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVBBQ0tBR0UgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VPUEVSQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RU9wZXJhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVJFRkVSRU5DRVMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFUmVmZXJlbmNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQVRUUklCVVRFUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5UIDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0Q29udGVudChudWxsLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXREVERBdHRyaWJ1dGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKCkpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FQ0xBU1NJRklFUlMsIEVQYWNrYWdlLmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQoKSwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX05BTUUgOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzTmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJcmV0dXJuIGdldEluc3RhbmNlQ2xhc3MoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fREVGQVVMVF9WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSA6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0FCU1RSQUNUIDoKLQkJCQlyZXR1cm4gaXNBYnN0cmFjdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5URVJGQUNFIDoKLQkJCQlyZXR1cm4gaXNJbnRlcmZhY2UoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VTVVBFUl9UWVBFUyA6Ci0JCQkJcmV0dXJuIGdldEVTdXBlclR5cGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VPUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RU9wZXJhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9BVFRSSUJVVEVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9SRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVJFRkVSRU5DRVMgOgotCQkJCXJldHVybiBnZXRFUmVmZXJlbmNlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGdldEVBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfQ09OVEFJTk1FTlRTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbENvbnRhaW5tZW50cygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX09QRVJBVElPTlMgOgotCQkJCXJldHVybiBnZXRFQWxsT3BlcmF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgOgotCQkJCXJldHVybiBnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiBnZXRFQWxsU3VwZXJUeXBlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FSURfQVRUUklCVVRFIDoKLQkJCQlyZXR1cm4gZ2V0RUlEQXR0cmlidXRlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT01NRU5UIDoKLQkJCQlyZXR1cm4gZ2V0Q29tbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5UIDoKLQkJCQlyZXR1cm4gZ2V0Q29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFIDoKLQkJCQlyZXR1cm4gZ2V0RFREQXR0cmlidXRlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQU5OT1RBVElPTlMgOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZ2V0RUFubm90YXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19OQU1FIDoKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gaW5zdGFuY2VDbGFzc05hbWUgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhpbnN0YW5jZUNsYXNzTmFtZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3MgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzcyk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSA6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQUJTVFJBQ1QgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFCU1RSQUNUX0VGTEFHKSAhPSAwKSAhPSBBQlNUUkFDVF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5URVJGQUNFIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBJTlRFUkZBQ0VfRUZMQUcpICE9IDApICE9IElOVEVSRkFDRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVNVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gZVN1cGVyVHlwZXMgIT0gbnVsbCAmJiAhZ2V0RVN1cGVyVHlwZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VPUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZU9wZXJhdGlvbnMgIT0gbnVsbCAmJiAhZ2V0RU9wZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQXR0cmlidXRlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9SRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxSZWZlcmVuY2VzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuIGVSZWZlcmVuY2VzICE9IG51bGwgJiYgIWdldEVSZWZlcmVuY2VzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGVBdHRyaWJ1dGVzICE9IG51bGwgJiYgIWdldEVBdHRyaWJ1dGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX0NPTlRBSU5NRU5UUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQ29udGFpbm1lbnRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX09QRVJBVElPTlMgOgotCQkJCXJldHVybiAhZ2V0RUFsbE9wZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX1NVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxTdXBlclR5cGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FSURfQVRUUklCVVRFIDoKLQkJCQlyZXR1cm4gZ2V0RUlEQXR0cmlidXRlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIENPTU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGNvbW1lbnQgIT0gbnVsbCA6ICFDT01NRU5UX0VERUZBVUxULmVxdWFscyhjb21tZW50KTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGNvbnRlbnQgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGR0ZEF0dHJpYnV0ZSAhPSBudWxsICYmICFnZXREVERBdHRyaWJ1dGUoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRFREQ29udGVudC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IERURENvbnRlbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEU7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29tbWVudDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjb21tZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fTkFNRSA6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzcygoQ2xhc3MpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0FCU1RSQUNUIDoKLQkJCQlzZXRBYnN0cmFjdCgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlRFUkZBQ0UgOgotCQkJCXNldEludGVyZmFjZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FU1VQRVJfVFlQRVMgOgotCQkJCWdldEVTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRU9QRVJBVElPTlMgOgotCQkJCWdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVJFRkVSRU5DRVMgOgotCQkJCWdldEVSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRFUmVmZXJlbmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgOgotCQkJCWdldEVBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFQXR0cmlidXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJc2V0Q29udGVudCgoRFRERWxlbWVudENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUgOgotCQkJCWdldERUREF0dHJpYnV0ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RFREQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fTkFNRSA6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQUJTVFJBQ1QgOgotCQkJCXNldEFic3RyYWN0KEFCU1RSQUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOVEVSRkFDRSA6Ci0JCQkJc2V0SW50ZXJmYWNlKElOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FU1VQRVJfVFlQRVMgOgotCQkJCWdldEVTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VPUEVSQVRJT05TIDoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUkVGRVJFTkNFUyA6Ci0JCQkJZ2V0RVJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgOgotCQkJCWdldEVBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoQ09NTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5UIDoKLQkJCQlzZXRDb250ZW50KChEVERFbGVtZW50Q29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFIDoKLQkJCQlnZXREVERBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpICE9IERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERmlsZSkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREVERGaWxlKERUREZpbGUgbmV3RFRERmlsZSkgewotCQlpZiAobmV3RFRERmlsZSAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgJiYgbmV3RFRERmlsZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREZpbGUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERGaWxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERGaWxlKS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREZpbGUsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUsIG5ld0RUREZpbGUsIG5ld0RUREZpbGUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxZjRjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEVERFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gbnVsbDsKLQotCXB1YmxpYyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpIHsKLQkJcmV0dXJuIGdldENvbnRlbnROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJRFRERWxlbWVudCBlID0gZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudCBnZXRSZWZlcmVuY2VkRWxlbWVudCgpIHsKLQkJaWYgKHJlZmVyZW5jZWRFbGVtZW50ICE9IG51bGwgJiYgcmVmZXJlbmNlZEVsZW1lbnQuZUlzUHJveHkoKSkgewotCQkJRFRERWxlbWVudCBvbGRSZWZlcmVuY2VkRWxlbWVudCA9IHJlZmVyZW5jZWRFbGVtZW50OwotCQkJcmVmZXJlbmNlZEVsZW1lbnQgPSAoRFRERWxlbWVudCkgRWNvcmVVdGlsLnJlc29sdmUocmVmZXJlbmNlZEVsZW1lbnQsIHRoaXMpOwotCQkJaWYgKHJlZmVyZW5jZWRFbGVtZW50ICE9IG9sZFJlZmVyZW5jZWRFbGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5ULCBvbGRSZWZlcmVuY2VkRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbGVtZW50IGJhc2ljR2V0UmVmZXJlbmNlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VkRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkRWxlbWVudChEVERFbGVtZW50IG5ld1JlZmVyZW5jZWRFbGVtZW50KSB7Ci0JCURUREVsZW1lbnQgb2xkUmVmZXJlbmNlZEVsZW1lbnQgPSByZWZlcmVuY2VkRWxlbWVudDsKLQkJcmVmZXJlbmNlZEVsZW1lbnQgPSBuZXdSZWZlcmVuY2VkRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5ULCBvbGRSZWZlcmVuY2VkRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQoKSA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQoKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQoKSwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0T2NjdXJyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJcmV0dXJuIG9jY3VycmVuY2UgIT0gT0NDVVJSRU5DRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5UIDoKLQkJCQlyZXR1cm4gcmVmZXJlbmNlZEVsZW1lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoKERURE9jY3VycmVuY2VUeXBlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQgOgotCQkJCXNldFJlZmVyZW5jZWRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKE9DQ1VSUkVOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5UIDoKLQkJCQlzZXRSZWZlcmVuY2VkRWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVtcHR5Q29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbXB0eUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4N2VmMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVtcHR5Q29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVtcHR5Q29udGVudEltcGwgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERFbXB0eUNvbnRlbnQgewotCi0JcHVibGljIERUREVtcHR5Q29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW1wdHlDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKCkpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlEKCksIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiAiRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5Q29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmY3ZWUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERUREVudGl0eUNvbnRlbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBEVERFbnRpdHlDb250ZW50IHsKLQotCXB1YmxpYyBEVERFbnRpdHlDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlDb250ZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChnZXREVERFbnRpdHkoKS5nZXRQYXRobmFtZSgpLCAiQ29udGVudCIsIG51bGwsIC0xKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREVudGl0eSBnZXREVERFbnRpdHkoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEVERFbnRpdHkpIGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RFRERW50aXR5KERUREVudGl0eSBuZXdEVERFbnRpdHkpIHsKLQkJaWYgKG5ld0RUREVudGl0eSAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgJiYgbmV3RFRERW50aXR5ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RFRERW50aXR5KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpICsgIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RFRERW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERFbnRpdHkpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3RFRERW50aXR5LCBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZLCBuZXdEVERFbnRpdHksIG5ld0RUREVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKCkpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5ULCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQoKSwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZIDoKLQkJCQlyZXR1cm4gZ2V0RFRERW50aXR5KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgOgotCQkJCXNldERUREVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgOgotCQkJCXNldERUREVudGl0eSgoRFRERW50aXR5KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIERUREVudGl0eUNvbnRlbnQjdW5wYXJzZSgpCi0JICovCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQwNzQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uQ2hhaW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERMZXhpY2FsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFBhdGhuYW1lVXRpbDsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5SW1wbCNpc1BhcmFtZXRlckVudGl0eSA8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5SW1wbCNnZXRQYXJtRW50aXR5UmVmIDxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5SW1wbCNnZXRFbnRpdHlSZWZlcmVuY2UgPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5SW1wbCNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5SW1wbCNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRERW50aXR5SW1wbCBleHRlbmRzIERURENvbnRlbnRJbXBsIGltcGxlbWVudHMgRFRERW50aXR5LCBFTmFtZWRFbGVtZW50LCBEVERDb250ZW50IHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7Ci0JCXJldHVybiBEVERQYXRobmFtZVV0aWwubWFrZVBhdGgobnVsbCwgIkVudCIsIGdldE5hbWUoKSwgLTEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlPYmplY3RbXSByZXN1bHQgPSBEVERQYXRobmFtZVV0aWwucGFyc2VQYXRoQ29tcG9uZW50KHJlbGF0aXZlUGF0aCk7Ci0KLQotCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIHJlc3VsdFswXTsKLQotCi0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCi0JCURURE9iamVjdCBvYmogPSBudWxsOwotCQlpZiAodHlwZS5lcXVhbHMoIkNvbnRlbnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlvYmogPSBnZXRDb250ZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0KLQkJU3RyaW5nIHJlc3RQYXRoID0gKFN0cmluZykgcmVzdWx0WzNdOwotCi0JCWlmICgocmVzdFBhdGggPT0gbnVsbCkgfHwgKG9iaiA9PSBudWxsKSkgewotCQkJcmV0dXJuIG9iajsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBvYmouZmluZE9iamVjdChyZXN0UGF0aCk7Ci0JCX0KLQl9Ci0KLQotCS8vIHVnbHkgaGFjayBmb3Igbm93IHNpbmNlIHdlIGRvbid0IGhhdmUgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCi0JLy8gV291bGQgcmF0aGVyIGhhdmUgYWxsIHRoaXMgc3R1ZmYgaW4gYSBiYXNlIGNsYXNzIGJ1dCB0aGVzZQotCS8vIGNsYXNzZXMgYXJlIGluaGVyaXRpbmcgZnJvbSBzb21ldGltZXMgZGlmZmVyZW50IG1vZiBjbGFzc2VzCi0JRFRETGV4aWNhbEluZm8gbGV4SW5mbyA9IG5ldyBEVERMZXhpY2FsSW5mbygpOwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0U3RhcnRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldEVuZE9mZnNldCh2KTsKLQl9Ci0KLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21tZW50ID0gQ09NTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1BhcmFtZXRlckVudGl0eSgpIDxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjaXNQYXJhbWV0ZXJFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQQVJBTUVURVJfRU5USVRZX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1BhcmFtZXRlckVudGl0eSgpIDxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjaXNQYXJhbWV0ZXJFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHBhcmFtZXRlckVudGl0eSA9IFBBUkFNRVRFUl9FTlRJVFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250ZW50KCkgPGVtPkNvbnRlbnQ8L2VtPn0nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRERW50aXR5Q29udGVudCBjb250ZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcm1FbnRpdHlSZWYoKSA8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0UGFybUVudGl0eVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5UmVmID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGl0eVJlZmVyZW5jZSgpIDxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT59JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRFbnRpdHlSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlbnRpdHlSZWZlcmVuY2UgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpIDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2VtPn0nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT59JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXR0cmlidXRlVHlwZVJlZmVyZW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERUREVudGl0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIG5ld0NvbW1lbnQpIHsKLQkJU3RyaW5nIG9sZENvbW1lbnQgPSBjb21tZW50OwotCQljb21tZW50ID0gbmV3Q29tbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5ULCBvbGRDb21tZW50LCBjb21tZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyRW50aXR5KCkgewotCQlyZXR1cm4gcGFyYW1ldGVyRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJFbnRpdHkoYm9vbGVhbiBuZXdQYXJhbWV0ZXJFbnRpdHkpIHsKLQkJYm9vbGVhbiBvbGRQYXJhbWV0ZXJFbnRpdHkgPSBwYXJhbWV0ZXJFbnRpdHk7Ci0JCXBhcmFtZXRlckVudGl0eSA9IG5ld1BhcmFtZXRlckVudGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZLCBvbGRQYXJhbWV0ZXJFbnRpdHksIHBhcmFtZXRlckVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5Q29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udGVudChEVERFbnRpdHlDb250ZW50IG5ld0NvbnRlbnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRFRERW50aXR5Q29udGVudCBvbGRDb250ZW50ID0gY29udGVudDsKLQkJY29udGVudCA9IG5ld0NvbnRlbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQsIG9sZENvbnRlbnQsIG5ld0NvbnRlbnQpKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChEVERFbnRpdHlDb250ZW50IG5ld0NvbnRlbnQpIHsKLQkJaWYgKG5ld0NvbnRlbnQgIT0gY29udGVudCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgY29udGVudCkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFksIERUREVudGl0eUNvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbnRlbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0NvbnRlbnQpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZLCBEVERFbnRpdHlDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbnRlbnQobmV3Q29udGVudCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgbmV3Q29udGVudCwgbmV3Q29udGVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGdldFBhcm1FbnRpdHlSZWYoKSB7Ci0JCWlmIChwYXJtRW50aXR5UmVmICE9IG51bGwgJiYgcGFybUVudGl0eVJlZi5lSXNQcm94eSgpKSB7Ci0JCQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2Ugb2xkUGFybUVudGl0eVJlZiA9IHBhcm1FbnRpdHlSZWY7Ci0JCQlwYXJtRW50aXR5UmVmID0gKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgRWNvcmVVdGlsLnJlc29sdmUocGFybUVudGl0eVJlZiwgdGhpcyk7Ci0JCQlpZiAocGFybUVudGl0eVJlZiAhPSBvbGRQYXJtRW50aXR5UmVmKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYsIG9sZFBhcm1FbnRpdHlSZWYsIHBhcm1FbnRpdHlSZWYpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFybUVudGl0eVJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBiYXNpY0dldFBhcm1FbnRpdHlSZWYoKSB7Ci0JCXJldHVybiBwYXJtRW50aXR5UmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQYXJtRW50aXR5UmVmKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBuZXdQYXJtRW50aXR5UmVmLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBvbGRQYXJtRW50aXR5UmVmID0gcGFybUVudGl0eVJlZjsKLQkJcGFybUVudGl0eVJlZiA9IG5ld1Bhcm1FbnRpdHlSZWY7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiwgb2xkUGFybUVudGl0eVJlZiwgbmV3UGFybUVudGl0eVJlZikpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJtRW50aXR5UmVmKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBuZXdQYXJtRW50aXR5UmVmKSB7Ci0JCWlmIChuZXdQYXJtRW50aXR5UmVmICE9IHBhcm1FbnRpdHlSZWYpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBhcm1FbnRpdHlSZWYgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBhcm1FbnRpdHlSZWYpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFksIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3UGFybUVudGl0eVJlZiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UGFybUVudGl0eVJlZikuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSwgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBhcm1FbnRpdHlSZWYobmV3UGFybUVudGl0eVJlZiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGLCBuZXdQYXJtRW50aXR5UmVmLCBuZXdQYXJtRW50aXR5UmVmKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFbnRpdHlSZWZlcmVuY2UoKSB7Ci0JCWlmIChlbnRpdHlSZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJZW50aXR5UmVmZXJlbmNlID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQuY2xhc3MsIHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSwgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZKTsKLQkJfQotCQlyZXR1cm4gZW50aXR5UmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpIHsKLQkJaWYgKGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJYXR0cmlidXRlTmFtZVJlZmVyZW5jZSA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChEVERBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFLCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZKTsKLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlTmFtZVJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSB7Ci0JCWlmIChhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlID09IG51bGwpIHsKLQkJCWF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QoRFREQXR0cmlidXRlLmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSk7Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQgOgotCQkJCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBjb250ZW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5ULCBudWxsLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0Q29udGVudCgoRFRERW50aXR5Q29udGVudCkgb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCQlpZiAocGFybUVudGl0eVJlZiAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwYXJtRW50aXR5UmVmKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuY2xhc3MsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRQYXJtRW50aXR5UmVmKChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVudGl0eVJlZmVyZW5jZSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UIDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0Q29udGVudChudWxsLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGIDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UGFybUVudGl0eVJlZihudWxsLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVudGl0eVJlZmVyZW5jZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQoKSwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UIDoKLQkJCQlyZXR1cm4gZ2V0Q29tbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFkgOgotCQkJCXJldHVybiBpc1BhcmFtZXRlckVudGl0eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UIDoKLQkJCQlyZXR1cm4gZ2V0Q29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRQYXJtRW50aXR5UmVmKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UGFybUVudGl0eVJlZigpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCXJldHVybiBnZXRFbnRpdHlSZWZlcmVuY2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UgOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFkgOgotCQkJCXNldFBhcmFtZXRlckVudGl0eSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQgOgotCQkJCXNldENvbnRlbnQoKERUREVudGl0eUNvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGIDoKLQkJCQlzZXRQYXJtRW50aXR5UmVmKChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSA6Ci0JCQkJZ2V0RW50aXR5UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnRpdHlSZWZlcmVuY2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFIDoKLQkJCQlnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudChDT01NRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWSA6Ci0JCQkJc2V0UGFyYW1ldGVyRW50aXR5KFBBUkFNRVRFUl9FTlRJVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UIDoKLQkJCQlzZXRDb250ZW50KChEVERFbnRpdHlDb250ZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGIDoKLQkJCQlzZXRQYXJtRW50aXR5UmVmKChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQlnZXRFbnRpdHlSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UgOgotCQkJCWdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UgOgotCQkJCWdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQgOgotCQkJCXJldHVybiBDT01NRU5UX0VERUZBVUxUID09IG51bGwgPyBjb21tZW50ICE9IG51bGwgOiAhQ09NTUVOVF9FREVGQVVMVC5lcXVhbHMoY29tbWVudCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWSA6Ci0JCQkJcmV0dXJuIHBhcmFtZXRlckVudGl0eSAhPSBQQVJBTUVURVJfRU5USVRZX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQgOgotCQkJCXJldHVybiBjb250ZW50ICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGIDoKLQkJCQlyZXR1cm4gcGFybUVudGl0eVJlZiAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCXJldHVybiBlbnRpdHlSZWZlcmVuY2UgIT0gbnVsbCAmJiAhZ2V0RW50aXR5UmVmZXJlbmNlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgIT0gbnVsbCAmJiAhZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UgOgotCQkJCXJldHVybiBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlICE9IG51bGwgJiYgIWdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvbW1lbnQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY29tbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1ldGVyRW50aXR5OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHBhcmFtZXRlckVudGl0eSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBEVERFbnRpdHlJbXBsCi0KLS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLS8vCi0KLS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLS8vIC8vcHVibGljIGNsYXNzIERUREVudGl0eUltcGwgZXh0ZW5kcyBFTmFtZXNwYWNlSW1wbCBpbXBsZW1lbnRzIERUREVudGl0eSwKLS8vIEVOYW1lc3BhY2UsIERURENvbnRlbnR7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIFN0cmluZyBjb21tZW50ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgQm9vbGVhbiBwYXJhbWV0ZXJFbnRpdHkgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBEVERFbnRpdHlDb250ZW50IGNvbnRlbnQgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eVJlZiA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIEVMaXN0IGVudGl0eVJlZmVyZW5jZSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIEVMaXN0IGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBFTGlzdCBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRDb21tZW50ID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0UGFyYW1ldGVyRW50aXR5ID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0Q29udGVudCA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldFBhcm1FbnRpdHlSZWYgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcml2YXRlIERURENvbnRlbnRJbXBsIGR0ZENvbnRlbnREZWxlZ2F0ZSA9IG51bGw7Ci0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRU9iamVjdCBpbml0SW5zdGFuY2UoKSB7Ci0vLyBzZXRFTWV0YU9iaihlQ2xhc3NEVERFbnRpdHkoKSk7Ci0vLyBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vIHJldHVybiB0aGlzOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCB2b2lkIGluaXRJbnN0YW5jZURlbGVnYXRlcygpIHsKLS8vIHN1cGVyLmluaXRJbnN0YW5jZURlbGVnYXRlcygpOwotLy8KLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnJlZlNldERlbGVnYXRlT3duZXIodGhpcyk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERURFBhY2thZ2UgZVBhY2thZ2VEVEQoKSB7Ci0vLyByZXR1cm4KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVERFbnRpdHkoKSB7Ci0vLyByZXR1cm4KLS8vICgoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpKS5nZXREVERFbnRpdHkoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLS8vIGlmICh0aGlzLnNldENvbW1lbnQpIHJldHVybiB0aGlzLmNvbW1lbnQ7Ci0vLyBlbHNlIHJldHVybgotLy8gKFN0cmluZylEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29tbWVudCgpLmdldERlZmF1bHRWYWx1ZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db21tZW50KCksdGhpcy5jb21tZW50LHZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldENvbW1lbnQoKSB7Ci0vLyBlTm90aWZ5KHJlZkJhc2ljVW5zZXRWYWx1ZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29tbWVudCgpKSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRDb21tZW50KCkgewotLy8gcmV0dXJuIHNldENvbW1lbnQ7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgQm9vbGVhbiBnZXRQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0vLyBpZiAodGhpcy5zZXRQYXJhbWV0ZXJFbnRpdHkpIHJldHVybiB0aGlzLnBhcmFtZXRlckVudGl0eTsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoQm9vbGVhbilEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlckVudGl0eSgpIHsKLS8vIEJvb2xlYW4gcmVzdWx0ID0gZ2V0UGFyYW1ldGVyRW50aXR5KCk7Ci0vLyByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQuYm9vbGVhblZhbHVlKCkgOiBmYWxzZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJFbnRpdHkoQm9vbGVhbiB2YWx1ZSkgewotLy8gcmVmU2V0VmFsdWVGb3JTaW1wbGVTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCksdGhpcy5wYXJhbWV0ZXJFbnRpdHksdmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckVudGl0eShib29sZWFuIHZhbHVlKSB7Ci0vLyBzZXRQYXJhbWV0ZXJFbnRpdHkodmFsdWU/Qm9vbGVhbi5UUlVFOkJvb2xlYW4uRkFMU0UpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0UGFyYW1ldGVyRW50aXR5KCkgewotLy8gZU5vdGlmeShyZWZCYXNpY1Vuc2V0VmFsdWUoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1BhcmFtZXRlckVudGl0eSgpKSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0vLyByZXR1cm4gc2V0UGFyYW1ldGVyRW50aXR5OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIERUREVudGl0eUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLS8vIHRyeSB7Ci0vLyBpZiAodGhpcy5jb250ZW50ID09IG51bGwpIHJldHVybiBudWxsOwotLy8gdGhpcy5jb250ZW50ID0gKERUREVudGl0eUNvbnRlbnQpCi0vLyAoKEludGVybmFsRU9iamVjdCl0aGlzLmNvbnRlbnQpLnJlc29sdmUodGhpcyk7Ci0vLyBpZiAodGhpcy5jb250ZW50PT1udWxsKSB0aGlzLnNldENvbnRlbnQgPSBmYWxzZTsKLS8vIHJldHVybiB0aGlzLmNvbnRlbnQ7Ci0vLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIG51bGw7Ci0vLyB9Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0Q29udGVudChEVERFbnRpdHlDb250ZW50IGwpIHsKLS8vIHJlZlNldFZhbHVlRm9yUmVmT2JqZWN0U0YoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbnRlbnQoKSx0aGlzLmNvbnRlbnQsbCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRDb250ZW50KCkgewotLy8gcmVmVW5zZXRWYWx1ZUZvclJlZk9iamVjdFNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db250ZW50KCksdGhpcy5jb250ZW50KTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldENvbnRlbnQoKSB7Ci0vLyByZXR1cm4gc2V0Q29udGVudDsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZ2V0UGFybUVudGl0eVJlZigpIHsKLS8vIHRyeSB7Ci0vLyBpZiAodGhpcy5wYXJtRW50aXR5UmVmID09IG51bGwpIHJldHVybiBudWxsOwotLy8gdGhpcy5wYXJtRW50aXR5UmVmID0gKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkKLS8vICgoSW50ZXJuYWxFT2JqZWN0KXRoaXMucGFybUVudGl0eVJlZikucmVzb2x2ZSh0aGlzLAotLy8gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSk7Ci0vLyBpZiAodGhpcy5wYXJtRW50aXR5UmVmPT1udWxsKSB0aGlzLnNldFBhcm1FbnRpdHlSZWYgPSBmYWxzZTsKLS8vIHJldHVybiB0aGlzLnBhcm1FbnRpdHlSZWY7Ci0vLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIG51bGw7Ci0vLyB9Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UGFybUVudGl0eVJlZihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgbCkgewotLy8gcmVmU2V0VmFsdWVGb3JTVlJlZmVyZW5jZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpLHRoaXMucGFybUVudGl0eVJlZixsKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldFBhcm1FbnRpdHlSZWYoKSB7Ci0vLyByZWZVbnNldFZhbHVlRm9yU1ZSZWZlcmVuY2UoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSx0aGlzLnBhcm1FbnRpdHlSZWYpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0UGFybUVudGl0eVJlZigpIHsKLS8vIHJldHVybiBzZXRQYXJtRW50aXR5UmVmOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEVMaXN0IGdldEVudGl0eVJlZmVyZW5jZSgpIHsKLS8vIGlmICh0aGlzLmVudGl0eVJlZmVyZW5jZT09bnVsbCkgewotLy8gdGhpcy5lbnRpdHlSZWZlcmVuY2U9bmV3Q29sbGVjdGlvbih0aGlzLERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9FbnRpdHlSZWZlcmVuY2UoKSwKLS8vIHRydWUpOwotLy8gfQotLy8gcmV0dXJuIHRoaXMuZW50aXR5UmVmZXJlbmNlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEVMaXN0IGdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSB7Ci0vLyBpZiAodGhpcy5hdHRyaWJ1dGVOYW1lUmVmZXJlbmNlPT1udWxsKSB7Ci0vLyB0aGlzLmF0dHJpYnV0ZU5hbWVSZWZlcmVuY2U9bmV3Q29sbGVjdGlvbih0aGlzLERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCksCi0vLyB0cnVlKTsKLS8vIH0KLS8vIHJldHVybiB0aGlzLmF0dHJpYnV0ZU5hbWVSZWZlcmVuY2U7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRUxpc3QgZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpIHsKLS8vIGlmICh0aGlzLmF0dHJpYnV0ZVR5cGVSZWZlcmVuY2U9PW51bGwpIHsKLS8vIHRoaXMuYXR0cmlidXRlVHlwZVJlZmVyZW5jZT1uZXdDb2xsZWN0aW9uKHRoaXMsRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSwKLS8vIHRydWUpOwotLy8gfQotLy8gcmV0dXJuIHRoaXMuYXR0cmlidXRlVHlwZVJlZmVyZW5jZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERW50aXR5KCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UOiByZXR1cm4gZ2V0Q29tbWVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFk6IHJldHVybiBnZXRQYXJhbWV0ZXJFbnRpdHkoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UOiByZXR1cm4gZ2V0Q29udGVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRjogcmV0dXJuIGdldFBhcm1FbnRpdHlSZWYoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFOiByZXR1cm4gZ2V0RW50aXR5UmVmZXJlbmNlKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFOiByZXR1cm4KLS8vIGdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0U6IHJldHVybgotLy8gZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFOiByZXR1cm4gZ2V0RFRERmlsZSgpOwotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBPYmplY3QgcmVmQmFzaWNWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6Ci0vLyByZXR1cm4gdGhpcy5zZXRDb21tZW50PyB0aGlzLmNvbW1lbnQgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFk6Ci0vLyByZXR1cm4gdGhpcy5zZXRQYXJhbWV0ZXJFbnRpdHk/IHRoaXMucGFyYW1ldGVyRW50aXR5IDogbnVsbDsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UOgotLy8gaWYgKCF0aGlzLnNldENvbnRlbnR8fHRoaXMuY29udGVudD09bnVsbCkgcmV0dXJuIG51bGw7Ci0vLyBpZiAoKChJbnRlcm5hbEVPYmplY3QpdGhpcy5jb250ZW50KS5yZWZJc0RlbGV0ZWQoKSkge3RoaXMuY29udGVudD1udWxsOwotLy8gdGhpcy5zZXRDb250ZW50PWZhbHNlO30KLS8vIHJldHVybiB0aGlzLmNvbnRlbnQ7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOgotLy8gaWYgKCF0aGlzLnNldFBhcm1FbnRpdHlSZWZ8fHRoaXMucGFybUVudGl0eVJlZj09bnVsbCkgcmV0dXJuIG51bGw7Ci0vLyBpZiAoKChJbnRlcm5hbEVPYmplY3QpdGhpcy5wYXJtRW50aXR5UmVmKS5yZWZJc0RlbGV0ZWQoKSkKLS8vIHt0aGlzLnBhcm1FbnRpdHlSZWY9bnVsbDsgdGhpcy5zZXRQYXJtRW50aXR5UmVmPWZhbHNlO30KLS8vIHJldHVybiB0aGlzLnBhcm1FbnRpdHlSZWY7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRToKLS8vIHJldHVybiB0aGlzLmVudGl0eVJlZmVyZW5jZTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0U6Ci0vLyByZXR1cm4gdGhpcy5hdHRyaWJ1dGVOYW1lUmVmZXJlbmNlOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRToKLS8vIHJldHVybiB0aGlzLmF0dHJpYnV0ZVR5cGVSZWZlcmVuY2U7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEU6IHJldHVybgotLy8gKChJbnRlcm5hbEVPYmplY3QpZ2V0RHRkQ29udGVudERlbGVnYXRlKCkpLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERW50aXR5KCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UOiByZXR1cm4gaXNTZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWTogcmV0dXJuCi0vLyBpc1NldFBhcmFtZXRlckVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6IHJldHVybiBpc1NldENvbnRlbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUY6IHJldHVybiBpc1NldFBhcm1FbnRpdHlSZWYoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRTogcmV0dXJuIGlzU2V0RFRERmlsZSgpOwotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREVudGl0eSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVDogewotLy8gc2V0Q29tbWVudCgoU3RyaW5nKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZOiB7Ci0vLyBzZXRQYXJhbWV0ZXJFbnRpdHkoKG5ld1ZhbHVlIGluc3RhbmNlb2YKLS8vIFN0cmluZyk/Qm9vbGVhbi52YWx1ZU9mKChTdHJpbmcpbmV3VmFsdWUpOihCb29sZWFuKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UOiB7Ci0vLyBzZXRDb250ZW50KChEVERFbnRpdHlDb250ZW50KW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUY6IHsKLS8vIHNldFBhcm1FbnRpdHlSZWYoKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEU6IHsKLS8vIHNldERUREZpbGUoKERUREZpbGUpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8KLS8vIH0KLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBOb3RpZmljYXRpb24gZUJhc2ljU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0vLyB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVCYXNpY1NldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREVudGl0eSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb21tZW50OwotLy8gdGhpcy5jb21tZW50ID0gKFN0cmluZyluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0Q29tbWVudCA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db21tZW50KCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFk6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucGFyYW1ldGVyRW50aXR5OwotLy8gdGhpcy5wYXJhbWV0ZXJFbnRpdHkgPSAoQm9vbGVhbiluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0UGFyYW1ldGVyRW50aXR5ID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1BhcmFtZXRlckVudGl0eSgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNvbnRlbnQ7Ci0vLyB0aGlzLmNvbnRlbnQgPSAoRFRERW50aXR5Q29udGVudCluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0Q29udGVudCA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db250ZW50KCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRjogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wYXJtRW50aXR5UmVmOwotLy8gdGhpcy5wYXJtRW50aXR5UmVmID0gKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0UGFybUVudGl0eVJlZiA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERW50aXR5KCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UOiB7Ci0vLyB1bnNldENvbW1lbnQoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZOiB7Ci0vLyB1bnNldFBhcmFtZXRlckVudGl0eSgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6IHsKLS8vIHVuc2V0Q29udGVudCgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRjogewotLy8gdW5zZXRQYXJtRW50aXR5UmVmKCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEU6IHsKLS8vIHVuc2V0RFRERmlsZSgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8KLS8vIH0KLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIHJlZkJhc2ljVW5zZXRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREVudGl0eSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb21tZW50OwotLy8gdGhpcy5jb21tZW50ID0gbnVsbDsKLS8vIHRoaXMuc2V0Q29tbWVudCA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db21tZW50KCksb2xkVmFsdWUsZ2V0Q29tbWVudCgpKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnBhcmFtZXRlckVudGl0eTsKLS8vIHRoaXMucGFyYW1ldGVyRW50aXR5ID0gbnVsbDsKLS8vIHRoaXMuc2V0UGFyYW1ldGVyRW50aXR5ID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1BhcmFtZXRlckVudGl0eSgpLG9sZFZhbHVlLGdldFBhcmFtZXRlckVudGl0eSgpKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNvbnRlbnQ7Ci0vLyB0aGlzLmNvbnRlbnQgPSBudWxsOwotLy8gdGhpcy5zZXRDb250ZW50ID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbnRlbnQoKSxvbGRWYWx1ZSxudWxsKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUY6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucGFybUVudGl0eVJlZjsKLS8vIHRoaXMucGFybUVudGl0eVJlZiA9IG51bGw7Ci0vLyB0aGlzLnNldFBhcm1FbnRpdHlSZWYgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpLG9sZFZhbHVlLG51bGwpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIERURENvbnRlbnRJbXBsIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpIHsKLS8vIGlmIChkdGRDb250ZW50RGVsZWdhdGUgPT0gbnVsbCkgewotLy8gRFREUGFja2FnZSBwa2cgPQotLy8gKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKTsKLS8vIGR0ZENvbnRlbnREZWxlZ2F0ZT0oRFREQ29udGVudEltcGwpcGtnLmVDcmVhdGVJbnN0YW5jZShwa2cuRFREX0NPTlRFTlQpOwotLy8gZHRkQ29udGVudERlbGVnYXRlLmluaXRJbnN0YW5jZSgpOwotLy8gfQotLy8gcmV0dXJuIGR0ZENvbnRlbnREZWxlZ2F0ZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRUNsYXNzIGVDbGFzc0RURENvbnRlbnQoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuZUNsYXNzKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5nZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0RFRERmlsZShEVERGaWxlIHZhbHVlKSB7Ci0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5zZXREVERGaWxlKHZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldERUREZpbGUoKSB7Ci0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS51bnNldERUREZpbGUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldERUREZpbGUoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuaXNTZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyB9Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWZkZTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEltcGwgZXh0ZW5kcyBEVERSZXBlYXRhYmxlQ29udGVudEltcGwgaW1wbGVtZW50cyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IHsKLQotCXB1YmxpYyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJRFRERW50aXR5IGUgPSBnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpOwotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpIHsKLQkJRFRERW50aXR5IGVudGl0eVJlZiA9IGdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCWlmIChlbnRpdHlSZWYuaXNQYXJhbWV0ZXJFbnRpdHkoKSkgewotCQkJcmV0dXJuICIlIiArIGdldENvbnRlbnROYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuICImIiArIGdldENvbnRlbnROYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREVudGl0eSBlbGVtZW50UmVmZXJlbmNlZEVudGl0eSA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREVudGl0eSBnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwgJiYgZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkuZUlzUHJveHkoKSkgewotCQkJRFRERW50aXR5IG9sZEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ID0gZWxlbWVudFJlZmVyZW5jZWRFbnRpdHk7Ci0JCQllbGVtZW50UmVmZXJlbmNlZEVudGl0eSA9IChEVERFbnRpdHkpIEVjb3JlVXRpbC5yZXNvbHZlKGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5LCB0aGlzKTsKLQkJCWlmIChlbGVtZW50UmVmZXJlbmNlZEVudGl0eSAhPSBvbGRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSwgb2xkRWxlbWVudFJlZmVyZW5jZWRFbnRpdHksIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGJhc2ljR2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCXJldHVybiBlbGVtZW50UmVmZXJlbmNlZEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5IG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURUREVudGl0eSBvbGRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSA9IGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5OwotCQllbGVtZW50UmVmZXJlbmNlZEVudGl0eSA9IG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZLCBvbGRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSwgbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpIHsKLQkJaWYgKG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlbGVtZW50UmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZLCBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSwgbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJCWlmIChlbGVtZW50UmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBlbGVtZW50UmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJCXJldHVybiBiYXNpY1NldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKCkpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCgpLCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBnZXRPY2N1cnJlbmNlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpOwotCQkJCXJldHVybiBiYXNpY0dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gb2NjdXJyZW5jZSAhPSBPQ0NVUlJFTkNFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXJldHVybiBlbGVtZW50UmVmZXJlbmNlZEVudGl0eSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJc2V0T2NjdXJyZW5jZSgoRFRET2NjdXJyZW5jZVR5cGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJc2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKERUREVudGl0eSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJc2V0T2NjdXJyZW5jZShPQ0NVUlJFTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJc2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudW1lcmF0aW9uVHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnVtZXJhdGlvblR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNjA0YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudW1lcmF0aW9uVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUVudW1JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFbnVtZXJhdGlvblR5cGVJbXBsIGV4dGVuZHMgRUVudW1JbXBsIGltcGxlbWVudHMgRFRERW51bWVyYXRpb25UeXBlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2luZCgpIDxlbT5LaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVERFbnVtR3JvdXBLaW5kIEtJTkRfRURFRkFVTFQgPSBEVERFbnVtR3JvdXBLaW5kLk5BTUVfVE9LRU5fR1JPVVBfTElURVJBTDsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGVudW1lcmF0aW9uVHlwZURlc2NyaXB0aW9uc1tdID0ge0RURENvcmVNZXNzYWdlcy5fVUlfRU5VTV9OQU1FX1RPS0VOU19ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVU1fTk9UQVRJT05fREVTQ307IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgZW51bWVyYXRpb25UeXBlS2luZHNbXSA9IHtEVERFbnVtR3JvdXBLaW5kLk5BTUVfVE9LRU5fR1JPVVAsIERUREVudW1Hcm91cEtpbmQuTk9UQVRJT05fR1JPVVB9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREVudW1Hcm91cEtpbmQga2luZCA9IEtJTkRfRURFRkFVTFQ7Ci0KLQlwdWJsaWMgRFRERW51bWVyYXRpb25UeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnVtZXJhdGlvblR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RW51bUxpdGVyYWxzKCkgewotCQlyZXR1cm4gZ2V0RUxpdGVyYWxzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbnVtZXJhdGlvblR5cGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGdldEVudW1lcmF0aW9uVHlwZURlc2NyaXB0aW9uKGdldEtpbmQoKS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbnVtZXJhdGlvblR5cGVEZXNjcmlwdGlvbihpbnQga2luZCkgewotCQkvLyBpdCBjYW4gb25seSBiZSAxIG9yIDIsIGJ1dCBtYXliZSBsYXRlci4uLgotCQlpZiAoa2luZCA+PSAxICYmIGtpbmQgPD0gMikgewotCQkJLy8gd2Ugc3VidHJhY3QgMSBzaW5jZSB0aGUga2luZCBpcyAxIC0gYmFzZWQgbm90IHplcm8gYmFzZWQKLQkJCXJldHVybiBlbnVtZXJhdGlvblR5cGVEZXNjcmlwdGlvbnNba2luZCAtIDFdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7Ci0JCS8vIFRCRAotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERFbnVtR3JvdXBLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBraW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLaW5kKERUREVudW1Hcm91cEtpbmQgbmV3S2luZCkgewotCQlEVERFbnVtR3JvdXBLaW5kIG9sZEtpbmQgPSBraW5kOwotCQlraW5kID0gbmV3S2luZCA9PSBudWxsID8gS0lORF9FREVGQVVMVCA6IG5ld0tpbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQsIG9sZEtpbmQsIGtpbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEVERGaWxlKSBlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSBuZXdEVERGaWxlKSB7Ci0JCWlmIChuZXdEVERGaWxlICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQoKSAhPSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSAmJiBuZXdEVERGaWxlICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RFRERmlsZSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSArICIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0RUREZpbGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREZpbGUpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFLCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3RFRERmlsZSwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSwgbmV3RFRERmlsZSwgbmV3RFRERmlsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUxJVEVSQUxTIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUxpdGVyYWxzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVMaXRlcmFscygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKCkpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FQ0xBU1NJRklFUlMsIEVQYWNrYWdlLmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQoKSwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX05BTUUgOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzTmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJcmV0dXJuIGdldEluc3RhbmNlQ2xhc3MoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fREVGQVVMVF9WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSA6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX1NFUklBTElaQUJMRSA6Ci0JCQkJcmV0dXJuIGlzU2VyaWFsaXphYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgOgotCQkJCXJldHVybiBnZXRFTGl0ZXJhbHMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fS0lORCA6Ci0JCQkJcmV0dXJuIGdldEtpbmQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZ2V0RUFubm90YXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19OQU1FIDoKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gaW5zdGFuY2VDbGFzc05hbWUgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhpbnN0YW5jZUNsYXNzTmFtZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3MgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzcyk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSA6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fU0VSSUFMSVpBQkxFIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBTRVJJQUxJWkFCTEVfRUZMQUcpICE9IDApICE9IFNFUklBTElaQUJMRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUxJVEVSQUxTIDoKLQkJCQlyZXR1cm4gZUxpdGVyYWxzICE9IG51bGwgJiYgIWdldEVMaXRlcmFscygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fS0lORCA6Ci0JCQkJcmV0dXJuIGtpbmQgIT0gS0lORF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fTkFNRSA6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzcygoQ2xhc3MpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX1NFUklBTElaQUJMRSA6Ci0JCQkJc2V0U2VyaWFsaXphYmxlKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA6Ci0JCQkJZ2V0RUxpdGVyYWxzKCkuY2xlYXIoKTsKLQkJCQlnZXRFTGl0ZXJhbHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQgOgotCQkJCXNldEtpbmQoKERUREVudW1Hcm91cEtpbmQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fTkFNRSA6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fU0VSSUFMSVpBQkxFIDoKLQkJCQlzZXRTZXJpYWxpemFibGUoU0VSSUFMSVpBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA6Ci0JCQkJZ2V0RUxpdGVyYWxzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQgOgotCQkJCXNldEtpbmQoS0lORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoa2luZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChraW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERXh0ZXJuYWxFbnRpdHlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERXh0ZXJuYWxFbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YmQ0YzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREV4dGVybmFsRW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFeHRlcm5hbEVudGl0eUltcGwgZXh0ZW5kcyBEVERFbnRpdHlDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREV4dGVybmFsRW50aXR5IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3lzdGVtSUQoKSA8ZW0+U3lzdGVtIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0U3lzdGVtSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN5c3RlbUlEID0gU1lTVEVNX0lEX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdWJsaWNJRCgpIDxlbT5QdWJsaWMgSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRQdWJsaWNJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVibGljSUQgPSBQVUJMSUNfSURfRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERURE5vdGF0aW9uIG5vdGF0aW9uID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRERmlsZSBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlID0gbnVsbDsKLQotCXB1YmxpYyBEVERFeHRlcm5hbEVudGl0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoKSB7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQlpZiAoZ2V0UHVibGljSUQoKSA9PSBudWxsIHx8IGdldFB1YmxpY0lEKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0ZXh0LmFwcGVuZCgiU1lTVEVNICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQl0ZXh0LmFwcGVuZCgiUFVCTElDIFwiIikuYXBwZW5kKGdldFB1YmxpY0lEKCkpLmFwcGVuZCgiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCVN0cmluZyBzeXN0ZW1JZCA9IGdldFN5c3RlbUlEKCk7Ci0KLQkJdGV4dC5hcHBlbmQoIlwiIikuYXBwZW5kKHN5c3RlbUlkKS5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCURURE5vdGF0aW9uIG5vdGF0aW9uID0gZ2V0Tm90YXRpb24oKTsKLQkJaWYgKG5vdGF0aW9uICE9IG51bGwpCi0JCQl0ZXh0LmFwcGVuZCgiIE5EQVRBICIpLmFwcGVuZChub3RhdGlvbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSUQoKSB7Ci0JCXJldHVybiBzeXN0ZW1JRDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JRChTdHJpbmcgbmV3U3lzdGVtSUQpIHsKLQkJU3RyaW5nIG9sZFN5c3RlbUlEID0gc3lzdGVtSUQ7Ci0JCXN5c3RlbUlEID0gbmV3U3lzdGVtSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fU1lTVEVNX0lELCBvbGRTeXN0ZW1JRCwgc3lzdGVtSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSUQoKSB7Ci0JCXJldHVybiBwdWJsaWNJRDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJRChTdHJpbmcgbmV3UHVibGljSUQpIHsKLQkJU3RyaW5nIG9sZFB1YmxpY0lEID0gcHVibGljSUQ7Ci0JCXB1YmxpY0lEID0gbmV3UHVibGljSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fUFVCTElDX0lELCBvbGRQdWJsaWNJRCwgcHVibGljSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVEROb3RhdGlvbiBnZXROb3RhdGlvbigpIHsKLQkJaWYgKG5vdGF0aW9uICE9IG51bGwgJiYgbm90YXRpb24uZUlzUHJveHkoKSkgewotCQkJRFRETm90YXRpb24gb2xkTm90YXRpb24gPSBub3RhdGlvbjsKLQkJCW5vdGF0aW9uID0gKERURE5vdGF0aW9uKSBFY29yZVV0aWwucmVzb2x2ZShub3RhdGlvbiwgdGhpcyk7Ci0JCQlpZiAobm90YXRpb24gIT0gb2xkTm90YXRpb24pIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OLCBvbGROb3RhdGlvbiwgbm90YXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVEROb3RhdGlvbiBiYXNpY0dldE5vdGF0aW9uKCkgewotCQlyZXR1cm4gbm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE5vdGF0aW9uKERURE5vdGF0aW9uIG5ld05vdGF0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURURE5vdGF0aW9uIG9sZE5vdGF0aW9uID0gbm90YXRpb247Ci0JCW5vdGF0aW9uID0gbmV3Tm90YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OLCBvbGROb3RhdGlvbiwgbmV3Tm90YXRpb24pKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RhdGlvbihEVEROb3RhdGlvbiBuZXdOb3RhdGlvbikgewotCQlpZiAobmV3Tm90YXRpb24gIT0gbm90YXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG5vdGF0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBub3RhdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSwgRFRETm90YXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld05vdGF0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdOb3RhdGlvbikuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSwgRFRETm90YXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Tm90YXRpb24obmV3Tm90YXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OLCBuZXdOb3RhdGlvbiwgbmV3Tm90YXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERGaWxlIGdldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKSB7Ci0JCWlmIChlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlICE9IG51bGwgJiYgZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZS5lSXNQcm94eSgpKSB7Ci0JCQlEVERGaWxlIG9sZEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUgPSBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlOwotCQkJZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA9IChEVERGaWxlKSBFY29yZVV0aWwucmVzb2x2ZShlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlLCB0aGlzKTsKLQkJCWlmIChlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlICE9IG9sZEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFLCBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlLCBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERGaWxlIGJhc2ljR2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpIHsKLQkJcmV0dXJuIGVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZShEVERGaWxlIG5ld0VudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUpIHsKLQkJRFRERmlsZSBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlID0gZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZTsKLQkJZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA9IG5ld0VudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRURfRlJPTV9BTk9USEVSX0ZJTEUsIG9sZEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUsIGVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OIDoKLQkJCQkJaWYgKG5vdGF0aW9uICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5vdGF0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZLCBEVEROb3RhdGlvbi5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldE5vdGF0aW9uKChEVEROb3RhdGlvbikgb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA6Ci0JCQkJCXJldHVybiBiYXNpY1NldE5vdGF0aW9uKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKCkpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlEKCksIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldERUREVudGl0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCA6Ci0JCQkJcmV0dXJuIGdldFN5c3RlbUlEKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fUFVCTElDX0lEIDoKLQkJCQlyZXR1cm4gZ2V0UHVibGljSUQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXROb3RhdGlvbigpOwotCQkJCXJldHVybiBiYXNpY0dldE5vdGF0aW9uKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRURfRlJPTV9BTk9USEVSX0ZJTEUgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldERUREVudGl0eSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fU1lTVEVNX0lEIDoKLQkJCQlyZXR1cm4gU1lTVEVNX0lEX0VERUZBVUxUID09IG51bGwgPyBzeXN0ZW1JRCAhPSBudWxsIDogIVNZU1RFTV9JRF9FREVGQVVMVC5lcXVhbHMoc3lzdGVtSUQpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCA6Ci0JCQkJcmV0dXJuIFBVQkxJQ19JRF9FREVGQVVMVCA9PSBudWxsID8gcHVibGljSUQgIT0gbnVsbCA6ICFQVUJMSUNfSURfRURFRkFVTFQuZXF1YWxzKHB1YmxpY0lEKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA6Ci0JCQkJcmV0dXJuIG5vdGF0aW9uICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRURfRlJPTV9BTk9USEVSX0ZJTEUgOgotCQkJCXJldHVybiBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJc2V0RFRERW50aXR5KChEVERFbnRpdHkpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fU1lTVEVNX0lEIDoKLQkJCQlzZXRTeXN0ZW1JRCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCA6Ci0JCQkJc2V0UHVibGljSUQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA6Ci0JCQkJc2V0Tm90YXRpb24oKERURE5vdGF0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFIDoKLQkJCQlzZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQlzZXREVERFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCA6Ci0JCQkJc2V0U3lzdGVtSUQoU1lTVEVNX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fUFVCTElDX0lEIDoKLQkJCQlzZXRQdWJsaWNJRChQVUJMSUNfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA6Ci0JCQkJc2V0Tm90YXRpb24oKERURE5vdGF0aW9uKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRURfRlJPTV9BTk9USEVSX0ZJTEUgOgotCQkJCXNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHN5c3RlbUlEOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHN5c3RlbUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwdWJsaWNJRDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwdWJsaWNJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkZWZjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQW55Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLlhNTFNjaGVtYURlZmluZWRUeXBlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgRFRERmFjdG9yeSB7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfTk9ORTsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9DREFUQTsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9JRDsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9JRFJFRjsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9JRFJFRlM7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfRU5USVRZOwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX0VOVElUSUVTOwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX05NVE9LRU47Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfTk1UT0tFTlM7Ci0KLQotCi0JcHVibGljIHN0YXRpYyBEVERGYWN0b3J5IGluc3RhbmNlKCkgewotCQlyZXR1cm4gKERUREZhY3RvcnkpIGdldFBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX05PTkUuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9OT05FKCkgewotCQlpZiAoZHRkQmFzaWNUeXBlX05PTkUgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9OT05FID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5DREFUQV9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX05PTkU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX0NEQVRBLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfQ0RBVEEoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfQ0RBVEEgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9DREFUQSA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuQ0RBVEFfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9DREFUQTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfSUQuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9JRCgpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9JRCA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX0lEID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5JRF9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0lEOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9JRFJFRi4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX0lEUkVGKCkgewotCQlpZiAoZHRkQmFzaWNUeXBlX0lEUkVGID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfSURSRUYgPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLklEUkVGX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVfSURSRUY7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX0lEUkVGUy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX0lEUkVGUygpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9JRFJFRlMgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9JRFJFRlMgPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLklEUkVGU19MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0lEUkVGUzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfRU5USVRZLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfRU5USVRZKCkgewotCQlpZiAoZHRkQmFzaWNUeXBlX0VOVElUWSA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX0VOVElUWSA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuRU5USVRZX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVfRU5USVRZOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9FTlRJVElFUy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX0VOVElUSUVTKCkgewotCQlpZiAoZHRkQmFzaWNUeXBlX0VOVElUSUVTID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfRU5USVRJRVMgPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLkVOVElUSUVTX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVfRU5USVRJRVM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX05NVE9LRU4uCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9OTVRPS0VOKCkgewotCQlpZiAoZHRkQmFzaWNUeXBlX05NVE9LRU4gPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9OTVRPS0VOID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVfTk1UT0tFTjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfTk1UT0tFTlMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9OTVRPS0VOUygpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9OTVRPS0VOUyA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX05NVE9LRU5TID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOU19MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX05NVE9LRU5TOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlQgOgotCQkJCXJldHVybiBjcmVhdGVEVERHcm91cENvbnRlbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFREQXR0cmlidXRlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlQgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbGVtZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlQgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlQgOgotCQkJCXJldHVybiBjcmVhdGVEVERBbnlDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURURFBDRGF0YUNvbnRlbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEUgOgotCQkJCXJldHVybiBjcmVhdGVEVERGaWxlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEUgOgotCQkJCXJldHVybiBjcmVhdGVEVERCYXNpY1R5cGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRSA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTiA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURURE5vdGF0aW9uKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREVudGl0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFkgOgotCQkJCXJldHVybiBjcmVhdGVEVERFeHRlcm5hbEVudGl0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFkgOgotCQkJCXJldHVybiBjcmVhdGVEVERJbnRlcm5hbEVudGl0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlQgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX09DQ1VSUkVOQ0VfVFlQRSA6Ci0JCQkJcmV0dXJuIERURE9jY3VycmVuY2VUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9ERUZBVUxUX0tJTkQgOgotCQkJCXJldHVybiBEVEREZWZhdWx0S2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9LSU5EIDoKLQkJCQlyZXR1cm4gRFREQmFzaWNUeXBlS2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTV9HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gRFRERW51bUdyb3VwS2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfS0lORCA6Ci0JCQkJcmV0dXJuIERUREdyb3VwS2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRFREUGFja2FnZS5YTUxfU0NIRU1BX0RFRklORURfVFlQRSA6Ci0JCQkJcmV0dXJuIFhNTFNjaGVtYURlZmluZWRUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9PQ0NVUlJFTkNFX1RZUEUgOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9ERUZBVUxUX0tJTkQgOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX0tJTkQgOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNX0dST1VQX0tJTkQgOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5YTUxfU0NIRU1BX0RFRklORURfVFlQRSA6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERHcm91cENvbnRlbnQgY3JlYXRlRFRER3JvdXBDb250ZW50KCkgewotCQlEVERHcm91cENvbnRlbnRJbXBsIGR0ZEdyb3VwQ29udGVudCA9IG5ldyBEVERHcm91cENvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRHcm91cENvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERBdHRyaWJ1dGUgY3JlYXRlRFREQXR0cmlidXRlKCkgewotCQlEVERBdHRyaWJ1dGVJbXBsIGR0ZEF0dHJpYnV0ZSA9IG5ldyBEVERBdHRyaWJ1dGVJbXBsKCk7Ci0JCXJldHVybiBkdGRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbGVtZW50IGNyZWF0ZURUREVsZW1lbnQoKSB7Ci0JCURUREVsZW1lbnRJbXBsIGR0ZEVsZW1lbnQgPSBuZXcgRFRERWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIGR0ZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbXB0eUNvbnRlbnQgY3JlYXRlRFRERW1wdHlDb250ZW50KCkgewotCQlEVERFbXB0eUNvbnRlbnRJbXBsIGR0ZEVtcHR5Q29udGVudCA9IG5ldyBEVERFbXB0eUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRFbXB0eUNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERBbnlDb250ZW50IGNyZWF0ZURUREFueUNvbnRlbnQoKSB7Ci0JCURUREFueUNvbnRlbnRJbXBsIGR0ZEFueUNvbnRlbnQgPSBuZXcgRFREQW55Q29udGVudEltcGwoKTsKLQkJcmV0dXJuIGR0ZEFueUNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERQQ0RhdGFDb250ZW50IGNyZWF0ZURURFBDRGF0YUNvbnRlbnQoKSB7Ci0JCURURFBDRGF0YUNvbnRlbnRJbXBsIGR0ZHBjRGF0YUNvbnRlbnQgPSBuZXcgRFREUENEYXRhQ29udGVudEltcGwoKTsKLQkJcmV0dXJuIGR0ZHBjRGF0YUNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBjcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpIHsKLQkJRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsIGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50ID0gbmV3IERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbCgpOwotCQlyZXR1cm4gZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERGaWxlIGNyZWF0ZURUREZpbGUoKSB7Ci0JCURUREZpbGVJbXBsIGR0ZEZpbGUgPSBuZXcgRFRERmlsZUltcGwoKTsKLQkJcmV0dXJuIGR0ZEZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERCYXNpY1R5cGUgY3JlYXRlRFREQmFzaWNUeXBlKCkgewotCQlEVERCYXNpY1R5cGVJbXBsIGR0ZEJhc2ljVHlwZSA9IG5ldyBEVERCYXNpY1R5cGVJbXBsKCk7Ci0JCXJldHVybiBkdGRCYXNpY1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnVtZXJhdGlvblR5cGUgY3JlYXRlRFRERW51bWVyYXRpb25UeXBlKCkgewotCQlEVERFbnVtZXJhdGlvblR5cGVJbXBsIGR0ZEVudW1lcmF0aW9uVHlwZSA9IG5ldyBEVERFbnVtZXJhdGlvblR5cGVJbXBsKCk7Ci0JCXJldHVybiBkdGRFbnVtZXJhdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVEROb3RhdGlvbiBjcmVhdGVEVEROb3RhdGlvbigpIHsKLQkJRFRETm90YXRpb25JbXBsIGR0ZE5vdGF0aW9uID0gbmV3IERURE5vdGF0aW9uSW1wbCgpOwotCQlyZXR1cm4gZHRkTm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnRpdHkgY3JlYXRlRFRERW50aXR5KCkgewotCQlEVERFbnRpdHlJbXBsIGR0ZEVudGl0eSA9IG5ldyBEVERFbnRpdHlJbXBsKCk7Ci0JCXJldHVybiBkdGRFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFeHRlcm5hbEVudGl0eSBjcmVhdGVEVERFeHRlcm5hbEVudGl0eSgpIHsKLQkJRFRERXh0ZXJuYWxFbnRpdHlJbXBsIGR0ZEV4dGVybmFsRW50aXR5ID0gbmV3IERUREV4dGVybmFsRW50aXR5SW1wbCgpOwotCQlyZXR1cm4gZHRkRXh0ZXJuYWxFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERJbnRlcm5hbEVudGl0eSBjcmVhdGVEVERJbnRlcm5hbEVudGl0eSgpIHsKLQkJRFRESW50ZXJuYWxFbnRpdHlJbXBsIGR0ZEludGVybmFsRW50aXR5ID0gbmV3IERUREludGVybmFsRW50aXR5SW1wbCgpOwotCQlyZXR1cm4gZHRkSW50ZXJuYWxFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgY3JlYXRlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkgewotCQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsIGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSA9IG5ldyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsKCk7Ci0JCXJldHVybiBkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKSB7Ci0JCURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsIGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnQgPSBuZXcgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEltcGwoKTsKLQkJcmV0dXJuIGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERQYWNrYWdlIGdldERURFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoRFREUGFja2FnZSkgZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERmlsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERGaWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzg0NmRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERGaWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTmFtZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFBhdGhuYW1lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUHJpbnRlcjsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZpbGU8L2I+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/Qm9vbGVhbi52YWx1ZU9mKChTdHJpbmcpbmV3VmFsdWUpOihCb29sZWFuKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vCi0vLyB9Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIGVCYXNpY1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotLy8gewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERGaWxlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb21tZW50OwotLy8gdGhpcy5jb21tZW50ID0gKFN0cmluZyluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0Q29tbWVudCA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfQ29tbWVudCgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1I6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucGFyc2VFcnJvcjsKLS8vIHRoaXMucGFyc2VFcnJvciA9IChCb29sZWFuKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRQYXJzZUVycm9yID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9QYXJzZUVycm9yKCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6IHsKLS8vIHVuc2V0Q29tbWVudCgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19QQVJTRV9FUlJPUjogewotLy8gdW5zZXRQYXJzZUVycm9yKCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVVuc2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBOb3RpZmljYXRpb24gcmVmQmFzaWNVbnNldFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVW5zZXRWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29tbWVudDsKLS8vIHRoaXMuY29tbWVudCA9IG51bGw7Ci0vLyB0aGlzLnNldENvbW1lbnQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX0NvbW1lbnQoKSxvbGRWYWx1ZSxnZXRDb21tZW50KCkpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19QQVJTRV9FUlJPUjogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wYXJzZUVycm9yOwotLy8gdGhpcy5wYXJzZUVycm9yID0gbnVsbDsKLS8vIHRoaXMuc2V0UGFyc2VFcnJvciA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfUGFyc2VFcnJvcigpLG9sZFZhbHVlLGdldFBhcnNlRXJyb3IoKSk7Ci0vLyB9Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVW5zZXRWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotLy8gU3RyaW5nIG91dD0iKCI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0vLyBib29sZWFuIGZpcnN0PXRydWU7Ci0vLyBib29sZWFuIGVtcHR5TGlzdD10cnVlOwotLy8gaWYoaXNTZXRDb21tZW50KCkpIHsKLS8vIGlmKCFlbXB0eUxpc3QpIG91dCs9IiwgIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLS8vIG91dCs9ImNvbW1lbnQ6ICIrdGhpcy5jb21tZW50OyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotLy8gZmlyc3Q9ZmFsc2U7Ci0vLyBlbXB0eUxpc3Q9ZmFsc2U7Ci0vLyB9Ci0vLyBpZihpc1NldFBhcnNlRXJyb3IoKSkgewotLy8gaWYoIWVtcHR5TGlzdCkgb3V0Kz0iLCAiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotLy8gb3V0Kz0icGFyc2VFcnJvcjogIit0aGlzLnBhcnNlRXJyb3I7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0vLyBmaXJzdD1mYWxzZTsKLS8vIGVtcHR5TGlzdD1mYWxzZTsKLS8vIH0KLS8vIG91dCs9IikiOwotLy8gaWYgKCFmaXJzdCkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiICIgK291dDsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLS8vIHJldHVybiBzdXBlci50b1N0cmluZygpOwotLy8gfQotLy8gfQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREdyb3VwQ29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERHcm91cENvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYTgyMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREdyb3VwQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQcmludGVyOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRER3JvdXBDb250ZW50SW1wbCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREdyb3VwQ29udGVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwS2luZCgpIDxlbT5Hcm91cCBLaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0R3JvdXBLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERUREdyb3VwS2luZCBHUk9VUF9LSU5EX0VERUZBVUxUID0gRFRER3JvdXBLaW5kLlNFUVVFTkNFX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRER3JvdXBLaW5kIGdyb3VwS2luZCA9IEdST1VQX0tJTkRfRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbnRlbnQgPSBudWxsOwotCi0JcHVibGljIERUREdyb3VwQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRER3JvdXBDb250ZW50KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb250ZW50UG9zaXRpb24oRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCQlFTGlzdCBsaXN0ID0gZ2V0Q29udGVudCgpOwotCQlyZXR1cm4gbGlzdC5pbmRleE9mKGNvbnRlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudERldGFpbCgpIHsKLQkJRFREUHJpbnRlciBwcmludGVyID0gbmV3IERURFByaW50ZXIoZmFsc2UpOwotCQlwcmludGVyLnZpc2l0RFRER3JvdXBDb250ZW50KHRoaXMpOwotCi0JCXJldHVybiBwcmludGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREdyb3VwS2luZCBnZXRHcm91cEtpbmQoKSB7Ci0JCXJldHVybiBncm91cEtpbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyb3VwS2luZChEVERHcm91cEtpbmQgbmV3R3JvdXBLaW5kKSB7Ci0JCURUREdyb3VwS2luZCBvbGRHcm91cEtpbmQgPSBncm91cEtpbmQ7Ci0JCWdyb3VwS2luZCA9IG5ld0dyb3VwS2luZCA9PSBudWxsID8gR1JPVVBfS0lORF9FREVGQVVMVCA6IG5ld0dyb3VwS2luZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVBfS0lORCwgb2xkR3JvdXBLaW5kLCBncm91cEtpbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb250ZW50KCkgewotCQlpZiAoY29udGVudCA9PSBudWxsKSB7Ci0JCQljb250ZW50ID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoRFRERWxlbWVudENvbnRlbnQuY2xhc3MsIHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVApOwotCQl9Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRDb250ZW50KCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRDb250ZW50KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCgpLCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBnZXRPY2N1cnJlbmNlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQgOgotCQkJCXJldHVybiBnZXRHcm91cEtpbmQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBvY2N1cnJlbmNlICE9IE9DQ1VSUkVOQ0VfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQgOgotCQkJCXJldHVybiBncm91cEtpbmQgIT0gR1JPVVBfS0lORF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGNvbnRlbnQgIT0gbnVsbCAmJiAhZ2V0Q29udGVudCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoKERURE9jY3VycmVuY2VUeXBlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EIDoKLQkJCQlzZXRHcm91cEtpbmQoKERUREdyb3VwS2luZCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCA6Ci0JCQkJZ2V0Q29udGVudCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudCgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJc2V0T2NjdXJyZW5jZShPQ0NVUlJFTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQgOgotCQkJCXNldEdyb3VwS2luZChHUk9VUF9LSU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCWdldENvbnRlbnQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwS2luZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChncm91cEtpbmQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERJZEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURElkSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZGVlYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURElkSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLQotcHVibGljIGNsYXNzIERURElkSGVscGVyIHsKLQlwdWJsaWMgRFRESWRIZWxwZXIoKSB7Ci0JfQotCi0JcHVibGljIFN0cmluZyBjb21wdXRlQ29udGVudElkKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQkJU3RyaW5nIGlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbXB0eUNvbnRlbnQpIHsKLQkJCWlkID0gIiNFTVBUWSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCkgewotCQkJaWQgPSAiI1BDREFUQSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQlpZCA9ICIjRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlpZCA9ICIjIiArICgoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIGNvbnRlbnQpLmdldFJlZmVyZW5jZWRFbGVtZW50KCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCWlkID0gIiMiICsgKChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KS5nZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCWlkID0gY29tcHV0ZUdyb3VwSWQoKERUREdyb3VwQ29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUdyb3VwSWQoRFRER3JvdXBDb250ZW50IGdycCkgewotCQlTdHJpbmcgZ3JvdXBJZCA9ICJfIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ3JvdXBJZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlQ29udGVudElkR2VuKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQotCQlTdHJpbmcgaWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJaWQgPSAiI0VNUFRZIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERQQ0RhdGFDb250ZW50KSB7Ci0JCQlpZCA9ICIjUENEQVRBIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbXB0eUNvbnRlbnQpIHsKLQkJCWlkID0gIiNFTVBUWSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCWlkID0gIiMiICsgKChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgY29udGVudCkuZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgewotCQkJaWQgPSAiIyIgKyAoKERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIGNvbnRlbnQpLmdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgewotCQkJaWQgPSBjb21wdXRlR3JvdXBJZCgoRFRER3JvdXBDb250ZW50KSBjb250ZW50KTsKLQkJfQotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUdyb3VwSWRHZW4oRFRER3JvdXBDb250ZW50IGdycCkgewotCi0JCVN0cmluZyBncm91cElkID0gIl8iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBncm91cElkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERJbnRlcm5hbEVudGl0eUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERJbnRlcm5hbEVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzNjE3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRESW50ZXJuYWxFbnRpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yOwotaW1wb3J0IGphdmEudGV4dC5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREludGVybmFsRW50aXR5SW1wbCBleHRlbmRzIERUREVudGl0eUNvbnRlbnRJbXBsIGltcGxlbWVudHMgRFRESW50ZXJuYWxFbnRpdHkgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQlwdWJsaWMgRFRESW50ZXJuYWxFbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREludGVybmFsRW50aXR5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDY0KTsKLQkJaWYgKGdldFZhbHVlKCkgPT0gbnVsbCkKLQkJCXNiLmFwcGVuZCgiXCJcIiIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgewotCQkJc2IuYXBwZW5kKCJcIiIpLmFwcGVuZChyZXBsYWNlRG91YmxlUXVvdGVzKGdldFZhbHVlKCkpKS5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8vIHRoaXMgbWV0aG9kIHJlcGxhY2VzIGFueSBvY2N1cnJlbmNlIG9mICcgIiAnIHdpdGggdGhlIGVxdWl2YWxlbnQgdmFsdWUKLQkvLyBvZiAmIzM0OwotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VEb3VibGVRdW90ZXMoU3RyaW5nIGlucHV0KSB7Ci0JCVN0cmluZ0J1ZmZlciBuZXdWYWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciBjaGFyYWN0ZXJzID0gbmV3IFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yKGlucHV0KTsKLQotCQl3aGlsZSAoY2hhcmFjdGVycy5jdXJyZW50KCkgIT0gQ2hhcmFjdGVySXRlcmF0b3IuRE9ORSkgewotCQkJY2hhciBjdXJyZW50ID0gY2hhcmFjdGVycy5jdXJyZW50KCk7Ci0KLQkJCWlmIChjdXJyZW50ID09ICciJykgewotCQkJCW5ld1ZhbHVlLmFwcGVuZCgiJiMzNDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3VmFsdWUuYXBwZW5kKGN1cnJlbnQpOwotCQkJfQotCQkJY2hhcmFjdGVycy5uZXh0KCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3VmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5ULCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldERUREVudGl0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldERUREVudGl0eSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fVkFMVUUgOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXNldERUREVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFIDoKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQlzZXREVERFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFIDoKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVEROb3RhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVEROb3RhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzNzRjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRETm90YXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFBhdGhuYW1lVXRpbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+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+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQoKSA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQoKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQoKSwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRCA6Ci0JCQkJcmV0dXJuIGdldFN5c3RlbUlEKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQgOgotCQkJCXJldHVybiBnZXRQdWJsaWNJRCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZIDoKLQkJCQlyZXR1cm4gZ2V0RW50aXR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEIDoKLQkJCQlzZXRTeXN0ZW1JRCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEIDoKLQkJCQlzZXRQdWJsaWNJRCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZIDoKLQkJCQlnZXRFbnRpdHkoKS5jbGVhcigpOwotCQkJCWdldEVudGl0eSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoQ09NTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEIDoKLQkJCQlzZXRTeXN0ZW1JRChTWVNURU1fSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRCA6Ci0JCQkJc2V0UHVibGljSUQoUFVCTElDX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFkgOgotCQkJCWdldEVudGl0eSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQgOgotCQkJCXJldHVybiBDT01NRU5UX0VERUZBVUxUID09IG51bGwgPyBjb21tZW50ICE9IG51bGwgOiAhQ09NTUVOVF9FREVGQVVMVC5lcXVhbHMoY29tbWVudCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQgOgotCQkJCXJldHVybiBTWVNURU1fSURfRURFRkFVTFQgPT0gbnVsbCA/IHN5c3RlbUlEICE9IG51bGwgOiAhU1lTVEVNX0lEX0VERUZBVUxULmVxdWFscyhzeXN0ZW1JRCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQgOgotCQkJCXJldHVybiBQVUJMSUNfSURfRURFRkFVTFQgPT0gbnVsbCA/IHB1YmxpY0lEICE9IG51bGwgOiAhUFVCTElDX0lEX0VERUZBVUxULmVxdWFscyhwdWJsaWNJRCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFkgOgotCQkJCXJldHVybiBlbnRpdHkgIT0gbnVsbCAmJiAhZ2V0RW50aXR5KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb21tZW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNvbW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN5c3RlbUlEOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHN5c3RlbUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwdWJsaWNJRDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwdWJsaWNJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBEVEROb3RhdGlvbkltcGwKLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8KLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8gLy9wdWJsaWMgY2xhc3MgRFRETm90YXRpb25JbXBsIGV4dGVuZHMgRU5hbWVzcGFjZUltcGwgaW1wbGVtZW50cwotLy8gRFRETm90YXRpb24sIEVOYW1lc3BhY2UsIERURENvbnRlbnR7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbgotLy8gMjAwMi4iOwotLy8KLS8vIHB1YmxpYyBEVEROb3RhdGlvbkltcGwoKQotLy8gewotLy8gc3VwZXIoKTsKLS8vIH0KLS8vIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKQotLy8gewotLy8gcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiTm90YSIsIGdldE5hbWUoKSwgLTEpOwotLy8gfQotLy8KLS8vIHB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKQotLy8gewotLy8gcmV0dXJuIG51bGw7Ci0vLyB9Ci0vLwotLy8gLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLS8vIC8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLS8vIC8vIGNsYXNzZXMgYXJlIGluaGVyaXRpbmcgZnJvbSBzb21ldGltZXMgZGlmZmVyZW50IG1vZiBjbGFzc2VzCi0vLyBEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JRCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNJRCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIEVMaXN0IGVudGl0eSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0Q29tbWVudCA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldFN5c3RlbUlEID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0UHVibGljSUQgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcml2YXRlIERURENvbnRlbnRJbXBsIGR0ZENvbnRlbnREZWxlZ2F0ZSA9IG51bGw7Ci0vLyAvKioKLS8vICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLS8vICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLS8vICovCi0vLyBwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkKLS8vIHsKLS8vIHJldHVybiBsZXhJbmZvLmdldFN0YXJ0T2Zmc2V0KCk7Ci0vLyB9Ci0vLyAgCi0vLyAvKioKLS8vICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLS8vICogQHBhcmFtIHYgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KQotLy8gewotLy8gbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLS8vIH0KLS8vICAKLS8vIC8qKgotLy8gKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLS8vICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0vLyAqLwotLy8gcHVibGljIGludCBnZXRFbmRPZmZzZXQoKQotLy8gewotLy8gcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0vLyB9Ci0vLyAgCi0vLyAvKioKLS8vICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0vLyAqIEBwYXJhbSB2IFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KQotLy8gewotLy8gbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVPYmplY3QgaW5pdEluc3RhbmNlKCkgewotLy8gc2V0RU1ldGFPYmooZUNsYXNzRFRETm90YXRpb24oKSk7Ci0vLyBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vIHJldHVybiB0aGlzOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCB2b2lkIGluaXRJbnN0YW5jZURlbGVnYXRlcygpIHsKLS8vIHN1cGVyLmluaXRJbnN0YW5jZURlbGVnYXRlcygpOwotLy8KLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnJlZlNldERlbGVnYXRlT3duZXIodGhpcyk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERURFBhY2thZ2UgZVBhY2thZ2VEVEQoKSB7Ci0vLyByZXR1cm4KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVEROb3RhdGlvbigpIHsKLS8vIHJldHVybgotLy8gKChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSkpLmdldERURE5vdGF0aW9uKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0vLyBpZiAodGhpcy5zZXRDb21tZW50KSByZXR1cm4gdGhpcy5jb21tZW50OwotLy8gZWxzZSByZXR1cm4KLS8vIChTdHJpbmcpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fQ29tbWVudCgpLmdldERlZmF1bHRWYWx1ZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0NvbW1lbnQoKSx0aGlzLmNvbW1lbnQsdmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0Q29tbWVudCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0NvbW1lbnQoKSkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0Q29tbWVudCgpIHsKLS8vIHJldHVybiBzZXRDb21tZW50OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JRCgpIHsKLS8vIGlmICh0aGlzLnNldFN5c3RlbUlEKSByZXR1cm4gdGhpcy5zeXN0ZW1JRDsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoU3RyaW5nKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCksdGhpcy5zeXN0ZW1JRCx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRTeXN0ZW1JRCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldFN5c3RlbUlEKCkgewotLy8gcmV0dXJuIHNldFN5c3RlbUlEOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyBnZXRQdWJsaWNJRCgpIHsKLS8vIGlmICh0aGlzLnNldFB1YmxpY0lEKSByZXR1cm4gdGhpcy5wdWJsaWNJRDsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoU3RyaW5nKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UHVibGljSUQoU3RyaW5nIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCksdGhpcy5wdWJsaWNJRCx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRQdWJsaWNJRCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldFB1YmxpY0lEKCkgewotLy8gcmV0dXJuIHNldFB1YmxpY0lEOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEVMaXN0IGdldEVudGl0eSgpIHsKLS8vIGlmICh0aGlzLmVudGl0eT09bnVsbCkgewotLy8gdGhpcy5lbnRpdHk9bmV3Q29sbGVjdGlvbih0aGlzLERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0VudGl0eSgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6IHJldHVybiBnZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHJldHVybiBnZXRTeXN0ZW1JRCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOiByZXR1cm4gZ2V0UHVibGljSUQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWTogcmV0dXJuIGdldEVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHJldHVybiBnZXREVERGaWxlKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCByZWZCYXNpY1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6Ci0vLyByZXR1cm4gdGhpcy5zZXRDb21tZW50PyB0aGlzLmNvbW1lbnQgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOgotLy8gcmV0dXJuIHRoaXMuc2V0U3lzdGVtSUQ/IHRoaXMuc3lzdGVtSUQgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOgotLy8gcmV0dXJuIHRoaXMuc2V0UHVibGljSUQ/IHRoaXMucHVibGljSUQgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZOgotLy8gcmV0dXJuIHRoaXMuZW50aXR5OwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHJldHVybgotLy8gKChJbnRlcm5hbEVPYmplY3QpZ2V0RHRkQ29udGVudERlbGVnYXRlKCkpLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogcmV0dXJuIGlzU2V0Q29tbWVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOiByZXR1cm4gaXNTZXRTeXN0ZW1JRCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOiByZXR1cm4gaXNTZXRQdWJsaWNJRCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHJldHVybiBpc1NldERUREZpbGUoKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVEROb3RhdGlvbigpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5UOiB7Ci0vLyBzZXRDb21tZW50KChTdHJpbmcpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOiB7Ci0vLyBzZXRTeXN0ZW1JRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogewotLy8gc2V0UHVibGljSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRTogewotLy8gc2V0RFRERmlsZSgoRFRERmlsZSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiBlQmFzaWNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLS8vIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb21tZW50OwotLy8gdGhpcy5jb21tZW50ID0gKFN0cmluZyluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0Q29tbWVudCA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0NvbW1lbnQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuc3lzdGVtSUQ7Ci0vLyB0aGlzLnN5c3RlbUlEID0gKFN0cmluZyluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0U3lzdGVtSUQgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wdWJsaWNJRDsKLS8vIHRoaXMucHVibGljSUQgPSAoU3RyaW5nKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRQdWJsaWNJRCA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogewotLy8gdW5zZXRDb21tZW50KCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHsKLS8vIHVuc2V0U3lzdGVtSUQoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogewotLy8gdW5zZXRQdWJsaWNJRCgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHsKLS8vIHVuc2V0RFRERmlsZSgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8KLS8vIH0KLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIHJlZkJhc2ljVW5zZXRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29tbWVudDsKLS8vIHRoaXMuY29tbWVudCA9IG51bGw7Ci0vLyB0aGlzLnNldENvbW1lbnQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9Db21tZW50KCksb2xkVmFsdWUsZ2V0Q29tbWVudCgpKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5zeXN0ZW1JRDsKLS8vIHRoaXMuc3lzdGVtSUQgPSBudWxsOwotLy8gdGhpcy5zZXRTeXN0ZW1JRCA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCksb2xkVmFsdWUsZ2V0U3lzdGVtSUQoKSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucHVibGljSUQ7Ci0vLyB0aGlzLnB1YmxpY0lEID0gbnVsbDsKLS8vIHRoaXMuc2V0UHVibGljSUQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpLG9sZFZhbHVlLGdldFB1YmxpY0lEKCkpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIERURENvbnRlbnRJbXBsIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpIHsKLS8vIGlmIChkdGRDb250ZW50RGVsZWdhdGUgPT0gbnVsbCkgewotLy8gRFREUGFja2FnZSBwa2cgPQotLy8gKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKTsKLS8vIGR0ZENvbnRlbnREZWxlZ2F0ZT0oRFREQ29udGVudEltcGwpcGtnLmVDcmVhdGVJbnN0YW5jZShwa2cuRFREX0NPTlRFTlQpOwotLy8gZHRkQ29udGVudERlbGVnYXRlLmluaXRJbnN0YW5jZSgpOwotLy8gfQotLy8gcmV0dXJuIGR0ZENvbnRlbnREZWxlZ2F0ZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRUNsYXNzIGVDbGFzc0RURENvbnRlbnQoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuZUNsYXNzKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5nZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0RFRERmlsZShEVERGaWxlIHZhbHVlKSB7Ci0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5zZXREVERGaWxlKHZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldERUREZpbGUoKSB7Ci0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS51bnNldERUREZpbGUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldERUREZpbGUoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuaXNTZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyB9Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQQ0RhdGFDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBDRGF0YUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YWVkYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBDRGF0YUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFREUENEYXRhQ29udGVudEltcGwgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERQQ0RhdGFDb250ZW50IHsKLQotCXB1YmxpYyBEVERQQ0RhdGFDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQQ0RhdGFDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQoKSwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiAiI1BDREFUQSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFja2FnZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWIxZDJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVjb3JlUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZTsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIERURFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgRFREUGFja2FnZSwKLSAqICAgICAgICAgIEVQYWNrYWdlIHt9Ci0gKi8KLXB1YmxpYyBjbGFzcyBEVERQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIERURFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbGVtZW50Q29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkR3JvdXBDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRBdHRyaWJ1dGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVtcHR5Q29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkQW55Q29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkcGNEYXRhQ29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRGaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRCYXNpY1R5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkTm90YXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVudGl0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRW50aXR5Q29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEludGVybmFsRW50aXR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZENvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZHRkT2NjdXJyZW5jZVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBkdGREZWZhdWx0S2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGR0ZEJhc2ljVHlwZUtpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBkdGRFbnVtR3JvdXBLaW5kRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZHRkR3JvdXBLaW5kRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0geG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkKLQkgKiB0aGUgcGFja2FnZSBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljIGZhY3RvcnkKLQkgKiBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gb2YgdGhlCi0JICogcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLCBpZiBvbmUgYWxyZWFkeSBleGlzdHMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRFREUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIERUREZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvLyBwdWJsaWMgRFREUGFja2FnZUltcGwoKQotCS8vIHsKLQkvLyBzdXBlcihlTlNfVVJJKTsKLQkvLyBpbml0aWFsaXplUGFja2FnZShudWxsKTsKLQkvLyB9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwKLQkgKiBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiBTaW1wbGUgZGVwZW5kZW5jaWVzIGFyZQotCSAqIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbCBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nCi0JICogYW55dGhpbmcgZWxzZS4gVGhpcyBtZXRob2QgZHJpdmVzIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudAotCSAqIHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbCB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPgotCSAqIE9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2ggaGF2ZSBub3QKLQkgKiB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQgYW5kCi0JICogcmVnaXN0ZXJlZC4gVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczogbWV0YS1tb2RlbAotCSAqIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueSBhcmUgaW5pdGlhbGl6ZWQsCi0JICogc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+Ci0JICogSW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFREUGFja2FnZSBpbml0KCkgewotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlIGFuZCBpbnRlcmRlcGVuZGVuY2llcwotCQlEVERQYWNrYWdlSW1wbCB0aGVEVERQYWNrYWdlID0gKERURFBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgRFREUGFja2FnZUltcGwoKSk7Ci0JCUVjb3JlUGFja2FnZUltcGwgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZUltcGwpIChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoRWNvcmVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoRWNvcmVQYWNrYWdlLmVOU19VUkkpIDogRWNvcmVQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gU3RlcCAxOiBjcmVhdGUgbWV0YS1tb2RlbCBvYmplY3RzCi0JCXRoZURURFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjb3JlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBTdGVwIDI6IGNvbXBsZXRlIGluaXRpYWxpemF0aW9uCi0JCXRoZURURFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY29yZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCXJldHVybiB0aGVEVERQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVsZW1lbnRDb250ZW50KCkgewotCQlyZXR1cm4gZHRkRWxlbWVudENvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVsZW1lbnRDb250ZW50X0dyb3VwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVsZW1lbnRDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbGVtZW50Q29udGVudF9FbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVsZW1lbnRDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREdyb3VwQ29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEdyb3VwQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRER3JvdXBDb250ZW50X0dyb3VwS2luZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRHcm91cENvbnRlbnRFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREdyb3VwQ29udGVudF9Db250ZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEdyb3VwQ29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBkdGRBdHRyaWJ1dGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREF0dHJpYnV0ZV9Db21tZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEF0dHJpYnV0ZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRLaW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEF0dHJpYnV0ZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRWYWx1ZVN0cmluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9EVERFbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEF0dHJpYnV0ZUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbGVtZW50KCkgewotCQlyZXR1cm4gZHRkRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERWxlbWVudF9Db21tZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEVsZW1lbnRFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVsZW1lbnRfQ29udGVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbGVtZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbGVtZW50X0RUREF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbGVtZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVtcHR5Q29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEVtcHR5Q29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERBbnlDb250ZW50KCkgewotCQlyZXR1cm4gZHRkQW55Q29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERQQ0RhdGFDb250ZW50KCkgewotCQlyZXR1cm4gZHRkcGNEYXRhQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudF9SZWZlcmVuY2VkRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERSZXBlYXRhYmxlQ29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERSZXBlYXRhYmxlQ29udGVudF9PY2N1cnJlbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREZpbGUoKSB7Ci0JCXJldHVybiBkdGRGaWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERGaWxlX0NvbW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRmlsZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERmlsZV9QYXJzZUVycm9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEZpbGVFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREZpbGVfRFREQ29udGVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRGaWxlRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERGaWxlX0RUREVudW1lcmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRGaWxlRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREJhc2ljVHlwZSgpIHsKLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFREQmFzaWNUeXBlX0tpbmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkQmFzaWNUeXBlRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVudW1lcmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERW51bWVyYXRpb25UeXBlX0tpbmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnVtZXJhdGlvblR5cGVfRFRERmlsZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRETm90YXRpb24oKSB7Ci0JCXJldHVybiBkdGROb3RhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRETm90YXRpb25fQ29tbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGROb3RhdGlvbkVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRETm90YXRpb25fU3lzdGVtSUQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkTm90YXRpb25FQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERURE5vdGF0aW9uX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZE5vdGF0aW9uRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVEROb3RhdGlvbl9FbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkTm90YXRpb25FQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERW50aXR5KCkgewotCQlyZXR1cm4gZHRkRW50aXR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERFbnRpdHlfQ29tbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRW50aXR5RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfQ29udGVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVudGl0eUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0VudGl0eVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudGl0eV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVudGl0eUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW50aXR5RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVudGl0eUNvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRFbnRpdHlDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnRpdHlDb250ZW50X0RUREVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREV4dGVybmFsRW50aXR5KCkgewotCQlyZXR1cm4gZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREV4dGVybmFsRW50aXR5X1N5c3RlbUlEKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERFeHRlcm5hbEVudGl0eV9QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRFeHRlcm5hbEVudGl0eUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfTm90YXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREV4dGVybmFsRW50aXR5X0VudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRESW50ZXJuYWxFbnRpdHkoKSB7Ci0JCXJldHVybiBkdGRJbnRlcm5hbEVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRESW50ZXJuYWxFbnRpdHlfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkSW50ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCkgewotCQlyZXR1cm4gZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudF9FbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERURENvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERDb250ZW50X0RUREZpbGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkQ29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERURE9jY3VycmVuY2VUeXBlKCkgewotCQlyZXR1cm4gZHRkT2NjdXJyZW5jZVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERURERlZmF1bHRLaW5kKCkgewotCQlyZXR1cm4gZHRkRGVmYXVsdEtpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERUREJhc2ljVHlwZUtpbmQoKSB7Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXREVERFbnVtR3JvdXBLaW5kKCkgewotCQlyZXR1cm4gZHRkRW51bUdyb3VwS2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0RFRER3JvdXBLaW5kKCkgewotCQlyZXR1cm4gZHRkR3JvdXBLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRYTUxTY2hlbWFEZWZpbmVkVHlwZSgpIHsKLQkJcmV0dXJuIHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERGYWN0b3J5IGdldERUREZhY3RvcnkoKSB7Ci0JCXJldHVybiAoRFRERmFjdG9yeSkgZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiBUaGlzIG1ldGhvZCBpcyBndWFyZGVkCi0JICogdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKQotCQkJcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlkdGRFbGVtZW50Q29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRUxFTUVOVF9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbGVtZW50Q29udGVudEVDbGFzcywgRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVsZW1lbnRDb250ZW50RUNsYXNzLCBEVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UKTsKLQotCQlkdGRHcm91cENvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0dST1VQX0NPTlRFTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEdyb3VwQ29udGVudEVDbGFzcywgRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEdyb3VwQ29udGVudEVDbGFzcywgRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQpOwotCi0JCWR0ZEF0dHJpYnV0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfQVRUUklCVVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0NPTU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEF0dHJpYnV0ZUVDbGFzcywgRFREX0FUVFJJQlVURV9fREVGQVVMVF9LSU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfU1RSSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UKTsKLQotCQlkdGRFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRFbGVtZW50RUNsYXNzLCBEVERfRUxFTUVOVF9fQ09NTUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRWxlbWVudEVDbGFzcywgRFREX0VMRU1FTlRfX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVsZW1lbnRFQ2xhc3MsIERURF9FTEVNRU5UX19EVERfQVRUUklCVVRFKTsKLQotCQlkdGRFbXB0eUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VNUFRZX0NPTlRFTlQpOwotCi0JCWR0ZEFueUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0FOWV9DT05URU5UKTsKLQotCQlkdGRwY0RhdGFDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9QQ19EQVRBX0NPTlRFTlQpOwotCi0JCWR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzcywgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX1JFRkVSRU5DRURfRUxFTUVOVCk7Ci0KLQkJZHRkUmVwZWF0YWJsZUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX1JFUEVBVEFCTEVfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkUmVwZWF0YWJsZUNvbnRlbnRFQ2xhc3MsIERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UpOwotCi0JCWR0ZEZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0ZJTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEZpbGVFQ2xhc3MsIERURF9GSUxFX19DT01NRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRGaWxlRUNsYXNzLCBEVERfRklMRV9fUEFSU0VfRVJST1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEZpbGVFQ2xhc3MsIERURF9GSUxFX19EVERfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRmlsZUVDbGFzcywgRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFKTsKLQotCQlkdGRCYXNpY1R5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0JBU0lDX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEJhc2ljVHlwZUVDbGFzcywgRFREX0JBU0lDX1RZUEVfX0tJTkQpOwotCi0JCWR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRU5VTUVSQVRJT05fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLCBEVERfRU5VTUVSQVRJT05fVFlQRV9fS0lORCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLCBEVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUpOwotCi0JCWR0ZE5vdGF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9OT1RBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkTm90YXRpb25FQ2xhc3MsIERURF9OT1RBVElPTl9fQ09NTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkTm90YXRpb25FQ2xhc3MsIERURF9OT1RBVElPTl9fU1lTVEVNX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGROb3RhdGlvbkVDbGFzcywgRFREX05PVEFUSU9OX19QVUJMSUNfSUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZE5vdGF0aW9uRUNsYXNzLCBEVERfTk9UQVRJT05fX0VOVElUWSk7Ci0KLQkJZHRkRW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEVudGl0eUVDbGFzcywgRFREX0VOVElUWV9fQ09NTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRW50aXR5RUNsYXNzLCBEVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudGl0eUVDbGFzcywgRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudGl0eUVDbGFzcywgRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSk7Ci0KLQkJZHRkRW50aXR5Q29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRU5USVRZX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudGl0eUNvbnRlbnRFQ2xhc3MsIERURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSk7Ci0KLQkJZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VYVEVSTkFMX0VOVElUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MsIERURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MsIERURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MsIERURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFeHRlcm5hbEVudGl0eUVDbGFzcywgRFREX0VYVEVSTkFMX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRURfRlJPTV9BTk9USEVSX0ZJTEUpOwotCi0JCWR0ZEludGVybmFsRW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9JTlRFUk5BTF9FTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEludGVybmFsRW50aXR5RUNsYXNzLCBEVERfSU5URVJOQUxfRU5USVRZX19WQUxVRSk7Ci0KLQkJZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzLCBEVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSk7Ci0KLQkJZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50RUNsYXNzLCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZKTsKLQotCQlkdGRDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRDb250ZW50RUNsYXNzLCBEVERfQ09OVEVOVF9fRFREX0ZJTEUpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlkdGRPY2N1cnJlbmNlVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oRFREX09DQ1VSUkVOQ0VfVFlQRSk7Ci0JCWR0ZERlZmF1bHRLaW5kRUVudW0gPSBjcmVhdGVFRW51bShEVERfREVGQVVMVF9LSU5EKTsKLQkJZHRkQmFzaWNUeXBlS2luZEVFbnVtID0gY3JlYXRlRUVudW0oRFREX0JBU0lDX1RZUEVfS0lORCk7Ci0JCWR0ZEVudW1Hcm91cEtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKERURF9FTlVNX0dST1VQX0tJTkQpOwotCQlkdGRHcm91cEtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKERURF9HUk9VUF9LSU5EKTsKLQkJeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFhNTF9TQ0hFTUFfREVGSU5FRF9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkKLQkJCXJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlFY29yZVBhY2thZ2VJbXBsIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2VJbXBsKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlkdGRHcm91cENvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkJZHRkQXR0cmlidXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFQXR0cmlidXRlKCkpOwotCQlkdGRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFQ2xhc3MoKSk7Ci0JCWR0ZEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERDb250ZW50KCkpOwotCQlkdGRFbXB0eUNvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERFbGVtZW50Q29udGVudCgpKTsKLQkJZHRkQW55Q29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERUREVsZW1lbnRDb250ZW50KCkpOwotCQlkdGRwY0RhdGFDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnQoKSk7Ci0JCWR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKSk7Ci0JCWR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnQoKSk7Ci0JCWR0ZEJhc2ljVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RUNsYXNzKCkpOwotCQlkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVFbnVtKCkpOwotCQlkdGROb3RhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERURENvbnRlbnQoKSk7Ci0JCWR0ZEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERURENvbnRlbnQoKSk7Ci0JCWR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFRERW50aXR5Q29udGVudCgpKTsKLQkJZHRkSW50ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERFbnRpdHlDb250ZW50KCkpOwotCQlkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERDb250ZW50KCkpOwotCQlkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhkdGRFbGVtZW50Q29udGVudEVDbGFzcywgRFRERWxlbWVudENvbnRlbnQuY2xhc3MsICJEVERFbGVtZW50Q29udGVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbGVtZW50Q29udGVudF9Hcm91cCgpLCB0aGlzLmdldERUREdyb3VwQ29udGVudCgpLCB0aGlzLmdldERUREdyb3VwQ29udGVudF9Db250ZW50KCksICJncm91cCIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbGVtZW50Q29udGVudF9FbGVtZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudCgpLCB0aGlzLmdldERUREVsZW1lbnRfQ29udGVudCgpLCAiZWxlbWVudCIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkR3JvdXBDb250ZW50RUNsYXNzLCBEVERHcm91cENvbnRlbnQuY2xhc3MsICJEVERHcm91cENvbnRlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREdyb3VwQ29udGVudF9Hcm91cEtpbmQoKSwgdGhpcy5nZXREVERHcm91cEtpbmQoKSwgImdyb3VwS2luZCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRER3JvdXBDb250ZW50X0NvbnRlbnQoKSwgdGhpcy5nZXREVERFbGVtZW50Q29udGVudCgpLCB0aGlzLmdldERUREVsZW1lbnRDb250ZW50X0dyb3VwKCksICJjb250ZW50IiwgbnVsbCwgMSwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkQXR0cmlidXRlRUNsYXNzLCBEVERBdHRyaWJ1dGUuY2xhc3MsICJEVERBdHRyaWJ1dGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREF0dHJpYnV0ZV9Db21tZW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21tZW50IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERBdHRyaWJ1dGVfRGVmYXVsdEtpbmQoKSwgdGhpcy5nZXREVEREZWZhdWx0S2luZCgpLCAiZGVmYXVsdEtpbmQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREF0dHJpYnV0ZV9EZWZhdWx0VmFsdWVTdHJpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlZmF1bHRWYWx1ZVN0cmluZyIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5X0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSwgImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCksICJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERBdHRyaWJ1dGVfRFRERWxlbWVudCgpLCB0aGlzLmdldERUREVsZW1lbnQoKSwgdGhpcy5nZXREVERFbGVtZW50X0RUREF0dHJpYnV0ZSgpLCAiRFRERWxlbWVudCIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRWxlbWVudEVDbGFzcywgRFRERWxlbWVudC5jbGFzcywgIkRUREVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREVsZW1lbnRfQ29tbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29tbWVudCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERWxlbWVudF9Db250ZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnQoKSwgdGhpcy5nZXREVERFbGVtZW50Q29udGVudF9FbGVtZW50KCksICJjb250ZW50IiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVsZW1lbnRfRFREQXR0cmlidXRlKCksIHRoaXMuZ2V0RFREQXR0cmlidXRlKCksIHRoaXMuZ2V0RFREQXR0cmlidXRlX0RUREVsZW1lbnQoKSwgIkRUREF0dHJpYnV0ZSIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVtcHR5Q29udGVudEVDbGFzcywgRFRERW1wdHlDb250ZW50LmNsYXNzLCAiRFRERW1wdHlDb250ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkQW55Q29udGVudEVDbGFzcywgRFREQW55Q29udGVudC5jbGFzcywgIkRUREFueUNvbnRlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRwY0RhdGFDb250ZW50RUNsYXNzLCBEVERQQ0RhdGFDb250ZW50LmNsYXNzLCAiRFREUENEYXRhQ29udGVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzLCBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudC5jbGFzcywgIkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudF9SZWZlcmVuY2VkRWxlbWVudCgpLCB0aGlzLmdldERUREVsZW1lbnQoKSwgbnVsbCwgInJlZmVyZW5jZWRFbGVtZW50IiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRSZXBlYXRhYmxlQ29udGVudEVDbGFzcywgRFREUmVwZWF0YWJsZUNvbnRlbnQuY2xhc3MsICJEVERSZXBlYXRhYmxlQ29udGVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERSZXBlYXRhYmxlQ29udGVudF9PY2N1cnJlbmNlKCksIHRoaXMuZ2V0RFRET2NjdXJyZW5jZVR5cGUoKSwgIm9jY3VycmVuY2UiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRGaWxlRUNsYXNzLCBEVERGaWxlLmNsYXNzLCAiRFRERmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRERmlsZV9Db21tZW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21tZW50IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERGaWxlX1BhcnNlRXJyb3IoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwYXJzZUVycm9yIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERGaWxlX0RURENvbnRlbnQoKSwgdGhpcy5nZXREVERDb250ZW50KCksIHRoaXMuZ2V0RFREQ29udGVudF9EVERGaWxlKCksICJEVERDb250ZW50IiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERGaWxlX0RUREVudW1lcmF0aW9uVHlwZSgpLCB0aGlzLmdldERUREVudW1lcmF0aW9uVHlwZSgpLCB0aGlzLmdldERUREVudW1lcmF0aW9uVHlwZV9EVERGaWxlKCksICJEVERFbnVtZXJhdGlvblR5cGUiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRCYXNpY1R5cGVFQ2xhc3MsIERUREJhc2ljVHlwZS5jbGFzcywgIkRUREJhc2ljVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFREQmFzaWNUeXBlX0tpbmQoKSwgdGhpcy5nZXREVERCYXNpY1R5cGVLaW5kKCksICJraW5kIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLCBEVERFbnVtZXJhdGlvblR5cGUuY2xhc3MsICJEVERFbnVtZXJhdGlvblR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREVudW1lcmF0aW9uVHlwZV9LaW5kKCksIHRoaXMuZ2V0RFRERW51bUdyb3VwS2luZCgpLCAia2luZCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW51bWVyYXRpb25UeXBlX0RUREZpbGUoKSwgdGhpcy5nZXREVERGaWxlKCksIHRoaXMuZ2V0RFRERmlsZV9EVERFbnVtZXJhdGlvblR5cGUoKSwgIkRUREZpbGUiLCBudWxsLCAwLCAxLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZE5vdGF0aW9uRUNsYXNzLCBEVEROb3RhdGlvbi5jbGFzcywgIkRURE5vdGF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVEROb3RhdGlvbl9Db21tZW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21tZW50IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic3lzdGVtSUQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERURE5vdGF0aW9uX1B1YmxpY0lEKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwdWJsaWNJRCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRETm90YXRpb25fRW50aXR5KCksIHRoaXMuZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKSwgdGhpcy5nZXREVERFeHRlcm5hbEVudGl0eV9Ob3RhdGlvbigpLCAiZW50aXR5IiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRW50aXR5RUNsYXNzLCBEVERFbnRpdHkuY2xhc3MsICJEVERFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREVudGl0eV9Db21tZW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21tZW50IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicGFyYW1ldGVyRW50aXR5IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlfQ29udGVudCgpLCB0aGlzLmdldERUREVudGl0eUNvbnRlbnQoKSwgdGhpcy5nZXREVERFbnRpdHlDb250ZW50X0RUREVudGl0eSgpLCAiY29udGVudCIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpLCB0aGlzLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLCB0aGlzLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSwgInBhcm1FbnRpdHlSZWYiLCBudWxsLCAxLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW50aXR5X0VudGl0eVJlZmVyZW5jZSgpLCB0aGlzLmdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKSwgdGhpcy5nZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50X0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCksICJlbnRpdHlSZWZlcmVuY2UiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudGl0eV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCksIHRoaXMuZ2V0RFREQXR0cmlidXRlKCksIHRoaXMuZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCksICJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlfQXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLCB0aGlzLmdldERUREF0dHJpYnV0ZSgpLCB0aGlzLmdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpLCAiYXR0cmlidXRlVHlwZVJlZmVyZW5jZSIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVudGl0eUNvbnRlbnRFQ2xhc3MsIERUREVudGl0eUNvbnRlbnQuY2xhc3MsICJEVERFbnRpdHlDb250ZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudGl0eUNvbnRlbnRfRFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5X0NvbnRlbnQoKSwgIkRUREVudGl0eSIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MsIERUREV4dGVybmFsRW50aXR5LmNsYXNzLCAiRFRERXh0ZXJuYWxFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREV4dGVybmFsRW50aXR5X1N5c3RlbUlEKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzeXN0ZW1JRCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRERXh0ZXJuYWxFbnRpdHlfUHVibGljSUQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInB1YmxpY0lEIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFeHRlcm5hbEVudGl0eV9Ob3RhdGlvbigpLCB0aGlzLmdldERURE5vdGF0aW9uKCksIHRoaXMuZ2V0RFRETm90YXRpb25fRW50aXR5KCksICJub3RhdGlvbiIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFeHRlcm5hbEVudGl0eV9FbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCksIHRoaXMuZ2V0RFRERmlsZSgpLCBudWxsLCAiZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkSW50ZXJuYWxFbnRpdHlFQ2xhc3MsIERUREludGVybmFsRW50aXR5LmNsYXNzLCAiRFRESW50ZXJuYWxFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREludGVybmFsRW50aXR5X1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUVDbGFzcywgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmNsYXNzLCAiRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSwgImVudGl0eSIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzcywgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudC5jbGFzcywgIkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRfRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHlfRW50aXR5UmVmZXJlbmNlKCksICJlbGVtZW50UmVmZXJlbmNlZEVudGl0eSIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkQ29udGVudEVDbGFzcywgRFREQ29udGVudC5jbGFzcywgIkRURENvbnRlbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFREQ29udGVudF9EVERGaWxlKCksIHRoaXMuZ2V0RFRERmlsZSgpLCB0aGlzLmdldERUREZpbGVfRFREQ29udGVudCgpLCAiRFRERmlsZSIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShkdGRPY2N1cnJlbmNlVHlwZUVFbnVtLCBEVERPY2N1cnJlbmNlVHlwZS5jbGFzcywgIkRURE9jY3VycmVuY2VUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZE9jY3VycmVuY2VUeXBlRUVudW0sIERURE9jY3VycmVuY2VUeXBlLk9ORV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZE9jY3VycmVuY2VUeXBlRUVudW0sIERURE9jY3VycmVuY2VUeXBlLk9QVElPTkFMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkT2NjdXJyZW5jZVR5cGVFRW51bSwgRFRET2NjdXJyZW5jZVR5cGUuT05FX09SX01PUkVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRPY2N1cnJlbmNlVHlwZUVFbnVtLCBEVERPY2N1cnJlbmNlVHlwZS5aRVJPX09SX01PUkVfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGR0ZERlZmF1bHRLaW5kRUVudW0sIERURERlZmF1bHRLaW5kLmNsYXNzLCAiRFRERGVmYXVsdEtpbmQiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoZHRkRGVmYXVsdEtpbmRFRW51bSwgRFRERGVmYXVsdEtpbmQuSU1QTElFRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZERlZmF1bHRLaW5kRUVudW0sIERURERlZmF1bHRLaW5kLlJFUVVJUkVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkRGVmYXVsdEtpbmRFRW51bSwgRFRERGVmYXVsdEtpbmQuRklYRURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGREZWZhdWx0S2luZEVFbnVtLCBEVEREZWZhdWx0S2luZC5OT0ZJWEVEX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuY2xhc3MsICJEVERCYXNpY1R5cGVLaW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5OT05FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLkNEQVRBX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLklEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLklEUkVGX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLklEUkVGU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5FTlRJVFlfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuRU5USVRJRVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOU19MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oZHRkRW51bUdyb3VwS2luZEVFbnVtLCBEVERFbnVtR3JvdXBLaW5kLmNsYXNzLCAiRFRERW51bUdyb3VwS2luZCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChkdGRFbnVtR3JvdXBLaW5kRUVudW0sIERUREVudW1Hcm91cEtpbmQuTkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEVudW1Hcm91cEtpbmRFRW51bSwgRFRERW51bUdyb3VwS2luZC5OT1RBVElPTl9HUk9VUF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oZHRkR3JvdXBLaW5kRUVudW0sIERUREdyb3VwS2luZC5jbGFzcywgIkRUREdyb3VwS2luZCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChkdGRHcm91cEtpbmRFRW51bSwgRFRER3JvdXBLaW5kLlNFUVVFTkNFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkR3JvdXBLaW5kRUVudW0sIERUREdyb3VwS2luZC5DSE9JQ0VfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLmNsYXNzLCAiWE1MU2NoZW1hRGVmaW5lZFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuTk9ORV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLlNUUklOR19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLkJPT0xFQU5fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5GTE9BVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLkRPVUJMRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLkRFQ0lNQUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5USU1FSU5TVEFOVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLlRJTUVEVVJBVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLlJFQ1VSUklOR0lOU1RBTlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5CSU5BUllfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5VUklfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5JTlRFR0VSX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuREFURV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLlRJTUVfTElURVJBTCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotCi19IC8vIERURFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThmZDFjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsIGV4dGVuZHMgRFREQ29udGVudEltcGwgaW1wbGVtZW50cyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UsIEVOYW1lZEVsZW1lbnQsIERURENvbnRlbnQgewotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlEVERFbnRpdHkgZW50aXR5ID0gZ2V0RW50aXR5KCk7Ci0JCWlmIChlbnRpdHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVudGl0eSgpLmdldE5hbWUoKTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiUEVudCIsIGdldE5hbWUoKSwgLTEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5KCkgPGVtPkVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERUREVudGl0eSBlbnRpdHkgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGdldEVudGl0eSgpIHsKLQkJaWYgKGVudGl0eSAhPSBudWxsICYmIGVudGl0eS5lSXNQcm94eSgpKSB7Ci0JCQlEVERFbnRpdHkgb2xkRW50aXR5ID0gZW50aXR5OwotCQkJZW50aXR5ID0gKERUREVudGl0eSkgRWNvcmVVdGlsLnJlc29sdmUoZW50aXR5LCB0aGlzKTsKLQkJCWlmIChlbnRpdHkgIT0gb2xkRW50aXR5KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSwgb2xkRW50aXR5LCBlbnRpdHkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGJhc2ljR2V0RW50aXR5KCkgewotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFbnRpdHkoRFRERW50aXR5IG5ld0VudGl0eSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERFbnRpdHkgb2xkRW50aXR5ID0gZW50aXR5OwotCQllbnRpdHkgPSBuZXdFbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBvbGRFbnRpdHksIG5ld0VudGl0eSkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRpdHkoRFRERW50aXR5IG5ld0VudGl0eSkgewotCQlpZiAobmV3RW50aXR5ICE9IGVudGl0eSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBlbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0VudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEVudGl0eShuZXdFbnRpdHksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBuZXdFbnRpdHksIG5ld0VudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkgOgotCQkJCQlpZiAoZW50aXR5ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldEVudGl0eSgoRFRERW50aXR5KSBvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZIDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RW50aXR5KG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKCkpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5ULCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlEKCksIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRFbnRpdHkoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFbnRpdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkgOgotCQkJCXNldEVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZIDoKLQkJCQlzZXRFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGVudGl0eSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy8gRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbAotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLyAvL3B1YmxpYyBjbGFzcyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsIGV4dGVuZHMgRU5hbWVzcGFjZUltcGwKLS8vIGltcGxlbWVudHMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLCBFTmFtZXNwYWNlLCBEVERDb250ZW50ewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBEVERFbnRpdHkgZW50aXR5ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRFbnRpdHkgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcml2YXRlIERURENvbnRlbnRJbXBsIGR0ZENvbnRlbnREZWxlZ2F0ZSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVPYmplY3QgaW5pdEluc3RhbmNlKCkgewotLy8gc2V0RU1ldGFPYmooZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkpOwotLy8gaW5pdEluc3RhbmNlRGVsZWdhdGVzKCk7Ci0vLyByZXR1cm4gdGhpczsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgdm9pZCBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKSB7Ci0vLyBzdXBlci5pbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vCi0KLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnJlZlNldERlbGVnYXRlT3duZXIodGhpcyk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERURFBhY2thZ2UgZVBhY2thZ2VEVEQoKSB7Ci0vLyByZXR1cm4KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSB7Ci0vLyByZXR1cm4KLS8vICgoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpKS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBEVERFbnRpdHkgZ2V0RW50aXR5KCkgewotLy8gdHJ5IHsKLS8vIGlmICh0aGlzLmVudGl0eSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLS8vIHRoaXMuZW50aXR5ID0gKERUREVudGl0eSkgKChJbnRlcm5hbEVPYmplY3QpdGhpcy5lbnRpdHkpLnJlc29sdmUodGhpcywKLS8vIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSk7Ci0vLyBpZiAodGhpcy5lbnRpdHk9PW51bGwpIHRoaXMuc2V0RW50aXR5ID0gZmFsc2U7Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHk7Ci0vLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIG51bGw7Ci0vLyB9Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0RW50aXR5KERUREVudGl0eSBsKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNWUmVmZXJlbmNlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSx0aGlzLmVudGl0eSxsKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldEVudGl0eSgpIHsKLS8vIHJlZlVuc2V0VmFsdWVGb3JTVlJlZmVyZW5jZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksdGhpcy5lbnRpdHkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0RW50aXR5KCkgewotLy8gcmV0dXJuIHNldEVudGl0eTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogcmV0dXJuIGdldEVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEU6IHJldHVybgotLy8gZ2V0RFRERmlsZSgpOwotLy8KLQotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCByZWZCYXNpY1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFk6Ci0vLyBpZiAoIXRoaXMuc2V0RW50aXR5fHx0aGlzLmVudGl0eT09bnVsbCkgcmV0dXJuIG51bGw7Ci0vLyBpZiAoKChJbnRlcm5hbEVPYmplY3QpdGhpcy5lbnRpdHkpLnJlZklzRGVsZXRlZCgpKSB7dGhpcy5lbnRpdHk9bnVsbDsKLS8vIHRoaXMuc2V0RW50aXR5PWZhbHNlO30KLS8vIHJldHVybiB0aGlzLmVudGl0eTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFOiByZXR1cm4KLS8vICgoSW50ZXJuYWxFT2JqZWN0KWdldER0ZENvbnRlbnREZWxlZ2F0ZSgpKS5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8KLQotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogcmV0dXJuCi0vLyBpc1NldEVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEU6IHJldHVybgotLy8gaXNTZXREVERGaWxlKCk7Ci0vLwotCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZOiB7Ci0vLyBzZXRFbnRpdHkoKERUREVudGl0eSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRTogewotLy8gc2V0RFRERmlsZSgoRFRERmlsZSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotCi0vLyB9Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIGVCYXNpY1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotLy8gewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmVudGl0eTsKLS8vIHRoaXMuZW50aXR5ID0gKERUREVudGl0eSluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0RW50aXR5ID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vCi0KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogewotLy8gdW5zZXRFbnRpdHkoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFOiB7Ci0vLyB1bnNldERUREZpbGUoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vCi0KLS8vIH0KLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIHJlZkJhc2ljVW5zZXRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFk6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZW50aXR5OwotLy8gdGhpcy5lbnRpdHkgPSBudWxsOwotLy8gdGhpcy5zZXRFbnRpdHkgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksb2xkVmFsdWUsbnVsbCk7Ci0vLyB9Ci0vLwotCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNVbnNldFZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBEVERDb250ZW50SW1wbCBnZXREdGRDb250ZW50RGVsZWdhdGUoKSB7Ci0vLyBpZiAoZHRkQ29udGVudERlbGVnYXRlID09IG51bGwpIHsKLS8vIERURFBhY2thZ2UgcGtnID0KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyBkdGRDb250ZW50RGVsZWdhdGU9KERURENvbnRlbnRJbXBsKXBrZy5lQ3JlYXRlSW5zdGFuY2UocGtnLkRURF9DT05URU5UKTsKLS8vIGR0ZENvbnRlbnREZWxlZ2F0ZS5pbml0SW5zdGFuY2UoKTsKLS8vIH0KLS8vIHJldHVybiBkdGRDb250ZW50RGVsZWdhdGU7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVERDb250ZW50KCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmVDbGFzcygpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuZ2V0RFRERmlsZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSB2YWx1ZSkgewotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuc2V0RFRERmlsZSh2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXREVERGaWxlKCkgewotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkudW5zZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXREVERGaWxlKCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmlzU2V0RFRERmlsZSgpOwotLy8gfQotLy8gfQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFJlcGVhdGFibGVDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFJlcGVhdGFibGVDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWQ4ZGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERSZXBlYXRhYmxlQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERURFJlcGVhdGFibGVDb250ZW50SW1wbCBleHRlbmRzIERUREVsZW1lbnRDb250ZW50SW1wbCBpbXBsZW1lbnRzIERURFJlcGVhdGFibGVDb250ZW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2NjdXJyZW5jZSgpIDxlbT5PY2N1cnJlbmNlPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0T2NjdXJyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZSBPQ0NVUlJFTkNFX0VERUZBVUxUID0gRFRET2NjdXJyZW5jZVR5cGUuT05FX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZSA9IE9DQ1VSUkVOQ0VfRURFRkFVTFQ7Ci0KLQlwdWJsaWMgRFREUmVwZWF0YWJsZUNvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFJlcGVhdGFibGVDb250ZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDEyOCk7Ci0JCWlmIChnZXRPY2N1cnJlbmNlKCkuZ2V0VmFsdWUoKSAhPSBEVERPY2N1cnJlbmNlVHlwZS5PTkUpIHsKLQkJCWlmICh0aGlzIGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgewotCQkJCXNiLmFwcGVuZCgiKCIpLmFwcGVuZCh1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSkuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkJCX0KLQotCQkJLy8gTU9GMkVNRiBQb3J0Ci0JCQkvLyBFRW51bUxpdGVyYWwgbGl0ID0gZ2V0T2NjdXJyZW5jZSgpOwotCQkJRFRET2NjdXJyZW5jZVR5cGUgbGl0ID0gZ2V0T2NjdXJyZW5jZSgpOwotCQkJaWYgKGxpdCAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKChjaGFyKSBsaXQuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzYi5hcHBlbmQodW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiAgICAgICAgICAgIEpVU1RfT05FPSAtMSBPTkVfT1JfTU9SRT00MyBPUFRJT05BTD02MyBaRVJPX09SX01PUkU9NDIKLQkgKi8KLQlwdWJsaWMgRFRET2NjdXJyZW5jZVR5cGUgZ2V0T2NjdXJyZW5jZSgpIHsKLQkJcmV0dXJuIG9jY3VycmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9jY3VycmVuY2UoRFRET2NjdXJyZW5jZVR5cGUgbmV3T2NjdXJyZW5jZSkgewotCQlEVERPY2N1cnJlbmNlVHlwZSBvbGRPY2N1cnJlbmNlID0gb2NjdXJyZW5jZTsKLQkJb2NjdXJyZW5jZSA9IG5ld09jY3VycmVuY2UgPT0gbnVsbCA/IE9DQ1VSUkVOQ0VfRURFRkFVTFQgOiBuZXdPY2N1cnJlbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UsIG9sZE9jY3VycmVuY2UsIG9jY3VycmVuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKCkpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCgpLCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBnZXRPY2N1cnJlbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gb2NjdXJyZW5jZSAhPSBPQ0NVUlJFTkNFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJc2V0T2NjdXJyZW5jZSgoRFRET2NjdXJyZW5jZVR5cGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoT0NDVVJSRU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAob2NjdXJyZW5jZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChvY2N1cnJlbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIERURFJlcGVhdGFibGVDb250ZW50I3VucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpCi0JICovCi0JcHVibGljIFN0cmluZyB1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBEVERFbGVtZW50Q29udGVudCNnZXRDb250ZW50TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGFiNmI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotCi0KLQotcHVibGljIGNsYXNzIERUREFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRFREUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRFREQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gRFREUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERURFN3aXRjaCBtb2RlbFN3aXRjaCA9IG5ldyBEVERTd2l0Y2goKSB7Ci0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnRDb250ZW50KERUREVsZW1lbnRDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREVsZW1lbnRDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRER3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERHcm91cENvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERBdHRyaWJ1dGUoRFREQXR0cmlidXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREF0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnQoRFRERWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERW1wdHlDb250ZW50KERUREVtcHR5Q29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbXB0eUNvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERBbnlDb250ZW50KERUREFueUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFREQW55Q29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURURFBDRGF0YUNvbnRlbnQoRFREUENEYXRhQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERQQ0RhdGFDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERSZXBlYXRhYmxlQ29udGVudChEVERSZXBlYXRhYmxlQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERSZXBlYXRhYmxlQ29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREZpbGUoRFRERmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERGaWxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREQmFzaWNUeXBlKERUREJhc2ljVHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERCYXNpY1R5cGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbnVtZXJhdGlvblR5cGUoRFRERW51bWVyYXRpb25UeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREVudW1lcmF0aW9uVHlwZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURURE5vdGF0aW9uKERURE5vdGF0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURURE5vdGF0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERW50aXR5KERUREVudGl0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbnRpdHlBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbnRpdHlDb250ZW50KERUREVudGl0eUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERW50aXR5Q29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREV4dGVybmFsRW50aXR5KERUREV4dGVybmFsRW50aXR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREV4dGVybmFsRW50aXR5QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRESW50ZXJuYWxFbnRpdHkoRFRESW50ZXJuYWxFbnRpdHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRESW50ZXJuYWxFbnRpdHlBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREQ29udGVudChEVERDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURURENvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFTW9kZWxFbGVtZW50KEVNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVOYW1lZEVsZW1lbnQoRU5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRVR5cGVkRWxlbWVudChFVHlwZWRFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVUeXBlZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFQXR0cmlidXRlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRUNsYXNzaWZpZXIoRUNsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUNsYXNzaWZpZXJBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3MoRUNsYXNzIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVDbGFzc0FkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVEYXRhVHlwZShFRGF0YVR5cGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRURhdGFUeXBlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRUVudW0oRUVudW0gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUVudW1BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KSB0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlCi0JICogY2FzZXMuIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUKLQkgKiBjYXNlcyBhbnl3YXkuCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURURE5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVudGl0eUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFeHRlcm5hbEVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREludGVybmFsRW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURURFJlcGVhdGFibGVDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERWxlbWVudENvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFbXB0eUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUKLQkgKiBjYXNlcy4gSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZQotCSAqIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREFueUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERQQ0RhdGFDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRER3JvdXBDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREQXR0cmlidXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERW51bWVyYXRpb25UeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREQmFzaWNUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUNsYXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUF0dHJpYnV0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVFbnVtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVOYW1lZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFRGF0YVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRVR5cGVkRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVDbGFzc2lmaWVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vIERUREFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRETWV0cmljcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1ldHJpY3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExODhkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRETWV0cmljcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci0KLQotcHVibGljIGNsYXNzIERURE1ldHJpY3MgewotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZSBlbGVtZW50UmVmZXJlbmNlTWFwOwotCi0JcHVibGljIERURE1ldHJpY3MoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIEhhc2h0YWJsZSBnZXRFbGVtZW50UmVmZXJlbmNlcygpIHsKLQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VNYXAgPT0gbnVsbCkgewotCQkJZWxlbWVudFJlZmVyZW5jZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJCW5ldyBEVERWaXNpdG9yKCkgewotCi0JCQkJcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSBlbGVtZW50UmVmZXJlbmNlQ29udGVudC5nZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQkJCQlPYmplY3QgdmlzaXRhdGlvbiA9IGVsZW1lbnRSZWZlcmVuY2VNYXAuZ2V0KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAodmlzaXRhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQllbGVtZW50UmVmZXJlbmNlTWFwLnB1dChkdGRFbGVtZW50LCB2aXNpdGF0aW9uID0gbmV3IFZlY3RvcigpKTsKLQkJCQkJfQotCQkJCQkoKFZlY3RvcikgdmlzaXRhdGlvbikuYWRkRWxlbWVudChlbGVtZW50UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJfQotCQkJfS52aXNpdERUREZpbGUoZHRkRmlsZSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZU1hcDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVsZW1lbnRSZWZlcmVuY2VDb3VudChEVERFbGVtZW50IGR0ZEVsZW1lbnQpIHsKLQkJT2JqZWN0IGVsZW1lbnRSZWZlcmVuY2VzID0gZ2V0RWxlbWVudFJlZmVyZW5jZXMoKS5nZXQoZHRkRWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50UmVmZXJlbmNlcyA9PSBudWxsID8gMCA6ICgoVmVjdG9yKSBlbGVtZW50UmVmZXJlbmNlcykuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBEVERFbGVtZW50IGdldExlYXN0UmVmZXJlbmNlZEVsZW1lbnQoKSB7Ci0JCURUREVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGxvd2VzdFJlZmVyZW5jZUNvdW50ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgaS5uZXh0KCk7Ci0JCQlpbnQgY291bnQgPSBnZXRFbGVtZW50UmVmZXJlbmNlQ291bnQoZWxlbWVudCk7Ci0JCQlpZiAoY291bnQgPCBsb3dlc3RSZWZlcmVuY2VDb3VudCkgewotCQkJCXJlc3VsdCA9IGVsZW1lbnQ7Ci0JCQkJbG93ZXN0UmVmZXJlbmNlQ291bnQgPSBjb3VudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIYXNodGFibGUgZ2V0RWxlbWVudFJlZmVyZW5jZXNHZW4oKSB7Ci0KLQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VNYXAgPT0gbnVsbCkgewotCQkJZWxlbWVudFJlZmVyZW5jZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJCW5ldyBEVERWaXNpdG9yKCkgewotCi0JCQkJcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSBlbGVtZW50UmVmZXJlbmNlQ29udGVudC5nZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQkJCQlPYmplY3QgdmlzaXRhdGlvbiA9IGVsZW1lbnRSZWZlcmVuY2VNYXAuZ2V0KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAodmlzaXRhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQllbGVtZW50UmVmZXJlbmNlTWFwLnB1dChkdGRFbGVtZW50LCB2aXNpdGF0aW9uID0gbmV3IFZlY3RvcigpKTsKLQkJCQkJfQotCQkJCQkoKFZlY3RvcikgdmlzaXRhdGlvbikuYWRkRWxlbWVudChlbGVtZW50UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJfQotCQkJfS52aXNpdERUREZpbGUoZHRkRmlsZSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRFbGVtZW50UmVmZXJlbmNlQ291bnRHZW4oRFRERWxlbWVudCBkdGRFbGVtZW50KSB7Ci0KLQkJT2JqZWN0IGVsZW1lbnRSZWZlcmVuY2VzID0gZ2V0RWxlbWVudFJlZmVyZW5jZXMoKS5nZXQoZHRkRWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50UmVmZXJlbmNlcyA9PSBudWxsID8gMCA6ICgoVmVjdG9yKSBlbGVtZW50UmVmZXJlbmNlcykuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRERWxlbWVudCBnZXRMZWFzdFJlZmVyZW5jZWRFbGVtZW50R2VuKCkgewotCi0JCURUREVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGxvd2VzdFJlZmVyZW5jZUNvdW50ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgaS5uZXh0KCk7Ci0JCQlpbnQgY291bnQgPSBnZXRFbGVtZW50UmVmZXJlbmNlQ291bnQoZWxlbWVudCk7Ci0JCQlpZiAoY291bnQgPCBsb3dlc3RSZWZlcmVuY2VDb3VudCkgewotCQkJCXJlc3VsdCA9IGVsZW1lbnQ7Ci0JCQkJbG93ZXN0UmVmZXJlbmNlQ291bnQgPSBjb3VudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1vZGVsQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1vZGVsQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTdlOTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERNb2RlbEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGwuRFRERmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5BdHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQXR0bGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5DTU5vZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01SZWZlcmVuY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01SZXBlYXRhYmxlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkRURFNheEFydGlmYWN0VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkVsZW1lbnREZWNsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuRW50aXR5RGVjbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkVycm9yTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLk5vdGF0aW9uRGVjbDsKLQotcHVibGljIGNsYXNzIERURE1vZGVsQnVpbGRlciBleHRlbmRzIERURFNheEFydGlmYWN0VmlzaXRvciB7Ci0JRFREIGR0ZDsKLQlEVERVdGlsIGR0ZFV0aWw7Ci0JRFRERmlsZSBkdGRGaWxlOwotCVJlc291cmNlU2V0IHJlc291cmNlczsKLQotCXB1YmxpYyBEVERNb2RlbEJ1aWxkZXIoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBEVERVdGlsIGR0ZFV0aWwsIERURCBkdGQsIERUREZpbGUgZHRkRmlsZSkgewotCQl0aGlzLnJlc291cmNlcyA9IHJlc291cmNlczsKLQkJdGhpcy5kdGRVdGlsID0gZHRkVXRpbDsKLQkJdGhpcy5kdGQgPSBkdGQ7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIERUREZhY3RvcnlJbXBsIGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoRFRERmFjdG9yeUltcGwpIGR0ZFV0aWwuZ2V0RmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCXJldHVybiBkdGRGaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREKERURCBkdGQpIHsKLQkJc3VwZXIudmlzaXREVEQoZHRkKTsKLQotCQkvLyAtIDJuZCBwYXNzIC0KLQkJLy8gZG8gZmluYWwgcHJvY2Vzc2luZyBmb3IgQXR0bGlzdHMgYW5kIGFkZGluZyBjb250ZW50TW9kZWwKLQkJYWRkQXR0bGlzdEFuZENvbnRlbnRNb2RlbChkdGQsIGR0ZEZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2woRWxlbWVudERlY2wgZWxlbWVudCkgewotCQkvLyBFbGVtZW50IG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZAotCQlTdHJpbmcgZGVjbE5hbWUgPSBlbGVtZW50LmdldE5vZGVOYW1lKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigicHJvY2VzcyBFbGVtZW50RGVjbDoiICsgZGVjbE5hbWUgKTsKLQkJRFRERWxlbWVudCBkdGRlbGVtZW50ID0gKERUREVsZW1lbnQpIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoZGVjbE5hbWUpOwotCQlpZiAoZHRkZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInByb2Nlc3MgRWxlbWVudERlY2wgLSBub3QgZm91bmQgLSBjcmVhdGUiCi0JCQkvLyApOwotCQkJZHRkZWxlbWVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JCQlkdGRlbGVtZW50LnNldE5hbWUoZGVjbE5hbWUpOwotCQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkZWxlbWVudCk7Ci0JCQlkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkucHV0KGRlY2xOYW1lLCBkdGRlbGVtZW50KTsKLQkJfQotCi0JCXN1cGVyLnZpc2l0RWxlbWVudERlY2woZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXROb3RhdGlvbkRlY2woTm90YXRpb25EZWNsIG5vdGF0aW9uKSB7Ci0JCS8vIE5vdGF0aW9uIG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZAotCQkvLyBieSBhbiBlbnRpdHkKLQkJRFRETm90YXRpb24gZHRkbm90ID0gZHRkRmlsZS5maW5kTm90YXRpb24obm90YXRpb24uZ2V0Tm9kZU5hbWUoKSk7Ci0JCWlmIChkdGRub3QgPT0gbnVsbCkgewotCQkJZHRkbm90ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURURE5vdGF0aW9uKCk7Ci0JCQlkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChkdGRub3QpOwotCQl9Ci0JCWR0ZG5vdC5zZXROYW1lKG5vdGF0aW9uLmdldE5vZGVOYW1lKCkpOwotCi0JCWlmIChub3RhdGlvbi5nZXRTeXN0ZW1JZCgpICE9IG51bGwpCi0JCQlkdGRub3Quc2V0U3lzdGVtSUQobm90YXRpb24uZ2V0U3lzdGVtSWQoKSk7Ci0JCWlmIChub3RhdGlvbi5nZXRQdWJsaWNJZCgpICE9IG51bGwpCi0JCQlkdGRub3Quc2V0UHVibGljSUQobm90YXRpb24uZ2V0UHVibGljSWQoKSk7Ci0KLQkJaWYgKG5vdGF0aW9uLmdldENvbW1lbnQoKSAhPSBudWxsKQotCQkJZHRkbm90LnNldENvbW1lbnQobm90YXRpb24uZ2V0Q29tbWVudCgpKTsKLQkJaWYgKG5vdGF0aW9uLmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWFkZEVycm9yTWVzc2FnZShub3RhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkbm90KTsKLQkJfQotCi0JCXN1cGVyLnZpc2l0Tm90YXRpb25EZWNsKG5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkJLy8gVGhpcyBpcyBhIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlLgotCQkvLyBBZGQgdGhlIGxpbmsgdG8gdGhlIHJlYWwgZW50aXR5IHRoYXQgaXQgcmVmZXJlbmNlcwotCQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudFJlZiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQocGFybUVudFJlZik7Ci0KLQkJU3RyaW5nIGVudGl0eU5hbWUgPSBlbnRpdHkuZ2V0Tm9kZU5hbWUoKTsKLQotCQkvLyBBZGQgdGhlIHJlZmVyZW5jZSB0byB0aGUgRFRERW50aXR5Ci0JCURUREVudGl0eSBkdGRlbnRpdHkgPSBnZXREVERGaWxlKCkuZmluZEVudGl0eShlbnRpdHlOYW1lKTsKLQkJaWYgKGR0ZGVudGl0eSAhPSBudWxsKSB7Ci0JCQlwYXJtRW50UmVmLnNldEVudGl0eShkdGRlbnRpdHkpOwotCQl9Ci0JCWlmIChlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJYWRkRXJyb3JNZXNzYWdlKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkZW50aXR5KTsKLQkJfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBQRSByZWZlcmVuY2U6ICIgKyBkZWNsTmFtZSk7Ci0KLQkJc3VwZXIudmlzaXRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VEZWNsKGVudGl0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFeHRlcm5hbEVudGl0eURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkJRFRERW50aXR5IGR0ZEVudGl0eSA9IGNyZWF0ZURUREVudGl0eShlbnRpdHkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBlbnRpdHk6ICIgKyBkZWNsTmFtZSk7Ci0JCURUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFeHRlcm5hbEVudGl0eSgpOwotCQlkdGRFbnRpdHkuc2V0Q29udGVudChleHRFbnRpdHkpOwotCi0JCWZpbmlzaEV4dGVybmFsRW50aXR5KGV4dEVudGl0eSwgZW50aXR5KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZXh0IGVudGl0eSB0b01vZjogIiApOwotCQlpZiAoZHRkRW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpIHsKLQotCQkJZHRkVXRpbC5nZXRQRVBvb2woKS5wdXQoIiUiICsgZW50aXR5LmdldE5vZGVOYW1lKCkgKyAiOyIsIGR0ZEVudGl0eSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJc3VwZXIudmlzaXRFeHRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEludGVybmFsRW50aXR5RGVjbChFbnRpdHlEZWNsIGVudGl0eSkgewotCQlEVERFbnRpdHkgZHRkRW50aXR5ID0gY3JlYXRlRFRERW50aXR5KGVudGl0eSk7Ci0KLQkJRFRESW50ZXJuYWxFbnRpdHkgaW50RW50aXR5ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREludGVybmFsRW50aXR5KCk7Ci0JCWR0ZEVudGl0eS5zZXRDb250ZW50KGludEVudGl0eSk7Ci0JCWludEVudGl0eS5zZXRWYWx1ZShlbnRpdHkuZ2V0VmFsdWUoKSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGludCBlbnRpdHkgdG9Nb2Y6ICIgKTsKLQkJaWYgKGR0ZEVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQlkdGRVdGlsLmdldFBFUG9vbCgpLnB1dCgiJSIgKyBlbnRpdHkuZ2V0Tm9kZU5hbWUoKSArICI7IiwgZHRkRW50aXR5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlzdXBlci52aXNpdEludGVybmFsRW50aXR5RGVjbChlbnRpdHkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBdHRsaXN0QW5kQ29udGVudE1vZGVsKERURCBkdGQsIERUREZpbGUgZEZpbGUpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhZGRBdHRMaXN0QW5kQ290ZW50TW9kZWwgLSBkdGQ6IiArCi0JCS8vIGR0ZC5nZXROYW1lKCkpOwotCQlFbnVtZXJhdGlvbiBlbiA9IGR0ZC5leHRlcm5hbEVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IGUgPSBlbi5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBFbGVtZW50RGVjbCkgewotCQkJCURUREVsZW1lbnQgZHRkZWxlbWVudCA9IChEVERFbGVtZW50KSBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KCgoRWxlbWVudERlY2wpIGUpLmdldE5vZGVOYW1lKCkpOwotCQkJCWlmIChkdGRlbGVtZW50ID09IG51bGwpIHsKLQkJCQkJZHRkZWxlbWVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JCQkJCWR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZGVsZW1lbnQpOwotCQkJCX0KLQkJCQlmaW5pc2hFbGVtZW50RGVjbChkdGRlbGVtZW50LCAoRWxlbWVudERlY2wpIGUpOwotCQkJfQotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEF0dGxpc3QpIHsKLQkJCQlwcm9jZXNzQXR0TGlzdCgoQXR0bGlzdCkgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzQXR0TGlzdChBdHRsaXN0IGF0dExpc3QpIHsKLQkJRFRERWxlbWVudCBlID0gKERUREVsZW1lbnQpIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoYXR0TGlzdC5nZXROb2RlTmFtZSgpKTsKLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJLy8gRWxlbWVudCBoYXMgYmVlbiBhZGRlZC4gQWRkIHRoZSBhdHRyaWJ1dGVzCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBwcm9jZXNzQXR0bGlzdCAtIGFkZGluZyBBdHRsaXN0OiIgKwotCQkJLy8gYXR0TGlzdC5nZXROb2RlTmFtZSgpKTsKLQkJCWNyZWF0ZUF0dHJpYnV0ZXMoZSwgYXR0TGlzdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiEhISEhISEhISBlbGVtZW50IGlzIG51bGwgIik7Ci0JCX0KLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8KLQkvLyBNZXRob2RzIGZvciBmaW5pc2hpbmcgdGhlIGltcG9ydCBvZiBhIERUREV4dGVybmFsRW50aXR5Ci0JLy8KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0Jdm9pZCBmaW5pc2hFeHRlcm5hbEVudGl0eShEVERFeHRlcm5hbEVudGl0eSBleHRFbnRpdHksIEVudGl0eURlY2wgZW50aXR5RGVjbCkgewotCQl1cGRhdGVTeXN0ZW1JRChleHRFbnRpdHksIGVudGl0eURlY2wpOwotCQlleHRFbnRpdHkuc2V0UHVibGljSUQoZW50aXR5RGVjbC5nZXRQdWJsaWNJZCgpKTsKLQotCQlTdHJpbmcgbm90YXRpb25OYW1lID0gZW50aXR5RGVjbC5nZXROb3RhdGlvbk5hbWUoKTsKLQkJaWYgKG5vdGF0aW9uTmFtZSAhPSBudWxsKSB7Ci0JCQlEVEROb3RhdGlvbiBkdGROb3RhdGlvbiA9IGNyZWF0ZU9yRmluZE5vdGF0aW9uKGV4dEVudGl0eSwgbm90YXRpb25OYW1lLCB0cnVlKTsKLQkJCWV4dEVudGl0eS5zZXROb3RhdGlvbihkdGROb3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRFRETm90YXRpb24gY3JlYXRlT3JGaW5kTm90YXRpb24oRFRERXh0ZXJuYWxFbnRpdHkgZXh0RW50aXR5LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJRFRETm90YXRpb24gYU5vdGF0aW9uID0gZXh0RW50aXR5LmdldERUREVudGl0eSgpLmdldERUREZpbGUoKS5maW5kTm90YXRpb24obmFtZSk7Ci0JCWlmIChhTm90YXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGFOb3RhdGlvbjsKLQkJfQotCi0JCS8vCi0JCS8vIENyZWF0ZSBhIG5vdGF0aW9uIGZvciB0aGUgcmVmZXJlbmNlCi0JCS8vCi0JCWlmIChjcmVhdGUpIHsKLQkJCWFOb3RhdGlvbiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVEROb3RhdGlvbigpOwotCQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoYU5vdGF0aW9uKTsKLQkJCWFOb3RhdGlvbi5zZXROYW1lKG5hbWUpOwotCQl9Ci0JCXJldHVybiBhTm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogVGhlIFN5c3RlbUlEIGF0dHJpYnV0ZSBpcyBzZXQgdG8gd2hhdGV2ZXIgdGhlIHVzZXIgZW50ZXJzIGUuZy4KLQkgKiBjb20vaWJtL2IyYi94bWltb2RlbHMveHh4LmR0ZC54bWkKLQkgKiAKLQkgKiBJbiB0aGUgdW5wYXJzZSgpIG1ldGhvZCwgcGFyc2Ugb3V0IHRoZSBEVEQgZmlsZSBuYW1lIGZyb20gdGhlIGNsYXNzcGF0aAotCSAqIG5hbWUuIGUuZy4gcmV0dXJucyB4eHguZHRkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN5c3RlbUlEKERUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSwgRW50aXR5RGVjbCBlbnRpdHlEZWNsKSB7Ci0JCVN0cmluZyBzeXN0ZW1JZCA9IGVudGl0eURlY2wuZ2V0U3lzdGVtSWQoKTsKLQkJU3RyaW5nIHB1YmxpY0lkID0gZW50aXR5RGVjbC5nZXRQdWJsaWNJZCgpOwotCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkgewotCQkJVVJJUmVzb2x2ZXIgaWRSZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0JCQlTdHJpbmcgdXJpID0gaWRSZXNvbHZlci5yZXNvbHZlKGR0ZC5nZXROYW1lKCksIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQlFeHRlcm5hbERURE1vZGVsIGVkID0gZHRkVXRpbC5nZXRFeHRlcm5hbERURE1vZGVsKHJlc291cmNlcywgdXJpKTsKLQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJRFRERmlsZSByZWZlcmVuY2VEdGRGaWxlID0gZWQuZ2V0RXh0ZXJuYWxEVERGaWxlKCk7Ci0JCQkJZXh0RW50aXR5LnNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUocmVmZXJlbmNlRHRkRmlsZSk7Ci0JCQkJZXh0RW50aXR5LnNldFN5c3RlbUlEKHN5c3RlbUlkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChlbnRpdHlEZWNsLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpIHsKLQkJCQkJRXJyb3JNZXNzYWdlIGR0ZEVycm9yID0gbmV3IEVycm9yTWVzc2FnZSgpOwotCQkJCQlkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoRFREQ29yZU1lc3NhZ2VzLl9FUlJPUl9JTkNMX0ZJTEVfTE9BRF9GQUlMVVJFICsgIiAnIiArIHN5c3RlbUlkICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYWRkRXJyb3JNZXNzYWdlKGR0ZEVycm9yLCBleHRFbnRpdHkuZ2V0RFRERW50aXR5KCkpOwotCQkJCX0KLQotCQkJCWlmIChzeXN0ZW1JZCAhPSBudWxsKSB7Ci0JCQkJCWV4dEVudGl0eS5zZXRTeXN0ZW1JRChzeXN0ZW1JZCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlleHRFbnRpdHkuc2V0U3lzdGVtSUQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9IC8vIGVuZCBvZiBpZiAoKQotCQllbHNlIHsKLQkJCS8vIHNldCB0aGUgc3lzdGVtIGlkIHRvIGJlICIiCi0JCQlleHRFbnRpdHkuc2V0U3lzdGVtSUQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgRFRERW50aXR5IGNyZWF0ZURUREVudGl0eShFbnRpdHlEZWNsIGVudGl0eSkgewotCQkvLyBjcmVhdGUgYW5kIGRvIHdoYXQgd2UgY2FuIHRvIGZpbGwgaW4gc29tZSBiYXNpYyB0aGluZ3MKLQkJRFRERW50aXR5IGR0ZEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnRpdHkoKTsKLQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkRW50aXR5KTsKLQotCQlkdGRFbnRpdHkuc2V0TmFtZShlbnRpdHkuZ2V0Tm9kZU5hbWUoKSk7Ci0JCWR0ZEVudGl0eS5zZXRQYXJhbWV0ZXJFbnRpdHkoZW50aXR5LmlzUGFyYW1ldGVyKCkpOwotCQlpZiAoZW50aXR5LmdldENvbW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlkdGRFbnRpdHkuc2V0Q29tbWVudChlbnRpdHkuZ2V0Q29tbWVudCgpKTsKLQkJfQotCQlpZiAoZW50aXR5LmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWFkZEVycm9yTWVzc2FnZShlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZEVudGl0eSk7Ci0JCX0KLQotCQlyZXR1cm4gZHRkRW50aXR5OwotCX0KLQotCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vCi0JLy8gTWV0aG9kcyBmb3IgZmluaXNoaW5nIHRoZSBpbXBvcnQgb2YgYSBEVERFbGVtZW50Ci0JLy8KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JcHVibGljIHZvaWQgZmluaXNoRWxlbWVudERlY2woRFRERWxlbWVudCBkdGRFbGVtZW50LCBFbGVtZW50RGVjbCBlZCkgewotCQlkdGRFbGVtZW50LnNldE5hbWUoZWQuZ2V0Tm9kZU5hbWUoKSk7Ci0KLQkJQ01Ob2RlIGNtTm9kZSA9IGVkLmdldENvbnRlbnRNb2RlbE5vZGUoKTsKLQotCQlpZiAoZWQuZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKLQkJCWR0ZEVsZW1lbnQuc2V0Q29tbWVudChlZC5nZXRDb21tZW50KCkpOwotCQl9Ci0JCWlmIChlZC5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlhZGRFcnJvck1lc3NhZ2UoZWQuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZEVsZW1lbnQpOwotCQl9Ci0KLQkJaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQlDTUJhc2ljTm9kZSBibiA9IChDTUJhc2ljTm9kZSkgY21Ob2RlOwotCQkJc3dpdGNoIChibi5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIENNTm9kZVR5cGUuRU1QVFkgOgotCQkJCQlEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCQkJCQlkdGRFbGVtZW50LnNldENvbnRlbnQoZW1wdHlDb250ZW50KTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIENNTm9kZVR5cGUuQU5ZIDoKLQkJCQkJRFREQW55Q29udGVudCBhbnlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREFueUNvbnRlbnQoKTsKLQkJCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGFueUNvbnRlbnQpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQ01Ob2RlVHlwZS5QQ0RBVEEgOgotCQkJCQlEVERQQ0RhdGFDb250ZW50IHBjRGF0YSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0JCQkJCWR0ZEVsZW1lbnQuc2V0Q29udGVudChwY0RhdGEpOwotCQkJfQotCi0JCX0KLQkJZWxzZSBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01SZWZlcmVuY2VOb2RlKSB7Ci0JCQlDTVJlZmVyZW5jZU5vZGUgcm4gPSAoQ01SZWZlcmVuY2VOb2RlKSBjbU5vZGU7Ci0JCQlpZiAocm4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRSkgewotCQkJCVN0cmluZyBlbnRpdHlOYW1lID0gcm4uZ2V0TmFtZSgpLnRyaW0oKTsKLQotCQkJCURUREVudGl0eSBhbkVudGl0eSA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KGVudGl0eU5hbWUpOwotCQkJCWlmIChhbkVudGl0eSAhPSBudWxsKSB7Ci0JCQkJCS8vCi0JCQkJCS8vIENyZWF0ZSBhbiBEVERFbnRpdHlSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZAotCQkJCQkvLyBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZW5SZWYgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCQkJCQllblJlZi5zZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShhbkVudGl0eSk7Ci0KLQkJCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkJCQkJZW5SZWYuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0KLQkJCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVuUmVmKTsKLQkJCQl9Ci0JCQkJZWxzZSB7IC8vIGNyZWF0ZSBkZWZhdWx0IGNvbnRlbnQKLQkJCQkJRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkJCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8KLQkJCQkvLyBGaW5kIHRoZSByZWFsIGVsZW1lbnQgZm9yIHRoaXMgZWxlbWVudCByZWZlcmVuY2VzCi0JCQkJLy8gSWYgdGhlIHJlYWwgZWxlbWVudCBkb2VzIG5vdCB5ZXQgZXhpc3QsIGNyZWF0ZSBpdAotCQkJCS8vCi0JCQkJRFRERWxlbWVudCBhbkVsZW1lbnQgPSBjcmVhdGVPckZpbmRFbGVtZW50KHJuLmdldE5hbWUoKSwgZHRkRWxlbWVudCk7Ci0KLQkJCQkvLwotCQkJCS8vIENyZWF0ZSBhbiBEVERFbGVtZW50UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQKLQkJCQkvLyBlbGVtZW50Ci0JCQkJLy8KLQkJCQlEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtUmVmID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0JCQkJZWxlbVJlZi5zZXRSZWZlcmVuY2VkRWxlbWVudChhbkVsZW1lbnQpOwotCi0JCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkJCQllbGVtUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJLy8gc2V0Q29udGVudCB0byBEVERFbGVtZW50UmVmZXJlbmNlCi0JCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVsZW1SZWYpOwotCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCUNNR3JvdXBOb2RlIGdycE5vZGUgPSAoQ01Hcm91cE5vZGUpIGNtTm9kZTsKLQkJCURUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRER3JvdXBDb250ZW50KCk7Ci0JCQlEVERHcm91cEtpbmQgZ3JvdXBLaW5kID0gRFRER3JvdXBLaW5kLmdldChjb21wdXRlTW9mR3JvdXBLaW5kKGdycE5vZGUuZ2V0R3JvdXBLaW5kKCkpKTsKLQkJCWdyb3VwQ29udGVudC5zZXRHcm91cEtpbmQoZ3JvdXBLaW5kKTsKLQkJCURURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKGdycE5vZGUpKTsKLQkJCWdyb3VwQ29udGVudC5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQotCQkJLy8ganVzdCB1c2UgdGhlIGxvY2F0b3IgZm9yIHRoZSBlbGVtZW50IGFzIHRoZSBjbG9zZXN0IGd1ZXNzCi0JCQlwcm9jZXNzR3JvdXBDb250ZW50KGdyb3VwQ29udGVudCwgZ3JwTm9kZSk7Ci0JCQlkdGRFbGVtZW50LnNldENvbnRlbnQoZ3JvdXBDb250ZW50KTsKLQkJfQotCQllbHNlIGlmIChjbU5vZGUgPT0gbnVsbCkgewotCQkJLy8gYmFkIHRoaW5nIGhhcHBlbmVkIGhlcmUsIGp1c3QgY3JlYXRlIGEgcGNkYXRhCi0JCQlEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JCX0KLQotCi0JfQotCi0KLQkvKioKLQkgKiBBZGQgYSBuZXcgZ3JvdXAgdG8gdGhlIGN1cnJlbnQgZ3JvdXAKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgbm9kZSBmb3IgdGhpcyBncm91cCBlbGVtZW50Ci0JICogQHBhcmFtIG9wMU5vZGUgLQotCSAqICAgICAgICAgICAgdGhlIGdyb3VwIGUuZy4gKGEsYikKLQkgKiBAcGFyYW0gb3AyTm9kZSAtCi0JICogICAgICAgICAgICBzZXQgb25seSBpZiBjYWxsZWQgYnkgcHJvY2Vzc0NNMW9wIGUuZy4gKGEsYikrCi0JICovCi0Jdm9pZCBwcm9jZXNzR3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBwYXJlbnQsIENNR3JvdXBOb2RlIGdycE5vZGUpIHsKLQkJRW51bWVyYXRpb24gY2hpbGRyZW4gPSBncnBOb2RlLmdldENoaWxkcmVuKCkuZWxlbWVudHMoKTsKLQkJRFRERmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCQl3aGlsZSAoY2hpbGRyZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUNNTm9kZSBjbm9kZSA9IChDTU5vZGUpIGNoaWxkcmVuLm5leHRFbGVtZW50KCk7Ci0KLQkJCWlmIChjbm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkJQ01Hcm91cE5vZGUgZ05vZGUgPSAoQ01Hcm91cE5vZGUpIGNub2RlOwotCQkJCURUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQgPSBmYWN0b3J5LmNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCQkJCURUREdyb3VwS2luZCBncm91cEtpbmQgPSBEVERHcm91cEtpbmQuZ2V0KGNvbXB1dGVNb2ZHcm91cEtpbmQoZ05vZGUuZ2V0R3JvdXBLaW5kKCkpKTsKLQkJCQlncm91cENvbnRlbnQuc2V0R3JvdXBLaW5kKGdyb3VwS2luZCk7Ci0JCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2UoZ05vZGUpKTsKLQkJCQlncm91cENvbnRlbnQuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0KLQkJCQlwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChncm91cENvbnRlbnQpOwotCQkJCXByb2Nlc3NHcm91cENvbnRlbnQoZ3JvdXBDb250ZW50LCBnTm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjbm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJQ01CYXNpY05vZGUgbiA9IChDTUJhc2ljTm9kZSkgY25vZGU7Ci0JCQkJaWYgKG4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuUENEQVRBKSB7Ci0JCQkJCS8vIENyZWF0ZSBhIERURFBDRGF0YUNvbnRlbnQgZm9yIGEgbGVhZiBQQ0RhdGEgbm9kZQotCQkJCQkvLwotCQkJCQlEVERQQ0RhdGFDb250ZW50IHBjRGF0YSA9IGZhY3RvcnkuY3JlYXRlRFREUENEYXRhQ29udGVudCgpOwotCQkJCQkvLyBBZGQgI1BDREFUQSB0byB0aGUgR3JvdXAsIGkuZSBNaXhlZCBjb250ZW50IG1vZGVsCi0JCQkJCXBhcmVudC5nZXRDb250ZW50KCkuYWRkKHBjRGF0YSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoY25vZGUgaW5zdGFuY2VvZiBDTVJlZmVyZW5jZU5vZGUpIHsKLQkJCQlDTVJlZmVyZW5jZU5vZGUgcm4gPSAoQ01SZWZlcmVuY2VOb2RlKSBjbm9kZTsKLQkJCQlpZiAocm4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0UpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDTSBFbGVtZW50IFJlZiBuYW1lOiAiICsKLQkJCQkJLy8gcm4uZ2V0TmFtZSgpKTsKLQkJCQkJLy8KLQkJCQkJLy8gQ3JlYXRlIGFuIERUREVsZW1lbnRSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZAotCQkJCQkvLyBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1SZWYgPSBmYWN0b3J5LmNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0KLQkJCQkJLy8KLQkJCQkJLy8gRmluZCB0aGUgcmVhbCBlbGVtZW50IGZvciB0aGlzIGVsZW1lbnQgcmVmZXJlbmNlcwotCQkJCQkvLyBJZiB0aGUgcmVhbCBlbGVtZW50IGRvZXMgbm90IHlldCBleGlzdCwgY3JlYXRlIGl0Ci0JCQkJCS8vCi0JCQkJCURUREVsZW1lbnQgYW5FbGVtZW50ID0gY3JlYXRlT3JGaW5kRWxlbWVudChybi5nZXROYW1lKCksIGVsZW1SZWYpOwotCi0JCQkJCWVsZW1SZWYuc2V0UmVmZXJlbmNlZEVsZW1lbnQoYW5FbGVtZW50KTsKLQotCQkJCQlEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9IERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShybikpOwotCQkJCQllbGVtUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJCS8vIEFkZCBEVERFbGVtZW50UmVmZXJlbmNlIHRvIHRoZSBHcm91cAotCQkJCQlwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChlbGVtUmVmKTsKLQkJCQl9Ci0JCQkJZWxzZSAvLyBQRSBSZWZlcmVuY2UKLQkJCQl7Ci0JCQkJCVN0cmluZyBlbnRpdHlOYW1lID0gcm4uZ2V0TmFtZSgpLnRyaW0oKTsKLQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNNIFBFIFJlZiBuYW1lOiAiICsgZW50aXR5TmFtZSk7Ci0JCQkJCURUREVudGl0eSBhbkVudGl0eSA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KGVudGl0eU5hbWUpOwotCQkJCQlpZiAoYW5FbnRpdHkgIT0gbnVsbCkgewotCQkJCQkJLy8KLQkJCQkJCS8vIENyZWF0ZSBhbiBEVERFbnRpdHlSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZAotCQkJCQkJLy8gZWxlbWVudAotCQkJCQkJLy8KLQkJCQkJCURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZW5SZWYgPSBmYWN0b3J5LmNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQkJCQkJCWVuUmVmLnNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KGFuRW50aXR5KTsKLQotCQkJCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkJCQkJCWVuUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJCQkvLyBBZGQgRFRERW50aXR5UmVmZXJlbmNlIHRvIHRoZSBHcm91cAotCQkJCQkJcGFyZW50LmdldENvbnRlbnQoKS5hZGQoZW5SZWYpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSByZWFsIGVsZW1lbnQgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBjdXJyZW50IGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIERUREVsZW1lbnQgY3JlYXRlT3JGaW5kRWxlbWVudChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikgewotCQkvLyBEVERFbGVtZW50IGFFbGVtZW50ID0gZ2V0RFRERmlsZSgpLmZpbmRFbGVtZW50KG5hbWUpOwotCi0JCURUREVsZW1lbnQgYUVsZW1lbnQgPSAoRFRERWxlbWVudCkgZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLmdldChuYW1lKTsKLQotCQlpZiAoYUVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFFbGVtZW50OwotCQl9Ci0KLQkJU3RyaW5nIGVycm9yTXNnID0gRFREQ29yZU1lc3NhZ2VzLl9FUlJPUl9VTkRFQ0xBUkVEX0VMRU1FTlRfMTsgLy8kTk9OLU5MUy0xJAotCQllcnJvck1zZyArPSAiXCIiICsgbmFtZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQllcnJvck1zZyArPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VSUk9SUEFSVF9VTkRFQ0xBUkVEX0VMRU1FTlRfMjsgLy8kTk9OLU5MUy0xJAotCi0JCUVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQotCQlkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNc2cpOwotCQlhZGRFcnJvck1lc3NhZ2UoZHRkRXJyb3IsIG9iaik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihlcnJvck1zZyk7Ci0JCS8vIHNldERUREVycm9yTWVzc2FnZShlcnJvck1zZyk7Ci0JCWdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCi0JCS8vCi0JCS8vIENyZWF0ZSBhbiBlbXB0eSBlbGVtZW50IGZvciB0aGUgcmVmZXJlbmNlIHRvIG1ha2UgaXQgdmFsaWQKLQkJLy8KLQotCQlEVERGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0JCURUREVsZW1lbnQgZHRkZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlRFRERWxlbWVudCgpOwotCQlkdGRlbGVtZW50LnNldE5hbWUobmFtZSk7Ci0KLQkJRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGZhY3RvcnkuY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JCWR0ZGVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCi0JCWdldERUREZpbGUoKS5nZXREVERPYmplY3QoKS5hZGQoZHRkZWxlbWVudCk7Ci0JCWR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5wdXQobmFtZSwgZHRkZWxlbWVudCk7Ci0JCXJldHVybiBkdGRlbGVtZW50OwotCX0KLQotCi0JLyoqCi0JICogQ29tcHV0ZSB0aGUgTU9GIG9jY3VycmVuY2UgZnJvbSB0aGUgeG1sNGogb2NjdXJyZW5jZQotCSAqLwotCXByaXZhdGUgaW50IGNvbXB1dGVNb2ZPY2N1cnJlbmNlKENNUmVwZWF0YWJsZU5vZGUgcm5vZGUpIHsKLQkJaW50IG9jY3VycmVuY2UgPSBybm9kZS5nZXRPY2N1cnJlbmNlKCk7Ci0JCWludCBtb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLk9ORTsKLQotCQlpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLlpFUk9fT1JfTU9SRSkgewotCQkJbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5aRVJPX09SX01PUkU7Ci0JCX0KLQkJZWxzZSBpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLk9ORV9PUl9NT1JFKSB7Ci0JCQltb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLk9ORV9PUl9NT1JFOwotCQl9Ci0JCWVsc2UgaWYgKG9jY3VycmVuY2UgPT0gQ01Ob2RlVHlwZS5PUFRJT05BTCkgewotCQkJbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5PUFRJT05BTDsKLQkJfQotCQlyZXR1cm4gbW9mb2NjdXI7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZSB0aGUgTU9GIG1vZGVsIGdyb3VwIGZyb20gdGhlIHhtbDRqIG1vZGVsIGdyb3VwCi0JICovCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZU1vZkdyb3VwS2luZChpbnQgdHlwZSkgewotCQlpZiAodHlwZSA9PSBDTU5vZGVUeXBlLkdST1VQX0NIT0lDRSkgewotCQkJcmV0dXJuIERUREdyb3VwS2luZC5DSE9JQ0U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRFRER3JvdXBLaW5kLlNFUVVFTkNFOwotCQl9Ci0JfQotCi0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8KLQkvLyBNZXRob2RzIGZvciBjcmVhdGluZyB0aGUgYXR0cmlidXRlcyBvZiBhIERUREVsZW1lbnQKLQkvLwotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQlwdWJsaWMgdm9pZCBjcmVhdGVBdHRyaWJ1dGVzKERUREVsZW1lbnQgZWxlbWVudCwgQXR0bGlzdCBhdHRMaXN0KSB7Ci0JCWlmIChhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWFkZEVycm9yTWVzc2FnZShhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpLCBlbGVtZW50KTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0TGlzdC5zaXplKCk7IGkrKykgewotCQkJQXR0Tm9kZSBhZCA9IGF0dExpc3QuZWxlbWVudEF0KGkpOwotCQkJLy8gRFREQXR0cmlidXRlRWxlbWVudCBkdGRBdHQ9Ci0JCQkvLyBnZXREVERBdHRyaWJ1dGVFbGVtZW50KGEuZ2V0TmFtZSgpKTsKLQotCQkJLy8gb25seSBhZGQgdGhlIEF0dERlZiBpZiBpdCBpcyBub3QgYWRkZWQgeWV0Ci0JCQkvLyBpZ25vcmUgdGhlIGR1cCBBdHREZWYgYXMgZG9jdW1lbnRlZCBpbiB0aGUgWE1MIDEuMCBzcGVjcwotCQkJLy8gaWYoIGR0ZEF0dD09bnVsbCkKLQkJCWFkZEF0dHJpYnV0ZShlbGVtZW50LCBhZCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIERUREF0dHJpYnV0ZSBmcm9tIHRoZSB4bWw0aiBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoRFRERWxlbWVudCBkdGRlbGVtZW50LCBBdHROb2RlIGFkKSB7Ci0JCURUREF0dHJpYnV0ZSBkdGRhdHRyID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREF0dHJpYnV0ZSgpOwotCQlkdGRlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpLmFkZChkdGRhdHRyKTsKLQkJZmluaXNoQXR0cmlidXRlKGR0ZGF0dHIsIGFkKTsKLQl9Ci0KLQkvLyBTdHVmZiBmb3IgcG9wdWxhdGluZyBhdHRyaWJ1dGUKLQlwdWJsaWMgdm9pZCBmaW5pc2hBdHRyaWJ1dGUoRFREQXR0cmlidXRlIGR0ZGF0dHIsIEF0dE5vZGUgYXR0ZGVmKSB7Ci0JCWJvb2xlYW4gcGFyc2VFcnJvciA9IGZhbHNlOwotCi0JCWlmIChhdHRkZWYubmFtZS5zdGFydHNXaXRoKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHBlTmFtZSA9IGF0dGRlZi5uYW1lLnRyaW0oKTsKLQkJCURUREVudGl0eSBlbiA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KHBlTmFtZSk7Ci0JCQlpZiAoZW4gIT0gbnVsbCkgewotCQkJCWR0ZGF0dHIuc2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoZW4pOwotCQkJfQotCQl9Ci0KLQkJZHRkYXR0ci5zZXROYW1lKGF0dGRlZi5uYW1lKTsKLQotCQlpbnQgYXR0clR5cGUgPSBhdHRkZWYuZ2V0RGVjbGFyZWRUeXBlKCk7Ci0KLQkJaWYgKGF0dHJUeXBlID09IEF0dE5vZGUuUEVSRUZFUkVOQ0UgJiYgYXR0ZGVmLnR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHBlTmFtZSA9IGF0dGRlZi50eXBlLnRyaW0oKTsKLQkJCURUREVudGl0eSBlbiA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KHBlTmFtZSk7Ci0JCQlpZiAoZW4gIT0gbnVsbCkgewotCQkJCWR0ZGF0dHIuc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoZW4pOwotCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7IC8vIGhhY2ssCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHNvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHdlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBnZXQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYmFjawotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVmYXVsdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB2YWx1ZQotCQkJfQotCQkJZWxzZQotCQkJCS8vIHNldCBkZWZhdWx0IHR5cGUKLQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkpOwotCi0JCX0KLQkJZWxzZSB7Ci0JCQlzd2l0Y2ggKGF0dHJUeXBlKSB7Ci0JCQkJY2FzZSBBdHROb2RlLkNEQVRBIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9DREFUQSgpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuRU5USVRJRVMgOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0VOVElUSUVTKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5FTlRJVFkgOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0VOVElUWSgpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuSUQgOgotCQkJCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlIElEIGF0dHJpYnV0ZQotCQkJCQlpZiAoaGFzSURBdHRyaWJ1dGUoZHRkYXR0cikpIHsKLQkJCQkJCS8qU3RyaW5nIGVyck1zZyA9IERURENvcmVNZXNzYWdlcy5fRVJST1JfRFVQX0lEX0FUVFJJQlVURV8xOyAvLyROT04tTkxTLTEkCi0JCQkJCQllcnJNc2cgKz0gYXR0ZGVmLm5hbWUgKyBEVERDb3JlTWVzc2FnZXMuX1VJX0VSUk9SUEFSVF9EVVBfSURfQVRUUklCVVRFXzI7IC8vJE5PTi1OTFMtMSQqLwotCQkJCQkJLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0SUVsZW1lbnQoKS5zZXREVERFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkJCQkJCS8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCQkJCQkJcGFyc2VFcnJvciA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9JRCgpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuSURSRUYgOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5JRFJFRlMgOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGUygpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuRU5VTUVSQVRJT04gOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBjcmVhdGVEVERFbnVtZXJhdGlvbihkdGRhdHRyLCBhdHRkZWYsIERUREVudW1Hcm91cEtpbmQuTkFNRV9UT0tFTl9HUk9VUCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5OT1RBVElPTiA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGNyZWF0ZURUREVudW1lcmF0aW9uKGR0ZGF0dHIsIGF0dGRlZiwgRFRERW51bUdyb3VwS2luZC5OT1RBVElPTl9HUk9VUCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5OTVRPS0VOIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9OTVRPS0VOKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5OTVRPS0VOUyA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfTk1UT0tFTlMoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJZGVmYXVsdCA6Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREFUVFIgJyIgK2F0dGRlZi5uYW1lICsgIidVbmtub3duCi0JCQkvLyB0eXBlLi4uIiArIGF0dHJUeXBlKTsKLQkJCX0KLQkJfQotCi0JCWludCBhdHRyRGVmYXVsdCA9IGF0dGRlZi5nZXREZWZhdWx0VHlwZSgpOwotCQlpbnQgZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5JTVBMSUVEOwotCQlzd2l0Y2ggKGF0dHJEZWZhdWx0KSB7Ci0JCQljYXNlIEF0dE5vZGUuRklYRUQgOgotCQkJCWRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuRklYRUQ7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQXR0Tm9kZS5JTVBMSUVEIDoKLQkJCQlkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLklNUExJRUQ7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQXR0Tm9kZS5SRVFVSVJFRCA6Ci0JCQkJZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5SRVFVSVJFRDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBdHROb2RlLk5PRklYRUQgOgotCQkJCWRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuTk9GSVhFRDsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQVRUUiAnIiArYXR0ZGVmLm5hbWUgKyAiJyBVbmtub3duIGRlZmF1bHQKLQkJLy8gdHlwZS4uLiAiICsgYXR0ckRlZmF1bHQpOwotCQl9Ci0KLQkJRFRERGVmYXVsdEtpbmQgZGVmYXVsdEtpbmRPYmogPSBEVEREZWZhdWx0S2luZC5nZXQoZGVmYXVsdEtpbmQpOwotCQlkdGRhdHRyLnNldERlZmF1bHRLaW5kKGRlZmF1bHRLaW5kT2JqKTsKLQotCQlpZiAocGFyc2VFcnJvcikgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGF0dGRlZi5kZWZhdWx0VmFsdWU7Ci0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKGF0dHJUeXBlID09IEF0dE5vZGUuRU5VTUVSQVRJT04gfHwgYXR0clR5cGUgPT0gQXR0Tm9kZS5OT1RBVElPTikgewotCQkJCWlmICghaXNEZWZhdWx0RW51bVZhbHVlVmFsaWQoYXR0ZGVmLCBkZWZhdWx0VmFsdWUpKSB7Ci0JCQkJCS8qU3RyaW5nIHR5cGVTdHJpbmcgPSAoYXR0clR5cGUgPT0gQXR0Tm9kZS5FTlVNRVJBVElPTiA/ICJlbnVtZXJhdGlvbiIgOiAibm90YXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN0cmluZyBlcnJNc2cgPSBEVERDb3JlTWVzc2FnZXMuX0VSUk9SX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzE7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZXJyTXNnICs9IHR5cGVTdHJpbmcgKyBEVERDb3JlTWVzc2FnZXMuX1VJX0VSUk9SUEFSVF9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8yOyAvLyROT04tTkxTLTEkCi0JCQkJCWVyck1zZyArPSBhdHRkZWYubmFtZSArICInIjsgLy8kTk9OLU5MUy0xJCovCi0KLQkJCQkJLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0SUVsZW1lbnQoKS5zZXREVERFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkJCQkJLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLnNldFBhcnNlRXJyb3IodHJ1ZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlkdGRhdHRyLnNldERlZmF1bHRWYWx1ZVN0cmluZyhkZWZhdWx0VmFsdWUpOwotCQl9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQXR0ciAtIHRvTW9mIGdldERlZmF1bHRWYWx1ZVN0cmluZyAiICsKLQkJLy8gZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREF0dHIgLSB0b01vZiBnZXREZWZhdWx0VmFsdWU6ICIgKwotCQkvLyBnZXREZWZhdWx0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzSURBdHRyaWJ1dGUoRFREQXR0cmlidXRlIGR0ZGF0dHIpIHsKLQkJYm9vbGVhbiBoYXNJRCA9IGZhbHNlOwotCi0JCURUREVsZW1lbnQgZWxlbWVudCA9IGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpOwotCQlFTGlzdCBhdHRycyA9IGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCk7Ci0KLQkJSXRlcmF0b3IgaSA9IGF0dHJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJRFREQXR0cmlidXRlIGF0dHIgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkJCURURFR5cGUgZFR5cGUgPSBhdHRyLmdldERURFR5cGUoKTsKLQkJCWlmIChkVHlwZSBpbnN0YW5jZW9mIERUREJhc2ljVHlwZSkgewotCQkJCWlmICgoKERUREJhc2ljVHlwZSkgZFR5cGUpLmdldEtpbmQoKS5nZXRWYWx1ZSgpID09IERUREJhc2ljVHlwZUtpbmQuSUQpIHsKLQkJCQkJaGFzSUQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhhc0lEOwotCX0KLQotCXB1YmxpYyBEVERFbnVtZXJhdGlvblR5cGUgY3JlYXRlRFRERW51bWVyYXRpb24oRFREQXR0cmlidXRlIGR0ZGF0dHIsIFN0cmluZ1tdIGVudW1WYWx1ZXMsIGludCBlbnVtS2luZCkgewotCQlEVERFbnVtZXJhdGlvblR5cGUgZW51bWVyYXRpb24gPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW51bWVyYXRpb25UeXBlKCk7Ci0JCURUREVudW1Hcm91cEtpbmQgZ3JvdXBLaW5kID0gRFRERW51bUdyb3VwS2luZC5nZXQoZW51bUtpbmQpOwotCQllbnVtZXJhdGlvbi5zZXRLaW5kKGdyb3VwS2luZCk7Ci0JCS8vIEVudW1lcmF0aW9uIHZhbHVlcwotCQlpZiAoZW51bVZhbHVlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlFRW51bUxpdGVyYWwgZW51bUxpdGVyYWwgPSBjcmVhdGVFRW51bUxpdGVyYWwoKTsKLQkJCQkvLyBlbnVtVmFsLnNldFhNSURvY3VtZW50KGR0ZGF0dHIuZ2V0WE1JRG9jdW1lbnQoKSk7Ci0JCQkJLy8gTU9GMkVNRiBQb3J0Ci0JCQkJLy8gZW51bUxpdGVyYWwucmVmU2V0TGl0ZXJhbChlbnVtVmFsdWVzW2ldKTsKLQkJCQllbnVtTGl0ZXJhbC5zZXROYW1lKGVudW1WYWx1ZXNbaV0pOwotCi0JCQkJLy8gZW51bUxpdGVyYWwuc2V0TnVtYmVyKGkpOwotCQkJCWVudW1lcmF0aW9uLmdldEVudW1MaXRlcmFscygpLmFkZChlbnVtTGl0ZXJhbCk7Ci0JCQl9Ci0JCX0KLQkJZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLmdldERUREVudW1lcmF0aW9uVHlwZSgpLmFkZChlbnVtZXJhdGlvbik7Ci0JCXJldHVybiBlbnVtZXJhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIEVFbnVtTGl0ZXJhbCBjcmVhdGVFRW51bUxpdGVyYWwoKSB7Ci0JCUVjb3JlUGFja2FnZSBlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKLQkJLy8gTU9GMkVNRiBQb3J0Ci0JCS8vIHJldHVybiAoKEVjb3JlRmFjdG9yeSllUGFja2FnZS5nZXRGYWN0b3J5KCkpLmNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCQlyZXR1cm4gZVBhY2thZ2UuZ2V0RWNvcmVGYWN0b3J5KCkuY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JfQotCi0JcHJpdmF0ZSBEVERFbnVtZXJhdGlvblR5cGUgY3JlYXRlRFRERW51bWVyYXRpb24oRFREQXR0cmlidXRlIGR0ZGF0dHIsIEF0dE5vZGUgYXR0ZGVmLCBpbnQgZW51bUtpbmQpIHsKLQkJRFRERW51bWVyYXRpb25UeXBlIGVudW1lcmF0aW9uID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpOwotCQlEVERFbnVtR3JvdXBLaW5kIGdyb3VwS2luZCA9IERUREVudW1Hcm91cEtpbmQuZ2V0KGVudW1LaW5kKTsKLQkJZW51bWVyYXRpb24uc2V0S2luZChncm91cEtpbmQpOwotCQlkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCkuZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuYWRkKGVudW1lcmF0aW9uKTsKLQotCQkvLyBFbnVtZXJhdGlvbiB2YWx1ZXMKLQkJRW51bWVyYXRpb24gdG9rZW5JdGVyID0gYXR0ZGVmLmVsZW1lbnRzKCk7Ci0JCWlmICh0b2tlbkl0ZXIgIT0gbnVsbCkgewotCQkJd2hpbGUgKHRva2VuSXRlci5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyB2YWwgPSAoU3RyaW5nKSB0b2tlbkl0ZXIubmV4dEVsZW1lbnQoKTsKLQkJCQlFRW51bUxpdGVyYWwgZW51bUxpdGVyYWwgPSBjcmVhdGVFRW51bUxpdGVyYWwoKTsKLQkJCQkvLyBlbnVtTGl0ZXJhbC5zZXRYTUlEb2N1bWVudChkdGRhdHRyLmdldFhNSURvY3VtZW50KCkpOwotCQkJCS8vIE1PRjJFTUYgUG9ydAotCQkJCS8vIGVudW1MaXRlcmFsLnJlZlNldExpdGVyYWwodmFsKTsKLQkJCQllbnVtTGl0ZXJhbC5zZXROYW1lKHZhbCk7Ci0KLQotCQkJCS8vIGVudW1MaXRlcmFsLnNldE51bWJlcihpKyspOwotCQkJCWVudW1lcmF0aW9uLmdldEVudW1MaXRlcmFscygpLmFkZChlbnVtTGl0ZXJhbCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZW51bWVyYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdEVudW1WYWx1ZVZhbGlkKEF0dE5vZGUgYXR0ZGVmLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb250YWluc1BlcmNlbnQgPSBmYWxzZTsKLQotCQkvLyBFbnVtZXJhdGlvbiB2YWx1ZXMKLQkJRW51bWVyYXRpb24gZW51bVZhbHVlcyA9IGF0dGRlZi5lbGVtZW50cygpOwotCQl3aGlsZSAoZW51bVZhbHVlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIHZhbCA9IChTdHJpbmcpIGVudW1WYWx1ZXMubmV4dEVsZW1lbnQoKTsKLQkJCWlmICh2YWwuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpIHsKLQkJCQl2YWxpZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAodmFsLmluZGV4T2YoJyUnKSA+PSAwKSB7Ci0JCQkJY29udGFpbnNQZXJjZW50ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsaWQgfHwgY29udGFpbnNQZXJjZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJEVERUeXBlKERUREF0dHJpYnV0ZSBkdGRhdHRyLCBEVERUeXBlIHR5cGUpIHsKLQkJZHRkYXR0ci5zZXREVERUeXBlKHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVycm9yTWVzc2FnZShFcnJvck1lc3NhZ2UgZXJyTXNnLCBPYmplY3Qgb2JqKSB7Ci0JCWVyck1zZy5zZXRPYmplY3Qob2JqKTsKLQkJZHRkVXRpbC5hZGRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQl9Ci0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERGYWN0b3J5SW1wbCBnZXRGYWN0b3J5R2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIChEVERGYWN0b3J5SW1wbClkdGRVdGlsLmdldEZhY3RvcnkoKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERmlsZSBnZXREVERGaWxlR2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIGR0ZEZpbGU7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXREVERHZW4oRFREIGR0ZCkgewotCS8vCi0JLy8gc3VwZXIudmlzaXREVEQoZHRkKTsKLQkvLwotCS8vCi0JLy8gLy8gLSAybmQgcGFzcyAtCi0JLy8gLy8gZG8gZmluYWwgcHJvY2Vzc2luZyBmb3IgQXR0bGlzdHMgYW5kIGFkZGluZyBjb250ZW50TW9kZWwKLQkvLyBhZGRBdHRsaXN0QW5kQ29udGVudE1vZGVsKGR0ZCxkdGRGaWxlKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdEVsZW1lbnREZWNsR2VuKEVsZW1lbnREZWNsIGVsZW1lbnQpIHsKLQkvLwotCS8vIC8vIEVsZW1lbnQgbWlnaHQgaGF2ZSBiZWVuIGFkZGVkIGVhcmxpZXIgYmVjYXVzZSBpdCBpcyByZWZlcmVuY2VkCi0JLy8gU3RyaW5nIGRlY2xOYW1lID0gZWxlbWVudC5nZXROb2RlTmFtZSgpIDsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInByb2Nlc3MgRWxlbWVudERlY2w6IiArIGRlY2xOYW1lICk7Ci0JLy8gRFRERWxlbWVudCBkdGRlbGVtZW50ID0gKERUREVsZW1lbnQpCi0JLy8gZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLmdldChkZWNsTmFtZSk7Ci0JLy8gaWYgKGR0ZGVsZW1lbnQgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJwcm9jZXNzIEVsZW1lbnREZWNsIC0gbm90IGZvdW5kIC0gY3JlYXRlIiApOwotCS8vIGR0ZGVsZW1lbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERWxlbWVudCgpOwotCS8vIGR0ZGVsZW1lbnQuc2V0TmFtZShkZWNsTmFtZSk7Ci0JLy8gZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkZWxlbWVudCk7Ci0JLy8gZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLnB1dChkZWNsTmFtZSxkdGRlbGVtZW50KTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHN1cGVyLnZpc2l0RWxlbWVudERlY2woZWxlbWVudCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXROb3RhdGlvbkRlY2xHZW4oTm90YXRpb25EZWNsIG5vdGF0aW9uKSB7Ci0JLy8KLQkvLyAvLyBOb3RhdGlvbiBtaWdodCBoYXZlIGJlZW4gYWRkZWQgZWFybGllciBiZWNhdXNlIGl0IGlzIHJlZmVyZW5jZWQKLQkvLyAvLyBieSBhbiBlbnRpdHkKLQkvLyBEVEROb3RhdGlvbiBkdGRub3QgPSBkdGRGaWxlLmZpbmROb3RhdGlvbiggbm90YXRpb24uZ2V0Tm9kZU5hbWUoKSApOwotCS8vIGlmIChkdGRub3QgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gZHRkbm90ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURURE5vdGF0aW9uKCk7Ci0JLy8gZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkbm90KTsKLQkvLyB9Ci0JLy8gZHRkbm90LnNldE5hbWUobm90YXRpb24uZ2V0Tm9kZU5hbWUoKSk7Ci0JLy8KLQkvLwotCS8vIGlmIChub3RhdGlvbi5nZXRTeXN0ZW1JZCgpIT0gbnVsbCApCi0JLy8gZHRkbm90LnNldFN5c3RlbUlEKG5vdGF0aW9uLmdldFN5c3RlbUlkKCkpOwotCS8vIGlmIChub3RhdGlvbi5nZXRQdWJsaWNJZCgpIT0gbnVsbCApCi0JLy8gZHRkbm90LnNldFB1YmxpY0lEKG5vdGF0aW9uLmdldFB1YmxpY0lkKCkpOwotCS8vCi0JLy8KLQkvLyBpZiAobm90YXRpb24uZ2V0Q29tbWVudCgpIT1udWxsKQotCS8vIGR0ZG5vdC5zZXRDb21tZW50KG5vdGF0aW9uLmdldENvbW1lbnQoKSk7Ci0JLy8gaWYgKG5vdGF0aW9uLmdldEVycm9yTWVzc2FnZSgpIT1udWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2Uobm90YXRpb24uZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZG5vdCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBzdXBlci52aXNpdE5vdGF0aW9uRGVjbChub3RhdGlvbik7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VEZWNsR2VuKEVudGl0eURlY2wgZW50aXR5KQotCS8vIHsKLQkvLwotCS8vIC8vIFRoaXMgaXMgYSBwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZS4KLQkvLyAvLyBBZGQgdGhlIGxpbmsgdG8gdGhlIHJlYWwgZW50aXR5IHRoYXQgaXQgcmVmZXJlbmNlcwotCS8vIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50UmVmID0KLQkvLyBnZXRGYWN0b3J5KCkuY3JlYXRlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0JLy8gZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQocGFybUVudFJlZik7Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBlbnRpdHlOYW1lID0gZW50aXR5LmdldE5vZGVOYW1lKCk7Ci0JLy8KLQkvLwotCS8vIC8vIEFkZCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBEVERFbnRpdHkKLQkvLyBEVERFbnRpdHkgZHRkZW50aXR5ID0gZ2V0RFRERmlsZSgpLmZpbmRFbnRpdHkoZW50aXR5TmFtZSk7Ci0JLy8gaWYgKGR0ZGVudGl0eSAhPSBudWxsKQotCS8vIHsKLQkvLyBwYXJtRW50UmVmLnNldEVudGl0eShkdGRlbnRpdHkpOwotCS8vIH0KLQkvLyBpZiAoZW50aXR5LmdldEVycm9yTWVzc2FnZSgpIT1udWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZW50aXR5LmdldEVycm9yTWVzc2FnZSgpLCBkdGRlbnRpdHkpOwotCS8vIH0KLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBQRSByZWZlcmVuY2U6ICIgKyBkZWNsTmFtZSk7Ci0JLy8KLQkvLwotCS8vIHN1cGVyLnZpc2l0UGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRGVjbChlbnRpdHkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RXh0ZXJuYWxFbnRpdHlEZWNsR2VuKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JLy8KLQkvLyBEVERFbnRpdHkgZHRkRW50aXR5ID0gY3JlYXRlRFRERW50aXR5KGVudGl0eSk7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgZW50aXR5OiAiICsgZGVjbE5hbWUpOwotCS8vIERUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFeHRlcm5hbEVudGl0eSgpOwotCS8vIGR0ZEVudGl0eS5zZXRDb250ZW50KGV4dEVudGl0eSk7Ci0JLy8KLQkvLwotCS8vIGZpbmlzaEV4dGVybmFsRW50aXR5KGV4dEVudGl0eSwgZW50aXR5KTsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBleHQgZW50aXR5IHRvTW9mOiAiICk7Ci0JLy8gaWYgKGR0ZEVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCS8vIHsKLQkvLwotCS8vCi0JLy8gZHRkVXRpbC5nZXRQRVBvb2woKS5wdXQoIiUiK2VudGl0eS5nZXROb2RlTmFtZSgpKyI7IiwgZHRkRW50aXR5KTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHN1cGVyLnZpc2l0RXh0ZXJuYWxFbnRpdHlEZWNsKGVudGl0eSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXRJbnRlcm5hbEVudGl0eURlY2xHZW4oRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkvLwotCS8vIERUREVudGl0eSBkdGRFbnRpdHkgPSBjcmVhdGVEVERFbnRpdHkoZW50aXR5KTsKLQkvLwotCS8vCi0JLy8gRFRESW50ZXJuYWxFbnRpdHkgaW50RW50aXR5ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREludGVybmFsRW50aXR5KCk7Ci0JLy8gZHRkRW50aXR5LnNldENvbnRlbnQoaW50RW50aXR5KTsKLQkvLyBpbnRFbnRpdHkuc2V0VmFsdWUoZW50aXR5LmdldFZhbHVlKCkpOwotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGludCBlbnRpdHkgdG9Nb2Y6ICIgKTsKLQkvLyBpZiAoZHRkRW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpCi0JLy8gewotCS8vIGR0ZFV0aWwuZ2V0UEVQb29sKCkucHV0KCIlIitlbnRpdHkuZ2V0Tm9kZU5hbWUoKSsiOyIsIGR0ZEVudGl0eSk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBzdXBlci52aXNpdEludGVybmFsRW50aXR5RGVjbChlbnRpdHkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGFkZEF0dGxpc3RBbmRDb250ZW50TW9kZWxHZW4oRFREIGR0ZCwgRFRERmlsZSBkRmlsZSkgewotCS8vCi0JLy8gLy9TeXN0ZW0ub3V0LnByaW50bG4oImFkZEF0dExpc3RBbmRDb3RlbnRNb2RlbCAtIGR0ZDoiICsKLQkvLyBkdGQuZ2V0TmFtZSgpKTsKLQkvLyBFbnVtZXJhdGlvbiBlbiA9IGR0ZC5leHRlcm5hbEVsZW1lbnRzKCk7Ci0JLy8gd2hpbGUgKGVuLmhhc01vcmVFbGVtZW50cygpKQotCS8vIHsKLQkvLyBPYmplY3QgZSA9IGVuLm5leHRFbGVtZW50KCk7Ci0JLy8gaWYgKCBlIGluc3RhbmNlb2YgRWxlbWVudERlY2wgKQotCS8vIHsKLQkvLyBEVERFbGVtZW50IGR0ZGVsZW1lbnQgPSAoRFRERWxlbWVudCkgZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLmdldCgKLQkvLyAoKEVsZW1lbnREZWNsKWUpLmdldE5vZGVOYW1lKCkgKTsKLQkvLyBpZiAoZHRkZWxlbWVudCA9PSBudWxsKQotCS8vIHsKLQkvLyBkdGRlbGVtZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVsZW1lbnQoKTsKLQkvLyBkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChkdGRlbGVtZW50KTsKLQkvLyB9Ci0JLy8gZmluaXNoRWxlbWVudERlY2woZHRkZWxlbWVudCwgKEVsZW1lbnREZWNsKSBlKTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBBdHRsaXN0ICkKLQkvLyB7Ci0JLy8gcHJvY2Vzc0F0dExpc3QoKEF0dGxpc3QpIGUpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0F0dExpc3RHZW4oQXR0bGlzdCBhdHRMaXN0KSB7Ci0JLy8KLQkvLyBEVERFbGVtZW50IGUgPSAoRFRERWxlbWVudCkKLQkvLyBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KGF0dExpc3QuZ2V0Tm9kZU5hbWUoKSk7Ci0JLy8gaWYgKCBlICE9IG51bGwgKQotCS8vIHsKLQkvLyAvLyBFbGVtZW50IGhhcyBiZWVuIGFkZGVkLiBBZGQgdGhlIGF0dHJpYnV0ZXMKLQkvLyAvL1N5c3RlbS5vdXQucHJpbnRsbigiIHByb2Nlc3NBdHRsaXN0IC0gYWRkaW5nIEF0dGxpc3Q6IiArCi0JLy8gYXR0TGlzdC5nZXROb2RlTmFtZSgpKTsKLQkvLyBjcmVhdGVBdHRyaWJ1dGVzKGUsIGF0dExpc3QpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIC8vU3lzdGVtLm91dC5wcmludGxuKCIhISEhISEhISEgZWxlbWVudCBpcyBudWxsICIpOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hFeHRlcm5hbEVudGl0eUdlbihEVERFeHRlcm5hbEVudGl0eSBleHRFbnRpdHksCi0JLy8gRW50aXR5RGVjbCBlbnRpdHlEZWNsKSB7Ci0JLy8KLQkvLyB1cGRhdGVTeXN0ZW1JRChleHRFbnRpdHksIGVudGl0eURlY2wpOwotCS8vIGV4dEVudGl0eS5zZXRQdWJsaWNJRChlbnRpdHlEZWNsLmdldFB1YmxpY0lkKCkpOwotCS8vCi0JLy8KLQkvLyBTdHJpbmcgbm90YXRpb25OYW1lID0gZW50aXR5RGVjbC5nZXROb3RhdGlvbk5hbWUoKTsKLQkvLyBpZiAobm90YXRpb25OYW1lICE9IG51bGwpCi0JLy8gewotCS8vIERURE5vdGF0aW9uIGR0ZE5vdGF0aW9uID0gY3JlYXRlT3JGaW5kTm90YXRpb24oZXh0RW50aXR5LAotCS8vIG5vdGF0aW9uTmFtZSx0cnVlKTsKLQkvLyBleHRFbnRpdHkuc2V0Tm90YXRpb24oZHRkTm90YXRpb24pOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRETm90YXRpb24gY3JlYXRlT3JGaW5kTm90YXRpb25HZW4oRFRERXh0ZXJuYWxFbnRpdHkKLQkvLyBleHRFbnRpdHksIFN0cmluZyBuYW1lLCBib29sZWFuIGNyZWF0ZSkgewotCS8vCi0JLy8gRFRETm90YXRpb24gYU5vdGF0aW9uID0KLQkvLyBleHRFbnRpdHkuZ2V0RFRERW50aXR5KCkuZ2V0RFRERmlsZSgpLmZpbmROb3RhdGlvbihuYW1lKTsKLQkvLyBpZiAoYU5vdGF0aW9uICE9IG51bGwpCi0JLy8gewotCS8vIHJldHVybiBhTm90YXRpb247Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyAvLwotCS8vIC8vIENyZWF0ZSBhIG5vdGF0aW9uIGZvciB0aGUgcmVmZXJlbmNlCi0JLy8gLy8KLQkvLyBpZiAoY3JlYXRlKQotCS8vIHsKLQkvLyBhTm90YXRpb24gPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRETm90YXRpb24oKTsKLQkvLyBkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChhTm90YXRpb24pOwotCS8vIGFOb3RhdGlvbi5zZXROYW1lKG5hbWUpOwotCS8vIH0KLQkvLyByZXR1cm4gYU5vdGF0aW9uOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIFRoZSBTeXN0ZW1JRCBhdHRyaWJ1dGUgaXMgc2V0IHRvIHdoYXRldmVyIHRoZSB1c2VyIGVudGVycwotCS8vICogZS5nLiBjb20vaWJtL2IyYi94bWltb2RlbHMveHh4LmR0ZC54bWkKLQkvLyAqCi0JLy8gKiBJbiB0aGUgdW5wYXJzZSgpIG1ldGhvZCwgcGFyc2Ugb3V0IHRoZSBEVEQgZmlsZSBuYW1lIGZyb20KLQkvLyAqIHRoZSBjbGFzc3BhdGggbmFtZS4KLQkvLyAqIGUuZy4gcmV0dXJucyB4eHguZHRkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTeXN0ZW1JREdlbihEVERFeHRlcm5hbEVudGl0eSBleHRFbnRpdHksCi0JLy8gRW50aXR5RGVjbCBlbnRpdHlEZWNsKSB7Ci0JLy8KLQkvLyBTdHJpbmcgc3lzdGVtSWQgPSBlbnRpdHlEZWNsLmdldFN5c3RlbUlkKCk7Ci0JLy8gU3RyaW5nIHB1YmxpY0lkID0gZW50aXR5RGVjbC5nZXRQdWJsaWNJZCgpOwotCS8vIGlmIChzeXN0ZW1JZCAhPSBudWxsKQotCS8vIHsKLQkvLyBJZFJlc29sdmVyIGlkUmVzb2x2ZXIgPSBuZXcgSWRSZXNvbHZlckltcGwoZHRkLmdldE5hbWUoKSk7Ci0JLy8gU3RyaW5nIHVyaSA9IGlkUmVzb2x2ZXIucmVzb2x2ZUlkKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JLy8gRXh0ZXJuYWxEVERNb2RlbCBlZCA9IGR0ZFV0aWwuZ2V0RXh0ZXJuYWxEVERNb2RlbChyZXNvdXJjZXMsIHVyaSk7Ci0JLy8gaWYgKGVkICE9IG51bGwpCi0JLy8gewotCS8vIERUREZpbGUgcmVmZXJlbmNlRHRkRmlsZSA9IGVkLmdldEV4dGVybmFsRFRERmlsZSgpOwotCS8vIGV4dEVudGl0eS5zZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKHJlZmVyZW5jZUR0ZEZpbGUpOwotCS8vIGV4dEVudGl0eS5zZXRTeXN0ZW1JRChzeXN0ZW1JZCk7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gaWYgKGVudGl0eURlY2wuZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gRXJyb3JNZXNzYWdlIGR0ZEVycm9yID0gbmV3IEVycm9yTWVzc2FnZSgpOwotCS8vIGR0ZEVycm9yLnNldEVycm9yTWVzc2FnZShEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfRVJST1JfSU5DTF9GSUxFX0xPQURfRkFJTFVSRSIpCi0JLy8gKyAiICciICsgc3lzdGVtSWQgKyAiJyIpOwotCS8vIGFkZEVycm9yTWVzc2FnZShkdGRFcnJvciwgZXh0RW50aXR5LmdldERUREVudGl0eSgpKTsKLQkvLyB9Ci0JLy8gICAgICAgIAotCS8vIGlmIChzeXN0ZW1JZCAhPSBudWxsKQotCS8vIHsKLQkvLyBleHRFbnRpdHkuc2V0U3lzdGVtSUQoc3lzdGVtSWQpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIGV4dEVudGl0eS5zZXRTeXN0ZW1JRCgiIik7Ci0JLy8gfQotCS8vIH0KLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gLy8gc2V0IHRoZSBzeXN0ZW0gaWQgdG8gYmUgIiIKLQkvLyBleHRFbnRpdHkuc2V0U3lzdGVtSUQoIiIpOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERW50aXR5IGNyZWF0ZURUREVudGl0eUdlbihFbnRpdHlEZWNsIGVudGl0eSkgewotCS8vCi0JLy8gLy8gY3JlYXRlIGFuZCBkbyB3aGF0IHdlIGNhbiB0byBmaWxsIGluIHNvbWUgYmFzaWMgdGhpbmdzCi0JLy8gRFRERW50aXR5IGR0ZEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnRpdHkoKTsKLQkvLyBkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChkdGRFbnRpdHkpOwotCS8vCi0JLy8KLQkvLyBkdGRFbnRpdHkuc2V0TmFtZShlbnRpdHkuZ2V0Tm9kZU5hbWUoKSk7Ci0JLy8gZHRkRW50aXR5LnNldFBhcmFtZXRlckVudGl0eShlbnRpdHkuaXNQYXJhbWV0ZXIoKSk7Ci0JLy8gaWYgKGVudGl0eS5nZXRDb21tZW50KCkhPW51bGwpCi0JLy8gewotCS8vIGR0ZEVudGl0eS5zZXRDb21tZW50KGVudGl0eS5nZXRDb21tZW50KCkpOwotCS8vIH0KLQkvLyBpZiAoZW50aXR5LmdldEVycm9yTWVzc2FnZSgpIT1udWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZW50aXR5LmdldEVycm9yTWVzc2FnZSgpLCBkdGRFbnRpdHkpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gcmV0dXJuIGR0ZEVudGl0eTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hFbGVtZW50RGVjbEdlbihEVERFbGVtZW50IGR0ZEVsZW1lbnQsIEVsZW1lbnREZWNsCi0JLy8gZWQpIHsKLQkvLwotCS8vIGR0ZEVsZW1lbnQuc2V0TmFtZShlZC5nZXROb2RlTmFtZSgpKTsKLQkvLwotCS8vCi0JLy8gQ01Ob2RlIGNtTm9kZSA9IGVkLmdldENvbnRlbnRNb2RlbE5vZGUoKTsKLQkvLwotCS8vCi0JLy8gaWYgKGVkLmdldENvbW1lbnQoKSE9bnVsbCkKLQkvLyB7Ci0JLy8gZHRkRWxlbWVudC5zZXRDb21tZW50KGVkLmdldENvbW1lbnQoKSk7Ci0JLy8gfQotCS8vIGlmIChlZC5nZXRFcnJvck1lc3NhZ2UoKSE9bnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVkLmdldEVycm9yTWVzc2FnZSgpLCBkdGRFbGVtZW50KTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGlmIChjbU5vZGUgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkKLQkvLyB7Ci0JLy8gQ01CYXNpY05vZGUgYm4gPSAoQ01CYXNpY05vZGUpY21Ob2RlOwotCS8vIHN3aXRjaCAoYm4uZ2V0VHlwZSgpKQotCS8vIHsKLQkvLyBjYXNlIENNTm9kZVR5cGUuRU1QVFkgOgotCS8vIERUREVtcHR5Q29udGVudCBlbXB0eUNvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQ01Ob2RlVHlwZS5BTlkgOgotCS8vIERUREFueUNvbnRlbnQgYW55Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERBbnlDb250ZW50KCk7Ci0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KGFueUNvbnRlbnQpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIENNTm9kZVR5cGUuUENEQVRBOgotCS8vIERURFBDRGF0YUNvbnRlbnQgcGNEYXRhID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURURFBDRGF0YUNvbnRlbnQoKTsKLQkvLyBkdGRFbGVtZW50LnNldENvbnRlbnQocGNEYXRhKTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIH0KLQkvLyBlbHNlIGlmIChjbU5vZGUgaW5zdGFuY2VvZiBDTVJlZmVyZW5jZU5vZGUpCi0JLy8gewotCS8vIENNUmVmZXJlbmNlTm9kZSBybiA9IChDTVJlZmVyZW5jZU5vZGUpIGNtTm9kZTsKLQkvLyBpZiAocm4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRSkKLQkvLyB7Ci0JLy8gU3RyaW5nIGVudGl0eU5hbWUgPSBybi5nZXROYW1lKCkudHJpbSgpOwotCS8vCi0JLy8KLQkvLyBEVERFbnRpdHkgYW5FbnRpdHkgPSAoRFRERW50aXR5KSBkdGRVdGlsLmdldFBFUG9vbCgpLmdldChlbnRpdHlOYW1lKTsKLQkvLyBpZiAoYW5FbnRpdHkhPW51bGwpCi0JLy8gewotCS8vIC8vCi0JLy8gLy8gQ3JlYXRlIGFuIERUREVudGl0eVJlZmVyZW5jZSBhbmQgc2V0IGl0cyByZWZlcmVuY2VkIGVsZW1lbnQKLQkvLyAvLwotCS8vIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZW5SZWYgPQotCS8vIGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCk7Ci0JLy8gZW5SZWYuc2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoYW5FbnRpdHkpOwotCS8vCi0JLy8gRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPQotCS8vIERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShybikpOwotCS8vIGVuUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCS8vCi0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KGVuUmVmKTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsgLy8gY3JlYXRlIGRlZmF1bHQgY29udGVudAotCS8vIERUREVtcHR5Q29udGVudCBlbXB0eUNvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JLy8gfQotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIC8vCi0JLy8gLy8gRmluZCB0aGUgcmVhbCBlbGVtZW50IGZvciB0aGlzIGVsZW1lbnQgcmVmZXJlbmNlcwotCS8vIC8vIElmIHRoZSByZWFsIGVsZW1lbnQgZG9lcyBub3QgeWV0IGV4aXN0LCBjcmVhdGUgaXQKLQkvLyAvLwotCS8vIERUREVsZW1lbnQgYW5FbGVtZW50ID0gY3JlYXRlT3JGaW5kRWxlbWVudChybi5nZXROYW1lKCksIGR0ZEVsZW1lbnQpOwotCS8vCi0JLy8KLQkvLyAvLwotCS8vIC8vIENyZWF0ZSBhbiBEVERFbGVtZW50UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQgZWxlbWVudAotCS8vIC8vCi0JLy8gRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZWxlbVJlZiA9Ci0JLy8gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0JLy8gZWxlbVJlZi5zZXRSZWZlcmVuY2VkRWxlbWVudChhbkVsZW1lbnQpOwotCS8vCi0JLy8gRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPQotCS8vIERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShybikpOwotCS8vIGVsZW1SZWYuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0JLy8KLQkvLyAvLyBzZXRDb250ZW50IHRvIERUREVsZW1lbnRSZWZlcmVuY2UKLQkvLyBkdGRFbGVtZW50LnNldENvbnRlbnQoZWxlbVJlZik7Ci0JLy8KLQkvLwotCS8vIH0KLQkvLyB9Ci0JLy8gZWxzZSBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpCi0JLy8gewotCS8vIENNR3JvdXBOb2RlIGdycE5vZGUgPSAoQ01Hcm91cE5vZGUpY21Ob2RlOwotCS8vIERUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRER3JvdXBDb250ZW50KCk7Ci0JLy8gRFRER3JvdXBLaW5kIGdyb3VwS2luZCA9Ci0JLy8gRFRER3JvdXBLaW5kLmdldChjb21wdXRlTW9mR3JvdXBLaW5kKGdycE5vZGUuZ2V0R3JvdXBLaW5kKCkpKTsKLQkvLyBncm91cENvbnRlbnQuc2V0R3JvdXBLaW5kKGdyb3VwS2luZCk7Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPQotCS8vIERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShncnBOb2RlKSk7Ci0JLy8gZ3JvdXBDb250ZW50LnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCS8vCi0JLy8gLy8ganVzdCB1c2UgdGhlIGxvY2F0b3IgZm9yIHRoZSBlbGVtZW50IGFzIHRoZSBjbG9zZXN0IGd1ZXNzCi0JLy8gcHJvY2Vzc0dyb3VwQ29udGVudChncm91cENvbnRlbnQsIGdycE5vZGUpOwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChncm91cENvbnRlbnQpOwotCS8vIH0KLQkvLyBlbHNlIGlmIChjbU5vZGUgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gLy8gYmFkIHRoaW5nIGhhcHBlbmVkIGhlcmUsIGp1c3QgY3JlYXRlIGEgcGNkYXRhCi0JLy8gRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkvLyBkdGRFbGVtZW50LnNldENvbnRlbnQoZW1wdHlDb250ZW50KTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQWRkIGEgbmV3IGdyb3VwIHRvIHRoZSBjdXJyZW50IGdyb3VwCi0JLy8gKiBAcGFyYW0gcGFyZW50IC0gdGhlIHBhcmVudCBub2RlIGZvciB0aGlzIGdyb3VwIGVsZW1lbnQKLQkvLyAqIEBwYXJhbSBvcDFOb2RlIC0gdGhlIGdyb3VwCi0JLy8gKiBlLmcuIChhLGIpCi0JLy8gKiBAcGFyYW0gb3AyTm9kZSAtIHNldCBvbmx5IGlmIGNhbGxlZCBieSBwcm9jZXNzQ00xb3AKLQkvLyAqIGUuZy4gKGEsYikrCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzR3JvdXBDb250ZW50R2VuKERUREdyb3VwQ29udGVudCBwYXJlbnQsCi0JLy8gQ01Hcm91cE5vZGUgZ3JwTm9kZSkgewotCS8vCi0JLy8gRW51bWVyYXRpb24gY2hpbGRyZW4gPSBncnBOb2RlLmdldENoaWxkcmVuKCkuZWxlbWVudHMoKTsKLQkvLyBEVERGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0JLy8gd2hpbGUgKGNoaWxkcmVuLmhhc01vcmVFbGVtZW50cygpKQotCS8vIHsKLQkvLyBDTU5vZGUgY25vZGUgPSAoQ01Ob2RlKSBjaGlsZHJlbi5uZXh0RWxlbWVudCgpOwotCS8vCi0JLy8KLQkvLyBpZiAoY25vZGUgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkKLQkvLyB7Ci0JLy8gQ01Hcm91cE5vZGUgZ05vZGUgPSAoQ01Hcm91cE5vZGUpY25vZGU7Ci0JLy8gRFRER3JvdXBDb250ZW50IGdyb3VwQ29udGVudCA9IGZhY3RvcnkuY3JlYXRlRFRER3JvdXBDb250ZW50KCk7Ci0JLy8gRFRER3JvdXBLaW5kIGdyb3VwS2luZCA9Ci0JLy8gRFRER3JvdXBLaW5kLmdldChjb21wdXRlTW9mR3JvdXBLaW5kKGdOb2RlLmdldEdyb3VwS2luZCgpKSk7Ci0JLy8gZ3JvdXBDb250ZW50LnNldEdyb3VwS2luZChncm91cEtpbmQpOwotCS8vIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0KLQkvLyBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2UoZ05vZGUpKTsKLQkvLyBncm91cENvbnRlbnQuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0JLy8KLQkvLyBwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChncm91cENvbnRlbnQpOwotCS8vIHByb2Nlc3NHcm91cENvbnRlbnQoZ3JvdXBDb250ZW50LGdOb2RlKTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAoY25vZGUgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkKLQkvLyB7Ci0JLy8gQ01CYXNpY05vZGUgbiA9IChDTUJhc2ljTm9kZSljbm9kZTsKLQkvLyBpZiAobi5nZXRUeXBlKCkgPT0gQ01Ob2RlVHlwZS5QQ0RBVEEpCi0JLy8gewotCS8vIC8vIENyZWF0ZSBhIERURFBDRGF0YUNvbnRlbnQgZm9yIGEgbGVhZiBQQ0RhdGEgbm9kZQotCS8vIC8vCi0JLy8gRFREUENEYXRhQ29udGVudCBwY0RhdGEgPSBmYWN0b3J5LmNyZWF0ZURURFBDRGF0YUNvbnRlbnQoKTsKLQkvLyAvLyBBZGQgI1BDREFUQSB0byB0aGUgR3JvdXAsIGkuZSBNaXhlZCBjb250ZW50IG1vZGVsCi0JLy8gcGFyZW50LmdldENvbnRlbnQoKS5hZGQocGNEYXRhKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGVsc2UgaWYgKGNub2RlIGluc3RhbmNlb2YgQ01SZWZlcmVuY2VOb2RlKQotCS8vIHsKLQkvLyBDTVJlZmVyZW5jZU5vZGUgcm4gPSAoQ01SZWZlcmVuY2VOb2RlKWNub2RlOwotCS8vIGlmIChybi5nZXRUeXBlKCk9PUNNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0UpCi0JLy8gewotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ00gRWxlbWVudCBSZWYgbmFtZTogIiArIHJuLmdldE5hbWUoKSk7Ci0JLy8gLy8KLQkvLyAvLyBDcmVhdGUgYW4gRFRERWxlbWVudFJlZmVyZW5jZSBhbmQgc2V0IGl0cyByZWZlcmVuY2VkIGVsZW1lbnQKLQkvLyAvLwotCS8vIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1SZWYgPQotCS8vIGZhY3RvcnkuY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKTsKLQkvLwotCS8vCi0JLy8gLy8KLQkvLyAvLyBGaW5kIHRoZSByZWFsIGVsZW1lbnQgZm9yIHRoaXMgZWxlbWVudCByZWZlcmVuY2VzCi0JLy8gLy8gSWYgdGhlIHJlYWwgZWxlbWVudCBkb2VzIG5vdCB5ZXQgZXhpc3QsIGNyZWF0ZSBpdAotCS8vIC8vCi0JLy8gRFRERWxlbWVudCBhbkVsZW1lbnQgPSBjcmVhdGVPckZpbmRFbGVtZW50KHJuLmdldE5hbWUoKSwgZWxlbVJlZik7Ci0JLy8KLQkvLwotCS8vIGVsZW1SZWYuc2V0UmVmZXJlbmNlZEVsZW1lbnQoYW5FbGVtZW50KTsKLQkvLyBEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKHJuKSk7Ci0JLy8gZWxlbVJlZi5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQkvLwotCS8vIC8vIEFkZCBEVERFbGVtZW50UmVmZXJlbmNlIHRvIHRoZSBHcm91cAotCS8vIHBhcmVudC5nZXRDb250ZW50KCkuYWRkKGVsZW1SZWYpOwotCS8vIH0KLQkvLyBlbHNlIC8vIFBFIFJlZmVyZW5jZQotCS8vIHsKLQkvLyBTdHJpbmcgZW50aXR5TmFtZSA9IHJuLmdldE5hbWUoKS50cmltKCk7Ci0JLy8KLQkvLwotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ00gUEUgUmVmIG5hbWU6ICIgKyBlbnRpdHlOYW1lKTsKLQkvLyBEVERFbnRpdHkgYW5FbnRpdHkgPSAoRFRERW50aXR5KSBkdGRVdGlsLmdldFBFUG9vbCgpLmdldChlbnRpdHlOYW1lKTsKLQkvLyBpZiAoYW5FbnRpdHkhPW51bGwpCi0JLy8gewotCS8vIC8vCi0JLy8gLy8gQ3JlYXRlIGFuIERUREVudGl0eVJlZmVyZW5jZSBhbmQgc2V0IGl0cyByZWZlcmVuY2VkIGVsZW1lbnQKLQkvLyAvLwotCS8vIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZW5SZWYgPQotCS8vIGZhY3RvcnkuY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCS8vIGVuUmVmLnNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KGFuRW50aXR5KTsKLQkvLyAgICAgICAgICAgICAKLQkvLyBEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKHJuKSk7Ci0JLy8gZW5SZWYuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0JLy8KLQkvLwotCS8vIC8vIEFkZCBEVERFbnRpdHlSZWZlcmVuY2UgdG8gdGhlIEdyb3VwCi0JLy8gcGFyZW50LmdldENvbnRlbnQoKS5hZGQoZW5SZWYpOwotCS8vCi0JLy8KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogRmluZCB0aGUgcmVhbCBlbGVtZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieSB0aGUgY3VycmVudCBlbGVtZW50Ci0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERWxlbWVudCBjcmVhdGVPckZpbmRFbGVtZW50R2VuKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqKSB7Ci0JLy8KLQkvLyAvLyBEVERFbGVtZW50IGFFbGVtZW50ID0gZ2V0RFRERmlsZSgpLmZpbmRFbGVtZW50KG5hbWUpOwotCS8vCi0JLy8KLQkvLyBEVERFbGVtZW50IGFFbGVtZW50ID0gKERUREVsZW1lbnQpIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQobmFtZSk7Ci0JLy8KLQkvLwotCS8vIGlmIChhRWxlbWVudCAhPSBudWxsKQotCS8vIHsKLQkvLyByZXR1cm4gYUVsZW1lbnQ7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBTdHJpbmcgZXJyb3JNc2cgPQotCS8vIERURENvcmVNZXNzYWdlcy5nZXRTdHJpbmcoIl9FUlJPUl9VTkRFQ0xBUkVEX0VMRU1FTlRfMSIpOwotCS8vIGVycm9yTXNnICs9ICJcIiIgKyBuYW1lICsgIlwiIjsKLQkvLyBlcnJvck1zZyArPQotCS8vIERURENvcmVNZXNzYWdlcy5nZXRTdHJpbmcoIl9VSV9FUlJPUlBBUlRfVU5ERUNMQVJFRF9FTEVNRU5UXzIiKTsKLQkvLwotCS8vCi0JLy8gRXJyb3JNZXNzYWdlIGR0ZEVycm9yID0gbmV3IEVycm9yTWVzc2FnZSgpOwotCS8vICAgICAKLQkvLyBkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNc2cpOwotCS8vIGFkZEVycm9yTWVzc2FnZShkdGRFcnJvciwgb2JqKTsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oZXJyb3JNc2cpOwotCS8vIC8vIHNldERUREVycm9yTWVzc2FnZShlcnJvck1zZyk7Ci0JLy8gZ2V0RFRERmlsZSgpLnNldFBhcnNlRXJyb3IodHJ1ZSk7Ci0JLy8KLQkvLwotCS8vIC8vCi0JLy8gLy8gQ3JlYXRlIGFuIGVtcHR5IGVsZW1lbnQgZm9yIHRoZSByZWZlcmVuY2UgdG8gbWFrZSBpdCB2YWxpZAotCS8vIC8vCi0JLy8KLQkvLwotCS8vIERUREZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoKTsKLQkvLyBEVERFbGVtZW50IGR0ZGVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZURUREVsZW1lbnQoKTsKLQkvLyBkdGRlbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JLy8KLQkvLwotCS8vIERUREVtcHR5Q29udGVudCBlbXB0eUNvbnRlbnQgPSBmYWN0b3J5LmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCS8vIGR0ZGVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCS8vCi0JLy8KLQkvLyBnZXREVERGaWxlKCkuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZGVsZW1lbnQpOwotCS8vIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5wdXQobmFtZSxkdGRlbGVtZW50KTsKLQkvLyByZXR1cm4gZHRkZWxlbWVudDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBDb21wdXRlIHRoZSBNT0Ygb2NjdXJyZW5jZSBmcm9tIHRoZSB4bWw0aiBvY2N1cnJlbmNlCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgaW50IGNvbXB1dGVNb2ZPY2N1cnJlbmNlR2VuKENNUmVwZWF0YWJsZU5vZGUgcm5vZGUpIHsKLQkvLwotCS8vIGludCBvY2N1cnJlbmNlID0gcm5vZGUuZ2V0T2NjdXJyZW5jZSgpOwotCS8vIGludCBtb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLk9ORTsKLQkvLwotCS8vCi0JLy8gaWYgKG9jY3VycmVuY2UgPT0gQ01Ob2RlVHlwZS5aRVJPX09SX01PUkUpCi0JLy8gewotCS8vIG1vZm9jY3VyID0gRFRET2NjdXJyZW5jZVR5cGUuWkVST19PUl9NT1JFOwotCS8vIH0KLQkvLyBlbHNlIGlmIChvY2N1cnJlbmNlID09IENNTm9kZVR5cGUuT05FX09SX01PUkUpCi0JLy8gewotCS8vIG1vZm9jY3VyID0gRFRET2NjdXJyZW5jZVR5cGUuT05FX09SX01PUkU7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKG9jY3VycmVuY2UgPT0gQ01Ob2RlVHlwZS5PUFRJT05BTCkKLQkvLyB7Ci0JLy8gbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5PUFRJT05BTDsKLQkvLyB9Ci0JLy8gcmV0dXJuIG1vZm9jY3VyOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIENvbXB1dGUgdGhlIE1PRiBtb2RlbCBncm91cCBmcm9tIHRoZSB4bWw0aiBtb2RlbCBncm91cAotCS8vICovCi0JLy8gcHJvdGVjdGVkIGludCBjb21wdXRlTW9mR3JvdXBLaW5kR2VuKGludCB0eXBlKSB7Ci0JLy8KLQkvLyBpZiAodHlwZSA9PSBDTU5vZGVUeXBlLkdST1VQX0NIT0lDRSkKLQkvLyB7Ci0JLy8gcmV0dXJuIERUREdyb3VwS2luZC5DSE9JQ0U7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gcmV0dXJuIERUREdyb3VwS2luZC5TRVFVRU5DRTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlc0dlbihEVERFbGVtZW50IGVsZW1lbnQsIEF0dGxpc3QgYXR0TGlzdCkKLQkvLyB7Ci0JLy8KLQkvLyBpZiAoYXR0TGlzdC5nZXRFcnJvck1lc3NhZ2UoKSE9bnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGF0dExpc3QuZ2V0RXJyb3JNZXNzYWdlKCksIGVsZW1lbnQpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gZm9yIChpbnQgaT0wO2k8YXR0TGlzdC5zaXplKCk7aSsrKQotCS8vIHsKLQkvLyBBdHROb2RlIGFkID0gKEF0dE5vZGUpIGF0dExpc3QuZWxlbWVudEF0KGkpOwotCS8vIC8vIERUREF0dHJpYnV0ZUVsZW1lbnQgZHRkQXR0PSBnZXREVERBdHRyaWJ1dGVFbGVtZW50KGEuZ2V0TmFtZSgpKTsKLQkvLwotCS8vCi0JLy8gLy8gb25seSBhZGQgdGhlIEF0dERlZiBpZiBpdCBpcyBub3QgYWRkZWQgeWV0Ci0JLy8gLy8gaWdub3JlIHRoZSBkdXAgQXR0RGVmIGFzIGRvY3VtZW50ZWQgaW4gdGhlIFhNTCAxLjAgc3BlY3MKLQkvLyAvL2lmKCBkdGRBdHQ9PW51bGwpCi0JLy8gYWRkQXR0cmlidXRlKGVsZW1lbnQsIGFkKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQ3JlYXRlIGEgRFREQXR0cmlidXRlIGZyb20gdGhlIHhtbDRqIGF0dHJpYnV0ZQotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlR2VuKERUREVsZW1lbnQgZHRkZWxlbWVudCwgQXR0Tm9kZSBhZCkgewotCS8vCi0JLy8gRFREQXR0cmlidXRlIGR0ZGF0dHIgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFREQXR0cmlidXRlKCk7Ci0JLy8gZHRkZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKS5hZGQoZHRkYXR0cik7Ci0JLy8gZmluaXNoQXR0cmlidXRlKGR0ZGF0dHIsIGFkKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hBdHRyaWJ1dGVHZW4oRFREQXR0cmlidXRlIGR0ZGF0dHIsIEF0dE5vZGUgYXR0ZGVmKQotCS8vIHsKLQkvLwotCS8vIGJvb2xlYW4gcGFyc2VFcnJvciA9IGZhbHNlOwotCS8vCi0JLy8KLQkvLyBpZiAoYXR0ZGVmLm5hbWUuc3RhcnRzV2l0aCgiJSIpKQotCS8vIHsKLQkvLyBTdHJpbmcgcGVOYW1lID0gYXR0ZGVmLm5hbWUudHJpbSgpOwotCS8vIERUREVudGl0eSBlbiA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KHBlTmFtZSk7Ci0JLy8gaWYgKGVuIT1udWxsKQotCS8vIHsKLQkvLyBkdGRhdHRyLnNldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KGVuKTsKLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBkdGRhdHRyLnNldE5hbWUoYXR0ZGVmLm5hbWUpOwotCS8vCi0JLy8KLQkvLyBpbnQgYXR0clR5cGUgPSBhdHRkZWYuZ2V0RGVjbGFyZWRUeXBlKCk7Ci0JLy8KLQkvLwotCS8vIGlmIChhdHRyVHlwZT09QXR0Tm9kZS5QRVJFRkVSRU5DRSAmJiBhdHRkZWYudHlwZSE9bnVsbCkKLQkvLyB7Ci0JLy8gU3RyaW5nIHBlTmFtZSA9IGF0dGRlZi50eXBlLnRyaW0oKTsKLQkvLyBEVERFbnRpdHkgZW4gPSAoRFRERW50aXR5KSBkdGRVdGlsLmdldFBFUG9vbCgpLmdldChwZU5hbWUpOwotCS8vIGlmIChlbiE9bnVsbCkKLQkvLyB7Ci0JLy8gZHRkYXR0ci5zZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eShlbik7Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9DREFUQSgpKTsgLy8gaGFjaywKLQkvLyBzbyB3ZSBjYW4gZ2V0IGJhY2sgdGhlIGRlZmF1bHQgdmFsdWUKLQkvLyB9Ci0JLy8gZWxzZSAvL3NldCBkZWZhdWx0IHR5cGUKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkpOwotCS8vCi0JLy8KLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBzd2l0Y2ggKGF0dHJUeXBlKQotCS8vIHsKLQkvLyBjYXNlIEF0dE5vZGUuQ0RBVEE6Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9DREFUQSgpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLkVOVElUSUVTOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfRU5USVRJRVMoKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5FTlRJVFk6Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9FTlRJVFkoKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5JRDoKLQkvLyAvLyBjaGVjayBmb3IgZHVwbGljYXRlIElEIGF0dHJpYnV0ZQotCS8vIGlmIChoYXNJREF0dHJpYnV0ZShkdGRhdHRyKSkKLQkvLyB7Ci0JLy8gU3RyaW5nIGVyck1zZyA9IERURENvcmVNZXNzYWdlcy5nZXRTdHJpbmcoIl9FUlJPUl9EVVBfSURfQVRUUklCVVRFXzEiKTsKLQkvLyBlcnJNc2cgKz0gYXR0ZGVmLm5hbWUgKwotCS8vIERURENvcmVNZXNzYWdlcy5nZXRTdHJpbmcoIl9VSV9FUlJPUlBBUlRfRFVQX0lEX0FUVFJJQlVURV8yIik7Ci0JLy8gLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0SUVsZW1lbnQoKS5zZXREVERFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyAvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCkuc2V0UGFyc2VFcnJvcih0cnVlKTsKLQkvLyBwYXJzZUVycm9yID0gdHJ1ZTsKLQkvLyB9Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9JRCgpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLklEUkVGOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfSURSRUYoKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5JRFJFRlM6Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9JRFJFRlMoKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5FTlVNRVJBVElPTjoKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBjcmVhdGVEVERFbnVtZXJhdGlvbihkdGRhdHRyLCBhdHRkZWYsCi0JLy8gRFRERW51bUdyb3VwS2luZC5OQU1FX1RPS0VOX0dST1VQKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5OT1RBVElPTjoKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBjcmVhdGVEVERFbnVtZXJhdGlvbihkdGRhdHRyLCBhdHRkZWYsCi0JLy8gRFRERW51bUdyb3VwS2luZC5OT1RBVElPTl9HUk9VUCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuTk1UT0tFTjoKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX05NVE9LRU4oKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5OTVRPS0VOUzoKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX05NVE9LRU5TKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBkZWZhdWx0OgotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQVRUUiAnIiArYXR0ZGVmLm5hbWUgKyAiJ1Vua25vd24gdHlwZS4uLiIgKwotCS8vIGF0dHJUeXBlKTsKLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBpbnQgYXR0ckRlZmF1bHQgPSBhdHRkZWYuZ2V0RGVmYXVsdFR5cGUoKTsKLQkvLyBpbnQgZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5JTVBMSUVEOwotCS8vIHN3aXRjaCAoYXR0ckRlZmF1bHQpCi0JLy8gewotCS8vIGNhc2UgQXR0Tm9kZS5GSVhFRDoKLQkvLyBkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLkZJWEVEOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuSU1QTElFRDoKLQkvLyBkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLklNUExJRUQ7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5SRVFVSVJFRDoKLQkvLyBkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLlJFUVVJUkVEOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuTk9GSVhFRDoKLQkvLyBkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLk5PRklYRUQ7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGRlZmF1bHQ6Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBVFRSICciICthdHRkZWYubmFtZSArICInIFVua25vd24gZGVmYXVsdAotCS8vIHR5cGUuLi4gIiArIGF0dHJEZWZhdWx0KTsKLQkvLyB9Ci0JLy8KLQkvLyBEVEREZWZhdWx0S2luZCBkZWZhdWx0S2luZE9iaiA9IERURERlZmF1bHRLaW5kLmdldChkZWZhdWx0S2luZCk7Ci0JLy8gZHRkYXR0ci5zZXREZWZhdWx0S2luZChkZWZhdWx0S2luZE9iaik7Ci0JLy8KLQkvLyBpZiAocGFyc2VFcnJvcikKLQkvLyB7Ci0JLy8gcmV0dXJuOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGF0dGRlZi5kZWZhdWx0VmFsdWU7Ci0JLy8gaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKQotCS8vIHsKLQkvLyBpZiAoYXR0clR5cGUgPT0gQXR0Tm9kZS5FTlVNRVJBVElPTiB8fCBhdHRyVHlwZSA9PSBBdHROb2RlLk5PVEFUSU9OKQotCS8vIHsKLQkvLyBpZiAoISBpc0RlZmF1bHRFbnVtVmFsdWVWYWxpZChhdHRkZWYsZGVmYXVsdFZhbHVlKSkKLQkvLyB7Ci0JLy8gU3RyaW5nIHR5cGVTdHJpbmcgPQotCS8vIChhdHRyVHlwZT09QXR0Tm9kZS5FTlVNRVJBVElPTj8iZW51bWVyYXRpb24iOiJub3RhdGlvbiIpOwotCS8vIFN0cmluZyBlcnJNc2cgPQotCS8vIERURENvcmVNZXNzYWdlcy5nZXRTdHJpbmcoIl9FUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8xIik7Ci0JLy8gZXJyTXNnICs9IHR5cGVTdHJpbmcgKwotCS8vIERURENvcmVNZXNzYWdlcy5nZXRTdHJpbmcoIl9VSV9FUlJPUlBBUlRfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMiIpOwotCS8vIGVyck1zZyArPSBhdHRkZWYubmFtZSArICInIjsKLQkvLwotCS8vCi0JLy8gLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0SUVsZW1lbnQoKS5zZXREVERFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyAvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCkuc2V0UGFyc2VFcnJvcih0cnVlKTsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vIH0KLQkvLyBkdGRhdHRyLnNldERlZmF1bHRWYWx1ZVN0cmluZyhkZWZhdWx0VmFsdWUpOwotCS8vIH0KLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREF0dHIgLSB0b01vZiBnZXREZWZhdWx0VmFsdWVTdHJpbmcgIiArCi0JLy8gZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkpOwotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQXR0ciAtIHRvTW9mIGdldERlZmF1bHRWYWx1ZTogIiArCi0JLy8gZ2V0RGVmYXVsdFZhbHVlKCkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIGhhc0lEQXR0cmlidXRlR2VuKERUREF0dHJpYnV0ZSBkdGRhdHRyKSB7Ci0JLy8KLQkvLyBib29sZWFuIGhhc0lEID0gZmFsc2U7Ci0JLy8KLQkvLwotCS8vIERUREVsZW1lbnQgZWxlbWVudCA9IGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpOwotCS8vIEVMaXN0IGF0dHJzID0gZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKTsKLQkvLwotCS8vCi0JLy8gSXRlcmF0b3IgaSA9IGF0dHJzLml0ZXJhdG9yKCk7Ci0JLy8gd2hpbGUgKGkuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBEVERBdHRyaWJ1dGUgYXR0ciA9IChEVERBdHRyaWJ1dGUpIGkubmV4dCgpOwotCS8vIERURFR5cGUgZFR5cGUgPSBhdHRyLmdldERURFR5cGUoKTsKLQkvLyBpZiAoZFR5cGUgaW5zdGFuY2VvZiBEVERCYXNpY1R5cGUpCi0JLy8gewotCS8vIGlmICggKChEVERCYXNpY1R5cGUpZFR5cGUpLmdldEtpbmQoKS5nZXRWYWx1ZSgpID09IERUREJhc2ljVHlwZUtpbmQuSUQpCi0JLy8gewotCS8vIGhhc0lEID0gdHJ1ZTsKLQkvLyBicmVhazsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gaGFzSUQ7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREVudW1lcmF0aW9uVHlwZSBjcmVhdGVEVERFbnVtZXJhdGlvbkdlbihEVERBdHRyaWJ1dGUKLQkvLyBkdGRhdHRyLCBTdHJpbmdbXSBlbnVtVmFsdWVzLCBpbnQgZW51bUtpbmQpIHsKLQkvLwotCS8vIERUREVudW1lcmF0aW9uVHlwZSBlbnVtID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpOwotCS8vIC8vIFRoaXMgaXMgZ3Jvc3MsIGJ1dCB0aGlzIGlzIHdoYXQgd2FzIGRvbmUgYmVmb3JlLgotCS8vIERUREF0dHJpYnV0ZUltcGwgZHRkYXR0cmltcGwgPSAoRFREQXR0cmlidXRlSW1wbCkgZHRkYXR0cjsKLQkvLyAvLyBlbnVtLnNldElEKCJFbnVtXyIgKwotCS8vICgoRFRERWxlbWVudClkdGRhdHRyaW1wbC5nZXRNT0ZEb21haW4oKSkuZ2V0TmFtZSgpICsgIl8iICsKLQkvLyBkdGRhdHRyLmdldE5hbWUoKSk7Ci0JLy8gRFRERW51bUdyb3VwS2luZCBncm91cEtpbmQgPSBEVERFbnVtR3JvdXBLaW5kLmdldChlbnVtS2luZCk7Ci0JLy8gZW51bS5zZXRLaW5kKGdyb3VwS2luZCk7Ci0JLy8gLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JLy8gaWYgKGVudW1WYWx1ZXMhPW51bGwpCi0JLy8gewotCS8vIGZvcihpbnQgaT0wO2k8ZW51bVZhbHVlcy5sZW5ndGg7aSsrKQotCS8vIHsKLQkvLyBFRW51bUxpdGVyYWwgZW51bUxpdGVyYWwgPSBjcmVhdGVFRW51bUxpdGVyYWwoKTsKLQkvLyAvLyBlbnVtVmFsLnNldFhNSURvY3VtZW50KGR0ZGF0dHIuZ2V0WE1JRG9jdW1lbnQoKSk7Ci0JLy8gZW51bUxpdGVyYWwucmVmU2V0TGl0ZXJhbChlbnVtVmFsdWVzW2ldKTsKLQkvLyAvLyBlbnVtTGl0ZXJhbC5zZXROdW1iZXIoaSk7Ci0JLy8gZW51bS5nZXRFbnVtTGl0ZXJhbHMoKS5hZGQoZW51bUxpdGVyYWwpOwotCS8vIH0KLQkvLyB9Ci0JLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLmdldERUREVudW1lcmF0aW9uVHlwZSgpLmFkZChlbnVtKTsKLQkvLyByZXR1cm4gZW51bTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRUVudW1MaXRlcmFsIGNyZWF0ZUVFbnVtTGl0ZXJhbEdlbigpIHsKLQkvLwotCS8vIEVjb3JlUGFja2FnZSBlUGFja2FnZSA9Ci0JLy8gKEVjb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0JLy8gcmV0dXJuICgoRWNvcmVGYWN0b3J5KWVQYWNrYWdlLmdldEZhY3RvcnkoKSkuY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREVudW1lcmF0aW9uVHlwZSBjcmVhdGVEVERFbnVtZXJhdGlvbkdlbihEVERBdHRyaWJ1dGUKLQkvLyBkdGRhdHRyLCBBdHROb2RlIGF0dGRlZiwgaW50IGVudW1LaW5kKSB7Ci0JLy8KLQkvLyBEVERFbnVtZXJhdGlvblR5cGUgZW51bSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQkvLyAvLyBUaGlzIGlzIGdyb3NzLCBidXQgdGhpcyBpcyB3aGF0IHdhcyBkb25lIGJlZm9yZS4KLQkvLyBEVERBdHRyaWJ1dGVJbXBsIGR0ZGF0dHJpbXBsID0gKERUREF0dHJpYnV0ZUltcGwpIGR0ZGF0dHI7Ci0JLy8gLy8gZW51bS5zZXRJRCgiRW51bV8iICsKLQkvLyAoKERUREVsZW1lbnQpZHRkYXR0cmltcGwuZ2V0TU9GRG9tYWluKCkpLmdldE5hbWUoKSArICJfIiArCi0JLy8gZHRkYXR0ci5nZXROYW1lKCkpOwotCS8vIERUREVudW1Hcm91cEtpbmQgZ3JvdXBLaW5kID0gRFRERW51bUdyb3VwS2luZC5nZXQoZW51bUtpbmQpOwotCS8vIGVudW0uc2V0S2luZChncm91cEtpbmQpOwotCS8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5nZXREVERFbnVtZXJhdGlvblR5cGUoKS5hZGQoZW51bSk7Ci0JLy8KLQkvLwotCS8vIC8vIEVudW1lcmF0aW9uIHZhbHVlcwotCS8vIEVudW1lcmF0aW9uIHRva2VuSXRlciA9IGF0dGRlZi5lbGVtZW50cygpOwotCS8vIGlmICh0b2tlbkl0ZXIgIT0gbnVsbCkgewotCS8vIGludCBpPTA7Ci0JLy8gd2hpbGUgKHRva2VuSXRlci5oYXNNb3JlRWxlbWVudHMoKSkKLQkvLyB7Ci0JLy8gU3RyaW5nIHZhbCA9IChTdHJpbmcpdG9rZW5JdGVyLm5leHRFbGVtZW50KCk7Ci0JLy8gRUVudW1MaXRlcmFsIGVudW1MaXRlcmFsID0gY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JLy8gLy8gZW51bUxpdGVyYWwuc2V0WE1JRG9jdW1lbnQoZHRkYXR0ci5nZXRYTUlEb2N1bWVudCgpKTsKLQkvLyAgICAgICAgCi0JLy8KLQkvLyBlbnVtTGl0ZXJhbC5yZWZTZXRMaXRlcmFsKHZhbCk7Ci0JLy8gLy8gZW51bUxpdGVyYWwuc2V0TnVtYmVyKGkrKyk7Ci0JLy8gZW51bS5nZXRFbnVtTGl0ZXJhbHMoKS5hZGQoZW51bUxpdGVyYWwpOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHJldHVybiBlbnVtOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdEVudW1WYWx1ZVZhbGlkR2VuKEF0dE5vZGUgYXR0ZGVmLCBTdHJpbmcKLQkvLyBkZWZhdWx0VmFsdWUpIHsKLQkvLwotCS8vIGJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQkvLyBib29sZWFuIGNvbnRhaW5zUGVyY2VudCA9IGZhbHNlOwotCS8vCi0JLy8KLQkvLyAvLyBFbnVtZXJhdGlvbiB2YWx1ZXMKLQkvLyBFbnVtZXJhdGlvbiBlbnVtVmFsdWVzID0gYXR0ZGVmLmVsZW1lbnRzKCk7Ci0JLy8gd2hpbGUgKGVudW1WYWx1ZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0JLy8gewotCS8vIFN0cmluZyB2YWwgPSAoU3RyaW5nKWVudW1WYWx1ZXMubmV4dEVsZW1lbnQoKTsKLQkvLyBpZiAodmFsLmVxdWFscyhkZWZhdWx0VmFsdWUpKQotCS8vIHsKLQkvLyB2YWxpZCA9IHRydWU7Ci0JLy8gYnJlYWs7Ci0JLy8gfQotCS8vIGlmICh2YWwuaW5kZXhPZignJScpID49IDApCi0JLy8gewotCS8vIGNvbnRhaW5zUGVyY2VudCA9IHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gdmFsaWQgfHwgY29udGFpbnNQZXJjZW50OwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHNldEF0dHJEVERUeXBlR2VuKERUREF0dHJpYnV0ZSBkdGRhdHRyLCBEVERUeXBlIHR5cGUpIHsKLQkvLwotCS8vIGR0ZGF0dHIuc2V0RFREVHlwZSh0eXBlKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvck1lc3NhZ2VHZW4oRXJyb3JNZXNzYWdlIGVyck1zZywgT2JqZWN0IG9iaikgewotCS8vCi0JLy8gZXJyTXNnLnNldE9iamVjdChvYmopOwotCS8vIGR0ZFV0aWwuYWRkRXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE9iamVjdEZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE9iamVjdEZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjRhMzE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERPYmplY3RGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREU291cmNlT2Zmc2V0OwotCi1wdWJsaWMgY2xhc3MgRFRET2JqZWN0RmluZGVyIGV4dGVuZHMgRFREVmlzaXRvciB7Ci0JcHVibGljIGNsYXNzIFNvdXJjZU9mZnNldCB7Ci0JCS8vIENvbnZlbmllbmNlIGNsYXNzIHRvIGZpbmQgY29udGFpbm1lbnQgb2Ygb2JqZWN0Ci0JCXByaXZhdGUgaW50IHN0YXJ0LCBlbmQ7Ci0KLQkJcHVibGljIFNvdXJjZU9mZnNldChpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCXRoaXMuc3RhcnQgPSBzdGFydDsKLQkJCXRoaXMuZW5kID0gZW5kOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoU291cmNlT2Zmc2V0IG90aGVyKSB7Ci0JCQlpZiAodGhpcy5zdGFydCA8PSBvdGhlci5zdGFydCAmJiBvdGhlci5zdGFydCA8PSB0aGlzLmVuZCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JfQotCi0JU291cmNlT2Zmc2V0IHNlYXJjaExvY2F0aW9uOwotCi0JcHJpdmF0ZSBTb3VyY2VPZmZzZXQgb2Zmc2V0T2JqZWN0Rm9yKERURFNvdXJjZU9mZnNldCBzKSB7Ci0JCXJldHVybiBuZXcgU291cmNlT2Zmc2V0KHMuZ2V0U3RhcnRPZmZzZXQoKSwgcy5nZXRFbmRPZmZzZXQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ29udGFpbm1lbnQoRFRET2JqZWN0IG8pIHsKLQkJaWYgKG9mZnNldE9iamVjdEZvcigoRFREU291cmNlT2Zmc2V0KSBvKS5jb250YWlucyhzZWFyY2hMb2NhdGlvbikpIHsKLQkJCWNsb3Nlc3RPYmplY3QgPSBvOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCX0KLQotCXB1YmxpYyBEVERPYmplY3RGaW5kZXIoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgZW5kT2Zmc2V0KSB7Ci0JCXNlYXJjaExvY2F0aW9uID0gbmV3IFNvdXJjZU9mZnNldChzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURE5vdGF0aW9uKERURE5vdGF0aW9uIG5vdGF0aW9uKSB7Ci0JCWNoZWNrQ29udGFpbm1lbnQobm90YXRpb24pOwotCQlzdXBlci52aXNpdERURE5vdGF0aW9uKG5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVudGl0eShEVERFbnRpdHkgZW50aXR5KSB7Ci0JCWNoZWNrQ29udGFpbm1lbnQoZW50aXR5KTsKLQkJc3VwZXIudmlzaXREVERFbnRpdHkoZW50aXR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnQoRFRERWxlbWVudCBlbGVtZW50KSB7Ci0JCWNoZWNrQ29udGFpbm1lbnQoZWxlbWVudCk7Ci0JCXN1cGVyLnZpc2l0RFRERWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREF0dHJpYnV0ZShEVERBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCWNoZWNrQ29udGFpbm1lbnQoYXR0cmlidXRlKTsKLQkJc3VwZXIudmlzaXREVERBdHRyaWJ1dGUoYXR0cmlidXRlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eSkgewotCQljaGVja0NvbnRhaW5tZW50KHBhcm1FbnRpdHkpOwotCQlzdXBlci52aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShwYXJtRW50aXR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnRDb250ZW50KERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQkJY2hlY2tDb250YWlubWVudChjb250ZW50KTsKLQkJc3VwZXIudmlzaXREVERFbGVtZW50Q29udGVudChjb250ZW50KTsKLQl9Ci0KLQlwcml2YXRlIERURE9iamVjdCBjbG9zZXN0T2JqZWN0ID0gbnVsbDsKLQotCXB1YmxpYyBEVERPYmplY3QgZ2V0Q2xvc2VzdE9iamVjdCgpIHsKLQkJcmV0dXJuIGNsb3Nlc3RPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTb3VyY2VPZmZzZXQgb2Zmc2V0T2JqZWN0Rm9yR2VuKERURFNvdXJjZU9mZnNldCBzKSB7Ci0KLQkJcmV0dXJuIG5ldyBTb3VyY2VPZmZzZXQocy5nZXRTdGFydE9mZnNldCgpLCBzLmdldEVuZE9mZnNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tDb250YWlubWVudEdlbihEVERPYmplY3QgbykgewotCi0JCWlmIChvZmZzZXRPYmplY3RGb3IoKERURFNvdXJjZU9mZnNldCkgbykuY29udGFpbnMoc2VhcmNoTG9jYXRpb24pKSB7Ci0JCQljbG9zZXN0T2JqZWN0ID0gbzsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVEROb3RhdGlvbkdlbihEVEROb3RhdGlvbiBub3RhdGlvbikgewotCi0JCWNoZWNrQ29udGFpbm1lbnQobm90YXRpb24pOwotCQlzdXBlci52aXNpdERURE5vdGF0aW9uKG5vdGF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbnRpdHlHZW4oRFRERW50aXR5IGVudGl0eSkgewotCi0JCWNoZWNrQ29udGFpbm1lbnQoZW50aXR5KTsKLQkJc3VwZXIudmlzaXREVERFbnRpdHkoZW50aXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50R2VuKERUREVsZW1lbnQgZWxlbWVudCkgewotCi0JCWNoZWNrQ29udGFpbm1lbnQoZWxlbWVudCk7Ci0JCXN1cGVyLnZpc2l0RFRERWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERBdHRyaWJ1dGVHZW4oRFREQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCi0JCWNoZWNrQ29udGFpbm1lbnQoYXR0cmlidXRlKTsKLQkJc3VwZXIudmlzaXREVERBdHRyaWJ1dGUoYXR0cmlidXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VHZW4oRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHkpIHsKLQotCQljaGVja0NvbnRhaW5tZW50KHBhcm1FbnRpdHkpOwotCQlzdXBlci52aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShwYXJtRW50aXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50Q29udGVudEdlbihEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0KLQkJY2hlY2tDb250YWlubWVudChjb250ZW50KTsKLQkJc3VwZXIudmlzaXREVERFbGVtZW50Q29udGVudChjb250ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERURE9iamVjdCBnZXRDbG9zZXN0T2JqZWN0R2VuKCkgewotCi0JCXJldHVybiBjbG9zZXN0T2JqZWN0OwotCX0KLX0vLyBEVERPYmplY3RGaW5kZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERQYXRobmFtZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERQYXRobmFtZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwNjNjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUGF0aG5hbWVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi0KLQotcHVibGljIGNsYXNzIERURFBhdGhuYW1lVXRpbCB7Ci0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgbWFrZVBhdGgoU3RyaW5nIHBhcmVudFBhdGgsIFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSwgaW50IGNudCkgewotCQlTdHJpbmcgcG4gPSBudWxsOwotCQluYW1lID0gZW5jb2RlKG5hbWUpOwotCQlpZiAoKG5hbWUgPT0gbnVsbCkgJiYgKGNudCA8PSAwKSkgewotCQkJcG4gPSB0eXBlOwotCQl9Ci0JCWVsc2UgaWYgKGNudCA8PSAwKSB7Ci0JCQlwbiA9IHR5cGUgKyAiOiIgKyAoKG5hbWUgPT0gbnVsbCkgPyAiIiA6IG5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIHsKLQkJCXBuID0gdHlwZSArICI6IiArICgobmFtZSA9PSBudWxsKSA/ICIiIDogbmFtZSkgKyAiOiIgKyBjbnQ7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlpZiAocGFyZW50UGF0aCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50UGF0aCArICIuIiArIHBuOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gcG47Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgcHVibGljIE9iamVjdFtdIHBhcnNlUGF0aENvbXBvbmVudChTdHJpbmcgcGF0aCkgewotCQkvKgotCQkgKiBUaGlzIHJvdXRpbmUgcGFyc2UgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgcGF0aCBhbmQgcmV0dXJucyB0aGUKLQkJICogcmVzdWx0IGluIGFuIGFycnJheSBvZiBTdHJpbmdzLiByZXN1bHRbMF0gPSB0eXBlIChTdHJpbmcpIHJlc3VsdFsxXSA9Ci0JCSAqIG5hbWUgKFN0cmluZykgcmVzdWx0WzJdID0gY291bnQgKEludGVnZXIpIHJlc3VsdFszXSA9IHRoZSByZXN0IG9mCi0JCSAqIHRoZSBwYXRoIChTdHJpbmcpCi0JCSAqIAotCQkgKiBFLmcuIFBhdGhDb21wb25lbnQgcmVzdWx0WzBdIHJlc3VsdFsxXSByZXN1bHRbMl0gcmVzdWx0WzNdCi0JCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZQotCQkgKiB0eXBlIDxudWxsPiA8bnVsbD4gPG51bGw+IHR5cGUucmVzdCB0eXBlIDxudWxsPiA8bnVsbD4gcmVzdAotCQkgKiB0eXBlOm5hbWUgdHlwZSBuYW1lIDxudWxsPiA8bnVsbD4gdHlwZTpuYW1lLnJlc3QgdHlwZSBuYW1lIDxudWxsPgotCQkgKiByZXN0IHR5cGU6Om4gdHlwZSA8bnVsbD4gbiA8bnVsbD4gdHlwZTo6bi5yZXN0IHR5cGUgPG51bGw+IG4gcmVzdAotCQkgKiB0eXBlOm5hbWU6biB0eXBlIG5hbWUgbiA8bnVsbD4gdHlwZTpuYW1lOm4ucmVzdCB0eXBlIG5hbWUgbiByZXN0Ci0JCSAqLwotCi0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbNF07Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCWludCBpID0gcGF0aC5pbmRleE9mKCcuJyk7Ci0JCWludCBsZW5ndGggPSBwYXRoLmxlbmd0aCgpOwotCi0JCWlmIChpIDwgMCkgewotCQkJaSA9IGxlbmd0aDsKLQkJfQotCi0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlJbnRlZ2VyIG4gPSBudWxsOwotCQlTdHJpbmcgcmVzdCA9IG51bGw7Ci0KLQkJLy8gZ2V0IHRoZSB0eXBlCi0JCWludCBqID0gcGF0aC5pbmRleE9mKCc6Jyk7Ci0JCWlmIChqID4gaSkKLQkJCWogPSAtMTsKLQkJaWYgKGogPCAwKSB7Ci0JCQl0eXBlID0gcGF0aC5zdWJzdHJpbmcoMCwgaSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0eXBlID0gcGF0aC5zdWJzdHJpbmcoMCwgaik7Ci0KLQkJCS8vIGdldCB0aGUgbmFtZQotCQkJaW50IGsgPSBwYXRoLmluZGV4T2YoJzonLCBqICsgMSk7Ci0JCQlpZiAoayA+IGkpCi0JCQkJayA9IC0xOwotCQkJaWYgKGsgPCAwKSB7Ci0JCQkJbmFtZSA9IHBhdGguc3Vic3RyaW5nKGogKyAxLCBpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5hbWUgPSBwYXRoLnN1YnN0cmluZyhqICsgMSwgayk7Ci0KLQkJCQkvLyBnZXQgdGhlIGNvdW50Ci0JCQkJdHJ5IHsKLQkJCQkJbiA9IG5ldyBJbnRlZ2VyKHBhdGguc3Vic3RyaW5nKGsgKyAxLCBpKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJfQotCQkJCWlmICgobiAhPSBudWxsKSAmJiAobi5pbnRWYWx1ZSgpIDwgMCkpIHsKLQkJCQkJbiA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKChuYW1lICE9IG51bGwpICYmIChuYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQluYW1lID0gbnVsbDsKLQkJfQotCi0JCWlmIChpIDwgbGVuZ3RoKSB7Ci0JCQlyZXN0ID0gcGF0aC5zdWJzdHJpbmcoaSArIDEpOwotCQl9Ci0KLQkJcmVzdWx0WzBdID0gdHlwZTsKLQkJcmVzdWx0WzFdID0gZGVjb2RlKG5hbWUpOwotCQlyZXN1bHRbMl0gPSBuOwotCQlyZXN1bHRbM10gPSByZXN0OwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBwcml2YXRlIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgbyA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSk7Ci0JCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChpKTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGMpIHx8IChjID09ICctJykpIHsKLQkJCQlvLmFwcGVuZChjKTsKLQkJCX0KLQkJCWVsc2UgeyAvLyBpZiAoKGMgPT0gJy4nKSB8fCAoYyA9PSAnOicpIHx8IChjID09ICdfJykgfHwgLi4uKQotCQkJCS8vIGNvbnZlcnQgdGhlIGNoYXJhY3RlciB0byBhIDQgZGlnaXQgaGV4IGNvZGUgcHJlZml4ZWQgYnkgIl8iCi0JCQkJU3RyaW5nIGhleCA9IEludGVnZXIudG9IZXhTdHJpbmcoYyk7Ci0JCQkJaW50IGwgPSBoZXgubGVuZ3RoKCk7Ci0JCQkJaWYgKGwgPT0gMSkgewotCQkJCQlvLmFwcGVuZCgiXzAwMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGwgPT0gMikgewotCQkJCQlvLmFwcGVuZCgiXzAwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJby5hcHBlbmQoaGV4KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobCA9PSAzKSB7Ci0JCQkJCW8uYXBwZW5kKCJfMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvLmFwcGVuZCgnXycpOwotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCX0KLQkJfSAvLyBmb3IKLQkJcmV0dXJuIG8udG9TdHJpbmcoKTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZGVjb2RlKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIG8gPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAoYyAhPSAnXycpIHsKLQkJCQlvLmFwcGVuZChjKTsKLQkJCX0KLQkJCWVsc2UgeyAvLyBuZXh0IDQgY2hhcmFjdGVycyBhcmUgdGhlIGhleCBjb2RlCi0JCQkJU3RyaW5nIGhleDsKLQkJCQlpZiAobGVuID4gaSArIDQpIHsKLQkJCQkJaGV4ID0gcy5zdWJzdHJpbmcoaSArIDEsIGkgKyA1KTsKLQkJCQkJaSArPSA0OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaGV4ID0gcy5zdWJzdHJpbmcoaSArIDEpOwotCQkJCQlpID0gbGVuIC0gMTsKLQkJCQl9Ci0JCQkJby5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQoaGV4LCAxNikpOwotCQkJfQotCQl9IC8vIGZvcgotCQlyZXR1cm4gby50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBtYWtlUGF0aEdlbihTdHJpbmcgcGFyZW50UGF0aCwgU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lLCBpbnQgY250KSB7Ci0KLQkJU3RyaW5nIHBuID0gbnVsbDsKLQkJbmFtZSA9IGVuY29kZShuYW1lKTsKLQkJaWYgKChuYW1lID09IG51bGwpICYmIChjbnQgPD0gMCkpIHsKLQkJCXBuID0gdHlwZTsKLQkJfQotCQllbHNlIGlmIChjbnQgPD0gMCkgewotCQkJcG4gPSB0eXBlICsgIjoiICsgKChuYW1lID09IG51bGwpID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlwbiA9IHR5cGUgKyAiOiIgKyAoKG5hbWUgPT0gbnVsbCkgPyAiIiA6IG5hbWUpICsgIjoiICsgY250OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0KLQkJaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudFBhdGggKyAiLiIgKyBwbjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHBuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0W10gcGFyc2VQYXRoQ29tcG9uZW50R2VuKFN0cmluZyBwYXRoKSB7Ci0KLQkJLyoKLQkJICogVGhpcyByb3V0aW5lIHBhcnNlIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIHBhdGggYW5kIHJldHVybnMgdGhlCi0JCSAqIHJlc3VsdCBpbiBhbiBhcnJyYXkgb2YgU3RyaW5ncy4gcmVzdWx0WzBdID0gdHlwZSAoU3RyaW5nKSByZXN1bHRbMV0gPQotCQkgKiBuYW1lIChTdHJpbmcpIHJlc3VsdFsyXSA9IGNvdW50IChJbnRlZ2VyKSByZXN1bHRbM10gPSB0aGUgcmVzdCBvZgotCQkgKiB0aGUgcGF0aCAoU3RyaW5nKQotCQkgKiAKLQkJICogRS5nLiBQYXRoQ29tcG9uZW50IHJlc3VsdFswXSByZXN1bHRbMV0gcmVzdWx0WzJdIHJlc3VsdFszXQotCQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGUKLQkJICogdHlwZSA8bnVsbD4gPG51bGw+IDxudWxsPiB0eXBlLnJlc3QgdHlwZSA8bnVsbD4gPG51bGw+IHJlc3QKLQkJICogdHlwZTpuYW1lIHR5cGUgbmFtZSA8bnVsbD4gPG51bGw+IHR5cGU6bmFtZS5yZXN0IHR5cGUgbmFtZSA8bnVsbD4KLQkJICogcmVzdCB0eXBlOjpuIHR5cGUgPG51bGw+IG4gPG51bGw+IHR5cGU6Om4ucmVzdCB0eXBlIDxudWxsPiBuIHJlc3QKLQkJICogdHlwZTpuYW1lOm4gdHlwZSBuYW1lIG4gPG51bGw+IHR5cGU6bmFtZTpuLnJlc3QgdHlwZSBuYW1lIG4gcmVzdAotCQkgKi8KLQotCQlPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzRdOwotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQlpbnQgaSA9IHBhdGguaW5kZXhPZignLicpOwotCQlpbnQgbGVuZ3RoID0gcGF0aC5sZW5ndGgoKTsKLQotCQlpZiAoaSA8IDApIHsKLQkJCWkgPSBsZW5ndGg7Ci0JCX0KLQotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJSW50ZWdlciBuID0gbnVsbDsKLQkJU3RyaW5nIHJlc3QgPSBudWxsOwotCi0JCS8vIGdldCB0aGUgdHlwZQotCQlpbnQgaiA9IHBhdGguaW5kZXhPZignOicpOwotCQlpZiAoaiA+IGkpCi0JCQlqID0gLTE7Ci0JCWlmIChqIDwgMCkgewotCQkJdHlwZSA9IHBhdGguc3Vic3RyaW5nKDAsIGkpOwotCQl9Ci0JCWVsc2UgewotCQkJdHlwZSA9IHBhdGguc3Vic3RyaW5nKDAsIGopOwotCi0JCQkvLyBnZXQgdGhlIG5hbWUKLQkJCWludCBrID0gcGF0aC5pbmRleE9mKCc6JywgaiArIDEpOwotCQkJaWYgKGsgPiBpKQotCQkJCWsgPSAtMTsKLQkJCWlmIChrIDwgMCkgewotCQkJCW5hbWUgPSBwYXRoLnN1YnN0cmluZyhqICsgMSwgaSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluYW1lID0gcGF0aC5zdWJzdHJpbmcoaiArIDEsIGspOwotCi0JCQkJLy8gZ2V0IHRoZSBjb3VudAotCQkJCXRyeSB7Ci0JCQkJCW4gPSBuZXcgSW50ZWdlcihwYXRoLnN1YnN0cmluZyhrICsgMSwgaSkpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCX0KLQkJCQlpZiAoKG4gIT0gbnVsbCkgJiYgKG4uaW50VmFsdWUoKSA8IDApKSB7Ci0JCQkJCW4gPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICgobmFtZSAhPSBudWxsKSAmJiAobmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJbmFtZSA9IG51bGw7Ci0JCX0KLQotCQlpZiAoaSA8IGxlbmd0aCkgewotCQkJcmVzdCA9IHBhdGguc3Vic3RyaW5nKGkgKyAxKTsKLQkJfQotCi0JCXJlc3VsdFswXSA9IHR5cGU7Ci0JCXJlc3VsdFsxXSA9IGRlY29kZShuYW1lKTsKLQkJcmVzdWx0WzJdID0gbjsKLQkJcmVzdWx0WzNdID0gcmVzdDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZW5jb2RlR2VuKFN0cmluZyBzKSB7Ci0KLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgbyA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSk7Ci0JCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChpKTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGMpIHx8IChjID09ICctJykpIHsKLQkJCQlvLmFwcGVuZChjKTsKLQkJCX0KLQkJCWVsc2UgeyAvLyBpZiAoKGMgPT0gJy4nKSB8fCAoYyA9PSAnOicpIHx8IChjID09ICdfJykgfHwgLi4uKQotCQkJCS8vIGNvbnZlcnQgdGhlIGNoYXJhY3RlciB0byBhIDQgZGlnaXQgaGV4IGNvZGUgcHJlZml4ZWQgYnkgIl8iCi0JCQkJU3RyaW5nIGhleCA9IEludGVnZXIudG9IZXhTdHJpbmcoYyk7Ci0JCQkJaW50IGwgPSBoZXgubGVuZ3RoKCk7Ci0JCQkJaWYgKGwgPT0gMSkgewotCQkJCQlvLmFwcGVuZCgiXzAwMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGwgPT0gMikgewotCQkJCQlvLmFwcGVuZCgiXzAwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJby5hcHBlbmQoaGV4KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobCA9PSAzKSB7Ci0JCQkJCW8uYXBwZW5kKCJfMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvLmFwcGVuZCgnXycpOwotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCX0KLQkJfSAvLyBmb3IKLQkJcmV0dXJuIG8udG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZGVjb2RlR2VuKFN0cmluZyBzKSB7Ci0KLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgbyA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSk7Ci0JCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChpKTsKLQkJCWlmIChjICE9ICdfJykgewotCQkJCW8uYXBwZW5kKGMpOwotCQkJfQotCQkJZWxzZSB7IC8vIG5leHQgNCBjaGFyYWN0ZXJzIGFyZSB0aGUgaGV4IGNvZGUKLQkJCQlTdHJpbmcgaGV4OwotCQkJCWlmIChsZW4gPiBpICsgNCkgewotCQkJCQloZXggPSBzLnN1YnN0cmluZyhpICsgMSwgaSArIDUpOwotCQkJCQlpICs9IDQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQloZXggPSBzLnN1YnN0cmluZyhpICsgMSk7Ci0JCQkJCWkgPSBsZW4gLSAxOwotCQkJCX0KLQkJCQlvLmFwcGVuZCgoY2hhcikgSW50ZWdlci5wYXJzZUludChoZXgsIDE2KSk7Ci0JCQl9Ci0JCX0gLy8gZm9yCi0JCXJldHVybiBvLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFByaW50ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERQcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NGY4NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREU291cmNlT2Zmc2V0OwotCi0KLXB1YmxpYyBjbGFzcyBEVERQcmludGVyIGV4dGVuZHMgRFREVmlzaXRvciB7Ci0JU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWJvb2xlYW4gdXBkYXRlT2Zmc2V0ID0gdHJ1ZTsKLQotCXB1YmxpYyBEVERQcmludGVyKGJvb2xlYW4gdXBkYXRlT2Zmc2V0KSB7Ci0JCXRoaXMudXBkYXRlT2Zmc2V0ID0gdXBkYXRlT2Zmc2V0OwotCX0KLQotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlyZXR1cm4gc2I7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERGaWxlKERUREZpbGUgZmlsZSkgewotCQlzdXBlci52aXNpdERUREZpbGUoZmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVEROb3RhdGlvbihEVEROb3RhdGlvbiBub3RhdGlvbikgewotCQlnZW5lcmF0ZUNvbW1lbnQobm90YXRpb24pOwotCQl1cGRhdGVTdGFydE9mZnNldChub3RhdGlvbiwgc2IubGVuZ3RoKCkpOwotCQlzYi5hcHBlbmQoIjwhTk9UQVRJT04gIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKG5vdGF0aW9uLmdldE5hbWUoKSkuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgcHVibGljSUQgPSBub3RhdGlvbi5nZXRQdWJsaWNJRCgpOwotCQlTdHJpbmcgc3lzdGVtSUQgPSBub3RhdGlvbi5nZXRTeXN0ZW1JRCgpOwotCQlpZiAocHVibGljSUQgPT0gbnVsbCB8fCBwdWJsaWNJRC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXNiLmFwcGVuZCgiU1lTVEVNICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlzYi5hcHBlbmQoIlBVQkxJQyBcIiIpLmFwcGVuZChwdWJsaWNJRCkuYXBwZW5kKCJcIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlpZiAoc3lzdGVtSUQgPT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKCJcIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCXNiLmFwcGVuZCgiXCIiKS5hcHBlbmQoc3lzdGVtSUQpLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZW5kVGFnKCk7Ci0JCXVwZGF0ZUVuZE9mZnNldChub3RhdGlvbiwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lIGNoYXIKLQkJc3VwZXIudmlzaXREVEROb3RhdGlvbihub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbnRpdHkoRFRERW50aXR5IGVudGl0eSkgewotCQlnZW5lcmF0ZUNvbW1lbnQoZW50aXR5KTsKLQkJdXBkYXRlU3RhcnRPZmZzZXQoZW50aXR5LCBzYi5sZW5ndGgoKSk7Ci0JCXNiLmFwcGVuZCgiPCFFTlRJVFkgIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpCi0JCQlzYi5hcHBlbmQoIiUgIik7IC8vJE5PTi1OTFMtMSQKLQotCQlzYi5hcHBlbmQoZW50aXR5LmdldE5hbWUoKSkuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKGVudGl0eS5nZXRDb250ZW50KCkudW5wYXJzZSgpKTsKLQotCQllbmRUYWcoKTsKLQkJdXBkYXRlRW5kT2Zmc2V0KGVudGl0eSwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lIGNoYXIKLQkJc3VwZXIudmlzaXREVERFbnRpdHkoZW50aXR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnQoRFRERWxlbWVudCBlbGVtZW50KSB7Ci0JCWdlbmVyYXRlQ29tbWVudChlbGVtZW50KTsKLQkJdXBkYXRlU3RhcnRPZmZzZXQoZWxlbWVudCwgc2IubGVuZ3RoKCkpOwotCQlzYi5hcHBlbmQoIjwhRUxFTUVOVCAiICsgZWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCURUREVsZW1lbnRDb250ZW50IGNvbnRlbnQgPSBlbGVtZW50LmdldENvbnRlbnQoKTsKLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERQQ0RhdGFDb250ZW50IHx8IGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJc2IuYXBwZW5kKCIgKCIpOyAvLyROT04tTkxTLTEkCi0JCQlzdXBlci52aXNpdERUREVsZW1lbnQoZWxlbWVudCk7Ci0JCQlzYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCQl9IC8vIGVuZCBvZiBpZiAoKQotCQllbHNlIHsKLQkJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQlzdXBlci52aXNpdERUREVsZW1lbnQoZWxlbWVudCk7Ci0JCX0gLy8gZW5kIG9mIGVsc2UKLQkJZW5kVGFnKCk7Ci0JCXVwZGF0ZUVuZE9mZnNldChlbGVtZW50LCBzYi5sZW5ndGgoKSAtIDEpOyAvLyAtMSBmb3IgdGhlIG5ld2xpbmUgY2hhcgotCQl2aXNpdEF0dHJpYnV0ZXMoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHkpIHsKLQkJZ2VuZXJhdGVDb21tZW50KHBhcm1FbnRpdHkpOwotCQl1cGRhdGVTdGFydE9mZnNldChwYXJtRW50aXR5LCBzYi5sZW5ndGgoKSk7Ci0JCXNiLmFwcGVuZCgiJSIgKyBwYXJtRW50aXR5LmdldE5hbWUoKSArICI7XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXVwZGF0ZUVuZE9mZnNldChwYXJtRW50aXR5LCBzYi5sZW5ndGgoKSAtIDEpOyAvLyAtMSBmb3IgdGhlIG5ld2xpbmUKLQkJCQkJCQkJCQkJCQkJLy8gY2hhcgotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCQl1cGRhdGVTdGFydE9mZnNldChjb250ZW50LCBzYi5sZW5ndGgoKSk7Ci0JCVN0cmluZyB0cmFpbGluZ0NoYXJzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERSZXBlYXRhYmxlQ29udGVudCkgewotCQkJRFREUmVwZWF0YWJsZUNvbnRlbnQgcmVwZWF0Q29udGVudCA9IChEVERSZXBlYXRhYmxlQ29udGVudCkgY29udGVudDsKLQkJCURURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0gcmVwZWF0Q29udGVudC5nZXRPY2N1cnJlbmNlKCk7Ci0JCQkvLyBJbnRlZ2VyIG9jY3VycmVuY2UgPSByZXBlYXRDb250ZW50LmdldE9jY3VycmVuY2UoKTsKLQkJCWlmIChvY2N1cnJlbmNlVHlwZSAhPSBudWxsKSB7Ci0JCQkJaW50IG9jY3VyVHlwZSA9IG9jY3VycmVuY2VUeXBlLmdldFZhbHVlKCk7Ci0JCQkJaWYgKG9jY3VyVHlwZSAhPSBEVERPY2N1cnJlbmNlVHlwZS5PTkUpIHsKLQkJCQkJaWYgKHJlcGVhdENvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQkJCQlzYi5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdHJhaWxpbmdDaGFycyA9ICIpIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXRyYWlsaW5nQ2hhcnMgKz0gKGNoYXIpIG9jY3VyVHlwZTsKLQkJCQl9Ci0JCQl9IC8vIGVuZCBvZiBpZiAoKQotCQl9IC8vIGVuZCBvZiBpZiAoKQotCi0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KSB7Ci0JCQlzdXBlci52aXNpdERUREVsZW1lbnRDb250ZW50KGNvbnRlbnQpOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgfHwgY29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCXNiLmFwcGVuZCgoKERURFJlcGVhdGFibGVDb250ZW50KSBjb250ZW50KS51bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSk7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JCWVsc2UgewotCQkJLy8gaGFuZGxlIERURFBDRGF0YUNvbnRlbnQsIERUREFueUNvbnRlbnQgYW5kIERUREVtcHR5Q29udGVudCBoZXJlCi0JCQlzYi5hcHBlbmQoY29udGVudC5nZXRDb250ZW50TmFtZSgpKTsKLQkJfSAvLyBlbmQgb2YgZWxzZQotCQlzYi5hcHBlbmQodHJhaWxpbmdDaGFycyk7Ci0JCXVwZGF0ZUVuZE9mZnNldChjb250ZW50LCBzYi5sZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERHcm91cENvbnRlbnQoRFRER3JvdXBDb250ZW50IGdyb3VwKSB7Ci0JCXNiLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0JCURUREdyb3VwS2luZCBraW5kID0gZ3JvdXAuZ2V0R3JvdXBLaW5kKCk7Ci0JCS8vIE1PRjJFTUYgUG9ydAotCQkvLyBJbnRlZ2VyIGdyb3VwS2luZCA9IGdyb3VwLmdldEdyb3VwS2luZCgpOwotCQlpZiAoa2luZCA9PSBudWxsKSB7Ci0JCQlncm91cC5zZXRHcm91cEtpbmQoRFRER3JvdXBLaW5kLmdldChEVERHcm91cEtpbmQuU0VRVUVOQ0UpKTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQotCQlTdHJpbmcgY29uID0gZ3JvdXAuZ2V0R3JvdXBLaW5kKCkuZ2V0VmFsdWUoKSA9PSBEVERHcm91cEtpbmQuQ0hPSUNFID8gIiB8ICIgOiAiLCAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkvLyBMb29wIHRocnUgdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IGdyb3VwCi0JCUNvbGxlY3Rpb24gY29udGVudCA9IGdyb3VwLmdldENvbnRlbnQoKTsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBmaXJzdENvbnRlbnQgPSB0cnVlOwotCQkJZm9yIChJdGVyYXRvciBpID0gY29udGVudC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlpZiAoIWZpcnN0Q29udGVudCkgewotCQkJCQlzYi5hcHBlbmQoY29uKTsKLQkJCQl9IC8vIGVuZCBvZiBpZiAoKQotCQkJCWVsc2UgewotCQkJCQlmaXJzdENvbnRlbnQgPSBmYWxzZTsKLQkJCQl9IC8vIGVuZCBvZiBlbHNlCi0JCQkJdmlzaXREVERFbGVtZW50Q29udGVudCgoRFRERWxlbWVudENvbnRlbnQpIGkubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCXNiLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZpc2l0QXR0cmlidXRlcyhEVERFbGVtZW50IGVsZW0pIHsKLQkJQ29sbGVjdGlvbiBhdHRycyA9IGVsZW0uZ2V0RFREQXR0cmlidXRlKCk7Ci0JCUl0ZXJhdG9yIGkgPSBhdHRycy5pdGVyYXRvcigpOwotCQlpZiAoYXR0cnMgIT0gbnVsbCAmJiBpLmhhc05leHQoKSkgewotCQkJRFREQXR0cmlidXRlIGF0dHJpYiA9IChEVERBdHRyaWJ1dGUpIGkubmV4dCgpOwotCQkJU3RyaW5nIGNvbW1lbnQgPSBhdHRyaWIuZ2V0Q29tbWVudCgpOwotCQkJaWYgKGNvbW1lbnQgIT0gbnVsbCAmJiBjb21tZW50Lmxlbmd0aCgpID4gMCkKLQkJCQlzYi5hcHBlbmQoIjwhLS1cbiAiKS5hcHBlbmQoY29tbWVudCkuYXBwZW5kKCJcbi0tPlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJc2IuYXBwZW5kKCI8IUFUVExJU1QgIiArIGVsZW0uZ2V0TmFtZSgpICsgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXVwZGF0ZVN0YXJ0T2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCQkJc2IuYXBwZW5kKGF0dHJpYi51bnBhcnNlKCkpOwotCQkJdXBkYXRlRW5kT2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCQkJc2IuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKDsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYXR0cmliID0gKERUREF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0JCQkJY29tbWVudCA9IGF0dHJpYi5nZXRDb21tZW50KCk7Ci0JCQkJaWYgKGNvbW1lbnQgIT0gbnVsbCAmJiBjb21tZW50Lmxlbmd0aCgpID4gMCkgewotCQkJCQlzYi5hcHBlbmQoIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChjb21tZW50ICE9IG51bGwgJiYgY29tbWVudC5sZW5ndGgoKSA+IDApCi0JCQkJCQlzYi5hcHBlbmQoIjwhLS1cbiAiKS5hcHBlbmQoY29tbWVudCkuYXBwZW5kKCJcbi0tPlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlzYi5hcHBlbmQoIjwhQVRUTElTVCAiICsgZWxlbS5nZXROYW1lKCkgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJdXBkYXRlU3RhcnRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JCQkJc2IuYXBwZW5kKGF0dHJpYi51bnBhcnNlKCkpOwotCQkJCXVwZGF0ZUVuZE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkJCQlzYi5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXNiLmFwcGVuZCgiPlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBlbmRUYWcoKSB7Ci0JCXNiLmFwcGVuZCgiPlxuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU3RhcnRPZmZzZXQoRFREU291cmNlT2Zmc2V0IG8sIGludCBvZmZzZXQpIHsKLQkJaWYgKHVwZGF0ZU9mZnNldCkgewotCQkJby5zZXRTdGFydE9mZnNldChvZmZzZXQpOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVFbmRPZmZzZXQoRFREU291cmNlT2Zmc2V0IG8sIGludCBvZmZzZXQpIHsKLQkJaWYgKHVwZGF0ZU9mZnNldCkgewotCQkJby5zZXRFbmRPZmZzZXQob2Zmc2V0KTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVDb21tZW50KERURE9iamVjdCBkdGRPYmplY3QpIHsKLQkJU3RyaW5nIGNvbW1lbnRTdHJpbmcgPSBudWxsOwotCi0JCWlmIChkdGRPYmplY3QgaW5zdGFuY2VvZiBEVERFbGVtZW50KQotCQkJY29tbWVudFN0cmluZyA9ICgoRFRERWxlbWVudCkgZHRkT2JqZWN0KS5nZXRDb21tZW50KCk7Ci0JCWVsc2UgaWYgKGR0ZE9iamVjdCBpbnN0YW5jZW9mIERUREVudGl0eSkKLQkJCWNvbW1lbnRTdHJpbmcgPSAoKERUREVudGl0eSkgZHRkT2JqZWN0KS5nZXRDb21tZW50KCk7Ci0JCWVsc2UgaWYgKGR0ZE9iamVjdCBpbnN0YW5jZW9mIERURE5vdGF0aW9uKQotCQkJY29tbWVudFN0cmluZyA9ICgoRFRETm90YXRpb24pIGR0ZE9iamVjdCkuZ2V0Q29tbWVudCgpOwotCi0JCWlmIChjb21tZW50U3RyaW5nICE9IG51bGwgJiYgY29tbWVudFN0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCXNiLmFwcGVuZCgiPCEtLSIpLmFwcGVuZChjb21tZW50U3RyaW5nKS5hcHBlbmQoIi0tPlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBTdHJpbmdCdWZmZXIgZ2V0QnVmZmVyR2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIHNiOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRERmlsZUdlbihEVERGaWxlIGZpbGUpIHsKLQkvLwotCS8vIHN1cGVyLnZpc2l0RFRERmlsZShmaWxlKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdERURE5vdGF0aW9uR2VuKERURE5vdGF0aW9uIG5vdGF0aW9uKSB7Ci0JLy8KLQkvLyBnZW5lcmF0ZUNvbW1lbnQobm90YXRpb24pOwotCS8vIHVwZGF0ZVN0YXJ0T2Zmc2V0KG5vdGF0aW9uLCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKCI8IU5PVEFUSU9OICIpOwotCS8vIHNiLmFwcGVuZChub3RhdGlvbi5nZXROYW1lKCkpLmFwcGVuZCgiICIpOwotCS8vCi0JLy8KLQkvLyBTdHJpbmcgcHVibGljSUQgPSBub3RhdGlvbi5nZXRQdWJsaWNJRCgpOwotCS8vIFN0cmluZyBzeXN0ZW1JRCA9IG5vdGF0aW9uLmdldFN5c3RlbUlEKCk7Ci0JLy8gaWYgKHB1YmxpY0lEID09IG51bGwgfHwgcHVibGljSUQuZXF1YWxzKCIiKSkKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCJTWVNURU0gIik7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCJQVUJMSUMgXCIiKS5hcHBlbmQocHVibGljSUQpLmFwcGVuZCgiXCIgIik7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBpZiAoc3lzdGVtSUQ9PW51bGwpCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiXCJcIiIpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiXCIiKS5hcHBlbmQoc3lzdGVtSUQpLmFwcGVuZCgiXCIiKTsKLQkvLyB9Ci0JLy8gZW5kVGFnKCk7Ci0JLy8gdXBkYXRlRW5kT2Zmc2V0KG5vdGF0aW9uLCBzYi5sZW5ndGgoKSAtIDEpOyAvLyAtMSBmb3IgdGhlIG5ld2xpbmUgY2hhcgotCS8vIHN1cGVyLnZpc2l0RFRETm90YXRpb24obm90YXRpb24pOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRERW50aXR5R2VuKERUREVudGl0eSBlbnRpdHkpIHsKLQkvLwotCS8vIGdlbmVyYXRlQ29tbWVudChlbnRpdHkpOwotCS8vIHVwZGF0ZVN0YXJ0T2Zmc2V0KGVudGl0eSwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZCgiPCFFTlRJVFkgIik7Ci0JLy8KLQkvLwotCS8vIGlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkvLyBzYi5hcHBlbmQoIiUgIik7Ci0JLy8KLQkvLwotCS8vIHNiLmFwcGVuZChlbnRpdHkuZ2V0TmFtZSgpKS5hcHBlbmQoIiAiKTsKLQkvLyBzYi5hcHBlbmQoZW50aXR5LmdldENvbnRlbnQoKS51bnBhcnNlKCkpOwotCS8vCi0JLy8KLQkvLyBlbmRUYWcoKTsKLQkvLyB1cGRhdGVFbmRPZmZzZXQoZW50aXR5LCBzYi5sZW5ndGgoKSAtIDEpOyAvLyAtMSBmb3IgdGhlIG5ld2xpbmUgY2hhcgotCS8vIHN1cGVyLnZpc2l0RFRERW50aXR5KGVudGl0eSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50R2VuKERUREVsZW1lbnQgZWxlbWVudCkgewotCS8vCi0JLy8gZ2VuZXJhdGVDb21tZW50KGVsZW1lbnQpOwotCS8vIHVwZGF0ZVN0YXJ0T2Zmc2V0KGVsZW1lbnQsIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoIjwhRUxFTUVOVCAiICsgZWxlbWVudC5nZXROYW1lKCkpOwotCS8vIERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQgPSBlbGVtZW50LmdldENvbnRlbnQoKTsKLQkvLyBpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQgfHwKLQkvLyBjb250ZW50IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiICgiKTsKLQkvLyBzdXBlci52aXNpdERUREVsZW1lbnQoZWxlbWVudCk7Ci0JLy8gc2IuYXBwZW5kKCIpIik7Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyBlbHNlCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiICIpOwotCS8vIHN1cGVyLnZpc2l0RFRERWxlbWVudChlbGVtZW50KTsKLQkvLyB9IC8vIGVuZCBvZiBlbHNlCi0JLy8gZW5kVGFnKCk7Ci0JLy8gdXBkYXRlRW5kT2Zmc2V0KGVsZW1lbnQsIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZSBjaGFyCi0JLy8gdmlzaXRBdHRyaWJ1dGVzKGVsZW1lbnQpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkCi0JLy8gdmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VHZW4oRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlCi0JLy8gcGFybUVudGl0eSkgewotCS8vCi0JLy8gZ2VuZXJhdGVDb21tZW50KHBhcm1FbnRpdHkpOwotCS8vIHVwZGF0ZVN0YXJ0T2Zmc2V0KHBhcm1FbnRpdHksIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoIiUiICsgcGFybUVudGl0eS5nZXROYW1lKCkgKyAiO1xuIik7Ci0JLy8gdXBkYXRlRW5kT2Zmc2V0KHBhcm1FbnRpdHksIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZQotCS8vIGNoYXIKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVsZW1lbnRDb250ZW50R2VuKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQkvLwotCS8vIHVwZGF0ZVN0YXJ0T2Zmc2V0KGNvbnRlbnQsIHNiLmxlbmd0aCgpKTsKLQkvLyBTdHJpbmcgdHJhaWxpbmdDaGFycyA9ICIiOwotCS8vIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUmVwZWF0YWJsZUNvbnRlbnQgKQotCS8vIHsKLQkvLyBEVERSZXBlYXRhYmxlQ29udGVudCByZXBlYXRDb250ZW50ID0gKERURFJlcGVhdGFibGVDb250ZW50KSBjb250ZW50OwotCS8vIEludGVnZXIgb2NjdXJyZW5jZSA9IHJlcGVhdENvbnRlbnQuZ2V0T2NjdXJyZW5jZSgpOwotCS8vIGlmIChvY2N1cnJlbmNlICE9IG51bGwpCi0JLy8gewotCS8vIGludCBvY2N1clR5cGUgPSBvY2N1cnJlbmNlLmludFZhbHVlKCk7Ci0JLy8gaWYgKG9jY3VyVHlwZSAhPSBEVERPY2N1cnJlbmNlVHlwZS5PTkUpCi0JLy8gewotCS8vIGlmIChyZXBlYXRDb250ZW50IGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCIoIik7Ci0JLy8gdHJhaWxpbmdDaGFycyA9ICIpIjsKLQkvLyB9Ci0JLy8gdHJhaWxpbmdDaGFycyArPSAoY2hhcikgb2NjdXJUeXBlOwotCS8vIH0KLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gICAgCi0JLy8gaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpCi0JLy8gewotCS8vIHN1cGVyLnZpc2l0RFRERWxlbWVudENvbnRlbnQoY29udGVudCk7Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgfHwKLQkvLyBjb250ZW50IGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCgoRFREUmVwZWF0YWJsZUNvbnRlbnQpY29udGVudCkudW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkpOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gZWxzZQotCS8vIHsKLQkvLyAvLyBoYW5kbGUgRFREUENEYXRhQ29udGVudCwgRFREQW55Q29udGVudCBhbmQgRFRERW1wdHlDb250ZW50IGhlcmUKLQkvLyBzYi5hcHBlbmQoY29udGVudC5nZXRDb250ZW50TmFtZSgpKTsKLQkvLyB9IC8vIGVuZCBvZiBlbHNlCi0JLy8gc2IuYXBwZW5kKHRyYWlsaW5nQ2hhcnMpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChjb250ZW50LCBzYi5sZW5ndGgoKSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXREVERHcm91cENvbnRlbnRHZW4oRFRER3JvdXBDb250ZW50IGdyb3VwKSB7Ci0JLy8KLQkvLyBzYi5hcHBlbmQoIigiKTsKLQkvLyAgICAKLQkvLyBJbnRlZ2VyIGdyb3VwS2luZCA9IGdyb3VwLmdldEdyb3VwS2luZCgpOwotCS8vIGlmIChncm91cEtpbmQgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gZ3JvdXAuc2V0R3JvdXBLaW5kKERUREdyb3VwS2luZC5TRVFVRU5DRSk7Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyAgICAKLQkvLyBTdHJpbmcgY29uID0gZ3JvdXAuZ2V0R3JvdXBLaW5kKCkuaW50VmFsdWUoKSA9PSBEVERHcm91cEtpbmQuQ0hPSUNFID8gIgotCS8vIHwgIiA6ICIsICI7Ci0JLy8KLQkvLwotCS8vIC8vIExvb3AgdGhydSB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgZ3JvdXAKLQkvLyBDb2xsZWN0aW9uIGNvbnRlbnQgPSBncm91cC5nZXRDb250ZW50KCk7Ci0JLy8gaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gYm9vbGVhbiBmaXJzdENvbnRlbnQgPSB0cnVlOwotCS8vIGZvciAoSXRlcmF0b3IgaSA9IGNvbnRlbnQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLQkvLyB7Ci0JLy8gaWYgKCFmaXJzdENvbnRlbnQpCi0JLy8gewotCS8vIHNiLmFwcGVuZChjb24pOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gZWxzZQotCS8vIHsKLQkvLyBmaXJzdENvbnRlbnQgPSBmYWxzZTsKLQkvLyB9IC8vIGVuZCBvZiBlbHNlCi0JLy8gdmlzaXREVERFbGVtZW50Q29udGVudCgoRFRERWxlbWVudENvbnRlbnQpIGkubmV4dCgpKTsKLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBzYi5hcHBlbmQoIikiKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdEF0dHJpYnV0ZXNHZW4oRFRERWxlbWVudCBlbGVtKSB7Ci0JLy8KLQkvLyBDb2xsZWN0aW9uIGF0dHJzID0gZWxlbS5nZXREVERBdHRyaWJ1dGUoKTsKLQkvLyBJdGVyYXRvciBpID0gYXR0cnMuaXRlcmF0b3IoKTsKLQkvLyBpZiAoYXR0cnMgIT0gbnVsbCAmJiBpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFREQXR0cmlidXRlIGF0dHJpYiA9IChEVERBdHRyaWJ1dGUpIGkubmV4dCgpOwotCS8vIFN0cmluZyBjb21tZW50ID0gYXR0cmliLmdldENvbW1lbnQoKTsKLQkvLyBpZiAoY29tbWVudCE9bnVsbCAmJiBjb21tZW50Lmxlbmd0aCgpPjApCi0JLy8gc2IuYXBwZW5kKCI8IS0tXG4gIikuYXBwZW5kKGNvbW1lbnQpLmFwcGVuZCgiXG4tLT5cbiIpOwotCS8vIHNiLmFwcGVuZCgiPCFBVFRMSVNUICIgKyBlbGVtLmdldE5hbWUoKSArICJcbiIpOwotCS8vIHNiLmFwcGVuZCgiICIpOwotCS8vIHVwZGF0ZVN0YXJ0T2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZChhdHRyaWIudW5wYXJzZSgpKTsKLQkvLyB1cGRhdGVFbmRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKCJcbiIpOwotCS8vIGZvciAoOyBpLmhhc05leHQoKTsgKQotCS8vIHsKLQkvLyBhdHRyaWIgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkvLyBjb21tZW50ID0gYXR0cmliLmdldENvbW1lbnQoKTsKLQkvLyBpZiAoY29tbWVudCE9bnVsbCAmJiBjb21tZW50Lmxlbmd0aCgpPjApCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiPlxuIik7Ci0JLy8gaWYgKGNvbW1lbnQhPW51bGwgJiYgY29tbWVudC5sZW5ndGgoKT4wKQotCS8vIHNiLmFwcGVuZCgiPCEtLVxuICIpLmFwcGVuZChjb21tZW50KS5hcHBlbmQoIlxuLS0+XG4iKTsKLQkvLyBzYi5hcHBlbmQoIjwhQVRUTElTVCAiICsgZWxlbS5nZXROYW1lKCkgKyAiXG4iKTsKLQkvLyB9Ci0JLy8gc2IuYXBwZW5kKCIgIik7Ci0JLy8gdXBkYXRlU3RhcnRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKGF0dHJpYi51bnBhcnNlKCkpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoIlxuIik7Ci0JLy8gfQotCS8vIHNiLmFwcGVuZCgiPlxuIik7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGVuZFRhZ0dlbigpIHsKLQkvLwotCS8vIHNiLmFwcGVuZCgiPlxuIik7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhcnRPZmZzZXRHZW4oRFREU291cmNlT2Zmc2V0IG8sIGludCBvZmZzZXQpIHsKLQkvLwotCS8vIGlmICh1cGRhdGVPZmZzZXQpCi0JLy8gewotCS8vIG8uc2V0U3RhcnRPZmZzZXQob2Zmc2V0KTsKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUVuZE9mZnNldEdlbihEVERTb3VyY2VPZmZzZXQgbywgaW50IG9mZnNldCkgewotCS8vCi0JLy8gaWYgKHVwZGF0ZU9mZnNldCkKLQkvLyB7Ci0JLy8gby5zZXRFbmRPZmZzZXQob2Zmc2V0KTsKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQ29tbWVudEdlbihEVERPYmplY3QgZHRkT2JqZWN0KSB7Ci0JLy8KLQkvLyBTdHJpbmcgY29tbWVudFN0cmluZyA9IG51bGw7Ci0JLy8KLQkvLwotCS8vIGlmIChkdGRPYmplY3QgaW5zdGFuY2VvZiBEVERFbGVtZW50KQotCS8vIGNvbW1lbnRTdHJpbmcgPSAoKERUREVsZW1lbnQpZHRkT2JqZWN0KS5nZXRDb21tZW50KCk7Ci0JLy8gZWxzZSBpZiAoZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRERW50aXR5KQotCS8vIGNvbW1lbnRTdHJpbmcgPSAoKERUREVudGl0eSlkdGRPYmplY3QpLmdldENvbW1lbnQoKTsKLQkvLyBlbHNlIGlmIChkdGRPYmplY3QgaW5zdGFuY2VvZiBEVEROb3RhdGlvbikKLQkvLyBjb21tZW50U3RyaW5nID0gKChEVEROb3RhdGlvbilkdGRPYmplY3QpLmdldENvbW1lbnQoKTsKLQkvLwotCS8vCi0JLy8gaWYgKCBjb21tZW50U3RyaW5nIT1udWxsICYmIGNvbW1lbnRTdHJpbmcubGVuZ3RoKCk+MCkKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCI8IS0tIikuYXBwZW5kKGNvbW1lbnRTdHJpbmcpLmFwcGVuZCgiLS0+XG4iKTsKLQkvLyB9Ci0JLy8gfQotfS8vIERURFByaW50ZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTg2YzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGw7Ci0KLQotcHVibGljIGNsYXNzIERURFJlc291cmNlRmFjdG9yeUltcGwgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlJbXBsIHsKLQlwdWJsaWMgRFREUmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCXJldHVybiBuZXcgRFREUmVzb3VyY2VJbXBsKGZpbGVuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gbmV3IERURFJlc291cmNlSW1wbCh1cmkpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShSZXNvdXJjZVNldCByZXNvdXJjZXMsIFVSSSB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgRFREUmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc291cmNlcy5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFJlc291cmNlU2V0IHJlc291cmNlcywgU3RyaW5nIHVyaSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBEVERSZXNvdXJjZUltcGwodXJpKTsKLQkJcmVzb3VyY2VzLmdldFJlc291cmNlcygpLmFkZChyZXNvdXJjZSk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbG9hZChTdHJpbmcgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlyZXNvdXJjZS5sb2FkKG5ldyBIYXNoTWFwKCkpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGxvYWQoVVJJIHVyaSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJcmVzb3VyY2UubG9hZChuZXcgSGFzaE1hcCgpKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFJlc291cmNlU2V0IHJlc291cmNlcywgU3RyaW5nIHVyaSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBsb2FkKHJlc291cmNlcywgdXJpLCBuZXcgSGFzaE1hcCgpKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbG9hZChSZXNvdXJjZVNldCByZXNvdXJjZXMsIFVSSSB1cmkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gbG9hZChyZXNvdXJjZXMsIHVyaSwgbmV3IEhhc2hNYXAoKSk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGxvYWQoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBTdHJpbmcgdXJpLCBNYXAgb3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VzLCB1cmkpOwotCQlyZXNvdXJjZS5sb2FkKG9wdGlvbnMpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGxvYWQoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBVUkkgdXJpLCBNYXAgb3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VzLCB1cmkpOwotCQlyZXNvdXJjZS5sb2FkKG9wdGlvbnMpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotfSAvLyBEVERSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUmVzb3VyY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMDg1YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotCi0KLXB1YmxpYyBjbGFzcyBEVERSZXNvdXJjZUltcGwgZXh0ZW5kcyBSZXNvdXJjZUltcGwgewotCi0JcHVibGljIERURFJlc291cmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRFREUmVzb3VyY2VJbXBsKFN0cmluZyBmaWxlbmFtZSkgewotCQlzdXBlcihVUkkuY3JlYXRlVVJJKGZpbGVuYW1lKSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiPj4+PiBEVERSZXNvdXJjZUltcGwgY3RvciAxIik7Ci0JfQotCi0JcHVibGljIERURFJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiPj4+PiBEVERSZXNvdXJjZUltcGwgY3RvciAyIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gVVJJCi0JICoge0BsaW5rIFVSSSNmcmFnbWVudCBmcmFnbWVudH0uCi0JICogPHA+Ci0JICogVGhlIGZyYWdtZW50IGVuY29kaW5nIHdpbGwgdHlwaWNhbGx5IGJlIHRoYXQgcHJvZHVjZWQgYnkKLQkgKiB7QGxpbmsgI2dldFVSSUZyYWdtZW50IGdldFVSSUZyYWdtZW50fS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHVyaUZyYWdtZW50Ci0JICogICAgICAgICAgICB0aGUgZnJhZ21lbnQgdG8gcmVzb2x2ZS4KLQkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBvYmplY3QgZm9yIHRoZSBnaXZlbiBmcmFnbWVudC4KLQkgKiBAc2VlICNnZXRVUklGcmFnbWVudChFT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0I2dldEVPYmplY3QoVVJJLCBib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsI3Jlc29sdmUoRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCNlT2JqZWN0Rm9yVVJJRnJhZ21lbnRTZWdtZW50KFN0cmluZykKLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBuYXZpZ2F0aW5nIHRoZSBmcmFnbWVudC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KGphdmEubGFuZy5TdHJpbmcgdXJpRnJhZ21lbnQpIHsKLQkJRUxpc3QgY29udGVudHMgPSBnZXRDb250ZW50cygpOwotCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaSA9IGNvbnRlbnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCQkJLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIERUREZpbGUgaW4gYSBEVEQgZXh0ZW50Ci0JCQkJCUVPYmplY3QgcmVzdWx0ID0gKChEVERGaWxlKSBvYmopLmZpbmRPYmplY3QodXJpRnJhZ21lbnQpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+PiBEVERLZXkgRXJyb3I6IGNhbm5vdCBmaW5kIG9iamVjdCAiICsgdXJpRnJhZ21lbnQpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzdXBlci5nZXRFT2JqZWN0KHVyaUZyYWdtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkkge0BsaW5rIFVSSSNmcmFnbWVudCBmcmFnbWVudH0gdGhhdCwgd2hlbiBwYXNzZWQgdG8KLQkgKiB7QGxpbmsgI2dldEVPYmplY3QgZ2V0RU9iamVjdH0gd2lsbCByZXR1cm4gdGhlIGdpdmVuIG9iamVjdC4KLQkgKiA8cD4KLQkgKiBJbiBvdGhlciB3b3JkcywgdGhlIGZvbGxvd2luZyBpcyA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYW55IG9iamVjdAotCSAqIGNvbnRhaW5lZCBieSBhIHJlc291cmNlOgotCSAqIAotCSAqIDxwcmU+Ci0JICogCi0JICogICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBlT2JqZWN0LmVSZXNvdXJjZSgpOwotCSAqICAgIGVPYmplY3QgPT0gcmVzb3VyY2UuZ2V0RU9iamVjdChyZXNvdXJjZS5nZXRVUklGcmFnbWVudChlT2JqZWN0KSkKLQkgKiAKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgY2hvb3NlIHRvIHVzZSBJRHMgb3IgdG8gdXNlIHN0cnVjdHVyZWQgVVJJCi0JICogZnJhZ21lbnRzLCBhcyBzdXBwb3J0ZWQgYnkKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCNlVVJJRnJhZ21lbnRTZWdtZW50IGVVUklGcmFnbWVudFNlZ21lbnR9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBpZGVudGlmeS4KLQkgKiBAcmV0dXJuIHRoZSBVUkkge0BsaW5rIFVSSSNmcmFnbWVudCBmcmFnbWVudH0gZm9yIHRoZSBvYmplY3QuCi0JICogQHNlZSAjZ2V0RU9iamVjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0I2VVUklGcmFnbWVudFNlZ21lbnQob3JnLmVjbGlwc2UuZW1mLmNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLAotCSAqICAgICAgRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRVUklGcmFnbWVudChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBEVERPYmplY3QpIHsKLQkJCXJldHVybiAoKERURE9iamVjdCkgZU9iamVjdCkuZ2V0UGF0aG5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VVJJRnJhZ21lbnQoZU9iamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSBEVERVdGlsIGR0ZFV0aWw7Ci0KLQlwdWJsaWMgRFREVXRpbCBnZXREVERVdGlsKCkgewotCQlyZXR1cm4gZHRkVXRpbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREVERVdGlsKERURFV0aWwgZHRkVXRpbCkgewotCQl0aGlzLmR0ZFV0aWwgPSBkdGRVdGlsOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG9wdGlvbnMpIHsKLQotCQlTdHJpbmcgdXJpU3RyaW5nID0gZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJdHJ5IHsKLQkJCURURFV0aWwgZHRkVXRpbCA9IG5ldyBEVERVdGlsKCk7Ci0JCQlkdGRVdGlsLnBhcnNlKGdldFJlc291cmNlU2V0KCksIHVyaVN0cmluZyk7Ci0JCQlkdGRVdGlsLnNldFJlc291cmNlKHRoaXMpOwotCQkJc2V0RFREVXRpbChkdGRVdGlsKTsKLQkJCWdldENvbnRlbnRzKCkuYWRkKGR0ZFV0aWwuZ2V0RFRERmlsZSgpKTsKLQotCQkJLy8gUmVzZXQgdGhlIGRpcnR5IGZsYWcgYWZ0ZXIgdGhlIHJlc291cmNlIGlzIGxvYWRlZAotCQkJc2V0TW9kaWZpZWQoZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvcywgT2JqZWN0IG9wdGlvbnMpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaSA9IGNvbnRlbnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCURURFByaW50ZXIgcHJpbnRlciA9IG5ldyBEVERQcmludGVyKHRydWUpOwotCQkJCQkJcHJpbnRlci52aXNpdERUREZpbGUoKERUREZpbGUpIG9iaik7Ci0KLQkJCQkJCVN0cmluZyBzID0gcHJpbnRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCQkJCQkJb3Mud3JpdGUocy5nZXRCeXRlcygpKTsKLQkJCQkJCS8vIFJlc2V0IHRoZSBkaXJ0eSBmbGFnIGFmdGVyIHRoZSByZXNvdXJjZSBpcyBzYXZlZAotCQkJCQkJc2V0TW9kaWZpZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoWmlwT3V0cHV0U3RyZWFtIHpvcywgU3RyaW5nIGVudHJ5LCBTdHJpbmcgbWV0YU1vZGVsTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBFeGNlcHRpb24oRFREQ29yZU1lc3NhZ2VzLl9FWENfT1BFUkFUSU9OX05PVF9TVVBQT1JURUQpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFN3aXRjaC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTAzYjY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQW55Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRFREU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UgPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRFREUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRFREU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IERURFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJRUNsYXNzIHRoZUVDbGFzcyA9IHRoZUVPYmplY3QuZUNsYXNzKCk7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJc3dpdGNoICh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlQgOiB7Ci0JCQkJCURUREdyb3VwQ29udGVudCBkdGRHcm91cENvbnRlbnQgPSAoRFRER3JvdXBDb250ZW50KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREdyb3VwQ29udGVudChkdGRHcm91cENvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREUmVwZWF0YWJsZUNvbnRlbnQoZHRkR3JvdXBDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURUREVsZW1lbnRDb250ZW50KGR0ZEdyb3VwQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURSA6IHsKLQkJCQkJRFREQXR0cmlidXRlIGR0ZEF0dHJpYnV0ZSA9IChEVERBdHRyaWJ1dGUpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFREQXR0cmlidXRlKGR0ZEF0dHJpYnV0ZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFQXR0cmlidXRlKGR0ZEF0dHJpYnV0ZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoZHRkQXR0cmlidXRlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVUeXBlZEVsZW1lbnQoZHRkQXR0cmlidXRlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoZHRkQXR0cmlidXRlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoZHRkQXR0cmlidXRlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVCA6IHsKLQkJCQkJRFRERWxlbWVudCBkdGRFbGVtZW50ID0gKERUREVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERWxlbWVudChkdGRFbGVtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVDbGFzcyhkdGRFbGVtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURURENvbnRlbnQoZHRkRWxlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFQ2xhc3NpZmllcihkdGRFbGVtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoZHRkRWxlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UIDogewotCQkJCQlEVERFbXB0eUNvbnRlbnQgZHRkRW1wdHlDb250ZW50ID0gKERUREVtcHR5Q29udGVudCkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERFbXB0eUNvbnRlbnQoZHRkRW1wdHlDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURUREVsZW1lbnRDb250ZW50KGR0ZEVtcHR5Q29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UIDogewotCQkJCQlEVERBbnlDb250ZW50IGR0ZEFueUNvbnRlbnQgPSAoRFREQW55Q29udGVudCkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERBbnlDb250ZW50KGR0ZEFueUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERWxlbWVudENvbnRlbnQoZHRkQW55Q29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVCA6IHsKLQkJCQkJRFREUENEYXRhQ29udGVudCBkdGRwY0RhdGFDb250ZW50ID0gKERURFBDRGF0YUNvbnRlbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFREUENEYXRhQ29udGVudChkdGRwY0RhdGFDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURUREVsZW1lbnRDb250ZW50KGR0ZHBjRGF0YUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UIDogewotCQkJCQlEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudCA9IChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudChkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERSZXBlYXRhYmxlQ29udGVudChkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEUgOiB7Ci0JCQkJCURUREZpbGUgZHRkRmlsZSA9IChEVERGaWxlKSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREZpbGUoZHRkRmlsZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEUgOiB7Ci0JCQkJCURUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGUgPSAoRFREQmFzaWNUeXBlKSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREJhc2ljVHlwZShkdGRCYXNpY1R5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUNsYXNzKGR0ZEJhc2ljVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFQ2xhc3NpZmllcihkdGRCYXNpY1R5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChkdGRCYXNpY1R5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChkdGRCYXNpY1R5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFIDogewotCQkJCQlEVERFbnVtZXJhdGlvblR5cGUgZHRkRW51bWVyYXRpb25UeXBlID0gKERUREVudW1lcmF0aW9uVHlwZSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERFbnVtZXJhdGlvblR5cGUoZHRkRW51bWVyYXRpb25UeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVFbnVtKGR0ZEVudW1lcmF0aW9uVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFRGF0YVR5cGUoZHRkRW51bWVyYXRpb25UeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVDbGFzc2lmaWVyKGR0ZEVudW1lcmF0aW9uVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGR0ZEVudW1lcmF0aW9uVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGR0ZEVudW1lcmF0aW9uVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OIDogewotCQkJCQlEVEROb3RhdGlvbiBkdGROb3RhdGlvbiA9IChEVEROb3RhdGlvbikgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVEROb3RhdGlvbihkdGROb3RhdGlvbik7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERDb250ZW50KGR0ZE5vdGF0aW9uKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZIDogewotCQkJCQlEVERFbnRpdHkgZHRkRW50aXR5ID0gKERUREVudGl0eSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERFbnRpdHkoZHRkRW50aXR5KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURURENvbnRlbnQoZHRkRW50aXR5KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZIDogewotCQkJCQlEVERFeHRlcm5hbEVudGl0eSBkdGRFeHRlcm5hbEVudGl0eSA9IChEVERFeHRlcm5hbEVudGl0eSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERFeHRlcm5hbEVudGl0eShkdGRFeHRlcm5hbEVudGl0eSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbnRpdHlDb250ZW50KGR0ZEV4dGVybmFsRW50aXR5KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZIDogewotCQkJCQlEVERJbnRlcm5hbEVudGl0eSBkdGRJbnRlcm5hbEVudGl0eSA9IChEVERJbnRlcm5hbEVudGl0eSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERJbnRlcm5hbEVudGl0eShkdGRJbnRlcm5hbEVudGl0eSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbnRpdHlDb250ZW50KGR0ZEludGVybmFsRW50aXR5KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0UgOiB7Ci0JCQkJCURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgPSAoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREQ29udGVudChkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlQgOiB7Ci0JCQkJCURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudCA9IChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERSZXBlYXRhYmxlQ29udGVudChkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURUREVsZW1lbnRDb250ZW50KGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERmlsZShEVERGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVEROb3RhdGlvbihEVEROb3RhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFREQ29udGVudChEVERDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbnRpdHkoRFRERW50aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbnRpdHlDb250ZW50KERUREVudGl0eUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREV4dGVybmFsRW50aXR5KERUREV4dGVybmFsRW50aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERJbnRlcm5hbEVudGl0eShEVERJbnRlcm5hbEVudGl0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERSZXBlYXRhYmxlQ29udGVudChEVERSZXBlYXRhYmxlQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnQoRFRERWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERWxlbWVudENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVtcHR5Q29udGVudChEVERFbXB0eUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREFueUNvbnRlbnQoRFREQW55Q29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFREUENEYXRhQ29udGVudChEVERQQ0RhdGFDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERHcm91cENvbnRlbnQoRFRER3JvdXBDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERBdHRyaWJ1dGUoRFREQXR0cmlidXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbnVtZXJhdGlvblR5cGUoRFRERW51bWVyYXRpb25UeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERCYXNpY1R5cGUoRFREQmFzaWNUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0JLy8KLQkvLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0JLy8gLy8gcHVibGljIE9iamVjdCBjYXNlRU5hbWVzcGFjZShFTmFtZXNwYWNlIG9iamVjdCkgewotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVDbGFzcyhFQ2xhc3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUVudW0oRUVudW0gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVNb2RlbEVsZW1lbnQoRU1vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRU5hbWVkRWxlbWVudChFTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFRGF0YVR5cGUoRURhdGFUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFVHlwZWRFbGVtZW50KEVUeXBlZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVDbGFzc2lmaWVyKEVDbGFzc2lmaWVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0JLy8KLQkvLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0JLy8gLy8gcHVibGljIE9iamVjdCBjYXNlSW50ZXJuYWxFQ2xhc3NpZmllcihJbnRlcm5hbEVDbGFzc2lmaWVyIG9iamVjdCkgewotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vIERURFN3aXRjaApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFVuaXF1ZU5hbWVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOGZmM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFVuaXF1ZU5hbWVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgRFREVW5pcXVlTmFtZUhlbHBlciB7Ci0JcHVibGljIERURFVuaXF1ZU5hbWVIZWxwZXIoKSB7Ci0KLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVFbGVtZW50TmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBlbGVtZW50cyA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoZWxlbWVudHMsICJOZXdFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVFbnRpdHlOYW1lKERUREZpbGUgZHRkRmlsZSkgewotCQlMaXN0IGVudGl0aWVzID0gZHRkRmlsZS5saXN0RFRERW50aXR5KCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGVudGl0aWVzLCAiTmV3RW50aXR5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOb3RhdGlvbk5hbWUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxpc3Qgbm90YXRpb25zID0gZHRkRmlsZS5saXN0RFRETm90YXRpb24oKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUobm90YXRpb25zLCAiTmV3Tm90YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUF0dHJpYnV0ZU5hbWUoRFRERWxlbWVudCBlbGVtZW50KSB7Ci0JCUxpc3QgYXR0cnMgPSBlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShhdHRycywgIk5ld0F0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZShMaXN0IG9ianMsIFN0cmluZyB0b2tlbikgewotCQlpbnQgY291bnRlciA9IDE7Ci0KLQkJYm9vbGVhbiB1bmlxdWVOYW1lID0gZmFsc2U7Ci0JCXdoaWxlICghdW5pcXVlTmFtZSkgewotCQkJU3RyaW5nIG5ld05hbWUgPSB0b2tlbiArIG5ldyBJbnRlZ2VyKGNvdW50ZXIrKyk7Ci0JCQl1bmlxdWVOYW1lID0gdHJ1ZTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBvYmpzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIG9iak5hbWUgPSBnZXROYW1lKG9iaik7Ci0JCQkJaWYgKG9iak5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJCXVuaXF1ZU5hbWUgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVuaXF1ZU5hbWUpIHsKLQkJCQlyZXR1cm4gbmV3TmFtZTsKLQkJCX0KLQkJfQotCQkvLyB3ZSBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJcmV0dXJuICJObyBOYW1lIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRFRERWxlbWVudCkgewotCQkJcmV0dXJuICgoRFRERWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRERW50aXR5KSB7Ci0JCQlyZXR1cm4gKChEVERFbnRpdHkpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERURE5vdGF0aW9uKSB7Ci0JCQlyZXR1cm4gKChEVEROb3RhdGlvbikgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFREQXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gKChEVERBdHRyaWJ1dGUpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUVsZW1lbnROYW1lR2VuKERUREZpbGUgZHRkRmlsZSkgewotCi0JCUxpc3QgZWxlbWVudHMgPSBkdGRGaWxlLmxpc3REVERFbGVtZW50KCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGVsZW1lbnRzLCAiTmV3RWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUVudGl0eU5hbWVHZW4oRFRERmlsZSBkdGRGaWxlKSB7Ci0KLQkJTGlzdCBlbnRpdGllcyA9IGR0ZEZpbGUubGlzdERUREVudGl0eSgpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShlbnRpdGllcywgIk5ld0VudGl0eSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZU5vdGF0aW9uTmFtZUdlbihEVERGaWxlIGR0ZEZpbGUpIHsKLQotCQlMaXN0IG5vdGF0aW9ucyA9IGR0ZEZpbGUubGlzdERURE5vdGF0aW9uKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKG5vdGF0aW9ucywgIk5ld05vdGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlQXR0cmlidXRlTmFtZUdlbihEVERFbGVtZW50IGVsZW1lbnQpIHsKLQotCQlMaXN0IGF0dHJzID0gZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoYXR0cnMsICJOZXdBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVOYW1lR2VuKExpc3Qgb2JqcywgU3RyaW5nIHRva2VuKSB7Ci0KLQkJaW50IGNvdW50ZXIgPSAxOwotCi0JCWJvb2xlYW4gdW5pcXVlTmFtZSA9IGZhbHNlOwotCQl3aGlsZSAoIXVuaXF1ZU5hbWUpIHsKLQkJCVN0cmluZyBuZXdOYW1lID0gdG9rZW4gKyBuZXcgSW50ZWdlcihjb3VudGVyKyspOwotCQkJdW5pcXVlTmFtZSA9IHRydWU7Ci0JCQlJdGVyYXRvciBpdGVyID0gb2Jqcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCVN0cmluZyBvYmpOYW1lID0gZ2V0TmFtZShvYmopOwotCQkJCWlmIChvYmpOYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCQl1bmlxdWVOYW1lID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICh1bmlxdWVOYW1lKSB7Ci0JCQkJcmV0dXJuIG5ld05hbWU7Ci0JCQl9Ci0JCX0KLQkJLy8gd2Ugc2hvdWxkbid0IGdldCBoZXJlCi0JCXJldHVybiAiTm8gTmFtZSBmb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZUdlbihPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERUREVsZW1lbnQpIHsKLQkJCXJldHVybiAoKERUREVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERUREVudGl0eSkgewotCQkJcmV0dXJuICgoRFRERW50aXR5KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVEROb3RhdGlvbikgewotCQkJcmV0dXJuICgoRFRETm90YXRpb24pIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERUREF0dHJpYnV0ZSkgewotCQkJcmV0dXJuICgoRFREQXR0cmlidXRlKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19Ly8gRFREVW5pcXVlTmFtZUhlbHBlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOWE3ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsLkRUREZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuRFREUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuRXJyb3JNZXNzYWdlOwotCi0vKioKLSAqIENyZWF0ZSBNT0Ygb2JqZWN0cyBmcm9tIHRoZSBwYXJzZWQgRFREIElmIG5vIERURCBmaWxlIGlzIHNwZWNpZmVkLCBjcmVhdGUKLSAqIHRoZSByb290IE1PRiBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIERURFV0aWwgewotCURUREZhY3RvcnkgZmFjdG9yeTsKLQlFTGlzdCBleHRlbnQ7Ci0JUmVzb3VyY2UgcmVzb3VyY2U7Ci0JRFRERmlsZSBkdGRGaWxlOwotCVN0cmluZyBkdGRNb2RlbEZpbGU7Ci0JYm9vbGVhbiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzOwotCi0JcHJpdmF0ZSBIYXNodGFibGUgZXh0ZXJuYWxEVERNb2RlbHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBIYXNodGFibGUgcGVQb29sID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgSGFzaHRhYmxlIGVsZW1lbnRQb29sID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHJpdmF0ZSBEVERQYXJzZXIgcGFyc2VyOwotCi0JcHJpdmF0ZSBWZWN0b3IgZXJyb3JNc2dzID0gbmV3IFZlY3RvcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHV0aWxDYWNoZSA9IG5ldyBIYXNodGFibGUoKTsKLQotCXN0YXRpYyBwdWJsaWMgRFREVXRpbCBnZXREVERVdGlsRm9yKFN0cmluZyBmaWxlbmFtZSkgewotCQlEVERVdGlsIHV0aWwgPSAoRFREVXRpbCkgdXRpbENhY2hlLmdldChmaWxlbmFtZSk7Ci0JCWlmICh1dGlsID09IG51bGwpIHsKLQkJCXV0aWwgPSBuZXcgRFREVXRpbCgpOwotCQkJdXRpbENhY2hlLnB1dChmaWxlbmFtZSwgdXRpbCk7Ci0JCX0KLQotCQlyZXR1cm4gdXRpbDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyB1cmkpIHsKLQkJcGFyc2UobmV3IFJlc291cmNlU2V0SW1wbCgpLCB1cmkpOwotCX0KLQotCS8qKgotCSAqIEludm9rZSBwYXJzZSB0byBwYXJzZSBhIC5kdGQgZmlsZSBpbnRvIGEgTU9GIG9iamVjdCBtb2RlbCBUaGlzIGlzCi0JICogaW52b2tlZCBieSB0aGUgUmVnaXN0ZXJlZERURFBhcnNlciB0aGF0IHJlZ2lzdGVycyB0aGlzIHBhcnNlciBmb3IgTU9GCi0JICogdG8gdXNlIGFnYWluc3QgdGhlIC5kdGQgdHlwZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZSAtCi0JICogICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmZWQgbmFtZSBvZiBhIC5kdGQgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKFJlc291cmNlU2V0IHJlc291cmNlcywgU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCS8vIEdldCB0aGUgZHRkIG5hbWUgZnJvbSB0aGUgZmlsZSBuYW1lCi0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGVuYW1lKTsKLQkJSVBhdGggaVBhdGggPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkJU3RyaW5nIGR0ZE5hbWUgPSBpUGF0aC50b0ZpbGUoKS5nZXROYW1lKCk7Ci0KLQkJdHJ5IHsKLQkJCXBhcnNlciA9IG5ldyBEVERQYXJzZXIoZmFsc2UpOwotCQkJaWYgKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkJCQlwYXJzZXIuc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhleHBhbmRFbnRpdHlSZWZlcmVuY2VzKTsKLQkJCX0KLQkJCXBhcnNlci5wYXJzZShmaWxlbmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JCX0KLQotCQlkdGRNb2RlbEZpbGUgPSBmaWxlbmFtZTsKLQotCQlmYWN0b3J5ID0gRFRERmFjdG9yeUltcGwuaW5zdGFuY2UoKTsKLQotCQlleHRlbnQgPSBuZXcgQmFzaWNFTGlzdCgpOwotCi0JCWR0ZEZpbGUgPSBmYWN0b3J5LmNyZWF0ZURUREZpbGUoKTsKLQkJZXh0ZW50LmFkZChkdGRGaWxlKTsKLQotCQlkdGRGaWxlLnNldE5hbWUoZHRkTmFtZSk7Ci0KLQkJcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKTsKLQl9Ci0KLQlwdWJsaWMgRFRERmFjdG9yeSBnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotCQlyZXR1cm4gZHRkRmlsZTsKLQl9Ci0KLQlwdWJsaWMgSGFzaHRhYmxlIGdldFBFUG9vbCgpIHsKLQkJcmV0dXJuIHBlUG9vbDsKLQl9Ci0KLQlwdWJsaWMgSGFzaHRhYmxlIGdldEVsZW1lbnRQb29sKCkgewotCQlyZXR1cm4gZWxlbWVudFBvb2w7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldENvbnRlbnRzKCkgewotCQlyZXR1cm4gZXh0ZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldGV4cGFuZEVudGl0eVJlZmVyZW5jZXMoYm9vbGVhbiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKSB7Ci0JCXRoaXMuZXhwYW5kRW50aXR5UmVmZXJlbmNlcyA9IGV4cGFuZEVudGl0eVJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGhhcyBiZWVuIG1vZGlmaWVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlbERpcnR5KCkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc291cmNlLmlzTW9kaWZpZWQoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgLmR0ZCBmaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2F2ZSgpIHsKLQkJdHJ5IHsKLQkJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCXJlc291cmNlLnNhdmUob3B0aW9ucyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNhdmUgbW9kZWwgZXhjZXB0aW9uICIgKyBleCk7IC8vJE5PTi1OTFMtMSQKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2F2ZUFzKFN0cmluZyBuZXdGaWxlbmFtZSkgewotCQlyZXNvdXJjZS5zZXRVUkkoVVJJLmNyZWF0ZVVSSShuZXdGaWxlbmFtZSkpOwotCQlib29sZWFuIG9rID0gc2F2ZSgpOwotCi0JCWlmIChvaykgewotCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgobmV3RmlsZW5hbWUpOwotCQkJSVBhdGggaVBhdGggPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkJCVN0cmluZyBkdGROYW1lID0gaVBhdGgudG9GaWxlKCkuZ2V0TmFtZSgpOwotCi0JCQlkdGRGaWxlLnNldE5hbWUoZHRkTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG9rOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhdmVEVERGaWxlKFN0cmluZyBmaWxlbmFtZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSksIHRydWUpOwotCQkJRFREUHJpbnRlciBwcmludGVyID0gbmV3IERURFByaW50ZXIodHJ1ZSk7Ci0JCQlwcmludGVyLnZpc2l0RFRERmlsZShkdGRGaWxlKTsKLQotCQkJU3RyaW5nIHMgPSBwcmludGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7Ci0JCQlwdy5wcmludGxuKHMpOwotCQkJcHcuY2xvc2UoKTsKLQkJfQotCi0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERURFNvdXJjZShib29sZWFuIGluY2x1ZGVFcnJvcikgewotCQlyZXR1cm4gZHRkRmlsZS51bnBhcnNlKGluY2x1ZGVFcnJvcik7IC8vIHRydWUgPSBpbmNsdWRlIGVycm9yIGxpbmVzCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIE1PRiBvYmplY3RzIGZyb20gRFRECi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRFREKFJlc291cmNlU2V0IHJlc291cmNlcywgYm9vbGVhbiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKSB7Ci0JCVZlY3RvciBkdGRMaXN0ID0gcGFyc2VyLmdldERURExpc3QoKTsKLQotCQkvLyBjcmVhdGUgWE1JTW9kZWwgZm9yIHRoZSBpbmNsdWRlZCBEVERzCi0JCWlmIChkdGRMaXN0LnNpemUoKSA+IDApIHsKLQkJCWlmICghZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCQkJCWZvciAoaW50IGkgPSBkdGRMaXN0LnNpemUoKSAtIDE7IGkgPiAwOyBpLS0pIHsKLQkJCQkJRFREIGR0ZCA9IChEVEQpIGR0ZExpc3QuZWxlbWVudEF0KGkpOwotCQkJCQlsb2FkSW5jbHVkZWREVEQocmVzb3VyY2VzLCBkdGQpOwotCQkJCX0KLQotCQkJCURURCBkdGQgPSAoRFREKSBkdGRMaXN0LmVsZW1lbnRBdCgwKTsKLQkJCQlwb3B1bGF0ZURURChyZXNvdXJjZXMsIGR0ZCwgZHRkRmlsZSk7IC8vIHBvcHVsYXRlIHRoZSBtYWluCi0JCQkJCQkJCQkJCQkJCS8vIERURAotCQkJCS8vIHZhbGlkYXRlV2l0aE1vZGVsKGR0ZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmb3IgKGludCBpID0gZHRkTGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCQlEVEQgZHRkID0gKERURCkgZHRkTGlzdC5lbGVtZW50QXQoaSk7Ci0JCQkJCXBvcHVsYXRlRFREKHJlc291cmNlcywgZHRkLCBkdGRGaWxlKTsKLQkJCQkJLy8gdmFsaWRhdGVXaXRoTW9kZWwoZHRkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyByZXR1cm4gdGhlIGluc3RhbmNlIHVuaXF1ZSB0byB0aGlzIERURFV0aWwgZmlsZSB0aGF0IHJlcHJlc2VudHMgYW4KLQkvLyBleHRlcm5hbGx5IGxvYWRlZCBkdGQgKHdpbGwgY3JlYXRlIGlmIG9uZSBkb2Vzbid0IGV4aXN0IHlldCkKLQlwdWJsaWMgRXh0ZXJuYWxEVERNb2RlbCBnZXRFeHRlcm5hbERURE1vZGVsKFJlc291cmNlU2V0IHJlc291cmNlcywgU3RyaW5nIHVyaSkgewotCQlpZiAoZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBEZWZhdWx0TXNnTG9nZ2VyLndyaXRlKCJFeHRlcm5hbCBEVEQgbmFtZTogIiArIHVyaSk7Ci0KLQkJaWYgKGV4dGVybmFsRFRETW9kZWxzLmNvbnRhaW5zS2V5KHVyaSkpIHsKLQkJCXJldHVybiAoRXh0ZXJuYWxEVERNb2RlbCkgZXh0ZXJuYWxEVERNb2RlbHMuZ2V0KHVyaSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFeHRlcm5hbERURE1vZGVsIGV4dE1vZGVsID0gbmV3IEV4dGVybmFsRFRETW9kZWwoKTsKLQkJCWlmIChleHRNb2RlbC5sb2FkTW9kZWwocmVzb3VyY2VzLCB1cmkpKSB7Ci0JCQkJZXh0ZXJuYWxEVERNb2RlbHMucHV0KHVyaSwgZXh0TW9kZWwpOwotCQkJCXJldHVybiBleHRNb2RlbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBsb2FkIHhtaU1vZGVscyBmb3IgaW5jbHVkZWQgRFREcwotCXByaXZhdGUgdm9pZCBsb2FkSW5jbHVkZWREVEQoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBEVEQgZHRkKSB7Ci0JCUV4dGVybmFsRFRETW9kZWwgZXh0TW9kZWwgPSBnZXRFeHRlcm5hbERURE1vZGVsKHJlc291cmNlcywgZHRkLmdldE5hbWUoKSk7Ci0JCWlmIChleHRNb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBub3cgZmlsbCBvdXIgaGFzaCB0YWJsZXMgZm9yIGVsZW1lbnRzIGFuZCBwYXJhbWV0ZXIgZW50aXRpZXMKLQkJCS8vIHNvIHRoYXQgd2Uga25vdyB3aGF0IGNhbiBiZSByZWZlcmVuY2VkIGJ5IG91ciBtYWluIGR0ZAotCQkJRFRERmlsZSBmaWxlID0gZXh0TW9kZWwuZ2V0RXh0ZXJuYWxEVERGaWxlKCk7Ci0JCQlDb2xsZWN0aW9uIGVsZW1lbnRMaXN0ID0gZmlsZS5saXN0RFRERWxlbWVudCgpOwotCQkJQ29sbGVjdGlvbiBlbnRpdHlMaXN0ID0gZmlsZS5saXN0RFRERW50aXR5KCk7Ci0KLQkJCUl0ZXJhdG9yIGkgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJRFRET2JqZWN0IG9iamVjdCA9IChEVERPYmplY3QpIGkubmV4dCgpOwotCQkJCWVsZW1lbnRQb29sLnB1dChnZXRCYXNlTmFtZShvYmplY3QpLCBvYmplY3QpOwotCQkJfQotCi0JCQlpID0gZW50aXR5TGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJRFRERW50aXR5IGVudGl0eSA9IChEVERFbnRpdHkpIGkubmV4dCgpOwotCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkgewotCQkJCQlwZVBvb2wucHV0KGdldEJhc2VOYW1lKGVudGl0eSksIGVudGl0eSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIE1PRiBvYmplY3RzIGZyb20gRFRECi0JICogCi0JICogMSkgd2lsbCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRFREIE1vZiBvYmplY3QgZm9yIEVudGl0eURlY2wsCi0JICogTm90YXRpb25EZWNsIGFuZCBFbGVtZW50RGVjbCBkZWNsYXJhdGlvbnMgZHVyaW5nIHRoZSAxc3QgcGFzcyAyKSBEdXJpbmcKLQkgKiB0aGUgMm5kIHBhc3MsIGl0IHdpbGwgYWRkIHRoZSBjb250ZW50TW9kZWwgYW5kIEF0dGxpc3QgdG8gYWxsCi0JICogRWxlbWVudERlY2wuCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRFREKFJlc291cmNlU2V0IHJlc291cmNlcywgRFREIGR0ZCwgRFRERmlsZSBkRmlsZSkgewotCQlEVERNb2RlbEJ1aWxkZXIgbW9kZWxCdWlsZGVyID0gbmV3IERURE1vZGVsQnVpbGRlcihyZXNvdXJjZXMsIHRoaXMsIGR0ZCwgZEZpbGUpOwotCi0JCW1vZGVsQnVpbGRlci52aXNpdERURChkdGQpOwotCX0KLQotCi0JcHVibGljIHZvaWQgZW1wdHlFcnJvck1lc3NhZ2VzKCkgewotCQllcnJvck1zZ3MucmVtb3ZlQWxsRWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFcnJvck1lc3NhZ2UoRXJyb3JNZXNzYWdlIGVycm9yKSB7Ci0JCWludCB2ZWN0b3JTaXplID0gZXJyb3JNc2dzLnNpemUoKTsKLQkJYm9vbGVhbiBhZGQgPSB0cnVlOwotCi0JCWlmICh2ZWN0b3JTaXplICE9IDApIHsKLQkJCWludCBpbmRleCA9IDA7Ci0KLQkJCXdoaWxlIChhZGQgPT0gdHJ1ZSAmJiBpbmRleCA8IHZlY3RvclNpemUpIHsKLQkJCQlpZiAoKChFcnJvck1lc3NhZ2UpIGVycm9yTXNncy5lbGVtZW50QXQoaW5kZXgpKS5lcXVhbHMoZXJyb3IpKSB7Ci0JCQkJCWFkZCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYWRkKSB7Ci0JCQllcnJvck1zZ3MuYWRkRWxlbWVudChlcnJvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVmVjdG9yIGdldEVycm9ycygpIHsKLQkJcmV0dXJuIGVycm9yTXNnczsKLQl9Ci0KLQkvLyBUaGlzIGdldHMgdGhlIG5hbWUgd2l0aG91dCBhbnkgcHNldWRvIG5hbWVzcGFjZSBwcmVmaXgKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlTmFtZShEVERPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBnZXROYW1lKG9iaiwgbnVsbCk7Ci0JfQotCi0JLy8gVGhpcyBnZXRzIHRoZSBuYW1lIHdpdGggcHNldWRvIG5hbWVzcGFjZSBwcmVmaXhlcyBpZiBkdGRGaWxlIGlzIG5vdAotCS8vIG51bGwKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKERURE9iamVjdCBvYmosIERUREZpbGUgZHRkRmlsZSkgewotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChvYmogaW5zdGFuY2VvZiBEVERFbnRpdHkpIHsKLQkJCURUREVudGl0eSBlbnRpdHkgPSAoRFRERW50aXR5KSBvYmo7Ci0JCQlpZiAoZHRkRmlsZSAhPSBudWxsICYmICFlbnRpdHkuZ2V0RFRERmlsZSgpLmVxdWFscyhkdGRGaWxlKSkgewotCQkJCW5hbWUgPSBuZXcgUGF0aChlbnRpdHkuZ2V0RFRERmlsZSgpLmdldE5hbWUoKSkubGFzdFNlZ21lbnQoKSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW5hbWUgKz0gIiUiICsgKChEVERFbnRpdHkpIG9iaikuZ2V0TmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbGVtZW50KSB7Ci0JCQlEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgb2JqOwotCQkJaWYgKGR0ZEZpbGUgIT0gbnVsbCAmJiAhZWxlbWVudC5nZXREVERGaWxlKCkuZXF1YWxzKGR0ZEZpbGUpKSB7Ci0JCQkJbmFtZSA9IG5ldyBQYXRoKGVsZW1lbnQuZ2V0RFRERmlsZSgpLmdldE5hbWUoKSkubGFzdFNlZ21lbnQoKSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW5hbWUgKz0gKChEVERFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbGVtZW50Q29udGVudCkgewotCQkJcmV0dXJuICgoRFRERWxlbWVudENvbnRlbnQpIG9iaikuZ2V0Q29udGVudE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHcm91cFR5cGUoaW50IGdyb3VwS2luZCwgaW50IG9jY3VycmVuY2UpIHsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCi0JCXN3aXRjaCAoZ3JvdXBLaW5kKSB7Ci0JCQljYXNlIERUREdyb3VwS2luZC5TRVFVRU5DRSA6Ci0JCQkJdHlwZSA9ICJEVERTZXF1ZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgRFRER3JvdXBLaW5kLkNIT0lDRSA6Ci0JCQkJdHlwZSA9ICJEVERDaG9pY2UiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQl0eXBlICs9IGdldFJlcGVhdGFibGVUeXBlU3VmZml4KG9jY3VycmVuY2UpOwotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlKGludCBvY2N1cnJlbmNlKSB7Ci0JCVN0cmluZyB0eXBlID0gIkRURFJlZmVyZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZSArPSBnZXRSZXBlYXRhYmxlVHlwZVN1ZmZpeChvY2N1cnJlbmNlKTsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFJlcGVhdGFibGVUeXBlU3VmZml4KGludCBvY2N1cnJlbmNlKSB7Ci0JCXJldHVybiAiKCIgKyAoY2hhcikgb2NjdXJyZW5jZSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuU3RhcnRpbmcgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoYXJncy5sZW5ndGggIT0gMSkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigidXNhZ2U6IER0ZFV0aWwgaW5wdXRmaWxlLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0KLQkJamF2YS5pby5GaWxlIGlucHV0RmlsZSA9IG5ldyBGaWxlKGFyZ3NbMF0pOwotCi0JCVN0cmluZyBkdGRGaWxlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlkdGRGaWxlTmFtZSA9IGlucHV0RmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQotCQlTdHJpbmcgZHRkTW9kZWxOYW1lID0gZHRkRmlsZU5hbWU7Ci0KLQkJaWYgKERURENvbnN0YW50cy5EVERfRVhURU5TSU9OLmVxdWFscyhuZXcgUGF0aChkdGRGaWxlTmFtZSkuZ2V0RmlsZUV4dGVuc2lvbigpKSkgewotCQkJZHRkTW9kZWxOYW1lID0gbmV3IFBhdGgoZHRkRmlsZU5hbWUpLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCQl9Ci0JCURURFV0aWwgZDJtID0gbmV3IERURFV0aWwoKTsKLQkJLy8gVE9ETzogZml4IHBvcnQKLQkJLy8gZDJtLnBhcnNlKGR0ZEZpbGVOYW1lKTsKLQkJdHJ5IHsKLQkJCWQybS5zYXZlQXMoZHRkTW9kZWxOYW1lICsgIi4iICsgRFREQ29uc3RhbnRzLkRURF9YTUlfRVhURU5TSU9OKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gdGhyb3duIGR1cmluZyBtb2RlbCBzYXZlOiAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIGdldFBhdGgoKSB7Ci0JCVBhdGggY3VycmVudERURFBhdGggPSBuZXcgUGF0aChkdGRNb2RlbEZpbGUpOwotCQlpZiAoY3VycmVudERURFBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlyZXR1cm4gY3VycmVudERURFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIERURFV0aWwgZ2V0RFREVXRpbEZvckdlbihTdHJpbmcgZmlsZW5hbWUpIHsKLQkvLwotCS8vIERURFV0aWwgdXRpbCA9IChEVERVdGlsKSB1dGlsQ2FjaGUuZ2V0KGZpbGVuYW1lKTsKLQkvLyBpZiAodXRpbCA9PSBudWxsKQotCS8vIHsKLQkvLyB1dGlsID0gbmV3IERURFV0aWwoKTsKLQkvLyB1dGlsQ2FjaGUucHV0KGZpbGVuYW1lLCB1dGlsKTsKLQkvLyB9Ci0JLy8gICAgCi0JLy8gcmV0dXJuIHV0aWw7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcGFyc2VHZW4oU3RyaW5nIHVyaSkgewotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JLy8gcGFyc2UobmV3IFJlc291cmNlU2V0SW1wbCgpLCB1cmkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEludm9rZSBwYXJzZSB0byBwYXJzZSBhIC5kdGQgZmlsZSBpbnRvIGEgTU9GIG9iamVjdCBtb2RlbAotCS8vICogVGhpcyBpcyBpbnZva2VkIGJ5IHRoZSBSZWdpc3RlcmVkRFREUGFyc2VyIHRoYXQgcmVnaXN0ZXJzIHRoaXMgcGFyc2VyCi0JLy8gZm9yIE1PRiB0byB1c2UKLQkvLyAqIGFnYWluc3QgdGhlIC5kdGQgdHlwZQotCS8vICogQHBhcmFtIGZpbGVuYW1lIC0gdGhlIGZ1bGx5IHF1YWxpZmVkIG5hbWUgb2YgYSAuZHRkIGZpbGUKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHBhcnNlR2VuKFJlc291cmNlU2V0IHJlc291cmNlcywgU3RyaW5nIGZpbGVuYW1lKSB7Ci0JLy8KLQkvLyAvLyBHZXQgdGhlIGR0ZCBuYW1lIGZyb20gdGhlIGZpbGUgbmFtZQotCS8vIFBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGVuYW1lKTsKLQkvLyBJUGF0aCBpUGF0aCA9IHBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotCS8vIFN0cmluZyBkdGROYW1lID0gaVBhdGgudG9GaWxlKCkuZ2V0TmFtZSgpOwotCS8vCi0JLy8KLQkvLyB0cnkKLQkvLyB7Ci0JLy8gcGFyc2VyID0gbmV3IERURFBhcnNlcihmYWxzZSk7Ci0JLy8gaWYgKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpCi0JLy8gewotCS8vIHBhcnNlci5zZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOwotCS8vIH0KLQkvLyBwYXJzZXIucGFyc2UoZmlsZW5hbWUpOwotCS8vIH0KLQkvLyBjYXRjaChJT0V4Y2VwdGlvbiBleCkKLQkvLyB7Ci0JLy8gZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gZHRkTW9kZWxGaWxlID0gZmlsZW5hbWU7Ci0JLy8KLQkvLwotCS8vIGZhY3RvcnkgPSBEVERGYWN0b3J5SW1wbC5pbnN0YW5jZSgpOwotCS8vCi0JLy8KLQkvLyBleHRlbnQgPSBuZXcgQmFzaWNFTGlzdCgpOwotCS8vCi0JLy8KLQkvLyBkdGRGaWxlID0gZmFjdG9yeS5jcmVhdGVEVERGaWxlKCk7Ci0JLy8gZXh0ZW50LmFkZChkdGRGaWxlKTsKLQkvLwotCS8vCi0JLy8gZHRkRmlsZS5zZXROYW1lKGR0ZE5hbWUpOwotCS8vCi0JLy8KLQkvLyBwb3B1bGF0ZURURChyZXNvdXJjZXMsIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERGYWN0b3J5IGdldEZhY3RvcnlHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZmFjdG9yeTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERmlsZSBnZXREVERGaWxlR2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIGR0ZEZpbGU7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIEhhc2h0YWJsZSBnZXRQRVBvb2xHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gcGVQb29sOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBIYXNodGFibGUgZ2V0RWxlbWVudFBvb2xHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZWxlbWVudFBvb2w7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIEVMaXN0IGdldEV4dGVudEdlbigpIHsKLQkvLwotCS8vIHJldHVybiBleHRlbnQ7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgc2V0UmVzb3VyY2VHZW4oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkvLwotCS8vIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2VHZW4oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkvLwotCS8vIHJldHVybiByZXNvdXJjZTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBzZXRleHBhbmRFbnRpdHlSZWZlcmVuY2VzR2VuKGJvb2xlYW4KLQkvLyBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKSB7Ci0JLy8KLQkvLyB0aGlzLmV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSBleHBhbmRFbnRpdHlSZWZlcmVuY2VzOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIGdldEV4cGFuZEVudGl0eVJlZmVyZW5jZXNHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZXhwYW5kRW50aXR5UmVmZXJlbmNlczsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kZWwgaGFzIGJlZW4gbW9kaWZpZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIGlzTW9kZWxEaXJ0eUdlbigpIHsKLQkvLwotCS8vIGlmIChyZXNvdXJjZSAhPSBudWxsKQotCS8vIHsKLQkvLyByZXR1cm4gcmVzb3VyY2UuaXNNb2RpZmllZCgpOwotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogU2F2ZSB0aGUgLmR0ZCBmaWxlCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBzYXZlR2VuKCkgewotCS8vCi0JLy8gdHJ5Ci0JLy8gewotCS8vIHJlc291cmNlLnNhdmUoKTsKLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9Ci0JLy8gY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLQkvLyB7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJTYXZlIG1vZGVsIGV4Y2VwdGlvbiAiICsgZXgpOwotCS8vIGV4LnByaW50U3RhY2tUcmFjZSgpOwotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZUFzR2VuKFN0cmluZyBuZXdGaWxlbmFtZSkgewotCS8vCi0JLy8gcmVzb3VyY2Uuc2V0VVJJKG5ld0ZpbGVuYW1lKTsKLQkvLyBib29sZWFuIG9rID0gc2F2ZSgpOwotCS8vCi0JLy8KLQkvLyBpZiAob2spCi0JLy8gewotCS8vIFBhdGggcGF0aCA9IG5ldyBQYXRoKG5ld0ZpbGVuYW1lKTsKLQkvLyBJUGF0aCBpUGF0aCA9IHBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotCS8vIFN0cmluZyBkdGROYW1lID0gaVBhdGgudG9GaWxlKCkuZ2V0TmFtZSgpOwotCS8vCi0JLy8KLQkvLyBkdGRGaWxlLnNldE5hbWUoZHRkTmFtZSk7Ci0JLy8gfQotCS8vIHJldHVybiBvazsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBzYXZlRFRERmlsZUdlbihTdHJpbmcgZmlsZW5hbWUpIHsKLQkvLwotCS8vIGJvb2xlYW4gcmVzdWx0PXRydWU7Ci0JLy8gdHJ5Ci0JLy8gewotCS8vIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKSx0cnVlKTsKLQkvLyBEVERQcmludGVyIHByaW50ZXIgPSBuZXcgRFREUHJpbnRlcih0cnVlKTsKLQkvLyBwcmludGVyLnZpc2l0RFRERmlsZShkdGRGaWxlKTsKLQkvLwotCS8vCi0JLy8gU3RyaW5nIHMgPSBwcmludGVyLmdldEJ1ZmZlcigpLmdldE5hbWUoKS50b1N0cmluZygpOwotCS8vIHB3LnByaW50bG4ocyk7Ci0JLy8gcHcuY2xvc2UoKTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGNhdGNoIChFeGNlcHRpb24gZSkKLQkvLyB7Ci0JLy8gcmVzdWx0ID0gZmFsc2U7Ci0JLy8gfQotCS8vIHJldHVybiByZXN1bHQ7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIFN0cmluZyBnZXREVERTb3VyY2VHZW4oYm9vbGVhbiBpbmNsdWRlRXJyb3IpIHsKLQkvLwotCS8vIHJldHVybiBkdGRGaWxlLnVucGFyc2UoaW5jbHVkZUVycm9yKTsgLy8gdHJ1ZSA9IGluY2x1ZGUgZXJyb3IgbGluZXMKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBDcmVhdGUgTU9GIG9iamVjdHMgZnJvbSBEVEQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlRFRER2VuKFJlc291cmNlU2V0IHJlc291cmNlcywgYm9vbGVhbgotCS8vIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkvLwotCS8vIFZlY3RvciBkdGRMaXN0ID0gcGFyc2VyLmdldERURExpc3QoKTsKLQkvLwotCS8vCi0JLy8gLy8gY3JlYXRlIFhNSU1vZGVsIGZvciB0aGUgaW5jbHVkZWQgRFREcwotCS8vIGlmICggZHRkTGlzdC5zaXplKCkgPiAwKQotCS8vIHsKLQkvLyBpZiAoIWV4cGFuZEVudGl0eVJlZmVyZW5jZXMpCi0JLy8gewotCS8vIGZvciAoaW50IGk9ZHRkTGlzdC5zaXplKCkgLSAxOyBpID4gMDsgaS0tKQotCS8vIHsKLQkvLyBEVEQgZHRkID0gKERURCkgZHRkTGlzdC5lbGVtZW50QXQoaSk7Ci0JLy8gbG9hZEluY2x1ZGVkRFREKHJlc291cmNlcywgZHRkKTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIERURCBkdGQgPSAoRFREKSBkdGRMaXN0LmVsZW1lbnRBdCgwKTsKLQkvLyBwb3B1bGF0ZURURChyZXNvdXJjZXMsIGR0ZCwgZHRkRmlsZSk7IC8vIHBvcHVsYXRlIHRoZSBtYWluIERURAotCS8vIC8vIHZhbGlkYXRlV2l0aE1vZGVsKGR0ZCk7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gZm9yIChpbnQgaSA9IGR0ZExpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pCi0JLy8gewotCS8vIERURCBkdGQgPSAoRFREKSBkdGRMaXN0LmVsZW1lbnRBdChpKTsKLQkvLyBwb3B1bGF0ZURURChyZXNvdXJjZXMsIGR0ZCwgZHRkRmlsZSk7Ci0JLy8gLy8gdmFsaWRhdGVXaXRoTW9kZWwoZHRkKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRXh0ZXJuYWxEVERNb2RlbCBnZXRFeHRlcm5hbERURE1vZGVsR2VuKFJlc291cmNlU2V0Ci0JLy8gcmVzb3VyY2VzLCBTdHJpbmcgdXJpKSB7Ci0JLy8KLQkvLyBpZiAoZXhwYW5kRW50aXR5UmVmZXJlbmNlcykKLQkvLyB7Ci0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCS8vICAgICAgIAotCS8vIERlZmF1bHRNc2dMb2dnZXIud3JpdGUoIkV4dGVybmFsIERURCBuYW1lOiAiICsgdXJpKTsKLQkvLwotCS8vCi0JLy8gaWYgKGV4dGVybmFsRFRETW9kZWxzLmNvbnRhaW5zS2V5KHVyaSkpCi0JLy8gewotCS8vIHJldHVybiAoRXh0ZXJuYWxEVERNb2RlbCkgZXh0ZXJuYWxEVERNb2RlbHMuZ2V0KHVyaSk7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gRXh0ZXJuYWxEVERNb2RlbCBleHRNb2RlbCA9IG5ldyBFeHRlcm5hbERURE1vZGVsKCk7Ci0JLy8gaWYgKGV4dE1vZGVsLmxvYWRNb2RlbChyZXNvdXJjZXMsIHVyaSkpCi0JLy8gewotCS8vIGV4dGVybmFsRFRETW9kZWxzLnB1dCh1cmksIGV4dE1vZGVsKTsKLQkvLyByZXR1cm4gZXh0TW9kZWw7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBsb2FkSW5jbHVkZWREVERHZW4oUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBEVEQgZHRkKSB7Ci0JLy8KLQkvLyBFeHRlcm5hbERURE1vZGVsIGV4dE1vZGVsID0gZ2V0RXh0ZXJuYWxEVERNb2RlbChyZXNvdXJjZXMsCi0JLy8gZHRkLmdldE5hbWUoKSk7Ci0JLy8gaWYgKGV4dE1vZGVsICE9IG51bGwpCi0JLy8gewotCS8vIC8vIG5vdyBmaWxsIG91ciBoYXNoIHRhYmxlcyBmb3IgZWxlbWVudHMgYW5kIHBhcmFtZXRlciBlbnRpdGllcwotCS8vIC8vIHNvIHRoYXQgd2Uga25vdyB3aGF0IGNhbiBiZSByZWZlcmVuY2VkIGJ5IG91ciBtYWluIGR0ZAotCS8vIERUREZpbGUgZmlsZSA9IGV4dE1vZGVsLmdldEV4dGVybmFsRFRERmlsZSgpOwotCS8vIENvbGxlY3Rpb24gZWxlbWVudExpc3QgPSBmaWxlLmxpc3REVERFbGVtZW50KCk7Ci0JLy8gQ29sbGVjdGlvbiBlbnRpdHlMaXN0ID0gZmlsZS5saXN0RFRERW50aXR5KCk7Ci0JLy8KLQkvLwotCS8vIEl0ZXJhdG9yIGkgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFRET2JqZWN0IG9iamVjdCA9IChEVERPYmplY3QpIGkubmV4dCgpOwotCS8vIGVsZW1lbnRQb29sLnB1dChnZXRCYXNlTmFtZShvYmplY3QpLCBvYmplY3QpOwotCS8vIH0KLQkvLyAgICAgIAotCS8vIGkgPSBlbnRpdHlMaXN0Lml0ZXJhdG9yKCk7Ci0JLy8gd2hpbGUgKGkuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBEVERFbnRpdHkgZW50aXR5ID0gKERUREVudGl0eSkgaS5uZXh0KCk7Ci0JLy8gaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCS8vIHsKLQkvLyBwZVBvb2wucHV0KGdldEJhc2VOYW1lKGVudGl0eSksIGVudGl0eSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQ3JlYXRlIE1PRiBvYmplY3RzIGZyb20gRFRECi0JLy8gKgotCS8vICogMSkgd2lsbCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRFREIE1vZiBvYmplY3QgZm9yIEVudGl0eURlY2wsCi0JLy8gTm90YXRpb25EZWNsCi0JLy8gKiBhbmQgRWxlbWVudERlY2wgZGVjbGFyYXRpb25zIGR1cmluZyB0aGUgMXN0IHBhc3MKLQkvLyAqIDIpIER1cmluZyB0aGUgMm5kIHBhc3MsIGl0IHdpbGwgYWRkIHRoZSBjb250ZW50TW9kZWwgYW5kIEF0dGxpc3QgdG8KLQkvLyBhbGwKLQkvLyAqIEVsZW1lbnREZWNsLgotCS8vICoKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlRFRER2VuKFJlc291cmNlU2V0IHJlc291cmNlcywgRFREIGR0ZCwgRFRERmlsZQotCS8vIGRGaWxlKSB7Ci0JLy8KLQkvLyBEVERNb2RlbEJ1aWxkZXIgbW9kZWxCdWlsZGVyID0gbmV3IERURE1vZGVsQnVpbGRlcihyZXNvdXJjZXMsIHRoaXMsCi0JLy8gZHRkLCBkRmlsZSk7Ci0JLy8KLQkvLwotCS8vIG1vZGVsQnVpbGRlci52aXNpdERURChkdGQpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGVtcHR5RXJyb3JNZXNzYWdlc0dlbigpIHsKLQkvLwotCS8vIGVycm9yTXNncy5yZW1vdmVBbGxFbGVtZW50cygpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGFkZEVycm9yTWVzc2FnZUdlbihFcnJvck1lc3NhZ2UgZXJyb3IpIHsKLQkvLwotCS8vIGludCB2ZWN0b3JTaXplID0gZXJyb3JNc2dzLnNpemUoKTsKLQkvLyBib29sZWFuIGFkZCA9IHRydWU7Ci0JLy8KLQkvLwotCS8vIGlmICh2ZWN0b3JTaXplICE9IDApCi0JLy8gewotCS8vIGludCBpbmRleCA9IDA7Ci0JLy8KLQkvLwotCS8vIHdoaWxlIChhZGQgPT0gdHJ1ZSAmJiBpbmRleCA8IHZlY3RvclNpemUpCi0JLy8gewotCS8vIGlmICgoKEVycm9yTWVzc2FnZSkgZXJyb3JNc2dzLmVsZW1lbnRBdChpbmRleCkpLmVxdWFscyhlcnJvcikpCi0JLy8gewotCS8vIGFkZCA9ZmFsc2U7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gaW5kZXgrKzsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gaWYgKGFkZCkKLQkvLyB7Ci0JLy8gZXJyb3JNc2dzLmFkZEVsZW1lbnQoZXJyb3IpOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgVmVjdG9yIGdldEVycm9yc0dlbigpIHsKLQkvLwotCS8vIHJldHVybiBlcnJvck1zZ3M7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVEVERHZW4oKSB7Ci0JLy8KLQkvLyBTdHJpbmcgdGVtcERUREZpbGU9Z2V0UGF0aCgpLnRvT1NTdHJpbmcoKSsidGVtcFZhbGlkYXRpbmdGaWxlTmFtZS5kdGQiOwotCS8vIHRyeQotCS8vIHsKLQkvLyBzYXZlRFRERmlsZSh0ZW1wRFRERmlsZSk7Ci0JLy8KLQkvLwotCS8vIHBhcnNlciA9IG5ldyBEVERQYXJzZXIoZmFsc2UpOwotCS8vIGlmIChGaWxlVXRpbGl0eS5maWxlRXhpc3RzKHRlbXBEVERGaWxlKSkKLQkvLyB7Ci0JLy8gcGFyc2VyLnBhcnNlKHRlbXBEVERGaWxlKTsKLQkvLyB9Ci0JLy8gVmVjdG9yIGR0ZExpc3QgPSBwYXJzZXIuZ2V0RFRETGlzdCgpOwotCS8vIGlmICggZHRkTGlzdC5zaXplKCkgPiAwKQotCS8vIHsKLQkvLyAvLyByZXNldCB0aGUgZXJyb3JzIGFuZCB1cGRhdGUgd2hhdCB3ZSBoYXZlIGluIHRoZSBlbGVtZW50IHBvb2wKLQkvLyBlbXB0eUVycm9yTWVzc2FnZXMoKTsKLQkvLyB1cGRhdGVFbGVtZW50SGFzaHRhYmxlKCk7Ci0JLy8KLQkvLwotCS8vIC8vIFRPRE86IGRvIHdlIGp1c3QgdmFsaWRhdGUgdGhlIGN1cnJlbnQgb25lPwotCS8vIHZhbGlkYXRlV2l0aE1vZGVsKChEVEQpZHRkTGlzdC5lbGVtZW50QXQoMCkpOwotCS8vIH0KLQkvLyB9Ci0JLy8gY2F0Y2goSU9FeGNlcHRpb24gZXgpCi0JLy8gewotCS8vIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkvLyBGaWxlVXRpbGl0eS5kZWxldGUodGVtcERUREZpbGUpOwotCS8vIH0KLQkvLyBGaWxlVXRpbGl0eS5kZWxldGUodGVtcERUREZpbGUpOwotCS8vCi0JLy8KLQkvLyByZXR1cm4gZHRkRmlsZS5pc1BhcnNlRXJyb3IoKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVdpdGhNb2RlbEdlbihEVEQgZHRkKSB7Ci0JLy8KLQkvLyBFbnVtZXJhdGlvbiBlbiA9IGR0ZC5leHRlcm5hbEVsZW1lbnRzKCk7Ci0JLy8gd2hpbGUgKGVuLmhhc01vcmVFbGVtZW50cygpKQotCS8vIHsKLQkvLyBPYmplY3QgZSA9IGVuLm5leHRFbGVtZW50KCk7Ci0JLy8KLQkvLwotCS8vIGlmICggZSBpbnN0YW5jZW9mIEVudGl0eURlY2wgKQotCS8vIHsKLQkvLyBFbnRpdHlEZWNsIGVudGl0eSA9IChFbnRpdHlEZWNsKSBlOwotCS8vIEVycm9yTWVzc2FnZSBlcnJNc2cgPSBlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JLy8gaWYgKCBlcnJNc2chPSBudWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyAvLyBkdGRGaWxlLnNldFBhcnNlRXJyb3IodHJ1ZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyBlbHNlIGlmICggZSBpbnN0YW5jZW9mIEVsZW1lbnREZWNsICkKLQkvLyB7Ci0JLy8gRWxlbWVudERlY2wgZWxlbSA9IChFbGVtZW50RGVjbCkgZTsKLQkvLyBFcnJvck1lc3NhZ2UgZXJyTXNnID0gZWxlbS5nZXRFcnJvck1lc3NhZ2UoKTsKLQkvLyBEVERFbGVtZW50IGR0ZGVsZW1lbnQgPSAoRFRERWxlbWVudCkKLQkvLyBnZXRFbGVtZW50UG9vbCgpLmdldChlbGVtLmdldE5vZGVOYW1lKCkpOwotCS8vCi0JLy8KLQkvLyBpZiAoIGVyck1zZyE9IG51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIH0KLQkvLyBjaGVja0Zvck1pc3NpbmdFbGVtZW50UmVmZXJlbmNlcyhkdGRlbGVtZW50KTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBOb3RhdGlvbkRlY2wgKQotCS8vIHsKLQkvLyBOb3RhdGlvbkRlY2wgbm90YXRpb24gPSAoTm90YXRpb25EZWNsKSBlOwotCS8vIEVycm9yTWVzc2FnZSBlcnJNc2cgPSBub3RhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKTsKLQkvLyBpZiAoIGVyck1zZyE9IG51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIH0KLQkvLyB9Ci0JLy8gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBBdHRsaXN0ICkKLQkvLyB7Ci0JLy8gQXR0bGlzdCBhdHRMaXN0ID0gKEF0dGxpc3QpIGU7Ci0JLy8gRXJyb3JNZXNzYWdlIGVyck1zZyA9IGF0dExpc3QuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JLy8gaWYgKCBlcnJNc2chPSBudWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gY2hlY2tGb3JEdXBsaWNhdGVJREF0dHJpYnV0ZSgpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUVsZW1lbnRIYXNodGFibGVHZW4oKSB7Ci0JLy8KLQkvLyBlbGVtZW50UG9vbC5jbGVhcigpOwotCS8vIENyZWF0ZUxpc3RJdGVtcyBpdGVtc0hlbHBlciA9IG5ldyBDcmVhdGVMaXN0SXRlbXMoZHRkRmlsZSk7Ci0JLy8KLQkvLwotCS8vIFZlY3RvciBhbGxFbGVtZW50cyA9IGl0ZW1zSGVscGVyLmdldEVsZW1lbnRzKCk7Ci0JLy8gLy8gZ28gdGhyb3VnaCBhbGwgdGhlIGR0ZEZpbGVzIGFuZCBsaXN0IHRoZSBlbGVtZW50cwotCS8vIGludCBudW1FbGVtZW50cyA9IGFsbEVsZW1lbnRzLnNpemUoKTsKLQkvLwotCS8vCi0JLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbGVtZW50czsgaSsrKQotCS8vIHsKLQkvLyBEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgYWxsRWxlbWVudHMuZWxlbWVudEF0KGkpOwotCS8vIGVsZW1lbnRQb29sLnB1dChnZXRCYXNlTmFtZShlbGVtZW50KSwgZWxlbWVudCk7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUVudGl0eUhhc2h0YWJsZUdlbigpIHsKLQkvLwotCS8vIHVwZGF0ZUhhc2hUYWJsZShwZVBvb2wsIGR0ZEZpbGUubGlzdERUREVudGl0eSgpKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVIYXNoVGFibGVHZW4oSGFzaHRhYmxlIGgsIENvbGxlY3Rpb24gZHRkT2JqZWN0cykgewotCS8vCi0JLy8gaC5jbGVhcigpOwotCS8vIEl0ZXJhdG9yIGkgPSBkdGRPYmplY3RzLml0ZXJhdG9yKCk7Ci0JLy8gd2hpbGUgKGkuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBTdHJpbmcgbmFtZSA9ICIiOwotCS8vIERURE9iamVjdCBvID0gKERURE9iamVjdCkgaS5uZXh0KCk7Ci0JLy8gbmFtZSA9IGdldEJhc2VOYW1lKG8pOwotCS8vIGgucHV0KG5hbWUsbyk7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEJhc2VOYW1lR2VuKERURE9iamVjdCBvYmopIHsKLQkvLwotCS8vIHJldHVybiBnZXROYW1lKG9iaiwgbnVsbCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZUdlbihEVERPYmplY3Qgb2JqLCBEVERGaWxlIGR0ZEZpbGUpIHsKLQkvLwotCS8vIFN0cmluZyBuYW1lID0gIiI7Ci0JLy8gaWYgKG9iaiBpbnN0YW5jZW9mIERUREVudGl0eSkKLQkvLyB7Ci0JLy8gRFRERW50aXR5IGVudGl0eSA9IChEVERFbnRpdHkpIG9iajsKLQkvLyBpZiAoZHRkRmlsZSAhPSBudWxsICYmCi0JLy8gIWVudGl0eS5nZXREVERGaWxlKCkuZXF1YWxzKGR0ZEZpbGUpKQotCS8vIHsKLQkvLyBuYW1lID0gbmV3IFBhdGgoZW50aXR5LmdldERUREZpbGUoKS5nZXROYW1lKCkpLmxhc3RTZWdtZW50KCkgKyAiOiAiOwotCS8vIH0KLQkvLyBuYW1lICs9ICIlIiArICgoRFRERW50aXR5KW9iaikuZ2V0TmFtZSgpICsgIjsiOwotCS8vIH0KLQkvLyBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbGVtZW50KQotCS8vIHsKLQkvLyBEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgb2JqOwotCS8vIGlmIChkdGRGaWxlICE9IG51bGwgJiYKLQkvLyAhZWxlbWVudC5nZXREVERGaWxlKCkuZXF1YWxzKGR0ZEZpbGUpKQotCS8vIHsKLQkvLyBuYW1lID0gbmV3IFBhdGgoZWxlbWVudC5nZXREVERGaWxlKCkuZ2V0TmFtZSgpKS5sYXN0U2VnbWVudCgpICsgIjogIjsKLQkvLyB9Ci0JLy8gbmFtZSArPSAoKERUREVsZW1lbnQpb2JqKS5nZXROYW1lKCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERUREVsZW1lbnRDb250ZW50KQotCS8vIHsKLQkvLyByZXR1cm4gKChEVERFbGVtZW50Q29udGVudCkgb2JqKS5nZXRDb250ZW50TmFtZSgpOwotCS8vIH0KLQkvLyByZXR1cm4gbmFtZTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBjaGVja0Zvck1pc3NpbmdFbGVtZW50UmVmZXJlbmNlc0dlbihEVERFbGVtZW50IGVsZW1lbnQpCi0JLy8gewotCS8vCi0JLy8gU3RyaW5nIGR0ZFN0cmluZyA9IG51bGw7Ci0JLy8gaWYgKCBlbGVtZW50ID09IG51bGwgKQotCS8vIHJldHVybjsKLQkvLwotCS8vCi0JLy8gVmVjdG9yIGVsZW1lbnRSZWZzID0gbmV3IFZlY3RvcigpOwotCS8vIGZpbmRFbGVtZW50UmVmZXJlbmNlcyhlbGVtZW50LmdldENvbnRlbnQoKSxlbGVtZW50UmVmcyk7Ci0JLy8KLQkvLwotCS8vIEVudW1lcmF0aW9uIGVuID0gZWxlbWVudFJlZnMuZWxlbWVudHMoKTsKLQkvLyB3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpCi0JLy8gewotCS8vIFN0cmluZyBlbGVtZW50UmVmTmFtZSA9ICIiOwotCS8vIERURE9iamVjdCBkdGRPYmplY3QgPSAoRFRET2JqZWN0KSBlbi5uZXh0RWxlbWVudCgpOwotCS8vCi0JLy8KLQkvLyBpZiAoIGR0ZE9iamVjdCBpbnN0YW5jZW9mIERUREVsZW1lbnQpCi0JLy8gewotCS8vIGVsZW1lbnRSZWZOYW1lID0gKChEVERFbGVtZW50KWR0ZE9iamVjdCkuZ2V0TmFtZSgpOwotCS8vIGlmICggZ2V0RWxlbWVudFBvb2woKS5nZXQoZWxlbWVudFJlZk5hbWUpID09IG51bGwpCi0JLy8gewotCS8vIGlmIChkdGRTdHJpbmcgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gZHRkU3RyaW5nID0gZ2V0RFREU291cmNlKGZhbHNlKTsKLQkvLyB9Ci0JLy8gU3RyaW5nIGVycm9yTXNnID0gIkVsZW1lbnQgXCIiICsgZWxlbWVudC5nZXROYW1lKCkgKyAiXCIsIHJlZmVycyB0bwotCS8vIHVuZGVjbGFyZWQgZWxlbWVudCAiCi0JLy8gKyAiXCIiICsgZWxlbWVudFJlZk5hbWUgKyAiXCIsIGluIGNvbnRlbnQgbW9kZWwuXG4iOwotCS8vIEVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNc2cpOwotCS8vIFNvdXJjZUxvY2F0aW9uSGVscGVyLkxpbmVDb2x1bW4gbGluZUNvbHVtbiA9Ci0JLy8gU291cmNlTG9jYXRpb25IZWxwZXIub2Zmc2V0VG9MaW5lQ29sdW1uKGR0ZFN0cmluZywKLQkvLyBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCkpOwotCS8vIGR0ZEVycm9yLnNldEVycm9yTGluZShsaW5lQ29sdW1uLmdldExpbmUoKSk7Ci0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JDb2x1bW4obGluZUNvbHVtbi5nZXRDb2x1bW4oKSk7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGR0ZEVycm9yKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBmaW5kRWxlbWVudFJlZmVyZW5jZXNHZW4oRFRERWxlbWVudENvbnRlbnQgY29udGVudCwKLQkvLyBWZWN0b3IgcmVzdWx0KSB7Ci0JLy8KLQkvLwotCS8vIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpCi0JLy8gewotCS8vIHJlc3VsdC5hZGRFbGVtZW50KCgoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpY29udGVudCkuZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKSk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KQotCS8vIHsKLQkvLyByZXN1bHQuYWRkRWxlbWVudCgoKERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpY29udGVudCkuZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKSk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpCi0JLy8gewotCS8vIERUREdyb3VwQ29udGVudCBncm91cCA9IChEVERHcm91cENvbnRlbnQpY29udGVudDsKLQkvLyBFTGlzdCBjb250ZW50cyA9IGdyb3VwLmdldENvbnRlbnQoKTsKLQkvLyBJdGVyYXRvciBpID0gY29udGVudHMuaXRlcmF0b3IoKTsKLQkvLyB3aGlsZSAoaS5oYXNOZXh0KCkpCi0JLy8gewotCS8vIGZpbmRFbGVtZW50UmVmZXJlbmNlcygoRFRERWxlbWVudENvbnRlbnQpIGkubmV4dCgpLCByZXN1bHQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JEdXBsaWNhdGVJREF0dHJpYnV0ZUdlbigpIHsKLQkvLwotCS8vIFN0cmluZyBkdGRTdHJpbmcgPSBudWxsOwotCS8vIENvbGxlY3Rpb24gZWxlbWVudHMgPSBkdGRGaWxlLmxpc3REVERFbGVtZW50KCk7Ci0JLy8gSXRlcmF0b3IgaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JLy8gd2hpbGUgKGkuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgaS5uZXh0KCk7Ci0JLy8gSXRlcmF0b3IgayA9IGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCkuaXRlcmF0b3IoKTsKLQkvLyBib29sZWFuIHNhdzFzdElEID0gZmFsc2U7Ci0JLy8gd2hpbGUgKGsuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBEVERBdHRyaWJ1dGUgYXR0ciA9IChEVERBdHRyaWJ1dGUpIGsubmV4dCgpOwotCS8vIERURFR5cGUgZFR5cGUgPSBhdHRyLmdldERURFR5cGUoKTsKLQkvLyBpZiAoZFR5cGUgaW5zdGFuY2VvZiBEVERCYXNpY1R5cGUpCi0JLy8gewotCS8vIGlmICggKChEVERCYXNpY1R5cGUpZFR5cGUpLmdldEtpbmQoKS5pbnRWYWx1ZSgpID09IERUREJhc2ljVHlwZUtpbmQuSUQpCi0JLy8gewotCS8vIGlmIChzYXcxc3RJRCkKLQkvLyB7Ci0JLy8gaWYgKGR0ZFN0cmluZyA9PSBudWxsKQotCS8vIHsKLQkvLyBkdGRTdHJpbmcgPSBnZXREVERTb3VyY2UoZmFsc2UpOwotCS8vIH0KLQkvLyBTdHJpbmcgZXJyTXNnID0gRFREUGx1Z2luLmdldERURFN0cmluZygiX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMSIpOwotCS8vIGVyck1zZyArPSBhdHRyLmdldE5hbWUoKSArCi0JLy8gRFREUGx1Z2luLmdldERURFN0cmluZygiX1VJX0VSUk9SUEFSVF9EVVBfSURfQVRUUklCVVRFXzIiKTsKLQkvLyAgICAgICAgICAgICAgCi0JLy8gRXJyb3JNZXNzYWdlIGR0ZEVycm9yID0gbmV3IEVycm9yTWVzc2FnZSgpOwotCS8vIGR0ZEVycm9yLnNldEVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIFNvdXJjZUxvY2F0aW9uSGVscGVyLkxpbmVDb2x1bW4gbGluZUNvbHVtbiA9Ci0JLy8gU291cmNlTG9jYXRpb25IZWxwZXIub2Zmc2V0VG9MaW5lQ29sdW1uKGR0ZFN0cmluZywKLQkvLyBhdHRyLmdldFN0YXJ0T2Zmc2V0KCkpOwotCS8vIGR0ZEVycm9yLnNldEVycm9yTGluZShsaW5lQ29sdW1uLmdldExpbmUoKSk7Ci0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JDb2x1bW4obGluZUNvbHVtbi5nZXRDb2x1bW4oKSk7Ci0JLy8gZHRkRXJyb3Iuc2V0T2JqZWN0KGF0dHIpOwotCS8vIGFkZEVycm9yTWVzc2FnZShkdGRFcnJvcik7Ci0JLy8gLy8gZHRkRmlsZS5zZXRQYXJzZUVycm9yKHRydWUpOwotCS8vIGJyZWFrOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIHNhdzFzdElEID0gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEdyb3VwVHlwZUdlbihpbnQgZ3JvdXBLaW5kLCBpbnQgb2NjdXJyZW5jZSkKLQkvLyB7Ci0JLy8KLQkvLyBTdHJpbmcgdHlwZSA9IG51bGw7Ci0JLy8KLQkvLwotCS8vIHN3aXRjaCAoZ3JvdXBLaW5kKQotCS8vIHsKLQkvLyBjYXNlIERUREdyb3VwS2luZC5TRVFVRU5DRToKLQkvLyB0eXBlID0gIkRURFNlcXVlbmNlIjsKLQkvLyBicmVhazsKLQkvLyBjYXNlIERUREdyb3VwS2luZC5DSE9JQ0U6Ci0JLy8gdHlwZSA9ICJEVERDaG9pY2UiOwotCS8vIGJyZWFrOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gdHlwZSArPSBnZXRSZXBlYXRhYmxlVHlwZVN1ZmZpeChvY2N1cnJlbmNlKTsKLQkvLyByZXR1cm4gdHlwZTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlR2VuKGludCBvY2N1cnJlbmNlKSB7Ci0JLy8KLQkvLyBTdHJpbmcgdHlwZSA9ICJEVERSZWZlcmVuY2UiOwotCS8vIHR5cGUgKz0gZ2V0UmVwZWF0YWJsZVR5cGVTdWZmaXgob2NjdXJyZW5jZSk7Ci0JLy8gcmV0dXJuIHR5cGU7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0UmVwZWF0YWJsZVR5cGVTdWZmaXhHZW4oaW50IG9jY3VycmVuY2UpIHsKLQkvLwotCS8vIHJldHVybiAiKCIgKyAoY2hhcilvY2N1cnJlbmNlICsgIikiOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBtYWluR2VuKFN0cmluZ1tdIGFyZ3MpIHsKLQkvLwotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXG5TdGFydGluZyAuLi4iKTsKLQkvLwotCS8vCi0JLy8gaWYgKGFyZ3MubGVuZ3RoICE9IDEpCi0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJ1c2FnZTogRHRkVXRpbCBpbnB1dGZpbGUuZHRkIik7Ci0JLy8KLQkvLwotCS8vIGphdmEuaW8uRmlsZSBpbnB1dEZpbGUgPSBuZXcgRmlsZShhcmdzWzBdKTsKLQkvLwotCS8vCi0JLy8gU3RyaW5nIGR0ZEZpbGVOYW1lID0gIiI7Ci0JLy8gdHJ5Ci0JLy8gewotCS8vIGR0ZEZpbGVOYW1lID0gaW5wdXRGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKLQkvLyB9Ci0JLy8gY2F0Y2goSU9FeGNlcHRpb24gZXgpCi0JLy8ge30KLQkvLwotCS8vCi0JLy8gU3RyaW5nIGR0ZE1vZGVsTmFtZSA9IGR0ZEZpbGVOYW1lOwotCS8vCi0JLy8KLQkvLyBpZiAoRFREQ29uc3RhbnRzLkRURF9FWFRFTlNJT04uZXF1YWxzKG5ldwotCS8vIFBhdGgoZHRkRmlsZU5hbWUpLmdldEZpbGVFeHRlbnNpb24oKSkpCi0JLy8gewotCS8vIGR0ZE1vZGVsTmFtZT0gbmV3Ci0JLy8gUGF0aChkdGRGaWxlTmFtZSkucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0JLy8gfQotCS8vIERURFV0aWwgZDJtID0gbmV3IERURFV0aWwoKTsKLQkvLyAvLyBUT0RPOiBmaXggcG9ydAotCS8vIC8vIGQybS5wYXJzZShkdGRGaWxlTmFtZSk7Ci0JLy8gdHJ5Ci0JLy8gewotCS8vIGQybS5zYXZlQXMoZHRkTW9kZWxOYW1lICsgIi4iICsgRFREQ29uc3RhbnRzLkRURF9YTUlfRVhURU5TSU9OKTsKLQkvLyB9Ci0JLy8gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCS8vIHsKLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIG1vZGVsIHNhdmU6ICIgKyBlKTsKLQkvLyB9Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJEb25lLiIpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGggZ2V0UGF0aEdlbigpIHsKLQkvLwotCS8vIFBhdGggY3VycmVudERURFBhdGggPSBuZXcgUGF0aChkdGRNb2RlbEZpbGUpOwotCS8vIGlmIChjdXJyZW50RFREUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0JLy8gewotCS8vIHJldHVybiBjdXJyZW50RFREUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkvLyB9Ci0JLy8gICAgCi0JLy8gcmV0dXJuIG5ldyBQYXRoKCIiKTsKLQkvLyB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1NjU3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQW55Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudDsKLQotCi0KLXB1YmxpYyBjbGFzcyBEVERWaXNpdG9yIHsKLQotCXB1YmxpYyBEVERWaXNpdG9yKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERmlsZShEVERGaWxlIGZpbGUpIHsKLQkJQ29sbGVjdGlvbiBub3RhdGlvbnMgPSBmaWxlLmxpc3REVEROb3RhdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBub3RhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQl2aXNpdERURE5vdGF0aW9uKChEVEROb3RhdGlvbikgaS5uZXh0KCkpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBlbnRpdGllcyA9IGZpbGUubGlzdERUREVudGl0eSgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBlbnRpdGllcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCXZpc2l0RFRERW50aXR5KChEVERFbnRpdHkpIGkubmV4dCgpKTsKLQkJfQotCi0JCUNvbGxlY3Rpb24gb2JqZWN0cyA9IGZpbGUubGlzdERUREVsZW1lbnRBbmREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCURURE9iamVjdCBvYmplY3QgPSAoRFRET2JqZWN0KSBpLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEVERFbGVtZW50KSB7Ci0JCQkJdmlzaXREVERFbGVtZW50KChEVERFbGVtZW50KSBvYmplY3QpOwotCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJCWVsc2UgewotCQkJCXZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIG9iamVjdCk7Ci0JCQl9IC8vIGVuZCBvZiBpZiAoKQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURE5vdGF0aW9uKERURE5vdGF0aW9uIG5vdGF0aW9uKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbnRpdHkoRFRERW50aXR5IGVudGl0eSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudChEVERFbGVtZW50IGVsZW1lbnQpIHsKLQkJdmlzaXREVERFbGVtZW50Q29udGVudChlbGVtZW50LmdldENvbnRlbnQoKSk7Ci0JCXZpc2l0RFREQXR0cmlidXRlTGlzdChlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eSkgewotCi0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50Q29udGVudChEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidmlzaXREVERFbGVtZW50Q29udGVudCA6ICIgKyBjb250ZW50KTsKLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbXB0eUNvbnRlbnQpIHsKLQkJCXZpc2l0RFRERW1wdHlDb250ZW50KChEVERFbXB0eUNvbnRlbnQpIGNvbnRlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERBbnlDb250ZW50KSB7Ci0JCQl2aXNpdERUREFueUNvbnRlbnQoKERUREFueUNvbnRlbnQpIGNvbnRlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERQQ0RhdGFDb250ZW50KSB7Ci0JCQl2aXNpdERURFBDRGF0YUNvbnRlbnQoKERURFBDRGF0YUNvbnRlbnQpIGNvbnRlbnQpOwotCQl9Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUmVwZWF0YWJsZUNvbnRlbnQpIHsKLQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KSB7Ci0JCQkJdmlzaXREVERHcm91cENvbnRlbnQoKERUREdyb3VwQ29udGVudCkgY29udGVudCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCQl2aXNpdERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgY29udGVudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2aXNpdERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIGNvbnRlbnQpOwotCQkJfSAvLyBlbmQgb2YgZWxzZQotCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm9jY3VycmVuY2U6ICIgKwotCQkJLy8gKGNoYXIpKChEVERSZXBlYXRhYmxlQ29udGVudCljb250ZW50KS5nZXRPY2N1cnJlbmNlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbXB0eUNvbnRlbnQoRFRERW1wdHlDb250ZW50IGR0ZEVtcHR5Q29udGVudCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IEVNUFRZIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERBbnlDb250ZW50KERUREFueUNvbnRlbnQgZHRkQW55Q29udGVudCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IEFOWSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREUENEYXRhQ29udGVudChEVERQQ0RhdGFDb250ZW50IHBjRGF0YUNvbnRlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBQQ0RBVEEiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREdyb3VwQ29udGVudChEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50KSB7Ci0JCWlmIChncm91cENvbnRlbnQuZ2V0R3JvdXBLaW5kKCkuZ2V0VmFsdWUoKSA9PSBEVERHcm91cEtpbmQuU0VRVUVOQ0UpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogU2VxdWVuY2UiKTsKLQkJfQotCQllbHNlIC8vIGlmIChjb250ZW50Z2V0R3JvdXBLaW5kKCkgPT0gRFRER3JvdXBLaW5kLkNIT0lDRSkKLQkJewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBDaG9pY2UiKTsKLQkJfQotCi0JCUNvbGxlY3Rpb24gZ3JvdXBDb250ZW50cyA9IGdyb3VwQ29udGVudC5nZXRDb250ZW50KCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGdyb3VwQ29udGVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQl2aXNpdERUREVsZW1lbnRDb250ZW50KChEVERFbGVtZW50Q29udGVudCkgaS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREF0dHJpYnV0ZUxpc3QoTGlzdCBhdHRycykgewotCQlJdGVyYXRvciBpdGVyID0gYXR0cnMuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCXZpc2l0RFREQXR0cmlidXRlKChEVERBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpKTsKLQkJfSAvLyBlbmQgb2Ygd2hpbGUgKCkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREF0dHJpYnV0ZShEVERBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERmlsZUdlbihEVERGaWxlIGZpbGUpIHsKLQotCQlDb2xsZWN0aW9uIG5vdGF0aW9ucyA9IGZpbGUubGlzdERURE5vdGF0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG5vdGF0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCXZpc2l0RFRETm90YXRpb24oKERURE5vdGF0aW9uKSBpLm5leHQoKSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIGVudGl0aWVzID0gZmlsZS5saXN0RFRERW50aXR5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGVudGl0aWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJdmlzaXREVERFbnRpdHkoKERUREVudGl0eSkgaS5uZXh0KCkpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBvYmplY3RzID0gZmlsZS5saXN0RFRERWxlbWVudEFuZERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBvYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJRFRET2JqZWN0IG9iamVjdCA9IChEVERPYmplY3QpIGkubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERUREVsZW1lbnQpIHsKLQkJCQl2aXNpdERUREVsZW1lbnQoKERUREVsZW1lbnQpIG9iamVjdCk7Ci0JCQl9IC8vIGVuZCBvZiBpZiAoKQotCQkJZWxzZSB7Ci0JCQkJdmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgb2JqZWN0KTsKLQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVEROb3RhdGlvbkdlbihEVEROb3RhdGlvbiBub3RhdGlvbikgewotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERW50aXR5R2VuKERUREVudGl0eSBlbnRpdHkpIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVsZW1lbnRHZW4oRFRERWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJdmlzaXREVERFbGVtZW50Q29udGVudChlbGVtZW50LmdldENvbnRlbnQoKSk7Ci0JCXZpc2l0RFREQXR0cmlidXRlTGlzdChlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VHZW4oRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHkpIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVsZW1lbnRDb250ZW50R2VuKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInZpc2l0RFRERWxlbWVudENvbnRlbnQgOiAiICsgY29udGVudCk7Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQl2aXNpdERUREVtcHR5Q29udGVudCgoRFRERW1wdHlDb250ZW50KSBjb250ZW50KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREQW55Q29udGVudCkgewotCQkJdmlzaXREVERBbnlDb250ZW50KChEVERBbnlDb250ZW50KSBjb250ZW50KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCkgewotCQkJdmlzaXREVERQQ0RhdGFDb250ZW50KChEVERQQ0RhdGFDb250ZW50KSBjb250ZW50KTsKLQkJfQotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFJlcGVhdGFibGVDb250ZW50KSB7Ci0JCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgewotCQkJCXZpc2l0RFRER3JvdXBDb250ZW50KChEVERHcm91cENvbnRlbnQpIGNvbnRlbnQpOwotCQkJfQotCQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQkJdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIGNvbnRlbnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmlzaXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KTsKLQkJCX0gLy8gZW5kIG9mIGVsc2UKLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJvY2N1cnJlbmNlOiAiICsKLQkJCS8vIChjaGFyKSgoRFREUmVwZWF0YWJsZUNvbnRlbnQpY29udGVudCkuZ2V0T2NjdXJyZW5jZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVtcHR5Q29udGVudEdlbihEVERFbXB0eUNvbnRlbnQgZHRkRW1wdHlDb250ZW50KSB7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBFTVBUWSIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREFueUNvbnRlbnRHZW4oRFREQW55Q29udGVudCBkdGRBbnlDb250ZW50KSB7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBBTlkiKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERQQ0RhdGFDb250ZW50R2VuKERURFBDRGF0YUNvbnRlbnQgcGNEYXRhQ29udGVudCkgewotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogUENEQVRBIik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRER3JvdXBDb250ZW50R2VuKERUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQpIHsKLQotCQlpZiAoZ3JvdXBDb250ZW50LmdldEdyb3VwS2luZCgpLmdldFZhbHVlKCkgPT0gRFRER3JvdXBLaW5kLlNFUVVFTkNFKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IFNlcXVlbmNlIik7Ci0JCX0KLQkJZWxzZSAvLyBpZiAoY29udGVudGdldEdyb3VwS2luZCgpID09IERUREdyb3VwS2luZC5DSE9JQ0UpCi0JCXsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogQ2hvaWNlIik7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIGdyb3VwQ29udGVudHMgPSBncm91cENvbnRlbnQuZ2V0Q29udGVudCgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBncm91cENvbnRlbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJdmlzaXREVERFbGVtZW50Q29udGVudCgoRFRERWxlbWVudENvbnRlbnQpIGkubmV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50R2VuKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50R2VuKERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZW50aXR5UmVmZXJlbmNlQ29udGVudCkgewotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFREQXR0cmlidXRlTGlzdEdlbihMaXN0IGF0dHJzKSB7Ci0KLQkJSXRlcmF0b3IgaXRlciA9IGF0dHJzLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQl2aXNpdERUREF0dHJpYnV0ZSgoRFREQXR0cmlidXRlKSBpdGVyLm5leHQoKSk7Ci0JCX0gLy8gZW5kIG9mIHdoaWxlICgpCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFREQXR0cmlidXRlR2VuKERUREF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9FeHRlcm5hbERURE1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRXh0ZXJuYWxEVERNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA1MzZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9FeHRlcm5hbERURE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci0KLQotLyoqCi0gKiBMb2FkIGFub3RoZXIgRFREIG1vZGVsIC0gdXNlIHdoZW4gdGhlcmUgaXMgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZXMgZnJvbQotICogYW5vdGhlciBtb2RlbAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZXJuYWxEVERNb2RlbCB7Ci0JRFRERmlsZSBkdGRGaWxlID0gbnVsbDsKLQotCXB1YmxpYyBFeHRlcm5hbERURE1vZGVsKCkgewotCX0KLQotCXB1YmxpYyBEVERGaWxlIGdldEV4dGVybmFsRFRERmlsZSgpIHsKLQkJcmV0dXJuIGR0ZEZpbGU7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgRFREIG1vZGVsIHNwZWNpZmllZCBieSB0aGUgdXJpIGUuZy4KLQkgKiBmaWxlOkM6L2VjbGlwc2UvZXhhbXBsZXMvcHVyY2hhc2VvcmRlci5kdGQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBsb2FkTW9kZWwoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBTdHJpbmcgdXJpKSB7Ci0JCWJvb2xlYW4gcmMgPSB0cnVlOwotCi0JCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gdG9kby4uLiBJbnZlc3RpZ2F0ZSB3aHkgd2UgY2FuIG5vdCBjcmVhdGUgYSBuZXcgRFREVXRpbCB0byBsb2FkCi0JCQkvLyB0aGUgZXh0ZXJuYWwKLQkJCS8vIHdpdGhvdXQgYnJlYWtpbmcgdGhlIGJ2dCB0ZXN0IGJ1Y2tldCBvbiB0aGUgb2FnaXMgY2FzZXMuCi0JCQkvLyBBcmUgZGVwZW5kaW5nIG9uIG1vZidzIGJ1aWx0IGluIGNhY2hpbmcgdmlhCi0JCQkvLyByZXNvdXJjZXMubG9hZCh1cmkpPwotCQkJLy8KLQkJCVVSSSB1cmlPYmogPSBVUkkuY3JlYXRlVVJJKHVyaSk7Ci0JCQlSZXNvdXJjZSByID0gcmVzb3VyY2VzLmNyZWF0ZVJlc291cmNlKHVyaU9iaik7Ci0JCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlyLmxvYWQob3B0aW9ucyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IHJlc291cmNlcy5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlEVERGaWxlIGN1cnJlbnRGaWxlID0gKERUREZpbGUpICgoUmVzb3VyY2UpIGkubmV4dCgpKS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCQlTdHJpbmcgY3VycmVudFVSSSA9IGN1cnJlbnRGaWxlLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCQkJLy8gbm90ZSA6IG1vZiBzdG9yZXMgYSBzbGlnaHRseSBkaWZmZXJlbnQgdXJpIHRoYW4gdGhlIG9uZSB3ZQotCQkJCS8vIHBhc3NlZCBpbiB0byByZXNvdXJjZXMubG9hZCh1cmkpCi0JCQkJLy8gSW4gdGhlICdmaWxlOicgcHJvdG9jb2wgY2FzZSwgdGhlIGNhbGwKLQkJCQkvLyByZXNvdXJjZS5sb2FkKCJmaWxlOkQ6XHguZHRkIikgd2lsbCBzdG9yZSBhIHJlc291cmNlIHdpdGgKLQkJCQkvLyB1cmkgIkQ6XHguZHRkIi4KLQkJCQkvLyBUaGlzIGlzIHdoeSB3ZSB1c2UgJ2VuZHN3aXRoKCknIGluc3RlYWQgb2YgJ2VxdWFscygpJyB0bwotCQkJCS8vIGNvbXBhcmUuCi0JCQkJaWYgKHVyaS5lbmRzV2l0aChjdXJyZW50VVJJKSkgewotCQkJCQlkdGRGaWxlID0gY3VycmVudEZpbGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkdGRGaWxlID09IG51bGwpIHsKLQkJCQlyYyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXJjID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL3Jvc2UvRFRELmNhdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL3Jvc2UvRFRELmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5NzI3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9yb3NlL0RURC5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzODEyICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNDUNCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNy41LjAxMDMuMTkyMCINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJkdGQiDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWQ1NzMwLTg1MGItMTFlMS0wMDAwLTAwNWNmNDY5MWM0YzoxIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiZHRkIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2Uud3N0LmR0ZCIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJInByZWZpeCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEVEQiKSkpDQotICAgIHF1aWQgICAgICAgCSIzODU3QjFDMDAyOTMiDQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3MgIkRUREVsZW1lbnRDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZDU3MzAtODUwYi0xMWUxLTAwMDEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdDQkVBQ0YwMjEzIg0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBDbGFzcyAiRFRER3JvdXBDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDAtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdDQkVBRUYwMjMyIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBRDkyMDM2MyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURFJlcGVhdGFibGVDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUQ0QzAxRDEiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJncm91cEtpbmQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDAyLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGQzlFQzAxODkiDQotCQkgICAgdHlwZSAgICAgICAJIkRUREdyb3VwS2luZCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkNBNTUwMjE2Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREF0dHJpYnV0ZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDAzLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3Q0MxODc5MDBFQSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDA0LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjE1OTAxREEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVBdHRyaWJ1dGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MjM4NDcyMDM5RCIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDA1LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODM5REM5QTAxM0IiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlZmF1bHRLaW5kIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwNi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFMTQ0QkYwMjYxIg0KLQkJICAgIHR5cGUgICAgICAgCSJEVEREZWZhdWx0S2luZCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFMTQ0REMwM0FEIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVmYXVsdFZhbHVlU3RyaW5nIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwNy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzk2QjlCQkYwMDZCIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRET2NjdXJyZW5jZVR5cGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwOC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0NDMTlBRjAwN0QiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18T05FPTQ5IA0KLXxPUFRJT05BTD02MyBPTkVfT1JfTU9SRT00MyBaRVJPX09SX01PUkU9NDINCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIikNCi0JKG9iamVjdCBDbGFzcyAiRFRERWxlbWVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDA5LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBQUY3MDA3MSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDBhLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjBBRjAyQTgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQjgzMDI5QiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjVFMDJERSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDBiLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODM5REM4MTAwNjIiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbXB0eUNvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwYy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUI0NzAzN0EiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwZC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFCRjMwMzI3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUNGMDIxMyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFREQW55Q29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDBlLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBQjUwMDMwNCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDBmLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUJFRTAyMDciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBQ0YwMjEzIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERQQ0RhdGFDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTAtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFCNUMwMTM1Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBQkU5MDI3OCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFDRjAyMTMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFCN0QwMDEwIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBRDhDMDNBQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURFJlcGVhdGFibGVDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUQ0QzAxRDEiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRURFJlcGVhdGFibGVDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFENEMwMUQxIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBREI3MDNDMCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFDRjAyMTMiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvY2N1cnJlbmNlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxNi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdDQzE4QTkwMTQ4Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJKVVNUX09ORT0gLTEgIE9ORV9PUl9NT1JFPTQzIE9QVElPTkFMPTYzIFpFUk9fT1JfTU9SRT00MiINCi0JCSAgICB0eXBlICAgICAgIAkiRFRET2NjdXJyZW5jZVR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0MxOUFGMDA3RCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IENsYXNzICJEVERGaWxlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTctMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUIwOEUwMThGIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTgtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMDdGMDExOCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6ZU5hbWVkRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RUUwMDE0IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTktMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MzlEQkVGMDEyQiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyc2VFcnJvciINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMWEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4OEM5OTVGMDI1QiINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVEREZWZhdWx0S2luZCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDAwLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RTE0NERDMDNBRCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJJTVBMSUVEPTEgUkVRVUlSRUQ9MiBGSVhFRD0zIE5PRklYRUQ9NCINCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIpDQotCShvYmplY3QgQ2xhc3MgIkRUREJhc2ljVHlwZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDAxLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RTE0NjRGMDBEQSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDAyLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjI4MDAzMTUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAia2luZCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RTE0NjhBMDAxNiINCi0JCSAgICB0eXBlICAgICAgIAkiRFREQmFzaWNUeXBlS2luZCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFMTQ5MDUwMjJDIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREVudW1lcmF0aW9uVHlwZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDA0LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RTE0NjY4MDMwNiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDA1LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjI4MTAzMDIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVFbnVtIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE0NzNFOTAxRDQiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJraW5kIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwNi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFMTQ2QUMwM0I4Ig0KLQkJICAgIHR5cGUgICAgICAgCSJEVERFbnVtR3JvdXBLaW5kIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0UxNDlCMjAxQUQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFREQmFzaWNUeXBlS2luZCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDA3LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RTE0OTA1MDIyQyINCi0JICAgIGRvY3VtZW50YXRpb24gCSJOT05FPTAgQ0RBVEE9MSBJRD0yIElEUkVGPTMgSURSRUZTPTQgRU5USVRZPTUgRU5USVRJRVM9NiBOTVRPS0VOPTcgTk1UT0tFTlM9OCINCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIpDQotCShvYmplY3QgQ2xhc3MgIkRUREVudW1Hcm91cEtpbmQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwOC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0UxNDlCMjAxQUQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiTkFNRV9UT0tFTl9HUk9VUD0xIE5PVEFUSU9OX0dST1VQPTIiDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iKQ0KLQkob2JqZWN0IENsYXNzICJEVERHcm91cEtpbmQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwOS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGQ0E1NTAyMTYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiU0VRVUVOQ0U9MSBDSE9JQ0U9MiINCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIpDQotCShvYmplY3QgQ2xhc3MgIkRURE5vdGF0aW9uIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMGEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkQwRUYwMEM5Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMGItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMEUzMDIzNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6ZU5hbWVkRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RUUwMDE0IikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQjg1MDExOCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjVFMDJERSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDBjLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODM5REMwQTAyNEMiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN5c3RlbUlEIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwZC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQxMDIwMzk3Ig0KLQkJICAgIHR5cGUgICAgICAgCSJzdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwdWJsaWNJRCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMGUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMTBFMDE4QyINCi0JCSAgICB0eXBlICAgICAgIAkic3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREVudGl0eSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDBmLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDEwLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjBFNzAxRUEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OmVOYW1lZEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEVFMDAxNCIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkI4NjAzMDQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI1RTAyREUiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21tZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAxMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgzOURDMzcwMDhFIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJhbWV0ZXJFbnRpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDEyLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDEzQzAxN0UiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERW50aXR5Q29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDEzLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZEMTlEMDA4MyINCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpDQotCShvYmplY3QgQ2xhc3MgIkRUREV4dGVybmFsRW50aXR5Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMTQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkQxRjgwM0UxIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMTUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMzI0MDBGMyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTlEMDA4MyIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN5c3RlbUlEIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwMC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQyRTUwMTYxIg0KLQkJICAgIHR5cGUgICAgICAgCSJzdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwdWJsaWNJRCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMkVDMDFGNyINCi0JCSAgICB0eXBlICAgICAgIAkic3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREludGVybmFsRW50aXR5Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkQyQkEwMjZFIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMzJCMDMyRSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTlEMDA4MyIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwNC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQyQ0IwMjY4Ig0KLQkJICAgIHR5cGUgICAgICAgCSJzdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzg1Mjg3Q0EwMTYzIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMEQxMDA3NiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6ZU5hbWVkRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RUUwMDE0IikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQjhBMDI4NyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjVFMDJERSIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDA3LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4NTI5MDBFMDEyNyINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDA4LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODUyOTA0NDAxMUIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERSZXBlYXRhYmxlQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFENEMwMUQxIikpKQ0KLQkob2JqZWN0IENsYXNzICJYTUxTY2hlbWFEZWZpbmVkVHlwZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDA5LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4OUYwQzZEMDEwRSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxOT05FPS0xDQotfFNUUklORz0xDQotfEJPT0xFQU49Mg0KLXxGTE9BVD0zDQotfERPVUJMRT00DQotfERFQ0lNQUw9NQ0KLXxUSU1FSU5TVEFOVD02DQotfFRJTUVEVVJBVElPTj03DQotfFJFQ1VSUklOR0lOU1RBTlQ9OA0KLXxCSU5BUlk9OQ0KLXxVUkk9MTANCi18SU5URUdFUj0xMQ0KLXxEQVRFPTEyDQotfFRJTUU9MTMNCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIikNCi0JKG9iamVjdCBDbGFzcyAiRFREQ29udGVudCINCi0JICAgIHF1aWQgICAgICAgCSIzOUZFMkI1RTAyREUiDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMGEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdDQkVCNkYwMDVEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDBiLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0NCRUI3MDAwNkQiDQotCQkgICAgbGFiZWwgICAgICAJImNvbnRlbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBQ0YwMjEzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImdyb3VwIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwYy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdDQkVCNzAwMEFCIg0KLQkJICAgIGxhYmVsICAgICAgCSJncm91cCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREdyb3VwQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBRUYwMjMyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDBkLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBQzBFMDBDRCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlbGVtZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwZS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFDMEYwMzlGIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbGVtZW50Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFBRjcwMDcxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDBmLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUMwRjAzQTkiDQotCQkgICAgbGFiZWwgICAgICAJImNvbnRlbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBQ0YwMjEzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTAtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFGMTEwMDFBIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVsZW1lbnRSZWZlcmVuY2UiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDExLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUYxQjAyMDkiDQotCQkgICAgbGFiZWwgICAgICAJImVsZW1lbnRSZWZlcmVuY2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCN0QwMDEwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikpDQotCQkob2JqZWN0IFJvbGUgInJlZmVyZW5jZWRFbGVtZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxMi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFGMUIwMjBBIg0KLQkJICAgIGxhYmVsICAgICAgCSJyZWZlcmVuY2VkRWxlbWVudCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQUY3MDA3MSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxMy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGRDFDOTAyREYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMUNBMDMxRCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiY29udGVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMUNBMDMyNyINCi0JCSAgICBsYWJlbCAgICAgIAkiY29udGVudCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTlEMDA4MyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDE2LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZEMzQ0MDBFNSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJub3RhdGlvbiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTctMDA1Y2Y0NjkxYzRjOjEiKSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiZUNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMzQ1MDIwOSINCi0JCSAgICBsYWJlbCAgICAgIAkibm90YXRpb24iDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVEROb3RhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQwRUYwMEM5Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVudGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTgtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMzQ1MDIxMyINCi0JCSAgICBsYWJlbCAgICAgIAkiZW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERXh0ZXJuYWxFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMUY4MDNFMSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxOS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzODUyODk3OTAwNUYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicGFybUVudGl0eVJlZiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMWEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4NTI4OTdDMDM1MiINCi0JCSAgICBsYWJlbCAgICAgIAkicGFybUVudGl0eVJlZiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1Mjg3Q0EwMTYzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVudGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMWItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4NTI4OTdDMDM1MyINCi0JCSAgICBsYWJlbCAgICAgIAkiZW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMWMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzg1Mjk0RUIwMjQzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVudGl0eVJlZmVyZW5jZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMWQtMDA1Y2Y0NjkxYzRjOjEiKSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiZUNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4NTI5NEVGMDNCQiINCi0JCSAgICBsYWJlbCAgICAgIAkiZW50aXR5UmVmZXJlbmNlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1MjkwMEUwMTI3Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVsZW1lbnRSZWZlcmVuY2VkRW50aXR5Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxZS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg1Mjk0RUYwM0JDIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbGVtZW50UmVmZXJlbmNlZEVudGl0eSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDFmLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4NTI5NzJEMDJDQiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyMC0wMDVjZjQ2OTFjNGM6MSIpKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJlQ29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg1Mjk3MzYwMjkxIg0KLQkJICAgIGxhYmVsICAgICAgCSJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NDMTg3OTAwRUEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDIxLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODUyOTczNjAyOUIiDQotCQkgICAgbGFiZWwgICAgICAJImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhCNjhBNzMwMkI4Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyMy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhCNjhBNzgwMDg0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERXh0ZXJuYWxFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMUY4MDNFMSIpDQotCQkob2JqZWN0IFJvbGUgImVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDI0LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEI2OEE3ODAwOEUiDQotCQkgICAgbGFiZWwgICAgICAJImVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QjA4RTAxOEYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDI1LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QkQ0OTA4MDEzRCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyNi0wMDVjZjQ2OTFjNGM6MSIpKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJlQ29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhCRDQ5MTQwMTMwIg0KLQkJICAgIGxhYmVsICAgICAgCSJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NDMTg3OTAwRUEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDI3LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEJENDkxNDAxNEUiDQotCQkgICAgbGFiZWwgICAgICAJImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMiINCi0JICAgIHF1aWQgICAgICAgCSIzOUZFMkE5NTAwQ0MiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQTk1MDMxMSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQUY3MDA3MSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkE5NTAzMUIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERBdHRyaWJ1dGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0MxODc5MDBFQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUiDQotCSAgICBxdWlkICAgICAgIAkiMzlGRTJCQkUwMkRDIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkJCRjAxQjEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QjA4RTAxOEYiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNyINCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJCQkYwMUJCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCNUUwMkRFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOCINCi0JICAgIHF1aWQgICAgICAgCSIzOUZFMzBEODAzM0UiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkiDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUzMEQ5MDEwNSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlCMDhFMDE4RiINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMzBEOTAxMzciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnVtZXJhdGlvblR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RTE0NjY4MDMwNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkpDQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiINCi0JICAgIHF1aWQgICAgICAgCSIzN0NBQjBFNjAxNzciDQotCSAgICB0aXRsZSAgICAgIAkiTWFpbiINCi0JICAgIHpvb20gICAgICAgCTk4DQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IE5vdGVWaWV3IEAxDQotCQkgICAgbG9jYXRpb24gICAJKDMyNjQsIDI0MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDI5MTAsIDY1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNw0KLQkJCW1heF93aWR0aCAgCTY3Mw0KLQkJCWxhYmVsICAgICAgCQ0KLXxEVERFbGVtZW50J3MsIA0KLXxEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UncywgRFRERW50aXR5J3MsIGFuZCBEVEROb3RhdGlvbidzIGFyZSBhZGRlZCB0byBEVERGaWxlJ3MgdXNpbmcgdGhlDQotfG93bmVkRWxlbWVudCByZWxhdGlvbnNoaXANCi18YmV0d2VlbiBNT0ZOYW1lc3BhY2UNCi18YW5kIE1PRk9iamVjdA0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAk3MzMNCi0JCSAgICBoZWlnaHQgICAgIAkzNjMpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRESW50ZXJuYWxFbnRpdHkiIEAyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDE4NzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSgxNjQ3LCAxODE3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRESW50ZXJuYWxFbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDJCQTAyNkUiDQotCQkgICAgd2lkdGggICAgICAJMzcyDQotCQkgICAgaGVpZ2h0ICAgICAJMTM0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudCIgQDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTkyLCAxMjAwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMNCi0JCQlsb2NhdGlvbiAgIAkoNDE3LCAxMTQ1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQUY3MDA3MSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSg0MTcsIDEyMDQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzEpDQotCQkgICAgd2lkdGggICAgICAJMzY4DQotCQkgICAgaGVpZ2h0ICAgICAJMTM0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Q29udGVudCIgQDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMTQ4OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoMTM0MSwgMTQzOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVudGl0eUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDE5RDAwODMiDQotCQkgICAgd2lkdGggICAgICAJMzc2DQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAxNjQwKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUA0DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE1MjAsIDE2NDApDQotCQkJKDE1MjAsIDE1NTApKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UiIEA2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI0ODAsIDEyMTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANg0KLQkJCWxvY2F0aW9uICAgCSgyMTg2LCAxMTY2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU4OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1Mjg3Q0EwMTYzIg0KLQkJICAgIHdpZHRoICAgICAgCTYwNg0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eSIgQDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMTIxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3DQotCQkJbG9jYXRpb24gICAJKDEyNzAsIDExMzcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTAwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDcNCi0JCQlsb2NhdGlvbiAgIAkoMTI3MCwgMTE5NikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTUyNSkNCi0JCSAgICB3aWR0aCAgICAgIAk1MTgNCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzIiBAOA0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTQ2LCAxMzY2KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMUM5MDJERiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0IiBAOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgNCi0JCQkgICAgbG9jYXRpb24gICAJKC01NCwgMjQ2KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMUNBMDMxRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDcNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NDYsIDEzNjYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTQ2LCAxMzA3KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTQsIDI0NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEwDQotCQkJCWxvY2F0aW9uICAgCSgxNDQzLCAxNDA3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTkxDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjY5OTI0OA0KLQkJCQloZWlnaHQgICAgIAkxMDQNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxQ0EwMzI3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAOA0KLQkJCSAgICBzdXBwbGllciAgIAlANA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU0NiwgMTM2NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NDYsIDE0MjYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyDQotCQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDE0MDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcyMTgwNA0KLQkJCQloZWlnaHQgICAgIAkyMg0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2IiBAMTMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk3OCwgMTI1NikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyODk3OTAwNUYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicGFybUVudGl0eVJlZiIgQDE0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDYwMiwgNDg4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1DQotCQkJCVBhcmVudF9WaWV3IAlAMTQNCi0JCQkJbG9jYXRpb24gICAJKDIwMzgsIDEyOTkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3Bhcm1FbnRpdHlSZWYiDQotCQkJCXBjdERpc3QgICAgCTAuMzA1NDE5DQotCQkJCWhlaWdodCAgICAgCTQzDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4NTI4OTdDMDM1MiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzDQotCQkJICAgIHN1cHBsaWVyICAgCUA2DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTc4LCAxMjU2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE3NywgMTI1NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNA0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0MSwgMTIyOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODI2NDg0DQotCQkJCWhlaWdodCAgICAgCTI5DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbnRpdHkiIEAxNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzDQotCQkJICAgIGxvY2F0aW9uICAgCSg2MDIsIDQ4OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOA0KLQkJCQlQYXJlbnRfVmlldyAJQDE3DQotCQkJCWxvY2F0aW9uICAgCSgxODYyLCAxMjE3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbnRpdHkiDQotCQkJCXBjdERpc3QgICAgCTAuNTg5MTA5DQotCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4NTI4OTdDMDM1MyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzDQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTc4LCAxMjU2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3OSwgMTI1NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyMywgMTMwOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzc2OTIzDQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6ZU5hbWVkRWxlbWVudCIgQDIwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ4OCwgMTc2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjANCi0JCQlsb2NhdGlvbiAgIAkoMTM1MiwgMTMxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiZU5hbWVkRWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDRFRTAwMTQiDQotCQkgICAgd2lkdGggICAgICAJMjkwDQotCQkgICAgaGVpZ2h0ICAgICAJMTE1DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiIEAyMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDU3NiwgOTYwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIxDQotCQkJbG9jYXRpb24gICAJKDQ5MiwgODYzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUNsYXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSINCi0JCSAgICB3aWR0aCAgICAgIAkxODYNCi0JCSAgICBoZWlnaHQgICAgIAkyMTgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIyDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMEFGMDJBOCINCi0JCSAgICBjbGllbnQgICAgIAlAMw0KLQkJICAgIHN1cHBsaWVyICAgCUAyMQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU3MSwgMTEzMikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTcxLCAxMDY5KSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OmVOYW1lZEVsZW1lbnQiIEAyMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI1NjAsIDg2NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIzDQotCQkJbG9jYXRpb24gICAJKDI0MjQsIDgxOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJImVOYW1lZEVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RUUwMDE0Ig0KLQkJICAgIHdpZHRoICAgICAgCTI5MA0KLQkJICAgIGhlaWdodCAgICAgCTExNQ0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDI0DQotCQkgICAgbG9jYXRpb24gICAJKDI1NjAsIDEwMzYpDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyMw0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyNTYwLCAxMDM2KQ0KLQkJCSgyNTYwLCA5MjEpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMEU3MDFFQSINCi0JCSAgICBjbGllbnQgICAgIAlANw0KLQkJICAgIHN1cHBsaWVyICAgCUAyMw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2NjksIDExMjUpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjksIDEwMzYpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjQpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjBEMTAwNzYiDQotCQkgICAgY2xpZW50ICAgICAJQDYNCi0JCSAgICBzdXBwbGllciAgIAlAMjMNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjE4LCAxMTUzKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjE4LCAxMDM2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDI0KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRURE5vdGF0aW9uIiBAMjcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTkyLCAxMjMyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJbG9jYXRpb24gICAJKDgxNywgMTEyOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRURE5vdGF0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQwRUYwMEM5Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyNw0KLQkJCWxvY2F0aW9uICAgCSg4MTcsIDExODgpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkzNzEpDQotCQkgICAgd2lkdGggICAgICAJMzY4DQotCQkgICAgaGVpZ2h0ICAgICAJMjMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERXh0ZXJuYWxFbnRpdHkiIEAyOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzQ0LCAxODcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI4DQotCQkJbG9jYXRpb24gICAJKDExNTgsIDE3OTMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFeHRlcm5hbEVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMUY4MDNFMSINCi0JCSAgICB3aWR0aCAgICAgIAkzOTANCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1IiBAMjkNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTY5LCAxNjc3KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMzQ0MDBFNSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJub3RhdGlvbiIgQDMwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjkNCi0JCQkgICAgbG9jYXRpb24gICAJKC0yNDcsIDIwNSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDMwDQotCQkJCWxvY2F0aW9uICAgCSg4MzQsIDEzOTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMDMNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK25vdGF0aW9uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg3MDczNA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdFRkQzNDUwMjA5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjksIDE2NzcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjksIDEzNDcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyDQotCQkJCVBhcmVudF9WaWV3IAlAMzANCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDEzODgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg3NzkzNA0KLQkJCQloZWlnaHQgICAgIAk3MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50aXR5IiBAMzMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTI0NywgMjA1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0DQotCQkJCVBhcmVudF9WaWV3IAlAMzMNCi0JCQkJbG9jYXRpb24gICAJKDEwODIsIDE3ODYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VudGl0eSINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdFRkQzNDUwMjEzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTY5LCAxNjc3KQ0KLQkJCQkoOTY5LCAxODI3KQ0KLQkJCQkoMTE0OSwgMTgyNykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjksIDE2NzcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ5LCAxODI3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDMzDQotCQkJCWxvY2F0aW9uICAgCSgxMTA0LCAxODUzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44NjM1MDENCi0JCQkJaGVpZ2h0ICAgICAJMjYNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMzI0MDBGMyINCi0JCSAgICBjbGllbnQgICAgIAlAMjgNCi0JCSAgICBzdXBwbGllciAgIAlANA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNzQsIDE3ODEpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNzQsIDE2NDApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERDb250ZW50IiBAMzcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDcyLCA4MDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNw0KLQkJCWxvY2F0aW9uICAgCSgxMzQ0LCA3NTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCNUUwMkRFIg0KLQkJICAgIHdpZHRoICAgICAgCTI3NA0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM4DQotCQkgICAgbG9jYXRpb24gICAJKDE0NzIsIDk5MCkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlAMzcNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTQ3MiwgOTkwKQ0KLQkJCSgxNDcyLCA4NjIpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCODMwMjlCIg0KLQkJICAgIGNsaWVudCAgICAgCUAzDQotCQkgICAgc3VwcGxpZXIgICAJQDM3DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzE5LCAxMTMyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MTksIDk5MCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAzOCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCODYwMzA0Ig0KLQkJICAgIGNsaWVudCAgICAgCUA3DQotCQkgICAgc3VwcGxpZXIgICAJQDM3DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ1MiwgMTEyNCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1MiwgOTkwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDM4KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI4QTAyODciDQotCQkgICAgY2xpZW50ICAgICAJQDYNCi0JCSAgICBzdXBwbGllciAgIAlAMzcNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ3LCAxMTU0KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzQ3LCA5OTApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzgpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERmlsZSIgQDQyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0ODgsIDQ0OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCWxvY2F0aW9uICAgCSgxMjgxLCAzNjkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDE0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERGaWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUIwOEUwMThGIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCWxvY2F0aW9uICAgCSgxMjgxLCA0MjgpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0MjUpDQotCQkgICAgd2lkdGggICAgICAJNDMyDQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOSIgQDQzDQotCQkgICAgbG9jYXRpb24gICAJKDM1NCwgMTA0OSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEI2OEE3MzAyQjgiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAiIEA0NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQzDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTA5LCAyMDcpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhCNjhBNzgwMDg0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANDMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzU0LCAxMDQ5KQ0KLQkJCQkoMzU0LCAxNzgxKQ0KLQkJCQkoMTE0OSwgMTc4MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTQsIDEwNDkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ5LCAxNzgxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlIiBANDUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEwOSwgMjA3KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2DQotCQkJCVBhcmVudF9WaWV3IAlANDUNCi0JCQkJbG9jYXRpb24gICAJKDI5NiwgNDUzNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTczMg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSINCi0JCQkJcGN0RGlzdCAgICAJLTIuMjgzMzMzDQotCQkJCWhlaWdodCAgICAgCTU5DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QjY4QTc4MDA4RSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQzDQotCQkJICAgIHN1cHBsaWVyICAgCUA0Mg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM1NCwgMTA0OSkNCi0JCQkJKDM1NCwgNDM5KQ0KLQkJCQkoMTI3MiwgNDM5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM1NCwgMTA0OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNzIsIDQzOSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDcNCi0JCQkJUGFyZW50X1ZpZXcgCUA0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwNiwgNTAwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45NTcxMjkNCi0JCQkJaGVpZ2h0ICAgICAJNjENCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0OA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjA3RjAxMTgiDQotCQkgICAgY2xpZW50ICAgICAJQDQyDQotCQkgICAgc3VwcGxpZXIgICAJQDIwDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ4OCwgMzU3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg4LCAyMzMpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1IiBANDkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ3MiwgNjM4KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQkJFMDJEQyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNiIgQDUwDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDkNCi0JCQkgICAgbG9jYXRpb24gICAJKDAsIC0xNjIpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCQkYwMUIxIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQyDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcyLCA2MzgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcyLCA1MzkpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3IiBANTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMCwgLTE2MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQkJGMDFCQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ5DQotCQkJICAgIHN1cHBsaWVyICAgCUAzNw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ3MiwgNjM4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3MiwgNzM4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDUxDQotCQkJCWxvY2F0aW9uICAgCSgxNTI2LCA3MTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjczNjI0OA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnVtZXJhdGlvblR5cGUiIEA1Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNDQ4LCA0NjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANTMNCi0JCQlsb2NhdGlvbiAgIAkoMjE4NCwgMzg1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUyOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERW51bWVyYXRpb25UeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFMTQ2NjgwMzA2Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA1Mw0KLQkJCWxvY2F0aW9uICAgCSgyMTg0LCA0NDQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk1NDYpDQotCQkgICAgd2lkdGggICAgICAJNTQ2DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgiIEA1NA0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTM5LCA0NDkpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTMwRDgwMzNFIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5IiBANTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQ2MSwgLTMxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5RkUzMEQ5MDEwNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDU0DQotCQkJICAgIHN1cHBsaWVyICAgCUA0Mg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTkzOSwgNDQ5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwNCwgNDQ5KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMCIgQDU2DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTQNCi0JCQkgICAgbG9jYXRpb24gICAJKC00NjEsIC0zMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5RkUzMEQ5MDEzNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDU0DQotCQkJICAgIHN1cHBsaWVyICAgCUA1Mw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTkzOSwgNDQ5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE3NSwgNDQ5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDU2DQotCQkJCWxvY2F0aW9uICAgCSgyMTIwLCA0ODYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc2NzgzNw0KLQkJCQloZWlnaHQgICAgIAkzNw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU4DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMEUzMDIzNCINCi0JCSAgICBjbGllbnQgICAgIAlAMjcNCi0JCSAgICBzdXBwbGllciAgIAlAMjMNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY0LCAxMTE2KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY0LCAxMDM2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDI0KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI4NTAxMTgiDQotCQkgICAgY2xpZW50ICAgICAJQDI3DQotCQkgICAgc3VwcGxpZXIgICAJQDM3DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTQxLCAxMTE3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NDEsIDk5MCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAzOCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQzMkIwMzJFIg0KLQkJICAgIGNsaWVudCAgICAgCUAyDQotCQkgICAgc3VwcGxpZXIgICAJQDQNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzgyLCAxODA1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzgyLCAxNjQwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDUpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkVsZW1lbnREZWZpbml0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjM3RTE0MzMwMDMyRiINCi0JICAgIHRpdGxlICAgICAgCSJFbGVtZW50RGVmaW5pdGlvbiINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAk0MjYNCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW1wdHlDb250ZW50IiBANjENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDY3LCAxNDQ4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYxDQotCQkJbG9jYXRpb24gICAJKDI4MSwgMTQwMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVtcHR5Q29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQjQ3MDM3QSINCi0JCSAgICB3aWR0aCAgICAgIAkzOTANCi0JCSAgICBoZWlnaHQgICAgIAkxMTQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERBbnlDb250ZW50IiBANjINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODg2LCAxNDQ1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYyDQotCQkJbG9jYXRpb24gICAJKDcyOCwgMTQwMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREFueUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUI1MDAzMDQiDQotCQkgICAgd2lkdGggICAgICAJMzM0DQotCQkgICAgaGVpZ2h0ICAgICAJMTE0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREUENEYXRhQ29udGVudCIgQDYzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyOTgsIDE0NTEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjMNCi0JCQlsb2NhdGlvbiAgIAkoMTA5OSwgMTQwNikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzOTgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRURFBDRGF0YUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUI1QzAxMzUiDQotCQkgICAgd2lkdGggICAgICAJNDE2DQotCQkgICAgaGVpZ2h0ICAgICAJMTE0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREUmVwZWF0YWJsZUNvbnRlbnQiIEA2NA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODg4LCAxNDU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjQNCi0JCQlsb2NhdGlvbiAgIAkoMTU3MiwgMTQwNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2MzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRURFJlcGVhdGFibGVDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFENEMwMUQxIg0KLQkJICAgIHdpZHRoICAgICAgCTY1MA0KLQkJICAgIGhlaWdodCAgICAgCTEyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY1DQotCQkgICAgbG9jYXRpb24gICAJKDE4NzgsIDE2MTgpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDY0DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE4NzgsIDE2MTgpDQotCQkJKDE4NzgsIDE1MjApKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVBdHRyaWJ1dGUiIEA2Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5MzYsIDQwMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2Ng0KLQkJCWxvY2F0aW9uICAgCSgxODU1LCAzMjUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFQXR0cmlidXRlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MjM4NDcyMDM5RCINCi0JCSAgICBoZWlnaHQgICAgIAkxNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyIgQDY3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTI4LCAzODQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjcNCi0JCQlsb2NhdGlvbiAgIAkoODQ3LCAzMDkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFQ2xhc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIg0KLQkJICAgIGhlaWdodCAgICAgCTE3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREdyb3VwQ29udGVudCIgQDY4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIxOTIsIDE3NzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjgNCi0JCQlsb2NhdGlvbiAgIAkoMTkzMSwgMTcyNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREdyb3VwQ29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUVGMDIzMiINCi0JCSAgICB3aWR0aCAgICAgIAk1NDANCi0JCSAgICBoZWlnaHQgICAgIAkxMjINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFEOTIwMzYzIg0KLQkJICAgIGNsaWVudCAgICAgCUA2OA0KLQkJICAgIHN1cHBsaWVyICAgCUA2NA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyMjEsIDE3MTQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjEsIDE2MTgpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCIgQDcwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0ODgsIDE3NjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANzANCi0JCQlsb2NhdGlvbiAgIAkoMTIyMywgMTcxNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTAwRTAxMjciDQotCQkgICAgd2lkdGggICAgICAJNTQ4DQotCQkgICAgaGVpZ2h0ICAgICAJMTE0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI5MDQ0MDExQiINCi0JCSAgICBjbGllbnQgICAgIAlANzANCi0JCSAgICBzdXBwbGllciAgIAlANjQNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDc0LCAxNzAyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDc0LCAxNjE4KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDY1KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRDb250ZW50IiBANzINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTEyLCAxMDU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANzINCi0JCQlsb2NhdGlvbiAgIAkoNzA0LCAxMDA4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQxNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERWxlbWVudENvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFDRjAyMTMiDQotCQkgICAgd2lkdGggICAgICAJNDM0DQotCQkgICAgaGVpZ2h0ICAgICAJMTIwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDczDQotCQkgICAgbG9jYXRpb24gICAJKDIyODksIDEwNDgpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVCNkYwMDVEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEA3NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDczDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDI1LCA4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1DQotCQkJCVBhcmVudF9WaWV3IAlANzQNCi0JCQkJbG9jYXRpb24gICAJKDEyMjMsIDEwMDEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2NvbnRlbnQiDQotCQkJCXBjdERpc3QgICAgCTAuOTE5NDI0DQotCQkJCWhlaWdodCAgICAgCTQ4DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQjcwMDA2RCINCi0JCQkgICAgY2xpZW50ICAgICAJQDczDQotCQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjI4OSwgMTA0OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMjksIDEwNDgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2DQotCQkJCVBhcmVudF9WaWV3IAlANzQNCi0JCQkJbG9jYXRpb24gICAJKDExODYsIDEwODMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk1MTM4MQ0KLQkJCQloZWlnaHQgICAgIAkzNQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzcNCi0JCQkJUGFyZW50X1ZpZXcgCUA3NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI0NiwgOTQxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMw0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTU5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJMTA4DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJncm91cCIgQDc4DQotCQkJICAgIFBhcmVudF9WaWV3IAlANzMNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwMjUsIDgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkNCi0JCQkJUGFyZW50X1ZpZXcgCUA3OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjUzNSwgMTc0NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZ3JvdXAiDQotCQkJCXBjdERpc3QgICAgCTAuOTM3NzQ0DQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQjcwMDBBQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDczDQotCQkJICAgIHN1cHBsaWVyICAgCUA2OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIyODksIDEwNDgpDQotCQkJCSgyNTg3LCAxMDQ4KQ0KLQkJCQkoMjU4NywgMTc4NSkNCi0JCQkJKDI0NjIsIDE3ODUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjI4OSwgMTA0OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI0NjIsIDE3ODUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwDQotCQkJCVBhcmVudF9WaWV3IAlANzgNCi0JCQkJbG9jYXRpb24gICAJKDI1MjYsIDE4MjcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk0NTA4NQ0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4MQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MTAsIDEyOTEpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDkxMCwgMTI5MSkNCi0JCQkoOTEwLCAxMTE2KSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4Mg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQkU5MDI3OCINCi0JCSAgICBjbGllbnQgICAgIAlANjMNCi0JCSAgICBzdXBwbGllciAgIAlANzINCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAxMzk0KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk3LCAxMjkxKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDgxKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUJGMzAzMjciDQotCQkgICAgY2xpZW50ICAgICAJQDYxDQotCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDY2LCAxMzkxKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NjYsIDEyOTEpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODEpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQkVFMDIwNyINCi0JCSAgICBjbGllbnQgICAgIAlANjINCi0JCSAgICBzdXBwbGllciAgIAlANzINCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODEsIDEzODgpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg4MSwgMTI5MSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFEQjcwM0MwIg0KLQkJICAgIGNsaWVudCAgICAgCUA2NA0KLQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5MDMsIDEzOTIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5MDMsIDEyOTEpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODEpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQiIEA4Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg3ODQsIDE3NjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAODYNCi0JCQlsb2NhdGlvbiAgIAkoNDkyLCAxNzE1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU4NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUI3RDAwMTAiDQotCQkgICAgd2lkdGggICAgICAJNjAyDQotCQkgICAgaGVpZ2h0ICAgICAJMTE0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4Nw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRDhDMDNBQSINCi0JCSAgICBjbGllbnQgICAgIAlAODYNCi0JCSAgICBzdXBwbGllciAgIAlANjQNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NTAsIDE3MDMpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY1MCwgMTYxOCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHkiIEA4OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDg4LCAyMDY0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDg4DQotCQkJbG9jYXRpb24gICAJKDEyNDQsIDE5OTIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCQkgICAgd2lkdGggICAgICAJNTA2DQotCQkgICAgaGVpZ2h0ICAgICAJMTY4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNyIgQDg5DQotCQkgICAgbG9jYXRpb24gICAJKDE0ODAsIDE4OTgpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1Mjk0RUIwMjQzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGl0eVJlZmVyZW5jZSIgQDkwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAODkNCi0JCQkgICAgbG9jYXRpb24gICAJKDMxMiwgLTcwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkxDQotCQkJCVBhcmVudF9WaWV3IAlAOTANCi0JCQkJbG9jYXRpb24gICAJKDEyODAsIDE4NDIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMTINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VudGl0eVJlZmVyZW5jZSINCi0JCQkJcGN0RGlzdCAgICAJMC42OTM3NTANCi0JCQkJaGVpZ2h0ICAgICAJMjAxDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4NTI5NEVGMDNCQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDg5DQotCQkJICAgIHN1cHBsaWVyICAgCUA3MA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ4MCwgMTg5OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODAsIDE4MTcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyDQotCQkJCVBhcmVudF9WaWV3IAlAOTANCi0JCQkJbG9jYXRpb24gICAJKDE1MzQsIDE4NDIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY5Mzc1MA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkiIEA5Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDg5DQotCQkJICAgIGxvY2F0aW9uICAgCSgzMTIsIC03MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NA0KLQkJCQlQYXJlbnRfVmlldyAJQDkzDQotCQkJCWxvY2F0aW9uICAgCSgxMjIwLCAxOTU0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDgwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbGVtZW50UmVmZXJlbmNlZEVudGl0eSINCi0JCQkJcGN0RGlzdCAgICAJMC42ODUzMTUNCi0JCQkJaGVpZ2h0ICAgICAJMjYxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4NTI5NEVGMDNCQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDg5DQotCQkJICAgIHN1cHBsaWVyICAgCUA4OA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ4MCwgMTg5OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODAsIDE5ODApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk1DQotCQkJCVBhcmVudF9WaWV3IAlAOTMNCi0JCQkJbG9jYXRpb24gICAJKDE1MjQsIDE5NTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjczNDIzNA0KLQkJCQloZWlnaHQgICAgIAk0NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50IiBAOTYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTEyLCA3NTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAOTYNCi0JCQlsb2NhdGlvbiAgIAkoNzQ0LCA3MDIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzM2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFBRjcwMDcxIg0KLQkJICAgIHdpZHRoICAgICAgCTM1NA0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEA5Nw0KLQkJICAgIGxvY2F0aW9uICAgCSg5MTIsIDkwNCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUMwRTAwQ0QiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudCIgQDk4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTcNCi0JCQkgICAgbG9jYXRpb24gICAJKC0yNSwgOTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTkNCi0JCQkJUGFyZW50X1ZpZXcgCUA5OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTAxNCwgODY1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbGVtZW50Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjQyODU3MQ0KLQkJCQloZWlnaHQgICAgIAkxMDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdEOUFDMEYwMzlGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDk2DQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwDQotCQkJCVBhcmVudF9WaWV3IAlAOTgNCi0JCQkJbG9jYXRpb24gICAJKDg1NywgODUwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC41OTgyMTQNCi0JCQkJaGVpZ2h0ICAgICAJNTYNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMDENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTI1LCA5NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDENCi0JCQkJbG9jYXRpb24gICAJKDEwMTQsIDk2NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY29udGVudCINCi0JCQkJcGN0RGlzdCAgICAJMC42NjQwNjMNCi0JCQkJaGVpZ2h0ICAgICAJMTAyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQzBGMDNBOSINCi0JCQkgICAgY2xpZW50ICAgICAJQDk3DQotCQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMw0KLQkJCQlQYXJlbnRfVmlldyAJQDEwMQ0KLQkJCQlsb2NhdGlvbiAgIAkoODcxLCA5NjIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY0MDYyNQ0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMTA0DQotCQkgICAgbG9jYXRpb24gICAJKDEyMywgMTEyMikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUYxMTAwMUEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudFJlZmVyZW5jZSIgQDEwNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTk4MSwgNjQyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNg0KLQkJCQlQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIxLCAxODI1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzQ4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbGVtZW50UmVmZXJlbmNlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg0MDAzNQ0KLQkJCQloZWlnaHQgICAgIAk1Ng0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUYxQjAyMDkiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDg2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTIzLCAxMTIyKQ0KLQkJCQkoMTIzLCAxNzY5KQ0KLQkJCQkoNDgzLCAxNzY5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMywgMTEyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ4MywgMTc2OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3DQotCQkJCVBhcmVudF9WaWV3IAlAMTA1DQotCQkJCWxvY2F0aW9uICAgCSg0MjIsIDE3MjYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk0MDU1OQ0KLQkJCQloZWlnaHQgICAgIAk0NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAicmVmZXJlbmNlZEVsZW1lbnQiIEAxMDgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQkgICAgbG9jYXRpb24gICAJKC05ODEsIDY0MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDgNCi0JCQkJbG9jYXRpb24gICAJKDUzMiwgNjg2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIityZWZlcmVuY2VkRWxlbWVudCINCi0JCQkJcGN0RGlzdCAgICAJMC43OTk2NTANCi0JCQkJaGVpZ2h0ICAgICAJNDMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdEOUFGMUIwMjBBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTA0DQotCQkJICAgIHN1cHBsaWVyICAgCUA5Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMywgMTEyMikNCi0JCQkJKDEyMywgNzI4KQ0KLQkJCQkoNzM1LCA3MjgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIzLCAxMTIyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzM1LCA3MjgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMA0KLQkJCQlQYXJlbnRfVmlldyAJQDEwOA0KLQkJCQlsb2NhdGlvbiAgIAkoNzAxLCA3NzMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk2Njk2NQ0KLQkJCQloZWlnaHQgICAgIAk0NQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjBBRjAyQTgiDQotCQkgICAgY2xpZW50ICAgICAJQDk2DQotCQkgICAgc3VwcGxpZXIgICAJQDY3DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTIzLCA2OTApDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkyMywgNDcwKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERBdHRyaWJ1dGUiIEAxMTINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg4OCwgNzUyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDExMg0KLQkJCWxvY2F0aW9uICAgCSgxNjEyLCA2NTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTUyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERBdHRyaWJ1dGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NDMTg3OTAwRUEiDQotCQkgICAgd2lkdGggICAgICAJNTcwDQotCQkgICAgaGVpZ2h0ICAgICAJMjE0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOCIgQDExMw0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzc1LCAxNjI4KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI5NzJEMDJDQiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIiBAMTE0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNTkxLCAtNTY0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDExNA0KLQkJCQlsb2NhdGlvbiAgIAkoMjQyMiwgODA4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgyOTYzMA0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTczNjAyOTEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI3NzUsIDE2MjgpDQotCQkJCSgyNzc1LCA3NjgpDQotCQkJCSgyMTczLCA3NjgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjc3NSwgMTYyOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxNzMsIDc2OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2DQotCQkJCVBhcmVudF9WaWV3IAlAMTE0DQotCQkJCWxvY2F0aW9uICAgCSgyMjIyLCA4NzEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk2NjY0OQ0KLQkJCQloZWlnaHQgICAgIAkxMDINCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IiBAMTE3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNTkxLCAtNTY0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOA0KLQkJCQlQYXJlbnRfVmlldyAJQDExNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjA3NiwgMjA5MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTU4OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkiDQotCQkJCXBjdERpc3QgICAgCTAuNzcxNDY5DQotCQkJCWhlaWdodCAgICAgCTM1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4NTI5NzM2MDI5QiINCi0JCQkgICAgY2xpZW50ICAgICAJQDExMw0KLQkJCSAgICBzdXBwbGllciAgIAlAODgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNzc1LCAxNjI4KQ0KLQkJCQkoMjc3NSwgMjA1NSkNCi0JCQkJKDE3NDEsIDIwNTUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjc3NSwgMTYyOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NDEsIDIwNTUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDExNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTgxMywgMjAxOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTUxNDQyDQotCQkJCWhlaWdodCAgICAgCTM4DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExIiBAMTIwDQotCQkgICAgbG9jYXRpb24gICAJKDI5NDUsIDE4OTEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhCRDQ5MDgwMTNEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UiIEAxMjENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjANCi0JCQkgICAgbG9jYXRpb24gICAJKDE0ODksIC02NzYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyDQotCQkJCVBhcmVudF9WaWV3IAlAMTIxDQotCQkJCWxvY2F0aW9uICAgCSgyNDM1LCA2NTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVR5cGVSZWZlcmVuY2UiDQotCQkJCXBjdERpc3QgICAgCTAuODY2MDI2DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QkQ0OTE0MDEzMCINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTEyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjk0NSwgMTg5MSkNCi0JCQkJKDI5NDUsIDcwOCkNCi0JCQkJKDIxNzMsIDcwOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTQ1LCAxODkxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE3MywgNzA4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjENCi0JCQkJbG9jYXRpb24gICAJKDIzNDUsIDYwMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuOTEyNTM4DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkiIEAxMjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjANCi0JCQkgICAgbG9jYXRpb24gICAJKDE0ODksIC02NzYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1DQotCQkJCVBhcmVudF9WaWV3IAlAMTI0DQotCQkJCWxvY2F0aW9uICAgCSgxNjc5LCAyMjk5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNTc2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSINCi0JCQkJcGN0RGlzdCAgICAJMC44Mjg2MDENCi0JCQkJaGVpZ2h0ICAgICAJNTYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhCRDQ5MTQwMTRFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTIwDQotCQkJICAgIHN1cHBsaWVyICAgCUA4OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI5NDUsIDE4OTEpDQotCQkJCSgyOTQ1LCAyMjQzKQ0KLQkJCQkoMTQzOCwgMjI0MykNCi0JCQkJKDE0MzgsIDIxNDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjk0NSwgMTg5MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzgsIDIxNDgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNg0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2NSwgMjE3OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTg0Nzc0DQotCQkJCWhlaWdodCAgICAgCTc0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMTU5MDFEQSINCi0JCSAgICBjbGllbnQgICAgIAlAMTEyDQotCQkgICAgc3VwcGxpZXIgICAJQDY2DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk1MCwgNjQ1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTUwLCA0ODYpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyIiBAMTI4DQotCQkgICAgbG9jYXRpb24gICAJKDEzNDYsIDc1MikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkE5NTAwQ0MiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMiIEAxMjkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgNCi0JCQkgICAgbG9jYXRpb24gICAJKC01NDIsIC0xNikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkE5NTAzMTEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDk2DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzQ2LCA3NTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg5LCA3NTIpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0IiBAMTMwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTQyLCAtMTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkE5NTAzMUIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTM0NiwgNzUyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMywgNzUyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzANCi0JCQkJbG9jYXRpb24gICAJKDE1NDQsIDc5MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNzczMzkwDQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJBdHRyaWJ1dGVEZWZpbml0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjM3RTE0NDU3MDI1NyINCi0JICAgIHRpdGxlICAgICAgCSJBdHRyaWJ1dGVEZWZpbml0aW9uIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQXR0cmlidXRlIiBAMTMyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1MTIsIDY1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzINCi0JCQlsb2NhdGlvbiAgIAkoMjM2LCA1MzkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTUyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERBdHRyaWJ1dGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NDMTg3OTAwRUEiDQotCQkgICAgd2lkdGggICAgICAJNTcwDQotCQkgICAgaGVpZ2h0ICAgICAJMjU4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQmFzaWNUeXBlIiBAMTMzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjY0LCA2NTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTMzDQotCQkJbG9jYXRpb24gICAJKDEwMTcsIDU4NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0OTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREJhc2ljVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RTE0NjRGMDBEQSINCi0JCSAgICB3aWR0aCAgICAgIAk1MTINCi0JCSAgICBoZWlnaHQgICAgIAkxNjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnVtZXJhdGlvblR5cGUiIEAxMzQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDY1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzQNCi0JCQlsb2NhdGlvbiAgIAkoMTY0NiwgNTg0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUxNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERW51bWVyYXRpb25UeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFMTQ2NjgwMzA2Ig0KLQkJICAgIHdpZHRoICAgICAgCTUzNA0KLQkJICAgIGhlaWdodCAgICAgCTE2OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMTM1DQotCQkgICAgbG9jYXRpb24gICAJKDkxMiwgMTEyMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzUNCi0JCQlsb2NhdGlvbiAgIAkoNDkyLCA5MjYpDQotCQkJbmxpbmVzICAgICAJOQ0KLQkJCW1heF93aWR0aCAgCTgwNQ0KLQkJCWxhYmVsICAgICAgCQ0KLXxBIERURCBhdHRyaWJ1dGUncyB0eXBlIGFuZCBpbml0aWFsDQotfHZhbHVlIGFyZSByZXByZXNlbnRlZCB1c2luZyB0aGUgZVR5cGUgYW5kIGRlZmF1bHQgdmFsdWUgc3RvcmVkIGluIGVBdHRyaWJ1dGUuIFRoZSBlVHlwZSB3aWxsIGFsd2F5cyBiZSBlaXRoZXIgRFREQmFzaWNUeXBlIChzdWJjbGFzcyBvZiBlQ2xhc3MpIG9yIERUREVudW1lcmF0aW9uVHlwZSAoc3ViY2xhc3Mgb2YgZUVudW0pLg0KLQkJCSkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHdpZHRoICAgICAgCTg2NQ0KLQkJICAgIGhlaWdodCAgICAgCTQwMCkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMTM2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGNsaWVudCAgICAgCUAxMzINCi0JCSAgICBzdXBwbGllciAgIAlAMTM1DQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyIgQDEzNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyNjQsIDI3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzcNCi0JCQlsb2NhdGlvbiAgIAkoMTE4MywgMTk3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUNsYXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSINCi0JCSAgICBoZWlnaHQgICAgIAkxNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVFbnVtIiBAMTM4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgMjcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzOA0KLQkJCWxvY2F0aW9uICAgCSgxODIzLCAxOTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFRW51bSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE0NzNFOTAxRDQiDQotCQkgICAgaGVpZ2h0ICAgICAJMTc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMzkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YyODAwMzE1Ig0KLQkJICAgIGNsaWVudCAgICAgCUAxMzMNCi0JCSAgICBzdXBwbGllciAgIAlAMTM3DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI2MCwgNTcyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjYwLCAzNTkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMjgxMDMwMiINCi0JCSAgICBjbGllbnQgICAgIAlAMTM0DQotCQkgICAgc3VwcGxpZXIgICAJQDEzOA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5MDMsIDU3MikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkwMywgMzU5KSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVBdHRyaWJ1dGUiIEAxNDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1MjgsIDI3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNDENCi0JCQlsb2NhdGlvbiAgIAkoNDQ3LCAxOTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFQXR0cmlidXRlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MjM4NDcyMDM5RCINCi0JCSAgICBoZWlnaHQgICAgIAkxNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0Mg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjE1OTAxREEiDQotCQkgICAgY2xpZW50ICAgICAJQDEzMg0KLQkJICAgIHN1cHBsaWVyICAgCUAxNDENCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjAsIDUyNykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTIwLCAzNTkpKSkpKSkNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9yb3NlL2R0ZG1vZGVsLm1kbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL3Jvc2UvZHRkbW9kZWwubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTU2MjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL3Jvc2UvZHRkbW9kZWwubWRsCisrKyAvZGV2L251bGwKQEAgLTEsNzUyNiArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTQ1DQotICAgIF93cml0dGVuICAgCSJSb3NlIDcuNS4wMTAzLjE5MjAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIklERSINCi0JICAgIHZhbHVlICAgICAgCSJJbnRlcm5hbCBFZGl0b3IiKSkNCi0gICAgcXVpZCAgICAgICAJIjNFMzZCRUI2MDEzMyINCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cw0KLQlyaWdodE1hcmdpbiAJMC4yNTAwMDANCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDANCi0JdG9wTWFyZ2luICAJMC4yNTAwMDANCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMA0KLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDANCi0JY2xpcEljb25MYWJlbHMgCVRSVUUNCi0JYXV0b1Jlc2l6ZSAJVFJVRQ0KLQlzbmFwVG9HcmlkIAlUUlVFDQotCWdyaWRYICAgICAgCTE2DQotCWdyaWRZICAgICAgCTE2DQotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQNCi0JICAgIHNpemUgICAgICAgCTEwDQotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JICAgIHVuZGVybGluZSAgCUZBTFNFDQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkgICAgY29sb3IgICAgICAJMA0KLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0Jc2hvd01lc3NhZ2VOdW0gCTENCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUNCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQ0KLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEM3NUY0MDFGNyINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBMEM3NUY0MDIwQiINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciDQotCXF1aWQgICAgICAgCSIzQTBDNzVGNDAxRjYiDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkdSAgICAgIAkiM0EwQzc1RjQwMUY4Ig0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZWNvcmUiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRWQUJBU0VfUExVR0lOU19QQVRIXFxvcmcuZWNsaXBzZS5lbWYuZWNvcmVcXHNyY1xcbW9kZWxcXG9yZy5lY2xpcHNlLmVtZi5FQ29yZS5jYXQiDQotCQlxdWlkICAgICAgIAkiMzlBNUVEMDQwMDRFIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImR0ZCINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFZBQkFTRV9QTFVHSU5TX1BBVEhcXG9yZy5lY2xpcHNlLndzdC5kdGRcXHNyY1xccm9zZVxcRFRELmNhdCINCi0JCXF1aWQgICAgICAgCSIzODU3QjFDMDAyOTMiKSkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzQTBDNzVGNDAxRkYiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmVjb3JlIiBAMQ0KLQkJCWxvY2F0aW9uICAgCSg5NjAsIDMwNCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxDQotCQkJICAgIGxvY2F0aW9uICAgCSg4MTYsIDIyMCkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiZWNvcmUiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzOUE1RUQwNDAwNEUiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmR0ZCIgQDINCi0JCQlsb2NhdGlvbiAgIAkoMzY4LCAyNTYpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjI0LCAxNzIpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImR0ZCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM4NTdCMUMwMDI5MyINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApKSkpKQ0KLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMUY4Ig0KLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMjBBIg0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3Nlcw0KLQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMUY5Ig0KLQlQcm9jc05EZXZzIAkobGlzdA0KLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyINCi0JCXF1aWQgICAgICAgCSIzQTBDNzVGNDAxRkIiDQotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3Ig0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMNCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFCYXNlU2V0IiA4MDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiQU5TSSINCi0JCQkJdmFsdWUgICAgICAJODAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiT3JhY2xlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJTUUxTZXJ2ZXIiDQotCQkJCXZhbHVlICAgICAgCTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIlN5YmFzZSINCi0JCQkJdmFsdWUgICAgICAJODAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiV2F0Y29tIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJJZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJWXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIlRfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkluaGVyaXRTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIl9WIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJCYXNlVmlld3MiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJWQVJDSEFSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIk51bGxzT0siDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcmVzZXJ2ZVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklETEVsZW1lbnQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklETFNwZWNpZmljYXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSURMU3BlY1NldCIgMjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMU3BlY1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTIyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiVHlwZWRlZiINCi0JCQkJdmFsdWUgICAgICAJNTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkV4Y2VwdGlvbiINCi0JCQkJdmFsdWUgICAgICAJNjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJTdHJ1Y3QiDQotCQkJCXZhbHVlICAgICAgCTUxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiVW5pb24iDQotCQkJCXZhbHVlICAgICAgCTgxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmR0ZC9zcmMvcm9zZS9kdGRtb2RlbC5tZGwsIG9yZy5lY2xpcHNlLndzdC5kdGQsIHd0cE0xLCAyMDA0MTEyMiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSURMTW9kdWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLndzdC5kdGQvc3JjL3Jvc2UvZHRkbW9kZWwubWRsLCBvcmcuZWNsaXBzZS53c3QuZHRkLCB3dHBNMSwgMjAwNDExMjIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiUmFpc2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkSGFzUmVsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkhhc1JlbFR5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiU0NDIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCQluYW1lICAgICAgIAkiQ29kZWdlbiBOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSJDKysgUmV2ZXJzZSBFbmdpbmVlcmVkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQm9keUluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyU291cmNlRmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlTb3VyY2VGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQU5TSSBDKysgRXZlbnQgV2F0Y2hlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFOU0lDb252ZXJ0Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQURBODNfU09VUkNFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NBY2Nlc3MiDQotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBvbHltb3JwaGljVW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSGFuZGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSGFuZGxlQWNjZXNzIg0KLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIkFfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIlRoZV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIlRoaXMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvcHkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJGcmVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NFcXVhbGl0eU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSGFuZGxlRXF1YWxpdHlPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1Rhc2siDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiTGltaXRlZFByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIwMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiDQotCQkJCXZhbHVlICAgICAgCTIyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQm9keSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciDQotCQkJCXZhbHVlICAgICAgCTIyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiDQotCQkJCXZhbHVlICAgICAgCTIyMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiSW4iDQotCQkJCXZhbHVlICAgICAgCTIwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uUmV0dXJuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJVc2VDb2xvbk5vdGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTk1X1NPVVJDRSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJUeXBlSW1wbGVtZW50YXRpb25TZXQiIDIwOCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUNvbnRyb2xTZXQiIDIyNSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ29udHJvbGxlZF8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZURlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEltcGxlbWVudGF0aW9uU2V0IiAyMDkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRLaW5kUGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7Y2xhc3N9X1JlY29yZF9LaW5kcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzTGltaXRlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGUiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQ2xhc3NXaWRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk1heWJlQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0IiAxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudENsYXNzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU3VwZXJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheU9mQWNjZXNzVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7YWNjZXNzX3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheUluZGV4RGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiUG9zaXRpdmUgcmFuZ2UgPD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIlRoaXMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvcHkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJGcmVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUeXBlRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVFcXVhbGl0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cXVvdGV9PSR7cXVvdGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVGFnZ2VkIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlJlY29yZCINCi0JCQkJdmFsdWUgICAgICAJMjEwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJNaXhpbiINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJUYXNrIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVUeXBlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk11bHRpcGxlVHlwZXMiDQotCQkJCXZhbHVlICAgICAgCTIxMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVW5jb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJMjE0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTIyNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW5pdGlhbGl6YXRpb25Pbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMjYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRGaW5hbGl6YXRpb25Pbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMjcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMjI4KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyINCi0JCQkJdmFsdWUgICAgICAJMjI5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBdXRvIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzApKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNQcml2YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGluZyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlckNsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUJhcnJpZXJDb25kaXRpb24iDQotCQkJdmFsdWUgICAgICAJIlRydWUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiDQotCQkJCXZhbHVlICAgICAgCTIyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQm9keSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciDQotCQkJCXZhbHVlICAgICAgCTIyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmdBc0JvZHkiDQotCQkJCXZhbHVlICAgICAgCTIzMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiDQotCQkJCXZhbHVlICAgICAgCTIyMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW4iDQotCQkJCXZhbHVlICAgICAgCTIwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2VzcyINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjE3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjE3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLndzdC5kdGQvc3JjL3Jvc2UvZHRkbW9kZWwubWRsLCBvcmcuZWNsaXBzZS53c3QuZHRkLCB3dHBNMSwgMjAwNDExMjIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmR0ZC9zcmMvcm9zZS9kdGRtb2RlbC5tZGwsIG9yZy5lY2xpcHNlLndzdC5kdGQsIHd0cE0xLCAyMDA0MTEyMiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkicHJvamVjdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVmlld0NvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRvbWFpbkNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNQUGFja2FnZUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJbmRleENvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSm9pbkNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJjT05UQUlORVJDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlZpZXdQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEb21haW5QcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSW5kZXhQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEYXRhYmFzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhcmdldERhdGFiYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlU3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGVhdWx0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQnVmZmVyUG9vbCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkV4dGVudFNpemUiDQotCQkJdmFsdWUgICAgICAJMSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByZWZldGNoU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkxKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFnZVNpemUiDQotCQkJdmFsdWUgICAgICAJNCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk1hbmFnZWRCeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckxpc3QiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1TY2hlbWEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbURvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm9vdFNjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm9vdERvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhYmFzZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiREJNUyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNWaWV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEb21haW4iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NQUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN5bm9ueW1ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvcnJlbGF0aW9uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdENsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tPcHRpb24iDQotCQkJdmFsdWUgICAgICAJIk5vbmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTbmFwU2hvdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGlzdGluY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQZXJzaXN0VG9TZXJ2ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1BhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSWRlbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5hdGl2ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9JRCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlbGF0aW9uc2hpcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJJTWV0aG9kIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3ROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNUcmlnZ2VyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTdG9yZWRQcm9jZWR1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0NsdXN0ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRmlsbEZhY3RvciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiS2V5TGlzdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrUHJlZGljYXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZlcmFsTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDaGVja1RpbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSW5zZXJ0RXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZUV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZWxldGVFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk9sZFRhYmxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmTmV3VGFibGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZPbGRSb3ciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZOZXdSb3ciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1JvdyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIldoZW5DbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMYW5ndWFnZSINCi0JCQl2YWx1ZSAgICAgIAkiU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByb2NUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJQcm9jZWR1cmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZXRlcm1pbmlzdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyU3R5bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5lZE51bGwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbWV0ZXIiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luUGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc091dFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSUQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIENvbW11bmljYXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImZyYW1ld29yayINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9vdERpciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOb3RTaG93Um9zZUlERGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNob3dDb2RlZ2VuRGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUm9zZUlEIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0UmV0dXJuTGluZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0QXV0aG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0VmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFNpbmNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NOdW1Bc3Rlcmlza3MiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNYXhOdW1DaGFycyINCi0JCQl2YWx1ZSAgICAgIAk4MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZNIg0KLQkJCXZhbHVlICAgICAgCSgiVk1UeXBlIiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiLjtDOlxcSUJNXFxTUUxMSUJcXGphdmFcXGRiMmphdmEuemlwO0M6XFxJQk1cXFNRTExJQlxcamF2YVxcZGIyamNjLmphcjtDOlxcSUJNXFxTUUxMSUJcXGphdmFcXHNxbGouemlwO0M6XFxJQk1cXFNRTExJQlxcYmluO0M6XFxJQk1cXFNRTExJQlxcamF2YVxcY29tbW9uLmphciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVmZXJlbmNlQ2xhc3NwYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZNVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3VuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWQUphdmFXb3JraW5nRm9sZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlVmFyaWFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdE9wZXJhdGlvblJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJInZvaWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5vQ2xhc3NDdXN0b21EbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2xvYmFsSW1wb3J0cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZU1ldGhvZFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTcGFjaW5nSXRlbXMiDQotCQkJdmFsdWUgICAgICAJMykNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1NpbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5QcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZW1vdGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVtb3RlU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkhvbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSG9tZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRFRETG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERURExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicGFja2FnZSINCi0JCQkJdmFsdWUgICAgICAJNjUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkh0dHBfU2VydmxldF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfRUpCX19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIyLjAiDQotCQkJCXZhbHVlICAgICAgCTIzMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIxLngiDQotCQkJCXZhbHVlICAgICAgCTIzMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFJldHVybiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJfSUQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciINCi0JCQkJdmFsdWUgICAgICAJMTkwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSINCi0JCQkJdmFsdWUgICAgICAJMTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlJPVyINCi0JCQkJdmFsdWUgICAgICAJMTcwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiDQotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCINCi0JCQkJdmFsdWUgICAgICAJMTYwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iDQotCQkJdmFsdWUgICAgICAJIjIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSI2IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDb21wb25lbnRUZXN0Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTYwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjIuMV9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImh+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcyksJGxpbWl0KSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSwkbGltaXQpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlKCRsaW1pdCkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZSgkbGltaXQpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2Uoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2Uoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjMuMF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImh+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0tleSINCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdENvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzaWdubWVudE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFcXVhbGl0eU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcmFnZU1nbXRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3Vic2NyaXB0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRSZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlcmVmZXJlbmNlT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25SZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdHJlYW1PcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdHJlYW1WaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUaHJlZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGcmllbmRLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlQW5kRGVmaW5lIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSINCi0JCQkJdmFsdWUgICAgICAJMjA2KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuZHRkL3NyYy9yb3NlL2R0ZG1vZGVsLm1kbCwgb3JnLmVjbGlwc2Uud3N0LmR0ZCwgd3RwTTEsIDIwMDQxMTIyIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLndzdC5kdGQvc3JjL3Jvc2UvZHRkbW9kZWwubWRsLCBvcmcuZWNsaXBzZS53c3QuZHRkLCB3dHBNMSwgMjAwNDExMjIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFic3RyYWN0Qm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmRCb2R5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZERlY2wiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNwZWNpYWxEZWNsUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNFeHBsaWNpdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvZHlBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnlJc09uU2VhcmNoTGlzdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiDQotCQkJdmFsdWUgICAgICAJMikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIjUuMCIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDbGFzc19GYWN0b3J5Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2VyaWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9EQVRBX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJMaWNlbnNlZCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRUN0bFR5cGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYklEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wUGFnZUlEcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BJZEVudW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSU5URVJGQUNFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25NYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaGVyaXRhbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDRGVjbGFyZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDT01NYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX1BPSU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcGVydHlNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsX092ZXJyaWRlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X0ZpcmluZ19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbWFuZF9QYXJzZXIiDQotCQkJCXZhbHVlICAgICAgCTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9Ob3RpZnlfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTEwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlJbWFnZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUm9zZSBNb2RlbCBJbnRlZ3JhdG9yIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVG9wTGluayINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIlR5cGVLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJlbnVtIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJyZWNvcmQiDQotCQkJCXZhbHVlICAgICAgCTEwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJIm1vZHVsZSINCi0JCQkJdmFsdWUgICAgICAJMTAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiaW50ZXJmYWNlIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJkaXNwaW50ZXJmYWNlIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJjb2NsYXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJhbGlhcyINCi0JCQkJdmFsdWUgICAgICAJMTA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkidW5pb24iDQotCQkJCXZhbHVlICAgICAgCTEwNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJIm1heCINCi0JCQkJdmFsdWUgICAgICAJMTA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJraW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUtpbmRzIiAxMDkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidXVpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiZGxsbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImFsaWFzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImZpbGVuYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkibGlicmFyeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInV1aWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBmaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJsY2lkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZlcnNpb24gQ29udHJvbCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpY05vdENyZWF0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMjEzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxTaW5nbGVVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIk11bHRpVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjIwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCYXNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMjIyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiMCINCi0JCQkJdmFsdWUgICAgICAJMjIzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiMSINCi0JCQkJdmFsdWUgICAgICAJMjI0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25CYXNlIg0KLQkJCXZhbHVlICAgICAgCSgiQmFzZVNldCIgMjIyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkV4cGxpY2l0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiQ29tcGFyZVNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmciDQotCQkJdmFsdWUgICAgICAJKCJJbnN0YW5jaW5nU2V0IiAyMTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQ29tcGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkJpbmFyeSINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiVGV4dCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkxpYnJhcnlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQWxpYXNOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSXNTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0JvZHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Qm9keSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk5ldyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk5ldyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50c0RlbGVnYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJ5VmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQnlSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtQXJyYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvamVjdEZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW1wb3J0UmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUXVpY2tJbXBvcnQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcG9ydEJpbmFyeSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWxTdHVkaW8iDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJXZWIgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1N5c3RlbUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVudGl0eV9QdWJsaWNJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvblZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkludGVybmFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyRW50aXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkV4dGVybmFsRW50aXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1N5c3RlbUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1B1YmxpY0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHREZWNsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbiBBbGwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiQ29tcG9uZW50UGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImNsYXNzaWZpZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkib3BlcmF0aW9uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0lEIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInJlZmVyZW5jZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkpDQotCXF1aWQgICAgICAgCSIzQTBDNzVGNDAxRkEiKSkNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlZTUzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hbnkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hbnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDE3ZDkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYW55LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiYjdiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9saXN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTVlYjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX2xpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvY29tbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YzJjY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY0ODg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnRfcmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9yZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDlhY2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9yZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbXB0eWNvbnRlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbXB0eWNvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzhlNjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW1wdHljb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5MTg4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwYjI2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMWMxMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjJjYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfbm90LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9ub3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTA5NjY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9ub3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX3VucmVjLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl91bnJlYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZDgyZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX3VucmVjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2F0dGxpc3Rfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2F0dGxpc3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0OWM3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9hdHRsaXN0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9jb21tZW50c19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfY29tbWVudHNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmMDk0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9jb21tZW50c19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9nZW5odG1mb3JtX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2dlbmh0bWZvcm1fd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1NDcwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2dlbmh0bWZvcm1fd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOWRmOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NGMyNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVjaG9pY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVjaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTNiYTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lY2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyYjM1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZWNob2ljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZWNob2ljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Mzk4YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVjaG9pY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVzZXF1ZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZXNlcXVlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxZGIyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZXNlcXVlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lc2VxdWVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVzZXF1ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOTY1OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVzZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQyMmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbGNob2ljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsY2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI0ZjliZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsY2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxzZXF1ZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsc2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGQ1Mjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxzZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3R4dGV4dC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3R4dGV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTdhMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi91bnJlY29nbml6ZWRfY29udGVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3VucmVjb2duaXplZF9jb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4OTk3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3VucmVjb2duaXplZF9jb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWY1MTRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVjaG9pY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlY2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhYzEzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVjaG9pY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3Jlc2VxdWVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3Jlc2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQ0Y2I3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZXNlcXVlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOGM3OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLXBsdWdpbk5hbWU9U3RydWN0dXJlZCBTb3VyY2UgRFREIENvcmUKLSMKLVN0cnVjdHVyZWRfRFREX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWU9U3RydWN0dXJlZCBEVEQgRG9jdW1lbnQgRmFjdG9yeSBFeHRlbnNpb24KLURURF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1EVEQKLV9EVERfVkFMSURBVE9SX05BTUUgICAgICAgICAgICAgICA9IERURCBWYWxpZGF0b3IKLV92YWxpZGF0aW9uTWFya2VyLm5hbWU9RFREIFByb2JsZW0KLV90YXNrTWFya2VyLm5hbWU9RFREIFRhc2sKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTJjMTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yRFREIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRhc2tzY2FubmVyIj4KLQkJPHNjYW5uZXIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGFza3MuRFRERmlsZVRhc2tTY2FubmVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50YXNrcy5EVERGaWxlVGFza1NjYW5uZXI6b3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRhc2tNYXJrZXIiCi0JCQljb250ZW50VHlwZUlkcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCWlkPSJ0YXNrTWFya2VyIgotCQluYW1lPSIlX3Rhc2tNYXJrZXIubmFtZSIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotCQk8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGFza21hcmtlciIvPgotCQk8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotCTwvZXh0ZW5zaW9uPgotICAgIDxleHRlbnNpb24KLSAgICAgICBpZD0idmFsaWRhdGlvbk1hcmtlciIKLSAgICAgICAgbmFtZT0iJV92YWxpZGF0aW9uTWFya2VyLm5hbWUiCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcm9ibGVtbWFya2VyIi8+Ci0gICAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotICAgIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudENyZWF0aW9uIgotCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmRvY3VtZW50ZmFjdG9yaWVzIgotCQluYW1lPSIlU3RydWN0dXJlZF9EVERfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZSI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVycy5CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0iZHRkIiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJtb2QiIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImVudCIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUuY29udGVudFR5cGVzIj4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJkdGQsbW9kLGVudCIKLQkJCXByaW9yaXR5PSJub3JtYWwiCi0JCQluYW1lPSIlRFREX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50LkNvbnRlbnREZXNjcmliZXJGb3JEVEQiIC8+Ci0JCTwvY29udGVudC10eXBlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotCQk8cGFyc2VyCi0JCQl0eXBlPSJkdGQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFJlc291cmNlRmFjdG9yeUltcGwiPgotCQk8L3BhcnNlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KLQkJPHBhcnNlcgotCQkJdHlwZT0iZW50IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERSZXNvdXJjZUZhY3RvcnlJbXBsIj4KLQkJPC9wYXJzZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotCQk8cGFja2FnZQotCQkJdXJpPSJEVEQueG1pIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERQYWNrYWdlSW1wbCI+Ci0JCTwvcGFja2FnZT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudEZhY3RvcmllcyI+Ci0JCTxmYWN0b3J5Ci0JCQl0eXBlPSJkdGQsIGVudCwgbW9kLCB4bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50RmFjdG9yeURURCI+Ci0JCTwvZmFjdG9yeT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSBkdGQgY29yZSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFJlZ2lzdGVyIHRoZSBEVEQgdmFsaWRhdG9yIHdpdGggdGhlIChuZXcpIHZhbGlkYXRpb24gICAtLT4KLQk8IS0tIGZyYW1ld29yay4gCQkJCQkJCQkJCSAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24gaWQ9ImR0ZERURFZhbGlkYXRvciIgbmFtZT0iJV9EVERfVkFMSURBVE9SX05BTUUiIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvciIKLSAgICAgICAgICAgIG1hbnVhbD0idHJ1ZSIKLSAgICAgICAgICAgIHNvdXJjZWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmR0ZHNvdXJjZXZhbGlkYXRvciIKLSAgICAgICAgICAgIHZlcnNpb249IjEiCi0gICAgICAgICAgICBtYXJrZXJJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnZhbGlkYXRpb25NYXJrZXIiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9ImR0ZCIvPgotICAgICAgICAgICAgICAgPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0iZW50Ii8+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dCBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIgZXh0PSJtb2QiLz4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEVEQgYXMgeW91IHR5cGUgdmFsaWRhdGlvbgkJCQkJCQkJLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuZHRkc291cmNldmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuREVGQVVMVCI+Ci0JCQkJPC9wYXJ0aXRpb25UeXBlPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHROb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNzUzNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQXR0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXR0Tm9kZSB7Ci0JLy8KLQkvLyBhdHRUeXBlCi0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDREFUQSA9IDAsIElEID0gMSwgSURSRUYgPSAyLCBJRFJFRlMgPSAzLCBFTlRJVFkgPSA0LCBFTlRJVElFUyA9IDUsIE5NVE9LRU4gPSA2LCBOTVRPS0VOUyA9IDcsIE5PVEFUSU9OID0gOCwgRU5VTUVSQVRJT04gPSA5LCBQRVJFRkVSRU5DRSA9IDEwOwotCi0JLy8KLQkvLyBLZWVwIHRoaXMgYXJyYXkgaW4tc3luYyB3aXRoIHRoZSBBVFRUWVBFIGRlZmluaXRpb25zCi0JLy8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBmZ0F0dFR5cGVTdHJpbmcgPSB7IkNEQVRBIiwgLy8gMCAvLyROT04tTkxTLTEkCi0JCQkJIklEIiwgLy8gMSAvLyROT04tTkxTLTEkCi0JCQkJIklEUkVGIiwgLy8gMiAvLyROT04tTkxTLTEkCi0JCQkJIklEUkVGUyIsIC8vIDMgLy8kTk9OLU5MUy0xJAotCQkJCSJFTlRJVFkiLCAvLyA0IC8vJE5PTi1OTFMtMSQKLQkJCQkiRU5USVRJRVMiLCAvLyA1IC8vJE5PTi1OTFMtMSQKLQkJCQkiTk1UT0tFTiIsIC8vIDYgLy8kTk9OLU5MUy0xJAotCQkJCSJOTVRPS0VOUyIsIC8vIDcgLy8kTk9OLU5MUy0xJAotCQkJCSJOT1RBVElPTiIsIC8vIDggLy8kTk9OLU5MUy0xJAotCQkJCSJFTlVNRVJBVElPTiIsIC8vIDkgKHJlcGxhY2VkIHdpdGggIk5NVE9LRU4iIGJ5IFNBWCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCS8vIEF0dHJpYnV0ZUxpc3QgaGFuZGxlcikKLQkJCQkiJUVOVElUWVJFRkVSRU5DRTsifTsgLy8kTk9OLU5MUy0xJAotCi0JLy8KLQkvLyBhdHREZWZhdWx0VHlwZQotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9GSVhFRCA9IDEsIC8vIEF0dFZhbHVlCi0JCQkJUkVRVUlSRUQgPSAyLCAvLyAjUkVRVUlSRUQKLQkJCQlJTVBMSUVEID0gMywgLy8gI0lNUExJRUQKLQkJCQlGSVhFRCA9IDQ7IC8vICNGSVhFRCBBdHRWYWx1ZQotCi0JcHVibGljIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIHR5cGUgPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFR5cGUgPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFZhbHVlID0gbnVsbDsKLQlwdWJsaWMgVmVjdG9yIGVudW1MaXN0ID0gbnVsbDsgLy8gbGlzdCBvZiBOb3RhdGlvbnMgb3IgRW51bSB2YWx1ZXMKLQotCXB1YmxpYyBpbnQgZ2V0RGVjbGFyZWRUeXBlKCkgewotCQlpbnQgdCA9IC0xOwotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIHQ7Ci0KLQkJaWYgKHR5cGUuc3RhcnRzV2l0aCgiJSIpICYmIHR5cGUuZW5kc1dpdGgoIjsiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gUEVSRUZFUkVOQ0U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZ0F0dFR5cGVTdHJpbmcubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0eXBlLmVxdWFscyhmZ0F0dFR5cGVTdHJpbmdbaV0pKSB7Ci0JCQkJdCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHQ7Ci0JfQotCi0JcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgewotCQlpZiAoZW51bUxpc3QgPT0gbnVsbCkKLQkJCWVudW1MaXN0ID0gbmV3IFZlY3RvcigpOwotCQlyZXR1cm4gZW51bUxpc3QuZWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRUeXBlKCkgewotCQlpZiAoZGVmYXVsdFR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoZGVmYXVsdFR5cGUuc3RhcnRzV2l0aCgiJSIpICYmIGRlZmF1bHRUeXBlLmVuZHNXaXRoKCI7IikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIFBFUkVGRVJFTkNFOwotCQllbHNlIGlmIChkZWZhdWx0VHlwZS5lcXVhbHMoIiNSRVFVSVJFRCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gUkVRVUlSRUQ7Ci0JCWVsc2UgaWYgKGRlZmF1bHRUeXBlLmVxdWFscygiI0lNUExJRUQiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIElNUExJRUQ7Ci0JCWVsc2UgaWYgKGRlZmF1bHRUeXBlLmVxdWFscygiI0ZJWEVEIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBGSVhFRDsKLQkJZWxzZQotCQkJcmV0dXJuIE5PRklYRUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBdHQgTmFtZTogIiArIG5hbWUgKyAiIFR5cGU6ICIgKyB0eXBlICsgIiBkZWZhdWx0VHlwZTogIiArIGRlZmF1bHRUeXBlICsgIiBkZWZhdWx0VmFsdWU6ICIgKyBkZWZhdWx0VmFsdWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHRsaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHRsaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNzdhMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQXR0bGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIEF0dGxpc3QgZXh0ZW5kcyBCYXNlTm9kZSB7Ci0JVmVjdG9yIGF0dERlZnMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgbGlzdCdzIG5hbWU7IHRoaXMgdmFsdWUgaXMgYWxzbyBrbm93biBhcyB0aGUKLQkgKiAgICAgICAgICAgIEVsZW1lbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgQXR0bGlzdChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFREKSB7Ci0JCXRoaXMobmFtZSwgb3duZXJEVEQsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBBdHRsaXN0KFN0cmluZyBuYW1lLCBTdHJpbmcgb3duZXJEVEQsIFN0cmluZyBjb21tZW50LCBFcnJvck1lc3NhZ2UgZXJyb3JNZXNzYWdlKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFRELCBjb21tZW50LCBlcnJvck1lc3NhZ2UpOwotCX0KLQotCi0JLyoqCi0JICogQWRkcyB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBkZWZpbml0aW9uIHRvIHRoZSBlbmQgb2YgdGhpcyBhdHRyaWJ1dGUKLQkgKiBsaXN0IC4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0RGVmCi0JICogICAgICAgICAgICBBdHRyaWJ1dGUgZGVmaW5pdGlvbiB0byBhZGQgdG8gdGhpcyBhdHJpYnV0ZSBsaXN0LgotCSAqIEByZXR1cm4gPXRydWUgaWYgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4KLQkgKiAgICAgICAgIHRoaXMgYXR0cmlidXRlIGxpc3Q7IG90aGVyd2lzZSwgPWZhbHNlLgotCSAqIEBzZWUgI2VsZW1lbnRBdAotCSAqIEBzZWUgI2dldEF0dERlZgotCSAqIEBzZWUgI2NvbnRhaW5zCi0JICogQHNlZSAjc2l6ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZEVsZW1lbnQoQXR0Tm9kZSBhdHREZWYpIHsKLQkJaWYgKGNvbnRhaW5zKGF0dERlZi5uYW1lKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJdGhpcy5hdHREZWZzLmFkZEVsZW1lbnQoYXR0RGVmKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24gYXQgdGhlIHNwZWNpZmllZCA8dmFyPmluZGV4PC92YXI+IGluCi0JICogdGhpcyBhdHRyaWJ1dGUgbGlzdAotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgSW5kZXggaW50byB0aGlzIGxpc3Qgb2YgYXR0cmlidXRlIGRlZmluaXRpb25zLgotCSAqIEByZXR1cm4gQXR0cmlidXRlIGRlZmluaXRpb24gYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgb3IgPHZhcj5udWxsPC92YXI+Ci0JICogICAgICAgICBpZiBhbiBpbnZhbGlkIGluZGV4LgotCSAqIEBzZWUgI2FkZEVsZW1lbnQKLQkgKiBAc2VlICNnZXRBdHREZWYKLQkgKiBAc2VlICNjb250YWlucwotCSAqIEBzZWUgI3NpemUKLQkgKi8KLQlwdWJsaWMgQXR0Tm9kZSBlbGVtZW50QXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQXR0Tm9kZSkgdGhpcy5hdHREZWZzLmVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24gdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogZGVmaW5pdGlvbiBuYW1lIGluIHRoaXMgYXR0cmlidXRlIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGF0dERlZk5hbWUKLQkgKiAgICAgICAgICAgIEF0dHJpYnV0ZSBkZWZpbml0aW9uIG5hbWUgdG8gbWF0Y2ggaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAcmV0dXJuIFRoZSBtYXRjaGluZyBhdHRyaWJ1dGUgZGVmaW5pdGlvbiwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZQotCSAqICAgICAgICAgYXR0cmlidXRlIGlzIG5vdCBjdXJyZW50bHkgZGVmaW5lZC4KLQkgKiBAc2VlICNhZGRFbGVtZW50Ci0JICogQHNlZSAjZWxlbWVudEF0Ci0JICogQHNlZSAjY29udGFpbnMKLQkgKiBAc2VlICNzaXplCi0JICogQHNlZSAjZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgQXR0Tm9kZSBnZXRBdHREZWYoU3RyaW5nIGF0dERlZk5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotCQkJQXR0Tm9kZSBhZCA9IGVsZW1lbnRBdChpKTsKLQkJCWlmIChhdHREZWZOYW1lLmVxdWFscyhhZC5uYW1lKSkKLQkJCQlyZXR1cm4gYWQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGRlZmluaXRpb24gbmFtZSBpcyBjdXJyZW50bHkKLQkgKiBkZWZpbmVkIGluIHRoaXMgYXR0cmlidXRlIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGF0dERlZk5hbWUKLQkgKiAgICAgICAgICAgIEF0dHJpYnV0ZSBkZWZpbml0aW9uIG5hbWUgdG8gbWF0Y2ggaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAcmV0dXJuID10cnVlIGlmIDx2YXI+YXR0RGVmTmFtZTwvdmFyPiBpcyBkZWZpbmVkOyBvdGhlcndpc2UsID1mYWxzZS4KLQkgKiBAc2VlICNhZGRFbGVtZW50Ci0JICogQHNlZSAjZWxlbWVudEF0Ci0JICogQHNlZSAjZ2V0QXR0RGVmCi0JICogQHNlZSAjc2l6ZQotCSAqIEBzZWUgI2VsZW1lbnRzCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIGF0dERlZk5hbWUpIHsKLQkJcmV0dXJuIG51bGwgIT0gZ2V0QXR0RGVmKGF0dERlZk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIE51bWJlciBvZiBhdHRyaWJ1dGUgbGlzdCBkZWZpbml0aW9ucywgb3IgPHZhcj5udWxsPC92YXI+IGlmIG5vCi0JICogICAgICAgICBkZWZpbml0aW9ucyBkZWZpbmVkLgotCSAqIEBzZWUgI2FkZEVsZW1lbnQKLQkgKiBAc2VlICNlbGVtZW50QXQKLQkgKiBAc2VlICNnZXRBdHREZWYKLQkgKiBAc2VlICNjb250YWlucwotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0RGVmcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgYXR0cmlidXRlIGRlZmluaXRpb25zIGluIHRoaXMgYXR0cmlidXRlCi0JICogbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGVudW1lcmF0aW9uIG9mIGFsbCBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMsIG9yIDx2YXI+bnVsbDwvdmFyPgotCSAqICAgICAgICAgaWYgbm9uZSBzcGVjaWZpZWQuCi0JICogQHNlZSAjYWRkRWxlbWVudAotCSAqIEBzZWUgI2VsZW1lbnRBdAotCSAqIEBzZWUgI2dldEF0dERlZgotCSAqIEBzZWUgI2NvbnRhaW5zCi0JICogQHNlZSAjc2l6ZQotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuYXR0RGVmcy5lbGVtZW50cygpOwotCX0KLQotCXZvaWQgc2V0QXR0RGVmcyhWZWN0b3IgYXR0cnMpIHsKLQkJYXR0RGVmcyA9IGF0dHJzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0Jhc2VOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9CYXNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWIzOWJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0Jhc2VOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTm9kZSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwcm90ZWN0ZWQgRXJyb3JNZXNzYWdlIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JLy8gcHJvdGVjdGVkIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBvd25lckRURCA9IG51bGw7Ci0KLQkvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KLQlwdWJsaWMgQmFzZU5vZGUoU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCkgewotCQl0aGlzKG5hbWUsIG93bmVyRFRELCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQmFzZU5vZGUoU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCwgU3RyaW5nIGNvbW1lbnQsIEVycm9yTWVzc2FnZSBlcnJvck1lc3NhZ2UpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5vd25lckRURCA9IG93bmVyRFREOwotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCQl0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlTmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0T3duZXJEVEQoKSB7Ci0JCXJldHVybiBvd25lckRURDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPd25lckRURChTdHJpbmcgb3duZXIpIHsKLQkJb3duZXJEVEQgPSBvd25lcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKLQkJdGhpcy5jb21tZW50ID0gY29tbWVudDsKLQl9Ci0KLQlwdWJsaWMgRXJyb3JNZXNzYWdlIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoRXJyb3JNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNQmFzaWNOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTUJhc2ljTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWMwZmMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNQmFzaWNOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQ01CYXNpY05vZGUgZXh0ZW5kcyBDTU5vZGUgewotCXByaXZhdGUgaW50IHR5cGUgPSBDTU5vZGVUeXBlLkVNUFRZOyAvLyBwb3NzaWJsZSB0eXBlcyA6Ci0KLQkvLyBDTU5vZGVUeXBlLkVNUFRZCi0JLy8gQ01Ob2RlVHlwZS5BTlkKLQkvLyBDTU5vZGVUeXBlLlBDREFUQQotCi0JLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCi0JcHVibGljIENNQmFzaWNOb2RlKFN0cmluZyByZWZOYW1lKSB7Ci0JCXN1cGVyKHJlZk5hbWUpOwotCX0KLQotCXB1YmxpYyBDTUJhc2ljTm9kZShTdHJpbmcgcmVmTmFtZSwgaW50IHR5cGUpIHsKLQkJc3VwZXIocmVmTmFtZSk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICIgQmFzaWNOb2RlTmFtZTogIiArIGdldE5hbWUoKSArICIgVHlwZTogIiArIGdldFR5cGUoKSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Hcm91cE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNR3JvdXBOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZTIwMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Hcm91cE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIENNR3JvdXBOb2RlIGV4dGVuZHMgQ01SZXBlYXRhYmxlTm9kZSB7Ci0JcHJpdmF0ZSBpbnQgdHlwZSA9IENNTm9kZVR5cGUuR1JPVVA7Ci0JcHJpdmF0ZSBpbnQgZ3JvdXBLaW5kID0gQ01Ob2RlVHlwZS5HUk9VUF9TRVFVRU5DRTsKLQlwcml2YXRlIFZlY3RvciBjaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKLQotCXB1YmxpYyBDTUdyb3VwTm9kZSgpIHsKLQkJc3VwZXIoIkdST1VQIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8vIGltcGxlbWVudCBzdXBlciBjbGFzcwotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJLy8gY2FuJ3QgY2hhbmdlIC0gb25seSBvbmUgdHlwZSBhbGxvd3MKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEdyb3VwS2luZCgpIHsKLQkJcmV0dXJuIGdyb3VwS2luZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHcm91cEtpbmQoaW50IGtpbmQpIHsKLQkJZ3JvdXBLaW5kID0ga2luZDsKLQl9Ci0KLQlwdWJsaWMgVmVjdG9yIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoQ01Ob2RlIGNoaWxkKSB7Ci0JCWNoaWxkcmVuLmFkZEVsZW1lbnQoY2hpbGQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiR3JvdXAgKCAtIGtpbmQ6ICIgKyBnZXRHcm91cEtpbmQoKSArICIgT2NjVHlwZTogIiArIGdldE9jY3VycmVuY2UoKSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJRW51bWVyYXRpb24gZW4gPSBjaGlsZHJlbi5lbGVtZW50cygpOwotCQl3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCXJlc3VsdCArPSAiICIgKyBlbi5uZXh0RWxlbWVudCgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXN1bHQgKz0gIkdyb3VwICkiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxYmNhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTU5vZGUgewotCXByaXZhdGUgU3RyaW5nIHJlZk5hbWU7Ci0KLQkvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KLQlwdWJsaWMgQ01Ob2RlKFN0cmluZyByZWZOYW1lKSB7Ci0JCXRoaXMucmVmTmFtZSA9IHJlZk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gcmVmTmFtZTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldFR5cGUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFR5cGUoaW50IHR5cGUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYThkODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Ob2RlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGludGVyZmFjZSBDTU5vZGVUeXBlIHsKLQlzdGF0aWMgcHVibGljIGludCBFTVBUWSA9IDE7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgQU5ZID0gMjsKLQlzdGF0aWMgcHVibGljIGludCBQQ0RBVEEgPSAzOwotCXN0YXRpYyBwdWJsaWMgaW50IEVMRU1FTlRfUkVGRVJFTkNFID0gNDsKLQlzdGF0aWMgcHVibGljIGludCBFTlRJVFlfUkVGRVJFTkNFID0gNTsKLQlzdGF0aWMgcHVibGljIGludCBHUk9VUCA9IDY7Ci0KLQlzdGF0aWMgcHVibGljIGludCBPTkUgPSA3OwotCXN0YXRpYyBwdWJsaWMgaW50IE9QVElPTkFMID0gODsKLQlzdGF0aWMgcHVibGljIGludCBPTkVfT1JfTU9SRSA9IDk7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgWkVST19PUl9NT1JFID0gMTA7Ci0KLQlzdGF0aWMgcHVibGljIGludCBHUk9VUF9DSE9JQ0UgPSAxMTsKLQlzdGF0aWMgcHVibGljIGludCBHUk9VUF9TRVFVRU5DRSA9IDEyOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlZmVyZW5jZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNUmVmZXJlbmNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjc4OGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNUmVmZXJlbmNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGNsYXNzIENNUmVmZXJlbmNlTm9kZSBleHRlbmRzIENNUmVwZWF0YWJsZU5vZGUgewotCXByaXZhdGUgaW50IHR5cGUgPSBDTU5vZGVUeXBlLkVMRU1FTlRfUkVGRVJFTkNFOwotCi0JcHVibGljIENNUmVmZXJlbmNlTm9kZShTdHJpbmcgcmVmTmFtZSkgewotCQl0aGlzKHJlZk5hbWUsIENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0UpOwotCX0KLQotCXB1YmxpYyBDTVJlZmVyZW5jZU5vZGUoU3RyaW5nIHJlZk5hbWUsIGludCB0eXBlKSB7Ci0JCXN1cGVyKHJlZk5hbWUpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICIgUmVmTmFtZTogIiArIGdldE5hbWUoKSArICIgVHlwZTogIiArIGdldFR5cGUoKSArICIgT2NjVHlwZTogIiArIGdldE9jY3VycmVuY2UoKSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlcGVhdGFibGVOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlcGVhdGFibGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NmQ5NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01SZXBlYXRhYmxlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENNUmVwZWF0YWJsZU5vZGUgZXh0ZW5kcyBDTU5vZGUgewotCXByaXZhdGUgaW50IG9jY1R5cGUgPSBDTU5vZGVUeXBlLk9ORTsKLQotCXB1YmxpYyBDTVJlcGVhdGFibGVOb2RlKFN0cmluZyByZWZOYW1lKSB7Ci0JCXN1cGVyKHJlZk5hbWUpOwotCX0KLQotCXB1YmxpYyBDTVJlcGVhdGFibGVOb2RlKFN0cmluZyByZWZOYW1lLCBpbnQgb2NjVHlwZSkgewotCQlzdXBlcihyZWZOYW1lKTsKLQkJdGhpcy5vY2NUeXBlID0gb2NjVHlwZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9jY3VycmVuY2UoKSB7Ci0JCXJldHVybiBvY2NUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9jY3VycmVuY2UoaW50IG9jY1R5cGUpIHsKLQkJdGhpcy5vY2NUeXBlID0gb2NjVHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNTA5YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBEVEQgewotCS8vCi0JLy8gQ29uc3RhbnRzCi0JLy8KLQotCVZlY3RvciBleHRlcm5hbEVsZW1lbnRzID0gbmV3IFZlY3RvcigpOwotCVN0cmluZyBuYW1lID0gbnVsbDsKLQotCWJvb2xlYW4gaXNFeGNlcHRpb25EdXJpbmdQYXJzZSA9IGZhbHNlOwotCi0JLy8KLQkvLyBDb25zdHJ1Y3RvcnMKLQkvLwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICovCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIGZpbGUgbmFtZSBvZiB0aGlzIERURC4KLQkgKiBAc2VlICNnZXROYW1lCi0JICogQHNlZSAjc2V0TmFtZQotCSAqLwotCXB1YmxpYyBEVEQoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgRFREJ3MgZmlsZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gVGhpcyBEVEQncyBmaWxlIG5hbWUsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiBubyBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoaXMgRFREJ3MgZmlsZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGlzIERURCdzIG5hbWUuCi0JICogQHNlZSAjZ2V0TmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIEVudW1lcmF0aW9uIGluc3RhbmNlIG9mIGFsbCBleHRlcm5hbCBzdWJzZXQgY2hpbGRyZW4gb2YgdGhpcwotCSAqIERURC4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGVudW1lcmF0aW9uIG9mIGFsbCBleHRlcm5hbCBzdWJzZXQgY2hpbGRyZW4gb2YgdGhpcyBEVEQuCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGV4dGVybmFsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBleHRlcm5hbEVsZW1lbnRzLmVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRGVjbChCYXNlTm9kZSBkZWNsKSB7Ci0JCWV4dGVybmFsRWxlbWVudHMuYWRkRWxlbWVudChkZWNsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc0V4Y2VwdGlvbkR1cmluZ1BhcnNlKGJvb2xlYW4gb24pIHsKLQkJaXNFeGNlcHRpb25EdXJpbmdQYXJzZSA9IG9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldElzRXhjZXB0aW9uRHVyaW5nUGFyc2UoKSB7Ci0JCXJldHVybiBpc0V4Y2VwdGlvbkR1cmluZ1BhcnNlOwotCX0KLQotfSAvLyBjbGFzcyBEVEQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YmI1NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5MYXp5VVJMSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRFRESGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotcHVibGljIGNsYXNzIERURFBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMgQ29udGVudEhhbmRsZXIsIERUREhhbmRsZXIsIEVycm9ySGFuZGxlciwgRGVjbEhhbmRsZXIsIExleGljYWxIYW5kbGVyIHsKLQlwcml2YXRlIFN0cmluZyBjb250ZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkvL3ByaXZhdGUgU3RyaW5nIGRlY2xTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQ2Fub25pY2FsIG91dHB1dC4gKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5vbmljYWw7Ci0KLQlwcm90ZWN0ZWQgWE1MUmVhZGVyIHJlYWRlcjsKLQlpbnQgZW50aXR5RGVwdGg7Ci0KLQkvLyBkbXcgMTEvMTUgcHJpdmF0ZSBmaWVsZCBuZXZlciByZWFkIGxvY2FsbHkKLQkvLyBwcml2YXRlIFZlY3RvciBkZWNsRWxlbWVudHM7Ci0JcHJpdmF0ZSBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBFcnJvck1lc3NhZ2UgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZXJyb3JNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIERlY2xOb2RlIHByZXZpb3VzRGVjbE5vZGUgPSBudWxsOwotCXByaXZhdGUgRGVjbE5vZGUgY3VycmVudERlY2xOb2RlID0gbnVsbDsKLQlwcml2YXRlIEJhc2VOb2RlIGxhc3RCYXNlTm9kZSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW50aXR5RW5kID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgbGluZU51bWJlcjsKLQotCXByaXZhdGUgRFREIGN1cnJlbnREVEQgPSBudWxsOwotCXByaXZhdGUgVmVjdG9yIGR0ZExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQlwcml2YXRlIFN0YWNrIGR0ZFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdGFjayBwZVJlZlN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdGFjayBwYXJzaW5nUEVSZWZTdGFjayA9IG5ldyBTdGFjaygpOwotCi0JcHJpdmF0ZSBFbnRpdHlQb29sIGVudGl0eVBvb2wgPSBuZXcgRW50aXR5UG9vbCgpOwotCXByaXZhdGUgU3RyaW5nIGV4cGFuZGVkRW50aXR5VmFsdWUgPSBudWxsOwotCXByaXZhdGUgSGFzaHRhYmxlIGVsZW1lbnRQb29sID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JYm9vbGVhbiBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSB0cnVlOwotCi0JcHJpdmF0ZSBMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotCi0JcHJpdmF0ZSBMb2NhdG9yIGdldExvY2F0b3IoKSB7Ci0JCXJldHVybiBsb2NhdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIHsKLQkJdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKLQl9Ci0KLQlwdWJsaWMgRFREUGFyc2VyKGJvb2xlYW4gY2Fub25pY2FsKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCXRoaXMobnVsbCwgY2Fub25pY2FsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRFREUGFyc2VyKFN0cmluZyBlbmNvZGluZywgYm9vbGVhbiBjYW5vbmljYWwpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQotCQlpZiAoZW5jb2RpbmcgPT0gbnVsbCkKLQkJCWVuY29kaW5nID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCi0JCXRoaXMuY2Fub25pY2FsID0gY2Fub25pY2FsOwotCQl0cnkgewotCQkJU0FYUGFyc2VyIHNwYXJzZXIgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCk7Ci0JCQlyZWFkZXIgPSBzcGFyc2VyLmdldFhNTFJlYWRlcigpOwotCQkJcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9kZWNsYXJhdGlvbi1oYW5kbGVyIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlYWRlci5zZXRDb250ZW50SGFuZGxlcih0aGlzKTsKLQkJCXJlYWRlci5zZXREVERIYW5kbGVyKHRoaXMpOwotCQkJcmVhZGVyLnNldEVycm9ySGFuZGxlcih0aGlzKTsKLQkJCXJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcih0aGlzKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCS8qIFByaW50cyB0aGUgb3V0cHV0IGZyb20gdGhlIFNBWCBjYWxsYmFja3MuICovCi0JcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIGxvZ2ljYWxVUkkpIHsKLQkJdHJ5IHsJCQkKLQkJCS8vIENTIGVuc3VyZSB0aGF0IHRoZSBwaHlzaWNhbCBVUkkgaXMgY29uc2lkZXJlZCB3aGVyZSBzdHJlYW1zIGFyZSByZXF1aXJlZAotCQkJLy8gYW5kIHRoZSBsb2dpY2FsVVJJIGlzIHVzZWQgYXMgdGhlIERURCdzIGJhc2VMb2NhdGlvbgotCQkJU3RyaW5nIHBoeXNpY2FsVVJJID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbigiIiwgIiIsIGxvZ2ljYWxVUkkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWJvb2xlYW4gaXNSZWFkYWJsZSA9IFVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKHBoeXNpY2FsVVJJLCB0cnVlKTsKLQkJCWlmICghaXNSZWFkYWJsZSkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkRURCBwYXJzZSBlcnJvci4gQ2FuIG5vdCByZWFkIHRoZSBzcGVjaWZpZWQgVVJJIDogIiArIGxvZ2ljYWxVUkkpOyAvLyROT04tTkxTLTEkCi0JCQl9CQkJCi0JCQlTdHJpbmcgZG9jdW1lbnQgPSAiPCFET0NUWVBFIHJvb3QgU1lTVEVNIFwiIiArIGxvZ2ljYWxVUkkgKyAiXCI+PHJvb3QvPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZW50aXR5RGVwdGggPSAwOwotCQkJY3VycmVudERURCA9IG5ldyBEVEQobG9naWNhbFVSSSk7Ci0JCQlJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKGRvY3VtZW50KSk7Ci0JCQlpbnB1dFNvdXJjZS5zZXRTeXN0ZW1JZChsb2dpY2FsVVJJICsgIi54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVhZGVyLnBhcnNlKGlucHV0U291cmNlKTsKLQkJfQotCQljYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gc2UpIHsKLQkJCWlmIChjdXJyZW50RFREICE9IG51bGwpCi0JCQkJY3VycmVudERURC5zZXRJc0V4Y2VwdGlvbkR1cmluZ1BhcnNlKHRydWUpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGN1cnJlbnREVEQgIT0gbnVsbCkKLQkJCQljdXJyZW50RFRELnNldElzRXhjZXB0aW9uRHVyaW5nUGFyc2UodHJ1ZSk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgRW50aXR5IHJlZmVyZW5jZXMgYXJlIGFsd2F5cyBleHBhbmRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKGJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCQl0aGlzLmV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSB0cnVlOwotCX0KLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgRW50aXR5IHJlZmVyZW5jZXMgYXJlIGFsd2F5cyBleHBhbmRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gZXhwYW5kRW50aXR5UmVmZXJlbmNlczsKLQl9Ci0KLQlwdWJsaWMgVmVjdG9yIGdldERURExpc3QoKSB7Ci0JCXJldHVybiBkdGRMaXN0OwotCX0KLQotCXB1YmxpYyBIYXNodGFibGUgZ2V0RWxlbWVudFBvb2woKSB7Ci0JCXJldHVybiBlbGVtZW50UG9vbDsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5UG9vbCBnZXRFbnRpdHlQb29sKCkgewotCQlyZXR1cm4gZW50aXR5UG9vbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRFcnJvck1lc3NhZ2VzKCkgewotCQlyZXR1cm4gZXJyb3JNZXNzYWdlczsKLQl9Ci0KLQkvLwotCS8vIERvY3VtZW50SGFuZGxlciBtZXRob2RzCi0JLy8KLQotCXB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB7Ci0JfQotCi0JLy8KLQkvLyBEVERIYW5kbGVyIG1ldGhvZHMKLQkvLwotCi0JcHVibGljIHZvaWQgdW5wYXJzZWRFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIG5vdGF0aW9uTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90YXRpb25EZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuTk9UQVRJT04pOwotCQkvL2RlY2xTdHJpbmcgPSAiPCFOT1RBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGVudGl0eURlcHRoID09IDEgfHwgcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UpIHsKLQkJCVN0cmluZyB4cyA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJeHMgKz0gbmFtZTsKLQkJCWlmIChwdWJsaWNJZCA9PSBudWxsKQotCQkJCXhzICs9ICIgU1lTVEVNICIgKyAiXCIiICsgc3lzdGVtSWQgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJZWxzZQotCQkJCXhzICs9ICIgUFVCTElDICIgKyAiXCIiICsgcHVibGljSWQgKyAiXCIgIiArICJcIiIgKyBzeXN0ZW1JZCArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJY29udGVudFN0cmluZyArPSB4czsKLQkJCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIERlY2xIYW5kbGVyIG1ldGhvZHMKLQkvLwotCi0JcHVibGljIHZvaWQgZWxlbWVudERlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBtb2RlbCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuRUxFTUVOVCk7Ci0JCS8vZGVjbFN0cmluZyA9ICI8IUVMRU1FTlQiOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gS0I6IFdpdGggZWFybHkgdmVyc2lvbnMgb2YgWGVyY2VzIDIueCwgc3RhcnRFbnRpdHkoIltkdGRdIikgdXNlZCB0bwotCQkvLyBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kCi0JCS8vIHNvIGVudGl0eURlcHRoIHdhcyAxLiBVc2luZyBKQVhQIGNoYW5nZWQgdGhhdCBhbmQgc3RhcnRFbnRpdHkoKSBpcwotCQkvLyBub3QgY2FsbGVkIGJhY2sgYW55bW9yZS4KLQkJLy8gQmVjYXVzZSBvZiB0aGlzLCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBlbnRpdHlEZXB0aCA9PSAwCi0JCS8vIGFzIHdlbGwuCi0JCWlmIChlbnRpdHlEZXB0aCA9PSAwIHx8IGVudGl0eURlcHRoID09IDEgfHwgcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UpCi0JCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbkhlbHBlcihuYW1lICsgIiAiICsgbW9kZWwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgYXR0cmlidXRlRGVjbChTdHJpbmcgZU5hbWUsIFN0cmluZyBhTmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZURlZmF1bHQsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuQVRUTElTVCk7Ci0JCS8vZGVjbFN0cmluZyA9ICI8IUFUVExJU1QiOyAvLyROT04tTkxTLTEkCi0KLQkJYXR0cmlidXRlU3RyaW5nICs9ICIgIiArIGFOYW1lOyAvLyROT04tTkxTLTEkCi0JCWlmICh0eXBlICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVTdHJpbmcgKz0gIiAiICsgdHlwZTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodmFsdWVEZWZhdWx0ICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVTdHJpbmcgKz0gIiAiICsgdmFsdWVEZWZhdWx0OyAvLyROT04tTkxTLTEkCi0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJYXR0cmlidXRlU3RyaW5nICs9ICIgJyIgKyB2YWx1ZSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJYXR0cmlidXRlU3RyaW5nID0gZU5hbWUgKyAiICIgKyBhdHRyaWJ1dGVTdHJpbmcgKyAiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbkhlbHBlcihhdHRyaWJ1dGVTdHJpbmcpOwotCQlhdHRyaWJ1dGVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGludGVybmFsRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5JTlRFUk5BTF9FTlRJVFkpOwotCQkvL2RlY2xTdHJpbmcgPSAiPCFFTlRJVFkiOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGVudGl0eURlcHRoID09IDEgfHwgcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UpIHsKLQkJCS8vIGJ1aWxkIHVwIGEgc3RyaW5nOiBlLmcuICIgJSBTVFJET00gIigjUENEQVRBKSI+IgotCQkJU3RyaW5nIHhzID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobmFtZS5zdGFydHNXaXRoKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXhzICs9ICIlICI7IC8vJE5PTi1OTFMtMSQKLQkJCQl4cyArPSBuYW1lLnN1YnN0cmluZygxKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQl4cyArPSBuYW1lOwotCi0JCQl4cyArPSAiIFwiIiArIHZhbHVlICsgIlwiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQljb250ZW50U3RyaW5nICs9IHhzOwotCQkJLy8gc2F2ZSBleHBhbmRlZCBlbnRpdHkgdmFsdWUKLQkJCWV4cGFuZGVkRW50aXR5VmFsdWUgPSB2YWx1ZTsKLQkJCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uKCk7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGV4dGVybmFsRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlzdGFydERlY2xhcmF0aW9uKERlY2xOb2RlLkVYVEVSTkFMX0VOVElUWSk7Ci0JCS8vZGVjbFN0cmluZyA9ICI8IUVOVElUWSI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJLy8gYnVpbGQgdXAgYSBzdHJpbmc6Ci0JCQkvLyBleDEpICIgJSBGSUVMRCBTWVNURU0gIm9hZ2lzX2ZpZWxkcy5kdGQiPiIKLQkJCS8vIGV4MikgIiAlIEZJRUxEIFBVQkxJQyAiRk9PIj4iCi0JCQlTdHJpbmcgeHMgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJeHMgKz0gIiUgIjsgLy8kTk9OLU5MUy0xJAotCQkJCXhzICs9IG5hbWUuc3Vic3RyaW5nKDEpOwotCQkJfQotCQkJZWxzZQotCQkJCXhzICs9IG5hbWU7Ci0KLQkJCWlmIChzeXN0ZW1JZCAhPSBudWxsKQotCQkJCXhzICs9ICIgU1lTVEVNIFwiIiArIHN5c3RlbUlkICsgIlwiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZWxzZSBpZiAocHVibGljSWQgIT0gbnVsbCkKLQkJCQl4cyArPSAiIFBVQkxJQyBcIiIgKyBwdWJsaWNJZCArICJcIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJY29udGVudFN0cmluZyArPSB4czsKLQkJCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIExleGljYWxIYW5kbGVyIG1ldGhvZHMKLQkvLwotCi0JcHVibGljIHZvaWQgc3RhcnRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCX0KLQotCXB1YmxpYyB2b2lkIGVuZENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJZHRkTGlzdC5yZW1vdmVBbGxFbGVtZW50cygpOwotCQlkdGRMaXN0LmFkZEVsZW1lbnQoY3VycmVudERURCk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IHRoZSBlbmQgb2YgRFREIGRlY2xhcmF0aW9ucy4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotCSAqIEBzZWUgI3N0YXJ0RFRECi0JICovCi0JcHVibGljIHZvaWQgZW5kRFREKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuRU5EX0RURCk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IHRoZSBiZWdpbm5pbmcgb2YgYW4gZW50aXR5LgotCSAqIAotCSAqIFRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBkb2N1bWVudCBlbnRpdHkgYXJlIG5vdCByZXBvcnRlZC4gVGhlIHN0YXJ0Ci0JICogYW5kIGVuZCBvZiB0aGUgZXh0ZXJuYWwgRFREIHN1YnNldCBhcmUgcmVwb3J0ZWQgdXNpbmcgdGhlIHBzZXVkby1uYW1lCi0JICogIltkdGRdIi4gQWxsIG90aGVyIGV2ZW50cyBtdXN0IGJlIHByb3Blcmx5IG5lc3RlZCB3aXRoaW4gc3RhcnQvZW5kCi0JICogZW50aXR5IGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGVudGl0eS4gSWYgaXQgaXMgYSBwYXJhbWV0ZXIgZW50aXR5LCB0aGUKLQkgKiAgICAgICAgICAgIG5hbWUgd2lsbCBiZWdpbiB3aXRoICclJy4KLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotCSAqIEBzZWUgI2VuZEVudGl0eQotCSAqLwotCi0JcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAobmFtZS5lcXVhbHMoIltkdGRdIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5TVEFSVF9FTlRJVFlfRFREKTsKLQkJfQotCQllbHNlIGlmIChjdXJyZW50RGVjbE5vZGUgPT0gbnVsbCkgewotCQkJLy8gUEUgcmVmZXJlbmNlIGluIG1hcmt1cGRlY2wgc2VjdGlvbgotCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcGVOYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQkJRW50aXR5RGVjbCBlbiA9IGVudGl0eVBvb2wucmVmZXJQYXJhKHBlTmFtZSk7Ci0KLQkJCQlwZVJlZlN0YWNrLnB1c2gobmFtZSk7Ci0JCQkJcGFyc2luZ1BFUmVmU3RhY2sucHVzaChuZXcgQm9vbGVhbihwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkpOwotCi0JCQkJU3RyaW5nIHN5c3RlbUlkID0gZW4uZ2V0U3lzdGVtSWQoKTsKLQkJCQlTdHJpbmcgcHVibGljSWQgPSBlbi5nZXRQdWJsaWNJZCgpOwotCQkJCWlmIChzeXN0ZW1JZCA9PSBudWxsKSB7Ci0JCQkJCXBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlVUklSZXNvbHZlciBpZFJlc29sdmVyID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKTsKLQkJCQkJU3RyaW5nIHVyaSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShjdXJyZW50RFRELmdldE5hbWUoKSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCQkJaWYgKCFpc0RURExvYWRlZCh1cmkpKSB7Ci0JCQkJCQkvLyBub3QgbG9hZGVkCi0JCQkJCQkvLyBvdXQucHJpbnRsbigiIERURCBub3QgbG9hZGVkIC4uIGNyZWF0ZSBuZXcgRFREOiAiCi0JCQkJCQkvLyApOwotCQkJCQkJZHRkU3RhY2sucHVzaChjdXJyZW50RFREKTsKLQkJCQkJCURURCBuZXdEVEQgPSBuZXcgRFREKHVyaSk7Ci0JCQkJCQlkdGRMaXN0LmFkZEVsZW1lbnQobmV3RFREKTsKLQkJCQkJCWN1cnJlbnREVEQgPSBuZXdEVEQ7Ci0JCQkJCQlwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBvdXQucHJpbnRsbigiIERURCBhbHJlYWR5IGxvYWRlZCAuLiAiICk7Ci0JCQkJCQlwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVudGl0eURlcHRoID09IDEgfHwgcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UpIHsKLQkJCVN0cmluZyB4cyA9IChTdHJpbmcpIHJlYWRlci5nZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMveG1sLXN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0JCQljb250ZW50U3RyaW5nICs9IHhzOwotCQl9Ci0JCWVudGl0eURlcHRoKys7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IHRoZSBlbmQgb2YgYW4gZW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgZW5kaW5nLgotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCi0JICogQHNlZSAjc3RhcnRFbnRpdHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAobmFtZS5lcXVhbHMoIltkdGRdIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5FTkRfRU5USVRZX0RURCk7Ci0JCX0KLQkJZWxzZSBpZiAoIXBlUmVmU3RhY2suZW1wdHkoKSkgewotCQkJcGFyc2VFeHRlcm5hbFBFUmVmZXJlbmNlKG5hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKGVudGl0eURlcHRoID09IDEgfHwgcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UpIHsKLQkJCWlmICghY29udGVudFN0cmluZy5lbmRzV2l0aChuYW1lICsgIjsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHhzID0gKFN0cmluZykgcmVhZGVyLmdldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy94bWwtc3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250ZW50U3RyaW5nICs9IHhzOwotCQkJfQotCQl9Ci0JCWVudGl0eURlcHRoLS07Ci0JCWVudGl0eUVuZCA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VFeHRlcm5hbFBFUmVmZXJlbmNlKFN0cmluZyBuYW1lKSB7Ci0JCWlmICghcGVSZWZTdGFjay5lbXB0eSgpKSB7Ci0JCQlpZiAoKChTdHJpbmcpIHBlUmVmU3RhY2sucGVlaygpKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlwZVJlZlN0YWNrLnBvcCgpOwotCQkJCWlmIChwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJCQljdXJyZW50RFREID0gKERURCkgZHRkU3RhY2sucG9wKCk7Ci0JCQkJCWFkZFBFUmVmZXJlbmNlTm9kZShuYW1lKTsKLQkJCQl9Ci0JCQkJcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UgPSAoKEJvb2xlYW4pIHBhcnNpbmdQRVJlZlN0YWNrLnBvcCgpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGFuIFhNTCBjb21tZW50IGFueXdoZXJlIGluIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgdXNlZCBmb3IgY29tbWVudHMgaW5zaWRlIG9yIG91dHNpZGUgdGhlIGRvY3VtZW50Ci0JICogZWxlbWVudCwgaW5jbHVkaW5nIGNvbW1lbnRzIGluIHRoZSBleHRlcm5hbCBEVEQgc3Vic2V0IChpZiByZWFkKS4KLQkgKiAKLQkgKiBAcGFyYW0gY2gKLQkgKiAgICAgICAgICAgIEFuIGFycmF5IGhvbGRpbmcgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIGNvbW1lbnQuCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICBUaGUgc3RhcnRpbmcgcG9zaXRpb24gaW4gdGhlIGFycmF5LgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UgZnJvbSB0aGUgYXJyYXkuCi0JICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21tZW50KGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5DT01NRU5UKTsKLQotCQlpZiAoY29tbWVudCA9PSBudWxsKQotCQkJY29tbWVudCA9IG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOwotCQllbHNlCi0JCQljb21tZW50ICs9ICJcbiIgKyBuZXcgU3RyaW5nKGNoLCBzdGFydCwgbGVuZ3RoKTsgLy8gYXBwZW5kIGFsbCBjb21tZW50cy4gLy8kTk9OLU5MUy0xJAotCQkvLyBUaGUgY29tbWVudCB3aWxsIGdldCByZXNldCBhZnRlcgotCQkvLyBpdCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgZm9sbG93aW5nCi0JCS8vIGRlY2xhcmF0aW9uLgotCX0KLQotCS8vCi0JLy8gRXJyb3JIYW5kbGVyIG1ldGhvZHMKLQkvLwotCi0JLyogV2FybmluZy4gKi8KLQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0JCS8qU3RyaW5nIGVycm9yID0gIltTb3VyY2UgTGluZV0gIiArIGRlY2xTdHJpbmcgKyBjb250ZW50U3RyaW5nICsgIlxuIjsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWVycm9yICs9ICJbV2FybmluZyAgICBdICIgKyBnZXRMb2NhdGlvblN0cmluZyhleCkgKyAiOiAiICsgZXguZ2V0TWVzc2FnZSgpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQqLwotCQlzZXRFcnJvckluZm9ybWF0aW9uKGV4LCAid2FybmluZyIpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKTsKLQl9Ci0KLQkvKiBFcnJvci4gKi8KLQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgewotCQkvKlN0cmluZyBlcnJvciA9ICJbU291cmNlIExpbmVdICIgKyBkZWNsU3RyaW5nICsgY29udGVudFN0cmluZyArICJcbiI7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQllcnJvciArPSAiW0Vycm9yICAgXSAiICsgZ2V0TG9jYXRpb25TdHJpbmcoZXgpICsgIjogIiArIGV4LmdldE1lc3NhZ2UoKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkKi8KLQkJc2V0RXJyb3JJbmZvcm1hdGlvbihleCwgImVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQotCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qIEZhdGFsIGVycm9yLiAqLwotCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkvKlN0cmluZyBlcnJvciA9ICJbU291cmNlIExpbmVdICIgKyBkZWNsU3RyaW5nICsgY29udGVudFN0cmluZyArICJcbiI7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQllcnJvciArPSAiW0ZhdGFsIEVycm9yXSAiICsgZ2V0TG9jYXRpb25TdHJpbmcoZXgpICsgIjogIiArIGV4LmdldE1lc3NhZ2UoKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkKi8KLQkJc2V0RXJyb3JJbmZvcm1hdGlvbihleCwgImZhdGFsIik7IC8vJE5PTi1OTFMtMSQKLQotCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qIFJldHVybnMgYSBzdHJpbmcgb2YgdGhlIGxvY2F0aW9uLiAqLwotCS8qcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25TdHJpbmcoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKLQkJU3RyaW5nQnVmZmVyIHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlTdHJpbmcgc3lzdGVtSWQgPSBleC5nZXRTeXN0ZW1JZCgpOwotCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gc3lzdGVtSWQubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChpbmRleCAhPSAtMSkKLQkJCQlzeXN0ZW1JZCA9IHN5c3RlbUlkLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJc3RyLmFwcGVuZChzeXN0ZW1JZCk7Ci0JCX0KLQkJc3RyLmFwcGVuZCgnOicpOwotCQlzdHIuYXBwZW5kKGV4LmdldExpbmVOdW1iZXIoKSk7Ci0JCXN0ci5hcHBlbmQoJzonKTsKLQkJc3RyLmFwcGVuZChleC5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0KLQkJcmV0dXJuIHN0ci50b1N0cmluZygpOwotCi0JfSovCi0KLQlwcml2YXRlIHZvaWQgc3RhcnREZWNsYXJhdGlvbihpbnQgdHlwZSkgewotCQlpZiAodHlwZSA9PSBEZWNsTm9kZS5FTkRfRFREIHx8IHR5cGUgPT0gRGVjbE5vZGUuRU5EX0VOVElUWV9EVEQgfHwgdHlwZSA9PSBEZWNsTm9kZS5DT01NRU5UIHx8IHR5cGUgPT0gRGVjbE5vZGUuRVJST1IpIHsKLQkJCXByZXZpb3VzRGVjbE5vZGUgPSBjdXJyZW50RGVjbE5vZGU7Ci0JCQljdXJyZW50RGVjbE5vZGUgPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJY3VycmVudERlY2xOb2RlID0gbmV3IERlY2xOb2RlKHR5cGUpOwotCQkJY29udGVudFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkvL2RlY2xTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZXhwYW5kZWRFbnRpdHlWYWx1ZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKSB7Ci0JCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uSGVscGVyKGNvbnRlbnRTdHJpbmcpOwotCQljb250ZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VDdXJyZW50RGVjbGFyYXRpb25IZWxwZXIoU3RyaW5nIGRlY2xhcmF0aW9uU3RyaW5nKSB7Ci0JCURURFNjYW5uZXIgc2Nhbm5lcjsKLQkJU3RyaW5nIG5hbWU7Ci0KLQkJaWYgKGN1cnJlbnREZWNsTm9kZSA9PSBudWxsICYmIHByZXZpb3VzRGVjbE5vZGUgIT0gbnVsbCAmJiBlbnRpdHlFbmQpIHsKLQkJCWN1cnJlbnREZWNsTm9kZSA9IHByZXZpb3VzRGVjbE5vZGU7Ci0JCX0KLQotCQkvLyBzYXZlIHRoZSBwcmV2aW91cyBkZWNsTm9kZQotCQlpZiAoY3VycmVudERlY2xOb2RlICE9IG51bGwpIHsKLQkJCUJhc2VOb2RlIGJhc2VOb2RlID0gbnVsbDsKLQkJCS8vIHN0cmlwIG91dCB0aGUgZW5kaW5nIG1hcmt1cCBzeW1ib2wgIj4iCi0JCQlpZiAoZGVjbGFyYXRpb25TdHJpbmcuZW5kc1dpdGgoIj4iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWRlY2xhcmF0aW9uU3RyaW5nID0gZGVjbGFyYXRpb25TdHJpbmcuc3Vic3RyaW5nKDAsIGRlY2xhcmF0aW9uU3RyaW5nLmxlbmd0aCgpIC0gMSk7Ci0KLQkJCWludCBzSW5kZXg7Ci0JCQlTdHJpbmcgY1N0cmluZzsKLQkJCWludCB0eXBlID0gY3VycmVudERlY2xOb2RlLmdldFR5cGUoKTsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgRGVjbE5vZGUuRUxFTUVOVCA6IHsKLQkJCQkJbmFtZSA9IFRTdHJpbmcud29yZChkZWNsYXJhdGlvblN0cmluZywgMSk7Ci0KLQkJCQkJLy8gc3RyaXAgb3V0IHRoZSBuYW1lCi0JCQkJCXNJbmRleCA9IGRlY2xhcmF0aW9uU3RyaW5nLmluZGV4T2YobmFtZSkgKyBuYW1lLmxlbmd0aCgpOwotCQkJCQljU3RyaW5nID0gZGVjbGFyYXRpb25TdHJpbmcuc3Vic3RyaW5nKHNJbmRleCk7Ci0KLQkJCQkJYmFzZU5vZGUgPSBuZXcgRWxlbWVudERlY2wobmFtZSwgY3VycmVudERURC5nZXROYW1lKCkpOwotCQkJCQlzY2FubmVyID0gbmV3IERURFNjYW5uZXIoY3VycmVudERURC5nZXROYW1lKCksIGNTdHJpbmcpOwotCQkJCQlDTU5vZGUgY29udGVudE1vZGVsID0gc2Nhbm5lci5zY2FuQ29udGVudE1vZGVsKCk7Ci0JCQkJCWlmIChjb250ZW50TW9kZWwgPT0gbnVsbCAmJiBlcnJvck1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCQkJY3JlYXRlRXJyb3JNZXNzYWdlKCJFeHBlY3RpbmcgJygnIGluIGNvbnRlbnQgbW9kZWwiLCAiZXJyb3IiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQotCQkJCQkoKEVsZW1lbnREZWNsKSBiYXNlTm9kZSkuc2V0Q29udGVudE1vZGVsTm9kZShjb250ZW50TW9kZWwpOwotCQkJCQllbGVtZW50UG9vbC5wdXQobmFtZSwgYmFzZU5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBEZWNsTm9kZS5JTlRFUk5BTF9FTlRJVFkgOgotCQkJCWNhc2UgRGVjbE5vZGUuRVhURVJOQUxfRU5USVRZIDogewotCQkJCQlpZiAoIXBhcnNlRXh0ZXJuYWxQRVJlZmVyZW5jZShkZWNsYXJhdGlvblN0cmluZykpIHsKLQkJCQkJCXNjYW5uZXIgPSBuZXcgRFREU2Nhbm5lcihjdXJyZW50RFRELmdldE5hbWUoKSwgZGVjbGFyYXRpb25TdHJpbmcpOwotCQkJCQkJYmFzZU5vZGUgPSBzY2FubmVyLnNjYW5FbnRpdHlEZWNsKCk7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS1iYXNlTm9kZSAoIiArCi0JCQkJCQkvLyBkZWNsYXJhdGlvblN0cmluZyArICIpIiArIGJhc2VOb2RlKTsKLQkJCQkJCWlmICh0eXBlID09IERlY2xOb2RlLklOVEVSTkFMX0VOVElUWSAmJiBleHBhbmRlZEVudGl0eVZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQkoKEVudGl0eURlY2wpIGJhc2VOb2RlKS5leHBhbmRlZFZhbHVlID0gZXhwYW5kZWRFbnRpdHlWYWx1ZTsKLQkJCQkJCX0KLQkJCQkJCWlmIChiYXNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJZW50aXR5UG9vbC5hZGQoKEVudGl0eURlY2wpIGJhc2VOb2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIERlY2xOb2RlLk5PVEFUSU9OIDogewotCQkJCQlzY2FubmVyID0gbmV3IERURFNjYW5uZXIoY3VycmVudERURC5nZXROYW1lKCksIGRlY2xhcmF0aW9uU3RyaW5nKTsKLQkJCQkJYmFzZU5vZGUgPSBzY2FubmVyLnNjYW5Ob3RhdGlvbkRlY2woKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgRGVjbE5vZGUuQVRUTElTVCA6IHsKLQkJCQkJbmFtZSA9IFRTdHJpbmcud29yZChkZWNsYXJhdGlvblN0cmluZywgMSk7Ci0KLQkJCQkJLy8gc3RyaXAgb3V0IHRoZSBuYW1lCi0JCQkJCXNJbmRleCA9IGRlY2xhcmF0aW9uU3RyaW5nLmluZGV4T2YobmFtZSkgKyBuYW1lLmxlbmd0aCgpOwotCQkJCQljU3RyaW5nID0gZGVjbGFyYXRpb25TdHJpbmcuc3Vic3RyaW5nKHNJbmRleCk7Ci0KLQkJCQkJYmFzZU5vZGUgPSBuZXcgQXR0bGlzdChuYW1lLCBjdXJyZW50RFRELmdldE5hbWUoKSk7Ci0JCQkJCXNjYW5uZXIgPSBuZXcgRFREU2Nhbm5lcihjdXJyZW50RFRELmdldE5hbWUoKSwgY1N0cmluZy50cmltKCkpOwotCQkJCQlWZWN0b3IgYXR0cnMgPSBzY2FubmVyLnNjYW5BdHRsaXN0RGVjbChlbnRpdHlQb29sKTsKLQkJCQkJU3RyaW5nIGVycm9yU3RyaW5nID0gc2Nhbm5lci5nZXRFcnJvclN0cmluZygpOwotCi0JCQkJCWlmIChhdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkoKEF0dGxpc3QpIGJhc2VOb2RlKS5zZXRBdHREZWZzKGF0dHJzKTsKLQkJCQkJfQotCQkJCQlpZiAoZXJyb3JTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJY3JlYXRlRXJyb3JNZXNzYWdlKGVycm9yU3RyaW5nLCAiZXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkZWZhdWx0IDogewotCQkJCQljdXJyZW50RGVjbE5vZGUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGJhc2VOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsKSB7Ci0JCQkJCWJhc2VOb2RlLnNldENvbW1lbnQoY29tbWVudCk7Ci0JCQkJCWNvbW1lbnQgPSBudWxsOwotCQkJCX0KLQotCQkJCWlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQliYXNlTm9kZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAoY3VycmVudERlY2xOb2RlICE9IG51bGwpIHsKLQkJCQkJY3VycmVudERURC5hZGREZWNsKGJhc2VOb2RlKTsKLQkJCQl9Ci0JCQkJbGFzdEJhc2VOb2RlID0gYmFzZU5vZGU7Ci0JCQl9Ci0KLQkJCWN1cnJlbnREZWNsTm9kZSA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobGFzdEJhc2VOb2RlICE9IG51bGwgJiYgZXJyb3JNZXNzYWdlICE9IG51bGwgJiYgbGFzdEJhc2VOb2RlLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpIHsKLQkJCQlsYXN0QmFzZU5vZGUuc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQRVJlZmVyZW5jZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsgLy8gc3RyaXAgb3V0IHRoZSAlIGZyb20gZW50aXR5IG5hbWUKLQkJfQotCQlFbnRpdHlEZWNsIGUgPSBuZXcgRW50aXR5RGVjbChuYW1lLCBjdXJyZW50RFRELmdldE5hbWUoKSwgbnVsbCwgdHJ1ZSk7Ci0JCWUuc2V0RW50aXR5UmVmZXJlbmNlZCh0cnVlKTsKLQkJZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJY3VycmVudERURC5hZGREZWNsKGUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RURExvYWRlZChTdHJpbmcgdXJpKSB7Ci0JCWJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0JCS8vU3RyaW5nIGxpc3QgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZHRkTGlzdCAhPSBudWxsKSB7Ci0JCQlFbnVtZXJhdGlvbiBlbiA9IGR0ZExpc3QuZWxlbWVudHMoKTsKLQkJCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCURURCBkdGQgPSAoRFREKSBlbi5uZXh0RWxlbWVudCgpOwotCQkJCS8vbGlzdCArPSBkdGQuZ2V0TmFtZSgpOwotCQkJCS8vbGlzdCArPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZHRkLmdldE5hbWUoKS5lcXVhbHModXJpKSkgewotCQkJCQlsb2FkZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvYWRlZDsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCUlucHV0U291cmNlIHJlc3VsdCA9IG51bGw7Ci0JCVVSSVJlc29sdmVyIGlkUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotCQlTdHJpbmcgbG9naWNhbFVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShjdXJyZW50RFRELmdldE5hbWUoKSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgICAgLy8gYnVnIDExMzUzNywgZW5zdXJlIHBoeXNpY2FsIHJlc29sdXRpb24gZ2V0cyBkb25lIGhlcmUKLQkJLy8gcmlnaHQgYmVmb3JlIHdlIGF0dGVtcHQgdG8gb3BlbiBhIHN0cmVhbQotCQlTdHJpbmcgcGh5c2ljYWxVUkkgPSBpZFJlc29sdmVyLnJlc29sdmVQaHlzaWNhbExvY2F0aW9uKGN1cnJlbnREVEQuZ2V0TmFtZSgpLCBwdWJsaWNJZCwgbG9naWNhbFVSSSk7Ci0JCXJlc3VsdCA9IG5ldyBJbnB1dFNvdXJjZShsb2dpY2FsVVJJKTsKLQkJaWYoIShwaHlzaWNhbFVSSSA9PSBudWxsIHx8IHBoeXNpY2FsVVJJLmVxdWFscygiIikgfHwgVVJJSGVscGVyLmhhc1Byb3RvY29sKHBoeXNpY2FsVVJJKSkpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkgIHBoeXNpY2FsVVJJID0gImZpbGU6Ly8vIiArIHBoeXNpY2FsVVJJOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmVzdWx0LnNldEJ5dGVTdHJlYW0obmV3IExhenlVUkxJbnB1dFN0cmVhbShwaHlzaWNhbFVSSSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vCi0JLy8gTWFpbgotCS8vCi0KLQkvKiogTWFpbiBwcm9ncmFtIGVudHJ5IHBvaW50LiAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLQotCQkvLyBpcyB0aGVyZSBhbnl0aGluZyB0byBkbz8KLQkJaWYgKGFyZ3YubGVuZ3RoID09IDApIHsKLQkJCXByaW50VXNhZ2UoKTsKLQkJCVN5c3RlbS5leGl0KDEpOwotCQl9Ci0KLQkJLy8gdmFycwotCQlib29sZWFuIGNhbm9uaWNhbCA9IGZhbHNlOwotCQlib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSBmYWxzZTsKLQkJRFREUGFyc2VyIHBhcnNlcjsKLQotCQkvLyBjaGVjayBwYXJhbWV0ZXJzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3ZbaV07Ci0KLQkJCS8vIG9wdGlvbnMKLQkJCWlmIChhcmcuc3RhcnRzV2l0aCgiLSIpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWlmIChhcmcuZXF1YWxzKCItYyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY2Fub25pY2FsID0gdHJ1ZTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGFyZy5lcXVhbHMoIi14IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlleHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gdHJ1ZTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGFyZy5lcXVhbHMoIi1oIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmludFVzYWdlKCk7Ci0JCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJCX0KLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcGFyc2VyID0gbmV3IERURFBhcnNlcihjYW5vbmljYWwpOwotCQkJCXBhcnNlci5zZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOwotCQkJCXBhcnNlci5wYXJzZShhcmcpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JfSAvLyBtYWluKFN0cmluZ1tdKQotCi0JLyoqIFByaW50cyB0aGUgdXNhZ2UuICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgewotCi0JCVN5c3RlbS5lcnIucHJpbnRsbigidXNhZ2U6IGphdmEgc2F4LkRURFBhcnNlciAob3B0aW9ucykgdXJpIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5lcnIucHJpbnRsbigpOwotCQlTeXN0ZW0uZXJyLnByaW50bG4oIm9wdGlvbnM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLmVyci5wcmludGxuKCIgIC1jICAgICAgIENhbm9uaWNhbCBYTUwgb3V0cHV0LiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5lcnIucHJpbnRsbigiICAteCAgICAgICBFeHBhbmQgZW50aXR5IHJlZmVyZW5jZXMuIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLmVyci5wcmludGxuKCIgIC1oICAgICAgIFRoaXMgaGVscCBzY3JlZW4uIik7IC8vJE5PTi1OTFMtMSQKLQotCX0gLy8gcHJpbnRVc2FnZSgpCi0KLQlwcml2YXRlIHZvaWQgc2V0RXJyb3JJbmZvcm1hdGlvbihTQVhQYXJzZUV4Y2VwdGlvbiBleCwgU3RyaW5nIHNldmVyaXR5KSB7Ci0JCWVycm9yTWVzc2FnZSA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQotCQlpZiAoZXguZ2V0TGluZU51bWJlcigpID09IC0xKSB7Ci0JCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JMaW5lKGxpbmVOdW1iZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJZXJyb3JNZXNzYWdlLnNldEVycm9yTGluZShleC5nZXRMaW5lTnVtYmVyKCkpOwotCQl9Ci0KLQotCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JNZXNzYWdlKGV4LmdldE1lc3NhZ2UoKSk7Ci0JCWVycm9yTWVzc2FnZS5zZXRFcnJvckNvbHVtbihleC5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0JCWVycm9yTWVzc2FnZS5zZXRTZXZlcml0eShzZXZlcml0eSk7Ci0JCWVycm9yTWVzc2FnZXMuYWRkKGVycm9yTWVzc2FnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHNldmVyaXR5KSB7Ci0JCWVycm9yTWVzc2FnZSA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQotCQlMb2NhdG9yIGxvY2F0b3IgPSBnZXRMb2NhdG9yKCk7Ci0KLQkJZXJyb3JNZXNzYWdlLnNldEVycm9yTGluZShsb2NhdG9yLmdldExpbmVOdW1iZXIoKSk7Ci0JCWVycm9yTWVzc2FnZS5zZXRFcnJvckNvbHVtbihsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKLQotCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCQllcnJvck1lc3NhZ2Uuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotCi0JCWVycm9yTWVzc2FnZXMuYWRkKGVycm9yTWVzc2FnZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVERTYXhBcnRpZmFjdFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNheEFydGlmYWN0VmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjkwNjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNheEFydGlmYWN0VmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBEVERTYXhBcnRpZmFjdFZpc2l0b3IgewotCXB1YmxpYyB2b2lkIHZpc2l0RFREKERURCBkdGQpIHsKLQkJRW51bWVyYXRpb24gZW4gPSBkdGQuZXh0ZXJuYWxFbGVtZW50cygpOwotCi0JCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IGUgPSBlbi5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBFbnRpdHlEZWNsKSB7Ci0JCQkJdmlzaXRFbnRpdHlEZWNsKChFbnRpdHlEZWNsKSBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBFbGVtZW50RGVjbCkgewotCQkJCXZpc2l0RWxlbWVudERlY2woKEVsZW1lbnREZWNsKSBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBOb3RhdGlvbkRlY2wpIHsKLQkJCQl2aXNpdE5vdGF0aW9uRGVjbCgoTm90YXRpb25EZWNsKSBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Tm90YXRpb25EZWNsKE5vdGF0aW9uRGVjbCBub3RhdGlvbikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2woRWxlbWVudERlY2wgZWxlbWVudCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RW50aXR5RGVjbChFbnRpdHlEZWNsIGVudGl0eSkgewotCQlpZiAoZW50aXR5LmlzRW50aXR5UmVmZXJlbmNlZCgpKSB7Ci0JCQl2aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woZW50aXR5KTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChlbnRpdHkuaXNFeHRlcm5hbCgpKSB7Ci0JCQkJdmlzaXRFeHRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZpc2l0SW50ZXJuYWxFbnRpdHlEZWNsKGVudGl0eSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEV4dGVybmFsRW50aXR5RGVjbChFbnRpdHlEZWNsIGVudGl0eSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0SW50ZXJuYWxFbnRpdHlEZWNsKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjVjZWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogU2Nhbm5pbmcgLyBwYXJzaW5nIHRoZSBjb250ZW50IHN0cmluZyBmcm9tIHRoZSBEZWNsIHN0YXRlbWVudAotICogCi0gKiBAdmVyc2lvbgotICovCi1wdWJsaWMgY2xhc3MgRFREU2Nhbm5lciB7Ci0JLy8gZWxlbWVudCBjb250ZW50IG1vZGVsIHN0cmluZ3MKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gZW1wdHlfc3RyaW5nID0geydFJywgJ00nLCAnUCcsICdUJywgJ1knfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gYW55X3N0cmluZyA9IHsnQScsICdOJywgJ1knfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gcGNkYXRhX3N0cmluZyA9IHsnIycsICdQJywgJ0MnLCAnRCcsICdBJywgJ1QnLCAnQSd9OwotCi0JLy8gYXR0cmlidXRlIHR5cGUgYW5kIGRlZmF1bHQgdHlwZSBzdHJpbmdzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGNkYXRhX3N0cmluZyA9IHsnQycsICdEJywgJ0EnLCAnVCcsICdBJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGlkX3N0cmluZyA9IHsnSScsICdEJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIHJlZl9zdHJpbmcgPSB7J1InLCAnRScsICdGJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGVudGl0X3N0cmluZyA9IHsnRScsICdOJywgJ1QnLCAnSScsICdUJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGllc19zdHJpbmcgPSB7J0knLCAnRScsICdTJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIG5tdG9rZW5fc3RyaW5nID0geydOJywgJ00nLCAnVCcsICdPJywgJ0snLCAnRScsICdOJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIG5vdGF0aW9uX3N0cmluZyA9IHsnTicsICdPJywgJ1QnLCAnQScsICdUJywgJ0knLCAnTycsICdOJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIHJlcXVpcmVkX3N0cmluZyA9IHsnIycsICdSJywgJ0UnLCAnUScsICdVJywgJ0knLCAnUicsICdFJywgJ0QnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaW1wbGllZF9zdHJpbmcgPSB7JyMnLCAnSScsICdNJywgJ1AnLCAnTCcsICdJJywgJ0UnLCAnRCd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBmaXhlZF9zdHJpbmcgPSB7JyMnLCAnRicsICdJJywgJ1gnLCAnRScsICdEJ307Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gc3lzdGVtX3N0cmluZyA9IHsnUycsICdZJywgJ1MnLCAnVCcsICdFJywgJ00nfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gcHVibGljX3N0cmluZyA9IHsnUCcsICdVJywgJ0InLCAnTCcsICdJJywgJ0MnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gbmRhdGFfc3RyaW5nID0geydOJywgJ0QnLCAnQScsICdUJywgJ0EnfTsKLQotCXByaXZhdGUgaW50W10gZk9wU3RhY2sgPSBudWxsOwotCXByaXZhdGUgQ01Hcm91cE5vZGVbXSBmR3JwU3RhY2sgPSBudWxsOwotCi0JcHJpdmF0ZSBFbnRpdHlQb29sIGVudGl0eVBvb2w7Ci0KLQkvKiBBdHRyaWJ1dGUgRGVmIHNjYW5uZXIgc3RhdGUgKi8KLQlzdGF0aWMgZmluYWwgaW50IEF0dF9TY2FubmVyX1N0YXRlX05hbWUgPSAxLCBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlID0gMiwgQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGUgPSAzLCBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VmFsdWUgPSA0OwotCi0JcHJpdmF0ZSBTdHJpbmdQYXJzZXIgY29udGVudFN0cmluZzsKLQlwcml2YXRlIFN0cmluZyBjRGF0YTsKLQlwcml2YXRlIGludCBwcmV2Tm9kZU9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbm9kZU9mZnNldCA9IDE7Ci0JcHJpdmF0ZSBTdHJpbmcgb3duZXJEVEQ7Ci0KLQlwcml2YXRlIFN0cmluZyBlcnJvclN0cmluZzsKLQotCXB1YmxpYyBEVERTY2FubmVyKFN0cmluZyBvd25lckRURCwgU3RyaW5nIGNtKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ206ICIgKyBjbSk7Ci0JCWNvbnRlbnRTdHJpbmcgPSBuZXcgU3RyaW5nUGFyc2VyKGNtKTsKLQkJY0RhdGEgPSBjbTsKLQkJdGhpcy5vd25lckRURCA9IG93bmVyRFREOwotCX0KLQotCS8vCi0JLy8gWzQ2XSBjb250ZW50c3BlYyA6Oj0gJ0VNUFRZJyB8ICdBTlknIHwgTWl4ZWQgfCBjaGlsZHJlbgotCS8vCi0JLy8gU3BlY2lmaWMgdG8gVmlzdWFsRFREIDogYWxzbyBhbGxvd3MgJVBFUmVmZXJlbmNlOwotCS8vCi0JcHVibGljIENNTm9kZSBzY2FuQ29udGVudE1vZGVsKCkgewotCQlDTU5vZGUgY21Ob2RlID0gbnVsbDsKLQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQlpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKGVtcHR5X3N0cmluZykpIHsKLQkJCWNtTm9kZSA9IG5ldyBDTUJhc2ljTm9kZSgiRU1QVFkiLCBDTU5vZGVUeXBlLkVNUFRZKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhhbnlfc3RyaW5nKSkgewotCQkJY21Ob2RlID0gbmV3IENNQmFzaWNOb2RlKCJBTlkiLCBDTU5vZGVUeXBlLkFOWSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyUnLCB0cnVlKSkgewotCQkJY21Ob2RlID0gbmV3IENNUmVmZXJlbmNlTm9kZShjb250ZW50U3RyaW5nLmdldERhdGEoKSwgQ01Ob2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJfQotCQllbHNlIGlmICghY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcoJywgdHJ1ZSkpIHsKLQkJCS8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgY29udGVudG1vZGVsIHN0cmluZyBpcyBiYWQuLi4KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiISEhIGV4Y2VwdGlvbiAtIG5vICgiKTsKLQkJCXJldHVybiBjbU5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbWFpbmluZyBTdHJpbmcgPSAiICsKLQkJCS8vIGNvbnRlbnRTdHJpbmcuZ2V0UmVtYWluaW5nU3RyaW5nKCkpOwotCi0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlib29sZWFuIHNraXBwZWRQQ0RBVEEgPSBjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcocGNkYXRhX3N0cmluZyk7Ci0JCQlpZiAoc2tpcHBlZFBDREFUQSkgewotCQkJCWNtTm9kZSA9IHNjYW5NaXhlZCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY21Ob2RlID0gc2NhbkNoaWxkcmVuKCk7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gY21Ob2RlOwotCX0KLQotCS8vCi0JLy8gWzUxXSBNaXhlZCA6Oj0gJygnIFM/ICcjUENEQVRBJyAoUz8gJ3wnIFM/IE5hbWUpKiBTPyAnKSonIHwgJygnIFM/Ci0JLy8gJyNQQ0RBVEEnIFM/ICcpJwotCS8vCi0JLy8gQ2FsbGVkIGFmdGVyIHNjYW5uaW5nIHBhc3QgJygnIFM/ICcjUENEQVRBJwotCS8vCi0JcHJpdmF0ZSBDTU5vZGUgc2Nhbk1peGVkKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNjYW5NaXhlZC4uLiIpOwotCQlDTUdyb3VwTm9kZSBjbU5vZGUgPSBuZXcgQ01Hcm91cE5vZGUoKTsKLQkJY21Ob2RlLnNldEdyb3VwS2luZChDTU5vZGVUeXBlLkdST1VQX0NIT0lDRSk7Ci0JCWNtTm9kZS5hZGRDaGlsZChuZXcgQ01CYXNpY05vZGUoIiNQQ0RBVEEiLCBDTU5vZGVUeXBlLlBDREFUQSkpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gaW50IHByZXZOb2RlSW5kZXggPSAtMTsKLQkJYm9vbGVhbiBzdGFyUmVxdWlyZWQgPSBmYWxzZTsKLQotCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCX0KLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCWlmICghY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCd8JywgdHJ1ZSkpIHsKLQkJCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKScsIHRydWUpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcqJywgdHJ1ZSkpIHsKLQkJCQkJY21Ob2RlLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5aRVJPX09SX01PUkUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChzdGFyUmVxdWlyZWQpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgKiBpcyByZXF1aXJlZCAuLi4gIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCX0KLQotCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJaWYgKG5vZGVPZmZzZXQgIT0gLTEpIHsKLQkJCQkvLyBza2lwIHBhc3MgInwiCi0JCQkJcHJldk5vZGVPZmZzZXQgPSBub2RlT2Zmc2V0OwotCQkJfQotCi0JCQlzdGFyUmVxdWlyZWQgPSB0cnVlOwotCQkJY29udGVudFN0cmluZy5za2lwUGFzdE5hbWVBbmRQRVJlZmVyZW5jZSgnKScpOwotCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQlpZiAobm9kZU9mZnNldCA9PSAtMSkKLQkJCQlicmVhazsKLQotCQkJLy8gYWRkIGxlYXZlIG5vZGUKLQkJCWludCBsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQlTdHJpbmcgcmVmTmFtZSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJcHJldk5vZGVPZmZzZXQgPSBub2RlT2Zmc2V0OwotCQkJaWYgKHJlZk5hbWUuc3RhcnRzV2l0aCgiJSIpKSAvLyROT04tTkxTLTEkCi0JCQkJY21Ob2RlLmFkZENoaWxkKG5ldyBDTVJlZmVyZW5jZU5vZGUocmVmTmFtZSwgQ01Ob2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFKSk7Ci0JCQllbHNlCi0JCQkJY21Ob2RlLmFkZENoaWxkKG5ldyBDTVJlZmVyZW5jZU5vZGUocmVmTmFtZSwgQ01Ob2RlVHlwZS5FTEVNRU5UX1JFRkVSRU5DRSkpOwotCi0JCX0gLy8gZW5kIHdoaWxlCi0KLQotCQlpZiAoY21Ob2RlLmdldENoaWxkcmVuKCkuc2l6ZSgpID09IDEpIHsKLQkJCS8vIHNpbXBsaWZ5IHRoZSBjb250ZW50TW9kZWwgaWYgdGhlIENNR3JvdXBOb2RlIG9ubHkgaGFzIG9uZSBjaGlsZAotCQkJLy8gbm9kZS4KLQkJCXJldHVybiAoQ01CYXNpY05vZGUpIGNtTm9kZS5nZXRDaGlsZHJlbigpLmVsZW1lbnRBdCgwKTsKLQkJfQotCi0JCXJldHVybiBjbU5vZGU7Ci0JfQotCi0JLy8KLQkvLyBbNDddIGNoaWxkcmVuIDo6PSAoY2hvaWNlIHwgc2VxKSAoJz8nIHwgJyonIHwgJysnKT8KLQkvLyBbNDldIGNob2ljZSA6Oj0gJygnIFM/IGNwICggUz8gJ3wnIFM/IGNwICkqIFM/ICcpJwotCS8vIFs1MF0gc2VxIDo6PSAnKCcgUz8gY3AgKCBTPyAnLCcgUz8gY3AgKSogUz8gJyknCi0JLy8gWzQ4XSBjcCA6Oj0gKE5hbWUgfCBjaG9pY2UgfCBzZXEpICgnPycgfCAnKicgfCAnKycpPwotCS8vCi0JLy8gQ2FsbGVkIGFmdGVyIHNjYW5uaW5nIHBhc3QgJygnCi0KLQlwcml2YXRlIENNTm9kZSBzY2FuQ2hpbGRyZW4oKSB7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzY2FuQ2hpbGRyZW4uLi4iKTsKLQotCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQl9Ci0KLQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQlpbnQgZGVwdGggPSAxOwotCQlpbml0aWFsaXplQ29udGVudE1vZGVsU3RhY2soZGVwdGgpOwotCQlpbnQgbGVuOwotCi0JCVN0cmluZyBub2RlTmFtZTsKLQkJQ01Hcm91cE5vZGUgY21Ob2RlID0gbmV3IENNR3JvdXBOb2RlKCk7Ci0JCWZHcnBTdGFja1tkZXB0aF0gPSBjbU5vZGU7Ci0KLQkJd2hpbGUgKHRydWUpIHsKLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgQmVnaW4gb3V0dGVyIHdoaWxlIGxvb3AgLi4uIiApOwotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKCcsIHRydWUpKSB7Ci0JCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQkJLy8gc2tpcCBwYXN0IGFueSB3aGl0ZSBzcGFjZXMgYWZ0ZXIgdGhlICcoJwotCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJfQotCi0JCQkJZGVwdGgrKzsKLQkJCQlpbml0aWFsaXplQ29udGVudE1vZGVsU3RhY2soZGVwdGgpOwotCQkJCWZHcnBTdGFja1tkZXB0aF0gPSBuZXcgQ01Hcm91cE5vZGUoKTsKLQkJCQlmR3JwU3RhY2tbZGVwdGggLSAxXS5hZGRDaGlsZChmR3JwU3RhY2tbZGVwdGhdKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3ROYW1lQW5kUEVSZWZlcmVuY2UoJyknKTsKLQkJCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJLyoKLQkJCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiIHByZXZOb2RlT0Zmc2V0ICIgKyBwcmV2Tm9kZU9mZnNldCk7Ci0JCQkgKiBTeXN0ZW0ub3V0LnByaW50bG4oIiBjdXJyZW50Tm9kZU9GZnNldCAiICsgbm9kZU9mZnNldCk7Ci0JCQkgKi8KLQotCQkJbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCi0JCQlpZiAobm9kZU9mZnNldCA9PSAtMSB8fCBsZW4gPCAxKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCW5vZGVOYW1lID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0KLQkJCUNNUmVwZWF0YWJsZU5vZGUgcm47Ci0JCQlpZiAobm9kZU5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlybiA9IG5ldyBDTVJlZmVyZW5jZU5vZGUobm9kZU5hbWUsIENNTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlybiA9IG5ldyBDTVJlZmVyZW5jZU5vZGUobm9kZU5hbWUsIENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0UpOwotCQkJfQotCi0JCQlmR3JwU3RhY2tbZGVwdGhdLmFkZENoaWxkKHJuKTsKLQotCQkJcHJldk5vZGVPZmZzZXQgPSBub2RlT2Zmc2V0OwotCi0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCc/JywgdHJ1ZSkpIHsKLQkJCQlybi5zZXRPY2N1cnJlbmNlKENNTm9kZVR5cGUuT1BUSU9OQUwpOwotCQkJfQotCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcqJywgdHJ1ZSkpIHsKLQkJCQlybi5zZXRPY2N1cnJlbmNlKENNTm9kZVR5cGUuWkVST19PUl9NT1JFKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKycsIHRydWUpKSB7Ci0JCQkJcm4uc2V0T2NjdXJyZW5jZShDTU5vZGVUeXBlLk9ORV9PUl9NT1JFKTsKLQkJCX0KLQotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQl9Ci0KLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgQmVnaW4gaW5uZXIgd2hpbGUgbG9vcCAuLi4gZGVwdGggIiArCi0JCQkJLy8gZGVwdGggKTsKLQkJCQlpZiAoZk9wU3RhY2tbZGVwdGhdICE9IENNTm9kZVR5cGUuR1JPVVBfU0VRVUVOQ0UgJiYgY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCd8JywgdHJ1ZSkpIHsKLQkJCQkJZk9wU3RhY2tbZGVwdGhdID0gQ01Ob2RlVHlwZS5HUk9VUF9DSE9JQ0U7Ci0JCQkJCWZHcnBTdGFja1tkZXB0aF0uc2V0R3JvdXBLaW5kKENNTm9kZVR5cGUuR1JPVVBfQ0hPSUNFKTsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllbHNlIGlmIChmT3BTdGFja1tkZXB0aF0gIT0gQ01Ob2RlVHlwZS5HUk9VUF9DSE9JQ0UgJiYgY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcsJywgdHJ1ZSkpIHsKLQkJCQkJZk9wU3RhY2tbZGVwdGhdID0gQ01Ob2RlVHlwZS5HUk9VUF9TRVFVRU5DRTsKLQkJCQkJZkdycFN0YWNrW2RlcHRoXS5zZXRHcm91cEtpbmQoQ01Ob2RlVHlwZS5HUk9VUF9TRVFVRU5DRSk7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyknLCB0cnVlKSkgewotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZXJyb3IgKSBub3QgZm91bmQiKTsKLQkJCQkJfQotCQkJCQkvLyBlbmQgb2YgdGhlIGN1cmVudCBncm91cCBub2RlCi0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJz8nLCB0cnVlKSkgewotCQkJCQkJZkdycFN0YWNrW2RlcHRoXS5zZXRPY2N1cnJlbmNlKENNTm9kZVR5cGUuT1BUSU9OQUwpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKicsIHRydWUpKSB7Ci0JCQkJCQlmR3JwU3RhY2tbZGVwdGhdLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5aRVJPX09SX01PUkUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKycsIHRydWUpKSB7Ci0JCQkJCQlmR3JwU3RhY2tbZGVwdGhdLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5PTkVfT1JfTU9SRSk7Ci0JCQkJCX0KLQkJCQkJZGVwdGgtLTsKLQkJCQkJaWYgKGRlcHRoID09IDApIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIEVuZCBlbmQgaW5uZXIgd2hpbGUgbG9vcCAuLi4gZGVwdGgKLQkJCQkJLy8gIiArIGRlcHRoICk7Ci0KLQkJCQl9Ci0JCQl9IC8vIGlubmVyIHdoaWxlCi0KLQkJCWlmIChkZXB0aCA9PSAwKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gLy8gb3V0ZXIgd2hpbGUKLQotCQlpZiAoY21Ob2RlLmdldENoaWxkcmVuKCkuc2l6ZSgpID09IDEpIHsKLQkJCS8vIHNpbXBsaWZ5IHRoZSBjb250ZW50TW9kZWwgaWYgdGhlIENNR3JvdXBOb2RlIG9ubHkgaGFzIG9uZSBjaGlsZAotCQkJLy8gbm9kZSBhbmQgdGhhdCBub2RlIGlzIGFuIGVsZW1lbnQgcmVmLgotCQkJQ01SZXBlYXRhYmxlTm9kZSBybiA9IChDTVJlcGVhdGFibGVOb2RlKSBjbU5vZGUuZ2V0Q2hpbGRyZW4oKS5lbGVtZW50QXQoMCk7Ci0JCQlpZiAocm4gaW5zdGFuY2VvZiBDTVJlZmVyZW5jZU5vZGUpIHsKLQkJCQlDTVJlZmVyZW5jZU5vZGUgcmVmID0gKENNUmVmZXJlbmNlTm9kZSkgcm47Ci0JCQkJaWYgKHJlZi5nZXRUeXBlKCkgPT0gQ01Ob2RlVHlwZS5FTEVNRU5UX1JFRkVSRU5DRSkgewotCQkJCQlpZiAocmVmLmdldE9jY3VycmVuY2UoKSA9PSBDTU5vZGVUeXBlLk9ORSkgewotCQkJCQkJcmVmLnNldE9jY3VycmVuY2UoY21Ob2RlLmdldE9jY3VycmVuY2UoKSk7Ci0JCQkJCQlyZXR1cm4gcmVmOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNtTm9kZS5nZXRPY2N1cnJlbmNlKCkgPT0gQ01Ob2RlVHlwZS5PTkUpIHsKLQkJCQkJCXJldHVybiByZWY7Ci0JCQkJCX0KLQkJCQl9IC8vIGVuZCBvZiBpZiAoKQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNtTm9kZTsKLQl9Ci0KLQkvLwotCS8vIFs1Ml0gQXR0bGlzdERlY2wgOjo9ICc8IUFUVExJU1QnIFMgTmFtZSBBdHREZWYqIFM/ICc+JwotCS8vIFs1M10gQXR0RGVmIDo6PSBTIE5hbWUgUyBBdHRUeXBlIFMgRGVmYXVsdERlY2wKLQkvLyBbNjBdIERlZmF1bHREZWNsIDo6PSAnI1JFUVVJUkVEJyB8ICcjSU1QTElFRCcgfCAoKCcjRklYRUQnIFMpPwotCS8vIEF0dFZhbHVlKQotCS8vCi0KLQlwdWJsaWMgVmVjdG9yIHNjYW5BdHRsaXN0RGVjbChFbnRpdHlQb29sIGVudGl0eVBvb2wpIHsKLQkJVmVjdG9yIGF0dExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCXRoaXMuZW50aXR5UG9vbCA9IGVudGl0eVBvb2w7Ci0KLQkJaW50IHNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX05hbWU7Ci0JCQotCQlBdHROb2RlIGF0dE5vZGU7Ci0KLQkJd2hpbGUgKHRydWUpIHsKLQkJCWF0dE5vZGUgPSBuZXcgQXR0Tm9kZSgpOwotCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBzY2FubmVyIHN0YXRlOiAiICsgc2Nhbm5lclN0YXRlKTsKLQotCQkJLy8gc2Nhbm5pbmcgYXR0IG5hbWUKLQkJCWlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfTmFtZSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2NhbiBhdHQgTmFtZS4uLiIpOwotCQkJCXNjYW5uZXJTdGF0ZSA9IGNoZWNrRm9yQXR0cmlidXRlV2l0aFBFUmVmZXJlbmNlKGF0dE5vZGUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJaWYgKHNjYW5uZXJTdGF0ZSA9PSAtMSkgewotCQkJCQlyZXR1cm4gYXR0TGlzdDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNjYW5uaW5nIGF0dCB0eXBlCi0JCQlpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX1R5cGUpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNjYW4gYXR0IHR5cGUuLi4iKTsKLQotCQkJCWlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoY2RhdGFfc3RyaW5nKSkgewotCQkJCQlhdHROb2RlLnR5cGUgPSBuZXcgU3RyaW5nKGNkYXRhX3N0cmluZyk7Ci0JCQkJCXNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoaWRfc3RyaW5nKSkgewotCQkJCQlpZiAoIWNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhyZWZfc3RyaW5nKSkgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gbmV3IFN0cmluZyhpZF9zdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1MnLCB0cnVlKSkgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIklEUkVGIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIklEUkVGUyI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKGVudGl0X3N0cmluZykpIHsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignWScsIHRydWUpKSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSAiRU5USVRZIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhpZXNfc3RyaW5nKSkgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIkVOVElUSUVTIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcobm10b2tlbl9zdHJpbmcpKSB7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1MnLCB0cnVlKSkgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIk5NVE9LRU5TIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIk5NVE9LRU4iOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhub3RhdGlvbl9zdHJpbmcpKSB7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJygnLCB0cnVlKSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgbWlzc2luZyAoIGluIG5vdGF0aW9uICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJYXR0Tm9kZS50eXBlID0gIk5PVEFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlhdHROb2RlLmVudW1MaXN0ID0gc2NhbkVudW1lcmF0aW9uKGNvbnRlbnRTdHJpbmcsIHRydWUpOwotCQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcoJywgdHJ1ZSkpIHsKLQkJCQkJYXR0Tm9kZS50eXBlID0gIkVOVU1FUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlhdHROb2RlLmVudW1MaXN0ID0gc2NhbkVudW1lcmF0aW9uKGNvbnRlbnRTdHJpbmcsIGZhbHNlKTsKLQkJCQkJc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzY2FubmVyU3RhdGUgPSBjaGVja0ZvckF0dHJpYnV0ZVdpdGhQRVJlZmVyZW5jZShhdHROb2RlLCBzY2FubmVyU3RhdGUpOwotCQkJCQlpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX1R5cGUpIHsKLQkJCQkJCXNldEVycm9yU3RyaW5nKCJGYWlsZWQgdG8gZmluZCB0eXBlIGZvciBhdHRyaWJ1dGUgJyIgKyBhdHROb2RlLm5hbWUgKyAiJy4gIFBsZWFzZSByZWZlciB0byB0aGUgb3JpZ2luYWwgRFREIGZpbGUuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLy8gd2UgZmFpbGVkIHRvIGZpbmQgYSB0eXBlIGZvciB0aGlzIGF0dHJpYnV0ZQotCQkJCQkJcmV0dXJuIGF0dExpc3Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGUpIHsKLQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzY2FuIGRlZmF1bHQgdHlwZS4uLiIpOwotCQkJCWlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcocmVxdWlyZWRfc3RyaW5nKSkgewotCQkJCQlhdHROb2RlLmRlZmF1bHRUeXBlID0gbmV3IFN0cmluZyhyZXF1aXJlZF9zdHJpbmcpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoaW1wbGllZF9zdHJpbmcpKSB7Ci0JCQkJCWF0dE5vZGUuZGVmYXVsdFR5cGUgPSBuZXcgU3RyaW5nKGltcGxpZWRfc3RyaW5nKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoZml4ZWRfc3RyaW5nKSkgewotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQkJYXR0Tm9kZS5kZWZhdWx0VHlwZSA9IG5ldyBTdHJpbmcoZml4ZWRfc3RyaW5nKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQkvLyAiZGVmYXVsdCIKLQkJCQkJCWF0dE5vZGUuZGVmYXVsdFR5cGUgPSAiTk9GSVhFRCI7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJYXR0Tm9kZS5kZWZhdWx0VmFsdWUgPSBzY2FuRGVmYXVsdEF0dFZhbHVlKGNvbnRlbnRTdHJpbmcpOwotCQkJCX0KLQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lOyAvLyBuZXh0Ci0JCQl9Ci0KLQotCQkJYXR0TGlzdC5hZGRFbGVtZW50KGF0dE5vZGUpOwotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQlpZiAobm9kZU9mZnNldCA+PSBjRGF0YS5sZW5ndGgoKSkKLQkJCQlyZXR1cm4gYXR0TGlzdDsKLQotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQl9Ly8gZW5kIHdoaWxlIGxvb3AKLQl9Ci0KLQkvLwotCS8vIGNvbnRlbnQgbW9kZWwgc3RhY2sKLQkvLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ29udGVudE1vZGVsU3RhY2soaW50IGRlcHRoKSB7Ci0JCWlmIChmT3BTdGFjayA9PSBudWxsKSB7Ci0JCQlmT3BTdGFjayA9IG5ldyBpbnRbOF07Ci0JCQlmR3JwU3RhY2sgPSBuZXcgQ01Hcm91cE5vZGVbOF07Ci0JCX0KLQkJZWxzZSBpZiAoZGVwdGggPT0gZk9wU3RhY2subGVuZ3RoKSB7Ci0JCQlpbnRbXSBuZXdTdGFjayA9IG5ldyBpbnRbZGVwdGggKiAyXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZk9wU3RhY2ssIDAsIG5ld1N0YWNrLCAwLCBkZXB0aCk7Ci0JCQlmT3BTdGFjayA9IG5ld1N0YWNrOwotCi0JCQlDTUdyb3VwTm9kZVtdIG5ld0dycFN0YWNrID0gbmV3IENNR3JvdXBOb2RlW2RlcHRoICogMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZHcnBTdGFjaywgMCwgbmV3R3JwU3RhY2ssIDAsIGRlcHRoKTsKLQkJCWZHcnBTdGFjayA9IG5ld0dycFN0YWNrOwotCQl9Ci0JCWZPcFN0YWNrW2RlcHRoXSA9IC0xOwotCQlmR3JwU3RhY2tbZGVwdGhdID0gbnVsbDsKLQl9Ci0KLQkvLwotCXByaXZhdGUgaW50IGNoZWNrRm9yQXR0cmlidXRlV2l0aFBFUmVmZXJlbmNlKEF0dE5vZGUgYXR0Tm9kZSwgaW50IHNjYW5uZXJTdGF0ZSkgewotCQlpbnQgc3RhdGUgPSAtMTsKLQkJaW50IGxlbjsKLQkJU3RyaW5nIHJhd1RleHQ7Ci0JCUVudGl0eURlY2wgcEVudGl0eTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBjaGVja2ZvckFUVFBFUlJlZmVyZW5jZS0gc3RhcnQgc2Nhbm5lclN0YXRlOiAiCi0JCS8vICsgc2Nhbm5lclN0YXRlKTsKLQkJaWYgKHNjYW5uZXJTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lKSB7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0TmFtZUFuZFBFUmVmZXJlbmNlKCcgJyk7Ci0JCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQlsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0KLQkJCXJhd1RleHQgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJCWF0dE5vZGUubmFtZSA9IHJhd1RleHQ7Ci0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGVfbmFtZSA6ICIgKyByYXdUZXh0KTsKLQotCQkJaWYgKHJhd1RleHQuc3RhcnRzV2l0aCgiJSIpICYmIHJhd1RleHQuZW5kc1dpdGgoIjsiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTdHJpbmcgcGUgPSByYXdUZXh0LnN1YnN0cmluZygxLCByYXdUZXh0Lmxlbmd0aCgpIC0gMSk7Ci0KLQkJCQlwRW50aXR5ID0gZW50aXR5UG9vbC5yZWZlclBhcmEocGUpOwotCQkJCWlmIChwRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgbmFtZSA6IiArIHJhd1RleHQgKyIgZXhwYW5kVG86IiArCi0JCQkJCS8vIHBFbnRpdHkuZXhwYW5kZWRWYWx1ZSk7Ci0JCQkJCXN0YXRlID0gd2hhdElzVGhlTmV4dEF0dHJpYnV0ZVNjYW5uaW5nU3RhdGUocEVudGl0eS5leHBhbmRlZFZhbHVlLCBzY2FubmVyU3RhdGUpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNrRm9yQXR0cndpdGhQRVIgLSBuZXh0c3RhdGU6ICIKLQkJCQkJLy8gKyBzdGF0ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlOwotCQkJfQotCQkJZWxzZQotCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZTsKLQotCQl9Ci0JCWVsc2UgaWYgKHNjYW5uZXJTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlKSB7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCclJywgdHJ1ZSkpIHsKLQkJCQlyYXdUZXh0ID0gZ2V0UEVOYW1lKCk7Ci0JCQkJYXR0Tm9kZS50eXBlID0gIiUiICsgcmF3VGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBwZU5hbWUgPSByYXdUZXh0LnN1YnN0cmluZygwLCByYXdUZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZV90eXBlIDogcGUtICIgKyBwZU5hbWUpOwotCQkJCXBFbnRpdHkgPSBlbnRpdHlQb29sLnJlZmVyUGFyYShwZU5hbWUpOwotCQkJCWlmIChwRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJc3RhdGUgPSB3aGF0SXNUaGVOZXh0QXR0cmlidXRlU2Nhbm5pbmdTdGF0ZShwRW50aXR5LmV4cGFuZGVkVmFsdWUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlzdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX1R5cGU7Ci0JCX0KLQkJZWxzZSBpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlKSB7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCclJywgdHJ1ZSkpIHsKLQkJCQlyYXdUZXh0ID0gZ2V0UEVOYW1lKCk7Ci0JCQkJYXR0Tm9kZS5kZWZhdWx0VHlwZSA9IHJhd1RleHQ7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZV9kZWZhdWx0VHlwZSA6ICIgKyByYXdUZXh0KTsKLQkJCQlwRW50aXR5ID0gZW50aXR5UG9vbC5yZWZlclBhcmEocmF3VGV4dC5zdWJzdHJpbmcoMSwgcmF3VGV4dC5sZW5ndGgoKSAtIDEpKTsKLQkJCQlpZiAocEVudGl0eSAhPSBudWxsKSB7Ci0JCQkJCXN0YXRlID0gd2hhdElzVGhlTmV4dEF0dHJpYnV0ZVNjYW5uaW5nU3RhdGUocEVudGl0eS5leHBhbmRlZFZhbHVlLCBzY2FubmVyU3RhdGUpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFZhbHVlOwotCQkJfQotCQkJZWxzZQotCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCX0KLQkJZWxzZSBpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRWYWx1ZSkgewotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignJScsIHRydWUpKSB7Ci0JCQkJcmF3VGV4dCA9IGdldFBFTmFtZSgpOwotCQkJCWF0dE5vZGUuZGVmYXVsdFZhbHVlID0gcmF3VGV4dDsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlX2RlZmF1bHRWYWx1ZSA6ICIgKyByYXdUZXh0KTsKLQotCQkJCXBFbnRpdHkgPSBlbnRpdHlQb29sLnJlZmVyUGFyYShyYXdUZXh0LnN1YnN0cmluZygxLCByYXdUZXh0Lmxlbmd0aCgpIC0gMSkpOwotCQkJCWlmIChwRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJc3RhdGUgPSB3aGF0SXNUaGVOZXh0QXR0cmlidXRlU2Nhbm5pbmdTdGF0ZShwRW50aXR5LmV4cGFuZGVkVmFsdWUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VmFsdWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VmFsdWU7Ci0JCX0KLQotCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBFTmFtZSgpIHsKLQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKCc7JywgdHJ1ZSk7Ci0JCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJaW50IGxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQkJcmV0dXJuIGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCX0KLQotCXByaXZhdGUgaW50IHdoYXRJc1RoZU5leHRBdHRyaWJ1dGVTY2FubmluZ1N0YXRlKFN0cmluZyBhdHRyQ29udGVudFN0cmluZywgaW50IGN1cnJlbnRTdGF0ZSkgewotCQlTdHJpbmdQYXJzZXIgc3AgPSBuZXcgU3RyaW5nUGFyc2VyKGF0dHJDb250ZW50U3RyaW5nLnRyaW0oKSk7Ci0KLQotCQlpbnQgbmV4dFN0YXRlID0gY3VycmVudFN0YXRlOwotCQlpbnQgbk9mZnNldCA9IDA7Ci0KLQkJLyoKLQkJICogU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0IEF0dENvbnRlbnRTdHJpbmd0IDogIiArCi0JCSAqIGF0dHJDb250ZW50U3RyaW5nKTsgU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0Ci0JCSAqIEF0dENvbnRlbnRTdHJpbmdMIDogIiArIGF0dHJDb250ZW50U3RyaW5nLmxlbmd0aCgpKTsKLQkJICogU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0IGN1cnJlbnRzdGF0ZSA6ICIgKyBjdXJyZW50U3RhdGUpOwotCQkgKi8KLQotCQl3aGlsZSAodHJ1ZSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0IGluc2lkZSB3aGlsIG5leHRzdGF0ZSA6ICIgKwotCQkJLy8gbmV4dFN0YXRlKTsKLQkJCWlmIChuZXh0U3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfTmFtZSkgeyAvLyB0aGUgY3VycmVudAotCQkJCQkJCQkJCQkJCQkvLyBzY2FubmluZyBzdGF0ZSBpcwotCQkJCQkJCQkJCQkJCQkvLyBBdHRyIE5hbWUsIGlzIHRoZQotCQkJCQkJCQkJCQkJCQkvLyBuZXh0IHBhcnQgQXR0ciBUeXBlCi0JCQkJCQkJCQkJCQkJCS8vID8KLQkJCQlpZiAoaXNBdHRyTmFtZShzcCkpIHsKLQkJCQkJbmV4dFN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXh0U3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZSkgeyAvLyB0aGUgY3VycmVudAotCQkJCQkJCQkJCQkJCQkJLy8gc2Nhbm5pbmcgc3RhdGUKLQkJCQkJCQkJCQkJCQkJCS8vIGlzIEF0dHIgVHlwZSwKLQkJCQkJCQkJCQkJCQkJCS8vIGlzIHRoZSBuZXh0Ci0JCQkJCQkJCQkJCQkJCQkvLyBwYXJ0IERlZmF1bHQKLQkJCQkJCQkJCQkJCQkJCS8vIEF0dHIgVHlwZSA/Ci0KLQkJCQlpZiAoaXNBdHRyVHlwZShzcCkpIHsKLQkJCQkJbmV4dFN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0IEF0dHIgUGFydCAtIGlzIG5vdCBhbiBBdHRyIFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl9Ci0KLQkJCWlmIChuZXh0U3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGUpIHsKLQotCQkJCWludCBkVHlwZSA9IGlzQXR0ckRlZmF1bHRUeXBlKHNwKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIldoYXRpc3RoZU5leHQgaW5zaWRlIGRUeXBlIDogIiArCi0JCQkJLy8gZFR5cGUpOwotCQkJCWlmIChkVHlwZSA9PSAxKSAvLyAjUkVRVUlSRUQgb3IgI0lNUExJRUQKLQkJCQl7Ci0JCQkJCW5leHRTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX05hbWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoZFR5cGUgPT0gMikgLy8gI0ZJWEVECi0JCQkJCXsKLQkJCQkJCS8vIG5lZWQgdG8gbG9vayBhdCB0aGlzIGFnYWluCi0JCQkJCQluZXh0U3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQkJfQotCi0JCQkJCWlmIChzY2FuRGVmYXVsdEF0dFZhbHVlKHNwKSAhPSBudWxsKSB7Ci0JCQkJCQluZXh0U3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXNwLnNraXBQYXN0U3BhY2VzKCk7Ci0KLQkJCWlmIChuT2Zmc2V0ID09IHNwLmdldEN1cnJlbnRPZmZzZXQoKSkKLQkJCQlicmVhazsKLQotCQkJbk9mZnNldCA9IHNwLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJaWYgKG5PZmZzZXQgPj0gYXR0ckNvbnRlbnRTdHJpbmcubGVuZ3RoKCkgfHwgbk9mZnNldCA9PSAtMSkKLQkJCQlicmVhazsKLQotCQl9IC8vIGVuZCB3aGlsZQotCi0JCXJldHVybiBuZXh0U3RhdGU7Ci0JfQotCi0KLQlwcml2YXRlIGJvb2xlYW4gaXNBdHRyTmFtZShTdHJpbmdQYXJzZXIgc3ApIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJOYW1lIC0gc3A6IiArIHNwLmZEYXRhKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJOYW1lIC0gY3VycmVudE9mZnNldDoiICsKLQkJLy8gc3AuZ2V0Q3VycmVudE9mZnNldCgpKTsKLQkJYm9vbGVhbiBpc0F0dHJOYW1lID0gZmFsc2U7Ci0JCWludCBwcmV2ID0gc3AuZ2V0Q3VycmVudE9mZnNldCgpOwotCQlzcC5za2lwUGFzdE5hbWUoJyAnKTsKLQkJaWYgKChzcC5nZXRDdXJyZW50T2Zmc2V0KCkgLSBwcmV2KSA+IDApCi0JCQlpc0F0dHJOYW1lID0gdHJ1ZTsKLQkJcmV0dXJuIGlzQXR0ck5hbWU7Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNBdHRyVHlwZShTdHJpbmdQYXJzZXIgc3ApIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJUeXBlIC0gc3A6IiArIHNwLmZEYXRhKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJUeXBlIC0gY3VycmVudE9mZnNldDoiICsKLQkJLy8gc3AuZ2V0Q3VycmVudE9mZnNldCgpKTsKLQkJYm9vbGVhbiBpc0F0dHJUeXBlID0gZmFsc2U7Ci0JCWlmIChzcC5za2lwcGVkU3RyaW5nKGNkYXRhX3N0cmluZykpIHsKLQkJCWlzQXR0clR5cGUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcoaWRfc3RyaW5nKSkgewotCQkJaWYgKCFzcC5za2lwcGVkU3RyaW5nKHJlZl9zdHJpbmcpKSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIElECi0JCQl9Ci0JCQllbHNlIGlmICghc3AubG9va2luZ0F0Q2hhcignUycsIHRydWUpKSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIElEUkVGUwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIElEUkVGCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc3Auc2tpcHBlZFN0cmluZyhlbnRpdF9zdHJpbmcpKSB7Ci0JCQlpZiAoc3AubG9va2luZ0F0Q2hhcignWScsIHRydWUpKSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIEVOVElUWQotCQkJfQotCQkJZWxzZSBpZiAoc3Auc2tpcHBlZFN0cmluZyhpZXNfc3RyaW5nKSkgewotCQkJCWlzQXR0clR5cGUgPSB0cnVlOyAvLyBFTlRJVElURVMKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzcC5za2lwcGVkU3RyaW5nKG5tdG9rZW5fc3RyaW5nKSkgewotCQkJaWYgKHNwLmxvb2tpbmdBdENoYXIoJ1MnLCB0cnVlKSkgewotCQkJCWlzQXR0clR5cGUgPSB0cnVlOyAvLyBOTVRPS0VOUwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIE5NVE9LRU4KLQkJCX0KLQkJfQotCQllbHNlIGlmIChzcC5za2lwcGVkU3RyaW5nKG5vdGF0aW9uX3N0cmluZykpIHsKLQkJCWlmICghc3AubG9va2luZ0F0Q2hhcignKCcsIHRydWUpKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgbWlzc2luZyAoIGluIG5vdGF0aW9uICIpOwotCQkJfQotCQkJVmVjdG9yIGVudW1MaXN0ID0gc2NhbkVudW1lcmF0aW9uKHNwLCB0cnVlKTsKLQkJCWlmIChlbnVtTGlzdCA9PSBudWxsIHx8IGVudW1MaXN0LnNpemUoKSA9PSAwKQotCQkJCWlzQXR0clR5cGUgPSBmYWxzZTsKLQkJCWVsc2UKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChzcC5sb29raW5nQXRDaGFyKCcoJywgdHJ1ZSkpIHsKLQkJCS8vICJFTlVNRVJBVElPTiI7Ci0JCQlWZWN0b3IgZW51bUxpc3QgPSBzY2FuRW51bWVyYXRpb24oc3AsIGZhbHNlKTsKLQkJCWlmIChlbnVtTGlzdCA9PSBudWxsIHx8IGVudW1MaXN0LnNpemUoKSA9PSAwKQotCQkJCWlzQXR0clR5cGUgPSBmYWxzZTsKLQkJCWVsc2UKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBpc0F0dHJUeXBlOwotCi0JfQotCi0JLyoKLQkgKiByZXR1cm4gMCAtIG5vdCBkZWZhdWx0IHR5cGUgMSAtICNSRVFVSVJFRCBvciAjSU1QTElFRCAyIC0gI0ZJWEVECi0JICovCi0KLQlwcml2YXRlIGludCBpc0F0dHJEZWZhdWx0VHlwZShTdHJpbmdQYXJzZXIgc3ApIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJEZWZhdWx0VHlwZSAtIHNwOiIgKyBzcC5mRGF0YSk7Ci0JCWludCByZXN1bHQgPSAwOwotCQlpZiAoc3Auc2tpcHBlZFN0cmluZyhyZXF1aXJlZF9zdHJpbmcpKSB7Ci0JCQlyZXN1bHQgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcoaW1wbGllZF9zdHJpbmcpKSB7Ci0JCQlyZXN1bHQgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcoZml4ZWRfc3RyaW5nKSkgewotCQkJcmVzdWx0ID0gMjsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vCi0JLy8gWzU4XSBOb3RhdGlvblR5cGUgOjo9ICdOT1RBVElPTicgUyAnKCcgUz8gTmFtZSAoUz8gJ3wnIFM/IE5hbWUpKiBTPyAnKScKLQkvLyBbNTldIEVudW1lcmF0aW9uIDo6PSAnKCcgUz8gTm10b2tlbiAoUz8gJ3wnIFM/IE5tdG9rZW4pKiBTPyAnKScKLQkvLwotCS8vIENhbGxlZCBhZnRlciBzY2FubmluZyAnKCcKLQkvLwotCXByaXZhdGUgVmVjdG9yIHNjYW5FbnVtZXJhdGlvbihTdHJpbmdQYXJzZXIgc3AsIGJvb2xlYW4gaXNOb3RhdGlvblR5cGUpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgc2NhbkVudW0gLi4uIik7Ci0JCVZlY3RvciBlbnVtTGlzdCA9IG51bGw7Ci0JCWludCBsZW47Ci0KLQkJaWYgKHNwLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJc3Auc2tpcFBhc3RTcGFjZXMoKTsKLQotCQlpbnQgcHJldk5vZGVPZmZzZXQgPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCWludCBub2RlT2Zmc2V0OwotCi0JCVN0cmluZyBub2RlTmFtZTsKLQotCQl3aGlsZSAodHJ1ZSkgewotCi0JCQlpZiAoaXNOb3RhdGlvblR5cGUpCi0JCQkJc3Auc2tpcFBhc3ROYW1lQW5kUEVSZWZlcmVuY2UoJyknKTsKLQkJCWVsc2UKLQkJCQlzcC5za2lwUGFzdE5tdG9rZW5BbmRQRVJlZmVyZW5jZSgnKScpOwotCi0JCQlub2RlT2Zmc2V0ID0gc3AuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQlpZiAobm9kZU9mZnNldCA9PSAtMSkgewotCQkJCXJldHVybiBlbnVtTGlzdDsKLQkJCX0KLQotCQkJbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCQkJbm9kZU5hbWUgPSBzcC5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0KLQkJCWlmIChlbnVtTGlzdCA9PSBudWxsKQotCQkJCWVudW1MaXN0ID0gbmV3IFZlY3RvcigpOwotCi0JCQllbnVtTGlzdC5hZGRFbGVtZW50KG5vZGVOYW1lKTsKLQotCQkJaWYgKHNwLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJCXNwLnNraXBQYXN0U3BhY2VzKCk7Ci0KLQkJCWlmICghc3AubG9va2luZ0F0Q2hhcignfCcsIHRydWUpKSB7Ci0JCQkJaWYgKCFzcC5sb29raW5nQXRDaGFyKCcpJywgdHJ1ZSkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzY2FubmluZyBlbnVtIHZhbHVlcyAtIGVycm9yIG1pc3NpbmcgJyknIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoc3AubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJc3Auc2tpcFBhc3RTcGFjZXMoKTsKLQotCQkJcHJldk5vZGVPZmZzZXQgPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGVudW1MaXN0OwotCX0KLQotCS8vCi0JLy8gWzEwXSBBdHRWYWx1ZSA6Oj0gJyInIChbXjwmIl0gfCBSZWZlcmVuY2UpKiAnIicKLQkvLyB8ICInIiAoW148JiddIHwgUmVmZXJlbmNlKSogIiciCi0JLy8KLQkvKioKLQkgKiBTY2FuIHRoZSBkZWZhdWx0IHZhbHVlIGluIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50VHlwZQotCSAqICAgICAgICAgICAgaGFuZGxlIHRvIHRoZSBlbGVtZW50IHRoYXQgb3ducyB0aGUgYXR0cmlidXRlCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICogICAgICAgICAgICBoYW5kbGUgaW4gdGhlIHN0cmluZyBwb29sIGZvciB0aGUgYXR0cmlidXRlIG5hbWUKLQkgKiBAcmV0dXJuIGhhbmRsZSBpbiB0aGUgc3RyaW5nIHBvb2wgZm9yIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZSB2YWx1ZQotCSAqIEBleGNlcHRpb24gamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgc2NhbkRlZmF1bHRBdHRWYWx1ZShTdHJpbmdQYXJzZXIgc3ApIHsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzY2FuIGRlZmF1bHQgQVRUIFZhbHVlLi4uIHNwOiIgKyBzcC5mRGF0YSk7Ci0KLQkJc3Auc2tpcFBhc3RTcGFjZXMoKTsKLQotCQlib29sZWFuIHNpbmdsZTsKLQkJaWYgKCEoc2luZ2xlID0gc3AubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkgJiYgIXNwLmxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCi0JCWNoYXIgcWNoYXIgPSBzaW5nbGUgPyAnXCcnIDogJ1wiJzsKLQkJaW50IHNPZmZzZXQgPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCS8vQlVHIDIwMzQ5NCAtIFNraXAgdG8gdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUgcWNoYXIgdGhhdCB3YXkKLQkJLy8gYWxsIGNoYXJhY3RlcnMgYmV0d2VlbiBhcmUgb2J0YWluZWQKLQkJc3Auc2tpcFRvTGFzdE9mQ2hhcihxY2hhciwgdHJ1ZSk7Ci0JCWludCBsZW4gPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCkgLSBzT2Zmc2V0IC0gMTsKLQkJaWYgKGxlbiA9PSAwKQotCQkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQl2YWx1ZSA9IHNwLmdldFN0cmluZyhzT2Zmc2V0LCBsZW4pOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvLwotCS8vIFs3MF0gRW50aXR5RGVjbCA6Oj0gR0VEZWNsIHwgUEVEZWNsCi0JLy8gWzcxXSBHRURlY2wgOjo9ICc8IUVOVElUWScgUyBOYW1lIFMgRW50aXR5RGVmIFM/ICc+JwotCS8vIFs3Ml0gUEVEZWNsIDo6PSAnPCFFTlRJVFknIFMgJyUnIFMgTmFtZSBTIFBFRGVmIFM/ICc+JwotCS8vIFs3M10gRW50aXR5RGVmIDo6PSBFbnRpdHlWYWx1ZSB8IChFeHRlcm5hbElEIE5EYXRhRGVjbD8pCi0JLy8gWzc0XSBQRURlZiA6Oj0gRW50aXR5VmFsdWUgfCBFeHRlcm5hbElECi0JLy8gWzc1XSBFeHRlcm5hbElEIDo6PSAnU1lTVEVNJyBTIFN5c3RlbUxpdGVyYWwKLQkvLyB8ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsIFMgU3lzdGVtTGl0ZXJhbAotCS8vIFs3Nl0gTkRhdGFEZWNsIDo6PSBTICdOREFUQScgUyBOYW1lCi0JLy8gWzldIEVudGl0eVZhbHVlIDo6PSAnIicgKFteJSYiXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogJyInCi0JLy8gfCAiJyIgKFteJSYnXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogIiciCi0JLy8KLQkvLyBDYWxsZWQgYWZ0ZXIgc2Nhbm5pbmcgJ0VOVElUWScKLQkvLwotCXB1YmxpYyBFbnRpdHlEZWNsIHNjYW5FbnRpdHlEZWNsKCkgewotCQlwcmV2Tm9kZU9mZnNldCA9IDE7Ci0JCW5vZGVPZmZzZXQgPSAxOwotCQlpbnQgbGVuOwotCQlib29sZWFuIGlzUEVEZWNsID0gZmFsc2U7Ci0JCUVudGl0eURlY2wgZW50aXR5RGVjbCA9IG51bGw7Ci0KLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlTdHJpbmcgbmRhdGEgPSBudWxsOwotCi0JCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignJScsIHRydWUpKSB7Ci0JCQkJaXNQRURlY2wgPSBmYWxzZTsgLy8gPCFFTlRJVFkgeCAieCI+Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJaXNQRURlY2wgPSB0cnVlOyAvLyA8IUVOVElUWSAlIHggIngiPgotCQkJfQotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3ROYW1lKCcgJyk7Ci0JCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQlsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQlpZiAobGVuID4gMCkgewotCQkJCW5hbWUgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJCQlwcmV2Tm9kZU9mZnNldCA9IG5vZGVPZmZzZXQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCWJvb2xlYW4gc2luZ2xlOwotCQlpZiAoKHNpbmdsZSA9IGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkgfHwgY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcIicsIHRydWUpKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBzY2FuRW50aXR5VmFsdWUoc2luZ2xlKTsKLQkJCWVudGl0eURlY2wgPSBuZXcgRW50aXR5RGVjbChuYW1lLCBvd25lckRURCwgdmFsdWUsIGlzUEVEZWNsKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGV4dGVybmFsIGVudGl0eQotCQkJRXh0ZXJuYWxJRCB4SUQgPSBzY2FuRXh0ZXJuYWxJRCgpOwotCQkJaWYgKHhJRCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpc1BFRGVjbCkgLy8gZ2VuZXJhbCBlbnRpdHkKLQkJCQl7Ci0JCQkJCWJvb2xlYW4gdW5wYXJzZWQgPSBmYWxzZTsKLQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQl1bnBhcnNlZCA9IGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhuZGF0YV9zdHJpbmcpOwotCQkJCQlpZiAodW5wYXJzZWQpIHsKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0TmFtZSgnICcpOwotCQkJCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJCQkJbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCQkJCQkJbmRhdGEgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbnRpdHlEZWNsID0gbmV3IEVudGl0eURlY2wobmFtZSwgb3duZXJEVEQsIHhJRCwgaXNQRURlY2wsIG5kYXRhKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW50aXR5RGVjbDsKLQl9Ci0KLQotCS8vCi0JLy8gWzgyXSBOb3RhdGlvbkRlY2wgOjo9ICc8IU5PVEFUSU9OJyBTIE5hbWUgUyAoRXh0ZXJuYWxJRCB8IFB1YmxpY0lEKSBTPwotCS8vICc+JwotCS8vIFs3NV0gRXh0ZXJuYWxJRCA6Oj0gJ1NZU1RFTScgUyBTeXN0ZW1MaXRlcmFsCi0JLy8gfCAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbCBTIFN5c3RlbUxpdGVyYWwKLQkvLyBbODNdIFB1YmxpY0lEIDo6PSAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbAotCS8vCi0JLy8gQ2FsbGVkIGFmdGVyIHNjYW5uaW5nICdOT1RBVElPTicKLQkvLwotCXB1YmxpYyBOb3RhdGlvbkRlY2wgc2Nhbk5vdGF0aW9uRGVjbCgpIHsKLQkJcHJldk5vZGVPZmZzZXQgPSAxOwotCQlub2RlT2Zmc2V0ID0gMTsKLQkJaW50IGxlbjsKLQkJTm90YXRpb25EZWNsIG5vdGF0aW9uRGVjbCA9IG51bGw7Ci0KLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwUGFzdE5hbWUoJyAnKTsKLQkJCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJbmFtZSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJCXByZXZOb2RlT2Zmc2V0ID0gbm9kZU9mZnNldDsKLQkJCX0KLQkJfQotCi0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJbm90YXRpb25EZWNsID0gbmV3IE5vdGF0aW9uRGVjbChuYW1lLCBvd25lckRURCk7Ci0KLQkJRXh0ZXJuYWxJRCB4SUQgPSBzY2FuRXh0ZXJuYWxJRCgpOwotCQlpZiAoeElEICE9IG51bGwpIHsKLQkJCWlmICh4SUQuZ2V0U3lzdGVtTGl0ZXJhbCgpICE9IG51bGwpIHsKLQkJCQlub3RhdGlvbkRlY2wuc2V0U3lzdGVtSWQoeElELmdldFN5c3RlbUxpdGVyYWwoKSk7Ci0JCQl9Ci0JCQlpZiAoeElELmdldFB1YklkTGl0ZXJhbCgpICE9IG51bGwpIHsKLQkJCQlub3RhdGlvbkRlY2wuc2V0UHVibGljSWQoeElELmdldFB1YklkTGl0ZXJhbCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBub3RhdGlvbkRlY2w7Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBzY2FuRW50aXR5VmFsdWUoYm9vbGVhbiBzaW5nbGUpIHsKLQkJY2hhciBxY2hhciA9IHNpbmdsZSA/ICdcJycgOiAnXCInOwotCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQljb250ZW50U3RyaW5nLnNraXBUb0NoYXIocWNoYXIsIGZhbHNlKTsKLQkJaW50IGxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQ7Ci0JCVN0cmluZyB2YWx1ZSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLy8KLQkvLyBbNzVdIEV4dGVybmFsSUQgOjo9ICdTWVNURU0nIFMgU3lzdGVtTGl0ZXJhbAotCS8vIHwgJ1BVQkxJQycgUyBQdWJpZExpdGVyYWwgUyBTeXN0ZW1MaXRlcmFsCi0JcHJpdmF0ZSBFeHRlcm5hbElEIHNjYW5FeHRlcm5hbElEKCkgewotCQlFeHRlcm5hbElEIHhJRCA9IG51bGw7Ci0JCWNoYXIgcWNoYXIgPSAnXCInOwotCQlpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKHN5c3RlbV9zdHJpbmcpKSB7Ci0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcJyc7Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpCi0JCQkJcWNoYXIgPSAnXCInOwotCi0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKHFjaGFyLCB0cnVlKTsKLQkJCWludCBsZW4gPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKSAtIHByZXZOb2RlT2Zmc2V0IC0gMTsKLQkJCVN0cmluZyBzeXN0ZW1JZCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzeXN0ZW1pZC4uLiIgKyBzeXN0ZW1JZCk7Ci0JCQl4SUQgPSBuZXcgRXh0ZXJuYWxJRChzeXN0ZW1JZCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKHB1YmxpY19zdHJpbmcpKSB7Ci0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcJyc7Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpCi0JCQkJcWNoYXIgPSAnXCInOwotCi0JCQkvLyBwdWJsaWNMaXRlcmFsCi0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKHFjaGFyLCB0cnVlKTsKLQkJCWludCBsZW4gPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKSAtIHByZXZOb2RlT2Zmc2V0IC0gMTsKLQkJCVN0cmluZyBwdWJsaWNJZCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCi0JCQkvLyBzeXN0ZW1MaXRlcmFsCi0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcJycsIHRydWUpKQotCQkJCXFjaGFyID0gJ1wnJzsKLQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCInLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcIic7Ci0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKHFjaGFyLCB0cnVlKTsKLQkJCWxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQgLSAxOwotCi0JCQlpZiAobGVuID4gMCkgewotCQkJCVN0cmluZyBzeXN0ZW1JZCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJCXhJRCA9IG5ldyBFeHRlcm5hbElEKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl4SUQgPSBuZXcgRXh0ZXJuYWxJRChwdWJsaWNJZCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHhJRDsKLQl9Ci0KLQkvLwotCS8vIFs4M10gUHVibGljSUQgOjo9ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsCi0JLy8KLQotCS8vIGRtdyAxMS8xNSBwcml2YXRlIG1ldGhvZCBuZXZlciByZWFkIGxvY2FsbHkKLQkvLyBUT0RPOiBjaGFuZ2UgdG8gcHJpdmF0ZSBpZiB1c2VkLCBvdGhlcndpc2Ugc2hvdWxkIGJlIHJlbW92ZWQKLQlTdHJpbmcgc2NhblB1YmxpY0lEKCkgewotCQlTdHJpbmcgcElEID0gbnVsbDsKLQkJaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhwdWJsaWNfc3RyaW5nKSkgewotCQkJaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJcmV0dXJuIHBJRDsKLQkJCX0KLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFRvQ2hhcignICcsIHRydWUpOwotCQkJaW50IGxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQlwSUQgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJfQotCi0JCXJldHVybiBwSUQ7Ci0JfQotCi0JLy8KLQkvLyBNYWluCi0JLy8KLQotCS8qKiBNYWluIHByb2dyYW0gZW50cnkgcG9pbnQuICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCi0JCS8vIGlzIHRoZXJlIGFueXRoaW5nIHRvIGRvPwotCQlpZiAoYXJndi5sZW5ndGggPT0gMCkgewotCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCX0KLQotCQkvLyBEVERTY2FubmVyIHNjID0gbmV3IERURFNjYW5uZXIoYXJndlswXSk7Ci0JCURURFNjYW5uZXIgc2MgPSBuZXcgRFREU2Nhbm5lcigiaGVsbG8uZHRkIiwgIiBnaWYgU1lTVEVNIFwiR0lGIEZpbGVcIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJTm90YXRpb25EZWNsIG4gPSBzYy5zY2FuTm90YXRpb25EZWNsKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTm9hdGlvbiBOYW1lOiAiICsgbi5nZXROb2RlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN5c3RlbUlkOiAiICsgbi5nZXRTeXN0ZW1JZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkJLy8gQXR0cmlidXRlcwotCQkvLyBWZWN0b3IgbGlzdHMgPSBzYy5zY2FuQXR0bGlzdERlY2woKTsKLQkJLy8gc2MucHJpbnRBdHRMaXN0KGxpc3RzKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNNOiAiICsgc2Muc2NhbkNvbnRlbnRNb2RlbCgpKTsKLQotCX0gLy8gbWFpbihTdHJpbmdbXSkKLQotCS8qKgotCSAqIEdldHMgdGhlIGVycm9yU3RyaW5nCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvclN0cmluZygpIHsKLQkJcmV0dXJuIGVycm9yU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVycm9yU3RyaW5nCi0JICogCi0JICogQHBhcmFtIGVycm9yU3RyaW5nCi0JICogICAgICAgICAgICBUaGUgZXJyb3JTdHJpbmcgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JTdHJpbmcoU3RyaW5nIGVycm9yU3RyaW5nKSB7Ci0JCXRoaXMuZXJyb3JTdHJpbmcgPSBlcnJvclN0cmluZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RlY2xOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EZWNsTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjIzMDZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RlY2xOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGNsYXNzIERlY2xOb2RlIHsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBJTlZBTElEID0gLTE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRUxFTUVOVCA9IDE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQVRUTElTVCA9IDI7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRU5USVRZID0gMzsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBJTlRFUk5BTF9FTlRJVFkgPSA0OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVYVEVSTkFMX0VOVElUWSA9IDU7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgSU5URVJOQUxfR0VORVJBTF9FTlRJVFkgPSA2OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IElOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFkgPSA3OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVYVEVSTkFMX0dFTkVSQUxfRU5USVRZID0gODsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBFWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZID0gOTsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBQQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRSA9IDEwOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IE5PVEFUSU9OID0gMTE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQ09NTUVOVCA9IDEyOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgU1RBUlRfRFREID0gMjE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRU5EX0RURCA9IDIyOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IFNUQVJUX0VOVElUWV9EVEQgPSAyMzsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBFTkRfRU5USVRZX0RURCA9IDI0OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVSUk9SID0gMjU7Ci0KLQlwdWJsaWMgaW50IHR5cGUgPSBJTlZBTElEOwotCXByaXZhdGUgU3RyaW5nIGRlY2xOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBjb250ZW50U3RyaW5nID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotCi0JLy8KLQkvLyBDb25zdGFudHMKLQkvLwotCi0JLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCi0JcHVibGljIERlY2xOb2RlKGludCB0eXBlKSB7Ci0JCXRoaXMobnVsbCwgdHlwZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIERlY2xOb2RlKFN0cmluZyBuYW1lLCBpbnQgdHlwZSwgU3RyaW5nIGNvbnRlbnRTdHJpbmcpIHsKLQkJdGhpcy5kZWNsTmFtZSA9IG5hbWU7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMuY29udGVudFN0cmluZyA9IGNvbnRlbnRTdHJpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWNsTmFtZSgpIHsKLQkJcmV0dXJuIGRlY2xOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlY2xOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWRlY2xOYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRTdHJpbmcoKSB7Ci0JCXJldHVybiBjb250ZW50U3RyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRTdHJpbmcoU3RyaW5nIGNvbnRlbnQpIHsKLQkJdGhpcy5jb250ZW50U3RyaW5nID0gY29udGVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKLQkJdGhpcy5jb21tZW50ID0gY29tbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQotCXsKLQkJcmV0dXJuICJOb2RlIE5hbWU6ICIgKyBkZWNsTmFtZSArICIgVHlwZTogIiArIHR5cGUgKyAiIENvbnRlbnRTdHJpbmc6ICIgKyBjb250ZW50U3RyaW5nOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbGVtZW50RGVjbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRWxlbWVudERlY2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1Yzc3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbGVtZW50RGVjbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEVsZW1lbnREZWNsIGV4dGVuZHMgQmFzZU5vZGUgewotCUNNTm9kZSBjb250ZW50TW9kZWxOb2RlID0gbnVsbDsKLQotCXB1YmxpYyBFbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFREKSB7Ci0JCXRoaXMobmFtZSwgb3duZXJEVEQsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFRELCBTdHJpbmcgY29tbWVudCwgRXJyb3JNZXNzYWdlIGVycm9yTWVzc2FnZSkgewotCQlzdXBlcihuYW1lLCBvd25lckRURCwgY29tbWVudCwgZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlIGdldENvbnRlbnRNb2RlbE5vZGUoKSB7Ci0JCXJldHVybiBjb250ZW50TW9kZWxOb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRNb2RlbE5vZGUoQ01Ob2RlIGNtbm9kZSkgewotCQljb250ZW50TW9kZWxOb2RlID0gY21ub2RlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRW50aXR5RGVjbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRW50aXR5RGVjbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njg4NzdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0VudGl0eURlY2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5RGVjbCBleHRlbmRzIEJhc2VOb2RlIHsKLQlib29sZWFuIGlzUGFyYW1ldGVyID0gZmFsc2U7Ci0JU3RyaW5nIGV4cGFuZGVkVmFsdWUgPSBudWxsOyAvLyBBbHdheXMgPHZhcj5udWxsPC92YXI+IGZvciBleHRlcm5hbAotCQkJCQkJCQkJLy8gRW50aXRpZXMKLQlTdHJpbmcgdmFsdWUgPSBudWxsOyAvLyBBbHdheXMgPHZhcj5udWxsPC92YXI+IGZvciBleHRlcm5hbCBFbnRpdGllcwotCUV4dGVybmFsSUQgZXh0ZXJuYWxJRCA9IG51bGw7IC8vIEFsd2F5cyA8dmFyPm51bGw8L3Zhcj4gZm9yIGludGVybmFsCi0JCQkJCQkJCQkvLyBFbnRpdGllcwotCVN0cmluZyBuZGF0YSA9IG51bGw7IC8vIEFsd2F5cyA8dmFyPm51bGw8L3Zhcj4gZm9yIGludGVybmFsIEVudGl0aWVzCi0KLQlib29sZWFuIHBhcnNlZCA9IGZhbHNlOwotCURURFBhcnNlciBkdGQgPSBudWxsOyAvLyBBbHdheXMgbnVsbCwgZXhjZXB0IHdoZW4gaXQgaGFzIGJlZW4gcGFyc2VkLgotCi0JYm9vbGVhbiBlbnRpdHlSZWZlcmVuY2VkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgaW50ZXJuYWwgRW50aXRpZXMuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIE5hbWUgb2YgdGhpcyBFbnRpdHkuCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgWE1MLWVuY29kZWQgdmFsdWUgdGhhdCB3YXMgZGlyZWN0bHkgYXNzaWduZWQgdG8gdGhlCi0JICogICAgICAgICAgICBFbnRpdHkuCi0JICogQHBhcmFtIGlzUGFyYW1ldGVyCi0JICogICAgICAgICAgICA9dHJ1ZSBpZiBhIHBhcmFtZXRlciBFbnRpdHk7IG90aGVyd2lzZSA9ZmFsc2UuCi0JICovCi0JcHVibGljIEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGlzUGFyYW1ldGVyKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFRELCBudWxsLCBudWxsKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmlzUGFyYW1ldGVyID0gaXNQYXJhbWV0ZXI7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIGV4dGVybmFsIEVudGl0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBOYW1lIG9mIHRoZSBFbnRpdHkuCi0JICogQHBhcmFtIGV4dGVybmFsSUQKLQkgKiAgICAgICAgICAgIFRoZSByZWZlcmVuY2UocykgdG8gdGhlIGV4dGVybmFsIGVudGl0eSB0byByZXRyaWV2ZS4KLQkgKiBAcGFyYW0gaXNQYXJhbWV0ZXIKLQkgKiAgICAgICAgICAgID10cnVlIGlmIGEgcGFyYW1ldGVyIEVudGl0eTsgb3RoZXJ3aXNlID1mYWxzZS4KLQkgKiBAcGFyYW0gbmRhdGEKLQkgKiAgICAgICAgICAgIFRoZSBub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGJpbmFyeSBFbnRpdHksIG9yIDx2YXI+bnVsbDwvdmFyPgotCSAqICAgICAgICAgICAgaWYgdGhlIEVudGl0eSBpcyBhIHRleHQgRW50aXR5LgotCSAqIEBzZWUgc2F4LkV4dGVybmFsSUQKLQkgKi8KLQlwdWJsaWMgRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFRELCBFeHRlcm5hbElEIGV4dGVybmFsSUQsIGJvb2xlYW4gaXNQYXJhbWV0ZXIsIFN0cmluZyBuZGF0YSkgewotCQlzdXBlcihuYW1lLCBvd25lckRURCwgbnVsbCwgbnVsbCk7Ci0JCXRoaXMuZXh0ZXJuYWxJRCA9IGV4dGVybmFsSUQ7Ci0JCXRoaXMuaXNQYXJhbWV0ZXIgPSBpc1BhcmFtZXRlcjsKLQkJdGhpcy5uZGF0YSA9IG5kYXRhOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIEVudGl0eSBpcyBhIHBhcmFtZXRlciBFbnRpdHkuCi0JICogCi0JICogQHJldHVybiA9dHJ1ZSBpZiBhbiBpbnRlcm5hbCBwYXJhbWV0ZXIgRW50aXR5OyBvdGhlcndpc2UgPWZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyKCkgewotCQlyZXR1cm4gdGhpcy5pc1BhcmFtZXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIEVudGl0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBYTUwtZW5jb2RlZCB2YWx1ZSB0aGF0IHdhcyBkaXJlY3RseSBhc3NpZ25lZCB0byB0aGUKLQkgKiAgICAgICAgIGludGVybmFsIEVudGl0eTsgb3RoZXJ3aXNlLCA8dmFyPm51bGw8L3Zhcj4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbnRpdHlSZWZlcmVuY2VkKCkgewotCQlyZXR1cm4gZW50aXR5UmVmZXJlbmNlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbnRpdHlSZWZlcmVuY2VkKGJvb2xlYW4gcmVmZXJlbmNlKSB7Ci0JCWVudGl0eVJlZmVyZW5jZWQgPSByZWZlcmVuY2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGUgTm90YXRpb24uIEEgc3lzdGVtIGlkZW50aWZpZXIgaXMgYQotCSAqIFVSSSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gcmV0cmlldmUgYW4gZXh0ZXJuYWwgZW50aXR5J3MgY29udGVudC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzeXN0ZW0gaWRlbnRpZmllciwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZSBpZGVudGlmaWVyIGlzCi0JICogICAgICAgICBub3QgZGVmaW5lZC4KLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElEI2dldFN5c3RlbUxpdGVyYWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlpZiAoZXh0ZXJuYWxJRCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UKLQkJCXJldHVybiB0aGlzLmV4dGVybmFsSUQuZ2V0U3lzdGVtTGl0ZXJhbCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSBOb3RhdGlvbi4gQSBzeXN0ZW0gaWRlbnRpZmllciBpcyBhCi0JICogVVJJLCB3aGljaCBtYXkgYmUgdXNlZCB0byByZXRyaWV2ZSBhbiBleHRlcm5hbCBlbnRpdHkncyBjb250ZW50LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGRlZmluZWQgYnkgRE9NLgotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZGVudGlmaWVyCi0JICogICAgICAgICAgICBUaGUgc3lzdGVtIGlkZW50aWZpZXIuCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZGVudGlmaWVyKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2V0U1lzdGVtSWQgLSBleHRlcm5hbElkOiAiICsgZXh0ZXJuYWxJRCk7Ci0JCXRoaXMuZXh0ZXJuYWxJRCA9IG5ldyBFeHRlcm5hbElEKHRoaXMuZXh0ZXJuYWxJRC5nZXRQdWJJZExpdGVyYWwoKSwgc3lzdGVtSWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIE5vdGF0aW9uLiBUaGlzIHZhbHVlIGlzIG9ubHkgdmFsaWQKLQkgKiBpZiB0aGUgaWRlbnRpZmllciBpcyBkZWZpbmVkIGFzIDx2YXI+cHVibGljPC92YXI+IChhcyBvcHBvc2VkIHRvCi0JICogPHZhcj5zeXN0ZW08L3Zhcj4pLiBQdWJsaWMgaWRlbnRpZmllcnMgbWF5IGJlIHVzZWQgdG8gdHJ5IHRvIGdlbmVyYXRlCi0JICogYW4gYWx0ZXJuYXRpdmUgVVJJIGluIG9yZGVyIHRvIHJldHJpZXZlIHRoZSBhbiBleHRlcm5hbCBlbnRpdGllcwotCSAqIGNvbnRlbnQuIElmIHJldHJpZXZhbCBmYWlscyB1c2luZyB0aGUgcHVibGljIGlkZW50aWZpZXIsIGFuIGF0dGVtcHQKLQkgKiBtdXN0IGJlIG1hZGUgdG8gcmV0cmlldmUgY29udGVudCB1c2luZyB0aGUgc3lzdGVtIGlkZW50aWZpZXIuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgZGVmaW5lZCBieSBET00uCi0JICogCi0JICogQHJldHVybiBUaGUgcHVibGljIGlkZW50aWZpZXIsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiB0aGUgaWRlbnRpZmllciBpcwotCSAqICAgICAgICAgbm90IGRlZmluZWQuCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCWlmIChleHRlcm5hbElEID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZQotCQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxJRC5nZXRQdWJJZExpdGVyYWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgTm90YXRpb24uIFRoaXMgdmFsdWUgaXMgb25seSB2YWxpZCBpZgotCSAqIHRoZSBpZGVudGlmaWVyIGlzIGRlZmluZWQgYXMgPHZhcj5wdWJsaWM8L3Zhcj4gKGFzIG9wcG9zZWQgdG8KLQkgKiA8dmFyPnN5c3RlbTwvdmFyPikuIFB1YmxpYyBpZGVudGlmaWVycyBtYXkgYmUgdXNlZCB0byB0cnkgdG8gZ2VuZXJhdGUKLQkgKiBhbiBhbHRlcm5hdGl2ZSBVUkkgaW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlIGFuIGV4dGVybmFsIGVudGl0aWVzCi0JICogY29udGVudC4gSWYgcmV0cmlldmFsIGZhaWxzIHVzaW5nIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgYW4gYXR0ZW1wdAotCSAqIG11c3QgYmUgbWFkZSB0byByZXRyaWV2ZSBjb250ZW50IHVzaW5nIHRoZSBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWRlbnRpZmllcgotCSAqICAgICAgICAgICAgVGhlIHB1YmxpYyBpZGVudGlmaWVyLgotCSAqIEBzZWUgI2dldFB1YmxpY0lkCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBwdWJsaWNJZGVudGlmaWVyKSB7Ci0JCXRoaXMuZXh0ZXJuYWxJRCA9IG5ldyBFeHRlcm5hbElEKHB1YmxpY0lkZW50aWZpZXIsIHRoaXMuZXh0ZXJuYWxJRC5nZXRTeXN0ZW1MaXRlcmFsKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4dGVybmFsIElEIG9mIHRoaXMgRW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHJlZmVyZW5jZShzKSB0byB0aGUgZXh0ZXJuYWwgZW50aXR5IHRvIHJldHJpZXZlOyBvdGhlcndpc2UsCi0JICogICAgICAgICA8dmFyPm51bGw8L3Zhcj4uCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyBFeHRlcm5hbElEIGdldEV4dGVybmFsSUQoKSB7Ci0JCXJldHVybiB0aGlzLmV4dGVybmFsSUQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZW50aXR5IHZhbHVlIGlzIGV4dGVybmFsLgotCSAqIAotCSAqIEByZXR1cm4gPXRydWUgaWYgZW50aXR5IGlzIGV4dGVybmFsOyBvdGhlcndpc2UsID1mYWxzZS4KLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElECi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbCgpIHsKLQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxJRCAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dGVybmFsIGJpbmFyeSBFbnRpdHksCi0JICogICAgICAgICBvdGhlcndpc2UsIDx2YXI+bnVsbDwvdmFyPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5uZGF0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb3RhdGlvbihTdHJpbmcgbmRhdGEpIHsKLQkJdGhpcy5uZGF0YSA9IG5kYXRhOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dGVybmFsIGJpbmFyeSBFbnRpdHksCi0JICogICAgICAgICBvdGhlcndpc2UsIDx2YXI+bnVsbDwvdmFyPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmRhdGE7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgZGVmaW5lZCBieSBET00uCi0JICogCi0JICogcHVibGljIHZvaWQgc2V0Tm90YXRpb25OYW1lKFN0cmluZyBhcmcpIHsgdGhpcy5uZGF0YSA9IGFyZzsgfQotCSAqLwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZXJlIGlzIGEgbm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZW50aXR5IHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gPXRydWUgaWYgdGhlIGV4dGVybmFsIGJpbmFyeSBlbnRpdHkgY29udGFpbnMgYSBub3RhdGlvbjsKLQkgKiAgICAgICAgIG90aGVyd2lzZSwgPWZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLm5kYXRhICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHMpIHsKLQkJdGhpcy52YWx1ZSA9IHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyc2VkKGJvb2xlYW4gcCkgewotCQl0aGlzLnBhcnNlZCA9IHA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0UGFyc2VkKCkgewotCQlyZXR1cm4gdGhpcy5wYXJzZWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlQb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlQb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YmQxZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRW50aXR5UG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5UG9vbCB7Ci0JcHJpdmF0ZSBIYXNodGFibGUgbV9lbnRpdHkgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBIYXNodGFibGUgbV9wYXJhID0gbmV3IEhhc2h0YWJsZSgpOyAvLyBwYXJhbWV0ZXIgcmVmZXJlbmNlcwotCi0JcHVibGljIEVudGl0eVBvb2woKSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JCVN0cmluZyBuYW1lID0gZW50aXR5LmdldE5vZGVOYW1lKCk7Ci0JCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXIoKSkgewotCQkJaWYgKG1fcGFyYS5jb250YWluc0tleShuYW1lKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQltX3BhcmEucHV0KG5hbWUsIGVudGl0eSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobV9lbnRpdHkuY29udGFpbnNLZXkobmFtZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJbV9lbnRpdHkucHV0KG5hbWUsIGVudGl0eSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIEVudGl0eURlY2wgcmVmZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChFbnRpdHlEZWNsKSBtX2VudGl0eS5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIEVudGl0eURlY2wgcmVmZXJQYXJhKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoRW50aXR5RGVjbCkgbV9wYXJhLmdldChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gPENPREU+RW51bWVyYXRpb248L0NPREU+IG9mIDxDT0RFPkVudGl0eURlY2w8L0NPREU+LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwY3NlLndzdC5kdGQucGFyc2VyLkVudGl0eURlY2wKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7Ci0JCXJldHVybiBtX2VudGl0eS5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiA8Q09ERT5FbnVtZXJhdGlvbjwvQ09ERT4gb2YgPENPREU+RW50aXR5RGVjbDwvQ09ERT4gZm9yCi0JICogcGFyYW1ldGVyIGVudGl0aWVzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwY3NlLndzdC5kdGQucGFyc2VyLkVudGl0eURlY2wKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gcGFyYW1ldGVyRW50aXR5RWxlbWVudHMoKSB7Ci0JCXJldHVybiBtX3BhcmEuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgRFREI2dldEVudGl0aWVzKCk7Ci0JICovCi0JSGFzaHRhYmxlIGdldEVudGl0eUhhc2goKSB7Ci0JCXJldHVybiB0aGlzLm1fZW50aXR5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0Vycm9yTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRXJyb3JNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMTIzNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRXJyb3JNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBFcnJvck1lc3NhZ2UgewotCXByaXZhdGUgaW50IGVycm9yTGluZSwgZXJyb3JDb2x1bW4sIHNldmVyaXR5OwotCXByaXZhdGUgU3RyaW5nIGVycm9yU3RyaW5nOwotCi0KLQlwdWJsaWMgRXJyb3JNZXNzYWdlKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3IpIHsKLQkJZXJyb3JTdHJpbmcgPSBlcnJvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShpbnQgc2V2ZXJpdHkpIHsKLQkJdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5KFN0cmluZyBzZXZlcml0eSkgewotCQlpZiAoc2V2ZXJpdHkgPT0gIndhcm5pbmciKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuc2V2ZXJpdHkgPSAwOwotCQl9Ci0JCWVsc2UgaWYgKHNldmVyaXR5ID09ICJlcnJvciIpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5zZXZlcml0eSA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoc2V2ZXJpdHkgPT0gImZhdGFsIikgeyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnNldmVyaXR5ID0gMjsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yTGluZShpbnQgbGluZSkgewotCQllcnJvckxpbmUgPSBsaW5lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yQ29sdW1uKGludCBjb2x1bW4pIHsKLQkJZXJyb3JDb2x1bW4gPSBjb2x1bW47Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBlcnJvclN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFcnJvckxpbmUoKSB7Ci0JCXJldHVybiBlcnJvckxpbmU7Ci0JfQotCi0JcHVibGljIGludCBnZXRFcnJvckNvbHVtbigpIHsKLQkJcmV0dXJuIGVycm9yQ29sdW1uOwotCX0KLQotCXByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0ID0gLTE7Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvclN0YXJ0T2Zmc2V0KGludCBzdGFydCkgewotCQlzdGFydE9mZnNldCA9IHN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RXJyb3JTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIHN0YXJ0T2Zmc2V0OwotCX0KLQotCXByaXZhdGUgaW50IGVuZE9mZnNldCA9IC0xOwotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JFbmRPZmZzZXQoaW50IGVuZCkgewotCQllbmRPZmZzZXQgPSBlbmQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRFcnJvckVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGVuZE9mZnNldDsKLQl9Ci0KLQotCU9iamVjdCBvYmplY3Q7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBjbG9zZXN0IG9iamVjdCB0byB0aGUgZXJyb3IuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBvYmplY3QuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBjbG9zZXN0IG9iamVjdCB0byB0aGUgZXJyb3IuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCB2KSB7Ci0JCXRoaXMub2JqZWN0ID0gdjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkZE5ld0Vycm9yTWVzc2FnZUxpbmUoU3RyaW5nIG5ld0xpbmUpIHsKLQkJZXJyb3JTdHJpbmcgKz0gIlxuIiArIG5ld0xpbmU7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FeHRlcm5hbElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FeHRlcm5hbElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYjAwOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRXh0ZXJuYWxJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbElEIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVF9TWVNURU0gPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUX1BVQkxJQyA9IDE7Ci0KLQlpbnQgdHlwZSA9IFRfUFVCTElDOwotCVN0cmluZyBwdWJsaWNJRCA9IG51bGw7Ci0JU3RyaW5nIHN5c3RlbUlEID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBzeXN0ZW0gSURzLgotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JRAotCSAqICAgICAgICAgICAgVVJJLCB3aGljaCBtYXkgYmUgdXNlZCB0byByZXRyaWV2ZSBhbiBleHRlcm5hbCBlbnRpdHkncwotCSAqICAgICAgICAgICAgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgRXh0ZXJuYWxJRChTdHJpbmcgc3lzdGVtSUQpIHsKLQkJdGhpcy50eXBlID0gVF9TWVNURU07Ci0JCXRoaXMucHVibGljSUQgPSBudWxsOwotCQl0aGlzLnN5c3RlbUlEID0gc3lzdGVtSUQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIHB1YmxpYyBhbmQgc3lzdGVtIElEcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSUQKLQkgKiAgICAgICAgICAgIElkZW50aWZpZXIgdG8gYmUgdXNlZCB0byB0cnkgdG8gZ2VuZXJhdGUgYW4gYWx0ZXJuYXRpdmUgVVJJCi0JICogICAgICAgICAgICBpbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgZXh0ZXJuYWwgZW50aXR5J3MgY29udGVudCwgb3IKLQkgKiAgICAgICAgICAgIDx2YXI+bnVsbDwvdmFyPiBpZiBhIHN5c3RlbSBpZGVudGl0aWVyIGlzIHRvIGJlCi0JICogICAgICAgICAgICBjb25zdHJ1Y3RlZC4KLQkgKiBAcGFyYW0gc3lzdGVtSUQKLQkgKiAgICAgICAgICAgIFVSSSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gcmV0cmlldmUgYW4gZXh0ZXJuYWwgZW50aXR5J3MKLQkgKiAgICAgICAgICAgIGNvbnRlbnQuCi0JICovCi0JcHVibGljIEV4dGVybmFsSUQoU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQpIHsKLQkJdGhpcy50eXBlID0gVF9QVUJMSUM7Ci0JCXRoaXMucHVibGljSUQgPSBwdWJsaWNJRDsKLQkJdGhpcy5zeXN0ZW1JRCA9IHN5c3RlbUlEOwotCQlpZiAobnVsbCA9PSB0aGlzLnB1YmxpY0lEKQotCQkJdGhpcy50eXBlID0gVF9TWVNURU07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpZiB0aGlzIGV4dGVybmFsIElEIGlzIGEgc3lzdGVtIElEIChvciBwdWJsaWMgSUQpLgotCSAqIAotCSAqIEByZXR1cm4gU3lzdGVtIElEPXRydWUsIFB1YmxpYyBJRD1mYWxzZS4KLQkgKiBAc2VlICNpc1B1YmxpYwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3lzdGVtKCkgewotCQlyZXR1cm4gdGhpcy50eXBlID09IFRfU1lTVEVNOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaWYgdGhpcyBleHRlcm5hbCBJRCBpcyBhIHB1YmxpYyBJRCAob3Igc3lzdGVtIElEKS4KLQkgKiAKLQkgKiBAcmV0dXJuIFB1YmxpYyBJRD10cnVlLCBTeXN0ZW0gSUQ9ZmFsc2UuCi0JICogQHNlZSAjaXNTeXN0ZW0KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKLQkJcmV0dXJuIHRoaXMudHlwZSA9PSBUX1BVQkxJQzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGlzIGV4dGVybmFsIElELiBBIHN5c3RlbSBpZGVudGlmaWVyCi0JICogaXMgYSBVUkksIHdoaWNoIG1heSBiZSB1c2VkIHRvIHJldHJpZXZlIGFuIGV4dGVybmFsIGVudGl0eSdzIGNvbnRlbnQuCi0JICogCi0JICogQHJldHVybiBUaGUgc3lzdGVtIGlkZW50aWZpZXIsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiB0aGUgaWRlbnRpZmllciBpcwotCSAqICAgICAgICAgbm90IGRlZmluZWQuCi0JICogQHNlZSAjZ2V0UHViaWRMaXRlcmFsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1MaXRlcmFsKCkgewotCQlyZXR1cm4gdGhpcy5zeXN0ZW1JRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGlzIGV4dGVybmFsIElELiBUaGlzIHZhbHVlIGlzIG9ubHkKLQkgKiB2YWxpZCBpZiB0aGUgaWRlbnRpZmllciBpcyBkZWZpbmVkIGFzIDx2YXI+cHVibGljPC92YXI+IChhcyBvcHBvc2VkIHRvCi0JICogPHZhcj5zeXN0ZW08L3Zhcj4pLiBQdWJsaWMgaWRlbnRpZmllcnMgbWF5IGJlIHVzZWQgdG8gdHJ5IHRvIGdlbmVyYXRlCi0JICogYW4gYWx0ZXJuYXRpdmUgVVJJIGluIG9yZGVyIHRvIHJldHJpZXZlIGFuIGV4dGVybmFsIGVudGl0eSdzIGNvbnRlbnQuCi0JICogSWYgcmV0cmlldmFsIGZhaWxzIHVzaW5nIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgYW4gYXR0ZW1wdCBtdXN0IGJlIG1hZGUKLQkgKiB0byByZXRyaWV2ZSBjb250ZW50IHVzaW5nIHRoZSBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwdWJsaWMgaWRlbnRpZmllciwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZSBpZGVudGlmaWVyIGlzCi0JICogICAgICAgICBub3QgZGVmaW5lZC4KLQkgKiBAc2VlICNnZXRTeXN0ZW1MaXRlcmFsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJJZExpdGVyYWwoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY0lEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBleHRlcm5hbCBJRCBpbiB0aGUgZm9ybWF0IGl0IHdhcyBkZWNsYXJlZDogPENPREU+U1lTVEVNCi0JICogJnF1b3Q7PFZBUj5zeXN0ZW1JRDwvVkFSPiZxdW90OzwvQ09ERT4gb3IgPENPREU+UFVCTElDICZxdW90OzxWQVI+cHVibGljSUQ8L1ZBUj4mcXVvdDsKLQkgKiAmcXVvdDs8VkFSPnN5c3RlbUlEPC9WQVI+JnF1b3Q7PC9DT0RFPi4KLQkgKiAKLQkgKiBAcmV0dXJuIFhNTCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50IG9mIHRoZSBleHRlcm5hbCBJRCAobmV2ZXIKLQkgKiAgICAgICAgIDx2YXI+bnVsbDwvdmFyPikuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJldDsKLQkJaWYgKGlzU3lzdGVtKCkpIHsKLQkJCXJldCA9ICJTWVNURU0gXCIiICsgZ2V0U3lzdGVtTGl0ZXJhbCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSBpZiAobnVsbCAhPSBnZXRTeXN0ZW1MaXRlcmFsKCkpIHsKLQkJCXJldCA9ICJQVUJMSUMgXCIiICsgZ2V0UHViSWRMaXRlcmFsKCkgKyAiXCIgXCIiICsgZ2V0U3lzdGVtTGl0ZXJhbCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQllbHNlIHsKLQkJCXJldCA9ICJQVUJMSUMgXCIiICsgZ2V0UHViSWRMaXRlcmFsKCkgKyAiXCIiOyAvLyBmb3IgTk9UQVRJT04gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIEV4dGVybmFsSUQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlFeHRlcm5hbElEIGVpZCA9IChFeHRlcm5hbElEKSBvYmo7Ci0JCWlmICghKChlaWQucHVibGljSUQgPT0gbnVsbCAmJiB0aGlzLnB1YmxpY0lEID09IG51bGwpIHx8IGVpZC5wdWJsaWNJRCAhPSBudWxsICYmIGVpZC5wdWJsaWNJRC5lcXVhbHModGhpcy5wdWJsaWNJRCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoISgoZWlkLnN5c3RlbUlEID09IG51bGwgJiYgdGhpcy5zeXN0ZW1JRCA9PSBudWxsKSB8fCBlaWQuc3lzdGVtSUQgIT0gbnVsbCAmJiBlaWQuc3lzdGVtSUQuZXF1YWxzKHRoaXMuc3lzdGVtSUQpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgcmV0dmFsID0gMDsKLQkJaWYgKHB1YmxpY0lEICE9IG51bGwpCi0JCQlyZXR2YWwgPSBwdWJsaWNJRC5oYXNoQ29kZSgpOwotCQlpZiAoc3lzdGVtSUQgIT0gbnVsbCkKLQkJCXJldHZhbCArPSBzeXN0ZW1JRC5oYXNoQ29kZSgpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvTm90YXRpb25EZWNsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9Ob3RhdGlvbkRlY2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxNTgwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9Ob3RhdGlvbkRlY2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLS8qKgotICogTm90YXRpb25zIGFyZSBob3cgdGhlIERvY3VtZW50IFR5cGUgRGVzY3JpcHRpb24gKERURCkgcmVjb3JkcyBoaW50cyBhYm91dAotICogdGhlIGZvcm1hdCBvZiBhbiBYTUwgInVucGFyc2VkIGVudGl0eSIgLS0gaW4gb3RoZXIgd29yZHMsIG5vbi1YTUwgZGF0YQotICogYm91bmQgdG8gdGhpcyBkb2N1bWVudCB0eXBlLCB3aGljaCBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBjb25zdWx0Ci0gKiB3aGVuIG1hbmlwdWxhdGluZyB0aGUgZG9jdW1lbnQuIEEgTm90YXRpb24gcmVwcmVzZW50cyBhIG5hbWUtdmFsdWUgcGFpciwKLSAqIHdpdGggaXRzIG5vZGVOYW1lIGJlaW5nIHNldCB0byB0aGUgZGVjbGFyZWQgbmFtZSBvZiB0aGUgbm90YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RhdGlvbkRlY2wgZXh0ZW5kcyBCYXNlTm9kZSB7Ci0JLyoqIFB1YmxpYyBpZGVudGlmaWVyLiAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCi0JLyoqIFN5c3RlbSBpZGVudGlmaWVyLiAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCi0JLy8KLQkvLyBDb25zdHJ1Y3RvcnMKLQkvLwotCi0JLyoqIEZhY3RvcnkgY29uc3RydWN0b3IuICovCi0JcHVibGljIE5vdGF0aW9uRGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFREKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFREKTsKLQl9Ci0KLQkvLwotCS8vIE5vdGF0aW9uIG1ldGhvZHMKLQkvLwotCi0JLyoqCi0JICogVGhlIFB1YmxpYyBJZGVudGlmaWVyIGZvciB0aGlzIE5vdGF0aW9uLiBJZiBubyBwdWJsaWMgaWRlbnRpZmllciB3YXMKLQkgKiBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiBwdWJsaWNJZDsKLQl9IC8vIGdldFB1YmxpY0lkKCk6U3RyaW5nCi0KLQkvKioKLQkgKiBUaGUgU3lzdGVtIElkZW50aWZpZXIgZm9yIHRoaXMgTm90YXRpb24uIElmIG5vIHN5c3RlbSBpZGVudGlmaWVyIHdhcwotCSAqIHNwZWNpZmllZCwgdGhpcyB3aWxsIGJlIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHN5c3RlbUlkOwotCX0gLy8gZ2V0U3lzdGVtSWQoKTpTdHJpbmcKLQotCS8vCi0JLy8gUHVibGljIG1ldGhvZHMKLQkvLwotCi0JLyoqCi0JICogTk9OLURPTTogVGhlIFB1YmxpYyBJZGVudGlmaWVyIGZvciB0aGlzIE5vdGF0aW9uLiBJZiBubyBwdWJsaWMKLQkgKiBpZGVudGlmaWVyIHdhcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBpZCkgewotCQlwdWJsaWNJZCA9IGlkOwotCX0gLy8gc2V0UHVibGljSWQoU3RyaW5nKQotCi0JLyoqCi0JICogTk9OLURPTTogVGhlIFN5c3RlbSBJZGVudGlmaWVyIGZvciB0aGlzIE5vdGF0aW9uLiBJZiBubyBzeXN0ZW0KLQkgKiBpZGVudGlmaWVyIHdhcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBpZCkgewotCQlzeXN0ZW1JZCA9IGlkOwotCX0gLy8gc2V0U3lzdGVtSWQoU3RyaW5nKQotCi19IC8vIGNsYXNzIE5vdGF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvU3RyaW5nUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9TdHJpbmdQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5Yjc0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9TdHJpbmdQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi0vKioKLSAqIFJlYWRlciBmb3IgcHJvY2Vzc2luZy9wYXJzaW5nIHhtbCBzdHJpbmcKLSAqIAotICogQHZlcnNpb24KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ1BhcnNlciB7Ci0JU3RyaW5nIGZEYXRhID0gbnVsbDsKLQlpbnQgZkVuZE9mZnNldDsKLQlpbnQgZk1vc3RSZWNlbnRDaGFyOwotCWludCBmQ3VycmVudE9mZnNldDsKLQlib29sZWFuIGZDYWxsZWRDaGFyUHJvcEluaXQgPSBmYWxzZTsKLQotCXB1YmxpYyBTdHJpbmdQYXJzZXIoU3RyaW5nIGRhdGEpIHsKLQkJZkRhdGEgPSBkYXRhOwotCQlmQ3VycmVudE9mZnNldCA9IDA7Ci0JCWZFbmRPZmZzZXQgPSBmRGF0YS5sZW5ndGgoKTsKLQkJZk1vc3RSZWNlbnRDaGFyID0gZkVuZE9mZnNldCA9PSAwID8gLTEgOiBmRGF0YS5jaGFyQXQoMCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZEYXRhLnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgewotCQlyZXR1cm4gZkRhdGE7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZW1haW5pbmdTdHJpbmcoKSB7Ci0JCXJldHVybiBmRGF0YS5zdWJzdHJpbmcoZ2V0Q3VycmVudE9mZnNldCgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEN1cnJlbnRPZmZzZXQoKSB7Ci0JCXJldHVybiBmQ3VycmVudE9mZnNldDsKLQl9Ci0KLQkvLwotCS8vCi0JcHVibGljIGludCBsb2FkTmV4dENoYXIoKSB7Ci0JCWlmICgrK2ZDdXJyZW50T2Zmc2V0ID49IGZFbmRPZmZzZXQpIHsKLQkJCWZNb3N0UmVjZW50Q2hhciA9IC0xOwotCQl9Ci0JCWVsc2UgewotCQkJZk1vc3RSZWNlbnRDaGFyID0gZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gZk1vc3RSZWNlbnRDaGFyOwotCX0KLQkKLQlwdWJsaWMgaW50IGxvYWRQcmV2aW91c0NoYXIoKSB7Ci0JCWlmICgtLWZDdXJyZW50T2Zmc2V0IDwgMCkgCi0JCQlmTW9zdFJlY2VudENoYXIgPSAtMTsKLQkJZWxzZQotCQkJZk1vc3RSZWNlbnRDaGFyID0gZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0KTsKLQkJcmV0dXJuIGZNb3N0UmVjZW50Q2hhcjsKLQl9Ci0KLQkvLwotCS8vCi0JcHVibGljIGJvb2xlYW4gbG9va2luZ0F0Q2hhcihjaGFyIGNociwgYm9vbGVhbiBza2lwUGFzdENoYXIpIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlpZiAoY2ggIT0gY2hyKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHNraXBQYXN0Q2hhcikgewotCQkJaWYgKCsrZkN1cnJlbnRPZmZzZXQgPj0gZkVuZE9mZnNldCkgewotCQkJCWZNb3N0UmVjZW50Q2hhciA9IC0xOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZk1vc3RSZWNlbnRDaGFyID0gZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgYm9vbGVhbiBsb29raW5nQXRWYWxpZENoYXIoYm9vbGVhbiBza2lwUGFzdENoYXIpIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlpZiAoY2ggPCAweEQ4MDApIHsKLQkJCWlmIChjaCA8IDB4MjAgJiYgY2ggIT0gMHgwOSAmJiBjaCAhPSAweDBBICYmIGNoICE9IDB4MEQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoc2tpcFBhc3RDaGFyKSB7Ci0JCQkJaWYgKCsrZkN1cnJlbnRPZmZzZXQgPj0gZkVuZE9mZnNldCkgewotCQkJCQlmTW9zdFJlY2VudENoYXIgPSAtMTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZNb3N0UmVjZW50Q2hhciA9IGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGNoID4gMHhGRkZEKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGNoIDwgMHhEQzAwKSB7Ci0JCQlpZiAoZkN1cnJlbnRPZmZzZXQgKyAxID49IGZFbmRPZmZzZXQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQljaCA9IGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCArIDEpOwotCQkJaWYgKGNoIDwgMHhEQzAwIHx8IGNoID49IDB4RTAwMCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKCFza2lwUGFzdENoYXIpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZDdXJyZW50T2Zmc2V0Kys7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY2ggPCAweEUwMDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoc2tpcFBhc3RDaGFyKSB7Ci0JCQlpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JCQkJZk1vc3RSZWNlbnRDaGFyID0gLTE7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmTW9zdFJlY2VudENoYXIgPSBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vCi0JLy8KLQkvLwotCXB1YmxpYyBib29sZWFuIGxvb2tpbmdBdFNwYWNlKGJvb2xlYW4gc2tpcFBhc3RDaGFyKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJaWYgKGNoID4gMHgyMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGNoID09IDB4MjAgfHwgY2ggPT0gMHgwQSB8fCBjaCA9PSAweDBEIHx8IGNoID09IDB4MDkpIHsKLQkJCWlmIChza2lwUGFzdENoYXIpIHsKLQkJCQlsb2FkTmV4dENoYXIoKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgdm9pZCBza2lwVG9DaGFyKGNoYXIgY2hyLCBib29sZWFuIHNraXBQYXN0Q2hhcikgewotCQkvLwotCQkvLyBSRVZJU0lUIC0gdGhpcyB3aWxsIHNraXAgaW52YWxpZCBjaGFyYWN0ZXJzIHdpdGhvdXQgcmVwb3J0aW5nIHRoZW0uCi0JCS8vCi0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChjaCA9PSBjaHIpIHsKLQkJCQlpZiAoc2tpcFBhc3RDaGFyKSB7Ci0JCQkJCWxvYWROZXh0Q2hhcigpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoY2ggPT0gLTEpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIHNraXBzIHRvIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuCi0JICogaWYgPGNvZGU+c2tpcFBhc3RDaGFyPC9jb2RlPiBpcyB0cnVlLCB0aGUgcGFyc2VyIGlzCi0JICogaW5jcmVtZW50ZWQgcGFzdCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZSBjaGFyYWN0ZXIuCi0JICogVGhpcyBtZXRob2Qgc3RhcnRzIGF0IHRoZSBlbmQgb2YgdGhlIGNoYXJhY3RlciBkYXRhLCBhbmQKLQkgKiBtb3ZlcyBiYWNrd2FyZHMgdG8gZmluZCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZSBjaGFyYWN0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBza2lwVG9MYXN0T2ZDaGFyKGNoYXIgY2hyLCBib29sZWFuIHNraXBQYXN0Q2hhcikgewotCQlpbnQgY2ggPSAtMTsKLQkJCi0JCS8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mZnNldCB0byBzY2FuIGJhY2t3YXJkcy4KLQkJZkN1cnJlbnRPZmZzZXQgPSBmRW5kT2Zmc2V0OwotCQkKLQkJZG8gewotCQkJY2ggPSBsb2FkUHJldmlvdXNDaGFyKCk7Ci0JCQkKLQkJCWlmKGNoID09IC0xKQotCQkJCXJldHVybjsKLQkJCQotCQkJaWYgKGNoID09IGNocikgewotCQkJCWlmKHNraXBQYXN0Q2hhcikKLQkJCQkJbG9hZE5leHRDaGFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCX0gd2hpbGUodHJ1ZSk7Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0JcHVibGljIHZvaWQgc2tpcFBhc3RTcGFjZXMoKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJaWYgKGNoID09IC0xKSB7Ci0JCQkvLyBjaGFuZ2VSZWFkZXJzKCkuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCXJldHVybjsKLQkJfQotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGNoID4gMHgyMCB8fCAoY2ggIT0gMHgyMCAmJiBjaCAhPSAweDBBICYmIGNoICE9IDB4MDkgJiYgY2ggIT0gMHgwRCkpIHsKLQkJCQlmTW9zdFJlY2VudENoYXIgPSBjaDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2ggPSBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOwotCQl9Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0KLQlwdWJsaWMgdm9pZCBza2lwUGFzdE5hbWVBbmRQRVJlZmVyZW5jZShjaGFyIGZhc3RjaGVjaykgewotCQlpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0KLQkJaWYgKGNoICE9ICclJykgewotCQkJaWYgKGNoIDwgMHg4MCkgewotCQkJCWlmIChjaCA9PSAtMSB8fCBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQXNjaWlJbml0aWFsTmFtZUNoYXJbY2hdID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghZkNhbGxlZENoYXJQcm9wSW5pdCkgewotCQkJCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJCQkJZkNhbGxlZENoYXJQcm9wSW5pdCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmICgoWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0NoYXJGbGFnc1tjaF0gJiBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLkVfSW5pdGlhbE5hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQkJaWYgKGZhc3RjaGVjayA9PSBjaCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoY2ggPT0gJyUnIHx8IGNoID09ICc7JykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2tpcFBhc3ROYW1lKGNoYXIgZmFzdGNoZWNrKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJza2lwcGFzdE5hbWUgY2g6ICIgK2NoKTsKLQotCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQlpZiAoY2ggPT0gLTEgfHwgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0FzY2lpSW5pdGlhbE5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybjsKLQkJfQotCQllbHNlIHsKLQkJCWlmICghZkNhbGxlZENoYXJQcm9wSW5pdCkgewotCQkJCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJfQotCQkJaWYgKChYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQ2hhckZsYWdzW2NoXSAmIFhNTENoYXJhY3RlclByb3BlcnRpZXMuRV9Jbml0aWFsTmFtZUNoYXJGbGFnKSA9PSAwKQotCQkJCXJldHVybjsKLQkJfQotCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQkJaWYgKGZhc3RjaGVjayA9PSBjaCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0KLQlwdWJsaWMgdm9pZCBza2lwUGFzdE5tdG9rZW4oY2hhciBmYXN0Y2hlY2spIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGZhc3RjaGVjayA9PSBjaCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJY2ggPSBsb2FkTmV4dENoYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNraXBQYXN0Tm10b2tlbkFuZFBFUmVmZXJlbmNlKGNoYXIgZmFzdGNoZWNrKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChmYXN0Y2hlY2sgPT0gY2gpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGNoID09ICclJyB8fCBjaCA9PSAnOycpIHsKLQkJCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNoIDwgMHg4MCkgewotCQkJCWlmIChjaCA9PSAtMSB8fCBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQXNjaWlOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKCFmQ2FsbGVkQ2hhclByb3BJbml0KSB7Ci0JCQkJCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQkJCQlmQ2FsbGVkQ2hhclByb3BJbml0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKChYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQ2hhckZsYWdzW2NoXSAmIFhNTENoYXJhY3RlclByb3BlcnRpZXMuRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoID0gbG9hZE5leHRDaGFyKCk7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgYm9vbGVhbiBza2lwcGVkU3RyaW5nKGNoYXJbXSBzKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJaWYgKGNoICE9IHNbMF0pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoZkN1cnJlbnRPZmZzZXQgKyBzLmxlbmd0aCA+IGZFbmRPZmZzZXQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCArIGkpICE9IHNbaV0pCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZDdXJyZW50T2Zmc2V0ICs9IChzLmxlbmd0aCAtIDEpOwotCQlsb2FkTmV4dENoYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0JcHVibGljIGludCBzY2FuSW52YWxpZENoYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlsb2FkTmV4dENoYXIoKTsKLQkJcmV0dXJuIGNoOwotCX0KLQotCS8vCi0JLy8KLQkvLwotCS8qCi0JICogcHVibGljIGludCBzY2FuQ2hhclJlZihib29sZWFuIGhleCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGludCBjaCA9Ci0JICogZk1vc3RSZWNlbnRDaGFyOyBpZiAoY2ggPT0gLTEpIC8vIHJldHVybgotCSAqIGNoYW5nZVJlYWRlcnMoKS5zY2FuQ2hhclJlZihoZXgpOyByZXR1cm4gY2g7IGludCBudW0gPSAwOyBpZiAoaGV4KSB7IGlmCi0JICogKGNoID4gJ2YnIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaVhEaWdpdENoYXJbY2hdID09IDApIHJldHVybgotCSAqIFhNTEVudGl0eUhhbmRsZXIuQ0hBUlJFRl9SRVNVTFRfSU5WQUxJRF9DSEFSOyBudW0gPSBjaCAtIChjaCA8ICdBJyA/Ci0JICogJzAnIDogKGNoIDwgJ2EnID8gJ0EnIDogJ2EnKSAtIDEwKTsgfSBlbHNlIHsgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQotCSAqIHJldHVybiBYTUxFbnRpdHlIYW5kbGVyLkNIQVJSRUZfUkVTVUxUX0lOVkFMSURfQ0hBUjsgbnVtID0gY2ggLSAnMCc7IH0KLQkgKiBib29sZWFuIHRvb2JpZyA9IGZhbHNlOyB3aGlsZSAodHJ1ZSkgeyBjaCA9IGxvYWROZXh0Q2hhcigpOyBpZiAoY2ggPT0KLQkgKiAtMSkgcmV0dXJuIFhNTEVudGl0eUhhbmRsZXIuQ0hBUlJFRl9SRVNVTFRfU0VNSUNPTE9OX1JFUVVJUkVEOyBpZiAoaGV4KSB7Ci0JICogaWYgKGNoID4gJ2YnIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaVhEaWdpdENoYXJbY2hdID09IDApCi0JICogYnJlYWs7IH0gZWxzZSB7IGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgYnJlYWs7IH0gaWYgKGhleCkgeyBpbnQgZGlnID0KLQkgKiBjaCAtIChjaCA8ICdBJyA/ICcwJyA6IChjaCA8ICdhJyA/ICdBJyA6ICdhJykgLSAxMCk7IG51bSA9IChudW0gPDwgNCkgKwotCSAqIGRpZzsgfSBlbHNlIHsgaW50IGRpZyA9IGNoIC0gJzAnOyBudW0gPSAobnVtICogMTApICsgZGlnOyB9IGlmIChudW0gPgotCSAqIDB4MTBGRkZGKSB7IHRvb2JpZyA9IHRydWU7IG51bSA9IDA7IH0gfSBpZiAoY2ggIT0gJzsnKSByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkNIQVJSRUZfUkVTVUxUX1NFTUlDT0xPTl9SRVFVSVJFRDsgbG9hZE5leHRDaGFyKCk7IGlmCi0JICogKHRvb2JpZykgcmV0dXJuIFhNTEVudGl0eUhhbmRsZXIuQ0hBUlJFRl9SRVNVTFRfT1VUX09GX1JBTkdFOyByZXR1cm4KLQkgKiBudW07IH0KLQkgKi8KLQkvLwotCS8vCi0JLy8KLQkvKgotCSAqIHB1YmxpYyBpbnQgc2NhblN0cmluZ0xpdGVyYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsgYm9vbGVhbiBzaW5nbGU7IGlmCi0JICogKCEoc2luZ2xlID0gbG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkgJiYgIWxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpIHsKLQkgKiByZXR1cm4gWE1MRW50aXR5SGFuZGxlci5TVFJJTkdMSVRfUkVTVUxUX1FVT1RFX1JFUVVJUkVEOyB9IGludCBvZmZzZXQgPQotCSAqIGZDdXJyZW50T2Zmc2V0OyBjaGFyIHFjaGFyID0gc2luZ2xlID8gJ1wnJyA6ICdcIic7IHdoaWxlCi0JICogKCFsb29raW5nQXRDaGFyKHFjaGFyLCBmYWxzZSkpIHsgaWYgKCFsb29raW5nQXRWYWxpZENoYXIodHJ1ZSkpIHsKLQkgKiByZXR1cm4gWE1MRW50aXR5SGFuZGxlci5TVFJJTkdMSVRfUkVTVUxUX0lOVkFMSURfQ0hBUjsgfSB9IC8vIGludAotCSAqIHN0cmluZ0luZGV4ID0gYWRkU3RyaW5nKG9mZnNldCwgZkN1cnJlbnRPZmZzZXQgLSBvZmZzZXQpOyBpbnQKLQkgKiBzdHJpbmdJbmRleCA9IGFkZFN0cmluZyhvZmZzZXQsIGZDdXJyZW50T2Zmc2V0IC0gb2Zmc2V0KTsKLQkgKiBsb29raW5nQXRDaGFyKHFjaGFyLCB0cnVlKTsgLy8gbW92ZSBwYXN0IHFjaGFyIHJldHVybiBzdHJpbmdJbmRleDsgfQotCSAqLwotCi0JLy8KLQkvLwotCXB1YmxpYyBib29sZWFuIHNjYW5BdHRWYWx1ZShjaGFyIHFjaGFyKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChsb29raW5nQXRDaGFyKHFjaGFyLCBmYWxzZSkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChsb29raW5nQXRDaGFyKCcgJywgdHJ1ZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICghbG9va2luZ0F0VmFsaWRDaGFyKHRydWUpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJbG9va2luZ0F0Q2hhcihxY2hhciwgdHJ1ZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8KLQkvLyBbOV0gRW50aXR5VmFsdWUgOjo9ICciJyAoW14lJiJdIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAnIicKLQkvLyB8ICInIiAoW14lJiddIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAiJyIKLQkvLwotCS8vIFRoZSB2YWx1ZXMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSBhcmUgZGVmaW5lZCBhczoKLQkvLwotCS8vIDAgLSBub3Qgc3BlY2lhbAotCS8vIDEgLSBxdW90ZSBjaGFyYWN0ZXIKLQkvLyAyIC0gcmVmZXJlbmNlCi0JLy8gMyAtIHBlcmVmCi0JLy8gNCAtIGludmFsaWQKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpRW50aXR5VmFsdWVDaGFyW10gPSB7NCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMCwgMCwgNCwgNCwgMCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMCwgMCwgMSwgMCwgMCwgMywgMiwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gJ1wiJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICclJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICcmJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdcJycKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLQotCS8qCi0JICogcHVibGljIGludCBzY2FuRW50aXR5VmFsdWUoaW50IHFjaGFyLCBib29sZWFuIGNyZWF0ZVN0cmluZykgdGhyb3dzCi0JICogRXhjZXB0aW9uIHsgaW50IG9mZnNldCA9IGZDdXJyZW50T2Zmc2V0OyBpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0JICogd2hpbGUgKHRydWUpIHsgaWYgKGNoID09IC0xKSB7IGNoYW5nZVJlYWRlcnMoKTsgLy8gZG8gbm90IGNhbGwgbmV4dAotCSAqIHJlYWRlciwgb3VyIGNhbGxlciBtYXkgbmVlZCB0byBjaGFuZ2UgdGhlIHBhcmFtZXRlcnMgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfRU5EX09GX0lOUFVUOyB9IGlmIChjaCA8IDB4ODApIHsKLQkgKiBzd2l0Y2ggKGZnQXNjaWlFbnRpdHlWYWx1ZUNoYXJbY2hdKSB7IGNhc2UgMTogLy8gcXVvdGUgY2hhciBpZiAoY2ggPT0KLQkgKiBxY2hhcikgeyBpZiAoIWNyZWF0ZVN0cmluZykgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfRklOSVNIRUQ7IGludCBsZW5ndGggPQotCSAqIGZDdXJyZW50T2Zmc2V0IC0gb2Zmc2V0OyBpbnQgcmVzdWx0ID0gbGVuZ3RoID09IDAgPwotCSAqIFN0cmluZ1Bvb2wuRU1QVFlfU1RSSU5HIDogYWRkU3RyaW5nKG9mZnNldCwgbGVuZ3RoKTsgbG9hZE5leHRDaGFyKCk7Ci0JICogcmV0dXJuIHJlc3VsdDsgfSAvLyB0aGUgb3RoZXIgcXVvdGUgY2hhcmFjdGVyIGlzIG5vdCBzcGVjaWFsIC8vIGZhbGwKLQkgKiB0aHJvdWdoIGNhc2UgMDogLy8gbm9uLXNwZWNpYWwgY2hhciBpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JICogaWYgKG93ZVRyYWlsaW5nU3BhY2UpIHsgb3dlVHJhaWxpbmdTcGFjZSA9IGZhbHNlOyBjaCA9IGZNb3N0UmVjZW50Q2hhciA9ICcgJzsgfQotCSAqIGVsc2UgeyBjaCA9IGZNb3N0UmVjZW50Q2hhciA9IC0xOyB9IH0gZWxzZSB7IGNoID0gZk1vc3RSZWNlbnRDaGFyID0KLQkgKiBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOyB9IGNvbnRpbnVlOyBjYXNlIDI6IC8vIHJlZmVyZW5jZSByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9SRUZFUkVOQ0U7IGNhc2UgMzogLy8gcGVyZWYgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfUEVSRUY7IGNhc2UgNDogLy8gaW52YWxpZCByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9JTlZBTElEX0NIQVI7IH0gfSBlbHNlIGlmIChjaCA8Ci0JICogMHhEODAwKSB7IGNoID0gbG9hZE5leHRDaGFyKCk7IH0gZWxzZSBpZiAoY2ggPj0gMHhFMDAwICYmIChjaCA8PSAweEZGRkQgfHwKLQkgKiAoY2ggPj0gMHgxMDAwMCAmJiBjaCA8PSAweDEwRkZGRikpKSB7IC8vIC8vIFJFVklTSVQgLSBuZWVkcyBtb3JlIGNvZGUKLQkgKiB0byBjaGVjayBzdXJyb2dhdGVzLiAvLyBjaCA9IGxvYWROZXh0Q2hhcigpOyB9IGVsc2UgeyByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9JTlZBTElEX0NIQVI7IH0gfSB9Ci0JICovCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvVFN0cmluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvVFN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjEyZTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL1RTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBmb3Igc29tZSBvZiB0aGUgdmVyeSB1c2VkIElTdHJpbmcKLSAqIG9wZXJhdGlvbnMKLSAqLwotCi1wdWJsaWMgY2xhc3MgVFN0cmluZyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBQkVUID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBTlVNRVJJQyA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNRVJJQyA9ICIwMTIzNDU2Nzg5IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gY2hhbmdlIGFsbCBvY2N1cnJlbmNlcyBvZiBvbGRQYXQgdG8gbmV3UGF0Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hhbmdlKFN0cmluZyBpbiwgU3RyaW5nIG9sZFBhdCwgU3RyaW5nIG5ld1BhdCkgewotCQlpZiAob2xkUGF0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gaW47Ci0JCWlmIChvbGRQYXQubGVuZ3RoKCkgPT0gMSAmJiBuZXdQYXQubGVuZ3RoKCkgPT0gMSkKLQkJCXJldHVybiBpbi5yZXBsYWNlKG9sZFBhdC5jaGFyQXQoMCksIG5ld1BhdC5jaGFyQXQoMCkpOwotCi0JCWludCBsYXN0SW5kZXggPSAwOwotCQlpbnQgbmV3SW5kZXggPSAwOwotCQlTdHJpbmdCdWZmZXIgbmV3U3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKDs7KSB7Ci0JCQluZXdJbmRleCA9IGluLmluZGV4T2Yob2xkUGF0LCBsYXN0SW5kZXgpOwotCQkJaWYgKG5ld0luZGV4ICE9IC0xKSB7Ci0JCQkJbmV3U3RyaW5nLmFwcGVuZChpbi5zdWJzdHJpbmcobGFzdEluZGV4LCBuZXdJbmRleCkgKyBuZXdQYXQpOwotCQkJCWxhc3RJbmRleCA9IG5ld0luZGV4ICsgb2xkUGF0Lmxlbmd0aCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3U3RyaW5nLmFwcGVuZChpbi5zdWJzdHJpbmcobGFzdEluZGV4KSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1N0cmluZy50b1N0cmluZygpOwotCX0KLQotCS8vIGNoYW5nZSB0aGUgb2NjdXJyZW5jZXMgb2Ygb2xkUGF0IHRvIG5ld1BhdCBzdGFydGluZyBhdCBzdGFydFBvc2l0aW9uCi0JLy8gZm9yIG51bWJlciBvZiBudW1DaGFuZ2VzCi0JLy8gTm90ZTogdGhlIDFzdCBjaGFyIGluIHRoZSBzdHJpbmcgaGFzIHBvc2l0aW9uIG9mIDAKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZShTdHJpbmcgaW4sIFN0cmluZyBvbGRQYXQsIFN0cmluZyBuZXdQYXQsIGludCBzdGFydFBvcywgaW50IG51bUNoYW5nZXMpIHsKLQkJaWYgKG9sZFBhdC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGluOwotCQlpZiAob2xkUGF0Lmxlbmd0aCgpID09IDEgJiYgbmV3UGF0Lmxlbmd0aCgpID09IDEpCi0JCQlyZXR1cm4gaW4ucmVwbGFjZShvbGRQYXQuY2hhckF0KDApLCBuZXdQYXQuY2hhckF0KDApKTsKLQotCQlpbnQgaW5MZW4gPSBpbi5sZW5ndGgoKTsKLQotCQlpZiAoc3RhcnRQb3MgPj0gaW5MZW4pCi0JCQlyZXR1cm4gaW47Ci0KLQkJaW50IGxhc3RJbmRleCA9IHN0YXJ0UG9zOwotCQlpbnQgbmV3SW5kZXggPSAwOwotCQlpbnQgY291bnRDaGFuZ2VzID0gMDsKLQotCi0JCVN0cmluZ0J1ZmZlciBuZXdTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZm9yICg7OykgewotCQkJbmV3SW5kZXggPSBpbi5pbmRleE9mKG9sZFBhdCwgbGFzdEluZGV4KTsKLQkJCWlmIChuZXdJbmRleCAhPSAtMSkgewotCQkJCW5ld1N0cmluZy5hcHBlbmQoaW4uc3Vic3RyaW5nKGxhc3RJbmRleCwgbmV3SW5kZXgpICsgbmV3UGF0KTsKLQkJCQlsYXN0SW5kZXggPSBuZXdJbmRleCArIG9sZFBhdC5sZW5ndGgoKTsKLQkJCQljb3VudENoYW5nZXMrKzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1N0cmluZy5hcHBlbmQoaW4uc3Vic3RyaW5nKGxhc3RJbmRleCkpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoY291bnRDaGFuZ2VzID09IG51bUNoYW5nZXMpIHsKLQkJCQluZXdTdHJpbmcuYXBwZW5kKGluLnN1YnN0cmluZyhsYXN0SW5kZXgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdTdHJpbmcudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JkKFN0cmluZyBpbiwgaW50IGkpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbik7Ci0JCWlmIChpIDw9IDAgfHwgaSA+IHN0LmNvdW50VG9rZW5zKCkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSB7Ci0JCQlTdHJpbmcgcmV0ID0gbmV3IFN0cmluZygpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCXJldCA9IHN0Lm5leHRUb2tlbigpOwotCQkJCWlmICgtLWkgPT0gMCkKLQkJCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JkcyhTdHJpbmcgaW4sIGludCBpKSB7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW4pOwotCQlpZiAoaSA8PSAwIHx8IGkgPiBzdC5jb3VudFRva2VucygpKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgewotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCWlmICgtLWkgPT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJc3QubmV4dFRva2VuKCk7Ci0JCQl9Ci0JCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKQotCQkJCXJldHVybiBzdC5uZXh0VG9rZW4oIiIpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRTcGFjZXMoU3RyaW5nIGluLCBpbnQgbGVuKSB7Ci0JCWlmIChsZW4gPCAxKQotCQkJcmV0dXJuIGluOwotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoaW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IG51bVdvcmRzKFN0cmluZyBpbikgewotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluKTsKLQkJcmV0dXJuIHN0LmNvdW50VG9rZW5zKCk7Ci0JfQotCi0JLy8gcmV0dXJuIHRoZSBmaXJzdCBpbmRleCB3aXRoaW4gc3JjU3RyaW5nIHRoYXQgaXMgbm90IGluIHRoZSB2YWxpZFN0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gImFiY2RlZmciCi0JLy8gdmFsaWRTdHJpbmcgPSAiYmNmZyIKLQkvLyByZXR1cm4gPSAwIChpLmUuIGNoYXIgYSBpcyBub3QgaW4gImJjZmciKSAtIDFzdCBpbmRleCA9IDAKLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZBbnlCdXQoU3RyaW5nIHNyY1N0cmluZywgU3RyaW5nIHZhbGlkU3RyaW5nKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IHNyY0xlbiA9IHNyY1N0cmluZy5sZW5ndGgoKTsKLQotCQkvLyB3YWxrIGJhY2t3YXJkIHRvIGZpbmQgaWYgYSBjaGFyIHdpdGhpbiBzcmNTdHJpbmcgaXMgaW4gdmFsaWRTdHJpbmcKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNMZW47IGkrKykgewotCQkJLy8gbm90IGZvdW5kLCBzdG9wIGl0Ci0JCQlpZiAodmFsaWRTdHJpbmcuaW5kZXhPZihzcmNTdHJpbmcuY2hhckF0KGkpKSA9PSAtMSkgewotCQkJCXJlc3VsdCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gcmV0dXJuIHRoZSBsYXN0IGluZGV4IHdpdGhpbiBzcmNTdHJpbmcgdGhhdCBpcyBub3QgaW4gdGhlIHZhbGlkU3RyaW5nCi0JLy8gZXhhbXBsZToKLQkvLyBzcmNTdHJpbmcgPSAiYWJjZGVmZyIKLQkvLyB2YWxpZFN0cmluZyA9ICJiY2ZnIgotCS8vIHJldHVybiA9IDQgKGkuZS4gY2hhciBlIGlzIG5vdCBpbiAiYmNmZyIpIC0gMXN0IGluZGV4ID0gMAotCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2ZBbnlCdXQoU3RyaW5nIHNyY1N0cmluZywgU3RyaW5nIHZhbGlkU3RyaW5nKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IHNyY0xlbiA9IHNyY1N0cmluZy5sZW5ndGgoKTsKLQotCQkvLyB3YWxrIGJhY2t3YXJkIHRvIGZpbmQgaWYgYSBjaGFyIHdpdGhpbiBzcmNTdHJpbmcgaXMgaW4gdmFsaWRTdHJpbmcKLQkJZm9yIChpbnQgaSA9IHNyY0xlbiAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkvLyBub3QgZm91bmQsIHN0b3AgaXQKLQkJCWlmICh2YWxpZFN0cmluZy5pbmRleE9mKHNyY1N0cmluZy5jaGFyQXQoaSkpID09IC0xKSB7Ci0JCQkJcmVzdWx0ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyByZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHNlYXJjaENoYXIgd2l0aGluIHNyY1N0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gIjo6Zjo6Zjo6ZyIKLQkvLyBzZWFjaHJDaGFyID0gJzonCi0JLy8gcmV0dXJuID0gNgotCi0JcHVibGljIHN0YXRpYyBpbnQgb2NjdXJyZW5jZU9mKFN0cmluZyBzcmNTdHJpbmcsIGNoYXIgc2VhcmNoQ2hhcikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJLy8gd2FsayBiYWNrd2FyZCB0byBmaW5kIGlmIGEgY2hhciB3aXRoaW4gc3JjU3RyaW5nIGlzIGluIHZhbGlkU3RyaW5nCi0JCWlmIChzcmNTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3JjU3RyaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCQkvLyBmb3VuZCwgaW5jcmVtZW50IHRoZSBjb3VudAotCQkJCWlmIChzZWFyY2hDaGFyID09IHNyY1N0cmluZy5jaGFyQXQoaSkpCi0JCQkJCXJlc3VsdCsrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBzdHJpcCB0aGUgbGVhZGluZyBwU3RyaW5nIGluIHRoZSBzcmNTdHJpbmcKLQkvLyBleGFtcGxlOgotCS8vIHNyY1N0cmluZyA9ICI6OmY6OmY6OmciCi0JLy8gcFN0cmluZyAiOjoiCi0JLy8gcmV0dXJuID0gImY6OmY6OmciCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcExlYWRpbmcoU3RyaW5nIHNyY1N0cmluZywgU3RyaW5nIHBTdHJpbmcpIHsKLQkJU3RyaW5nIHJlc3VsdDsKLQotCQlpZiAoc3JjU3RyaW5nLnN0YXJ0c1dpdGgocFN0cmluZykpIC8vIGxlYWRpbmcgcGF0U3RyaW5nIGZvdW5kCi0JCQlyZXN1bHQgPSBzcmNTdHJpbmcuc3Vic3RyaW5nKHBTdHJpbmcubGVuZ3RoKCksIHNyY1N0cmluZy5sZW5ndGgoKSk7Ci0JCWVsc2UKLQkJCS8vIG5vdCBmb3VuZAotCQkJcmVzdWx0ID0gc3JjU3RyaW5nOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gc3RyaXAgdGhlIHRyYWlsaW5nIHBTdHJpbmcgaW4gdGhlIHNyY1N0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gImY6OmY6Omc6OiIKLQkvLyBwU3RyaW5nICI6OiIKLQkvLyByZXR1cm4gPSAiZjo6Zjo6ZyIKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwVHJhaWxpbmcoU3RyaW5nIHNyY1N0cmluZywgU3RyaW5nIHBTdHJpbmcpIHsKLQkJU3RyaW5nIHJlc3VsdDsKLQotCQlpZiAoc3JjU3RyaW5nLmVuZHNXaXRoKHBTdHJpbmcpKSAvLyBsZWFkaW5nIHBhdFN0cmluZyBmb3VuZAotCQkJcmVzdWx0ID0gc3JjU3RyaW5nLnN1YnN0cmluZygwLCBzcmNTdHJpbmcubGFzdEluZGV4T2YocFN0cmluZykpOwotCQllbHNlCi0JCQkvLyBub3QgZm91bmQKLQkJCXJlc3VsdCA9IHNyY1N0cmluZzsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIHN0cmlwIHRoZSB0cmFpbGluZyBibGFua3MgaW4gdGhlIHNyYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwVHJhaWxpbmdCbGFua3MoU3RyaW5nIHNyYykgewotCi0JCWlmIChzcmMgIT0gbnVsbCkgewotCQkJd2hpbGUgKHNyYy5sZW5ndGgoKSA+IDApIHsKLQkJCQlpZiAoc3JjLmVuZHNXaXRoKCIgIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJc3JjID0gc3JjLnN1YnN0cmluZygwLCBzcmMubGVuZ3RoKCkgLSAxKTsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNyYzsKLQl9Ci0KLQotCi0JLy8gcmV0dXJuIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgbnVtYmVyIG9mIGNvcGllcyBvZiBzcmNTdHJpbmcKLQkvLyBleGFtcGxlOgotCS8vIHNyY1N0cmluZyA9ICJhYmMiCi0JLy8gbnVtYmVyT2ZDb3BpZXMgPSAyCi0JLy8gcmV0dXJuIHN0cmluZyA9ICJhYmNhYmMiCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5KFN0cmluZyBzcmNTdHJpbmcsIGludCBudW1iZXJPZkNvcGllcykgewotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWlmIChudW1iZXJPZkNvcGllcyA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDw9IG51bWJlck9mQ29waWVzOyBpKyspCi0JCQkJcmVzdWx0LmFwcGVuZChzcmNTdHJpbmcpOwotCQl9Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3JjU3RyaW5nKTsKLQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8KLQkvLyByZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcnMgaW4gc3JjU3RyaW5nIGFyZSBpbiB7YS4uLnp9IG9yIHtBLi4uWn0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FscGhhYmV0aWMoU3RyaW5nIHNyY1N0cmluZykgewotCQlyZXR1cm4gKGxhc3RJbmRleE9mQW55QnV0KHNyY1N0cmluZywgQUxQSEFCRVQpID09IC0xKTsKLQl9Ci0KLQkvLwotCS8vIHJldHVybiB0cnVlIGlmIGFsbCBjaGFycyBpbiBzcmNTdHJpbmcgYXJlIGluIHthLi4ueix9IG9yIHtBLi4uWn0KLQkvLyB7MC4uLjl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbHBoYW51bWVyaWMoU3RyaW5nIHNyY1N0cmluZykgewotCQlyZXR1cm4gKGxhc3RJbmRleE9mQW55QnV0KHNyY1N0cmluZywgQUxQSEFOVU1FUklDKSA9PSAtMSk7Ci0JfQotCi0KLQkvLwotCS8vIHJldHVybiB0cnVlIGlmIGFsbCBjaGFycyBhcmUgaW4gJzAnIC0gJzknCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEaWdpdHMoU3RyaW5nIHNyY1N0cmluZykgewotCQlyZXR1cm4gKGxhc3RJbmRleE9mQW55QnV0KHNyY1N0cmluZywgTlVNRVJJQykgPT0gLTEpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1wdHlPck51bGwoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nID09IG51bGwgfHwgc3RyaW5nLmxlbmd0aCgpID09IDA7Ci0JfQotCi0KLQkvLwotCS8vIHJldHVybiB0aGUgc3RyaW5nIGFmdGVyIHRoZSBtYXRjaGluZyB0b2tlbiBpcyByZW1vdmVkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWF0Y2goU3RyaW5nIGluLCBTdHJpbmcgdG9rZW4pIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoaW4gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWluID0gaW4udHJpbSgpOwotCQlpZiAoaW4uc3RhcnRzV2l0aCh0b2tlbikpCi0JCQlyZXR1cm4gaW4uc3Vic3RyaW5nKHRva2VuLmxlbmd0aCgpLCBpbi5sZW5ndGgoKSk7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkV4cGVjdGVkOiAiICsgdG9rZW4gKyAiIGJ1dCBnb3Q6IiArIHdvcmQoaW4sIDEpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIGdldExvbmcoU3RyaW5nIHN0cikgewotCQl0cnkgewotCQkJcmV0dXJuIExvbmcucGFyc2VMb25nKHN0cik7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBtKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCS8vIHJldHVybiB0cnVlIGlmIHRoZSAiICIgYXBwZWFycyB3aXRoaW4gc3JjU3RyaW5nCi0JLy8gZXhhbXBsZToKLQkvLyBzcmNTdHJpbmcgPSAiYSBtIgotCS8vIHJldHVybiA9IHRydWUKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0RvdWJsZUJsYW5rcyhTdHJpbmcgc3JjU3RyaW5nKSB7Ci0JCVN0cmluZyBiYiA9ICIgICI7IC8vJE5PTi1OTFMtMSQKLQkJY2hhciBiID0gYmIuY2hhckF0KDApOwotCi0JCWlmIChzcmNTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IChzcmNTdHJpbmcubGVuZ3RoKCkgLSAxKTsgaSsrKSB7Ci0JCQkJaWYgKChiID09IHNyY1N0cmluZy5jaGFyQXQoaSkpICYgKGIgPT0gc3JjU3RyaW5nLmNoYXJBdChpICsgMSkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM4MDM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL1hNTENoYXJhY3RlclByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotLyoqCi0gKiBBIGNsYXNzIHJlcHJlc2VudGluZyBwcm9wZXJ0aWVzIG9mIGNoYXJhY3RlcnMgYWNjb3JkaW5nIHRvIHZhcmlvdXMgVzNDCi0gKiByZWNvbW1lbmRhdGlvbnMKLSAqIAotICogWE1MQ2hhcmFjdGVyUHJvcGVydGllcyBwcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBjb21tb25seSB1c2VkCi0gKiBjaGFyYWN0ZXIgdGVzdHMuCi0gKiAKLSAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgdGFibGVzIHVzZWQgYnkgdGhlIGNvbnZlbmllbmNlIG1ldGhvZHMgYXJlCi0gKiBhbHNvIHB1YmxpYywgYW5kIGFyZSBkaXJlY3RseSBhY2Nlc3NlZCBieSBwZXJmb3JtYW5jZSBjcml0aWNhbCByb3V0aW5lcy4KLSAqIAotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzIHsKLQkvKgotCSAqIFsyNl0gVmVyc2lvbk51bSA6Oj0gKFthLXpBLVowLTlfLjpdIHwgJy0nKSsKLQkgKiAKLQkgKiBOb3RlOiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBhc2NpaSBwb3J0aW9uIG9mIHRoZSBOYW1lQ2hhciBkZWZpbml0aW9uLgotCSAqLwotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIHZlcnNpb24gc3RyaW5nIGFjY29yZGluZyB0byBbMjZdIGluCi0JICogdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gdmVyc2lvbgotCSAqICAgICAgICAgICAgc3RyaW5nIHRvIGNoZWNrCi0JICogQHJldHVybiB0cnVlIGlmIHZlcnNpb24gaXMgYSB2YWxpZCB2ZXJzaW9uIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZFZlcnNpb25OdW0oU3RyaW5nIHZlcnNpb24pIHsKLQkJaWYgKHZlcnNpb24ubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2ZXJzaW9uLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB2ZXJzaW9uLmNoYXJBdChpKTsKLQkJCWlmIChjaCA+ICd6JyB8fCBmZ0FzY2lpTmFtZUNoYXJbY2hdID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogWzgxXSBFbmNOYW1lIDo6PSBbQS1aYS16XSAoW0EtWmEtejAtOS5fXSB8ICctJykqCi0JICovCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgZW5jb2RpbmcgbmFtZSBhY2NvcmRpbmcgdG8gWzgxXSBpbgotCSAqIHRoZSBYTUwgMS4wIFJlY29tbWVuZGF0aW9uCi0JICogCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgZW5jb2RpbmcgaXMgYSB2YWxpZCBlbmNvZGluZyBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkRW5jTmFtZShTdHJpbmcgZW5jb2RpbmcpIHsKLQkJaWYgKGVuY29kaW5nLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNoYXIgY2ggPSBlbmNvZGluZy5jaGFyQXQoMCk7Ci0JCWlmIChjaCA+ICd6JyB8fCBmZ0FzY2lpQWxwaGFDaGFyW2NoXSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGVuY29kaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoID0gZW5jb2RpbmcuY2hhckF0KGkpOwotCQkJaWYgKGNoID4gJ3onIHx8IGZnQXNjaWlFbmNOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBbMTNdIFB1YmlkQ2hhciA6Oj0gI3gyMCB8ICN4RCB8ICN4QSB8IFthLXpBLVowLTldIHwKLQkgKiBbLScoKSssLi86PT87ISojQCRfJV0KLQkgKi8KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBwdWJsaWMgaWRlbnRpZmllciBhY2NvcmRpbmcgdG8gWzEzXQotCSAqIGluIHRoZSBYTUwgMS4wIFJlY29tbWVuZGF0aW9uCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgcHVibGljSWQgaXMgYSB2YWxpZCBwdWJsaWMgaWRlbnRpZmllcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHZhbGlkUHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmIChwdWJsaWNJZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHB1YmxpY0lkLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBwdWJsaWNJZC5jaGFyQXQoaSk7Ci0JCQlpZiAoY2ggPiAneicgfHwgZmdBc2NpaVB1YmlkQ2hhcltjaF0gPT0gMCkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSoKLQkgKi8KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBOYW1lIGFjY29yZGluZyB0byBbNV0gaW4gdGhlIFhNTAotCSAqIDEuMCBSZWNvbW1lbmRhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgbmFtZSBpcyBhIHZhbGlkIE5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQljaGFyIGNoID0gbmFtZS5jaGFyQXQoMCk7Ci0JCWlmIChjaCA+ICd6JykgewotCQkJaWYgKChmZ0NoYXJGbGFnc1tjaF0gJiBFX0luaXRpYWxOYW1lQ2hhckZsYWcpID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgaWYgKGZnQXNjaWlJbml0aWFsTmFtZUNoYXJbY2hdID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaCA9IG5hbWUuY2hhckF0KGkpOwotCQkJaWYgKGNoID4gJ3onKSB7Ci0JCQkJaWYgKChmZ0NoYXJGbGFnc1tjaF0gJiBFX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIGZyb20gdGhlIG5hbWVzcGFjZSByZWMgWzVdIE5DTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykKLQkgKiAoTmFtZU5DQ2hhcikqCi0JICovCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTkNOYW1lIGFjY29yZGluZyB0byBbNV0gZnJvbSB0aGUKLQkgKiBYTUwgTmFtZXNwYWNlcyAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgc3RyaW5nIHRvIGNoZWNrCi0JICogQHJldHVybiB0cnVlIGlmIG5hbWUgaXMgYSB2YWxpZCBOQ05hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWROQ05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCWlmIChuYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNoYXIgY2ggPSBuYW1lLmNoYXJBdCgwKTsKLQkJaWYgKGNoID4gJ3onKSB7Ci0JCQlpZiAoKGZnQ2hhckZsYWdzW2NoXSAmIEVfSW5pdGlhbE5hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZiAoZmdBc2NpaUluaXRpYWxOQ05hbWVDaGFyW2NoXSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMTsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgewotCQkJY2ggPSBuYW1lLmNoYXJBdChpKTsKLQkJCWlmIChjaCA+ICd6JykgewotCQkJCWlmICgoZmdDaGFyRmxhZ3NbY2hdICYgRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZnQXNjaWlOQ05hbWVDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8qCi0JICogWzddIE5tdG9rZW4gOjo9IChOYW1lQ2hhcikrCi0JICovCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTm10b2tlbiBhY2NvcmRpbmcgdG8gWzddIGluIHRoZSBYTUwKLQkgKiAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbm10b2tlbgotCSAqICAgICAgICAgICAgc3RyaW5nIHRvIGNoZWNqCi0JICogQHJldHVybiB0cnVlIGlmIG5tdG9rZW4gaXMgYSB2YWxpZCBObXRva2VuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkTm10b2tlbihTdHJpbmcgbm10b2tlbikgewotCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJaWYgKG5tdG9rZW4ubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubXRva2VuLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBubXRva2VuLmNoYXJBdChpKTsKLQkJCWlmIChjaCA+ICd6JykgewotCQkJCWlmICgoZmdDaGFyRmxhZ3NbY2hdICYgRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZnQXNjaWlOYW1lQ2hhcltjaF0gPT0gMCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIEhlcmUgYXJlIHRhYmxlcyB1c2VkIHRvIGJ1aWxkIGNoYXJhY3RlciBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpWERpZ2l0Q2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICcwJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnOScKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnQScgLSAnRicKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnYScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAtCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2YnCi0JCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlBbHBoYUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAtCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgLy8gJ1AnIC0gJ1onCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ2EnIC0gJ28nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCAvLyAncCcgLSAneicKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpRW5jTmFtZUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAvLyAnLScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJy4nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MkUKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnMCcgLSAnOScKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScgLSAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAvLyAnUCcgLSAnWicKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJ18nIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHg1RgotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdhJyAtICdvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgLy8gJ3AnIC0gJ3onCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaVB1YmlkQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICcgJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnIScsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJyMnLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICckJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnJScsCi0JCQkJLy8gJ1wnJywgJygnLCAnKScsICcqJywgJysnLCAnLCcsICctJywgJy4nLCAnLycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAwLCAxLCAvLyAnMCcgLSAnOScsCi0JCQkJCQkJCQkJCQkJCQkJLy8gJzonLCAnOycsCi0JCQkJCQkJCQkJCQkJCQkJLy8gJz0nLCAnPycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQCcsICdBJyAtCi0JCQkJCQkJCQkJCQkJCQkJLy8gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLy8gJ1AnIC0gJ1onCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICdfJyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4NUYKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlJbml0aWFsTmFtZUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAvLyAnOicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDNBCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ0EnIC0gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLy8gJ1AnIC0gJ1onCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICdfJyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4NUYKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlOYW1lQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIC8vICctJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFuZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICcuJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRQotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIC8vICcwJyAtICc5JwotCQkJCQkJCQkJCQkJCQkJCS8vIGFuZCAnOicgaXMKLQkJCQkJCQkJCQkJCQkJCQkvLyAweDNBCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ0EnIC0gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLy8gJ1AnIC0gJ1onCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICdfJyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4NUYKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlJbml0aWFsTkNOYW1lQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICc6JwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4M0EKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScgLSAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAvLyAnUCcgLSAnWicKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJ18nIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHg1RgotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdhJyAtICdvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgLy8gJ3AnIC0gJ3onCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaU5DTmFtZUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAvLyAnLScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MkQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnLicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MkUKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnMCcgLSAnOScKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJzonIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHgzQQotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdBJyAtICdPJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC8vICdQJyAtICdaJwotCQkJCQkJCQkJCQkJCQkJCS8vIGFuZCAnXycgaXMKLQkJCQkJCQkJCQkJCQkJCQkvLyAweDVGCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ2EnIC0gJ28nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCAvLyAncCcgLSAneicKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpQ2hhckRhdGFbXSA9IHs0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAwLCA0LCA0LCA0LCA0LCA0LCA0LCAvLyB0YWIKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MDkKLQkJCQk0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnJicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MjYKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAvLyAnPCcgaXMgMHgzQwotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDAsIDAsIC8vICddJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHg1RAotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpV1NDaGFyRGF0YVtdID0gezQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDQsIDQsIDUsIDQsIDQsIC8vIHRhYgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwOSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBMRgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwQSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBDUgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwRAotCQkJCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICcgJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyMCwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnJicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MjYKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAvLyAnPCcgaXMgMHgzQwotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDAsIDAsIC8vICddJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHg1RAotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFX0NoYXJEYXRhRmxhZyA9IDEgPDwgMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRV9Jbml0aWFsTmFtZUNoYXJGbGFnID0gMSA8PCAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFX05hbWVDaGFyRmxhZyA9IDEgPDwgMjsKLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBmZ0NoYXJGbGFncyA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGluaXRDaGFyRmxhZ3MoKSB7Ci0JCWlmIChmZ0NoYXJGbGFncyA9PSBudWxsKSB7Ci0JCQlmZ0NoYXJGbGFncyA9IG5ldyBieXRlWzB4MTAwMDBdOwotCQkJc2V0RmxhZ0ZvclJhbmdlKGZnQ2hhckRhdGFSYW5nZXMsIEVfQ2hhckRhdGFGbGFnKTsKLQkJCXNldEZsYWdGb3JSYW5nZShmZ0luaXRpYWxOYW1lQ2hhclJhbmdlcywgKGJ5dGUpIChFX0luaXRpYWxOYW1lQ2hhckZsYWcgfCBFX05hbWVDaGFyRmxhZykpOwotCQkJc2V0RmxhZ0ZvclJhbmdlKGZnTmFtZUNoYXJSYW5nZXMsIEVfTmFtZUNoYXJGbGFnKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0RmxhZ0ZvclJhbmdlKGNoYXJbXSByYW5nZXMsIGJ5dGUgZmxhZykgewotCQlpbnQgaTsKLQkJaW50IGNoOwotCQlmb3IgKGkgPSAwOyAoY2ggPSByYW5nZXNbaV0pICE9IDA7IGkgKz0gMikgewotCQkJaW50IGVuZGNoID0gcmFuZ2VzW2kgKyAxXTsKLQkJCXdoaWxlIChjaCA8PSBlbmRjaCkKLQkJCQlmZ0NoYXJGbGFnc1tjaCsrXSB8PSBmbGFnOwotCQl9Ci0JCWZvciAoaSsrOyAoY2ggPSByYW5nZXNbaV0pICE9IDA7IGkrKykKLQkJCWZnQ2hhckZsYWdzW2NoXSB8PSBmbGFnOwotCX0KLQotCS8qCi0JICogWzJdIENoYXIgOjo9ICN4OSB8ICN4QSB8ICN4RCB8IFsjeDIwLSN4RDdGRl0gLy8gYW55IFVuaWNvZGUgY2hhcmFjdGVyLAotCSAqIGV4Y2x1ZGluZyB0aGUgfCBbI3hFMDAwLSN4RkZGRF0gfCBbI3gxMDAwMC0jeDEwRkZGRl0gLy8gc3Vycm9nYXRlCi0JICogYmxvY2tzLCBGRkZFLCBhbmQgRkZGRi4gWzE0XSBDaGFyRGF0YSA6Oj0gW148Jl0qIC0gKFtePCZdKiAnXV0+JyBbXjwmXSopCi0JICogCi0JICogV2Ugd2lsbCB1c2UgQ2hhciAtICggW148Jl0gfCAnXScgfCAjeEEgfCAjeEQgKSBhbmQgaGFuZGxlIHRoZSBzcGVjaWFsCi0JICogY2FzZXMgaW5saW5lLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgZmdDaGFyRGF0YVJhbmdlc1tdID0gezB4MDAyMCwgMHgwMDI1LCAvLyAnJicgaXMKLQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwMDI2Ci0JCQkJMHgwMDI3LCAweDAwM0IsIC8vICc8JyBpcyAweDAwM0MKLQkJCQkweDAwM0QsIDB4MDA1QywgLy8gJ10nIGlzIDB4MDA1RAotCQkJCTB4MDA1RSwgMHhEN0ZGLCAweEUwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDAwMDksIC8vIHRhYgotCQkJCTB4MDAwMH07Ci0JLyoKLQkgKiBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSogWzRdIE5hbWVDaGFyIDo6PSBMZXR0ZXIgfAotCSAqIERpZ2l0IHwgJy4nIHwgJy0nIHwgJ18nIHwgJzonIHwgQ29tYmluaW5nQ2hhciB8IEV4dGVuZGVyIFs4NF0gTGV0dGVyCi0JICogOjo9IEJhc2VDaGFyIHwgSWRlb2dyYXBoaWMgWzg1XSBCYXNlQ2hhciA6Oj0gPHNlZSBzdGFuZGFyZD4gWzg2XQotCSAqIElkZW9ncmFwaGljIDo6PSA8c2VlIHN0YW5kYXJkPiBbODddIENvbWJpbmluZ0NoYXIgOjo9IDxzZWUgc3RhbmRhcmQ+Ci0JICogWzg4XSBEaWdpdCA6Oj0gPHNlZSBzdGFuZGFyZD4gWzg5XSBFeHRlbmRlciA6Oj0gPHNlZSBzdGFuZGFyZD4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGZnSW5pdGlhbE5hbWVDaGFyUmFuZ2VzW10gPSB7Ci0JLy8KLQkJCQkvLyBSYW5nZXM6Ci0JCQkJLy8KLQkJCQkvLyBCYXNlQ2hhciByYW5nZXMKLQkJCQkvLwotCQkJCTB4MDA0MSwgMHgwMDVBLCAweDAwNjEsIDB4MDA3QSwgMHgwMEMwLCAweDAwRDYsIDB4MDBEOCwgMHgwMEY2LCAweDAwRjgsIDB4MDEzMSwgMHgwMTM0LCAweDAxM0UsIDB4MDE0MSwgMHgwMTQ4LCAweDAxNEEsIDB4MDE3RSwgMHgwMTgwLCAweDAxQzMsIDB4MDFDRCwgMHgwMUYwLCAweDAxRjQsIDB4MDFGNSwgMHgwMUZBLCAweDAyMTcsIDB4MDI1MCwgMHgwMkE4LCAweDAyQkIsIDB4MDJDMSwgMHgwMzg4LCAweDAzOEEsIDB4MDM4RSwgMHgwM0ExLCAweDAzQTMsIDB4MDNDRSwgMHgwM0QwLCAweDAzRDYsIDB4MDNFMiwgMHgwM0YzLCAweDA0MDEsIDB4MDQwQywgMHgwNDBFLCAweDA0NEYsIDB4MDQ1MSwgMHgwNDVDLCAweDA0NUUsIDB4MDQ4MSwgMHgwNDkwLCAweDA0QzQsIDB4MDRDNywgMHgwNEM4LCAweDA0Q0IsIDB4MDRDQywgMHgwNEQwLCAweDA0RUIsIDB4MDRFRSwgMHgwNEY1LCAweDA0RjgsIDB4MDRGOSwgMHgwNTMxLCAweDA1NTYsIDB4MDU2MSwgMHgwNTg2LCAweDA1RDAsIDB4MDVFQSwgMHgwNUYwLCAweDA1RjIsIDB4MDYyMSwgMHgwNjNBLCAweDA2NDEsIDB4MDY0QSwgMHgwNjcxLCAweDA2QjcsIDB4MDZCQSwgMHgwNkJFLCAweDA2QzAsIDB4MDZDRSwgMHgwNkQwLCAweDA2RDMsIDB4MDZFNSwgMHgwNkU2LCAweDA5MDUsIDB4MDkzOSwgMHgwOTU4LCAweDA5NjEsIDB4MDk4NSwgMHgwOThDLCAweDA5OEYsIDB4MDk5MCwgMHgwOTkzLCAweDA5QTgsIDB4MDlBQSwgMHgwOUIwLCAweDA5QjYsIDB4MDlCOSwgMHgwOURDLCAweDA5REQsIDB4MDlERiwgMHgwOUUxLCAweDA5RjAsIDB4MDlGMSwgMHgwQTA1LCAweDBBMEEsIDB4MEEwRiwgMHgwQTEwLCAweDBBMTMsIDB4MEEyOCwgMHgwQTJBLCAweDBBMzAsIDB4MEEzMiwgMHgwQTMzLCAweDBBMzUsIDB4MEEzNiwgMHgwQTM4LCAweDBBMzksIDB4MEE1OSwgMHgwQTVDLCAweDBBNzIsIDB4MEE3NCwgMHgwQTg1LCAweDBBOEIsIDB4MEE4RiwgMHgwQTkxLAotCQkJCTB4MEE5MywgMHgwQUE4LCAweDBBQUEsIDB4MEFCMCwgMHgwQUIyLCAweDBBQjMsIDB4MEFCNSwgMHgwQUI5LCAweDBCMDUsIDB4MEIwQywgMHgwQjBGLCAweDBCMTAsIDB4MEIxMywgMHgwQjI4LCAweDBCMkEsIDB4MEIzMCwgMHgwQjMyLCAweDBCMzMsIDB4MEIzNiwgMHgwQjM5LCAweDBCNUMsIDB4MEI1RCwgMHgwQjVGLCAweDBCNjEsIDB4MEI4NSwgMHgwQjhBLCAweDBCOEUsIDB4MEI5MCwgMHgwQjkyLCAweDBCOTUsIDB4MEI5OSwgMHgwQjlBLCAweDBCOUUsIDB4MEI5RiwgMHgwQkEzLCAweDBCQTQsIDB4MEJBOCwgMHgwQkFBLCAweDBCQUUsIDB4MEJCNSwgMHgwQkI3LCAweDBCQjksIDB4MEMwNSwgMHgwQzBDLCAweDBDMEUsIDB4MEMxMCwgMHgwQzEyLCAweDBDMjgsIDB4MEMyQSwgMHgwQzMzLCAweDBDMzUsIDB4MEMzOSwgMHgwQzYwLCAweDBDNjEsIDB4MEM4NSwgMHgwQzhDLCAweDBDOEUsIDB4MEM5MCwgMHgwQzkyLCAweDBDQTgsIDB4MENBQSwgMHgwQ0IzLCAweDBDQjUsIDB4MENCOSwgMHgwQ0UwLCAweDBDRTEsIDB4MEQwNSwgMHgwRDBDLCAweDBEMEUsIDB4MEQxMCwgMHgwRDEyLCAweDBEMjgsIDB4MEQyQSwgMHgwRDM5LCAweDBENjAsIDB4MEQ2MSwgMHgwRTAxLCAweDBFMkUsIDB4MEUzMiwgMHgwRTMzLCAweDBFNDAsIDB4MEU0NSwgMHgwRTgxLCAweDBFODIsIDB4MEU4NywgMHgwRTg4LCAweDBFOTQsIDB4MEU5NywgMHgwRTk5LCAweDBFOUYsIDB4MEVBMSwgMHgwRUEzLCAweDBFQUEsIDB4MEVBQiwgMHgwRUFELCAweDBFQUUsIDB4MEVCMiwgMHgwRUIzLCAweDBFQzAsIDB4MEVDNCwgMHgwRjQwLCAweDBGNDcsIDB4MEY0OSwgMHgwRjY5LCAweDEwQTAsIDB4MTBDNSwgMHgxMEQwLCAweDEwRjYsIDB4MTEwMiwgMHgxMTAzLCAweDExMDUsIDB4MTEwNywgMHgxMTBCLCAweDExMEMsIDB4MTEwRSwgMHgxMTEyLCAweDExNTQsIDB4MTE1NSwgMHgxMTVGLCAweDExNjEsIDB4MTE2RCwgMHgxMTZFLAotCQkJCTB4MTE3MiwgMHgxMTczLCAweDExQUUsIDB4MTFBRiwgMHgxMUI3LCAweDExQjgsIDB4MTFCQywgMHgxMUMyLCAweDFFMDAsIDB4MUU5QiwgMHgxRUEwLCAweDFFRjksIDB4MUYwMCwgMHgxRjE1LCAweDFGMTgsIDB4MUYxRCwgMHgxRjIwLCAweDFGNDUsIDB4MUY0OCwgMHgxRjRELCAweDFGNTAsIDB4MUY1NywgMHgxRjVGLCAweDFGN0QsIDB4MUY4MCwgMHgxRkI0LCAweDFGQjYsIDB4MUZCQywgMHgxRkMyLCAweDFGQzQsIDB4MUZDNiwgMHgxRkNDLCAweDFGRDAsIDB4MUZEMywgMHgxRkQ2LCAweDFGREIsIDB4MUZFMCwgMHgxRkVDLCAweDFGRjIsIDB4MUZGNCwgMHgxRkY2LCAweDFGRkMsIDB4MjEyQSwgMHgyMTJCLCAweDIxODAsIDB4MjE4MiwgMHgzMDQxLCAweDMwOTQsIDB4MzBBMSwgMHgzMEZBLCAweDMxMDUsIDB4MzEyQywgMHhBQzAwLCAweEQ3QTMsCi0JCQkJLy8KLQkJCQkvLyBJZGVvZ3JhcGhpYyByYW5nZXMKLQkJCQkvLwotCQkJCTB4MzAyMSwgMHgzMDI5LCAweDRFMDAsIDB4OUZBNSwKLQkJCQkvLwotCQkJCS8vIFJhbmdlcyBlbmQgbWFya2VyCi0JCQkJLy8KLQkJCQkweDAwMDAsCi0JCQkJLy8KLQkJCQkvLyBTaW5nbGUgY2hhciB2YWx1ZXMKLQkJCQkvLwotCQkJCTB4MDAzQSwgLy8gJzonCi0JCQkJMHgwMDVGLCAvLyAnXycKLQkJCQkvLwotCQkJCS8vIEJhc2VDaGFyIHNpbmdsZXMKLQkJCQkvLwotCQkJCTB4MDM4NiwgMHgwMzhDLCAweDAzREEsIDB4MDNEQywgMHgwM0RFLCAweDAzRTAsIDB4MDU1OSwgMHgwNkQ1LCAweDA5M0QsIDB4MDlCMiwgMHgwQTVFLCAweDBBOEQsIDB4MEFCRCwgMHgwQUUwLCAweDBCM0QsIDB4MEI5QywgMHgwQ0RFLCAweDBFMzAsIDB4MEU4NCwgMHgwRThBLCAweDBFOEQsIDB4MEVBNSwgMHgwRUE3LCAweDBFQjAsIDB4MEVCRCwgMHgxMTAwLCAweDExMDksIDB4MTEzQywgMHgxMTNFLCAweDExNDAsIDB4MTE0QywgMHgxMTRFLCAweDExNTAsIDB4MTE1OSwgMHgxMTYzLCAweDExNjUsIDB4MTE2NywgMHgxMTY5LCAweDExNzUsIDB4MTE5RSwgMHgxMUE4LCAweDExQUIsIDB4MTFCQSwgMHgxMUVCLCAweDExRjAsIDB4MTFGOSwgMHgxRjU5LCAweDFGNUIsIDB4MUY1RCwgMHgxRkJFLCAweDIxMjYsIDB4MjEyRSwKLQkJCQkvLwotCQkJCS8vIElkZW9ncmFwaGljIHNpbmdsZXMKLQkJCQkvLwotCQkJCTB4MzAwNywKLQkJCQkvLwotCQkJCS8vIFNpbmdsZXMgZW5kIG1hcmtlcgotCQkJCS8vCi0JCQkJMHgwMDAwfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGZnTmFtZUNoYXJSYW5nZXNbXSA9IHsKLQkvLwotCQkJCS8vIFJhbmdlczoKLQkJCQkvLwotCQkJCTB4MDAyRCwgMHgwMDJFLCAvLyAnLScgYW5kICcuJwotCQkJCS8vCi0JCQkJLy8gQ29tYmluaW5nQ2hhciByYW5nZXMKLQkJCQkvLwotCQkJCTB4MDMwMCwgMHgwMzQ1LCAweDAzNjAsIDB4MDM2MSwgMHgwNDgzLCAweDA0ODYsIDB4MDU5MSwgMHgwNUExLCAweDA1QTMsIDB4MDVCOSwgMHgwNUJCLCAweDA1QkQsIDB4MDVDMSwgMHgwNUMyLCAweDA2NEIsIDB4MDY1MiwgMHgwNkQ2LCAweDA2REMsIDB4MDZERCwgMHgwNkRGLCAweDA2RTAsIDB4MDZFNCwgMHgwNkU3LCAweDA2RTgsIDB4MDZFQSwgMHgwNkVELCAweDA5MDEsIDB4MDkwMywgMHgwOTNFLCAweDA5NEMsIDB4MDk1MSwgMHgwOTU0LCAweDA5NjIsIDB4MDk2MywgMHgwOTgxLCAweDA5ODMsIDB4MDlDMCwgMHgwOUM0LCAweDA5QzcsIDB4MDlDOCwgMHgwOUNCLCAweDA5Q0QsIDB4MDlFMiwgMHgwOUUzLCAweDBBNDAsIDB4MEE0MiwgMHgwQTQ3LCAweDBBNDgsIDB4MEE0QiwgMHgwQTRELCAweDBBNzAsIDB4MEE3MSwgMHgwQTgxLCAweDBBODMsIDB4MEFCRSwgMHgwQUM1LCAweDBBQzcsIDB4MEFDOSwgMHgwQUNCLCAweDBBQ0QsIDB4MEIwMSwgMHgwQjAzLCAweDBCM0UsIDB4MEI0MywgMHgwQjQ3LCAweDBCNDgsIDB4MEI0QiwgMHgwQjRELCAweDBCNTYsIDB4MEI1NywgMHgwQjgyLCAweDBCODMsIDB4MEJCRSwgMHgwQkMyLCAweDBCQzYsIDB4MEJDOCwgMHgwQkNBLCAweDBCQ0QsIDB4MEMwMSwgMHgwQzAzLCAweDBDM0UsIDB4MEM0NCwgMHgwQzQ2LCAweDBDNDgsIDB4MEM0QSwgMHgwQzRELCAweDBDNTUsIDB4MEM1NiwgMHgwQzgyLCAweDBDODMsIDB4MENCRSwgMHgwQ0M0LCAweDBDQzYsIDB4MENDOCwgMHgwQ0NBLCAweDBDQ0QsIDB4MENENSwgMHgwQ0Q2LCAweDBEMDIsIDB4MEQwMywgMHgwRDNFLCAweDBENDMsIDB4MEQ0NiwgMHgwRDQ4LCAweDBENEEsIDB4MEQ0RCwgMHgwRTM0LCAweDBFM0EsIDB4MEU0NywgMHgwRTRFLCAweDBFQjQsIDB4MEVCOSwgMHgwRUJCLCAweDBFQkMsIDB4MEVDOCwgMHgwRUNELCAweDBGMTgsIDB4MEYxOSwgMHgwRjcxLCAweDBGODQsIDB4MEY4NiwgMHgwRjhCLAotCQkJCTB4MEY5MCwgMHgwRjk1LCAweDBGOTksIDB4MEZBRCwgMHgwRkIxLCAweDBGQjcsIDB4MjBEMCwgMHgyMERDLCAweDMwMkEsIDB4MzAyRiwKLQkJCQkvLwotCQkJCS8vIERpZ2l0IHJhbmdlcwotCQkJCS8vCi0JCQkJMHgwMDMwLCAweDAwMzksIDB4MDY2MCwgMHgwNjY5LCAweDA2RjAsIDB4MDZGOSwgMHgwOTY2LCAweDA5NkYsIDB4MDlFNiwgMHgwOUVGLCAweDBBNjYsIDB4MEE2RiwgMHgwQUU2LCAweDBBRUYsIDB4MEI2NiwgMHgwQjZGLCAweDBCRTcsIDB4MEJFRiwgMHgwQzY2LCAweDBDNkYsIDB4MENFNiwgMHgwQ0VGLCAweDBENjYsIDB4MEQ2RiwgMHgwRTUwLCAweDBFNTksIDB4MEVEMCwgMHgwRUQ5LCAweDBGMjAsIDB4MEYyOSwKLQkJCQkvLwotCQkJCS8vIEV4dGVuZGVyIHJhbmdlcwotCQkJCS8vCi0JCQkJMHgzMDMxLCAweDMwMzUsIDB4MzA5RCwgMHgzMDlFLCAweDMwRkMsIDB4MzBGRSwKLQkJCQkvLwotCQkJCS8vIFJhbmdlcyBlbmQgbWFya2VyCi0JCQkJLy8KLQkJCQkweDAwMDAsCi0JCQkJLy8KLQkJCQkvLyBTaW5nbGUgY2hhciB2YWx1ZXMKLQkJCQkvLwotCQkJCS8vIENvbWJpbmluZ0NoYXIgc2luZ2xlcwotCQkJCS8vCi0JCQkJMHgwNUJGLCAweDA1QzQsIDB4MDY3MCwgMHgwOTNDLCAweDA5NEQsIDB4MDlCQywgMHgwOUJFLCAweDA5QkYsIDB4MDlENywgMHgwQTAyLCAweDBBM0MsIDB4MEEzRSwgMHgwQTNGLCAweDBBQkMsIDB4MEIzQywgMHgwQkQ3LCAweDBENTcsIDB4MEUzMSwgMHgwRUIxLCAweDBGMzUsIDB4MEYzNywgMHgwRjM5LCAweDBGM0UsIDB4MEYzRiwgMHgwRjk3LCAweDBGQjksIDB4MjBFMSwgMHgzMDk5LCAweDMwOUEsCi0JCQkJLy8KLQkJCQkvLyBFeHRlbmRlciBzaW5nbGVzCi0JCQkJLy8KLQkJCQkweDAwQjcsIDB4MDJEMCwgMHgwMkQxLCAweDAzODcsIDB4MDY0MCwgMHgwRTQ2LCAweDBFQzYsIDB4MzAwNSwKLQkJCQkvLwotCQkJCS8vIFNpbmdsZXMgZW5kIG1hcmtlcgotCQkJCS8vCi0JCQkJMHgwMDAwfTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOWYyYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IERURCBWYWxpZGF0aW9uCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRFREVmFsaWRhdGlvbk1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfUkVGX0VMRU1FTlRfVU5ERUZJTkVEOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19EVERfSU5WQUxJRF9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ESUFMT0dfRFREX0lOVkFMSURfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19EVERfVkFMSURfVEVYVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRElBTE9HX0RURF9WQUxJRF9USVRMRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRFREVmFsaWRhdGlvblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19yZXF1aXJlZF9maWxlc18zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfNDsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEVERWYWxpZGF0aW9uTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRpb25SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRpb25SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhMmQ2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EVERWYWxpZGF0aW9uUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSEKLSEgVmFsaWRhdGUgRFRECi0hCi1fVUlfRElBTE9HX0RURF9JTlZBTElEX1RJVExFICA9IFZhbGlkYXRpb24gRmFpbGVkCi1fVUlfRElBTE9HX0RURF9WQUxJRF9USVRMRSAgICA9IFZhbGlkYXRpb24gU3VjY2VlZGVkCi1fVUlfRElBTE9HX0RURF9WQUxJRF9URVhUICAgICA9IFRoZSBEVEQgZmlsZSBpcyB2YWxpZC4KLV9VSV9ESUFMT0dfRFREX0lOVkFMSURfVEVYVCAgID0gVGhlIERURCBmaWxlIGlzIG5vdCB2YWxpZC4gU2VlIHRoZSBQcm9ibGVtcyB2aWV3IGZvciBlcnJvciBtZXNzYWdlcy4KLQotIQotISBSZWZlcmVuY2VkIEVsZW1lbnQgVmFsaWRhdGlvbgotIQotX0VSUk9SX1JFRl9FTEVNRU5UX1VOREVGSU5FRCA9IFRoZSBlbGVtZW50IHswfSBoYXMgbm90IGJlZW4gZGVjbGFyZWQuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzE9UmVxdWlyZWQgZmlsZXMgeGVyY2VzSW1wbC5qYXIgYW5kIHhtbFBhcnNlckFQSXMuamFyIGNhbm5vdCBiZSBmb3VuZC5cblxuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzI9RG93bmxvYWQgWGVyY2VzIDIuNi4yIGFuZCBwbGFjZSB4ZXJjZXNJbXBsLmphciBhbmQgeG1sUGFyc2VyQVBJcy5qYXIgaW4gYSBmb2xkZXIgZW50aXRsZWQgamFycyBpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uIHBsdWdpbi5cblxuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzM9Rm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHd3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy94bWwveGVyY2VzSW5mby54bWwuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzQ9TWlzc2luZyBYZXJjZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYWIwYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5MYXp5VVJMSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogRFREIHZhbGlkYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERWYWxpZGF0b3IgewotCS8qKgotCSAqIEFuIGVudGl0eSByZXNvbHZlciB0aGF0IHdyYXBzIGEgVVJJIHJlc29sdmVyLgotCSAqLwotCWNsYXNzIERUREVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIgewotCQlwcml2YXRlIFN0cmluZyBmQmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJcHJpdmF0ZSBVUklSZXNvbHZlciBmVVJJUmVzb2x2ZXIgPSBudWxsOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3Rvci4KLQkJICogCi0JCSAqIEBwYXJhbSBpZHJlc29sdmVyCi0JCSAqICAgICAgICAgICAgVGhlIGlkcmVzb2x2ZXIgdGhpcyBlbnRpdHkgcmVzb2x2ZXIgd3JhcHMuCi0JCSAqIEBwYXJhbSBiYXNlbG9jYXRpb24KLQkJICogICAgICAgICAgICBUaGUgYmFzZSBsb2NhdGlvbiB0byByZXNvbHZlIHdpdGguCi0JCSAqLwotCQlwdWJsaWMgRFRERW50aXR5UmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXIsIFN0cmluZyBiYXNlbG9jYXRpb24pIHsKLQkJCXRoaXMuZlVSSVJlc29sdmVyID0gdXJpcmVzb2x2ZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRPRE8gY3M6IHdlIG5ldmVyIHNlZW0gdG8gc2V0IGEgVVJJUmVzb2x2ZXIKLSAgICAgICAgICAgIC8vIEkgY3JlYXRlIG9uZSBoZXJlIHVwIGZyb250IGp1c3QgaW5jYXNlCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKGZVUklSZXNvbHZlciA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmVVJJUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9ICAKLQkJCXRoaXMuZkJhc2VMb2NhdGlvbiA9IGJhc2Vsb2NhdGlvbjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0JCQlpZiAoZkJhc2VMb2NhdGlvbi5lcXVhbHMoc3lzdGVtSWQpKSB7Ci0JCQkJbG9jYXRpb24gPSBzeXN0ZW1JZDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWxvY2F0aW9uID0gZlVSSVJlc29sdmVyLnJlc29sdmUoZkJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCUlucHV0U291cmNlIGlzID0gbnVsbDsKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsICYmICFsb2NhdGlvbi5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkgIC8vIENTIDogd2hpbGUgd29ya2luZyBvbiBidWcgMTEzNTM3IEkgbm90aWNlZCB3ZSdyZSBub3QgdXNpbmcgdGhlIExhenlVUkxJbnB1dFN0cmVhbQotCQkgICAgICAvLyBzbyBmaXhlZCB0aGlzIHRvIGF2b2lkIGxlYWtpbmcgZmlsZSBoYW5kbGVzCi0JCQkgIC8vCi0gICAgICAgICAgICAgIFN0cmluZyBwaHlzaWNhbCA9IGZVUklSZXNvbHZlci5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbihmQmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgbG9jYXRpb24pOyAKLQkJCSAgaXMgPSBuZXcgSW5wdXRTb3VyY2UobG9jYXRpb24pOwotCQkJICBpcy5zZXRCeXRlU3RyZWFtKG5ldyBMYXp5VVJMSW5wdXRTdHJlYW0ocGh5c2ljYWwpKTsKLQkJCX0KLQkJCXJldHVybiBpczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFuIGVycm9yIGhhbmRsZXIgZm9yIERURCB2YWxpZGF0aW9uLgotCSAqIAotCSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLQkgKi8KLQljbGFzcyBEVERFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIgewotCi0JCXByaXZhdGUgZmluYWwgaW50IEVSUk9SID0gMDsKLQkJcHJpdmF0ZSBmaW5hbCBWYWxpZGF0aW9uSW5mbyBmVmFsaWRhdGlvbkluZm87Ci0KLQkJcHJpdmF0ZSBmaW5hbCBpbnQgV0FSTklORyA9IDE7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yLgotCQkgKiAKLQkJICogQHBhcmFtIHZhbGluZm8KLQkJICogICAgICAgICAgICBUaGUgdmFsaWRhdGlvbiBpbmZvIG9iamVjdCB0byB1c2UgdG8gcmVnaXN0ZXIgdmFsaWRhdGlvbgotCQkgKiAgICAgICAgICAgIG1lc3NhZ2VzLgotCQkgKi8KLQkJcHVibGljIERUREVycm9ySGFuZGxlcihWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKSB7Ci0JCQl0aGlzLmZWYWxpZGF0aW9uSW5mbyA9IHZhbGluZm87Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5LgotCQkgKiAKLQkJICogQHBhcmFtIGV4Y2VwdGlvbgotCQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gdGhhdCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JCSAqICAgICAgICAgICAgbWVzc2FnZS4KLQkJICogQHBhcmFtIHNldmVyaXR5Ci0JCSAqICAgICAgICAgICAgVGhlIHNldmVyaXR5IG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBhZGRWYWxpZGF0aW9uTWVzc2FnZShTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24sIGludCBzZXZlcml0eSkgewotCQkJaWYgKGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpICE9IG51bGwpIHsKLQkJCQlpZiAoc2V2ZXJpdHkgPT0gV0FSTklORykgewotCQkJCQlmVmFsaWRhdGlvbkluZm8uYWRkV2FybmluZyhleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpLCBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZWYWxpZGF0aW9uSW5mby5hZGRFcnJvcihleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpLCBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIEVSUk9SKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIEVSUk9SKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI3dhcm5pbmcob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIFdBUk5JTkcpOwotCQl9Ci0JfQotCi0JY2xhc3MgTXVsdGlIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBvcmcueG1sLnNheC5EVERIYW5kbGVyLCBDb250ZW50SGFuZGxlciwgTGV4aWNhbEhhbmRsZXIsIERlY2xIYW5kbGVyIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTU9ESUZJRVJTID0gIiorPyI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfREVMSU1JVEVSUyA9ICIsKCl8ICI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIExpc3QgZkVsZW1EZWNscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcml2YXRlIEhhc2h0YWJsZSBmRWxlbVJlZnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJcHJpdmF0ZSBMaXN0IGZJZ25vcmVFbGVtTW9kZWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHJpdmF0ZSBMaXN0IGZJZ25vcmVFbGVtUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcml2YXRlIExvY2F0b3IgZkxvY2F0b3IgPSBudWxsOwotCi0JCXB1YmxpYyBNdWx0aUhhbmRsZXIoKSB7Ci0JCQlmSWdub3JlRWxlbVJlZnMuYWRkKCIjUENEQVRBIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZJZ25vcmVFbGVtTW9kZWwuYWRkKCJBTlkiKTsgLy8kTk9OLU5MUy0xJAotCQkJZklnbm9yZUVsZW1Nb2RlbC5hZGQoIkVNUFRZIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2F0dHJpYnV0ZURlY2woamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGVEZWNsKFN0cmluZyBlTmFtZSwgU3RyaW5nIGFOYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlRGVmYXVsdCwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjY29tbWVudChjaGFyW10sIGludCwgaW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgY29tbWVudChjaGFyW10gYXJnMCwgaW50IGFyZzEsIGludCBhcmcyKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjZWxlbWVudERlY2woamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZWxlbWVudERlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBtb2RlbCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBBZGQgdGhpcyBlbGVtZW50IHRvIHRoZSBsaXN0IG9mIGRlY2xhcmVkIGVsZW1lbnRzLgotCQkJZkVsZW1EZWNscy5hZGQobmFtZSk7Ci0KLQkJCS8vIFJldHVybiBpZiB0aGUgZWxlbWVudCBtb2RlbCBzaG91bGQgYmUgaWdub3JlZC4gVGhlIG1vZGVsIHNob3VsZAotCQkJLy8gYmUKLQkJCS8vIGlnbm9yZWQgaW4gc3VjaCBjYXNlcyBhcyB3aGVuIGl0IGlzIGVxdWFsIHRvIEVNUFRZIG9yIEFOWS4KLQkJCWlmIChmSWdub3JlRWxlbU1vZGVsLmNvbnRhaW5zKG1vZGVsKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIEFkZCBlYWNoIHJlZmVyZW5jZWQgZWxlbWVudCB0byB0aGUgbGlzdCBvZiByZWZlcmVuY2VkIGVsZW1lbnRzCi0JCQlpbnQgbGluZSA9IGZMb2NhdG9yLmdldExpbmVOdW1iZXIoKTsKLQkJCWludCBjb2x1bW4gPSBmTG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKTsKLQkJCVN0cmluZyB1cmkgPSBmTG9jYXRvci5nZXRTeXN0ZW1JZCgpOwotCi0JCQlTdHJpbmdUb2tlbml6ZXIgc3RydG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihtb2RlbCwgTU9ERUxfREVMSU1JVEVSUyk7Ci0JCQl3aGlsZSAoc3RydG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyB0b2tlbiA9IHN0cnRvay5uZXh0VG9rZW4oKTsKLQkJCQlpbnQgdG9rZW5sZW5ndGggPSB0b2tlbi5sZW5ndGgoKTsKLQkJCQlpZiAoRUxFTUVOVF9NT0RJRklFUlMuaW5kZXhPZih0b2tlbi5jaGFyQXQodG9rZW5sZW5ndGggLSAxKSkgIT0gLTEpIHsKLQkJCQkJdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgdG9rZW5sZW5ndGggLSAxKTsKLQkJCQkJLy8gSWYgdGhlIHRva2VuIGlzIG5vdyBlbXB0eSAoaXQgd2FzIG9ubHkgPywqIG9yICspIHRoZW4KLQkJCQkJLy8gY29udGludWUuCi0JCQkJCWlmICh0b2tlbi5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZklnbm9yZUVsZW1SZWZzLmNvbnRhaW5zKHRva2VuKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJRWxlbWVudFJlZkxvY2F0aW9uIGVsZW1Mb2MgPSAoRWxlbWVudFJlZkxvY2F0aW9uKSBmRWxlbVJlZnMuZ2V0KHRva2VuKTsKLQkJCQlFbGVtZW50UmVmTG9jYXRpb24gdG9rZW5Mb2MgPSBuZXcgRWxlbWVudFJlZkxvY2F0aW9uKGxpbmUsIGNvbHVtbiwgdXJpLCBlbGVtTG9jKTsKLQkJCQlmRWxlbVJlZnMucHV0KHRva2VuLCB0b2tlbkxvYyk7Ci0JCQl9Ci0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZENEQVRBKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuZENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZERURCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmREVEQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjZW5kRW50aXR5KGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmRFbnRpdHkoU3RyaW5nIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciNleHRlcm5hbEVudGl0eURlY2woamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZXh0ZXJuYWxFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qKgotCQkgKiBHZXQgdGhlIGxpc3Qgb2YgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0JCSAqIAotCQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotCQkgKi8KLQkJcHVibGljIExpc3QgZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpIHsKLQkJCXJldHVybiBmRWxlbURlY2xzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldCB0aGUgZWxlbWVudCByZWZlcmVuY2VzIGhhc2h0YWJsZS4KLQkJICogCi0JCSAqIEByZXR1cm4gVGhlIGVsZW1lbnQgcmVmZXJlbmNlcyBoYXNodGFibGUuCi0JCSAqLwotCQlwdWJsaWMgSGFzaHRhYmxlIGdldEVsZW1lbnRSZWZlcmVuY2VzKCkgewotCQkJcmV0dXJuIGZFbGVtUmVmczsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2ludGVybmFsRW50aXR5RGVjbChqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnRlcm5hbEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc2V0RG9jdW1lbnRMb2NhdG9yKG9yZy54bWwuc2F4LkxvY2F0b3IpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7Ci0JCQlzdXBlci5zZXREb2N1bWVudExvY2F0b3IobG9jYXRvcik7Ci0JCQl0aGlzLmZMb2NhdG9yID0gbG9jYXRvcjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI3N0YXJ0Q0RBVEEoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhcnRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydERURChqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGFydERURChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydEVudGl0eShqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQl9Ci0KLQkKLQotCXByaXZhdGUgVVJJUmVzb2x2ZXIgZlJlc29sdmVyID0gbnVsbDsKLQotCXB1YmxpYyBEVERWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBVUkkgcmVzb2x2ZXIgdG8gdXNlIHdpdGggWFNEIHZhbGlkYXRpb24uCi0JICogCi0JICogQHBhcmFtIHVyaXJlc29sdmVyCi0JICogICAgICAgICAgICBUaGUgVVJJIHJlc29sdmVyIHRvIHVzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlciB1cmlyZXNvbHZlcikgewotCQl0aGlzLmZSZXNvbHZlciA9IHVyaXJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBEVEQgZmlsZSBsb2NhdGVkIGF0IHRoZSBVUkkuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLQkgKiBAcmV0dXJuIEEgdmFsaWRhdGlvbiByZXBvcnQgZm9yIHRoZSB2YWxpZGF0aW9uLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmkpIHsKLQkJVmFsaWRhdGlvbkluZm8gdmFsaW5mbyA9IG5ldyBWYWxpZGF0aW9uSW5mbyh1cmkpOwotCQl0cnkgewotCQkJU0FYUGFyc2VyIHBhcnNlciA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKTsKLQkJCVhNTFJlYWRlciByZWFkZXIgPSBwYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0JCQlNdWx0aUhhbmRsZXIgZHRkSGFuZGxlciA9IG5ldyBNdWx0aUhhbmRsZXIoKTsKLQkJCXJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIsIGR0ZEhhbmRsZXIpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIGR0ZEhhbmRsZXIpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoZHRkSGFuZGxlcik7Ci0JCQlyZWFkZXIuc2V0RFRESGFuZGxlcihkdGRIYW5kbGVyKTsKLQkJCXJlYWRlci5zZXRFcnJvckhhbmRsZXIobmV3IERUREVycm9ySGFuZGxlcih2YWxpbmZvKSk7Ci0JCQlyZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IERUREVudGl0eVJlc29sdmVyKGZSZXNvbHZlciwgdXJpKSk7Ci0JCQlTdHJpbmcgZG9jdW1lbnQgPSAiPCFET0NUWVBFIHJvb3QgU1lTVEVNIFwiIiArIHVyaSArICJcIj48cm9vdC8+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihkb2N1bWVudCkpKTsKLQotCQkJTGlzdCBlbGVtRGVjbHMgPSBkdGRIYW5kbGVyLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLQkJCUhhc2h0YWJsZSBlbGVtUmVmcyA9IGR0ZEhhbmRsZXIuZ2V0RWxlbWVudFJlZmVyZW5jZXMoKTsKLQkJCXZhbGlkYXRlRWxlbWVudFJlZmVyZW5jZXMoZWxlbURlY2xzLCBlbGVtUmVmcywgdmFsaW5mbyk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCi0JCX0KLQkJcmV0dXJuIHZhbGluZm87Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIGVsZW1lbnQgcmVmZXJlbmNlcyBpbiB0aGUgRFRELiBBbiBlbGVtZW50IHJlZmVyZW5jZSBpcwotCSAqIDwhRUxFTUVOVCBlbGVtIChlbGVtZW50UmVmZXJlbmNlKT4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbURlY2xzCi0JICogICAgICAgICAgICBBIGxpc3Qgb2YgdmFsaWQgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0JICogQHBhcmFtIGVsZW1SZWZzCi0JICogICAgICAgICAgICBBIGhhc2h0YWJsZSBjb250YWluaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyBhcyBrZXlzIGFuZAotCSAqICAgICAgICAgICAgbG9jYXRpb25zIGluIHRoZSBkb2N1bWVudCBhcyB2YWx1ZXMuCi0JICogQHBhcmFtIHZhbGluZm8KLQkgKiAgICAgICAgICAgIFRoZSB2YWxpZGF0aW9uIGluZm8gb2JqZWN0IHRvIHN0b3JlIHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRWxlbWVudFJlZmVyZW5jZXMoTGlzdCBlbGVtRGVjbHMsIEhhc2h0YWJsZSBlbGVtUmVmcywgVmFsaWRhdGlvbkluZm8gdmFsaW5mbykgewotCQlFbnVtZXJhdGlvbiBrZXlzID0gZWxlbVJlZnMua2V5cygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIGVsZW1SZWYgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQkvLyBJZiB0aGUgZWxlbWVudCBoYXNuJ3QgYmVlbiBkZWNsYXJlZCBjcmVhdGUgYW4gZXJyb3IuCi0JCQlpZiAoIWVsZW1EZWNscy5jb250YWlucyhlbGVtUmVmKSkgewotCQkJCUVsZW1lbnRSZWZMb2NhdGlvbiBlbGVtTG9jID0gKEVsZW1lbnRSZWZMb2NhdGlvbikgZWxlbVJlZnMuZ2V0KGVsZW1SZWYpOwotCQkJCWRvIHsKLQkJCQkJdmFsaW5mby5hZGRFcnJvcihOTFMuYmluZChEVERWYWxpZGF0aW9uTWVzc2FnZXMuX0VSUk9SX1JFRl9FTEVNRU5UX1VOREVGSU5FRCwgIiciICsgZWxlbVJlZiArICInIiksIGVsZW1Mb2MuZ2V0TGluZSgpLCBlbGVtTG9jLmdldENvbHVtbigpLCBlbGVtTG9jLmdldFVSSSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWVsZW1Mb2MgPSBlbGVtTG9jLmdldE5leHQoKTsKLQkJCQl9Ci0JCQkJd2hpbGUgKGVsZW1Mb2MgIT0gbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FbGVtZW50UmVmTG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0VsZW1lbnRSZWZMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZmMDdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0VsZW1lbnRSZWZMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLS8qKgotICogQW4gZWxlbWVudCByZWZlcmVuY2VzIGxvY2F0aW9uIGhvbGRzIHRoZSBsb2NhdGlvbiBvZiBhbiBlbGVtZW50IHJlZmVyZW5jZS4KLSAqIEFuIGVsZW1lbnQgcmVmZXJlbmNlIGlzIGRlY2xhcmVkIGluIGEgRFREIGVsZW1lbnQgZGVjbGFyYXRpb24gc3VjaCBhcwotICogPCFFTEVNRU5UIG15ZWxlbSAoZWxlbWVudHJlZik+IEFuIGVsZW1lbnQgcmVmZXJlbmNlIG1heSBiZSBwYXJ0IG9mIGEgbGlua2VkCi0gKiBsaXN0IGFuZCBjYW4gY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgbmV4dCBlbGVtZW50IHJlZmVyZW5jZSBpbiB0aGUgbGlzdC4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1jbGFzcyBFbGVtZW50UmVmTG9jYXRpb24gewotCXByaXZhdGUgaW50IGNvbHVtbiA9IC0xOwotCi0JcHJpdmF0ZSBpbnQgbGluZSA9IC0xOwotCi0JcHJpdmF0ZSBFbGVtZW50UmVmTG9jYXRpb24gbmV4dCA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyB1cmk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGluZQotCSAqICAgICAgICAgICAgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSBVUkkgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICogQHBhcmFtIG5leHQKLQkgKiAgICAgICAgICAgIFRoZSBuZXh0IGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBFbGVtZW50UmVmTG9jYXRpb24oaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIEVsZW1lbnRSZWZMb2NhdGlvbiBuZXh0KSB7Ci0JCXRoaXMubGluZSA9IGxpbmU7Ci0JCXRoaXMuY29sdW1uID0gY29sdW1uOwotCQl0aGlzLnVyaSA9IHVyaTsKLQkJdGhpcy5uZXh0ID0gbmV4dDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbHVtbigpIHsKLQkJcmV0dXJuIGNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZSgpIHsKLQkJcmV0dXJuIGxpbmU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoZSBsaW5rZWQgbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXh0IGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoZSBsaW5rZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlZkxvY2F0aW9uIGdldE5leHQoKSB7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRFREVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL0RURFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzQ0YTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRFREVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotCi0vKioKLSAqIEFuIERURCB2YWxpZGF0b3Igc3BlY2lmaWMgdG8gRWNsaXBzZS4gVGhpcyB2YWxpZGF0b3Igd2lsbCB3cmFwIHRoZSBpbnRlcm5hbAotICogRFREIHZhbGlkYXRvciB0byBwcm92aWRlIGF1dG9tYXRpYyBVUkkgcmVzb2x1dGlvbiBzdXBwb3J0LgotICogVXNpbmcgdGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIHVzaW5nIHRoZSBpbnRlcm5hbCBEVEQgdmFsaWRhdG9yIGFuZCByZWdpc3RlcmluZwotICogdGhlIFVSSSByZXNvbHZlciBmcm9tIHRoZSBVUkkgcmVzb2x1dGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERWYWxpZGF0b3IgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EVERWYWxpZGF0b3IgCi17Ci0gIHByaXZhdGUgc3RhdGljIERURFZhbGlkYXRvciBfaW5zdGFuY2UgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiBSZWdpc3RlcnMgVVJJIHJlc29sdXRpb24gZnJhbWV3b3JrIHdpdGggdGhlIERURCB2YWxpZGF0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgRFREVmFsaWRhdG9yKCkKLSAgewotCXN1cGVyKCk7Ci0Jc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2Ugc3BlY2lmaWMgRFREIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHNwZWNpZmljIERURCB2YWxpZGF0b3IuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIERURFZhbGlkYXRvciBnZXRJbnN0YW5jZSgpIAotICB7Ci0JaWYgKF9pbnN0YW5jZSA9PSBudWxsKSAKLQl7Ci0JICBfaW5zdGFuY2UgPSBuZXcgRFREVmFsaWRhdG9yKCk7Ci0JfQotCXJldHVybiBfaW5zdGFuY2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzk0MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci0KLS8qKgotICogRFREIHZhbGlkYXRvciB0aGF0IGlzIGNvbnRyaWJ1dGVkIHRvIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0TmVzdGVkVmFsaWRhdG9yIAotewotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEuaW8uSW5wdXRTdHJlYW0sIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIAotICB7Ci0JRFREVmFsaWRhdG9yIHZhbGlkYXRvciA9IERURFZhbGlkYXRvci5nZXRJbnN0YW5jZSgpOwotCi0JVmFsaWRhdGlvblJlcG9ydCB2YWxyZXBvcnQgPSBudWxsOwotCXZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZSh1cmkpOwotCQotCXJldHVybiB2YWxyZXBvcnQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYzI0NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLy8gYmFzZSBjbGFzcyBmb3IgYW4gRWxlbWVudCdzIGNvbnRlbnRtb2RlbAotcHVibGljIGNsYXNzIEF0dHJpYnV0ZSBleHRlbmRzIERURE5vZGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEEgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0NIQVJBQ1RFUl9EQVRBX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVElFUyA9IERURENvcmVNZXNzYWdlcy5fVUlfRU5USVRZX05BTUVTX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVElUWV9OQU1FX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNRVJBVEVEX05BTUUgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVU1fTkFNRV9UT0tFTlNfREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU1FUkFURURfTk9UQVRJT04gPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVU1fTk9UQVRJT05fREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJWEVEID0gIiNGSVhFRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IERURENvcmVNZXNzYWdlcy5fVUlfSURFTlRJRklFUl9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUYgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0lEX1JFRkVSRU5DRV9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZTID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9JRF9SRUZFUkVOQ0VTX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExJRUQgPSAiI0lNUExJRUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTiA9IERURENvcmVNZXNzYWdlcy5fVUlfTkFNRV9UT0tFTl9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTlMgPSBEVERDb3JlTWVzc2FnZXMuX1VJX05BTUVfVE9LRU5TX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRCA9ICIjUkVRVUlSRUQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIEhhc2h0YWJsZSB0eXBlSGFzaCA9IG5ldyBIYXNodGFibGUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gdHlwZXMgPSB7Q0RBVEEsIElELCBJRFJFRiwgSURSRUZTLCBFTlRJVFksIEVOVElUSUVTLCBOTVRPS0VOLCBOTVRPS0VOUywgRU5VTUVSQVRFRF9OQU1FLCBFTlVNRVJBVEVEX05PVEFUSU9OfTsKLQotCXsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQsIENEQVRBKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLklEX0tFWVdPUkQsIElEKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQsIElEUkVGKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JELCBJRFJFRlMpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQsIEVOVElUWSk7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVElFU19LRVlXT1JELCBFTlRJVElFUyk7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQsIE5NVE9LRU4pOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCwgTk1UT0tFTlMpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCwgRU5VTUVSQVRFRF9OT1RBVElPTik7Ci0JCS8vIHRoaXMgb25lJ3MgYSBzcGVjaWFsIGNhc2Ugc2luY2UgdGhlcmUgaXMgbm8ga2V5d29yZCBmb3IKLQkJLy8gZW51bWVyYXRlZCBuYW1lIHRva2VucwotCQl0eXBlSGFzaC5wdXQoIigpIiwgRU5VTUVSQVRFRF9OQU1FKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIG5vdyBwdXQgdGhlIHJldmVyc2UgaW4gcGxhY2UuIFRoaXMgZ2l2ZXMgdXMgYSAyIHdheSBsb29rdXAKLQkJLy8gZm9yIHdoZW4gd2Ugd2FudCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYW5kIHdoZW4gd2Ugd2FudCB0byBzZXQgaXQKLQkJdHlwZUhhc2gucHV0KENEQVRBLCAiQ0RBVEEiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoSUQsICJJRCIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChJRFJFRiwgIklEUkVGIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KElEUkVGUywgIklEUkVGUyIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChFTlRJVFksICJFTlRJVFkiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoRU5USVRJRVMsICJFTlRJVElFUyIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChOTVRPS0VOLCAiTk1UT0tFTiIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChOTVRPS0VOUywgIk5NVE9LRU5TIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KEVOVU1FUkFURURfTkFNRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChFTlVNRVJBVEVEX05PVEFUSU9OLCAiTk9UQVRJT04iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgQXR0cmlidXRlRW51bUxpc3QgZW51bUxpc3QgPSBudWxsOwotCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTElFRCA9ICJJTVBMSUVEIjsKLQotCXB1YmxpYyBBdHRyaWJ1dGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLaW5kKCkgewotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0S2luZFJlZ2lvbiA9IGdldERlZmF1bHRLaW5kUmVnaW9uKCk7Ci0JCWlmIChkZWZhdWx0S2luZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChkZWZhdWx0S2luZFJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RGVmYXVsdEtpbmRSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0VmFsdWUgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKGRlZmF1bHRWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUVudW1MaXN0IGdldEVudW1MaXN0KCkgewotCQlyZXR1cm4gZW51bUxpc3Q7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkFUVFJJQlVURUlDT04pOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5BVFRSSUJVVEVfTkFNRSk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5leHRRdW90ZWRMaXRlcmFsKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCkgfHwgcmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldE9mZnNldEFmdGVyVHlwZSgpIHsKLQkJSVRleHRSZWdpb24gdHlwZVJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQotCQlTdHJpbmcgdHlwZSA9IGdldFR5cGUoKTsKLQkJYm9vbGVhbiBpc0VudW1lcmF0aW9uID0gdHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OQU1FKSB8fCB0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05PVEFUSU9OKTsKLQkJaWYgKGlzRW51bWVyYXRpb24pIHsKLQkJCS8vIG5vdyBjaGVjayBpZiBtYXliZSB0aGlzIGlzIGFuIGVudW1lcmF0aW9uCi0JCQlpZiAoZ2V0RW51bUxpc3QoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldEVudW1MaXN0KCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHR5cGVSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCh0eXBlUmVnaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pOwotCQkJLy8gLy8gY3JlYXRlIG9uZQotCQkJLy8gdHlwZVJlZ2lvbiA9Ci0JCQkvLyBmaW5kT3JDcmVhdGVUeXBlUmVnaW9uKChTdHJpbmcpdHlwZUhhc2guZ2V0KENEQVRBKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIHR5cGVIYXNoLmdldChyZWdpb24uZ2V0VHlwZSgpKTsKLQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkvLyBqdXN0IHJldHVybiB0aGUgdGV4dCBvZiB0aGUgdHlwZSByZWdpb24gc2luY2UgdGhpcyBtYXkgYmUKLQkJCQkvLyBhbiBlbnRpdHkgcmVwcmVzZW50aW5nIHRoZSB0eXBlOwotCQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCQllbHNlIGlmIChnZXRFbnVtTGlzdCgpICE9IG51bGwpIHsKLQkJCS8vIGVudW1lcmF0ZWQgbmFtZSB0b2tlbnMgZG9uJ3QgaGF2ZSBhIHR5cGUga2V5d29yZC4ganVzdAotCQkJLy8gdGhlIGV4aXN0ZW5jZSBvZiB0aGUgbGVmdCBwYXJlbiBpcyBlbm91Z2gKLQkJCXJldHVybiAoU3RyaW5nKSB0eXBlSGFzaC5nZXQoIigpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRUeXBlUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLklEX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5JRFJFRl9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OTVRPS0VOU19LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLlBBUk1fRU5USVRZX1RZUEUpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlLmVxdWFscyhEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCkgfHwgdHlwZS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKTsKLQkJCXJldHVybiB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlZ2lvbnMoKSB7Ci0JCXJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pKSB7Ci0JCQkJZW51bUxpc3QgPSBuZXcgQXR0cmlidXRlRW51bUxpc3QoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQl9Ci0JCQlpZiAoZW51bUxpc3QgIT0gbnVsbCkgewotCQkJCWVudW1MaXN0LmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdEtpbmQoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIGtpbmQpIHsKLQotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0S2luZFJlZ2lvbiA9IGdldERlZmF1bHRLaW5kUmVnaW9uKCk7Ci0JCVN0cmluZyBvbGREZWZhdWx0S2luZCA9IGRlZmF1bHRLaW5kUmVnaW9uID09IG51bGwgPyAiIiA6IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoZGVmYXVsdEtpbmRSZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCWlmICgha2luZC5lcXVhbHMob2xkRGVmYXVsdEtpbmQpKSB7Ci0JCQlTdHJpbmcgbmV3VGV4dCA9IGtpbmQ7Ci0JCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQlpZiAoZGVmYXVsdEtpbmRSZWdpb24gIT0gbnVsbCkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoZGVmYXVsdEtpbmRSZWdpb24pOwotCQkJCWxlbmd0aCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChkZWZhdWx0S2luZFJlZ2lvbikgLSBzdGFydE9mZnNldDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0T2Zmc2V0QWZ0ZXJUeXBlKCk7Ci0JCQkJbmV3VGV4dCA9ICIgIiArIG5ld1RleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJSVRleHRSZWdpb24gZGVmYXVsdFZhbHVlID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcmF0b3IoKSk7Ci0KLQkJCWlmIChraW5kLmVxdWFscyhBdHRyaWJ1dGUuRklYRUQpIHx8IGtpbmQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCS8vIHdlIGFyZSBjaGFuZ2luZyB0byBmaXhlZCBhbmQgd2VoYXZlIG5vIHF1b3RlZCByZWdpb24uCi0JCQkJCS8vIHB1dCBpbiBhbiBlbXB0eSB2YWx1ZQotCQkJCQluZXdUZXh0ICs9ICIgXCJcIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJbGVuZ3RoID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRWYWx1ZSkgLSBzdGFydE9mZnNldDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgsIG5ld1RleHQpOwotCQkJLy8gZG8gc29tZXRoaW5nIGlmIHRoZXJlIGlzIG5vICJraW5kIiByZWdpb24KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRLaW5kKFN0cmluZyBraW5kKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUl9ERUZBVUxUX0tJTkQpOyAvLyROT04tTkxTLTEkCi0JCXNldERlZmF1bHRLaW5kKHRoaXMsIGtpbmQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBmaXhlZCkgewotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0VmFsdWUgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJU3RyaW5nIHF1b3RlQ2hhciA9IHZhbHVlLmluZGV4T2YoIlwiIikgPT0gLTEgPyAiXCIiIDogIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQlpbnQgZW5kT2Zmc2V0ID0gMDsKLQkJU3RyaW5nIG5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBvbGRWYWx1ZSA9IGdldERlZmF1bHRWYWx1ZSgpOwotCQlib29sZWFuIG9sZEtpbmRJc0ZpeGVkID0gZ2V0RGVmYXVsdEtpbmQoKS5lcXVhbHMoQXR0cmlidXRlLkZJWEVEKTsKLQkJaWYgKG9sZFZhbHVlLmVxdWFscyh2YWx1ZSkgJiYgZml4ZWQgPT0gb2xkS2luZElzRml4ZWQpIHsKLQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChkZWZhdWx0VmFsdWUpOwotCQkJZW5kT2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRWYWx1ZSk7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0S2luZFJlZ2lvbiA9IGdldERlZmF1bHRLaW5kUmVnaW9uKCk7Ci0JCWlmIChkZWZhdWx0S2luZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGRlZmF1bHRLaW5kUmVnaW9uKTsKLQkJCWVuZE9mZnNldCA9IGVuZE9mZnNldCA9PSAwID8gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRLaW5kUmVnaW9uKSA6IGVuZE9mZnNldDsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChzdGFydE9mZnNldCA9PSAwKSB7Ci0JCQkJZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgPSBnZXRPZmZzZXRBZnRlclR5cGUoKTsKLQkJCQluZXdUZXh0ICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJSVRleHRSZWdpb24gdHlwZVJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQkJCWlmICh0eXBlUmVnaW9uID09IG51bGwgJiYgZ2V0RW51bUxpc3QoKSA9PSBudWxsKSB7Ci0JCQkJLy8gdGFjayBvbiBhIGRlZmF1bHQgdHlwZQotCQkJCS8vIG5ld1RleHQgKz0gIkNEQVRBICI7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpeGVkKSB7Ci0JCQluZXdUZXh0ICs9ICIjRklYRUQgIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldERlZmF1bHRLaW5kKCkuZXF1YWxzKCIiKSAmJiB2YWx1ZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS8vIGlmIG5vdCBmaXhlZCBhbmQgdmFsdWUgaXMgIiIgdGhlbiByZXNldCB0aGUgZGVmYXVsdCBraW5kIHRvCi0JCQkJLy8gaW1wbGllZAotCQkJCW5ld1RleHQgKz0gIiNJTVBMSUVEIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKCFnZXRUeXBlKCkuZXF1YWxzKCIiKSAmJiAhdmFsdWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW5ld1RleHQgKz0gcXVvdGVDaGFyICsgdmFsdWUgKyBxdW90ZUNoYXI7Ci0JCX0KLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgdmFsdWUsIGJvb2xlYW4gZml4ZWQpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9BVFRSX0RFRkFVTFRfVkFMKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZWZhdWx0VmFsdWUodGhpcywgdmFsdWUsIGZpeGVkKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIHR5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSBnZXRUeXBlKCk7Ci0JCWlmICghdHlwZS5lcXVhbHMob2xkVHlwZSkpIHsKLQkJCWJvb2xlYW4gd2FzRW51bWVyYXRpb24gPSBvbGRUeXBlLmVxdWFscyhFTlVNRVJBVEVEX05BTUUpIHx8IG9sZFR5cGUuZXF1YWxzKEVOVU1FUkFURURfTk9UQVRJT04pOwotCQkJYm9vbGVhbiBpc0VudW1lcmF0aW9uID0gdHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OQU1FKSB8fCB0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05PVEFUSU9OKTsKLQkJCVN0cmluZyBuZXdUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gMDsKLQotCQkJaWYgKHdhc0VudW1lcmF0aW9uICYmICFpc0VudW1lcmF0aW9uKSB7Ci0JCQkJLy8gZ2V0IHJpZCBvZiB0aGUgb2xkIGVudW1saXN0Ci0JCQkJQXR0cmlidXRlRW51bUxpc3QgZW51bUxpc3QgPSBnZXRFbnVtTGlzdCgpOwotCQkJCWlmIChlbnVtTGlzdCAhPSBudWxsKSB7Ci0JCQkJCXN0YXJ0T2Zmc2V0ID0gZW51bUxpc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJZW5kT2Zmc2V0ID0gZW51bUxpc3QuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJfQotCQkJfQotCi0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRUeXBlUmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJaWYgKGVuZE9mZnNldCA9PSAwKSB7Ci0JCQkJCWVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXJ0T2Zmc2V0ID09IDApIHsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCQkJCW5ld1RleHQgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQkJZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbik7Ci0JCQl9Ci0KLQkJCVN0cmluZyBuZXdUeXBlV29yZCA9IChTdHJpbmcpIHR5cGVIYXNoLmdldCh0eXBlKTsKLQkJCWlmIChuZXdUeXBlV29yZCA9PSBudWxsKSB7Ci0JCQkJLy8gdGhlbiB0aGlzIG11c3QgYmUgYSBwYXJtIGVudGl0eSBiZWluZyB1c2VkIGluIHRoZSB0eXBlCi0JCQkJLy8gdXNlIHRoZSB0eXBlIHRleHQgZGlyZWN0bHkKLQkJCQluZXdUeXBlV29yZCA9IHR5cGU7Ci0JCQl9Ci0KLQkJCW5ld1RleHQgKz0gbmV3VHlwZVdvcmQ7Ci0KLQkJCWlmIChpc0VudW1lcmF0aW9uICYmICF3YXNFbnVtZXJhdGlvbikgewotCQkJCS8vIHB1dCBpbiBhIG5ldyBudW1saXN0Ci0JCQkJYm9vbGVhbiBpc1NwYWNlTmVlZGVkID0gIXR5cGUuZXF1YWxzKEVOVU1FUkFURURfTkFNRSk7Ci0JCQkJbmV3VGV4dCArPSBpc1NwYWNlTmVlZGVkID8gIiAiIDogIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW5ld1RleHQgKz0gIigpIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCQkJaWYgKG5ld1R5cGVXb3JkLmVxdWFscygiIikgJiYgIXR5cGUuZXF1YWxzKEVOVU1FUkFURURfTkFNRSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIHRoZSBzZXQgdGhlIGRlZmF1bHRraW5kIHRvICIiCi0JCQkJLy8gc2V0RGVmYXVsdEtpbmQocmVxdWVzdG9yLCAiIik7Ci0JCQkJc2V0RGVmYXVsdFZhbHVlKHJlcXVlc3RvciwgIiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUl9UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUeXBlKHRoaXMsIHR5cGUpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVFbnVtTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVFbnVtTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDIwNTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlRW51bUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRW51bUxpc3QgZXh0ZW5kcyBEVEROb2RlIHsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgQXR0cmlidXRlRW51bUxpc3QoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCS8vIG5ldmVyIGV4cG9zZWQgaW4gdHJlZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyByZXR1cm4gdGhlIGl0ZW1zIHRoYXQgYXJlIGluIHRoaXMgZW51bWVyYXRlZCBsaXN0Ci0JcHVibGljIExpc3QgZ2V0SXRlbXMoKSB7Ci0JCWxpc3QuY2xlYXIoKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gbmFtZSA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuTkFNRSk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJbGlzdC5hZGQoZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChuYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXRlbXMoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nW10gaXRlbXMpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCVN0cmluZyB0ZXh0ID0gIigiOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCXRleHQgKz0gIiB8ICIgKyBpdGVtc1tpXTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGV4dCArPSBpdGVtc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCQl0ZXh0ICs9ICIpIjsgLy8kTk9OLU5MUy0xJAotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksIHRleHQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9BVFRSX0VOVU1fSVRFTVMpOyAvLyROT04tTkxTLTEkCi0JCXNldEl0ZW1zKHRoaXMsIGl0ZW1zKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjI0NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVMaXN0IGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCXB1YmxpYyBBdHRyaWJ1dGVMaXN0KERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0FUVFJfTElTVF9BREQpOyAvLyROT04tTkxTLTEkCi0KLQkJRFRETm9kZSBsYXN0QXR0cmlidXRlID0gKERURE5vZGUpIGdldExhc3RDaGlsZCgpOwotCQlpZiAobGFzdEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQlyZXBsYWNlVGV4dCh0aGlzLCBsYXN0QXR0cmlidXRlLmdldEVuZE9mZnNldCgpLCAwLCAiXG5cdCIgKyBuYW1lICsgIiBDREFUQSAjSU1QTElFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pLCAwLCAiXG5cdCIgKyBuYW1lICsgIiBDREFUQSAjSU1QTElFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQl9Ci0KLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5BVFRSSUJVVEVMSVNUSUNPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0SW50b01vZGVsKE9iamVjdCByZXF1ZXN0b3IsIEF0dHJpYnV0ZSByZWZlcmVuY2UsIEF0dHJpYnV0ZSBub2RlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCVN0cmluZyBuZXdUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5vZGVUZXh0ID0gbm9kZS5nZXRGdWxsTm9kZVRleHQoKTsKLQkJaWYgKCFpc0FmdGVyKSB7Ci0JCQlvZmZzZXQgPSByZWZlcmVuY2UuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHRyeSBhbmQgZ2V0IG5leHQgY2hpbGQKLQkJCUF0dHJpYnV0ZSBhdHRyID0gKEF0dHJpYnV0ZSkgcmVmZXJlbmNlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJb2Zmc2V0ID0gYXR0ci5nZXRTdGFydE9mZnNldCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8ganVzdCB1c2UgdGhlIGVuZCBvZmZzZXQKLQkJCQlvZmZzZXQgPSByZWZlcmVuY2UuZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpOwotCQkJfQotCQl9Ci0JCW5ld1RleHQgKz0gbm9kZVRleHQ7Ly8gKyAoaXNMYXN0Q2hpbGQgPyAiXG4iIDogIlxuXHQiKTsKLQkJaWYgKCFub2RlLmhhc1RyYWlsaW5nV2hpdGVzcGFjZSgpKSB7Ci0JCQluZXdUZXh0ICs9ICJcblx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgb2Zmc2V0LCAwLCBuZXdUZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlUmVnaW9ucygpIHsKLQkJcmVtb3ZlQ2hpbGROb2RlcygpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQlpZiAoZ2V0TmFtZVJlZ2lvbigpICE9IG51bGwpIHsKLQkJCS8vIHdlIHNraXAgcGFzdCB0aGUgbmFtZSB0b2tlbiBpcyBvdXIgbmFtZQotCQkJc2tpcFBhc3ROYW1lKGl0ZXIpOwotCQl9Ci0KLQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gbnVsbDsKLQkJYm9vbGVhbiB0cmFpbGluZ1doaXRlc3BhY2UgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVFJJQlVURV9OQU1FKSkgewotCQkJCWF0dHJpYnV0ZSA9IG5ldyBBdHRyaWJ1dGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJY2hpbGRyZW4uYWRkKGF0dHJpYnV0ZSk7Ci0JCQkJYXBwZW5kQ2hpbGQoYXR0cmlidXRlKTsKLQkJCQl0cmFpbGluZ1doaXRlc3BhY2UgPSBmYWxzZTsKLQkJCX0KLQkJCWlmIChhdHRyaWJ1dGUgIT0gbnVsbCAmJiBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSAhPSBEVERSZWdpb25UeXBlcy5FTkRfVEFHKSB7Ci0JCQkJaWYgKCF0cmFpbGluZ1doaXRlc3BhY2UpIHsKLQkJCQkJYXR0cmlidXRlLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSB7Ci0JCQkJCQlhdHRyaWJ1dGUuYWRkV2hpdGVzcGFjZVJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHRoZSBmb2xsb3dpbmcgcHJldmVudHMgZXh0cmEgd2hpdGVzcGFjZSBmcm9tIGJlaW5nIHBpY2tlZAotCQkJCS8vIHVwIGJ5IHRoZSBhdHRyaWJ1dGUKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5JTVBMSUVEX0tFWVdPUkQgfHwgY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwgfHwgY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpIHsKLQkJCQkJdHJhaWxpbmdXaGl0ZXNwYWNlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IG51bUtpZHMgPSBjaGlsZHJlbi5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2lkczsgaSsrKSB7Ci0JCQkoKEF0dHJpYnV0ZSkgY2hpbGRyZW4uZ2V0KGkpKS5yZXNvbHZlUmVnaW9ucygpOwotCQl9IC8vIGVuZCBvZiBmb3IgKCkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNQmFzaWNOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNQmFzaWNOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OWFhM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTUJhc2ljTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qCi0gKiBDTUJhc2ljTm9kZSBjb21iaW5lcyBhbGwgdGhlIGRpZmZlcmVudCBjb250ZW50IHR5cGVzIGludG8gb25lLiBUaGUgaWRlYQotICogYmVoaW5kIHRoaXMgaXMgdG8gYWxsb3cgYXJiaXRyYXJ5IG5hbWUgY2hhbmdlcyB0byBub3QgcmVxdWlyZSBhIHRyZWUKLSAqIHVwZGF0ZS4KLSAqLwotcHVibGljIGNsYXNzIENNQmFzaWNOb2RlIGV4dGVuZHMgQ01SZXBlYXRhYmxlTm9kZSB7Ci0KLQkvLyBzdGF0aWMgZmluYWwgaW50IEVNUFRZID0gMDsKLQkvLyBzdGF0aWMgZmluYWwgaW50IEFOWSA9IDE7Ci0JLy8gc3RhdGljIGZpbmFsIGludCBQQ0RBVEEgPSAyOwotCi0JcHVibGljIENNQmFzaWNOb2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJSVRleHRSZWdpb24gcGNkYXRhID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7Ci0JCWlmIChwY2RhdGEgIT0gbnVsbCkgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5QQ0RBVEFJQ09OKTsKLQkJfQotCi0JCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoRU1QVFkpKSB7Ci0JCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5FTVBUWUlDT04pOwotCQkJfQotCQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoQU5ZKSkgewotCQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuQU5ZSUNPTik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBPdGhlcndpc2UgdGhpcyBpcyBqdXN0IGFuIGVsZW1lbnQgcmVmZXJlbmNlIG5vZGUuIEp1c3QgcmV0dXJuCi0JCS8vIHdoYXQgQ01SZXBlYXRhYmxlTm9kZSB3b3VsZCBnaXZlIHVzCi0JCXJldHVybiBzdXBlci5nZXRJbWFnZSgpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk5BTUUgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gcmV0dXJucyB0aGUgb2NjdXJyZW5jZXRva2VuLCBvciB0aGUgdG9rZW4gd2hlcmUgdGhlIG9jY3VycmVuY2UgdG9rZW4KLQkvLyBzaG91bGQgYXBwZWFyIGFmdGVyCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE9jY3VycmVuY2VSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlza2lwUGFzdE5hbWUoaXRlcik7Ci0JCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0TmFtZVJlZ2lvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJSVRleHRSZWdpb24gcGNkYXRhID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7Ci0JCWlmIChwY2RhdGEgIT0gbnVsbCkgewotCQkJcmV0dXJuIFBDREFUQTsKLQkJfQotCi0JCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKEVNUFRZKSkgewotCQkJCQlyZXR1cm4gRU1QVFk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5hbWUuZXF1YWxzKEFOWSkpIHsKLQkJCQkJcmV0dXJuIEFOWTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG90aGVyd2lzZSBqdXN0IHJldHVybiBpdCdzIG5hbWUgYXMgdGhlIHR5cGUKLQkJCQkJcmV0dXJuIG5hbWU7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eUFueU9yUENEYXRhKCkgewotCQlpZiAoaXNQQ0RhdGEoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCi0JCWZpbmFsIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKG5hbWUuZXF1YWxzKEVNUFRZKSB8fCBuYW1lLmVxdWFscyhBTlkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUENEYXRhKCkgewotCQlJVGV4dFJlZ2lvbiBwY2RhdGEgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKTsKLQkJaWYgKHBjZGF0YSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gcHVibGljIE5vZGUgaW5zZXJ0UmVnaW9uKFJlZ2lvbiB0b2tlbikKLQkvLyB7Ci0JLy8gaWYgKCF0b2tlblN0cmVhbS5jb250YWluc1Rva2VuKHRva2VuKSAmJiB0b2tlbi5nZXRUeXBlKCkgPT0KLQkvLyBUb2tlbi5PQ0NVUl9UWVBFKQotCS8vIHsKLQkvLyAvLyB0aGVuIGFkZCBpdCBzbyB0aGF0IG91ciByYW5nZSBjb250YWlucyBpdAotCS8vIGluc2VydEludG9Ub2tlblN0cmVhbSh0b2tlbik7Ci0JLy8gfQotCS8vIHJldHVybiB0aGlzOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gIWlzRW1wdHlBbnlPclBDRGF0YSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5hbWUpIHsKLQkJLy8gYmVnaW5SZWNvcmRpbmcocmVxdWVzdG9yLCAiTmFtZSBDaGFuZ2UiKTsKLQotCQlzdXBlci5zZXROYW1lKHJlcXVlc3RvciwgbmFtZSk7Ci0JCWlmICghaXNSZWZlcmVuY2UoKSkgewotCQkJLy8gaWYgaXQgaXMgbm8gbG9uZ2VyIGEgcmVmZXJlbmNlIG5vZGUsIHJlbW92ZSB0aGUgb2NjdXJyZW5jZQotCQkJLy8gdG9rZW4KLQkJCXNldE9jY3VycmVuY2UocmVxdWVzdG9yLCBDTVJlcGVhdGFibGVOb2RlLk9OQ0UpOwotCQl9Ci0KLQkJLy8gZW5kUmVjb3JkaW5nKHJlcXVlc3Rvcik7Ci0JfQotCi0JLyoKLQkgKiBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKGludCB0eXBlKSB7IHN3aXRjaCAodHlwZSkgeyBjYXNlIEVNUFRZOgotCSAqIHJldHVybiBlbXB0eVN0cmluZzsgY2FzZSBBTlk6IHJldHVybiBhbnlTdHJpbmc7IGNhc2UgUENEQVRBOiByZXR1cm4KLQkgKiBwY2RhdGFTdHJpbmc7IGRlZmF1bHQ6IGJyZWFrOyB9IC8vIGVuZCBvZiBzd2l0Y2ggKCkgcmV0dXJuICIiOyB9Ci0JICovCi0KLX0vLyBDTUJhc2ljTm9kZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTUdyb3VwTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTUdyb3VwTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmQ1Mzg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01Hcm91cE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVERVbmlxdWVOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIENNR3JvdXBOb2RlIGV4dGVuZHMgQ01SZXBlYXRhYmxlTm9kZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hPSUNFID0gJ3wnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTRVFVRU5DRSA9ICcsJzsKLQotCXByb3RlY3RlZCBjaGFyIGNvbm5lY3RvciA9IFNFUVVFTkNFOwotCi0JLy8gcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBDTUdyb3VwTm9kZShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENoaWxkKCkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0FERF9DSElMRCk7IC8vJE5PTi1OTFMtMSQKLQkJRFRETm9kZSBsYXN0Tm9kZSA9IChEVEROb2RlKSBnZXRMYXN0Q2hpbGQoKTsKLQkJU3RyaW5nIGVsZW1lbnROYW1lID0gRFREVW5pcXVlTmFtZUhlbHBlci5nZXRVbmlxdWVOYW1lKGdldENoaWxkcmVuTGlzdCgpLCAiQ2hpbGROb2RlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGxhc3ROb2RlLmdldEVuZE9mZnNldCgpLCAwLCBTdHJpbmcudmFsdWVPZihnZXRDb25uZWN0b3IoKSkgKyBlbGVtZW50TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0YXJ0T2Zmc2V0KCkgKyAxLCAwLCBlbGVtZW50TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRHcm91cCgpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfR1JQKTsgLy8kTk9OLU5MUy0xJAotCQlEVEROb2RlIGxhc3ROb2RlID0gKERURE5vZGUpIGdldExhc3RDaGlsZCgpOwotCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJcmVwbGFjZVRleHQodGhpcywgbGFzdE5vZGUuZ2V0RW5kT2Zmc2V0KCksIDAsIFN0cmluZy52YWx1ZU9mKGdldENvbm5lY3RvcigpKSArICIgKCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSArIDEsIDAsICIoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgY2hpbGQpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCi0JCWlmIChjaGlsZHJlbi5sZW5ndGggPT0gMSAmJiBnZXRGaXJzdENoaWxkKCkgPT0gY2hpbGQpIHsKLQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgY2hpbGQuZ2V0U3RhcnRPZmZzZXQoKSwgY2hpbGQuZ2V0Tm9kZUxlbmd0aCgpLCBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQlEVEROb2RlIGNoaWxkQSA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCURURE5vZGUgY2hpbGRCID0gKERURE5vZGUpIGNoaWxkcmVuW2kgKyAxXTsKLQotCQkJYm9vbGVhbiBjaGlsZEFEZWxldGVkID0gY2hpbGRBID09IGNoaWxkOwotCQkJYm9vbGVhbiBjaGlsZEJEZWxldGVkID0gY2hpbGRCID09IGNoaWxkOwotCQkJaWYgKGNoaWxkQURlbGV0ZWQgfHwgY2hpbGRCRGVsZXRlZCkgewotCQkJCS8vIHdlIGZvdW5kIHRoZSBjaGlsZAotCQkJCWludCBzdGFydE9mZnNldCA9IGNoaWxkQURlbGV0ZWQgPyBjaGlsZEEuZ2V0U3RhcnRPZmZzZXQoKSA6IGNoaWxkQS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlpbnQgZW5kT2Zmc2V0ID0gY2hpbGRBRGVsZXRlZCA/IGNoaWxkQi5nZXRTdGFydE9mZnNldCgpIDogY2hpbGRCLmdldEVuZE9mZnNldCgpOwotCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGNvbm5lY3Rvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGNvbm5lY3Rvci4KLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRDb25uZWN0b3IoKSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGggLSAxOyBpKyspIHsKLQkJCURURE5vZGUgY2hpbGRBID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJRFRETm9kZSBjaGlsZEIgPSAoRFRETm9kZSkgY2hpbGRyZW5baSArIDFdOwotCi0JCQkvLyBjcmVhdGUgYSBzdHJlYW0gYmV0d2VlbiB0aGUgdHdvIHNpYmxpbmdzIGFuZCB3YWxrIGl0Ci0JCQkvLyBub3RlIHRoYXQgdGhpcyBzdHJlYW0gaW5jbHVkZXMgdGhlIGxhc3QgcmVnaW9uIG9mIHRoZSBmaXJzdAotCQkJLy8gc2libGluZyBhbmQgdGhlIGZpcnN0IHJlZ2lvbiBvZiB0aGUgbmV4dCBzaWJsaW5nLgotCQkJLy8gYm90aCB0aGVzZSBzaG91bGQgYmUgaWdub3JlZAotCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IG5ldyBSZWdpb25JdGVyYXRvcihnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSwgY2hpbGRBLmdldEVuZE9mZnNldCgpLCBjaGlsZEIuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkvLyBzdHJlYW0uc2V0Rmlyc3RSZWdpb24oY2hpbGRBLmdldExhc3RSZWdpb24oKSk7Ci0JCQkvLyBzdHJlYW0uc2V0TGFzdFJlZ2lvbihjaGlsZEIuZ2V0Rmlyc3RSZWdpb24oKSk7Ci0JCQkvLyBJdGVyYXRvciBpdGVyID0gc3RyZWFtLml0ZXJhdG9yKCk7Ci0JCQkvLyBza2lwIHRoZSBmaXJzdCByZWdpb24gd2hpY2ggaXMgdGhlIGxhc3QgcmVnaW9uIG9mIGNoaWxkQQotCQkJLy8gZG8gd2UgbmVlZCB0aGlzIG5vdyA/Ci0JCQkvLyBpdGVyLm5leHQoKTsKLQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBudWxsOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmIGN1cnJlbnRSZWdpb24gIT0gY2hpbGRCLmdldFN0YXJ0UmVnaW9uKCkpIHsKLQkJCQljdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUikgewotCQkJCQljb25uZWN0b3IgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KGN1cnJlbnRSZWdpb24pLmNoYXJBdCgwKTsKLQkJCQkJcmV0dXJuIGNvbm5lY3RvcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbm5lY3RvcjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCURURENvcmVQbHVnaW4gcmVzb3VyY2VQbHVnaW4gPSBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JCXN3aXRjaCAoZ2V0Q29ubmVjdG9yKCkpIHsKLQkJCWNhc2UgU0VRVUVOQ0UgOgotCQkJCXJldHVybiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PTkVTRVFVRU5DRUlDT04pOwotCQkJLyoKLQkJCSAqIHN3aXRjaCAoZ2V0T2NjdXJyZW5jZSgpKSB7IGNhc2UgT05DRSA6IHJldHVybgotCQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT05FU0VRVUVOQ0VJQ09OKTsgY2FzZQotCQkJICogT1BUSU9OQUwgOiByZXR1cm4KLQkJCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9QVElPTkFMU0VRVUVOQ0VJQ09OKTsgY2FzZQotCQkJICogT05FX09SX01PUkUgOiByZXR1cm4KLQkJCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9ORU9STU9SRVNFUVVFTkNFSUNPTik7Ci0JCQkgKiBjYXNlIFpFUk9fT1JfTU9SRSA6IHJldHVybgotCQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuWkVST09STU9SRVNFUVVFTkNFSUNPTik7IH0KLQkJCSAqLwotCQkJY2FzZSBDSE9JQ0UgOgotCQkJCXJldHVybiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PTkVDSE9JQ0VJQ09OKTsKLQkJLyoKLQkJICogc3dpdGNoIChnZXRPY2N1cnJlbmNlKCkpIHsgY2FzZSBPTkNFIDogcmV0dXJuCi0JCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9ORUNIT0lDRUlDT04pOyBjYXNlIE9QVElPTkFMIDoKLQkJICogcmV0dXJuIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9QVElPTkFMQ0hPSUNFSUNPTik7Ci0JCSAqIGNhc2UgT05FX09SX01PUkUgOiByZXR1cm4KLQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT05FT1JNT1JFQ0hPSUNFSUNPTik7IGNhc2UKLQkJICogWkVST19PUl9NT1JFIDogcmV0dXJuCi0JCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLlpFUk9PUk1PUkVDSE9JQ0VJQ09OKTsgfQotCQkgKi8KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHJldHVybnMgdGhlIG9jY3VycmVuY2VyZWdpb24sIG9yIHRoZSBsYXN0IHJlZ2lvbiB3aGVyZSB0aGUgb2NjdXJyZW5jZQotCS8vIHJlZ2lvbiBzaG91bGQgYXBwZWFyIGFmdGVyCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE9jY3VycmVuY2VSZWdpb24oKSB7Ci0JCWludCBuZXN0aW5nID0gMDsKLQotCQkvLyB3ZSBza2lwIHBhc3QgdGhlIGZpcnN0IGxlZnQgcGFyZW4gd2Ugc2VlIHNpbmNlIHRoYXQgaXMgdGhlCi0JCS8vIGJlZ2lubmluZyBvZiBvdXIgb3duIG5vZGUKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCS8vIHdlIGFzc3VtZSB0aGUgZmlyc3QgcmVnaW9uIGlzIHRoZSAnKCcKLQkJaXRlci5uZXh0KCk7Ci0JCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgbmVzdGluZyA+PSAwKSB7Ci0JCQljdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTikgewotCQkJCW5lc3RpbmcrKzsKLQkJCX0KLQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTikgewotCQkJCW5lc3RpbmctLTsKLQkJCX0KLQkJfQotCQlpZiAobmVzdGluZyA8IDApIHsKLQkJCS8vIFRoaXMgbWVhbnMgd2UgaGF2ZSBwYXNzZWQgb3ZlciB0aGUgcmlnaHQgcGFyZW4gdGhhdCBtYXJrcyB0aGUKLQkJCS8vIGVuZCBvZiBvdXIgZ3JvdXBpbmcuCi0JCQkvLyBMb29rIGZvciBhbiBvY2N1cnJlbmNlIHJlZ2lvbgotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSB7Ci0JCQkJCXJldHVybiBjdXJyZW50UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSdyZSBoZXJlLCB0aGlzIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gb2NjdXIgcmVnaW9uLiByZXR1cm4gdGhlCi0JCS8vIGxhc3QgcmVnaW9uCi0JCXJldHVybiBpdGVyLnByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKGdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSB7Ci0JCQkJQ01Ob2RlIG5vZGUgPSAoQ01Ob2RlKSBnZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKG5vZGUuZ2V0VHlwZSgpLmVxdWFscyhQQ0RBVEEpKSB7Ci0JCQkJCXJldHVybiBNSVhFRDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBDSElMRFJFTjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0Q2hpbGROb2RlKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBub2RlVGV4dCwgaW50IHBvc2l0aW9uKSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQotCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQlTdHJpbmcgbmV3VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChwb3NpdGlvbiA8IGNoaWxkcmVuLmxlbmd0aCkgewotCQkJRFRETm9kZSByZWZlcmVuY2UgPSAoRFRETm9kZSkgY2hpbGRyZW5bcG9zaXRpb25dOwotCQkJc3RhcnRPZmZzZXQgPSByZWZlcmVuY2UuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCW5ld1RleHQgPSBub2RlVGV4dCArICIgIiArIFN0cmluZy52YWx1ZU9mKGdldENvbm5lY3RvcigpKSArICIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSBpZiAocG9zaXRpb24gPT0gY2hpbGRyZW4ubGVuZ3RoKSB7Ci0JCQkvLyBhZGQgdG8gZW5kCi0JCQlEVEROb2RlIHJlZmVyZW5jZSA9IChEVEROb2RlKSBjaGlsZHJlbltwb3NpdGlvbiAtIDFdOwotCQkJc3RhcnRPZmZzZXQgPSByZWZlcmVuY2UuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQluZXdUZXh0ID0gIiAiICsgU3RyaW5nLnZhbHVlT2YoZ2V0Q29ubmVjdG9yKCkpICsgIiAiICsgbm9kZVRleHQ7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIDAsIG5ld1RleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydENoaWxkTm9kZShTdHJpbmcgbm9kZVRleHQsIGludCBwb3NpdGlvbikgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0lOU0VSVF9FTEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlpbnNlcnRDaGlsZE5vZGUodGhpcywgbm9kZVRleHQsIHBvc2l0aW9uKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydEludG9Nb2RlbChPYmplY3QgcmVxdWVzdG9yLCBDTU5vZGUgcmVmZXJlbmNlLCBDTU5vZGUgbm9kZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCVN0cmluZyBub2RlVGV4dCA9IG5vZGUuZ2V0Tm9kZVRleHQoKTsKLQkJTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuTGlzdCgpOwotCi0JCWludCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2YocmVmZXJlbmNlKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkvLyBubyByZWZlcmVuY2Ugbm9kZSwgYWRkIGl0IHRvIHRoZSBlbmQ/PwotCQkJaW5kZXggPSBjaGlsZHJlbi5zaXplKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBnb3QgYW4gaW5kZXguIGlmIHdlIHdhbnQgdG8gYWRkIGFmdGVyLCBpbmNyZWFzZSBieSAxCi0JCQlpbmRleCA9IGlzQWZ0ZXIgPyBpbmRleCArIDEgOiBpbmRleDsKLQkJfQotCQlpbnNlcnRDaGlsZE5vZGUocmVxdWVzdG9yLCBub2RlVGV4dCwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVSZWdpb25zKCkgewotCQlpbnQgbmVzdGluZyA9IDA7Ci0JCS8vIGNoaWxkcmVuLmNsZWFyKCk7Ci0JCXJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJRFRETm9kZSBjdXJyZW50R3JvdXBOb2RlID0gbnVsbDsKLQkJQ01CYXNpY05vZGUgY3VycmVudFJlZmVyZW5jZU5vZGUgPSBudWxsOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJLy8gd2UgYXNzdW1lIHRoZSBmaXJzdCByZWdpb24gaXMgdGhlICcoJwotCQlpdGVyLm5leHQoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmIG5lc3RpbmcgPj0gMCkgewotCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG5lc3RpbmcgPT0gMCkgewotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpKSB7Ci0JCQkJCWN1cnJlbnRHcm91cE5vZGUgPSBjdXJyZW50UmVmZXJlbmNlTm9kZSA9IG51bGw7Ci0JCQkJCURURE5vZGUgcGNEYXRhID0gbmV3IENNQmFzaWNOb2RlKGdldERUREZpbGUoKSwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpOwotCQkJCQlwY0RhdGEuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCQlhcHBlbmRDaGlsZChwY0RhdGEpOwotCQkJCQkvLyBjaGlsZHJlbi5hZGQocGNEYXRhKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk5BTUUpKSB7Ci0JCQkJCS8vIHdlIGhhdmUgaGl0IGEgbmV3IHJlZmVyZW5jZSBub2RlLiBNYWtlIHN1cmUgd2UgcmVzZXQKLQkJCQkJLy8gdGhlIGdyb3Vwbm9kZSB2YXIgc28gaXQgZG9lc24ndCBjb2xsZWN0IG1vcmUgcmVnaW9ucwotCQkJCQljdXJyZW50R3JvdXBOb2RlID0gbnVsbDsKLQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUgPSBuZXcgQ01CYXNpY05vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJCWN1cnJlbnRSZWZlcmVuY2VOb2RlLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQkJYXBwZW5kQ2hpbGQoY3VycmVudFJlZmVyZW5jZU5vZGUpOwotCQkJCQkvLyBjaGlsZHJlbi5hZGQoY3VycmVudFJlZmVyZW5jZU5vZGUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkpIHsKLQkJCQkJLy8gd2UgY291bGQgcG90ZW50aWFsbHkgZmxhZyBhbiBlcnJvciBoZXJlIGlmIHdlIGhpdCBhbgotCQkJCQkvLyBvY2N1cnJlbmNlIHR5cGUgYW5kIGN1cnJlbnRSZWZOb2RlIGFuZCBjdXJyZW50R3JvdXBOb2RlCi0JCQkJCS8vIGFyZSBudWxsCi0JCQkJCWlmIChjdXJyZW50UmVmZXJlbmNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBjdXJyZW50UmVmZXJlbmNlTm9kZS5zZXRPY2N1cnJlbmNlKGN1cnJlbnRSZWdpb24uZ2V0VGV4dCgpLnRvQ2hhckFycmF5KClbMF0pOwotCQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT05ORUNUT1IpKSB7Ci0JCQkJCS8vIG5vdGUgdGhhdCBpZiBjb25uZWN0b3IgaXMgYWxyZWFkeSBzZXQgYW5kIGl0IGlzCi0JCQkJCS8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IGNvbm5lY3RvciByZWdpb24sIHRoZW4gd2UKLQkJCQkJLy8gaGF2ZSBhbiBlcnJvciEKLQkJCQkJLy8gc2V0Q29ubmVjdG9yKGN1cnJlbnRSZWdpb24uZ2V0VGV4dCgpLnRvQ2hhckFycmF5KClbMF0pOwotCQkJCX0KLQkJCQllbHNlIGlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTikpIHsKLQkJCQkJaWYgKGN1cnJlbnRHcm91cE5vZGUgPT0gbnVsbCkgewotCQkJCQkJLy8gd2UgaGF2ZSBoaXQgYSBuZXcgZ3JvdXAuIE1ha2Ugc3VyZSB3ZSByZXNldCB0aGUKLQkJCQkJCS8vIHJlZmVyZW5jZW5vZGUgdmFyIHNvIGl0IGRvZXNuJ3QgY29sbGVjdCBhbnkgbW9yZQotCQkJCQkJLy8gcmVnaW9ucwotCQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUgPSBudWxsOwotCQkJCQkJY3VycmVudEdyb3VwTm9kZSA9IG5ldyBDTUdyb3VwTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQkJCWFwcGVuZENoaWxkKGN1cnJlbnRHcm91cE5vZGUpOwotCQkJCQkJLy8gY2hpbGRyZW4uYWRkKGN1cnJlbnRHcm91cE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pKSB7Ci0JCQkJbmVzdGluZysrOwotCQkJfQotCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTikpIHsKLQkJCQluZXN0aW5nLS07Ci0JCQkJaWYgKG5lc3RpbmcgPT0gMCAmJiBjdXJyZW50R3JvdXBOb2RlICE9IG51bGwpIHsKLQkJCQkJY3VycmVudEdyb3VwTm9kZS5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQkJCS8vIHBlZWsgYXQgbmV4dCByZWdpb24gdG8gc2VlIGlmIGl0IGlzIGFuIG9jY3VyIHJlZ2lvbi4gaWYKLQkJCQkJLy8gc28sIGFkZCBpdCB0byB0aGUgZ3JvdXBub2RlCi0JCQkJCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJSVRleHRSZWdpb24gbmV4dFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKG5leHRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSkgewotCQkJCQkJCWN1cnJlbnRHcm91cE5vZGUuYWRkUmVnaW9uKG5leHRSZWdpb24pOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gT3RoZXJ3aXNlLCBwdXNoIGl0IGJhY2sgYXMgdGhlIG5leHQgaXRlbSB0byBiZQotCQkJCQkJCS8vIHJldHJpZXZlZCBieSBhIGZ1dHVyZSBuZXh0KCkgY2FsbAotCQkJCQkJCWl0ZXIucHJldmlvdXMoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50R3JvdXBOb2RlID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY3VycmVudEdyb3VwTm9kZSAhPSBudWxsKSB7Ci0JCQkJY3VycmVudEdyb3VwTm9kZS5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmVzdGluZyA8IDApIHsKLQkJCS8vIFRoaXMgbWVhbnMgd2UgaGF2ZSBwYXNzZWQgb3ZlciB0aGUgcmlnaHQgcGFyZW4gdGhhdCBtYXJrcyB0aGUKLQkJCS8vIGVuZCBvZiBvdXIgZ3JvdXBpbmcuCi0JCQkvLyBMb29rIGZvciBhbiBvY2N1cnJlbmNlIHJlZ2lvbgotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkpIHsKLQkJCQkJLy8gc2V0T2NjdXJyZW5jZShjdXJyZW50UmVnaW9uLmdldFRleHQoKS50b0NoYXJBcnJheSgpWzBdKTsKLQkJCQl9Ci0JCQl9IC8vIGVuZCBvZiB3aGlsZSAoKQotCQl9Ci0KLQkJLy8gZm9yIChvcmcudzNjLmRvbS5Ob2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZAotCQkvLyA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0JCS8vIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjaGlsZCBmb3VuZCA9ICIgKyBjaGlsZCk7Ci0JCS8vIH0KLQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2hpbGRyZW4gbGVnbnRoID0gIiArIGNoaWxkcmVuLmxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJRFRETm9kZSBjdXJyZW50Tm9kZSA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCWN1cnJlbnROb2RlLnJlc29sdmVSZWdpb25zKCk7Ci0JCX0gLy8gZW5kIG9mIHdoaWxlICgpCi0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGNvbm5lY3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGNvbm5lY3Rvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0b3IoY2hhciB2KSB7Ci0JCWlmIChjb25uZWN0b3IgIT0gdikgewotCQkJY29ubmVjdG9yID0gdjsKLQkJCS8vIHdhbGsgdGhyb3VnaCBvdXIga2lkcyBhbmQgc2VlIGlmIHRoZXJlIGlzIGEgY29ubmVjdG9yIGJldHdlZW4KLQkJCS8vIGVhY2ggc2libGluZy4gaWYgbm90LCBjcmVhdGUgb25lIGFuZCBzZXQgdGhlIGNvbm5lY3Rvci4gaWYKLQkJCS8vIHRoZXJlIGlzCi0JCQkvLyB0aGVuIGp1c3QgY2hhbmdlIHRoZSB0ZXh0IG9mIHRoZSBjb25uZWN0b3IKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJCWlmIChjaGlsZHJlbi5sZW5ndGggPD0gMSkgewotCQkJCS8vIHRoZXJlIHdvbid0IGJlIGFueSBjb25uZWN0b3IgZXhpc3RpbmcgYmV0d2VlbiB0aGUgY2hpbGRyZW4KLQkJCQkvLyBqdXN0IG5vdGlmeSBhIGNoYW5nZSBpbiB0aGUgbm9kZSBhbmQgcmV0dXJuOwotCQkJCWdldERUREZpbGUoKS5ub3RpZnlOb2RlQ2hhbmdlZCh0aGlzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0NPTk5FQ1RPUik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQkJRFRETm9kZSBjaGlsZEEgPSAoRFRETm9kZSkgY2hpbGRyZW5baV07Ci0JCQkJRFRETm9kZSBjaGlsZEIgPSAoRFRETm9kZSkgY2hpbGRyZW5baSArIDFdOwotCi0JCQkJLy8gY3JlYXRlIGEgc3RyZWFtIGJldHdlZW4gdGhlIHR3byBzaWJsaW5ncyBhbmQgd2FsayBpdAotCQkJCS8vIG5vdGUgdGhhdCB0aGlzIHN0cmVhbSBpbmNsdWRlcyB0aGUgbGFzdCByZWdpb24gb2YgdGhlIGZpcnN0Ci0JCQkJLy8gc2libGluZyBhbmQgdGhlIGZpcnN0IHJlZ2lvbiBvZiB0aGUgbmV4dCBzaWJsaW5nLgotCQkJCS8vIGJvdGggdGhlc2Ugc2hvdWxkIGJlIGlnbm9yZWQKLQkJCQlSZWdpb25JdGVyYXRvciBpdGVyID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLCBjaGlsZEEuZ2V0RW5kT2Zmc2V0KCksIGNoaWxkQi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkvLyBza2lwIHRoZSBmaXJzdCByZWdpb24gd2hpY2ggaXMgdGhlIGxhc3QgcmVnaW9uIG9mIGNoaWxkQQotCi0JCQkJLy8gZG8gd2Ugc3RpbGwgbmVlZCB0aGlzCi0JCQkJLy8gaXRlci5uZXh0KCk7Ci0JCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IG51bGw7Ci0JCQkJYm9vbGVhbiBmb3VuZENvbm5lY3RvciA9IGZhbHNlOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiBjdXJyZW50UmVnaW9uICE9IGNoaWxkQi5nZXRTdGFydFJlZ2lvbigpKSB7Ci0JCQkJCWN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUikgewotCQkJCQkJZm91bmRDb25uZWN0b3IgPSB0cnVlOwotCQkJCQkJLy8gUmVnaW9uIG9sZFJlZ2lvbiA9IGN1cnJlbnRSZWdpb24uY3JlYXRlQ29weSgpOwotCQkJCQkJLy8gZm91bmQgYSBjb25uZWN0b3IhIG9uIHRvIHRoZSBuZXh0IHNpYmxpbmcgcGFpcgotCQkJCQkJLy8gY3VycmVudFJlZ2lvbi51cGRhdGVUZXh0KFN0cmluZy52YWx1ZU9mKHYpKTsKLQkJCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGN1cnJlbnRSZWdpb24pLCAxLCBTdHJpbmcudmFsdWVPZihjb25uZWN0b3IpKTsKLQkJCQkJCS8vIGNoYW5nZVN0cnVjdHVyZWREb2N1bWVudChvbGRSZWdpb24sIGN1cnJlbnRSZWdpb24pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoIWZvdW5kQ29ubmVjdG9yKSB7Ci0JCQkJCS8vIGlmIHdlJ3JlIGhlcmUsIHRoYXQgbWVhbnMgd2UgbmVlZCB0byBpbnNlcnQgYSBuZXcKLQkJCQkJLy8gY29ubmVjdG9yIHJlZ2lvbiBhZnRlciBjaGlsZEEKLQkJCQkJcmVwbGFjZVRleHQodGhpcywgY2hpbGRBLmdldEVuZE9mZnNldCgpLCAwLCBTdHJpbmcudmFsdWVPZihjb25uZWN0b3IpKTsKLQkJCQkJLy8gRFREUmVnaW9uIGNvbm5lY3RvclJlZ2lvbiA9IG5ldwotCQkJCQkvLyBEVERSZWdpb24oRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SLAotCQkJCQkvLyBjaGlsZEEuZ2V0RW5kT2Zmc2V0KCksIDEpOwotCQkJCQkvLyBpbnNlcnRJbnRvU3RydWN0dXJlZERvY3VtZW50KGNvbm5lY3RvclJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JLy8gcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKCkKLQkvLyB7Ci0JLy8gcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQkvLyB9Ci19Ly8gQ01Hcm91cE5vZGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzYzNzQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLS8vIGJhc2UgY2xhc3MgZm9yIGFuIEVsZW1lbnQncyBjb250ZW50bW9kZWwKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTU5vZGUgZXh0ZW5kcyBEVEROb2RlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfQU5ZOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hJTERSRU4gPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfQ0hJTERfQ09OVEVOVDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfRU1QVFk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVhFRCA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9NSVhfQ09OVEVOVDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBDREFUQSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9QQ0RBVEE7IC8vJE5PTi1OTFMtMSQKLQotCi0JYm9vbGVhbiByb290RWxlbWVudENvbnRlbnQ7Ci0KLQlwdWJsaWMgQ01Ob2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JLy8gdGhpcyBpcyBvbmx5IHZhbGlkIHRvIGFzayBpZiB0aGUgY29udGVudCBpcyBhIHJvb3QgZWxlbWVudCBjb250ZW50Ci0JYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4gVGhpcyB0ZWxscyB1cyB3aGV0aGVyIHRoaXMgZWxlbWVudAotCSAqIGNvbnRlbnQncyBwYXJlbnQgaXMgYSBkaXJlY3QgZGVjZW5kZW50IG9mIHRoZSBjb250YWluaW5nIGVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jvb3RFbGVtZW50Q29udGVudCgpIHsKLQkJcmV0dXJuIHJvb3RFbGVtZW50Q29udGVudDsKLQl9Ci0KLQkvLyBpZiB0aGlzIGlzIGEgcm9vdCBlbGVtZW50LCBjaGFuZ2UgdGhlIGNvbnRlbnQgdG8gY2hpbGRyZW4KLQkvLyBpZSAuIChjaGlsZDEpCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW5Db250ZW50KFN0cmluZyBuZXdDaGlsZCkgewotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKCFuZXdDaGlsZC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfU0VUX0NISUxEX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0Tm9kZUxlbmd0aCgpLCAiKCIgKyBuZXdDaGlsZCArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmICghZ2V0VHlwZSgpLmVxdWFscyhDSElMRFJFTikpIHsKLQkJCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfU0VUX0NISUxEX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHRoaXMgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksICIobmV3Q2hpbGQpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5vdyBtdXN0IGNvbnZlcnQgZnJvbSBtaXhlZCBjb250ZW50IHRvIHRoaXMgb25lLiBtdXN0Ci0JCQkJCS8vIHByZXNlcnZlIHRoZSByZW1haW5pbmcgY2hpbGRyZW4KLQkJCQkJQ01Hcm91cE5vZGUgZ3JvdXAgPSAoQ01Hcm91cE5vZGUpIHRoaXM7Ci0JCQkJCUNNTm9kZSBmaXJzdENoaWxkID0gKENNTm9kZSkgZ3JvdXAuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQlpZiAoZmlyc3RDaGlsZC5nZXRUeXBlKCkuZXF1YWxzKFBDREFUQSkpIHsKLQkJCQkJCWdyb3VwLmRlbGV0ZShmaXJzdENoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9TRVQgKyAiICIgKyBjb250ZW50ICsgIiAiICsgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9OT0RFX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksIGNvbnRlbnQpOwotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JLy8gaWYgdGhpcyBpcyBhIHJvb3QgZWxlbWVudCwgY2hhbmdlIHRoZSBjb250ZW50IHRvIG1peGVkCi0JLy8gaWUgLiAoI1BDREFUQSwgY2hpbGQxKQotCXB1YmxpYyB2b2lkIHNldE1peGVkQ29udGVudCgpIHsKLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWlmICghZ2V0VHlwZSgpLmVxdWFscyhNSVhFRCkpIHsKLQkJCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfU0VUX01JWF9DT05URU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh0aGlzIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0Tm9kZUxlbmd0aCgpLCAiKCNQQ0RBVEEgfCBuZXdDaGlsZCkqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5vdyBtdXN0IGNvbnZlcnQgZnJvbSBjaGlsZHJlbiBjb250ZW50IHRvIHRoaXMgb25lLgotCQkJCQkvLyBtdXN0Ci0JCQkJCS8vIHByZXNlcnZlIHRoZSBjaGlsZHJlbgotCQkJCQlDTUdyb3VwTm9kZSBncm91cCA9IChDTUdyb3VwTm9kZSkgdGhpczsKLQkJCQkJZ3JvdXAuc2V0Q29ubmVjdG9yKENNR3JvdXBOb2RlLkNIT0lDRSk7Ci0JCQkJCWdyb3VwLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5aRVJPX09SX01PUkUpOwotCQkJCQlDTU5vZGUgZmlyc3RDaGlsZCA9IChDTU5vZGUpIGdyb3VwLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJaWYgKCFmaXJzdENoaWxkLmdldFR5cGUoKS5lcXVhbHMoUENEQVRBKSkgewotCQkJCQkJZ3JvdXAuaW5zZXJ0Q2hpbGROb2RlKCIjUENEQVRBIiwgMCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb290RWxlbWVudENvbnRlbnQoYm9vbGVhbiB2KSB7Ci0JCXRoaXMucm9vdEVsZW1lbnRDb250ZW50ID0gdjsKLQl9Ci0KLQkvLyBwdWJsaWMgdm9pZCBkZWxldGUoKQotCS8vIHsKLQkvLyBpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkKLQkvLyB7Ci0JLy8gLy8gdGhlbiB0aGUgc3VwZXJjbGFzc2VzIGRlbGV0ZSB3aWxsIGJlIGZpbmUKLQkvLyBzdXBlci5kZWxldGUoKTsKLQkvLyByZXR1cm47Ci0JLy8gfQotCi0JLy8gQ01Hcm91cE5vZGUgcGFyZW50ID0gKENNR3JvdXBOb2RlKSBnZXRQYXJlbnROb2RlKCk7Ci0JLy8gcGFyZW50LnJlbW92ZUNoaWxkTm9kZSh0aGlzKTsKLQkvLyB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTVJlcGVhdGFibGVOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNUmVwZWF0YWJsZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhOGJmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNUmVwZWF0YWJsZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTVJlcGVhdGFibGVOb2RlIGV4dGVuZHMgQ01Ob2RlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPTkNFID0gJzEnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPTkVfT1JfTU9SRSA9ICcrJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT1BUSU9OQUwgPSAnPyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFpFUk9fT1JfTU9SRSA9ICcqJzsKLQotCi0JcHVibGljIENNUmVwZWF0YWJsZU5vZGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCURURENvcmVQbHVnaW4gcmVzb3VyY2VQbHVnaW4gPSBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5FTEVNRU5UUkVGSUNPTik7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0T2NjdXJyZW5jZSgpIHsKLQkJSVRleHRSZWdpb24gb2NjdXJSZWdpb24gPSBnZXRPY2N1cnJlbmNlUmVnaW9uKCk7Ci0JCWlmIChvY2N1clJlZ2lvbiAhPSBudWxsICYmIG9jY3VyUmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSB7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChvY2N1clJlZ2lvbikuY2hhckF0KDApOwotCQl9Ci0JCXJldHVybiBDTVJlcGVhdGFibGVOb2RlLk9OQ0U7Ci0JfQotCi0JLy8gcmV0dXJucyB0aGUgb2NjdXJyZW5jZXJlZ2lvbiwgb3IgdGhlIGxhc3QgcmVnaW9uIHdoZXJlIHRoZSBvY2N1cnJlbmNlCi0JLy8gcmVnaW9uIHNob3VsZCBhcHBlYXIgYWZ0ZXIKLQlhYnN0cmFjdCBwdWJsaWMgSVRleHRSZWdpb24gZ2V0T2NjdXJyZW5jZVJlZ2lvbigpOwotCi0JcHVibGljIHZvaWQgc2V0T2NjdXJyZW5jZShjaGFyIG9jY3VycmVuY2UpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9SRVBfTk9ERV9DSEdfT0NDVVIpOyAvLyROT04tTkxTLTEkCi0JCXNldE9jY3VycmVuY2UodGhpcywgb2NjdXJyZW5jZSk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPY2N1cnJlbmNlKE9iamVjdCByZXF1ZXN0b3IsIGNoYXIgb2NjdXJyZW5jZSkgewotCQlpZiAoZ2V0T2NjdXJyZW5jZSgpICE9IG9jY3VycmVuY2UpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldE9jY3VycmVuY2VSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSkgewotCQkJCQlpZiAob2NjdXJyZW5jZSA9PSBDTVJlcGVhdGFibGVOb2RlLk9OQ0UpIHsKLQkJCQkJCS8vIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBvY2N1ciByZWdpb24gZnJvbSB0aGUgZmxhdAotCQkJCQkJLy8gbW9kZWw7Ci0JCQkJCQlnZXREVERGaWxlKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pLCAxLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIFJlZ2lvbiBvbGRPY2N1ciA9IHJlZ2lvbi5jcmVhdGVDb3B5KCk7Ci0JCQkJCQlnZXREVERGaWxlKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pLCAxLCBTdHJpbmcudmFsdWVPZihvY2N1cnJlbmNlKSk7Ci0JCQkJCQkvLyBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnQob2xkT2NjdXIsIHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAob2NjdXJyZW5jZSAhPSBDTVJlcGVhdGFibGVOb2RlLk9OQ0UpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldFN0cmluZygpKTsKLQkJCQkJLy8gd2UgbmVlZCB0byBjcmVhdGUgYW4gb2NjdXJyZW5jZVJlZ2lvbgotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pLCAwLCBTdHJpbmcudmFsdWVPZihvY2N1cnJlbmNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19Ly8gQ01SZXBlYXRhYmxlTm9kZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Db21tZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NvbW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlODI1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NvbW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tZW50IGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCi0JcHVibGljIGNsYXNzIFN0YXJ0RW5kUGFpciB7Ci0JCXB1YmxpYyBpbnQgc3RhcnRPZmZzZXQsIGVuZE9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgQ29tbWVudChEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUsIERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5DT01NRU5USUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgdGV4dCA9IGdldFRleHQoKTsKLQkJaWYgKHRleHQubGVuZ3RoKCkgPD0gMzApIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIDI5KSArICIuLi4iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KFN0YXJ0RW5kUGFpciBwYWlyKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBjb21tZW50U3RhcnRUYWcgPSBnZXRTdGFydFRhZyhpdGVyKTsKLQkJSVRleHRSZWdpb24gZW5kQ29tbWVudFRhZyA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOwotCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoY29tbWVudFN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCXBhaXIuc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoY29tbWVudFN0YXJ0VGFnKTsKLQkJfQotCQlpZiAoZW5kQ29tbWVudFRhZyAhPSBudWxsKSB7Ci0JCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGVuZENvbW1lbnRUYWcpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKTsKLQkJaW50IGZsYXROb2RlU3RhcnQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpOwotCQlTdGFydEVuZFBhaXIgcGFpciA9IG5ldyBTdGFydEVuZFBhaXIoKTsKLQkJZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KHBhaXIpOwotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcocGFpci5zdGFydE9mZnNldCAtIGZsYXROb2RlU3RhcnQsIHBhaXIuZW5kT2Zmc2V0IC0gZmxhdE5vZGVTdGFydCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NPTU1FTlRfQ0hHKTsgLy8kTk9OLU5MUy0xJAotCQlTdGFydEVuZFBhaXIgcGFpciA9IG5ldyBTdGFydEVuZFBhaXIoKTsKLQkJZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KHBhaXIpOwotCQlyZXBsYWNlVGV4dCh0aGlzLCBwYWlyLnN0YXJ0T2Zmc2V0LCBwYWlyLmVuZE9mZnNldCAtIHBhaXIuc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxMmY4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgRFREIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05PTkVfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0hBUkFDVEVSX0RBVEFfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSURFTlRJRklFUl9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JRF9SRUZFUkVOQ0VfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSURfUkVGRVJFTkNFU19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FTlRJVFlfTkFNRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FTlRJVFlfTkFNRVNfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTkFNRV9UT0tFTl9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OQU1FX1RPS0VOU19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FTlVNX05BTUVfVE9LRU5TX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VOVU1fTk9UQVRJT05fREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUl9ERUZBVUxUX1ZBTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUl9ERUZBVUxUX0tJTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FUVFJfVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUl9FTlVNX0lURU1TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSX0xJU1RfQUREOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9HUlBfTk9ERV9DT05ORUNUT1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0lOU0VSVF9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfR1JQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfQ0hJTEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfTUlYX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfQ0hJTERfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9TRVRfTUlYX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfU0VUX0NISUxEX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfU0VUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfUENEQVRBOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX0FOWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fUkVQX05PREVfQ0hHX09DQ1VSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT01NRU5UX0NIRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfQUREX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0FERF9DT01NRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfRklMRV9BRERfUEFSTV9FTlRJVFlfUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfRklMRV9BRERfTk9UQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0FERF9BVFRSX0xJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX05PREVfTkFNRV9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9OT0RFX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRUxFTUVOVF9BRERfQVRUUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRUxFTUVOVF9BRERfR1JQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTEVNRU5UX0FERF9DSElMRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1NFVF9QQVJNX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1NFVF9HRU5FUkFMX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1NFVF9FWFRfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlRJVFlfU0VUX0lOVF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9WQUxVRV9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9OREFUQV9DSEFOR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VYVF9OT0RFX1BVQkxJQ19JRF9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VYVF9OT0RFX1NZU1RFTV9JRF9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PREVfTElTVF9FTEVNRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9ERV9MSVNUX0VOVElUSUVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT0RFX0xJU1RfTk9UQVRJT05TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT0RFX0xJU1RfQ09NTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PREVfTElTVF9PVEhFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9ERV9MSVNUX0FUVFJJQlVURVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BBUk1fRU5USVRZX1JFRl9DSEdfRU5USVRZX1JFRjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NPTU1FTlRfQ0hHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9UT1BfTEVWRUxfTk9ERV9ERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0lOQ0xfRklMRV9MT0FEX0ZBSUxVUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX1VOREVDTEFSRURfRUxFTUVOVF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUlBBUlRfVU5ERUNMQVJFRF9FTEVNRU5UXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JQQVJUX0RVUF9JRF9BVFRSSUJVVEVfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JQQVJUX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VYQ19PUEVSQVRJT05fTk9UX1NVUFBPUlRFRDsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEVERDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNTU2MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRFREQ29yZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXByaXZhdGUgc3RhdGljIERURENvcmVQbHVnaW4gaW5zdGFuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldERUREltYWdlKFN0cmluZyBpY29uTmFtZSkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpY29uTmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RFRESW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpY29uTmFtZSkgewotCQlTdHJpbmcgdGhpc0lEID0gZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbih0aGlzSUQsIGljb25OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBEVERDb3JlUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEVERDb3JlUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBEVERDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBpY29uTmFtZSkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBnZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlIGltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCi0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgdGhpc0lEID0gZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCWltYWdlUmVnaXN0cnkucHV0KGljb25OYW1lLCBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKHRoaXNJRCwgaWNvbk5hbWUpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YWMzZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotISBTdHJpbmdzIGZvciBEVERCYXNpY1R5cGVJbXBsIHR5cGUgZGVzY3JpcHRpb25zCi1fVUlfTk9ORV9ERVNDPU5vbmUKLQotISEgTk9URSBUTyBUUkFOU0xBVE9SOiBEbyBub3QgdHJhbnNsYXRlIGZvbGxvd2luZyB0ZXh0IGluIHBhcmVudGhlc2VzIG9uIGZvbGxvd2luZyAxMCBsaW5lcyBpLmUuKENEQVRBKQotX1VJX0NIQVJBQ1RFUl9EQVRBX0RFU0M9Q2hhcmFjdGVyIERhdGEgKENEQVRBKQotX1VJX0lERU5USUZJRVJfREVTQz1JZGVudGlmaWVyIChJRCkKLV9VSV9JRF9SRUZFUkVOQ0VfREVTQz1JRCBSZWZlcmVuY2UgKElEUkVGKQotX1VJX0lEX1JFRkVSRU5DRVNfREVTQz1JRCBSZWZlcmVuY2VzIChJRFJFRlMpCi1fVUlfRU5USVRZX05BTUVfREVTQz1FbnRpdHkgTmFtZSAoRU5USVRZKQotX1VJX0VOVElUWV9OQU1FU19ERVNDPUVudGl0eSBOYW1lcyAoRU5USVRJRVMpCi1fVUlfTkFNRV9UT0tFTl9ERVNDPU5hbWUgVG9rZW4gKE5NVE9LRU4pCi1fVUlfTkFNRV9UT0tFTlNfREVTQz1OYW1lIFRva2VucyAoTk1UT0tFTlMpCi1fVUlfRU5VTV9OQU1FX1RPS0VOU19ERVNDPUVudW1lcmF0ZWQgTmFtZSBUb2tlbnMKLV9VSV9FTlVNX05PVEFUSU9OX0RFU0M9RW51bWVyYXRlZCBOT1RBVElPTgotCi0hIFN0cmluZ3MgZnJvbSBzZWQvbW9kZWwKLQotISBBdHRyaWJ1dGUuamF2YQotX1VJX0xBQkVMX0FUVFJfREVGQVVMVF9WQUw9QXR0cmlidXRlIERlZmF1bHQgQ2hhbmdlIFZhbHVlCi1fVUlfTEFCRUxfQVRUUl9ERUZBVUxUX0tJTkQ9Q2hhbmdlIEF0dHJpYnV0ZSBEZWZhdWx0IFZhbHVlCi1fVUlfTEFCRUxfQVRUUl9UWVBFPUNoYW5nZSBBdHRyaWJ1dGUgVHlwZQotCi0hIEF0dHJpYnV0ZUVudW1MaXN0Ci1fVUlfTEFCRUxfQVRUUl9FTlVNX0lURU1TPUNoYW5nZSBBdHRyaWJ1dGUgRW51bWVyYXRpb24gVmFsdWUKLQotISBBdHRyaWJ1dGVMaXN0Ci1fVUlfTEFCRUxfQVRUUl9MSVNUX0FERD1BZGQgQXR0cmlidXRlCi0KLSEgQ01Hcm91cE5vZGUKLV9VSV9MQUJFTF9DTV9HUlBfTk9ERV9DT05ORUNUT1I9Q2hhbmdlIENvbm5lY3RvcgotX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0lOU0VSVF9FTEVNRU5UPUluc2VydCBFbGVtZW50Ci1fVUlfTEFCRUxfQ01fR1JQX05PREVfQUREX0dSUD1BZGQgR3JvdXAKLV9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfQ0hJTEQ9QWRkIENoaWxkIEVsZW1lbnQKLQotISBDTU5vZGUKLV9VSV9MQUJFTF9DTV9OT0RFX01JWF9DT05URU5UPU1peGVkIENvbnRlbnQKLV9VSV9MQUJFTF9DTV9OT0RFX0NISUxEX0NPTlRFTlQ9Q2hpbGRyZW4gQ29udGVudAotX1VJX0xBQkVMX0NNX05PREVfU0VUX01JWF9DT05URU5UPVNldCBNaXhlZCBDb250ZW50Ci1fVUlfTEFCRUxfQ01fTk9ERV9TRVRfQ0hJTERfQ09OVEVOVD1TZXQgQ2hpbGRyZW4gQ29udGVudAotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1IgLSBVU0FHRTogIlNldCA8dmFyaWFibGUgY29udGVudD4gQ29udGVudCIKLV9VSV9MQUJFTF9DTV9OT0RFX1NFVD1TZXQKLV9VSV9MQUJFTF9DTV9OT0RFX0NPTlRFTlQ9Q29udGVudAotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1IgLSBETyBOT1QgVFJBTlNMQVRFIEZPTExPV0lORyAzIExJTkVTCi1fVUlfTEFCRUxfQ01fTk9ERV9QQ0RBVEE9KCNQQ0RBVEEpCi1fVUlfTEFCRUxfQ01fTk9ERV9BTlk9QU5ZCi1fVUlfTEFCRUxfQ01fTk9ERV9FTVBUWT1FTVBUWQotCi0hIENNUmVwZWF0YWJsZU5vZGUKLV9VSV9MQUJFTF9DTV9SRVBfTk9ERV9DSEdfT0NDVVI9Q2hhbmdlIE9jY3VycmVuY2UKLQotISBDb21tZW50Ci1fVUlfTEFCRUxfQ09NTUVOVF9DSEc9Q29tbWVudCBDaGFuZ2UKLQotISBEVERGaWxlCi1fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0VMRU1FTlQ9QWRkIEVsZW1lbnQKLV9VSV9MQUJFTF9EVERfRklMRV9BRERfRU5USVRZPUFkZCBFbnRpdHkKLV9VSV9MQUJFTF9EVERfRklMRV9BRERfQ09NTUVOVD1BZGQgQ29tbWVudAotX1VJX0xBQkVMX0RURF9GSUxFX0FERF9QQVJNX0VOVElUWV9SRUY9QWRkIFBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlCi1fVUlfTEFCRUxfRFREX0ZJTEVfQUREX05PVEFUSU9OPUFkZCBOb3RhdGlvbgotX1VJX0xBQkVMX0RURF9GSUxFX0FERF9BVFRSX0xJU1Q9QWRkIEF0dHJpYnV0ZSBMaXN0Ci1fVUlfTEFCRUxfRFREX0ZJTEVfREVMRVRFPURlbGV0ZQotCi0hIERURE5vZGUKLV9VSV9MQUJFTF9EVERfTk9ERV9OQU1FX0NIRz1OYW1lIENoYW5nZQotX1VJX0xBQkVMX0RURF9OT0RFX0RFTEVURT1EZWxldGUKLQotISBFbGVtZW50Ci1fVUlfTEFCRUxfRUxFTUVOVF9BRERfQVRUUj1BZGQgQXR0cmlidXRlCi1fVUlfTEFCRUxfRUxFTUVOVF9BRERfR1JQPUFkZCBHcm91cAotX1VJX0xBQkVMX0VMRU1FTlRfQUREX0NISUxEPUFkZCBDaGlsZCBFbGVtZW50Ci0KLSEgRW50aXR5Ci1fVUlfTEFCRUxfRU5USVRZX1NFVF9QQVJNX0VOVElUWT1TZXQgUGFyYW1ldGVyIEVudGl0eQotX1VJX0xBQkVMX0VOVElUWV9TRVRfR0VORVJBTF9FTlRJVFk9U2V0IEdlbmVyYWwgRW50aXR5Ci1fVUlfTEFCRUxfRU5USVRZX1NFVF9FWFRfRU5USVRZPVNldCBFeHRlcm5hbCBFbnRpdHkKLV9VSV9MQUJFTF9FTlRJVFlfU0VUX0lOVF9FTlRJVFk9U2V0IEludGVybmFsIEVudGl0eQotX1VJX0xBQkVMX0VOVElUWV9WQUxVRV9DSEc9RW50aXR5IFZhbHVlIENoYW5nZQotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1IgLSBVU0FHRTogIk5EQVRBIENoYW5nZSIKLV9VSV9MQUJFTF9FTlRJVFlfTkRBVEFfQ0hBTkdFPUNoYW5nZQotCi0hIEV4dGVybmFsTm9kZQotX1VJX0xBQkVMX0VYVF9OT0RFX1BVQkxJQ19JRF9DSEc9UHVibGljIElEIENoYW5nZQotX1VJX0xBQkVMX0VYVF9OT0RFX1NZU1RFTV9JRF9DSEc9U3lzdGVtIElEIENoYW5nZQotCi0hIE5vZGVMaXN0Ci1fVUlfTEFCRUxfTk9ERV9MSVNUX0VMRU1FTlRTPUVsZW1lbnRzCi1fVUlfTEFCRUxfTk9ERV9MSVNUX0VOVElUSUVTPUVudGl0aWVzCi1fVUlfTEFCRUxfTk9ERV9MSVNUX05PVEFUSU9OUz1Ob3RhdGlvbnMKLV9VSV9MQUJFTF9OT0RFX0xJU1RfQ09NTUVOVFM9Q29tbWVudHMKLV9VSV9MQUJFTF9OT0RFX0xJU1RfT1RIRVI9T3RoZXIKLV9VSV9MQUJFTF9OT0RFX0xJU1RfQVRUUklCVVRFUz1BdHRyaWJ1dGVzCi0KLSEgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlCi1fVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NIR19FTlRJVFlfUkVGPUNoYW5nZSBFbnRpdHkgUmVmZXJlbmNlCi1fVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NPTU1FTlRfQ0hHPUNvbW1lbnQgQ2hhbmdlCi0KLSEgVG9wTGV2ZWxOb2RlCi1fVUlfTEFCRUxfVE9QX0xFVkVMX05PREVfREVMRVRFPURlbGV0ZQotCi1fRVJST1JfSU5DTF9GSUxFX0xPQURfRkFJTFVSRSAgICAgICA9IEZhaWxlZCB0byBsb2FkIGluY2x1ZGVkIGZpbGUKLQotISB1c2FnZTogX0VSUk9SX1VOREVDTEFSRURfRUxFTUVOVF8xICArIDxlbGVtZW50TmFtZT4gKyBfUEFSVEVSUk9SX1VOREVDTEFSRURfRUxFTUVOVF8yCi1fRVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzEgICAgICAgICA9IFJlZmVyZW5jZSB0byB1bmRlY2xhcmVkIGVsZW1lbnQgJwotX1VJX0VSUk9SUEFSVF9VTkRFQ0xBUkVEX0VMRU1FTlRfMiAgPScgaW4gY29udGVudCBtb2RlbC4KLQotISB1c2FnZTogX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMSAgKyA8YXR0cmlidXRlTmFtZT4gKyBfUEFSVEVSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMgotX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMSAgICAgICAgID0gRHVwbGljYXRlIElEIGF0dHJpYnV0ZSAnCi1fVUlfRVJST1JQQVJUX0RVUF9JRF9BVFRSSUJVVEVfMiAgPSAnLiBPbmx5IG9uZSBJRCBhdHRyaWJ1dGUgY2FuIGJlIHNwZWNpZmllZCBwZXIgRUxFTUVOVCB0eXBlLgotCi0hIHVzYWdlOl9FUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8xICsgPHR5cGVTdHJpbmc+ICsgX1BBUlRFUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8yICsgPGF0dHJpYnV0ZU5hbWU+Ci1fRVJST1JfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMSAgICAgICAgID0gSW52YWxpZCBkZWZhdWx0Ci1fVUlfRVJST1JQQVJUX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzIgID0gIHZhbHVlIGZvciBhdHRyaWJ1dGUgJwotCi1fRVhDX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEICA9IE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RUREZpbGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFRERmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTVkMWVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFRERmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSGFqaW1lIEthdGF5YW1hICAtIGJ1ZyAyNDUyMTYgLSBjb3JyZWN0aW9uIHRvIGdldCB0aGUgYmVzdCBub2RlIHdoZW4gdGhlIGVuZGluZwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHN0YXJ0aW5nIG9mZnNldHMgYXJlIGVxdWFsLCBhbmQgdGhleSBib3RoCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluIHRoZSBvZmZzZXQgcmFuZ2UuCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuSURUREZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuTm9kZXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRUREV4dGVybmFsUmVmZXJlbmNlUmVtb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVERNb2RlbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotcHVibGljIGNsYXNzIERUREZpbGUgaW1wbGVtZW50cyBJbmRleGVkUmVnaW9uIHsKLQlwcml2YXRlIE5vZGVMaXN0IGF0dGxpc3RMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKTsKLQlwcml2YXRlIE5vZGVMaXN0IGNvbW1lbnRMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpOwotCi0JYm9vbGVhbiBjcmVhdGluZ05ld01vZGVsID0gZmFsc2U7Ci0JcHJpdmF0ZSBEVERNb2RlbEltcGwgZkRURE1vZGVsOwotCi0JcHJpdmF0ZSBOb2RlTGlzdCBlbGVtZW50TGlzdCA9IG5ldyBOb2RlTGlzdCh0aGlzLCBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyk7Ci0JcHJpdmF0ZSBOb2RlTGlzdCBlbnRpdHlMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOwotCi0JcHJpdmF0ZSBMaXN0IGZvbGRlckxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzTW92aW5nTm9kZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBMaXN0IG1vZGVsTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBMaXN0IG5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTm9kZUxpc3Qgbm90YXRpb25MaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRyk7Ci0JcHJpdmF0ZSBOb2RlTGlzdCB1bnJlY29nbml6ZWRMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7Ci0KLQlwdWJsaWMgRFRERmlsZShEVERNb2RlbEltcGwgZHRkTW9kZWwpIHsKLQkJdGhpcy5mRFRETW9kZWwgPSBkdGRNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREVERGaWxlTGlzdGVuZXIoSURUREZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQltb2RlbExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE5vZGUoRFRETm9kZSBub2RlKSB7Ci0JCWFkZE5vZGUobm9kZUxpc3Quc2l6ZSgpLCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb2RlKGludCBpbmRleCwgRFRETm9kZSBub2RlKSB7Ci0JCW5vZGVMaXN0LmFkZChpbmRleCwgbm9kZSk7Ci0JCS8qCi0JCSAqIGlmIChpbmRleCA8IG5vZGVMaXN0LnNpemUoKSkgeyBpbnNlcnRCZWZvcmUobm9kZSwgKERURE5vZGUpCi0JCSAqIG5vZGVMaXN0LmdldChpbmRleCkpOyB9IGVsc2UgeyBhcHBlbmRDaGlsZChub2RlKTsgfQotCQkgKi8KLQl9Ci0KLQlwdWJsaWMgRFRETm9kZSBidWlsZE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQkvLyBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJRFRETm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKGlzRWxlbWVudChmbGF0Tm9kZSkpIHsKLQkJCS8vIHRoZW4gdGhpcyBpcyBhbiBlbGVtZW50Ci0JCQlub2RlID0gbmV3IEVsZW1lbnQodGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzRW50aXR5KGZsYXROb2RlKSkgewotCQkJbm9kZSA9IG5ldyBFbnRpdHkodGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzTm90YXRpb24oZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IE5vdGF0aW9uKHRoaXMsIGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChpc0F0dHJpYnV0ZUxpc3QoZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IEF0dHJpYnV0ZUxpc3QodGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzQ29tbWVudChmbGF0Tm9kZSkpIHsKLQkJCW5vZGUgPSBuZXcgQ29tbWVudCh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoIWZsYXROb2RlLmdldFRleHQoKS50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlub2RlID0gbmV3IFVucmVjb2duaXplZCh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJaW5zZXJ0Tm9kZShub2RlKTsKLQkJCW5vZGUucmVzb2x2ZVJlZ2lvbnMoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBidWlsZE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGxpc3QpIHsKLQkJTm9kZXNFdmVudCBhZGRlZERURE5vZGVzID0gbmV3IE5vZGVzRXZlbnQoKTsKLQotCQlUb3BMZXZlbE5vZGUgcHJldmlvdXNOb2RlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQlUb3BMZXZlbE5vZGUgbm9kZSA9IChUb3BMZXZlbE5vZGUpIGJ1aWxkTm9kZShmbGF0Tm9kZSk7Ci0JCQkvLyBpZiB3ZSBkb24ndCBjcmVhdGUgYSBub2RlLCB0aGVuIHdlIGFzc3VtZSB0aGF0IHRoZSBmbGF0Ci0JCQkvLyBub2RlIHdhcyB3aGl0ZXNwYWNlLiBUYWNrIGl0IG9uIHRvIGEgcHJldmlvdXMgdG9wbGV2ZWwKLQkJCS8vIG5vZGUKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlwcmV2aW91c05vZGUgPSBub2RlOwotCQkJCWFkZGVkRFRETm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHByZXZpb3VzTm9kZSAhPSBudWxsKSB7Ci0JCQkJCXByZXZpb3VzTm9kZS5hZGRXaGl0ZXNwYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApLy8gJiYKLQkJLy8gY3JlYXRpbmdOZXdNb2RlbCA9PSBmYWxzZSkKLQkJewotCQkJLy8gbm93IHRlbGwgcGVvcGxlIGFib3V0IHRoZSBhZGRpdGlvbnMKLQkJCW5vdGlmeU5vZGVzQWRkZWQoYWRkZWREVEROb2Rlcyk7Ci0JCX0KLQl9Ci0KLQkvLyBJbXBsZW1lbnRzIEluZGV4ZWRSZWdpb24KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB0ZXN0UG9zaXRpb24pIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgPD0gdGVzdFBvc2l0aW9uICYmIHRlc3RQb3NpdGlvbiA8PSBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVBdHRyaWJ1dGVMaXN0KERURE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlnZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0FUVFJfTElTVCk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld1N0cmVhbSA9ICI8IUFUVExJU1QgIiArIG5hbWUgKyAiPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29tbWVudChEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9DT01NRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhLS0gIiArIG5hbWUgKyAiIC0tPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRWxlbWVudChEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhRUxFTUVOVCAiICsgbmFtZSArICIgRU1QVFk+XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW50IG9mZnNldCA9IGdldEluc2VydE9mZnNldChub2RlLCBpc0FmdGVyKTsKLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBuZXdTdHJlYW0pOwotCQlnZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVFbnRpdHkoRFRETm9kZSBub2RlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9EVERfRklMRV9BRERfRU5USVRZKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhRU5USVRZICIgKyBuYW1lICsgIiBcIlwiPlxuIjsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJaW50IG9mZnNldCA9IGdldEluc2VydE9mZnNldChub2RlLCBpc0FmdGVyKTsKLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBuZXdTdHJlYW0pOwotCQlnZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVOb3RhdGlvbihEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9OT1RBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld1N0cmVhbSA9ICI8IU5PVEFUSU9OICIgKyBuYW1lICsgIiBTWVNURU0gXCJcIj5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9QQVJNX0VOVElUWV9SRUYpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuZXdTdHJlYW0gPSBuYW1lICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZU5vZGUoRFRETm9kZSBub2RlKSB7Ci0JCWdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9EVERfRklMRV9ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0JCWRlbGV0ZU5vZGUodGhpcywgbm9kZSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZU5vZGUoT2JqZWN0IHJlcXVlc3RvciwgRFRETm9kZSBub2RlKSB7Ci0JCURURE5vZGUgcGFyZW50ID0gKERURE5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kZWxldGUocmVxdWVzdG9yLCBub2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmICghaXNNb3ZpbmdOb2RlKSB7Ci0JCQkJRFRETW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBuZXcgRFRETW9kZWxVcGRhdGVyKCk7Ci0JCQkJdXBkYXRlci5vYmplY3RBYm91dFRvQmVEZWxldGVkKHJlcXVlc3Rvciwgbm9kZSk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIHsKLQkJCQkJRW50aXR5IHJlZmVyZW5jZWRFbnRpdHkgPSAoKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgbm9kZSkuZ2V0RW50aXR5T2JqZWN0KCk7Ci0JCQkJCWlmIChyZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJCS8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIGFsbCBlbGVtZW50cyBhbmQgcGFybSBlbnRpdGllcwotCQkJCQkJLy8gY29udGFpbmVkIGluIG91ciBjdXJyZW50IG1vZGVsCi0JCQkJCQlEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIgcmVtb3ZlciA9IG5ldyBEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIoKTsKLQkJCQkJCXJlbW92ZXIuZXh0ZXJuYWxSZWZlcmVuY2VBYm91dFRvQ2hhbmdlKHJlcXVlc3RvciwgcmVmZXJlbmNlZEVudGl0eSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQkJCU5vdGF0aW9uIG5vdGF0aW9uID0gKChOb3RhdGlvbikgbm9kZSk7Ci0JCQkJCURURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3ZlciByZW1vdmVyID0gbmV3IERURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3ZlcigpOwotCQkJCQlyZW1vdmVyLm5vdGF0aW9uQWJvdXRUb0JlRGVsZXRlZChyZXF1ZXN0b3IsIG5vdGF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG5vIHBhcmVudD8gdGhlbiBkZWxldGUgdXAgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IG5vZGUKLQkJCS8vIGlmIGl0IGlzIGEgdG9wIGxldmVsIG5vZGUKLQkJCWludCBzdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBlbmRPZmZzZXQgPSBub2RlLmdldFdoaXRlc3BhY2VFbmRPZmZzZXQoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgVG9wTGV2ZWxOb2RlKSB7Ci0JCQkJZW5kT2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIHRydWUpOwotCQkJfQotCQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldENvbW1lbnRzKCkgewotCQlyZXR1cm4gY29tbWVudExpc3Q7Ci0JfQotCi0JcHVibGljIERURE1vZGVsSW1wbCBnZXREVERNb2RlbCgpIHsKLQkJcmV0dXJuIGZEVERNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNBbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gZWxlbWVudExpc3Q7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IHN0YXJ0ID0gZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHN0YXJ0ID49IDApIHsKLQkJCWludCBlbmQgPSBnZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChlbmQgPj0gMCkgewotCQkJCXJlc3VsdCA9IGVuZCAtIHN0YXJ0OwotCQkJCWlmIChyZXN1bHQgPCAtMSkgewotCQkJCQlyZXN1bHQgPSAtMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBlbnRpdHlMaXN0OwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5EVERGSUxFSUNPTik7Ci0JfQotCi0KLQotCXB1YmxpYyBpbnQgZ2V0SW5zZXJ0T2Zmc2V0KERURE5vZGUgbm9kZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAoaXNBZnRlcikgewotCQkJCS8vIHRoZW4gZ2V0IHRoZSBuZXh0IG5vZGUgYW5kIHVzZSBpdCdzIHN0YXJ0IG9mZnNldAotCQkJCWludCBpbmRleCA9IGdldE5vZGVzKCkuaW5kZXhPZihnZXROb2RlKG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpKTsKLQotCQkJCURURE5vZGUgYWZ0ZXJOb2RlID0gbnVsbDsKLQkJCQlpZiAoaW5kZXggKyAxIDwgZ2V0Tm9kZXMoKS5zaXplKCkpIHsKLQkJCQkJYWZ0ZXJOb2RlID0gKERURE5vZGUpIGdldE5vZGVzKCkuZ2V0KGluZGV4ICsgMSk7Ci0JCQkJfQotCQkJCWlmIChhZnRlck5vZGUgIT0gbnVsbCkgewotCQkJCQlvZmZzZXQgPSBhZnRlck5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFkZCB0byBlbmQKLQkJCQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlvZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvZmZzZXQgPSBub2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBhZGQgdG8gZW5kCi0JCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCQlvZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoIHBhdGggPSBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGgoZ2V0RFRETW9kZWwoKS5nZXRJZCgpLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gcGF0aC5sYXN0U2VnbWVudCgpOwotCX0KLQotCXB1YmxpYyBEVEROb2RlIGdldE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgbm9kZUxpc3QuZ2V0KGkpOwotCQkJaWYgKG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkgPT0gZmxhdE5vZGUpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSW5kZXhlZFJlZ2lvbiBnZXROb2RlQXQoaW50IG9mZnNldCkgewotCQlEVEROb2RlIG5vZGUgPSBnZXRUb3BMZXZlbE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXREZWVwZXN0Tm9kZShvZmZzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldE5vZGVBdChpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQkJRFRETm9kZSBub2RlID0gZ2V0VG9wTGV2ZWxOb2RlQXQoc3RhcnRPZmZzZXQpOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXREZWVwZXN0Tm9kZShzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROb2RlTGlzdHMoKSB7Ci0JCWlmIChmb2xkZXJMaXN0ID09IG51bGwpIHsKLQkJCWZvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChub3RhdGlvbkxpc3QpOwotCQkJZm9sZGVyTGlzdC5hZGQoZW50aXR5TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChlbGVtZW50TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChhdHRsaXN0TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChjb21tZW50TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZCh1bnJlY29nbml6ZWRMaXN0KTsKLQkJfQotCQlyZXR1cm4gZm9sZGVyTGlzdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROb2RlcygpIHsKLQkJcmV0dXJuIG5vZGVMaXN0OwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXROb3RhdGlvbnMoKSB7Ci0JCXJldHVybiBub3RhdGlvbkxpc3Q7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRFRETW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JfQotCi0JcHVibGljIERURE5vZGUgZ2V0VG9wTGV2ZWxOb2RlQXQoaW50IG9mZnNldCkgewotCQlEVEROb2RlIGJlc3ROb2RlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIG5vZGVMaXN0LmdldChpKTsKLQkJCWlmIChub2RlLmNvbnRhaW5zKG9mZnNldCkpIHsKLQkJCQlpZihiZXN0Tm9kZSA9PSBudWxsKSB7Ci0JCQkJCWJlc3ROb2RlID0gbm9kZTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZihub2RlLmdldFN0YXJ0T2Zmc2V0KCkgPiBiZXN0Tm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCQliZXN0Tm9kZSA9IG5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJlc3ROb2RlOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRVbnJlY29nbml6ZWQoKSB7Ci0JCXJldHVybiB1bnJlY29nbml6ZWRMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydEludG9Nb2RlbChPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIHJlZmVyZW5jZSwgRFRETm9kZSBub2RlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJU3RyaW5nIG5vZGVUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpIHsKLQkJCW5vZGVUZXh0ID0gKChUb3BMZXZlbE5vZGUpIG5vZGUpLmdldEZ1bGxUZXh0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlVGV4dCA9IG5vZGUuZ2V0Tm9kZVRleHQoKTsKLQkJfQotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KHJlZmVyZW5jZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgb2Zmc2V0LCAwLCBub2RlVGV4dCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBpbnNlcnROb2RlKERURE5vZGUgbm9kZSkgewotCQlpbnQgc3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBpbnNlcnRJbmRleCA9IC0xOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0b2Zmc2V0ID0gIiArIHN0YXJ0T2Zmc2V0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXROb2RlcygpLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjdXJyZW50Tm9kZSBlbmRPZmZzZXQgPSAiCi0JCQkvLyArY3VycmVudE5vZGUuZ2V0RW5kT2Zmc2V0KCkpOwotCi0JCQlpZiAoY3VycmVudE5vZGUuZ2V0RW5kT2Zmc2V0KCkgPiBzdGFydE9mZnNldCkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZW5kb2Zmc2V0ICIgKwotCQkJCS8vIGN1cnJlbnROb2RlLmdldEVuZE9mZnNldCgpICsgIiA+ICIgKyBzdGFydE9mZnNldCk7Ci0JCQkJaW5zZXJ0SW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChpbnNlcnRJbmRleCA9PSAtMSkgewotCQkJaW5zZXJ0SW5kZXggPSBnZXROb2RlcygpLnNpemUoKTsKLQkJfQotCi0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpbnNlcnQgaW5kZXggPSAiICsgaW5zZXJ0SW5kZXgpOwotCi0JCWFkZE5vZGUoaW5zZXJ0SW5kZXgsIG5vZGUpOwotCX0KLQotCS8vIGl0IGlzIGFzc3VtZWQgdGhhdCBmbGF0bm9kZSBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQlwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZUxpc3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAzKSB7Ci0JCQlJVGV4dFJlZ2lvbiBzZWNvbmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJSVRleHRSZWdpb24gdGhpcmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDIpOwotCQkJaWYgKHNlY29uZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKSAmJiB0aGlyZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNDb21tZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMikgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNFbGVtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMykgewotCQkJSVRleHRSZWdpb24gc2Vjb25kID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCUlUZXh0UmVnaW9uIHRoaXJkID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgyKTsKLQkJCWlmIChzZWNvbmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTikgJiYgdGhpcmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gaXQgaXMgYXNzdW1lZCB0aGF0IGZsYXRub2RlIGNvbnRhaW5zIGF0IGxlYXN0IDMgcmVnaW9ucwotCXB1YmxpYyBib29sZWFuIGlzRW50aXR5KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMykgewotCQkJSVRleHRSZWdpb24gc2Vjb25kID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCUlUZXh0UmVnaW9uIHRoaXJkID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgyKTsKLQkJCWlmIChzZWNvbmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTikgJiYgdGhpcmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNOb3RhdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDMpIHsKLQkJCUlUZXh0UmVnaW9uIHNlY29uZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlJVGV4dFJlZ2lvbiB0aGlyZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMik7Ci0JCQlpZiAoc2Vjb25kLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRVhDTEFNQVRJT04pICYmIHRoaXJkLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA9PSAxKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDApOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlib29sZWFuIGlzU2FtZVRvcExldmVsVHlwZShEVEROb2RlIGFmZmVjdGVkTm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gYWZmZWN0ZWROb2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpOwotCQkvLyByZXR1cm4gdHJ1ZSBpZiB0aGUgZmxhdG5vZGUgc3RpbGwgbWF0Y2hlcyB3aGF0IHRoZSBhZmZlY3RlZE5vZGUKLQkJLy8gaXMgcmVwcmVzZW50aW5nCi0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGlzRWxlbWVudChmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgJiYgaXNFbnRpdHkoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgQ29tbWVudCAmJiBpc0NvbW1lbnQoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCAmJiBpc0F0dHJpYnV0ZUxpc3QoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgTm90YXRpb24gJiYgaXNOb3RhdGlvbihmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBVbnJlY29nbml6ZWQgJiYgaXNVbnJlY29nbml6ZWQoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVbnJlY29nbml6ZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlyZXR1cm4gIWlzRWxlbWVudChmbGF0Tm9kZSkgJiYgIWlzRW50aXR5KGZsYXROb2RlKSAmJiAhaXNOb3RhdGlvbihmbGF0Tm9kZSkgJiYgIWlzUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKGZsYXROb2RlKSAmJiAhaXNBdHRyaWJ1dGVMaXN0KGZsYXROb2RlKSAmJiAhaXNDb21tZW50KGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlTm9kZShPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIHJlZmVyZW5jZU5vZGUsIERURE5vZGUgbm9kZVRvTW92ZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWlzTW92aW5nTm9kZSA9IHRydWU7Ci0KLQkJZGVsZXRlTm9kZShyZXF1ZXN0b3IsIG5vZGVUb01vdmUpOwotCQlpbnNlcnRJbnRvTW9kZWwocmVxdWVzdG9yLCByZWZlcmVuY2VOb2RlLCBub2RlVG9Nb3ZlLCBpc0FmdGVyKTsKLQkJaXNNb3ZpbmdOb2RlID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBldmVudCkgewotCQljcmVhdGluZ05ld01vZGVsID0gdHJ1ZTsKLQkJbm9kZUxpc3QuY2xlYXIoKTsKLQkJTm9kZXNFdmVudCByZW1vdmVFdmVudCA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCXJlbW92ZUV2ZW50LmdldE5vZGVzKCkuYWRkQWxsKG5vZGVMaXN0KTsKLQkJbm90aWZ5Tm9kZXNSZW1vdmVkKHJlbW92ZUV2ZW50KTsKLQkJLyogcmVtb3ZlQ2hpbGROb2RlcygpOyAqLwotCi0JCWlmIChldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSAhPSBudWxsICYmIGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkxpc3QoKSAhPSBudWxsKSB7Ci0JCQlidWlsZE5vZGVzKGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkxpc3QoKSk7Ci0JCX0KLQkJY3JlYXRpbmdOZXdNb2RlbCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkTm9kZXMgPSBldmVudC5nZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCU5vZGVzRXZlbnQgcmVtb3ZlZERURE5vZGVzID0gbmV3IE5vZGVzRXZlbnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gb2xkTm9kZXMuaXRlbShpKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkgPT0gZmxhdE5vZGUpIHsKLQkJCQkJcmVtb3ZlZERURE5vZGVzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlidWlsZE5vZGVzKGV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSk7Ci0KLQkJaWYgKHJlbW92ZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApIHsKLQkJCW5vdGlmeU5vZGVzUmVtb3ZlZChyZW1vdmVkRFRETm9kZXMpOwotCQkJcmVtb3ZlTm9kZXMocmVtb3ZlZERURE5vZGVzLmdldE5vZGVzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Tm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBtb2RlbExpc3RlbmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlEVERGaWxlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSURUREZpbGVMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5ub2RlQ2hhbmdlZChub2RlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeU5vZGVzQWRkZWQoTm9kZXNFdmVudCBhZGRlZE5vZGVzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBtb2RlbExpc3RlbmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlEVERGaWxlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSURUREZpbGVMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5ub2Rlc0FkZGVkKGFkZGVkTm9kZXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Tm9kZXNSZW1vdmVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG1vZGVsTGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSURUREZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJRFRERmlsZUxpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm5vZGVzUmVtb3ZlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWJ1aWxkTm9kZXMoTGlzdCBub2RlcykgewotCQkvLyByZW1vdmUgdGhlIG9sZCBub2RlcwotCQlyZW1vdmVOb2Rlcyhub2Rlcyk7Ci0KLQkJLy8gbm93IHJlYnVpbGQgdGhlbQotCQlOb2Rlc0V2ZW50IGFkZGVkRFRETm9kZXMgPSBuZXcgTm9kZXNFdmVudCgpOwotCQlJdGVyYXRvciBkdGROb2RlcyA9IG5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChkdGROb2Rlcy5oYXNOZXh0KCkpIHsKLQkJCURURE5vZGUgZHRkTm9kZSA9IChEVEROb2RlKSBkdGROb2Rlcy5uZXh0KCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlYnVpbGRpbmcgIiArCi0JCQkvLyBkdGROb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKSk7Ci0KLQkJCURURE5vZGUgbm9kZSA9IGJ1aWxkTm9kZShkdGROb2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlhZGRlZERURE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlpZiAoYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApIHsKLQkJCS8vIG5vdyB0ZWxsIHBlb3BsZSBhYm91dCB0aGUgYWRkaXRpb25zCi0JCQlub3RpZnlOb2Rlc0FkZGVkKGFkZGVkRFRETm9kZXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJSVRleHRSZWdpb24gY2hhbmdlZFJlZ2lvbiA9IGV2ZW50LmdldFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCURURE5vZGUgYWZmZWN0ZWROb2RlID0gKERURE5vZGUpIGdldE5vZGVBdChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChjaGFuZ2VkUmVnaW9uKSwgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KGNoYW5nZWRSZWdpb24pKTsKLQkJaWYgKGFmZmVjdGVkTm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBubyBuZWVkIHRvIHJlc29sdmUgcmVnaW9ucyBhcyBpdCBpcyBqdXN0IGEgY2hhbmdlCi0JCQkvLyBhZmZlY3RlZE5vZGUucmVzb2x2ZVJlZ2lvbnMoKTsKLQkJCW5vdGlmeU5vZGVDaGFuZ2VkKGFmZmVjdGVkTm9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJTGlzdCBub2Rlc1RvUmVidWlsZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlEVEROb2RlIGFmZmVjdGVkTm9kZSA9IGdldE5vZGUoZmxhdE5vZGUpOwotCi0JCWlmICghaXNTYW1lVG9wTGV2ZWxUeXBlKGFmZmVjdGVkTm9kZSkpIHsKLQkJCS8vIEJ1ZyAxMTExMDAgLSBGaXJlIG9mZiBhIG5vZGUgcmVtb3ZhbCBldmVudAotCQkJLy8gdG8gcmVtb3ZlIHRoZSBub2RlIGZyb20gdGhlIHRyZWUgdmlld2VyCi0JCQlOb2Rlc0V2ZW50IHJlbW92ZWREVEROb2RlcyA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCQlyZW1vdmVkRFRETm9kZXMuYWRkKGFmZmVjdGVkTm9kZSk7Ci0JCQlub3RpZnlOb2Rlc1JlbW92ZWQocmVtb3ZlZERURE5vZGVzKTsKLQkJCW5vZGVzVG9SZWJ1aWxkLmFkZChhZmZlY3RlZE5vZGUpOwotCQkJcmVidWlsZE5vZGVzKG5vZGVzVG9SZWJ1aWxkKTsKLQkJfQotCQllbHNlIHsKLQkJCWFmZmVjdGVkTm9kZS5yZXNvbHZlUmVnaW9ucygpOwotCQkJbm90aWZ5Tm9kZUNoYW5nZWQoYWZmZWN0ZWROb2RlKTsKLQkJCS8vIG5vdyB0cnkgYW5kIGRldGVybWluZSB3aGljaCBvbmVzIHdlcmUgYWRkZWQKLQkJCU5vZGVzRXZlbnQgYWRkZWREVEROb2RlcyA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IGV2ZW50LmdldE5ld1JlZ2lvbnMoKTsKLQkJCWludCBzaXplID0gbmV3UmVnaW9ucy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5ld1JlZ2lvbnMuZ2V0KGkpOwotCQkJCURURE5vZGUgZGVlcGVzdE5vZGUgPSBhZmZlY3RlZE5vZGUuZ2V0RGVlcGVzdE5vZGUoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikpOwotCQkJCS8vIEJ1ZyAxMTExMDAgLSBXZSBkbyBub3QgbmVlZCB0byBmaXJlIGEgbm9kZSBhZGRlZCBldmVudAotCQkJCS8vIGZvciB0aGUgYWZmZWN0ZWROb2RlIGJlY2F1c2UgdGhhdCBpcyBhbHJlYWR5IGhhbmRsZWQgYnkKLQkJCQkvLyB0aGUgbm9kZSBjaGFuZ2VkIGV2ZW50IGFib3ZlCi0JCQkJaWYgKGRlZXBlc3ROb2RlICE9IGFmZmVjdGVkTm9kZSAmJiAhYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLmNvbnRhaW5zKGRlZXBlc3ROb2RlKSkgewotCQkJCQlhZGRlZERURE5vZGVzLmFkZChkZWVwZXN0Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFkZGVkRFRETm9kZXMuZ2V0Tm9kZXMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJbm90aWZ5Tm9kZXNBZGRlZChhZGRlZERURE5vZGVzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURUREZpbGVMaXN0ZW5lcihJRFRERmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCW1vZGVsTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm9kZXMoTGlzdCBub2RlcykgewotCQlnZXROb2RlcygpLnJlbW92ZUFsbChub2Rlcyk7Ci0JCS8qCi0JCSAqIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJICogcmVtb3ZlQ2hpbGQoKERURE5vZGUpbm9kZXMuZ2V0KGkpKTsgfSAvLyBlbmQgb2YgZm9yICgpCi0JCSAqLwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFRETm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVEROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYTVjN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVEROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuVGV4dFJlZ2lvbkxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIERURE5vZGUgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIGltcGxlbWVudHMgSW5kZXhlZFJlZ2lvbiB7Ci0KLQkvLyB0aGVzZSBhcmUgY2hhcmFjdGVyb2Zmc2V0cwotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0KLQkvLyBmbGF0IG5vZGUgdGhhdCBjb250YWlucyB0aGlzIG5vZGUKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQotCXByb3RlY3RlZCBUZXh0UmVnaW9uTGlzdEltcGwgcmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCXByb3RlY3RlZCBUZXh0UmVnaW9uTGlzdEltcGwgd2hpdGVzcGFjZSA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCXB1YmxpYyBEVEROb2RlKERUREZpbGUgZHRkRmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQl0aGlzLmR0ZEZpbGUgPSBkdGRGaWxlOwotCQl0aGlzLmZsYXROb2RlID0gZmxhdE5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvKgotCQkgKiBpZiAoc3RhcnRSZWdpb24gPT0gbnVsbCkgeyBzdGFydFJlZ2lvbiA9IHJlZ2lvbjsgfSBlbmRSZWdpb24gPQotCQkgKiByZWdpb247Ci0JCSAqLwotCQlyZWdpb25zLmFkZChyZWdpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFdoaXRlc3BhY2VSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXdoaXRlc3BhY2UuYWRkKHJlZ2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIGxhYmVsKSB7Ci0JCWdldERUREZpbGUoKS5nZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHJlcXVlc3RvciwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXBlc3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHRlc3RQb3NpdGlvbikgewotCQlyZXR1cm4gY29udGFpbnNSYW5nZSh0ZXN0UG9zaXRpb24sIHRlc3RQb3NpdGlvbik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgPD0gc3RhcnQgJiYgZW5kIDw9IGdldEVuZE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZShEVEROb2RlIGNoaWxkKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX05PREVfREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQlkZWxldGUodGhpcywgY2hpbGQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgY2hpbGQpIHsKLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBjaGlsZC5nZXRTdGFydE9mZnNldCgpLCBjaGlsZC5nZXRGdWxsTm9kZUxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RvcikgewotCQlnZXREVERGaWxlKCkuZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcocmVxdWVzdG9yKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbkxpc3QoKS50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW5MaXN0KCkgewotCQlOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJfQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRFRETm9kZSBnZXREZWVwZXN0Tm9kZShpbnQgb2Zmc2V0KSB7Ci0JCWlmIChjb250YWlucyhvZmZzZXQpKSB7Ci0JCQkvLyBub3cgc2VlIGlmIGEgY2hpbGQgY29udGFpbnMgdGhpcyBvZmZzZXQKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlEVEROb2RlIGNoaWxkID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJCURURE5vZGUgZGVlcGVzdCA9IGNoaWxkLmdldERlZXBlc3ROb2RlKG9mZnNldCk7Ci0JCQkJaWYgKGRlZXBlc3QgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZGVlcGVzdDsKLQkJCQl9Ci0JCQl9IC8vIGVuZCBvZiBmb3IgKCkKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBEVEROb2RlIGdldERlZXBlc3ROb2RlKGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAoY29udGFpbnNSYW5nZShzdGFydCwgZW5kKSkgewotCQkJLy8gbm93IHNlZSBpZiBhIGNoaWxkIGNvbnRhaW5zIHRoaXMgb2Zmc2V0Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRFRETm9kZSBjaGlsZCA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCQlEVEROb2RlIGRlZXBlc3QgPSBjaGlsZC5nZXREZWVwZXN0Tm9kZShzdGFydCwgZW5kKTsKLQkJCQlpZiAoZGVlcGVzdCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkZWVwZXN0OwotCQkJCX0KLQkJCX0gLy8gZW5kIG9mIGZvciAoKQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJcmV0dXJuIGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZ2V0RW5kUmVnaW9uKCkpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRFbmRSZWdpb24oKSB7Ci0JCXJldHVybiByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOy8vIGVuZFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJRFRETW9kZWxJbXBsIG1vZGVsID0gZHRkRmlsZS5nZXREVERNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJRmFjdG9yeVJlZ2lzdHJ5IHJlZyA9IG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQkJaWYgKHJlZyAhPSBudWxsKQotCQkJCXJldHVybiByZWc7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRGdWxsTm9kZUxlbmd0aCgpIHsKLQkJcmV0dXJuIGdldFdoaXRlc3BhY2VFbmRPZmZzZXQoKSAtIGdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsTm9kZVRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0Tm9kZVRleHQoKTsKLQkJaWYgKHdoaXRlc3BhY2Uuc2l6ZSgpID4gMCkgewotCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IG5ldyBSZWdpb25JdGVyYXRvcih3aGl0ZXNwYWNlKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCXRleHQgKz0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCWFic3RyYWN0IHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbigpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OQU1FKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyByZXR1cm4gdGhlIGZpcnN0IHRva2VuIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCB0b2tlbiB0eXBlCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5leHRSZWdpb24oUmVnaW9uSXRlcmF0b3IgaXRlciwgU3RyaW5nIHR5cGUpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyh0eXBlKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXROb2RlTGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0RW5kT2Zmc2V0KCkgLSBnZXRTdGFydE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlVGV4dCgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJc2IuYXBwZW5kKGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGdldFN0YXJ0UmVnaW9uKCkpOwotCX0KLQotCS8vIHByaXZhdGUgUmVnaW9uIHN0YXJ0UmVnaW9uLGVuZFJlZ2lvbjsKLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0U3RhcnRSZWdpb24oKSB7Ci0JCXJldHVybiByZWdpb25zLmdldCgwKTsKLQkJLy8gcmV0dXJuIHN0YXJ0UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZmxhdE5vZGUuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBmbGF0Tm9kZS4KLQkgKiAKLQkgKiBJU1NVRTpuYW1lZCBjaGFuZ2VkIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZAotCSAqIHN1cGVyIGNsYXNzIG1ldGhvZCwgYnV0IHNob3VsZCByZS10aGluayBpZiB0aGlzIGlzIGNvcnJlY3QgdGVjaG5pcXVlLgotCSAqIFBlcmhhcHMgZ2V0Rmlyc3RSZWdpb24/Ci0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZmxhdE5vZGU7Ci0JfQotCi0JLy8gcmV0dXJuIGVuZCBvZmZzZXQgaW5jbHVkaW5nIHdoaXRlc3BhY2UKLQkvLyBvciBqdXN0IHRoZSBlbmQgb2Zmc2V0IGlmIHRoZXJlIGlzIG5vIHdoaXRlc3BhY2UKLQlwdWJsaWMgaW50IGdldFdoaXRlc3BhY2VFbmRPZmZzZXQoKSB7Ci0JCWlmICh3aGl0ZXNwYWNlLnNpemUoKSA+IDApIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHdoaXRlc3BhY2UuZ2V0KHdoaXRlc3BhY2Uuc2l6ZSgpIC0gMSk7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVHJhaWxpbmdXaGl0ZXNwYWNlKCkgewotCQlyZXR1cm4gd2hpdGVzcGFjZS5zaXplKCkgPiAwOwotCX0KLQotCXB1YmxpYyBSZWdpb25JdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUgcmVnaW9uIGl0ZXIgIiArIHRoaXMuZ2V0Q2xhc3MoKSArICIgd2l0aAotCQkvLyBzdGFydCAsIGVuZCA9ICIgKyBnZXRTdGFydE9mZnNldCgpICsgIiwgIiArZ2V0RW5kT2Zmc2V0KCkpOwotCQlyZXR1cm4gbmV3IFJlZ2lvbkl0ZXJhdG9yKHJlZ2lvbnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2VUZXh0KE9iamVjdCByZXF1ZXN0b3IsIGludCBzdGFydCwgaW50IGxlbmd0aCwgU3RyaW5nIG5ld1RleHQpIHsKLQkJZ2V0RFRERmlsZSgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnQsIGxlbmd0aCwgbmV3VGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlZ2lvbnMoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbmFtZSkgewotCQlpZiAoIWdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZVRva2VuLnVwZGF0ZVRleHQobmFtZSk7Ci0JCQkJZ2V0RFRERmlsZSgpLmdldERURE1vZGVsKCkuZ2V0UmVmZXJlbmNlVXBkYXRlcigpLm5hbWVBYm91dFRvQ2hhbmdlKHJlcXVlc3RvciwgdGhpcywgbmFtZSk7Ci0JCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgbmFtZVJlZ2lvbi5nZXRMZW5ndGgoKSwgbmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX05PREVfTkFNRV9DSEcpOyAvLyROT04tTkxTLTEkCi0JCXNldE5hbWUodGhpcywgbmFtZSk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGZsYXROb2RlLgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZmxhdE5vZGUuIElTU1VFOm5hbWVkIGNoYW5nZWQgbm90IHRvIGJlCi0JICogICAgICAgICAgICBjb25mdXNlZCB3aXRoIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBzdXBlciBjbGFzcyBtZXRob2QsCi0JICogICAgICAgICAgICBidXQgc2hvdWxkIHJlLXRoaW5rIGlmIHRoaXMgaXMgY29ycmVjdCB0ZWNobmlxdWUKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHYpIHsKLQkJdGhpcy5mbGF0Tm9kZSA9IHY7Ci0JfQotCi0JLy8gc2tpcHMgcGFzdCBuZXh0IG5hbWUgdG9rZW4gaW4gdGhlIGl0ZXJhdG9yCi0JcHJvdGVjdGVkIHZvaWQgc2tpcFBhc3ROYW1lKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTkFNRSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoamF2YS5sYW5nLlN0cmluZyBmZWF0dXJlLCBqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERSZXNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzZkYjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBEVERSZXNvdXJjZSB7Ci0JLy8gRW51bWVyYXRpb24gQ29uc3RhbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5ZSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2FueS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFTElTVElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfbGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUREZJTEVJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UUkVGSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2VsZW1lbnRfcmVmLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbXB0eWNvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWVJFRkVSRU5DRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTERSX0FUVExJU1QgPSAiaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfYXR0bGlzdF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfQ09NTSA9ICJpY29ucy9mdWxsL29iajE2L2ZvbGRlcl9jb21tZW50c19vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxEUl9FTCA9ICJpY29ucy9mdWxsL29iajE2L2ZsZHJfZWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfRU5UID0gImljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfTk9UID0gImljb25zL2Z1bGwvb2JqMTYvZmxkcl9ub3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfVU5SRUMgPSAiaWNvbnMvZnVsbC9vYmoxNi9mbGRyX3VucmVjLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV0hUTUxGT1JNID0gImljb25zL2Z1bGwvb2JqMTYvZ2VuaHRtZm9ybV93aXouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORUNIT0lDRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vbmVjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFQ0hPSUNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZW9ybW9yZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZW9ybW9yZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFU0VRVUVOQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3Jlc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FU0VRVUVOQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMQ0hPSUNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29wdGlvbmFsY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUxTRVFVRU5DRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbHNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0RBVEFJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvdHh0ZXh0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlJFQ09HTklaRURJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvdW5yZWNvZ25pemVkX2NvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9PUk1PUkVDSE9JQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST09STU9SRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPT1JNT1JFU0VRVUVOQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZXNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMTAzMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBFbGVtZW50IGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCi0JTGlzdCBhdHRMaXN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCUxpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBDTU5vZGUgZkNvbnRlbnRNb2RlbDsKLQotCXB1YmxpYyBFbGVtZW50KERUREZpbGUgZHRkRmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihkdGRGaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VMRU1FTlRfQUREX0FUVFIpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgYXR0TGlzdHMgPSBnZXRBdHRyaWJ1dGVMaXN0cygpOwotCQlpZiAoYXR0TGlzdHMuc2l6ZSgpID09IDApIHsKLQkJCWdldERUREZpbGUoKS5jcmVhdGVBdHRyaWJ1dGVMaXN0KHRoaXMsIGdldE5hbWUoKSwgdHJ1ZSk7Ci0JCQlhdHRMaXN0cyA9IGdldEF0dHJpYnV0ZUxpc3RzKCk7Ci0JCX0KLQkJaWYgKGF0dExpc3RzLnNpemUoKSA+IDApIHsKLQkJCUF0dHJpYnV0ZUxpc3QgYXR0TGlzdCA9IChBdHRyaWJ1dGVMaXN0KSBhdHRMaXN0cy5nZXQoYXR0TGlzdHMuc2l6ZSgpIC0gMSk7Ci0JCQlhdHRMaXN0LmFkZEF0dHJpYnV0ZShuYW1lKTsKLQkJfQotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVF9BRERfQ0hJTEQpOyAvLyROT04tTkxTLTEkCi0JCWFkZENvbnRlbnQodGhpcywgIiBFTVBUWSIpOyAvLyROT04tTkxTLTEkCi0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50KE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBjb250ZW50KSB7Ci0JCUlUZXh0UmVnaW9uIHdoaXRlc3BhY2UgPSBnZXRXaGl0ZXNwYWNlQWZ0ZXJOYW1lKCk7Ci0JCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSAwOwotCQlpZiAod2hpdGVzcGFjZSAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHdoaXRlc3BhY2UpOwotCQkJbGVuZ3RoID0gd2hpdGVzcGFjZS5nZXRMZW5ndGgoKSA+PSAyID8gMSA6IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVRleHRSZWdpb24gZWxlbWVudFRhZyA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOwotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGVsZW1lbnRUYWcpOwotCQkJfQotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGxlbmd0aCwgY29udGVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkR3JvdXAoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVF9BRERfR1JQKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRDb250ZW50KHRoaXMsICIgKCkiKTsgLy8kTk9OLU5MUy0xJAotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlyZXR1cm4gbmV3IEVsZW1lbnQoZHRkRmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZUxpc3RzKCkgewotCQlhdHRMaXN0TGlzdC5jbGVhcigpOwotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBnZXROYW1lKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBkdGRGaWxlLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QgJiYgbm9kZS5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCWF0dExpc3RMaXN0LmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXR0TGlzdExpc3Q7Ci0JfQotCi0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0Q29udGVudE1vZGVsKCkgewotCQkvLyBPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCkKLQkJcmV0dXJuIChDTU5vZGUpIGdldEZpcnN0Q2hpbGQoKTsvLyBjb250ZW50TW9kZWw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RWxlbWVudEF0dHJpYnV0ZXMoKSB7Ci0JCWF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJSXRlcmF0b3IgYXR0TGlzdHMgPSBnZXRBdHRyaWJ1dGVMaXN0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChhdHRMaXN0cy5oYXNOZXh0KCkpIHsKLQkJCUF0dHJpYnV0ZUxpc3QgYXR0TGlzdCA9IChBdHRyaWJ1dGVMaXN0KSBhdHRMaXN0cy5uZXh0KCk7Ci0KLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gYXR0TGlzdC5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWF0dHJpYnV0ZXMuYWRkKGNoaWxkcmVuW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRUxFTUVOVElDT04pOwotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIE5vZGUuRUxFTUVOVF9OT0RFOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2VDb250ZW50TW9kZWwoT2JqZWN0IHJlcXVlc3RvciwgQ01Ob2RlIG5vZGUpIHsKLQkJcmVwbGFjZUNvbnRlbnRNb2RlbChyZXF1ZXN0b3IsIG5vZGUuZ2V0Tm9kZVRleHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwbGFjZUNvbnRlbnRNb2RlbChPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbm9kZVRleHQpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSAwOwotCQlDTU5vZGUgY29udGVudE1vZGVsID0gZ2V0Q29udGVudE1vZGVsKCk7Ci0JCWlmIChjb250ZW50TW9kZWwgIT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gY29udGVudE1vZGVsLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSBjb250ZW50TW9kZWwuZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBvZmZzZXQsIGxlbmd0aCwgbm9kZVRleHQpOwotCQl9Ci0JCWVsc2UgewotCQkJYWRkQ29udGVudChyZXF1ZXN0b3IsIG5vZGVUZXh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVSZWdpb25zKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImVsZW1lbnQgbm9kZSBzdHJlYW0gPSAiICsKLQkJLy8gdG9rZW5TdHJlYW0uZ2V0U3RyaW5nKCkpOwotCQlmQ29udGVudE1vZGVsID0gbnVsbDsKLQkJcmVtb3ZlQ2hpbGROb2RlcygpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQlpZiAoZ2V0TmFtZVJlZ2lvbigpICE9IG51bGwpIHsKLQkJCS8vIHdlIHNraXAgcGFzdCB0aGUgbmFtZSB0b2tlbiBpcyBvdXIgbmFtZQotCQkJc2tpcFBhc3ROYW1lKGl0ZXIpOwotCQl9Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0KLQkJCWlmIChmQ29udGVudE1vZGVsID09IG51bGwpIHsKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk5BTUUpKSB7Ci0JCQkJCWZDb250ZW50TW9kZWwgPSBuZXcgQ01CYXNpY05vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSkpIHsKLQkJCQkJZkNvbnRlbnRNb2RlbCA9IG5ldyBDTUJhc2ljTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pKSB7Ci0JCQkJCWZDb250ZW50TW9kZWwgPSBuZXcgQ01Hcm91cE5vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZkNvbnRlbnRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRU5EX1RBRykpIHsKLQkJCQkJLy8gY29udGVudCBtb2RlbCBnZXRzIGFsbCByZWdpb25zIGV4Y2VwdCBmb3IgdGhlICc+JwotCQkJCQlmQ29udGVudE1vZGVsLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGlmIGl0IGlzIGVxdWFsIHRvIHRoZSBlbmQgdGFnLCB0aGVuIGRvbid0IGFkZCBhbnltb3JlCi0JCQkJCS8vIHJlZ2lvbnMKLQkJCQkJLy8gZm9yIHRoZSBjb250ZW50IG1vZGVsCi0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJfQotCi0JCX0KLQkJaWYgKGZDb250ZW50TW9kZWwgIT0gbnVsbCkgewotCQkJYXBwZW5kQ2hpbGQoZkNvbnRlbnRNb2RlbCk7Ci0JCQkvLyB0aGlzIGlzIHRoZSByb290IGVsZW1lbnQgY29udGVudCBzbyBzZXQgaXQgdHJ1ZQotCQkJZkNvbnRlbnRNb2RlbC5zZXRSb290RWxlbWVudENvbnRlbnQodHJ1ZSk7Ci0JCQkvLyBub3cgdGVsbCB0aGUgY29udGVudCBtb2RlbCB0byByZXNvbHZlIGl0J3MgcmVnaW9ucwotCQkJZkNvbnRlbnRNb2RlbC5yZXNvbHZlUmVnaW9ucygpOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50TW9kZWwoQ01Ob2RlIGNvbnRlbnRNb2RlbCkgewotCQl0aGlzLmZDb250ZW50TW9kZWwgPSBjb250ZW50TW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbnRpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZjdjM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vLyBleHRlcm5hbCBub2RlIGNvbnRhaW5zIGNvZGUgdG8gaGVscCBzZXQgYW5kIGdldCBwdWJsaWMgaWRzCi1wdWJsaWMgY2xhc3MgRW50aXR5IGV4dGVuZHMgRXh0ZXJuYWxOb2RlIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzZXRFeHRlcm5hbEVudGl0eSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1NFVF9FWFRfRU5USVRZOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNldEdlbmVyYWxFbnRpdHkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9TRVRfR0VORVJBTF9FTlRJVFk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2V0SW50ZXJuYWxFbnRpdHkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9TRVRfSU5UX0VOVElUWTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNldFBhcmFtZXRlckVudGl0eSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1NFVF9QQVJNX0VOVElUWTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEVudGl0eShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUsIERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5FTlRJVFlJQ09OKTsKLQl9Ci0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygbm90YXRpb25OYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygbm90YXRpb25OYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90YXRpb25OYW1lKCkgewotCQlJVGV4dFJlZ2lvbiBuZGF0YVJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUpOwotCQlpZiAobmRhdGFSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQobmRhdGFSZWdpb24pOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRQZXJjZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJaWYgKCFpc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcmF0b3IoKSk7Ci0JCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24odmFsdWVSZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZXh0ZXJuYWxFbnRpdHkuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBleHRlcm5hbEVudGl0eS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsRW50aXR5KCkgewotCQlyZXR1cm4gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKSAhPSBudWxsIHx8IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGlzUGFyYW1ldGVyRW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgaXNQYXJhbWV0ZXJFbnRpdHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0JCXJldHVybiBnZXRQZXJjZW50UmVnaW9uKCkgIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTkRhdGEoT2JqZWN0IHJlcXVlc3RvcikgewotCQlJVGV4dFJlZ2lvbiBuZGF0YVJlZ2lvbiA9IG51bGw7Ci0KLQkJLy8gc2VlIGlmIHdlIGhhdmUgYW4gTkRBVEEga2V5d29yZAotCQluZGF0YVJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCk7Ci0JCWludCBzdGFydE9mZnNldCA9IDAsIGVuZE9mZnNldCA9IDA7Ci0JCWlmIChuZGF0YVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KG5kYXRhUmVnaW9uKTsKLQkJCWVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZGF0YVJlZ2lvbik7Ci0JCX0KLQkJSVRleHRSZWdpb24gdmFsdWUgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWlmIChzdGFydE9mZnNldCA9PSAwKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCh2YWx1ZSk7Ci0JCQl9Ci0JCQllbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQodmFsdWUpOwotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGV4dGVybmFsRW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZXh0ZXJuYWxFbnRpdHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxFbnRpdHkoYm9vbGVhbiBpc0V4dGVybmFsRW50aXR5KSB7Ci0JCWlmIChpc0V4dGVybmFsRW50aXR5KCkgIT0gaXNFeHRlcm5hbEVudGl0eSkgewotCQkJLy8gZXh0ZXJuYWxFbnRpdHkgPSB2OwotCQkJYmVnaW5SZWNvcmRpbmcodGhpcywgaXNFeHRlcm5hbEVudGl0eSA/IHNldEV4dGVybmFsRW50aXR5IDogc2V0SW50ZXJuYWxFbnRpdHkpOwotCQkJaWYgKGlzRXh0ZXJuYWxFbnRpdHkpIHsKLQkJCQkvLyB3ZSBuZWVkIHRvIGdldCByaWQgb2YgdGhlIHZhbHVlIGxpdGVyYWwKLQkJCQlJVGV4dFJlZ2lvbiBxdW90ZSA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpOwotCQkJCWlmIChxdW90ZSA9PSBudWxsKSB7Ci0JCQkJCXF1b3RlID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCk7Ci0JCQkJfQotCQkJCWlmIChxdW90ZSAhPSBudWxsKSB7Ci0JCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHF1b3RlKSwgcXVvdGUuZ2V0TGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlzZXRTeXN0ZW1JRCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdlIG5lZWQgdG8gZ2V0IHJpZCBvZiB0ZXh0IGJldHdlZW4gZW5kIG9mIG5hbWUgcmVnaW9uIGFuZAotCQkJCS8vIHRoZSBsYXN0IGRvdWJsZSBxdW90ZWQgbGl0ZXJhbAotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCUlUZXh0UmVnaW9uIGtleXdvcmQgPSBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXIpOwotCQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQkJaWYgKGtleXdvcmQgPT0gbnVsbCkgewotCQkJCQkvLyByZXNldCB0aGUgaXRlcmF0b3IKLQkJCQkJaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJCWtleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXIpOwotCQkJCX0KLQkJCQlpZiAoa2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoa2V5d29yZCk7Ci0JCQkJCS8vIHN0YXJ0IHdpdGggYSBsZW5ndGgganVzdCBlcXVhbCB0byB0aGUga2V5d29yZCBmb3Igbm93Ci0JCQkJCWxlbmd0aCA9IGtleXdvcmQuZ2V0TGVuZ3RoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyByZXNldCB0aGUgaXRlcmF0b3Igc2luY2Ugd2UgZGlkbid0IGZpbmQgdGhlIGtleXdvcmQKLQkJCQkJaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJCS8vIGp1c3QgZ28gZnJvbSBhZnRlciB0aGUgbmFtZQotCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChnZXROYW1lUmVnaW9uKCkpOwotCQkJCX0KLQotCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgdGhlIHN0YXJ0LCBsb29rIGZvciB0aGUgZW5kCi0JCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IG51bGw7Ci0KLQkJCQlpZiAobGFzdFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIHRoZW4gbG9vayBmb3IgbGFzdCBxdW90ZWQgbGl0ZXJhbAotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCUlUZXh0UmVnaW9uIGxpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCQkJCWlmIChsaXRlcmFsICE9IG51bGwpIHsKLQkJCQkJCQlsYXN0UmVnaW9uID0gbGl0ZXJhbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJbGVuZ3RoID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGxhc3RSZWdpb24pIC0gc3RhcnRPZmZzZXQ7Ci0JCQkJfQotCQkJCXJlcGxhY2VUZXh0KHRoaXMsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgsICJcIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZW1vdmVORGF0YSh0aGlzKTsKLQkJCX0KLQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uTmFtZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbmV3Tm90YXRpb24pIHsKLQkJaWYgKCFnZXROb3RhdGlvbk5hbWUoKS5lcXVhbHMobmV3Tm90YXRpb24pKSB7Ci0JCQlpZiAoIW5ld05vdGF0aW9uLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIAotCQkJCUlUZXh0UmVnaW9uIG5kYXRhUmVnaW9uID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5OREFUQV9WQUxVRSk7Ci0JCQkJaWYgKG5kYXRhUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChuZGF0YVJlZ2lvbiksIG5kYXRhUmVnaW9uLmdldExlbmd0aCgpLCBuZXdOb3RhdGlvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0aW1lIHRvIGNyZWF0ZSBvbmUKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJU3RyaW5nIHN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCQlJVGV4dFJlZ2lvbiBuZGF0YUtleXdvcmQgPSBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQpOwotCQkJCQlpZiAobmRhdGFLZXl3b3JkID09IG51bGwpIHsKLQkJCQkJCS8vIHdlJ2xsIG5lZWQgdG8gY3JlYXRlIG9uZSBhZnRlciB0aGUgbGFzdCBxdW90ZWQKLQkJCQkJCS8vIGxpdGVyYWwKLQkJCQkJCS8vIFJlc2V0IGl0ZXJhdG9yCi0JCQkJCQlzdHJpbmcgKz0gIiBOREFUQSAiOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQkJCUlUZXh0UmVnaW9uIGxhc3RRdW90ZWRMaXRlcmFsID0gbnVsbDsKLQkJCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJCUlUZXh0UmVnaW9uIGxpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCQkJCQlpZiAobGl0ZXJhbCAhPSBudWxsKSB7Ci0JCQkJCQkJCWxhc3RRdW90ZWRMaXRlcmFsID0gbGl0ZXJhbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobGFzdFF1b3RlZExpdGVyYWwgIT0gbnVsbCkgewotCQkJCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGxhc3RRdW90ZWRMaXRlcmFsKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGNyZWF0ZWQgYWZ0ZXIgdGhlIHN5c3RlbSBvciBwdWJsaWMga2V5d29yZAotCQkJCQkJCUlUZXh0UmVnaW9uIGtleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpOwotCQkJCQkJCWlmIChrZXl3b3JkID09IG51bGwpIHsKLQkJCQkJCQkJa2V5d29yZCA9IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIHdlIHNob3VsZG4ndCBiZSBudWxsIGhlcmUgc2luY2Ugd2UgY2hlY2sgaWYgd2UKLQkJCQkJCQkvLyB3ZXJlIGV4dGVybmFsIGFscmVhZHkKLQkJCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChrZXl3b3JkKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmRhdGFLZXl3b3JkKTsKLQkJCQkJfQotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCAwLCBzdHJpbmcgKyBuZXdOb3RhdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbmVlZCB0byByZW1vdmUgdGhlIG5kYXRhIHN0dWZmCi0JCQkJcmVtb3ZlTkRhdGEocmVxdWVzdG9yKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygbm90YXRpb25OYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb3RhdGlvbgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIG5vdGF0aW9uTmFtZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RhdGlvbk5hbWUoU3RyaW5nIG5ld05vdGF0aW9uKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsICJOREFUQSAiICsgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfTkRBVEFfQ0hBTkdFKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNldE5vdGF0aW9uTmFtZSh0aGlzLCBuZXdOb3RhdGlvbik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGlzUGFyYW1ldGVyRW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gaXNQYXJhbWV0ZXJFbnRpdHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyRW50aXR5KGJvb2xlYW4gdikgewotCQlpZiAoaXNQYXJhbWV0ZXJFbnRpdHkoKSAhPSB2KSB7Ci0JCQliZWdpblJlY29yZGluZyh0aGlzLCB2ID8gc2V0UGFyYW1ldGVyRW50aXR5IDogc2V0R2VuZXJhbEVudGl0eSk7Ci0JCQlpZiAodikgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCUlUZXh0UmVnaW9uIHN0YXJ0VGFnID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKTsKLQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwLCBsZW5ndGggPSAwOwotCi0JCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UgJiYgcmVnaW9uLmdldExlbmd0aCgpID4gMSkgewotCQkJCQkJbGVuZ3RoID0gMTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoc3RhcnRUYWcpOwotCQkJCX0KLQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBzdGFydE9mZnNldCwgbGVuZ3RoLCAiICUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIG5vdyBnZXQgcmlkIG9mIGFueSBORGF0YSBzaW5jZSBpdCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlCi0JCQkJLy8gZW50aXR5IGlzIGEgZ2VuZXJhbCBlbnRpdHkgYW5kIG5vdCBhIHBhcmFtZXRlciBlbnRpdHkKLQkJCQlyZW1vdmVORGF0YSh0aGlzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGdldCByaWQgb2YgcGVyY2VudCByZWdpb24KLQkJCQlJVGV4dFJlZ2lvbiBwZXJjZW50UmVnaW9uID0gZ2V0UGVyY2VudFJlZ2lvbigpOwotCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHBlcmNlbnRSZWdpb24pLCBwZXJjZW50UmVnaW9uLmdldExlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2KSB7Ci0JCWlmICghaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQlpZiAoIWdldFZhbHVlKCkuZXF1YWxzKHYpKSB7Ci0JCQkJLy8gdGhlbiBpdCBtYWtlcyBzZW5zZSB0byBjaGFuZ2UgdGhlIHZhbHVlCi0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJCQlTdHJpbmcgcXVvdGVDaGFyID0gdi5pbmRleE9mKCJcIiIpID09IC0xID8gIlwiIiA6ICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSwgdmFsdWVSZWdpb24uZ2V0TGVuZ3RoKCksIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuTkFNRSk7Ci0JCQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCQkJLy8gY3JlYXRlIGl0IGFmdGVyIHRoZSBwZXJjZW50IGlmIHRoZXJlIGlzIG9uZQotCQkJCQkJcmVnaW9uID0gZ2V0UGVyY2VudFJlZ2lvbigpOwotCQkJCQl9Ci0JCQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCQkJLy8gaWYgc3RpbGwgbnVsbCwgdGhlbiBjcmVhdGUgaXQgYWZ0ZXIgdGhlIGVsZW1lbnQgdGFnCi0JCQkJCQlyZWdpb24gPSBnZXRTdGFydFRhZyhpdGVyYXRvcigpKTsKLQkJCQkJfQotCi0JCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIDAsIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2KSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1ZBTFVFX0NIRyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VmFsdWUodGhpcywgdik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0V4dGVybmFsTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTNjZWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vLyBiYXNlIGNsYXNzIGZvciBub2RlcyB0aGF0IGNhbiBjb250YWluIGV4dGVybmFsIGNvbnRlbnQKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRlcm5hbE5vZGUgZXh0ZW5kcyBOYW1lZFRvcExldmVsTm9kZSB7Ci0KLQlTdHJpbmcgcHVibGljSUQ7Ci0KLQlTdHJpbmcgc3lzdGVtSUQ7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxOb2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgU3RyaW5nIHRhZ1R5cGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUsIHRhZ1R5cGUpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROZXh0UXVvdGVkTGl0ZXJhbChSZWdpb25JdGVyYXRvciBpdGVyKSB7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpIHx8IHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBwdWJsaWNJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHB1YmxpY0lELgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSUQoKSB7Ci0JCUlUZXh0UmVnaW9uIHB1YmxpY1ZhbHVlID0gZ2V0UHVibGljVmFsdWVSZWdpb24oKTsKLQkJaWYgKHB1YmxpY1ZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24ocHVibGljVmFsdWUpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJcmV0dXJuIGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuUFVCTElDX0tFWVdPUkQpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRQdWJsaWNWYWx1ZVJlZ2lvbigpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0KLQkJSVRleHRSZWdpb24gcHVibGljS2V5d29yZCA9IGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcik7Ci0KLQkJaWYgKHB1YmxpY0tleXdvcmQgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcXVvdGVkTGl0ZXJhbCA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXIpOwotCQkJaWYgKHF1b3RlZExpdGVyYWwgIT0gbnVsbCkgewotCQkJCXJldHVybiBxdW90ZWRMaXRlcmFsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3lzdGVtSUQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzeXN0ZW1JRC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlEKCkgewotCQlJVGV4dFJlZ2lvbiBzeXN0ZW1WYWx1ZSA9IGdldFN5c3RlbVZhbHVlUmVnaW9uKCk7Ci0JCWlmIChzeXN0ZW1WYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKHN5c3RlbVZhbHVlKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihSZWdpb25JdGVyYXRvciBpdGVyKSB7Ci0JCXJldHVybiBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLlNZU1RFTV9LRVlXT1JEKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0U3lzdGVtVmFsdWVSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCi0JCUlUZXh0UmVnaW9uIHN5c3RlbUtleXdvcmQgPSBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXIpOwotCQlpZiAoc3lzdGVtS2V5d29yZCAhPSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBxdW90ZWRMaXRlcmFsID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcik7Ci0JCQlpZiAocXVvdGVkTGl0ZXJhbCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHF1b3RlZExpdGVyYWw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB0cnkgYW5kIHNlZSBpZiB0aGVyZSBpcyBhIHNlY29uZCBxdW90ZWQgbGl0ZXJhbCBhZnRlciBhIHB1YmxpYwotCQkJLy8ga2V5d29yZAotCQkJaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQlJVGV4dFJlZ2lvbiBwdWJsaWNLZXl3b3JkID0gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyKTsKLQotCQkJaWYgKHB1YmxpY0tleXdvcmQgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHF1b3RlZExpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCQlpZiAocXVvdGVkTGl0ZXJhbCAhPSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCS8vIG5vdyBnZXQgdGhlIHNlY29uZCBxdW90ZWQgbGl0ZXJhbAotCQkJCQlxdW90ZWRMaXRlcmFsID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcik7Ci0JCQkJCWlmIChxdW90ZWRMaXRlcmFsICE9IG51bGwpIHsKLQkJCQkJCS8vIGdvdCBpdCEKLQkJCQkJCXJldHVybiBxdW90ZWRMaXRlcmFsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlLmVxdWFscyhEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCkgfHwgdHlwZS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKTsKLQkJCXJldHVybiB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBwdWJsaWNJRC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHB1YmxpY0lELgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lEKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2KSB7Ci0JCWlmICghdi5lcXVhbHMocHVibGljSUQpKSB7Ci0JCQlwdWJsaWNJRCA9IHY7Ci0JCQlJVGV4dFJlZ2lvbiBwdWJsaWNWYWx1ZSA9IGdldFB1YmxpY1ZhbHVlUmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbiBwdWJsaWNLZXl3b3JkID0gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKTsKLQkJCUlUZXh0UmVnaW9uIHN5c3RlbUtleXdvcmQgPSBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpOwotCQkJSVRleHRSZWdpb24gc3lzdGVtVmFsdWUgPSBnZXRTeXN0ZW1WYWx1ZVJlZ2lvbigpOwotCi0JCQlpZiAodi5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocHVibGljS2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCS8vIHRpbWUgdG8gZ2V0IHJpZCBvZiB0aGUgcHVibGljIGtleXdvcmQgYW5kIHZhbHVlCi0JCQkJCS8vIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIHN5c3RlbSBvbmUKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHVibGljS2V5d29yZCk7Ci0JCQkJCVN0cmluZyBuZXdTdHJpbmcgPSAiU1lTVEVNIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoc3lzdGVtVmFsdWUgPT0gbnVsbCkgewotCQkJCQkJbmV3U3RyaW5nICs9ICIgXCJcIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocHVibGljVmFsdWUpIC0gc3RhcnRPZmZzZXQsIG5ld1N0cmluZyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gaGVyZSB3ZXJlIHNldHRpbmcgYSBub24gZW1wdHkgdmFsdWUKLQkJCQlTdHJpbmcgcXVvdGVDaGFyID0gdi5pbmRleE9mKCJcIiIpID09IC0xID8gIlwiIiA6ICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlpZiAocHVibGljVmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHB1YmxpY1ZhbHVlKSwgcHVibGljVmFsdWUuZ2V0TGVuZ3RoKCksIHF1b3RlQ2hhciArIHB1YmxpY0lEICsgcXVvdGVDaGFyKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRpbWUgdG8gY3JlYXRlIHN0dWZmCi0JCQkJCWlmIChwdWJsaWNLZXl3b3JkICE9IG51bGwpIHsKLQkJCQkJCS8vIHRoZW4ganVzdCBwdXQgb3VyIG5ldyB2YWx1ZSBhZnRlciB0aGUga2V5d29yZAotCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocHVibGljS2V5d29yZCksIDAsICIgIiArIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyB3ZSBuZWVkIHRoZSBwdWJsaWMga2V5d29yZCBhcyB3ZWxsCi0JCQkJCQlpZiAoc3lzdGVtS2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChzeXN0ZW1LZXl3b3JkKSwgc3lzdGVtS2V5d29yZC5nZXRMZW5ndGgoKSwgIlBVQkxJQyAiICsgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbiksIDAsICIgUFVCTElDICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHB1YmxpY0lELgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gcHVibGljSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSUQoU3RyaW5nIHYpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FWFRfTk9ERV9QVUJMSUNfSURfQ0hHKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRQdWJsaWNJRCh0aGlzLCB2KTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3lzdGVtSUQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzeXN0ZW1JRC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JRChPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgdikgewotCQlpZiAoIXYuZXF1YWxzKHN5c3RlbUlEKSB8fCAoZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKSA9PSBudWxsICYmIGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSkgPT0gbnVsbCkpIHsKLQkJCXN5c3RlbUlEID0gdjsKLQkJCVN0cmluZyBxdW90ZUNoYXIgPSB2LmluZGV4T2YoIlwiIikgPT0gLTEgPyAiXCIiIDogIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJSVRleHRSZWdpb24gc3lzdGVtVmFsdWUgPSBnZXRTeXN0ZW1WYWx1ZVJlZ2lvbigpOwotCQkJaWYgKHN5c3RlbVZhbHVlICE9IG51bGwpIHsKLQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHN5c3RlbVZhbHVlKSwgc3lzdGVtVmFsdWUuZ2V0TGVuZ3RoKCksIHF1b3RlQ2hhciArIHN5c3RlbUlEICsgcXVvdGVDaGFyKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlUZXh0UmVnaW9uIHN5c3RlbUtleXdvcmQgPSBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpOwotCi0JCQkJLy8gdGltZSB0byBjcmVhdGUgc3R1ZmYKLQkJCQlpZiAoc3lzdGVtS2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCS8vIHRoZW4ganVzdCBwdXQgb3VyIG5ldyB2YWx1ZSBhZnRlciB0aGUga2V5d29yZAotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChzeXN0ZW1LZXl3b3JkKSwgMCwgIiAiICsgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHNlZSBpZiB3ZSBoYXZlIGEgcHVibGljIGtleXdvcmQKLQkJCQkJSVRleHRSZWdpb24gcHVibGljS2V5d29yZCA9IGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0JCQkJCWlmIChwdWJsaWNLZXl3b3JkID09IG51bGwpIHsKLQkJCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0KLQkJCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pLCAwLCAiIFNZU1RFTSAiICsgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHB1dCBpdCBhZnRlciB0aGUgcHVibGljIHZhbHVlIHJlZ2lvbgotCQkJCQkJSVRleHRSZWdpb24gcHVibGljVmFsdWVSZWdpb24gPSBnZXRQdWJsaWNWYWx1ZVJlZ2lvbigpOwotCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocHVibGljVmFsdWVSZWdpb24pLCAwLCAiICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzeXN0ZW1JRC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN5c3RlbUlELgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlEKFN0cmluZyB2KSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRVhUX05PREVfU1lTVEVNX0lEX0NIRyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0U3lzdGVtSUQodGhpcywgdik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU4ZjQ4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05hbWVkVG9wTGV2ZWxOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05hbWVkVG9wTGV2ZWxOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmN2Y1MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9OYW1lZFRvcExldmVsTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLy8gaW50ZXJmYWNlIGZvciBub2RlcyB0aGF0IGNhbiBleGlzdCBhdCB0aGUgdG9wIGxldmVsIGluIGEgZHRkZmlsZQotLy8gZWcuIGVudGl0eSwgbm90YXRpb24sIGVsZW1lbnQsIGNvbW1lbnQsIGF0dGxpc3QsIG9yIHVucmVjb2duaXplZCBzdHVmZiAoaWUKLS8vIDxqdW5rIGRrZmpkbD4KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYW1lZFRvcExldmVsTm9kZSBleHRlbmRzIFRvcExldmVsTm9kZSB7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWdTdGFydFR5cGU7Ci0KLQlwdWJsaWMgTmFtZWRUb3BMZXZlbE5vZGUoRFRERmlsZSBkdGRGaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBTdHJpbmcgdHlwZSkgewotCQlzdXBlcihkdGRGaWxlLCBmbGF0Tm9kZSk7Ci0JCXRhZ1N0YXJ0VHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKSB7Ci0JCS8vIG5hbWUgcmVnaW9uIGlzIGxvY2F0ZWQgYWZ0ZXIgdGhlIHdoaXRlc3BhY2UgKHdoaWNoIGlzIGFmdGVyCi0JCS8vIHRoZSBlbGVtZW50dGFnCi0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlnZXROZXh0UmVnaW9uKGl0ZXIsIHRhZ1N0YXJ0VHlwZSk7Ci0KLQkJaWYgKCFpdGVyLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJaWYgKCFyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoIWl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTkFNRSkpIHsKLQkJCXJldHVybiByZWdpb247Ci0JCX0KLQotCQkvLyB3ZSBub3JtYWxseSBzdG9wIGhlcmUsIGJ1dCBmb3IgZW50aXRpZXMsIHdlIGhhdmUgdG8gc2VlIGlmIHdlIGFyZQotCQkvLyBhdCBhICclJy4gaWYgc28sIHdlIHNraXAgdGhhdCBhbmQgZmluZCB0aGUgbmFtZSBhZnRlciB0aGUKLQkJLy8gd2hpdGVzcGFjZSBhZ2FpbgotCQlpZiAodGFnU3RhcnRUeXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcgJiYgcmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuUEVSQ0VOVCkgJiYgaXRlci5oYXNOZXh0KCkpIHsKLQkJCXJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCi0JCQlpZiAoIXJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCWlmICghaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTkFNRSkpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFN0YXJ0VGFnKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJcmV0dXJuIGdldE5leHRSZWdpb24oaXRlciwgdGFnU3RhcnRUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0V2hpdGVzcGFjZUFmdGVyTmFtZSgpIHsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCS8vIHNraXAgcGFzdCB0aGUgZWxlbWVudCB0YWcgcmVnaW9uCi0JCWdldE5leHRSZWdpb24oaXRlciwgdGFnU3RhcnRUeXBlKTsKLQkJYm9vbGVhbiBmb3VuZE5hbWUgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmICghZm91bmROYW1lICYmIG5hbWVSZWdpb24gIT0gbnVsbCAmJiByZWdpb24gPT0gbmFtZVJlZ2lvbikgewotCQkJCWZvdW5kTmFtZSA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSkgewotCQkJCS8vIHRoZXJlIGlzIG5vIG5hbWUgcmVnaW9uIG9yIHdlIGhhdmUgYWxyZWFkeSBwYXNzZWQgaXQKLQkJCQlpZiAobmFtZVJlZ2lvbiA9PSBudWxsIHx8IGZvdW5kTmFtZSkgewotCQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBuYW1lKSB7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCWlmIChuYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCXN1cGVyLnNldE5hbWUocmVxdWVzdG9yLCBuYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gZWxlbWVudFRhZ1JlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlciwgdGFnU3RhcnRUeXBlKTsKLQkJCWludCByZXBsYWNlTGVuZ3RoID0gMDsKLQkJCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSkgewotCQkJCQlpZiAocmVnaW9uLmdldExlbmd0aCgpID49IDIpIHsKLQkJCQkJCS8vIHRoZXJlIGFyZSAyIHNwYWNlcyBiZXR3ZWVuICdFTEVNRU5UJyBhbmQgdGhlCi0JCQkJCQkvLyBjb250ZW50Ci0JCQkJCQkvLyBDaGFuZ2UgcmVwbGFjZSBsZW5ndGggdG8gMSBzbyB0aGF0IHRoZSBuZXcgbmFtZSBhbmQKLQkJCQkJCS8vIHRoZSBjb250ZW50IGFyZSBzZXBhcmF0ZWQgYnkgYSBzaW5nbGUgc3BhY2UKLQkJCQkJCXJlcGxhY2VMZW5ndGggPSAxOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBiZWdpblJlY29yZGluZyhyZXF1ZXN0b3IsICJOYW1lIENoYW5nZSIpOwotCQkJU3RyaW5nIG5ld1RleHQgPSAiICIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChlbGVtZW50VGFnUmVnaW9uKSwgcmVwbGFjZUxlbmd0aCwgbmV3VGV4dCk7Ci0JCQkvLyBlbmRSZWNvcmRpbmcocmVxdWVzdG9yKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ob2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ob2RlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ1YTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTm9kZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLQotCi1wdWJsaWMgY2xhc3MgTm9kZUxpc3QgewotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0KLQlBcnJheUxpc3QgbGlzdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIFN0cmluZyBsaXN0VHlwZTsKLQotCXB1YmxpYyBOb2RlTGlzdChEVERGaWxlIGR0ZEZpbGUsIFN0cmluZyB0b2tlblR5cGUpIHsKLQkJbGlzdFR5cGUgPSB0b2tlblR5cGU7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9FTCk7Ci0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRykgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5GTERSX0VOVCk7Ci0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkZMRFJfTk9UKTsKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkZMRFJfQ09NTSk7Ci0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9BVFRMSVNUKTsKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9VTlJFQyk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaXN0VHlwZSgpIHsKLQkJcmV0dXJuIGxpc3RUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9OT0RFX0xJU1RfRUxFTUVOVFM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9OT0RFX0xJU1RfRU5USVRJRVM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX05PREVfTElTVF9OT1RBVElPTlM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKSB7Ci0JCQlyZXR1cm4gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9OT0RFX0xJU1RfQ09NTUVOVFM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRykgewotCQkJcmV0dXJuIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfTk9ERV9MSVNUX0FUVFJJQlVURVM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpIHsKLQkJCXJldHVybiBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX05PREVfTElTVF9PVEhFUjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0Tm9kZXMoKSB7Ci0JCWxpc3ROb2Rlcy5jbGVhcigpOwotCQlJdGVyYXRvciBpdGVyID0gZHRkRmlsZS5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHICYmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSkgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRyAmJiBub2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHICYmIG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlsaXN0Tm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHICYmIG5vZGUgaW5zdGFuY2VvZiBOb3RhdGlvbikgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUICYmIG5vZGUgaW5zdGFuY2VvZiBDb21tZW50KSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCAmJiBub2RlIGluc3RhbmNlb2YgVW5yZWNvZ25pemVkKSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdE5vZGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhYmQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgTm90YXRpb24gZXh0ZW5kcyBFeHRlcm5hbE5vZGUgewotCi0JcHVibGljIE5vdGF0aW9uKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuTk9UQVRJT05JQ09OKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwMDUzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBleHRlbmRzIE5hbWVkVG9wTGV2ZWxOb2RlIHsKLQotCi0KLQlwdWJsaWMgY2xhc3MgU3RhcnRFbmRQYWlyIHsKLQkJcHVibGljIGludCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0OwotCX0KLQotCXByaXZhdGUgRW50aXR5IGNhY2hlZEVudGl0eSA9IG51bGw7Ci0KLQlwdWJsaWMgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7Ci0JfQotCi0JcHVibGljIEVudGl0eSBnZXRFbnRpdHlPYmplY3QoKSB7Ci0JCWlmIChjYWNoZWRFbnRpdHkgIT0gbnVsbCAmJiAhY2FjaGVkRW50aXR5LmdldE5hbWUoKS5lcXVhbHMoZ2V0UmVmZXJlbmNlZEVudGl0eSgpKSkgewotCQkJLy8gaWYgd2UgaGF2ZSBhIGNhY2hlZCBlbnRpdHksIGJ1dCB0aGUgbmFtZSBkb2VzbnQgbWF0Y2gsCi0JCQkvLyBudWxsIGl0IG5vdywgc28gd2UgcGVyZm9ybSBhIGxvb2t1cAotCQkJY2FjaGVkRW50aXR5ID0gbnVsbDsKLQkJfQotCi0JCWlmIChjYWNoZWRFbnRpdHkgPT0gbnVsbCkgewotCQkJTGlzdCBub2RlcyA9IGdldERUREZpbGUoKS5nZXROb2RlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIG5vZGU7Ci0JCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBlbnRpdHkuZ2V0TmFtZSgpLmVxdWFscyhnZXRSZWZlcmVuY2VkRW50aXR5KCkpKSB7Ci0JCQkJCQljYWNoZWRFbnRpdHkgPSBlbnRpdHk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZEVudGl0eTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRU5USVRZUkVGRVJFTkNFSUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXROYW1lKCk7Ci0JCXJldHVybiBnZXROYW1lKCkuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KFN0YXJ0RW5kUGFpciBwYWlyKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBjb21tZW50U3RhcnRUYWcgPSBnZXRTdGFydFRhZyhpdGVyKTsKLQkJSVRleHRSZWdpb24gZW5kQ29tbWVudFRhZyA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOwotCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoY29tbWVudFN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCXBhaXIuc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoY29tbWVudFN0YXJ0VGFnKTsKLQkJfQotCQlpZiAoZW5kQ29tbWVudFRhZyAhPSBudWxsKSB7Ci0JCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChlbmRDb21tZW50VGFnKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCk7Ci0JCWludCBmbGF0Tm9kZVN0YXJ0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJU3RhcnRFbmRQYWlyIHBhaXIgPSBuZXcgU3RhcnRFbmRQYWlyKCk7Ci0JCWdldFN0YXJ0QW5kRW5kT2Zmc2V0Rm9yVGV4dChwYWlyKTsKLQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKHBhaXIuc3RhcnRPZmZzZXQgLSBmbGF0Tm9kZVN0YXJ0LCBwYWlyLmVuZE9mZnNldCAtIGZsYXROb2RlU3RhcnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRFbnRpdHkoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5hbWUpIHsKLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRMZW5ndGgoKSwgIiUiICsgbmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ0hHX0VOVElUWV9SRUYpOyAvLyROT04tTkxTLTEkCi0JCXNldFJlZmVyZW5jZWRFbnRpdHkodGhpcywgbmFtZSk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NPTU1FTlRfQ0hHKTsgLy8kTk9OLU5MUy0xJAotCQlTdGFydEVuZFBhaXIgcGFpciA9IG5ldyBTdGFydEVuZFBhaXIoKTsKLQkJZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KHBhaXIpOwotCQlyZXBsYWNlVGV4dCh0aGlzLCBwYWlyLnN0YXJ0T2Zmc2V0LCBwYWlyLmVuZE9mZnNldCAtIHBhaXIuc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1RvcExldmVsTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ub3BMZXZlbE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjMjdjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1RvcExldmVsTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vLyBpbnRlcmZhY2UgZm9yIG5vZGVzIHRoYXQgY2FuIGV4aXN0IGF0IHRoZSB0b3AgbGV2ZWwgaW4gYSBkdGRmaWxlCi0vLyBlZy4gZW50aXR5LCBub3RhdGlvbiwgZWxlbWVudCwgY29tbWVudCwgYXR0bGlzdCwgb3IgdW5yZWNvZ25pemVkIHN0dWZmIChpZQotLy8gPGp1bmsgZGtmamRsPgotcHVibGljIGFic3RyYWN0IGNsYXNzIFRvcExldmVsTm9kZSBleHRlbmRzIERURE5vZGUgewotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZmxhdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIFRvcExldmVsTm9kZShEVERGaWxlIGR0ZEZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZHRkRmlsZSwgZmxhdE5vZGUpOwotCQlmbGF0Tm9kZXMuYWRkKGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRXaGl0ZXNwYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlmbGF0Tm9kZXMuYWRkKG5vZGUpOwotCX0KLQotCS8vIHNwZWNpYWxpemUgdGhpcyBzbyB3ZSBkZWxldGUgdGhlIG9iamVjdHMgZmxhdCBub2RlIHJhbmdlCi0JLy8gQU5EIGFueSB3aGl0ZXNwYWNlCi0JcHVibGljIHZvaWQgZGVsZXRlKCkgewotCQliZWdpblJlY29yZGluZyhnZXREVERGaWxlKCksIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfVE9QX0xFVkVMX05PREVfREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGZsYXROb2Rlcy5nZXQoMCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBmbGF0Tm9kZXMuZ2V0KGZsYXROb2Rlcy5zaXplKCkgLSAxKTsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gZmlyc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZE9mZnNldCA9IGxhc3QuZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkJcmVwbGFjZVRleHQoZ2V0RFRERmlsZSgpLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQllbmRSZWNvcmRpbmcoZ2V0RFRERmlsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RW5kUmVnaW9uKCkgewotCQlpbnQgc2l6ZSA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCWlmIChzaXplID4gMCkgewotCQkJcmV0dXJuIGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoc2l6ZSAtIDEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIGluY2x1ZGVzIHdoYXQgZ2V0dGV4dCBnaXZlcyB1cyBwbHVzIGFueSB3aGl0ZXNwYWNlCi0JLy8gdHJhaWxpbmcgaXQKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBmbGF0Tm9kZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZOb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGl0ZXIubmV4dCgpOwotCQkJc2IuYXBwZW5kKGZOb2RlLmdldFRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFN0YXJ0UmVnaW9uKCkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA+IDApIHsKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBSZWdpb25JdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUgcmVnaW9uIGl0ZXIgIiArIHRoaXMuZ2V0Q2xhc3MoKSArICIgd2l0aAotCQkvLyBzdGFydCAsIGVuZCA9ICIgKyBnZXRTdGFydE9mZnNldCgpICsgIiwgIiArZ2V0RW5kT2Zmc2V0KCkpOwotCQlyZXR1cm4gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCBnZXRTdGFydE9mZnNldCgpLCBnZXRFbmRPZmZzZXQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9VbnJlY29nbml6ZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvVW5yZWNvZ25pemVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMzQ4YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9VbnJlY29nbml6ZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgVW5yZWNvZ25pemVkIGV4dGVuZHMgVG9wTGV2ZWxOb2RlIHsKLQotCXB1YmxpYyBVbnJlY29nbml6ZWQoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuVU5SRUNPR05JWkVESUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKTsKLQkJaWYgKHRleHQubGVuZ3RoKCkgPD0gMzApIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIDI5KSArICIuLi4iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudC9Db250ZW50RGVzY3JpYmVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnQvQ29udGVudERlc2NyaWJlckZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGYxMTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudC9Db250ZW50RGVzY3JpYmVyRm9yRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9yRFREIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVH07Ci0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQkvLyBjdXJyZW50bHkgbm8gc3BlY2lmaWMgY2hlY2sgZm9yIHZhbGlkaWx0eQotCQkvLyBiYXNlZCBvbiBjb250ZW50cy4KLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVZhbGlkaXR5KFJlYWRlciByZWFkZXIpIHsKLQkJLy8gY3VycmVudGx5IG5vIHNwZWNpZmljIGNoZWNrIGZvciB2YWxpZGlsdHkKLQkJLy8gYmFzZWQgb24gY29udGVudHMuCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCS8vIHNhbWUgcnVsZXMgYXMgZm9yIFhNTAotCXByaXZhdGUgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGdldERldGVjdG9yKCkgewotCQkJcmV0dXJuIG5ldyBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGV0ZWN0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGU6IGlmIHdlJ3JlIGFza2VkIGZvciBvbmUsIHdlIHNldCB0aGVtIGFsbC4gSSBuZWVkIHRvIGJlIHN1cmUgaWYKLQkJLy8gY2FsbGVkCi0JCS8vIG11bGl0aXBsZSB0aW1lcyAob25lIGZvciBlYWNoLCBzYXkpIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgdGltZQotCQkvLyBwcm9jZXNzaW5nIHNhbWUKLQkJLy8gY29udGVudCBhZ2Fpbi4KLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9ICgoWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vIFRPRE86IEkgbmVlZCB0byB2ZXJpZnkgdG8gc2VlIGlmIHRoaXMgQk9NIHdvcmsgaXMgYWx3YXlzIGRvbmUKLQkJLy8gYnkgdGV4dCB0eXBlLgotCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJaWYgKGRldGVjdGVkQnl0ZU9yZGVyTWFyayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdCeXRlT3JkZXJNYXJrID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsIG1heQotCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJaWYgKCFkZXRlY3RlZEJ5dGVPcmRlck1hcmsuZXF1YWxzKGV4aXN0aW5nQnl0ZU9yZGVyTWFyaykpCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIGRldGVjdGVkQnl0ZU9yZGVyTWFyayk7Ci0JCX0KLQotCi0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSkgewotCQkJLy8gbm90ZTogYWZ0ZXIgc2V0dGluZyBoZXJlLCBpdHMgdGhlIG1lcmUgcHJlc2VuY2Ugb2YKLQkJCS8vIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUCi0JCQkvLyBpbiB0aGUgcmVzb3VyY2UncyBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZgotCQkJLy8gaW52YWxpZAotCQkJLy8gaW4gdGhvc2UgY2FzZXMsIHRoZSAiZGV0ZWN0ZWQiIHByb3BlcnR5IGNvbnRhaW5zIGFuCi0JCQkvLyAiYXBwcm9wcmlhdGUgZGVmYXVsdCIgdG8gdXNlLgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIGVuY29kaW5nTWVtZW50by5nZXRJbnZhbGlkRW5jb2RpbmcoKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgZW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpKTsKLQkJfQotCi0JCU9iamVjdCBkZXRlY3RlZENoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQlPYmplY3QgamF2YUNoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0KLQkJLy8gd2UgYWx3YXlzIGluY2x1ZGUgZGV0ZWN0ZWQsIGlmIGl0cyBkaWZmZXJlbnQgdGhhbiBqYXZhCi0JCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCi0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdDaGFyc2V0ID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKTsKLQkJCWlmIChqYXZhQ2hhcnNldC5lcXVhbHMoZXhpc3RpbmdDaGFyc2V0KSkgewotCQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2UgbWF5IG5lZWQgdG8gYWRkIHdoYXQgd2UgZm91bmQsIGJ1dCBvbmx5IG5lZWQgdG8gYWRkCi0JCQkJLy8gaWYgZGlmZmVyZW50IGZyb20gZGVmYXVsdC50aGUKLQkJCQlPYmplY3QgZGVmYXVsdENoYXJzZXQgPSBnZXREZXRlY3RvcigpLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQlpZiAoIWRlZmF1bHRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cyBuZWVkIHRvCi0JCQkJCS8vIGFkZCwgSSdtIGFzc3VtaW5nCi0JCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgT2JqZWN0IGRldGVjdGVkQ2hhcnNldCwgT2JqZWN0IGphdmFDaGFyc2V0KSB7Ci0JCS8vIHNpbmNlIGVxdWFsLCB3ZSBkb24ndCBuZWVkIHRvIGFkZCwgYnV0IGlmIG91ciBkZXRlY3RlZCB2ZXJzaW9uIGlzCi0JCS8vIGRpZmZlcmVudCB0aGFuCi0JCS8vIGphdmFDaGFyc2V0LCB0aGVuIHdlIHNob3VsZCBhZGQgaXQuIFRoaXMgd2lsbCBoYXBwZW4sIGZvciBleGFtcGxlLAotCQkvLyBpZiB0aGVyZSdzCi0JCS8vIGRpZmZlcmVuY2VzIGluIGNhc2UsIG9yIGRpZmZlcmVuY2VzIGR1ZSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzCi0JCWlmIChkZXRlY3RlZENoYXJzZXQgIT0gbnVsbCkgewotCQkJLy8gaWYgKCFkZXRlY3RlZENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJLy8gZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsCi0JCQkvLyBkZXRlY3RlZENoYXJzZXQpOwotCQkJLy8gfQotCi0JCQkvLyBPbmNlIHdlIGRldGVjdGVkIGEgY2hhcnNldCwgd2Ugc2hvdWxkIHNldCB0aGUgcHJvcGVydHkgZXZlbgotCQkJLy8gdGhvdWdoIGl0J3MgdGhlIHNhbWUgYXMgamF2YUNoYXJzZXQKLQkJCS8vIGJlY2F1c2UgdGhlcmUgYXJlIGNsaWVudHMgdGhhdCByZWx5IG9uIHRoaXMgcHJvcGVydHkgdG8KLQkJCS8vIGRldGVybWluZSBpZiB0aGUgY2hhcnNldCBpcyBhY3R1YWxseSBkZXRlY3RlZCBpbiBmaWxlIG9yIG5vdC4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBkZXRlY3RlZENoYXJzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9EVERNb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRFRETW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzMyOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9EVERNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50LklEVERGaWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50Lk5vZGVzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LkRURE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRURFJlZmVyZW5jZVVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuTGFiZWxWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0U3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERNb2RlbEltcGwgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciwgRFRETW9kZWwgewotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJLy8gY3JlYXRlIHRoZSB0ZW1wIEZpbGUgb2JqZWN0Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQlyZXN1bHQgPSBmaWxlLmRlbGV0ZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgRFRERmlsZSBkb2N1bWVudDsKLQotCS8vIHByaXZhdGUgTGlzdCBlcnJvck1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gZW50aXR5IHJlZmVyZW5jZSBuYW1lcyBmb3VuZCBpbiB0aGUgY29uZGl0aW9uYWwgSUdOT1JFIHNlY3Rpb25zCi0JcHJpdmF0ZSBWZWN0b3IgaWdub3JlZEVudGl0eVJlZnM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaFJlcXVpcmVkID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgRFREUmVmZXJlbmNlVXBkYXRlciByZWZVcGRhdGVyID0gbmV3IERURFJlZmVyZW5jZVVwZGF0ZXIoKTsKLQotCXB1YmxpYyBEVERNb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWRvY3VtZW50ID0gbmV3IERUREZpbGUodGhpcyk7Ci0JCWRvY3VtZW50LmFkZERUREZpbGVMaXN0ZW5lcihuZXcgSURUREZpbGVMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgbm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKSB7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIG5vZGU7Ci0JCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBlbnRpdHkuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkJCQkvLyBqdXN0IHNheSB0aGV5IGhhdmUgY2hhbmdlZCBmb3Igbm93Ci0JCQkJCQlzZXRSZWZlcmVuY2VkTW9kZWxzQ2hhbmdlZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBub2Rlc0FkZGVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJCQljaGVja0lmRXh0ZXJuYWxSZWZlcmVuY2VzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vZGVzUmVtb3ZlZChOb2Rlc0V2ZW50IGV2ZW50KSB7Ci0JCQkJY2hlY2tJZkV4dGVybmFsUmVmZXJlbmNlc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIuYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCk7Ci0JCS8vIGNsZWFyIHJlZmVyZW5jZSB1cGRhdGVyIGNhY2hlCi0JCWdldFJlZmVyZW5jZVVwZGF0ZXIoKS5jbGVhckNhY2hlKCk7Ci0JfQotCi0Jdm9pZCBjaGVja0lmRXh0ZXJuYWxSZWZlcmVuY2VzQ2hhbmdlZChOb2Rlc0V2ZW50IGV2ZW50KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBldmVudC5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgbm9kZTsKLQkJCQlpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkgJiYgZW50aXR5LmlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJCQkvLyBqdXN0IHNheSB0aGV5IGhhdmUgY2hhbmdlZCBmb3Igbm93Ci0JCQkJCXNldFJlZmVyZW5jZWRNb2RlbHNDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8KLQkvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGhlbHBzIGRldGVybWluZSB0aGUgbGlzdCBvZiB0aGluZ3MgdGhhdAotCS8vIGNhbiBiZSB1c2VkIGluIGEgcGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2UgY29udGVudAotCS8vIE9wdGlvbmFsIHBhcmFtZXRlciBpcyB0byBhbGxvdyB0aGUgY3VycmVudGx5IHVzZWQgRFRERW50aXR5IHRvCi0JLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGNvbWJvYm94LgotCS8vCi0JcHVibGljIExhYmVsVmFsdWVQYWlyW10gY3JlYXRlUGFybUVudGl0eUNvbnRlbnRJdGVtcyhFbnRpdHkgZW50aXR5KSB7Ci0JCU5vZGVMaXN0IGVudGl0aWVzID0gZ2V0RFRERmlsZSgpLmdldEVudGl0aWVzKCk7Ci0KLQkJVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotCi0JCWlmIChlbnRpdHkgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSAiJSIgKyBlbnRpdHkuZ2V0TmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWl0ZW1zLmFkZEVsZW1lbnQobmV3IExhYmVsVmFsdWVQYWlyKG5hbWUsIG5hbWUpKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaSA9IGVudGl0aWVzLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlFbnRpdHkgZW50aXR5QXQgPSAoRW50aXR5KSBpLm5leHQoKTsKLQkJCWlmIChlbnRpdHlBdC5pc1BhcmFtZXRlckVudGl0eSgpICYmIGVudGl0eUF0LmlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJCVN0cmluZyBuYW1lID0gIiUiICsgZW50aXR5QXQuZ2V0TmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpdGVtcy5hZGRFbGVtZW50KG5ldyBMYWJlbFZhbHVlUGFpcihuYW1lLCBuYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJTGFiZWxWYWx1ZVBhaXJbXSBjb21ib0FycmF5ID0gbmV3IExhYmVsVmFsdWVQYWlyW2l0ZW1zLnNpemUoKV07Ci0JCWl0ZW1zLmNvcHlJbnRvKGNvbWJvQXJyYXkpOwotCQlyZXR1cm4gY29tYm9BcnJheTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCQlzdXBlci5lbmRSZWNvcmRpbmcocmVxdWVzdGVyKTsKLQkJLy8gY2xlYXIgcmVmZXJlbmNlIHVwZGF0ZXIgY2FjaGUKLQkJZ2V0UmVmZXJlbmNlVXBkYXRlcigpLmNsZWFyQ2FjaGUoKTsKLQl9Ci0KLQotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvLyBSZXR1cm5zIGVudGl0eSByZWZlcmVuY2UgbmFtZXMgdGhhdCBhcmUgaW4KLQkvLyB0aGUgY29uZGl0aW9uYWwgSUdOT1JFIHNlY3Rpb25zLgotCXB1YmxpYyBWZWN0b3IgZ2V0SWdub3JlZEVudGl0eVJlZnMoKSB7Ci0JCWlmIChpZ25vcmVkRW50aXR5UmVmcyA9PSBudWxsKQotCQkJaWdub3JlZEVudGl0eVJlZnMgPSBuZXcgVmVjdG9yKCk7Ci0JCXJldHVybiBpZ25vcmVkRW50aXR5UmVmczsKLQl9Ci0KLQlwdWJsaWMgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpIHsKLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldE5vZGUgYXQgIiArIG9mZnNldCArICIgcmV0dXJuaW5nID0gIiArCi0JCS8vIHRoaXMuZG9jdW1lbnQuZ2V0Tm9kZUF0KG9mZnNldCkpOwotCi0JCXJldHVybiB0aGlzLmRvY3VtZW50LmdldE5vZGVBdChvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBEVERSZWZlcmVuY2VVcGRhdGVyIGdldFJlZmVyZW5jZVVwZGF0ZXIoKSB7Ci0JCXJldHVybiByZWZVcGRhdGVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlZE1vZGVsc0NoYW5nZWQoKSB7Ci0JCXJldHVybiByZWZyZXNoUmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZyZXNoUmVxdWlyZWQoKSB7Ci0JCXJldHVybiByZWZyZXNoUmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBmbGF0TW9kZWxFdmVudCkgewotCQlkb2N1bWVudC5uZXdNb2RlbChmbGF0TW9kZWxFdmVudCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXG5uZXdtb2RlbCIpOwotCQlvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZmxhdE1vZGVsRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcbm5vY2hhbmdlIik7Ci0JCW91dHB1dFN0cnVjdHVyZWREb2N1bWVudChmbGF0TW9kZWxFdmVudCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXG5ub2Rlc3JlcGxhY2VkIik7Ci0JCWRvY3VtZW50Lm5vZGVzUmVwbGFjZWQoZmxhdE1vZGVsRXZlbnQpOwotCQlvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZmxhdE1vZGVsRXZlbnQpOwotCi0JfQotCi0JcHVibGljIHZvaWQgb3V0cHV0U3RydWN0dXJlZERvY3VtZW50KFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50IHNvdXJjZSA9ICciICsKLQkJLy8gZmxhdE1vZGVsRXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0VGV4dCgpICsgIiciKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJuZXcgU3RyaW5nID0gJyIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRPcmlnaW5hbENoYW5nZXMoKSArIiciKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJkZWxldGVkIFN0cmluZyA9ICciICsKLQkJLy8gZmxhdE1vZGVsRXZlbnQuZ2V0RGVsZXRlZFRleHQoKSArIiciKTsKLQkJLy8gRW51bWVyYXRpb24gZSA9Ci0JCS8vIGZsYXRNb2RlbEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldE5vZGVzKCkuZWxlbWVudHMoKTsKLQkJLy8gaW50IGkgPSAwOwotCQkvLyBmb3IgKDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotCQkvLyB7Ci0JCS8vIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPQotCQkvLyAoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJLy8gb3V0cHV0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5vZGUpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiAiICsgaSArIi4gIiArIG5vZGUuaGFzaENvZGUoKSArICIgJyIKLQkJLy8gK25vZGUuZ2V0VGV4dCgpICsgIiciKTsKLQkJLy8gfQotCX0KLQotCXB1YmxpYyB2b2lkIG91dHB1dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCS8vIGludCBzaXplID0gZmxhdE5vZGUuZ2V0TnVtYmVyT2ZSZWdpb25zKCk7Ci0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkvLyB7Ci0JCS8vIFJlZ2lvbiByZWdpb24gPSAoUmVnaW9uKSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oaSArICIuICIgKyByZWdpb24uZ2V0VHlwZSgpKTsKLQotCQkvLyB9IC8vIGVuZCBvZiBmb3IgKCkKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXG5yZWdpb24gY2hhbmdlZCIpOwotCQlkb2N1bWVudC5yZWdpb25DaGFuZ2VkKGZsYXRNb2RlbEV2ZW50KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCI9ICIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlZ2lvbiBjaGFuZ2VkICIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRSZWdpb24oKS5oYXNoQ29kZSgpICsgIiA9ICIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRSZWdpb24oKSk7Ci0KLQkJb3V0cHV0U3RydWN0dXJlZERvY3VtZW50KGZsYXRNb2RlbEV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcbnJlZ2lvbiByZXBsYWNlZCIpOwotCQlkb2N1bWVudC5yZWdpb25zUmVwbGFjZWQoZmxhdE1vZGVsRXZlbnQpOwotCQlvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZmxhdE1vZGVsRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRNb2RlbHNDaGFuZ2VkKCkgewotCQlyZWZyZXNoUmVxdWlyZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hSZXF1aXJlZChib29sZWFuIHZhbHVlKSB7Ci0JCXJlZnJlc2hSZXF1aXJlZCA9IHZhbHVlOwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1N0cnVjdHVyZWREb2N1bWVudAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IG9sZFN0cnVjdHVyZWREb2N1bWVudCA9IHN1cGVyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXJldHVybjsgLy8gbm90aW5nIHRvIGRvCi0KLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKQotCQkJb2xkU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQluZXdNb2RlbChuZXcgTmV3RG9jdW1lbnRFdmVudChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQsIHRoaXMpKTsKLQkJCX0KLQkJCW5ld1N0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzQ5NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0KLQlwcm90ZWN0ZWQgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCi0JcHJvdGVjdGVkIFJlYWRlciBmUmVhZGVyOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgaWYgaW52YWxpZCBjaGFyc2V0IG5hbWUgKGluIHdoaWNoIGNhc2UKLQkgKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiBzaG91bGQgYmUgdXNlZCwgaWYgYSBuYW1lIGlzIHJlYWxseSBuZWVkIGZvciBzb21lCi0JICogInNhdmUgYW55d2F5IiBjYXNlcykuCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gMS4gQ2hlY2sgZXhwbGljaXQgbWFwcGluZyBvdmVycmlkZXMgZnJvbQotCQkvLyBwcm9wZXJ0eSBmaWxlIC0tIGl0cyBoZXJlIHdlIHBpY2sgdXAgInJ1bGVzIiBmb3IgY2FzZXMKLQkJLy8gdGhhdCBhcmUgbm90IGV2ZW4gaW4gSmF2YQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gMi4gVXNlIHRoZSAiY2Fub25pY2FsIiBuYW1lIGZyb20gSlJFIG1hcHBpbmdzCi0JCS8vIE5vdGU6IHNlZSBDaGFyc2V0IEphdmFEb2MsIHRoZSBuYW1lIHlvdSBnZXQgb25lCi0JCS8vIHdpdGggY2FuIGJlIGFsaWFzLAotCQkvLyB0aGUgbmFtZSB5b3UgZ2V0IGJhY2sgaXMgInN0YW5kYXJkIiBuYW1lLgotCQlDaGFyc2V0IGphdmFDaGFyc2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBnaXZlIHByaW9yaXR5IHRvIGphdmEgY29ub25pY2FsIG5hbWUsIGlmIHByZXNlbnQKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0Lm5hbWUoKTsKLQkJCS8vIGJ1dCBzdGlsbCBhbGxvdyBvdmVycmlkZXMKLQkJCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEVuY29kaW5nTWVtZW50bygpLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQl9Ci0KLQkvLyB0byBlbnN1cmUgY29uc2lzdCBvdmVyYWxsIHJ1bGVzIHVzZWQsIHdlJ2xsIG1hcmsgYXMKLQkvLyBmaW5hbCwKLQkvLyBhbmQgcmVxdWlyZSBzdWJjbGFzc2VzIHRvIHByb3ZpZGUgY2VydGFpbiBwaWVjZXMgb2YKLQkvLyB0aGUKLQkvLyBpbXBsZW1lbnRhdGlvbgotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbgotCQkJLy8gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nCi0JCQkvLyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJCS8vIE5vdGU6IHRoZXJlIGlzIGEgImhpZGRlbiBhc3N1bXB0aW9uIiBoZXJlCi0JCQkvLyB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzCi0JCQkvLyBub3QgcHJlc2VudC4KLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQloYW5kbGVTcGVjRGVmYXVsdCgpOwotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCS8vIHNhZnR5IG5ldAotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBOdWxsTWVtZW50bygpOwotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdG8gcmV0dXJuIGEgZGVmYXVsdCBlbmNvZGluZyAtLSBhcyBzcGVjaWZpZWQgYnkgYW4gaW5kdXN0cnkKLQkgKiBjb250ZW50IHR5cGUgc3BlYyAtLSB3aGVuIG5vdCBwcmVzZW50IGluIHRoZSBzdHJlYW0sIGZvciBleGFtcGxlLCBYTUwKLQkgKiBzcGVjaWZpZXMgVVRGLTgsIEpTUCBzcGVjaWZpZXMgSVNPLTg4NTktMS4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybgotCSAqIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCAic3BlYyBkZWZhdWx0Ii4KLQkgKi8KLQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZW5jID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmMpOwotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTcGVjRGVmYXVsdCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nTmFtZTsKLQkJZW5jb2RpbmdOYW1lID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jb2RpbmdOYW1lICE9IG51bGwpIHsKLQkJCS8vIGNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmNvZGluZ05hbWUsCi0JCQkvLyBFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZW5jb2RpbmdOYW1lKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuY29kaW5nTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBzdWJjbGFzcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gcGFyc2UgdGhlIGlucHV0LiBUaGlzIG1ldGhvZCBoYXMKLQkgKiBzZXZlcmFsIGNyaXRpY2FsIHJlc3BvbnNpYmlsaXRpZXM6Ci0JICogPGxpPnNldCB0aGUgZkVuY29kaW5nTWVtZW50byBmaWVsZCBhcHByb3ByaWF0ZWx5LCBhY2NvcmRpbmcgdG8gdGhlCi0JICogcmVzdWx0cyBvZiB0aGUgcGFyc2Ugb2YgZlJlYWRlci48L2xpPgotCSAqIDxsaT5zZXQgZkhhcmRlclBhcnNlZCB0byB0cnVlLCB0byBhdm9pZCB3YXN0ZWQgcmUtcGFyc2luZy48L2xpPgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7Ci0JCWZSZWFkZXIgPSBudWxsOwotCQlmSGVhZGVyUGFyc2VkID0gZmFsc2U7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlcgotCQkJLy8gc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YzliZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gImFkYXB0ZXIiIGNsYXNzLCBzaW1wbHkgdG8gZ2V0IGluIGlucHV0IHN0cmVhbSB0byBhY3QgbGlrZSBhCi0gKiByZWFkZXIuIFdlIGNvdWxkIG5vdCB1c2UgSW5wdXRTdHJlYW1SZWFkZXIgZGlyZWN0bHkgYmVjYXVzZSBpdHMgaW50ZXJuYWwKLSAqIGJ1ZmZlcnMgYXJlIG5vdCBjb250cm9sbGFibGUsIGFuZCBpdCBzb21ldGltZXMgcHVsbHMgdG9vIG11Y2ggb3V0IG9mIGlucHV0Ci0gKiBzdHJlYW0gKGV2ZW4gd2hlbiBpdCB3YXNuJ3QgbmVlZGVkIGZvciBvdXIgcHVycG9zZXMpLgotICogCi0gKiBUaGUgdXNlIG9mIHRoaXMgY2xhc3MgaXMgaGlnaGx5IHNwZWNpYWxpemVkIGFuZCBieSBub3QgbWVhbnMgbWVhbnQgdG8gYmUKLSAqIGdlbmVyYWwgcHVycG9zZS4gSXRzIHVzZSBpcyByZXN0cmljdGVkIHRvIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBpbnB1dAotICogc3RyZWFtIGNhbiBiZSByZWdhcmRlZCBhcyBhc2NpaSBqdXN0IGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB3aGF0IHRoZSByZWFsCi0gKiBlbmNvZGluZyBzaG91bGQgYmUuCi0gKi8KLQotcHVibGljIGNsYXNzIEJ5dGVSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IENvZGVkSU8uTUFYX0JVRl9TSVpFOwotCi0JcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOwotCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKLQotCXByb3RlY3RlZCBCeXRlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRoaXMoaW5wdXRTdHJlYW0sIERFRkFVTFRfQlVGRkVSX1NJWkUpOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBzaXplKSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5mQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ubWFyayhyZWFkQWhlYWRMaW1pdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGIwID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCgpOwotCQlyZXR1cm4gKGIwICYgMHgwMEZGKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjaFtdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobGVuZ3RoID4gdGhpcy5mQnVmZmVyLmxlbmd0aCkgewotCQkJbGVuZ3RoID0gdGhpcy5mQnVmZmVyLmxlbmd0aDsKLQkJfQotCi0JCWludCBjb3VudCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQodGhpcy5mQnVmZmVyLCAwLCBsZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGIwID0gdGhpcy5mQnVmZmVyW2ldOwotCQkJLy8gdGhlIDB4MDBGRiBpcyB0byAibG9zZSIgdGhlIG5lZ2F0aXZlIGJpdHMgZmlsbGVkIGluIHRoZSBieXRlIHRvCi0JCQkvLyBpbnQgY29udmVyc2lvbgotCQkJLy8gKGFuZCB3aGljaCB3b3VsZCBiZSB0aGVyZSBpZiBjYXN0IGRpcmVjdGx5IGZyb20gYnl0ZSB0byBjaGFyKS4KLQkJCWNoYXIgYzAgPSAoY2hhcikgKGIwICYgMHgwMEZGKTsKLQkJCWNoW29mZnNldCArIGldID0gYzA7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLnJlc2V0KCk7Ci0JfQotCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5za2lwKG4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9EVEREb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9EVEREb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTJiNWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gMjgtQXVnLTAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLQotCi0vKioKLSAqIEBhdXRob3Iga2JvbwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlEb2N1bWVudENoYXJzZXREZXRlY3RvciBkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPSBuZXcgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKTsKLQkJZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yLnNldChmUmVhZGVyKTsKLQkJZkVuY29kaW5nTWVtZW50byA9ICgoWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKWRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXNldChuZXcgRG9jdW1lbnRSZWFkZXIoZG9jdW1lbnQsIDApKTsKLQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OGYwOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9EVEREb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIERURERvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0KLQlwdWJsaWMgRFRERG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJaWYgKGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBEVEREb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IERURFJlZ2lvblBhcnNlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZGVsaW1pdGVyID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURCk7Ci0JCWlmIChkZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWRlbGltaXRlciA9IHN1cGVyLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoZmlsZSk7Ci0JCXJldHVybiBkZWxpbWl0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQlEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciByZVBhcnNlciA9IG5ldyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCQlyZVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZG9jdW1lbnQpOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLnNldFJlUGFyc2VyKHJlUGFyc2VyKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL051bGxNZW1lbnRvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL051bGxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNjAzNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9OdWxsTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLk5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXM7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYW4gRW5jb2RpbmdNZW1lbnRvIChpdHMgc3VwZXIgY2xhc3MpLAotICogd2hlbiB0aGVyZSBpcyBub3QgaW4gZmFjdCBBTlkgZW5jb2RpbmcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB3aGVuIGEKLSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBjcmVhdGVkIGRpcmVjdGx5IGZyb20gYSBTdHJpbmcKLSAqLwotcHVibGljIGNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTnVsbE1lbWVudG8oKSB7Ci0JCXN1cGVyKCk7Ci0JCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJc2V0SmF2YUNoYXJzZXROYW1lKGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2V2ZW50L0lEVERGaWxlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvSURUREZpbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDkwOTY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvSURUREZpbGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElEVERGaWxlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgbm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKTsKLQotCXB1YmxpYyB2b2lkIG5vZGVzQWRkZWQoTm9kZXNFdmVudCBldmVudCk7Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlbW92ZWQoTm9kZXNFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2V2ZW50L05vZGVzRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvTm9kZXNFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzk3MmMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvTm9kZXNFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgTm9kZXNFdmVudCB7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgY2hhbmdlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIHZvaWQgYWRkKERURE5vZGUgY2hhbmdlZE5vZGUpIHsKLQkJY2hhbmdlZE5vZGVzLmFkZChjaGFuZ2VkTm9kZSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Tm9kZXMoKSB7Ci0JCXJldHVybiBjaGFuZ2VkTm9kZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9EVERNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRFRETW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1MWFjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9EVERNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5EVEREb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRETW9kZWxMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsTG9hZGVyIHsKLQlwdWJsaWMgRFRETW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG5ldyBEVEREb2N1bWVudExvYWRlcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRFRETW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG5ldyBEVERNb2RlbEltcGwoKTsKLQkJLy8gbm93IGRvbmUgaW4gY3JlYXRlCi0JCS8vIG1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCS8vIG1vZGVsLnNldEZhY3RvcnlSZWdpc3RyeShkZWZhdWx0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQlyZXR1cm4gbW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwZTEwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nLkRURERvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5EVEREb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNb2RlbEhhbmRsZXJGb3JEVEQgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBBc3NvY2lhdGVkQ29udGVudFR5cGVJZCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckRURCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJZCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBEVEREb2N1bWVudExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBEVEREb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgRFRETW9kZWxMb2FkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M5Y2I4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIERURFJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgSVRleHRSZWdpb24gY3JlYXRlUmVnaW9uKFN0cmluZyB0b2tlbktpbmQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpZiAodG9rZW5LaW5kICE9IG51bGwpIHsKLQkJCS8vIElTU1VFOiBEVEQgcmVnaW9ucyBkb24ndCBkaXN0aW5ndWlzaCB0ZXh0IGZyb20gd2hpdGUgc3BhY2UKLQkJCXJlZ2lvbiA9IG5ldyBDb250ZXh0UmVnaW9uKHRva2VuS2luZCwgc3RhcnQsIGxlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJlNmYxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXIuRFREVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXIuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIERURFJlZ2lvblBhcnNlciBpbXBsZW1lbnRzIFJlZ2lvblBhcnNlciB7Ci0JcHJpdmF0ZSBWZWN0b3IgY2FjaGVkUmVnaW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBEVERUb2tlbml6ZXIgdG9rZW5pemVyID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY2FjaGVkTm9kZSA9IG51bGw7IC8vIHRvcCBvZiBub2RlCi0JCQkJCQkJCQkJCQkJCQkvLyBjaGFpbgotCi0JcHVibGljIFJlZ2lvblBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBEVERSZWdpb25QYXJzZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYWRkTmV3Tm9kZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSwgVmVjdG9yIHJlZ2lvbnMpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsZWFkaW5nU3BhY2VOb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50Tm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdHJhaWxpbmdTcGFjZU5vZGUgPSBudWxsOwotCQlMaW5rZWRMaXN0IG5vZGVTZWVkcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWludCBuUmVnaW9ucyA9IHJlZ2lvbnMuc2l6ZSgpOwotCQlpbnQgbGVhZGluZ1NwYWNlRW5kID0gLTE7Ci0JCWludCB0cmFpbGluZ1NwYWNlQmVnaW4gPSBuUmVnaW9uczsKLQotCQkvLyBmaW5kIGxlYWRpbmcgc3BhY2UKLQkJbm9kZVNlZWRzLmNsZWFyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgblJlZ2lvbnM7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLmdldChpKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChpc0JsYW5rUmVnaW9uKHR5cGUpKSB7Ci0JCQkJbGVhZGluZ1NwYWNlRW5kID0gaTsKLQkJCQlub2RlU2VlZHMuYWRkTGFzdChyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFub2RlU2VlZHMuaXNFbXB0eSgpKSB7Ci0JCQlsZWFkaW5nU3BhY2VOb2RlID0gY3JlYXRlTm9kZShub2RlU2VlZHMpOwotCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQlsYXN0Tm9kZS5zZXROZXh0KGxlYWRpbmdTcGFjZU5vZGUpOwotCQkJCWxlYWRpbmdTcGFjZU5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJfQotCQkJbGFzdE5vZGUgPSBsZWFkaW5nU3BhY2VOb2RlOwotCQl9Ci0KLQkJLy8gZmluZCB0cmFpbGluZyBzcGFjZQotCQlpZiAobGVhZGluZ1NwYWNlRW5kIDwgblJlZ2lvbnMgLSAxKSB7Ci0JCQlub2RlU2VlZHMuY2xlYXIoKTsKLQkJCWZvciAoaW50IGkgPSBuUmVnaW9ucyAtIDE7IDAgPD0gaTsgaS0tKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLmdldChpKTsKLQkJCQlTdHJpbmcgdHlwZSA9ICgoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0KGkpKS5nZXRUeXBlKCk7Ci0JCQkJaWYgKGlzQmxhbmtSZWdpb24odHlwZSkpIHsKLQkJCQkJdHJhaWxpbmdTcGFjZUJlZ2luID0gaTsKLQkJCQkJbm9kZVNlZWRzLmFkZEZpcnN0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkpIHsKLQkJCQl0cmFpbGluZ1NwYWNlTm9kZSA9IGNyZWF0ZU5vZGUobm9kZVNlZWRzKTsKLQkJCX0KLQotCQkJbm9kZVNlZWRzLmNsZWFyKCk7Ci0JCQlmb3IgKGludCBpID0gbGVhZGluZ1NwYWNlRW5kICsgMTsgaSA8IHRyYWlsaW5nU3BhY2VCZWdpbjsgaSsrKSB7Ci0JCQkJbm9kZVNlZWRzLmFkZExhc3QocmVnaW9ucy5nZXQoaSkpOwotCQkJfQotCQkJaWYgKCFub2RlU2VlZHMuaXNFbXB0eSgpKSB7Ci0JCQkJY29udGVudE5vZGUgPSBjcmVhdGVOb2RlKG5vZGVTZWVkcyk7Ci0JCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjb250ZW50Tm9kZSk7Ci0JCQkJCWNvbnRlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCQl9Ci0JCQkJbGFzdE5vZGUgPSBjb250ZW50Tm9kZTsKLQkJCX0KLQkJCWlmICh0cmFpbGluZ1NwYWNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJbGFzdE5vZGUuc2V0TmV4dCh0cmFpbGluZ1NwYWNlTm9kZSk7Ci0JCQkJdHJhaWxpbmdTcGFjZU5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCWxhc3ROb2RlID0gdHJhaWxpbmdTcGFjZU5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGFzdE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZU5vZGUoTGlua2VkTGlzdCByZWdpb25zKSB7Ci0JCWlmIChyZWdpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IERURFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKERURFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuRFREX0dFTkVSSUMpOwotCQlpbnQgc3RhcnQgPSAoKElUZXh0UmVnaW9uKSByZWdpb25zLmdldEZpcnN0KCkpLmdldFN0YXJ0KCk7Ci0JCWludCBsZW5ndGggPSAoKElUZXh0UmVnaW9uKSByZWdpb25zLmdldExhc3QoKSkuZ2V0RW5kKCkgLSBzdGFydDsKLQkJbm9kZS5zZXRTdGFydChzdGFydCk7Ci0JCW5vZGUuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yIGkgPSByZWdpb25zLmxpc3RJdGVyYXRvcigwKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGkubmV4dCgpOwotCQkJbm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtc3RhcnQpOwotCQl9Ci0JCW5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZU5vZGVDaGFpbihMaXN0IHJlZ2lvbnMpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBudWxsOwotCQlWZWN0b3Igbm9kZVNlZWRzID0gbmV3IFZlY3RvcigpOwotCi0JCWZvciAoSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsgZS5oYXNOZXh0KCk7KSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gSWYgdGhlIGZvbGxvd2luZyByZWdpb25zIGFwcGVhciwKLQkJCS8vIGEgcHJldmlvdXMgbm9kZSBpcyBjbG9zZWQgaW4gZnJvbnQgb2YgaXQuCi0JCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkgJiYgaXNCZWdpbm5pbmdSZWdpb24odHlwZSkpIHsKLQkJCQlsYXN0Tm9kZSA9IGFkZE5ld05vZGVzKGxhc3ROb2RlLCBub2RlU2VlZHMpOwotCQkJCW5vZGVTZWVkcy5jbGVhcigpOwotCQkJfQotCQkJbm9kZVNlZWRzLmFkZEVsZW1lbnQocmVnaW9uKTsKLQotCQkJLy8gVGhlIGZvbGxvd2luZyByZWdpb25zIGNsb3NlIHRoZSBjdXJyZW50IG5vZGUuCi0JCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkgJiYgaXNFbmRpbmdSZWdpb24odHlwZSkpIHsKLQkJCQlsYXN0Tm9kZSA9IGFkZE5ld05vZGVzKGxhc3ROb2RlLCBub2RlU2VlZHMpOwotCQkJCW5vZGVTZWVkcy5jbGVhcigpOwotCQkJfQotCi0JCQlpZiAoaGVhZE5vZGUgPT0gbnVsbCAmJiBsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaGVhZE5vZGUgPSBmaW5kRmlyc3ROb2RlKGxhc3ROb2RlKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNsb3NlIGN1cnJlbnQgbm9kZSBmb3JjaWJseS4KLQkJaWYgKCFub2RlU2VlZHMuaXNFbXB0eSgpKSB7Ci0JCQlsYXN0Tm9kZSA9IGFkZE5ld05vZGVzKGxhc3ROb2RlLCBub2RlU2VlZHMpOwotCQkJaWYgKGhlYWROb2RlID09IG51bGwgJiYgbGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCWhlYWROb2RlID0gZmluZEZpcnN0Tm9kZShsYXN0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kRmlyc3ROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IG5vZGU7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldk5vZGUgPSBudWxsOwotCQl3aGlsZSAoKHByZXZOb2RlID0gZmlyc3ROb2RlLmdldFByZXZpb3VzKCkpICE9IG51bGwpIHsKLQkJCWZpcnN0Tm9kZSA9IHByZXZOb2RlOwotCQl9Ci0JCXJldHVybiBmaXJzdE5vZGU7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb25zKCkgewotCQlpZiAoY2FjaGVkTm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY2FjaGVkTm9kZTsKLQkJfQotCi0JCUxpc3QgcmVnaW9ucyA9IGdldFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IGNyZWF0ZU5vZGVDaGFpbihyZWdpb25zKTsKLQkJY2FjaGVkTm9kZSA9IGhlYWROb2RlOwotCi0JCXJldHVybiBoZWFkTm9kZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRSZWdpb25zKCkgewotCQlpZiAoY2FjaGVkUmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY2FjaGVkUmVnaW9uczsKLQkJfQotCi0JCVZlY3RvciByZWdpb25zID0gbmV3IFZlY3RvcigpOwotCQlUb2tlbiBjdXJyZW50VG9rZW4gPSBudWxsOwotCQlkbyB7Ci0JCQl0cnkgewotCQkJCWN1cnJlbnRUb2tlbiA9IChUb2tlbikgdG9rZW5pemVyLnl5bGV4KCk7Ci0JCQkJaWYgKGN1cnJlbnRUb2tlbiAhPSBudWxsKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IERURFJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKGN1cnJlbnRUb2tlbi5nZXRUeXBlKCksIGN1cnJlbnRUb2tlbi5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50VG9rZW4uZ2V0TGVuZ3RoKCkpOwotCQkJCQlyZWdpb25zLmFkZChyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXdoaWxlIChjdXJyZW50VG9rZW4gIT0gbnVsbCk7Ci0KLQkJY2FjaGVkUmVnaW9ucyA9IHJlZ2lvbnM7Ci0JCXJldHVybiByZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJaWYgKHRva2VuaXplciA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRva2VuaXplciA9IG5ldyBEVERUb2tlbml6ZXIocmVhZGVyKTsKLQkJCX0KLQkJCWNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIERURFRva2VuaXplciA8aW5wdXRmaWxlPiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCXRva2VuaXplci55eXJlc2V0KHJlYWRlcik7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJY2FjaGVkTm9kZSA9IG51bGw7Ci0JCWNhY2hlZFJlZ2lvbnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEFuIGFkZGl0aW9uYWwgb2Zmc2V0IGZvciB1c2Ugd2l0aCBhbnkgcG9zaXRpb24tZGVwZW5kYW50IHBhcnNpbmcgcnVsZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgcmVhZGVyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJlc2V0KHJlYWRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIGlucHV0KSB7Ci0JCXJlc2V0KG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgaW5wdXQsIGludCBvZmZzZXQpIHsKLQkJcmVzZXQoaW5wdXQpOwotCX0KLQotCS8vIG5ldmVyIHVzZWQKLQlEVERUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlyZXR1cm4gdG9rZW5pemVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0JlZ2lubmluZ1JlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHKSB8fCAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQmxhbmtSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VuZGluZ1JlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5EX1RBRykgfHwgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0pIHx8ICh0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfRU5EKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25UeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0YjY2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRFREUmVnaW9uVHlwZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHJlZ2lvblByZWZpeCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5wYXJzZXIuRFREUmVnaW9uVHlwZXMuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9IHJlZ2lvblByZWZpeCArICJOQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RBRyA9IHJlZ2lvblByZWZpeCArICJTVEFSVF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX1RBRyA9IHJlZ2lvblByZWZpeCArICJFTkRfVEFHIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFRlRfUEFSRU4gPSByZWdpb25QcmVmaXggKyAiTEVGVF9QQVJFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSSUdIVF9QQVJFTiA9IHJlZ2lvblByZWZpeCArICJSSUdIVF9QQVJFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURVNQQUNFID0gcmVnaW9uUHJlZml4ICsgIldISVRFU1BBQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SID0gcmVnaW9uUHJlZml4ICsgIkNPTk5FQ1RPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9DQ1VSX1RZUEUgPSByZWdpb25QcmVmaXggKyAiT0NDVVJfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMQU1BVElPTiA9IHJlZ2lvblByZWZpeCArICJFWENMQU1BVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJDRU5UID0gcmVnaW9uUHJlZml4ICsgIlBFUkNFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VNSUNPTE9OID0gcmVnaW9uUHJlZml4ICsgIlNFTUlDT0xPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX1NUQVJUID0gcmVnaW9uUHJlZml4ICsgIkNPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkNPTU1FTlRfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VORCA9IHJlZ2lvblByZWZpeCArICJDT01NRU5UX0VORCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX1RBRyA9IHJlZ2lvblByZWZpeCArICJOT1RBVElPTl9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fQ09OVEVOVCA9IHJlZ2lvblByZWZpeCArICJOT1RBVElPTl9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RBRyA9IHJlZ2lvblByZWZpeCArICJFTlRJVFlfVEFHIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9QQVJNID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9QQVJNIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5EQVRBX1ZBTFVFID0gcmVnaW9uUHJlZml4ICsgIk5EQVRBX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUcgPSByZWdpb25QcmVmaXggKyAiRUxFTUVOVF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkVMRU1FTlRfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0VNUFRZID0gcmVnaW9uUHJlZml4ICsgIkNPTlRFTlRfRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BTlkgPSByZWdpb25QcmVmaXggKyAiQ09OVEVOVF9BTlkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QQ0RBVEEgPSByZWdpb25QcmVmaXggKyAiQ09OVEVOVF9QQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRMSVNUX1RBRyA9IHJlZ2lvblByZWZpeCArICJBVFRMSVNUX1RBRyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIlNZU1RFTV9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIlBVQkxJQ19LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5EQVRBX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTkRBVEFfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVRVU9URURfTElURVJBTCA9IHJlZ2lvblByZWZpeCArICJTSU5HTEVRVU9URURfTElURVJBTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVRVU9URURfTElURVJBTCA9IHJlZ2lvblByZWZpeCArICJET1VCTEVRVU9URURfTElURVJBTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0NPTlRFTlQgPSByZWdpb25QcmVmaXggKyAiVU5LTk9XTl9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSByZWdpb25QcmVmaXggKyAiQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBhdHRyaWJ1dGUgdHlwZSBrZXl3b3JkcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiQ0RBVEFfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIklEX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJJRFJFRl9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGU19LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIklEUkVGU19LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUSUVTX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiRU5USVRJRVNfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTk1UT0tFTl9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU5TX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTk1UT0tFTlNfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIk5PVEFUSU9OX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTV9DSE9JQ0UgPSByZWdpb25QcmVmaXggKyAiRU5VTV9DSE9JQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9FTlRJVFlfVFlQRSA9IHJlZ2lvblByZWZpeCArICJQQVJNX0VOVElUWV9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gYXR0cmlidXRlIGRlZmF1bHRzIGtleXdvcmRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJSRVFVSVJFRF9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExJRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJJTVBMSUVEX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklYRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJGSVhFRF9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotfS8vIERURFJlZ2lvblR5cGVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2ZiNjVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBEVEQgQ29yZSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0KLQkJLy8gdGhpcyBjb3VsZCBiZSBtYWRlIHNtYXJ0ZXIgYnkgYWN0dWFsbHkgbG9va2luZyB1cCB0aGUgY29udGVudAotCQkvLyB0eXBlJ3MgdmFsaWQgZXh0ZW5zaW9ucwotCQlub2RlLnB1dChEVERDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCAiZHRkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ4ZTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDb21tb24gcHJlZmVyZW5jZSBrZXlzIHVzZWQgYnkgRFREIGNvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERDb3JlUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIERURENvcmVQcmVmZXJlbmNlTmFtZXMoKSB7Ci0JCS8vIGVtcHR5IHByaXZhdGUgY29uc3RydWN0b3Igc28gdXNlcnMgY2Fubm90IGluc3RhbnRpYXRlIGNsYXNzCi0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHVzZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkIGluIHRoZSBOZXcgRmlsZQotCSAqIFdpemFyZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhURU5TSU9OID0gImRlZmF1bHRFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzc1OGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlOwotCi0vKioKLSAqIDxwPgotICogVGhpcyBjbGFzcywgd2l0aCBpdHMgb25lIGZpZWxkLCBpcyBhIGNvbnZlbmllbmNlIHRvIHByb3ZpZGUgY29tcGlsZS10aW1lCi0gKiBzYWZldHkgd2hlbiByZWZlcnJpbmcgdG8gdGhlIERURCBjb250ZW50VHlwZSBJRC4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudFR5cGVJZEZvckRURCB7Ci0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSBDb250ZW50VHlwZUlEX0RURCBpZCBmaWVsZCB3aWxsIG1hdGNoIHdoYXQgaXMKLQkgKiBzcGVjaWZpZWQgaW4gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi54bWwgZm9yIHRoZSBEVEQgY29udGVudAotCSAqIHR5cGUuCi0JICogCi0JICogVGhpcyB2YWx1ZSBpcyBpbnRlbnRpb25hbGx5IHNldCB0aHJvdWdoIGEgZGVmYXVsdCBwcm90ZWN0ZWQgbWV0aG9kIHNvCi0JICogdGhhdCBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfRFREID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQotCXByaXZhdGUgQ29udGVudFR5cGVJZEZvckRURCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBEVEQgQ29udGVudCBUeXBlIElkZW50aWZpZXIgSUQgYXMgYSBTdHJpbmcKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldENvbnN0YW50U3RyaW5nKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9EVERNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9EVERNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWM3MDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvRFRETW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIEFuIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGUgU1NFLWJhc2VkIERURCBtb2RlbC4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBEVERNb2RlbCBleHRlbmRzIElTdHJ1Y3R1cmVkTW9kZWx7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSURURFBhcnRpdGlvblR5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSURURFBhcnRpdGlvblR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzVmNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lEVERQYXJ0aXRpb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbiB0eXBlcyBEVEQuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRleHQuSURURFBhcnRpdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJRFREUGFydGl0aW9uVHlwZXMgewotCQotCVN0cmluZyBEVERfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLkRFRkFVTFQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rhc2tzL0RUREZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90YXNrcy9EVERGaWxlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3ZTI3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rhc2tzL0RUREZpbGVUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lcjsKLQotcHVibGljIGNsYXNzIERUREZpbGVUYXNrU2Nhbm5lciBleHRlbmRzIFN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIgewotCXB1YmxpYyBEVERGaWxlVGFza1NjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21tZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCXJldHVybiB0ZXh0UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9DT05URU5UKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2UxYTE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQm91bmRyeUNhc2VzKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZlN0YXJ0KTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlIC0gMSk7Ci0JCXJldHVybiByZXBhcnNlKHN0YXJ0Tm9kZS5nZXRTdGFydCgpLCBlbmROb2RlLmdldEVuZCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJcmV0dXJuIHN1cGVyLnJlcGFyc2UoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2QyYzJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVERfR0VORVJJQyA9IDU7Ci0KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2UgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgRFREX0dFTkVSSUMgOgotCQkJCWluc3RhbmNlID0gbmV3IEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L1JlZ2lvbkl0ZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvUmVnaW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5MWIyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvUmVnaW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFJlZ2lvbkl0ZXJhdG9yIHsKLQotCXByaXZhdGUgaW50IGN1cnJlbnRJbmRleDsKLQotCS8vIHByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQlwcml2YXRlIElUZXh0UmVnaW9uTGlzdCByZWdpb25zOwotCS8vIHByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQ7Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBzdGFydFJlZ2lvbiwgZW5kUmVnaW9uOwotCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQl0aGlzKG5vZGUsIG5vZGUuZ2V0U3RhcnQoKSwgbm9kZS5nZXRFbmQoKSk7Ci0JfQotCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgZW5kT2Zmc2V0KSB7Ci0JCXJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKTsKLQkJc3RhcnRSZWdpb24gPSBub2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0T2Zmc2V0KTsKLQkJZW5kUmVnaW9uID0gbm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmRPZmZzZXQgLSAxKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHN0YXJ0UmVnaW9uID09IHJlZ2lvbikgewotCQkJCWN1cnJlbnRJbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJdGhpcy5yZWdpb25zID0gcmVnaW9uczsKLQkJc3RhcnRSZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJZW5kUmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJY3VycmVudEluZGV4ID0gMDsKLQkJLy8gdGhpcyhub2RlLCBub2RlLmdldFN0YXJ0KCksIG5vZGUuZ2V0RW5kKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCWlmIChjdXJyZW50SW5kZXggPCByZWdpb25zLnNpemUoKSkgewotCQkJcmV0dXJuIGN1cnJlbnRJbmRleCA8PSByZWdpb25zLmluZGV4T2YoZW5kUmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCWlmIChjdXJyZW50SW5kZXggPj0gMCkgewotCQkJcmV0dXJuIGN1cnJlbnRJbmRleCA+PSByZWdpb25zLmluZGV4T2Yoc3RhcnRSZWdpb24pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gbmV4dCgpIHsKLQkJaWYgKGhhc05leHQoKSkgewotCQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KGN1cnJlbnRJbmRleCsrKTsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBwcmV2aW91cygpIHsKLQkJaWYgKGhhc1ByZXZpb3VzKCkpIHsKLQkJCXJldHVybiByZWdpb25zLmdldCgtLWN1cnJlbnRJbmRleCk7Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyYmQ0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGV4dC5JRFREUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFREKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciNnZXREZWZhdWx0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCkgewotCQlyZXR1cm4gSURURFBhcnRpdGlvbnMuRFREX0RFRkFVTFQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyI2luaXRMZWdhbENvbnRlbnRUeXBlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlmU3VwcG9ydGVkVHlwZXMgPSBuZXcgU3RyaW5nW117SURURFBhcnRpdGlvbnMuRFREX0RFRkFVTFQsIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTn07Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFREKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvRFREVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9EVERUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjYzJkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9EVERUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjMuNSBvbiAzLzE0LzA1IDk6MzcgUE0gKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci0KLS8qKiAKLSAqIEdlbmVyYXRlIHdpdGggImR0ZHNrZWxldG9uIi4KLSAqCi0gKiBJdCByZW1vdmVzIHNvbWUgdW51c2VkIGZpZWxkcyBhbmQgYXZvaWRzIHNvbWUgY29tcGlsZXIgd2FybmluZ3MgCi0gKi8KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS4zLjUKLSAqIG9uIDMvMTQvMDUgOTozNyBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9lY2xpcHNlLnd0cC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL2R0ZC5mbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIERURFRva2VuaXplciB7Ci0KLSAgLyoqIFRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGluaXRpYWwgc2l6ZSBvZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfQlVGRkVSU0laRSA9IDE2Mzg0OwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBBVFRSSUJVVEVfRU5VTUVSQVRJT04gPSAxMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTk9UQVRJT05fTkFNRSA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVMRU1FTlRfQ0hJTEQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTlRJVFlfQ09OVEVOVCA9IDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IENPTU1FTlRfQ09OVEVOVCA9IDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEFUVExJU1RfTkFNRSA9IDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVYVEVSTkFMSURfQ09OVEVOVCA9IDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVMRU1FTlRfQ09OVEVOVCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVMRU1FTlRfTUlYRUQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTEVNRU5UX01JWEVEX09SX0NISUxEID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUUklCVVRFX0NPTlRFTlQgPSAxMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRU5USVRZX05BTUUgPSAzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBBVFRSSUJVVEVfREVGQVVMVCA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTEVNRU5UX05BTUUgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBOREFUQV9DT05URU5UID0gNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUTElTVF9DT05URU5UID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE5PREUgPSAxOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTBcMFwxXDBcMVw1XDFcM1wxXDBcMVwwXDFcMlwyMlwwXDFcNVwxXDYiKwotICAgICJcMVwxXDFcMzdcMVwwXDFcMjNcMVwwXDFcNDZcMVw0MlwxXDQzXDFcNFwxXDciKwotICAgICJcMVw0NVwxXDEyXDFcMFwxXDBcMTJcMFwxXDBcMVwxMFwxXDExXDFcMFwxXDEzIisKLSAgICAiXDFcNFwxXDBcMVwyNVwxXDMxXDFcMzJcMVwzM1wxXDE0XDFcMzVcMlwwXDFcMjEiKwotICAgICJcMVwwXDFcMzZcMVwxNVwxXDE2XDFcMTdcMVwyNFwxXDI3XDFcNDBcMVwzNFwxXDI2IisKLSAgICAiXDFcMjBcMVwzMFwyXDBcMVw0MVwxXDIyXDFcMFwxXDBcMVwwXDJcMFwxXDAiKwotICAgICJcMVwwXDMyXDBcMVwwXDFcNDRcdWZmODNcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICAzOSwgICAgNzgsICAgMTE3LCAgIDE1NiwgICAxOTUsICAgMjM0LCAgIDI3MywgICAzMTIsICAgMzUxLCAKLSAgICAgIDM5MCwgICA0MjksICAgNDY4LCAgIDUwNywgICA1NDYsICAgNTg1LCAgIDYyNCwgICAgMzksICAgIDM5LCAgICAzOSwgCi0gICAgICA2NjMsICAgNzAyLCAgIDc0MSwgICA3ODAsICAgODE5LCAgICAzOSwgICAgMzksICAgODU4LCAgIDg5NywgICAgMzksIAotICAgICAgIDM5LCAgIDkzNiwgICA5MzYsICAgOTc1LCAgMTAxNCwgIDEwNTMsICAxMDkyLCAgMTEzMSwgIDExNzAsICAxMjA5LCAKLSAgICAgMTI0OCwgIDEyODcsICAxMzI2LCAgMTM2NSwgIDE0MDQsICAxNDQzLCAgICAzOSwgIDE0ODIsICAxNTIxLCAgMTU2MCwgCi0gICAgIDE1OTksICAxNjM4LCAgICAzOSwgIDE2NzcsICAxNzE2LCAgMTc1NSwgIDE3OTQsICAxODMzLCAgMTg3MiwgICAgMzksIAotICAgICAgIDM5LCAgMTkxMSwgIDE5NTAsICAxOTg5LCAgMjAyOCwgIDIwNjcsICAyMTA2LCAgICAzOSwgICAgMzksICAgIDM5LCAKLSAgICAgMjE0NSwgIDIxODQsICAyMjIzLCAgMjI2MiwgIDIzMDEsICAyMzQwLCAgMjM3OSwgICA4OTcsICAyNDE4LCAgIDk3NSwgCi0gICAgIDI0NTcsICAyNDk2LCAgMjUzNSwgIDI1NzQsICAgOTc1LCAgMjYxMywgIDI2NTIsICAyNjkxLCAgMjczMCwgIDE1NjAsIAotICAgICAyNzY5LCAgMjgwOCwgIDI4NDcsICAyODg2LCAgMjkyNSwgIDI5NjQsICAzMDAzLCAgMzA0MiwgIDMwODEsICAzMTIwLCAKLSAgICAgMTk1MCwgIDMxNTksICAzMTk4LCAgMzIzNywgIDMyNzYsICAzMzE1LCAgMTk1MCwgICAgMzksICAzMzU0LCAgMzM5MywgCi0gICAgIDM0MzIsICAgIDM5LCAgMzQ3MSwgIDM1MTAsICAzNTQ5LCAgICAzOSwgIDM1ODgsICAzNjI3LCAgICAzOSwgIDM2NjYsIAotICAgICAzNzA1LCAgMzc0NCwgICAgMzksICAgIDM5LCAgMzc4MywgIDM4MjIsICAzODYxLCAgMzkwMCwgIDM5MzksICAzOTc4LCAKLSAgICAgNDAxNywgIDQwNTYsICAgIDM5LCAgNDA5NSwgIDQxMzQsICA0MTczLCAgICAzOSwgIDQyMTIsICA0MjUxLCAgNDI5MCwgCi0gICAgIDQzMjksICA0MzY4LCAgNDQwNywgIDQ0NDYsICA0NDg1LCAgNDUyNCwgIDQ1NjMsICA0NjAyLCAgNDY0MSwgIDQ2ODAsIAotICAgICA0NzE5LCAgNDc1OCwgIDQ3OTcsICA0ODM2LCAgNDg3NSwgIDQ5MTQsICA0OTUzLCAgNDk5MiwgIDUwMzEsICA1MDcwLCAKLSAgICAgNTEwOSwgIDUxNDgsICA1MTg3LCAgNTIyNiwgIDUyNjUsICA1MzA0LCAgNTM0MywgICA5NzUsICA1MzgyLCAgNTQyMSwgCi0gICAgIDU0NjAsICA1NDk5LCAgNTUzOCwgIDU1NzcsICAxNTYwLCAgNTYxNiwgIDU2NTUsICA1Njk0LCAgNTczMywgIDU3NzIsIAotICAgICA1ODExLCAgNTg1MCwgICA1NDYsICA1ODg5LCAgNTkyOCwgIDU5NjcsICA2MDA2LCAgIDk3NSwgICA5NzUsICAgOTc1LCAKLSAgICAgNjA0NSwgIDE1NjAsICA2MDg0LCAgNjEyMywgIDE1NjAsICA2MTYyLCAgNjIwMSwgIDYyNDAsICAxOTUwLCAgIDU0NiwgCi0gICAgIDYyNzksICAgNTQ2LCAgIDgxOSwgIDYzMTgsICA2MzU3LCAgNjM5NiwgIDY0MzUsICA2NDc0LCAgNjUxMywgICA1NDYsIAotICAgICA2NTUyLCAgMTU2MCwgIDE1NjAsICAxNTYwLCAgMTk1MCwgIDY1OTEsICAgIDM5LCAgMTk1MAotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEgKHBhcnQgMCkKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQwID0gCi0gICAgIlwyXDE3XDJcMjBcMVwxN1wxXDIwXDFcMjFcMVwxN1wxXDIyXDFcMjMiKwotICAgICJcMVwxN1wxXDI0XDFcMjVcMlwxN1wxXDI2XDNcMTdcMVwyN1wxXDE3IisKLSAgICAiXDFcMzBcMjFcMTdcNDdcMFwyXDMxXDJcMjBcMVwzMlwxXDIwXDFcMCIrCi0gICAgIlwxXDMyXDFcMzFcMVwzM1wxXDMxXDFcMzNcMjNcMzFcMVwzNFwyXDMxIisKLSAgICAiXDFcMzVcMVwzNlwyXDM3XDFcMzFcMlw0MFwyXDIwXDFcMFwxXDIwIisKLSAgICAiXDNcNDBcMVwzM1wxXDQwXDFcMzNcN1w0MFwxXDQxXDE2XDQwXDRcMCIrCi0gICAgIlwxXDQwXDFcNDJcMVw0M1wyXDIwXDFcNDJcMVwyMFwzXDQyXDFcMzMiKwotICAgICJcMVw0MlwxXDMzXDEyXDQyXDFcNDRcMVw0NVwxNlw0MlwxXDQ2XDJcNDciKwotICAgICJcMlwyMFwxXDQ3XDFcMjBcM1w0N1wxXDMzXDFcNDdcMVwzM1wzM1w0NyIrCi0gICAgIlwyXDUwXDJcMjBcMVwwXDFcMjBcMlwwXDFcNTBcMVwzM1wxXDUwIisKLSAgICAiXDFcMzNcMjZcNTBcNFwwXDFcNTBcMVw0MlwxXDQzXDJcMjBcMVw0MiIrCi0gICAgIlwxXDIwXDNcNDJcMVwzM1wxXDQyXDFcMzNcM1w0MlwxXDUxXDZcNDIiKwotICAgICJcMVw1MlwxXDUzXDE2XDQyXDFcNDZcMlw1NFwyXDU1XDFcNTRcMVw1NSIrCi0gICAgIlw0XDU0XDFcNTZcMVw1N1wzM1w1NFwyXDYwXDJcMjBcMVw0MlwxXDIwIisKLSAgICAiXDJcNDJcMVw2MFwxXDMzXDFcNjBcMVwzM1wyNlw2MFw0XDQyXDFcNjAiKwotICAgICJcMlw2MVwyXDIwXDFcNDJcMVwyMFwyXDQyXDFcNjFcMVwzM1wxXDYxIisKLSAgICAiXDFcMzNcMjZcNjFcNFw0MlwxXDYxXDFcNjJcMVw2M1wxXDY0XDFcNjUiKwotICAgICJcMVw2MlwxXDY2XDNcNjJcMVwzM1wxXDYyXDFcMzNcMVw2N1wyXDYyIisKLSAgICAiXDFcNzBcMVw2MlwxXDcxXDEwXDYyXDFcNzJcNFw2MlwxXDczXDJcNjIiKwotICAgICJcMVw3NFwyXDc1XDFcNjJcMVw3NlwxXDc3XDFcMTAwXDJcMjBcMVw3NyIrCi0gICAgIlwxXDIwXDNcNzdcMVwzM1wxXDc3XDFcMzNcMjNcNzdcMVwxMDFcNlw3NyIrCi0gICAgIlwxXDEwMlwyXDEwM1wyXDIwXDFcMTAzXDFcMjBcM1wxMDNcMVwzM1wxXDEwMyIrCi0gICAgIlwxXDMzXDI2XDEwM1wxXDEwNFwxXDEwNVwxXDEwNlwyXDEwM1wyXDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw3XDE3XDFcMCIrCi0gICAgIlwyM1wxN1wyXDBcMlwyMFwxXDBcMVwyMFw1M1wwXDFcMTA3XDM0XDAiKwotICAgICJcMlwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDAiKwotICAgICJcMVwxN1wxXDExMFwxXDE3XDFcMTExXDNcMTdcMVwwXDI1XDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw3XDE3XDFcMCIrCi0gICAgIlwxXDExMlwyMlwxN1wyXDExM1wyXDBcMVwxMTNcMlwwXDFcMTEzXDJcMCIrCi0gICAgIlwxXDExM1wxXDBcN1wxMTNcMVwwXDIzXDExM1wyXDE3XDJcMFwxXDE3IisKLSAgICAiXDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3XDFcMTE0XDJcMTciKwotICAgICJcMVwwXDIzXDE3XDJcMzFcNlwwXDFcMzFcMVwwXDFcMzFcMVwwIisKLSAgICAiXDI2XDMxXDRcMFwzXDMxXDZcMFwxXDMxXDFcMFwxXDMxXDFcMCIrCi0gICAgIlwxM1wzMVwxXDExNVwxMlwzMVw0XDBcMVwzMVwyXDBcMlwxMTZcMVwwIisKLSAgICAiXDFcMTE2XDMxXDBcMVwxMTdcN1wwXDJcNDBcNFwwXDNcNDBcMVwwIisKLSAgICAiXDFcNDBcMVwwXDI2XDQwXDRcMFwxXDQwXDJcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDMzXDQyXDFcNDNcMVwxMjAiKwotICAgICJcMlwxMjFcMVw0M1wxXDEyMVwzXDQzXDFcMTIxXDFcNDNcMVwxMjFcMzNcNDMiKwotICAgICJcMlw0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDAiKwotICAgICJcNlw0MlwxXDEyMlwyNlw0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDAiKwotICAgICJcMVw0MlwxXDBcMTRcNDJcMVwxMjNcMTZcNDJcMlw0NlwyXDEyNFwxXDQ2IisKLSAgICAiXDFcMTI0XDNcNDZcMVwxMjRcMVw0NlwxXDEyNFwzMlw0NlwxXDEyNVwyXDQ3IisKLSAgICAiXDJcMFwxXDQ3XDFcMFwzXDQ3XDFcMFwxXDQ3XDFcMFwzM1w0NyIrCi0gICAgIlwyXDUwXDZcMFwxXDUwXDFcMFwxXDUwXDFcMFwyNlw1MFw0XDAiKwotICAgICJcMVw1MFwyXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyIisKLSAgICAiXDFcMFwxN1w0MlwxXDEyNlwxNVw0MlwyXDBcMVw0MlwxXDBcM1w0MiIrCi0gICAgIlwxXDBcMVw0MlwxXDBcNlw0MlwxXDEyN1wyNlw0MlwyXDBcMVw0MiIrCi0gICAgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMTRcNDJcMVwxMzBcMTZcNDIiKwotICAgICJcMTJcNTRcMlwwXDM1XDU0XDJcNTVcMVw1NFwxXDU1XDRcNTRcMlwwIisKLSAgICAiXDMzXDU0XDEyXDBcMVwxMzFcMzRcMFwyXDYwXDJcMFwxXDQyXDFcMCIrCi0gICAgIlwyXDQyXDFcNjBcMVwwXDFcNjBcMVwwXDI2XDYwXDRcNDJcMVw2MCIrCi0gICAgIlwyXDYxXDJcMFwxXDQyXDFcMFwyXDQyXDFcNjFcMVwwXDFcNjEiKwotICAgICJcMVwwXDI2XDYxXDRcNDJcMVw2MVwyXDYyXDJcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDFcMFwyNlw2MlwzXDBcMlw2MlwxXDYzIisKLSAgICAiXDFcMTMyXDJcMTMzXDFcNjNcMVwxMzNcM1w2M1wxXDEzM1wxXDYzXDFcMTMzIisKLSAgICAiXDI2XDYzXDNcMTMzXDJcNjNcM1wwXDFcNjVcNTBcMFwxXDY2XDQxXDAiKwotICAgICJcMlw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDEzNFwyMlw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcMlw2MlwxXDEzNVw1XDYyXDFcMTM2IisKLSAgICAiXDE1XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFwxN1w2MlwxXDEzN1w2XDYyXDNcMFw0XDYyXDJcMCIrCi0gICAgIlwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxN1w2MlwxXDE0MCIrCi0gICAgIlw2XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFw1XDYyXDFcMTQxXDEyXDYyXDFcMTQyXDFcMTQzXDRcNjIiKwotICAgICJcM1wwXDJcNjJcMlw3NlwyXDE0NFwxXDc2XDFcMTQ0XDNcNzZcMVwxNDQiKwotICAgICJcMVw3NlwxXDE0NFwyNlw3NlwzXDE0NFwxXDc2XDFcMTMyXDJcNzdcMlwwIisKLSAgICAiXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDMzXDc3XDFcMTAwIisKLSAgICAiXDFcMTQ1XDJcMTQ2XDFcMTAwXDFcMTQ2XDNcMTAwXDFcMTQ2XDFcMTAwXDFcMTQ2IisKLSAgICAiXDMzXDEwMFwyXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFw1XDc3XDFcMTQ3XDEyXDc3XDFcMTUwXDFcMTUxXDExXDc3XDJcMTAyIisKLSAgICAiXDJcMTUyXDFcMTAyXDFcMTUyXDNcMTAyXDFcMTUyXDFcMTAyXDFcMTUyXDMyXDEwMiIrCi0gICAgIlwxXDE1M1wyXDEwM1wyXDBcMVwxMDNcMVwwXDNcMTAzXDFcMFwxXDEwMyIrCi0gICAgIlwxXDBcMjZcMTAzXDNcMFwyXDEwM1wxMlwwXDFcMTU0XDM0XDBcMlwxNyIrCi0gICAgIlwyXDBcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcMVwxNTUiKwotICAgICJcNlwxN1wxXDBcMjVcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwIisKLSAgICAiXDFcMTdcMVwwXDRcMTdcMVwxNTZcMlwxN1wxXDBcMjVcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDRcMTdcMVwxNTciKwotICAgICJcMlwxN1wxXDBcMjNcMTdcMlwxMTNcMlwwXDFcMTEzXDJcMFwxXDExMyIrCi0gICAgIlwxXDE2MFwxXDBcMVwxMTNcMVwwXDdcMTEzXDFcMFwyM1wxMTNcMlwxNyIrCi0gICAgIlwyXDBcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNFwxNyIrCi0gICAgIlwxXDE2MVwyXDE3XDFcMFwyM1wxN1wyXDMxXDZcMFwxXDMxXDFcMCIrCi0gICAgIlwxXDMxXDFcMFwxNlwzMVwxXDE2Mlw3XDMxXDRcMFwxXDMxXDI3XDAiKwotICAgICJcMVwxNjNcMTdcMFwxXDEyMVwxXDE2NFw0NVwxMjFcMlw0MlwyXDBcMVw0MiIrCi0gICAgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMTJcNDJcMVwxNjVcMjJcNDIiKwotICAgICJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDE1XDQyIisKLSAgICAiXDFcMTY2XDE1XDQyXDQ2XDEyNFwxXDE2N1wyXDQyXDJcMFwxXDQyXDFcMCIrCi0gICAgIlwzXDQyXDFcMFwxXDQyXDFcMFwxMVw0MlwxXDE3MFwyM1w0MlwyXDAiKwotICAgICJcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMTJcNDJcMVwxNzEiKwotICAgICJcMjJcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwIisKLSAgICAiXDE1XDQyXDFcMTcyXDE1XDQyXDEzXDBcMVwxNzNcMzNcMFwxXDEzM1wxXDE3NCIrCi0gICAgIlw0NVwxMzNcMlw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcNFw2MlwxXDE3NVwyMVw2MlwzXDBcNFw2MlwyXDBcMVw2MiIrCi0gICAgIlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcNFw2MlwxXDE3NlwyMVw2MiIrCi0gICAgIlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcNFw2MlwxXDE3N1wyMVw2MlwzXDBcNFw2MlwyXDBcMVw2MiIrCi0gICAgIlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMjBcNjJcMVwyMDBcNVw2MiIrCi0gICAgIlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcMTFcNjJcMVwyMDFcMTRcNjJcM1wwXDRcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDJcNjJcMVwyMDJcMjNcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDFcMjAzXDI1XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDFcMFw1XDYyXDFcMjA0XDIwXDYyXDNcMCIrCi0gICAgIlwyXDYyXDQ2XDE0NFwxXDE3NFwxXDE0NlwxXDIwNVw0NVwxNDZcMlw3N1wyXDAiKwotICAgICJcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDBcMlw3N1wxXDIwNiIrCi0gICAgIlwzMlw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDAiKwotICAgICJcMVwyMDdcMzRcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDVcNzdcMVwyMTBcMjVcNzdcNDZcMTUyXDFcMjExXDJcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDJcMTdcMVwyMTIiKwotICAgICJcNFwxN1wxXDBcMjVcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwIisKLSAgICAiXDFcMTdcMVwwXDVcMTdcMVwyMTNcMVwxN1wxXDBcMjVcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDdcMTdcMVwwIisKLSAgICAiXDFcMTdcMVwyMTRcMjNcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwIisKLSAgICAiXDFcMTdcMVwwXDFcMTdcMVwyMTVcNVwxN1wxXDBcMjNcMTdcMlwzMSIrCi0gICAgIlw2XDBcMVwzMVwxXDBcMVwzMVwxXDBcMTdcMzFcMVwyMTZcNlwzMSIrCi0gICAgIlw0XDBcMVwzMVwzMlwwXDFcMjE3XDE0XDBcMlw0MlwyXDBcMVw0MiIrCi0gICAgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcNFw0MlwxXDIyMFwzMFw0MiIrCi0gICAgIlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMVw0MiIrCi0gICAgIlwxXDIyMVwzM1w0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MiIrCi0gICAgIlwxXDBcNFw0MlwxXDIyMlwzMFw0MlwyXDBcMVw0MlwxXDBcM1w0MiIrCi0gICAgIlwxXDBcMVw0MlwxXDBcNFw0MlwxXDIyM1wzMFw0MlwyXDBcMVw0MiIrCi0gICAgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMVw0MlwxXDIyNFwzMVw0MiIrCi0gICAgIlwyXDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMCIrCi0gICAgIlw1XDYyXDFcMjI1XDIwXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDFcMFwxMFw2MlwxXDIyNlwxNVw2MlwzXDAiKwotICAgICJcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDAiKwotICAgICJcMTFcNjJcMVwyMjdcMTRcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMVwwXDFcMjMwXDI1XDYyXDNcMFw0XDYyIisKLSAgICAiXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw0XDYyIisKLSAgICAiXDFcMjMxXDIxXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMFwxM1w2MlwxXDIzMlwxMlw2MlwzXDBcNFw2MiIrCi0gICAgIlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMjRcNjIiKwotICAgICJcMVwyMzNcMVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcMjVcNjJcMVwyMzRcM1wwXDJcNjJcMlw3NyIrCi0gICAgIlwyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDBcMTNcNzciKwotICAgICJcMVwyMzVcMjFcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDI0XDc3XDFcMjM2XDEwXDc3XDJcMFwxXDc3XDFcMFwzXDc3IisKLSAgICAiXDFcMFwxXDc3XDFcMFwyNVw3N1wxXDIzN1w1XDc3XDJcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDFcMjQwXDZcMTciKwotICAgICJcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3IisKLSAgICAiXDFcMFw0XDE3XDFcMjQxXDJcMTdcMVwwXDI1XDE3XDJcMFwxXDE3IisKLSAgICAiXDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3XDFcMjQyXDJcMTciKwotICAgICJcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3IisKLSAgICAiXDFcMFw1XDE3XDFcMjQzXDFcMTdcMVwwXDIzXDE3XDJcMzFcNlwwIisKLSAgICAiXDFcMzFcMVwwXDFcMzFcMVwwXDExXDMxXDFcMjQ0XDE0XDMxXDRcMCIrCi0gICAgIlwxXDMxXDMzXDBcMVwyNDVcMTNcMFwyXDQyXDJcMFwxXDQyXDFcMCIrCi0gICAgIlwzXDQyXDFcMFwxXDQyXDFcMFwxXDI0NlwzNFw0MlwyXDBcMVw0MiIrCi0gICAgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcNVw0MlwxXDI0N1wyN1w0MiIrCi0gICAgIlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMTFcNDIiKwotICAgICJcMVwyNTBcMjNcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDIiKwotICAgICJcMVwwXDFcMjUxXDM0XDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMCIrCi0gICAgIlwxXDQyXDFcMFw1XDQyXDFcMjUyXDI1XDQyXDJcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDRcNjJcMVwyNTNcMjFcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDIyXDYyXDFcMjU0XDNcNjJcM1wwXDRcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDRcNjJcMVwyNTVcMjFcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDIxXDYyXDFcMjU2XDRcNjJcM1wwXDRcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDExXDYyXDFcMjU3XDE0XDYyIisKLSAgICAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMjYwXDI0XDYyXDNcMFw0XDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxNFw2MlwxXDI2MVwxMVw2MiIrCi0gICAgIlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcMVwyNjJcMjVcNjJcM1wwXDJcNjJcMlw3N1wyXDBcMVw3NyIrCi0gICAgIlwxXDBcM1w3N1wxXDBcMVw3N1wxXDBcMVw3N1wxXDI2M1wzM1w3NyIrCi0gICAgIlwyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDBcMTRcNzciKwotICAgICJcMVwyNjRcMjBcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDFcMjY1XDMyXDc3XDJcMTdcMlwwXDFcMTdcMlwwXDFcMTciKwotICAgICJcMlwwXDFcMTdcMVwwXDNcMTdcMVwyNjZcM1wxN1wxXDBcMjVcMTciKwotICAgICJcMlwwXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDZcMTciKwotICAgICJcMVwyNjdcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIrCi0gICAgIlwxXDE3XDFcMFw1XDE3XDFcMjcwXDFcMTdcMVwwXDI1XDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw3XDE3XDFcMCIrCi0gICAgIlwyXDE3XDFcMjcxXDIwXDE3XDJcMzFcNlwwXDFcMzFcMVwwXDFcMzEiKwotICAgICJcMVwwXDRcMzFcMVwyNzJcMjFcMzFcNFwwXDFcMzFcMjVcMFwxXDI3MyIrCi0gICAgIlwyMVwwXDJcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDIiKwotICAgICJcMVwwXDJcNDJcMVwyNzRcMzJcNDJcMlwwXDFcNDJcMVwwXDNcNDIiKwotICAgICJcMVwwXDFcNDJcMVwwXDE2XDQyXDFcMjc0XDE2XDQyXDJcMFwxXDQyIisKLSAgICAiXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwyXDQyXDFcMjc1XDMyXDQyIisKLSAgICAiXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxNlw0MiIrCi0gICAgIlwxXDI3NlwxNFw0MlwyXDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFw1XDYyXDFcMjc3XDFcMzAwXDE3XDYyXDNcMFw0XDYyIisKLSAgICAiXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxXDMwMSIrCi0gICAgIlwyNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcNVw2MlwxXDMwMlwyMFw2MlwzXDBcNFw2MlwyXDAiKwotICAgICJcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTJcNjJcMVwzMDMiKwotICAgICJcMTNcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwIisKLSAgICAiXDFcNjJcMVwwXDVcNjJcMVwyMzRcMjBcNjJcM1wwXDRcNjJcMlwwIisKLSAgICAiXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDVcNjJcMVwzMDQiKwotICAgICJcMjBcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwIisKLSAgICAiXDFcNjJcMVwwXDE3XDYyXDFcMTMyXDZcNjJcM1wwXDJcNjJcMlw3NyIrCi0gICAgIlwyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDBcNVw3NyIrCi0gICAgIlwxXDMwNVwyN1w3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIrCi0gICAgIlwxXDBcNVw3N1wxXDMwNlwyN1w3N1wyXDBcMVw3N1wxXDBcM1w3NyIrCi0gICAgIlwxXDBcMVw3N1wxXDBcMTdcNzdcMVwzMDdcMTNcNzdcMlwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNFwxN1wxXDMxMCIrCi0gICAgIlwyXDE3XDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDAiKwotICAgICJcMVwxN1wxXDBcN1wxN1wxXDBcMVwzMTFcMjRcMTdcMlwwXDFcMTciKwotICAgICJcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDRcMTdcMVwzMTJcMlwxNyIrCi0gICAgIlwxXDBcMjNcMTdcMlwzMVw2XDBcMVwzMVwxXDBcMVwzMVwxXDAiKwotICAgICJcMTFcMzFcMVwzMTNcMTRcMzFcNFwwXDFcMzFcMjBcMFwxXDMxNFwyNlwwIisKLSAgICAiXDJcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwIisKLSAgICAiXDFcMzE1XDI1XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMFwzXDYyXDFcMzE2XDIyXDYyXDNcMFw0XDYyIisKLSAgICAiXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxMFw2MiIrCi0gICAgIlwxXDMxN1wxNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcMjBcNjJcMVwyMzRcNVw2MlwzXDBcMlw2MiIrCi0gICAgIlwyXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3XDFcMCIrCi0gICAgIlwxXDMyMFwzNFw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIrCi0gICAgIlwxXDBcMjBcNzdcMVwzMjFcMTJcNzdcMlwxN1wyXDBcMVwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wxXDBcM1wxN1wxXDMyMlwzXDE3XDFcMCIrCi0gICAgIlwyM1wxN1wyNVwwXDFcMzIzXDIxXDBcMlw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcMTJcNjJcMVwzMjRcMTNcNjJcM1wwIisKLSAgICAiXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwIisKLSAgICAiXDEyXDYyXDFcMzI1XDEzXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDFcMFwzXDYyXDFcMzI2XDIyXDYyXDNcMCIrCi0gICAgIlwyXDYyXDJcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDE3XDc3XDFcMzI3XDE1XDc3XDJcMFwxXDc3XDFcMFwzXDc3IisKLSAgICAiXDFcMFwxXDc3XDFcMFwxXDMzMFwzMlw3N1wyXDBcMlwzMjNcMVwwIisKLSAgICAiXDFcMzIzXDM1XDBcMVwzMzFcM1wwXDJcNzdcMlwwXDFcNzdcMVwwIisKLSAgICAiXDNcNzdcMVwwXDFcNzdcMVwwXDE3XDc3XDFcMzMyXDEzXDc3IjsKLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eXRyYW5zIFtdID0geXlfdW5wYWNrKCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKioKLSAgICogWVlfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBZWV9BVFRSSUJVVEVbXSA9IHsKLSAgICAgMCwgIDgsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICA5LCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDEsICA5LCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDksICA5LCAgOSwgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAwLCAgMCwgIDEsIAotICAgICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICA5LCAgMSwgIDEsICAxLCAgOSwgCi0gICAgIDEsICAxLCAgMCwgIDksICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbWVlfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgLy9wcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgaW50IHl5Y29sdW1uOyAKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgYXQgdGhlIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCWludCBub2RlX2NvdW50ID0gMDsKLQlTdHJpbmcgY3VycmVudFN0cmluZzsKLQotCXByaXZhdGUgVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBUb2tlbih0eXBlLCB5eXRleHQoKSwgeXlsaW5lLCB5eWNoYXIgKyBzdGFydE9mZnNldCwgeXlsZW5ndGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQgPSAwOwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhpcy5zdGFydE9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaW5lKGludCBsaW5lKSB7Ci0JCXRoaXMueXlsaW5lID0gbGluZTsKLQl9Ci0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgRFREVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIERURFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBzcGxpdCwgY29tcHJlc3NlZCBERkEgdHJhbnNpdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgdW5wYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHl5X3VucGFjaygpIHsKLSAgICBpbnQgW10gdHJhbnMgPSBuZXcgaW50WzY2MzBdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHl5X3VucGFjayh5eV9wYWNrZWQwLCBvZmZzZXQsIHRyYW5zKTsKLSAgICByZXR1cm4gdHJhbnM7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBlbnRyeQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHl5X3VucGFjayhTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gdHJhbnMpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHRyYW5zW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTMwKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZWZpbGxzIHRoZSBpbnB1dCBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGlmZiB0aGVyZSB3YXMgbmV3IGlucHV0LgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfcmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgLy95eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAobnVtUmVhZCA8IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOyAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQotICAgIGlmICh5eV9yZWFkZXIgIT0gbnVsbCkKLSAgICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBjdXJyZW50IHN0cmVhbSwgYW5kIHJlc2V0cyB0aGUKLSAgICogc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PllZX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eWNsb3NlKCk7Ci0gICAgeXlfcmVhZGVyID0gcmVhZGVyOwotICAgIHl5X2F0RU9GICA9IGZhbHNlOwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQgPSAwOwotICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgPSAwOy8veXlfcHVzaGJhY2tQb3MgPSAwOwotICAgIHl5bGluZSA9IHl5Y2hhciA9IHl5Y29sdW1uID0gMDsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0gIGZpbmFsIHB1YmxpYyBjaGFyIHl5Y2hhcmF0KGludCBwb3MpIHsKLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X3N0YXJ0UmVhZCtwb3NdOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBJbiBhIHdlbGxmb3JtZWQgc2Nhbm5lciAobm8gb3Igb25seSBjb3JyZWN0IHVzYWdlIG9mIAotICAgKiB5eXB1c2hiYWNrKGludCkgYW5kIGEgbWF0Y2gtYWxsIGZhbGxiYWNrIHJ1bGUpIHRoaXMgbWV0aG9kIAotICAgKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggdGhpbmdzIHRoYXQgIkNhbid0IFBvc3NpYmx5IEhhcHBlbiIuCi0gICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZwotICAgKiAoZS5nLiBhIEpGbGV4IGJ1ZyBwcm9kdWNpbmcgYSBmYXVsdHkgc2Nhbm5lciBldGMuKS4KLSAgICoKLSAgICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICogaW4gZXJyb3IgZmFsbGJhY2sgcnVsZXMuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFlZX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpICB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBZeXRva2VuIHl5bGV4KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0gICAgLy8gY2FjaGVkIGZpZWxkczoKLSAgICBpbnQgeXlfY3VycmVudFBvc19sOwotICAgIGludCB5eV9tYXJrZWRQb3NfbDsKLSAgICBpbnQgeXlfZW5kUmVhZF9sID0geXlfZW5kUmVhZDsKLSAgICBjaGFyIFtdIHl5X2J1ZmZlcl9sID0geXlfYnVmZmVyOwotICAgIGNoYXIgW10geXljbWFwX2wgPSB5eWNtYXA7Ci0KLSAgICBpbnQgW10geXl0cmFuc19sID0geXl0cmFuczsKLSAgICBpbnQgW10geXlfcm93TWFwX2wgPSB5eV9yb3dNYXA7Ci0gICAgYnl0ZSBbXSB5eV9hdHRyX2wgPSBZWV9BVFRSSUJVVEU7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeXlfbWFya2VkUG9zX2wgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIHl5Y2hhcis9IHl5X21hcmtlZFBvc19sLXl5X3N0YXJ0UmVhZDsKLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3NfbCA9IHl5X2N1cnJlbnRQb3MgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zX2w7Ci0gIAotICAgICAgeXlfc3RhdGUgPSB5eV9sZXhpY2FsX3N0YXRlOwotCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIGlmICh5eV9jdXJyZW50UG9zX2wgPCB5eV9lbmRSZWFkX2wpCi0gICAgICAgICAgICB5eV9pbnB1dCA9IHl5X2J1ZmZlcl9sW3l5X2N1cnJlbnRQb3NfbCsrXTsKLSAgICAgICAgICBlbHNlIGlmICh5eV9hdEVPRikgewotICAgICAgICAgICAgeXlfaW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLSAgICAgICAgICAgIHl5X2N1cnJlbnRQb3MgID0geXlfY3VycmVudFBvc19sOwotICAgICAgICAgICAgeXlfbWFya2VkUG9zICAgPSB5eV9tYXJrZWRQb3NfbDsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0geXlfcmVmaWxsKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdHJhbnNsYXRlZCBwb3NpdGlvbnMgYW5kIHBvc3NpYmx5IG5ldyBidWZmZXIKLSAgICAgICAgICAgIHl5X2N1cnJlbnRQb3NfbCAgPSB5eV9jdXJyZW50UG9zOwotICAgICAgICAgICAgeXlfbWFya2VkUG9zX2wgICA9IHl5X21hcmtlZFBvczsKLSAgICAgICAgICAgIHl5X2J1ZmZlcl9sICAgICAgPSB5eV9idWZmZXI7Ci0gICAgICAgICAgICB5eV9lbmRSZWFkX2wgICAgID0geXlfZW5kUmVhZDsKLSAgICAgICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgICAgeXlfaW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgICAgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHl5X2lucHV0ID0geXlfYnVmZmVyX2xbeXlfY3VycmVudFBvc19sKytdOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpbnQgeXlfbmV4dCA9IHl5dHJhbnNfbFsgeXlfcm93TWFwX2xbeXlfc3RhdGVdICsgeXljbWFwX2xbeXlfaW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHl5X25leHQgPT0gLTEpIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLSAgICAgICAgICBpbnQgeXlfYXR0cmlidXRlcyA9IHl5X2F0dHJfbFt5eV9zdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID09IDEgKSB7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3NfbCA9IHl5X2N1cnJlbnRQb3NfbDsgCi0gICAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgOCkgPT0gOCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgeXlfbWFya2VkUG9zID0geXlfbWFya2VkUG9zX2w7Ci0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7Ci0KLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyAgfQotICAgICAgICBjYXNlIDIxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODk6IAotICAgICAgICBjYXNlIDEyMzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7ICB9Ci0gICAgICAgIGNhc2UgMjIwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgNjI6IAotICAgICAgICBjYXNlIDYzOiAKLSAgICAgICAgY2FzZSA2NDogCi0gICAgICAgIGNhc2UgNjU6IAotICAgICAgICBjYXNlIDEwMjogCi0gICAgICAgIGNhc2UgMTAzOiAKLSAgICAgICAgY2FzZSAxMDQ6IAotICAgICAgICBjYXNlIDEzMzogCi0gICAgICAgIGNhc2UgMTM0OiAKLSAgICAgICAgY2FzZSAxMzU6IAotICAgICAgICBjYXNlIDE1NjogCi0gICAgICAgIGNhc2UgMTU3OiAKLSAgICAgICAgY2FzZSAxNTg6IAotICAgICAgICBjYXNlIDE3ODogCi0gICAgICAgIGNhc2UgMTc5OiAKLSAgICAgICAgY2FzZSAxODA6IAotICAgICAgICBjYXNlIDE5NjogCi0gICAgICAgIGNhc2UgMTk3OiAKLSAgICAgICAgY2FzZSAyMDc6IAotICAgICAgICBjYXNlIDIwODogCi0gICAgICAgIGNhc2UgMjE1OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjIxOiBicmVhazsKLSAgICAgICAgY2FzZSA1MTogCi0gICAgICAgIGNhc2UgNTI6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMjI6IGJyZWFrOwotICAgICAgICBjYXNlIDIwNTogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDIyMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk0OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyMjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDE5MTogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjI1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQ09NTUVOVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpOyAgfQotICAgICAgICBjYXNlIDIyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQVRUUklCVVRFX05BTUUpOyAgfQotICAgICAgICBjYXNlIDIyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRVhURVJOQUxJRF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyAgfQotICAgICAgICBjYXNlIDIyODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA2OiAKLSAgICAgICAgY2FzZSAxMzY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsgIH0KLSAgICAgICAgY2FzZSAyMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDEwMDogCi0gICAgICAgIGNhc2UgMTMyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCk7ICB9Ci0gICAgICAgIGNhc2UgMjMwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMDI6IAotICAgICAgICBjYXNlIDIxNjogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKTsgIH0KLSAgICAgICAgY2FzZSAyMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDE4OTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyMzI6IGJyZWFrOwotICAgICAgICBjYXNlIDE4ODogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNZU1RFTV9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyMzM6IGJyZWFrOwotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgY2FzZSA3MTogCi0gICAgICAgIGNhc2UgNzI6IAotICAgICAgICBjYXNlIDczOiAKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgIGNhc2UgMTA4OiAKLSAgICAgICAgY2FzZSAxMDk6IAotICAgICAgICBjYXNlIDExMDogCi0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgY2FzZSAxMzc6IAotICAgICAgICBjYXNlIDEzODogCi0gICAgICAgIGNhc2UgMTM5OiAKLSAgICAgICAgY2FzZSAxNDA6IAotICAgICAgICBjYXNlIDE1OTogCi0gICAgICAgIGNhc2UgMTYwOiAKLSAgICAgICAgY2FzZSAxNjE6IAotICAgICAgICBjYXNlIDE2MjogCi0gICAgICAgIGNhc2UgMTgxOiAKLSAgICAgICAgY2FzZSAxODM6IAotICAgICAgICBjYXNlIDE4NDogCi0gICAgICAgIGNhc2UgMjAwOiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQ6IAotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgY2FzZSAzNzogCi0gICAgICAgIGNhc2UgODE6IAotICAgICAgICBjYXNlIDgyOiAKLSAgICAgICAgY2FzZSAxMTY6IAotICAgICAgICBjYXNlIDExNzogCi0gICAgICAgIGNhc2UgMTQzOiAKLSAgICAgICAgY2FzZSAxNDQ6IAotICAgICAgICBjYXNlIDE2NTogCi0gICAgICAgIGNhc2UgMTY2OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMzU6IGJyZWFrOwotICAgICAgICBjYXNlIDc6IAotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICBjYXNlIDg1OiAKLSAgICAgICAgY2FzZSA4NjogCi0gICAgICAgIGNhc2UgODc6IAotICAgICAgICBjYXNlIDExOTogCi0gICAgICAgIGNhc2UgMTIwOiAKLSAgICAgICAgY2FzZSAxMjE6IAotICAgICAgICBjYXNlIDE0NTogCi0gICAgICAgIGNhc2UgMTQ2OiAKLSAgICAgICAgY2FzZSAxNDc6IAotICAgICAgICBjYXNlIDE2ODogCi0gICAgICAgIGNhc2UgMTY5OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMzY6IGJyZWFrOwotICAgICAgICBjYXNlIDk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIzNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIzODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgY2FzZSA0NjogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjM5OiBicmVhazsKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjQwOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTg6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5GSVhFRF9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNDE6IGJyZWFrOwotICAgICAgICBjYXNlIDIxNDogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNDI6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMjogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OTVRPS0VOU19LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNDM6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMTogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVElFU19LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOTogCi0gICAgICAgICAgeyAgeXliZWdpbihOT1RBVElPTl9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRyk7ICB9Ci0gICAgICAgIGNhc2UgMjQ1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUTElTVF9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKTsgIH0KLSAgICAgICAgY2FzZSAyNDY6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OTogCi0gICAgICAgICAgeyAgeXliZWdpbihFTEVNRU5UX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOyAgfQotICAgICAgICBjYXNlIDI0NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEVOVElUWV9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOyAgfQotICAgICAgICBjYXNlIDI0ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKE5EQVRBX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjQ5OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTE6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSk7ICB9Ci0gICAgICAgIGNhc2UgMjUwOiBicmVhazsKLSAgICAgICAgY2FzZSA5NDogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNTE6IGJyZWFrOwotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSk7ICB9Ci0gICAgICAgIGNhc2UgMjUyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKTsgIH0KLSAgICAgICAgY2FzZSAyNTM6IGJyZWFrOwotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7ICB9Ci0gICAgICAgIGNhc2UgMjU0OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgIGNhc2UgNDk6IAotICAgICAgICBjYXNlIDUwOiAKLSAgICAgICAgY2FzZSA1NDogCi0gICAgICAgIGNhc2UgNTU6IAotICAgICAgICBjYXNlIDU2OiAKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgY2FzZSA5MTogCi0gICAgICAgIGNhc2UgOTI6IAotICAgICAgICBjYXNlIDkzOiAKLSAgICAgICAgY2FzZSA5NTogCi0gICAgICAgIGNhc2UgOTY6IAotICAgICAgICBjYXNlIDk3OiAKLSAgICAgICAgY2FzZSA5ODogCi0gICAgICAgIGNhc2UgMTI0OiAKLSAgICAgICAgY2FzZSAxMjU6IAotICAgICAgICBjYXNlIDEyNjogCi0gICAgICAgIGNhc2UgMTI3OiAKLSAgICAgICAgY2FzZSAxMjg6IAotICAgICAgICBjYXNlIDEyOTogCi0gICAgICAgIGNhc2UgMTMwOiAKLSAgICAgICAgY2FzZSAxMzE6IAotICAgICAgICBjYXNlIDE0ODogCi0gICAgICAgIGNhc2UgMTQ5OiAKLSAgICAgICAgY2FzZSAxNTA6IAotICAgICAgICBjYXNlIDE1MTogCi0gICAgICAgIGNhc2UgMTUyOiAKLSAgICAgICAgY2FzZSAxNTM6IAotICAgICAgICBjYXNlIDE1NDogCi0gICAgICAgIGNhc2UgMTU1OiAKLSAgICAgICAgY2FzZSAxNzA6IAotICAgICAgICBjYXNlIDE3MTogCi0gICAgICAgIGNhc2UgMTcyOiAKLSAgICAgICAgY2FzZSAxNzU6IAotICAgICAgICBjYXNlIDE3NjogCi0gICAgICAgIGNhc2UgMTc3OiAKLSAgICAgICAgY2FzZSAxOTA6IAotICAgICAgICBjYXNlIDE5MjogCi0gICAgICAgIGNhc2UgMTkzOiAKLSAgICAgICAgY2FzZSAxOTU6IAotICAgICAgICBjYXNlIDIwNDogCi0gICAgICAgIGNhc2UgMjA2OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBBUk1fRU5USVRZX1RZUEUpOyAgfQotICAgICAgICBjYXNlIDI1NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKTsgIH0KLSAgICAgICAgY2FzZSAyNTY6IGJyZWFrOwotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pOyAgfQotICAgICAgICBjYXNlIDI1NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDQ6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgIH0KLSAgICAgICAgY2FzZSAyNTg6IGJyZWFrOwotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7ICB9Ci0gICAgICAgIGNhc2UgMjU5OiBicmVhazsKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRSSUJVVEVfRU5VTUVSQVRJT04pOyAgfQotICAgICAgICBjYXNlIDI2MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjc6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKTsgIH0KLSAgICAgICAgY2FzZSAyNjE6IGJyZWFrOwotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKTsgIH0KLSAgICAgICAgY2FzZSAyNjI6IGJyZWFrOwotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5VTV9DSE9JQ0UpOyAgfQotICAgICAgICBjYXNlIDI2MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRU5USVRZX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjY0OiBicmVhazsKLSAgICAgICAgY2FzZSA0NzogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjY1OiBicmVhazsKLSAgICAgICAgY2FzZSAxODc6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oRVhURVJOQUxJRF9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyNjY6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMzogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfRU5VTUVSQVRJT04pOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjY3OiBicmVhazsKLSAgICAgICAgY2FzZSAxNzQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjY4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNzM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjY5OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlJFUVVJUkVEX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCk7ICB9Ci0gICAgICAgIGNhc2UgMjcxOiBicmVhazsKLSAgICAgICAgY2FzZSA4NDogCi0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpOyAgfQotICAgICAgICBjYXNlIDI3MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzk6IAotICAgICAgICBjYXNlIDExNTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsgIH0KLSAgICAgICAgY2FzZSAyNzM6IGJyZWFrOwotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICBjYXNlIDExMzogCi0gICAgICAgIGNhc2UgMTQxOiAKLSAgICAgICAgY2FzZSAxNjM6IAotICAgICAgICBjYXNlIDE4NTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyAgfQotICAgICAgICBjYXNlIDI3NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKTsgIH0KLSAgICAgICAgY2FzZSAyNzU6IGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyAgfQotICAgICAgICBjYXNlIDI3NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TVEFSVF9UQUcpOyAgfQotICAgICAgICBjYXNlIDI3NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TRU1JQ09MT04pOyAgfQotICAgICAgICBjYXNlIDI3ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT05ORUNUT1IpOyAgfQotICAgICAgICBjYXNlIDI3OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsgIH0KLSAgICAgICAgY2FzZSAyODA6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5EX1RBRyk7ICB9Ci0gICAgICAgIGNhc2UgMjgxOiBicmVhazsKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBFUkNFTlQpOyAgfQotICAgICAgICBjYXNlIDI4MjogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1Rva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9Ub2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWFmZTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1Rva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplcjsKLQotcHVibGljIGNsYXNzIFRva2VuIGV4dGVuZHMgWXl0b2tlbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVF9TVEFSVCA9IDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVE9SID0gNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX0FOWSA9IDQzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfRU1QVFkgPSA0MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1BDREFUQSA9IDQ0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfQ09OVEVOVCA9IDQxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9UQUcgPSA0MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRfVEFHID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfQ09OVEVOVCA9IDMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9QQVJNID0gMzE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfVEFHID0gMzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhDTEFNQVRJT04gPSA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfUEFSRU4gPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUUgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVEFUSU9OX0NPTlRFTlQgPSAyMTsKLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UQVRJT05fVEFHID0gMjA7Ci0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0NIT0lDRSA9IDU7Ci0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9TRVFVRU5DRSA9IDY7Ci0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0NDVVJfT1BUSU9OQUwgPSA3OwotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DQ1VSX09ORV9PUl9NT1JFID0gODsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQ0NVUl9aRVJPX09SX01PUkUgPSA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DQ1VSX1RZUEUgPSA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUX1BBUkVOID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9UQUcgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdISVRFU1BBQ0UgPSA1OwotCi0KLQlwdWJsaWMgVG9rZW4oU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIodHlwZSk7Ci0JfQotCi0JcHVibGljIFRva2VuKFN0cmluZyB0eXBlLCBTdHJpbmcgdGV4dCwgaW50IGxpbmUsIGludCBjaGFyQmVnaW4sIGludCBsZW5ndGgpIHsKLQkJc3VwZXIodHlwZSwgdGV4dCwgbGluZSwgY2hhckJlZ2luLCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyBUb2tlbiBjcmVhdGVDb3B5KCkgewotCQlUb2tlbiBjb3B5ID0gbmV3IFRva2VuKGdldFR5cGUoKSwgZ2V0VGV4dCgpLCBnZXRTdGFydExpbmUoKSwgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0TGVuZ3RoKCkpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1l5dG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1l5dG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0Nzk5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9ZeXRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplcjsKLQotY2xhc3MgWXl0b2tlbiB7Ci0JcHVibGljIGludCBtX2NoYXJCZWdpbjsKLQlwdWJsaWMgaW50IG1fbGVuZ3RoOwotCXB1YmxpYyBpbnQgbV9saW5lOwotCXB1YmxpYyBTdHJpbmcgbV90ZXh0OwotCXB1YmxpYyBTdHJpbmcgbV90eXBlOwotCi0JWXl0b2tlbihTdHJpbmcgdHlwZSkgewotCQltX3R5cGUgPSB0eXBlOwotCX0KLQotCVl5dG9rZW4oU3RyaW5nIHR5cGUsIFN0cmluZyB0ZXh0LCBpbnQgbGluZSwgaW50IGNoYXJCZWdpbiwgaW50IGxlbmd0aCkgewotCQltX3R5cGUgPSB0eXBlOwotCQltX3RleHQgPSBuZXcgU3RyaW5nKHRleHQpOwotCQltX2xpbmUgPSBsaW5lOwotCQltX2NoYXJCZWdpbiA9IGNoYXJCZWdpbjsKLQkJbV9sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlpbnQgc3RyaW5nU3RhcnQgPSBzdGFydCAtIG1fY2hhckJlZ2luOwotCQlTdHJpbmcgb2xkU3RyaW5nID0gbV90ZXh0OwotCQltX3RleHQgPSBvbGRTdHJpbmcuc3Vic3RyaW5nKDAsIHN0cmluZ1N0YXJ0KTsKLQkJbV90ZXh0ICs9IG9sZFN0cmluZy5zdWJzdHJpbmcoc3RyaW5nU3RhcnQgKyBsZW5ndGgpOwotCi0JCW1fbGVuZ3RoID0gbV90ZXh0Lmxlbmd0aCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5ldyBzdHJpbmcgPSAiICsgbV90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKFl5dG9rZW4gb3RoZXIpIHsKLQkJcmV0dXJuIG1fdHlwZSA9PSBvdGhlci5nZXRUeXBlKCkgJiYgbV90ZXh0LmVxdWFscyhvdGhlci5nZXRUZXh0KCkpICYmIG1fbGluZSA9PSBvdGhlci5nZXRTdGFydExpbmUoKSAmJiBtX2NoYXJCZWdpbiA9PSBvdGhlci5nZXRTdGFydE9mZnNldCgpICYmIG1fbGVuZ3RoID09IG90aGVyLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gbV9jaGFyQmVnaW4gKyBtX2xlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIG1fbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRMaW5lKCkgewotCQlyZXR1cm4gbV9saW5lOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBtX2NoYXJCZWdpbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBtX3RleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gbV90eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCBzdGFydE9mZnNldCkgewotCQltX2NoYXJCZWdpbiA9IHN0YXJ0T2Zmc2V0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiVGV4dCAgIDogIiArIG1fdGV4dCArICJcbnR5cGUgOiAiICsgbV90eXBlICsgIlxubGluZSAgOiAiICsgbV9saW5lICsgIlxuY0JlZy4gOiAiICsgbV9jaGFyQmVnaW4gKyAiXG5jRW5kLiA6ICIgKyBnZXRFbmRPZmZzZXQoKSArICJcbmNMZW5ndGguIDogIiArIG1fbGVuZ3RoOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZU9mZnNldChpbnQgZGVsdGEpIHsKLQkJbV9jaGFyQmVnaW4gKz0gZGVsdGE7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlVGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQltX3RleHQgPSBuZXdUZXh0OwotCQltX2xlbmd0aCA9IG5ld1RleHQubGVuZ3RoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvZHRkLmZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGQuZmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhMTRhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGQuZmxleAorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci0KLS8qKiAKLSAqIEdlbmVyYXRlIHdpdGggImR0ZHNrZWxldG9uIi4KLSAqCi0gKiBJdCByZW1vdmVzIHNvbWUgdW51c2VkIGZpZWxkcyBhbmQgYXZvaWRzIHNvbWUgY29tcGlsZXIgd2FybmluZ3MgCi0gKi8KLQotJSUKLQotJXsKLQlpbnQgbm9kZV9jb3VudCA9IDA7Ci0JU3RyaW5nIGN1cnJlbnRTdHJpbmc7Ci0KLQlwcml2YXRlIFRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBuZXcgVG9rZW4odHlwZSwgeXl0ZXh0KCksIHl5bGluZSwgeXljaGFyICsgc3RhcnRPZmZzZXQsIHl5bGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRoaXMuc3RhcnRPZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZShpbnQgbGluZSkgewotCQl0aGlzLnl5bGluZSA9IGxpbmU7Ci0JfQotJX0KLQotJWNsYXNzIERURFRva2VuaXplcgotJXB1YmxpYwotJXVuaWNvZGUKLSVjaGFyCi0KLSVzdGF0ZSBOT0RFCi0lc3RhdGUgRUxFTUVOVF9OQU1FCi0lc3RhdGUgRUxFTUVOVF9DT05URU5UCi0lc3RhdGUgRUxFTUVOVF9NSVhFRF9PUl9DSElMRAotJXN0YXRlIEVMRU1FTlRfTUlYRUQKLSVzdGF0ZSBFTEVNRU5UX0NISUxECi0lc3RhdGUgRU5USVRZX05BTUUKLSVzdGF0ZSBFTlRJVFlfQ09OVEVOVAotJXN0YXRlIE5EQVRBX0NPTlRFTlQKLQotJXN0YXRlIE5PVEFUSU9OX05BTUUKLSVzdGF0ZSBFWFRFUk5BTElEX0NPTlRFTlQKLQotJXN0YXRlIENPTU1FTlRfQ09OVEVOVAotJXN0YXRlIEFUVExJU1RfTkFNRQotJXN0YXRlIEFUVExJU1RfQ09OVEVOVAotJXN0YXRlIEFUVFJJQlVURV9DT05URU5UCi0lc3RhdGUgQVRUUklCVVRFX0RFRkFVTFQKLSVzdGF0ZSBBVFRSSUJVVEVfRU5VTUVSQVRJT04KLQotCi1BTFBIQT1bQS1aYS16XQotRElHSVQ9WzAtOV0KLU5PTk5FV0xJTkVfV0hJVEVfU1BBQ0VfQ0hBUj1bXCBcdFxiXDAxMl0KLVNUUklOR19URVhUPShcXFwifFteXG5cclwiXXxcXHtXSElURV9TUEFDRV9DSEFSfStcXCkqCi1DT01NRU5UX1RFWFQ9KFteKi9cbl18W14qXG5dIi8iW14qXG5dfFteL1xuXSIqIlteL1xuXXwiKiJbXi9cbl18Ii8iW14qXG5dKSoKLUlkZW50ID0ge0FMUEhBfSh7QUxQSEF9fHtESUdJVH18XykqCi1JbnB1dENoYXJhY3RlciA9IFteXHJcbl0KLQotTGluZVRlcm1pbmF0b3IgPSBccnxcbnxcclxuCi0KLS8qIDMgLSBXaGl0ZSBTcGFjZSAqLwotUyAgICAgICAgICAgICAgPSAgICAoXHgyMCB8IFx4MDkgfCBceDBEIHwgXHgwQSkrCi1Ob25MaW5lVGVybWluYXRvcldoaXRlc3BhY2UgPSAoXHgyMCB8IFx4MDkpKwotCi1XaGl0ZVNwYWNlICAgICA9IHtMaW5lVGVybWluYXRvcn0gfCBbIFx0XGZdCi0KLS8qIDg0ICovCi0vKkxldHRlciAgICAgICAgID0gICAge0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30KLQotLyogODUgKi8KLUJhc2VDaGFyICAgICAgID0gICAgW1x1MDA0MS1cdTAwNUFdIHwgW1x1MDA2MS1cdTAwN0FdIHwgW1x1MDBDMC1cdTAwRDZdIHwgW1x1MDBEOC1cdTAwRjZdIHwgW1x1MDBGOC1cdTAwRkZdIHwgW1x1MDEwMC1cdTAxMzFdIHwgW1x1MDEzNC1cdTAxM0VdIHwgW1x1MDE0MS1cdTAxNDhdIHwgW1x1MDE0QS1cdTAxN0VdIHwgW1x1MDE4MC1cdTAxQzNdIHwgW1x1MDFDRC1cdTAxRjBdIHwgW1x1MDFGNC1cdTAxRjVdIHwgW1x1MDFGQS1cdTAyMTddIHwgW1x1MDI1MC1cdTAyQThdIHwgW1x1MDJCQi1cdTAyQzFdIHwgXHUwMzg2IHwgW1x1MDM4OC1cdTAzOEFdIHwgXHUwMzhDIHwgW1x1MDM4RS1cdTAzQTFdIHwgW1x1MDNBMy1cdTAzQ0VdIHwgW1x1MDNEMC1cdTAzRDZdIHwgXHUwM0RBIHwgXHUwM0RDIHwgXHUwM0RFIHwgXHUwM0UwIHwgW1x1MDNFMi1cdTAzRjNdIHwgW1x1MDQwMS1cdTA0MENdIHwgW1x1MDQwRS1cdTA0NEZdIHwgW1x1MDQ1MS1cdTA0NUNdIHwgW1x1MDQ1RS1cdTA0ODFdIHwgW1x1MDQ5MC1cdTA0QzRdIHwgW1x1MDRDNy1cdTA0QzhdIHwgW1x1MDRDQi1cdTA0Q0NdIHwgW1x1MDREMC1cdTA0RUJdIHwgW1x1MDRFRS1cdTA0RjVdIHwgW1x1MDRGOC1cdTA0RjldIHwgW1x1MDUzMS1cdTA1NTZdIHwgXHUwNTU5IHwgW1x1MDU2MS1cdTA1ODZdIHwgW1x1MDVEMC1cdTA1RUFdIHwgW1x1MDVGMC1cdTA1RjJdIHwgW1x1MDYyMS1cdTA2M0FdIHwgW1x1MDY0MS1cdTA2NEFdIHwgW1x1MDY3MS1cdTA2QjddIHwgW1x1MDZCQS1cdTA2QkVdIHwgW1x1MDZDMC1cdTA2Q0VdIHwgW1x1MDZEMC1cdTA2RDNdIHwgXHUwNkQ1IHwgW1x1MDZFNS1cdTA2RTZdIHwgW1x1MDkwNS1cdTA5MzldIHwgXHUwOTNEIHwgW1x1MDk1OC1cdTA5NjFdIHwgW1x1MDk4NS1cdTA5OENdIHwgW1x1MDk4Ri1cdTA5OTBdIHwgW1x1MDk5My1cdTA5QThdIHwgW1x1MDlBQS1cdTA5QjBdIHwgXHUwOUIyIHwgW1x1MDlCNi1cdTA5QjldIHwgW1x1MDlEQy1cdTA5RERdIHwgW1x1MDlERi1cdTA5RTFdIHwgW1x1MDlGMC1cdTA5RjFdIHwgW1x1MEEwNS1cdTBBMEFdIHwgW1x1MEEwRi1cdTBBMTBdIHwgW1x1MEExMy1cdTBBMjhdIHwgW1x1MEEyQS1cdTBBMzBdIHwgW1x1MEEzMi1cdTBBMzNdIHwgW1x1MEEzNS1cdTBBMzZdIHwgW1x1MEEzOC1cdTBBMzldIHwgW1x1MEE1OS1cdTBBNUNdIHwgXHUwQTVFIHwgW1x1MEE3Mi1cdTBBNzRdIHwgW1x1MEE4NS1cdTBBOEJdIHwgXHUwQThEIHwgW1x1MEE4Ri1cdTBBOTFdIHwgW1x1MEE5My1cdTBBQThdIHwgW1x1MEFBQS1cdTBBQjBdIHwgW1x1MEFCMi1cdTBBQjNdIHwgW1x1MEFCNS1cdTBBQjldIHwgXHUwQUJEIHwgXHUwQUUwIHwgW1x1MEIwNS1cdTBCMENdIHwgW1x1MEIwRi1cdTBCMTBdIHwgW1x1MEIxMy1cdTBCMjhdIHwgW1x1MEIyQS1cdTBCMzBdIHwgW1x1MEIzMi1cdTBCMzNdIHwgW1x1MEIzNi1cdTBCMzldIHwgXHUwQjNEIHwgW1x1MEI1Qy1cdTBCNURdIHwgW1x1MEI1Ri1cdTBCNjFdIHwgW1x1MEI4NS1cdTBCOEFdIHwgW1x1MEI4RS1cdTBCOTBdIHwgW1x1MEI5Mi1cdTBCOTVdIHwgW1x1MEI5OS1cdTBCOUFdIHwgXHUwQjlDIHwgW1x1MEI5RS1cdTBCOUZdIHwgW1x1MEJBMy1cdTBCQTRdIHwgW1x1MEJBOC1cdTBCQUFdIHwgW1x1MEJBRS1cdTBCQjVdIHwgW1x1MEJCNy1cdTBCQjldIHwgW1x1MEMwNS1cdTBDMENdIHwgW1x1MEMwRS1cdTBDMTBdIHwgW1x1MEMxMi1cdTBDMjhdIHwgW1x1MEMyQS1cdTBDMzNdIHwgW1x1MEMzNS1cdTBDMzldIHwgW1x1MEM2MC1cdTBDNjFdIHwgW1x1MEM4NS1cdTBDOENdIHwgW1x1MEM4RS1cdTBDOTBdIHwgW1x1MEM5Mi1cdTBDQThdIHwgW1x1MENBQS1cdTBDQjNdIHwgW1x1MENCNS1cdTBDQjldIHwgXHUwQ0RFIHwgW1x1MENFMC1cdTBDRTFdIHwgW1x1MEQwNS1cdTBEMENdIHwgW1x1MEQwRS1cdTBEMTBdIHwgW1x1MEQxMi1cdTBEMjhdIHwgW1x1MEQyQS1cdTBEMzldIHwgW1x1MEQ2MC1cdTBENjFdIHwgW1x1MEUwMS1cdTBFMkVdIHwgXHUwRTMwIHwgW1x1MEUzMi1cdTBFMzNdIHwgW1x1MEU0MC1cdTBFNDVdIHwgW1x1MEU4MS1cdTBFODJdIHwgXHUwRTg0IHwgW1x1MEU4Ny1cdTBFODhdIHwgXHUwRThBIHwgXHUwRThEIHwgW1x1MEU5NC1cdTBFOTddIHwgW1x1MEU5OS1cdTBFOUZdIHwgW1x1MEVBMS1cdTBFQTNdIHwgXHUwRUE1IHwgXHUwRUE3IHwgW1x1MEVBQS1cdTBFQUJdIHwgW1x1MEVBRC1cdTBFQUVdIHwgXHUwRUIwIHwgW1x1MEVCMi1cdTBFQjNdIHwgXHUwRUJEIHwgW1x1MEVDMC1cdTBFQzRdIHwgW1x1MEY0MC1cdTBGNDddIHwgW1x1MEY0OS1cdTBGNjldIHwgW1x1MTBBMC1cdTEwQzVdIHwgW1x1MTBEMC1cdTEwRjZdIHwgXHUxMTAwIHwgW1x1MTEwMi1cdTExMDNdIHwgW1x1MTEwNS1cdTExMDddIHwgXHUxMTA5IHwgW1x1MTEwQi1cdTExMENdIHwgW1x1MTEwRS1cdTExMTJdIHwgXHUxMTNDIHwgXHUxMTNFIHwgXHUxMTQwIHwgXHUxMTRDIHwgXHUxMTRFIHwgXHUxMTUwIHwgW1x1MTE1NC1cdTExNTVdIHwgXHUxMTU5IHwgW1x1MTE1Ri1cdTExNjFdIHwgXHUxMTYzIHwgXHUxMTY1IHwgXHUxMTY3IHwgXHUxMTY5IHwgW1x1MTE2RC1cdTExNkVdIHwgW1x1MTE3Mi1cdTExNzNdIHwgXHUxMTc1IHwgXHUxMTlFIHwgXHUxMUE4IHwgXHUxMUFCIHwgW1x1MTFBRS1cdTExQUZdIHwgW1x1MTFCNy1cdTExQjhdIHwgXHUxMUJBIHwgW1x1MTFCQy1cdTExQzJdIHwgXHUxMUVCIHwgXHUxMUYwIHwgXHUxMUY5IHwgW1x1MUUwMC1cdTFFOUJdIHwgW1x1MUVBMC1cdTFFRjldIHwgW1x1MUYwMC1cdTFGMTVdIHwgW1x1MUYxOC1cdTFGMURdIHwgW1x1MUYyMC1cdTFGNDVdIHwgW1x1MUY0OC1cdTFGNERdIHwgW1x1MUY1MC1cdTFGNTddIHwgXHUxRjU5IHwgXHUxRjVCIHwgXHUxRjVEIHwgW1x1MUY1Ri1cdTFGN0RdIHwgW1x1MUY4MC1cdTFGQjRdIHwgW1x1MUZCNi1cdTFGQkNdIHwgXHUxRkJFIHwgW1x1MUZDMi1cdTFGQzRdIHwgW1x1MUZDNi1cdTFGQ0NdIHwgW1x1MUZEMC1cdTFGRDNdIHwgW1x1MUZENi1cdTFGREJdIHwgW1x1MUZFMC1cdTFGRUNdIHwgW1x1MUZGMi1cdTFGRjRdIHwgW1x1MUZGNi1cdTFGRkNdIHwgXHUyMTI2IHwgW1x1MjEyQS1cdTIxMkJdIHwgXHUyMTJFIHwgW1x1MjE4MC1cdTIxODJdIHwgW1x1MzA0MS1cdTMwOTRdIHwgW1x1MzBBMS1cdTMwRkFdIHwgW1x1MzEwNS1cdTMxMkNdIHwgW1x1QUMwMC1cdUQ3QTNdICAKLQotLyogODYgKi8KLUlkZW9ncmFwaGljICAgID0gICAgW1x1NEUwMC1cdTlGQTVdIHwgXHUzMDA3IHwgW1x1MzAyMS1cdTMwMjldICAKLQotLyogNCAqLyAgLyogaXMgJy4nIHRvIGJlIGVzY2FwZWQ/PyAqLwotTmFtZUNoYXIgICAgICAgPSAgICB7TGV0dGVyfSB8IHtEaWdpdH0gfCAuIHwgLSB8IF8gfCA6IHwge0NvbWJpbmluZ0NoYXJ9IHwge0V4dGVuZGVyfQotCi0vKiA1ICovCi1OYW1lICAgICAgICAgICA9ICh7TGV0dGVyfSB8IF8gfCA6KSB7TmFtZUNoYXJ9KiAKLQotLyogODcgKi8KLUNvbWJpbmluZ0NoYXIgID0gICAgW1x1MDMwMC1cdTAzNDVdIHwgW1x1MDM2MC1cdTAzNjFdIHwgW1x1MDQ4My1cdTA0ODZdIHwgW1x1MDU5MS1cdTA1QTFdIHwgW1x1MDVBMy1cdTA1QjldIHwgW1x1MDVCQi1cdTA1QkRdIHwgXHUwNUJGIHwgW1x1MDVDMS1cdTA1QzJdIHwgXHUwNUM0IHwgW1x1MDY0Qi1cdTA2NTJdIHwgXHUwNjcwIHwgW1x1MDZENi1cdTA2RENdIHwgW1x1MDZERC1cdTA2REZdIHwgW1x1MDZFMC1cdTA2RTRdIHwgW1x1MDZFNy1cdTA2RThdIHwgW1x1MDZFQS1cdTA2RURdIHwgW1x1MDkwMS1cdTA5MDNdIHwgXHUwOTNDIHwgW1x1MDkzRS1cdTA5NENdIHwgXHUwOTREIHwgW1x1MDk1MS1cdTA5NTRdIHwgW1x1MDk2Mi1cdTA5NjNdIHwgW1x1MDk4MS1cdTA5ODNdIHwgXHUwOUJDIHwgXHUwOUJFIHwgXHUwOUJGIHwgW1x1MDlDMC1cdTA5QzRdIHwgW1x1MDlDNy1cdTA5QzhdIHwgW1x1MDlDQi1cdTA5Q0RdIHwgXHUwOUQ3IHwgW1x1MDlFMi1cdTA5RTNdIHwgXHUwQTAyIHwgXHUwQTNDIHwgXHUwQTNFIHwgXHUwQTNGIHwgW1x1MEE0MC1cdTBBNDJdIHwgW1x1MEE0Ny1cdTBBNDhdIHwgW1x1MEE0Qi1cdTBBNERdIHwgW1x1MEE3MC1cdTBBNzFdIHwgW1x1MEE4MS1cdTBBODNdIHwgXHUwQUJDIHwgW1x1MEFCRS1cdTBBQzVdIHwgW1x1MEFDNy1cdTBBQzldIHwgW1x1MEFDQi1cdTBBQ0RdIHwgW1x1MEIwMS1cdTBCMDNdIHwgXHUwQjNDIHwgW1x1MEIzRS1cdTBCNDNdIHwgW1x1MEI0Ny1cdTBCNDhdIHwgW1x1MEI0Qi1cdTBCNERdIHwgW1x1MEI1Ni1cdTBCNTddIHwgW1x1MEI4Mi1cdTBCODNdIHwgW1x1MEJCRS1cdTBCQzJdIHwgW1x1MEJDNi1cdTBCQzhdIHwgW1x1MEJDQS1cdTBCQ0RdIHwgXHUwQkQ3IHwgW1x1MEMwMS1cdTBDMDNdIHwgW1x1MEMzRS1cdTBDNDRdIHwgW1x1MEM0Ni1cdTBDNDhdIHwgW1x1MEM0QS1cdTBDNERdIHwgW1x1MEM1NS1cdTBDNTZdIHwgW1x1MEM4Mi1cdTBDODNdIHwgW1x1MENCRS1cdTBDQzRdIHwgW1x1MENDNi1cdTBDQzhdIHwgW1x1MENDQS1cdTBDQ0RdIHwgW1x1MENENS1cdTBDRDZdIHwgW1x1MEQwMi1cdTBEMDNdIHwgW1x1MEQzRS1cdTBENDNdIHwgW1x1MEQ0Ni1cdTBENDhdIHwgW1x1MEQ0QS1cdTBENERdIHwgXHUwRDU3IHwgXHUwRTMxIHwgW1x1MEUzNC1cdTBFM0FdIHwgW1x1MEU0Ny1cdTBFNEVdIHwgXHUwRUIxIHwgW1x1MEVCNC1cdTBFQjldIHwgW1x1MEVCQi1cdTBFQkNdIHwgW1x1MEVDOC1cdTBFQ0RdIHwgW1x1MEYxOC1cdTBGMTldIHwgXHUwRjM1IHwgXHUwRjM3IHwgXHUwRjM5IHwgXHUwRjNFIHwgXHUwRjNGIHwgW1x1MEY3MS1cdTBGODRdIHwgW1x1MEY4Ni1cdTBGOEJdIHwgW1x1MEY5MC1cdTBGOTVdIHwgXHUwRjk3IHwgW1x1MEY5OS1cdTBGQURdIHwgW1x1MEZCMS1cdTBGQjddIHwgXHUwRkI5IHwgW1x1MjBEMC1cdTIwRENdIHwgXHUyMEUxIHwgW1x1MzAyQS1cdTMwMkZdIHwgXHUzMDk5IHwgXHUzMDlBICAKLQotLyogODggKi8KLURpZ2l0ICAgICAgICAgID0gICAgW1x1MDAzMC1cdTAwMzldIHwgW1x1MDY2MC1cdTA2NjldIHwgW1x1MDZGMC1cdTA2RjldIHwgW1x1MDk2Ni1cdTA5NkZdIHwgW1x1MDlFNi1cdTA5RUZdIHwgW1x1MEE2Ni1cdTBBNkZdIHwgW1x1MEFFNi1cdTBBRUZdIHwgW1x1MEI2Ni1cdTBCNkZdIHwgW1x1MEJFNy1cdTBCRUZdIHwgW1x1MEM2Ni1cdTBDNkZdIHwgW1x1MENFNi1cdTBDRUZdIHwgW1x1MEQ2Ni1cdTBENkZdIHwgW1x1MEU1MC1cdTBFNTldIHwgW1x1MEVEMC1cdTBFRDldIHwgW1x1MEYyMC1cdTBGMjldICAKLQotLyogODkgKi8KLUV4dGVuZGVyICAgICAgID0gICAgXHUwMEI3IHwgXHUwMkQwIHwgXHUwMkQxIHwgXHUwMzg3IHwgXHUwNjQwIHwgXHUwRTQ2IHwgXHUwRUM2IHwgXHUzMDA1IHwgW1x1MzAzMS1cdTMwMzVdIHwgW1x1MzA5RC1cdTMwOUVdIHwgW1x1MzBGQy1cdTMwRkVdICAKLSovCi0KLUxldHRlciAgICAgICAgID0gW2EtekEtWl0KLU5hbWVDaGFyICAgICAgID0ge0xldHRlcn0gfCBbMC05XQotLy9OYW1lICAgICAgICAgICA9ICh7TGV0dGVyfSB8IF8gfCA6KSB7TmFtZUNoYXJ9KiAKLS8vTmFtZSAgICAgICAgICAgPSBbXlx4MjBceDA5XHgwRFx4MEFdKwotTmFtZSAgICAgICAgICAgPSBbXlx4MjBceDA5XHgwRFx4MEFcfCxcIVw/XCtcKlwoXCk8Pl0rCi1FbGVtZW50UmVmTmFtZSA9IFteXHgyMFx4MDlceDBEXHgwQVx8LFw/XCtcKlwoXCk8Pl0rCi1FbnRpdHlOYW1lICAgICA9IFteXHgyMFx4MDlceDBEXHgwQVx8LFw/XCpcKFwpPD5dKwotUGFybUVudGl0eU5hbWUgPSBbXlx4MjBceDA5XHgwRFx4MEFcISU7PD5dKwotCi1Db21tZW50U3RhcnQgICA9IFwhLS0KLUNvbW1lbnRDb250ZW50ID0gW14tPl0rCi1Db21tZW50RW5kICAgICA9IC0tPgotRWxlbWVudFN0YXJ0ICAgPSBFTEVNRU5UCi1FbGVtZW50Q29udGVudCA9IFtePD5dKgotCi1FbnRpdHlTdGFydCAgICA9IEVOVElUWQotRW50aXR5X1Bhcm0gICAgPSAle1N9Ci1FbnRpdHlDb250ZW50ICA9IHtTfVtePD5dKgotCi1Ob3RhdGlvblN0YXJ0ICA9IE5PVEFUSU9OCi1Ob3RhdGlvbkNvbnRlbnQgPSB7U31bXjw+XSoKLUF0dExpc3QgICAgICAgID0gQVRUTElTVAotRXh0ZXJuYWxQYXJtRW50aXR5UmVmID0gJXtQYXJtRW50aXR5TmFtZX07Ci1FbmRUYWcgICAgICAgICA9ID4KLVN0YXJ0VGFnICAgICAgID0gPAotU3lzdGVtICAgICAgICAgPSBTWVNURU0KLVB1YmxpYyAgICAgICAgID0gUFVCTElDCi1ORGF0YSAgICAgICAgICA9IE5EQVRBCi0KLS8vIHRoZXNlIGFyZSBhdHRyaWJ1dGUgdHlwZSBrZXl3b3JkcwotLy8gICB3ZSByZXVzZSBOT1RBVElPTiBmcm9tIE5vdGF0aW9uU3RhcnQKLS8vICAgd2UgcmV1c2UgRU5USVRZIGZyb20gRW50aXR5U3RhcnQKLUNEYXRhICAgICAgICAgID0gQ0RBVEEKLUlEICAgICAgICAgICAgID0gSUQKLUlEUmVmICAgICAgICAgID0gSURSRUYKLUlEUmVmcyAgICAgICAgID0gSURSRUZTCi1FbnRpdGllcyAgICAgICA9IEVOVElUSUVTCi1OTVRva2VuICAgICAgICA9IE5NVE9LRU4KLU5NVG9rZW5zICAgICAgID0gTk1UT0tFTlMKLQotLy8gdGhlc2UgYXJlIGF0dHJpYnV0ZSBkZWZhdWx0cyBrZXl3b3JkcwotUmVxdWlyZWQgICAgICAgPSAjUkVRVUlSRUQKLUltcGxpZWQgICAgICAgID0gI0lNUExJRUQKLUZpeGVkICAgICAgICAgID0gI0ZJWEVECi0KLQotRW1wdHkgICAgICAgICAgPSBFTVBUWQotQW55ICAgICAgICAgICAgPSBBTlkKLVBjRGF0YSAgICAgICAgID0gI1BDREFUQQotTGVmdFBhcmVuICAgICAgPSBcKAotUmlnaHRQYXJlbiAgICAgPSBcKQotCi1QZXJjZW50ICAgICAgICA9ICUKLVNlbWljb2xvbiAgICAgID0gOwotUGx1cyAgICAgICAgICAgPSBcKwotQ2hvaWNlICA9IFx8Ci1TZXF1ZW5jZSA9ICwKLUNvbm5lY3RvciAgICAgID0ge0Nob2ljZX18e1NlcXVlbmNlfQotT2NjdXJPcHRpb25hbCAgPSBcPwotT2NjdXJPbmVPck1vcmUgPSBcKwotT2NjdXJaZXJvT3JNb3JlID0gXCoKLU9jY3VyVHlwZSAgICAgID0ge09jY3VyT3B0aW9uYWx9fHtPY2N1ck9uZU9yTW9yZX18e09jY3VyWmVyb09yTW9yZX0KLUV4Y2xhbWF0aW9uICAgPSBcIQotU2luZ2xlUXVvdGVkTGl0ZXJhbCA9ICdbXiddKicKLURvdWJsZVF1b3RlZExpdGVyYWwgPSBcIlteXCJdKlwiCi1Ob25UYWdDb250ZW50ID0gW15ceDIwXHgwOVx4MERceDBBPD5dKgotTm9uRW51bUNvbnRlbnQgPSBbXlx4MjBceDA5XHgwRFx4MEE8PlwoXClcfF0qCi0KLSUlCi0KLTxZWUlOSVRJQUw+IHsKLSAge1N0YXJ0VGFnfSAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TVEFSVF9UQUcpOyB9Ci0gIHtFbmRUYWd9ICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5EX1RBRyk7IH0KLSAge0V4Y2xhbWF0aW9ufSAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTik7IH0KLSAge1BlcmNlbnR9ICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsgfQotICB7U2VtaWNvbG9ufSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNFTUlDT0xPTik7IH0KLQotICB7RWxlbWVudFN0YXJ0fSAgIHsgeXliZWdpbihFTEVNRU5UX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOyB9Ci0gIHtDb21tZW50U3RhcnR9ICAgeyB5eWJlZ2luKENPTU1FTlRfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKTsgfQotICB7RW50aXR5U3RhcnR9ICAgIHsgeXliZWdpbihFTlRJVFlfTkFNRSk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKTsgfQotICB7Tm90YXRpb25TdGFydH0gIHsgeXliZWdpbihOT1RBVElPTl9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRyk7IH0KLSAge0F0dExpc3R9ICAgICAgICB7IHl5YmVnaW4oQVRUTElTVF9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKTsgfQotCi0gIHtFeHRlcm5hbFBhcm1FbnRpdHlSZWZ9ICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0pOyB9Ci0vLyBqdXN0IGEgcGFybWVudGl0eW5hbWUgYnkgaXRzZWxmIGlzIG5vIGdvb2QuICB3ZSB1c2UgdGhpcwotLy8gdG8gY2FwdHVyZSBnYXJiYWdlIGNvbnRlbnQgYXQgdGhlIHRvcCBsZXZlbAotICB7UGFybUVudGl0eU5hbWV9ICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLQotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci19Ci0KLTxFTEVNRU5UX05BTUU+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7UGNEYXRhfXxcKHtTfSp7UGNEYXRhfXtTfSpcKSB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7IH0KLSAge05hbWV9ICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfQotCi0gIHtMZWZ0UGFyZW59ICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTik7IH0KLSAge0Nvbm5lY3Rvcn0gICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT05ORUNUT1IpOyB9ICAgIAotICB7T2NjdXJUeXBlfSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpOyB9Ci0gIHtSaWdodFBhcmVufSAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pOyB9Ci0KLSAge1N0YXJ0VGFnfSAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotICB7RW5kVGFnfSAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLS8vICoqKioqKioqIDwhQVRUTElTVC4uLj4KLTxBVFRMSVNUX05BTUU+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7TmFtZX0gICAgICAgICAgIHsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7IH0KLSAge05vblRhZ0NvbnRlbnR9ICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi08QVRUTElTVF9DT05URU5UPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge05hbWV9ICAgICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQVRUUklCVVRFX05BTUUpOyB9Ci0gIHtOb25UYWdDb250ZW50fSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPEFUVFJJQlVURV9DT05URU5UPiB7Ci0gIHtMaW5lVGVybWluYXRvcn0geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IH0KLSAge05vbkxpbmVUZXJtaW5hdG9yV2hpdGVzcGFjZX0KLSAgICAgICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7Q0RhdGF9ICAgICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DREFUQV9LRVlXT1JEKTsgfSAgCi0KLSAge0lEfSAgICAgICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURfS0VZV09SRCk7IH0gICAgICAgCi0gIHtJRFJlZn0gICAgICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQpOyB9ICAKLSAge0lEUmVmc30gICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQpOyB9ICAKLSAge0VudGl0eVN0YXJ0fSAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQpOyB9ICAKLSAge0VudGl0aWVzfSAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCk7IH0gIAotICB7Tk1Ub2tlbn0gICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQpOyB9ICAKLSAge05NVG9rZW5zfSAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCk7IH0gIAotICB7Tm90YXRpb25TdGFydH0gIHsgeXliZWdpbihBVFRSSUJVVEVfRU5VTUVSQVRJT04pOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCk7IH0gIAotCi0gIHtSZXF1aXJlZH0gfCB7SW1wbGllZH0gfCB7Rml4ZWR9IHwge1NpbmdsZVF1b3RlZExpdGVyYWx9IHwgeyBEb3VibGVRdW90ZWRMaXRlcmFsfQotICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IH0KLQotICB7TGVmdFBhcmVufSAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRSSUJVVEVfRU5VTUVSQVRJT04pOyB9ICAKLSAge05vbkVudW1Db250ZW50fSB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUEFSTV9FTlRJVFlfVFlQRSk7IH0KLSAge05vbkVudW1Db250ZW50fXx7UmlnaHRQYXJlbn18e0Nob2ljZX0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLTxBVFRSSUJVVEVfREVGQVVMVD4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtSZXF1aXJlZH0gICAgICAgeyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JEKTsgfQotICB7SW1wbGllZH0gICAgICAgIHsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JEKTsgfQotICB7Rml4ZWR9ICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQpOyB9Ci0gIHtTaW5nbGVRdW90ZWRMaXRlcmFsfSAgeyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7IH0KLSAge0RvdWJsZVF1b3RlZExpdGVyYWx9ICB7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7Tm9uVGFnQ29udGVudH0gICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgfSAvL3JldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi08QVRUUklCVVRFX0VOVU1FUkFUSU9OPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge0xlZnRQYXJlbn0gICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKTsgfQotICB7Q2hvaWNlfSAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVU1fQ0hPSUNFKTsgfQotICB7UmlnaHRQYXJlbn0gICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTik7IH0KLSAge05vbkVudW1Db250ZW50fSAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi0KLS8vICoqKioqKioqIDwhRU5USVRZLi4uPgotPEVOVElUWV9OQU1FPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge1BlcmNlbnR9ICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsgfQotICB7RW50aXR5TmFtZX0gICAgIHsgeXliZWdpbihFTlRJVFlfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPEVOVElUWV9DT05URU5UPiB7Ci0vLyAge0VudGl0eUNvbnRlbnR9IHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX0NPTlRFTlQpOyB9Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge1N5c3RlbX0gfCB7UHVibGljfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oRVhURVJOQUxJRF9DT05URU5UKTsgfQotICB7U2luZ2xlUXVvdGVkTGl0ZXJhbH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7RG91YmxlUXVvdGVkTGl0ZXJhbH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7Tm9uVGFnQ29udGVudH0gICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi0KLS8vICoqKioqKioqIDwhTk9UQVRJT04uLi4+Ci08Tk9UQVRJT05fTkFNRT4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtOYW1lfSAgICAgICAgICAgeyB5eWJlZ2luKEVYVEVSTkFMSURfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPEVYVEVSTkFMSURfQ09OVEVOVD4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtTeXN0ZW19ICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU1lTVEVNX0tFWVdPUkQpOyB9ICAKLSAge1B1YmxpY30gICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QVUJMSUNfS0VZV09SRCk7IH0gIAotICB7U2luZ2xlUXVvdGVkTGl0ZXJhbH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7RG91YmxlUXVvdGVkTGl0ZXJhbH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7TkRhdGF9ICAgICAgICAgIHsgeXliZWdpbihOREFUQV9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQpOyB9Ci0gIHtOb25UYWdDb250ZW50fSAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLTxOREFUQV9DT05URU5UPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge05vblRhZ0NvbnRlbnR9ICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLSAgCi0KLS8vICoqKioqKioqIDwhLS0gLi4uPgotPENPTU1FTlRfQ09OVEVOVD4gewotICB7Q29tbWVudEVuZH0gIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOyB9Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge0NvbW1lbnRDb250ZW50fSB8ICItIiB8ICI+IiAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9DT05URU5UKTsgfQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL2R0ZHNrZWxldG9uIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvZHRkc2tlbGV0b24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ODZlOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvZHRkc2tlbGV0b24KKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLS0tLSBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfQlVGRkVSU0laRSA9IC4uLjsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLS0tLSAgbGV4aWNhbCBzdGF0ZXMsIGNoYXJtYXAKLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotLS0tIGlzRmluYWwgbGlzdAotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbWVlfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgLy9wcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgaW50IHl5Y29sdW1uOyAKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgYXQgdGhlIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLS0tLSB1c2VyIGNsYXNzIGNvZGUKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotLS0tIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uCi0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X3JlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkIDwgMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7ICAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotCi0gICAgaWYgKHl5X3JlYWRlciAhPSBudWxsKQotICAgICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGN1cnJlbnQgc3RyZWFtLCBhbmQgcmVzZXRzIHRoZQotICAgKiBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIEFsbCBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHJlc2V0LCB0aGUgb2xkIGlucHV0IHN0cmVhbSAKLSAgICogPGI+Y2Fubm90PC9iPiBiZSByZXVzZWQgKGludGVybmFsIGJ1ZmZlciBpcyBkaXNjYXJkZWQgYW5kIGxvc3QpLgotICAgKiBMZXhpY2FsIHN0YXRlIGlzIHNldCB0byA8dHQ+WVlfSU5JVElBTDwvdHQ+LgotICAgKgotICAgKiBAcGFyYW0gcmVhZGVyICAgdGhlIG5ldyBpbnB1dCBzdHJlYW0gCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eXJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5Y2xvc2UoKTsKLSAgICB5eV9yZWFkZXIgPSByZWFkZXI7Ci0gICAgeXlfYXRFT0YgID0gZmFsc2U7Ci0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyA9IHl5X3B1c2hiYWNrUG9zID0gMDsKLSAgICB5eWxpbmUgPSB5eWNoYXIgPSB5eWNvbHVtbiA9IDA7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDx0dD5wb3M8L3R0PiBmcm9tIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0LiAKLSAgICogCi0gICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLSAgICoKLSAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gCi0gICAqICAgICAgICAgICAgQSB2YWx1ZSBmcm9tIDAgdG8geXlsZW5ndGgoKS0xLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0gICAqLwotICBmaW5hbCBwdWJsaWMgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQrcG9zXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLS0tLSB5eV9TY2FuRXJyb3IgZGVjbGFyYXRpb24gIAotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWVlfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLS0tLSB0aHJvd3MgY2xhdXNlCi0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLS0tLSB5eXB1c2hiYWNrIGRlY2wgKGNvbnRhaW5zIHl5X1NjYW5FcnJvciBleGNlcHRpb24pCi0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0tLS0geXlfZG9Fb2YKLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLS0tLSB5eWxleCBkZWNsYXJhdGlvbgotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0gICAgLy8gY2FjaGVkIGZpZWxkczoKLSAgICBpbnQgeXlfY3VycmVudFBvc19sOwotICAgIGludCB5eV9tYXJrZWRQb3NfbDsKLSAgICBpbnQgeXlfZW5kUmVhZF9sID0geXlfZW5kUmVhZDsKLSAgICBjaGFyIFtdIHl5X2J1ZmZlcl9sID0geXlfYnVmZmVyOwotICAgIGNoYXIgW10geXljbWFwX2wgPSB5eWNtYXA7Ci0KLS0tLSBsb2NhbCBkZWNsYXJhdGlvbnMKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB5eV9tYXJrZWRQb3NfbCA9IHl5X21hcmtlZFBvczsKLQotLS0tIHN0YXJ0IGFkbWluIChsaW5lLCBjaGFyLCBjb2wgY291bnQpCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvc19sID0geXlfY3VycmVudFBvcyA9IAotICAgICAgICAgICAgICAgICAgICAgICB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3NfbDsKLSAgCi0tLS0gc3RhcnQgYWRtaW4gKGxleHN0YXRlIGV0YykKLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0tLS0gbmV4dCBpbnB1dCwgbGluZSwgY29sLCBjaGFyIGNvdW50LCBuZXh0IHRyYW5zaXRpb24sIGlzRmluYWwgYWN0aW9uCi0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3NfbCA9IHl5X2N1cnJlbnRQb3NfbDsgCi0tLS0gbGluZSBjb3VudCB1cGRhdGUKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgeXlfbWFya2VkUG9zID0geXlfbWFya2VkUG9zX2w7Ci0tLS0gY2hhciBjb3VudCB1cGRhdGUKLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsKLQotLS0tIGFjdGlvbnMKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0tLS0gZW9mdmFsdWUKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotLS0tIG5vIG1hdGNoCi0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0tLS0gbWFpbgotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREQmF0Y2hOb2RlRGVsZXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREQmF0Y2hOb2RlRGVsZXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNTE0ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RUREJhdGNoTm9kZURlbGV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotCi0KLXB1YmxpYyBjbGFzcyBEVERCYXRjaE5vZGVEZWxldGUgewotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBEVERCYXRjaE5vZGVEZWxldGUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTm9kZShEVEROb2RlIG5vZGUpIHsKLQkJLy8gZmlyc3QgY2hlY2sgaWYgdGhlIG5vZGUgaXMgY29udGFpbmVkIGJ5IGFueW9uZQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIG5vZGVzLmdldChpKTsKLQotCQkJaWYgKGN1cnJlbnROb2RlLmNvbnRhaW5zUmFuZ2Uobm9kZS5nZXRTdGFydE9mZnNldCgpLCBub2RlLmdldEVuZE9mZnNldCgpKSkgewotCQkJCS8vIHRoZW4gbm8gbmVlZCB0byBhZGQgdGhlIG5vZGUgdG8gdGhlIGxpc3QgdG8gYmUgZGVsZXRlZAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8IGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgJiYgbm9kZS5nZXRFbmRPZmZzZXQoKSA8PSBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJbm9kZXMuYWRkKGksIG5vZGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSBnZXQgaGVyZSwgdGhlbiBhZGQgaXQgdG8gdGhlIGVuZAotCQlub2Rlcy5hZGQobm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlTm9kZXMoT2JqZWN0IHJlcXVlc3RvcikgewotCQlmb3IgKGludCBpID0gbm9kZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQlkdGRGaWxlLmRlbGV0ZU5vZGUocmVxdWVzdG9yLCBub2RlKTsKLQkJfQotCQlub2Rlcy5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4NTNiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRERXh0ZXJuYWxSZWZlcmVuY2VSZW1vdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci0KLQotLyoKLSAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIHRoZSBtb2RlbCB3aGVuIGl0ZW1zIGFyZSBkZWxldGVkIG9yCi0gKiBzbyB0aGF0IGl0ZW1zIHJlZmVyZW5jZWQgYnkgaXQgYXJlIGNsZWFuZWQgdXAgbm90ZSB0aGF0IHRvcCBsZXZlbCBub2RlcyBhcmUKLSAqIHF1ZXVlZCB1cCBmb3IgZGVsZXRpb24gc28gdGhhdCBpdGVyYXRpb24gb3ZlciB0aGUgbGlzdCBvZiBub2RlcyBmcm9tIHRoZQotICogZHRkZmlsZSBpcyBub3QgbWVzc2VkIHVwLiBOb3RlIHRoYXQgd2hlbiBhbiBleHRlcm5hbCBwYXJtZXRlciBlbnRpdHkKLSAqIGNoYW5nZXMsIHRoZSBjbGllbnQgb2YgdGhlIG1vZGVsIChlLmcuIGVkaXRvcikgbXVzdCBiZSBhIERUREZpbGVMaXN0ZW5lcgotICogaW1wbGVtZW50aW5nIHRoZSBsaXN0ZW5lcidzIGludGVyZmFjZSB0byBrZWVwIHRoZSBtb2RlbCdzIHJlZmVyZW50aWFsCi0gKiBpbnRlZ3JpdHkgKFNlZSBEVERNb2RlbEltcGwgZm9yIGV4YW1wbGUpLgotICovCi0KLXB1YmxpYyBjbGFzcyBEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQotCXByb3RlY3RlZCBEVERCYXRjaE5vZGVEZWxldGUgYmF0Y2hEZWxldGU7Ci0JcHJvdGVjdGVkIExpc3QgZXh0ZXJuYWxFbGVtZW50c0FuZFBhcm1FbnRpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFybUVudGl0eSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGluZyA9IGZhbHNlOwotCXByb3RlY3RlZCBEVEROb2RlIG5vZGVUb0RlbGV0ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZFJlZk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBPYmplY3QgcmVxdWVzdG9yOwotCi0JcHVibGljIERUREV4dGVybmFsUmVmZXJlbmNlUmVtb3ZlcigpIHsKLQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBleHRlcm5hbFJlZmVyZW5jZUFib3V0VG9DaGFuZ2UoT2JqZWN0IHJlcXVlc3RvciwgRW50aXR5IGVudGl0eSkgewotCQlpZiAoaXNVcGRhdGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkgfHwgIWVudGl0eS5pc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCS8vIGlmIGl0IGlzIG5vdCBhbiBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXR5LCBpZ25vcmUgYXMgd2VsbAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaXNVcGRhdGluZyA9IHRydWU7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCi0JCURUREZpbGUgZHRkRmlsZSA9IGVudGl0eS5nZXREVERGaWxlKCk7Ci0JCWlmIChiYXRjaERlbGV0ZSA9PSBudWxsKSB7Ci0JCQliYXRjaERlbGV0ZSA9IG5ldyBEVERCYXRjaE5vZGVEZWxldGUoZHRkRmlsZSk7Ci0JCX0KLQotCQkvLyBTZWUgdGhlIGNvbW1lbnQgYXQgdGhlIGhlYWQgb2YgdGhpcyBmaWxlIHJlZ2FyZGluZwotCQkvLyBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXRpZXMuCi0JCS8vIGV4dGVybmFsRWxlbWVudHNBbmRQYXJtRW50aXRpZXMgPQotCQkvLyBkdGRGaWxlLmdldERURE1vZGVsKCkuZ2V0RXh0ZXJuYWxNb2RlbHMoKS5nZXRFbGVtZW50Q29udGVudE5hbWVzKGVudGl0eS5nZXRQdWJsaWNJRCgpLAotCQkvLyBkdGRGaWxlLmdldERURE1vZGVsKCkucmVzb2x2ZUlEKGVudGl0eS5nZXRQdWJsaWNJRCgpLAotCQkvLyBlbnRpdHkuZ2V0U3lzdGVtSUQoKSkpOwotCi0JCXZpc2l0KGR0ZEZpbGUpOwotCi0JCWJhdGNoRGVsZXRlLmRlbGV0ZU5vZGVzKHJlcXVlc3Rvcik7Ci0KLQkJaXNVcGRhdGluZyA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmdOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBleHRlcm5hbEVsZW1lbnRzQW5kUGFybUVudGl0aWVzLmNvbnRhaW5zKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlKGF0dHIpOwotCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJU3RyaW5nIGF0dHJUeXBlID0gYXR0ci5nZXRUeXBlKCk7Ci0KLQkJaWYgKGlzUGFyYW1ldGVyRW50aXR5UmVmKGF0dHJOYW1lKSkgewotCQkJaWYgKGlzTWF0Y2hpbmdOYW1lKGF0dHJOYW1lKSkgewotCQkJCWF0dHIuc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKGlzUGFyYW1ldGVyRW50aXR5UmVmKGF0dHJUeXBlKSkgewotCQkJaWYgKGlzTWF0Y2hpbmdOYW1lKGF0dHJUeXBlKSkgewotCQkJCWF0dHIuc2V0VHlwZShyZXF1ZXN0b3IsIEF0dHJpYnV0ZS5DREFUQSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlTGlzdChhdHRMaXN0KTsKLQkJU3RyaW5nIGF0dExpc3ROYW1lID0gYXR0TGlzdC5nZXROYW1lKCk7Ci0JCWlmIChpc1BhcmFtZXRlckVudGl0eVJlZihhdHRMaXN0TmFtZSkpIHsKLQkJCWlmIChpc01hdGNoaW5nTmFtZShhdHRMaXN0TmFtZSkpIHsKLQkJCQlhdHRMaXN0LnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJaWYgKGlzUGFyYW1ldGVyRW50aXR5UmVmKGVsZW1lbnROYW1lKSkgewotCQkJaWYgKGlzTWF0Y2hpbmdOYW1lKGVsZW1lbnROYW1lKSkgewotCQkJCWVsZW1lbnQuc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJc3VwZXIudmlzaXRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UmVmZXJlbmNlKENNQmFzaWNOb2RlIG5vZGUpIHsKLQkJc3VwZXIudmlzaXRSZWZlcmVuY2Uobm9kZSk7Ci0JCVN0cmluZyByZWZOYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCWlmIChpc01hdGNoaW5nTmFtZShyZWZOYW1lKSkgewotCQkJYmF0Y2hEZWxldGUuYWRkTm9kZShub2RlKTsKLQkJfQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETW9kZWxVcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETW9kZWxVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOWNkZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE1vZGVsVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci0KLQotLy8gdGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgdGhlIG1vZGVsIHdoZW4gaXRlbXMKLS8vIGFyZSBkZWxldGVkIG9yIGEgZXh0ZXJuYWwgcGFybSBlbnRpdHkgY2hhbmdlcyBzbyB0aGF0Ci0vLyBpdGVtcyByZWZlcmVuY2VkIGJ5IGl0IGFyZSBjbGVhbmVkIHVwCi0vLyBub3RlIHRoYXQgdG9wIGxldmVsIG5vZGVzIGFyZSBxdWV1ZWQgdXAgZm9yIGRlbGV0aW9uIHNvIHRoYXQKLS8vIGl0ZXJhdGlvbiBvdmVyIHRoZSBsaXN0IG9mIG5vZGVzIGZyb20gdGhlIGR0ZGZpbGUgaXMgbm90IG1lc3NlZCB1cAotcHVibGljIGNsYXNzIERURE1vZGVsVXBkYXRlciBleHRlbmRzIERURFZpc2l0b3IgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJtRW50aXR5ID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwZGF0aW5nID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBub2Rlc1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBEVEROb2RlIG5vZGVUb0RlbGV0ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZFJlZk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBPYmplY3QgcmVxdWVzdG9yOwotCi0JcHVibGljIERURE1vZGVsVXBkYXRlcigpIHsKLQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBvYmplY3RBYm91dFRvQmVEZWxldGVkKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgbm9kZSkgewotCQlpZiAoaXNVcGRhdGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7Ci0JCQkvLyBqdXN0IGlnbm9yZSBpZiBpdCBpcyBub3Qgb25lIG9mIHRoZXNlCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgJiYgISgoRW50aXR5KSBub2RlKS5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQkvLyBpZiBpdCBpcyBub3QgYSBwYXJhbWV0ZXIgZW50aXR5LCBpZ25vcmUgYXMgd2VsbAotCQkJcmV0dXJuOwotCQl9Ci0KLQotCQlpc1VwZGF0aW5nID0gdHJ1ZTsKLQkJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0JCXRoaXMubm9kZVRvRGVsZXRlID0gbm9kZTsKLQkJb2xkUmVmTmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQlpc1Bhcm1FbnRpdHkgPSBmYWxzZTsKLQkJbm9kZXNUb0RlbGV0ZS5jbGVhcigpOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlpc1Bhcm1FbnRpdHkgPSB0cnVlOwotCQkJb2xkUmVmTmFtZSA9ICIlIiArIG9sZFJlZk5hbWUgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJRFRERmlsZSBkdGRGaWxlID0gbm9kZS5nZXREVERGaWxlKCk7Ci0JCXZpc2l0KGR0ZEZpbGUpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXNUb0RlbGV0ZS5zaXplKCk7IGkrKykgewotCQkJZHRkRmlsZS5kZWxldGVOb2RlKHJlcXVlc3RvciwgKERURE5vZGUpIG5vZGVzVG9EZWxldGUuZ2V0KGkpKTsKLQkJfQotCi0JCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cikgewotCQlzdXBlci52aXNpdEF0dHJpYnV0ZShhdHRyKTsKLQkJaWYgKGlzUGFybUVudGl0eSkgewotCQkJaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWF0dHIuc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoYXR0ci5nZXRUeXBlKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQkJYXR0ci5zZXRUeXBlKHJlcXVlc3RvciwgQXR0cmlidXRlLkNEQVRBKTsKLQkJCX0KLQkJfQotCQkvLyBjaGVjayB0aGUgYXR0ciBuYW1lIGFuZCB0aGUgYXR0ciB0eXBlIHRvIHNlZSBpZiBpdAotCQkvLyBuZWVkcyB1cGRhdGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0IGF0dExpc3QpIHsKLQkJc3VwZXIudmlzaXRBdHRyaWJ1dGVMaXN0KGF0dExpc3QpOwotCQlpZiAoYXR0TGlzdC5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQkJYXR0TGlzdC5zZXROYW1lKHJlcXVlc3RvciwgIlRlbXBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHNhdmUgdXAgZm9yIGxhdGVyIGRlbGV0aW9uCi0JCQkJbm9kZXNUb0RlbGV0ZS5hZGQoYXR0TGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChpc1Bhcm1FbnRpdHkpIHsKLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQllbGVtZW50LnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXN1cGVyLnZpc2l0RWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5UmVmKSB7Ci0JCXN1cGVyLnZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UocGFybUVudGl0eVJlZik7Ci0JCWlmIChpc1Bhcm1FbnRpdHkgJiYgcGFybUVudGl0eVJlZi5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQlub2Rlc1RvRGVsZXRlLmFkZChwYXJtRW50aXR5UmVmKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UmVmZXJlbmNlKENNQmFzaWNOb2RlIG5vZGUpIHsKLQkJc3VwZXIudmlzaXRSZWZlcmVuY2Uobm9kZSk7Ci0KLQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJRFRETm9kZSBwYXJlbnQgPSAoRFRETm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlwYXJlbnQuZGVsZXRlKHJlcXVlc3Rvciwgbm9kZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjllNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlRW51bUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIERURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3ZlciB7Ci0JcHJvdGVjdGVkIE5vdGF0aW9uIG5vdGF0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgbm90YXRpb25OYW1lOwotCi0JcHJvdGVjdGVkIE9iamVjdCByZXF1ZXN0b3I7Ci0KLQlwdWJsaWMgRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgbm90YXRpb25BYm91dFRvQmVEZWxldGVkKE9iamVjdCByZXF1ZXN0b3IsIE5vdGF0aW9uIG5vdGF0aW9uKSB7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCQl0aGlzLm5vdGF0aW9uID0gbm90YXRpb247Ci0JCW5vdGF0aW9uTmFtZSA9IG5vdGF0aW9uLmdldE5hbWUoKTsKLQotCQl2aXNpdChub3RhdGlvbi5nZXREVERGaWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0KERUREZpbGUgZmlsZSkgewotCQlMaXN0IG5vZGVzID0gZmlsZS5nZXROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIG5vZGVzLmdldChpKTsKLQkJCWlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCXZpc2l0RW50aXR5KChFbnRpdHkpIGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJCXZpc2l0QXR0cmlidXRlTGlzdCgoQXR0cmlidXRlTGlzdCkgY3VycmVudE5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQkJaWYgKGF0dHIuZ2V0VHlwZSgpLmVxdWFscyhBdHRyaWJ1dGUuRU5VTUVSQVRFRF9OT1RBVElPTikpIHsKLQkJCUF0dHJpYnV0ZUVudW1MaXN0IGVudW1MaXN0ID0gYXR0ci5nZXRFbnVtTGlzdCgpOwotCQkJTGlzdCBub3RhdGlvbk5hbWVzID0gZW51bUxpc3QuZ2V0SXRlbXMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBub3RhdGlvbk5hbWVzLml0ZXJhdG9yKCk7Ci0JCQlib29sZWFuIHVwZGF0ZVJlcXVpcmVkID0gZmFsc2U7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgbm90YXRpb24gPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobm90YXRpb24uZXF1YWxzKG5vdGF0aW9uTmFtZSkpIHsKLQkJCQkJdXBkYXRlUmVxdWlyZWQgPSB0cnVlOwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh1cGRhdGVSZXF1aXJlZCkgewotCQkJCVN0cmluZ1tdIG5ld0l0ZW1zID0gbmV3IFN0cmluZ1tub3RhdGlvbk5hbWVzLnNpemUoKV07Ci0JCQkJbm90YXRpb25OYW1lcy50b0FycmF5KG5ld0l0ZW1zKTsKLQkJCQllbnVtTGlzdC5zZXRJdGVtcyhyZXF1ZXN0b3IsIG5ld0l0ZW1zKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0IGF0dExpc3QpIHsKLQkJQXR0cmlidXRlIGF0dHIgPSAoQXR0cmlidXRlKSBhdHRMaXN0LmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGF0dHIgIT0gbnVsbCkgewotCQkJdmlzaXRBdHRyaWJ1dGUoYXR0cik7Ci0JCQlhdHRyID0gKEF0dHJpYnV0ZSkgYXR0ci5nZXROZXh0U2libGluZygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbnRpdHkoRW50aXR5IGVudGl0eSkgewotCQlpZiAoZW50aXR5LmdldE5vdGF0aW9uTmFtZSgpLmVxdWFscyhub3RhdGlvbk5hbWUpKSB7Ci0JCQllbnRpdHkuc2V0Tm90YXRpb25OYW1lKHJlcXVlc3RvciwgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0vLyBEVEROb3RhdGlvblJlbW92ZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERSZWZlcmVuY2VVcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREUmVmZXJlbmNlVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTkyOTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERSZWZlcmVuY2VVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUVudW1MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotCi0KLS8vIHRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIGFueSBkdGQgbm9kZSBpbgotLy8gcmVzcG9uc2UgdG8gYSBjaGFuZ2UgaW4gdGhlIG5vZGUgdGhhdCB0aGV5IHJlZmVyZW5jZQotcHVibGljIGNsYXNzIERURFJlZmVyZW5jZVVwZGF0ZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdGF0aW9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Bhcm1FbnRpdHkgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzVXBkYXRpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5ld05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgb2xkUmVmTmFtZSA9ICIiLCBuZXdSZWZOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXByb3RlY3RlZCBEVEROb2RlIHJlZmVyZW5jZWROb2RlID0gbnVsbDsKLQotCS8vIHRoZSByZWZlcmVuY2VzIExpc3QgaXMgYSBjYWNoZSBvZiB0aGUgRFRETm9kZXMgdGhhdCBhcmUgY2hhbmdlZAotCS8vIGFzIGEgcmVzdWx0IG9mIGEgY2FsbCB0byBuYW1lQWJvdXRUb0NoYW5nZSgpLiBUaGUgaWRlYSBpcyB0aGF0Ci0JLy8gaWYgYSBzdWJzZXF1ZW50IGNhbGwgY29tZXMgaW4gdGhhdCBjaGFuZ2VzIHRoZSBuYW1lIG9mIHRoZSBzYW1lCi0JLy8gb2JqZWN0IGZvciB3aGljaCB0aGlzIGNhY2hlIGV4aXN0cyBmb3IsIHRoZW4gd2Ugb3B0aW1pemUgdGhlCi0JLy8gcGF0aCBieSBqdXN0IHdhbGtpbmcgdGhlIGNhY2hlCi0JcHJpdmF0ZSBMaXN0IHJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIE9iamVjdCByZXF1ZXN0b3I7Ci0KLQlwdWJsaWMgRFREUmVmZXJlbmNlVXBkYXRlcigpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoKSB7Ci0JCXJlZmVyZW5jZWROb2RlID0gbnVsbDsKLQkJcmVmZXJlbmNlcy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBuYW1lQWJvdXRUb0NoYW5nZShPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIHJlZmVyZW5jZWROb2RlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAoaXNVcGRhdGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKHJlZmVyZW5jZWROb2RlIGluc3RhbmNlb2YgRW50aXR5IHx8IHJlZmVyZW5jZWROb2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCByZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uKSkgewotCQkJLy8ganVzdCBpZ25vcmUgaWYgaXQgaXMgbm90IG9uZSBvZiB0aGVzZQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChyZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIEVudGl0eSAmJiAhKChFbnRpdHkpIHJlZmVyZW5jZWROb2RlKS5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQkvLyBpZiBpdCBpcyBub3QgYSBwYXJhbWV0ZXIgZW50aXR5LCBpZ25vcmUgYXMgd2VsbAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaXNVcGRhdGluZyA9IHRydWU7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCQlvbGRSZWZOYW1lID0gcmVmZXJlbmNlZE5vZGUuZ2V0TmFtZSgpOwotCQl0aGlzLm5ld05hbWUgPSBuZXdSZWZOYW1lID0gbmV3TmFtZTsKLQkJaXNQYXJtRW50aXR5ID0gZmFsc2U7Ci0JCWlzTm90YXRpb24gPSByZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uOwotCi0JCWlmIChyZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJaXNQYXJtRW50aXR5ID0gdHJ1ZTsKLQkJCW9sZFJlZk5hbWUgPSAiJSIgKyBvbGRSZWZOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW5ld1JlZk5hbWUgPSAiJSIgKyBuZXdSZWZOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWlmICh0aGlzLnJlZmVyZW5jZWROb2RlICE9IG51bGwpIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBwcmV2aW91cyByZWZlcmVuY2VkIG5vZGUgdGhhdCB3YXMgY2hhbmdlZAotCQkJLy8gaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB0aGF0IGlzIGNvbWluZyBpbi4gaWYgc28sIGp1c3QKLQkJCS8vIGNoYW5nZSB0aGUgcHJldmlvdXMgcmVnaW9ucwotCQkJaWYgKHRoaXMucmVmZXJlbmNlZE5vZGUgPT0gcmVmZXJlbmNlZE5vZGUpIHsKLQkJCQlxdWlja1VwZGF0ZSgpOwotCQkJCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBjbGVhciB0aGUgY2FjaGUgaWYgd2UgZ2V0IGhlcmUKLQkJdGhpcy5yZWZlcmVuY2VkTm9kZSA9IHJlZmVyZW5jZWROb2RlOwotCQlyZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCURUREZpbGUgZHRkRmlsZSA9IHJlZmVyZW5jZWROb2RlLmdldERUREZpbGUoKTsKLQkJdmlzaXQoZHRkRmlsZSk7Ci0JCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBxdWlja1VwZGF0ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQl2aXNpdEVsZW1lbnQoKEVsZW1lbnQpIG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCQl2aXNpdEF0dHJpYnV0ZUxpc3QoKEF0dHJpYnV0ZUxpc3QpIG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCXZpc2l0QXR0cmlidXRlKChBdHRyaWJ1dGUpIG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJdmlzaXRSZWZlcmVuY2UoKENNQmFzaWNOb2RlKSBub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIHsKLQkJCQl2aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKChQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQkJc3VwZXIudmlzaXRBdHRyaWJ1dGUoYXR0cik7Ci0JCWlmIChpc1Bhcm1FbnRpdHkpIHsKLQkJCS8vIGNoZWNrIHRoZSBhdHRyIG5hbWUgYW5kIHRoZSBhdHRyIHR5cGUgdG8gc2VlIGlmIGl0Ci0JCQkvLyBuZWVkcyB1cGRhdGluZwotCQkJaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWF0dHIuc2V0TmFtZShyZXF1ZXN0b3IsIG5ld1JlZk5hbWUpOwotCQkJCXJlZmVyZW5jZXMuYWRkKGF0dHIpOwotCQkJfQotCQkJaWYgKGF0dHIuZ2V0VHlwZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWF0dHIuc2V0VHlwZShyZXF1ZXN0b3IsIG5ld1JlZk5hbWUpOwotCQkJCXJlZmVyZW5jZXMuYWRkKGF0dHIpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGlzTm90YXRpb24gJiYgYXR0ci5nZXRUeXBlKCkuZXF1YWxzKEF0dHJpYnV0ZS5FTlVNRVJBVEVEX05PVEFUSU9OKSkgewotCQkJQXR0cmlidXRlRW51bUxpc3QgZW51bUxpc3QgPSBhdHRyLmdldEVudW1MaXN0KCk7Ci0JCQlMaXN0IGl0ZW1zID0gZW51bUxpc3QuZ2V0SXRlbXMoKTsKLQkJCWJvb2xlYW4gdXBkYXRlTmVlZGVkID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5vdGF0aW9uTmFtZSA9IChTdHJpbmcpIGl0ZW1zLmdldChpKTsKLQkJCQlpZiAobm90YXRpb25OYW1lLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCQl1cGRhdGVOZWVkZWQgPSB0cnVlOwotCQkJCQlpdGVtcy5zZXQoaSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVwZGF0ZU5lZWRlZCkgewotCQkJCVN0cmluZ1tdIG5ld0l0ZW1zID0gbmV3IFN0cmluZ1tpdGVtcy5zaXplKCldOwotCi0JCQkJZW51bUxpc3Quc2V0SXRlbXMoKFN0cmluZ1tdKSBpdGVtcy50b0FycmF5KG5ld0l0ZW1zKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0IGF0dExpc3QpIHsKLQkJaWYgKCFpc05vdGF0aW9uICYmIGF0dExpc3QuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJYXR0TGlzdC5zZXROYW1lKHJlcXVlc3RvciwgbmV3UmVmTmFtZSk7Ci0JCQlyZWZlcmVuY2VzLmFkZChhdHRMaXN0KTsKLQkJfQotCQlzdXBlci52aXNpdEF0dHJpYnV0ZUxpc3QoYXR0TGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQkJZWxlbWVudC5zZXROYW1lKHJlcXVlc3RvciwgbmV3UmVmTmFtZSk7Ci0JCQkJcmVmZXJlbmNlcy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIudmlzaXRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHlSZWYpIHsKLQkJc3VwZXIudmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShwYXJtRW50aXR5UmVmKTsKLQkJaWYgKHBhcm1FbnRpdHlSZWYuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJcGFybUVudGl0eVJlZi5zZXRSZWZlcmVuY2VkRW50aXR5KHJlcXVlc3RvciwgbmV3TmFtZSk7Ci0JCQlyZWZlcmVuY2VzLmFkZChwYXJtRW50aXR5UmVmKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UmVmZXJlbmNlKENNQmFzaWNOb2RlIG5vZGUpIHsKLQkJc3VwZXIudmlzaXRSZWZlcmVuY2Uobm9kZSk7Ci0JCWlmIChpc1BhcmFtZXRlckVudGl0eVJlZihvbGRSZWZOYW1lKSAmJiAhaXNQYXJtRW50aXR5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQlub2RlLnNldE5hbWUocmVxdWVzdG9yLCBuZXdSZWZOYW1lKTsKLQkJCXJlZmVyZW5jZXMuYWRkKG5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFVuaXF1ZU5hbWVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDIxNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFVuaXF1ZU5hbWVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBEVERVbmlxdWVOYW1lSGVscGVyIHsKLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlyZXR1cm4gKChFbnRpdHkpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQlyZXR1cm4gKChOb3RhdGlvbikgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gKChBdHRyaWJ1dGUpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSAvLyBNb2RlbCBHcm91cCBDb250ZW50Ci0JCXsKLQkJCXJldHVybiAoKENNQmFzaWNOb2RlKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVBdHRyaWJ1dGVOYW1lKEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IGF0dHJzID0gZWxlbWVudC5nZXRFbGVtZW50QXR0cmlidXRlcygpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShhdHRycywgIk5ld0F0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlRWxlbWVudE5hbWUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBkdGRGaWxlLmdldEVsZW1lbnRzQW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlcygpLmdldE5vZGVzKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGVsZW1lbnRzLCAiTmV3RWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlRW50aXR5TmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBlbnRpdGllcyA9IGR0ZEZpbGUuZ2V0RW50aXRpZXMoKS5nZXROb2RlcygpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShlbnRpdGllcywgIk5ld0VudGl0eSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZShMaXN0IG9ianMsIFN0cmluZyB0b2tlbikgewotCQlpbnQgY291bnRlciA9IDE7Ci0KLQkJYm9vbGVhbiB1bmlxdWVOYW1lID0gZmFsc2U7Ci0JCXdoaWxlICghdW5pcXVlTmFtZSkgewotCQkJU3RyaW5nIG5ld05hbWUgPSB0b2tlbiArIG5ldyBJbnRlZ2VyKGNvdW50ZXIrKyk7Ci0JCQl1bmlxdWVOYW1lID0gdHJ1ZTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBvYmpzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIG9iak5hbWUgPSBnZXROYW1lKG9iaik7Ci0JCQkJaWYgKG9iak5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJCXVuaXF1ZU5hbWUgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVuaXF1ZU5hbWUpIHsKLQkJCQlyZXR1cm4gbmV3TmFtZTsKLQkJCX0KLQkJfQotCQkvLyB3ZSBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJcmV0dXJuICJObyBOYW1lIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5vdGF0aW9uTmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBub3RhdGlvbnMgPSBkdGRGaWxlLmdldE5vdGF0aW9ucygpLmdldE5vZGVzKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKG5vdGF0aW9ucywgIk5ld05vdGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRFREVW5pcXVlTmFtZUhlbHBlcigpIHsKLQl9Ci0KLX0gLy8gRFREVW5pcXVlTmFtZUhlbHBlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiN2I3YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci0KLQotcHVibGljIGNsYXNzIERURFZpc2l0b3IgewotCi0JcHVibGljIERURFZpc2l0b3IoKSB7Ci0KLQl9Ci0KLQkvLyB1dGlsaXR5IG1ldGhvZAotCXB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyRW50aXR5UmVmKFN0cmluZyByZWZlcmVuY2UpIHsKLQkJaWYgKHJlZmVyZW5jZS5sZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiByZWZlcmVuY2UuY2hhckF0KDApID09ICclJyAmJiByZWZlcmVuY2UuY2hhckF0KHJlZmVyZW5jZS5sZW5ndGgoKSAtIDEpID09ICc7JzsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXQoRFRERmlsZSBmaWxlKSB7Ci0JCUxpc3Qgbm9kZXMgPSBmaWxlLmdldE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgbm9kZXMuZ2V0KGkpOwotCQkJaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCXZpc2l0RWxlbWVudCgoRWxlbWVudCkgY3VycmVudE5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJdmlzaXRBdHRyaWJ1dGVMaXN0KChBdHRyaWJ1dGVMaXN0KSBjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgewotCQkJCXZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgY3VycmVudE5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCS8vIG5vdGUgdGhhdCB3ZSBkb24ndCB2aXNpdCBhdHRyaWJ1dGVzIGhlcmUgYmVjYXVzZSB3ZQotCQkvLyB3YW50IHRoZSBlbGVtZW50IHRvIHZpc2l0IHRoZW0gd2l0aCBpdCdzIGNvbnNvbGlkYXRlZCBsaXN0Ci0JCS8vIHRoYXQgaXQgY3JlYXRlcyBieSBnYXRoZXJpbmcgYWxsIGF0dHJpYnV0ZSBsaXN0cyB0b2dldGhlcgotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlcyhMaXN0IGF0dHJpYnV0ZXMpIHsKLQkJaW50IHNpemUgPSBhdHRyaWJ1dGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUF0dHJpYnV0ZSBhdHRyID0gKEF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0JCQl2aXNpdEF0dHJpYnV0ZShhdHRyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q29udGVudE5vZGUoQ01Ob2RlIGNvbnRlbnQpIHsKLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJQ01CYXNpY05vZGUgYmFzaWNOb2RlID0gKENNQmFzaWNOb2RlKSBjb250ZW50OwotCQkJaWYgKGJhc2ljTm9kZS5pc1JlZmVyZW5jZSgpKSB7Ci0JCQkJdmlzaXRSZWZlcmVuY2UoYmFzaWNOb2RlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCXZpc2l0R3JvdXBOb2RlKChDTUdyb3VwTm9kZSkgY29udGVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNTm9kZSBjb250ZW50ID0gZWxlbWVudC5nZXRDb250ZW50TW9kZWwoKTsKLQkJdmlzaXRDb250ZW50Tm9kZShjb250ZW50KTsKLQkJdmlzaXRBdHRyaWJ1dGVzKGVsZW1lbnQuZ2V0RWxlbWVudEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eVJlZikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0R3JvdXBOb2RlKENNR3JvdXBOb2RlIGdyb3VwKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBncm91cC5nZXRDaGlsZHJlbkxpc3QoKTsKLQkJaW50IHNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl2aXNpdENvbnRlbnROb2RlKChDTU5vZGUpIGNoaWxkcmVuLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFJlZmVyZW5jZShDTUJhc2ljTm9kZSBub2RlKSB7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9MYWJlbFZhbHVlUGFpci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0xhYmVsVmFsdWVQYWlyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjhjZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0xhYmVsVmFsdWVQYWlyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotcHVibGljIGNsYXNzIExhYmVsVmFsdWVQYWlyIHsKLQotCXB1YmxpYyBTdHJpbmcgZkxhYmVsOwotCXB1YmxpYyBPYmplY3QgZlZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBuYW1lL3ZhbHVlIGl0ZW0KLQkgKi8KLQlwdWJsaWMgTGFiZWxWYWx1ZVBhaXIoU3RyaW5nIGxhYmVsLCBPYmplY3QgdmFsdWUpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShsYWJlbCAhPSBudWxsKTsKLQkJZkxhYmVsID0gbGFiZWw7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdGV4dC9JRFREUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS90ZXh0L0lEVERQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YjYyOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS90ZXh0L0lEVERQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRleHQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIERURC4KLSAqIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJRFREUGFydGl0aW9ucyB7Ci0JCi0JU3RyaW5nIERURF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZTVmNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtcHJvcGVydGllcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQ1NjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLXJ1bnRpbWUKLWR0ZHVpLmphcgotKi56aXAKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLUBkb3QKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNzNlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3Byb2plY3Rpb25wZXJmPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjIwOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmR0ZC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzkyMTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jU2F0IE1hciAyNCAwMjo1NzozNSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4NGEzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmR0ZC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjYwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5kdGQudWksCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZG5kO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnJlZ2lzdHJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5zdHlsZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lCi1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudXRpbDsgdmVyc2lvbj0iMy44IiwKLSBjb20uaWJtLmljdS50ZXh0OyB2ZXJzaW9uPSIzLjgiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjQwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjM4ZmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICBEYXZpZCBDYXJ2ZXIsIFNUQVIgLSBhZGQgbmV3IGR0ZCBmaWxlIHRlbXBsYXRlcywgYnVnIDE2MjMyMQotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBzcmMtcHJvcGVydGllcy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9EVERGaWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9EVERGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlZTUzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvRFRERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9icm93c2VidXR0b24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RhZTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9icm93c2VidXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfQXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYmI3YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfQXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjQ4ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODIzNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjhmYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2ZiNzgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9FbGVtZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzU1ZTVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTU4ZTExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI1YTIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2R0ZF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdkdGRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmNjM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2R0ZF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfQXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYmI3YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfQXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0VsZW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjQ4ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODIzNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjhmYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvZ2VuZXJhdGVfeG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvZ2VuZXJhdGVfeG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkNWRkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2dlbmVyYXRlX3htbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2R0ZF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdkdGRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiMWE3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2R0ZF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0NvbW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0NvbW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTYxMWQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9Db21tZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9FbnRpdHkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDE1MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZmE5YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX05vdGF0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9Ob3RhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YWQwODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX05vdGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMWM0MzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9uZXdkdGRfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L25ld2R0ZF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzExNWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L25ld2R0ZF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvb3JnYW5pemVfZHRkX2xvZ2ljYWxseS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzYzZiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzVkMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYmRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjE5NmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3ZhbGlkYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdkdGRmaWxlX3dpei5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZHRkZmlsZV93aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzZkNzkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdkdGRmaWxlX3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiY2I0NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hIFByb3BlcnRpZXMgZmlsZSBmb3IgY29tcG9uZW50OiBYTURURCAtIFhNTCBUb29scyBEVEQgRWRpdG9yCi0hIFBhY2thZ2VkIGZvciB0cmFuc2xhdGlvbiBpbjogIHhtbC56aXAKLQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1wbHVnaW5OYW1lPVNTRSBEVEQgU291cmNlIEVkaXRvcgotCi1EVERfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9RFREIEVkaXRvcgotX1VJX0xBQkVMX0RURF9GSUxFUz1EVEQgRmlsZXMKLURURF9UZW1wbGF0ZXMubmFtZT1UZW1wbGF0ZXMKLV9VSV9MQUJFTF9EVERfU1RZTEVTPVN0eWxlcwotRFREX1N5bnRheF9Db2xvcmluZz1TeW50YXggQ29sb3JpbmcKLV9VSV9XSVpBUkRfTkVXX0RURD1EVEQgRmlsZQotX1VJX0NSRUFURV9ORVdfRFREX0ZJTEU9Q3JlYXRlIGEgbmV3IERURCBmaWxlCi0jIwotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsPUVuY2xvc2luZyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw9TmV4dCBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw9UHJldmlvdXMgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbD1SZXN0b3JlIExhc3QgU2VsZWN0aW9uCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXA9UmVzdG9yZSBsYXN0IHNlbGVjdGlvbgotIyMKLUFkZFRhc2subGFiZWw9QWRkICZUYXNrLi4uCi1BZGRUYXNrLnRvb2x0aXA9QWRkIFRhc2suLi4KLUFkZEJvb2ttYXJrLmxhYmVsPUFkZCBCb28ma21hcmsuLi4KLUFkZEJvb2ttYXJrLnRvb2x0aXA9QWRkIEJvb2ttYXJrLi4uCi1TZWxlY3RSdWxlci5sYWJlbD1TZWxlY3QgUnVsZXIKLSMjCi1fVUlfTUVOVV9WQUxJREFURV9EVEQgICAgICAgICAgICAgICA9ICZWYWxpZGF0ZSBEVEQgRmlsZQotCi1EVERfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPU5ldyBEVEQKLURURF9OZXdfRmlsZS50b29sdGlwPU5ldyBEVEQgRmlsZQotX1VJX0xBQkVMX0dFTkVSQUw9R2VuZXJhbAotX1VJX0xBQkVMX09USEVSPU90aGVyCi1fVUlfTEFCRUxfQVRUUklCVVRFUz1BdHRyaWJ1dGVzCi1fVUlfTEFCRUxfRE9DVU1FTlRBVElPTj1Eb2N1bWVudGF0aW9uCi0jIwotcHJlZmVyZW5jZUtleXdvcmRzLmZpbGVzPWVkaXRvciBkdGQgY3JlYXRpbmcgZmlsZXMgc3VmZml4IHNwZWNpZmllZAotcHJlZmVyZW5jZUtleXdvcmRzLnRlbXBsYXRlcz1lZGl0b3IgZHRkIHRlbXBsYXRlcyBzbmlwcGV0IG1hY3JvcwotcHJlZmVyZW5jZUtleXdvcmRzLnN0eWxlcz1lZGl0b3IgZHRkIHN0eWxlIGN1c3RvbWl6ZSBzeW50YXggaGlnaGxpZ2h0aW5nIHR5cGUgdGV4dCBjb250ZW50IGZvcmVncm91bmQgYmFja2dyb3VuZCBib2xkIGNvbG9yCi0KLUNvbG9ycy5kdGREZWZhdWx0PURURCBEZWZhdWx0Ci1Db2xvcnMuZHRkVGFnPURURCBUYWcKLUNvbG9ycy5kdGRUYWdOYW1lPURURCBUYWcgTmFtZQotQ29sb3JzLmR0ZENvbW1lbnQ9RFREIENvbW1lbnQKLUNvbG9ycy5kdGRLZXl3b3JkPURURCBLZXl3b3JkCi1Db2xvcnMuZHRkU3RyaW5nPURURCBTdHJpbmcKLUNvbG9ycy5kdGREYXRhPURURCBEYXRhCi1Db2xvcnMuZHRkU3ltYm9sPURURCBTeW1ib2wKLQkJCQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlZWQzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotCQk8IS0tIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIiAtLT4KLQkJPGVkaXRvcgotCQkJbmFtZT0iJURURF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkFjdGlvbkNvbnRyaWJ1dG9yRFREIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFRERWRpdG9yIgotCQkJc3ltYm9saWNGb250TmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSI+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJPC9lZGl0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb24iPgotCQk8Y29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZS5EVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNoYXJhY3RlcnBhaXJtYXRjaGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGV4dC5EVEREb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJmb2xkaW5nc3RyYXRlZ3kiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLkRUREZvbGRpbmdTdHJhdGVneSIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkucHJlZmVyZW5jZXMuZHRkLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC50ZW1wbGF0ZXMsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZHRkLnN0eWxlcyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJPCEtLSBwcm92aWRlIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIERURCBzdWJzZXQgd2l0aGluIFhNTCAtLT4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ibGluZXN0eWxlcHJvdmlkZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlckZvckRURFN1YlNldCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5kdGQuaW50ZXJuYWxfc3Vic2V0IiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJzcGVsbGluZ3JlZ2lvbnMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwucGFyc2VyLkRURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotCQk8ZWRpdG9yQ29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UuZWRpdG9yQWN0aW9ucyIKLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSI+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0TmV4dCIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LnByZXZpb3VzIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9lZGl0b3JDb250cmlidXRpb24+Ci0gICAgICAgIDxlZGl0b3JDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnJ1bGVyLmFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckRvdWJsZUNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIvPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVTZWxlY3RSdWxlci5sYWJlbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIvPgotICAgICAgICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gdXNlIGEgc3BlY2lmaWMgYW5ub3RhdGlvbiBtb2RlbCB3aXRoIEZpbGVCdWZmZXJzIC0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuYW5ub3RhdGlvbk1vZGVsQ3JlYXRpb24iPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIFJlZ2lzdGVyIHRoZSBVSSBhZGFwdGVyIGZhY3RvcnkgcHJvdmlkZXIgLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIj4KLQkJPGFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQiPgotCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIiAvPgotCQk8L2FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIEVkaXRvciBhY3Rpb25zZXRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiIC8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIiAvPgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCTxwYWdlCi0JCQluYW1lPSIlX1VJX0xBQkVMX0RURF9GSUxFUyIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnByZWZlcmVuY2VzLnhtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkRUREZpbGVzUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5wcmVmZXJlbmNlcy5kdGQiPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmZpbGVzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVEVERfVGVtcGxhdGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5wcmVmZXJlbmNlcy5kdGQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZHRkLnRlbXBsYXRlcyI+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkudGVtcGxhdGVzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVEVERfU3ludGF4X0NvbG9yaW5nIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkucHJlZmVyZW5jZXMuZHRkIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREU3ludGF4Q29sb3JpbmdQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZHRkLnN0eWxlcyI+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuc3R5bGVzIi8+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIEtleXdvcmRzIGZvciBwcmVmZXJlbmNlIGFuZCBwcm9wZXJ0aWVzIHBhZ2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLmZpbGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZmlsZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnRlbXBsYXRlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnRlbXBsYXRlcyIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuc3R5bGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuc3R5bGVzIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0KLQk8IS0tIE5ldyBEVEQgd2l6YXJkIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotCQk8d2l6YXJkCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQuTmV3RFREV2l6YXJkIgotCQkJbmFtZT0iJV9VSV9XSVpBUkRfTkVXX0RURCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLndpemFyZC5OZXdEVERXaXphcmQiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LlhNTENhdGVnb3J5IgotCQkJaWNvbj0iJG5sJC9pY29ucy9mdWxsL2V0b29sMTYvbmV3ZHRkX3dpei5naWYiPgotCQkJPGRlc2NyaXB0aW9uPiVfVUlfQ1JFQVRFX05FV19EVERfRklMRTwvZGVzY3JpcHRpb24+Ci0JCQk8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+Ci0JCTwvd2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBpbml0aWFsaXplIERURCB1aSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkRURFVJUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZS5SdWxlckNvbnRleHQiCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5ydWxlci5jb250ZXh0LmFjdGlvbnMiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkVGFzay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5BZGRUYXNrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkVGFzay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCTwvdmlld2VyQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBUZW1wbGF0ZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZW1wbGF0ZXMiPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVEVERfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVEVEQiCi0JCQlpZD0iZHRkX25ldyI+Ci0JCTwvY29udGV4dFR5cGU+Ci0gIDxpbmNsdWRlCi0gICAgICAgIGZpbGU9InRlbXBsYXRlcy9kdGRkZWZhdWx0LXRlbXBsYXRlcy54bWwiCi0gICAgICAgIHRyYW5zbGF0aW9ucz0iJG5sJC90ZW1wbGF0ZXMvZHRkZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyI+Ci0gIDwvaW5jbHVkZT4KLQk8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkucHJvcGVydHlDb250cmlidXRvciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eUNvbnRyaWJ1dG9yIj4KLSAgICAgIDxwcm9wZXJ0eUNvbnRyaWJ1dG9yCi0gICAgICAgICAgICBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSIKLSAgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyIgotICAgICAgICAgICAgdHlwZU1hcHBlcj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRFREVHlwZU1hcHBlciI+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeQotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImR0ZC51aS5nZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeQotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImR0ZC51aS5vdGhlciIvPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkuYXR0cmlidXRlcyIvPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkuZG9jdW1lbnRhdGlvbiIvPgotICAgICAgPC9wcm9wZXJ0eUNvbnRyaWJ1dG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eVRhYnMiPgotICAgICAgPHByb3BlcnR5VGFicwotICAgICAgICAgICAgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9HRU5FUkFMIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImR0ZC51aS5nZW5lcmFsIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImR0ZC51aS5hdHRyaWJ1dGVzIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuYXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX0FUVFJJQlVURVMiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuYXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkub3RoZXIiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5vdGhlciIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX09USEVSIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLmRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5kb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfTEFCRUxfRE9DVU1FTlRBVElPTiIvPgotICAgICAgPC9wcm9wZXJ0eVRhYnM+Ci0gICA8L2V4dGVuc2lvbj4gICAKLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlTZWN0aW9ucyI+Ci0gICA8cHJvcGVydHlTZWN0aW9ucyBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSI+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5hbWVTZWN0aW9uIgotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmFtZVNlY3Rpb24iCi0gICAgICAgIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudCIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGUiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdCIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbiIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5BdHRyaWJ1dGVEZWZhdWx0U2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbW1lbnRTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29tbWVudFNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Db21tZW50Ii8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uIj4KLQkgICAgCTxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGUiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsTmFtZVNlY3Rpb24iCi0gICAgICAgIGZpbHRlcj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsTmFtZUZpbHRlciIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbE5hbWVTZWN0aW9uIgotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLm90aGVyIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbFR5cGVTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsVHlwZVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZSIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5kb2N1bWVudGF0aW9uIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkRvY3VtZW50U2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkRvY3VtZW50U2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5Ii8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3QiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb24iLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbXB0eVNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbXB0eVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UiLz4KLQkJIAk8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb24iLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPCEtLQkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkub3RoZXIiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VHlwZVNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlUeXBlU2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5hdHRyaWJ1dGVzIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVudGl0eVZhbHVlU2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVudGl0eVZhbHVlU2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgLS0+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OZXdFbnRpdHlTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmV3RW50aXR5U2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGUiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5Ii8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTm90YXRpb25TZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTm90YXRpb25TZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb24iLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuYXR0cmlidXRlcyIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5PY2N1cnJlbmNlU2VjdGlvbiIgIAotICAgICAgICBmaWx0ZXI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk9jY3VycmVuY2VGaWx0ZXIiCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uT2NjdXJyZW5jZVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZSIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTVJlcGVhdGFibGVOb2RlIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmF0dHJpYnV0ZXMiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uVHlwZVNlY3Rpb24iICAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5UeXBlU2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgPC9wcm9wZXJ0eVNlY3Rpb25zPgotPC9leHRlbnNpb24+Ci0KLQk8IS0tIERlZmluZSB0aGVtZSAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS50aGVtZXMiPgotCQk8dGhlbWUKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS5pZGUuc3lzdGVtRGVmYXVsdCI+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJkdGREZWZhdWx0IgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZHRkVGFnIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZHRkVGFnTmFtZSIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImR0ZENvbW1lbnQiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfU0VMRUNUSU9OIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImR0ZEtleXdvcmQiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJkdGRTdHJpbmciCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJkdGREYXRhIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZHRkU3ltYm9sIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQk8L3RoZW1lPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZHRkRGVmYXVsdCIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZHRkRGVmYXVsdCIKLQkJCXZhbHVlPSIwLCAwLCAwIj4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJkdGRUYWciCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmR0ZFRhZyIKLQkJCXZhbHVlPSI2MywgNjMsIDE5MSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZHRkVGFnTmFtZSIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZHRkVGFnTmFtZSIKLQkJCXZhbHVlPSI2MywgNjMsIDE5MSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZHRkQ29tbWVudCIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZHRkQ29tbWVudCIKLQkJCXZhbHVlPSIxMjcsIDEyNywgMTI3Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJkdGRLZXl3b3JkIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kdGRLZXl3b3JkIgotCQkJdmFsdWU9IjEyOCwgMCwgMCI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZHRkU3RyaW5nIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kdGRTdHJpbmciCi0JCQl2YWx1ZT0iNjMsIDE1OSwgOTUiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImR0ZERhdGEiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmR0ZERhdGEiCi0JCQl2YWx1ZT0iMTkxLCA5NSwgOTUiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImR0ZFN5bWJvbCIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZHRkU3ltYm9sIgotCQkJdmFsdWU9IjEyOCwgMCwgMCI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJ0b29sYmFyOm9yZy5lY2xpcHNlLndzdC54bWwudWkucGVyc3BlY3RpdmUuTmV3RmlsZVRvb2xCYXIiPgotICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZCIKLSAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld2R0ZF93aXouZ2lmIgotICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5uZXdEVERGaWxlIgotICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgdG9vbHRpcD0iJURURF9OZXdfRmlsZS50b29sdGlwIj4KLSAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im5ld1dpemFyZElkIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQuTmV3RFREV2l6YXJkIi8+Ci0gICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZVdvcmtiZW5jaFdpbmRvdy5hY3RpdmVQZXJzcGVjdGl2ZSI+Ci0JCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wZXJzcGVjdGl2ZSIvPgotCQkJPC93aXRoPgotICAgICAgICAgICA8L3Zpc2libGVXaGVuPiAgICAgICAgIAotICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLSAgPC9leHRlbnNpb24+Ci0KLSA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0JPGNvbW1vbldpemFyZCB0eXBlPSJuZXciIHdpemFyZElkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLndpemFyZC5OZXdEVERXaXphcmQiIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS53c3QueG1sLm5ldy5tZW51R3JvdXAiPgotCQk8ZW5hYmxlbWVudD4KLQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4KLQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVXb3JrYmVuY2hXaW5kb3cuYWN0aXZlUGVyc3BlY3RpdmUiPgotCQkJICAgPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wZXJzcGVjdGl2ZSIvPgotCQkJPC93aXRoPgotCQk8L2VuYWJsZW1lbnQ+Ci0JPC9jb21tb25XaXphcmQ+Ci0gPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RUREVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFRERWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYWQ3ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFRERWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci0KLS8qKgotICogQSBEVEQgRWRpdG9yIHN1YmNsYXNzIFN0cnVjdHVyZWRUZXh0RWRpdG9yLCByZXF1aXJlZCB0byBzdXBwbHkgYSBjb21wbGV0ZQotICogcmVwbGFjZW1lbnQgZm9yIHRoZSBwcm9wZXJ0eSBzaGVldCBwYWdlLiBXaGVuIGEgYmV0dGVyIHNvbHV0aW9uIGlzIGZvdW5kLAotICogdGhpcyBjbGFzcyB3aWxsIGJlIHJlbW92ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFZGl0b3IgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciB7Ci0JY2xhc3MgRFREUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciBpbXBsZW1lbnRzIElUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yIHsKLQkJRFREUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yI2dldENvbnRyaWJ1dG9ySWQoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb250cmlidXRvcklkKCkgewotCQkJcmV0dXJuIGdldEVkaXRvclNpdGUoKS5nZXRJZCgpOwotCQl9Ci0JfQotCi0JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgZlByb3BlcnR5U2hlZXRQYWdlOwotCi0JcHVibGljIERUREVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUFkYXB0YWJsZSNnZXRBZGFwdGVyKENsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyByZXF1aXJlZCkgewotCQlpZiAoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpIHsKLQkJCWlmIChmUHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkgewotCQkJCWZQcm9wZXJ0eVNoZWV0UGFnZSA9IG5ldyBEVERUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZShuZXcgRFREUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcigpKTsKLQkJCQkvKgotCQkJCSAqIEFkZCB0aGUgcHJvcGVydHkgc2hlZXQgcGFnZSBhcyBhIGRpcmVjdCBwb3N0IHNlbGVjdGlvbgotCQkJCSAqIGxpc3RlbmVyIHNvIHN0YW5kYXJkIGN1cnNvciBuYXZpZ2F0aW9uIHRyaWdnZXJzIGEgc2VsZWN0aW9uCi0JCQkJICogbm90aWZpY2F0aW9uLiBUaGUgZGVmYXVsdCB0YWJiZWQgcHJvcGVydHkgc2hlZXQgZG9lcyBub3QKLQkJCQkgKiBsaXN0ZW4gdG8gcG9zdCBzZWxlY3Rpb24uCi0JCQkJICovCi0JCQkJKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBnZXRTZWxlY3Rpb25Qcm92aWRlcigpKS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmICFmUHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCWZQcm9wZXJ0eVNoZWV0UGFnZS5zZWxlY3Rpb25DaGFuZ2VkKERUREVkaXRvci50aGlzLCBnZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJcmV0dXJuIGZQcm9wZXJ0eVNoZWV0UGFnZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihyZXF1aXJlZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgZWRpdG9ySW5wdXQpOwotCi0JCUlXb3JrYmVuY2hXaW5kb3cgZHcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gZHcuZ2V0QWN0aXZlUGFnZSgpOwotCQl0cnkgewotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPUF9TSEVFVCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREUHJvcGVydGllc01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERQcm9wZXJ0aWVzTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4ZjkwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERQcm9wZXJ0aWVzTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBEVERQcm9wZXJ0aWVzTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uT2NjdXJyZW5jZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9PTkNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9PTkVfT1JfTU9SRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfT1BUSU9OQUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1pFUk9fT1JfTU9SRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfT0NDVVJSRU5DRTsKLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5BdHRyaWJ1ZURlZmF1bHRTZWN0aW9uLmphdmEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfREVGQVVMVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVVNBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RFRkFVTFRfVkFMVUU7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxHcm91cFNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TRVFVRU5DRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0hPSUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9NT0RFTF9HUk9VUDsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbE5hbWVTZWN0aW9uLmphdmEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09OVEVOVF9NT0RFTDsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbFR5cGVTZWN0aW9uLmphdmEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09OVEVOVF9UWVBFOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmFtZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OQU1FOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uVHlwZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9UWVBFOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VHlwZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlRJVFlfVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRVhURVJOQUxfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QQVJBTUVURVJfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9HRU5FUkFMX0VOVElUWTsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVudGl0eVZhbHVlU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9WQUxVRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUFVCTElDX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TWVNURU1fSUQ7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5EVERTZWN0aW9uTGFiZWxQcm92aWRlcgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0VMRU1FTlRfUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfQ0hPSUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfU0VRVUVOQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9BVFRMSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfQ09NTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX05PVEFUSU9OOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmV3RW50aXR5U2VjdGlvbgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GSUxFRElBTE9HX1NFTEVDVF9EVEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZJTEVESUFMT0dfU0VMRUNUX0RURF9ERVNDOwotCi0JLy8gTmV3IHByb3BlcnR5IHRhYnMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfR0VORVJBTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfT1RIRVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FUVFJJQlVURVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFRERWRpdG9yXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFRERWRpdG9yXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFRERWRpdG9yXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFRERWRpdG9yXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzExOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERTZWN0aW9uTGFiZWxQcm92aWRlcl84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzk7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRFREUHJvcGVydGllc01lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCWZSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBmUmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JcHJpdmF0ZSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERQcm9wZXJ0aWVzTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFByb3BlcnRpZXNNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDE5YmE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFByb3BlcnRpZXNNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotISBQcm9wZXJ0aWVzIGZpbGUgZm9yIGNvbXBvbmVudDogWE1MIHRvb2xzIERURCBFZGl0b3IKLSEgUGFja2FnZWQgZm9yIHRyYW5zbGF0aW9uIGluOiAgeG1sLnppcAotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk9jY3VycmVuY2VTZWN0aW9uLmphdmEKLV9VSV9PTkNFICAgICAgICAgICAgID0gSnVzdCBvbmNlICgxKQotX1VJX09ORV9PUl9NT1JFICAgICAgPSBPbmUgb3IgbW9yZSAoKykKLV9VSV9PUFRJT05BTCAgICAgICAgID0gT3B0aW9uYWwgKD8pCi1fVUlfWkVST19PUl9NT1JFICAgICA9IFplcm8gb3IgbW9yZSAoKikKLV9VSV9MQUJFTF9PQ0NVUlJFTkNFID0gT2NjdXJyZW5jZQotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkF0dHJpYnV0ZURlZmF1bHRTZWN0aW9uLmphdmEKLV9VSV9ERUZBVUxUICAgICAgICAgICAgID0gRGVmYXVsdAotX1VJX0xBQkVMX1VTQUdFICAgICAgICAgPSBVc2FnZQotX1VJX0xBQkVMX0RFRkFVTFRfVkFMVUUgPSBEZWZhdWx0IFZhbHVlCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uLmphdmEKLV9VSV9TRVFVRU5DRSAgICAgICAgICA9IFNlcXVlbmNlICgsKQotX1VJX0NIT0lDRSAgICAgICAgICAgID0gQ2hvaWNlICh8KQotX1VJX0xBQkVMX01PREVMX0dST1VQID0gTW9kZWwgR3JvdXAKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxOYW1lU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfQ09OVEVOVF9NT0RFTCA9IENvbnRlbnQgTW9kZWwKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxUeXBlU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfQ09OVEVOVF9UWVBFID0gQ29udGVudCBUeXBlCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmFtZVNlY3Rpb24uamF2YQotX1VJX0xBQkVMX05BTUUgPSBOYW1lCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uVHlwZVNlY3Rpb24uamF2YQotX1VJX0xBQkVMX1RZUEUgPSBUeXBlCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VHlwZVNlY3Rpb24uamF2YQotX1VJX0xBQkVMX0VOVElUWV9UWVBFICAgICAgPSBFbnRpdHkgVHlwZQotX1VJX0xBQkVMX0VYVEVSTkFMX0VOVElUWSAgPSBFeHRlcm5hbAotX1VJX0xBQkVMX1BBUkFNRVRFUl9FTlRJVFkgPSBQYXJhbWV0ZXIKLV9VSV9MQUJFTF9HRU5FUkFMX0VOVElUWSAgID0gR2VuZXJhbAotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVudGl0eVZhbHVlU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfRU5USVRZX1ZBTFVFID0gRW50aXR5IFZhbHVlCi1fVUlfTEFCRUxfUFVCTElDX0lEICAgID0gUHVibGljIElECi1fVUlfTEFCRUxfU1lTVEVNX0lEICAgID0gU3lzdGVtIElECi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRFREU2VjdGlvbkxhYmVsUHJvdmlkZXIKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRUxFTUVOVCAgICAgPSBlbGVtZW50Ci1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0VMRU1FTlRfUkVGID0gZWxlbWVudCByZWZlcmVuY2UKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfQ0hPSUNFICAgICAgPSBjaG9pY2UKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfU0VRVUVOQ0UgICAgPSBzZXF1ZW5jZQotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9BVFRSSUJVVEUgICA9IGF0dHJpYnV0ZQotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9BVFRMSVNUICAgICA9IGF0dHJpYnV0ZSBsaXN0Ci1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0NPTU1FTlQgICAgID0gY29tbWVudAotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9FTlRJVFkgICAgICA9IGVudGl0eQotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9OT1RBVElPTiAgICA9IG5vdGF0aW9uCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmV3RW50aXR5U2VjdGlvbgotX1VJX0ZJTEVESUFMT0dfU0VMRUNUX0RURCA9IFNlbGVjdCBEVEQgZmlsZQotX1VJX0ZJTEVESUFMT0dfU0VMRUNUX0RURF9ERVNDICAgPSBTZWxlY3QgYSBEVEQgZmlsZSBmcm9tIHRoZSBXb3JrYmVuY2ggcHJvamVjdHMKLQotISBOZXcgcHJvcGVydHkgdGFicwotX1VJX0xBQkVMX0dFTkVSQUwgICAgICAgPSBHZW5lcmFsCi1fVUlfTEFCRUxfT1RIRVIgICAgICAgICA9IE90aGVyCi1fVUlfTEFCRUxfQVRUUklCVVRFUyAgICA9IEF0dHJpYnV0ZXMKLV9VSV9MQUJFTF9ET0NVTUVOVEFUSU9OID0gRG9jdW1lbnRhdGlvbgotISBlbmQKLURUREVkaXRvcl8wPWdlbmVyYWwKLURUREVkaXRvcl8xPW90aGVyCi1EVERFZGl0b3JfMj1hdHRyaWJ1dGVzCi1EVERFZGl0b3JfMz1kb2N1bWVudGF0aW9uCi1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8wPWNob2ljZQotRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMT1zZXF1ZW5jZQotRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfNj1lbGVtZW50Ci1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl83PWF0dHJpYnV0ZQotRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfOD1hdHRyaWJ1dGUgbGlzdAotRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfOT1jb21tZW50Ci1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xMD1lbnRpdHkKLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzExPW5vdGF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjYTg1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLWNsYXNzIERURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIGV4dGVuZHMgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgewotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIG9sZFNlbGVjdGlvbiA9IG51bGw7Ci0KLQlwdWJsaWMgRFREVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UoSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcikgewotCQlzdXBlcih0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvciA9IGFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCS8vIG1ha2Ugc3VyZSB0aGUgY29ycmVjdCBlZGl0b3IgaXMgYWN0aXZlCi0JCQkJCWlmIChhY3RpdmVFZGl0b3IuZ2V0QWRhcHRlcihJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpID09IERURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLnRoaXMpIHsKLQkJCQkJCWlmIChvbGRTZWxlY3Rpb24gPT0gbnVsbCB8fCAhb2xkU2VsZWN0aW9uLmVxdWFscyhzZWxlY3Rpb24pKSB7Ci0JCQkJCQkJb2xkU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkJCQkJCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgc2VsZWN0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3NDc0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQWJzdHJhY3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0U2VjdGlvbiBpbXBsZW1lbnRzIElTZWN0aW9uLCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgTGlzdGVuZXIsIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQlwcml2YXRlIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3Rvcnk7Ci0JcHJvdGVjdGVkIElXb3JrYmVuY2hQYXJ0IGZXb3JrYmVuY2hQYXJ0OwotCXByb3RlY3RlZCBJU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0JcHJvdGVjdGVkIE9iamVjdCBmSW5wdXQ7Ci0JcHJvdGVjdGVkIGludCByaWdodE1hcmdpblNwYWNlOwotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5nZXRXaWRnZXRGYWN0b3J5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBhRmFjdG9yeSkgewotCQl0aGlzLmZhY3RvcnkgPSBhRmFjdG9yeTsKLQkJR0MgZ2MgPSBuZXcgR0MocGFyZW50KTsKLQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCgiICAuLi4gICIpOyAvLyROT04tTkxTLTEkCi0JCXJpZ2h0TWFyZ2luU3BhY2UgPSBleHRlbnQueDsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3NldElucHV0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsKSB7Ci0JCUFzc2VydC5pc1RydWUoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24sICJzZWxlY3Rpb24gIiArIHNlbC5nZXRDbGFzcygpICsgImlzIG5vdCBzdHJ1Y3R1cmVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0aGlzLmZXb3JrYmVuY2hQYXJ0ID0gcGFydDsKLQkJdGhpcy5mU2VsZWN0aW9uID0gc2VsOwotCQl0aGlzLmZJbnB1dCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkvKgotCQkgKiBpZiAoZklucHV0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpIHsgeHNkU2NoZW1hID0KLQkJICogKChYU0RDb25jcmV0ZUNvbXBvbmVudClmSW5wdXQpLmdldFNjaGVtYSgpOyB9Ci0JCSAqLwotCi0JCS8vIHJlZnJlc2goKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNhYm91dFRvQmVTaG93bigpCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb0JlU2hvd24oKSB7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNhYm91dFRvQmVIaWRkZW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIGFib3V0VG9CZUhpZGRlbigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2dldE1pbmltdW1IZWlnaHQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluaW11bUhlaWdodCgpIHsKLQkJcmV0dXJuIFNXVC5ERUZBVUxUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbnB1dCgpIHsKLQkJaWYgKGZJbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCS8vIGZJbnB1dCA9IHhzZFNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KChFbGVtZW50KWZJbnB1dCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHdpZGdldCBmYWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdpZGdldCBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBnZXRXaWRnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJiBnZXRJbnB1dCgpICE9IG51bGwgJiYgIWlzSW5Eb0hhbmRsZSkgewotCQkJaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLQkJCWRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKGUpOwotCQkJaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmIGdldElucHV0KCkgIT0gbnVsbCAmJiAhaXNJbkRvSGFuZGxlKSB7Ci0JCQlpc0luRG9IYW5kbGUgPSB0cnVlOwotCQkJZG9XaWRnZXRTZWxlY3RlZChlKTsKLQkJCWlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotCQl9Ci0KLQl9Ci0KLQlib29sZWFuIGxpc3RlbmVyRW5hYmxlZCA9IHRydWU7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmVyRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGxpc3RlbmVyRW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGxpc3RlbmVyRW5hYmxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lckVuYWJsZWQoYm9vbGVhbiB2KSB7Ci0JCXRoaXMubGlzdGVuZXJFbmFibGVkID0gdjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJiAhaXNJbkRvSGFuZGxlKSB7Ci0JCQlpc0luRG9IYW5kbGUgPSB0cnVlOwotCQkJc3RhcnREZWxheWVkRXZlbnQoZXZlbnQpOwotCQkJaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JfQotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCi0JfQotCi0JcHJvdGVjdGVkIERlbGF5ZWRFdmVudCBkZWxheWVkVGFzazsKLQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0RGVsYXllZEV2ZW50KEV2ZW50IGUpIHsKLQkJaWYgKGRlbGF5ZWRUYXNrID09IG51bGwgfHwgZGVsYXllZFRhc2suZ2V0RXZlbnQoKSA9PSBudWxsKSB7Ci0JCQlkZWxheWVkVGFzayA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLQkJCWRlbGF5ZWRUYXNrLnNldEV2ZW50KGUpOwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwMCwgZGVsYXllZFRhc2spOwotCQl9Ci0JCWVsc2UgewotCQkJRXZlbnQgZGVsYXllZEV2ZW50ID0gZGVsYXllZFRhc2suZ2V0RXZlbnQoKTsKLQotCQkJaWYgKGUud2lkZ2V0ID09IGRlbGF5ZWRFdmVudC53aWRnZXQgJiYgZS50eXBlID09IGRlbGF5ZWRFdmVudC50eXBlKSB7Ci0JCQkJLy8gc2FtZSBldmVudCwganVzdCBkaWZmZXJlbnQgZGF0YSwgZGVsYXkgbmV3IGV2ZW50Ci0JCQkJZGVsYXllZFRhc2suc2V0RXZlbnQobnVsbCk7Ci0JCQl9Ci0JCQlkZWxheWVkVGFzayA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLQkJCWRlbGF5ZWRUYXNrLnNldEV2ZW50KGUpOwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwMCwgZGVsYXllZFRhc2spOwotCQl9Ci0JfQotCi0JY2xhc3MgRGVsYXllZEV2ZW50IGltcGxlbWVudHMgUnVubmFibGUgewotCQlwcm90ZWN0ZWQgRXZlbnQgZXZlbnQ7Ci0KLQkJLyoKLQkJICogQHNlZSBSdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCQlpc0luRG9IYW5kbGUgPSB0cnVlOwotCQkJCWRvSGFuZGxlRXZlbnQoZXZlbnQpOwotCQkJCWlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotCQkJCWV2ZW50ID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBHZXRzIHRoZSBldmVudC4KLQkJICogCi0JCSAqIEByZXR1cm4gUmV0dXJucyBhIEV2ZW50Ci0JCSAqLwotCQlwdWJsaWMgRXZlbnQgZ2V0RXZlbnQoKSB7Ci0JCQlyZXR1cm4gZXZlbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogU2V0cyB0aGUgZXZlbnQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZXZlbnQKLQkJICogICAgICAgICAgICBUaGUgZXZlbnQgdG8gc2V0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRFdmVudChFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50ID0gZTsKLQkJfQotCi0JfQotCi0JYm9vbGVhbiBpc0luRG9IYW5kbGU7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGlzSW5Eb0hhbmRsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGlzSW5Eb0hhbmRsZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luRG9IYW5kbGUoKSB7Ci0JCXJldHVybiBpc0luRG9IYW5kbGU7Ci0JfQotCi0Jc3RhdGljIHByb3RlY3RlZCBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0KLQkJcmV0dXJuIGVkaXRvclBhcnQ7Ci0JfQotCi0Jc3RhdGljIHByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgZ2V0U3RhdHVzTGluZU1hbmFnZXIoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkgewotCQlJU3RhdHVzTGluZU1hbmFnZXIgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gKEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBlZGl0b3JQYXJ0LmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQkJcmVzdWx0ID0gY29udHJpYnV0b3IuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlEb2N1bWVudEltcGwgZ2V0RG9jdW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoRG9jdW1lbnRJbXBsKSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhTdHJpbmcgZGVzY3JpcHRpb24sIEVsZW1lbnQgZWxlbWVudCkgewotCQlEb2N1bWVudEltcGwgZG9jID0gZ2V0RG9jdW1lbnQoZWxlbWVudCk7Ci0JCWRvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCURvY3VtZW50SW1wbCBkb2MgPSBnZXREb2N1bWVudChlbGVtZW50KTsKLQotCQlkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlTGFuZ3VhZ2UoU3RyaW5nIGxhbmcpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQcmVmaXgoU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BdHRyaWJ1dGVEZWZhdWx0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjRiMTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BdHRyaWJ1dGVEZWZhdWx0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZURlZmF1bHRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIElNUExJRUQgPSBBdHRyaWJ1dGUuSU1QTElFRDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBSRVFVSVJFRCA9IEF0dHJpYnV0ZS5SRVFVSVJFRDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBGSVhFRCA9IEF0dHJpYnV0ZS5GSVhFRDsKLQotCXByaXZhdGUgQ0NvbWJvIHVzYWdlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSB1c2FnZUNvbWJvVmFsdWVzID0ge0lNUExJRUQsIFJFUVVJUkVELCBGSVhFRCwgRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9ERUZBVUxUfTsKLQlwcml2YXRlIFRleHQgZGVmYXVsdFZhbHVlVGV4dDsKLQlwcml2YXRlIENMYWJlbCBkZWZhdWx0VmFsdWVMYWJlbDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCB1c2FnZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfVVNBR0UpOwotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSB1c2FnZUxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJdXNhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXVzYWdlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCh1c2FnZUxhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodXNhZ2VMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXVzYWdlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdXNhZ2VDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJdXNhZ2VDb21iby5zZXRJdGVtcyh1c2FnZUNvbWJvVmFsdWVzKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlkZWZhdWx0VmFsdWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0RFRkFVTFRfVkFMVUUpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJcCA9IGRlZmF1bHRWYWx1ZUxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHVzYWdlTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJZGVmYXVsdFZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlkZWZhdWx0VmFsdWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZGVmYXVsdFZhbHVlTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkZWZhdWx0VmFsdWVMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCWRlZmF1bHRWYWx1ZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGVmYXVsdFZhbHVlVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQkJU3RyaW5nIGtpbmQgPSAoKEF0dHJpYnV0ZSkgaW5wdXQpLmdldERlZmF1bHRLaW5kKCk7Ci0JCQkJaWYgKCIiLmVxdWFscyhraW5kKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl1c2FnZUNvbWJvLnNldFRleHQoRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9ERUZBVUxUKTsKLQkJCQllbHNlCi0JCQkJCXVzYWdlQ29tYm8uc2V0VGV4dChraW5kKTsKLQotCQkJCWlmICgiIi5lcXVhbHMoa2luZCkgfHwgRklYRUQuZXF1YWxzKGtpbmQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVmYXVsdFZhbHVlTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0VGV4dCgoKEF0dHJpYnV0ZSkgaW5wdXQpLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVmYXVsdFZhbHVlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSB1c2FnZUNvbWJvKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQkJU3RyaW5nIHVzYWdlID0gdXNhZ2VDb21iby5nZXRUZXh0KCk7Ci0JCQkJQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChBdHRyaWJ1dGUpIGlucHV0OwotCQkJCWlmICh1c2FnZS5lcXVhbHMoRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9ERUZBVUxUKSkKLQkJCQkJYXR0cmlidXRlLnNldERlZmF1bHRLaW5kKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UKLQkJCQkJYXR0cmlidXRlLnNldERlZmF1bHRLaW5kKHVzYWdlKTsKLQotCQkJCWlmIChEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0RFRkFVTFQuZXF1YWxzKHVzYWdlKSB8fCBGSVhFRC5lcXVhbHModXNhZ2UpKSB7Ci0JCQkJCWRlZmF1bHRWYWx1ZUxhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZGVmYXVsdFZhbHVlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCWlmIChldmVudC53aWRnZXQgPT0gZGVmYXVsdFZhbHVlVGV4dCkgewotCQkJCVN0cmluZyBuZXdWYWx1ZSA9IGRlZmF1bHRWYWx1ZVRleHQuZ2V0VGV4dCgpOwotCQkJCSgoQXR0cmlidXRlKSBpbnB1dCkuc2V0RGVmYXVsdFZhbHVlKG5ld1ZhbHVlLCB1c2FnZUNvbWJvLmdldFRleHQoKS5lcXVhbHMoRklYRUQpKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29tbWVudFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db21tZW50U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzlmMmRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db21tZW50U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Db21tZW50OwotCi1wdWJsaWMgY2xhc3MgQ29tbWVudFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgVGV4dCBjb21tZW50VGV4dDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWNvbW1lbnRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk1VTFRJIHwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCWNvbW1lbnRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIENvbW1lbnRTZWN0aW9uLnRoaXMpOwotCi0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQljb21tZW50VGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCWNvbW1lbnRUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWNvbW1lbnRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDb21tZW50KQotCQkJCWNvbW1lbnRUZXh0LnNldFRleHQoKChDb21tZW50KSBpbnB1dCkuZ2V0VGV4dCgpKTsKLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBjb21tZW50VGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwICYmIGlucHV0IGluc3RhbmNlb2YgQ29tbWVudCkgewotCQkJCUNvbW1lbnQgY29tbWVudCA9IChDb21tZW50KSBpbnB1dDsKLQkJCQljb21tZW50LnNldFRleHQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NTE4NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTRVFVRU5DRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfU0VRVUVOQ0U7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ0hPSUNFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9DSE9JQ0U7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTU9ERUxfR1JPVVAgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX01PREVMX0dST1VQOwotCi0JcHJpdmF0ZSBDQ29tYm8gbW9kZWxHcm91cENvbWJvOwotCXByaXZhdGUgU3RyaW5nW10gbW9kZWxHcm91cENvbWJvVmFsdWVzID0ge1NFUVVFTkNFLCBDSE9JQ0V9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIGNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNT0RFTF9HUk9VUCk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gY0xhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbW9kZWxHcm91cENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJbW9kZWxHcm91cENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW1vZGVsR3JvdXBDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJbW9kZWxHcm91cENvbWJvLnNldEl0ZW1zKG1vZGVsR3JvdXBDb21ib1ZhbHVlcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkJQ01Hcm91cE5vZGUgbm9kZSA9IChDTUdyb3VwTm9kZSkgaW5wdXQ7Ci0JCQkJY2hhciBtb2RlbFR5cGUgPSBub2RlLmdldENvbm5lY3RvcigpOwotCQkJCWlmIChDTUdyb3VwTm9kZS5DSE9JQ0UgPT0gbW9kZWxUeXBlKQotCQkJCQltb2RlbEdyb3VwQ29tYm8uc2V0VGV4dChDSE9JQ0UpOwotCQkJCWVsc2UgaWYgKENNR3JvdXBOb2RlLlNFUVVFTkNFID09IG1vZGVsVHlwZSkKLQkJCQkJbW9kZWxHcm91cENvbWJvLnNldFRleHQoU0VRVUVOQ0UpOwotCQkJfQotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSBtb2RlbEdyb3VwQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJCUNNR3JvdXBOb2RlIG5vZGUgPSAoQ01Hcm91cE5vZGUpIGlucHV0OwotCQkJCWlmIChDSE9JQ0UuZXF1YWxzKG1vZGVsR3JvdXBDb21iby5nZXRUZXh0KCkpKQotCQkJCQlub2RlLnNldENvbm5lY3RvcihDTUdyb3VwTm9kZS5DSE9JQ0UpOwotCQkJCWVsc2UgaWYgKFNFUVVFTkNFLmVxdWFscyhtb2RlbEdyb3VwQ29tYm8uZ2V0VGV4dCgpKSkKLQkJCQkJbm9kZS5zZXRDb25uZWN0b3IoQ01Hcm91cE5vZGUuU0VRVUVOQ0UpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbE5hbWVGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxOYW1lRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNTBiZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbE5hbWVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudE1vZGVsTmFtZUZpbHRlciBpbXBsZW1lbnRzIElGaWx0ZXIgewotCXB1YmxpYyBib29sZWFuIHNlbGVjdChPYmplY3QgdG9UZXN0KSB7Ci0JCXJldHVybiB0b1Rlc3QgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSAmJiAhKChDTUJhc2ljTm9kZSkgdG9UZXN0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxOYW1lU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbE5hbWVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYjFlY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbE5hbWVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIENvbnRlbnRNb2RlbE5hbWVTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBDT05URU5UX01PREVMID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9DT05URU5UX01PREVMOwotCi0JcHJpdmF0ZSBDQ29tYm8gdHlwZUNvbWJvOwotCXByaXZhdGUgU3RyaW5nW10gdHlwZUNvbWJvVmFsdWVzID0ge0NNTm9kZS5QQ0RBVEF9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIGNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBDT05URU5UX01PREVMKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBjTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJdHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJdHlwZUNvbWJvLnNldEl0ZW1zKHR5cGVDb21ib1ZhbHVlcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCQl0eXBlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuUENEQVRBKTsKLQkJCQkvLyBOb2RlTGlzdCBsaXN0ID0KLQkJCQkvLyAoKENNQmFzaWNOb2RlKWZJbnB1dCkuZ2V0RFRERmlsZSgpLmdldEVsZW1lbnRzQW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlcygpOwotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gKChDTUJhc2ljTm9kZSkgaW5wdXQpLmdldERUREZpbGUoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCQkJYm9vbGVhbiBpc0ZvclJvb3RDb250ZW50ID0gKChDTUJhc2ljTm9kZSkgaW5wdXQpLmlzUm9vdEVsZW1lbnRDb250ZW50KCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoIWlzRm9yUm9vdENvbnRlbnQgJiYgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JCQkJCQl0eXBlQ29tYm8uYWRkKG5vZGUuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgJiYgKChFbnRpdHkpIG5vZGUpLmlzUGFyYW1ldGVyRW50aXR5KCkpCi0JCQkJCQl0eXBlQ29tYm8uYWRkKCIlIiArIG5vZGUuZ2V0TmFtZSgpICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCi0JCQkJdHlwZUNvbWJvLnNldFRleHQoKChDTUJhc2ljTm9kZSkgaW5wdXQpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCUNNQmFzaWNOb2RlIG5vZGUgPSAoQ01CYXNpY05vZGUpIGlucHV0OwotCQkJCVN0cmluZyBzZWxlY3RlZCA9IHR5cGVDb21iby5nZXRUZXh0KCk7Ci0JCQkJLy8gaWYgKENNTm9kZS5QQ0RBVEEuZXF1YWxzKHNlbGVjdGVkKSkKLQkJCQlub2RlLnNldE5hbWUoc2VsZWN0ZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsVHlwZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbFR5cGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkYWM4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsVHlwZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudE1vZGVsVHlwZUZpbHRlciBpbXBsZW1lbnRzIElGaWx0ZXIgewotCXB1YmxpYyBib29sZWFuIHNlbGVjdChPYmplY3QgdG9UZXN0KSB7Ci0JCWlmICh0b1Rlc3QgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSAmJiAhKChDTUJhc2ljTm9kZSkgdG9UZXN0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh0b1Rlc3QgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSAmJiAoKENNR3JvdXBOb2RlKSB0b1Rlc3QpLmlzUm9vdEVsZW1lbnRDb250ZW50KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxUeXBlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbFR5cGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NGE4OTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbFR5cGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxUeXBlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9DT05URU5UX1RZUEU7Ci0KLQlwcml2YXRlIENDb21ibyB0eXBlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSB0eXBlQ29tYm9WYWx1ZXMgPSB7Q01Ob2RlLkFOWSwgQ01Ob2RlLkVNUFRZLCBDTU5vZGUuUENEQVRBLCBDTU5vZGUuQ0hJTERSRU4sIENNTm9kZS5NSVhFRH07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgY0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIENPTlRFTlRfVFlQRSk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gY0xhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJdHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJdHlwZUNvbWJvLnNldEl0ZW1zKHR5cGVDb21ib1ZhbHVlcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQkJdHlwZUNvbWJvLnJlbW92ZUFsbCgpOwotCQkJCXR5cGVDb21iby5hZGQoQ01Ob2RlLkFOWSk7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuRU1QVFkpOwotCQkJCXR5cGVDb21iby5hZGQoQ01Ob2RlLlBDREFUQSk7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuQ0hJTERSRU4pOwotCQkJCXR5cGVDb21iby5hZGQoQ01Ob2RlLk1JWEVEKTsKLQotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gKChDTU5vZGUpIGlucHV0KS5nZXREVERGaWxlKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQkJCVN0cmluZyBub2RlTmFtZSA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlub2RlTmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdHlwZUNvbWJvLmluZGV4T2Yobm9kZU5hbWUpID09IC0xKQotCQkJCQkJdHlwZUNvbWJvLmFkZChub2RlTmFtZSk7Ci0JCQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgJiYgKChFbnRpdHkpIG5vZGUpLmlzUGFyYW1ldGVyRW50aXR5KCkgJiYgdHlwZUNvbWJvLmluZGV4T2Yobm9kZU5hbWUpID09IC0xKQotCQkJCQkJdHlwZUNvbWJvLmFkZCgiJSIgKyBub2RlTmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkKLQkJCQkJdHlwZUNvbWJvLnNldFRleHQoKChDTUdyb3VwTm9kZSkgaW5wdXQpLmdldFR5cGUoKSk7Ci0JCQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkKLQkJCQkJdHlwZUNvbWJvLnNldFRleHQoKChDTUJhc2ljTm9kZSkgaW5wdXQpLmdldFR5cGUoKSk7Ci0JCQl9Ci0JCX0gLy8gZW5kIGlmIChmSW5wdXQgIT0gbnVsbCkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSB8fCBpbnB1dCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJQ01Ob2RlIG5vZGUgPSAoQ01Ob2RlKSBpbnB1dDsKLQkJCQlTdHJpbmcgc2VsZWN0ZWQgPSB0eXBlQ29tYm8uZ2V0VGV4dCgpOwotCQkJCWlmIChDTU5vZGUuTUlYRUQuZXF1YWxzKHNlbGVjdGVkKSkKLQkJCQkJbm9kZS5zZXRNaXhlZENvbnRlbnQoKTsKLQkJCQllbHNlIGlmIChDTU5vZGUuQ0hJTERSRU4uZXF1YWxzKHNlbGVjdGVkKSkKLQkJCQkJbm9kZS5zZXRDaGlsZHJlbkNvbnRlbnQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZWxzZSBpZiAoQ01Ob2RlLkVNUFRZLmVxdWFscyhzZWxlY3RlZCkgfHwgQ01Ob2RlLkFOWS5lcXVhbHMoc2VsZWN0ZWQpIHx8IENNTm9kZS5QQ0RBVEEuZXF1YWxzKHNlbGVjdGVkKSkKLQkJCQkJbm9kZS5zZXRDb250ZW50KHNlbGVjdGVkKTsKLQkJCQllbHNlCi0JCQkJCW5vZGUuc2V0Q2hpbGRyZW5Db250ZW50KHNlbGVjdGVkKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFNlY3Rpb25MYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREU2VjdGlvbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkMzdhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREU2VjdGlvbkxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01SZXBlYXRhYmxlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QuZXF1YWxzKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUltYWdlIHJlc3VsdCA9IG51bGw7Ci0KLQkJT2JqZWN0IHNlbGVjdGVkID0gb2JqZWN0OwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXNlbGVjdGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0KS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gKChEVERGaWxlKSBzZWxlY3RlZCkuZ2V0SW1hZ2UoKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoKERURE5vZGUpIHNlbGVjdGVkKS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uRWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QuZXF1YWxzKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU9iamVjdCBzZWxlY3RlZCA9IG9iamVjdDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG9iamVjdCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQotCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQlyZXR1cm4gKChEVERGaWxlKSBzZWxlY3RlZCkuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCWlmICgoKENNQmFzaWNOb2RlKSBzZWxlY3RlZCkuaXNSZWZlcmVuY2UoKSkKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRUxFTUVOVF9SRUY7Ci0JCQllbHNlCi0JCQkJcmV0dXJuICgoQ01CYXNpY05vZGUpIHNlbGVjdGVkKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBDTVJlcGVhdGFibGVOb2RlKSB7Ci0JCQlDTVJlcGVhdGFibGVOb2RlIG5vZGUgPSAoQ01SZXBlYXRhYmxlTm9kZSkgc2VsZWN0ZWQ7Ci0JCQlTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJCWlmICgoKENNR3JvdXBOb2RlKSBub2RlKS5nZXRDb25uZWN0b3IoKSA9PSBDTUdyb3VwTm9kZS5DSE9JQ0UpCi0JCQkJCW5hbWUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMDsKLQkJCQllbHNlCi0JCQkJCW5hbWUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTsKLQkJCX0KLQkJCWNoYXIgb2NjdXJyZW5jZSA9IG5vZGUuZ2V0T2NjdXJyZW5jZSgpOwotCQkJc3dpdGNoIChvY2N1cnJlbmNlKSB7Ci0JCQkJY2FzZSBDTVJlcGVhdGFibGVOb2RlLk9OQ0UgOgotCQkJCQluYW1lICs9ICIgWzEuLjFdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENNUmVwZWF0YWJsZU5vZGUuT1BUSU9OQUwgOgotCQkJCQluYW1lICs9ICIgWzAuLjFdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENNUmVwZWF0YWJsZU5vZGUuT05FX09SX01PUkUgOgotCQkJCQluYW1lICs9ICIgWzEuLipdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENNUmVwZWF0YWJsZU5vZGUuWkVST19PUl9NT1JFIDoKLQkJCQkJbmFtZSArPSAiIFswLi4qXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JCQkJcmV0dXJuIERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl82OwotCQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpCi0JCQkJcmV0dXJuIERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl83OwotCQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfODsKLQkJCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQ29tbWVudCkKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzk7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEVudGl0eSkKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzEwOwotCQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBOb3RhdGlvbikKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzExOwotCQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpCi0JCQkJLy8gcmV0dXJuICJwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZSI7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQllbHNlCi0JCQkJcmV0dXJuICgoRFRETm9kZSkgc2VsZWN0ZWQpLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLkVsZW1lbnQpIHsKLQkJCXJldHVybiAoKG9yZy53M2MuZG9tLkVsZW1lbnQpIHNlbGVjdGVkKS5nZXRMb2NhbE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzE1MzEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotCi0vKioKLSAqIEV4dGVuZCB0aGUgYmFzZSB3aXphcmQgdG8gc2VsZWN0IGEgZmlsZSBmcm9tIHRoZSBwcm9qZWN0IG9yIG91dHNpZGUgdGhlCi0gKiB3b3JrYmVuY2ggYW5kIGFkZCBlcnJvciBoYW5kbGluZwotICovCi1jbGFzcyBEVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCURURFNlbGVjdFNpbmdsZUZpbGVQYWdlIGZpbGVQYWdlOwotCi0JSUZpbGUgcmVzdWx0RmlsZTsKLQotCXB1YmxpYyBEVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZChTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjLCBWaWV3ZXJGaWx0ZXIgZmlsdGVyLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUodGl0bGUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBEVERSZXNvdXJjZS5ORVdEVEQpKTsKLQotCQkvLyBTZWxlY3QgRmlsZSBQYWdlCi0JCWZpbGVQYWdlID0gbmV3IERURFNlbGVjdFNpbmdsZUZpbGVQYWdlKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCWZpbGVQYWdlLnNldFRpdGxlKHRpdGxlKTsKLQkJZmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oZGVzYyk7Ci0JCWZpbGVQYWdlLmFkZEZpbHRlcihmaWx0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UoZmlsZVBhZ2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbGVQYWdlLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJcmVzdWx0RmlsZSA9IGZpbGVQYWdlLmdldEZpbGUoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElGaWxlIGdldFJlc3VsdEZpbGUoKSB7Ci0JCXJldHVybiByZXN1bHRGaWxlOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBEVEQgRmlsZQotCSAqLwotCWNsYXNzIERURFNlbGVjdFNpbmdsZUZpbGVQYWdlIGV4dGVuZHMgU2VsZWN0U2luZ2xlRmlsZVBhZ2UgewotCQlwdWJsaWMgRFREU2VsZWN0U2luZ2xlRmlsZVBhZ2UoSVdvcmtiZW5jaCB3LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gaXNGaWxlTWFuZGF0b3J5KSB7Ci0JCQlzdXBlcih3LCBzZWxlY3Rpb24sIGlzRmlsZU1hbmRhdG9yeSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJCXJldHVybiBzdXBlci5pc1BhZ2VDb21wbGV0ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFR5cGVNYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERUeXBlTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTM1ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFR5cGVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVHlwZU1hcHBlcjsKLQotcHVibGljIGNsYXNzIERURFR5cGVNYXBwZXIgaW1wbGVtZW50cyBJVHlwZU1hcHBlciB7Ci0JcHVibGljIERURFR5cGVNYXBwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENsYXNzIG1hcFR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0LmdldENsYXNzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RvY3VtZW50U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RvY3VtZW50U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjcyMGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Eb2N1bWVudFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgVGV4dCBjb21tZW50VGV4dDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWNvbW1lbnRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk1VTFRJIHwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCWNvbW1lbnRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQljb21tZW50VGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCWNvbW1lbnRUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWNvbW1lbnRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQkJQ29tbWVudCBjb21tZW50ID0gZ2V0Q29tbWVudE5vZGUoKERURE5vZGUpIGlucHV0KTsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsKQotCQkJCQljb21tZW50VGV4dC5zZXRUZXh0KGNvbW1lbnQuZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5ld1ZhbHVlID0gY29tbWVudFRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCUNvbW1lbnQgY29tbWVudCA9IGdldENvbW1lbnROb2RlKChEVEROb2RlKSBpbnB1dCk7Ci0JCQkJaWYgKGNvbW1lbnQgIT0gbnVsbCkKLQkJCQkJY29tbWVudC5zZXRUZXh0KG5ld1ZhbHVlKTsKLQkJCQllbHNlIHsKLQkJCQkJLy8gQ3JlYXRlIGEgbmV3IGNvbW1lbnQgbm9kZS4KLQkJCQkJKChEVEROb2RlKSBpbnB1dCkuZ2V0RFRERmlsZSgpLmNyZWF0ZUNvbW1lbnQoKERURE5vZGUpIGlucHV0LCBuZXdWYWx1ZSwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBDb21tZW50IGdldENvbW1lbnROb2RlKERURE5vZGUgbm9kZSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5vZGUuZ2V0RFRERmlsZSgpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJRFRETm9kZSBjdXJyZW50Tm9kZSA9IG51bGw7Ci0JCURURE5vZGUgcHJldk5vZGUgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQljdXJyZW50Tm9kZSA9IChEVEROb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobm9kZSA9PSBjdXJyZW50Tm9kZSAmJiBwcmV2Tm9kZSAhPSBudWxsICYmIHByZXZOb2RlIGluc3RhbmNlb2YgQ29tbWVudCkKLQkJCQlyZXR1cm4gKENvbW1lbnQpIHByZXZOb2RlOwotCQkJZWxzZQotCQkJCXByZXZOb2RlID0gY3VycmVudE5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW1wdHlTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW1wdHlTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZjQyOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VtcHR5U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVtcHR5U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzdXBlci5kb0hhbmRsZUV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc3VwZXIucmVmcmVzaCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRNaW5pbXVtSGVpZ2h0KCkgewotCQlyZXR1cm4gMDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VudGl0eVR5cGVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW50aXR5VHlwZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2MzRiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW50aXR5VHlwZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEVudGl0eVR5cGVTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFTlRJVFlfVFlQRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1RZUEU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRVhURVJOQUxfRU5USVRZID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9FWFRFUk5BTF9FTlRJVFk7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9QQVJBTUVURVJfRU5USVRZOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEdFTkVSQUwgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0dFTkVSQUxfRU5USVRZOwotCi0JcHJpdmF0ZSBDQ29tYm8gdHlwZUNvbWJvOwotCXByaXZhdGUgU3RyaW5nW10gdHlwZUNvbWJvVmFsdWVzID0ge1BBUkFNRVRFUiwgR0VORVJBTH07Ci0JcHJpdmF0ZSBCdXR0b24gY2hlY2tCb3g7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlcm5hbEVudGl0eSA9IGZhbHNlOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIGNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBFTlRJVFlfVFlQRSk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gY0xhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJdHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJdHlwZUNvbWJvLnNldEl0ZW1zKHR5cGVDb21ib1ZhbHVlcyk7Ci0KLQkJY2hlY2tCb3ggPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgRVhURVJOQUxfRU5USVRZLCBTV1QuQ0hFQ0spOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJcCA9IGNoZWNrQm94LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoOTUsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJY2hlY2tCb3guc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkJCQkJdHlwZUNvbWJvLnNldFRleHQoUEFSQU1FVEVSKTsKLQkJCQllbHNlCi0JCQkJCXR5cGVDb21iby5zZXRUZXh0KEdFTkVSQUwpOwotCi0JCQkJaWYgKGVudGl0eS5pc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQlpc0V4dGVybmFsRW50aXR5ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCWlzRXh0ZXJuYWxFbnRpdHkgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHR5cGVDb21ibykgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBub2RlID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkID0gdHlwZUNvbWJvLmdldFRleHQoKTsKLQkJCQlpZiAoUEFSQU1FVEVSLmVxdWFscyhzZWxlY3RlZCkpCi0JCQkJCW5vZGUuc2V0UGFyYW1ldGVyRW50aXR5KHRydWUpOwotCQkJCWVsc2UKLQkJCQkJbm9kZS5zZXRQYXJhbWV0ZXJFbnRpdHkoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGUud2lkZ2V0ID09IGNoZWNrQm94KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IG5vZGUgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQlib29sZWFuIHNlbGVjdGVkID0gY2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQkJCW5vZGUuc2V0RXh0ZXJuYWxFbnRpdHkodHJ1ZSk7Ci0JCQkJCWlzRXh0ZXJuYWxFbnRpdHkgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbm9kZS5zZXRFeHRlcm5hbEVudGl0eShmYWxzZSk7Ci0JCQkJCWlzRXh0ZXJuYWxFbnRpdHkgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnRpdHlWYWx1ZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnRpdHlWYWx1ZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmMzU2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW50aXR5VmFsdWVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEVudGl0eVZhbHVlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVkFMVUUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9WQUxVRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQVUJMSUNfSUQgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1BVQkxJQ19JRDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTWVNURU1fSUQgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1NZU1RFTV9JRDsKLQotCXByaXZhdGUgVGV4dCB2YWx1ZVRleHQ7Ci0JcHJpdmF0ZSBUZXh0IHB1YmxpY0lkVGV4dDsKLQlwcml2YXRlIFRleHQgc3lzdGVtSWRUZXh0OwotCi0JcHJpdmF0ZSBDTGFiZWwgdmFsdWVMYWJlbDsKLQlwcml2YXRlIENMYWJlbCBwdWJsaWNJZExhYmVsOwotCXByaXZhdGUgQ0xhYmVsIHN5c3RlbUlkTGFiZWw7Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gdmFsdWVUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gdmFsdWVUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQllbnRpdHkuc2V0VmFsdWUobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBwdWJsaWNJZFRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBwdWJsaWNJZFRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWVudGl0eS5zZXRQdWJsaWNJRChuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHN5c3RlbUlkVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IHN5c3RlbUlkVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldFN5c3RlbUlEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCXZhbHVlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgVkFMVUUpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IHZhbHVlTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQl2YWx1ZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gRW50aXR5IFZhbHVlCi0JCXZhbHVlVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHZhbHVlTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh2YWx1ZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJdmFsdWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXZhbHVlVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlwdWJsaWNJZExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFBVQkxJQ19JRCk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlwID0gcHVibGljSWRMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh2YWx1ZUxhYmVsLCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXB1YmxpY0lkTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBQdWJsaWMgSUQKLQkJcHVibGljSWRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlwdWJsaWNJZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcHVibGljSWRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCXN5c3RlbUlkTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgU1lTVEVNX0lEKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCXAgPSBzeXN0ZW1JZExhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJc3lzdGVtSWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIFN5c3RlbSBJRAotCQlzeXN0ZW1JZFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChzeXN0ZW1JZExhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc3lzdGVtSWRMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXN5c3RlbUlkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzeXN0ZW1JZFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJaWYgKGlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJdmFsdWVMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXZhbHVlVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXB1YmxpY0lkTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCXB1YmxpY0lkVGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCQkJc3lzdGVtSWRMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJc3lzdGVtSWRUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0KLQkJCXB1YmxpY0lkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQlwdWJsaWNJZFRleHQuc2V0VGV4dCgoZW50aXR5KS5nZXRQdWJsaWNJRCgpKTsKLQkJCQlzeXN0ZW1JZFRleHQuc2V0VGV4dCgoZW50aXR5KS5nZXRTeXN0ZW1JRCgpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXZhbHVlTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCXZhbHVlVGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCQkJcHVibGljSWRMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXB1YmxpY0lkVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXN5c3RlbUlkTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlzeXN0ZW1JZFRleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJCXZhbHVlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpCi0JCQkJdmFsdWVUZXh0LnNldFRleHQoKChFbnRpdHkpIGlucHV0KS5nZXRWYWx1ZSgpKTsKLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4dGVybmFsRW50aXR5KCkgewotCQlyZXR1cm4gRW50aXR5VHlwZVNlY3Rpb24uaXNFeHRlcm5hbEVudGl0eTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAxNGM2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgTmFtZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIE5BTUUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX05BTUU7Ci0JcHJpdmF0ZSBUZXh0IG5hbWVUZXh0OwotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gbmFtZVRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCAmJiBpbnB1dCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCQlEVEROb2RlIGR0ZE5vZGUgPSAoRFRETm9kZSkgaW5wdXQ7Ci0JCQkJZHRkTm9kZS5zZXROYW1lKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBuYW1lTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTkFNRSk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gbmFtZUxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbmFtZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQluYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQkvLyBsaXN0ZW5lci5zdGFydExpc3RlbmluZ0ZvckVudGVyKG5hbWVUZXh0KTsKLQkJLy8gbGlzdGVuZXIuc3RhcnRMaXN0ZW5pbmdUbyhuYW1lVGV4dCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJbmFtZVRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIERURE5vZGUpCi0JCQkJbmFtZVRleHQuc2V0VGV4dCgoKERURE5vZGUpIGlucHV0KS5nZXROYW1lKCkpOwotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OZXdFbnRpdHlTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmV3RW50aXR5U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDQ5MjIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OZXdFbnRpdHlTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLlJlc291cmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTmV3RW50aXR5U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTkFNRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFTlRJVFlfVFlQRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1RZUEU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRVhURVJOQUxfRU5USVRZID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9FWFRFUk5BTF9FTlRJVFk7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9QQVJBTUVURVJfRU5USVRZOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEdFTkVSQUwgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0dFTkVSQUxfRU5USVRZOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFZBTFVFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfVkFMVUU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFVCTElDX0lEID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9QVUJMSUNfSUQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1lTVEVNX0lEID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9TWVNURU1fSUQ7Ci0KLQlwcml2YXRlIFRleHQgc3lzdGVtSWRUZXh0OwotCXByaXZhdGUgVGV4dCBwdWJsaWNJZFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IG5hbWVUZXh0OwotCXByaXZhdGUgQnV0dG9uIHdpemFyZEJ1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBlbnRpdHlWYWx1ZVRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gY2hlY2tCb3g7Ci0KLQlwcml2YXRlIENDb21ibyB0eXBlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSB0eXBlQ29tYm9WYWx1ZXMgPSB7UEFSQU1FVEVSLCBHRU5FUkFMfTsKLQlwcml2YXRlIFBhZ2VCb29rIHBhZ2VCb29rOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJY3JlYXRlRW50aXR5Q29tbW9uQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0KLQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCXBhZ2VCb29rLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY3JlYXRlRXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUocGFnZUJvb2spOwotCQljcmVhdGVJbnRlcm5hbEVudGl0eUNvbXBvc2l0ZShwYWdlQm9vayk7Ci0KLQkJcGFnZUJvb2suc2hvd1BhZ2UoZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUpOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGVudGl0eUNvbW1vbkNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUVudGl0eUNvbW1vbkNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWVudGl0eUNvbW1vbkNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZW50aXR5Q29tbW9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIG5hbWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoZW50aXR5Q29tbW9uQ29tcG9zaXRlLCBOQU1FKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IG5hbWVMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCW5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoZW50aXR5Q29tbW9uQ29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkICAgIAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQluYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgY0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChlbnRpdHlDb21tb25Db21wb3NpdGUsIEVOVElUWV9UWVBFKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCXAgPSBjTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZUxhYmVsLCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCWNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIENyZWF0ZSBDaGVja2JveAotCQljaGVja0JveCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oZW50aXR5Q29tbW9uQ29tcG9zaXRlLCBFWFRFUk5BTF9FTlRJVFksIFNXVC5DSEVDSyk7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCWNoZWNrQm94LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIENyZWF0ZSBDQ29tYm8KLQkJdHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhlbnRpdHlDb21tb25Db21wb3NpdGUsIFNXVC5GTEFUIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UgLSAyKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChjaGVja0JveCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl0eXBlQ29tYm8uc2V0SXRlbXModHlwZUNvbWJvVmFsdWVzKTsKLQkJdHlwZUNvbWJvLnNldFRleHQoUEFSQU1FVEVSKTsKLQotCQlyZXR1cm4gZW50aXR5Q29tbW9uQ29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGludGVybmFsRW50aXR5Q29tcG9zaXRlOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlSW50ZXJuYWxFbnRpdHlDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChlbnRpdHlDb21tb25Db21wb3NpdGUsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJaW50ZXJuYWxFbnRpdHlDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgZW50aXR5VmFsdWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoaW50ZXJuYWxFbnRpdHlDb21wb3NpdGUsIFZBTFVFKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IGVudGl0eVZhbHVlTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQllbnRpdHlWYWx1ZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZW50aXR5VmFsdWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoaW50ZXJuYWxFbnRpdHlDb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZW50aXR5VmFsdWVMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGVudGl0eVZhbHVlTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQllbnRpdHlWYWx1ZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZW50aXR5VmFsdWVUZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCQllbnRpdHlWYWx1ZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJcmV0dXJuIGludGVybmFsRW50aXR5Q29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGV4dGVybmFsRW50aXR5Q29tcG9zaXRlOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlRXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChlbnRpdHlDb21tb25Db21wb3NpdGUsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgcHVibGljSWRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUsIFBVQkxJQ19JRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBwdWJsaWNJZExhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJcHVibGljSWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXB1YmxpY0lkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGV4dGVybmFsRW50aXR5Q29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpY0lkVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlwdWJsaWNJZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcHVibGljSWRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCS8vIENyZWF0ZSBTeXN0ZW0gSUQgTGFiZWwKLQkJQ0xhYmVsIHN5c3RlbUlkTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGV4dGVybmFsRW50aXR5Q29tcG9zaXRlLCBTWVNURU1fSUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlwID0gc3lzdGVtSWRMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXN5c3RlbUlkTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBDcmVhdGUgV2l6YXJkIEJ1dHRvbgotCQl3aXphcmRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGV4dGVybmFsRW50aXR5Q29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCXdpemFyZEJ1dHRvbi5zZXRJbWFnZShBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAiaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiIpLmNyZWF0ZUltYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzeXN0ZW1JZExhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJd2l6YXJkQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXdpemFyZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBDcmVhdGUgU3lzdGVtIElEIFRleHQKLQkJc3lzdGVtSWRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc3lzdGVtSWRUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc3lzdGVtSWRMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHdpemFyZEJ1dHRvbiwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzeXN0ZW1JZExhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJc3lzdGVtSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5c3RlbUlkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQlyZXR1cm4gZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IG5vZGUgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQlTdHJpbmcgc2VsZWN0ZWQgPSB0eXBlQ29tYm8uZ2V0VGV4dCgpOwotCQkJCWlmIChQQVJBTUVURVIuZXF1YWxzKHNlbGVjdGVkKSkKLQkJCQkJbm9kZS5zZXRQYXJhbWV0ZXJFbnRpdHkodHJ1ZSk7Ci0JCQkJZWxzZQotCQkJCQlub2RlLnNldFBhcmFtZXRlckVudGl0eShmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gY2hlY2tCb3gpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgbm9kZSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSBjaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCQkJbm9kZS5zZXRFeHRlcm5hbEVudGl0eSh0cnVlKTsKLQkJCQkJcGFnZUJvb2suc2hvd1BhZ2UoZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbm9kZS5zZXRFeHRlcm5hbEVudGl0eShmYWxzZSk7Ci0JCQkJCXBhZ2VCb29rLnNob3dQYWdlKGludGVybmFsRW50aXR5Q29tcG9zaXRlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gd2l6YXJkQnV0dG9uKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQlJRmlsZSBjdXJyZW50SUZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpIGdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLQkJCVZpZXdlckZpbHRlciBmaWx0ZXIgPSBuZXcgUmVzb3VyY2VGaWx0ZXIobmV3IFN0cmluZ1tdeyIuZHRkIn0sIG5ldyBJRmlsZVtde2N1cnJlbnRJRmlsZX0sIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJCURURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkIGZpbGVTZWxlY3RXaXphcmQgPSBuZXcgRFREU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQoRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9GSUxFRElBTE9HX1NFTEVDVF9EVEQsIERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfRklMRURJQUxPR19TRUxFQ1RfRFREX0RFU0MsIGZpbHRlciwgKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU2VsZWN0aW9uKTsKLQotCQkJV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIGZpbGVTZWxlY3RXaXphcmQpOwotCQkJd2l6YXJkRGlhbG9nLmNyZWF0ZSgpOwotCQkJd2l6YXJkRGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmVzdWx0ID09IFdpbmRvdy5PSykgewotCQkJCVN0cmluZyB2YWx1ZSA9IHN5c3RlbUlkVGV4dC5nZXRUZXh0KCk7Ci0JCQkJSUZpbGUgc2VsZWN0ZWRJRmlsZSA9IGZpbGVTZWxlY3RXaXphcmQuZ2V0UmVzdWx0RmlsZSgpOwotCQkJCVN0cmluZyBkdGRGaWxlU3RyaW5nID0gdmFsdWU7Ci0JCQkJaWYgKHNlbGVjdGVkSUZpbGUgIT0gbnVsbCkgewotCQkJCQlkdGRGaWxlU3RyaW5nID0gVVJJSGVscGVyLmdldFJlbGF0aXZlVVJJKHNlbGVjdGVkSUZpbGUuZ2V0RnVsbFBhdGgoKSwgY3VycmVudElGaWxlLmdldEZ1bGxQYXRoKCkpOwotCQkJCX0KLQkJCQlzeXN0ZW1JZFRleHQuc2V0VGV4dChkdGRGaWxlU3RyaW5nKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCW5hbWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJbmFtZVRleHQuc2V0VGV4dChlbnRpdHkuZ2V0TmFtZSgpKTsKLQotCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkJCQkJdHlwZUNvbWJvLnNldFRleHQoUEFSQU1FVEVSKTsKLQkJCQllbHNlCi0JCQkJCXR5cGVDb21iby5zZXRUZXh0KEdFTkVSQUwpOwotCi0JCQkJaWYgKGVudGl0eS5pc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQlwYWdlQm9vay5zaG93UGFnZShleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSk7Ci0JCQkJCXB1YmxpY0lkVGV4dC5zZXRUZXh0KGVudGl0eS5nZXRQdWJsaWNJRCgpKTsKLQkJCQkJc3lzdGVtSWRUZXh0LnNldFRleHQoZW50aXR5LmdldFN5c3RlbUlEKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJcGFnZUJvb2suc2hvd1BhZ2UoaW50ZXJuYWxFbnRpdHlDb21wb3NpdGUpOwotCQkJCQllbnRpdHlWYWx1ZVRleHQuc2V0VGV4dChlbnRpdHkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwICYmIGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWVudGl0eS5zZXROYW1lKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gZW50aXR5VmFsdWVUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gZW50aXR5VmFsdWVUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQllbnRpdHkuc2V0VmFsdWUobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBwdWJsaWNJZFRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBwdWJsaWNJZFRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWVudGl0eS5zZXRQdWJsaWNJRChuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHN5c3RlbUlkVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IHN5c3RlbUlkVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldFN5c3RlbUlEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05vdGF0aW9uU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05vdGF0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTk2MGU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Ob3RhdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBOb3RhdGlvblNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBVQkxJQ19JRCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfUFVCTElDX0lEOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFNZU1RFTV9JRCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfU1lTVEVNX0lEOwotCi0JcHJpdmF0ZSBUZXh0IHB1YmxpY0lkVGV4dDsKLQlwcml2YXRlIFRleHQgc3lzdGVtSWRUZXh0OwotCi0JcHJpdmF0ZSBDTGFiZWwgcHVibGljSWRMYWJlbDsKLQlwcml2YXRlIENMYWJlbCBzeXN0ZW1JZExhYmVsOwotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IHB1YmxpY0lkVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IHB1YmxpY0lkVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBOb3RhdGlvbikgewotCQkJCU5vdGF0aW9uIG5vdGF0aW9uID0gKE5vdGF0aW9uKSBpbnB1dDsKLQkJCQlub3RhdGlvbi5zZXRQdWJsaWNJRChuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHN5c3RlbUlkVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IHN5c3RlbUlkVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBOb3RhdGlvbikgewotCQkJCU5vdGF0aW9uIG5vdGF0aW9uID0gKE5vdGF0aW9uKSBpbnB1dDsKLQkJCQlub3RhdGlvbi5zZXRTeXN0ZW1JRChuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlwdWJsaWNJZExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFBVQkxJQ19JRCk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gcHVibGljSWRMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCXB1YmxpY0lkTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBQdWJsaWMgSUQKLQkJcHVibGljSWRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlwdWJsaWNJZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcHVibGljSWRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCXN5c3RlbUlkTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgU1lTVEVNX0lEKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCXAgPSBzeXN0ZW1JZExhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJc3lzdGVtSWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIFN5c3RlbSBJRAotCQlzeXN0ZW1JZFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChzeXN0ZW1JZExhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc3lzdGVtSWRMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXN5c3RlbUlkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzeXN0ZW1JZFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJcHVibGljSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCXN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCU5vdGF0aW9uIG5vdGF0aW9uID0gKE5vdGF0aW9uKSBpbnB1dDsKLQkJCXB1YmxpY0lkVGV4dC5zZXRUZXh0KChub3RhdGlvbikuZ2V0UHVibGljSUQoKSk7Ci0JCQlzeXN0ZW1JZFRleHQuc2V0VGV4dCgobm90YXRpb24pLmdldFN5c3RlbUlEKCkpOwotCQl9Ci0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL09jY3VycmVuY2VGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9PY2N1cnJlbmNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNTdlMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL09jY3VycmVuY2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTVJlcGVhdGFibGVOb2RlOwotCi1wdWJsaWMgY2xhc3MgT2NjdXJyZW5jZUZpbHRlciBpbXBsZW1lbnRzIElGaWx0ZXIgewotCXB1YmxpYyBib29sZWFuIHNlbGVjdChPYmplY3QgdG9UZXN0KSB7Ci0JCWlmICh0b1Rlc3QgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSAmJiAoKENNQmFzaWNOb2RlKSB0b1Rlc3QpLmlzRW1wdHlBbnlPclBDRGF0YSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlIGlmICh0b1Rlc3QgaW5zdGFuY2VvZiBDTVJlcGVhdGFibGVOb2RlKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vT2NjdXJyZW5jZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9PY2N1cnJlbmNlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGY1ZmZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9PY2N1cnJlbmNlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTVJlcGVhdGFibGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgT2NjdXJyZW5jZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9OQ0UgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX09OQ0U7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT05FX09SX01PUkUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX09ORV9PUl9NT1JFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9QVElPTkFMID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9PUFRJT05BTDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBaRVJPX09SX01PUkUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX1pFUk9fT1JfTU9SRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPQ0NVUkVOQ0UgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX09DQ1VSUkVOQ0U7Ci0KLQlwcml2YXRlIENDb21ibyBvY2N1cnJlbmNlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSBvY2N1cnJlbmNlQ29tYm9WYWx1ZXMgPSB7T05DRSwgT05FX09SX01PUkUsIE9QVElPTkFMLCBaRVJPX09SX01PUkV9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIHVzYWdlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgT0NDVVJFTkNFKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSB1c2FnZUxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJdXNhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW9jY3VycmVuY2VDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHVzYWdlTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh1c2FnZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJb2NjdXJyZW5jZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW9jY3VycmVuY2VDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJb2NjdXJyZW5jZUNvbWJvLnNldEl0ZW1zKG9jY3VycmVuY2VDb21ib1ZhbHVlcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01SZXBlYXRhYmxlTm9kZSkgewotCQkJY2hhciBvY2N1cmVuY2UgPSAoKENNUmVwZWF0YWJsZU5vZGUpIGlucHV0KS5nZXRPY2N1cnJlbmNlKCk7Ci0JCQlpZiAoQ01SZXBlYXRhYmxlTm9kZS5PTkNFID09IG9jY3VyZW5jZSkKLQkJCQlvY2N1cnJlbmNlQ29tYm8uc2V0VGV4dChPTkNFKTsKLQkJCWVsc2UgaWYgKENNUmVwZWF0YWJsZU5vZGUuT05FX09SX01PUkUgPT0gb2NjdXJlbmNlKQotCQkJCW9jY3VycmVuY2VDb21iby5zZXRUZXh0KE9ORV9PUl9NT1JFKTsKLQkJCWVsc2UgaWYgKENNUmVwZWF0YWJsZU5vZGUuT1BUSU9OQUwgPT0gb2NjdXJlbmNlKQotCQkJCW9jY3VycmVuY2VDb21iby5zZXRUZXh0KE9QVElPTkFMKTsKLQkJCWVsc2UgaWYgKENNUmVwZWF0YWJsZU5vZGUuWkVST19PUl9NT1JFID09IG9jY3VyZW5jZSkKLQkJCQlvY2N1cnJlbmNlQ29tYm8uc2V0VGV4dChaRVJPX09SX01PUkUpOwotCQkJZWxzZQotCQkJCW9jY3VycmVuY2VDb21iby5zZXRUZXh0KE9OQ0UpOwotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNUmVwZWF0YWJsZU5vZGUpIHsKLQkJCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCQlDTVJlcGVhdGFibGVOb2RlIG5vZGUgPSAoQ01SZXBlYXRhYmxlTm9kZSkgaW5wdXQ7Ci0JCQlTdHJpbmcgb2NjdXJyZW5jZSA9IG9jY3VycmVuY2VDb21iby5nZXRUZXh0KCk7Ci0JCQlpZiAoT05DRS5lcXVhbHMob2NjdXJyZW5jZSkpCi0JCQkJbm9kZS5zZXRPY2N1cnJlbmNlKENNUmVwZWF0YWJsZU5vZGUuT05DRSk7Ci0JCQllbHNlIGlmIChPTkVfT1JfTU9SRS5lcXVhbHMob2NjdXJyZW5jZSkpCi0JCQkJbm9kZS5zZXRPY2N1cnJlbmNlKENNUmVwZWF0YWJsZU5vZGUuT05FX09SX01PUkUpOwotCQkJZWxzZSBpZiAoT1BUSU9OQUwuZXF1YWxzKG9jY3VycmVuY2UpKQotCQkJCW5vZGUuc2V0T2NjdXJyZW5jZShDTVJlcGVhdGFibGVOb2RlLk9QVElPTkFMKTsKLQkJCWVsc2UgaWYgKFpFUk9fT1JfTU9SRS5lcXVhbHMob2NjdXJyZW5jZSkpCi0JCQkJbm9kZS5zZXRPY2N1cnJlbmNlKENNUmVwZWF0YWJsZU5vZGUuWkVST19PUl9NT1JFKTsKLQkJCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vVHlwZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9UeXBlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTg3OTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9UeXBlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFR5cGVTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBUWVBFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9UWVBFOwotCi0JcHJpdmF0ZSBDQ29tYm8gdHlwZUNvbWJvOwotCXByaXZhdGUgU3RyaW5nW10gdHlwZUNvbWJvVmFsdWVzID0ge0F0dHJpYnV0ZS5DREFUQSwgQXR0cmlidXRlLklELCBBdHRyaWJ1dGUuSURSRUYsIEF0dHJpYnV0ZS5JRFJFRlMsIEF0dHJpYnV0ZS5FTlRJVFksIEF0dHJpYnV0ZS5FTlRJVElFUywgQXR0cmlidXRlLk5NVE9LRU4sIEF0dHJpYnV0ZS5OTVRPS0VOUywgQXR0cmlidXRlLkVOVU1FUkFURURfTkFNRSwgQXR0cmlidXRlLkVOVU1FUkFURURfTk9UQVRJT059OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIGNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBUWVBFKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBjTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJdHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJdHlwZUNvbWJvLnNldEl0ZW1zKHR5cGVDb21ib1ZhbHVlcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQXR0cmlidXRlKQotCQkJCXR5cGVDb21iby5zZXRUZXh0KCgoQXR0cmlidXRlKSBpbnB1dCkuZ2V0VHlwZSgpKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHR5cGVDb21ibykgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoQXR0cmlidXRlKSBpbnB1dDsKLQkJCQlhdHRyaWJ1dGUuc2V0VHlwZSh0eXBlQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGE1ZGQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGV4dC5JRFREUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyRm9yRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmb3IgYSBzb3VyY2Ugdmlld2VyIHdoaWNoIHNob3dzIERURCBjb250ZW50LgotICogPHA+Ci0gKiBDbGllbnRzIGNhbiBzdWJjbGFzcyBhbmQgb3ZlcnJpZGUganVzdCB0aG9zZSBtZXRob2RzIHdoaWNoIG11c3QgYmUgc3BlY2lmaWMKLSAqIHRvIHRoZWlyIG5lZWRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gewotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uIGJlY2F1c2Ugbm90IHNvdXJjZXZpZXdlci1zcGVjaWZpYyBhbmQKLQkgKiBpdCdzIGEgU3RyaW5nIGFycmF5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXJbXSBmTGluZVN0eWxlUHJvdmlkZXJzOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFREKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXXtJRFREUGFydGl0aW9ucy5EVERfREVGQVVMVCwgSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OLCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT059OwotCQl9Ci0JCXJldHVybiBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtjcmVhdGVMaW5lU3R5bGVQcm92aWRlckZvckRURCgpfTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyczsKLQl9Ci0KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGNyZWF0ZUxpbmVTdHlsZVByb3ZpZGVyRm9yRFREKCkgewotCQlyZXR1cm4gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9yRFREKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEwZjJjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IERURCBVSQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIERURFVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVMSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0RURF9OT1RBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9EVERfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0RURF9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0RURF9DT01NRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fRFREX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9HUk9VUF9BRERfR1JPVVA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQlVUVE9OX0dST1VQX0lURU1TX0xPR0lDQUxMWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQlVUVE9OX1NPUlRfSVRFTVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfUEFSQU1fRU5USVRZX1JFRjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTU9WRV9BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01PVkVfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTU9WRV9OT0RFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NT1ZFX05PREVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9EVEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfZmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFRERmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURENvbG9yUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURENvbG9yUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURENvbG9yUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURENvbG9yUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURENvbG9yUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURENvbG9yUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURENvbG9yUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURENvbG9yUGFnZV83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURENvbG9yUGFnZV84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFByb3BlcnR5U291cmNlQWRhcHRlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFByb3BlcnR5U291cmNlQWRhcHRlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFByb3BlcnR5U291cmNlQWRhcHRlcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvdXJjZU1lbnVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NSRUFURV9ORVdfRFREX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfRFREX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0RURF9FWFBMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfRklMRV9ERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NUUlVDVFVSRURfVEVYVF9FRElUT1JfUFJFRlNfTElOSzsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEVERVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzZlNmRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFREOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgRFREVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIERURFVJUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBkdGQgdWkuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgZHRkIHVpLgotCSAqLwotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERURFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBEVERVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBkdGQgZWRpdG9yIHRlbXBsYXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGR0ZCBlZGl0b3IgdGVtcGxhdGVzCi0JICovCi0JcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJaWYgKGZUZW1wbGF0ZVN0b3JlID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVN0b3JlID0gbmV3IENvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmUoZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSwgZ2V0UHJlZmVyZW5jZVN0b3JlKCksIERURFVJUHJlZmVyZW5jZU5hbWVzLlRFTVBMQVRFU19LRVkpOwotCi0JCQl0cnkgewotCQkJCWZUZW1wbGF0ZVN0b3JlLmxvYWQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVTdG9yZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBkdGQgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGR0ZCBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJaWYgKGZDb250ZXh0VHlwZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCUNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSgpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURC5ORVcpOwotCi0JCQlmQ29udGV4dFR5cGVSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl9Ci0KLQkJcmV0dXJuIGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YTM0YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURUxJU1Q9QWRkIEF0dHJpYnV0ZSAmTGlzdAotCi0hRFRET3V0bGluZXIKLV9VSV9BQ1RJT05fQUREX0RURF9OT1RBVElPTj1BZGQgJk5vdGF0aW9uCi1fVUlfQUNUSU9OX0FERF9EVERfRU5USVRZPUFkZCAmRW50aXR5Ci1fVUlfQUNUSU9OX0FERF9EVERfRUxFTUVOVD1BZGQgRWxlJm1lbnQKLV9VSV9BQ1RJT05fQUREX0RURF9DT01NRU5UPUFkZCAmQ29tbWVudAotX1VJX0FDVElPTl9EVERfREVMRVRFPSZEZWxldGUKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURT1BZGQgJkF0dHJpYnV0ZQotX1VJX0FDVElPTl9HUk9VUF9BRERfR1JPVVA9QWRkIEdyb3VwIHRvIENvbiZ0ZW50IE1vZGVsCi1fVUlfQUNUSU9OX0FERF9FTEVNRU5UPUFkZCBFbGVtZW50IHRvIEMmb250ZW50IE1vZGVsCi0KLSFEVERDb250ZW50T3V0bGluZVBhZ2UKLV9VSV9CVVRUT05fR1JPVVBfSVRFTVNfTE9HSUNBTExZPUdyb3VwIGl0ZW1zIGxvZ2ljYWxseS4KLV9VSV9CVVRUT05fU09SVF9JVEVNUz1Tb3J0IGl0ZW1zIGFscGhhYmV0aWNhbGx5LgotCi0hRFREQ29udGV4dENvbnRyaWJ1dGVyCi1fVUlfQUNUSU9OX0FERF9QQVJBTV9FTlRJVFlfUkVGPUFkZCAmUGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2UKLQotIURyYWdBdHRyaWJ1dGVDb21tYW5kCi1fVUlfTU9WRV9BVFRSSUJVVEU9TW92ZSBBdHRyaWJ1dGUKLQotIURyYWdDb250ZW50TW9kZWxDb21tYW5kCi1fVUlfTU9WRV9DT05URU5UPU1vdmUgQ29udGVudAotCi0hRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kCi1fVUlfTU9WRV9OT0RFPU1vdmUgTm9kZQotX1VJX01PVkVfTk9ERVM9TW92ZSBOb2RlcwotCi1fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfRFREPVRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uCi0KLSNEVEQgRmlsZSBwYWdlCi1DcmVhdGluZ19maWxlcz1DcmVhdGluZyBmaWxlcwotRFRERmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25MYWJlbD1BZGQgdGhpcyBzdWZmaXggKGlmIG5vdCBzcGVjaWZpZWQpOgotRFRERmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25FcnJvcj1TdWZmaXggbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB7MH0uCi0KLSNEVEQgU3R5bGUgcGFnZQotRFREQ29sb3JQYWdlXzA9PCFFTEVNRU5UIE1haW4gKE9uZSxUd28rKT5cclxuPCFFTEVNRU5UIE9uZSAoVGhyZWUsRm91cik+XHJcbjwhQVRUTElTVCBPbmVcclxuIG9uZW9uZSBDREFUQSAjUkVRVUlSRURcclxuPlxyXG48IS0tIFlvdSBuZWVkIHRoaXMgLS0+XHJcbjwhRUxFTUVOVCBUd28gKG1vcmVtb3JlKik+XHJcbjwhQVRUTElTVCBUd29cclxuIHR3b3R3byBDREFUQSAjUkVRVUlSRURcclxuIHR3b3RocmVlIChhYWEgfCBiYmIpICJhYWEiXHJcbj5cclxuCi1EVERDb2xvclBhZ2VfMT1Db21tZW50cwotRFREQ29sb3JQYWdlXzI9RGF0YQotRFREQ29sb3JQYWdlXzM9RGVmYXVsdAotRFREQ29sb3JQYWdlXzQ9S2V5d29yZHMKLURURENvbG9yUGFnZV81PVN0cmluZ3MKLURURENvbG9yUGFnZV82PVN5bWJvbHMKLURURENvbG9yUGFnZV83PVRhZyBEZWxpbWl0ZXJzCi1EVERDb2xvclBhZ2VfOD1UYWcgTmFtZXMKLURURFByb3BlcnR5U291cmNlQWRhcHRlcl8wPU5hbWUKLURURFByb3BlcnR5U291cmNlQWRhcHRlcl8xPUNvbnRlbnRzCi1EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMj1BdHRyaWJ1dGVzCi0KLSEgTmV3RFREV2l6YXJkLmphdmEKLV9VSV9DUkVBVEVfTkVXX0RURF9GSUxFICAgICAgPSBDcmVhdGUgYSBuZXcgRFREIGZpbGUuCi1fVUlfV0laQVJEX05FV19EVERfVElUTEUgICAgID0gQ3JlYXRlIERURAotX1VJX1dJWkFSRF9ORVdfRFREX0VYUEwgICAgICA9IENyZWF0ZSBhIG5ldyBEVEQgZmlsZS4gU3BlY2lmeSB0aGUgZm9sZGVyIGFuZCBuYW1lIGZvciB0aGUgZmlsZS4KLQotIyBjb3BpZWQgZnJvbSBkdGQgY29yZQotX1VJX0xBQkVMX0RURF9GSUxFX0RFTEVURT1EZWxldGUKLSMjCi1SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMgPSBUaGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8wPVNlbGVjdCBEVEQgVGVtcGxhdGUKLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMT1TZWxlY3QgYSB0ZW1wbGF0ZSBhcyBpbml0aWFsIGNvbnRlbnQgaW4gdGhlIERURCBwYWdlLgotTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8yPU5hbWUKLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMz1EZXNjcmlwdGlvbgotTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV80PSZVc2UgRFREIFRlbXBsYXRlCi1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzU9JlByZXZpZXc6Ci1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzY9VGVtcGxhdGVzIGFyZSAnTmV3IERURCcgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSA8YT5EVEQgVGVtcGxhdGVzPC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzc9JlRlbXBsYXRlczoKLQotU291cmNlTWVudV9sYWJlbD1Tb3VyY2UKLQotU3ludGF4Q29sb3JpbmdQYWdlXzA9U3ludGF4IEVsZW1lbnQ6Ci1TeW50YXhDb2xvcmluZ1BhZ2VfMj1FbmFibGUKLVN5bnRheENvbG9yaW5nUGFnZV8zPSZCb2xkCi1TeW50YXhDb2xvcmluZ1BhZ2VfND0mSXRhbGljCi1TeW50YXhDb2xvcmluZ1BhZ2VfNT0mU3RyaWtldGhyb3VnaAotU3ludGF4Q29sb3JpbmdQYWdlXzY9JlVuZGVybGluZQotCi1fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LPURURCBwcmVmZXJlbmNlcy4gIE5vdGUgdGhhdCBzb21lIHByZWZlcmVuY2VzIG1heSBiZSBzZXQgb24gdGhlIDxhPnswfTwvYT4gcHJlZmVyZW5jZSBwYWdlLgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjRlZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRFRERHJhZ0FuZERyb3BNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RURERyYWdBbmREcm9wTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTUwNTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRFRERHJhZ0FuZERyb3BNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5EcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRHJhZ0FuZERyb3BNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuVG9wTGV2ZWxOb2RlOwotCi1wdWJsaWMgY2xhc3MgRFRERHJhZ0FuZERyb3BNYW5hZ2VyIGltcGxlbWVudHMgRHJhZ0FuZERyb3BNYW5hZ2VyIHsKLQotCXB1YmxpYyBEcmFnQW5kRHJvcENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlKSB7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgdGFyZ2V0OwotCi0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRvcExldmVsTm9kZSkgewotCQkJCXJldHVybiBuZXcgRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLQkJCX0KLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQkJcmV0dXJuIG5ldyBEcmFnQXR0cmlidXRlQ29tbWFuZCh0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSk7Ci0JCQl9Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNTm9kZSkgewotCQkJCXJldHVybiBuZXcgRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQodGFyZ2V0LCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2UpOwotCQkJfQotCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdBdHRyaWJ1dGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdBdHRyaWJ1dGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NTExYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnQXR0cmlidXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLQotCi0KLXB1YmxpYyBjbGFzcyBEcmFnQXR0cmlidXRlQ29tbWFuZCBleHRlbmRzIERlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQgewotCi0JcHVibGljIERyYWdBdHRyaWJ1dGVDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKSB7Ci0JCXN1cGVyKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCURURE5vZGUgcmVmZXJlbmNlTm9kZSA9IChEVEROb2RlKSB0YXJnZXQ7Ci0JCURUREZpbGUgZHRkRmlsZSA9IHJlZmVyZW5jZU5vZGUuZ2V0RFRERmlsZSgpOwotCQlpZiAocmVmZXJlbmNlTm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURFVJTWVzc2FnZXMuX1VJX01PVkVfQVRUUklCVVRFKTsgLy8kTk9OLU5MUy0xJAotCQkJQXR0cmlidXRlTGlzdCBhdHRMaXN0ID0gKEF0dHJpYnV0ZUxpc3QpIHJlZmVyZW5jZU5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCQlhdHRMaXN0Lmluc2VydEludG9Nb2RlbCh0aGlzLCAoQXR0cmlidXRlKSByZWZlcmVuY2VOb2RlLCAoQXR0cmlidXRlKSBub2RlLCBpc0FmdGVyKCkpOwotCQkJCQlkdGRGaWxlLmRlbGV0ZU5vZGUodGhpcywgbm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjZGI4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdDb250ZW50TW9kZWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQgZXh0ZW5kcyBEZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kIHsKLQotCXB1YmxpYyBEcmFnQ29udGVudE1vZGVsQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlcykgewotCQlzdXBlcih0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmICghKHRhcmdldCBpbnN0YW5jZW9mIENNTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoc291cmNlIGluc3RhbmNlb2YgQ01Ob2RlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlEVEROb2RlIHJlZmVyZW5jZU5vZGUgPSAoRFRETm9kZSkgdGFyZ2V0OwotCi0JCWlmIChyZWZlcmVuY2VOb2RlIGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQlEVERGaWxlIGR0ZEZpbGUgPSByZWZlcmVuY2VOb2RlLmdldERUREZpbGUoKTsKLQotCQkJRFRETm9kZSBwYXJlbnQgPSAoRFRETm9kZSkgcmVmZXJlbmNlTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlkdGRGaWxlLmdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREVUlNZXNzYWdlcy5fVUlfTU9WRV9DT05URU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJYm9vbGVhbiBwYXJlbnRJc0VsZW1lbnQgPSBmYWxzZTsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQlDTUdyb3VwTm9kZSBncm91cCA9IG51bGw7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCXBhcmVudElzRWxlbWVudCA9IHRydWU7Ci0JCQkJZWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlncm91cCA9IChDTUdyb3VwTm9kZSkgcGFyZW50OwotCQkJfQotCi0JCQlpZiAoZWxlbWVudCA9PSBudWxsICYmIGdyb3VwID09IG51bGwpIHsKLQkJCQkvLyBubyBwYXJlbnQgdG8gYWRkIHRvCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlJdGVyYXRvciBpdGVyID0gc291cmNlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQkJCWlmIChwYXJlbnRJc0VsZW1lbnQpIHsKLQkJCQkJCWlmIChlbGVtZW50LmdldENvbnRlbnRNb2RlbCgpID09IG5vZGUpIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWVsZW1lbnQucmVwbGFjZUNvbnRlbnRNb2RlbCh0aGlzLCAoQ01Ob2RlKSBub2RlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChyZWZlcmVuY2VOb2RlID09IG5vZGUgfHwgKGlzQWZ0ZXIoKSAmJiByZWZlcmVuY2VOb2RlLmdldE5leHRTaWJsaW5nKCkgPT0gbm9kZSkgfHwgKCFpc0FmdGVyKCkgJiYgbm9kZS5nZXROZXh0U2libGluZygpID09IHJlZmVyZW5jZU5vZGUpKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0KLQkJCQkJCWdyb3VwLmluc2VydEludG9Nb2RlbCh0aGlzLCAoQ01Ob2RlKSByZWZlcmVuY2VOb2RlLCAoQ01Ob2RlKSBub2RlLCBpc0FmdGVyKCkpOwotCi0JCQkJCX0KLQkJCQkJRFRETm9kZSBub2RlUGFyZW50ID0gKERURE5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlub2RlUGFyZW50LmRlbGV0ZSh0aGlzLCBub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkdGRGaWxlLmdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRGZWVkYmFjaygpIHsKLQkJRFRETm9kZSByZWZlcmVuY2VOb2RlID0gKERURE5vZGUpIHRhcmdldDsKLQkJaWYgKHJlZmVyZW5jZU5vZGUgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCUNNTm9kZSBjbU5vZGUgPSAoQ01Ob2RlKSByZWZlcmVuY2VOb2RlOwotCQkJaWYgKGNtTm9kZS5pc1Jvb3RFbGVtZW50Q29udGVudCgpICYmIGNtTm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJcmV0dXJuIERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0RmVlZGJhY2soKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdUb3BMZXZlbE5vZGVzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnVG9wTGV2ZWxOb2Rlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliODcyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdUb3BMZXZlbE5vZGVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlRvcExldmVsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBEcmFnVG9wTGV2ZWxOb2Rlc0NvbW1hbmQgZXh0ZW5kcyBEZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kIHsKLQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBtb3ZlTm9kZSA9IERURFVJTWVzc2FnZXMuX1VJX01PVkVfTk9ERTsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBtb3ZlTm9kZXMgPSBEVERVSU1lc3NhZ2VzLl9VSV9NT1ZFX05PREVTOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKSB7Ci0JCXN1cGVyKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgVG9wTGV2ZWxOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCURURE5vZGUgcmVmZXJlbmNlTm9kZSA9IChEVEROb2RlKSB0YXJnZXQ7Ci0KLQkJRFRERmlsZSBkdGRGaWxlID0gcmVmZXJlbmNlTm9kZS5nZXREVERGaWxlKCk7Ci0JCWR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBzb3VyY2VzLnNpemUoKSA+IDEgPyBtb3ZlTm9kZXMgOiBtb3ZlTm9kZSk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpIHsKLQkJCQlkdGRGaWxlLm1vdmVOb2RlKHRoaXMsIHJlZmVyZW5jZU5vZGUsIG5vZGUsIGlzQWZ0ZXIoKSk7Ci0JCQl9Ci0JCX0KLQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjQ5MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9BY3Rpb25Db250cmlidXRvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIFhNTEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yCi0gKiAKLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGluc2lkZSBtdWx0aSBwYWdlIGVkaXRvcidzCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciwgc2luY2UgY2FzY2FkZWQgaW5pdCgpIGNhbGwgZnJvbSB0aGUKLSAqIEFjdGlvbkJhckNvbnRyaWJ1dG9yIHdpbGwgY2F1c2VzIGV4Y2VwdGlvbiBhbmQgaXQgbGVhZHMgdG8gbG9zZSB3aG9sZQotICogdG9vbGJhcnMuCi0gKiAKLSAqIEluc3RlYWQsIHVzZSBTb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IgZm9yIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yIG9mCi0gKiBtdWx0aSBwYWdlIGVkaXRvci4KLSAqIAotICogTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgc3RpbGwgdmFsaWQgZm9yIHNpbmdsZSBwYWdlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkNvbnRyaWJ1dG9yRFREIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0b3IgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRURJVE9SX0lEUyA9IHsib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnV0aWwuQWN0aW9uQ29udHJpYnV0b3IjZ2V0RXh0ZW5zaW9uSURzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uSURzKCkgewotCQlyZXR1cm4gRURJVE9SX0lEUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gZWRpdCBjb21tYW5kcwotCQlJTWVudU1hbmFnZXIgZWRpdE1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKLQkJaWYgKGVkaXRNZW51ICE9IG51bGwpIHsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uKTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZFeHBhbmRTZWxlY3Rpb25Ub01lbnUpOwotCQkJZWRpdE1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQllZGl0TWVudS5hZGQoZk1lbnVBZGRpdGlvbnNHcm91cE1hcmtlcik7Ci0JCX0KLQotCQkvLyBzb3VyY2UgY29tbWFuZHMKLQkJU3RyaW5nIHNvdXJjZU1lbnVMYWJlbCA9IERURFVJTWVzc2FnZXMuU291cmNlTWVudV9sYWJlbDsKLQkJU3RyaW5nIHNvdXJjZU1lbnVJZCA9ICJzb3VyY2VNZW51SWQiOyAvLyROT04tTkxTLTEkCi0JCUlNZW51TWFuYWdlciBzb3VyY2VNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKHNvdXJjZU1lbnVMYWJlbCwgc291cmNlTWVudUlkKTsKLQkJbWVudS5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCwgc291cmNlTWVudSk7Ci0JCWlmIChzb3VyY2VNZW51ICE9IG51bGwpIHsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRSaWdodCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRMZWZ0KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCX0KLQkJSU1lbnVNYW5hZ2VyIG5hdmlnYXRlTWVudSA9IG1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX05BVklHQVRFKTsKLQkJaWYgKG5hdmlnYXRlTWVudSAhPSBudWxsKSB7Ci0JCQlJTWVudU1hbmFnZXIgZ290b0dyb3VwID0gbmF2aWdhdGVNZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuR09fVE8pOwotCQkJaWYgKGdvdG9Hcm91cCAhPSBudWxsKSB7Ci0JCQkJZ290b0dyb3VwLmFkZChmR290b01hdGNoaW5nQnJhY2tldEFjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0RUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0RUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZDk0OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGltYWdlcyBwcm92aWRlZCBieSB0aGlzIHBsdWctaW4uCi0gKiAKLSAqIE5PVEU6IEZvciBpbnRlcm5hbCB1c2Ugb25seS4gRm9yIGltYWdlcyB1c2VkIGV4dGVybmFsbHksIHBsZWFzZSB1c2UgdGhlCi0gKiBTaGFyZWQqKipJbWFnZUhlbHBlciBjbGFzcyBpbnN0ZWFkLgotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLy8gc2F2ZSBhIGRlc2NyaXB0b3IgZm9yIGVhY2ggaW1hZ2UKLQlwcml2YXRlIEhhc2hNYXAgZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQTFVHSU5JRCA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCS8vIGRvbnQgYWRkIHRoZSBtaXNzaW5nIGltYWdlIGRlc2NyaXB0b3IgaW1hZ2UgdG8gdGhlIGltYWdlCi0JCQkvLyByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKQotCQkJZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGZJbWFnZURlc2NSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBJbWFnZVJlZ2lzdHJ5IC0gaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvRFRERWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMmJlZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogQnVuZGxlIG9mIG1vc3QgaW1hZ2VzIHVzZWQgYnkgdGhlIERURCBTb3VyY2UgRWRpdG9yIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFZGl0b3JQbHVnaW5JbWFnZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9BRERfQVRUUklCVVRFID0gImljb25zL2Z1bGwvY3Rvb2wxNi9BRERfQXR0cmlidXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9BRERfRUxFTUVOVCA9ICJpY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX0FERF9FTEVNRU5UVE9DT05NT0RFTCA9ICJpY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMID0gImljb25zL2Z1bGwvY3Rvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQUREX0FUVFJJQlVURSA9ICJpY29ucy9mdWxsL2R0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0FERF9FTEVNRU5UID0gImljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0FERF9FTEVNRU5UVE9DT05NT0RFTCA9ICJpY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQUREX0dST1VQVE9DT05NT0RFTCA9ICJpY29ucy9mdWxsL2R0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0FERF9BVFRSSUJVVEUgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9BRERfRUxFTUVOVCA9ICJpY29ucy9mdWxsL2V0b29sMTYvQUREX0VsZW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9BRERfRUxFTUVOVFRPQ09OTU9ERUwgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9BRERfQ09NTUVOVCA9ICJpY29ucy9mdWxsL29iajE2L0FERF9Db21tZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FERF9FTlRJVFkgPSAiaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FERF9FTlRJVFlfUkVGRVJFTkNFID0gImljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQUREX05PVEFUSU9OID0gImljb25zL2Z1bGwvb2JqMTYvQUREX05vdGF0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX09SR0FOSVpFX0RURF9MT0dJQ0FMTFkgPSAiaWNvbnMvZnVsbC9vYmoxNi9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NPUlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1ZBTElEQVRFID0gImljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpCQU5fTkVXRFRERklMRSA9ICJpY29ucy9mdWxsL3dpemJhbi9uZXdkdGRmaWxlX3dpei5wbmciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjZTIxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgRFREIFNvdXJjZSBFZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlbHBDb250ZXh0SWRzIHsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgIi4iOyAvLyROT04tTkxTLTEkCi0JLy8gRFREIEZpbGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9QUkVGV0VCWF9GSUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMjAiOyAvLyROT04tTkxTLTEkCi0JLy8gRFREIFN0eWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAyMSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBEVEQgVGVtcGxhdGUgUHJlZmVyZW5jZSBwYWdlIChubyBpZCBmb3IgdGhpcyB5ZXQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMjIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyAvLyBmaWd1cmVkIG91dCBvbiB0aGUgZmx5Ci0JLy8gLy8gRFREIFNvdXJjZSBwYWdlIGVkaXRvcgotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9TT1VSQ0VWSUVXX0hFTFBJRCA9Ci0JLy8gQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURCArICJfc291cmNlX0hlbHBJZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIERURCBOZXcgRmlsZSBXaXphcmQgLSBUZW1wbGF0ZSBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQgPSBQUkVGSVggKyAiZHRkdzAwMTAiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29sb3JQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29sb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMTg1NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURENvbG9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3R5bGVkVGV4dENvbG9yUGlja2VyOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERDb2xvclBhZ2UgZXh0ZW5kcyBBYnN0cmFjdENvbG9yUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCSgoR3JpZERhdGEpIHBhZ2VDb21wb25lbnQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCi0JCXN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhZ2VDb21wb25lbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhZ2VDb21wb25lbnQsIElIZWxwQ29udGV4dElkcy5EVERfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0KLQkJcmV0dXJuIHBhZ2VDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHVwIGFsbCB0aGUgc3R5bGUgcHJlZmVyZW5jZSBrZXlzIGluIHRoZSBvdmVybGF5IHN0b3JlCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlBcnJheUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCQlJdGVyYXRvciBpID0gc3R5bGVMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIChTdHJpbmcpIGkubmV4dCgpKSk7Ci0JCX0KLQotCQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBrZXlzID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtvdmVybGF5S2V5cy5zaXplKCldOwotCQlvdmVybGF5S2V5cy50b0FycmF5KGtleXMpOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8wOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRleHRTdHlsZU1hcChEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCkgewotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTlRFTlRfRU1QVFksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9BTlksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTkFNRSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5EX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJULCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwsIElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNZU1RFTV9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlJFUVVJUkVEX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfMSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzIpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxULCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8zKTsgLy8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNCk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORywgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNik7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRywgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNyk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFN0eWxlTGlzdChBcnJheUxpc3QgbGlzdCkgewotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldHVwUGlja2VyKFN0eWxlZFRleHRDb2xvclBpY2tlciBwaWNrZXIpIHsKLQkJSU1vZGVsTWFuYWdlciBtbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCXBpY2tlci5zZXRQYXJzZXIobW1hbmFnZXIuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKENvbnRlbnRUeXBlSWRGb3JEVEQuQ29udGVudFR5cGVJRF9EVEQpLmdldFBhcnNlcigpKTsKLQotCQlEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCi0JCURpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCi0JCXBpY2tlci5zZXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJcGlja2VyLnNldERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlwaWNrZXIuc2V0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlI3NhdmVQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RUREZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZmYxNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RUREZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VMaW5rQXJlYTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBEVERGaWxlc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBDb21ibyBmRGVmYXVsdFN1ZmZpeCA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuRFREX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCk7Ci0KLQkJbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5XUkFQIHwgU1dULk1VTFRJLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5lZGl0b3IiLCBEVERVSU1lc3NhZ2VzLl9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTkssLy8kTk9OLU5MUy0xJAotCQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBudWxsKS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5zd3REZWZhdWx0cygpLmNyZWF0ZSgpKTsKLQotCi0JCUdyb3VwIGNyZWF0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChjb21wb3NpdGUsIDIpOwotCQljcmVhdGluZ0dyb3VwLnNldFRleHQoRFREVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlcyk7Ci0KLQkJLy8gRGVmYXVsdCBleHRlbnNpb24gZm9yIE5ldyBmaWxlIFdpemFyZAotCQljcmVhdGVMYWJlbChjcmVhdGluZ0dyb3VwLCBEVERVSU1lc3NhZ2VzLkRUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uTGFiZWwpOwotCQlmRGVmYXVsdFN1ZmZpeCA9IGNyZWF0ZURyb3BEb3duQm94KGNyZWF0aW5nR3JvdXApOwotCQlTdHJpbmdbXSB2YWxpZEV4dGVuc2lvbnMgPSAoU3RyaW5nW10pIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCUFycmF5cy5zb3J0KHZhbGlkRXh0ZW5zaW9ucyk7Ci0JCWZEZWZhdWx0U3VmZml4LnNldEl0ZW1zKHZhbGlkRXh0ZW5zaW9ucyk7Ci0JCWZEZWZhdWx0U3VmZml4LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmRGVmYXVsdFN1ZmZpeC5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBtb2RlbAotCX0KLQotCS8qKgotCSAqIEdldCBjb250ZW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IGZpbGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBJQ29udGVudFR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JEVEQuQ29udGVudFR5cGVJRF9EVEQpOwotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlI2dldE1vZGVsUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJU3RyaW5nIHN1ZmZpeCA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoRFREQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0JCWZEZWZhdWx0U3VmZml4LnNldFRleHQoc3VmZml4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhEVERDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJZkRlZmF1bHRTdWZmaXguc2V0VGV4dChzdWZmaXgpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQotCQlkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlTdHJpbmcgc3VmZml4ID0gZkRlZmF1bHRTdWZmaXguZ2V0VGV4dCgpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoRFREQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTiwgc3VmZml4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVZhbHVlcygpIHsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRWYWxpZEV4dGVuc2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkgJiYgIWlzVmFsaWQpIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWlzVmFsaWQgPSBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZShmRGVmYXVsdFN1ZmZpeC5nZXRUZXh0KCkpOwotCQl9Ci0KLQkJaWYgKCFpc1ZhbGlkKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoRFREVUlNZXNzYWdlcy5EVERGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkVycm9yLCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQlzZXRWYWxpZChmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRWYWxpZCh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERTeW50YXhDb2xvcmluZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERTeW50YXhDb2xvcmluZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkOWYxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQ29sb3JTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIEEgcHJlZmVyZW5jZSBwYWdlIHRvIGNvbmZpZ3VyZSBvdXIgWE1MIHN5bnRheCBjb2xvci4gSXQgcmVzZW1ibGVzIHRoZSBKRFQKLSAqIGFuZCBDRFQgcGFnZXMgZmFyIG1vcmUgdGhhbiBvdXIgb3JpZ2luYWwgY29sb3IgcGFnZSB3aGlsZSByZXRhaW5pbmcgdGhlCi0gKiBleHRyYSAiY2xpY2stdG8tZmluZCIgZnVuY3Rpb25hbGl0eS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERURFN5bnRheENvbG9yaW5nUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGZCb2xkOwotCXByaXZhdGUgTGFiZWwgZkZvcmVncm91bmRMYWJlbDsKLQlwcml2YXRlIExhYmVsIGZCYWNrZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBCdXR0b24gZkNsZWFyU3R5bGU7Ci0JcHJpdmF0ZSBNYXAgZkNvbnRleHRUb1N0eWxlTWFwOwotCXByaXZhdGUgQ29sb3IgZkRlZmF1bHRGb3JlZ3JvdW5kID0gbnVsbDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0QmFja2dyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIENvbG9yU2VsZWN0b3IgZkZvcmVncm91bmRDb2xvckVkaXRvcjsKLQlwcml2YXRlIENvbG9yU2VsZWN0b3IgZkJhY2tncm91bmRDb2xvckVkaXRvcjsKLQlwcml2YXRlIEJ1dHRvbiBmSXRhbGljOwotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBmT3ZlcmxheVN0b3JlOwotCXByaXZhdGUgQnV0dG9uIGZTdHJpa2U7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGZTdHlsZVByZWZlcmVuY2VLZXlzOwotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciBmU3R5bGVzVmlld2VyID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwOwotCXByaXZhdGUgU3R5bGVkVGV4dCBmVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBmVW5kZXJsaW5lOwotCi0JLy8gYWN0aXZhdGUgY29udHJvbHMgYmFzZWQgb24gdGhlIGdpdmVuIGxvY2FsIGNvbG9yIHR5cGUKLQlwcml2YXRlIHZvaWQgYWN0aXZhdGUoU3RyaW5nIG5hbWVkU3R5bGUpIHsKLQkJQ29sb3IgZm9yZWdyb3VuZCA9IGZEZWZhdWx0Rm9yZWdyb3VuZDsKLQkJQ29sb3IgYmFja2dyb3VuZCA9IGZEZWZhdWx0QmFja2dyb3VuZDsKLQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkgewotCQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQm9sZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZJdGFsaWMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmU3RyaWtlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlVuZGVybGluZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZlN0cmlrZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKHRydWUpOwotCQkJZkJvbGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZJdGFsaWMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZTdHJpa2Uuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZVbmRlcmxpbmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCb2xkLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7Ci0JCQlmSXRhbGljLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsKLQkJCWZTdHJpa2Uuc2V0U2VsZWN0aW9uKChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSCkgIT0gMCk7Ci0JCQlmVW5kZXJsaW5lLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlVOREVSTElORSkgIT0gMCk7Ci0JCQlpZiAoYXR0cmlidXRlLmdldEZvcmVncm91bmQoKSAhPSBudWxsKSB7Ci0JCQkJZm9yZWdyb3VuZCA9IGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCk7Ci0JCQl9Ci0JCQlpZiAoYXR0cmlidXRlLmdldEJhY2tncm91bmQoKSAhPSBudWxsKSB7Ci0JCQkJYmFja2dyb3VuZCA9IGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQl9Ci0JCX0KLQotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoZm9yZWdyb3VuZC5nZXRSR0IoKSk7Ci0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0Q29sb3JWYWx1ZShiYWNrZ3JvdW5kLmdldFJHQigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb2xvciB0aGUgdGV4dCBpbiB0aGUgc2FtcGxlIGFyZWEgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHByZWZlcmVuY2VzCi0JICovCi0Jdm9pZCBhcHBseVN0eWxlcygpIHsKLQkJaWYgKGZUZXh0ID09IG51bGwgfHwgZlRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gZkRvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCXdoaWxlIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkvLyBsb29rdXAgdGhlIGxvY2FsIGNvbG9yaW5nIHR5cGUgYW5kIGFwcGx5IGl0Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoU3RyaW5nKSBmQ29udGV4dFRvU3R5bGVNYXAuZ2V0KGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpKTsKLQkJCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlUZXh0QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEF0dHJpYnV0ZUZvcihuYW1lZFN0eWxlKTsKLQkJCQlpZiAoYXR0cmlidXRlID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChjdXJyZW50UmVnaW9uKSwgY3VycmVudFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRTdHlsZSgpKTsKLQkJCQlzdHlsZS5zdHJpa2VvdXQgPSAoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDA7Ci0JCQkJc3R5bGUudW5kZXJsaW5lID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDA7Ci0JCQkJZlRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JCQl9Ci0JCQlkb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJfQotCX0KLQotCUJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21wb3NpdGUgY29udHJvbCBhbmQgc2V0cyB0aGUgZGVmYXVsdCBsYXlvdXQgZGF0YS4KLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLQkJZkRlZmF1bHRGb3JlZ3JvdW5kID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsKLQkJZkRlZmF1bHRCYWNrZ3JvdW5kID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQkJQ29tcG9zaXRlIHBhZ2VDb21wb25lbnQgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAyKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuRFREX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCUxpbmsgbGluayA9IG5ldyBMaW5rKHBhZ2VDb21wb25lbnQsIFNXVC5XUkFQKTsKLQkJbGluay5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdfTGluayk7Ci0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihwYXJlbnQuZ2V0U2hlbGwoKSwgZS50ZXh0LCBudWxsLCBudWxsKTsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JpZERhdGEgbGlua0RhdGE9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsaW5rRGF0YS53aWR0aEhpbnQ9IDE1MDsgLy8gb25seSBleHBhbmQgZnVydGhlciBpZiBhbnlvbmUgZWxzZSByZXF1aXJlcyBpdAotCQlsaW5rLnNldExheW91dERhdGEobGlua0RhdGEpOwotCi0JCW5ldyBMYWJlbChwYWdlQ29tcG9uZW50LCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCW5ldyBMYWJlbChwYWdlQ29tcG9uZW50LCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJU2FzaEZvcm0gZWRpdG9yID0gbmV3IFNhc2hGb3JtKHBhZ2VDb21wb25lbnQsIFNXVC5WRVJUSUNBTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhMiA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YTIuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQllZGl0b3Iuc2V0TGF5b3V0RGF0YShncmlkRGF0YTIpOwotCQlTYXNoRm9ybSB0b3AgPSBuZXcgU2FzaEZvcm0oZWRpdG9yLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUNvbXBvc2l0ZSBzdHlsZUVkaXRvciA9IGNyZWF0ZUNvbXBvc2l0ZSh0b3AsIDEpOwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5SaWdodCA9IDU7Ci0JCSgoR3JpZExheW91dCkgc3R5bGVFZGl0b3IuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSAwOwotCQljcmVhdGVMYWJlbChzdHlsZUVkaXRvciwgRFREVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMCk7Ci0JCWZTdHlsZXNWaWV3ZXIgPSBjcmVhdGVTdHlsZXNWaWV3ZXIoc3R5bGVFZGl0b3IpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IE1hdGgubWF4KGdyaWREYXRhLndpZHRoSGludCwgY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpLmxlbmd0aCgpKSk7Ci0JCX0KLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWZTdHlsZXNWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCUNvbXBvc2l0ZSBlZGl0aW5nQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvcCwgMSk7Ci0JCSgoR3JpZExheW91dCkgc3R5bGVFZGl0b3IuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSA1OwotCQljcmVhdGVMYWJlbChlZGl0aW5nQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnV0dG9uIGVuYWJsZXIgPSBjcmVhdGVDaGVja2JveChlZGl0aW5nQ29tcG9zaXRlLCBEVERVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV8yKTsKLQkJZW5hYmxlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZW5hYmxlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCUNvbXBvc2l0ZSBlZGl0Q29udHJvbHMgPSBjcmVhdGVDb21wb3NpdGUoZWRpdGluZ0NvbXBvc2l0ZSwgMik7Ci0JCSgoR3JpZExheW91dCkgZWRpdENvbnRyb2xzLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMjA7Ci0KLQkJZkZvcmVncm91bmRMYWJlbCA9IGNyZWF0ZUxhYmVsKGVkaXRDb250cm9scywgU1NFVUlNZXNzYWdlcy5Gb3JlZ3JvdW5kX1VJXyk7Ci0JCSgoR3JpZERhdGEpIGZGb3JlZ3JvdW5kTGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvciA9IG5ldyBDb2xvclNlbGVjdG9yKGVkaXRDb250cm9scyk7Ci0JCUJ1dHRvbiBmRm9yZWdyb3VuZENvbG9yID0gZkZvcmVncm91bmRDb2xvckVkaXRvci5nZXRCdXR0b24oKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0JCWZGb3JlZ3JvdW5kQ29sb3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCkuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lIChmaW5hbCBBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkgICAgCWUucmVzdWx0ID0gU1NFVUlNZXNzYWdlcy5Gb3JlZ3JvdW5kX0NvbG9yX1NlbGVjdG9yX0J1dHRvbjsKLQkJCX0KLQkJfSk7Ci0KLQotCQlmQmFja2dyb3VuZExhYmVsID0gY3JlYXRlTGFiZWwoZWRpdENvbnRyb2xzLCBTU0VVSU1lc3NhZ2VzLkJhY2tncm91bmRfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkJhY2tncm91bmRMYWJlbC5nZXRMYXlvdXREYXRhKCkpLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yID0gbmV3IENvbG9yU2VsZWN0b3IoZWRpdENvbnRyb2xzKTsKLQkJQnV0dG9uIGZCYWNrZ3JvdW5kQ29sb3IgPSBmQmFja2dyb3VuZENvbG9yRWRpdG9yLmdldEJ1dHRvbigpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJZkJhY2tncm91bmRDb2xvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5nZXRCdXR0b24oKS5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUgKGZpbmFsIEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCSAgICAJZS5yZXN1bHQgPSBTU0VVSU1lc3NhZ2VzLkJhY2tncm91bmRfQ29sb3JfU2VsZWN0b3JfQnV0dG9uOwotCQkJfQotCQl9KTsKLQotCi0JCWZCb2xkID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBEVERVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV8zKTsKLQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZCb2xkLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmSXRhbGljID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBEVERVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV80KTsKLQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZkl0YWxpYy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlN0cmlrZSA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgRFREVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNSk7Ci0JCWZTdHJpa2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZTdHJpa2UuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZVbmRlcmxpbmUgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIERURFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzYpOwotCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmVW5kZXJsaW5lLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQ2xlYXJTdHlsZSA9IG5ldyBCdXR0b24oZWRpdGluZ0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlmQ2xlYXJTdHlsZS5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuUmVzdG9yZV9EZWZhdWx0X1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiUmVzdG9yZSBEZWZhdWx0IgotCQlmQ2xlYXJTdHlsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HKSk7Ci0JCSgoR3JpZERhdGEpZkNsZWFyU3R5bGUuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCWZDbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCUNvbXBvc2l0ZSBzYW1wbGVBcmVhID0gY3JlYXRlQ29tcG9zaXRlKGVkaXRvciwgMSk7Ci0KLQkJKChHcmlkTGF5b3V0KSBzYW1wbGVBcmVhLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gNTsKLQkJKChHcmlkTGF5b3V0KSBzYW1wbGVBcmVhLmdldExheW91dCgpKS5tYXJnaW5Ub3AgPSA1OwotCQljcmVhdGVMYWJlbChzYW1wbGVBcmVhLCBTU0VVSU1lc3NhZ2VzLlNhbXBsZV90ZXh0X19VSV8pOyAvLyROT04tTkxTLTEkID0gIiZTYW1wbGUgdGV4dDoiCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBuZXcgU291cmNlVmlld2VyKHNhbXBsZUFyZWEsIG51bGwsIFNXVC5CT1JERVIgfCBTV1QuTEVGVF9UT19SSUdIVCB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5SRUFEX09OTFkpOwotCQlmVGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhMyA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YTMud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIwKTsKLQkJZ3JpZERhdGEzLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlncmlkRGF0YTMuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhMyk7Ci0JCWZUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJZlRleHQuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250KCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IikpOy8vJE5PTi1OTFMtMSQKLQkJZlRleHQuYWRkS2V5TGlzdGVuZXIoZ2V0VGV4dEtleUxpc3RlbmVyKCkpOwotCQlmVGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRUZXh0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZE1vdXNlTGlzdGVuZXIoZ2V0VGV4dE1vdXNlTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIoZ2V0VHJhdmVyc2VMaXN0ZW5lcigpKTsKLQkJc2V0QWNjZXNzaWJsZShmVGV4dCwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsKLQkJZkRvY3VtZW50ID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURCk7Ci0JCWZEb2N1bWVudC5zZXQoZ2V0RXhhbXBsZVRleHQoKSk7Ci0JCXZpZXdlci5zZXREb2N1bWVudChmRG9jdW1lbnQpOwotCi0JCXRvcC5zZXRXZWlnaHRzKG5ldyBpbnRbXXsxLCAxfSk7Ci0JCWVkaXRvci5zZXRXZWlnaHRzKG5ldyBpbnRbXXsxLCAxfSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkRURF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlmU3R5bGVzVmlld2VyLnNldElucHV0KGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKSk7Ci0KLQkJYXBwbHlTdHlsZXMoKTsKLQotCQlmU3R5bGVzVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFldmVudC5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuYWRkTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhDb2xvclNlbGVjdG9yLlBST1BfQ09MT1JDSEFOR0UpKSB7Ci0JCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMF07Ci0JCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBDb2xvckhlbHBlci50b1JHQlN0cmluZyhmRm9yZWdyb3VuZENvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0KLQkJCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0eWxlUHJlZnNbMF0gPSBuZXdWYWx1ZTsKLQkJCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuYWRkTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhDb2xvclNlbGVjdG9yLlBST1BfQ09MT1JDSEFOR0UpKSB7Ci0JCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMV07Ci0JCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBDb2xvckhlbHBlci50b1JHQlN0cmluZyhmQmFja2dyb3VuZENvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0KLQkJCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0eWxlUHJlZnNbMV0gPSBuZXdWYWx1ZTsKLQkJCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCb2xkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMl07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZCb2xkLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzJdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZJdGFsaWMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1szXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkl0YWxpYy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1szXSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmU3RyaWtlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNF07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZTdHJpa2UuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNF0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZlVuZGVybGluZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzVdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmVW5kZXJsaW5lLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzVdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZkNsZWFyU3R5bGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFRvRGVmYXVsdChuYW1lZFN0eWxlKTsKLQkJCQlhcHBseVN0eWxlcygpOwotCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8vIHByb3RlY3RlZCBMYWJlbCBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYWxsIHRoZSBzdHlsZSBwcmVmZXJlbmNlIGtleXMgaW4gdGhlIG92ZXJsYXkgc3RvcmUKLQkgKi8KLQlwcml2YXRlIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUl0ZXJhdG9yIGkgPSBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZykgaS5uZXh0KCkpKTsKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExpc3Qgdmlld2VyIHdoZXJlIHdlIHNlZSB0aGUgdmFyaW91cyBzeW50YXggZWxlbWVudCBkaXNwbGF5Ci0JICogbmFtZXMtLXdvdWxkIGl0IGV2ZXIgYmUgYSBUcmVlIGxpa2UgSkRUJ3M/Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlU3R5bGVzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RydWN0dXJlZFZpZXdlciBzdHlsZXNWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVzVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSkpOwotCQlzdHlsZXNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCU9iamVjdCBkZXNjcmlwdGlvbiA9IGZTdHlsZVRvRGVzY3JpcHRpb25NYXAuZ2V0KGVsZW1lbnQpOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gZGVzY3JpcHRpb24udG9TdHJpbmcoKTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXN0eWxlc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKS50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHN0eWxlc1ZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQlmT3ZlcmxheVN0b3JlLnN0b3AoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihTdHJpbmcgbmFtZWRTdHlsZSkgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbmV3IFRleHRBdHRyaWJ1dGUoZkRlZmF1bHRGb3JlZ3JvdW5kLCBmRGVmYXVsdEJhY2tncm91bmQsIFNXVC5OT1JNQUwpOwotCi0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwgJiYgZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQkvLyBub3RlOiAibmFtZWRTdHlsZSIgKmlzKiB0aGUgcHJlZmVyZW5jZSBrZXkKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAyKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAzKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDQpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzRdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiA1KSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgZm9udE1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXhhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8wOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWVkU3R5bGVBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCS8vIGVuc3VyZSB0aGUgb2Zmc2V0IGlzIGNsZWFuCi0JCWlmIChvZmZzZXQgPj0gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldChmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJZWxzZSBpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybiBnZXROYW1lZFN0eWxlQXRPZmZzZXQoMCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBmRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJd2hpbGUgKGRvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgIWRvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIHRoZSBJVGV4dFJlZ2lvbidzIENvbnRleHQgYXQgdGhpcyBvZmZzZXQKLQkJCUlUZXh0UmVnaW9uIGludGVyZXN0ID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpbnRlcmVzdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKG9mZnNldCA+IGRvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoaW50ZXJlc3QpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIHJlZ2lvbkNvbnRleHQgPSBpbnRlcmVzdC5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uQ29udGV4dCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJLy8gZmluZCB0aGUgbmFtZWQgc3R5bGUgKGludGVybmFsL3NlbGVjdGFibGUgbmFtZSkgZm9yIHRoYXQKLQkJCS8vIGNvbnRleHQKLQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChyZWdpb25Db250ZXh0KTsKLQkJCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmFtZWRTdHlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZ2V0T3ZlcmxheVN0b3JlKCkgewotCQlyZXR1cm4gZk92ZXJsYXlTdG9yZTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpIHsKLQkJaWYgKGZTdHlsZVByZWZlcmVuY2VLZXlzID09IG51bGwpIHsKLQkJCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUKTsgLy8kTk9OLU5MUy0xJAotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOyAvLyROT04tTkxTLTEkCi0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HKTsgLy8kTk9OLU5MUy0xJAotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOyAvLyROT04tTkxTLTEkCi0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZTdHlsZVByZWZlcmVuY2VLZXlzID0gc3R5bGVzOwotCQl9Ci0JCXJldHVybiBmU3R5bGVQcmVmZXJlbmNlS2V5czsKLQl9Ci0KLQlwcml2YXRlIEtleUxpc3RlbmVyIGdldFRleHRLZXlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBLZXlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaW50IHggPSAoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5nZXRDYXJldE9mZnNldCgpOwotCQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KHgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaW50IHggPSAoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5nZXRDYXJldE9mZnNldCgpOwotCQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KHgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vdXNlTGlzdGVuZXIgZ2V0VGV4dE1vdXNlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW91c2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBnZXRUZXh0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoZS54KTsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCSgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLnNldFNlbGVjdGlvbihlLngpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoZS54KTsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCSgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLnNldFNlbGVjdGlvbihlLngpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYXZlcnNlTGlzdGVuZXIgZ2V0VHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lciNrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaWYgKChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQpIHx8IChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTKSkKLQkJCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJc2V0RGVzY3JpcHRpb24oU1NFVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ19EZXNjcmlwdGlvbik7Ci0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJaW5pdFN0eWxlVG9EZXNjcmlwdGlvbk1hcCgpOwotCQlpbml0UmVnaW9uQ29udGV4dFRvU3R5bGVNYXAoKTsKLQotCQlmT3ZlcmxheVN0b3JlID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUoZ2V0UHJlZmVyZW5jZVN0b3JlKCksIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSk7Ci0JCWZPdmVybGF5U3RvcmUubG9hZCgpOwotCQlmT3ZlcmxheVN0b3JlLnN0YXJ0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRSZWdpb25Db250ZXh0VG9TdHlsZU1hcCgpIHsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT05URU5UX0VNUFRZLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTlRFTlRfQU5ZLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5BTUUsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0sIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUiwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUsIElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNUQVJUX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVORF9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTiwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5QVUJMSUNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OREFUQV9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSURfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5JRFJFRl9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVOVElUWV9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTl9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5NVE9LRU5TX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLklNUExJRURfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5GSVhFRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0U3R5bGVUb0Rlc2NyaXB0aW9uTWFwKCkgewotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzEpOyAvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfMik7IC8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxULCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8zKTsgLy8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzQpOyAvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV81KTsgLy8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNik7IC8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzcpOyAvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfOCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlnZXRPdmVybGF5U3RvcmUoKS5sb2FkRGVmYXVsdHMoKTsKLQkJYXBwbHlTdHlsZXMoKTsKLQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCWFjdGl2YXRlKG51bGwpOwotCQlmVGV4dC5yZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLnByb3BhZ2F0ZSgpOwotCi0JCURURFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0Q29sb3JBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBuYW1lZFN0eWxlID0gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KG9mZnNldCk7Ci0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCWZTdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5hbWVkU3R5bGUpKTsKLQkJCWZTdHlsZXNWaWV3ZXIucmV2ZWFsKG5hbWVkU3R5bGUpOwotCQl9Ci0JCWVsc2UgewotCQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCX0KLQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lmaWNhbGx5IHNldCB0aGUgcmVwb3J0aW5nIG5hbWUgb2YgYSBjb250cm9sIGZvciBhY2Nlc3NpYmlsaXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjY2Vzc2libGUoQ29udHJvbCBjb250cm9sLCBTdHJpbmcgbmFtZSkgewotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmaW5hbCBTdHJpbmcgbiA9IG5hbWU7Ci0JCWNvbnRyb2wuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKQotCQkJCQllLnJlc3VsdCA9IG47Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWZmZDc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgRFREIHRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRFREVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgewotCi0JY2xhc3MgRFRERWRpdFRlbXBsYXRlRGlhbG9nIGV4dGVuZHMgRWRpdFRlbXBsYXRlRGlhbG9nIHsKLQkJcHVibGljIERUREVkaXRUZW1wbGF0ZURpYWxvZyhTaGVsbCBwYXJlbnQsIFRlbXBsYXRlIHRlbXBsYXRlLCBib29sZWFuIGVkaXQsIGJvb2xlYW4gaXNOYW1lTW9kaWZpYWJsZSwgQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSkgewotCQkJc3VwZXIocGFyZW50LCB0ZW1wbGF0ZSwgZWRpdCwgaXNOYW1lTW9kaWZpYWJsZSwgcmVnaXN0cnkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFREKCk7Ci0KLQkJCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBJQ29udGVudEFzc2lzdGFudCBnZXRDb250ZW50QXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJCUNvbnRlbnRBc3Npc3RhbnQgYXNzaXN0YW50ID0gbmV3IENvbnRlbnRBc3Npc3RhbnQoKTsKLQkJCQkJYXNzaXN0YW50LmVuYWJsZUF1dG9BY3RpdmF0aW9uKHRydWUpOwotCQkJCQlhc3Npc3RhbnQuZW5hYmxlQXV0b0luc2VydCh0cnVlKTsKLQkJCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoZ2V0VGVtcGxhdGVQcm9jZXNzb3IoKSwgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKLQkJCQkJcmV0dXJuIGFzc2lzdGFudDsKLQkJCQl9Ci0JCQl9OwotCQkJcmV0dXJuIGRvQ3JlYXRlVmlld2VyKHBhcmVudCwgc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRFREVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSgpIHsKLQkJRFREVUlQbHVnaW4gZHRkVUlQbHVnaW4gPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJc2V0UHJlZmVyZW5jZVN0b3JlKGR0ZFVJUGx1Z2luLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0VGVtcGxhdGVTdG9yZShkdGRVSVBsdWdpbi5nZXRUZW1wbGF0ZVN0b3JlKCkpOwotCQlzZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KGR0ZFVJUGx1Z2luLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gb2s7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlI2lzU2hvd0Zvcm1hdHRlclNldHRpbmcoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU2hvd0Zvcm1hdHRlclNldHRpbmcoKSB7Ci0JCS8vIHRlbXBsYXRlIGZvcm1hdHRpbmcgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhhbmNlc3Rvcik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkRURF9QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlI2NyZWF0ZVZpZXdlcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURCgpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBkb0NyZWF0ZVZpZXdlcihwYXJlbnQsIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCX0KLQotCVNvdXJjZVZpZXdlciBkb0NyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHZpZXdlckNvbmZpZ3VyYXRpb24pIHsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlEID0gQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURDsKLQkJdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQl2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGNvbnRlbnRUeXBlSUQpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUodmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdCBkaWFsb2cuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUKLQkgKiBhIGN1c3RvbSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgYmVpbmcgZWRpdGVkCi0JICogQHBhcmFtIGVkaXQKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgYmUgZWRpdGFibGUKLQkgKiBAcGFyYW0gaXNOYW1lTW9kaWZpYWJsZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgdGVtcGxhdGUgbmFtZSBtYXkgYmUgbW9kaWZpZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIG9yIG1vZGlmaWVkIHRlbXBsYXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIGVkaXRpb24gZmFpbGVkCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBUZW1wbGF0ZSBlZGl0VGVtcGxhdGUoVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlKSB7Ci0JCUVkaXRUZW1wbGF0ZURpYWxvZyBkaWFsb2cgPSBuZXcgRFRERWRpdFRlbXBsYXRlRGlhbG9nKGdldFNoZWxsKCksIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCBnZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KCkpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiBkaWFsb2cuZ2V0VGVtcGxhdGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjZmMmM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0RURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIERURCBVSSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgRFREVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRUaGVtZU1hbmFnZXIoKS5nZXRDdXJyZW50VGhlbWUoKS5nZXRDb2xvclJlZ2lzdHJ5KCk7Ci0JCQotCQkvLyBEVEQgU3R5bGUgUHJlZmVyZW5jZXMKLQkJU3RyaW5nIE5PQkFDS0dST1VOREJPTEQgPSAiIHwgbnVsbCB8IGZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgSlVTVElUQUxJQyA9ICIgfCBudWxsIHwgZmFsc2UgfCB0cnVlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVCwgMCwgMCwgMCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVCwgc3R5bGVWYWx1ZSk7IC8vIGJsYWNrCi0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHLCA2MywgNjMsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHLCBzdHlsZVZhbHVlKTsgLy8gYmx1ZQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FLCA2MywgNjMsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSwgc3R5bGVWYWx1ZSk7IC8vIGJsdWUKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5ULCAxMjcsIDEyNywgMTI3KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5ULCBzdHlsZVZhbHVlKTsgLy8gZ3JleQotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQsIDEyOCwgMCwgMCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCwgc3R5bGVWYWx1ZSk7IC8vIGRhcmsKLQkJLy8gcmVkCi0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLCA2MywgMTU5LCA5NSkgKyBKVVNUSVRBTElDOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLCBzdHlsZVZhbHVlKTsgLy8gZ3JlZW4KLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBLCAxOTEsIDk1LCA5NSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSwgc3R5bGVWYWx1ZSk7IC8vIGxpZ2h0Ci0JCS8vIHJlZAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCwgMTI4LCAwLCAwKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wsIHN0eWxlVmFsdWUpOyAvLyBkYXJrCi0JCS8vIHJlZAotCi0JCS8vIHNldCBkZWZhdWx0IG5ldyB4bWwgZmlsZSB0ZW1wbGF0ZSB0byB1c2UgaW4gbmV3IGZpbGUgd2l6YXJkCi0JCS8qCi0JCSAqIE5lZWQgdG8gZmluZCB0ZW1wbGF0ZSBuYW1lIHRoYXQgZ29lcyB3aXRoIGRlZmF1bHQgdGVtcGxhdGUgaWQgKG5hbWUKLQkJICogbWF5IGNoYW5nZSBmb3IgZGlmZmVybnQgbGFuZ3VhZ2UpCi0JCSAqLwotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpLmZpbmRUZW1wbGF0ZUJ5SWQoIm9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoRFREVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREVUlQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2YyZjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIFByZWZlcmVuY2Uga2V5cyBmb3IgRFREIFVJCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERVSVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBEVERVSVByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBpbnN0YW5jZQotCX0KLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIGN1c3RvbWl6ZWQgdGVtcGxhdGVzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVTX0tFWSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmN1c3RvbV90ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgbGFzdCB0ZW1wbGF0ZSBuYW1lIHVzZWQgaW4gbmV3IERURCBmaWxlIHdpemFyZC4KLQkgKiBUZW1wbGF0ZSBuYW1lIGlzIHN0b3JlZCBpbnN0ZWFkIG9mIHRlbXBsYXRlIGlkIGJlY2F1c2UgdXNlci1jcmVhdGVkCi0JICogdGVtcGxhdGVzIGRvIG5vdCBoYXZlIHRlbXBsYXRlIGlkcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19GSUxFX1RFTVBMQVRFX05BTUUgPSAibmV3RmlsZVRlbXBsYXRlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL0RUREZvbGRpbmdTdHJhdGVneS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb2plY3Rpb24vRFRERm9sZGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzA3MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb2plY3Rpb24vRFRERm9sZGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlVucmVjb2duaXplZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5BYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlhNTENvbW1lbnRGb2xkaW5nUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlhNTEVsZW1lbnRGb2xkaW5nUG9zaXRpb247Ci0KLQotLyoqCi0gKiBBIGZvbGRpbmcgc3RyYXRlZ3kgZm9yIERURCBzdHJ1Y3R1cmVkIGRvY3VtZW50cy4KLSAqIFNlZSBBYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3kgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAotICogVGhpcyBzdHJhdGVneSBpcyByYXRoZXIgbGFtZSBiZWNhdXNlIHRoZSBEVEQgcGFyc2VyIGRvZXMgbm90Ci0gKiBjcmVhdGUgcmVnaW9ucyBmb3Igc3ludGF4IHN1Y2ggYXMgPFsgXT4gc28gZm9sZGluZyBvbiBpdAotICogY2FuIG5vdCBjdXJyZW50bHkgb2NjdXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERGb2xkaW5nU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3kgewotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBmb2xkaW5nIHN0cmF0ZWd5LgotCSAqIEJlIHN1cmUgdG8gc2V0IHRoZSB2aWV3ZXIgYW5kIGRvY3VtZW50IGFmdGVyIGNyZWF0aW9uLgotCSAqLwotCXB1YmxpYyBEVERGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLkFic3RyYWN0Rm9sZGluZ1N0cmF0ZWd5I2NhbGNOZXdGb2xkUG9zaXRpb24ob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb24pCi0JICovCi0JcHJvdGVjdGVkIFBvc2l0aW9uIGNhbGNOZXdGb2xkUG9zaXRpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uKSB7Ci0JCVBvc2l0aW9uIG5ld1BvcyA9IG51bGw7Ci0JCQotCQkvL29ubHkgd2FudCB0byBmb2xkIHJlZ2lvbnMgd2l0aCBhIHZhbGlkIHJhbmdlCi0JCWlmKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSA+PSAwICYmIGluZGV4ZWRSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3RSZWdpb24gPSAoKERURE5vZGUpIGluZGV4ZWRSZWdpb24pLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpOwotCQkJLy9pZiBDb21tZW50IHRoZW4gdXNlIGNvbW1lbnQgZm9sZGluZyBwb3NpdGlvbgotCQkJLy9lbHNlIHVzZSBlbGVtZW50IGZvbGRpbmcgcG9zaXRpb24KLQkJCWlmKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBDb21tZW50KSB7Ci0JCQkJbmV3UG9zID0gbmV3IFhNTENvbW1lbnRGb2xkaW5nUG9zaXRpb24oc3RydWN0UmVnaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV3UG9zID0gbmV3IFhNTEVsZW1lbnRGb2xkaW5nUG9zaXRpb24oc3RydWN0UmVnaW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UG9zOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLkFic3RyYWN0Rm9sZGluZ1N0cmF0ZWd5I2luZGV4ZWRSZWdpb25WYWxpZFR5cGUob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5kZXhlZFJlZ2lvblZhbGlkVHlwZShJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24pIHsKLQkJLy9jYW4gb25seSBmb2xkIERURE5vZGVzCi0JCXJldHVybiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIERURE5vZGUgJiYgIShpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgVW5yZWNvZ25pemVkKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTIyZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIEBhdXRob3Igbml0aW4KLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFREKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2FkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZmFjdG9yeVJlZ2lzdHJ5LCAiUHJvZ3JhbSBFcnJvcjogY2xpZW50IGNhbGxlciBtdXN0IGVuc3VyZSBtb2RlbCBoYXMgZmFjdG9yeSByZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JEVEQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBub3RoaW5nIHRvIGRvLCBzaW5jZSBubyBlbWJlZGRlZCB0eXBlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0RURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0RURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGJkYjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHN0eWxlcyB1c2VkIGJ5IExpbmVTdHlsZVByb3ZpZGVyLAotICogQ29sb3JNYW5hZ2VyLCBhbmQgYW55IG90aGVycyB3aG8gbWF5IGJlIGludGVyZXN0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNEVEQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX0NPTU1FTlQgPSAiZHRkQ29tbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIERhdGEgYXJlIHZhcmlhYmxlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9EQVRBID0gImR0ZERhdGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX0RFRkFVTFQgPSAiZHRkRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGtleXdvcmRzIGFyZSBjb25zdGFudHMgbGlrZSBJTVBMSUVEIG9yIFBDREFUQQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9LRVlXT1JEID0gImR0ZEtleXdvcmQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBzdHJpbmdzIGFyZSBhbnl0aGluZyBpbiBxdW90ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfU1RSSU5HID0gImR0ZFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEFsbCB0aGUgcmVtYWluaW5nIHN5bWJvbHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfU1lNQk9MID0gImR0ZFN5bWJvbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRhZ3MgYXJlICc8JywgJyEnLCBvciAnPicKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfVEFHID0gImR0ZFRhZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRhZ25hbWVzIGFyZSBsaWtlIEVMRU1FTlQsIEFUVExJU1QsIGV0Yy4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfVEFHTkFNRSA9ICJkdGRUYWdOYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzYTk0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9yRFREIGV4dGVuZHMgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvKioKLQkJICogYSBtZXRob2QgdG8gY2VudHJhbGl6ZSBhbGwgdGhlICJmb3JtYXQgcnVsZXMiIGZvciByZWdpb25zCi0JCSAqIHNwZWNpZmljYWxseSBhc3NvY2lhdGVkIGZvciBob3cgdG8gIm9wZW4iIHRoZSByZWdpb24uCi0JCSAqLwotCQkvLyBub3Qgc3VyZSB3aHkgdGhpcyBpcyBjb21pbmcgdGhyb3VnaCBudWxsLCBidXQganVzdCB0byBjYXRjaCBpdAotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUKTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTlRFTlRfRU1QVFkgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT05URU5UX0FOWSB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRyB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRykgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5OREFUQV9WQUxVRSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5EX1RBRyB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuSURSRUZfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVElFU19LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk1UT0tFTl9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRklYRURfS0VZV09SRCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTkFNRSB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKSB7Ci0JCQkvLyBpZiAocmVnaW9uIGluc3RhbmNlb2YgRFREUmVnaW9uKSB7Ci0JCQkvLyBEVERSZWdpb24gZHRkUmVnaW9uID0gKERURFJlZ2lvbikgcmVnaW9uOwotCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGR0ZFJlZ2lvbi5nZXRQYXJlbnQoKTsKLQkJCS8vIFN0cmluZyByZWdpb25UZXh0ID0gZmxhdE5vZGUuZ2V0VGV4dChkdGRSZWdpb24pOwotCQkJLy8gaWYgKHJlZ2lvblRleHQuZXF1YWxzKCJBTlkiKSB8fCByZWdpb25UZXh0LmVxdWFscygiRU1QVFkiKSkgewotCQkJLy8gcmV0dXJuIG5ldyBUZXh0QXR0cmlidXRlKERURENvbG9ycy5EVERfS0VZV09SRCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCX0KLQotCQkvLyBkZWZhdWx0LCByZXR1cm4gbnVsbCB0byBzaWduYWwgIm5vdCBoYW5kbGVkIgotCQkvLyBpbiB3aGljaCBjYXNlLCBvdGhlciBmYWN0b3JpZXMgc2hvdWxkIGJlIHRyaWVkCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRzsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkc7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEE7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRUZXh0QXR0cmlidXRlKHN0eWxlS2V5KTsKLQkJCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRDb2xvcnMoKSB7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckRURFN1YlNldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMjViN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGV4dC5JRFREUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JEVERTdWJTZXQgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmSW50ZXJuYWxNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlckZvckRURCBmSW50ZXJuYWxQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHlsZVJhbmdlW10gZkludGVybmFsUmFuZ2VzOwotCXByaXZhdGUgU3RyaW5nIGZQYXJ0aXRpb25pbmcgPSBudWxsOwotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0KCkgewotCQlzdXBlcigpOwotCQlmSW50ZXJuYWxQcm92aWRlciA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckRURCgpOwotCQlmSW50ZXJuYWxSYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVswXTsKLQkJZlBhcnRpdGlvbmluZyA9IElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkc7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gbGluZVJlcXVlc3RTdGFydAotCSAqIEBwYXJhbSBsaW5lUmVxdWVzdExlbmd0aAotCSAqIEBwYXJhbSBob2xkUmVzdWx0cwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTdHlsZVJhbmdlcyhpbnQgbGluZVJlcXVlc3RTdGFydCwgaW50IGxpbmVSZXF1ZXN0TGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzLCBpbnQgYWRqdXN0bWVudCkgewotCQlpbnQgbGluZVJlcXVlc3RFbmQgPSBsaW5lUmVxdWVzdFN0YXJ0ICsgbGluZVJlcXVlc3RMZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkludGVybmFsUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQgPSBhZGp1c3RtZW50ICsgZkludGVybmFsUmFuZ2VzW2ldLnN0YXJ0OwotCQkJaW50IGFkanVzdGVkU3R5bGVSYW5nZUVuZCA9IGFkanVzdGVkU3R5bGVSYW5nZVN0YXJ0ICsgZkludGVybmFsUmFuZ2VzW2ldLmxlbmd0aDsKLQkJCWlmIChhZGp1c3RlZFN0eWxlUmFuZ2VFbmQgPCBsaW5lUmVxdWVzdFN0YXJ0IHx8IGxpbmVSZXF1ZXN0RW5kIDwgYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQpCi0JCQkJY29udGludWU7Ci0JCQlpbnQgZW5kID0gTWF0aC5taW4oYWRqdXN0ZWRTdHlsZVJhbmdlRW5kLCBsaW5lUmVxdWVzdEVuZCk7Ci0JCQlTdHlsZVJhbmdlIHJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJCXJhbmdlLnN0YXJ0ID0gTWF0aC5tYXgoYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQsIGxpbmVSZXF1ZXN0U3RhcnQpOwotCQkJcmFuZ2UubGVuZ3RoID0gZW5kIC0gcmFuZ2Uuc3RhcnQ7Ci0JCQlyYW5nZS5mb250U3R5bGUgPSBmSW50ZXJuYWxSYW5nZXNbaV0uZm9udFN0eWxlOwotCQkJcmFuZ2UuZm9yZWdyb3VuZCA9IGZJbnRlcm5hbFJhbmdlc1tpXS5mb3JlZ3JvdW5kOwotCQkJcmFuZ2UuYmFja2dyb3VuZCA9IGZJbnRlcm5hbFJhbmdlc1tpXS5iYWNrZ3JvdW5kOwotCQkJaG9sZFJlc3VsdHMuYWRkKHJhbmdlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCi0JCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0Q29sb3JQcmVmZXJlbmNlcygpLmdldFN0cmluZyhJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQpOwotCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCVJHQiBiYWNrZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1sxXSk7Ci0JCQlib29sZWFuIGJvbGQgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgYmFja2dyb3VuZCwgYm9sZCk7Ci0JCX0KLQkJcmV0dXJuIHRhOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRJbnRlcm5hbERvY3VtZW50KCkgewotCQlpZiAoZkludGVybmFsTW9kZWwgPT0gbnVsbCkgewotCQkJZkludGVybmFsTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQkJfQotCQlyZXR1cm4gZkludGVybmFsTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWQuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciNwcmVwYXJlUmVnaW9ucyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbiwKLQkgKiAgICAgIGludCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcmVwYXJlUmVnaW9ucyhJVHlwZWRSZWdpb24gdHlwZWRSZWdpb24sIGludCBsaW5lUmVxdWVzdFN0YXJ0LCBpbnQgbGluZVJlcXVlc3RMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJaWYgKCFJRFREUGFydGl0aW9ucy5EVERfREVGQVVMVC5lcXVhbHModHlwZWRSZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJLy8gY29tcHV0ZSBhbiBpbnRlcm5hbCBEVEQgbW9kZWwgYW5kIHJldHVybiBsaW5lc3R5bGVzIGZvciBpdAotCQkJSVRleHRSZWdpb24gZHRkQ29udGVudFJlZ2lvbiA9IG51bGw7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3R5cGUgPSBmRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQodHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkKLQkJCQlkdGRDb250ZW50UmVnaW9uID0gZG9jdHlwZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCh0eXBlZFJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQlTdHJpbmcgY29udGVudHMgPSBkdGRDb250ZW50UmVnaW9uICE9IG51bGwgPyBkb2N0eXBlLmdldEZ1bGxUZXh0KGR0ZENvbnRlbnRSZWdpb24pIDogbnVsbDsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRJbnRlcm5hbERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCXVwZGF0ZVN0eWxlUmFuZ2VzKGRvY3VtZW50LCBjb250ZW50cyk7Ci0KLQkJCWFkZFN0eWxlUmFuZ2VzKGxpbmVSZXF1ZXN0U3RhcnQsIGxpbmVSZXF1ZXN0TGVuZ3RoLCBob2xkUmVzdWx0cywgZG9jdHlwZS5nZXRTdGFydE9mZnNldChkdGRDb250ZW50UmVnaW9uKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQlpZiAoZkludGVybmFsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJZkludGVybmFsUHJvdmlkZXIucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0eWxlUmFuZ2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBjb250ZW50cykgewotCQlpZiAoIWRvY3VtZW50LmdldCgpLmVxdWFscyhjb250ZW50cykpIHsKLQkJCWRvY3VtZW50LnNldChjb250ZW50cyk7Ci0JCQl0cnkgewotCQkJCUlUeXBlZFJlZ2lvbiByZWdpb25zW10gPSBUZXh0VXRpbGl0aWVzLmNvbXB1dGVQYXJ0aXRpb25pbmcoZ2V0SW50ZXJuYWxEb2N1bWVudCgpLCBmUGFydGl0aW9uaW5nLCAwLCBkb2N1bWVudC5nZXRMZW5ndGgoKSwgZmFsc2UpOwotCQkJCUxpc3QgcmFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZJbnRlcm5hbFByb3ZpZGVyLmluaXQoZ2V0SW50ZXJuYWxEb2N1bWVudCgpLCBmUmVjSGlnaGxpZ2h0ZXIpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlmSW50ZXJuYWxQcm92aWRlci5wcmVwYXJlUmVnaW9ucyhyZWdpb25zW2ldLCByZWdpb25zW2ldLmdldE9mZnNldCgpLCByZWdpb25zW2ldLmdldExlbmd0aCgpLCByYW5nZXMpOwotCQkJCX0KLQkJCQlmSW50ZXJuYWxSYW5nZXMgPSAoU3R5bGVSYW5nZVtdKSByYW5nZXMudG9BcnJheShuZXcgU3R5bGVSYW5nZVswXSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWZJbnRlcm5hbFJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzBdOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlmSW50ZXJuYWxQcm92aWRlci5sb2FkQ29sb3JzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzZDU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyLCBTVEFSIC0gYWRkZWQgRW5jb2RpbmcgQ29udGVudCBSZXNvbHZlciwgYnVnIDE2MjMyMQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTDsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBEVEQgdGVtcGxhdGUgY29udGV4dCB0eXBlcy4gVGVtcGxhdGVzIG9mIHRoaXMgY29udGV4dCB0eXBlCi0gKiBhcHBseSB0byBhbnkgcGxhY2Ugd2l0aGluIERURCBjb250ZW50IHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlRFREIGV4dGVuZHMgVGVtcGxhdGVDb250ZXh0VHlwZSB7Ci0KLQlwdWJsaWMgVGVtcGxhdGVDb250ZXh0VHlwZURURCgpIHsKLQkJc3VwZXIoKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkN1cnNvcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRhdGUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Eb2xsYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5MaW5lU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVGltZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlVzZXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Xb3JkU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuWWVhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWE1MKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTRlZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi0KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFREIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSAiZHRkX25ldyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZXh0L0RURERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZXh0L0RURERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmOWE2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGV4dC9EVEREb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLQotCi1wdWJsaWMgY2xhc3MgRFRERG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciBleHRlbmRzIERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkQ29udGV4dHMKLQkgKiBAcGFyYW0gbmV4dE1hdGNoZXIKLQkgKi8KLQlwdWJsaWMgRFRERG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcigpIHsKLQkJc3VwZXIobmV3IFN0cmluZ1tde0RURFJlZ2lvblR5cGVzLlNUQVJUX1RBRywgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVH0sIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQXR0cmlidXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTRiYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQXR0cmlidXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQWRkQXR0cmlidXRlQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgQWRkQXR0cmlidXRlQWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gIk5ld0F0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlbGVjdGVkTm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCSgoQXR0cmlidXRlTGlzdCkgc2VsZWN0ZWROb2RlKS5hZGRBdHRyaWJ1dGUobmV3TmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWROb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJKChFbGVtZW50KSBzZWxlY3RlZE5vZGUpLmFkZEF0dHJpYnV0ZShuZXdOYW1lKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiByYyA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlEVEROb2RlIG5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZChzZWxlY3Rpb24pOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYXR0cmlidXRlIHNldCB0byB0cnVlIik7Ci0JCQlzZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlIik7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiByYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjYzVhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRBdHRyaWJ1dGVMaXN0QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGdldE1vZGVsKCkuZ2V0RFRERmlsZSgpOwotCQlTdHJpbmcgYXR0TGlzdE5hbWUgPSAiTmV3QXR0TGlzdCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlbGVjdGVkTm9kZSAhPSBudWxsKSB7Ci0JCQlEVEROb2RlIHRvcExldmVsTm9kZSA9IGR0ZEZpbGUuZ2V0VG9wTGV2ZWxOb2RlQXQoc2VsZWN0ZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaWYgKHRvcExldmVsTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlhdHRMaXN0TmFtZSA9ICgoRWxlbWVudCkgdG9wTGV2ZWxOb2RlKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVBdHRyaWJ1dGVMaXN0KHNlbGVjdGVkTm9kZSwgYXR0TGlzdE5hbWUsIHRydWUpOwotCQkvLyBuZXdFbGVtZW50LnNldE5hbWUoRFREVW5pcXVlTmFtZUhlbHBlci5nZXRVbmlxdWVFbGVtZW50TmFtZShkdGRGaWxlKSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRDb21tZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRDb21tZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDk2MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQ29tbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZENvbW1lbnRBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRDb21tZW50QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCWdldE1vZGVsKCkuZ2V0RFRERmlsZSgpLmNyZWF0ZUNvbW1lbnQoc2VsZWN0ZWROb2RlLCAiTmV3Q29tbWVudCIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjAwYTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRURFVuaXF1ZU5hbWVIZWxwZXI7Ci0KLQotcHVibGljIGNsYXNzIEFkZEVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRFbGVtZW50QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGdldE1vZGVsKCkuZ2V0RFRERmlsZSgpOwotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBEVERVbmlxdWVOYW1lSGVscGVyLmdldFVuaXF1ZUVsZW1lbnROYW1lKGR0ZEZpbGUpOwotCQlkdGRGaWxlLmNyZWF0ZUVsZW1lbnQoc2VsZWN0ZWROb2RlLCBlbGVtZW50TmFtZSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzk4Y2Y5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJKChDTUdyb3VwTm9kZSkgbm9kZSkuYWRkQ2hpbGQoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJKChFbGVtZW50KSBub2RlKS5hZGRDaGlsZCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlib29sZWFuIHJjID0gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKHNlbGVjdGlvbik7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRW50aXR5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbnRpdHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxNjY5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbnRpdHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRFbnRpdHlBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRFbnRpdHlBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVFbnRpdHkoc2VsZWN0ZWROb2RlLCAiTmV3RW50aXR5IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gbmV3RWxlbWVudC5zZXROYW1lKERURFVuaXF1ZU5hbWVIZWxwZXIuZ2V0VW5pcXVlRWxlbWVudE5hbWUoZHRkRmlsZSkpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjZlMWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIG5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCSgoQ01Hcm91cE5vZGUpIG5vZGUpLmFkZEdyb3VwKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCSgoRWxlbWVudCkgbm9kZSkuYWRkR3JvdXAoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZE5vdGF0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGROb3RhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTFmODJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZE5vdGF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZE5vdGF0aW9uQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgQWRkTm90YXRpb25BY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVOb3RhdGlvbihzZWxlY3RlZE5vZGUsICJOZXdOb3RhdGlvbiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbmV3Tm90YXRpb24uc2V0TmFtZShEVERVbmlxdWVOYW1lSGVscGVyLmdldFVuaXF1ZU5vdGF0aW9uTmFtZShkdGRGaWxlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlYmNlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5MYWJlbFZhbHVlUGFpcjsKLQotCi1wdWJsaWMgY2xhc3MgQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0JcHVibGljIEFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbihEVERNb2RlbEltcGwgbW9kZWwsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihtb2RlbCwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3RFeHRlcm5hbFBhcmFtZXRlckVudGl0eShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGFiZWxWYWx1ZVBhaXJbXSBmcmVlRXh0ZXJuYWxFbnRpdGllcyA9IGR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5jcmVhdGVQYXJtRW50aXR5Q29udGVudEl0ZW1zKG51bGwpOwotCi0JCWlmIChmcmVlRXh0ZXJuYWxFbnRpdGllcy5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZnJlZUV4dGVybmFsRW50aXRpZXNbMF0uZlZhbHVlOwotCQkJLy8gcmV0dXJuIChFbnRpdHkpIGZyZWVFeHRlcm5hbEVudGl0aWVzWzBdLmZWYWx1ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGdldE1vZGVsKCkuZ2V0RFRERmlsZSgpOwotCQlTdHJpbmcgZXh0RW50aXR5ID0gZ2V0Rmlyc3RFeHRlcm5hbFBhcmFtZXRlckVudGl0eShkdGRGaWxlKTsKLQkJRFRETm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpOwotCQlpZiAoZXh0RW50aXR5ICE9IG51bGwpIHsKLQkJCWR0ZEZpbGUuY3JlYXRlUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHNlbGVjdGVkTm9kZSwgZXh0RW50aXR5LCB0cnVlKTsKLQkJfQotCQllbHNlIHsKLQkJCWR0ZEZpbGUuY3JlYXRlUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHNlbGVjdGVkTm9kZSwgIiVOZXdFbnRpdHlSZWZlcmVuY2U7IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExZTljMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9CYXNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIEJhc2VBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRleHRDb250cmlidXRvcjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsOwotCi0JcHVibGljIEJhc2VBY3Rpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcyhtb2RlbCwgdGV4dCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEJhc2VBY3Rpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIHRleHQsIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2MpIHsKLQkJc3VwZXIodGV4dCk7Ci0JCWZNb2RlbCA9IG1vZGVsOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRFRETm9kZSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIGdldEZpcnN0Tm9kZVNlbGVjdGVkKGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIERURE5vZGUgZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJLy8gRFRETm9kZSByZWZlcmVuY2VQb2ludCA9IG51bGw7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCXJldHVybiAoRFRETm9kZSkgZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRFRETW9kZWxJbXBsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKERURE1vZGVsSW1wbCkgZk1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRleHRDb250cmlidXRvcihJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IpIHsKLQkJY29udGV4dENvbnRyaWJ1dG9yID0gY29udHJpYnV0b3I7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9EZWxldGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzljMWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVERCYXRjaE5vZGVEZWxldGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBEZWxldGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQlwdWJsaWMgRGVsZXRlQWN0aW9uKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0KLQkJSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQlEVERCYXRjaE5vZGVEZWxldGUgYmF0Y2hEZWxldGUgPSBudWxsOwotCQlEVERGaWxlIGR0ZEZpbGUgPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgZWxlbWVudDsKLQkJCQlkdGRGaWxlID0gbm9kZS5nZXREVERGaWxlKCk7Ci0JCQkJaWYgKGJhdGNoRGVsZXRlID09IG51bGwpIHsKLQkJCQkJYmF0Y2hEZWxldGUgPSBuZXcgRFREQmF0Y2hOb2RlRGVsZXRlKGR0ZEZpbGUpOwotCQkJCX0KLQkJCQliYXRjaERlbGV0ZS5hZGROb2RlKChEVEROb2RlKSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlkdGRGaWxlLmdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREVUlNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQliYXRjaERlbGV0ZS5kZWxldGVOb2Rlcyh0aGlzKTsKLQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsKSB7Ci0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBEVEROb2RlICYmICEoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBDTU5vZGUgJiYgKChDTU5vZGUpIHNlbGVjdGVkT2JqZWN0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpKSkgewotCQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXJldHVybiB0cnVlOyAvLyBlbmFibGUgZGVsZXRlIG1lbnUgaXRlbQotCQl9Ci0JCWVsc2UgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm4gZmFsc2U7IC8vIGRpc2FibGUgaXQgLSBncmV5IG91dAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvUmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9SZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUyMzk2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9SZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLXB1YmxpYyBjbGFzcyBSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJQ01Ob2RlIGNvbnRlbnRNb2RlbCA9ICgoRWxlbWVudCkgbm9kZSkuZ2V0Q29udGVudE1vZGVsKCk7Ci0JCQlpZiAoQ01Ob2RlLkVNUFRZLmVxdWFscyhjb250ZW50TW9kZWwuZ2V0VHlwZSgpKSkgewotCQkJCWdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZ2V0VGV4dCgpKTsKLQkJCQkoKEVsZW1lbnQpIG5vZGUpLnJlcGxhY2VDb250ZW50TW9kZWwodGhpcywgIigpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiByYyA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlEVEROb2RlIG5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZChzZWxlY3Rpb24pOwotCQlzZXRFbmFibGVkKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KTsKLQkJcmV0dXJuIHJjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTAyODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXMuQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yOwotCi0KLS8qKgotICogQW4gSVByb3BlcnR5U291cmNlIGltcGxlbWVudGF0aW9uIGZvciBhIEpGYWNlIHZpZXdlciB1c2VkIHRvIGRpc3BsYXkKLSAqIHByb3BlcnRpZXMgb2YgRE9NIG5vZGVzLiBSZXF1aXJlcyBhbiBhZGFwdGVyIGZhY3RvcnkgdG8gY3JlYXRlIEpGYWNlCi0gKiBhZGFwdGVycyBmb3IgdGhlIG5vZGVzIGluIHRoZSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyLCBJUHJvcGVydHlTb3VyY2UgewotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0FUVFJJQlVURVMgPSAiQXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9OQU1FID0gRFREVUlNZXNzYWdlcy5EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMDsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9URVhUID0gRFREVUlNZXNzYWdlcy5EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBmRGVzY3JpcHRvcnMgPSBudWxsOwotCXByb3RlY3RlZCBJTm9kZU5vdGlmaWVyIGZOb2RlID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdGFjayBmVmFsdWVzQmVpbmdTZXQgPSBuZXcgU3RhY2soKTsKLQotCXB1YmxpYyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJZk5vZGUgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVByb3BlcnR5RGVzY3JpcHRvcltdIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCUN1c3RvbVByb3BlcnR5RGVzY3JpcHRvciBuYW1lRGVzY3JpcHRvciA9IG5ldyBDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IoSURfTkFNRSwgSURfTkFNRSwgbnVsbCk7Ci0JCW5hbWVEZXNjcmlwdG9yLnNldENhdGVnb3J5KERURFVJTWVzc2FnZXMuRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzIpOyAvLyROT04tTkxTLTEkCi0JCS8vIEN1c3RvbVByb3BlcnR5RGVzY3JpcHRvciBjb250ZW50RGVzY3JpcHRvciA9IG5ldwotCQkvLyBDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IoSURfVEVYVCwgSURfVEVYVCwgbnVsbCk7Ci0JCS8vIGNvbnRlbnREZXNjcmlwdG9yLnNldENhdGVnb3J5KCJBdHRyaWJ1dGVzIik7Ci0JCXJldHVybiBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltde25hbWVEZXNjcmlwdG9yfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsdWUgZm9yIHRoaXMgTm9kZSB0aGF0IGNhbiBiZSBlZGl0dGVkIGluIGEgcHJvcGVydHkgc2hlZXQuCi0JICogCi0JICogQHJldHVybiBhIHZhbHVlIHRoYXQgY2FuIGJlIGVkaXR0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB2YWxpZCBkZXNjcmlwdG9ycy4KLQkgKi8KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChmRGVzY3JpcHRvcnMgPT0gbnVsbCB8fCBmRGVzY3JpcHRvcnMubGVuZ3RoID09IDApIHsKLQkJCWZEZXNjcmlwdG9ycyA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQllbHNlIHsKLQkJCXVwZGF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQlyZXR1cm4gZkRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJaWYgKGlkLmVxdWFscyhJRF9OQU1FKSAmJiBmTm9kZSBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCXZhbHVlID0gKChEVEROb2RlKSBmTm9kZSkuZ2V0TmFtZSgpOwotCQl9Ci0JCWlmIChpZC5lcXVhbHMoSURfVEVYVCkgJiYgZk5vZGUgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQl2YWx1ZSA9ICgoRFRETm9kZSkgZk5vZGUpLmdldEZ1bGxOb2RlVGV4dCgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gSVByb3BlcnR5U291cmNlLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3Jlc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2MDZiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0KLXB1YmxpYyBjbGFzcyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoSVByb3BlcnR5U291cmNlLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeShnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQkvLyBhdCB0aGUgbW9tZW50LCBvbmx5IG9uZSBpbXBsZW1lbnRhdGlvbiBleGlzdHMKLQkJcmV0dXJuIG5ldyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXIodGFyZ2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC93aXphcmQvTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjY5MDZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC93aXphcmQvTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogVGVtcGxhdGVzIHBhZ2UgaW4gbmV3IGZpbGUgd2l6YXJkLiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IGEgbmV3IGZpbGUKLSAqIHRlbXBsYXRlIHRvIGJlIGFwcGxpZWQgaW4gbmV3IGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcwotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCS8qKiBUaGUgdGVtcGxhdGUgc3RvcmUuICovCi0JCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmU3RvcmU7Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWZTdG9yZSA9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKLQkJCXJldHVybiBmU3RvcmUuZ2V0VGVtcGxhdGVzKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuTkVXKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJZlN0b3JlID0gKFRlbXBsYXRlU3RvcmUpIG5ld0lucHV0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGFiZWwgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSAoVGVtcGxhdGUpIGVsZW1lbnQ7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJCWNhc2UgMSA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBMYXN0IHNlbGVjdGVkIHRlbXBsYXRlIG5hbWUgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lOwotCS8qKiBUaGUgdmlld2VyIGRpc3BsYXlzIHRoZSBwYXR0ZXJuIG9mIHNlbGVjdGVkIHRlbXBsYXRlLiAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGZQYXR0ZXJuVmlld2VyOwotCS8qKiBUaGUgdGFibGUgcHJlc2VudGluZyB0aGUgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgVGFibGVWaWV3ZXIgZlRhYmxlVmlld2VyOwotCS8qKiBUZW1wbGF0ZSBzdG9yZSB1c2VkIGJ5IHRoaXMgd2l6YXJkIHBhZ2UgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0JLyoqIENoZWNrYm94IGZvciB1c2luZyB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBCdXR0b24gZlVzZVRlbXBsYXRlQnV0dG9uOwotCi0JcHVibGljIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlIiwgRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKERURFVJTWVzc2FnZXMuTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8xKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3JyZWN0bHkgcmVzaXplcyB0aGUgdGFibGUgc28gbm8gcGhhbnRvbSBjb2x1bW5zIGFwcGVhcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBidXR0b25zCi0JICogICAgICAgICAgICB0aGUgYnV0dG9ucwotCSAqIEBwYXJhbSB0YWJsZQotCSAqICAgICAgICAgICAgdGhlIHRhYmxlCi0JICogQHBhcmFtIGNvbHVtbjEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMwotCSAqICAgICAgICAgICAgdGhlIHRoaXJkIGNvbHVtbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVUYWJsZVJlc2l6aW5nKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlIHRhYmxlLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yKSB7Ci0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotCQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbgotCQkJCQkvLyB3aWR0aAotCQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQkJfQotCi0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpZiAob2xkU2l6ZS54ID4gd2lkdGgpIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUKLQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZSBjaGVja2JveCBmb3IgdXNlciB0byB1c2UgRFREIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dChEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIFRlbXBsYXRlcyB0YWJsZQotCQlDb21wb3NpdGUgaW5uZXJQYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGlubmVyTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaW5uZXJMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0KGlubmVyTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKTsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoaW5uZXJQYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIHRoYXQgZGlzcGxheXMgdGVtcGxhdGVzCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGlubmVyUGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDEwKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjEuc2V0VGV4dChEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMik7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzMpOwotCi0JCWZUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlbXBsYXRlQ29udGVudFByb3ZpZGVyKCkpOwotCi0JCWZUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIpIHsKLQkJCQlpZiAoKG9iamVjdDEgaW5zdGFuY2VvZiBUZW1wbGF0ZSkgJiYgKG9iamVjdDIgaW5zdGFuY2VvZiBUZW1wbGF0ZSkpIHsKLQkJCQkJVGVtcGxhdGUgbGVmdCA9IChUZW1wbGF0ZSkgb2JqZWN0MTsKLQkJCQkJVGVtcGxhdGUgcmlnaHQgPSAoVGVtcGxhdGUpIG9iamVjdDI7Ci0JCQkJCWludCByZXN1bHQgPSBsZWZ0LmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldE5hbWUoKSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCXJldHVybiBsZWZ0LmdldERlc2NyaXB0aW9uKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvYmplY3QxLCBvYmplY3QyKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCi0JCWZUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJdXBkYXRlVmlld2VySW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlciB0aGF0IGRpc3BsYXlzIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZSdzIGNvbnRlbnRzCi0JCWZQYXR0ZXJuVmlld2VyID0gZG9DcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlmVGVtcGxhdGVTdG9yZSA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJLy8gQ3JlYXRlIGxpbmtlZCB0ZXh0IHRvIGp1c3QgdG8gdGVtcGxhdGVzIHByZWZlcmVuY2UgcGFnZQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGluay5zZXRUZXh0KERURFVJTWVzc2FnZXMuTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV82KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbGlua0NsaWNrZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY29uZmlndXJlVGFibGVSZXNpemluZyhpbm5lclBhcmVudCwgdGFibGUsIGNvbHVtbjEsIGNvbHVtbjIpOwotCQlsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLkRURF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlzZXRDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcywgY29uZmlndXJlcyBhbmQgcmV0dXJucyBhIHNvdXJjZSB2aWV3ZXIgdG8gcHJlc2VudCB0aGUgdGVtcGxhdGUKLQkgKiBwYXR0ZXJuIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuIENsaWVudHMgbWF5IG92ZXJyaWRlIHRvIHByb3ZpZGUgYQotCSAqIGN1c3RvbSBzb3VyY2Ugdmlld2VyIGZlYXR1cmluZyBlLmcuIHN5bnRheCBjb2xvcmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJlZCBzb3VyY2Ugdmlld2VyCi0JICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQl2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENvbnRlbnRUeXBlSWRGb3JEVEQuQ29udGVudFR5cGVJRF9EVEQpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUoc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZG9DcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJU291cmNlVmlld2VyIHZpZXdlciA9IGNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCQl2aWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCUNvbnRyb2wgY29udHJvbCA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCS8vIFsyNjEyNzRdIC0gc291cmNlIHZpZXdlciB3YXMgZ3Jvd2luZyB0byBmaXQgdGhlIG1heCBsaW5lIHdpZHRoIG9mIHRoZSB0ZW1wbGF0ZQotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlL2Rpc2FibGUgY29udHJvbHMgaW4gcGFnZSBiYXNlZCBvbiBmVXNlVGVtcGxhdGVCdXR0b24ncyBjdXJyZW50Ci0JICogc3RhdGUuCi0JICovCi0Jdm9pZCBlbmFibGVUZW1wbGF0ZXMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZVc2VUZW1wbGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoIWVuYWJsZWQpIHsKLQkJCS8vIHNhdmUgbGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZQotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJZWxzZQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0U2VsZWN0ZWRUZW1wbGF0ZShmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lKTsKLQkJfQotCi0JCWZUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlBhdHRlcm5WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgaWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC50ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGUgZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBudWxsOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQl0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiB0ZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRlbXBsYXRlIHN0cmluZyB0byBpbnNlcnQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdG8gaW5zZXJ0IG9yIG51bGwgaWYgbm9uZSBpcyB0byBiZSBpbnNlcnRlZAotCSAqLwotCVN0cmluZyBnZXRUZW1wbGF0ZVN0cmluZygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gbnVsbDsKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKS5nZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELk5FVyk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKLQkJCVRlbXBsYXRlQ29udGV4dCBjb250ZXh0ID0gbmV3IERvY3VtZW50VGVtcGxhdGVDb250ZXh0KGNvbnRleHRUeXBlLCBkb2N1bWVudCwgMCwgMCk7Ci0JCQl0cnkgewotCQkJCVRlbXBsYXRlQnVmZmVyIGJ1ZmZlciA9IGNvbnRleHQuZXZhbHVhdGUodGVtcGxhdGUpOwotCQkJCXRlbXBsYXRlU3RyaW5nID0gYnVmZmVyLmdldFN0cmluZygpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgdGVtcGxhdGUgZm9yIG5ldyBkdGQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlU3RyaW5nOwotCX0KLQotCXZvaWQgbGlua0NsaWNrZWQoKSB7Ci0JCVN0cmluZyBwYWdlSWQgPSBnZXRQcmVmZXJlbmNlUGFnZUlkKCk7Ci0JCVByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBwYWdlSWQsIG5ldyBTdHJpbmdbXXtwYWdlSWR9LCBudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBOZXcgRFREIEZpbGUgd2l6YXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKERURFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUpOwotCQlpZiAodGVtcGxhdGVOYW1lID09IG51bGwgfHwgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbmFibGVUZW1wbGF0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRlbXBsYXRlIG5hbWUgdXNlZCBmb3IgbmV4dCBjYWxsIHRvIE5ldyBEVEQgRmlsZSB3aXphcmQuCi0JICovCi0Jdm9pZCBzYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJdGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKERURFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUsIHRlbXBsYXRlTmFtZSk7Ci0JCURURFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgYSB0ZW1wbGF0ZSBpbiB0aGUgdGFibGUgdmlld2VyIGdpdmVuIHRoZSB0ZW1wbGF0ZSBuYW1lLiBJZgotCSAqIHRlbXBsYXRlIG5hbWUgY2Fubm90IGJlIGZvdW5kIG9yIHRlbXBsYXRlTmFtZSBpcyBudWxsLCBqdXN0IHNlbGVjdAotCSAqIGZpcnN0IGl0ZW0gaW4gdGFibGUuIElmIG5vIGl0ZW1zIGluIHRhYmxlIHNlbGVjdCBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZU5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRUZW1wbGF0ZShTdHJpbmcgdGVtcGxhdGVOYW1lKSB7Ci0JCU9iamVjdCB0ZW1wbGF0ZSA9IG51bGw7Ci0KLQkJaWYgKHRlbXBsYXRlTmFtZSAhPSBudWxsICYmIHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIHBpY2sgdGhlIGxhc3QgdXNlZCB0ZW1wbGF0ZQotCQkJdGVtcGxhdGUgPSBmVGVtcGxhdGVTdG9yZS5maW5kVGVtcGxhdGUodGVtcGxhdGVOYW1lLCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELk5FVyk7Ci0JCX0KLQotCQkvLyBubyByZWNvcmQgb2YgbGFzdCB1c2VkIHRlbXBsYXRlIHNvIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCWlmICh0ZW1wbGF0ZSA9PSBudWxsKSB7Ci0JCQkvLyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQkJdGVtcGxhdGUgPSBmVGFibGVWaWV3ZXIuZ2V0RWxlbWVudEF0KDApOwotCQl9Ci0KLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRlbXBsYXRlKTsKLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHBhdHRlcm4gdmlld2VyLgotCSAqLwotCXZvaWQgdXBkYXRlVmlld2VySW5wdXQoKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQodGVtcGxhdGUuZ2V0UGF0dGVybigpKTsKLQkJfQotCQllbHNlIHsKLQkJCWZQYXR0ZXJuVmlld2VyLmdldERvY3VtZW50KCkuc2V0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3dpemFyZC9OZXdEVERXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC93aXphcmQvTmV3RFREV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkN2EzNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3dpemFyZC9OZXdEVERXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLQotcHVibGljIGNsYXNzIE5ld0RURFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCXByaXZhdGUgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBmTmV3RmlsZVBhZ2U7Ci0JcHJpdmF0ZSBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlIGZOZXdGaWxlVGVtcGxhdGVzUGFnZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIEFkZHMgZGVmYXVsdCBleHRlbnNpb24gdG8gdGhlIGZpbGVuYW1lCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBhZGREZWZhdWx0RXh0ZW5zaW9uKFN0cmluZyBmaWxlbmFtZSkgewotCQlTdHJpbmdCdWZmZXIgbmV3RmlsZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGZpbGVuYW1lKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBleHQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhEVERDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQotCQluZXdGaWxlTmFtZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQluZXdGaWxlTmFtZS5hcHBlbmQoZXh0KTsKLQotCQlyZXR1cm4gbmV3RmlsZU5hbWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlpZiAoZkNvbnRlbnRUeXBlID09IG51bGwpCi0JCQlmQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQkJcmV0dXJuIGZDb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiB2YWxpZCBleHRlbnNpb25zIGZvciBEVEQgQ29udGVudCB0eXBlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUxpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGFwcGx5TGluZURlbGltaXRlcihJRmlsZSBmaWxlLCBTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFN0cmluZyhQbGF0Zm9ybS5QSV9SVU5USU1FLCBQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiksIG5ldyBJU2NvcGVDb250ZXh0W10ge25ldyBQcm9qZWN0U2NvcGUoZmlsZS5nZXRQcm9qZWN0KCkpLCBuZXcgSW5zdGFuY2VTY29wZSgpIH0pOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKHRleHQsICJcclxuIiwgIlxuIik7Ci0JCWNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNvbnZlcnRlZFRleHQsICJcciIsICJcbiIpOwotCQljb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZShjb252ZXJ0ZWRUZXh0LCAiXG4iLCBsaW5lRGVsaW1pdGVyKTsKLQkJcmV0dXJuIGNvbnZlcnRlZFRleHQ7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlIGNvbnRlbnQKLQkgKiB0eXBlIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZXh0ZW5zaW9uIGlzIHZhbGlkIGZvciB0aGlzIGNvbnRlbnQgdHlwZQotCSAqLwotCWJvb2xlYW4gZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJLy8gdGhlcmUgaXMgY3VycmVudGx5IGFuIGV4dGVuc2lvbgotCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSAhPSAtMSkgewotCQkJLy8gY2hlY2sgd2hhdCBjb250ZW50IHR5cGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBleHRlbnNpb24KLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihmaWxlTmFtZSk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHR5cGVzLmxlbmd0aCAmJiAhdmFsaWQpIHsKLQkJCQl2YWxpZCA9IHR5cGVzW2ldLmlzS2luZE9mKHR5cGUpOwotCQkJCSsraTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQl2YWxpZCA9IHRydWU7IC8vIG5vIGV4dGVuc2lvbiBzbyB2YWxpZAotCQlyZXR1cm4gdmFsaWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlmTmV3RmlsZVBhZ2UgPSBuZXcgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSgiRFREV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSIsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKElERS5jb21wdXRlU2VsZWN0ZWRSZXNvdXJjZXMoZlNlbGVjdGlvbikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZSgpOwotCQkJCUlQYXRoIGZ1bGxQYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJCQlpZiAoKGZ1bGxQYXRoICE9IG51bGwpICYmIChmdWxsUGF0aC5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChmaWxlTmFtZSAhPSBudWxsKSkgewotCQkJCQkvLyBjaGVjayB0aGF0IGZpbGVuYW1lIGRvZXMgbm90IGNvbnRhaW4gaW52YWxpZCBleHRlbnNpb24KLQkJCQkJaWYgKCFleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKGZpbGVOYW1lKSkgewotCQkJCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKERURFVJTWVzc2FnZXMuX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0RURCwgZ2V0VmFsaWRFeHRlbnNpb25zKCkudG9TdHJpbmcoKSkpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBjaGVjayBhZGRpbmcgZGVmYXVsdAotCQkJCQkvLyBleHRlbnNpb24gZG9lc24ndCBlcXVhbCBhIGZpbGUgdGhhdCBhbHJlYWR5IGV4aXN0cwotCQkJCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gYWRkRGVmYXVsdEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCQkJCQlJUGF0aCByZXNvdXJjZVBhdGggPSBmdWxsUGF0aC5hcHBlbmQobmV3RmlsZU5hbWUpOwotCi0JCQkJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQkJCUlTdGF0dXMgcmVzdWx0ID0gd29ya3NwYWNlLnZhbGlkYXRlUGF0aChyZXNvdXJjZVBhdGgudG9TdHJpbmcoKSwgSVJlc291cmNlLkZPTERFUik7Ci0JCQkJCQlpZiAoIXJlc3VsdC5pc09LKCkpIHsKLQkJCQkJCQkvLyBwYXRoIGludmFsaWQKLQkJCQkJCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0LmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoKHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKHJlc291cmNlUGF0aCkuZXhpc3RzKCkgfHwgd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCkuZXhpc3RzKCkpKSB7Ci0JCQkJCQkJc2V0RXJyb3JNZXNzYWdlKERURFVJTWVzc2FnZXMuUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCXJldHVybiBzdXBlci52YWxpZGF0ZVBhZ2UoKTsKLQkJCX0KLQkJfTsKLQkJZk5ld0ZpbGVQYWdlLnNldFRpdGxlKERURFVJTWVzc2FnZXMuX1VJX0NSRUFURV9ORVdfRFREX0ZJTEUpOwotCQlmTmV3RmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oRFREVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19EVERfRVhQTCk7Ci0KLQkJYWRkUGFnZShmTmV3RmlsZVBhZ2UpOwotCi0JCWZOZXdGaWxlVGVtcGxhdGVzUGFnZSA9IG5ldyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggYVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uID0gYVNlbGVjdGlvbjsKLQkJc2V0V2luZG93VGl0bGUoRFREVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19EVERfVElUTEUpOyAvLyROT04tTkxTLTEkCi0KLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX1dJWkJBTl9ORVdEVERGSUxFKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcGVyZm9ybWVkT0sgPSBmYWxzZTsKLQotCQkvLyBzYXZlIHVzZXIgb3B0aW9ucyBmb3IgbmV4dCB1c2UKLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlLnNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpOwotCi0JCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBhZGQgZGVmYXVsdCBleHRlbnNpb24KLQkJU3RyaW5nIGZpbGVOYW1lID0gZk5ld0ZpbGVQYWdlLmdldEZpbGVOYW1lKCk7Ci0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBhZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCWZOZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBuZXcgZW1wdHkgZmlsZQotCQlJRmlsZSBmaWxlID0gZk5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQkvLyBpZiB0aGVyZSB3YXMgcHJvYmxlbSB3aXRoIGNyZWF0aW5nIGZpbGUsIGl0IHdpbGwgYmUgbnVsbCwgc28gbWFrZQotCQkvLyBzdXJlIHRvIGNoZWNrCi0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IGZOZXdGaWxlVGVtcGxhdGVzUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJaWYgKHRlbXBsYXRlU3RyaW5nICE9IG51bGwpIHsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGFwcGx5TGluZURlbGltaXRlcihmaWxlLCB0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyBmb3IgdGhlIG5ldyBmaWxlCi0JCQkJU3RyaW5nIGNoYXJTZXQgPSBnZXRBcHByb3ByaWF0ZUNoYXJzZXQoKTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbnVsbDsKLQkJCQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGp1c3QgdXNlIGRlZmF1bHQgZW5jb2RpbmcKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUodGVtcGxhdGVTdHJpbmcpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmNsb3NlKCk7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgY29udGVudHMgZm9yIG5ldyBEVEQgZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQkvLyBvcGVuIHRoZSBmaWxlIGluIGVkaXRvcgotCQkJb3BlbkVkaXRvcihmaWxlKTsKLQotCQkJLy8gZXZlcnl0aGluZydzIGZpbmUKLQkJCXBlcmZvcm1lZE9LID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcGVyZm9ybWVkT0s7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSBEVEQgcHJlZmVyZW5jZSBpZGVudGlmaWVzIGEgY2hhcnNldCwgdXNlIHRoYXQuIElmIG5vdCwgcmV2ZXJ0IHRvIHRoZSBYTUwKLQkgKiBjaGFyc2V0IHByZWZlcmVuY2UKLQkgKiAKLQkgKiBAcmV0dXJuIGNoYXJzZXQgYmFzZWQgb24gRFREIHByZWZlcmVuY2VzIGlmIGRlZmluZWQsIGlmIG5vdCwgZnJvbSB0aGUgWE1MIHByZWZlcmVuY2VzCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVDaGFyc2V0KCkgewotCQlTdHJpbmcgY2hhcnNldCA9IERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JCWlmKGNoYXJzZXQgPT0gbnVsbCB8fCBjaGFyc2V0LnRyaW0oKS5lcXVhbHMoIiIpKQotCQkJY2hhcnNldCA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQkJcmV0dXJuIGNoYXJzZXQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRlbnRPdXRsaW5lQ29tcGFyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRlbnRPdXRsaW5lQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFjYTUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERDb250ZW50T3V0bGluZUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqICAgICANCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTU5vZGU7DQotDQotLyoqDQotICogQ29tcGFyYXRvciBmb3IgdGhlIG91dGxpbmUuIEFsbG93cyBzb3J0aW5nIG9mIHJlZ3VsYXIgRFREIGVsZW1lbnRzLCBidXQgbm90DQotICogdGhlaXIgY29udGVudCBtb2RlbHMgc2luY2UgdGhlIG9yZGVyaW5nIHRoZXJlIGlzIGltcG9ydGFudC4NCi0gKi8NCi1jbGFzcyBEVERDb250ZW50T3V0bGluZUNvbXBhcmF0b3IgZXh0ZW5kcyBWaWV3ZXJDb21wYXJhdG9yIHsNCi0NCi0JcHVibGljIERURENvbnRlbnRPdXRsaW5lQ29tcGFyYXRvcigpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7DQotCQlpZiAoZTEgaW5zdGFuY2VvZiBDTU5vZGUgJiYgZTIgaW5zdGFuY2VvZiBDTU5vZGUpDQotCQkJcmV0dXJuIDA7DQotCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgew0KLQkJcmV0dXJuIHN1cGVyLmlzU29ydGVyUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyODY5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5kbmQuRFRERHJhZ0FuZERyb3BNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmb3Igb3V0bGluZSB2aWV3IHBhZ2Ugd2hpY2ggc2hvd3MgRFREIGNvbnRlbnQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBleHRlbmRzIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiB7Ci0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGZDb250ZW50UHJvdmlkZXIgPSBudWxsOwotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBEVERDb250ZXh0TWVudUhlbHBlciBmTWVudUhlbHBlcjsKLQlwcml2YXRlIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyczsKLQlwcml2YXRlIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW10gZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyczsKLQlwcml2YXRlIE1hcCBmVmlld2VyQ29udHJpYnV0aW9uczsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPVVRMSU5FX09SREVSX1BSRUYgPSAib3V0bGluZS1vcmRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPVVRMSU5FX1NPUlRfUFJFRiA9ICJvdXRsaW5lLXNvcnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBEVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHVibGljIERURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbigpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQkJZlZpZXdlckNvbnRyaWJ1dGlvbnMgPSBuZXcgSGFzaE1hcCgyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2NyZWF0ZVRvb2xiYXJDb250cmlidXRpb25zKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjcmVhdGVUb29sYmFyQ29udHJpYnV0aW9ucyhUcmVlVmlld2VyIHZpZXdlcikgewotCQlBc3NlcnQuaXNUcnVlKGdldENvbnRlbnRQcm92aWRlcih2aWV3ZXIpIGluc3RhbmNlb2YgRFREVHJlZUNvbnRlbnRQcm92aWRlciwgImludmFsaWQgY29udGVudCBwcm92aWRlciBvbiB2aWV3ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gc3VwZXIuY3JlYXRlVG9vbGJhckNvbnRyaWJ1dGlvbnModmlld2VyKTsKLQotCQlTb3J0QWN0aW9uIHNvcnRBY3Rpb24gPSBuZXcgU29ydEFjdGlvbih2aWV3ZXIsIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwgT1VUTElORV9TT1JUX1BSRUYpOwotCQlPcmRlckFjdGlvbiBvcmRlckFjdGlvbiA9IG5ldyBPcmRlckFjdGlvbih2aWV3ZXIsIChEVERUcmVlQ29udGVudFByb3ZpZGVyKSBnZXRDb250ZW50UHJvdmlkZXIodmlld2VyKSwgRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLCBPVVRMSU5FX09SREVSX1BSRUYpOwotCQlJQ29udHJpYnV0aW9uSXRlbSBzb3J0SXRlbSA9IG5ldyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oc29ydEFjdGlvbik7Ci0JCUlDb250cmlidXRpb25JdGVtIG9yZGVySXRlbSA9IG5ldyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0ob3JkZXJBY3Rpb24pOwotCi0JCWlmIChpdGVtcyA9PSBudWxsKSB7Ci0JCQlpdGVtcyA9IG5ldyBJQ29udHJpYnV0aW9uSXRlbVsyXTsKLQkJCWl0ZW1zWzBdID0gc29ydEl0ZW07Ci0JCQlpdGVtc1sxXSA9IG9yZGVySXRlbTsKLQkJfQotCQllbHNlIHsKLQkJCUlDb250cmlidXRpb25JdGVtW10gY29tYmluZWRJdGVtcyA9IG5ldyBJQ29udHJpYnV0aW9uSXRlbVtpdGVtcy5sZW5ndGggKyAyXTsKLQkJCWNvbWJpbmVkSXRlbXNbMF0gPSBzb3J0SXRlbTsKLQkJCWNvbWJpbmVkSXRlbXNbMV0gPSBvcmRlckl0ZW07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLCAwLCBjb21iaW5lZEl0ZW1zLCAyLCBpdGVtcy5sZW5ndGgpOwotCQkJaXRlbXMgPSBjb21iaW5lZEl0ZW1zOwotCQl9Ci0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldENvbnRlbnRQcm92aWRlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmQ29udGVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZDb250ZW50UHJvdmlkZXIgPSBuZXcgRFREVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCQl9Ci0JCS8vIHJldHVybiBzdXBlci5nZXRDb250ZW50UHJvdmlkZXIodmlld2VyKTsKLQkJcmV0dXJuIGZDb250ZW50UHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRMYWJlbFByb3ZpZGVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkxhYmVsUHJvdmlkZXIgPSBuZXcgRFRETGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCS8vIHJldHVybiBzdXBlci5nZXRMYWJlbFByb3ZpZGVyKHZpZXdlcik7Ci0JCXJldHVybiBmTGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldE1lbnVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElNZW51TGlzdGVuZXIgZ2V0TWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUlNZW51TGlzdGVuZXIgbGlzdGVuZXIgPSBudWxsOwotCQlpZiAoZk1lbnVIZWxwZXIgPT0gbnVsbCAmJiB2aWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIERURE1vZGVsSW1wbCkgewotCQkJZk1lbnVIZWxwZXIgPSBuZXcgRFREQ29udGV4dE1lbnVIZWxwZXIoKERURE1vZGVsSW1wbCkgdmlld2VyLmdldElucHV0KCkpOwotCQkJZk1lbnVIZWxwZXIuY3JlYXRlTWVudUxpc3RlbmVyc0Zvcih2aWV3ZXIpOwotCQl9Ci0JCWlmIChmTWVudUhlbHBlciAhPSBudWxsKSB7Ci0JCQlsaXN0ZW5lciA9IGZNZW51SGVscGVyLmdldE1lbnVMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBsaXN0ZW5lcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXSBnZXRUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMoZmluYWwgVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCWlmIChmVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMgPSBuZXcgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXXtuZXcgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCQlMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuc2V0U2VsZWN0aW9uKG51bGwpOwotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0JCi0JCQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCQlMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuc2V0U2VsZWN0aW9uKHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkKLQkJCQlwdWJsaWMgVHJhbnNmZXIgZ2V0VHJhbnNmZXIoKSB7Ci0JCQkJCXJldHVybiBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCk7Ci0JCQkJfQotCQkJfX07Ci0JCX0KLQkKLQkJcmV0dXJuIGZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnM7Ci0JfQotCi0JLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJbXSBnZXRUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMoZmluYWwgVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCWlmIChmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWZUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMgPSBuZXcgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJbXXtuZXcgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJfQotCQotCQkJCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUOwotCQkJCQlmbG9hdCBmZWVkYmFja0Zsb2F0ID0gZ2V0SGVpZ2h0SW5JdGVtKGV2ZW50KTsKLQkJCQkJaWYgKGZlZWRiYWNrRmxvYXQgPiAwLjc1KSB7Ci0JCQkJCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19JTlNFUlRfQUZURVI7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZmVlZGJhY2tGbG9hdCA8IDAuMjUpIHsKLQkJCQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkU7Ci0JCQkJCX0KLQkJCQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0VYUEFORCB8IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQkJfQotCQotCQkJCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC5vcGVyYXRpb25zICE9IERORC5EUk9QX05PTkUgJiYgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIGV2ZW50Lml0ZW0gIT0gbnVsbCAmJiBldmVudC5pdGVtLmdldERhdGEoKSAhPSBudWxsKSB7Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiB0aGUgY29tbWFuZCB1c2VzIHRoZXNlIG51bWJlcnMgaW5zdGVhZCBvZiB0aGUKLQkJCQkJCQkgKiBmZWVkYmFjayBjb25zdGFudHMgKGV2ZW4gdGhvdWdoIGl0IGNvbnZlcnRzIGluCi0JCQkJCQkJICogdGhlIG90aGVyIGRpcmVjdGlvbiBhcyB3ZWxsKQotCQkJCQkJCSAqLwotCQkJCQkJCWZsb2F0IGZlZWRiYWNrRmxvYXQgPSBnZXRIZWlnaHRJbkl0ZW0oZXZlbnQpOwotCQotCQkJCQkJCWZpbmFsIERyYWdBbmREcm9wQ29tbWFuZCBjb21tYW5kID0gbmV3IERURERyYWdBbmREcm9wTWFuYWdlcigpLmNyZWF0ZUNvbW1hbmQoZXZlbnQuaXRlbS5nZXREYXRhKCksIGZlZWRiYWNrRmxvYXQsIGV2ZW50Lm9wZXJhdGlvbnMsIGV2ZW50LmRldGFpbCwgc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlpZiAoY29tbWFuZCAhPSBudWxsICYmIGNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJCQkJCVNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJCQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCi0JCQkJcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0JCi0JCQkJcHJpdmF0ZSBmbG9hdCBnZXRIZWlnaHRJbkl0ZW0oRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmKGV2ZW50Lml0ZW0gPT0gbnVsbCkgcmV0dXJuIC41ZjsKLQkJCQkJaWYgKGV2ZW50Lml0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotCQkJCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJCQlDb250cm9sIGNvbnRyb2wgPSB0cmVlSXRlbS5nZXRQYXJlbnQoKTsKLQkJCQkJCVBvaW50IHBvaW50ID0gY29udHJvbC50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLQkJCQkJCXJldHVybiAoZmxvYXQpIChwb2ludC55IC0gYm91bmRzLnkpIC8gKGZsb2F0KSBib3VuZHMuaGVpZ2h0OwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGV2ZW50Lml0ZW0gaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLQkJCQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSAoVGFibGVJdGVtKSBldmVudC5pdGVtOwotCQkJCQkJQ29udHJvbCBjb250cm9sID0gdGFibGVJdGVtLmdldFBhcmVudCgpOwotCQkJCQkJUG9pbnQgcG9pbnQgPSBjb250cm9sLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JCQkJCQlyZXR1cm4gKGZsb2F0KSAocG9pbnQueSAtIGJvdW5kcy55KSAvIChmbG9hdCkgYm91bmRzLmhlaWdodDsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJldHVybiAwLjBGOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyBUcmFuc2ZlciBnZXRUcmFuc2ZlcigpIHsKLQkJCQkJcmV0dXJuIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKTsKLQkJCQl9Ci0JCi0JCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlyZXR1cm4gZ2V0VHJhbnNmZXIoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKTsKLQkJCQl9Ci0JCQl9fTsKLQkJfQotCQlyZXR1cm4gZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI3VuY29uZmlndXJlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZShUcmVlVmlld2VyIHZpZXdlcikgewotCQlzdXBlci51bmNvbmZpZ3VyZSh2aWV3ZXIpOwotCQlmVmlld2VyQ29udHJpYnV0aW9ucy5yZW1vdmUodmlld2VyKTsKLQkJaWYgKGZNZW51SGVscGVyICE9IG51bGwpIHsKLQkJCWZNZW51SGVscGVyLnJlbW92ZU1lbnVMaXN0ZW5lcnNGb3Iodmlld2VyKTsKLQkJCWZNZW51SGVscGVyID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERDb250ZXh0TWVudUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRleHRNZW51SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OWEwN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRleHRNZW51SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIE5hb2tpIEFraXlhbWEgKEZ1aml0c3UpIC0gYnVnIDE4NzE3MiAtIGZpeCBhdHRyaWJ1dGUgZ3JvdXBpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5MYWJlbFZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGRBdHRyaWJ1dGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEF0dHJpYnV0ZUxpc3RBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZENvbW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkRW50aXR5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGROb3RhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLlJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbjsKLQotLyoqCi0gKiBNZW51IGhlbHBlciBmb3IgQ29udGVudCBPdXRsaW5lIHBhZ2UuIFRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIGVsc2V3aGVyZS4KLSAqLwotY2xhc3MgRFREQ29udGV4dE1lbnVIZWxwZXIgewotCWNsYXNzIERURE1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCS8vIHVwZGF0ZSB0aGUgYWN0aW9uIHNlbGVjdGlvbiBub3cKLQkJCWFkZE5vdGF0aW9uQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlhZGRFbnRpdHlBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZENvbW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJZGVsZXRlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlhZGRBdHRyaWJ1dGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJcmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0KLQotCQkJaWYgKCFmVmlld2VyU2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCWFkZEFjdGlvbkl0ZW1zRm9yU2VsZWN0aW9uKGZWaWV3ZXJTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCksIG1hbmFnZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgVmlld2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCV9zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCUFkZEF0dHJpYnV0ZUFjdGlvbiBhZGRBdHRyaWJ1dGVBY3Rpb247Ci0KLQlBZGRBdHRyaWJ1dGVMaXN0QWN0aW9uIGFkZEF0dHJpYnV0ZUxpc3RBY3Rpb247Ci0JQWRkQ29tbWVudEFjdGlvbiBhZGRDb21tZW50QWN0aW9uOwotCUFkZEVsZW1lbnRBY3Rpb24gYWRkRWxlbWVudEFjdGlvbjsKLQlBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24gYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uOwotCUFkZEVudGl0eUFjdGlvbiBhZGRFbnRpdHlBY3Rpb247Ci0JQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbiBhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uOwotCUFkZE5vdGF0aW9uQWN0aW9uIGFkZE5vdGF0aW9uQWN0aW9uOwotCUFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbiBhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb247Ci0JRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbjsKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZkludGVybmFsU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IFZpZXdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0KLQlwcml2YXRlIElNZW51TGlzdGVuZXIgZk1lbnVMaXN0ZW5lcjsKLQlwcml2YXRlIERURE1vZGVsSW1wbCBmTW9kZWw7Ci0JcHJpdmF0ZSBMaXN0IGZWaWV3ZXJMaXN0OwotCi0JSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlZpZXdlclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0KLQlSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24gcmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uOwotCi0JcHVibGljIERURENvbnRleHRNZW51SGVscGVyKERURE1vZGVsSW1wbCBtb2RlbCkgewotCQlmTW9kZWwgPSBtb2RlbDsKLQkJZlZpZXdlckxpc3QgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlmTWVudUxpc3RlbmVyID0gbmV3IERURE1lbnVMaXN0ZW5lcigpOwotCi0JCWFkZE5vdGF0aW9uQWN0aW9uID0gbmV3IEFkZE5vdGF0aW9uQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0RURF9OT1RBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRW50aXR5QWN0aW9uID0gbmV3IEFkZEVudGl0eUFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9EVERfRU5USVRZKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFbGVtZW50QWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRFREX0VMRU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCWFkZENvbW1lbnRBY3Rpb24gPSBuZXcgQWRkQ29tbWVudEFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9EVERfQ09NTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQotCQlhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24gPSBuZXcgQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1BBUkFNX0VOVElUWV9SRUYpOyAvLyROT04tTkxTLTEkCi0JCWRlbGV0ZUFjdGlvbiA9IG5ldyBEZWxldGVBY3Rpb24oRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0RURF9ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0JCWFkZEF0dHJpYnV0ZUFjdGlvbiA9IG5ldyBBZGRBdHRyaWJ1dGVBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uID0gbmV3IEFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFTElTVCk7IC8vJE5PTi1OTFMtMSQKLQotCQlhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uID0gbmV3IEFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9HUk9VUF9BRERfR1JPVVApOyAvLyROT04tTkxTLTEkCi0JCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbiA9IG5ldyBBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRUxFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24gPSBuZXcgUmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fR1JPVVBfQUREX0dST1VQKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFkZE5vdGF0aW9uQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfTk9UQVRJT04pKTsKLQkJYWRkRW50aXR5QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfRU5USVRZKSk7Ci0JCWFkZENvbW1lbnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FERF9DT01NRU5UKSk7Ci0JCWFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQUREX0VOVElUWV9SRUZFUkVOQ0UpKTsKLQotCQkvLyBUcmktc3RhdGUgaW1hZ2VzCi0JCWFkZEVsZW1lbnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0VMRU1FTlQpKTsKLQkJYWRkRWxlbWVudEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0NUT09MX0FERF9FTEVNRU5UKSk7Ci0JCWFkZEVsZW1lbnRBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9BRERfRUxFTUVOVCkpOwotCi0JCWFkZEF0dHJpYnV0ZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9BRERfQVRUUklCVVRFKSk7Ci0JCWFkZEF0dHJpYnV0ZUFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0NUT09MX0FERF9BVFRSSUJVVEUpKTsKLQkJYWRkQXR0cmlidXRlQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0FUVFJJQlVURSkpOwotCi0JCWFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0FUVFJJQlVURSkpOwotCQlhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0FUVFJJQlVURSkpOwotCQlhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0FUVFJJQlVURSkpOwotCi0JCWFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCQlhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCQlhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCi0JCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9BRERfRUxFTUVOVFRPQ09OTU9ERUwpKTsKLQkJYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0VMRU1FTlRUT0NPTk1PREVMKSk7Ci0JCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0FERF9FTEVNRU5UVE9DT05NT0RFTCkpOwotCi0JCS8vIHVzZSB0aGUgc2FtZSBpbWFnZXMgYXMgYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbgotCQlyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCQlyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19DVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMKSk7Ci0JCXJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwpKTsKLQl9Ci0KLQl2b2lkIF9zZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvKgotCQkgKiBTYXZlIHRoZSBzZWxlY3Rpb24gc28gd2Ugb25seSBub3RpZnkgdGhlIGFjdGlvbnMgd2hlbiB0aGUgbWVudSBpcwotCQkgKiBzaG93bgotCQkgKi8KLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJfQotCX0KLQotCXZvaWQgYWRkQWN0aW9uSXRlbXNGb3JTZWxlY3Rpb24oT2JqZWN0IHNlbGVjdGVkT2JqZWN0LCBJTWVudU1hbmFnZXIgbWVudSkgewotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBOb2RlTGlzdCkgewotCQkJLy8gYWRkIGFwcHJvcHJpYXRlIG1lbnUgdG8gbG9naWNhbCB2aWV3Ci0JCQlOb2RlTGlzdCBmb2xkZXIgPSAoTm9kZUxpc3QpIHNlbGVjdGVkT2JqZWN0OwotCQkJaWYgKGZvbGRlci5nZXRMaXN0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpKSB7Ci0JCQkJbWVudS5hZGQoYWRkTm90YXRpb25BY3Rpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoZm9sZGVyLmdldExpc3RUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpKSB7Ci0JCQkJbWVudS5hZGQoYWRkRW50aXR5QWN0aW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZvbGRlci5nZXRMaXN0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRykpIHsKLQkJCQlMYWJlbFZhbHVlUGFpcltdIGF2YWlsYWJsZUVudGl0aWVzID0gZk1vZGVsLmNyZWF0ZVBhcm1FbnRpdHlDb250ZW50SXRlbXMobnVsbCk7Ci0JCQkJYWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uLnNldEVuYWJsZWQoYXZhaWxhYmxlRW50aXRpZXMubGVuZ3RoID4gMCk7Ci0KLQkJCQltZW51LmFkZChhZGRFbGVtZW50QWN0aW9uKTsKLQkJCQltZW51LmFkZChhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoZm9sZGVyLmdldExpc3RUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKSkgewotCQkJCW1lbnUuYWRkKGFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24pOwotCQkJfQotCQl9Ci0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIERUREZpbGUgfHwgc2VsZWN0ZWRPYmplY3QgPT0gbnVsbCkgewotCQkJTGFiZWxWYWx1ZVBhaXJbXSBhdmFpbGFibGVFbnRpdGllcyA9IGZNb2RlbC5jcmVhdGVQYXJtRW50aXR5Q29udGVudEl0ZW1zKG51bGwpOwotCQkJYWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uLnNldEVuYWJsZWQoYXZhaWxhYmxlRW50aXRpZXMubGVuZ3RoID4gMCk7Ci0KLQkJCW1lbnUuYWRkKGFkZEVsZW1lbnRBY3Rpb24pOwotCQkJbWVudS5hZGQoYWRkRW50aXR5QWN0aW9uKTsKLQkJCW1lbnUuYWRkKGFkZE5vdGF0aW9uQWN0aW9uKTsKLQkJCW1lbnUuYWRkKGFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbik7Ci0JCQltZW51LmFkZChhZGRDb21tZW50QWN0aW9uKTsKLQkJCW1lbnUuYWRkKGFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24pOwotCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJfQotCi0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCUVsZW1lbnQgZHRkRWxlbWVudCA9IChFbGVtZW50KSBzZWxlY3RlZE9iamVjdDsKLQotCQkJQ01Ob2RlIGNvbnRlbnRNb2RlbCA9IGR0ZEVsZW1lbnQuZ2V0Q29udGVudE1vZGVsKCk7Ci0JCQlpZiAoY29udGVudE1vZGVsID09IG51bGwpIHsKLQkJCQltZW51LmFkZChhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uKTsKLQkJCQltZW51LmFkZChhZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoY29udGVudE1vZGVsICE9IG51bGwgJiYgQ01Ob2RlLkVNUFRZLmVxdWFscyhjb250ZW50TW9kZWwuZ2V0VHlwZSgpKSkgewotCQkJCW1lbnUuYWRkKHJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbik7Ci0JCQl9Ci0JCQltZW51LmFkZChhZGRBdHRyaWJ1dGVBY3Rpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCW1lbnUuYWRkKGFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbik7Ci0JCQltZW51LmFkZChhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCW1lbnUuYWRkKGFkZEF0dHJpYnV0ZUFjdGlvbik7Ci0JCX0KLQotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlhZGRFZGl0QWN0aW9ucyhtZW51KTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBEVEROb2RlICYmICEoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBDTU5vZGUgJiYgKChDTU5vZGUpIHNlbGVjdGVkT2JqZWN0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpKSkgewotCQkJbWVudS5hZGQoZGVsZXRlQWN0aW9uKTsKLQkJCWRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi0Jdm9pZCBhZGRFZGl0QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSkgewotCQkvLyBtZW51LmFkZCh1bmRvQWN0aW9uKTsKLQkJLy8gbWVudS5hZGQocmVkb0FjdGlvbik7Ci0JCS8vIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCS8vIG1lbnUuYWRkKGN1dEFjdGlvbik7Ci0JCS8vIG1lbnUuYWRkKGNvcHlBY3Rpb24pOwotCQkvLyBtZW51LmFkZChwYXN0ZUFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlTWVudUxpc3RlbmVyc0ZvcihWaWV3ZXIgdmlld2VyKSB7Ci0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZkludGVybmFsU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZlZpZXdlclNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQl9Ci0JCWVsc2UgewotCQkJZlZpZXdlclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCX0KLQotCQlmVmlld2VyTGlzdC5hZGQodmlld2VyKTsKLQl9Ci0KLQlwdWJsaWMgSU1lbnVMaXN0ZW5lciBnZXRNZW51TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBmTWVudUxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU1lbnVMaXN0ZW5lcnNGb3IoVmlld2VyIHZpZXdlcikgewotCQl2aWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZJbnRlcm5hbFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCWZWaWV3ZXJMaXN0LnJlbW92ZSh2aWV3ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFRETGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzdmYjFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vZGVMaXN0OwotCi1jbGFzcyBEVERMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgRFRETGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgaW1hZ2UKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSB1c2VkIHRvIGxhYmVsIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgdGhlc2UgaXMgbm8gaW1hZ2UgZm9yIHRoZSBnaXZlbiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCWltYWdlID0gKChEVEROb2RlKSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGlzdCkgewotCQkJaW1hZ2UgPSAoKE5vZGVMaXN0KSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQlpbWFnZSA9ICgoRFRERmlsZSkgZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlID0gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIHByb3ZpZGUgdGhlIGxhYmVsIHRleHQKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IHN0cmluZyB1c2VkIHRvIGxhYmVsIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgaWYgdGhlc2UgaXMgbm8gdGV4dCBsYWJlbCBmb3IgdGhlIGdpdmVuIG9iamVjdAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCVN0cmluZyBuYW1lID0gKChEVEROb2RlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0KLQkJCS8vIHN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZSAodXNlZnVsIGZvciBtdWx0aS1saW5lIGNvbW1lbnRzKQotCQkJaW50IGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgPSAwOwotCQkJaW50IGxhc3RWaXNpYmxlQ2hhcmFjdGVyID0gbmFtZS5sZW5ndGgoKSAtIDE7Ci0JCQlmb3IgKGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgPSAwOyBmaXJzdFNpZ25pZmljYW50Q2hhcmFjdGVyIDwgbmFtZS5sZW5ndGgoKTsgZmlyc3RTaWduaWZpY2FudENoYXJhY3RlcisrKSB7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5hbWUuY2hhckF0KGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIpKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvLyBrZWVwIG9ubHkgdGhlIGZpcnN0IGxpbmUgb2YgdGV4dCBpbiBhIG11bHRpLWxpbmUgbmFtZQotCQkJaWYgKGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgPCBsYXN0VmlzaWJsZUNoYXJhY3RlcikgewotCQkJCWZvciAobGFzdFZpc2libGVDaGFyYWN0ZXIgPSBmaXJzdFNpZ25pZmljYW50Q2hhcmFjdGVyICsgMTsgbGFzdFZpc2libGVDaGFyYWN0ZXIgPCBuYW1lLmxlbmd0aCgpOyBsYXN0VmlzaWJsZUNoYXJhY3RlcisrKSB7Ci0JCQkJCWNoYXIgY2hhcmFjdGVyID0gbmFtZS5jaGFyQXQobGFzdFZpc2libGVDaGFyYWN0ZXIpOwotCQkJCQlpZiAoY2hhcmFjdGVyID09ICdccicgfHwgY2hhcmFjdGVyID09ICdcbicpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciA+IDAgJiYgZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciA8IG5hbWUubGVuZ3RoKCkgLSAxKSB7Ci0JCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIsIGxhc3RWaXNpYmxlQ2hhcmFjdGVyKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7Ci0JCQkvLyByZXR1cm4gKChOb2RlTGlzdCkgZWxlbWVudCkuZ2V0TGlzdFR5cGUoKTsKLQkJCXJldHVybiAoKE5vZGVMaXN0KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCXJldHVybiAoKERUREZpbGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhYTkwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Db21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50LklEVERGaWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50Lk5vZGVzRXZlbnQ7Ci0KLWNsYXNzIERURFRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSURUREZpbGVMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIE9iamVjdCBmSW5wdXRPYmplY3Q7Ci0JcHJvdGVjdGVkIFZpZXdlciBmVmlld2VyOwotCi0JLy8gQSBjYWNoZWQgc2V0IG9mIEluZGV4ZWROb2RlTGlzdHMsIHJlcXVpcmVkIGZvciBnZXRQYXJlbnQgdG8gcmV0dXJuIHRoZQotCS8vIGNvcnJlY3QgaW5zdGFuY2VzIG1hcHBpbmcgdG8gVHJlZUl0ZW1zCi0JcHJvdGVjdGVkIE9iamVjdFtdIGxvZ2ljYWxOb2RlTGlzdHMgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dMb2dpY2FsT3JkZXIgPSBmYWxzZTsKLQotCXB1YmxpYyBEVERUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZWaWV3ZXIgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRUb05vZGUoRFRETm9kZSBub2RlKSB7Ci0JCURUREZpbGUgZHRkRmlsZSA9IG5vZGUuZ2V0RFRERmlsZSgpOwotCQkvLyBmaXJzdCBleHBhbmQgdGhlIHJvb3QKLQkJQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlciA9IChBYnN0cmFjdFRyZWVWaWV3ZXIpIGZWaWV3ZXI7Ci0JCXZpZXdlci5leHBhbmRUb0xldmVsKGR0ZEZpbGUsIDEpOwotCQlOb2RlTGlzdCBsaXN0VG9FeHBhbmQgPSBudWxsOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgewotCQkJbGlzdFRvRXhwYW5kID0gZHRkRmlsZS5nZXRFbGVtZW50c0FuZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZXMoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCWxpc3RUb0V4cGFuZCA9IGR0ZEZpbGUuZ2V0Tm90YXRpb25zKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJbGlzdFRvRXhwYW5kID0gZHRkRmlsZS5nZXRFbnRpdGllcygpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDb21tZW50KSB7Ci0JCQlsaXN0VG9FeHBhbmQgPSBkdGRGaWxlLmdldENvbW1lbnRzKCk7Ci0JCX0KLQkJaWYgKGxpc3RUb0V4cGFuZCAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuZXhwYW5kVG9MZXZlbChsaXN0VG9FeHBhbmQsIDEpOwotCQl9Ci0JCXZpZXdlci5leHBhbmRUb0xldmVsKG5vZGUsIDApOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkvLyByZXR1cm4gdGhlIGxpc3RzIG9mIG5vZGVzIHdoZW4gaW4gbG9naWNhbCBvcmRlciBtb2RlLCBhbGwgdGhlIE5vZGVzCi0JCS8vIG90aGVyd2lzZQotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCWlmIChpc1Nob3dMb2dpY2FsT3JkZXIoKSkgewotCQkJCS8vIHJldHVybiB0aGUgdmlzaWJsZSBub2RlIGxpc3RzCi0JCQkJaWYgKGxvZ2ljYWxOb2RlTGlzdHMgPT0gbnVsbCkgewotCQkJCQlJdGVyYXRvciBub2RlTGlzdHMgPSAoKERUREZpbGUpIHBhcmVudEVsZW1lbnQpLmdldE5vZGVMaXN0cygpLml0ZXJhdG9yKCk7Ci0JCQkJCUxpc3QgdmlzaWJsZUxpc3RzID0gbmV3IEFycmF5TGlzdCg3KTsKLQkJCQkJd2hpbGUgKG5vZGVMaXN0cy5oYXNOZXh0KCkpIHsKLQkJCQkJCU5vZGVMaXN0IGxpc3QgPSAoTm9kZUxpc3QpIG5vZGVMaXN0cy5uZXh0KCk7Ci0JCQkJCQlpZiAoaXNWaXNpYmxlTm9kZUxpc3QobGlzdCkpIHsKLQkJCQkJCQl2aXNpYmxlTGlzdHMuYWRkKGxpc3QpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWxvZ2ljYWxOb2RlTGlzdHMgPSB2aXNpYmxlTGlzdHMudG9BcnJheSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gbG9naWNhbE5vZGVMaXN0czsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHJldHVybiB0aGUgdmlzaWJsZSBub2RlcwotCQkJCUxpc3QgYWxsTm9kZXMgPSAoKERUREZpbGUpIHBhcmVudEVsZW1lbnQpLmdldE5vZGVzKCk7Ci0JCQkJTGlzdCB2aXNpYmxlTm9kZXMgPSBuZXcgQXJyYXlMaXN0KGFsbE5vZGVzLnNpemUoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxOb2Rlcy5zaXplKCk7IGkrKykgewotCQkJCQlPYmplY3QgbyA9IGFsbE5vZGVzLmdldChpKTsKLQkJCQkJaWYgKGlzVmlzaWJsZU5vZGUobykpIHsKLQkJCQkJCXZpc2libGVOb2Rlcy5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHZpc2libGVOb2Rlcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7Ci0JCQlyZXR1cm4gKChOb2RlTGlzdCkgcGFyZW50RWxlbWVudCkuZ2V0Tm9kZXMoKS50b0FycmF5KCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCS8vIGFsd2F5cyBncm91cCB0aGUgYXR0cmlidXRlcyBkaXJlY3RseSB1bmRlciB0aGUgZWxlbWVudAotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSAoKERURE5vZGUpIHBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCQlMaXN0IGF0dHJpYnV0ZXMgPSAoKEVsZW1lbnQpIHBhcmVudEVsZW1lbnQpLmdldEVsZW1lbnRBdHRyaWJ1dGVzKCk7Ci0JCQlPYmplY3RbXSBsb2dpY2FsQ2hpbGRyZW4gPSBuZXcgT2JqZWN0W2NoaWxkcmVuLmxlbmd0aCArIGF0dHJpYnV0ZXMuc2l6ZSgpXTsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQlsb2dpY2FsQ2hpbGRyZW5baW5kZXhdID0gY2hpbGRyZW5baW5kZXhdOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlsb2dpY2FsQ2hpbGRyZW5baW5kZXgrK10gPSBpdGVyLm5leHQoKTsKLQkJCX0KLQkJCXJldHVybiBsb2dpY2FsQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCXJldHVybiAoKERURE5vZGUpIHBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlPYmplY3RbXSBlbGVtZW50cyA9IG51bGw7Ci0JCS8vIEFsd2F5cyBzaG93IHRoZSBEVERGaWxlICJub2RlIgotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBPYmplY3RbXXsoKERURE1vZGVsSW1wbCkgaW5wdXRFbGVtZW50KS5nZXREVERGaWxlKCl9OwotCQl9Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBPYmplY3RbMF07Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBlbGVtZW50OwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQkvLyB0aGVuIHdlIG11c3Qgc2F5IHRoYXQgdGhlIGVsZW1lbnQgd2l0aCB0aGUgc2FtZSBuYW1lCi0JCQkJLy8gYXMgb3VyIGF0dHJpYnV0ZSdzIHBhcmVudCBhdHRyaWJ1dGVsaXN0IGlzIG91ciBwYXJlbnQKLQkJCQlwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50IGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJCQlyZXR1cm4gZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJLy8gdGhlbiB3ZSBtdXN0IHNheSB0aGF0IHRoZSBlbGVtZW50IHdpdGggdGhlIHNhbWUgbmFtZQotCQkJCS8vIGFzIG91ciBhdHRyaWJ1dGVsaXN0IGlzIG91ciBwYXJlbnQKLQkJCQlTdHJpbmcgYXR0TGlzdE5hbWUgPSAoKEF0dHJpYnV0ZUxpc3QpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQlJdGVyYXRvciBpdGVyID0gbm9kZS5nZXREVERGaWxlKCkuZ2V0RWxlbWVudHNBbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VzKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiBwYXJlbnQgPT0gbnVsbCkgewotCQkJCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGN1cnJlbnROb2RlLmdldE5hbWUoKS5lcXVhbHMoYXR0TGlzdE5hbWUpKSB7Ci0JCQkJCQlwYXJlbnQgPSBjdXJyZW50Tm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJcGFyZW50ID0gKChEVEROb2RlKSBlbGVtZW50KS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0KLQkJCS8vIGlmIHNob3dpbmcgaW4gdGhlIGxvZ2ljYWwgb3JkZXIsIHJldHVybiB0aGUgSW5kZXhlZE5vZGVMaXN0Ci0JCQkvLyBhY3RpbmcgYXMgdGhlIHBhcmVudCBpbiB0aGUgdHJlZQotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJaWYgKGlzU2hvd0xvZ2ljYWxPcmRlcigpKSB7Ci0JCQkJCU9iamVjdFtdIGluZGV4ZWROb2RlTGlzdHMgPSBnZXRDaGlsZHJlbigoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCkpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4ZWROb2RlTGlzdHMubGVuZ3RoICYmIHBhcmVudCA9PSBudWxsOyBpKyspIHsKLQkJCQkJCWlmIChpbmRleGVkTm9kZUxpc3RzW2ldIGluc3RhbmNlb2YgTm9kZUxpc3QpIHsKLQkJCQkJCQlpZiAoKChOb2RlTGlzdCkgaW5kZXhlZE5vZGVMaXN0c1tpXSkuZ2V0Tm9kZXMoKS5jb250YWlucyhlbGVtZW50KSkKLQkJCQkJCQkJcGFyZW50ID0gaW5kZXhlZE5vZGVMaXN0c1tpXTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFyZW50ID0gKChEVERNb2RlbEltcGwpIGZJbnB1dE9iamVjdCkuZ2V0RFRERmlsZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QgJiYgZklucHV0T2JqZWN0IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQlwYXJlbnQgPSAoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlyZXR1cm4gY2hpbGRyZW4ubGVuZ3RoID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJZlZpZXdlciA9IHZpZXdlcjsKLQotCQlpZiAoZklucHV0T2JqZWN0IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQkoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCkucmVtb3ZlRFRERmlsZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWZJbnB1dE9iamVjdCA9IG5ld0lucHV0OwotCQlpZiAoZklucHV0T2JqZWN0IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQkoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCkuYWRkRFRERmlsZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzaG93TG9naWNhbE9yZGVyLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc2hvd0xvZ2ljYWxPcmRlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dMb2dpY2FsT3JkZXIoKSB7Ci0JCXJldHVybiBzaG93TG9naWNhbE9yZGVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1Zpc2libGVOb2RlKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1Zpc2libGVOb2RlTGlzdChOb2RlTGlzdCBub2RlTGlzdCkgewotCQkvKgotCQkgKiBBbGwgTm9kZXNMaXN0cyBzaG91bGQgYmUgdmlzaWJsZSBiZWNhdXNlIHlvdSBjYW4gbW9tZW50YXJpbHkgaGF2ZQotCQkgKiBhbiBBVFRMSVNUIChmb3IgZXhhbXBsZSkgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgRUxFTUVOVAotCQkgKiBkZWNsYXJhdGlvbgotCQkgKi8KLQkJcmV0dXJuIHRydWU7Ly8gIW5vZGVMaXN0LmdldExpc3RUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQ2hhbmdlZChmaW5hbCBEVEROb2RlIG5vZGUpIHsKLQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5vZGUgY2hhbmdlZCBub3RpZmllZCIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24gYmVmb3JlID0gIiArCi0JCQkvLyAoKFN0cnVjdHVyZWRWaWV3ZXIpdmlldykuZ2V0U2VsZWN0aW9uKCkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0ICYmIGlzU2hvd0xvZ2ljYWxPcmRlcigpKSB7Ci0JCQkJLy8gaW4gdGhpcyBjYXNlLCB3ZSBhcmUgc2hvd2luZyBhdHRyaWJ1dGVzIHVuZGVyIHRoZSBlbGVtZW50LgotCQkJCS8vIHJlZnJlc2ggdGhlIGVsZW1lbnQgb2JqZWN0IGluc3RlYWQKLQkJCQlJdGVyYXRvciBpdGVyID0gbm9kZS5nZXREVERGaWxlKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY3VycmVudE5vZGUuZ2V0TmFtZSgpLmVxdWFscyhub2RlLmdldE5hbWUoKSkgJiYgY3VycmVudE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXIpLnJlZnJlc2goY3VycmVudE5vZGUsIHRydWUpOwotCQkJCQl9Ci0JCQkJfSAvLyBlbmQgb2Ygd2hpbGUgKCkKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGRvIHN0YW5kYXJkIHN0dWZmCi0JCQkJZlZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChmVmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXIpLnJlZnJlc2gobm9kZS5nZXRQYXJlbnROb2RlKCksIHRydWUpOwotCQkJCQkJfQotCQkJCQkJKChTdHJ1Y3R1cmVkVmlld2VyKSBmVmlld2VyKS5yZWZyZXNoKG5vZGUsIHRydWUpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQkJZlZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChmVmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJLyoKLQkJCQkJCSAqIGdvIGZyb20gdGhlIGF0dHJpYnV0ZSB0byBpdHMgbGlzdCBhbmQgdGhlbiBvd25pbmcgZWxlbWVudAotCQkJCQkJICogc28gd2UgcmVmcmVzaCB0aGUgdHJlZSBpdGVtIHRoZXJlIGFzIHdlbGwKLQkJCQkJCSAqLwotCQkJCQkJT2JqZWN0IGF0dHJMaXN0ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAoYXR0ckxpc3QgIT0gbnVsbCAmJiBhdHRyTGlzdCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCQkJCQlTdHJpbmcgYXR0TGlzdE5hbWUgPSAoKEF0dHJpYnV0ZUxpc3QpIGF0dHJMaXN0KS5nZXROYW1lKCk7Ci0JCQkJCQkJSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0RFRERmlsZSgpLmdldEVsZW1lbnRzQW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlcygpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCQkJCQlPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgcGFyZW50ID09IG51bGwpIHsKLQkJCQkJCQkJRFRETm9kZSBjdXJyZW50Tm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiBjdXJyZW50Tm9kZS5nZXROYW1lKCkuZXF1YWxzKGF0dExpc3ROYW1lKSkgewotCQkJCQkJCQkJcGFyZW50ID0gY3VycmVudE5vZGU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQkJCSgoU3RydWN0dXJlZFZpZXdlcikgZlZpZXdlcikucmVmcmVzaChwYXJlbnQsIHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24gYWZ0ZXIgPSAiICsKLQkJCS8vICgoU3RydWN0dXJlZFZpZXdlcil2aWV3KS5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc0FkZGVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpIHsKLQkJCVN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXI7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQkJT2JqZWN0IGZpcnN0T2JqID0gKCFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCQkJRFRETm9kZSBvbGRTZWxlY3RlZE5vZGUgPSBudWxsOwotCQkJaWYgKGZpcnN0T2JqIGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCW9sZFNlbGVjdGVkTm9kZSA9IChEVEROb2RlKSBmaXJzdE9iajsKLQkJCX0KLQotCQkJZmluYWwgQWJzdHJhY3RUcmVlVmlld2VyIGFic3RyYWN0VHJlZVZpZXdlciA9IChBYnN0cmFjdFRyZWVWaWV3ZXIpIGZWaWV3ZXI7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXZlbnQuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG5vZGUgPSBpdC5uZXh0KCk7Ci0JCQkJZmluYWwgT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChub2RlKTsKLQkJCQkvLyBCdWcgMTExMTAwIC0gSWYgaXQgaXMgYSB0b3AgbGV2ZWwgbm9kZSAoaWUuIHBhcmVudCBpcyBhCi0JCQkJLy8gRFRERmlsZSksCi0JCQkJLy8gaW5zZXJ0IHRoZSBub2RlIGRpcmVjdGx5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJCQlPYmplY3RbXSBvYmpzID0gZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAob2Jqc1tpXSA9PSBub2RlKSB7Ci0JCQkJCQkJYWJzdHJhY3RUcmVlVmlld2VyLmluc2VydChwYXJlbnQsIG5vZGUsIGkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIElmIHRoZSBwYXJlbnQgbm9kZSBpcyBub3QgYSBEVERGaWxlLCBqdXN0IHJlZnJlc2ggdGhlCi0JCQkJLy8gcGFyZW50IGZvciBub3cKLQkJCQllbHNlIGlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlmVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoZlZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJYWJzdHJhY3RUcmVlVmlld2VyLnJlZnJlc2gocGFyZW50LCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJCS8vIFlvdSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBibG9jaywgaWYgeW91IGRvLCBqdXN0IHJlZnJlc2gKLQkJCQkvLyB0aGUgd2hvbGUgdHJlZQotCQkJCWVsc2UgewotCQkJCQlmVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoZlZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJYWJzdHJhY3RUcmVlVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQotCQkJSXRlcmF0b3IgaXRlciA9IGV2ZW50LmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCUxpc3QgbmV3U2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChvbGRTZWxlY3RlZE5vZGUgPT0gbnVsbCB8fCBub2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpICE9IG9sZFNlbGVjdGVkTm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSB8fCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgIT0gb2xkU2VsZWN0ZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgfHwgbm9kZS5nZXRFbmRPZmZzZXQoKSAhPSBvbGRTZWxlY3RlZE5vZGUuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJLy8gYWRkIHRvIHNlbGVjdGlvbgotCQkJCQluZXdTZWxlY3Rpb24uYWRkKG5vZGUpOwotCQkJCQlleHBhbmRUb05vZGUobm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ld1NlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZXNSZW1vdmVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpIHsKLQkJCUFic3RyYWN0VHJlZVZpZXdlciBhYnN0cmFjdFRyZWVWaWV3ZXIgPSAoQWJzdHJhY3RUcmVlVmlld2VyKSBmVmlld2VyOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXZlbnQuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlhYnN0cmFjdFRyZWVWaWV3ZXIucmVtb3ZlKGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzaG93TG9naWNhbE9yZGVyLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHNob3dMb2dpY2FsT3JkZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvd0xvZ2ljYWxPcmRlcihib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMuc2hvd0xvZ2ljYWxPcmRlciA9IHZhbHVlOwotCQlpZiAoIXZhbHVlKSB7Ci0JCQkvLyBpZiBub3QgdXNpbmcgbG9naWNhbCBvcmRlciwgbG9zZSB0aGUgY2FjaGVkIGxpc3RzCi0JCQlsb2dpY2FsTm9kZUxpc3RzID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9PcmRlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL09yZGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyN2JjNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL09yZGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbjsKLQotY2xhc3MgT3JkZXJBY3Rpb24gZXh0ZW5kcyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbiB7Ci0JcHJpdmF0ZSBEVERUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXB1YmxpYyBPcmRlckFjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgRFREVHJlZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKLQkJc3VwZXIoRFREVUlNZXNzYWdlcy5fVUlfQlVUVE9OX0dST1VQX0lURU1TX0xPR0lDQUxMWSwgc3RvcmUsIHByZWZlcmVuY2VLZXksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfT1JHQU5JWkVfRFREX0xPR0lDQUxMWSkpOwotCQl0cmVlVmlld2VyID0gdmlld2VyOwotCQljb250ZW50UHJvdmlkZXIgPSBwcm92aWRlcjsKLQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLQkJY29udGVudFByb3ZpZGVyLnNldFNob3dMb2dpY2FsT3JkZXIoaXNDaGVja2VkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0JCXNldENoZWNrZWQoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihnZXRQcmVmZXJlbmNlS2V5KCkpKTsKLQkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWNvbnRlbnRQcm92aWRlci5zZXRTaG93TG9naWNhbE9yZGVyKGlzQ2hlY2tlZCgpKTsKLQotCQkvLyB0cmVlVmlld2VyLnNldElucHV0KHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSk7Ci0JCXRyZWVWaWV3ZXIucmVmcmVzaCh0cmVlVmlld2VyLmdldElucHV0KCkpOwotCi0JCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRFbGVtZW50cyhleHBhbmRlZEVsZW1lbnRzKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9Tb3J0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzczZjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9Tb3J0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbjsKLQotY2xhc3MgU29ydEFjdGlvbiBleHRlbmRzIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uIHsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQlwcml2YXRlIFZpZXdlckNvbXBhcmF0b3IgZkNvbXBhcmF0b3I7Ci0KLQlwdWJsaWMgU29ydEFjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKLQkJc3VwZXIoRFREVUlNZXNzYWdlcy5fVUlfQlVUVE9OX1NPUlRfSVRFTVMsIHN0b3JlLCBwcmVmZXJlbmNlS2V5LCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1NPUlQpKTsKLQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLQkJZkNvbXBhcmF0b3IgPSBuZXcgRFREQ29udGVudE91dGxpbmVDb21wYXJhdG9yKCk7Ci0JCXRyZWVWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWlmIChpc0NoZWNrZWQoKSkgewotCQkJdHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKGZDb21wYXJhdG9yKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlI3VwZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOwotCQlpZiAoaXNDaGVja2VkKCkpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihmQ29tcGFyYXRvcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0cmVlVmlld2VyLnNldENvbXBhcmF0b3IobnVsbCk7Ci0JCX0KLQkJdHJlZVZpZXdlci5zZXRJbnB1dCh0cmVlVmlld2VyLmdldElucHV0KCkpOwotCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkRWxlbWVudHMoZXhwYW5kZWRFbGVtZW50cyk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvdGVtcGxhdGVzL2R0ZGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvdGVtcGxhdGVzL2R0ZGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NjgyYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3RlbXBsYXRlcy9kdGRkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgU1RBUiBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgRGF2aWQgQ2FydmVyLCBTVEFSIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLCBidWcgMTYyMzIxCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRlbXBsYXRlcy54bWxkZWNsYXJhdGlvbi5uYW1lPXhtbCBkZWNsYXJhdGlvbgotVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLmRlc2M9eG1sIGRlY2xhcmF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvdGVtcGxhdGVzL2R0ZGRlZmF1bHQtdGVtcGxhdGVzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS90ZW1wbGF0ZXMvZHRkZGVmYXVsdC10ZW1wbGF0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmM2NDIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS90ZW1wbGF0ZXMvZHRkZGVmYXVsdC10ZW1wbGF0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGluaXRpYWwgY29udHJpYnV0aW9uLCBidWcgMTYyMzIxCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLTx0ZW1wbGF0ZXM+Ci0gIDx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRlbXBsYXRlcy54bWxkZWNsYXJhdGlvbiIgY29udGV4dD0iZHRkX25ldyIgZW5hYmxlZD0idHJ1ZSI+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iPyZndDs8L3RlbXBsYXRlPgotPC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTY1ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjNTA3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWc9dHJ1ZQotb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvdHJhY2VmaWx0ZXI9Ci1vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc2luZGV4bWFuYWdlcj1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanN0cmFuc2xhdGlvbj1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanN0cmFuc2xhdGlvbnN0b2Rpc2s9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzc2VhcmNoPWZhbHNlCi0KLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3RhZ2xpYi9yZXNvbHZlPWZhbHNlCi0KLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzamF2YW1hcHBpbmc9ZmFsc2UKLQotb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanN2YWxpZGF0b3I9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjYjg3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTA3MjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotI1dlZCBPY3QgMjQgMTk6NDk6NDUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWQwOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotI1dlZCBPY3QgMjQgMTk6NDE6MzEgRURUIDIwMDcKLWNsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPWZhbHNlCi1jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLWNsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9ZmFsc2UKLWNsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD10cnVlCi1jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLWNsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9ZmFsc2UKLWNsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLWNsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLWNsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLWNsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLWNsZWFudXAudXNlX2Jsb2Nrcz10cnVlCi1jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLWNsZWFudXBfcHJvZmlsZT1fU1NFIFRlYW0gU3R5bGVzCi1jbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQotb3JnLmVjbGlwc2UuamR0LnVpLmdldHRlcnNldHRlci51c2UuaXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmtleXdvcmR0aGlzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQudWkub3ZlcnJpZGVhbm5vdGF0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhZmQ0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC40MDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Kc0NvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0OwotICB1c2VzOj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUsCi0gICBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLAotICAgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIiwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2gsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUudGV4dAotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnV0aWw7IHZlcnNpb249IjMuOCIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNDAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMTAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjQuMCwyLjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenk7ZXhjbHVkZTo9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0MjY5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbAotICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjZhYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUudGFnbGliIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iSUphclJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPCEtLSA8dHlwZSBuYW1lPSJJVGFnRGlyUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPiAtLT4KLQkJPCEtLSA8dHlwZSBuYW1lPSJJVGFnbGliSW5kZXhMaXN0ZW5lciIgaW1wbGVtZW50PSJ0cnVlIiAvPiAtLT4KLQkJPHR5cGUgbmFtZT0iSVRhZ2xpYkRlc2NyaXB0b3IiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0JCTx0eXBlIG5hbWU9IklUYWdsaWJSZWNvcmQiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0JCTwhLS0gPHR5cGUgbmFtZT0iSVRhZ2xpYlJlY29yZEV2ZW50IiBpbXBsZW1lbnQ9ImZhbHNlIiAvPiAtLT4KLQkJPHR5cGUgbmFtZT0iSVRMRFJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPHR5cGUgbmFtZT0iSVVSTFJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPHR5cGUgbmFtZT0iVGFnbGliSW5kZXgiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotCTwvcGFja2FnZT4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AiIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbmZvcG9wIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL2pzdC9jb21wb25lbnRzL2pzcC9vdmVydmlldy5odG1sIiAvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MjdiMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT0gSmF2YVNjcmlwdCBTdXBwb3J0Ci1wcm92aWRlck5hbWU9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1CdW5kbGUtTmFtZS4wID0gSlNEVCBXZWIgU3VwcG9ydCBDb3JlIAotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLWV4dGVuc2lvbi5uYW1lLjAgPSBKYXZhU2NyaXB0IEVtYmVkZGVkCi1leHRlbnNpb24ubmFtZS4xID0gRW1iZWRkZWQgSmF2YVNjcmlwdCBCdWlsZGVyCi1leHRlbnNpb24tcG9pbnQubmFtZS4wID0gSmF2YVNjcmlwdCBQcmUgUHJvY2Vzc2luZwotamF2YXNjcmlwdC52YWxpZGF0b3I9IENsaWVudC1zaWRlIEphdmFTY3JpcHQKLWZhY2V0LmxhYmVsPUphdmFTY3JpcHQKLWZhY2V0LmRlc2NyaXB0aW9uPUVuYWJsZXMgSmF2YVNjcmlwdCBkZXZlbG9wbWVudCB1c2luZyBtdWx0aXBsZSBzb3VyY2UgZmlsZXMgaW4gYSBjb25maWd1cmFibGUgSW5jbHVkZSBQYXRoLgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MzkzZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iamF2YXNjcmlwdFByZVByb2Nlc3NvciIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5uYW1lLjAiIHNjaGVtYT0ic2NoZW1hL2phdmFzY3JpcHRQcmVQcm9jZXNzb3IuZXhzZCIvPgotICAgCi0gICA8IS0tIEZ1bGwgYmxvd24gSlNEVCBGQUNFVCAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0gICAJCTxwcm9qZWN0LWZhY2V0IGlkPSJ3c3QuanNkdC53ZWIiPgotCQkJPGxhYmVsPiVmYWNldC5sYWJlbDwvbGFiZWw+Ci0JICAJIAk8ZGVzY3JpcHRpb24+JWZhY2V0LmRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkgIAkgIAk8ZGVmYXVsdC12ZXJzaW9uIHZlcnNpb249IjEuMCIvPgotCQk8L3Byb2plY3QtZmFjZXQ+Ci0JCi0JCTxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9IndzdC5qc2R0LndlYiIgdmVyc2lvbj0iMS4wIiAvPgotCQotCQk8YWN0aW9uIGZhY2V0PSJ3c3QuanNkdC53ZWIiIHR5cGU9Imluc3RhbGwiIGlkPSJ3c3QuanNkdC53ZWIuaW5zdGFsbCIgdmVyc2lvbj0iMS4wIj4KLQkgICAJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc05hdHVyZUluc3RhbGxlciIvPgotCQk8L2FjdGlvbj4KLQkKLQkJPGFjdGlvbiBmYWNldD0id3N0LmpzZHQud2ViIiB0eXBlPSJ1bmluc3RhbGwiIGlkPSJ3c3QuanNkdC53ZWIudW5pbnN0YWxsIiB2ZXJzaW9uPSIxLjAiPgotCQkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzTmF0dXJlVW5pbnN0YWxsZXIiLz4KLQkJPC9hY3Rpb24+Ci0JCi0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotCSAgPHN1cHBvcnRlZD4KLQkgICAgPGZhY2V0IGlkPSJ3c3QuanNkdC53ZWIiLz4KLQkgICAgPHJ1bnRpbWUtY29tcG9uZW50IGFueT0idHJ1ZSIvPgotCSAgPC9zdXBwb3J0ZWQ+Ci0KLQk8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdFByZVByb2Nlc3NvciI+Ci0gICAJCTxqYXZhc2NyaXB0UHJlUHJvY2Vzc29yCi0gICAJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uIgotICAgCQkJcHJpb3JpdHk9IjEiIC8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSBJbnN0YWxsIEhhbmRsZXIgZm9yIHdlYiBKU0RULi4gUGlnZ3liYWNrcyBvbiB3c3Qud2ViL2pzdC53ZWIgZmFjZXQtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpc3RlbmVycyI+Ci0gICAgICA8bGlzdGVuZXIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QuRmFjZXRlZFByb2plY3RMaXN0ZW5lciIgZXZlbnRUeXBlcz0iUE9TVF9JTlNUQUxMIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICA8IS0tCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAgCi0JCTxldmVudC1oYW5kbGVyIGZhY2V0PSJ3c3Qud2ViIiB0eXBlPSJQT1NUX0lOU1RBTEwiIHZlcnNpb249IlsxLjAiPgotCSAgIAkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzTmF0dXJlSW5zdGFsbGVyIi8+Ci0JCTwvZXZlbnQtaGFuZGxlcj4KLQkKLQkJPGV2ZW50LWhhbmRsZXIgZmFjZXQ9IndzdC53ZWIiIHR5cGU9IlBPU1RfVU5JTlNUQUxMIiB2ZXJzaW9uPSJbMS4wIj4KLQkJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc05hdHVyZVVuaW5zdGFsbGVyIi8+Ci0JCTwvZXZlbnQtaGFuZGxlcj4KLQotCTwvZXh0ZW5zaW9uPgotCS0tPgotCTwhLS0gcmVtb3ZlZCBkdWUgdG8gSlVuaXQgZmFpbHVyZXMgZHVyaW5nIGluaXRpYWwgV1RQIGJ1aWxkCi0JICAgPGV4dGVuc2lvbiBpZD0iZW1iZWRlZC5qc05hdHVyZSIgbmFtZT0iJWV4dGVuc2lvbi5uYW1lLjAiIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5uYXR1cmVzIj4gCi0JCSAgIDxydW50aW1lPiAgICAgICAgICAKLQkJICAgCTxydW4gY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QuSnNXZWJOYXR1cmUiLz4gICAgICAgCi0JCSAgIDwvcnVudGltZT4gICAgICAgCi0JIAkgICA8YnVpbGRlciBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuZW1iZWRlZC5qYXZhc2NyaXB0Ii8+ICAgIAotCSAgIDwvZXh0ZW5zaW9uPiAKLQktLT4gICAKLQotCSAgIAk8IS0tIAotCSAgIAlOb3QgdXNpbmcgdGhpcyBhdCB0aGUgbW9tZW50LCBidXQgZXZlcnl0aGluZ3MgaW4gcGxhY2UgaWYgd2UgbmVlZCBpbiB0aGUgZnV0dXJlLiAKLQkgICAgLS0+ICAKLQkgICAKLQkgICA8ZXh0ZW5zaW9uIGlkPSJlbWJlZGVkLmphdmFzY3JpcHQiIG5hbWU9IiVleHRlbnNpb24ubmFtZS4xIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuYnVpbGRlcnMiPiAgICAgICAKLQkJICAgCTxidWlsZGVyIGhhc05hdHVyZT0idHJ1ZSIgY2FsbE9uRW1wdHlEZWx0YT0idHJ1ZSI+CQkgICAJICAgICAgCi0JCSAgIAk8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5JbmNyZW1lbnRhbEJ1aWxkZXIiLz4gICAgICAKLQkJICAgPC9idWlsZGVyPiAgICAKLQkgICA8L2V4dGVuc2lvbj4KLQotCQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gSlMgYmF0Y2ggdmFsaWRhdGlvbiBpbiBXZWIgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJaWQ9IkpzQmF0Y2hWYWxpZGF0b3IiCi0JCW5hbWU9IiVqYXZhc2NyaXB0LnZhbGlkYXRvciIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIGJ1aWxkPSJmYWxzZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpzVmFsaWRhdG9yIgotICAgICAgICAgICAgbWFudWFsPSJmYWxzZSIKLSAgICAgICAgICAgIHNvdXJjZWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuanNzb3VyY2V2YWxpZGF0b3IiCi0gICAgICAgICAgICB2ZXJzaW9uPSIxIgotICAgICAgICAgICAgbWFya2VySWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUucHJvYmxlbSI+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLQkJCQk8cHJvamVjdE5hdHVyZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5qc05hdHVyZSIgLz4KLQkJCTwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLQkJCQk8ZmlsZWV4dCBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIgZXh0PSJodG1sIi8+Ci0JCQkJPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0ieGh0bWwiLz4KLQkJCQk8ZmlsZWV4dCBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIgZXh0PSJodG0iLz4KLQkJCQk8ZmlsZWV4dCBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIgZXh0PSJodHBsIi8+Ci0JCQkJPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0ianNwIi8+Ci0JCQkJPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0ianNmIi8+Ci0JCQkJPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0ianN2Ii8+Ci0JCQkJPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0ianRwbCIvPgotCQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIi8+Ci0JCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIi8+Ci0JCQk8L3J1bGVzPgotICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICAgPGdyb3VwIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuc3RydWN0dXJlZE1vZGVsR3JvdXAiLz4KLSAgICAgIDwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplciI+Ci0JICAgICAgPEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplcgotCSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LldlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIiCi0JICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmxhdW5jaGluZy5XZWJQcm9qZWN0Ij4KLQkgICAgICA8L0pzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplcj4KLSAgCSA8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uCi0JCWlkPSJ3ZWJTb3VyY2VQYXRoUHJvdmlkZXIiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNvdXJjZVBhdGhQcm92aWRlciI+Ci0JCTxwcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Nb2R1bGVTb3VyY2VQYXRoUHJvdmlkZXIiLz4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zY2hlbWEvamF2YXNjcmlwdFByZVByb2Nlc3Nvci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zY2hlbWEvamF2YXNjcmlwdFByZVByb2Nlc3Nvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmY2ZjMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc2NoZW1hL2phdmFzY3JpcHRQcmVQcm9jZXNzb3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZSIgaWQ9ImphdmFzY3JpcHRQcmVQcm9jZXNzb3IiIG5hbWU9IkphdmFTY3JpcHQgUHJlIFByb2Nlc3NpbmciLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iamF2YXNjcmlwdFByZVByb2Nlc3NvciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJqYXZhc2NyaXB0UHJlUHJvY2Vzc29yIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbiIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByaW9yaXR5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGxvYWRpbmcgcHJpb3JpdHkuIHRoZSBoaWdoZXN0IG51bWJlciB3aW5zLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSW5jcmVtZW50YWxCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9JbmNyZW1lbnRhbEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzYmRiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9JbmNyZW1lbnRhbEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSW5jcmVtZW50YWxCdWlsZGVyIGV4dGVuZHMgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlciB7Ci0JcHVibGljIEluY3JlbWVudGFsQnVpbGRlcigpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmltcGxlbWVudGVkIG1ldGhvZDpJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyKCkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIjYnVpbGQoaW50LAotCSAqICAgICAgamF2YS51dGlsLk1hcCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JCi0JcHJvdGVjdGVkIElQcm9qZWN0W10gYnVpbGQoaW50IGtpbmQsIE1hcCBhcmdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuaW1wbGVtZW50ZWQgbWV0aG9kOkluY3JlbWVudGFsQnVpbGRlci5idWlsZCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM5MThjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSlNQSW5kZXhNYW5hZ2VyXzA9VXBkYXRpbmcgSmF2YVNjcmlwdCBJbmRleAotSlNQSW5kZXhNYW5hZ2VyXzI9SmF2YVNjcmlwdCBJbmRleGVyIGluZGV4aW5nIHswfSBmaWxlcwotSlNQX1NlYXJjaD1KYXZhU2NyaXB0IFNlYXJjaCAtIAotSlNQRG9jdW1lbnRMb2FkZXJfMT1Qcm9ncmFtIEVycm9yOiBzdHJ1Y3R1cmVkIG1vZGVsIGhhZCBubyBzdHJ1Y3R1cmVkRG9jdW1lbnQKLUpTUEVMX1N5bnRheD1FTCBTeW50YXggRXJyb3IgCi1KU1BFTF9Ub2tlbj1VbmFibGUgdG8gYW5hbHlzZSBFTCBleHByZXNzaW9uIGR1ZSB0byBsZXhpY2FsIGFuYWx5c2lzIGVycm9yCi1NRVNTQUdFX0pTUF9WQUxJREFUSU5HX01FU1NBR0VfVUlfPUphdmFTY3JpcHQgVmFsaWRhdG9yIHZhbGlkYXRpbmcgezB9Ci1KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nPVVwZGF0aW5nIEphdmFTY3JpcHQgRnJhZ21lbnQgQ29udGVudCBTZXR0aW5ncwotSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZz1Qcm9ibGVtIHNhdmluZyBKYXZhU2NyaXB0IEZyYWdtZW50IENvbnRlbnQgU2V0dGluZ3MgZm9yIHswfQotSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzA9ezB9IGlzIGEgcmVzZXJ2ZWQgcHJlZml4LiAgVHJ5IGFub3RoZXIKLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl8xPUNhbm5vdCBmaW5kIHRoZSB0YWcgbGlicmFyeSBkZXNjcmlwdG9yIGZvciB7MH0KLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl8yPVRoZSBwcmVmaXggezB9IGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UKLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl8zPUEgezB9IHZhbHVlIGlzIHJlcXVpcmVkIGluIHRoaXMgZGlyZWN0aXZlCi1KU1BCYXRjaFZhbGlkYXRvcl8wPUdhdGhlcmluZyBmaWxlcyBpbiB7MH0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0pzQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Kc0NvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODdmYzFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0pzQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpblJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BfU2VhcmNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEJhdGNoVmFsaWRhdG9yXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRG9jdW1lbnRMb2FkZXJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BFTF9TeW50YXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRUxfVG9rZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEluZGV4TWFuYWdlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEluZGV4TWFuYWdlcl8yOwotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX0pTUF9WQUxJREFUSU5HX01FU1NBR0VfVUlfOwotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoSnNDb3JlTWVzc2FnZXMuQlVORExFX05BTUUsIEpzQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKc0NvcmVNZXNzYWdlcygpIHt9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Kc0NvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0pzQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjY4MDFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0pzQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNJbmRleE1hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBKc0NvcmVQbHVnaW4gcGx1Z2luOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSB3aWxsIGJlIHJlbW92ZWQuIEN1cnJlbnRseSB1c2VkIHRvIGdldCAibW9kZWwgcHJlZmVyZW5jZXMiLAotCSAqICAgICAgICAgICAgIGJ1dCB0aGVyZSBhcmUgb3RoZXIsIGJldHRlciB3YXlzLgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBKc0NvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIEpzQ29yZVBsdWdpbi5wbHVnaW47Ci0JfQotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgSnNDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlKc0NvcmVQbHVnaW4ucGx1Z2luID0gdGhpczsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkvLyBKU1BJbmRleE1hbmFnZXIgZGVwZW5kcyBvbiBUYWdsaWJDb250cm9sbGVyLCBzbyBUYWdsaWJDb250cm9sbGVyCi0JCS8vIHNob3VsZCBiZSBzdGFydGVkIGZpcnN0Ci0JCS8vIGxpc3RlbiBmb3IgY2xhc3NwYXRoIGNoYW5nZXMKLQkJSnNJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pbml0aWFsaXplKCk7Ci0JCS8vIGxpc3RlbiBmb3IgcmVzb3VyY2UgY2hhbmdlcyB0byB1cGRhdGUgY29udGVudCBwcm9wZXJ0aWVzIGtleXMKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBzdG9wIGxpc3Rlbm5pbmcgZm9yIHJlc291cmNlIGNoYW5nZXMgdG8gdXBkYXRlIGNvbnRlbnQgcHJvcGVydGllcwotCQkvLyBrZXlzCi0JCS8vIHN0b3AgYW55IGluZGV4aW5nCi0JCUpzSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2h1dGRvd24oKTsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFjNDE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBMb2dnZXIuRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBMb2dnZXIuSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIExvZ2dlci5PSzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBMb2dnZXIuV0FSTklORzsKLQkKLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBMb2dnZXIuT0tfREVCVUcgfHwgbGV2ZWwgPT0gTG9nZ2VyLklORk9fREVCVUcgfHwgbGV2ZWwgPT0gTG9nZ2VyLldBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gTG9nZ2VyLkVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIUxvZ2dlci5pc0RlYnVnZ2luZygpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRzoKLQkJCWNhc2UgSU5GTzoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHOgotCQkJY2FzZSBXQVJOSU5HOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHOgotCQkJY2FzZSBFUlJPUjoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgTG9nZ2VyLlBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoTG9nZ2VyLlBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoTG9nZ2VyLmlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIExvZ2dlci5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKExvZ2dlci5QTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFMb2dnZXIuaXNEZWJ1Z2dpbmcoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKExvZ2dlci5QTFVHSU5fSUQgKyBMb2dnZXIuVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlMb2dnZXIuX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX2xvZyhMb2dnZXIuRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX2xvZyhMb2dnZXIuRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCUxvZ2dlci5fdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCUxvZ2dlci5fdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0lXZWJEb2N1bWVudENoYW5nZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvSVdlYkRvY3VtZW50Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0ZWRkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvSVdlYkRvY3VtZW50Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYkRvY3VtZW50Q2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBJV2ViUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPUklORyA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSVFlfRE9DID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJUWV9NT0RFTCA9IDI7Ci0JCi0JcHVibGljIGludCBnZXRJbnRyZXN0TGV2ZWxBdE9mZnNldChpbnQgZG9jdW1lbnRPZmZzZXQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0lXZWJSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0lXZWJSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDg0ZThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9JV2ViUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlJlc291cmNlQ2hhbmdlZExpc3RlbmVyIHsKLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OTQzOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjg0M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1dlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbExpZmVjeWNsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElEb2N1bWVudExpc3RlbmVyLCBJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciB7Ci0JLyoKLQkgKiBDaGVjayB0aGUgbGV2ZWwgb2YgZGlydHkgcmVnaW9ucyB3aGVuIHNpZ25hbGluZyBmb3IgZG9jdW1lbnQgZXZlbnRzLgotCSAqIAotCSAqIHNvbWV0aW1lcyB0aGUgU1NFIGVkaXRvciBkb2Vzbid0IHJlLXZhbGlkYXRlIHJlZ2lvbnMgd2hlbiB0ZXh0IGlzCi0JICogaW5zZXJ0ZWQsIHNvIHNldHRpbmcgdGhpcyB0byBmYWxzZSBjYXVzZXMgZXZlcnkgZG9jdW1lbnQgY2hhbmdlIGV2ZW50IHRvCi0JICogdHJpZ2dlciBhIHJldmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBzZXR0aW5nIHRvIHRydWUgbWF5IHNwZWVkIHRoaW5ncyB1cC4KLQkgKiAKLQkgKi8KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0hFQ0tfSU5UUkVTVF9MRVZFTCA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSUdOQUxfTU9ERUwgPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlciBnZXRJbnN0YW5jZShJU3RydWN0dXJlZE1vZGVsIHhtbE1vZGVsLCBJV2ViUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIpIHsKLQkJV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5pbnN0YW5jZXMpIHsKLQkJCUVudW1lcmF0aW9uIHZhbHVlcyA9IFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5pbnN0YW5jZXMuZWxlbWVudHMoKTsKLQkJCXdoaWxlICh2YWx1ZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlPYmplY3QgbW9kZWwgPSB2YWx1ZXMubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAobW9kZWwgPT0geG1sTW9kZWwpIHsKLQkJCQkJaGFuZGxlciA9IChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIpIFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5pbnN0YW5jZXMuZ2V0KG1vZGVsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJaGFuZGxlciA9IG5ldyBXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIoKTsKLQkJCQlXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzLnB1dChoYW5kbGVyLCB4bWxNb2RlbCk7Ci0JCQl9Ci0JCX0KLQkJaGFuZGxlci5pbml0aWFsaXplKCk7Ci0JCWhhbmRsZXIuZmNoYW5nZUxpc3RlbmVyLmFkZChjaGFuZ2VMaXN0ZW5lcik7Ci0JCXJldHVybiBoYW5kbGVyOwotCX0KLQlwcml2YXRlIGNsYXNzIE1vZGVsSXJyaXRhbnRUaHJlYWQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXNpZ25hbEFsbERpcnR5TW9kZWwoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2lnbmFsQWxsRGlydHlNb2RlbCgpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmNoYW5nZUxpc3RlbmVyLnNpemUoKTsgaSsrKSB7Ci0JCQkJKChJV2ViUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpIGZjaGFuZ2VMaXN0ZW5lci5nZXQoaSkpLnJlc291cmNlQ2hhbmdlZCgpOwotCQkJfQotCQkJaWYgKCFXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuU0lHTkFMX01PREVMKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJSVN0cnVjdHVyZWRNb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCQlPYmplY3QgbW9kZWxSZWYgPSBnZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsUmVmID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0cnkgewotLy8gZm9yKGludCBpID0wO2k8ZmNoYW5nZUxpc3RlbmVyLnNpemUoKTtpKyspIHsKLS8vICgoSVdlYlJlc291cmNlQ2hhbmdlZExpc3RlbmVyKWZjaGFuZ2VMaXN0ZW5lci5nZXQoaSkpLnJlc291cmNlQ2hhbmdlZCgpOwotLy8gfQotCQkJCXhtbE1vZGVsID0gKElTdHJ1Y3R1cmVkTW9kZWwpIG1vZGVsUmVmOy8vKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdCgoKElTdHJ1Y3R1cmVkTW9kZWwpIG1vZGVsUmVmKS5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSB4bWxNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXhtbE1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCQkvLyB4bWxNb2RlbC5zZXRSZWluaXRpYWxpemVOZWVkZWQodHJ1ZSk7Ci0JCQkJCS8vIChkb2MpLnJlcGxhY2UoMCwgZG9jLmdldExlbmd0aCgpLGRvYy5nZXQoKSk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQl4bWxNb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmdldFN0cmluZygiV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLjAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLS8vCQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZmNoYW5nZUxpc3RlbmVyID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTW9kZWxJcnJpdGFudFRocmVhZCBpcnJpdGF0b3I7Ci0JCi0JcHJpdmF0ZSBXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIoKSB7fQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7fQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0vLwkJaWYgKFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5DSEVDS19JTlRSRVNUX0xFVkVMKSB7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmNoYW5nZUxpc3RlbmVyLnNpemUoKTsgaSsrKSB7Ci0vLwkJCQlPYmplY3QgbyA9IGZjaGFuZ2VMaXN0ZW5lci5nZXQoaSk7Ci0vLwkJCQlpZiAobyBpbnN0YW5jZW9mIElXZWJEb2N1bWVudENoYW5nZUxpc3RlbmVyKSB7Ci0vLwkJCQkJaW50IGludHJlc3QgPSAoKElXZWJEb2N1bWVudENoYW5nZUxpc3RlbmVyKSBvKS5nZXRJbnRyZXN0TGV2ZWxBdE9mZnNldChldmVudC5mT2Zmc2V0KTsKLS8vCQkJCQlzd2l0Y2ggKGludHJlc3QpIHsKLS8vCQkJCQkJY2FzZSBJV2ViRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lci5ESVJUWV9NT0RFTDoKLS8vCQkJCQkJCWlycml0YXRvci5zaWduYWxBbGxEaXJ0eU1vZGVsKCk7Ci0vLwkJCQkJCQlyZXR1cm47Ci0vLwkJCQkJCWNhc2UgSVdlYkRvY3VtZW50Q2hhbmdlTGlzdGVuZXIuRElSVFlfRE9DOgotLy8JCQkJCQkJKChJV2ViRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lcikgbykucmVzb3VyY2VDaGFuZ2VkKCk7Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCX0KLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9IGVsc2UgewotCQkJaXJyaXRhdG9yLnNpZ25hbEFsbERpcnR5TW9kZWwoKTsKLQkJLy99Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gKG8gaW5zdGFuY2VvZiBXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIgJiYgKChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIpIG8pLmZjaGFuZ2VMaXN0ZW5lciA9PSB0aGlzLmZjaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGZpbmFsaXplKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5pbnN0YW5jZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU9iamVjdCBvID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzKSB7Ci0JCQlvID0gV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcy5nZXQodGhpcyk7Ci0JCQlXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzLnJlbW92ZSh0aGlzKTsKLQkJfQotCQlpZiAobyAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIGZYTUxNb2RlbCA9IChJU3RydWN0dXJlZE1vZGVsKSBvOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBmSnNwRG9jdW1lbnQgPSBmWE1MTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoZkpzcERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlmSnNwRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCWlmIChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSVN0cnVjdHVyZWRNb2RlbCkgV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcy5nZXQodGhpcyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlJU3RydWN0dXJlZE1vZGVsIHhtbE1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCQl4bWxNb2RlbC5hZGRNb2RlbExpZmVjeWNsZUxpc3RlbmVyKHRoaXMpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IGZKc3BEb2N1bWVudCA9IHhtbE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoZkpzcERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWZKc3BEb2N1bWVudC5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWlycml0YXRvciA9IG5ldyBNb2RlbElycml0YW50VGhyZWFkKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByb2Nlc3NQb3N0TW9kZWxFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChpcnJpdGF0b3IgIT0gbnVsbCkgewotCQkJaXJyaXRhdG9yLnNpZ25hbEFsbERpcnR5TW9kZWwoKTsKLQkJfQotCQlpZiAoV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1JFTEVBU0VEKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5pbnN0YW5jZXMpIHsKLQkJCQlXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzLnJlbW92ZSh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9jZXNzUHJlTW9kZWxFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7fQotCQotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5leGVjdXRlKGlycml0YXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2YmY1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1XZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuMD1FcnJvciB3aGVuIHVwZGF0aW5nIHRoZSBtb2RlbC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvQ29udmVydEpvYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Db252ZXJ0Sm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjQwMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Db252ZXJ0Sm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Mb2dnZXI7DQotDQotLyoqDQotICogSW5zdGFsbHMgdGhlIEpTRFQgZmFjZXQsIGlmIGFza2VkLCBhbmQgc2V0dGluZyBpdCBhcyBhICJmaXhlZCIgZmFjZXQuDQotICogDQotICovDQotY2xhc3MgQ29udmVydEpvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiB7DQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSlNEVF9GQUNFVCA9ICJ3c3QuanNkdC53ZWIiOw0KLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0Ow0KLQlwcml2YXRlIGJvb2xlYW4gZkluc3RhbGwgPSB0cnVlOw0KLQlwcml2YXRlIGJvb2xlYW4gZlVzZUV4cGxpY2l0V29ya2luZ0NvcHkgPSBmYWxzZTsNCi0NCi0JQ29udmVydEpvYihJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGluc3RhbGwsIGJvb2xlYW4gdXNlRXhwbGljaXRXb3JraW5nQ29weSkgew0KLQkJc3VwZXIoTWVzc2FnZXMuY29udmVydGVyX0NvbmZpZ3VyaW5nRm9ySmF2YVNjcmlwdCk7DQotCQlmUHJvamVjdCA9IHByb2plY3Q7DQotCQlmSW5zdGFsbCA9IGluc3RhbGw7DQotCQlmVXNlRXhwbGljaXRXb3JraW5nQ29weSA9IHVzZUV4cGxpY2l0V29ya2luZ0NvcHk7DQotCX0NCi0NCi0JcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0cnkgew0KLQkJCUlQcm9qZWN0RmFjZXQgcHJvamVjdEZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEpTRFRfRkFDRVQpOw0KLQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShmUHJvamVjdCk7DQotDQotCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ICE9IG51bGwgJiYgZlByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsNCi0JCQkJaWYgKGZJbnN0YWxsKSB7DQotCQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBsYXRlc3RWZXJzaW9uID0gcHJvamVjdEZhY2V0LmdldExhdGVzdFZlcnNpb24oKTsNCi0JCQkJCWZhY2V0ZWRQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQobGF0ZXN0VmVyc2lvbiwgbnVsbCwgbW9uaXRvcik7DQotCQkJCX0NCi0NCi0NCi0JCQkJaWYgKGZVc2VFeHBsaWNpdFdvcmtpbmdDb3B5KSB7DQotCQkJCQlJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBjb3B5ID0gZmFjZXRlZFByb2plY3QuY3JlYXRlV29ya2luZ0NvcHkoKTsNCi0JCQkJCVNldCBmaXhlZCA9IG5ldyBIYXNoU2V0KGZhY2V0ZWRQcm9qZWN0LmdldEZpeGVkUHJvamVjdEZhY2V0cygpKTsNCi0JCQkJCWZpeGVkLmFkZChwcm9qZWN0RmFjZXQpOw0KLQkJCQkJY29weS5zZXRGaXhlZFByb2plY3RGYWNldHMoZml4ZWQpOw0KLQkJCQkJY29weS5jb21taXRDaGFuZ2VzKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJU2V0IGZpeGVkID0gbmV3IEhhc2hTZXQoZmFjZXRlZFByb2plY3QuZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkpOw0KLQkJCQkJaWYgKCFmaXhlZC5jb250YWlucyhwcm9qZWN0RmFjZXQpKSB7DQotCQkJCQkJZml4ZWQuYWRkKHByb2plY3RGYWNldCk7DQotCQkJCQkJZmFjZXRlZFByb2plY3Quc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKGZpeGVkKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgew0KLQkJCS8vIHVua25vd24gZmFjZXQgSUQsIGJhZCBpbnN0YWxsYXRpb24gY29uZmlndXJhdGlvbj8NCi0JCX0NCi0JCWNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7DQotCQl9DQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JfQ0KLQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L0ZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvRmFjZXRlZFByb2plY3RMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWE5YWJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvRmFjZXRlZFByb2plY3RMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVByb2plY3RGYWNldEFjdGlvbkV2ZW50Ow0KLQ0KLXB1YmxpYyBjbGFzcyBGYWNldGVkUHJvamVjdExpc3RlbmVyIGltcGxlbWVudHMgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgew0KLQlmaW5hbCBzdGF0aWMgQ29sbGVjdGlvbiBJTlRFUkVTVElOR19GQUNFVFMgPSBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXXsid3N0LndlYiIsICJqc3Qud2ViIn0pOw0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlDQotCSAqIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcg0KLQkgKiAjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLg0KLQkgKiBJRmFjZXRlZFByb2plY3RFdmVudCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50KSB7DQotCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUE9TVF9JTlNUQUxMKSB7DQotCQkJSVByb2plY3RGYWNldEFjdGlvbkV2ZW50IGFjdGlvbkV2ZW50ID0gKElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCkgZXZlbnQ7DQotCQkJaWYgKElOVEVSRVNUSU5HX0ZBQ0VUUy5jb250YWlucyhhY3Rpb25FdmVudC5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpKSkgew0KLQkJCQluZXcgQ29udmVydEpvYihldmVudC5nZXRQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLCB0cnVlLCB0cnVlKS5zY2hlZHVsZSgxMDAwKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc05hdHVyZUluc3RhbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc05hdHVyZUluc3RhbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODc3MjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvSnNOYXR1cmVJbnN0YWxsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkpzQ29yZVBsdWdpbjsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzTmF0dXJlSW5zdGFsbGVyIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJbW9uaXRvci5iZWdpblRhc2soIkluc3RhbGxpbmcgRmFjZXQgZm9yIEphdmFTY3JpcHQgRGV2ZWxvcG1lbnQgVG9vbHMiICsgIi4iLCAxMDApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHJ5IHsKLQkJCWluc3RhbGxOYXR1cmUocHJvamVjdCwgbW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbnN0YWxsTmF0dXJlKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5nZXRTdHJpbmcoIkpzTmF0dXJlSW5zdGFsbGVyLjEiKSwgMTAwKTsgLy8kTk9OLU5MUy0xJAotCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuZ2V0U3RyaW5nKCJKc05hdHVyZUluc3RhbGxlci4yIikpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQltb25pdG9yLndvcmtlZCgyMCk7Ci0JCQlKc1dlYk5hdHVyZSBqc05hdHVyZSA9IG5ldyBKc1dlYk5hdHVyZShwcm9qZWN0LCBtb25pdG9yKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwKTsKLQkJCWpzTmF0dXJlLmNvbmZpZ3VyZSgpOwotCQkJbW9uaXRvci53b3JrZWQoNDApOwotCQkJCi0JCQluZXcgQ29udmVydEpvYihwcm9qZWN0LCBmYWxzZSwgdHJ1ZSkuc2NoZWR1bGUoMTAwMCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpzQ29yZVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIE1lc3NhZ2VzLmdldFN0cmluZygiSnNOYXR1cmVJbnN0YWxsZXIuMyIpLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvSnNOYXR1cmVVbmluc3RhbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc05hdHVyZVVuaW5zdGFsbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OWZjNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc05hdHVyZVVuaW5zdGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Kc0NvcmVQbHVnaW47Ci0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc05hdHVyZVVuaW5zdGFsbGVyIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJbW9uaXRvci5iZWdpblRhc2soIlVuaW5zdGFsbGluZyBGYWNldCBmb3IgSmF2YVNjcmlwdCBEZXZlbG9wbWVudCBUb29scyIgKyAiLiIsIDEwMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0cnkgewotCQkJdW5pbnN0YWxsTmF0dXJlKHByb2plY3QsIG1vbml0b3IpOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsTmF0dXJlKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5nZXRTdHJpbmcoIkpzTmF0dXJlVW5pbnN0YWxsZXIuMSIpLCAxMDApOyAvLyROT04tTkxTLTEkCi0JCS8vIGJ5IHVzaW5nIG5hdHVyZXMgd2UgY2FuIGxldmVyYWdlIHRoZSBwcmVjb25kaXRpb24gc3VwcG9ydAotCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuZ2V0U3RyaW5nKCJKc05hdHVyZVVuaW5zdGFsbGVyLjIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFKc1dlYk5hdHVyZS5oYXNOYXR1cmUocHJvamVjdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJSVByb2plY3ROYXR1cmUganNOYXR1cmUgPSBuZXcgSnNXZWJOYXR1cmUocHJvamVjdCwgbW9uaXRvcik7Ci0JCQltb25pdG9yLndvcmtlZCgyMCk7Ci0JCQltb25pdG9yLndvcmtlZCg1MCk7Ci0JCQlqc05hdHVyZS5kZWNvbmZpZ3VyZSgpOwotCQkJbW9uaXRvci53b3JrZWQoMjApOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgTWVzc2FnZXMuZ2V0U3RyaW5nKCJKc05hdHVyZVVuaW5zdGFsbGVyLjMiKSwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L0pzV2ViTmF0dXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L0pzV2ViTmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YzM0NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc1dlYk5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JQWNjZXNzUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklJbmNsdWRlUGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklJbmNsdWRlUGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5MaWJyYXJ5U3VwZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS51dGlsLkNvbnZlcnRVdGlsaXR5OwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzV2ViTmF0dXJlIGltcGxlbWVudHMgSVByb2plY3ROYXR1cmUgewotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVOQU1FX0NMQVNTUEFUSCA9ICIuY2xhc3NwYXRoIjsgLy8kTk9OLU5MUy0xJAotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRVUkVfSURTW10gPQotCS8vIHsib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuZW1iZWRlZC5qc05hdHVyZSIsSmF2YVNjcmlwdENvcmUuTkFUVVJFX0lEfTsKLQkvLyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVFVSRV9JRFNbXSA9IHsgSmF2YVNjcmlwdENvcmUuTkFUVVJFX0lEIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIFZJUlRVQUxfQlJPV1NFUl9DTEFTU1BBVEggPSBuZXcgUGF0aCgib3JnLmVjbGlwc2Uud3N0LmpzZHQubGF1bmNoaW5nLmJhc2VCcm93c2VyTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9DT05UQUlORVIgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQubGF1bmNoaW5nLldlYlByb2plY3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJSW5jbHVkZVBhdGhFbnRyeSBWSVJUVUFMX1NDT1BFX0VOVFJZID0gSmF2YVNjcmlwdENvcmUubmV3Q29udGFpbmVyRW50cnkobmV3IFBhdGgoVklSVFVBTF9DT05UQUlORVIpLCAgbmV3IElBY2Nlc3NSdWxlWzBdLCBuZXcgSUluY2x1ZGVQYXRoQXR0cmlidXRlW10ge0lJbmNsdWRlUGF0aEF0dHJpYnV0ZS5ISURFfSwgZmFsc2UpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUl9UWVBFX05BTUUgPSAiV2luZG93IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUl9UWVBFX0xJQlJBUlkgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQubGF1bmNoaW5nLmJhc2VCcm93c2VyTGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiBEZWZhdWx0IEpSRSBlbnRyeSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0pSRV9QQVRIID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRKc05hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYgKCFKc1dlYk5hdHVyZS5oYXNOYXR1cmUocHJvamVjdCkpIHsKLQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgSnNXZWJOYXR1cmUuTkFUVVJFX0lEUy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJCS8vIG5ld05hdHVyZXNbcHJldk5hdHVyZXMubGVuZ3RoXSA9IEphdmFTY3JpcHRDb3JlLk5BVFVSRV9JRDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgSnNXZWJOYXR1cmUuTkFUVVJFX0lEUy5sZW5ndGg7IGkrKykgewotCQkJCW5ld05hdHVyZXNbcHJldk5hdHVyZXMubGVuZ3RoICsgaV0gPSBKc1dlYk5hdHVyZS5OQVRVUkVfSURTW2ldOwotCQkJfQotCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbW9uaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc05hdHVyZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IEpzV2ViTmF0dXJlLk5BVFVSRV9JRFMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIXByb2plY3QuaGFzTmF0dXJlKEpzV2ViTmF0dXJlLk5BVFVSRV9JRFNbaV0pKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUpzTmF0dXJlKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoSnNXZWJOYXR1cmUuaGFzTmF0dXJlKHByb2plY3QpKSB7Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCAtIEpzV2ViTmF0dXJlLk5BVFVSRV9JRFMubGVuZ3RoXTsKLQkJCWludCBrID0gMDsKLQkJCWhlYWQ6IGZvciAoaW50IGkgPSAwOyBpIDwgcHJldk5hdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IEpzV2ViTmF0dXJlLk5BVFVSRV9JRFMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKHByZXZOYXR1cmVzW2ldLmVxdWFscyhKc1dlYk5hdHVyZS5OQVRVUkVfSURTW2pdKSkgewotCQkJCQkJY29udGludWUgaGVhZDsKLQkJCQkJfQotCQkJCX0KLQkJCQluZXdOYXR1cmVzW2srK10gPSBwcmV2TmF0dXJlc1tpXTsKLQkJCX0KLQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCQl9IGVsc2UgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgVmVjdG9yIGNsYXNzUGF0aEVudHJpZXMgPSBuZXcgVmVjdG9yKCk7Ci0JcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJpdmF0ZSBJUHJvamVjdCBmQ3VyclByb2plY3Q7Ci0JcHJpdmF0ZSBKYXZhUHJvamVjdCBmSmF2YVByb2plY3Q7Ci0JcHJpdmF0ZSBJUGF0aCBmT3V0cHV0TG9jYXRpb247Ci0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0JCi0JcHVibGljIEpzV2ViTmF0dXJlKCkgewotCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQl9Ci0JCi0JcHVibGljIEpzV2ViTmF0dXJlKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmQ3VyclByb2plY3QgPSBwcm9qZWN0OwotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCQl9IGVsc2UgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWluaXRPdXRwdXRQYXRoKCk7Ci0JCWNyZWF0ZVNvdXJjZUNsYXNzUGF0aCgpOwotCQlpbml0SlJFRW50cnkoKTsKLQkJaW5pdExvY2FsQ2xhc3NQYXRoKCk7Ci0JCQotCQlpZiAoaGFzUHJvamVjdENsYXNzUGF0aEZpbGUoKSkgewotCQkJSUluY2x1ZGVQYXRoRW50cnlbXSBlbnRyaWVzID0gZ2V0UmF3Q2xhc3NQYXRoKCk7Ci0JCQlpZiAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoID4gMCkgewotCQkJCWNsYXNzUGF0aEVudHJpZXMucmVtb3ZlQWxsKEFycmF5cy5hc0xpc3QoZW50cmllcykpOwotCQkJCWNsYXNzUGF0aEVudHJpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZW50cmllcykpOwotCQkJfQotCQl9Ci0JCQotCQlKc1dlYk5hdHVyZS5hZGRKc05hdHVyZShmQ3VyclByb2plY3QsIG1vbml0b3IpOwotCQlmSmF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpIEphdmFTY3JpcHRDb3JlLmNyZWF0ZShmQ3VyclByb2plY3QpOwotCQlmSmF2YVByb2plY3Quc2V0UHJvamVjdChmQ3VyclByb2plY3QpOwotCQl0cnkgewotCQkJLy8gLCBmT3V0cHV0TG9jYXRpb24KLQkJCWlmICghaGFzUHJvamVjdENsYXNzUGF0aEZpbGUoKSkgewotCQkJCWZKYXZhUHJvamVjdC5zZXRSYXdJbmNsdWRlcGF0aCgoSUluY2x1ZGVQYXRoRW50cnlbXSkgY2xhc3NQYXRoRW50cmllcy50b0FycmF5KG5ldyBJSW5jbHVkZVBhdGhFbnRyeVtdIHt9KSwgZk91dHB1dExvY2F0aW9uLCBtb25pdG9yKTsKLQkJCX1lbHNlewotCQkJCWZKYXZhUHJvamVjdC5zZXRSYXdJbmNsdWRlcGF0aCgoSUluY2x1ZGVQYXRoRW50cnlbXSkgY2xhc3NQYXRoRW50cmllcy50b0FycmF5KG5ldyBJSW5jbHVkZVBhdGhFbnRyeVtdIHt9KSwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0KLQkJTGlicmFyeVN1cGVyVHlwZSBzdXBlclR5cGUgPSBuZXcgTGlicmFyeVN1cGVyVHlwZShuZXcgUGF0aCggU1VQRVJfVFlQRV9MSUJSQVJZKSwgIGdldEphdmFQcm9qZWN0KCksIFNVUEVSX1RZUEVfTkFNRSk7Ci0JCWdldEphdmFQcm9qZWN0KCkuc2V0Q29tbW9uU3VwZXJUeXBlKHN1cGVyVHlwZSk7Ci0JCS8vIGdldEphdmFQcm9qZWN0KCkuYWRkVG9CdWlsZFNwZWMoQlVJTERFUl9JRCk7Ci0JCWZDdXJyUHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNvdXJjZUNsYXNzUGF0aCgpIHsKLQkJaWYgKGhhc0FWYWxpZFNvdXJjZVBhdGgoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlJbmNsdWRlUGF0aEVudHJ5W10gZW50cmllcyA9IG5ldyBDb252ZXJ0VXRpbGl0eShmQ3VyclByb2plY3QpLmdldERlZmF1bHRTb3VyY2VQYXRocyhmQ3VyclByb2plY3QpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWNsYXNzUGF0aEVudHJpZXMuYWRkKGVudHJpZXNbaV0pOwotCQl9Ci0JCS8vIElQYXRoIHByb2plY3RQYXRoID0gZkN1cnJQcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCS8vIGNsYXNzUGF0aEVudHJpZXMuYWRkKEphdmFTY3JpcHRDb3JlLm5ld1NvdXJjZUVudHJ5KHByb2plY3RQYXRoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRlY29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlWZWN0b3IgYmFkRW50cmllcyA9IG5ldyBWZWN0b3IoKTsKLQkJSUluY2x1ZGVQYXRoRW50cnkgZGVmYXVsdEpSRUxpYnJhcnkgPSAgZ2V0SnJlRW50cnkoKTsKLQkJSUluY2x1ZGVQYXRoRW50cnlbXSBsb2NhbEVudHJpZXMgPSBpbml0TG9jYWxDbGFzc1BhdGgoKTsKLQkJYmFkRW50cmllcy5hZGQoZGVmYXVsdEpSRUxpYnJhcnkpOwotCQliYWRFbnRyaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGxvY2FsRW50cmllcykpOwotCQlJSW5jbHVkZVBhdGhFbnRyeVtdIGVudHJpZXMgPSBnZXRSYXdDbGFzc1BhdGgoKTsKLQkJVmVjdG9yIGdvb2RFbnRyaWVzID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghYmFkRW50cmllcy5jb250YWlucyhlbnRyaWVzW2ldKSkgewotCQkJCWdvb2RFbnRyaWVzLmFkZChlbnRyaWVzW2ldKTsKLQkJCX0KLQkJfQotCQkvLyBnZXRKYXZhUHJvamVjdCgpLnJlbW92ZUZyb21CdWlsZFNwZWMoQlVJTERFUl9JRCk7Ci0JCUlQYXRoIG91dHB1dExvY2F0aW9uID0gZ2V0SmF2YVByb2plY3QoKS5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQlnZXRKYXZhUHJvamVjdCgpLnNldFJhd0luY2x1ZGVwYXRoKChJSW5jbHVkZVBhdGhFbnRyeVtdKSBnb29kRW50cmllcy50b0FycmF5KG5ldyBJSW5jbHVkZVBhdGhFbnRyeVtdIHt9KSwgb3V0cHV0TG9jYXRpb24sIG1vbml0b3IpOwotCQlnZXRKYXZhUHJvamVjdCgpLmRlY29uZmlndXJlKCk7Ci0JCUpzV2ViTmF0dXJlLnJlbW92ZUpzTmF0dXJlKGZDdXJyUHJvamVjdCwgbW9uaXRvcik7Ci0JCWZDdXJyUHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLQl9Ci0JCi0JcHVibGljIEphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlpZiAoZkphdmFQcm9qZWN0ID09IG51bGwpIHsKLQkJCWZKYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdCkgSmF2YVNjcmlwdENvcmUuY3JlYXRlKGZDdXJyUHJvamVjdCk7Ci0JCQlmSmF2YVByb2plY3Quc2V0UHJvamVjdChmQ3VyclByb2plY3QpOwotCQl9Ci0JCXJldHVybiBmSmF2YVByb2plY3Q7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5mQ3VyclByb2plY3Q7Ci0JfQotCQotCXByaXZhdGUgSUluY2x1ZGVQYXRoRW50cnlbXSBnZXRSYXdDbGFzc1BhdGgoKSB7Ci0JCUphdmFQcm9qZWN0IHByb2ogPSBuZXcgSmF2YVByb2plY3QoKTsKLQkJcHJvai5zZXRQcm9qZWN0KGZDdXJyUHJvamVjdCk7Ci0JCXJldHVybiBwcm9qLnJlYWRSYXdJbmNsdWRlcGF0aCgpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaGFzQVZhbGlkU291cmNlUGF0aCgpIHsKLQkJaWYgKGhhc1Byb2plY3RDbGFzc1BhdGhGaWxlKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSUluY2x1ZGVQYXRoRW50cnlbXSBlbnRyaWVzID0gZ2V0UmF3Q2xhc3NQYXRoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChlbnRyaWVzW2ldLmdldEVudHJ5S2luZCgpID09IElJbmNsdWRlUGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmdldFN0cmluZygiSnNXZWJOYXR1cmUuNSIpICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaGFzUHJvamVjdENsYXNzUGF0aEZpbGUoKSB7Ci0JCWlmIChmQ3VyclByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmQ3VyclByb2plY3QuZ2V0Rm9sZGVyKEphdmFQcm9qZWN0LkRFRkFVTFRfUFJFRkVSRU5DRVNfRElSTkFNRSkuZ2V0RmlsZShKYXZhUHJvamVjdC5DTEFTU1BBVEhfRklMRU5BTUUpLmV4aXN0cygpOwotCX0KLQkKLQlwcml2YXRlIElJbmNsdWRlUGF0aEVudHJ5IGdldEpyZUVudHJ5KCkgewotCQlyZXR1cm4gSmF2YVNjcmlwdENvcmUubmV3Q29udGFpbmVyRW50cnkobmV3IFBhdGgoREVGQVVMVF9KUkVfUEFUSCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdEpSRUVudHJ5KCkgewotCQlJSW5jbHVkZVBhdGhFbnRyeSBkZWZhdWx0SlJFTGlicmFyeSA9ICBnZXRKcmVFbnRyeSgpOwotCQl0cnkgewotCQkJSUluY2x1ZGVQYXRoRW50cnlbXSBlbnRyaWVzID0gZ2V0UmF3Q2xhc3NQYXRoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZW50cmllc1tpXSA9PSBkZWZhdWx0SlJFTGlicmFyeSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJY2xhc3NQYXRoRW50cmllcy5hZGQoZGVmYXVsdEpSRUxpYnJhcnkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmdldFN0cmluZygiSnNXZWJOYXR1cmUuNiIpICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIElJbmNsdWRlUGF0aEVudHJ5W10gaW5pdExvY2FsQ2xhc3NQYXRoKCkgewotCQkKLQkJY2xhc3NQYXRoRW50cmllcy5hZGQoSnNXZWJOYXR1cmUuVklSVFVBTF9TQ09QRV9FTlRSWSk7Ci0JCUlJbmNsdWRlUGF0aEVudHJ5IGJyb3dzZXJMaWJyYXJ5ID0gSmF2YVNjcmlwdENvcmUubmV3Q29udGFpbmVyRW50cnkoIFZJUlRVQUxfQlJPV1NFUl9DTEFTU1BBVEgpOwotCQljbGFzc1BhdGhFbnRyaWVzLmFkZChicm93c2VyTGlicmFyeSk7Ci0JCS8vSVBhdGggd2ViUm9vdCA9IFdlYlJvb3RGaW5kZXIuZ2V0V2ViQ29udGVudEZvbGRlcihmQ3VyclByb2plY3QpOwotCS8vCUlJbmNsdWRlUGF0aEVudHJ5IHNvdXJjZSA9IEphdmFTY3JpcHRDb3JlLm5ld1NvdXJjZUVudHJ5KGZDdXJyUHJvamVjdC5nZXRGdWxsUGF0aCgpLmFwcGVuZCh3ZWJSb290KS5hcHBlbmQoIi8iKSk7Ci0JLy8JY2xhc3NQYXRoRW50cmllcy5hZGQoc291cmNlKTsKLQkJcmV0dXJuIG5ldyBJSW5jbHVkZVBhdGhFbnRyeVtdIHsgSnNXZWJOYXR1cmUuVklSVFVBTF9TQ09QRV9FTlRSWSAsIGJyb3dzZXJMaWJyYXJ5Lyosc291cmNlKi99OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdE91dHB1dFBhdGgoKSB7Ci0JCWlmIChmT3V0cHV0TG9jYXRpb24gPT0gbnVsbCkgewotCQkJZk91dHB1dExvY2F0aW9uID0gZkN1cnJQcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMuZkN1cnJQcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjY5N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvTW9kdWxlQ29yZVN1cHBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvTW9kdWxlQ29yZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg0MWFmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L01vZHVsZUNvcmVTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgYW55IHVzZWQgTW9kdWxlIENvcmUgQVBJcyBhbG9uZyB3aXRoIGZhbGxiYWNrcyBmb3INCi0gKiB1c2Ugb24gbm9uLWNvbXBsaWFudCBwcm9qZWN0cyBhbmQgd2hlbiB0aG9zZSBzZXJ2aWNlcyBhcmUgbm90IGF2YWlsYWJsZSBhdA0KLSAqIHJ1bnRpbWUuDQotICogDQotICogQmVjYXVzZSBNb2R1bGVDb3JlIEFQSSBjYWxscyBjYW4gcmVzdWx0IGluIGxvY2tzIG5lZWRpbmcgdG8gYmUgYWNxdWlyZWQsDQotICogbm9uZSBvZiB0aGVzZSBtZXRob2RzIHNob3VsZCBiZSBjYWxsZWQgd2hpbGUgb3RoZXIgdGhyZWFkIGxvY2tzIGhhdmUNCi0gKiBhbHJlYWR5IGJlZW4gYWNxdWlyZWQuDQotICovDQotcHVibGljIGZpbmFsIGNsYXNzIE1vZHVsZUNvcmVTdXBwb3J0IHsNCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gX2R1bXBfTkNERkUgPSBmYWxzZTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTkYgPSAiV0VCLUlORiI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBhdGggV0VCX0lORl9QQVRIID0gbmV3IFBhdGgoV0VCX0lORik7DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gcHJvamVjdA0KLQkgKiBAcmV0dXJuIHRoZSBjb21wdXRlZCBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMsIGVpdGhlcg0KLQkgKiAgICAgICAgIGZyb20gZmFjZXQga25vd2xlZGdlIG9yIGh1ZXJpc3RpY3MsIG9yIG51bGwgaWYgb25lIGNhbiBub3QgYmUNCi0JICogICAgICAgICBkZXRlcm1pbmVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElQYXRoIGNvbXB1dGVXZWJDb250ZW50Um9vdFBhdGgoSVBhdGggcGF0aCkgew0KLQkJSVBhdGggcm9vdCA9IG51bGw7DQotCQl0cnkgew0KLQkJCXJvb3QgPSBNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmdldFdlYkNvbnRlbnRSb290UGF0aChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aC5zZWdtZW50KDApKSk7DQotCQl9DQotCQljYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgew0KLQkJCWlmIChfZHVtcF9OQ0RGRSkNCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCX0NCi0JCWlmIChyb290ID09IG51bGwpIHsNCi0JCQkvKg0KLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTMyNDUNCi0JCQkgKiANCi0JCQkgKiBOUEUgaW4gSlNQVGFnbGliRGlyZWN0aXZlQ29udGVudEFzc2lzdFByb2Nlc3NvciB3aXRoDQotCQkJICogbm9uLWZhY2V0ZWQgcHJvamVjdA0KLQkJCSAqLw0KLQkJCXJvb3QgPSBnZXRMb2NhbFJvb3QocGF0aCk7DQotCQl9DQotCQlyZXR1cm4gcm9vdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHBhcmFtIHByb2plY3QNCi0JICogQHJldHVybiB0aGUgSVBhdGggdG8gdGhlICJyb290IiBvZiB0aGUgd2ViIGNvbnRlbnRzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRSb290UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7DQotCQlpZiAocHJvamVjdCA9PSBudWxsKQ0KLQkJCXJldHVybiBudWxsOw0KLQ0KLQkJSVBhdGggcGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsNCi0JCXRyeSB7DQotCQkJcGF0aCA9IE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuZ2V0V2ViQ29udGVudFJvb3RQYXRoKHByb2plY3QpOw0KLQkJfQ0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsNCi0JCQlpZiAoX2R1bXBfTkNERkUpDQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotCQlyZXR1cm4gcGF0aDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHBhcmFtIHBhdGgNCi0JICogICAgICAgICAgICAtIHRoZSBmdWxsIHBhdGggdG8gYSByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtzcGFjZQ0KLQkgKiBAcmV0dXJuIC0gdGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgaWYgb25lIGV4aXN0cywgbnVsbA0KLQkgKiAgICAgICAgIG90aGVyd2lzZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRSdW50aW1lUGF0aChJUGF0aCBwYXRoKSB7DQotCQlJUGF0aCByZXN1bHQgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlyZXN1bHQgPSBNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmdldFJ1bnRpbWVQYXRoKHBhdGgpOw0KLQkJfQ0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsNCi0JCQlpZiAoX2R1bXBfTkNERkUpDQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCi0JCQlJUGF0aCByb290ID0gZ2V0TG9jYWxSb290KHBhdGgpOw0KLQkJCXJlc3VsdCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhyb290LnNlZ21lbnRDb3VudCgpKS5tYWtlQWJzb2x1dGUoKTsNCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBiYXNlUGF0aA0KLQkgKiAgICAgICAgICAgIC0gdGhlIGZ1bGwgcGF0aCB0byBhIHJlc291cmNlIHdpdGhpbiB0aGUgd29ya3NwYWNlDQotCSAqIEBwYXJhbSByZWZlcmVuY2UNCi0JICogICAgICAgICAgICAtIHRoZSByZWZlcmVuY2Ugc3RyaW5nIHRvIHJlc29sdmUNCi0JICogQHJldHVybiAtIHRoZSBmdWxsIHBhdGggd2l0aGluIHRoZSB3b3Jrc3BhY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUNCi0JICogICAgICAgICBnaXZlbiByZWZlcmVuY2UgYWNjb3JkaW5nIHRvIHRoZSB2aXJ0dWFsIHBhdGhpbmcgc3VwcG9ydA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJUGF0aCByZXNvbHZlKElQYXRoIGJhc2VQYXRoLCBTdHJpbmcgcmVmZXJlbmNlKSB7DQotCQlJUGF0aCByZXNvbHZlZFBhdGggPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlyZXNvbHZlZFBhdGggPSBNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLnJlc29sdmUoYmFzZVBhdGgsIHJlZmVyZW5jZSk7DQotCQl9DQotCQljYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgew0KLQkJCWlmIChfZHVtcF9OQ0RGRSkNCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCX0NCi0NCi0JCWlmIChyZXNvbHZlZFBhdGggPT0gbnVsbCkgew0KLQkJCUlQYXRoIHJvb3RQYXRoID0gZ2V0TG9jYWxSb290KGJhc2VQYXRoKTsNCi0JCQlpZiAocmVmZXJlbmNlLnN0YXJ0c1dpdGgoUGF0aC5ST09ULnRvU3RyaW5nKCkpKSB7DQotCQkJCXJlc29sdmVkUGF0aCA9IHJvb3RQYXRoLmFwcGVuZChyZWZlcmVuY2UpOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJcmVzb2x2ZWRQYXRoID0gYmFzZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChyZWZlcmVuY2UpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiByZXNvbHZlZFBhdGg7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBiYXNlUGF0aA0KLQkgKiBAcmV0dXJuIHRoZSBhcHBsaWNhYmxlIFdlYiBjb250ZXh0IHJvb3QgcGF0aCwgaWYgb25lIGV4aXN0cw0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggZ2V0TG9jYWxSb290KElQYXRoIGJhc2VQYXRoKSB7DQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsNCi0NCi0JCS8vIGV4aXN0aW5nIHdvcmtzcGFjZSByZXNvdXJjZXMgLSB0aGlzIGlzIHRoZSA5MyUgY2FzZQ0KLQkJSVJlc291cmNlIGZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihiYXNlUGF0aCk7DQotDQotCQkvLyBUcnkgdGhlIGJhc2UgcGF0aCBhcyBhIGZvbGRlciBmaXJzdA0KLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsNCi0JCQlmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGb2xkZXIoYmFzZVBhdGgpOw0KLQkJfQ0KLQkJLy8gSWYgbm90IGEgZm9sZGVyLCB0aGVuIHRyeSBiYXNlIHBhdGggYXMgYSBmaWxlDQotCQlpZiAoZmlsZSAhPSBudWxsICYmICFmaWxlLmV4aXN0cygpICYmIGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgew0KLQkJCWZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZpbGUoYmFzZVBhdGgpOw0KLQkJfQ0KLQ0KLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7DQotCQkJZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChiYXNlUGF0aC5zZWdtZW50KDApKTsNCi0JCX0NCi0NCi0JCWlmIChmaWxlID09IG51bGwpIHsNCi0JCQkvKg0KLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY1MjkNCi0JCQkgKiANCi0JCQkgKiBUaGlzIG1ldGhvZCBwcm9kdWNlcyBhIGxlc3MgYWNjdXJhdGUgcmVzdWx0LCBidXQgZG9lc24ndA0KLQkJCSAqIHJlcXVpcmUgdGhhdCB0aGUgZmlsZSBleGlzdCB5ZXQuDQotCQkJICovDQotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24oYmFzZVBhdGgpOw0KLQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKQ0KLQkJCQlmaWxlID0gZmlsZXNbMF07DQotCQl9DQotDQotCQl3aGlsZSAoZmlsZSAhPSBudWxsKSB7DQotCQkJLyoqDQotCQkJICogVHJlYXQgYW55IHBhcmVudCBmb2xkZXIgd2l0aCBhIFdFQi1JTkYgc3ViZm9sZGVyIGFzIGEgd2ViLWFwcA0KLQkJCSAqIHJvb3QNCi0JCQkgKi8NCi0JCQlJQ29udGFpbmVyIGZvbGRlciA9IG51bGw7DQotCQkJaWYgKChmaWxlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpICE9IDApIHsNCi0JCQkJZm9sZGVyID0gKElDb250YWluZXIpIGZpbGU7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlmb2xkZXIgPSBmaWxlLmdldFBhcmVudCgpOw0KLQkJCX0NCi0JCQkvLyBnZXRGb2xkZXIgb24gYSB3b3Jrc3BhY2Ugcm9vdCBtdXN0IHVzZSBhIGZ1bGwgcGF0aCwgc2tpcA0KLQkJCWlmIChmb2xkZXIgIT0gbnVsbCAmJiAoZm9sZGVyLmdldFR5cGUoKSAmIElSZXNvdXJjZS5ST09UKSA9PSAwKSB7DQotCQkJCUlGb2xkZXIgd2ViaW5mID0gZm9sZGVyLmdldEZvbGRlcihXRUJfSU5GX1BBVEgpOw0KLQkJCQlpZiAod2ViaW5mICE9IG51bGwgJiYgd2ViaW5mLmV4aXN0cygpKSB7DQotCQkJCQlyZXR1cm4gZm9sZGVyLmdldEZ1bGxQYXRoKCk7DQotCQkJCX0NCi0JCQl9DQotCQkJZmlsZSA9IGZpbGUuZ2V0UGFyZW50KCk7DQotCQl9DQotDQotCQlyZXR1cm4gYmFzZVBhdGgudXB0b1NlZ21lbnQoMSk7DQotCX0NCi0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Nb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L01vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiNjExMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L01vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotLyoqCi0gKiBXcmFwcGVyIGNsYXNzIGZvciBhbGwgRmFjZXQgYW5kIE1vZHVsZUNvcmUtcmVsYXRlZCBjYWxscy4gSWYgdGhlIEZhY2V0IG9yCi0gKiBNb2R1bGVDb3JlIGJ1bmRsZXMgYXJlIG5vdCBhdmFpbGFibGUsIHRoaXMgY2xhc3Mgd2lsbCBub3QgbG9hZCwgb3IgaWYgaXQKLSAqIGRvZXMsIGl0cyBtZXRob2RzIHdpbGwgY2F1c2UgTm9DbGFzc0RlZkZvdW5kRXJyb3JzLiBUaGlzIGFsbG93cyB1cyB0bwotICogY29tcGFydG1lbnRhbGl6ZSB0aGUgZGVwZW5kZW5jaWVzLgotICogCi0gKi8KLWZpbmFsIGNsYXNzIE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTEFTSCA9ICIvIjsKLQlwcml2YXRlIHN0YXRpYyBNYXAgZlJlc29sdmVkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICAtIHRoZSBmdWxsIHBhdGggdG8gYSByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gLSB0aGUgcnVudGltZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBpZiBvbmUgZXhpc3RzLCBudWxsCi0JICogICAgICAgICBvdGhlcndpc2UKLQkgKi8KLQlzdGF0aWMgSVBhdGggZ2V0UnVudGltZVBhdGgoSVBhdGggcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpOwotCi0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlWaXJ0dWFsUmVzb3VyY2VbXSB2aXJ0dWFsUmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpKTsKLQkJaWYgKHZpcnR1YWxSZXNvdXJjZXMgIT0gbnVsbCAmJiB2aXJ0dWFsUmVzb3VyY2VzLmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiB2aXJ0dWFsUmVzb3VyY2VzWzBdLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMKLQkgKi8KLQlzdGF0aWMgSVBhdGggZ2V0V2ViQ29udGVudFJvb3RQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsICYmIGNvbXBvbmVudC5leGlzdHMoKSkgewotCQkJcGF0aCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICAtIHRoZSBmdWxsIHBhdGggdG8gYSByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtzcGFjZQotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKiAgICAgICAgICAgIC0gdGhlIHJlZmVyZW5jZSBzdHJpbmcgdG8gcmVzb2x2ZQotCSAqIEByZXR1cm4gLSB0aGUgZnVsbCBwYXRoIHdpdGhpbiB0aGUgd29ya3NwYWNlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0JICogICAgICAgICBnaXZlbiByZWZlcmVuY2UgYWNjb3JkaW5nIHRvIHRoZSB2aXJ0dWFsIHBhdGhpbmcgc3VwcG9ydAotCSAqLwotCXN0YXRpYyBJUGF0aCByZXNvbHZlKElQYXRoIGJhc2VQYXRoLCBTdHJpbmcgcmVmZXJlbmNlKSB7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCB8fCBiYXNlUGF0aCA9PSBudWxsIHx8IGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGJhc2VQYXRoLnNlZ21lbnQoMCkpOwotCi0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCS8qCi0JCQkgKiBJdCBjYW4gdGFrZSB0aGUgYmV0dGVyIHBhcnQgb2YgYSBmdWxsIHNlY29uZCB0byBkbyB0aGlzLCBzbwotCQkJICogY2FjaGUgdGhlIHJlc3VsdC4KLQkJCSAqLwotCQkJSVBhdGggcmVzb2x2ZWQgPSBudWxsOwotCQkJTWFwIG1hcEZvckJhc2VSZXNvdXJjZSA9IG51bGw7Ci0JCQltYXBGb3JCYXNlUmVzb3VyY2UgPSAoTWFwKSBmUmVzb2x2ZWRNYXAuZ2V0KGJhc2VQYXRoKTsKLQkJCWlmIChtYXBGb3JCYXNlUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCVJlZmVyZW5jZSByZXNvbHZlZFJlZmVyZW5jZSA9IChSZWZlcmVuY2UpIG1hcEZvckJhc2VSZXNvdXJjZS5nZXQocmVmZXJlbmNlKTsKLQkJCQlpZiAocmVzb2x2ZWRSZWZlcmVuY2UgIT0gbnVsbCkKLQkJCQkJcmVzb2x2ZWQgPSAoSVBhdGgpIHJlc29sdmVkUmVmZXJlbmNlLmdldCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWFwRm9yQmFzZVJlc291cmNlID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmUmVzb2x2ZWRNYXAucHV0KGJhc2VQYXRoLCBtYXBGb3JCYXNlUmVzb3VyY2UpOwotCQkJfQotCi0JCQlpZiAocmVzb2x2ZWQgPT0gbnVsbCkgewotCQkJCUlGaWxlIGJhc2VGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGJhc2VQYXRoKTsKLQkJCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGJhc2VGaWxlKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZpcnR1YWxSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVBhdGggYmFzZVJ1bnRpbWVQYXRoID0gdmlydHVhbFJlc291cmNlc1tpXS5nZXRSdW50aW1lUGF0aCgpOwotCQkJCQlJUGF0aCByZWZlcmVuY2VSdW50aW1lUGF0aCA9IG51bGw7Ci0JCQkJCWlmIChyZWZlcmVuY2Uuc3RhcnRzV2l0aChTTEFTSCkpIHsKLQkJCQkJCXJlZmVyZW5jZVJ1bnRpbWVQYXRoID0gbmV3IFBhdGgocmVmZXJlbmNlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlZmVyZW5jZVJ1bnRpbWVQYXRoID0gYmFzZVJ1bnRpbWVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQocmVmZXJlbmNlKTsKLQkJCQkJfQotCQkJCQlJVmlydHVhbEZpbGUgdmlydHVhbEZpbGUgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUZpbGUocHJvamVjdCwgcmVmZXJlbmNlUnVudGltZVBhdGgpOwotCQkJCQlpZiAodmlydHVhbEZpbGUgIT0gbnVsbCAmJiB2aXJ0dWFsRmlsZS5leGlzdHMoKSkgewotCQkJCQkJSUZpbGVbXSB1bmRlcmx5aW5nRmlsZXMgPSB2aXJ0dWFsRmlsZS5nZXRVbmRlcmx5aW5nRmlsZXMoKTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdW5kZXJseWluZ0ZpbGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJaWYgKHVuZGVybHlpbmdGaWxlc1tqXS5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpICYmIHVuZGVybHlpbmdGaWxlc1tqXS5leGlzdHMoKSkgewotCQkJCQkJCQltYXBGb3JCYXNlUmVzb3VyY2UucHV0KHJlZmVyZW5jZSwgbmV3IFNvZnRSZWZlcmVuY2UodW5kZXJseWluZ0ZpbGVzW2pdLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQkJCQkJcmVzb2x2ZWQgPSB1bmRlcmx5aW5nRmlsZXNbal0uZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXNvbHZlZDsKLQkJfQotCQllbHNlIHsKLQkJCUlWaXJ0dWFsRmlsZSB2aXJ0dWFsRmlsZSA9IENvbXBvbmVudENvcmUuY3JlYXRlRmlsZShwcm9qZWN0LCBuZXcgUGF0aChyZWZlcmVuY2UpKTsKLQkJCWlmICh2aXJ0dWFsRmlsZSAhPSBudWxsICYmIHZpcnR1YWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIHZpcnR1YWxGaWxlLmdldFVuZGVybHlpbmdGaWxlKCkuZ2V0RnVsbFBhdGgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L01vZHVsZVNvdXJjZVBhdGhQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Nb2R1bGVTb3VyY2VQYXRoUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5NTUzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L01vZHVsZVNvdXJjZVBhdGhQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JQWNjZXNzUnVsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSW5jbHVkZVBhdGhBdHRyaWJ1dGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUluY2x1ZGVQYXRoRW50cnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdENvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUudXRpbC5EZWZhdWx0U291cmNlUGF0aFByb3ZpZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBNb2R1bGVTb3VyY2VQYXRoUHJvdmlkZXIgZXh0ZW5kcyBEZWZhdWx0U291cmNlUGF0aFByb3ZpZGVyIHsNCi0NCi0Jc3RhdGljIGZpbmFsIElQYXRoIFZJUlRVQUxfQ09OVEFJTkVSX1BBVEggPSBuZXcgUGF0aCgib3JnLmVjbGlwc2Uud3N0LmpzZHQubGF1bmNoaW5nLldlYlByb2plY3QiKTsgLy8kTk9OLU5MUy0xJA0KLQlzdGF0aWMgZmluYWwgSUluY2x1ZGVQYXRoRW50cnkgVklSVFVBTF9TQ09QRV9FTlRSWSA9IEphdmFTY3JpcHRDb3JlLm5ld0NvbnRhaW5lckVudHJ5KFZJUlRVQUxfQ09OVEFJTkVSX1BBVEgsIG5ldyBJQWNjZXNzUnVsZVswXSwgbmV3IElJbmNsdWRlUGF0aEF0dHJpYnV0ZVtde0lJbmNsdWRlUGF0aEF0dHJpYnV0ZS5ISURFfSwgZmFsc2UpOw0KLQ0KLQlwdWJsaWMgTW9kdWxlU291cmNlUGF0aFByb3ZpZGVyKCkgew0KLQl9DQotDQotCXB1YmxpYyBJSW5jbHVkZVBhdGhFbnRyeVtdIGdldERlZmF1bHRTb3VyY2VQYXRocyhJUHJvamVjdCBwKSB7DQotCQlpZiAoTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwKSkgew0KLQkJCUlWaXJ0dWFsRmlsZSByb290ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVGaWxlKHAsIFBhdGguUk9PVCk7DQotCQkJSVJlc291cmNlW10gdW5kZXJseWluZ1Jlc291cmNlcyA9IHJvb3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlcygpOw0KLQkJCWlmICh1bmRlcmx5aW5nUmVzb3VyY2VzID09IG51bGwgfHwgdW5kZXJseWluZ1Jlc291cmNlcy5sZW5ndGggPT0gMCkgew0KLQkJCQl1bmRlcmx5aW5nUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVtde3Jvb3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCl9Ow0KLQkJCX0NCi0JCQlpZiAodW5kZXJseWluZ1Jlc291cmNlcy5sZW5ndGggPiAwICYmIHVuZGVybHlpbmdSZXNvdXJjZXNbMF0gIT0gbnVsbCkgew0KLQkJCQlJUGF0aFtdIHBhdGhzID0gbmV3IElQYXRoW3VuZGVybHlpbmdSZXNvdXJjZXMubGVuZ3RoXTsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bmRlcmx5aW5nUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7DQotCQkJCQlwYXRoc1tpXSA9IHVuZGVybHlpbmdSZXNvdXJjZXNbaV0uZ2V0RnVsbFBhdGgoKTsNCi0JCQkJfQ0KLQkJCQlpZiAocGF0aHMubGVuZ3RoID4gMCkgew0KLQkJCQkJSUluY2x1ZGVQYXRoRW50cnlbXSBlbnRyaWVzID0gbmV3IElJbmNsdWRlUGF0aEVudHJ5W3BhdGhzLmxlbmd0aCArIDFdOw0KLQkJCQkJZW50cmllc1swXSA9IFZJUlRVQUxfU0NPUEVfRU5UUlk7DQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7DQotCQkJCQkJZW50cmllc1tpKzFdID0gSmF2YVNjcmlwdENvcmUubmV3U291cmNlRW50cnkocGF0aHNbaV0pOw0KLQkJCQkJfQ0KLQkJCQkJcmV0dXJuIGVudHJpZXM7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFNvdXJjZVBhdGhzKHApOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9XZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjU2YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9XZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUluY2x1ZGVQYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSnNHbG9iYWxTY29wZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmNvbXBpbGVyLmxpYnJhcmllcy5MaWJyYXJ5TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc05hbWVNYW5nbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LldlYlJvb3RGaW5kZXI7Ci0KLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIFdlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIgZXh0ZW5kcyBKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIgIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEFJTkVSX0RFU0NSSVBUSU9OID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJXZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLjAiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIExJQl9OQU1FID0geydiJywncicsJ28nLCd3JywncycsJ2UnLCdyJywnVycsJ2knLCduJywnZCcsJ28nLCd3JywnLicsJ2onLCdzJ307Ci0JLyogU29tZSB0b2tlbnMgZm9yIHVzIHRvIGlkZW50aWZ5IG1hbmdsZWQgcGF0aHMgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOR0xFRF9CVVRUMSA9ICJodG0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTkdMRURfQlVUVDIgPSAiLmpzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vcHJpdmF0ZSBJSmF2YVNjcmlwdFByb2plY3QgamF2YVByb2plY3Q7Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFVubWFuZ2VkSHRtbFBhdGgoU3RyaW5nIGNvbnRhaW5lclBhdGhTdHJpbmcpIHsKLQkJaWYgKGNvbnRhaW5lclBhdGhTdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGNvbnRhaW5lclBhdGhTdHJpbmcudG9Mb3dlckNhc2UoKS5pbmRleE9mKFdlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIuTUFOR0xFRF9CVVRUMSkgIT0gLTEgJiYgY29udGFpbmVyUGF0aFN0cmluZy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci5NQU5HTEVEX0JVVFQyKSAhPSAtMSkgewotCQkJcmV0dXJuIEpzTmFtZU1hbmdsZXJVdGlsLnVubWFuZ2xlKGNvbnRhaW5lclBhdGhTdHJpbmcpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgTGlicmFyeUxvY2F0aW9uIGdldExpYnJhcnlMb2NhdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5Kc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIjY2FuVXBkYXRlSnNHbG9iYWxTY29wZUNvbnRhaW5lcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdCkKLQkgKi8KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5VcGRhdGVKc0dsb2JhbFNjb3BlQ29udGFpbmVyKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhU2NyaXB0UHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8qIGRvbnQgcmVtb3ZlIGZyb20gdGhpcyBwcm9qZWN0ICovCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIElKc0dsb2JhbFNjb3BlQ29udGFpbmVyIGdldENvbnRhaW5lcihJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVNjcmlwdFByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIFdlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIuQ09OVEFJTkVSX0RFU0NSSVBUSU9OOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyI2dldERlc2NyaXB0aW9uKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRQcm9qZWN0KQotCSAqLwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCWlmIChjb250YWluZXJQYXRoLmVxdWFscyhuZXcgUGF0aChKc1dlYk5hdHVyZS5WSVJUVUFMX0NPTlRBSU5FUikpKSB7Ci0JCQlyZXR1cm4gV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci5DT05UQUlORVJfREVTQ1JJUFRJT047Ci0JCX0KLQkJCi0JCVN0cmluZyBjb250YWluZXJQYXRoU3RyaW5nID0gY29udGFpbmVyUGF0aC50b1N0cmluZygpOwotCQlJUGF0aCB3ZWJDb250ZXh0ID0gZ2V0V2ViQ29udGV4dFJvb3QoamF2YVByb2plY3QpOwotCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IGNvbnRhaW5lclBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQlpZihjb250YWluZXJQYXRoLmVxdWFscyhnZXRXZWJDb250ZXh0Um9vdChqYXZhUHJvamVjdCkpIHx8IChmaWxlRXh0ZW5zaW9uIT1udWxsICYmIGZpbGVFeHRlbnNpb24uZXF1YWxzKCJqcyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gd2ViQ29udGV4dC50b1N0cmluZygpOwotCQl9Ci0JCVN0cmluZyB1bm1hbmdsZWQgPSBXZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLmdldFVubWFuZ2VkSHRtbFBhdGgoY29udGFpbmVyUGF0aFN0cmluZyk7Ci0JCWlmICh1bm1hbmdsZWQgIT0gbnVsbCkgewotCQkJSVBhdGggcHJvamVjdFBhdGggPSBqYXZhUHJvamVjdC5nZXRQYXRoKCk7Ci0JCQkvKiBSZXBsYWNlIHRoZSBwcm9qZWN0IHBhdGggd2l0aCB0aGUgcHJvamVjdCBuYW1lICovCi0JCQlpZiAodW5tYW5nbGVkLmluZGV4T2YocHJvamVjdFBhdGgudG9TdHJpbmcoKSkgPj0gMCkgewotCQkJCXVubWFuZ2xlZCA9IGphdmFQcm9qZWN0LmdldERpc3BsYXlOYW1lKCkgKyAiOiIgKyB1bm1hbmdsZWQuc3Vic3RyaW5nKHByb2plY3RQYXRoLnRvU3RyaW5nKCkubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gdW5tYW5nbGVkOwotCQl9Ci0JCXJldHVybiBjb250YWluZXJQYXRoU3RyaW5nOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyI2dldEhvc3RQYXRoKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKi8KLQkKLQlwdWJsaWMgVVJJIGdldEhvc3RQYXRoKElQYXRoIHBhdGgsIElKYXZhU2NyaXB0UHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3RyaW5nIGh0bWxQYXRoID0gV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci5nZXRVbm1hbmdlZEh0bWxQYXRoKHBhdGgudG9TdHJpbmcoKSk7Ci0JCWlmIChodG1sUGF0aCAhPSBudWxsKSB7Ci0JCQlVUkkgZmlsZVVyaSA9ICBuZXcgUGF0aChodG1sUGF0aCkudG9GaWxlKCkudG9VUkkoKTsKLQkJCXJldHVybiBmaWxlVXJpOwotCQkJLy8JCQl0cnkgewotLy8JCQkJcmV0dXJuIG5ldyBVUkkoaHRtbFBhdGgpOwotLy8JCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZXgpIHsKLS8vCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotLy8JCQl9Ci0JCX0KLS8vCQllbHNlIHsKLS8vCQkJdHJ5IHsKLS8vCQkJCXJldHVybiBuZXcgVVJJKHBhdGgudG9TdHJpbmcoKSk7Ci0vLwkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgewotLy8JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotLy8JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCX0KLS8vCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0JCXJldHVybiBJSnNHbG9iYWxTY29wZUNvbnRhaW5lci5LX1NZU1RFTTsKLQl9Ci0JCi0JCi0JcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgUGF0aChKc1dlYk5hdHVyZS5WSVJUVUFMX0NPTlRBSU5FUik7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0SW5jbHVkZXBhdGhFbnRyaWVzKCl9IGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgSUluY2x1ZGVQYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCkgewotCQlyZXR1cm4gZ2V0SW5jbHVkZXBhdGhFbnRyaWVzKCk7Ci0JfQotCXB1YmxpYyBJSW5jbHVkZVBhdGhFbnRyeVtdIGdldEluY2x1ZGVwYXRoRW50cmllcygpIHsKLQkJCi0JCS8vSUluY2x1ZGVQYXRoRW50cnkgZW50cnk9bnVsbDsKLQkJCi0JcmV0dXJuIG5ldyBJSW5jbHVkZVBhdGhFbnRyeVswXTsKLS8vCQl0cnkgewotLy8JCQotLy8JCQkKLS8vCQkJCi0vLwkJCUlQYXRoIGNvbnRleHRQYXRoID0gZ2V0V2ViQ29udGV4dFJvb3QoamF2YVByb2plY3QpOwotLy8JCQkvL2VudHJ5ID1KYXZhU2NyaXB0Q29yZS5uZXdMaWJyYXJ5RW50cnkoY29udGV4dFBhdGgubWFrZUFic29sdXRlKCksIG51bGwsbnVsbCwgbmV3IElBY2Nlc3NSdWxlWzBdLCBuZXcgSUluY2x1ZGVQYXRoQXR0cmlidXRlWzBdLCB0cnVlKTsKLS8vCQkJLy9lbnRyeSA9SmF2YVNjcmlwdENvcmUubmV3TGlicmFyeUVudHJ5KGNvbnRleHRQYXRoLm1ha2VBYnNvbHV0ZSgpLCBudWxsLCBudWxsLCBuZXcgSUFjY2Vzc1J1bGVbMF0sIG5ldyBJSW5jbHVkZVBhdGhBdHRyaWJ1dGVbMF0sIHRydWUpOwotLy8JCQkvL2VudHJ5ID1KYXZhU2NyaXB0Q29yZS5uZXdTb3VyY2VFbnRyeShjb250ZXh0UGF0aC5tYWtlQWJzb2x1dGUoKSk7Ci0vLwkJCWVudHJ5ID0gbmV3IENsYXNzcGF0aEVudHJ5KAotLy8JCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFLAotLy8JCQkJCUlJbmNsdWRlUGF0aEVudHJ5LkNQRV9TT1VSQ0UsCi0vLwkJCQkJY29udGV4dFBhdGgubWFrZUFic29sdXRlKCksCi0vLwkJCQkJQ2xhc3NwYXRoRW50cnkuSU5DTFVERV9BTEwsIENsYXNzcGF0aEVudHJ5LkVYQ0xVREVfTk9ORSwKLS8vCQkJCQludWxsLCAvLyBzb3VyY2UgYXR0YWNobWVudAotLy8JCQkJCW51bGwsIC8vIHNvdXJjZSBhdHRhY2htZW50IHJvb3QKLS8vCQkJCQludWxsLCAvLyBjdXN0b20gb3V0cHV0IGxvY2F0aW9uCi0vLwkJCQkJZmFsc2UsCi0vLwkJCQkJbnVsbCwKLS8vCQkJCQlmYWxzZSwgLy8gbm8gYWNjZXNzIHJ1bGVzIHRvIGNvbWJpbmUKLS8vCQkJCQluZXcgSUluY2x1ZGVQYXRoQXR0cmlidXRlW10ge0NsYXNzcGF0aEVudHJ5LkVYQ0xVREVfVkFMSURBVEV9KTsgCi0vLwkJCQotLy8JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLS8vCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotLy8JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQl9Ci0vLwkJCi0vLwkJaWYoZW50cnkhPW51bGwpIHJldHVybiBuZXcgSUluY2x1ZGVQYXRoRW50cnlbXSB7ZW50cnl9OwotLy8JCXJldHVybiBuZXcgSUluY2x1ZGVQYXRoRW50cnlbMF07Ci0JfQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFTY3JpcHRQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy90aGlzLmphdmFQcm9qZWN0ID0gcHJvamVjdDsKLQkJc3VwZXIuaW5pdGlhbGl6ZShjb250YWluZXJQYXRoLCBwcm9qZWN0KTsKLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0V2ViQ29udGV4dFJvb3QoSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCUlQYXRoIHByb2plY3RSZWxhdGl2ZVdlYlJvb3QgPSBXZWJSb290RmluZGVyLmdldFdlYkNvbnRlbnRGb2xkZXIoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsJCi0JCUlQYXRoIHdlYlJvb3RQYXRoID0gamF2YVByb2plY3QuZ2V0UGF0aCgpLmFwcGVuZChwcm9qZWN0UmVsYXRpdmVXZWJSb290KTsKLQkJcmV0dXJuIHdlYlJvb3RQYXRoOwotCX0KLQkKLS8vCXB1YmxpYyBJUGF0aFtdIGdldEFsbEh0bWxJblByb2plY3QoKSB7Ci0vLwkJZmluYWwgQXJyYXlMaXN0IGZvdW5kID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCVN0cmluZyB3ZWJSb290ID0gZ2V0V2ViQ29udGV4dFJvb3QoamF2YVByb2plY3QpLnRvU3RyaW5nKCk7CQotLy8JCQlJUmVzb3VyY2VQcm94eVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VQcm94eVZpc2l0b3IoKQotLy8JCQl7Ci0vLwkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdCggSVJlc291cmNlUHJveHkgcHJveHkgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotLy8JCQkJewotLy8JCQkJCWlmICggcHJveHkuZ2V0TmFtZSgpLmVuZHNXaXRoKCAiLmh0bSIgKSApCi0vLwkJCQkJewotLy8JCQkJCQlJUGF0aCBwYXRoID0gcHJveHkucmVxdWVzdFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKTsKLS8vCQkJCQkJZm91bmQuYWRkKHBhdGgpOwotLy8JCQkJCQkvL0lJbmNsdWRlUGF0aEVudHJ5IG5ld0xpYnJhcnlFbnRyeSA9IEphdmFTY3JpcHRDb3JlLm5ld0xpYnJhcnlFbnRyeSggcGF0aCxudWxsLCBudWxsLCBuZXcgSUFjY2Vzc1J1bGVbIDAgXSwgbmV3IElJbmNsdWRlUGF0aEF0dHJpYnV0ZVsgMCBdLCB0cnVlICk7Ci0vLwkJCQkJCS8vZW50cmllcy5hZGQoIG5ld0xpYnJhcnlFbnRyeSApOwotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQkJfQotLy8JCQkJCQotLy8JCQkJCXJldHVybiB0cnVlOwotLy8JCQkJfQotLy8JCQl9OwotLy8JCQl0cnkKLS8vCQkJewotLy8JCQkJamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmZpbmRNZW1iZXIoIG5ldyBQYXRoKHdlYlJvb3QpICkuYWNjZXB0KCB2aXNpdG9yLCAwICk7Ci0vLwkJCX0KLS8vCQkJY2F0Y2ggKCBDb3JlRXhjZXB0aW9uIGUgKQotLy8JCQl7Ci0vLwkJCX0KLS8vCQkKLS8vCQkKLS8vCQlyZXR1cm4gKElQYXRoW10pZm91bmQudG9BcnJheShuZXcgSVBhdGhbZm91bmQuc2l6ZSgpXSk7Ci0vLwkKLS8vCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwMWJkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSnNOYXR1cmVVbmluc3RhbGxlci4xPVVuaW5zdGFsbGluZyBKYXZhU2NyaXB0IERldmVsb3BtZW50IFRvb2xzLi4uCi1Kc05hdHVyZVVuaW5zdGFsbGVyLjI9UmVtb3ZpbmcgSmF2YVNjcmlwdCBEZXZlbG9wbWVudCBUb29scyBOYXR1cmUuLi4KLUpzTmF0dXJlVW5pbnN0YWxsZXIuMz1FcnJvciBpbnN0YWxsaW5nIHJ1bnRpbWVcISBKYXZhU2NyaXB0IERldmVsb3BtZW50IFRvb2xzIGNvdWxkIG5vdCBiZSByZW1vdmVkLCBvciBpcyBub3QgcHJlc2VudCBpbiB0YXJnZXQgcHJvamVjdC4uCi1Kc05hdHVyZUluc3RhbGxlci4xPUluc3RhbGxpbmcgSmF2YVNjcmlwdCBEZXZlbG9wbWVudCBUb29scy4uLgotSnNOYXR1cmVJbnN0YWxsZXIuMj1BZGRpbmcgSmF2YVNjcmlwdCBEZXZlbG9wbWVudCBUb29sa2l0IE5hdHVyZS4uLgotSnNOYXR1cmVJbnN0YWxsZXIuMz1FcnJvciBpbnN0YWxsaW5nIHJ1bnRpbWVcISBKYXZhU2NyaXB0IERldmVsb3BtZW50IFRvb2xzIGNvdWxkIG5vdCBiZSBhZGRlZC4uCi1Kc1dlYk5hdHVyZS41PUVycm9yIGNoZWNraW5nIHNvdXJjZXBhdGg6Ci1Kc1dlYk5hdHVyZS42PUVycm9yIGNoZWNraW5nIHNvdXJjZXBhdGg6Ci1XZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLjA9SmF2YVNjcmlwdCBXZWIgUHJvamVjdCBzdXBwb3J0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yRW1iZWRlZEpzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yRW1iZWRlZEpzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Zjg3MzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckVtYmVkZWRKcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlSWRGb3JFbWJlZGVkSnMgewotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0Ci0JICogcHJvdGVjdGVkIG1ldGhvZCBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gQ29udGVudFR5cGVJZHMgPSBDb250ZW50VHlwZUlkRm9yRW1iZWRlZEpzLiBnZXRKc0NvbnN0YW50U3RyaW5nKCk7Ci0KLQlzdGF0aWMgU3RyaW5nW10gZ2V0SnNDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIsIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCXByaXZhdGUgQ29udGVudFR5cGVJZEZvckVtYmVkZWRKcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNDhmODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JQ29kZWRSZXNvdXJjZVBsdWdpbjsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgQ09OVEVOVF9GQU1JTFlfQVRUUklCVVRFID0gbmV3IFF1YWxpZmllZE5hbWUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQsICJjb250ZW50RmFtaWx5QXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQ7Ci0JLyoqCi0JICogRXh0cmEgcHJvcGVydGllcyBhcyBwYXJ0IG9mIENvbnRlbnREZXNjcmlwdGlvbiwgaWYgdGhlIGNvbnRlbnQgaXMgSlNQLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBDT05URU5UX1RZUEVfQVRUUklCVVRFID0gbmV3IFF1YWxpZmllZE5hbWUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQsICJjb250ZW50VHlwZUF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIExBTkdVQUdFX0FUVFJJQlVURSA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAibGFuZ3VhZ2VBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9Kc1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9Kc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTI0ZmQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotcHVibGljIGNsYXNzIEpzVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yLCBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanN2YWxpZGF0b3IiKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElWYWxpZGF0b3IgZk1lc3NhZ2VPcmlnaW5hdG9yOwotCXByaXZhdGUgU2V0IGZWYWxpZEZpbGVFeHRzID0gbmV3IEhhc2hTZXQoKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNRVRBREFUQV9GSUxFUyA9IG5ldyBTdHJpbmdbXXsiLnNldHRpbmdzLy5qc2R0c2NvcGUiLCIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc3VwZXJUeXBlLmNvbnRhaW5lciIsIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuanNkdC51aS5zdXBlclR5cGUubmFtZSJ9OwotCQotLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFtdIGpzZHRWYWxpZGF0b3IgPSB7Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnNCYXRjaFZhbGlkYXRvciJ9OyAvLyROT04tTkxTLTEkCi0KLQkKLQlwcm90ZWN0ZWQgY2xhc3MgTG9jYWxpemVkTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2UgewotCQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZSA9IG51bGw7Ci0JCQotCQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCkgewotCQkJdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIG51bGwpOwotCQl9Ci0JCQotCQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgSVJlc291cmNlIHRhcmdldE9iamVjdCkgewotCQkJdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIChPYmplY3QpIHRhcmdldE9iamVjdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCQlzdXBlcihudWxsLCBzZXZlcml0eSwgbnVsbCk7Ci0JCQlzZXRMb2NhbGl6ZWRNZXNzYWdlKG1lc3NhZ2VUZXh0KTsKLQkJCXNldFRhcmdldE9iamVjdCh0YXJnZXRPYmplY3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gX21lc3NhZ2U7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KENsYXNzTG9hZGVyIGNsKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsLCBDbGFzc0xvYWRlciBjbCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0TG9jYWxpemVkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQkJX21lc3NhZ2UgPSBtZXNzYWdlOwotCQl9Ci0JfQotCXB1YmxpYyBKc1ZhbGlkYXRvcigpIHsKLQkJdGhpcy5mTWVzc2FnZU9yaWdpbmF0b3IgPSB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIElNZXNzYWdlIGZyb20gYW4gSVByb2JsZW0KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYmxlbQotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHRyYW5zbGF0aW9uCi0JICogQHBhcmFtIHRleHREb2MKLQkgKiBAcmV0dXJuIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb2JsZW0sIG9yIG51bGwgaWYgaXQgY291bGQgbm90Ci0JICogICAgICAgICBjcmVhdGUgb25lCi0JICovCi0JcHJpdmF0ZSBJTWVzc2FnZSBjcmVhdGVNZXNzYWdlRnJvbVByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSwgSUZpbGUgZiwgSUpzVHJhbnNsYXRpb24gdHJhbnNsYXRpb24sIElEb2N1bWVudCB0ZXh0RG9jKSB7Ci0JCWludCBzb3VyY2VTdGFydCA9IHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKTsKLQkJaW50IHNvdXJjZUVuZCA9IHByb2JsZW0uZ2V0U291cmNlRW5kKCk7Ci0JCWlmIChzb3VyY2VTdGFydCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIEJ1ZyAyNDE3OTQgLSBWYWxpZGF0aW9uIHNob3dzIGVycm9ycyB3aGVuIHVzaW5nIEpTUCBFeHByZXNzaW9ucwotCQkgKiBpbnNpZGUgSmF2YVNjcmlwdCBjb2RlCi0JCSAqLwotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IChJU3RydWN0dXJlZERvY3VtZW50KSB0ZXh0RG9jOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gZG9jLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHNvdXJjZVN0YXJ0KTsKLQkJaWYgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzb3VyY2VTdGFydCk7Ci0JCQkvKgotCQkJICogRmlsdGVyIG91dCBwcm9ibGVtcyBmcm9tIGFyZWFzIHRoYXQgYXJlbid0IHNpbXBsZSBKYXZhU2NyaXB0LAotCQkJICogZS5nLiBKU1AuCi0JCQkgKi8KLQkJCWlmICh0ZXh0UmVnaW9uICE9IG51bGwgJiYgdGV4dFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWludCBzZXYgPSBwcm9ibGVtLmlzRXJyb3IoKSA/IElNZXNzYWdlLkhJR0hfU0VWRVJJVFkgOiAocHJvYmxlbS5pc1dhcm5pbmcoKSA/IElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSA6IElNZXNzYWdlLkxPV19TRVZFUklUWSk7Ci0JCUlNZXNzYWdlIG0gPSBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXYsIHByb2JsZW0uZ2V0TWVzc2FnZSgpLCBmKTsKLQkJLy8gbGluZSBudW1iZXJzIGZvciBtYXJrZXIgc3RhcnRzIEAgMQotCQkvLyBsaW5lIG51bWJlcnMgZnJvbSBkb2N1bWVudCBzdGFydHMgQCAwCi0JCXRyeSB7Ci0JCQlpbnQgbGluZU5vID0gdGV4dERvYy5nZXRMaW5lT2ZPZmZzZXQoc291cmNlU3RhcnQpICsgMTsKLQkJCW0uc2V0TGluZU5vKGxpbmVObyk7Ci0JCQltLnNldE9mZnNldChzb3VyY2VTdGFydCk7Ci0JCQltLnNldExlbmd0aChzb3VyY2VFbmQgLSBzb3VyY2VTdGFydCArIDEpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBtOwotCX0KLQkKLQl2b2lkIHBlcmZvcm1WYWxpZGF0aW9uKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlciwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgYm9vbGVhbiBpbkJhdGNoKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0JCQlzZXR1cEFkYXB0ZXJGYWN0b3J5KGRvbU1vZGVsKTsKLQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgdHJhbnNsYXRpb25BZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkvL3RyYW5zbGF0aW9uQWRhcHRlci5yZXNvdXJjZUNoYW5nZWQoKTsKLQkJCUlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25BZGFwdGVyLmdldEpzVHJhbnNsYXRpb24oZmFsc2UpOwotCQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJdHJhbnNsYXRpb24uc2V0UHJvYmxlbUNvbGxlY3RpbmdBY3RpdmUodHJ1ZSk7Ci0JCQkJdHJhbnNsYXRpb24ucmVjb25jaWxlQ29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJTGlzdCBwcm9ibGVtcyA9IHRyYW5zbGF0aW9uLmdldFByb2JsZW1zKCk7Ci0vLwkJCQlpZighaW5CYXRjaCkgcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcywgZik7Ci0JCQkJLy8gYWRkIG5ldyBtZXNzYWdlcwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvYmxlbXMuc2l6ZSgpICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQkJSU1lc3NhZ2UgbSA9IGNyZWF0ZU1lc3NhZ2VGcm9tUHJvYmxlbSgoSVByb2JsZW0pIHByb2JsZW1zLmdldChpKSwgZiwgdHJhbnNsYXRpb24sIGRvbU1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQkJaWYgKG0gIT0gbnVsbCkgewotCQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qIFJlYWQgdGhlIGRlZmluaXRpb24gZm9yIHRoaXMgdmFsaWRhdG9yIGFuZCB0aGUgZGVjbGFyZWQgdmFsaWQgZmlsZSBleHRlbnNpb25zCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb24jc2V0SW5pdGlhbGl6YXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGluY2x1ZGVzID0gY29uZmlnLmdldENoaWxkcmVuKCJpbmNsdWRlIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmlsZWV4dHMgPSBpbmNsdWRlc1tpXS5nZXRDaGlsZHJlbigiZmlsZWV4dCIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGZpbGVleHRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJU3RyaW5nIGZpbGVleHQgPSBmaWxlZXh0c1tqXS5nZXRBdHRyaWJ1dGUoImV4dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGZpbGVleHQgIT0gbnVsbCkgewotCQkJCQlmVmFsaWRGaWxlRXh0cy5hZGQoZmlsZWV4dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCBvdXIgdHJhbnNsYXRpb24gYWRhcHRlciBpcyBwcmVzZW50IGJlZm9yZSB3ZSB0cnkgdG8gdXNlIGl0Ci0JICogCi0JICogQHBhcmFtIHNtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldHVwQWRhcHRlckZhY3RvcnkoSVN0cnVjdHVyZWRNb2RlbCBzbSkgewotCQlpZiAoc20uZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcykgPT0gbnVsbCkgewotCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlzbS5nZXRGYWN0b3J5UmVnaXN0cnkoKS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JfQotCQotCWJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSUZpbGUgZmlsZSkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWxlOwotCQlkbyB7Ci0JCQlpZiAocmVzb3VyY2UuaXNEZXJpdmVkKCkgfHwgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpIHx8ICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSB8fCByZXNvdXJjZS5nZXROYW1lKCkuY2hhckF0KDApID09ICcuJykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCX0gd2hpbGUgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPT0gMCk7Ci0JCXJldHVybiBmVmFsaWRGaWxlRXh0cy5pc0VtcHR5KCkgfHwgZlZhbGlkRmlsZUV4dHMuY29udGFpbnMoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLyogQWRkZWQgYnkgQkMgLS0tLSAqLwotCQkvLyBpZih0cnVlKSByZXR1cm47Ci0JCS8qIGVuZCBBZGRlZCBieSBCQyAtLS0tICovCi0JCQotCQlTdHJpbmdbXSB1cmlzID0gaGVscGVyLmdldFVSSXMoKTsKLQkJaWYgKHVyaXMubGVuZ3RoID4gMCkgewotCQkJSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlGaWxlIGN1cnJlbnRGaWxlID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJpcy5sZW5ndGggJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCk7IGkrKykgewotCQkJCWN1cnJlbnRGaWxlID0gd3NSb290LmdldEZpbGUobmV3IFBhdGgodXJpc1tpXSkpOwotCQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMsIGN1cnJlbnRGaWxlKTsKLQkJCQlpZiAoY3VycmVudEZpbGUgIT0gbnVsbCAmJiBjdXJyZW50RmlsZS5leGlzdHMoKSkgewotCQkJCQlpZiAoc2hvdWxkVmFsaWRhdGUoY3VycmVudEZpbGUpICl7IC8vJiYgZnJhZ21lbnRDaGVjayhjdXJyZW50RmlsZSkpIHsKLQkJCQkJCWludCBwZXJjZW50ID0gKGkgKiAxMDApIC8gdXJpcy5sZW5ndGggKyAxOwotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgcGVyY2VudCArICIlICIgKyB1cmlzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzc2FnZSk7Ci0JCQkJCQl2YWxpZGF0ZUZpbGUoY3VycmVudEZpbGUsIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidmFsaWRhdGluZzogWyIgKyB1cmlzW2ldICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiB1cmlzW10gbGVuZ3RoIDAgLT4gdmFsaWRhdGUoKSBnZXRzIGNhbGxlZCBmb3IgZWFjaCBwcm9qZWN0Ci0JCQlpZiAoaGVscGVyIGluc3RhbmNlb2YgSVdvcmtiZW5jaENvbnRleHQpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKChJV29ya2JlbmNoQ29udGV4dCkgaGVscGVyKS5nZXRQcm9qZWN0KCk7Ci0JCQkJSlNGaWxlVmlzaXRvciB2aXNpdG9yID0gbmV3IEpTRmlsZVZpc2l0b3IocmVwb3J0ZXIpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIGNvbGxlY3QgYWxsIGpzcCBmaWxlcyBmb3IgdGhlIHByb2plY3QKLQkJCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCUlGaWxlW10gZmlsZXMgPSB2aXNpdG9yLmdldEZpbGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGggJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCk7IGkrKykgewotCQkJCQlpbnQgcGVyY2VudCA9IChpICogMTAwKSAvIGZpbGVzLmxlbmd0aCArIDE7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIHBlcmNlbnQgKyAiJSAiICsgZmlsZXNbaV0uZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJdmFsaWRhdGVGaWxlKGZpbGVzW2ldLCByZXBvcnRlcik7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0aW5nOiBbIiArIGZpbGVzW2ldICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgSlNGaWxlVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0JCXByaXZhdGUgTGlzdCBmRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByaXZhdGUgSVJlcG9ydGVyIGZSZXBvcnRlciA9IG51bGw7Ci0JCQotCQlwdWJsaWMgSlNGaWxlVmlzaXRvcihJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJCWZSZXBvcnRlciA9IHJlcG9ydGVyOwotCQl9Ci0JCQotCQlwdWJsaWMgZmluYWwgSUZpbGVbXSBnZXRGaWxlcygpIHsKLQkJCXJldHVybiAoSUZpbGVbXSkgZkZpbGVzLnRvQXJyYXkobmV3IElGaWxlW2ZGaWxlcy5zaXplKCldKTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkvLyBjaGVjayB2YWxpZGF0aW9uCi0JCQlpZiAoZlJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJaWYgKFV0aWwuaXNKc1R5cGUocHJveHkuZ2V0TmFtZSgpKSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgc2hvdWxkVmFsaWRhdGUoZmlsZSkpIHsKLQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCspIEpTUFZhbGlkYXRvciBhZGRpbmcgZmlsZTogIiArIGZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZkZpbGVzLmFkZChmaWxlKTsKLQkJCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCS8qKgotCSAqIFZhbGlkYXRlIG9uZSBmaWxlLiBJdCdzIGFzc3VtZWQgdGhhdCB0aGUgZmlsZSBoYXMgSlNQIGNvbnRlbnQgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gZgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqLwotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmlsZShJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKEpzVmFsaWRhdG9yLkRFQlVHKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmFsaWRhdGluZzogIiArIGYpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBnZXQganNwIG1vZGVsLCBnZXQgdHJhbmxzYXRpb24KLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZik7Ci0JCQlpZiAoIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgJiYgbW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIGdldCBET00gbW9kZWwgdGhlbiB0cmFuc2xhdGlvbgotCQkJCS8vV29ya2JlbmNoUmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXMoZi5nZXRQcm9qZWN0KCksIGpzZHRWYWxpZGF0b3IsIGYudG9TdHJpbmcoKSk7Ci0JCQkJLy9yZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyhmTWVzc2FnZU9yaWdpbmF0b3IsIGYpOwotCQkJCXBlcmZvcm1WYWxpZGF0aW9uKGYsIHJlcG9ydGVyLCBtb2RlbCwgZmFsc2UpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JfQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUgfHwgIXNob3VsZFZhbGlkYXRlKChJRmlsZSkgcmVzb3VyY2UpKQotCQkJcmV0dXJuIG51bGw7Ci0JCVZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKLQkJSVJlcG9ydGVyIHJlcG9ydGVyID0gcmVzdWx0LmdldFJlcG9ydGVyKG1vbml0b3IpOwotCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQkJdmFsaWRhdGVGaWxlKGZpbGUsIHJlcG9ydGVyKTsKLQkJcmVzdWx0LnNldERlcGVuZHNPbihjcmVhdGVEZXBlbmRlbmNpZXMoZmlsZSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSVJlc291cmNlW10gY3JlYXRlRGVwZW5kZW5jaWVzKElGaWxlIGZpbGUpIHsKLQkJSUZpbGVbXSBkZXBlbmRzID0gbmV3IElGaWxlW01FVEFEQVRBX0ZJTEVTLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgTUVUQURBVEFfRklMRVMubGVuZ3RoOyBpKyspIHsKLQkJCWRlcGVuZHNbaV0gPSBmaWxlLmdldFByb2plY3QoKS5nZXRGaWxlKE1FVEFEQVRBX0ZJTEVTW2ldKTsKLQkJfQotCQlyZXR1cm4gZGVwZW5kczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1V0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTg0YTcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckVtYmVkZWRKczsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgVXRpbCB7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSnNUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlpZihmaWxlTmFtZT09bnVsbCkgcmV0dXJuIGZhbHNlOwotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCUlDb250ZW50VHlwZVtdIHR5cGVzID1nZXRKYXZhc2NyaXB0Q29udGVudFR5cGVzKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHR5cGVzIT1udWxsICYmIGkgPCB0eXBlcy5sZW5ndGggJiYgIXZhbGlkKSB7Ci0JCQl2YWxpZCA9IHR5cGVzW2ldIT1udWxsICYmIHR5cGVzW2ldLmlzQXNzb2NpYXRlZFdpdGgoZmlsZU5hbWUpOwotCQkJKytpOwotCQl9Ci0JCXJldHVybiB2YWxpZDsKLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUNvbnRlbnRUeXBlW10gZ2V0SmF2YXNjcmlwdENvbnRlbnRUeXBlcygpIHsKLQotCQlTdHJpbmdbXSBjb250ZW50VHlwZUlkcyA9IENvbnRlbnRUeXBlSWRGb3JFbWJlZGVkSnMuQ29udGVudFR5cGVJZHM7Ci0JCUFycmF5TGlzdCBmQ29udGVudFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJCi0JCWZvcihpbnQgaSA9IDA7aTxjb250ZW50VHlwZUlkcy5sZW5ndGg7aSsrKSB7Ci0JCQlJQ29udGVudFR5cGUgY3QgPSAgUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJZHNbaV0pOwotCQkJaWYoY3QhPW51bGwpIGZDb250ZW50VHlwZXMuYWRkKGN0KTsKLQkJfQotCQkKLQkJcmV0dXJuIChJQ29udGVudFR5cGVbXSlmQ29udGVudFR5cGVzLnRvQXJyYXkobmV3IElDb250ZW50VHlwZVtmQ29udGVudFR5cGVzLnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvQ29tcGlsYXRpb25Vbml0SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0NvbXBpbGF0aW9uVW5pdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGJlYjg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvQ29tcGlsYXRpb25Vbml0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0VW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklQcm9ibGVtUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuV29ya2luZ0NvcHlPd25lcjsKLQotLyoqCi0KLQotCi0KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogPGJyPjxicj4gdGhpcyBjb2RlIHdhcyB0YWtlbiBmcm9tIHRoZSBKU1AgcGx1Z2luLiAgVGhpcyBjbGFzcyBpcyB0byBlbnN1cmUgb25seSBvbmUgY29weSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBleGl0cy4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIENvbXBpbGF0aW9uVW5pdEhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29tcGlsYXRpb25Vbml0SGVscGVyIGluc3RhbmNlOwotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIGZpbmFsIENvbXBpbGF0aW9uVW5pdEhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKENvbXBpbGF0aW9uVW5pdEhlbHBlci5pbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlDb21waWxhdGlvblVuaXRIZWxwZXIuaW5zdGFuY2UgPSBuZXcgQ29tcGlsYXRpb25Vbml0SGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIENvbXBpbGF0aW9uVW5pdEhlbHBlci5pbnN0YW5jZTsKLQl9Ci0JcHJpdmF0ZSBKc1Byb2JsZW1SZXF1ZXN0b3IgZlByb2JsZW1SZXF1ZXN0b3IgPSBudWxsOwotCXByaXZhdGUgV29ya2luZ0NvcHlPd25lciBmV29ya2luZ0NvcHlPd25lciA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBDb21waWxhdGlvblVuaXRIZWxwZXIoKSB7Ci0JLy8gZm9yY2UgdXNlIG9mIGluc3RhbmNlCi0JfQotCQotCXB1YmxpYyBKc1Byb2JsZW1SZXF1ZXN0b3IgZ2V0UHJvYmxlbVJlcXVlc3RvcigpIHsKLQkJaWYgKGZQcm9ibGVtUmVxdWVzdG9yID09IG51bGwpIHsKLQkJCWZQcm9ibGVtUmVxdWVzdG9yID0gbmV3IEpzUHJvYmxlbVJlcXVlc3RvcigpOwotCQl9Ci0JCXJldHVybiBmUHJvYmxlbVJlcXVlc3RvcjsKLQl9Ci0JCi0JcHVibGljIFdvcmtpbmdDb3B5T3duZXIgZ2V0V29ya2luZ0NvcHlPd25lcigpIHsKLQkJaWYgKGZXb3JraW5nQ29weU93bmVyID09IG51bGwpIHsKLQkJCWZXb3JraW5nQ29weU93bmVyID0gbmV3IFdvcmtpbmdDb3B5T3duZXIoKSB7Ci0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5Xb3JraW5nQ29weU93bmVyI2dldFByb2JsZW1SZXF1ZXN0b3Iob3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQpCi0JCQkJICovCi0JCQkJcHVibGljIElQcm9ibGVtUmVxdWVzdG9yIGdldFByb2JsZW1SZXF1ZXN0b3IoSUphdmFTY3JpcHRVbml0IHdvcmtpbmdDb3B5KSB7Ci0JCQkJCXJldHVybiBDb21waWxhdGlvblVuaXRIZWxwZXIudGhpcy5nZXRQcm9ibGVtUmVxdWVzdG9yKCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiQ2xpZW50IEphdmFTY3JpcHQgV29ya2luZ0NvcHlPd25lciI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBmV29ya2luZ0NvcHlPd25lcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0RvY3VtZW50Q2hhbmdlTGlzdGVuZXJUb1RleHRFZGl0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0RvY3VtZW50Q2hhbmdlTGlzdGVuZXJUb1RleHRFZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMjBiYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Eb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKiA8YnI+PGJyPgotKiAKLSogdGhpcyBjbGFzcyBhdHRhY2hlcyB0byBhICJjbG9uZWQiIGRvY3VtZW50LCBsaXN0ZW5zIGZvciBjaGFuZ2VzIHRvIHRoYXQgZG9jdW1lbnQgdGhlbiB0cmFuc2xhdGVzCi0qIHRoZSBjaGFuZ2VzIHRvIHRleHQgZWRpdHMuICB0aGVzZSBjaGFuZ2VzIGNhbiB0aGVuIGJlIGFwcGxpZWQgYmFjayB0byB0aGUgb3JpZ2luYWwgZG9jdW1lbnQuCi0qIAotKgotKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdCBpbXBsZW1lbnRzIElEb2N1bWVudExpc3RlbmVyIHsKLQlwcml2YXRlIE11bHRpVGV4dEVkaXQgdGV4dEVkaXQ7Ci0JCi0JcHVibGljIERvY3VtZW50Q2hhbmdlTGlzdGVuZXJUb1RleHRFZGl0KCkgewotCQl0ZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJVbmltcGxlbWVudGVkCi0JLy8gbWV0aG9kOkRvY3VtZW50Q2hhbmdlTGlzdGVuZXJUb1RleHRFZGl0LmRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZCIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpbnQgbGVuZ3RoID0gZXZlbnQuZ2V0TGVuZ3RoKCk7Ci0JCWludCBvZmZzZXQgPSBldmVudC5nZXRPZmZzZXQoKTsKLQkJU3RyaW5nIHRleHQgPSBldmVudC5nZXRUZXh0KCk7Ci0JCWlmIChsZW5ndGggPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQkvKiBpbnNlcnRpbmcgdGV4dCBvcGVyYXRpb24gKi8KLQkJCUluc2VydEVkaXQgZWRpdCA9IG5ldyBJbnNlcnRFZGl0KG9mZnNldCwgdGV4dCk7Ci0JCQl0ZXh0RWRpdC5hZGRDaGlsZChlZGl0KTsKLQkJCQotCQl9IGVsc2UgaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLyogZGVsZXRlIG9wZXJhdGlvbiAqLwotCQkJRGVsZXRlRWRpdCBlZGl0ID0gbmV3IERlbGV0ZUVkaXQob2Zmc2V0LCBsZW5ndGgpOwotCQkJdGV4dEVkaXQuYWRkQ2hpbGQoZWRpdCk7Ci0JCQkKLQkJfSBlbHNlIGlmIChsZW5ndGggPiAwKSB7Ci0JCQkvKiByZXBsYWNlIHRleHQgb3BlcmF0aW9uICovCi0JCQlSZXBsYWNlRWRpdCBlZGl0ID0gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCwgbGVuZ3RoLCB0ZXh0KTsKLQkJCXRleHRFZGl0LmFkZENoaWxkKGVkaXQpOwotCQkKLQkJfQotCX0KLQkKLQlwdWJsaWMgTXVsdGlUZXh0RWRpdCBnZXRUZXh0RWRpdHMoKSB7Ci0JCXJldHVybiB0ZXh0RWRpdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0hUTUw0ME5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9IVE1MNDBOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0ZDIyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0hUTUw0ME5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9JSnNUcmFuc2xhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9JSnNUcmFuc2xhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTZkZDIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSUpzVHJhbnNsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogICAgIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuPGJyPgotKiAKLSovCi1wdWJsaWMgaW50ZXJmYWNlIElKc1RyYW5zbGF0aW9uIHsKLQotCS8qKgotCSAqIEByZXR1cm4gSUphdmFTY3JpcHRQcm9qZWN0IHRoYXQgdGhpcyB0cmFuc2xhdGlvbiBiZWxvbmdzIHRvCi0JICovCi0JcHVibGljIElKYXZhU2NyaXB0UHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOwotCi0JLyoqCi0JICogQHJldHVybiBPcmlnaW5hbCBIVE1MIGRvY3VtZW50IGZyb20gdGhlIHRyYW5zbGF0aW9uLgotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0SHRtbERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludGVnZXIgcG9zaXRpb24gb2YgYSBtaXNzaW5nIDwvc2NyaXB0PiB0YWcgKHRoZSBkb2N1bWVudCBpc24ndCB3ZWxsIGZvcm1lZCBhbmQgcmVzdWx0ZWQgaW4gdHJhbnNsYXRpb24gZXJyb3IuKS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pc3NpbmdUYWdTdGFydCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGphdmFQb3NpdGlvblN0YXJ0Ci0JICogQHBhcmFtIGphdmFQb3NpdGlvbkVuZAotCSAqIEByZXR1cm4gYWxsIGphdmFzY3JpcHQgZWxlbWVudHMgd2l0aGluIHRoZSBnaXZlbiByYW5nZQotCSAqLwotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRBbGxFbGVtZW50c0luSnNSYW5nZShpbnQgamF2YVBvc2l0aW9uU3RhcnQsIGludCBqYXZhUG9zaXRpb25FbmQpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgamF2YXNjcmlwdCB1bml0IGZyb20gdGhlIGpzZHQuY29yZQotCSAqLwotCXB1YmxpYyBJSmF2YVNjcmlwdFVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gamF2YVBvc2l0aW9uU3RhcnQKLQkgKiBAcGFyYW0gamF2YVBvc2l0aW9uRW5kCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRFbGVtZW50c0Zyb21Kc1JhbmdlKGludCBqYXZhUG9zaXRpb25TdGFydCwgaW50IGphdmFQb3NpdGlvbkVuZCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHN0cmluZyBvZiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIdG1sVGV4dCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGpzT2Zmc2V0Ci0JICogQHJldHVybiBhIHNpbmdsZSBqYXZhc2NyaXB0IGVsZW1lbnQgYXQgdGhlIGdpdmVuIG9mZnNldC4KLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50IGdldEpzRWxlbWVudEF0T2Zmc2V0KGludCBqc09mZnNldCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9ubHkgdGhlIHRyYW5zbGF0ZWQgamF2YXNjcmlwdCB0ZXh0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRKc1RleHQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBzY3JpcHQgcmVnaW9ucyB3aXRoaW4gdGhlIHRyYW5zbGF0aW9uLgotCSAqLwotCXB1YmxpYyBQb3NpdGlvbltdIGdldFNjcmlwdFBvc2l0aW9ucygpOwotCi0JLyoqCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnRJbkZpcnN0U2NyaXB0UmVnaW9uKFN0cmluZyB0ZXh0KTsKLQotCS8qKgotCSAqIGluc2VydCBqYXZhc2NyaXB0IGF0IHRoZSBnaXZlbiBvZmZzZXQuICBtZXRob2Qgc2hvdWxkIGVuc3VyZSB0aGUgZG9jdW1lbnRzIHdlbGwtZm9ybWVkbmVzcyBhbmQgcHJvcGVyIHNjcmlwdCByZWdpb24uCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0U2NyaXB0KGludCBvZmZzZXQsIFN0cmluZyB0ZXh0KTsKLQotCS8qKgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGphdmFzY3JpcHQgZXJyb3JzCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvYmxlbXMoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIGlmIHRoZSBvZmZzZXQgaXMgd2l0aGluIGEgc2NyaXB0IGltcG9ydCBub2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlmT2Zmc2V0SW5JbXBvcnROb2RlKGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogY2hlY2tzIHRoZSBDVSBmb3IgZXJyb3JzL2NvbnNpc3RhbmN5LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlY29uY2lsZUNvbXBpbGF0aW9uVW5pdCgpOwotCi0JLyoqCi0JICogcmVsZWFzZSB0aGUgdHJhbnNsYXRpb24uICBhbHdheXMgYSBnb29kIGlkZWEgdG8gZG8gd2hlbiB5b3UncmUgZG9uZS4gIHlvdSBtYXkgbm90aWNlIGRvY3VtZW50IGFuZCBtb2RlbCBsb2NrcyBpZiBub3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpOwotCQotCS8qKgotCSAqIGZpeGVzIGEgbWFuZ2xlZCBodG1sLS0+IHB1cmUganMgbmFtZS4KLQkgKiBAcGFyYW0gZGlzcGxheVN0cmluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZpeHVwTWFuZ2xlZE5hbWUoU3RyaW5nIGRpc3BsYXlTdHJpbmcpOyAKLQkKLQkvKioKLQkgKiBzdGFydC9zdG9wIGNvbGxlY3RpbmcgcHJvYmxlbXMgd2l0aGluIHRoZSBqYXZhc2NyaXB0IHVuaXQuCi0JICogQHBhcmFtIGNvbGxlY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ibGVtQ29sbGVjdGluZ0FjdGl2ZShib29sZWFuIGNvbGxlY3QpOwotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFQYXRoKCk7Ci0JCi0JLyoqCi0JICogCi0JICogCi0JICogQHBhcmFtIGh0bWxEb2N1bWVudAotCSAqIEBwYXJhbSBqYXZhUHJvagotCSAqIEBwYXJhbSBsaXN0ZW5Gb3JDaGFuZ2VzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJSnNUcmFuc2xhdGlvbiBnZXRJbnN0YW5jZShJU3RydWN0dXJlZERvY3VtZW50IGh0bWxEb2N1bWVudCwgSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qLCBib29sZWFuIGxpc3RlbkZvckNoYW5nZXMpIDsKLQotCS8qKgotCSAqIG5vdGlmeSB0aGUgdHJhbnNsYXRpb24gdG8gdXBkYXRlIGFueSBleHRlcm5hbCBkZXBlbmRhbmNpZXMgdGhhdCBhcmUgY3JlYXRlZCBkdXJpbmcgdHJhbnNsYXRpb24KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGFzc3BhdGhDaGFuZ2UoKSA7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9JSnNUcmFuc2xhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0lKc1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyNmNhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0lKc1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogICAgIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpzVHJhbnNsYXRvciBleHRlbmRzIElEb2N1bWVudExpc3RlbmVyewotCi0JLyoqCi0JICogQHJldHVybiBzdHJpbmcgb2YgamF2YXNjcmlwdCBmcm9tIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SnNUZXh0KCk7Ci0KLQkvKioKLQkgKiBzZXRzIHRoZSBqYXZhc2NyaXB0IHVuaXQgYnVmZmVyCi0JICogQHBhcmFtIGJ1ZmZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJ1ZmZlcihJQnVmZmVyIGJ1ZmZlcik7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBodG1sIGxvY2F0aW9ucyB3aXRoaW4gdGhlIGRvY3VlbW50LgotCSAqLwotCXB1YmxpYyBQb3NpdGlvbltdIGdldEh0bWxMb2NhdGlvbnMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHJlZ2lvbiBvZiBhIG1pc3NpbmcgPC9zY3JpcHQ+IHRhZwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWlzc2luZ0VuZFRhZ1JlZ2lvblN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHBvc2l0aW9uIGFycmF5IG9mIDxzY3JpcHQgc3JjPSIuLiI+IHdpdGhpbiB0aGUgZG9jLgotCSAqLwotCXB1YmxpYyBQb3NpdGlvbltdIGdldEltcG9ydEh0bWxSYW5nZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gcmF3L3VucmVzb2x2ZWQgPHNjcmlwdCBpbXBvcnRzPgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSYXdJbXBvcnRzKCk7Ci0KLQkvKioKLQkgKiAgYmVnaW4gdHJhbnNsYXRpbmcgdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHRyYW5zbGF0ZSgpOwotCi0JLyoqCi0JICogdHJhbnNsYXRlcyBhbiBpbmxpbmUgKGV2ZW50PSIuLiIpIGpzIGNvbnRhaW5lciByZWdpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGRvY3VtZW50IHRleHQuICBtdXN0IGJlIGNhbGxlZCBpbiBvcmRlcgotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGVJbmxpbmVKU05vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250YWluZXIpOwotCi0JLyoqCi0JICogdHJhbnNsYXRlcyBhIHNjcmlwdCBibG9jay4gIG11c3QgYmUgY2FsbGVkIGluIHRoZSBvcmRlciBpdCBhcHBlYXJzIHdpdGhpbiB0aGUgZG9jdW1lbnQuCi0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHRyYW5zbGF0ZUpTTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiB0cmFuc2xhdGVzIGEgPHNjcmlwdCBzcmM9Ii4uIj4gZWxlbWVudCwgcGFyc2luZyBvdXQgYW4gaW1wb3J0LgotCSAqIEBwYXJhbSByZWdpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGVTY3JpcHRJbXBvcnROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKTsKLQotCS8qKgotCSAqIHJlbGVhc2UgYW55IHJlc291cmNlcyB0aGUgdHJhbnNsYXRpb24gaXMgaG9sZGluZyBvbnRvLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNEYXRhVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNEYXRhVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkMmFlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzRGF0YVR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBKc0RhdGFUeXBlcyBleHRlbmRzIEhUTUw0ME5hbWVzcGFjZSB7Ci0JLyoKLQkgKiByZW1vdmUgd2hlbiB3aGVuIHdlIHJlZmFjdG9yIChuZWVkIHRvIGFkZCB0aGlzIGNvbnRlbnQgdHlwZSB0byBtYW55Ci0JICogcHJvamVjdCB0eXBlcyBpbiB3c3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9GSUxFX0VYVEVOU0lPTiA9ICIuanMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBDT05TVEFOVFMgPSB7ICJmYWxzZSIsICJudWxsIiwgInRydWUiIH07IC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRVZFTlRTID0geyBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQ0xJQ0ssIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05EQkxDTElDSywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTk1PVVNFRE9XTiwKLQkJCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRVVQLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OTU9VU0VPVkVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OTU9VU0VNT1ZFLAotCQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTk1PVVNFT1VULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OS0VZUFJFU1MsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05LRVlET1dOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OS0VZVVAsCi0JCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OSEVMUCB9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSFRNTEFUUkVWRU5UUyA9IHsgIm9ubG9hZCAiLCAib251bmxvYWQiLCAib25jbGljayIsICJvbm1vdXNlZG93biIsICJvbm1vdXNldXAiLCAib25tb3VzZW92ZXIiLCAib25tb3VzZW1vdmUiLCAib25tb3VzZW91dCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIm9uZm9jdXMiLCAib25ibHVyIiwgIm9ua2V5cHJlc3MiLCAib25rZXlkb3duIiwgIm9ua2V5dXAiLCAib25zdWJtaXQiLCAib25yZXNldCIsICJvbnNlbGVjdCIsICJvbmNoYW5nZSIsIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTkkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKU1ZBTElEREFUQVRZUEVTID0geyAiSkFWQVNDUklQVCIsICJURVhUL0pBVkFTQ1JJUFQiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gS0VZV09SRFMgPSB7ICJhYnN0cmFjdCIsICJicmVhayIsICJjYXNlIiwgImNhdGNoIiwgImNsYXNzIiwgImNvbnN0IiwgImNvbnRpbnVlIiwgImRlYnVnZ2VyIiwgImRlZmF1bHQiLCAiZGVsZXRlIiwgImRvIiwgImVsc2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTEwJCAvLyROT04tTkxTLTExJCAvLyROT04tTkxTLTEyJAotCQkJImVudW0iLCAiZXhwb3J0IiwgImV4dGVuZHMiLCAiZmluYWwiLCAiZmluYWxseSIsICJmb3IiLCAiZnVuY3Rpb24iLCAiZ290byIsICJpZiIsICJpbXBsZW1lbnRzIiwgImltcG9ydCIsICJpbiIsICJpbnN0YW5jZW9mIiwgImludGVyZmFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTkkIC8vJE5PTi1OTFMtMTAkIC8vJE5PTi1OTFMtMTEkIC8vJE5PTi1OTFMtMTIkIC8vJE5PTi1OTFMtMTMkIC8vJE5PTi1OTFMtMTQkCi0JCQkibmF0aXZlIiwgIm5ldyIsICJwYWNrYWdlIiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInB1YmxpYyIsICJyZXR1cm4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckCi0JCQkic3RhdGljIiwgInN1cGVyIiwgInN3aXRjaCIsICJzeW5jaHJvbml6ZWQiLCAidGhpcyIsICJ0aHJvdyIsICJ0aHJvd3MiLCAidHJhbnNpZW50IiwgInRyeSIsICJ0eXBlb2YiLCAidm9sYXRpbGUiLCAid2hpbGUiLCAid2l0aCIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtOSQgLy8kTk9OLU5MUy0xMCQgLy8kTk9OLU5MUy0xMSQgLy8kTk9OLU5MUy0xMiQgLy8kTk9OLU5MUy0xMyQKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwotCS8vIE5FV19QQVJUSVRJT05fVFlQRT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuU3RydWN0dXJlZEpzIjsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUEFSVElUSU9OX1RZUEU9SUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUEFSVElUSU9OX1RZUEUgPSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVEFLRU9WRVJfUEFSVElUSU9OX1RZUEVTID0geyAibm9uZSIgfTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gVFlQRVMgPSB7ICJib29sZWFuIiwgImJ5dGUiLCAiY2hhciIsICJkb3VibGUiLCAiaW50IiwgImxvbmciLCAic2hvcnQiLCAiZmxvYXQiLCAidmFyIiwgInZvaWQiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTkkIC8vJE5PTi1OTFMtMTAkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzTmFtZU1hbmdsZXJVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzTmFtZU1hbmdsZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwY2VlOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc05hbWVNYW5nbGVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc05hbWVNYW5nbGVyVXRpbCB7Ci0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIEhleCByZXByZXNlbnRhdGlvbiBvZiBhbiBBU0NJSQotCSAqIGNoYXJhY3RlciAoZWcuIDJGIC0+IC8pCi0JICogCi0JICogQHBhcmFtIHBvc3NpYmxlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgcG9zc2libGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKHBvc3NpYmxlLmxlbmd0aCgpID09IDIpIHsKLQkJCWNoYXIgYzEgPSBwb3NzaWJsZS5jaGFyQXQoMCk7Ci0JCQljaGFyIGMyID0gcG9zc2libGUuY2hhckF0KDEpOwotCQkJLy8gMXN0IGNoYXJhY3RlciBtdXN0IGJlIGEgZGlnaXQKLQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjMSkpIHsKLQkJCQkvLyAybmQgY2hhcmFjdGVyIG11c3QgYmUgZGlnaXQgb3IgdXBwZXIgY2FzZSBsZXR0ZXIgQS1GCi0JCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGMyKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGMyKSAmJiAoYzIgPT0gJ0EnIHx8IGMyID09ICdCJyB8fCBjMiA9PSAnQycgfHwgYzIgPT0gJ0QnIHx8IGMyID09ICdFJyB8fCBjMiA9PSAnRicpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIE1hbmdsZSBzdHJpbmcgdG8gV0FTLWxpa2Ugc3BlY2lmaWNhdGlvbnMKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBtYW5nbGUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIG1vZGlmaWVkTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy8gZXh0ZW5zaW9uICguanNwLCAuanNwZiwgLmpzcHgsIGV0Yy4uLikgc2hvdWxkIGFscmVhZHkgYmUgZW5jb2RlZCBpbgotCQkvLyBuYW1lCi0JCWludCBsZW5ndGggPSBuYW1lLmxlbmd0aCgpOwotCQkvLyBpbiBjYXNlIG5hbWUgaXMgZm9yYmlkZGVuIChhIG51bWJlciwgY2xhc3MsIGZvciwgZXRjLi4uKQotCQltb2RpZmllZE5hbWUuYXBwZW5kKCdfJyk7Ci0JCS8vIGVuc3VyZSByZXN0IG9mIGNoYXJhY3RlcnMgYXJlIHZhbGlkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgY3VycmVudENoYXIgPSBuYW1lLmNoYXJBdChpKTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY3VycmVudENoYXIpID09IHRydWUpIHsKLQkJCQltb2RpZmllZE5hbWUuYXBwZW5kKGN1cnJlbnRDaGFyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kaWZpZWROYW1lLmFwcGVuZChKc05hbWVNYW5nbGVyVXRpbC5tYW5nbGVDaGFyKGN1cnJlbnRDaGFyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkTmFtZS50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiB0YWtlIGEgY2hhcmFjdGVyIGFuZCByZXR1cm4gaXRzIGhleCBlcXVpdmFsZW50Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIG1hbmdsZUNoYXIoY2hhciBjaCkgewotCQlpZiAoY2ggPT0gRmlsZS5zZXBhcmF0b3JDaGFyKSB7Ci0JCQljaCA9ICcvJzsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjaCkgPT0gdHJ1ZSkgewotCQkJcmV0dXJuICIiICsgY2g7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gIl8iICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkudG9VcHBlckNhc2UoKSArICJfIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCS8qKgotCSAqIFdBUyBtYW5nbGVzIFRvbSZKZXJyeSBhczogX1RvbV8yNl9KZXJyeTsgdGhpcyB0YWtlcyBpbiB0aGUgbWFuZ2xlZCBuYW1lCi0JICogYW5kIHJldHVybnMgdGhlIG9yaWdpbmFsIG5hbWUuCi0JICogCi0JICogVW5tYW5nbGVzIHRoZSBxdWFsaWZpZWQgdHlwZSBuYW1lLiBJZiBhbiB1bmRlcnNjb3JlIGlzIGZvdW5kIGl0IGlzCi0JICogYXNzdW1lZCB0byBiZSBhIG1hbmdsZWQgcmVwcmVzZW50YXRpb24gb2YgYSBub24tYWxwaGEsIG5vbi1kaWdpdAotCSAqIGNoYXJhY3RlciBvZiB0aGUgZm9ybSBfTk5fLCB3aGVyZSBOTiBhcmUgaGV4IGRpZ2l0cyByZXByZXNlbnRpbmcgdGhlCi0JICogZW5jb2RlZCBjaGFyYWN0ZXIuIFRoaXMgcm91dGluZSBjb252ZXJ0cyBpdCBiYWNrIHRvIHRoZSBvcmlnaW5hbAotCSAqIGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyB1bm1hbmdsZShTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJaWYgKHF1YWxpZmllZFR5cGVOYW1lLmNoYXJBdCgwKSAhPSAnXycpIHsKLQkJCXJldHVybiBxdWFsaWZpZWRUeXBlTmFtZTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgcG9zc2libGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyByZW1vdmUgdGhlIC5qYXZhIGV4dGVuc2lvbiBpZiB0aGVyZSBpcyBvbmUKLQkJaWYgKHF1YWxpZmllZFR5cGVOYW1lLmVuZHNXaXRoKCIuanMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlxdWFsaWZpZWRUeXBlTmFtZSA9IHF1YWxpZmllZFR5cGVOYW1lLnN1YnN0cmluZygwLCBxdWFsaWZpZWRUeXBlTmFtZS5sZW5ndGgoKSAtIDMpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoKCk7IGkrKykgeyAvLyBzdGFydCBhdAotCQkJLy8gaW5kZXggMSBiL2MKLQkJCS8vIDFzdCBjaGFyIGlzCi0JCQkvLyBhbHdheXMgJ18nCi0JCQljaGFyIGMgPSBxdWFsaWZpZWRUeXBlTmFtZS5jaGFyQXQoaSk7Ci0JCQlpZiAoYyA9PSAnXycpIHsKLQkJCQlpbnQgZW5kSW5kZXggPSBxdWFsaWZpZWRUeXBlTmFtZS5pbmRleE9mKCdfJywgaSArIDEpOwotCQkJCWlmIChlbmRJbmRleCA9PSAtMSkgewotCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNoYXIgdW5tYW5nbGVkOwotCQkJCQl0cnkgewotCQkJCQkJcG9zc2libGUgPSBxdWFsaWZpZWRUeXBlTmFtZS5zdWJzdHJpbmcoaSArIDEsIGVuZEluZGV4KTsKLQkJCQkJCWlmIChKc05hbWVNYW5nbGVyVXRpbC5pc1ZhbGlkKHBvc3NpYmxlKSkgewotCQkJCQkJCXVubWFuZ2xlZCA9IChjaGFyKSBJbnRlZ2VyLmRlY29kZSgiMHgiICsgcG9zc2libGUpLmludFZhbHVlKCk7Ly8kTk9OLU5MUy0xJAotCQkJCQkJCWkgPSBlbmRJbmRleDsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdW5tYW5nbGVkID0gYzsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCXVubWFuZ2xlZCA9IGM7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh1bm1hbmdsZWQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYnVmLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1Byb2JsZW1SZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNQcm9ibGVtUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOTRkZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1Byb2JsZW1SZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JUHJvYmxlbVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwotCi1jbGFzcyBKc1Byb2JsZW1SZXF1ZXN0b3IgaW1wbGVtZW50cyBJUHJvYmxlbVJlcXVlc3RvciB7Ci0JcHJpdmF0ZSBMaXN0IGZDb2xsZWN0ZWRQcm9ibGVtczsKLQlwcml2YXRlIGJvb2xlYW4gZklzQWN0aXZlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc1J1bm5pbmcgPSBmYWxzZTsKLQkKLQlwdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHsKLQkJaWYgKGlzQWN0aXZlKCkpIHsKLQkJCWdldENvbGxlY3RlZFByb2JsZW1zKCkuYWRkKHByb2JsZW0pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGJlZ2luUmVwb3J0aW5nKCkgewotCQlmSXNSdW5uaW5nID0gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZW5kUmVwb3J0aW5nKCkgewotCQlmSXNSdW5uaW5nID0gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY29sbGVjdGVkIHByb2JsZW1zCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29sbGVjdGVkUHJvYmxlbXMoKSB7Ci0JCWlmIChmQ29sbGVjdGVkUHJvYmxlbXMgPT0gbnVsbCkKLQkJCWZDb2xsZWN0ZWRQcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGZDb2xsZWN0ZWRQcm9ibGVtczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiBmSXNBY3RpdmU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKLQkJcmV0dXJuIGZJc1J1bm5pbmc7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGlzIHByb2JsZW0gcmVxdWVzdG9yLgotCSAqIAotCSAqIEBwYXJhbSBpc0FjdGl2ZQotCSAqICAgICAgICAgICAgdGhlIHN0YXRlIG9mIHRoaXMgcHJvYmxlbSByZXF1ZXN0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0FjdGl2ZShib29sZWFuIGlzQWN0aXZlKSB7Ci0JCWZJc0FjdGl2ZSA9IGlzQWN0aXZlOwotCX0KLQkKLQkvKioKLQkgKiBUZWxscyB0aGlzIGFubm90YXRpb24gbW9kZWwgdG8gY29sbGVjdCB0ZW1wb3JhcnkgcHJvYmxlbXMgZnJvbSBub3cgb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0Q29sbGVjdGluZ1Byb2JsZW1zKCkgewotCQlnZXRDb2xsZWN0ZWRQcm9ibGVtcygpLmNsZWFyKCk7Ci0JfQotCQotCS8qKgotCSAqIFRlbGxzIHRoaXMgYW5ub3RhdGlvbiBtb2RlbCB0byBubyBsb25nZXIgY29sbGVjdCB0ZW1wb3JhcnkgcHJvYmxlbXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3BDb2xsZWN0aW5nUHJvYmxlbXMoKSB7Ci0JLy8gZG8gbm90aGluZwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MDc2OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBidWc6MjQ0ODM5IC0gZXVnZW5lQGdlbnVpdGVjLmNvbQotICogICAgIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogICAgIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0VW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVNvdXJjZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuV29ya2luZ0NvcHlPd25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuRG9jdW1lbnRDb250ZXh0RnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuU291cmNlUmVmRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc1dlYk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSnNUcmFuc2xhdGlvbiBpbXBsZW1lbnRzIElKc1RyYW5zbGF0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdHJhbnNsYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotIAkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgSUphdmFTY3JpcHRVbml0IGZDb21waWxhdGlvblVuaXQgPSBudWxsOwotCXByaXZhdGUgRG9jdW1lbnRDb250ZXh0RnJhZ21lbnRSb290IGZEb2N1bWVudFNjb3BlOwotCXByaXZhdGUgSUphdmFTY3JpcHRQcm9qZWN0IGZKYXZhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBieXRlW10gZkxvY2sgPSBudWxsOwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBmSHRtbERvY3VtZW50OwotCXByb3RlY3RlZCBTdHJpbmcgZk1vZGVsQmFzZUxvY2F0aW9uOwotCi0KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUl9UWVBFX05BTUUgPSAiV2luZG93IjsgLy8kTk9OLU5MUy0xJAotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUEVSX1RZUEVfTElCUkFSWSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC5sYXVuY2hpbmcuYmFzZUJyb3dzZXJMaWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElKc1RyYW5zbGF0b3IgZlRyYW5zbGF0b3I7Ci0KLQlwcml2YXRlIFN0cmluZyBtYW5nbGVkTmFtZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBsaXN0ZW5Gb3JDaGFuZ2VzOwotCi0JcHVibGljIEpzVHJhbnNsYXRpb24oKSB7Ci0JCS8qIGRvIG5vdGhpbmcgKi8KLQl9Ci0JCi0JcHVibGljIElKc1RyYW5zbGF0b3IgZ2V0VHJhbnNsYXRvcigpIHsKLQkJaWYoZlRyYW5zbGF0b3IhPW51bGwpIHsKLQkJCXJldHVybiBmVHJhbnNsYXRvcjsKLQkJfQotCQkKLQkJZlRyYW5zbGF0b3IgPSBuZXcgSnNUcmFuc2xhdG9yKGZIdG1sRG9jdW1lbnQsIGZNb2RlbEJhc2VMb2NhdGlvbiwgbGlzdGVuRm9yQ2hhbmdlcyk7Ci0JCXJldHVybiB0aGlzLmZUcmFuc2xhdG9yOwotCX0KLQkKLQotCQotCXByb3RlY3RlZCBKc1RyYW5zbGF0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnQgaHRtbERvY3VtZW50LCBJSmF2YVNjcmlwdFByb2plY3QgamF2YVByb2osIGJvb2xlYW4gbGlzdGVuRm9yQ2hhbmdlcykgewotCQlmTG9jayA9IG5ldyBieXRlWzBdOwotCQlmSmF2YVByb2plY3QgPSBqYXZhUHJvajsKLQkJZkh0bWxEb2N1bWVudCA9IGh0bWxEb2N1bWVudDsKLQkJc2V0QmFzZUxvY2F0aW9uKCk7Ci0JCW1hbmdsZWROYW1lID0gY3JlYXRlTWFuZ2xlZE5hbWUoKTsKLQkJdGhpcy5saXN0ZW5Gb3JDaGFuZ2VzPWxpc3RlbkZvckNoYW5nZXM7Ci0JfQotCi0JcHVibGljIElKc1RyYW5zbGF0aW9uIGdldEluc3RhbmNlKElTdHJ1Y3R1cmVkRG9jdW1lbnQgaHRtbERvY3VtZW50LCBJSmF2YVNjcmlwdFByb2plY3QgamF2YVByb2osIGJvb2xlYW4gbGlzdGVuRm9yQ2hhbmdlcykgewotCQlyZXR1cm4gbmV3IEpzVHJhbnNsYXRpb24oaHRtbERvY3VtZW50LGphdmFQcm9qLCBsaXN0ZW5Gb3JDaGFuZ2VzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNnZXRKYXZhUHJvamVjdCgpCi0JICovCi0JcHVibGljIElKYXZhU2NyaXB0UHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGZKYXZhUHJvamVjdDsKLQl9Ci0KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldERvY1Njb3BlKGJvb2xlYW4gcmVzZXQpIHsKLQkJaWYgKGZEb2N1bWVudFNjb3BlID09IG51bGwpIHsKLQkJCS8vIElQcm9qZWN0IHByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJCS8vIElSZXNvdXJjZSBhYnNvbHV0ZVJvb3QgPQotCQkJLy8gKChJQ29udGFpbmVyKWdldEphdmFQcm9qZWN0KCkuZ2V0UmVzb3VyY2UoKSkuZmluZE1lbWJlcigKLQkJCS8vIFdlYlJvb3RGaW5kZXIuZ2V0V2ViQ29udGVudEZvbGRlcihmSmF2YVByb2plY3QuZ2V0UHJvamVjdCgpKSk7Ci0JCQlmRG9jdW1lbnRTY29wZSA9IG5ldyBEb2N1bWVudENvbnRleHRGcmFnbWVudFJvb3QoZkphdmFQcm9qZWN0LCBnZXRGaWxlKCksIFdlYlJvb3RGaW5kZXIuZ2V0V2ViQ29udGVudEZvbGRlcihmSmF2YVByb2plY3QuZ2V0UHJvamVjdCgpKSwgV2ViUm9vdEZpbmRlci5nZXRTZXJ2ZXJDb250ZXh0Um9vdChmSmF2YVByb2plY3QuZ2V0UHJvamVjdCgpKSwgSnNXZWJOYXR1cmUuVklSVFVBTF9TQ09QRV9FTlRSWSk7Ci0JCQlmRG9jdW1lbnRTY29wZS5zZXRJbmNsdWRlZEZpbGVzKGdldFRyYW5zbGF0b3IoKS5nZXRSYXdJbXBvcnRzKCkpOwotCQkJcmV0dXJuIGZEb2N1bWVudFNjb3BlOwotCQl9Ci0KLQkJaWYgKHJlc2V0KQotCQkJZkRvY3VtZW50U2NvcGUuc2V0SW5jbHVkZWRGaWxlcyhnZXRUcmFuc2xhdG9yKCkuZ2V0UmF3SW1wb3J0cygpKTsKLQkJcmV0dXJuIGZEb2N1bWVudFNjb3BlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRCYXNlTG9jYXRpb24oKSB7Ci0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkh0bWxEb2N1bWVudCk7Ci0JCQlpZiAoeG1sTW9kZWwgPT0gbnVsbCkgewotCQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZkh0bWxEb2N1bWVudCk7Ci0JCQl9Ci0JCQlmTW9kZWxCYXNlTG9jYXRpb24gPSB4bWxNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCS8vIHJldHVybiB4bWxNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKG5ldyBQYXRoKGZNb2RlbEJhc2VMb2NhdGlvbikpOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNnZXRIdG1sRG9jdW1lbnQoKQotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0SHRtbERvY3VtZW50KCkgewotCQlyZXR1cm4gZkh0bWxEb2N1bWVudDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldE1pc3NpbmdUYWdTdGFydCgpCi0JICovCi0JcHVibGljIGludCBnZXRNaXNzaW5nVGFnU3RhcnQoKSB7Ci0JCXJldHVybiBnZXRUcmFuc2xhdG9yKCkuZ2V0TWlzc2luZ0VuZFRhZ1JlZ2lvblN0YXJ0KCk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRXZWJSb290KCkgewotCQlyZXR1cm4gV2ViUm9vdEZpbmRlci5nZXRXZWJDb250ZW50Rm9sZGVyKGZKYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnlVbmRlclJvb3QoKSB7Ci0JCUlQYXRoIHdlYlJvb3QgPSBnZXRXZWJSb290KCk7Ci0JCUlQYXRoIHByb2plY3RXZWJSb290UGF0aCA9IGdldEphdmFQcm9qZWN0KCkuZ2V0UGF0aCgpLmFwcGVuZCh3ZWJSb290KTsKLQkJSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChmTW9kZWxCYXNlTG9jYXRpb24pLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJcmV0dXJuIGZpbGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocHJvamVjdFdlYlJvb3RQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhmaWxlUGF0aCkpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogT3JpZ2luYWxseSBmcm9tIFJlY29uY2lsZVN0ZXBGb3JKYXZhLiBDcmVhdGVzIGFuIElKYXZhU2NyaXB0VW5pdCBmcm9tCi0JICogdGhlIGNvbnRlbnRzIG9mIHRoZSBKU1AgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiBhbiBJSmF2YVNjcmlwdFVuaXQgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIEpTUCBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSUphdmFTY3JpcHRVbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgpIHRocm93cyBKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0RG9jU2NvcGUodHJ1ZSk7Ci0JCUlKYXZhU2NyaXB0VW5pdCBjdSA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCIiKS5nZXRKYXZhU2NyaXB0VW5pdChnZXRNYW5nbGVkTmFtZSgpICsgSnNEYXRhVHlwZXMuQkFTRV9GSUxFX0VYVEVOU0lPTikuZ2V0V29ya2luZ0NvcHkoZ2V0V29ya2luZ0NvcHlPd25lcigpLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSUJ1ZmZlciBidWZmZXI7Ci0JCXRyeSB7Ci0JCQlidWZmZXIgPSBjdS5nZXRCdWZmZXIoKTsKLQkJfQotCQljYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlidWZmZXIgPSBudWxsOwotCQl9Ci0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJZ2V0VHJhbnNsYXRvcigpLnNldEJ1ZmZlcihidWZmZXIpOwotCQl9Ci0JCXJldHVybiBjdTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGZpeHVwTWFuZ2xlZE5hbWUoU3RyaW5nIGRpc3BsYXlTdHJpbmcpIHsKLQkJaWYgKGRpc3BsYXlTdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlTdHJpbmcucmVwbGFjZUFsbChnZXRNYW5nbGVkTmFtZSgpICsgIi5qcyIsIGdldEh0bWxQYWdlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0QWxsRWxlbWVudHNJbkpzUmFuZ2UoaW50LCBpbnQpCi0JICovCi0JcHVibGljIElKYXZhU2NyaXB0RWxlbWVudFtdIGdldEFsbEVsZW1lbnRzSW5Kc1JhbmdlKGludCBqYXZhUG9zaXRpb25TdGFydCwgaW50IGphdmFQb3NpdGlvbkVuZCkgewotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBFTVRQWV9SRVNVTFRfU0VUID0gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQkJSUphdmFTY3JpcHRFbGVtZW50W10gcmVzdWx0ID0gRU1UUFlfUkVTVUxUX1NFVDsKLQkJSUphdmFTY3JpcHRFbGVtZW50W10gYWxsQ2hpbGRyZW4gPSBudWxsOwotCQl0cnkgewotCQkJYWxsQ2hpbGRyZW4gPSBnZXRDb21waWxhdGlvblVuaXQoKS5nZXRDaGlsZHJlbigpOwotCQl9Ci0JCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQl9Ci0JCVZlY3RvciB2YWxpZENoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBnZXRKU1NvdXJjZVJhbmdlT2YoYWxsQ2hpbGRyZW5baV0pOwotCQkJaWYgKGphdmFQb3NpdGlvblN0YXJ0IDw9IHJhbmdlLmdldE9mZnNldCgpICYmIHJhbmdlLmdldExlbmd0aCgpICsgcmFuZ2UuZ2V0T2Zmc2V0KCkgPD0gKGphdmFQb3NpdGlvbkVuZCkpIHsKLQkJCQl2YWxpZENoaWxkcmVuLmFkZChhbGxDaGlsZHJlbltpXSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhbGxDaGlsZHJlbltpXS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5UWVBFKSB7Ci0JCQkJdmFsaWRDaGlsZHJlbi5hZGQoYWxsQ2hpbGRyZW5baV0pOwotCQkJfQotCQl9Ci0JCWlmICh2YWxpZENoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCXJlc3VsdCA9IChJSmF2YVNjcmlwdEVsZW1lbnRbXSkgdmFsaWRDaGlsZHJlbi50b0FycmF5KG5ldyBJSmF2YVNjcmlwdEVsZW1lbnRbXXt9KTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1UUFlfUkVTVUxUX1NFVDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0Q29tcGlsYXRpb25Vbml0KCkKLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRVbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLSAgICAgICAgLy8gR2VudWl0ZWMgQmVnaW4gRml4IDYxNDk6IEV4Y2VwdGlvbiBvcGVuaW5nIGV4dGVybmFsIEhUTUwgZmlsZQotCSAgICBpZiAoIWdldEphdmFQcm9qZWN0KCkuZXhpc3RzKCkpIHsKLQkgICAgICAgIHJldHVybiBudWxsOwotCSAgICB9Ci0JICAgIC8vIEdlbnVpdGVjIEVuZCBGaXggNjE0OTogRXhjZXB0aW9uIG9wZW5pbmcgZXh0ZXJuYWwgSFRNTCBmaWxlCi0JCXN5bmNocm9uaXplZCAoZkxvY2spIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZDb21waWxhdGlvblVuaXQgPT0gbnVsbCkgewotCQkJCQlmQ29tcGlsYXRpb25Vbml0ID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCXJldHVybiBmQ29tcGlsYXRpb25Vbml0OwotCQkJCX0KLQotCQkJfQotCQkJY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCQlpZiAoSnNUcmFuc2xhdGlvbi5ERUJVRykgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJlcnJvciBjcmVhdGluZyBKU1Agd29ya2luZyBjb3B5Li4uICIsIGptZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlnZXREb2NTY29wZSh0cnVlKTsKLQkJdHJ5IHsKLQkJCWZDb21waWxhdGlvblVuaXQgPSBmQ29tcGlsYXRpb25Vbml0LmdldFdvcmtpbmdDb3B5KGdldFdvcmtpbmdDb3B5T3duZXIoKSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJLy8gZkNvbXBpbGF0aW9uVW5pdC5tYWtlQ29uc2lzdGVudChnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGZDb21waWxhdGlvblVuaXQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNnZXRFbGVtZW50c0Zyb21Kc1JhbmdlKGludCwgaW50KQotCSAqLwotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRFbGVtZW50c0Zyb21Kc1JhbmdlKGludCBqYXZhUG9zaXRpb25TdGFydCwgaW50IGphdmFQb3NpdGlvbkVuZCkgewotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBFTVRQWV9SRVNVTFRfU0VUID0gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQkJSUphdmFTY3JpcHRFbGVtZW50W10gcmVzdWx0ID0gRU1UUFlfUkVTVUxUX1NFVDsKLQkJdHJ5IHsKLQkJCUlKYXZhU2NyaXB0VW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKGZMb2NrKSB7Ci0JCQkJCWludCBjdURvY0xlbmd0aCA9IGN1LmdldEJ1ZmZlcigpLmdldExlbmd0aCgpOwotCQkJCQlpbnQgamF2YUxlbmd0aCA9IGphdmFQb3NpdGlvbkVuZCAtIGphdmFQb3NpdGlvblN0YXJ0OwotCQkJCQlpZiAoY3VEb2NMZW5ndGggPiAwICYmIGphdmFQb3NpdGlvblN0YXJ0ID49IDAgJiYgamF2YUxlbmd0aCA+PSAwICYmIGphdmFQb3NpdGlvbkVuZCA8PSBjdURvY0xlbmd0aCkgewotCQkJCQkJcmVzdWx0ID0gY3UuY29kZVNlbGVjdChqYXZhUG9zaXRpb25TdGFydCwgamF2YUxlbmd0aCwgZ2V0V29ya2luZ0NvcHlPd25lcigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQubGVuZ3RoID09IDApIHsKLQkJCQlyZXR1cm4gRU1UUFlfUkVTVUxUX1NFVDsKLQkJCX0KLQkJfQotCQljYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIHgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oeCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRIdG1sUGFnZU5hbWUoKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmTW9kZWxCYXNlTG9jYXRpb24pOwotCQlyZXR1cm4gcGF0aC5sYXN0U2VnbWVudCgpOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNnZXRIdG1sVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIdG1sVGV4dCgpIHsKLQkJcmV0dXJuIGZIdG1sRG9jdW1lbnQuZ2V0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhUGF0aCgpIHsKLQkJSVBhdGggcm9vdFBhdGggPSBuZXcgUGF0aChmTW9kZWxCYXNlTG9jYXRpb24pLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJU3RyaW5nIGN1UGF0aCA9IHJvb3RQYXRoLmFwcGVuZCgiLyIgKyBnZXRNYW5nbGVkTmFtZSgpICsgSnNEYXRhVHlwZXMuQkFTRV9GSUxFX0VYVEVOU0lPTikudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gY3VQYXRoOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0SnNFbGVtZW50QXRPZmZzZXQoaW50KQotCSAqLwotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnQgZ2V0SnNFbGVtZW50QXRPZmZzZXQoaW50IGpzT2Zmc2V0KSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50cyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50cyA9IGdldENvbXBpbGF0aW9uVW5pdCgpLmdldEVsZW1lbnRBdChqc09mZnNldCk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlpZiAoSnNUcmFuc2xhdGlvbi5ERUJVRykgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImVycm9yIHJldHJpZXZpbmcgamF2YSBlbGVtdG50IGZyb20gY29tcGlsYXRpb24gdW5pdC4uLiAiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gfQotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQlwcml2YXRlIElTb3VyY2VSYW5nZSBnZXRKU1NvdXJjZVJhbmdlT2YoSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gcmV0dXJucyB0aGUgb2Zmc2V0IGluIGh0bWwgb2YgZ2l2ZW4gZWxlbWVudAotCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1lbWJlcikgewotCQkJdHJ5IHsKLQkJCQlyYW5nZSA9ICgoTWVtYmVyKSBlbGVtZW50KS5nZXROYW1lUmFuZ2UoKTsKLQkJCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX1lbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU291cmNlUmVmRWxlbWVudCkgewotCQkJdHJ5IHsKLQkJCQlyYW5nZSA9ICgoU291cmNlUmVmRWxlbWVudCkgZWxlbWVudCkuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCX0KLQkJCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJhbmdlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0SnNUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpzVGV4dCgpIHsKLQkJcmV0dXJuIGdldFRyYW5zbGF0b3IoKS5nZXRKc1RleHQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldFNjcmlwdFBvc2l0aW9ucygpCi0JICovCi0JcHVibGljIFBvc2l0aW9uW10gZ2V0U2NyaXB0UG9zaXRpb25zKCkgewotCQlyZXR1cm4gZ2V0VHJhbnNsYXRvcigpLmdldEh0bWxMb2NhdGlvbnMoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2luc2VydEluRmlyc3RTY3JpcHRSZWdpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnRJbkZpcnN0U2NyaXB0UmVnaW9uKFN0cmluZyB0ZXh0KSB7Ci0JCVBvc2l0aW9uIHBvc1tdID0gZ2V0U2NyaXB0UG9zaXRpb25zKCk7Ci0JCWludCBzY3JpcHRTdGFydE9mZnNldCA9IDA7Ci0JCWlmKHBvcyE9bnVsbCAmJiBwb3MubGVuZ3RoPjApIHsKLQkJCXNjcmlwdFN0YXJ0T2Zmc2V0ID0gcG9zWzBdLmdldE9mZnNldCgpOwotCQkJCi0JCX0KLQkJU3RyaW5nIGluc2VydFRleHQgPSAoc2NyaXB0U3RhcnRPZmZzZXQ9PTA/IiI6IlxuIikgKyB0ZXh0OwotCQlpbnNlcnRTY3JpcHQoc2NyaXB0U3RhcnRPZmZzZXQsaW5zZXJ0VGV4dCk7Ci0JCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2luc2VydFNjcmlwdChpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0U2NyaXB0KGludCBvZmZzZXQsIFN0cmluZyB0ZXh0KSB7Ci0KLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJUG9zaXRpb25bXSBpbkh0bWwgPSBnZXRTY3JpcHRQb3NpdGlvbnMoKTsKLQkJYm9vbGVhbiBpc0luc2lkZUV4aXN0aW5nU2NyaXB0UmVnaW9uID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5IdG1sLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaW5IdG1sW2ldLm92ZXJsYXBzV2l0aChvZmZzZXQsIDEpKSB7Ci0JCQkJLy8gKiBpbnNlcnRpbmcgaW50byBhIHNjcmlwdCByZWdpb24KLQkJCQlpc0luc2lkZUV4aXN0aW5nU2NyaXB0UmVnaW9uID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBpbnNlcnRUZXh0ID0gbnVsbDsKLQotCQlpZiAoaXNJbnNpZGVFeGlzdGluZ1NjcmlwdFJlZ2lvbikgewotCQkJaW5zZXJ0VGV4dCA9IHRleHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnNlcnRUZXh0ID0gb2Zmc2V0ICE9IDAgPyAiXG4iIDogIiIgKyAiPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+XG4iICsgdGV4dCArICJcbjwvc2NyaXB0PlxuIjsKLQkJfQotCS8vCXRyYW5zbGF0b3IuZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKG51bGwpOwotCi0JCXN5bmNocm9uaXplZCAoZkxvY2spIHsKLQkJCXRyeSB7Ci0JCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGZIdG1sRG9jdW1lbnQpOwotCQkJCWlmICh4bWxNb2RlbCA9PSBudWxsKSB7Ci0JCQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZkh0bWxEb2N1bWVudCk7Ci0JCQkJfQotCQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0KLQotCQkJCQl4bWxNb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCQkJeG1sTW9kZWwuZ2V0RG9jdW1lbnQoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIGluc2VydFRleHQpOwotCQkJCQl4bWxNb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXhtbE1vZGVsLnNhdmUoKTsKLQkJCQkJfQotCi0JCQkJCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHt9Ci0JCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7fQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCi0JLy8JdHJhbnNsYXRvci5kb2N1bWVudENoYW5nZWQobnVsbCk7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hbmdsZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5tYW5nbGVkTmFtZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVNYW5nbGVkTmFtZSgpIHsKLQkJcmV0dXJuIEpzTmFtZU1hbmdsZXJVdGlsLm1hbmdsZShmTW9kZWxCYXNlTG9jYXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2JsZW0gcmVxdWVzdG9yIGZvciB0aGUgSmF2YVNjcmlwdFVuaXQgaW4gdGhpcwotCSAqICAgICAgICAgSnNUcmFuc2xhdGlvbgotCSAqLwotCXByaXZhdGUgSnNQcm9ibGVtUmVxdWVzdG9yIGdldFByb2JsZW1SZXF1ZXN0b3IoKSB7Ci0JCXJldHVybiBDb21waWxhdGlvblVuaXRIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9ibGVtUmVxdWVzdG9yKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNnZXRQcm9ibGVtcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvYmxlbXMoKSB7Ci0JCUxpc3QgcHJvYmxlbUxpc3QgPSBnZXRQcm9ibGVtUmVxdWVzdG9yKCkuZ2V0Q29sbGVjdGVkUHJvYmxlbXMoKTsKLQkJZ2V0UHJvYmxlbVJlcXVlc3RvcigpLmVuZFJlcG9ydGluZygpOwotCQlJUHJvYmxlbVtdIHByb2JsZW1zID0gbnVsbDsKLQkJaWYgKHByb2JsZW1MaXN0ID09IG51bGwpCi0JCQlwcm9ibGVtcyA9IG5ldyBJUHJvYmxlbVswXTsKLQkJZWxzZSAKLQkJCXByb2JsZW1zID0gKElQcm9ibGVtW10pIHByb2JsZW1MaXN0LnRvQXJyYXkobmV3IElQcm9ibGVtW3Byb2JsZW1MaXN0LnNpemUoKV0pOwotCQkKLQkJSUpzVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gZ2V0VHJhbnNsYXRvcigpOwotCQlpZiAodHJhbnNsYXRvciBpbnN0YW5jZW9mIEpzVHJhbnNsYXRvciAmJiBwcm9ibGVtcy5sZW5ndGggPiAwKSB7Ci0JCQlSZWdpb25bXSBnZW5lcmF0ZWRSYW5nZXMgPSAoKEpzVHJhbnNsYXRvcikgdHJhbnNsYXRvcikuZ2V0R2VuZXJhdGVkUmFuZ2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBnZW5lcmF0ZWRSYW5nZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJLy8gcmVtb3ZlIGFueSBwcm9ibGVtcyB0aGF0IGFyZSBmdWxseSByZXBvcnRlZCB3aXRoaW4gYSByZWdpb24gZ2VuZXJhdGVkIGJ5IHRoZSB0cmFuc2xhdG9yCi0JCQkJCWlmIChwcm9ibGVtc1tpXS5nZXRTb3VyY2VTdGFydCgpID49IGdlbmVyYXRlZFJhbmdlc1tqXS5nZXRPZmZzZXQoKSAmJiBwcm9ibGVtc1tpXS5nZXRTb3VyY2VFbmQoKSA8PSAoZ2VuZXJhdGVkUmFuZ2VzW2pdLmdldE9mZnNldCgpICsgZ2VuZXJhdGVkUmFuZ2VzW2pdLmdldExlbmd0aCgpKSkgewotCQkJCQkJcHJvYmxlbUxpc3QucmVtb3ZlKHByb2JsZW1zW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvYmxlbUxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJaWYgKGZQcm9ncmVzc01vbml0b3IgPT0gbnVsbCkgewotCQkJZlByb2dyZXNzTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcm9ncmVzc01vbml0b3I7Ci0JfQotCi0JcHVibGljIFdvcmtpbmdDb3B5T3duZXIgZ2V0V29ya2luZ0NvcHlPd25lcigpIHsKLQkJcmV0dXJuIENvbXBpbGF0aW9uVW5pdEhlbHBlci5nZXRJbnN0YW5jZSgpLmdldFdvcmtpbmdDb3B5T3duZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2lmT2Zmc2V0SW5JbXBvcnROb2RlKGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpZk9mZnNldEluSW1wb3J0Tm9kZShpbnQgb2Zmc2V0KSB7Ci0JCVBvc2l0aW9uW10gaW1wb3J0UmFuZ2VzID0gZ2V0VHJhbnNsYXRvcigpLmdldEltcG9ydEh0bWxSYW5nZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpbXBvcnRSYW5nZXNbaV0uaW5jbHVkZXMob2Zmc2V0KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI3JlY29uY2lsZUNvbXBpbGF0aW9uVW5pdCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlQ29tcGlsYXRpb25Vbml0KCkgewotCQkvLyBpZih0cnVlKSByZXR1cm47Ci0JCUlKYXZhU2NyaXB0VW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlpZiAoZkNvbXBpbGF0aW9uVW5pdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJc3luY2hyb25pemVkIChmTG9jaykgewotCQkJCQkvLyBjbGVhciBvdXQgb2xkIHZhbGlkYXRpb24gbWVzc2FnZXMKLQkJCQkJV29ya2luZ0NvcHlPd25lciB3b3JraW5nQ29weU93bmVyID0gZ2V0V29ya2luZ0NvcHlPd25lcigpOwotCQkJCQlKc1Byb2JsZW1SZXF1ZXN0b3IgcHJvYmxlbVJlcXVlc3RvciA9IChKc1Byb2JsZW1SZXF1ZXN0b3IpIHdvcmtpbmdDb3B5T3duZXIuZ2V0UHJvYmxlbVJlcXVlc3RvcihjdS5nZXRXb3JraW5nQ29weShnZXRQcm9ncmVzc01vbml0b3IoKSkpOwotCQkJCQlpZihwcm9ibGVtUmVxdWVzdG9yICE9IG51bGwgJiYgcHJvYmxlbVJlcXVlc3Rvci5nZXRDb2xsZWN0ZWRQcm9ibGVtcygpICE9IG51bGwpCi0JCQkJCQlwcm9ibGVtUmVxdWVzdG9yLmdldENvbGxlY3RlZFByb2JsZW1zKCkuY2xlYXIoKTsKLQkJCQkJY3UucmVjb25jaWxlKElKYXZhU2NyaXB0VW5pdC5OT19BU1QsIHRydWUsIHRydWUsIGdldFdvcmtpbmdDb3B5T3duZXIoKSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGdldFRyYW5zbGF0b3IoKSAhPSBudWxsKQotCQkJZ2V0VHJhbnNsYXRvcigpLnJlbGVhc2UoKTsKLQkJc3luY2hyb25pemVkIChmTG9jaykgewotCQkJaWYgKGZDb21waWxhdGlvblVuaXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChKc1RyYW5zbGF0aW9uLkRFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigtKSBKc1RyYW5zbGF0aW9uIFsiICsgdGhpcyArICJdIGRpc2NhcmRpbmcgSmF2YVNjcmlwdFVuaXQ6ICIgKyBmQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZkNvbXBpbGF0aW9uVW5pdC5kaXNjYXJkV29ya2luZ0NvcHkoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHdlJ3JlIGRvbmUgdy8gaXQgYW55d2F5Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNzZXRQcm9ibGVtQ29sbGVjdGluZ0FjdGl2ZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2JsZW1Db2xsZWN0aW5nQWN0aXZlKGJvb2xlYW4gY29sbGVjdCkgewotCQlJSmF2YVNjcmlwdFVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCWdldFByb2JsZW1SZXF1ZXN0b3IoKS5zZXRJc0FjdGl2ZShjb2xsZWN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsYXNzcGF0aENoYW5nZSgpIHsKLQotCQlpZiAoZkRvY3VtZW50U2NvcGUgIT0gbnVsbCkgewotCQkJZkRvY3VtZW50U2NvcGUuY2xhc3NwYXRoQ2hhbmdlKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWFhNjNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogICAgIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0KLSAqIDxicj48YnI+IHRoaXMgYWRhcHRlciBsb2FkcyB0cmFuc2xhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIGV4dGVuc2lvbiBwb2ludHMuICB0aGlzIGlzIHRvIGFsbG93IG1vcmUgY29tcGxpY2F0ZWQgaHRtbC9qcyB0cmFuc2xhdGlvbnMgdGhyb3VnaCBleHRlbnNpb25zLgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzVHJhbnNsYXRpb25BZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyLCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdHJhbnNsYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZkh0bWxEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJSnNUcmFuc2xhdGlvbiBmSlNUcmFuc2xhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBOdWxsUHJvZ3Jlc3NNb25pdG9yIGZUcmFuc2xhdGlvbk1vbml0b3IgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGJhc2VMb2NhdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gbGlzdGVuRm9yQ2hhbmdlcz1mYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfQVRUUklCID0gInByaW9yaXR5IjsKLQlwcml2YXRlIElKc1RyYW5zbGF0aW9uIGZUcmFuc2xhdGlvbkFzRmFjdG9yeTsKLQkKLQlwdWJsaWMgSnNUcmFuc2xhdGlvbkFkYXB0ZXIoSURPTU1vZGVsIHhtbE1vZGVsKSB7Ci0JCWZIdG1sRG9jdW1lbnQgPSB4bWxNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJYmFzZUxvY2F0aW9uID0geG1sTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCWluaXRpYWxpemVKYXZhUGx1Z2lucygpOwotCQkKLQkJCi0JfQotCXB1YmxpYyB2b2lkIHNob3VsZExpc3RlbkZvckNoYW5nZXMoYm9vbGVhbiBsaXN0ZW5Gb3JQcm9qZWN0Q2hhbmdlcykgewotCQlpZihsaXN0ZW5Gb3JQcm9qZWN0Q2hhbmdlcykgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCQl9Ci0JfQotCi0JcHVibGljIElKYXZhU2NyaXB0UHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qZWN0ID0gbnVsbDsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCWlmIChmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA+IDApIHsKLQkJCXByb2plY3QgPSByb290LmdldFByb2plY3QoZmlsZVBhdGguc2VnbWVudCgwKSk7Ci0JCX0KLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJamF2YVByb2plY3QgPSBKYXZhU2NyaXB0Q29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCX0KLQkJCi0JCXJldHVybiBqYXZhUHJvamVjdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUpzVHJhbnNsYXRpb24gZm9yIHRoaXMgYWRhcHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgSUpzVHJhbnNsYXRpb24KLQkgKi8KLQlwdWJsaWMgSUpzVHJhbnNsYXRpb24gZ2V0SnNUcmFuc2xhdGlvbihib29sZWFuIGxpc3RlbkZvckNoYW5nZXMpIHsKLQkJLyoKLQkJICogSWYgbm8gdHJhbnNsYXRpb24gZXhpc3RzIG9yIHN3aXRjaGluZyBmcm9tIG5vdCBsaXN0ZW5pbmcgdG8KLQkJICogbGlzdGVuaW5nCi0JCSAqLwotCQlpZiAoZkpTVHJhbnNsYXRpb24gPT0gbnVsbCB8fCAoIXRoaXMubGlzdGVuRm9yQ2hhbmdlcyAmJiBsaXN0ZW5Gb3JDaGFuZ2VzKSkgewotCQkJaWYgKGZKU1RyYW5zbGF0aW9uICE9IG51bGwpCi0JCQkJZkpTVHJhbnNsYXRpb24ucmVsZWFzZSgpOwotCQkJaWYgKGZUcmFuc2xhdGlvbkFzRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJLyogbG9hZCB0aGUgdHJhbnNsYXRpb24gZmFjdG9yeSBmcm9tIHRoZSBleHRlbnNpb24gcG9pbnQgKi8KLQkJCQl0cnkgewotCQkJCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdFByZVByb2Nlc3NvciIpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgcG9pbnRzW10gPSBleHRlbnNpb25Qb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQotCQkJCQlpbnQgaGlnaGVzdFByaW9yaXR5VmFsdWUgPSAtMTsKLQkJCQkJaW50IGhpZ2hlc3RQcmlvcml0eUluZGV4ID0gLTE7Ci0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCVN0cmluZyBwcmlvcml0eSA9IHBvaW50c1tpXS5nZXRBdHRyaWJ1dGUoUFJJT1JJVFlfQVRUUklCKTsKLQkJCQkJCWludCB2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQocHJpb3JpdHkpOwotCQkJCQkJaWYgKHZhbHVlID4gaGlnaGVzdFByaW9yaXR5VmFsdWUpIHsKLQkJCQkJCQloaWdoZXN0UHJpb3JpdHlJbmRleCA9IGk7Ci0JCQkJCQkJaGlnaGVzdFByaW9yaXR5VmFsdWUgPSB2YWx1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlmVHJhbnNsYXRpb25Bc0ZhY3RvcnkgPSAoSUpzVHJhbnNsYXRpb24pIHBvaW50c1toaWdoZXN0UHJpb3JpdHlJbmRleF0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZUcmFuc2xhdGlvbkFzRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZkpTVHJhbnNsYXRpb24gPSBmVHJhbnNsYXRpb25Bc0ZhY3RvcnkuZ2V0SW5zdGFuY2UoZkh0bWxEb2N1bWVudCwgZ2V0SmF2YVByb2plY3QoKSwgbGlzdGVuRm9yQ2hhbmdlcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmSlNUcmFuc2xhdGlvbiA9IG5ldyBKc1RyYW5zbGF0aW9uKGZIdG1sRG9jdW1lbnQsIGdldEphdmFQcm9qZWN0KCksIGxpc3RlbkZvckNoYW5nZXMpOwotCQkJfQotCQkJdGhpcy5saXN0ZW5Gb3JDaGFuZ2VzID0gbGlzdGVuRm9yQ2hhbmdlczsKLQkJfQotCQlzaG91bGRMaXN0ZW5Gb3JDaGFuZ2VzKGxpc3RlbkZvckNoYW5nZXMpOwotCQlyZXR1cm4gZkpTVHJhbnNsYXRpb247Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplSmF2YVBsdWdpbnMoKSB7Ci0JCUphdmFTY3JpcHRDb3JlLmdldFBsdWdpbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmVxdWFscyhJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykge30KLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZlRyYW5zbGF0aW9uTW9uaXRvciAhPSBudWxsKSB7Ci0JCQlmVHJhbnNsYXRpb25Nb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQl9Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlpZiAoZkpTVHJhbnNsYXRpb24gIT0gbnVsbCkgewotCQkJaWYgKEpzVHJhbnNsYXRpb25BZGFwdGVyLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1RyYW5zbGF0aW9uQWRhcHRlciByZWxlYXNpbmc6IiArIGZKU1RyYW5zbGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZkpTVHJhbnNsYXRpb24ucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlJUHJvamVjdCBjaGFuZ2VkUHJvamVjdCA9IChldmVudD09bnVsbCB8fCBldmVudC5nZXRSZXNvdXJjZSgpPT1udWxsKT9udWxsOmV2ZW50LmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpOwotCQlpZihjaGFuZ2VkUHJvamVjdCE9bnVsbCAmJiBnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5lcXVhbHMoY2hhbmdlZFByb2plY3QpICYmIGZKU1RyYW5zbGF0aW9uIT1udWxsKXsKLQkJCWZKU1RyYW5zbGF0aW9uLmNsYXNzcGF0aENoYW5nZSgpOwotCQl9CQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyMTE1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogICAgIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCi0gKiBAYXV0aG9yIHBhdmVyeQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKc1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IHsKLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQkKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanN0cmFuc2xhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgSnNUcmFuc2xhdGlvbkFkYXB0ZXIgZkFkYXB0ZXIgPSBudWxsOwotCQotCXB1YmxpYyBKc1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKElKc1RyYW5zbGF0aW9uLmNsYXNzLCB0cnVlKTsKLQl9Ci0JCi0JCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIG5ldyBKc1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NTm9kZSAmJiBmQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlmQWRhcHRlciA9IG5ldyBKc1RyYW5zbGF0aW9uQWRhcHRlcigoKElET01Ob2RlKSB0YXJnZXQpLmdldE1vZGVsKCkpOwotCQkJaWYgKEpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCspIEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgWyIgKyB0aGlzICsgIl0gY3JlYXRlZCBhZGFwdGVyOiAiICsgZkFkYXB0ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkFkYXB0ZXI7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChmQWRhcHRlciAhPSBudWxsKSB7Ci0JCQlpZiAoSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIoLSkgSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSBbIiArIHRoaXMgKyAiXSByZWxlYXNpbmcgYWRhcHRlcjogIiArIGZBZGFwdGVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlmQWRhcHRlci5yZWxlYXNlKCk7Ci0JCX0KLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBBZGFwdGVyRmFjdG9yeShJU3RydWN0dXJlZE1vZGVsIHNtKSB7Ci0JCWlmIChzbS5nZXRGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5Rm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKSA9PSBudWxsKSB7Ci0JCQlKc1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBKc1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoKTsKLQkJCXNtLmdldEZhY3RvcnlSZWdpc3RyeSgpLmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NjcyZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0KLSAqIFRyYW5zbGF0ZXMgYSB3ZWIgcGFnZSBpbnRvIGl0cyBKYXZhU2NyaXB0IHBpZWNlcy4gCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEpzVHJhbnNsYXRvciBleHRlbmRzIEpvYiBpbXBsZW1lbnRzIElKc1RyYW5zbGF0b3IsIElEb2N1bWVudExpc3RlbmVyIHsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19TQVZFX09VVFBVVCA9IGZhbHNlOyAgLy8idHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanN0cmFuc2xhdGlvbnN0b2Rpc2siKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRMID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09NTUVOVF9TVEFSVCA9ICI8IS0tIjsgLy8kTk9OLU5MUy0xJAotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DT01NRU5UX0VORCA9ICItLT4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX1NUQVJUID0gIjwhW0NEQVRBWyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfU1RBUlRfUEFEID0gbmV3IFN0cmluZyhVdGlsLmdldFBhZChDREFUQV9TVEFSVC5sZW5ndGgoKSkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9FTkQgPSAiXV0+IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9FTkRfUEFEID0gbmV3IFN0cmluZyhVdGlsLmdldFBhZChDREFUQV9FTkQubGVuZ3RoKCkpKTsKLQkKLQkKLQkvL1RPRE86IHNob3VsZCBiZSBhbiBpbmNsdXNpdmUgcnVsZSByYXRoZXIgdGhhbiBleGNsdXNpdmUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIGZDbGllbnRTaWRlVGFnUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiPFtePCU/KSE+XSsvPz4iKTsgLy8kTk9OLU5MUy0xJAotCi0JLy8gRklYTUU6IFdvcmthcm91bmQgZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDc0MDEKLQlwcml2YXRlIFN0cmluZ1tdW10gZlNlcnZlclNpZGVEZWxpbWl0ZXJzID0gbmV3IFN0cmluZ1tdW117eyI8JSIsIiU+In0seyI8PyIsIj8+In19OwotCXByaXZhdGUgaW50IGZTaG9ydGVzdFNlcnZlclNpZGVEZWxpbWl0ZXJQYWlyTGVuZ3RoID0gNDsKLQkKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanNqYXZhbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0gCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgY2xhc3MgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGRvY3VtZW50UmV3cml0ZVNlc3Npb25DaGFuZ2VkKERvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudCBldmVudCkgewotCQkJaWYgKERvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudC5TRVNTSU9OX1NUQVJULmVxdWFscyhldmVudC5nZXRDaGFuZ2VUeXBlKCkpKSB7Ci0JCQkJZklzSW5SZXdyaXRlU2Vzc2lvbiA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQuU0VTU0lPTl9TVE9QLmVxdWFscyhldmVudC5nZXRDaGFuZ2VUeXBlKCkpKSB7Ci0JCQkJZklzSW5SZXdyaXRlU2Vzc2lvbiA9IGZhbHNlOwotCQkJCXNjaGVkdWxlKCk7Ci0JCQl9Ci0JCX0JCQotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQ3VycmVudE5vZGU7Ci0JYm9vbGVhbiBmSXNJblJld3JpdGVTZXNzaW9uID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBmU2NyaXB0VGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGltcG9ydExvY2F0aW9uc0luSHRtbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvKiB1c2UgamF2YSBzY3JpcHQgYnkgZGVmYXVsdCAqLwotCXByb3RlY3RlZCBib29sZWFuIGZJc0dsb2JhbEpzID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IHJhd0ltcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIHRyYW5zbGF0ZWQKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IHNjcmlwdExvY2F0aW9uSW5IdG1sID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBpbnQgc2NyaXB0T2Zmc2V0ID0gMDsKLQkKLQlwcm90ZWN0ZWQgYnl0ZVtdIGZMb2NrID0gbmV3IGJ5dGVbMF07Ci0JcHJvdGVjdGVkIGJ5dGVbXSBmaW5pc2hlZCA9IG5ldyBieXRlWzBdOwotCQotCXByb3RlY3RlZCBJQnVmZmVyIGZDb21wVW5pdEJ1ZmY7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuY2VsUGFyc2UgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgaW50IG1pc3NpbmdFbmRUYWdSZWdpb25TdGFydCA9IC0xOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBRERfU0VNSUNPTE9OX0FUX0lOTElORT10cnVlOwotCXByaXZhdGUgSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lciBmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyID0gbmV3IERvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcigpOwotCi0JLyoKLQkgKiBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbnMgdGhhdCBjb250YWluIHB1cmVseSBnZW5lcmF0ZWQgY29kZSwgZm9yCi0JICogd2hpY2ggbm8gdmFsaWRhdGlvbiBtZXNzYWdlcyBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIHVzZXIKLQkgKi8KLQlwcml2YXRlIExpc3QgZkdlbmVyYXRlZFJhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0dsb2JhbEpzKCkgewotCQlyZXR1cm4gZklzR2xvYmFsSnM7Ci0JfQotCQotCXByb3RlY3RlZCBJQnVmZmVyIGdldENvbXBVbml0QnVmZmVyKCkgewotCQlyZXR1cm4gZkNvbXBVbml0QnVmZjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBnZXRTY3JpcHRUZXh0QnVmZmVyKCkgewotCQlyZXR1cm4gZlNjcmlwdFRleHQ7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIHNldElzR2xvYmFsSnMoYm9vbGVhbiB2YWx1ZSkgewotCQl0aGlzLmZJc0dsb2JhbEpzID0gdmFsdWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkdmFuY2VOZXh0Tm9kZSgpIHsKLQkJc2V0Q3VycmVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkpOwotCX0JCi0JCi0JcHVibGljIEpzVHJhbnNsYXRvcihJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCAJU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXRoaXMoZG9jdW1lbnQsIGZpbGVOYW1lLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIEpzVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoIkphdmFTY3JpcHQgVHJhbnNsYXRpb24iKTsKLQl9Ci0JCi0JcHVibGljIEpzVHJhbnNsYXRvcihJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCAJU3RyaW5nIGZpbGVOYW1lLCBib29sZWFuIGxpc3RlbkZvckNoYW5nZXMpIHsKLQkJc3VwZXIoIkphdmFTY3JpcHQgdHJhbnNsYXRpb24gZm9yIDogIiArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlmU3RydWN0dXJlZERvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWlmIChsaXN0ZW5Gb3JDaGFuZ2VzKSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjQpIHsKLQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbjQpIGZTdHJ1Y3R1cmVkRG9jdW1lbnQpLmFkZERvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcihmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKTsKLQkJCX0KLQkJCXNldFByaW9yaXR5KEpvYi5MT05HKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCXNjaGVkdWxlKCk7Ci0JCX0KLQkJcmVzZXQoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI2dldEpzVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKc1RleHQoKSB7Ci0JCXN5bmNocm9uaXplZChmaW5pc2hlZCkgewotCQkJLyogaWYgbWlkIHJlLXdyaXRlIHNlc3Npb24gZG9jIGNoYW5nZXMgaGF2ZSBiZWVuIGlnbm9yZWQsCi0JCQkgKiBidXQgaWYganNUZXh0IGlzIHNwZWNpZmljYWxseSByZXF1ZXN0IHdlIHNob3VsZCByZS10cmFuc2xhdGUKLQkJCSAqIHRvIHBpY2sgdXAgYW55IGNoYW5nZXMgdGh1cyBmYXIKLQkJCSAqLwotCQkJaWYodGhpcy5mSXNJblJld3JpdGVTZXNzaW9uKSB7Ci0JCQkJdGhpcy5yZXNldCgpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gZlNjcmlwdFRleHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjZ2V0Q3VycmVudE5vZGUoKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEN1cnJlbnROb2RlKCkgewotCQkKLQkJcmV0dXJuIGZDdXJyZW50Tm9kZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI3NldEJ1ZmZlcihvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklCdWZmZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnVmZmVyKElCdWZmZXIgYnVmZmVyKSB7Ci0JCWZDb21wVW5pdEJ1ZmYgPSBidWZmZXI7Ci0JCXN5bmNocm9uaXplZChmaW5pc2hlZCkgewotCQkJZkNvbXBVbml0QnVmZi5zZXRDb250ZW50cyhmU2NyaXB0VGV4dC50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNnZXRIdG1sTG9jYXRpb25zKCkKLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRIdG1sTG9jYXRpb25zKCkgewotCQlzeW5jaHJvbml6ZWQoZmluaXNoZWQpIHsKLQkJCXJldHVybiAoUG9zaXRpb25bXSkgc2NyaXB0TG9jYXRpb25Jbkh0bWwudG9BcnJheShuZXcgUG9zaXRpb25bc2NyaXB0TG9jYXRpb25Jbkh0bWwuc2l6ZSgpXSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjZ2V0TWlzc2luZ0VuZFRhZ1JlZ2lvblN0YXJ0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pc3NpbmdFbmRUYWdSZWdpb25TdGFydCgpIHsKLQkJcmV0dXJuIG1pc3NpbmdFbmRUYWdSZWdpb25TdGFydDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI2dldEltcG9ydEh0bWxSYW5nZXMoKQotCSAqLwotCXB1YmxpYyBQb3NpdGlvbltdIGdldEltcG9ydEh0bWxSYW5nZXMoKSB7Ci0JCXN5bmNocm9uaXplZChmaW5pc2hlZCkgewotCQkJcmV0dXJuIChQb3NpdGlvbltdKSBpbXBvcnRMb2NhdGlvbnNJbkh0bWwudG9BcnJheShuZXcgUG9zaXRpb25baW1wb3J0TG9jYXRpb25zSW5IdG1sLnNpemUoKV0pOwotCQl9Ci0JfQotCQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI2dldFJhd0ltcG9ydHMoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSYXdJbXBvcnRzKCkgewotCQlzeW5jaHJvbml6ZWQoZmluaXNoZWQpIHsKLQkJCXJldHVybiAoU3RyaW5nW10pIHRoaXMucmF3SW1wb3J0cy50b0FycmF5KG5ldyBTdHJpbmdbcmF3SW1wb3J0cy5zaXplKCldKTsKLQkJfQotCX0KLQotCQkKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zbGF0b3IncyBwcm9ncnNzIG1vbml0b3IsIGZhbHNlIGlmIHRoZQotCSAqICAgICAgICAgbW9uaXRvciBpcyBudWxsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJcmV0dXJuIGNhbmNlbFBhcnNlOwotCX0KLQkKLQkvKioKLQkgKiBSZWluaXRpYWxpemUgc29tZSBmaWVsZHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKLQkJc3luY2hyb25pemVkKGZMb2NrKSB7Ci0JCQlzY3JpcHRPZmZzZXQgPSAwOwotCQkJLy8gcmVzZXQgcHJvZ3Jlc3MgbW9uaXRvcgotCQkJZlNjcmlwdFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmQ3VycmVudE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlyYXdJbXBvcnRzLmNsZWFyKCk7Ci0JCQlpbXBvcnRMb2NhdGlvbnNJbkh0bWwuY2xlYXIoKTsKLQkJCXNjcmlwdExvY2F0aW9uSW5IdG1sLmNsZWFyKCk7Ci0JCQltaXNzaW5nRW5kVGFnUmVnaW9uU3RhcnQgPSAtMTsKLQkJCWNhbmNlbFBhcnNlID0gZmFsc2U7Ci0JCQlmR2VuZXJhdGVkUmFuZ2VzLmNsZWFyKCk7Ci0JCX0KLQkJdHJhbnNsYXRlKCk7Ci0JfQotCi0KLQkKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZXRDdXJyZW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlKSB7Ci0JCXN5bmNocm9uaXplZChmTG9jaykgewotCQkJcmV0dXJuIHRoaXMuZkN1cnJlbnROb2RlID0gY3VycmVudE5vZGU7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI3RyYW5zbGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdHJhbnNsYXRlKCkgewotCQkvL3NldEN1cnJlbnROb2RlKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQotCQlzeW5jaHJvbml6ZWQoZmluaXNoZWQpIHsKLQkJCWlmKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCkgewotCQkJTm9kZUhlbHBlciBuaCA9IG5ldyBOb2RlSGVscGVyKGdldEN1cnJlbnROb2RlKCkpOwotCQkJd2hpbGUgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCAmJiAhaXNDYW5jZWxlZCgpKSB7Ci0JCQkJbmguc2V0RG9jdW1lbnRSZWdpb24oZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQkJCi0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJUcmFuc2xhdG9yIExvb2tpbmcgYXQgTm9kZQotCQkJCS8vIHR5cGU6IitnZXRDdXJyZW50Tm9kZSgpLmdldFR5cGUoKSsiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tOiIpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgTm9kZUhlbHBlcihnZXRDdXJyZW50Tm9kZSgpKSk7Ci0JCQkJLy8gaS5wcmludGxuKCIvLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0JCQkJaWYgKGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCWlmICgoIW5oLmlzRW5kVGFnKCkgfHwgbmguaXNTZWxmQ2xvc2luZ1RhZygpKSAmJiBuaC5uYW1lRXF1YWxzKCJzY3JpcHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvKgotCQkJCQkJICogSGFuZGxlcyB0aGUgZm9sbG93aW5nIGNhc2VzOiA8c2NyaXB0Ci0JCQkJCQkgKiB0eXBlPSJqYXZhc2NyaXB0eXBlIj4gPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdHlwZT4KLQkJCQkJCSAqIDxzY3JpcHQgc3JjPScnIHR5cGU9amF2YXNjcmlwdHlwZT4gPHNjcmlwdCBzcmM9JycKLQkJCQkJCSAqIGxhbmd1YWdlPWphdmFzY3JpcHR0eXBlIDxzY3JpcHQgc3JjPScnPiBnbG9iYWwganMgdHlwZS4KLQkJCQkJCSAqIDxzY3JpcHQ+IChnbG9iYWwganMgdHlwZSkKLQkJCQkJCSAqLwotCQkJCQkJaWYgKE5vZGVIZWxwZXIuaXNJbkFycmF5KEpzRGF0YVR5cGVzLkpTVkFMSUREQVRBVFlQRVMsIG5oLmdldEF0dHJpYnV0ZVZhbHVlKCJ0eXBlIikpIHx8IE5vZGVIZWxwZXIuaXNJbkFycmF5KEpzRGF0YVR5cGVzLkpTVkFMSUREQVRBVFlQRVMsIG5oLmdldEF0dHJpYnV0ZVZhbHVlKCJsYW5ndWFnZSIpKSB8fCAobmguZ2V0QXR0cmlidXRlVmFsdWUoInR5cGUiKT09bnVsbCAmJiBuaC5nZXRBdHRyaWJ1dGVWYWx1ZSgibGFuZ3VhZ2UiKT09bnVsbCAmJiBpc0dsb2JhbEpzKCkpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCWlmIChuaC5jb250YWluc0F0dHJpYnV0ZShuZXcgU3RyaW5nW10geyAic3JjIiB9KSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCS8vIEhhbmRsZSBpbXBvcnQKLQkJCQkJCQkJdHJhbnNsYXRlU2NyaXB0SW1wb3J0Tm9kZShnZXRDdXJyZW50Tm9kZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gfSBlbHNlIHsKLQkJCQkJCQkvLyBoYW5kbGUgc2NyaXB0IHNlY3Rpb24KLQkJCQkJCQkKLQkJCQkJCQlpZiAoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkgIT0gbnVsbCAvKiYmIGdldEN1cnJlbnROb2RlKCkuZ2V0TmV4dCgpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQqLykgewotCQkJCQkJCQl0cmFuc2xhdGVKU05vZGUoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkpOwotCQkJCQkJCX0KLQkJCQkJCX0gLy8gRW5kIHNlYXJjaCBmb3IgPHNjcmlwdD4gc2VjdGlvbnMKLQkJCQkJfSBlbHNlIGlmIChuaC5jb250YWluc0F0dHJpYnV0ZShKc0RhdGFUeXBlcy5IVE1MQVRSRVZFTlRTKSkgewotCQkJCQkJLyogQ2hlY2sgZm9yIGVtYmVkZGVkIEpTIGV2ZW50cyBpbiBhbnkgdGFncyAqLwotCQkJCQkJdHJhbnNsYXRlSW5saW5lSlNOb2RlKGdldEN1cnJlbnROb2RlKCkpOwotCQkJCQl9IGVsc2UgaWYgKG5oLm5hbWVFcXVhbHMoIk1FVEEiKSAmJiBuaC5hdHRyRXF1YWxzKCJodHRwLWVxdWl2IiwgIkNvbnRlbnQtU2NyaXB0LVR5cGUiKSAmJiBuaC5jb250YWluc0F0dHJpYnV0ZShuZXcgU3RyaW5nW10geyAiY29udGVudCIgfSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQkJLy8gPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idHlwZSI+Ci0JCQkJCQlzZXRJc0dsb2JhbEpzKCBOb2RlSGVscGVyLmlzSW5BcnJheShKc0RhdGFUeXBlcy5KU1ZBTElEREFUQVRZUEVTLCBuaC5nZXRBdHRyaWJ1dGVWYWx1ZSgiY29udGVudCIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSAvLyBFbmQgYmlnIGlmIG9mIEpTIHR5cGVzCi0JCQkJfQotCQkJCWlmIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCQkJYWR2YW5jZU5leHROb2RlKCk7Ci0JCQkJfQotCQkJfSAvLyBlbmQgd2hpbGUgbG9vcAotCQkJaWYoZ2V0Q29tcFVuaXRCdWZmZXIoKSE9bnVsbCkgZ2V0Q29tcFVuaXRCdWZmZXIoKS5zZXRDb250ZW50cyhmU2NyaXB0VGV4dC50b1N0cmluZygpKTsKLQkJfQotCQlmaW5pc2hlZFRyYW5zbGF0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZmluaXNoZWRUcmFuc2xhdGlvbigpIHsKLQkJaWYoREVCVUdfU0FWRV9PVVRQVVQpewotCQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBudWxsOwotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbnVsbDsKLQkJCVByaW50U3RyZWFtIG91dCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJCQlpZiAoeG1sTW9kZWwgPT0gbnVsbCkgewotCQkJCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJCX0KLQkJCQliYXNlTG9jYXRpb24gPSB4bWxNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJCQotCQkJaWYoYmFzZUxvY2F0aW9uIT1udWxsKXsKLQkJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gd29ya3NwYWNlLmdldFJvb3QoKTsKLQkJCQlJRmlsZSB0RmlsZSA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChiYXNlTG9jYXRpb24gKyAiLmpzIikpOwotCQkJCUZpbGUgdGVtcEZpbGUgPSB0RmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOwotCQkJCQotCQkJCSAgaWYodGVtcEZpbGUuZXhpc3RzKCkpewotCQkJCQkgIHRlbXBGaWxlLmRlbGV0ZSgpOwotCQkJCSAgfQotCQkJCSAKLQkJCQkgIHRyeSB7Ci0JCQkJCSAgdGVtcEZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJCQkgIGZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSk7Ci0JCQkJCSAgb3V0ID0gbmV3IFByaW50U3RyZWFtKGZvdXQpOwotCQkJCQkgIG91dC5wcmludGxuKGZTY3JpcHRUZXh0KTsKLQkJCQkJICBvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCi0JCQkJfWZpbmFsbHl7Ci0JCQkJCWlmKG91dCE9bnVsbCkgb3V0LmNsb3NlKCk7Ci0JCQkJCi0JCQkJCQotCQkJCX0KLQkJCQkgdHJ5IHsKLQkJCQkJcm9vdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCi0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI3RyYW5zbGF0ZUlubGluZUpTTm9kZShvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRyYW5zbGF0ZUlubGluZUpTTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRhaW5lcikgewotCQkvLyBTeXN0ZW0ub3V0Ci0JCS8vIC5wcmludGxuKCJKU1BUcmFuc2xhdG9yLnRyYW5zbGF0ZUlubGluZUpTTm9kZSBFbnRlcmVkCi0JCS8vIHcvU2NyaXB0T2Zmc2V0OiIKLQkJLy8gKyBzY3JpcHRPZmZzZXQpOwotCQkKLQkJCS8vTm9kZUhlbHBlciBuaCA9IG5ldyBOb2RlSGVscGVyKGNvbnRhaW5lcik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImlubGluZSBqcyBub2RlIGxvb2tpbmcgYXQ6XG4iICsgbmgpOwotCQkJLyogc3RhcnQgYSBmdW5jdGlvbiBoZWFkZXIuLiB3aWxsIGFtZW5kIGxhdGVyICovCi0JCQlJVGV4dFJlZ2lvbkxpc3QgdCA9IGNvbnRhaW5lci5nZXRSZWdpb25zKCk7Ci0JCQlJVGV4dFJlZ2lvbiByOwotCQkJSXRlcmF0b3IgcmVnaW9uSXRlcmF0b3IgPSB0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpICYmICFpc0NhbmNlbGVkKCkgKSB7Ci0JCQkJciA9IChJVGV4dFJlZ2lvbikgcmVnaW9uSXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJaW50IHN0YXJ0ID0gci5nZXRTdGFydCgpOwotCQkJCQlpbnQgb2Zmc2V0ID0gci5nZXRUZXh0RW5kKCk7Ci0JCQkJCVN0cmluZyB0YWdBdHRybmFtZSA9IGNvbnRhaW5lci5nZXRUZXh0KCkuc3Vic3RyaW5nKHN0YXJ0LCBvZmZzZXQpLnRyaW0oKTsKLQkJCQkJLyoKLQkJCQkJICogQXR0cmlidXRlIHZhbHVlcyBhcmVuJ3QgY2FzZSBzZW5zYXRpdmUsIGFsc28gbWFrZSBzdXJlIG5leHQKLQkJCQkJICogcmVnaW9uIGlzIGF0dHJpYiB2YWx1ZQotCQkJCQkgKi8KLQkJCQkJaWYgKE5vZGVIZWxwZXIuaXNJbkFycmF5KEpzRGF0YVR5cGVzLkhUTUxBVFJFVkVOVFMsIHRhZ0F0dHJuYW1lKSkgewotCQkJCQkJaWYgKHJlZ2lvbkl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCXJlZ2lvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQlyID0gKChJVGV4dFJlZ2lvbikgcmVnaW9uSXRlcmF0b3IubmV4dCgpKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQkJaW50IHZhbFN0YXJ0T2Zmc2V0ID0gY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KHIpOwotCQkJCQkJCS8vIGludCB2YWxFbmRPZmZzZXQgPSByLmdldFRleHRFbmQoKTsKLQkJCQkJCQlTdHJpbmcgcmF3VGV4dCA9IGNvbnRhaW5lci5nZXRUZXh0KCkuc3Vic3RyaW5nKHIuZ2V0U3RhcnQoKSwgci5nZXRUZXh0RW5kKCkpOwotCQkJCQkJCWlmIChyYXdUZXh0ID09IG51bGwgfHwgcmF3VGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJLyogU3RyaXAgcXVvdGVzICovCi0JCQkJCQkJc3dpdGNoIChyYXdUZXh0LmNoYXJBdCgwKSkgewotCQkJCQkJCQljYXNlICdcJyc6Ci0JCQkJCQkJCWNhc2UgJyInOgotCQkJCQkJCQkJcmF3VGV4dCA9IHJhd1RleHQuc3Vic3RyaW5nKDEpOwotCQkJCQkJCQkJdmFsU3RhcnRPZmZzZXQrKzsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHJhd1RleHQgPT0gbnVsbCB8fCByYXdUZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlzd2l0Y2ggKHJhd1RleHQuY2hhckF0KHJhd1RleHQubGVuZ3RoKCkgLSAxKSkgewotCQkJCQkJCQljYXNlICdcJyc6Ci0JCQkJCQkJCWNhc2UgJyInOgotCQkJCQkJCQkJcmF3VGV4dCA9IHJhd1RleHQuc3Vic3RyaW5nKDAsIHJhd1RleHQubGVuZ3RoKCkgLSAxKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gUG9zaXRpb24gaW5TY3JpcHQgPSBuZXcgUG9zaXRpb24oc2NyaXB0T2Zmc2V0LAotCQkJCQkJCS8vIHJhd1RleHQubGVuZ3RoKCkpOwotCQkJCQkJCS8qIFF1b3RlZCB0ZXh0IHN0YXJ0cyArMSBhbmQgZW5kcyAtMSBjaGFyICovCi0JCQkJCQkJaWYoQUREX1NFTUlDT0xPTl9BVF9JTkxJTkUpIHJhd1RleHQgPSByYXdUZXh0ICsgIjsiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJUG9zaXRpb24gaW5IdG1sID0gbmV3IFBvc2l0aW9uKHZhbFN0YXJ0T2Zmc2V0LCByYXdUZXh0Lmxlbmd0aCgpKTsKLQkJCQkJCQlzY3JpcHRMb2NhdGlvbkluSHRtbC5hZGQoaW5IdG1sKTsKLQkJCQkJCQkvKiBuZWVkIHRvIHBhZCB0aGUgc2NyaXB0IHRleHQgd2l0aCBzcGFjZXMgKi8KLQkJCQkJCQljaGFyW10gc3BhY2VzID0gVXRpbC5nZXRQYWQodmFsU3RhcnRPZmZzZXQgLSBzY3JpcHRPZmZzZXQpOwotCQkJCQkJCWZTY3JpcHRUZXh0LmFwcGVuZChzcGFjZXMpOwotCQkJCQkJCWZTY3JpcHRUZXh0LmFwcGVuZChyYXdUZXh0KTsKLQkJCQkJCQlzY3JpcHRPZmZzZXQgPSBmU2NyaXB0VGV4dC5sZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciN0cmFuc2xhdGVKU05vZGUob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGVKU05vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250YWluZXIpIHsKLQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lclJlZ2lvbiA9IGNvbnRhaW5lcjsKLQkJSXRlcmF0b3IgcmVnaW9ucyA9IGNvbnRhaW5lclJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJCi0JCWlmKGNvbnRhaW5lcj09bnVsbCkgcmV0dXJuOwotCQkKLQkJY2hhcltdIHNwYWNlcyA9IFV0aWwuZ2V0UGFkKGNvbnRhaW5lci5nZXRTdGFydE9mZnNldCgpIC0gc2NyaXB0T2Zmc2V0KTsKLQkJZlNjcmlwdFRleHQuYXBwZW5kKHNwYWNlcyk7Ci0JCXNjcmlwdE9mZnNldCA9IGNvbnRhaW5lci5nZXRTdGFydE9mZnNldCgpOwotCQotCQlpZihjb250YWluZXIuZ2V0VHlwZSgpIT1ET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgJiYgY29udGFpbmVyLmdldFR5cGUoKSE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpICYmICFpc0NhbmNlbGVkKCkpIHsKLQkJCXJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkvLyBjb250ZW50IGFzc2lzdCB3YXMgbm90IHNob3dpbmcgdXAgaW4gSlNQIGluc2lkZSBhIGphdmFzY3JpcHQKLQkJCS8vIHJlZ2lvbgotCQkJCi0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUmVnaW9uIHRleHQ6ICIgKyBjb250YWluZXIuZ2V0VGV4dCgpLnN1YnN0cmluZyhyZWdpb24uZ2V0U3RhcnQoKSwgcmVnaW9uLmdldEVuZCgpKSk7Ci0JCQlib29sZWFuIGlzQ29udGFpbmVyUmVnaW9uID0gcmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXI7Ci0JCQkvKiBtYWtlIHN1cmUgaXRzIG5vdCBhIHN1YiBjb250YWluZXIgcmVnaW9uLCBwcm9iYWJseSBKU1AgKi8KLQkJCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCApIHsKLQkJCQlpbnQgc2NyaXB0U3RhcnQgPSBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgc2NyaXB0VGV4dExlbmd0aCA9IGNvbnRhaW5lci5nZXRMZW5ndGgoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVGV4dCA9IGNvbnRhaW5lci5nZXRGdWxsVGV4dChyZWdpb24pOwotCQkJCXJlZ2lvblRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKHJlZ2lvblRleHQsIENEQVRBX1NUQVJULCBDREFUQV9TVEFSVF9QQUQpOwotCQkJCXJlZ2lvblRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKHJlZ2lvblRleHQsIENEQVRBX0VORCwgQ0RBVEFfRU5EX1BBRCk7Ci0JCQkJaW50IHJlZ2lvbkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkKLQkJCQlzcGFjZXMgPSBVdGlsLmdldFBhZChzY3JpcHRTdGFydCAtIHNjcmlwdE9mZnNldCk7Ci0JCQkJZlNjcmlwdFRleHQuYXBwZW5kKHNwYWNlcyk7IAkKLQkJCQkvLyBza2lwIG92ZXIgWE1ML0hUTUwgY29tbWVudCBzdGFydHMKLQkJCQlpZiAocmVnaW9uVGV4dC5pbmRleE9mKFhNTF9DT01NRU5UX1NUQVJUKSA+PSAwKSB7Ci0JCQkJCWludCBpbmRleCA9IHJlZ2lvblRleHQuaW5kZXhPZihYTUxfQ09NTUVOVF9TVEFSVCk7Ci0JCQkJCQotCQkJCQlib29sZWFuIHJlcGxhY2VDb21tZW50U3RhcnQgPSB0cnVlOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiByZXBsYWNlIHRoZSBjb21tZW50IHN0YXJ0IGluIHRoZSB0cmFuc2xhdGlvbiB3aGVuCi0JCQkJCQkgKiBpdCdzIHByZWNlZGVkIG9ubHkgYnkgd2hpdGUgc3BhY2UKLQkJCQkJCSAqLwotCQkJCQkJcmVwbGFjZUNvbW1lbnRTdGFydCA9IHJlcGxhY2VDb21tZW50U3RhcnQgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShyZWdpb25UZXh0LmNoYXJBdChpKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChyZXBsYWNlQ29tbWVudFN0YXJ0KSB7Ci0JCQkJCQlJUmVnaW9uIGxpbmU7Ci0JCQkJCQlpbnQgZW5kOwotCQkJCQkJaW50IGxlbmd0aDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbGluZSA9IGNvbnRhaW5lci5nZXRQYXJlbnREb2N1bWVudCgpLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGluZGV4ICsgc2NyaXB0U3RhcnQpOwotCQkJCQkJCWVuZCA9IGxpbmUuZ2V0T2Zmc2V0KCkgKyBsaW5lLmdldExlbmd0aCgpIC0gc2NyaXB0U3RhcnQ7Ci0JCQkJCQkJaWYoZW5kID4gcmVnaW9uVGV4dC5sZW5ndGgoKSkgewotCQkJCQkJCQllbmQgPSByZWdpb25UZXh0Lmxlbmd0aCgpLTE7Ci0JCQkJCQkJfQotCQkJCQkJCWxlbmd0aCA9IGVuZCAtIGluZGV4OwotCQkJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgSFRNTCBzdHlsZSBjb21tZW50IGxpbmUgaW5mb3JtYXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQotCQkJCQkJCWVuZCA9IGluZGV4ICsgWE1MX0NPTU1FTlRfU1RBUlQubGVuZ3RoKCk7Ci0JCQkJCQkJbGVuZ3RoID0gWE1MX0NPTU1FTlRfU1RBUlQubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCVN0cmluZ0J1ZmZlciBuZXdSZWdpb25UZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihyZWdpb25UZXh0LnN1YnN0cmluZygwLCBpbmRleCkpOwotCQkJCQkJc3BhY2VzID0gVXRpbC5nZXRQYWQobGVuZ3RoKTsKLQkJCQkJCW5ld1JlZ2lvblRleHQuYXBwZW5kKHNwYWNlcyk7Ci0JCQkJCQluZXdSZWdpb25UZXh0LmFwcGVuZChyZWdpb25UZXh0LnN1YnN0cmluZyhlbmQpKTsKLQkJCQkJCXJlZ2lvblRleHQgPSBuZXdSZWdpb25UZXh0LnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gc2VydmVyLXNpZGUgY29kZQotLy8JCQkJZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEZpeCBmb3IKLQkJCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NDc3NAotCQkJCQkgKiBlbmQgb2YgbGFzdCB2YWxpZCBKUyBzb3VyY2UsIHN0YXJ0IG9mIG5leHQgY29udGVudCB0bwotCQkJCQkgKiBza2lwCi0JCQkJCSAqLwotCQkJCQkvLyBsYXN0IG9mZnNldCBvZiB2YWxpZCBKUyBzb3VyY2UsIGFmdGVyIHdoaWNoIHRoZXJlJ3Mgc2VydmVyLXNpZGUgc3R1ZmYKLQkJCQkJaW50IHZhbGlkSlNlbmQgPSAwOwotCQkJCQkvLyBzdGFydCBvZiBuZXh0IHZhbGlkIEpTIHNvdXJjZSwgbGFzdCBvZmZzZXQgb2YgY29udGVudCB0aGF0IHdhcyBza2lwcGVkCi0JCQkJCWludCB2YWxpZEpTc3RhcnQgPSAwOwotCi0JCQkJCU1hdGNoZXIgbWF0Y2hlciA9IGZDbGllbnRTaWRlVGFnUGF0dGVybi5tYXRjaGVyKHJlZ2lvblRleHQpOwotCQkJCQkvLyBub3RlIHRoZSBzdGFydCBvZiBhIEhUTUwgdGFnIGlmIG9uZSdzIHByZXNlbnQKLQkJCQkJaW50IGNsaWVudE1hdGNoU3RhcnQgPSBtYXRjaGVyLmZpbmQoKSA/IG1hdGNoZXIuc3RhcnQoKSA6IC0xOwotCi0JCQkJCVN0cmluZ0J1ZmZlciBjb250ZW50cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCi0JCQkJCWludCBzZXJ2ZXJTaWRlU3RhcnQgPSAtMTsKLQkJCQkJaW50IHNlcnZlclNpZGVEZWxpbWl0ZXIgPSAwOwotCi0JCQkJCS8vIGZpbmQgYW55IGluc3RhbmNlIG9mIHNlcnZlciBjb2RlIGJsb2NrcyBpbiB0aGUgcmVnaW9uIHRleHQKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU2VydmVyU2lkZURlbGltaXRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWludCBpbmRleCA9IHJlZ2lvblRleHQuaW5kZXhPZihmU2VydmVyU2lkZURlbGltaXRlcnNbaV1bMF0pOwotCQkJCQkJaWYgKHNlcnZlclNpZGVTdGFydCA8IDApIHsKLQkJCQkJCQlzZXJ2ZXJTaWRlU3RhcnQgPSBpbmRleDsKLQkJCQkJCQlzZXJ2ZXJTaWRlRGVsaW1pdGVyID0gaTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGluZGV4ID49IDApIHsKLQkJCQkJCQlzZXJ2ZXJTaWRlU3RhcnQgPSBNYXRoLm1pbihzZXJ2ZXJTaWRlU3RhcnQsIGluZGV4KTsKLQkJCQkJCQlpZiAoc2VydmVyU2lkZVN0YXJ0ID09IGluZGV4KSB7Ci0JCQkJCQkJCXNlcnZlclNpZGVEZWxpbWl0ZXIgPSBpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBjb250YWlucyBzb21ldGhpbmcgb3RoZXIgdGhhbiBwdXJlIEphdmFTY3JpcHQKLQkJCQkJd2hpbGUgKHNlcnZlclNpZGVTdGFydCA+IC0xIHx8IGNsaWVudE1hdGNoU3RhcnQgPiAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQl2YWxpZEpTZW5kID0gdmFsaWRKU3N0YXJ0OwotCQkJCQkJYm9vbGVhbiBiaWFzQ2xpZW50ID0gZmFsc2U7Ci0JCQkJCQlib29sZWFuIGJpYXNTZXJ2ZXIgPSBmYWxzZTsKLQkJCQkJCS8vIHVwZGF0ZSB0aGUgc3RhcnQgb2YgY29udGVudCB0byBza2lwCi0JCQkJCQlpZiAoY2xpZW50TWF0Y2hTdGFydCA+IC0xICYmIHNlcnZlclNpZGVTdGFydCA+IC0xKSB7Ci0JCQkJCQkJdmFsaWRKU2VuZCA9IE1hdGgubWluKGNsaWVudE1hdGNoU3RhcnQsIHNlcnZlclNpZGVTdGFydCk7Ci0JCQkJCQkJYmlhc0NsaWVudCA9IHZhbGlkSlNlbmQgPT0gY2xpZW50TWF0Y2hTdGFydDsKLQkJCQkJCQliaWFzU2VydmVyID0gdmFsaWRKU2VuZCA9PSBzZXJ2ZXJTaWRlU3RhcnQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChjbGllbnRNYXRjaFN0YXJ0ID4gLTEgJiYgc2VydmVyU2lkZVN0YXJ0IDwgMCkgewotCQkJCQkJCXZhbGlkSlNlbmQgPSBjbGllbnRNYXRjaFN0YXJ0OwotCQkJCQkJCWJpYXNDbGllbnQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoY2xpZW50TWF0Y2hTdGFydCA8IDAgJiYgc2VydmVyU2lkZVN0YXJ0ID4gLTEpIHsKLQkJCQkJCQl2YWxpZEpTZW5kID0gc2VydmVyU2lkZVN0YXJ0OwotCQkJCQkJCWJpYXNTZXJ2ZXIgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQkvLyBhcHBlbmQgaWYgdGhlcmUncyBzb21ldGhpbmcgd2Ugd2FudCB0byBpbmNsdWRlCi0JCQkJCQlpZiAoLTEgPCB2YWxpZEpTc3RhcnQgJiYgLTEgPCB2YWxpZEpTZW5kKSB7Ci0JCQkJCQkJLy8gYXBwZW5kIHdoYXQgd2Ugd2FudCB0byBpbmNsdWRlCi0JCQkJCQkJY29udGVudHMuYXBwZW5kKHJlZ2lvblRleHQuc3Vic3RyaW5nKHZhbGlkSlNzdGFydCwgdmFsaWRKU2VuZCkpOwotCQkJCQkJCQotCQkJCQkJCS8vIGNoYW5nZSB0aGUgc2tpcHBlZCBjb250ZW50IHRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZSBhbmQgYXBwZW5kIGl0IGFzIGEgcGxhY2Vob2xkZXIKLQkJCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSArIHZhbGlkSlNlbmQ7Ci0KLQkJCQkJCQlTdHJpbmcgc2VydmVyRW5kID0gZlNlcnZlclNpZGVEZWxpbWl0ZXJzW3NlcnZlclNpZGVEZWxpbWl0ZXJdWzFdOwotCQkJCQkJCWludCBzZXJ2ZXJTaWRlRW5kID0gKHJlZ2lvbkxlbmd0aCA+IHZhbGlkSlNlbmQgKyBzZXJ2ZXJFbmQubGVuZ3RoKCkpID8gcmVnaW9uVGV4dC5pbmRleE9mKHNlcnZlckVuZCwgdmFsaWRKU2VuZCArIGZTZXJ2ZXJTaWRlRGVsaW1pdGVyc1tzZXJ2ZXJTaWRlRGVsaW1pdGVyXVsxXS5sZW5ndGgoKSkgOiAtMTsKLQkJCQkJCQlpZiAoc2VydmVyU2lkZUVuZCA+IC0xKQotCQkJCQkJCQlzZXJ2ZXJTaWRlRW5kICs9IHNlcnZlckVuZC5sZW5ndGgoKTsKLQkJCQkJCQlpbnQgY2xpZW50TWF0Y2hFbmQgPSBtYXRjaGVyLmZpbmQodmFsaWRKU2VuZCkgPyBtYXRjaGVyLmVuZCgpIDogLTE7Ci0JCQkJCQkJLy8gdXBkYXRlIGVuZCBvZiB3aGF0IHdlIHNraXBwZWQKLQkJCQkJCQl2YWxpZEpTc3RhcnQgPSAtMTsKLQkJCQkJCQlpZiAoY2xpZW50TWF0Y2hFbmQgPiB2YWxpZEpTZW5kICYmIHNlcnZlclNpZGVFbmQgPiB2YWxpZEpTZW5kKSB7Ci0JCQkJCQkJCWlmIChiaWFzQ2xpZW50KQotCQkJCQkJCQkJdmFsaWRKU3N0YXJ0ID0gY2xpZW50TWF0Y2hFbmQ7Ci0JCQkJCQkJCWVsc2UgaWYgKGJpYXNTZXJ2ZXIpCi0JCQkJCQkJCQl2YWxpZEpTc3RhcnQgPSBzZXJ2ZXJTaWRlRW5kOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQl2YWxpZEpTc3RhcnQgPSBNYXRoLm1pbihjbGllbnRNYXRjaEVuZCwgc2VydmVyU2lkZUVuZCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChjbGllbnRNYXRjaEVuZCA+PSB2YWxpZEpTZW5kICYmIHNlcnZlclNpZGVFbmQgPCAwKQotCQkJCQkJCQl2YWxpZEpTc3RhcnQgPSBtYXRjaGVyLmVuZCgpOwotCQkJCQkJCWlmIChjbGllbnRNYXRjaEVuZCA8IDAgJiYgc2VydmVyU2lkZUVuZCA+PSB2YWxpZEpTZW5kKQotCQkJCQkJCQl2YWxpZEpTc3RhcnQgPSBzZXJ2ZXJTaWRlRW5kOwotCQkJCQkJCWludCBsaW5lID0gY29udGFpbmVyLmdldFBhcmVudERvY3VtZW50KCkuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0T2Zmc2V0KTsKLQkJCQkJCQlpbnQgY29sdW1uOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWNvbHVtbiA9IHN0YXJ0T2Zmc2V0IC0gY29udGFpbmVyLmdldFBhcmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJY29sdW1uID0gLTE7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIHN1YnN0aXR1dGVkIHRleHQgbGVuZ3RoIG11Y2ggbWF0Y2ggb3JpZ2luYWwgbGVuZ3RoIGV4YWN0bHksIGZpbmQgdGV4dCBvZiB0aGUgcmlnaHQgbGVuZ3RoCi0JCQkJCQkJaW50IHN0YXJ0ID0gdmFsaWRKU2VuZCArIGNvbnRhaW5lci5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQkJCWNvbnRlbnRzLmFwcGVuZCgnXycpOwotCQkJCQkJCWZvciAoaW50IGkgPSB2YWxpZEpTZW5kICsgMTsgaSA8IHZhbGlkSlNzdGFydDsgaSsrKSB7Ci0JCQkJCQkJCXN3aXRjaCAoaSAtIHZhbGlkSlNlbmQpIHsKLQkJCQkJCQkJCWNhc2UgMSA6Ci0JCQkJCQkJCQkJY29udGVudHMuYXBwZW5kKCckJyk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIDIgOgotCQkJCQkJCQkJCWNvbnRlbnRzLmFwcGVuZCgndCcpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSAzIDoKLQkJCQkJCQkJCQljb250ZW50cy5hcHBlbmQoJ2EnKTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgNCA6Ci0JCQkJCQkJCQkJY29udGVudHMuYXBwZW5kKCdnJyk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQljb250ZW50cy5hcHBlbmQoJ18nKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpbnQgZW5kID0gdmFsaWRKU3N0YXJ0ICsgY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCQkJLy8gcmVtZW1iZXIgdGhhdCB0aGlzIHNvdXJjZSByYW5nZSB3Ci0JCQkJCQkJZkdlbmVyYXRlZFJhbmdlcy5hZGQobmV3IFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpKTsKLQkJCQkJCX0KLQkJCQkJCS8vIHNldCB1cCB0byBlbmQgd2hpbGUgaWYgbm8gZW5kIGZvciB2YWxpZAotCQkJCQkJaWYgKHZhbGlkSlNzdGFydCA+IDApIHsKLQkJCQkJCQlpbnQgc2VydmVyU2lkZVN0YXJ0R3Vlc3MgPSAtMTsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZTZXJ2ZXJTaWRlRGVsaW1pdGVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlpbnQgaW5kZXggPSByZWdpb25UZXh0LmluZGV4T2YoZlNlcnZlclNpZGVEZWxpbWl0ZXJzW2ldWzBdLCB2YWxpZEpTc3RhcnQpOwotCQkJCQkJCQlpZiAoc2VydmVyU2lkZVN0YXJ0R3Vlc3MgPCAwKSB7Ci0JCQkJCQkJCQlzZXJ2ZXJTaWRlU3RhcnRHdWVzcyA9IGluZGV4OwotCQkJCQkJCQkJc2VydmVyU2lkZURlbGltaXRlciA9IGk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAoaW5kZXggPj0gMCkgewotCQkJCQkJCQkJc2VydmVyU2lkZVN0YXJ0R3Vlc3MgPSBNYXRoLm1pbihzZXJ2ZXJTaWRlU3RhcnRHdWVzcywgaW5kZXgpOwotCQkJCQkJCQkJaWYgKHNlcnZlclNpZGVTdGFydEd1ZXNzID09IGluZGV4KSB7Ci0JCQkJCQkJCQkJc2VydmVyU2lkZURlbGltaXRlciA9IGk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJc2VydmVyU2lkZVN0YXJ0ID0gdmFsaWRKU3N0YXJ0IDwgcmVnaW9uTGVuZ3RoIC0gZlNob3J0ZXN0U2VydmVyU2lkZURlbGltaXRlclBhaXJMZW5ndGggPyBzZXJ2ZXJTaWRlU3RhcnRHdWVzcyA6IC0xOwotCQkJCQkJCWNsaWVudE1hdGNoU3RhcnQgPSB2YWxpZEpTc3RhcnQgPCByZWdpb25MZW5ndGggPyAobWF0Y2hlci5maW5kKHZhbGlkSlNzdGFydCkgPyBtYXRjaGVyLnN0YXJ0KCkgOiAtMSkgOiAtMTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXNlcnZlclNpZGVTdGFydCA9IGNsaWVudE1hdGNoU3RhcnQgPSAtMTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAodmFsaWRKU3N0YXJ0ID49IDApIHsKLQkJCQkJCWNvbnRlbnRzLmFwcGVuZChyZWdpb25UZXh0LnN1YnN0cmluZyh2YWxpZEpTc3RhcnQpKTsKLQkJCQkJfQotCQkJCQlpZiAoY29udGVudHMubGVuZ3RoKCkgIT0gMCkgewotCQkJCQkJZlNjcmlwdFRleHQuYXBwZW5kKGNvbnRlbnRzLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZlNjcmlwdFRleHQuYXBwZW5kKHJlZ2lvblRleHQpOwotCQkJCQl9Ci0JCQkJCVBvc2l0aW9uIGluSHRtbCA9IG5ldyBQb3NpdGlvbihzY3JpcHRTdGFydCwgc2NyaXB0VGV4dExlbmd0aCk7Ci0JCQkJCXNjcmlwdExvY2F0aW9uSW5IdG1sLmFkZChpbkh0bWwpOwotLy8JCQkJfQotCQkJCQkJCQkKLQkJCQlzY3JpcHRPZmZzZXQgPSBmU2NyaXB0VGV4dC5sZW5ndGgoKTsKLQkJCX0KLQkJfQotCQkKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWcgPSBjb250YWluZXIuZ2V0TmV4dCgpOwotCQkKLQkJaWYoZW5kVGFnPT1udWxsKSB7Ci0JCQltaXNzaW5nRW5kVGFnUmVnaW9uU3RhcnQgPSBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfWVsc2UgaWYoZW5kVGFnIT1udWxsKSB7Ci0JCQlOb2RlSGVscGVyIG5oID0gbmV3IE5vZGVIZWxwZXIoZW5kVGFnKTsKLQkJCVN0cmluZyBuYW1lID0gbmguZ2V0VGFnTmFtZSgpOwotCQkJCi0JCQlpZihuYW1lPT1udWxsIHx8ICFuYW1lLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJzY3JpcHQiKSB8fCAhbmguaXNFbmRUYWcoKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbWlzc2luZ0VuZFRhZ1JlZ2lvblN0YXJ0ID0gY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI3RyYW5zbGF0ZVNjcmlwdEltcG9ydE5vZGUob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGVTY3JpcHRJbXBvcnROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCU5vZGVIZWxwZXIgbmggPSBuZXcgTm9kZUhlbHBlcihyZWdpb24pOwotCQlTdHJpbmcgaW1wb3J0TmFtZSA9IG5oLmdldEF0dHJpYnV0ZVZhbHVlKCJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW1wb3J0TmFtZSAhPSBudWxsICYmICFpbXBvcnROYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmF3SW1wb3J0cy5hZGQoaW1wb3J0TmFtZSk7Ci0JCQlQb3NpdGlvbiBpbkh0bWwgPSBuZXcgUG9zaXRpb24ocmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHJlZ2lvbi5nZXRFbmRPZmZzZXQoKSk7Ci0JCQlpbXBvcnRMb2NhdGlvbnNJbkh0bWwuYWRkKGluSHRtbCk7Ci0JCX0KLQl9Ci0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWNhbmNlbFBhcnNlID0gdHJ1ZTsKLQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNkb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmSXNJblJld3JpdGVTZXNzaW9uKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlyZXNldCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXNldCgpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkoKElEb2N1bWVudEV4dGVuc2lvbjQpIGZTdHJ1Y3R1cmVkRG9jdW1lbnQpLnJlbW92ZURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcihmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGZHZW5lcmF0ZWRSYW5nZXMKLQkgKi8KLQlwdWJsaWMgUmVnaW9uW10gZ2V0R2VuZXJhdGVkUmFuZ2VzKCkgewotCQlyZXR1cm4gKFJlZ2lvbltdKSBmR2VuZXJhdGVkUmFuZ2VzLnRvQXJyYXkobmV3IFJlZ2lvbltmR2VuZXJhdGVkUmFuZ2VzLnNpemUoKV0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMGJhZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMKLSAqIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUKLSAqIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0bwotICogc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkKLSAqIGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZQotICogQVBJIGV2b2x2ZXMuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhNZXNzYWdlcy5CVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vZGVIZWxwZXIwMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb2RlSGVscGVyMDE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9kZUhlbHBlcjAzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vZGVIZWxwZXIxMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb2RlSGVscGVyMTI7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvTm9kZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Ob2RlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZmQ4M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Ob2RlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIE5vZGVIZWxwZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfUVVPVEVfQ0hBUiA9ICdcIic7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFX0VOVElUWSA9ICImcXVvdDsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URV9DSEFSID0gJ1wnJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEVfRU5USVRZID0gIiYjMDM5OyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbkFycmF5KFN0cmluZyBTdHJpbmdBcnJheVtdLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoU3RyaW5nQXJyYXkgPT0gbnVsbCB8fCB0ZXh0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IFN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoU3RyaW5nQXJyYXlbaV0uZXF1YWxzSWdub3JlQ2FzZSh0ZXh0LnRyaW0oKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1F1b3RlZChTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmICgoc3RyaW5nID09IG51bGwpIHx8IChzdHJpbmcubGVuZ3RoKCkgPCAyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBsYXN0SW5kZXggPSBzdHJpbmcubGVuZ3RoKCkgLSAxOwotCQljaGFyIGZpcnN0Q2hhciA9IHN0cmluZy5jaGFyQXQoMCk7Ci0JCWNoYXIgbGFzdENoYXIgPSBzdHJpbmcuY2hhckF0KGxhc3RJbmRleCk7Ci0JCXJldHVybiAoKChmaXJzdENoYXIgPT0gTm9kZUhlbHBlci5TSU5HTEVfUVVPVEVfQ0hBUikgJiYgKGxhc3RDaGFyID09IE5vZGVIZWxwZXIuU0lOR0xFX1FVT1RFX0NIQVIpKSB8fCAoKGZpcnN0Q2hhciA9PSBOb2RlSGVscGVyLkRPVUJMRV9RVU9URV9DSEFSKSAmJiAobGFzdENoYXIgPT0gTm9kZUhlbHBlci5ET1VCTEVfUVVPVEVfQ0hBUikpKTsKLQl9Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uOwotCQotCXB1YmxpYyBOb2RlSGVscGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCXRoaXMucmVnaW9uID0gcmVnaW9uOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBhdHRyRXF1YWxzKFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgYXR0VmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGUpOwotCQlpZihhdHRWYWx1ZT09bnVsbCkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYXR0VmFsdWUuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgQXR0clRvU3RyaW5nKCkgewotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vIEZvciBkZWJ1Z2dpbmcKLQkJSVRleHRSZWdpb25MaXN0IHQgPSByZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByOwotCQlJdGVyYXRvciByZWdpb25JdGVyYXRvciA9IHQuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIFN0cnVjdHVyZWRWYWx1ZSA9IE1lc3NhZ2VzLk5vZGVIZWxwZXIwMCArIGdldFRhZ05hbWUoKSArIE1lc3NhZ2VzLk5vZGVIZWxwZXIwMTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXdoaWxlIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlTdHJ1Y3R1cmVkVmFsdWUgKz0gIlx0XHQiICsgcmVnaW9uLmdldFRleHQocik7IC8vJE5PTi1OTFMtMSQKLQkJCQkvKgotCQkJCSAqIFRoZXJlcyBhIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyBhZnRlciB0aGUKLQkJCQkgKiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FIHdlIGhhdmUgdG8gZ2V0IHJpZCBvZgotCQkJCSAqLwotCQkJCWlmIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJcmVnaW9uSXRlcmF0b3IubmV4dCgpOwotCQkJCX0KLQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQkJaWYgKHJlZ2lvbkl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJciA9ICgoSVRleHRSZWdpb24pIHJlZ2lvbkl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCVN0cnVjdHVyZWRWYWx1ZSArPSAiXHRcdCIgKyBzdHJpcEVuZFF1b3RlcyhyZWdpb24uZ2V0VGV4dChyKSkgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RydWN0dXJlZFZhbHVlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0F0dHJpYnV0ZShTdHJpbmcgbmFtZVtdKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlJVGV4dFJlZ2lvbkxpc3QgdCA9IHJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHI7Ci0JCUl0ZXJhdG9yIHJlZ2lvbkl0ZXJhdG9yID0gdC5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJU3RyaW5nIHRhZ25hbWUgPSByZWdpb24uZ2V0VGV4dChyKS50cmltKCk7Ci0JCQkJLyogQXR0cmlidXRlIHZhbHVlcyBhcmVuJ3QgY2FzZSBzZW5zYXRpdmUgKi8KLQkJCQlpZiAoTm9kZUhlbHBlci5pc0luQXJyYXkobmFtZSwgdGFnbmFtZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZSkgewotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlUZXh0UmVnaW9uTGlzdCB0ID0gcmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gcjsKLQkJSXRlcmF0b3IgcmVnaW9uSXRlcmF0b3IgPSB0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlTdHJpbmcgdGFnbmFtZSA9IHJlZ2lvbi5nZXRUZXh0KHIpLnRyaW0oKTsKLQkJCQkvKgotCQkJCSAqIEF0dHJpYnV0ZSB2YWx1ZXMgYXJlbid0IGNhc2Ugc2Vuc2F0aXZlLCBhbHNvIG1ha2Ugc3VyZSBuZXh0Ci0JCQkJICogcmVnaW9uIGlzIGF0dHJpYiB2YWx1ZQotCQkJCSAqLwotCQkJCWlmICh0YWduYW1lLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsKLQkJCQkJaWYgKHJlZ2lvbkl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJcmVnaW9uSXRlcmF0b3IubmV4dCgpOwotCQkJCQl9Ci0JCQkJCWlmIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCXIgPSAoKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCkpOwotCQkJCQl9Ci0JCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlyZXR1cm4gc3RyaXBFbmRRdW90ZXMocmVnaW9uLmdldFRleHQocikpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRBc0ZsYXRTdHJpbmcoKSB7Ci0JCS8qCi0JCSAqIFJldHVybnMgYSBmdWxsIHN0cmluZyBvZiB0aGlzIGVsZW1lbnQgbWludXMgYW5kICdpbGxlZ2FsJyBjaGFyYWN0ZXJzCi0JCSAqICh1c2VmdWxsIGZvciBpZGVudGlmeWluZyB0aGUgSFRNTCBlbGVtZW50IGluIGEgZ2VuZXJpYyBKUyBmdW5jdGlvbikKLQkJICovCi0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGZ1bGxSZWdpb25UZXh0ID0gcmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCWlmIChmdWxsUmVnaW9uVGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZnVsbFJlZ2lvblRleHQucmVwbGFjZUFsbCgiW15hLXpBLVowLTldIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUYWdOYW1lKCkgewotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlUZXh0UmVnaW9uTGlzdCB0ID0gcmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gcjsKLQkJSXRlcmF0b3IgcmVnaW9uSXRlcmF0b3IgPSB0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCXJldHVybiByZWdpb24uZ2V0VGV4dChyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4uZXF1YWxzKHJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU2VsZkNsb3NpbmdUYWcoKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UuZXF1YWxzKHJlZ2lvbi5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZUVxdWFscyhTdHJpbmcgbmFtZSkgewotCQlpZiAocmVnaW9uID09IG51bGwgfHwgbmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIG5hbWUuZXF1YWxzSWdub3JlQ2FzZShnZXRUYWdOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1JlZ2lvbikgewotCQlpZiAobmV3UmVnaW9uID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXJlZ2lvbiA9IG5ld1JlZ2lvbjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBzdHJpcEVuZFF1b3RlcyhTdHJpbmcgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoTm9kZUhlbHBlci5pc1F1b3RlZCh0ZXh0KSkgewotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJSVRleHRSZWdpb25MaXN0IHQgPSByZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJdGVyYXRvciByZWdpb25JdGVyYXRvciA9IHQuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIG5vZGVUZXh0ID0gbmV3IFN0cmluZygpOwotCQl3aGlsZSAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByID0gKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmcgbm9kZVR5cGUgPSByLmdldFR5cGUoKTsKLQkJCW5vZGVUZXh0ICs9IChNZXNzYWdlcy5Ob2RlSGVscGVyMTEgKyBub2RlVHlwZSArIE1lc3NhZ2VzLk5vZGVIZWxwZXIxMiArIHJlZ2lvbi5nZXRUZXh0KHIpICsgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbm9kZVRleHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MmFlYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogICAgIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVXRpbCB7Ci0JcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0UGFkKGludCBudW1iZXJPZkNoYXJzKSB7Ci0JCWlmKG51bWJlck9mQ2hhcnMgPCAwKSByZXR1cm4gbmV3IGNoYXJbMF07Ci0JCWZpbmFsIGNoYXJbXSBzcGFjZUFycmF5ID0gbmV3IGNoYXJbbnVtYmVyT2ZDaGFyc107Ci0JCUFycmF5cy5maWxsKHNwYWNlQXJyYXksICcgJyk7Ci0JCXJldHVybiBzcGFjZUFycmF5OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVBbGwoU3RyaW5nIHNvdXJjZSwgY2hhciByZW1vdmUpIHsKLQkJCi0JCVN0cmluZyBuZXdTdHJpbmcgPSAiIjsKLQkJCi0JCWNoYXJbXSBvbGRTdHJpbmdBcnJheSA9IHNvdXJjZS50b0NoYXJBcnJheSgpOwotCQkKLQkJZm9yKGludCBpID0gMDtpPG9sZFN0cmluZ0FycmF5Lmxlbmd0aDtpKyspIHsKLQkJCWlmKG9sZFN0cmluZ0FycmF5W2ldIT1yZW1vdmUpIG5ld1N0cmluZys9b2xkU3RyaW5nQXJyYXlbaV07Ci0JCX0KLQkJcmV0dXJuIG5ld1N0cmluZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L1dlYlJvb3RGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvV2ViUm9vdEZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDk1OGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvV2ViUm9vdEZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QuTW9kdWxlQ29yZVN1cHBvcnQ7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIFdlYlJvb3RGaW5kZXIgewotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0U2VydmVyQ29udGV4dFJvb3QoSVByb2plY3QgcHJvamVjdCkgewotCQlJUGF0aCByb290ID0gTW9kdWxlQ29yZVN1cHBvcnQuZ2V0V2ViQ29udGVudFJvb3RQYXRoKHByb2plY3QpOwotCQlpZiAocm9vdCAhPSBudWxsKQotCQkJcmV0dXJuIHJvb3Q7Ci0JCXJldHVybiBQYXRoLlJPT1Q7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiBwcm9qZWN0LXJlbGF0aXZlIHBhdGggdG8gdGhlIHdlYiBjb250ZW50IHJvb3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlJUGF0aCByb290ID0gTW9kdWxlQ29yZVN1cHBvcnQuZ2V0V2ViQ29udGVudFJvb3RQYXRoKHByb2plY3QpOwotCQlpZiAocm9vdCAhPSBudWxsKQotCQkJcmV0dXJuIHJvb3QucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJcmV0dXJuIFBhdGguUk9PVDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V2ViQ29udGV4dChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjY2RkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTm9kZUhlbHBlci4wPVRhZyBuYW1lOgotTm9kZUhlbHBlci4xPVx0QXR0cmlidXRlXHRWYWx1ZVxuCi1Ob2RlSGVscGVyLjM9YXR0cmliIHR5cGUKLU5vZGVIZWxwZXIuMTE9XHROb2RlIFR5cGU6Ci1Ob2RlSGVscGVyLjEyPVwgXHRcdFZhbHVlOgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSW5kZXhXb3Jrc3BhY2VKb2IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0luZGV4V29ya3NwYWNlSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNTkyODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSW5kZXhXb3Jrc3BhY2VKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkpzQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uVXRpbDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKiAoY29waWVkIGZyb20gSlNQKQotICogUmUtaW5kZXhlcyB0aGUgZW50aXJlIHdvcmtzcGFjZS4KLSAqIEVuc3VyZXMgdGhlIEpTUCBJbmRleCBpcyBpbiBhIHN0YWJsZSBzdGF0ZSBiZWZvcmUgcGVyZm9ybWluZyBhIHNlYXJjaC4KLSAqIChsaWtlIGFmdGVyIGEgY3Jhc2ggb3IgaWYgcHJldmlvdXMgaW5kZXhpbmcgd2FzIGNhbmNlbGVkKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhXb3Jrc3BhY2VKb2IgZXh0ZW5kcyBKb2IgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc2luZGV4bWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0gCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFZpc2l0b3IgdGhhdCByZXRyaWV2ZXMganNwIHByb2plY3QgcGF0aHMgZm9yIGFsbCBqc3AgZmlsZXMgaW4gdGhlIHdvcmtzcGFjZSwKLQkgKiBhbmQgYWRkcyB0aGUgZmlsZXMgdG8gYmUgaW5kZXhlZCBhcyB0aGV5IGFyZSBlbmNvdW50ZXJlZAotCSAqLwotCXByaXZhdGUgY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCSAgICBwcml2YXRlIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7IAotCQkKLQkJLy8gbW9uaXRvciBmcm9tIHRoZSBKb2IKLQkJSVByb2dyZXNzTW9uaXRvciBmSW5uZXJNb25pdG9yID0gbnVsbDsKLQkJcHVibGljIEpTUEZpbGVWaXNpdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJdGhpcy5mSW5uZXJNb25pdG9yID0gbW9uaXRvcjsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQotCQkJLy8gY2hlY2sgam9iIGNhbmNlbGVkCi0JCQlpZiAoKHRoaXMuZklubmVyTW9uaXRvciAhPSBudWxsKSAmJiB0aGlzLmZJbm5lck1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJLy8gY2hlY2sgc2VhcmNoIHN1cHBvcnQgY2FuY2VsZWQKLQkJCWlmKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkgewotCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCWlmIChwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkKLQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzU1MwotCQkJCS8vIGNoZWNrIHRoaXMgYmVmb3JlIGRlc2NyaXB0aW9uCi0JCQkJLy8gY2hlY2sgbmFtZSBiZWZvcmUgYWN0dWFsbHkgZ2V0dGluZyB0aGUgZmlsZSAobGVzcyB3b3JrKQotCQkJCWlmKFV0aWwuaXNKc1R5cGUocHJveHkuZ2V0TmFtZSgpKSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJaWYoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCi0JCQkJCQlpZihERUJVRykgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCspIEluZGV4V29ya3NwYWNlSm9iIGFkZGluZyBmaWxlOiAiICsgZmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQkvLyB0aGlzIGNhbGwgd2lsbCBjaGVjayB0aGUgQ29udGVudFR5cGVEZXNjcmlwdGlvbiwgc28gZG9uJ3QgbmVlZCB0byBkbyBpdCBoZXJlLgotCQkJCQkJLy9KU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuYWRkSnNwRmlsZShmaWxlKTsKLQkJCQkJCXRoaXMuZmlsZXMuYWRkKGZpbGUpOwotCQkJCQkJdGhpcy5mSW5uZXJNb25pdG9yLnN1YlRhc2socHJveHkuZ2V0TmFtZSgpKTsKLQkJCQkJCQotCQkJCQkJLy8gZG9uJ3Qgc2VhcmNoIGRlZXBlciBmb3IgZmlsZXMKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgZmluYWwgSUZpbGVbXSBnZXRGaWxlcygpIHsKLQkJICAgIHJldHVybiAoSUZpbGVbXSl0aGlzLmZpbGVzLnRvQXJyYXkobmV3IElGaWxlW3RoaXMuZmlsZXMuc2l6ZSgpXSk7Ci0JCX0KLQl9Ci0JCi0JLy9wcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGVKU1AgPSBudWxsOwotCQotCXB1YmxpYyBJbmRleFdvcmtzcGFjZUpvYigpIHsKLQkJLy8gcGFfVE9ETyBtYXkgd2FudCB0byBzYXkgc29tZXRoaW5nIGxpa2UgIlJlYnVpbGRpbmcgSlNQIEluZGV4IiB0byBiZSBtb3JlCi0JCS8vIGRlc2NyaXB0aXZlIGluc3RlYWQgb2YgIlVwZGF0aW5nIEpTUCBJbmRleCIgc2luY2UgdGhleSBhcmUgMiBkaWZmZXJlbnQgdGhpbmdzCi0JCXN1cGVyKEpzQ29yZU1lc3NhZ2VzLkpTUEluZGV4TWFuYWdlcl8wKTsKLQkJc2V0UHJpb3JpdHkoSm9iLkxPTkcpOwotCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JfQotCi0vLwlJQ29udGVudFR5cGUgZ2V0SnNwQ29udGVudFR5cGUoKSB7Ci0vLwkJaWYodGhpcy5mQ29udGVudFR5cGVKU1AgPT0gbnVsbCkKLS8vCQkJdGhpcy5mQ29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLS8vCQlyZXR1cm4gdGhpcy5mQ29udGVudFR5cGVKU1A7Ci0vLwl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcgZWNsaXBzZS5jb3JlLmludGVybmFsLmpvYnMuSW50ZXJuYWxKb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKSAKLQkgKiBmb3Igc2ltaWxhciBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQlpZihtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQl9Ci0JCQotCQlpZihERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgXiBJbmRleFdvcmtzcGFjZUpvYiBzdGFydGVkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQotCQl0cnkgewotCQkgICAgSlNQRmlsZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBKU1BGaWxlVmlzaXRvcihtb25pdG9yKTsKLQkJICAgIC8vIGNvbGxlY3QgYWxsIGpzcCBmaWxlcwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCS8vIHJlcXVlc3QgaW5kZXhpbmcKLQkJCS8vIHRoaXMgaXMgcHJldHR5IG11Y2ggbGlrZSBmYWtpbmcgYW4gZW50aXJlIHdvcmtzcGFjZSByZXNvdXJjZSBkZWx0YQotCQkJSnNJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pbmRleEZpbGVzKHZpc2l0b3IuZ2V0RmlsZXMoKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaWYoREVCVUcpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaWYoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIF4gSW5kZXhXb3Jrc3BhY2VKb2IgZmluaXNoZWRcbiAgIHRvdGFsIHRpbWUgcnVubmluZzogIiArIChmaW5pc2ggLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXZvaWQgc2V0Q2FuY2VsZWRTdGF0ZSgpIHsKLQkJSnNJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zZXRJbmRleFN0YXRlKEpzSW5kZXhNYW5hZ2VyLlNfQ0FOQ0VMRUQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9KU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODYyYjRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5KYXZhU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKihjb3BpZWQgZnJvbSBKU1ApCi0gKiBXcmFwcGVyIG1ldGhvZCB0byBzZXQgZ2V0UGF0aCgpIHBhdGggdG8gYmUgdGhlIHBhdGggb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgCi0gKiBmb3IgdGhlIGpzcCBmaWxlLiAoc2luY2UgaXQncyBhIGZpbmFsIG1ldGhvZCwgaXQgbmVlZHMgdG8gYmUgc2V0IHZpYSBjb25zdHJ1Y3RvcikKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlIGV4dGVuZHMgSmF2YVNlYXJjaERvY3VtZW50IHsKLQkKLQlwcml2YXRlIEpzU2VhcmNoRG9jdW1lbnQgZkpTUFNlYXJjaERvYyA9IG51bGw7Ci0JCi0JcHVibGljIEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKEpzU2VhcmNoRG9jdW1lbnQganNwU2VhcmNoRG9jKSB7Ci0JCQotCQlzdXBlcihqc3BTZWFyY2hEb2MuZ2V0UGF0aCgpLCBqc3BTZWFyY2hEb2MuZ2V0UGFydGljaXBhbnQoKSk7Ci0JCXRoaXMuZkpTUFNlYXJjaERvYyA9IGpzcFNlYXJjaERvYzsKLQl9Ci0KLQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb250ZW50cygpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0Qnl0ZUNvbnRlbnRzKCk7Ci0JfQotCi0JcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudHMoKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldENoYXJDb250ZW50cygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEphdmFUZXh0KCkgewotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEphdmFUZXh0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0RW5jb2RpbmcoKTsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEZpbGUoKTsKLQl9Ci0JCi0JcHVibGljIElKc1RyYW5zbGF0aW9uIGdldEpzcFRyYW5zbGF0aW9uKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRKU1RyYW5zbGF0aW9uKCk7Ci0JfQotCQotLy8JcHVibGljIGludCBnZXRKc3BPZmZzZXQoaW50IGphdmFPZmZzZXQpIHsKLS8vCQkKLS8vCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEpzcE9mZnNldChqYXZhT2Zmc2V0KTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQl0aGlzLmZKU1BTZWFyY2hEb2MucmVsZWFzZSgpOwotCX0KLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50IGdldEphdmFFbGVtZW50KCkgewotCQlyZXR1cm4gZ2V0SnNwVHJhbnNsYXRpb24oKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc0luZGV4TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNJbmRleE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiMTE0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc0luZGV4TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JbmRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbmRleE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzV2ViTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qKGNvcGllZCBmcm9tIEpTUCkKLSAqIFJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIHRoZSBKU1AgaW5kZXggdXAgdG8gZGF0ZS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzSW5kZXhNYW5hZ2VyIHsKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQkvLyBUT0RPIG1vdmUgdGhpcyB0byBMb2dnZXIsIGFzIHdlIGhhdmUgaW4gU1NFCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzaW5kZXhtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLSAJCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtFWV9JTkRFWF9TVEFURSA9ICJqc3BJbmRleFN0YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbmRleFdvcmtzcGFjZUpvYiBpbmRleGluZ0pvYiA9IG5ldyBJbmRleFdvcmtzcGFjZUpvYigpOwotCi0KLQotCS8vIFRPRE86IGNvbnNpZGVyIGVudW1lcmF0aW9uIGZvciB0aGVzZSBpbnQgY29uc3RhbnRzCi0JLy8gc2V0IHRvIFNfVVBEQVRJTkcgb25jZSBhIHJlc291cmNlIGNoYW5nZSBjb21lcyBpbgotCS8vIHNldCB0byBTX1NUQUJMRSBpZjoKLQkvLyAtIHdlIGtub3cgd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGhlIHJlc291cmNlIGNoYW5nZQotCS8vIC0gb3IgdGhlIFByb2Nlc3NGaWxlc0pvYiBjb21wbGV0ZXMKLQkvLyBzZXQgdG8gU19DQU5DRUxFRCBpZiBhbiBpbmRleGluZyBqb2IgaXMgY2FuY2VsZWQKLQkvLyBzZXQgdG8gU19SRUJVSUxESU5HIGlmIHJlLWluZGV4aW5nIHRoZSBlbnRpcmUgd29ya3NwYWNlCi0KLQkvLyB0aGUgaW50ICcwJyBpcyByZXNlcnZlZCBmb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgYSBwcmVmZXJlbmNlIGlzIG5vdAotCS8vIHRoZXJlCi0JLyoqIGluZGV4IGlzIHJlbGlhYmxlIHRvIHVzZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfU1RBQkxFID0gMTsKLQkvKiogaW5kZXggaXMgYmVpbmcgdXBkYXRlZCAoZnJvbSBhIHJlc291cmNlIGRlbHRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfVVBEQVRJTkcgPSAyOwotCS8qKiBlbnRpcmUgaW5kZXggaXMgYmVpbmcgcmVidWlsdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfUkVCVUlMRElORyA9IDM7Ci0JLyoqCi0JICogaW5kZXhpbmcgam9iIHdhcyBjYW5jZWxlZCBpbiB0aGUgbWlkZGxlIG9mIGl0LCBpbmRleCBuZWVkcyB0byBiZQotCSAqIHJlYnVpbHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0NBTkNFTEVEID0gNDsKLQotCS8qKiBzeW1ib2xpYyBuYW1lIGZvciBPU0dJIGZyYW1ld29yayAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9TR0lfRlJBTUVXT1JLX0lEID0gIm9yZy5lY2xpcHNlLm9zZ2kiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb2xsZWN0cyBKU1AgZmlsZXMgZnJvbSBhIHJlc291cmNlIGRlbHRhLgotCSAqLwotCXByaXZhdGUgY2xhc3MgSlNQUmVzb3VyY2VWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJLy8gdXNpbmcgaGFzaCBtYXAgZW5zdXJlcyBvbmx5IG9uZSBvZiBlYWNoIGZpbGUKLQkJLy8gbXVzdCBiZSByZXNldCBiZWZvcmUgZXZlcnkgdXNlCi0JCXByaXZhdGUgSGFzaE1hcCBqc3BGaWxlcyA9IG51bGw7Ci0KLQkJcHVibGljIEpTUFJlc291cmNlVmlzaXRvcigpIHsKLQkJCXRoaXMuanNwRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJLy8gaW4gY2FzZSBKU1Agc2VhcmNoIHdhcyBjYW5jZWxlZCAoZWcuIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yKQotCQkJaWYgKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSB8fCBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlpZiAoIWlzSGlkZGVuUmVzb3VyY2UoZGVsdGEuZ2V0RnVsbFBhdGgoKSkpIHsKLQotCQkJCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJCQkJYm9vbGVhbiBhZGRlZCA9IChraW5kICYgSVJlc291cmNlRGVsdGEuQURERUQpID09IElSZXNvdXJjZURlbHRhLkFEREVEOwotCQkJCQlib29sZWFuIGlzSW50ZXJlc3RpbmdDaGFuZ2UgPSBmYWxzZTsKLQkJCQkJaWYgKChraW5kICYgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgewotCQkJCQkJaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJCQkJCS8vIGlnbm9yZSB0aGluZ3MgbGlrZSBtYXJrZXIgY2hhbmdlcwotCQkJCQkJaXNJbnRlcmVzdGluZ0NoYW5nZSA9ICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA9PSBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSB8fCAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpID09IElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKTsKLQkJCQkJfQotCQkJCQlib29sZWFuIHJlbW92ZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLlJFTU9WRUQpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQ7Ci0JCQkJCWlmIChhZGRlZCB8fCBpc0ludGVyZXN0aW5nQ2hhbmdlKSB7Ci0KLQkJCQkJCXZpc2l0QWRkZWQoZGVsdGEpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHJlbW92ZWQpIHsKLQkJCQkJCXZpc2l0UmVtb3ZlZChkZWx0YSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCWlmIChERUJVRykgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJEZWx0YSBhbmFseXNpcyBtYXkgbm90IGJlIGNvbXBsZXRlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpZiB0aGUgZGVsdGEgaGFzIGNoaWxkcmVuLCBjb250aW51ZSB0byBhZGQvcmVtb3ZlIGZpbGVzCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdFJlbW92ZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCS8vIGhhbmRsZSBjbGVhbnVwCi0JCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHIgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCWlmICgoci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgJiYgci5leGlzdHMoKSkgewotCQkJCQlkZWxldGVJbmRleCgoSUZpbGUpIHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdEFkZGVkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzU1MwotCQkJLy8gcXVpY2sgY2hlY2sgaWYgaXQncyBldmVuIEpTUCByZWxhdGVkIHRvIGltcHJvdmUKLQkJCS8vIHBlcmZvcm1hbmNlCi0JCQkvLyBjaGVja2luZyBuYW1lIGZyb20gdGhlIGRlbHRhIGJlZm9yZSBnZXR0aW5nCi0JCQkvLyByZXNvdXJjZSBiZWNhdXNlIGl0J3MgbGlnaHRlcgotCQkJU3RyaW5nIGZpbGVuYW1lID0gZGVsdGEuZ2V0RnVsbFBhdGgoKS5sYXN0U2VnbWVudCgpOwotCQkJaWYgKChmaWxlbmFtZSAhPSBudWxsKSAmJiBVdGlsLmlzSnNUeXBlKGZpbGVuYW1lKSkgewotCQkJCUlSZXNvdXJjZSByID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQlpZiAoKHIgIT0gbnVsbCkgJiYgci5leGlzdHMoKSAmJiAoci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpKSB7Ci0JCQkJCXRoaXMuanNwRmlsZXMucHV0KHIuZ2V0RnVsbFBhdGgoKSwgcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzNDYzCi0JCXByaXZhdGUgYm9vbGVhbiBpc0hpZGRlblJlc291cmNlKElQYXRoIHApIHsKLQkJCVN0cmluZ1tdIHNlZ21lbnRzID0gcC5zZWdtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZWdtZW50c1tpXS5zdGFydHNXaXRoKCIuIikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRlbGV0ZUluZGV4KElGaWxlIGZvbGRlcikgewotCQkJLy8gY2xlYW51cCBpbmRleAotCQkJSW5kZXhNYW5hZ2VyIGltID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JCQlJUGF0aCBmb2xkZXJQYXRoID0gZm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0JCQlJUGF0aCBpbmRleExvY2F0aW9uID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuY29tcHV0ZUluZGV4TG9jYXRpb24oZm9sZGVyUGF0aCk7Ci0JCQlpbS5yZW1vdmVJbmRleChpbmRleExvY2F0aW9uKTsKLQkJCS8vIGltLmluZGV4TG9jYXRpb25zLnJlbW92ZUtleShmb2xkZXJQYXRoKTsKLQkJCS8vIGltLmluZGV4TG9jYXRpb25zLnJlbW92ZVZhbHVlKGluZGV4TG9jYXRpb24pOwotCQkJRmlsZSBmID0gaW5kZXhMb2NhdGlvbi50b0ZpbGUoKTsKLQkJCWYuZGVsZXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSUZpbGVbXSBnZXRGaWxlcygpIHsKLQkJCXJldHVybiAoSUZpbGVbXSkgdGhpcy5qc3BGaWxlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBJRmlsZVt0aGlzLmpzcEZpbGVzLnNpemUoKV0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCQl0aGlzLmpzcEZpbGVzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvLyBlbmQgY2xhc3MgSlNQUmVzb3VyY2VWaXNpdG9yCi0KLQkvKioKLQkgKiBzY2hlZHVsZXMgSlNQIGZpbGVzIGZvciBpbmRleGluZyBieSBKYXZhIGNvcmUKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFByb2Nlc3NGaWxlc0pvYiBleHRlbmRzIEpvYiB7Ci0JCUxpc3QgZmlsZUxpc3QgPSBudWxsOwotCQkvLyBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGZpbGVzIHdlJ3ZlIGluZGV4ZWQKLQkJaW50IGxhc3RGaWxlQ3Vyc29yID0gMDsKLQotCQlQcm9jZXNzRmlsZXNKb2IoU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQlzdXBlcih0YXNrTmFtZSk7Ci0JCQlmaWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCB2b2lkIHByb2Nlc3MoSUZpbGVbXSBmaWxlcykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWZpbGVMaXN0LmFkZChmaWxlc1tpXSk7Ci0JCQl9Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBxdWV1aW5nICIgKyBmaWxlcy5sZW5ndGggKyAiIGZpbGVzIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJc3luY2hyb25pemVkIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCQlyZXR1cm4gKElGaWxlW10pIGZpbGVMaXN0LnRvQXJyYXkobmV3IElGaWxlW2ZpbGVMaXN0LnNpemUoKV0pOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIHZvaWQgY2xlYXJGaWxlcygpIHsKLQkJCWZpbGVMaXN0LmNsZWFyKCk7Ci0JCQlsYXN0RmlsZUN1cnNvciA9IDA7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY2xlYXJlZCBmaWxlcyIpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpbmRleGVyIG1vbml0b3IiICsgbW9uaXRvcik7Ci0JCQlpZiAoaXNDYW5jZWxlZChtb25pdG9yKSB8fCBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQotCQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCQl0cnkgewotCQkJCUlGaWxlW10gZmlsZXNUb0JlUHJvY2Vzc2VkID0gZ2V0RmlsZXMoKTsKLQotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBpbmRleGluZyAiICsgZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aCArICIgZmlsZXMiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCS8vIEFQSSBpbmRpY2F0ZXMgdGhhdCBtb25pdG9yIGlzIG5ldmVyIG51bGwKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlKc1NlYXJjaFN1cHBvcnQgc3MgPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJCQlTdHJpbmcgcHJvY2Vzc2luZ05GaWxlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQotCQkJCWZvciAoO2xhc3RGaWxlQ3Vyc29yIDwgZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aDsgbGFzdEZpbGVDdXJzb3IrKykgewotCi0JCQkJCWlmIChpc0NhbmNlbGVkKG1vbml0b3IpIHx8IGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJfQotCQkJCQlJRmlsZSBmaWxlID0gZmlsZXNUb0JlUHJvY2Vzc2VkW2xhc3RGaWxlQ3Vyc29yXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlKYXZhU2NyaXB0UHJvamVjdCBwcm9qZWN0ID0gSmF2YVNjcmlwdENvcmUuY3JlYXRlKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCQkJc3MuYWRkSnNwRmlsZShmaWxlKTsKLQkJCQkJCQkvLyBKU1AgSW5kZXhlciBwcm9jZXNzaW5nIG4gZmlsZXMKLQkJCQkJCQlwcm9jZXNzaW5nTkZpbGVzID0gTkxTLmJpbmQoSnNDb3JlTWVzc2FnZXMuSlNQSW5kZXhNYW5hZ2VyXzIsIG5ldyBTdHJpbmdbXXtJbnRlZ2VyLnRvU3RyaW5nKChmaWxlc1RvQmVQcm9jZXNzZWQubGVuZ3RoIC0gbGFzdEZpbGVDdXJzb3IpKX0pOwotCQkJCQkJCW1vbml0b3Iuc3ViVGFzayhwcm9jZXNzaW5nTkZpbGVzICsgIiAtICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBKb2IgYWRkZWQgZmlsZTogIiArIGZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFJBVExDMDAyODQ3NzYKLQkJCQkJCS8vIElTU1VFOiB3ZSBwcm9iYWJseSBzaG91bGRuJ3QgYmUgY2F0Y2hpbmcgRVZFUlkKLQkJCQkJCS8vIGV4Y2VwdGlvbiwgYnV0Ci0JCQkJCQkvLyB0aGUgZnJhbWV3b3JrIG9ubHkgYWxsb3dzIHRvIHJldHVybiBJU3RhdHVzIGluCi0JCQkJCQkvLyBvcmRlciB0byBjb21tdW5pY2F0ZQotCQkJCQkJLy8gdGhhdCBzb21ldGhpbmcgd2VudCB3cm9uZywgd2hpY2ggbWVhbnMgdGhlIGxvb3AKLQkJCQkJCS8vIHdvbid0IGNvbXBsZXRlLCBhbmQgd2Ugd291bGQgaGl0IHRoZSBzYW1lIHByb2JsZW0KLQkJCQkJCS8vIHRoZSBuZXh0IHRpbWUuCi0JCQkJCQkvLyAKLQkJCQkJCS8vIGEgcG9zc2libGUgc29sdXRpb24gaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUKLQkJCQkJCS8vIGV4Y2VwdGlvbnMgbG9nZ2VkCi0JCQkJCQkvLyBhbmQgb25seSBsb2cgYSBjZXJ0YWluIGFtdCBvZiB0aGUgc2FtZSBvbmUsCi0JCQkJCQkvLyBvdGhlcndpc2Ugc2tpcCBpdC4KLQkJCQkJCWlmICghZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJKU1BJbmRleGVyIHByb2JsZW0gaW5kZXhpbmc6IiArIGZpbGVuYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSAvLyBlbmQgZm9yCi0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBqdXN0IGluIGNhc2Ugc29tZXRoaW5nIGRpZG4ndCBmb2xsb3cgQVBJIChtb25pdG9yIGlzIG51bGwpCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCwgY2xlYXIgZmlsZXMgbGlzdAotCQkJY2xlYXJGaWxlcygpOwotCQkJCi0JCQlsb25nIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJbG9uZyBkaWZmID0gZmluaXNoIC0gc3RhcnQ7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlmVG90YWxUaW1lICs9IGRpZmY7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInRoaXMgdGltZTogIiArIGRpZmYgKyAiIGN1bXVsYXRpdmUgdGltZSBmb3IgcmVzb3VyY2UgY2hhbmdlZDogIiArIGZUb3RhbFRpbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNDYW5jZWxlZChJUHJvZ3Jlc3NNb25pdG9yIHJ1bk1vbml0b3IpIHsKLQotCQkJYm9vbGVhbiBjYW5jZWxlZCA9IGZhbHNlOwotCQkJLy8gY2hlY2sgc3BlY2lmaWMgbW9uaXRvciBwYXNzZWQgaW50byBydW4gbWV0aG9kICh0aGUgcHJvZ3Jlc3MKLQkJCS8vIGdyb3VwIGluIHRoaXMgY2FzZSkKLQkJCS8vIGNoZWNrIG1haW4gc2VhcmNoIHN1cHBvcnQgY2FuY2VsZWQKLQkJCWlmICgocnVuTW9uaXRvciAhPSBudWxsKSAmJiBydW5Nb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCWNhbmNlbGVkID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJY2FuY2VsZWQgPSB0cnVlOwotCQkJCWlmIChydW5Nb25pdG9yICE9IG51bGwpIHsKLQkJCQkJcnVuTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2FuY2VsZWQ7Ci0JCX0KLQkJCi0JfQotCi0JLy8gZW5kIGNsYXNzIFByb2Nlc3NGaWxlc0pvYgotCi0JcHJpdmF0ZSBzdGF0aWMgSnNJbmRleE1hbmFnZXIgZlNpbmdsZXRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOwotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXppbmcgPSB0cnVlOwotCi0JcHJpdmF0ZSBJbmRleEpvYkNvb3JkaW5hdG9yIGluZGV4Sm9iQ29vcmRpbmF0b3I7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBqc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBKU1BSZXNvdXJjZVZpc2l0b3IgZlZpc2l0b3IgPSBudWxsOwotCXN0YXRpYyBsb25nIGZUb3RhbFRpbWUgPSAwOwotCi0JLy8gSm9iIGZvciBwcm9jZXNzaW5nIHJlc291cmNlIGRlbHRhCi0JcHJpdmF0ZSBQcm9jZXNzRmlsZXNKb2IgcHJvY2Vzc0ZpbGVzSm9iID0gbnVsbDsKLQotCXByaXZhdGUgSnNJbmRleE1hbmFnZXIoKSB7Ci0JCXByb2Nlc3NGaWxlc0pvYiA9IG5ldyBQcm9jZXNzRmlsZXNKb2IoSnNDb3JlTWVzc2FnZXMuSlNQSW5kZXhNYW5hZ2VyXzApOwotCQkvLyBvbmx5IHNob3cgaW4gdmVyYm9zZSBtb2RlCi0JCXByb2Nlc3NGaWxlc0pvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCXByb2Nlc3NGaWxlc0pvYi5zZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCXByb2Nlc3NGaWxlc0pvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3VwZXIuZG9uZShldmVudCk7Ci0JCQkJc2V0U3RhYmxlU3RhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSnNJbmRleE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0KLQkJaWYgKGZTaW5nbGV0b24gPT0gbnVsbCkgewotCQkJZlNpbmdsZXRvbiA9IG5ldyBKc0luZGV4TWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBmU2luZ2xldG9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0KLQkJSnNJbmRleE1hbmFnZXIgc2luZ2xlSW5zdGFuY2UgPSBnZXRJbnN0YW5jZSgpOwotCi0KLQkJaWYgKCFzaW5nbGVJbnN0YW5jZS5pbml0aWFsaXplZCkgewotCQkJc2luZ2xlSW5zdGFuY2UuaW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCQlzaW5nbGVJbnN0YW5jZS5pbmRleEpvYkNvb3JkaW5hdG9yID0gbmV3IEluZGV4Sm9iQ29vcmRpbmF0b3IoKTsKLQkJCXNpbmdsZUluc3RhbmNlLmpzcFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSlNQUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCi0JCQkvLyBhZGRlZCBhcyBKb2JDaGFuZ2UgbGlzdGVuZXIgc28gSlNQSW5kZXhNYW5hZ2VyIGNhbiBiZSBzbWFydGVyCi0JCQkvLyBhYm91dCB3aGVuIGl0IHJ1bnMKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihzaW5nbGVJbnN0YW5jZS5pbmRleEpvYkNvb3JkaW5hdG9yKTsKLQotCQkJLy8gYWRkIEpTUEluZGV4TWFuYWdlciB0byBrZWVwIEpTUCBJbmRleCB1cCB0byBkYXRlCi0JCQkvLyBsaXN0ZW5pbmcgZm9yIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgYW5kCi0JCQkvLyBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRQotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoanNwUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0JCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTA5MQotCQkJLy8gbWFrZXMgc3VyZSBJbmRleE1hbmFnZXIgaXMgYXdhcmUgb2Ygb3VyIGluZGV4ZXMKLQkJCXNhdmVJbmRleGVzKCk7Ci0JCQkvL3JlYnVpbGRJbmRleElmTmVlZGVkKCk7Ci0JCQlzaW5nbGVJbnN0YW5jZS5pbml0aWFsaXppbmcgPSBmYWxzZTsKLQotCQl9Ci0KLQl9Ci0JCi0Jc3luY2hyb25pemVkIHZvaWQgc2V0SW5kZXhTdGF0ZShpbnQgc3RhdGUpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBzZXR0aW5nIGluZGV4IHN0YXRlIHRvOiAiICsgc3RhdGUyU3RyaW5nKHN0YXRlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlQbHVnaW4ganNwTW9kZWxQbHVnaW4gPSBKc0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlqc3BNb2RlbFBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFBLRVlfSU5ERVhfU1RBVEUsIHN0YXRlKTsKLQkJanNwTW9kZWxQbHVnaW4uc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBzdGF0ZTJTdHJpbmcoaW50IHN0YXRlKSB7Ci0JCVN0cmluZyBzID0gIlVOS05PV04iOyAvLyROT04tTkxTLTEkCi0JCXN3aXRjaCAoc3RhdGUpIHsKLQkJCWNhc2UgKFNfU1RBQkxFKSA6Ci0JCQkJcyA9ICJTX1NUQUJMRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgKFNfVVBEQVRJTkcpIDoKLQkJCQlzID0gIlNfVVBEQVRJTkciOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIChTX0NBTkNFTEVEKSA6Ci0JCQkJcyA9ICJTX0NBTkNFTEVEIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAoU19SRUJVSUxESU5HKSA6Ci0JCQkJcyA9ICJTX1JFQlVJTERJTkciOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JaW50IGdldEluZGV4U3RhdGUoKSB7Ci0JCXJldHVybiBKc0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KFBLRVlfSU5ERVhfU1RBVEUpOwotCX0KLQotCXZvaWQgc2V0VXBkYXRpbmdTdGF0ZSgpIHsKLQkJLy9pZiAoZ2V0SW5kZXhTdGF0ZSgpICE9IFNfQ0FOQ0VMRUQpCi0JCXNldEluZGV4U3RhdGUoU19VUERBVElORyk7Ci0JfQotCi0Jdm9pZCBzZXRDYW5jZWxlZFN0YXRlKCkgewotCQlzZXRJbmRleFN0YXRlKEpzSW5kZXhNYW5hZ2VyLlNfQ0FOQ0VMRUQpOwotCX0KLQotCXZvaWQgc2V0U3RhYmxlU3RhdGUoKSB7Ci0JCS8vaWYgKGdldEluZGV4U3RhdGUoKSAhPSBTX0NBTkNFTEVEKQotCQlzZXRJbmRleFN0YXRlKFNfU1RBQkxFKTsKLQl9Ci0KLQl2b2lkIHNldFJlYnVpbGRpbmdTdGF0ZSgpIHsKLQkJc2V0SW5kZXhTdGF0ZShTX1JFQlVJTERJTkcpOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHJlYnVpbGRJbmRleElmTmVlZGVkKCkgewotCQlpZiAoZ2V0SW5kZXhTdGF0ZSgpICE9IFNfU1RBQkxFKSB7Ci0JCQlyZWJ1aWxkSW5kZXgoKTsKLQkJfQotCX0KLQotCXZvaWQgcmVidWlsZEluZGV4KCkgewotCi0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiogSlNQIEluZGV4IHVuc3RhYmxlLCByZXF1ZXN0aW5nIHJlLWluZGV4aW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWdldEluZGV4aW5nSm9iKCkuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhYm91dFRvUnVuKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXN1cGVyLmFib3V0VG9SdW4oZXZlbnQpOwotCQkJCXNldFJlYnVpbGRpbmdTdGF0ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXN1cGVyLmRvbmUoZXZlbnQpOwotCQkJCXNldFN0YWJsZVN0YXRlKCk7Ci0JCQkJZ2V0SW5kZXhpbmdKb2IoKS5yZW1vdmVKb2JDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCS8vIHdlJ3JlIGFib3V0IHRvIHJlaW5kZXggZXZlcnl0aGluZyBhbnl3YXkKLQkJZ2V0UHJvY2Vzc0ZpbGVzSm9iKCkuY2xlYXJGaWxlcygpOwotCQlnZXRJbmRleGluZ0pvYigpLnNjaGVkdWxlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBzY2hlZHVsZXMgYSBKb2IgdG8gcHJvY2VzcyBjb2xsZWN0ZWQgZmlsZXMuIEFsbCBKU1AKLQkgKiBpbmRleGluZyBzaG91bGQgYmUgZG9uZSB0aHJvdWdoIHRoaXMgbWV0aG9kIG9yIHByb2Nlc3NGaWxlcyhJRmlsZSBmaWxlKQotCSAqIAotCSAqIEBwYXJhbSBmaWxlcwotCSAqLwotCWZpbmFsIHZvaWQgaW5kZXhGaWxlcyhJRmlsZVtdIGZpbGVzKSB7Ci0JCS8vIGRvbid0IHVzZSB0aGlzIHJ1bGUKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ5MzEKLQkJLy8gcHJvY2Vzc0ZpbGVzLnNldFJ1bGUobmV3IEluZGV4RmlsZVJ1bGUoKSk7Ci0JCXByb2Nlc3NGaWxlc0pvYi5wcm9jZXNzKGZpbGVzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFBhY2thZ2UgcHJvdGVjdGVkIGZvciBhY2Nlc3MgYnkgaW5uZXIgSm9iIGNsYXNzIGluIHJlc291cmNlQ2hhbmdlZCguLi4pCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUpTUFJlc291cmNlVmlzaXRvciBnZXRWaXNpdG9yKCkgewotCi0JCWlmICh0aGlzLmZWaXNpdG9yID09IG51bGwpIHsKLQkJCXRoaXMuZlZpc2l0b3IgPSBuZXcgSlNQUmVzb3VyY2VWaXNpdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZlZpc2l0b3I7Ci0JfQotCXZvaWQgc2F2ZUluZGV4ZXMoKSB7Ci0JCUluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbmRleE1hbmFnZXIoKTsKLQkJSVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBhbGxQcm9qZWN0cy5sZW5ndGg7IGorKykgewotCQkJaWYgKCFKc1dlYk5hdHVyZS5oYXNOYXR1cmUoYWxsUHJvamVjdHNbal0pIHx8ICFhbGxQcm9qZWN0c1tqXS5pc09wZW4oKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJSVBhdGgganNwTW9kZWxXb3JraW5nTG9jYXRpb24gPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbEpzcFBsdWdpbldvcmtpbmdMb2NhdGlvbihhbGxQcm9qZWN0c1tqXSk7Ci0JCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCQlTdHJpbmdbXSBmaWxlcyA9IGZvbGRlci5saXN0KCk7Ci0JCQlTdHJpbmcgbG9jYXkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChmaWxlc1tpXS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaW5kZXgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlsb2NheSA9IGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvU3RyaW5nKCkgKyAiLyIgKyBmaWxlc1tpXTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gcmV1c2UgaW5kZXggZmlsZQotLy8gaW5kZXggPSBuZXcgSW5kZXgobG9jYXksIGFsbFByb2plY3RzW2pdLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpLCB0cnVlKTsKLS8vIC8vJE5PTi1OTFMtMSQKLS8vIGluZGV4LnNhdmUoKTsKLQkJCQkJCWluZGV4TWFuYWdlci5nZXRJbmRleChhbGxQcm9qZWN0c1tqXS5nZXRGdWxsUGF0aCgpLCBuZXcgUGF0aChsb2NheSksIHRydWUsIGZhbHNlKTsKLQkJCQkJCS8vIGluZGV4TWFuYWdlci5zYXZlSW5kZXgoaW5kZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB3ZSBzaG91bGQgYmUgc2h1dHRpbmcgZG93biwgd2FudCB0byBzaHV0IGRvd24gcXVpZXRseQotCQkJCWlmIChKc0luZGV4TWFuYWdlci5ERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTA5MQotCS8vIG1ha2VzIHN1cmUgSW5kZXhNYW5hZ2VyIGlzIGF3YXJlIG9mIG91ciBpbmRleGVzCi0Jdm9pZCBzYXZlSW5kZXhlc09SSUdJTkFMKCkgewotCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JCUlQYXRoIGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oKTsKLQotCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCVN0cmluZ1tdIGZpbGVzID0gZm9sZGVyLmxpc3QoKTsKLQkJU3RyaW5nIGxvY2F5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSW5kZXggaW5kZXggPSBudWxsOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaW5kZXgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWxvY2F5ID0ganNwTW9kZWxXb3JraW5nTG9jYXRpb24udG9TdHJpbmcoKSArICIvIiArIGZpbGVzW2ldOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHJldXNlIGluZGV4IGZpbGUKLQkJCQkJaW5kZXggPSBuZXcgSW5kZXgobG9jYXksICJJbmRleCBmb3IgIiArIGxvY2F5LCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbmRleE1hbmFnZXIuc2F2ZUluZGV4KGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3ZSBzaG91bGQgYmUgc2h1dHRpbmcgZG93biwgd2FudCB0byBzaHV0IGRvd24gcXVpZXRseQotCQkJaWYgKERFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotLy8JSUNvbnRlbnRUeXBlIGdldEpzcENvbnRlbnRUeXBlKCkgewotLy8JCWlmICh0aGlzLmZDb250ZW50VHlwZUpTUCA9PSBudWxsKQotLy8JCQl0aGlzLmZDb250ZW50VHlwZUpTUCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotLy8JCXJldHVybiB0aGlzLmZDb250ZW50VHlwZUpTUDsKLS8vCX0KLQotCS8qKgotCSAqIEEgY2hlY2sgdG8gc2VlIGlmIHRoZSBPU0dJIGZyYW1ld29yayBpcyBzaHV0dGluZyBkb3duLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgU3lzdGVtIEJ1bmRsZSBpcyBzdG9wcGVkIChpZS4gdGhlIGZyYW1ld29yayBpcwotCSAqICAgICAgICAgc2h1dHRpbmcgZG93bikKLQkgKi8KLQlib29sZWFuIGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkgewotCQkvLyBpbiB0aGUgRnJhbWV3b3JrIGNsYXNzIHRoZXJlJ3MgYSBub3RlOgotCQkvLyBzZXQgdGhlIHN0YXRlIG9mIHRoZSBTeXN0ZW0gQnVuZGxlIHRvIFNUT1BQSU5HLgotCQkvLyB0aGlzIG11c3QgYmUgZG9uZSBmaXJzdCBhY2NvcmRpbmcgdG8gc2VjdGlvbiA0LjE5LjIgZnJvbSB0aGUgT1NHaQotCQkvLyBSMyBzcGVjLgotCQlib29sZWFuIHNodXR0aW5nRG93biA9IFBsYXRmb3JtLmdldEJ1bmRsZShPU0dJX0ZSQU1FV09SS19JRCkuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuU1RPUFBJTkc7Ci0JCWlmIChERUJVRyAmJiBzaHV0dGluZ0Rvd24pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQSW5kZXhNYW5hZ2VyOiBzeXN0ZW0gaXMgc2h1dHRpbmcgZG93biEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzaHV0dGluZ0Rvd247Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQotCQkvLyBzdG9wIGxpc3RlbmluZwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQotCi0JCS8vIHN0b3AgYW55IHNlYXJjaGluZwotCQlKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5zZXRDYW5jZWxlZCh0cnVlKTsKLQotCQkvLyBzdG9wIGxpc3RlbmluZyB0byBqb2JzCi0JCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5yZW1vdmVKb2JDaGFuZ2VMaXN0ZW5lcihpbmRleEpvYkNvb3JkaW5hdG9yKTsKLQotCi0JCWludCBtYXh3YWl0ID0gNTAwMDsKLQkJaWYgKHByb2Nlc3NGaWxlc0pvYiAhPSBudWxsKSB7Ci0JCQlwcm9jZXNzRmlsZXNKb2IuY2FuY2VsKCk7Ci0JCX0KLQkJLy8gYXR0ZW1wdCB0byBtYWtlIHN1cmUgdGhpcyBpbmRleGluZyBqb2IgaXMgbGl0dGVyYWxseQotCQkvLyBkb25lIGJlZm9yZSBjb250aW51aW5nLCBzaW5jZSB3ZSBhcmUgc2h1dHRpbmcgZG93bgotCQl3YWl0VGlsbE5vdFJ1bm5pbmcobWF4d2FpdCwgcHJvY2Vzc0ZpbGVzSm9iKTsKLQotCQlpZiAoaW5kZXhpbmdKb2IgIT0gbnVsbCkgewotCQkJaW5kZXhpbmdKb2IuY2FuY2VsKCk7Ci0JCX0KLQkJd2FpdFRpbGxOb3RSdW5uaW5nKG1heHdhaXQsIHByb2Nlc3NGaWxlc0pvYik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdhaXRUaWxsTm90UnVubmluZyhpbnQgbWF4U2Vjb25kcywgSm9iIGpvYikgewotCQlpbnQgcGF1c2VUaW1lID0gMTA7Ci0JCWludCBtYXh0cmllcyA9IG1heFNlY29uZHMgLyBwYXVzZVRpbWU7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXdoaWxlICgoY291bnQrKyA8IG1heHRyaWVzKSAmJiAoam9iLmdldFN0YXRlKCkgPT0gSm9iLlJVTk5JTkcpKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcChwYXVzZVRpbWUpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY291bnQ6ICIgKyBjb3VudCArICIgbWF4OiAiICsKLQkJCQkvLyBtYXh0cmllcyk7Ci0JCQl9Ci0JCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEluZGV4Sm9iQ29vcmRpbmF0b3IgZXh0ZW5kcyBKb2JDaGFuZ2VBZGFwdGVyIHsKLQkJCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9SdW4oSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlKb2Igam9iVG9Db29yZGluYXRlID0gZXZlbnQuZ2V0Sm9iKCk7Ci0JCQlpZiAoaXNKb2JUb0F2b2lkKGpvYlRvQ29vcmRpbmF0ZSkpIHsKLQkJCQkvLyBqb2Igd2lsbCBiZSByZXNjaGVkdWxlZCB3aGVuIHRoZSBqb2Igd2UKLQkJCQkvLyBhcmUgYXZvaWRpbmcgKGVnLiBidWlsZCkgaXMgZG9uZQotCQkJCWdldFByb2Nlc3NGaWxlc0pvYigpLmNhbmNlbCgpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjYW5jZWw6IiArIGpvYlRvQ29vcmRpbmF0ZS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQkJSm9iIGpvYlRvQ29vcmRpbmF0ZSA9IGV2ZW50LmdldEpvYigpOwotCQkJaWYgKGlzSm9iVG9Bdm9pZChqb2JUb0Nvb3JkaW5hdGUpKSB7Ci0JCQkJaWYgKGdldFByb2Nlc3NGaWxlc0pvYigpLmdldEZpbGVzKCkubGVuZ3RoID4gMCkgewotCQkJCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5zY2hlZHVsZSg1MDApOwotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2NoZWR1bGU6IiArIGpvYlRvQ29vcmRpbmF0ZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQkJCi0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBpc0pvYlRvQXZvaWQoSm9iIGpvYlRvQ29vcmRpbmF0ZSkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChqb2JUb0Nvb3JkaW5hdGUuYmVsb25nc1RvKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCkgfHwgam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9CVUlMRCkgfHwgam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fUkVGUkVTSCkpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEpTUFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQkJaWYgKGlzSW5pdGlhbGl6aW5nKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGlnbm9yZSByZXNvdXJjZSBjaGFuZ2VzIGlmIGFscmVhZHkgcmVidWlsZGluZwotCQkJaWYgKGdldEluZGV4U3RhdGUoKSA9PSBTX1JFQlVJTERJTkcpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBwcmV2aW91c2x5IGNhbmNlbGVkLCBuZWVkcyBlbnRpcmUgaW5kZXggcmVidWlsZAotCQkJaWYgKGdldEluZGV4U3RhdGUoKSA9PSBTX0NBTkNFTEVEKSB7Ci0JCQkJLy8gcmVidWlsZEluZGV4KCk7Ci0JCQkJLy8ganVzdCByZXN1bWUgaW5kZXhpbmcKLQkJCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5zY2hlZHVsZSg1MDApOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzY2hlZHVsZTogcmVzb3VyY2UgY2hhbmdlZCwgcHJldmlvdXNseSBjYW5jZWxlZCIpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCQkvLyBvbmx5IGNhcmUgYWJvdXQgYWRkcyBvciBjaGFuZ2VzIHJpZ2h0IG5vdy4uLgotCQkJCWludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOwotCQkJCWJvb2xlYW4gYWRkZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkFEREVEKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRDsKLQkJCQlib29sZWFuIGNoYW5nZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQ7Ci0JCQkJaWYgKGFkZGVkIHx8IGNoYW5nZWQpIHsKLQotCQkJCQkvLyBvbmx5IGFuYWx5emUgdGhlIGZ1bGwgKHN0YXJ0aW5nIGF0IHJvb3QpIGRlbHRhCi0JCQkJCS8vIGhpZXJhcmNoeQotCQkJCQlpZiAoZGVsdGEuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLmVxdWFscygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJSlNQUmVzb3VyY2VWaXNpdG9yIHYgPSBnZXRWaXNpdG9yKCk7Ci0JCQkJCQkJLy8gY2xlYXIgZnJvbSBsYXN0IHJ1bgotCQkJCQkJCXYucmVzZXQoKTsKLQkJCQkJCQkvLyBjb3VudCBmaWxlcywgcG9zc2libHkgZG8gdGhpcyBpbiBhIGpvYiB0b28uLi4KLQkJCQkJCQkvLyBkb24ndCBpbmNsdWRlIFBIQU5UT00gcmVzb3VyY2VzCi0JCQkJCQkJZGVsdGEuYWNjZXB0KHYsIGZhbHNlKTsKLQotCQkJCQkJCS8vIHByb2Nlc3MgZmlsZXMgZnJvbSB0aGlzIGRlbHRhCi0JCQkJCQkJSUZpbGVbXSBmaWxlcyA9IHYuZ2V0RmlsZXMoKTsKLQkJCQkJCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCQkJCQkvKgotCQkJCQkJCQkgKiBKb2IgY2hhbmdlIGxpc3RlbmVyIHNob3VsZCBzZXQgYmFjayB0bwotCQkJCQkJCQkgKiBzdGFibGUgd2hlbiBmaW5pc2hlZAotCQkJCQkJCQkgKi8KLQkJCQkJCQkJc2V0VXBkYXRpbmdTdGF0ZSgpOwotCQkJCQkJCQkvLyBwcm9jZXNzRmlsZXMoZmlsZXMpOwotCQkJCQkJCQlpbmRleEZpbGVzKGZpbGVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gbmVlZCB0byBzZXQgc3RhdGUgaGVyZSBzb21laG93LCBhbmQgcmVpbmRleAotCQkJCQkJCS8vIG90aGVyd2lzZSBpbmRleCB3aWxsIGJlIHVucmVsaWFibGUKLQkJCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlJbmRleFdvcmtzcGFjZUpvYiBnZXRJbmRleGluZ0pvYigpIHsKLQkJcmV0dXJuIGluZGV4aW5nSm9iOwotCX0KLQotCVByb2Nlc3NGaWxlc0pvYiBnZXRQcm9jZXNzRmlsZXNKb2IoKSB7Ci0JCXJldHVybiBwcm9jZXNzRmlsZXNKb2I7Ci0JfQotCi0JYm9vbGVhbiBpc0luaXRpYWxpemluZygpIHsKLQkJcmV0dXJuIGluaXRpYWxpemluZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzUGF0aEluZGV4ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzUGF0aEluZGV4ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFlYmFhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1BhdGhJbmRleGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLklKYXZhU2NyaXB0U2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlV0aWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSooY29waWVkIGZyb20gSlNQKQotICogcGFfVE9ETyBTdGlsbCBuZWVkIHRvIHRha2UgaW50byBjb25zaWRlcmF0aW9uOgotICogCS0gZm9jdXMgaW4gd29ya3NwYWNlCi0gKiAgLSBzZWFyY2ggcGF0dGVybgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNQYXRoSW5kZXhlciB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJCi0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3NlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0gCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0JCi0JLy8gdmlzaXRvciB0aGF0IHJldHJpZXZlcyBqc3AgcHJvamVjdCBwYXRocyBmb3IgYWxsIGpzcCBmaWxlcyBpbiB0aGUgd29ya3NwYWNlCi0JY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCQkvLyBoYXNoIG1hcCBmb3JjZXMgb25seSBvbmUgb2YgZWFjaCBmaWxlCi0JCXByaXZhdGUgSGFzaE1hcCBmUGF0aHMgPSBuZXcgSGFzaE1hcCgpOwotCQlJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0JCVNlYXJjaFBhdHRlcm4gZlBhdHRlcm4gPSBudWxsOwotCi0JCXB1YmxpYyBKU1BGaWxlVmlzaXRvcihTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUpIHsKLQkJCXRoaXMuZlBhdHRlcm4gPSBwYXR0ZXJuOwotCQkJdGhpcy5mU2NvcGUgPSBzY29wZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkKLQkJCWlmKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCi0JCQkJLy9JQ29udGVudFR5cGUgY29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzU1MwotCQkJCS8vIGNoZWNrIHRoaXMgYmVmb3JlIGRlc2NyaXB0aW9uCi0JCQkJLy8gY2hlY2sgbmFtZSBiZWZvcmUgYWN0dWFsbHkgZ2V0dGluZyB0aGUgZmlsZSAobGVzcyB3b3JrKQotCQkJCS8vaWYoY29udGVudFR5cGVKU1AuaXNBc3NvY2lhdGVkV2l0aChwcm94eS5nZXROYW1lKCkpKSB7Ci0JCQkJaWYoVXRpbC5pc0pzVHlwZShwcm94eS5nZXROYW1lKCkpKXsJCi0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCS8vSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCQkvL1N0cmluZyBjdElkID0gbnVsbDsKLS8vCQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLS8vCQkJCQkJY3RJZCA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpLmdldElkKCk7Ci0vLwkJCQkJfQotCQkJCQkvL2lmIChDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQLmVxdWFscyhjdElkKSkgewotCQkJCQkvL2lmKFV0aWwuaXNKc1R5cGUoZmlsZS5nZXROYW1lKCkpKXsKLQkJCQkJCWlmICh0aGlzLmZTY29wZS5lbmNsb3Nlcyhwcm94eS5yZXF1ZXN0RnVsbFBhdGgoKS50b1N0cmluZygpKSkgewotCQotCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBzZWxlY3RlZCBpbmRleCBwYXRoOiIgKyBmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCi0JCQkJCQkJZlBhdGhzLnB1dChmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCksIEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmNvbXB1dGVJbmRleExvY2F0aW9uKGZpbGUuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCQkJfQotCQkJCQkvL30KLQkJCQl9Ci0JCQkJLy8gZG9uJ3Qgc2VhcmNoIGRlZXBlciBmb3IgZmlsZXMKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBJUGF0aFtdIGdldFBhdGhzKCkgewotCQkJcmV0dXJuIChJUGF0aFtdKSBmUGF0aHMudmFsdWVzKCkudG9BcnJheShuZXcgSVBhdGhbZlBhdGhzLnNpemUoKV0pOwotCQl9Ci0JfQotCi0JcHVibGljIElQYXRoW10gZ2V0VmlzaWJsZUpzcFBhdGhzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBzY29wZSkgewotCi0JCUpTUEZpbGVWaXNpdG9yIGpzcEZpbGVWaXNpdG9yID0gbmV3IEpTUEZpbGVWaXNpdG9yKHBhdHRlcm4sIHNjb3BlKTsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuYWNjZXB0KGpzcEZpbGVWaXNpdG9yLCAwKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBqc3BGaWxlVmlzaXRvci5nZXRQYXRocygpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNTZWFyY2hEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNTZWFyY2hEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTg3YmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKihjb3BpZWQgZnJvbSBKU1ApCi0gKiBDcmVhdGVkIHdpdGggYSAuanNwIGZpbGUsIGJ1dCBzaG91bGQgYXBwZWFyIHRvIGJlIGEgLmphdmEgZmlsZSBmb3IgaW5kZXhpbmcKLSAqIGFuZCBzZWFyY2hpbmcgcHVycG9zZXMuIFRoZXJlIGFyZSBwdXJwb3NlbHkgZmV3IGZpZWxkcyBpbiB0aGlzIGNsYXNzLCBhbmQKLSAqIHRob3NlIGZpZWxkcyBhcmUgbGlnaHR3ZWlnaHQgc2luY2UgaXQncyBwb3NzaWJsZSBmb3IgbWFueSBKU1Agc2VhcmNoCi0gKiBkb2N1bWVudHMgdG8gZXhpc3QgaW4gbWVtb3J5IGF0IG9uZSB0aW1lIChlZy4gYWZ0ZXIgaW1wb3J0aW5nIGEgcHJvamVjdAotICogd2l0aCBhIGxhcmdlIG51bWJlciBvZiBKU1AgZmlsZXMpCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc1NlYXJjaERvY3VtZW50IHsKLQotCXByaXZhdGUgU3RyaW5nIFVOS05PV05fUEFUSCA9ICIqKnBhdGggdW5rbm93bioqIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZKU1BQYXRoU3RyaW5nID0gVU5LTk9XTl9QQVRIOwotCXByaXZhdGUgU3RyaW5nIGZDVVBhdGggPSBVTktOT1dOX1BBVEg7Ci0JcHJpdmF0ZSBTZWFyY2hQYXJ0aWNpcGFudCBmUGFydGljaXBhbnQgPSBudWxsOwotCXByaXZhdGUgbG9uZyBmTGFzdE1vZGlmaWVkU3RhbXA7Ci0JcHJpdmF0ZSBjaGFyW10gZkNhY2hlZENoYXJDb250ZW50czsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBwYXJ0aWNpcGFudAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBKc1NlYXJjaERvY3VtZW50KFN0cmluZyBmaWxlUGF0aCwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQotCQl0aGlzLmZKU1BQYXRoU3RyaW5nID0gZmlsZVBhdGg7Ci0JCXRoaXMuZlBhcnRpY2lwYW50ID0gcGFydGljaXBhbnQ7Ci0JfQotCi0JcHVibGljIFNlYXJjaFBhcnRpY2lwYW50IGdldFBhcnRpY2lwYW50KCkgewotCQlyZXR1cm4gdGhpcy5mUGFydGljaXBhbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQjZ2V0Q2hhckNvbnRlbnRzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENoYXJDb250ZW50cygpIHsKLQkJCi0JCWlmKChmQ2FjaGVkQ2hhckNvbnRlbnRzID09IG51bGwpIHx8IGlzRGlydHkoKSkgewotCQkgICAgSUpzVHJhbnNsYXRpb24gdHJhbnMgPSBnZXRKU1RyYW5zbGF0aW9uKCk7ICAgIAotCQkgICAgZkNhY2hlZENoYXJDb250ZW50cyA9IHRyYW5zICE9IG51bGwgPyB0cmFucy5nZXRKc1RleHQoKS50b0NoYXJBcnJheSgpIDogbmV3IGNoYXJbMF07Ci0JCSAgICBmQ1VQYXRoID0gdHJhbnMuZ2V0SmF2YVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gZkNhY2hlZENoYXJDb250ZW50czsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFUZXh0KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhnZXRDaGFyQ29udGVudHMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogSXQncyBub3QgcmVjb21tZW5kZWQgZm9yIGNsaWVudHMgdG8gaG9sZCBvbiB0byB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICogc2luY2UgaXQncyBraW5kIG9mIGxhcmdlLiBJZiBwb3NzaWJsZSwgaG9sZCBvbiB0byB0aGUKLQkgKiBKU1BTZWFyY2hEb2N1bWVudCwgd2hpY2ggaXMgbW9yZSBvZiBhIGxpZ2h0d2VpZ2h0IHByb3h5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIEpTUFRyYW5zbGF0aW9uIGZvciB0aGUganNwIGZpbGUsIG9yIG51bGwgaWYgaXQncyBhbgotCSAqICAgICAgICAgdW5zdXBwb3J0ZWQgZmlsZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSUpzVHJhbnNsYXRpb24gZ2V0SlNUcmFuc2xhdGlvbigpIHsKLQkJSUpzVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBudWxsOwotCQlJRmlsZSBqc3BGaWxlID0gZ2V0RmlsZSgpOwotCQlpZiAoIUpzU2VhcmNoU3VwcG9ydC5pc0pzcChqc3BGaWxlKSkgewotCQkJcmV0dXJuIHRyYW5zbGF0aW9uOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBnZXQgZXhpc3RpbmcgbW9kZWwgZm9yIHJlYWQsIHRoZW4gZ2V0IGRvY3VtZW50IGZyb20gaXQKLQkJCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCQlpZiAobW9kZWxNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlqc3BGaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGpzcEZpbGUpOwotCQkJfQotCQkJLy8gaGFuZGxlIHVuc3VwcG9ydGVkCi0JCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKW1vZGVsOwotCQkJCXNldHVwQWRhcHRlckZhY3RvcnkoeG1sTW9kZWwpOwotCQkJCUlET01Eb2N1bWVudCBkb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIGRvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQl0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SnNUcmFuc2xhdGlvbihmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbCBlKSB7Ci0JCQkvLyBubyBuZWVkIHRvIGxvZyB0aGlzLiBKdXN0IGNvbnNpZGVyIGl0IGFuIGludmFsaWQgZmlsZSBmb3Igb3VyCi0JCQkvLyBwdXJwb3Nlcy4KLQkJCS8vIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cmFuc2xhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgdGhlIGZhY3RvcnkgZm9yIEpTUFRyYW5zbGF0aW9uQWRhcHRlciBoZXJlCi0JICogCi0JICogQHBhcmFtIHNtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldHVwQWRhcHRlckZhY3RvcnkoSVN0cnVjdHVyZWRNb2RlbCBzbSkgewotCQlKc1RyYW5zbGF0aW9uQWRhcHRlckZhY3Rvcnkuc2V0dXBBZGFwdGVyRmFjdG9yeShzbSk7Ci0JfQotCi0JLyoqCi0JICogdGhlIHBhdGggdG8gdGhlIEphdmEgY29tcGlsYXRpb24gdW5pdAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldFBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkgICAgLy8gY2FjaGluZyB0aGUgcGF0aCBzaW5jZSBpdCdzIGV4cGVuc2l2ZSB0byBnZXQgdHJhbnNsYXRpb24KLQkJLy8gaW1wb3J0YW50IHRoYXQgaXNEaXJ0eSgpIGNoZWNrIGlzIHNlY29uZCB0byBjYWNoZSBtb2RpZmljYXRpb24gc3RhbXAKLQkgICAgaWYoKHRoaXMuZkNVUGF0aCA9PSBudWxsKSB8fCBpc0RpcnR5KCkgfHwgKHRoaXMuZkNVUGF0aCA9PSBVTktOT1dOX1BBVEgpKSB7Ci0JICAgICAgICBJSnNUcmFuc2xhdGlvbiB0cmFucyA9IGdldEpTVHJhbnNsYXRpb24oKTsKLQkgICAgICAgIGlmKHRyYW5zICE9IG51bGwpIHsKLQkgICAgICAgICAgICB0aGlzLmZDVVBhdGggPSB0cmFucy5nZXRKYXZhUGF0aCgpOwotCSAgICAgICAgICAgIC8vIHNhdmUgc2luY2UgaXQncyBleHBlbnNpdmUgdG8gY2FsY3VsYXRlIGFnYWluIGxhdGVyCi0JICAgICAgICAgICAgZkNhY2hlZENoYXJDb250ZW50cyA9IHRyYW5zLmdldEpzVGV4dCgpLnRvQ2hhckFycmF5KCk7Ci0JICAgICAgICB9Ci0JICAgIH0KLQkJcmV0dXJuIGZDVVBhdGggIT0gbnVsbCA/IGZDVVBhdGggOiBVTktOT1dOX1BBVEg7Ci0JfQotCi0vLwlwdWJsaWMgaW50IGdldEpzcE9mZnNldChpbnQgamF2YU9mZnNldCkgewotLy8JCS8vIGNvcGllZCBmcm9tIEpTUFRyYW5zbGF0aW9uCi0vLwkJaW50IHJlc3VsdCA9IC0xOwotLy8JCWludCBvZmZzZXRJblJhbmdlID0gMDsKLS8vCQlQb3NpdGlvbiBqc3BQb3MsIGphdmFQb3MgPSBudWxsOwotLy8JCUlKc1RyYW5zbGF0aW9uIHRyYW5zID0gZ2V0SlNQVHJhbnNsYXRpb24oKTsKLS8vCQlpZiAodHJhbnMgIT0gbnVsbCkgewotLy8JCQlIYXNoTWFwIGphdmEyanNwTWFwID0gdHJhbnMuZ2V0SmF2YTJKc3BNYXAoKTsKLS8vCi0vLwkJCS8vIGl0ZXJhdGUgYWxsIG1hcHBlZCBqYXZhIHJhbmdlcwotLy8JCQlJdGVyYXRvciBpdCA9IGphdmEyanNwTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0vLwkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLS8vCQkJCWphdmFQb3MgPSAoUG9zaXRpb24pIGl0Lm5leHQoKTsKLS8vCQkJCS8vIG5lZWQgdG8gY291bnQgdGhlIGxhc3QgcG9zaXRpb24gYXMgaW5jbHVkZWQKLS8vCQkJCWlmICghamF2YVBvcy5pbmNsdWRlcyhqYXZhT2Zmc2V0KSAmJiAhKGphdmFQb3Mub2Zmc2V0ICsgamF2YVBvcy5sZW5ndGggPT0gamF2YU9mZnNldCkpCi0vLwkJCQkJY29udGludWU7Ci0vLwotLy8JCQkJb2Zmc2V0SW5SYW5nZSA9IGphdmFPZmZzZXQgLSBqYXZhUG9zLm9mZnNldDsKLS8vCQkJCWpzcFBvcyA9IChQb3NpdGlvbikgamF2YTJqc3BNYXAuZ2V0KGphdmFQb3MpOwotLy8KLS8vCQkJCWlmIChqc3BQb3MgIT0gbnVsbCkKLS8vCQkJCQlyZXN1bHQgPSBqc3BQb3Mub2Zmc2V0ICsgb2Zmc2V0SW5SYW5nZTsKLS8vCQkJCWVsc2UgewotLy8JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAianNwUG9zaXRpb24gd2FzIG51bGwhIiArIGphdmFPZmZzZXQpOyAvLyROT04tTkxTLTEkCi0vLwkJCQl9Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gcmVzdWx0OwotLy8JfQotCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJUGF0aCBqc3BQYXRoID0gbmV3IFBhdGgodGhpcy5mSlNQUGF0aFN0cmluZyk7Ci0JCUlGaWxlIGpzcEZpbGUgPSByb290LmdldEZpbGUoanNwUGF0aCk7Ci0JCWlmICghanNwRmlsZS5leGlzdHMoKSkgewotCQkJLy8gcG9zc2libHkgb3V0c2lkZSB3b3Jrc3BhY2UKLQkJCWpzcEZpbGUgPSByb290LmdldEZpbGVGb3JMb2NhdGlvbihqc3BQYXRoKTsKLQkJfQotCQlyZXR1cm4ganNwRmlsZTsKLQl9Ci0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQlJRmlsZSBmID0gZ2V0RmlsZSgpOwotCQlpZihmICE9IG51bGwpIHsKLQkJCWxvbmcgY3VycmVudFN0YW1wID0gZi5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJaWYoY3VycmVudFN0YW1wICE9IGZMYXN0TW9kaWZpZWRTdGFtcCkgewotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCWZMYXN0TW9kaWZpZWRTdGFtcCA9IGN1cnJlbnRTdGFtcDsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gbm93IHNpbmNlIEpTUFRyYW5zbGF0aW9uIGlzIGNyZWF0ZWQgb24gdGhlIGZseQotCX0KLQotCS8qKgotCSAqIGZvciBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIltKU1BTZWFyY2hEb2N1bWVudDoiICsgdGhpcy5mSlNQUGF0aFN0cmluZyArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldEVuY29kaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldEJ5dGVDb250ZW50cygpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRCeXRlQ29udGVudHMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNTZWFyY2hQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGFjM2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5JSmF2YVNjcmlwdFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKihjb3BpZWQgZnJvbSBKU1ApCi0gKiBJbnRlZ3JhdGlvbiBvZiBKU1Agdy8gamF2YSBzZWFyY2guCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc1NlYXJjaFBhcnRpY2lwYW50IGV4dGVuZHMgU2VhcmNoUGFydGljaXBhbnQgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBjYWxjdWxhdGVWYWx1ZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYWxjdWxhdGVWYWx1ZSgpIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIGRlYnVnID0gKHZhbHVlICE9IG51bGwpICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVidWc7Ci0JfQotCi0JLyoqCi0JICogSW1wb3J0YW50IHRvIG5ldmVyIHJldHVybiBudWxsIGhlcmUgb3IgZWxzZSBKYXZhIHNlYXJjaCBwYXJ0aWNpcGF0aW9uCi0JICogd2lsbCBicmVhay4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50UGF0aCkgewotCQlTZWFyY2hEb2N1bWVudCBzRG9jID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0U2VhcmNoRG9jdW1lbnQoZG9jdW1lbnRQYXRoKTsKLQotCQlpZiAoc0RvYyA9PSBudWxsKSB7Ci0JCQkvLyByZXR1cm4gYSBkdW1teSBkb2MgaGVyZSBzbyBzZWFyY2ggcGFydGljaXBhdGlvbiBkb2Vzbid0IGJyZWFrCi0JCQlyZXR1cm4gbmV3IE51bGxTZWFyY2hEb2N1bWVudChkb2N1bWVudFBhdGgpOwotCQl9Ci0JCXJldHVybiBzRG9jOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiRW1iZWRlZCBKYXZhU2NyaXB0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJUGF0aFtdIHNlbGVjdEluZGV4ZXMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIHNjb3BlKSB7Ci0JCUpzUGF0aEluZGV4ZXIgaW5kZXhlciA9IG5ldyBKc1BhdGhJbmRleGVyKCk7Ci0JCXJldHVybiBpbmRleGVyLmdldFZpc2libGVKc3BQYXRocyhwYXR0ZXJuLCBzY29wZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5kZXhEb2N1bWVudChTZWFyY2hEb2N1bWVudCBkb2N1bWVudCwgSVBhdGggaW5kZXhQYXRoKSB7Ci0JCWlmICghKGRvY3VtZW50IGluc3RhbmNlb2YgSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyB1c2UgSmF2YSBzZWFyY2ggaW5kZXhpbmcKLQkJU2VhcmNoRW5naW5lLmdldERlZmF1bHRTZWFyY2hQYXJ0aWNpcGFudCgpLmluZGV4RG9jdW1lbnQoZG9jdW1lbnQsIGluZGV4UGF0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9jYXRlTWF0Y2hlcyhTZWFyY2hEb2N1bWVudFtdIGluZGV4TWF0Y2hlcywgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAoKG1vbml0b3IgIT0gbnVsbCkgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZpbHRlciBvdXQgbnVsbCBtYXRjaGVzCi0JCUxpc3QgZmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVNlYXJjaERvY3VtZW50IG1hdGNoID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleE1hdGNoZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgcG9zc2libGUgbWF0Y2hpbmcgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU6ICIgKyBpbmRleE1hdGNoZXNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQltYXRjaCA9IGluZGV4TWF0Y2hlc1tpXTsKLQkJCWlmIChtYXRjaCAhPSBudWxsKSB7Ci0JCQkJLy8gc29tZSBtYXRjaGVzIG1heSBiZSBudWxsLCBvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGRhdGUsCi0JCQkJLy8gdGhlIGZpbGUgbWF5IG5vdCBldmVuIGV4aXN0Ci0JCQkJaWYgKChtYXRjaCBpbnN0YW5jZW9mIEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKSAmJiAoKEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKSBtYXRjaCkuZ2V0RmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCWZpbHRlcmVkLmFkZChtYXRjaCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaW5kZXhNYXRjaGVzID0gKFNlYXJjaERvY3VtZW50W10pIGZpbHRlcmVkLnRvQXJyYXkobmV3IFNlYXJjaERvY3VtZW50W2ZpbHRlcmVkLnNpemUoKV0pOwotCQlTZWFyY2hFbmdpbmUuZ2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCkubG9jYXRlTWF0Y2hlcyhpbmRleE1hdGNoZXMsIHBhdHRlcm4sIHNjb3BlLCByZXF1ZXN0b3IsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50I2dldERvY3VtZW50KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotCSAqLwotCXB1YmxpYyBTZWFyY2hEb2N1bWVudCBnZXREb2N1bWVudChJRmlsZSBmaWxlKSB7Ci0JCS8vIG5ldmVyIGdldHMgY2FsbGVkPwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaFNjb3BlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaFNjb3BlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNWU3ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNTZWFyY2hTY29wZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5JSmF2YVNjcmlwdFNlYXJjaFNjb3BlOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKihjb3BpZWQgZnJvbSBKU1ApCi0gKiBVc2VkIHRvIGNvbnN0cmFpbiBKU1AvamF2YSBzZWFyY2ggdG8gY2VydGFpbiBwYXRocyBhbmQgZWxlbWVudHMuCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNTZWFyY2hTY29wZSBpbXBsZW1lbnRzIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgewotCi0JcHJpdmF0ZSBib29sZWFuIGZFbmNsb3Nlc0FsbCA9IGZhbHNlOwotCXByaXZhdGUgTGlzdCBmUmVzb3VyY2VQYXRocyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZKYXZhRWxlbWVudHMgPSBudWxsOwotCi0JcHVibGljIEpzU2VhcmNoU2NvcGUoKSB7Ci0JCS8vIGVtcHR5IGNvbnN0cnVjdG9yIGp1c3QgcmV0dXJucyB0cnVlIGZvciBldmVyeXRoaW5nCi0JCS8vIGV2ZXJ5dGhpbmcgaXMgaW4gc2NvcGUKLQkJdGhpcy5mRW5jbG9zZXNBbGwgPSB0cnVlOwotCQlpbml0KCk7Ci0JfQotCi0JcHVibGljIEpzU2VhcmNoU2NvcGUoU3RyaW5nW10gcmVzb3VyY2VTdHJpbmdQYXRoKSB7Ci0JCWluaXQoKTsKLQkJZlJlc291cmNlUGF0aHMuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVzb3VyY2VTdHJpbmdQYXRoKSk7Ci0JfQotCi0JcHVibGljIEpzU2VhcmNoU2NvcGUoSUphdmFTY3JpcHRFbGVtZW50W10gamF2YUVsZW1lbnQpIHsKLQkJaW5pdCgpOwotCQlmSmF2YUVsZW1lbnRzLmFkZEFsbChBcnJheXMuYXNMaXN0KGphdmFFbGVtZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCXRoaXMuZlJlc291cmNlUGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRoaXMuZkphdmFFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhTdHJpbmcgcmVzb3VyY2VQYXRoU3RyaW5nKSB7Ci0KLQkJaWYgKHRoaXMuZkVuY2xvc2VzQWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlbmNsb3Nlc1BhdGgocmVzb3VyY2VQYXRoU3RyaW5nKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQpIHsKLQotCQkvLyBwYV9UT0QgaW1wbGVtZW50Ci0JCWlmICh0aGlzLmZFbmNsb3Nlc0FsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhJUmVzb3VyY2VQcm94eSBlbGVtZW50KSB7Ci0KLQkJaWYgKHRoaXMuZkVuY2xvc2VzQWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlbmNsb3Nlc1BhdGgoZWxlbWVudC5yZXF1ZXN0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJdGhpcy5mUmVzb3VyY2VQYXRocy5hZGQocGF0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudChJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmZKYXZhRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBlbmNsb3Nlc1BhdGgoU3RyaW5nIHBvc3NpYmxlKSB7Ci0KLQkJU3RyaW5nW10gcGF0aHMgPSAoU3RyaW5nW10pIGZSZXNvdXJjZVBhdGhzLnRvQXJyYXkobmV3IFN0cmluZ1tmUmVzb3VyY2VQYXRocy5zaXplKCldKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBvc3NpYmxlLmVxdWFscyhwYXRoc1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQotCQlyZXR1cm4gIkphdmFTY3JpcHQgU2VhcmNoIFNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJUGF0aFtdIGVuY2xvc2luZ1Byb2plY3RzQW5kSmFycygpIHsKLQkJcmV0dXJuIChJUGF0aFtdKSBmUmVzb3VyY2VQYXRocy50b0FycmF5KG5ldyBJUGF0aFtmUmVzb3VyY2VQYXRocy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRFeGNsdWRlKFN0cmluZyBjb250YWluZXIsIFN0cmluZyByZXNvdXJjZU5hbWUpIHsKLQkJLyogYXV0byBnZW4gKi8KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoU3VwcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNTZWFyY2hTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZjAzZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNTZWFyY2hTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guSUphdmFTY3JpcHRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guSUphdmFTY3JpcHRTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkpzQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkpzQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNOYW1lTWFuZ2xlclV0aWw7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qKGNvcGllZCBmcm9tIEpTUCkKLSAqIENlbnRyYWwgYWNjZXNzIHRvIGphdmEgaW5kZXhpbmcgYW5kIHNlYXJjaC4gQWxsIGNvbnRhY3QgYmV0d2VlbiBKRFQgaW5kZXhpbmcKLSAqIGFuZCBTZWFyY2hpbmcgc2hvdWxkIGJlIGRvbmUgdGhyb3VnaCBoZXJlLgotICogCi0gKiBDbGllbnRzIHNob3VsZCBhY2Nlc3MgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB2aWEgdGhlIHNpbmdsZSBpbnN0YW5jZSB2aWEKLSAqIDxjb2RlPmdldEluc3RhbmNlKCk8L2NvZGU+LgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNTZWFyY2hTdXBwb3J0IHsKLQotICAgIC8vIGZvciBkZWJ1Z2dpbmcKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLSAgICBzdGF0aWMgewotICAgIAlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanNzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotIAkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEpzU2VhcmNoU3VwcG9ydCBzaW5nbGV0b24gPSBudWxsOwotCi0gICAgcHJpdmF0ZSBKc1NlYXJjaFBhcnRpY2lwYW50IGZQYXJ0aWNpcGFudCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIElQYXRoIGZKc1BsdWdpbkxvY2F0aW9uID0gbnVsbDsKLQotICAgIC8vIHBhX1RPRE8gbWF5IGJlIHNsb3cgKGVzcCBmb3IgaW5kZXhpbmcgZW50aXJlIHdvcmtzcGFjZSkKLSAgICBwcml2YXRlIGZpbmFsIENSQzMyIGZDaGVja3N1bUNhbGN1bGF0b3IgPSBuZXcgQ1JDMzIoKTsKLQotICAgIC8qKiBtYWluIGNhbmNlbCBtb250aW9yIGZvciBhbGwgc2VhcmNoIHN1cHBvcnQgKi8KLSAgICBwcml2YXRlIGZpbmFsIElQcm9ncmVzc01vbml0b3IgZk1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0gICAgcHJpdmF0ZSBKc1NlYXJjaFN1cHBvcnQoKSB7Ci0gICAgICAgIC8vIGZvcmNlIHVzZSBvZiBzaW5nbGUgaW5zdGFuY2UKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9wZXJhdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGxpdmUgcmVzb3VyY2UncyBzZWFyY2ggbWFya2VycyBzaG93IHVwIGluCi0gICAgICogdGhlIG9wZW4gZWRpdG9yLiBJdCBhbHNvIGFsbG93cyB0aGUgYWJpbGl0eSB0byBwYXNzIGluIGEgUHJvZ3Jlc3NNb25pdG9yCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBTZWFyY2hKb2IgZXh0ZW5kcyBKb2IgaW1wbGVtZW50cyBJSmF2YVNjcmlwdFNlYXJjaENvbnN0YW50cyB7Ci0KLSAgICAgICAgU3RyaW5nIGZTZWFyY2hUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0KLSAgICAgICAgaW50IGZTZWFyY2hGb3IgPSBGSUVMRDsKLQotICAgICAgICBpbnQgZkxpbWl0VG8gPSBBTExfT0NDVVJSRU5DRVM7Ci0KLSAgICAgICAgaW50IGZNYXRjaE1vZGUgPSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSDsKLQotICAgICAgIC8vIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlOwotCi0gICAgICAgIFNlYXJjaFJlcXVlc3RvciBmUmVxdWVzdG9yID0gbnVsbDsKLQotICAgICAgICBJSmF2YVNjcmlwdEVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIGphdmEgZWxlbWVudAotICAgICAgICBwdWJsaWMgU2VhcmNoSm9iKElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50LCBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgICAgIHN1cGVyKEpzQ29yZU1lc3NhZ2VzLkpTUF9TZWFyY2ggKyBlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29uc3RydWN0b3Igdy8gc2VhcmNoIHRleHQKLSAgICAgICAgcHVibGljIFNlYXJjaEpvYihTdHJpbmcgc2VhcmNoVGV4dCwgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBzY29wZSwgaW50IHNlYXJjaEZvciwgaW50IGxpbWl0VG8sIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgICAgIHN1cGVyKEpzQ29yZU1lc3NhZ2VzLkpTUF9TZWFyY2ggKyBzZWFyY2hUZXh0KTsKLSAgICAgICAgICAgIHRoaXMuZlNlYXJjaFRleHQgPSBzZWFyY2hUZXh0OwotICAgICAgICAgICAgdGhpcy5mU2NvcGUgPSBzY29wZTsKLSAgICAgICAgICAgIHRoaXMuZlNlYXJjaEZvciA9IHNlYXJjaEZvcjsKLSAgICAgICAgICAgIHRoaXMuZkxpbWl0VG8gPSBsaW1pdFRvOwotICAgICAgICAgICAgdGhpcy5mTWF0Y2hNb2RlID0gbWF0Y2hNb2RlOwotICAgICAgICAgICAvLyB0aGlzLmZJc0Nhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7Ci0gICAgICAgICAgICB0aGlzLmZSZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBqb2JNb25pdG9yKSB7Ci0KLSAgICAgICAgICAgIGlmICgoam9iTW9uaXRvciAhPSBudWxsKSAmJiBqb2JNb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLSAgICAgICAgICAgIGlmIChKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl9Ci0KLSAgICAgICAgICAgIFNlYXJjaFBhdHRlcm4gamF2YVNlYXJjaFBhdHRlcm4gPSBudWxsOwotICAgICAgICAgICAgLy8gaWYgYW4gZWxlbWVudCBpcyBhdmFpbGFibGUsIHVzZSB0aGF0IHRvIGNyZWF0ZSBzZWFyY2ggcGF0dGVybgotICAgICAgICAgICAgLy8gKGVnLiBMb2NhbFZhcmlhYmxlKQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgdGV4dCBhbmQgb3RoZXIgcGFyYW10ZXJzCi0gICAgICAgICAgICBpZiAodGhpcy5mRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mRWxlbWVudCwgdGhpcy5mTGltaXRUbyk7Ci0JCQl9IGVsc2UgewotCQkJCWphdmFTZWFyY2hQYXR0ZXJuID0gU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKHRoaXMuZlNlYXJjaFRleHQsIHRoaXMuZlNlYXJjaEZvciwgdGhpcy5mTGltaXRUbywgdGhpcy5mTWF0Y2hNb2RlKTsKLQkJCX0KLQotICAgICAgICAgICAgaWYgKGphdmFTZWFyY2hQYXR0ZXJuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBKc1NlYXJjaFBhcnRpY2lwYW50W10gcGFydGljaXBhbnRzID0geyBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpIH07Ci0gICAgICAgICAgICAgICAgU2VhcmNoRW5naW5lIGVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoam9iTW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCQlqb2JNb25pdG9yLmJlZ2luVGFzaygiIiwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIGVuZ2luZS5zZWFyY2goamF2YVNlYXJjaFBhdHRlcm4sIHBhcnRpY2lwYW50cywgdGhpcy5mU2NvcGUsIHRoaXMuZlJlcXVlc3Rvciwgam9iTW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBub24tQ29yZUV4Y2VwdGlvbnMgd2lsbCBwZXJtYW5lbnRseSBzdGFsbCB0aGUgV29ya2VyIHRocmVhZAotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoam9iTW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCQlqb2JNb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZW5kIFNlYXJjaEpvYgotICAgIC8qKgotICAgICAqIFJ1bm5hYmxlIGZvcmNlcyBjYWxsZXIgdG8gd2FpdCB1bnRpbCBmaW5pc2hlZCAoYXMgb3Bwb3NlZCB0byB1c2luZyBhIEpvYikKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFNlYXJjaFJ1bm5hYmxlIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlLCBJSmF2YVNjcmlwdFNlYXJjaENvbnN0YW50cyB7Ci0KLSAgICAgICAgU3RyaW5nIGZTZWFyY2hUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0KLSAgICAgICAgaW50IGZTZWFyY2hGb3IgPSBGSUVMRDsKLQotICAgICAgICBpbnQgZkxpbWl0VG8gPSBBTExfT0NDVVJSRU5DRVM7Ci0KLSAgICAgICAgaW50IGZNYXRjaE1vZGUgPSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSDsKLQotICAgICAgICAvL2Jvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlOwotCi0gICAgICAgIFNlYXJjaFJlcXVlc3RvciBmUmVxdWVzdG9yID0gbnVsbDsKLQotICAgICAgICBJSmF2YVNjcmlwdEVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIGphdmEgZWxlbWVudAotICAgICAgICBwdWJsaWMgU2VhcmNoUnVubmFibGUoSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQsIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29uc3RydWN0b3Igdy8gc2VhcmNoIHRleHQKLS8vICAgICAgICBwdWJsaWMgU2VhcmNoUnVubmFibGUoU3RyaW5nIHNlYXJjaFRleHQsIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUsIGludCBzZWFyY2hGb3IsIGludCBsaW1pdFRvLCBpbnQgbWF0Y2hNb2RlLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotLy8KLS8vICAgICAgICAgICAgdGhpcy5mU2VhcmNoVGV4dCA9IHNlYXJjaFRleHQ7Ci0vLyAgICAgICAgICAgIHRoaXMuZlNjb3BlID0gc2NvcGU7Ci0vLyAgICAgICAgICAgIHRoaXMuZlNlYXJjaEZvciA9IHNlYXJjaEZvcjsKLS8vICAgICAgICAgICAgdGhpcy5mTGltaXRUbyA9IGxpbWl0VG87Ci0vLyAgICAgICAgICAgIHRoaXMuZk1hdGNoTW9kZSA9IG1hdGNoTW9kZTsKLS8vICAgICAgICAgICAgdGhpcy5mSXNDYXNlU2Vuc2l0aXZlID0gaXNDYXNlU2Vuc2l0aXZlOwotLy8gICAgICAgICAgICB0aGlzLmZSZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0vLyAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKChtb25pdG9yICE9IG51bGwpICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotICAgICAgICAgICAgaWYgKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotICAgICAgICAgICAgU2VhcmNoUGF0dGVybiBqYXZhU2VhcmNoUGF0dGVybiA9IG51bGw7Ci0gICAgICAgICAgICAvLyBpZiBhbiBlbGVtZW50IGlzIGF2YWlsYWJsZSwgdXNlIHRoYXQgdG8gY3JlYXRlIHNlYXJjaCBwYXR0ZXJuCi0gICAgICAgICAgICAvLyAoZWcuIExvY2FsVmFyaWFibGUpCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSB0ZXh0IGFuZCBvdGhlciBwYXJhbXRlcnMKLSAgICAgICAgICAgIGlmICh0aGlzLmZFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlqYXZhU2VhcmNoUGF0dGVybiA9IFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybih0aGlzLmZFbGVtZW50LCBmTGltaXRUbyk7Ci0JCQl9IGVsc2UgewotCQkJCWphdmFTZWFyY2hQYXR0ZXJuID0gU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKGZTZWFyY2hUZXh0LCBmU2VhcmNoRm9yLCBmTGltaXRUbywgZk1hdGNoTW9kZSk7Ci0JCQl9Ci0KLSAgICAgICAgICAgIGlmIChqYXZhU2VhcmNoUGF0dGVybiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSnNTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9IHsgZ2V0U2VhcmNoUGFydGljaXBhbnQoKSB9OwotICAgICAgICAgICAgICAgIFNlYXJjaEVuZ2luZSBlbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDApOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgZW5naW5lLnNlYXJjaChqYXZhU2VhcmNoUGF0dGVybiwgcGFydGljaXBhbnRzLCBmU2NvcGUsIGZSZXF1ZXN0b3IsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICAvL3Rocm93IGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIG5vbi1Db3JlRXhjZXB0aW9ucyB3aWxsIHBlcm1hbmVudGx5IHN0YWxsIHRoZSBXb3JrZXIgdGhyZWFkCi0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBlbmQgU2VhcmNoUnVubmFibGUKLQotICAgIC8qKgotICAgICAqIENsaWVudHMgc2hvdWxkIGFjY2VzcyB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIHZpYSB0aGUgc2luZ2xlIGluc3RhbmNlCi0gICAgICogdmlhIGdldEluc3RhbmNlKCkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSnNTZWFyY2hTdXBwb3J0IGdldEluc3RhbmNlKCkgewotCi0gICAgICAgIGlmIChzaW5nbGV0b24gPT0gbnVsbCkgewotCQkJc2luZ2xldG9uID0gbmV3IEpzU2VhcmNoU3VwcG9ydCgpOwotCQl9Ci0gICAgICAgIHJldHVybiBzaW5nbGV0b247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gY2hlY2sgaWYgYSBmaWxlIGlzIGEganNwIGZpbGUgKHNpbmNlIHRoaXMgaXMgZG9uZQotICAgICAqIGZyZXF1ZW50bHkpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSnNwKElGaWxlIGZpbGUpIHsKLSAgICAJcmV0dXJuIFV0aWwuaXNKc1R5cGUoZmlsZS5nZXROYW1lKCkpOwotICAgIAkvLyAocGEpIDIwMDUxMDI1IHJlbW92aW5nIGRlZXAgY29udGVudCB0eXBlIGNoZWNrCi0gICAgCS8vIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyZXF1ZW50bHkKLSAgICAJLy8gYW5kIElPIGlzIGV4cGVuc2l2ZQotLy8gICAgICAgIGJvb2xlYW4gaXNKc3AgPSBmYWxzZTsKLS8vCi0vLyAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0vLyAgICAgICAgCQotLy8gICAgICAgICAgICBJQ29udGVudFR5cGUgY29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLS8vICAgICAgICAgICAgLy8gY2hlY2sgdGhpcyBiZWZvcmUgZGVzY3JpcHRpb24sIGl0J3MgbGVzcyBleHBlbnNpdmUKLS8vICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlSlNQLmlzQXNzb2NpYXRlZFdpdGgoZmlsZS5nZXROYW1lKCkpKSB7Ci0vLyAgICAgICAgICAgIAlpc0pzcCA9IHRydWU7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLwotLy8gICAgICAgIHJldHVybiBpc0pzcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzY2hlZHVsZXMgYSBzZWFyY2ggZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoaXMgSlNQIGZpbGUgZm9yIGluZGV4aW5nIChieQotICAgICAqIHRoZSBqYXZhIGluZGV4ZXIpCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBKU1AgZmlsZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbmRleGluZyB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFNlYXJjaERvY3VtZW50IGFkZEpzcEZpbGUoSUZpbGUgZmlsZSkgewotICAgICAgICBpZiAoSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpIHx8ICFmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgSlNQIGZpbGU6IiArIGZpbGUuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0gICAgICAgIC8vIGNyZWF0ZQotICAgICAgICBTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IGNyZWF0ZVNlYXJjaERvY3VtZW50KGZpbGUpOwotICAgICAgICAvLyBudWxsIGlmIG5vdCBhIGpzcCBmaWxlCi0gICAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGdldFNlYXJjaFBhcnRpY2lwYW50KCkuc2NoZWR1bGVEb2N1bWVudEluZGV4aW5nKGRlbGVnYXRlLCBjb21wdXRlSW5kZXhMb2NhdGlvbihmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgZmFpbHVyZSBoZXJlIGRvZXNuJ3Qga2VlcCBvdGhlciBkb2N1bWVudHMgZnJvbQotICAgICAgICAgICAgICAgIC8vIGJlaW5nIGluZGV4ZWQKLSAgICAgICAgICAgICAgICAvLyBpZiBwZWZvcm1lZCBpbiBhIGJhdGNoIGNhbGwgKGxpa2UgSlNQSW5kZXhNYW5hZ2VyKQotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJzY2hlZHVsZWQiICsgZGVsZWdhdGUgKyAiZm9yIGluZGV4aW5nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGEgamF2YSBzZWFyY2ggdy8gdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFJ1bnMgaW4gYSBiYWNrZ3JvdW5kIEpvYgotICAgICAqIChyZXN1bHRzIG1heSBzdGlsbCBjb21lIGluIGFmdGVyIHRoaXMgbWV0aG9kIGNhbGwpCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlYXJjaFRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgb2YgdGV4dCB0byBzZWFyY2ggb24KLSAgICAgKiBAcGFyYW0gc2VhcmNoRm9yCi0gICAgICogICAgICAgICAgICBJSmF2YVNjcmlwdFNlYXJjaENvbnN0YW50cy5UWVBFLCBNRVRIT0QsIEZJRUxELCBQQUNLQUdFLCBldGMuLi4KLSAgICAgKiBAcGFyYW0gbGltaXRUbwotICAgICAqICAgICAgICAgICAgSUphdmFTY3JpcHRTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TLAotICAgICAqICAgICAgICAgICAgSUphdmFTY3JpcHRTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUywKLSAgICAgKiAgICAgICAgICAgIElKYXZhU2NyaXB0U2VhcmNoQ29uc3RhbnRzLklNUExFTUVOVE9SUywgb3IKLSAgICAgKiAgICAgICAgICAgIElKYXZhU2NyaXB0U2VhcmNoQ29uc3RhbnRzLkFMTF9PQ0NVUlJFTkNFUwotICAgICAqIEBwYXJhbSBtYXRjaE1vZGUKLSAgICAgKiAgICAgICAgICAgIGFsbG93ICogd2lsZGNhcmRzIG9yIG5vdAotICAgICAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUKLSAgICAgKiBAcGFyYW0gcmVxdWVzdG9yCi0gICAgICogICAgICAgICAgICBwYXNzZWQgaW4gdG8gYWNjZXB0IHNlYXJjaCBtYXRjaGVzIChhbmQgZG8gInNvbWV0aGluZyIgd2l0aAotICAgICAqICAgICAgICAgICAgdGhlbSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWFyY2goU3RyaW5nIHNlYXJjaFRleHQsIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUsIGludCBzZWFyY2hGb3IsIGludCBsaW1pdFRvLCBpbnQgbWF0Y2hNb2RlLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpzSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hKb2Igam9iID0gbmV3IFNlYXJjaEpvYihzZWFyY2hUZXh0LCBzY29wZSwgc2VhcmNoRm9yLCBsaW1pdFRvLCBtYXRjaE1vZGUsIGlzQ2FzZVNlbnNpdGl2ZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICBqb2Iuc2V0VXNlcih0cnVlKTsKLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwMzIKLSAgICAgICAgLy8gcG9wcyB1cCB1c2VyIG9wZXJhdGlvbiBibG9ja2VkIGRpYWxvZyBpZiB5b3UgcGVyZm9ybSBhIGxvbmcgc2VhcmNoLAotICAgICAgICAvLyB0aGVuIG9wZW4gYSBmaWxlIGJlY2F1c2UgaXQgbG9ja3MgdGhlIHdvcmtzcGFjZQotICAgICAgICAvL2pvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotICAgICAgICBqb2Iuc2NoZWR1bGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2ggZm9yIGFuIElKYXZhU2NyaXB0RWxlbWVudCwgY29uc3RyYWluZWQgYnkgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFJ1bnMgaW4KLSAgICAgKiBhIGJhY2tncm91bmQgSm9iIChyZXN1bHRzIG1heSBzdGlsbCBjb21lIGluIGFmdGVyIHRoaXMgbWV0aG9kIGNhbGwpCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gc2NvcGUKLSAgICAgKiBAcGFyYW0gcmVxdWVzdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VhcmNoKElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50LCBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgSnNJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWJ1aWxkSW5kZXhJZk5lZWRlZCgpOwotCi0gICAgICAgIFNlYXJjaEpvYiBqb2IgPSBuZXcgU2VhcmNoSm9iKGVsZW1lbnQsIHNjb3BlLCByZXF1ZXN0b3IpOwotICAgICAgICBzZXRDYW5jZWxlZChmYWxzZSk7Ci0gICAgICAgIGpvYi5zZXRVc2VyKHRydWUpOwotICAgICAgICAvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTAzMgotICAgICAgICAvL2pvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotICAgICAgICBqb2Iuc2NoZWR1bGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2ggZm9yIGFuIElKYXZhU2NyaXB0RWxlbWVudCwgY29uc3RyYWluZWQgYnkgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFJ1bnMgaW4KLSAgICAgKiBhbiBJV29ya3NwYWNlIHJ1bm5hYmxlIChyZXN1bHRzIHdpbGwgYmUgcmVwb3J0ZWQgYnkgdGhlIGVuZCBvZiB0aGlzCi0gICAgICogbWV0aG9kKQotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHBhcmFtIHNjb3BlCi0gICAgICogQHBhcmFtIHJlcXVlc3RvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlYXJjaFJ1bm5hYmxlKElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50LCBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgSnNJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWJ1aWxkSW5kZXhJZk5lZWRlZCgpOwotCi0gICAgICAgIFNlYXJjaFJ1bm5hYmxlIHNlYXJjaFJ1bm5hYmxlID0gbmV3IFNlYXJjaFJ1bm5hYmxlKGVsZW1lbnQsIHNjb3BlLCByZXF1ZXN0b3IpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihzZWFyY2hSdW5uYWJsZSwgSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ganNwRmlsZQotICAgICAqIEByZXR1cm4gU2VhcmNoRG9jdW1lbnQgaWYgdGhlIGZpbGUgaXMgbm90IG51bGwsIGV4aXN0cywgYW5kIGlzIGEgSlNQCi0gICAgICogICAgICAgICBmaWxlLCBvdGhlcndpc2UgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNlYXJjaERvY3VtZW50IGNyZWF0ZVNlYXJjaERvY3VtZW50KElGaWxlIGpzcEZpbGUpIHsKLQotICAgICAgICBKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG51bGw7Ci0gICAgICAgIGlmICgoanNwRmlsZSAhPSBudWxsKSAmJiBqc3BGaWxlLmV4aXN0cygpICYmIGlzSnNwKGpzcEZpbGUpKSB7Ci0KLSAgICAgICAgICAgIGRlbGVnYXRlID0gbmV3IEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKG5ldyBKc1NlYXJjaERvY3VtZW50KGpzcEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2VudHJhbGl6ZWQgcGxhY2UgdG8gYWNjZXNzIEpTUFNlYXJjaERvY3VtZW50cyAodXNlZCBieQotICAgICAqIEpTUFNlYXJjaFBhcnRpY2lwYW50IGFuZCBKU1BTZWFyY2hSZXF1ZXN0b3IpCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlYXJjaERvY1BhdGgKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHJldHVybiB0aGUgSlNQU2VhcmNoRG9jdW1lbnQgb3IgbnVsbCBpZiBvbmUgaXMgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIFNlYXJjaERvY3VtZW50IGdldFNlYXJjaERvY3VtZW50KFN0cmluZyBzZWFyY2hEb2NQYXRoKSB7Ci0gICAgICAgICAKLSAgICAgICAgU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSBudWxsOwotICAgICAgICBJRmlsZSBmID0gZmlsZUZvckNVUGF0aChzZWFyY2hEb2NQYXRoKTsKLSAgICAgICAgaWYgKGYgIT0gbnVsbCkgewotICAgICAgICAgICAgZGVsZWdhdGUgPSBjcmVhdGVTZWFyY2hEb2N1bWVudChmKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGhhbmRsZSBmYWlsdXJlIGNhc2UuLi4gKGZpbGUgZGVsZXRlZCBtYXliZT8pCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVubWFuZ2xlcyB0aGUgc2VhcmNoRG9jUGF0aCBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBKU1AgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VhcmNoRG9jUGF0aAotICAgICAqLwotICAgIHByaXZhdGUgSUZpbGUgZmlsZUZvckNVUGF0aChTdHJpbmcgc2VhcmNoRG9jUGF0aCkgewotICAgIAotICAgICAgICBTdHJpbmdbXSBzcGxpdCA9IHNlYXJjaERvY1BhdGguc3BsaXQoIi8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gc3BsaXRbc3BsaXQubGVuZ3RoIC0gMV07Ci0KLSAgICAgICAgLy8gaWdub3JlIGFueXRoaW5nIGJ1dCAuamF2YSBtYXRjaGVzIChsaWtlIC5jbGFzcyBiaW5hcnkgbWF0Y2hlcykKLSAgICAgICAgaWYoIXNlYXJjaERvY1BhdGguZW5kc1dpdGgoIi5qcyIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gSnNOYW1lTWFuZ2xlclV0aWwudW5tYW5nbGUoY2xhc3NuYW1lKTsKLSAgICAgICAKLSAgICAgICAgLy8gdHJ5IGFic29sdXRlIHBhdGgKLSAgICAgICAgSUZpbGUgZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVQYXRoKSk7Ci0gICAgICAgIC8vIHdvcmtzcGFjZSByZWxhdGl2ZSB0aGVuCi0gICAgICAgIGlmKGYgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2MDA5Ci0gICAgICAgICAgICAvLyBtdXN0IGhhdmUgYSBwcm9qZWN0IG5hbWUgYXMgd2VsbAotICAgICAgICAgICAgLy8gd2hpY2ggd291bGQgbWVhbiA+PSAyIHBhdGggc2VnbWVudHMKLSAgICAgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlUGF0aCk7Ci0gICAgICAgICAgICBpZihwYXRoLnNlZ21lbnRDb3VudCgpID49IDIpIHsKLSAgICAgICAgICAgICAgICBmID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmOwotICAgIH0KLQotICAgIEpzU2VhcmNoUGFydGljaXBhbnQgZ2V0U2VhcmNoUGFydGljaXBhbnQoKSB7Ci0KLSAgICAgICAgaWYgKHRoaXMuZlBhcnRpY2lwYW50ID09IG51bGwpIHsKLQkJCXRoaXMuZlBhcnRpY2lwYW50ID0gbmV3IEpzU2VhcmNoUGFydGljaXBhbnQoKTsKLQkJfQotICAgICAgICByZXR1cm4gdGhpcy5mUGFydGljaXBhbnQ7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSBKU1BQYXRoSW5kZXhlcgotICAgIC8vIHBhX1RPRE8KLSAgICAvL2hvdyBjYW4gd2UgbWFrZSBzdXJlIHBhcnRpY2lwYW50IGluZGV4TG9jYXRpb25zIGFyZSB1cGRhdGVkIGF0IHN0YXJ0dXA/Ci0gICAgcHVibGljIGZpbmFsIElQYXRoIGNvbXB1dGVJbmRleExvY2F0aW9uKElQYXRoIGNvbnRhaW5lclBhdGgpIHsKLQotICAgICAgICBJUGF0aCBpbmRleExvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBpbmFkdmVydGVudGx5IHVzZSBhIEpEVCBJbmRleAotICAgICAgICAvLyB3ZSB3YW50IHRvIGJlIHN1cmUgdG8gdXNlIHRoZSBJbmRleCBmcm9tIHRoZSBKU1AgbG9jYXRpb24KLSAgICAgICAgLy9PYmplY3Qgb2JqID0gaW5kZXhMb2NhdGlvbnMuZ2V0KGNvbnRhaW5lclBhdGgpOwotICAgICAgICAvL2lmIChvYmogIT0gbnVsbCkgewotICAgICAgICAvLyAgICBpbmRleExvY2F0aW9uID0gKFN0cmluZykgb2JqOwotICAgICAgICAvL30gZWxzZSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgaW5kZXggZW50cnkKLSAgICAgICAgICAgIFN0cmluZyBwYXRoU3RyaW5nID0gY29udGFpbmVyUGF0aC50b09TU3RyaW5nKCk7Ci0gICAgICAgICAgICB0aGlzLmZDaGVja3N1bUNhbGN1bGF0b3IucmVzZXQoKTsKLSAgICAgICAgICAgIHRoaXMuZkNoZWNrc3VtQ2FsY3VsYXRvci51cGRhdGUocGF0aFN0cmluZy5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IExvbmcudG9TdHJpbmcodGhpcy5mQ2hlY2tzdW1DYWxjdWxhdG9yLmdldFZhbHVlKCkpICsgIi5pbmRleCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIG9ubHkgZGlmZmVyZW5jZSBmcm9tCi0gICAgICAgICAgICAvLyBJbmRleE1hbmFnZXIjY29tcHV0ZUluZGV4TG9jYXRpb24oLi4uKQotICAgICAgICAgICAgaW5kZXhMb2NhdGlvbiA9IGdldE1vZGVsSnNwUGx1Z2luV29ya2luZ0xvY2F0aW9uKCkuYXBwZW5kKGZpbGVOYW1lKTsKLQotICAgICAgICAgICAgLy8gcGFfVE9ETyBuZWVkIHRvIGFkZCB0byBqYXZhIHBhdGggdG9vLCBzbyBKRFQgc2VhcmNoIHN1cHBvcnQga25vd3MKLSAgICAgICAgICAgIC8vIHRoZXJlIHNob3VsZCBiZSBhIG5vbiBpbnRlcm5hbCB3YXkgdG8gZG8gdGhpcy4KLSAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NzU2NAotICAgICAgICAgICAgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCkuaW5kZXhMb2NhdGlvbnMucHV0KGNvbnRhaW5lclBhdGgsIGluZGV4TG9jYXRpb24pOwotICAgICAgICAvL30KLSAgICAgICAgcmV0dXJuIGluZGV4TG9jYXRpb247Ci0gICAgfQotCXB1YmxpYyBJUGF0aCBnZXRNb2RlbEpzcFBsdWdpbldvcmtpbmdMb2NhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTnVsbCBwcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJUGF0aCB3b3JraW5nTG9jYXRpb25GaWxlID0gcHJvamVjdC5nZXRXb3JraW5nTG9jYXRpb24oSnNDb3JlUGx1Z2luLlBMVUdJTl9JRCkuYXBwZW5kKCJqc3NlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGVuc3VyZSB0aGF0IGl0IGV4aXN0cyBvbiBkaXNrCi0JCUZpbGUgZm9sZGVyID0gbmV3IEZpbGUod29ya2luZ0xvY2F0aW9uRmlsZS50b09TU3RyaW5nKCkpOwotCQlpZiAoIWZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQl0cnkgewotCQkJCWZvbGRlci5ta2RpcigpOwotCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiB3b3JraW5nTG9jYXRpb25GaWxlOwotCX0KLSAgICAvLyBjb3BpZWQgZnJvbSBKRFQgSW5kZXhNYW5hZ2VyCi0gICAgcHVibGljIElQYXRoIGdldE1vZGVsSnNwUGx1Z2luV29ya2luZ0xvY2F0aW9uKCkgewotCi0gICAgICAgIGlmICh0aGlzLmZKc1BsdWdpbkxvY2F0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmZKc1BsdWdpbkxvY2F0aW9uOwotCQl9Ci0KLSAgICAgICAgLy8gQXBwZW5kIHRoZSBmb2xkZXIgbmFtZSAianNzZWFyY2giIHRvIGtlZXAgdGhlIHN0YXRlIGxvY2F0aW9uIGFyZWEgY2xlYW5lcgotICAgICAgICBJUGF0aCBzdGF0ZUxvY2F0aW9uID0gSnNDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQoImpzc2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvLyBwYV9UT0RPIHdvcmthcm91bmQgZm9yCi0gICAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjI2NwotICAgICAgICAvLyBjb3BpZWQgZnJvbSBJbmRleE1hbmFnZXIKLSAgICAgICAgU3RyaW5nIGRldmljZSA9IHN0YXRlTG9jYXRpb24uZ2V0RGV2aWNlKCk7Ci0gICAgICAgIGlmICgoZGV2aWNlICE9IG51bGwpICYmIChkZXZpY2UuY2hhckF0KDApID09ICcvJykpIHsKLQkJCXN0YXRlTG9jYXRpb24gPSBzdGF0ZUxvY2F0aW9uLnNldERldmljZShkZXZpY2Uuc3Vic3RyaW5nKDEpKTsKLQkJfQotCi0gICAgICAgIC8vIGVuc3VyZSB0aGF0IGl0IGV4aXN0cyBvbiBkaXNrCi0gICAgICAgIEZpbGUgZm9sZGVyID0gbmV3IEZpbGUoc3RhdGVMb2NhdGlvbi50b09TU3RyaW5nKCkpOwotCQlpZiAoIWZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQl0cnkgewotCQkJCWZvbGRlci5ta2RpcigpOwotCQkJfQotCQkJY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0gICAgICAgIHJldHVybiB0aGlzLmZKc1BsdWdpbkxvY2F0aW9uID0gc3RhdGVMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKU1AgSW5kZXhpbmcgYW5kIFNlYXJjaCBqb2JzIGNoZWNrIHRoaXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBmaW5hbCB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gY2FuY2VsKSB7Ci0gICAgCS8vU3lzdGVtLm91dC5wcmludGxuKCJzZWFyY2ggc3VwcG9ydCBtb25pdG9yIiArIGZNb25pdG9yKTsKLSAgICAgICAgZk1vbml0b3Iuc2V0Q2FuY2VsZWQoY2FuY2VsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKU1AgSW5kZXhpbmcgYW5kIFNlYXJjaCBqb2JzIGNoZWNrIHRoaXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBmaW5hbCBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0KLSAgICAgICAgcmV0dXJuIGZNb25pdG9yLmlzQ2FuY2VsZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKU1AgSW5kZXhpbmcgYW5kIFNlYXJjaCBqb2JzIGNoZWNrIHRoaXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCi0gICAgICAgIHJldHVybiB0aGlzLmZNb25pdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL051bGxTZWFyY2hEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvTnVsbFNlYXJjaERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMWNlNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvTnVsbFNlYXJjaERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci0KLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQW4gZW1wdHkgc2VydmxldCwgc2FmZSBmb3IgSmF2YSBzZWFyY2ggcGFydGljaXBhdGlvbgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgTnVsbFNlYXJjaERvY3VtZW50IGV4dGVuZHMgU2VhcmNoRG9jdW1lbnQgewotCQotCVN0cmluZ0J1ZmZlciBmRW1wdHlTZXJ2bGV0QnVmZmVyID0gbnVsbDsKLQkKLQlwdWJsaWMgTnVsbFNlYXJjaERvY3VtZW50KFN0cmluZyBkb2N1bWVudFBhdGgpIHsKLQkJc3VwZXIoZG9jdW1lbnRQYXRoLCBuZXcgSnNTZWFyY2hQYXJ0aWNpcGFudCgpKTsgCi0JCXRoaXMuZkVtcHR5U2VydmxldEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl9Ci0JCi0JcHVibGljIGJ5dGVbXSBnZXRCeXRlQ29udGVudHMoKSB7Ci0JCXJldHVybiB0aGlzLmZFbXB0eVNlcnZsZXRCdWZmZXIudG9TdHJpbmcoKS5nZXRCeXRlcygpOwotCX0KLQkKLQlwdWJsaWMgY2hhcltdIGdldENoYXJDb250ZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuZkVtcHR5U2VydmxldEJ1ZmZlci50b1N0cmluZygpLnRvQ2hhckFycmF5KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvdGV4dC9JSnNQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS90ZXh0L0lKc1BhcnRpdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhYjE0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS90ZXh0L0lKc1BhcnRpdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElKc1BhcnRpdGlvbnMgewotCVN0cmluZyBIdG1sSnNQYXJ0aXRpb24gPSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUOwotCS8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTczOTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZThiYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotQGRvdAotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3BfMS4wLjAuMjAwODA2MDMxMzA0LmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllMDc5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1MzczOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU2F0IE1hciAyNCAxMToyMzo1NCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWQ4YTU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNDAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLkFjdGl2YXRvcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuNTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS40MDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMzAwLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjQwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS41MDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMzAwLDIuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjM2IwZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE4OWVjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3ANCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KLUJ1bmRsZS1OYW1lLjAgPSBKU0RUIHN1cHBvcnQgZm9yIEpTUCBQbHVnLWluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MGYxYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AuSlNEVFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNvbnRlbnRhc3Npc3Rwcm9jZXNzb3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSlNEVENvbnRlbnRBc3Npc3RhbnQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuU0NSSVBULkpBVkFTQ1JJUFQiIC8+Ci0JCTxkb2N1bWVudGF0aW9uVGV4dEhvdmVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRhZ2luZm8uSlNEVEhvdmVyUHJvY2Vzc29yIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLlNDUklQVC5KQVZBU0NSSVBUIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoLkpzRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLlNDUklQVCxvcmcuZWNsaXBzZS5qc3QuanNwLlNDUklQVC5FVkVOVEhBTkRMRVIiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9InNsYXZlZm9ybWF0dGluZ3N0cmF0ZWd5IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5mb3JtYXQuRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuSkFWQVNDUklQVCIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpzVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC5qc3NvdXJjZXZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIj48L3BhcnRpdGlvblR5cGU+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVCI+PC9wYXJ0aXRpb25UeXBlPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jaGFyYWN0ZXJQYWlyaW5nIj4KLQkJPGluc2VydGVyIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGV4dC5Kc0NoYXJhY3RlclBhaXJJbnNlcnRlciIgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5qc3AudWkuaW5zZXJ0ZXIiPgotCQkgIDxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJICAgICAgICBwYXJ0aXRpb25zPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQsIG9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiPgotCQkgIDwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L2luc2VydGVyPgotCTwvZXh0ZW5zaW9uPgotICAgPCEtLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLQkJPGV2ZW50LWhhbmRsZXIgZmFjZXQ9ImpzdC53ZWIiIHR5cGU9IlBPU1RfSU5TVEFMTCIgIHZlcnNpb249IlsyLjAiPgotCSAgIAkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzTmF0dXJlSW5zdGFsbGVyIi8+Ci0JCTwvZXZlbnQtaGFuZGxlcj4KLQkKLQkJPGV2ZW50LWhhbmRsZXIgZmFjZXQ9ImpzdC53ZWIiIHR5cGU9IlBPU1RfVU5JTlNUQUxMIiB2ZXJzaW9uPSJbMi4wIj4KLQkJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc05hdHVyZVVuaW5zdGFsbGVyIi8+Ci0JCTwvZXZlbnQtaGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4tLT4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3Avc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9zdXBwb3J0L2pzcC9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvc3VwcG9ydC9qc3AvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTc5YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3Avc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9zdXBwb3J0L2pzcC9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLQotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcCI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWN0aXZhdG9yKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvc3VwcG9ydC9qc3AvSlNEVFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3Avc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9zdXBwb3J0L2pzcC9KU0RUU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNGQzYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3Avc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9zdXBwb3J0L2pzcC9KU0RUU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUudGV4dC5JSnNQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU0RUOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5jb250ZW50YXNzaXN0LkpTRFRTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuYXV0b2VkaXQuQXV0b0VkaXRTdHJhdGVneUZvckpzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU0RUU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQIGV4dGVuZHMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQewotCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gZkhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gZ2V0SlNEVEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZkhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCWZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU0RUKCk7Ci0JCX0KLQkJcmV0dXJuIGZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldEluZGVudFByZWZpeGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJU3RyaW5nW10gaW5kZW50YXRpb25zID0gbnVsbDsKLQkJaWYgKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQuZXF1YWxzKGNvbnRlbnRUeXBlKSB8fCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBULmVxdWFscyhjb250ZW50VHlwZSkgfHwgSUhUTUxQYXJ0aXRpb25zLlNDUklQVF9FVkVOVEhBTkRMRVIuZXF1YWxzKGNvbnRlbnRUeXBlKSkKLQkJCWluZGVudGF0aW9ucyA9IGdldEpTRFRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldEluZGVudFByZWZpeGVzKHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCQllbHNlCi0JCQlpbmRlbnRhdGlvbnMgPSBzdXBlci5nZXRJbmRlbnRQcmVmaXhlcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJcmV0dXJuIGluZGVudGF0aW9uczsKLQl9Ci0JCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlMaW5lU3R5bGVQcm92aWRlcltdIHByb3ZpZGVycyA9IG51bGw7Ci0JCWlmIChJSFRNTFBhcnRpdGlvbnMuU0NSSVBULmVxdWFscyhwYXJ0aXRpb25UeXBlKSB8fCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBULmVxdWFscyhwYXJ0aXRpb25UeXBlKSB8fCBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUX0VWRU5USEFORExFUi5lcXVhbHMocGFydGl0aW9uVHlwZSkpIHsKLQkJCXByb3ZpZGVycyA9IGdldEpTRFRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpOwotCQl9Ci0JCWVsc2V7Ci0JCQlwcm92aWRlcnMgPSBzdXBlci5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJfQotCi0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AjZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElBdXRvRWRpdFN0cmF0ZWd5W10gZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJaWYoY29udGVudFR5cGUuZXF1YWxzKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpIHx8IGNvbnRlbnRUeXBlLmVxdWFscyhJSFRNTFBhcnRpdGlvbnMuU0NSSVBUX0VWRU5USEFORExFUikpIHsKLQkJCUlBdXRvRWRpdFN0cmF0ZWd5W10gc3RyYXRlZ2llcyA9IG5ldyBJQXV0b0VkaXRTdHJhdGVneVsxXTsKLQkJCXN0cmF0ZWdpZXNbMF0gPSBuZXcgQXV0b0VkaXRTdHJhdGVneUZvckpzKCk7Ci0JCQlyZXR1cm4gc3RyYXRlZ2llczsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBzdXBlci5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCNnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKAotCQkJSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIHByb2Nlc3NvcnM7Ci0JCQotCQlpZihpc0phdmFzY3JpcHRQYXJ0aXRpb25UeXBlKHBhcnRpdGlvblR5cGUpKSB7Ci0JCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSlNEVFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yKAotCQkJCQl0aGlzLmdldENvbnRlbnRBc3Npc3RhbnQoKSwgcGFydGl0aW9uVHlwZSwgc291cmNlVmlld2VyKTsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtwcm9jZXNzb3J9OwotCQl9IGVsc2UgewotCQkJcHJvY2Vzc29ycyA9IHN1cGVyLmdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCX0gCi0JCQotCQlyZXR1cm4gcHJvY2Vzc29yczsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGVJRCBjaGVjayB0byBzZWUgaWYgdGhpcyBwYXJ0aXRpb24gdHlwZSBJRCBpcyBmb3IgYSBKYXZhc2NyaXB0IHBhcnRpdGlvbiB0eXBlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGFydGl0b24gdHlwZSBpcyBhIEphdmFzY3JpcHQgcGFydGl0aW9uIHR5cGUsCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNKYXZhc2NyaXB0UGFydGl0aW9uVHlwZShTdHJpbmcgcGFydGl0aW9uVHlwZUlEKSB7Ci0JCXJldHVybiBJSnNQYXJ0aXRpb25zLkh0bWxKc1BhcnRpdGlvbi5lcXVhbHMocGFydGl0aW9uVHlwZUlEKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxNjVlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTE3ODU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTA3MjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLSNXZWQgT2N0IDI0IDE5OjQ5OjQ1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWQwOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSNXZWQgT2N0IDI0IDE5OjQxOjMxIEVEVCAyMDA3Ci1jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLWNsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLWNsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLWNsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLWNsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPWZhbHNlCi1jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9dHJ1ZQotY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLWNsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPWZhbHNlCi1jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLWNsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1jbGVhbnVwLnVzZV9ibG9ja3M9dHJ1ZQotY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLWNsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1jbGVhbnVwX3Byb2ZpbGU9X1NTRSBUZWFtIFN0eWxlcwotY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKLW9yZy5lY2xpcHNlLmpkdC51aS5nZXR0ZXJzZXR0ZXIudXNlLmlzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5rZXl3b3JkdGhpcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LnVpLm92ZXJyaWRlYW5ub3RhdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MmIwYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSNGcmkgRmViIDI3IDEyOjQ1OjM1IEVTVCAyMDA5Ci1jb21waWxlcnMuZi51bnJlc29sdmVkLWZlYXR1cmVzPTEKLWNvbXBpbGVycy5mLnVucmVzb2x2ZWQtcGx1Z2lucz0xCi1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuZGlzY291cmFnZWQtY2xhc3M9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAuaW50ZXJuYWw9MQotY29tcGlsZXJzLnAubWlzc2luZy1wYWNrYWdlcz0yCi1jb21waWxlcnMucC5taXNzaW5nLXZlcnNpb24tZXhwb3J0LXBhY2thZ2U9MgotY29tcGlsZXJzLnAubWlzc2luZy12ZXJzaW9uLWltcG9ydC1wYWNrYWdlPTIKLWNvbXBpbGVycy5wLm1pc3NpbmctdmVyc2lvbi1yZXF1aXJlLWJ1bmRsZT0yCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1pZGVudGlmaWVyPTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy5zLmNyZWF0ZS1kb2NzPWZhbHNlCi1jb21waWxlcnMucy5kb2MtZm9sZGVyPWRvYwotY29tcGlsZXJzLnMub3Blbi10YWdzPTEKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVmNTEyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC40MDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmNvbnRlbnRhc3Npc3QsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmF1dG9lZGl0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZGVyaXZlZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZm9ybWF0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluazt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnJlZ2lzdHJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnN0eWxlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnN0eWxlLmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGFnaW5mbzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lCi1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudXRpbDsgdmVyc2lvbj0iMy44IiwKLSBjb20uaWJtLmljdS50ZXh0OyB2ZXJzaW9uPSIzLjgiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMzAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjQwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS41MDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5zZWFyY2g7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjUwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNDAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQubWFuaXB1bGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwMCwyLjAuMCkiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTY2N2Q4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9pY29ucy9leWVfaWNvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9pY29ucy9leWVfaWNvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ODM5OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvaWNvbnMvZXllX2ljb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvaWNvbnMvZnVsbC9lbGNsMTYvamF2YWFzc2lzdF9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9pY29ucy9mdWxsL2VsY2wxNi9qYXZhYXNzaXN0X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhNmJkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9pY29ucy9mdWxsL2VsY2wxNi9qYXZhYXNzaXN0X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZDE5OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1CdW5kbGUtTmFtZS4wID0gSlNEVCBXZWIgU3VwcG9ydCBVSQotaHlwZXJsaW5rRGV0ZWN0b3IubmFtZS4wID0gSmF2YVNjcmlwdCBFbGVtZW50Ci1tZW51LmxhYmVsLjAgPSBEZWNsYXJhdGlvbnMKLWFjdGlvbi50b29sdGlwLjAgPSBXb3JraW5nIFNldAotYWN0aW9uLmxhYmVsLjAgPSBXb3JraW5nIFNldAotYWN0aW9uLmxhYmVsLjEgPSBIaWVyYXJjaHkKLWFjdGlvbi50b29sdGlwLjEgPSBIaWVyYXJjaHkKLWFjdGlvbi5sYWJlbC4yID0gUHJvamVjdAotYWN0aW9uLnRvb2x0aXAuMiA9IFByb2plY3QKLWFjdGlvbi5sYWJlbC4zID0gV29ya3NwYWNlCi1hY3Rpb24udG9vbHRpcC4zID0gRGVjbGFyYXRpb25zCi1tZW51LmxhYmVsLjEgPSBSZWZlcmVuY2VzCi1hY3Rpb24ubGFiZWwuNCA9IFdvcmtpbmcgU2V0Ci1hY3Rpb24udG9vbHRpcC40ID0gV29ya2luZyBTZXQKLWFjdGlvbi5sYWJlbC41ID0gSGllcmFyY2h5Ci1hY3Rpb24udG9vbHRpcC41ID0gSGllcmFyY2h5Ci1hY3Rpb24ubGFiZWwuNiA9IFByb2plY3QKLWFjdGlvbi50b29sdGlwLjYgPSBQcm9qZWN0Ci1hY3Rpb24ubGFiZWwuNyA9IFdvcmtzcGFjZQotYWN0aW9uLnRvb2x0aXAuNyA9IAotbWVudS5sYWJlbC4yID0gUmVmYWN0b3IKLW1lbnUubGFiZWwuMyA9IFNvdXJjZQotYWN0aW9uLmxhYmVsLjggPSBHZW5lcmF0ZSBFbGVtZW50IENvbW1lbnQKLWFjdGlvbi50b29sdGlwLjggPSBHZW5lcmF0ZSBFbGVtZW50IENvbW1lbnQKLWFjdGlvbi5sYWJlbC45ID0gQ2hhbmdlIEZ1bmN0aW9uIFNpZ25hdHVyZQotYWN0aW9uLnRvb2x0aXAuOSA9IENoYW5nZSBGdW5jdGlvbiBTaWduYXR1cmUKLWFjdGlvbi5sYWJlbC4xMCA9IE1vdmUKLWFjdGlvbi50b29sdGlwLjEwID0gTW92ZQotYWN0aW9uLmxhYmVsLjExID0gUmVuYW1lCi1hY3Rpb24udG9vbHRpcC4xMSA9IFJlbmFtZQotYWN0aW9uLmxhYmVsLjEyID0gRGVsZXRlCi1hY3Rpb24udG9vbHRpcC4xMiA9IERlbGV0ZQotYWN0aW9uLmxhYmVsLjEzID0gUGFzdGUgQWZ0ZXIKLWFjdGlvbi50b29sdGlwLjEzID0gUGFzdGUKLWFjdGlvbi5sYWJlbC4xNCA9IFBhc3RlIEJlZm9yZQotYWN0aW9uLnRvb2x0aXAuMTQgPSBQYXN0ZQotYWN0aW9uLmxhYmVsLjE1ID0gQ29weQotYWN0aW9uLnRvb2x0aXAuMTUgPSBDb3B5Ci1hY3Rpb24ubGFiZWwuMTYgPSBDdXQKLWFjdGlvbi50b29sdGlwLjE2ID0gQ3V0Ci1tZW51LmxhYmVsLjQgPSBTaG93IEluCi1hY3Rpb24ubGFiZWwuMTcgPSBOYXZpZ2F0b3IKLWFjdGlvbi50b29sdGlwLjE3ID0gU2hvdyBJbiBOYXZpZ2F0b3IKLWFjdGlvbi5sYWJlbC4xOCA9IFNjcmlwdCBFeHBsb3JlcgotYWN0aW9uLnRvb2x0aXAuMTggPSBTaG93IEluIFNjcmlwdCBFeHBsb3JlcgotYWN0aW9uLmxhYmVsLjE5ID0gT3BlbiBDYWxsIEhpZXJhcmNoeQotYWN0aW9uLnRvb2x0aXAuMTkgPSBPcGVuIENhbGwgSGllcmFyY2h5Ci1hY3Rpb24ubGFiZWwuMjAgPSBPcGVuIFR5cGUgSGllcmFyY2h5Ci1hY3Rpb24udG9vbHRpcC4yMCA9IE9wZW4gVHlwZSBIaWVyYXJjaHkKLXJlbmFtZVBhcnRpY2lwYW50Lm5hbWUuMCA9IEpTRFQgV2ViIFJlbmFtZSBQYXJ0aWNpcGFudAotcmVuYW1lUGFydGljaXBhbnQubmFtZS4xID0gSlNEVCBXZWIgUmVuYW1lIFBhcnRpY2lwYW50Ci1yZW5hbWVQYXJ0aWNpcGFudC5uYW1lLjIgPSBKU0RUIFdlYiBSZW5hbWUgUGFydGljaXBhbnQKLXJlbmFtZVBhcnRpY2lwYW50Lm5hbWUuMyA9IEpTRFQgV2ViIFJlbmFtZSBQYXJ0aWNpcGFudAotcXVlcnlQYXJ0aWNpcGFudC5uYW1lLjAgPSBKYXZhU2NyaXB0IFF1ZXJ5IFBhcnRpY2lwYW50Ci1qYXZhU2NyaXB0UHJvcG9zYWxzID0gSmF2YVNjcmlwdCBQcm9wb3NhbHMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmZmN2U3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLSAJCTxjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmUuSnNDb250ZW50T3V0bGluZUNvbmZpZyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZSIgLz4JCi0JCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTRFQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiIC8+CQotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJsaW5lc3R5bGVwcm92aWRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGUuamF2YS5MaW5lU3R5bGVQcm92aWRlckZvckpTRFQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCxvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIiAvPgotCQk8ZG9jdW1lbnRhdGlvblRleHRIb3ZlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50YWdpbmZvLkpTRFRIb3ZlclByb2Nlc3NvciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULG9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNoYXJhY3RlcnBhaXJtYXRjaGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50ZXh0LkpzRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULG9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImF1dG9lZGl0c3RyYXRlZ3kiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmF1dG9lZGl0LkF1dG9FZGl0U3RyYXRlZ3lGb3JKcyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULG9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2guSnNGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCxvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzbGF2ZWZvcm1hdHRpbmdzdHJhdGVneSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZm9ybWF0LkZvcm1hdHRpbmdTdHJhdGVneUpTRFQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCIgLz4KLQk8L2V4dGVuc2lvbj4JCQotCQotCSA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JzIj4KLSAgICAgIDxoeXBlcmxpbmtEZXRlY3RvciAKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkpTRFRIeXBlcmxpbmtEZXRlY3RvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuSlNEVEh5cGVybGlua0RldGVjdG9yLlNDUklQVCIKLSAgICAgICAgICAgIG5hbWU9IiVoeXBlcmxpbmtEZXRlY3Rvci5uYW1lLjAiCi0gICAgICAgICAgICB0YXJnZXRJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIi8+Ci0gICAgICA8aHlwZXJsaW5rRGV0ZWN0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkpTRFRIeXBlcmxpbmtEZXRlY3RvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuSlNEVEh5cGVybGlua0RldGVjdG9yLlNDUklQVC5ldmVudHMiCi0gICAgICAgICAgICBuYW1lPSIlaHlwZXJsaW5rRGV0ZWN0b3IubmFtZS4wIgotICAgICAgICAgICAgdGFyZ2V0SWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiLz4gIAotICAgICAgPGh5cGVybGlua0RldGVjdG9yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluay5KU0RUSHlwZXJsaW5rRGV0ZWN0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLkpTRFRIeXBlcmxpbmtEZXRlY3Rvci5IVE1MIgotCQkJbmFtZT0iJWh5cGVybGlua0RldGVjdG9yLm5hbWUuMCIKLQkJCXRhcmdldElkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAKLSAgCi0gICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCTwhLS0gY29udGVudCBvdXRsaW5lIGNvbnRyaWJ1dGlvbnMgZm9yIE9wZW4gVHlwZSBhbmQgT3BlbiBIaWVyYXJjaHkgbWVudS4gIE1lbnVzIHNob3cgdXAgaW4gcmV2ZXJzZSBvcmRlciBvZiBkZWNsaXJhdGlvbiAoZ29vZ2xlIGl0KS4gLS0+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklKYXZhV2ViTm9kZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuSmF2YUFjdGlvbnMiPgotICAgICAgICAgICAgPCEtLSBEZWNsYXJhdGlvbnMgU2VhcmNoIE1lbnUgLS0+Ci0gICAgICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuZGVjbGVyYXRpb25zIgotICAgICAgICAgCQlsYWJlbD0iJW1lbnUubGFiZWwuMCIKLSAgICAgICAgIAkJcGF0aD0iZ3JvdXAuc2VhcmNoIj4KLSAgICAgCQkgCTxzZXBhcmF0b3IgbmFtZT0iZGVjbGVyYXRpb25zIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4wIiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4wIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5kZWNsZXJhdGlvbnMvZGVjbGVyYXRpb25zIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLkZpbmREZWNsYXJhdGlvbnNJbldvcmtpbmdTZXRBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+ICAKLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjEiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjEiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmRlY2xlcmF0aW9ucy9kZWNsZXJhdGlvbnMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuRmluZERlY2xhcmF0aW9uc0luSGllcmFyY2h5QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPiAKLSAgICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4yIiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4yIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5kZWNsZXJhdGlvbnMvZGVjbGVyYXRpb25zIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLkZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICAKLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjMiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMyIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuZGVjbGVyYXRpb25zL2RlY2xlcmF0aW9ucyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5GaW5kRGVjbGFyYXRpb25zQWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPiAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICA8IS0tIFJlZnJlbmNlcyBTZWFyY2ggbWVudSAtLT4KLSAgICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIucmVmZXJlbmNlcyIKLSAgICAgICAgIAkJbGFiZWw9IiVtZW51LmxhYmVsLjEiCi0gICAgICAgICAJCXBhdGg9Imdyb3VwLnNlYXJjaCI+Ci0gICAgIAkJIAk8c2VwYXJhdG9yIG5hbWU9InJlZmVyZW5jZXMiLz4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjQiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnJlZmVyZW5jZXMvcmVmZXJlbmNlcyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4gIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuNSIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuNSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIucmVmZXJlbmNlcy9yZWZlcmVuY2VzIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzSW5IaWVyYXJjaHlBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+IAotICAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjYiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjYiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnJlZmVyZW5jZXMvcmVmZXJlbmNlcyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuNyIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC43IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5yZWZlcmVuY2VzL3JlZmVyZW5jZXMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+ICAgCi0gICAgICAgICA8IS0tIFNvdXJjZSBhbmQgUmVmYWN0b3JpbmcgTWVudSdzIC0tPgotICAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5yZWZhY3RvciIKLSAgICAgICAgIAkJbGFiZWw9IiVtZW51LmxhYmVsLjIiCi0gICAgICAgICAJCXBhdGg9Imdyb3VwLmdlbmVyYXRlIj4KLSAgICAgCQkgCTxzZXBhcmF0b3IgbmFtZT0icmVmYWN0b3IiLz4KLSAgICAgICAgIDwvbWVudT4KLQotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnNvdXJjZSIKLSAgICAgICAgIAkJbGFiZWw9IiVtZW51LmxhYmVsLjMiCi0gICAgICAgICAJCXBhdGg9Imdyb3VwLmdlbmVyYXRlIj4KLSAgICAgCQkgCTxzZXBhcmF0b3IgbmFtZT0ic291cmNlIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8IS0tIFNvdXJjZSBBY3Rpb25zIC0tPgotCQkgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuOCIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuOCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc291cmNlL3NvdXJjZSIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkFkZEphdmFEb2NTdHViQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuZ2VuZXJhdGUuZWxlbWVudC5jb21tZW50Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPCEtLSBSZWZhY3RvciBBY3Rpb25zIC0tPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuOSIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuOSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIucmVmYWN0b3IvcmVmYWN0b3IiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5Tb3VyY2VBY3Rpb25zQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuY2hhbmdlLmZ1bmN0aW9uLnNpZ25hdHVyZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjEwIiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xMCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIucmVmYWN0b3IvcmVmYWN0b3IiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5Tb3VyY2VBY3Rpb25zQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuTW92ZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjExIiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xMSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIucmVmYWN0b3IvcmVmYWN0b3IiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5Tb3VyY2VBY3Rpb25zQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkucmVuYW1lIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIDwhLS0gRWRpdCAgKGN1dCBjb3B5IHBhc3RlIGV0Yy4uIC0tPgotICAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjEyIiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xMiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJncm91cC5lZGl0IgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuZGVsZXRlIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAKLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjEzIiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xMyIKLSAgICAgICAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJncm91cC5lZGl0IgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkucGFzdGUuYWZ0ZXIiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMTQiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjE0IgotICAgICAgICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Imdyb3VwLmVkaXQiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5wYXN0ZS5iZWZvcmUiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4xNSIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMTUiCi0gICAgICAgICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZ3JvdXAuZWRpdCIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IioiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmNvcHkiPgotICAgICAgICAgPC9hY3Rpb24+Ci0KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjE2IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xNiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJncm91cC5lZGl0IgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuY3V0Ij4KLSAgICAgICAgIDwvYWN0aW9uPiAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICA8IS0tIFNob3cgaW4gU2NyaXB0IEV4cGxvcmVyLCBIaXN0b3J5IGFuZCBOYXZpZ2F0b3IgLS0+ICAgICAgIAotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnNob3dpbiIKLSAgICAgICAgIAkJbGFiZWw9IiVtZW51LmxhYmVsLjQiCi0gICAgICAgICAJCXBhdGg9Imdyb3VwLnNob3ciPgotICAgICAJCSAJPHNlcGFyYXRvciBuYW1lPSJzaG93aW4iLz4KLSAgICAgICAgIDwvbWVudT4gIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMTciICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjE3IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zaG93aW4vc2hvd2luIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU2hvd0luTmF2aWdhdG9yQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLlNob3dJbk5hdmlnYXRvclZpZXdBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8IS0tIEhpc3Rvcnkgbm90IHdvcmtpbmcgd2VsbCAtLT4KLSAgICAgICAgIDwhLS0KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJIaXN0b3J5IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IlNob3cgSW4gSGlzdG9yeSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc2hvd2luL3Nob3dpbiIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlNob3dIaXN0b3J5QWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5jYWxsaGllcmFyY2h5Lk9wZW5DYWxsSGllcmFyY2h5QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPiAKLSAgICAgICAgIC0tPgotICAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjE4IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xOCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc2hvd2luL3Nob3dpbiIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlNob3dJblNjcmlwdEV4cGxvcmVyQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLlNob3dJblNjcmlwdEV4cGxvcmVyIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIE9wZW4gQ2FsbCBhbmQgVHlwZSBIaWVyYXJjaGllcyAtLT4KLSAgICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4xOSIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMTkiCi0gICAgICAgICAgICAgbWVudWJhclBhdGg9Imdyb3VwLnNob3ciCi0gICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuT3BlbkNhbGxIaWVyYXJjaHlBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLmNhbGxoaWVyYXJjaHkuT3BlbkNhbGxIaWVyYXJjaHlBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4yMCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4yMCIKLSAgIAkJCW1lbnViYXJQYXRoPSJncm91cC5zaG93IgotICAgCQkJc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuT3BlblR5cGVIaWVyYXJjaHkiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuT3BlblR5cGVIaWVyYXJjaHlBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgPC9vYmplY3RDb250cmlidXRpb24+IAotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLSAgCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIHNvdXJjZSB2YWxpZGF0aW9uIGZvciBKU1AJCQkJCQkJCQkJCQkJCQkgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpzVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5qc3NvdXJjZXZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULkVWRU5USEFORExFUiIvPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEpTUCBVSSBBZGFwdGVyIGZhY3RvcmllcwkJCQkJICAgCQkJCQkJICAJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iPgotCQk8YWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNEVCI+Ci0JCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JCi0KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gZm9yIGJyZWFrcG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gcmVtb3ZlZCBmb3Igbm93IC0tPgotCTwhLS0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmJyZWFrcG9pbnQiPgotCQk8YnJlYWtwb2ludENvbnRyaWJ1dGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnByb3ZpZGVycyI+Ci0JCQk8cHJvdmlkZXIKLQkJCQljb250ZW50VHlwZXM9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnMuSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXI6Kmh0bWwsanMsaHRtKiIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnMuSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXIiIC8+Ci0JCTwvYnJlYWtwb2ludENvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQktLT4KLQkKLQkKLQk8IS0tIEVkaXRvciBhY3Rpb25zZXRzIC0tPgotCTwhLS0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiIC8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiIC8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCTwvZXh0ZW5zaW9uPgotCS0tPgotCi0JCi0JCi0JCi0JPCEtLSBLZXliaW5kaW5ncyBmb3IganNwIHNvdXJjZSBlZGl0b3IgLS0+Ci0JPCEtLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmJpbmRpbmdzIj4gLS0+Ci0JICAgIDwhLS0gIHdpbjMyOiAgTTE9Q1RSTCwgTTI9U0hJRlQsIE0zPUFMVCAtLT4KLQkJPCEtLSByZW5hbWUgcmVmYWN0b3IgLS0+Ci0JCTwhLS0KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0yK00zK1IiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5zY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuZWRpdC50ZXh0LmphdmEucmVuYW1lLmVsZW1lbnQiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQktLT4KLQkJPCEtLSBtb3ZlIHJlZmFjdG9yIC0tPgotCQk8IS0tCi0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytWIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3Auc2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5yZWZhY3Rvci5tb3ZlIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQk8L2V4dGVuc2lvbj4KLQktLT4KLQkKLQkKLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIHF1ZXJ5UGFydGljaXBhbnQgdG8gcGFydGljaXBhdGUgaW4gamF2YSBzZXJhY2hlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5xdWVyeVBhcnRpY2lwYW50cyI+Ci0JCTxxdWVyeVBhcnRpY2lwYW50Ci0JCQluYW1lPSIlcXVlcnlQYXJ0aWNpcGFudC5uYW1lLjAiCi0JCQluYXR1cmU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuanNOYXR1cmUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoLnVpLkpzUXVlcnlQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuamF2YS5zZWFyY2gudWkuSnNRdWVyeVBhcnRpY2lwYW50IiAvPgotCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBEb2N1bWVudCBwcm92aWRlciBmb3IgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuZG9jdW1lbnRQcm92aWRlcnMiPgotCQk8cHJvdmlkZXIKLQkJCWlucHV0VHlwZXM9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsuRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRGaWxlRG9jdW1lbnRQcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuRXh0ZXJuYWxGaWxlRG9jdW1lbnRQcm92aWRlciIgLz4KLQotCTwvZXh0ZW5zaW9uPgotCS0tPgotCTwhLS0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPHZpZXdlckNvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmpzcHNvdXJjZS5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIgLz4KLQotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iIC8+Ci0KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0tLT4KLQotCi08IS0tCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9yQWN0aW9ucyI+Ci0JCTxlZGl0b3JDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qc3Bzb3VyY2Uuc291cmNlLmVkaXRvckFjdGlvbnMiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5qYXZhZWRpdG9yLkNvbXBpbGF0aW9uVW5pdEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkNsZWFudXBEb2N1bWVudCIKLQkJCQlsYWJlbD0iJUNsZWFudXBEb2N1bWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCIKLQkJCQl0b29sdGlwPSIlQ2xlYW51cERvY3VtZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWkuQ2xlYW51cEFjdGlvbkhUTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iQ2xlYW51cERvY3VtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJUb2dnbGVDb21tZW50IgotCQkJCWxhYmVsPSIlVG9nZ2xlQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9nZ2xlLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJVRvZ2dsZUNvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlRvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iVG9nZ2xlQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iQWRkQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlQWRkQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGQuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlQWRkQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iQWRkQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJSZW1vdmVCbG9ja0NvbW1lbnQiCi0JCQkJbGFiZWw9IiVSZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlJlbW92ZUJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJSZW1vdmVCbG9ja0NvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlJlbmFtZUVsZW1lbnQiCi0JCQkJbGFiZWw9IiVSZW5hbWVFbGVtZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnJlZmFjdG9yLnJlbmFtZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJSZW5hbWVFbGVtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJNb3ZlRWxlbWVudCIKLQkJCQlsYWJlbD0iJU1vdmVFbGVtZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnJlZmFjdG9yLm1vdmUiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUE1vdmVFbGVtZW50QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9Ik1vdmVFbGVtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJGaW5kT2NjdXJyZW5jZXMiCi0JCQkJbGFiZWw9IiVGaW5kT2NjdXJyZW5jZXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2guSnNGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iRmluZE9jY3VycmVuY2VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0TmV4dCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiPgotCQkJPC9hY3Rpb24+Ci0JCTwvZWRpdG9yQ29udHJpYnV0aW9uPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmpzcHNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JLS0+Ci0JCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gRk9SIEpTUC9KQVZBIFJFTkFNRSBQQVJUSUNJUEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnJlbmFtZVBhcnRpY2lwYW50cyI+Ci0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJbmFtZT0iJXJlbmFtZVBhcnRpY2lwYW50Lm5hbWUuMCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BUeXBlUmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhZmZlY3RlZE5hdHVyZXMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5qc05hdHVyZSIgLz4KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklUeXBlIiAvPgotCi0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiVyZW5hbWVQYXJ0aWNpcGFudC5uYW1lLjEiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWZmZWN0ZWROYXR1cmVzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuanNOYXR1cmUiIC8+Ci0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklKYXZhV2ViTm9kZSIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQkJPHJlbmFtZVBhcnRpY2lwYW50Ci0JCQluYW1lPSIlcmVuYW1lUGFydGljaXBhbnQubmFtZS4yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhZmZlY3RlZE5hdHVyZXMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5qc05hdHVyZSIgLz4KLQotCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJPC93aXRoPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUZ1bmN0aW9uIiAvPgotCi0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiVyZW5hbWVQYXJ0aWNpcGFudC5uYW1lLjMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmpzTmF0dXJlIiAvPgotCi0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklKYXZhV2ViTm9kZSIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQotCSAgPC9leHRlbnNpb24+Ci0KLQkgIDwhLS0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSnNHbG9iYWxTY29wZVVJSW5pdGlhbGl6ZXIiPgotICAgICA8SnNHbG9iYWxTY29wZVVJSW5pdGlhbGl6ZXIKLSAgICAgCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC5sYXVuY2hpbmcuV2ViUHJvamVjdCIKLSAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVVSUluaXRpYWxpemVyIj4KLSAgICAgPC9Kc0dsb2JhbFNjb3BlVUlJbml0aWFsaXplcj4KLSAgIDwvZXh0ZW5zaW9uPgotLS0+Ci0KLSAgCSA8IS0tCi0gIAkgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAJCTxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuanNkdFNldHVwIj4KLSAgICAgICAJIDx2aXNpYmlsaXR5PgotICAgICAgICAJPG5vdD4KLQkgICAgICAgIAk8b3I+Ci0JCSAgICAgICAgICAgIDxvYmplY3RTdGF0ZSAKLQkJCSAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiIAotCQkJICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuanNOYXR1cmUiLz4KLQkJCSAgICAgICAgPG9iamVjdFN0YXRlCi0JCQkgICAgICAgIAluYW1lPSJvcGVuIgotCQkJICAgICAgICAJdmFsdWU9ImZhbHNlIi8+Ci0JICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgIDwvbm90PgotICAgICAgIAkgPC92aXNpYmlsaXR5PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5TZXR1cFByb2plY3RzV2l6emFyZCIKLSAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjIxIgotICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLnVpLnByb2plY3RDb25maWd1cmUvYWRkaXRpb25zIgotICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC53ZWIudWkuY29udmVydFByb2plY3RzIj4KLSAgICAgIAk8L2FjdGlvbj4KLSAgIAkJPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4gCi0tLT4KLQotICAJIDwhLS0gVW5jb21tZW50IGZvciBTdGFuZGFsb25lICsgSFRNTCBhcyBzZXBlcmF0ZSBvcHRpb25zIC0tPgotICAJIDwhLS0KLSAgCSA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gCQk8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmpzZHRTZXR1cCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICBsYWJlbD0iQWRkIFN1cHBvcnQgZm9yIEphdmFTY3JpcHQgaW4gSFRNTCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuU2V0dXBQcm9qZWN0c1dpenphcmQiCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkucHJvamVjdC50b29scy9ncm91cDAiCi0gICAgICAgICAgICBlbmFibGVzRm9yPSIrIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5pbnRlcm5hbC51aS5jb252ZXJ0UHJvamVjdHMiPgotICAgICAgCTwvYWN0aW9uPgotICAgCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPiAgCi0gICAtLT4KLSA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbCI+Ci0gIDxwcm9wb3NhbENhdGVnb3J5Ci0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLkNvbnRlbnRBc3Npc3RQcm9wb3NhbHMiCi0gICAgICBuYW1lPSIlamF2YVNjcmlwdFByb3Bvc2FscyIKLSAgICAgIGljb249Imljb25zL2Z1bGwvZWxjbDE2L2phdmFhc3Npc3RfY28uZ2lmIj4KLSAgPC9wcm9wb3NhbENhdGVnb3J5PgotICA8cHJvcG9zYWxDb21wdXRlcgotICAgICAgYWN0aXZhdGU9InRydWUiCi0gICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuQ29udGVudEFzc2lzdFByb3Bvc2FscyIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5KU0RUQ29udGVudEFzc2lzdGFudCIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuQ29udGVudEFzc2lzdFByb3Bvc2FscyI+Ci0gICAgIDxjb250ZW50VHlwZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0gICAgICA8cGFydGl0aW9uVHlwZQotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQiPgotICAgICAgPC9wYXJ0aXRpb25UeXBlPgotICAgICAgICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULkVWRU5USEFORExFUiI+Ci0gICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgPC9jb250ZW50VHlwZT4KLSAgICAgPGNvbnRlbnRUeXBlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiPgotICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIj4KLSAgICAgIDwvcGFydGl0aW9uVHlwZT4KLSAgICAgICAgICAgIDxwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiPgotICAgICAgPC9wYXJ0aXRpb25UeXBlPgotICAgIDwvY29udGVudFR5cGU+Ci0gIDwvcHJvcG9zYWxDb21wdXRlcj4KLTwvZXh0ZW5zaW9uPgotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jaGFyYWN0ZXJQYWlyaW5nIj4KLQk8aW5zZXJ0ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50ZXh0LkpzQ2hhcmFjdGVyUGFpckluc2VydGVyIiBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmluc2VydGVyIj4KLQkgIDxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiCi0JICAgICAgICBwYXJ0aXRpb25zPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQsIG9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiPgotCSAgPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JPC9pbnNlcnRlcj4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzY1NWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL1NldHVwUHJvamVjdHNXaXp6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL1NldHVwUHJvamVjdHNXaXp6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ODIxMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9TZXR1cFByb2plY3RzV2l6emFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklJbmNsdWRlUGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0TW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QuSnNXZWJOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlQbHVnaW47Ci0KLS8qKgotICogTm90IEFQSQotICovCi1wdWJsaWMgY2xhc3MgU2V0dXBQcm9qZWN0c1dpenphcmQgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZSB7Ci0JSVdvcmtiZW5jaFBhcnQgZlBhcnQ7Ci0JT2JqZWN0W10gZlRhcmdldDsKLQotCXByaXZhdGUgdm9pZCBkb0luc3RhbGwoSVByb2plY3QgcHJvamVjdCwgZmluYWwgYm9vbGVhbiBvcGVuUHJvcGVydGllcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWJvb2xlYW4gY29uZmlndXJlZCA9IGZhbHNlOwotCQlKc1dlYk5hdHVyZSBuYXR1cmUgPSBuZXcgSnNXZWJOYXR1cmUocHJvamVjdCwgbW9uaXRvcik7Ci0JCXRyeSB7Ci0JCQlib29sZWFuIGhhZEJhc2ljTmF0dXJlID0gSnNXZWJOYXR1cmUuaGFzTmF0dXJlKHByb2plY3QpOwotCi0JCQluYXR1cmUuY29uZmlndXJlKCk7Ci0KLQkJCWlmICghaGFkQmFzaWNOYXR1cmUpIHsKLQkJCQkvKgotCQkJCSAqIE5vIG5hdHVyZSBiZWZvcmUsIHNvIG5vIGV4aXN0aW5nIGJ1aWxkIHBhdGguIERlZmluZSB0aGUKLQkJCQkgKiBwcm9qZWN0IGl0c2VsZiBhcyBhbiBpbmNsdWRlIGZvbGRlci4KLQkJCQkgKi8KLQkJCQlJSmF2YVNjcmlwdFByb2plY3QganAgPSBKYXZhU2NyaXB0Q29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJSUluY2x1ZGVQYXRoRW50cnlbXSBvbGRFbnRyaWVzID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlvbGRFbnRyaWVzID0ganAuZ2V0UmF3SW5jbHVkZXBhdGgoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBleDEpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIG51bGwsIGV4MSk7Ci0JCQkJfQotCQkJCQotCQkJCUlQYXRoIHByb2plY3RQYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQkJCUlJbmNsdWRlUGF0aEVudHJ5IHByb2plY3RQYXRoRW50cnkgPSBKYXZhU2NyaXB0Q29yZS5uZXdTb3VyY2VFbnRyeShwcm9qZWN0UGF0aCk7Ci0JCQkJCi0JCQkJaWYgKCEgQXJyYXlzLmFzTGlzdChvbGRFbnRyaWVzKS5jb250YWlucyhwcm9qZWN0UGF0aEVudHJ5KSkgewotCQkJCQlJSW5jbHVkZVBhdGhFbnRyeVtdIG5ld0VudHJpZXMgPSBuZXcgSUluY2x1ZGVQYXRoRW50cnlbb2xkRW50cmllcy5sZW5ndGggKyAxXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShvbGRFbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBvbGRFbnRyaWVzLmxlbmd0aCk7Ci0JCQkJCQotCQkJCQluZXdFbnRyaWVzW29sZEVudHJpZXMubGVuZ3RoXSA9IHByb2plY3RQYXRoRW50cnk7Ci0JCQkJCWpwLnNldFJhd0luY2x1ZGVwYXRoKG5ld0VudHJpZXMsIG1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQkJCWNvbmZpZ3VyZWQgPSB0cnVlOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJfQotCi0JCWlmIChjb25maWd1cmVkICYmIG9wZW5Qcm9wZXJ0aWVzKSB7Ci0JCQlzaG93UHJvcGVydGllc09uKHByb2plY3QsIG1vbml0b3IpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkb1VuaW5zdGFsbChJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSnNXZWJOYXR1cmUgbmF0dXJlID0gbmV3IEpzV2ViTmF0dXJlKHByb2plY3QsIG1vbml0b3IpOwotCQl0cnkgewotCQkJbmF0dXJlLmRlY29uZmlndXJlKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGwoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgYm9vbGVhbiBvcGVuUHJvcGVydGllcykgewotCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotCQlpZiAoZlBhcnQgIT0gbnVsbCkgewotCQkJc2VydmljZSA9IChJUHJvZ3Jlc3NTZXJ2aWNlKSBmUGFydC5nZXRTaXRlKCkuZ2V0U2VydmljZShJUHJvZ3Jlc3NTZXJ2aWNlLmNsYXNzKTsKLQkJfQotCQlpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0JCQlkb0luc3RhbGwocHJvamVjdCwgb3BlblByb3BlcnRpZXMsIG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQlkb0luc3RhbGwocHJvamVjdCwgb3BlblByb3BlcnRpZXMsIG1vbml0b3IpOwotCQkJCX0KLQkJCX07Ci0JCQl0cnkgewotCQkJCXNlcnZpY2UucnVuKGZhbHNlLCBmYWxzZSwgcnVubmFibGUpOwotCQkJfQotCQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGZUYXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUYXJnZXQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmVGFyZ2V0W2ldIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9ICgoSVJlc291cmNlKSBmVGFyZ2V0W2ldKS5nZXRQcm9qZWN0KCk7Ci0KLQkJCQlpZiAoIUpzV2ViTmF0dXJlLmhhc05hdHVyZShwcm9qZWN0KSkgewotCQkJCQkvKiBEb2Vzbid0IGhhdmUgbmF0dXJlLCBkbyBhIGZ1bGwgaW5zdGFsbC4gKi8KLQkJCQkJaW5zdGFsbChwcm9qZWN0LCBpID09IGZUYXJnZXQubGVuZ3RoIC0gMSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBIYXMgbmF0dXJlLCBjaGVjayBmb3IgYnJvd3NlciBsaWJyYXJ5IG9uIGluY2x1ZGUgcGF0aAotCQkJCQkgKiBhbmQgc2V0dXAgaWYgbm90IGZvdW5kLgotCQkJCQkgKi8KLQkJCQkJSUphdmFTY3JpcHRQcm9qZWN0IGpwID0gSmF2YVNjcmlwdENvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCQlJSW5jbHVkZVBhdGhFbnRyeVtdIHJhd0NsYXNzcGF0aCA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyYXdDbGFzc3BhdGggPSBqcC5nZXRSYXdJbmNsdWRlcGF0aCgpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgxKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgbnVsbCwgZXgxKTsKLQkJCQkJfQotCi0JCQkJCWJvb2xlYW4gYnJvd3NlckZvdW5kID0gZmFsc2U7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyByYXdDbGFzc3BhdGggIT0gbnVsbCAmJiAhYnJvd3NlckZvdW5kICYmIGsgPCByYXdDbGFzc3BhdGgubGVuZ3RoOyBrKyspIHsKLQkJCQkJCWlmIChyYXdDbGFzc3BhdGhba10uZ2V0UGF0aCgpLmVxdWFscyhKc1dlYk5hdHVyZS5WSVJUVUFMX0JST1dTRVJfQ0xBU1NQQVRIKSkgewotCQkJCQkJCWJyb3dzZXJGb3VuZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFicm93c2VyRm91bmQpIHsKLQkJCQkJCWluc3RhbGwocHJvamVjdCwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWZUYXJnZXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKTsKLQkJfQotCQllbHNlIHsKLQkJCWZUYXJnZXQgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlmUGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNob3dQcm9wZXJ0aWVzT24oZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludCgib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyIpLmdldEV4dGVuc2lvbnMoKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBMaXN0IHBhZ2VJZHMgPSBuZXcgQXJyYXlMaXN0KDgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChleHRlbnNpb25zW2ldLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKS5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS53c3QuanNkdC4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlndXJhdGlvbkVsZW1lbnRzID0gZXh0ZW5zaW9uc1tpXS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ3VyYXRpb25FbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAoInBhZ2UiLmVxdWFscyhjb25maWd1cmF0aW9uRWxlbWVudHNbal0uZ2V0TmFtZSgpKSkgewotCQkJCQkJcGFnZUlkcy5hZGQoY29uZmlndXJhdGlvbkVsZW1lbnRzW2pdLmdldEF0dHJpYnV0ZSgiaWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlTaGVsbCBzaGVsbCA9IChTaGVsbCkgZlBhcnQuZ2V0QWRhcHRlcihTaGVsbC5jbGFzcyk7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyA9IEpzVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJaWYgKGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotCQkJCXNoZWxsID0gYWN0aXZlV29ya2JlbmNoV2luZG93LmdldFNoZWxsKCk7Ci0JCX0KLQkJZmluYWwgU2hlbGwgZmluYWxTaGVsbCA9IHNoZWxsOwotCQlpZiAoZmluYWxTaGVsbCAhPSBudWxsKSB7Ci0JCQlmaW5hbFNoZWxsLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJvcGVydHlEaWFsb2dPbihmaW5hbFNoZWxsLCBwcm9qZWN0LCAib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkucHJvcGVydHlQYWdlcy5CdWlsZFBhdGhzUHJvcGVydHlQYWdlIiwgKFN0cmluZ1tdKSBwYWdlSWRzLnRvQXJyYXkobmV3IFN0cmluZ1twYWdlSWRzLnNpemUoKV0pLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJCQlkb1VuaW5zdGFsbChwcm9qZWN0LCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNEVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU0RULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNTU1MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU0RULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLnRleHQuSUpzUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuY29udGVudGFzc2lzdC5KU0RUU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmF1dG9lZGl0LkF1dG9FZGl0U3RyYXRlZ3lGb3JKczsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKiAKLSAqIENvbmZpZ3VyYXRpb24gZm9yIGEgc291cmNlIHZpZXdlciB3aGljaCBzaG93cyBIdG1sIGFuZCBzdXBwb3J0cyBKU0RULgotICogPHA+Ci0gKiBDbGllbnRzIGNhbiBzdWJjbGFzcyBhbmQgb3ZlcnJpZGUganVzdCB0aG9zZSBtZXRob2RzIHdoaWNoIG11c3QgYmUgc3BlY2lmaWMKLSAqIHRvIHRoZWlyIG5lZWRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU0RUIGV4dGVuZHMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCB7Ci0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTRFQoKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCNnZXRBdXRvRWRpdFN0cmF0ZWdpZXMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlciwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUF1dG9FZGl0U3RyYXRlZ3lbXSBnZXRBdXRvRWRpdFN0cmF0ZWdpZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlpZihjb250ZW50VHlwZS5lcXVhbHMoSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgfHwgY29udGVudFR5cGUuZXF1YWxzKElIVE1MUGFydGl0aW9ucy5TQ1JJUFRfRVZFTlRIQU5ETEVSKSkgewotCQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBzdHJhdGVnaWVzID0gbmV3IElBdXRvRWRpdFN0cmF0ZWd5WzFdOwotCQkJc3RyYXRlZ2llc1swXSA9IG5ldyBBdXRvRWRpdFN0cmF0ZWd5Rm9ySnMoKTsKLQkJCXJldHVybiBzdHJhdGVnaWVzOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwjZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlciwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycygKLQkJCUlTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBwcm9jZXNzb3JzOwotCQkKLQkJaWYoaXNKYXZhc2NyaXB0UGFydGl0aW9uVHlwZShwYXJ0aXRpb25UeXBlKSkgewotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEpTRFRTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcigKLQkJCQkJdGhpcy5nZXRDb250ZW50QXNzaXN0YW50KCksIHBhcnRpdGlvblR5cGUsIHNvdXJjZVZpZXdlcik7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117cHJvY2Vzc29yfTsKLQkJfSBlbHNlIHsKLQkJCXByb2Nlc3NvcnMgPSBzdXBlci5nZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQl9IAotCQkKLQkJcmV0dXJuIHByb2Nlc3NvcnM7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlSUQgY2hlY2sgdG8gc2VlIGlmIHRoaXMgcGFydGl0aW9uIHR5cGUgSUQgaXMgZm9yIGEgSmF2YXNjcmlwdCBwYXJ0aXRpb24gdHlwZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBhcnRpdG9uIHR5cGUgaXMgYSBKYXZhc2NyaXB0IHBhcnRpdGlvbiB0eXBlLAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSmF2YXNjcmlwdFBhcnRpdGlvblR5cGUoU3RyaW5nIHBhcnRpdGlvblR5cGVJRCkgewotCQlyZXR1cm4gSUpzUGFydGl0aW9ucy5IdG1sSnNQYXJ0aXRpb24uZXF1YWxzKHBhcnRpdGlvblR5cGVJRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9XZWJQcm9qZWN0SnNHbG9iYWxTY29wZVVJSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVVSUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYWVjY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9XZWJQcm9qZWN0SnNHbG9iYWxTY29wZVVJSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5JSnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyRXh0ZW5zaW9uOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKgotICovCi1wdWJsaWMgY2xhc3MgV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVVSUluaXRpYWxpemVyIGltcGxlbWVudHMgSUpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplckV4dGVuc2lvbnsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5JSnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWx6ZXJFeHRlbnNpb24jZ2V0SW1hZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlKElQYXRoIGNvbnRhaW5lclBhdGgsIFN0cmluZyBlbGVtZW50LCBJSmF2YVNjcmlwdFByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKHRoaXMuZ2V0Q2xhc3MoKSwid2ViMS5KUEciKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9BZGRKYXZhRG9jU3R1YkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0FkZEphdmFEb2NTdHViQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MDQ0NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0FkZEphdmFEb2NTdHViQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLmFjdGlvbnMuV29ya2JlbmNoUnVubmFibGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnV0aWwuRXhjZXB0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSnNKZmFjZU5vZGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWRkSmF2YURvY1N0dWJBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0OwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlhbG9nVGl0bGUoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIkFkZEphdmFEb2NTdHViQWN0aW9uLjAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQl9Ci0JCi0JcHVibGljIElXb3JrYmVuY2hQYXJ0U2l0ZSBnZXRTaXRlKCkgewotCQlyZXR1cm4gdGFyZ2V0UGFydC5nZXRTaXRlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBlbGVtZW50cyA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA8IDEpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJSmF2YVNjcmlwdEVsZW1lbnQgcGFyZW50ID0gZWxlbWVudHNbMF0uZ2V0UGFyZW50KCk7Ci0JCS8qIGZpbmQgdGhlIGN1ICovCi0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0VW5pdCkpIHsKLQkJCQotCQl9Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJQXJyYXlMaXN0IG1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGVsZW1lbnRzW2ldIGluc3RhbmNlb2YgSU1lbWJlcikgewotCQkJCQltZW1iZXJzLmFkZChlbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJSnNKZmFjZU5vZGUgbm9kZVtdID0gU2ltcGxlSlNEVEFjdGlvblByb3h5LmdldEpzSmZhY2VOb2Rlc0Zyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCS8qIG9ubHkgc2hvdWxkIGJlIG9uZSBub2RlICovCi0JCQlydW4oKElKYXZhU2NyaXB0VW5pdCkgcGFyZW50LCAoSU1lbWJlcltdKSBtZW1iZXJzLnRvQXJyYXkobmV3IElNZW1iZXJbbWVtYmVycy5zaXplKCldKSwgbm9kZVswXSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKElKYXZhU2NyaXB0VW5pdCBjdSwgSU1lbWJlcltdIG1lbWJlcnMsIEpzSmZhY2VOb2RlIG5vZGUpIHsKLQkJdHJ5IHsKLQkJCUFkZEphdmFEb2NTdHViT3BlcmF0aW9uIG9wID0gbmV3IEFkZEphdmFEb2NTdHViT3BlcmF0aW9uKG1lbWJlcnMsIG5vZGUpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW5JblVJKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCksIG5ldyBXb3JrYmVuY2hSdW5uYWJsZUFkYXB0ZXIob3AsIG9wLmdldFNjaGVkdWxlUnVsZSgpKSwgb3AuZ2V0U2NoZWR1bGVSdWxlKCkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCUV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlKGUsIGdldFNoZWxsKCksIGdldERpYWxvZ1RpdGxlKCksIE1lc3NhZ2VzLmdldFN0cmluZygiQWRkSmF2YURvY1N0dWJBY3Rpb24uMSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvcGVyYXRpb24gY2FuY2VsZWQKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9BZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0FkZEphdmFEb2NTdHViT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZGU2MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0FkZEphdmFEb2NTdHViT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0VW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Eb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkpzSmZhY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWRkSmF2YURvY1N0dWJPcGVyYXRpb24gZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JleHQuY29kZW1hbmlwdWxhdGlvbi5BZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbiB7Ci0JcHJpdmF0ZSBJRG9jdW1lbnQgY29weTsKLQkvKioKLQkgKiBAcGFyYW0gbWVtYmVycwotCSAqLwotCXByaXZhdGUgSnNKZmFjZU5vZGUgbm9kZTsKLQlwcml2YXRlIERvY3VtZW50Q2hhbmdlTGlzdGVuZXJUb1RleHRFZGl0IHRleHRFZGl0TGlzdGVuZXI7Ci0JCi0JcHVibGljIEFkZEphdmFEb2NTdHViT3BlcmF0aW9uKElNZW1iZXJbXSBtZW1iZXJzLCBKc0pmYWNlTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG1lbWJlcnMpOwotCQl0aGlzLm5vZGUgPSBub2RlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhcHBseUNoYW5nZXMoKSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJdHJ5IHsKLQkJCU11bHRpVGV4dEVkaXQgZWRpdHMgPSB0ZXh0RWRpdExpc3RlbmVyLmdldFRleHRFZGl0cygpOwotCQkJbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jKTsKLQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgTWVzc2FnZXMuZ2V0U3RyaW5nKCJBZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbi4wIiksIE1lc3NhZ2VzLmdldFN0cmluZygiQWRkSmF2YURvY1N0dWJPcGVyYXRpb24uMSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQllZGl0cy5hcHBseShkb2MpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JleHQuY29kZW1hbmlwdWxhdGlvbi5BZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbiNnZXREb2N1bWVudChvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0VW5pdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCQotCXByb3RlY3RlZCBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSUphdmFTY3JpcHRVbml0IGN1LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEphdmFEb2N1bWVudEZyb21Ob2RlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJRG9jdW1lbnQgZ2V0SmF2YURvY3VtZW50RnJvbU5vZGUoKSB7Ci0JCWlmIChjb3B5ID09IG51bGwpIHsKLQkJCUlKc1RyYW5zbGF0aW9uIHRyYW4gPSBub2RlLmdldFRyYW5zbGF0aW9uKCk7Ci0JCQljb3B5ID0gbmV3IERvY3VtZW50KHRyYW4uZ2V0SnNUZXh0KCkpOwotCQkJdGV4dEVkaXRMaXN0ZW5lciA9IG5ldyBEb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdCgpOwotCQkJY29weS5hZGREb2N1bWVudExpc3RlbmVyKHRleHRFZGl0TGlzdGVuZXIpOwotCQl9Ci0JCXJldHVybiBjb3B5OwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlzdXBlci5ydW4obW9uaXRvcik7Ci0JCWFwcGx5Q2hhbmdlcygpOwotCQkvKiBuZWVkIHRvIGFwcGx5IHRoZSB0ZXh0IGVkaXRzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGRvYyAqLwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTRjNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRmluZFJlZmVyZW5jZXNBY3Rpb24gZXh0ZW5kcyBKc0VsZW1lbnRBY3Rpb25Qcm94eSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5Kc0VsZW1lbnRBY3Rpb25Qcm94eSNnZXRSdW5BcmdzKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRSdW5BcmdzKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGVsZW1lbnRzWzBdIH07Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuSnNFbGVtZW50QWN0aW9uUHJveHkjZ2V0UnVuQXJnVHlwZXMoKQotCSAqLwotCQotCXB1YmxpYyBDbGFzc1tdIGdldFJ1bkFyZ1R5cGVzKCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10geyBJSmF2YVNjcmlwdEVsZW1lbnQuY2xhc3MgfTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4ZjQyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24gZXh0ZW5kcyBGaW5kUmVmZXJlbmNlc0FjdGlvbiB7Ci0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3QgaGFuZGxlciA9IGdldEFjdGlvbkhhbmRsZXIoYWN0aW9uKTsKLQkJCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQkJCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU2ltcGxlSlNEVEFjdGlvblByb3h5LmV4ZWN1dGVNZXRob2QoaGFuZGxlciwgInJ1biIsIG5ldyBDbGFzc1tdIHsgSUphdmFTY3JpcHRFbGVtZW50LmNsYXNzIH0sIG5ldyBPYmplY3RbXSB7IGVsZW1lbnRzWzBdIH0pOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBJZiB1c2VyIGRvZXNuJ3Qgc2VsZWN0IGEgd29ya2luZyBzZXQgYW4gZXhjZXB0aW9uIGlzIHRocm93biBzbyB3ZQotCQkJLy8gd29udCBwcmludCBzdGFjayB0cmFjZSBoZXJlCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvSnNFbGVtZW50QWN0aW9uUHJveHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9Kc0VsZW1lbnRBY3Rpb25Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDc3MWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9Kc0VsZW1lbnRBY3Rpb25Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklKYXZhV2ViTm9kZTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEpzRWxlbWVudEFjdGlvblByb3h5IGV4dGVuZHMgU2ltcGxlSlNEVEFjdGlvblByb3h5IHsKLQkvKiBVdGlsIG1ldGhvZCB0byBnZXQgYWxsIHRoZSBqYXZhIGVsZW1lbnRzIGluIGEgc2VsZWN0aW9uICovCi0JcHVibGljIHN0YXRpYyBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgSUphdmFTY3JpcHRFbGVtZW50WzBdOwotCQl9Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJdGVyYXRvciBpdHQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXR0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXR0Lm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFXZWJOb2RlKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZCgoKElKYXZhV2ViTm9kZSkgZWxlbWVudCkuZ2V0SmF2YUVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChJSmF2YVNjcmlwdEVsZW1lbnRbXSkgZWxlbWVudHMudG9BcnJheShuZXcgSUphdmFTY3JpcHRFbGVtZW50W2VsZW1lbnRzLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBuZXcgSUphdmFTY3JpcHRFbGVtZW50WzBdOwotCX0KLQkKLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0UnVuQXJncyhJQWN0aW9uIGFjdGlvbikgewotCQkvKgotCQkgKiBOZWVkcyB0byByZXR1cm4gYW4gYXJyYXkgb2YgSUphdmFFbGVtZW50cy4gU2luY2UgaXRzIG9uZSBhcmcgb2YgdHlwZQotCQkgKiBJSmF2YVNjcmlwdEVsZW1lbnRbXSBuZWVkIHRvIHB1dCBpbnRvIGFuIG9iamVjdCBhcnJheQotCQkgKi8KLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKGdldEN1cnJlbnRTZWxlY3Rpb24oKSkgfTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5TaW1wbGVKU0RUQWN0aW9uUHJveHkjZ2V0UnVuQXJnVHlwZXMoKQotCSAqLwotCQotCXB1YmxpYyBDbGFzc1tdIGdldFJ1bkFyZ1R5cGVzKCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10geyAobmV3IElKYXZhU2NyaXB0RWxlbWVudFswXSkuZ2V0Q2xhc3MoKSB9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZmExN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL09wZW5DYWxsSGllcmFyY2h5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvT3BlbkNhbGxIaWVyYXJjaHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwODNhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvT3BlbkNhbGxIaWVyYXJjaHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQ2FsbEhpZXJhcmNoeUFjdGlvbiBleHRlbmRzIEpzRWxlbWVudEFjdGlvblByb3h5IHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlNpbXBsZUpTRFRBY3Rpb25Qcm94eSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIGVsZW1lbnRzID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJLyogT3BlbiBjYWxsIGhpZXJhcmNoeSBuZWVkcyB0byBiZSBkaXNhYmxlZCBmb3IgVFlQRXMgKi8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsZW1lbnRzW2ldLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEUpIHsKLQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQoYWN0aW9uLCBzZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9PcGVuVHlwZUhpZXJhcmNoeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL09wZW5UeXBlSGllcmFyY2h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNWE0YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL09wZW5UeXBlSGllcmFyY2h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5UeXBlSGllcmFyY2h5IGV4dGVuZHMgSnNFbGVtZW50QWN0aW9uUHJveHkgewotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIGVsZW1lbnRzID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJLyogT3BlbiBjYWxsIGhpZXJhcmNoeSBuZWVkcyB0byBiZSBkaXNhYmxlZCBmb3IgVFlQRXMgKi8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsZW1lbnRzW2ldLmdldEVsZW1lbnRUeXBlKCkgIT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEUpIHsKLQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQoYWN0aW9uLCBzZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9TaG93SGlzdG9yeUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dIaXN0b3J5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OGMwMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dIaXN0b3J5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTZXRTZWxlY3Rpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkudXRpbC5FeGNlcHRpb25IYW5kbGVyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNob3dIaXN0b3J5QWN0aW9uIGV4dGVuZHMgSnNFbGVtZW50QWN0aW9uUHJveHkgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRIb3N0UmVzb3VyY2UoSUphdmFTY3JpcHRFbGVtZW50IHZpcnR1YWxFbGVtZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB2aXJ0dWFsRWxlbWVudC5nZXRKYXZhU2NyaXB0UHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHZpcnR1YWxFbGVtZW50LmdldEhvc3RQYXRoKCkuZ2V0UGF0aCgpKTsKLQkJSVJlc291cmNlIGhvc3QgPSBwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOwotCQlyZXR1cm4gaG9zdDsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAoZWxlbWVudHNbMF0uaXNWaXJ0dWFsKCkpIHsKLQkJCXJlc291cmNlID0gZ2V0SG9zdFJlc291cmNlKGVsZW1lbnRzWzBdKTsKLQkJfSBlbHNlIHsKLQkJCXJlc291cmNlID0gZWxlbWVudHNbMF0uZ2V0UmVzb3VyY2UoKTsKLQkJfQotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gdGFyZ2V0V29ya2JlbmNoUGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQkJSVZpZXdQYXJ0IHZpZXcgPSBwYWdlLnNob3dWaWV3KElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihyZXNvdXJjZSk7Ci0JCQkJKChJU2V0U2VsZWN0aW9uVGFyZ2V0KSB2aWV3KS5zZWxlY3RSZXZlYWwoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJRXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoZSwgdGFyZ2V0V29ya2JlbmNoUGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaG93SGlzdG9yeUFjdGlvbi4wIiksIE1lc3NhZ2VzLmdldFN0cmluZygiU2hvd0hpc3RvcnlBY3Rpb24uMSIpICsgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudHNbXSA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKGdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXS5pc1ZpcnR1YWwoKSkgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldEhvc3RSZXNvdXJjZShlbGVtZW50c1tpXSk7Ci0JCQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgIXJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU2hvd0luTmF2aWdhdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU2hvd0luTmF2aWdhdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOGI5NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dJbk5hdmlnYXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnV0aWwuRXhjZXB0aW9uSGFuZGxlcjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93SW5OYXZpZ2F0b3JBY3Rpb24gZXh0ZW5kcyBKc0VsZW1lbnRBY3Rpb25Qcm94eSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldEhvc3RSZXNvdXJjZShJSmF2YVNjcmlwdEVsZW1lbnQgdmlydHVhbEVsZW1lbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHZpcnR1YWxFbGVtZW50LmdldEphdmFTY3JpcHRQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodmlydHVhbEVsZW1lbnQuZ2V0SG9zdFBhdGgoKS5nZXRQYXRoKCkpOwotCQlJUmVzb3VyY2UgaG9zdCA9IHByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGF0aCk7Ci0JCXJldHVybiBob3N0OwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzW10gPSBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihnZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50c1swXS5pc1ZpcnR1YWwoKSkgewotCQkJcmVzb3VyY2UgPSBnZXRIb3N0UmVzb3VyY2UoZWxlbWVudHNbMF0pOwotCQl9IGVsc2UgewotCQkJcmVzb3VyY2UgPSBlbGVtZW50c1swXS5nZXRSZXNvdXJjZSgpOwotCQl9Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB0YXJnZXRXb3JrYmVuY2hQYXJ0LmdldFNpdGUoKS5nZXRQYWdlKCk7Ci0JCQlJVmlld1BhcnQgdmlldyA9IHBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfUkVTX05BVik7Ci0JCQlpZiAodmlldyBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJlc291cmNlKTsKLQkJCQkoKElTZXRTZWxlY3Rpb25UYXJnZXQpIHZpZXcpLnNlbGVjdFJldmVhbChzZWxlY3Rpb24pOwotCQkJfQotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlFeGNlcHRpb25IYW5kbGVyLmhhbmRsZShlLCB0YXJnZXRXb3JrYmVuY2hQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlNob3dJbk5hdmlnYXRvckFjdGlvbi4wIiksIE1lc3NhZ2VzLmdldFN0cmluZygiU2hvd0luTmF2aWdhdG9yQWN0aW9uLjEiKSArIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzW10gPSBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihnZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWxlbWVudHNbaV0uaXNWaXJ0dWFsKCkpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRIb3N0UmVzb3VyY2UoZWxlbWVudHNbaV0pOwotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8ICFyZXNvdXJjZS5leGlzdHMoKSkgewotCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dJblNjcmlwdEV4cGxvcmVyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU2hvd0luU2NyaXB0RXhwbG9yZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5ZWExZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU2hvd0luU2NyaXB0RXhwbG9yZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5wYWNrYWdldmlldy5QYWNrYWdlRXhwbG9yZXJQYXJ0OwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2hvd0luU2NyaXB0RXhwbG9yZXJBY3Rpb24gZXh0ZW5kcyBKc0VsZW1lbnRBY3Rpb25Qcm94eSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldEhvc3RSZXNvdXJjZShJSmF2YVNjcmlwdEVsZW1lbnQgdmlydHVhbEVsZW1lbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHZpcnR1YWxFbGVtZW50LmdldEphdmFTY3JpcHRQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodmlydHVhbEVsZW1lbnQuZ2V0SG9zdFBhdGgoKS5nZXRQYXRoKCkpOwotCQlJUmVzb3VyY2UgaG9zdCA9IHByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGF0aCk7Ci0JCXJldHVybiBob3N0OwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkpzRWxlbWVudEFjdGlvblByb3h5I2dldFJ1bkFyZ3Mob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JCi0JcHVibGljIE9iamVjdFtdIGdldFJ1bkFyZ3MoSUFjdGlvbiBhY3Rpb24pIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzW10gPSBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihnZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgZWxlbWVudHNbMF0gfTsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5Kc0VsZW1lbnRBY3Rpb25Qcm94eSNnZXRSdW5BcmdUeXBlcygpCi0JICovCi0JCi0JcHVibGljIENsYXNzW10gZ2V0UnVuQXJnVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXSB7IElKYXZhU2NyaXB0RWxlbWVudC5jbGFzcyB9OwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzW10gPSBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihnZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50c1swXS5pc1ZpcnR1YWwoKSkgewotCQkJcmVzb3VyY2UgPSBnZXRIb3N0UmVzb3VyY2UoZWxlbWVudHNbMF0pOwotCQl9IGVsc2UgewotCQkJcmVzb3VyY2UgPSBlbGVtZW50c1swXS5nZXRSZXNvdXJjZSgpOwotCQl9Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCVBhY2thZ2VFeHBsb3JlclBhcnQgdmlldyA9IFBhY2thZ2VFeHBsb3JlclBhcnQub3BlbkluQWN0aXZlUGVyc3BlY3RpdmUoKTsKLQkJCXZpZXcudHJ5VG9SZXZlYWwocmVzb3VyY2UpOwotLy8gSVdvcmtiZW5jaFBhZ2UgcGFnZT0gdGFyZ2V0V29ya2JlbmNoUGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotLy8gSVZpZXdQYXJ0IHZpZXc9IHBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfUkVTX05BVik7Ci0JCQlpZiAodmlldyBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJlc291cmNlKTsKLQkJCQkoKElTZXRTZWxlY3Rpb25UYXJnZXQpIHZpZXcpLnNlbGVjdFJldmVhbChzZWxlY3Rpb24pOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gRXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoZSwKLQkJCS8vIHRhcmdldFdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCksICJFcnJvciBPcGVuaW5nIGluCi0JCQkvLyBTY3JpcHQgVmlldyIsICJFcnJvciB3aGlsZSBkaXNwbGF5aW5nIGVsZW1lbnQgaW4gU2NyaXB0IFZpZXc6XG4iCi0JCQkvLyArIGUpOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudHNbXSA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKGdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXS5pc1ZpcnR1YWwoKSkgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldEhvc3RSZXNvdXJjZShlbGVtZW50c1tpXSk7Ci0JCQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgIXJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU2ltcGxlSlNEVEFjdGlvblByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU2ltcGxlSlNEVEFjdGlvblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMjRiNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1NpbXBsZUpTRFRBY3Rpb25Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSnNKZmFjZU5vZGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVKU0RUQWN0aW9uUHJveHkgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoT2JqZWN0IGhhbmRsZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIHBhcmFtYXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWF0ZXJWYWx1ZXMpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwKLQkJCU5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJQ2xhc3MgdGFyZ2V0ID0gaGFuZGxlci5nZXRDbGFzcygpOwotCQlNZXRob2QgbSA9IHRhcmdldC5nZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1hdGVyVHlwZXMpOwotCQlyZXR1cm4gbS5pbnZva2UoaGFuZGxlciwgcGFyYW1hdGVyVmFsdWVzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKc0pmYWNlTm9kZVtdIGdldEpzSmZhY2VOb2Rlc0Zyb21TZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IEpzSmZhY2VOb2RlWzBdOwotCQl9Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJdGVyYXRvciBpdHQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXR0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXR0Lm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEpzSmZhY2VOb2RlKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKEpzSmZhY2VOb2RlW10pIGVsZW1lbnRzLnRvQXJyYXkobmV3IEpzSmZhY2VOb2RlW2VsZW1lbnRzLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBuZXcgSnNKZmFjZU5vZGVbMF07Ci0JfQotCXByb3RlY3RlZCBPYmplY3QgYWN0aW9uSGFuZGxlclRhcmdldDsKLQlwcml2YXRlIElTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgSUFjdGlvbiBoYW5kbGVyVGFyZ2V0QWN0aW9uOwotCXByb3RlY3RlZCBJV29ya2JlbmNoUGFydCB0YXJnZXRXb3JrYmVuY2hQYXJ0OwotCQotCXB1YmxpYyBTaW1wbGVKU0RUQWN0aW9uUHJveHkoKSB7fQotCQotCS8qCi0JICogTW9zdCBoYW5kbGVycyBsb29rIGZvciBXb3JrQmVuY2hTaXRlLCBzbyB3ZSBjb252ZXJ0IHRoZSBXb3JrQmVuY2hQYXJ0IHRvCi0JICogV29ya0JlbmNoU2l0ZSBmb3IgaW5pdAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0QWN0aW9uSGFuZGxlcihJQWN0aW9uIGFjdGlvbikgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAotCQkJSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCS8qIFRhcmdldCBjbGFzcyBpcyBjYWNoZWQgKi8KLQkJaWYgKGhhbmRsZXJUYXJnZXRBY3Rpb24gPT0gYWN0aW9uICYmIGFjdGlvbkhhbmRsZXJUYXJnZXQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFjdGlvbkhhbmRsZXJUYXJnZXQ7Ci0JCX0KLQkJQ2xhc3MgdGFyZ2V0ID0gbnVsbDsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldEFjdGlvbkhhbmRsZXJDbGFzc05hbWUoYWN0aW9uKTsKLQkJdHJ5IHsKLQkJCXRhcmdldCA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvci4uIENsYXNzIHRhcmdldCBvZiBhY3Rpb24gaGFuZGxlciBub3QgZm91bmQ6ICIgKyBhY3Rpb24pOwotCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmdldFN0cmluZygiU2ltcGxlSlNEVEFjdGlvblByb3h5LjAiKSArIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIHVzZSB0aGUgbG9hZGVkIGNsYXNzCi0JCUNsYXNzW10gdHlwZXMgPSBuZXcgQ2xhc3NbXSB7IElXb3JrYmVuY2hTaXRlLmNsYXNzIH07Ci0JCUNvbnN0cnVjdG9yIGNvbnMgPSB0YXJnZXQuZ2V0Q29uc3RydWN0b3IodHlwZXMpOwotCQlPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFtdIHsgdGFyZ2V0V29ya2JlbmNoUGFydC5nZXRTaXRlKCkgfTsKLQkJCi0JCWFjdGlvbkhhbmRsZXJUYXJnZXQgPSBjb25zLm5ld0luc3RhbmNlKGFyZ3MpOwotCQloYW5kbGVyVGFyZ2V0QWN0aW9uID0gYWN0aW9uOwotCQlyZXR1cm4gYWN0aW9uSGFuZGxlclRhcmdldDsKLQl9Ci0JCi0JLyoKLQkgKiBEZWZhdWx0IHdheSBvZiBkZXRlcm1pbmluZyB0aGUgYWN0aW9uIGhhbmRsZXJzIGNsYXNzIG5hbWUuLiBtYXkgYmUKLQkgKiBzdWJjbGFzc2VkL292ZXJyaWRkZW4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFjdGlvbkhhbmRsZXJDbGFzc05hbWUoSUFjdGlvbiBhY3Rpb24pIHsKLQkJcmV0dXJuIGFjdGlvbi5nZXRJZCgpOwotCX0KLQkKLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldFJ1bkFyZ3MoSUFjdGlvbiBhY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGdldEN1cnJlbnRTZWxlY3Rpb24oKSB9OwotCX0KLQkKLQlwdWJsaWMgQ2xhc3NbXSBnZXRSdW5BcmdUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHsgSVN0cnVjdHVyZWRTZWxlY3Rpb24uY2xhc3MgfTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldFNlbGVjdGlvbkNoYW5nZUFyZ3MoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10geyBnZXRDdXJyZW50U2VsZWN0aW9uKCkgfTsKLQl9Ci0JCi0JcHVibGljIENsYXNzW10gZ2V0U2VsZWN0aW9uQ2hhbmdlQXJnVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXSB7IElTdHJ1Y3R1cmVkU2VsZWN0aW9uLmNsYXNzIH07Ci0JfQotCQotCS8qCi0JICogR2VuZXJpYyByZWZsZWN0aW9uIHV0aWwgbWV0aG9kIHRvIGV4ZWN1dGUgYSBuYW1lZCBtZXRob2Qgd2l0aCB1bmtub3duCi0JICogcGFyYW1hdGVycyBvbiBhbiBvYmplY3QKLQkgKi8KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3QgaGFuZGxlciA9IGdldEFjdGlvbkhhbmRsZXIoYWN0aW9uKTsKLQkJCVNpbXBsZUpTRFRBY3Rpb25Qcm94eS5leGVjdXRlTWV0aG9kKGhhbmRsZXIsICJydW4iLCBnZXRSdW5BcmdUeXBlcygpLCBnZXRSdW5BcmdzKGFjdGlvbikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQljdXJyZW50U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlpZih0YXJnZXRXb3JrYmVuY2hQYXJ0PT1udWxsKSByZXR1cm47Ci0JCQotCQl0cnkgewotCQkJT2JqZWN0IGhhbmRsZXIgPSBnZXRBY3Rpb25IYW5kbGVyKGFjdGlvbik7Ci0JCQlTaW1wbGVKU0RUQWN0aW9uUHJveHkuZXhlY3V0ZU1ldGhvZChoYW5kbGVyLCAic2VsZWN0aW9uQ2hhbmdlZCIsIGdldFNlbGVjdGlvbkNoYW5nZUFyZ1R5cGVzKCksIGdldFNlbGVjdGlvbkNoYW5nZUFyZ3MoYWN0aW9uLCBzZWxlY3Rpb24pKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRXb3JrYmVuY2hQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU291cmNlQWN0aW9uc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1NvdXJjZUFjdGlvbnNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4MTVlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU291cmNlQWN0aW9uc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VBY3Rpb25zQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCi0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NzdlZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1N0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSUphdmFXZWJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5Kc0pmYWNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEFQUEVORF9ORVdfTElORVNfVE9fQ09QWSA9IHRydWU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuY29weSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDVVQgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmN1dCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmRlbGV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE5FV19MSU5FID0gJ1xuJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNURV9BRlRFUiA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkucGFzdGUuYWZ0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTVEVfQkVGT1JFID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5wYXN0ZS5iZWZvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvcHkoSUFjdGlvbiBhY3Rpb24pIHsKLQkJSnNKZmFjZU5vZGVbXSBub2RlcyA9IHBhcnNlU2VsZWN0aW9uKCk7Ci0JCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG51bGw7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLkFQUEVORF9ORVdfTElORVNfVE9fQ09QWSkgewotCQkJdGV4dC5hcHBlbmQoU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLk5FV19MSU5FKTsKLQkJfQotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotCQkJCUpzSmZhY2VOb2RlIGN1cnJlbnROb2RlID0gbm9kZXNbaV07Ci0JCQkJaW50IHN0YXJ0ID0gY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgbGVuZ3RoID0gY3VycmVudE5vZGUuZ2V0TGVuZ3RoKCk7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBjdXJyZW50Tm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgZWxlbWVudFRleHQgPSBkb2MuZ2V0KHN0YXJ0LCBsZW5ndGgpOwotCQkJCQl0ZXh0LmFwcGVuZChlbGVtZW50VGV4dCk7Ci0JCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJaWYgKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5BUFBFTkRfTkVXX0xJTkVTX1RPX0NPUFkpIHsKLQkJCQkJdGV4dC5hcHBlbmQoU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLk5FV19MSU5FKTsKLQkJCQl9Ci0JCQkJY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBPYmplY3RbXSB7IHRleHQudG9TdHJpbmcoKSB9LCBuZXcgVHJhbnNmZXJbXSB7IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNsaXBib2FyZCAhPSBudWxsKSB7Ci0JCQkJY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVsZXRlKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUpzSmZhY2VOb2RlW10gbm9kZXMgPSBwYXJzZVNlbGVjdGlvbigpOwotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgbGFzdERvYyA9IG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnQgc3RhcnQ7Ci0JCQlpbnQgbGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotCQkJCUpzSmZhY2VOb2RlIGN1cnJlbnROb2RlID0gbm9kZXNbaV07Ci0JCQkJc3RhcnQgPSBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWxlbmd0aCA9IGN1cnJlbnROb2RlLmdldExlbmd0aCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gY3VycmVudE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJaWYgKGRvYyAhPSBsYXN0RG9jKSB7Ci0JCQkJCWxhc3REb2MgPSBkb2M7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcoYWN0aW9uKTsKLQkJCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKG1vZGVsTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCQltb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2MpOwotCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQkJCQltb2RlbC5iZWdpblJlY29yZGluZyhhY3Rpb24sICJEZWxldGUgSmF2YVNjcmlwdCBFbGVtZW50IiwgIkRlbGV0ZSBKYXZhU2NyaXB0IEVsZW1lbnQiKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlkb2MucmVwbGFjZVRleHQoYWN0aW9uLCBzdGFydCwgbGVuZ3RoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW1vZGVsLmVuZFJlY29yZGluZyhhY3Rpb24pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmdldFN0cmluZygiU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjgiKSArIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgSnNKZmFjZU5vZGVbXSBwYXJzZVNlbGVjdGlvbigpIHsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IEpzSmZhY2VOb2RlWzBdOwotCQl9Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJdGVyYXRvciBpdHQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXR0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXR0Lm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFXZWJOb2RlKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKEpzSmZhY2VOb2RlW10pIGVsZW1lbnRzLnRvQXJyYXkobmV3IEpzSmZhY2VOb2RlW2VsZW1lbnRzLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBuZXcgSnNKZmFjZU5vZGVbMF07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwYXN0ZShJQWN0aW9uIGFjdGlvbiwgYm9vbGVhbiBhdEVuZCkgewotCQlKc0pmYWNlTm9kZVtdIG5vZGVzID0gcGFyc2VTZWxlY3Rpb24oKTsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgc3RhcnRPZlBhc3RlID0gLTE7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJLyogRmlndXJlIG91dCB3aGVyZSB0byBwYXN0ZSB0aGUgY29udGVudCAqLwotCQlpZiAoYXRFbmQpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoKG5vZGVzW2ldLmdldFN0YXJ0T2Zmc2V0KCkgKyBub2Rlc1tpXS5nZXRMZW5ndGgoKSkgPiBzdGFydE9mUGFzdGUpIHsKLQkJCQkJc3RhcnRPZlBhc3RlID0gKG5vZGVzW2ldLmdldFN0YXJ0T2Zmc2V0KCkgKyBub2Rlc1tpXS5nZXRMZW5ndGgoKSk7Ci0JCQkJCWRvYyA9IG5vZGVzW2ldLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoKG5vZGVzW2ldLmdldFN0YXJ0T2Zmc2V0KCkgPCBzdGFydE9mUGFzdGUgfHwgc3RhcnRPZlBhc3RlIDwgMCkpIHsKLQkJCQkJc3RhcnRPZlBhc3RlID0gbm9kZXNbaV0uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJZG9jID0gbm9kZXNbaV0uZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCQlTdHJpbmcgcGFzdGVTdHJpbmcgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jKTsKLQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcoYWN0aW9uLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi45IikgKyAoYXRFbmQgPyBNZXNzYWdlcy5nZXRTdHJpbmcoIlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xMCIpIDogTWVzc2FnZXMuZ2V0U3RyaW5nKCJTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTEiKSkgKyBNZXNzYWdlcy5nZXRTdHJpbmcoIlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xMiIpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xMyIpICsgKGF0RW5kID8gTWVzc2FnZXMuZ2V0U3RyaW5nKCJTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTQiKSA6IE1lc3NhZ2VzLmdldFN0cmluZygiU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjE1IikpICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJZG9jLnJlcGxhY2VUZXh0KGFjdGlvbiwgc3RhcnRPZlBhc3RlLCAwLCBwYXN0ZVN0cmluZyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoY2xpcGJvYXJkICE9IG51bGwpIHsKLQkJCQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCQkJfQotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5lbmRSZWNvcmRpbmcoYWN0aW9uKTsKLQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24uZ2V0SWQoKS5lcXVhbHMoU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLkNVVCkpIHsKLQkJCWNvcHkoYWN0aW9uKTsKLQkJCWRlbGV0ZShhY3Rpb24pOwotCQl9IGVsc2UgaWYgKGFjdGlvbi5nZXRJZCgpLmVxdWFscyhTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uQ09QWSkpIHsKLQkJCWNvcHkoYWN0aW9uKTsKLQkJfSBlbHNlIGlmIChhY3Rpb24uZ2V0SWQoKS5lcXVhbHMoU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLlBBU1RFX0JFRk9SRSkpIHsKLQkJCXBhc3RlKGFjdGlvbiwgZmFsc2UpOwotCQl9IGVsc2UgaWYgKGFjdGlvbi5nZXRJZCgpLmVxdWFscyhTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uUEFTVEVfQUZURVIpKSB7Ci0JCQlwYXN0ZShhY3Rpb24sIHRydWUpOwotCQl9IGVsc2UgaWYgKGFjdGlvbi5nZXRJZCgpLmVxdWFscyhTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uREVMRVRFKSkgewotCQkJZGVsZXRlKGFjdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHt9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODliNzYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi44PUVycm9yIGluIFN0YW5kYXJkIEVkaXRvciBBY3Rpb24gOiAKLVN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi45PUluc2VydCBUZXh0IAotU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjEwPWJlZm9yZQotU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjExPWFmdGVyCi1TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTI9XCBhIEphdmFTY3JpcHQgRWxlbWVudC4KLVN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xMz1JbnNlcnQgVGV4dCAKLVN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xND1iZWZvcmUKLVN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xNT1hZnRlcgotU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjE2PVwgYSBKYXZhU2NyaXB0IEVsZW1lbnQuCi1TaW1wbGVKU0RUQWN0aW9uUHJveHkuMD1FeGNlcHRpb24gOiAKLVNob3dIaXN0b3J5QWN0aW9uLjA9RXJyb3IgT3BlbmluZyBpbiBTY3JpcHQgVmlldwotU2hvd0hpc3RvcnlBY3Rpb24uMT1FcnJvciB3aGlsZSBkaXNwbGF5aW5nIGVsZW1lbnQgaW4gU2NyaXB0IFZpZXc6XG4KLVNob3dJbk5hdmlnYXRvckFjdGlvbi4wPUVycm9yIE9wZW5pbmcgaW4gU2NyaXB0IFZpZXcKLVNob3dJbk5hdmlnYXRvckFjdGlvbi4xPUVycm9yIHdoaWxlIGRpc3BsYXlpbmcgZWxlbWVudCBpbiBTY3JpcHQgVmlldzpcbgotQWRkSmF2YURvY1N0dWJBY3Rpb24uMD1KYXZhU2NyaXB0IERvYwotQWRkSmF2YURvY1N0dWJBY3Rpb24uMT1FcnJvciB3aGlsZSBhZGRpbmcgY29tbWVudAotQWRkSmF2YURvY1N0dWJPcGVyYXRpb24uMD1HZW5lcmF0ZSBKc0RvYwotQWRkSmF2YURvY1N0dWJPcGVyYXRpb24uMT1HZW5lcmF0ZSBKc0RvYwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9jb250ZW50YXNzaXN0L0pTRFRTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9jb250ZW50YXNzaXN0L0pTRFRTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjhhNzRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvY29udGVudGFzc2lzdC9KU0RUU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0KLS8qKgotICogPHA+Q29udGVudCBhc3Npc3QgcHJvY2Vzc29yIGZvciBKYXZhc2NyaXB0IHJlZ2lvbnMgc28gdGhhdCBhdXRvYWN0aXZhdGlvbiB3aWxsIHdvcmsgaW4gdGhvc2UgcmVnaW9ucy48L3A+Ci0gKiAKLSAqIDxwPjxiPk5PVEU6PC9iPiBUaGlzIGNsYXNzIGRvZXMgbm90IGNoZWNrIHRoYXQgdGhlIGdpdmVuIHBhcnRpdGlvbiB0eXBlIGlzIGEgamF2YXNjcmlwdCByZWdpb24sIGl0IGp1c3QKLSAqIGFzc3VtZXMgaXQgaXMsIHNvIHRoZSBpbnN0YW50aWF0b3Igb2YgdGhpcyBjbGFzcyBtdXN0IGJlIHN1cmUgdGhleSB3YW50IHRoZSBnaXZlbiBwYXJ0aXRpb24gdHlwZSB0byBiZQotICogdHJlYXRlZCBhcyBpZiBpdCB3YXMgSmF2YXNjcmlwdC48L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU0RUU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0JLyoqIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzICovCi0JcHJpdmF0ZSBjaGFyW10gZkNvbXBsZXRpb25Qcm9wb2FzbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyczsKLQotCS8qKgotCSAqIEBwYXJhbSBhc3Npc3RhbnQge0BsaW5rIENvbnRlbnRBc3Npc3RhbnR9IHRvIHVzZQotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlSUQgdGhlIEphdmFzY3JpcHQgcGFydGl0aW9uIHR5cGUgdGhpcyBwcm9jZXNzb3IgaXMgZm9yCi0JICogQHBhcmFtIHZpZXdlciB7QGxpbmsgSVRleHRWaWV3ZXJ9IHRoaXMgcHJvY2Vzc29yIGlzIGFjdGluZyBpbgotCSAqLwotCXB1YmxpYyBKU0RUU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQsCi0JCQlTdHJpbmcgcGFydGl0aW9uVHlwZUlELCBJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIoYXNzaXN0YW50LCBwYXJ0aXRpb25UeXBlSUQsIHZpZXdlciwgUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCQotCQkvL2dldCB0aGUgY3VycmVudCB1c2VyIHByZWZlcmVuY2UKLQkJZ2V0QXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJQcmVmZXJlbmNlcygpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5TdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKQotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gdGhpcy5mQ29tcGxldGlvblByb3BvYXNsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5TdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvciNwcm9wZXJ0eUNoYW5nZSgKLQkgKiAJb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJaWYocHJvcGVydHkuZXF1YWxzKFByZWZlcmVuY2VDb25zdGFudHMuQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTikgfHwKLQkJCQlwcm9wZXJ0eS5lcXVhbHMoUHJlZmVyZW5jZUNvbnN0YW50cy5DT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OX1RSSUdHRVJTX0pBVkEpKSB7Ci0JCQkKLQkJCWdldEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyUHJlZmVyZW5jZXMoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD5HZXRzIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVyIHVzZXIgcHJlZmVyZW5jZXMgZm9yIEphdmFzY3JpcHQgYW5kIHN0b3JlcyB0aGVtIGZvciBsYXRlciB1c2U8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGdldEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyUHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCi0JCWJvb2xlYW4gZG9BdXRvID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkNPREVBU1NJU1RfQVVUT0FDVElWQVRJT04pOwotCQlpZiAoZG9BdXRvKSB7Ci0JCQlmQ29tcGxldGlvblByb3BvYXNsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzID0KLQkJCQlzdG9yZS5nZXRTdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5DT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OX1RSSUdHRVJTX0pBVkEpLnRvQ2hhckFycmF5KCk7Ci0JCX0gZWxzZSB7Ci0JCQlmQ29tcGxldGlvblByb3BvYXNsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzID0gbnVsbDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0lBY3Rpb25Db25zdGFudHNKcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9JQWN0aW9uQ29uc3RhbnRzSnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxYWY1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0lBY3Rpb25Db25zdGFudHNKcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWw7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpb25Db25zdGFudHNKcyB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfTU9WRV9FTEVNRU5UID0gIk1vdmVFbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX1JFTkFNRV9FTEVNRU5UID0gIlJlbmFtZUVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0lBY3Rpb25EZWZpbml0aW9uSWRzSnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSUFjdGlvbkRlZmluaXRpb25JZHNKcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTYxNjgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSUFjdGlvbkRlZmluaXRpb25JZHNKcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLklKYXZhRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkczsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aW9uRGVmaW5pdGlvbklkc0pzIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNT1ZFX0VMRU1FTlQgPSBJSmF2YUVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuTU9WRV9FTEVNRU5UOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTkFNRV9FTEVNRU5UID0gSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLlJFTkFNRV9FTEVNRU5UOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9KU1BVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9KU1BVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2I1ZDI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBhIHNhbXBsZSBKU1AgZG9jdW1lbnQuICBQbGVhc2UgdHJhbnNsYXRlIG9ubHkgdGhlIGZvbGxvd2luZyBwYXJ0czoKLSMjIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjEKLSMjIFdlbGNvbWUhCi0jIyBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4yCi0jIyBXZWxjb21lIQotU2FtcGxlX0pTUF9kb2M9PCVAIHBhZ2UgXG5cdGxhbmd1YWdlPVwiamF2YVwiIFxuXHRjb250ZW50VHlwZT1cInRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xXCJcbiU+XG48anNwOmluY2x1ZGUgZmx1c2g9XCJ0cnVlXCIgcGFnZT1cInRpdGxlQmFyLmpzcFwiLz5cblxuPCUtLSBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4xIC0tJT5cbjwlXG5cdFN5c3RlbS5vdXQucHJpbnRsbihcIldlbGNvbWUhXCIpO1xuJT5cbjwlLS0gVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMiAtLSU+XG48anNwOnNjcmlwdGxldD5cblx0U3lzdGVtLm91dC5wcmludGxuKFwiV2VsY29tZSFcIik7XG48L2pzcDpzY3JpcHRsZXQ+Ci1KU1BfRGVsaW1pdGVyc19VSV89SlNQIERlbGltaXRlcnMKLVJlZmFjdG9yX2xhYmVsPVJlZmFjdG9yCi1SZW5hbWVFbGVtZW50X2xhYmVsPVJlbmFtZQotTW92ZUVsZW1lbnRfbGFiZWw9TW92ZQotTW92ZUVsZW1lbnRXaXphcmQ9TW92ZSB0aGUgc2VsZWN0ZWQgZWxlbWVudHMKLSMKLU9LPU9LCi1KU1BfY2hhbmdlcz1KU1AgY2hhbmdlcwotQWN0aW9uQ29udHJpYnV0b3JKU1BfMD1SZWZhJmN0b3IKLUpTUFJlbmFtZUVsZW1lbnRBY3Rpb25fMD1FZGl0b3Igc2VsZWN0aW9uIGRvZXMgbm90IHJlc29sdmUgdG8gYSByZW5hbWFibGUgSmF2YSBlbGVtZW50Ci1KU1BNb3ZlRWxlbWVudEFjdGlvbl8wPUVkaXRvciBzZWxlY3Rpb24gZG9lcyBub3QgcmVzb2x2ZSB0byBtb3ZhYmxlIEphdmEgZWxlbWVudHMKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMD1KU1AgUmVuYW1lCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzE9aW4gZmlsZTogezB9IGxpbmU6IHsxfQotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8yPU1vdmUgVHlwZSAnJ3swfScnIHRvIHBhY2thZ2UgJyd7MX0nJwotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8zPVJlbmFtZSBNZXRob2QgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzQ9UmVuYW1lIFR5cGUgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzU9UmVuYW1lIFBhY2thZ2UgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzY9SlNQIFJlbmFtZSBDaGFuZ2UKLSMKLV9VSV9XSVpBUkRfTkVXX1RJVExFID0gTmV3IEphdmFTZXJ2ZXIgUGFnZQotX1VJX1dJWkFSRF9ORVdfSEVBRElORyA9IEphdmFTZXJ2ZXIgUGFnZQotX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04gPSBDcmVhdGUgYSBuZXcgSmF2YVNlcnZlciBQYWdlLgotX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0pTUCA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uIAotX1dBUk5JTkdfRklMRV9NVVNUX0JFX0lOU0lERV9KQVZBX1BST0pFQ1QgPSBKYXZhU2VydmVyIFBhZ2VzIGNyZWF0ZWQgaW4gcHJvamVjdHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBKYXZhIG1pZ2h0IG5vdCB3b3JrIGFzIGV4cGVjdGVkLiAKLV9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVCA9IEZpbGVzIGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHlvdXIgZGVwbG95ZWQgV2ViIGFwcGxpY2F0aW9uLiAKLVJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyA9IFRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzA9U2VsZWN0IEpTUCBUZW1wbGF0ZQotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8xPVNlbGVjdCBhIHRlbXBsYXRlIGFzIGluaXRpYWwgY29udGVudCBpbiB0aGUgSlNQIHBhZ2UuCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzI9TmFtZQotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8zPURlc2NyaXB0aW9uCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzQ9VXNlIEpTUCBUZW1wbGF0ZQotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV81PVByZXZpZXcKLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNj1UZW1wbGF0ZXMgYXJlICdOZXcgSlNQJyB0ZW1wbGF0ZXMgZm91bmQgaW4gdGhlIDxhPkpTUCBUZW1wbGF0ZXM8L2E+IHByZWZlcmVuY2UgcGFnZS4KLSMgQ29waWVkIGZyb20gc3NlLnVpCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uPUNsZWFudXAgRG9jdW1lbnQKLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbj1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249UmVtb3ZlIEJsb2NrIENvbW1lbnQKLUZpbmRPY2N1cnJlbmNlc19sYWJlbD1PY2N1cnJlbmNlcyBpbiBGaWxlCi1PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzA9ezB9IC0gezF9IE9jY3VycmVuY2VzIGluIHsyfQotT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yPWZpbGUKLUNvbnRlbnRfQXNzaXN0X25vdF9hdmFpbGFiX1VJXz1Db250ZW50IEFzc2lzdCBub3QgYXZhaWxhYmxlIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uCi1KYXZhX0NvbnRlbnRfQXNzaXN0X2lzX25vdF9VSV89SmF2YSBDb250ZW50IEFzc2lzdCBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBjdXJzb3IgbG9jYXRpb24KLSMKLU92ZXJyaWRlX21ldGhvZF9pbj1PdmVycmlkZSBtZXRob2QgaW4gJwotQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc9Q3JlYXRpbmcgZmlsZXMgZW5jb2RpbmcgcHJlZmVyZW5jZQotIwotSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMD1KU1AgU291cmNlIHByZWZlcmVuY2VzIGFyZSBiYXNlZCBvbiB0aGUgY29udGVudCB3aXRoaW4gdGhlIEpTUC4KLUpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzE9U2VlIDxhPicnezB9Jyc8L2E+IGZvciBKU1Agd2l0aCBIVE1MIGNvbnRlbnQuCi1KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8yPVNlZSA8YT4nJ3swfScnPC9hPiBmb3IgSlNQIHdpdGggWE1MIGNvbnRlbnQuCi1KU1BDb2xvclBhZ2VfanNwX2NvbnRlbnQ9SlNQIENvbnRlbnQKLUpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfMD1WYWxpZGF0aW5nIGZpbGVzCi1KU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzE9VmFsaWRhdGUgSlNQIGZyYWdtZW50cwotIyBKU1AgRnJhZ21lbnRzCi1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA9bm9uZQotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8xPVRoZSBwcm9wZXJ0aWVzIHVzZWQgaW5zdGVhZCBvZiB0aGUgcGFnZSBkaXJlY3RpdmUgdGhhdCBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIEpTUCBmcmFnbWVudCBmaWxlcy4gIFRoZSBwcm9qZWN0IHNldHRpbmcgaXMgdXNlZCBpZiB5b3Ugc3BlY2lmeSAibm9uZS4iCi1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzI9TGFuZ3VhZ2U6Ci1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzM9Q29udGVudCBUeXBlOgotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV80PUVuYWJsZSBzcGVjaWZpYyBzZXR0aW5nOgotUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMD1UaGUgcHJvcGVydGllcyBmb3IgSjJFRSBXZWIgcHJvamVjdHMgYWN0IGFzICJwcm9qZWN0IiBkZWZhdWx0IHRvIGJlIGxvb2tlZCB1cCB3aGVuIG5vIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEpTUCBmcmFnbWVudCBmaWxlLgotIyBDU1MgSlNQCi1UaXRsZV9JbnZhbGlkVmFsdWU9SW52YWxpZCBWYWx1ZQotTWVzc2FnZV9JbnZhbGlkVmFsdWU9SW52YWxpZCBwcm9wZXJ0eSB2YWx1ZS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSnNVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0pzVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmQ5Y2Y4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSnNVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gCi0gKi8KLXB1YmxpYyBjbGFzcyBKc1VJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9KU1A7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GSUxFX01VU1RfQkVfSU5TSURFX0pBVkFfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aW9uQ29udHJpYnV0b3JKU1BfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpTUFVJUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmluZE9jY3VycmVuY2VzX2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF2YV9Db250ZW50X0Fzc2lzdF9pc19ub3RfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUF9jaGFuZ2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUF9EZWxpbWl0ZXJzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BDb2xvclBhZ2VfanNwX2NvbnRlbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUE1vdmVFbGVtZW50QWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQUmVuYW1lRWxlbWVudEFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VfSW52YWxpZFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVFbGVtZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRWxlbWVudFdpemFyZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdmVycmlkZV9tZXRob2RfaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWZhY3Rvcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUVsZW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlR3JvdXBfbmFtZUV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYW1wbGVfSlNQX2RvYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaXRsZV9JbnZhbGlkVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhKc1VJTWVzc2FnZXMuQlVORExFX05BTUUsIEpzVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoSnNVSU1lc3NhZ2VzLmZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQkJSnNVSU1lc3NhZ2VzLmZSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShKc1VJTWVzc2FnZXMuQlVORExFX05BTUUpOwotCQkJfQotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJSnNVSU1lc3NhZ2VzLmZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIEpzVUlNZXNzYWdlcy5mUmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9Kc1VJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0pzVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBiODM2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0pzVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkuSmF2YVNjcmlwdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc1VJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSnNVSVBsdWdpbiBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBKc1VJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBKc1VJUGx1Z2luLmluc3RhbmNlOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKc1VJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gSnNVSVBsdWdpbi5pbnN0YW5jZTsKLQl9Ci0JLyoqCi0JICogVGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGpzcCBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBDb250ZXh0VHlwZVJlZ2lzdHJ5IGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGpzcCBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCQotCXB1YmxpYyBKc1VJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlKc1VJUGx1Z2luLmluc3RhbmNlID0gdGhpczsKLQl9Ci0JCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgZ2V0QWRhcHRlckZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGpzcCBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUganNwIHBsdWdpbgotCSAqLwotCXB1YmxpYyBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkgewotCQlpZiAoZkNvbnRleHRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotLy8gQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IG5ldwotLy8gQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSgpOwotLy8gcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BTEwpOwotLy8gcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5ORVcpOwotLy8gcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5UQUcpOwotLy8gcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BVFRSSUJVVEUpOwotLy8gcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BVFRSSUJVVEVfVkFMVUUpOwotCQkJZkNvbnRleHRUeXBlUmVnaXN0cnkgPSBKYXZhU2NyaXB0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb2RlVGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUganNwIGVkaXRvciB0ZW1wbGF0ZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBqc3AgZWRpdG9yIHRlbXBsYXRlcwotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCWlmIChmVGVtcGxhdGVTdG9yZSA9PSBudWxsKSB7Ci0vLyBmVGVtcGxhdGVTdG9yZSA9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKAotLy8gZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSwgZ2V0UHJlZmVyZW5jZVN0b3JlKCksCi0vLyBKU1BVSVByZWZlcmVuY2VOYW1lcy5URU1QTEFURVNfS0VZKTsKLQkJCUphdmFTY3JpcHRQbHVnaW4ganAgPSBKYXZhU2NyaXB0UGx1Z2luLmdldERlZmF1bHQoKTsKLQkJCWZUZW1wbGF0ZVN0b3JlID0ganAuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQkJdHJ5IHsKLQkJCQlmVGVtcGxhdGVTdG9yZS5sb2FkKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlU3RvcmU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlpbnN0YW5jZSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OWM3NTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgTG9nZ2VyLkVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgTG9nZ2VyLklORk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBMb2dnZXIuT0s7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIExvZ2dlci5XQVJOSU5HOwotCQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IExvZ2dlci5PS19ERUJVRyB8fCBsZXZlbCA9PSBMb2dnZXIuSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBMb2dnZXIuV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBMb2dnZXIuRVJST1JfREVCVUcpIHsKLQkJCWlmICghTG9nZ2VyLmlzRGVidWdnaW5nKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHOgotCQkJY2FzZSBJTkZPOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUc6Ci0JCQljYXNlIFdBUk5JTkc6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUc6Ci0JCQljYXNlIEVSUk9SOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBMb2dnZXIuUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShMb2dnZXIuUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChMb2dnZXIuaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgTG9nZ2VyLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoTG9nZ2VyLlBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIUxvZ2dlci5pc0RlYnVnZ2luZygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oTG9nZ2VyLlBMVUdJTl9JRCArIExvZ2dlci5UUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCUxvZ2dlci5fbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCUxvZ2dlci5fbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCUxvZ2dlci5fbG9nKExvZ2dlci5FUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCUxvZ2dlci5fbG9nKExvZ2dlci5FUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTG9nZ2VyLl90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCUxvZ2dlci5fdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJTG9nZ2VyLl90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JKcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9ySnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxZjk3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JKcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuamF2YS5KYXZhQXV0b0luZGVudFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuamF2YS5TbWFydFNlbWljb2xvbkF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhZG9jLkphdmFEb2NBdXRvSW5kZW50U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgQXV0b0VkaXRTdHJhdGVneUZvckpzIGltcGxlbWVudHMgSUF1dG9FZGl0U3RyYXRlZ3kgewotCXByaXZhdGUgSUF1dG9FZGl0U3RyYXRlZ3lbXSBmU3RyYXRlZ2llczsKLQkKLQlwdWJsaWMgQXV0b0VkaXRTdHJhdGVneUZvckpzKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjdXN0b21pemVEb2N1bWVudENvbW1hbmQoSURvY3VtZW50IGRvY3VtZW50LCBEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQlJQXV0b0VkaXRTdHJhdGVneVtdIHN0cmF0cyA9IGdldEF1dG9FZGl0U3RyYXRlZ2llcyhkb2N1bWVudCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyYXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzdHJhdHNbaV0uY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKGRvY3VtZW50LCBjb21tYW5kKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSUF1dG9FZGl0U3RyYXRlZ3lbXSBnZXRBdXRvRWRpdFN0cmF0ZWdpZXMoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChmU3RyYXRlZ2llcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZlN0cmF0ZWdpZXM7Ci0JCX0KLQkJU3RyaW5nIHBhcnRpdGlvbmluZyA9IElIVE1MUGFydGl0aW9ucy5TQ1JJUFQ7Ci0JCWZTdHJhdGVnaWVzID0gbmV3IElBdXRvRWRpdFN0cmF0ZWd5W10geyBuZXcgU21hcnRTZW1pY29sb25BdXRvRWRpdFN0cmF0ZWd5KHBhcnRpdGlvbmluZyksCi0JCQkJbmV3IEphdmFBdXRvSW5kZW50U3RyYXRlZ3kocGFydGl0aW9uaW5nLCBnZXRKYXZhUHJvamVjdChkb2N1bWVudCksIG51bGwpLCBuZXcgSmF2YURvY0F1dG9JbmRlbnRTdHJhdGVneShwYXJ0aXRpb25pbmcpIH07Ci0JCS8qIG5ldyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicygpICovCi0JCXJldHVybiBmU3RyYXRlZ2llczsKLQl9Ci0JCi0JcHJpdmF0ZSBJSmF2YVNjcmlwdFByb2plY3QgZ2V0SmF2YVByb2plY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlET01Nb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlKYXZhU2NyaXB0UHJvamVjdCBqYXZhUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCWlmIChmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA+IDApIHsKLQkJCQlwcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGZpbGVQYXRoLnNlZ21lbnQoMCkpOwotCQkJfQotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCWphdmFQcm9qZWN0ID0gSmF2YVNjcmlwdENvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gamF2YVByb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFiNDQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5hdXRvZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQ29uZmlndXJhYmxlTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzIGltcGxlbWVudHMgSUF1dG9FZGl0U3RyYXRlZ3kgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFRBQl9DSEFSQUNURVIgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gaWYgbm90IGluIHNtYXJ0IGluc2VydCBtb2RlIGp1c3QgaWdub3JlCi0JCWlmICghaXNTbWFydEluc2VydE1vZGUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIHNwYWNlcyBmb3IgdGFiIGNoYXJhY3RlcgotCQlpZiAoY29tbWFuZC5sZW5ndGggPT0gMCAmJiBjb21tYW5kLnRleHQgIT0gbnVsbCAmJiBjb21tYW5kLnRleHQubGVuZ3RoKCkgPiAwICYmIGNvbW1hbmQudGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpICE9IC0xKSB7Ci0JCQlzbWFydEluc2VydEZvclRhYihjb21tYW5kLCBkb2N1bWVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBpbmRlbnRhdGlvbiB3aWR0aCBpZiB1c2luZyBzcGFjZXMgZm9yIGluZGVudGF0aW9uLCAtMSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0SW5kZW50YXRpb25XaWR0aCgpIHsKLQkJaW50IHdpZHRoID0gLTE7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUEFDRS5lcXVhbHMocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkgewotCQkJd2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0JCX0KLQkJcmV0dXJuIHdpZHRoOwotCX0KLQkKLQkvKioKLQkgKiBDYWxjdWxhdGUgbnVtYmVyIG9mIHNwYWNlcyBmb3IgbmV4dCB0YWIgc3RvcAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudFN0cmluZyhpbnQgaW5kZW50YXRpb25XaWR0aCwgaW50IGxpbmVPZmZzZXQsIElMaW5lVHJhY2tlciBsaW5lVHJhY2tlciwgaW50IGluZGV4KSB7Ci0JCWludCBpbmRlbnRTaXplID0gaW5kZW50YXRpb25XaWR0aDsKLQkJaW50IG9mZnNldEluTGluZSA9IC0xOwotCQlpZiAobGluZVRyYWNrZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gbGluZVRyYWNrZXIuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoaW5kZXgpOwotCQkJCWlmIChsaW5lSW5mby5nZXRPZmZzZXQoKSA9PSAwICYmIGxpbmVPZmZzZXQgPiAtMSkgewotCQkJCQlvZmZzZXRJbkxpbmUgPSBsaW5lT2Zmc2V0ICsgaW5kZXg7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb2Zmc2V0SW5MaW5lID0gaW5kZXggLSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGxpbmVPZmZzZXQgPiAtMSkgewotCQkJCW9mZnNldEluTGluZSA9IGxpbmVPZmZzZXQgKyBpbmRleDsKLQkJCX0KLQkJfQotCQlpZiAob2Zmc2V0SW5MaW5lID4gLTEgJiYgaW5kZW50YXRpb25XaWR0aCA+IDApIHsKLQkJCWludCByZW1haW5kZXIgPSBvZmZzZXRJbkxpbmUgJSBpbmRlbnRhdGlvbldpZHRoOwotCQkJaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGggLSByZW1haW5kZXI7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRTaXplOyBpKyspIHsKLQkJCWluZGVudC5hcHBlbmQoJyAnKTsKLQkJfQotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB1cCBhIGxpbmUgdHJhY2tlciBmb3IgdGV4dCB3aXRoaW4gY29tbWFuZCBpZiB0ZXh0IGlzIG11bHRpLWxpbmUKLQkgKi8KLQlwcml2YXRlIElMaW5lVHJhY2tlciBnZXRMaW5lVHJhY2tlcihJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBvcmlnaW5hbFRleHQpIHsKLQkJQ29uZmlndXJhYmxlTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBudWxsOwotCQlpbnRbXSBkZWxpbXMgPSBUZXh0VXRpbGl0aWVzLmluZGV4T2YoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpLCBvcmlnaW5hbFRleHQsIDApOwotCQlpZiAoZGVsaW1zWzBdICE9IC0xIHx8IGRlbGltc1sxXSAhPSAtMSkgewotCQkJbGluZVRyYWNrZXIgPSBuZXcgQ29uZmlndXJhYmxlTGluZVRyYWNrZXIoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpKTsKLQkJCWxpbmVUcmFja2VyLnNldChvcmlnaW5hbFRleHQpOwotCQl9Ci0JCXJldHVybiBsaW5lVHJhY2tlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWN0aXZlIGVkaXRvciBpcyBpbiBzbWFydCBpbnNlcnQgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSgpIHsKLQkJYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSA9IGZhbHNlOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGNoZWNrIGlmIHNtYXJ0IGluc2VydCBtb2RlCi0JCWlmICh0ZXh0RWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3JFeHRlbnNpb24zICYmICgoSVRleHRFZGl0b3JFeHRlbnNpb24zKSB0ZXh0RWRpdG9yKS5nZXRJbnNlcnRNb2RlKCkgPT0gSVRleHRFZGl0b3JFeHRlbnNpb24zLlNNQVJUX0lOU0VSVCkgewotCQkJaXNTbWFydEluc2VydE1vZGUgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBpc1NtYXJ0SW5zZXJ0TW9kZTsKLQl9Ci0JCi0JLyoqCi0JICogSW5zZXJ0IHNwYWNlcyBmb3IgdGFicwotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0SW5zZXJ0Rm9yVGFiKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gdGFiIGtleSB3YXMgcHJlc3NlZC4gbm93IGNoZWNrIHByZWZlcmVuY2VzIHRvIHNlZSBpZiBuZWVkIHRvIGluc2VydAotCQkvLyBzcGFjZXMgaW5zdGVhZCBvZiB0YWIKLQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBnZXRJbmRlbnRhdGlvbldpZHRoKCk7Ci0JCWlmIChpbmRlbnRhdGlvbldpZHRoID4gLTEpIHsKLQkJCVN0cmluZyBvcmlnaW5hbFRleHQgPSBjb21tYW5kLnRleHQ7Ci0JCQlTdHJpbmdCdWZmZXIgbmV3VGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIob3JpZ2luYWxUZXh0KTsKLQkJCS8vIGRldGVybWluZSB3aGVyZSBpbiBsaW5lIHRoaXMgY29tbWFuZCBiZWdpbnMKLQkJCWludCBsaW5lT2Zmc2V0ID0gLTE7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZUluZm8gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChjb21tYW5kLm9mZnNldCk7Ci0JCQkJbGluZU9mZnNldCA9IGNvbW1hbmQub2Zmc2V0IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQkJSUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gZ2V0TGluZVRyYWNrZXIoZG9jdW1lbnQsIG9yaWdpbmFsVGV4dCk7Ci0JCQlpbnQgc3RhcnRJbmRleCA9IDA7Ci0JCQlpbnQgaW5kZXggPSBuZXdUZXh0LmluZGV4T2YoVEFCX0NIQVJBQ1RFUik7Ci0JCQl3aGlsZSAoaW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgaW5kZW50ID0gZ2V0SW5kZW50U3RyaW5nKGluZGVudGF0aW9uV2lkdGgsIGxpbmVPZmZzZXQsIGxpbmVUcmFja2VyLCBpbmRleCk7Ci0JCQkJLy8gcmVwbGFjZSBcdCBjaGFyYWN0ZXIgd2l0aCBzcGFjZXMKLQkJCQluZXdUZXh0LnJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSwgaW5kZW50KTsKLQkJCQlpZiAobGluZVRyYWNrZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJbGluZVRyYWNrZXIucmVwbGFjZShpbmRleCwgMSwgaW5kZW50KTsKLQkJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCByZXBsYWNpbmcgdGV4dCwganVzdAotCQkJCQkJLy8gcmVzZXQgdG8gY3VycmVudCBzdHJpbmcKLQkJCQkJCWxpbmVUcmFja2VyLnNldChuZXdUZXh0LnRvU3RyaW5nKCkpOwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXN0YXJ0SW5kZXggPSBpbmRleCArIGluZGVudC5sZW5ndGgoKTsKLQkJCQlpbmRleCA9IG5ld1RleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSLCBzdGFydEluZGV4KTsKLQkJCX0KLQkJCWNvbW1hbmQudGV4dCA9IG5ld1RleHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUQ29tcGxldGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzJmNjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUQ29tcGxldGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb241OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLkphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLkxhenlKYXZhQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuamF2YS5MYXp5SmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkudGV4dC5qYXZhLklKYXZhQ29tcGxldGlvblByb3Bvc2FsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpTRFRDb21wbGV0aW9uUHJvcG9zYWwgZXh0ZW5kcyBKYXZhQ29tcGxldGlvblByb3Bvc2FsIGltcGxlbWVudHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgewotCS8qCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4MwotCSAqIAotCSAqIFRoaXMgaXMgYSB3cmFwcGVkIHByb3Bvc2FsIHNvIHdlIGRvbid0IG5lZWQgdG8gbWFrZSAic2xvdyIgY2FsbHMgdG8gdGhlCi0JICogamF2YSBwcm9wb3NhbCB1cCBmcm9udCwgb25seSB3aGVuIG5lZWRlZCBmb3IgZXhhbXBsZSwgZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIHJlYWRzIGV4dGVybmFsIGphdmFkb2MsIGFuZCBpdCBtYWtlcyBubyBzZW5zZQotCSAqLwotCUlDb21wbGV0aW9uUHJvcG9zYWwgZkphdmFDb21wbGV0aW9uUHJvcG9zYWwgPSBudWxsOwotCQotCXB1YmxpYyBKU0RUQ29tcGxldGlvblByb3Bvc2FsKFN0cmluZyByZXBsYWNlbWVudFN0cmluZywgaW50IHJlcGxhY2VtZW50T2Zmc2V0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIGludCBjdXJzb3JQb3NpdGlvbiwgSW1hZ2UgaW1hZ2UsCi0JCQlTdHJpbmcgZGlzcGxheVN0cmluZywgSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24sIFN0cmluZyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCBpbnQgcmVsZXZhbmNlLAotCQkJYm9vbGVhbiB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpIHsKLQkJc3VwZXIocmVwbGFjZW1lbnRTdHJpbmcsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIHJlbGV2YW5jZSk7Ci0JCXN1cGVyLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvc2l0aW9uKTsKLQkJc3VwZXIuc2V0Q29udGV4dEluZm9ybWF0aW9uKGNvbnRleHRJbmZvcm1hdGlvbik7Ci0vLyBzdXBlcihyZXBsYWNlbWVudFN0cmluZywgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLAotLy8gY3Vyc29yUG9zaXRpb24sIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBjb250ZXh0SW5mb3JtYXRpb24sCi0vLyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCByZWxldmFuY2UsCi0vLyB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpOwotCX0KLQkKLQkvKioKLQkgKiA8cD5Vc2VzIHRoZSB3cmFwcGVkIHByb3Bvc2FsIGlmIGl0cyBsYXp5PC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICh0aGlzLmZKYXZhQ29tcGxldGlvblByb3Bvc2FsIGluc3RhbmNlb2YgTGF6eUphdmFDb21wbGV0aW9uUHJvcG9zYWwpIHsKLQkJCSgoTGF6eUphdmFDb21wbGV0aW9uUHJvcG9zYWwpIHRoaXMuZkphdmFDb21wbGV0aW9uUHJvcG9zYWwpLmFwcGx5KHZpZXdlciwgdHJpZ2dlciwgc3RhdGVNYXNrLCBvZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJc3VwZXIuYXBwbHkodmlld2VyLCB0cmlnZ2VyLCBzdGF0ZU1hc2ssIG9mZnNldCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+VXNlcyB0aGUgd3JhcHBlZCBwcm9wb3NhbCBpZiBpdHMgbGF6eTwvcD4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHNlbGVjdGlvbiBhZnRlciB0aGUgcHJvcG9zYWwgaGFzIGJlZW4gYXBwbGllZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVBvaW50IHNlbGVjdGlvbjsKLQkJaWYgKHRoaXMuZkphdmFDb21wbGV0aW9uUHJvcG9zYWwgaW5zdGFuY2VvZiBMYXp5SmF2YUNvbXBsZXRpb25Qcm9wb3NhbCkgewotCQkJc2VsZWN0aW9uID0gdGhpcy5mSmF2YUNvbXBsZXRpb25Qcm9wb3NhbC5nZXRTZWxlY3Rpb24oZG9jdW1lbnQpOwotCQl9Ci0JCWVsc2UgewotCQkJc2VsZWN0aW9uID0gc3VwZXIuZ2V0U2VsZWN0aW9uKGRvY3VtZW50KTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCU9iamVjdCBhZGRpdGlvbmFsSW5mbyA9IHN1cGVyLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8obW9uaXRvcik7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWwgamF2YVByb3Bvc2FsID0gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbCgpOwotCQlpZiAoKGphdmFQcm9wb3NhbCAhPSBudWxsKSAmJiAoamF2YVByb3Bvc2FsIGluc3RhbmNlb2YgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjUpKSB7Ci0JCQlhZGRpdGlvbmFsSW5mbyA9ICgoSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjUpIGphdmFQcm9wb3NhbCkuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbyhtb25pdG9yKTsKLQkJfQotCQlyZXR1cm4gYWRkaXRpb25hbEluZm87Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gc3VwZXIuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsIGphdmFQcm9wb3NhbCA9IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoKTsKLQkJaWYgKGphdmFQcm9wb3NhbCAhPSBudWxsKSB7Ci0JCQlhZGRpdGlvbmFsSW5mbyA9IGphdmFQcm9wb3NhbC5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCX0KLQkJcmV0dXJuIGFkZGl0aW9uYWxJbmZvOwotCX0KLQkKLQlmaW5hbCBwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbCBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKCkgewotCQlyZXR1cm4gZkphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci0JfQotCQotCWZpbmFsIHB1YmxpYyB2b2lkIHNldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoSUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhQ29tcGxldGlvblByb3Bvc2FsKSB7Ci0JCWZKYXZhQ29tcGxldGlvblByb3Bvc2FsID0gamF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0JCWlmICh0aGlzLmZKYXZhQ29tcGxldGlvblByb3Bvc2FsIGluc3RhbmNlb2YgTGF6eUphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKSB7Ci0JCQlyZXR1cm4gKChMYXp5SmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwpIHRoaXMuZkphdmFDb21wbGV0aW9uUHJvcG9zYWwpLmlzVmFsaWRUeXBlUHJlZml4KHByZWZpeCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzVmFsaWRQcmVmaXgocHJlZml4KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbnRlbnRBc3Npc3RhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUQ29udGVudEFzc2lzdGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTM4M2I0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUQ29udGVudEFzc2lzdGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU0RUQ29udGVudEFzc2lzdGFudCBleHRlbmRzIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB7Ci0JcHJpdmF0ZSBKU0RUQ29udGVudEFzc2lzdGFudFByb2Nlc3NvciBmQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQlwcml2YXRlIEpTRFRUZW1wbGF0ZUFzc2lzdFByb2Nlc3NvciBmVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3I7Ci0JcHJpdmF0ZSBKU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IgZkhodG1sY29tcDsKLQkKLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJVmVjdG9yIHByb3Bvc2FscyA9IG5ldyBWZWN0b3IoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXBsZXRpb25Qcm9wb3NhbHM7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWwgZW5kU2NyaXB0ID0gZ2V0SHRtbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKS5nZXRFbmRTY3JpcHRQcm9wb3NhbCh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlpZihlbmRTY3JpcHQhPW51bGwpIHsKLQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHtlbmRTY3JpcHR9OwotCQkJLy9wcm9wb3NhbHMuYWRkKGVuZFNjcmlwdCk7Ci0JCX0KLQkJSlNEVFByb3Bvc2FsQ29sbGVjdG9yIHRoZUNvbGxlY3RvciA9IGdldFByb3Bvc2FsQ29sbGVjdG9yKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCS8qIGFkZCBlbmQgc2NyaXB0IHRhZyBpZiBuZWVkZWQgKi8KLQotCQkvKiAtLS0tLS0tLS0gQ29udGVudCBBc3Npc3RhbnQgLS0tLS0tLS0tICovCi0JCWlmKHRoZUNvbGxlY3Rvcj09bnVsbCkgcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCQkKLQkJZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcigpLnNldFByb3Bvc2FsQ29sbGVjdG9yKHRoZUNvbGxlY3Rvcik7Ci0JCWNvbXBsZXRpb25Qcm9wb3NhbHMgPSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJcHJvcG9zYWxzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNvbXBsZXRpb25Qcm9wb3NhbHMpKTsKLQkJLyogSFRNTCBQcm9wb3NhbHMgKi8KLQkJY29tcGxldGlvblByb3Bvc2FscyA9IGdldEh0bWxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJcHJvcG9zYWxzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNvbXBsZXRpb25Qcm9wb3NhbHMpKTsKLQkJLyogLS0tLS0tLS0tIHRlbXBsYXRlIGNvbXBsZXRpb25zIC0tLS0tLS0tLSAqLwotCQlnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5zZXRQcm9wb3NhbENvbGxlY3Rvcih0aGVDb2xsZWN0b3IpOwotCQljb21wbGV0aW9uUHJvcG9zYWxzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJcHJvcG9zYWxzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNvbXBsZXRpb25Qcm9wb3NhbHMpKTsKLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIHByb3Bvc2Fscy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0SHRtbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCWlmIChmSGh0bWxjb21wID09IG51bGwpIHsKLQkJCWZIaHRtbGNvbXAgPSBuZXcgSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0JCX0KLQkJcmV0dXJuIGZIaHRtbGNvbXA7Ci0JfQotCQotCXByaXZhdGUgSlNEVENvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3IgZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJaWYgKGZDb250ZW50QXNzaXN0UHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZDb250ZW50QXNzaXN0UHJvY2Vzc29yID0gbmV3IEpTRFRDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yKCk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCX0KLQlwcml2YXRlIElKc1RyYW5zbGF0aW9uIGdldEpTUFRyYW5zbGF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCi0JCQlKc1RyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQotCQkJaWYgKHRyYW5zbGF0aW9uQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRyYW5zbGF0aW9uQWRhcHRlci5nZXRKc1RyYW5zbGF0aW9uKHRydWUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBKU0RUUHJvcG9zYWxDb2xsZWN0b3IgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlKc1RyYW5zbGF0aW9uIHRyYW4gPSBnZXRKU1BUcmFuc2xhdGlvbih2aWV3ZXIsIG9mZnNldCk7Ci0JCWlmKHRyYW49PW51bGwpIHJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IEpTRFRQcm9wb3NhbENvbGxlY3Rvcih0cmFuKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKU0RUVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3IgZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZlRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZUFzc2lzdFByb2Nlc3NvciA9IG5ldyBKU0RUVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlc3Npb25TdGFydGVkKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCXB1YmxpYyBMaXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlWZWN0b3IgcHJvcG9zYWxzID0gbmV3IFZlY3RvcigpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcGxldGlvblByb3Bvc2FsczsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBlbmRTY3JpcHQgPSBnZXRIdG1sQ29udGVudEFzc2lzdFByb2Nlc3NvcigpLmdldEVuZFNjcmlwdFByb3Bvc2FsKGNvbnRleHQuZ2V0Vmlld2VyKCksIGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpKTsKLQkJaWYoZW5kU2NyaXB0IT1udWxsKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKLQkJCS8vcHJvcG9zYWxzLmFkZChlbmRTY3JpcHQpOwotCQl9Ci0JCUpTRFRQcm9wb3NhbENvbGxlY3RvciB0aGVDb2xsZWN0b3IgPSBnZXRQcm9wb3NhbENvbGxlY3Rvcihjb250ZXh0LmdldFZpZXdlcigpLCBjb250ZXh0LmdldEludm9jYXRpb25PZmZzZXQoKSk7Ci0JCS8qIGFkZCBlbmQgc2NyaXB0IHRhZyBpZiBuZWVkZWQgKi8KLQotCQkvKiAtLS0tLS0tLS0gQ29udGVudCBBc3Npc3RhbnQgLS0tLS0tLS0tICovCi0JCWlmKHRoZUNvbGxlY3Rvcj09bnVsbCkgcmV0dXJuIG5ldyBBcnJheUxpc3QoMCk7Ci0JCQotCQlnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkuc2V0UHJvcG9zYWxDb2xsZWN0b3IodGhlQ29sbGVjdG9yKTsKLQkJY29tcGxldGlvblByb3Bvc2FscyA9IGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhjb250ZXh0LmdldFZpZXdlcigpLCBjb250ZXh0LmdldEludm9jYXRpb25PZmZzZXQoKSk7Ci0JCXByb3Bvc2Fscy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb21wbGV0aW9uUHJvcG9zYWxzKSk7Ci0JCS8qIEhUTUwgUHJvcG9zYWxzICovCi0JCWNvbXBsZXRpb25Qcm9wb3NhbHMgPSBnZXRIdG1sQ29udGVudEFzc2lzdFByb2Nlc3NvcigpLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGNvbnRleHQuZ2V0Vmlld2VyKCksIGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpKTsKLQkJcHJvcG9zYWxzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNvbXBsZXRpb25Qcm9wb3NhbHMpKTsKLQkJLyogLS0tLS0tLS0tIHRlbXBsYXRlIGNvbXBsZXRpb25zIC0tLS0tLS0tLSAqLwotCQlnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5zZXRQcm9wb3NhbENvbGxlY3Rvcih0aGVDb2xsZWN0b3IpOwotCQljb21wbGV0aW9uUHJvcG9zYWxzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoY29udGV4dC5nZXRWaWV3ZXIoKSwgY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCkpOwotCQlwcm9wb3NhbHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29tcGxldGlvblByb3Bvc2FscykpOwotCQlyZXR1cm4gcHJvcG9zYWxzOwotCX0KLQotCXB1YmxpYyBMaXN0IGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oY29udGV4dC5nZXRWaWV3ZXIoKSwgY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXNzaW9uRW5kZWQoKSB7Ci0JCWZDb250ZW50QXNzaXN0UHJvY2Vzc29yID0gbnVsbDsKLQkJZlRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yID0gbnVsbDsKLQkJZkhodG1sY29tcCA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliNWUyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcwotICogc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZQotICogcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvCi0gKiBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueQotICogY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlCi0gKiBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqLwotcHVibGljIGNsYXNzIEpTRFRDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNEVF9DT1JFX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotLy8Jc3RhdGljIHsKLS8vCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanNwdHJhbnNsYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotLy8JCS8vREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotLy8JfQotCXByb3RlY3RlZCBTdHJpbmcgZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIGludCBmSnNwU291cmNlUG9zaXRpb24sIGZKYXZhUG9zaXRpb247Ci0JcHJpdmF0ZSBKU0RUUHJvcG9zYWxDb2xsZWN0b3IgZlByb3Bvc2FsQ29sbGVjdG9yOwotCXByb3RlY3RlZCBJVGV4dFZpZXdlciBmVmlld2VyID0gbnVsbDsKLQkKLQlwdWJsaWMgSlNEVENvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KLQkgKiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uCi0JICogd2l0aGluIHRoZSB0ZXh0IHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIHdob3NlIGRvY3VtZW50IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcHJvcG9zYWxzCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiAgICAgICAgICAgIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRvY3VtZW50IGZvciB3aGljaCBjb21wbGV0aW9ucyBzaG91bGQgYmUKLQkgKiAgICAgICAgICAgIGNvbXB1dGVkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb21wbGV0aW9uIHByb3Bvc2FscyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotCSAqICAgICAgICAgcHJvcG9zYWxzIGFyZSBwb3NzaWJsZQotCSAqLwotCQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgcG9zKSB7Ci0JCWluaXRpYWxpemUocG9zKTsKLQkJSlNEVFByb3Bvc2FsQ29sbGVjdG9yIGNvbGxlY3RvciA9IG51bGw7Ci0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmVmlld2VyID0gdmlld2VyOwotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIHRyYW5zbGF0aW9uQWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCi0JCQlpZiAodHJhbnNsYXRpb25BZGFwdGVyICE9IG51bGwpIHsKLQkJCQlJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uQWRhcHRlci5nZXRKc1RyYW5zbGF0aW9uKHRydWUpOwotCQkJCWZKYXZhUG9zaXRpb24gPSBnZXREb2N1bWVudFBvc2l0aW9uKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJSUphdmFTY3JpcHRVbml0IGN1ID0gdHJhbnNsYXRpb24uZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCS8vIGNhbid0IGdldCBqYXZhIHByb3Bvc2FscyB3L291dCBhIGNvbXBpbGF0aW9uIHVuaXQKLQkJCQkJLy8gb3Igd2l0aG91dCBhIHZhbGlkIHBvc2l0aW9uCi0JCQkJCWlmIChjdSA9PSBudWxsIHx8IC0xID09IGZKYXZhUG9zaXRpb24pIHsKLQkJCQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCQkJfQotCQkJCQljb2xsZWN0b3IgPSBnZXRQcm9wb3NhbENvbGxlY3RvcigpOwotCQkJCQlzeW5jaHJvbml6ZWQgKGN1KSB7Ci0JCQkJCQljdS5jb2RlQ29tcGxldGUoZkphdmFQb3NpdGlvbiwgY29sbGVjdG9yLCBudWxsKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY29yZUV4KSB7Ci0JCQkJCS8vIGEgcG9zc2libGUgSmF2YSBNb2RlbCBFeGNlcHRpb24gZHVlIHRvIG5vdCBiZWluZyBhIFdlYgotCQkJCQkvLyAoSmF2YSkgUHJvamVjdAotCQkJCQljb3JlRXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkvLyB0aHJvdyBvdXQgZXhjZXB0aW9ucyBvbiBjb2RlIGFzc2lzdC4KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHJlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJaWYgKGNvbGxlY3RvciAhPSBudWxsKSB7Ci0JCQlyZXN1bHRzID0gY29sbGVjdG9yLmdldEpTUENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkJCWlmIChyZXN1bHRzID09IG51bGwgfHwgcmVzdWx0cy5sZW5ndGggPCAxKSB7Ci0JCQkJZkVycm9yTWVzc2FnZSA9IEpzVUlNZXNzYWdlcy5KYXZhX0NvbnRlbnRfQXNzaXN0X2lzX25vdF9VSV87Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgcG9zc2libGUgY29udGV4dHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZAotCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjdXJzb3IKLQkgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgd2hvc2UgZG9jdW1lbnQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBwb3NzaWJsZQotCSAqICAgICAgICAgICAgY29udGV4dHMKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZG9jdW1lbnQgZm9yIHdoaWNoIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgICAgIHNob3VsZCBiZSBjb21wdXRlZAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29udGV4dCBpbmZvcm1hdGlvbiBvYmplY3RzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICBubyBjb250ZXh0IGNvdWxkIGJlIGZvdW5kCi0JICovCi0JCi0JcHVibGljIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBwcmVzc2VkIHNob3VsZCBhdXRvbWF0aWNhbGx5Ci0JICogZGlzcGxheSBjb250ZW50LWFzc2lzdCBwcm9wb3NhbHMuCi0JICogCi0JICogQHJldHVybiBzdHJpbmcgb2YgY2hhcmFjdGVycwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF1dG9Qcm9wb3NhbEludm9jYXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gcHJlc3NlZCBzaG91bGQgYXV0b21hdGljYWxseQotCSAqIGRpc3BsYXkgYSBjb250ZW50LWFzc2lzdCB0aXAuCi0JICogCi0JICogQHJldHVybiBzdHJpbmcgb2YgY2hhcmFjdGVycwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF1dG9UaXBJbnZvY2F0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBjb21wbGV0aW9uIHByb3Bvc2FsIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotCSAqLwotCQotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyB3aGljaCB3aGVuIGVudGVyZWQgYnkgdGhlIHVzZXIgc2hvdWxkCi0JICogYXV0b21hdGljYWxseSB0cmlnZ2VyIHRoZSBwcmVzZW50YXRpb24gb2YgY29udGV4dCBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgcHJlc2VudGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi0JICogICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotCSAqLwotCQotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHZhbGlkYXRvciB1c2VkIHRvIGRldGVybWluZSB3aGVuIGRpc3BsYXllZCBjb250ZXh0IGluZm9ybWF0aW9uCi0JICogc2hvdWxkIGJlIGRpc21pc3NlZC4gTWF5IG9ubHkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwcm9jZXNzb3IKLQkgKiBpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIGNvbnRleHQgaW5mb3JtYXRpb24gdmFsaWRhdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIHByb2Nlc3NvciBpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKi8KLQkKLQlwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBnZXREb2N1bWVudFBvc2l0aW9uKCkgewotCQlyZXR1cm4gZkpzcFNvdXJjZVBvc2l0aW9uOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJLy8gVE9ETzogZ2V0IGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UKLQkJLy8gaWYgKGZDb2xsZWN0b3IuZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCAmJgotCQkvLyBmQ29sbGVjdG9yLmdldEVycm9yTWVzc2FnZSgpLmxlbmd0aCgpID4gMCkKLQkJLy8gcmV0dXJuIGZDb2xsZWN0b3IuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCXJldHVybiBmRXJyb3JNZXNzYWdlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSlNEVFByb3Bvc2FsQ29sbGVjdG9yIGdldFByb3Bvc2FsQ29sbGVjdG9yKCkgewotCQlyZXR1cm4gZlByb3Bvc2FsQ29sbGVjdG9yOwotCQkvLyByZXR1cm4gbmV3IEpTUFByb3Bvc2FsQ29sbGVjdG9yKHRyYW5zbGF0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgY29kZSBhc3Npc3QgcHJvY2Vzc29yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoaW50IHBvcykgewotCQlpbml0aWFsaXplSmF2YVBsdWdpbnMoKTsKLQkJZkpzcFNvdXJjZVBvc2l0aW9uID0gcG9zOwotCQlmRXJyb3JNZXNzYWdlID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgSmF2YSBQbHVnaW5zIHRoYXQgdGhlIEpTUCBwcm9jZXNzb3IgcmVxdWlyZXMuIFNlZQotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDM3NjUgV2Ugc2hvdWxkIG5vdCBjYWxsCi0JICogInN0YXJ0IiwgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UgdGhhdCBzdGF0ZSB0byBiZSByZW1lbWJlcmVkLCBhbmQKLQkgKiByZS1zdGFydGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHRoZSBuZXh0IGJvb3QgdXAgc2VxdWVuY2UuCi0JICogCi0JICogSVNTVUU6IHdlIG1heSBiZSBhYmxlIHRvIGdldCByaWQgb2YgdGhpcyBhbGwgdG9nZXRoZXIsIGluIGZ1dHVyZSwgc2luY2UKLQkgKiA5OSUgd2UgcHJvYmFibHkgaGF2ZSBhbHJlYWR5IHVzZWQgc29tZSBKRFQgY2xhc3MgYnkgdGhlIHRpbWUgd2UgbmVlZCBKRFQKLQkgKiB0byBiZSBhY3RpdmUgLi4uIGJ1dCAuLi4gdGhpcyBpcyB0aGUgc2FmZXN0IGZpeCBmb3IgdGhpcyBwb2ludCBpbiAxLjUKLQkgKiBzdHJlYW0uIE5leHQgcmVsZWFzZSwgbGV0J3MganVzdCByZW1vdmUgdGhpcywgcmUtZGlzY292ZXIgd2hhdCBldmVyIGJ1ZwotCSAqIHRoaXMgd2FzIGZpeGluZyAoaWYgYW55KSBhbmQgaWYgdGhlcmUgaXMgb25lLCB0aGVuIHdlJ2xsIGVpdGhlciBwdXQgYmFjawotCSAqIGluLCBhcyBpcywgb3IgY29tZSB1cCB3aXRoIGEgbW9yZSBhcHByb3ByaWF0ZSBmaXguCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUphdmFQbHVnaW5zKCkgewotCQl0cnkgewotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShKU0RUQ29udGVudEFzc2lzdGFudFByb2Nlc3Nvci5KU0RUX0NPUkVfUExVR0lOX0lEKTsKLQkJCWJ1bmRsZS5sb2FkQ2xhc3MoImR1bW15Q2xhc3NOYW1lVGhhdFNob3VsZE5ldmVyRXhpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHRoaXMgaXMgdGhlIGV4cGVjdGVkIHJlc3VsdCwgd2UganVzdCB3YW50IHRvCi0JCQkvLyBudWRnZSB0aGUgYnVuZGxlIHRvIGJlIHN1cmUgaXRzIGFjdGl2YXRlZC4KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wb3NhbENvbGxlY3RvcihKU0RUUHJvcG9zYWxDb2xsZWN0b3IgdHJhbnNsYXRpb24pIHsKLQkJdGhpcy5mUHJvcG9zYWxDb2xsZWN0b3IgPSB0cmFuc2xhdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbnRldEFzc2lzdEludm9jYXRpb25Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbnRldEFzc2lzdEludm9jYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZDA3YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkudGV4dC5qYXZhLkphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVENvbnRldEFzc2lzdEludm9jYXRpb25Db250ZXh0IGV4dGVuZHMgSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCB7Ci0JcHVibGljIHN0YXRpYyBKU0RUQ29udGV0QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgZ2V0SW5zdGFuY2UoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0LCBKU0RUUHJvcG9zYWxDb2xsZWN0b3IgdGhlQ29sbGVjdG9yKSB7Ci0JCUpTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dC5nZXRKU1BUcmFuc2xhdGlvbih2aWV3ZXIpOwotCQlyZXR1cm4gbmV3IEpTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCh2aWV3ZXIsIG9mZnNldCwgdGhlQ29sbGVjdG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUpzVHJhbnNsYXRpb24gZ2V0SlNQVHJhbnNsYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCUlKc1RyYW5zbGF0aW9uIGZUcmFuc2xhdGlvbiA9IG51bGw7Ci0JCQotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgZlRyYW5zbGF0aW9uQWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJaWYgKGZUcmFuc2xhdGlvbkFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWZUcmFuc2xhdGlvbiA9IGZUcmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SnNUcmFuc2xhdGlvbih0cnVlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmVHJhbnNsYXRpb247Ci0JfQotCUlUZXh0Vmlld2VyIHZpZXdlcjsKLQkKLQlwcml2YXRlIEpTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dChJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQsIEpTRFRQcm9wb3NhbENvbGxlY3RvciB0aGVDb2xsZWN0b3IpIHsKLQkJc3VwZXIodmlld2VyLCBvZmZzZXQsIG51bGwpOwotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJLy8gdGhpcy5vZmZzZXQ9Z2V0SlNQVHJhbnNsYXRpb24oKS5nZXRKYXZhT2Zmc2V0KG9mZnNldCk7Ci0JCS8vIENvbXBsZXRpb25Qcm9wb3NhbENvbGxlY3RvciB0aGVDb2xsZWN0b3IgPSBnZXRQcm9wb3NhbENvbGxlY3RvcigpOwotCQlzdXBlci5zZXRDb2xsZWN0b3IodGhlQ29sbGVjdG9yKTsKLQl9Ci0JCi0vLyBwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotLy8gcmV0dXJuCi0vLyAoKEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uKWdldEpTUFRyYW5zbGF0aW9uKHZpZXdlcikpLmdldEphdmFEb2N1bWVudCgpOwotLy8gICAgICAKLS8vIH0KLS8vIHByb3RlY3RlZCBDb21wbGV0aW9uUHJvcG9zYWxDb2xsZWN0b3IgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoKSB7Ci0vLyAgICAgICAKLS8vIHJldHVybiAoKENvbXBsZXRpb25Qcm9wb3NhbENvbGxlY3RvcikgKCBuZXcgSlNQUHJvcG9zYWxDb2xsZWN0b3IoCi0vLyBnZXRKU1BUcmFuc2xhdGlvbigpKSApKTsKLS8vIH0KLQkKLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JfQotLy8gcHVibGljIElKYXZhU2NyaXB0VW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7Ci0vLyByZXR1cm4gZ2V0SlNQVHJhbnNsYXRpb24odmlld2VyKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLS8vIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE3MjdhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yIHsKLQkKLQlwdWJsaWMgSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yKCkge30KLQkKLQkKLQkKLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQkvKiBhZGQgPC9zY3JpcHQgaWYgbmVjaXNhcnkgKi8KLQkJQXJyYXlMaXN0IGFsbFByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0SlNQVHJhbnNsYXRpb24odmlld2VyKTsKLQkJCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKWFsbFByb3Bvc2Fscy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2FsbFByb3Bvc2Fscy5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWwgZ2V0RW5kU2NyaXB0UHJvcG9zYWwoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCS8qIGFkZCA8L3NjcmlwdCBpZiBuZWNpc2FyeSAqLwotCQotCQlJSnNUcmFuc2xhdGlvbiB0cmFuID0gZ2V0SlNQVHJhbnNsYXRpb24odmlld2VyKTsKLQkJaWYodHJhbj09bnVsbCkgcmV0dXJuIG51bGw7Ci0JCQotCQlpbnQgbWlzc2luZ0F0T2Zmc2V0ID0gdHJhbi5nZXRNaXNzaW5nVGFnU3RhcnQoKTsKLQkJCi0JCWlmKG9mZnNldD49bWlzc2luZ0F0T2Zmc2V0JiYgbWlzc2luZ0F0T2Zmc2V0Pi0xKSB7Ci0JCQkKLQkJCVN0cmluZyBhbGxUZXh0ID0gdmlld2VyLmdldERvY3VtZW50KCkuZ2V0KCk7Ci0JCQlTdHJpbmcgdGV4dCA9ICI8L3NjcmlwdD4iOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWludCBzdGFydEluVGFnID0gLTE7Ci0JCQkKLQkJCWZvcihpbnQgaT0wO2k8dGV4dC5sZW5ndGgoKSAmJiBhbGxUZXh0Lmxlbmd0aCgpPm9mZnNldC0xO2krKykgewotCQkJCWlmKGFsbFRleHQuY2hhckF0KG9mZnNldC0xKT09dGV4dC5jaGFyQXQoaSkpIHsKLQkJCQkJc3RhcnRJblRhZyA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYoc3RhcnRJblRhZz09LTEgKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlUZXh0ID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJKU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IuMSIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIlxuIiArIHRleHQgKyAiXG4iICxvZmZzZXQsMCxvZmZzZXQsbnVsbCxkaXNwbGF5VGV4dCxudWxsLE1lc3NhZ2VzLmdldFN0cmluZygiSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLjQiKSwxMDApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJCi0JCQlTdHJpbmcgdGV4dDEgPSBhbGxUZXh0LnN1YnN0cmluZyhvZmZzZXQgLSBzdGFydEluVGFnIC0gMSwgb2Zmc2V0KS50b0xvd2VyQ2FzZSgpOwotCQkJU3RyaW5nIHRleHQyID0gdGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRJblRhZysxKS50b0xvd2VyQ2FzZSgpOwotCQkJaWYoc3RhcnRJblRhZz4tMSAgJiYgdGV4dDIuY29tcGFyZVRvKHRleHQxKT09MCApIHsKLQkJCQlTdHJpbmcgZGlzcGxheVRleHQgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIkpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci41Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCh0ZXh0ICAsb2Zmc2V0LXN0YXJ0SW5UYWctMSwwLHRleHQubGVuZ3RoKCksbnVsbCxkaXNwbGF5VGV4dCxudWxsLE1lc3NhZ2VzLmdldFN0cmluZygiSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLjYiKSwxMDApOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByaXZhdGUgSUpzVHJhbnNsYXRpb24gZ2V0SlNQVHJhbnNsYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodmlld2VyLmdldERvY3VtZW50KCkpOwotCQkJSURPTURvY3VtZW50IHhtbERvYyA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQkKLQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIGZUcmFuc2xhdGlvbkFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQotCQkJaWYgKGZUcmFuc2xhdGlvbkFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBmVHJhbnNsYXRpb25BZGFwdGVyLmdldEpzVHJhbnNsYXRpb24odHJ1ZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVFByb3Bvc2FsQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVFByb3Bvc2FsQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTU1MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRQcm9wb3NhbENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS50ZXh0LmphdmEuQ29tcGxldGlvblByb3Bvc2FsQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnRleHQuamF2YS5Db21wbGV0aW9uUHJvcG9zYWxDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotCi0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVFByb3Bvc2FsQ29sbGVjdG9yIGV4dGVuZHMgQ29tcGxldGlvblByb3Bvc2FsQ29sbGVjdG9yIHsKLQlzdGF0aWMgY2hhcltdIGdldFR5cGVUcmlnZ2VycygpIHsKLQkJcmV0dXJuIENvbXBsZXRpb25Qcm9wb3NhbENvbGxlY3Rvci5UWVBFX1RSSUdHRVJTOwotCX0KLQlwcml2YXRlIENvbXBhcmF0b3IgZkNvbXBhcmF0b3I7Ci0JcHJpdmF0ZSBJSnNUcmFuc2xhdGlvbiBmVHJhbnNsYXRpb247Ci0JCi0vLyBwdWJsaWMgTGlzdCBnZXRHZW5lcmF0ZWRGdW5jdGlvbk5hbWVzKCl7Ci0vLyBpZihmR2VuZXJhdGVkRnVuY3Rpb25OYW1lcz09bnVsbCl7Ci0vLyBmR2VuZXJhdGVkRnVuY3Rpb25OYW1lcyA9IGZUcmFuc2xhdGlvbi5nZXRHZW5lcmF0ZWRGdW5jdGlvbk5hbWVzKCk7Ci0vLyB9Ci0vLyByZXR1cm4gZkdlbmVyYXRlZEZ1bmN0aW9uTmFtZXM7Ci0vLyB9Ci0JcHVibGljIEpTRFRQcm9wb3NhbENvbGxlY3RvcihJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbikgewotCQlzdXBlcih0cmFuc2xhdGlvbiE9bnVsbD90cmFuc2xhdGlvbi5nZXRDb21waWxhdGlvblVuaXQoKTpudWxsKTsKLQkJaWYgKHRyYW5zbGF0aW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkpTUFRyYW5zbGF0aW9uIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmVHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogQ2FjbHVhdGVzIHRoZSB3aGVyZSB0aGUgY3Vyc29yIHNob3VsZCBiZSBhZnRlciBhcHBseWluZyB0aGlzIHByb3Bvc2FsLgotCSAqIGVnLiBtZXRob2QofCkgaWYgdGhlIG1ldGhvZCBwcm9wb3NhbCBjaG9zZW4gaGFkIHBhcmFtcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcG9zYWwKLQkgKiBAcGFyYW0gY29tcGxldGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBjYWxjdWxhdGVQb3NpdGlvbkFmdGVyKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCwgU3RyaW5nIGNvbXBsZXRpb24pIHsKLQkJaW50IHBvc2l0aW9uQWZ0ZXIgPSBjb21wbGV0aW9uLmxlbmd0aCgpOwotCQlpbnQga2luZCA9IHByb3Bvc2FsLmdldEtpbmQoKTsKLQkJLy8gbWF5IG5lZWQgYmV0dGVyIGxvZ2ljIGhlcmUuLi4KLQkJLy8gcHV0IGN1cnNvciBpbnNpZGUgcGFyZW50aGVzaXMgaWYgdGhlcmUncyBwYXJhbXMKLQkJLy8gb25seSBjaGVja2luZyBmb3IgYW55IGtpbmQgb2YgZGVjbGFyYXRpb24KLQkJaWYgKGtpbmQgPT0gQ29tcGxldGlvblByb3Bvc2FsLkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiB8fCBraW5kID09IENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfREVDTEFSQVRJT04gfHwga2luZCA9PSBDb21wbGV0aW9uUHJvcG9zYWwuUE9URU5USUFMX01FVEhPRF9ERUNMQVJBVElPTiB8fCBraW5kID09IENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKSB7Ci0JCQlpbnQgcGFyYW1Db3VudCA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJDb3VudChwcm9wb3NhbC5nZXRTaWduYXR1cmUoKSk7Ci0JCQlpZiAoY29tcGxldGlvbi5sZW5ndGgoKSA+IDAgJiYgcGFyYW1Db3VudCA+IDApIHsKLQkJCQlwb3NpdGlvbkFmdGVyLS07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBvc2l0aW9uQWZ0ZXI7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG86IC0gdHJhbnNsYXRlIEphdmEgLT4gSlNQIG9mZnNldHMgLSBmaXgKLQkgKiBjdXJzb3ItcG9zaXRpb24tYWZ0ZXIgLSBmaXggbWFuZ2xlZCBzZXJ2bGV0IG5hbWUgaW4gZGlzcGxheSBzdHJpbmcgLQotCSAqIHJlbW92ZSB1bndhbnRlZCBwcm9wb3NhbHMgKHNlcnZsZXQgY29uc3RydWN0b3IpCi0JICovCi0JCi0JcHJvdGVjdGVkIElKYXZhQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsKSB7Ci0JCUpTRFRDb21wbGV0aW9uUHJvcG9zYWwganNwUHJvcG9zYWwgPSBudWxsOwotCQkvLyBpZ25vcmUgY29uc3RydWN0b3IgcHJvcG9zYWxzICh0aGV5J3JlIG5vdCByZWxldmFudCBmb3Igb3VyIEpTUAotCQkvLyBwcm9wb3NhbCBsaXN0KQotCQlpZiAoIXByb3Bvc2FsLmlzQ29uc3RydWN0b3IoKSkgewotLy8gaWYgKHByb3Bvc2FsLmdldEtpbmQoKSA9PSBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpIHsKLS8vIFN0cmluZyBzaWduYXR1cmUgPSBTdHJpbmcudmFsdWVPZihwcm9wb3NhbAotLy8gLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpOwotLy8gU3RyaW5nIGNvbXBsZXRpb24gPSBTdHJpbmcudmFsdWVPZihwcm9wb3NhbC5nZXRDb21wbGV0aW9uKCkpOwotLy8gaWYgKGNvbXBsZXRpb24uaW5kZXhPZihzaWduYXR1cmUpICE9IC0xKSB7Ci0vLyBqc3BQcm9wb3NhbCA9IGNyZWF0ZUF1dG9JbXBvcnRQcm9wb3NhbChwcm9wb3NhbCk7Ci0vLyB9Ci0vLyB9Ci0JCQkvLyBkZWZhdWx0IGJlaGF2aW9yCi0vLyBpZiAoanNwUHJvcG9zYWwgPT0gbnVsbCkgewotLy8gZm9yKGludCBpID0gMDtpPGdldEdlbmVyYXRlZEZ1bmN0aW9uTmFtZXMoKS5zaXplKCk7aSsrKXsKLS8vIGlmKChuZXcKLS8vIFN0cmluZyhwcm9wb3NhbC5nZXROYW1lKCkpKS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpZ2V0R2VuZXJhdGVkRnVuY3Rpb25OYW1lcygpLmdldChpKSkpCi0vLyByZXR1cm4ganNwUHJvcG9zYWw7Ci0vLyB9Ci0JCQlqc3BQcm9wb3NhbCA9IGNyZWF0ZUpzcFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCS8vIH0KLQkJfQotCQlyZXR1cm4ganNwUHJvcG9zYWw7Ci0JfQotCQotLy8gcHJpdmF0ZSBKU1BDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlQXV0b0ltcG9ydFByb3Bvc2FsKAotLy8gQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsKSB7Ci0vLwotLy8gSlNQQ29tcGxldGlvblByb3Bvc2FsIGpzcFByb3Bvc2FsID0gbnVsbDsKLS8vCi0vLyBTdHJpbmcgc2lnbmF0dXJlID0gbmV3IFN0cmluZyhwcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpKTsKLS8vIFN0cmluZyBjb21wbGV0aW9uID0gbmV3IFN0cmluZyhwcm9wb3NhbC5nZXRDb21wbGV0aW9uKCkpOwotLy8KLS8vIC8vIGl0J3MgZnVsbHkgcXVhbGlmaWVkIHNvIHdlIHNob3VsZAotLy8gLy8gYWRkIGFuIGltcG9ydCBzdGF0ZW1lbnQKLS8vIC8vIGNyZWF0ZSBhbiBhdXRvaW1wb3J0IHByb3Bvc2FsCi0vLyBTdHJpbmcgbmV3Q29tcGxldGlvbiA9IGNvbXBsZXRpb24ucmVwbGFjZUFsbChzaWduYXR1cmUgKyAiLiIsICIiKTsKLS8vIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotLy8KLS8vIC8vIGphdmEgb2Zmc2V0Ci0vLyBpbnQgb2Zmc2V0ID0gcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCk7Ci0vLyAvLyByZXBsYWNlbWVudCBsZW5ndGgKLS8vIGludCBsZW5ndGggPSBwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCkgLSBvZmZzZXQ7Ci0vLyAvLyB0cmFuc2xhdGUgb2Zmc2V0IGZyb20gSmF2YSA+IEpTUAotLy8gb2Zmc2V0ID0gZlRyYW5zbGF0aW9uLmdldEpzcE9mZnNldChvZmZzZXQpOwotLy8gLy8gY3Vyc29yIHBvc2l0aW9uIGFmdGVyIG11c3QgYmUgY2FsY3VsYXRlZAotLy8gaW50IHBvc2l0aW9uQWZ0ZXIgPSBjYWxjdWxhdGVQb3NpdGlvbkFmdGVyKHByb3Bvc2FsLCBuZXdDb21wbGV0aW9uLAotLy8gb2Zmc2V0KTsKLS8vCi0vLyAvLyBmcm9tIGphdmEgcHJvcG9zYWwKLS8vIElKYXZhQ29tcGxldGlvblByb3Bvc2FsIGphdmFQcm9wb3NhbCA9IHN1cGVyCi0vLyAuY3JlYXRlSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbCk7Ci0vLyBwcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpOwotLy8gSW1hZ2UgaW1hZ2UgPSBqYXZhUHJvcG9zYWwuZ2V0SW1hZ2UoKTsKLS8vIFN0cmluZyBkaXNwbGF5U3RyaW5nID0gamF2YVByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKTsKLS8vIGRpc3BsYXlTdHJpbmcgPSBnZXRUcmFuc2xhdGlvbigpLmZpeHVwTWFuZ2xlZE5hbWUoZGlzcGxheVN0cmluZyk7Ci0vLyBJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiA9IGphdmFQcm9wb3NhbAotLy8gLmdldENvbnRleHRJbmZvcm1hdGlvbigpOwotLy8gLy8gZG9uJ3QgZG8gdGhpcywgaXQncyBzbG93Ci0vLyAvLyBTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBqYXZhUHJvcG9zYWwuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotLy8gaW50IHJlbGV2YW5jZSA9IGphdmFQcm9wb3NhbC5nZXRSZWxldmFuY2UoKTsKLS8vCi0vLyBib29sZWFuIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUgPSB0cnVlOwotLy8KLS8vIGpzcFByb3Bvc2FsID0gbmV3IEF1dG9JbXBvcnRQcm9wb3NhbChjb21wbGV0aW9uLCBuZXdDb21wbGV0aW9uLCBvZmZzZXQsCi0vLyBsZW5ndGgsIHBvc2l0aW9uQWZ0ZXIsIGltYWdlLCBkaXNwbGF5U3RyaW5nLAotLy8gY29udGV4dEluZm9ybWF0aW9uLCBudWxsLCByZWxldmFuY2UsIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUpOwotLy8KLS8vIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ0ODMKLS8vIC8vIHNldCB3cmFwcGVkIGphdmEgcHJvcG9zYWwgc28gYWRkaXRpb25hbCBpbmZvIGNhbiBiZSBjYWxjdWxhdGVkIG9uCi0vLyAvLyBkZW1hbmQKLS8vIGpzcFByb3Bvc2FsLnNldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoamF2YVByb3Bvc2FsKTsKLS8vCi0vLyByZXR1cm4ganNwUHJvcG9zYWw7Ci0vLyB9Ci0JcHJpdmF0ZSBKU0RUQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUpzcFByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgewotCQlKU0RUQ29tcGxldGlvblByb3Bvc2FsIGpzcFByb3Bvc2FsOwotCQlTdHJpbmcgY29tcGxldGlvbiA9IFN0cmluZy52YWx1ZU9mKHByb3Bvc2FsLmdldENvbXBsZXRpb24oKSk7Ci0JCS8vIGphdmEgb2Zmc2V0Ci0JCWludCBvZmZzZXQgPSBwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKTsKLQkJLy8gcmVwbGFjZW1lbnQgbGVuZ3RoCi0JCWludCBsZW5ndGggPSBwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCkgLSBvZmZzZXQ7Ci0JCS8vIHRyYW5zbGF0ZSBvZmZzZXQgZnJvbSBKYXZhID4gSlNQCi0JCS8vIGN1cnNvciBwb3NpdGlvbiBhZnRlciBtdXN0IGJlIGNhbGN1bGF0ZWQKLQkJaW50IHBvc2l0aW9uQWZ0ZXIgPSBjYWxjdWxhdGVQb3NpdGlvbkFmdGVyKHByb3Bvc2FsLCBjb21wbGV0aW9uKTsKLQkJLy8gZnJvbSBqYXZhIHByb3Bvc2FsCi0JCUlKYXZhQ29tcGxldGlvblByb3Bvc2FsIGphdmFQcm9wb3NhbCA9IHN1cGVyLmNyZWF0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwpOwotCQlwcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpOwotCQlJbWFnZSBpbWFnZSA9IGphdmFQcm9wb3NhbC5nZXRJbWFnZSgpOwotCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9IGphdmFQcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCk7Ci0JCWRpc3BsYXlTdHJpbmcgPSBnZXRUcmFuc2xhdGlvbigpLmZpeHVwTWFuZ2xlZE5hbWUoZGlzcGxheVN0cmluZyk7Ci0vLyBmb3IoaW50IGkgPSAwO2k8Z2V0R2VuZXJhdGVkRnVuY3Rpb25OYW1lcygpLnNpemUoKTtpKyspewotLy8gZGlzcGxheVN0cmluZy5yZXBsYWNlKChTdHJpbmcpZ2V0R2VuZXJhdGVkRnVuY3Rpb25OYW1lcygpLmdldChpKSwgIiIpOwotLy8gfQotCQlJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiA9IGphdmFQcm9wb3NhbC5nZXRDb250ZXh0SW5mb3JtYXRpb24oKTsKLQkJLy8gU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gamF2YVByb3Bvc2FsLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJaW50IHJlbGV2YW5jZSA9IGphdmFQcm9wb3NhbC5nZXRSZWxldmFuY2UoKTsKLQkJYm9vbGVhbiB1cGRhdGVMZW5ndGhPblZhbGlkYXRlID0gdHJ1ZTsKLQkJanNwUHJvcG9zYWwgPSBuZXcgSlNEVENvbXBsZXRpb25Qcm9wb3NhbChjb21wbGV0aW9uLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb25BZnRlciwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwgbnVsbCwgcmVsZXZhbmNlLCB1cGRhdGVMZW5ndGhPblZhbGlkYXRlKTsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4MwotCQkvLyBzZXQgd3JhcHBlZCBqYXZhIHByb3Bvc2FsIHNvIGFkZGl0aW9uYWwgaW5mbyBjYW4gYmUgY2FsY3VsYXRlZCBvbgotCQkvLyBkZW1hbmQKLQkJanNwUHJvcG9zYWwuc2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbChqYXZhUHJvcG9zYWwpOwotCQlyZXR1cm4ganNwUHJvcG9zYWw7Ci0JfQotCQotCXByaXZhdGUgQ29tcGFyYXRvciBnZXRDb21wYXJhdG9yKCkgewotCQlpZiAoZkNvbXBhcmF0b3IgPT0gbnVsbCkgewotCQkJZkNvbXBhcmF0b3IgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsQ29tcGFyYXRvcigpOwotCQl9Ci0JCXJldHVybiBmQ29tcGFyYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IHdlIG9ubHkgcmV0dXJuIEpTUENvbXBsZXRpb25Qcm9wb3NhbHMuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBKU1BDb21wbGV0aW9uUHJvcG9zYWxzCi0JICovCi0JcHVibGljIEpTRFRDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRKU1BDb21wbGV0aW9uUHJvcG9zYWxzKCkgewotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlKYXZhQ29tcGxldGlvblByb3Bvc2FsW10gamF2YVByb3Bvc2FscyA9IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCS8vIG5lZWQgdG8gZmlsdGVyIG91dCBub24gSlNQQ29tcGxldGlvblByb3Bvc2FscwotCQkvLyBiZWNhdXNlIHRoZWlyIG9mZnNldHMgaGF2ZW4ndCBiZWVuIHRyYW5zbGF0ZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXZhUHJvcG9zYWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoamF2YVByb3Bvc2Fsc1tpXSBpbnN0YW5jZW9mIEpTRFRDb21wbGV0aW9uUHJvcG9zYWwpIHsKLQkJCQlyZXN1bHRzLmFkZChqYXZhUHJvcG9zYWxzW2ldKTsKLQkJCX0KLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMsIGdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiAoSlNEVENvbXBsZXRpb25Qcm9wb3NhbFtdKSByZXN1bHRzLnRvQXJyYXkobmV3IEpTRFRDb21wbGV0aW9uUHJvcG9zYWxbcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIElKc1RyYW5zbGF0aW9uIGdldFRyYW5zbGF0aW9uKCkgewotCQlyZXR1cm4gZlRyYW5zbGF0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVFRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVFRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOTgxNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRUZW1wbGF0ZUFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuVGVtcGxhdGVDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS50ZXh0LmphdmEuSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU0RUVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3IgewotCVRlbXBsYXRlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgZkphdmFUZW1wbGF0ZUNvbXBsZXRpb247Ci0JSlNEVFByb3Bvc2FsQ29sbGVjdG9yIGZQcm9wb3NhbENvbGxlY3RvcjsKLQlKc1RyYW5zbGF0aW9uQWRhcHRlciBmVHJhbnNsYXRpb25BZGFwdGVyOwotCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQkKLQlwdWJsaWMgSlNEVFRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yKCkgewotCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQl9Ci0JCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0ID0gZ2V0SW52b2NhdGlvbkNvbnRleHQodmlld2VyLCBvZmZzZXQpOwotCQlMaXN0IHByb3BzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcigpLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGNvbnRleHQsIG1vbml0b3IpOwotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcHJvcHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHt9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGdldEludm9jYXRpb25Db250ZXh0KElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gSlNEVENvbnRldEFzc2lzdEludm9jYXRpb25Db250ZXh0LmdldEluc3RhbmNlKHZpZXdlciwgb2Zmc2V0LCBnZXRQcm9wb3NhbENvbGxlY3RvcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpTRFRQcm9wb3NhbENvbGxlY3RvciBnZXRQcm9wb3NhbENvbGxlY3RvcigpIHsKLQkJcmV0dXJuIGZQcm9wb3NhbENvbGxlY3RvcjsKLQkJLy8gcmV0dXJuIG5ldyBKU1BQcm9wb3NhbENvbGxlY3Rvcih0cmFuc2xhdGlvbik7Ci0JfQotCQotCXByaXZhdGUgVGVtcGxhdGVDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyKCkgewotCQlpZiAoZkphdmFUZW1wbGF0ZUNvbXBsZXRpb24gPT0gbnVsbCkgewotCQkJZkphdmFUZW1wbGF0ZUNvbXBsZXRpb24gPSBuZXcgVGVtcGxhdGVDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcigpOwotCQl9Ci0JCXJldHVybiBmSmF2YVRlbXBsYXRlQ29tcGxldGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvcG9zYWxDb2xsZWN0b3IoSlNEVFByb3Bvc2FsQ29sbGVjdG9yIHRyYW5zbGF0aW9uKSB7Ci0JCXRoaXMuZlByb3Bvc2FsQ29sbGVjdG9yID0gdHJhbnNsYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5ZTIxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZGY4MDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLjE9PD4gZW5kIHdpdGggPC9zY3JpcHQ+Ci1KU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IuND1DbG9zZSB0aGUgc2NyaXB0IHRhZy4KLUpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci41PTw+IGVuZCB3aXRoIDwvc2NyaXB0PgotSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLjY9Q2xvc2UgdGhlIHNjcmlwdCB0YWcuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5M2Q0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZGVyaXZlZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2luZ2xlQ2hhclJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudCBhcyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGNoOwotCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAtMSkgewotCQkJYnVmLmFwcGVuZCgoY2hhcikgY2gpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZCgpCi0JICovCi0JCi0JcHVibGljIGFic3RyYWN0IGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWQoY2hhcltdLGludCxpbnQpCi0JICovCi0JCi0JcHVibGljIGludCByZWFkKGNoYXIgY2J1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgZW5kID0gb2ZmICsgbGVuOwotCQlmb3IgKGludCBpID0gb2ZmOyBpIDwgZW5kOyBpKyspIHsKLQkJCWludCBjaCA9IHJlYWQoKTsKLQkJCWlmIChjaCA9PSAtMSkgewotCQkJCWlmIChpID09IG9mZikgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCXJldHVybiBpIC0gb2ZmOwotCQkJfQotCQkJY2J1ZltpXSA9IChjaGFyKSBjaDsKLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkeSgpCi0JICovCi0JCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2VkaXRvci9BY3Rpb25Db250cmlidXRvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9lZGl0b3IvQWN0aW9uQ29udHJpYnV0b3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E5ZjVkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2VkaXRvci9BY3Rpb25Db250cmlidXRvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWkuQWN0aW9uQ29udHJpYnV0b3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuUmVmYWN0b3JBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSUFjdGlvbkNvbnN0YW50c0pzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5JQWN0aW9uRGVmaW5pdGlvbklkc0pzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLlN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEFjdGlvbkNvbnRyaWJ1dG9ySlNQIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0b3JIVE1MIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZSIsICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwcml2YXRlIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBtb3ZlRWxlbWVudEFjdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJTWVudU1hbmFnZXIgcmVmYWN0b3JNZW51ID0gbnVsbDsKLQlwcml2YXRlIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiByZW5hbWVFbGVtZW50QWN0aW9uID0gbnVsbDsKLQkKLQlwdWJsaWMgQWN0aW9uQ29udHJpYnV0b3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IEpzVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKGJ1bmRsZSwgSUFjdGlvbkNvbnN0YW50c0pzLkFDVElPTl9OQU1FX1JFTkFNRV9FTEVNRU5UICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCXRoaXMucmVuYW1lRWxlbWVudEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUFjdGlvbkRlZmluaXRpb25JZHNKcy5SRU5BTUVfRUxFTUVOVCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uLCBJSGVscENvbnRleHRJZHMuSlNQX1JFRkFDVE9SUkVOQU1FX0hFTFBJRCk7Ci0JCXRoaXMubW92ZUVsZW1lbnRBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKGJ1bmRsZSwgSUFjdGlvbkNvbnN0YW50c0pzLkFDVElPTl9OQU1FX01PVkVfRUxFTUVOVCArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVOREVSU0NPUkUpOwotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJQWN0aW9uRGVmaW5pdGlvbklkc0pzLk1PVkVfRUxFTUVOVCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5tb3ZlRWxlbWVudEFjdGlvbiwgSUhlbHBDb250ZXh0SWRzLkpTUF9SRUZBQ1RPUk1PVkVfSEVMUElEKTsKLQkJLy8gdGhlIHJlZmFjdG9yIG1lbnUsIGFkZCB0aGUgbWVudSBpdHNlbGYgdG8gYWRkIGFsbCByZWZhY3RvciBhY3Rpb25zCi0JCXRoaXMucmVmYWN0b3JNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKEpzVUlNZXNzYWdlcy5BY3Rpb25Db250cmlidXRvckpTUF8wLCBSZWZhY3RvckFjdGlvbkdyb3VwLk1FTlVfSUQpOwotCQlyZWZhY3Rvck1lbnUuYWRkKHRoaXMucmVuYW1lRWxlbWVudEFjdGlvbik7Ci0JCXJlZmFjdG9yTWVudS5hZGQodGhpcy5tb3ZlRWxlbWVudEFjdGlvbik7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRvTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5hZGRUb01lbnUobWVudSk7Ci0JCW1lbnUuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQsIHRoaXMucmVmYWN0b3JNZW51KTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4dGVuc2lvbklEcygpIHsKLQkJcmV0dXJuIEFjdGlvbkNvbnRyaWJ1dG9ySlNQLkVESVRPUl9JRFM7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCXRoaXMucmVuYW1lRWxlbWVudEFjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKGdldFRleHRFZGl0b3IoZ2V0QWN0aXZlRWRpdG9yUGFydCgpKSwgSUFjdGlvbkNvbnN0YW50c0pzLkFDVElPTl9OQU1FX1JFTkFNRV9FTEVNRU5UKSk7Ci0JCXRoaXMubW92ZUVsZW1lbnRBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbihnZXRUZXh0RWRpdG9yKGdldEFjdGl2ZUVkaXRvclBhcnQoKSksIElBY3Rpb25Db25zdGFudHNKcy5BQ1RJT05fTkFNRV9NT1ZFX0VMRU1FTlQpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJc3VwZXIuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChlbmFibGVkKTsKLQkJdGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMubW92ZUVsZW1lbnRBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDQxOGZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlQbHVnaW47Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElIZWxwQ29udGV4dElkcyB7Ci0JLy8gSlNQIEZyYWdtZW50IFByb3BlcnR5IFBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRlJBR01FTlRfSEVMUElEID0gSUhlbHBDb250ZXh0SWRzLlBSRUZJWCArICJqc3BmMTAwMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAvLyBmaWd1cmVkIG91dCBvbiB0aGUgZmx5Ci0JLy8gLy8gSlNQIFNvdXJjZSBwYWdlIGVkaXRvcgotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9TT1VSQ0VWSUVXX0hFTFBJRCA9Ci0JLy8gQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCArIl9zb3VyY2VfSGVscElkIjsgLy8kTk9OLU5MUy0xJAotCS8vIEpTUCBOZXcgRmlsZSBXaXphcmQgLSBUZW1wbGF0ZSBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQgPSBJSGVscENvbnRleHRJZHMuUFJFRklYICsgImpzcHcwMDEwIjsgLy8kTk9OLU5MUy0xJAotCS8vIEpTUCBGaWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUFJFRldFQlhfRklMRVNfSEVMUElEID0gSUhlbHBDb250ZXh0SWRzLlBSRUZJWCArICJ3ZWJ4MDA1MCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBKU1AgU3R5bGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEID0gSUhlbHBDb250ZXh0SWRzLlBSRUZJWCArICJ3ZWJ4MDA1MSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBKU1AgVGVtcGxhdGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEID0gSUhlbHBDb250ZXh0SWRzLlBSRUZJWCArICJ3ZWJ4MDA1MiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBSZWZhY3RvciBNb3ZlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1JFRkFDVE9STU9WRV9IRUxQSUQgPSBJSGVscENvbnRleHRJZHMuUFJFRklYICsgImpzcHIwMDIwIjsgLy8kTk9OLU5MUy0xJAotCS8vIEpTUCBTb3VyY2UgRWRpdG9yIENvbnRleHQgTWVudQotCS8vIFJlZmFjdG9yIFJlbmFtZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9SRUZBQ1RPUlJFTkFNRV9IRUxQSUQgPSBJSGVscENvbnRleHRJZHMuUFJFRklYICsgImpzcHIwMDEwIjsgLy8kTk9OLU5MUy0xJAotCS8vIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBKc1VJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXR0aW5nU3RyYXRlZ3lKU0RULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXR0aW5nU3RyYXRlZ3lKU0RULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDYyNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVHlwZWRQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmV4dC51dGlsLkNvZGVGb3JtYXR0ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVCBleHRlbmRzIENvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSB7Ci0JLyoqIG1hdGNoZXMgb24gLy8tLT4gYXQgZW5kIG9mIHNjcmlwdCByZWdpb24gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEVORF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCIoKC8vLiotLT5cXHMqKVxceikiKTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCByZWdpb25TdGFydEluZGVudExldmVsID0gMTsKLQkvKiogRG9jdW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZEb2N1bWVudHMgPSBuZXcgTGlua2VkTGlzdCgpOwotCS8qKiBQYXJ0aXRpb25zIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZQYXJ0aXRpb25zID0gbmV3IExpbmtlZExpc3QoKTsKLQlwcml2YXRlIGludCBzdGFydEluZGVudExldmVsOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgamF2YSBmb3JtYXR0aW5nIHN0cmF0ZWd5LgotCSAqLwotCXB1YmxpYyBGb3JtYXR0aW5nU3RyYXRlZ3lKU0RUKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQljbGFzcyBNb2RlbElycml0YW50IGltcGxlbWVudHMgSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIgewotCQlwdWJsaWMgTW9kZWxJcnJpdGFudChJRG9jdW1lbnQgYXR0YWNoZWREb2MpIHt9Ci0JCQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQlkb2N1bWVudC5yZW1vdmVEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKHRoaXMpOwotCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQl0cnkgewotCQkJCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkucmVwbGFjZSgwLCBkb2N1bWVudC5nZXRMZW5ndGgoKSwgZG9jdW1lbnQuZ2V0KCkpOwotCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0KCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBmb3JtYXQoKSB7Ci0JCXN1cGVyLmZvcm1hdCgpOwotCQlmaW5hbCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudHMucmVtb3ZlRmlyc3QoKTsKLQkJZmluYWwgVHlwZWRQb3NpdGlvbiBwYXJ0aXRpb24gPSAoVHlwZWRQb3NpdGlvbikgZlBhcnRpdGlvbnMucmVtb3ZlRmlyc3QoKTsKLQkJCi0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkvL2NhbGN1bGF0ZSB0aGUgaW5kZW50IG9mIHRoZSBsZWFkaW5nIDxzY3JpcHQ+IHRhZyBiZWNhdXNlIHdlIG5lZWQgdG8gYWRkIHRoYXQgaW5kZW50IGxldmVsIHRvIHRoZSBKUyBpbmRlbnQgbGV2ZWwKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2NyaXB0VGFnU3RhcnRSZWdpb24gPSBkb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwYXJ0aXRpb24ub2Zmc2V0LTEpOwotCQkJU3RyaW5nIHNjcmlwdFJlZ2lvbkluZGVudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZihzY3JpcHRUYWdTdGFydFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IHNjcmlwdFJlZ2lvbkluZGVudExldmVsID0gZ2V0SW5kZW50T2ZMaW5lKGRvY3VtZW50LGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzY3JpcHRUYWdTdGFydFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKSkubGVuZ3RoKCk7Ci0JCQkJCXNjcmlwdFJlZ2lvbkluZGVudCA9IGdldEluZGVudGF0aW9uU3RyaW5nKGdldFByZWZlcmVuY2VzKCksIHNjcmlwdFJlZ2lvbkluZGVudExldmVsKTsKLQkJCQkJdGhpcy5zdGFydEluZGVudExldmVsICs9IHNjcmlwdFJlZ2lvbkluZGVudExldmVsOwotCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ291bGQgbm90IGNhbGN1bGF0ZSBzdGFydGluZyBpbmRlbnQgb2YgdGhlIHNjcmlwdCByZWdpb24sIHVzaW5nIDAiLCBlKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkKLQkJCVN0cmluZyBsaW5lRGVsaW0gPSBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKGRvY3VtZW50KTsKLQkJCXRyeSB7Ci0JCQkJLy9nZXQgdGhlIEpTIHRleHQgZnJvbSB0aGUgZG9jdW1lbnQgKG5vdCB0cmFuc2xhdGVkKQotCQkJCVN0cmluZyBqc1RleHROb3RUcmFuc2xhdGVkID0gZG9jdW1lbnQuZ2V0KHBhcnRpdGlvbi5nZXRPZmZzZXQoKSwgcGFydGl0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkKLQkJCQkvL2RlYWwgd2l0aCBnZXR0aW5nIHRoZSBKUyB0ZXh0IGFuZCB1bndyYXBwaW5nIGl0IGZyb20gYW55IDwhLS0gLy8tLT4gc3RhdGVtZW50cwotCQkJCVN0cmluZyBwcmVUZXh0ID0gIiI7Ci0JCQkJU3RyaW5nIHBvc3RUZXh0ID0gbGluZURlbGltICsgc2NyaXB0UmVnaW9uSW5kZW50OwotCi0JCQkJLy9maW5kIHN0YXJ0IGNvbW1lbnQgdGFnCi0JCQkJUGF0dGVybiBzdGFydFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIihcXEEoXFxzKjwhLS0uKigiICsgbGluZURlbGltICsgIik/KSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCU1hdGNoZXIgbWF0Y2hlciA9IHN0YXJ0UGF0dGVybi5tYXRjaGVyKGpzVGV4dE5vdFRyYW5zbGF0ZWQpOwotCQkJCWlmKG1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJCWpzVGV4dE5vdFRyYW5zbGF0ZWQgPSBtYXRjaGVyLnJlcGxhY2VGaXJzdCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJlVGV4dCA9IGxpbmVEZWxpbSArIHNjcmlwdFJlZ2lvbkluZGVudCArIG1hdGNoZXIuZ3JvdXAoKS50cmltKCk7Ci0JCQkJfQotCQkJCQotCQkJCS8vZmluZCBlbmQgdGFnCi0JCQkJbWF0Y2hlciA9IEVORF9QQVRURVJOLm1hdGNoZXIoanNUZXh0Tm90VHJhbnNsYXRlZCk7Ci0JCQkJaWYobWF0Y2hlci5maW5kKCkpIHsKLQkJCQkJanNUZXh0Tm90VHJhbnNsYXRlZCA9IG1hdGNoZXIucmVwbGFjZUZpcnN0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwb3N0VGV4dCA9IGxpbmVEZWxpbSArIHNjcmlwdFJlZ2lvbkluZGVudCArIG1hdGNoZXIuZ3JvdXAoKS50cmltKCkgKyBwb3N0VGV4dDsKLQkJCQl9Ci0JCQkJCi0JCQkJLy9yZXBsYWNlIHRoZSB0ZXh0IGluIHRoZSBkb2N1bWVudCB3aXRoIHRoZSBub25lLXRyYW5zbGF0ZWQgSlMgdGV4dCBidXQgd2l0aG91dCBIVE1MIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGNvbW1lbnRzCi0JCQkJVGV4dEVkaXQgcmVwbGFjZUVkaXQgPSBuZXcgUmVwbGFjZUVkaXQocGFydGl0aW9uLmdldE9mZnNldCgpLCBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCksIGpzVGV4dE5vdFRyYW5zbGF0ZWQpOwotCQkJCXJlcGxhY2VFZGl0LmFwcGx5KGRvY3VtZW50KTsKLQkJCQlpbnQganNSZWdpb25MZW5ndGggPSBqc1RleHROb3RUcmFuc2xhdGVkLmxlbmd0aCgpOwotCQkJCQotCQkJCS8vdHJhbnNsYXRlIHRoZSB1cGRhdGVkIGRvY3VtZW50Ci0JCQkJSUpzVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBnZXRUcmFuc2xhdGlvbihkb2N1bWVudCk7Ci0JCQkJU3RyaW5nIGpzVGV4dFRyYW5zbGF0ZWQgPSB0cmFuc2xhdGlvbi5nZXRKc1RleHQoKTsKLQkJCQkKLQkJCQkvL2Zvcm1hdCB0aGUgdGV4dCB0cmFuc2xhdGVkIHRleHQKLQkJCQlUZXh0RWRpdCBlZGl0ID0gQ29kZUZvcm1hdHRlclV0aWwuZm9ybWF0MihDb2RlRm9ybWF0dGVyLktfSkFWQVNDUklQVF9VTklULCBqc1RleHRUcmFuc2xhdGVkLCBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCksIGpzUmVnaW9uTGVuZ3RoLCBzdGFydEluZGVudExldmVsLCBsaW5lRGVsaW0sIGdldFByZWZlcmVuY2VzKCkpOwotCQkJCUlEb2N1bWVudCBqc0RvYyA9IG5ldyBEb2N1bWVudChqc1RleHRUcmFuc2xhdGVkKTsKLQkJCQkKLQkJCQkvL1VuZG8gdGhlIHRleHQgcmVwbGFjZW1lbnRzIGRvbmUgYnkgdGhlIHRyYW5zbGF0b3Igc28gdGhhdCBpdCBjb3VsZCBidWlsZCBhIENVIGZvciB0aGUgSlMgcmVnaW9uCi0JCQkJaWYodHJhbnNsYXRpb24gaW5zdGFuY2VvZiBKc1RyYW5zbGF0aW9uKSB7Ci0JCQkJCUlKc1RyYW5zbGF0b3IgdHJhbnNsYXRvciA9ICgoSnNUcmFuc2xhdGlvbil0cmFuc2xhdGlvbikuZ2V0VHJhbnNsYXRvcigpOwotCQkJCQkKLQkJCQkJaWYodHJhbnNsYXRvciBpbnN0YW5jZW9mIEpzVHJhbnNsYXRvcikgewotCQkJCQkJUmVnaW9uW10gcmVnaW9ucyA9ICgoSnNUcmFuc2xhdG9yKXRyYW5zbGF0b3IpLmdldEdlbmVyYXRlZFJhbmdlcygpOwotCQkJCQkJLy9mb3IgZWFjaCBnZW5lcmF0ZWQgcmFuZ2UsIHJlcGxhY2UgaXQgd2l0aCB0aGUgb3JpZ2luYWwgdGV4dAotCQkJCQkJZm9yKGludCByID0gMDsgciA8IHJlZ2lvbnMubGVuZ3RoOyArK3IpIHsKLQkJCQkJCQlqc0RvYy5yZXBsYWNlKHJlZ2lvbnNbcl0uZ2V0T2Zmc2V0KCksIHJlZ2lvbnNbcl0uZ2V0TGVuZ3RoKCksCi0JCQkJCQkJCQlkb2N1bWVudC5nZXQocmVnaW9uc1tyXS5nZXRPZmZzZXQoKSwgcmVnaW9uc1tyXS5nZXRMZW5ndGgoKSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8qIGVycm9yIGZvcm1hdGluZyB0aGUgY29kZSBzbyBhYm9ydCAqLwotCQkJCWlmKGVkaXQ9PW51bGwpIHJldHVybjsKLQkJCQllZGl0LmFwcGx5KGpzRG9jKTsKLQkJCQlTdHJpbmcgcmVwbGFjZVRleHQgPSBsaW5lRGVsaW0gKyBnZXRJbmRlbnRhdGlvblN0cmluZyhnZXRQcmVmZXJlbmNlcygpLCBzdGFydEluZGVudExldmVsKSArIChqc0RvYy5nZXQoZWRpdC5nZXRPZmZzZXQoKSwgZWRpdC5nZXRMZW5ndGgoKSkpLnRyaW0oKTsKLQkJCQkKLQkJCQkvL2FwcGx5IGVkaXQgdG8gaHRtbCBkb2MgdXNpbmcgdGhlIGZvcm1hdGVkIHRyYW5zbGF0ZWQgdGV4dCBhbmQgdGhlIHBvc3NpYmxlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGh0bWwgY29tbWVudHMKLQkJCQlyZXBsYWNlVGV4dCA9IHByZVRleHQgKyByZXBsYWNlVGV4dCArIHBvc3RUZXh0OwotCQkJCXJlcGxhY2VFZGl0ID0gbmV3IFJlcGxhY2VFZGl0KHBhcnRpdGlvbi5nZXRPZmZzZXQoKSwganNSZWdpb25MZW5ndGgsIHJlcGxhY2VUZXh0KTsKLQkJCQlyZXBsYWNlRWRpdC5hcHBseShkb2N1bWVudCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdGFydHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0KQotCSAqLwotCQotCXB1YmxpYyB2b2lkIGZvcm1hdHRlclN0YXJ0cyhmaW5hbCBJRm9ybWF0dGluZ0NvbnRleHQgY29udGV4dCkgewotCQlmUGFydGl0aW9ucy5hZGRMYXN0KGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfUEFSVElUSU9OKSk7Ci0JCWZEb2N1bWVudHMuYWRkTGFzdChjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX01FRElVTSkpOwotCQlzdGFydEluZGVudExldmVsID0gRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVC5yZWdpb25TdGFydEluZGVudExldmVsICsgMDsKLQkJTWFwIHByb2plY3RPcHRpb25zID0gKE1hcCkgY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9QUkVGRVJFTkNFUyk7Ci0JCWlmIChwcm9qZWN0T3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jID0gKElEb2N1bWVudCkgY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9NRURJVU0pOwotCQkJY29udGV4dC5zZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9QUkVGRVJFTkNFUywgZ2V0UHJvamVjdE9wdGlvbnMoZG9jKSk7Ci0JCX0KLQkJc3VwZXIuZm9ybWF0dGVyU3RhcnRzKGNvbnRleHQpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdHRlclN0b3BzKCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdG9wcygpIHsKLQkJc3VwZXIuZm9ybWF0dGVyU3RvcHMoKTsKLQkJZlBhcnRpdGlvbnMuY2xlYXIoKTsKLQkJZkRvY3VtZW50cy5jbGVhcigpOwotCQlzdGFydEluZGVudExldmVsID0gMDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJbmRlbnRhdGlvblN0cmluZyhNYXAgb3B0aW9ucywgaW50IGluZGVudGF0aW9uTGV2ZWwpIHsKLQkJRGVmYXVsdENvZGVGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbmV3IERlZmF1bHRDb2RlRm9ybWF0dGVyKG9wdGlvbnMpOwotCQlyZXR1cm4gZm9ybWF0dGVyLmNyZWF0ZUluZGVudGF0aW9uU3RyaW5nKGluZGVudGF0aW9uTGV2ZWwpOwotCX0KLQkKLQlwcml2YXRlIE1hcCBnZXRQcm9qZWN0T3B0aW9ucyhJRG9jdW1lbnQgYmFzZURvY3VtZW50KSB7Ci0JCUlKYXZhU2NyaXB0UHJvamVjdCBqYXZhUHJvamVjdCA9IG51bGw7Ci0JCU1hcCBvcHRpb25zID0gbnVsbDsKLQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLmdldFRleHRGaWxlQnVmZmVyKGJhc2VEb2N1bWVudCk7Ci0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJUGF0aCBmaWxlUGF0aCA9IGJ1ZmZlci5nZXRMb2NhdGlvbigpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQkJcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChmaWxlUGF0aC5zZWdtZW50KDApKTsKLQkJCX0KLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlqYXZhUHJvamVjdCA9IEphdmFTY3JpcHRDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCX0KLQkJfQotCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IGphdmFQcm9qZWN0LmdldE9wdGlvbnModHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCQotCXB1YmxpYyBJSnNUcmFuc2xhdGlvbiBnZXRUcmFuc2xhdGlvbihJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlKc1RyYW5zbGF0aW9uIHRyYW4gPSBudWxsOwotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgdHJhbnNsYXRpb25BZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQlpZiAodHJhbnNsYXRpb25BZGFwdGVyICE9IG51bGwpIHsKLQkJCQl0cmFuID0gdHJhbnNsYXRpb25BZGFwdGVyLmdldEpzVHJhbnNsYXRpb24odHJ1ZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cmFuOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZAotCSAqIEBwYXJhbSBsaW5lCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuamF2YS5KYXZhQXV0b0luZGVudFN0cmF0ZWd5I2dldEluZGVudE9mTGluZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudE9mTGluZShJRG9jdW1lbnQgZCwgaW50IGxpbmUpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChsaW5lID4gLTEpIHsKLQkJCWludCBzdGFydD0gZC5nZXRMaW5lT2Zmc2V0KGxpbmUpOwotCQkJaW50IGVuZD0gc3RhcnQgKyBkLmdldExpbmVMZW5ndGgobGluZSkgLSAxOwotCQkJaW50IHdoaXRlRW5kPSBmaW5kRW5kT2ZXaGl0ZVNwYWNlKGQsIHN0YXJ0LCBlbmQpOwotCQkJcmV0dXJuIGQuZ2V0KHN0YXJ0LCB3aGl0ZUVuZCAtIHN0YXJ0KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IG9mZnNldCBncmVhdGVyIHRoYW4gPGNvZGU+b2Zmc2V0PC9jb2RlPiBhbmQgc21hbGxlciB0aGFuCi0JICogPGNvZGU+ZW5kPC9jb2RlPiB3aG9zZSBjaGFyYWN0ZXIgaXMgbm90IGEgc3BhY2Ugb3IgdGFiIGNoYXJhY3Rlci4gSWYgbm8gc3VjaAotCSAqIG9mZnNldCBpcyBmb3VuZCwgPGNvZGU+ZW5kPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQgdG8gc2VhcmNoIGluCi0JICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGF0IHdoaWNoIHNlYXJjaGluZyBzdGFydAotCSAqIEBwYXJhbSBlbmQgdGhlIG9mZnNldCBhdCB3aGljaCBzZWFyY2hpbmcgc3RvcHMKLQkgKiBAcmV0dXJuIHRoZSBvZmZzZXQgaW4gdGhlIHNwZWNpZmllZCByYW5nZSB3aG9zZSBjaGFyYWN0ZXIgaXMgbm90IGEgc3BhY2Ugb3IgdGFiCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbiBpZiBwb3NpdGlvbiBpcyBhbiBpbnZhbGlkIHJhbmdlIGluIHRoZSBnaXZlbiBkb2N1bWVudAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0SW5kZW50TGluZUF1dG9FZGl0U3RyYXRlZ3kjZmluZEVuZE9mV2hpdGVTcGFjZQotCSAqLwotCXByaXZhdGUgaW50IGZpbmRFbmRPZldoaXRlU3BhY2UoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgZW5kKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAob2Zmc2V0IDwgZW5kKSB7Ci0JCQljaGFyIGM9IGRvY3VtZW50LmdldENoYXIob2Zmc2V0KTsKLQkJCWlmIChjICE9ICcgJyAmJiBjICE9ICdcdCcpIHsKLQkJCQlyZXR1cm4gb2Zmc2V0OwotCQkJfQotCQkJb2Zmc2V0Kys7Ci0JCX0KLQkJcmV0dXJuIGVuZDsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMThjNDI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1jbGFzcyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElFZGl0b3JJbnB1dCwgSUxvY2F0aW9uUHJvdmlkZXIgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluawotCS8qKgotCSAqIFRoZSB3b3JrYmVuY2ggYWRhcHRlciB3aGljaCBzaW1wbHkgcHJvdmlkZXMgdGhlIGxhYmVsLgotCSAqIAotCSAqIEBzZWUgRWNsaXBzZSAzLjEKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFdvcmtiZW5jaEFkYXB0ZXIgaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciB7Ci0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRMYWJlbChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotCQkJcmV0dXJuICgoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIG8pLmdldE5hbWUoKTsKLQkJfQotCQkKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQlwcml2YXRlIEZpbGUgZkZpbGU7Ci0JcHJpdmF0ZSBXb3JrYmVuY2hBZGFwdGVyIGZXb3JrYmVuY2hBZGFwdGVyID0gbmV3IFdvcmtiZW5jaEFkYXB0ZXIoKTsKLQkKLQlwdWJsaWMgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQoRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZGaWxlID0gZmlsZTsKLQkJZldvcmtiZW5jaEFkYXB0ZXIgPSBuZXcgV29ya2JlbmNoQWRhcHRlcigpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG8gaW5zdGFuY2VvZiBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgewotCQkJRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSAoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIG87Ci0JCQlyZXR1cm4gZkZpbGUuZXF1YWxzKGlucHV0LmZGaWxlKTsKLQkJfQotCQlpZiAobyBpbnN0YW5jZW9mIElQYXRoRWRpdG9ySW5wdXQpIHsKLQkJCUlQYXRoRWRpdG9ySW5wdXQgaW5wdXQgPSAoSVBhdGhFZGl0b3JJbnB1dCkgbzsKLQkJCXJldHVybiBnZXRQYXRoKCkuZXF1YWxzKGlucHV0LmdldFBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2V4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlyZXR1cm4gZkZpbGUuZXhpc3RzKCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSUxvY2F0aW9uUHJvdmlkZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQlpZiAoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQlyZXR1cm4gZldvcmtiZW5jaEFkYXB0ZXI7Ci0JCX0KLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmRmlsZS5nZXROYW1lKCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0I2dldFBhdGgoKQotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIFBhdGguZnJvbU9TU3RyaW5nKGZGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5JTG9jYXRpb25Qcm92aWRlciNnZXRQYXRoKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElQYXRoIGdldFBhdGgoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgewotCQkJRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSAoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcoaW5wdXQuZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFBlcnNpc3RhYmxlKCkKLQkgKi8KLQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiBmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmRmlsZS5oYXNoQ29kZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTA1ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIEV4dGVybmFsRmlsZUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluawotCXByaXZhdGUgRmlsZSBmSHlwZXJsaW5rRmlsZTsKLQlwcml2YXRlIElSZWdpb24gZkh5cGVybGlua1JlZ2lvbjsKLQkKLQlwdWJsaWMgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBGaWxlIGZpbGUpIHsKLQkJZkh5cGVybGlua0ZpbGUgPSBmaWxlOwotCQlmSHlwZXJsaW5rUmVnaW9uID0gcmVnaW9uOwotCX0KLQkKLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmSHlwZXJsaW5rUmVnaW9uOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCVN0cmluZyBwYXRoID0gZkh5cGVybGlua0ZpbGUuZ2V0UGF0aCgpOwotCQlpZiAocGF0aC5sZW5ndGgoKSA+IDYwKSB7Ci0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgMjUpICsgIi4uLiIgKyBwYXRoLnN1YnN0cmluZyhwYXRoLmxlbmd0aCgpIC0gMjUsIHBhdGgubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBOTFMuYmluZChIVE1MVUlNZXNzYWdlcy5PcGVuLCBwYXRoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoZkh5cGVybGlua0ZpbGUgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEV4dGVybmFsRmlsZUVkaXRvcklucHV0KGZIeXBlcmxpbmtGaWxlKTsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0b3IgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXROYW1lKCksIHRydWUpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgZGVzY3JpcHRvci5nZXRJZCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNEVEh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNEVEh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGM4MDk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTRFRIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLmFjdGlvbnMuQWN0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSmF2YVNjcmlwdFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotY2xhc3MgSlNEVEh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCXByaXZhdGUgSUphdmFTY3JpcHRFbGVtZW50IGZFbGVtZW50OwotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCQotCXB1YmxpYyBKU0RUSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmRWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtSZWdpb24oKQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCXJldHVybiBBY3Rpb25NZXNzYWdlcy5PcGVuQWN0aW9uX2RlY2xhcmF0aW9uX2xhYmVsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI29wZW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCXRyeSB7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBKYXZhU2NyaXB0VUkub3BlbkluRWRpdG9yKGZFbGVtZW50KTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUphdmFTY3JpcHRVSS5yZXZlYWxJbkVkaXRvcihlZGl0b3IsIGZFbGVtZW50KTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTRFRIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNEVEh5cGVybGlua0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTMwOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNEVEh5cGVybGlua0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklGdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0VW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVNvdXJjZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVNvdXJjZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLkphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU0RUSHlwZXJsaW5rRGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdEh5cGVybGlua0RldGVjdG9yIHsKLQlwcml2YXRlIElIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50LCBJUmVnaW9uIHJlZ2lvbiwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlIeXBlcmxpbmsgbGluayA9IG51bGw7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gb3BlbiBsb2NhbCB2YXJpYWJsZSBpbiB0aGUgSlNQIGZpbGUuLi4KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNvdXJjZVJlZmVyZW5jZSkgewotCQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCQkJCUlQYXRoIG91dHNpZGVQYXRoID0gbnVsbDsKLQkJCQlpbnQganNwT2Zmc2V0ID0gMDsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQkJLy8gdHJ5IHRvIGxvY2F0ZSB0aGUgZmlsZSBpbiB0aGUgd29ya3NwYWNlCi0JCQkJdHJ5IHsKLQkJCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy9VUklSZXNvbHZlciByZXNvbHZlciA9IHNNb2RlbC5nZXRSZXNvbHZlcigpOwotCQkJCQkJLy9pZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJCQkJLy8JU3RyaW5nIHVyaVN0cmluZyA9IHJlc29sdmVyLmdldEZpbGVCYXNlTG9jYXRpb24oKTsKLQkJCQkJCVN0cmluZyB1cmlTdHJpbmcgPSBzTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJCQkJZmlsZSA9IGdldEZpbGUodXJpU3RyaW5nKTsKLQkJCQkJLy8JfQotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZ2V0IEphdmEgcmFuZ2UsIHRyYW5zbGF0ZSBjb29yZGluYXRlIHRvIEpTUAotCQkJCXRyeSB7Ci0JCQkJCUlTb3VyY2VSYW5nZSByYW5nZSA9IG51bGw7Ci0JCQkJCUlKc1RyYW5zbGF0aW9uIGpzcFRyYW5zbGF0aW9uID0gZ2V0SnNUcmFuc2xhdGlvbihkb2N1bWVudCk7Ci0JCQkJCWlmIChqc3BUcmFuc2xhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkvLyBsaW5rIHRvIGxvY2FsIHZhcmlhYmxlIGRlZmluaXRpb25zCi0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElMb2NhbFZhcmlhYmxlKSB7Ci0JCQkJCQkJcmFuZ2UgPSAoKElMb2NhbFZhcmlhYmxlKSBlbGVtZW50KS5nZXROYW1lUmFuZ2UoKTsKLQkJCQkJCQlJSmF2YVNjcmlwdEVsZW1lbnQgdW5pdD0oKElMb2NhbFZhcmlhYmxlKSBlbGVtZW50KS5nZXRQYXJlbnQoKTsKLQkJCQkJCQlJSmF2YVNjcmlwdFVuaXQgbXlVbml0ID0ganNwVHJhbnNsYXRpb24uZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCQkJCi0JCQkJCQkJd2hpbGUoISh1bml0IGluc3RhbmNlb2YgSUphdmFTY3JpcHRVbml0IHx8IHVuaXQgaW5zdGFuY2VvZiBJQ2xhc3NGaWxlIHx8IHVuaXQ9PW51bGwpKSB7Ci0JCQkJCQkJCXVuaXQgPSAoKEphdmFFbGVtZW50KSB1bml0KS5nZXRQYXJlbnQoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYodW5pdCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0VW5pdCkgewotCQkJCQkJCQlJSmF2YVNjcmlwdFVuaXQgY3UgPSAoSUphdmFTY3JpcHRVbml0KXVuaXQ7Ci0JCQkJCQkJCWlmKGN1IT1teVVuaXQpIHsKLQkJCQkJCQkJCWZpbGUgPSBnZXRGaWxlKGN1LmdldFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQkJCQkJCWlmKGZpbGU9PW51bGwpIHsKLQkJCQkJCQkJCQlvdXRzaWRlUGF0aCA9IGN1LmdldFBhdGgoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX1lbHNlIGlmKHVuaXQgaW5zdGFuY2VvZiBJQ2xhc3NGaWxlKSB7Ci0JCQkJCQkJCUlDbGFzc0ZpbGUgY3UgPSAoSUNsYXNzRmlsZSl1bml0OwotCQkJCQkJCQlpZihjdSE9bXlVbml0KSB7Ci0JCQkJCQkJCQlmaWxlID0gZ2V0RmlsZShjdS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQlpZihmaWxlPT1udWxsKSB7Ci0JCQkJCQkJCQkJb3V0c2lkZVBhdGggPSBjdS5nZXRQYXRoKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQkvLyBsaW5raW5nIHRvIGZpZWxkcyBvZiB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0Ci0JCQkJCQllbHNlIGlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LkZJRUxEKSB7Ci0JCQkJCQkJT2JqZWN0IGN1ID0gKChJRmllbGQpIGVsZW1lbnQpLmdldEphdmFTY3JpcHRVbml0KCk7Ci0JCQkJCQkJaWYgKGN1ICE9IG51bGwgJiYgY3UuZXF1YWxzKGpzcFRyYW5zbGF0aW9uLmdldENvbXBpbGF0aW9uVW5pdCgpKSkgewotCQkJCQkJCQlyYW5nZSA9ICgoSVNvdXJjZVJlZmVyZW5jZSkgZWxlbWVudCkuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBsaW5raW5nIHRvIG1ldGhvZHMgb2YgdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdAotCQkJCQkJZWxzZSBpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5NRVRIT0QpIHsKLQkJCQkJCQlPYmplY3QgY3UgPSAoKElGdW5jdGlvbikgZWxlbWVudCkuZ2V0SmF2YVNjcmlwdFVuaXQoKTsKLQkJCQkJCQlpZiAoY3UgIT0gbnVsbCAmJiBjdS5lcXVhbHMoanNwVHJhbnNsYXRpb24uZ2V0Q29tcGlsYXRpb25Vbml0KCkpKSB7Ci0JCQkJCQkJCXJhbmdlID0gKChJU291cmNlUmVmZXJlbmNlKSBlbGVtZW50KS5nZXRTb3VyY2VSYW5nZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocmFuZ2UgIT0gbnVsbCAmJiBmaWxlICE9IG51bGwpIHsKLQkJCQkJCWpzcE9mZnNldCA9IHJhbmdlLmdldE9mZnNldCgpOwotCQkJCQkJaWYgKGpzcE9mZnNldCA+PSAwKSB7Ci0JCQkJCQkJbGluayA9IG5ldyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKHJlZ2lvbiwgZmlsZSwgbmV3IFJlZ2lvbihqc3BPZmZzZXQsIHJhbmdlLmdldExlbmd0aCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX1lbHNlIGlmIChyYW5nZSE9bnVsbCAmJiBvdXRzaWRlUGF0aCE9bnVsbCkgewotCQkJCQkJanNwT2Zmc2V0ID0gcmFuZ2UuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQlpZiAoanNwT2Zmc2V0ID49IDApIHsKLQkJCQkJCQlsaW5rID0gbmV3IEV4dGVybmFsRmlsZUh5cGVybGluayhyZWdpb24sb3V0c2lkZVBhdGgudG9GaWxlKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBqbWUuZ2V0TWVzc2FnZSgpLCBqbWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChsaW5rID09IG51bGwpIHsKLQkJCQlsaW5rID0gbmV3IEpTRFRIeXBlcmxpbmsocmVnaW9uLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGluazsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3IjZGV0ZWN0SHlwZXJsaW5rcyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7Ci0JCUxpc3QgaHlwZXJsaW5rcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiB0ZXh0Vmlld2VyICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCUlKc1RyYW5zbGF0aW9uIGpzVHJhbnNsYXRpb24gPSBnZXRKc1RyYW5zbGF0aW9uKGRvY3VtZW50KTsKLQkJCWlmIChqc1RyYW5zbGF0aW9uICE9IG51bGwpIHsKLQkJCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBlbGVtZW50cyA9IGpzVHJhbnNsYXRpb24uZ2V0RWxlbWVudHNGcm9tSnNSYW5nZShyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJCQkvLyBjcmVhdGUgYSBoeXBlcmxpbmsgZm9yIGVhY2ggSmF2YVNjcmlwdCBlbGVtZW50Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJCQkvLyBmaW5kIGh5cGVybGluayByYW5nZSBmb3IgSmF2YSBlbGVtZW50Ci0JCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IHNlbGVjdFdvcmQoZG9jdW1lbnQsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCQlJSHlwZXJsaW5rIGxpbmsgPSBjcmVhdGVIeXBlcmxpbmsoZWxlbWVudCwgaHlwZXJsaW5rUmVnaW9uLCBkb2N1bWVudCk7Ci0JCQkJCQlpZiAobGluayAhPSBudWxsKSB7Ci0JCQkJCQkJaHlwZXJsaW5rcy5hZGQobGluayk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGh5cGVybGlua3Muc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSUh5cGVybGlua1tdKSBoeXBlcmxpbmtzLnRvQXJyYXkobmV3IElIeXBlcmxpbmtbMF0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIElGaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBpZiBwb3NzaWJsZSwgbnVsbCBpZiBjYW5ub3QgZmluZCBmaWxlCi0JICogZnJvbSB1cmkuCi0JICogCi0JICogQHBhcmFtIGZpbGVTdHJpbmcKLQkgKiAgICAgICAgICAgIGZpbGUgc3lzdGVtIHBhdGgKLQkgKiBAcmV0dXJuIHJldHVybnMgSUZpbGUgaWYgZmlsZVN0cmluZyBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZShTdHJpbmcgZmlsZVN0cmluZykgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJaWYgKGZpbGVTdHJpbmcgIT0gbnVsbCkgewotCQkJSVJlc291cmNlIHJlc291cmNlICA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihmaWxlU3RyaW5nKTsKLQkJCWlmKHJlc291cmNlIT1udWxsICYmIHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlmaWxlID0gKElGaWxlKXJlc291cmNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgSlNQIHRyYW5zbGF0aW9uIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4gSlNQVHJhbnNsYXRpb24gaWYgb25lIGV4aXN0cywgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIElKc1RyYW5zbGF0aW9uIGdldEpzVHJhbnNsYXRpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gbnVsbDsKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCXRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKc1RyYW5zbGF0aW9uKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRyYW5zbGF0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBKYXZhIGFsd2F5cyBzZWxlY3RzIHdvcmQgd2hlbiBkZWZpbmluZyByZWdpb24KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcGFyYW0gYW5jaG9yCi0JICogQHJldHVybiBJUmVnaW9uCi0JICovCi0JcHJpdmF0ZSBJUmVnaW9uIHNlbGVjdFdvcmQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgYW5jaG9yKSB7Ci0JCXRyeSB7Ci0JCQlpbnQgb2Zmc2V0ID0gYW5jaG9yOwotCQkJY2hhciBjOwotCQkJd2hpbGUgKG9mZnNldCA+PSAwKSB7Ci0JCQkJYyA9IGRvY3VtZW50LmdldENoYXIob2Zmc2V0KTsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLS1vZmZzZXQ7Ci0JCQl9Ci0JCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0JCQlvZmZzZXQgPSBhbmNob3I7Ci0JCQlpbnQgbGVuZ3RoID0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCQl3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7Ci0JCQkJYyA9IGRvY3VtZW50LmdldENoYXIob2Zmc2V0KTsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJKytvZmZzZXQ7Ci0JCQl9Ci0JCQlpbnQgZW5kID0gb2Zmc2V0OwotCQkJaWYgKHN0YXJ0ID09IGVuZCkgewotCQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0LCAwKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0ICsgMSwgZW5kIC0gc3RhcnQgLSAxKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNDhmYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi1jbGFzcyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JcHJpdmF0ZSBJRmlsZSBmRmlsZTsKLQlwcml2YXRlIElSZWdpb24gZkhpZ2hsaWdodFJhbmdlOwotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCQotCXB1YmxpYyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJRmlsZSBmaWxlKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZGaWxlID0gZmlsZTsKLQl9Ci0JCi0JcHVibGljIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElGaWxlIGZpbGUsIElSZWdpb24gcmFuZ2UpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkZpbGUgPSBmaWxlOwotCQlmSGlnaGxpZ2h0UmFuZ2UgPSByYW5nZTsKLQl9Ci0JCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJU3RyaW5nIHBhdGggPSBmRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCWlmIChwYXRoLmxlbmd0aCgpID4gNjApIHsKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygwLCAyNSkgKyAiLi4uIiArIHBhdGguc3Vic3RyaW5nKHBhdGgubGVuZ3RoKCkgLSAyNSwgcGF0aC5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIE5MUy5iaW5kKEhUTUxVSU1lc3NhZ2VzLk9wZW4sIHBhdGgpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZGaWxlICE9IG51bGwgJiYgZkZpbGUuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IElERS5vcGVuRWRpdG9yKHBhZ2UsIGZGaWxlLCB0cnVlKTsKLQkJCQkvLyBoaWdobGlnaHQgcmFuZ2UgaW4gZWRpdG9yIGlmIHBvc3NpYmxlCi0JCQkJaWYgKGZIaWdobGlnaHRSYW5nZSAhPSBudWxsICYmIGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJCSgoSVRleHRFZGl0b3IpIGVkaXRvcikuc2VsZWN0QW5kUmV2ZWFsKGZIaWdobGlnaHRSYW5nZS5nZXRPZmZzZXQoKSwgZkhpZ2hsaWdodFJhbmdlLmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBwaWUuZ2V0TWVzc2FnZSgpLCBwaWUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvWE1MSHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1hNTEh5cGVybGlua0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNjAzZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvWE1MSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLlVSTEh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBYTUxIeXBlcmxpbmtEZXRlY3RvciBpbXBsZW1lbnRzIElIeXBlcmxpbmtEZXRlY3RvciB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUF9QUk9UT0NPTCA9ICJodHRwOi8vIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTk9fTkFNRVNQQUNFX1NDSEVNQV9MT0NBVElPTiA9ICJub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFNDSEVNQV9MT0NBVElPTiA9ICJzY2hlbWFMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxucyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBYU0lfTkFNRVNQQUNFX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGh5cGVybGluawotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcGFyYW0gaHlwZXJsaW5rUmVnaW9uCi0JICogQHJldHVybiBJSHlwZXJsaW5rCi0JICovCi0JcHJpdmF0ZSBJSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhTdHJpbmcgdXJpU3RyaW5nLCBJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiwgSURvY3VtZW50IGRvY3VtZW50LCBOb2RlIG5vZGUpIHsKLQkJSUh5cGVybGluayBsaW5rID0gbnVsbDsKLQkJaWYgKGlzSHR0cCh1cmlTdHJpbmcpKSB7Ci0JCQlsaW5rID0gbmV3IFVSTEh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIHVyaVN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0cnkgdG8gbG9jYXRlIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UKLQkJCUZpbGUgc3lzdGVtRmlsZSA9IGdldEZpbGVGcm9tVXJpU3RyaW5nKHVyaVN0cmluZyk7Ci0JCQlpZiAoc3lzdGVtRmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHN5c3RlbVBhdGggPSBzeXN0ZW1GaWxlLmdldFBhdGgoKTsKLQkJCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShzeXN0ZW1QYXRoKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIHNpbmNlIGZpbGUgZXhpc3RzIGluCi0JCQkJCS8vIHdvcmtzcGFjZQotCQkJCQlsaW5rID0gbmV3IFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBmaWxlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyB0aGlzIGlzIGFuIEV4dGVybmFsRmlsZUh5cGVybGluayBzaW5jZSBmaWxlIGRvZXMgbm90Ci0JCQkJCS8vIGV4aXN0IGluIHdvcmtzcGFjZQotCQkJCQlsaW5rID0gbmV3IEV4dGVybmFsRmlsZUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIHN5c3RlbUZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGluazsKLQl9Ci0JCi0JcHVibGljIElIeXBlcmxpbmtbXSBkZXRlY3RIeXBlcmxpbmtzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpIHsKLQkJLy8gZm9yIG5vdywgb25seSBjYXBhYmxlIG9mIGNyZWF0aW5nIDEgaHlwZXJsaW5rCi0JCUxpc3QgaHlwZXJsaW5rcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiB0ZXh0Vmlld2VyICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCU5vZGUgY3VycmVudE5vZGUgPSBnZXRDdXJyZW50Tm9kZShkb2N1bWVudCwgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHVyaVN0cmluZyA9IG51bGw7Ci0JCQkJaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkJLy8gZG9jdHlwZSBub2RlcwotCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudE5vZGUsIGRvY3VtZW50KTsKLQkJCQl9IGVsc2UgaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJLy8gZWxlbWVudCBub2RlcwotCQkJCQlBdHRyIGN1cnJlbnRBdHRyID0gZ2V0Q3VycmVudEF0dHJOb2RlKGN1cnJlbnROb2RlLCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQlpZiAoY3VycmVudEF0dHIgIT0gbnVsbCkgewotCQkJCQkJLy8gdHJ5IHRvIGZpbmQgbGluayBmb3IgY3VycmVudCBhdHRyaWJ1dGUKLQkJCQkJCS8vIHJlc29sdmUgYXR0cmlidXRlIHZhbHVlCi0JCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudEF0dHIsIGRvY3VtZW50KTsKLQkJCQkJCS8vIHZlcmlmeSB2YWxpZGl0eSBvZiB1cmkgc3RyaW5nCi0JCQkJCQlpZiAodXJpU3RyaW5nID09IG51bGwgfHwgIWlzVmFsaWRVUkkodXJpU3RyaW5nKSkgewotCQkJCQkJCS8vIHJlc2V0IGN1cnJlbnQgYXR0cmlidXRlCi0JCQkJCQkJY3VycmVudEF0dHIgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChjdXJyZW50QXR0ciA9PSBudWxsKSB7Ci0JCQkJCQkvLyB0cnkgdG8gZmluZCBhIGxpbmthYmxlIGF0dHJpYnV0ZSB3aXRoaW4gZWxlbWVudAotCQkJCQkJY3VycmVudEF0dHIgPSBnZXRMaW5rYWJsZUF0dHIoKEVsZW1lbnQpIGN1cnJlbnROb2RlKTsKLQkJCQkJCWlmIChjdXJyZW50QXR0ciAhPSBudWxsKSB7Ci0JCQkJCQkJdXJpU3RyaW5nID0gZ2V0VVJJU3RyaW5nKGN1cnJlbnRBdHRyLCBkb2N1bWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY3VycmVudE5vZGUgPSBjdXJyZW50QXR0cjsKLQkJCQl9Ci0JCQkJLy8gdHJ5IHRvIGNyZWF0ZSBoeXBlcmxpbmsgZnJvbSBpbmZvcm1hdGlvbiBnYXRoZXJlZAotCQkJCWlmICh1cmlTdHJpbmcgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsICYmIGlzVmFsaWRVUkkodXJpU3RyaW5nKSkgewotCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbihjdXJyZW50Tm9kZSk7Ci0JCQkJCUlIeXBlcmxpbmsgaHlwZXJsaW5rID0gY3JlYXRlSHlwZXJsaW5rKHVyaVN0cmluZywgaHlwZXJsaW5rUmVnaW9uLCBkb2N1bWVudCwgY3VycmVudE5vZGUpOwotCQkJCQlpZiAoaHlwZXJsaW5rICE9IG51bGwpIHsKLQkJCQkJCWh5cGVybGlua3MuYWRkKGh5cGVybGluayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGh5cGVybGlua3Muc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSUh5cGVybGlua1tdKSBoeXBlcmxpbmtzLnRvQXJyYXkobmV3IElIeXBlcmxpbmtbMF0pOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGJhc2UgbG9jYXRpb24gZnJvbSB0aGUgY3VycmVudCBtb2RlbCAobG9jYWwgZmlsZSBzeXN0ZW0pCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmcgYmFzZUxvYyA9IG51bGw7Ci0JCS8vIGdldCB0aGUgYmFzZSBsb2NhdGlvbiBmcm9tIHRoZSBjdXJyZW50IG1vZGVsCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJSVBhdGggbG9jYXRpb24gPSBuZXcgUGF0aChzTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCWlmIChsb2NhdGlvbi50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCQliYXNlTG9jID0gbG9jYXRpb24udG9TdHJpbmcoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAobG9jYXRpb24uc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCQliYXNlTG9jID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGxvY2F0aW9uKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQliYXNlTG9jID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLmFwcGVuZChsb2NhdGlvbikudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYmFzZUxvYzsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBmb3IgYW4gZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXByaXZhdGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbnVsbDsKLQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJZWQgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZWQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBub2RlIHdpdGhpbiBub2RlIGF0IG9mZnNldAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4gQXR0cgotCSAqLwotCXByaXZhdGUgQXR0ciBnZXRDdXJyZW50QXR0ck5vZGUoTm9kZSBub2RlLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICgobm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuY29udGFpbnMob2Zmc2V0KSAmJiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpKSB7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCS8vIGdvIHRocm91Z2ggZWFjaCBhdHRyaWJ1dGUgaW4gbm9kZSBhbmQgaWYgYXR0cmlidXRlIGNvbnRhaW5zCi0JCQkvLyBvZmZzZXQsIHJldHVybiB0aGF0IGF0dHJpYnV0ZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0JCQkJLy8gYXNzdW1wdGlvbiB0aGF0IGlmIHBhcmVudCBub2RlIGlzIG9mIHR5cGUgSW5kZXhlZFJlZ2lvbiwKLQkJCQkvLyB0aGVuIGl0cyBhdHRyaWJ1dGVzIHdpbGwgYWxzbyBiZSBvZiB0eXBlIEluZGV4ZWRSZWdpb24KLQkJCQlJbmRleGVkUmVnaW9uIGF0dFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBhdHRycy5pdGVtKGkpOwotCQkJCWlmIChhdHRSZWdpb24uY29udGFpbnMob2Zmc2V0KSkgewotCQkJCQlyZXR1cm4gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBub2RlIHRoZSBjdXJzb3IgaXMgY3VycmVudGx5IG9uIGluIHRoZSBkb2N1bWVudC4gbnVsbCBpZiBubwotCSAqIG5vZGUgaXMgc2VsZWN0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBOb2RlIGVpdGhlciBlbGVtZW50LCBkb2N0eXBlLCB0ZXh0LCBvciBudWxsCi0JICovCi0JcHJpdmF0ZSBOb2RlIGdldEN1cnJlbnROb2RlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQkvLyBnZXQgdGhlIGN1cnJlbnQgbm9kZSBhdCB0aGUgb2Zmc2V0IChyZXR1cm5zIGVpdGhlcjogZWxlbWVudCwKLQkJLy8gZG9jdHlwZSwgdGV4dCkKLQkJSW5kZXhlZFJlZ2lvbiBpbm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaW5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQpOwotCQkJaWYgKGlub2RlID09IG51bGwpIHsKLQkJCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCAtIDEpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCWlmIChpbm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiAoTm9kZSkgaW5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gSUZpbGUgZnJvbSB0aGUgZ2l2ZW4gdXJpIGlmIHBvc3NpYmxlLCBudWxsIGlmIGNhbm5vdCBmaW5kIGZpbGUKLQkgKiBmcm9tIHVyaS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVN0cmluZwotCSAqICAgICAgICAgICAgZmlsZSBzeXN0ZW0gcGF0aAotCSAqIEByZXR1cm4gcmV0dXJucyBJRmlsZSBpZiBmaWxlU3RyaW5nIGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpZiAoZmlsZVN0cmluZyAhPSBudWxsKSB7Ci0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aCAmJiBmaWxlID09IG51bGw7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS5leGlzdHMoKSkgewotCQkJCQlmaWxlID0gZmlsZXNbaV07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBmaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgdXJpU3RyaW5nIGlzIG5vdCBodHRwOi8vCi0JICogQHJldHVybiBGaWxlIGNyZWF0ZWQgZnJvbSB1cmlTdHJpbmcgaWYgcG9zc2libGUsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBGaWxlIGdldEZpbGVGcm9tVXJpU3RyaW5nKFN0cmluZyB1cmlTdHJpbmcpIHsKLQkJRmlsZSBmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGZpcnN0IGp1c3QgdHJ5IHRvIGNyZWF0ZSBhIGZpbGUgZGlyZWN0bHkgZnJvbSB1cmlTdHJpbmcgYXMKLQkJCS8vIGRlZmF1bHQgaW4gY2FzZSBjcmVhdGUgZmlsZSBmcm9tIHVyaSBkb2VzIG5vdCB3b3JrCi0JCQlmaWxlID0gbmV3IEZpbGUodXJpU3RyaW5nKTsKLQkJCS8vIHRyeSB0byBjcmVhdGUgZmlsZSBmcm9tIHVyaQotCQkJVVJJIHVyaSA9IG5ldyBVUkkodXJpU3RyaW5nKTsKLQkJCWZpbGUgPSBuZXcgRmlsZSh1cmkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWYgZXhjZXB0aW9uIGlzIHRocm93biB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIEZpbGUganVzdCBpZ25vcmUKLQkJCS8vIGFuZCBmaWxlIHdpbGwgYmUgbnVsbAotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQlwcml2YXRlIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKE5vZGUgbm9kZSkgewotCQlJUmVnaW9uIGh5cGVyUmVnaW9uID0gbnVsbDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkvLyBoYW5kbGUgZG9jIHR5cGUgbm9kZQotCQkJCUlET01Ob2RlIGRvY05vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQkJaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKGRvY05vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgZG9jTm9kZS5nZXRFbmRPZmZzZXQoKSAtIGRvY05vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQl9IGVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQkvLyBoYW5kbGUgYXR0cmlidXRlIG5vZGVzCi0JCQkJSURPTUF0dHIgYXR0ID0gKElET01BdHRyKSBub2RlOwotCQkJCS8vIGRvIG5vdCBpbmNsdWRlIHF1b3RlcyBpbiBhdHRyaWJ1dGUgdmFsdWUgcmVnaW9uCi0JCQkJaW50IHJlZ09mZnNldCA9IGF0dC5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBhdHQuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgcmVnTGVuZ3RoID0gdmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlTdHJpbmcgYXR0VmFsdWUgPSBhdHQuZ2V0VmFsdWVSZWdpb25UZXh0KCk7Ci0JCQkJCWlmIChTdHJpbmdVdGlscy5pc1F1b3RlZChhdHRWYWx1ZSkpIHsKLQkJCQkJCSsrcmVnT2Zmc2V0OwotCQkJCQkJcmVnTGVuZ3RoID0gcmVnTGVuZ3RoIC0gMjsKLQkJCQkJfQotCQkJCQloeXBlclJlZ2lvbiA9IG5ldyBSZWdpb24ocmVnT2Zmc2V0LCByZWdMZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaHlwZXJSZWdpb247Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIGZpbmQgYW4gYXR0cmlidXRlIHdpdGhpbiBlbGVtZW50IHRoYXQgaXMgb3BlbmFibGUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcmV0dXJuIEF0dHIgYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG9wZW4gb24sIG51bGwgaWYgbm8gYXR0cmlidXRlCi0JICogICAgICAgICBjb3VsZCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgQXR0ciBnZXRMaW5rYWJsZUF0dHIoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCS8vIGdldCB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGlzIG5vZGUKLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7ICsraSkgewotCQkJLy8gY2hlY2sgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgIm9wZW5Pbi1hYmxlIgotCQkJQXR0ciBhdHQgPSAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCWlmIChpc0xpbmthYmxlQXR0cihhdHQsIGVkKSkgewotCQkJCXJldHVybiBhdHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEZpbmQgdGhlIGxvY2F0aW9uIGhpbnQgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2VVUkkgaWYgaXQgZXhpc3RzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnROb2RlIC0KLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHBhcmFtIG5hbWVzcGFjZVVSSSAtCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEByZXR1cm4gbG9jYXRpb24gaGludCAoc3lzdGVtSWQpIGlmIGl0IHdhcyBmb3VuZCwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMb2NhdGlvbkhpbnQoRWxlbWVudCBlbGVtZW50Tm9kZSwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQlBdHRyIHNjaGVtYUxvY05vZGUgPSBlbGVtZW50Tm9kZS5nZXRBdHRyaWJ1dGVOb2RlTlMoWFNJX05BTUVTUEFDRV9VUkksIFNDSEVNQV9MT0NBVElPTik7Ci0JCWlmIChzY2hlbWFMb2NOb2RlICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2NoZW1hTG9jTm9kZS5nZXRWYWx1ZSgpKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgcHVibGljSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJU3RyaW5nIHN5c3RlbUlkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCS8vIGZvdW5kIGxvY2F0aW9uIGhpbnQKLQkJCQlpZiAobmFtZXNwYWNlVVJJLmVxdWFsc0lnbm9yZUNhc2UocHVibGljSWQpKSB7Ci0JCQkJCXJldHVybiBzeXN0ZW1JZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSSSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZSAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VVJJU3RyaW5nKE5vZGUgbm9kZSwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyByZXNvbHZlZFVSSSA9IG51bGw7Ci0JCS8vIG5lZWQgdGhlIGJhc2UgbG9jYXRpb24sIHB1YmxpY0lkLCBhbmQgc3lzdGVtSWQgZm9yIFVSSVJlc29sdmVyCi0JCVN0cmluZyBiYXNlTG9jID0gbnVsbDsKLQkJU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQkJU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCS8vIGhhbmRsZSBkb2MgdHlwZSBub2RlCi0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJYmFzZUxvYyA9IGdldEJhc2VMb2NhdGlvbihkb2N1bWVudCk7Ci0JCQlwdWJsaWNJZCA9ICgoRG9jdW1lbnRUeXBlKSBub2RlKS5nZXRQdWJsaWNJZCgpOwotCQkJc3lzdGVtSWQgPSAoKERvY3VtZW50VHlwZSkgbm9kZSkuZ2V0U3lzdGVtSWQoKTsKLQkJfSBlbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkvLyBoYW5kbGUgYXR0cmlidXRlIG5vZGUKLQkJCUF0dHIgYXR0ck5vZGUgPSAoQXR0cikgbm9kZTsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHJOb2RlLmdldE5hbWUoKTsKLQkJCVN0cmluZyBhdHRyVmFsdWUgPSBhdHRyTm9kZS5nZXRWYWx1ZSgpOwotCQkJYXR0clZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXAoYXR0clZhbHVlKTsKLQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCAmJiBhdHRyVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYmFzZUxvYyA9IGdldEJhc2VMb2NhdGlvbihkb2N1bWVudCk7Ci0JCQkJLy8gaGFuZGxlIHNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQotCQkJCVN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHJOYW1lKTsKLQkJCQlTdHJpbmcgdW5wcmVmaXhlZE5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUoYXR0ck5hbWUpOwotCQkJCWlmICgoWE1MTlMuZXF1YWxzKHByZWZpeCkpIHx8IChYTUxOUy5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkgewotCQkJCQlwdWJsaWNJZCA9IGF0dHJWYWx1ZTsKLQkJCQkJc3lzdGVtSWQgPSBnZXRMb2NhdGlvbkhpbnQoYXR0ck5vZGUuZ2V0T3duZXJFbGVtZW50KCksIHB1YmxpY0lkKTsKLQkJCQkJaWYgKHN5c3RlbUlkID09IG51bGwpIHsKLQkJCQkJCXN5c3RlbUlkID0gYXR0clZhbHVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICgoWFNJX05BTUVTUEFDRV9VUkkuZXF1YWxzKERPTU5hbWVzcGFjZUhlbHBlci5nZXROYW1lc3BhY2VVUkkoYXR0ck5vZGUpKSkgJiYgKFNDSEVNQV9MT0NBVElPTi5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkgewotCQkJCQkvLyBmb3Igbm93IGp1c3QgdXNlIHRoZSBmaXJzdCBwYWlyCi0JCQkJCS8vIG5lZWQgdG8gbG9vayBpbnRvIGJlaW5nIG1vcmUgcHJlY2lzZQotCQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZSk7Ci0JCQkJCXB1YmxpY0lkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCQlzeXN0ZW1JZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQkJLy8gZWxzZSBjaGVjayBpZiB4bWxucyBwdWJsaWNJZCA9IHZhbHVlCi0JCQkJfSBlbHNlIHsKLQkJCQkJc3lzdGVtSWQgPSBhdHRyVmFsdWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJlc29sdmVkVVJJID0gcmVzb2x2ZVVSSShiYXNlTG9jLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQlyZXR1cm4gcmVzb2x2ZWRVUkk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHVyaVN0cmluZyBpcyBhbiBodHRwIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcmV0dXJuIHRydWUgaWYgdXJpU3RyaW5nIGlzIGh0dHAgc3RyaW5nLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNIdHRwKFN0cmluZyB1cmlTdHJpbmcpIHsKLQkJYm9vbGVhbiBpc0h0dHAgPSBmYWxzZTsKLQkJaWYgKHVyaVN0cmluZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdGVtcFN0cmluZyA9IHVyaVN0cmluZy50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKHRlbXBTdHJpbmcuc3RhcnRzV2l0aChIVFRQX1BST1RPQ09MKSkgewotCQkJCWlzSHR0cCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzSHR0cDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIGlzIG9wZW5hYmxlLiBBdHRyaWJ1dGUgaXMgb3BlbmFibGUKLQkgKiBpZiBpdCBpcyBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhdHRyaWJ1dGUgb3IgaWYgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcwotCSAqIG9mIHR5cGUgVVJJLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEBwYXJhbSBjbUVsZW1lbnQKLQkgKiAgICAgICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlIChjYW4gYmUKLQkgKiAgICAgICAgICAgIG51bGwpCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgYXR0cmlidXRlIGlzICJvcGVuT24tYWJsZSIgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTGlua2FibGVBdHRyKEF0dHIgYXR0ciwgQ01FbGVtZW50RGVjbGFyYXRpb24gY21FbGVtZW50KSB7Ci0JCVN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlTdHJpbmcgcHJlZml4ID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFByZWZpeChhdHRyTmFtZSk7Ci0JCVN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyTmFtZSk7Ci0JCS8vIGRldGVybWluZSBpZiBhdHRyaWJ1dGUgaXMgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0JCWlmICgoWE1MTlMuZXF1YWxzKHByZWZpeCkpIHx8IChYTUxOUy5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gZGV0ZXJtaW5lIGlmIGF0dHJpYnV0ZSBjb250YWlucyBzY2hlbWEgbG9jYXRpb24KLQkJaWYgKChYU0lfTkFNRVNQQUNFX1VSSS5lcXVhbHMoRE9NTmFtZXNwYWNlSGVscGVyLmdldE5hbWVzcGFjZVVSSShhdHRyKSkpICYmICgoU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpIHx8IChOT19OQU1FU1BBQ0VfU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gZGV0ZXJtaW5lIGlmIGF0dHJpYnV0ZSB2YWx1ZSBpcyBvZiB0eXBlIFVSSQotCQlpZiAoY21FbGVtZW50ICE9IG51bGwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21FbGVtZW50LmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQkJaWYgKChhdHRyRGVjbCAhPSBudWxsKSAmJiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSAmJiAoQ01EYXRhVHlwZS5VUkkuZXF1YWxzKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0RGF0YVR5cGVOYW1lKCkpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHVyaVN0cmluZyBpcyByZWFsbHkgcG9pbnRpbmcgdG8gYSBmaWxlCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkVVJJKFN0cmluZyB1cmlTdHJpbmcpIHsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7Ci0JCWlmIChpc0h0dHAodXJpU3RyaW5nKSkgewotCQkJaXNWYWxpZCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlGaWxlIGZpbGUgPSBnZXRGaWxlRnJvbVVyaVN0cmluZyh1cmlTdHJpbmcpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCWlzVmFsaWQgPSBmaWxlLmlzRmlsZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc1ZhbGlkOwotCX0KLQkKLQkvKioKLQkgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gVVJJIGluZm9ybWF0aW9uCi0JICogCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbgotCSAqIEBwYXJhbSBwdWJsaWNJZAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqIEByZXR1cm4gU3RyaW5nIHJlc29sdmVkIHVyaS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCS8vIGRvbnQgcmVzb2x2ZSBpZiB0aGVyZSdzIG5vdGhpbmcgdG8gcmVzb2x2ZQotCQlpZiAoKGJhc2VMb2NhdGlvbiA9PSBudWxsKSAmJiAocHVibGljSWQgPT0gbnVsbCkgJiYgKHN5c3RlbUlkID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0Jhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2NWY3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Eb2N1bWVudENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZFN0cmVhbUNyZWF0b3I7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgU2VhcmNoUmVxdWVzdG9yIHsKLQkvKioKLQkgKiBDaGFuZ2UgY2xhc3MgdGhhdCB3cmFwcyBhIHRleHQgZWRpdCBvbiB0aGUganNwIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBjbGFzcyBSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBEb2N1bWVudENoYW5nZSB7Ci0JCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbiA9IEpzVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzA7Ci0JCXByaXZhdGUgVGV4dEVkaXQgZkVkaXQgPSBudWxsOwotCQlwcml2YXRlIElEb2N1bWVudCBmSlNQRG9jID0gbnVsbDsKLQkJcHJpdmF0ZSBJRmlsZSBmSlNQRmlsZSA9IG51bGw7Ci0JCQotCQlwdWJsaWMgUmVuYW1lQ2hhbmdlKElGaWxlIGpzcEZpbGUsIElEb2N1bWVudCBqc3BEb2MsIFRleHRFZGl0IGVkaXQsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJc3VwZXIoSnNVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNiwganNwRG9jKTsKLQkJCXRoaXMuZkVkaXQgPSBlZGl0OwotCQkJdGhpcy5mSlNQRmlsZSA9IGpzcEZpbGU7Ci0JCQl0aGlzLmZKU1BEb2MgPSBqc3BEb2M7Ci0JCQl0aGlzLmZEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuZkRlc2NyaXB0aW9uOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIElEb2N1bWVudCBnZXRQcmV2aWV3RG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSURvY3VtZW50IGNvcHlEb2MgPSBuZXcgRG9jdW1lbnQoZkpTUERvYy5nZXQoKSk7Ci0JCQl0cnkgewotCQkJCWZFZGl0LmFwcGx5KGNvcHlEb2MpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlyZXR1cm4gY29weURvYzsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIENoZWNrcyBpZiBhIGRvY3VtZW50IGlzIG9wZW4gaW4gYW4gZWRpdG9yCi0JCSAqIAotCQkgKiBAcGFyYW0ganNwRG9jCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBpc09wZW5JbkVkaXRvcihJRG9jdW1lbnQganNwRG9jKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQkJSVdvcmtiZW5jaFdpbmRvdyB3ID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93cy5sZW5ndGg7IGkrKykgewotCQkJCXcgPSB3aW5kb3dzW2ldOwotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJCUlFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IG51bGw7Ci0JCQkJCU9iamVjdCBvID0gbnVsbDsKLQkJCQkJSURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGorKykgewotCQkJCQkJZWRpdG9yID0gcmVmZXJlbmNlc1tqXS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9Mzc2NAotCQkJCQkJLy8gdXNlIGFkYXB0ZXIgdG8gZ2V0IElUZXh0RWRpdG9yIChmb3IgdGhpbmdzIGxpa2UKLQkJCQkJCS8vIHBhZ2UgZGVzaWduZXIpCi0JCQkJCQlvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQkJaWYgKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCQkJCQlkb2MgPSAoKElUZXh0RWRpdG9yKSBvKS5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJCQkJCWlmIChkb2MgIT0gbnVsbCAmJiBkb2MuZXF1YWxzKGpzcERvYykpIHsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCVJlbmFtZUNoYW5nZSB1bmRvQ2hhbmdlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYgKCFpc09wZW5JbkVkaXRvcih0aGlzLmZKU1BEb2MpKSB7Ci0JCQkJCS8vIGFwcGx5IGVkaXQgdG8gSlNQIGRvYyBBTkQgc2F2ZSBtb2RlbAotCQkJCQl1bmRvQ2hhbmdlID0gbmV3IFJlbmFtZUNoYW5nZSh0aGlzLmZKU1BGaWxlLCB0aGlzLmZKU1BEb2MsIHRoaXMuZkVkaXQuYXBwbHkoZkpTUERvYyksIHRoaXMuZkRlc2NyaXB0aW9uKTsKLQkJCQkJc2F2ZUZpbGUodGhpcy5mSlNQRmlsZSwgdGhpcy5mSlNQRG9jKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBqdXN0IGFwcGx5IGVkaXQgdG8gSlNQIGRvY3VtZW50Ci0JCQkJCXVuZG9DaGFuZ2UgPSBuZXcgUmVuYW1lQ2hhbmdlKHRoaXMuZkpTUEZpbGUsIHRoaXMuZkpTUERvYywgdGhpcy5mRWRpdC5hcHBseShmSlNQRG9jKSwgdGhpcy5mRGVzY3JpcHRpb24pOwotCQkJCX0KLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCXJldHVybiB1bmRvQ2hhbmdlOwotCQl9Ci0JCQotCQkvKioKLQkJICogUGVyZm9ybWVkIGluIGFuIG9wZXJhdGlvbiBzaW5jZSBpdCBtb2RpZmllcyByZXNvdXJjZXMgaW4gdGhlCi0JCSAqIHdvcmtzcGFjZQotCQkgKiAKLQkJICogQHBhcmFtIGpzcERvYwotCQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJICovCi0JCXByaXZhdGUgdm9pZCBzYXZlRmlsZShJRmlsZSBqc3BGaWxlLCBJRG9jdW1lbnQganNwRG9jKSB7Ci0JCQlTYXZlSnNwRmlsZU9wIG9wID0gbmV3IFNhdmVKc3BGaWxlT3AoanNwRmlsZSwganNwRG9jKTsKLQkJCXRyeSB7Ci0JCQkJb3AucnVuKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQkvLyBlbmQgaW5uZXIgY2xhc3MgU2F2ZUpzcEZpbGVPcAotCS8qKgotCSAqIFdvcmtzcGFjZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBzYXZlIG9uIG1vZGVsIGZvciB1cGRhdGVkIGRvY3VtZW50cy4KLQkgKiBTaG91bGQgb25seSBiZSBkb25lIG9uIG1vZGVscyBub3Qgb3BlbiBpbiBhbiBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBTYXZlSnNwRmlsZU9wIGV4dGVuZHMgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHsKLQkJcHJpdmF0ZSBJRG9jdW1lbnQgZkpTUERvYyA9IG51bGw7Ci0JCXByaXZhdGUgSUZpbGUgZkpTUEZpbGUgPSBudWxsOwotCQkKLQkJcHVibGljIFNhdmVKc3BGaWxlT3AoSUZpbGUganNwRmlsZSwgSURvY3VtZW50IGpzcERvYykgewotCQkJdGhpcy5mSlNQRG9jID0ganNwRG9jOwotCQkJdGhpcy5mSlNQRmlsZSA9IGpzcEZpbGU7Ci0JCX0KLQkJCi0JCQotCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNzY1Ci0JCQkvLyBzYXZlIGZpbGUgdy8gbm8gaW50ZXJtZWRpYXRlIG1vZGVsIGNyZWF0aW9uCi0JCQlDb2RlZFN0cmVhbUNyZWF0b3IgY29kZWRTdHJlYW1DcmVhdG9yID0gbmV3IENvZGVkU3RyZWFtQ3JlYXRvcigpOwotCQkJUmVhZGVyIHJlYWRlciA9IG5ldyBEb2N1bWVudFJlYWRlcih0aGlzLmZKU1BEb2MpOwotCQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldCh0aGlzLmZKU1BGaWxlLCByZWFkZXIpOwotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGNvZGVkQnl0ZVN0cmVhbSA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSBjb2RlZFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNvZGVkQnl0ZVN0cmVhbSA9IGNvZGVkU3RyZWFtQ3JlYXRvci5nZXRDb2RlZEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCWNvZGVkU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvZGVkQnl0ZVN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQlpZiAodGhpcy5mSlNQRmlsZS5leGlzdHMoKSkgewotCQkJCQl0aGlzLmZKU1BGaWxlLnNldENvbnRlbnRzKGNvZGVkU3RyZWFtLCB0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aGlzLmZKU1BGaWxlLmNyZWF0ZShjb2RlZFN0cmVhbSwgZmFsc2UsIG51bGwpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGNvZGVkQnl0ZVN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCQljb2RlZEJ5dGVTdHJlYW0uY2xvc2UoKTsKLQkJCQkJfQotCQkJCQlpZiAoY29kZWRTdHJlYW0gIT0gbnVsbCkgewotCQkJCQkJY29kZWRTdHJlYW0uY2xvc2UoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gdW5saWtlbHkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JLy8gZW5kIGlubmVyIGNsYXNzIFJlbmFtZUNoYW5nZQotCS8qKiBUaGUgdHlwZSBiZWluZyByZW5hbWVkICh0aGUgb2xkIHR5cGUpICovCi0JSUphdmFTY3JpcHRFbGVtZW50IGZFbGVtZW50ID0gbnVsbDsKLQkvKiogVGhlIG5ldyBuYW1lIG9mIHRoZSB0eXBlIGJlaW5nIHJlbmFtZWQgKi8KLQlwcml2YXRlIFN0cmluZyBmTmV3TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JLyoqIG1hcHMgYSBKU1BTZWFyY2hEb2N1bWVudCBwYXRoIC0+IE11bHRpVGV4dEVkaXQgZm9yIHRoZSBqYXZhIGZpbGUgKi8KLQlwcml2YXRlIEhhc2hNYXAgZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAgPSBudWxsOwotCQotCXB1YmxpYyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yKElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLmZOZXdOYW1lID0gbmV3TmFtZTsKLQkJdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMuZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNhY2NlcHRTZWFyY2hNYXRjaChvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG1hdGNoRG9jdW1lbnRQYXRoID0gamF2YU1hdGNoLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQlTZWFyY2hEb2N1bWVudCBzZWFyY2hEb2MgPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5nZXRTZWFyY2hEb2N1bWVudChtYXRjaERvY3VtZW50UGF0aCk7Ci0JCWlmIChzZWFyY2hEb2MgIT0gbnVsbCAmJiBzZWFyY2hEb2MgaW5zdGFuY2VvZiBKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgewotCQkJU3RyaW5nIHJlbmFtZVRleHQgPSBnZXRSZW5hbWVUZXh0KChKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgc2VhcmNoRG9jLCBqYXZhTWF0Y2gpOwotCQkJLy8gYWRkIGl0IGZvciB0aGUgY29ycmVjdCBkb2N1bWVudAotCQkJYWRkSmF2YUVkaXQoc2VhcmNoRG9jLmdldFBhdGgoKSwgbmV3IFJlcGxhY2VFZGl0KGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldExlbmd0aCgpLCByZW5hbWVUZXh0KSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0byB0aGUgbXVsdGkgZWRpdCBmb3IgYSBnaXZlIGphdmEgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGphdmFEb2N1bWVudAotCSAqIEBwYXJhbSBqYXZhRWRpdAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRKYXZhRWRpdChTdHJpbmcgc2VhcmNoRG9jUGF0aCwgUmVwbGFjZUVkaXQgamF2YUVkaXQpIHsKLQkJT2JqZWN0IG8gPSB0aGlzLmZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLmdldChzZWFyY2hEb2NQYXRoKTsKLQkJaWYgKG8gIT0gbnVsbCkgewotCQkJTXVsdGlUZXh0RWRpdCBtdWx0aSA9IChNdWx0aVRleHRFZGl0KSBvOwotCQkJbXVsdGkuYWRkQ2hpbGQoamF2YUVkaXQpOwotCQl9IGVsc2UgewotCQkJLy8gdXNlIGEgbXVsdGkgZWRpdCBzbyBkb2MgcG9zaXRpb24gb2Zmc2V0cyBnZXQgdXBkYXRlZAotCQkJLy8gYXV0b21hdGljYWxseQotCQkJLy8gd2hlbiBhZGRpbmcgbXVsdGlwbGUgY2hpbGQgZWRpdHMKLQkJCU11bHRpVGV4dEVkaXQgbXVsdGkgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJbXVsdGkuYWRkQ2hpbGQoamF2YUVkaXQpOwotCQkJdGhpcy5mU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcC5wdXQoc2VhcmNoRG9jUGF0aCwgbXVsdGkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgQ2hhbmdlIGNyZWF0ZUNoYW5nZShKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBzZWFyY2hEb2MsIFRleHRFZGl0IGVkaXQpIHsKLQkJSURvY3VtZW50IGRvYyA9IHNlYXJjaERvYy5nZXRKc3BUcmFuc2xhdGlvbigpLmdldEh0bWxEb2N1bWVudCgpOwotCQlTdHJpbmcgZmlsZSA9IHNlYXJjaERvYy5nZXRGaWxlKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBnZXREZXNjcmlwdGlvbigpOwotCQl0cnkgewotCQkJLy8gZG9jdW1lbnQgbGluZXMgYXJlIDAgYmFzZWQKLQkJCVN0cmluZyBsaW5lTnVtYmVyID0gSW50ZWdlci50b1N0cmluZyhkb2MuZ2V0TGluZU9mT2Zmc2V0KGVkaXQuZ2V0T2Zmc2V0KCkpICsgMSk7Ci0JCQlkZXNjcmlwdGlvbiArPSAiICIgKyBOTFMuYmluZChKc1VJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8xLCBuZXcgU3RyaW5nW10geyBmaWxlLCBsaW5lTnVtYmVyIH0pOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBSZW5hbWVDaGFuZ2Uoc2VhcmNoRG9jLmdldEZpbGUoKSwgZG9jLCBlZGl0LCBkZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYWxsIEpTUCBjaGFuZ2VzIGZvciB0aGUgc2VhcmNoIG1hdGNoZXMgZm9yIHRoZSBnaXZlbiBUeXBlCi0JICovCi0JcHVibGljIENoYW5nZVtdIGdldENoYW5nZXMoKSB7Ci0JCUpzU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCUxpc3QgY2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3Iga2V5cyA9IGZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzZWFyY2hEb2NQYXRoID0gbnVsbDsKLQkJU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSBudWxsOwotCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCS8vIGNyZWF0ZSBvbiB0aGUgZmx5Ci0JCQlzZWFyY2hEb2NQYXRoID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0JCQlNdWx0aVRleHRFZGl0IGphdmFFZGl0ID0gKE11bHRpVGV4dEVkaXQpIGZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLmdldChzZWFyY2hEb2NQYXRoKTsKLQkJCWRlbGVnYXRlID0gc3VwcG9ydC5nZXRTZWFyY2hEb2N1bWVudChzZWFyY2hEb2NQYXRoKTsKLQkJCWlmIChkZWxlZ2F0ZSAhPSBudWxsICYmIGRlbGVnYXRlIGluc3RhbmNlb2YgSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUpIHsKLQkJCQlKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBqYXZhRGVsZWdhdGUgPSAoSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUpIGRlbGVnYXRlOwotCQkJCWNoYW5nZXMuYWRkKGNyZWF0ZUNoYW5nZShqYXZhRGVsZWdhdGUsIGphdmFFZGl0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChDaGFuZ2VbXSkgY2hhbmdlcy50b0FycmF5KG5ldyBDaGFuZ2VbY2hhbmdlcy5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gYmV0dGVyIGRlc2NyaWJlIHRoZSBjaGFuZ2UuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmZFbGVtZW50OwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuZXcgbmFtZSBmb3IgdGhlIFR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5ld05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZOZXdOYW1lOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc2VhcmNoRG9jCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVuYW1lVGV4dChKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBzZWFyY2hEb2MsIFNlYXJjaE1hdGNoIGphdmFNYXRjaCkgewotCQlyZXR1cm4gZ2V0TmV3TmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3MWZjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIEpTUEphdmFTZWxlY3Rpb25Qcm92aWRlciB7Ci0Jc3RhdGljIElKYXZhU2NyaXB0RWxlbWVudFtdIGdldFNlbGVjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIGVsZW1lbnRzID0gbnVsbDsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJLy8gZ2V0IHRoZSBKU1AgdHJhbnNsYXRpb24gb2JqZWN0IGZvciB0aGlzIGVkaXRvcidzIGRvY3VtZW50Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQkJSURPTU1vZGVsIHhtbE1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0JCQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCQlKc1RyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCUlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKc1RyYW5zbGF0aW9uKHRydWUpOwotCQkJCQkJZWxlbWVudHMgPSB0cmFuc2xhdGlvbi5nZXRFbGVtZW50c0Zyb21Kc1JhbmdlKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBJSmF2YVNjcmlwdEVsZW1lbnRbMF07Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ3YWZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQTWV0aG9kUmVuYW1lQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQlwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoSUZ1bmN0aW9uIG1ldGhvZCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJSnNTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgSlNQSW5kZXhNYW5hZ2VyCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMDM2Ci0JCS8vIHN1cHBvcnQuaW5kZXhXb3Jrc3BhY2VBbmRXYWl0KCk7Ci0JCUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEpTUE1ldGhvZFJlbmFtZVJlcXVlc3RvcihtZXRob2QsIG5ld05hbWUpOwotCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKG1ldGhvZCwgbmV3IEpzU2VhcmNoU2NvcGUoKSwgcmVxdWVzdG9yKTsKLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRDaGFuZ2VzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkvLyBwYV9UT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKc1VJTWVzc2FnZXMuSlNQX2NoYW5nZXM7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkvLyBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlY2lkZSBjb3JyZWN0IHZhbHVlIG9mIGlzVmFsaWQKLQl9Ci0JCi0JCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBUaGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2Ugb2JqZWN0IGlzIHN0aWxsIHZhbGlkLgotCQkvLyBUaGlzIGlzIGluIHBhcnRpY3VsYXIgaW50ZXJlc3Rpbmcgd2hlbiBwZXJmb3JtaW5nIGFuIHVuZG8gY2hhbmdlCi0JCS8vIHNpbmNlIHRoZSB3b3Jrc3BhY2UgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB1bmRvIGNoYW5nZSBoYXMKLQkJLy8gYmVlbiBjcmVhdGVkLgotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gcmV0dXJuIHRoZSAidW5kbyIgY2hhbmdlIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmN2RkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklGdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklKYXZhV2ViTm9kZTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50IGV4dGVuZHMgUmVuYW1lUGFydGljaXBhbnQgewotCXByaXZhdGUgSUZ1bmN0aW9uIGZNZXRob2QgPSBudWxsOwotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDaGFuZ2VbXSBjaGFuZ2VzID0gSlNQTWV0aG9kUmVuYW1lQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IodGhpcy5mTWV0aG9kLCBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCkpOwotCQlDb21wb3NpdGVDaGFuZ2UgbXVsdGlDaGFuZ2UgPSBudWxsOwotCQlpZiAoY2hhbmdlcy5sZW5ndGggPiAwKSB7Ci0JCQltdWx0aUNoYW5nZSA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoSnNVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzLCBjaGFuZ2VzKTsKLQkJfQotCQlyZXR1cm4gbXVsdGlDaGFuZ2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmICh0aGlzLmZNZXRob2QgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQluYW1lID0gdGhpcy5mTWV0aG9kLmdldFNvdXJjZSgpOwotCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZ1bmN0aW9uKSB7Ci0JCQl0aGlzLmZNZXRob2QgPSAoSUZ1bmN0aW9uKSBlbGVtZW50OwotCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFXZWJOb2RlKSB7Ci0JCQlpZigoKElKYXZhV2ViTm9kZSllbGVtZW50KS5nZXRKYXZhRWxlbWVudCgpIGluc3RhbmNlb2YgSUZ1bmN0aW9uKSB7Ci0JCQkJdGhpcy5mTWV0aG9kID0gKElGdW5jdGlvbikgKChJSmF2YVdlYk5vZGUpZWxlbWVudCkuZ2V0SmF2YUVsZW1lbnQoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWU2ODMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0JcHVibGljIEpTUE1ldGhvZFJlbmFtZVJlcXVlc3RvcihJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoZWxlbWVudCwgbmV3TmFtZSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJU3RyaW5nIG5ld05hbWUgPSBnZXROZXdOYW1lKCk7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpzVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzMsIG5ldyBTdHJpbmdbXSB7IG1ldGhvZE5hbWUsIG5ld05hbWUgfSk7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5hbWVUZXh0KEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB7Ci0JCVN0cmluZyBqYXZhVGV4dCA9IHNlYXJjaERvYy5nZXRKc3BUcmFuc2xhdGlvbigpLmdldEpzVGV4dCgpOwotCQlTdHJpbmcgbWV0aG9kVGV4dCA9IGphdmFUZXh0LnN1YnN0cmluZyhqYXZhTWF0Y2guZ2V0T2Zmc2V0KCksIGphdmFNYXRjaC5nZXRPZmZzZXQoKSArIGphdmFNYXRjaC5nZXRMZW5ndGgoKSk7Ci0JCVN0cmluZyBtZXRob2RTdWZmaXggPSBtZXRob2RUZXh0LnN1YnN0cmluZyhtZXRob2RUZXh0LmluZGV4T2YoIigiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGdldE5ld05hbWUoKSArIG1ldGhvZFN1ZmZpeDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1vdmVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3OWExMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQW4gYWN0aW9uIGRlbGVnYXRlIHRoYXQgbGF1bmNoZXMgSkRUIG1vdmUgZWxlbWVudCB3aXphcmQKLSAqIAotICogU3RpbGwgcmVsaWVzIGhlYXZpbHkgb24gaW50ZXJuYWwgQVBJIHdpbGwgY2hhbmdlIHBvc3QgMy4wIHdpdGggcHVibGljIG1vdmUKLSAqIHN1cHBvcnQgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxODE3Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNb3ZlRWxlbWVudEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQkvLyBwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkvLyBmRWRpdG9yID0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KEpzVUlNZXNzYWdlcy5Nb3ZlRWxlbWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoSnNVSU1lc3NhZ2VzLk1vdmVFbGVtZW50X2xhYmVsKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkvLyBuby1vcCB1bnRpbCB3ZSBrbm93IGhvdyB3ZSdyZSBzdXBwb3NlZCB0byB1c2UgdGhpcwotCS8vIGVjbGlwc2UgMy4yTTUKLQkvLyBwdWJsaWMgbW92ZSBzdXBwb3J0OgotCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTgxNwotCS8vIElKYXZhU2NyaXB0RWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cygpOwotCS8vIGlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JLy8KLQkvLyAvLyBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgbW92YWJsZQotCS8vIHRyeSB7Ci0JLy8gSmF2YU1vdmVQcm9jZXNzb3IgcHJvY2Vzc29yID0KLQkvLyBKYXZhTW92ZVByb2Nlc3Nvci5jcmVhdGUoZ2V0UmVzb3VyY2VzKGVsZW1lbnRzKSwgZWxlbWVudHMpOwotCS8vCQkJCQotCS8vIFNoZWxsIHBhcmVudCA9Ci0JLy8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCS8vIE1vdmVSZWZhY3RvcmluZyByZWZhY3RvcmluZyA9IG5ldyBNb3ZlUmVmYWN0b3JpbmcocHJvY2Vzc29yKTsKLQkvLwotCS8vIFJlZmFjdG9yaW5nV2l6YXJkIHdpemFyZCA9IGNyZWF0ZVdpemFyZChyZWZhY3RvcmluZyk7Ci0JLy8KLQkvLyAvKgotCS8vICogV2Ugd2FudCB0byBnZXQgdGhlIHNoZWxsIGZyb20gdGhlIHJlZmFjdG9yaW5nIGRpYWxvZyBidXQKLQkvLyAqIGl0J3Mgbm90IGtub3duIGF0IHRoaXMgcG9pbnQsIHNvIHdlIHBhc3MgdGhlIHdpemFyZCBhbmQKLQkvLyAqIHRoZW4sIG9uY2UgdGhlIGRpYWxvZyBpcyBvcGVuLCB3ZSB3aWxsIGhhdmUgYWNjZXNzIHRvIGl0cwotCS8vICogc2hlbGwuCi0JLy8gKi8KLQkvLwotCS8vIHByb2Nlc3Nvci5zZXRDcmVhdGVUYXJnZXRRdWVyaWVzKG5ldyBDcmVhdGVUYXJnZXRRdWVyaWVzKHdpemFyZCkpOwotCS8vIHByb2Nlc3Nvci5zZXRSZW9yZ1F1ZXJpZXMobmV3IFJlb3JnUXVlcmllcyh3aXphcmQpKTsKLQkvLyAvLyBTdHJpbmcgb3BlblJlZmFjdG9yaW5nV2l6TXNnID0KLQkvLyAvLwotCS8vIFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJPcGVuUmVmYWN0b3JpbmdXaXphcmRBY3Rpb24ucmVmYWN0b3JpbmciKTsKLQkvLyAvLyAvLyROT04tTkxTLTEkCi0JLy8gU3RyaW5nIG9wZW5SZWZhY3RvcmluZ1dpek1zZyA9IEpTUFVJTWVzc2FnZXMuTW92ZUVsZW1lbnRXaXphcmQ7IC8vCi0JLy8gIk1vdmUKLQkvLyAvLyB0aGUKLQkvLyAvLyBzZWxlY3RlZAotCS8vIC8vIGVsZW1lbnRzIjsKLQkvLyAvLyAvLyROT04tTkxTLTEkCi0JLy8gbmV3IFJlZmFjdG9yaW5nU3RhcnRlcigpLmFjdGl2YXRlKHJlZmFjdG9yaW5nLCB3aXphcmQsIHBhcmVudCwKLQkvLyBvcGVuUmVmYWN0b3JpbmdXaXpNc2csIHRydWUpOwotCS8vCi0JLy8gUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLQkvLwotCS8vIH0KLQkvLyBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkvLyBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCS8vIH0KLQkvLyB9Ci0JLy8gZWxzZSB7Ci0JLy8gUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKEpTUFVJTWVzc2FnZXMuSlNQTW92ZUVsZW1lbnRBY3Rpb25fMCk7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCS8vIH0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkvLyBmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YThhMzc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFBhY2thZ2VSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCXB1YmxpYyBzdGF0aWMgQ2hhbmdlW10gY3JlYXRlQ2hhbmdlc0ZvcihJUGFja2FnZUZyYWdtZW50IHBrZywgU3RyaW5nIG5ld05hbWUpIHsKLQkJSnNTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgSlNQSW5kZXhNYW5hZ2VyCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMDM2Ci0JCS8vIHN1cHBvcnQuaW5kZXhXb3Jrc3BhY2VBbmRXYWl0KCk7Ci0JCUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEpTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IocGtnLCBuZXdOYW1lKTsKLQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZShwa2csIG5ldyBKc1NlYXJjaFNjb3BlKCksIHJlcXVlc3Rvcik7Ci0JCXJldHVybiByZXF1ZXN0b3IuZ2V0Q2hhbmdlcygpOwotCX0KLQkKLQkKLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJLy8gcmV0dXJuIHRoaXMucGtnOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSnNVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JLy8gbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBkZWNpZGUgY29ycmVjdCB2YWx1ZSBvZiBpc1ZhbGlkCi0JfQotCQotCQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gVGhpcyBtZXRob2QgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIG9iamVjdCBpcyBzdGlsbCB2YWxpZC4KLQkJLy8gVGhpcyBpcyBpbiBwYXJ0aWN1bGFyIGludGVyZXN0aW5nIHdoZW4gcGVyZm9ybWluZyBhbiB1bmRvIGNoYW5nZQotCQkvLyBzaW5jZSB0aGUgd29ya3NwYWNlIGNvdWxkIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgdW5kbyBjaGFuZ2UgaGFzCi0JCS8vIGJlZW4gY3JlYXRlZC4KLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkKLQkKLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHJldHVybiB0aGUgInVuZG8iIGNoYW5nZSBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxZjczYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIFJlbWVtYmVyIHRvIGNoYW5nZSB0aGUgcGx1Z2luLnhtbCBmaWxlIGlmIHRoZSBuYW1lIG9mIHRoaXMgY2xhc3MgY2hhbmdlcy4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFBhY2thZ2VSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgZlBrZyA9IG51bGw7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjaGVja0NvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQkKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQkKLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNoYW5nZVtdIGNoYW5nZXMgPSBKU1BQYWNrYWdlUmVuYW1lQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IodGhpcy5mUGtnLCBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCkpOwotCQlDb21wb3NpdGVDaGFuZ2UgbXVsdGlDaGFuZ2UgPSBudWxsOwotCQlpZiAoY2hhbmdlcy5sZW5ndGggPiAwKSB7Ci0JCQltdWx0aUNoYW5nZSA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoSnNVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzLCBjaGFuZ2VzKTsKLQkJfQotCQlyZXR1cm4gbXVsdGlDaGFuZ2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmICh0aGlzLmZQa2cgIT0gbnVsbCkgewotCQkJbmFtZSA9IHRoaXMuZlBrZy5nZXRFbGVtZW50TmFtZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotCQkJdGhpcy5mUGtnID0gKElQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTQ1OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQUGFja2FnZVJlbmFtZVJlcXVlc3RvciBleHRlbmRzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgewotCS8qKgotCSAqIEVsZW1lbnQgaXMgdGhlIG9sZCBwYWNrYWdlLiBuZXdOYW1lIGlzIHRoZSBuZXcgcGFja2FnZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG5ld05hbWUKLQkgKi8KLQlwdWJsaWMgSlNQUGFja2FnZVJlbmFtZVJlcXVlc3RvcihJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoZWxlbWVudCwgbmV3TmFtZSk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJU3RyaW5nIG5ld05hbWUgPSBnZXROZXdOYW1lKCk7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IE5MUy5iaW5kKEpzVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzUsIChuZXcgU3RyaW5nW10geyBwYWNrYWdlTmFtZSwgbmV3TmFtZSB9KSk7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZDJmYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFJlbmFtZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnJlZmFjdG9yaW5nLlJlbmFtZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpTUFJlbmFtZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJSmF2YVNjcmlwdEVsZW1lbnQgZ2V0U2VsZWN0ZWRFbGVtZW50KCkgewotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCUlKYXZhU2NyaXB0RWxlbWVudFtdIGVsZW1lbnRzID0gSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigoSVRleHRFZGl0b3IpIGZFZGl0b3IpOwotCQkJaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJZWxlbWVudCA9IGVsZW1lbnRzWzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoSnNVSU1lc3NhZ2VzLlJlbmFtZUVsZW1lbnRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KEpzVUlNZXNzYWdlcy5SZW5hbWVFbGVtZW50X2xhYmVsKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQgPSBnZXRTZWxlY3RlZEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJUmVuYW1lU3VwcG9ydCByZW5hbWVTdXBwb3J0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBJSmF2YVNjcmlwdEVsZW1lbnQuVFlQRToKLQkJCQkJCXJlbmFtZVN1cHBvcnQgPSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSgoSVR5cGUpIGVsZW1lbnQsIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSwgUmVuYW1lU3VwcG9ydC5VUERBVEVfUkVGRVJFTkNFUyk7Ci0JCQkJCWJyZWFrOwotCQkJCQljYXNlIElKYXZhU2NyaXB0RWxlbWVudC5NRVRIT0Q6Ci0JCQkJCQlyZW5hbWVTdXBwb3J0ID0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElGdW5jdGlvbikgZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSUphdmFTY3JpcHRFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6Ci0JCQkJCQlyZW5hbWVTdXBwb3J0ID0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQsIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSwgUmVuYW1lU3VwcG9ydC5VUERBVEVfUkVGRVJFTkNFUyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAocmVuYW1lU3VwcG9ydCAhPSBudWxsKSB7Ci0JCQkJCXJlbmFtZVN1cHBvcnQub3BlbkRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotCQkJCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmNsZWFyU3RhdHVzTGluZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoSnNVSU1lc3NhZ2VzLkpTUFJlbmFtZUVsZW1lbnRBY3Rpb25fMCk7Ci0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJZkVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWFhMzliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNQVHlwZU1vdmVDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCXB1YmxpYyBzdGF0aWMgQ2hhbmdlW10gY3JlYXRlQ2hhbmdlc0ZvcihJVHlwZSB0eXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlKc1NlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy8gc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkJSlNQVHlwZU1vdmVSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEpTUFR5cGVNb3ZlUmVxdWVzdG9yKHR5cGUsIG5ld05hbWUpOwotCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKHR5cGUsIG5ldyBKc1NlYXJjaFNjb3BlKCksIHJlcXVlc3Rvcik7Ci0JCXJldHVybiByZXF1ZXN0b3IuZ2V0Q2hhbmdlcygpOwotCX0KLQkKLQkKLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpzVUlNZXNzYWdlcy5KU1BfY2hhbmdlczsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkvLyBwYV9UT0RPIGltcGxlbWVudAotCS8vIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVjaWRlIGNvcnJlY3QgdmFsdWUgb2YgaXNWYWxpZAotCX0KLQkKLQkKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIFRoaXMgbWV0aG9kIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBvYmplY3QgaXMgc3RpbGwgdmFsaWQuCi0JCS8vIFRoaXMgaXMgaW4gcGFydGljdWxhciBpbnRlcmVzdGluZyB3aGVuIHBlcmZvcm1pbmcgYW4gdW5kbyBjaGFuZ2UKLQkJLy8gc2luY2UgdGhlIHdvcmtzcGFjZSBjb3VsZCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHVuZG8gY2hhbmdlIGhhcwotCQkvLyBiZWVuIGNyZWF0ZWQuCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyByZXR1cm4gdGhlICJ1bmRvIiBjaGFuZ2UgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4OGU0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLk1vdmVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlTW92ZVBhcnRpY2lwYW50IGV4dGVuZHMgTW92ZVBhcnRpY2lwYW50IHsKLQlJVHlwZSBmVHlwZSA9IG51bGw7Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjaGVja0NvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQkKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQkKLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwbSAhPSBudWxsICYmIHBtLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ29tcG9zaXRlQ2hhbmdlIG11bHRpQ2hhbmdlID0gbnVsbDsKLQkJT2JqZWN0IGRlc3QgPSBnZXRBcmd1bWVudHMoKS5nZXREZXN0aW5hdGlvbigpOwotCQlpZiAoZGVzdCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKLQkJCUNoYW5nZVtdIGNoYW5nZXMgPSBKU1BUeXBlTW92ZUNoYW5nZS5jcmVhdGVDaGFuZ2VzRm9yKGZUeXBlLCAoKElQYWNrYWdlRnJhZ21lbnQpIGRlc3QpLmdldEVsZW1lbnROYW1lKCkpOwotCQkJaWYgKGNoYW5nZXMubGVuZ3RoID4gMCkgewotCQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKc1VJTWVzc2FnZXMuSlNQX2NoYW5nZXMsIGNoYW5nZXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtdWx0aUNoYW5nZTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRoaXMuZlR5cGUgIT0gbnVsbCkgewotCQkJbmFtZSA9IHRoaXMuZlR5cGUuZ2V0RWxlbWVudE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0JCQl0aGlzLmZUeXBlID0gKElUeXBlKSBlbGVtZW50OwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NjA4MDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5KU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHlwZU1vdmVSZXF1ZXN0b3IgZXh0ZW5kcyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHsKLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBuZXdOYW1lCi0JICovCi0JcHVibGljIEpTUFR5cGVNb3ZlUmVxdWVzdG9yKElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3UGFja2FnZSkgewotCQlzdXBlcihlbGVtZW50LCBuZXdQYWNrYWdlKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJU3RyaW5nIG5ld05hbWUgPSBnZXROZXdOYW1lKCk7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpzVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzIsIG5ldyBTdHJpbmdbXSB7IHR5cGVOYW1lLCBuZXdOYW1lIH0pOwotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVuYW1lVGV4dChKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBzZWFyY2hEb2MsIFNlYXJjaE1hdGNoIGphdmFNYXRjaCkgewotCQlTdHJpbmcgcmVuYW1lVGV4dCA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCS8vCUpzVHJhbnNsYXRpb24gdHJhbnMgPSBzZWFyY2hEb2MuZ2V0SnNwVHJhbnNsYXRpb24oKTsKLQkJLy9TdHJpbmcgbWF0Y2hUZXh0ID0gdHJhbnMuZ2V0SnNUZXh0KCkuc3Vic3RyaW5nKGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldE9mZnNldCgpICsgamF2YU1hdGNoLmdldExlbmd0aCgpKTsKLQkJLy8gaWYgaXQncyBhbiBpbXBvcnQgb3IganNwOnVzZUJlYW4sIHdlIG5lZWQgdG8gYWRkIHRoZSBwYWNrYWdlIG5hbWUgYXMKLQkJLy8gd2VsbAotLy8gaWYgKHRyYW5zLmlzSW1wb3J0KGphdmFNYXRjaC5nZXRPZmZzZXQoKSkKLS8vCQkJCi0vLyB8fCBpc0Z1bGx5UXVhbGlmaWVkKG1hdGNoVGV4dCkpIHsKLS8vIGlmICghZ2V0TmV3TmFtZSgpLmVxdWFscygiIikpIHsKLS8vIC8vIGdldE5ld05hbWUoKSBpcyB0aGUgcGtnIG5hbWUKLS8vIHJlbmFtZVRleHQgPSBnZXROZXdOYW1lKCkgKyAiLiIgKyByZW5hbWVUZXh0OyAvLyROT04tTkxTLTEkCi0vLyB9Ci0vLyB9Ci0JCXJldHVybiByZW5hbWVUZXh0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGFkODhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlUmVuYW1lQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQlwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoSVR5cGUgdHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJSnNTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgSlNQSW5kZXhNYW5hZ2VyCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMDM2Ci0JCS8vIHN1cHBvcnQuaW5kZXhXb3Jrc3BhY2VBbmRXYWl0KCk7Ci0JCUpTUFR5cGVSZW5hbWVSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEpTUFR5cGVSZW5hbWVSZXF1ZXN0b3IodHlwZSwgbmV3TmFtZSk7Ci0JCXN1cHBvcnQuc2VhcmNoUnVubmFibGUodHlwZSwgbmV3IEpzU2VhcmNoU2NvcGUoKSwgcmVxdWVzdG9yKTsKLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRDaGFuZ2VzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKc1VJTWVzc2FnZXMuSlNQX2NoYW5nZXM7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkvLyBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlY2lkZSBjb3JyZWN0IHZhbHVlIG9mIGlzVmFsaWQKLQl9Ci0JCi0JCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBUaGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2Ugb2JqZWN0IGlzIHN0aWxsIHZhbGlkLgotCQkvLyBUaGlzIGlzIGluIHBhcnRpY3VsYXIgaW50ZXJlc3Rpbmcgd2hlbiBwZXJmb3JtaW5nIGFuIHVuZG8gY2hhbmdlCi0JCS8vIHNpbmNlIHRoZSB3b3Jrc3BhY2UgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB1bmRvIGNoYW5nZSBoYXMKLQkJLy8gYmVlbiBjcmVhdGVkLgotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gcmV0dXJuIHRoZSAidW5kbyIgY2hhbmdlIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmE0NmRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSUphdmFXZWJOb2RlOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogUmVtZW1iZXIgdG8gY2hhbmdlIHRoZSBwbHVnaW4ueG1sIGZpbGUgaWYgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBjaGFuZ2VzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50IGV4dGVuZHMgUmVuYW1lUGFydGljaXBhbnQgewotCXByaXZhdGUgSVR5cGUgZlR5cGUgPSBudWxsOwotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDaGFuZ2VbXSBjaGFuZ2VzID0gSlNQVHlwZVJlbmFtZUNoYW5nZS5jcmVhdGVDaGFuZ2VzRm9yKGZUeXBlLCBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCkpOwotCQlDb21wb3NpdGVDaGFuZ2UgbXVsdGlDaGFuZ2UgPSBudWxsOwotCQlpZiAoY2hhbmdlcy5sZW5ndGggPiAwKSB7Ci0JCQltdWx0aUNoYW5nZSA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoSnNVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzLCBjaGFuZ2VzKTsKLQkJfQotCQlyZXR1cm4gbXVsdGlDaGFuZ2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmICh0aGlzLmZUeXBlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbmFtZSA9IHRoaXMuZlR5cGUuZ2V0U291cmNlKCk7Ci0JCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCQotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgewotCQkJdGhpcy5mVHlwZSA9IChJVHlwZSkgZWxlbWVudDsKLQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhV2ViTm9kZSkgewotCQkJaWYoKChJSmF2YVdlYk5vZGUpZWxlbWVudCkuZ2V0SmF2YUVsZW1lbnQoKSBpbnN0YW5jZW9mIElUeXBlKSB7Ci0JCQkJdGhpcy5mVHlwZSA9IChJVHlwZSkgKChJSmF2YVdlYk5vZGUpZWxlbWVudCkuZ2V0SmF2YUVsZW1lbnQoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiY2U4NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLkpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQ3JlYXRlcyBkb2N1bWVudCBjaGFuZ2UocykgZm9yIGEgdHlwZSByZW5hbWUuIENoYW5nZXMgYXJlIGNyZWF0ZWQgZm9yIGV2ZXJ5Ci0gKiB0eXBlICJtYXRjaCIgaW4gdGhlIHdvcmtzcGFjZQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHlwZVJlbmFtZVJlcXVlc3RvciBleHRlbmRzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgewotCXB1YmxpYyBKU1BUeXBlUmVuYW1lUmVxdWVzdG9yKElUeXBlIHR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXN1cGVyKHR5cGUsIG5ld05hbWUpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSnNVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNCwgbmV3IFN0cmluZ1tdIHsgdHlwZU5hbWUsIG5ld05hbWUgfSk7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5hbWVUZXh0KEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB7Ci0JCVN0cmluZyByZW5hbWVUZXh0ID0gZ2V0TmV3TmFtZSgpOwotCS8vCVN0cmluZyBwa2cgPSBnZXRUeXBlKCkuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkvLwlKc1RyYW5zbGF0aW9uIHRyYW5zID0gc2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCk7Ci0JLy8JU3RyaW5nIG1hdGNoVGV4dCA9IHRyYW5zLmdldEpzVGV4dCgpLnN1YnN0cmluZyhqYXZhTWF0Y2guZ2V0T2Zmc2V0KCksIGphdmFNYXRjaC5nZXRPZmZzZXQoKSArIGphdmFNYXRjaC5nZXRMZW5ndGgoKSk7Ci0JCS8vIGlmIGl0J3MgYW4gaW1wb3J0IG9yIGpzcDp1c2VCZWFuIG9yIGZ1bGx5IHF1YWxpZmllZCB0eXBlLCB3ZSBuZWVkIHRvCi0JCS8vIGFkZCB0aGUgcGFja2FnZSBuYW1lIGFzIHdlbGwKLS8vIGlmICh0cmFucy5pc0ltcG9ydChqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkpCi0vLyB8fCAvKiB0cmFucy5pc1VzZUJlYW4oamF2YU1hdGNoLmdldE9mZnNldCgpKSB8fAotLy8gKi9pc0Z1bGx5UXVhbGlmaWVkKG1hdGNoVGV4dCkpIHsKLS8vIGlmICghcGtnLmVxdWFscygiIikpIHsKLS8vIHJlbmFtZVRleHQgPSBwa2cgKyAiLiIgKyByZW5hbWVUZXh0OyAvLyROT04tTkxTLTEkCi0vLyB9Ci0vLyB9Ci0JCXJldHVybiByZW5hbWVUZXh0OwotCX0KLQkKLS8vCXByaXZhdGUgSVR5cGUgZ2V0VHlwZSgpIHsKLS8vCQlyZXR1cm4gKElUeXBlKSBnZXRFbGVtZW50KCk7Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0Jhc2ljSnNTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvQmFzaWNKc1NlYXJjaFJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWQxMGJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvQmFzaWNKc1NlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5KU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFN1cHBvcnQ7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY0pzU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgU2VhcmNoUmVxdWVzdG9yIHsKLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanNwc2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBNYXBzIGphdmEgc2VhcmNoIGNvb3JkaW5hdGVzIHRvIGNvcnJlc3BvbmRpbmcgSlNQIGNvb3JkaW5hdGVzLiBBZGRzIHRoZQotCSAqIG1hdGNoZXMgdG8gdGhlIFNlYXJjaCBSZXN1bHRzIHZpZXcuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjYWNjZXB0U2VhcmNoTWF0Y2gob3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2gpCi0JICovCi0JCi0JcHVibGljIHZvaWQgYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2ggbWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBtYXRjaERvY3VtZW50UGF0aCA9IG1hdGNoLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQlTZWFyY2hEb2N1bWVudCBzZWFyY2hEb2MgPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5nZXRTZWFyY2hEb2N1bWVudChtYXRjaERvY3VtZW50UGF0aCk7Ci0JCWlmIChzZWFyY2hEb2MgIT0gbnVsbCAmJiBzZWFyY2hEb2MgaW5zdGFuY2VvZiBKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgewotCQkJSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUgamF2YVNlYXJjaERvYyA9IChKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgc2VhcmNoRG9jOwotCQkJaW50IGpzcFN0YXJ0ID0gbWF0Y2guZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQganNwRW5kID0gbWF0Y2guZ2V0T2Zmc2V0KCkgKyBtYXRjaC5nZXRMZW5ndGgoKTsKLQkJCUlKc1RyYW5zbGF0aW9uIHRyYW5zID0gamF2YVNlYXJjaERvYy5nZXRKc3BUcmFuc2xhdGlvbigpOwotCQkJU3RyaW5nIGpzcFRleHQgPSB0cmFucy5nZXRIdG1sVGV4dCgpOwotCQkJU3RyaW5nIGphdmFUZXh0ID0gamF2YVNlYXJjaERvYy5nZXRKYXZhVGV4dCgpOwotCQkJaWYgKEJhc2ljSnNTZWFyY2hSZXF1ZXN0b3IuREVCVUcpIHsKLQkJCQlkaXNwbGF5RGVidWdJbmZvKG1hdGNoLCBqc3BTdGFydCwganNwRW5kLCBqc3BUZXh0LCBqYXZhVGV4dCk7Ci0JCQl9Ci0JCQlpZiAoanNwU3RhcnQgPiAtMSAmJiBqc3BFbmQgPiAtMSkgewotCQkJCWFkZFNlYXJjaE1hdGNoKG5ldyBEb2N1bWVudCh0cmFucy5nZXRIdG1sVGV4dCgpKSwgamF2YVNlYXJjaERvYy5nZXRGaWxlKCksIGpzcFN0YXJ0LCBqc3BFbmQsIGpzcFRleHQpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzZWFyY2hEb2MKLQkgKiBAcGFyYW0ganNwU3RhcnQKLQkgKiBAcGFyYW0ganNwRW5kCi0JICogQHBhcmFtIGpzcFRyYW5zbGF0aW9uCi0JICogQHBhcmFtIGpzcFRleHQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWFyY2hNYXRjaChJRG9jdW1lbnQganNwRG9jdW1lbnQsIElGaWxlIGpzcEZpbGUsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgU3RyaW5nIGpzcFRleHQpIHsKLQkvLyBpbXBsZW1lbnQgaW4gc3ViY2xhc3MKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjYmVnaW5SZXBvcnRpbmcoKQotCSAqLwotCQotCXB1YmxpYyB2b2lkIGJlZ2luUmVwb3J0aW5nKCkgewotCQlpZiAoQmFzaWNKc1NlYXJjaFJlcXVlc3Rvci5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgU2VhcmNoIHJlcXVlc3RvcjogYmVnaW5SZXBvcnRpbmcoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRm9yIGRlYnVnLgotCSAqIAotCSAqIEBwYXJhbSBvcmlnTWF0Y2gKLQkgKiBAcGFyYW0ganNwU3RhcnQKLQkgKiBAcGFyYW0ganNwRW5kCi0JICogQHBhcmFtIGpzcFRleHQKLQkgKiBAcGFyYW0gamF2YVRleHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzcGxheURlYnVnSW5mbyhTZWFyY2hNYXRjaCBvcmlnTWF0Y2gsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgU3RyaW5nIGpzcFRleHQsIFN0cmluZyBqYXZhVGV4dCkgewotCQlpZiAob3JpZ01hdGNoID09IG51bGwgfHwganNwU3RhcnQgPT0gLTEgfHwganNwRW5kID09IC0xIHx8IGpzcEVuZCA8IGpzcFN0YXJ0IHx8IGpzcFRleHQgPT0gbnVsbCB8fCBqYXZhVGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJhY2NlcHQgcG9zc2libGUgbWF0Y2ggW2pzcERvYzogIiArIG9yaWdNYXRjaC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpICsgIiAiICsgb3JpZ01hdGNoLmdldE9mZnNldCgpICsgIjoiICsgb3JpZ01hdGNoLmdldE9mZnNldCgpICsgb3JpZ01hdGNoLmdldExlbmd0aCgpICsgIl0/Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJtYXRjaCBpbmZvOiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigidGhlIGphdmEgdGV4dCBpczoiICsgamF2YVRleHQuc3Vic3RyaW5nKG9yaWdNYXRjaC5nZXRPZmZzZXQoKSwgb3JpZ01hdGNoLmdldE9mZnNldCgpICsgb3JpZ01hdGNoLmdldExlbmd0aCgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJqYXZhIHNlYXJjaCBtYXRjaCB0cmFuc2xhdGVzIHRvIGpzcCBjb29yZHMgW3N0YXJ0OiAiICsganNwU3RhcnQgKyAiIGVuZDoiICsganNwRW5kICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgdGhlIGpzcCB0ZXh0IGlzOiIgKyBqc3BUZXh0LnN1YnN0cmluZyhqc3BTdGFydCwganNwRW5kKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjZW5kUmVwb3J0aW5nKCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBlbmRSZXBvcnRpbmcoKSB7Ci0JCWlmIChCYXNpY0pzU2VhcmNoUmVxdWVzdG9yLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBTZWFyY2ggcmVxdWVzdG9yOiBlbmRSZXBvcnRpbmcoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjZW50ZXJQYXJ0aWNpcGFudChvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBlbnRlclBhcnRpY2lwYW50KFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0JCWlmIChCYXNpY0pzU2VhcmNoUmVxdWVzdG9yLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBTZWFyY2ggcmVxdWVzdG9yOiBlbnRlclBhcnRpY2lwYW50KCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2V4aXRQYXJ0aWNpcGFudChvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBleGl0UGFydGljaXBhbnQoU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQkJaWYgKEJhc2ljSnNTZWFyY2hSZXF1ZXN0b3IuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFNlYXJjaCByZXF1ZXN0b3I6IGV4aXRQYXJ0aWNpcGFudCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc0ZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZmM2MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc0ZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zZWFyY2guSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0ZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGV4dGVuZHMgRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgTGlzdCBmUHJvY2Vzc29yczsKLQkKLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcm9jZXNzb3JzKCkgewotCQlpZiAoZlByb2Nlc3NvcnMgPT0gbnVsbCkgewotCQkJZlByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGh0bWxQcm9jZXNzb3IgPSBuZXcgSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcigpOwotCQkJZlByb2Nlc3NvcnMuYWRkKGh0bWxQcm9jZXNzb3IpOwotCQkJLy8gdGVtcG9yYXJ5LCB3b3JrYXJvdW5kIHRvIGRpc2FibGUgZnVuY3Rpb24sIHNpbmNlIHVzaW5nIHRoZQotCQkJLy8gZnVuY3Rpb24KLQkJCS8vIGNhbiBlYXNpbHkgY2F1c2UgZGVhZGxvY2sgdG8gb2NjdXIuCi0JCQkvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzY2MgotLy8gSlNQRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGpzcFByb2Nlc3NvciA9IG5ldwotLy8gSlNQRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0vLyBmUHJvY2Vzc29ycy5hZGQoanNwUHJvY2Vzc29yKTsKLQkJfQotCQlyZXR1cm4gZlByb2Nlc3NvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc0ZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc0ZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTBkOTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS50ZXh0LklKc1BhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGV4dGVuZHMgRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIHsKLQlwcml2YXRlIElKYXZhU2NyaXB0RWxlbWVudCBnZXRKYXZhRWxlbWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50W10gZWxlbWVudHMgPSBnZXRKYXZhRWxlbWVudHNGb3JDdXJyZW50U2VsZWN0aW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQkJcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA+IDAgPyBlbGVtZW50c1swXSA6IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIHVzZXMgSlNQVHJhbnNsYXRpb24gdG8gZ2V0IGN1cnJlbnRseSBzZWxlY3RlZCBKYXZhIGVsZW1lbnRzLgotCSAqIAotCSAqIEByZXR1cm4gY3VycmVudGx5IHNlbGVjdGVkIElKYXZhRWxlbWVudHMKLQkgKi8KLQlwcml2YXRlIElKYXZhU2NyaXB0RWxlbWVudFtdIGdldEphdmFFbGVtZW50c0ZvckN1cnJlbnRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFTY3JpcHRFbGVtZW50WzBdOwotCQkvLyBnZXQgSlNQIHRyYW5zbGF0aW9uIG9iamVjdCBmb3IgdGhpcyB2aWV3ZXIncyBkb2N1bWVudAotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJSUpzVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBhZGFwdGVyLmdldEpzVHJhbnNsYXRpb24oZmFsc2UpOwotCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyMjExCi0JCQkJCWVsZW1lbnRzID0gdHJhbnNsYXRpb24uZ2V0RWxlbWVudHNGcm9tSnNSYW5nZShzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCQotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJ0aXRpb25UeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IElKc1BhcnRpdGlvbnMuSHRtbEpzUGFydGl0aW9uIH07Ci0JfQotCQotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRSZWdpb25UeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCB9OwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSVNlYXJjaFF1ZXJ5IGdldFNlYXJjaFF1ZXJ5KElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyByZWdpb25UZXh0LCBTdHJpbmcgcmVnaW9uVHlwZSwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnQgamF2YVNjcmlwdEVsZW1lbnQgPSBnZXRKYXZhRWxlbWVudChkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCWlmIChqYXZhU2NyaXB0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IEpzU2VhcmNoUXVlcnkoZmlsZSwgamF2YVNjcmlwdEVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc09jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNDk4N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc09jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQ7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCBleHRlbmRzIE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0IHsKLQlwdWJsaWMgSnNPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdChJU2VhcmNoUXVlcnkgcXVlcnkpIHsKLQkJc3VwZXIocXVlcnkpOwotCX0KLQkKLQkKLQlwdWJsaWMgTWF0Y2hbXSBnZXRNYXRjaGVzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TWF0Y2hlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTZWFyY2hRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc1NlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODA3ZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc1NlYXJjaFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5CYXNpY1NlYXJjaFF1ZXJ5OwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNTZWFyY2hRdWVyeSBleHRlbmRzIEJhc2ljU2VhcmNoUXVlcnkgewotCS8qKiB0aGUgSUphdmFTY3JpcHRFbGVtZW50IHdlIGFyZSBzZWFyY2hpbmcgZm9yIGluIHRoZSBmaWxlICogKi8KLQlwcml2YXRlIElKYXZhU2NyaXB0RWxlbWVudCBmRWxlbWVudCA9IG51bGw7Ci0JCi0JcHVibGljIEpzU2VhcmNoUXVlcnkoSUZpbGUgZmlsZSwgSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoZmlsZSk7Ci0JCXRoaXMuZkVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXJ1bigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjY2FuUnVuSW5CYWNrZ3JvdW5kKCkKLQkgKi8KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW5JbkJhY2tncm91bmQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1F1ZXJ5KCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXRyeSB7Ci0JCQlKc1NlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkJLy8gaW5kZXggdGhlIGZpbGUKLQkJCVNlYXJjaERvY3VtZW50IGRlbGVnYXRlID0gc3VwcG9ydC5hZGRKc3BGaWxlKGdldEZpbGUoKSk7Ci0JCQlTdHJpbmcgc2NvcGVQYXRoID0gZGVsZWdhdGUuZ2V0UGF0aCgpOwotCQkJSnNTZWFyY2hTY29wZSBzaW5nbGVGaWxlU2NvcGUgPSBuZXcgSnNTZWFyY2hTY29wZShuZXcgU3RyaW5nW10geyBnZXRGaWxlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBzY29wZVBhdGggfSk7Ci0JCQkvLyBwZXJmb3JtIGEgc2VhcmNocwotCQkJLy8gYnkgcGFzc2luZyBpbiB0aGlzIGpzcCBzZWFyY2ggcXVlcnksIHJlcXVzdG9yIGNhbiBhZGQgbWF0Y2hlcwotCQkJLy8gc3VwcG9ydC5zZWFyY2hSdW5uYWJsZShnZXRKYXZhRWxlbWVudCgpLCBzaW5nbGVGaWxlU2NvcGUsIG5ldwotCQkJLy8gSlNQU2luZ2xlRmlsZVNlYXJjaFJlcXVlc3RvcihnZXRJbnN0YW5jZSgpKSk7Ci0JCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKGdldEphdmFFbGVtZW50KCksIHNpbmdsZUZpbGVTY29wZSwgbmV3IEpzU2luZ2xlRmlsZVNlYXJjaFJlcXVlc3RvcihnZXRJbnN0YW5jZSgpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIiwgSVN0YXR1cy5PSywgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRGaWxlbmFtZSgpIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gSnNVSU1lc3NhZ2VzLk9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMjsKLQkJaWYgKGdldEZpbGUoKSAhPSBudWxsKSB7Ci0JCQlmaWxlbmFtZSA9IGdldEZpbGUoKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGZpbGVuYW1lOwotCX0KLQkKLQkvLyBmb3IgYWNjZXNzIGJ5IGlubmVyIGNsYXNzCi0JcHVibGljIEpzU2VhcmNoUXVlcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50IGdldEphdmFFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5mRWxlbWVudDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldExhYmVsKCkKLQkgKi8KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlTdHJpbmdbXSBhcmdzID0geyBnZXRTZWFyY2hUZXh0KCksIGdldE9jY3VycmVuY2VzQ291bnRUZXh0KCksIGdldEZpbGVuYW1lKCkgfTsKLQkJcmV0dXJuIE5MUy5iaW5kKEpzVUlNZXNzYWdlcy5PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzAsIGFyZ3MpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRPY2N1cnJlbmNlc0NvdW50VGV4dCgpIHsKLQkJU3RyaW5nIGNvdW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcGFfVE9ETyBtYWtlIGR5bmFtaWMKLQkJcmV0dXJuIGNvdW50OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjZ2V0U2VhcmNoUmVzdWx0KCkKLQkgKi8KLQkKLQlwdWJsaWMgSVNlYXJjaFJlc3VsdCBnZXRTZWFyY2hSZXN1bHQoKSB7Ci0JCXJldHVybiBuZXcgSnNPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCh0aGlzKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWFyY2hUZXh0KCkgewotCQlyZXR1cm4gZkVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzU2VhcmNoUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZmViNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc1NlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLklTZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc1NlYXJjaFJlcXVlc3RvciBleHRlbmRzIEJhc2ljSnNTZWFyY2hSZXF1ZXN0b3IgewotCXByaXZhdGUgSVNlYXJjaFJlcXVlc3RvciBmSmF2YVJlcXVlc3RvciA9IG51bGw7Ci0JCi0JcHVibGljIEpzU2VhcmNoUmVxdWVzdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgSnNTZWFyY2hSZXF1ZXN0b3IoSVNlYXJjaFJlcXVlc3RvciBqYXZhUmVxdWVzdG9yKSB7Ci0JCS8vIG5lZWQgdG8gcmVwb3J0IG1hdGNoZXMgdG8gamF2YVJlcXVlc3RvcgotCQl0aGlzLmZKYXZhUmVxdWVzdG9yID0gamF2YVJlcXVlc3RvcjsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VhcmNoTWF0Y2goSURvY3VtZW50IGpzcERvY3VtZW50LCBJRmlsZSBqc3BGaWxlLCBpbnQganNwU3RhcnQsIGludCBqc3BFbmQsIFN0cmluZyBqc3BUZXh0KSB7Ci0JCWlmICghanNwRmlsZS5leGlzdHMoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBsaW5lTnVtYmVyID0gLTE7Ci0JCXRyeSB7Ci0JCQlsaW5lTnVtYmVyID0ganNwRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGpzcFN0YXJ0KTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigib2Zmc2V0OiAiICsgSW50ZWdlci50b1N0cmluZyhqc3BTdGFydCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY3JlYXRlU2VhcmNoTWFya2VyKGpzcEZpbGUsIGpzcFN0YXJ0LCBqc3BFbmQsIGxpbmVOdW1iZXIpOwotCQlpZiAodGhpcy5mSmF2YVJlcXVlc3RvciAhPSBudWxsKSB7Ci0JCQlNYXRjaCBtYXRjaCA9IG5ldyBNYXRjaChqc3BGaWxlLCBqc3BTdGFydCwganNwRW5kIC0ganNwU3RhcnQpOwotCQkJdGhpcy5mSmF2YVJlcXVlc3Rvci5yZXBvcnRNYXRjaChtYXRjaCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGpzcEZpbGUKLQkgKiBAcGFyYW0ganNwU3RhcnQKLQkgKiBAcGFyYW0ganNwRW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlYXJjaE1hcmtlcihJRmlsZSBqc3BGaWxlLCBpbnQganNwU3RhcnQsIGludCBqc3BFbmQsIGludCBsaW5lTnVtYmVyKSB7Ci0JCXRyeSB7Ci0JCQlJTWFya2VyIG1hcmtlciA9IGpzcEZpbGUuY3JlYXRlTWFya2VyKE5ld1NlYXJjaFVJLlNFQVJDSF9NQVJLRVIpOwotCQkJSGFzaE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoNCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIG5ldyBJbnRlZ2VyKGpzcFN0YXJ0KSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCBuZXcgSW50ZWdlcihqc3BFbmQpKTsKLQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTElORV9OVU1CRVIsIG5ldyBJbnRlZ2VyKGxpbmVOdW1iZXIpKTsKLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzU2luZ2xlRmlsZVNlYXJjaFJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc1NpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1NjUyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzU2luZ2xlRmlsZVNlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzU2luZ2xlRmlsZVNlYXJjaFJlcXVlc3RvciBleHRlbmRzIEJhc2ljSnNTZWFyY2hSZXF1ZXN0b3IgewotCXByaXZhdGUgSnNTZWFyY2hRdWVyeSBmUXVlcnkgPSBudWxsOwotCQotCXB1YmxpYyBKc1NpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IoSnNTZWFyY2hRdWVyeSBxdWVyeSkgewotCQl0aGlzLmZRdWVyeSA9IHF1ZXJ5OwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWFyY2hNYXRjaChJRG9jdW1lbnQganNwRG9jdW1lbnQsIElGaWxlIGpzcEZpbGUsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgU3RyaW5nIGpzcFRleHQpIHsKLQkJLy8gYWRkIG1hdGNoIHRvIEpTUCBxdWVyeS4uLgotCQl0aGlzLmZRdWVyeS5hZGRNYXRjaChqc3BEb2N1bWVudCwganNwU3RhcnQsIGpzcEVuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9Kc01hdGNoUHJlc2VudGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pzTWF0Y2hQcmVzZW50YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhODg4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pzTWF0Y2hQcmVzZW50YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSU1hdGNoUHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkJhc2ljU2VhcmNoTGFiZWxQcm92aWRlcjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc01hdGNoUHJlc2VudGF0aW9uIGltcGxlbWVudHMgSU1hdGNoUHJlc2VudGF0aW9uIHsKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb24jY3JlYXRlTGFiZWxQcm92aWRlcigpCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGNyZWF0ZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLklNYXRjaFByZXNlbnRhdGlvbiNzaG93TWF0Y2gob3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2gsCi0JICogICAgICBpbnQsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93TWF0Y2goTWF0Y2ggbWF0Y2gsIGludCBjdXJyZW50T2Zmc2V0LCBpbnQgY3VycmVudExlbmd0aCwgYm9vbGVhbiBhY3RpdmF0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gT2JqZWN0IG9iaiA9IG1hdGNoLmdldEVsZW1lbnQoKTsKLQkJLy8gc2hvdyBtYXRjaCBpbiBKU1AgZWRpdG9yCi0JCWlmIChhY3RpdmF0ZSkgewotCQkJLy8gdXNlIHNob3cgaW4gdGFyZ2V0PwotCQl9IGVsc2UgewotCQkJLy8ganVzdCBzZWxlY3QKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSnNRdWVyeVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pzUXVlcnlQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWY1MjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSnNRdWVyeVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guRWxlbWVudFF1ZXJ5U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSU1hdGNoUHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JUXVlcnlQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSVNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guUXVlcnlTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5Kc1NlYXJjaFJlcXVlc3RvcjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc1F1ZXJ5UGFydGljaXBhbnQgaW1wbGVtZW50cyBJUXVlcnlQYXJ0aWNpcGFudCB7Ci0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQjZXN0aW1hdGVUaWNrcyhvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guUXVlcnlTcGVjaWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyBpbnQgZXN0aW1hdGVUaWNrcyhRdWVyeVNwZWNpZmljYXRpb24gZGF0YSkgewotCQkvLyBwYV9UT0RPIHVzZSBwcm9qZWN0IGZpbGUgY291bnRlciBmcm9tIEpTUFNlYXJjaFN1cHBvcnQuLi4KLQkJcmV0dXJuIDA7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLklRdWVyeVBhcnRpY2lwYW50I2dldFVJUGFydGljaXBhbnQoKQotCSAqLwotCXB1YmxpYyBJTWF0Y2hQcmVzZW50YXRpb24gZ2V0VUlQYXJ0aWNpcGFudCgpIHsKLQkJcmV0dXJuIG5ldyBKc01hdGNoUHJlc2VudGF0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLklRdWVyeVBhcnRpY2lwYW50I3NlYXJjaChvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSVNlYXJjaFJlcXVlc3RvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5RdWVyeVNwZWNpZmljYXRpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWFyY2goSVNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIFF1ZXJ5U3BlY2lmaWNhdGlvbiBxdWVyeVNwZWNpZmljYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBpbmRleElmTmVlZGVkKCk7Ci0JCS8vIGRvIHNlYXJjaCBiYXNlZCBvbiB0aGUgcGFydGljdWxhciBKYXZhIHF1ZXJ5Ci0JCWlmIChxdWVyeVNwZWNpZmljYXRpb24gaW5zdGFuY2VvZiBFbGVtZW50UXVlcnlTcGVjaWZpY2F0aW9uKSB7Ci0JCQkvLyBlbGVtZW50IHNlYXJjaCAoZWcuIGZyb20gZ2xvYmFsIGZpbmQgcmVmZXJlbmNlcyBpbiBKYXZhIGZpbGUpCi0JCQlFbGVtZW50UXVlcnlTcGVjaWZpY2F0aW9uIGVsZW1lbnRRdWVyeSA9IChFbGVtZW50UXVlcnlTcGVjaWZpY2F0aW9uKSBxdWVyeVNwZWNpZmljYXRpb247Ci0JCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRRdWVyeS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoSnNRdWVyeVBhcnRpY2lwYW50LkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgUXVlcnkgUGFydGljaXBhbnQgc2VhcmNoaW5nIG9uIEVMRU1FTlQ6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU2VhcmNoUmVxdWVzdG9yIGpzcFJlcXVlc3RvciA9IG5ldyBKc1NlYXJjaFJlcXVlc3RvcihyZXF1ZXN0b3IpOwotCQkJLy8gcGFfVE9ETyBuZWVkIHRvIGFkYXB0IEphdmFTZWFyY2hTY29wZSB0byBhIEpTUFNlYXJjaFNjb3BlCi0JCQlKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5zZWFyY2goZWxlbWVudCwgbmV3IEpzU2VhcmNoU2NvcGUoKSwganNwUmVxdWVzdG9yKTsKLQkJfSBlbHNlIGlmIChxdWVyeVNwZWNpZmljYXRpb24gaW5zdGFuY2VvZiBQYXR0ZXJuUXVlcnlTcGVjaWZpY2F0aW9uKSB7Ci0JCQkvLyBwYXR0ZXJuIHNlYXJjaCAoZWcuIGZyb20gSmF2YSBzZWFyY2ggcGFnZSkKLQkJCVBhdHRlcm5RdWVyeVNwZWNpZmljYXRpb24gcGF0dGVyblF1ZXJ5ID0gKFBhdHRlcm5RdWVyeVNwZWNpZmljYXRpb24pIHF1ZXJ5U3BlY2lmaWNhdGlvbjsKLQkJCVN0cmluZyBwYXR0ZXJuID0gcGF0dGVyblF1ZXJ5LmdldFBhdHRlcm4oKTsKLQkJCWlmIChKc1F1ZXJ5UGFydGljaXBhbnQuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBRdWVyeSBQYXJ0aWNpcGFudCBzZWFyY2hpbmcgb24gUEFUVEVSTjogIiArIHBhdHRlcm4pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTZWFyY2hSZXF1ZXN0b3IganNwUmVxdWVzdG9yID0gbmV3IEpzU2VhcmNoUmVxdWVzdG9yKHJlcXVlc3Rvcik7Ci0JCQlKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5zZWFyY2gocGF0dGVybiwgbmV3IEpzU2VhcmNoU2NvcGUoKSwgcGF0dGVyblF1ZXJ5LmdldFNlYXJjaEZvcigpLCBwYXR0ZXJuUXVlcnkuZ2V0TGltaXRUbygpLCBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSCwgZmFsc2UsIGpzcFJlcXVlc3Rvcik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU0RULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU0RULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YjZhNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNEVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckpTRFQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuQXNzZXJ0OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNEVCBpbXBsZW1lbnRzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgewotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2FkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIHRoZXNlIGFyZSB0aGUgbWFpbiBmYWN0b3JpZXMsIG9uIG1vZGVsJ3MgZmFjdG9yeSByZWdpc3RyeQotCQlhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoc3RydWN0dXJlZE1vZGVsKTsKLQkJLy8gLS0tLS0tLQotCQkvLyBNdXN0IHVwZGF0ZS9hZGQgdG8gcHJvcGFnYXRpbmcgYWRhcHRlcnMgaGVyZSB0b28KLQkJYWRkUHJvcGFnYXRpbmdBZGFwdGVycyhzdHJ1Y3R1cmVkTW9kZWwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHN0cnVjdHVyZWRNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmYWN0b3J5UmVnaXN0cnksICJQcm9ncmFtIEVycm9yOiBjbGllbnQgY2FsbGVyIG11c3QgZW5zdXJlIG1vZGVsIGhhcyBmYWN0b3J5IHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJZmFjdG9yeSA9IGZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKCEoZmFjdG9yeSBpbnN0YW5jZW9mIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySlNEVCkpIHsKLQkJCWZhY3RvcnlSZWdpc3RyeS5yZW1vdmVGYWN0b3JpZXNGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJZmFjdG9yeSA9IG5ldyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckpTRFQoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQkJCi0JCUpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5zZXR1cEFkYXB0ZXJGYWN0b3J5KHN0cnVjdHVyZWRNb2RlbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BhZ2F0aW5nQWRhcHRlcnMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHt9Ci0JCi0JLyoKLQkgKiBAc2VlIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIjaXNGb3IoQ29udGVudFR5cGVEZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKSB7Ci0JCS8vIHJldHVybiAoY29udGVudFR5cGVEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIE1vZGVsSGFuZGxlckZvckpTUCk7Ci0JCXJldHVybiAoY29udGVudFR5cGVEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIE1vZGVsSGFuZGxlckZvckhUTUwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWluaXRpYWxpemVGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJYWRkQWRhcHRlckZhY3RvcmllcyhzdHJ1Y3R1cmVkTW9kZWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzSnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzSnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyMzdkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0pzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5zdHlsZTsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c0pzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09OVEVOVCA9ICJqc3BfY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9JU3R5bGVDb25zdGFudHNKU0RULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSVN0eWxlQ29uc3RhbnRzSlNEVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWM1MWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9JU3R5bGVDb25zdGFudHNKU0RULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlQ29uc3RhbnRzSlNEVCB7Ci0JU3RyaW5nIEpBVkFfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKQVZBX0tFWVdPUkQgPSAia2V5d29yZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFWQV9TSU5HTEVfTElORV9DT01NRU5UID0gInNpbmdsZV9saW5lX2NvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpBVkFfTVVMVElfTElORV9DT01NRU5UID0gIm11bHRpX2xpbmVfY29tbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFWQV9TVFJJTkcgPSAic3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0pTRFRDb2RlU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0pTRFRDb2RlU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmQ1MGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KU0RUQ29kZVNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuRW5kT2ZMaW5lUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklDaGFyYWN0ZXJTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV29yZERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuTXVsdGlMaW5lUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlBhdHRlcm5SdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuU2luZ2xlTGluZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLldvcmRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNEYXRhVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1jbGFzcyBKU0RUQ29kZVNjYW5uZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlJ1bGVCYXNlZFNjYW5uZXIgewotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZnQ29uc3RhbnRzID0gSnNEYXRhVHlwZXMuQ09OU1RBTlRTOwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZnS2V5d29yZHMgPSBKc0RhdGFUeXBlcy5LRVlXT1JEUzsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmZ1R5cGVzID0gSnNEYXRhVHlwZXMuVFlQRVM7Ci0JcHJpdmF0ZSBJVG9rZW4gZkRlZmF1bHRUb2tlbjsKLQlwcml2YXRlIElUb2tlbiBmS2V5d29yZFRva2VuOwotCXByaXZhdGUgSVRva2VuIGZTaW5nbGVMaW5lQ29tbWVudFRva2VuOwotCXByaXZhdGUgSVRva2VuIGZNdWx0aUxpbmVDb21tZW50VG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZlN0cmluZ1Rva2VuOwotCXByaXZhdGUgSVRva2VuIGZUeXBlVG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZkhUTUxDb21tZW50Qm9yZGVyVG9rZW47Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIEphdmEgY29kZSBzY2FubmVyCi0JICovCi0JcHVibGljIEpTRFRDb2RlU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVJ1bGVzKCkgewotCQlMaXN0IHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBBZGQgcnVsZSBmb3IgbXVsdGlwbGUgbGluZSBjb21tZW50cy4KLQkJcnVsZXMuYWRkKG5ldyBNdWx0aUxpbmVSdWxlKCIvKiIsICIqLyIsIGZNdWx0aUxpbmVDb21tZW50VG9rZW4pKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJLy8gQWRkIHJ1bGUgZm9yIHNpbmdsZSBsaW5lIGNvbW1lbnRzLgotCQlydWxlcy5hZGQobmV3IE5vbmVJbmNsdXNpdmVFbmRTZXF1ZW5jZVNpbmdsZUxpbmVSdWxlKCIvLyIsICItLT4iLCBmU2luZ2xlTGluZUNvbW1lbnRUb2tlbikpOy8vJE5PTi1OTFMtMSQKLQkJLy8gQWRkIHJ1bGUgZm9yIHN0cmluZ3MgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuCi0JCXJ1bGVzLmFkZChuZXcgU2luZ2xlTGluZVJ1bGUoIlwiIiwgIlwiIiwgZlN0cmluZ1Rva2VuLCAnXFwnKSk7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcnVsZXMuYWRkKG5ldyBTaW5nbGVMaW5lUnVsZSgiJyIsICInIiwgZlN0cmluZ1Rva2VuLCAnXFwnKSk7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJLy8gQWRkIGdlbmVyaWMgd2hpdGVzcGFjZSBydWxlLgotCQkvLyBydWxlcy5hZGQobmV3IFdoaXRlc3BhY2VSdWxlKG5ldyBKYXZhV2hpdGVzcGFjZURldGVjdG9yKCkpKTsKLQkJLy8gQWRkIHdvcmQgcnVsZSBmb3Iga2V5d29yZHMsIHR5cGVzLCBhbmQgY29uc3RhbnRzLgotCQlXb3JkUnVsZSB3b3JkUnVsZSA9IG5ldyBXb3JkUnVsZShuZXcgSmF2YVdvcmREZXRlY3RvcigpLCBmRGVmYXVsdFRva2VuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBKU0RUQ29kZVNjYW5uZXIuZmdLZXl3b3Jkcy5sZW5ndGg7IGkrKykgewotCQkJd29yZFJ1bGUuYWRkV29yZChKU0RUQ29kZVNjYW5uZXIuZmdLZXl3b3Jkc1tpXSwgZktleXdvcmRUb2tlbik7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBKU0RUQ29kZVNjYW5uZXIuZmdUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJd29yZFJ1bGUuYWRkV29yZChKU0RUQ29kZVNjYW5uZXIuZmdUeXBlc1tpXSwgZlR5cGVUb2tlbik7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBKU0RUQ29kZVNjYW5uZXIuZmdDb25zdGFudHMubGVuZ3RoOyBpKyspIHsKLQkJCXdvcmRSdWxlLmFkZFdvcmQoSlNEVENvZGVTY2FubmVyLmZnQ29uc3RhbnRzW2ldLCBmVHlwZVRva2VuKTsKLQkJfQotCQlydWxlcy5hZGQod29yZFJ1bGUpOwotCQkKLQkJLy9hZGQgd29yZCBydWxlIGZvciBIVE1MIHN0eWxlIGNvbW1lbnQgZGVsaW1pdGVycwotCQlydWxlcy5hZGQobmV3IFdvcmRSdWxlKG5ldyBIVE1MQ29tbWVudERldGVjdG9yKCksIHRoaXMuZkhUTUxDb21tZW50Qm9yZGVyVG9rZW4pKTsKLQkJCi0JCS8vYWRkIHJ1bGUgZm9yIHRleHQgYWZ0ZXIgbGVhZGluZyBIVE1MIGNvbW1lbnQgZGVsaW1pdGVyCi0JCXJ1bGVzLmFkZChuZXcgTm9uZUluY2x1c2l2ZVN0YXJ0U2VxdWVuY2VFbmRPZkxpbmVSdWxlKCI8IS0tIiwgdGhpcy5mU2luZ2xlTGluZUNvbW1lbnRUb2tlbikpOwotCQkKLQkJSVJ1bGVbXSByZXN1bHQgPSBuZXcgSVJ1bGVbcnVsZXMuc2l6ZSgpXTsKLQkJcnVsZXMudG9BcnJheShyZXN1bHQpOwotCQlzZXRSdWxlcyhyZXN1bHQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUb2tlbkRhdGEoU3RyaW5nIHRva2VuS2V5LCBPYmplY3QgZGF0YSkgewotCQlpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX0tFWVdPUkQpIHsKLQkJCWZLZXl3b3JkVG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCQlmVHlwZVRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9IGVsc2UgaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9TVFJJTkcpIHsKLQkJCWZTdHJpbmdUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfSBlbHNlIGlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCkgewotCQkJZlNpbmdsZUxpbmVDb21tZW50VG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0gZWxzZSBpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX01VTFRJX0xJTkVfQ09NTUVOVCkgewotCQkJZk11bHRpTGluZUNvbW1lbnRUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfSBlbHNlIGlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfREVGQVVMVCkgewotCQkJZkRlZmF1bHRUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfSBlbHNlIGlmKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUikgewotCQkJZkhUTUxDb21tZW50Qm9yZGVyVG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+RGV0ZWN0b3IgZm9yIEhUTUwgY29tbWVudCBkZWxpbWl0ZXJzLjwvcD4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBIVE1MQ29tbWVudERldGVjdG9yIGltcGxlbWVudHMgSVdvcmREZXRlY3RvciB7Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSVdvcmREZXRlY3RvciNpc1dvcmRTdGFydChjaGFyKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNXb3JkU3RhcnQoY2hhciBjKSB7Ci0JCQlyZXR1cm4gKGMgPT0gJzwnIHx8IGMgPT0gJy0nKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElXb3JkRGV0ZWN0b3IjaXNXb3JkUGFydChjaGFyKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNXb3JkUGFydChjaGFyIGMpIHsKLQkJCXJldHVybiAoYyA9PSAnLScgfHwgYyA9PSAnIScgfHwgYyA9PSAnPicpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPlNhbWUgYXMgYSB7QGxpbmsgU2luZ2xlTGluZVJ1bGV9IGV4Y2VwdCB0aGUgZ2l2ZW4gZW5kIHNlcXVlbmNlIGlzIG5vdCBjb3VudGVkIGFzIHBhcnQgb2YgdGhlIG1hdGNoLjwvcD4KLQkgKiAKLQkgKiBAc2VlIFNpbmdsZUxpbmVSdWxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uZUluY2x1c2l2ZUVuZFNlcXVlbmNlU2luZ2xlTGluZVJ1bGUgZXh0ZW5kcyBTaW5nbGVMaW5lUnVsZSB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBzdGFydFNlcXVlbmNlIHN0YXJ0IHNlcXVlbmNlIGluY2x1ZGVkIGluIHJ1bGUgbWF0Y2gKLQkJICogQHBhcmFtIGVuZFNlcXVlbmNlIGVuZCBzZXF1ZW5jZSB0aGF0IHdpbGwgZW5kIHRoaXMgcnVsZSBidXQgd2lsbCBub3QgYmUgY291bnRlZCBhcyBwYXJ0IG9mIHRoZSBtYXRjaAotCQkgKiBAcGFyYW0gdG9rZW4gdG8gcmV0dXJuIG9uIGEgbWF0Y2ggYnkgdGhpcyBydWxlCi0JCSAqLwotCQlwdWJsaWMgTm9uZUluY2x1c2l2ZUVuZFNlcXVlbmNlU2luZ2xlTGluZVJ1bGUoU3RyaW5nIHN0YXJ0U2VxdWVuY2UsIFN0cmluZyBlbmRTZXF1ZW5jZSwgSVRva2VuIHRva2VuKSB7Ci0JCQlzdXBlcihzdGFydFNlcXVlbmNlLCBlbmRTZXF1ZW5jZSwgdG9rZW4pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIDxwPklmIHRoZSBlbmQgc2VxdWVuY2UgaXMgZGV0ZWN0ZWQgdGhlbiBzY2FubmVyIGlzIHJld2luZCB0byBqdXN0IGJlZm9yZSB0aGUgZW5kIHNlcXVlbmNlLAotCQkgKiBvdGhlcndpc2UgYWN0cyB0aGUgc2FtZSBhcyB7QGxpbmsgUGF0dGVyblJ1bGUjZW5kU2VxdWVuY2VEZXRlY3RlZH08L3A+Ci0JCSAqIAotCQkgKiBAc2VlIFBhdHRlcm5SdWxlI2VuZFNlcXVlbmNlRGV0ZWN0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIGVuZFNlcXVlbmNlRGV0ZWN0ZWQoSUNoYXJhY3RlclNjYW5uZXIgc2Nhbm5lcikgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gc3VwZXIuZW5kU2VxdWVuY2VEZXRlY3RlZChzY2FubmVyKTsKLQkJCWlmKHN1Y2Nlc3MpIHsKLQkJCQlmb3IgKGludCBsZW5ndGggPSB0aGlzLmZFbmRTZXF1ZW5jZS5sZW5ndGgtMTsgbGVuZ3RoID4gMDsgbGVuZ3RoLS0pIHsKLQkJCQkJc2Nhbm5lci51bnJlYWQoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYodGhpcy5zZXF1ZW5jZURldGVjdGVkKHNjYW5uZXIsIHRoaXMuZkVuZFNlcXVlbmNlLCBmYWxzZSkpIHsKLQkJCQkJZm9yIChpbnQgbGVuZ3RoID0gdGhpcy5mRW5kU2VxdWVuY2UubGVuZ3RoOyBsZW5ndGggPiAwOyBsZW5ndGgtLSkgewotCQkJCQkJc2Nhbm5lci51bnJlYWQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPlNhbWUgYXMgYW4ge0BsaW5rIEVuZE9mTGluZVJ1bGV9IGV4Y2VwdCB0aGUgZ2l2ZW4gc3RhcnQgc2VxdWVuY2UgaXMgbm90IGNvdW50ZWQgYXMgcGFydCBvZiB0aGUgbWF0Y2guPC9wPgotCSAqIAotCSAqIEBzZWUgRW5kT2ZMaW5lUnVsZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vbmVJbmNsdXNpdmVTdGFydFNlcXVlbmNlRW5kT2ZMaW5lUnVsZSBleHRlbmRzIEVuZE9mTGluZVJ1bGUgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gc3RhcnRTZXF1ZW5jZSBzdGFydCBzZXF1ZW5jZSB0aGUgaWRlbnRpZmllcyB0aGUgc3RhcnQgb2YgdGhpcyBtYXRjaCBidXQgaXMgbm90IGNvdW50ZWQgYXMgcGFydCBvZiB0aGUgbWF0Y2gKLQkJICogQHBhcmFtIHRva2VuIHRvIHJldHVybiBvbiBhIG1hdGNoIGJ5IHRoaXMgcnVsZQotCQkgKi8KLQkJcHVibGljIE5vbmVJbmNsdXNpdmVTdGFydFNlcXVlbmNlRW5kT2ZMaW5lUnVsZShTdHJpbmcgc3RhcnRTZXF1ZW5jZSwgSVRva2VuIHRva2VuKSB7Ci0JCQlzdXBlcihzdGFydFNlcXVlbmNlLCB0b2tlbik7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiA8cD5TYW1lIGFzIG92ZXJyaWRkZW4gZnVuY3Rpb24gZXhjZXB0IHVucmVhZHMgdGhlIHNjYW5uZXIgYmFjayB0aGUgbGVuZ3RoIG9mIHRoZSBzdGFydCBzZXF1ZW5jZQotCQkgKiBzaW5jZSB0aGUgc3RhcnQgc2VxdWVuY2UgaXMgbm90IGNvdW50ZWQgYXMgcGFydCBvZiB0aGUgbWF0Y2guPC9wPgotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlBhdHRlcm5SdWxlI2RvRXZhbHVhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JQ2hhcmFjdGVyU2Nhbm5lciwgYm9vbGVhbikKLQkJICovCi0JCXByb3RlY3RlZCBJVG9rZW4gZG9FdmFsdWF0ZShJQ2hhcmFjdGVyU2Nhbm5lciBzY2FubmVyLCBib29sZWFuIHJlc3VtZSkgewotCQkJaWYgKHJlc3VtZSkgewotCQkJCWlmIChlbmRTZXF1ZW5jZURldGVjdGVkKHNjYW5uZXIpKQotCQkJCQlyZXR1cm4gZlRva2VuOwotCQkJfSBlbHNlIHsKLQkJCQkvL3VucmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdGFydCBzZXF1ZW5jZSBzaW5jZSBpdCBpcyBub3QgY291bnRlZCBhcyBwYXJ0IG9mIHRoZSBtYXRjaAotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCB0aGlzLmZTdGFydFNlcXVlbmNlLmxlbmd0aCAmJiBzY2FubmVyLmdldENvbHVtbigpID49IDA7ICsraSkgewotCQkJCQlzY2FubmVyLnVucmVhZCgpOwotCQkJCX0KLQotCQkJCWludCBjPSBzY2FubmVyLnJlYWQoKTsKLQkJCQlpZiAoYyA9PSBmU3RhcnRTZXF1ZW5jZVswXSkgewotCQkJCQlpZiAoc2VxdWVuY2VEZXRlY3RlZChzY2FubmVyLCBmU3RhcnRTZXF1ZW5jZSwgZmFsc2UpKSB7Ci0JCQkJCQlpZiAoZW5kU2VxdWVuY2VEZXRlY3RlZChzY2FubmVyKSkKLQkJCQkJCQlyZXR1cm4gZlRva2VuOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8vYmUgc3VyZSB0byByZS1yZWFkIHRoZSBsZW5ndGggb2YgdGhlIHN0YXJ0IHNlcXVlbmNlIGlmIHdlIGRpZCBub3QgbWF0Y2gKLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGhpcy5mU3RhcnRTZXF1ZW5jZS5sZW5ndGggJiYgc2Nhbm5lci5nZXRDb2x1bW4oKSA+PSAwOyArK2kpIHsKLQkJCQkJc2Nhbm5lci5yZWFkKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlzY2FubmVyLnVucmVhZCgpOwotCQkJcmV0dXJuIFRva2VuLlVOREVGSU5FRDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhV29yZERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdvcmREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTYyNjhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhV29yZERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEphdmFXb3JkRGV0ZWN0b3IgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IgewotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV29yZERldGVjdG9yI2lzV29yZElkZW50aWZpZXJQYXJ0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JkUGFydChjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IjaXNXb3JkSWRlbnRpZmllclN0YXJ0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JkU3RhcnQoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9MaW5lU3R5bGVQcm92aWRlckZvckpTRFQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9MaW5lU3R5bGVQcm92aWRlckZvckpTRFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUzNTdmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvTGluZVN0eWxlUHJvdmlkZXJGb3JKU0RULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JKU0RUIGV4dGVuZHMgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQkvKiogVGhlIHNjYW5uZXIgaXQgdXNlcyAqLwotCXByaXZhdGUgSlNEVENvZGVTY2FubmVyIGZTY2FubmVyOwotCQotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZlByZWZlcmVuY2VMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCS8vIGhhdmUgdG8gZG8gaXQgdGhpcyB3YXkgc28gb3RoZXJzIGNhbiBvdmVycmlkZSB0aGUgbWV0aG9kCi0JCQloYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9OwotCQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvckpTRFQoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZTY2FubmVyID0gbmV3IEpTRFRDb2RlU2Nhbm5lcigpOwotCX0KLQkKLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgY29sb3JLZXkgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUgYW5kIGFkZHMgdGhlIHN0eWxlCi0JICogaW5mb3JtYXRpb24gdG8gbGlzdCBvZiBUZXh0QXR0cmlidXRlcwotCSAqIAotCSAqIEBwYXJhbSBjb2xvcktleQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRleHRBdHRyaWJ1dGUoU3RyaW5nIGNvbG9yS2V5KSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgamF2YVN0b3JlID0gZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKTsKLQkJaWYgKGphdmFTdG9yZSAhPSBudWxsICYmIGNvbG9yS2V5ICE9IG51bGwpIHsKLQkJCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCQkJaWYgKGNvbG9yS2V5ID09IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9LRVlXT1JEKSB7Ci0JCQkJLy8ga2V5d29yZAotCQkJCVJHQiBmb3JlZ3JvdW5kID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqYXZhU3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9DT0xPUik7Ci0JCQkJYm9vbGVhbiBib2xkID0gamF2YVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQpOwotCQkJCWJvb2xlYW4gaXRhbGljcyA9IGphdmFTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9JVEFMSUMpOwotCQkJCWJvb2xlYW4gc3RyaWtldGhyb3VnaCA9IGphdmFTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9TVFJJS0VUSFJPVUdIKTsKLQkJCQlib29sZWFuIHVuZGVybGluZSA9IGphdmFTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9VTkRFUkxJTkUpOwotCQkJCWludCBzdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQkJaWYgKGJvbGQpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoaXRhbGljcykgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHN0cmlrZXRocm91Z2gpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSDsKLQkJCQl9Ci0JCQkJaWYgKHVuZGVybGluZSkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkU7Ci0JCQkJfQotCQkJCXRhID0gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBudWxsLCBzdHlsZSk7Ci0JCQl9IGVsc2UgaWYgKGNvbG9yS2V5ID09IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9TVFJJTkcpIHsKLQkJCQkvLyBzdHJpbmcKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamF2YVN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IGphdmFTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfU1RSSUtFVEhST1VHSCk7Ci0JCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCkgewotCQkJCS8vIHNpbmdsZSBsaW5lIGNvbW1lbnQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamF2YVN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0JPTEQpOwotCQkJCWJvb2xlYW4gaXRhbGljcyA9IGphdmFTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX1NUUklLRVRIUk9VR0gpOwotCQkJCWJvb2xlYW4gdW5kZXJsaW5lID0gamF2YVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9VTkRFUkxJTkUpOwotCQkJCWludCBzdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQkJaWYgKGJvbGQpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoaXRhbGljcykgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHN0cmlrZXRocm91Z2gpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSDsKLQkJCQl9Ci0JCQkJaWYgKHVuZGVybGluZSkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkU7Ci0JCQkJfQotCQkJCXRhID0gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBudWxsLCBzdHlsZSk7Ci0JCQl9IGVsc2UgaWYgKGNvbG9yS2V5ID09IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9NVUxUSV9MSU5FX0NPTU1FTlQpIHsKLQkJCQkvLyBtdWx0aSBsaW5lIGNvbW1lbnQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamF2YVN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9NVUxUSV9MSU5FX0NPTU1FTlRfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IGphdmFTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX01VTFRJX0xJTkVfQ09NTUVOVF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9NVUxUSV9MSU5FX0NPTU1FTlRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9NVUxUSV9MSU5FX0NPTU1FTlRfU1RSSUtFVEhST1VHSCk7Ci0JCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9NVUxUSV9MSU5FX0NPTU1FTlRfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfREVGQVVMVCkgewotCQkJCS8vIGRlZmF1bHQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamF2YVN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IGphdmFTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfU1RSSUtFVEhST1VHSCk7Ci0JCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfSBlbHNlIGlmKGNvbG9yS2V5ID09IElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUiB8fAotCQkJCQljb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKcy5KU1BfQ09OVEVOVCkgewotCQkJCQotCQkJCS8qKiBAc2VlIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIjYWRkVGV4dEF0dHJpYnV0ZSAqLwotCQkJCXRhID0gKFRleHRBdHRyaWJ1dGUpZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoY29sb3JLZXkpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0SFRNTENvbG9yUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoY29sb3JLZXkpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQkJUkdCIGJhY2tncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzFdKTsKLQkJCQkJYm9vbGVhbiBib2xkID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbMl0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlib29sZWFuIGl0YWxpYyA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzNdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJYm9vbGVhbiBzdHJpa2V0aHJvdWdoID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbNF0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlib29sZWFuIHVuZGVybGluZSA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzVdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQkJaWYgKGJvbGQpIHsKLQkJCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQkJfQotCQkJCQlpZiAoaXRhbGljKSB7Ci0JCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULklUQUxJQzsKLQkJCQkJfQotCQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSDsKLQkJCQkJfQotCQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkU7Ci0JCQkJCX0KLQotCQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgYmFja2dyb3VuZCwgc3R5bGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh0YSAhPSBudWxsKSB7Ci0JCQkJZ2V0VGV4dEF0dHJpYnV0ZXMoKS5wdXQoY29sb3JLZXksIHRhKTsKLQkJCQlmU2Nhbm5lci5zZXRUb2tlbkRhdGEoY29sb3JLZXksIHRhKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHN0eWxlIGluZm9ybWF0aW9uIHRvIHRoZSBnaXZlbiB0ZXh0IHByZXNlbnRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlc2VudGF0aW9uCi0JICogICAgICAgICAgICB0aGUgdGV4dCBwcmVzZW50YXRpb24gdG8gYmUgZXh0ZW5kZWQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBkZXNjcmliaW5nIHRoZSBzdHlsZSBvZiB0aGUgcmFuZ2UgdG8gYmUgc3R5bGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJhbmdlKENvbGxlY3Rpb24gcHJlc2VudGF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBUZXh0QXR0cmlidXRlIGF0dHIpIHsKLQkJLy8gc3VwcG9ydCBmb3IgdXNlciBkZWZpbmVkIGJhY2tncm91ZCBmb3IgSlNQIHNjcmlwdGxldCByZWdpb25zCi0JCVRleHRBdHRyaWJ1dGUgdGEgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzSnMuSlNQX0NPTlRFTlQpOwotCQlDb2xvciBiZ0NvbG9yID0gdGEuZ2V0QmFja2dyb3VuZCgpOwotCQlpZiAoYmdDb2xvciA9PSBudWxsKSB7Ci0JCQliZ0NvbG9yID0gYXR0ci5nZXRCYWNrZ3JvdW5kKCk7Ci0JCX0KLQkJU3R5bGVSYW5nZSByZXN1bHQgPSBuZXcgU3R5bGVSYW5nZShvZmZzZXQsIGxlbmd0aCwgYXR0ci5nZXRGb3JlZ3JvdW5kKCksIGJnQ29sb3IsIGF0dHIuZ2V0U3R5bGUoKSk7Ci0JCWlmICgoYXR0ci5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwKSB7Ci0JCQlyZXN1bHQuc3RyaWtlb3V0ID0gdHJ1ZTsKLQkJfQotCQlpZiAoKGF0dHIuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwKSB7Ci0JCQlyZXN1bHQudW5kZXJsaW5lID0gdHJ1ZTsKLQkJfQotCQlwcmVzZW50YXRpb24uYWRkKHJlc3VsdCk7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBKc1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldEphdmFDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldEhUTUxDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHRleHQgYXR0cmlidXRlIGVuY29kZWQgaW4gdGhlIGdpdmVuIHRva2VuLiBJZiB0aGUgdG9rZW4ncyBkYXRhCi0JICogaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IGFuZCBhIHRleHQgYXR0cmlidXRlIGl0IGlzIGFzc3VtZWQgdGhhdCBpdCBpcwotCSAqIHRoZSBlbmNvZGVkIHRleHQgYXR0cmlidXRlLiBJdCByZXR1cm5zIHRoZSBkZWZhdWx0IHRleHQgYXR0cmlidXRlIGlmCi0JICogdGhlcmUgaXMgbm8gZW5jb2RlZCB0ZXh0IGF0dHJpYnV0ZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiAgICAgICAgICAgIHRoZSB0b2tlbiB3aG9zZSB0ZXh0IGF0dHJpYnV0ZSBpcyB0byBiZSBkZXRlcm1pbmVkCi0JICogQHJldHVybiB0aGUgdG9rZW4ncyB0ZXh0IGF0dHJpYnV0ZQotCSAqLwotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBnZXRUb2tlblRleHRBdHRyaWJ1dGUoSVRva2VuIHRva2VuKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCQlPYmplY3QgZGF0YSA9IHRva2VuLmdldERhdGEoKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBUZXh0QXR0cmlidXRlKSB7Ci0JCQl0YSA9IChUZXh0QXR0cmlidXRlKSBkYXRhOwotCQl9IGVsc2UgewotCQkJdGEgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX0RFRkFVTFQpOwotCQl9Ci0JCXJldHVybiB0YTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZLZXkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJLy8gY2hlY2sgaWYgcHJlZmVyZW5jZSBjaGFuZ2VkIGlzIGEgc3R5bGUgcHJlZmVyZW5jZQotCQkJaWYoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSOwotCQkJfSBlbHNlIGlmKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRC5lcXVhbHMocHJlZktleSkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9LRVlXT1JEOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQk9MRC5lcXVhbHMocHJlZktleSkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9TVFJJTkc7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0JPTEQuZXF1YWxzKHByZWZLZXkpKSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQ7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX01VTFRJX0xJTkVfQ09NTUVOVF9DT0xPUi5lcXVhbHMocHJlZktleSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX01VTFRJX0xJTkVfQ09NTUVOVF9CT0xELmVxdWFscyhwcmVmS2V5KSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX01VTFRJX0xJTkVfQ09NTUVOVF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX01VTFRJX0xJTkVfQ09NTUVOVDsKLQkJCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0JPTEQuZXF1YWxzKHByZWZLZXkpKSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0lUQUxJQy5lcXVhbHMocHJlZktleSkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfREVGQVVMVDsKLQkJCX0KLQkJfQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZFRleHRBdHRyaWJ1dGUoc3R5bGVLZXkpOwotCQkJZlJlY0hpZ2hsaWdodGVyLnJlZnJlc2hEaXNwbGF5KCk7Ci0JCQlmU2Nhbm5lci5pbml0aWFsaXplUnVsZXMoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSnMuSlNQX0NPTlRFTlQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9LRVlXT1JEKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfU1RSSU5HKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX01VTFRJX0xJTkVfQ09NTUVOVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX0RFRkFVTFQpOwotCQlmU2Nhbm5lci5pbml0aWFsaXplUnVsZXMoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJlcGFyZVJlZ2lvbnMoSVR5cGVkUmVnaW9uIHR5cGVkUmVnaW9uLCBpbnQgc3Nzc3JlcXVlc3RlZFN0YXJ0LCBpbnQgc3Nzc3JlcXVlc3RlZExlbmd0aCwgQ29sbGVjdGlvbiBob2xkUmVzdWx0cykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCS8qIEluaXRpYWxpemUgdGhlIHRleHQgYXR0cmlidXRlcy4gQWxzbyBsb2FkIHRoZSBjb2xvcnMgYW5kIGluaXRpYWxpemUgdGhlIHJ1bGVzIG9mIHRoZSBzY2FubmVyICovCi0JCWdldFRleHRBdHRyaWJ1dGVzKCk7Ci0JCXRyeSB7Ci0JCQkvLyBpZGVhbGx5LCBldmVudHVhbGx5LCB3ZSdsbCBoYXZlIGEgInZpcnR1YWxEb2N1bWVudCIgd2UgY2FuCi0JCQkvLyByZWZlciB0bywgYnV0IGZvciBub3cgLi4uIHdlJ2xsIHNpbXBsZSByZXNjYW4gdGhlIG9uZSByZWdpb24uCi0JCQkvLyB1c2Ugc2ltcGxlIGFkanVzdG1lbnQgKHNpbmNlICJzdWItY29udGVudCIgc3RhcnRzIGF0IDAKLQkJCWludCBsYXN0U3RhcnQgPSB0eXBlZFJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBsZW5ndGggPSAwOwotCQkJSVRva2VuIGxhc3RUb2tlbiA9IFRva2VuLlVOREVGSU5FRDsKLQkJCWZTY2FubmVyLnNldFJhbmdlKGdldERvY3VtZW50KCksIGxhc3RTdGFydCwgdHlwZWRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlJVG9rZW4gdG9rZW4gPSBmU2Nhbm5lci5uZXh0VG9rZW4oKTsKLQkJCQlpZiAodG9rZW4uaXNFT0YoKSkgewotCQkJCQlpZiAoIWxhc3RUb2tlbi5pc1VuZGVmaW5lZCgpICYmIGxlbmd0aCAhPSAwKSB7Ci0JCQkJCQlhZGRSYW5nZShob2xkUmVzdWx0cywgbGFzdFN0YXJ0LCBsZW5ndGgsIGdldFRva2VuVGV4dEF0dHJpYnV0ZShsYXN0VG9rZW4pKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHRva2VuLmlzV2hpdGVzcGFjZSgpKSB7Ci0JCQkJCWxlbmd0aCArPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGxhc3RUb2tlbi5pc1VuZGVmaW5lZCgpKSB7Ci0JCQkJCWxhc3RUb2tlbiA9IHRva2VuOwotCQkJCQlsZW5ndGggKz0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmICh0b2tlbiAhPSBsYXN0VG9rZW4pIHsKLQkJCQkJYWRkUmFuZ2UoaG9sZFJlc3VsdHMsIGxhc3RTdGFydCwgbGVuZ3RoLCBnZXRUb2tlblRleHRBdHRyaWJ1dGUobGFzdFRva2VuKSk7Ci0JCQkJCWxhc3RUb2tlbiA9IHRva2VuOwotCQkJCQlsYXN0U3RhcnQgPSBmU2Nhbm5lci5nZXRUb2tlbk9mZnNldCgpOwotCQkJCQlsZW5ndGggPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgd2UgZG9uJ3Qgd2FudCBpdCB0byBzdG9wIG90aGVyCi0JCQkvLyBoaWdobGlnaHRpbmcsIGlmIGl0IGRvZXMuCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKSB7Ci0JCWdldENvbG9yUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQlnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCXRoaXMuZ2V0SFRNTENvbG9yUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCWZTY2FubmVyID0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdW5SZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlnZXRDb2xvclByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQl0aGlzLmdldEhUTUxDb2xvclByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxQcmludGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSFRNTFByaW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQwMGU3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSFRNTFByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIEhUTUxQcmludGVyIHsKLQlzdGF0aWMgUkdCIEJHX0NPTE9SX1JHQiA9IG51bGw7Ci0Jc3RhdGljIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCWlmIChkaXNwbGF5ICE9IG51bGwgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0cnkgewotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJLyoKLQkJCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCQkJICovCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUhUTUxQcmludGVyLkJHX0NPTE9SX1JHQiA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkuZ2V0UkdCKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0gY2F0Y2ggKFNXVEVycm9yIGVycikgewotCQkJCS8vIHNlZTogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ1Mjk0Ci0JCQkJaWYgKGVyci5jb2RlICE9IFNXVC5FUlJPUl9ERVZJQ0VfRElTUE9TRUQpIHsKLQkJCQkJdGhyb3cgZXJyOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQnVsbGV0KFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBidWxsZXQpIHsKLQkJaWYgKGJ1bGxldCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCI8bGk+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoYnVsbGV0KTsKLQkJCWJ1ZmZlci5hcHBlbmQoIjwvbGk+Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUGFnZUVwaWxvZyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoIjwvZm9udD48L2JvZHk+PC9odG1sPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQYWdlUHJvbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJSFRNTFByaW50ZXIuaW5zZXJ0UGFnZVByb2xvZyhidWZmZXIsIGJ1ZmZlci5sZW5ndGgoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQYXJhZ3JhcGgoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgUmVhZGVyIHBhcmFncmFwaFJlYWRlcikgewotCQlpZiAocGFyYWdyYXBoUmVhZGVyICE9IG51bGwpIHsKLQkJCUhUTUxQcmludGVyLmFkZFBhcmFncmFwaChidWZmZXIsIEhUTUxQcmludGVyLnJlYWQocGFyYWdyYXBoUmVhZGVyKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFBhcmFncmFwaChTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgcGFyYWdyYXBoKSB7Ci0JCWlmIChwYXJhZ3JhcGggIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgiPHA+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQocGFyYWdyYXBoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkU21hbGxIZWFkZXIoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGhlYWRlcikgewotCQlpZiAoaGVhZGVyICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIjxoNT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChoZWFkZXIpOwotCQkJYnVmZmVyLmFwcGVuZCgiPC9oNT4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kQ29sb3IoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgUkdCIHJnYikgewotCQlidWZmZXIuYXBwZW5kKCcjJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhyZ2IucmVkKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhyZ2IuZ3JlZW4pKTsKLQkJYnVmZmVyLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHJnYi5ibHVlKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kU3R5bGVTaGVldExpbmsoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgVVJMIHN0eWxlU2hlZXRVUkwpIHsKLQkJaWYgKHN0eWxlU2hlZXRVUkwgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoIjxoZWFkPiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIjxMSU5LIFJFTD1cInN0eWxlc2hlZXRcIiBIUkVGPSBcIiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoc3R5bGVTaGVldFVSTCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlwiIENIQVJTRVQ9XCJJU08tODg1OS0xXCIgVFlQRT1cInRleHQvY3NzXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiPC9oZWFkPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0hUTUxDb250ZW50KFN0cmluZyBjb250ZW50KSB7Ci0JCWNvbnRlbnQgPSBIVE1MUHJpbnRlci5yZXBsYWNlKGNvbnRlbnQsICcmJywgIiZhbXA7Iik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGVudCA9IEhUTUxQcmludGVyLnJlcGxhY2UoY29udGVudCwgJyInLCAiJnF1b3Q7Iik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGVudCA9IEhUTUxQcmludGVyLnJlcGxhY2UoY29udGVudCwgJzwnLCAiJmx0OyIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBIVE1MUHJpbnRlci5yZXBsYWNlKGNvbnRlbnQsICc+JywgIiZndDsiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5kQnVsbGV0TGlzdChTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoIjwvdWw+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUkdCIGdldEJnQ29sb3IoKSB7Ci0JCWlmIChIVE1MUHJpbnRlci5CR19DT0xPUl9SR0IgIT0gbnVsbCkgewotCQkJcmV0dXJuIEhUTUxQcmludGVyLkJHX0NPTE9SX1JHQjsKLQkJfQotCQkvLyBSR0IgdmFsdWUgb2YgaW5mbyBiZyBjb2xvciBvbiBXaW5kb3dzWFAKLQkJcmV0dXJuIG5ldyBSR0IoMjU1LCAyNTUsIDIyNSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRQYWdlUHJvbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBwb3NpdGlvbikgewotCQlIVE1MUHJpbnRlci5pbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgcG9zaXRpb24sIEhUTUxQcmludGVyLmdldEJnQ29sb3IoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRQYWdlUHJvbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBwb3NpdGlvbiwgUkdCIGJnUkdCKSB7Ci0JCWlmIChiZ1JHQiA9PSBudWxsKSB7Ci0JCQlIVE1MUHJpbnRlci5pbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgcG9zaXRpb24pOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHBhZ2VQcm9sb2cgPSBuZXcgU3RyaW5nQnVmZmVyKDYwKTsKLQkJCXBhZ2VQcm9sb2cuYXBwZW5kKCI8aHRtbD48Ym9keSB0ZXh0PVwiIzAwMDAwMFwiIGJnY29sb3I9XCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJSFRNTFByaW50ZXIuYXBwZW5kQ29sb3IocGFnZVByb2xvZywgYmdSR0IpOwotCQkJcGFnZVByb2xvZy5hcHBlbmQoIlwiPjxmb250IHNpemU9LTE+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5pbnNlcnQocG9zaXRpb24sIHBhZ2VQcm9sb2cudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvc2l0aW9uLCBSR0IgYmdSR0IsIFVSTCBzdHlsZVNoZWV0VVJMKSB7Ci0JCWlmIChiZ1JHQiA9PSBudWxsKSB7Ci0JCQlIVE1MUHJpbnRlci5pbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgcG9zaXRpb24sIHN0eWxlU2hlZXRVUkwpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHBhZ2VQcm9sb2cgPSBuZXcgU3RyaW5nQnVmZmVyKDMwMCk7Ci0JCQlwYWdlUHJvbG9nLmFwcGVuZCgiPGh0bWw+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCUhUTUxQcmludGVyLmFwcGVuZFN0eWxlU2hlZXRMaW5rKHBhZ2VQcm9sb2csIHN0eWxlU2hlZXRVUkwpOwotCQkJcGFnZVByb2xvZy5hcHBlbmQoIjxib2R5IHRleHQ9XCIjMDAwMDAwXCIgYmdjb2xvcj1cIiIpOyAvLyROT04tTkxTLTEkCi0JCQlIVE1MUHJpbnRlci5hcHBlbmRDb2xvcihwYWdlUHJvbG9nLCBiZ1JHQik7Ci0JCQlwYWdlUHJvbG9nLmFwcGVuZCgiXCI+PGZvbnQgc2l6ZT0tMT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmluc2VydChwb3NpdGlvbiwgcGFnZVByb2xvZy50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0UGFnZVByb2xvZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgcG9zaXRpb24sIFVSTCBzdHlsZVNoZWV0VVJMKSB7Ci0JCUhUTUxQcmludGVyLmluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBwb3NpdGlvbiwgSFRNTFByaW50ZXIuZ2V0QmdDb2xvcigpLCBzdHlsZVNoZWV0VVJMKTsKLQl9Ci0JCi0Jc3RhdGljIFN0cmluZyByZWFkKFJlYWRlciByZCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQljaGFyW10gcmVhZEJ1ZmZlciA9IG5ldyBjaGFyWzIwNDhdOwotCQl0cnkgewotCQkJaW50IG4gPSByZC5yZWFkKHJlYWRCdWZmZXIpOwotCQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCQluID0gcmQucmVhZChyZWFkQnVmZmVyKTsKLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJLy8gbmV2ZXIgZXhwZWN0ZWQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHguZ2V0TWVzc2FnZSgpLCB4KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHRleHQsIGNoYXIgYywgU3RyaW5nIHMpIHsKLQkJaW50IHByZXZpb3VzID0gMDsKLQkJaW50IGN1cnJlbnQgPSB0ZXh0LmluZGV4T2YoYywgcHJldmlvdXMpOwotCQlpZiAoY3VycmVudCA9PSAtMSkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJd2hpbGUgKGN1cnJlbnQgPiAtMSkgewotCQkJYnVmZmVyLmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhwcmV2aW91cywgY3VycmVudCkpOwotCQkJYnVmZmVyLmFwcGVuZChzKTsKLQkJCXByZXZpb3VzID0gY3VycmVudCArIDE7Ci0JCQljdXJyZW50ID0gdGV4dC5pbmRleE9mKGMsIHByZXZpb3VzKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKHByZXZpb3VzKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0QnVsbGV0TGlzdChTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoIjx1bD4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIEhUTUxQcmludGVyKCkgewotCS8vIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSlNEVEhvdmVyUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSlNEVEhvdmVyUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZTE2NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90YWdpbmZvL0pTRFRIb3ZlclByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5KU2RvY0NvbnRlbnRBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5BYnN0cmFjdEhvdmVyUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU0RUSG92ZXJQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdEhvdmVyUHJvY2Vzc29yIHsKLQkvKgotCSAqIEJ1bGsgb2YgdGhlIHdvcmsgd2FzIGNvcGllZCBmcm9tCi0JICogb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLmhvdmVyLkphdmFkb2NIb3ZlcgotCSAqLwotCXByaXZhdGUgZmluYWwgbG9uZyBMQUJFTF9GTEFHUyA9IEphdmFTY3JpcHRFbGVtZW50TGFiZWxzLkFMTF9GVUxMWV9RVUFMSUZJRUQgfCBKYXZhU2NyaXB0RWxlbWVudExhYmVscy5NX1BSRV9SRVRVUk5UWVBFIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuTV9QQVJBTUVURVJfVFlQRVMgfCBKYXZhU2NyaXB0RWxlbWVudExhYmVscy5NX1BBUkFNRVRFUl9OQU1FUyB8IEphdmFTY3JpcHRFbGVtZW50TGFiZWxzLk1fRVhDRVBUSU9OUyB8IEphdmFTY3JpcHRFbGVtZW50TGFiZWxzLkZfUFJFX1RZUEVfU0lHTkFUVVJFIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuTV9QUkVfVFlQRV9QQVJBTUVURVJTIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuVF9UWVBFX1BBUkFNRVRFUlMgfCBKYXZhU2NyaXB0RWxlbWVudExhYmVscy5VU0VfUkVTT0xWRUQ7Ci0JcHJpdmF0ZSBmaW5hbCBsb25nIExPQ0FMX1ZBUklBQkxFX0ZMQUdTID0gTEFCRUxfRkxBR1MgJiB+SmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuRl9GVUxMWV9RVUFMSUZJRUQgfCBKYXZhU2NyaXB0RWxlbWVudExhYmVscy5GX1BPU1RfUVVBTElGSUVEOwotCQotCXByaXZhdGUgU3RyaW5nIGdldEhvdmVySW5mbyhJSmF2YVNjcmlwdEVsZW1lbnRbXSByZXN1bHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG5SZXN1bHRzID0gcmVzdWx0Lmxlbmd0aDsKLQkJaWYgKG5SZXN1bHRzID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChuUmVzdWx0cyA+IDEpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJSFRNTFByaW50ZXIuc3RhcnRCdWxsZXRMaXN0KGJ1ZmZlcik7Ci0JCQkJSUphdmFTY3JpcHRFbGVtZW50IGN1cnIgPSByZXN1bHRbaV07Ci0JCQkJaWYgKGN1cnIgaW5zdGFuY2VvZiBJTWVtYmVyIHx8IGN1cnIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YVNjcmlwdEVsZW1lbnQuTE9DQUxfVkFSSUFCTEUpIHsKLQkJCQkJSFRNTFByaW50ZXIuYWRkQnVsbGV0KGJ1ZmZlciwgZ2V0SW5mb1RleHQoY3VycikpOwotCQkJCX0KLQkJCQlIVE1MUHJpbnRlci5lbmRCdWxsZXRMaXN0KGJ1ZmZlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlJSmF2YVNjcmlwdEVsZW1lbnQgY3VyciA9IHJlc3VsdFswXTsKLQkJCWlmIChjdXJyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmIChjdXJyIGluc3RhbmNlb2YgSU1lbWJlcikgewotCQkJCUlNZW1iZXIgbWVtYmVyID0gKElNZW1iZXIpIGN1cnI7Ci0JCQkJSFRNTFByaW50ZXIuYWRkU21hbGxIZWFkZXIoYnVmZmVyLCBnZXRJbmZvVGV4dChtZW1iZXIpKTsKLQkJCQlSZWFkZXIgcmVhZGVyOwotCQkJCXRyeSB7Ci0JCQkJCXJlYWRlciA9IEpTZG9jQ29udGVudEFjY2Vzcy5nZXRIVE1MQ29udGVudFJlYWRlcihtZW1iZXIsIHRydWUsIHRydWUpOwotCQkJCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJCUhUTUxQcmludGVyLmFkZFBhcmFncmFwaChidWZmZXIsIHJlYWRlcik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjdXJyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LkxPQ0FMX1ZBUklBQkxFKSB7Ci0JCQkJSFRNTFByaW50ZXIuYWRkU21hbGxIZWFkZXIoYnVmZmVyLCBnZXRJbmZvVGV4dChjdXJyKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCUhUTUxQcmludGVyLmluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCAwKTsKLQkJCUhUTUxQcmludGVyLmFkZFBhZ2VFcGlsb2coYnVmZmVyKTsKLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJJbmZvKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb3ZlckluZm8oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBob3ZlclJlZ2lvbikgewotCQkvLyBnZXQgSlNQIHRyYW5zbGF0aW9uIG9iamVjdCBmb3IgdGhpcyB2aWV3ZXIncyBkb2N1bWVudAotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCUlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKc1RyYW5zbGF0aW9uKHRydWUpOwotCQkJCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSByZXN1bHQgPSB0cmFuc2xhdGlvbi5nZXRFbGVtZW50c0Zyb21Kc1JhbmdlKGhvdmVyUmVnaW9uLmdldE9mZnNldCgpLCBob3ZlclJlZ2lvbi5nZXRPZmZzZXQoKSArIGhvdmVyUmVnaW9uLmdldExlbmd0aCgpKTsKLS8vIFZlY3RvciBmaWx0ZXJlZFJlc3VsdHMgPSBuZXcgVmVjdG9yKCk7Ci0vLyBMaXN0IGJhZEZ1bmN0aW9ucyA9IHRyYW5zbGF0aW9uLmdldEdlbmVyYXRlZEZ1bmN0aW9uTmFtZXMoKTsKLS8vIGJvb2xlYW4gYmFkID0gZmFsc2U7Ci0vLyBmb3IoaW50IGkgPSAwO2k8cmVzdWx0Lmxlbmd0aDtpKyspewotLy8gYmFkPWZhbHNlOwotLy8gaWYocmVzdWx0W2ldIGluc3RhbmNlb2YgSUZ1bmN0aW9uKXsKLS8vIGZvcihpbnQgaj0wO2o8YmFkRnVuY3Rpb25zLnNpemUoKSAmJiAhIGJhZDtqKyspewotLy8gaWYoKChJRnVuY3Rpb24pcmVzdWx0W2ldKS5nZXRFbGVtZW50TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZyliYWRGdW5jdGlvbnMuZ2V0KGopKSl7Ci0vLyBiYWQ9dHJ1ZTsKLS8vIGNvbnRpbnVlOwotLy8gfQotLy8gfQotLy8gaWYoIWJhZClmaWx0ZXJlZFJlc3VsdHMuYWRkKHJlc3VsdFtpXSk7Ci0vLyB9Ci0vLyB9Ci0vLyBpZihmaWx0ZXJlZFJlc3VsdHMuc2l6ZSgpPDEpIHJldHVybiBuZXcgU3RyaW5nKCk7Ci0vLwkJCQkJCi0vLyBTdHJpbmcgZmlsdGVyZWRSZXN1bHQgPQotLy8gdHJhbnNsYXRpb24uZml4dXBNYW5nbGVkTmFtZShnZXRIb3ZlckluZm8oKElKYXZhU2NyaXB0RWxlbWVudFtdKWZpbHRlcmVkUmVzdWx0cy50b0FycmF5KG5ldwotLy8gSUphdmFTY3JpcHRFbGVtZW50W117fSkpKTsKLS8vIGZvcihpbnQgaSA9IDA7aTxiYWRGdW5jdGlvbnMuc2l6ZSgpO2krKyl7Ci0vLyBmaWx0ZXJlZFJlc3VsdC5yZXBsYWNlKChTdHJpbmcpYmFkRnVuY3Rpb25zLmdldChpKSwgIiIpOwotLy8gfQotLy8gcmV0dXJuIGZpbHRlcmVkUmVzdWx0OwotCQkJCQlyZXR1cm4gdHJhbnNsYXRpb24uZml4dXBNYW5nbGVkTmFtZShnZXRIb3ZlckluZm8ocmVzdWx0KSk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJSZWdpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIb3ZlclJlZ2lvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBKc1dvcmRGaW5kZXIuZmluZFdvcmQodGV4dFZpZXdlci5nZXREb2N1bWVudCgpLCBvZmZzZXQpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRJbmZvVGV4dChJSmF2YVNjcmlwdEVsZW1lbnQgbWVtYmVyKSB7Ci0JCWxvbmcgZmxhZ3MgPSBtZW1iZXIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YVNjcmlwdEVsZW1lbnQuTE9DQUxfVkFSSUFCTEUgPyBMT0NBTF9WQVJJQUJMRV9GTEFHUyA6IExBQkVMX0ZMQUdTOwotCQlTdHJpbmcgbGFiZWwgPSBKYXZhU2NyaXB0RWxlbWVudExhYmVscy5nZXRFbGVtZW50TGFiZWwobWVtYmVyLCBmbGFncyk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWwubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IGxhYmVsLmNoYXJBdChpKTsKLQkJCWlmIChjaCA9PSAnPCcpIHsKLQkJCQlidWYuYXBwZW5kKCImbHQ7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7Ci0JCQkJYnVmLmFwcGVuZCgiJmd0OyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCWJ1Zi5hcHBlbmQoY2gpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSnNXb3JkRmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSnNXb3JkRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MzExYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90YWdpbmZvL0pzV29yZEZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotY2xhc3MgSnNXb3JkRmluZGVyIHsKLQlwdWJsaWMgc3RhdGljIElSZWdpb24gZmluZFdvcmQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBzdGFydCA9IC0xOwotCQlpbnQgZW5kID0gLTE7Ci0JCXRyeSB7Ci0JCQlpbnQgcG9zID0gb2Zmc2V0OwotCQkJY2hhciBjOwotCQkJd2hpbGUgKHBvcyA+PSAwKSB7Ci0JCQkJYyA9IGRvY3VtZW50LmdldENoYXIocG9zKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkphdmFXb3JkRmluZGVyLmZpbmRXb3JkKCkgVGVzdCBqYXZhIGNoYXIKLQkJCQkvLyAoLS0pOiIgKyBjKTsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLS1wb3M7Ci0JCQl9Ci0JCQlzdGFydCA9IHBvczsKLQkJCXBvcyA9IG9mZnNldDsKLQkJCWludCBsZW5ndGggPSBkb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJCXdoaWxlIChwb3MgPCBsZW5ndGgpIHsKLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihwb3MpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSmF2YVdvcmRGaW5kZXIuZmluZFdvcmQoKSBUZXN0IGphdmEgY2hhcgotCQkJCS8vICgrKyk6IiArIGMpOwotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkrK3BvczsKLQkJCX0KLQkJCWVuZCA9IHBvczsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnQ6IiArIHN0YXJ0ICsgIkVuZDoiK2VuZCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkphdmFXb3JkRmluZGVyLmZpbmRXb3JkKCkgUmV0cmlldmVkIGphdmEKLQkJCS8vIHRva2VuIG9mOiIgKyBkb2N1bWVudC5nZXQoc3RhcnQsIGVuZC1zdGFydCkgKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQl9Ci0JCWlmIChzdGFydCA+IC0xICYmIGVuZCA+IC0xKSB7Ci0JCQlpZiAoc3RhcnQgPT0gb2Zmc2V0ICYmIGVuZCA9PSBvZmZzZXQpIHsKLQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihvZmZzZXQsIDApOwotCQkJfSBlbHNlIGlmIChzdGFydCA9PSBvZmZzZXQpIHsKLQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihzdGFydCArIDEsIGVuZCAtIHN0YXJ0IC0gMSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzQ2hhcmFjdGVyUGFpckluc2VydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhkMDJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5JTGlua2VkTW9kZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRNb2RlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVVSS5FeGl0RmxhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVVSS5JRXhpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5KYXZhU2NyaXB0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkudGV4dC5TeW1ib2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnR5cGluZy5BYnN0cmFjdENoYXJhY3RlclBhaXJJbnNlcnRlcjsKLQotLyoqCi0gKiA8cD5JbnNlcnRzIGNoYXJhY3RlciBwYWlycyBpbiBzY3JpcHQgcmVnaW9ucyBpbiBIVE1MIGFuZCBKU1AgZG9jdW1lbnRzIGJhc2VkIG9uIHRoZSBKYXZhc2NyaXB0Ci0gKiBjaGFyYWN0ZXIgcGFpcmluZyBwcmVmZXJlbmNlcy48L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc0NoYXJhY3RlclBhaXJJbnNlcnRlciBleHRlbmRzIEFic3RyYWN0Q2hhcmFjdGVyUGFpckluc2VydGVyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkNsb3NlU3RyaW5nczsKLQlwcml2YXRlIGJvb2xlYW4gZkNsb3NlQnJhY2tldHM7Ci0JcHJpdmF0ZSBib29sZWFuIGZDbG9zZUJyYWNlczsKLQlwcml2YXRlIGJvb2xlYW4gZkNsb3NlQW5ndWxhckJyYWNrZXRzOwotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50eXBpbmcuQWJzdHJhY3RDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIjaGFzUGFpcihjaGFyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1BhaXIoY2hhciBjKSB7Ci0JCXN3aXRjaCAoYykgewotCQkJY2FzZSAnKCc6Ci0JCQljYXNlICc8JzoKLQkJCWNhc2UgJ1snOgotCQkJY2FzZSAnXCcnOgotCQkJY2FzZSAnXCInOgotCQkJY2FzZSAneyc6Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudHlwaW5nLkFic3RyYWN0Q2hhcmFjdGVyUGFpckluc2VydGVyI3Nob3VsZFBhaXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlciwgY2hhcikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRQYWlyKElTb3VyY2VWaWV3ZXIgdmlld2VyLCBjaGFyIGMpIHsKLQkJSURvY3VtZW50IGRvY3VtZW50PSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQlmaW5hbCBQb2ludCBzZWxlY3Rpb249IHZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCWZpbmFsIGludCBvZmZzZXQ9IHNlbGVjdGlvbi54OwotCQlmaW5hbCBpbnQgbGVuZ3RoPSBzZWxlY3Rpb24ueTsKLQotCQl0cnkgewotCQkJSVJlZ2lvbiBzdGFydExpbmU9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KG9mZnNldCk7Ci0JCQlJUmVnaW9uIGVuZExpbmU9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KG9mZnNldCArIGxlbmd0aCk7Ci0KLQkJCUphdmFIZXVyaXN0aWNTY2FubmVyIHNjYW5uZXI9IG5ldyBKYXZhSGV1cmlzdGljU2Nhbm5lcihkb2N1bWVudCk7Ci0JCQlpbnQgbmV4dFRva2VuPSBzY2FubmVyLm5leHRUb2tlbihvZmZzZXQgKyBsZW5ndGgsIGVuZExpbmUuZ2V0T2Zmc2V0KCkgKyBlbmRMaW5lLmdldExlbmd0aCgpKTsKLQkJCVN0cmluZyBuZXh0PSBuZXh0VG9rZW4gPT0gU3ltYm9scy5Ub2tlbkVPRiA/IG51bGwgOiBkb2N1bWVudC5nZXQob2Zmc2V0LCBzY2FubmVyLmdldFBvc2l0aW9uKCkgLSBvZmZzZXQpLnRyaW0oKTsKLQkJCWludCBwcmV2VG9rZW49IHNjYW5uZXIucHJldmlvdXNUb2tlbihvZmZzZXQgLSAxLCBzdGFydExpbmUuZ2V0T2Zmc2V0KCkpOwotCQkJaW50IHByZXZUb2tlbk9mZnNldD0gc2Nhbm5lci5nZXRQb3NpdGlvbigpICsgMTsKLQkJCVN0cmluZyBwcmV2aW91cz0gcHJldlRva2VuID09IFN5bWJvbHMuVG9rZW5FT0YgPyBudWxsIDogZG9jdW1lbnQuZ2V0KHByZXZUb2tlbk9mZnNldCwgb2Zmc2V0IC0gcHJldlRva2VuT2Zmc2V0KS50cmltKCk7Ci0KLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJygnOgotCQkJCQlpZiAoIWZDbG9zZUJyYWNrZXRzCi0JCQkJCQkJfHwgbmV4dFRva2VuID09IFN5bWJvbHMuVG9rZW5MUEFSRU4KLQkJCQkJCQl8fCBuZXh0VG9rZW4gPT0gU3ltYm9scy5Ub2tlbklERU5UCi0JCQkJCQkJfHwgbmV4dCAhPSBudWxsICYmIG5leHQubGVuZ3RoKCkgPiAxKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgJzwnOgotCQkJCQlpZiAoIShmQ2xvc2VBbmd1bGFyQnJhY2tldHMgJiYgZkNsb3NlQnJhY2tldHMpCi0JCQkJCQkJfHwgbmV4dFRva2VuID09IFN5bWJvbHMuVG9rZW5MRVNTVEhBTgotCQkJCQkJCXx8IAkJICAgcHJldlRva2VuICE9IFN5bWJvbHMuVG9rZW5MQlJBQ0UKLQkJCQkJCQkJCSYmIHByZXZUb2tlbiAhPSBTeW1ib2xzLlRva2VuUkJSQUNFCi0JCQkJCQkJCQkmJiBwcmV2VG9rZW4gIT0gU3ltYm9scy5Ub2tlblNFTUlDT0xPTgotCQkJCQkJCQkJJiYgcHJldlRva2VuICE9IFN5bWJvbHMuVG9rZW5TWU5DSFJPTklaRUQKLQkJCQkJCQkJCSYmIHByZXZUb2tlbiAhPSBTeW1ib2xzLlRva2VuU1RBVElDCi0JCQkJCQkJCQkmJiAocHJldlRva2VuICE9IFN5bWJvbHMuVG9rZW5JREVOVCB8fCAhaXNBbmd1bGFySW50cm9kdWNlcihwcmV2aW91cykpCi0JCQkJCQkJCQkmJiBwcmV2VG9rZW4gIT0gU3ltYm9scy5Ub2tlbkVPRikKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlICd7JzoKLQkJCQkJaWYgKCFmQ2xvc2VCcmFjZXMKLQkJCQkJCQl8fCBuZXh0VG9rZW4gPT0gU3ltYm9scy5Ub2tlbklERU5UCi0JCQkJCQkJfHwgbmV4dCAhPSBudWxsICYmIG5leHQubGVuZ3RoKCkgPiAxKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdbJzoKLQkJCQkJaWYgKCFmQ2xvc2VCcmFja2V0cwotCQkJCQkJCXx8IG5leHRUb2tlbiA9PSBTeW1ib2xzLlRva2VuSURFTlQKLQkJCQkJCQl8fCBuZXh0ICE9IG51bGwgJiYgbmV4dC5sZW5ndGgoKSA+IDEpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSAnXCcnOgotCQkJCWNhc2UgJyInOgotCQkJCQlpZiAoIWZDbG9zZVN0cmluZ3MKLQkJCQkJCQl8fCBuZXh0VG9rZW4gPT0gU3ltYm9scy5Ub2tlbklERU5UCi0JCQkJCQkJfHwgcHJldlRva2VuID09IFN5bWJvbHMuVG9rZW5JREVOVAotCQkJCQkJCXx8IG5leHQgIT0gbnVsbCAmJiBuZXh0Lmxlbmd0aCgpID4gMQotCQkJCQkJCXx8IHByZXZpb3VzICE9IG51bGwgJiYgcHJldmlvdXMubGVuZ3RoKCkgPiAxKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnR5cGluZy5BYnN0cmFjdENoYXJhY3RlclBhaXJJbnNlcnRlciNnZXRQYWlyKGNoYXIpCi0JICovCi0JcHJvdGVjdGVkIGNoYXIgZ2V0UGFpcihjaGFyIGMpIHsKLQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICcoJzoKLQkJCQlyZXR1cm4gJyknOwotCQkJY2FzZSAnPCc6Ci0JCQkJcmV0dXJuICc+JzsKLQkJCWNhc2UgJ1snOgotCQkJCXJldHVybiAnXSc7Ci0JCQljYXNlICd7JzoKLQkJCQlyZXR1cm4gJ30nOwotCQkJY2FzZSAnXCcnOgotCQkJCXJldHVybiBjOwotCQkJY2FzZSAnXCInOgotCQkJCXJldHVybiBjOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+SW5pdGlhbGl6ZSB0aGUgcHJlZmVyZW5jZSBsaXN0ZW5lcjwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudHlwaW5nLkFic3RyYWN0Q2hhcmFjdGVyUGFpckluc2VydGVyI2luaXRpYWxpemUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmUgPSBKYXZhU2NyaXB0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJdGhpcy5mQ2xvc2VTdHJpbmdzID0gcHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQ0xPU0VfU1RSSU5HUyk7Ci0JCXRoaXMuZkNsb3NlQnJhY2tldHMgPSBwcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9DTE9TRV9CUkFDS0VUUyk7Ci0JCXRoaXMuZkNsb3NlQnJhY2VzID0gcHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQ0xPU0VfQlJBQ0VTKTsKLQkJdGhpcy5mQ2xvc2VBbmd1bGFyQnJhY2tldHMgPSBKYXZhU2NyaXB0Q29yZS5WRVJTSU9OXzFfNS5jb21wYXJlVG8oCi0JCQkJcHJlZmVyZW5jZVN0b3JlLmdldFN0cmluZyhKYXZhU2NyaXB0Q29yZS5DT01QSUxFUl9TT1VSQ0UpKSA8PSAwOwotCQlwcmVmZXJlbmNlU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+RGlzcG9zZSB0aGUgcHJlZmVyZW5jZSBsaXN0ZW5lcjwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudHlwaW5nLkFic3RyYWN0Q2hhcmFjdGVyUGFpckluc2VydGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUphdmFTY3JpcHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0NMT1NFX1NUUklOR1MuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpKXsKLQkJCXRoaXMuZkNsb3NlU3RyaW5ncyA9ICgoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQ0xPU0VfQlJBQ0tFVFMuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpKSB7Ci0JCQl0aGlzLmZDbG9zZUJyYWNrZXRzID0gKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKTsKLQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9DTE9TRV9CUkFDRVMuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpKSB7Ci0JCQl0aGlzLmZDbG9zZUJyYWNlcyA9ICgoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0gZWxzZSBpZiAoSmF2YVNjcmlwdENvcmUuQ09NUElMRVJfU09VUkNFLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkgewotCQkJSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmUgPSBKYXZhU2NyaXB0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCXRoaXMuZkNsb3NlQW5ndWxhckJyYWNrZXRzID0gSmF2YVNjcmlwdENvcmUuVkVSU0lPTl8xXzUuY29tcGFyZVRvKHByZWZlcmVuY2VTdG9yZS5nZXRTdHJpbmcoCi0JCQkJCQlKYXZhU2NyaXB0Q29yZS5DT01QSUxFUl9TT1VSQ0UpKSA8PSAwOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRPRE86IElBTjogY29tbWVudCBtZQotCSAqIEBwYXJhbSBpZGVudGlmaWVyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0FuZ3VsYXJJbnRyb2R1Y2VyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBpZGVudGlmaWVyLmxlbmd0aCgpID4gMAotCQkJCSYmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2UoaWRlbnRpZmllci5jaGFyQXQoMCkpCi0JCQkJCQl8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoImZpbmFsIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJfHwgaWRlbnRpZmllci5zdGFydHNXaXRoKCJwdWJsaWMiKSAvLyROT04tTkxTLTEkCi0JCQkJCQl8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoInB1YmxpYyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXx8IGlkZW50aWZpZXIuc3RhcnRzV2l0aCgicHJvdGVjdGVkIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJfHwgaWRlbnRpZmllci5zdGFydHNXaXRoKCJwcml2YXRlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50eXBpbmcuQWJzdHJhY3RDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIjZ2V0RXhpdFBvbGljeShjaGFyLCBjaGFyLCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUV4aXRQb2xpY3kgZ2V0RXhpdFBvbGljeShjaGFyIGV4aXQsIGNoYXIgZXNjYXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBFeGl0UG9saWN5KGV4aXQsIGVzY2FwZSwgZG9jdW1lbnQpOwotCX0KLQkKLQkvKioKLQkgKiA8cD5BbiBleGl0IHBvbGljeSB0aGF0IGRlYWxzIHdpdGggYSB1c2VyIGFkZGluZyBhIGNhcnJpYWdlIHJldHVybiBiZXR3ZWVuIHt9LgotCSAqIEluIHRoYXQgY2FzZSByYXRoZXIgdGhlbiBleGl0aW5nIHRvIHRoZSBleGl0IHBvc2l0aW9uIHRoZSBsaW5rZWQgbW9kZSBpcyBleGl0ZWQKLQkgKiBhbmQgdGhlIGNhcnJpYWdlIHJldHVybiBpbnNlcnRlZC48L3A+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXhpdFBvbGljeSBpbXBsZW1lbnRzIElFeGl0UG9saWN5IHsKLQotCQkvKiogZXhpdCBjaGFyYWN0ZXIgKi8KLQkJcHJpdmF0ZSBjaGFyIGZFeGl0OwotCQkKLQkJLyoqIGVzY2FwZSBjaGFyYWN0ZXIgZm9yIHRoZSBleGl0IGNoYXJhY3RlciAqLwotCQlwcml2YXRlIGNoYXIgZkVzY2FwZTsKLQkJCi0JCS8qKiBkb2N1bWVudCB0byBleGVjdXRlIHRoaXMgZXhpdCBwb2xpY3kgb24gKi8KLQkJcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCi0JCS8qKgotCQkgKiA8cD5EZWZhdWx0IGNvbnN0cnVjdG9yPC9wPgotCQkgKiAKLQkJICogQHBhcmFtIGV4aXQgZXhpdCBjaGFyYWN0ZXIKLQkJICogQHBhcmFtIGVzY2FwZSBlc2NhcGUgY2hhcmFjdGVyIGZvciB0aGUgZXhpdCBjaGFyYWN0ZXIKLQkJICogQHBhcmFtIGRvY3VtZW50IGRvY3VtZW50IHRvIGV4ZWN1dGUgdGhpcyBleGl0IHBvbGljeSBvbgotCQkgKi8KLQkJcHVibGljIEV4aXRQb2xpY3koY2hhciBleGl0LCBjaGFyIGVzY2FwZSwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQlmRXhpdCA9IGV4aXQ7Ci0JCQlmRXNjYXBlID0gZXNjYXBlOwotCQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZVVJLklFeGl0UG9saWN5I2RvRXhpdChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZU1vZGVsLCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50LCBpbnQsIGludCkKLQkJICovCi0JCXB1YmxpYyBFeGl0RmxhZ3MgZG9FeGl0KExpbmtlZE1vZGVNb2RlbCBtb2RlbCwgVmVyaWZ5RXZlbnQgZXZlbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJCWlmKCFpc01hc2tlZChvZmZzZXQpKSB7Ci0JCQkJLy8gaWYgZXhpdCBjaGFyYWN0ZXIgdGhlbiBleGl0IHRvIGV4aXQgbG9jYXRpb24KLQkJCQlpZiAoZXZlbnQuY2hhcmFjdGVyID09IGZFeGl0KSB7Ci0JCQkJCXJldHVybiBuZXcgRXhpdEZsYWdzKElMaW5rZWRNb2RlTGlzdGVuZXIuVVBEQVRFX0NBUkVULCBmYWxzZSk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGlmIGNhcnJpYWdlIHJldHVybiBhbmQgcHJldmlvdXMgY2hhcmFjdGVyIGlzIHsgdGhlbiBleGl0IGxpbmtlZCBtb2RlIGFuZCBpbnNlcnQgcmV0dXJuCi0JCQkJaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuQ1IgJiYgb2Zmc2V0ID4gMCkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKHRoaXMuZkRvY3VtZW50LmdldENoYXIob2Zmc2V0IC0gMSkgPT0gJ3snKSB7Ci0JCQkJCQkJcmV0dXJuIG5ldyBFeGl0RmxhZ3MoSUxpbmtlZE1vZGVMaXN0ZW5lci5FWElUX0FMTCwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIHdoaWxlIHRyeWluZyB0byBleGl0IGxpbmtlZCBtb2RlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIDxwPkRldGVybWluZSBpZiB0aGUgZXhpdCBjaGFyYWN0ZXIgaGFzIGJlZW4gZXNjYXBlZC48cD4KLQkJICogCi0JCSAqIEBwYXJhbSBvZmZzZXQgY3VycmVudCBvZmZzZXQgaW4gdGhlIGRvY3VtZW50Ci0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZXhpdCBjaGFyYWN0ZXIgZXNjYXBlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGlzTWFza2VkKGludCBvZmZzZXQpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZFc2NhcGUgPT0gZkRvY3VtZW50LmdldENoYXIob2Zmc2V0IC0gMSk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNDb2RlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNDb2RlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OTM3ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzQ29kZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZGVyaXZlZC5TaW5nbGVDaGFyUmVhZGVyOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotY2xhc3MgSnNDb2RlUmVhZGVyIGV4dGVuZHMgU2luZ2xlQ2hhclJlYWRlciB7Ci0JLyoqIFRoZSBFT0YgY2hhcmFjdGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkNhY2hlZExpbmVOdW1iZXIgPSAtMTsKLQlwcml2YXRlIGludCBmQ2FjaGVkTGluZU9mZnNldCA9IC0xOwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGludCBmRW5kID0gLTE7Ci0JcHJpdmF0ZSBib29sZWFuIGZGb3J3YXJkID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldDsKLQlwcml2YXRlIGJvb2xlYW4gZlNraXBDb21tZW50cyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmU2tpcFN0cmluZ3MgPSBmYWxzZTsKLQkKLQlwdWJsaWMgSnNDb2RlUmVhZGVyKCkge30KLQkKLQkvKgotCSAqIEBzZWUgUmVhZGVyI2Nsb3NlKCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUJhY2t3YXJkUmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgYm9vbGVhbiBza2lwQ29tbWVudHMsIGJvb2xlYW4gc2tpcFN0cmluZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmU2tpcENvbW1lbnRzID0gc2tpcENvbW1lbnRzOwotCQlmU2tpcFN0cmluZ3MgPSBza2lwU3RyaW5nczsKLQkJZkZvcndhcmQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWZDYWNoZWRMaW5lTnVtYmVyID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKHguZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb25maWd1cmVGb3J3YXJkUmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBza2lwQ29tbWVudHMsIGJvb2xlYW4gc2tpcFN0cmluZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmU2tpcENvbW1lbnRzID0gc2tpcENvbW1lbnRzOwotCQlmU2tpcFN0cmluZ3MgPSBza2lwU3RyaW5nczsKLQkJZkZvcndhcmQgPSB0cnVlOwotCQlmRW5kID0gTWF0aC5taW4oZkRvY3VtZW50LmdldExlbmd0aCgpLCBmT2Zmc2V0ICsgbGVuZ3RoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBsYXN0IHJlYWQgY2hhcmFjdGVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQKLQkgKiBhZnRlciByZWFkIGhhcyBiZWVuIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZGb3J3YXJkID8gZk9mZnNldCAtIDEgOiBmT2Zmc2V0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ290b0NvbW1lbnRFbmQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0JCQlpZiAoY3VycmVudCA9PSAnKicpIHsKLQkJCQlpZiAoZk9mZnNldCA8IGZFbmQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCkgPT0gJy8nKSB7Ci0JCQkJCSsrZk9mZnNldDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ290b0NvbW1lbnRTdGFydCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldC0tKTsKLQkJCWlmIChjdXJyZW50ID09ICcqJyAmJiAwIDw9IGZPZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCkgPT0gJy8nKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBnb3RvTGluZUVuZCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJZk9mZnNldCA9IGZEb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUgKyAxKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdvdG9TdHJpbmdFbmQoY2hhciBkZWxpbWl0ZXIpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChmT2Zmc2V0IDwgZkVuZCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCsrKTsKLQkJCWlmIChjdXJyZW50ID09ICdcXCcpIHsKLQkJCQkvLyBpZ25vcmUgZXNjYXBlZCBjaGFyYWN0ZXJzCi0JCQkJKytmT2Zmc2V0OwotCQkJfSBlbHNlIGlmIChjdXJyZW50ID09IGRlbGltaXRlcikgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ290b1N0cmluZ1N0YXJ0KGNoYXIgZGVsaW1pdGVyKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJaWYgKGN1cnJlbnQgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJaWYgKCEoMCA8PSBmT2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQgLSAxKSA9PSAnXFwnKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJLS1mT2Zmc2V0OwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVTaW5nbGVMaW5lQ29tbWVudCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJaWYgKGxpbmUgPCBmQ2FjaGVkTGluZU51bWJlcikgewotCQkJZkNhY2hlZExpbmVOdW1iZXIgPSBsaW5lOwotCQkJZkNhY2hlZExpbmVPZmZzZXQgPSBmRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCWludCBvZmZzZXQgPSBmT2Zmc2V0OwotCQkJd2hpbGUgKGZDYWNoZWRMaW5lT2Zmc2V0IDwgb2Zmc2V0KSB7Ci0JCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIob2Zmc2V0LS0pOwotCQkJCWlmIChjdXJyZW50ID09ICcvJyAmJiBmQ2FjaGVkTGluZU9mZnNldCA8PSBvZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIob2Zmc2V0KSA9PSAnLycpIHsKLQkJCQkJZk9mZnNldCA9IG9mZnNldDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgU2luZ2xlQ2hhclJlYWRlciNyZWFkKCkKLQkgKi8KLQkKLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGZGb3J3YXJkID8gcmVhZEZvcndhcmRzKCkgOiByZWFkQmFja3dhcmRzKCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbih4LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgcmVhZEJhY2t3YXJkcygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJLS1mT2Zmc2V0OwotCQkJaGFuZGxlU2luZ2xlTGluZUNvbW1lbnQoKTsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJc3dpdGNoIChjdXJyZW50KSB7Ci0JCQkJY2FzZSAnLyc6Ci0JCQkJCWlmIChmU2tpcENvbW1lbnRzICYmIGZPZmZzZXQgPiAxKSB7Ci0JCQkJCQljaGFyIG5leHQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0IC0gMSk7Ci0JCQkJCQlpZiAobmV4dCA9PSAnKicpIHsKLQkJCQkJCQkvLyBhIGNvbW1lbnQgZW5kcywgYWR2YW5jZSB0byB0aGUgY29tbWVudCBzdGFydAotCQkJCQkJCWZPZmZzZXQgLT0gMjsKLQkJCQkJCQlnb3RvQ29tbWVudFN0YXJ0KCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQkJY2FzZSAnIic6Ci0JCQkJY2FzZSAnXCcnOgotCQkJCQlpZiAoZlNraXBTdHJpbmdzKSB7Ci0JCQkJCQktLWZPZmZzZXQ7Ci0JCQkJCQlnb3RvU3RyaW5nU3RhcnQoY3VycmVudCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQkJCX0KLQkJCXJldHVybiBjdXJyZW50OwotCQl9Ci0JCXJldHVybiBKc0NvZGVSZWFkZXIuRU9GOwotCX0KLQkKLQlwcml2YXRlIGludCByZWFkRm9yd2FyZHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0JCQlzd2l0Y2ggKGN1cnJlbnQpIHsKLQkJCQljYXNlICcvJzoKLQkJCQkJaWYgKGZTa2lwQ29tbWVudHMgJiYgZk9mZnNldCA8IGZFbmQpIHsKLQkJCQkJCWNoYXIgbmV4dCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJCQkJaWYgKG5leHQgPT0gJyonKSB7Ci0JCQkJCQkJLy8gYSBjb21tZW50IHN0YXJ0cywgYWR2YW5jZSB0byB0aGUgY29tbWVudCBlbmQKLQkJCQkJCQkrK2ZPZmZzZXQ7Ci0JCQkJCQkJZ290b0NvbW1lbnRFbmQoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gZWxzZSBpZiAobmV4dCA9PSAnLycpIHsKLQkJCQkJCQkvLyAnLy8nLWNvbW1lbnQgc3RhcnRzLCBhZHZhbmNlIHRvIHRoZSBsaW5lIGVuZAotCQkJCQkJCWdvdG9MaW5lRW5kKCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQkJY2FzZSAnIic6Ci0JCQkJY2FzZSAnXCcnOgotCQkJCQlpZiAoZlNraXBTdHJpbmdzKSB7Ci0JCQkJCQlnb3RvU3RyaW5nRW5kKGN1cnJlbnQpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQl9Ci0JCQlyZXR1cm4gY3VycmVudDsKLQkJfQotCQlyZXR1cm4gSnNDb2RlUmVhZGVyLkVPRjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YzEwZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGV4dC5Eb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciBleHRlbmRzIERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgewotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgY2hhcltdIEJSQUNLRVRTID0geyAneycsICd9JywgJygnLCAnKScsICdbJywgJ10nIH07Ci0JCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkQ29udGV4dHMKLQkgKiBAcGFyYW0gbmV4dE1hdGNoZXIKLQkgKi8KLQlwdWJsaWMgSnNEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyKCkgewotCQlzdXBlcihuZXcgU3RyaW5nW10geyBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSwgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhULCBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhULCBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOLAotCQkJCURPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlQgfSwgbmV3IEpzUGFpck1hdGNoZXIoSnNEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLkJSQUNLRVRTKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzUGFpck1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGV4dC9Kc1BhaXJNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTY1YTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzUGFpck1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIEpzUGFpck1hdGNoZXIgaW1wbGVtZW50cyBJQ2hhcmFjdGVyUGFpck1hdGNoZXIgewotCXByb3RlY3RlZCBpbnQgZkFuY2hvcjsKLQlwcm90ZWN0ZWQgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcm90ZWN0ZWQgaW50IGZFbmRQb3M7Ci0JcHJvdGVjdGVkIGludCBmT2Zmc2V0OwotCXByb3RlY3RlZCBjaGFyW10gZlBhaXJzOwotCXByb3RlY3RlZCBKc0NvZGVSZWFkZXIgZlJlYWRlciA9IG5ldyBKc0NvZGVSZWFkZXIoKTsKLQlwcm90ZWN0ZWQgaW50IGZTdGFydFBvczsKLQkKLQlwdWJsaWMgSnNQYWlyTWF0Y2hlcihjaGFyW10gcGFpcnMpIHsKLQkJZlBhaXJzID0gcGFpcnM7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpZiAoZlJlYWRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZSZWFkZXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljbGVhcigpOwotCQlmRG9jdW1lbnQgPSBudWxsOwotCQlmUmVhZGVyID0gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZ2V0QW5jaG9yKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFuY2hvcigpIHsKLQkJcmV0dXJuIGZBbmNob3I7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI21hdGNoKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIG1hdGNoKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlpZiAoZk9mZnNldCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwgJiYgbWF0Y2hQYWlyc0F0KCkgJiYgZlN0YXJ0UG9zICE9IGZFbmRQb3MpIHsKLQkJCXJldHVybiBuZXcgUmVnaW9uKGZTdGFydFBvcywgZkVuZFBvcyAtIGZTdGFydFBvcyArIDEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaFBhaXJzQXQoKSB7Ci0JCWludCBpOwotCQlpbnQgcGFpckluZGV4MSA9IGZQYWlycy5sZW5ndGg7Ci0JCWludCBwYWlySW5kZXgyID0gZlBhaXJzLmxlbmd0aDsKLQkJZlN0YXJ0UG9zID0gLTE7Ci0JCWZFbmRQb3MgPSAtMTsKLQkJLy8gZ2V0IHRoZSBjaGFycyBwcmVjZWRpbmcgYW5kIGZvbGxvd2luZyB0aGUgc3RhcnQgcG9zaXRpb24KLQkJdHJ5IHsKLQkJCWNoYXIgcHJldkNoYXIgPSBmRG9jdW1lbnQuZ2V0Q2hhcihNYXRoLm1heChmT2Zmc2V0IC0gMSwgMCkpOwotCQkJLy8gbW9kaWZpZWQgYmVoYXZpb3IgZm9yCi0JCQkvLyBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODc5Ci0JCQkvLyBjaGFyIG5leHRDaGFyPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCS8vIHNlYXJjaCBmb3Igb3BlbmluZyBwZWVyIGNoYXJhY3RlciBuZXh0IHRvIHRoZSBhY3RpdmF0aW9uIHBvaW50Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZlBhaXJzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0JCQkJLy8gaWYgKG5leHRDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCS8vIGZTdGFydFBvcz0gZk9mZnNldDsKLQkJCQkvLyBwYWlySW5kZXgxPSBpOwotCQkJCS8vIH0gZWxzZQotCQkJCWlmIChwcmV2Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkJZlN0YXJ0UG9zID0gZk9mZnNldCAtIDE7Ci0JCQkJCXBhaXJJbmRleDEgPSBpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHNlYXJjaCBmb3IgY2xvc2luZyBwZWVyIGNoYXJhY3RlciBuZXh0IHRvIHRoZSBhY3RpdmF0aW9uIHBvaW50Ci0JCQlmb3IgKGkgPSAxOyBpIDwgZlBhaXJzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0JCQkJaWYgKHByZXZDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCQlmRW5kUG9zID0gZk9mZnNldCAtIDE7Ci0JCQkJCXBhaXJJbmRleDIgPSBpOwotCQkJCX0KLQkJCQkvLyBlbHNlIGlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLyBmRW5kUG9zPSBmT2Zmc2V0OwotCQkJCS8vIHBhaXJJbmRleDI9IGk7Ci0JCQkJLy8gfQotCQkJfQotCQkJaWYgKGZFbmRQb3MgPiAtMSkgewotCQkJCWZBbmNob3IgPSBJQ2hhcmFjdGVyUGFpck1hdGNoZXIuUklHSFQ7Ci0JCQkJZlN0YXJ0UG9zID0gc2VhcmNoRm9yT3BlbmluZ1BlZXIoZkVuZFBvcywgZlBhaXJzW3BhaXJJbmRleDIgLSAxXSwgZlBhaXJzW3BhaXJJbmRleDJdLCBmRG9jdW1lbnQpOwotCQkJCWlmIChmU3RhcnRQb3MgPiAtMSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlmRW5kUG9zID0gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChmU3RhcnRQb3MgPiAtMSkgewotCQkJCWZBbmNob3IgPSBJQ2hhcmFjdGVyUGFpck1hdGNoZXIuTEVGVDsKLQkJCQlmRW5kUG9zID0gc2VhcmNoRm9yQ2xvc2luZ1BlZXIoZlN0YXJ0UG9zLCBmUGFpcnNbcGFpckluZGV4MV0sIGZQYWlyc1twYWlySW5kZXgxICsgMV0sIGZEb2N1bWVudCk7Ci0JCQkJaWYgKGZFbmRQb3MgPiAtMSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlmU3RhcnRQb3MgPSAtMTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBzZWFyY2hGb3JDbG9zaW5nUGVlcihpbnQgb2Zmc2V0LCBpbnQgb3BlbmluZ1BlZXIsIGludCBjbG9zaW5nUGVlciwgSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmUmVhZGVyLmNvbmZpZ3VyZUZvcndhcmRSZWFkZXIoZG9jdW1lbnQsIG9mZnNldCArIDEsIGRvY3VtZW50LmdldExlbmd0aCgpLCB0cnVlLCB0cnVlKTsKLQkJaW50IHN0YWNrID0gMTsKLQkJaW50IGMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gSnNDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gb3BlbmluZ1BlZXIgJiYgYyAhPSBjbG9zaW5nUGVlcikgewotCQkJCXN0YWNrKys7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gY2xvc2luZ1BlZXIpIHsKLQkJCQlzdGFjay0tOwotCQkJfQotCQkJaWYgKHN0YWNrID09IDApIHsKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQkJCX0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgc2VhcmNoRm9yT3BlbmluZ1BlZXIoaW50IG9mZnNldCwgaW50IG9wZW5pbmdQZWVyLCBpbnQgY2xvc2luZ1BlZXIsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZlJlYWRlci5jb25maWd1cmVCYWNrd2FyZFJlYWRlcihkb2N1bWVudCwgb2Zmc2V0LCB0cnVlLCB0cnVlKTsKLQkJaW50IHN0YWNrID0gMTsKLQkJaW50IGMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gSnNDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gY2xvc2luZ1BlZXIgJiYgYyAhPSBvcGVuaW5nUGVlcikgewotCQkJCXN0YWNrKys7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gb3BlbmluZ1BlZXIpIHsKLQkJCQlzdGFjay0tOwotCQkJfQotCQkJaWYgKHN0YWNrID09IDApIHsKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQkJCX0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA2MWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1XZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLjA9V2ViIFByb2plY3Qgc3VwcG9ydCBmb3IgSlNEVApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9yaW5vLmpwZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvcmluby5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTZhZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9yaW5vLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvSUphdmFXZWJOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0lKYXZhV2ViTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjk5MThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvSUphdmFXZWJOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBJSmF2YVdlYk5vZGUgewotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoKTsKLQkKLQlwdWJsaWMgTm9kZSBnZXRQYXJlbnROb2RlKCk7Ci0JCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCk7Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySlNEVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckpTRFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmYTk1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySlNEVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmUuSnNDb250ZW50T3V0bGluZUNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUIGV4dGVuZHMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgewotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckpTRFQoKSB7Ci0JCXRoaXMoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCQotCQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUKGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkJaWYgKHNpbmdsZXRvbkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHRoZSBKRmFjZU5vZGVBZGFwdGVyCi0JCQkvLyBzaW5nbGV0b25BZGFwdGVyID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGb3JKU0RUKHRoaXMpOwotCQkJaWYgKEpzQ29udGVudE91dGxpbmVDb25maWcuVVNFX0FEVkFOQ0VEKSB7Ci0JCQkJc2luZ2xldG9uQWRhcHRlciA9IG5ldyBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZvckpzKHRoaXMpOwotCQkJfSBlbHNlIHsKLQkJCQlzaW5nbGV0b25BZGFwdGVyID0gbmV3IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRm9ySnModGhpcyk7Ci0JCQl9Ci0JCQlpbml0QWRhcHRlcihzaW5nbGV0b25BZGFwdGVyLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uQWRhcHRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JKcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRm9ySnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU2ZWY2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JKcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgYnVnOjI0NDgzOSAtIGV1Z2VuZUBnZW51aXRlYy5jb20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVNvdXJjZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVNvdXJjZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5Tb3VyY2VSZWZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLkphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5TdGFuZGFyZEphdmFTY3JpcHRFbGVtZW50Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXJGb3JKcyBleHRlbmRzIEpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MIHsKLQkKLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZvckpzKEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJSmF2YVNjcmlwdFVuaXQgbGF6eUN1OwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCXByaXZhdGUgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyIGphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElKYXZhV2ViTm9kZSkgewotCQkJSmF2YUVsZW1lbnQgZW5jbG9zZWRFbGVtZW50ID0gKEphdmFFbGVtZW50KSAoKElKYXZhV2ViTm9kZSkgb2JqZWN0KS5nZXRKYXZhRWxlbWVudCgpOwotCQkJaWYgKGVuY2xvc2VkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUphdmFTY3JpcHRFbGVtZW50W10gY2hpbGRyZW4gPSBlbmNsb3NlZEVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJCQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBuZXcgSUphdmFTY3JpcHRFbGVtZW50WzBdOwotCQkJCQl9Ci0JCQkJCU9iamVjdFtdIG5vZGVzID0gbmV3IE9iamVjdFtjaGlsZHJlbi5sZW5ndGhdOwotCQkJCQlOb2RlIHBhcmVudCA9ICgoSUphdmFXZWJOb2RlKSBvYmplY3QpLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJLy8JaW50IGh0bWxsZW5ndGggPSAoKFNvdXJjZVJlZkVsZW1lbnQpIChjaGlsZHJlbltpXSkpLmdldFNvdXJjZVJhbmdlKCkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCS8vCWludCBodG1sb2Zmc2V0ID0gKChTb3VyY2VSZWZFbGVtZW50KSAoY2hpbGRyZW5baV0pKS5nZXRTb3VyY2VSYW5nZSgpLmdldE9mZnNldCgpOwotCQkJCQkJSUphdmFTY3JpcHRFbGVtZW50IGphdmFFbGVtZW50ID0gY2hpbGRyZW5baV07Ci0JCQkJCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBudWxsOwotCQkJCQkJaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgTWVtYmVyKSB7Ci0JCQkJCQkJCXJhbmdlID0gKChJTWVtYmVyKSBqYXZhRWxlbWVudCkuZ2V0TmFtZVJhbmdlKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyYW5nZSA9ICgoSVNvdXJjZVJlZmVyZW5jZSkgamF2YUVsZW1lbnQpLmdldFNvdXJjZVJhbmdlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpbnQgaHRtbGxlbmd0aCA9IHJhbmdlLmdldExlbmd0aCgpOwotCQkJCQkJaW50IGh0bWxvZmZzZXQgPSByYW5nZS5nZXRPZmZzZXQoKTsKLQotCQkJCQkJCi0JCQkJCQlQb3NpdGlvbiBwb3NpdGlvbiA9IG5ldyBQb3NpdGlvbihodG1sb2Zmc2V0LCBodG1sbGVuZ3RoKTsKLQkJCQkJCW5vZGVzW2ldID0gZ2V0SnNOb2RlKHBhcmVudCwgamF2YUVsZW1lbnQsIHBvc2l0aW9uKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbm9kZXM7Ci0JCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCWlmIChpc0pTRWxlbWVudFBhcmVudChub2RlKSkgewotCQkJT2JqZWN0W10gcmVzdWx0cyA9IGdldEpTRWxlbWVudHNGcm9tTm9kZShub2RlLmdldEZpcnN0Q2hpbGQoKSwgdHJ1ZSk7Ci0JCQkKLQkJCQotCQkJcmV0dXJuIGZpbHRlciggcmVzdWx0cyApOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQkKLQkvKgotCSAqIEBHSU5POiBBbm9ueW1vdXMgLS0gbWF0Y2hlcyBhbm9ueW1vdXMgdHlwZXMgb24gdGhlIHRvcCBsZXZlbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoZXMoT2JqZWN0IGVsZW1lbnRPYmopIHsKLQkJCi0JCWlmKCBlbGVtZW50T2JqIGluc3RhbmNlb2YgSUphdmFXZWJOb2RlICl7Ci0JCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCA9ICgoSUphdmFXZWJOb2RlKWVsZW1lbnRPYmopLmdldEphdmFFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5UWVBFICYmIGVsZW1lbnQuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YVNjcmlwdEVsZW1lbnQuSkFWQVNDUklQVF9VTklUICkgewotCQkJCQotCQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpZWxlbWVudDsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gdHlwZS5pc0Fub255bW91cygpOwotCQkJCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBHSU5POiBBbm9ueW1vdXMgRmlsdGVyIGZyb20gdG9wIGxldmVsCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZmlsdGVyKE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCWJvb2xlYW4gaW5pdGlhbGl6ZXJzPSBmYWxzZTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWF0Y2hlcyhjaGlsZHJlbltpXSkpIHsKLQkJCQlpbml0aWFsaXplcnM9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWluaXRpYWxpemVycykKLQkJCXJldHVybiBjaGlsZHJlbjsKLQotCQlWZWN0b3Igdj0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChtYXRjaGVzKGNoaWxkcmVuW2ldKSkKLQkJCQljb250aW51ZTsKLQkJCXYuYWRkRWxlbWVudChjaGlsZHJlbltpXSk7Ci0JCX0KLQotCQlPYmplY3RbXSByZXN1bHQ9IG5ldyBPYmplY3Rbdi5zaXplKCldOwotCQl2LmNvcHlJbnRvKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudFByb3ZpZGVyKCkuZ2V0RWxlbWVudHMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudHMob2JqZWN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXIgZ2V0SmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCkgewotCQlpZihqYXZhRWxlbWVudExhYmVsUHJvdmlkZXI9PW51bGwpIHsKLQkJCWphdmFFbGVtZW50TGFiZWxQcm92aWRlciA9IG5ldyBKYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gamF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotCX0KLQkKLQlwcml2YXRlIFN0YW5kYXJkSmF2YVNjcmlwdEVsZW1lbnRDb250ZW50UHJvdmlkZXIgZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdGFuZGFyZEphdmFTY3JpcHRFbGVtZW50Q29udGVudFByb3ZpZGVyKHRydWUpOwotCX0KLQkKLQlwcml2YXRlIE9iamVjdFtdIGZpbHRlckNoaWxkcmVuRm9yUmFuZ2UoSUphdmFTY3JpcHRFbGVtZW50W10gYWxsQ2hpbGRyZW4sIE5vZGUgbm9kZSkgewotCS8vCWludCBqYXZhUG9zaXRpb25TdGFydCA9ICgoTm9kZUltcGwpIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JLy8JaW50IGphdmFQb3NpdGlvbkVuZCAgID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQotCS8vCU9iamVjdFtdIHJlc3VsdCA9bmV3IE9iamVjdFswXTsKLQkJCi0JCWludCBqYXZhUG9zaXRpb25FbmQgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IGphdmFQb3NpdGlvblN0YXJ0ID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlWZWN0b3IgdmFsaWRDaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFsbENoaWxkcmVuW2ldIGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQkJSVNvdXJjZVJhbmdlIHJhbmdlID0gbnVsbDsKLQkJCQlpZiAoYWxsQ2hpbGRyZW5baV0gaW5zdGFuY2VvZiBNZW1iZXIpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJhbmdlID0gKChNZW1iZXIpIGFsbENoaWxkcmVuW2ldKS5nZXROYW1lUmFuZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoYWxsQ2hpbGRyZW5baV0gIGluc3RhbmNlb2YgU291cmNlUmVmRWxlbWVudCkgewotCQkJCQl0cnkgewotCQkJCQkJcmFuZ2UgPSAoKFNvdXJjZVJlZkVsZW1lbnQpYWxsQ2hpbGRyZW5baV0gKS5nZXRTb3VyY2VSYW5nZSgpOwotCQkJCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoYWxsQ2hpbGRyZW5baV0uZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YVNjcmlwdEVsZW1lbnQuVFlQRSB8fCAoamF2YVBvc2l0aW9uU3RhcnQgPD0gcmFuZ2UuZ2V0T2Zmc2V0KCkgJiYgcmFuZ2UuZ2V0TGVuZ3RoKCkgKyByYW5nZS5nZXRPZmZzZXQoKSA8PSAoamF2YVBvc2l0aW9uRW5kKSkpIHsKLQkJCQkJCi0JCQkJCQotCQkJCQkJCWludCBodG1sbGVuZ3RoID0gcmFuZ2UgPT0gbnVsbCA/IDAgOiByYW5nZS5nZXRMZW5ndGgoKTsKLQkJCQkJCQlpbnQgaHRtbG9mZnNldCA9IHJhbmdlID09IG51bGwgPyAwIDogcmFuZ2UuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQkJaWYgKGh0bWxsZW5ndGggPCAwIHx8IGh0bWxvZmZzZXQgPCAwKSB7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCQlQb3NpdGlvbiBwb3NpdGlvbiA9IG5ldyBQb3NpdGlvbihodG1sb2Zmc2V0LCBodG1sbGVuZ3RoKTsKLQkJCQkJCQl2YWxpZENoaWxkcmVuLmFkZChnZXRKc05vZGUobm9kZS5nZXRQYXJlbnROb2RlKCksIGFsbENoaWxkcmVuW2ldLCBwb3NpdGlvbikpOwotCQkJCQkKLQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFswXTsKLQotCi0JCWlmICh2YWxpZENoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCXJlc3VsdCA9IHZhbGlkQ2hpbGRyZW4udG9BcnJheSgpOwotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBuZXcgSUphdmFTY3JpcHRFbGVtZW50WzBdOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgc3luY2hyb25pemVkIE9iamVjdFtdIGdldEpTRWxlbWVudHNGcm9tTm9kZShOb2RlIG5vZGUsIGJvb2xlYW4gZW5zdXJlQ29uc2lzdGFudCkgewotCQkJCQotLy8JCWludCBzdGFydE9mZnNldCA9IDA7Ci0vLwkJaW50IGVuZE9mZnNldCA9IDA7Ci0vLwkJaW50IHR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IG51bGw7Ci0JCS8vSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlSW1wbCkpIHsKLS8vCQkJc3RhcnRPZmZzZXQgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotLy8JCQllbmRPZmZzZXQgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCUlKYXZhU2NyaXB0VW5pdCB1bml0ID0gZ2V0TGF6eUN1KG5vZGUpOwotCSAgICAgICAgLy8gR2VudWl0ZWMgQmVnaW4gRml4IDYxNDk6IEV4Y2VwdGlvbiBvcGVuaW5nIGV4dGVybmFsIEhUTUwgZmlsZQotCQkJaWYgKHVuaXQgPT0gbnVsbCkgewotCQkJICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCSAgICAgICAgLy8gR2VudWl0ZWMgRW5kIEZpeCA2MTQ5OiBFeGNlcHRpb24gb3BlbmluZyBleHRlcm5hbCBIVE1MIGZpbGUKLQkJCXRyeSB7Ci0JCQkJaWYoZW5zdXJlQ29uc2lzdGFudCkgdW5pdC5tYWtlQ29uc2lzdGVudChnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgxKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWV4MS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gZmlsdGVyQ2hpbGRyZW5Gb3JSYW5nZSh1bml0LmdldENoaWxkcmVuKCksbm9kZSk7Ci0JCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmVzdWx0ID0gbmV3IE9iamVjdFswXTsKLQkJCQlsYXp5Q3U9bnVsbDsKLQkJCX0KLQkJCQotCQkJLy90cmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uKG5vZGUpOwotCQkJLy9yZXN1bHQgPSB0cmFuc2xhdGlvbi5nZXRBbGxFbGVtZW50c0luSnNSYW5nZShzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihtb25pdG9yPT1udWxsKSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG1vbml0b3I7Ci0JCQotCX0KLQkKLQlwcml2YXRlIE9iamVjdCBnZXRKc05vZGUoTm9kZSBwYXJlbnQsIElKYXZhU2NyaXB0RWxlbWVudCByb290LCBQb3NpdGlvbiBwb3NpdGlvbikgewotCQlKc0pmYWNlTm9kZSBpbnN0YW5jZSA9IG51bGw7Ci0JCWlmIChyb290LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEUpIHsKLQkJCWluc3RhbmNlID0gbmV3IEpzSmZhY2VOb2RlKHBhcmVudCwgcm9vdCwgcG9zaXRpb24sICgoU291cmNlUmVmRWxlbWVudCkgcm9vdCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCX0gZWxzZSBpZiAocm9vdC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5GSUVMRCkgewotCQkJLyogRmllbGQgcmVmcmVuY2UsIHBvc3NpYmx5IHRvIGEgdHlwZSBtYXkgbmVlZCB0byBpbXBsZW1lbnQgbGF0ZXIgKi8KLQkJCWluc3RhbmNlID0gbmV3IEpzSmZhY2VOb2RlKHBhcmVudCwgcm9vdCwgIHBvc2l0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCWluc3RhbmNlID0gbmV3IEpzSmZhY2VOb2RlKHBhcmVudCwgcm9vdCwgcG9zaXRpb24pOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gZ2V0SmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCkuZ2V0VGV4dChyb290KTsKLQkJaW5zdGFuY2Uuc2V0TmFtZShuYW1lKTsKLQkJLy8gKChKc0pmYWNlTm9kZSlpbnN0YW5jZSkuc2V0QWRhcHRlclJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoaW5zdGFuY2UpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSkZhY2VOb2RlQWRhcHRlckZvckpzKSkgewotCQkJKGluc3RhbmNlKS5yZW1vdmVBZGFwdGVyKGFkYXB0ZXIpOwotCQkJKGluc3RhbmNlKS5hZGRBZGFwdGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JCi0JcHVibGljIEltYWdlIGdldExhYmVsSW1hZ2UoT2JqZWN0IG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBKc0pmYWNlTm9kZSkgewotCQkJcmV0dXJuICgoSnNKZmFjZU5vZGUpIG5vZGUpLmdldEltYWdlKCk7Ci0JCX0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKS5nZXRJbWFnZShub2RlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TGFiZWxJbWFnZShub2RlKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoT2JqZWN0IG5vZGUpIHsKLS8vCQlpZiAobm9kZSBpbnN0YW5jZW9mIEpzSmZhY2VOb2RlKSB7Ci0vLwkJCXJldHVybiAoKEpzSmZhY2VOb2RlKSBub2RlKS5nZXROYW1lKCk7Ci0vLwkJfQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLmdldFRleHQobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExhYmVsVGV4dChub2RlKTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudFByb3ZpZGVyKCkuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JfQotCQotCXByaXZhdGUgSUphdmFTY3JpcHRVbml0IGdldExhenlDdShOb2RlIG5vZGUpIHsKLQkJaWYobGF6eUN1PT1udWxsKSB7Ci0JCQlJSnNUcmFuc2xhdGlvbiB0cmFuID0gZ2V0VHJhbnNsYXRpb24obm9kZSk7Ci0JCQlpZih0cmFuPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQlsYXp5Q3UgPSB0cmFuLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJaWYobGF6eUN1PT1udWxsKSByZXR1cm4gbnVsbDsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsYXp5Q3UubWFrZUNvbnNpc3RlbnQoIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgKTsKLQkJCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxhenlDdTsKLQl9Ci0JCi0JcHJpdmF0ZSBJSnNUcmFuc2xhdGlvbiBnZXRUcmFuc2xhdGlvbihOb2RlIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSURPTURvY3VtZW50IHhtbERvYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAobW9kZWxNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9ICgoTm9kZUltcGwpIG5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCW1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvYyk7Ci0JCQkJLy8gbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGRvYyk7Ci0JCQl9Ci0JCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBtb2RlbDsKLQkJCWlmKGRvbU1vZGVsID09IG51bGwpIHJldHVybiBudWxsOwotCQkJeG1sRG9jID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIG1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCWlmICh4bWxEb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgdHJhbnNsYXRpb25BZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCXJldHVybiB0cmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SnNUcmFuc2xhdGlvbih0cnVlKTsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJSmF2YVdlYk5vZGUpIHsKLQkJCXJldHVybiAoKElKYXZhV2ViTm9kZSkgb2JqZWN0KS5oYXNDaGlsZHJlbigpOwotCQkJCi0JCX0KLQkJaWYgKGlzSlNFbGVtZW50UGFyZW50KG5vZGUpKSB7Ci0JCQlPYmplY3RbXSBub2RlcyA9IGdldEpTRWxlbWVudHNGcm9tTm9kZShub2RlLmdldEZpcnN0Q2hpbGQoKSxmYWxzZSk7Ci0JCQlib29sZWFuIGhhc0VsZW1lbnRzID0gKG5vZGVzICE9IG51bGwgJiYgbm9kZXMubGVuZ3RoID4gMCk7Ci0JCQlyZXR1cm4gaGFzRWxlbWVudHM7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0pTRWxlbWVudFBhcmVudChOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlLmhhc0NoaWxkTm9kZXMoKSAmJiBub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgic2NyaXB0IikpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9Kc0pmYWNlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9Kc0pmYWNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjViMzQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvSnNKZmFjZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0TW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5KYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdE5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzSmZhY2VOb2RlIGV4dGVuZHMgRWxlbWVudEltcGwgaW1wbGVtZW50cyBJbmRleGVkUmVnaW9uLCBJTm9kZU5vdGlmaWVyLCBOb2RlLCBJSmF2YVdlYk5vZGUgewotCXByaXZhdGUgY2xhc3MgSnNBZGFwdGFibGVOb2RlIGV4dGVuZHMgQWJzdHJhY3ROb3RpZmllciB7Ci0JCQotCQlwdWJsaWMgRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJCXJldHVybiBhZGFwdGVyUmVnaXN0cnk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBKc0FkYXB0YWJsZU5vZGUgYWRhcHRhYmxlRG9tTm9kZSA9IG5ldyBKc0FkYXB0YWJsZU5vZGUoKTsKLQlwcml2YXRlIEZhY3RvcnlSZWdpc3RyeSBhZGFwdGVyUmVnaXN0cnk7Ci0JcHJpdmF0ZSBQb3NpdGlvbiBmRG9jUG9zaXRpb247Ci0vLwlwcml2YXRlIE5vZGUgcGFyZW50OwotCXByaXZhdGUgU3RyaW5nIHR5cGVOYW1lOwotCS8vcHJpdmF0ZSBJSmF2YVNjcmlwdEVsZW1lbnQgZGlydHlFbGVtZW50OwotCXByaXZhdGUgYm9vbGVhbiBoYXNDaGlsZHJlbjsKLQkvL3ByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBJbWFnZSBtZTsKLQkKLQlwdWJsaWMgSnNKZmFjZU5vZGUoTm9kZSBwYXJlbnQsIElKYXZhU2NyaXB0RWxlbWVudCBvcmlnaW5hbEVsZW1lbnQsIFBvc2l0aW9uIHN0cnVjdHVyZURvY0xvY2F0aW9uKSB7Ci0JCXRoaXMocGFyZW50LCBvcmlnaW5hbEVsZW1lbnQsIHN0cnVjdHVyZURvY0xvY2F0aW9uLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIEpzSmZhY2VOb2RlKE5vZGUgcGFyZW50LCBJSmF2YVNjcmlwdEVsZW1lbnQgb3JpZ2luYWxFbGVtZW50LCBQb3NpdGlvbiBzdHJ1Y3R1cmVEb2NMb2NhdGlvbiwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCS8vc3VwZXIoKTsKLQkJc3VwZXIoKChFbGVtZW50SW1wbClwYXJlbnQpKTsKLQkJLy8gc3VwZXIocGFyZW50T2JqZWN0LCBwYXJlbnRPYmplY3QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCWZEb2NQb3NpdGlvbiA9IHN0cnVjdHVyZURvY0xvY2F0aW9uOwotCQkvL3RoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7Ci0JCXRyeSB7Ci0JCQloYXNDaGlsZHJlbj0oKEphdmFFbGVtZW50KW9yaWdpbmFsRWxlbWVudCkuaGFzQ2hpbGRyZW4oKTsKLQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQloYXNDaGlsZHJlbj1mYWxzZTsKLQkJfQotCQlyZW1vdmVBdHRyaWJ1dGVzKCk7Ci0JCW1lID0gKG5ldyBKYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXIoSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfREVGQVVMVHxKYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19TTUFMTF9JQ09OUykpLmdldEltYWdlKG9yaWdpbmFsRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIG1lOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotLy8JCXRyeSB7Ci0vLwkJCXJldHVybiAoKEphdmFFbGVtZW50KXRoaXMuZGlydHlFbGVtZW50KS5oYXNDaGlsZHJlbigpOwotLy8JCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBleCkgewotLy8JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0vLwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotLy8JCX0KLQkJcmV0dXJuIGhhc0NoaWxkcmVuOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIuc2V0VGFnTmFtZShuYW1lKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIGFkZEFkYXB0ZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJYWRhcHRhYmxlRG9tTm9kZS5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgdGVzdFBvc2l0aW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCXJldHVybiAobyAhPSBudWxsICYmIG8gaW5zdGFuY2VvZiBKc0pmYWNlTm9kZSAmJiAoKEpzSmZhY2VOb2RlKSBvKS5mRG9jUG9zaXRpb24gPT0gdGhpcy5mRG9jUG9zaXRpb24pOwotCX0KLQkKLS8vIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEluc3RhbmNlKE9iamVjdCBwYXJlbnQsIFBvc2l0aW9uIHN0cnVjdHVyZURvY0xvY2F0aW9uCi0vLyApewotLy8gLy9yZXR1cm4gbmV3IEpzSmZhY2VOb2RlKChKYXZhRWxlbWVudClwYXJlbnQuZ2V0UGFyZW50KCksCi0vLyBwYXJlbnQuZ2V0RWxlbWVudE5hbWUoKSxzdHJ1Y3R1cmVEb2NMb2NhdGlvbik7Ci0vLyBWZWN0b3IgaW50ZXJmYWNlcyA9IG5ldyBWZWN0b3IoKTsKLS8vIGludGVyZmFjZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QocGFyZW50LmdldENsYXNzKCkuZ2V0SW50ZXJmYWNlcygpKSk7Ci0vLyBKc0pmYWNlTm9kZSBtZSA9IG5ldyBKc0pmYWNlTm9kZShwYXJlbnQsc3RydWN0dXJlRG9jTG9jYXRpb24pOwotLy8gaW50ZXJmYWNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChtZS5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKSkpOwotLy8gT2JqZWN0IHByb3h5ID0gbnVsbDsKLS8vIHRyeSB7Ci0vLyBwcm94eT0gUHJveHkubmV3UHJveHlJbnN0YW5jZSgKLS8vIHBhcmVudC5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksCi0vLyAoQ2xhc3NbXSlpbnRlcmZhY2VzLnRvQXJyYXkobmV3IENsYXNzW117fSksbWUpOwotLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLS8vIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLS8vIH0KLS8vIHJldHVybiBwcm94eTsKLS8vIH0KLS8vICAgCi0JCi0JcHVibGljIElOb2RlQWRhcHRlciBnZXRBZGFwdGVyRm9yKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBhZGFwdGFibGVEb21Ob2RlLmdldEFkYXB0ZXJGb3IodHlwZSk7Ci0JfQotCQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFkYXB0ZXJzKCkgewotCQlyZXR1cm4gYWRhcHRhYmxlRG9tTm9kZS5nZXRBZGFwdGVycygpOwotCX0KLQkKLQkKLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGZEb2NQb3NpdGlvbi5nZXRPZmZzZXQoKSArIGZEb2NQb3NpdGlvbi5nZXRMZW5ndGgoKTsKLQl9Ci0JCi0JCi0JcHVibGljIElOb2RlQWRhcHRlciBnZXRFeGlzdGluZ0FkYXB0ZXIoT2JqZWN0IHR5cGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gYWRhcHRhYmxlRG9tTm9kZS5nZXRFeGlzdGluZ0FkYXB0ZXIodHlwZSk7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUphdmFTY3JpcHRFbGVtZW50IGdldEphdmFFbGVtZW50KCkgewotCQkvKgotCQkgKiBzaW5jZSB0aGlzIG1heSBiZWNvbWUgJ3N0YWxlJyB3ZSBuZWVkIHRvIHJlZGlzY292ZXIgb3VyIGVsZW1lbnQgZXZlcnkKLQkJICogdGltZSB3ZSdyZSBhc2tlZAotCQkgKi8KLQkJSUpzVHJhbnNsYXRpb24gdHJhbiA9IGdldFRyYW5zbGF0aW9uKCk7Ci0JCWludCBzdGFydE9mZnNldCA9IGdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmRPZmZzZXQgPSBnZXRMZW5ndGgoKTsKLQkJaWYgKHR5cGVOYW1lICE9IG51bGwpIHsKLQkJCUlKYXZhU2NyaXB0RWxlbWVudCBteVR5cGUgPSB0cmFuLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldFR5cGUodHlwZU5hbWUpOwotCQkJcmV0dXJuIG15VHlwZTsKLQkJfQotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudHNbXSA9IHRyYW4uZ2V0QWxsRWxlbWVudHNJbkpzUmFuZ2Uoc3RhcnRPZmZzZXQsIHN0YXJ0T2Zmc2V0ICsgZW5kT2Zmc2V0KTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCXJldHVybiBlbGVtZW50c1swXTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5nZXRTdHJpbmcoIkpzSmZhY2VOb2RlLjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkRvY1Bvc2l0aW9uLmdldExlbmd0aCgpOwotCX0KLQkKLQkKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Ob2RlSW1wbCNnZXRPd25lckRvY3VtZW50KCkKLQkgKi8KLQkKLQotCQotCQotCi0JCi0JCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGZEb2NQb3NpdGlvbi5nZXRPZmZzZXQoKTsKLQl9Ci0JCi0vLyBwcml2YXRlIE1ldGhvZFtdIGdldE1ldGhvZHMoKXsKLS8vIC8vIHJldHVybnMgdGhlIG1ldGhvZHMgdGhpcyBjbGFzcyBzdXBwb3J0cyAoYXMgZGVjbGFyZWQgaW4gaW50ZXJmYWNlcykKLS8vIENsYXNzW10gaW50ZXJmYWNlcyA9IGdldENsYXNzKCkuZ2V0SW50ZXJmYWNlcygpOwotLy8gVmVjdG9yIHZNZXRob2RzID0gbmV3IFZlY3RvcigpOwotLy8gZm9yKGludCBpID0gMDtpPGludGVyZmFjZXMubGVuZ3RoO2krKyl7Ci0vLyBNZXRob2QgbWV0aG9kc1tdID0gaW50ZXJmYWNlc1tpXS5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLS8vIHZNZXRob2RzLmFkZEFsbChBcnJheXMuYXNMaXN0KG1ldGhvZHMpKTsKLS8vIH0KLS8vICAgICAgICAKLS8vIHJldHVybiAoTWV0aG9kW10pdk1ldGhvZHMudG9BcnJheSgpOwotLy8gfQotLy8gcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHByb3h5LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MKLS8vIFRocm93YWJsZSB7Ci0vLyBPYmplY3QgcmVzdWx0OwotLy8gTWV0aG9kW10gbXlNZXRob2RzID0gZ2V0TWV0aG9kcygpOwotLy8gICAgICAgIAotLy8gdHJ5IHsKLS8vIGZvcihpbnQgaSA9IDA7aTxteU1ldGhvZHMubGVuZ3RoO2krKyl7Ci0vLyBpZihteU1ldGhvZHNbaV09PW1ldGhvZCl7Ci0vLyByZXR1cm4gbWV0aG9kLmludm9rZSh0aGlzLCBhcmdzKTsKLS8vIH0KLS8vIH0KLS8vIHJlc3VsdCA9IG1ldGhvZC5pbnZva2UocGFyZW50VHlwZSwgYXJncyk7Ci0vLyB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLS8vIHRocm93IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0vLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8gdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInVuZXhwZWN0ZWQgaW52b2NhdGlvbiBleGNlcHRpb246ICIgKwotLy8gZS5nZXRNZXNzYWdlKCkpOwotLy8gfQotLy8KLS8vIHJldHVybiByZXN1bHQ7Ci0vLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuTm9kZUltcGwjZ2V0U3RydWN0dXJlZERvY3VtZW50KCkKLQkgKi8KLQkKLQotCQotCXB1YmxpYyBJSnNUcmFuc2xhdGlvbiBnZXRUcmFuc2xhdGlvbigpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSURPTURvY3VtZW50IHhtbERvYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAobW9kZWxNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCW1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvYyk7Ci0JCQkJLy8gbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGRvYyk7Ci0JCQl9Ci0JCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBtb2RlbDsKLQkJCXhtbERvYyA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBtb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlpZiAoeG1sRG9jID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpzVHJhbnNsYXRpb25BZGFwdGVyIHRyYW5zbGF0aW9uQWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQlyZXR1cm4gdHJhbnNsYXRpb25BZGFwdGVyLmdldEpzVHJhbnNsYXRpb24odHJ1ZSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIG5vdGlmeShpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWFkYXB0YWJsZURvbU5vZGUubm90aWZ5KGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQWRhcHRlcihJTm9kZUFkYXB0ZXIgYWRhcHRlcikgewotCQlhZGFwdGFibGVEb21Ob2RlLnJlbW92ZUFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFkYXB0ZXJSZWdpc3RyeShGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJdGhpcy5hZGFwdGVyUmVnaXN0cnkgPSByZWdpc3RyeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDQ4MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNmU1YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUpzSmZhY2VOb2RlLjE9ZXJyb3IgaW4gSnNKZmFjZU5vZGUuLi4gSSBjb3VsZG4ndCByZXRyaWV2ZSBteSBqYXZhIGVsZW1lbnQgZnJvbSB0aGUgb3JpZ2luYWwgcGFnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRm9ySnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZvckpzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNDdjMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRm9ySnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5wcm92aXNpb25hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5KYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuU3RhbmRhcmRKYXZhU2NyaXB0RWxlbWVudENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXJGb3JKcyBleHRlbmRzIEpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MIHsKLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZvckpzKEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50UHJvdmlkZXIoKS5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCWlmIChpc0pTRWxlbWVudFBhcmVudChub2RlKSkgewotLy8gT2JqZWN0W10gcmVzdWx0cyA9IGdldEpTRWxlbWVudHNGcm9tTm9kZShub2RlLmdldEZpcnN0Q2hpbGQoKSk7Ci0vLyBJTWVtYmVyW10gYWxsUmVzdWx0cyA9IG5ldyBJTWVtYmVyW3Jlc3VsdHMubGVuZ3RoXTsKLS8vIGZvcihpbnQgaSA9IDA7aTxyZXN1bHRzLmxlbmd0aDtpKyspIHsKLS8vIGlmKHJlc3VsdHNbaV09PW51bGwpIGNvbnRpbnVlOwotLy8gSU1lbWJlciBtZW1iZXIgPSAoKElNZW1iZXIpcmVzdWx0c1tpXSk7Ci0vLyBhbGxSZXN1bHRzW2ldID0gbWVtYmVyOwotCQkJLy8gfQotCQkJcmV0dXJuIGdldEpTRWxlbWVudHNGcm9tTm9kZShub2RlLmdldEZpcnN0Q2hpbGQoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudFByb3ZpZGVyKCkuZ2V0RWxlbWVudHMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudHMob2JqZWN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXIgZ2V0SmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlcigpOwotCX0KLQkKLQlwcml2YXRlIFN0YW5kYXJkSmF2YVNjcmlwdEVsZW1lbnRDb250ZW50UHJvdmlkZXIgZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdGFuZGFyZEphdmFTY3JpcHRFbGVtZW50Q29udGVudFByb3ZpZGVyKHRydWUpOwotCX0KLQkKLQlwcml2YXRlIHN5bmNocm9uaXplZCBPYmplY3RbXSBnZXRKU0VsZW1lbnRzRnJvbU5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0JCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCWludCBlbmRPZmZzZXQgPSAwOwotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSByZXN1bHQgPSBudWxsOwotCQlJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlSW1wbCkpIHsKLQkJCXN0YXJ0T2Zmc2V0ID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWVuZE9mZnNldCA9ICgoTm9kZUltcGwpIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJdHJhbnNsYXRpb24gPSBnZXRUcmFuc2xhdGlvbihub2RlKTsKLQkJCXJlc3VsdCA9IHRyYW5zbGF0aW9uLmdldEFsbEVsZW1lbnRzSW5Kc1JhbmdlKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0vLwkJCQotLy8gaWYgKHJlc3VsdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLS8vIE9iamVjdFtdIG5ld1Jlc3VsdHMgPSBuZXcgT2JqZWN0W3Jlc3VsdC5sZW5ndGhdOwotLy8gZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLS8vIGludCBodG1sbGVuZ3RoID0gMDsKLS8vIGludCBodG1sb2Zmc2V0ID0gMDsKLS8vIFBvc2l0aW9uIHBvc2l0aW9uID0gbnVsbDsKLS8vIHRyeSB7Ci0vLyBodG1sbGVuZ3RoID0gKChTb3VyY2VSZWZFbGVtZW50KSAocmVzdWx0W2ldKSkuZ2V0U291cmNlUmFuZ2UoKS5nZXRMZW5ndGgoKTsKLS8vIGh0bWxvZmZzZXQgPSB0cmFuc2xhdGlvbi5nZXRKc3BPZmZzZXQoKChTb3VyY2VSZWZFbGVtZW50KQotLy8gKHJlc3VsdFtpXSkpLmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCkpOwotLy8gcG9zaXRpb24gPSBuZXcgUG9zaXRpb24oaHRtbG9mZnNldCwgaHRtbGxlbmd0aCk7Ci0vLyB9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vIH0KLS8vIG5ld1Jlc3VsdHNbaV0gPSBnZXRKc05vZGUobm9kZS5nZXRQYXJlbnROb2RlKCksIChJSmF2YVNjcmlwdEVsZW1lbnQpIHJlc3VsdFtpXSwKLS8vIHBvc2l0aW9uKTsKLS8vIH0KLS8vIHJldHVybiBuZXdSZXN1bHRzOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0TGFiZWxJbWFnZShPYmplY3Qgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLmdldEltYWdlKG5vZGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMYWJlbEltYWdlKG5vZGUpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dChPYmplY3Qgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLmdldFRleHQobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExhYmVsVGV4dChub2RlKTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudFByb3ZpZGVyKCkuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JfQotCQotCXByaXZhdGUgSUpzVHJhbnNsYXRpb24gZ2V0VHJhbnNsYXRpb24oTm9kZSBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlET01Eb2N1bWVudCB4bWxEb2MgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKG1vZGVsTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQltb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQkJCS8vIG1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChkb2MpOwotCQkJfQotCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0JCQl4bWxEb2MgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHhtbERvYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlKc1RyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJcmV0dXJuIHRyYW5zbGF0aW9uQWRhcHRlci5nZXRKc1RyYW5zbGF0aW9uKHRydWUpOwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudFByb3ZpZGVyKCkuaGFzQ2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQlpZiAoaXNKU0VsZW1lbnRQYXJlbnQobm9kZSkpIHsKLQkJCU9iamVjdFtdIHJlc3VsdHMgPSBnZXRKU0VsZW1lbnRzRnJvbU5vZGUobm9kZS5nZXRGaXJzdENoaWxkKCkpOwotCQkJcmV0dXJuIChyZXN1bHRzICE9IG51bGwgJiYgcmVzdWx0cy5sZW5ndGggPiAwKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaGFzQ2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzSlNFbGVtZW50UGFyZW50KE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJzY3JpcHQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzQ29udGVudE91dGxpbmVDb25maWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNDb250ZW50T3V0bGluZUNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODg5NjMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNDb250ZW50T3V0bGluZUNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS52aWV3cy5jb250ZW50b3V0bGluZS5IVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzQ29udGVudE91dGxpbmVDb25maWcgZXh0ZW5kcyBIVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX0FEVkFOQ0VEID0gZmFsc2U7Ci0JSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXIgPSBudWxsOwotCQotCXB1YmxpYyBKc0NvbnRlbnRPdXRsaW5lQ29uZmlnKCkge30KLQkKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGdldEphdmFMYWJlbFByb3ZpZGVyKCkgewotCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkxhYmVsUHJvdmlkZXIgPSBuZXcgSnNMYWJlbFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZMYWJlbFByb3ZpZGVyOwotCX0KLQkKLQkKLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoIUpzQ29udGVudE91dGxpbmVDb25maWcuVVNFX0FEVkFOQ0VEKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0TGFiZWxQcm92aWRlcih2aWV3ZXIpOwotCQl9Ci0JCXJldHVybiBnZXRKYXZhTGFiZWxQcm92aWRlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSU1lbnVMaXN0ZW5lciBnZXRNZW51TGlzdGVuZXIoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCS8vIGlmKCFVU0VfQURWQU5DRUQpCi0JCS8vIHJldHVybiBzdXBlci5nZXRNZW51TGlzdGVuZXIodHJlZVZpZXdlcik7Ci0JCXJldHVybiBuZXcgSnNNZW51TGlzdGVuZXIodHJlZVZpZXdlcik7Ci0JfQotCQotCQotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJaWYgKCFKc0NvbnRlbnRPdXRsaW5lQ29uZmlnLlVTRV9BRFZBTkNFRCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKHRyZWVWaWV3ZXIpOwotCQl9Ci0JCXJldHVybiBnZXRKYXZhTGFiZWxQcm92aWRlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzMwZjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5wcm92aXNpb25hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5KYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXI7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzTGFiZWxQcm92aWRlciBleHRlbmRzIFhNTExhYmVsUHJvdmlkZXIgewotCUphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlciA9IG51bGw7Ci0JCi0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCkuZ2V0SW1hZ2Uobyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG8pOwotCX0KLQkKLQlwcml2YXRlIEphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlciBnZXRKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKSB7Ci0JCWlmIChmTGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmTGFiZWxQcm92aWRlciA9IG5ldyBKYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZkxhYmVsUHJvdmlkZXI7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLmdldFRleHQobyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFRleHQobyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9Kc01lbnVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9Kc01lbnVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjNlMDc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNNZW51TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5wcm92aXNpb25hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Hcm91cE1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSFRNTE5vZGVBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLmphdmFlZGl0b3IuQ29tcGlsYXRpb25Vbml0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSUNvbnRleHRNZW51Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5JSmF2YVdlYk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlhNTE5vZGVBY3Rpb25NYW5hZ2VyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc01lbnVMaXN0ZW5lciBleHRlbmRzIEhUTUxOb2RlQWN0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIsIElSZWxlYXNhYmxlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX0dST1VQX0lEID0gImdyb3VwLmVkaXQiOyAvLyROT04tTkxTLTEkCi0JQ29tcGlsYXRpb25Vbml0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3IgY29udHJpYjsKLQlwcml2YXRlIFhNTE5vZGVBY3Rpb25NYW5hZ2VyIGZBY3Rpb25NYW5hZ2VyOwotCXByaXZhdGUgVHJlZVZpZXdlciBmVHJlZVZpZXdlcjsKLQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7Ci0JCi0JcHVibGljIEpzTWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKChJU3RydWN0dXJlZE1vZGVsKSB2aWV3ZXIuZ2V0SW5wdXQoKSwgdmlld2VyKTsKLQkJY29udHJpYiA9IG5ldyBDb21waWxhdGlvblVuaXRFZGl0b3JBY3Rpb25Db250cmlidXRvcigpOwotCQlmVHJlZVZpZXdlciA9IHZpZXdlcjsKLS8vCQkJCi0vLyBmQWN0aW9uR3JvdXBzPSBuZXcgQ29tcG9zaXRlQWN0aW9uR3JvdXAobmV3IEFjdGlvbkdyb3VwW10gewotLy8gbmV3IE9wZW5WaWV3QWN0aW9uR3JvdXAoZ2V0V29ya2JlbmNoU2l0ZSgpLCBnZXRTZWxlY3Rpb25Qcm92aWRlcigpKSwKLS8vIG5ldyBDQ1BBY3Rpb25Hcm91cChnZXRXb3JrYmVuY2hTaXRlKCkpLAotLy8gbmV3IEdlbmVyYXRlQWN0aW9uR3JvdXAoZ2V0V29ya2JlbmNoU2l0ZSgpKSwKLS8vIG5ldyBSZWZhY3RvckFjdGlvbkdyb3VwKGdldFdvcmtiZW5jaFNpdGUoKSksCi0vLyBuZXcgSmF2YVNlYXJjaEFjdGlvbkdyb3VwKGdldFdvcmtiZW5jaFNpdGUoKSl9KTsKLQl9Ci0JCi0JcHVibGljIElBY3Rpb25bXSBnZXRBbGxKc0FjdGlvbnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLS8vCXByaXZhdGUgSVdvcmtiZW5jaFNpdGUgZ2V0V29ya2JlbmNoU2l0ZSgpIHsKLS8vCQlyZXR1cm4gSW50ZXJuYWxIYW5kbGVyVXRpbC5nZXRBY3RpdmVTaXRlKGZUcmVlVmlld2VyKTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBmVHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFRyZWVTZWxlY3Rpb24pIHsKLQkJCVRyZWVTZWxlY3Rpb24gdHNlbGVjdCA9IChUcmVlU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IHRzZWxlY3QudG9BcnJheSgpOwotCQkJaW50IGphdmFDb3VudCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGVsZW1lbnRzW2ldIGluc3RhbmNlb2YgSUphdmFXZWJOb2RlKSB7Ci0JCQkJCWphdmFDb3VudCsrOwotCQkJCX0KLQkJCX0KLQkJCS8vSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0SXRlbXMoKTsKLS8vIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX05FVykpOwotLy8gbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9HT1RPKSk7Ci0vLyBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9PUEVOKSk7Ci0vLyBtYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NIT1cpKTsKLS8vIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfRURJVCkpOwotLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfUkVPUkdBTklaRSkpOwotLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfR0VORVJBVEUpKTsKLS8vIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NFQVJDSCkpOwotLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfQlVJTEQpKTsKLS8vIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX0FERElUSU9OUykpOwotLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfVklFV0VSX1NFVFVQKSk7Ci0vLyBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9QUk9QRVJUSUVTKSk7Ci0JCQlpZiAoamF2YUNvdW50ID09IGVsZW1lbnRzLmxlbmd0aCAmJiBqYXZhQ291bnQgIT0gMCkgewotCQkJCS8vIHNlZSBwbHVnaW4ueG1sIGZvciBvYmplY3QgY29udHJpYnV0aW9ucyB0aGF0IHBvcHVsYXRlIHRoZXNlCi0JCQkJLy8gbWVudXMKLQkJCQkvKgotCQkJCSAqIE1lbnUgZm9yOgotCQkJCSAqIAotCQkJCSAqIE9wZW4gVHlwZSBIaWVyYXJjaHkgT3BlbiBDYWxsIEhpZXJhcmNoeSBTaG93IEluLS0+IFNjcmlwdAotCQkJCSAqIEV4cGxvcmVyIE5hdmlnYXRvcgotCQkJCSAqLwotCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NIT1cpKTsKLQkJCQltYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NIT1cpKTsKLQkJCQkvKgotCQkJCSAqIE1lbnUgZm9yOiBDdXQgQ29weSBQYXN0ZSBEZWxldGUKLQkJCQkgKi8KLQkJCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKEpzTWVudUxpc3RlbmVyLkVESVRfR1JPVVBfSUQpKTsKLQkJCQltYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoSnNNZW51TGlzdGVuZXIuRURJVF9HUk9VUF9JRCkpOwotCQkJCS8qCi0JCQkJICogTWVudSBmb3I6Ci0JCQkJICogCi0JCQkJICogU291cmNlLS0+IEdlbmVyYXRlIEVsZW1lbnQgQ29tbWVudAotCQkJCSAqIAotCQkJCSAqIAotCQkJCSAqIFJlZmFjdG9yLS0+IFJlbmFtZSBNb3ZlIENoYW5nZSBGdW5jdGlvbiBTaWduYXR1cmUgSW5saW5lCi0JCQkJICogSW50cm9kdWNlIEluZGlyZWN0aW9uIEluZmVyIEdlbmVyaWMgVHlwZSBBcmd1bWVudHMKLQkJCQkgKi8KLQkJCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9TT1VSQ0UpKTsKLQkJCQltYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NPVVJDRSkpOwotCQkJCS8qCi0JCQkJICogTWVudSBmb3I6Ci0JCQkJICogCi0JCQkJICogUmVmcmVuY2VzLS0+IFdvcmtzcGFjZSBQcm9qZWN0IEhpZXJhcmNoeSBXb3JraW5nIFNldAotCQkJCSAqIAotCQkJCSAqIERlY2xlcmF0aW9ucy0tPiBXb3Jrc3BhY2UgUHJvamVjdCBIaWVyYXJjaHkgV29ya2luZyBTZXQKLQkJCQkgKiAKLQkJCQkgKi8KLQkJCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9TRUFSQ0gpKTsKLQkJCQltYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NFQVJDSCkpOwotCQkJCS8qIGFsbCBKYXZhIEVsZW1lbnRzICovCi0vLwkJCQkJCi0vLwkJCQkJCi0vLwkJCQkJCi0vLyBKYXZhU2NyaXB0UGx1Z2luLmNyZWF0ZVN0YW5kYXJkR3JvdXBzKG1hbmFnZXIpOwotLy8gU3RyaW5nW10gYWN0aW9uU2V0cyA9IEpTRFRBY3Rpb25TZXRVdGlsLmdldEFsbEFjdGlvblNldHMoKTsKLS8vCi0vLyBJQWN0aW9uW10gYWN0aW9ucyA9IEpTRFRBY3Rpb25TZXRVdGlsLmdldEFjdGlvbnNGcm9tU2V0KGFjdGlvblNldHMpOwotLy8gZm9yKGludCBpID0gMDtpPGFjdGlvbnMubGVuZ3RoO2krKykgewotLy8gbWFuYWdlci5hZGQoYWN0aW9uc1tpXSk7Ci0vLyB9Ci0vLyBmQWN0aW9uR3JvdXBzLnNldENvbnRleHQobmV3IEFjdGlvbkNvbnRleHQoc2VsZWN0aW9uKSk7Ci0vLyBmQWN0aW9uR3JvdXBzLmZpbGxDb250ZXh0TWVudShtYW5hZ2VyKTsKLS8vCQkJCQkKLQkJCX0gZWxzZSBpZiAoamF2YUNvdW50ID09IDApIHsKLQkJCQlmaWxsQ29udGV4dE1lbnUobWFuYWdlciwgc2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGUjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJZlRyZWVWaWV3ZXIgPSBudWxsOwotCQlpZiAoZkFjdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotCQkJZkFjdGlvbk1hbmFnZXIuc2V0TW9kZWwobnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzV2ViRWxlbWVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzV2ViRWxlbWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMGRiNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9Kc1dlYkVsZW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5TdGFuZGFyZEphdmFTY3JpcHRFbGVtZW50Q29udGVudFByb3ZpZGVyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc1dlYkVsZW1lbnRQcm92aWRlciBleHRlbmRzIFN0YW5kYXJkSmF2YVNjcmlwdEVsZW1lbnRDb250ZW50UHJvdmlkZXIge30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvWE1MTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9YTUxMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNWM2MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9YTUxMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIFhNTExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyIHsKLQlib29sZWFuIGZTaG93QXR0cmlidXRlcyA9IGZhbHNlOwotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgbykgewotCQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIuZ2V0VGV4dChvKSk7Ci0JCWlmIChvIGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG87Ci0JCQlpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgJiYgZlNob3dBdHRyaWJ1dGVzKSB7Ci0JCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4NDQ0Ci0JCQkJaWYgKG5vZGUuaGFzQXR0cmlidXRlcygpKSB7Ci0JCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJCQlOb2RlIGlkVHlwZWRBdHRyaWJ1dGUgPSBudWxsOwotCQkJCQlOb2RlIHJlcXVpcmVkQXR0cmlidXRlID0gbnVsbDsKLQkJCQkJYm9vbGVhbiBoYXNJZCA9IGZhbHNlOwotCQkJCQlib29sZWFuIGhhc05hbWUgPSBmYWxzZTsKLQkJCQkJTm9kZSBzaG93bkF0dHJpYnV0ZSA9IG51bGw7Ci0JCQkJCS8vIHRyeSB0byBnZXQgY29udGVudCBtb2RlbCBlbGVtZW50Ci0JCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gbnVsbDsKLQkJCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJCQlpZiAobXEgIT0gbnVsbCkgewotCQkJCQkJZWxlbWVudERlY2wgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCQkJfQotCQkJCQkvLyBmaW5kIGFuIGF0dHJpYnV0ZSBvZiB0eXBlIChvciBqdXN0IG5hbWVkKQotCQkJCQkvLyBJRAotCQkJCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJCQkJaW50IGkgPSAwOwotCQkJCQkJd2hpbGUgKChpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKSkgJiYgKGlkVHlwZWRBdHRyaWJ1dGUgPT0gbnVsbCkpIHsKLQkJCQkJCQlOb2RlIGF0dHIgPSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROb2RlTmFtZSgpOwotCQkJCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCQkJCQkJaWYgKGF0dHJEZWNsICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpICE9IG51bGwpICYmIChDTURhdGFUeXBlLklELmVxdWFscyhhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldERhdGFUeXBlTmFtZSgpKSkpIHsKLQkJCQkJCQkJCWlkVHlwZWRBdHRyaWJ1dGUgPSBhdHRyOwotCQkJCQkJCQl9IGVsc2UgaWYgKChhdHRyRGVjbC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpICYmIChyZXF1aXJlZEF0dHJpYnV0ZSA9PSBudWxsKSkgewotCQkJCQkJCQkJLy8gYXMgYSBiYWNrdXAsIGtlZXAgdGFicyBvbgotCQkJCQkJCQkJLy8gYW55IHJlcXVpcmVkCi0JCQkJCQkJCQkvLyBhdHRyaWJ1dGVzCi0JCQkJCQkJCQlyZXF1aXJlZEF0dHJpYnV0ZSA9IGF0dHI7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQloYXNJZCA9IGhhc0lkIHx8IGF0dHJOYW1lLmVxdWFscygiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJaGFzTmFtZSA9IGhhc05hbWUgfHwgYXR0ck5hbWUuZXF1YWxzKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkrK2k7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLyoKLQkJCQkJICogSWYgbm8gc3VpdGFibGUgYXR0cmlidXRlIHdhcyBmb3VuZCwgdHJ5IHVzaW5nIGEKLQkJCQkJICogcmVxdWlyZWQgYXR0cmlidXRlLCBpZiBub25lLCB0aGVuIHByZWZlciAiaWQiIG9yCi0JCQkJCSAqICJuYW1lIiwgb3RoZXJ3aXNlIGp1c3QgdXNlIGZpcnN0IGF0dHJpYnV0ZQotCQkJCQkgKi8KLQkJCQkJaWYgKGlkVHlwZWRBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSBpZFR5cGVkQXR0cmlidXRlOwotCQkJCQl9IGVsc2UgaWYgKHJlcXVpcmVkQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQkJCXNob3duQXR0cmlidXRlID0gcmVxdWlyZWRBdHRyaWJ1dGU7Ci0JCQkJCX0gZWxzZSBpZiAoaGFzSWQpIHsKLQkJCQkJCXNob3duQXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIGlmIChoYXNOYW1lKSB7Ci0JCQkJCQlzaG93bkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoc2hvd25BdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLml0ZW0oMCk7Ci0JCQkJCX0KLQkJCQkJLy8gZGlzcGxheSB0aGUgYXR0cmlidXRlIGFuZCB2YWx1ZSAod2l0aG91dCBxdW90ZXMpCi0JCQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gc2hvd25BdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJaWYgKChhdHRyaWJ1dGVOYW1lICE9IG51bGwpICYmIChhdHRyaWJ1dGVOYW1lLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCXRleHQuYXBwZW5kKCIgIiArIGF0dHJpYnV0ZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBzaG93bkF0dHJpYnV0ZS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCWlmICgoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCkgJiYgKGF0dHJpYnV0ZVZhbHVlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCQl0ZXh0LmFwcGVuZCgiPSIgKyBTdHJpbmdVdGlscy5zdHJpcChhdHRyaWJ1dGVWYWx1ZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3dlYjEuR0lGIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS93ZWIxLkdJRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhMjIwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3dlYjEuR0lGCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS93ZWIxLkpQRyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvd2ViMS5KUEcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YmY5YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS93ZWIxLkpQRworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjlkZWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtZW5jb2RpbmciLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtdGFza3RhZ3MiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtY29udGVudHByb3BlcnRpZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ij4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL3czYy9kb20vdHJhdmVyc2FsL05vZGVJdGVyYXRvciIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzEyMzBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJpbgotbW9kZWwuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmVfMS4wLjAuamFyCi1AZG90Ci1zcmMuemlwCi0uZmJ3YXJuaW5ncwotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiMGIxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9tL2FkYXB0ZXIvbm90aWZpY2F0aW9uL3RpbWU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb20vYWRhcHRlci9ub3RpZmljYXRpb24vdGltZS9jcml0ZXJpYT0xMAotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRkb2N1bWVudD1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2ZpbGVidWZmZXJzL21vZGVsbWFuYWdlbWVudD1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2ZpbGVidWZmZXJzL2xlYWtzPXRydWUKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9maWxlYnVmZmVycy9saWZlY3ljbGU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvbGlmZWN5Y2xlPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3RydWN0dXJlZG1vZGVsL3N0YXRlPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3RydWN0dXJlZG1vZGVsL2xvY2tzPXRydWUKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvbW9kZWxtYW5hZ2VyPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3M9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9kZXRlY3Rpb249ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9qb2I9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9vdmVyYWxsdGltZT1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL3RpbWU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9wcmVmZXJlbmNlcz1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL3JlZ2lzdHJ5PWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZm9ybWF0PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmM1YjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRlNjBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTYXQgTWFyIDI0IDExOjIzOjU0IEVEVCAyMDA3DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3INCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmpGbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmpGbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDcyNzJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplci5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLypubHNYWFgqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsNCi0NCi0NCi0NCi0lJQ0KLQ0KLSV7DQotDQotDQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsNCi0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZw0KLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7DQotDQotDQotDQotCXB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsNCi0JICAJLyogdGhlIGlucHV0IGRldmljZSAqLw0KLQkgIAl5eV9yZWFkZXIgPSBpbjsNCi0NCi0gIAkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLSAgCQl5eV9zdGF0ZSA9IDA7DQotDQotICAJCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsNCi0NCi0gIAkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovDQotICAJCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOw0KLQ0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLSAgCQl5eV9tYXJrZWRQb3MgPSAwOw0KLQ0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLw0KLSAgCQl5eV9wdXNoYmFja1BvcyA9IDA7DQotDQotICAJCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLw0KLSAgCQl5eV9jdXJyZW50UG9zID0gMDsNCi0NCi0gIAkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotICAJCXl5X3N0YXJ0UmVhZCA9IDA7DQotDQotICAJCS8qKiANCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotICAJCSAqIGZyb20gaW5wdXQgDQotICAJCSAqLw0KLSAgCQl5eV9lbmRSZWFkID0gMDsNCi0NCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotICAJCXl5bGluZSA9IDA7DQotDQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgCQl5eWNoYXIgPSAwOw0KLQ0KLSAgCQkvKioNCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQNCi0gIAkJICogb2YgdGhlIG1hdGNoZWQgdGV4dA0KLSAgCQkgKi8NCi0gIAkJeXljb2x1bW4gPSAwOyANCi0NCi0gIAkJLyoqIA0KLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyANCi0gIAkJICogb2YgYSBsaW5lDQotICAJCSAqLw0KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOw0KLQ0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovDQotICAJCXl5X2F0RU9GID0gZmFsc2U7DQotDQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLw0KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOw0KLQ0KLQ0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOw0KLSAgCQkNCi0gIAkJaGFzTW9yZSA9IHRydWU7DQotICAJCQ0KLQkJLy8gaXRzIGEgbGl0dGxlIHdhc3RlZnVsIHRvICJ0aHJvdyBhd2F5IiBmaXJzdCBjaGFyIGFycmF5IGdlbmVyYXRlZA0KLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQNCi0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLg0KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gTUFYX1RPX1NDQU4pIHsNCi0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07DQotCQl9DQotICAJCQ0KLQ0KLSAgCX0NCi0NCi0NCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOw0KLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOw0KLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7DQotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOw0KLQkJCXZhbHVlVGV4dCA9IG51bGw7DQotCQl9IGVsc2Ugew0KLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOw0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgew0KLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47DQotCX0NCi0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7DQotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotDQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgew0KLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCX0NCi0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsNCi0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsNCi0JfQ0KLQkNCi0NCi0lfQ0KLQ0KLSVlb2Z7DQotCWhhc01vcmU9ZmFsc2U7DQotJWVvZn0NCi0NCi0lcHVibGljDQotJWNsYXNzIENTU0hlYWRUb2tlbml6ZXINCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbg0KLSV0eXBlIFN0cmluZw0KLSVjaGFyDQotJXVuaWNvZGUNCi0laWdub3JlY2FzZSANCi0lZGVidWcNCi0lc3dpdGNoDQotDQotDQotVVRGMTZCRSA9IFx4RkVceEZGDQotVVRGMTZMRSA9IFx4RkZceEZFDQotVVRGODNCeXRlQk9NID0gXHhFRlx4QkJceEJGDQotDQotLy9TcGFjZUNoYXIgPSBbXHgyMFx4MDldDQotDQotDQotDQotLy8gWzNdIFMgOjo9ICgweDIwIHwgMHg5IHwgMHhEIHwgMHhBKSsNCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdDQotDQotLy9CZWdpbkF0dHJpYmVWYWx1ZSA9IHtTfSogXD0ge1N9Kg0KLQ0KLUxpbmVUZXJtaW5hdG9yID0gXHJ8XG4NCi0NCi0vLyBaIGlzIHRoZSBzaW5nbGUtYnl0ZSB6ZXJvIGNoYXJhY3RlciB0byBiZSB1c2VkIGluIHBhcnNpbmcgZG91YmxlLWJ5dGUgZmlsZXMNCi1aID0gKFx4MDApPw0KLVNfVVRGID0ge1p9e1N9e1p9DQotQmVnaW5BdHRyaWJ1dGVWYWx1ZVVURiA9IHtTX1VURn0qIFw9IHtTX1VURn0qDQotDQotJXN0YXRlIFNUX1hNTERlY2wNCi0lc3RhdGUgQ0hBUlNFVF9SVUxFDQotJXN0YXRlIFF1b3RlZEF0dHJpYnV0ZVZhbHVlDQotJXN0YXRlIERRX1NUUklORw0KLSVzdGF0ZSBTUV9TVFJJTkcNCi0lc3RhdGUgVW5EZWxpbWl0ZWRTdHJpbmcNCi0NCi0lJQ0KLQ0KLQ0KLTxZWUlOSVRJQUw+ICANCi17DQotCXtVVEYxNkJFfSAgIAkJe2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7fQ0KLQl7VVRGMTZMRX0gICAJCXtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO30NCi0Je1VURjgzQnl0ZUJPTX0gICAJe2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9DQotDQotCS8vIGZvcmNlIHRvIGJlIHN0YXJ0ZWQgb24gZmlyc3QgbGluZSwgYnV0IHdlIGRvIGFsbG93IHByZWNlZWRpbmcgc3BhY2VzDQotCV4ge1p9KHtTfXtafSkqICh7Wn08e1p9XD97Wn14e1p9bXtafWx7Wn0pe1NfVVRGfSsge2lmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fX0NCi0JDQotCV4ge1p9KHtTfXtafSkqKHtafUB7Wn1je1p9aHtafWF7Wn1ye1p9c3tafWV7Wn10e1p9KSAgIHtpZiAoeXljaGFyID09IDAgKSAge3l5YmVnaW4oQ0hBUlNFVF9SVUxFKTsgcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuQ0hBUlNFVF9SVUxFO319DQotfQkNCi0NCi0vLyBJIGRvbid0IHRoaW5rIHRoZXJlJ3MgcmVhbGx5IGFuIFhNTCBmb3JtIG9mIENTUyBmaWxlcyAuLi4gYnV0IHdpbGwgbGVhdmUgaGVyZSBmb3IgY29uc2lzdGVuY3kJDQotPFNUX1hNTERlY2w+IA0KLXsNCi0JLy8idmVyc2lvbiIge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFZlcnNpb247fQ0KLQl7Wn1le1p9bntafWN7Wn1ve1p9ZHtafWl7Wn1ue1p9Z3tafSB7QmVnaW5BdHRyaWJ1dGVWYWx1ZVVURn0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nO30NCi0JLy8gbm90ZSB0aGlzICJmb3JjZWQgZW5kIiBvbmNlIGVuZCBvZiBYTUwgRGVjbGFyYXRpb24gZm91bmQNCi0Je1p9XD97Wn0+e1p9ICAgIHt5eWJlZ2luKFlZSU5JVElBTCk7ICByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kO30NCi19CQ0KLQ0KLTxDSEFSU0VUX1JVTEU+IA0KLXsNCi0NCi0Je1NfVVRGfSogIHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpO30NCi0Je1p9O3tafSAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuUnVsZUVuZDt9DQotfQ0KLQkNCi0NCi08UXVvdGVkQXR0cmlidXRlVmFsdWU+DQotew0KLQl7Wn1cIntafSAgICAgICAgICAgICAgICAgICAgIHsgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9DQotCXtafVwne1p9CQkJeyB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0NCi0JLy8gaW4gdGhpcyBzdGF0ZSwgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNwYWNlIGNoYXJhY3RlciBjYW4gc3RhcnQgYW4gdW5kZWxpbWl0ZWQgc3RyaW5nDQotCXtTX1VURn0qLiAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTt9DQotDQotfQkNCi0NCi0NCi08RFFfU1RSSU5HPg0KLXsNCi0NCi0Je1p9XCJ7Wn0gICAgICAgICAgICAgICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyB9DQotICAJe1p9e0xpbmVUZXJtaW5hdG9yfXtafSAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVw/e1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9PHtafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQkNCi0Je1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn1cL3tafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafTt7Wn0gICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0NCi0JW15ceDAwXQkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQ0KLQ0KLQ0KLX0NCi0NCi08U1FfU1RSSU5HPg0KLXsNCi0NCi0Je1p9XCd7Wn0gICAgICAgICAgICAgICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlO30NCi0gIAl7Wn17TGluZVRlcm1pbmF0b3J9e1p9ICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9JXtafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9PHtafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVwve1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9O3tafSAgICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQ0KLQlbXlx4MDBdCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9DQotDQotfQ0KLQ0KLTxVbkRlbGltaXRlZFN0cmluZz4NCi17DQotDQotDQotCXtTX1VURn0gICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9DQotICAJe1p9e0xpbmVUZXJtaW5hdG9yfXtafSAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVw/e1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn08e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCS8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQ0KLQl7Wn1cJ3tafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn1cIntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQ0KLQkNCi0Je1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn1cL3tafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafTt7Wn0gICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0NCi0JW15ceDAwXQkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQ0KLX0NCi0NCi0vLyBUaGUgIm1hdGNoIGFueXRoaW5nIiBydWxlIHNob3VsZCBhbHdheXMgYmUgaW4gZWZmZWN0IGV4Y2VwdCBmb3Igd2hlbiBsb29raW5nIGZvciBlbmQgb2Ygc3RyaW5nDQotLy8gKFRoYXQgaXMsIHJlbWVtYmVyIHRvIHVwZGF0ZSBzdGF0ZSBsaXN0IGlmL3doZW4gbmV3IHN0YXRlcyBhZGRlZCkNCi0ufFxuCXtpZih5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9fQ0KLQ0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0DQotPDxFT0Y+PiAgICAgICAgIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7fQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMzA5ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQxICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDcvMjgvMDggNToxOSBQTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiA3LzI4LzA4IDU6MTkgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovd29ya3NwYWNlcy93dHAzMDEvd29ya3NwYWNlL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuakZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgQ1NTSGVhZFRva2VuaXplciB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFVuRGVsaW1pdGVkU3RyaW5nID0gMTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IERRX1NUUklORyA9IDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNRX1NUUklORyA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxEZWNsID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBDSEFSU0VUX1JVTEUgPSA0OwotCi0gIC8qKgotICAgKiBZWV9MRVhTVEFURVtsXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiBZWV9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICogbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBZWV9MRVhTVEFURVtdID0geyAKLSAgICAgMCwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNywgNwotICB9OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMVwxMVwxMFwwXDFcNlwxXDEwXDJcMFwxXDdcMjJcMFwxXDZcMVwwXDFcMzciKwotICAgICJcMlwwXDFcNDJcMVwwXDFcNDBcN1wwXDFcNDFcMTNcMFwxXDM2XDFcMTNcMVwxMiIrCi0gICAgIlwxXDM1XDFcMTRcMVwyMFwxXDIzXDFcMFwxXDIxXDFcMzJcMVwyNlwxXDBcMVwzNCIrCi0gICAgIlwxXDIyXDFcMzNcMlwwXDFcMTdcMVwxNlwxXDMwXDFcMzFcMlwwXDFcMjRcMVwyNSIrCi0gICAgIlwxXDI3XDNcMFwxXDE1XDEwXDBcMVwyM1wxXDBcMVwyMVwxXDMyXDFcMjZcMVwwIisKLSAgICAiXDFcMzRcMVwyMlwxXDMzXDJcMFwxXDE3XDFcMTZcMVwzMFwxXDMxXDJcMFwxXDI0IisKLSAgICAiXDFcMjVcMVwyN1wzXDBcMVwxNVwxMDJcMFwxXDRcM1wwXDFcNVwxN1wwXDFcMyIrCi0gICAgIlwxNlwwXDFcMVwyMFwwXDFcM1wxNlwwXDFcMVwxXDJcMTcwXDBcMVwyXHVmZTg3XDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICBwcml2YXRlIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIAotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfZW9mX2RvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQotCi0KLQlwdWJsaWMgQ1NTSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLQkgIAkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JICAJeXlfcmVhZGVyID0gaW47Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIAkJeXlfc3RhdGUgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAJCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gIAkJIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAJCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9jdXJyZW50UG9zID0gMDsKLQotICAJCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLSAgCQkvKiogCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gIAkJICogZnJvbSBpbnB1dCAKLSAgCQkgKi8KLSAgCQl5eV9lbmRSZWFkID0gMDsKLQotICAJCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5bGluZSA9IDA7Ci0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWNoYXIgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gIAkJICovCi0gIAkJeXljb2x1bW4gPSAwOyAKLQotICAJCS8qKiAKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyAKLSAgCQkgKiBvZiBhIGxpbmUKLSAgCQkgKi8KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0gIAkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAJCXl5X2F0RU9GID0gZmFsc2U7Ci0KLSAgCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOwotICAJCQotICAJCWhhc01vcmUgPSB0cnVlOwotICAJCQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50Ci0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLgotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotCQl9Ci0gIAkJCi0KLSAgCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0KLQkKLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIENTU0hlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTSGVhZFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE2MCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLQotICAgIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAJaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgeXlfYXRCT0wgPSB5eV9tYXJrZWRQb3MgPD0gMCB8fCB5eV9idWZmZXJbeXlfbWFya2VkUG9zLTFdID09ICdcbic7Ci0gICAgICBpZiAoIXl5X2F0Qk9MICYmIHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xyJykgewotICAgICAgICB5eV9hdEJPTCA9IHl5X2FkdmFuY2UoKSAhPSAnXG4nOwotICAgICAgICBpZiAoIXl5X2F0RU9GKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICBpZiAoeXlfYXRCT0wpCi0gICAgICAgIHl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZSsxXTsKLSAgICAgIGVsc2UKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlXTsKLQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXljbWFwW3l5X2lucHV0XTsKLQotICAgICAgICAgIGJvb2xlYW4geXlfaXNGaW5hbCA9IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4geXlfbm9Mb29rQWhlYWQgPSBmYWxzZTsKLQotICAgICAgICAgIHl5X2Zvck5leHQ6IHsgc3dpdGNoICh5eV9zdGF0ZSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgICAgICAgY2FzZSAzMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHl5X3N0YXRlID0gNDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA1MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9zdGF0ZSA9IDUzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDU0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDU1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDU2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gNTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDU4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgICAgICAgY2FzZSAzMzogeXlfc3RhdGUgPSA2NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA2NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9zdGF0ZSA9IDY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X3N0YXRlID0gNjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9zdGF0ZSA9IDY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA3NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDc2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA1MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA3NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDc4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDU0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDU1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDU2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gNTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA1NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gNTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gODA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA4MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gODM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHl5X3N0YXRlID0gNzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gODQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA4NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gODY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA4NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gODE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gODg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfc3RhdGUgPSA4OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA5MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gODc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA5MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X3N0YXRlID0gODk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogeXlfc3RhdGUgPSA5NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gOTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDkzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDk4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gOTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB5eV9zdGF0ZSA9IDk1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEwMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9zdGF0ZSA9IDEwMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTAyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEwMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gOTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTA0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X3N0YXRlID0gMTA1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHl5X3N0YXRlID0gMTAxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSAxMDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEwMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9zdGF0ZSA9IDEwNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9zdGF0ZSA9IDEwNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X3N0YXRlID0gMTExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTEyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X3N0YXRlID0gMTExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTE1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTE3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9JTExFR0FMX1NUQVRFKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSB9Ci0KLSAgICAgICAgICBpZiAoIHl5X2lzRmluYWwgKSB7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggeXlfbm9Mb29rQWhlYWQgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgY2FzZSA2NDogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSAxMTk6IGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgY2FzZSA4MzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLSAgICAgICAgY2FzZSAxMjA6IGJyZWFrOwotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyAgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5SdWxlRW5kOyB9Ci0gICAgICAgIGNhc2UgMTIxOiBicmVhazsKLSAgICAgICAgY2FzZSAzOTogCi0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgMTIyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDk6IAotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSAge3l5YmVnaW4oQ0hBUlNFVF9SVUxFKTsgcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuQ0hBUlNFVF9SVUxFO30gfQotICAgICAgICBjYXNlIDEyMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTY6IAotICAgICAgICBjYXNlIDEwMjogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O30gfQotICAgICAgICBjYXNlIDEyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgICB7IGlmKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30gfQotICAgICAgICBjYXNlIDEyNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTU6IAotICAgICAgICBjYXNlIDc5OiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgIHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7IH0KLSAgICAgICAgY2FzZSAxMjY6IGJyZWFrOwotICAgICAgICBjYXNlIDExNDogCi0gICAgICAgIGNhc2UgMTE2OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOyB9Ci0gICAgICAgIGNhc2UgMTI3OiBicmVhazsKLSAgICAgICAgY2FzZSAzOiAKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgfQotICAgICAgICBjYXNlIDEyODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTsgfQotICAgICAgICBjYXNlIDEyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTsgfQotICAgICAgICBjYXNlIDEzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzQ6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NOyB9Ci0gICAgICAgIGNhc2UgMTMxOiBicmVhazsKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICBjYXNlIDM1OiAKLSAgICAgICAgICB7ICBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyAgfQotICAgICAgICBjYXNlIDEzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDYzOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7ICB9Ci0gICAgICAgIGNhc2UgMTMzOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgIGNhc2UgNjI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSAxMzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDEzNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgICB7ICBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDEzNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSAxMzc6IGJyZWFrOwotICAgICAgICBjYXNlIDM4OiAKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDEzODogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOyB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotICAvKioKLSAgICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLSAgICoKLSAgICogVGhpcyBtYWluIG1ldGhvZCBpcyB0aGUgZGVidWdnaW5nIHJvdXRpbmUgZm9yIHRoZSBzY2FubmVyLgotICAgKiBJdCBwcmludHMgZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YKLSAgICogZmlsZSBpcyByZWFjaGVkLCBvciBhbiBlcnJvciBvY2N1cmVkLgotICAgKgotICAgKiBAcGFyYW0gYXJndiAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuCi0gICAqICAgICAgICAgICAgICAgdGhlIHNjYW5uZXIgb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICBDU1NIZWFkVG9rZW5pemVyIHNjYW5uZXIgPSBudWxsOwotICAgICAgdHJ5IHsKLSAgICAgICAgc2Nhbm5lciA9IG5ldyBDU1NIZWFkVG9rZW5pemVyKCBuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3ZbaV0pICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgQ1NTSGVhZFRva2VuaXplciA8aW5wdXRmaWxlPiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgZG8gewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnByaW1HZXROZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0gd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplckdlbkphdmEuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWYwNmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplckdlbkphdmEuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotQGVjaG8gb2ZmDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG5lZWQgdG8gYmUgc2V0L3NwZWNpZmllZCBmb3IgZWFjaCAiZGV2ZWxvcG1lbnQgbWFjaGluZSINCi1zZXQgUEFUSD0lUEFUSCU7ZDpqZGtzXGoyc2RrMS40LjFfMDJcYmluDQotc2V0IFdPUktTUEFDRV9MT0NBVElPTj1EOlxidWlsZHNcV29ya3NwYWNlc1xQdXJlSGVhZFdvcmtzcGFjZQ0KLXNldCBKRkxFWF9MSUJfTE9DQVRJT049RDpcRGV2VGltZVN1cHBvcnRcSkZsZXhcbGliDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRpZmZlciBmcm9tIHByb2plY3QgdG8gcHJvamVjdCwgYnV0IHNob3VsZCBiZSBvdGhlcndpc2UgY29uc3RhbnQNCi1zZXQgTUFJTl9OQU1FPUNTU0hlYWRUb2tlbml6ZXINCi1zZXQgUFJPSkVDVF9TUkM9XG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljXHNyY1wNCi1zZXQgUEFDS0FHRV9ESVI9Y29tXGlibVxlbmNvZGluZ1xyZXNvdXJjZVxjb250ZW50c3BlY2lmaWNcY3NzXA0KLQ0KLXJlbSBHaXZlbiB0aGUgYWJvdmUgImZyYW1ld29yayIgYW5kIHRoZSBjb21tYW5kIHRoZW1zZWx2ZXMsIHRoZXNlIHZhcmlhYmxlcyBzaG91bGQgbmV2ZXIgbmVlZCB0byBiZSBtb2RpZmllZA0KLXNldCBKQVZBX0ZJTEU9JU1BSU5fTkFNRSUuamF2YQ0KLXNldCBKRkxFWF9SVUxFUz0lTUFJTl9OQU1FJS5qZmxleA0KLXNldCBTS0VMRVRPTl9GSUxFPSVNQUlOX05BTUUlLnNrZWxldG9uDQotDQotSUYgRVhJU1QgJUpBVkFfRklMRSUgZGVsICVKQVZBX0ZJTEUlDQotcmVtIGphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAtc2tlbCAlU0tFTEVUT05fRklMRSUgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwICVKRkxFWF9MSUJfTE9DQVRJT04lXHNlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluICVKRkxFWF9SVUxFUyUgIDE+amZsZXhvdXQudHh0IDI+amZsZXhlcnIudHh0DQotSUYgRVhJU1QgJUpBVkFfRklMRSUgY29weSAlSkFWQV9GSUxFJSAlV09SS1NQQUNFX0xPQ0FUSU9OJSVQUk9KRUNUX1NSQyUlUEFDS0FHRV9ESVIlJUpBVkFfRklMRSUNCi0NCi1yZW0gcGF1c2UNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL2pmbGV4ZXJyLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvamZsZXhvdXQudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleG91dC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNzQzY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleG91dC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVJlYWRpbmcgIkNTU0hlYWRUb2tlbml6ZXIuamZsZXgiCi1Db25zdHJ1Y3RpbmcgTkZBIDogNDU4IHN0YXRlcyBpbiBORkEKLUNvbnZlcnRpbmcgTkZBIHRvIERGQSA6IAotLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotMTAyIHN0YXRlcyBiZWZvcmUgbWluaW1pemF0aW9uLCA2NCBzdGF0ZXMgaW4gbWluaW1pemVkIERGQQotV3JpdGluZyBjb2RlIHRvICJDU1NIZWFkVG9rZW5pemVyLmphdmEiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplci5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmpGbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzVkMDc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmpGbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKm5sc1hYWCovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsNCi0NCi0NCi0NCi0lJQ0KLQ0KLSV7DQotDQotDQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsNCi0JcHJpdmF0ZSBib29sZWFuIGhhc0NoYXJzZXRBdHRyID0gZmFsc2U7DQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7DQotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcNCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOw0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOw0KLQlib29sZWFuIGZvdW5kQ29udGVudFR5cGVWYWx1ZSA9IGZhbHNlOw0KLQlwcml2YXRlIGJvb2xlYW4gaXNYSFRNTDsNCi0NCi0NCi0NCi0JcHVibGljIEhUTUxIZWFkVG9rZW5pemVyKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsNCi0JICAJLyogdGhlIGlucHV0IGRldmljZSAqLw0KLQkgIAl5eV9yZWFkZXIgPSBpbjsNCi0NCi0gIAkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLSAgCQl5eV9zdGF0ZSA9IDA7DQotDQotICAJCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsNCi0NCi0gIAkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovDQotICAJCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOw0KLQ0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLSAgCQl5eV9tYXJrZWRQb3MgPSAwOw0KLQ0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLw0KLSAgCQl5eV9wdXNoYmFja1BvcyA9IDA7DQotDQotICAJCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLw0KLSAgCQl5eV9jdXJyZW50UG9zID0gMDsNCi0NCi0gIAkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotICAJCXl5X3N0YXJ0UmVhZCA9IDA7DQotDQotICAJCS8qKiANCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotICAJCSAqIGZyb20gaW5wdXQgDQotICAJCSAqLw0KLSAgCQl5eV9lbmRSZWFkID0gMDsNCi0NCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotICAJCS8vIHl5bGluZSA9IDA7DQotDQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgCQl5eWNoYXIgPSAwOw0KLQ0KLSAgCQkvKioNCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQNCi0gIAkJICogb2YgdGhlIG1hdGNoZWQgdGV4dA0KLSAgCQkgKi8NCi0gIAkJLy8geXljb2x1bW4gPSAwOyANCi0NCi0gIAkJLyoqIA0KLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyANCi0gIAkJICogb2YgYSBsaW5lDQotICAJCSAqLw0KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOw0KLQ0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovDQotICAJCXl5X2F0RU9GID0gZmFsc2U7DQotDQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLw0KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOw0KLQ0KLQ0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOw0KLSAgCQkNCi0gIAkJaGFzTW9yZSA9IHRydWU7DQotICAJCWhhc0NoYXJzZXRBdHRyID0gZmFsc2U7DQotICAJCWlzWEhUTUwgPSBmYWxzZTsNCi0NCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQNCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50DQotCQkvLyBhIHNtYWxsIGJ1ZmZlciBmb3Igb3VyIGhlYWQgcGFyc2Vycy4NCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7DQotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOw0KLQkJfQ0KLSAgCQkNCi0NCi0gIAl9DQotDQotDQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsNCi0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7DQotCQkJaGFzTW9yZSA9IGZhbHNlOw0KLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlVOREVGSU5FRCwgeXljaGFyLCB5eXRleHQoKSk7DQotCQkJd2hpbGUoeXlfYWR2YW5jZSgpICE9IFlZRU9GKSB7fQ0KLQkJCXJldHVybiByZXN1bHQ7DQotCQl9DQotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsNCi0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7DQotCQkJdmFsdWVUZXh0ID0gbnVsbDsNCi0JCX0gZWxzZSB7DQotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7DQotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsNCi0JfQ0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsNCi0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0NCi0JfQ0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNDaGFyc2V0QXR0cigpIHsNCi0JCXJldHVybiBoYXNDaGFyc2V0QXR0cjsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7DQotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JfQ0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgew0KLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOw0KLQl9DQotCQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hIVE1MKCkgew0KLSAgICAgICByZXR1cm4gaXNYSFRNTDsNCi0gICAgfQ0KLSV9DQotDQotJWVvZnsNCi0JaGFzTW9yZT1mYWxzZTsNCi0lZW9mfQ0KLQ0KLSVwdWJsaWMNCi0lY2xhc3MgSFRNTEhlYWRUb2tlbml6ZXINCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbg0KLSV0eXBlIFN0cmluZw0KLSVjaGFyDQotJXVuaWNvZGUNCi0laWdub3JlY2FzZSANCi0vLyVkZWJ1Zw0KLSVzd2l0Y2gNCi0NCi0NCi1VVEYxNkJFID0gXHhGRVx4RkYNCi1VVEYxNkxFID0gXHhGRlx4RkUNCi1VVEY4M0J5dGVCT00gPSBceEVGXHhCQlx4QkYNCi0NCi1TcGFjZUNoYXIgPSBbXHgyMFx4MDldDQotDQotDQotDQotLy8gWzNdIFMgOjo9ICgweDIwIHwgMHg5IHwgMHhEIHwgMHhBKSsNCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdDQotDQotLy8gQmVnaW5BdHRyaWJlVmFsdWUgPSB7U30qIFw9IHtTfSoNCi0NCi1MaW5lVGVybWluYXRvciA9IFxyfFxuDQotDQotWiA9IChceDAwKT8NCi1TX1VURiA9IHtafXtTfXtafQ0KLUJlZ2luQXR0cmlidXRlVmFsdWVVVEYgPSB7U19VVEZ9KiBcPSB7U19VVEZ9Kg0KLQ0KLSVzdGF0ZSBTVF9YTUxEZWNsDQotJXN0YXRlIFNUX01FVEFfVEFHDQotJXN0YXRlIFF1b3RlZEF0dHJpYnV0ZVZhbHVlDQotJXN0YXRlIERRX1NUUklORw0KLSVzdGF0ZSBTUV9TVFJJTkcNCi0lc3RhdGUgVW5EZWxpbWl0ZWRTdHJpbmcNCi0lc3RhdGUgVW5EZWxpbWl0ZWRDaGFyc2V0DQotDQotJSUNCi0NCi0NCi08WVlJTklUSUFMPiAgDQotew0KLQl7VVRGMTZCRX0gICAJCXtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFO30NCi0Je1VURjE2TEV9ICAgCQl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9DQotCXtVVEY4M0J5dGVCT019ICAgCXtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fQ0KLQ0KLQkvLyBmb3JjZSB0byBiZSBzdGFydGVkIG9uIGZpcnN0IGxpbmUsIGJ1dCB3ZSBkbyBhbGxvdyBwcmVjZWVkaW5nIHNwYWNlcw0KLQleIHtTX1VURn0qICh7Wn08e1p9XD97Wn14e1p9bXtafWx7Wn0pe1NfVVRGfSsge2lmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fX0NCi0JKHtafTx7Wn1Ne1p9RXtafVR7Wn1Be1p9KSAgICAgICB7eXliZWdpbihTVF9NRVRBX1RBRyk7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnU3RhcnQ7fQ0KLQkNCi0JLy8gVG8gZGV0ZXJtaW5lIGlmIGNvbnRlbnQgaXMgWEhUTUwuVGFrZW4gZnJvbSBKU1BIZWFkVG9rZW5pemVyLg0KLSAgICB7Wn08e1p9XCF7Wn1Ee1p9T3tafUN7Wn1Ue1p9WXtafVB7Wn1Fe1p9IHtTX1VURn0qIHtafWh7Wn10e1p9bXtafWx7Wn0ge1NfVVRGfSoge1p9UHtafVV7Wn1Ce1p9THtafUl7Wn1De1p9IC4qIHtafVwve1p9XC97Wn1Ee1p9VHtafUR7Wn17U19VVEZ9e1p9WHtafUh7Wn1Ue1p9TXtafUx7Wn0gICAgICAgICAgICAgICAge2lzWEhUTUwgPSB0cnVlO30NCi0Je1p9PHtafWh7Wn10e1p9bXtafWx7Wn0ge1NfVVRGfSoge1p9eHtafW17Wn1se1p9bntafXN7Wn0ge1NfVVRGfSoge1p9XD17Wn0ge1NfVVRGfSogKCh7Wn1cIntafSkgfCAoe1p9XCd7Wn0pKSB7Wn1oe1p9dHtafXR7Wn1we1p9OntafVwve1p9XC97Wn13e1p9d3tafXd7Wn1cLntafXd7Wn0ze1p9XC57Wn1ve1p9cntafWd7Wn1cL3tafTF7Wn05e1p9OXtafTl7Wn1cL3tafXh7Wn1oe1p9dHtafW17Wn1se1p9ICAgICB7aXNYSFRNTCA9IHRydWU7fQ0KLQ0KLX0JDQotCQ0KLTxTVF9YTUxEZWNsPiANCi17DQotCS8vInZlcnNpb24iIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xWZXJzaW9uO30NCi0JKHtafWV7Wn1ue1p9Y3tafW97Wn1ke1p9aXtafW57Wn1ne1p9KSB7QmVnaW5BdHRyaWJ1dGVWYWx1ZVVURn0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nO30NCi0JLy8gbm90ZSB0aGlzICJmb3JjZWQgZW5kIiBvbmNlIGVuZCBvZiBYTUwgRGVjbGFyYXRpb24gZm91bmQNCi0JKHtafVw/e1p9PntafSkgICAge3l5YmVnaW4oWVlJTklUSUFMKTsgIHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7fQ0KLX0JDQotDQotPFNUX01FVEFfVEFHPiANCi17DQotDQotLy8JImh0dHAtZXF1aXYiIHtTfSogXD0ge1N9KiBcIj8gIkNvbnRlbnQtVHlwZSIgXCI/IHtTfSsgImNvbnRlbnQiIHtCZWdpbkF0dHJpYmVWYWx1ZX0gIHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyBmb3VuZENvbnRlbnRUeXBlVmFsdWU9dHJ1ZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdDb250ZW50VHlwZTt9DQotCXtafWh7Wn10e1p9dHtafXB7Wn0te1p9ZXtafXF7Wn11e1p9aXtafXZ7Wn0ge1NfVVRGfSogXD0ge1NfVVRGfSoge1p9XCI/e1p9ICh7Wn1De1p9b3tafW57Wn10e1p9ZXtafW57Wn10e1p9LXtafVR7Wn15e1p9cHtafWV7Wn0pIFwiP3tafSAoe1NfVVRGfSkrICh7Wn1je1p9b3tafW57Wn10e1p9ZXtafW57Wn10e1p9KSB7QmVnaW5BdHRyaWJ1dGVWYWx1ZVVURn0gIHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyBmb3VuZENvbnRlbnRUeXBlVmFsdWU9dHJ1ZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdDb250ZW50VHlwZTt9DQotCXtafWN7Wn1oe1p9YXtafXJ7Wn1ze1p9ZXtafXR7Wn0ge0JlZ2luQXR0cmlidXRlVmFsdWVVVEZ9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyBmb3VuZENvbnRlbnRUeXBlVmFsdWU9dHJ1ZTsgaGFzQ2hhcnNldEF0dHI9dHJ1ZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdDb250ZW50VHlwZTt9DQotCXtafT57Wn0gICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7ICBpZiAoZm91bmRDb250ZW50VHlwZVZhbHVlKSBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnRW5kO30NCi0Je1p9XC97Wn0+e1p9ICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyBpZiAoZm91bmRDb250ZW50VHlwZVZhbHVlKSBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnRW5kO30NCi19DQotCQ0KLQ0KLTxRdW90ZWRBdHRyaWJ1dGVWYWx1ZT4NCi17DQotCXtafVwie1p9ICAgICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0NCi0Je1p9XCd7Wn0JCQl7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQ0KLQkvLyBpbiB0aGlzIHN0YXRlLCBhbnl0aGluZyBvdGhlciB0aGFuIGEgc3BhY2UgY2hhcmFjdGVyIGNhbiBzdGFydCBhbiB1bmRlbGltaXRlZCBzdHJpbmcNCi0Je1NfVVRGfSouICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApO30NCi0NCi19CQ0KLQ0KLQ0KLTxEUV9TVFJJTkc+DQotew0KLQ0KLQl7Wn1cIntafSAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0NCi0gIAl7Wn17TGluZVRlcm1pbmF0b3J9e1p9ICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XD97Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn08e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCQ0KLQl7Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVwve1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0JW15ceDAwXQkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQ0KLQ0KLQ0KLX0NCi0NCi08U1FfU1RSSU5HPg0KLXsNCi0NCi0Je1p9XCd7Wn0gICAgICAgICAgICAgICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlO30NCi0gIAl7Wn17TGluZVRlcm1pbmF0b3J9e1p9ICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9JXtafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9PHtafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVwve1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0JW15ceDAwXQkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQ0KLQ0KLQ0KLX0NCi0NCi08VW5EZWxpbWl0ZWRTdHJpbmc+DQotew0KLQ0KLQ0KLQkvLyBub3RlIHRoaXMgaW5pdGlhbCBzcGVjaWFsIGNhc2UgZm9yIEhUVFAgY29udGVudHR5cGUgdmFsdWVzDQotCS8vIExvb2sgYWhlYWQgYW5kIHNlZSBpZiB0aGVyZSBhcmUgc3BhY2VzLCBidXQgZG9uJ3QgYXBwZW5kIHRoZSBzcGFjZXMgYXMgdGhleSBtYXkgYmUgZG91YmxlLWJ5dGUNCi0JLy8gTGV0IHRoZSBuZXh0IHN0YXRlIGhhbmRsZSByZW1vdmFsIG9mIHRoZSBceDAwIGFuZCBwcm9wZXJseSBhcHBlbmQgc3BhY2VzDQotCSI7Ii97U19VVEZ9KgkJCXsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFVuRGVsaW1pdGVkQ2hhcnNldCk7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0NCi0Je1NfVVRGfSAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0NCi0gIAl7Wn17TGluZVRlcm1pbmF0b3J9e1p9ICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XD97Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafTx7Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0JLy8gdGhlc2UgYXJlIGEgYml0IHNwZWNpYWwsIHNpbmNlIHdlIHN0YXJ0ZWQgYW4gdW5kZWxpbWl0IHN0cmluZywgYnV0IGZvdW5kIGEgcXVvdGUgLi4uIHByb2JhYmx5IGluZGljYXRlcyBhIG1pc3NpbmcgYmVnaW5uaW5nIHF1b3RlDQotCXtafVwne1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVwie1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9DQotCQ0KLQl7Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVwve1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0JW15ceDAwXQkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQ0KLQ0KLX0NCi0NCi08VW5EZWxpbWl0ZWRDaGFyc2V0Pg0KLXsNCi0Je1N9IHsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQ0KLQkvLyBGb3Igbm9uIFx4MDAgY2hhcmFjdGVycywgbGV0IHRoZSBwcmV2aW91cyBzdGF0ZSBoYW5kbGUgaXQNCi0JW15ceDAwXSB7eXlwdXNoYmFjaygxKTsgcG9wU3RhdGUoKTsgfQ0KLX0NCi0NCi0vLyBUaGUgIm1hdGNoIGFueXRoaW5nIiBydWxlIHNob3VsZCBhbHdheXMgYmUgaW4gZWZmZWN0IGV4Y2VwdCBmb3Igd2hlbiBsb29raW5nIGZvciBlbmQgb2Ygc3RyaW5nDQotLy8gKFRoYXQgaXMsIHJlbWVtYmVyIHRvIHVwZGF0ZSBzdGF0ZSBsaXN0IGlmL3doZW4gbmV3IHN0YXRlcyBhZGRlZCkNCi0ufFxuCXtpZih5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9fQ0KLQ0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0DQotPDxFT0Y+PiAgICAgICAgIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7fQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2Q2YzhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gMS8yNy8wNCA2OjQxIFBNICovCi0KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuaHRtbDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSGVhZFBhcnNlclRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkludFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbC5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiAxLzI3LzA0IDY6NDEgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgSFRNTEhlYWRUb2tlbml6ZXIgewotCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9NRVRBX1RBRyA9IDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFVuRGVsaW1pdGVkU3RyaW5nID0gMTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IERRX1NUUklORyA9IDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNRX1NUUklORyA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxEZWNsID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA2OwotCi0gIC8qKgotICAgKiBZWV9MRVhTVEFURVtsXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiBZWV9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICogbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBZWV9MRVhTVEFURVtdID0geyAKLSAgICAgMCwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNywgNwotICB9OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTFcMFwxXDZcMVw3XDJcMFwxXDExXDIyXDBcMVwyMlwxXDBcMVw0MFwyXDAiKwotICAgICJcMVw0NFwxXDBcMVw0M1w1XDBcMVwzNFwxXDBcMVw0MlwxM1wwXDFcNDVcMVwxMiIrCi0gICAgIlwxXDEwXDFcMzFcMVwxM1wxXDBcMVwyMVwxXDBcMVwyNFwxXDI2XDFcMTdcMVwwIisKLSAgICAiXDFcMzBcMVwzMlwxXDI3XDJcMFwxXDE2XDFcMTVcMVwyM1wxXDI1XDFcMzNcMVwzNSIrCi0gICAgIlwyXDBcMVwyMFwxXDM2XDFcMzdcMVwwXDFcMTRcMVw0MVw3XDBcMVwyMVwxXDAiKwotICAgICJcMVwyNFwxXDI2XDFcMTdcMVwwXDFcMzBcMVwzMlwxXDI3XDJcMFwxXDE2XDFcMTUiKwotICAgICJcMVwyM1wxXDI1XDFcMzNcMVwzNVwyXDBcMVwyMFwxXDM2XDFcMzdcMVwwXDFcMTQiKwotICAgICJcMVw0MVwxMDFcMFwxXDRcM1wwXDFcNVwxN1wwXDFcM1wxNlwwXDFcMVwyMFwwIisKLSAgICAiXDFcM1wxNlwwXDFcMVwxXDJcMTcwXDBcMVwyXHVmZTg3XDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICBwcml2YXRlIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIAotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfZW9mX2RvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQlib29sZWFuIGZvdW5kQ29udGVudFR5cGVWYWx1ZSA9IGZhbHNlOwotCi0KLQotCXB1YmxpYyBIVE1MSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLQkgIAkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JICAJeXlfcmVhZGVyID0gaW47Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIAkJeXlfc3RhdGUgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAJCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gIAkJIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAJCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9jdXJyZW50UG9zID0gMDsKLQotICAJCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLSAgCQkvKiogCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gIAkJICogZnJvbSBpbnB1dCAKLSAgCQkgKi8KLSAgCQl5eV9lbmRSZWFkID0gMDsKLQotICAJCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5bGluZSA9IDA7Ci0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWNoYXIgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gIAkJICovCi0gIAkJeXljb2x1bW4gPSAwOyAKLQotICAJCS8qKiAKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyAKLSAgCQkgKiBvZiBhIGxpbmUKLSAgCQkgKi8KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0gIAkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAJCXl5X2F0RU9GID0gZmFsc2U7Ci0KLSAgCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOwotICAJCQotICAJCWhhc01vcmUgPSB0cnVlOwotICAJCQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50Ci0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLgotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotCQl9Ci0gIAkJCi0KLSAgCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0KLQkKLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEhUTUxIZWFkVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEhUTUxIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTc0KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotCi0gICAgU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIAloYXNNb3JlPWZhbHNlOwotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICB5eV9hdEJPTCA9IHl5X21hcmtlZFBvcyA8PSAwIHx8IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xuJzsKLSAgICAgIGlmICgheXlfYXRCT0wgJiYgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXHInKSB7Ci0gICAgICAgIHl5X2F0Qk9MID0geXlfYWR2YW5jZSgpICE9ICdcbic7Ci0gICAgICAgIGlmICgheXlfYXRFT0YpIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIGlmICh5eV9hdEJPTCkKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGVdOwotCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eWNtYXBbeXlfaW5wdXRdOwotCi0gICAgICAgICAgYm9vbGVhbiB5eV9pc0ZpbmFsID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB5eV9ub0xvb2tBaGVhZCA9IGZhbHNlOwotCi0gICAgICAgICAgeXlfZm9yTmV4dDogeyBzd2l0Y2ggKHl5X3N0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogCi0gICAgICAgICAgICAgICAgY2FzZSAzNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDogeXlfc3RhdGUgPSAzNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHl5X3N0YXRlID0gMzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDM3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gMzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA0MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSA0NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDQ4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSAzNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDUwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA1MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA1MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHl5X3N0YXRlID0gNTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDU0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSA1NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB5eV9zdGF0ZSA9IDU3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfc3RhdGUgPSA1ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X3N0YXRlID0gNTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9zdGF0ZSA9IDYyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA2MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA2NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X3N0YXRlID0gNjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9zdGF0ZSA9IDY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfc3RhdGUgPSA2NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X3N0YXRlID0gNjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHl5X3N0YXRlID0gNzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDcwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA3MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA3MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9zdGF0ZSA9IDczOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA3NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gNzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDc1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA3NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gNzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDc4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA3OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X3N0YXRlID0gODA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDgxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMzogeXlfc3RhdGUgPSA4MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHl5X3N0YXRlID0gODM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDg0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA4NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9zdGF0ZSA9IDg2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA4NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDg3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA4NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gODg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDg5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA5MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gOTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDkyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA5MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gOTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfSUxMRUdBTF9TVEFURSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gfQotCi0gICAgICAgICAgaWYgKCB5eV9pc0ZpbmFsICkgewotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoIHl5X25vTG9va0FoZWFkICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA5NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotICAgICAgICBjYXNlIDk3OiBicmVhazsKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyAgaWYgKGZvdW5kQ29udGVudFR5cGVWYWx1ZSkgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0VuZDsgfQotICAgICAgICBjYXNlIDk4OiBicmVhazsKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA5OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgaWYgKGZvdW5kQ29udGVudFR5cGVWYWx1ZSkgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0VuZDsgfQotICAgICAgICBjYXNlIDEwMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDU6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDEwMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgMTAyOiBicmVhazsKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O30gfQotICAgICAgICBjYXNlIDEwMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30gfQotICAgICAgICBjYXNlIDEwNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjA6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9NRVRBX1RBRyk7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnU3RhcnQ7IH0KLSAgICAgICAgY2FzZSAxMDU6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgIHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7IH0KLSAgICAgICAgY2FzZSAxMDY6IGJyZWFrOwotICAgICAgICBjYXNlIDk0OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IGZvdW5kQ29udGVudFR5cGVWYWx1ZT10cnVlOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0NvbnRlbnRUeXBlOyB9Ci0gICAgICAgIGNhc2UgMTA3OiBicmVhazsKLSAgICAgICAgY2FzZSA2ODogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzsgfQotICAgICAgICBjYXNlIDEwODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTsgfQotICAgICAgICBjYXNlIDEwOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTsgfQotICAgICAgICBjYXNlIDExMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDc6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NOyB9Ci0gICAgICAgIGNhc2UgMTExOiBicmVhazsKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgICAgeyAgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSAxMTI6IGJyZWFrOwotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgICB7ICBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyAgfQotICAgICAgICBjYXNlIDExMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSAxMTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7ICB9Ci0gICAgICAgIGNhc2UgMTE1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTE2OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0gIC8qKgotICAgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotICAgKgotICAgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuCi0gICAqIEl0IHByaW50cyBlYWNoIHJldHVybmVkIHRva2VuIHRvIFN5c3RlbS5vdXQgdW50aWwgdGhlIGVuZCBvZgotICAgKiBmaWxlIGlzIHJlYWNoZWQsIG9yIGFuIGVycm9yIG9jY3VyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBhcmd2ICAgdGhlIGNvbW1hbmQgbGluZSwgY29udGFpbnMgdGhlIGZpbGVuYW1lcyB0byBydW4KLSAgICogICAgICAgICAgICAgICB0aGUgc2Nhbm5lciBvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLSAgICAgIEhUTUxIZWFkVG9rZW5pemVyIHNjYW5uZXIgPSBudWxsOwotICAgICAgdHJ5IHsKLSAgICAgICAgc2Nhbm5lciA9IG5ldyBIVE1MSGVhZFRva2VuaXplciggbmV3IGphdmEuaW8uRmlsZVJlYWRlcihhcmd2W2ldKSApOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZCA6IFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUgXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIEhUTUxIZWFkVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotCi0gICAgICB0cnkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLSAgICAgICAgfSB3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplckdlbkphdmEuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmYyMzI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1AZWNobyBvZmYNCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbmVlZCB0byBiZSBzZXQvc3BlY2lmaWVkIGZvciBlYWNoICJkZXZlbG9wbWVudCBtYWNoaW5lIg0KLXNldCBQQVRIPSVQQVRIJTtkOmpka3NcajJzZGsxLjQuMV8wMlxiaW4NCi1zZXQgV09SS1NQQUNFX0xPQ0FUSU9OPUQ6XGJ1aWxkc1xXb3Jrc3BhY2VzXFB1cmVIZWFkV29ya3NwYWNlDQotc2V0IEpGTEVYX0xJQl9MT0NBVElPTj1EOlxEZXZUaW1lU3VwcG9ydFxKRmxleFxsaWINCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgZGlmZmVyIGZyb20gcHJvamVjdCB0byBwcm9qZWN0LCBidXQgc2hvdWxkIGJlIG90aGVyd2lzZSBjb25zdGFudA0KLXNldCBNQUlOX05BTUU9SFRNTEhlYWRUb2tlbml6ZXINCi1zZXQgUFJPSkVDVF9TUkM9XG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljXHNyY1wNCi1zZXQgUEFDS0FHRV9ESVI9Y29tXGlibVxlbmNvZGluZ1xyZXNvdXJjZVxjb250ZW50c3BlY2lmaWNcaHRtbFwNCi0NCi1yZW0gR2l2ZW4gdGhlIGFib3ZlICJmcmFtZXdvcmsiIGFuZCB0aGUgY29tbWFuZCB0aGVtc2VsdmVzLCB0aGVzZSB2YXJpYWJsZXMgc2hvdWxkIG5ldmVyIG5lZWQgdG8gYmUgbW9kaWZpZWQNCi1zZXQgSkFWQV9GSUxFPSVNQUlOX05BTUUlLmphdmENCi1zZXQgSkZMRVhfUlVMRVM9JU1BSU5fTkFNRSUuamZsZXgNCi1zZXQgU0tFTEVUT05fRklMRT0lTUFJTl9OQU1FJS5za2VsZXRvbg0KLQ0KLUlGIEVYSVNUICVKQVZBX0ZJTEUlIGRlbCAlSkFWQV9GSUxFJQ0KLXJlbSBqYXZhIC1YbXg0NzAwMDAwMDAgLWNwICVKRkxFWF9MSUJfTE9DQVRJT04lXHNlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluICVKRkxFWF9SVUxFUyUgLXNrZWwgJVNLRUxFVE9OX0ZJTEUlIDE+amZsZXhvdXQudHh0IDI+amZsZXhlcnIudHh0DQotamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlICAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLUlGIEVYSVNUICVKQVZBX0ZJTEUlIGNvcHkgJUpBVkFfRklMRSUgJVdPUktTUEFDRV9MT0NBVElPTiUlUFJPSkVDVF9TUkMlJVBBQ0tBR0VfRElSJSVKQVZBX0ZJTEUlDQotDQotcmVtIHBhdXNlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL2pmbGV4ZXJyLnR4dAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9qZmxleG91dC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9qZmxleG91dC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NjllOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvamZsZXhvdXQudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1SZWFkaW5nICJIVE1MSGVhZFRva2VuaXplci5qZmxleCIKLQotV2FybmluZyA6IE1hY3JvICJTcGFjZUNoYXIiIGhhcyBiZWVuIGRlY2xhcmVkIGJ1dCBuZXZlciB1c2VkLgotQ29uc3RydWN0aW5nIE5GQSA6IDY2MCBzdGF0ZXMgaW4gTkZBCi1Db252ZXJ0aW5nIE5GQSB0byBERkEgOiAKLS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLTEzNSBzdGF0ZXMgYmVmb3JlIG1pbmltaXphdGlvbiwgOTUgc3RhdGVzIGluIG1pbmltaXplZCBERkEKLVdyaXRpbmcgY29kZSB0byAiSFRNTEhlYWRUb2tlbml6ZXIuamF2YSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL3NrZWxldG9uIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvc2tlbGV0b24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOWIzZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvc2tlbGV0b24KKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotDQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8NCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7DQotDQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8NCi0tLS0gIGxleGljYWwgc3RhdGVzLCBjaGFybWFwDQotDQotICAvKiBlcnJvciBjb2RlcyAqLw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsNCi0NCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8NCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsNCi0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwNCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwNCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLA0KLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiDQotICB9Ow0KLQ0KLS0tLSBpc0ZpbmFsIGxpc3QNCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovDQotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotICBwcml2YXRlIGludCB5eV9zdGF0ZTsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOw0KLQ0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsNCi0NCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOw0KLQ0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7DQotDQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7DQotDQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotICAgICAgZnJvbSBpbnB1dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsNCi0NCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIC8vcHJpdmF0ZSBpbnQgeXlsaW5lOw0KLQ0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOw0KLQ0KLSAgLyoqDQotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgDQotICAgKiBtYXRjaGVkIHRleHQNCi0gICAqLw0KLSAgLy9wcml2YXRlIGludCB5eWNvbHVtbjsgDQotDQotICAvKiogDQotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUNCi0gICAqLw0KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOw0KLQ0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsNCi0NCi0tLS0gdXNlciBjbGFzcyBjb2RlDQotDQotICAvKioNCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcg0KLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLg0KLSAgICoNCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLg0KLSAgICovDQotLS0tIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uDQotDQotDQotICAvKioNCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLg0KLSAgICoNCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQ0KLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuDQotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzDQotICAgKi8NCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7DQotDQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8NCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107DQotDQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gDQotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOw0KLQ0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8NCi0NCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8NCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsNCi0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCANCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgDQotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7DQotDQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8NCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOw0KLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOw0KLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOw0KLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7DQotICAgIH0NCi0NCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLw0KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7DQotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovDQotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07DQotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7DQotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOw0KLSAgICB9DQotDQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLw0KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOw0KLQ0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7DQotDQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOw0KLQ0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107DQotICB9DQotDQotICAgIA0KLSAgLyoqDQotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4NCi0gICAqLw0KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsNCi0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovDQotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLw0KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7DQotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQ0KLSAgICoNCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUNCi0gICAqLw0KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsNCi0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsNCi0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4NCi0gICAqLw0KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsNCi0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLg0KLSAgICoNCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5DQotICAgKi8NCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgew0KLSAgICB0cnkgew0KLSAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnN0YW5jZTogIiArIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpICsgIiBvZmZzZXQ6IiArIHl5Y2hhciArICIgc3RhdGU6IiArIHl5c3RhdGUoKSk7DQotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdICsgIlxuIiArIGlzZSk7DQotICAgICAgdGhyb3cgaXNlOw0KLSAgICB9DQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOw0KLSAgICB9DQotDQotICB9IA0KLQ0KLQ0KLSAgLyoqDQotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4NCi0gICAqDQotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kDQotICAgKg0KLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uDQotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSENCi0gICAqLw0KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgew0KLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQ0KLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsNCi0NCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsNCi0gIH0NCi0NCi0NCi0tLS0geXlfZG9Fb2YNCi0gIC8qKg0KLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwNCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4NCi0gICAqDQotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4NCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMNCi0gICAqLw0KLS0tLSB5eWxleCBkZWNsYXJhdGlvbg0KLSAgICBpbnQgeXlfaW5wdXQ7DQotICAgIGludCB5eV9hY3Rpb247DQotDQotLS0tIGxvY2FsIGRlY2xhcmF0aW9ucw0KLQ0KLSAgICB3aGlsZSAodHJ1ZSkgew0KLQ0KLS0tLSBzdGFydCBhZG1pbiAobGluZSwgY2hhciwgY29sIGNvdW50KQ0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOw0KLQ0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7DQotDQotLS0tIHN0YXJ0IGFkbWluIChsZXhzdGF0ZSBldGMpDQotDQotICAgICAgeXlfZm9yQWN0aW9uOiB7DQotICAgICAgICB3aGlsZSAodHJ1ZSkgew0KLSAgICANCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7DQotDQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247DQotDQotLS0tIGxpbmUsIGNvbCwgY2hhciBjb3VudCwgbmV4dCB0cmFuc2l0aW9uLCBpc0ZpbmFsIGFjdGlvbg0KLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyANCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyANCi0tLS0gbGluZSBjb3VudCB1cGRhdGUNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0tLS0gY2hhciBjb3VudCB1cGRhdGUNCi0NCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICANCi0NCi0tLS0gYWN0aW9ucw0KLSAgICAgICAgZGVmYXVsdDogDQotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgew0KLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsNCi0tLS0gZW9mdmFsdWUNCi0gICAgICAgICAgfSANCi0gICAgICAgICAgZWxzZSB7DQotLS0tIG5vIG1hdGNoDQotICAgICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0gICAgDQotDQotLS0tIG1haW4NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvc2tlbGV0b24ucmVhZG1lIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvc2tlbGV0b24ucmVhZG1lCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjg5NzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL3NrZWxldG9uLnJlYWRtZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotVGhlIHNrZWxldG9uLnNlZCBmaWxlIGNvbnRhaW5zIHRoZSBtb2RpZmllZCBKRmxleCAxLjIuMiBza2VsZXRvbiBmaWxlIHdpdGgNCi1jaGFuZ2VzIGZvciB1c2Ugd2l0aCB0aGUgdG9rZW5pemVycyB3aXRoaW4gdGhlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS54bWwgYW5kDQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmpzcCBwbHVnaW5zLg0KLQ0KLVRoZSBza2VsZXRvbiBmaWxlJ3MgbWV0aG9kIGRlZmluaXRpb25zIGFyZSBjb3BpZWQgaW50byB0aGUgZ2VuZXJhdGVkIG91dHB1dA0KLWRpcmVjdGx5Lg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lcy5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lcy5qRmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwNzM4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXMuakZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDggSUJNIENvcnBvcmF0aW9uLCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAga2IuaHVhbmcgIC0gQnVnIDIxNDQxNiAgRG90IGNoYXIgaXMgbm90IGVzY2FwZWQgaW4gWE1MMTBOYW1lcy5qRmxleAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0lJQotCi0ldGFibGUKLSVwdWJsaWMKLSVmaW5hbAotJWNsYXNzIFhNTDEwTmFtZXMKLSVmdW5jdGlvbiBpc1ZhbGlkWE1MMTBOYW1lCi0ldHlwZSBib29sZWFuCi0ldW5pY29kZQotJWlnbm9yZWNhc2UKLSVidWZmZXIgMjA0OAotJWFwaXByaXZhdGUKLQotQmFzZUNoYXIgPSBbXHUwMDQxLVx1MDA1QVx1MDA2MS1cdTAwN0FcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAwRkZcdTAxMDAtXHUwMTMxXHUwMTM0LVx1MDEzRVx1MDE0MS1cdTAxNDhcdTAxNEEtXHUwMTdFXHUwMTgwLVx1MDFDM1x1MDFDRC1cdTAxRjBcdTAxRjQtXHUwMUY1XHUwMUZBLVx1MDIxN1x1MDI1MC1cdTAyQThcdTAyQkItXHUwMkMxXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0NFXHUwM0QwLVx1MDNENlx1MDNEQVx1MDNEQ1x1MDNERVx1MDNFMFx1MDNFMi1cdTAzRjNcdTA0MDEtXHUwNDBDXHUwNDBFLVx1MDQ0Rlx1MDQ1MS1cdTA0NUNcdTA0NUUtXHUwNDgxXHUwNDkwLVx1MDRDNFx1MDRDNy1cdTA0QzhcdTA0Q0ItXHUwNENDXHUwNEQwLVx1MDRFQlx1MDRFRS1cdTA0RjVcdTA0RjgtXHUwNEY5XHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODZcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMS1cdTA2M0FcdTA2NDEtXHUwNjRBXHUwNjcxLVx1MDZCN1x1MDZCQS1cdTA2QkVcdTA2QzAtXHUwNkNFXHUwNkQwLVx1MDZEM1x1MDZENVx1MDZFNS1cdTA2RTZcdTA5MDUtXHUwOTM5XHUwOTNEXHUwOTU4LVx1MDk2MVx1MDk4NS1cdTA5OENcdTA5OEYtXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOURDLVx1MDlERFx1MDlERi1cdTA5RTFcdTA5RjAtXHUwOUYxXHUwQTA1LVx1MEEwQVx1MEEwRi1cdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMi1cdTBBMzNcdTBBMzUtXHUwQTM2XHUwQTM4LVx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4Qlx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMi1cdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUUwXHUwQjA1LVx1MEIwQ1x1MEIwRi1cdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMi1cdTBCMzNcdTBCMzYtXHUwQjM5XHUwQjNEXHUwQjVDLVx1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTktXHUwQjlBXHUwQjlDXHUwQjlFLVx1MEI5Rlx1MEJBMy1cdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCNVx1MEJCNy1cdTBCQjlcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzMzXHUwQzM1LVx1MEMzOVx1MEM2MC1cdTBDNjFcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENERVx1MENFMC1cdTBDRTFcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEMjhcdTBEMkEtXHUwRDM5XHUwRDYwLVx1MEQ2MVx1MEUwMS1cdTBFMkVcdTBFMzBcdTBFMzItXHUwRTMzXHUwRTQwLVx1MEU0NVx1MEU4MS1cdTBFODJcdTBFODRcdTBFODctXHUwRTg4XHUwRThBXHUwRThEXHUwRTk0LVx1MEU5N1x1MEU5OS1cdTBFOUZcdTBFQTEtXHUwRUEzXHUwRUE1XHUwRUE3XHUwRUFBLVx1MEVBQlx1MEVBRC1cdTBFQUVcdTBFQjBcdTBFQjItXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjY5XHUxMEEwLVx1MTBDNVx1MTBEMC1cdTEwRjZcdTExMDBcdTExMDItXHUxMTAzXHUxMTA1LVx1MTEwN1x1MTEwOVx1MTEwQi1cdTExMENcdTExMEUtXHUxMTEyXHUxMTNDXHUxMTNFXHUxMTQwXHUxMTRDXHUxMTRFXHUxMTUwXHUxMTU0LVx1MTE1NVx1MTE1OVx1MTE1Ri1cdTExNjFcdTExNjNcdTExNjVcdTExNjdcdTExNjlcdTExNkQtXHUxMTZFXHUxMTcyLVx1MTE3M1x1MTE3NVx1MTE5RVx1MTFBOFx1MTFBQlx1MTFBRS1cdTExQUZcdTExQjctXHUxMUI4XHUxMUJBXHUxMUJDLVx1MTFDMlx1MTFFQlx1MTFGMFx1MTFGOVx1MUUwMC1cdTFFOUJcdTFFQTAtXHUxRUY5XHUxRjAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMTI2XHUyMTJBLVx1MjEyQlx1MjEyRVx1MjE4MC1cdTIxODJcdTMwNDEtXHUzMDk0XHUzMEExLVx1MzBGQVx1MzEwNS1cdTMxMkNcdUFDMDAtXHVEN0EzXQotCi1JZGVvZ3JhcGhpYyA9IFtcdTRFMDAtXHU5RkE1XHUzMDA3XHUzMDIxLVx1MzAyOV0KLQotQ29tYmluaW5nQ2hhciA9IFtcdTAzMDAtXHUwMzQ1XHUwMzYwLVx1MDM2MVx1MDQ4My1cdTA0ODZcdTA1OTEtXHUwNUExXHUwNUEzLVx1MDVCOVx1MDVCQi1cdTA1QkRcdTA1QkZcdTA1QzEtXHUwNUMyXHUwNUM0XHUwNjRCLVx1MDY1Mlx1MDY3MFx1MDZENi1cdTA2RENcdTA2REQtXHUwNkRGXHUwNkUwLVx1MDZFNFx1MDZFNy1cdTA2RThcdTA2RUEtXHUwNkVEXHUwOTAxLVx1MDkwM1x1MDkzQ1x1MDkzRS1cdTA5NENcdTA5NERcdTA5NTEtXHUwOTU0XHUwOTYyLVx1MDk2M1x1MDk4MS1cdTA5ODNcdTA5QkNcdTA5QkVcdTA5QkZcdTA5QzAtXHUwOUM0XHUwOUM3LVx1MDlDOFx1MDlDQi1cdTA5Q0RcdTA5RDdcdTA5RTItXHUwOUUzXHUwQTAyXHUwQTNDXHUwQTNFXHUwQTNGXHUwQTQwLVx1MEE0Mlx1MEE0Ny1cdTBBNDhcdTBBNEItXHUwQTREXHUwQTcwLVx1MEE3MVx1MEE4MS1cdTBBODNcdTBBQkNcdTBBQkUtXHUwQUM1XHUwQUM3LVx1MEFDOVx1MEFDQi1cdTBBQ0RcdTBCMDEtXHUwQjAzXHUwQjNDXHUwQjNFLVx1MEI0M1x1MEI0Ny1cdTBCNDhcdTBCNEItXHUwQjREXHUwQjU2LVx1MEI1N1x1MEI4Mi1cdTBCODNcdTBCQkUtXHUwQkMyXHUwQkM2LVx1MEJDOFx1MEJDQS1cdTBCQ0RcdTBCRDdcdTBDMDEtXHUwQzAzXHUwQzNFLVx1MEM0NFx1MEM0Ni1cdTBDNDhcdTBDNEEtXHUwQzREXHUwQzU1LVx1MEM1Nlx1MEM4Mi1cdTBDODNcdTBDQkUtXHUwQ0M0XHUwQ0M2LVx1MENDOFx1MENDQS1cdTBDQ0RcdTBDRDUtXHUwQ0Q2XHUwRDAyLVx1MEQwM1x1MEQzRS1cdTBENDNcdTBENDYtXHUwRDQ4XHUwRDRBLVx1MEQ0RFx1MEQ1N1x1MEUzMVx1MEUzNC1cdTBFM0FcdTBFNDctXHUwRTRFXHUwRUIxXHUwRUI0LVx1MEVCOVx1MEVCQi1cdTBFQkNcdTBFQzgtXHUwRUNEXHUwRjE4LVx1MEYxOVx1MEYzNVx1MEYzN1x1MEYzOVx1MEYzRVx1MEYzRlx1MEY3MS1cdTBGODRcdTBGODYtXHUwRjhCXHUwRjkwLVx1MEY5NVx1MEY5N1x1MEY5OS1cdTBGQURcdTBGQjEtXHUwRkI3XHUwRkI5XHUyMEQwLVx1MjBEQ1x1MjBFMVx1MzAyQS1cdTMwMkZcdTMwOTlcdTMwOUFdCi0KLURpZ2l0ID0gIFtcdTAwMzAtXHUwMDM5XHUwNjYwLVx1MDY2OVx1MDZGMC1cdTA2RjlcdTA5NjYtXHUwOTZGXHUwOUU2LVx1MDlFRlx1MEE2Ni1cdTBBNkZcdTBBRTYtXHUwQUVGXHUwQjY2LVx1MEI2Rlx1MEJFNy1cdTBCRUZcdTBDNjYtXHUwQzZGXHUwQ0U2LVx1MENFRlx1MEQ2Ni1cdTBENkZcdTBFNTAtXHUwRTU5XHUwRUQwLVx1MEVEOVx1MEYyMC1cdTBGMjldCi0KLUV4dGVuZGVyID0gW1x1MDBCN1x1MDJEMFx1MDJEMVx1MDM4N1x1MDY0MFx1MEU0Nlx1MEVDNlx1MzAwNVx1MzAzMS1cdTMwMzVcdTMwOUQtXHUzMDlFXHUzMEZDLVx1MzBGRV0KLQotTGV0dGVyID0gKHtCYXNlQ2hhcn0gfCB7SWRlb2dyYXBoaWN9KQotCi1OYW1lQ2hhciA9ICh7TGV0dGVyfSB8IHtEaWdpdH0gfCAiLiIgfCAiLSIgfCAiXyIgfCAiOiIgfCB7Q29tYmluaW5nQ2hhcn0gfCB7RXh0ZW5kZXJ9KQotCi1OYW1lID0gKHtMZXR0ZXJ9IHwgIl8iIHwgIjoiICkgKHtOYW1lQ2hhcn0pKgotCi0KLQotJXsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQ7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBYTUwxME5hbWVzKCkgewotICAgICAgICAgICAgICAgIHRoaXMuenpSZWFkZXIgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZFhNTDEwTmFtZShTdHJpbmcgc3RyaW5nVG9DaGVjaykgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgeXlyZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoc3RyaW5nVG9DaGVjaykpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBpc1ZhbGlkWE1MMTBOYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBpbXBvc3NpYmxlIHdpdGggc3RyaW5ncywgYnV0IGlmIG9jY3VycywganVzdCBtZWFucwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gIm5vdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSV9Ci0KLQotCi0KLSUlCi0KLTxZWUlOSVRJQUw+Ci17Ci0KLSAgICAgICAgLy8gbmFtZSBtdXN0IGJlIHdob2xlIGxpbmUgKGlucHV0KSwgbm90IHBhcnRpYWwKLSAgICAgICAgLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTQ0MTYKLSAgICAgICAge05hbWV9ICAgICAgICAgICAge3JldHVybiB0cnVlOyAvKiBleGFjdCBuYW1lICovfQotICAgICAgICB7TmFtZX0uKyAgICAgICAgICB7cmV0dXJuIGZhbHNlOyAvKiBtb3JlIHRoYW4gbmFtZSAqL30KLQotICAgICAgICAvLyBtYXRjaCBhbnl0aGluZyAoZWxzZSkgc2hvdWxkIG5vcm1hbGx5IGNvbWUgbGFzdAotICAgICAgICAuICAgICAgICAgICAgICAgICB7cmV0dXJuIGZhbHNlOyAvKiBtYXRjaGVkIHdpbGQgKi99Ci0KLX0KLQotCi0vLyB0aGlzIHJ1bGUgYWx3YXlzIGluIGVmZmVjdAotPDxFT0Y+PgotewotICAgICAgICB7cmV0dXJuIGZhbHNlOyAvKiBoaXQgZW5kIHdpdGggbm8gbWF0Y2ggKi99Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5MTIxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NSArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjQgb24gMi8yNS8wOCAxMDoyNSBBTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDggSUJNIENvcnBvcmF0aW9uLCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAga2IuaHVhbmcgIC0gQnVnIDIxNDQxNiAgRG90IGNoYXIgaXMgbm90IGVzY2FwZWQgaW4gWE1MMTBOYW1lcy5qRmxleAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5qZmxleC5kZS8iPkpGbGV4PC9hPiAxLjQKLSAqIG9uIDIvMjUvMDggMTA6MjUgQU0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+WE1MMTBOYW1lcy5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUwxME5hbWVzIHsKLQotICAvKiogVGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGluaXRpYWwgc2l6ZSBvZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfQlVGRkVSU0laRSA9IDIwNDg7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBZWUlOSVRJQUwgPSAwOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQ01BUF9QQUNLRUQgPSAKLSAgICAiXDEyXDBcMVwzXDQyXDBcMVwyXDFcMlwxXDBcMTJcMlwxXDFcNlwwXDMyXDEiKwotICAgICJcNFwwXDFcMVwxXDBcMzJcMVw3NFwwXDFcMlwxMFwwXDI3XDFcMVwwXDM3XDEiKwotICAgICJcMVwwXDcyXDFcMlwwXDEzXDFcMlwwXDEwXDFcMVwwXDY1XDFcMVwwXDEwNFwxIisKLSAgICAiXDExXDBcNDRcMVwzXDBcMlwxXDRcMFwzNlwxXDcwXDBcMTMxXDFcMjJcMFw3XDEiKwotICAgICJcMTZcMFwyXDJcNTZcMFwxMDZcMlwzMlwwXDJcMlw0NFwwXDFcMVwxXDJcM1wxIisKLSAgICAiXDFcMFwxXDFcMVwwXDI0XDFcMVwwXDU0XDFcMVwwXDdcMVwzXDBcMVwxIisKLSAgICAiXDFcMFwxXDFcMVwwXDFcMVwxXDBcMVwxXDFcMFwyMlwxXDE1XDBcMTRcMSIrCi0gICAgIlwxXDBcMTAyXDFcMVwwXDE0XDFcMVwwXDQ0XDFcMVwwXDRcMlwxMVwwXDY1XDEiKwotICAgICJcMlwwXDJcMVwyXDBcMlwxXDNcMFwzNFwxXDJcMFwxMFwxXDJcMFwyXDEiKwotICAgICJcNjdcMFw0NlwxXDJcMFwxXDFcN1wwXDQ2XDFcMTJcMFwyMVwyXDFcMFwyN1wyIisKLSAgICAiXDFcMFwzXDJcMVwwXDFcMlwxXDBcMlwyXDFcMFwxXDJcMTNcMFwzM1wxIisKLSAgICAiXDVcMFwzXDFcNTZcMFwzMlwxXDVcMFwxXDJcMTJcMVwxMFwyXDE1XDBcMTJcMiIrCi0gICAgIlw2XDBcMVwyXDEwN1wxXDJcMFw1XDFcMVwwXDE3XDFcMVwwXDRcMVwxXDAiKwotICAgICJcMVwxXDE3XDJcMlwxXDJcMlwxXDBcNFwyXDJcMFwxMlwyXHUwMjA3XDBcM1wyIisKLSAgICAiXDFcMFw2NVwxXDJcMFwxXDJcMVwxXDIwXDJcM1wwXDRcMlwzXDBcMTJcMSIrCi0gICAgIlwyXDJcMlwwXDEyXDJcMjFcMFwzXDJcMVwwXDEwXDFcMlwwXDJcMVwyXDAiKwotICAgICJcMjZcMVwxXDBcN1wxXDFcMFwxXDFcM1wwXDRcMVwyXDBcMVwyXDFcMCIrCi0gICAgIlw3XDJcMlwwXDJcMlwyXDBcM1wyXDExXDBcMVwyXDRcMFwyXDFcMVwwIisKLSAgICAiXDNcMVwyXDJcMlwwXDEyXDJcMlwxXDIwXDBcMVwyXDJcMFw2XDFcNFwwIisKLSAgICAiXDJcMVwyXDBcMjZcMVwxXDBcN1wxXDFcMFwyXDFcMVwwXDJcMVwxXDAiKwotICAgICJcMlwxXDJcMFwxXDJcMVwwXDVcMlw0XDBcMlwyXDJcMFwzXDJcMTNcMCIrCi0gICAgIlw0XDFcMVwwXDFcMVw3XDBcMTJcMlwyXDJcM1wxXDE0XDBcM1wyXDFcMCIrCi0gICAgIlw3XDFcMVwwXDFcMVwxXDBcM1wxXDFcMFwyNlwxXDFcMFw3XDFcMVwwIisKLSAgICAiXDJcMVwxXDBcNVwxXDJcMFwxXDJcMVwxXDEwXDJcMVwwXDNcMlwxXDAiKwotICAgICJcM1wyXDIyXDBcMVwxXDVcMFwxMlwyXDIxXDBcM1wyXDFcMFwxMFwxXDJcMCIrCi0gICAgIlwyXDFcMlwwXDI2XDFcMVwwXDdcMVwxXDBcMlwxXDJcMFw0XDFcMlwwIisKLSAgICAiXDFcMlwxXDFcNlwyXDNcMFwyXDJcMlwwXDNcMlwxMFwwXDJcMlw0XDAiKwotICAgICJcMlwxXDFcMFwzXDFcNFwwXDEyXDJcMjJcMFwyXDJcMVwwXDZcMVwzXDAiKwotICAgICJcM1wxXDFcMFw0XDFcM1wwXDJcMVwxXDBcMVwxXDFcMFwyXDFcM1wwIisKLSAgICAiXDJcMVwzXDBcM1wxXDNcMFwxMFwxXDFcMFwzXDFcNFwwXDVcMlwzXDAiKwotICAgICJcM1wyXDFcMFw0XDJcMTFcMFwxXDJcMTdcMFwxMVwyXDIxXDBcM1wyXDFcMCIrCi0gICAgIlwxMFwxXDFcMFwzXDFcMVwwXDI3XDFcMVwwXDEyXDFcMVwwXDVcMVw0XDAiKwotICAgICJcN1wyXDFcMFwzXDJcMVwwXDRcMlw3XDBcMlwyXDExXDBcMlwxXDRcMCIrCi0gICAgIlwxMlwyXDIyXDBcMlwyXDFcMFwxMFwxXDFcMFwzXDFcMVwwXDI3XDFcMVwwIisKLSAgICAiXDEyXDFcMVwwXDVcMVw0XDBcN1wyXDFcMFwzXDJcMVwwXDRcMlw3XDAiKwotICAgICJcMlwyXDdcMFwxXDFcMVwwXDJcMVw0XDBcMTJcMlwyMlwwXDJcMlwxXDAiKwotICAgICJcMTBcMVwxXDBcM1wxXDFcMFwyN1wxXDFcMFwyMFwxXDRcMFw2XDJcMlwwIisKLSAgICAiXDNcMlwxXDBcNFwyXDExXDBcMVwyXDEwXDBcMlwxXDRcMFwxMlwyXDIyMVwwIisKLSAgICAiXDU2XDFcMVwwXDFcMVwxXDJcMlwxXDdcMlw1XDBcNlwxXDFcMlwxMFwyIisKLSAgICAiXDFcMFwxMlwyXDQ3XDBcMlwxXDFcMFwxXDFcMlwwXDJcMVwxXDBcMVwxIisKLSAgICAiXDJcMFwxXDFcNlwwXDRcMVwxXDBcN1wxXDFcMFwzXDFcMVwwXDFcMSIrCi0gICAgIlwxXDBcMVwxXDJcMFwyXDFcMVwwXDJcMVwxXDBcMVwxXDFcMlwyXDEiKwotICAgICJcNlwyXDFcMFwyXDJcMVwxXDJcMFw1XDFcMVwwXDFcMlwxXDBcNlwyIisKLSAgICAiXDJcMFwxMlwyXDc2XDBcMlwyXDZcMFwxMlwyXDEzXDBcMVwyXDFcMFwxXDIiKwotICAgICJcMVwwXDFcMlw0XDBcMlwyXDEwXDFcMVwwXDQxXDFcN1wwXDI0XDJcMVwwIisKLSAgICAiXDZcMlw0XDBcNlwyXDFcMFwxXDJcMVwwXDI1XDJcM1wwXDdcMlwxXDAiKwotICAgICJcMVwyXDM0NlwwXDQ2XDFcMTJcMFw0N1wxXDExXDBcMVwxXDFcMFwyXDFcMVwwIisKLSAgICAiXDNcMVwxXDBcMVwxXDFcMFwyXDFcMVwwXDVcMVw1MVwwXDFcMVwxXDAiKwotICAgICJcMVwxXDFcMFwxXDFcMTNcMFwxXDFcMVwwXDFcMVwxXDBcMVwxXDNcMCIrCi0gICAgIlwyXDFcM1wwXDFcMVw1XDBcM1wxXDFcMFwxXDFcMVwwXDFcMVwxXDAiKwotICAgICJcMVwxXDFcMFwxXDFcM1wwXDJcMVwzXDBcMlwxXDFcMFwxXDFcNTBcMCIrCi0gICAgIlwxXDFcMTFcMFwxXDFcMlwwXDFcMVwyXDBcMlwxXDdcMFwyXDFcMVwwIisKLSAgICAiXDFcMVwxXDBcN1wxXDUwXDBcMVwxXDRcMFwxXDFcMTBcMFwxXDFcdTBjMDZcMCIrCi0gICAgIlwyMzRcMVw0XDBcMTMyXDFcNlwwXDI2XDFcMlwwXDZcMVwyXDBcNDZcMVwyXDAiKwotICAgICJcNlwxXDJcMFwxMFwxXDFcMFwxXDFcMVwwXDFcMVwxXDBcMVwxXDFcMCIrCi0gICAgIlwzN1wxXDJcMFw2NVwxXDFcMFw3XDFcMVwwXDFcMVwzXDBcM1wxXDFcMCIrCi0gICAgIlw3XDFcM1wwXDRcMVwyXDBcNlwxXDRcMFwxNVwxXDVcMFwzXDFcMVwwIisKLSAgICAiXDdcMVwzMjNcMFwxNVwyXDRcMFwxXDJcMTA0XDBcMVwxXDNcMFwyXDFcMlwwIisKLSAgICAiXDFcMVwxMjFcMFwzXDFcdTBlODJcMFwxXDJcMVwwXDFcMVwzMVwwXDExXDFcNlwyIisKLSAgICAiXDFcMFw1XDJcMTNcMFwxMjRcMVw0XDBcMlwyXDJcMFwyXDJcMlwwXDEzMlwxIisKLSAgICAiXDFcMFwzXDJcNlwwXDUwXDFcdTFjZDNcMFx1NTFhNlwxXHUwYzVhXDBcdTJiYTRcMVx1Mjg1Y1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBbXSBaWl9DTUFQID0genpVbnBhY2tDTWFwKFpaX0NNQVBfUEFDS0VEKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgREZBIHN0YXRlcyB0byBhY3Rpb24gc3dpdGNoIGxhYmVscy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BQ1RJT04gPSB6elVucGFja0FjdGlvbigpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BQ1RJT05fUEFDS0VEXzAgPQotICAgICJcMVwwXDFcMVwxXDJcMVwzIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBY3Rpb24oKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNF07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBY3Rpb24oWlpfQUNUSU9OX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0FjdGlvbihTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX1JPV01BUCA9IHp6VW5wYWNrUm93TWFwKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX1JPV01BUF9QQUNLRURfMCA9Ci0gICAgIlwwXDBcMFw0XDBcMTBcMFwxNCI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrUm93TWFwKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzRdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrUm93TWFwKFpaX1JPV01BUF9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tSb3dNYXAoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGhpZ2ggPSBwYWNrZWQuY2hhckF0KGkrKykgPDwgMTY7Ci0gICAgICByZXN1bHRbaisrXSA9IGhpZ2ggfCBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfVFJBTlMgW10gPSB7Ci0gICAgMSwgMiwgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAzLCAyLCAKLSAgICAyLCAtMSwgMywgMywgMywgLTEKLSAgfTsKLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9OT19NQVRDSCA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9QVVNIQkFDS18yQklHID0gMjsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqCi0gICAqIFpaX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BVFRSSUJVVEUgPSB6elVucGFja0F0dHJpYnV0ZSgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BVFRSSUJVVEVfUEFDS0VEXzAgPQotICAgICJcMVwwXDFcMTFcMlwxIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBdHRyaWJ1dGUoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNF07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBdHRyaWJ1dGUoWlpfQVRUUklCVVRFX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0F0dHJpYnV0ZShTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB6elJlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB6elN0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHp6QnVmZmVyW10gPSBuZXcgY2hhcltaWl9CVUZGRVJTSVpFXTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpNYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHp6UHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6ekN1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6elN0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHp6RW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOwotCi0gIC8qKiAKLSAgICogenpBdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0Qk9MID0gdHJ1ZTsKLQotICAvKiogenpBdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0RU9GOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLSAgICAgICAgYm9vbGVhbiByZXN1bHQ7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBYTUwxME5hbWVzKCkgewotICAgICAgICAgICAgICAgIHRoaXMuenpSZWFkZXIgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZFhNTDEwTmFtZShTdHJpbmcgc3RyaW5nVG9DaGVjaykgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgeXlyZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoc3RyaW5nVG9DaGVjaykpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBpc1ZhbGlkWE1MMTBOYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBpbXBvc3NpYmxlIHdpdGggc3RyaW5ncywgYnV0IGlmIG9jY3VycywganVzdCBtZWFucwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gIm5vdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUwxME5hbWVzKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy56elJlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MMTBOYW1lcyhqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHp6VW5wYWNrQ01hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMjE4KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZWZpbGxzIHRoZSBpbnB1dCBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGlmZiB0aGVyZSB3YXMgbmV3IGlucHV0LgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpSZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh6elN0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIHp6U3RhcnRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpFbmRSZWFkLXp6U3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHp6RW5kUmVhZC09IHp6U3RhcnRSZWFkOwotICAgICAgenpDdXJyZW50UG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ek1hcmtlZFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpQdXNoYmFja1Bvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpTdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoenpDdXJyZW50UG9zID49IHp6QnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbenpDdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB6ekJ1ZmZlci5sZW5ndGgpOwotICAgICAgenpCdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB6elJlYWRlci5yZWFkKHp6QnVmZmVyLCB6ekVuZFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLmxlbmd0aC16ekVuZFJlYWQpOwotCi0gICAgaWYgKG51bVJlYWQgPCAwKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB6ekVuZFJlYWQrPSBudW1SZWFkOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHp6QXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotCi0gICAgaWYgKHp6UmVhZGVyICE9IG51bGwpCi0gICAgICB6elJlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqIERvZXMgbm90IGNsb3NlIHRoZSBvbGQgcmVhZGVyLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PlpaX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0gICAgenpSZWFkZXIgPSByZWFkZXI7Ci0gICAgenpBdEJPTCAgPSB0cnVlOwotICAgIHp6QXRFT0YgID0gZmFsc2U7Ci0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQgPSAwOwotICAgIHp6Q3VycmVudFBvcyA9IHp6TWFya2VkUG9zID0genpQdXNoYmFja1BvcyA9IDA7Ci0gICAgeXlsaW5lID0geXljaGFyID0geXljb2x1bW4gPSAwOwotICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4genpMZXhpY2FsU3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB6ekxleGljYWxTdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggenpCdWZmZXIsIHp6U3RhcnRSZWFkLCB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZCApOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDx0dD5wb3M8L3R0PiBmcm9tIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0LiAKLSAgICogCi0gICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLSAgICoKLSAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gCi0gICAqICAgICAgICAgICAgQSB2YWx1ZSBmcm9tIDAgdG8geXlsZW5ndGgoKS0xLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0gICAqLwotICBwcml2YXRlIGZpbmFsIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotICAgIHJldHVybiB6ekJ1ZmZlclt6elN0YXJ0UmVhZCtwb3NdOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEluIGEgd2VsbGZvcm1lZCBzY2FubmVyIChubyBvciBvbmx5IGNvcnJlY3QgdXNhZ2Ugb2YgCi0gICAqIHl5cHVzaGJhY2soaW50KSBhbmQgYSBtYXRjaC1hbGwgZmFsbGJhY2sgcnVsZSkgdGhpcyBtZXRob2QgCi0gICAqIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCB0aGluZ3MgdGhhdCAiQ2FuJ3QgUG9zc2libHkgSGFwcGVuIi4KLSAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nCi0gICAqIChlLmcuIGEgSkZsZXggYnVnIHByb2R1Y2luZyBhIGZhdWx0eSBzY2FubmVyIGV0Yy4pLgotICAgKgotICAgKiBVc3VhbCBzeW50YXgvc2Nhbm5lciBsZXZlbCBlcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZG9uZQotICAgKiBpbiBlcnJvciBmYWxsYmFjayBydWxlcy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB6elNjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgdHJ5IHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbZXJyb3JDb2RlXTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW1paX1VOS05PV05fRVJST1JdOwotICAgIH0KLQotICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSAgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB6elNjYW5FcnJvcihaWl9QVVNIQkFDS18yQklHKTsKLQotICAgIHp6TWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRYTUwxME5hbWUoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHp6SW5wdXQ7Ci0gICAgaW50IHp6QWN0aW9uOwotCi0gICAgLy8gY2FjaGVkIGZpZWxkczoKLSAgICBpbnQgenpDdXJyZW50UG9zTDsKLSAgICBpbnQgenpNYXJrZWRQb3NMOwotICAgIGludCB6ekVuZFJlYWRMID0genpFbmRSZWFkOwotICAgIGNoYXIgW10genpCdWZmZXJMID0genpCdWZmZXI7Ci0gICAgY2hhciBbXSB6ekNNYXBMID0gWlpfQ01BUDsKLQotICAgIGludCBbXSB6elRyYW5zTCA9IFpaX1RSQU5TOwotICAgIGludCBbXSB6elJvd01hcEwgPSBaWl9ST1dNQVA7Ci0gICAgaW50IFtdIHp6QXR0ckwgPSBaWl9BVFRSSUJVVEU7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgenpNYXJrZWRQb3NMID0genpNYXJrZWRQb3M7Ci0KLSAgICAgIHp6QWN0aW9uID0gLTE7Ci0KLSAgICAgIHp6Q3VycmVudFBvc0wgPSB6ekN1cnJlbnRQb3MgPSB6elN0YXJ0UmVhZCA9IHp6TWFya2VkUG9zTDsKLSAgCi0gICAgICB6elN0YXRlID0genpMZXhpY2FsU3RhdGU7Ci0KLQotICAgICAgenpGb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICBpZiAoenpDdXJyZW50UG9zTCA8IHp6RW5kUmVhZEwpCi0gICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgZWxzZSBpZiAoenpBdEVPRikgewotICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb25zCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3MgID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zICAgPSB6ek1hcmtlZFBvc0w7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdHJhbnNsYXRlZCBwb3NpdGlvbnMgYW5kIHBvc3NpYmx5IG5ldyBidWZmZXIKLSAgICAgICAgICAgIHp6Q3VycmVudFBvc0wgID0genpDdXJyZW50UG9zOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMICAgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6QnVmZmVyTCAgICAgID0genpCdWZmZXI7Ci0gICAgICAgICAgICB6ekVuZFJlYWRMICAgICA9IHp6RW5kUmVhZDsKLSAgICAgICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGludCB6ek5leHQgPSB6elRyYW5zTFsgenpSb3dNYXBMW3p6U3RhdGVdICsgenpDTWFwTFt6eklucHV0XSBdOwotICAgICAgICAgIGlmICh6ek5leHQgPT0gLTEpIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIHp6U3RhdGUgPSB6ek5leHQ7Ci0KLSAgICAgICAgICBpbnQgenpBdHRyaWJ1dGVzID0genpBdHRyTFt6elN0YXRlXTsKLSAgICAgICAgICBpZiAoICh6ekF0dHJpYnV0ZXMgJiAxKSA9PSAxICkgewotICAgICAgICAgICAgenpBY3Rpb24gPSB6elN0YXRlOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDgpID09IDggKSBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgenpNYXJrZWRQb3MgPSB6ek1hcmtlZFBvc0w7Ci0KLSAgICAgIHN3aXRjaCAoenpBY3Rpb24gPCAwID8genpBY3Rpb24gOiBaWl9BQ1RJT05benpBY3Rpb25dKSB7Ci0gICAgICAgIGNhc2UgMTogCi0gICAgICAgICAgeyByZXR1cm4gZmFsc2U7IC8qIG1hdGNoZWQgd2lsZCAqLwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0OiBicmVhazsKLSAgICAgICAgY2FzZSAyOiAKLSAgICAgICAgICB7IHJldHVybiB0cnVlOyAvKiBleGFjdCBuYW1lICovCi0gICAgICAgICAgfQotICAgICAgICBjYXNlIDU6IGJyZWFrOwotICAgICAgICBjYXNlIDM6IAotICAgICAgICAgIHsgcmV0dXJuIGZhbHNlOyAvKiBtb3JlIHRoYW4gbmFtZSAqLwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHp6SW5wdXQgPT0gWVlFT0YgJiYgenpTdGFydFJlYWQgPT0genpDdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB6ekF0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgICAgeyB7cmV0dXJuIGZhbHNlOyAvKiBoaXQgZW5kIHdpdGggbm8gbWF0Y2ggKi99IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXNHZW5KYXZhSkZsZXgxNC5jbWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXNHZW5KYXZhSkZsZXgxNC5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjODE2ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzR2VuSmF2YUpGbGV4MTQuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotQGVjaG8gb24NCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbmVlZCB0byBiZSBzZXQvc3BlY2lmaWVkIGZvciBlYWNoICJkZXZlbG9wbWVudCBtYWNoaW5lIg0KLXNldCBQQVRIPSVQQVRIJTtEOlxKREtzXGlibS1qYXZhMi1zZGstNTAtd2luLWkzODZcYmluDQotc2V0IFdPUktTUEFDRV9MT0NBVElPTj1EOlxidWlsZHNcV29ya3NwYWNlc1xuZXdXVFBwdXJlaGVhZA0KLXNldCBKRkxFWF9MSUJfTE9DQVRJT049RDpcRGV2VGltZVN1cHBvcnRcSkZsZXgtMS40XGxpYg0KLQ0KLXJlbSBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBkaWZmZXIgZnJvbSBwcm9qZWN0IHRvIHByb2plY3QsIGJ1dCBzaG91bGQgYmUgb3RoZXJ3aXNlIGNvbnN0YW50DQotc2V0IE1BSU5fTkFNRT1YTUwxME5hbWVzDQotDQotc2V0IFBST0pFQ1RfU1JDPVxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmVcc3JjXA0KLXNldCBQQUNLQUdFX0RJUj1vcmdcZWNsaXBzZVx3c3RceG1sXGNvcmVcaW50ZXJuYWxccGFyc2VyXA0KLQ0KLQ0KLXJlbSBHaXZlbiB0aGUgYWJvdmUgImZyYW1ld29yayIgYW5kIHRoZSBjb21tYW5kIHRoZW1zZWx2ZXMsIHRoZXNlIHZhcmlhYmxlcyBzaG91bGQgbmV2ZXIgbmVlZCB0byBiZSBtb2RpZmllZA0KLXNldCBKQVZBX0ZJTEU9JU1BSU5fTkFNRSUuamF2YQ0KLXNldCBKRkxFWF9SVUxFUz0lTUFJTl9OQU1FJS5qZmxleA0KLXNldCBTS0VMRVRPTl9GSUxFPSVNQUlOX05BTUUlLnNrZWxldG9uDQotDQotSUYgRVhJU1QgJUpBVkFfRklMRSUgZGVsICVKQVZBX0ZJTEUlDQotcmVtIGphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcSmZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlIC1za2VsICVTS0VMRVRPTl9GSUxFJSAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcSmZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlICAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLUlGIEVYSVNUICVKQVZBX0ZJTEUlIGNvcHkgJUpBVkFfRklMRSUgJVdPUktTUEFDRV9MT0NBVElPTiUlUFJPSkVDVF9TUkMlJVBBQ0tBR0VfRElSJSVKQVZBX0ZJTEUlDQotDQotcGF1c2UNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL2pmbGV4ZXJyLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvamZsZXhlcnIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvamZsZXhlcnIudHh0CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvamZsZXhvdXQudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9qZmxleG91dC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzZmMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9qZmxleG91dC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVJlYWRpbmcgIlhNTDEwTmFtZXMuamZsZXgiCi1Db25zdHJ1Y3RpbmcgTkZBIDogODQgc3RhdGVzIGluIE5GQQotQ29udmVydGluZyBORkEgdG8gREZBIDogCi0uLi4uLi4uLi4uLi4KLTE0IHN0YXRlcyBiZWZvcmUgbWluaW1pemF0aW9uLCA0IHN0YXRlcyBpbiBtaW5pbWl6ZWQgREZBCi1Xcml0aW5nIGNvZGUgdG8gIlhNTDEwTmFtZXMuamF2YSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qRmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmZTg5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXIuakZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy54bWw7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkhlYWRQYXJzZXJUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5JbnRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy54bWwuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLQotJSUKLQotJXsKLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0KLQotCXB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotICAgICAgICAgICAgICAgIC8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgICAgICAgICAgICAgICB6elJlYWRlciA9IGluOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAgICAgICAgICAgICAgIHp6U3RhdGUgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gICAgICAgICAgICAgICAgLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgICAgICAgICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoenpCdWZmZXIsIChjaGFyKTApOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICB6ek1hcmtlZFBvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAgICAgICAgICAgICAgIHp6UHVzaGJhY2tQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgenpDdXJyZW50UG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHp6U3RhcnRSZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgICAgICAgICAgICAqIGZyb20gaW5wdXQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB6ekVuZFJlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gICAgICAgICAgICAgICAgeXlsaW5lID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAgICAgICAgICAgICAgIHl5Y2hhciA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAgICAgICAgICAgICAgICAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB5eWNvbHVtbiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZwotICAgICAgICAgICAgICAgICAqIG9mIGEgbGluZQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6QXRCT0wgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAgICAgICAgICAgICAgIHp6QXRFT0YgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIC8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAgICAgICAgICAgICAgIHp6RU9GRG9uZSA9IGZhbHNlOwotCi0KLSAgICAgICAgICAgICAgICBmU3RhdGVTdGFjay5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0gIAl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLQl9CQotCi0lfQotCi0lZW9mewotCWhhc01vcmU9ZmFsc2U7Ci0lZW9mfQotCi0lcHVibGljCi0lY2xhc3MgWE1MSGVhZFRva2VuaXplcgotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4KLSV0eXBlIFN0cmluZwotJWNoYXIKLSV1bmljb2RlCi0laWdub3JlY2FzZSAKLS8vJWRlYnVnCi0lc3dpdGNoCi0lYnVmZmVyIDgxOTIKLQotVVRGMTZCRSA9IFx4RkVceEZGCi1VVEYxNkxFID0gXHhGRlx4RkUKLVVURjgzQnl0ZUJPTSA9IFx4RUZceEJCXHhCRgotCi1TcGFjZUNoYXIgPSBbXHgyMFx4MDldCi0KLS8vIFszXSBTIDo6PSAoMHgyMCB8IDB4OSB8IDB4RCB8IDB4QSkrCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdCi0KLUJlZ2luQXR0cmliZVZhbHVlID0ge1N9KiBcPSB7U30qCi0KLUxpbmVUZXJtaW5hdG9yID0gXHJ8XG4KLQotCi0lc3RhdGUgU1RfWE1MRGVjbAotJXN0YXRlIFF1b3RlZEF0dHJpYnV0ZVZhbHVlCi0lc3RhdGUgRFFfU1RSSU5HCi0lc3RhdGUgU1FfU1RSSU5HCi0lc3RhdGUgVW5EZWxpbWl0ZWRTdHJpbmcKLQotJSUKLQotCi08WVlJTklUSUFMPiAgCi17Ci0JLy8gZm9yY2UgdG8gc3RhcnQgYXQgYmVnaW5uaW5nIG9mIGxpbmUgKF4pIGFuZCBhdCBiZWdpbm5pbmcgb2YgZmlsZSAoeXljaGFyID09IDApCi0JXntVVEYxNkJFfSAgIAkJe2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFO319Ci0JXntVVEYxNkxFfSAgIAkJe2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO319Ci0JXntVVEY4M0J5dGVCT019ICAgCXtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO319Ci0JCi0JLy8gZm9yY2UgdG8gYmUgc3RhcnRlZCBvbiBmaXJzdCBsaW5lLCBidXQgd2UgZG8gYWxsb3cgcHJlY2VlZGluZyBzcGFjZXMKLQleIHtTfSogIjxcP3htbCIge1N9KyB7aWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9fQotCQotfQkKLQkKLTxTVF9YTUxEZWNsPiAKLXsKLQkidmVyc2lvbiIge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFZlcnNpb247fQotCSJlbmNvZGluZyIge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7fQotCS8vIG5vdGUgdGhlICJmb3JjZWQgZW5kIiAodmlhICdoYXNNb3JlPWZhbHNlJykgb25jZSB0aGUgZW5kIG9mIFhNTCBEZWNsYXJhdGlvbiBmb3VuZAotCS8vIFRoaXMgaXMgc2luY2Ugbm9uLWFzY2lpIGNoYXJzIG1heSBmb2xsb3cgYW5kIG1heSBjYXVzZSBJT0V4Y2VwdGlvbnMgd2hpY2ggd291bGQgbm90IG9jY3VyIG9uY2Ugc3RyZWFtIGlzIAotCS8vIHJlYWQgd2l0aCBpbmNvcnJlY3QgZW5jb2RpbmcgKHN1Y2ggYXMgaWYgcGxhdGZvcm0gZW5jb2RpbmcgaXMgaW4gZWZmZWN0IHVudGlsIHRydWUgZW5jb2RpbmcgZGV0ZWN0ZWQpLiAKLQkiXD8+IiAgICB7eXliZWdpbihZWUlOSVRJQUwpOyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7fQotfQkKLQotCQotCi08UXVvdGVkQXR0cmlidXRlVmFsdWU+Ci17Ci0JXCIgICAgICAgICAgICAgICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLQlcJwkJCXsgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0JLy8gaW4gdGhpcyBzdGF0ZSwgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNwYWNlIGNoYXJhY3RlciBjYW4gc3RhcnQgYW4gdW5kZWxpbWl0ZWQgc3RyaW5nCi0Je1N9Ki4gICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7fQotCi19CQotCi0KLTxEUV9TVFJJTkc+Ci17Ci0KLQlcIiAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0KLSAgCXtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcPz4iCQkJeyB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSc8JwkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotCi19Ci0KLTxTUV9TVFJJTkc+Ci17Ci0KLQlcJyAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7fQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIiU+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSc8JwkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotCi19Ci0KLTxVbkRlbGltaXRlZFN0cmluZz4KLXsKLQotCXtTfSAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLSAgCXtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcPz4iCQkJeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JJzwnCQotCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQotCVwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0JCi0JXCIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30KLQkKLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0KLX0KLQotLy8gVGhlICJtYXRjaCBhbnl0aGluZyIgcnVsZSBzaG91bGQgYWx3YXlzIGJlIGluIGVmZmVjdCBleGNlcHQgZm9yIHdoZW4gbG9va2luZyBmb3IgZW5kIG9mIHN0cmluZwotLy8gKFRoYXQgaXMsIHJlbWVtYmVyIHRvIHVwZGF0ZSBzdGF0ZSBsaXN0IGlmL3doZW4gbmV3IHN0YXRlcyBhZGRlZCkKLTxZWUlOSVRJQUwsIFNUX1hNTERlY2wsIFF1b3RlZEF0dHJpYnV0ZVZhbHVlPgotewotLy8gdGhpcyBpcyB0aGUgZmFsbGJhY2sgKG1hdGNoICJhbnl0aGluZyIpIHJ1bGUgIChmb3IgdGhpcyBzY2FubmVyLCBpbnB1dCBpcyBpZ25vcmVkLCBhbmQgcG9zaXRpb24gYWR2YW5jZWQsIGlmIG5vdCByZWNvZ25pemVkKQotLnxcbiAgICAgICAgICAgICAge2lmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9fQotfQotCi0vLyB0aGlzIHJ1bGUgYWx3YXlzIGluIGVmZmVjdAotPDxFT0Y+PiAgICAgICAgIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7fQotCi0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM1MzA2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDQvNi8wNCAxMToxMyBQTSAqLwotCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSGVhZFBhcnNlclRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkludFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbC5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDQvNi8wNCAxMToxMyBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgWE1MSGVhZFRva2VuaXplciB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFVuRGVsaW1pdGVkU3RyaW5nID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IERRX1NUUklORyA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNRX1NUUklORyA9IDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSA9IDQ7Ci0KLSAgLyoqCi0gICAqIFlZX0xFWFNUQVRFW2xdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqIFlZX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKiBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFlZX0xFWFNUQVRFW10gPSB7IAotICAgICAwLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgNgotICB9OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTFcMFwxXDZcMVw3XDJcMFwxXDExXDIyXDBcMVw2XDFcMFwxXDI3XDJcMCIrCi0gICAgIlwxXDMxXDFcMFwxXDMwXDI0XDBcMVwxMlwxXDEwXDFcMjZcMVwxM1wzXDBcMVwyMSIrCi0gICAgIlwxXDIzXDFcMTdcMVwwXDFcMjVcMVwwXDFcMjRcMlwwXDFcMTZcMVwxNVwxXDIwIisKLSAgICAiXDFcMjJcMTBcMFwxXDE0XDEyXDBcMVwyMVwxXDIzXDFcMTdcMVwwXDFcMjVcMVwwIisKLSAgICAiXDFcMjRcMlwwXDFcMTZcMVwxNVwxXDIwXDFcMjJcMTBcMFwxXDE0XDEwMlwwXDFcNCIrCi0gICAgIlwzXDBcMVw1XDE3XDBcMVwzXDE2XDBcMVwxXDIwXDBcMVwzXDE2XDBcMVwxIisKLSAgICAiXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQlwdWJsaWMgWE1MSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLQkgIAkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JICAJeXlfcmVhZGVyID0gaW47Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIAkJeXlfc3RhdGUgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAJCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gIAkJIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAJCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9jdXJyZW50UG9zID0gMDsKLQotICAJCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLSAgCQkvKiogCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gIAkJICogZnJvbSBpbnB1dCAKLSAgCQkgKi8KLSAgCQl5eV9lbmRSZWFkID0gMDsKLQotICAJCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5bGluZSA9IDA7Ci0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWNoYXIgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gIAkJICovCi0gIAkJeXljb2x1bW4gPSAwOyAKLQotICAJCS8qKiAKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyAKLSAgCQkgKiBvZiBhIGxpbmUKLSAgCQkgKi8KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0gIAkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAJCXl5X2F0RU9GID0gZmFsc2U7Ci0KLSAgCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOwotICAJCQotICAJCWhhc01vcmUgPSB0cnVlOwotICAJCQotICAJCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLSAgCQkvLyBieSBjbGFzcyBpbml0ICh2aWEgYXV0byBnZW5lcmF0ZWQgY29kZSksIGJ1dCB3ZSByZWFsbHkgZG8gd2FudCAKLSAgCQkvLyBhIHNtYWxsIGJ1ZmZlciBmb3Igb3VyIGhlYWQgcGFyc2Vycy4gCi0gIAkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gTUFYX1RPX1NDQU4pIHsKLSAgCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotICAJCX0KLQotCi0gIAl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLQl9CQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTI4KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotCi0gICAgU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIAloYXNNb3JlPWZhbHNlOwotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICB5eV9hdEJPTCA9IHl5X21hcmtlZFBvcyA8PSAwIHx8IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xuJzsKLSAgICAgIGlmICgheXlfYXRCT0wgJiYgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXHInKSB7Ci0gICAgICAgIHl5X2F0Qk9MID0geXlfYWR2YW5jZSgpICE9ICdcbic7Ci0gICAgICAgIGlmICgheXlfYXRFT0YpIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIGlmICh5eV9hdEJPTCkKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGVdOwotCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eWNtYXBbeXlfaW5wdXRdOwotCi0gICAgICAgICAgYm9vbGVhbiB5eV9pc0ZpbmFsID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB5eV9ub0xvb2tBaGVhZCA9IGZhbHNlOwotCi0gICAgICAgICAgeXlfZm9yTmV4dDogeyBzd2l0Y2ggKHl5X3N0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gMzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gMzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDQwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gMzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDQ4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDUwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA1MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA1MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDUzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfSUxMRUdBTF9TVEFURSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gfQotCi0gICAgICAgICAgaWYgKCB5eV9pc0ZpbmFsICkgewotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoIHl5X25vTG9va0FoZWFkICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgICAgeyAgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDU1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA1NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotICAgICAgICBjYXNlIDU3OiBicmVhazsKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgNTg6IGJyZWFrOwotICAgICAgICBjYXNlIDM5OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA1OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgNjA6IGJyZWFrOwotICAgICAgICBjYXNlIDc6IAotICAgICAgICBjYXNlIDg6IAotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30gfQotICAgICAgICBjYXNlIDYxOiBicmVhazsKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9IH0KLSAgICAgICAgY2FzZSA2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fSB9Ci0gICAgICAgIGNhc2UgNjM6IGJyZWFrOwotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fSB9Ci0gICAgICAgIGNhc2UgNjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQ5OiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fSB9Ci0gICAgICAgIGNhc2UgNjU6IGJyZWFrOwotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOyB9Ci0gICAgICAgIGNhc2UgNjY6IGJyZWFrOwotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOyB9Ci0gICAgICAgIGNhc2UgNjc6IGJyZWFrOwotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgICB7ICBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDY4OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgICAgeyAgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgIH0KLSAgICAgICAgY2FzZSA2OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSA3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSA3MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDcyOiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0gIC8qKgotICAgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotICAgKgotICAgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuCi0gICAqIEl0IHByaW50cyBlYWNoIHJldHVybmVkIHRva2VuIHRvIFN5c3RlbS5vdXQgdW50aWwgdGhlIGVuZCBvZgotICAgKiBmaWxlIGlzIHJlYWNoZWQsIG9yIGFuIGVycm9yIG9jY3VyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBhcmd2ICAgdGhlIGNvbW1hbmQgbGluZSwgY29udGFpbnMgdGhlIGZpbGVuYW1lcyB0byBydW4KLSAgICogICAgICAgICAgICAgICB0aGUgc2Nhbm5lciBvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLSAgICAgIFhNTEhlYWRUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICBzY2FubmVyID0gbmV3IFhNTEhlYWRUb2tlbml6ZXIoIG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkgKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBYTUxIZWFkVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotCi0gICAgICB0cnkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLSAgICAgICAgfSB3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplckdlbkphdmEuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzFjN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1AZWNobyBvbg0KLQ0KLXJlbSBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBuZWVkIHRvIGJlIHNldC9zcGVjaWZpZWQgZm9yIGVhY2ggImRldmVsb3BtZW50IG1hY2hpbmUiDQotc2V0IFBBVEg9JVBBVEglO0Q6XEpES3NcajJzZGsxLjQuMl8wM1xiaW4NCi1zZXQgV09SS1NQQUNFX0xPQ0FUSU9OPUQ6XGJ1aWxkc1xXb3Jrc3BhY2VzXFdTV0JNOA0KLXNldCBKRkxFWF9MSUJfTE9DQVRJT049RDpcRGV2VGltZVN1cHBvcnRcSkZsZXhcbGliDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRpZmZlciBmcm9tIHByb2plY3QgdG8gcHJvamVjdCwgYnV0IHNob3VsZCBiZSBvdGhlcndpc2UgY29uc3RhbnQNCi1zZXQgTUFJTl9OQU1FPVhNTEhlYWRUb2tlbml6ZXINCi0NCi1yZW0gc2V0IFBST0pFQ1RfU1JDPVxvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUueG1sXHNyY1wNCi1yZW0gc2V0IFBBQ0tBR0VfRElSPWNvbVxpYm1cc3NlXG1vZGVsXHhtbFxlbmNvZGluZ1wNCi0NCi1zZXQgUFJPSkVDVF9TUkM9XG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljXHNyY1wNCi1zZXQgUEFDS0FHRV9ESVI9Y29tXGlibVxlbmNvZGluZ1xyZXNvdXJjZVxjb250ZW50c3BlY2lmaWNceG1sXA0KLQ0KLQ0KLXJlbSBHaXZlbiB0aGUgYWJvdmUgImZyYW1ld29yayIgYW5kIHRoZSBjb21tYW5kIHRoZW1zZWx2ZXMsIHRoZXNlIHZhcmlhYmxlcyBzaG91bGQgbmV2ZXIgbmVlZCB0byBiZSBtb2RpZmllZA0KLXNldCBKQVZBX0ZJTEU9JU1BSU5fTkFNRSUuamF2YQ0KLXNldCBKRkxFWF9SVUxFUz0lTUFJTl9OQU1FJS5qZmxleA0KLXNldCBTS0VMRVRPTl9GSUxFPSVNQUlOX05BTUUlLnNrZWxldG9uDQotDQotSUYgRVhJU1QgJUpBVkFfRklMRSUgZGVsICVKQVZBX0ZJTEUlDQotcmVtIGphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAtc2tlbCAlU0tFTEVUT05fRklMRSUgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwICVKRkxFWF9MSUJfTE9DQVRJT04lXHNlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluICVKRkxFWF9SVUxFUyUgIDE+amZsZXhvdXQudHh0IDI+amZsZXhlcnIudHh0DQotSUYgRVhJU1QgJUpBVkFfRklMRSUgY29weSAlSkFWQV9GSUxFJSAlV09SS1NQQUNFX0xPQ0FUSU9OJSVQUk9KRUNUX1NSQyUlUEFDS0FHRV9ESVIlJUpBVkFfRklMRSUNCi0NCi1wYXVzZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9qZmxleG91dC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2YzMyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotUmVhZGluZyAiWE1MSGVhZFRva2VuaXplci5qZmxleCIKLQotV2FybmluZyA6IE1hY3JvICJTcGFjZUNoYXIiIGhhcyBiZWVuIGRlY2xhcmVkIGJ1dCBuZXZlciB1c2VkLgotQ29uc3RydWN0aW5nIE5GQSA6IDM1OCBzdGF0ZXMgaW4gTkZBCi1Db252ZXJ0aW5nIE5GQSB0byBERkEgOiAKLS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLTc5IHN0YXRlcyBiZWZvcmUgbWluaW1pemF0aW9uLCA1NCBzdGF0ZXMgaW4gbWluaW1pemVkIERGQQotV3JpdGluZyBjb2RlIHRvICJYTUxIZWFkVG9rZW5pemVyLmphdmEiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL29sZFhNTEhlYWRUb2tlbml6ZXIuc2tlbGV0b24gYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL29sZFhNTEhlYWRUb2tlbml6ZXIuc2tlbGV0b24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDk2MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9vbGRYTUxIZWFkVG9rZW5pemVyLnNrZWxldG9uCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLQ0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovDQotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOw0KLQ0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovDQotLS0tICBsZXhpY2FsIHN0YXRlcywgY2hhcm1hcA0KLQ0KLSAgLyogZXJyb3IgY29kZXMgKi8NCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7DQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7DQotDQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovDQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7DQotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkDQotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCQkvLyROT04tTkxTLTEkDQotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQNCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkDQotICB9Ow0KLQ0KLS0tLSBpc0ZpbmFsIGxpc3QNCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovDQotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotICBwcml2YXRlIGludCB5eV9zdGF0ZTsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOw0KLQ0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsNCi0NCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOw0KLQ0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7DQotDQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7DQotDQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotICAgICAgZnJvbSBpbnB1dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsNCi0NCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5bGluZTsNCi0NCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsNCi0NCi0gIA0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsNCi0NCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGhhbmRsaW5nIGVtYmVkZGVkIHJlZ2lvbnMNCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOw0KLQ0KLQ0KLS0tLSB1c2VyIGNsYXNzIGNvZGUNCi0NCi0gIC8qKg0KLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyDQotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuDQotICAgKg0KLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uDQotICAgKi8NCi0tLS0gY29uc3RydWN0b3IgZGVjbGFyYXRpb24NCi0NCi0NCi0gIC8qKg0KLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuDQotICAgKg0KLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlDQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4NCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMNCi0gICAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsNCi0NCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLw0KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsNCi0NCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyANCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7DQotDQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLw0KLQ0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLw0KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgew0KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCANCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsNCi0NCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLw0KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfc3RhcnRSZWFkID0gMDsNCi0gICAgfQ0KLQ0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovDQotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsNCi0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8NCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsNCi0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsNCi0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7DQotICAgIH0NCi0NCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovDQotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7DQotDQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsNCi0NCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7DQotDQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsNCi0gIH0NCi0NCi0gICAgDQotICAvKioNCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8NCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovDQotICAgIHl5X3JlYWRlci5jbG9zZSgpOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsNCi0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7DQotICB9DQotDQotICAvKioNCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlDQotICAgKg0KLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQ0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgew0KLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgew0KLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgew0KLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24NCi0gICAqDQotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQ0KLSAgICovDQotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsNCi0gICAgdHJ5IHsNCi0gICAgICAvL0xvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7DQotCVN5c3RlbS5vdXQucHJpbnRsbigiU2NhbkVycm9yOiAiICsgZXJyb3JDb2RlICsgIjogIiArIFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsNCi0gICAgfQ0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsNCi0gICAgICAvL0xvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOw0KLQlTeXN0ZW0ub3V0LnByaW50bG4oIlNjYW5FcnJvcjogIiArIGVycm9yQ29kZSArICI6ICIgKyBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOw0KLSAgIH0NCi0gICAgLy8gRE8gTk9UIEVYSVQgdGhlIFZNIG9uIGFuIGVycm9yDQotICAgIC8vIFN5c3RlbS5leGl0KDEpOw0KLSAgfSANCi0NCi0NCi0gIC8qKg0KLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uDQotICAgKg0KLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZA0KLSAgICoNCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLg0KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhDQotICAgKi8NCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsNCi0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkNCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7DQotDQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7DQotICB9DQotDQotDQotLS0tIHl5X2RvRW9mDQotICAvKioNCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsDQotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuDQotICAgKg0KLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuDQotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzDQotICAgKi8NCi0tLS0geXlsZXggZGVjbGFyYXRpb24NCi0gICAgaW50IHl5X2lucHV0Ow0KLSAgICBpbnQgeXlfYWN0aW9uOw0KLQ0KLS0tLSBsb2NhbCBkZWNsYXJhdGlvbnMNCi0NCi0gICAgd2hpbGUgKHRydWUpIHsNCi0NCi0tLS0gc3RhcnQgYWRtaW4gKGxpbmUsIGNoYXIsIGNvbCBjb3VudCkNCi0gICAgICB5eV9hY3Rpb24gPSAtMTsNCi0NCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOw0KLQ0KLS0tLSBzdGFydCBhZG1pbiAobGV4c3RhdGUgZXRjKQ0KLQ0KLSAgICAgIHl5X2ZvckFjdGlvbjogew0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsNCi0gICAgDQotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOw0KLQ0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOw0KLQ0KLS0tLSBsaW5lLCBjb2wsIGNoYXIgY291bnQsIG5leHQgdHJhbnNpdGlvbiwgaXNGaW5hbCBhY3Rpb24NCi0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgDQotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgDQotLS0tIGxpbmUgY291bnQgdXBkYXRlDQotICAgICAgICAgIH0NCi0NCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotLS0tIGNoYXIgY291bnQgdXBkYXRlDQotDQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgDQotDQotLS0tIGFjdGlvbnMNCi0gICAgICAgIGRlZmF1bHQ6IA0KLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsNCi0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7DQotLS0tIGVvZnZhbHVlDQotICAgICAgICAgIH0gDQotICAgICAgICAgIGVsc2Ugew0KLS0tLSBubyBtYXRjaA0KLSAgICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9ICAgIA0KLQ0KLS0tLSBtYWluDQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9DU1NUb2tlbml6ZXIuamZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvQ1NTVG9rZW5pemVyLmpmbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTdjNmFmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvQ1NTVG9rZW5pemVyLmpmbGV4CisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKm5sc1hYWCovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5DU1NUZXh0UmVnaW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247DQotDQotJSUNCi0NCi0lcHVibGljDQotJWNsYXNzIENTU1Rva2VuaXplcg0KLSVpbXBsZW1lbnRzIENTU1JlZ2lvbkNvbnRleHRzLCBJQ1NTVG9rZW5pemVyDQotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4NCi0ldHlwZSBTdHJpbmcNCi0lY2hhcg0KLSV1bmljb2RlDQotJWNhc2VsZXNzDQotLy8lZGVidWcNCi0lcGFjaw0KLQ0KLSV7DQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBVTkRFRklORUQgPSAidW5kZWZpbmVkIjsNCi0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7DQotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0Ow0KLS8vCXByaXZhdGUgaW50IGZCdWZmZXJlZFRleHRMZW5ndGg7DQotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aDsNCi0vLwlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQnVmZmVyZWRUZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBDU1NUZXh0UmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IENTU1RleHRSZWdpb25GYWN0b3J5LmdldEluc3RhbmNlKCk7DQotCXByaXZhdGUgaW50IGZJbml0aWFsU3RhdGUgPSBZWUlOSVRJQUw7DQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX05PUk1BTCA9IDE2Mzg0Ow0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRV9TTUFMTCA9IDI1NjsNCi0JcHJpdmF0ZSBpbnQgZkluaXRpYWxCdWZmZXJTaXplID0gQlVGRkVSX1NJWkVfTk9STUFMOw0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsU3RhdGUoaW50IHN0YXRlKSB7DQotCQlmSW5pdGlhbFN0YXRlID0gc3RhdGU7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxCdWZmZXJTaXplKGludCBzaXplKSB7DQotCQlmSW5pdGlhbEJ1ZmZlclNpemUgPSBzaXplOw0KLQl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotICAJcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlTdHJpbmcgY29udGV4dDsNCi0JCVN0cmluZyBuZXh0VG9rZW5UeXBlOw0KLQkJYm9vbGVhbiBzcGFjZUZvbGxvd3M7DQotLy8JCVN0cmluZ0J1ZmZlciB0ZXh0Ow0KLQkJaW50IHN0YXJ0Ow0KLQkJaW50IHRleHRMZW5ndGg7DQotCQlpbnQgbGVuZ3RoOw0KLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgIT0gbnVsbCkgew0KLQkJCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0Ow0KLS8vCQkJdGV4dCA9IGZCdWZmZXJlZFRleHQ7DQotCQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsNCi0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOw0KLQ0KLQkJCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQkJfSBlbHNlIHsNCi0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLS8vCQkJdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOw0KLQkJCXN0YXJ0ID0geXljaGFyOw0KLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJfQ0KLQ0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgew0KLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgew0KLQkJCQkvLyB1bmRlZiAtPiBjb25jYXRlbmF0ZSB1bmRlZidzDQotCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlID09IFVOREVGSU5FRCkgew0KLS8vCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7DQotCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7DQotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOw0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJfQ0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0vLwkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7DQotCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCX0gZWxzZSB7DQotCQkJCW5leHRUb2tlblR5cGUgPSBudWxsOw0KLQkJCQlzcGFjZUZvbGxvd3MgPSBmYWxzZTsNCi0JCQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblZhbHVlVHlwZShjb250ZXh0KSkgeyAvLyBkZWNsYXJhdGlvbiB2YWx1ZSBjYW4gY29udGFpbiBWQUxVRV9TDQotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOw0KLQkJCQl9IGVsc2UgaWYgKGNhbkNvbnRhaW5TcGFjZShjb250ZXh0KSkgew0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19TKTsNCi0JCQkJfQ0KLQkJCQlpZiAobmV4dFRva2VuVHlwZSAhPSBudWxsKSB7IC8vIG5leHRUb2tlbiBpcyByZXRyaWV2ZWQNCi0JCQkJCWlmIChzcGFjZUZvbGxvd3MgJiYgKGNvbnRleHQgIT0gQ1NTX0NPTU1FTlQpKSB7DQotCQkJCQkJLy8gbmV4dCBpcyBzcGFjZSAtPiBhcHBlbmQNCi0vLwkJCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsNCi0JCQkJCQlsZW5ndGggKz0geXlsZW5ndGgoKTsNCi0JCQkJCX0gZWxzZSB7DQotCQkJCQkJLy8gbmV4dCBpcyBOT1Qgc3BhY2UgLT4gcHVzaCB0aGlzIGZvciBuZXh0IHRpbWUsIHJldHVybiBpdHNlbGYNCi0JCQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0vLwkJCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsNCi0JCQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsNCi0JCQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgew0KLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgew0KLQkJCQljb250ZXh0ID0gQ1NTX1VOS05PV047DQotCQkJfQ0KLQkJCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7DQotCQl9IGVsc2Ugew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLSAgCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JLyogZm9yIHN0YW5kYWxvbmUgdXNlICovDQotICAJcHVibGljIGZpbmFsIExpc3QgcGFyc2VUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gIAkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7DQotDQotICAJCUNTU1RleHRUb2tlbiB0b2tlbjsNCi0JCWZvciAoU3RyaW5nIGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCk7IGtpbmQgIT0gbnVsbDsga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKSkgew0KLQkJCXRva2VuID0gbmV3IENTU1RleHRUb2tlbigpOw0KLQkJCXRva2VuLmtpbmQgPSBraW5kOyAgCQkJCQ0KLQkJCXRva2VuLnN0YXJ0ID0geXljaGFyOw0KLQkJCXRva2VuLmxlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCQkJdG9rZW4uaW1hZ2UgPSB5eXRleHQoKTsNCi0JCQl0b2tlbnMuYWRkKHRva2VuKTsNCi0JCX0NCi0NCi0gIAkJcmV0dXJuIHRva2VuczsNCi0gIAl9DQotICAJDQotICAJLyogdXNlciBtZXRob2QgKi8NCi0gIAlwcml2YXRlIGJvb2xlYW4gY2FuQ29udGFpblNwYWNlKFN0cmluZyB0eXBlKSB7DQotICAJCWlmICh0eXBlID09IENTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgew0KLSAgCQkJcmV0dXJuIGZhbHNlOw0KLSAgCQl9IGVsc2Ugew0KLSAgCQkJcmV0dXJuIHRydWU7DQotICAJCX0NCi0gIAl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgew0KLQkJcmV0dXJuIHl5Y2hhcjsNCi0JfQ0KLQkNCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7DQotCQlyZXR1cm4genpBdEVPRjsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7DQotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOw0KLQl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7DQotCQkvKiogdGhlIGlucHV0IGRldmljZSAqLw0KLQkJenpSZWFkZXIgPSBpbjsNCi0NCi0JCS8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotCQl6elN0YXRlID0gMDsNCi0NCi0JCS8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotCQl6ekxleGljYWxTdGF0ZSA9IGZJbml0aWFsU3RhdGU7IC8vWVlJTklUSUFMOw0KLQ0KLQkJLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0JCQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0JCWlmICh6ekJ1ZmZlci5sZW5ndGggIT0gZkluaXRpYWxCdWZmZXJTaXplKSB7DQotCQkJenpCdWZmZXIgPSBuZXcgY2hhcltmSW5pdGlhbEJ1ZmZlclNpemVdOw0KLQkJfQ0KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsNCi0NCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLQkJenpNYXJrZWRQb3MgPSAwOw0KLQ0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotLy8JCXl5X3B1c2hiYWNrUG9zID0gMDsNCi0NCi0JCS8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0JCXp6Q3VycmVudFBvcyA9IDA7DQotDQotCQkvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotCQl6elN0YXJ0UmVhZCA9IDA7DQotDQotCQkvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotCQkJZnJvbSBpbnB1dCAqLw0KLQkJenpFbmRSZWFkID0gMDsNCi0NCi0JCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCXl5bGluZSA9IDA7DQotDQotCQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotCQl5eWNoYXIgPSAwOw0KLQ0KLQkJLyoqDQotCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgDQotCQkgKiBtYXRjaGVkIHRleHQNCi0JCSAqLw0KLS8vCQl5eWNvbHVtbiA9IDA7IA0KLQ0KLQkJLyoqIA0KLQkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lDQotCQkgKi8NCi0vLwkJeXlfYXRCT0wgPSBmYWxzZTsNCi0JCQ0KLQkJLyoqIHp6QXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLQkJenpBdEVPRiA9IGZhbHNlOw0KLQ0KLQkJLyogdXNlciB2YXJpYWJsZXMgKi8NCi0JCS8vCQlmVW5kZWZpbmVkLmRlbGV0ZSgwLCBmVW5kZWZpbmVkLmxlbmd0aCgpKTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgQ1NTVG9rZW5pemVyKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQWRkZWQgdG8gd29ya2Fyb3VuZCBzdHJpY3RlciBjb21waWxhdGlvbiBvcHRpb25zIHdpdGhvdXQgY3JlYXRpbmcNCi0JICogYW4gYWx0ZXJuYXRlIHNrZWxldG9uIGZpbGUNCi0JICovDQotCXZvaWQgX3VzZVByaXZhdGVzKCkgew0KLQkJU3lzdGVtLm91dC5wcmludCh5eWNvbHVtbik7DQotCQlTeXN0ZW0ub3V0LnByaW50KHl5bGluZSk7DQotCQlTeXN0ZW0ub3V0LnByaW50KEJvb2xlYW4udG9TdHJpbmcoenpBdEJPTCkpOw0KLQl9DQotJX0NCi0NCi0lc3RhdGUgU1RfQ0hBUlNFVF9OQU1FDQotJXN0YXRlIFNUX0NIQVJTRVRfREVMSU1JVEVSDQotJXN0YXRlIFNUX0lNUE9SVF9VUkkNCi0lc3RhdGUgU1RfSU1QT1JUX01FRElVTQ0KLSVzdGF0ZSBTVF9JTVBPUlRfREVMSU1JVEVSDQotJXN0YXRlIFNUX01FRElBX01FRElVTQ0KLSVzdGF0ZSBTVF9NRURJQV9ERUxJTUlURVINCi0lc3RhdGUgU1RfUEFHRV9QU0VVRE9fUEFHRQ0KLSVzdGF0ZSBTVF9QQUdFX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9GT05UX0ZBQ0VfREVMSU1JVEVSDQotJXN0YXRlIFNUX1NFTEVDVE9SDQotJXN0YXRlIFNUX1NFTEVDVE9SX01PRElGSUVSDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUNCi0lc3RhdGUgU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORA0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1INCi0lc3RhdGUgU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFDQotJXN0YXRlIFNUX0RFQ0xBUkFUSU9OX1ZBTFVFDQotDQotaCA9IFswLTlhLWZdDQotbm9uYXNjaWkgPSBbXHUwMDgwLVx1ZmZmZl0NCi11bmljb2RlID0gXFx7aH17MSw2fVsgXHRcclxuXGZdPw0KLWVzY2FwZSA9IHt1bmljb2RlfXxcXFsgLX5cdTAwODAtXHVmZmZmXQ0KLQ0KLQ0KLQ0KLW5tc3RhcnQgPSBbX2EtekEtWl18e25vbmFzY2lpfXx7ZXNjYXBlfQ0KLW5tY2hhciA9IFtfYS16QS1aMC05LV18e25vbmFzY2lpfXx7ZXNjYXBlfQ0KLXN0cmluZzEgPSBcIihbXHQgISMkJSYoLX5dfFxce25sfXxcJ3x7bm9uYXNjaWl9fHtlc2NhcGV9KSpcIg0KLXN0cmluZzIgPSBcJyhbXHQgISMkJSYoLX5dfFxce25sfXxcInx7bm9uYXNjaWl9fHtlc2NhcGV9KSpcJw0KLQ0KLWlkZW50ID0gLT97bm1zdGFydH17bm1jaGFyfSoNCi12YWx1ZV9pZGVudCA9IC0/e25tc3RhcnR9Ii4iPyh7bm1jaGFyfSsiLiI/KSoNCi0NCi1uYW1lID0ge25tY2hhcn0rDQotbnVtID0gWystXT8oWzAtOV0rfFswLTldKiIuIlswLTldKykNCi1zdHJpbmcgPSB7c3RyaW5nMX18e3N0cmluZzJ9DQotdXJsID0gKFsgISMkJSYqLX5dfHtub25hc2NpaX18e2VzY2FwZX0pKg0KLXMgPSBbIFx0XHJcblxmXQ0KLXcgPSB7c30qDQotbmwgPSBcbnxcclxufFxyfFxmDQotDQotLy9yYW5nZSA9IFw/ezEsNn18e2h9KFw/ezAsNX18e2h9KFw/ezAsNH18e2h9KFw/ezAsM318e2h9KFw/ezAsMn18e2h9KFw/P3x7aH0pKSkpKQ0KLQ0KLWhhc2ggPSAiIyJ7bmFtZX0NCi11cmkgPSAoInVybCgie3d9e3N0cmluZ317d30iKSJ8InVybCgie3d9e3VybH17d30iKSIpDQotZnVuY3Rpb24gPSB7aWRlbnR9IigiDQotdW5pY29kZV9yYW5nZSA9ICJVIlwrWzAtOWEtZkEtRj9dezEsNn0oIi0iWzAtOWEtZkEtRj9dezEsNn0pPw0KLQ0KLSUlDQotDQotLyoNCi0gKiAqKiogZ2xvYmFsICoqKg0KLSAqLw0KLQ0KLXtzfSsgeyByZXR1cm4gQ1NTX1M7IH0NCi0iPCEtLSIgeyByZXR1cm4gQ1NTX0NETzsgfQ0KLSItLT4iIHsgcmV0dXJuIENTU19DREM7IH0NCi0ifSIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfUkJSQUNFOyB9DQotXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvIHsgcmV0dXJuIENTU19DT01NRU5UOyB9DQotDQotLy88WVlJTklUSUFMPiB7DQotLy8JIkBpbXBvcnQiIHsJeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7IH0NCi0vL30NCi0NCi0vKg0KLSAqICoqKiBjaGFyc2V0IHJ1bGUgKioqDQotICogQ0hBUlNFVF9TWU0gUyogU1RSSU5HIFMqICc7Jw0KLSAqLw0KLQ0KLSJAY2hhcnNldCIgeyB5eWJlZ2luKFNUX0NIQVJTRVRfTkFNRSk7IHJldHVybiBDU1NfQ0hBUlNFVDsgfQ0KLQ0KLTxTVF9DSEFSU0VUX05BTUU+IHsNCi0Je3N0cmluZ30geyB5eWJlZ2luKFNUX0NIQVJTRVRfREVMSU1JVEVSKTsgcmV0dXJuIENTU19TVFJJTkc7IH0NCi19DQotDQotPFNUX0NIQVJTRVRfREVMSU1JVEVSPiB7DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotLyoNCi0gKiAqKiogaW1wb3J0IHJ1bGUgKioqDQotICogSU1QT1JUX1NZTSBTKiBbU1RSSU5HfFVSSV0gUyogWyBtZWRpdW0gWyBDT01NQSBTKiBtZWRpdW1dKiBdPyAnOycgUyoNCi0gKi8NCi0NCi0iQGltcG9ydCIgeyB5eWJlZ2luKFNUX0lNUE9SVF9VUkkpOyByZXR1cm4gQ1NTX0lNUE9SVDsgfQ0KLQ0KLTxTVF9JTVBPUlRfVVJJPiB7DQotCXtzdHJpbmd9IHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19TVFJJTkc7IH0NCi0JLy8JInVybCgie3d9e3N0cmluZ317d30iKSIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsgfQ0KLQkvLwkidXJsKCJ7d317dXJsfXt3fSIpIiB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOyB9DQotCXt1cml9IHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7IH0NCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLX0NCi0NCi08U1RfSU1QT1JUX01FRElVTT4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9JTVBPUlRfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07IH0NCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLX0NCi0NCi08U1RfSU1QT1JUX0RFTElNSVRFUj4gew0KLQkiOyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOyB9DQotCSIsIiB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIG1lZGlhIHJ1bGUgKioqDQotICogTUVESUFfU1lNIFMqIG1lZGl1bSBbIENPTU1BIFMqIG1lZGl1bSBdKiBMQlJBQ0UgUyogcnVsZXNldCogJ30nIFMqDQotICovDQotDQotIkBtZWRpYSIgeyB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUE7IH0NCi0NCi0vKiANCi0gKiBtZWRpdW0NCi0gKiBJREVOVCBTKg0KLSAqLw0KLTxTVF9NRURJQV9NRURJVU0+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfTUVESUFfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07IH0NCi0JInsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLX0NCi0NCi08U1RfTUVESUFfREVMSU1JVEVSPiB7DQotCSJ7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi0JIiwiIHsgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsgfQ0KLX0NCi0NCi0vKg0KLSAqICoqKiBwYWdlIHJ1bGUgKioNCi0gKiBQQUdFX1NZTSBTKiBwc2V1ZG9fcGFnZT8gUyogTEJSQUNFIFMqIGRlY2xhcmF0aW9uIFsgJzsnIFMqIGRlY2xhcmF0aW9uIF0qICd9JyBTKg0KLSAqLw0KLQ0KLSJAcGFnZSIgeyB5eWJlZ2luKFNUX1BBR0VfUFNFVURPX1BBR0UpOyByZXR1cm4gQ1NTX1BBR0U7IH0NCi0gDQotLyoNCi0gKiBwc2V1ZG9fcGFnZQ0KLSAqICc6JyBJREVOVA0KLSAqLw0KLQ0KLTxTVF9QQUdFX1BTRVVET19QQUdFPiB7DQotCSI6Ij97aWRlbnR9IHsgeXliZWdpbihTVF9QQUdFX0RFTElNSVRFUik7IHJldHVybiBDU1NfUEFHRV9TRUxFQ1RPUjsgfQ0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotPFNUX1BBR0VfREVMSU1JVEVSPiB7DQotCSJ7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLX0NCi0NCi0vKg0KLSAqIGZvbnQtZmFjZQ0KLSAqIEZPTlRfRkFDRV9TWU0gUyogJ3snIFMqIGRlY2xhcmF0aW9uIFsgJzsnIFMqIGRlY2xhcmF0aW9uICcqICd9JyBTKg0KLSAqLw0KLQ0KLSJAZm9udC1mYWNlIiB7IHl5YmVnaW4oU1RfRk9OVF9GQUNFX0RFTElNSVRFUik7IHJldHVybiBDU1NfRk9OVF9GQUNFOyB9DQotDQotPFNUX0ZPTlRfRkFDRV9ERUxJTUlURVI+IHsNCi0JInsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotfQ0KLQ0KLS8qDQotICogc2VsZWN0b3INCi0gKiBzaW1wbGVfc2VsZWN0b3IgWyBjb21iaW5hdG9yIHNpbXBsZV9zZWxlY3RvciBdKg0KLSAqLw0KLQ0KLS8qDQotICogc2ltcGxlX3NlbGVjdG9yDQotICogZWxlbWVudF9uYW1lIFsgSEFTSCB8IGNsYXNzIHwgYXR0cmliIHwgcHNldWRvIF0qIHwgWyBIQVNIIHwgY2xhc3MgfCBhdHRyaWIgfCBwc2V1ZG8gXSsNCi0gKi8NCi0NCi08WVlJTklUSUFMLCBTVF9TRUxFQ1RPUl9NT0RJRklFUiwgU1RfU0VMRUNUT1I+IHsNCi0JIioiIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfVU5JVkVSU0FMOyB9DQotCXtoYXNofSB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0lEOyB9DQotLy8JIjoie2lkZW50fSgiKCJ7c30qe2lkZW50fXtzfSoiKSIpPyB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1BTRVVETzsgfQ0KLQkiOiIoe2lkZW50fSgiKCJ7c30qe2lkZW50fXtzfSoiKSIpPyk/IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfUFNFVURPOyB9DQotCSIuIntuYW1lfSB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NMQVNTOyB9DQotCSJbIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVDsgfQ0KLX0NCi0NCi08WVlJTklUSUFMLCBTVF9TRUxFQ1RPUj4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FOyB9DQotfQ0KLQ0KLTxTVF9TRUxFQ1RPUl9NT0RJRklFUj4gew0KLQkiLCIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9TRVBBUkFUT1I7IH0NCi0JLy8gdXNpbmcgTE9PS0FIRUFEDQotCXtzfSsvW14rPlx7LC9dIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsgfQ0KLQkiKyJ8Ij4iIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsgfQ0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBhdHRyaWINCi0gKiAnWycgUyogSURFTlQgUyogWyBbICc9JyB8IElOQ0xVREVTIHwgREFTSE1BVENIIF0gUyogWyBJREVOVCB8IFNUUklORyBdIFMqIF0/ICddJw0KLSAqLw0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRT4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FOyB9DQotfQ0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I+IHsNCi0JIj0ifCJ+PSJ8Inw9IiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I7IH0NCi0JIl0iIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORDsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFPiB7DQotCXtpZGVudH18e3N0cmluZ30geyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRTsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORD4gew0KLQkiXSIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EOyB9DQotfQ0KLQ0KLS8qDQotICogZGVjbGFyYXRpb24NCi0gKiBwcm9wZXJ0eSAnOicgUyogZXhwciBwcmlvPyB8IC8vIGVtcHR5IC8vDQotICovDQotDQotPFNUX0RFQ0xBUkFUSU9OPiB7DQotCVx4MkE/e2lkZW50fSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9QUk9QRVJUWTsgfQ0KLX0NCi0NCi08U1RfREVDTEFSQVRJT05fU0VQQVJBVE9SPiB7DQotCSI6IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9TRVBBUkFUT1I7IH0NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSwgU1RfREVDTEFSQVRJT05fVkFMVUU+IHsNCi0JIiEie3N9KiJpbXBvcnRhbnQiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UOyB9DQotCQ0KLQkNCi0JIikiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0U7IH0NCi0JDQotCS8vIG9yZGVyZWQgZm9sbG93aW5nIHR3byBydWxlcyBkZWxpYmVyYXRlbHksIHNlZSANCi0JLy8gIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjk5MDINCi0Je251bX17aWRlbnR9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OOyB9DQotCXt2YWx1ZV9pZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVDsgfQ0KLQ0KLQ0KLQl7bnVtfSIlIiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0U7IH0NCi0JCQ0KLQl7bnVtfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUjsgfQ0KLQkNCi0JDQotCQ0KLQl7ZnVuY3Rpb259IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT047IH0NCi0Je3N0cmluZ30geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkc7IH0NCi0Je3VyaX0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9VUkk7IH0NCi0JIiMie25hbWV9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSDsgfQ0KLQl7dW5pY29kZV9yYW5nZX0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFOyB9DQotCVssL10geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUjsgfQ0KLX0NCi0NCi08U1RfREVDTEFSQVRJT05fVkFMVUU+IHsNCi0Je3N9Ky9bXjt9XSB7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUzsgfQ0KLX0NCi0NCi08U1RfREVDTEFSQVRJT04sIFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiwgU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFLCBTVF9ERUNMQVJBVElPTl9WQUxVRT4gew0KLQkiOyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9ERUxJTUlURVI7IH0NCi0JLy8JIn0iIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX1JCUkFDRTsgfQ0KLX0NCi0NCi0NCi0vLzxZWUlOSVRJQUwsIFNUX0lNUE9SVF9VUkksIFNUX0lNUE9SVF9NRURJVU0sIFNUX0lNUE9SVF9ERUxJTUlURVI+IHsNCi0vLwlcL1wqW14qXSpcKisoW14vKl1bXipdKlwqKykqXC8geyByZXR1cm4gQ1NTX0NPTU1FTlQ7IH0NCi0vLwl7c30rIHsgcmV0dXJuIENTU19TOyB9DQotLy8JLiB7IHJldHVybiBVTkRFRklORUQ7IH0NCi0vL30NCi0NCi0vLzxZWUlOSVRJQUwsIFNUX0lNUE9SVF9VUkksIFNUX0lNUE9SVF9NRURJVU0sIFNUX0lNUE9SVF9ERUxJTUlURVI+IHsNCi0vLwlbXiBcdFxyXG5cZl0rIHsgcmV0dXJuIENTU19VTktOT1dOOyB9DQotLy99DQotDQotLiB7DQotCXJldHVybiBVTkRFRklORUQ7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9mbGV4LmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9mbGV4LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5YWU3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvZmxleC5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUBlY2hvIG9mZg0KLXNldCBKQVZBX0hPTUU9ZDpcamRrNl8wMw0KLXNldCBKRkxFWF9IT01FPUQ6XEpGbGV4XGpmbGV4LTEuNC4yDQotDQotJUpBVkFfSE9NRSVcYmluXGphdmEgLVhteDQ3ME0gLWphciAlSkZMRVhfSE9NRSVcbGliXEpGbGV4LmphciBDU1NUb2tlbml6ZXIuamZsZXgNCi1tb3ZlIENTU1Rva2VuaXplci5qYXZhIC4uXC4uXC4uXC4uXC4uXG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZVxzcmNcb3JnXGVjbGlwc2Vcd3N0XGNzc1xjb3JlXGludGVybmFsXHBhcnNlclwgJiYgZGVsIENTU1Rva2VuaXplci5qYXZhKg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvUkVBRE1FIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkODIwZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWRldmVsICAgICAtIHRoZSBhY3RpdmUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgKHNhbnMgSkRLKQ0KLSAgICAgICAgICAgIC0gbGF0ZXN0IHZlcnNpb24gb2YgSFRNTFRva2VuaXplciBzcGVjaWZpY2F0aW9uIGFuZCBnZW5lcmF0ZWQgY29kZQ0KLSAgICAgICAgICAgIC0gbW9kaWZpZWQgc2tlbGV0b24gdG8gcHJldmVudCBWTSBleGl0cyBvbiB1bm1hdGNoZWQgaW5wdXQNCi0gICAgICAgICAgICAtICJmbGV4IiBzY3JpcHRzIHRvIHJ1biBKRmxleCB3aXRoIG1vZGlmaWVkIHNrZWxldG9uDQotICAgICAgICAgICAgLSBhY3RpdmUgUkNTIGFyY2hpdmUNCi1yZXNvdXJjZXMgLSBiYWNrdXAvcHJpc3RpbmUgcmVzb3VyY2VzDQotICAgICAgICAgICAgLSBVbm1vZGlmaWVkIEpGbGV4IDEuMi4yIGRvd25sb2FkDQotICAgICAgICAgICAgLSBTZXBhcmF0ZSBtb2RpZmljYXRpb25zIHRvIHRoZSBKRmxleCBza2VsZXRvbg0KLSAgICAgICAgICAgIC0gVzNDIFhNTCByZWNvbW1lbmRhdGlvbiB1c2VkIGZvciBzZXZlcmFsIG9mIHRoZSBIVE1MVG9rZW5pemVyIHJ1bGVzDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KU1BUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MjQ0NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KU1BUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MzggKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gMTAvMjQvMDcgNToxNiBBTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlRhZ01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLkludFN0YWNrOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDEwLzI0LzA3IDU6MTYgQU0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovZWNsaXBzZS53dHAvd29ya3NwYWNlL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUb2tlbml6ZXIgaW1wbGVtZW50cyBCbG9ja1Rva2VuaXplciwgRE9NSlNQUmVnaW9uQ29udGV4dHMgewotCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX0RRVU9URVMgPSA1MTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9TUVVPVEVTID0gNTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkxfU1FVT1RFU19FTkQgPSA1MjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlRfRU5EID0gNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUgPSAyMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX1NRVU9URVNfRU5EID0gNDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9EUVVPVEVTID0gNDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTCA9IDQyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfU0NBTiA9IDM2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUxfU1FVT1RFUyA9IDQzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUgPSAxNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfVEFHX0NMT1NFID0gMTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCA9IDQxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9FUVVBTFMgPSAxMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFID0gMjU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkwgPSA0OTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1NRVU9URURfVkJMID0gNTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCA9IDQwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX05BTUUgPSAyMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VRVUFMUyA9IDI0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FID0gMTk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT05URU5UID0gMTY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSA9IDMxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiA9IDMyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UgPSAyNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMgPSAyMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9EUVVPVEVTX0VORCA9IDUzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRFFVT1RFRF9FTCA9IDQ3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiA9IDI4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9FTkQgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9XUyA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX1RFWFQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSA9IDE4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UID0gMzM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OID0gMzQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9EUVVPVEVTX0VORCA9IDQ2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfU1FVT1RFRF9FTCA9IDQ4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfQ09NTUVOVF9FTkQgPSAzOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0VRVUFMUyA9IDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAzNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDID0gMzA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9EUVVPVEVEX1ZCTCA9IDU0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9BQk9SVF9FTUJFRERFRCA9IDM3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCA9IDI5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfQ09NTUVOVCA9IDM4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9DT05URU5UID0gNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4gPSAzNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUEkgPSA1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT04gPSAyNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9OQU1FID0gMTc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9UQUdfTkFNRSA9IDIyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfVEFHX0NMT1NFID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UID0gMzsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw1XDFcMjZcMlwwXDFcMTdcMjJcMFwxXDE3XDFcMjVcMVwxMlwxXDY1IisKLSAgICAiXDFcMTVcMVwyMlwxXDEzXDFcMTRcMVwyNFwxXDI0XDFcMjRcMVwyNFwxXDI0XDFcNyIrCi0gICAgIlwxXDZcMVwzXDEyXDIwXDFcMTFcMVw3MlwxXDFcMVw1MVwxXDJcMVw0XDFcMjEiKwotICAgICJcMVw0MFwxXDczXDFcMzZcMVwzN1wxXDU1XDFcNzBcMVw2MlwxXDYyXDFcNjNcMVw2MiIrCi0gICAgIlwxXDYyXDFcMzNcMVwzMVwxXDY0XDFcNTJcMVw1NFwxXDYyXDFcNjdcMVw2NlwxXDQxIisKLSAgICAiXDFcNzFcMlw2MlwxXDI3XDFcNTNcMVw2MlwxXDM1XDFcMTA0XDFcMjNcMVwwXDFcMTAiKwotICAgICJcMVwwXDFcNTdcMVwxMDNcMVw3NFwxXDYwXDFcNDNcMVw3MFwxXDc1XDFcMTA2XDFcNDYiKwotICAgICJcMVwxMDBcMVw2MlwxXDM0XDFcMzJcMVw1MFwxXDQ3XDFcMTAxXDFcNjJcMVw0NFwxXDQ1IisKLSAgICAiXDFcNTZcMVwxMDJcMVw0MlwxXDYyXDFcMzBcMVw2MVwxXDYyXDFcMTZcMVwwXDFcMTA1IisKLSAgICAiXDcxXDBcMVw3N1wxMFwwXDI3XDc2XDFcMFwzN1w3NlwxXDBcNzJcNzZcMlwwXDEzXDc2IisKLSAgICAiXDJcMFwxMFw3NlwxXDBcNjVcNzZcMVwwXDEwNFw3NlwxMVwwXDQ0XDc2XDNcMFwyXDc2IisKLSAgICAiXDRcMFwzNlw3Nlw3MFwwXDEzMVw3NlwyMlwwXDdcNzZcMTZcMFwyXDc3XDU2XDBcMTA2XDc3IisKLSAgICAiXDMyXDBcMlw3N1w0NFwwXDFcNzZcMVw3N1wzXDc2XDFcMFwxXDc2XDFcMFwyNFw3NiIrCi0gICAgIlwxXDBcNTRcNzZcMVwwXDdcNzZcM1wwXDFcNzZcMVwwXDFcNzZcMVwwXDFcNzYiKwotICAgICJcMVwwXDFcNzZcMVwwXDIyXDc2XDE1XDBcMTRcNzZcMVwwXDEwMlw3NlwxXDBcMTRcNzYiKwotICAgICJcMVwwXDQ0XDc2XDFcMFw0XDc3XDExXDBcNjVcNzZcMlwwXDJcNzZcMlwwXDJcNzYiKwotICAgICJcM1wwXDM0XDc2XDJcMFwxMFw3NlwyXDBcMlw3Nlw2N1wwXDQ2XDc2XDJcMFwxXDc2IisKLSAgICAiXDdcMFw0Nlw3NlwxMlwwXDIxXDc3XDFcMFwyN1w3N1wxXDBcM1w3N1wxXDBcMVw3NyIrCi0gICAgIlwxXDBcMlw3N1wxXDBcMVw3N1wxM1wwXDMzXDc2XDVcMFwzXDc2XDU2XDBcMzJcNzYiKwotICAgICJcNVwwXDFcNzdcMTJcNzZcMTBcNzdcMTVcMFwxMlw3N1w2XDBcMVw3N1wxMDdcNzZcMlwwIisKLSAgICAiXDVcNzZcMVwwXDE3XDc2XDFcMFw0XDc2XDFcMFwxXDc2XDE3XDc3XDJcNzZcMlw3NyIrCi0gICAgIlwxXDBcNFw3N1wyXDBcMTJcNzdcdTAyMDdcMFwzXDc3XDFcMFw2NVw3NlwyXDBcMVw3NyIrCi0gICAgIlwxXDc2XDIwXDc3XDNcMFw0XDc3XDNcMFwxMlw3NlwyXDc3XDJcMFwxMlw3N1wyMVwwIisKLSAgICAiXDNcNzdcMVwwXDEwXDc2XDJcMFwyXDc2XDJcMFwyNlw3NlwxXDBcN1w3NlwxXDAiKwotICAgICJcMVw3NlwzXDBcNFw3NlwyXDBcMVw3N1wxXDBcN1w3N1wyXDBcMlw3N1wyXDAiKwotICAgICJcM1w3N1wxMVwwXDFcNzdcNFwwXDJcNzZcMVwwXDNcNzZcMlw3N1wyXDBcMTJcNzciKwotICAgICJcMlw3NlwyMFwwXDFcNzdcMlwwXDZcNzZcNFwwXDJcNzZcMlwwXDI2XDc2XDFcMCIrCi0gICAgIlw3XDc2XDFcMFwyXDc2XDFcMFwyXDc2XDFcMFwyXDc2XDJcMFwxXDc3XDFcMCIrCi0gICAgIlw1XDc3XDRcMFwyXDc3XDJcMFwzXDc3XDEzXDBcNFw3NlwxXDBcMVw3Nlw3XDAiKwotICAgICJcMTJcNzdcMlw3N1wzXDc2XDE0XDBcM1w3N1wxXDBcN1w3NlwxXDBcMVw3NlwxXDAiKwotICAgICJcM1w3NlwxXDBcMjZcNzZcMVwwXDdcNzZcMVwwXDJcNzZcMVwwXDVcNzZcMlwwIisKLSAgICAiXDFcNzdcMVw3NlwxMFw3N1wxXDBcM1w3N1wxXDBcM1w3N1wyMlwwXDFcNzZcNVwwIisKLSAgICAiXDEyXDc3XDIxXDBcM1w3N1wxXDBcMTBcNzZcMlwwXDJcNzZcMlwwXDI2XDc2XDFcMCIrCi0gICAgIlw3XDc2XDFcMFwyXDc2XDJcMFw0XDc2XDJcMFwxXDc3XDFcNzZcNlw3N1wzXDAiKwotICAgICJcMlw3N1wyXDBcM1w3N1wxMFwwXDJcNzdcNFwwXDJcNzZcMVwwXDNcNzZcNFwwIisKLSAgICAiXDEyXDc3XDIyXDBcMlw3N1wxXDBcNlw3NlwzXDBcM1w3NlwxXDBcNFw3NlwzXDAiKwotICAgICJcMlw3NlwxXDBcMVw3NlwxXDBcMlw3NlwzXDBcMlw3NlwzXDBcM1w3NlwzXDAiKwotICAgICJcMTBcNzZcMVwwXDNcNzZcNFwwXDVcNzdcM1wwXDNcNzdcMVwwXDRcNzdcMTFcMCIrCi0gICAgIlwxXDc3XDE3XDBcMTFcNzdcMjFcMFwzXDc3XDFcMFwxMFw3NlwxXDBcM1w3NlwxXDAiKwotICAgICJcMjdcNzZcMVwwXDEyXDc2XDFcMFw1XDc2XDRcMFw3XDc3XDFcMFwzXDc3XDFcMCIrCi0gICAgIlw0XDc3XDdcMFwyXDc3XDExXDBcMlw3Nlw0XDBcMTJcNzdcMjJcMFwyXDc3XDFcMCIrCi0gICAgIlwxMFw3NlwxXDBcM1w3NlwxXDBcMjdcNzZcMVwwXDEyXDc2XDFcMFw1XDc2XDRcMCIrCi0gICAgIlw3XDc3XDFcMFwzXDc3XDFcMFw0XDc3XDdcMFwyXDc3XDdcMFwxXDc2XDFcMCIrCi0gICAgIlwyXDc2XDRcMFwxMlw3N1wyMlwwXDJcNzdcMVwwXDEwXDc2XDFcMFwzXDc2XDFcMCIrCi0gICAgIlwyN1w3NlwxXDBcMjBcNzZcNFwwXDZcNzdcMlwwXDNcNzdcMVwwXDRcNzdcMTFcMCIrCi0gICAgIlwxXDc3XDEwXDBcMlw3Nlw0XDBcMTJcNzdcMjIxXDBcNTZcNzZcMVwwXDFcNzZcMVw3NyIrCi0gICAgIlwyXDc2XDdcNzdcNVwwXDZcNzZcMVw3N1wxMFw3N1wxXDBcMTJcNzdcNDdcMFwyXDc2IisKLSAgICAiXDFcMFwxXDc2XDJcMFwyXDc2XDFcMFwxXDc2XDJcMFwxXDc2XDZcMFw0XDc2IisKLSAgICAiXDFcMFw3XDc2XDFcMFwzXDc2XDFcMFwxXDc2XDFcMFwxXDc2XDJcMFwyXDc2IisKLSAgICAiXDFcMFwyXDc2XDFcMFwxXDc2XDFcNzdcMlw3Nlw2XDc3XDFcMFwyXDc3XDFcNzYiKwotICAgICJcMlwwXDVcNzZcMVwwXDFcNzdcMVwwXDZcNzdcMlwwXDEyXDc3XDc2XDBcMlw3NyIrCi0gICAgIlw2XDBcMTJcNzdcMTNcMFwxXDc3XDFcMFwxXDc3XDFcMFwxXDc3XDRcMFwyXDc3IisKLSAgICAiXDEwXDc2XDFcMFw0MVw3Nlw3XDBcMjRcNzdcMVwwXDZcNzdcNFwwXDZcNzdcMVwwIisKLSAgICAiXDFcNzdcMVwwXDI1XDc3XDNcMFw3XDc3XDFcMFwxXDc3XDM0NlwwXDQ2XDc2XDEyXDAiKwotICAgICJcNDdcNzZcMTFcMFwxXDc2XDFcMFwyXDc2XDFcMFwzXDc2XDFcMFwxXDc2XDFcMCIrCi0gICAgIlwyXDc2XDFcMFw1XDc2XDUxXDBcMVw3NlwxXDBcMVw3NlwxXDBcMVw3NlwxM1wwIisKLSAgICAiXDFcNzZcMVwwXDFcNzZcMVwwXDFcNzZcM1wwXDJcNzZcM1wwXDFcNzZcNVwwIisKLSAgICAiXDNcNzZcMVwwXDFcNzZcMVwwXDFcNzZcMVwwXDFcNzZcMVwwXDFcNzZcM1wwIisKLSAgICAiXDJcNzZcM1wwXDJcNzZcMVwwXDFcNzZcNTBcMFwxXDc2XDExXDBcMVw3NlwyXDAiKwotICAgICJcMVw3NlwyXDBcMlw3Nlw3XDBcMlw3NlwxXDBcMVw3NlwxXDBcN1w3Nlw1MFwwIisKLSAgICAiXDFcNzZcNFwwXDFcNzZcMTBcMFwxXDc2XHUwYzA2XDBcMjM0XDc2XDRcMFwxMzJcNzZcNlwwIisKLSAgICAiXDI2XDc2XDJcMFw2XDc2XDJcMFw0Nlw3NlwyXDBcNlw3NlwyXDBcMTBcNzZcMVwwIisKLSAgICAiXDFcNzZcMVwwXDFcNzZcMVwwXDFcNzZcMVwwXDM3XDc2XDJcMFw2NVw3NlwxXDAiKwotICAgICJcN1w3NlwxXDBcMVw3NlwzXDBcM1w3NlwxXDBcN1w3NlwzXDBcNFw3NlwyXDAiKwotICAgICJcNlw3Nlw0XDBcMTVcNzZcNVwwXDNcNzZcMVwwXDdcNzZcMzIzXDBcMTVcNzdcNFwwIisKLSAgICAiXDFcNzdcMTA0XDBcMVw3NlwzXDBcMlw3NlwyXDBcMVw3NlwxMjFcMFwzXDc2XHUwZTgyXDAiKwotICAgICJcMVw3N1wxXDBcMVw3NlwzMVwwXDExXDc2XDZcNzdcMVwwXDVcNzdcMTNcMFwxMjRcNzYiKwotICAgICJcNFwwXDJcNzdcMlwwXDJcNzdcMlwwXDEzMlw3NlwxXDBcM1w3N1w2XDBcNTBcNzYiKwotICAgICJcdTFjZDNcMFx1NTFhNlw3Nlx1MGM1YVwwXHUyYmE0XDc2XDEzNFwwXHUwODAwXDBcdTFmZmVcMFwyXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXlfcm93TWFwIFtdID0geyAKLSAgICAgICAgMCwgICAgNzEsICAgMTQyLCAgIDIxMywgICAyODQsICAgMzU1LCAgIDQyNiwgICA0OTcsICAgNTY4LCAgIDYzOSwgCi0gICAgICA3MTAsICAgNzgxLCAgIDg1MiwgICA5MjMsICAgOTk0LCAgMTA2NSwgIDExMzYsICAxMjA3LCAgMTI3OCwgIDEzNDksIAotICAgICAxNDIwLCAgMTQ5MSwgIDE1NjIsICAxNjMzLCAgMTcwNCwgIDE3NzUsICAxODQ2LCAgMTkxNywgIDE5ODgsICAyMDU5LCAKLSAgICAgMjEzMCwgIDIyMDEsICAyMjcyLCAgMjM0MywgIDI0MTQsICAyNDg1LCAgMjU1NiwgIDI2MjcsICAyNjk4LCAgMjc2OSwgCi0gICAgIDI4NDAsICAyOTExLCAgMjk4MiwgIDMwNTMsICAzMTI0LCAgMzE5NSwgIDMyNjYsICAzMzM3LCAgMzQwOCwgIDM0NzksIAotICAgICAzNTUwLCAgMzYyMSwgIDM2OTIsICAzNzYzLCAgMzgzNCwgIDM5MDUsICAzOTc2LCAgNDA0NywgIDQxMTgsICA0MTg5LCAKLSAgICAgNDI2MCwgIDQzMzEsICA0NDAyLCAgNDQ3MywgIDQ0MDIsICA0NDczLCAgNDU0NCwgIDQ0MDIsICA0NDAyLCAgNDQ3MywgCi0gICAgIDQ2MTUsICA0Njg2LCAgNDc1NywgIDQ4MjgsICA0ODk5LCAgNDk3MCwgIDUwNDEsICA1MTEyLCAgNDQwMiwgIDQ0NzMsIAotICAgICA1MTgzLCAgNTI1NCwgIDUzMjUsICA0NDAyLCAgNTM5NiwgIDUzOTYsICA1NDY3LCAgNTUzOCwgIDU2MDksICA1MTgzLCAKLSAgICAgNDQwMiwgIDU2ODAsICA1NzUxLCAgNDQwMiwgIDU4MjIsICA1ODkzLCAgNTk2NCwgIDYwMzUsICA0NDAyLCAgNDQ3MywgCi0gICAgIDYxMDYsICA2MTc3LCAgNjI0OCwgIDYzMTksICA2MzkwLCAgNjQ2MSwgIDQ0MDIsICA2NTMyLCAgNjUzMiwgIDY2MDMsIAotICAgICA2Njc0LCAgNjc0NSwgIDY4MTYsICA2ODg3LCAgNDQwMiwgIDY5NTgsICA3MDI5LCAgNzEwMCwgIDcxNzEsICA3MjQyLCAKLSAgICAgNzMxMywgIDQ0MDIsICA3Mzg0LCAgNzQ1NSwgIDc1MjYsICA3NTk3LCAgNzY2OCwgIDc3MzksICA3ODEwLCAgNzg4MSwgCi0gICAgIDQ0MDIsICA3OTUyLCAgODAyMywgIDgwOTQsICA4MTY1LCAgODIzNiwgIDgzMDcsICA4Mzc4LCAgODQ0OSwgIDg0NDksIAotICAgICA4NTIwLCAgODU5MSwgIDg2NjIsICA4NzMzLCAgODczMywgIDg4MDQsICA4ODc1LCAgODk0NiwgIDkwMTcsICA5MDE3LCAKLSAgICAgOTA4OCwgIDkxNTksICA5MjMwLCAgOTMwMSwgIDQ0MDIsICA5MzcyLCAgOTM3MiwgIDk0NDMsICA5NTE0LCAgOTU4NSwgCi0gICAgIDk2NTYsICA0NDAyLCAgNDQwMiwgIDQ0NzMsICA0NDAyLCAgNDQ3MywgIDk3MjcsICA5Nzk4LCAgOTg2OSwgIDk5NDAsIAotICAgICA0NDAyLCAxMDAxMSwgMTAwODIsIDEwMTUzLCAxMDIyNCwgIDQ0MDIsIDEwMjk1LCAxMDM2NiwgMTA0MzcsIDEwNTA4LCAKLSAgICAgNDQwMiwgIDQ0MDIsIDEwNTc5LCAgNDQwMiwgMTA2NTAsIDEwNzIxLCAxMDY1MCwgMTA3OTIsIDEwODYzLCAxMDc5MiwgCi0gICAgIDQ0MDIsICA0NDAyLCAxMDkzNCwgMTEwMDUsIDExMDc2LCAgNDQwMiwgMTExNDcsIDExMjE4LCAxMTI4OSwgMTEzNjAsIAotICAgIDExNDMxLCAgNDQwMiwgIDQ0MDIsIDExNTAyLCAgNDQwMiwgMTE1NzMsIDExNjQ0LCAxMTU3MywgMTE3MTUsIDExNzg2LCAKLSAgICAxMTcxNSwgIDQ0MDIsICA0NDAyLCAxMTg1NywgMTE5MjgsIDExOTk5LCAgNDQwMiwgMTIwNzAsIDEyMTQxLCAxMjIxMiwgCi0gICAgIDQ0MDIsICA0NDAyLCAxMjI4MywgMTIzNTQsIDEyNDI1LCAxMjQ5NiwgMTI1NjcsICA0NDAyLCAxMjYzOCwgMTI3MDksIAotICAgIDEyNzgwLCAxMjg1MSwgMTI5MjIsIDEyOTkzLCAxMzA2NCwgMTMxMzUsICA0NDAyLCAxMzIwNiwgMTMyNzcsIDEzMzQ4LCAKLSAgICAgNDQwMiwgIDQ0MDIsICA1Mzk2LCAgNTUzOCwgIDQ0MDIsIDEzNDE5LCAgNTYwOSwgMTM0OTAsICA1NjgwLCAgNTgyMiwgCi0gICAgIDU4OTMsIDEzNTYxLCAgNTk2NCwgIDQ0MDIsIDEzNjMyLCAxMzcwMywgIDYwMzUsIDEzNzc0LCAgNDQwMiwgMTIzNTQsIAotICAgICA0NDAyLCAgNjUzMiwgIDY2MDMsICA0NDAyLCAxMzg0NSwgIDY2NzQsIDEzOTE2LCAgNDQwMiwgMTM5ODcsIDE0MDU4LCAKLSAgICAgNzM4NCwgMTQxMjksICA3NTk3LCAgNDQwMiwgMTQyMDAsICA3NjY4LCAxNDI3MSwgMTQzNDIsIDE0NDEzLCAxNDQ4NCwgCi0gICAgMTQ1NTUsIDE0NjI2LCAgODE2NSwgIDQ0MDIsIDE0Njk3LCAxNDc2OCwgIDg0NDksICA4NTIwLCAgNDQwMiwgMTQ4MzksIAotICAgIDE0OTEwLCAxNDk4MSwgMTUwNTIsIDE1MTIzLCAgODY2MiwgIDg0NDksICA4NzMzLCAgODgwNCwgIDQ0MDIsICA4ODc1LCAKLSAgICAgODk0NiwgIDg3MzMsICA5MDE3LCAgOTA4OCwgIDQ0MDIsIDE1MTk0LCAxNTI2NSwgMTUzMzYsIDE1NDA3LCAxNTQ3OCwgCi0gICAgMTU1NDksIDE1NjIwLCAgOTM3MiwgIDk0NDMsICA0NDAyLCAxNTY5MSwgMTU3NjIsIDE1ODMzLCAxNTkwNCwgMTU5NzUsIAotICAgIDE2MDQ2LCAxNjExNywgMTYxODgsIDE2MjU5LCAgNDQwMiwgIDQ0MDIsICA0NDAyLCAxNjMzMCwgIDQ0MDIsICA0NDAyLCAKLSAgICAxNjQwMSwgMTY0NzIsIDE2NTQzLCAxNjYxNCwgMTA2NTAsICA0NDAyLCAxNjY4NSwgMTY3NTYsIDEwNzkyLCAgNDQwMiwgCi0gICAgMTY4MjcsIDE2ODk4LCAxNjk2OSwgMTcwNDAsIDE3MTExLCAxNzE4MiwgMTcyNTMsIDE3MzI0LCAxNzM5NSwgMTEzNjAsIAotICAgIDExNTczLCAgNDQwMiwgMTc0NjYsIDE3NTM3LCAxMTcxNSwgIDQ0MDIsIDE3NjA4LCAxNzY3OSwgMTc3NTAsIDE3ODIxLCAKLSAgICAxNzg5MiwgMTc5NjMsIDE4MDM0LCAxODEwNSwgMTgxNzYsICA0NDAyLCAgNDQwMiwgIDQ0MDIsIDE4MjQ3LCAxODMxOCwgCi0gICAgMTgzODksIDE4NDYwLCAxODUzMSwgIDQ0MDIsIDE4NjAyLCAxODY3MywgIDQ0MDIsICA0NDAyLCAgNDQwMiwgIDQ0MDIsIAotICAgICA0NDAyLCAgNDgyOCwgMTg3NDQsIDE4ODE1LCAxODg4NiwgMTg5NTcsIDE5MDI4LCAxOTA5OSwgMTkxNzAsIDE5MDk5LCAKLSAgICAxOTI0MSwgMTkzMTIsIDE5MjQxLCAxOTM4MywgMTk0NTQsIDE5NTI1LCAxOTU5NiwgMTk2NjcsIDE5NzM4LCAxOTgwOSwgCi0gICAgMTk4MDksIDE5ODgwLCAxOTk1MSwgMTk5NTEsIDIwMDIyLCAgOTIzMCwgIDkyMzAsICA5MjMwLCAyMDA5MywgMjAxNjQsIAotICAgIDIwMjM1LCAyMDIzNSwgMjAzMDYsICA5NTg1LCAgOTU4NSwgIDk1ODUsIDIwMzc3LCAyMDQ0OCwgMTY1NDMsIDIwNTE5LCAKLSAgICAxMDQzNywgMTA0MzcsIDEwNDM3LCAyMDU5MCwgMjA2NjEsIDEwNjUwLCAxMDY1MCwgMTA2NTAsIDIwNzMyLCAyMDgwMywgCi0gICAgMTA3OTIsIDEwNzkyLCAxMDc5MiwgMjA4NzQsIDIwOTQ1LCAxMDkzNCwgMTA5MzQsIDEwOTM0LCAxNzExMSwgMjEwMTYsIAotICAgIDIxMDg3LCAxMTE0NywgMTExNDcsIDExMTQ3LCAxNzMyNCwgMjExNTgsIDIxMjI5LCAxMTM2MCwgMTEzNjAsIDExMzYwLCAKLSAgICAyMTMwMCwgMTE1NzMsIDExNTczLCAxMTU3MywgMjEzNzEsIDIxNDQyLCAxMTcxNSwgMTE3MTUsIDExNzE1LCAyMTUxMywgCi0gICAgMjE1ODQsIDExODU3LCAxMTg1NywgMTE4NTcsIDE3ODkyLCAyMTY1NSwgMjE3MjYsIDEyMDcwLCAxMjA3MCwgMTIwNzAsIAotICAgIDE4MTA1LCAyMTc5NywgIDQ0MDIsICA0NDAyLCAyMTg2OCwgMjE5MzksICA0NDAyLCAyMjAxMCwgMjIwODEsIDIyMTUyLCAKLSAgICAyMjIyMywgIDczODQsICA0NDAyLCAgNDQwMiwgMjIyOTQsIDIyMzY1LCAyMjQzNiwgMjI1MDcsIDIyNTc4LCAxNTA1MiwgCi0gICAgMTU0MDcsICA5MjMwLCAyMjY0OSwgMTU5MDQsICA5NTg1LCAyMjcyMCwgIDQ0MDIsIDEwNDM3LCAxMDY1MCwgMjI3OTEsIAotICAgIDEwNzkyLCAyMjg2MiwgMTA5MzQsIDIyOTMzLCAgNDQwMiwgMTExNDcsIDIzMDA0LCAxMTM2MCwgMTE1NzMsIDIzMDc1LCAKLSAgICAxMTcxNSwgMjMxNDYsIDExODU3LCAyMzIxNywgIDQ0MDIsIDEyMDcwLCAyMzI4OCwgMjMzNTksIDIzNDMwLCAyMzUwMSwgCi0gICAgMjM1NzIsIDIzNjQzLCAyMzcxNCwgMjM3ODUsIDIzODU2LCAyMzkyNywgMjM5OTgsIDI0MDY5LCAyNDE0MCwgMjQyMTEsIAotICAgIDI0MjgyLCAyNDM1MywgMjQ0MjQsIDI0NDk1LCAyNDU2NiwgMjQ2MzcsIDI0NzA4LCAyNDc3OSwgMjQ4NTAsICA0ODI4LCAKLSAgICAyNDkyMSwgMjQ5OTIsIDI1MDYzLCAyNTEzNCwgMjUyMDUsICA0NDAyLCAgNDQwMiwgMjUyNzYsIDI1MzQ3LCAyNTQxOCwgCi0gICAgMjU0ODksIDE3MTExLCAxNzMyNCwgMjU1NjAsIDI1NjMxLCAxNzg5MiwgMTgxMDUsIDI1NzAyLCAyNTc3MywgMjU4NDQsIAotICAgIDI1OTE1LCAgNDQwMiwgIDQ0MDIsICA0NDAyLCAyNTk4NiwgMjYwNTcsIDI2MTI4LCAyNjE5OSwgMjYyNzAsIDI2MzQxLCAKLSAgICAyNjQxMiwgMjY0ODMsICA3MTAwLCAyNjU1NCwgMjY2MjUsIDI2Njk2LCAyNjc2NywgMjY4MzgsIDI2OTA5LCAyNjk4MCwgCi0gICAgIDQ0MDIsIDI3MDUxLCAyNzEyMiwgIDkyMzAsICA5NTg1LCAxMDY1MCwgMTA3OTIsIDExNTczLCAxMTcxNSwgMjcxOTMsIAotICAgIDI3MjY0LCAyNzMzNSwgMjc0MDYsIDI3NDc3LCAyNzU0OCwgMjc2MTksIDI3NjkwLCAgNDgyOCwgMjc3NjEsIDI3ODMyLCAKLSAgICAyNzkwMywgMjc5NzQsIDI4MDQ1LCAyODExNiwgMjgxODcsIDI4MjU4LCAyODMyOSwgMjg0MDAsIDI4NDcxLCAyODU0MiwgCi0gICAgMjg2MTMsIDI4Njg0LCAyODc1NSwgMjg4MjYsIDI4ODk3LCAyODk2OCwgMjkwMzksIDI5MTEwLCAyOTE4MSwgMjkyNTIsIAotICAgIDI5MzIzLCAyOTM5NCwgMjk0NjUsIDI5NTM2LCAyOTYwNywgMjk2NzgsIDI5NzQ5LCAyOTgyMCwgMjk4OTEsIDI5OTYyLCAKLSAgICAzMDAzMywgMzAxMDQsIDMwMTc1LCAzMDI0NiwgIDQ0MDIsIDMwMzE3LCAzMDM4OCwgMzA0NTksIDMwNTMwLCAgNzEwMCwgCi0gICAgMzA2MDEsIDMwNjcyLCAzMDc0MywgMzA4MTQsIDMwODg1LCAzMDk1NiwgMzEwMjcsIDMxMDk4LCAzMTE2OSwgMzEyNDAsIAotICAgIDMxMzExLCAzMTM4MiwgMzE0NTMsIDMxNTI0Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUaGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5X3BhY2tlZCA9IAotICAgICJcMVw3MVwxXDcyXDExXDcxXDFcNzNcMVw3MVwxXDc0XDRcNzFcMVw3NSIrCi0gICAgIlw0Mlw3MVwxXDc2XDIxXDcxXDFcNzdcMVwxMDBcMTA1XDc3XDFcMTAxXDFcMTAyIisKLSAgICAiXDIxXDEwMVwxXDEwM1wyXDEwMVwxXDEwNFw2MFwxMDFcMVwxMDVcMVwxMDZcMTA1XDEwNSIrCi0gICAgIlwxXDEwMVwxXDEwMlw1XDEwMVwxXDEwN1wxNlwxMDFcMVwxMDRcNjFcMTAxXDFcMTAyIisKLSAgICAiXDJcMTAxXDFcMTEwXDFcMTExXDJcMTAxXDJcMTEyXDVcMTAxXDFcMTExXDZcMTAxIisKLSAgICAiXDFcMTExXDFcMTEzXDFcMTE0XDRcMTEyXDFcMTAxXDEwXDExMlwxXDExNVwyXDExMiIrCi0gICAgIlwxXDEwMVwxMVwxMTJcMVwxMTVcMVwxMTJcMVwxMDFcNFwxMTJcMVwxMDFcNFwxMTIiKwotICAgICJcMVwxMDFcNFwxMTJcMlwxMDFcMVwxMTJcMVwxMDFcMVwxMDJcMlwxMDFcMVwxMTAiKwotICAgICJcMVwxMTZcMTFcMTAxXDFcMTE2XDZcMTAxXDFcMTE2XDYwXDEwMVwxXDExN1wxXDEyMCIrCi0gICAgIlwyXDExN1wxXDEyMVwyMVwxMTdcMVwxMDRcNjBcMTE3XDFcMTAxXDFcMTAyXDJcMTAxIisKLSAgICAiXDFcMTIyXDFcMTExXDJcMTAxXDJcMTIzXDVcMTAxXDFcMTExXDZcMTAxXDFcMTExIisKLSAgICAiXDZcMTIzXDFcMTAxXDEzXDEyM1wxXDEwMVwxM1wxMjNcMVwxMDFcNFwxMjNcMVwxMDEiKwotICAgICJcNFwxMjNcMVwxMDFcNFwxMjNcMlwxMDFcMVwxMjNcMVwxMDFcMVwxMDJcMlwxMDEiKwotICAgICJcMVwxMjJcMVwxMTFcMlwxMDFcMlwxMjNcNVwxMDFcMVwxMTFcNlwxMDFcMVwxMTEiKwotICAgICJcNlwxMjNcMVwxMDFcMTNcMTIzXDFcMTI0XDEzXDEyM1wxXDEwMVw0XDEyM1wxXDEwMSIrCi0gICAgIlw0XDEyM1wxXDEwMVw0XDEyM1wyXDEwMVwxXDEyM1wxXDEyNVwxXDEwMlwxXDEwMSIrCi0gICAgIlwxXDEyNlwxXDEyN1wxXDExMVw0XDEyNVwxXDEzMFwxXDEyNVwxXDEzMVwyXDEyNSIrCi0gICAgIlwxXDExMVw2XDEyNVwxXDExMVw2MFwxMjVcMVwxMDFcMVwxMDJcMlwxMDFcMVwxMzIiKwotICAgICJcMjFcMTAxXDFcMTA0XDYxXDEwMVwxXDEwMlwxXDEzM1wxXDEzNFwxXDEwMVwxXDExMSIrCi0gICAgIlwyXDEwMVwyXDEzNVw1XDEwMVwxXDExMVw2XDEwMVwxXDExMVw2XDEzNVwxXDEwMSIrCi0gICAgIlwxM1wxMzVcMVwxMDFcMTNcMTM1XDFcMTAxXDRcMTM1XDFcMTAxXDRcMTM1XDFcMTAxIisKLSAgICAiXDRcMTM1XDJcMTAxXDFcMTM1XDFcMTAxXDFcMTAyXDFcMTMzXDFcMTM0XDFcMTAxIisKLSAgICAiXDFcMTExXDJcMTAxXDJcMTM1XDVcMTAxXDFcMTExXDZcMTAxXDFcMTExXDZcMTM1IisKLSAgICAiXDFcMTAxXDEzXDEzNVwxXDEzNlwxM1wxMzVcMVwxMDFcNFwxMzVcMVwxMDFcNFwxMzUiKwotICAgICJcMVwxMDFcNFwxMzVcMlwxMDFcMVwxMzVcMVwxMzdcMVwxMDJcMVwxMzNcMVwxNDAiKwotICAgICJcMVwxMzdcMVwxMTFcNFwxMzdcMVwxNDFcMVwxMzdcMVwxNDJcMlwxMzdcMVwxMTEiKwotICAgICJcNlwxMzdcMVwxMTFcNjBcMTM3XDFcMTAxXDFcMTAyXDNcMTAxXDFcMTExXDExXDEwMSIrCi0gICAgIlwxXDExMVw2XDEwMVwxXDExMVw2MFwxMDFcMVwxNDNcMVwxNDRcMjBcMTQzXDFcMTQ1IisKLSAgICAiXDY0XDE0M1wxXDEwMVwxXDE0NlwzXDEwMVwxXDExMVwyXDEwMVwyXDE0N1w1XDEwMSIrCi0gICAgIlwxXDExMVwyXDEwMVwxXDE1MFwzXDEwMVwxXDExMVw2XDE0N1wxXDEwMVwxM1wxNDciKwotICAgICJcMVwxMDFcMTNcMTQ3XDFcMTAxXDRcMTQ3XDFcMTAxXDRcMTQ3XDFcMTAxXDRcMTQ3IisKLSAgICAiXDJcMTAxXDFcMTQ3XDFcMTAxXDFcMTQ2XDNcMTAxXDFcMTUxXDExXDEwMVwxXDE1MSIrCi0gICAgIlwyXDEwMVwxXDE1MFwzXDEwMVwxXDE1MVw2MVwxMDFcMVwxNDZcM1wxMDFcMVwxMTEiKwotICAgICJcMlwxMDFcMlwxNTJcNVwxMDFcMVwxMTFcMlwxMDFcMVwxNTBcM1wxMDFcMVwxMTEiKwotICAgICJcNlwxNTJcMVwxMDFcMTNcMTUyXDFcMTAxXDEzXDE1MlwxXDEwMVw0XDE1MlwxXDEwMSIrCi0gICAgIlw0XDE1MlwxXDEwMVw0XDE1MlwyXDEwMVwxXDE1MlwxXDEwMVwxXDE0NlwzXDEwMSIrCi0gICAgIlwxXDExMVwyXDEwMVwyXDE1Mlw1XDEwMVwxXDExMVwyXDEwMVwxXDE1MFwzXDEwMSIrCi0gICAgIlwxXDExMVw2XDE1MlwxXDEwMVwxM1wxNTJcMVwxNTNcMTNcMTUyXDFcMTAxXDRcMTUyIisKLSAgICAiXDFcMTAxXDRcMTUyXDFcMTAxXDRcMTUyXDJcMTAxXDFcMTUyXDFcMTU0XDFcMTQ2IisKLSAgICAiXDFcMTAxXDFcMTU1XDFcMTU0XDFcMTExXDRcMTU0XDFcMTU2XDFcMTU0XDFcMTU3IisKLSAgICAiXDJcMTU0XDFcMTExXDJcMTU0XDFcMTYwXDNcMTU0XDFcMTExXDYwXDE1NFwxXDE2MSIrCi0gICAgIlwxXDE2MlwxXDE2M1wxXDE2NFw0XDE2MVwyXDE2NVwxNVwxNjFcNlwxNjZcMVwxNjEiKwotICAgICJcMTNcMTY2XDFcMTYxXDEzXDE2NlwxXDE2MVw0XDE2NlwxXDE2MVw0XDE2NlwxXDE2MSIrCi0gICAgIlwxXDE2N1wzXDE2NlwyXDE2MVwxXDE2NlwxXDEwMVwxXDE3MFwxXDE2M1wxXDE2NCIrCi0gICAgIlwxXDEwMVwxXDExMVwyXDEwMVwyXDE3MVw1XDEwMVwxXDExMVw2XDEwMVwxXDExMSIrCi0gICAgIlw2XDE3MVwxXDEwMVwxM1wxNzFcMVwxMDFcMTNcMTcxXDFcMTAxXDRcMTcxXDFcMTAxIisKLSAgICAiXDRcMTcxXDFcMTAxXDRcMTcxXDJcMTAxXDFcMTcxXDFcMTAxXDFcMTcwXDFcMTYzIisKLSAgICAiXDFcMTY0XDFcMTAxXDFcMTExXDJcMTAxXDJcMTcxXDVcMTAxXDFcMTExXDZcMTAxIisKLSAgICAiXDFcMTExXDZcMTcxXDFcMTAxXDEzXDE3MVwxXDE3MlwxM1wxNzFcMVwxMDFcNFwxNzEiKwotICAgICJcMVwxMDFcNFwxNzFcMVwxMDFcNFwxNzFcMlwxMDFcMVwxNzFcMVwxNzNcMVwxNzQiKwotICAgICJcMVwxNjNcMVwxNzVcMVwxNzNcMVwxMTFcNFwxNzNcMVwxNzZcMVwxNzNcMVwxNzciKwotICAgICJcMVwyMDBcMVwxNzNcMVwxMTFcNlwxNzNcMVwxMTFcMzZcMTczXDFcMjAxXDIxXDE3MyIrCi0gICAgIlwxXDEwMVwxXDIwMlwxXDIwM1wyXDEwMVwxXDExMVwxMVwxMDFcMVwxMTFcNlwxMDEiKwotICAgICJcMVwxMTFcMTBcMTAxXDFcMjA0XDFcMjA1XDJcMTAxXDFcMjA2XDExXDEwMVwxXDIwNiIrCi0gICAgIlwxXDEwMVwxXDIwNVwxXDIwNFwyN1wxMDFcMVwxMDJcMVwyMDNcMlwxMDFcMVwxMTEiKwotICAgICJcMTFcMTAxXDFcMTExXDZcMTAxXDFcMTExXDZcMTAxXDFcMjA3XDUyXDEwMVwxXDEwMiIrCi0gICAgIlwxXDIwM1wyXDEwMVwxXDExMVwyXDEwMVwyXDIxMFw1XDEwMVwxXDExMVw2XDEwMSIrCi0gICAgIlwxXDExMVw2XDIxMFwxXDIwN1wxM1wyMTBcMVwxMDFcMTNcMjEwXDFcMTAxXDRcMjEwIisKLSAgICAiXDFcMTAxXDRcMjEwXDFcMTAxXDRcMjEwXDJcMTAxXDFcMjEwXDFcMTAxXDFcMTAyIisKLSAgICAiXDFcMjAzXDJcMTAxXDFcMTExXDExXDEwMVwxXDExMVw2XDEwMVwxXDExMVw2XDEwMSIrCi0gICAgIlwxXDIwN1w3XDEwMVwxXDIxMVw2XDEwMVwxXDIxMlwxMVwxMDFcMVwyMTFcMTJcMTAxIisKLSAgICAiXDFcMjEyXDVcMTAxXDFcMjEzXDFcMTAyXDFcMjAzXDFcMjE0XDFcMjEzXDFcMTExIisKLSAgICAiXDRcMjEzXDFcMjE1XDFcMjEzXDFcMjE2XDJcMjEzXDFcMTExXDZcMjEzXDFcMTExIisKLSAgICAiXDZcMjEzXDFcMjE3XDUxXDIxM1wxXDIyMFwxXDEwMlwxXDIwM1wxXDIyMVwxXDIyMCIrCi0gICAgIlwxXDExMVw0XDIyMFwxXDIyMlwxXDIyMFwxXDIyM1wyXDIyMFwxXDExMVw2XDIyMCIrCi0gICAgIlwxXDExMVw2XDIyMFwxXDIyNFw1MVwyMjBcMVwyMjVcMVwxMDJcMVwyMDNcMVwyMjYiKwotICAgICJcMVwyMjVcMVwxMTFcNFwyMjVcMVwyMjdcMVwyMjVcMVwyMzBcMlwyMjVcMVwxMTEiKwotICAgICJcNlwyMjVcMVwxMTFcNjBcMjI1XDFcMjMxXDFcMjMyXDFcMjMzXDEwNFwyMzFcMVwyMzQiKwotICAgICJcMVwxMDJcMVwyMDNcMVwyMzVcMVwyMzRcMVwxMTFcNFwyMzRcMVwyMzZcMVwyMzQiKwotICAgICJcMVwyMzdcMlwyMzRcMVwxMTFcNlwyMzRcMVwxMTFcNjBcMjM0XDFcMjQwXDFcMjQxIisKLSAgICAiXDFcMjQyXDEwNFwyNDBcMVwyNDNcMVwyNDRcMTA1XDI0M1wxXDEwMVwxXDEwMlwyNFwxMDEiKwotICAgICJcMVwxMDRcNjBcMTAxXDFcMjQ1XDFcMjQ2XDEwNVwyNDVcMVwxMDFcMVwxMDJcNVwxMDEiKwotICAgICJcMVwyNDdcMTZcMTAxXDFcMTA0XDYwXDEwMVwxXDI1MFwxXDI1MVwzXDI1MFwxXDI1MiIrCi0gICAgIlw2XDI1MFwxXDI1M1wxXDI1NFwxXDI1MFwxXDI1Mlw2XDI1MFwxXDI1MlwzNlwyNTAiKwotICAgICJcMVwyNTVcMjFcMjUwXDFcMjU2XDFcMjUxXDNcMjU2XDFcMjU3XDRcMjU2XDFcMjYwIisKLSAgICAiXDJcMjU2XDFcMjYxXDFcMjU2XDFcMjU3XDZcMjU2XDFcMjU3XDM2XDI1NlwxXDI2MiIrCi0gICAgIlwyMVwyNTZcMVwyNjNcMVwyNjRcMTBcMjYzXDFcMjY1XDFcMjYzXDFcMjY2XDFcMjY3IisKLSAgICAiXDY3XDI2M1wxXDI3MFwxXDI2M1wxXDI3MVwxXDI3MlwxMlwyNzFcMVwxMDFcMTFcMjcxIisKLSAgICAiXDFcMjczXDYwXDI3MVwxXDI3NFwxXDI3NVwxMFwyNzRcMVwxMDFcMTNcMjc0XDFcMjc2IisKLSAgICAiXDYwXDI3NFwxXDEwMVwxXDEwMlwxMlwxMDFcMVwyNzdcMTFcMTAxXDFcMTA0XDYxXDEwMSIrCi0gICAgIlwxXDEwMlwxMFwxMDFcMVwzMDBcMTNcMTAxXDFcMTA0XDYwXDEwMVwxXDMwMVwxXDMwMiIrCi0gICAgIlwxMFwzMDFcMVwyNjBcNzFcMzAxXDFcMzAzXDFcMzA0XDFcMzAxXDFcMzA1XDFcMzA2IisKLSAgICAiXDEyXDMwNVwxXDI1M1w2N1wzMDVcMVwzMDdcMVwzMDRcMVwzMDVcMVwzMTBcMVwzMTEiKwotICAgICJcMTBcMzEwXDFcMzEyXDFcMzEwXDFcMzEzXDUwXDMxMFwxXDMxNFwxN1wzMTBcMVwzMTUiKwotICAgICJcMVwzMTBcMVwzMTZcMVwzMTdcMTJcMzE2XDFcMTAxXDExXDMxNlwxXDMyMFw2MFwzMTYiKwotICAgICJcMVwzMjFcMVwzMjJcMTBcMzIxXDFcMTAxXDEzXDMyMVwxXDMyM1w2MFwzMjFcMVwxMDEiKwotICAgICJcMVwxMDJcMTJcMTAxXDFcMzI0XDExXDEwMVwxXDEwNFw2MVwxMDFcMVwxMDJcMTBcMTAxIisKLSAgICAiXDFcMzI1XDEzXDEwMVwxXDEwNFw2MFwxMDFcMVwzMjZcMVwzMjdcMTBcMzI2XDFcMjYwIisKLSAgICAiXDcxXDMyNlwxXDMzMFwxXDMzMVwxXDMyNlwxXDMzMlwxXDMzM1wxMlwzMzJcMVwyNTMiKwotICAgICJcNjdcMzMyXDFcMzM0XDFcMzMxXDFcMzMyXDFcNzFcMVwwXDExXDcxXDFcMCIrCi0gICAgIlwxXDcxXDFcMFw0XDcxXDFcMFw0Mlw3MVwxXDBcMjFcNzFcM1wwIisKLSAgICAiXDFcMzM1XDFcMzM2XDE1XDBcMVwzMzdcMlwwXDFcMzQwXDY2XDBcMVwzNDEiKwotICAgICJcMlwwXDJcMzQyXDVcMFwxXDM0MVw2XDBcMVwzNDFcNlwzNDJcMVwwIisKLSAgICAiXDEzXDM0MlwxXDBcMTNcMzQyXDFcMzQzXDRcMzQyXDFcMFw0XDM0MlwxXDAiKwotICAgICJcNFwzNDJcMlwwXDFcMzQyXDFcMzQ0XDFcMFwxMVwzNDRcMVwwXDFcMzQ0IisKLSAgICAiXDFcMzQ1XDFcMzQ2XDNcMzQ0XDFcMFw2NFwzNDRcNVwwXDFcMzQxXDJcMCIrCi0gICAgIlwyXDM0N1w1XDBcMVwzNDFcNlwwXDFcMzQxXDZcMzQ3XDFcMFwxM1wzNDciKwotICAgICJcMVwwXDEzXDM0N1wxXDBcNFwzNDdcMVwwXDRcMzQ3XDFcMFw0XDM0NyIrCi0gICAgIlwyXDBcMVwzNDdcMVwzNDRcMVwwXDExXDM0NFwxXDBcMlwzNDRcMVwzNTAiKwotICAgICJcM1wzNDRcMVwwXDQyXDM0NFwxXDM1MVwyMVwzNDRcMTMxXDBcMVwzMzdcMlwwIisKLSAgICAiXDFcMzUyXDEwNFwwXDFcMzUzXDcyXDBcMVwzNTRcMTAxXDBcMVwzNTVcMTExXDAiKwotICAgICJcMVwxMTFcMTFcMFwxXDExMVw2XDBcMVwxMTFcNjZcMFw0XDExMlw2XDAiKwotICAgICJcMVwxMTJcNlwwXDZcMTEyXDFcMFwxM1wxMTJcMVwwXDEzXDExMlwxXDAiKwotICAgICJcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwXDRcMTEyXDZcMCIrCi0gICAgIlwxXDExMlw2XDBcMlwxMTJcMlwzNTZcMlwxMTJcMVwwXDEzXDExMlwxXDAiKwotICAgICJcMTNcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDAiKwotICAgICJcNFwxMTJcNlwwXDFcMTEyXDZcMFwyXDExMlwxXDM1NlwxXDM1N1wyXDExMiIrCi0gICAgIlwxXDBcMTNcMTEyXDFcMFwxM1wxMTJcMVwwXDRcMTEyXDFcMFwxMVwxMTIiKwotICAgICJcMlwwXDFcMTEyXDZcMFw0XDExMlw2XDBcMVwxMTJcNlwwXDJcMTEyIisKLSAgICAiXDJcMzYwXDJcMTEyXDFcMFwxM1wxMTJcMVwwXDEzXDExMlwxXDBcNFwxMTIiKwotICAgICJcMVwwXDExXDExMlwyXDBcMVwxMTJcNVwwXDFcMTE2XDExXDBcMVwxMTYiKwotICAgICJcNlwwXDFcMTE2XDYyXDBcMVwzNjFcMTA2XDBcMVwzNjJcMTEyXDBcNFwxMjMiKwotICAgICJcNlwwXDFcMTIzXDZcMFw2XDEyM1wxXDBcMTNcMTIzXDFcMFwxM1wxMjMiKwotICAgICJcMVwwXDRcMTIzXDFcMFwxMVwxMjNcMlwwXDFcMTIzXDFcMTI1XDJcMCIrCi0gICAgIlwxXDM2M1wxXDEyNVwxXDBcNFwxMjVcMVwwXDFcMTI1XDFcMFwyXDEyNSIrCi0gICAgIlwxXDBcNlwxMjVcMVwwXDYxXDEyNVwxXDBcMVwzNjJcMVwzNjNcMVwxMjUiKwotICAgICJcMVwwXDRcMTI1XDFcMFwxXDEyNVwxXDBcMlwxMjVcMVwwXDZcMTI1IisKLSAgICAiXDFcMFw2MFwxMjVcMVwzNjRcMVwwXDEwXDM2NFwxXDM2NVwyXDM2NFwxXDM2NiIrCi0gICAgIlw0N1wzNjRcMVwzNjZcMjFcMzY0XDFcMzY3XDFcMFwxMlwzNjdcMVwzNjVcMVwzNzAiKwotICAgICJcNDdcMzY3XDFcMzcwXDIxXDM2N1wyXDBcMVwxMzNcMVwzNzFcMTExXDBcNFwxMzUiKwotICAgICJcNlwwXDFcMTM1XDZcMFw2XDEzNVwxXDBcMTNcMTM1XDFcMFwxM1wxMzUiKwotICAgICJcMVwwXDRcMTM1XDFcMFwxMVwxMzVcMlwwXDFcMTM1XDFcMTM3XDJcMCIrCi0gICAgIlwxXDM3MlwxXDEzN1wxXDBcNFwxMzdcMVwwXDFcMTM3XDFcMFwyXDEzNyIrCi0gICAgIlwxXDBcNlwxMzdcMVwwXDYxXDEzN1wxXDBcMVwxMzNcMVwzNzNcMVwxMzciKwotICAgICJcMVwwXDRcMTM3XDFcMFwxXDEzN1wxXDBcMlwxMzdcMVwwXDZcMTM3IisKLSAgICAiXDFcMFw2MFwxMzdcMVwxNDFcMVwwXDFcMzc0XDFcMzc1XDFcMTQxXDFcMzc0IisKLSAgICAiXDRcMTQxXDFcMzc2XDFcMTQxXDFcMzc0XDFcMzc3XDFcMTQxXDFcMzc0XDZcMTQxIisKLSAgICAiXDFcMzc0XDM2XDE0MVwxXDM3N1wyMVwxNDFcMVwxNDJcMVwwXDFcdTAxMDBcMVx1MDEwMSIrCi0gICAgIlwxXDE0MlwxXHUwMTAwXDRcMTQyXDFcdTAxMDBcMVwxNDJcMVwzNzZcMVx1MDEwMlwxXDE0MiIrCi0gICAgIlwxXHUwMTAwXDZcMTQyXDFcdTAxMDBcMzZcMTQyXDFcdTAxMDJcMjFcMTQyXDJcMFwxXHUwMTAzIisKLSAgICAiXDEyNlwwXDFcMzM3XDJcMFwxXHUwMTA0XDY3XDBcNFwxNDdcNlwwXDFcMTQ3IisKLSAgICAiXDZcMFw2XDE0N1wxXDBcMTNcMTQ3XDFcMFwxM1wxNDdcMVwwXDRcMTQ3IisKLSAgICAiXDFcMFwxMVwxNDdcMlwwXDFcMTQ3XDJcMFwxXHUwMTA1XDExMVwwXDFcMTUxIisKLSAgICAiXDExXDBcMVwxNTFcNlwwXDFcMTUxXDY2XDBcNFwxNTJcNlwwXDFcMTUyIisKLSAgICAiXDZcMFw2XDE1MlwxXDBcMTNcMTUyXDFcMFwxM1wxNTJcMVwwXDRcMTUyIisKLSAgICAiXDFcMFwxMVwxNTJcMlwwXDFcMTUyXDFcMTU0XDJcMFwxXHUwMTA2XDFcMTU0IisKLSAgICAiXDFcMFw0XDE1NFwxXDBcMVwxNTRcMVwwXDJcMTU0XDFcMFw2XDE1NCIrCi0gICAgIlwxXDBcNjBcMTU0XDFcdTAxMDdcMVwwXDEwXHUwMTA3XDFcdTAxMDhcMlx1MDEwN1wxXHUwMTA5IisKLSAgICAiXDQ3XHUwMTA3XDFcdTAxMDlcMjFcdTAxMDdcMVx1MDEwYVwxXDBcMTJcdTAxMGFcMVx1MDEwOFwxXHUwMTBiIisKLSAgICAiXDQ3XHUwMTBhXDFcdTAxMGJcMjFcdTAxMGFcMVwxNTRcMVwwXDFcdTAxMDVcMVx1MDEwNlwxXDE1NCIrCi0gICAgIlwxXDBcNFwxNTRcMVwwXDFcMTU0XDFcMFwyXDE1NFwxXDBcNlwxNTQiKwotICAgICJcMVwwXDYwXDE1NFwxXDE2MVwzXDBcMjNcMTYxXDZcMFwxXDE2MVwxM1wwIisKLSAgICAiXDFcMTYxXDEzXDBcMVwxNjFcNFwwXDFcMTYxXDRcMFwxXDE2MVw0XDAiKwotICAgICJcMlwxNjFcNFwwXDFcMzM1XDE2XDBcMVwzMzdcMlwwXDFcMzQwXDYzXDAiKwotICAgICJcMVx1MDEwY1wxMDRcMFwxXDE2MVwzXDBcMlwxNjFcNFwxNjVcNlwxNjFcMVwxNjUiKwotICAgICJcNlwxNjFcNlwxNjZcMVwxNjFcMTNcMTY2XDFcMTYxXDEzXDE2NlwxXDE2MVw0XDE2NiIrCi0gICAgIlwxXDE2MVw0XDE2NlwxXDE2NVw0XDE2NlwyXDE2MVwxXDE2Nlw2XDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFw3XDE2NlwxXHUwMTBkXDNcMTY2IisKLSAgICAiXDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2IisKLSAgICAiXDNcMFwxXDMzNVw0XDBcMlx1MDEwZVwxMFwwXDFcMzM3XDJcMFwxXDM0MCIrCi0gICAgIlwxXDBcNlx1MDEwZVwxXDBcMTNcdTAxMGVcMVwwXDEzXHUwMTBlXDFcMFw0XHUwMTBlIisKLSAgICAiXDFcMFw0XHUwMTBlXDFcMFw0XHUwMTBlXDJcMFwxXHUwMTBlXDZcMFw0XDE3MSIrCi0gICAgIlw2XDBcMVwxNzFcNlwwXDZcMTcxXDFcMFwxM1wxNzFcMVwwXDEzXDE3MSIrCi0gICAgIlwxXDBcNFwxNzFcMVwwXDExXDE3MVwyXDBcMVwxNzFcMVwxNzNcMlwwIisKLSAgICAiXDFcdTAxMGZcMVwxNzNcMVwwXDRcMTczXDFcMFwxXDE3M1wxXDBcMlwxNzMiKwotICAgICJcMVwwXDZcMTczXDFcMFw2MFwxNzNcM1wwXDFcMzM1XDRcMFwyXHUwMTEwIisKLSAgICAiXDEwXDBcMVwzMzdcMlwwXDFcMzQwXDFcMFw2XHUwMTEwXDFcMFwxM1x1MDExMCIrCi0gICAgIlwxXDBcMTNcdTAxMTBcMVwwXDRcdTAxMTBcMVwwXDRcdTAxMTBcMVwwXDRcdTAxMTAiKwotICAgICJcMlwwXDFcdTAxMTBcMVwxNzNcMVwwXDFcdTAxMGNcMVx1MDEwZlwxXDE3M1wxXDAiKwotICAgICJcNFwxNzNcMVwwXDFcMTczXDFcMFwyXDE3M1wxXDBcNlwxNzNcMVwwIisKLSAgICAiXDYwXDE3M1wxXHUwMTExXDFcMFwxMFx1MDExMVwxXHUwMTEyXDJcdTAxMTFcMVx1MDExM1w0N1x1MDExMSIrCi0gICAgIlwxXHUwMTEzXDIxXHUwMTExXDFcdTAxMTRcMVwwXDEyXHUwMTE0XDFcdTAxMTJcMVx1MDExNVw0N1x1MDExNCIrCi0gICAgIlwxXHUwMTE1XDIxXHUwMTE0XDFcMTczXDJcMFwxXHUwMTBmXDFcMTczXDFcMFw0XDE3MyIrCi0gICAgIlwxXDBcMVwxNzNcMVwwXDFcMTczXDFcdTAxMTZcMVwwXDZcMTczXDFcMCIrCi0gICAgIlw2MVwxNzNcMlwwXDFcdTAxMGZcMVwxNzNcMVwwXDRcMTczXDFcMFwxXDE3MyIrCi0gICAgIlwxXDBcMVwxNzNcMVx1MDExN1wxXDBcNlwxNzNcMVwwXDYwXDE3M1wzXDAiKwotICAgICJcMVwzMzVcMTZcMFwxXDMzN1wyXDBcMVx1MDEwNFwxMzBcMFwxXHUwMTE4XDJcMCIrCi0gICAgIlwxXHUwMTE4XDc1XDBcMVx1MDExOVwxNFwwXDFcdTAxMTlcNjNcMFwyXHUwMTFhXDUyXDAiKwotICAgICJcMjNcdTAxMWJcMVx1MDExY1w2M1x1MDExYlw2XDBcNFwyMTBcNlwwXDFcMjEwXDZcMCIrCi0gICAgIlw2XDIxMFwxXDBcMTNcMjEwXDFcMFwxM1wyMTBcMVwwXDRcMjEwXDFcMCIrCi0gICAgIlwxMVwyMTBcMlwwXDFcMjEwXDUzXDBcMVx1MDExZFw1XDBcMVx1MDExZFwxMTZcMCIrCi0gICAgIlwxXHUwMTFlXDEwXDBcMVx1MDExZVw0XDBcMVwyMTNcMlwwXDFcdTAxMWZcMVwyMTMiKwotICAgICJcMVwwXDRcMjEzXDFcMFwxXDIxM1wxXDBcMlwyMTNcMVwwXDZcMjEzIisKLSAgICAiXDFcMFw2MFwyMTNcMVx1MDEyMFwxXDBcMTBcdTAxMjBcMVx1MDEyMVwyXHUwMTIwXDFcdTAxMjIiKwotICAgICJcNDdcdTAxMjBcMVx1MDEyMlwyMVx1MDEyMFwxXHUwMTIzXDFcMFwxXHUwMTIzXDJcdTAxMjRcMVx1MDEyMyIrCi0gICAgIlw0XHUwMTI0XDJcdTAxMjNcMVx1MDEyNVwxXHUwMTI2XDFcdTAxMjNcNFx1MDEyNFwxXHUwMTIzXDExXHUwMTI0IisKLSAgICAiXDFcdTAxMjNcMjdcdTAxMjRcMVx1MDEyNlwxMFx1MDEyNFwyXHUwMTIzXDRcdTAxMjRcMlx1MDEyM1wxXHUwMTI0IisKLSAgICAiXDFcMjE3XDJcdTAxMWJcMVx1MDEyN1wxXDIxN1wxXHUwMTFiXDRcMjE3XDFcdTAxMWJcMVwyMTciKwotICAgICJcMVx1MDExYlwyXDIxN1wxXHUwMTFiXDNcMjE3XDFcdTAxMjhcMlwyMTdcMVx1MDExYlw2MFwyMTciKwotICAgICJcMVwyMjBcMlwwXDFcdTAxMjlcMVwyMjBcMVwwXDRcMjIwXDFcMFwxXDIyMCIrCi0gICAgIlwxXDBcMlwyMjBcMVwwXDZcMjIwXDFcMFw2MFwyMjBcMTJcdTAxMmFcMVx1MDEyYiIrCi0gICAgIlw3NFx1MDEyYVwxNFx1MDEyY1wxXHUwMTJiXDcyXHUwMTJjXDFcMjI0XDJcdTAxMWJcMVx1MDEyZFwxXDIyNCIrCi0gICAgIlwxXHUwMTFiXDRcMjI0XDFcdTAxMWJcMVwyMjRcMVx1MDExYlwyXDIyNFwxXHUwMTFiXDNcMjI0IisKLSAgICAiXDFcdTAxMmVcMlwyMjRcMVx1MDExYlw2MFwyMjRcMVwyMjVcMlwwXDFcdTAxMmZcMVwyMjUiKwotICAgICJcMVwwXDRcMjI1XDFcMFwxXDIyNVwxXDBcMlwyMjVcMVwwXDZcMjI1IisKLSAgICAiXDFcMFw2MFwyMjVcMVx1MDEzMFwxXDBcMTBcdTAxMzBcMVx1MDEzMVwyXHUwMTMwXDFcdTAxMzIiKwotICAgICJcNDdcdTAxMzBcMVx1MDEzMlwyMVx1MDEzMFwxXHUwMTMzXDFcMFwxXHUwMTMzXDJcdTAxMzRcMVx1MDEzMyIrCi0gICAgIlw0XHUwMTM0XDJcdTAxMzNcMVx1MDEzNVwxXHUwMTM2XDFcdTAxMzNcNFx1MDEzNFwxXHUwMTMzXDExXHUwMTM0IisKLSAgICAiXDFcdTAxMzNcMjdcdTAxMzRcMVx1MDEzNlwxMFx1MDEzNFwyXHUwMTMzXDRcdTAxMzRcMlx1MDEzM1wxXHUwMTM0IisKLSAgICAiXDJcMjMxXDFcMFwxMDZcMjMxXDFcMFwxN1wyMzFcMVx1MDEzN1wyXDIzMVwxXHUwMTM4IisKLSAgICAiXDYxXDIzMVwxXDIzNFwyXDBcMVx1MDEzOVwxXDIzNFwxXDBcNFwyMzRcMVwwIisKLSAgICAiXDFcMjM0XDFcMFwyXDIzNFwxXDBcNlwyMzRcMVwwXDYwXDIzNFwxXHUwMTNhIisKLSAgICAiXDFcMFwxMFx1MDEzYVwxXHUwMTNiXDJcdTAxM2FcMVx1MDEzY1w0N1x1MDEzYVwxXHUwMTNjXDIxXHUwMTNhIisKLSAgICAiXDFcdTAxM2RcMVwwXDFcdTAxM2RcMlx1MDEzZVwxXHUwMTNkXDRcdTAxM2VcMlx1MDEzZFwxXHUwMTNmIisKLSAgICAiXDFcdTAxNDBcMVx1MDEzZFw0XHUwMTNlXDFcdTAxM2RcMTFcdTAxM2VcMVx1MDEzZFwyN1x1MDEzZVwxXHUwMTQwIisKLSAgICAiXDEwXHUwMTNlXDJcdTAxM2RcNFx1MDEzZVwyXHUwMTNkXDFcdTAxM2VcMlwyNDBcMVwwXDEwNlwyNDAiKwotICAgICJcMVwwXDE3XDI0MFwxXHUwMTQxXDJcMjQwXDFcdTAxNDJcNjFcMjQwXDdcMFwxXHUwMTQzIisKLSAgICAiXDc3XDBcMVwyNTBcMVwwXDEyXDI1MFwxXDBcMVx1MDE0NFw0N1wyNTBcMVx1MDE0NCIrCi0gICAgIlwyMVwyNTBcM1wwXDFcdTAxNDVcMTZcMFwxXDMzN1wyXDBcMVwzNTJcNjFcMCIrCi0gICAgIlwxXDI1MFwxXDBcM1wyNTBcMVwyNTJcNlwyNTBcMVwwXDFcdTAxNDRcMVwyNTAiKwotICAgICJcMVwyNTJcNlwyNTBcMVwyNTJcMzZcMjUwXDFcdTAxNDRcMzdcMjUwXDFcdTAxNDZcMTA2XDI1MCIrCi0gICAgIlwxXHUwMTQ3XDcwXDI1MFwxXDI1NlwxXDBcMTBcMjU2XDFcMFwyXDI1NlwxXHUwMTQ4IisKLSAgICAiXDQ3XDI1NlwxXHUwMTQ4XDIyXDI1NlwxXDBcM1wyNTZcMVwyNTdcNFwyNTZcMVwwIisKLSAgICAiXDJcMjU2XDFcdTAxNDhcMVwyNTZcMVwyNTdcNlwyNTZcMVwyNTdcMzZcMjU2XDFcdTAxNDgiKwotICAgICJcMzdcMjU2XDFcdTAxNDlcMTA2XDI1NlwxXHUwMTRhXDcwXDI1NlwxMlwyNjNcMVwwXDFcMjYzIisKLSAgICAiXDFcMFwxXHUwMTRiXDY3XDI2M1wxXDBcMTNcMjYzXDFcMFwxXDI2M1wxXDAiKwotICAgICJcMVx1MDE0Ylw0XDI2M1wxXHUwMTRjXDYyXDI2M1wxXDBcMTNcMjYzXDFcMFwxXDI2MyIrCi0gICAgIlwxXDBcMVwyNjNcMVx1MDE0ZFw2NlwyNjNcMVx1MDE0ZVwxXDI2M1wxNFx1MDE0ZlwxXHUwMTUwIisKLSAgICAiXDEwNlx1MDE0ZlwxXHUwMTUwXDVcdTAxNGZcMVx1MDE1MVwyXHUwMTRmXDFcdTAxNTJcNjFcdTAxNGZcMTJcdTAxNTMiKwotICAgICJcMVx1MDE1NFwxMDZcdTAxNTNcMVx1MDE1NFw3XHUwMTUzXDFcdTAxNTVcMlx1MDE1M1wxXHUwMTU2XDYxXHUwMTUzIisKLSAgICAiXDEyXDMwMVwxXDBcNzFcMzAxXDFcdTAxNTdcMVwwXDEzXDMwMVwxXDBcN1wzMDEiKwotICAgICJcMVx1MDE1OFw2MVwzMDFcMVx1MDE1N1wxXDBcMTNcMzAxXDFcdTAxNTlcNzRcMzAxXDE0XDMwNSIrCi0gICAgIlwxXDBcNjdcMzA1XDFcdTAxNWFcMVwwXDE1XDMwNVwxXDBcNVwzMDVcMVx1MDE1YiIrCi0gICAgIlw2MVwzMDVcMVx1MDE1YVwxXDBcMTVcMzA1XDFcdTAxNWNcNzJcMzA1XDEyXDMxMFwxXDAiKwotICAgICJcMVwzMTBcMVwwXDcwXDMxMFwxXDBcMTNcMzEwXDFcMFwxXDMxMFwxXDAiKwotICAgICJcNVwzMTBcMVx1MDE1ZFw2MlwzMTBcMVwwXDEzXDMxMFwxXDBcMVwzMTBcMVwwIisKLSAgICAiXDFcMzEwXDFcdTAxNWVcNjZcMzEwXDFcMFwxXDMxMFwxNFx1MDE1ZlwxXHUwMTYwXDEwNlx1MDE1ZiIrCi0gICAgIlwxXHUwMTYwXDVcdTAxNWZcMVx1MDE2MVwyXHUwMTVmXDFcdTAxNjJcNjFcdTAxNWZcMTJcdTAxNjNcMVx1MDE2NCIrCi0gICAgIlwxMDZcdTAxNjNcMVx1MDE2NFw3XHUwMTYzXDFcdTAxNjVcMlx1MDE2M1wxXHUwMTY2XDYxXHUwMTYzXDEyXDMyNiIrCi0gICAgIlwxXDBcNzFcMzI2XDFcdTAxNjdcMVwwXDEzXDMyNlwxXDBcN1wzMjZcMVx1MDE2OCIrCi0gICAgIlw2MVwzMjZcMVx1MDE2N1wxXDBcMTNcMzI2XDFcdTAxNjlcNzRcMzI2XDE0XDMzMlwxXDAiKwotICAgICJcNjdcMzMyXDFcdTAxNmFcMVwwXDE1XDMzMlwxXDBcNVwzMzJcMVx1MDE2Ylw2MVwzMzIiKwotICAgICJcMVx1MDE2YVwxXDBcMTVcMzMyXDFcdTAxNmNcNzJcMzMyXDdcMFwxXHUwMTZkXDExXDAiKwotICAgICJcMVx1MDE2ZVwzXDBcMVx1MDE2ZlwyM1wwXDFcdTAxNzBcNDRcMFwxXHUwMTcxXDI1XDAiKwotICAgICJcMVx1MDE3Mlw1NlwwXDFcMzQxXDJcMFwyXHUwMTczXDVcMFwxXDM0MVw2XDAiKwotICAgICJcMVwzNDFcNlx1MDE3M1wxXDBcMTNcdTAxNzNcMVwwXDEzXHUwMTczXDFcMFw0XHUwMTczIisKLSAgICAiXDFcMFw0XHUwMTczXDFcMFw0XHUwMTczXDJcMFwxXHUwMTczXDFcdTAxNzRcMVwwIisKLSAgICAiXDNcdTAxNzRcMVx1MDE3NVw0XDM0MlwxXHUwMTc0XDFcMFwzXHUwMTc0XDFcdTAxNzVcMVwzNDIiKwotICAgICJcMVx1MDE3NFwxXDBcM1x1MDE3NFwxXHUwMTc1XDZcMzQyXDFcdTAxNzRcMTNcMzQyXDFcdTAxNzQiKwotICAgICJcMTNcMzQyXDFcdTAxNzRcNFwzNDJcMVx1MDE3NlwxMVwzNDJcMlx1MDE3NFwxXDM0MlwyMFwwIisKLSAgICAiXDFcdTAxNzdcN1wwXDFcdTAxNzhcNzNcMFwxXDM0NVw3MVwwXDEwNVwzNDZcMVx1MDE3OSIrCi0gICAgIlwxXDM0NlwxXHUwMTc0XDFcMFwzXHUwMTc0XDFcdTAxNzVcNFwzNDdcMVx1MDE3NFwxXDAiKwotICAgICJcM1x1MDE3NFwxXHUwMTc1XDFcMzQ3XDFcdTAxNzRcMVwwXDNcdTAxNzRcMVx1MDE3NVw2XDM0NyIrCi0gICAgIlwxXHUwMTc0XDEzXDM0N1wxXHUwMTc0XDEzXDM0N1wxXHUwMTc0XDRcMzQ3XDFcdTAxN2FcMTFcMzQ3IisKLSAgICAiXDJcdTAxNzRcMVwzNDdcMTA1XDM1MFwxXHUwMTdiXDFcMzUwXDY1XDBcMVwzNTFcNTZcMCIrCi0gICAgIlwxXHUwMTcyXDUzXDBcMVx1MDE3Y1wxMDZcMFwxXHUwMTdkXDExMlwwXDRcMTEyXDZcMCIrCi0gICAgIlwxXDExMlw2XDBcNFwxMTJcMlx1MDE3ZVwxXDBcMTNcMTEyXDFcMFwxM1wxMTIiKwotICAgICJcMVwwXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDExMiIrCi0gICAgIlw2XDBcMVwxMTJcNlwwXDRcMTEyXDFcdTAxN2VcMVx1MDE3ZlwxXDBcMTNcMTEyIisKLSAgICAiXDFcMFwxM1wxMTJcMVwwXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyIisKLSAgICAiXDZcMFw0XDExMlw2XDBcMVwxMTJcNlwwXDZcMTEyXDFcMFwxM1wxMTIiKwotICAgICJcMVwwXDJcMTEyXDFcdTAxODBcMTBcMTEyXDFcMFw0XDExMlwxXDBcNlwxMTIiKwotICAgICJcMVx1MDE4MFwyXDExMlwyXDBcMVwxMTJcMTJcMzY0XDFcMzY1XDNcMzY0XDFcMCIrCi0gICAgIlw3MFwzNjRcMTRcMzY3XDFcMzY1XDFcMzY3XDFcMFw3MFwzNjdcMVwzNzRcMVwwIisKLSAgICAiXDEwXDM3NFwxXDM3NlwyXDM3NFwxXHUwMTgxXDQ3XDM3NFwxXHUwMTgxXDIxXDM3NFwxXDE0MSIrCi0gICAgIlwyXDM3NFwxXDM3NVwxXDE0MVwxXDM3NFw0XDE0MVwxXDM3NlwxXDE0MVwxXDM3NCIrCi0gICAgIlwxXDE0MVwxXDEzN1wxXDM3NFw2XDE0MVwxXDM3NFw2MFwxNDFcMVx1MDEwMFwxXDAiKwotICAgICJcMTJcdTAxMDBcMVwzNzZcMVx1MDE4Mlw0N1x1MDEwMFwxXHUwMTgyXDIxXHUwMTAwXDFcMTQyXDJcdTAxMDAiKwotICAgICJcMVx1MDEwMVwxXDE0MlwxXHUwMTAwXDRcMTQyXDFcdTAxMDBcMVwxNDJcMVwzNzZcMVwxNDIiKwotICAgICJcMVwxMzdcMVx1MDEwMFw2XDE0MlwxXHUwMTAwXDYwXDE0MlwxMlx1MDEwN1wxXHUwMTA4XDNcdTAxMDciKwotICAgICJcMVwwXDcwXHUwMTA3XDE0XHUwMTBhXDFcdTAxMDhcMVx1MDEwYVwxXDBcNzBcdTAxMGFcNlwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw0XDE2NlwxXDBcNlwxNjZcMVx1MDE4M1wyXDE2NlwyXDAiKwotICAgICJcMVwxNjZcNlwwXDRcdTAxMGVcNlwwXDFcdTAxMGVcNlwwXDZcdTAxMGVcMVwwIisKLSAgICAiXDEzXHUwMTBlXDFcMFwxM1x1MDEwZVwxXDBcNFx1MDEwZVwxXDBcMTFcdTAxMGVcMlwwIisKLSAgICAiXDFcdTAxMGVcNlwwXDRcdTAxMTBcNlwwXDFcdTAxMTBcNlwwXDZcdTAxMTBcMVwwIisKLSAgICAiXDEzXHUwMTEwXDFcMFwxM1x1MDExMFwxXDBcNFx1MDExMFwxXDBcMTFcdTAxMTBcMlwwIisKLSAgICAiXDFcdTAxMTBcMTJcdTAxMTFcMVx1MDExMlwzXHUwMTExXDFcMFw3MFx1MDExMVwxNFx1MDExNFwxXHUwMTEyIisKLSAgICAiXDFcdTAxMTRcMVwwXDcwXHUwMTE0XDFcdTAxODRcMlx1MDE4NVwxXHUwMTg2XDFcdTAxODRcMVx1MDE4NSIrCi0gICAgIlw0XHUwMTg0XDFcdTAxODVcMVx1MDE4NFwxXHUwMTg1XDJcdTAxODRcMVx1MDE4NVw2XHUwMTg0XDFcdTAxODUiKwotICAgICJcNTZcdTAxODRcMVwxNzNcMVx1MDE4NFwxXHUwMTg3XDJcdTAxODhcMVx1MDE4OVwxXHUwMTg3XDFcdTAxODgiKwotICAgICJcNFx1MDE4N1wxXHUwMTg4XDFcdTAxODdcMVx1MDE4OFwyXHUwMTg3XDFcdTAxODhcNlx1MDE4N1wxXHUwMTg4IisKLSAgICAiXDU2XHUwMTg3XDFcMTczXDFcdTAxODdcMzZcMFwxXHUwMThhXDM1XDBcMVx1MDE4YVw1M1wwIisKLSAgICAiXDFcdTAxOGJcMTRcMFwxXHUwMThiXDczXDBcMVx1MDE4Y1wxMVwwXDFcdTAxOGNcNzZcMCIrCi0gICAgIlwxXHUwMThkXDIwXDBcMVx1MDE4ZFwxMTNcMFwxXHUwMThlXDdcMFwxXHUwMThlXDNcMCIrCi0gICAgIlwxMlx1MDEyMFwxXHUwMTIxXDNcdTAxMjBcMVwwXDcwXHUwMTIwXDFcdTAxMjNcMVwwXDEyXHUwMTIzIisKLSAgICAiXDFcdTAxMjFcMVx1MDE4Zlw0N1x1MDEyM1wxXHUwMThmXDIyXHUwMTIzXDFcMFwxMlx1MDEyM1wxXHUwMTkwIisKLSAgICAiXDFcdTAxOGZcNDdcdTAxMjNcMVx1MDE4ZlwyMVx1MDEyM1wxNFwwXDFcdTAxOTFcNzJcMFwxNFx1MDEyMyIrCi0gICAgIlwxXHUwMTkwXDFcdTAxMjNcMVwwXDcwXHUwMTIzXDEyXHUwMTMwXDFcdTAxMzFcM1x1MDEzMFwxXDAiKwotICAgICJcNzBcdTAxMzBcMVx1MDEzM1wxXDBcMTJcdTAxMzNcMVx1MDEzMVwxXHUwMTkyXDQ3XHUwMTMzXDFcdTAxOTIiKwotICAgICJcMjJcdTAxMzNcMVwwXDEyXHUwMTMzXDFcdTAxOTNcMVx1MDE5Mlw0N1x1MDEzM1wxXHUwMTkyXDIxXHUwMTMzIisKLSAgICAiXDE0XDBcMVx1MDE5NFw3MlwwXDE0XHUwMTMzXDFcdTAxOTNcMVx1MDEzM1wxXDBcNzBcdTAxMzMiKwotICAgICJcMlwyMzFcMVwwXDRcMjMxXDFcdTAxOTVcMTFcMjMxXDFcdTAxOTZcM1wyMzFcMVx1MDE5NyIrCi0gICAgIlwyM1wyMzFcMVx1MDE5OFwzN1wyMzFcMVwwXDMyXDIzMVwxXHUwMTk5XDUxXDIzMVwxMlx1MDEzYSIrCi0gICAgIlwxXHUwMTNiXDNcdTAxM2FcMVwwXDcwXHUwMTNhXDFcdTAxM2RcMVwwXDEyXHUwMTNkXDFcdTAxM2IiKwotICAgICJcMVx1MDE5YVw0N1x1MDEzZFwxXHUwMTlhXDIyXHUwMTNkXDFcMFwxMlx1MDEzZFwxXHUwMTliXDFcdTAxOWEiKwotICAgICJcNDdcdTAxM2RcMVx1MDE5YVwyMVx1MDEzZFwxNFwwXDFcdTAxOWNcNzJcMFwxNFx1MDEzZFwxXHUwMTliIisKLSAgICAiXDFcdTAxM2RcMVwwXDcwXHUwMTNkXDJcMjQwXDFcMFw0XDI0MFwxXHUwMTlkXDExXDI0MCIrCi0gICAgIlwxXHUwMTllXDNcMjQwXDFcdTAxOWZcMjNcMjQwXDFcdTAxYTBcMzdcMjQwXDFcMFwzMlwyNDAiKwotICAgICJcMVx1MDFhMVw1MVwyNDBcMjJcMFwxXHUwMWEyXDY0XDBcMTZcMjUwXDFcMFw3MFwyNTAiKwotICAgICJcMTZcMjU2XDFcMFw3MFwyNTZcMTJcMjYzXDFcMFwxXDI2M1wxXDBcMVwyNjMiKwotICAgICJcMVx1MDFhM1w2NlwyNjNcMVx1MDE0ZVwxMFwyNjNcMVx1MDFhNFwyXDI2M1wxXDBcMVwyNjMiKwotICAgICJcMVwwXDFcdTAxNGJcM1wyNjNcMVx1MDFhNVwzXDI2M1wxXHUwMWE2XDIzXDI2M1wxXHUwMWE3IisKLSAgICAiXDMzXDI2M1wxXDBcMVwyNjNcMTJcdTAxYTNcMVwwXDFcdTAxYTNcMVwwXDcwXHUwMWEzIisKLSAgICAiXDFcMFwxXHUwMWEzXDEyXHUwMTRlXDFcMFwxXHUwMTRlXDFcMFwxXHUwMWE4XDY3XHUwMTRlIisKLSAgICAiXDFcMFwxXHUwMTRlXDdcdTAxNGZcMVx1MDFhOVw0XHUwMTRmXDFcdTAxNTBcNFx1MDE0ZlwxXHUwMWFhIisKLSAgICAiXDNcdTAxNGZcMVx1MDFhYlwyM1x1MDE0ZlwxXHUwMWFjXDUxXHUwMTRmXDFcdTAxNTBcMjBcdTAxNGZcMVx1MDFhZCIrCi0gICAgIlw1MVx1MDE0Zlw3XHUwMTUzXDFcdTAxYWVcMlx1MDE1M1wxXHUwMTU0XDZcdTAxNTNcMVx1MDFhZlwzXHUwMTUzIisKLSAgICAiXDFcdTAxYjBcMjNcdTAxNTNcMVx1MDFiMVw0N1x1MDE1M1wxXHUwMTU0XDIyXHUwMTUzXDFcdTAxYjJcNTFcdTAxNTMiKwotICAgICJcMTJcMzAxXDFcMFwxMDNcMzAxXDFcdTAxYjNcMlwzMDFcMVwwXDZcMzAxXDFcdTAxYjQiKwotICAgICJcM1wzMDFcMVx1MDFiNVwyM1wzMDFcMVx1MDFiNlwzMlwzMDFcMVx1MDE1N1wxXDBcMVwzMDEiKwotICAgICJcMTA0XHUwMWI3XDFcdTAxYjhcMlx1MDFiN1wxNFwzMDVcMVwwXDEwMVwzMDVcMVx1MDFiOVw0XDMwNSIrCi0gICAgIlwxXDBcNFwzMDVcMVx1MDFiYVwzXDMwNVwxXHUwMWJiXDIzXDMwNVwxXHUwMWJjXDMyXDMwNSIrCi0gICAgIlwxXHUwMTVhXDFcMFwxXDMwNVwxMDRcdTAxYmRcMVx1MDFiZVwyXHUwMWJkXDdcMzEwXDFcdTAxYmYiKwotICAgICJcMlwzMTBcMVwwXDFcMzEwXDFcMFw0XDMxMFwxXHUwMWMwXDNcMzEwXDFcdTAxYzEiKwotICAgICJcMjNcMzEwXDFcdTAxYzJcMzNcMzEwXDFcMFwxXDMxMFw3XHUwMTVmXDFcdTAxYzNcNFx1MDE1ZiIrCi0gICAgIlwxXHUwMTYwXDRcdTAxNWZcMVx1MDFjNFwzXHUwMTVmXDFcdTAxYzVcMjNcdTAxNWZcMVx1MDFjNlw1MVx1MDE1ZiIrCi0gICAgIlwxXHUwMTYwXDIwXHUwMTVmXDFcdTAxYzdcNTFcdTAxNWZcN1x1MDE2M1wxXHUwMWM4XDJcdTAxNjNcMVx1MDE2NCIrCi0gICAgIlw2XHUwMTYzXDFcdTAxYzlcM1x1MDE2M1wxXHUwMWNhXDIzXHUwMTYzXDFcdTAxY2JcNDdcdTAxNjNcMVx1MDE2NCIrCi0gICAgIlwyMlx1MDE2M1wxXHUwMWNjXDUxXHUwMTYzXDEyXDMyNlwxXDBcMTAzXDMyNlwxXHUwMWNkXDJcMzI2IisKLSAgICAiXDFcMFw2XDMyNlwxXHUwMWNlXDNcMzI2XDFcdTAxY2ZcMjNcMzI2XDFcdTAxZDBcMzJcMzI2IisKLSAgICAiXDFcdTAxNjdcMVwwXDFcMzI2XDEwNFx1MDFkMVwxXHUwMWQyXDJcdTAxZDFcMTRcMzMyXDFcMCIrCi0gICAgIlwxMDFcMzMyXDFcdTAxZDNcNFwzMzJcMVwwXDRcMzMyXDFcdTAxZDRcM1wzMzJcMVx1MDFkNSIrCi0gICAgIlwyM1wzMzJcMVx1MDFkNlwzMlwzMzJcMVx1MDE2YVwxXDBcMVwzMzJcMTA0XHUwMWQ3XDFcdTAxZDgiKwotICAgICJcMlx1MDFkN1w3XDBcMVx1MDFkOVwxMDZcMFwxXHUwMWRhXDEzNVwwXDFcdTAxZGJcNTBcMCIrCi0gICAgIlwxXHUwMTczXDFcMFwxMVx1MDE3M1wxXDBcNlx1MDE3M1wxXDBcNjRcdTAxNzNcMVx1MDE3NCIrCi0gICAgIlwxXDBcMTFcdTAxNzRcMVwwXDZcdTAxNzRcMVwwXDQ3XHUwMTc0XDFcMFwxNVx1MDE3NCIrCi0gICAgIlwxXDBcM1x1MDE3NFwxXHUwMTc1XDVcdTAxNzRcMVwwXDNcdTAxNzRcMVx1MDE3NVwyXHUwMTc0IisKLSAgICAiXDFcMFwzXHUwMTc0XDFcdTAxNzVcNDNcdTAxNzRcMVx1MDFkY1wxNFx1MDE3NFwyMFwwXDFcdTAxNzciKwotICAgICJcNTFcMFwxXHUwMWRkXDM0XDBcMVx1MDFkZVwxNVwwXDNcdTAxZGVcMlwwXDFcdTAxZGUiKwotICAgICJcMTFcMFwxXHUwMWRlXDFcMFwyXHUwMWRlXDdcMFwxXHUwMWRlXDJcMFwyXHUwMWRlIisKLSAgICAiXDZcMFwxXHUwMWRlXDExXDBcMVwxMTJcMVx1MDFkZlwyXDExMlw2XDBcMVwxMTIiKwotICAgICJcNlwwXDZcMTEyXDFcMFwxM1wxMTJcMVwwXDEzXDExMlwxXDBcNFwxMTIiKwotICAgICJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwXDRcMTEyXDZcMFwxXDExMiIrCi0gICAgIlw2XDBcNlwxMTJcMVwwXDExXDExMlwxXHUwMWUwXDFcMTEyXDFcMFwxXHUwMWUwIisKLSAgICAiXDEyXDExMlwxXDBcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcMTJcMzc0IisKLSAgICAiXDFcMzc2XDNcMzc0XDFcMFw3MFwzNzRcMTRcdTAxMDBcMVwzNzZcMVx1MDEwMFwxXDAiKwotICAgICJcNzBcdTAxMDBcNlwwXDNcMTY2XDFcdTAxZTFcNlwwXDFcMTY2XDZcMFw2XDE2NiIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjYiKwotICAgICJcMlwwXDFcMTY2XDFcdTAxODRcMlx1MDE4NVwxXHUwMTg2XDFcdTAxODRcMVx1MDE4NVw0XHUwMTg0IisKLSAgICAiXDFcdTAxODVcMVx1MDE4NFwxXHUwMTg1XDJcdTAxODRcMVx1MDE4NVw2XHUwMTg0XDFcdTAxODVcNTZcdTAxODQiKwotICAgICJcMVx1MDFlMlwxXHUwMTg0XDEwNVx1MDE4NVwxXHUwMWUzXDFcdTAxODVcMVx1MDE4N1wyXHUwMTg4XDFcdTAxODkiKwotICAgICJcMVx1MDE4N1wxXHUwMTg4XDRcdTAxODdcMVx1MDE4OFwxXHUwMTg3XDFcdTAxODhcMlx1MDE4N1wxXHUwMTg4IisKLSAgICAiXDZcdTAxODdcMVx1MDE4OFw1Nlx1MDE4N1wxXHUwMWUyXDFcdTAxODdcMTA1XHUwMTg4XDFcdTAxZTRcMVx1MDE4OCIrCi0gICAgIlw0MVwwXDFcdTAxZTVcMTRcMFwxXHUwMWU1XDYzXDBcMlx1MDFlNlwxMDNcMFwyXHUwMWU3IisKLSAgICAiXDExNVwwXDFcdTAxZThcMTRcMFwxXHUwMWU4XDYzXDBcMlx1MDFlOVw1MlwwXDE0XHUwMTIzIisKLSAgICAiXDFcdTAxMjFcMVx1MDEyM1wxXDBcNzBcdTAxMjNcM1wwXDJcdTAxZWFcMVwwXDRcdTAxZWEiKwotICAgICJcMlwwXDFcdTAxMjVcMVx1MDFlYVwxXDBcNFx1MDFlYVwxXDBcMTFcdTAxZWFcMVwwIisKLSAgICAiXDQwXHUwMWVhXDJcMFw0XHUwMWVhXDJcMFwxXHUwMWVhXDE0XHUwMTMzXDFcdTAxMzFcMVx1MDEzMyIrCi0gICAgIlwxXDBcNzBcdTAxMzNcM1wwXDJcdTAxZWJcMVwwXDRcdTAxZWJcMlwwXDFcdTAxMzUiKwotICAgICJcMVx1MDFlYlwxXDBcNFx1MDFlYlwxXDBcMTFcdTAxZWJcMVwwXDQwXHUwMWViXDJcMCIrCi0gICAgIlw0XHUwMWViXDJcMFwxXHUwMWViXDJcMjMxXDFcMFw0XDIzMVwxXHUwMWVjXDEwMVwyMzEiKwotICAgICJcMVwwXDMzXDIzMVwxXHUwMWVkXDUwXDIzMVwxNFx1MDEzZFwxXHUwMTNiXDFcdTAxM2RcMVwwIisKLSAgICAiXDcwXHUwMTNkXDNcMFwyXHUwMWVlXDFcMFw0XHUwMWVlXDJcMFwxXHUwMTNmXDFcdTAxZWUiKwotICAgICJcMVwwXDRcdTAxZWVcMVwwXDExXHUwMWVlXDFcMFw0MFx1MDFlZVwyXDBcNFx1MDFlZSIrCi0gICAgIlwyXDBcMVx1MDFlZVwyXDI0MFwxXDBcNFwyNDBcMVx1MDFlZlwxMDFcMjQwXDFcMCIrCi0gICAgIlwzM1wyNDBcMVx1MDFmMFw1MFwyNDBcMlwwXDFcdTAxZjFcMTA0XDBcN1wyNjNcMVx1MDFmMiIrCi0gICAgIlwyXDI2M1wxXDBcMVwyNjNcMVwwXDFcdTAxNGJcNjdcMjYzXDFcMFwxXDI2MyIrCi0gICAgIlwxMlx1MDE0ZVwxXDBcMVx1MDE0ZVwxXDBcMVx1MDE0ZVwxXDBcNzBcdTAxNGVcN1x1MDE0ZiIrCi0gICAgIlwxXHUwMWYzXDRcdTAxNGZcMVx1MDE1MFwxMDZcdTAxNGZcMVx1MDE1MFwyMVx1MDE0ZlwxXHUwMWY0XDUwXHUwMTRmIisKLSAgICAiXDdcdTAxNTNcMVx1MDFmNVwyXHUwMTUzXDFcdTAxNTRcMTA2XHUwMTUzXDFcdTAxNTRcMjNcdTAxNTNcMVx1MDFmNiIrCi0gICAgIlw1MFx1MDE1M1w3XDMwMVwxXHUwMWY3XDJcMzAxXDFcMFw3MVwzMDFcMVx1MDE1N1wxXDAiKwotICAgICJcMVwzMDFcMTJcdTAxZjhcMVx1MDFmOVw3Mlx1MDFmOFwxXDBcMVx1MDFmOFw3XDMwNVwxXHUwMWZhIisKLSAgICAiXDRcMzA1XDFcMFw2N1wzMDVcMVx1MDE1YVwxXDBcMVwzMDVcMTRcdTAxZmJcMVx1MDFmOSIrCi0gICAgIlw3MFx1MDFmYlwxXDBcMVx1MDFmYlw3XDMxMFwxXHUwMWZjXDJcMzEwXDFcMFwxXDMxMCIrCi0gICAgIlwxXDBcNzBcMzEwXDFcMFwxXDMxMFw3XHUwMTVmXDFcdTAxZmRcNFx1MDE1ZlwxXHUwMTYwIisKLSAgICAiXDEwNlx1MDE1ZlwxXHUwMTYwXDIxXHUwMTVmXDFcdTAxZmVcNTBcdTAxNWZcN1x1MDE2M1wxXHUwMWZmXDJcdTAxNjMiKwotICAgICJcMVx1MDE2NFwxMDZcdTAxNjNcMVx1MDE2NFwyM1x1MDE2M1wxXHUwMjAwXDUwXHUwMTYzXDdcMzI2XDFcdTAyMDEiKwotICAgICJcMlwzMjZcMVwwXDcxXDMyNlwxXHUwMTY3XDFcMFwxXDMyNlwxMlx1MDIwMlwxXHUwMjAzIisKLSAgICAiXDcyXHUwMjAyXDFcMFwxXHUwMjAyXDdcMzMyXDFcdTAyMDRcNFwzMzJcMVwwXDY3XDMzMiIrCi0gICAgIlwxXHUwMTZhXDFcMFwxXDMzMlwxNFx1MDIwNVwxXHUwMjAzXDcwXHUwMjA1XDFcMFwxXHUwMjA1IisKLSAgICAiXDM3XDBcMVx1MDIwNlwxNDFcMFwxXHUwMWRjXDM0XDBcMVx1MDFkZVwxNVwwXDNcdTAxZGUiKwotICAgICJcMlwwXDFcdTAxZGVcMTFcMFwxXHUwMWRlXDFcMFwyXHUwMWRlXDdcMFwxXHUwMWRlIisKLSAgICAiXDFcMFwxXHUwMWRkXDJcdTAxZGVcNlwwXDFcdTAxZGVcMTFcMFw0XDExMlw2XDAiKwotICAgICJcMVwxMTJcNlwwXDZcMTEyXDFcMFw3XDExMlwxXHUwMjA3XDNcMTEyXDFcMCIrCi0gICAgIlwxM1wxMTJcMVwwXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMCIrCi0gICAgIlw0XDExMlw2XDBcMVwxMTJcNlwwXDZcMTEyXDFcMFw2XDExMlwxXHUwMjA4IisKLSAgICAiXDRcMTEyXDFcMFwxM1wxMTJcMVwwXDFcMTEyXDFcdTAyMDhcMlwxMTJcMVwwIisKLSAgICAiXDExXDExMlwyXDBcMVwxMTJcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDZcMTY2XDFcdTAyMDlcNFwxNjZcMVwwXDZcMTY2XDFcdTAyMGEiKwotICAgICJcNFwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDUzXDAiKwotICAgICJcMVx1MDIwYlw1XDBcMVx1MDIwYlw3M1wwXDFcdTAyMGNcMTRcMFwxXHUwMjBjXDY2XDAiKwotICAgICJcMVx1MDIwZFwxMVwwXDFcdTAyMGRcNzRcMFwxXHUwMjBlXDExXDBcMVx1MDIwZVw3N1wwIisKLSAgICAiXDFcdTAyMGZcMTRcMFwxXHUwMjBmXDIzXDBcMlwyMzFcMVwwXDM0XDIzMVwxXHUwMjEwIisKLSAgICAiXDQ3XDIzMVwyXDI0MFwxXDBcMzRcMjQwXDFcdTAyMTFcNDdcMjQwXDE0XHUwMTRmXDFcdTAxNTAiKwotICAgICJcMjJcdTAxNGZcMVx1MDIxMlw0N1x1MDE0ZlwxMlx1MDE1M1wxXHUwMTU0XDI0XHUwMTUzXDFcdTAyMTNcNDdcdTAxNTMiKwotICAgICJcMTJcdTAxZjhcMVx1MDFiN1w3MVx1MDFmOFwxXHUwMjE0XDFcdTAxYjdcMVx1MDFmOFwxNFx1MDFmYlwxXHUwMWJkIisKLSAgICAiXDY3XHUwMWZiXDFcdTAyMTVcMVx1MDFiZFwxXHUwMWZiXDE0XHUwMTVmXDFcdTAxNjBcMjJcdTAxNWZcMVx1MDIxNiIrCi0gICAgIlw0N1x1MDE1ZlwxMlx1MDE2M1wxXHUwMTY0XDI0XHUwMTYzXDFcdTAyMTdcNDdcdTAxNjNcMTJcdTAyMDJcMVx1MDFkMSIrCi0gICAgIlw3MVx1MDIwMlwxXHUwMjE4XDFcdTAxZDFcMVx1MDIwMlwxNFx1MDIwNVwxXHUwMWQ3XDY3XHUwMjA1XDFcdTAyMTkiKwotICAgICJcMVx1MDFkN1wxXHUwMjA1XDQwXDBcMVx1MDIxYVw1NFwwXDRcMTEyXDZcMFwxXDExMiIrCi0gICAgIlw2XDBcNlwxMTJcMVwwXDEzXDExMlwxXDBcNFwxMTJcMVx1MDIxYlw2XDExMiIrCi0gICAgIlwxXDBcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwXDRcMTEyIisKLSAgICAiXDZcMFwxXDExMlw2XDBcNlwxMTJcMVwwXDNcMTEyXDFcdTAyMWNcN1wxMTIiKwotICAgICJcMVwwXDRcMTEyXDFcdTAyMWNcNlwxMTJcMVwwXDRcMTEyXDFcMFwxMVwxMTIiKwotICAgICJcMlwwXDFcMTEyXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2IisKLSAgICAiXDFcMFwxMVwxNjZcMVx1MDIxZFwxXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2IisKLSAgICAiXDZcMFw2XDE2NlwxXDBcMTBcMTY2XDFcdTAyMWVcMlwxNjZcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNTRcMFwxXHUwMjFmIisKLSAgICAiXDI0XDBcMVx1MDIxZlw1MlwwXDFcdTAyMjBcMjBcMFwxXHUwMjIwXDcwXDBcMVx1MDIyMSIrCi0gICAgIlwxM1wwXDFcdTAyMjFcNTNcMFwyXHUwMjIyXDExMlwwXDFcdTAyMjNcMzVcMFwxXHUwMjIzIisKLSAgICAiXDEyXDBcMlwyMzFcMVwwXDM1XDIzMVwxXHUwMjI0XDQ2XDIzMVwyXDI0MFwxXDAiKwotICAgICJcMzVcMjQwXDFcdTAyMjVcNDZcMjQwXDE0XHUwMTRmXDFcdTAxNTBcMjNcdTAxNGZcMVx1MDIyNlw0Nlx1MDE0ZiIrCi0gICAgIlwxMlx1MDE1M1wxXHUwMTU0XDI1XHUwMTUzXDFcdTAyMjdcNDZcdTAxNTNcMTJcdTAxZjhcMVx1MDIyOFw3MVx1MDFmOCIrCi0gICAgIlwxXHUwMjE0XDFcdTAxYjdcMVx1MDFmOFwxNFx1MDFmYlwxXHUwMjI5XDY3XHUwMWZiXDFcdTAyMTVcMVx1MDFiZCIrCi0gICAgIlwxXHUwMWZiXDE0XHUwMTVmXDFcdTAxNjBcMjNcdTAxNWZcMVx1MDIyYVw0Nlx1MDE1ZlwxMlx1MDE2M1wxXHUwMTY0IisKLSAgICAiXDI1XHUwMTYzXDFcdTAyMmJcNDZcdTAxNjNcMTJcdTAyMDJcMVx1MDIyY1w3MVx1MDIwMlwxXHUwMjE4XDFcdTAxZDEiKwotICAgICJcMVx1MDIwMlwxNFx1MDIwNVwxXHUwMjJkXDY3XHUwMjA1XDFcdTAyMTlcMVx1MDFkN1wxXHUwMjA1XDQxXDAiKwotICAgICJcMVx1MDIyZVw1M1wwXDRcMTEyXDZcMFwxXDExMlw2XDBcNlwxMTJcMVwwIisKLSAgICAiXDEzXDExMlwxXDBcN1wxMTJcMVx1MDIyZlwzXDExMlwxXDBcNFwxMTJcMVwwIisKLSAgICAiXDExXDExMlwyXDBcMVwxMTJcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDExXDE2NlwxXHUwMjMwXDFcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDZcMTY2XDFcMFw2XDE2NlwxXHUwMjMxXDRcMTY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDQzXDAiKwotICAgICJcMVx1MDIzMlwxMVwwXDFcdTAyMzJcNzJcMFwxXHUwMjMzXDE0XDBcMVx1MDIzM1w3MVwwIisKLSAgICAiXDFcdTAyMzRcMTRcMFwxXHUwMjM0XDMwXDBcMlwyMzFcMVwwXDM2XDIzMVwxXHUwMjM1IisKLSAgICAiXDQ1XDIzMVwyXDI0MFwxXDBcMzZcMjQwXDFcdTAyMzZcNDVcMjQwXDE0XHUwMTRmXDFcdTAxNTAiKwotICAgICJcMjRcdTAxNGZcMVx1MDIzN1w0NVx1MDE0ZlwxMlx1MDE1M1wxXHUwMTU0XDI2XHUwMTUzXDFcdTAyMzhcNDVcdTAxNTMiKwotICAgICJcMTRcdTAxNWZcMVx1MDE2MFwyNFx1MDE1ZlwxXHUwMjM5XDQ1XHUwMTVmXDEyXHUwMTYzXDFcdTAxNjRcMjZcdTAxNjMiKwotICAgICJcMVx1MDIzYVw0NVx1MDE2M1w0MFwwXDFcdTAyM2JcNTRcMFw0XDExMlw2XDBcMVwxMTIiKwotICAgICJcNlwwXDVcMTEyXDFcdTAyM2NcMVwwXDEzXDExMlwxXDBcMTNcMTEyXDFcMCIrCi0gICAgIlw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjNkIisKLSAgICAiXDZcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcNVwxNjZcMVx1MDIzZSIrCi0gICAgIlw1XDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlwxXDE2NlwyXDIzMVwxXDBcMzVcMjMxXDFcdTAyM2ZcNDZcMjMxXDJcMjQwXDFcMCIrCi0gICAgIlwzNVwyNDBcMVx1MDI0MFw0NlwyNDBcMTRcdTAxNGZcMVx1MDE1MFwyM1x1MDE0ZlwxXHUwMjQxXDQ2XHUwMTRmIisKLSAgICAiXDEyXHUwMTUzXDFcdTAxNTRcMjVcdTAxNTNcMVx1MDI0Mlw0Nlx1MDE1M1wxNFx1MDE1ZlwxXHUwMTYwXDIzXHUwMTVmIisKLSAgICAiXDFcdTAyNDNcNDZcdTAxNWZcMTJcdTAxNjNcMVx1MDE2NFwyNVx1MDE2M1wxXHUwMjQ0XDQ2XHUwMTYzXDM1XDAiKwotICAgICJcMVx1MDI0NVw1N1wwXDRcMTEyXDZcMFwxXDExMlw2XDBcNlwxMTJcMVwwIisKLSAgICAiXDVcMTEyXDFcdTAyNDZcNVwxMTJcMVwwXDEzXDExMlwxXDBcNFwxMTJcMVwwIisKLSAgICAiXDExXDExMlwyXDBcMVwxMTJcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMVwxNjZcMVx1MDI0N1w3XDE2NlwyXDBcMVwxNjZcMlwyMzFcMVwwXDMyXDIzMSIrCi0gICAgIlwxXHUwMjQ4XDUxXDIzMVwyXDI0MFwxXDBcMzJcMjQwXDFcdTAyNDlcNTFcMjQwXDE0XHUwMTRmIisKLSAgICAiXDFcdTAxNTBcMjBcdTAxNGZcMVx1MDI0YVw1MVx1MDE0ZlwxMlx1MDE1M1wxXHUwMTU0XDIyXHUwMTUzXDFcdTAyNGIiKwotICAgICJcNTFcdTAxNTNcMTRcdTAxNWZcMVx1MDE2MFwyMFx1MDE1ZlwxXHUwMjRjXDUxXHUwMTVmXDEyXHUwMTYzXDFcdTAxNjQiKwotICAgICJcMjJcdTAxNjNcMVx1MDI0ZFw1MVx1MDE2M1w2XDBcNFwxMTJcNlwwXDFcMTEyXDZcMCIrCi0gICAgIlw2XDExMlwxXDBcN1wxMTJcMVx1MDI0ZVwzXDExMlwxXDBcMTNcMTEyXDFcMCIrCi0gICAgIlw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjRmIisKLSAgICAiXDZcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDAiKwotICAgICJcNFwxMTJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDBcMTNcMTEyXDFcMCIrCi0gICAgIlwxM1wxMTJcMVwwXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcdTAyNTBcNlwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEwXDE2NlwxXHUwMjUxIisKLSAgICAiXDJcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDFcMTY2XDZcMFw0XDExMlw2XDBcMVwxMTJcNlwwXDZcMTEyXDFcMCIrCi0gICAgIlw1XDExMlwxXHUwMjUyXDVcMTEyXDFcMFwxM1wxMTJcMVwwXDRcMTEyXDFcMCIrCi0gICAgIlwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFw0XDE2NlwxXHUwMjUzXDZcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDExMlw2XDAiKwotICAgICJcMVwxMTJcNlwwXDZcMTEyXDFcMFw1XDExMlwxXHUwMjU0XDVcMTEyXDFcMCIrCi0gICAgIlwxM1wxMTJcMVwwXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFw1XDE2NlwxXHUwMjU1IisKLSAgICAiXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDFcMTY2XDZcMFw0XDExMlw2XDBcMVwxMTJcNlwwXDZcMTEyXDFcMCIrCi0gICAgIlwxM1wxMTJcMVwwXDRcMTEyXDFcdTAyNTZcNlwxMTJcMVwwXDRcMTEyXDFcMCIrCi0gICAgIlwxMVwxMTJcMlwwXDFcMTEyXDZcdTAyNTdcNFx1MDI1OFw2XHUwMjU3XDFcdTAyNThcNVx1MDI1NyIrCi0gICAgIlwxXDBcNlx1MDI1OFwxXHUwMjU3XDEzXHUwMjU4XDFcdTAyNTdcMTNcdTAyNThcMVx1MDI1N1w0XHUwMjU4IisKLSAgICAiXDFcdTAyNTdcMTFcdTAyNThcMlx1MDI1N1wxXHUwMjU4XDQyXDBcMVx1MDI1OVwzXDBcMVx1MDI1YSIrCi0gICAgIlw3XDBcMVx1MDI1YlwxXHUwMjVjXDIxXDBcMVx1MDI1ZFwxM1wwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDRcMTY2XDFcdTAyNWVcM1wxNjZcMVx1MDI1ZiIrCi0gICAgIlwyXDE2NlwxXDBcNFwxNjZcMVx1MDI2MFwxXHUwMjYxXDVcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcNlwxNjZcMVx1MDI2MlwyXDE2NlwyXDBcMVwxNjZcNTdcMFwxXHUwMjYzIisKLSAgICAiXDc3XDBcMVx1MDI2NFwxMTVcMFwxXHUwMjY1XDEwNVwwXDFcdTAyNjZcMTA3XDBcMVx1MDI2NyIrCi0gICAgIlwzNVwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcNVwxNjZcMVx1MDI2OFw1XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NiIrCi0gICAgIlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXHUwMjY5XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMCIrCi0gICAgIlwxMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDVcMTY2XDFcdTAyNmFcNVwxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcdTAyNmIiKwotICAgICJcNlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDVcMTY2XDFcdTAyNmNcNVwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDFcMTY2XDQ0XDBcMVx1MDI2ZFwxMzZcMFwxXHUwMjZlXDEwN1wwXDFcdTAyNmZcNjdcMCIrCi0gICAgIlwxXHUwMjcwXDEyNVwwXDFcdTAyNzFcMTdcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFw2XDE2NlwxXHUwMjcyXDRcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDFcMTY2XDFcdTAyNzNcN1wxNjZcMlwwXDFcMTY2XDZcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDJcMTY2XDFcdTAyNzRcNlwxNjZcMlwwIisKLSAgICAiXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDRcMTY2XDFcdTAyNzVcNlwxNjZcMVwwXDRcMTY2XDFcMCIrCi0gICAgIlwxMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDJcMTY2XDFcdTAyNzZcNlwxNjZcMlwwXDFcMTY2XDQ2XDBcMVx1MDI3N1w3NFwwIisKLSAgICAiXDFcdTAyNzhcMTA2XDBcMVx1MDI3OVwxMTZcMFwxXHUwMjdhXDEwNVwwXDFcdTAyN2JcNTFcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxMFwxNjZcMVx1MDI3YyIrCi0gICAgIlwyXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXHUwMjdkIisKLSAgICAiXDFcMFwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NiIrCi0gICAgIlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjYiKwotICAgICJcMVx1MDI3ZVwxXDBcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMCIrCi0gICAgIlwxMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFw2XDE2NlwxXHUwMjdmXDRcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDZcMTY2XDFcMFw1XDE2NlwxXHUwMjgwXDVcMTY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDU3XDAiKwotICAgICJcMVx1MDI4MVwxMzFcMFwxXHUwMjgyXDUyXDBcMVx1MDI4M1wxMDZcMFwxXHUwMjg0XDQ2XDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw1XDE2NlwxXHUwMjg1XDVcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFw3XDE2NlwxXHUwMjg2IisKLSAgICAiXDFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcMTBcMTY2XDFcdTAyODdcMlwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEwXDE2NlwxXHUwMjg4XDJcMTY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDEwM1wwIisKLSAgICAiXDFcdTAyODlcNjNcMFwxXHUwMjcxXDEzMVwwXDFcdTAyN2JcMTA2XDBcMVx1MDI4YVwxMVwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTBcMTY2XDFcdTAyOGJcMlwwXDFcMTY2IisKLSAgICAiXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDZcMTY2XDFcdTAyNzZcNFwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjYiKwotICAgICJcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2IisKLSAgICAiXDFcMFwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDEwXDE2NiIrCi0gICAgIlwxXHUwMjgwXDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMCIrCi0gICAgIlwxMFwxNjZcMVx1MDI4Y1wyXDBcMVwxNjZcMzRcMFwxXHUwMjcxXDE1NFwwXDFcdTAyOGQiKwotICAgICJcMTJcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcdTAyNzZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFw3XDE2NlwxXHUwMjhlIisKLSAgICAiXDFcMTY2XDJcMFwxXDE2Nlw1NlwwXDFcdTAyNzFcMzZcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcdTAyNzYiKwotICAgICJcNlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2IjsKLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eXRyYW5zIFtdID0geXlfdW5wYWNrKHl5X3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIC8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICA5LCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDksICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgOSwgIDksICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDksICAzLCAgMywgIDMsICAzLCAgMywgIDMsICA5LCAgOSwgCi0gICAgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDksICAzLCAgMywgIDMsIAotICAgICAzLCAgMywgIDMsICA5LCAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAwLCAgOSwgIDEsICAyLCAgMSwgIDIsICAxLCAgMCwgIDAsICAwLCAgOSwgIDEsICAxLCAgMSwgCi0gICAgIDksICA5LCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA5LCAgMSwgIDAsIAotICAgICAwLCAgMSwgIDksICAwLCAgOSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDksICAxLCAgMSwgIDAsICAxLCAKLSAgICAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDksICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICA5LCAgMCwgIDAsICAxLCAgMCwgIDAsIAotICAgICA5LCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAKLSAgICAgMSwgIDEsICAwLCAgMCwgIDksICA5LCAgOSwgIDAsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAyLCAxMywgCi0gICAgIDMsICAyLCAgMiwgMTMsICAzLCAgMiwgIDAsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMiwgMTMsIAotICAgICAzLCAgMiwgIDIsIDEzLCAgMywgIDIsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAwLCAgOSwgIDksICA5LCAKLSAgICAgMCwgIDAsICAxLCAgMSwgIDEsICA5LCAgMCwgIDAsIDEzLCAgOSwgMTMsICA5LCAgOSwgIDEsICAxLCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDMsICAyLCAgMiwgIDMsICAyLCAgMiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsIAotICAgICAwLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAyLCAgMywgIDMsICAzLCAgMiwgIDIsICAzLCAgMywgCi0gICAgIDMsICAyLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDIsICAzLCAgMywgIDMsICAyLCAgMiwgIDMsICAzLCAgMywgIDIsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICA5LCAgOSwgIDAsICAxLCAgOSwgIDAsICAxLCAgMSwgCi0gICAgIDEsICA1LCAxMywgMTMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsIAotICAgICA5LCAgMSwgIDMsICAyLCAgMywgIDIsICAxLCAgMCwgIDksICAxLCAgMCwgIDEsICAzLCAgMiwgIDMsICAyLCAKLSAgICAgMSwgIDAsICA5LCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgCi0gICAgIDEsICAyLCAgMiwgIDAsICAwLCAgMiwgIDIsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsIAotICAgICAwLCAgOSwgIDksICAxLCAgMSwgIDIsICAyLCAgMSwgIDEsICAyLCAgMiwgIDEsICAxLCAgMCwgIDEsICAxLCAKLSAgICAgMSwgIDksICA5LCAgOSwgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDIsICAyLCAgMiwgIDIsICA5LCAgMSwgIDEsICAxLCAgMSwgIDMsICAzLCAgMywgIDMsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgCi0gICAgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMQotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIC8vIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgLy8gcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JcHJpdmF0ZSBpbnQgZlRva2VuQ291bnQgPSAwOwotIAotCS8vIHJlcXVpcmVkIGhvbGRlcnMgZm9yIHdoaXRlLXNwYWNlIGNvbXBhY3RpbmcKLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0ID0gMTsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGggPSAwOwotCXByaXZhdGUgQ29udGV4dFJlZ2lvbkNvbnRhaW5lciBmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsKLQotCS8vIHN0YXRlIHN0YWNrIGZvciBoYW5kbGluZyBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCS8vIGEgImhpbnQiIGFzIHRvIHdoYXQgYW4gZW1iZWRkZWQgcmVnaW9uIHNob3VsZCBiZSBldmFsdWF0ZWQKLQlwcml2YXRlIFN0cmluZyBmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCS8vIGEgImhpbnQiIGFzIHRvIHdoYXQgc3RhdGUgdG8gZW50ZXIgb25jZSBhbiBlbWJlZGRlZCByZWdpb24gaGFzCi0JLy8gICBiZWVuIGNvbXBsZXRlZAotCXByaXZhdGUgaW50IGZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQkvLyB0aGUgY29udGFpbmVyIHVzZWQgdG8gY3JlYXRlIGVtYmVkZGVkIHJlZ2lvbnMKLQlwcml2YXRlIENvbnRleHRSZWdpb25Db250YWluZXIgZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfQ09OVEVYVCA9ICJQUk9YWV9DT05URVhUIjsKLQotCXByaXZhdGUgU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IHN0YXJ0ID0gMDsKLQlwcml2YXRlIGludCB0ZXh0TGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JLy8gb2Zmc2V0IGZvciB0cmFja2luZyBwb3NpdGlvbiBzcGVjaWZpYyBibG9jayB0YWdzCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCA9IDA7Ci0JCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGJlaW5nIG9wZW5lZAotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgaW5zaWRlIG9mIGFuIGVtYmVkZGVkIHJlZ2lvbgotCXByaXZhdGUgU3RyaW5nIGludGVybmFsVGFnTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxDb250ZXh0ID0gbnVsbDsKLQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2VycwotCXByaXZhdGUgTGlzdCBmQmxvY2tNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgwKTsKLQlwcml2YXRlIExpc3QgZk5lc3RhYmxlUHJlZml4ZXMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQotCS8vIHdoZXJlIHRoZSBsYXN0IGludGVybmFsIGNvbnRhaW5lciBibG9jayB3YXMgZm91bmQKLQlwcml2YXRlIGludCBmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOwotCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZwotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZkZvcmJpZEpTUCA9IGZhbHNlOwotCQotCXByaXZhdGUgaW50IGZFTGxldmVsID0gMDsKLQotCXByaXZhdGUgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBKU1BQYXJzZXJSZWdpb25GYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJaWYoY29udGFpbnNUYWdOYW1lKG1hcmtlci5nZXRUYWdOYW1lKCkpKQotCQkJcmV0dXJuOwotCQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZE5lc3RhYmxlUHJlZml4KFRhZ01hcmtlciBtYXJrZXIpIHsKLQkJZk5lc3RhYmxlUHJlZml4ZXMuYWRkKG1hcmtlcik7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIExpc3QgZ2V0TmVzdGFibGVQcmVmaXhlcygpIHsKLQkJcmV0dXJuIGZOZXN0YWJsZVByZWZpeGVzOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc05lc3RhYmxlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCS8vSXRlcmF0b3IgYmxvY2tzID0gZk5lc3RhYmxlUHJlZml4ZXMuaXRlcmF0b3IoKTsKLQkJLy93aGlsZShibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCS8vCVRhZ01hcmtlciBtYXJrZXIgPSAoVGFnTWFya2VyKWJsb2Nrcy5uZXh0KCk7Ci0JCS8vCVN0cmluZyBtYXJrZXJOYW1lID0gbWFya2VyLmdldFRhZ05hbWUoKTsKLQkJLy8JaWYodGFnTmFtZS5sZW5ndGgoKSA+IG1hcmtlck5hbWUubGVuZ3RoKCkgKyAxICYmIHRhZ05hbWUuc3RhcnRzV2l0aChtYXJrZXJOYW1lKSAmJiB0YWdOYW1lLmNoYXJBdChtYXJrZXJOYW1lLmxlbmd0aCgpKSA9PSAnOicpIHsKLQkJLy8JCXJldHVybiBtYXJrZXIuaXNHbG9iYWwoKSB8fCBnZXRPZmZzZXQoKSA+PSBtYXJrZXIuZ2V0TWFya2VyKCkuZ2V0U3RhcnQoKTsKLQkJLy8JfQotCQkvL30KLQkJLy9yZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVOZXN0YWJsZVByZWZpeChTdHJpbmcgbmFtZSkgewotCQlpZiAoZk5lc3RhYmxlUHJlZml4ZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgbmVzdGFibGVzID0gZk5lc3RhYmxlUHJlZml4ZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChuZXN0YWJsZXMuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCgoVGFnTWFya2VyKSBuZXN0YWJsZXMubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLQkJCQkJbmVzdGFibGVzLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCQlmQmxvY2tNYXJrZXJzLnJlbW92ZShtYXJrZXIpOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnbmFtZSkgewotCQlpZiAoZkJsb2NrTWFya2VycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoYmxvY2tzLmhhc05leHQoKSkgewotCQkJCWlmICgoKEJsb2NrTWFya2VyKSBibG9ja3MubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQotCQkJCQlibG9ja3MucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZyBlbmRUYWdOYW1lKSB7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBudWxsLCBlbmRUYWdOYW1lKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmdbXSBlbmRUeXBlcykgewotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgZW5kVHlwZXMsIG51bGwpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZyBlbmRUeXBlKSB7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBuZXcgU3RyaW5nW117ZW5kVHlwZX0sIG51bGwpOwotCX0KLQkvKioKLQkgKiAgdXNlciBtZXRob2QgCi0JICogCi0JICogQXNzZW1ibGVzIGFuIGVtYmVkZGVkIGNvbnRhaW5lciBiZWdpbm5pbmcgd2l0aCB0aGUgZ2l2ZW4gc3RhcnRUeXBlIGFzCi0JICogdGhlIGZpcnN0IENvbnRleHRSZWdpb24gd2l0aGluIGl0IGFuZCBvZiB0aGUgdHlwZSBmRW1iZWRkZWRIaW50LiAgVGhlCi0JICogZW5kVHlwZXNbXSBhcnJheSBjb250YWlucyB0aGUgY29udGV4dCB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgYSBzdWNjZXNzZnVsCi0JICogZXhpdC4gIFVzZSBvZiB0aGUgZW5kVGFnTmFtZSBwYXJhbWV0ZXIgYWx0ZXJzIHRoaXMgYmVoYXZpb3IgdG8gZm9yY2UgYW4KLQkgKiBleGl0IG9uIGFuIFhNTF9UQUdfQ0xPU0UgYWZ0ZXIgc2VlaW5nIGFuIFhNTF9UQUdfTkFNRSB3aG9zZSBzaWduaWZpY2FudAotCSAqIHRleHQgbWF0Y2hlcyB0aGUgZW5kVGFnTmFtZSBTdHJpbmcuICBBbGwgY29udGVudHMgaW4gYmV0d2VlbiBhcmUKLQkgKiBpbnNpZ25pZmljYW50LCBhbmQgeWVzLCB0aGlzIG1lYW5zIGNvbW1lbnRzIGFyZSBhbGxvd2VkIGluc2lkZS4KLQkgKiovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nW10gZW5kVHlwZXMsIFN0cmluZyBlbmRUYWdOYW1lKSB7Ci0JCS8vIHRoZSBjb250ZXh0IG9mIHRoZSByZWdpb24gYmVpbmcgYWRkZWQgdG8gdGhlIGVtYmVkZGVkIGNvbnRhaW5lcgotCQlpbnRlcm5hbENvbnRleHQgPSBzdGFydFR5cGU7Ci0JCS8vIGtlZXAgdHJhY2sgb2Ygd2hlcmUgdGhpcyBjb250YWluZXIgYmVnYW47IHRvIHByb3ZpZGUgcmVsYXRpdmUgaW5kZWNlcyBmb3IgdGhlIHJlZ2lvbnMKLQkJaW50IGNvbnRhaW5lclN0YXJ0ID0geXljaGFyOwotCQlib29sZWFuIG5vdEZpbmlzaGVkID0gdHJ1ZTsKLQkJLy8ga2VlcCB0cmFjayBvZiB3aGVyZSB3ZSBzZWVtIHRvIGJlIHNvIHRoYXQgdGhlIGVuZFRhZ05hbWUgY2FuIGJlIGNoZWNrZWQKLQkJYm9vbGVhbiBpc0luRW5kVGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXNJbkZpcnN0VGFnID0gdHJ1ZTsKLQkJLy8gY3JlYXRlIHRoZSBlbWJlZGRlZCBjb250YWluZXIgYW5kIHNldHVwIGl0cyAidHlwZSIKLQkJaWYgKGZFbWJlZGRlZENvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIgPSBuZXcgQ29udGV4dFJlZ2lvbkNvbnRhaW5lcigpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFR5cGUoZkVtYmVkZGVkSGludCk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0U3RhcnQoY29udGFpbmVyU3RhcnQpOwotCQkJLy8gVE9ETzogcGFyZW50IHJlZ2lvbiBuZWVkcyB0byBiZSBzZXQgLi4uLiBidXQgbm90IHN1cmUgd2hlcmUgdG8gZ2V0IGl0IGZyb20gCi0JCQkvLwkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFBhcmVudChwYXJlbnRSZWdpb24pOwotCQl9Ci0JCWNvbnRhaW5lclN0YXJ0ID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFN0YXJ0KCk7Ci0JCXdoaWxlIChub3RGaW5pc2hlZCkgewotCQkJLy8gYWRkIHRoZSByZWdpb24gdG8gdGhlIGNvbnRhaW5lcgotCQkJaWYgKGludGVybmFsQ29udGV4dCAhPSBudWxsICYmIGludGVybmFsQ29udGV4dCAhPSBQUk9YWV9DT05URVhUKSB7Ci0JCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihpbnRlcm5hbENvbnRleHQsIHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0LCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvL25ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQkvLyBsb25nc2NhbiBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gYXR0ZW1wdCBhIGJsb2NrVGFnU2NhbiB3aXRoaW4gdGhlIGVtYmVkZGVkIGNvbnRhaW5lcgotCQkJCWJvb2xlYW4gbG9uZ3NjYW4gPSBmYWxzZTsKLQkJCQkvLyBzYXZlIHRoZSB0b2tlbml6ZXIgc3RhdGUgaW4gY2FzZSBvZiBhIGJsb2NrIHRhZyBzY2FuCi0JCQkJaW50IHByZXZpb3VzU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJU3RyaW5nIHByZXZpb3VzQ3VycmVudFRhZ05hbWUgPSBmQ3VycmVudFRhZ05hbWU7Ci0JCQkJaW50IHByZXZpb3VzUG9zdFN0YXRlID0gZkVtYmVkZGVkUG9zdFN0YXRlOwotCQkJCVN0cmluZyBwcmV2aW91c0VtYmVkZGVkSGludCA9IGZFbWJlZGRlZEhpbnQ7Ci0JCQkJLy8gZGV0ZXJtaW5lIGlmIGEgYmxvY2sgdGFnIHNjYW4gaXMgbmVjZXNzYXJ5Ci0JCQkJaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX05BTUUpIHsKLQkJCQkJaW50ZXJuYWxUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCQkJCWlmKCFpc05lc3RhYmxlKGludGVybmFsVGFnTmFtZSkpIHsKLQkJCQkJCWludGVybmFsVGFnTmFtZSA9IG51bGw7Ci0JCQkJCQkvLyBzbmFnZ2VkIGEgdGFnIG5hbWUgd2Ugc2hvdWxkbid0IGhhdmUKLQkJCQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0FCT1JUX0VNQkVEREVEOwotCQkJCQkJbm90RmluaXNoZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19PUEVOIHx8IGludGVybmFsQ29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJCWludGVybmFsVGFnTmFtZSA9IG51bGw7Ci0JCQkJfQotCQkJCS8vIGRvIHVwa2VlcCBmb3IgZW5kVGFnTmFtZSB1c2FnZTsgbXVzdCBiZSBoZXJlIHNpbmNlIHRoZSBuZXh0IHRva2VuIGNvdWxkIGJlIHRoZSBjbG9zZQotCQkJCWlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQlpc0luRW5kVGFnID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX0NMT1NFKSB7Ci0JCQkJCWlzSW5GaXJzdFRhZyA9IGlzSW5FbmRUYWcgPSBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCSAJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucyA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7Ci0JCQkJCWlmIChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpID4gMiAmJiAoZW1iZWRkZWRSZWdpb25zLmdldChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpLTEpKS5nZXRUeXBlKCkgPT0gWE1MX1RBR19DTE9TRSAmJiAoZW1iZWRkZWRSZWdpb25zLmdldChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpIC0gMykpLmdldFR5cGUoKSA9PSBYTUxfVEFHX09QRU4gJiYgaW50ZXJuYWxUYWdOYW1lICE9IG51bGwpIHsKLQkJCQkJCWlmIChjb250YWluc1RhZ05hbWUoaW50ZXJuYWxUYWdOYW1lKSkgewotCQkJCQkJCWxvbmdzY2FuID0gdHJ1ZTsKLQkJCQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobG9uZ3NjYW4pCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IGludGVybmFsVGFnTmFtZTsKLQkJCQkvLyByZWFkIHRoZSBuZXh0IHJlZ2lvbiBhbmQgY29udGV4dAotCQkJCWludGVybmFsQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQlpZiAobG9uZ3NjYW4pIHsKLQkJCQkJLy8gUmV0dXJuaW5nIGZyb20gYSBibG9jayB0YWcgc2NhbiByZXF1aXJlcyByZXN0b3Jpbmcgc29tZSBzdGF0ZSB2YXJpYWJsZXMKLQkJCQkJLy8gYXMgd2VsbCBhcyBoYW5kbGluZyB0aGUgYmxvY2sgcmVnaW9uIGFuZCBzZXR0aW5nIHVwIGZvciBub3JtYWwgc2Nhbm5pbmcKLQkJCQkJLy8gaW5zaWRlIHRoZSBlbWJlZGRlZCBjb250YWluZXIKLQkJCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihpbnRlcm5hbENvbnRleHQsIHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0LCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIG5ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOwotCQkJCQlsb25nc2NhbiA9IGZhbHNlOwotCQkJCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBwcmV2aW91c1Bvc3RTdGF0ZTsKLQkJCQkJZkVtYmVkZGVkSGludCA9IHByZXZpb3VzRW1iZWRkZWRIaW50OwotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBwcmV2aW91c0N1cnJlbnRUYWdOYW1lOwotCQkJCQl5eWJlZ2luKHByZXZpb3VzU3RhdGUpOwotCQkJCQlpbnRlcm5hbENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIHByaW1HZXROZXh0VG9rZW4oKSBjYWxscyBtYXkgdGhyb3cgYW4gSU9FeGNlcHRpb24KLQkJCQkvLyBjYXRjaCBhbmQgZG8gbm90aGluZyBzaW5jZSB0aGUgaXNFT0YgY2hlY2sgYmVsb3cKLQkJCQkvLyB3aWxsIHByb3Blcmx5IGV4aXQgaWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBmKSB7Ci0JCQkJLy8gc29tZSBvdGhlciBleGNlcHRpb24gaGFwcGVuZWQ7IG5ldmVyIHNob3VsZAotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZik7Ci0JCQl9Ci0JCQlib29sZWFuIGlzRW5kaW5nVHlwZSA9IHl5c3RhdGUoKSA9PSBTVF9BQk9SVF9FTUJFRERFRDsKLQkJCWlmKCFpc0VuZGluZ1R5cGUpIHsKLQkJCQkvLyBjaGVjayBmb3IgZW5kaW5nIGNvbnRleHQKLQkJCQlpZiAoZW5kVGFnTmFtZSA9PSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW5kVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlzRW5kaW5nVHlwZSA9IGlzRW5kaW5nVHlwZSB8fCAoaW50ZXJuYWxDb250ZXh0ID09IGVuZFR5cGVzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaXNFbmRpbmdUeXBlID0gKChpc0luRW5kVGFnICYmIGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX0NMT1NFKSB8fCAoaXNJbkZpcnN0VGFnICYmIGludGVybmFsQ29udGV4dCA9PSBYTUxfRU1QVFlfVEFHX0NMT1NFKSkgJiYgaW50ZXJuYWxUYWdOYW1lICE9IG51bGwgJiYgaW50ZXJuYWxUYWdOYW1lLmVxdWFscyhlbmRUYWdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRMaXN0ID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJCW5vdEZpbmlzaGVkID0gbm90RmluaXNoZWQgJiYgKCghaXNFbmRpbmdUeXBlKSAmJiAhaXNFT0YoKSAmJiAoZW5kVGFnTmFtZSAhPSBudWxsIHx8IGludGVybmFsQ29udGV4dCAhPSBVTkRFRklORUQpICYmICEoaW50ZXJuYWxDb250ZXh0ID09IFBST1hZX0NPTlRFWFQgJiYgKGVtYmVkZGVkTGlzdC5nZXQoZW1iZWRkZWRMaXN0LnNpemUoKS0xKSkuZ2V0VHlwZSgpID09IFVOREVGSU5FRCkpOwotCQl9Ci0JCS8vIGZpbmlzaCBhZGRpbmcgdGhlIGxhc3QgY29udGV4dAotCQlpZiAoaW50ZXJuYWxDb250ZXh0ICE9IG51bGwgJiYgaW50ZXJuYWxDb250ZXh0ICE9IFBST1hZX0NPTlRFWFQpIHsKLQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoeXljaGFyIC0gY29udGFpbmVyU3RhcnQgKyB5eWxlbmd0aCgpKTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0ICsgeXlsZW5ndGgoKSk7Ci0JCX0KLQkJeXliZWdpbihmRW1iZWRkZWRQb3N0U3RhdGUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKCkgewotCQlyZXR1cm4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKCkgewotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckFsbG93c0pTUChTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gbWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gbWFya2VyLmFsbG93c0pTUCgpOwotCQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpIHsKLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KFN0cmluZyBuYW1lKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7Ci0JCXJldHVybiBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dChTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgewotCQlyZXR1cm4gZkJsb2NrTWFya2VyczsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZPZmZzZXQgKyB5eWNoYXI7Ci0JfQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgewotCQlyZXR1cm4gaXNCbG9ja01hcmtlcihmQ3VycmVudFRhZ05hbWUpOwotCX0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAoIWZJc0Jsb2NraW5nRW5hYmxlZCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrVGFnU2NhbihTdHJpbmcgbmV3VGFnTmFtZSkgewotCQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKgotCSAqIFNwZWNpYWwgdG9rZW5pemVyIHNldHVwLiAgQWxsb3dzIHRva2VuaXphdGlvbiB0byBiZSBpbml0aWF0ZWQgYXQgdGhlCi0JICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuCi0JICoKLQkgKiBFeGFtcGxlOiAKLQkgKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7Ci0JICoJdG9rZXIuc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGZhbHNlKTsKLQkgKgl0b2tlci5yZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoImFmaXVocXdrZWpodGFzaWhnYWxrd2h0cTwvc2NyaXB0ZXI+PC9zY3I+PC9zY3JpcHQ+YXNnZGFzZ2EiKSk7Ci0JICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOwotCSAqCXRva2VyLmdldFJlZ2lvbnMoKTsgCi0JICoKLQkgKiBSZXR1cm5zOgotCSAqCUJMT0NLX1RFWFQ6IDAtNDAKLQkgKglYTUxfRU5EX1RBR19PUEVOOiA0MS00MgotCSAqCVhNTF9UQUdfTkFNRTogNDMtNDgKLQkgKglYTUxfVEFHX0NMT1NFOiA0OS00OQotCSAqCVhNTF9DT05URU5UOiA1MC01NwotCSAqCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja01hcmtlclNjYW4oU3RyaW5nIG5ld1RhZ05hbWUsIFN0cmluZyBibG9ja2NvbnRleHQpIHsKLQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCWZDdXJyZW50VGFnTmFtZSA9IG5ld1RhZ05hbWU7Ci0JfQotCi0vKioKLSAqIE1ldGhvZCBkb1NjYW4uCi0gKiAKLSAqIFJldHVybnMgYSBjb250ZXh0IHJlZ2lvbiBmb3IgYWxsIG9mIHRoZSB0ZXh0IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gdXB0byB0aGUgZW5kIG9mIGlucHV0IG9yCi0gKiB0byByaWdodCAqYmVmb3JlKiB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIHNlYXJjaFN0cmluZwotICogCi0gKiBAcGFyYW0gc2VhcmNoU3RyaW5nIC0gdGFyZ2V0IHN0cmluZyB0byBzZWFyY2ggZm9yIGV4LjogIi0tPiIsICI8L3RhZ25hbWUiCi0gKiBAcGFyYW0gcmVxdWlyZVRhaWxTZXBhcmF0b3IgLSB3aGV0aGVyIHRoZSB0YXJnZXQgbXVzdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIG9yICc+JwotICogQHBhcmFtIGFsbG93SlNQIC0gY2hlY2sgZm9yIGFuZCBhbGxvdyBmb3IgSlNQIG1hcmt1cCA8JSU+Ci0gKiBAcGFyYW0gY29udGV4dCAtIHRoZSBjb250ZXh0IG9mIHRoZSBzY2FubmVkIHJlZ2lvbiBpZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQotICogQHJldHVybiBTdHJpbmcgLSB0aGUgY29udGV4dCBmb3VuZDogdGhlIGRlc2lyZWQgY29udGV4dCBvbiBhIG5vbi16ZXJvIGxlbmd0aCBtYXRjaCwgdGhlIGFib3J0Q29udGV4dCBvbiBpbW1lZGlhdGUgc3VjY2VzcwotICogQHRocm93cyBJT0V4Y2VwdGlvbgotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb1NjYW4oU3RyaW5nIHNlYXJjaFN0cmluZywgYm9vbGVhbiByZXF1aXJlVGFpbFNlcGFyYXRvciwgYm9vbGVhbiBhbGxvd0pTUCwgYm9vbGVhbiBhbGxvd0NEQVRBLCBTdHJpbmcgc2VhcmNoQ29udGV4dCwgaW50IGV4aXRTdGF0ZSwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JYm9vbGVhbiBzdGlsbFNlYXJjaGluZyA9IHRydWU7Ci0JLy8gRGlzYWJsZSBmdXJ0aGVyIGJsb2NrIChwcm9iYWJseSkKLQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlpbnQgc2VhcmNoU3RyaW5nTGVuZ3RoID0gc2VhcmNoU3RyaW5nLmxlbmd0aCgpOwotCWludCBuID0gMDsKLQljaGFyIGxhc3RDaGVja0NoYXI7Ci0JaW50IGk7Ci0JYm9vbGVhbiBzYW1lID0gZmFsc2U7Ci0JLy8gQ2hlY2sgZm9yIEpTUCBzdGFydHMgKCI8JSIpIGlmIHRoZSB0YWcgaXMgZ2xvYmFsIGxpa2UgU0NSSVBUIG9yIFNUWUxFCi0JYm9vbGVhbiBjaGVja0pTUHMgPSBhbGxvd0pTUCAmJiAhZkZvcmJpZEpTUDsKLQlib29sZWFuIGNoZWNrZWRGb3JKU1BzT25jZSA9ICFjaGVja0pTUHM7Ci0JYm9vbGVhbiBjaGVja2VkSlNQc0F0U3RhcnRPbmNlID0gZmFsc2U7Ci0JCi0Jd2hpbGUgKHN0aWxsU2VhcmNoaW5nKSB7Ci0JCW4gPSAwOwotCQkvLyBFbnN1cmUgdGhhdCBlbm91Z2ggZGF0YSBmcm9tIHRoZSBpbnB1dCBleGlzdHMgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBzZWFyY2ggU3RyaW5nLgotCQluID0geXlfYWR2YW5jZSgpOwotCQl3aGlsZShuICE9IFlZRU9GICYmIHl5X2N1cnJlbnRQb3MgPCBzZWFyY2hTdHJpbmdMZW5ndGgpCi0JCQluID0geXlfYWR2YW5jZSgpOwotLy8JCWMgPSAoY2hhcikgbjsKLQkJLy8gSWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQgb3Igd2UndmUgZXhoYXVzdGVkIHRoZSBpbnB1dCwgc3RvcCBpbW1lZGlhdGVseS4KLQkJaWYgKG4gPT0gWVlFT0YgJiYgY2hlY2tlZEZvckpTUHNPbmNlKSB7Ci0JCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJLyoqCi0JCQkgKiBMb29rIGZvciBzdGFydGluZyBKU1BzICI8JSIKLQkJCSAqLwotCQkJY2hlY2tlZEZvckpTUHNPbmNlID0gdHJ1ZTsKLQkJCS8vIDEpIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggOiBUaGVyZSdzIGF0IGxlYXN0IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IG9uY2UgdGhhdCdzIHJlYWQsIGNoZWNrIGZvciBKU1BzCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCBjdXJyZW50LXNlYXJjaFN0cmluZ0xlbmd0aDsgaWYgc28sIGJhY2t1cCBhbmQgc3dpdGNoIHNjYW5uZXIgc3RhdGVzIHRvIGhhbmRsZSBpdC4KLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8JSU+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0JCQlpZihjaGVja0pTUHMgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIAotCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggKyAxXSA9PSAnJScpIHsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0JCQkvLyAyKSB5eV9jdXJyZW50UG9zIC0ganNwc3RhcnRlci5sZW5ndGggOiBUaGVyZSdzIG5vdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBjaGVjayBmb3IgYSBKU1AgMiBzcG90cyBiYWNrIGluIHdoYXQgd2UgY291bGQgcmVhZAotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb247IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbgotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24gKmhhdmluZyogY2xvc2VUYWdTdHJpbmdMZW5ndGggYW1vdW50IG9mIGlucHV0IHRvIHdvcmsgYXMgZGVzaWduZWQuICBNdXN0IGJlIHN1cmUgd2UgZG9uJ3QKLQkJCS8vIHNwaWxsIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIGNoZWNraW5nLgotCQkJZWxzZSBpZihjaGVja0pTUHMgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X2N1cnJlbnRQb3MgPiAwICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJgotCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIDFdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvc10gPT0gJyUnKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gMTsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLQkJCS8vIDMpIHl5X2N1cnJlbnRQb3MuLih5eV9jdXJyZW50UG9zK2pzcFN0YXJ0bGVuZ3RoLTEpIDogQ2hlY2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvbmUgdGltZQotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgaW1tZWRpYXRlbHkgaW4gdGhlIGJsb2NrIGFyZWE7IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbgotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24geXlfY3VycmVudFBvcyBlcXVhbGluZyBleGFjdGx5IHRoZSBwcmV2aW91cyBlbmQgKzEgdG8gd29yayBhcyBkZXNpZ25lZC4KLQkJCWVsc2UgaWYoY2hlY2tKU1BzICYmICFjaGVja2VkSlNQc0F0U3RhcnRPbmNlICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9zdGFydFJlYWQgPiAwICYmCi0JCQkJCXl5X3N0YXJ0UmVhZCA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWRdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgMV0gPT0gJyUnKSB7Ci0JCQkJY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSA9IHRydWU7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9zdGFydFJlYWQ7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0KLQotCQkJLyoqCi0JCQkgKiBMb29rIGZvciBzdGFydGluZyBDREFUQSAiPCFbQ0RBVEFbIgotCQkJICovCi0JCQkvLyAxKSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOiBUaGVyZSdzIGF0IGxlYXN0IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IG9uY2UgdGhhdCdzIHJlYWQsIGNoZWNrIGZvciBDREFUQQotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIENEQVRBIGJlZ2lubmluZyBhdCBjdXJyZW50LXNlYXJjaFN0cmluZ0xlbmd0aDsgaWYgc28sIGJhY2t1cCBhbmQgc3dpdGNoIHNjYW5uZXIgc3RhdGVzIHRvIGhhbmRsZSBpdC4KLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8WyFDREFUQVtdXT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQKLQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4KLS8qCQkJaWYoY2hlY2tDREFUQSAmJiB5eV9jdXJyZW50UG9zID4gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgKyBzZWFyY2hTdHJpbmdMZW5ndGggPCB5eV9idWZmZXIubGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgCi0JCQkJY2hhcnNNYXRjaChjZGF0YVN0YXJ0ZXIsIHl5X2J1ZmZlciwgMCwgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCkpIHsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCS8vIGdvIHRvIGEgc3RhdGUgd2hlcmUgQ0RBVEEgY2FuIGJlIGZvdW5kCi0JCQkJaWYgKGZFbWJlZGRlZENvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lciA9IG5ldyBDb250ZXh0UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUeXBlKHNlYXJjaENvbnRleHQpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0U3RhcnQoeXljaGFyKTsKLQkJCQl9Ci0JCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihzZWFyY2hDb250ZXh0LCB5eWNoYXIsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCQkJU3RyaW5nIGNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJaWYoY29udGV4dC5lcXVhbHMoWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX09QRU4pKSB7Ci0JCQkJCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX09QRU4sIFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9DTE9TRSk7Ci0JCQkJfQotCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotKi8vKgotCQkJLy8gMikgeXlfY3VycmVudFBvcyAtIGNkYXRhU3RhcnRlci5sZW5ndGg6IFRoZXJlJ3Mgbm90IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IGNoZWNrIGZvciBhIENEQVRBIHJpZ2h0IGhlcmUgc3BvdHMgYmFjayBpbiB3aGF0IHdlIGNvdWxkIHJlYWQKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uICpoYXZpbmcqIGNsb3NlVGFnU3RyaW5nTGVuZ3RoIGFtb3VudCBvZiBpbnB1dCB0byB3b3JrIGFzIGRlc2lnbmVkLiAgTXVzdCBiZSBzdXJlIHdlIGRvbid0Ci0JCQkvLyBzcGlsbCBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aGlsZSBjaGVja2luZy4KLQkJCWVsc2UgaWYoY2hlY2tDREFUQSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfY3VycmVudFBvcyA+IDAgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmCi0JCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gMV0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSA9PSAnJScpIHsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSAxOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCQkJLy8gMykgeXlfY3VycmVudFBvcyA6IENoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb25lIHRpbWUKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGltbWVkaWF0ZWx5IGluIHRoZSBibG9jayBhcmVhOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uIHl5X2N1cnJlbnRQb3MgZXF1YWxpbmcgZXhhY3RseSB0aGUgcHJldmlvdXMgZW5kICsxIHRvIHdvcmsgYXMgZGVzaWduZWQuCi0JCQllbHNlIGlmKGNoZWNrQ0RBVEEgJiYgIWNoZWNrZWRGb3JDREFUQU9uY2UgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X3N0YXJ0UmVhZCA+IDAgJiYKLQkJCQkJeXlfc3RhcnRSZWFkIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQgKyAxXSA9PSAnJScpIHsKLQkJCQljaGVja2VkRm9yQ0RBVEFPbmNlID0gdHJ1ZTsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X3N0YXJ0UmVhZDsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLSovCi0JCQkvLyBDaGVjayB0aGUgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHZlcnN1cyB0aGUgbGFzdCB0YXJnZXRMZW5ndGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGJ1ZmZlcgotCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzCi0JCQlpZiAobiA9PSBZWUVPRikgewotCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzYW1lID0gdHJ1ZTsKLQkJCQkvLyBzYWZldHkgY2hlY2sgZm9yIGFycmF5IGFjY2Vzc2VzCi0JCQkJaWYoeXlfY3VycmVudFBvcyA+PSBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyA8PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkJCWZvcihpID0gMDsgaSA8IHNlYXJjaFN0cmluZ0xlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZihzYW1lICYmIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCQlzYW1lID0geXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSA9PSBzZWFyY2hTdHJpbmcuY2hhckF0KGkpOwotCQkJCQkJZWxzZSBpZihzYW1lICYmICFmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpCi0JCQkJCQkJc2FtZSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc2VhcmNoU3RyaW5nLmNoYXJBdChpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gc2FmZXR5IGNoZWNrIGZhaWxlZDsgbm8gbWF0Y2ggaXMgcG9zc2libGUgcmlnaHQgbm93Ci0JCQkJZWxzZSB7Ci0JCQkJCXNhbWUgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaAotCQkJCS8vICI8L3NjcmlwdFMiCi0JCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsKLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIgotCQkJCWlmKGxhc3RDaGVja0NoYXIgPT0gJz4nIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGFzdENoZWNrQ2hhcikpCi0JCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7Ci0JCS8vIFdlJ3ZlIHN0b3BwZWQgc2hvcnQgb2YgdGhlIGVuZCBvciBkZWZpbml0ZWx5IGZvdW5kIGEgbWF0Y2gKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCS8vIElmIHRoZSBzZWFyY2hTdHJpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCXl5YmVnaW4oaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci0JCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJeXlfY3VycmVudFBvcysrOwotCX0KLQl5eWJlZ2luKGV4aXRTdGF0ZSk7Ci0JLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkKLQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKiBkb2VzIGEgbG9va2FoZWFkIGZvciB0aGUgY3VycmVudCB0YWcgbmFtZQotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb0Jsb2NrVGFnU2NhbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsKLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKCksIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7Ci19Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKgotCSAqIENvbnZlcnRzIHRoZSByYXcgY29udGV4dCBTdHJpbmcgcmV0dXJuZWQgYnkgdGhlIHByaW1HZXROZXh0VG9rZW4oKQotCSAqIG1ldGhvZCBpbnRvIGEgZnVsbCBJVGV4dFJlZ2lvbiBieSBwdWxsaW5nIGluIHZhbHVlcyBmb3IgdGhlCi0JICogY3VycmVudCBvZmZzZXQgd2l0aGluIHRoZSBzY2FubmluZyB0ZXh0LgotCSAqCi0JICogUmV0dXJucyBudWxsIHdoZW4gRU9GIGlzIGVuY291bnRlcmVkIGFuZCBhdHRhY2hlcyBpbnRlcm1pdHRlbnRseQotCSAqIGRpc2NvdmVyZWQgd2hpdGVzcGFjZSBvbnRvIHRoZSBlbmQgb2YgdXNlZnVsIHJlZ2lvbnMuCi0JICoKLQkgKiBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gY2FjaGVzIHRoZSB0b2tlbiBmb2xsb3dpbmcgdGhlIG9uZSBiZWluZyByZXR1cm5lZAotCSAqIHNvIHRoYXQgd2hpdGVzcGFjZSBjYW4gYmUgY29sbGFwc2VkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCQkvLyBsb2FkIHRoZSBzdGFydGluZyBub24td2hpdGVzcGFjZSB0b2tlbiAoYXNzdW1lIHRoYXQgaXQgaXMgc28pCi0JCWlmIChmU2hvdWxkTG9hZEJ1ZmZlcmVkKSB7Ci0JCQlpZiAoZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgIT0gbnVsbCkgewotCQkJCUlUZXh0UmVnaW9uIGNvbnRhaW5lciA9IGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyOwotCQkJCWZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQkJCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJCX0KLQkJCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0OwotCQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJaWYgKGNvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCkgewotCQkJCXJldHVybiBmRW1iZWRkZWRDb250YWluZXI7Ci0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfUk9PVF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCQkJZWxzZQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9UQUdfT1BFTikgewotCQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCQkJfQotCQkJc3RhcnQgPSB5eWNoYXI7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCWlmICh5eV9hdEVPRikgewotCQkJCWZUb2tlbkNvdW50Kys7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJLy8gc3RvcmUgdGhlIG5leHQgdG9rZW4KLQkJZl9jb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlpZiAoZl9jb250ZXh0ID09IFBST1hZX0NPTlRFWFQpIHsKLQkJCWZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gZkVtYmVkZGVkQ29udGFpbmVyOwotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX1JPT1RfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCWVsc2UKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JCWZCdWZmZXJlZENvbnRleHQgPSBmX2NvbnRleHQ7Ci0JCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgPT0gV0hJVEVfU1BBQ0UpIHsKLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJCWxlbmd0aCArPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCX0KLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkgewotCQkJLy8gRU9GCi0JCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRpc2NvdmVyZWQgIiArIGZUb2tlbkNvdW50ICsgIiB0b2tlbnMuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmVG9rZW5Db3VudCsrOwotCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgSlNQVG9rZW5pemVyKCl7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIEpTUFRva2VuaXplcihjaGFyW10gY2hhckFycmF5KXsKLQkJCXRoaXMobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSwgaW50IG5ld09mZnNldCkgewotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIG5ld09mZnNldCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotCQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIDApOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpIHsKLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCBuZXdPZmZzZXQpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluKSB7Ci0JCXJlc2V0KGluLCAwKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgKgotCSAqCi0JICogUmVzZXQgaW50ZXJuYWwgY291bnRlcnMgYW5kIHZhcnMgdG8gIm5ld2x5IGNyZWF0ZWQiIHZhbHVlcywgaW4gdGhlIGhvcGVzCi0JICogdGhhdCByZXNldHRpbmcgYSBwcmUtZXhpc3RpbmcgdG9rZW5pemVyIGlzIGZhc3RlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGNvbnRhaW5zIGNvZGUgYmxvY2tzIHRoYXQgd2VyZSBlc3NlbnRpYWxseSBkdXBsaWNhdGVkIGZyb20gdGhlCi0JICogPGVtPmdlbmVyYXRlZDwvZW0+IG91dHB1dCBvZiB0aGlzIHNwZWNpZmljYXRpb24gYmVmb3JlIHRoaXMgbWV0aG9kIHdhcwotCSAqIGFkZGVkLiAgVGhvc2UgY29kZSBibG9ja3Mgd2VyZSB1bmRlciB0aGUgYWJvdmUgY29weXJpZ2h0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXNldHRpbmcgdG9rZW5pemVyIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWZPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0JCi0JCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkJeXlfcmVhZGVyID0gaW47Ci0JCi0JCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQkJeXlfc3RhdGUgPSAwOwotCQotCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0JCi0JCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQkJdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCQl5eV9tYXJrZWRQb3MgPSAwOwotCQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0JCi0JCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9jdXJyZW50UG9zID0gMDsKLQkKLQkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JCXl5X3N0YXJ0UmVhZCA9IDA7Ci0JCi0JCS8qKiAKLQkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JCSAqIGZyb20gaW5wdXQgCi0JCSAqLwotCQl5eV9lbmRSZWFkID0gMDsKLQkKLQkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5bGluZSA9IDA7Ci0JCi0JCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWNoYXIgPSAwOwotCQotCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JCXl5X2F0RU9GID0gZmFsc2U7Ci0JCi0JCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCQotCQotCQkvKiB1c2VyIHZhcnM6ICovCi0JCWZUb2tlbkNvdW50ID0gMDsKLQkgCi0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JCWZCdWZmZXJlZFN0YXJ0ID0gMTsKLQkJZkJ1ZmZlcmVkTGVuZ3RoID0gMDsKLQkJZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQkKLQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSAtMTsKLQkKLQkJY29udGV4dCA9IG51bGw7Ci0JCXN0YXJ0ID0gMDsKLQkJdGV4dExlbmd0aCA9IDA7Ci0JCWxlbmd0aCA9IDA7Ci0JCi0JCWZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JCQotCQlmRUxsZXZlbCA9IDA7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKi8KLQlwdWJsaWMgQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCUpTUFRva2VuaXplciBuZXdJbnN0YW5jZSA9IG5ldyBKU1BUb2tlbml6ZXIoKTsKLQkJLy8gZ2xvYmFsIHRhZ21hcmtlcnMgY2FuIGJlIHNoYXJlZDsgdGhleSBoYXZlIG5vIHN0YXRlIGFuZCAKLQkJLy8gYXJlIG5ldmVyIGRlc3Ryb3llZCAoZS5nLiAncmVsZWFzZScpCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9IChCbG9ja01hcmtlcikgZkJsb2NrTWFya2Vycy5nZXQoaSk7Ci0JCQlpZihibG9ja01hcmtlci5pc0dsb2JhbCgpKQotCQkJCW5ld0luc3RhbmNlLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsKLQkJfQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZk5lc3RhYmxlUHJlZml4ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVRhZ01hcmtlciBtYXJrZXIgPSAoVGFnTWFya2VyKSBmTmVzdGFibGVQcmVmaXhlcy5nZXQoaSk7Ci0JCQlpZihtYXJrZXIuaXNHbG9iYWwoKSkKLQkJCQluZXdJbnN0YW5jZS5hZGROZXN0YWJsZVByZWZpeChtYXJrZXIpOwotCQl9Ci0JCXJldHVybiBuZXdJbnN0YW5jZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuWE1MQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTY2FuIGZvciAnLS0+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMKLQkJLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gKLQkJLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9YTUxfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dAotCQkvLyAgY29udGV4dCBhcyB1c3VhbC4KLQkJcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIHRydWUsIHRydWUsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuSlNQQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTY2FuIGZvciAnLS0lPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzCi0JCS8vICAgSlNQX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoCi0JCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfSlNQX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQKLQkJLy8gIGNvbnRleHQgYXMgdXN1YWwuCi0JCXJldHVybiBkb1NjYW4oIi0tJT4iLCBmYWxzZSwgZmFsc2UsIHRydWUsIEpTUF9DT01NRU5UX1RFWFQsIFNUX0pTUF9DT01NRU5UX0VORCwgU1RfSlNQX0NPTU1FTlRfRU5EKTsKLQl9Ci0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSlNQVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHl5X3VucGFjayhTdHJpbmcgcGFja2VkKSB7Ci0gICAgaW50IFtdIHRyYW5zID0gbmV3IGludFszMTU5NV07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgODIwNikgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHRyYW5zW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEzNzYpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIC0gZnJvbSB0aGUgU0VEIEpGbGV4IHNrZWxldG9uCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0gICAgLy8gRE8gTk9UIEVYSVQgdGhlIFZNIG9uIGFuIGVycm9yCi0gICAgLy8gU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoY2hhcltdIG1hcmtlclRhZ05hbWUsIGludCBvZmZzZXQsIGludCB0YWduYW1lTGVuZ3RoKSB7Ci0JCWZvcihpbnQgaiA9IDA7IGogPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaisrKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpZkJsb2NrTWFya2Vycy5nZXQoaik7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmxlbmd0aCgpID09IHRhZ25hbWVMZW5ndGgpIHsKLQkJCQlib29sZWFuIG1hdGNoZXNTb0ZhciA9IHRydWU7Ci0JCQkJZm9yKGludCBpID0gMDsgaSA8IHRhZ25hbWVMZW5ndGggJiYgbWF0Y2hlc1NvRmFyOyBpKyspIHsKLQkJCQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkJCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSAhPSBtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkpCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYobWF0Y2hlc1NvRmFyKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKgotCSAqIFJldHVybiBBTEwgb2YgdGhlIHJlZ2lvbnMgc2Nhbm5hYmxlIHdpdGhpbiB0aGUgcmVtYWluaW5nIHRleHQKLQkgKiBOb3RlOiBmb3IgdmVyaWZpY2F0aW9uIHVzZQotCSAqLwotCXB1YmxpYyBmaW5hbCBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl0cnkgewotCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl3aGlsZShyZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQl0b2tlbnMuYWRkKHJlZ2lvbik7Ci0JCQkJfQotCQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSsiOiBpbnB1dCBjb3VsZCBub3QgYmUgdG9rZW5pemVkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0T2Zmc2V0KCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaW5jZSB0aGlzIGlzIGNvbnZlbmllbmNlIG1ldGhvZCBhbmQgTk9UIHRoZSByZWNvbW1lbmRlZCAKLQkJCS8vIHdheSBvZiBnZXR0aW5nIHRva2VucywgbWFueSBlcnJvcnMgYXJlIHNpbXBseSBoaWRkZW4KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiBub3QgaGFuZGxlZCByZXRyaWV2aW5nIHJlZ2lvbnM6ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0b2tlbnM7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGR1bXAoU3RyaW5nIHMpIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocyArICIgKCIgKyB5eWNoYXIgKyAiLSIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSh5eWxlbmd0aCgpICsgeXljaGFyKSArICIpOlwnIiArLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdVdGlscy5lc2NhcGUoeXl0ZXh0KCkpICsgIlwnIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCS8qIHVzZXIgbWV0aG9kICAtIHNrZWxldG9uLnNlZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4geXlfYXRFT0Y7Ci0JfQotLyogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQgKi8KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShTdHJpbmcgbWFya2VyVGFnTmFtZSkgewotCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQl3aGlsZShibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilibG9ja3MubmV4dCgpOwotCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG1hcmtlclRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG1hcmtlclRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIC8vIGRvIG5vdGhpbmcsIHRoaXMgaXMgdGhlIGRvd25zdHJlYW0gcGFyc2VyJ3Mgam9iCi0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLSAgICB5eV9wdXNoYmFja1BvcyA9IC0xOwotICAgIGJvb2xlYW4geXlfd2FzX3B1c2hiYWNrOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgYm9vbGVhbiB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICBmb3IgKHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQ7IHl5X2N1cnJlbnRQb3MgPCB5eV9tYXJrZWRQb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9jdXJyZW50UG9zKyspIHsKLSAgICAgICAgc3dpdGNoICh5eV9idWZmZXJbeXlfY3VycmVudFBvc10pIHsKLSAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIHl5X2NvdW50ZWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgaWYgKHl5X2NvdW50ZWQpCi0gICAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV9jb3VudGVkKSB7Ci0gICAgICAgIGlmICggeXlfYWR2YW5jZSgpID09ICdcbicgKSB5eWxpbmUtLTsKLSAgICAgICAgaWYgKCAheXlfYXRFT0YgKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICB5eV9zdGF0ZSA9IHl5X2xleGljYWxfc3RhdGU7Ci0KLSAgICAgIHl5X3dhc19wdXNoYmFjayA9IGZhbHNlOwotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICBpbnQgeXlfbmV4dCA9IHl5dHJhbnNbIHl5X3Jvd01hcFt5eV9zdGF0ZV0gKyB5eWNtYXBbeXlfaW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHl5X25leHQgPT0gLTEpIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLSAgICAgICAgICBpbnQgeXlfYXR0cmlidXRlcyA9IFlZX0FUVFJJQlVURVt5eV9zdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDIpID4gMCApCi0gICAgICAgICAgICB5eV9wdXNoYmFja1BvcyA9IHl5X2N1cnJlbnRQb3M7Ci0KLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMSkgPiAwICkgewotICAgICAgICAgICAgeXlfd2FzX3B1c2hiYWNrID0gKHl5X2F0dHJpYnV0ZXMgJiA0KSA+IDA7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiA4KSA+IDAgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X3dhc19wdXNoYmFjaykKLSAgICAgICAgeXlfbWFya2VkUG9zID0geXlfcHVzaGJhY2tQb3M7Ci0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgNjIyOiAKLSAgICAgICAgY2FzZSA2Mjc6IAotICAgICAgICBjYXNlIDYzNDogCi0gICAgICAgIGNhc2UgNjM5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJqc3AgZGlyZWN0aXZlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIEpTUF9ESVJFQ1RJVkVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjU1OiBicmVhazsKLSAgICAgICAgY2FzZSA1OTc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhTTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY1NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTgwOiAKLSAgICAgICAgY2FzZSA1ODM6IAotICAgICAgICBjYXNlIDU4NDogCi0gICAgICAgIGNhc2UgNTg1OiAKLSAgICAgICAgY2FzZSA1ODY6IAotICAgICAgICBjYXNlIDU4NzogCi0gICAgICAgIGNhc2UgNTg4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNEQVRBIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQl5eWJlZ2luKFNUX0NEQVRBX1RFWFQpOwotCXJldHVybiBYTUxfQ0RBVEFfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNjU3OiBicmVhazsKLSAgICAgICAgY2FzZSA1NzI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImpzcDpyb290IHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIEpTUF9ST09UX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2NTg6IGJyZWFrOwotICAgICAgICBjYXNlIDU2MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDY1OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTYyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgNjYwOiBicmVhazsKLSAgICAgICAgY2FzZSA1NjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSA2NjE6IGJyZWFrOwotICAgICAgICBjYXNlIDU0NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOwotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDOwotIH0KLSAgICAgICAgY2FzZSA2NjI6IGJyZWFrOwotICAgICAgICBjYXNlIDU0NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOwotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNOwotIH0KLSAgICAgICAgY2FzZSA2NjM6IGJyZWFrOwotICAgICAgICBjYXNlIDUzOTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY2NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTE0OiAKLSAgICAgICAgY2FzZSA1NTU6IAotICAgICAgICBjYXNlIDU1NjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX1ZCTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY1OiBicmVhazsKLSAgICAgICAgY2FzZSA1MDQ6IAotICAgICAgICBjYXNlIDU1MTogCi0gICAgICAgIGNhc2UgNTUyOiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY2NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDk2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkpTUCBjb21tZW50IGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gSlNQX0NPTU1FTlRfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY2NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDgzOiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoeXlsZW5ndGgoKSA+IDIpCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtMik7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlZCTCBpbiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JZkVMbGV2ZWwrKzsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0V9KTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY4OiBicmVhazsKLSAgICAgICAgY2FzZSA0ODI6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0yKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiRUwgaW4gYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JZkVMbGV2ZWwrKzsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFfSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY2OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDc2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNoYXJSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DSEFSX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgNjcwOiBicmVhazsKLSAgICAgICAgY2FzZSA0NzM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTU1FTlRfVEVYVDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQ09NTUVOVDsKLQl5eWJlZ2luKFNUX1hNTF9DT01NRU5UKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNjcxOiBicmVhazsKLSAgICAgICAgY2FzZSA0NzI6IAotICAgICAgICBjYXNlIDQ5MTogCi0gICAgICAgIGNhc2UgNDk0OiAKLSAgICAgICAgY2FzZSA0OTc6IAotICAgICAgICBjYXNlIDQ5ODogCi0gICAgICAgIGNhc2UgNTAwOiAKLSAgICAgICAgY2FzZSA1MDI6IAotICAgICAgICBjYXNlIDUwNTogCi0gICAgICAgIGNhc2UgNTA3OiAKLSAgICAgICAgY2FzZSA1MDg6IAotICAgICAgICBjYXNlIDUxMDogCi0gICAgICAgIGNhc2UgNTEyOiAKLSAgICAgICAgY2FzZSA1MTU6IAotICAgICAgICAgIHsgCi0JLyogSlNQIGNvbW1lbnQgYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjayg0KTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soNCk7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjayg0KTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgIHsKLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0NPTU1FTlRfT1BFTiwgSlNQX0NPTU1FTlRfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pCi0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotCS8vIGZpbmlzaGVkIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSByZWd1bGFyIHNjcmlwdGxldCBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIGNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOwotCQlyZXR1cm4gSlNQX0NPTU1FTlRfT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1AgY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOwotCQkvLyB0aGUgY29tbWVudCBjb250YWluZXIgaXRzZWxmIHdpbGwgYWN0IGFzIGNvbW1lbnQgdGV4dAotCQlmRW1iZWRkZWRIaW50ID0gSlNQX0NPTU1FTlRfVEVYVDsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfQ09NTUVOVF9PUEVOLCBKU1BfQ09NTUVOVF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvKgotCQkgKiByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnM7IG1hcmsgdGhpcyBvbmUgYXMgYQotCQkgKiBjb21tZW50IHNvIGl0IHdpbGwgYmUgb3RoZXJ3aXNlIGlnbm9yZWQgYnV0IHByZXNlcnZlZCAod2hpY2ggaXMgd2h5Ci0JCSAqIHdlIGNhbid0IHVzZSB3aGl0ZS1zcGFjZSkKLQkJICovCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2NzI6IGJyZWFrOwotICAgICAgICBjYXNlIDM4MTogCi0gICAgICAgIGNhc2UgMzgyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2NzM6IGJyZWFrOwotICAgICAgICBjYXNlIDM4MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiY29tbWVudCBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2NzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDM3OTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiQ0RBVEEgZW5kIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfQ0RBVEFfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY3NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc4OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JaWYoeXlsZW5ndGgoKSA+IDIpCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDIpOwotCWZFTGxldmVsKys7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgSlNQX1ZCTF9DTE9TRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjc2OiBicmVhazsKLSAgICAgICAgY2FzZSAzNzc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuUEVSZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9QRV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDY3NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc2OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMik7Ci0JZkVMbGV2ZWwrKzsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIEpTUF9FTF9DTE9TRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjc4OiBicmVhazsKLSAgICAgICAgY2FzZSAzNzM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuRW50aXR5UmVmIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfRU5USVRZX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgNjc5OiBicmVhazsKLSAgICAgICAgY2FzZSAzNjc6IAotICAgICAgICBjYXNlIDQwNzogCi0gICAgICAgIGNhc2UgNDE1OiAKLSAgICAgICAgY2FzZSA0MjI6IAotICAgICAgICBjYXNlIDQyNzogCi0gICAgICAgIGNhc2UgNDMyOiAKLSAgICAgICAgY2FzZSA0Mzc6IAotICAgICAgICBjYXNlIDQ0MzogCi0gICAgICAgIGNhc2UgNDQ5OiAKLSAgICAgICAgY2FzZSA0NTM6IAotICAgICAgICBjYXNlIDQ1ODogCi0gICAgICAgIGNhc2UgNDYzOiAKLSAgICAgICAgY2FzZSA0Njk6IAotICAgICAgICAgIHsgCi0JLyogSlNQIGV4cHJlc3Npb24gYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQkvLyBlbmQgc2FuaXR5IGNoZWNrcwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYW4gZXhwcmVzc2lvbiBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIGV4cHJlc3Npb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlyZXR1cm4gSlNQX0VYUFJFU1NJT05fT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1AgZXhwcmVzc2lvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FWFBSRVNTSU9OX09QRU4sIEpTUF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY4MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY2OiAKLSAgICAgICAgY2FzZSA0MDY6IAotICAgICAgICBjYXNlIDQxNDogCi0gICAgICAgIGNhc2UgNDIxOiAKLSAgICAgICAgY2FzZSA0MjY6IAotICAgICAgICBjYXNlIDQzMTogCi0gICAgICAgIGNhc2UgNDM2OiAKLSAgICAgICAgY2FzZSA0NDI6IAotICAgICAgICBjYXNlIDQ0ODogCi0gICAgICAgIGNhc2UgNDUyOiAKLSAgICAgICAgY2FzZSA0NTc6IAotICAgICAgICBjYXNlIDQ2MjogCi0gICAgICAgIGNhc2UgNDY4OiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBkZWNsYXJhdGlvbiBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIGRlY2xhcmF0aW9uIG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlyZXR1cm4gSlNQX0RFQ0xBUkFUSU9OX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0RFQ0xBUkFUSU9OX09QRU4sIEpTUF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY4MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY1OiAKLSAgICAgICAgY2FzZSA0MDU6IAotICAgICAgICBjYXNlIDQxMzogCi0gICAgICAgIGNhc2UgNDIwOiAKLSAgICAgICAgY2FzZSA0MjU6IAotICAgICAgICBjYXNlIDQzMDogCi0gICAgICAgIGNhc2UgNDM1OiAKLSAgICAgICAgY2FzZSA0NDE6IAotICAgICAgICBjYXNlIDQ0NzogCi0gICAgICAgIGNhc2UgNDUxOiAKLSAgICAgICAgY2FzZSA0NTY6IAotICAgICAgICBjYXNlIDQ2MTogCi0gICAgICAgIGNhc2UgNDY3OiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBkaXJlY3RpdmUgYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQkvLyBlbmQgc2FuaXR5IGNoZWNrcwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSBkZWNsYXJhdGlvbiBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIGRpcmVjdGl2ZSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUUpOwotCQlyZXR1cm4gSlNQX0RJUkVDVElWRV9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRElSRUNUSVZFX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRElSRUNUSVZFX0NMT1NFLCBKU1BfQ0xPU0V9KTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucwotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjgyOiBicmVhazsKLSAgICAgICAgY2FzZSAzNTU6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMX0RRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX1ZCTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjgzOiBicmVhazsKLSAgICAgICAgY2FzZSAzNTE6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMX1NRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX1ZCTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjg0OiBicmVhazsKLSAgICAgICAgY2FzZSAzNDk6IAotICAgICAgICAgIHsgCi0JZkVMbGV2ZWwrKzsKLQlpZihmRUxsZXZlbCA9PSAxKSB7Ci0JCXJldHVybiBKU1BfVkJMX09QRU47Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2ODU6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTF9EUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjg2OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzU6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfU1FVT1RFU19FTkQpOwotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY4NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzMzOiAKLSAgICAgICAgICB7IAotCS8vU3lzdGVtLm91dC5wcmludGxuKEpTUF9FTF9DT05URU5UKyAiOlsiICsgeXl0ZXh0KCkgKyAiXSIpOwotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjg4OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzI6IAotICAgICAgICAgIHsgCi0JZkVMbGV2ZWwrKzsKLQlpZihmRUxsZXZlbCA9PSAxKSB7Ci0JCXJldHVybiBKU1BfRUxfT1BFTjsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY4OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI5OiAKLSAgICAgICAgICB7IAotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOwotCXl5YmVnaW4oU1RfSlNQX0RRVU9URURfVkJMKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIGRvdWJsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgVkJMCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQl9Ci0JZWxzZSB7Ci0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7Ci0JfQotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2OTA6IGJyZWFrOwotICAgICAgICBjYXNlIDMyODogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9EUVVPVEVEX0VMKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBkb3VibGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQl9Ci0JZWxzZSB7Ci0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7Ci0JfQotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2OTE6IGJyZWFrOwotICAgICAgICBjYXNlIDMyNjogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9TUVVPVEVEX1ZCTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIFZCTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjkyOiBicmVhazsKLSAgICAgICAgY2FzZSAzMjU6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfU1FVT1RFRF9FTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgc2luZ2xlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBFTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjkzOiBicmVhazsKLSAgICAgICAgY2FzZSAzMjQ6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlpbnQgaW5jb21pbmdTdGF0ZSA9IHl5c3RhdGUoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gZW5kIHRhZyIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfRU5EX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7Ci0JaWYoeXlzdGF0ZSgpICE9IFNUX0FCT1JUX0VNQkVEREVEKQotICAgICAgICB5eWJlZ2luKGluY29taW5nU3RhdGUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2OTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDI4MzogCi0gICAgICAgIGNhc2UgMjk1OiAKLSAgICAgICAgY2FzZSAzMDE6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk1OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzE6IAotICAgICAgICAgIHsgCi0JU3RyaW5nIHRhZ05hbWUgPSB5eXRleHQoKS5zdWJzdHJpbmcoMSk7Ci0JLy8gcHVzaGJhY2sgdG8ganVzdCBhZnRlciB0aGUgb3BlbmluZyBicmFja2V0Ci0JeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMSk7Ci0JLyoKLQkgKiBJZiB0aGlzIHRhZyBjYW4gbm90IGJlIG5lc3RlZCBvciB3ZSdyZSBhbHJlYWR5IHNlYXJjaGluZyBmb3IgYW4KLQkgKiBhdHRyaWJ1dGUgbmFtZSwgZXF1YWxzLCBvciB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCWlmICghaXNOZXN0YWJsZSh0YWdOYW1lKSB8fCAoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9FUVVBTFMgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpKSkgewotCQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JCXJldHVybiBYTUxfVEFHX09QRU47Ci0JfQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgaW4gcGxhY2Ugb2YgYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQkvLyBlbWJlZGRlZCBjb250YWluZXIgc2hvdWxkIGJlIGxvb2tpbmcgZm9yIHRoZSBuYW1lIChhZ2FpbikgbmV4dAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk2OiBicmVhazsKLSAgICAgICAgY2FzZSAyNjk6IAotICAgICAgICAgIHsgCi0JU3RyaW5nIHRhZ05hbWUgPSB5eXRleHQoKS5zdWJzdHJpbmcoMSk7Ci0JLy8gcHVzaGJhY2sgdG8ganVzdCBhZnRlciB0aGUgb3BlbmluZyBicmFja2V0Ci0JeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMSk7Ci0JLyoKLQkgKiBJZiB0aGlzIHRhZyBjYW4gbm90IGJlIG5lc3RlZCBvciB3ZSdyZSBhbHJlYWR5IHNlYXJjaGluZyBmb3IgYW4KLQkgKiBhdHRyaWJ1dGUgbmFtZSwgZXF1YWxzLCBvciB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCWlmICghaXNOZXN0YWJsZSh0YWdOYW1lKSB8fCAoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9FUVVBTFMgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpKSkgewotCQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JCXJldHVybiBYTUxfVEFHX09QRU47Ci0JfQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgaW4gcGxhY2Ugb2YgYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFhNTF9UQUdfT1BFTiwgdGFnTmFtZSk7IC8vID8KLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2OTc6IGJyZWFrOwotICAgICAgICBjYXNlIDI2NzogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVtcHR5IHRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY5ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI1OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCk7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gY29tcGxleCBkb3VibGUgcXVvdGVkIik7Ly8kTk9OLU5MUy0xJAotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2OTk6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMzogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgdGFnIGVtYmVkZGVkIG5hbWUgc3RhcnQgLSBzdGFydCB0YWciKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA3MDA6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMjogCi0gICAgICAgIGNhc2UgMTI3OiAKLSAgICAgICAgY2FzZSAxMjg6IAotICAgICAgICBjYXNlIDI3MzogCi0gICAgICAgIGNhc2UgMjc3OiAKLSAgICAgICAgY2FzZSAyNzg6IAotICAgICAgICBjYXNlIDM4NzogCi0gICAgICAgIGNhc2UgMzkwOiAKLSAgICAgICAgY2FzZSA0ODE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDcwMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgNzAyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MDM6IGJyZWFrOwotICAgICAgICBjYXNlIDExNjogCi0gICAgICAgIGNhc2UgMTE3OiAKLSAgICAgICAgY2FzZSAxMTg6IAotICAgICAgICBjYXNlIDI2ODogCi0gICAgICAgIGNhc2UgMzg2OiAKLSAgICAgICAgY2FzZSA0ODA6IAotICAgICAgICBjYXNlIDUyMDogCi0gICAgICAgIGNhc2UgNTIxOiAKLSAgICAgICAgY2FzZSA1NDA6IAotICAgICAgICBjYXNlIDU0MTogCi0gICAgICAgIGNhc2UgNTU5OiAKLSAgICAgICAgY2FzZSA1NjA6IAotICAgICAgICBjYXNlIDU3MzogCi0gICAgICAgIGNhc2UgNTgyOiAKLSAgICAgICAgY2FzZSA1OTA6IAotICAgICAgICBjYXNlIDU5MjogCi0gICAgICAgIGNhc2UgNTk0OiAKLSAgICAgICAgY2FzZSA1OTY6IAotICAgICAgICBjYXNlIDU5OTogCi0gICAgICAgIGNhc2UgNjA1OiAKLSAgICAgICAgY2FzZSA2MDY6IAotICAgICAgICBjYXNlIDYwNzogCi0gICAgICAgIGNhc2UgNjA4OiAKLSAgICAgICAgY2FzZSA2MDk6IAotICAgICAgICBjYXNlIDYxNTogCi0gICAgICAgIGNhc2UgNjE2OiAKLSAgICAgICAgY2FzZSA2MTc6IAotICAgICAgICBjYXNlIDYxODogCi0gICAgICAgIGNhc2UgNjE5OiAKLSAgICAgICAgY2FzZSA2MjU6IAotICAgICAgICBjYXNlIDYyNjogCi0gICAgICAgIGNhc2UgNjI4OiAKLSAgICAgICAgY2FzZSA2Mjk6IAotICAgICAgICBjYXNlIDYzNTogCi0gICAgICAgIGNhc2UgNjM2OiAKLSAgICAgICAgY2FzZSA2Mzc6IAotICAgICAgICBjYXNlIDYzODogCi0gICAgICAgIGNhc2UgNjQ0OiAKLSAgICAgICAgY2FzZSA2NDU6IAotICAgICAgICBjYXNlIDY0NjogCi0gICAgICAgIGNhc2UgNjQ3OiAKLSAgICAgICAgY2FzZSA2NTA6IAotICAgICAgICBjYXNlIDY1MTogCi0gICAgICAgIGNhc2UgNjUzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcwNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlpZihpc0Jsb2NrTWFya2VyKCkpIHsKLQkJZkVtYmVkZGVkSGludCA9IGdldEJsb2NrTWFya2VyQ29udGV4dCgpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9CTE9DS19UQUdfU0NBTjsKLSAgICAgICAgCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCX0KLQllbHNlCi0gICAgICAgIAl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3MDU6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNzogCi0gICAgICAgIGNhc2UgMTExOiAKLSAgICAgICAgY2FzZSAyNjM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNzA2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDcwNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzA4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBkaXJlY3RpdmUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFKTsKLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MDk6IGJyZWFrOwotICAgICAgICBjYXNlIDk4OiAKLSAgICAgICAgY2FzZSA5OTogCi0gICAgICAgIGNhc2UgMTAwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgY29kZSBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBkb1NjYW4oIiU+IiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgSlNQX0NPTlRFTlQsIFNUX0pTUF9DT05URU5ULCBTVF9KU1BfQ09OVEVOVCk7Ci0gfQotICAgICAgICBjYXNlIDcxMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTQ6IAotICAgICAgICBjYXNlIDk2OiAKLSAgICAgICAgY2FzZSA5NzogCi0gICAgICAgIGNhc2UgMjUzOiAKLSAgICAgICAgY2FzZSAyNTQ6IAotICAgICAgICBjYXNlIDI1NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNzExOiBicmVhazsKLSAgICAgICAgY2FzZSA5MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA3MTI6IGJyZWFrOwotICAgICAgICBjYXNlIDkyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MTM6IGJyZWFrOwotICAgICAgICBjYXNlIDkwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcxNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgODQ6IAotICAgICAgICBjYXNlIDg2OiAKLSAgICAgICAgY2FzZSAyNDQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNzE1OiBicmVhazsKLSAgICAgICAgY2FzZSA4MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDcxNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDk6IAotICAgICAgICBjYXNlIDE5OTogCi0gICAgICAgIGNhc2UgMjAwOiAKLSAgICAgICAgY2FzZSAyMDM6IAotICAgICAgICBjYXNlIDIxMzogCi0gICAgICAgIGNhc2UgMjE0OiAKLSAgICAgICAgY2FzZSAyMTc6IAotICAgICAgICBjYXNlIDIxODogCi0gICAgICAgIGNhc2UgMzYwOiAKLSAgICAgICAgY2FzZSAzNjM6IAotICAgICAgICBjYXNlIDQ0NjogCi0gICAgICAgIGNhc2UgNDYwOiAKLSAgICAgICAgY2FzZSA0NjY6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzE3OiBicmVhazsKLSAgICAgICAgY2FzZSA0MjogCi0gICAgICAgIGNhc2UgMTc4OiAKLSAgICAgICAgY2FzZSAxNzk6IAotICAgICAgICBjYXNlIDE4MjogCi0gICAgICAgIGNhc2UgMTkyOiAKLSAgICAgICAgY2FzZSAxOTM6IAotICAgICAgICBjYXNlIDE5NjogCi0gICAgICAgIGNhc2UgMTk3OiAKLSAgICAgICAgY2FzZSAzMzA6IAotICAgICAgICBjYXNlIDM0NDogCi0gICAgICAgIGNhc2UgMzQ3OiAKLSAgICAgICAgY2FzZSA0MTg6IAotICAgICAgICBjYXNlIDQxOTogCi0gICAgICAgIGNhc2UgNDM0OiAKLSAgICAgICAgY2FzZSA0NDA6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3MTg6IGJyZWFrOwotICAgICAgICBjYXNlIDM1OiAKLSAgICAgICAgY2FzZSAxNTk6IAotICAgICAgICBjYXNlIDE2MDogCi0gICAgICAgIGNhc2UgMzIxOiAKLSAgICAgICAgY2FzZSA0MTI6IAotICAgICAgICBjYXNlIDQxNjogCi0gICAgICAgIGNhc2UgNDk1OiAKLSAgICAgICAgY2FzZSA1Mjg6IAotICAgICAgICBjYXNlIDU0ODogCi0gICAgICAgIGNhc2UgNTY1OiAKLSAgICAgICAgY2FzZSA1NzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzE5OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgIGNhc2UgMTUyOiAKLSAgICAgICAgY2FzZSAxNTM6IAotICAgICAgICBjYXNlIDMxMTogCi0gICAgICAgIGNhc2UgNDA0OiAKLSAgICAgICAgY2FzZSA0MDg6IAotICAgICAgICBjYXNlIDQ5MjogCi0gICAgICAgIGNhc2UgNTI3OiAKLSAgICAgICAgY2FzZSA1NDc6IAotICAgICAgICBjYXNlIDU2NDogCi0gICAgICAgIGNhc2UgNTc0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3MjA6IGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSAxMTI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImluYXBwcm9wcmlhdGUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JaWYoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKT09U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEfHxmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKS0xKTsKLQkJcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCX0KLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzIxOiBicmVhazsKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMTA0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNzIyOiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgIGNhc2UgNzI6IAotICAgICAgICBjYXNlIDE2OTogCi0gICAgICAgIGNhc2UgMTc0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSA3MjM6IGJyZWFrOwotICAgICAgICBjYXNlIDA6IAotICAgICAgICBjYXNlIDU2OiAKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDIyNTogCi0gICAgICAgIGNhc2UgMjI3OiAKLSAgICAgICAgY2FzZSAyMjg6IAotICAgICAgICBjYXNlIDIzMDogCi0gICAgICAgIGNhc2UgMjMyOiAKLSAgICAgICAgY2FzZSAzNzA6IAotICAgICAgICBjYXNlIDM3MTogCi0gICAgICAgIGNhc2UgMzcyOiAKLSAgICAgICAgY2FzZSA0NzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuWE1MIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3MjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDU3OiAKLSAgICAgICAgY2FzZSAxMDE6IAotICAgICAgICBjYXNlIDExMzogCi0gICAgICAgIGNhc2UgMTE5OiAKLSAgICAgICAgY2FzZSAxMjk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzI1OiBicmVhazsKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgIGNhc2UgNjA6IAotICAgICAgICBjYXNlIDY0OiAKLSAgICAgICAgY2FzZSA2NTogCi0gICAgICAgIGNhc2UgNjY6IAotICAgICAgICBjYXNlIDcwOiAKLSAgICAgICAgY2FzZSA3MTogCi0gICAgICAgIGNhc2UgODE6IAotICAgICAgICBjYXNlIDg1OiAKLSAgICAgICAgY2FzZSA4NzogCi0gICAgICAgIGNhc2UgODg6IAotICAgICAgICBjYXNlIDg5OiAKLSAgICAgICAgY2FzZSA5MTogCi0gICAgICAgIGNhc2UgOTU6IAotICAgICAgICBjYXNlIDEwMzogCi0gICAgICAgIGNhc2UgMTA4OiAKLSAgICAgICAgY2FzZSAxMDk6IAotICAgICAgICBjYXNlIDExMDogCi0gICAgICAgIGNhc2UgMTE1OiAKLSAgICAgICAgY2FzZSAxMjQ6IAotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgIGNhc2UgMTMyOiAKLSAgICAgICAgY2FzZSAxMzM6IAotICAgICAgICBjYXNlIDEzNDogCi0gICAgICAgIGNhc2UgMTM2OiAKLSAgICAgICAgY2FzZSAxMzc6IAotICAgICAgICBjYXNlIDEzOTogCi0gICAgICAgIGNhc2UgMTQwOiAKLSAgICAgICAgY2FzZSAxNDE6IAotICAgICAgICBjYXNlIDE0NDogCi0gICAgICAgIGNhc2UgMTQ1OiAKLSAgICAgICAgY2FzZSAxNDY6IAotICAgICAgICBjYXNlIDE0OTogCi0gICAgICAgIGNhc2UgMTUwOiAKLSAgICAgICAgY2FzZSAxNTE6IAotICAgICAgICBjYXNlIDE1NjogCi0gICAgICAgIGNhc2UgMTU3OiAKLSAgICAgICAgY2FzZSAxNTg6IAotICAgICAgICBjYXNlIDE2NjogCi0gICAgICAgIGNhc2UgMTcxOiAKLSAgICAgICAgY2FzZSAxNzI6IAotICAgICAgICBjYXNlIDE3NjogCi0gICAgICAgIGNhc2UgMTc3OiAKLSAgICAgICAgY2FzZSAxODQ6IAotICAgICAgICBjYXNlIDE4NTogCi0gICAgICAgIGNhc2UgMTg3OiAKLSAgICAgICAgY2FzZSAxODg6IAotICAgICAgICBjYXNlIDE5NDogCi0gICAgICAgIGNhc2UgMTk4OiAKLSAgICAgICAgY2FzZSAyMDU6IAotICAgICAgICBjYXNlIDIwNjogCi0gICAgICAgIGNhc2UgMjA4OiAKLSAgICAgICAgY2FzZSAyMDk6IAotICAgICAgICBjYXNlIDIxNTogCi0gICAgICAgIGNhc2UgMjE5OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJU3lzdGVtLm91dC5wcmludGxuKCIhISF1bmV4cGVjdGVkISEhOiBcIiIgKyB5eXRleHQoKSArICJcIjoiICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCXl5Y2hhciArICItIiArICh5eWNoYXIgKyB5eWxlbmd0aCgpKSk7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBVTkRFRklORUQ7Ci0gfQotICAgICAgICBjYXNlIDcyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjI6IAotICAgICAgICBjYXNlIDYzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSB0ZXh0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCVN0cmluZyByZXR1cm5lZENvbnRleHQgPSBkb1NjYW4oIl1dPiIsIGZhbHNlLCB0cnVlLCB0cnVlLCBYTUxfQ0RBVEFfVEVYVCwgU1RfQ0RBVEFfRU5ELCAgU1RfQ0RBVEFfRU5EKTsvLyROT04tTkxTLTEkCi0JaWYocmV0dXJuZWRDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQotCQl5eWJlZ2luKFNUX0NEQVRBX0VORCk7Ci0JcmV0dXJuIHJldHVybmVkQ29udGV4dDsKLSB9Ci0gICAgICAgIGNhc2UgNzI3OiBicmVhazsKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgIGNhc2UgMTg2OiAKLSAgICAgICAgY2FzZSAxODk6IAotICAgICAgICBjYXNlIDIwNzogCi0gICAgICAgIGNhc2UgMjEwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJMSU5FIEZFRUQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSA3Mjg6IGJyZWFrOwotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgY2FzZSA2OTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiY29tbWVudCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLSB9Ci0gICAgICAgIGNhc2UgNzI5OiBicmVhazsKLSAgICAgICAgY2FzZSA3MzogCi0gICAgICAgIGNhc2UgNzQ6IAotICAgICAgICBjYXNlIDc1OiAKLSAgICAgICAgY2FzZSA3NjogCi0gICAgICAgIGNhc2UgMjM3OiAKLSAgICAgICAgY2FzZSAyMzg6IAotICAgICAgICBjYXNlIDIzOTogCi0gICAgICAgIGNhc2UgMzgzOiAKLSAgICAgICAgY2FzZSA0Nzg6IAotICAgICAgICBjYXNlIDQ3OTogCi0gICAgICAgIGNhc2UgNTE4OiAKLSAgICAgICAgY2FzZSA1MTk6IAotICAgICAgICBjYXNlIDUzODogCi0gICAgICAgIGNhc2UgNTU4OiAKLSAgICAgICAgY2FzZSA1NzE6IAotICAgICAgICBjYXNlIDU4MTogCi0gICAgICAgIGNhc2UgNTg5OiAKLSAgICAgICAgY2FzZSA1OTE6IAotICAgICAgICBjYXNlIDU5MzogCi0gICAgICAgIGNhc2UgNTk1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0gICAgICAgIHl5YmVnaW4oU1RfUElfV1MpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MzA6IGJyZWFrOwotICAgICAgICBjYXNlIDc3OiAKLSAgICAgICAgICB7IAotICAgICAgICB5eWJlZ2luKFNUX1BJX0NPTlRFTlQpOwotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDczMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzg6IAotICAgICAgICBjYXNlIDc5OiAKLSAgICAgICAgY2FzZSA4MDogCi0gICAgICAgICAgeyAKLQkJLy8gYmxvY2sgc2NhbiB1bnRpbCBjbG9zZSBpcyBmb3VuZAotCXJldHVybiBkb1NjYW4oIj8+IiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgWE1MX1BJX0NPTlRFTlQsIFNUX1hNTF9QSV9UQUdfQ0xPU0UsIFNUX1hNTF9QSV9UQUdfQ0xPU0UpOwotIH0KLSAgICAgICAgY2FzZSA3MzI6IGJyZWFrOwotICAgICAgICBjYXNlIDgyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDczMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI2OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCk7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gY29tcGxleCBzaW5nbGUgcXVvdGVkIik7Ly8kTk9OLU5MUy0xJAotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNzM0OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRlY2xhcmF0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDczNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHR5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDczNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM4OiAKLSAgICAgICAgY2FzZSAxNDI6IAotICAgICAgICBjYXNlIDI4ODogCi0gICAgICAgIGNhc2UgMjkyOiAKLSAgICAgICAgY2FzZSAzOTk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgcHVibGljIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLSB9Ci0gICAgICAgIGNhc2UgNzM3OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDM6IAotICAgICAgICBjYXNlIDE0NzogCi0gICAgICAgIGNhc2UgMjk4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0gfQotICAgICAgICBjYXNlIDczODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ4OiAKLSAgICAgICAgY2FzZSAzMDQ6IAotICAgICAgICBjYXNlIDMwODogCi0gICAgICAgIGNhc2UgNDAyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzM5OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQwOiBicmVhazsKLSAgICAgICAgY2FzZSAxNTU6IAotICAgICAgICBjYXNlIDMxNDogCi0gICAgICAgIGNhc2UgMzE4OiAKLSAgICAgICAgY2FzZSA0MTA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDc0MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTYxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjQ6IAotICAgICAgICBjYXNlIDE2NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5KU1AgY29tbWVudCB0ZXh0Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLSB9Ci0gICAgICAgIGNhc2UgNzQzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjc6IAotICAgICAgICBjYXNlIDE3MzogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDc0NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY4OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JaW50IGluY29taW5nU3RhdGUgPSB5eXN0YXRlKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGluc2lkZSBvZiBKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOwotCWlmKHl5c3RhdGUoKSAhPSBTVF9BQk9SVF9FTUJFRERFRCkKLSAgICAgICAgeXliZWdpbihpbmNvbWluZ1N0YXRlKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNzQ1OiBicmVhazsKLSAgICAgICAgY2FzZSAxNzA6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzQ2OiBicmVhazsKLSAgICAgICAgY2FzZSAxNzU6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzQ3OiBicmVhazsKLSAgICAgICAgY2FzZSAxODA6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFUyk7Ci0JcmV0dXJuIEpTUF9FTF9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc0ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgxOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX1NRVU9URVMpOwotCXJldHVybiBKU1BfRUxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NDk6IGJyZWFrOwotICAgICAgICBjYXNlIDE4MzogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbC0tOwotCWlmKGZFTGxldmVsID09IDApIHsKLQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQlyZXR1cm4gSlNQX0VMX0NMT1NFOwotCX0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDc1MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTkwOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlyZXR1cm4gSlNQX0VMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzUxOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTE6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCXJldHVybiBKU1BfRUxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NTI6IGJyZWFrOwotICAgICAgICBjYXNlIDE5NTogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX0VMX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NTM6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfRFFVT1RFUyk7Ci0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfU1FVT1RFUyk7Ci0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NTU6IGJyZWFrOwotICAgICAgICBjYXNlIDIwNDogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbC0tOwotCWlmKGZFTGxldmVsID09IDApIHsKLQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQlyZXR1cm4gSlNQX1ZCTF9DTE9TRTsKLQl9Ci0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzU2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTE6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlyZXR1cm4gSlNQX1ZCTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc1NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEyOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NTg6IGJyZWFrOwotICAgICAgICBjYXNlIDIxNjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX1ZCTF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzU5OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZW5kIHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSA3NjA6IGJyZWFrOwotICAgICAgICBjYXNlIDIyMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5wcm9jZXNzaW5nIGluc3RydWN0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfUEkpOwotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47Ci0gfQotICAgICAgICBjYXNlIDc2MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjIyOiAKLSAgICAgICAgY2FzZSAzMTA6IAotICAgICAgICBjYXNlIDMyMDogCi0gICAgICAgIGNhc2UgMzMxOiAKLSAgICAgICAgY2FzZSAzMzY6IAotICAgICAgICBjYXNlIDM0MDogCi0gICAgICAgIGNhc2UgMzQzOiAKLSAgICAgICAgY2FzZSAzNDY6IAotICAgICAgICBjYXNlIDM0ODogCi0gICAgICAgIGNhc2UgMzUyOiAKLSAgICAgICAgY2FzZSAzNTY6IAotICAgICAgICBjYXNlIDM1OTogCi0gICAgICAgIGNhc2UgMzYyOiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBzY3JpcHRsZXQgYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMSk7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQkvLyBmaW5pc2hlZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIHJlZ3VsYXIgc2NyaXB0bGV0IG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1Agc2NyaXB0bGV0IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9TQ1JJUFRMRVRfT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1Agc2NyaXB0bGV0IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1NDUklQVExFVF9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA3NjI6IGJyZWFrOwotICAgICAgICBjYXNlIDIyMzogCi0gICAgICAgICAgeyAKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX09QRU47Ci0gfQotICAgICAgICBjYXNlIDc2MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc2NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQwOiAKLSAgICAgICAgICB7IAotCQkvLyBlbmRlZCB3aXRoIG5vdGhpbmcgaW5zaWRlCi0JCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzY1OiBicmVhazsKLSAgICAgICAgY2FzZSAyNDE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc2NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgZW5kIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIEpTUF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzY3OiBicmVhazsKLSAgICAgICAgY2FzZSAyNjA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzY4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjI6IAotICAgICAgICBjYXNlIDE2MzogCi0gICAgICAgICAgeyAKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JIH0KLSAgICAgICAgY2FzZSA3Njk6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHl5X2RvX2VvZigpOwotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmpmbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KU1BUb2tlbml6ZXIuamZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYTBjMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KU1BUb2tlbml6ZXIuamZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyODM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKiAgICAgRnJpdHMgSmFsdmluZ2ggLSBjb250cmlidXRpb25zIGZvciBidWcgMTUwNzk0DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1Rva2VuaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuVGFnTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb25Db250YWluZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuSW50U3RhY2s7DQotDQotJSUNCi0NCi0lew0KLQlwcml2YXRlIGludCBmVG9rZW5Db3VudCA9IDA7DQotIA0KLQkvLyByZXF1aXJlZCBob2xkZXJzIGZvciB3aGl0ZS1zcGFjZSBjb21wYWN0aW5nDQotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydCA9IDE7DQotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aCA9IDA7DQotCXByaXZhdGUgSVRleHRSZWdpb24gZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBudWxsOw0KLQlwcml2YXRlIElUZXh0UmVnaW9uIGZQcm94eVVua25vd25SZWdpb24gPSBudWxsOw0KLQlwcml2YXRlIFN0cmluZyBmX2NvbnRleHQgPSBudWxsOw0KLQ0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucw0KLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotCS8vIGEgImhpbnQiIGFzIHRvIHdoYXQgYW4gZW1iZWRkZWQgcmVnaW9uIHNob3VsZCBiZSBldmFsdWF0ZWQNCi0JcHJpdmF0ZSBTdHJpbmcgZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0JLy8gYSAiaGludCIgYXMgdG8gd2hhdCBzdGF0ZSB0byBlbnRlciBvbmNlIGFuIGVtYmVkZGVkIHJlZ2lvbiBoYXMNCi0JLy8gICBiZWVuIGNvbXBsZXRlZA0KLQlwcml2YXRlIGludCBmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7DQotCQ0KLQkvLyB0aGUgY29udGFpbmVyIHVzZWQgdG8gY3JlYXRlIGVtYmVkZGVkIHJlZ2lvbnMNCi0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9DT05URVhUID0gIlBST1hZX0NPTlRFWFQiOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfVU5LTk9XTl9DT05URVhUID0gIlBST1hZX1VOS05PV05fQ09OVEVYVCI7DQotDQotCXByaXZhdGUgU3RyaW5nIGNvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBzdGFydCA9IDA7DQotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOw0KLQlwcml2YXRlIGludCBsZW5ndGggPSAwOw0KLQ0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MNCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCA9IDA7DQotCQ0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkDQotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotDQotCS8vIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyBpbnNpZGUgb2YgYW4gZW1iZWRkZWQgcmVnaW9uDQotCXByaXZhdGUgU3RyaW5nIGludGVybmFsVGFnTmFtZSA9IG51bGw7DQotCXByaXZhdGUgU3RyaW5nIGludGVybmFsQ29udGV4dCA9IG51bGw7DQotDQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2Vycw0KLQlwcml2YXRlIExpc3QgZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoMCk7DQotCXByaXZhdGUgTGlzdCBmTmVzdGFibGVQcmVmaXhlcyA9IG5ldyBBcnJheUxpc3QoMSk7DQotCQ0KLQkvLyB3aGVyZSB0aGUgbGFzdCBpbnRlcm5hbCBjb250YWluZXIgYmxvY2sgd2FzIGZvdW5kDQotCXByaXZhdGUgaW50IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0gLTE7DQotDQotCS8vIHJlcXVpcmVkIHRvIG5vdCBzZWVrIHRleHQgYmxvY2tzIG9uIGFuIGVuZCB0YWcNCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOw0KLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBmRm9yYmlkSlNQID0gZmFsc2U7DQotCQ0KLQlwcml2YXRlIGludCBmRUxsZXZlbCA9IDA7DQotDQotCXByaXZhdGUgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBKU1BQYXJzZXJSZWdpb25GYWN0b3J5KCk7DQotDQotCS8vIElzIHRoZSBlbWJlZGRlZCB0YWcgYSBKU1AgdGFnDQotCXByaXZhdGUgYm9vbGVhbiBmRW1iZWRkZWRUYWcgPSBmYWxzZTsNCi0JLy8gSXMgdGhlIG5vbi1lbWJlZGRlZCB0YWcgYSBKU1AgdGFnDQotCXByaXZhdGUgYm9vbGVhbiBmQ29udGFpbmVyVGFnID0gZmFsc2U7DQotCS8vIElzIHRoZSB0b2tlbml6ZXIgaW4gYSBub24tZW1iZWRkZWQgdGFnIChiZXR3ZWVuIDwgYW5kID4pDQotCXByaXZhdGUgYm9vbGVhbiBmSW5UYWdDb250YWluZXIgPSBmYWxzZTsNCi0JLy8gSXMgdGhlIHRva2VuaXplciBpbiBhbiBlbWJlZGRlZCB0YWcgKGJldHdlZW4gPCBhbmQgPikNCi0JcHJpdmF0ZSBib29sZWFuIGZJblRhZ0VtYmVkZGVkID0gZmFsc2U7DQotDQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCANCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgew0KLQkJaWYoY29udGFpbnNUYWdOYW1lKG1hcmtlci5nZXRUYWdOYW1lKCkpKQ0KLQkJCXJldHVybjsNCi0JCWZCbG9ja01hcmtlcnMuYWRkKG1hcmtlcik7DQotCX0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGROZXN0YWJsZVByZWZpeChUYWdNYXJrZXIgbWFya2VyKSB7DQotCQlmTmVzdGFibGVQcmVmaXhlcy5hZGQobWFya2VyKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgTGlzdCBnZXROZXN0YWJsZVByZWZpeGVzKCkgew0KLQkJcmV0dXJuIGZOZXN0YWJsZVByZWZpeGVzOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGFibGUoU3RyaW5nIHRhZ05hbWUpIHsNCi0JCS8vSXRlcmF0b3IgYmxvY2tzID0gZk5lc3RhYmxlUHJlZml4ZXMuaXRlcmF0b3IoKTsNCi0JCS8vd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgew0KLQkJLy8JVGFnTWFya2VyIG1hcmtlciA9IChUYWdNYXJrZXIpYmxvY2tzLm5leHQoKTsNCi0JCS8vCVN0cmluZyBtYXJrZXJOYW1lID0gbWFya2VyLmdldFRhZ05hbWUoKTsNCi0JCS8vCWlmKHRhZ05hbWUubGVuZ3RoKCkgPiBtYXJrZXJOYW1lLmxlbmd0aCgpICsgMSAmJiB0YWdOYW1lLnN0YXJ0c1dpdGgobWFya2VyTmFtZSkgJiYgdGFnTmFtZS5jaGFyQXQobWFya2VyTmFtZS5sZW5ndGgoKSkgPT0gJzonKSB7DQotCQkvLwkJcmV0dXJuIG1hcmtlci5pc0dsb2JhbCgpIHx8IGdldE9mZnNldCgpID49IG1hcmtlci5nZXRNYXJrZXIoKS5nZXRTdGFydCgpOw0KLQkJLy8JfQ0KLQkJLy99DQotCQkvL3JldHVybiBmYWxzZTsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCANCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyBuYW1lKSB7DQotCQlpZiAoZk5lc3RhYmxlUHJlZml4ZXMgIT0gbnVsbCkgew0KLQkJCUl0ZXJhdG9yIG5lc3RhYmxlcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7DQotCQkJd2hpbGUgKG5lc3RhYmxlcy5oYXNOZXh0KCkpIHsNCi0JCQkJaWYgKCgoVGFnTWFya2VyKSBuZXN0YWJsZXMubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkNCi0JCQkJCW5lc3RhYmxlcy5yZW1vdmUoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kIA0KLQkgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7DQotCQlmQmxvY2tNYXJrZXJzLnJlbW92ZShtYXJrZXIpOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCANCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7DQotCQlpZiAoZkJsb2NrTWFya2VycyAhPSBudWxsKSB7DQotCQkJSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQkJCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7DQotCQkJCWlmICgoKEJsb2NrTWFya2VyKSBibG9ja3MubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQ0KLQkJCQkJYmxvY2tzLnJlbW92ZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZyBlbmRUYWdOYW1lKSB7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbnVsbCwgZW5kVGFnTmFtZSk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nW10gZW5kVHlwZXMpIHsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBlbmRUeXBlcywgbnVsbCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nIGVuZFR5cGUpIHsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBuZXcgU3RyaW5nW117ZW5kVHlwZX0sIG51bGwpOw0KLQl9DQotCS8qKg0KLQkgKiAgdXNlciBtZXRob2QgDQotCSAqIA0KLQkgKiBBc3NlbWJsZXMgYW4gZW1iZWRkZWQgY29udGFpbmVyIGJlZ2lubmluZyB3aXRoIHRoZSBnaXZlbiBzdGFydFR5cGUgYXMNCi0JICogdGhlIGZpcnN0IENvbnRleHRSZWdpb24gd2l0aGluIGl0IGFuZCBvZiB0aGUgdHlwZSBmRW1iZWRkZWRIaW50LiAgVGhlDQotCSAqIGVuZFR5cGVzW10gYXJyYXkgY29udGFpbnMgdGhlIGNvbnRleHQgdHlwZXMgdGhhdCB3aWxsIGNhdXNlIGEgc3VjY2Vzc2Z1bA0KLQkgKiBleGl0LiAgVXNlIG9mIHRoZSBlbmRUYWdOYW1lIHBhcmFtZXRlciBhbHRlcnMgdGhpcyBiZWhhdmlvciB0byBmb3JjZSBhbg0KLQkgKiBleGl0IG9uIGFuIFhNTF9UQUdfQ0xPU0UgYWZ0ZXIgc2VlaW5nIGFuIFhNTF9UQUdfTkFNRSB3aG9zZSBzaWduaWZpY2FudA0KLQkgKiB0ZXh0IG1hdGNoZXMgdGhlIGVuZFRhZ05hbWUgU3RyaW5nLiAgQWxsIGNvbnRlbnRzIGluIGJldHdlZW4gYXJlDQotCSAqIGluc2lnbmlmaWNhbnQsIGFuZCB5ZXMsIHRoaXMgbWVhbnMgY29tbWVudHMgYXJlIGFsbG93ZWQgaW5zaWRlLg0KLQkgKiovDQotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzLCBTdHJpbmcgZW5kVGFnTmFtZSkgew0KLQkJLy8gdGhlIGNvbnRleHQgb2YgdGhlIHJlZ2lvbiBiZWluZyBhZGRlZCB0byB0aGUgZW1iZWRkZWQgY29udGFpbmVyDQotCQlpbnRlcm5hbENvbnRleHQgPSBzdGFydFR5cGU7DQotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHRoaXMgY29udGFpbmVyIGJlZ2FuOyB0byBwcm92aWRlIHJlbGF0aXZlIGluZGVjZXMgZm9yIHRoZSByZWdpb25zDQotCQlpbnQgY29udGFpbmVyU3RhcnQgPSB5eWNoYXI7DQotCQlib29sZWFuIG5vdEZpbmlzaGVkID0gdHJ1ZTsNCi0JCS8vIGtlZXAgdHJhY2sgb2Ygd2hlcmUgd2Ugc2VlbSB0byBiZSBzbyB0aGF0IHRoZSBlbmRUYWdOYW1lIGNhbiBiZSBjaGVja2VkDQotCQlib29sZWFuIGlzSW5FbmRUYWcgPSBmYWxzZTsNCi0JCWJvb2xlYW4gaXNJbkZpcnN0VGFnID0gdHJ1ZTsNCi0JCS8vIGNyZWF0ZSB0aGUgZW1iZWRkZWQgY29udGFpbmVyIGFuZCBzZXR1cCBpdHMgInR5cGUiDQotCQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyID09IG51bGwpIHsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIgPSBuZXcgQ29udGV4dFJlZ2lvbkNvbnRhaW5lcigpOw0KLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUeXBlKGZFbWJlZGRlZEhpbnQpOw0KLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRTdGFydChjb250YWluZXJTdGFydCk7DQotCQkJLy8gVE9ETzogcGFyZW50IHJlZ2lvbiBuZWVkcyB0byBiZSBzZXQgLi4uLiBidXQgbm90IHN1cmUgd2hlcmUgdG8gZ2V0IGl0IGZyb20gDQotCQkJLy8JCWZFbWJlZGRlZENvbnRhaW5lci5zZXRQYXJlbnQocGFyZW50UmVnaW9uKTsNCi0JCX0NCi0JCWludCBpbml0aWFsTGVuZ3RoID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5zaXplKCk7DQotCQljb250YWluZXJTdGFydCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpOw0KLQkJd2hpbGUgKG5vdEZpbmlzaGVkKSB7DQotCQkJLy8gYWRkIHRoZSByZWdpb24gdG8gdGhlIGNvbnRhaW5lcg0KLQkJCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgew0KLQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOw0KLQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7DQotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsNCi0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMNCi0JCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsNCi0JCQl9DQotCQkJdHJ5IHsNCi0JCQkJLy8gbG9uZ3NjYW4gZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGF0dGVtcHQgYSBibG9ja1RhZ1NjYW4gd2l0aGluIHRoZSBlbWJlZGRlZCBjb250YWluZXINCi0JCQkJYm9vbGVhbiBsb25nc2NhbiA9IGZhbHNlOw0KLQkJCQkvLyBzYXZlIHRoZSB0b2tlbml6ZXIgc3RhdGUgaW4gY2FzZSBvZiBhIGJsb2NrIHRhZyBzY2FuDQotCQkJCWludCBwcmV2aW91c1N0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQlTdHJpbmcgcHJldmlvdXNDdXJyZW50VGFnTmFtZSA9IGZDdXJyZW50VGFnTmFtZTsNCi0JCQkJaW50IHByZXZpb3VzUG9zdFN0YXRlID0gZkVtYmVkZGVkUG9zdFN0YXRlOw0KLQkJCQlTdHJpbmcgcHJldmlvdXNFbWJlZGRlZEhpbnQgPSBmRW1iZWRkZWRIaW50Ow0KLQkJCQkvLyBkZXRlcm1pbmUgaWYgYSBibG9jayB0YWcgc2NhbiBpcyBuZWNlc3NhcnkNCi0JCQkJaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX05BTUUpIHsNCi0JCQkJCWludGVybmFsVGFnTmFtZSA9IHl5dGV4dCgpOw0KLQkJCQkJaWYoIWlzTmVzdGFibGUoaW50ZXJuYWxUYWdOYW1lKSkgew0KLQkJCQkJCWludGVybmFsVGFnTmFtZSA9IG51bGw7DQotCQkJCQkJLy8gc25hZ2dlZCBhIHRhZyBuYW1lIHdlIHNob3VsZG4ndCBoYXZlDQotCQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQUJPUlRfRU1CRURERUQ7DQotCQkJCQkJbm90RmluaXNoZWQgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQllbHNlIGlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19PUEVOIHx8IGludGVybmFsQ29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7DQotCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSBudWxsOw0KLQkJCQl9DQotCQkJCS8vIGRvIHVwa2VlcCBmb3IgZW5kVGFnTmFtZSB1c2FnZTsgbXVzdCBiZSBoZXJlIHNpbmNlIHRoZSBuZXh0IHRva2VuIGNvdWxkIGJlIHRoZSBjbG9zZQ0KLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsNCi0JCQkJCWlzSW5FbmRUYWcgPSB0cnVlOw0KLQkJCQl9IGVsc2UgaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX0NMT1NFKSB7DQotCQkJCQlpc0luRmlyc3RUYWcgPSBpc0luRW5kVGFnID0gZmFsc2U7DQotCQkJCX0gZWxzZSB7DQotCQkJCSAJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucyA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7DQotCQkJCQlpZiAoZW1iZWRkZWRSZWdpb25zLnNpemUoKSA+IDIgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKS0xKSkuZ2V0VHlwZSgpID09IFhNTF9UQUdfQ0xPU0UgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKSAtIDMpKS5nZXRUeXBlKCkgPT0gWE1MX1RBR19PUEVOICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsKSB7DQotCQkJCQkJaWYgKGNvbnRhaW5zVGFnTmFtZShpbnRlcm5hbFRhZ05hbWUpKSB7DQotCQkJCQkJCWxvbmdzY2FuID0gdHJ1ZTsNCi0JCQkJCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWlmIChsb25nc2NhbikNCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IGludGVybmFsVGFnTmFtZTsNCi0JCQkJLy8gcmVhZCB0aGUgbmV4dCByZWdpb24gYW5kIGNvbnRleHQNCi0JCQkJaW50ZXJuYWxDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQlpZiAobG9uZ3NjYW4pIHsNCi0JCQkJCS8vIFJldHVybmluZyBmcm9tIGEgYmxvY2sgdGFnIHNjYW4gcmVxdWlyZXMgcmVzdG9yaW5nIHNvbWUgc3RhdGUgdmFyaWFibGVzDQotCQkJCQkvLyBhcyB3ZWxsIGFzIGhhbmRsaW5nIHRoZSBibG9jayByZWdpb24gYW5kIHNldHRpbmcgdXAgZm9yIG5vcm1hbCBzY2FubmluZw0KLQkJCQkJLy8gaW5zaWRlIHRoZSBlbWJlZGRlZCBjb250YWluZXINCi0JCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7DQotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7DQotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOw0KLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOw0KLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMNCi0JCQkJCS8vIG5ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOw0KLQkJCQkJbG9uZ3NjYW4gPSBmYWxzZTsNCi0JCQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IHByZXZpb3VzUG9zdFN0YXRlOw0KLQkJCQkJZkVtYmVkZGVkSGludCA9IHByZXZpb3VzRW1iZWRkZWRIaW50Ow0KLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gcHJldmlvdXNDdXJyZW50VGFnTmFtZTsNCi0JCQkJCXl5YmVnaW4ocHJldmlvdXNTdGF0ZSk7DQotCQkJCQlpbnRlcm5hbENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCX0NCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCS8vIHByaW1HZXROZXh0VG9rZW4oKSBjYWxscyBtYXkgdGhyb3cgYW4gSU9FeGNlcHRpb24NCi0JCQkJLy8gY2F0Y2ggYW5kIGRvIG5vdGhpbmcgc2luY2UgdGhlIGlzRU9GIGNoZWNrIGJlbG93DQotCQkJCS8vIHdpbGwgcHJvcGVybHkgZXhpdCBpZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydA0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBmKSB7DQotCQkJCS8vIHNvbWUgb3RoZXIgZXhjZXB0aW9uIGhhcHBlbmVkOyBuZXZlciBzaG91bGQNCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihmKTsNCi0JCQl9DQotCQkJYm9vbGVhbiBpc0VuZGluZ1R5cGUgPSB5eXN0YXRlKCkgPT0gU1RfQUJPUlRfRU1CRURERUQ7DQotCQkJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkTGlzdCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7DQotCQkJaWYoIWlzRW5kaW5nVHlwZSkgew0KLQkJCQkvLyBjaGVjayBmb3IgZW5kaW5nIGNvbnRleHQNCi0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkgew0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmRUeXBlcy5sZW5ndGg7IGkrKykgew0KLQkJCQkJCWlzRW5kaW5nVHlwZSA9IGlzRW5kaW5nVHlwZSB8fCAoaW50ZXJuYWxDb250ZXh0ID09IGVuZFR5cGVzW2ldKSB8fCAoZW1iZWRkZWRMaXN0LnNpemUoKSAtIGluaXRpYWxMZW5ndGgpID49IDIgJiYgKGVtYmVkZGVkTGlzdC5nZXQoZW1iZWRkZWRMaXN0LnNpemUoKS0xKSkuZ2V0VHlwZSgpID09IGVuZFR5cGVzW2ldOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJaXNFbmRpbmdUeXBlID0gKChpc0luRW5kVGFnICYmIGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX0NMT1NFKSB8fCAoaXNJbkZpcnN0VGFnICYmIGludGVybmFsQ29udGV4dCA9PSBYTUxfRU1QVFlfVEFHX0NMT1NFKSkgJiYgaW50ZXJuYWxUYWdOYW1lICE9IG51bGwgJiYgaW50ZXJuYWxUYWdOYW1lLmVxdWFscyhlbmRUYWdOYW1lKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlub3RGaW5pc2hlZCA9IG5vdEZpbmlzaGVkICYmICgoIWlzRW5kaW5nVHlwZSkgJiYgIWlzRU9GKCkgJiYgKGVuZFRhZ05hbWUgIT0gbnVsbCB8fCBpbnRlcm5hbENvbnRleHQgIT0gVU5ERUZJTkVEKSAmJiAhKGludGVybmFsQ29udGV4dCA9PSBQUk9YWV9DT05URVhUICYmIChlbWJlZGRlZExpc3QuZ2V0KGVtYmVkZGVkTGlzdC5zaXplKCktMSkpLmdldFR5cGUoKSA9PSBVTkRFRklORUQpKTsNCi0JCX0NCi0JCS8vIGZpbmlzaCBhZGRpbmcgdGhlIGxhc3QgY29udGV4dA0KLQkJaWYgKGludGVybmFsQ29udGV4dCAhPSBudWxsICYmIGludGVybmFsQ29udGV4dCAhPSBQUk9YWV9DT05URVhUKSB7DQotCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihpbnRlcm5hbENvbnRleHQsIHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0LCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7DQotCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMNCi0JCQkvL25ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOw0KLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoeXljaGFyIC0gY29udGFpbmVyU3RhcnQgKyB5eWxlbmd0aCgpKTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aCh5eWNoYXIgLSBjb250YWluZXJTdGFydCArIHl5bGVuZ3RoKCkpOw0KLQkJfQ0KLQkJeXliZWdpbihmRW1iZWRkZWRQb3N0U3RhdGUpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKCkgew0KLQkJcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgew0KLQkJZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gbmV3VmFsdWU7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoKSB7DQotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckFsbG93c0pTUChTdHJpbmcgbmFtZSkgew0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOw0KLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsNCi0JCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCQlyZXR1cm4gbWFya2VyLmFsbG93c0pTUCgpOw0KLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQ0KLQkJCQlyZXR1cm4gbWFya2VyLmFsbG93c0pTUCgpOw0KLQkJfQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKSB7DQotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgew0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOw0KLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsNCi0JCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsNCi0JCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkNCi0JCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7DQotCQl9DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dCgpIHsNCi0JCXJldHVybiBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dChTdHJpbmcgbmFtZSkgew0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOw0KLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCQlyZXR1cm4gbWFya2VyLmdldENvbnRleHQoKTsNCi0JCX0NCi0JCXJldHVybiBCTE9DS19URVhUOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsNCi0JCXJldHVybiBmQmxvY2tNYXJrZXJzOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgew0KLQkJcmV0dXJuIGZPZmZzZXQgKyB5eWNoYXI7DQotCX0NCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoKSB7DQotCQlyZXR1cm4gaXNCbG9ja01hcmtlcihmQ3VycmVudFRhZ05hbWUpOw0KLQl9DQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7DQotCQlpZiAoIWZJc0Jsb2NraW5nRW5hYmxlZCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlyZXR1cm4gY29udGFpbnNUYWdOYW1lKHRhZ05hbWUpOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsNCi0JCWJlZ2luQmxvY2tNYXJrZXJTY2FuKG5ld1RhZ05hbWUsIEJMT0NLX1RFWFQpOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKg0KLQkgKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQ0KLQkgKiBzdGFydCBvZiBhIHRleHQgYmxvY2sgd2l0aGluIGEgIm5ld1RhZ05hbWUiIHRhZy4NCi0JICoNCi0JICogRXhhbXBsZTogDQotCSAqCVRva2VuaXplciB0b2tlciA9IG5ldyBUb2tlbml6ZXIoKTsNCi0JICoJdG9rZXIuc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGZhbHNlKTsNCi0JICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOw0KLQkgKgl0b2tlci5iZWdpbkJsb2NrTWFya2VyU2Nhbigic2NyaXB0IiwgQkxPQ0tfVEVYVCk7DQotCSAqCXRva2VyLmdldFJlZ2lvbnMoKTsgDQotCSAqDQotCSAqIFJldHVybnM6DQotCSAqCUJMT0NLX1RFWFQ6IDAtNDANCi0JICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDINCi0JICoJWE1MX1RBR19OQU1FOiA0My00OA0KLQkgKglYTUxfVEFHX0NMT1NFOiA0OS00OQ0KLQkgKglYTUxfQ09OVEVOVDogNTAtNTcNCi0JICoNCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7DQotCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JCWZDdXJyZW50VGFnTmFtZSA9IG5ld1RhZ05hbWU7DQotCX0NCi0NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9TY2FuKFN0cmluZyBzZWFyY2hTdHJpbmcsIGJvb2xlYW4gcmVxdWlyZVRhaWxTZXBhcmF0b3IsIGJvb2xlYW4gYWxsb3dKU1AsIGJvb2xlYW4gYWxsb3dDREFUQSwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJcmV0dXJuIGRvU2NhbihzZWFyY2hTdHJpbmcsIHJlcXVpcmVUYWlsU2VwYXJhdG9yLCBhbGxvd0pTUCwgYWxsb3dDREFUQSwgZmFsc2UsIHNlYXJjaENvbnRleHQsIGV4aXRTdGF0ZSwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7DQotCX0NCi0vKioNCi0gKiBNZXRob2QgZG9TY2FuLg0KLSAqIA0KLSAqIFJldHVybnMgYSBjb250ZXh0IHJlZ2lvbiBmb3IgYWxsIG9mIHRoZSB0ZXh0IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gdXB0byB0aGUgZW5kIG9mIGlucHV0IG9yDQotICogdG8gcmlnaHQgKmJlZm9yZSogdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBzZWFyY2hTdHJpbmcNCi0gKiANCi0gKiBAcGFyYW0gc2VhcmNoU3RyaW5nIC0gdGFyZ2V0IHN0cmluZyB0byBzZWFyY2ggZm9yIGV4LjogIi0tPiIsICI8L3RhZ25hbWUiDQotICogQHBhcmFtIHJlcXVpcmVUYWlsU2VwYXJhdG9yIC0gd2hldGhlciB0aGUgdGFyZ2V0IG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAnPicNCi0gKiBAcGFyYW0gYWxsb3dKU1AgLSBjaGVjayBmb3IgYW5kIGFsbG93IGZvciBKU1AgbWFya3VwIDwlJT4NCi0gKiBAcGFyYW0gYWxsb3dUYWcgLSBjaGVjayBmb3IgYW5kIGFsbG93IGZvciB4bWwgdGFncyA8DQotICogQHBhcmFtIGNvbnRleHQgLSB0aGUgY29udGV4dCBvZiB0aGUgc2Nhbm5lZCByZWdpb24gaWYgbm9uLXplcm8gbGVuZ3RoDQotICogQHBhcmFtIGV4aXRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgcmVnaW9uIHdhcyBvZiBub24temVybyBsZW5ndGgNCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQ0KLSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGNvbnRleHQgZm91bmQ6IHRoZSBkZXNpcmVkIGNvbnRleHQgb24gYSBub24temVybyBsZW5ndGggbWF0Y2gsIHRoZSBhYm9ydENvbnRleHQgb24gaW1tZWRpYXRlIHN1Y2Nlc3MNCi0gKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9TY2FuKFN0cmluZyBzZWFyY2hTdHJpbmcsIGJvb2xlYW4gcmVxdWlyZVRhaWxTZXBhcmF0b3IsIGJvb2xlYW4gYWxsb3dKU1AsIGJvb2xlYW4gYWxsb3dDREFUQSwgYm9vbGVhbiBhbGxvd1RhZywgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQlib29sZWFuIHN0aWxsU2VhcmNoaW5nID0gdHJ1ZTsNCi0JYm9vbGVhbiB3YXNCbG9ja2luZ0VuYWJsZWQgPSBmSXNCbG9ja2luZ0VuYWJsZWQ7DQotCXRyeSB7DQotCQkvLyBEaXNhYmxlIGZ1cnRoZXIgYmxvY2sgKHByb2JhYmx5KQ0KLQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCQlpbnQgc2VhcmNoU3RyaW5nTGVuZ3RoID0gc2VhcmNoU3RyaW5nLmxlbmd0aCgpOw0KLQkJaW50IG4gPSAwOw0KLQkJY2hhciBsYXN0Q2hlY2tDaGFyOw0KLQkJaW50IGk7DQotCQlib29sZWFuIHNhbWUgPSBmYWxzZTsNCi0JCS8vIENoZWNrIGZvciBKU1Agc3RhcnRzICgiPCUiKSBpZiB0aGUgdGFnIGlzIGdsb2JhbCBsaWtlIFNDUklQVCBvciBTVFlMRQ0KLQkJYm9vbGVhbiBjaGVja0pTUHMgPSBhbGxvd0pTUCAmJiAhZkZvcmJpZEpTUDsNCi0JCWJvb2xlYW4gY2hlY2tlZEZvckpTUHNPbmNlID0gIWNoZWNrSlNQczsNCi0JCWJvb2xlYW4gY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSA9IGZhbHNlOw0KLQkJDQotCQl3aGlsZSAoc3RpbGxTZWFyY2hpbmcpIHsNCi0JCQluID0gMDsNCi0JCQkvLyBFbnN1cmUgdGhhdCBlbm91Z2ggZGF0YSBmcm9tIHRoZSBpbnB1dCBleGlzdHMgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBzZWFyY2ggU3RyaW5nLg0KLQkJCW4gPSB5eV9hZHZhbmNlKCk7DQotCQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQ0KLQkJCQluID0geXlfYWR2YW5jZSgpOw0KLQkvLwkJYyA9IChjaGFyKSBuOw0KLQkJCS8vIElmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0IG9yIHdlJ3ZlIGV4aGF1c3RlZCB0aGUgaW5wdXQsIHN0b3AgaW1tZWRpYXRlbHkuDQotCQkJaWYgKG4gPT0gWVlFT0YgJiYgY2hlY2tlZEZvckpTUHNPbmNlKSB7DQotCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQkvKioNCi0JCQkJICogTG9vayBmb3Igc3RhcnRpbmcgSlNQcyAiPCUiDQotCQkJCSAqLw0KLQkJCQljaGVja2VkRm9ySlNQc09uY2UgPSB0cnVlOw0KLQkJCQkvLyAxKSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoIDogVGhlcmUncyBhdCBsZWFzdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBvbmNlIHRoYXQncyByZWFkLCBjaGVjayBmb3IgSlNQcw0KLQkJCQkvLyAtLS0NCi0JCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IGN1cnJlbnQtc2VhcmNoU3RyaW5nTGVuZ3RoOyBpZiBzbywgYmFja3VwIGFuZCBzd2l0Y2ggc2Nhbm5lciBzdGF0ZXMgdG8gaGFuZGxlIGl0Lg0KLQkJCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPCUlPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZA0KLQkJCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uDQotCQkJCWlmKGNoZWNrSlNQcyAmJiB5eV9jdXJyZW50UG9zID4gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgDQotCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICsgMV0gPT0gJyUnKSB7DQotCQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7DQotCQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOw0KLQkJCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOw0KLQkJCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQkJfQ0KLQkJCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotCQkJCX0NCi0JCQkJLy8gMikgeXlfY3VycmVudFBvcyAtIGpzcHN0YXJ0ZXIubGVuZ3RoIDogVGhlcmUncyBub3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgY2hlY2sgZm9yIGEgSlNQIDIgc3BvdHMgYmFjayBpbiB3aGF0IHdlIGNvdWxkIHJlYWQNCi0JCQkJLy8gLS0tDQotCQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uICpoYXZpbmcqIGNsb3NlVGFnU3RyaW5nTGVuZ3RoIGFtb3VudCBvZiBpbnB1dCB0byB3b3JrIGFzIGRlc2lnbmVkLiAgTXVzdCBiZSBzdXJlIHdlIGRvbid0DQotCQkJCS8vIHNwaWxsIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIGNoZWNraW5nLg0KLQkJCQllbHNlIGlmKGNoZWNrSlNQcyAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfY3VycmVudFBvcyA+IDAgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmDQotCQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSAxXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdID09ICclJykgew0KLQkJCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gMTsNCi0JCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOw0KLQkJCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7DQotCQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7DQotCQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7DQotCQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7DQotCQkJCQl9DQotCQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi0JCQkJfQ0KLQkJCQkvLyAzKSB5eV9jdXJyZW50UG9zLi4oeXlfY3VycmVudFBvcytqc3BTdGFydGxlbmd0aC0xKSA6IENoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb25lIHRpbWUNCi0JCQkJLy8gLS0tDQotCQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uIHl5X2N1cnJlbnRQb3MgZXF1YWxpbmcgZXhhY3RseSB0aGUgcHJldmlvdXMgZW5kICsxIHRvIHdvcmsgYXMgZGVzaWduZWQuDQotCQkJCWVsc2UgaWYoY2hlY2tKU1BzICYmICFjaGVja2VkSlNQc0F0U3RhcnRPbmNlICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9zdGFydFJlYWQgPiAwICYmDQotCQkJCQkJeXlfc3RhcnRSZWFkIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQgKyAxXSA9PSAnJScpIHsNCi0JCQkJCWNoZWNrZWRKU1BzQXRTdGFydE9uY2UgPSB0cnVlOw0KLQkJCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9zdGFydFJlYWQ7DQotCQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOw0KLQkJCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOw0KLQkJCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQkJfQ0KLQkJCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotCQkJCX0NCi0JCQkJLy8gNCkgWE1MIHRhZyANCi0JCQkJZWxzZSBpZihhbGxvd1RhZyAmJiBjaGVja0pTUHMgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIA0KLQkJCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSA9PSAnPCcpIHsNCi0JCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsNCi0JCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOw0KLQkJCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQkJCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOw0KLQkJCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQkJfQ0KLQkJCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotCQkJCX0NCi0JDQotCQ0KLQkJCQkvKioNCi0JCQkJICogTG9vayBmb3Igc3RhcnRpbmcgQ0RBVEEgIjwhW0NEQVRBWyINCi0JCQkJICovDQotCQkJCS8vIDEpIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg6IFRoZXJlJ3MgYXQgbGVhc3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgb25jZSB0aGF0J3MgcmVhZCwgY2hlY2sgZm9yIENEQVRBDQotCQkJCS8vIC0tLQ0KLQkJCQkvLyBMb29rIGZvciBhIENEQVRBIGJlZ2lubmluZyBhdCBjdXJyZW50LXNlYXJjaFN0cmluZ0xlbmd0aDsgaWYgc28sIGJhY2t1cCBhbmQgc3dpdGNoIHNjYW5uZXIgc3RhdGVzIHRvIGhhbmRsZSBpdC4NCi0JCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDxbIUNEQVRBW11dPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZA0KLQkJCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uDQotCS8qCQkJaWYoY2hlY2tDREFUQSAmJiB5eV9jdXJyZW50UG9zID4gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgKyBzZWFyY2hTdHJpbmdMZW5ndGggPCB5eV9idWZmZXIubGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgDQotCQkJCQljaGFyc01hdGNoKGNkYXRhU3RhcnRlciwgeXlfYnVmZmVyLCAwLCB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoKSkgew0KLQkJCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOw0KLQkJCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7DQotCQkJCQkvLyBnbyB0byBhIHN0YXRlIHdoZXJlIENEQVRBIGNhbiBiZSBmb3VuZA0KLQkJCQkJaWYgKGZFbWJlZGRlZENvbnRhaW5lciA9PSBudWxsKSB7DQotCQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsNCi0JCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShzZWFyY2hDb250ZXh0KTsNCi0JCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0U3RhcnQoeXljaGFyKTsNCi0JCQkJCX0NCi0JCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oc2VhcmNoQ29udGV4dCwgeXljaGFyLCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsNCi0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsNCi0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7DQotCQkJCQlTdHJpbmcgY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCWlmKGNvbnRleHQuZXF1YWxzKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOKSkgew0KLQkJCQkJCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX09QRU4sIFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9DTE9TRSk7DQotCQkJCQl9DQotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQkJCQl9DQotCSovLyoNCi0JCQkJLy8gMikgeXlfY3VycmVudFBvcyAtIGNkYXRhU3RhcnRlci5sZW5ndGg6IFRoZXJlJ3Mgbm90IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IGNoZWNrIGZvciBhIENEQVRBIHJpZ2h0IGhlcmUgc3BvdHMgYmFjayBpbiB3aGF0IHdlIGNvdWxkIHJlYWQNCi0JCQkJLy8gLS0tDQotCQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uICpoYXZpbmcqIGNsb3NlVGFnU3RyaW5nTGVuZ3RoIGFtb3VudCBvZiBpbnB1dCB0byB3b3JrIGFzIGRlc2lnbmVkLiAgTXVzdCBiZSBzdXJlIHdlIGRvbid0DQotCQkJCS8vIHNwaWxsIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIGNoZWNraW5nLg0KLQkJCQllbHNlIGlmKGNoZWNrQ0RBVEEgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X2N1cnJlbnRQb3MgPiAwICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJg0KLQkJCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gMV0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSA9PSAnJScpIHsNCi0JCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7DQotCQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOw0KLQkJCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOw0KLQkJCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQkJfQ0KLQkJCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotCQkJCX0NCi0JCQkJLy8gMykgeXlfY3VycmVudFBvcyA6IENoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb25lIHRpbWUNCi0JCQkJLy8gLS0tDQotCQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uIHl5X2N1cnJlbnRQb3MgZXF1YWxpbmcgZXhhY3RseSB0aGUgcHJldmlvdXMgZW5kICsxIHRvIHdvcmsgYXMgZGVzaWduZWQuDQotCQkJCWVsc2UgaWYoY2hlY2tDREFUQSAmJiAhY2hlY2tlZEZvckNEQVRBT25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJg0KLQkJCQkJCXl5X3N0YXJ0UmVhZCA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWRdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgMV0gPT0gJyUnKSB7DQotCQkJCQljaGVja2VkRm9yQ0RBVEFPbmNlID0gdHJ1ZTsNCi0JCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOw0KLQkJCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7DQotCQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsNCi0JCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsNCi0JCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJCQlyZXR1cm4ganNwQ29udGV4dDsNCi0JCQkJCX0NCi0JCQkJCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQkJCQl9DQotCSovDQotCQkJCS8vIENoZWNrIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSB0YXJnZXQgdmVyc3VzIHRoZSBsYXN0IHRhcmdldExlbmd0aCBjaGFyYWN0ZXJzIHJlYWQgZnJvbSB0aGUgYnVmZmVyDQotCQkJCS8vIGFuZCBzZWUgaWYgaXQgbWF0Y2hlcw0KLQkJCQlpZiAobiA9PSBZWUVPRikgew0KLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXNhbWUgPSB0cnVlOw0KLQkJCQkJLy8gc2FmZXR5IGNoZWNrIGZvciBhcnJheSBhY2Nlc3Nlcw0KLQkJCQkJaWYoeXlfY3VycmVudFBvcyA+PSBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyA8PSB5eV9idWZmZXIubGVuZ3RoKSB7DQotCQkJCQkJZm9yKGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHNhbWU7IGkrKykgew0KLQkJCQkJCQlpZihmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpDQotCQkJCQkJCQlzYW1lID0geXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSA9PSBzZWFyY2hTdHJpbmcuY2hhckF0KGkpOw0KLQkJCQkJCQllbHNlDQotCQkJCQkJCQlzYW1lID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0pID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzZWFyY2hTdHJpbmcuY2hhckF0KGkpKTsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCQkvLyBzYWZldHkgY2hlY2sgZmFpbGVkOyBubyBtYXRjaCBpcyBwb3NzaWJsZSByaWdodCBub3cNCi0JCQkJCWVsc2Ugew0KLQkJCQkJCXNhbWUgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgew0KLQkJCQkJLy8gQWRkaXRpb25hbCBjaGVjayBmb3IgY2xvc2UgdGFncyB0byBlbnN1cmUgdGhhdCB0YXJnZXRTdHJpbmc9Ijwvc2NyaXB0IiBkb2Vzbid0IG1hdGNoDQotCQkJCQkvLyAiPC9zY3JpcHRTIg0KLQkJCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsNCi0JCQkJCS8vIFN1Y2NlZWQgb24gIjwvc2NyaXB0PiIgYW5kICI8L3NjcmlwdCAiDQotCQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQ0KLQkJCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWlmIChuICE9IFlZRU9GIHx8IHNhbWUpIHsNCi0JCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoDQotCQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsNCi0JCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlDQotCQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkNCi0JCQlpZiAoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOw0KLQkJCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2Ugew0KLQkJCS8vIFdlIHJhbiB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBpbnB1dA0KLQkJCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7DQotCQkJeXlfY3VycmVudFBvcysrOw0KLQkJfQ0KLQkJeXliZWdpbihleGl0U3RhdGUpOw0KLQkJLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQ0KLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkNCi0JCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpDQotCQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQl9DQotCWZpbmFsbHkgew0KLQkJZklzQmxvY2tpbmdFbmFibGVkID0gd2FzQmxvY2tpbmdFbmFibGVkOw0KLQl9DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lDQotICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpOw0KLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKCksIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7DQotfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICoNCi0JICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpDQotCSAqIG1ldGhvZCBpbnRvIGEgZnVsbCBJVGV4dFJlZ2lvbiBieSBwdWxsaW5nIGluIHZhbHVlcyBmb3IgdGhlDQotCSAqIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiB0aGUgc2Nhbm5pbmcgdGV4dC4NCi0JICoNCi0JICogUmV0dXJucyBudWxsIHdoZW4gRU9GIGlzIGVuY291bnRlcmVkIGFuZCBhdHRhY2hlcyBpbnRlcm1pdHRlbnRseQ0KLQkgKiBkaXNjb3ZlcmVkIHdoaXRlc3BhY2Ugb250byB0aGUgZW5kIG9mIHVzZWZ1bCByZWdpb25zLg0KLQkgKg0KLQkgKiBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gY2FjaGVzIHRoZSB0b2tlbiBmb2xsb3dpbmcgdGhlIG9uZSBiZWluZyByZXR1cm5lZA0KLQkgKiBzbyB0aGF0IHdoaXRlc3BhY2UgY2FuIGJlIGNvbGxhcHNlZC4NCi0JICovDQotCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsNCi0JCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykNCi0JCWlmIChmU2hvdWxkTG9hZEJ1ZmZlcmVkKSB7DQotCQkJaWYgKGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyICE9IG51bGwpIHsNCi0JCQkJSVRleHRSZWdpb24gY29udGFpbmVyID0gZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXI7DQotCQkJCWZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsNCi0JCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJCQlyZXR1cm4gY29udGFpbmVyOw0KLQkJCX0NCi0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsNCi0JCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0Ow0KLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7DQotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJfSBlbHNlIHsNCi0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCWlmIChjb250ZXh0ID09IFBST1hZX0NPTlRFWFQpIHsNCi0JCQkJcmV0dXJuIGZFbWJlZGRlZENvbnRhaW5lcjsNCi0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfUk9PVF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7DQotCQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpDQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsNCi0JCQkJZWxzZQ0KLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsNCi0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7DQotCQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7DQotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsNCi0JCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCQkJfQ0KLQkJCXN0YXJ0ID0geXljaGFyOw0KLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCWlmICh5eV9hdEVPRikgew0KLQkJCQlmVG9rZW5Db3VudCsrOw0KLQkJCQlyZXR1cm4gbnVsbDsNCi0JCQl9DQotCQl9DQotCQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbg0KLQkJZl9jb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJaWYgKGZfY29udGV4dCA9PSBQUk9YWV9DT05URVhUKSB7DQotCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBmRW1iZWRkZWRDb250YWluZXI7DQotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7DQotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsNCi0JCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQ0KLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsNCi0JCQllbHNlDQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsNCi0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOw0KLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgew0KLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOw0KLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gUFJPWFlfVU5LTk9XTl9DT05URVhUKSB7DQotCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBmUHJveHlVbmtub3duUmVnaW9uOw0KLQkJfQ0KLQkJZkJ1ZmZlcmVkQ29udGV4dCA9IGZfY29udGV4dDsNCi0JCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOw0KLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgPT0gV0hJVEVfU1BBQ0UpIHsNCi0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCQkJbGVuZ3RoICs9IGZCdWZmZXJlZExlbmd0aDsNCi0JCX0NCi0JCWlmIChjb250ZXh0ID09IG51bGwpIHsNCi0JCQkvLyBFT0YNCi0JCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCWZUb2tlbkNvdW50Kys7DQotCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgSlNQVG9rZW5pemVyKCl7DQotCQlzdXBlcigpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBKU1BUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7DQotCQkJdGhpcyhuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSkpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsNCi0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSwgaW50IG5ld09mZnNldCkgew0KLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsNCi0JCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgMCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCkgew0KLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCBuZXdPZmZzZXQpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluKSB7DQotCQlyZXNldChpbiwgMCk7DQotCX0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kICoNCi0JICoNCi0JICogUmVzZXQgaW50ZXJuYWwgY291bnRlcnMgYW5kIHZhcnMgdG8gIm5ld2x5IGNyZWF0ZWQiIHZhbHVlcywgaW4gdGhlIGhvcGVzDQotCSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuDQotCSAqDQotCSAqIFRoaXMgbWV0aG9kIGNvbnRhaW5zIGNvZGUgYmxvY2tzIHRoYXQgd2VyZSBlc3NlbnRpYWxseSBkdXBsaWNhdGVkIGZyb20gdGhlDQotCSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMNCi0JICogYWRkZWQuICBUaG9zZSBjb2RlIGJsb2NrcyB3ZXJlIHVuZGVyIHRoZSBhYm92ZSBjb3B5cmlnaHQuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgew0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXNldHRpbmcgdG9rZW5pemVyIik7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJZk9mZnNldCA9IG5ld09mZnNldDsNCi0JDQotCQkvKiB0aGUgaW5wdXQgZGV2aWNlICovDQotCQl5eV9yZWFkZXIgPSBpbjsNCi0JDQotCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotCQl5eV9zdGF0ZSA9IDA7DQotCQ0KLQkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLw0KLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsNCi0JDQotCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotCQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOw0KLQkNCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotCQl5eV9tYXJrZWRQb3MgPSAwOw0KLQkNCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotCQl5eV9wdXNoYmFja1BvcyA9IDA7DQotCQ0KLQkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotCQl5eV9jdXJyZW50UG9zID0gMDsNCi0JDQotCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0JCXl5X3N0YXJ0UmVhZCA9IDA7DQotCQ0KLQkJLyoqIA0KLQkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotCQkgKiBmcm9tIGlucHV0IA0KLQkJICovDQotCQl5eV9lbmRSZWFkID0gMDsNCi0JDQotCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCS8veXlsaW5lID0gMDsNCi0JDQotCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCXl5Y2hhciA9IDA7DQotCQ0KLQkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLQkJeXlfYXRFT0YgPSBmYWxzZTsNCi0JDQotCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8NCi0JCXl5X2VvZl9kb25lID0gZmFsc2U7DQotCQ0KLQkNCi0JCS8qIHVzZXIgdmFyczogKi8NCi0JCWZUb2tlbkNvdW50ID0gMDsNCi0JIA0KLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7DQotCQlmQnVmZmVyZWRTdGFydCA9IDE7DQotCQlmQnVmZmVyZWRMZW5ndGggPSAwOw0KLQkJZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsNCi0JDQotCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOw0KLQkNCi0JCWNvbnRleHQgPSBudWxsOw0KLQkJc3RhcnQgPSAwOw0KLQkJdGV4dExlbmd0aCA9IDA7DQotCQlsZW5ndGggPSAwOw0KLQkNCi0JCWZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7DQotCQkNCi0JCWZFTGxldmVsID0gMDsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICoNCi0JICovDQotCXB1YmxpYyBCbG9ja1Rva2VuaXplciBuZXdJbnN0YW5jZSgpIHsNCi0JCUpTUFRva2VuaXplciBuZXdJbnN0YW5jZSA9IG5ldyBKU1BUb2tlbml6ZXIoKTsNCi0JCS8vIGdsb2JhbCB0YWdtYXJrZXJzIGNhbiBiZSBzaGFyZWQ7IHRoZXkgaGF2ZSBubyBzdGF0ZSBhbmQgDQotCQkvLyBhcmUgbmV2ZXIgZGVzdHJveWVkIChlLmcuICdyZWxlYXNlJykNCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7DQotCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGZCbG9ja01hcmtlcnMuZ2V0KGkpOw0KLQkJCWlmKGJsb2NrTWFya2VyLmlzR2xvYmFsKCkpDQotCQkJCW5ld0luc3RhbmNlLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsNCi0JCX0NCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmTmVzdGFibGVQcmVmaXhlcy5zaXplKCk7IGkrKykgew0KLQkJCVRhZ01hcmtlciBtYXJrZXIgPSAoVGFnTWFya2VyKSBmTmVzdGFibGVQcmVmaXhlcy5nZXQoaSk7DQotCQkJaWYobWFya2VyLmlzR2xvYmFsKCkpDQotCQkJCW5ld0luc3RhbmNlLmFkZE5lc3RhYmxlUHJlZml4KG1hcmtlcik7DQotCQl9DQotCQlyZXR1cm4gbmV3SW5zdGFuY2U7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhblhNTENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCS8vIFNjYW4gZm9yICctLT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcw0KLQkJLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gNCi0JCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfWE1MX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQNCi0JCS8vICBjb250ZXh0IGFzIHVzdWFsLg0KLQkJcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuSlNQQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJLy8gU2NhbiBmb3IgJy0tJT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcw0KLQkJLy8gICBKU1BfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gNCi0JCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfSlNQX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQNCi0JCS8vICBjb250ZXh0IGFzIHVzdWFsLg0KLQkJcmV0dXJuIGRvU2NhbigiLS0lPiIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgSlNQX0NPTU1FTlRfVEVYVCwgU1RfSlNQX0NPTU1FTlRfRU5ELCBTVF9KU1BfQ09NTUVOVF9FTkQpOw0KLQl9DQotCQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwcml2YXRlIGJvb2xlYW4gaXNKc3BUYWcoKSB7DQotCQlyZXR1cm4gKGZDb250YWluZXJUYWcgJiYgZkVtYmVkZGVkQ29udGFpbmVyICE9IG51bGwpIHx8IChmQ29udGFpbmVyVGFnICYmIGZJblRhZ0NvbnRhaW5lcikgfHwgKGZFbWJlZGRlZFRhZyAmJiBmSW5UYWdFbWJlZGRlZCk7DQotCX0NCi0lfQ0KLQ0KLSVlb2Z7DQotLy8gZG8gbm90aGluZywgdGhpcyBpcyB0aGUgZG93bnN0cmVhbSBwYXJzZXIncyBqb2INCi0lZW9mfQ0KLQ0KLSVwdWJsaWMNCi0lY2xhc3MgSlNQVG9rZW5pemVyDQotJWltcGxlbWVudHMgQmxvY2tUb2tlbml6ZXIsIERPTUpTUFJlZ2lvbkNvbnRleHRzDQotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4NCi0ldHlwZSBTdHJpbmcNCi0lY2hhcg0KLSV1bmljb2RlDQotJXBhY2sNCi0NCi0lc3RhdGUgU1RfQ0RBVEFfVEVYVA0KLSVzdGF0ZSBTVF9DREFUQV9FTkQNCi0lc3RhdGUgU1RfWE1MX0NPTU1FTlQNCi0lc3RhdGUgU1RfWE1MX0NPTU1FTlRfRU5EDQotJXN0YXRlIFNUX1BJDQotJXN0YXRlIFNUX1BJX1dTDQotJXN0YXRlIFNUX1BJX0NPTlRFTlQNCi0lc3RhdGUgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX1hNTF9QSV9FUVVBTFMNCi0lc3RhdGUgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRQ0KLSVzdGF0ZSBTVF9YTUxfUElfVEFHX0NMT1NFDQotJXN0YXRlIFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX0RIVE1MX0VRVUFMUw0KLSVzdGF0ZSBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUNCi0lc3RhdGUgU1RfREhUTUxfVEFHX0NMT1NFDQotDQotLy8gc2NyaXB0bGV0IHN0YXRlKHMpDQotJXN0YXRlIFNUX0pTUF9DT05URU5UDQotJXN0YXRlIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRQ0KLSVzdGF0ZSBTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRQ0KLSVzdGF0ZSBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTDQotJXN0YXRlIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFDQotDQotLy8gbm9ybWFsIHRhZyBzdGF0ZXMNCi0lc3RhdGUgU1RfWE1MX1RBR19OQU1FDQotJXN0YXRlIFNUX1hNTF9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9YTUxfRVFVQUxTDQotJXN0YXRlIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUNCi0NCi0vLyBkZWNsYXJhdGlvbiAoRFREKSBzdGF0ZXMNCi0lc3RhdGUgU1RfWE1MX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRQ0KLQ0KLSVzdGF0ZSBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRA0KLSVzdGF0ZSBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMNCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNDQotDQotJXN0YXRlIFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQNCi0NCi0lc3RhdGUgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVA0KLQ0KLQ0KLSVzdGF0ZSBTVF9CTE9DS19UQUdfU0NBTg0KLSVzdGF0ZSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTg0KLQ0KLSVzdGF0ZSBTVF9KU1BfQ09NTUVOVA0KLSVzdGF0ZSBTVF9KU1BfQ09NTUVOVF9FTkQNCi0NCi0lc3RhdGUgU1RfSlNQX0FUVFJJQlVURV9WQUxVRQ0KLSVzdGF0ZSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQNCi0lc3RhdGUgU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEDQotDQotJXN0YXRlIFNUX0FCT1JUX0VNQkVEREVEDQotDQotJXN0YXRlIFNUX0pTUF9FTA0KLSVzdGF0ZSBTVF9KU1BfRUxfU1FVT1RFUw0KLSVzdGF0ZSBTVF9KU1BfRUxfRFFVT1RFUw0KLSVzdGF0ZSBTVF9KU1BfRUxfU1FVT1RFU19FTkQNCi0lc3RhdGUgU1RfSlNQX0VMX0RRVU9URVNfRU5EDQotDQotJXN0YXRlIFNUX0pTUF9EUVVPVEVEX0VMDQotJXN0YXRlIFNUX0pTUF9TUVVPVEVEX0VMDQotDQotJXN0YXRlIFNUX0pTUF9WQkwNCi0lc3RhdGUgU1RfSlNQX1ZCTF9TUVVPVEVTDQotJXN0YXRlIFNUX0pTUF9WQkxfRFFVT1RFUw0KLSVzdGF0ZSBTVF9KU1BfVkJMX1NRVU9URVNfRU5EDQotJXN0YXRlIFNUX0pTUF9WQkxfRFFVT1RFU19FTkQNCi0NCi0lc3RhdGUgU1RfSlNQX0RRVU9URURfVkJMDQotJXN0YXRlIFNUX0pTUF9TUVVPVEVEX1ZCTA0KLQ0KLS8vIExldHRlciA9IChbQS1aYS16XSkNCi0vLyBEaWdpdCA9IChbMC05XSkNCi0NCi0vKioNCi0gKiBzbWFsbGVyIHRva2Vucw0KLSAqLw0KLWdlbmVyaWNUYWdPcGVuICAgICAgID0gPA0KLWdlbmVyaWNUYWdDbG9zZSAgICAgID0gPg0KLWdlbmVyaWNFbmRUYWdPcGVuICAgID0gPFwvDQotZ2VuZXJpY0VtcHR5VGFnQ2xvc2UgPSBcLz4NCi0NCi1QSXN0YXJ0ID0gPFw/DQotUEllbmQgICA9IFw/Pg0KLQ0KLQ0KLS8vIFsxXSBkb2N1bWVudCA6Oj0gcHJvbG9nIGVsZW1lbnQgTWlzYyoNCi1kb2N1bWVudCA9ICh7cHJvbG9nfSB7ZWxlbWVudH0ge01pc2N9KikNCi0NCi0vLyBbMl0gQ2hhciA6Oj0gI3g5IHwgI3hBIHwgI3hEIHwgWyN4MjAtI3hEN0ZGXSB8IFsjeEUwMDAtI3hGRkZEXSB8IFsjeDEwMDAwLSN4MTBGRkZGXQ0KLSAvL0NoYXIgPSAoLikNCi1DaGFyID0gW1x4MDlceDBBXHgwRFx4MjAtXHVEN0ZGXHVFMDAwLVx1RkZGRF0gDQotDQotLy8gWzNdIFMgOjo9ICgweDIwIHwgMHg5IHwgMHhEIHwgMHhBKSsNCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdKw0KLQ0KLS8vIFs0XSBOYW1lQ2hhciA6Oj0gTGV0dGVyIHwgRGlnaXQgfCAnLicgfCAnLScgfCAnXycgfCAnOicgfCBDb21iaW5pbmdDaGFyIHwgRXh0ZW5kZXINCi1OYW1lQ2hhciA9ICh7TGV0dGVyfSB8IHtEaWdpdH0gfCBcLiB8IFwtIHwgXyB8IDogfCB7Q29tYmluaW5nQ2hhcn0gfCB7RXh0ZW5kZXJ9KQ0KLQ0KLS8vIFs1XSBOYW1lIDo6PSAoTGV0dGVyIHwgJ18nIHwgJzonKSBOYW1lQ2hhcioNCi0vL05hbWUgPSAoe05hbWVDaGFyfXtOYW1lQ2hhcn0qKQ0KLU5hbWUgPSAoe0xldHRlcn0gfCBfIHwgOil7TmFtZUNoYXJ9Kg0KLQ0KLS8vIFs2XSBOYW1lcyA6Oj0ge05hbWV9ICh7U30ge05hbWV9KSoNCi1OYW1lcyA9ICh7TmFtZX0gKHtTfSB7TmFtZX0pKikNCi0NCi0vLyBbN10gTm10b2tlbiA6Oj0gKE5hbWVDaGFyKSsNCi1ObXRva2VuID0gKHtOYW1lQ2hhcn0rKQ0KLQ0KLS8vIFs4XSBObXRva2VucyA6Oj0gTm10b2tlbiAoUyBObXRva2VuKSoNCi1ObXRva2VucyA9ICh7Tm10b2tlbn0gKHtTfSB7Tm10b2tlbn0pKikNCi0NCi0vLyBbOV0gRW50aXR5VmFsdWUgOjo9ICciJyAoW14lJiJdIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAnIicgfCAgIiciIChbXiUmJ10gfCBQRVJlZmVyZW5jZSB8IFJlZmVyZW5jZSkqICInIg0KLUVudGl0eVZhbHVlID0gKFwiIChbXiUmXCJdIHwge1BFUmVmZXJlbmNlfSB8IHtSZWZlcmVuY2V9KSogXCIgfCAgXCcgKFteJSZcJ10gfCB7UEVSZWZlcmVuY2V9IHwge1JlZmVyZW5jZX0pKiBcJykNCi0NCi0vLyBceDI0ID0gJyQnLCBceDdiID0gJ3snLCBceDIzID0gJyMnDQotLy8gWzEwXSBBdHRWYWx1ZSA6Oj0gJyInIChbXjwmIl0gfCBSZWZlcmVuY2UpKiAnIicgfCAgIiciIChbXjwmJ10gfCBSZWZlcmVuY2UpKiAiJyINCi1BdHRWYWx1ZSA9ICggXCIoW148Ilx4MjRceDIzXSB8IFtceDI0XHgyM11bXlx4N2IiXSB8IFxcW1x4MjRceDIzXVtceDdiXSB8IHtSZWZlcmVuY2V9KSogW1x4MjRceDIzXSpcIiB8IFwnKFtePCdceDI0XHgyM10gfCBbXHgyNFx4MjNdW15ceDdiJ10gfCBcXFtceDI0XHgyM11bXHg3Yl0gfCB7UmVmZXJlbmNlfSkqW1x4MjRceDIzXSpcJyAgfCAoW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSopDQotDQotLy8gQXMgQXR0dmFsdWUsIGJ1dCBhY2NlcHRzIGVzY2FwZWQgdmVyc2lvbnMgb2YgdGhlIGxlYWQtaW4gcXVvdGUgYWxzbw0KLVF1b3RlZEF0dFZhbHVlID0gKCBcIihbXjwiXHgyNFx4MjNdIHwgW1x4MjRceDIzXVteXHg3YiJdIHwgXFxbXHgyNFx4MjNdW1x4N2JdIHwgXFxcIiB8IHtSZWZlcmVuY2V9KSpbXHgyNFx4MjNdKlwiIHwgXCcoW148J1x4MjRceDIzXSB8IFtceDI0XHgyM11bXlx4N2InXSB8IFxcW1x4MjRceDIzXVtceDdiXSB8IFxcXCcgfCB7UmVmZXJlbmNlfSkqW1x4MjRceDIzXSpcJyAgfCAoW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSopDQotDQotLy8gWzExXSBTeXN0ZW1MaXRlcmFsIDo6PSAoJyInIFteIl0qICciJykgfCAoIiciIFteJ10qICInIikgDQotU3lzdGVtTGl0ZXJhbCA9ICgoXCIgW15cIl0qIFwiKSB8IChcJyBbXlwnXSogXCcpKSANCi0NCi0vLyBbMTJdIFB1YmlkTGl0ZXJhbCA6Oj0gJyInIFB1YmlkQ2hhciogJyInIHwgIiciIChQdWJpZENoYXIgLSAiJyIpKiAiJyINCi1QdWJpZExpdGVyYWwgPSAoXCIge1B1YmlkQ2hhcn0qIFwiIHwgXCcgKHtQdWJpZENoYXJ9XCcpKiAiJyIpDQotDQotLy8gWzEzXSBQdWJpZENoYXIgOjo9ICN4MjAgfCAjeEQgfCAjeEEgfCBbYS16QS1aMC05XSB8IFstJygpKywuLzo9PzshKiNAJF8lXQ0KLVB1YmlkQ2hhciA9IChbXDA0MFwwMTVcMDEyXSB8IFthLXpBLVowLTldIHwgW1wtXCcoKVwrLC5cLzo9PzshXCojQFwkXyVdKQ0KLQ0KLS8vIFsxNF0gQ2hhckRhdGEgOjo9IFtePCZdKiAtIChbXjwmXSogJ11dPicgW148Jl0qKQ0KLS8vIGltcGxlbWVudCBsb29rYWhlYWQgYmVoYXZpb3IgZHVyaW5nIGFjdGlvbiBkZWZpbml0aW9uDQotQ2hhckRhdGEgPSAoW148JihcXVxdPildKikNCi0NCi0vLyBbMTVdIENvbW1lbnQgOjo9ICc8IS0tJyAoKENoYXIgLSAnLScpIHwgKCctJyAoQ2hhciAtICctJykpKSogJy0tPicNCi1Db21tZW50U3RhcnQgPSAoPCFcLVwtKQ0KLUNvbW1lbnRFbmQgICA9IChcLVwtPikNCi1Db21tZW50ID0gKHtDb21tZW50U3RhcnR9Lip7Q29tbWVudEVuZH0pDQotDQotLy8gWzE2XSBQSSA6Oj0gJzw/JyBQSVRhcmdldCAoUyAoQ2hhciogLSAoQ2hhciogJz8+JyBDaGFyKikpKT8gJz8+Jw0KLVBJID0gKDxcP3tQSVRhcmdldH0ge0NoYXJ9KiBcPz4pDQotDQotLy8gWzE3XSBQSVRhcmdldCA6Oj0gTmFtZSAtICgoJ1gnIHwgJ3gnKSAoJ00nIHwgJ20nKSAoJ0wnIHwgJ2wnKSkNCi1QSVRhcmdldCA9ICh7TmFtZX0oKFh8eCkoTXxtKShMfGwpKSkNCi0NCi0vLyBbMThdIENEU2VjdCA6Oj0gQ0RTdGFydCBDRGF0YSBDREVuZA0KLUNEU2VjdCA9ICh7Q0RTdGFydH17Q0RhdGF9e0NERW5kfSkNCi0NCi0vLyBbMTldIENEU3RhcnQgOjo9ICc8IVtDREFUQVsnDQotQ0RTdGFydCA9IDwhXFtDREFUQVxbDQotDQotLy8gWzIwXSBDRGF0YSA6Oj0gKENoYXIqIC0gKENoYXIqICddXT4nIENoYXIqKSkgDQotLy8gaW1wbGVtZW50IGxvb2thaGVhZCBiZWhhdmlvciBkdXJpbmcgYWN0aW9uIGRlZmluaXRpb24NCi1DRGF0YSA9IChbXihcXVxdPildKikNCi0NCi0vLyBbMjFdIENERW5kIDo6PSAnXV0+Jw0KLUNERW5kID0gKFxdXF0+KQ0KLQ0KLS8vIFsyMl0gcHJvbG9nIDo6PSBYTUxEZWNsPyBNaXNjKiAoZG9jdHlwZWRlY2wgTWlzYyopPw0KLXByb2xvZyA9ICh7WE1MRGVjbH0/IHtNaXNjfSogKHtkb2N0eXBlZGVjbH0ge01pc2N9Kik/KQ0KLQ0KLS8vIFsyM10gWE1MRGVjbCA6Oj0gJzw/eG1sJyBWZXJzaW9uSW5mbyBFbmNvZGluZ0RlY2w/IFNERGVjbD8gUz8gJz8+Jw0KLVhNTERlY2wgPSAoPFw/eG1sIHtWZXJzaW9uSW5mb30ge0VuY29kaW5nRGVjbH0/IHtTRERlY2x9PyB7U30/IFw/PikNCi0NCi0vLyBbMjRdIFZlcnNpb25JbmZvIDo6PSBTICd2ZXJzaW9uJyBFcSAoJyBWZXJzaW9uTnVtICcgfCAiIFZlcnNpb25OdW0gIikNCi1WZXJzaW9uSW5mbyA9ICh7U312ZXJzaW9ue0VxfShcJ3tWZXJzaW9uTnVtfVwnIHwgXCJ7VmVyc2lvbk51bX1cIikpDQotDQotLy8gWzI1XSBFcSA6Oj0gUz8gJz0nIFM/DQotRXEgPSAoXD0pDQotDQotLy8gWzI2XSBWZXJzaW9uTnVtIDo6PSAoW2EtekEtWjAtOV8uOl0gfCAnLScpKw0KLVZlcnNpb25OdW0gPSAoKFthLXpBLVowLTlfLjpdfFwtKSspDQotDQotLy8gWzI3XSBNaXNjIDo6PSBDb21tZW50IHwgUEkgfCAgUw0KLU1pc2MgPSAoe0NvbW1lbnR9IHwge1BJfSB8IHtTfSkNCi0NCi0vLyBbMjhdIGRvY3R5cGVkZWNsIDo6PSAnPCFET0NUWVBFJyBTIE5hbWUgKFMgRXh0ZXJuYWxJRCk/ICBTPyAoJ1snIChtYXJrdXBkZWNsIHwgUEVSZWZlcmVuY2UgfCBTKSogJ10nIFM/KT8gJz4nDQotZG9jdHlwZWRlY2wgPSAoPFwhRE9DVFlQRXtTfXtOYW1lfSAoe1N9e0V4dGVybmFsSUR9KT8ge1N9PyAoXFsgKHttYXJrdXBkZWNsfXx7UEVSZWZlcmVuY2V9fHtTfSkqIFxde1N9Pyk/PikNCi0NCi0vLyBbMjldIG1hcmt1cGRlY2wgOjo9IGVsZW1lbnRkZWNsIHwgQXR0bGlzdERlY2wgfCBFbnRpdHlEZWNsIHwgTm90YXRpb25EZWNsIHwgUEkgfCBDb21tZW50DQotbWFya3VwZGVjbCA9ICh7ZWxlbWVudGRlY2x9IHwge0F0dGxpc3REZWNsfSB8IHtFbnRpdHlEZWNsfSB8IHtOb3RhdGlvbkRlY2x9IHwge1BJfSB8IHtDb21tZW50fSkNCi0NCi0vLyBbMzBdIGV4dFN1YnNldCA6Oj0gVGV4dERlY2w/IGV4dFN1YnNldERlY2wNCi1leHRTdWJzZXQgPSAoe1RleHREZWNsfT8ge2V4dFN1YnNldERlY2x9KQ0KLQ0KLS8vIFszMV0gZXh0U3Vic2V0RGVjbCA6Oj0gKCBtYXJrdXBkZWNsIHwgY29uZGl0aW9uYWxTZWN0IHwgUEVSZWZlcmVuY2UgfCBTICkqDQotZXh0U3Vic2V0RGVjbCA9ICgoIHttYXJrdXBkZWNsfSB8IHtjb25kaXRpb25hbFNlY3R9IHwge1BFUmVmZXJlbmNlfSB8IHtTfSApKikNCi0NCi0vLyBbMzJdICBTRERlY2wgIDo6PSBTICdzdGFuZGFsb25lJyBFcSAoKCInIiAoJ3llcycgfCAnbm8nKSAiJyIpIHwgKCciJyAoJ3llcycgfCAnbm8nKSAnIicpKQ0KLVNERGVjbCAgPSAoe1N9c3RhbmRhbG9uZXtFcX17U30qKChcJyh5ZXN8bm8pXCcpfChcIih5ZXN8bm8pXCIpKSkNCi0NCi0vLyBbMzNdICBMYW5ndWFnZUlEICA6Oj0gTGFuZ2NvZGUgKCctJyBTdWJjb2RlKSoNCi1MYW5ndWFnZUlEICA9ICh7TGFuZ2NvZGV9KFwte1N1YmNvZGV9KSopDQotDQotLy8gWzM0XSAgTGFuZ2NvZGUgOjo9IElTTzYzOUNvZGUgfCAgSWFuYUNvZGUgfCAgVXNlckNvZGUNCi1MYW5nY29kZSA9ICh7SVNPNjM5Q29kZX0gfCAge0lhbmFDb2RlfSB8ICB7VXNlckNvZGV9KQ0KLQ0KLS8vIFszNV0gIElTTzYzOUNvZGUgOjo9IChbYS16XSB8IFtBLVpdKSAoW2Etel0gfCBbQS1aXSkNCi1JU082MzlDb2RlID0gKChbYS16XXxbQS1aXSkoW2Etel18W0EtWl0pKQ0KLQ0KLS8vIFszNl0gIElhbmFDb2RlIDo6PSAoJ2knIHwgJ0knKSAnLScgKFthLXpdIHwgW0EtWl0pKw0KLUlhbmFDb2RlID0gKChpfEkpXC0oW2Etel18W0EtWl0pKykNCi0NCi0vLyBbMzddICBVc2VyQ29kZSA6Oj0gKCd4JyB8ICdYJykgJy0nIChbYS16XSB8IFtBLVpdKSsNCi1Vc2VyQ29kZSA9ICgoeHxYKVwtKFthLXpdfFtBLVpdKSspDQotDQotLy8gWzM4XSAgU3ViY29kZSA6Oj0gKFthLXpdIHwgW0EtWl0pKw0KLVN1YmNvZGUgPSAoKFthLXpdfFtBLVpdKSspDQotDQotLy8gWzM5XSAgZWxlbWVudCAgOjo9IEVtcHR5RWxlbVRhZyB8IFNUYWcgY29udGVudCBFVGFnDQotZWxlbWVudCAgPSAoe0VtcHR5RWxlbVRhZ30gfCB7U1RhZ30ge2NvbnRlbnR9IHtFVGFnfSkNCi0NCi0vLyBbNDBdICBTVGFnICA6Oj0gJzwnIE5hbWUgKFMgQXR0cmlidXRlKSogUz8gJz4nDQotU1RhZyA9ICg8e05hbWV9KHtTfXtBdHRyaWJ1dGV9KSp7U30/PikNCi0NCi0vLyBbNDFdICBBdHRyaWJ1dGUgOjo9IE5hbWUgRXEgQXR0VmFsdWUNCi1BdHRyaWJ1dGUgPSAoe05hbWV9e1N9KntFcX17U30qe0F0dFZhbHVlfSkNCi0NCi0vLyBbNDJdICBFVGFnICA6Oj0gJ05hbWUgUz8gJz4nDQotRVRhZyA9ICg8XC97TmFtZX17U30/PikNCi0NCi0vLyBbNDNdICBjb250ZW50ICA6Oj0gKGVsZW1lbnQgfCBDaGFyRGF0YSB8IFJlZmVyZW5jZSB8IENEU2VjdCB8IFBJIHwgQ29tbWVudCkqDQotY29udGVudCA9ICgoe2VsZW1lbnR9IHwge0NoYXJEYXRhfSB8IHtSZWZlcmVuY2V9IHwge0NEU2VjdH0gfCB7UEl9IHwge0NvbW1lbnR9KSopDQotDQotLy8gWzQ0XSAgRW1wdHlFbGVtVGFnICA6Oj0gJzwnIE5hbWUgKFMgQXR0cmlidXRlKSogUz8gJy8+Jw0KLUVtcHR5RWxlbVRhZyA9ICg8e05hbWV9KHtTfXtBdHRyaWJ1dGV9KSp7U30/XC8+KQ0KLQ0KLS8vIFs0NV0gZWxlbWVudGRlY2wgOjo9ICc8IUVMRU1FTlQnIFMgTmFtZSBTIGNvbnRlbnRzcGVjIFM/ICc+Jw0KLWVsZW1lbnRkZWNsID0gKDxcIUVMRU1FTlR7U317TmFtZX17U317Y29udGVudHNwZWN9e1N9Pz4pDQotDQotLy8gWzQ2XSBjb250ZW50c3BlYyA6Oj0gJ0VNUFRZJyB8ICdBTlknIHwgTWl4ZWQgfCBjaGlsZHJlbg0KLWNvbnRlbnRzcGVjID0gKEVNUFRZfEFOWXx7TWl4ZWR9fHtjaGlsZHJlbn0pDQotDQotLy8gWzQ3XSBjaGlsZHJlbiA6Oj0gKGNob2ljZSB8IHNlcSkgKCc/JyB8ICcqJyB8ICcrJyk/DQotY2hpbGRyZW4gPSAoKHtjaG9pY2V9fHtzZXF9KShcP3xcKnxcKyk/KQ0KLQ0KLS8vIENBVVNFUyBMT09QIFRIUk9VR0ggREVGUyBPRiBDSE9JQ0UgQU5EIFNFUQ0KLS8vIFs0OF0gY3AgOjo9IChOYW1lIHwgY2hvaWNlIHwgc2VxKSAoJz8nIHwgJyonIHwgJysnKT8NCi1jcCA9ICgoe05hbWV9IHwge2Nob2ljZX0gfCB7c2VxfSkgKFw/fFwqfFwrKT8pDQotDQotLy8gWzQ5XSBjaG9pY2UgOjo9ICcoJyBTPyBjcCAoIFM/ICd8JyBTPyBjcCApKiBTPyAnKScNCi0vLyBjaG9pY2UgPSBcKHtTfT97Y3B9KHtTfT9cfHtTfT97Y3B9KSp7U30/XCkNCi1jaG9pY2UgPSBcKHtTfT97TmFtZX0oe1N9P1x8e1N9P3tOYW1lfSkqe1N9P1wpDQotDQotLy8gWzUwXSBzZXEgOjo9ICcoJyBTPyBjcCAoIFM/ICcsJyBTPyBjcCApKiBTPyAnKScNCi0vLyBzZXEgPSAoXCh7U30/e2NwfSh7U30/XCx7U30/e2NwfSkqe1N9P1wpKQ0KLXNlcSA9IChcKHtTfT97TmFtZX0oe1N9P1wse1N9P3tOYW1lfSkqe1N9P1wpKQ0KLQ0KLS8vIFs1MV0gTWl4ZWQgOjo9ICcoJyBTPyAnI1BDREFUQScgKFM/ICd8JyBTPyBOYW1lKSogUz8gICcpKicgfCAnKCcgUz8gJyNQQ0RBVEEnIFM/ICcpJw0KLU1peGVkID0gKHtTfT9cI1BDREFUQSh7U30/XHx7U30/e05hbWV9KSp7U30/KSpcfCh7U30/XCNQQ0RBVEF7U30/KQ0KLQ0KLS8vIFs1Ml0gQXR0bGlzdERlY2wgOjo9ICc8IUFUVExJU1QnIFMgTmFtZSBBdHREZWYqIFM/ICc+Jw0KLUF0dGxpc3REZWNsID0gKDxcIUFUVExJU1R7U317TmFtZX17QXR0RGVmfSp7U30/PikNCi0NCi0vLyBbNTNdIEF0dERlZiA6Oj0gUyBOYW1lIFMgQXR0VHlwZSBTIERlZmF1bHREZWNsDQotQXR0RGVmID0gKHtTfXtOYW1lfXtTfXtBdHRUeXBlfXtTfXtEZWZhdWx0RGVjbH0pDQotDQotLy8gWzU0XSBBdHRUeXBlIDo6PSBTdHJpbmdUeXBlIHwgVG9rZW5pemVkVHlwZSB8IEVudW1lcmF0ZWRUeXBlIA0KLUF0dFR5cGUgPSAoe1N0cmluZ1R5cGV9IHwge1Rva2VuaXplZFR5cGV9IHwge0VudW1lcmF0ZWRUeXBlfSkNCi0NCi0vLyBbNTVdIFN0cmluZ1R5cGUgOjo9ICdDREFUQScNCi1TdHJpbmdUeXBlID0gKENEQVRBKQ0KLQ0KLS8vIFs1Nl0gVG9rZW5pemVkVHlwZSA6Oj0gJ0lEJyB8ICdJRFJFRicgfCAnSURSRUZTJyB8ICdFTlRJVFknIHwgJ0VOVElUSUVTJyB8ICdOTVRPS0VOJyB8ICdOTVRPS0VOUycNCi1Ub2tlbml6ZWRUeXBlID0gKElEfElEUkVGfElEUkVGU3xFTlRJVFl8RU5USVRJRVN8Tk1UT0tFTnxOTVRPS0VOUykNCi0NCi0vLyBbNTddIEVudW1lcmF0ZWRUeXBlIDo6PSBOb3RhdGlvblR5cGUgfCBFbnVtZXJhdGlvbiANCi1FbnVtZXJhdGVkVHlwZSA9ICh7Tm90YXRpb25UeXBlfSB8IHtFbnVtZXJhdGlvbn0pDQotDQotLy8gWzU4XSBOb3RhdGlvblR5cGUgOjo9ICdOT1RBVElPTicgUyAnKCcgUz8gTmFtZSAoUz8gJ3wnIFM/IE5hbWUpKiBTPyAnKScgDQotTm90YXRpb25UeXBlID0gKE5PVEFUSU9Oe1N9XCh7U30/e05hbWV9KHtTfT9cfHtTfT97TmFtZX0pKntTfT9cKSkNCi0NCi0vLyBbNTldIEVudW1lcmF0aW9uIDo6PSAnKCcgUz8gTm10b2tlbiAoUz8gJ3wnIFM/ICBObXRva2VuKSogUz8gJyknDQotRW51bWVyYXRpb24gPSAoXCh7U30/e05tdG9rZW59KHtTfT9cfHtTfT97Tm10b2tlbn0pKntTfT9cKSkNCi0NCi0vLyBbNjBdIERlZmF1bHREZWNsIDo6PSAnI1JFUVVJUkVEJyB8ICcjSU1QTElFRCcgfCAoKCcjRklYRUQnIFMpPyBBdHRWYWx1ZSkNCi1EZWZhdWx0RGVjbCA9IChcI1JFUVVJUkVEfFwjSU1QTElFRHwoKFwjRklYRUR7U30pP3tBdHRWYWx1ZX0pKQ0KLQ0KLS8vIFs2MV0gY29uZGl0aW9uYWxTZWN0IDo6PSBpbmNsdWRlU2VjdCB8IGlnbm9yZVNlY3QgDQotY29uZGl0aW9uYWxTZWN0ID0gKHtpbmNsdWRlU2VjdH0gfCB7aWdub3JlU2VjdH0pDQotDQotLy8gWzYyXSBpbmNsdWRlU2VjdCA6Oj0gJzwhWycgUz8gJ0lOQ0xVREUnIFM/ICdbJyBleHRTdWJzZXREZWNsICddXT4nIA0KLWluY2x1ZGVTZWN0ID0gKDxcIVxbe1N9P0lOQ0xVREV7U30/XFt7ZXh0U3Vic2V0RGVjbH1cXVxdPikNCi0NCi0vLyBbNjNdIGlnbm9yZVNlY3QgOjo9ICc8IVsnIFM/ICdJR05PUkUnIFM/ICdbJyBpZ25vcmVTZWN0Q29udGVudHMqICddXT4nDQotaWdub3JlU2VjdCA9ICg8XCFcW3tTfT9JR05PUkV7U30/XFt7aWdub3JlU2VjdENvbnRlbnRzfSpcXVxdPikNCi0NCi0vLyBbNjRdIGlnbm9yZVNlY3RDb250ZW50cyA6Oj0gSWdub3JlICgnPCFbJyBpZ25vcmVTZWN0Q29udGVudHMgJ11dPicgSWdub3JlKSoNCi1pZ25vcmVTZWN0Q29udGVudHMgPSAoe0lnbm9yZX0oPFwhXFt7aWdub3JlU2VjdENvbnRlbnRzfVxdXF0+e0lnbm9yZX0pKikNCi0NCi0vLyBbNjVdIElnbm9yZSA6Oj0gQ2hhciogLSAoQ2hhciogKCc8IVsnIHwgJ11dPicpIENoYXIqKQ0KLUlnbm9yZSA9ICAoW14oXDxcIVxbfFxdXF1cPildKikNCi0NCi0vLyBbNjZdIENoYXJSZWYgOjo9ICcmIycgWzAtOV0rICc7JyB8ICcmI3gnIFswLTlhLWZBLUZdKyAnOycNCi1DaGFyUmVmID0gKCYjWzAtOV0rO3wmI3hbMC05YS1mQS1GXSs7KQ0KLQ0KLS8vIFs2N10gUmVmZXJlbmNlIDo6PSBFbnRpdHlSZWYgfCBDaGFyUmVmDQotUmVmZXJlbmNlID0gKHtFbnRpdHlSZWZ9IHwge0NoYXJSZWZ9KQ0KLQ0KLS8vIFs2OF0gRW50aXR5UmVmID0gJyYnIE5hbWUgJzsnDQotRW50aXR5UmVmID0gKCZ7TmFtZX07KQ0KLQ0KLS8vIFs2OV0gUEVSZWZlcmVuY2UgOjo9ICclJyBOYW1lICc7Jw0KLVBFUmVmZXJlbmNlID0gKCV7TmFtZX07KQ0KLQ0KLS8vIFs3MF0gRW50aXR5RGVjbCA6Oj0gR0VEZWNsIHwgUEVEZWNsDQotRW50aXR5RGVjbCA9ICh7R0VEZWNsfSB8IHtQRURlY2x9KQ0KLQ0KLS8vIFs3MV0gR0VEZWNsIDo6PSAnPCFFTlRJVFknIFMgTmFtZSBTIEVudGl0eURlZiBTPyAnPicNCi1HRURlY2wgPSAoPFwhRU5USVRZe1N9e05hbWV9e1N9e0VudGl0eURlZn17U30/PikNCi0NCi0vLyBbNzJdIFBFRGVjbCA6Oj0gJzwhRU5USVRZJyBTICclJyBTIE5hbWUgUyBQRURlZiBTPyAnPicNCi1QRURlY2wgPSAoPFwhRU5USVRZe1N9XCV7U317TmFtZX17U317UEVEZWZ9e1N9Pz4pDQotDQotLy8gWzczXSBFbnRpdHlEZWYgOjo9IEVudGl0eVZhbHVlIHwgKEV4dGVybmFsSUQgTkRhdGFEZWNsPykNCi1FbnRpdHlEZWYgPSAoe0VudGl0eVZhbHVlfSB8ICh7RXh0ZXJuYWxJRH17TkRhdGFEZWNsfT8pKQ0KLQ0KLS8vIFs3NF0gUEVEZWYgOjo9IEVudGl0eVZhbHVlIHwgRXh0ZXJuYWxJRA0KLVBFRGVmID0gKHtFbnRpdHlWYWx1ZX0gfCB7RXh0ZXJuYWxJRH0pDQotDQotLy8gWzc1XSBFeHRlcm5hbElEIDo6PSAnU1lTVEVNJyBTIFN5c3RlbUxpdGVyYWwgfCAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbCBTIFN5c3RlbUxpdGVyYWwgDQotRXh0ZXJuYWxJRCA9IChTWVNURU17U317U3lzdGVtTGl0ZXJhbH18UFVCTElDe1N9e1B1YmlkTGl0ZXJhbH17U317U3lzdGVtTGl0ZXJhbH0gKQ0KLQ0KLS8vIFs3Nl0gTkRhdGFEZWNsIDo6PSBTICdOREFUQScgUyBOYW1lDQotTkRhdGFEZWNsID0gKHtTfU5EQVRBe1N9e05hbWV9KQ0KLQ0KLS8vIFs3N10gVGV4dERlY2wgOjo9ICc8P3htbCcgVmVyc2lvbkluZm8/IEVuY29kaW5nRGVjbCBTPyAnPz4nDQotVGV4dERlY2wgPSAoPFw/eG1se1ZlcnNpb25JbmZvfT97RW5jb2RpbmdEZWNsfXtTfT9cPz4pDQotDQotLy8gWzc4XSBleHRQYXJzZWRFbnQgOjo9IFRleHREZWNsPyBjb250ZW50DQotZXh0UGFyc2VkRW50ID0gKHtUZXh0RGVjbH0/e2NvbnRlbnR9KQ0KLQ0KLS8vIFs3OV0gZXh0UEUgOjo9IFRleHREZWNsPyBleHRTdWJzZXREZWNsDQotZXh0UEUgPSAoe1RleHREZWNsfT97ZXh0U3Vic2V0RGVjbH0pDQotDQotLy8gWzgwXSBFbmNvZGluZ0RlY2wgOjo9IFMgJ2VuY29kaW5nJyBFcSAoJyInIEVuY05hbWUgJyInIHwgICInIiBFbmNOYW1lICInIiApIA0KLUVuY29kaW5nRGVjbCA9ICh7U31lbmNvZGluZ3tTfSp7RXF9e1N9KihcIntFbmNOYW1lfVwifFwne0VuY05hbWV9XCcpKQ0KLQ0KLS8vIFs4MV0gRW5jTmFtZSA6Oj0gW0EtWmEtel0gKFtBLVphLXowLTkuX10gfCAnLScpKg0KLUVuY05hbWUgPSAoW0EtWmEtel0oW0EtWmEtejAtOS5fXXxcLSkqKQ0KLQ0KLS8vIFs4Ml0gTm90YXRpb25EZWNsIDo6PSAnPCFOT1RBVElPTicgUyBOYW1lIFMgKEV4dGVybmFsSUQgfCAgUHVibGljSUQpIFM/ICc+Jw0KLU5vdGF0aW9uRGVjbCA9ICg8XCFOT1RBVElPTntTfXtOYW1lfXtTfSh7RXh0ZXJuYWxJRH18e1B1YmxpY0lEfSl7U30/PikNCi0NCi0vLyBbODNdIFB1YmxpY0lEIDo6PSAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbA0KLVB1YmxpY0lEID0gKFBVQkxJQ3tTfXtQdWJpZExpdGVyYWx9KQ0KLQ0KLS8vIFs4NF0gIExldHRlciA6Oj0gQmFzZUNoYXIgfCBJZGVvZ3JhcGhpYw0KLUxldHRlciA9ICh7QmFzZUNoYXJ9IHwge0lkZW9ncmFwaGljfSkNCi0NCi0vLyBbODVdICBCYXNlQ2hhciA6Oj0gWyN4MDA0MS0jeDAwNUFdIHwgWyN4MDA2MS0jeDAwN0FdIHwgWyN4MDBDMC0jeDAwRDZdDQotLy8gfCBbI3gwMEQ4LSN4MDBGNl0gfCBbI3gwMEY4LSN4MDBGRl0gfCBbI3gwMTAwLSN4MDEzMV0NCi0vLyB8IFsjeDAxMzQtI3gwMTNFXSB8IFsjeDAxNDEtI3gwMTQ4XSB8IFsjeDAxNEEtI3gwMTdFXQ0KLS8vIHwgWyN4MDE4MC0jeDAxQzNdIHwgWyN4MDFDRC0jeDAxRjBdIHwgWyN4MDFGNC0jeDAxRjVdDQotLy8gfCBbI3gwMUZBLSN4MDIxN10gfCBbI3gwMjUwLSN4MDJBOF0gfCBbI3gwMkJCLSN4MDJDMV0gfCAjeDAzODYNCi0vLyB8IFsjeDAzODgtI3gwMzhBXSB8ICN4MDM4QyB8IFsjeDAzOEUtI3gwM0ExXSB8IFsjeDAzQTMtI3gwM0NFXQ0KLS8vIHwgWyN4MDNEMC0jeDAzRDZdIHwgI3gwM0RBIHwgI3gwM0RDIHwgI3gwM0RFIHwgI3gwM0UwDQotLy8gfCBbI3gwM0UyLSN4MDNGM10gfCBbI3gwNDAxLSN4MDQwQ10gfCBbI3gwNDBFLSN4MDQ0Rl0NCi0vLyB8IFsjeDA0NTEtI3gwNDVDXSB8IFsjeDA0NUUtI3gwNDgxXSB8IFsjeDA0OTAtI3gwNEM0XQ0KLS8vIHwgWyN4MDRDNy0jeDA0QzhdIHwgWyN4MDRDQi0jeDA0Q0NdIHwgWyN4MDREMC0jeDA0RUJdDQotLy8gfCBbI3gwNEVFLSN4MDRGNV0gfCBbI3gwNEY4LSN4MDRGOV0gfCBbI3gwNTMxLSN4MDU1Nl0gfCAjeDA1NTkNCi0vLyB8IFsjeDA1NjEtI3gwNTg2XSB8IFsjeDA1RDAtI3gwNUVBXSB8IFsjeDA1RjAtI3gwNUYyXQ0KLS8vIHwgWyN4MDYyMS0jeDA2M0FdIHwgWyN4MDY0MS0jeDA2NEFdIHwgWyN4MDY3MS0jeDA2QjddDQotLy8gfCBbI3gwNkJBLSN4MDZCRV0gfCBbI3gwNkMwLSN4MDZDRV0gfCBbI3gwNkQwLSN4MDZEM10gfCAjeDA2RDUNCi0vLyB8IFsjeDA2RTUtI3gwNkU2XSB8IFsjeDA5MDUtI3gwOTM5XSB8ICN4MDkzRCB8IFsjeDA5NTgtI3gwOTYxXQ0KLS8vIHwgWyN4MDk4NS0jeDA5OENdIHwgWyN4MDk4Ri0jeDA5OTBdIHwgWyN4MDk5My0jeDA5QThdDQotLy8gfCBbI3gwOUFBLSN4MDlCMF0gfCAjeDA5QjIgfCBbI3gwOUI2LSN4MDlCOV0gfCBbI3gwOURDLSN4MDlERF0NCi0vLyB8IFsjeDA5REYtI3gwOUUxXSB8IFsjeDA5RjAtI3gwOUYxXSB8IFsjeDBBMDUtI3gwQTBBXQ0KLS8vIHwgWyN4MEEwRi0jeDBBMTBdIHwgWyN4MEExMy0jeDBBMjhdIHwgWyN4MEEyQS0jeDBBMzBdDQotLy8gfCBbI3gwQTMyLSN4MEEzM10gfCBbI3gwQTM1LSN4MEEzNl0gfCBbI3gwQTM4LSN4MEEzOV0NCi0vLyB8IFsjeDBBNTktI3gwQTVDXSB8ICN4MEE1RSB8IFsjeDBBNzItI3gwQTc0XSB8IFsjeDBBODUtI3gwQThCXQ0KLS8vIHwgI3gwQThEIHwgWyN4MEE4Ri0jeDBBOTFdIHwgWyN4MEE5My0jeDBBQThdIHwgWyN4MEFBQS0jeDBBQjBdDQotLy8gfCBbI3gwQUIyLSN4MEFCM10gfCBbI3gwQUI1LSN4MEFCOV0gfCAjeDBBQkQgfCAjeDBBRTANCi0vLyB8IFsjeDBCMDUtI3gwQjBDXSB8IFsjeDBCMEYtI3gwQjEwXSB8IFsjeDBCMTMtI3gwQjI4XQ0KLS8vIHwgWyN4MEIyQS0jeDBCMzBdIHwgWyN4MEIzMi0jeDBCMzNdIHwgWyN4MEIzNi0jeDBCMzldIHwgI3gwQjNEDQotLy8gfCBbI3gwQjVDLSN4MEI1RF0gfCBbI3gwQjVGLSN4MEI2MV0gfCBbI3gwQjg1LSN4MEI4QV0NCi0vLyB8IFsjeDBCOEUtI3gwQjkwXSB8IFsjeDBCOTItI3gwQjk1XSB8IFsjeDBCOTktI3gwQjlBXSB8ICN4MEI5Qw0KLS8vIHwgWyN4MEI5RS0jeDBCOUZdIHwgWyN4MEJBMy0jeDBCQTRdIHwgWyN4MEJBOC0jeDBCQUFdDQotLy8gfCBbI3gwQkFFLSN4MEJCNV0gfCBbI3gwQkI3LSN4MEJCOV0gfCBbI3gwQzA1LSN4MEMwQ10NCi0vLyB8IFsjeDBDMEUtI3gwQzEwXSB8IFsjeDBDMTItI3gwQzI4XSB8IFsjeDBDMkEtI3gwQzMzXQ0KLS8vIHwgWyN4MEMzNS0jeDBDMzldIHwgWyN4MEM2MC0jeDBDNjFdIHwgWyN4MEM4NS0jeDBDOENdDQotLy8gfCBbI3gwQzhFLSN4MEM5MF0gfCBbI3gwQzkyLSN4MENBOF0gfCBbI3gwQ0FBLSN4MENCM10NCi0vLyB8IFsjeDBDQjUtI3gwQ0I5XSB8ICN4MENERSB8IFsjeDBDRTAtI3gwQ0UxXSB8IFsjeDBEMDUtI3gwRDBDXQ0KLS8vIHwgWyN4MEQwRS0jeDBEMTBdIHwgWyN4MEQxMi0jeDBEMjhdIHwgWyN4MEQyQS0jeDBEMzldDQotLy8gfCBbI3gwRDYwLSN4MEQ2MV0gfCBbI3gwRTAxLSN4MEUyRV0gfCAjeDBFMzAgfCBbI3gwRTMyLSN4MEUzM10NCi0vLyB8IFsjeDBFNDAtI3gwRTQ1XSB8IFsjeDBFODEtI3gwRTgyXSB8ICN4MEU4NCB8IFsjeDBFODctI3gwRTg4XQ0KLS8vIHwgI3gwRThBIHwgI3gwRThEIHwgWyN4MEU5NC0jeDBFOTddIHwgWyN4MEU5OS0jeDBFOUZdDQotLy8gfCBbI3gwRUExLSN4MEVBM10gfCAjeDBFQTUgfCAjeDBFQTcgfCBbI3gwRUFBLSN4MEVBQl0NCi0vLyB8IFsjeDBFQUQtI3gwRUFFXSB8ICN4MEVCMCB8IFsjeDBFQjItI3gwRUIzXSB8ICN4MEVCRA0KLS8vIHwgWyN4MEVDMC0jeDBFQzRdIHwgWyN4MEY0MC0jeDBGNDddIHwgWyN4MEY0OS0jeDBGNjldDQotLy8gfCBbI3gxMEEwLSN4MTBDNV0gfCBbI3gxMEQwLSN4MTBGNl0gfCAjeDExMDAgfCBbI3gxMTAyLSN4MTEwM10NCi0vLyB8IFsjeDExMDUtI3gxMTA3XSB8ICN4MTEwOSB8IFsjeDExMEItI3gxMTBDXSB8IFsjeDExMEUtI3gxMTEyXQ0KLS8vIHwgI3gxMTNDIHwgI3gxMTNFIHwgI3gxMTQwIHwgI3gxMTRDIHwgI3gxMTRFIHwgI3gxMTUwDQotLy8gfCBbI3gxMTU0LSN4MTE1NV0gfCAjeDExNTkgfCBbI3gxMTVGLSN4MTE2MV0gfCAjeDExNjMgfCAjeDExNjUNCi0vLyB8ICN4MTE2NyB8ICN4MTE2OSB8IFsjeDExNkQtI3gxMTZFXSB8IFsjeDExNzItI3gxMTczXSB8ICN4MTE3NQ0KLS8vIHwgI3gxMTlFIHwgI3gxMUE4IHwgI3gxMUFCIHwgWyN4MTFBRS0jeDExQUZdIHwgWyN4MTFCNy0jeDExQjhdDQotLy8gfCAjeDExQkEgfCBbI3gxMUJDLSN4MTFDMl0gfCAjeDExRUIgfCAjeDExRjAgfCAjeDExRjkNCi0vLyB8IFsjeDFFMDAtI3gxRTlCXSB8IFsjeDFFQTAtI3gxRUY5XSB8IFsjeDFGMDAtI3gxRjE1XQ0KLS8vIHwgWyN4MUYxOC0jeDFGMURdIHwgWyN4MUYyMC0jeDFGNDVdIHwgWyN4MUY0OC0jeDFGNERdDQotLy8gfCBbI3gxRjUwLSN4MUY1N10gfCAjeDFGNTkgfCAjeDFGNUIgfCAjeDFGNUQgfCBbI3gxRjVGLSN4MUY3RF0NCi0vLyB8IFsjeDFGODAtI3gxRkI0XSB8IFsjeDFGQjYtI3gxRkJDXSB8ICN4MUZCRSB8IFsjeDFGQzItI3gxRkM0XQ0KLS8vIHwgWyN4MUZDNi0jeDFGQ0NdIHwgWyN4MUZEMC0jeDFGRDNdIHwgWyN4MUZENi0jeDFGREJdDQotLy8gfCBbI3gxRkUwLSN4MUZFQ10gfCBbI3gxRkYyLSN4MUZGNF0gfCBbI3gxRkY2LSN4MUZGQ10gfCAjeDIxMjYNCi0vLyB8IFsjeDIxMkEtI3gyMTJCXSB8ICN4MjEyRSB8IFsjeDIxODAtI3gyMTgyXSB8IFsjeDMwNDEtI3gzMDk0XQ0KLS8vIHwgWyN4MzBBMS0jeDMwRkFdIHwgWyN4MzEwNS0jeDMxMkNdIHwgWyN4QUMwMC0jeEQ3QTNdDQotQmFzZUNoYXIgPSBbXHUwMDQxLVx1MDA1QVx1MDA2MS1cdTAwN0FcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAwRkZcdTAxMDAtXHUwMTMxXHUwMTM0LVx1MDEzRVx1MDE0MS1cdTAxNDhcdTAxNEEtXHUwMTdFXHUwMTgwLVx1MDFDM1x1MDFDRC1cdTAxRjBcdTAxRjQtXHUwMUY1XHUwMUZBLVx1MDIxN1x1MDI1MC1cdTAyQThcdTAyQkItXHUwMkMxXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0NFXHUwM0QwLVx1MDNENlx1MDNEQVx1MDNEQ1x1MDNERVx1MDNFMFx1MDNFMi1cdTAzRjNcdTA0MDEtXHUwNDBDXHUwNDBFLVx1MDQ0Rlx1MDQ1MS1cdTA0NUNcdTA0NUUtXHUwNDgxXHUwNDkwLVx1MDRDNFx1MDRDNy1cdTA0QzhcdTA0Q0ItXHUwNENDXHUwNEQwLVx1MDRFQlx1MDRFRS1cdTA0RjVcdTA0RjgtXHUwNEY5XHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODZcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMS1cdTA2M0FcdTA2NDEtXHUwNjRBXHUwNjcxLVx1MDZCN1x1MDZCQS1cdTA2QkVcdTA2QzAtXHUwNkNFXHUwNkQwLVx1MDZEM1x1MDZENVx1MDZFNS1cdTA2RTZcdTA5MDUtXHUwOTM5XHUwOTNEXHUwOTU4LVx1MDk2MVx1MDk4NS1cdTA5OENcdTA5OEYtXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOURDLVx1MDlERFx1MDlERi1cdTA5RTFcdTA5RjAtXHUwOUYxXHUwQTA1LVx1MEEwQVx1MEEwRi1cdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMi1cdTBBMzNcdTBBMzUtXHUwQTM2XHUwQTM4LVx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4Qlx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMi1cdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUUwXHUwQjA1LVx1MEIwQ1x1MEIwRi1cdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMi1cdTBCMzNcdTBCMzYtXHUwQjM5XHUwQjNEXHUwQjVDLVx1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTktXHUwQjlBXHUwQjlDXHUwQjlFLVx1MEI5Rlx1MEJBMy1cdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCNVx1MEJCNy1cdTBCQjlcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzMzXHUwQzM1LVx1MEMzOVx1MEM2MC1cdTBDNjFcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENERVx1MENFMC1cdTBDRTFcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEMjhcdTBEMkEtXHUwRDM5XHUwRDYwLVx1MEQ2MVx1MEUwMS1cdTBFMkVcdTBFMzBcdTBFMzItXHUwRTMzXHUwRTQwLVx1MEU0NVx1MEU4MS1cdTBFODJcdTBFODRcdTBFODctXHUwRTg4XHUwRThBXHUwRThEXHUwRTk0LVx1MEU5N1x1MEU5OS1cdTBFOUZcdTBFQTEtXHUwRUEzXHUwRUE1XHUwRUE3XHUwRUFBLVx1MEVBQlx1MEVBRC1cdTBFQUVcdTBFQjBcdTBFQjItXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjY5XHUxMEEwLVx1MTBDNVx1MTBEMC1cdTEwRjZcdTExMDBcdTExMDItXHUxMTAzXHUxMTA1LVx1MTEwN1x1MTEwOVx1MTEwQi1cdTExMENcdTExMEUtXHUxMTEyXHUxMTNDXHUxMTNFXHUxMTQwXHUxMTRDXHUxMTRFXHUxMTUwXHUxMTU0LVx1MTE1NVx1MTE1OVx1MTE1Ri1cdTExNjFcdTExNjNcdTExNjVcdTExNjdcdTExNjlcdTExNkQtXHUxMTZFXHUxMTcyLVx1MTE3M1x1MTE3NVx1MTE5RVx1MTFBOFx1MTFBQlx1MTFBRS1cdTExQUZcdTExQjctXHUxMUI4XHUxMUJBXHUxMUJDLVx1MTFDMlx1MTFFQlx1MTFGMFx1MTFGOVx1MUUwMC1cdTFFOUJcdTFFQTAtXHUxRUY5XHUxRjAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMTI2XHUyMTJBLVx1MjEyQlx1MjEyRVx1MjE4MC1cdTIxODJcdTMwNDEtXHUzMDk0XHUzMEExLVx1MzBGQVx1MzEwNS1cdTMxMkNcdUFDMDAtXHVEN0EzXQ0KLQ0KLS8vIFs4Nl0gIElkZW9ncmFwaGljIDo6PSBbI3g0RTAwLSN4OUZBNV0gfCAjeDMwMDcgfCBbI3gzMDIxLSN4MzAyOV0NCi1JZGVvZ3JhcGhpYyA9IFtcdTRFMDAtXHU5RkE1XHUzMDA3XHUzMDIxLVx1MzAyOV0NCi0NCi0vLyBbODddICAgICAgQ29tYmluaW5nQ2hhciAgICA6Oj0gICAgWyN4MDMwMC0jeDAzNDVdICAgIHwgWyN4MDM2MC0jeDAzNjFdDQotLy8gfCBbI3gwNDgzLSN4MDQ4Nl0gICAgICAgICAgfCBbI3gwNTkxLSN4MDVBMV0gICAgICAgICB8IFsjeDA1QTMtI3gwNUI5XQ0KLS8vIHwgWyN4MDVCQi0jeDA1QkRdICAgICAgIHwgI3gwNUJGICAgICAgIHwgWyN4MDVDMS0jeDA1QzJdCSB8ICN4MDVDNA0KLS8vIHwgWyN4MDY0Qi0jeDA2NTJdICAgIHwgI3gwNjcwICAgIHwgWyN4MDZENi0jeDA2RENdICAgfCBbI3gwNkRELSN4MDZERl0NCi0vLyB8IFsjeDA2RTAtI3gwNkU0XSAgICAgICAgICB8IFsjeDA2RTctI3gwNkU4XSAgICAgICAgIHwgWyN4MDZFQS0jeDA2RURdDQotLy8gfCBbI3gwOTAxLSN4MDkwM10gICAgICAgfCAjeDA5M0MgICAgICAgfCBbI3gwOTNFLSN4MDk0Q10gICAgICB8ICN4MDk0RA0KLS8vIHwgWyN4MDk1MS0jeDA5NTRdICAgIHwgWyN4MDk2Mi0jeDA5NjNdICAgIHwgWyN4MDk4MS0jeDA5ODNdICAgfCAjeDA5QkMNCi0vLyB8ICN4MDlCRSAgICAgICB8ICN4MDlCRiAgICAgICB8IFsjeDA5QzAtI3gwOUM0XSAgICAgIHwgWyN4MDlDNy0jeDA5QzhdDQotLy8gfCBbI3gwOUNCLSN4MDlDRF0gICB8ICN4MDlENyAgIHwgWyN4MDlFMi0jeDA5RTNdICAgfCAjeDBBMDIgICB8ICN4MEEzQw0KLS8vIHwgI3gwQTNFICAgICAgIHwgI3gwQTNGICAgICAgIHwgWyN4MEE0MC0jeDBBNDJdICAgICAgfCBbI3gwQTQ3LSN4MEE0OF0NCi0vLyB8IFsjeDBBNEItI3gwQTREXSAgICB8IFsjeDBBNzAtI3gwQTcxXSAgICB8IFsjeDBBODEtI3gwQTgzXSAgIHwgI3gwQUJDDQotLy8gfCBbI3gwQUJFLSN4MEFDNV0gICAgICAgICAgfCBbI3gwQUM3LSN4MEFDOV0gICAgICAgICB8IFsjeDBBQ0ItI3gwQUNEXQ0KLS8vIHwgWyN4MEIwMS0jeDBCMDNdICAgIHwgI3gwQjNDICAgIHwgWyN4MEIzRS0jeDBCNDNdICAgfCBbI3gwQjQ3LSN4MEI0OF0NCi0vLyB8IFsjeDBCNEItI3gwQjREXSAgICAgICAgICB8IFsjeDBCNTYtI3gwQjU3XSAgICAgICAgIHwgWyN4MEI4Mi0jeDBCODNdDQotLy8gfCBbI3gwQkJFLSN4MEJDMl0gICAgfCBbI3gwQkM2LSN4MEJDOF0gICAgfCBbI3gwQkNBLSN4MEJDRF0gICB8ICN4MEJENw0KLS8vIHwgWyN4MEMwMS0jeDBDMDNdICAgICAgICAgIHwgWyN4MEMzRS0jeDBDNDRdICAgICAgICAgfCBbI3gwQzQ2LSN4MEM0OF0NCi0vLyB8IFsjeDBDNEEtI3gwQzREXSAgICAgICAgICB8IFsjeDBDNTUtI3gwQzU2XSAgICAgICAgIHwgWyN4MEM4Mi0jeDBDODNdDQotLy8gfCBbI3gwQ0JFLSN4MENDNF0gICAgICAgICAgfCBbI3gwQ0M2LSN4MENDOF0gICAgICAgICB8IFsjeDBDQ0EtI3gwQ0NEXQ0KLS8vIHwgWyN4MENENS0jeDBDRDZdICAgICAgICAgIHwgWyN4MEQwMi0jeDBEMDNdICAgICAgICAgfCBbI3gwRDNFLSN4MEQ0M10NCi0vLyB8IFsjeDBENDYtI3gwRDQ4XSAgICAgICB8IFsjeDBENEEtI3gwRDREXSAgICAgICB8ICN4MEQ1NyAgICAgIHwgI3gwRTMxDQotLy8gfCBbI3gwRTM0LSN4MEUzQV0gICAgfCBbI3gwRTQ3LSN4MEU0RV0gICAgfCAjeDBFQjEgICB8IFsjeDBFQjQtI3gwRUI5XQ0KLS8vIHwgWyN4MEVCQi0jeDBFQkNdICAgIHwgWyN4MEVDOC0jeDBFQ0RdICAgIHwgWyN4MEYxOC0jeDBGMTldICAgfCAjeDBGMzUNCi0vLyB8ICN4MEYzNyAgICAgIHwgI3gwRjM5ICAgICB8ICN4MEYzRSAgICAgfCAjeDBGM0YgICAgIHwgWyN4MEY3MS0jeDBGODRdDQotLy8gfCBbI3gwRjg2LSN4MEY4Ql0gICAgfCBbI3gwRjkwLSN4MEY5NV0gICAgfCAjeDBGOTcgICB8IFsjeDBGOTktI3gwRkFEXQ0KLS8vIHwgWyN4MEZCMS0jeDBGQjddICAgICAgIHwgI3gwRkI5ICAgICAgIHwgWyN4MjBEMC0jeDIwRENdICAgICAgfCAjeDIwRTENCi0vLyB8IFsjeDMwMkEtI3gzMDJGXSB8ICN4MzA5OSB8ICN4MzA5QQ0KLUNvbWJpbmluZ0NoYXIgPSAgICBbXHUwMzAwLVx1MDM0NVx1MDM2MC1cdTAzNjFcdTA0ODMtXHUwNDg2XHUwNTkxLVx1MDVBMVx1MDVBMy1cdTA1QjlcdTA1QkItXHUwNUJEXHUwNUJGXHUwNUMxLVx1MDVDMlx1MDVDNFx1MDY0Qi1cdTA2NTJcdTA2NzBcdTA2RDYtXHUwNkRDXHUwNkRELVx1MDZERlx1MDZFMC1cdTA2RTRcdTA2RTctXHUwNkU4XHUwNkVBLVx1MDZFRFx1MDkwMS1cdTA5MDNcdTA5M0NcdTA5M0UtXHUwOTRDXHUwOTREXHUwOTUxLVx1MDk1NFx1MDk2Mi1cdTA5NjNcdTA5ODEtXHUwOTgzXHUwOUJDXHUwOUJFXHUwOUJGXHUwOUMwLVx1MDlDNFx1MDlDNy1cdTA5QzhcdTA5Q0ItXHUwOUNEXHUwOUQ3XHUwOUUyLVx1MDlFM1x1MEEwMlx1MEEzQ1x1MEEzRVx1MEEzRlx1MEE0MC1cdTBBNDJcdTBBNDctXHUwQTQ4XHUwQTRCLVx1MEE0RFx1MEE3MC1cdTBBNzFcdTBBODEtXHUwQTgzXHUwQUJDXHUwQUJFLVx1MEFDNVx1MEFDNy1cdTBBQzlcdTBBQ0ItXHUwQUNEXHUwQjAxLVx1MEIwM1x1MEIzQ1x1MEIzRS1cdTBCNDNcdTBCNDctXHUwQjQ4XHUwQjRCLVx1MEI0RFx1MEI1Ni1cdTBCNTdcdTBCODItXHUwQjgzXHUwQkJFLVx1MEJDMlx1MEJDNi1cdTBCQzhcdTBCQ0EtXHUwQkNEXHUwQkQ3XHUwQzAxLVx1MEMwM1x1MEMzRS1cdTBDNDRcdTBDNDYtXHUwQzQ4XHUwQzRBLVx1MEM0RFx1MEM1NS1cdTBDNTZcdTBDODItXHUwQzgzXHUwQ0JFLVx1MENDNFx1MENDNi1cdTBDQzhcdTBDQ0EtXHUwQ0NEXHUwQ0Q1LVx1MENENlx1MEQwMi1cdTBEMDNcdTBEM0UtXHUwRDQzXHUwRDQ2LVx1MEQ0OFx1MEQ0QS1cdTBENERcdTBENTdcdTBFMzFcdTBFMzQtXHUwRTNBXHUwRTQ3LVx1MEU0RVx1MEVCMVx1MEVCNC1cdTBFQjlcdTBFQkItXHUwRUJDXHUwRUM4LVx1MEVDRFx1MEYxOC1cdTBGMTlcdTBGMzVcdTBGMzdcdTBGMzlcdTBGM0VcdTBGM0ZcdTBGNzEtXHUwRjg0XHUwRjg2LVx1MEY4Qlx1MEY5MC1cdTBGOTVcdTBGOTdcdTBGOTktXHUwRkFEXHUwRkIxLVx1MEZCN1x1MEZCOVx1MjBEMC1cdTIwRENcdTIwRTFcdTMwMkEtXHUzMDJGXHUzMDk5XHUzMDlBXQ0KLQ0KLS8vIFs4OF0gICBEaWdpdCAgOjo9ICBbI3gwMDMwLSN4MDAzOV0gfCBbI3gwNjYwLSN4MDY2OV0gfCBbI3gwNkYwLSN4MDZGOV0NCi0vLyB8IFsjeDA5NjYtI3gwOTZGXSAgICAgICAgICB8IFsjeDA5RTYtI3gwOUVGXSAgICAgICAgIHwgWyN4MEE2Ni0jeDBBNkZdDQotLy8gfCBbI3gwQUU2LSN4MEFFRl0gICAgICAgICAgfCBbI3gwQjY2LSN4MEI2Rl0gICAgICAgICB8IFsjeDBCRTctI3gwQkVGXQ0KLS8vIHwgWyN4MEM2Ni0jeDBDNkZdICAgICAgICAgIHwgWyN4MENFNi0jeDBDRUZdICAgICAgICAgfCBbI3gwRDY2LSN4MEQ2Rl0NCi0vLyB8IFsjeDBFNTAtI3gwRTU5XSB8IFsjeDBFRDAtI3gwRUQ5XSB8IFsjeDBGMjAtI3gwRjI5XQ0KLURpZ2l0ID0gIFtcdTAwMzAtXHUwMDM5XHUwNjYwLVx1MDY2OVx1MDZGMC1cdTA2RjlcdTA5NjYtXHUwOTZGXHUwOUU2LVx1MDlFRlx1MEE2Ni1cdTBBNkZcdTBBRTYtXHUwQUVGXHUwQjY2LVx1MEI2Rlx1MEJFNy1cdTBCRUZcdTBDNjYtXHUwQzZGXHUwQ0U2LVx1MENFRlx1MEQ2Ni1cdTBENkZcdTBFNTAtXHUwRTU5XHUwRUQwLVx1MEVEOVx1MEYyMC1cdTBGMjldDQotDQotLy8gWzg5XSAgRXh0ZW5kZXIgOjo9ICN4MDBCNyB8ICN4MDJEMCB8ICN4MDJEMSB8ICN4MDM4NyB8ICN4MDY0MCB8ICN4MEU0Ng0KLS8vIHwgI3gwRUM2ICAgICAgIHwgI3gzMDA1ICAgICAgIHwgWyN4MzAzMS0jeDMwMzVdICAgICAgfCBbI3gzMDlELSN4MzA5RV0NCi0vLyB8IFsjeDMwRkMtI3gzMEZFXQ0KLUV4dGVuZGVyID0gW1x1MDBCN1x1MDJEMFx1MDJEMVx1MDM4N1x1MDY0MFx1MEU0Nlx1MEVDNlx1MzAwNVx1MzAzMS1cdTMwMzVcdTMwOUQtXHUzMDlFXHUzMEZDLVx1MzBGRV0NCi0NCi0NCi0NCi0vKioNCi0gKiBKU1AgYW5kIHNjcmlwdGluZyBtYXJrZXIgYWxsb3dhbmNlcw0KLSAqLw0KLQ0KLWpzcENvbW1lbnRTdGFydCA9IDwlLS0NCi1qc3BDb21tZW50RW5kICAgPSAtLSU+DQotDQotanNwU2NyaXB0bGV0U3RhcnQgICAgICAgID0gPCUNCi1qc3BFeHByZXNzaW9uU3RhcnQgICAgICAgPSB7anNwU2NyaXB0bGV0U3RhcnR9PQ0KLWpzcERlY2xhcmF0aW9uU3RhcnQgICAgICA9IHtqc3BTY3JpcHRsZXRTdGFydH1cIQ0KLWpzcFNjcmlwdGxldEVuZCAgICAgICAgICA9ICU+DQotanNwRGlyZWN0aXZlU3RhcnQgICAgICAgID0ge2pzcFNjcmlwdGxldFN0YXJ0fUANCi0NCi0lJQ0KLQ0KLS8qIHdoaXRlIHNwYWNlIHdpdGhpbiBhIHRhZyAqLw0KLTxTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX0pTUF9BVFRSSUJVVEVfVkFMVUUsIFNUX1BJLCBTVF9YTUxfUElfRVFVQUxTLCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUsIFNUX1hNTF9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OLCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiwgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFLCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFLFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQsU1RfREhUTUxfQVRUUklCVVRFX05BTUUsU1RfREhUTUxfRVFVQUxTLFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSxTVF9ESFRNTF9UQUdfQ0xPU0U+IHtTfSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi0NCi0vLyBCRUdJTiBSRUdVTEFSIFhNTA0KLS8qIGhhbmRsZSBvcGVuaW5nIGEgbmV3IHRhZyBhbG1vc3QgYW55d2hlcmUgKi8NCi0NCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9KU1BfRElSRUNUSVZFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUywgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnT3Blbn0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX09QRU47DQotfQ0KLS8qIFZFUlkgc3BlY2lhbCBjYXNlcyBmb3IgdGFncyBhcyB2YWx1ZXMgKi8NCi0vKiBxdW90ZWQgSlNQICovDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRD4gWyJdIHsNCi0JcmV0dXJuIGlzSnNwVGFnKCk/IEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSA6IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URTsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRD4gWyddIHsNCi0JcmV0dXJuIGlzSnNwVGFnKCkgPyBKU1BfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUgOiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEU7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9KU1BfQVRUUklCVVRFX1ZBTFVFPiBbIl0gew0KLQlTdHJpbmcgdHlwZSA9IHl5X2xleGljYWxfc3RhdGUgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSA/IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSA6IEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URTsNCi0NCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwgIit0eXBlKTsvLyROT04tTkxTLTEkDQotCX0NCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7DQotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKTsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBjb21wbGV4IGRvdWJsZSBxdW90ZWQiKTsvLyROT04tTkxTLTEkDQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIodHlwZSwgdHlwZSk7DQotCWZTdGF0ZVN0YWNrLnBvcCgpOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gVU5ERUZJTkVEKSB7DQotCQlmUHJveHlVbmtub3duUmVnaW9uID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUsIGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpLCBmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpLCBmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkpOw0KLQkJcmV0dXJuIFBST1hZX1VOS05PV05fQ09OVEVYVDsNCi0JfQ0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX0pTUF9BVFRSSUJVVEVfVkFMVUU+IFsnXSB7DQotCVN0cmluZyB0eXBlID0geXlfbGV4aWNhbF9zdGF0ZSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFID8gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFIDogSlNQX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFOw0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCsiLCAiK3R5cGUpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpOw0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGNvbXBsZXggc2luZ2xlIHF1b3RlZCIpOy8vJE5PTi1OTFMtMSQNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcih0eXBlLCB0eXBlKTsNCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICBpZiAoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gVU5ERUZJTkVEKSB7DQotCQlmUHJveHlVbmtub3duUmVnaW9uID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUsIGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpLCBmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpLCBmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkpOw0KLQkJcmV0dXJuIFBST1hZX1VOS05PV05fQ09OVEVYVDsNCi0JfQ0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRD4gKFtePCJceDI0XHgyM10rfFtceDI0XHgyM117U30qKQ0KLXsNCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEPiAoW148J1x4MjRceDIzXSt8W1x4MjRceDIzXXtTfSopDQotew0KLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLQ0KLQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQsU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEPiB7Z2VuZXJpY1RhZ09wZW59IHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwgZ2VuZXJpY1RhZ09wZW4iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JaW50IGluY29taW5nU3RhdGUgPSB5eXN0YXRlKCk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBpbnNpZGUgb2YgSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOw0KLQlpZih5eXN0YXRlKCkgIT0gU1RfQUJPUlRfRU1CRURERUQpDQotICAgICAgICB5eWJlZ2luKGluY29taW5nU3RhdGUpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IHtnZW5lcmljRW5kVGFnT3Blbn0gew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCsiLCBnZW5lcmljRW5kVGFnT3BlbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlpbnQgaW5jb21pbmdTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGVuZCB0YWciKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfRU5EX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7DQotCWlmKHl5c3RhdGUoKSAhPSBTVF9BQk9SVF9FTUJFRERFRCkNCi0gICAgICAgIHl5YmVnaW4oaW5jb21pbmdTdGF0ZSk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0NCi0vKiB1bnF1b3RlZCAqLw0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiB7Z2VuZXJpY1RhZ09wZW59IHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwgdW5xdW90ZWQgZ2VuZXJpY1RhZ09wZW4iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgdGFnIGVtYmVkZGVkIG5hbWUgc3RhcnQgLSBzdGFydCB0YWciKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsNCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotDQotPFlZSU5JVElBTCwgU1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX0pTUF9BVFRSSUJVVEVfVkFMVUUsIFNUX1hNTF9ERUNMQVJBVElPTj4ge2dlbmVyaWNFbmRUYWdPcGVufSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5lbmQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOw0KLX0NCi0vKiBzcGVjaWFsbHkgdHJlYXRlZCBKU1AgdGFnIG5hbWVzICovDQotPFNUX1hNTF9UQUdfTkFNRT4ganNwOnJvb3Qgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImpzcDpyb290IHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBKU1BfUk9PVF9UQUdfTkFNRTsNCi19DQotPFNUX1hNTF9UQUdfTkFNRT4ganNwOmRpcmVjdGl2ZS4ocGFnZXxpbmNsdWRlfHRhZ3x0YWdsaWJ8YXR0cmlidXRlfHZhcmlhYmxlKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgianNwIGRpcmVjdGl2ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOw0KLX0NCi0vKiB0aGUgdGFnJ3MgbmFtZSB3YXMgZm91bmQsIHN0YXJ0IHNjYW5uaW5nIGZvciBhdHRyaWJ1dGVzICovDQotPFNUX1hNTF9UQUdfTkFNRT4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgU3RyaW5nIHRhZ25hbWUgPSB5eXRleHQoKTsNCi0gICAgYm9vbGVhbiBqc3BUYWcgPSB0YWduYW1lLmluZGV4T2YoJzonKSAhPSAtMTsNCi0JaWYgKGZFbWJlZGRlZENvbnRhaW5lciAhPSBudWxsKSB7DQotICAgIAlmRW1iZWRkZWRUYWcgPSBqc3BUYWc7DQotCQlmSW5UYWdFbWJlZGRlZCA9IHRydWU7DQotICAgIH0NCi0JZWxzZSB7DQotCQlmQ29udGFpbmVyVGFnID0ganNwVGFnOw0KLQkJZkluVGFnQ29udGFpbmVyID0gdHJ1ZTsNCi0JfQ0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLQ0KLS8qIGFub3RoZXIgYXR0cmlidXRlIG5hbWUgd2FzIGZvdW5kLCByZXN1bWUgbG9va2luZyBmb3IgdGhlIGVxdWFscyBzaWduICovDQotPFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotfQ0KLS8qIGFuIGVxdWFsIHNpZ24gd2FzIGZvdW5kLCB3aGF0J3MgbmV4dCBpcyB0aGUgdmFsdWUgKi8NCi08U1RfWE1MX0VRVUFMUz4ge0VxfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0gICAgICAgIHl5YmVnaW4oaXNKc3BUYWcoKSA/IFNUX0pTUF9BVFRSSUJVVEVfVkFMVUUgOiBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7DQotfQ0KLS8qIHRoZSB2YWx1ZSB3YXMgZm91bmQsIGxvb2sgZm9yIHRoZSBuZXh0IG5hbWUgKi8NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge0F0dFZhbHVlfSB7IC8qIG9ubHkgYWxsb3cgZm9yIG5vbi1KU1AgdGFncyBmb3IgdGhpcyBkb2VzIG5vdCBvYmV5IEpTUCBxdW90aW5nIHJ1bGVzICovDQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLTxTVF9KU1BfQVRUUklCVVRFX1ZBTFVFPiB7UXVvdGVkQXR0VmFsdWV9IHsgLyogSlNQIGF0dHJpYnV0ZSB2YWx1ZXMgaGF2ZSBlc2NhcGUgc2VtYW50aWNzICovDQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgianNwIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotDQotLyogdGhlIHRhZydzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfSlNQX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0JaWYoaXNCbG9ja01hcmtlcigpKSB7DQotCQlmRW1iZWRkZWRIaW50ID0gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCk7DQotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9CTE9DS19UQUdfU0NBTjsNCi0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JfQ0KLQllbHNlDQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOw0KLQ0KLQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyICE9IG51bGwpDQotCQlmSW5UYWdFbWJlZGRlZCA9IGZhbHNlOw0KLQllbHNlDQotCQlmSW5UYWdDb250YWluZXIgPSBmYWxzZTsNCi0NCi0JcmV0dXJuIFhNTF9UQUdfQ0xPU0U7DQotfQ0KLS8qIHRoZSB0YWcncyBjbG9zZSB3YXMgZm91bmQsIGJ1dCB0aGUgdGFnIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIGVuZCB0YWcgKi8NCi08U1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX0pTUF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljRW1wdHlUYWdDbG9zZX0gew0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVtcHR5IHRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0NCi0JaWYgKGZFbWJlZGRlZENvbnRhaW5lciAhPSBudWxsKQ0KLQkJZkluVGFnRW1iZWRkZWQgPSBmYWxzZTsNCi0JZWxzZQ0KLQkJZkluVGFnQ29udGFpbmVyID0gZmFsc2U7DQotDQotCXJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOw0KLX0NCi0NCi08U1RfWE1MX1RBR19OQU1FPiBbXjwvPlx1MDA0MS1cdTAwNUFcdTAwNjEtXHUwMDdBXHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMEZGXHUwMTAwLVx1MDEzMVx1MDEzNC1cdTAxM0VcdTAxNDEtXHUwMTQ4XHUwMTRBLVx1MDE3RVx1MDE4MC1cdTAxQzNcdTAxQ0QtXHUwMUYwXHUwMUY0LVx1MDFGNVx1MDFGQS1cdTAyMTdcdTAyNTAtXHUwMkE4XHUwMkJCLVx1MDJDMVx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNDRVx1MDNEMC1cdTAzRDZcdTAzREFcdTAzRENcdTAzREVcdTAzRTBcdTAzRTItXHUwM0YzXHUwNDAxLVx1MDQwQ1x1MDQwRS1cdTA0NEZcdTA0NTEtXHUwNDVDXHUwNDVFLVx1MDQ4MVx1MDQ5MC1cdTA0QzRcdTA0QzctXHUwNEM4XHUwNENCLVx1MDRDQ1x1MDREMC1cdTA0RUJcdTA0RUUtXHUwNEY1XHUwNEY4LVx1MDRGOVx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg2XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjEtXHUwNjNBXHUwNjQxLVx1MDY0QVx1MDY3MS1cdTA2QjdcdTA2QkEtXHUwNkJFXHUwNkMwLVx1MDZDRVx1MDZEMC1cdTA2RDNcdTA2RDVcdTA2RTUtXHUwNkU2XHUwOTA1LVx1MDkzOVx1MDkzRFx1MDk1OC1cdTA5NjFcdTA5ODUtXHUwOThDXHUwOThGLVx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlEQy1cdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwLVx1MDlGMVx1MEEwNS1cdTBBMEFcdTBBMEYtXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzItXHUwQTMzXHUwQTM1LVx1MEEzNlx1MEEzOC1cdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOEJcdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjItXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFFMFx1MEIwNS1cdTBCMENcdTBCMEYtXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzItXHUwQjMzXHUwQjM2LVx1MEIzOVx1MEIzRFx1MEI1Qy1cdTBCNURcdTBCNUYtXHUwQjYxXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5LVx1MEI5QVx1MEI5Q1x1MEI5RS1cdTBCOUZcdTBCQTMtXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjVcdTBCQjctXHUwQkI5XHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzM1x1MEMzNS1cdTBDMzlcdTBDNjAtXHUwQzYxXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDREVcdTBDRTAtXHUwQ0UxXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDI4XHUwRDJBLVx1MEQzOVx1MEQ2MC1cdTBENjFcdTBFMDEtXHUwRTJFXHUwRTMwXHUwRTMyLVx1MEUzM1x1MEU0MC1cdTBFNDVcdTBFODEtXHUwRTgyXHUwRTg0XHUwRTg3LVx1MEU4OFx1MEU4QVx1MEU4RFx1MEU5NC1cdTBFOTdcdTBFOTktXHUwRTlGXHUwRUExLVx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQS1cdTBFQUJcdTBFQUQtXHUwRUFFXHUwRUIwXHUwRUIyLVx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2OVx1MTBBMC1cdTEwQzVcdTEwRDAtXHUxMEY2XHUxMTAwXHUxMTAyLVx1MTEwM1x1MTEwNS1cdTExMDdcdTExMDlcdTExMEItXHUxMTBDXHUxMTBFLVx1MTExMlx1MTEzQ1x1MTEzRVx1MTE0MFx1MTE0Q1x1MTE0RVx1MTE1MFx1MTE1NC1cdTExNTVcdTExNTlcdTExNUYtXHUxMTYxXHUxMTYzXHUxMTY1XHUxMTY3XHUxMTY5XHUxMTZELVx1MTE2RVx1MTE3Mi1cdTExNzNcdTExNzVcdTExOUVcdTExQThcdTExQUJcdTExQUUtXHUxMUFGXHUxMUI3LVx1MTFCOFx1MTFCQVx1MTFCQy1cdTExQzJcdTExRUJcdTExRjBcdTExRjlcdTFFMDAtXHUxRTlCXHUxRUEwLVx1MUVGOVx1MUYwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjEyNlx1MjEyQS1cdTIxMkJcdTIxMkVcdTIxODAtXHUyMTgyXHUzMDQxLVx1MzA5NFx1MzBBMS1cdTMwRkFcdTMxMDUtXHUzMTJDXHVBQzAwLVx1RDdBM1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImluYXBwcm9wcmlhdGUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWlmKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRHx8ZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpKSB7DQotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsNCi0JCWNoYXIgYyA9IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MgLSAxXTsNCi0JCWlmIChmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCAmJiBjID09ICdcIicpIHsNCi0JCQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFOw0KLQkJfQkJDQotCQlpZiAoZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQgJiYgYyA9PSAnXCcnKSB7DQotCQkJcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URTsNCi0JCX0NCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKS0xKTsNCi0JCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JfQ0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX0NPTlRFTlQ7DQotfQ0KLQ0KLS8vIEVORCBSRUdVTEFSIFhNTA0KLQ0KLS8vIEJFR0lOIE5FU1RFRCBYTUwgVEFHUw0KLTxTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9FUVVBTFM+IDx7TmFtZX0gew0KLQlTdHJpbmcgdGFnTmFtZSA9IHl5dGV4dCgpLnN1YnN0cmluZygxKTsNCi0JLy8gcHVzaGJhY2sgdG8ganVzdCBhZnRlciB0aGUgb3BlbmluZyBicmFja2V0DQotCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDEpOw0KLQkvKg0KLQkgKiBJZiB0aGlzIHRhZyBjYW4gbm90IGJlIG5lc3RlZCBvciB3ZSdyZSBhbHJlYWR5IHNlYXJjaGluZyBmb3IgYW4NCi0JICogYXR0cmlidXRlIG5hbWUsIGVxdWFscywgb3IgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4NCi0JICovDQotCWlmICghaXNOZXN0YWJsZSh0YWdOYW1lKSB8fCAoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9FUVVBTFMgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX0pTUF9BVFRSSUJVVEVfVkFMVUUpKSkgew0KLQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQkJcmV0dXJuIFhNTF9UQUdfT1BFTjsNCi0JfQ0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBpbiBwbGFjZSBvZiBhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQNCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JeXliZWdpbihTVF9YTUxfRVFVQUxTKTsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9KU1BfQVRUUklCVVRFX1ZBTFVFPiA8e05hbWV9IHsNCi0JU3RyaW5nIHRhZ05hbWUgPSB5eXRleHQoKS5zdWJzdHJpbmcoMSk7DQotCS8vIHB1c2hiYWNrIHRvIGp1c3QgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2tldA0KLQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAxKTsNCi0JLyoNCi0JICogSWYgdGhpcyB0YWcgY2FuIG5vdCBiZSBuZXN0ZWQgb3Igd2UncmUgYWxyZWFkeSBzZWFyY2hpbmcgZm9yIGFuDQotCSAqIGF0dHJpYnV0ZSBuYW1lLCBlcXVhbHMsIG9yIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuDQotCSAqLw0KLQlpZiAoIWlzTmVzdGFibGUodGFnTmFtZSkgfHwgKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfRVFVQUxTIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9KU1BfQVRUUklCVVRFX1ZBTFVFKSkpIHsNCi0JCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JCXJldHVybiBYTUxfVEFHX09QRU47DQotCX0NCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgaW4gcGxhY2Ugb2YgYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQNCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotLy8gRU5EIE5FU1RFRCBYTUwNCi0NCi0vLyBYTUwgJiBKU1AgQ29tbWVudHMNCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfSlNQX0FUVFJJQlVURV9WQUxVRSwgU1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9KU1BfRElSRUNUSVZFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUywgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUU+IHtDb21tZW50U3RhcnR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbmNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09NTUVOVF9URVhUOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQ09NTUVOVDsNCi0JeXliZWdpbihTVF9YTUxfQ09NTUVOVCk7DQotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOw0KLX0NCi08U1RfWE1MX0NPTU1FTlQ+IC58XHJ8XG4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImNvbW1lbnQgY29udGVudCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLX0NCi0NCi08U1RfWE1MX0NPTU1FTlRfRU5EPiB7Q29tbWVudEVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotCXJldHVybiBYTUxfQ09NTUVOVF9DTE9TRTsNCi19DQotDQotPFNUX0pTUF9DT05URU5UPiB7anNwU2NyaXB0bGV0RW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBKU1BfQ0xPU0U7DQotfQ0KLTxTVF9KU1BfQ09OVEVOVD4gLnxcbnxcciB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGNvZGUgY29udGVudCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIGRvU2NhbigiJT4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBKU1BfQ09OVEVOVCwgU1RfSlNQX0NPTlRFTlQsIFNUX0pTUF9DT05URU5UKTsNCi19DQote2pzcFNjcmlwdGxldFN0YXJ0fSB7DQotCS8qIEpTUCBzY3JpcHRsZXQgYmVndW4gKGFueXdoZXJlKQ0KLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQ0KLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cw0KLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZA0KLQkgKi8NCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcw0KLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsNCi0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQ0KLQkJeXlwdXNoYmFjaygxKTsNCi0JCXJldHVybiBKU1BfQ09OVEVOVDsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgew0KLQkJeXlwdXNoYmFjaygyKTsNCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOw0KLQl9DQotCS8vIGZpbmlzaGVkIHNhbml0eSBjaGVja3MNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgew0KLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgcmVndWxhciBzY3JpcHRsZXQgb3V0IGluIGNvbnRlbnQNCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIlxuSlNQIHNjcmlwdGxldCBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJcmV0dXJuIEpTUF9TQ1JJUFRMRVRfT1BFTjsNCi0JfQ0KLQllbHNlIHsNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCsiLCBqc3BTY3JpcHRsZXRTdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIkpTUCBzY3JpcHRsZXQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7DQotCQl9DQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1NDUklQVExFVF9PUEVOLCBKU1BfQ0xPU0UpOw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7DQotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7DQotCQl9DQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLSAgICAgICAgZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0FUVFJJQlVURV9WQUxVRSkgew0KLSAgICAgICAgICAgIGZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0gICAgICAgICAgICBmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB9DQotCQkNCi0JCXJldHVybiBQUk9YWV9DT05URVhUOw0KLQl9DQotfQ0KLXtqc3BFeHByZXNzaW9uU3RhcnR9IHsNCi0JLyogSlNQIGV4cHJlc3Npb24gYmVndW4gKGFueXdoZXJlKQ0KLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQ0KLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cw0KLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZA0KLQkgKi8NCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcw0KLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsNCi0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQ0KLQkJeXlwdXNoYmFjaygyKTsNCi0JCXJldHVybiBKU1BfQ09OVEVOVDsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgew0KLQkJeXlwdXNoYmFjaygzKTsNCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOw0KLQl9DQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzDQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsNCi0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhbiBleHByZXNzaW9uIG91dCBpbiBjb250ZW50DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJcbkpTUCBleHByZXNzaW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7DQotCQlyZXR1cm4gSlNQX0VYUFJFU1NJT05fT1BFTjsNCi0JfQ0KLQllbHNlIHsNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCsiLCBqc3BFeHByZXNzaW9uU3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJKU1AgZXhwcmVzc2lvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOw0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsNCi0JCX0NCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRVhQUkVTU0lPTl9PUEVOLCBKU1BfQ0xPU0UpOw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7DQotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7DQotCQl9DQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0FUVFJJQlVURV9WQUxVRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQkNCi0JCXJldHVybiBQUk9YWV9DT05URVhUOw0KLQl9DQotfQ0KLXtqc3BEZWNsYXJhdGlvblN0YXJ0fSB7DQotCS8qIEpTUCBkZWNsYXJhdGlvbiBiZWd1biAoYW55d2hlcmUpDQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlDQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzDQotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkDQotCSAqLw0KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzDQotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgew0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hDQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIEpTUF9DT05URU5UOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7DQotCX0NCi0JLy8gZW5kIHNhbml0eSBjaGVja3MNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgew0KLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgZGVjbGFyYXRpb24gb3V0IGluIGNvbnRlbnQNCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIlxuSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7DQotCQlyZXR1cm4gSlNQX0RFQ0xBUkFUSU9OX09QRU47DQotCX0NCi0JZWxzZSB7DQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwganNwRGVjbGFyYXRpb25TdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOw0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsNCi0JCX0NCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfREVDTEFSQVRJT05fT1BFTiwgSlNQX0NMT1NFKTsNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgew0KLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQkJCXJldHVybiBCTE9DS19URVhUOw0KLQkJfQ0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zDQotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotCQl9DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotCX0NCi19DQote2pzcENvbW1lbnRTdGFydH0gew0KLQkvKiBKU1AgY29tbWVudCBiZWd1biAoYW55d2hlcmUpDQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlDQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzDQotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkDQotCSAqLw0KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzDQotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgew0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hDQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIEpTUF9DT05URU5UOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7DQotCQl5eXB1c2hiYWNrKDQpOw0KLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soNCk7DQotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soNCk7DQotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pICB7DQotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0NPTU1FTlRfT1BFTiwgSlNQX0NPTU1FTlRfQ0xPU0UpOw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKQ0KLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotCX0NCi0JLy8gZmluaXNoZWQgc2FuaXR5IGNoZWNrcw0KLQlpZih5eXN0YXRlKCk9PVlZSU5JVElBTCkgew0KLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgcmVndWxhciBzY3JpcHRsZXQgb3V0IGluIGNvbnRlbnQNCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIlxuSlNQIGNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsNCi0JCXJldHVybiBKU1BfQ09NTUVOVF9PUEVOOw0KLQl9DQotCWVsc2Ugew0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KyIsIGpzcENvbW1lbnRTdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIkpTUCBjb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgew0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOw0KLQkJfQ0KLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7DQotCQkvLyB0aGUgY29tbWVudCBjb250YWluZXIgaXRzZWxmIHdpbGwgYWN0IGFzIGNvbW1lbnQgdGV4dA0KLQkJZkVtYmVkZGVkSGludCA9IEpTUF9DT01NRU5UX1RFWFQ7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgew0KLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQkJCXJldHVybiBCTE9DS19URVhUOw0KLQkJfQ0KLQkJLyoNCi0JCSAqIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9uczsgbWFyayB0aGlzIG9uZSBhcyBhDQotCQkgKiBjb21tZW50IHNvIGl0IHdpbGwgYmUgb3RoZXJ3aXNlIGlnbm9yZWQgYnV0IHByZXNlcnZlZCAod2hpY2ggaXMgd2h5DQotCQkgKiB3ZSBjYW4ndCB1c2Ugd2hpdGUtc3BhY2UpDQotCQkgKi8NCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0FUVFJJQlVURV9WQUxVRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi0JfQ0KLX0NCi0NCi08U1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4+IHtqc3BDb21tZW50U3RhcnR9ICB7DQotCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsNCi0JaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKQ0KLQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0NCi17anNwRGlyZWN0aXZlU3RhcnR9IHsNCi0JLyogSlNQIGRpcmVjdGl2ZSBiZWd1biAoYW55d2hlcmUpDQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlDQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzDQotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkDQotCSAqLw0KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzDQotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgew0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hDQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIEpTUF9DT05URU5UOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7DQotCX0NCi0JLy8gZW5kIHNhbml0eSBjaGVja3MNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgew0KLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgZGVjbGFyYXRpb24gb3V0IGluIGNvbnRlbnQNCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIlxuSlNQIGRpcmVjdGl2ZSBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FKTsNCi0JCXJldHVybiBKU1BfRElSRUNUSVZFX09QRU47DQotCX0NCi0JZWxzZSB7DQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwganNwRGlyZWN0aXZlU3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJKU1AgZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7DQotCQl9DQotCQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSk7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9ESVJFQ1RJVkVfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9ESVJFQ1RJVkVfQ0xPU0UsIEpTUF9DTE9TRX0pOw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7DQotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7DQotCQl9DQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotCX0NCi19DQotDQotDQotPFNUX0pTUF9ESVJFQ1RJVkVfTkFNRT4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgZGlyZWN0aXZlIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UpOw0KLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOw0KLX0NCi08U1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0U+IHtTfT8gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOw0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLTxTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi08U1RfSlNQX0RJUkVDVElWRV9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotPFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFPiB7QXR0VmFsdWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotPFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRT4ge2pzcFNjcmlwdGxldEVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9DTE9TRTsNCi19DQotDQotPFlZSU5JVElBTD4ge2pzcENvbW1lbnRTdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOw0KLQlyZXR1cm4gSlNQX0NPTU1FTlRfT1BFTjsNCi19DQotDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRD4gXHgyNFx4N2Igew0KLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9FTCk7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSwgSlNQX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFfSk7DQotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIGRvdWJsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgRUwNCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkgfHwgZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkpIHsNCi0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOw0KLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQl9DQotCWVsc2Ugew0KLQkJeXliZWdpbihlbnRlclN0YXRlKTsNCi0JfQ0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRD4gXHgyM1x4N2Igew0KLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9WQkwpOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSwgSlNQX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFfSk7DQotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIGRvdWJsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgVkJMDQotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpIHx8IGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhKU1BfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7DQotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsNCi0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JfQ0KLQllbHNlIHsNCi0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7DQotCX0NCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IFx4MjRceDdiIHsNCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7DQotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfRUwpOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOw0KLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMDQotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpIHx8IGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhKU1BfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpKSB7DQotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsNCi0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JfQ0KLQllbHNlIHsNCi0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7DQotCX0NCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IFx4MjNceDdiIHsNCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7DQotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfVkJMKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOw0KLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIFZCTA0KLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSB8fCBmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoSlNQX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgew0KLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7DQotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCX0NCi0JZWxzZSB7DQotCQl5eWJlZ2luKGVudGVyU3RhdGUpOw0KLQl9DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0NCi0vLyB1bmVzY2FwZWQgZG91YmxlIHF1b3RlLCByZXR1cm4gYXMgZW5kaW5nIHJlZ2lvbg0KLTxTVF9KU1BfRFFVT1RFRF9FTCxTVF9KU1BfRFFVT1RFRF9WQkw+IFsiXSB7DQotCXJldHVybiBpc0pzcFRhZygpID8gSlNQX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFOiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEU7DQotfQ0KLS8vIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUsIHJldHVybiBhcyBlbmRpbmcgcmVnaW9uDQotPFNUX0pTUF9TUVVPVEVEX0VMLFNUX0pTUF9TUVVPVEVEX1ZCTD4gWyddIHsNCi0JcmV0dXJuIGlzSnNwVGFnKCkgPyBKU1BfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUgOiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEU7DQotfQ0KLQ0KLQ0KLS8vIHBhaXJlZCBlc2NhcGVkIGRvdWJsZSBxdW90ZXMNCi08U1RfSlNQX0RRVU9URURfRUw+IFxcXCIgKFteXFxdfFxcW14ifV0rKSogXFxcIiB7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLS8vIGV2ZXJ5dGhpbmcgZWxzZSBFTA0KLTxTVF9KU1BfRFFVT1RFRF9FTD4gKFteXFx9Il18XFxbXiJdKSsgew0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRFFVT1RFRF9FTD4gXFxcIiB7DQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsNCi19DQotLy8gcGFpcmVkIGVzY2FwZWQgcXVvdGVzDQotPFNUX0pTUF9TUVVPVEVEX0VMPiBcXFwnIChbXlxcXXxcXFteJ31dKykqIFxcXCcgew0KLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOw0KLX0NCi0vLyBldmVyeXRoaW5nIGVsc2UgRUwNCi08U1RfSlNQX1NRVU9URURfRUw+IChbXlxcfSddfFxcW14nXSkrIHsNCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX1NRVU9URURfRUw+IFxcXCcgew0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRFFVT1RFRF9FTCxTVF9KU1BfU1FVT1RFRF9FTD4gfSB7DQotCXJldHVybiBKU1BfRUxfQ0xPU0U7DQotfQ0KLQ0KLQ0KLS8vIHBhaXJlZCBlc2NhcGVkIHF1b3Rlcw0KLTxTVF9KU1BfRFFVT1RFRF9WQkw+IFxcXCIgKFteXFxdfFxcW14ifV0rKSogXFxcIiB7DQotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOw0KLX0NCi0vLyBldmVyeXRoaW5nIGVsc2UgVkJMDQotPFNUX0pTUF9EUVVPVEVEX1ZCTD4gKFteXFx9Il18XFxbXiJdKSsgew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX0RRVU9URURfVkJMPiBcXFwiIHsNCi0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsNCi19DQotLy8gcGFpcmVkIGVzY2FwZWQgcXVvdGVzDQotPFNUX0pTUF9TUVVPVEVEX1ZCTD4gXFxcJyAoW15cXF18XFxbXid9XSspKiBcXFwnIHsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLS8vIGV2ZXJ5dGhpbmcgZWxzZSBWQkwNCi08U1RfSlNQX1NRVU9URURfVkJMPiAoW15cXH0nXXxcXFteJ10pKyB7DQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfU1FVT1RFRF9WQkw+IFxcXCcgew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi0NCi08U1RfSlNQX0RRVU9URURfVkJMLFNUX0pTUF9TUVVPVEVEX1ZCTD4gfSB7DQotCXJldHVybiBKU1BfVkJMX0NMT1NFOw0KLX0NCi0NCi0NCi0vLyBYTUwgY29udGVudCBhcmVhIEVMDQotPFlZSU5JVElBTD4gXHgyNFx4N2JbXlx4N2RdKi9ceDdkIHsNCi0JeXliZWdpbihTVF9KU1BfRUwpOw0KLQlpZih5eWxlbmd0aCgpID4gMikNCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDIpOw0KLQlmRUxsZXZlbCsrOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgSlNQX0VMX0NMT1NFKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOw0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi08U1RfSlNQX0VMPiBceDI0XHg3YiB7DQotCWZFTGxldmVsKys7DQotCWlmKGZFTGxldmVsID09IDEpIHsNCi0JCXJldHVybiBKU1BfRUxfT1BFTjsNCi0JfQ0KLX0NCi0vLyBYTUwgY29udGVudCBhcmVhIFZCTA0KLTxZWUlOSVRJQUw+IFx4MjNceDdiW15ceDdkXSovXHg3ZCB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7DQotCWlmKHl5bGVuZ3RoKCkgPiAyKQ0KLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMik7DQotCWZFTGxldmVsKys7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgSlNQX1ZCTF9DTE9TRSk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsNCi0JeXliZWdpbihZWUlOSVRJQUwpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX0pTUF9WQkw+IFx4MjNceDdiIHsNCi0JZkVMbGV2ZWwrKzsNCi0JaWYoZkVMbGV2ZWwgPT0gMSkgew0KLQkJcmV0dXJuIEpTUF9WQkxfT1BFTjsNCi0JfQ0KLX0NCi0vLyByZXR1cm4gYW55dGhpbmcgbm90IHN0YXJ0aW5nIHF1b3RlcyBvciBlbmRpbmcgdGhlIFZCTCBhcyBjb250ZW50DQotPFNUX0pTUF9WQkw+IFteXHg3ZFx4MjJceDI3XSogew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi0vLyByZXR1cm4gYW55dGhpbmcgbm90IHN0YXJ0aW5nIHF1b3RlcyBvciBlbmRpbmcgdGhlIEVMIGFzIGNvbnRlbnQNCi08U1RfSlNQX0VMPiBbXlx4N2RceDIyXHgyN10qIHsNCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi0NCi0NCi0vLyBxdW90ZXMNCi08U1RfSlNQX0VMPiBceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFUyk7DQotCXJldHVybiBKU1BfRUxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX0VMX0RRVU9URVM+IFx4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCXJldHVybiBKU1BfRUxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX0VMX0RRVU9URVM+IFteXHgyMl0rL1x4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9FTF9EUVVPVEVTX0VORCk7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRUxfRFFVT1RFU19FTkQ+IFx4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCXJldHVybiBKU1BfRUxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX0VMPiBceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfRUxfU1FVT1RFUyk7DQotCXJldHVybiBKU1BfRUxfU1FVT1RFOw0KLX0NCi08U1RfSlNQX0VMX1NRVU9URVM+IFx4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCXJldHVybiBKU1BfRUxfU1FVT1RFOw0KLX0NCi08U1RfSlNQX0VMX1NRVU9URVM+IFteXHgyN10rL1x4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9FTF9TUVVPVEVTX0VORCk7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRUxfU1FVT1RFU19FTkQ+IFx4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCXJldHVybiBKU1BfRUxfU1FVT1RFOw0KLX0NCi0vLyBxdW90ZXMNCi08U1RfSlNQX1ZCTD4gXHgyMiB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTF9EUVVPVEVTKTsNCi0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTF9EUVVPVEVTPiBceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTF9EUVVPVEVTPiBbXlx4MjJdKy9ceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfVkJMX0RRVU9URVNfRU5EKTsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfVkJMX0RRVU9URVNfRU5EPiBceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTD4gXHgyNyB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTF9TUVVPVEVTKTsNCi0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTF9TUVVPVEVTPiBceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTF9TUVVPVEVTPiBbXlx4MjddKy9ceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfVkJMX1NRVU9URVNfRU5EKTsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfVkJMX1NRVU9URVNfRU5EPiBceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOw0KLX0NCi0NCi0vLyB1bnF1b3RlZCBjb250ZW50DQotPFNUX0pTUF9FTD4gKFtefVx4MjdceDIyXHgyNF18XHgyNFteXHg3Ylx4MjdceDIyXSkrIHsNCi0JLy9TeXN0ZW0ub3V0LnByaW50bG4oSlNQX0VMX0NPTlRFTlQrICI6WyIgKyB5eXRleHQoKSArICJdIik7DQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsNCi19DQotPFNUX0pTUF9FTD4gfSB7DQotCWZFTGxldmVsLS07DQotCWlmKGZFTGxldmVsID09IDApIHsNCi0JCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JCXJldHVybiBKU1BfRUxfQ0xPU0U7DQotCX0NCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX1ZCTD4gfSB7DQotCWZFTGxldmVsLS07DQotCWlmKGZFTGxldmVsID09IDApIHsNCi0JCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JCXJldHVybiBKU1BfVkJMX0NMT1NFOw0KLQl9DQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7DQotfQ0KLS8vIEVMIHVucXVvdGVkIGluIHRhZyAoc2VjdGlvbiAyLjEgZGVjbGFyZXMgaXQgYXMgdmFsaWQgaW4gdGVtcGxhdGUgdGV4dCAoWE1MX0NPTlRFTlQpIG9yIGF0dHJpYnV0ZSB2YWx1ZXMNCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfSlNQX0FUVFJJQlVURV9WQUxVRT4gXHgyNFx4N2JbXlx4N2RdKy9ceDdkIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwgZWwtdW5xdW90ZWQiKTsvLyROT04tTkxTLTEkDQotCX0NCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoeXlsZW5ndGgoKSA+IDIpDQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkVMIGluIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX0VMKTsNCi0JZkVMbGV2ZWwrKzsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRX0pOw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLS8vIFZCTCB1bnF1b3RlZCBpbiB0YWcgb3IgYXR0cmlidXRlIHZhbHVlcw0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9KU1BfQVRUUklCVVRFX1ZBTFVFPiBceDIzXHg3YlteXHg3ZF0rL1x4N2Qgew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCsiLCBlbC11bnF1b3RlZCIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZih5eWxlbmd0aCgpID4gMikNCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtMik7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiVkJMIGluIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7DQotCWZFTGxldmVsKys7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRX0pOw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLQ0KLTxTVF9KU1BfQ09NTUVOVD4gLnxccnxcbiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5KU1AgY29tbWVudCB0ZXh0Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7DQotfQ0KLTxTVF9KU1BfQ09NTUVOVF9FTkQ+IHtqc3BDb21tZW50RW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5KU1AgY29tbWVudCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihZWUlOSVRJQUwpOw0KLQlyZXR1cm4gSlNQX0NPTU1FTlRfQ0xPU0U7DQotfQ0KLQ0KLS8vIFhNTCBtaXNjDQotDQote0NEU3RhcnR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkNEQVRBIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCXl5YmVnaW4oU1RfQ0RBVEFfVEVYVCk7DQotCXJldHVybiBYTUxfQ0RBVEFfT1BFTjsNCi19DQotPFNUX0NEQVRBX1RFWFQ+IC58XHJ8XG4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsNCi0JU3RyaW5nIHJldHVybmVkQ29udGV4dCA9IGRvU2NhbigiXV0+IiwgZmFsc2UsIHRydWUsIHRydWUsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQsICBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQNCi0JaWYocmV0dXJuZWRDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQ0KLQkJeXliZWdpbihTVF9DREFUQV9FTkQpOw0KLQlyZXR1cm4gcmV0dXJuZWRDb250ZXh0Ow0KLX0NCi08U1RfQ0RBVEFfRU5EPiB7Q0RFbmR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0NEQVRBX0NMT1NFOw0KLX0NCi0NCi08WVlJTklUSUFMPiB7UEVSZWZlcmVuY2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX1BFX1JFRkVSRU5DRTsNCi19DQotPFlZSU5JVElBTD4ge0NoYXJSZWZ9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkNoYXJSZWYiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfQ0hBUl9SRUZFUkVOQ0U7DQotfQ0KLTxZWUlOSVRJQUw+IHtFbnRpdHlSZWZ9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOw0KLX0NCi0NCi08WVlJTklUSUFMPiB7UElzdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9QSSk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47DQotfQ0KLS8vIHRoZSBuZXh0IGZvdXIgYXJlIG9yZGVyIGRlcGVuZGVudA0KLTxTVF9QST4gKChYfHgpKE18bSkoTHxsKSkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi08U1RfUEk+IChbaUldW21NXVtwUF1bb09dW3JSXVt0VF0pIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4geG1sLXN0eWxlc2hlZXQgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhTTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOw0KLSAgICAgICAgeXliZWdpbihTVF9QSV9XUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi08U1RfUElfV1M+IHtTfSsgew0KLSAgICAgICAgeXliZWdpbihTVF9QSV9DT05URU5UKTsNCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsNCi19DQotPFNUX1BJLCBTVF9QSV9XUz4gXD8+IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLTxTVF9QSV9DT05URU5UPiAuIHsNCi0JCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQNCi0JcmV0dXJuIGRvU2NhbigiPz4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBYTUxfUElfQ09OVEVOVCwgU1RfWE1MX1BJX1RBR19DTE9TRSwgU1RfWE1MX1BJX1RBR19DTE9TRSk7DQotfQ0KLTxTVF9QSV9DT05URU5ULFNUX1hNTF9QSV9UQUdfQ0xPU0U+IFw/PiB7DQotCQkvLyBlbmRlZCB3aXRoIG5vdGhpbmcgaW5zaWRlDQotCQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotDQotPFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotPFNUX1hNTF9QSV9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLTxTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFPiB7QXR0VmFsdWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi0vKiB0aGUgUEkncyBjbG9zZSB3YXMgZm91bmQgKi8NCi08U1RfWE1MX1BJX0VRVUFMUywgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFPiB7UEllbmR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi0vLyBESFRNTA0KLTxTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSwgU1RfREhUTUxfRVFVQUxTPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotPFNUX0RIVE1MX0VRVUFMUz4ge0VxfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLTxTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gfCAoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi0vKiBUaGUgREhUTUwgUEkncyBjbG9zZSB3YXMgZm91bmQgKi8NCi08U1RfREhUTUxfRVFVQUxTLCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSwgU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFPiBbL10qPiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi0NCi0vLyBYTUwgZGVjbGFyYXRpb25zDQotDQotPFlZSU5JVElBTCwgU1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX0pTUF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnT3Blbn0hIHsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfREVDTEFSQVRJT05fT1BFTjsNCi19DQotPFNUX1hNTF9ERUNMQVJBVElPTj4gW0VlXVtMbF1bRWVdW01tXVtFZV1bTm5dW1R0XSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTjsNCi19DQotPFNUX1hNTF9ERUNMQVJBVElPTj4gW0RkXVtPb11bQ2NdW1R0XVtZeV1bUHBdW0VlXSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTjsNCi19DQotPFNUX1hNTF9ERUNMQVJBVElPTj4gW0FhXVtUdF1bVHRdW0xsXVtJaV1bU3NdW1R0XSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMQVJBVElPTjsNCi19DQotDQotLy8gYmVnaW4gRE9DVFlQRSBoYW5kbGluZyBwcm9jZWR1cmUNCi08U1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lELCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0sIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQywgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFPiBcW1teXF1dKlxdIHsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVDsNCi19DQotDQotPFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRvY3R5cGUgdHlwZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9OQU1FOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQ+IFtQcF1bVXVdW0JiXVtMbF1bSWldW0NjXSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMpOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQ+IFtTc11bWXldW1NzXVtUdF1bRWVdW01tXSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNPiB7QXR0VmFsdWV9fHtTeXN0ZW1MaXRlcmFsfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSBzeXN0ZW0gcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7DQotCXl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsNCi19DQotLy8gZW5kIERPQ1RZUEUgaGFuZGxpbmcNCi0NCi0vLyBiZWdpbiBFTEVNRU5UIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTj4ge0F0dFZhbHVlfXx7UHViaWRMaXRlcmFsfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOw0KLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9OQU1FOw0KLX0NCi08U1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVD4gW14+XSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9DT05URU5UOw0KLX0NCi0NCi08U1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVD4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNsb3NlIik7Ly8kTk9OLU5MUy0xJA0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsNCi19DQotLy8gZW5kIEVMRU1FTlQgaGFuZGxpbmcNCi0NCi0vLyBiZWdpbiBBVFRMSVNUIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTj4ge0F0dFZhbHVlfXx7UHViaWRMaXRlcmFsfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7DQotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCk7DQotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX05BTUU7DQotfQ0KLTxTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UPiBbXj5dKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfQ09OVEVOVDsNCi19DQotDQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQ+IHtnZW5lcmljVGFnQ2xvc2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0IGNsb3NlIik7Ly8kTk9OLU5MUy0xJA0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsNCi19DQotLy8gZW5kIEFUVExJU1QgaGFuZGxpbmcNCi0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiwgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFLCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQ+IHtnZW5lcmljVGFnQ2xvc2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkZWNsYXJhdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgREVDTEFSQVRJT04gaGFuZGxpbmcNCi0NCi08WVlJTklUSUFMPiAoW148JiVceDI0XHgyM10qfFx4MjMrfFx4MjQrfFsmJV17U30re05hbWV9W14mJTxdKnxbXHgyNFx4MjNdW15ceDdiPCYlXVtePCYlXHgyNFx4MjNdKnxcXFtceDI0XHgyM11bXHg3Yl18WyYlXXtOYW1lfShbXjsmJTxdKnx7U30rOyopKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5YTUwgY29udGVudCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9DT05URU5UOw0KLX0NCi0NCi0NCi08U1RfQkxPQ0tfVEFHX1NDQU4+IC58XHJ8XG4gew0KLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7DQotCX0NCi0NCi0uIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIhISF1bmV4cGVjdGVkISEhOiBcIiIgKyB5eXRleHQoKSArICJcIjoiICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQNCi0JCQl5eWNoYXIgKyAiLSIgKyAoeXljaGFyICsgeXlsZW5ndGgoKSkpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFVOREVGSU5FRDsNCi19DQotDQotXDA0MCB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiU1BBQ0UiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQotXDAxMSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiMHg5Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLVwwMTUgDQotew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkNBUlJJQUdFIFJFVFVSTiIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi1cMDEyIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJMSU5FIEZFRUQiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9YTUxUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjA3YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9YTUxUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MzcgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gMTAvMTcvMDcgNDoyNyBBTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuWE1MUGFyc2VyUmVnaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDEwLzE3LzA3IDQ6MjcgQU0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovZWNsaXBzZS53dHAvd29ya3NwYWNlL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxUb2tlbml6ZXIgaW1wbGVtZW50cyBCbG9ja1Rva2VuaXplciwgRE9NUmVnaW9uQ29udGV4dCB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEID0gMjM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAyNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfQVRUUklCVVRFX05BTUUgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX1RBR19DTE9TRSA9IDExOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UgPSAyMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9FUVVBTFMgPSAxMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1RBR19OQU1FID0gMTY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUgPSAxOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFID0gMTQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSA9IDI1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX05BTUUgPSAxNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04gPSAyNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04gPSAyMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04gPSAyODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlRfRU5EID0gNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfVEVYVCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX1RBR19DTE9TRSA9IDE1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVCA9IDM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX0NPTlRFTlQgPSA3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9XUyA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX0VORCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAyOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQkxPQ0tfVEFHX1NDQU4gPSAzMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0VRVUFMUyA9IDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTiA9IDIwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMgPSAyNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VRVUFMUyA9IDE4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSSA9IDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSA9IDg7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxMVwwXDFcNVwxXDIyXDJcMFwxXDE0XDIyXDBcMVwxNFwxXDIxXDFcMTFcMVw1NSIrCi0gICAgIlwxXDE2XDFcMTdcMVwxMlwxXDEzXDFcMTZcMVwxNlwxXDE2XDFcMTZcMVwxNlwxXDciKwotICAgICJcMVw2XDFcM1wxMlwxNVwxXDEwXDFcNjFcMVwxXDFcNDVcMVwyXDFcNFwxXDE2IisKLSAgICAiXDFcMzRcMVw2MlwxXDMyXDFcMzNcMVw1MFwxXDU3XDFcMzZcMVwzNlwxXDQyXDFcMzYiKwotICAgICJcMVwzNlwxXDI3XDFcMjVcMVw0NFwxXDQzXDFcNDdcMVwzNlwxXDQwXDFcNTZcMVwzNSIrCi0gICAgIlwxXDYwXDJcMzZcMVwyM1wxXDQ2XDFcMzZcMVwzMVwxXDBcMVwyMFwxXDBcMVwxMCIrCi0gICAgIlwxXDBcMVw1MlwxXDYyXDFcNjNcMVw1M1wxXDM3XDFcNTdcMVwzNlwxXDY2XDFcNDIiKwotICAgICJcMlwzNlwxXDMwXDFcMjZcMVw0NFwxXDQzXDFcNDdcMVwzNlwxXDQwXDFcNDFcMVw1MSIrCi0gICAgIlwxXDYwXDFcMzZcMVwzNlwxXDI0XDFcNTRcMVwzNlwxXDBcMVwwXDcyXDBcMVw2NSIrCi0gICAgIlwxMFwwXDI3XDY0XDFcMFwzN1w2NFwxXDBcNzJcNjRcMlwwXDEzXDY0XDJcMFwxMFw2NCIrCi0gICAgIlwxXDBcNjVcNjRcMVwwXDEwNFw2NFwxMVwwXDQ0XDY0XDNcMFwyXDY0XDRcMFwzNlw2NCIrCi0gICAgIlw3MFwwXDEzMVw2NFwyMlwwXDdcNjRcMTZcMFwyXDY1XDU2XDBcMTA2XDY1XDMyXDBcMlw2NSIrCi0gICAgIlw0NFwwXDFcNjRcMVw2NVwzXDY0XDFcMFwxXDY0XDFcMFwyNFw2NFwxXDBcNTRcNjQiKwotICAgICJcMVwwXDdcNjRcM1wwXDFcNjRcMVwwXDFcNjRcMVwwXDFcNjRcMVwwXDFcNjQiKwotICAgICJcMVwwXDIyXDY0XDE1XDBcMTRcNjRcMVwwXDEwMlw2NFwxXDBcMTRcNjRcMVwwXDQ0XDY0IisKLSAgICAiXDFcMFw0XDY1XDExXDBcNjVcNjRcMlwwXDJcNjRcMlwwXDJcNjRcM1wwXDM0XDY0IisKLSAgICAiXDJcMFwxMFw2NFwyXDBcMlw2NFw2N1wwXDQ2XDY0XDJcMFwxXDY0XDdcMFw0Nlw2NCIrCi0gICAgIlwxMlwwXDIxXDY1XDFcMFwyN1w2NVwxXDBcM1w2NVwxXDBcMVw2NVwxXDBcMlw2NSIrCi0gICAgIlwxXDBcMVw2NVwxM1wwXDMzXDY0XDVcMFwzXDY0XDU2XDBcMzJcNjRcNVwwXDFcNjUiKwotICAgICJcMTJcNjRcMTBcNjVcMTVcMFwxMlw2NVw2XDBcMVw2NVwxMDdcNjRcMlwwXDVcNjRcMVwwIisKLSAgICAiXDE3XDY0XDFcMFw0XDY0XDFcMFwxXDY0XDE3XDY1XDJcNjRcMlw2NVwxXDBcNFw2NSIrCi0gICAgIlwyXDBcMTJcNjVcdTAyMDdcMFwzXDY1XDFcMFw2NVw2NFwyXDBcMVw2NVwxXDY0XDIwXDY1IisKLSAgICAiXDNcMFw0XDY1XDNcMFwxMlw2NFwyXDY1XDJcMFwxMlw2NVwyMVwwXDNcNjVcMVwwIisKLSAgICAiXDEwXDY0XDJcMFwyXDY0XDJcMFwyNlw2NFwxXDBcN1w2NFwxXDBcMVw2NFwzXDAiKwotICAgICJcNFw2NFwyXDBcMVw2NVwxXDBcN1w2NVwyXDBcMlw2NVwyXDBcM1w2NVwxMVwwIisKLSAgICAiXDFcNjVcNFwwXDJcNjRcMVwwXDNcNjRcMlw2NVwyXDBcMTJcNjVcMlw2NFwyMFwwIisKLSAgICAiXDFcNjVcMlwwXDZcNjRcNFwwXDJcNjRcMlwwXDI2XDY0XDFcMFw3XDY0XDFcMCIrCi0gICAgIlwyXDY0XDFcMFwyXDY0XDFcMFwyXDY0XDJcMFwxXDY1XDFcMFw1XDY1XDRcMCIrCi0gICAgIlwyXDY1XDJcMFwzXDY1XDEzXDBcNFw2NFwxXDBcMVw2NFw3XDBcMTJcNjVcMlw2NSIrCi0gICAgIlwzXDY0XDE0XDBcM1w2NVwxXDBcN1w2NFwxXDBcMVw2NFwxXDBcM1w2NFwxXDAiKwotICAgICJcMjZcNjRcMVwwXDdcNjRcMVwwXDJcNjRcMVwwXDVcNjRcMlwwXDFcNjVcMVw2NCIrCi0gICAgIlwxMFw2NVwxXDBcM1w2NVwxXDBcM1w2NVwyMlwwXDFcNjRcNVwwXDEyXDY1XDIxXDAiKwotICAgICJcM1w2NVwxXDBcMTBcNjRcMlwwXDJcNjRcMlwwXDI2XDY0XDFcMFw3XDY0XDFcMCIrCi0gICAgIlwyXDY0XDJcMFw0XDY0XDJcMFwxXDY1XDFcNjRcNlw2NVwzXDBcMlw2NVwyXDAiKwotICAgICJcM1w2NVwxMFwwXDJcNjVcNFwwXDJcNjRcMVwwXDNcNjRcNFwwXDEyXDY1XDIyXDAiKwotICAgICJcMlw2NVwxXDBcNlw2NFwzXDBcM1w2NFwxXDBcNFw2NFwzXDBcMlw2NFwxXDAiKwotICAgICJcMVw2NFwxXDBcMlw2NFwzXDBcMlw2NFwzXDBcM1w2NFwzXDBcMTBcNjRcMVwwIisKLSAgICAiXDNcNjRcNFwwXDVcNjVcM1wwXDNcNjVcMVwwXDRcNjVcMTFcMFwxXDY1XDE3XDAiKwotICAgICJcMTFcNjVcMjFcMFwzXDY1XDFcMFwxMFw2NFwxXDBcM1w2NFwxXDBcMjdcNjRcMVwwIisKLSAgICAiXDEyXDY0XDFcMFw1XDY0XDRcMFw3XDY1XDFcMFwzXDY1XDFcMFw0XDY1XDdcMCIrCi0gICAgIlwyXDY1XDExXDBcMlw2NFw0XDBcMTJcNjVcMjJcMFwyXDY1XDFcMFwxMFw2NFwxXDAiKwotICAgICJcM1w2NFwxXDBcMjdcNjRcMVwwXDEyXDY0XDFcMFw1XDY0XDRcMFw3XDY1XDFcMCIrCi0gICAgIlwzXDY1XDFcMFw0XDY1XDdcMFwyXDY1XDdcMFwxXDY0XDFcMFwyXDY0XDRcMCIrCi0gICAgIlwxMlw2NVwyMlwwXDJcNjVcMVwwXDEwXDY0XDFcMFwzXDY0XDFcMFwyN1w2NFwxXDAiKwotICAgICJcMjBcNjRcNFwwXDZcNjVcMlwwXDNcNjVcMVwwXDRcNjVcMTFcMFwxXDY1XDEwXDAiKwotICAgICJcMlw2NFw0XDBcMTJcNjVcMjIxXDBcNTZcNjRcMVwwXDFcNjRcMVw2NVwyXDY0XDdcNjUiKwotICAgICJcNVwwXDZcNjRcMVw2NVwxMFw2NVwxXDBcMTJcNjVcNDdcMFwyXDY0XDFcMFwxXDY0IisKLSAgICAiXDJcMFwyXDY0XDFcMFwxXDY0XDJcMFwxXDY0XDZcMFw0XDY0XDFcMFw3XDY0IisKLSAgICAiXDFcMFwzXDY0XDFcMFwxXDY0XDFcMFwxXDY0XDJcMFwyXDY0XDFcMFwyXDY0IisKLSAgICAiXDFcMFwxXDY0XDFcNjVcMlw2NFw2XDY1XDFcMFwyXDY1XDFcNjRcMlwwXDVcNjQiKwotICAgICJcMVwwXDFcNjVcMVwwXDZcNjVcMlwwXDEyXDY1XDc2XDBcMlw2NVw2XDBcMTJcNjUiKwotICAgICJcMTNcMFwxXDY1XDFcMFwxXDY1XDFcMFwxXDY1XDRcMFwyXDY1XDEwXDY0XDFcMCIrCi0gICAgIlw0MVw2NFw3XDBcMjRcNjVcMVwwXDZcNjVcNFwwXDZcNjVcMVwwXDFcNjVcMVwwIisKLSAgICAiXDI1XDY1XDNcMFw3XDY1XDFcMFwxXDY1XDM0NlwwXDQ2XDY0XDEyXDBcNDdcNjRcMTFcMCIrCi0gICAgIlwxXDY0XDFcMFwyXDY0XDFcMFwzXDY0XDFcMFwxXDY0XDFcMFwyXDY0XDFcMCIrCi0gICAgIlw1XDY0XDUxXDBcMVw2NFwxXDBcMVw2NFwxXDBcMVw2NFwxM1wwXDFcNjRcMVwwIisKLSAgICAiXDFcNjRcMVwwXDFcNjRcM1wwXDJcNjRcM1wwXDFcNjRcNVwwXDNcNjRcMVwwIisKLSAgICAiXDFcNjRcMVwwXDFcNjRcMVwwXDFcNjRcMVwwXDFcNjRcM1wwXDJcNjRcM1wwIisKLSAgICAiXDJcNjRcMVwwXDFcNjRcNTBcMFwxXDY0XDExXDBcMVw2NFwyXDBcMVw2NFwyXDAiKwotICAgICJcMlw2NFw3XDBcMlw2NFwxXDBcMVw2NFwxXDBcN1w2NFw1MFwwXDFcNjRcNFwwIisKLSAgICAiXDFcNjRcMTBcMFwxXDY0XHUwYzA2XDBcMjM0XDY0XDRcMFwxMzJcNjRcNlwwXDI2XDY0XDJcMCIrCi0gICAgIlw2XDY0XDJcMFw0Nlw2NFwyXDBcNlw2NFwyXDBcMTBcNjRcMVwwXDFcNjRcMVwwIisKLSAgICAiXDFcNjRcMVwwXDFcNjRcMVwwXDM3XDY0XDJcMFw2NVw2NFwxXDBcN1w2NFwxXDAiKwotICAgICJcMVw2NFwzXDBcM1w2NFwxXDBcN1w2NFwzXDBcNFw2NFwyXDBcNlw2NFw0XDAiKwotICAgICJcMTVcNjRcNVwwXDNcNjRcMVwwXDdcNjRcMzIzXDBcMTVcNjVcNFwwXDFcNjVcMTA0XDAiKwotICAgICJcMVw2NFwzXDBcMlw2NFwyXDBcMVw2NFwxMjFcMFwzXDY0XHUwZTgyXDBcMVw2NVwxXDAiKwotICAgICJcMVw2NFwzMVwwXDExXDY0XDZcNjVcMVwwXDVcNjVcMTNcMFwxMjRcNjRcNFwwXDJcNjUiKwotICAgICJcMlwwXDJcNjVcMlwwXDEzMlw2NFwxXDBcM1w2NVw2XDBcNTBcNjRcdTFjZDNcMFx1NTFhNlw2NCIrCi0gICAgIlx1MGM1YVwwXHUyYmE0XDY0XDEzNFwwXHUwODAwXDBcdTFmZmVcMFwyXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXlfcm93TWFwIFtdID0geyAKLSAgICAgICAgMCwgICAgNTUsICAgMTEwLCAgIDE2NSwgICAyMjAsICAgMjc1LCAgIDMzMCwgICAzODUsICAgNDQwLCAgIDQ5NSwgCi0gICAgICA1NTAsICAgNjA1LCAgIDY2MCwgICA3MTUsICAgNzcwLCAgIDgyNSwgICA4ODAsICAgOTM1LCAgIDk5MCwgIDEwNDUsIAotICAgICAxMTAwLCAgMTE1NSwgIDEyMTAsICAxMjY1LCAgMTMyMCwgIDEzNzUsICAxNDMwLCAgMTQ4NSwgIDE1NDAsICAxNTk1LCAKLSAgICAgMTY1MCwgIDE3MDUsICAxNzYwLCAgMTgxNSwgIDE4NzAsICAxOTI1LCAgMTk4MCwgIDE5MjUsICAxOTgwLCAgMjAzNSwgCi0gICAgIDE5MjUsICAxOTI1LCAgMTk4MCwgIDIwOTAsICAyMTQ1LCAgMjIwMCwgIDIyNTUsICAyMzEwLCAgMjM2NSwgIDI0MjAsIAotICAgICAyNDc1LCAgMTkyNSwgIDE5ODAsICAyNTMwLCAgMjU4NSwgIDI2NDAsICAxOTI1LCAgMjY5NSwgIDI2OTUsICAyNzUwLCAKLSAgICAgMjgwNSwgIDI4NjAsICAyNTMwLCAgMTkyNSwgIDI5MTUsICAyOTcwLCAgMTkyNSwgIDMwMjUsICAzMDgwLCAgMzEzNSwgCi0gICAgIDMxOTAsICAzMjQ1LCAgMzMwMCwgIDE5MjUsICAzMzU1LCAgMzQxMCwgIDM0NjUsICAzNTIwLCAgMTkyNSwgIDM1NzUsIAotICAgICAzNjMwLCAgMzY4NSwgIDM3NDAsICAzNzk1LCAgMTkyNSwgIDM4NTAsICAzOTA1LCAgMzk2MCwgIDQwMTUsICA0MDcwLCAKLSAgICAgNDEyNSwgIDQxODAsICA0MjM1LCAgNDIzNSwgIDQyOTAsICA0MzQ1LCAgNDQwMCwgIDQ0NTUsICA0NDU1LCAgNDUxMCwgCi0gICAgIDQ1NjUsICA0NjIwLCAgNDY3NSwgIDQ2NzUsICA0NzMwLCAgNDc4NSwgIDQ4NDAsICA0ODk1LCAgMTkyNSwgIDQ5NTAsIAotICAgICA0OTUwLCAgNTAwNSwgIDUwNjAsICA1MTE1LCAgNTE3MCwgIDE5MjUsICAxOTI1LCAgMTk4MCwgIDE5MjUsICAxOTI1LCAKLSAgICAgNTIyNSwgIDUyODAsICA1MzM1LCAgNTM5MCwgIDU0NDUsICA1NTAwLCAgNTU1NSwgIDU2MTAsICAxOTI1LCAgNTY2NSwgCi0gICAgIDU3MjAsICA1Nzc1LCAgMTkyNSwgIDE5MjUsICAyNjk1LCAgNTgzMCwgIDI4MDUsICAxOTI1LCAgNTg4NSwgIDI4NjAsIAotICAgICAyOTE1LCAgMzAyNSwgIDMwODAsICA1OTQwLCAgMzEzNSwgIDE5MjUsICA1OTk1LCAgMzE5MCwgIDE5MjUsICAzNTc1LCAKLSAgICAgNjA1MCwgIDM2ODUsICAxOTI1LCAgNjEwNSwgIDM3NDAsICA1MjI1LCAgNjE2MCwgIDYyMTUsICA2MjcwLCAgNDAxNSwgCi0gICAgIDE5MjUsICA2MzI1LCAgNjM4MCwgIDQyMzUsICA2NDM1LCAgNDI5MCwgIDE5MjUsICA2NDkwLCAgNjU0NSwgIDY2MDAsIAotICAgICA2NjAwLCAgNjY1NSwgIDY3MTAsICA0NDAwLCAgNDIzNSwgIDQ0NTUsICA2NzY1LCAgNDUxMCwgIDE5MjUsICA2ODIwLCAKLSAgICAgNDU2NSwgIDQ2MjAsICA0NDU1LCAgNDY3NSwgIDY4NzUsICA0NzMwLCAgMTkyNSwgIDY5MzAsICA2OTg1LCAgNzA0MCwgCi0gICAgIDcwNDAsICA3MDk1LCAgNzE1MCwgIDcyMDUsICA0OTUwLCAgNzI2MCwgIDUwMDUsICAxOTI1LCAgNzMxNSwgIDczNzAsIAotICAgICA3NDI1LCAgNzQyNSwgIDc0ODAsICA3NTM1LCAgNzU5MCwgIDc2NDUsICA3NzAwLCAgNzc1NSwgIDc4MTAsICAxOTI1LCAKLSAgICAgNzg2NSwgIDc5MjAsICAxOTI1LCAgMTkyNSwgIDE5MjUsICAyMjU1LCAgNzk3NSwgIDgwMzAsICA4MDg1LCAgODE0MCwgCi0gICAgIDgxOTUsICA4MjUwLCAgODMwNSwgIDY0OTAsICA4MzYwLCAgODM2MCwgIDY5MzAsICA4NDE1LCAgODQxNSwgIDg0NzAsIAotICAgICA3MzE1LCAgODUyNSwgIDg1MjUsICA4NTgwLCAgMTkyNSwgIDg2MzUsICA4NjkwLCAgMTkyNSwgIDg3NDUsICA4ODAwLCAKLSAgICAgODg1NSwgIDg5MTAsICA4OTY1LCAgOTAyMCwgIDkwNzUsICA5MTMwLCAgNjY1NSwgIDcwOTUsICA5MTg1LCAgNzQ4MCwgCi0gICAgIDkyNDAsICA5Mjk1LCAgOTM1MCwgIDk0MDUsICA5NDYwLCAgOTUxNSwgIDk1NzAsICA5NjI1LCAgOTY4MCwgIDk3MzUsIAotICAgICA5NzkwLCAgOTg0NSwgIDk5MDAsICA5OTU1LCAxMDAxMCwgMTAwNjUsIDEwMTIwLCAgMTkyNSwgIDE5MjUsIDEwMTc1LCAKLSAgICAxMDIzMCwgMTAyODUsIDEwMzQwLCAxMDM5NSwgIDE5MjUsICAxOTI1LCAgMTkyNSwgMTA0NTAsIDEwNTA1LCAxMDU2MCwgCi0gICAgMTA2MTUsIDEwNjcwLCAxMDcyNSwgIDE5MjUsIDEwNzgwLCAgNDg0MCwgIDUxMTUsIDEwODM1LCAxMDg5MCwgMTA5NDUsIAotICAgIDExMDAwLCAgMjI1NQotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDFcNDBcMVw0MVwxMFw0MFwxXDQyXDRcNDBcMVw0M1w0N1w0MFwxXDQ0IisKLSAgICAiXDFcNDVcNjVcNDRcMVw0NlwxXDQ3XDE2XDQ2XDFcNTBcMVw0NlwxXDUxIisKLSAgICAiXDQ0XDQ2XDFcNTJcMVw1M1w2NVw1MlwxXDQ2XDFcNDdcNVw0NlwxXDU0IisKLSAgICAiXDEyXDQ2XDFcNTFcNDVcNDZcMVw0N1wyXDQ2XDFcNTVcMVw1NlwyXDQ2IisKLSAgICAiXDFcNTdcM1w0NlwxXDU2XDVcNDZcMVw1NlwxXDYwXDFcNjFcNFw1NyIrCi0gICAgIlwxXDQ2XDEwXDU3XDFcNjJcMlw1N1wxXDQ2XDdcNTdcMVw0NlwzXDU3IisKLSAgICAiXDFcNDZcM1w1N1wxXDQ2XDFcNTdcMVw0NlwxXDQ3XDJcNDZcMVw1NSIrCi0gICAgIlwxXDYzXDZcNDZcMVw2M1w1XDQ2XDFcNjNcNDRcNDZcMVw2NFwxXDY1IisKLSAgICAiXDJcNjRcMVw2NlwxNVw2NFwxXDUxXDQ0XDY0XDFcNDZcMVw0N1wyXDQ2IisKLSAgICAiXDFcNjdcMVw1NlwyXDQ2XDFcNzBcM1w0NlwxXDU2XDVcNDZcMVw1NiIrCi0gICAgIlw2XDcwXDFcNDZcMTNcNzBcMVw0Nlw3XDcwXDFcNDZcM1w3MFwxXDQ2IisKLSAgICAiXDNcNzBcMVw0NlwxXDcwXDFcNDZcMVw0N1wyXDQ2XDFcNjdcMVw1NiIrCi0gICAgIlwyXDQ2XDFcNzBcM1w0NlwxXDU2XDVcNDZcMVw1Nlw2XDcwXDFcNDYiKwotICAgICJcMTNcNzBcMVw3MVw3XDcwXDFcNDZcM1w3MFwxXDQ2XDNcNzBcMVw0NiIrCi0gICAgIlwxXDcwXDFcNzJcMVw0N1wxXDQ2XDFcNzNcMVw3NFwxXDU2XDNcNzIiKwotICAgICJcMVw3NVwxXDcyXDFcNzZcMVw1Nlw1XDcyXDFcNTZcNDRcNzJcMVw0NiIrCi0gICAgIlwxXDQ3XDJcNDZcMVw3N1wxNVw0NlwxXDUxXDQ1XDQ2XDFcNDdcMVwxMDAiKwotICAgICJcMVwxMDFcMVw0NlwxXDU2XDJcNDZcMVwxMDJcM1w0NlwxXDU2XDVcNDYiKwotICAgICJcMVw1Nlw2XDEwMlwxXDQ2XDEzXDEwMlwxXDQ2XDdcMTAyXDFcNDZcM1wxMDIiKwotICAgICJcMVw0NlwzXDEwMlwxXDQ2XDFcMTAyXDFcNDZcMVw0N1wxXDEwMFwxXDEwMSIrCi0gICAgIlwxXDQ2XDFcNTZcMlw0NlwxXDEwMlwzXDQ2XDFcNTZcNVw0NlwxXDU2IisKLSAgICAiXDZcMTAyXDFcNDZcMTNcMTAyXDFcMTAzXDdcMTAyXDFcNDZcM1wxMDJcMVw0NiIrCi0gICAgIlwzXDEwMlwxXDQ2XDFcMTAyXDFcMTA0XDFcNDdcMVwxMDBcMVwxMDVcMVwxMDQiKwotICAgICJcMVw1NlwzXDEwNFwxXDEwNlwxXDEwNFwxXDEwN1wxXDU2XDVcMTA0XDFcNTYiKwotICAgICJcNDRcMTA0XDFcNDZcMVw0N1wzXDQ2XDFcNTZcNlw0NlwxXDU2XDVcNDYiKwotICAgICJcMVw1Nlw0NFw0NlwxXDExMFwxXDExMVwxXDExMlwxXDExM1w0XDExMFwxXDExNCIrCi0gICAgIlwxMlwxMTBcNlwxMTVcMVwxMTBcMTNcMTE1XDFcMTEwXDdcMTE1XDFcMTEwXDNcMTE1IisKLSAgICAiXDFcMTEwXDNcMTE1XDFcMTEwXDFcMTE1XDFcNDZcMVwxMTFcMVwxMTJcMVwxMTMiKwotICAgICJcMVw0NlwxXDU2XDJcNDZcMVwxMTZcM1w0NlwxXDU2XDVcNDZcMVw1NiIrCi0gICAgIlw2XDExNlwxXDQ2XDEzXDExNlwxXDQ2XDdcMTE2XDFcNDZcM1wxMTZcMVw0NiIrCi0gICAgIlwzXDExNlwxXDQ2XDFcMTE2XDFcNDZcMVwxMTFcMVwxMTJcMVwxMTNcMVw0NiIrCi0gICAgIlwxXDU2XDJcNDZcMVwxMTZcM1w0NlwxXDU2XDVcNDZcMVw1Nlw2XDExNiIrCi0gICAgIlwxXDQ2XDEzXDExNlwxXDExN1w3XDExNlwxXDQ2XDNcMTE2XDFcNDZcM1wxMTYiKwotICAgICJcMVw0NlwxXDExNlwxXDEyMFwxXDExMVwxXDExMlwxXDEyMVwxXDEyMFwxXDU2IisKLSAgICAiXDNcMTIwXDFcMTIyXDFcMTIwXDFcMTIzXDFcNTZcNVwxMjBcMVw1Nlw0NFwxMjAiKwotICAgICJcMVw0NlwxXDEyNFwxXDEyNVwyXDQ2XDFcNTZcNlw0NlwxXDU2XDVcNDYiKwotICAgICJcMVw1NlwxMFw0NlwxXDEyNlwxXDEyN1wyXDQ2XDFcMTMwXDEwXDQ2XDFcMTMwIisKLSAgICAiXDFcNDZcMVwxMjdcMVwxMjZcMTRcNDZcMVw0N1wxXDEyNVwyXDQ2XDFcNTYiKwotICAgICJcNlw0NlwxXDU2XDVcNDZcMVw1Nlw2XDQ2XDFcMTMxXDM2XDQ2XDFcNDciKwotICAgICJcMVwxMjVcMlw0NlwxXDU2XDJcNDZcMVwxMzJcM1w0NlwxXDU2XDVcNDYiKwotICAgICJcMVw1Nlw2XDEzMlwxXDEzMVwxM1wxMzJcMVw0Nlw3XDEzMlwxXDQ2XDNcMTMyIisKLSAgICAiXDFcNDZcM1wxMzJcMVw0NlwxXDEzMlwxXDQ2XDFcNDdcMVwxMjVcMlw0NiIrCi0gICAgIlwxXDU2XDZcNDZcMVw1Nlw1XDQ2XDFcNTZcNlw0NlwxXDEzMVw3XDQ2IisKLSAgICAiXDFcMTMzXDVcNDZcMVwxMzRcNlw0NlwxXDEzM1wxMFw0NlwxXDEzNVwxXDQ3IisKLSAgICAiXDFcMTI1XDFcMTM2XDFcMTM1XDFcNTZcM1wxMzVcMVwxMzdcMVwxMzVcMVwxNDAiKwotICAgICJcMVw1Nlw1XDEzNVwxXDU2XDZcMTM1XDFcMTQxXDM1XDEzNVwxXDE0MlwxXDQ3IisKLSAgICAiXDFcMTI1XDFcMTQzXDFcMTQyXDFcNTZcM1wxNDJcMVwxNDRcMVwxNDJcMVwxNDUiKwotICAgICJcMVw1Nlw1XDE0MlwxXDU2XDZcMTQyXDFcMTQ2XDM1XDE0MlwxXDE0N1wxXDQ3IisKLSAgICAiXDFcMTI1XDFcMTUwXDFcMTQ3XDFcNTZcM1wxNDdcMVwxNTFcMVwxNDdcMVwxNTIiKwotICAgICJcMVw1Nlw1XDE0N1wxXDU2XDQ0XDE0N1wxXDE1M1wxXDE1NFwxXDE1NVw2NFwxNTMiKwotICAgICJcMVwxNTZcMVw0N1wxXDEyNVwxXDE1N1wxXDE1NlwxXDU2XDNcMTU2XDFcMTYwIisKLSAgICAiXDFcMTU2XDFcMTYxXDFcNTZcNVwxNTZcMVw1Nlw0NFwxNTZcMVwxNjJcMVwxNjMiKwotICAgICJcMVwxNjRcNjRcMTYyXDFcMTY1XDFcMTY2XDY1XDE2NVwxXDQwXDFcMFwxMFw0MCIrCi0gICAgIlwxXDBcNFw0MFwxXDBcNDdcNDBcM1wwXDFcMTY3XDFcMTcwXDE0XDAiKwotICAgICJcMVwxNzFcNTJcMFwxXDE3MlwyXDBcMVwxNzNcM1wwXDFcMTcyXDVcMCIrCi0gICAgIlwxXDE3Mlw2XDE3M1wxXDBcMTNcMTczXDFcMFw3XDE3M1wxXDE3NFwzXDE3MyIrCi0gICAgIlwxXDBcM1wxNzNcMVwwXDFcMTczXDVcMFwxXDE3MlwyXDBcMVwxNzUiKwotICAgICJcM1wwXDFcMTcyXDVcMFwxXDE3Mlw2XDE3NVwxXDBcMTNcMTc1XDFcMCIrCi0gICAgIlw3XDE3NVwxXDBcM1wxNzVcMVwwXDNcMTc1XDFcMFwxXDE3NVwxMTBcMCIrCi0gICAgIlwxXDE3Nlw2NVwwXDFcMTc3XDU1XDBcMVwyMDBcNjFcMFwxXDIwMVw3MVwwIisKLSAgICAiXDFcNTZcNlwwXDFcNTZcNVwwXDFcNTZcNTJcMFwzXDU3XDRcMCIrCi0gICAgIlwxXDU3XDVcMFw2XDU3XDFcMFwxM1w1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcMlw1N1wyXDIwMlwyXDU3XDFcMFwxM1w1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcMlw1N1wxXDIwMlwxXDIwM1wyXDU3XDFcMFwxM1w1N1wxXDBcN1w1NyIrCi0gICAgIlwxXDBcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1NyIrCi0gICAgIlw1XDBcMlw1N1wyXDIwNFwyXDU3XDFcMFwxM1w1N1wxXDBcN1w1NyIrCi0gICAgIlwxXDBcM1w1N1wxXDBcNVw1N1w1XDBcMVw2M1w2XDBcMVw2MyIrCi0gICAgIlw1XDBcMVw2M1w0NlwwXDFcMjA1XDY2XDBcMVwyMDZcNzJcMFwzXDcwIisKLSAgICAiXDRcMFwxXDcwXDVcMFw2XDcwXDFcMFwxM1w3MFwxXDBcN1w3MCIrCi0gICAgIlwxXDBcM1w3MFwxXDBcNVw3MFwxXDcyXDJcMFwxXDIwN1wxXDcyIisKLSAgICAiXDFcMFwzXDcyXDFcMFwxXDcyXDJcMFw1XDcyXDFcMFw0NVw3MiIrCi0gICAgIlwxXDBcMVwyMDZcMVwyMDdcMVw3MlwxXDBcM1w3MlwxXDBcMVw3MiIrCi0gICAgIlwyXDBcNVw3MlwxXDBcNDRcNzJcMVw3NVwxXDBcMVwyMTBcMVwyMTEiKwotICAgICJcMVw3NVwxXDIxMFwzXDc1XDFcMjEyXDFcNzVcMlwyMTBcNVw3NVwxXDIxMCIrCi0gICAgIlw0NFw3NVwxXDc2XDFcMFwxXDIxM1wxXDIxNFwxXDc2XDFcMjEzXDNcNzYiKwotICAgICJcMVwyMTNcMVw3NlwxXDIxMlwxXDIxM1w1XDc2XDFcMjEzXDQ0XDc2XDJcMCIrCi0gICAgIlwxXDEwMFwxXDIxNVw3MVwwXDNcMTAyXDRcMFwxXDEwMlw1XDBcNlwxMDIiKwotICAgICJcMVwwXDEzXDEwMlwxXDBcN1wxMDJcMVwwXDNcMTAyXDFcMFw1XDEwMiIrCi0gICAgIlwxXDEwNFwyXDBcMVwyMTZcMVwxMDRcMVwwXDNcMTA0XDFcMFwxXDEwNCIrCi0gICAgIlwyXDBcNVwxMDRcMVwwXDQ1XDEwNFwxXDBcMVwxMDBcMVwyMTdcMVwxMDQiKwotICAgICJcMVwwXDNcMTA0XDFcMFwxXDEwNFwyXDBcNVwxMDRcMVwwXDQ0XDEwNCIrCi0gICAgIlwxXDEwNlwxXDBcMVwyMjBcMVwyMjFcMVwxMDZcMVwyMjBcM1wxMDZcMVwyMjIiKwotICAgICJcMVwxMDZcMlwyMjBcNVwxMDZcMVwyMjBcNDRcMTA2XDFcMTA3XDFcMFwxXDIyMyIrCi0gICAgIlwxXDIyNFwxXDEwN1wxXDIyM1wzXDEwN1wxXDIyM1wxXDEwN1wxXDIyMlwxXDIyMyIrCi0gICAgIlw1XDEwN1wxXDIyM1w0NFwxMDdcMVwxMTBcM1wwXDE3XDExMFw2XDBcMVwxMTAiKwotICAgICJcMTNcMFwxXDExMFw3XDBcMVwxMTBcM1wwXDFcMTEwXDNcMFwxXDExMCIrCi0gICAgIlw0XDBcMVwxNjdcMTVcMFwxXDE3MVw0N1wwXDFcMjI1XDY0XDBcMVwxMTAiKwotICAgICJcM1wwXDJcMTEwXDNcMTE0XDRcMTEwXDFcMTE0XDVcMTEwXDZcMTE1XDFcMTEwIisKLSAgICAiXDEzXDExNVwxXDExMFw3XDExNVwxXDExMFwzXDExNVwxXDExMFwzXDExNVwxXDExNCIrCi0gICAgIlwxXDExNVw2XDBcM1wxMTVcNFwwXDFcMTE1XDVcMFw2XDExNVwxXDAiKwotICAgICJcMTNcMTE1XDFcMFw3XDExNVwxXDBcM1wxMTVcMVwwXDVcMTE1XDZcMCIrCi0gICAgIlwzXDExNlw0XDBcMVwxMTZcNVwwXDZcMTE2XDFcMFwxM1wxMTZcMVwwIisKLSAgICAiXDdcMTE2XDFcMFwzXDExNlwxXDBcNVwxMTZcMVwxMjBcMlwwXDFcMjI2IisKLSAgICAiXDFcMTIwXDFcMFwzXDEyMFwxXDBcMVwxMjBcMlwwXDVcMTIwXDFcMCIrCi0gICAgIlw0NVwxMjBcMVwwXDFcMjI1XDFcMjI2XDFcMTIwXDFcMFwzXDEyMFwxXDAiKwotICAgICJcMVwxMjBcMlwwXDVcMTIwXDFcMFw0NFwxMjBcMVwxMjJcMVwwXDFcMjI3IisKLSAgICAiXDFcMjMwXDFcMTIyXDFcMjI3XDNcMTIyXDFcMjMxXDFcMTIyXDJcMjI3XDVcMTIyIisKLSAgICAiXDFcMjI3XDQ0XDEyMlwxXDEyM1wxXDBcMVwyMzJcMVwyMzNcMVwxMjNcMVwyMzIiKwotICAgICJcM1wxMjNcMVwyMzJcMVwxMjNcMVwyMzFcMVwyMzJcNVwxMjNcMVwyMzJcNDRcMTIzIisKLSAgICAiXDNcMFwxXDE2N1wxNVwwXDFcMjM0XDExMFwwXDFcMjM1XDYwXDBcMVwyMzYiKwotICAgICJcMTNcMFwxXDIzNlw0NFwwXDJcMjM3XDM2XDBcMjBcMjQwXDFcMjQxXDQ2XDI0MCIrCi0gICAgIlw2XDBcM1wxMzJcNFwwXDFcMTMyXDVcMFw2XDEzMlwxXDBcMTNcMTMyIisKLSAgICAiXDFcMFw3XDEzMlwxXDBcM1wxMzJcMVwwXDVcMTMyXDQ2XDBcMVwyNDIiKwotICAgICJcNVwwXDFcMjQyXDcyXDBcMVwyNDNcNlwwXDFcMTM1XDJcMFwxXDI0NCIrCi0gICAgIlwxXDEzNVwxXDBcM1wxMzVcMVwwXDFcMTM1XDJcMFw1XDEzNVwxXDAiKwotICAgICJcNDRcMTM1XDFcMTM3XDFcMFwxXDI0NVwxXDI0NlwxXDEzN1wxXDI0NVwzXDEzNyIrCi0gICAgIlwxXDI0N1wxXDEzN1wyXDI0NVw1XDEzN1wxXDI0NVw0NFwxMzdcMVwyNTBcMVwwIisKLSAgICAiXDFcMjUxXDFcMjUyXDFcMjUzXDFcMjUxXDNcMjUzXDFcMjUxXDFcMjUwXDFcMjU0IisKLSAgICAiXDFcMjU1XDNcMjUzXDFcMjUwXDFcMjUzXDFcMjU1XDZcMjUzXDFcMjUwXDMyXDI1MyIrCi0gICAgIlwyXDI1MFwxXDI1M1wxXDE0MVwyXDI0MFwxXDI1NlwxXDE0MVwxXDI0MFwzXDE0MSIrCi0gICAgIlwxXDI0MFwxXDE0MVwyXDI0MFwzXDE0MVwxXDI1N1wxXDE0MVwxXDI0MFw0NFwxNDEiKwotICAgICJcMVwxNDJcMlwwXDFcMjYwXDFcMTQyXDFcMFwzXDE0MlwxXDBcMVwxNDIiKwotICAgICJcMlwwXDVcMTQyXDFcMFw0NFwxNDJcMVwxNDRcMlwyNjFcMVwyNjJcMVwxNDQiKwotICAgICJcMVwyNjFcM1wxNDRcMVwyNjNcMVwxNDRcMlwyNjFcNVwxNDRcMVwyNjFcNDRcMTQ0IisKLSAgICAiXDFcMTQ1XDJcMjY0XDFcMjY1XDFcMTQ1XDFcMjY0XDNcMTQ1XDFcMjY0XDFcMTQ1IisKLSAgICAiXDFcMjYzXDFcMjY0XDVcMTQ1XDFcMjY0XDQ0XDE0NVwxXDE0NlwyXDI0MFwxXDI2NiIrCi0gICAgIlwxXDE0NlwxXDI0MFwzXDE0NlwxXDI0MFwxXDE0NlwyXDI0MFwzXDE0NlwxXDI2NyIrCi0gICAgIlwxXDE0NlwxXDI0MFw0NFwxNDZcMVwxNDdcMlwwXDFcMjcwXDFcMTQ3XDFcMCIrCi0gICAgIlwzXDE0N1wxXDBcMVwxNDdcMlwwXDVcMTQ3XDFcMFw0NFwxNDdcMVwxNTEiKwotICAgICJcMVwwXDFcMjcxXDFcMjcyXDFcMTUxXDFcMjcxXDNcMTUxXDFcMjczXDFcMTUxIisKLSAgICAiXDJcMjcxXDVcMTUxXDFcMjcxXDQ0XDE1MVwxXDI3NFwxXDBcMVwyNzVcMVwyNzYiKwotICAgICJcMVwyNzdcMVwyNzVcM1wyNzdcMVwyNzVcMVwyNzRcMVwzMDBcMVwzMDFcM1wyNzciKwotICAgICJcMVwyNzRcMVwyNzdcMVwzMDFcNlwyNzdcMVwyNzRcMzJcMjc3XDJcMjc0XDFcMjc3IisKLSAgICAiXDJcMTUzXDFcMFw2NlwxNTNcMVwwXDE2XDE1M1wxXDMwMlw0NVwxNTNcMVwxNTYiKwotICAgICJcMlwwXDFcMzAzXDFcMTU2XDFcMFwzXDE1NlwxXDBcMVwxNTZcMlwwIisKLSAgICAiXDVcMTU2XDFcMFw0NFwxNTZcMVwxNjBcMVwwXDFcMzA0XDFcMzA1XDFcMTYwIisKLSAgICAiXDFcMzA0XDNcMTYwXDFcMzA2XDFcMTYwXDJcMzA0XDVcMTYwXDFcMzA0XDQ0XDE2MCIrCi0gICAgIlwxXDMwN1wxXDBcMVwzMTBcMVwzMTFcMVwzMTJcMVwzMTBcM1wzMTJcMVwzMTAiKwotICAgICJcMVwzMDdcMVwzMTNcMVwzMTRcM1wzMTJcMVwzMDdcMVwzMTJcMVwzMTRcNlwzMTIiKwotICAgICJcMVwzMDdcMzJcMzEyXDJcMzA3XDFcMzEyXDJcMTYyXDFcMFw2NlwxNjJcMVwwIisKLSAgICAiXDE2XDE2MlwxXDMxNVw0NVwxNjJcN1wwXDFcMzE2XDIxXDBcMVwzMTdcNDJcMCIrCi0gICAgIlwxXDE3MlwyXDBcMVw0MFwzXDBcMVwxNzJcNVwwXDFcMTcyXDZcNDAiKwotICAgICJcMVwwXDEzXDQwXDFcMFw3XDQwXDFcMFwzXDQwXDFcMFwzXDQwIisKLSAgICAiXDFcMFwxXDQwXDFcMzIwXDFcMFwzXDMyMFwxXDMyMVwzXDE3M1wxXDMyMCIrCi0gICAgIlwxXDBcMVwzMjBcMVwzMjFcMVwxNzNcMVwzMjBcMVwwXDJcMzIwXDFcMzIxIisKLSAgICAiXDZcMTczXDFcMzIwXDEzXDE3M1wxXDMyMFw3XDE3M1wxXDMyMFwzXDE3M1wxXDMyMiIrCi0gICAgIlw1XDE3M1wxNVwwXDFcMzIzXDZcMFwxXDMyNFw0MlwwXDFcMzIwXDFcMCIrCi0gICAgIlwzXDMyMFwxXDMyMVwzXDE3NVwxXDMyMFwxXDBcMVwzMjBcMVwzMjFcMVwxNzUiKwotICAgICJcMVwzMjBcMVwwXDJcMzIwXDFcMzIxXDZcMTc1XDFcMzIwXDEzXDE3NVwxXDMyMCIrCi0gICAgIlw3XDE3NVwxXDMyMFwzXDE3NVwxXDMyNVw1XDE3NVwzMVwwXDFcMzE3XDM3XDAiKwotICAgICJcMVwzMjZcNjZcMFwxXDMyN1w3MlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDRcNTdcMlwzMzBcMVwwXDEzXDU3XDFcMFw3XDU3XDFcMFwzXDU3IisKLSAgICAiXDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMFw0XDU3IisKLSAgICAiXDFcMzMwXDFcMzMxXDFcMFwxM1w1N1wxXDBcN1w1N1wxXDBcM1w1NyIrCi0gICAgIlwxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDBcNlw1NyIrCi0gICAgIlwxXDBcMTNcNTdcMVwwXDFcNTdcMVwzMzJcNVw1N1wxXDBcM1w1NyIrCi0gICAgIlwxXDBcNVw1N1wxXDIxMFwxXDBcN1wyMTBcMVwyMTJcNTVcMjEwXDFcMjEzIisKLSAgICAiXDFcMFwxMVwyMTNcMVwyMTJcNTNcMjEzXDFcMjIwXDFcMFw3XDIyMFwxXDIyMiIrCi0gICAgIlw1NVwyMjBcMVwyMjNcMVwwXDExXDIyM1wxXDIyMlw1M1wyMjNcMVwyMjdcMVwwIisKLSAgICAiXDdcMjI3XDFcMjMxXDU1XDIyN1wxXDIzMlwxXDBcMTFcMjMyXDFcMjMxXDUzXDIzMiIrCi0gICAgIlwzMlwwXDFcMzMzXDMwXDBcMVwzMzNcNDBcMFwxXDMzNFwxM1wwXDFcMzM0IisKLSAgICAiXDU0XDBcMVwzMzVcMTBcMFwxXDMzNVw1N1wwXDFcMzM2XDE0XDBcMVwzMzYiKwotICAgICJcNzJcMFwxXDMzN1w0XDBcMVwyNDVcMVwwXDdcMjQ1XDFcMjQ3XDU1XDI0NSIrCi0gICAgIlwxXDI1MFwxXDBcMVwyNTFcMVwzNDBcMVwyNTBcMVwyNTFcM1wyNTBcMVwyNTEiKwotICAgICJcMVwyNTBcMVwyNDdcMVwyNTFcNVwyNTBcMVwyNTFcNDRcMjUwXDFcMjUxXDFcMCIrCi0gICAgIlwxMVwyNTFcMVwyNDdcNTNcMjUxXDFcMjUwXDFcMFwxXDI1MVwxXDM0MFwxXDI1MCIrCi0gICAgIlwxXDI1MVwzXDI1MFwxXDI1MVwxXDI1MFwxXDM0MVwxXDI1MVw1XDI1MFwxXDI1MSIrCi0gICAgIlw0NFwyNTBcMTNcMFwxXDM0Mlw1M1wwXDFcMjUxXDFcMFwxMVwyNTFcMVwzNDEiKwotICAgICJcNTNcMjUxXDExXDI2MVwxXDI2M1w1NVwyNjFcMTNcMjY0XDFcMjYzXDUzXDI2NFwxXDI3MSIrCi0gICAgIlwxXDBcN1wyNzFcMVwyNzNcNTVcMjcxXDFcMjc0XDFcMFwxXDI3NVwxXDM0MyIrCi0gICAgIlwxXDI3NFwxXDI3NVwzXDI3NFwxXDI3NVwxXDI3NFwxXDI3M1wxXDI3NVw1XDI3NCIrCi0gICAgIlwxXDI3NVw0NFwyNzRcMVwyNzVcMVwwXDExXDI3NVwxXDI3M1w1M1wyNzVcMVwyNzQiKwotICAgICJcMVwwXDFcMjc1XDFcMzQzXDFcMjc0XDFcMjc1XDNcMjc0XDFcMjc1XDFcMjc0IisKLSAgICAiXDFcMzQ0XDFcMjc1XDVcMjc0XDFcMjc1XDQ0XDI3NFwxM1wwXDFcMzQ1XDUzXDAiKwotICAgICJcMVwyNzVcMVwwXDExXDI3NVwxXDM0NFw1M1wyNzVcMlwxNTNcMVwwXDI2XDE1MyIrCi0gICAgIlwxXDM0NlwzNVwxNTNcMVwzMDRcMVwwXDdcMzA0XDFcMzA2XDU1XDMwNFwxXDMwNyIrCi0gICAgIlwxXDBcMVwzMTBcMVwzNDdcMVwzMDdcMVwzMTBcM1wzMDdcMVwzMTBcMVwzMDciKwotICAgICJcMVwzMDZcMVwzMTBcNVwzMDdcMVwzMTBcNDRcMzA3XDFcMzEwXDFcMFwxMVwzMTAiKwotICAgICJcMVwzMDZcNTNcMzEwXDFcMzA3XDFcMFwxXDMxMFwxXDM0N1wxXDMwN1wxXDMxMCIrCi0gICAgIlwzXDMwN1wxXDMxMFwxXDMwN1wxXDM1MFwxXDMxMFw1XDMwN1wxXDMxMFw0NFwzMDciKwotICAgICJcMTNcMFwxXDM1MVw1M1wwXDFcMzEwXDFcMFwxMVwzMTBcMVwzNTBcNTNcMzEwIisKLSAgICAiXDJcMTYyXDFcMFwyNlwxNjJcMVwzNTJcMzVcMTYyXDdcMFwxXDM1M1wxMTFcMCIrCi0gICAgIlwxXDM1NFwzNFwwXDFcMzIwXDFcMFwxMFwzMjBcMVwwXDRcMzIwXDFcMCIrCi0gICAgIlw0MVwzMjBcMVwwXDZcMzIwXDFcMFwzXDMyMFwxXDMyMVw0XDMyMFwxXDAiKwotICAgICJcMVwzMjBcMVwzMjFcMlwzMjBcMVwwXDJcMzIwXDFcMzIxXDM2XDMyMFwxXDM1NSIrCi0gICAgIlw1XDMyMFwxNVwwXDFcMzIzXDQzXDBcMVwzNTZcMjJcMFwxXDM1N1wxNFwwIisKLSAgICAiXDNcMzU3XDJcMFwxXDM1N1wxMFwwXDFcMzU3XDFcMFwyXDM1N1wzXDAiKwotICAgICJcMVwzNTdcMlwwXDJcMzU3XDExXDBcMVw1N1wxXDM2MFwxXDU3XDRcMCIrCi0gICAgIlwxXDU3XDVcMFw2XDU3XDFcMFwxM1w1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcNlw1N1wxXDBcMTFcNTdcMVwzNjFcMVw1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1wzNVwwXDFcMzYyXDEzXDBcMVwzNjJcNDRcMCIrCi0gICAgIlwyXDM2M1w2M1wwXDJcMzY0XDc1XDBcMVwzNjVcMTNcMFwxXDM2NVw0NFwwIisKLSAgICAiXDJcMzY2XDQxXDBcMlwzNjdcMVwwXDNcMzY3XDJcMFwxXDI1NFw0XDM2NyIrCi0gICAgIlwxXDBcMTBcMzY3XDFcMFwzMlwzNjdcMlwwXDFcMzY3XDNcMFwyXDM3MCIrCi0gICAgIlwxXDBcM1wzNzBcMlwwXDFcMzAwXDRcMzcwXDFcMFwxMFwzNzBcMVwwIisKLSAgICAiXDMyXDM3MFwyXDBcMVwzNzBcMlwxNTNcMVwwXDI3XDE1M1wxXDM3MVwzNFwxNTMiKwotICAgICJcM1wwXDJcMzcyXDFcMFwzXDM3MlwyXDBcMVwzMTNcNFwzNzJcMVwwIisKLSAgICAiXDEwXDM3MlwxXDBcMzJcMzcyXDJcMFwxXDM3MlwyXDE2MlwxXDBcMjdcMTYyIisKLSAgICAiXDFcMzczXDM0XDE2MlwzM1wwXDFcMzc0XDExNFwwXDFcMzU1XDIyXDBcMVwzNTciKwotICAgICJcMTRcMFwzXDM1N1wyXDBcMVwzNTdcMTBcMFwxXDM1N1wxXDBcMlwzNTciKwotICAgICJcM1wwXDFcMzU3XDFcMFwxXDM1NlwyXDM1N1wxMVwwXDNcNTdcNFwwIisKLSAgICAiXDFcNTdcNVwwXDZcNTdcMVwwXDdcNTdcMVwzNzVcM1w1N1wxXDAiKwotICAgICJcN1w1N1wxXDBcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDAiKwotICAgICJcMVw1N1w1XDBcNlw1N1wxXDBcNlw1N1wxXDM3Nlw0XDU3XDFcMCIrCi0gICAgIlw3XDU3XDFcMFwzXDU3XDFcMFw1XDU3XDQ2XDBcMVwzNzdcNVwwIisKLSAgICAiXDFcMzc3XDU0XDBcMVx1MDEwMFw2M1wwXDFcdTAxMDFcMTBcMFwxXHUwMTAxXDU1XDAiKwotICAgICJcMVx1MDEwMlwxMFwwXDFcdTAxMDJcNjBcMFwxXHUwMTAzXDI0XDBcMlwxNTNcMVwwIisKLSAgICAiXDMwXDE1M1wxXHUwMTA0XDMzXDE1M1wyXDE2MlwxXDBcMzBcMTYyXDFcdTAxMDVcMzNcMTYyIisKLSAgICAiXDM0XDBcMVx1MDEwNlw0MFwwXDNcNTdcNFwwXDFcNTdcNVwwXDZcNTciKwotICAgICJcMVwwXDEzXDU3XDFcMFwzXDU3XDFcdTAxMDdcM1w1N1wxXDBcM1w1NyIrCi0gICAgIlwxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDBcNlw1NyIrCi0gICAgIlwxXDBcM1w1N1wxXHUwMTA4XDdcNTdcMVwwXDNcNTdcMVx1MDEwOFwzXDU3IisKLSAgICAiXDFcMFwzXDU3XDFcMFw1XDU3XDQ3XDBcMVx1MDEwOVw2MFwwXDFcdTAxMGEiKwotICAgICJcMTRcMFwxXHUwMTBhXDU0XDBcMVx1MDEwYlw0N1wwXDJcdTAxMGNcNzJcMFwxXHUwMTBkIisKLSAgICAiXDMwXDBcMVx1MDEwZFwzXDBcMlwxNTNcMVwwXDMxXDE1M1wxXHUwMTBlXDMyXDE1MyIrCi0gICAgIlwyXDE2MlwxXDBcMzFcMTYyXDFcdTAxMGZcMzJcMTYyXDM1XDBcMVx1MDExMFwzN1wwIisKLSAgICAiXDNcNTdcNFwwXDFcNTdcNVwwXDZcNTdcMVwwXDEzXDU3XDFcMCIrCi0gICAgIlw2XDU3XDFcdTAxMTFcMVwwXDNcNTdcMVwwXDVcNTdcNVwwXDFcdTAxMTIiKwotICAgICJcM1w1N1wzXDBcMVx1MDExMlwxXDU3XDRcMFwxXHUwMTEyXDZcNTdcMVwwIisKLSAgICAiXDEzXDU3XDFcMFw3XDU3XDFcMFwzXDU3XDFcMFw1XDU3XDM3XDAiKwotICAgICJcMVx1MDExM1wxMFwwXDFcdTAxMTNcNTNcMFwxXHUwMTE0XDEzXDBcMVx1MDExNFw1MlwwIisKLSAgICAiXDFcdTAxMTVcMTNcMFwxXHUwMTE1XDE1XDBcMlwxNTNcMVwwXDMyXDE1M1wxXHUwMTE2IisKLSAgICAiXDMxXDE1M1wyXDE2MlwxXDBcMzJcMTYyXDFcdTAxMTdcMzFcMTYyXDM0XDBcMVx1MDExOCIrCi0gICAgIlw0MFwwXDNcNTdcNFwwXDFcNTdcNVwwXDVcNTdcMVx1MDExOVwxXDAiKwotICAgICJcMTNcNTdcMVwwXDdcNTdcMVwwXDNcNTdcMVwwXDVcNTdcNVwwIisKLSAgICAiXDFcdTAxMTJcNlwwXDFcdTAxMTJcNVwwXDFcdTAxMTJcNDRcMFwyXDE1M1wxXDAiKwotICAgICJcMzFcMTUzXDFcdTAxMWFcMzJcMTUzXDJcMTYyXDFcMFwzMVwxNjJcMVx1MDExYlwzMlwxNjIiKwotICAgICJcMzFcMFwxXHUwMTFjXDQzXDBcM1w1N1w0XDBcMVw1N1w1XDBcNlw1NyIrCi0gICAgIlwxXDBcNVw1N1wxXHUwMTFkXDVcNTdcMVwwXDdcNTdcMVwwXDNcNTciKwotICAgICJcMVwwXDVcNTdcMlwxNTNcMVwwXDI2XDE1M1wxXHUwMTFlXDM1XDE1M1wyXDE2MiIrCi0gICAgIlwxXDBcMjZcMTYyXDFcdTAxMWZcMzVcMTYyXDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFw2XDU3XDFcMFw3XDU3XDFcdTAxMjBcM1w1N1wxXDBcN1w1NyIrCi0gICAgIlwxXDBcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1NyIrCi0gICAgIlw1XDBcNlw1N1wxXDBcMTNcNTdcMVwwXDdcNTdcMVwwXDNcNTciKwotICAgICJcMVwwXDRcNTdcMVx1MDEyMVw2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcNlw1N1wxXDBcNVw1N1wxXHUwMTIyXDVcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDZcNTdcMVwwXDVcNTdcMVx1MDEyM1w1XDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw2XDU3XDFcMFwxM1w1N1wxXDBcM1w1N1wxXHUwMTI0XDNcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTciOwotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5dHJhbnMgW10gPSB5eV91bnBhY2soeXlfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgLy8gZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCS8vJE5PTi1OTFMtMSQKLSAgfTsKLQotICAvKioKLSAgICogWVlfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBZWV9BVFRSSUJVVEVbXSA9IHsKLSAgICAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgMSwgIDksICAxLCAgMSwgIDksICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDksICA5LCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsIAotICAgICA5LCAgMSwgIDEsICAxLCAgOSwgIDksICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDksICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAwLCAgMSwgIDAsIAotICAgICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgIDAsICAwLCAgMSwgCi0gICAgIDEsICA5LCAgMCwgIDAsICA5LCAgOSwgIDksICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICAxLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgOSwgIDAsICAxLCAgOSwgIDAsICAxLCAKLSAgICAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDAsICAwLCAgOSwgIDksICAxLCAgMSwgIDAsIAotICAgICAxLCAgMSwgIDksICA5LCAgOSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMQotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIC8vIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgLy8gcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JcHJpdmF0ZSBpbnQgZlRva2VuQ291bnQgPSAwOwotIAotCS8vIHJlcXVpcmVkIGhvbGRlcnMgZm9yIHdoaXRlLXNwYWNlIGNvbXBhY3RpbmcKLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0ID0gMTsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGggPSAwOwotCXByaXZhdGUgU3RyaW5nIGZfY29udGV4dCA9IG51bGw7Ci0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQotCXByaXZhdGUgU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IHN0YXJ0ID0gMDsKLQlwcml2YXRlIGludCB0ZXh0TGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JLy8gb2Zmc2V0IGZvciB0cmFja2luZyBwb3NpdGlvbiBzcGVjaWZpYyBibG9jayB0YWdzCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCA9IDA7Ci0JCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGJlaW5nIG9wZW5lZAotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0KLQkvLyB0aGUgbGlzdCBvZiB0YWcgbmFtZSBCbG9ja01hcmtlcnMKLQlwcml2YXRlIExpc3QgZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIHJlcXVpcmVkIHRvIG5vdCBzZWVrIHRleHQgYmxvY2tzIG9uIGFuIGVuZCB0YWcKLQlwcml2YXRlIGJvb2xlYW4gZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IHRydWU7Ci0KLQlwcml2YXRlIFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBuZXcgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSgpOwotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JaWYoY29udGFpbnNUYWdOYW1lKG1hcmtlci5nZXRUYWdOYW1lKCkpKQotCQlyZXR1cm47Ci0JZkJsb2NrTWFya2Vycy5hZGQobWFya2VyKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCWZCbG9ja01hcmtlcnMucmVtb3ZlKG1hcmtlcik7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICovCi1wdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnbmFtZSkgewotCWlmIChmQmxvY2tNYXJrZXJzICE9IG51bGwpIHsKLQkJSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoYmxvY2tzLmhhc05leHQoKSkgewotCQkJaWYgKCgoQmxvY2tNYXJrZXIpIGJsb2Nrcy5uZXh0KCkpLmdldFRhZ05hbWUoKS5lcXVhbHModGFnbmFtZSkpCi0JCQkJYmxvY2tzLnJlbW92ZSgpOwotCQl9Ci0JfQotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKCkgewotCXJldHVybiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmc7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBuZXdWYWx1ZTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KGZDdXJyZW50VGFnTmFtZSk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoU3RyaW5nIG5hbWUpIHsKLQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gbWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7Ci0JCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7Ci0JfQotCXJldHVybiB0cnVlOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCkgewotCXJldHVybiBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dChTdHJpbmcgbmFtZSkgewotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXJldHVybiBtYXJrZXIuZ2V0Q29udGV4dCgpOwotCX0KLQlyZXR1cm4gQkxPQ0tfVEVYVDsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgTGlzdCBnZXRCbG9ja01hcmtlcnMoKSB7Ci0JcmV0dXJuIGZCbG9ja01hcmtlcnM7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7Ci0JcmV0dXJuIGZPZmZzZXQgKyB5eWNoYXI7Ci19Ci1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcigpIHsKLQlyZXR1cm4gaXNCbG9ja01hcmtlcihmQ3VycmVudFRhZ05hbWUpOwotfQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpIHsKLQlpZiAoIWZJc0Jsb2NraW5nRW5hYmxlZCkKLQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiBjb250YWluc1RhZ05hbWUodGFnTmFtZSk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tUYWdTY2FuKFN0cmluZyBuZXdUYWdOYW1lKSB7Ci0JYmVnaW5CbG9ja01hcmtlclNjYW4obmV3VGFnTmFtZSwgQkxPQ0tfVEVYVCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kCi0gKgotICogU3BlY2lhbCB0b2tlbml6ZXIgc2V0dXAuICBBbGxvd3MgdG9rZW5pemF0aW9uIHRvIGJlIGluaXRpYXRlZCBhdCB0aGUKLSAqIHN0YXJ0IG9mIGEgdGV4dCBibG9jayB3aXRoaW4gYSAibmV3VGFnTmFtZSIgdGFnLgotICoKLSAqIEV4YW1wbGU6IAotICoJVG9rZW5pemVyIHRva2VyID0gbmV3IFRva2VuaXplcigpOwotICoJdG9rZXIuc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGZhbHNlKTsKLSAqCXRva2VyLnJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcigiYWZpdWhxd2tlamh0YXNpaGdhbGt3aHRxPC9zY3JpcHRlcj48L3Njcj48L3NjcmlwdD5hc2dkYXNnYSIpKTsKLSAqCXRva2VyLmJlZ2luQmxvY2tNYXJrZXJTY2FuKCJzY3JpcHQiLCBCTE9DS19URVhUKTsKLSAqCXRva2VyLmdldFJlZ2lvbnMoKTsgCi0gKgotICogUmV0dXJuczoKLSAqCUJMT0NLX1RFWFQ6IDAtNDAKLSAqCVhNTF9FTkRfVEFHX09QRU46IDQxLTQyCi0gKglYTUxfVEFHX05BTUU6IDQzLTQ4Ci0gKglYTUxfVEFHX0NMT1NFOiA0OS00OQotICoJWE1MX0NPTlRFTlQ6IDUwLTU3Ci0gKgotICovCi1wdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrTWFya2VyU2NhbihTdHJpbmcgbmV3VGFnTmFtZSwgU3RyaW5nIGJsb2NrY29udGV4dCkgewotCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCWZDdXJyZW50VGFnTmFtZSA9IG5ld1RhZ05hbWU7Ci19Ci0vKioKLSAqIE1ldGhvZCBkb1NjYW4uCi0gKiAKLSAqIFJldHVybnMgYSBjb250ZXh0IHJlZ2lvbiBmb3IgYWxsIG9mIHRoZSB0ZXh0IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gdXB0byB0aGUgZW5kIG9mIGlucHV0IG9yCi0gKiB0byByaWdodCAqYmVmb3JlKiB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIHNlYXJjaFN0cmluZwotICogCi0gKiBAcGFyYW0gc2VhcmNoU3RyaW5nIC0gdGFyZ2V0IHN0cmluZyB0byBzZWFyY2ggZm9yIGV4LjogIi0tPiIsICI8L3RhZ25hbWUiCi0gKiBAcGFyYW0gcmVxdWlyZVRhaWxTZXBhcmF0b3IgLSB3aGV0aGVyIHRoZSB0YXJnZXQgbXVzdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIG9yICc+JwotICogQHBhcmFtIGNvbnRleHQgLSB0aGUgY29udGV4dCBvZiB0aGUgc2Nhbm5lZCByZWdpb24gaWYgbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gZXhpdFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSByZWdpb24gd2FzIG9mIG5vbi16ZXJvIGxlbmd0aAotICogQHBhcmFtIGFib3J0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHNlYXJjaFN0cmluZyB3YXMgZm91bmQgaW1tZWRpYXRlbHkKLSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGNvbnRleHQgZm91bmQ6IHRoZSBkZXNpcmVkIGNvbnRleHQgb24gYSBub24temVybyBsZW5ndGggbWF0Y2gsIHRoZSBhYm9ydENvbnRleHQgb24gaW1tZWRpYXRlIHN1Y2Nlc3MKLSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9TY2FuKFN0cmluZyBzZWFyY2hTdHJpbmcsIGJvb2xlYW4gcmVxdWlyZVRhaWxTZXBhcmF0b3IsIFN0cmluZyBzZWFyY2hDb250ZXh0LCBpbnQgZXhpdFN0YXRlLCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlib29sZWFuIHN0aWxsU2VhcmNoaW5nID0gdHJ1ZTsKLQkvLyBEaXNhYmxlIGZ1cnRoZXIgYmxvY2sgKHByb2JhYmx5KQotCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCWludCBzZWFyY2hTdHJpbmdMZW5ndGggPSBzZWFyY2hTdHJpbmcubGVuZ3RoKCk7Ci0JaW50IG4gPSAwOwotCWNoYXIgbGFzdENoZWNrQ2hhcjsKLQlpbnQgaTsKLQlib29sZWFuIHNhbWUgPSBmYWxzZTsKLQl3aGlsZSAoc3RpbGxTZWFyY2hpbmcpIHsKLQkJbiA9IDA7Ci0JCS8vIEVuc3VyZSB0aGF0IGVub3VnaCBkYXRhIGZyb20gdGhlIGlucHV0IGV4aXN0cyB0byBjb21wYXJlIGFnYWluc3QgdGhlIHNlYXJjaCBTdHJpbmcuCi0JCW4gPSB5eV9hZHZhbmNlKCk7Ci0JCXdoaWxlKG4gIT0gWVlFT0YgJiYgeXlfY3VycmVudFBvcyA8IHNlYXJjaFN0cmluZ0xlbmd0aCkKLQkJCW4gPSB5eV9hZHZhbmNlKCk7Ci0JCS8vIElmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0IG9yIHdlJ3ZlIGV4aGF1c3RlZCB0aGUgaW5wdXQsIHN0b3AgaW1tZWRpYXRlbHkuCi0JCWlmIChuID09IFlZRU9GKSB7Ci0JCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJc2FtZSA9IHRydWU7Ci0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPCUlPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZAotCQkJLy8gdGh1cyBmb3VuZCB0d2ljZSBhdCBjdXJyZW50LXRhcmdldExlbmd0aCBbc2luY2UgdGhlIGZpcnN0IHNjYW4gd291bGQgaGF2ZSBjb21lIG91dCB0aGlzIGZhciBhbnl3YXldLgotCQkJLy8gQ2hlY2sgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHRhcmdldCB2ZXJzdXMgdGhlIGxhc3QgdGFyZ2V0TGVuZ3RoIGNoYXJhY3RlcnMgcmVhZCBmcm9tIHRoZSBidWZmZXIKLQkJCS8vIGFuZCBzZWUgaWYgaXQgbWF0Y2hlcwotCQkJCi0JCQkvLyBzYWZldHkgY2hlY2sgZm9yIGFycmF5IGFjY2Vzc2VzICh5eV9jdXJyZW50UG9zIGlzIHRoZSAqbGFzdCogY2hhcmFjdGVyIHdlIGNhbiBjaGVjayBhZ2FpbnN0KQotCQkJaWYoeXlfY3VycmVudFBvcyA+PSBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyA8PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkJZm9yKGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5nTGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYoc2FtZSAmJiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpCi0JCQkJCQlzYW1lID0geXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSA9PSBzZWFyY2hTdHJpbmcuY2hhckF0KGkpOwotCQkJCQllbHNlIGlmKHNhbWUgJiYgIWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCXNhbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoeXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaFN0cmluZy5jaGFyQXQoaSkpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHNhZmV0eSBjaGVjayBmYWlsZWQ7IG5vIG1hdGNoIGlzIHBvc3NpYmxlIHJpZ2h0IG5vdwotCQkJZWxzZSB7Ci0JCQkJc2FtZSA9IGZhbHNlOwotCQkJfQotCQkJaWYgKHNhbWUgJiYgcmVxdWlyZVRhaWxTZXBhcmF0b3IgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQkvLyBBZGRpdGlvbmFsIGNoZWNrIGZvciBjbG9zZSB0YWdzIHRvIGVuc3VyZSB0aGF0IHRhcmdldFN0cmluZz0iPC9zY3JpcHQiIGRvZXNuJ3QgbWF0Y2gKLQkJCQkvLyAiPC9zY3JpcHRTIgotCQkJCWxhc3RDaGVja0NoYXIgPSB5eV9idWZmZXJbeXlfY3VycmVudFBvc107Ci0JCQkJLy8gU3VjY2VlZCBvbiAiPC9zY3JpcHQ+IiBhbmQgIjwvc2NyaXB0ICIKLQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQotCQkJCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RpbGxTZWFyY2hpbmcgPSAhc2FtZSB8fCAoeXlfY3VycmVudFBvcyA8IHl5X3N0YXJ0UmVhZCArIHNlYXJjaFN0cmluZ0xlbmd0aCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKG4gIT0gWVlFT0YgfHwgc2FtZSkgewotCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoCi0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlCi0JCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JCWlmICh5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotCQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJLy8gV2UgcmFuIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGlucHV0Ci0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7Ci0JCXl5X2N1cnJlbnRQb3MrKzsKLQl9Ci0JeXliZWdpbihleGl0U3RhdGUpOwotCS8vIElmIHRoZSBlbmRpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQotCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpCi0JCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7Ci0JcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kCi0gKgotICogQSBnZW5lcmljIGxvb2thaGVhZC1saWtlIG9wZXJhdGlvbgotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb0Jsb2NrU2NhbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgdGFyZ2V0Q29udGV4dCwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmV0dXJuIGRvU2Nhbih0YXJnZXQsIGZhbHNlLCB0YXJnZXRDb250ZXh0LCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlLCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKiBkb2VzIGEgbG9va2FoZWFkIGZvciB0aGUgY3VycmVudCB0YWcgbmFtZQotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb0Jsb2NrVGFnU2NhbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCk7Ci0JcmV0dXJuIGRvU2NhbigiPC8iICsgZkN1cnJlbnRUYWdOYW1lLCB0cnVlLCBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKSwgWVlJTklUSUFMLCBZWUlOSVRJQUwpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZAotICoKLSAqIENvbnZlcnRzIHRoZSByYXcgY29udGV4dCBTdHJpbmcgcmV0dXJuZWQgYnkgdGhlIHByaW1HZXROZXh0VG9rZW4oKQotICogbWV0aG9kIGludG8gYSBmdWxsIElUZXh0UmVnaW9uIGJ5IHB1bGxpbmcgaW4gdmFsdWVzIGZvciB0aGUKLSAqIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiB0aGUgc2Nhbm5pbmcgdGV4dC4KLSAqCi0gKiBSZXR1cm5zIG51bGwgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgYW5kIGF0dGFjaGVzIGludGVybWl0dGVudGx5Ci0gKiBkaXNjb3ZlcmVkIHdoaXRlc3BhY2Ugb250byB0aGUgZW5kIG9mIHVzZWZ1bCByZWdpb25zLgotICoKLSAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjYWNoZXMgdGhlIHRva2VuIGZvbGxvd2luZyB0aGUgb25lIGJlaW5nIHJldHVybmVkCi0gKiBzbyB0aGF0IHdoaXRlc3BhY2UgY2FuIGJlIGNvbGxhcHNlZC4KLSAqLwotcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8gbG9hZCB0aGUgc3RhcnRpbmcgbm9uLXdoaXRlc3BhY2UgdG9rZW4gKGFzc3VtZSB0aGF0IGl0IGlzIHNvKQotCWlmIChmU2hvdWxkTG9hZEJ1ZmZlcmVkKSB7Ci0JCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0OwotCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0OwotCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOwotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JfQotCWVsc2UgewotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlpZiAoY29udGV4dCA9PSBYTUxfVEFHX05BTUUpIHsKLQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCQllbHNlCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IFhNTF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JCXN0YXJ0ID0geXljaGFyOwotCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJaWYgKHl5X2F0RU9GKSB7Ci0JCQlmVG9rZW5Db3VudCsrOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JLy8gc3RvcmUgdGhlIG5leHQgdG9rZW4KLQlmX2NvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX05BTUUpIHsKLQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOwotCQllbHNlCi0JCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCX0KLQllbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7Ci0JfQotCWVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCX0KLQlmQnVmZmVyZWRDb250ZXh0ID0gZl9jb250ZXh0OwotCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7Ci0JaWYgKGZCdWZmZXJlZENvbnRleHQgPT0gV0hJVEVfU1BBQ0UpIHsKLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQlsZW5ndGggKz0gZkJ1ZmZlcmVkTGVuZ3RoOwotCX0KLQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCS8vIEVPRgotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGlzY292ZXJlZCAiICsgZlRva2VuQ291bnQgKyAiIHRva2Vucy4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JZlRva2VuQ291bnQrKzsKLQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgZkN1cnJlbnRUYWdOYW1lKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgWE1MVG9rZW5pemVyKCl7Ci0Jc3VwZXIoKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgWE1MVG9rZW5pemVyKGNoYXJbXSBjaGFyQXJyYXkpewotCQl0aGlzKG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSkgewotCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSwgaW50IG5ld09mZnNldCkgewotCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgbmV3T2Zmc2V0KTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0JcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCAwKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCBuZXdPZmZzZXQpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluKSB7Ci0JcmVzZXQoaW4sIDApOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAqCi0gKgotICogUmVzZXQgaW50ZXJuYWwgY291bnRlcnMgYW5kIHZhcnMgdG8gIm5ld2x5IGNyZWF0ZWQiIHZhbHVlcywgaW4gdGhlIGhvcGVzCi0gKiB0aGF0IHJlc2V0dGluZyBhIHByZS1leGlzdGluZyB0b2tlbml6ZXIgaXMgZmFzdGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgb25lLgotICoKLSAqIFRoaXMgbWV0aG9kIGNvbnRhaW5zIGNvZGUgYmxvY2tzIHRoYXQgd2VyZSBlc3NlbnRpYWxseSBkdXBsaWNhdGVkIGZyb20gdGhlCi0gKiA8ZW0+Z2VuZXJhdGVkPC9lbT4gb3V0cHV0IG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBiZWZvcmUgdGhpcyBtZXRob2Qgd2FzCi0gKiBhZGRlZC4gIFRob3NlIGNvZGUgYmxvY2tzIHdlcmUgdW5kZXIgdGhlIGFib3ZlIGNvcHlyaWdodC4KLSAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpIHsKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXNldHRpbmcgdG9rZW5pemVyIik7Ly8kTk9OLU5MUy0xJAotCX0KLQlmT2Zmc2V0ID0gbmV3T2Zmc2V0OwotCi0JLyogdGhlIGlucHV0IGRldmljZSAqLwotCXl5X3JlYWRlciA9IGluOwotCi0JLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCXl5X3N0YXRlID0gMDsKLQotCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0JLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0JLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQl5eV9tYXJrZWRQb3MgPSAwOwotCi0JLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQl5eV9jdXJyZW50UG9zID0gMDsKLQotCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLQkvKiogCi0JICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JICogZnJvbSBpbnB1dCAKLQkgKi8KLQl5eV9lbmRSZWFkID0gMDsKLQotCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXl5bGluZSA9IDA7Ci0KLQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQl5eWNoYXIgPSAwOwotCi0JLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotCXl5X2F0RU9GID0gZmFsc2U7Ci0KLQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLQkvKiB1c2VyIHZhcnM6ICovCi0JZlRva2VuQ291bnQgPSAwOwotIAotCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQlmQnVmZmVyZWRTdGFydCA9IDE7Ci0JZkJ1ZmZlcmVkTGVuZ3RoID0gMDsKLQlmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCi0JY29udGV4dCA9IG51bGw7Ci0Jc3RhcnQgPSAwOwotCXRleHRMZW5ndGggPSAwOwotCWxlbmd0aCA9IDA7Ci19Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICovCi0JcHVibGljIEJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCkgewotCQlYTUxUb2tlbml6ZXIgbmV3SW5zdGFuY2UgPSBuZXcgWE1MVG9rZW5pemVyKCk7Ci0JCS8vIGdsb2JhbCB0YWdtYXJrZXJzIGNhbiBiZSBzaGFyZWQ7IHRoZXkgaGF2ZSBubyBzdGF0ZSBhbmQgCi0JCS8vIGFyZSBuZXZlciBkZXN0cm95ZWQgKGUuZy4gJ3JlbGVhc2UnKQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGZCbG9ja01hcmtlcnMuZ2V0KGkpOwotCQkJaWYoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkKLQkJCQluZXdJbnN0YW5jZS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7Ci0JCX0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLS8qIHVzZXIgbWV0aG9kICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuWE1MQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCS8vIFNjYW4gZm9yICctLT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcwotCS8vICAgWE1MX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoCi0JLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9YTUxfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dAotCS8vICBjb250ZXh0IGFzIHVzdWFsLgotCXJldHVybiBkb1NjYW4oIi0tPiIsIGZhbHNlLCBYTUxfQ09NTUVOVF9URVhULCBTVF9YTUxfQ09NTUVOVF9FTkQsIFNUX1hNTF9DT01NRU5UX0VORCk7Ci19Ci0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHl5X3VucGFjayhTdHJpbmcgcGFja2VkKSB7Ci0gICAgaW50IFtdIHRyYW5zID0gbmV3IGludFsxMTA1NV07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMzczNCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHRyYW5zW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEzNzIpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIC0gZnJvbSB0aGUgU0VEIEpGbGV4IHNrZWxldG9uCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0gICAgLy8gRE8gTk9UIEVYSVQgdGhlIFZNIG9uIGFuIGVycm9yCi0gICAgLy8gU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoY2hhcltdIG1hcmtlclRhZ05hbWUsIGludCBvZmZzZXQsIGludCB0YWduYW1lTGVuZ3RoKSB7Ci0JCWZvcihpbnQgaiA9IDA7IGogPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaisrKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpZkJsb2NrTWFya2Vycy5nZXQoaik7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmxlbmd0aCgpID09IHRhZ25hbWVMZW5ndGgpIHsKLQkJCQlib29sZWFuIG1hdGNoZXNTb0ZhciA9IHRydWU7Ci0JCQkJZm9yKGludCBpID0gMDsgaSA8IHRhZ25hbWVMZW5ndGggJiYgbWF0Y2hlc1NvRmFyOyBpKyspIHsKLQkJCQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkJCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSAhPSBtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkpCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYobWF0Y2hlc1NvRmFyKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKgotCSAqIFJldHVybiBBTEwgb2YgdGhlIHJlZ2lvbnMgc2Nhbm5hYmxlIHdpdGhpbiB0aGUgcmVtYWluaW5nIHRleHQKLQkgKiBOb3RlOiBmb3IgdmVyaWZpY2F0aW9uIHVzZQotCSAqLwotCXB1YmxpYyBmaW5hbCBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl0cnkgewotCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl3aGlsZShyZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQl0b2tlbnMuYWRkKHJlZ2lvbik7Ci0JCQkJfQotCQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSsiOiBpbnB1dCBjb3VsZCBub3QgYmUgdG9rZW5pemVkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0T2Zmc2V0KCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaW5jZSB0aGlzIGlzIGNvbnZlbmllbmNlIG1ldGhvZCBhbmQgTk9UIHRoZSByZWNvbW1lbmRlZCAKLQkJCS8vIHdheSBvZiBnZXR0aW5nIHRva2VucywgbWFueSBlcnJvcnMgYXJlIHNpbXBseSBoaWRkZW4KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiBub3QgaGFuZGxlZCByZXRyaWV2aW5nIHJlZ2lvbnM6ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0b2tlbnM7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGR1bXAoU3RyaW5nIHMpIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocyArICIgKCIgKyB5eWNoYXIgKyAiLSIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSh5eWxlbmd0aCgpICsgeXljaGFyKSArICIpOlwnIiArLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdVdGlscy5lc2NhcGUoeXl0ZXh0KCkpICsgIlwnIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCS8qIHVzZXIgbWV0aG9kICAtIHNrZWxldG9uLnNlZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4geXlfYXRFT0Y7Ci0JfQotLyogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQgKi8KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShTdHJpbmcgbWFya2VyVGFnTmFtZSkgewotCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQl3aGlsZShibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilibG9ja3MubmV4dCgpOwotCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG1hcmtlclRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG1hcmtlclRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIC8vIGRvIG5vdGhpbmcsIHRoaXMgaXMgdGhlIGRvd25zdHJlYW0gcGFyc2VyJ3Mgam9iCi0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIGJvb2xlYW4geXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgZm9yICh5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkOyB5eV9jdXJyZW50UG9zIDwgeXlfbWFya2VkUG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfY3VycmVudFBvcysrKSB7Ci0gICAgICAgIHN3aXRjaCAoeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdKSB7Ci0gICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB5eV9jb3VudGVkID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgIGlmICh5eV9jb3VudGVkKQotICAgICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoeXlfY291bnRlZCkgewotICAgICAgICBpZiAoIHl5X2FkdmFuY2UoKSA9PSAnXG4nICkgeXlsaW5lLS07Ci0gICAgICAgIGlmICggIXl5X2F0RU9GICkgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgeXlfc3RhdGUgPSB5eV9sZXhpY2FsX3N0YXRlOwotCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLQotICAgICAgICAgIGludCB5eV9uZXh0ID0geXl0cmFuc1sgeXlfcm93TWFwW3l5X3N0YXRlXSArIHl5Y21hcFt5eV9pbnB1dF0gXTsKLSAgICAgICAgICBpZiAoeXlfbmV4dCA9PSAtMSkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIHl5X3N0YXRlID0geXlfbmV4dDsKLQotICAgICAgICAgIGludCB5eV9hdHRyaWJ1dGVzID0gWVlfQVRUUklCVVRFW3l5X3N0YXRlXTsKLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMSkgPiAwICkgewotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgOCkgPiAwICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSAyOTE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhTTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAyOTM6IGJyZWFrOwotICAgICAgICBjYXNlIDI4MzogCi0gICAgICAgIGNhc2UgMjg1OiAKLSAgICAgICAgY2FzZSAyODY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ0RBVEEgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCXl5YmVnaW4oU1RfQ0RBVEFfVEVYVCk7Ci0JcmV0dXJuIFhNTF9DREFUQV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAyOTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDI3NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDI5NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk2OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSAyOTc6IGJyZWFrOwotICAgICAgICBjYXNlIDI2ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQzsKLSB9Ci0gICAgICAgIGNhc2UgMjk4OiBicmVhazsKLSAgICAgICAgY2FzZSAyNjc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07Ci0gfQotICAgICAgICBjYXNlIDI5OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjYzOiAKLSAgICAgICAgY2FzZSAyNzM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzAwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMzc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ2hhclJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NIQVJfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSAzMDE6IGJyZWFrOwotICAgICAgICBjYXNlIDIzNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5jb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0NPTU1FTlQpOwotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAzMDI6IGJyZWFrOwotICAgICAgICBjYXNlIDIxNTogCi0gICAgICAgIGNhc2UgMjE2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzAzOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMwNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9DREFUQV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuUEVSZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9QRV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDMwNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VOVElUWV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDMwNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTYwOiAKLSAgICAgICAgY2FzZSAxNzQ6IAotICAgICAgICBjYXNlIDE4MjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOwotIH0KLSAgICAgICAgY2FzZSAzMDg6IGJyZWFrOwotICAgICAgICBjYXNlIDE0ODogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbXB0eSB0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMDk6IGJyZWFrOwotICAgICAgICBjYXNlIDEzMzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMxMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTMyOiAKLSAgICAgICAgICB7IAotCQkvLyBlbmRlZCB3aXRoIG5vdGhpbmcgaW5zaWRlCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzExOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMxMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIwOiAKLSAgICAgICAgICB7IAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzEzOiBicmVhazsKLSAgICAgICAgY2FzZSAxMTk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1BJKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAzMTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDYzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMTU6IGJyZWFrOwotICAgICAgICBjYXNlIDU3OiAKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgIGNhc2UgNjA6IAotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgY2FzZSAxMzc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDMxNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzE3OiBicmVhazsKLSAgICAgICAgY2FzZSA1NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMTg6IGJyZWFrOwotICAgICAgICBjYXNlIDUxOiAKLSAgICAgICAgY2FzZSA1MjogCi0gICAgICAgIGNhc2UgNTM6IAotICAgICAgICAgIHsgCi0JLy8gYmxvY2sgc2NhbiB1bnRpbCBjbG9zZSBpcyBmb3VuZAotCXJldHVybiBkb1NjYW4oIj8+IiwgZmFsc2UsIFhNTF9QSV9DT05URU5ULCBTVF9YTUxfUElfVEFHX0NMT1NFLCBTVF9YTUxfUElfVEFHX0NMT1NFKTsKLSB9Ci0gICAgICAgIGNhc2UgMzE5OiBicmVhazsKLSAgICAgICAgY2FzZSA1MDogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihTVF9QSV9DT05URU5UKTsKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMjA6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgY2FzZSA0NzogCi0gICAgICAgIGNhc2UgNDg6IAotICAgICAgICBjYXNlIDQ5OiAKLSAgICAgICAgY2FzZSAxMjk6IAotICAgICAgICBjYXNlIDEzMDogCi0gICAgICAgIGNhc2UgMTMxOiAKLSAgICAgICAgY2FzZSAyMTc6IAotICAgICAgICBjYXNlIDIzOTogCi0gICAgICAgIGNhc2UgMjQwOiAKLSAgICAgICAgY2FzZSAyNTI6IAotICAgICAgICBjYXNlIDI1MzogCi0gICAgICAgIGNhc2UgMjYyOiAKLSAgICAgICAgY2FzZSAyNzI6IAotICAgICAgICBjYXNlIDI4MDogCi0gICAgICAgIGNhc2UgMjg0OiAKLSAgICAgICAgY2FzZSAyODc6IAotICAgICAgICBjYXNlIDI4ODogCi0gICAgICAgIGNhc2UgMjg5OiAKLSAgICAgICAgY2FzZSAyOTA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1BJX1dTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzIxOiBicmVhazsKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0gfQotICAgICAgICBjYXNlIDMyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkxJTkUgRkVFRCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDMyMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMDogCi0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICBjYXNlIDEyMjogCi0gICAgICAgIGNhc2UgMTI0OiAKLSAgICAgICAgY2FzZSAyMDc6IAotICAgICAgICBjYXNlIDIwODogCi0gICAgICAgIGNhc2UgMjM2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblhNTCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzI0OiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgIGNhc2UgNDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDMyNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJpbmFwcHJvcHJpYXRlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMjY6IGJyZWFrOwotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgY2FzZSAxMDY6IAotICAgICAgICBjYXNlIDEwNzogCi0gICAgICAgIGNhc2UgMTkzOiAKLSAgICAgICAgY2FzZSAyMjk6IAotICAgICAgICBjYXNlIDI0ODogCi0gICAgICAgIGNhc2UgMjU5OiAKLSAgICAgICAgY2FzZSAyNjk6IAotICAgICAgICBjYXNlIDI3NzogCi0gICAgICAgIGNhc2UgMjgxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgY2FzZSAxMTM6IAotICAgICAgICBjYXNlIDExNDogCi0gICAgICAgIGNhc2UgMjA0OiAKLSAgICAgICAgY2FzZSAyMzM6IAotICAgICAgICBjYXNlIDI1MDogCi0gICAgICAgIGNhc2UgMjYwOiAKLSAgICAgICAgY2FzZSAyNzA6IAotICAgICAgICBjYXNlIDI3ODogCi0gICAgICAgIGNhc2UgMjgyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMyODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgY2FzZSA4MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5zdGFydCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSAzMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgIGNhc2UgMzc6IAotICAgICAgICBjYXNlIDM4OiAKLSAgICAgICAgY2FzZSAzOTogCi0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICBjYXNlIDQ0OiAKLSAgICAgICAgY2FzZSA1NDogCi0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICBjYXNlIDYyOiAKLSAgICAgICAgY2FzZSA2NDogCi0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICBjYXNlIDc0OiAKLSAgICAgICAgY2FzZSA4MDogCi0gICAgICAgIGNhc2UgODU6IAotICAgICAgICBjYXNlIDg2OiAKLSAgICAgICAgY2FzZSA4NzogCi0gICAgICAgIGNhc2UgODg6IAotICAgICAgICBjYXNlIDkwOiAKLSAgICAgICAgY2FzZSA5MTogCi0gICAgICAgIGNhc2UgOTM6IAotICAgICAgICBjYXNlIDk4OiAKLSAgICAgICAgY2FzZSAxMDM6IAotICAgICAgICBjYXNlIDExMDogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiISEhdW5leHBlY3RlZCEhITogXCIiICsgeXl0ZXh0KCkgKyAiXCI6IiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl5eWNoYXIgKyAiLSIgKyAoeXljaGFyICsgeXlsZW5ndGgoKSkpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gVU5ERUZJTkVEOwotIH0KLSAgICAgICAgY2FzZSAzMzA6IGJyZWFrOwotICAgICAgICBjYXNlIDM1OiAKLSAgICAgICAgY2FzZSAzNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiQ0RBVEEgdGV4dCIpOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgYmxvY2tDb250ZXh0ID0gZG9CbG9ja1NjYW4oIl1dPiIsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQKLQlpZihibG9ja0NvbnRleHQgPT0gWE1MX0NEQVRBX1RFWFQpCi0JCXl5YmVnaW4oU1RfQ0RBVEFfRU5EKTsKLQlyZXR1cm4gYmxvY2tDb250ZXh0OwotIH0KLSAgICAgICAgY2FzZSAzMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDY1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMzI6IGJyZWFrOwotICAgICAgICBjYXNlIDY2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSAzMzM6IGJyZWFrOwotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgY2FzZSA2OTogCi0gICAgICAgIGNhc2UgNzA6IAotICAgICAgICBjYXNlIDE0NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDMzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZihpc0Jsb2NrTWFya2VyKCkpIHsKLSAgICAgICAgCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCX0KLQllbHNlCi0gICAgICAgIAl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMzU6IGJyZWFrOwotICAgICAgICBjYXNlIDc1OiAKLSAgICAgICAgY2FzZSA3NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzM2OiBicmVhazsKLSAgICAgICAgY2FzZSA3NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzM3OiBicmVhazsKLSAgICAgICAgY2FzZSA3ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSAzMzg6IGJyZWFrOwotICAgICAgICBjYXNlIDc5OiAKLSAgICAgICAgY2FzZSA4MTogCi0gICAgICAgIGNhc2UgODI6IAotICAgICAgICBjYXNlIDE1MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDMzOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRlY2xhcmF0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDM0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgODk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzQxOiBicmVhazsKLSAgICAgICAgY2FzZSA5MjogCi0gICAgICAgIGNhc2UgOTQ6IAotICAgICAgICBjYXNlIDk1OiAKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgMTY2OiAKLSAgICAgICAgY2FzZSAxNjc6IAotICAgICAgICBjYXNlIDE3MDogCi0gICAgICAgIGNhc2UgMTcxOiAKLSAgICAgICAgY2FzZSAyMjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgcHVibGljIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLSB9Ci0gICAgICAgIGNhc2UgMzQyOiBicmVhazsKLSAgICAgICAgY2FzZSA5NzogCi0gICAgICAgIGNhc2UgOTk6IAotICAgICAgICBjYXNlIDEwMDogCi0gICAgICAgIGNhc2UgMTAxOiAKLSAgICAgICAgY2FzZSAxNzg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgc3lzdGVtIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsKLSB9Ci0gICAgICAgIGNhc2UgMzQzOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDI6IAotICAgICAgICBjYXNlIDEwNDogCi0gICAgICAgIGNhc2UgMTA1OiAKLSAgICAgICAgY2FzZSAxODY6IAotICAgICAgICBjYXNlIDE4NzogCi0gICAgICAgIGNhc2UgMTkwOiAKLSAgICAgICAgY2FzZSAxOTE6IAotICAgICAgICBjYXNlIDIyNzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDM0NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDM0NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA5OiAKLSAgICAgICAgY2FzZSAxMTE6IAotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgIGNhc2UgMTk3OiAKLSAgICAgICAgY2FzZSAxOTg6IAotICAgICAgICBjYXNlIDIwMTogCi0gICAgICAgIGNhc2UgMjAyOiAKLSAgICAgICAgY2FzZSAyMzE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDM0NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzQ3OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZW5kIHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSAzNDg6IGJyZWFrOwotICAgICAgICBjYXNlIDExNjogCi0gICAgICAgIGNhc2UgMTE3OiAKLSAgICAgICAgICB7IAotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQkgfQotICAgICAgICBjYXNlIDM0OTogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9YTUxUb2tlbml6ZXIuamZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qZmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0NGMwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qZmxleAorKysgL2Rldi9udWxsCkBAIC0xLDEzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsNCi0NCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1Rva2VuaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5YTUxQYXJzZXJSZWdpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0Ow0KLQ0KLSUlDQotDQotJXsNCi0JcHJpdmF0ZSBpbnQgZlRva2VuQ291bnQgPSAwOw0KLSANCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZw0KLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGggPSAwOw0KLQlwcml2YXRlIFN0cmluZyBmX2NvbnRleHQgPSBudWxsOw0KLQ0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucw0KLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotDQotCXByaXZhdGUgU3RyaW5nIGNvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBzdGFydCA9IDA7DQotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOw0KLQlwcml2YXRlIGludCBsZW5ndGggPSAwOw0KLQ0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MNCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCA9IDA7DQotCQ0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkDQotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotDQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2Vycw0KLQlwcml2YXRlIExpc3QgZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZw0KLQlwcml2YXRlIGJvb2xlYW4gZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCXByaXZhdGUgYm9vbGVhbiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSB0cnVlOw0KLQ0KLQlwcml2YXRlIFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBuZXcgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSgpOw0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqLw0KLXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgew0KLQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpDQotCQlyZXR1cm47DQotCWZCbG9ja01hcmtlcnMuYWRkKG1hcmtlcik7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqLw0KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgew0KLQlmQmxvY2tNYXJrZXJzLnJlbW92ZShtYXJrZXIpOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZCANCi0gKi8NCi1wdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnbmFtZSkgew0KLQlpZiAoZkJsb2NrTWFya2VycyAhPSBudWxsKSB7DQotCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCQl3aGlsZSAoYmxvY2tzLmhhc05leHQoKSkgew0KLQkJCWlmICgoKEJsb2NrTWFya2VyKSBibG9ja3MubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQ0KLQkJCQlibG9ja3MucmVtb3ZlKCk7DQotCQl9DQotCX0NCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsNCi0JcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgew0KLQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBuZXdWYWx1ZTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShmQ3VycmVudFRhZ05hbWUpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KFN0cmluZyBuYW1lKSB7DQotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7DQotCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7DQotCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOw0KLQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpDQotCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7DQotCX0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7DQotCXJldHVybiBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dChTdHJpbmcgbmFtZSkgew0KLQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsNCi0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOw0KLQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpDQotCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7DQotCX0NCi0JcmV0dXJuIEJMT0NLX1RFWFQ7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgew0KLQlyZXR1cm4gZkJsb2NrTWFya2VyczsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsNCi0JcmV0dXJuIGZPZmZzZXQgKyB5eWNoYXI7DQotfQ0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgew0KLQlyZXR1cm4gaXNCbG9ja01hcmtlcihmQ3VycmVudFRhZ05hbWUpOw0KLX0NCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgew0KLQlpZiAoIWZJc0Jsb2NraW5nRW5hYmxlZCkNCi0JCXJldHVybiBmYWxzZTsNCi0JcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QNCi0gKi8NCi1wdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrVGFnU2NhbihTdHJpbmcgbmV3VGFnTmFtZSkgew0KLQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QNCi0gKg0KLSAqIFNwZWNpYWwgdG9rZW5pemVyIHNldHVwLiAgQWxsb3dzIHRva2VuaXphdGlvbiB0byBiZSBpbml0aWF0ZWQgYXQgdGhlDQotICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuDQotICoNCi0gKiBFeGFtcGxlOiANCi0gKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7DQotICoJdG9rZXIuc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGZhbHNlKTsNCi0gKgl0b2tlci5yZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoImFmaXVocXdrZWpodGFzaWhnYWxrd2h0cTwvc2NyaXB0ZXI+PC9zY3I+PC9zY3JpcHQ+YXNnZGFzZ2EiKSk7DQotICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOw0KLSAqCXRva2VyLmdldFJlZ2lvbnMoKTsgDQotICoNCi0gKiBSZXR1cm5zOg0KLSAqCUJMT0NLX1RFWFQ6IDAtNDANCi0gKglYTUxfRU5EX1RBR19PUEVOOiA0MS00Mg0KLSAqCVhNTF9UQUdfTkFNRTogNDMtNDgNCi0gKglYTUxfVEFHX0NMT1NFOiA0OS00OQ0KLSAqCVhNTF9DT05URU5UOiA1MC01Nw0KLSAqDQotICovDQotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja01hcmtlclNjYW4oU3RyaW5nIG5ld1RhZ05hbWUsIFN0cmluZyBibG9ja2NvbnRleHQpIHsNCi0JeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCWZDdXJyZW50VGFnTmFtZSA9IG5ld1RhZ05hbWU7DQotfQ0KLS8qKg0KLSAqIE1ldGhvZCBkb1NjYW4uDQotICogDQotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3INCi0gKiB0byByaWdodCAqYmVmb3JlKiB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIHNlYXJjaFN0cmluZw0KLSAqIA0KLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSINCi0gKiBAcGFyYW0gcmVxdWlyZVRhaWxTZXBhcmF0b3IgLSB3aGV0aGVyIHRoZSB0YXJnZXQgbXVzdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIG9yICc+Jw0KLSAqIEBwYXJhbSBjb250ZXh0IC0gdGhlIGNvbnRleHQgb2YgdGhlIHNjYW5uZWQgcmVnaW9uIGlmIG5vbi16ZXJvIGxlbmd0aA0KLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoDQotICogQHBhcmFtIGFib3J0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHNlYXJjaFN0cmluZyB3YXMgZm91bmQgaW1tZWRpYXRlbHkNCi0gKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBjb250ZXh0IGZvdW5kOiB0aGUgZGVzaXJlZCBjb250ZXh0IG9uIGEgbm9uLXplcm8gbGVuZ3RoIG1hdGNoLCB0aGUgYWJvcnRDb250ZXh0IG9uIGltbWVkaWF0ZSBzdWNjZXNzDQotICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAqLw0KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvU2NhbihTdHJpbmcgc2VhcmNoU3RyaW5nLCBib29sZWFuIHJlcXVpcmVUYWlsU2VwYXJhdG9yLCBTdHJpbmcgc2VhcmNoQ29udGV4dCwgaW50IGV4aXRTdGF0ZSwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOw0KLQkvLyBEaXNhYmxlIGZ1cnRoZXIgYmxvY2sgKHByb2JhYmx5KQ0KLQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsNCi0JaW50IG4gPSAwOw0KLQljaGFyIGxhc3RDaGVja0NoYXI7DQotCWludCBpOw0KLQlib29sZWFuIHNhbWUgPSBmYWxzZTsNCi0Jd2hpbGUgKHN0aWxsU2VhcmNoaW5nKSB7DQotCQluID0gMDsNCi0JCS8vIEVuc3VyZSB0aGF0IGVub3VnaCBkYXRhIGZyb20gdGhlIGlucHV0IGV4aXN0cyB0byBjb21wYXJlIGFnYWluc3QgdGhlIHNlYXJjaCBTdHJpbmcuDQotCQluID0geXlfYWR2YW5jZSgpOw0KLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQ0KLQkJCW4gPSB5eV9hZHZhbmNlKCk7DQotCQkvLyBJZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydCBvciB3ZSd2ZSBleGhhdXN0ZWQgdGhlIGlucHV0LCBzdG9wIGltbWVkaWF0ZWx5Lg0KLQkJaWYgKG4gPT0gWVlFT0YpIHsNCi0JCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJc2FtZSA9IHRydWU7DQotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDwlJT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQNCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uDQotCQkJLy8gQ2hlY2sgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHRhcmdldCB2ZXJzdXMgdGhlIGxhc3QgdGFyZ2V0TGVuZ3RoIGNoYXJhY3RlcnMgcmVhZCBmcm9tIHRoZSBidWZmZXINCi0JCQkvLyBhbmQgc2VlIGlmIGl0IG1hdGNoZXMNCi0JCQkNCi0JCQkvLyBzYWZldHkgY2hlY2sgZm9yIGFycmF5IGFjY2Vzc2VzICh5eV9jdXJyZW50UG9zIGlzIHRoZSAqbGFzdCogY2hhcmFjdGVyIHdlIGNhbiBjaGVjayBhZ2FpbnN0KQ0KLQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgew0KLQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgew0KLQkJCQkJaWYoc2FtZSAmJiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpDQotCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsNCi0JCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQ0KLQkJCQkJCXNhbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoeXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaFN0cmluZy5jaGFyQXQoaSkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCS8vIHNhZmV0eSBjaGVjayBmYWlsZWQ7IG5vIG1hdGNoIGlzIHBvc3NpYmxlIHJpZ2h0IG5vdw0KLQkJCWVsc2Ugew0KLQkJCQlzYW1lID0gZmFsc2U7DQotCQkJfQ0KLQkJCWlmIChzYW1lICYmIHJlcXVpcmVUYWlsU2VwYXJhdG9yICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoKSB7DQotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaA0KLQkJCQkvLyAiPC9zY3JpcHRTIg0KLQkJCQlsYXN0Q2hlY2tDaGFyID0geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdOw0KLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIg0KLQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQ0KLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXN0aWxsU2VhcmNoaW5nID0gIXNhbWUgfHwgKHl5X2N1cnJlbnRQb3MgPCB5eV9zdGFydFJlYWQgKyBzZWFyY2hTdHJpbmdMZW5ndGgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7DQotCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoDQotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOw0KLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlDQotCQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQ0KLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsNCi0JCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOw0KLQkJCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7DQotCQl9DQotCX0NCi0JZWxzZSB7DQotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQNCi0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7DQotCQl5eV9jdXJyZW50UG9zKys7DQotCX0NCi0JeXliZWdpbihleGl0U3RhdGUpOw0KLQkvLyBJZiB0aGUgZW5kaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlDQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5DQotCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpDQotCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOw0KLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QNCi0gKg0KLSAqIEEgZ2VuZXJpYyBsb29rYWhlYWQtbGlrZSBvcGVyYXRpb24NCi0gKi8NCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb0Jsb2NrU2NhbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgdGFyZ2V0Q29udGV4dCwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCXJldHVybiBkb1NjYW4odGFyZ2V0LCBmYWxzZSwgdGFyZ2V0Q29udGV4dCwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lDQotICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsNCi0JcmV0dXJuIGRvU2NhbigiPC8iICsgZkN1cnJlbnRUYWdOYW1lLCB0cnVlLCBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKSwgWVlJTklUSUFMLCBZWUlOSVRJQUwpOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZA0KLSAqDQotICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpDQotICogbWV0aG9kIGludG8gYSBmdWxsIElUZXh0UmVnaW9uIGJ5IHB1bGxpbmcgaW4gdmFsdWVzIGZvciB0aGUNCi0gKiBjdXJyZW50IG9mZnNldCB3aXRoaW4gdGhlIHNjYW5uaW5nIHRleHQuDQotICoNCi0gKiBSZXR1cm5zIG51bGwgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgYW5kIGF0dGFjaGVzIGludGVybWl0dGVudGx5DQotICogZGlzY292ZXJlZCB3aGl0ZXNwYWNlIG9udG8gdGhlIGVuZCBvZiB1c2VmdWwgcmVnaW9ucy4NCi0gKg0KLSAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjYWNoZXMgdGhlIHRva2VuIGZvbGxvd2luZyB0aGUgb25lIGJlaW5nIHJldHVybmVkDQotICogc28gdGhhdCB3aGl0ZXNwYWNlIGNhbiBiZSBjb2xsYXBzZWQuDQotICovDQotcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykNCi0JaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsNCi0JCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0Ow0KLQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsNCi0JCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7DQotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCX0NCi0JZWxzZSB7DQotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJaWYgKGNvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7DQotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkNCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7DQotCQkJZWxzZQ0KLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOw0KLQkJfQ0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsNCi0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOw0KLQkJfQ0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7DQotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCQl9DQotCQlzdGFydCA9IHl5Y2hhcjsNCi0JCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJaWYgKHl5X2F0RU9GKSB7DQotCQkJZlRva2VuQ291bnQrKzsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbg0KLQlmX2NvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCWlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7DQotCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQ0KLQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOw0KLQkJZWxzZQ0KLQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotCX0NCi0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfT1BFTikgew0KLQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsNCi0JfQ0KLQllbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgew0KLQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCX0NCi0JZkJ1ZmZlcmVkQ29udGV4dCA9IGZfY29udGV4dDsNCi0JZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7DQotCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOw0KLQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgew0KLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJbGVuZ3RoICs9IGZCdWZmZXJlZExlbmd0aDsNCi0JfQ0KLQlpZiAoY29udGV4dCA9PSBudWxsKSB7DQotCQkvLyBFT0YNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGlzY292ZXJlZCAiICsgZlRva2VuQ291bnQgKyAiIHRva2Vucy4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCWZUb2tlbkNvdW50Kys7DQotCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBYTUxUb2tlbml6ZXIoKXsNCi0Jc3VwZXIoKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgWE1MVG9rZW5pemVyKGNoYXJbXSBjaGFyQXJyYXkpew0KLQkJdGhpcyhuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSkpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsNCi0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7DQotCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgbmV3T2Zmc2V0KTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7DQotCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgMCk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCkgew0KLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsNCi0JcmVzZXQoaW4sIDApOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZCAqDQotICoNCi0gKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMNCi0gKiB0aGF0IHJlc2V0dGluZyBhIHByZS1leGlzdGluZyB0b2tlbml6ZXIgaXMgZmFzdGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgb25lLg0KLSAqDQotICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUNCi0gKiA8ZW0+Z2VuZXJhdGVkPC9lbT4gb3V0cHV0IG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBiZWZvcmUgdGhpcyBtZXRob2Qgd2FzDQotICogYWRkZWQuICBUaG9zZSBjb2RlIGJsb2NrcyB3ZXJlIHVuZGVyIHRoZSBhYm92ZSBjb3B5cmlnaHQuDQotICovDQotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkDQotCX0NCi0JZk9mZnNldCA9IG5ld09mZnNldDsNCi0NCi0JLyogdGhlIGlucHV0IGRldmljZSAqLw0KLQl5eV9yZWFkZXIgPSBpbjsNCi0NCi0JLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLQl5eV9zdGF0ZSA9IDA7DQotDQotCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0JeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsNCi0NCi0JLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0JamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7DQotDQotCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotCXl5X21hcmtlZFBvcyA9IDA7DQotDQotCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotCS8veXlfcHVzaGJhY2tQb3MgPSAwOw0KLQ0KLQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0JeXlfY3VycmVudFBvcyA9IDA7DQotDQotCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLw0KLQl5eV9zdGFydFJlYWQgPSAwOw0KLQ0KLQkvKiogDQotCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZA0KLQkgKiBmcm9tIGlucHV0IA0KLQkgKi8NCi0JeXlfZW5kUmVhZCA9IDA7DQotDQotCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLQkvL3l5bGluZSA9IDA7DQotDQotCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLQl5eWNoYXIgPSAwOw0KLQ0KLQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovDQotCXl5X2F0RU9GID0gZmFsc2U7DQotDQotCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLw0KLQl5eV9lb2ZfZG9uZSA9IGZhbHNlOw0KLQ0KLQ0KLQkvKiB1c2VyIHZhcnM6ICovDQotCWZUb2tlbkNvdW50ID0gMDsNCi0gDQotCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsNCi0JZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7DQotCWZCdWZmZXJlZFN0YXJ0ID0gMTsNCi0JZkJ1ZmZlcmVkTGVuZ3RoID0gMDsNCi0JZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsNCi0NCi0JY29udGV4dCA9IG51bGw7DQotCXN0YXJ0ID0gMDsNCi0JdGV4dExlbmd0aCA9IDA7DQotCWxlbmd0aCA9IDA7DQotfQ0KLQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICoNCi0JICovDQotCXB1YmxpYyBCbG9ja1Rva2VuaXplciBuZXdJbnN0YW5jZSgpIHsNCi0JCVhNTFRva2VuaXplciBuZXdJbnN0YW5jZSA9IG5ldyBYTUxUb2tlbml6ZXIoKTsNCi0JCS8vIGdsb2JhbCB0YWdtYXJrZXJzIGNhbiBiZSBzaGFyZWQ7IHRoZXkgaGF2ZSBubyBzdGF0ZSBhbmQgDQotCQkvLyBhcmUgbmV2ZXIgZGVzdHJveWVkIChlLmcuICdyZWxlYXNlJykNCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7DQotCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGZCbG9ja01hcmtlcnMuZ2V0KGkpOw0KLQkJCWlmKGJsb2NrTWFya2VyLmlzR2xvYmFsKCkpDQotCQkJCW5ld0luc3RhbmNlLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsNCi0JCX0NCi0JCXJldHVybiBuZXdJbnN0YW5jZTsNCi0JfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhblhNTENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JLy8gU2NhbiBmb3IgJy0tPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzDQotCS8vICAgWE1MX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoDQotCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfWE1MX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQNCi0JLy8gIGNvbnRleHQgYXMgdXN1YWwuDQotCXJldHVybiBkb1NjYW4oIi0tPiIsIGZhbHNlLCBYTUxfQ09NTUVOVF9URVhULCBTVF9YTUxfQ09NTUVOVF9FTkQsIFNUX1hNTF9DT01NRU5UX0VORCk7DQotfQ0KLSV9DQotDQotJWVvZnsNCi0vLyBkbyBub3RoaW5nLCB0aGlzIGlzIHRoZSBkb3duc3RyZWFtIHBhcnNlcidzIGpvYg0KLSVlb2Z9DQotDQotJXB1YmxpYw0KLSVjbGFzcyBYTUxUb2tlbml6ZXINCi0laW1wbGVtZW50cyBCbG9ja1Rva2VuaXplciwgRE9NUmVnaW9uQ29udGV4dA0KLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuDQotJXR5cGUgU3RyaW5nDQotJWNoYXINCi0ldW5pY29kZQ0KLSVwYWNrDQotDQotJXN0YXRlIFNUX0NEQVRBX1RFWFQNCi0lc3RhdGUgU1RfQ0RBVEFfRU5EDQotJXN0YXRlIFNUX1hNTF9DT01NRU5UDQotJXN0YXRlIFNUX1hNTF9DT01NRU5UX0VORA0KLSVzdGF0ZSBTVF9QSQ0KLSVzdGF0ZSBTVF9QSV9XUw0KLSVzdGF0ZSBTVF9QSV9DT05URU5UDQotJXN0YXRlIFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9YTUxfUElfRVFVQUxTDQotJXN0YXRlIFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUNCi0lc3RhdGUgU1RfWE1MX1BJX1RBR19DTE9TRQ0KLSVzdGF0ZSBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9ESFRNTF9FUVVBTFMNCi0lc3RhdGUgU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFDQotJXN0YXRlIFNUX0RIVE1MX1RBR19DTE9TRQ0KLQ0KLS8vIG5vcm1hbCB0YWcgc3RhdGVzDQotJXN0YXRlIFNUX1hNTF9UQUdfTkFNRQ0KLSVzdGF0ZSBTVF9YTUxfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfWE1MX0VRVUFMUw0KLSVzdGF0ZSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFDQotDQotLy8gZGVjbGFyYXRpb24gKERURCkgc3RhdGVzDQotJXN0YXRlIFNUX1hNTF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UNCi0NCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQNCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDDQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTQ0KLQ0KLSVzdGF0ZSBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UDQotDQotJXN0YXRlIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQNCi0NCi0lc3RhdGUgU1RfQkxPQ0tfVEFHX1NDQU4NCi0NCi0vLyBMZXR0ZXIgPSAoW0EtWmEtel0pDQotLy8gRGlnaXQgPSAoWzAtOV0pDQotDQotLyoqDQotICogc21hbGxlciB0b2tlbnMNCi0gKi8NCi1nZW5lcmljVGFnT3BlbiAgICAgICA9IDwNCi1nZW5lcmljVGFnQ2xvc2UgICAgICA9ID4NCi1nZW5lcmljRW5kVGFnT3BlbiAgICA9IDxcLw0KLWdlbmVyaWNFbXB0eVRhZ0Nsb3NlID0gXC8+DQotDQotUElzdGFydCA9IDxcPw0KLVBJZW5kICAgPSBcPz4NCi0NCi0NCi0vLyBbMV0gZG9jdW1lbnQgOjo9IHByb2xvZyBlbGVtZW50IE1pc2MqDQotZG9jdW1lbnQgPSAoe3Byb2xvZ30ge2VsZW1lbnR9IHtNaXNjfSopDQotDQotLy8gWzJdIENoYXIgOjo9ICN4OSB8ICN4QSB8ICN4RCB8IFsjeDIwLSN4RDdGRl0gfCBbI3hFMDAwLSN4RkZGRF0gfCBbI3gxMDAwMC0jeDEwRkZGRl0NCi0gLy9DaGFyID0gKC4pDQotQ2hhciA9IFtceDA5XHgwQVx4MERceDIwLVx1RDdGRlx1RTAwMC1cdUZGRkRdIA0KLQ0KLS8vIFszXSBTIDo6PSAoMHgyMCB8IDB4OSB8IDB4RCB8IDB4QSkrDQotUyA9IFtceDIwXHgwOVx4MERceDBBXSsNCi0NCi0vLyBbNF0gTmFtZUNoYXIgOjo9IExldHRlciB8IERpZ2l0IHwgJy4nIHwgJy0nIHwgJ18nIHwgJzonIHwgQ29tYmluaW5nQ2hhciB8IEV4dGVuZGVyDQotTmFtZUNoYXIgPSAoe0xldHRlcn0gfCB7RGlnaXR9IHwgXC4gfCBcLSB8IF8gfCA6IHwge0NvbWJpbmluZ0NoYXJ9IHwge0V4dGVuZGVyfSkNCi0NCi0vLyBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgTmFtZUNoYXIqDQotLy9OYW1lID0gKHtOYW1lQ2hhcn17TmFtZUNoYXJ9KikNCi1OYW1lID0gKHtMZXR0ZXJ9IHwgXyB8IDope05hbWVDaGFyfSoNCi0NCi0vLyBbNl0gTmFtZXMgOjo9IHtOYW1lfSAoe1N9IHtOYW1lfSkqDQotTmFtZXMgPSAoe05hbWV9ICh7U30ge05hbWV9KSopDQotDQotLy8gWzddIE5tdG9rZW4gOjo9IChOYW1lQ2hhcikrDQotTm10b2tlbiA9ICh7TmFtZUNoYXJ9KykNCi0NCi0vLyBbOF0gTm10b2tlbnMgOjo9IE5tdG9rZW4gKFMgTm10b2tlbikqDQotTm10b2tlbnMgPSAoe05tdG9rZW59ICh7U30ge05tdG9rZW59KSopDQotDQotLy8gWzldIEVudGl0eVZhbHVlIDo6PSAnIicgKFteJSYiXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogJyInIHwgICInIiAoW14lJiddIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAiJyINCi1FbnRpdHlWYWx1ZSA9IChcIiAoW14lJlwiXSB8IHtQRVJlZmVyZW5jZX0gfCB7UmVmZXJlbmNlfSkqIFwiIHwgIFwnIChbXiUmXCddIHwge1BFUmVmZXJlbmNlfSB8IHtSZWZlcmVuY2V9KSogXCcpDQotDQotLy8gWzEwXSBBdHRWYWx1ZSA6Oj0gJyInIChbXjwmIl0gfCBSZWZlcmVuY2UpKiAnIicgfCAgIiciIChbXjwmJ10gfCBSZWZlcmVuY2UpKiAiJyINCi1BdHRWYWx1ZSA9ICggXCIgKFteXCJdIHwge1JlZmVyZW5jZX0pKiBcIiB8IFwnIChbXlwnXSB8IHtSZWZlcmVuY2V9KSogXCcgIHwgKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkNCi0NCi0vLyBbMTFdIFN5c3RlbUxpdGVyYWwgOjo9ICgnIicgW14iXSogJyInKSB8ICgiJyIgW14nXSogIiciKSANCi1TeXN0ZW1MaXRlcmFsID0gKChcIiBbXlwiXSogXCIpIHwgKFwnIFteXCddKiBcJykpIA0KLQ0KLS8vIFsxMl0gUHViaWRMaXRlcmFsIDo6PSAnIicgUHViaWRDaGFyKiAnIicgfCAiJyIgKFB1YmlkQ2hhciAtICInIikqICInIg0KLVB1YmlkTGl0ZXJhbCA9IChcIiB7UHViaWRDaGFyfSogXCIgfCBcJyAoe1B1YmlkQ2hhcn1cJykqICInIikNCi0NCi0vLyBbMTNdIFB1YmlkQ2hhciA6Oj0gI3gyMCB8ICN4RCB8ICN4QSB8IFthLXpBLVowLTldIHwgWy0nKCkrLC4vOj0/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+IHtFbnRpdHlSZWZ9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOw0KLX0NCi0NCi08WVlJTklUSUFMPiB7UElzdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9QSSk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47DQotfQ0KLS8vIHRoZSBuZXh0IGZvdXIgYXJlIG9yZGVyIGRlcGVuZGVudA0KLTxTVF9QST4gKChYfHgpKE18bSkoTHxsKSkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4gKFtpSV1bbU1dW3BQXVtvT11bclJdW3RUXXtTfSopIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsNCi19DQotPFNUX1BJPiB4bWwtc3R5bGVzaGVldCB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWFNMIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsNCi19DQotPFNUX1BJPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9QSV9XUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi08U1RfUElfV1M+IHtTfSsgew0KLSAgICAgICAgeXliZWdpbihTVF9QSV9DT05URU5UKTsNCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsNCi19DQotPFNUX1BJLCBTVF9QSV9XUz4gXD8+IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLTxTVF9QSV9DT05URU5UPiAuIHsNCi0JLy8gYmxvY2sgc2NhbiB1bnRpbCBjbG9zZSBpcyBmb3VuZA0KLQlyZXR1cm4gZG9TY2FuKCI/PiIsIGZhbHNlLCBYTUxfUElfQ09OVEVOVCwgU1RfWE1MX1BJX1RBR19DTE9TRSwgU1RfWE1MX1BJX1RBR19DTE9TRSk7DQotfQ0KLTxTVF9QSV9DT05URU5ULFNUX1hNTF9QSV9UQUdfQ0xPU0U+IFw/PiB7DQotCQkvLyBlbmRlZCB3aXRoIG5vdGhpbmcgaW5zaWRlDQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi08U1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfUElfRVFVQUxTPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi08U1RfWE1MX1BJX0VRVUFMUz4ge0VxfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7DQotfQ0KLS8qIHRoZSB2YWx1ZSB3YXMgZm91bmQsIGxvb2sgZm9yIHRoZSBuZXh0IG5hbWUgKi8NCi08U1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRT4ge0F0dFZhbHVlfSB8IChbXCdcIl0oW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSogKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi0vKiB0aGUgUEkncyBjbG9zZSB3YXMgZm91bmQgKi8NCi08U1RfWE1MX1BJX0VRVUFMUywgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFPiB7UEllbmR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi0vLyBESFRNTA0KLTxTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSwgU1RfREhUTUxfRVFVQUxTPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotPFNUX0RIVE1MX0VRVUFMUz4ge0VxfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOw0KLX0NCi0vKiB0aGUgdmFsdWUgd2FzIGZvdW5kLCBsb29rIGZvciB0aGUgbmV4dCBuYW1lICovDQotPFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRT4ge0F0dFZhbHVlfSB8IChbXCdcIl0oW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSogKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotLyogVGhlIERIVE1MIFBJJ3MgY2xvc2Ugd2FzIGZvdW5kICovDQotPFNUX0RIVE1MX0VRVUFMUywgU1RfREhUTUxfQVRUUklCVVRFX05BTUUsIFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRT4gWy9dKj4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotDQotLy8gWE1MIGRlY2xhcmF0aW9ucw0KLQ0KLTxZWUlOSVRJQUwsIFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiB7Z2VuZXJpY1RhZ09wZW59ISB7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbmRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT04pOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX09QRU47DQotfQ0KLTxTVF9YTUxfREVDTEFSQVRJT04+IFtFZV1bTGxdW0VlXVtNbV1bRWVdW05uXVtUdF0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVsZW1lbnQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04pOw0KLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTEFSQVRJT047DQotfQ0KLTxTVF9YTUxfREVDTEFSQVRJT04+IFtEZF1bT29dW0NjXVtUdF1bWXldW1BwXVtFZV0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRvY3R5cGUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfREVDTEFSQVRJT047DQotfQ0KLTxTVF9YTUxfREVDTEFSQVRJT04+IFtBYV1bVHRdW1R0XVtMbF1bSWldW1NzXVtUdF0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dGxpc3QiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04pOw0KLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTEFSQVRJT047DQotfQ0KLQ0KLS8vIGJlZ2luIERPQ1RZUEUgaGFuZGxpbmcgcHJvY2VkdXJlDQotPFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCwgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNLCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMsIFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRT4gXFtbXlxdXSpcXSB7DQotCXJldHVybiBYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQ7DQotfQ0KLQ0KLTxTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTj4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHR5cGUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQpOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfTkFNRTsNCi19DQotPFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEPiBbUHBdW1V1XVtCYl1bTGxdW0lpXVtDY10gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQzsNCi19DQotPFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEPiBbU3NdW1l5XVtTc11bVHRdW0VlXVtNbV0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTTsNCi19DQotPFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQz4ge0F0dFZhbHVlfXx7UHViaWRMaXRlcmFsfXwoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRvY3R5cGUgcHVibGljIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNPiB7QXR0VmFsdWV9fHtTeXN0ZW1MaXRlcmFsfXwoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRvY3R5cGUgc3lzdGVtIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UpOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOw0KLX0NCi0vLyBlbmQgRE9DVFlQRSBoYW5kbGluZw0KLQ0KLS8vIGJlZ2luIEVMRU1FTlQgaGFuZGxpbmcgcHJvY2VkdXJlDQotPFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9fChbXCdcIl0oW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSogKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UKTsNCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRTsNCi19DQotPFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQ+IFtePl0qIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVDsNCi19DQotDQotPFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQ+IHtnZW5lcmljVGFnQ2xvc2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7DQotfQ0KLS8vIGVuZCBFTEVNRU5UIGhhbmRsaW5nDQotDQotLy8gYmVnaW4gQVRUTElTVCBoYW5kbGluZyBwcm9jZWR1cmUNCi08U1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04+IHtBdHRWYWx1ZX18e1B1YmlkTGl0ZXJhbH18KFtcJ1wiXShbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKiApIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0IG5hbWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCk7DQotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX05BTUU7DQotfQ0KLTxTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UPiBbXj5dKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfQ09OVEVOVDsNCi19DQotDQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQ+IHtnZW5lcmljVGFnQ2xvc2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0IGNsb3NlIik7Ly8kTk9OLU5MUy0xJA0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsNCi19DQotLy8gZW5kIEFUVExJU1QgaGFuZGxpbmcNCi0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiwgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFLCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQ+IHtnZW5lcmljVGFnQ2xvc2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkZWNsYXJhdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgREVDTEFSQVRJT04gaGFuZGxpbmcNCi0NCi08WVlJTklUSUFMPiBbXjwmJV0qfFsmJV17U30re05hbWV9W14mJTxdKnxbJiVde05hbWV9KFteOyYlPF0qfHtTfSs7Kikgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuWE1MIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfQ09OVEVOVDsNCi19DQotDQotDQotPFNUX0JMT0NLX1RBR19TQ0FOPiAufFxyfFxuIHsNCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOw0KLQl9DQotDQotLiB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiISEhdW5leHBlY3RlZCEhITogXCIiICsgeXl0ZXh0KCkgKyAiXCI6IiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkDQotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBVTkRFRklORUQ7DQotfQ0KLQ0KLVwwNDAgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlNQQUNFIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLVwwMTEgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIjB4OSIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi1cMDE1IA0KLXsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDQVJSSUFHRSBSRVRVUk4iKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQotXDAxMiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiTElORSBGRUVEIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleC5jbWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWU4MTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleC5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUBlY2hvIG9mZg0KLWNtZCAvYyBmbGV4eC5jbWQNCi1jbWQgL2MgZmxleGouY21kDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4LnNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2I2ZTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyEvYmluL3NoDQotZXhwb3J0IFBBVEg9JFBBVEg6L29wdC9JQk1KYXZhMi0xMzEvYmluLzovb3B0L0lCTUphdmEyLTEzL2Jpbi86L29wdC9qZGsxLjQNCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwIEpGbGV4L2xpYi9zZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiBKU1BUb2tlbml6ZXIuamZsZXggLXNrZWwgc2tlbGV0b24uc3NlDQotamF2YSAtWG14NDcwMDAwMDAwIC1jcCBKRmxleC9saWIvc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gWE1MVG9rZW5pemVyLmpmbGV4IC1za2VsIHNrZWxldG9uLnNzZQ0KLXJtIC1mIEpTUFRva2VuaXplci5qYXZhfiBKU1BUb2tlbml6ZXJ+IFhNTFRva2VuaXplci5qYXZhfiBYTUxUb2tlbml6ZXJ+DQotY3AgLXYgWE1MVG9rZW5pemVyLmphdmEgLi4vLi4vLi4vLi4vc2VkbW9kZWwvY29tL2libS9zZWQvcGFyc2VyL2ludGVybmFsDQotY3AgLXYgSlNQVG9rZW5pemVyLmphdmEgLi4vLi4vLi4vLi4vc2VkbW9kZWwvY29tL2libS9zZWQvcGFyc2VyL2ludGVybmFsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4ai5jbWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXhqLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxMGUzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXhqLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotQGVjaG8gb2ZmDQotUEFUSD0lUEFUSCU7ZDpcamRrNl8wMVxiaW4NCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwIGQ6XEpGbGV4XDEuMi4yXGxpYlxKRmxleC5qYXI7LiBKRmxleC5NYWluIEpTUFRva2VuaXplci5qZmxleCAtc2tlbCBza2VsZXRvbi5zc2UgJiYgcm0gLWYgSlNQVG9rZW5pemVyLmphdmF+IEpTUFRva2VuaXplcn4gJiYgY29weSBKU1BUb2tlbml6ZXIuamF2YSAuLlwuLlwuLlwuLlwuLlxvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmVcc3JjXG9yZ1xlY2xpcHNlXGpzdFxqc3BcY29yZVxpbnRlcm5hbFxwYXJzZXJcXGludGVybmFsXEpTUFRva2VuaXplci5qYXZhDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4eC5jbWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXh4LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiMWY4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXh4LmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotQGVjaG8gb2ZmDQotUEFUSD0lUEFUSCU7YzpcamRrMS40LjJfMDhcYmluDQotamF2YSAtWG14NDcwMDAwMDAwIC1jcCBkOlxKRmxleFwxLjIuMlxsaWJcSkZsZXguamFyOy4gSkZsZXguTWFpbiBYTUxUb2tlbml6ZXIuamZsZXggLXNrZWwgc2tlbGV0b24uc3NlICYmIHJtIC1mIFhNTFRva2VuaXplci5qYXZhfiBYTUxUb2tlbml6ZXJ+ICYmIGNvcHkgWE1MVG9rZW5pemVyLmphdmEgLi5cLi5cLi5cLi5cLi5cb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlXHNyY1xvcmdcZWNsaXBzZVx3c3RceG1sXGNvcmVcaW50ZXJuYWxccGFyc2VyXFhNTFRva2VuaXplci5qYXZhDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9za2VsZXRvbi5zc2UgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxZDNjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0NCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLw0KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsNCi0NCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLw0KLS0tLSAgbGV4aWNhbCBzdGF0ZXMsIGNoYXJtYXANCi0NCi0gIC8qIGVycm9yIGNvZGVzICovDQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7DQotICAvLyBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7DQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOw0KLQ0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gew0KLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAkJLy8kTk9OLU5MUy0xJA0KLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAkJLy8kTk9OLU5MUy0xJA0KLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCQkvLyROT04tTkxTLTEkDQotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIJLy8kTk9OLU5MUy0xJA0KLSAgfTsNCi0NCi0tLS0gaXNGaW5hbCBsaXN0DQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLw0KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7DQotDQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7DQotDQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsNCi0NCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovDQotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07DQotDQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8NCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsNCi0NCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7DQotDQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOw0KLQ0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOw0KLQ0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZA0KLSAgICAgIGZyb20gaW5wdXQgKi8NCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7DQotDQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotICAvLyBwcml2YXRlIGludCB5eWxpbmU7DQotDQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotICBwcml2YXRlIGludCB5eWNoYXI7DQotDQotICAvKioNCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSANCi0gICAqIG1hdGNoZWQgdGV4dA0KLSAgICovDQotICAvLyBwcml2YXRlIGludCB5eWNvbHVtbjsgDQotDQotICAvKiogDQotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUNCi0gICAqLw0KLSAgLy8gcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOw0KLQ0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsNCi0NCi0tLS0gdXNlciBjbGFzcyBjb2RlDQotDQotICAvKioNCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcg0KLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLg0KLSAgICoNCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLg0KLSAgICovDQotLS0tIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uDQotDQotDQotICAvKioNCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLg0KLSAgICoNCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQ0KLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuDQotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzDQotICAgKi8NCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7DQotDQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8NCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107DQotDQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gDQotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOw0KLQ0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8NCi0NCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8NCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsNCi0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCANCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgDQotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7DQotDQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8NCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOw0KLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOw0KLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOw0KLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7DQotICAgIH0NCi0NCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLw0KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7DQotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovDQotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07DQotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7DQotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOw0KLSAgICB9DQotDQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLw0KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOw0KLQ0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7DQotDQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOw0KLQ0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107DQotICB9DQotDQotICAgIA0KLSAgLyoqDQotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4NCi0gICAqLw0KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsNCi0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovDQotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLw0KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7DQotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQ0KLSAgICoNCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUNCi0gICAqLw0KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsNCi0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsNCi0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4NCi0gICAqLw0KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsNCi0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIC0gZnJvbSB0aGUgU0VEIEpGbGV4IHNrZWxldG9uDQotICAgKg0KLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkNCi0gICAqLw0KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7DQotICAgIHRyeSB7DQotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsNCi0gICAgfQ0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsNCi0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsNCi0gICAgfQ0KLSAgICAvLyBETyBOT1QgRVhJVCB0aGUgVk0gb24gYW4gZXJyb3INCi0gICAgLy8gU3lzdGVtLmV4aXQoMSk7DQotICB9IA0KLQ0KLQ0KLSAgLyoqDQotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4NCi0gICAqDQotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kDQotICAgKg0KLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uDQotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSENCi0gICAqLw0KLSAgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsNCi0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkNCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7DQotDQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7DQotICB9DQotDQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKGNoYXJbXSBtYXJrZXJUYWdOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgdGFnbmFtZUxlbmd0aCkgew0KLQkJZm9yKGludCBqID0gMDsgaiA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBqKyspIHsNCi0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpZkJsb2NrTWFya2Vycy5nZXQoaik7DQotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5sZW5ndGgoKSA9PSB0YWduYW1lTGVuZ3RoKSB7DQotCQkJCWJvb2xlYW4gbWF0Y2hlc1NvRmFyID0gdHJ1ZTsNCi0JCQkJZm9yKGludCBpID0gMDsgaSA8IHRhZ25hbWVMZW5ndGggJiYgbWF0Y2hlc1NvRmFyOyBpKyspIHsNCi0JCQkJCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgew0KLQkJCQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpICE9IG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pDQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSB7DQotCQkJCQkJaWYoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkpDQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWlmKG1hdGNoZXNTb0ZhcikNCi0JCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQNCi0JICoNCi0JICogUmV0dXJuIEFMTCBvZiB0aGUgcmVnaW9ucyBzY2FubmFibGUgd2l0aGluIHRoZSByZW1haW5pbmcgdGV4dA0KLQkgKiBOb3RlOiBmb3IgdmVyaWZpY2F0aW9uIHVzZQ0KLQkgKi8NCi0JcHVibGljIGZpbmFsIExpc3QgZ2V0UmVnaW9ucygpIHsNCi0JCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7DQotCQkJd2hpbGUocmVnaW9uICE9IG51bGwpIHsNCi0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7DQotCQkJCQl0b2tlbnMuYWRkKHJlZ2lvbik7DQotCQkJCX0NCi0JCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFN0YWNrT3ZlcmZsb3dFcnJvciBlKSB7DQotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSsiOiBpbnB1dCBjb3VsZCBub3QgYmUgdG9rZW5pemVkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0T2Zmc2V0KCksIGUpOy8vJE5PTi1OTFMtMSQNCi0JCQl0aHJvdyBlOw0KLQkJfQ0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJLy8gU2luY2UgdGhpcyBpcyBjb252ZW5pZW5jZSBtZXRob2QgYW5kIE5PVCB0aGUgcmVjb21tZW5kZWQgDQotCQkJLy8gd2F5IG9mIGdldHRpbmcgdG9rZW5zLCBtYW55IGVycm9ycyBhcmUgc2ltcGx5IGhpZGRlbg0KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiBub3QgaGFuZGxlZCByZXRyaWV2aW5nIHJlZ2lvbnM6ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJcmV0dXJuIHRva2VuczsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgdm9pZCBkdW1wKFN0cmluZyBzKSB7DQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocyArICIgKCIgKyB5eWNoYXIgKyAiLSIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJA0KLQkJCQkoeXlsZW5ndGgoKSArIHl5Y2hhcikgKyAiKTpcJyIgKy8vJE5PTi1OTFMtMSQNCi0JCQkJCVN0cmluZ1V0aWxzLmVzY2FwZSh5eXRleHQoKSkgKyAiXCciKTsvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0JLyogdXNlciBtZXRob2QgIC0gc2tlbGV0b24uc2VkICovDQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgew0KLQkJcmV0dXJuIHl5X2F0RU9GOw0KLQl9DQotLyogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQgKi8NCi1wcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoU3RyaW5nIG1hcmtlclRhZ05hbWUpIHsNCi0JSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQl3aGlsZShibG9ja3MuaGFzTmV4dCgpKSB7DQotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpYmxvY2tzLm5leHQoKTsNCi0JCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgew0KLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG1hcmtlclRhZ05hbWUpKQ0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShtYXJrZXJUYWdOYW1lKSkNCi0JCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0tLS0geXlfZG9Fb2YNCi0gIC8qKg0KLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwNCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4NCi0gICAqDQotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4NCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMNCi0gICAqLw0KLS0tLSB5eWxleCBkZWNsYXJhdGlvbg0KLSAgICBpbnQgeXlfaW5wdXQ7DQotICAgIGludCB5eV9hY3Rpb247DQotDQotLS0tIGxvY2FsIGRlY2xhcmF0aW9ucw0KLQ0KLSAgICB3aGlsZSAodHJ1ZSkgew0KLQ0KLS0tLSBzdGFydCBhZG1pbiAobGluZSwgY2hhciwgY29sIGNvdW50KQ0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOw0KLQ0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7DQotDQotLS0tIHN0YXJ0IGFkbWluIChsZXhzdGF0ZSBldGMpDQotDQotICAgICAgeXlfZm9yQWN0aW9uOiB7DQotICAgICAgICB3aGlsZSAodHJ1ZSkgew0KLSAgICANCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7DQotDQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247DQotDQotLS0tIGxpbmUsIGNvbCwgY2hhciBjb3VudCwgbmV4dCB0cmFuc2l0aW9uLCBpc0ZpbmFsIGFjdGlvbg0KLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyANCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyANCi0tLS0gbGluZSBjb3VudCB1cGRhdGUNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0tLS0gY2hhciBjb3VudCB1cGRhdGUNCi0NCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICANCi0NCi0tLS0gYWN0aW9ucw0KLSAgICAgICAgZGVmYXVsdDogDQotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgew0KLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsNCi0tLS0gZW9mdmFsdWUNCi0gICAgICAgICAgfSANCi0gICAgICAgICAgZWxzZSB7DQotLS0tIG5vIG1hdGNoDQotICAgICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0gICAgDQotDQotLS0tIG1haW4NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9za2VsZXRvbi5zc2UucmVhZG1lIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9za2VsZXRvbi5zc2UucmVhZG1lCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjg5NzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlLnJlYWRtZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotVGhlIHNrZWxldG9uLnNlZCBmaWxlIGNvbnRhaW5zIHRoZSBtb2RpZmllZCBKRmxleCAxLjIuMiBza2VsZXRvbiBmaWxlIHdpdGgNCi1jaGFuZ2VzIGZvciB1c2Ugd2l0aCB0aGUgdG9rZW5pemVycyB3aXRoaW4gdGhlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS54bWwgYW5kDQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmpzcCBwbHVnaW5zLg0KLQ0KLVRoZSBza2VsZXRvbiBmaWxlJ3MgbWV0aG9kIGRlZmluaXRpb25zIGFyZSBjb3BpZWQgaW50byB0aGUgZ2VuZXJhdGVkIG91dHB1dA0KLWRpcmVjdGx5Lg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkODNkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0idG9rZW5pemVyIiBkZWZhdWx0PSJDU1NUb2tlbml6ZXIiPgotCTx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0icHJvcGVydGllcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3b3Jrc3BhY2UuZGlyIiB2YWx1ZT0iLi4vLi4iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImpmbGV4LmphciIgdmFsdWU9Ii9EZXZUaW1lU3VwcG9ydC9KRmxleC9saWIvc2VkLWpmbGV4LmphciIvPgotCQk8cHJvcGVydHkgbmFtZT0iamZsZXgubWF4bWVtb3J5IiB2YWx1ZT0iNDcwMDAwMDAwIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJqZmxleC5vcHQiIHZhbHVlPSItc2tlbCBTZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IkNTU1Rva2VuaXplciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZmlsZSIgdmFsdWU9IkNTU1Rva2VuaXplci5qZmxleCIvPgkJCQotCQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY3NzL3NyYy9jb20vaWJtL3NzZS9tb2RlbC9jc3MvaW50ZXJuYWwvcGFyc2VyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmaW5hbGRlc3QuZGlyIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYnVpbGQtdG9rZW5pemVyIj4KLQkJCTxwYXJhbSBuYW1lPSJqZmxleC5vcHQiIHZhbHVlPSIiLz4KLQkJPC9hbnRjYWxsPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJYTUxUb2tlbml6ZXIiIGRlcGVuZHM9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IlNlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5maWxlIiB2YWx1ZT0iWE1MVG9rZW5pemVyIi8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS54bWwvc3JjL2NvbS9pYm0vc3NlL21vZGVsL3htbC9pbnRlcm5hbC9wYXJzZXIiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC10b2tlbml6ZXIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iSlNQVG9rZW5pemVyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJTZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZmlsZSIgdmFsdWU9IkpTUFRva2VuaXplci5qZmxleCIvPgkJCQotCQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuanNwL3NyYy9jb20vaWJtL3NzZS9tb2RlbC9qc3AvcGFyc2VyL2ludGVybmFsIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYnVpbGQtdG9rZW5pemVyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLXRva2VuaXplciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0icnVuLWpmbGV4Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iY29weSIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImNsZWFuIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InJ1bi1qZmxleCIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxqYXZhIGNsYXNzbmFtZT0iSkZsZXguTWFpbiIgbWF4bWVtb3J5PSIke2pmbGV4Lm1heG1lbW9yeX0iIGZvcms9InllcyIgPgotCQkJPGFyZyBsaW5lPSIke3NyYy5kaXJ9LyR7c3JjLmZpbGV9ICR7amZsZXgub3B0fSIvPgotCQkJPGNsYXNzcGF0aD4KLQkJCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amZsZXguamFyfSIvPgotCQkJPC9jbGFzc3BhdGg+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNvcHkiIGRlcGVuZHM9ImluaXQiPgotCQk8Y29weSB0b2Rpcj0iJHt3b3Jrc3BhY2UuZGlyfS8ke2Rlc3QuZGlyfSIgb3ZlcndyaXRlPSJ0cnVlIiB2ZXJib3NlPSJ0cnVlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXZhIi8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvY29weT4KLQkJPGNvcHkgdG9kaXI9IiR7d29ya3NwYWNlLmRpcn0vJHtmaW5hbGRlc3QuZGlyfSIgb3ZlcndyaXRlPSJ0cnVlIiB2ZXJib3NlPSJ0cnVlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXZhIi8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvY29weT4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGRlbGV0ZSB2ZXJib3NlPSJ0cnVlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgZGVmYXVsdGV4Y2x1ZGVzPSJubyI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKn4iLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0JCi0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9kZXZUaW1lU3VwcG9ydEluZm8udHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvZGV2VGltZVN1cHBvcnRJbmZvLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjNzc2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9kZXZUaW1lU3VwcG9ydEluZm8udHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCi0KLVRoaXMgZGlyZWN0b3J5LCBEZXZUaW1lU3VwcG9ydCwgbm9ybWFsbHkgY29udGFpbnMKLXRoZSBzb3VyY2UgZm9yIHNvbWUgb2Ygb3VyIHBhcnNlciBnZW5lcmF0b3JzLiAKLQotU2VlIDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC93ZWJ0b29scy9zb3VyY2VlZGl0aW5nL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0Ci0KLVRoaXMgcGFydGljdWxhciB0ZXh0IGZpbGUgeW91IGFyZSByZWFkaW5nIAotaXMgdGhlIG9ubHkgb25lIHNoaXBwZWQgCi13aXRoIGFuIFNESyBidWlsZCwgc2luY2UgdGhlIG90aGVyIGZpbGVzIAotYXJlIHNlbGRvbSBuZWVkZWQgZHVyaW5nIGRldmVsb3BtZW50IG9yIGRlYnVnZ2luZywgCi1hbmQgc29tZSBvZiB0aG9zZSBmaWxlcyBjYXVzZSBwcm9ibGVtcyB3aXRoIGxvbmcgCi1maWxlbmFtZSBvciBwYXRocyB0aGF0IGVuZCB1cCBiZWluZyB0b28gbG9uZyBmb3IgCi1zb21lIHBsYXRmb3JtcywgYW5kIHNvbWUgdW56aXAgcHJvZ3JhbXMuIAotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTdiY2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjYwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5tb2RlbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3M7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dCwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIgotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnV0aWw7IHZlcnNpb249IjMuOCIsCi0gY29tLmlibS5pY3UudGV4dDsgdmVyc2lvbj0iMy44IgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLmpvYnM7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4xMDAsMi4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXM7YnVuZGxlLXZlcnNpb249IjMuMi4wIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenk7ZXhjbHVkZTo9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm9wZXJ0eXRlc3RlciIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvUkVBRE1FLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYjNjY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotVGhlIGNvcmUgbW9kZWwgb2YgdGhlIHNzZSBmcmFtZXdvcmsuIEl0IHByb3ZpZGVzIHRoZSBiYXNlIGRvY3VtZW50IGNsYXNzZXMsCi1idWlsZGVycyBhbmQgcGFyc2Vycy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1NDFiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLWVuY29kaW5nLyxcCi0gICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICBzcmMtdGFza3RhZ3MvLFwKLSAgICAgICAgICAgc3JjLWNvbnRlbnRwcm9wZXJ0aWVzLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBjb25maWcvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIGRvYy8sXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICBEZXZUaW1lU3VwcG9ydC8KLW91dHB1dC4uID0gYmluLwotc3JjLmV4Y2x1ZGVzID0gRGV2VGltZVN1cHBvcnQvYnVpbGQueG1sLFwKLSAgICAgICAgICAgICAgIERldlRpbWVTdXBwb3J0L1NlZE1vZGVsLyxcCi0gICAgICAgICAgICAgICBEZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWUyMjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlIj4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvd2VidG9vbHMvd3N0L2NvbXBvbmVudHMvc3NlL292ZXJ2aWV3Lmh0bWwiPjwvZGVzY3JpcHRpb24+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcyIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JCTx0eXBlIG5hbWU9IklQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbiIgaW1wbGVtZW50PSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRFZGl0b3IiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JCTx0eXBlIG5hbWU9IlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcCIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29uZmlnL2NoYXJzZXQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9jaGFyc2V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MTVlNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29uZmlnL2NoYXJzZXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEgdGhlIG51bWJlciBvZiBjb2Rlc2V0IG5hbWVzCi10b3RhbG51bWJlcj0yNgotCi0hIE9ubHkgdHJhbnNsYXRlIHRoZSB4eC5sYWJlbCBzdHJpbmdzLiAgRG8gbm90IHRyYW5zbGF0ZSB0aGUgeHguaWFuYSBvciB4eC5qYXZhIHN0cmluZ3MuCi0KLWNvZGVzZXQuMC5sYWJlbD1JU08gMTA2NDYvVW5pY29kZShVVEYtOCkKLWNvZGVzZXQuMC5pYW5hPVVURi04Ci0KLWNvZGVzZXQuMS5sYWJlbD1JU08gMTA2NDYvVW5pY29kZShVVEYtMTYpIEJpZyBFbmRpYW4KLWNvZGVzZXQuMS5pYW5hPVVURi0xNgotCi1jb2Rlc2V0LjIubGFiZWw9SVNPIDEwNjQ2L1VuaWNvZGUoVVRGLTE2QkUpIEJpZyBFbmRpYW4KLWNvZGVzZXQuMi5pYW5hPVVURi0xNkJFCi0KLWNvZGVzZXQuMy5sYWJlbD1JU08gMTA2NDYvVW5pY29kZShVVEYtMTZMRSkgTGl0dGxlIEVuZGlhbgotY29kZXNldC4zLmlhbmE9VVRGLTE2TEUKLQotY29kZXNldC40LmxhYmVsPVVTIEFTQ0lJCi1jb2Rlc2V0LjQuaWFuYT1VUy1BU0NJSQotCi1jb2Rlc2V0LjUubGFiZWw9SVNPIExhdGluLTEKLWNvZGVzZXQuNS5pYW5hPUlTTy04ODU5LTEKLQotY29kZXNldC42LmxhYmVsPUlTTyBMYXRpbi05Ci1jb2Rlc2V0LjYuaWFuYT1JU08tODg1OS0xNQotCi0hIChTbGF2aWM6IEN6ZWNoLCBDcm9hdCwgR2VybWFuLCBIdW5nYXJpYW4sIFBvbGlzaCwgUm9tYW5pYW4sIFNsb3ZhaywgU2xvdmVuaWFuKQotY29kZXNldC43LmxhYmVsPUNlbnRyYWwvRWFzdCBFdXJvcGVhbiAoU2xhdmljKSAKLWNvZGVzZXQuNy5pYW5hPUlTTy04ODU5LTIKLQotISAoRXNwZXJhbnRvLCBHYWxpY2lhbiwgTWFsdGVzZSwgVHVya2lzaCkKLWNvZGVzZXQuOC5sYWJlbD1Tb3V0aGVybiBFdXJvcGVhbgotY29kZXNldC44LmlhbmE9SVNPLTg4NTktMwotCi1jb2Rlc2V0LjkubGFiZWw9QXJhYmljLCBMb2dpY2FsCi1jb2Rlc2V0LjkuaWFuYT1JU08tODg1OS02Ci0KLWNvZGVzZXQuMTAubGFiZWw9QXJhYmljCi1jb2Rlc2V0LjEwLmlhbmE9d2luZG93cy0xMjU2Ci0KLWNvZGVzZXQuMTEubGFiZWw9Q2hpbmVzZSwgTmF0aW9uYWwgU3RhbmRhcmQKLWNvZGVzZXQuMTEuaWFuYT1HQjE4MDMwCi0KLWNvZGVzZXQuMTIubGFiZWw9VHJhZGl0aW9uYWwgQ2hpbmVzZSwgQmlnNQotY29kZXNldC4xMi5pYW5hPUJJRzUKLQotISAoRXN0b25pYW4sIExhdHZpYW4sIExpdGh1YW5pYW4pCi1jb2Rlc2V0LjEzLmxhYmVsPUN5cmlsbGljLCBJU08tODg1OS00Ci1jb2Rlc2V0LjEzLmlhbmE9SVNPLTg4NTktNAotCi0hIChCdWxnYXJpYW4sIEJ5ZWxvcnVzc2lhbiwgTWFjZWRvbmlhbiwgU2VyYmlhbiwgVWtyYWluaWFuKQotY29kZXNldC4xNC5sYWJlbD1DeXJpbGxpYywgSVNPLTg4NTktNQotY29kZXNldC4xNC5pYW5hPUlTTy04ODU5LTUKLQotY29kZXNldC4xNS5sYWJlbD1HcmVlawotY29kZXNldC4xNS5pYW5hPUlTTy04ODU5LTcKLQotY29kZXNldC4xNi5sYWJlbD1IZWJyZXcsIFZpc3VhbAotY29kZXNldC4xNi5pYW5hPUlTTy04ODU5LTgKLQotISBsYWJlbD1IZWJyZXcsIExvZ2ljYWwKLSEgaWFuYT1JU08tODg1OS04LUkKLQotY29kZXNldC4xNy5sYWJlbD1IZWJyZXcKLWNvZGVzZXQuMTcuaWFuYT13aW5kb3dzLTEyNTUKLQotY29kZXNldC4xOC5sYWJlbD1KYXBhbmVzZSwgRVVDLUpQCi1jb2Rlc2V0LjE4LmlhbmE9RVVDLUpQCi0KLWNvZGVzZXQuMTkubGFiZWw9SmFwYW5lc2UsIElTTyAyMDIyCi1jb2Rlc2V0LjE5LmlhbmE9SVNPLTIwMjItSlAKLQotY29kZXNldC4yMC5sYWJlbD1KYXBhbmVzZSwgU2hpZnQtSklTCi1jb2Rlc2V0LjIwLmlhbmE9U2hpZnRfSklTCi0KLWNvZGVzZXQuMjEubGFiZWw9SmFwYW5lc2UsIFdpbmRvd3MtMzFKCi1jb2Rlc2V0LjIxLmlhbmE9d2luZG93cy0zMWoKLQotY29kZXNldC4yMi5sYWJlbD1Lb3JlYW4sIEVVQy1LUgotY29kZXNldC4yMi5pYW5hPUVVQy1LUgotCi1jb2Rlc2V0LjIzLmxhYmVsPUtvcmVhbiwgSVNPIDIwMjIKLWNvZGVzZXQuMjMuaWFuYT1JU08tMjAyMi1LUgotCi1jb2Rlc2V0LjI0LmxhYmVsPVRoYWksIFRJU0kKLWNvZGVzZXQuMjQuaWFuYT1USVMtNjIwCi0KLWNvZGVzZXQuMjUubGFiZWw9VHVya2lzaAotY29kZXNldC4yNS5pYW5hPUlTTy04ODU5LTkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9kZWZhdWx0SUFOQS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29uZmlnL2RlZmF1bHRJQU5BLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0N2VkNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29uZmlnL2RlZmF1bHRJQU5BLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoaXMgZmlsZSBsaXN0cyBjaGFyc2V0IG1hcHBpbmdzIGJldHdlZW4gYW4gZW5jb2RpbmcgYW5kIGl0cyBkZWZhdWx0Ci0jIGVxdWl2YWxlbnQgZW5jb2RpbmcgbGlzdGVkIGluIGNoYXJzZXQucHJvcGVydGllcwotIyBmb3JtYXQ6IGFueW5hbWU9aWFuYSBuYW1lIGxpc3RlZCBpbiBjaGFyc2V0LnByb3BlcnRpZXMKLQotIyBObyB0cmFuc2xhdGlvbiBuZWNlc3NhcnkKLXdpbmRvd3MtMTI1Mj1JU08tODg1OS0xCi13aW5kb3dzLTkzMj1TaGlmdF9KSVMKLXgtZXVjLWpwLWxpbnV4PUVVQy1KUCAKLXdpbmRvd3MtOTQ5PUVVQy1LUgoteC13aW5kb3dzLTk0OT1FVUMtS1IKLXdpbmRvd3MtOTUwPUJJRzUKLXgtd2luZG93cy05NTA9QklHNQotd2luZG93cy05MzY9R0IxODAzMAoteC1tc3dpbi05MzY9R0IxODAzMAotR0IyMzEyPUdCMTgwMzAKLXgtRVVDLUNOPUdCMTgwMzAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9vdmVycmlkZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29uZmlnL292ZXJyaWRlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNzAzYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29uZmlnL292ZXJyaWRlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGlzIGZpbGUgbGlzdHMgY2hhcnNldCBtYXBwaW5ncyB3aGljaCBzdXBwbGVtZW50IG9yIG92ZXJyaWRlIHRob3NlCi0jIHByb3ZpZGVkIGJ5IHRoZSBWTS4gVGhlcmUgYXJlIGZldyBjYXNlcyB3aGVyZSB0aGlzIHNob3VsZCBiZSByZXF1aXJlZC4KLSMgTm90ZTogdGhlcmUgaXMgbm8gaW50ZWdyZXR5IGNoZWNraW5nIHRvIHNlZSBpZiB0aGUgdmFsaWRDaGFyc2V0TmFtZSBpcyBpbmRlZWQKLSMgdmFsaWQgZm9yIGEgZ2l2ZW4gVk0sIHNvIGVycm9ycyB3b3VsZCBvbmx5IHNob3cgdXAgd2hlbiBhdHRlbXB0ZWQgdG8gCi0jIGJlIHVzZWQuCi0KLSMgTm8gdHJhbnNsYXRpb24gbmVjZXNzYXJ5Ci0KLSMgZm9ybWF0OiBhbnluYW1lPXZhbGlkamF2YUNoYXJzZXROYW1lCi1JU08tODg1OS04LUk9SVNPLTg4NTktOAotWC1TSklTPVNoaWZ0X0pJUwotWC1FVUMtSlA9U2hpZnRfSklTCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb2MvYm9vay5jc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb2MvYm9vay5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNzhjZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL2Jvb2suY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLVAuQ29kZSB7DQotCWRpc3BsYXk6IGJsb2NrOw0KLQl0ZXh0LWFsaWduOiBsZWZ0Ow0KLQl0ZXh0LWluZGVudDogMC4wMHB0Ow0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAxNXB0Ow0KLQlmb250LXNpemU6IDEwLjAwMDAwMHB0Ow0KLQlmb250LXdlaWdodDogbWVkaXVtOw0KLQlmb250LXN0eWxlOiBSZWd1bGFyOw0KLQljb2xvcjogIzQ0NDRDQzsNCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7DQotCXRleHQtdHJhbnNmb3JtOiBub25lOw0KLQlmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IjsNCi19DQotSDYuQ2FwdGlvbkZpZ0NvbHVtbiB7DQotCWRpc3BsYXk6IGJsb2NrOw0KLQl0ZXh0LWFsaWduOiBsZWZ0Ow0KLQl0ZXh0LWluZGVudDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXRvcDogMy4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMTEuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDAuMDAwMDAwcHQ7DQotCWZvbnQtc2l6ZTogOS4wMDAwMDBwdDsNCi0JZm9udC13ZWlnaHQ6IG1lZGl1bTsNCi0JZm9udC1zdHlsZTogSXRhbGljOw0KLQljb2xvcjogIzAwMDAwMDsNCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7DQotCXRleHQtdHJhbnNmb3JtOiBub25lOw0KLQlmb250LWZhbWlseTogIkFyaWFsIjsNCi19DQotUC5Ob3RlIHsNCi0JZGlzcGxheTogYmxvY2s7DQotCXRleHQtYWxpZ246IGxlZnQ7DQotCXRleHQtaW5kZW50OiAwcHQ7DQotCW1hcmdpbi10b3A6IDE5LjUwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAxOS41MDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMzBwdDsNCi0JZm9udC1zaXplOiAxMS4wMDAwMDBwdDsNCi0JZm9udC13ZWlnaHQ6IG1lZGl1bTsNCi0JZm9udC1zdHlsZTogSXRhbGljOw0KLQljb2xvcjogIzAwMDAwMDsNCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7DQotCXRleHQtdHJhbnNmb3JtOiBub25lOw0KLQlmb250LWZhbWlseTogIkFyaWFsIjsNCi19DQotRU0uVUlMYWJlbCB7DQotCWZvbnQtd2VpZ2h0OiBCb2xkOw0KLQlmb250LXN0eWxlOiBSZWd1bGFyOw0KLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsNCi0JdGV4dC10cmFuc2Zvcm06IG5vbmU7DQotfQ0KLUVNLkNvZGVOYW1lIHsNCi0JZm9udC13ZWlnaHQ6IEJvbGQ7DQotCWZvbnQtc3R5bGU6IFJlZ3VsYXI7DQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOw0KLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsNCi0JZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IjsNCi19DQotDQotDQotDQotDQotLyogZm9sbG93aW5nIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgbmVlZCB0byBiZSByZW1vdmVkIGZvciBEQkNTICovDQotDQotYm9keSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgcCwgdGFibGUsIHRkLCBjYXB0aW9uLCB0aCwgdWwsIG9sLCBkbCwgbGksIGRkLCBkdCB7Zm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGNvbG9yOiAjMDAwMDAwfQ0KLXByZQkJCQl7IGZvbnQtZmFtaWx5OiBDb3VyaWVyLCBtb25vc3BhY2V9DQotDQotLyogZW5kIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgKi8NCi0NCi0vKiBmb2xsb3dpbmcgZm9udCBzaXplIGRlY2xhcmF0aW9ucyBzaG91bGQgYmUgT0sgZm9yIERCQ1MgKi8NCi1ib2R5LCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBwLCB0YWJsZSwgdGQsIGNhcHRpb24sIHRoLCB1bCwgb2wsIGRsLCBsaSwgZGQsIGR0IHtmb250LXNpemU6IDEwcHQ7IH0NCi1wcmUJCQkJeyBmb250LXNpemU6IDEwcHR9DQotDQotLyogZW5kIGZvbnQgc2l6ZSBkZWNsYXJhdGlvbnMgKi8NCi0NCi1ib2R5CSAgICAgeyBiYWNrZ3JvdW5kOiAjRkZGRkZGfQ0KLWgxICAgICAgICAgICB7IGZvbnQtc2l6ZTogMThwdDsgbWFyZ2luLXRvcDogNTsgbWFyZ2luLWJvdHRvbTogMSB9CQ0KLWgyICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTRwdDsgbWFyZ2luLXRvcDogMjU7IG1hcmdpbi1ib3R0b206IDMgfQ0KLWgzICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTFwdDsgbWFyZ2luLXRvcDogMjA7IG1hcmdpbi1ib3R0b206IDMgfQ0KLWg0ICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTBwdDsgbWFyZ2luLXRvcDogMjA7IG1hcmdpbi1ib3R0b206IDM7IGZvbnQtc3R5bGU6IGl0YWxpYyB9DQotcCAgICAgICAgICAgIHsgbWFyZ2luLXRvcDogMTBweDsgbWFyZ2luLWJvdHRvbTogMTBweCB9DQotcHJlCSAgICAgeyBtYXJnaW4tbGVmdDogNjsgZm9udC1zaXplOiA5cHQgfQ0KLWE6bGluawkgICAgIHsgY29sb3I6ICMwMDAwRkYgfQ0KLWE6aG92ZXIJICAgICB7IGNvbG9yOiAjMDAwMDgwIH0NCi1hOnZpc2l0ZWQgICAgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSB9DQotdWwJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDEwIH0NCi1saQkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMCB9IA0KLWxpIHAJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDAgfSANCi1vbAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMTAgfQ0KLWRsCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxMCB9DQotZHQJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDA7IGZvbnQtd2VpZ2h0OiBib2xkIH0NCi1kZAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMCB9DQotc3Ryb25nCSAgICAgeyBmb250LXdlaWdodDogYm9sZH0NCi1lbQkgICAgIHsgZm9udC1zdHlsZTogaXRhbGljfQ0KLXZhcgkgICAgIHsgZm9udC1zdHlsZTogaXRhbGljfQ0KLWRpdi5yZXZpc2lvbiB7IGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDsgYm9yZGVyLWxlZnQtd2lkdGg6IHRoaW47IA0KLQkJCQkgICBib3JkZXItbGVmdC1jb2xvcjogIzdCNjhFRTsgcGFkZGluZy1sZWZ0OjUgfQ0KLXRoCSAgICAgeyBmb250LXdlaWdodDogYm9sZCB9DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL3NjaGVtYS5jc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb2Mvc2NoZW1hLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmYmYyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb2Mvc2NoZW1hLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLUg2LkNhcHRpb25GaWdDb2x1bW4jaGVhZGVyIHsNCi0JZm9udC1zaXplOjE2cHg7IA0KLQlkaXNwbGF5OmlubGluZQ0KLX0NCi0NCi1QLk5vdGUjY29weXJpZ2h0IHsNCi0JZm9udC1zaXplOiBzbWFsbGVyOyANCi0JZm9udC1zdHlsZTogbm9ybWFsOw0KLQljb2xvcjogIzMzNjY5OTsgDQotCWRpc3BsYXk6aW5saW5lOw0KLQltYXJnaW4tdG9wOiAzLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAxMS4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsNCi19DQotDQotUC5Db2RlI2R0ZCB7DQotCWNvbG9yOiAjODAwMDAwOyANCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMTAuMDAwMDAwcHQ7DQotfQ0KLQ0KLVAuQ29kZSNkdGRBdHRsaXN0IHsNCi0JY29sb3I6ICM4MDAwMDA7IA0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAyMC4wMDAwMDBwdDsNCi19DQotDQotUC5Db2RlI3RhZyB7DQotCWNvbG9yOiAjMDAwMDgwOyANCi0JZGlzcGxheTppbmxpbmU7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDAuMDAwMDAwcHQ7DQotfQ0KLQ0KLVAuQ29kZSNjc3RyaW5nIHsNCi0JY29sb3I6ICMwMDgwMDA7IA0KLQlkaXNwbGF5OmlubGluZTsNCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsJDQotfQ0KLQ0KLS5Db25maWdNYXJrdXAjZWxlbWVudERlc2Mgew0KLQljb2xvcjogYmxhY2s7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDEwLjAwMDAwMHB0Ow0KLX0NCi0NCi0uQ29uZmlnTWFya3VwI2F0dGxpc3REZXNjIHsNCi0JY29sb3I6IGJsYWNrOw0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAzMi4wMDAwMDBwdDsNCi19DQotDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvaGFuZHlTdHVmZi5qcGFnZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2hhbmR5U3R1ZmYuanBhZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NDdiNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvaGFuZHlTdHVmZi5qcGFnZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjMyNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIE1vZGVsCi0jIGV4dGVuc2lvbiBuYW1lcwotQWRhcHRfT25fQ3JlYXRlX0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWU9QWRhcHQgT24gQ3JlYXRlIEZhY3RvcnkgRXh0ZW5zaW9uCi1Eb2N1bWVudF9UeXBlc19FeHRlbnNpb24ubmFtZT1Eb2N1bWVudCBUeXBlcyBFeHRlbnNpb24KLUpTUF9FbWJlZGRlZF9Db250ZW50X1R5cGVfSGFuZGxlcl9FeHRlbnNpb24ubmFtZT1KU1AgRW1iZWRkZWQgQ29udGVudCBUeXBlIEhhbmRsZXIgRXh0ZW5zaW9uCi1Db250ZW50X1R5cGVfRmFjdG9yeV9Db250cmlidXRpb25fRXh0ZW5zaW9uLm5hbWU9Q29udGVudCBUeXBlIEZhY3RvcnkgQ29udHJpYnV0aW9uIEV4dGVuc2lvbgotQ1NTX1Byb2ZpbGVfRXh0ZW5zaW9uLm5hbWU9Q1NTIFByb2ZpbGUgRXh0ZW5zaW9uCi1Db21tZW50X0VsZW1lbnRfSGFuZGxlcl9FeHRlbnNpb24ubmFtZT1Db21tZW50IEVsZW1lbnQgSGFuZGxlciBFeHRlbnNpb24KLU1vZGVsX0hhbmRsZXJfRXh0ZW5zaW9uLm5hbWU9TW9kZWwgSGFuZGxlciBFeHRlbnNpb24KLUZvcm1hdF9Qcm9jZXNzb3JzX0V4dGVuc2lvbl9Qb2ludC5uYW1lPUZvcm1hdCBQcm9jZXNzb3JzIEV4dGVuc2lvbiBQb2ludAotVGFza19TY2FubmVyX0V4dGVuc2lvbl9Qb2ludC5uYW1lPVRhc2sgU2Nhbm5lciBFeHRlbnNpb24gUG9pbnQKLVN0cnVjdHVyZWRfU291cmNlc19UYXNrX0V4dGVuc2lvbi5uYW1lPURldGVjdGVkIFRhc2sKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjlkNzY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCi0JPCEtLSBkZXByZWNhdGVkIC0tPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImFkYXB0T25DcmVhdGVGYWN0b3J5IiBuYW1lPSIlQWRhcHRfT25fQ3JlYXRlX0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2FkYXB0T25DcmVhdGVGYWN0b3J5LmV4c2QiLz4KLQk8IS0tIG5vdCBmb3IgdXNlIGJ5IGNsaWVudHMgKGludGVybmFsKS0tPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImRvY3VtZW50VHlwZXMiIG5hbWU9IiVEb2N1bWVudF9UeXBlc19FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvZG9jdW1lbnRUeXBlcy5leHNkIi8+Ci0JPCEtLSBub3QgZm9yIHVzZSBieSBjbGllbnRzIChpbnRlcm5hbCktLT4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlbWJlZGRlZFR5cGVIYW5kbGVyIiBuYW1lPSIlSlNQX0VtYmVkZGVkX0NvbnRlbnRfVHlwZV9IYW5kbGVyX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9lbWJlZGRlZFR5cGVIYW5kbGVyLmV4c2QiLz4KLQk8IS0tIGRlcHJlY2F0ZWQgLS0+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0iY29udGVudFR5cGVGYWN0b3J5Q29udHJpYnV0aW9uIiBuYW1lPSIlQ29udGVudF9UeXBlX0ZhY3RvcnlfQ29udHJpYnV0aW9uX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9jb250ZW50VHlwZUZhY3RvcnlDb250cmlidXRpb24uZXhzZCIvPgotCTwhLS0gSSBjb21tZW50ZWQgb3V0IC4uLiBjbGllbnRzIHNob3VsZCBqdXN0IHVzZSB0aGUgbm9ybWFsIHBsYXRmb3JtIHdheSBvZiByZWdpc3RlcmluZyB0aGVzZSAKLQkJYWRhcHRlckZhY3Rvcmllcy4gQXQgd29yc3QsIHRoZXknZCBuZWVkIGEgc21hbGwgcGx1Z2luIHdpdGggJ3N0YXJ0dXAnIHNwZWNpZmllZCAuLi4gYnV0IHRoYXQncyAKLQkJYmV0dGVyIHRoYW4gdXMgZ2V0dGluZyBoaXQgd2l0aCB0aGUgcGVyZm9ybWFuY2UgaW1wYWN0IChvZiBsb2FkaW5nIHBsdWdpbnMgYW5kIHByZS1yZXFzLCBldGMuKS4gCi0JCTxleHRlbnNpb24tcG9pbnQgaWQ9InVyaVJlc29sdmVyQWRhcHRlckZhY3RvcnkiIG5hbWU9IlJlc291cmNlIEFkYXB0ZXIgRmFjdG9yeSBmb3IgQ3JlYXRpbmcgVVJJUmVzb2x2ZXJzIi8+Ci0JLS0+Ci0JPCEtLSBub3QgZm9yIHVzZSBieSBjbGllbnRzIChpbnRlcm5hbCktLT4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjc3Nwcm9maWxlIiBuYW1lPSIlQ1NTX1Byb2ZpbGVfRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2Nzc3Byb2ZpbGUuZXhzZCIvPgotCTwhLS0gbm90IGZvciB1c2UgYnkgY2xpZW50cyAoaW50ZXJuYWwpLS0+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0iY29tbWVudEVsZW1lbnRIYW5kbGVyIiBuYW1lPSIlQ29tbWVudF9FbGVtZW50X0hhbmRsZXJfRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2NvbW1lbnRFbGVtZW50SGFuZGxlci5leHNkIi8+Ci0KLQk8IS0tIG5vdCBmb3IgdXNlIGJ5IGNsaWVudHMgKGludGVybmFsKS0tPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9Im1vZGVsSGFuZGxlciIgbmFtZT0iJU1vZGVsX0hhbmRsZXJfRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL21vZGVsSGFuZGxlci5leHNkIi8+Ci0JPCEtLSBub3QgZm9yIHVzZSBieSBjbGllbnRzIChpbnRlcm5hbCktLT4KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCWlkPSJmb3JtYXRQcm9jZXNzb3JzIgotCQluYW1lPSIlRm9ybWF0X1Byb2Nlc3NvcnNfRXh0ZW5zaW9uX1BvaW50Lm5hbWUiCi0JCXNjaGVtYT0ic2NoZW1hL2Zvcm1hdFByb2Nlc3NvcnMuZXhzZCIgLz4KLQotCTwhLS0gbm90IGZvciB1c2UgYnkgY2xpZW50cyAoaW50ZXJuYWwpLS0+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0idGFza3NjYW5uZXIiIG5hbWU9IiVUYXNrX1NjYW5uZXJfRXh0ZW5zaW9uX1BvaW50Lm5hbWUiIHNjaGVtYT0ic2NoZW1hL3Rhc2tzY2FubmVyLmV4c2QiLz4KLQotCTwhLS0gTWFrZSBzdXJlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMgYXJlIHNldCBhdCBydW50aW1lIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JHcm91cCI+Ci0JCTxncm91cCBpZD0ic3RydWN0dXJlZE1vZGVsR3JvdXAiPgotCQkJPGxpc3RlbmVyIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdG9yR3JvdXBMaXN0ZW5lciIvPgotCQk8L2dyb3VwPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gRGVmaW5lIHRoZSBTdHJ1Y3R1cmVkRmlsZVByb3BlcnR5VGVzdGVyIGFzIGl0IHdpbGwgaGFuZGxlIHRyYWNpbmcgdGhlIGVudGlyZSAtLT4KLQk8IS0tIGNvbnRlbnQgdHlwZSBoaWVyYXJjaHkgZm9yIGEgZmlsZS4gT25seSBvcGVyYXRlcyBvbiBJRmlsZXMgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBEZXByZWNhdGVkLCBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4ODIxNiAgICAgICAgIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KLQkJPHByb3BlcnR5VGVzdGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3BlcnR5dGVzdGVyLlN0cnVjdHVyZWRGaWxlUHJvcGVydHlUZXN0ZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVyLlN0cnVjdHVyZWRGaWxlUHJvcGVydHlUZXN0ZXIiCi0JCQluYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5yZXNvdXJjZXMiCi0JCQlwcm9wZXJ0aWVzPSJjb250ZW50VHlwZUlkIgotCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgIDwvcHJvcGVydHlUZXN0ZXI+Ci0gPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9hZGFwdE9uQ3JlYXRlRmFjdG9yeS5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2FkYXB0T25DcmVhdGVGYWN0b3J5LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYmY4OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2FkYXB0T25DcmVhdGVGYWN0b3J5LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImFkYXB0T25DcmVhdGVGYWN0b3J5IiBuYW1lPSJBZGFwdCBPbiBDcmVhdGUgRmFjdG9yeSBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2NvbW1lbnRFbGVtZW50SGFuZGxlci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2NvbW1lbnRFbGVtZW50SGFuZGxlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNjODBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jb21tZW50RWxlbWVudEhhbmRsZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0iY29tbWVudEVsZW1lbnRIYW5kbGVyIiBuYW1lPSJDb21tZW50IEVsZW1lbnQgSGFuZGxlciBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJoYW5kbGVyLWN1c3RvbSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWN1c3RvbSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN0YXJ0d2l0aCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWVudHR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50SGFuZGxlciIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdGFydHdpdGgiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvY29udGVudFR5cGVGYWN0b3J5Q29udHJpYnV0aW9uLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvY29udGVudFR5cGVGYWN0b3J5Q29udHJpYnV0aW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmODQxOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2NvbnRlbnRUeXBlRmFjdG9yeUNvbnRyaWJ1dGlvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJjb250ZW50VHlwZUZhY3RvcnlDb250cmlidXRpb24iIG5hbWU9IkNvbnRlbnQgVHlwZSBGYWN0b3J5IENvbnRyaWJ1dGlvbiBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7IAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jc3Nwcm9maWxlLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvY3NzcHJvZmlsZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNlODUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jc3Nwcm9maWxlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJjc3Nwcm9maWxlIiBuYW1lPSJDU1MgUHJvZmlsZSBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2ZpbGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvZmlsZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9kb2N1bWVudFR5cGVzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZG9jdW1lbnRUeXBlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTBmMzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9kb2N1bWVudFR5cGVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJkb2N1bWVudFR5cGVzIiBuYW1lPSJEb2N1bWVudCBUeXBlcyBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRvY3VtZW50VHlwZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkb2N1bWVudFR5cGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbGVtZW50TmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXNwbGF5TmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZVVSSSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpc1hIVE1MIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJoYXNGcmFtZXNldCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHVibGljSUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3lzdGVtSUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdFhIVE1MIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpc1dNTCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdFdNTCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9lbWJlZGRlZFR5cGVIYW5kbGVyLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZW1iZWRkZWRUeXBlSGFuZGxlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmNkZThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9lbWJlZGRlZFR5cGVIYW5kbGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJlbWJlZGRlZFR5cGVIYW5kbGVyIiBuYW1lPSJKU1AgRW1iZWRkZWQgQ29udGVudCBUeXBlIEhhbmRsZXIgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbWJlZGRlZFR5cGVIYW5kbGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImVtYmVkZGVkVHlwZUhhbmRsZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2Zvcm1hdFByb2Nlc3NvcnMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9mb3JtYXRQcm9jZXNzb3JzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZDczMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2Zvcm1hdFByb2Nlc3NvcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0iZm9ybWF0UHJvY2Vzc29ycyIgbmFtZT0iRm9ybWF0IFByb2Nlc3NvcnMgRXh0ZW5zaW9uIFBvaW50Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9jZXNzb3IiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icHJvY2Vzc29yIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdFByb2Nlc3NvcnMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O3Byb2Nlc3Nvcg0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS54bWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTCZxdW90Ow0KLSAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9JnF1b3Q7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCZxdW90OyZndDsNCi0gICAgICAmbHQ7L3Byb2Nlc3NvciZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLQ0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL21vZGVsSGFuZGxlci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL21vZGVsSGFuZGxlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTMxZGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9tb2RlbEhhbmRsZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0ibW9kZWxIYW5kbGVyIiBuYW1lPSJNb2RlbCBIYW5kbGVyIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1vZGVsSGFuZGxlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtb2RlbEhhbmRsZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkFic3RyYWN0TW9kZWxIYW5kbGVyOiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFzc29jaWF0ZWRDb250ZW50VHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvdGFza3NjYW5uZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS90YXNrc2Nhbm5lci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjgwYTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS90YXNrc2Nhbm5lci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJ0YXNrc2Nhbm5lciIgbmFtZT0iVGFzayBTY2FubmVyIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGludGVybmFsPSJ0cnVlIiAvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzY2FubmVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNjYW5uZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZUlkcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBDb250ZW50IHR5cGUgaWRlbnRpZmllcnMgZm9yIHdoaWNoIHRoaXMgc2Nhbm5lciBhcHBsaWVzLCBzZXBhcmF0ZWQgYnkgY29tbWFzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFNjYW5uZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzLklGaWxlVGFza1NjYW5uZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0Fic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMGUzYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgc28gbm8gb25lIGNhcmVzIGFueXdheXMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciBpbXBsZW1lbnRzIElDb250ZW50U2V0dGluZ3NIYW5kbGVyIHsKLQotCi0JcHJpdmF0ZSBJQ29udGVudFNldHRpbmdzIGNvbnRlbnRTZXR0aW5ncyA9IENvbnRlbnRTZXR0aW5nc0NyZWF0b3IuY3JlYXRlKCk7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VEZWx0YSBmRGVsdGE7Ci0KLQlwcml2YXRlIHZvaWQgY29tbW9uV2l0aFJlc3BlY3RUb0tpbmQoKSB7Ci0JCWdldENvbnRlbnRTZXR0aW5ncygpLnJlbGVhc2VDYWNoZSgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBJQ29udGVudFNldHRpbmdzIGdldENvbnRlbnRTZXR0aW5ncygpIHsKLQkJcmV0dXJuIGNvbnRlbnRTZXR0aW5nczsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSVJlc291cmNlRGVsdGEgZ2V0RGVsdGEoKSB7Ci0JCXJldHVybiBmRGVsdGE7Ci0JfQotCi0KLQkvKgotCSAqIEBzZWUgSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIjaGFuZGxlKElSZXNvdXJjZURlbHRhKQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZShmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQl0aGlzLmZEZWx0YSA9IGRlbHRhOwotCQkvLyBnZXQgUmVzb3VyY2UgZGVsdGEga2luZAotCQlmaW5hbCBpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJLy8gbmV2ZXIgdXNlZCE/Ci0JCS8vSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCi0JCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDogewotCQkJCWhhbmRsZUNoYW5nZWQoKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6IHsKLQkJCQloYW5kbGVSZW1vdmVkKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDogewotCQkJCWhhbmRsZUFkZGVkKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0KLQotCQl9Ci0KLQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWRkZWQoKSB7Ci0JCWNvbW1vbldpdGhSZXNwZWN0VG9LaW5kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZCgpIHsKLQkJY29tbW9uV2l0aFJlc3BlY3RUb0tpbmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZW1vdmVkKCkgewotCQljb21tb25XaXRoUmVzcGVjdFRvS2luZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQWJzdHJhY3RTdWJqZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9BYnN0cmFjdFN1YmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjOThiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9BYnN0cmFjdFN1YmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNlZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdWJqZWN0IGltcGxlbWVudHMgSU5vdGlmeSwgSVN1YmplY3QgewotCi0KLQotCXByaXZhdGUgc3RhdGljIE1hcCBsaXN0ZW5lckxpc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTGlzdGVuZXIoSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVyTGlzdC5wdXQobGlzdGVuZXIsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNvbnRlbnRTZXR0aW5nc0V2ZW50U3ViamVjdCNub3RpZnlDb250ZW50U2V0dGluZ3NMaXN0ZW5lcnMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIGNoYW5nZWRSZXNvdXJjZSkgewotCi0JCVNldCBrZXlzID0gbGlzdGVuZXJMaXN0LmtleVNldCgpOwotCQlJdGVyYXRvciBpdGVyID0ga2V5cy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyIGNzbCA9IChJQ29udGVudFNldHRpbmdzTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJY3NsLmNvbnRlbnRTZXR0aW5nc0NoYW5nZWQoY2hhbmdlZFJlc291cmNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVMaXN0ZW5lcihJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjYTM4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChJbnRhbGlvKSAtIGJ1ZyAzMDA0NDMgLSBzb21lIGNvbnN0YW50cyBhcmVuJ3Qgc3RhdGljIGZpbmFsCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgU2VlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50U2V0dGluZ3MgaW1wbGVtZW50cyBJQ29udGVudFNldHRpbmdzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29udGVudFNldHRpbmdzTmFtZSA9ICIuY29udGVudHNldHRpbmdzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTaW1wbGVOb2RlT3BlcmF0b3IgZG9tT3BlcmF0b3I7Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJvamVjdCBwcmVQcm9qZWN0OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUNvbnRlbnRTZXR0aW5ncyBzaW5nbGV0b24gPSBuZXcgQ29udGVudFNldHRpbmdzKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRDb250ZW50U2V0dGluZ3NOYW1lKCkgewotCQlyZXR1cm4gY29udGVudFNldHRpbmdzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBJQ29udGVudFNldHRpbmdzIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRTZXR0aW5nc1BhdGg7Ci0JcHJpdmF0ZSBJUHJvamVjdCBjdXJyUHJvamVjdDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmlsZUVsZW1lbnROYW1lID0gImZpbGUiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSEFUVFIgPSAicGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcHJvamVjdEVsZW1lbnROYW1lID0gInByb2plY3QiOy8vJE5PTi1OTFMtMSQKLQotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gImNvbnRlbnRzZXR0aW5ncyI7Ly8kTk9OLU5MUy0xJAotCi0KLQotCXByaXZhdGUgQ29udGVudFNldHRpbmdzKCkgewotCQljdXJyUHJvamVjdCA9IG51bGw7Ci0JCWNvbnRlbnRTZXR0aW5nc1BhdGggPSBudWxsOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIF9zZXRQcm9wZXJ0aWVzKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgTWFwIHByb3BlcnRpZXMpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgcHJvcGVydGllcyA9PSBudWxsIHx8IHByb3BlcnRpZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlpZiAoIShyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSkKLQkJCXJldHVybjsKLQotCQljb250ZW50U2V0dGluZ3NQYXRoID0gZ2V0Q29udGVudFNldHRpbmdzUGF0aChyZXNvdXJjZSk7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQotCQkJaWYgKCFleGlzdHNDb250ZW50U2V0dGluZ3MoKSkgewotCQkJCS8vIGNyZWF0ZSBET00gdHJlZSBmb3IgbmV3IFhNTCBEb2N1bWVudAotCQkJCWNyZWF0ZU5ld0RPTVRyZWUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGNyZWF0ZSBET00gdHJlZSBmcm9tIGV4aXN0aW5nIGNvbnRlbnRzZXR0aW5ncy4KLQkJCQljcmVhdGVET01UcmVlKCk7Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0cnkgewotCQkJCWNyZWF0ZU5ld0RPTVRyZWUoKTsKLQkJCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5DcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50IGUgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoTm9kZU5hbWUocHJvamVjdEVsZW1lbnROYW1lKTsKLQkJCWlmIChlID09IG51bGwpIHsKLQkJCQkvLyBjcmVhdGUgcHJvamVjdCBFbGVtZW50IGFuZCBhZGQgaXQgaW50byB0cmVlCi0JCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5hZGRFbGVtZW50VW5kZXJSb290KHByb2plY3RFbGVtZW50TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkvLyBjaGVjayBleGlzdHMgZmlsZSBFbGVtZW50Ci0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIGZpbGUgRWxlbWVudCBhbmQgYWRkIHBhdGggaW50byBpdC4KLQkJCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmFkZEVsZW1lbnRVbmRlclJvb3QoZmlsZUVsZW1lbnROYW1lKTsKLQkJCQlkb21PcGVyYXRvci5hZGRBdHRyaWJ1dGVBdChlLCBnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgZXhpc3RzIHByb3BlcnR5TmFtZSBhdHRyaWJ1dGUKLQkJTWFwIGF0dHJMaXN0ID0gZG9tT3BlcmF0b3IuZ2V0QXR0cmlidXRlc09mKGUpOwotCQlib29sZWFuIGhhc0F0dHIgPSB0cnVlOwotCQlpZiAoYXR0ckxpc3QgPT0gbnVsbCB8fCBhdHRyTGlzdC5pc0VtcHR5KCkpCi0JCQloYXNBdHRyID0gZmFsc2U7Ci0JCVNldCBrZXlzID0gcHJvcGVydGllcy5rZXlTZXQoKTsKLQkJSXRlcmF0b3IgaWkgPSBrZXlzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpaS5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSBpaS5uZXh0KCk7Ci0JCQlTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZSk7Ci0KLQotCQkJaWYgKCFoYXNBdHRyIHx8IChTdHJpbmcpIGF0dHJMaXN0LmdldChwcm9wZXJ0eU5hbWUpID09IG51bGwpCi0JCQkJLy8gY3JlYXRlIHByb3BlcnR5TmFtZSBhdHRyaWJ1dGUgYW5kIGFkZAotCQkJCWRvbU9wZXJhdG9yLmFkZEF0dHJpYnV0ZUF0KGUsIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQllbHNlCi0JCQkJLy8gc2V0IGF0dHJpYnV0ZSB2YWx1ZQotCQkJCWRvbU9wZXJhdG9yLnVwZGF0ZUF0dHJpYnV0ZUF0KGUsIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCX0KLQotCQkvLyB3cml0ZSBkb20gdHJlZSBpbnRvIC5jb250ZW50c2V0dGluZ3MKLQkJdHJ5IHsKLQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0KLQotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIF9zZXRQcm9wZXJ0eShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8IHByb3BlcnR5TmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIShyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSkKLQkJCXJldHVybjsKLQotCQljb250ZW50U2V0dGluZ3NQYXRoID0gZ2V0Q29udGVudFNldHRpbmdzUGF0aChyZXNvdXJjZSk7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQotCQkJaWYgKCFleGlzdHNDb250ZW50U2V0dGluZ3MoKSkgewotCQkJCS8vIGNyZWF0ZSBET00gdHJlZSBmb3IgbmV3IFhNTCBEb2N1bWVudAotCQkJCWNyZWF0ZU5ld0RPTVRyZWUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGNyZWF0ZSBET00gdHJlZSBmcm9tIGV4aXN0aW5nIGNvbnRlbnRzZXR0aW5ncy4KLQkJCQljcmVhdGVET01UcmVlKCk7Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0cnkgewotCQkJCWNyZWF0ZU5ld0RPTVRyZWUoKTsKLQkJCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5DcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50IGUgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoTm9kZU5hbWUocHJvamVjdEVsZW1lbnROYW1lKTsKLQkJCWlmIChlID09IG51bGwpIHsKLQkJCQkvLyBjcmVhdGUgcHJvamVjdCBFbGVtZW50IGFuZCBhZGQgaXQgaW50byB0cmVlCi0JCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5hZGRFbGVtZW50VW5kZXJSb290KHByb2plY3RFbGVtZW50TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkvLyBjaGVjayBleGlzdHMgZmlsZSBFbGVtZW50Ci0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIGZpbGUgRWxlbWVudCBhbmQgYWRkIHBhdGggaW50byBpdC4KLQkJCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmFkZEVsZW1lbnRVbmRlclJvb3QoZmlsZUVsZW1lbnROYW1lKTsKLQkJCQlkb21PcGVyYXRvci5hZGRBdHRyaWJ1dGVBdChlLCBnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgZXhpc3RzIHByb3BlcnR5TmFtZSBhdHRyaWJ1dGUKLQotCQlNYXAgYXR0ckxpc3QgPSBkb21PcGVyYXRvci5nZXRBdHRyaWJ1dGVzT2YoZSk7Ci0JCWlmIChhdHRyTGlzdCA9PSBudWxsIHx8IGF0dHJMaXN0LmlzRW1wdHkoKSB8fCAoU3RyaW5nKSBhdHRyTGlzdC5nZXQocHJvcGVydHlOYW1lKSA9PSBudWxsKQotCQkJLy8gY3JlYXRlIHByb3BlcnR5TmFtZSBhdHRyaWJ1dGUgYW5kIGFkZAotCQkJZG9tT3BlcmF0b3IuYWRkQXR0cmlidXRlQXQoZSwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZQotCQkJLy8gc2V0IGF0dHJpYnV0ZSB2YWx1ZQotCQkJZG9tT3BlcmF0b3IudXBkYXRlQXR0cmlidXRlQXQoZSwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQotCi0JCS8vIHdyaXRlIGRvbSB0cmVlIGludG8gLmNvbnRlbnRzZXR0aW5ncwotCQl0cnkgewotCQkJd3JpdGVET01Eb2N1bWVudCgpOwotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybjsKLQkJfQotCi0JCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQotCi0JfQotCi0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRE9NVHJlZSgpIHRocm93cyBTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gewotCQlpZiAoZG9tT3BlcmF0b3IgPT0gbnVsbCB8fCAoY3VyclByb2plY3QgIT0gbnVsbCAmJiAoIWN1cnJQcm9qZWN0LmVxdWFscyhwcmVQcm9qZWN0KSkgJiYgY29udGVudFNldHRpbmdzUGF0aCAhPSBudWxsKSkKLQkJCWRvbU9wZXJhdG9yID0gbmV3IFNpbXBsZU5vZGVPcGVyYXRvcihjb250ZW50U2V0dGluZ3NQYXRoKTsKLQotCi0JfQotCi0JLyoKLQkgKiBwcml2YXRlIHZvaWQgY3JlYXRlTmV3RE9NVHJlZSgpIHRocm93cwotCSAqIFNpbXBsZU5vZGVPcGVyYXRvci5DcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9ueyAvLyBjcmVhdGUgTmV3Ci0JICogZG9jdW1lbnQgd2hlbiBubyBmaWxlIGV4aXN0cy4gRE9NSW1wbGVtZW50YXRpb24gaW1wbCA9Ci0JICogRE9NSW1wbGVtZW50YXRpb25JbXBsLmdldERPTUltcGxlbWVudGF0aW9uKCk7IERvY3VtZW50IGRvY3VtZW50ID0KLQkgKiBpbXBsLmNyZWF0ZURvY3VtZW50KG51bGwscm9vdEVsZW1lbnROYW1lLG51bGwpOyBkb21PcGVyYXRvciA9IG5ldwotCSAqIFNpbXBsZU5vZGVPcGVyYXRvcihkb2N1bWVudCk7IH0KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlTmV3RE9NVHJlZSgpIHRocm93cyBTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGNyZWF0aW5nIGRvY3VtZW50IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gY3JlYXRpbmcgZG9jdW1lbnQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlkb2N1bWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KHJvb3RFbGVtZW50TmFtZSkpOwotCQkJZG9tT3BlcmF0b3IgPSBuZXcgU2ltcGxlTm9kZU9wZXJhdG9yKGRvY3VtZW50KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRlbGV0ZUFsbFByb3BlcnRpZXMoZmluYWwgSVJlc291cmNlIGRlbGV0ZWRGaWxlKSB7Ci0JCWlmIChkZWxldGVkRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyBpZiAoZGVsZXRlZEZpbGUuZXhpc3RzKCkpIHJldHVybjsKLQkJaWYgKChkZWxldGVkRmlsZSkuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFICYmIChkZWxldGVkRmlsZSkuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5QUk9KRUNUKQotCQkJcmV0dXJuOwotCi0KLQkJY29udGVudFNldHRpbmdzUGF0aCA9IGdldENvbnRlbnRTZXR0aW5nc1BhdGgoZGVsZXRlZEZpbGUpOy8vIGdldFByb2plY3RPZigoSVJlc291cmNlKWRlbGV0ZWRGaWxlKQotCQkvLyArCi0JCS8vIElQYXRoLlNFUEFSQVRPUgotCQkvLyArCi0JCS8vIGNvbnRlbnRTZXR0aW5nc05hbWU7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghZXhpc3RzQ29udGVudFNldHRpbmdzKCkpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCWNyZWF0ZURPTVRyZWUoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50IGUgPSBudWxsOwotCQlpZiAoZGVsZXRlZEZpbGUuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKQotCQkJLy8gc2VsZWN0IHByb2plY3QgZWxlbWVudCBhbmQgZ2V0IGF0dHJpYnV0ZQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aE5vZGVOYW1lKHByb2plY3RFbGVtZW50TmFtZSk7Ci0JCWVsc2UgaWYgKGRlbGV0ZWRGaWxlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoZ2V0UGF0aEF0dHIoKSwgZ2V0UmVsYXRpdmVQYXRoRnJvbVByb2plY3QoZGVsZXRlZEZpbGUpKTsKLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJcmV0dXJuOwotCQl9Ci0KLQotCQkvLyB3aGVuIGRlbGV0ZWRGaWxlIGVudHJ5IGV4aXN0cy4KLQkJaWYgKGRlbGV0ZWRGaWxlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkKLQkJCWRvbU9wZXJhdG9yLnJlbW92ZUVsZW1lbnRXaXRoKHByb2plY3RFbGVtZW50TmFtZSk7Ci0JCWVsc2UgaWYgKGRlbGV0ZWRGaWxlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCWRvbU9wZXJhdG9yLnJlbW92ZUVsZW1lbnRXaXRoKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KGRlbGV0ZWRGaWxlKSk7Ci0KLQotCQkvLyB3cml0ZSBkb20gdHJlZSBpbnRvIC5jb250ZW50c2V0dGluZ3MKLQkJdHJ5IHsKLQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0KLQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZWxldGVQcm9wZXJ0eShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpKQotCQkJcmV0dXJuOwotCQljb250ZW50U2V0dGluZ3NQYXRoID0gZ2V0Q29udGVudFNldHRpbmdzUGF0aChyZXNvdXJjZSk7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFleGlzdHNDb250ZW50U2V0dGluZ3MoKSkgewotCQkJcmV0dXJuOyAvLyB3aGVuIC5jb250ZW50c2V0dGluZ3MueG1sIGlzIE5PVCBleGlzdC4KLQkJfQotCQl0cnkgewotCQkJY3JlYXRlRE9NVHJlZSgpOwotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlTmV3RE9NVHJlZSgpOwotCQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlFbGVtZW50IGUgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKQotCQkJLy8gc2VsZWN0IHByb2plY3QgZWxlbWVudCBhbmQgZ2V0IGF0dHJpYnV0ZQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aE5vZGVOYW1lKHByb2plY3RFbGVtZW50TmFtZSk7Ci0JCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoZ2V0UGF0aEF0dHIoKSwgZ2V0UmVsYXRpdmVQYXRoRnJvbVByb2plY3QocmVzb3VyY2UpKTsKLQotCi0JCWlmIChlICE9IG51bGwpIHsKLQkJCWRvbU9wZXJhdG9yLnJlbW92ZUF0dHJpYnV0ZUF0KGUsIHByb3BlcnR5TmFtZSk7Ci0JCQkvLyB3cml0ZSBkb20gdHJlZSBpbnRvIC5jb250ZW50c2V0dGluZ3MKLQkJCXRyeSB7Ci0JCQkJd3JpdGVET01Eb2N1bWVudCgpOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCi0JfQotCi0KLQlwcml2YXRlIGJvb2xlYW4gZXhpc3RzQ29udGVudFNldHRpbmdzKCkgewotCQlpZiAoY29udGVudFNldHRpbmdzUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlSZXNvdXJjZSBmaWxlID0gY3VyclByb2plY3QuZ2V0RmlsZShjb250ZW50U2V0dGluZ3NOYW1lKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzUHJvcGVydGllcyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKCEocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUIHx8IHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJY29udGVudFNldHRpbmdzUGF0aCA9IGdldENvbnRlbnRTZXR0aW5nc1BhdGgocmVzb3VyY2UpOwotCQlpZiAoY29udGVudFNldHRpbmdzUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmICghZXhpc3RzQ29udGVudFNldHRpbmdzKCkpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIHdoZW4gLmNvbnRlbnRzZXR0aW5ncy54bWwgaXMgTk9UIGV4aXN0LgotCi0JCXRyeSB7Ci0JCQljcmVhdGVET01UcmVlKCk7Ci0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5SZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJRWxlbWVudCBlID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkKLQkJCS8vIHNlbGVjdCBwcm9qZWN0IGVsZW1lbnQgYW5kIGdldCBhdHRyaWJ1dGUKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhOb2RlTmFtZShwcm9qZWN0RWxlbWVudE5hbWUpOwotCQllbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0KLQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCU1hcCBwcm9wZXJ0aWVzID0gZG9tT3BlcmF0b3IuZ2V0QXR0cmlidXRlc09mKGUpOwotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlwcm9wZXJ0aWVzLnJlbW92ZShnZXRQYXRoQXR0cigpKTsvLyBpZiBJRmlsZSxyZW1vdmVkCi0JCWlmIChwcm9wZXJ0aWVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRDb250ZW50U2V0dGluZ3NQYXRoKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkKLQkJCXByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQllbHNlCi0JCQlwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCi0JCUlQYXRoIHByb2plY3RMb2NhdGlvbiA9IHByb2plY3QuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKHByb2plY3RMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkvKioKLQkJCSAqIEFzIGEgZGVwcmVjYXRlZCBjbGFzcywgcGVyZmVjdCBvcGVyYXRpb24gaW4gbmV3IHNjZW5hcmlvcyBzdWNoCi0JCQkgKiBhcyB3aXRoIEVGUyBpcyBub3QgcHJvbWlzZWQuCi0JCQkgKi8KLQkJCXJldHVybiBTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKHJvb3RFbGVtZW50TmFtZSkuYXBwZW5kKHByb2plY3QuZ2V0TmFtZSgpKS50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2plY3RMb2NhdGlvbi5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLmFwcGVuZChjb250ZW50U2V0dGluZ3NOYW1lKS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGF0aEF0dHIoKSB7Ci0JCXJldHVybiBQQVRIQVRUUjsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIE1hcCBnZXRQcm9wZXJ0aWVzKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJY29udGVudFNldHRpbmdzUGF0aCA9IGdldENvbnRlbnRTZXR0aW5nc1BhdGgocmVzb3VyY2UpOwotCQlpZiAoY29udGVudFNldHRpbmdzUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKCFleGlzdHNDb250ZW50U2V0dGluZ3MoKSkgewotCQkJcmV0dXJuIG51bGw7IC8vIHdoZW4gLmNvbnRlbnRzZXR0aW5ncy54bWwgaXMgTk9UIGV4aXN0LgotCQl9Ci0KLQotCQl0cnkgewotCQkJY3JlYXRlRE9NVHJlZSgpOwotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTEpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJLy8gY3JlYXRlIERPTSB0cmVlIGZvciBuZXcgWE1MIERvY3VtZW50Ci0JCQl0cnkgewotCQkJCWNyZWF0ZU5ld0RPTVRyZWUoKTsKLQkJCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQl9Ci0KLQotCQlFbGVtZW50IGUgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKQotCQkJLy8gc2VsZWN0IHByb2plY3QgZWxlbWVudCBhbmQgZ2V0IGF0dHJpYnV0ZQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aE5vZGVOYW1lKHByb2plY3RFbGVtZW50TmFtZSk7Ci0JCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoZ2V0UGF0aEF0dHIoKSwgZ2V0UmVsYXRpdmVQYXRoRnJvbVByb2plY3QocmVzb3VyY2UpKTsKLQotCi0JCWlmIChlICE9IG51bGwpIHsKLQotCQkJTWFwIHByb3BlcnRpZXMgPSBkb21PcGVyYXRvci5nZXRBdHRyaWJ1dGVzT2YoZSk7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKHByb3BlcnRpZXMuaXNFbXB0eSgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcHJvcGVydGllcy5yZW1vdmUoZ2V0UGF0aEF0dHIoKSk7Ci0JCQlyZXR1cm4gcHJvcGVydGllczsKLQkJfQotCQllbHNlIHsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybiBudWxsOy8vIHdoZW4gcHJvamVjdCBvciBmaWxlIGVsZW1lbnQgaXMgTk9UIGV4aXN0LgotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0UHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKCEocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUIHx8IHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQljb250ZW50U2V0dGluZ3NQYXRoID0gZ2V0Q29udGVudFNldHRpbmdzUGF0aChyZXNvdXJjZSk7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoIWV4aXN0c0NvbnRlbnRTZXR0aW5ncygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gd2hlbiAuY29udGVudHNldHRpbmdzLnhtbCBpcyBOT1QgZXhpc3QuCi0JCX0KLQotCi0JCXRyeSB7Ci0JCQljcmVhdGVET01UcmVlKCk7Ci0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5SZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCQkvLyBjcmVhdGUgRE9NIHRyZWUgZm9yIG5ldyBYTUwgRG9jdW1lbnQKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlTmV3RE9NVHJlZSgpOwotCQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCX0KLQotCi0JCUVsZW1lbnQgZSA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQkvLyBzZWxlY3QgcHJvamVjdCBlbGVtZW50IGFuZCBnZXQgYXR0cmlidXRlCi0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoTm9kZU5hbWUocHJvamVjdEVsZW1lbnROYW1lKTsKLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCi0KLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHJlc3VsdCA9IGUuZ2V0QXR0cmlidXRlKHByb3BlcnR5TmFtZSk7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWVsc2UgewotCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJcmV0dXJuIG51bGw7Ly8gd2hlbiBwcm9qZWN0IG9yIGZpbGUgZWxlbWVudCBpcyBOT1QgZXhpc3QuCi0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGlmIHJlc291cmNlIGlzIHByb2plY3Qgb3Igd29ya3NwYWNlIHJvb3QKLQkJU3RyaW5nIHJlc291cmNlUGF0aCA9IHBhdGgudG9TdHJpbmcoKTsKLQotCQlyZXR1cm4gcmVzb3VyY2VQYXRoOwotCi0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2VDYWNoZSgpIHsKLQkJZG9tT3BlcmF0b3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQcm9wZXJ0aWVzKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgTWFwIHByb3BlcnRpZXMpIHsKLQkJLy8gZGVueSB0byBzZXQgInBhdGgiIGF0dHJpYnV0ZSB2YWx1ZS4KLQkJU2V0IGtleXMgPSBwcm9wZXJ0aWVzLmtleVNldCgpOwotCQlJdGVyYXRvciBpaSA9IGtleXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlpLmhhc05leHQoKSkgewotCQkJaWYgKHRoaXMuZ2V0UGF0aEF0dHIoKS5lcXVhbHMoaWkubmV4dCgpKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5fc2V0UHJvcGVydGllcyhyZXNvdXJjZSwgcHJvcGVydGllcyk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFByb3BlcnR5KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLQkJLy8gZGVueSB0byBzZXQgInBhdGgiIGF0dHJpYnV0ZSB2YWx1ZS4KLQkJaWYgKHRoaXMuZ2V0UGF0aEF0dHIoKS5lcXVhbHMocHJvcGVydHlOYW1lKSkKLQkJCXJldHVybjsKLQkJdGhpcy5fc2V0UHJvcGVydHkocmVzb3VyY2UsIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlRE9NRG9jdW1lbnQoKSB0aHJvd3MgU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0KLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlkb21PcGVyYXRvci53cml0ZURvY3VtZW50KG91dHB1dFN0cmVhbSk7Ci0JCQlvdXRwdXRTdHJlYW0uZmx1c2goKTsKLQkJCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCi0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0KLQkJCUlGaWxlIG91dHB1dEZpbGUgPSBjdXJyUHJvamVjdC5nZXRGaWxlKGNvbnRlbnRTZXR0aW5nc05hbWUpOwotCQkJaWYgKG91dHB1dEZpbGUuZXhpc3RzKCkpCi0JCQkJb3V0cHV0RmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQllbHNlCi0JCQkJb3V0cHV0RmlsZS5jcmVhdGUoaW5wdXRTdHJlYW0sIHRydWUsIG51bGwpOwotCi0JCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0aHJvdyBuZXcgU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbigiaW52YWxpZCBvdXRwdXRGaWxlIGluIHdyaXRlRE9NRG9jdW1lbnQoKSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRocm93IG5ldyBTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKCJpbnZhbGlkIG91dHB1dFN0cmVhbSBvciBpbnB1dFN0cmVhbSBpbiB3cml0ZURPTURvY3VtZW50KCkiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjNTgwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNlZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllcwotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdCBleHRlbmRzIEFic3RyYWN0U3ViamVjdCB7Ci0KLQotCXByaXZhdGUgc3RhdGljIElOb3RpZnkgbm90aWZ5OwotCXByaXZhdGUgc3RhdGljIElTdWJqZWN0IHN1YmplY3Q7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElOb3RpZnkgZ2V0Tm90aWZ5KCkgewotCQlpZiAobm90aWZ5ID09IG51bGwgJiYgc3ViamVjdCA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKENvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QuY2xhc3MpIHsKLQkJCQlpZiAobm90aWZ5ID09IG51bGwgJiYgc3ViamVjdCA9PSBudWxsKSB7Ci0JCQkJCW5vdGlmeSA9IG5ldyBDb250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0KCk7Ci0JCQkJCXN1YmplY3QgPSAoSVN1YmplY3QpIG5vdGlmeTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbm90aWZ5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN1YmplY3QgZ2V0U3ViamVjdCgpIHsKLQkJaWYgKHN1YmplY3QgPT0gbnVsbCAmJiBub3RpZnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChDb250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0LmNsYXNzKSB7Ci0JCQkJaWYgKHN1YmplY3QgPT0gbnVsbCAmJiBub3RpZnkgPT0gbnVsbCkgewotCQkJCQlzdWJqZWN0ID0gbmV3IENvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QoKTsKLQkJCQkJbm90aWZ5ID0gKElOb3RpZnkpIHN1YmplY3Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdWJqZWN0OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0ZW5lcihJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIGNoYW5nZWRSZXNvdXJjZSkgewotCQlzdXBlci5ub3RpZnlMaXN0ZW5lcnMoY2hhbmdlZFJlc291cmNlKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NDcmVhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZDM1NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBTZWUKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXMKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRTZXR0aW5nc0NyZWF0b3IgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJQ29udGVudFNldHRpbmdzIGNyZWF0ZSgpIHsKLQkJcmV0dXJuIENvbnRlbnRTZXR0aW5ncy5nZXRJbnN0YW5jZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzRmlsZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0ZpbGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNTI2MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzRmlsZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotKiBAZGVwcmVjYXRlZCBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIG5vIG9uZSBjYXJlcyBhbnl3YXlzLgotKi8KLWNsYXNzIENvbnRlbnRTZXR0aW5nc0ZpbGVIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyIHsKLQotCi0KLQlwcml2YXRlIE1hcCBwcm9wZXJ0aWVzOwotCi0KLQlwcml2YXRlIHZvaWQgZ2V0UHJvcGVydGllcyhJUmVzb3VyY2UgZmlsZSkgewotCQlwcm9wZXJ0aWVzID0gZ2V0Q29udGVudFNldHRpbmdzKCkuZ2V0UHJvcGVydGllcyhmaWxlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyI2hhbmRsZUFkZGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBZGRlZCgpIHsKLQkJc3VwZXIuaGFuZGxlQWRkZWQoKTsKLQotCQlpZiAoc3VwZXIuZ2V0RGVsdGEoKS5nZXRGbGFncygpID09IDApIHsKLQkJCS8vIHB1bGxkb3duIG1lbXUtPmNvcHktPmNyZWF0ZSBmaWxlIHdpdGhvdXQgb3ZlcnJpZGUsIG5ldyBmaWxlLAotCQkJLy8gaW1wb3J0IHdpdGhvdXQgb3ZlcnJpZGUKLQkJCS8vIGNvcHksbmV3LGltcG9ydCBoYXMgc2FtZSBraW5kKD0xKSBhbmQgZmxhZyg9MCkuCi0KLQkJfSBlbHNlIGlmICgoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgIT0gMCkgewotCQkJLy8gcHVsbGRvd24gbWVudS0+IHJlbmFtZSB3aXRob3V0IG92ZXJyaWRlLHB1bGxkb3duIG1lbnUtPm1vdmUKLQkJCS8vIHdpdGhvdXQgb3ZlcnJpZGUKLQkJCS8vIGluc3RlYWQgb2YgdGhpcyBtZXRob2QsaGFuZGxlUmVtb3ZlZCgpIHdvcmtzIGZvciB0aGlzIGRlbHRhCi0KLQkJfQotCi0JfQotCi0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyI2hhbmRsZUNoYW5nZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWQoKSB7Ci0JCS8vIGVkaXQKLQkJaWYgKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSA9PSBJUmVzb3VyY2VEZWx0YS5DT05URU5UICYmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgPT0gMCkgewotCQkJc3VwZXIuaGFuZGxlQ2hhbmdlZCgpOwotCi0JCX0gZWxzZSBpZiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpID09IElSZXNvdXJjZURlbHRhLkNPTlRFTlQgJiYgKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSAhPSAwKSB7Ci0JCQkvLyBvdmVycmlkZSBhcyBhIHJlc3VsdCBvZiBjb3B5IG9yIGltcG9ydAotCQkJLy8gaW4gV2ViIHByb2plY3QsIGNvcHkgd2l0aCBvdmVycmlkZSBkb2Vzbid0IGhhcHBlbgotCi0JCQkvLyBvdmVycmlkZSBhcyBtb3ZlIG9yIHJlbmFtZQotCQkJLy8gaGFuZGxlUmVtb3ZlZCgpIHdvcmtzIGZvciB0aGlzIGRlbHRhCi0JCQlzdXBlci5oYW5kbGVDaGFuZ2VkKCk7Ci0KLQkJfQotCi0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyI2hhbmRsZVJlbW92ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlbW92ZWQoKSB7Ci0JCXN1cGVyLmhhbmRsZVJlbW92ZWQoKTsKLQkJSUZpbGUgZGVsZXRlZEZpbGUgPSBudWxsOwotCi0JCS8vIGlmIGVudHJ5IGV4aXN0cyB0aGVuIHJlbW92ZSBpdC4KLQkJaWYgKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSA9PSAwKSB7Ci0JCQkvLyBwdWxsZG93biBtZW51LT5kZWxldGUKLQkJCWRlbGV0ZWRGaWxlID0gKElGaWxlKSBnZXREZWx0YSgpLmdldFJlc291cmNlKCk7Ci0KLQkJCWlmIChkZWxldGVkRmlsZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWdldENvbnRlbnRTZXR0aW5ncygpLmRlbGV0ZUFsbFByb3BlcnRpZXMoZGVsZXRlZEZpbGUpOwotCi0JCQlnZXRDb250ZW50U2V0dGluZ3MoKS5yZWxlYXNlQ2FjaGUoKTsKLQkJfQotCi0JCWVsc2UgaWYgKChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkgewotCi0JCQkvLyBwdWxsZG93biBtZW51LT4gcmVuYW1lLCBwdWxsZG93biBtZW51LT5tb3ZlCi0JCQlkZWxldGVkRmlsZSA9IChJRmlsZSkgZ2V0RGVsdGEoKS5nZXRSZXNvdXJjZSgpOwotCQkJZ2V0UHJvcGVydGllcyhkZWxldGVkRmlsZSk7Ci0KLQkJCS8vIGdldCBkZXN0aW5hdGlvbiBJUmVzb3VyY2UKLQkJCUlQYXRoIHRhcmdldFBhdGggPSBnZXREZWx0YSgpLmdldE1vdmVkVG9QYXRoKCk7Ci0JCQlJV29ya3NwYWNlUm9vdCBpd3IgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSVJlc291cmNlIHRhcmdldEZpbGUgPSBpd3IuZ2V0RmlsZSh0YXJnZXRQYXRoKTsvL2l3ci5maW5kTWVtYmVyKHRhcmdldFBhdGgpOwotCi0JCQkvLyBzZXQgcHJvcGVydHkgb2YgZGVzdGluYXRpb24gZmlsZQotCQkJZ2V0Q29udGVudFNldHRpbmdzKCkuZGVsZXRlQWxsUHJvcGVydGllcyh0YXJnZXRGaWxlKTsKLQkJCXNldFByb3BlcnRpZXModGFyZ2V0RmlsZSk7Ci0JCQlpZiAocHJvcGVydGllcyAhPSBudWxsKQotCQkJCXByb3BlcnRpZXMuY2xlYXIoKTsKLQkJCXByb3BlcnRpZXMgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGRlbGV0ZWRGaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldENvbnRlbnRTZXR0aW5ncygpLmRlbGV0ZUFsbFByb3BlcnRpZXMoZGVsZXRlZEZpbGUpOwotCi0JCWdldENvbnRlbnRTZXR0aW5ncygpLnJlbGVhc2VDYWNoZSgpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFByb3BlcnRpZXMoSVJlc291cmNlIGZpbGUpIHsKLQkJaWYgKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoInNodG1sIikvLyROT04tTkxTLTEkCi0JCQkJCXx8IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImh0bSIpLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJodG1sIikvLyROT04tTkxTLTEkCi0JCQkJCXx8IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImpodG1sIikvLyROT04tTkxTLTEkCi0JCQkJCXx8IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoInhodG1sIikvLyROT04tTkxTLTEkCi0JCQkJCXx8IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImpzcCIpLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJjc3MiKS8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgianNmIikvLyROT04tTkxTLTEkCi0JCXx8IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImpzcGYiKSkpLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQlpZiAocHJvcGVydGllcyA9PSBudWxsIHx8IHByb3BlcnRpZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlnZXRDb250ZW50U2V0dGluZ3MoKS5zZXRQcm9wZXJ0aWVzKGZpbGUsIHByb3BlcnRpZXMpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NTZWxmSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzU2VsZkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhYTJiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NTZWxmSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci0KLS8qKgotKiBAZGVwcmVjYXRlZCBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIG5vIG9uZSBjYXJlcyBhbnl3YXlzLgotKi8KLWZpbmFsIGNsYXNzIENvbnRlbnRTZXR0aW5nc1NlbGZIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIElOb3RpZnkgbm90aWZ5Oy8vID0gbmV3IENvbnRlbnRTZXR0aW5nc0NoYW5nZWRTdWJqZWN0KCk7Ci0KLQotCXByaXZhdGUgZmluYWwgdm9pZCBnZXRTdWJqZWN0KCkgewotCQlub3RpZnkgPSBDb250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0LmdldE5vdGlmeSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIjaGFuZGxlQWRkZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZGVkKCkgewotCQlnZXRTdWJqZWN0KCk7Ci0JCWlmIChzdXBlci5nZXREZWx0YSgpLmdldEZsYWdzKCkgPT0gMCkgewotCQkJLy8gcHVsbGRvd24gbWVtdS0+Y29weS0+Y3JlYXRlIGZpbGUgd2l0aG91dCBvdmVycmlkZSwgbmV3IGZpbGUsCi0JCQkvLyBwcm9wZXJ0eSBwYWdlIGNyZWF0ZSAuY29udGVudHNldHRpbmdzCi0JCQlzdXBlci5oYW5kbGVBZGRlZCgpOwotCQkJbm90aWZ5Lm5vdGlmeUxpc3RlbmVycyhnZXREZWx0YSgpLmdldFJlc291cmNlKCkpOwotCi0JCX0gZWxzZSBpZiAoKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00pICE9IDApIHsKLQkJCS8vIHB1bGxkb3duIG1lbnUtPiByZW5hbWUgd2l0aG91dCBvdmVycmlkZSxwdWxsZG93biBtZW51LT5tb3ZlCi0JCQkvLyB3aXRob3V0IG92ZXJyaWRlCi0JCQlzdXBlci5oYW5kbGVBZGRlZCgpOwotCQkJbm90aWZ5Lm5vdGlmeUxpc3RlbmVycyhnZXREZWx0YSgpLmdldFJlc291cmNlKCkpOwotCi0JCX0KLQotCX0KLQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciNoYW5kbGVDaGFuZ2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkKCkgewotCQlnZXRTdWJqZWN0KCk7Ci0JCWlmICgoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgIT0gMCAmJiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpID09IDApIHsKLQkJCS8vIHJlc3VsdCBvZiBlZGl0LCBwcm9wZXJ0eSBwYWdlIG9wZXJhdGUgc2V0UHJvcGVydHkoYXBwbHkgb3Igb2sKLQkJCS8vIGJ1dHRvbikgaW4gLmNvbnRlbnRzZXR0aW5ncwotCQkJc3VwZXIuaGFuZGxlQ2hhbmdlZCgpOwotCi0JCQlub3RpZnkubm90aWZ5TGlzdGVuZXJzKGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKSk7Ci0KLQkJfSBlbHNlIGlmICgoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgIT0gMCAmJiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpICE9IDApIHsKLQkJCXN1cGVyLmhhbmRsZUNoYW5nZWQoKTsKLQkJCW5vdGlmeS5ub3RpZnlMaXN0ZW5lcnMoZ2V0RGVsdGEoKS5nZXRSZXNvdXJjZSgpKTsKLQotCQl9Ci0KLQotCX0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIjaGFuZGxlUmVtb3ZlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlZCgpIHsKLQkJZ2V0U3ViamVjdCgpOwotCQlpZiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpID09IDApIHsKLQkJCS8vIHB1bGxkb3duIG1lbnUtPmRlbGV0ZQotCQkJc3VwZXIuaGFuZGxlUmVtb3ZlZCgpOwotCQkJbm90aWZ5Lm5vdGlmeUxpc3RlbmVycyhnZXREZWx0YSgpLmdldFJlc291cmNlKCkpOwotCi0JCX0gZWxzZSBpZiAoKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSAhPSAwKSB7Ci0JCQkvLyBwdWxsZG93biBtZW51LT4gcmVuYW1lLCBwdWxsZG93biBtZW51LT5tb3ZlCi0JCQlzdXBlci5oYW5kbGVSZW1vdmVkKCk7Ci0JCQlub3RpZnkubm90aWZ5TGlzdGVuZXJzKGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKSk7Ci0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjk4YjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKEludGFsaW8pIC0gYnVnIDMwMDQzNCAtIE1ha2UgaW5uZXIgY2xhc3NlcyBzdGF0aWMgd2hlcmUgcG9zc2libGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNlZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllcwotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFNldHRpbmdzU3luY2hyb25pemVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCXN0YXRpYyBjbGFzcyBDb250ZW50U2V0dGluZ3NWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJLy8gcmVkZWZpbml0aW9uIGluIENvbnRlbnRTZXR0aW5ncy5qYXZhCi0JCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRTZXR0aW5nc05hbWUgPSBDb250ZW50U2V0dGluZ3MuZ2V0Q29udGVudFNldHRpbmdzTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlRXZlbnQgZkV2ZW50OwotCQlwcml2YXRlIElDb250ZW50U2V0dGluZ3NIYW5kbGVyIGhhbmRsZXI7Ci0KLQkJcHVibGljIENvbnRlbnRTZXR0aW5nc1Zpc2l0b3IoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMuZkV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIHBhcmVudCBmb2xkZXIgb3IgcHJvamVjdAotCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIGRlbHRhLmdldEZsYWdzKCkgPT0gMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWZpbmFsIGludCByZXNvdXJjZVR5cGUgPSByZXNvdXJjZS5nZXRUeXBlKCk7Ci0JCQlzd2l0Y2ggKHJlc291cmNlVHlwZSkgewotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCS8vIHdoZXRoZXIgcmVzb3VyY2UgaXMgLmNvbnRlbnRzZXR0aW5ncyBmaWxlIG9yIG5vdAotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCk7Ci0JCQkJCWlmICh0aGlzLmZFdmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgJiYgcmVzb3VyY2UuZXF1YWxzKHByb2plY3QuZ2V0RmlsZSh0aGlzLmNvbnRlbnRTZXR0aW5nc05hbWUpKSkgewotCQkJCQkJLy8gbmV3IG9iamVjdCBmb3IgLmNvbnRlbnRzZXR0aW5ncwotCQkJCQkJaGFuZGxlciA9IG5ldyBDb250ZW50U2V0dGluZ3NTZWxmSGFuZGxlcigpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHRoaXMuZkV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQgJiYgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwpIHsKLQkJCQkJCS8vIFRPRE8gY2hhbmdlIHRvIGNvbnRlbnQgdHlwZSEKLQkJCQkJCWlmIChyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgic2h0bWwiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgiaHRtIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImh0bWwiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgiamh0bWwiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgieGh0bWwiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgianNwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImNzcyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXx8IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJqc2YiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgianNwZiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkvLyBuZXcgb2JqZWN0IGZvciBJRmlsZQotCQkJCQkJCWhhbmRsZXIgPSBuZXcgQ29udGVudFNldHRpbmdzRmlsZUhhbmRsZXIoKTsKLQkJCQkJCQloYW5kbGVyLmhhbmRsZShkZWx0YSk7Ci0JCQkJCQkJaGFuZGxlciA9IG51bGw7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyB0cnVlIG9yIGZhbHNlO21vdG9tb3RvIHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLS8vCQkJZmluYWwgSVJlc291cmNlRGVsdGEgZkRlbHRhID0gZGVsdGE7Ci0vLwkJCWZpbmFsIElDb250ZW50U2V0dGluZ3NIYW5kbGVyIGRlbHRhSGFuZGxlciA9IHRoaXMuaGFuZGxlcjsKLQkJCS8vIFhYWCBGSVhNRQotCQkJLy8gSSBjb21tZW50ZWQgb3V0IGZvbGxvd2luZyB0byBtb3ZlIHRoaXMgdG8gIm1vZGVsIiAKLQkJCS8vIHBhY2thZ2VzLiBTaW5jZSB3YXNudCd0IGhvb2tlZCB1cC93b3JraW5nIGFueXdheSwgSSB0aGluayAKLQkJCS8vIG9rIGZvciBub3csIGJ1dCBuZWVkIHRvIHJlLXdvcmsgYXMgSm9iLCBvbmNlIHdlIGRvIGltcGxlbWVudCAKLQkJCS8vIHNldHRpbmdzIGZvciByZXNvdXJjZXMgYWdhaW4uIAotLy8JCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0vLwkJCWlmIChkaXNwbGF5ICE9IG51bGwgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0vLwkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0vLwkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJCQlpZiAoZGVsdGFIYW5kbGVyICE9IG51bGwpIHsKLS8vCQkJCQkJCWRlbHRhSGFuZGxlci5oYW5kbGUoZkRlbHRhKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0pOwotLy8JCQl9Ci0vLwkJCWVsc2UgaWYgKGRlbHRhSGFuZGxlciAhPSBudWxsKSB7Ci0vLwkJCQlkZWx0YUhhbmRsZXIuaGFuZGxlKGZEZWx0YSk7Ci0vLwkJCX0KLQkJCWhhbmRsZXIgPSBudWxsOwotCQkJcmV0dXJuIHRydWU7IC8vIHRydWUgb3IgZmFsc2U7bW90b21vdG8gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbnRlbnRTZXR0aW5nc1N5bmNocm9uaXplciBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDb250ZW50U2V0dGluZ3NTeW5jaHJvbml6ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgQ29udGVudFNldHRpbmdzU3luY2hyb25pemVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIENvbnRlbnRTZXR0aW5nc1Zpc2l0b3IgY3NWaXNpdG9yOwotCXByaXZhdGUgYm9vbGVhbiBmTGlzdGVuaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBJUHJvamVjdCBmUHJvamVjdDsKLQotCi0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsKQotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5zdGFsbCgpIHsKLQkJaWYgKCFmTGlzdGVuaW5nKSB7Ci0JCQlnZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQkJCWZMaXN0ZW5pbmcgPSB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0xpc3RlbmluZygpIHsKLQkJcmV0dXJuIGZMaXN0ZW5pbmc7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQlpZiAoZGVsdGEgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoY3NWaXNpdG9yID09IG51bGwpCi0JCQkJCWNzVmlzaXRvciA9IG5ldyBDb250ZW50U2V0dGluZ3NWaXNpdG9yKGV2ZW50KTsKLQkJCQlkZWx0YS5hY2NlcHQoY3NWaXNpdG9yKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCWNzVmlzaXRvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHVuSW5zdGFsbCgpIHsKLQkJZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJZkxpc3RlbmluZyA9IGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lDb250ZW50U2V0dGluZ3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lDb250ZW50U2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4ZGQ1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JQ29udGVudFNldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNlZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50U2V0dGluZ3MgewotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgQ1NTX1BST0ZJTEUgPSAiY3NzLXByb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBERVZJQ0VfUFJPRklMRSA9ICJ0YXJnZXQtZGV2aWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9UWVBFID0gImRvY3VtZW50LXR5cGUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBIVE1MX0RPQ1VNRU5UX1RZUEUgPSAiaHRtbC1kb2N1bWVudC10eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlQWxsUHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgZGVsZXRlZEZpbGUpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlUHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0c1Byb3BlcnRpZXMoSVJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogcmVsZWFzZSBjYWNoZSBvZiBET00gdHJlZSBpbiAuY29udGVudHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUNhY2hlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgTWFwIHByb3BlcnRpZXMpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JQ29udGVudFNldHRpbmdzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmOGI0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JQ29udGVudFNldHRpbmdzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci0KLS8qKgotKiBAZGVwcmVjYXRlZCBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIG5vIG9uZSBjYXJlcyBhbnl3YXlzLgotKi8KLWludGVyZmFjZSBJQ29udGVudFNldHRpbmdzSGFuZGxlciB7Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGUoZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JQ29udGVudFNldHRpbmdzTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExNTFmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JQ29udGVudFNldHRpbmdzTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNlZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50U2V0dGluZ3NMaXN0ZW5lciB7Ci0KLQl2b2lkIGNvbnRlbnRTZXR0aW5nc0NoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSU5vdGlmeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSU5vdGlmeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGNmNWZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lOb3RpZnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLS8qKgotKiBAZGVwcmVjYXRlZCBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIG5vIG9uZSBjYXJlcyBhbnl3YXlzLgotKi8KLWludGVyZmFjZSBJTm90aWZ5IHsKLQotCXZvaWQgbm90aWZ5TGlzdGVuZXJzKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSByZXNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JU3ViamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSVN1YmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmNDAzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JU3ViamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBTZWUKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3ViamVjdCB7Ci0KLQl2b2lkIGFkZExpc3RlbmVyKElDb250ZW50U2V0dGluZ3NMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQl2b2lkIHJlbW92ZUxpc3RlbmVyKElDb250ZW50U2V0dGluZ3NMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL1NpbXBsZU5vZGVPcGVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvU2ltcGxlTm9kZU9wZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZTdhMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvU2ltcGxlTm9kZU9wZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAoSW50YWxpbykgLSBidWcgMzAwNDM0IC0gTWFrZSBpbm5lciBjbGFzc2VzIHN0YXRpYyB3aGVyZSBwb3NzaWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotKiBAZGVwcmVjYXRlZCBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIG5vIG9uZSBjYXJlcyBhbnl3YXlzLgotKi8KLWNsYXNzIFNpbXBsZU5vZGVPcGVyYXRvciB7Ci0KLQlzdGF0aWMgY2xhc3MgQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHVibGljIENyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgewotCQkJc3VwZXIocmVhc29uKTsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGNsYXNzIFJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgewotCQkJc3VwZXIocmVhc29uKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBXcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBXcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgewotCQkJc3VwZXIocmVhc29uKTsKLQkJfQotCX0KLQotCS8vIHdyaXRlciBjbGFzcyBmb3IgLmNvbnRlbnRTZXR0aW5ncy4KLQlzdGF0aWMgY2xhc3MgWE1MRG9jdW1lbnRXcml0ZXIgewotCQlPdXRwdXRTdHJlYW0gZk91dDsKLQotCQlwcm90ZWN0ZWQgWE1MRG9jdW1lbnRXcml0ZXIoT3V0cHV0U3RyZWFtIG91dCkgewotCQkJdGhpcy5mT3V0ID0gb3V0OwotCQl9Ci0KLQkJcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2xvc2UoKSB7Ci0JCQl0cnkgewotCQkJCWZPdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nLCBzaG91bGRuJ3QgbWF0dGVyCi0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzZXJpYWxpemUoRG9jdW1lbnQgc291cmNlRG9jdW1lbnQpIHRocm93cyBXcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gewotCQkJLy8gSkFYUCB0cmFuc2Zvcm1hdGlvbgotCQkJU291cmNlIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2Uoc291cmNlRG9jdW1lbnQpOwotCQkJdHJ5IHsKLQkJCQlUcmFuc2Zvcm1lciBzZXJpYWxpemVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLQkJCQl0cnkgewotCQkJCQlzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiNCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkvLyB1bnN1cHBvcnRlZCBwcm9wZXJ0aWVzCi0JCQkJfQotCQkJCXNlcmlhbGl6ZXIudHJhbnNmb3JtKGRvbVNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChmT3V0KSk7Ci0JCQl9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBXcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCQl0aHJvdyBuZXcgV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU2ltcGxlTm9kZU9wZXJhdG9yIGEgPSBudWxsOwotCQl0cnkgewotCQkJYSA9IG5ldyBTaW1wbGVOb2RlT3BlcmF0b3IoIndvcmtzcGFjZS9vcmcuZWNsaXBzZS5leGFtcGxlcy5jb250ZW50c2V0dGluZ3MvLmNvbnRlbnRzZXR0aW5ncy54bWwiKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXhpdCgwKTsKLQkJfQotCi0JCS8vIHByaW50IGFsbCBFbGVtZW50cwotCQkvL2EucHJpbnRUcmVlKGl0ZXIpOwotCi0JCS8vIGFkZCBFbGVtZW50Ci0JCU1hcCBhdHRNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWF0dE1hcC5wdXQoInBhdGgiLCAiaG9nZXBhdGgiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXR0TWFwLnB1dCgiZkRvY3VtZW50LXR5cGUiLCAiZG9jdW1lbnRob2dlaG9nZSIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhLmFkZEVsZW1lbnRVbmRlclJvb3QoImZpbGUiLCBhdHRNYXApOy8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJYS53cml0ZURvY3VtZW50KFN5c3RlbS5vdXQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQotCX0KLQotCS8vbmV2ZXIgdXNlZAotCS8vcHJpdmF0ZSBET01QYXJzZXIgcGFyc2VyOwotCXByaXZhdGUgRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgTm9kZSByb290OwotCi0JcHJpdmF0ZSBTdHJpbmcgc2V0dGluZ3NGaWxlTmFtZTsKLQotCi0JcHVibGljIFNpbXBsZU5vZGVPcGVyYXRvcihEb2N1bWVudCBkb2MpIHRocm93cyBDcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQotCQlpZiAoZG9jID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbigiRG9jdW1lbnQgZG9jPT1udWxsIik7Ly8kTk9OLU5MUy0xJAotCQlmRG9jdW1lbnQgPSBkb2M7Ci0JCXJvb3QgPSBmRG9jdW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbigiTm9kZSByb290PT1udWxsIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTaW1wbGVOb2RlT3BlcmF0b3IoU3RyaW5nIGZ1bGxQYXRoKSB0aHJvd3MgUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gewotCQl0aGlzLnNldHRpbmdzRmlsZU5hbWUgPSBmdWxsUGF0aDsKLQkJY3JlYXRlT2JqZWN0T2ZEb2N1bWVudCgpOwotCX0KLQotCS8vIGFkZCBhdHRyaWJ1dGUoYXR0TmFtZT1hdHRWYWx1ZSkgb2YgZWxlIHdpdGhvdXQgY2hlY2tpbmcgb3ZlcmxhcHBpbmcgb2YKLQkvLyBhbm90aGVyIGF0dHJpYnV0ZXMgb2YgZWxlLgotCS8vIGlmIG92ZXJsYXBwaW5nICxvdmVycmlkZQotCXByb3RlY3RlZCBOb2RlIGFkZEF0dHJpYnV0ZUF0KEVsZW1lbnQgZWxlLCBTdHJpbmcgYXR0TmFtZSwgU3RyaW5nIGF0dFZhbHVlKSB7Ci0JCUF0dHIgYXR0ID0gZkRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShhdHROYW1lKTsKLQkJYXR0LnNldFZhbHVlKGF0dFZhbHVlKTsKLQkJaWYgKGVsZSAhPSBudWxsKQotCQkJZWxlLnNldEF0dHJpYnV0ZU5vZGUoYXR0KTsKLQkJcmV0dXJuIGVsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBhZGRFbGVtZW50VW5kZXIoTm9kZSBwYXJlbnQsIFN0cmluZyB0YWdOYW1lLCBNYXAgYXR0TWFwKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCB0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRWxlbWVudCBlID0gZkRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCWlmIChhdHRNYXAgIT0gbnVsbCkgewotCQkJaWYgKCFhdHRNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJU2V0IGF0dEtleXMgPSBhdHRNYXAua2V5U2V0KCk7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IGF0dEtleXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQllLnNldEF0dHJpYnV0ZShrZXksIChTdHJpbmcpIGF0dE1hcC5nZXQoa2V5KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXBhcmVudC5hcHBlbmRDaGlsZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIE5vZGUgYWRkRWxlbWVudFVuZGVyUm9vdChTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gYWRkRWxlbWVudFVuZGVyKHJvb3QsIHRhZ05hbWUsIG51bGwpOwotCX0KLQotCS8vIGFkZCBlbGVtZW50IHdpdGggYXR0TWFwIGFzIGF0dHJpYnV0ZSB3aXRob3V0IGNoZWNraW5nIG92ZXJsYXBwaW5nLgotCXByb3RlY3RlZCBmaW5hbCBOb2RlIGFkZEVsZW1lbnRVbmRlclJvb3QoU3RyaW5nIHRhZ05hbWUsIE1hcCBhdHRNYXApIHsKLQkJcmV0dXJuIGFkZEVsZW1lbnRVbmRlcihyb290LCB0YWdOYW1lLCBhdHRNYXApOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVPYmplY3RPZkRvY3VtZW50KCkgdGhyb3dzIFJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWZEb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgRmlsZShzZXR0aW5nc0ZpbGVOYW1lKSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gcGFyc2luZyIgKyBzZXR0aW5nc0ZpbGVOYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJJL08gZXhjZXB0aW9uIHBhcnNpbmciICsgc2V0dGluZ3NGaWxlTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gYWNjZXNzaW5nIERPTUltcGxlbWVudGF0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gYWNjZXNzaW5nIERPTUltcGxlbWVudGF0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvL2dldCB0aGUgcm9vdCBvZiB0aGUgWE1MIGZEb2N1bWVudAotCQlyb290ID0gZkRvY3VtZW50LmdldExhc3RDaGlsZCgpOwotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oIkVycm9yOiBOb2RlIHJvb3Q9PW51bGwiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldEF0dHJpYnV0ZXNPZihOb2RlIG5vZGUpIHsKLQkJaWYgKCFub2RlLmhhc0F0dHJpYnV0ZXMoKSkKLQkJCXJldHVybiBudWxsOwotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBzaXplID0gYXR0cnMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCW1hcC5wdXQoYXR0ci5nZXROYW1lKCksIGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIChtYXApOwotCX0KLQotCXByaXZhdGUgTm9kZSBnZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShOb2RlIGZpcnN0LCBTdHJpbmcgYXR0TmFtZSwgU3RyaW5nIGF0dFZhbHVlKSB7Ci0JCU5vZGUgbmF2cG9pbnQgPSBmaXJzdDsKLQkJd2hpbGUgKG5hdnBvaW50ICE9IG51bGwpIHsKLQkJCWlmIChuYXZwb2ludC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJTmFtZWROb2RlTWFwIG0gPSBuYXZwb2ludC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJaWYgKG0gPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKG0uZ2V0TmFtZWRJdGVtKGF0dE5hbWUpICE9IG51bGwpIHsKLQkJCQkJaWYgKGF0dFZhbHVlLmVxdWFscygoKEF0dHIpIG0uZ2V0TmFtZWRJdGVtKGF0dE5hbWUpKS5nZXROb2RlVmFsdWUoKSkpCi0JCQkJCQlyZXR1cm4gbmF2cG9pbnQ7Ci0JCQkJfQotCQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBuYXZwb2ludC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJaWYgKGNoaWxkTm9kZXMgIT0gbnVsbCAmJiBjaGlsZE5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCQlOb2RlIGhvbGROb2RlID0gZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUobmF2cG9pbnQuZ2V0Rmlyc3RDaGlsZCgpLCBhdHROYW1lLCBhdHRWYWx1ZSk7Ci0JCQkJCWlmIChob2xkTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gaG9sZE5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQluYXZwb2ludCA9IG5hdnBvaW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyByZXR1cm4gYSAoZmlyc3QpIEVsZW1lbnQgd2l0aCBhdHRyKGF0dE5hbWU9YXR0VmFsdWUpIGl0IGlmIGV4aXN0cywKLQkvLyBvdGhlcndpc2UgcmV0dXJuIG51bGwKLQlwcm90ZWN0ZWQgTm9kZSBnZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShTdHJpbmcgYXR0TmFtZSwgU3RyaW5nIGF0dFZhbHVlKSB7Ci0JCWlmIChhdHROYW1lID09IG51bGwgfHwgYXR0VmFsdWUgPT0gbnVsbCB8fCAhZkRvY3VtZW50Lmhhc0NoaWxkTm9kZXMoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoZkRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKSwgYXR0TmFtZSwgYXR0VmFsdWUpOwotCX0KLQotCS8vIHJldHJ1biBFbGVtZW50IHdoaWNoIGhhcyBub2RlTmFtZSBhcyBOb2RlIE5hbWUKLQlwcm90ZWN0ZWQgTm9kZSBnZXRFbGVtZW50V2l0aE5vZGVOYW1lKFN0cmluZyBub2RlTmFtZSkgewotCQlpZiAobm9kZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlTGlzdCBub2RlcyA9IGZEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShub2RlTmFtZSk7Ci0JCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiBub2Rlcy5pdGVtKDApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50VHJlZShOb2RlSXRlcmF0b3IgaXRlcikgewotCQlOb2RlIG47Ci0JCXdoaWxlICgobiA9IGl0ZXIubmV4dE5vZGUoKSkgIT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG4uZ2V0Tm9kZU5hbWUoKSArICI6Iik7Ly8kTk9OLU5MUy0xJAotCQkJTmFtZWROb2RlTWFwIG0gPSBuLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWlmIChtID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG0uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCVN0cmluZyBhdHROYW1lID0gbS5pdGVtKGkpLmdldE5vZGVOYW1lKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludCgiICIgKyBhdHROYW1lICsgIj0iICsgbS5pdGVtKGkpLmdldE5vZGVWYWx1ZSgpKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQkvLyByZW1vdmUgYXR0cmlidXRlKGF0dE5hbWUpIGF0IGVsZS4KLQlwcm90ZWN0ZWQgQXR0ciByZW1vdmVBdHRyaWJ1dGVBdChFbGVtZW50IGVsZSwgU3RyaW5nIGF0dE5hbWUpIHsKLQkJaWYgKGVsZSA9PSBudWxsIHx8IGF0dE5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBdHRyIGF0dCA9IGVsZS5nZXRBdHRyaWJ1dGVOb2RlKGF0dE5hbWUpOwotCQllbGUucmVtb3ZlQXR0cmlidXRlKGF0dE5hbWUpOwotCQlyZXR1cm4gYXR0OwotCX0KLQotCXByb3RlY3RlZCBFbGVtZW50IHJlbW92ZUVsZW1lbnRXaXRoKFN0cmluZyBub2RlTmFtZSkgewotCQlOb2RlTGlzdCBub2RlcyA9IGZEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShub2RlTmFtZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJbm9kZXMuaXRlbShpKS5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQobm9kZXMuaXRlbShpKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gcmVtb3ZlIGEgKGZpcnN0KSBFbGVtZW50IHdpdGggYXR0cihhdHROYW1lPWF0dFZhbHVlKSBhbmQgcmV0dXJuIGl0IGlmCi0JLy8gZXhpc3RzLCBvdGhlcndpc2UgcmV0dXJuIG51bGwKLQlwcm90ZWN0ZWQgRWxlbWVudCByZW1vdmVFbGVtZW50V2l0aChTdHJpbmcgYXR0TmFtZSwgU3RyaW5nIGF0dFZhbHVlKSB7Ci0JCWlmIChmRG9jdW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSBnZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShhdHROYW1lLCBhdHRWYWx1ZSk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKGVsZW1lbnQpOwotCQkJCXJldHVybiAoRWxlbWVudCkgZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCS8vIHVwZGF0ZSBhdHRyaWJ1dGUoYXR0TmFtZT1uZXdWYWx1ZSkgYXQgZWxlIGlmIGJvdGggZWxlIGFuZCBhdHRyaWJ1dGUgb2YKLQkvLyBlbGUgZXhpc3QKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBdHRyaWJ1dGVBdChFbGVtZW50IGVsZSwgU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlBdHRyIGF0dCA9IG51bGw7Ci0JCWlmIChlbGUgIT0gbnVsbCkKLQkJCWlmICgoYXR0ID0gZWxlLmdldEF0dHJpYnV0ZU5vZGUoYXR0TmFtZSkpICE9IG51bGwpCi0JCQkJYXR0LnNldFZhbHVlKG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZURvY3VtZW50KE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBXcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gewotCQlYTUxEb2N1bWVudFdyaXRlciB3cml0ZXIgPSBuZXcgWE1MRG9jdW1lbnRXcml0ZXIob3V0KTsKLQkJdHJ5IHsKLQkJCXdyaXRlci5zZXJpYWxpemUoZkRvY3VtZW50KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXdyaXRlci5jbG9zZSgpOwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRJTy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db2RlZElPLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMzE4MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db2RlZElPLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29kZWRJTyB7Ci0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQlVGX1NJWkUgPSAxMDI0ICogODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9NQVJLX1NJWkUgPSBNQVhfQlVGX1NJWkU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19TUEVDX0RFRkFVTFQgPSAiTm9TcGVjRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgb3ZlcnJpZGVuQ2hhcnNldHMgPSBudWxsOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlcmUgYXJlIHR3byB3ZWxsIGtub3duIHVuZGVyc3Rvb2QgY2FzZXMgd2hlcmUgdGhlIHN0YW5kYXJkL2RlZmF1bHQKLQkgKiBKYXZhIE1hcHBpbmdzIGFyZSBub3Qgc3VmZmljaWVudC4gKFRoYW5rcyB0byBIaXJvdGFrYSBNYXRzdW1vdG8gZm9yCi0JICogcHJvdmlkaW5nIHRoZXNlIHR3bykuIEkgYmVsaWV2ZSB0aGVyZSBhcmUgb3RoZXJzIHRoYXQgaW5kaXZpZHVhbAotCSAqIGN1c3RvbWVycyBoYXZlIHJlcXVlc3RlZCB0byBvdmVycmlkZSBvbiBhIGNhc2UgYnkgY2FzZSBiYXNpcywgYnV0IEkndmUKLQkgKiBsb3N0IHRoZSBkZXRhaWxzLiBUT0RPLWZ1dHVyZTogZG9jdW1lbnQgc29tZSBvZiB0aG9zZSB1c2UtY2FzZXMuCi0JICogPC9wPgotCSAqIDx1bD4KLQkgKiA8bGk+SVNPLTg4NTktOC1JPC9saT4KLQkgKiA8cD4KLQkgKiBJbiB0aGUgY29kZSBjb252ZXJzaW9uIHBvaW50IG9mIHZpZXcsIElTTy05OTU5LTggYW5kIElTTy04ODU5LTgtSSBhcmUKLQkgKiB0aGUgc2FtZS4gSG93ZXZlci4gdGhlIHJlcHJlc2VudGF0aW9uIG9uIHRoZSBicm93c2VyIGlzIGRpZmZlcmVudC4gKAotCSAqIEl0J3MgdmVyeSB2ZXJ5IGhhcmQgdG8gZXhwbGFpbiB0aGlzIGludG8gdGhlIHdvcmRzLCBidXQgb25jZSB5b3Ugd2lsbAotCSAqIHNlZSwgeW91IHdpbGwgdW5kZXJzdGFuZCBpdCA6KSBNYW55IEJpRGkgSFRNTC9KU1BzIHVzZSBJU08tODg1OS04LUkgaW4KLQkgKiBNRVRBL3BhZ2UgZGlyZWN0aXZlLiBTbyBXU0FEIG5lZWRzIHRvIHN1cHBvcnQgdGhpcyBlbmNvZGluZy4KLQkgKiA8L3A+Ci0JICogPGxpPlgtU0pJUzwvbGk+Ci0JICogPHA+Ci0JICogQmVjYXVzZSBNb3NhaWMvTmF2aWdhdG9yIDIuMCBzdXBwb3J0ZWQgb25seSBYLVNKSVMvWC1FVUMtSlAsIGxvdHMgb2YKLQkgKiBvbGQgSFRNTCBmaWxlcyB1c2VkIFgtU0pJUy9YLUVVQy1KUCBzbyB0aGF0IHRoZSBjdXN0b21lcnMgc3RpbGwgd2FudCB1cwotCSAqIHRvIHN1cHBvcnQgdGhpcyBjb2RlIGNvbnZlcnNpb24gZm9yIEhUTUwgZmlsZXMuCi0JICogPC9wPgotCSAqIDwvdWw+Ci0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuIHRoZSBkZXRlY3RlZENoYXJzZXROYW1lLCBpZiBubyBvdmVycmlkZXMsIG90aGVyd2lzZSB0aGUgY2hhcnNldAotCSAqICAgICAgICAgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqLwotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGRlbGliZXJhdGx5ICdkZWZhdWx0IGFjY2Vzcycgc2luY2UgY2xpZW50cyBzaG91bGQgbm90Ci0JICogbmVlZCB0byBhY2Nlc3MgdGhpcyBpbmZvcm1hdGlvbiBkaXJlY3RseS4KLQkgKi8KLQlzdGF0aWMgcHVibGljIFN0cmluZyBjaGVja01hcHBpbmdPdmVycmlkZXMoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJLy8gVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2hhdCB3YXMgcGFzc2VkIGluLCBpZgotCQkvLyB0aGVyZSBhcmUgbm8KLQkJLy8gb3ZlcnJpZGVzLgotCQlTdHJpbmcgcmVzdWx0ID0gZGV0ZWN0ZWRDaGFyc2V0TmFtZTsKLQkJU3RyaW5nIG5ld1Jlc3VsdCA9IGdldE92ZXJyaWRlbkNoYXJzZXRzKCkuZ2V0UHJvcGVydHkoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCWlmIChuZXdSZXN1bHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gbmV3UmVzdWx0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVuY29kaW5nTWVtZW50byBjcmVhdGVFbmNvZGluZ01lbWVudG8oYnl0ZVtdIGRldGVjdGVkQm9tLCBTdHJpbmcgamF2YUNoYXJzZXROYW1lLCBTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHVuU3VwcG9ydGVkTmFtZSwgU3RyaW5nIHNwZWNEZWZhdWx0RW5jb2RpbmcsIFN0cmluZyByZWFzb24pIHsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJcmVzdWx0LnNldEphdmFDaGFyc2V0TmFtZShqYXZhQ2hhcnNldE5hbWUpOwotCQlyZXN1bHQuc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gVE9ETzogaWYgZGV0ZWN0ZWRDaGFyc2V0IGFuZCBzcGVjIGRlZmF1bHQgaXMKLQkJLy8gbnVsbCwgbmVlZCB0byB1c2UgIndvcmsKLQkJLy8gYmVuY2ggYmFzZWQiIGRlZmF1bHRzLgotCQlpZiAoc3BlY0RlZmF1bHRFbmNvZGluZyA9PSBudWxsKQotCQkJcmVzdWx0LnNldEFwcHJvcHJpYXRlRGVmYXVsdChOT19TUEVDX0RFRkFVTFQpOwotCQllbHNlCi0JCQlyZXN1bHQuc2V0QXBwcm9wcmlhdGVEZWZhdWx0KHNwZWNEZWZhdWx0RW5jb2RpbmcpOwotCQlpZiAodW5TdXBwb3J0ZWROYW1lICE9IG51bGwpIHsKLQkJCXJlc3VsdC5zZXRJbnZhbGlkRW5jb2RpbmcodW5TdXBwb3J0ZWROYW1lKTsKLQkJfQotCQkvLyBjaGVjayBpZiB2YWxpZAotCQl0cnkgewotCQkJQ2hhcnNldC5pc1N1cHBvcnRlZChqYXZhQ2hhcnNldE5hbWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0LnNldEludmFsaWRFbmNvZGluZyhqYXZhQ2hhcnNldE5hbWUpOwotCQl9Ci0KLQkJLy8gY2hlY2sgVVRGODNCeXRlQk9NVXNlZCBhbmQgVW5pY29kZVN0cmVhbQotCQlpZiAoZGV0ZWN0ZWRCb20gIT0gbnVsbCkgewotCQkJaWYgKGRldGVjdGVkQm9tLmxlbmd0aCA9PSAyKQotCQkJCXJlc3VsdC5zZXRVbmljb2RlU3RyZWFtKHRydWUpOwotCQkJZWxzZSBpZiAoZGV0ZWN0ZWRCb20ubGVuZ3RoID09IDMpCi0JCQkJcmVzdWx0LnNldFVURjgzQnl0ZUJPTVVzZWQodHJ1ZSk7Ci0JCQlyZXN1bHQuc2V0VW5pY29kZUJPTShkZXRlY3RlZEJvbSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW5jb2RpbmdNZW1lbnRvIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlyZXR1cm4gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGRldGVjdGVkQ2hhcnNldE5hbWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBFbmNvZGluZ01lbWVudG8gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lLCBTdHJpbmcgcmVhc29uKSB7Ci0JCXJldHVybiBjcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgcmVhc29uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW5jb2RpbmdNZW1lbnRvIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIHNwZWNEZWZhdWx0RW5jb2RpbmcpIHsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJcmVzdWx0ID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlTdHJpbmcgamF2YUNoYXJzZXQgPSBnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQlyZXN1bHQuc2V0SmF2YUNoYXJzZXROYW1lKGphdmFDaGFyc2V0KTsKLQkJcmVzdWx0LnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJaWYgKHNwZWNEZWZhdWx0RW5jb2RpbmcgPT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRBcHByb3ByaWF0ZURlZmF1bHQoTk9fU1BFQ19ERUZBVUxUKTsKLQkJZWxzZQotCQkJcmVzdWx0LnNldEFwcHJvcHJpYXRlRGVmYXVsdChzcGVjRGVmYXVsdEVuY29kaW5nKTsKLQkJLy8gY2hlY2sgaWYgdmFsaWQKLQkJdHJ5IHsKLQkJCUNoYXJzZXQuaXNTdXBwb3J0ZWQoamF2YUNoYXJzZXQpOwotCQl9IGNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0LnNldEludmFsaWRFbmNvZGluZyhqYXZhQ2hhcnNldCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgaWYgaW52YWxpZCBjaGFyc2V0IG5hbWUgKGluIHdoaWNoIGNhc2UKLQkgKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiBzaG91bGQgYmUgdXNlZCwgaWYgYSBuYW1lIGlzIHJlYWxseSBuZWVkIGZvciBzb21lCi0JICogInNhdmUgYW55d2F5IiBjYXNlcykuCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQkvLyB3ZSBkb24ndCBhbGxvdyBudWxsIGFyZ3VtZW50IChvciByaXNrIE5QRSBvcgotCQkvLyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbGF0ZXIgYXQgc2V2ZXJhbAotCQkvLyBwb2ludHMuCi0JCUFzc2VydC5pc05vdE51bGwoZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgImlsbGVnYWwgY2hhcnNldCBhcmd1bWVudC4gaXQgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9IGRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JCS8vIDEuIENoZWNrIGV4cGxpY2l0IG1hcHBpbmcgb3ZlcnJpZGVzIGZyb20KLQkJLy8gcHJvcGVydHkgZmlsZQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gMi4gVXNlIHRoZSAiY2Fub25pY2FsIiBuYW1lIGZyb20gSlJFIG1hcHBpbmdzCi0JCS8vIE5vdGU6IHNlZSBDaGFyc2V0IEphdmFEb2MsIHRoZSBuYW1lIHlvdSBnZXQgb25lCi0JCS8vIHdpdGggY2FuIGJlIGFsaWFzLAotCQkvLyB0aGUgbmFtZSB5b3UgZ2V0IGJhY2sgaXMgInN0YW5kYXJkIiBuYW1lLgotCQlDaGFyc2V0IGphdmFDaGFyc2V0ID0gbnVsbDsKLQkJLy8gTm90ZTogdGhpcyB3aWxsIGltbWVkaWF0bHkgdGhyb3cKLQkJLy8gIlVuc3VwcG90ZWRDaGFyc2V0RXhjZXB0aW9uIiBpZiBpdAotCQkvLyBpbnZhbGlkLiBJc3N1ZTogSXMgaXQgbW9yZSBjbGllbnQgZnJpZW5kbHkgdG8KLQkJLy8gZWF0IHRoYXQgZXhjZXB0aW9uIGFuZCByZXR1cm4gbnVsbD8KLQkJamF2YUNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUocmVzdWx0KTsKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0Lm5hbWUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3ZlcnJpZGVuQ2hhcnNldHMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBnZXRPdmVycmlkZW5DaGFyc2V0cygpIHsKLQkJaWYgKG92ZXJyaWRlbkNoYXJzZXRzID09IG51bGwpIHsKLQkJCW92ZXJyaWRlbkNoYXJzZXRzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCUJ1bmRsZSBrZXlCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQpOwotCQkJSVBhdGgga2V5UGF0aCA9IG5ldyBQYXRoKCJjb25maWcvb3ZlcnJpZGUucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQlVUkwgbG9jYXRpb24gPSBQbGF0Zm9ybS5maW5kKGtleUJ1bmRsZSwga2V5UGF0aCk7Ci0JCQlJbnB1dFN0cmVhbSBwcm9wZXJ0aWVzSW5wdXRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlwcm9wZXJ0aWVzSW5wdXRTdHJlYW0gPSBsb2NhdGlvbi5vcGVuU3RyZWFtKCk7Ci0JCQkJb3ZlcnJpZGVuQ2hhcnNldHMubG9hZChwcm9wZXJ0aWVzSW5wdXRTdHJlYW0pOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIGNhbid0IHJlYWQsIGp1c3QgYXNzdW1lIHRoZXJlJ3Mgbm8KLQkJCQkvLyBvdmVycmlkZXMKLQkJCQkvLyBhbmQgcmVwZWF0ZWQgYXR0ZW1wdHMgd2lsbCBub3Qgb2NjdXIsCi0JCQkJLy8gc2luY2UgdGhleQotCQkJCS8vIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkKLQkJCQkvLyBQcm9wZXJ0aWVzIG9iamVjdAotCQkJfQotCQl9Ci0JCXJldHVybiBvdmVycmlkZW5DaGFyc2V0czsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIG5lZWQgbm90IGJlIGluc3RhbnRpYXRlZCAodGhvdWdoIGl0cyBzdWJjbGFzc2VzIGNhbiBiZSkuCi0JICovCi0JcHJvdGVjdGVkIENvZGVkSU8oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVuY29kaW5nTWVtZW50byBjcmVhdGVNZW1lbnRvKElDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uKSB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQ7Ci0JCVN0cmluZyBhcHByb3ByaWF0ZURlZmF1bHQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXREZWZhdWx0Q2hhcnNldCgpOwotCQlTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0ID0gKFN0cmluZykgY29udGVudERlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKTsKLQkJU3RyaW5nIHVuU3VwcG9ydGVkQ2hhcnNldCA9IChTdHJpbmcpIGNvbnRlbnREZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCk7Ci0JCVN0cmluZyBqYXZhQ2hhcnNldCA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDaGFyc2V0KCk7Ci0JCS8vIGludGVncml0eSBjaGVja3MgZm9yIGRlYnVnZ2luZwotCQlpZiAoamF2YUNoYXJzZXQgPT0gbnVsbCkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgImNoYXJzZXQgZXF1YWxlZCBudWxsISIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoamF2YUNoYXJzZXQubGVuZ3RoKCkgPT0gMCkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgImNoYXJzZXQgZXF1YWxlZCBlbXB0eVN0cmluZyEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJ5dGVbXSBCT00gPSAoYnl0ZVtdKSBjb250ZW50RGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkvL3Jlc3VsdCA9IChFbmNvZGluZ01lbWVudG8pCi0JCS8vIGNvbnRlbnREZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuRU5DT0RJTkdfTUVNRU5UTyk7Ci0JCXJlc3VsdCA9IGNyZWF0ZUVuY29kaW5nTWVtZW50byhCT00sIGphdmFDaGFyc2V0LCBkZXRlY3RlZENoYXJzZXQsIHVuU3VwcG9ydGVkQ2hhcnNldCwgYXBwcm9wcmlhdGVEZWZhdWx0LCBudWxsKTsKLQkJaWYgKCFyZXN1bHQuaXNWYWxpZCgpKSB7Ci0JCQlyZXN1bHQuc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGFwcHJvcHJpYXRlRGVmYXVsdCk7Ci0JCQkvLyBpbnRlZ3JpdHkgY2hlY2sgZm9yIGRlYnVnZ2luZyAiaW52YWxpZCIgY2FzZXMuCi0JCQkvLyB0aGUgYXBwcnJpYXRlIGRlZmF1bHQgd2UgaGF2ZSwgc2hvdWxkIGVxdWFsIHdoYXQncyBpbiB0aGUKLQkJCS8vIGRldGVjdGVkIGZpZWxkLiAobm90IHN1cmUgdGhpcyBpcyBhbHdheXMgcmVxdWlyZWQpCi0JCQlpZiAoREVCVUcgJiYgYXBwcm9wcmlhdGVEZWZhdWx0ICE9IG51bGwgJiYgIWFwcHJvcHJpYXRlRGVmYXVsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0KSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJhcHByb3ByaWF0ZSBkaWQgbm90IGVxdWFsIGRldGVjdGVkLCBhcyBleHBlY3RlZCBmb3IgaW52YWxpZCBjaGFyc2V0IGNhc2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db2RlZFJlYWRlckNyZWF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRSZWFkZXJDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NWNjZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db2RlZFJlYWRlckNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldERlY29kZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuQnVmZmVyZWRMaW1pdGVkU3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5OdWxsSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuVW5pY29kZUJPTUVuY29kaW5nRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnMuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbDsKLQotCi0vKioKLSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gY2VudHJhbGl6ZSBhbmFseXNpcyBvZiBhIGZpbGUgdG8gZGV0ZXJtaW5lCi0gKiB0aGUgbW9zdCBhcHByb3ByaWF0ZSBydWxlcyBvZiBkZWNvZGluZyBpdC4gVGhlIGludGVuZGVkIHVzZSBpcyB0byBzZXQgdGhlCi0gKiBpbnB1dCwgdGhlbiBnZXQgdGhlIHJlYWRlciBmb3IgdGhhdCBpbnB1dCB3aGljaCB3aWxsIGhhdmUgaXRzIGVuY29kaW5nIHNldAotICogYXBwcm9wcmlhdGVseS4gQWRkaXRpb25hbGx5LCB0aGVyZSBpcyBhbiBFbmNvZGluZ01lbWVudG8gcHJvdmlkZWQsIHdoaWNoCi0gKiB3aWxsIGJlIHJlcXVpcmVkLCBpbiBzb21lIGNhc2VzLCB0byBsYXRlciBkZXRlcm1pbmUgdGhlIG1vc3QgYXBwcm9wcmlhdGUKLSAqIGZvcm0gb2YgZW5jb2RlZCBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2RlZFJlYWRlckNyZWF0b3IgZXh0ZW5kcyBDb2RlZElPIHsKLQotCi0JcHJpdmF0ZSBib29sZWFuIGZDbGllbnRTdXBwbGllZFN0cmVhbTsKLQotCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50bzsKLQotCXByaXZhdGUgRW5jb2RpbmdSdWxlIGZFbmNvZGluZ1J1bGU7Ci0KLQlwcml2YXRlIFN0cmluZyBmRmlsZW5hbWU7Ci0KLQlwcml2YXRlIElGaWxlIGZJRmlsZTsKLQotCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJTRVRfVVRGXzE2PSAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUX1VURl8xNkxFPSAiVVRGLTE2TEUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQ29kZWRSZWFkZXJDcmVhdG9yKCkgewotCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvZGVkUmVhZGVyQ3JlYXRvcihJRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCXRoaXMoKTsKLQkJc2V0KGZpbGUpOwotCQlzZXRFbmNvZGluZ1J1bGUoRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCX0KLQotCXB1YmxpYyBDb2RlZFJlYWRlckNyZWF0b3IoSUZpbGUgZmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQl0aGlzKCk7Ci0JCXNldChmaWxlKTsKLQkJc2V0RW5jb2RpbmdSdWxlKGVuY29kaW5nUnVsZSk7Ci0JfQotCi0JcHVibGljIENvZGVkUmVhZGVyQ3JlYXRvcihTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0KLQkJdGhpcygpOwotCQlzZXQoZmlsZW5hbWUsIGlucHV0U3RyZWFtKTsKLQkJc2V0RW5jb2RpbmdSdWxlKEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQl9Ci0KLQlwdWJsaWMgQ29kZWRSZWFkZXJDcmVhdG9yKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHsKLQotCQl0aGlzKCk7Ci0JCXNldChmaWxlbmFtZSwgaW5wdXRTdHJlYW0pOwotCQlzZXRFbmNvZGluZ1J1bGUoZW5jb2RpbmdSdWxlKTsKLQl9Ci0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBjaGVja0ZvckVuY29kaW5nSW5Db250ZW50cyhJbnB1dFN0cmVhbSBsaW1pdGVkU3RyZWFtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQotCQkvLyBpZiBlbmNvZGluZyBtZW1lbnRvIGFscmVhZHkgc2V0LCB0aGVuIGlGaWxlIG11c3QKLQkJLy8gaGF2ZSBiZWVuIHNldCwgYW5kIG5vIG5lZWQgdG8gZ2V0IGFnYWluLgotCQlpZiAoZkVuY29kaW5nTWVtZW50byAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGZDbGllbnRTdXBwbGllZFN0cmVhbSkgewotCQkJCXRyeSB7Ci0JCQkJCWxpbWl0ZWRTdHJlYW0ucmVzZXQoKTsKLQkJCQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBjb250ZW50VHlwZU1hbmFnZXIuZ2V0RGVzY3JpcHRpb25Gb3IobGltaXRlZFN0cmVhbSwgZkZpbGVuYW1lLCBJQ29udGVudERlc2NyaXB0aW9uLkFMTCk7Ci0JCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJZkVuY29kaW5nTWVtZW50byA9IGNyZWF0ZU1lbWVudG8oY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQkJfQotCQkJCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbGltaXRlZFN0cmVhbS5yZXNldCgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgc3RhdGU6Ci0JCQkJLy8gZW5jb2RpbmdNZW1lbnRvIHdhcyBudWxsIGJ1dCBubyBpbnB1dCBzdHJlYW0gc3VwcGxpZWQgYnkKLQkJCQkvLyBjbGllbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgIXJlc3VsdC5pc1ZhbGlkKCkgJiYgIWZvcmNlRGVmYXVsdCgpKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbChyZXN1bHQpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0KLQkgKi8KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBjaGVja1N0cmVhbUZvckJPTShJbnB1dFN0cmVhbSByZXNldHRhYmxlTGltaXRlZFN0cmVhbSkgewotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQkJVW5pY29kZUJPTUVuY29kaW5nRGV0ZWN0b3IgdW5pY29kZUJPTUVuY29kaW5nRGV0ZWN0b3IgPSBuZXcgVW5pY29kZUJPTUVuY29kaW5nRGV0ZWN0b3IoKTsKLQkJdW5pY29kZUJPTUVuY29kaW5nRGV0ZWN0b3Iuc2V0KHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtKTsKLQkJcmVzdWx0ID0gdW5pY29kZUJPTUVuY29kaW5nRGV0ZWN0b3IuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlGaWxlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZpbmRNZW1lbnRvRnJvbUZpbGVDYXNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIFRoaXMgbWV0aG9kIHByb3ZpZGVzIHBvc3NpYmxlIGltcHJvdmVkIHBlcmZvcm1hbmNlIGF0IHRoZQotCQkJLy8gY29zdCBvZiBzb21ldGltZXMgcmV0dXJuaW5nIG51bGwKLQkJCWlmIChmSUZpbGUuZXhpc3RzKCkpCi0JCQkJY29udGVudERlc2NyaXB0aW9uID0gZklGaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEFzc3VtZSBpZiBjb3JlIGV4Y2VwdGlvbiBvY2N1cnMsIHdlIGNhbiBzdGlsbCB0cnkgbW9yZQotCQkJLy8gZXhwZW5zaXZlCi0JCQkvLyBkaXNjb3Zlcnkgb3B0aW9ucy4KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsICYmIGZJRmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljb250ZW50cyA9IGZJRmlsZS5nZXRDb250ZW50cygpOwotCQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldERlc2NyaXB0aW9uRm9yKGNvbnRlbnRzLCBmSUZpbGUuZ2V0TmFtZSgpLCBJQ29udGVudERlc2NyaXB0aW9uLkFMTCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJCS8vIEFzc3VtZSBpZiBjb3JlIGV4Y2VwdGlvbiBvY2N1cnMsIHdlIGNhbid0IHJlYWxseSBkbyBtdWNoCi0JCQkJLy8gd2l0aAotCQkJCS8vIGRldGVybWluaW5nIGVuY29kaW5nLCBldGMuCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCQkJdGhyb3cgZTE7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKLQkJCQkvLyBXZSBsaWtlbHkgY291bGRuJ3QgZ2V0IHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSwgc29tZXRoaW5nCi0JCQkJLy8gaXMgcmVhbGx5IHdyb25nCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJdGhyb3cgZTI7Ci0JCQl9Ci0JCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVNZW1lbnRvKGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSBwcmltYXJ5IG1ldGhvZCB3aGljaCBjb250YWlucyB0aGUgaGlnaGVzdCBsZXZlbCBydWxlcyBmb3IgaG93IHRvCi0JICogZGVjaWRlIGFwcHJvcHJpYXRlIGRlY29kaW5nIHJ1bGVzOiAxLiBmaXJzdCBjaGVjayBmb3IgdW5pY29kZSBzdHJlYW0gMi4KLQkgKiB0aGVuIGxvb2tlZCBmb3IgZW5jb2Rpbmcgc3BlY2lmaWVkIGluIGNvbnRlbnQgKGFjY29yZGluZyB0byB0aGUgdHlwZSBvZgotCSAqIGNvbnRlbnQgdGhhdCBpcyBpdCAuLi4geG1sLCBodG1sLCBqc3AsIGV0Yy4gMy4gdGhlbiBjaGVjayBmb3IgdmFyaW91cwotCSAqIHNldHRpbmdzOiBmaWxlIHNldHRpbmdzIGZpcnN0LCBpZiBudWxsIGNoZWNrIHByb2plY3Qgc2V0dGluZ3MsIGlmIG51bGwsCi0JICogY2hlY2sgdXNlciBwcmVmZXJlbmNlcy4gNC4gbGFzdGx5IChvciwgd2hhdCBpcyB0aGUgbGFzdCB1c2VyCi0JICogcHJlZmVyZW5jZSkgaXMgdG8gdXNlICJ3b3JrYmVuY2ggZGVmYXVsdHMiLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmaW5kTWVtZW50b0Zyb21TdHJlYW1DYXNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJcmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0gPSBnZXRMaW1pdGVkU3RyZWFtKGdldFJlc2V0dGFibGVTdHJlYW0oKSk7Ci0JCQlpZiAocmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0gIT0gbnVsbCkgewotCQkJCS8vIGZpcnN0IGNoZWNrIGZvciB1bmljb2RlIHN0cmVhbQotCQkJCXJlc3VsdCA9IGNoZWNrU3RyZWFtRm9yQk9NKHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtKTsKLQkJCQkvLyBpZiBub3QgdGhhdCwgdGhlbiBjaGVjayBjb250ZW50cwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXNldHRhYmxlTGltaXRlZFN0cmVhbS5yZXNldCgpOwotCQkJCQlyZXN1bHQgPSBjaGVja0ZvckVuY29kaW5nSW5Db250ZW50cyhyZXNldHRhYmxlTGltaXRlZFN0cmVhbSk7Ci0JCQkJfQotCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBzdHJlYW0gbnVsbCwgbWF5IG5hbWUncyBub3QuCi0JCQkJaWYgKGZGaWxlbmFtZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGZpbGVuYW1lIG5vdCBudWxsCi0JCQkJCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gY29udGVudFR5cGVNYW5hZ2VyLmdldERlc2NyaXB0aW9uRm9yKG5ldyBOdWxsSW5wdXRTdHJlYW0oKSwgZkZpbGVuYW1lLCBJQ29udGVudERlc2NyaXB0aW9uLkFMTCk7Ci0JCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gY3JlYXRlTWVtZW50byhjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtICE9IG51bGwpIHsKLQkJCQloYW5kbGVTdHJlYW1DbG9zZShyZXNldHRhYmxlTGltaXRlZFN0cmVhbSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZm9yY2VEZWZhdWx0KCkgewotCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChmRW5jb2RpbmdSdWxlICE9IG51bGwgJiYgZkVuY29kaW5nUnVsZSA9PSBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFJlYWRlciBnZXRDb2RlZFJlYWRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJUmVhZGVyIHJlc3VsdCA9IG51bGw7Ci0JCS8vIHdlIG1ha2UgYSBsb2NhbCBjb3B5IG9mIGVuY29kaW5nIG1lbWVudG8gc28KLQkJLy8gc3RyZWFtIHdvbid0Ci0JCS8vIGJlIGFjY2Vzc2VkIHNpbXVsdGFuZW91c2x5LgotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZW5jb2RpbmdNZW1lbnRvLCAiQXBwZWFycyByZWFkZXIgcmVxdWVzdGVkIGJlZm9yZSBmaWxlIG9yIHN0cmVhbSBzZXQiKTsgLy8kTk9OLU5MUy0xJAotCQlJbnB1dFN0cmVhbSBzdHJlYW1Ub1JldHVybiA9IGdldFJlc2V0dGFibGVTdHJlYW0oKTsKLQkJc3RyZWFtVG9SZXR1cm4ucmVzZXQoKTsKLQkJLy8gaWYgVVRGIDMgYnl0ZSBCT00gaXMgdXNlZCAob3IgVVRGLTE2TEUpLCB0aGUKLQkJLy8gYnVpbHQgaW4gY29udmVydGVycwotCQkvLyBkb24ndAotCQkvLyBjb3JyZWN0IHNraXAgYWxsIHRocmVlIGJ5dGVzIC4uLiBzbyBza2lwCi0JCS8vIHJlbWFpbmluZyBvbmUgdG8gbGVhdmUKLQkJLy8gc3RyZWFtIHRyYW5zcGFyZW50bHkgcmVhZHkgZm9yIGNsaWVudC4KLQkJLy8gc2VlIC4uLiBUT0RPIGxvb2sgdXAgYnVnIG51bWJlcgotCQlpZiAoZW5jb2RpbmdNZW1lbnRvLmlzVW5pY29kZVN0cmVhbSgpKSB7Ci0JCQlzdHJlYW1Ub1JldHVybi5za2lwKDIpOwotCQl9Ci0JCWVsc2UgaWYgKGVuY29kaW5nTWVtZW50by5pc1VURjgzQnl0ZUJPTVVzZWQoKSkgewotCQkJc3RyZWFtVG9SZXR1cm4uc2tpcCgzKTsKLQkJfQotCQlTdHJpbmcgY2hhcnNldE5hbWUgPSBlbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0JCWlmIChjaGFyc2V0TmFtZSA9PSBudWxsKSB7Ci0JCQljaGFyc2V0TmFtZSA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCX0KLQkJaWYgKCFlbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpICYmICFmb3JjZURlZmF1bHQoKSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwoZW5jb2RpbmdNZW1lbnRvKTsKLQkJfQotCi0JCWlmIChmRW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKSB7Ci0JCQljaGFyc2V0TmFtZSA9IGVuY29kaW5nTWVtZW50by5nZXRBcHByb3ByaWF0ZURlZmF1bHQoKTsKLQkJfQotCQkKLQkJLy8gWzIyODM2Nl0gRm9yIGZpbGVzIHRoYXQgaGF2ZSBhIHVuaWNvZGUgQk9NLCBhbmQgYSBjaGFyc2V0IG5hbWUgb2YgVVRGLTE2LCB0aGUgY2hhcnNldCBkZWNvZGVyIG5lZWRzICJVVEYtMTZMRSIKLQkJaWYoQ0hBUlNFVF9VVEZfMTYuZXF1YWxzKGNoYXJzZXROYW1lKSAmJiBlbmNvZGluZ01lbWVudG8uZ2V0VW5pY29kZUJPTSgpID09IElDb250ZW50RGVzY3JpcHRpb24uQk9NX1VURl8xNkxFKQotCQkJY2hhcnNldE5hbWUgPSBDSEFSU0VUX1VURl8xNkxFOwotCQkKLQkJQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGNoYXJzZXROYW1lKTsKLQkJQ2hhcnNldERlY29kZXIgY2hhcnNldERlY29kZXIgPSBjaGFyc2V0Lm5ld0RlY29kZXIoKTsKLQkJaWYgKGZFbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLklHTk9SRV9DT05WRVJTSU9OX0VSUk9SKSB7Ci0JCQljaGFyc2V0RGVjb2Rlci5vbk1hbGZvcm1lZElucHV0KENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpOwotCQkJY2hhcnNldERlY29kZXIub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpOwotCQl9Ci0JCWVsc2UgewotCQkJY2hhcnNldERlY29kZXIub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwotCQkJY2hhcnNldERlY29kZXIub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVCk7Ci0JCX0KLQkJLy8gbW9yZSBlZmZpY2llbnQgdG8gYmUgYnVmZmVyZWQsIGFuZCBJIGtub3cgb2Ygbm8KLQkJLy8gcmVhc29uIG5vdCB0byByZXR1cm4KLQkJLy8gdGhhdCBkaXJlY3RseS4KLQkJcmVzdWx0ID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW1Ub1JldHVybiwgY2hhcnNldERlY29kZXIpLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc3VsdC5tYXJrKENvZGVkSU8uTUFYX0JVRl9TSVpFKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGZpZ3VyZSBvdXQgZW5jb2RpbmcgbWVtZW50byBmcm9tIGVuY29kaW5nIHN0cmF0ZWd5Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWlmIChmQ2xpZW50U3VwcGxpZWRTdHJlYW0pIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvID0gZmluZE1lbWVudG9Gcm9tU3RyZWFtQ2FzZSgpOwotCQkJfQotCQkJZWxzZSBpZiAoZklGaWxlICE9IG51bGwpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvID0gZmluZE1lbWVudG9Gcm9tRmlsZUNhc2UoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGlmIGVuY29kaW5nIHN0cmF0YWd5IGRvZXNuJ3QgcHJvdmlkZSBhbnN3ZXIsCi0JCS8vIHRoZW4gdHJ5IGZpbGUgc2V0dGluZ3MsIHByb2plY3Qgc2V0dGluZ3MsCi0JCS8vIHVzZXIgcHJlZmVyZW5jZXMsIGFuZAotCQkvLyBmaW5hbGx5IHdvcmtiZW5jaCBkZWZhdWx0LgotCQkvLwotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsIHx8IGZFbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpID09IG51bGwpIHsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBnZXRFbmNvZGluZ01lbWVudG9Gcm9tUmVzb3VyY2VBbmRQcmVmZXJlbmNlKCk7Ci0JCX0KLQotCQkvLyB1c2UgRGVmYXVsdE5hbWVSdWxlcyBmcm9tIE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMgYXMgdGhlIGZpbmFsCi0JCS8vIGRlZmF1bHQKLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJZkVuY29kaW5nTWVtZW50byA9IGhhbmRsZU5vdFByb3ZpZGVkRnJvbUNvbnRlbnRDYXNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gZkVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IHdoZW4gZW5jb2RpbmcgaXMgbm90IGRldGVjdGVkIGluIHRoZSBmaWxlLgotCSAqIAotCSAqIEhlcmUgaXMgZW5jb2RpbmcgbG9va3VwIG9yZGVyIHdlIHdpbGwgdHJ5OiAtIHRyeSByZXNvdXJjZSBjb250ZW50Ci0JICogZGVzY3JpcHRpb24gKEVjbGlwc2UgVGV4dCBmaWxlIGVuY29kaW5nKSAtIHRyeSByZXNvdXJjZSBjb250ZW50Ci0JICogcHJvcGVydGllcyAoZm9yIEpTUCBvbmx5KSAtIHRyeSBjb250ZW50IHR5cGUgZW5jb2RpbmcgcHJlZmVyZW5jZXMgKGZvcgotCSAqIEhUTUwgb25seSkgLSB0cnkgcmVzb3VyY2UgY29udGVudCBkZXNjcmlwdGlvbiAoRWNsaXBzZSBUZXh0IGZpbGUKLQkgKiBlbmNvZGluZywgaW1wbGljaXQgY2hlY2spCi0JICogCi0JICogTm90ZTogVGhpcyBtZXRob2QgYXBwZWFycyBpbiBib3RoIENvZGVkUmVhZGVyQ3JlYXRvciBhbmQKLQkgKiBDb2RlZFN0cmVhbUNyZWF0b3IgKHdpdGgganVzdCBhIG1pbm9yIGRpZmZlcmVuY2UpLiBUaGV5IHNob3VsZCBiZSBrZXB0Ci0JICogdGhlIHNhbWUuCi0JICovCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvRnJvbVJlc291cmNlQW5kUHJlZmVyZW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSBmRW5jb2RpbmdNZW1lbnRvOwotCi0JCS8vIEZvbGxvdyBFY2xpcHNlIFBsYXRmb3JtJ3MgZGlyZWN0aW9uLiBHZXQgdGhlIGNoYXJzZXQgZnJvbSBJRmlsZS4KLQkJaWYgKGZJRmlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2hhcnNldCA9IGZJRmlsZS5nZXRDaGFyc2V0KCk7Ci0JCQllbmNvZGluZ01lbWVudG8gPSBDb2RlZElPLmNyZWF0ZUVuY29kaW5nTWVtZW50byhjaGFyc2V0KTsKLQkJfQotCi0JCXJldHVybiBlbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IGFuIElucHV0U3RyZWFtIGhhcyBtYXJrL3Jlc2V0IHN1cHBvcnQsIGlzIHJlYWRsaW1pdCBpcwotCSAqIHNldCwgYW5kIHRoYXQgdGhlIHN0cmVhbSBpcyAibGltaXRhYmxlIiAodGhhdCBpcywgcmVwb3J0cyAiZW5kIG9mCi0JICogaW5wdXQiIHJhdGhlciB0aGFuIGFsbG93IGdvaW5nIHBhc3QgbWFyaykuIFRoaXMgaXMgdmVyeSBzcGVjaWFsaXplZAotCSAqIHN0cmVhbSBpbnRyb2R1Y2VkIHRvIG92ZXJjb21lCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3MjExLiBTZWUgYWxzbwotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODU2NQotCSAqLwotCXByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0TGltaXRlZFN0cmVhbShJbnB1dFN0cmVhbSBvcmlnaW5hbCkgewotCQlpZiAob3JpZ2luYWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAob3JpZ2luYWwgaW5zdGFuY2VvZiBCdWZmZXJlZExpbWl0ZWRTdHJlYW0pCi0JCQlyZXR1cm4gb3JpZ2luYWw7Ci0JCUlucHV0U3RyZWFtIHMgPSBuZXcgQnVmZmVyZWRMaW1pdGVkU3RyZWFtKG9yaWdpbmFsLCBDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRSZXNldHRhYmxlU3RyZWFtKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQlJbnB1dFN0cmVhbSByZXNldHRhYmxlU3RyZWFtID0gbnVsbDsKLQotCQlpZiAoZklGaWxlICE9IG51bGwpIHsKLQkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gbm90ZSB3ZSBhbHdheXMgZ2V0IGNvbnRlbnRzLCBldmVuIGlmIG91dCBvZiBzeW5jaAotCQkJCWlucHV0U3RyZWFtID0gZklGaWxlLmdldENvbnRlbnRzKHRydWUpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIFNIT1VMRCBhY3R1YWxseSBjaGVjayBmb3IgZXhpc3RlbmNlIG9mCi0JCQkJLy8gZklTdG9yYWdlLCBidXQKLQkJCQkvLyBmb3Igbm93IHdpbGwganVzdCBhc3N1bWUgY29yZSBleGNlcHRpb24KLQkJCQkvLyBtZWFucyBpdAotCQkJCS8vIGRvZXNuJ3QgZXhpc3Qgb24gZmlsZSBzeXN0ZW0sIHlldC4KLQkJCQkvLyBhbmQgd2UnbGwgbG9nLCBqdXN0IGluIGNhc2UgaXRzIGEgbm90ZWFibGUgZXJyb3IKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCWlucHV0U3RyZWFtID0gbmV3IE51bGxJbnB1dFN0cmVhbSgpOwotCQkJfQotCQkJcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZklucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQlpZiAoZklucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJCQlyZXNldHRhYmxlU3RyZWFtID0gZklucHV0U3RyZWFtOwotCQkJCQkvLyB0cnkgewotCQkJCQlyZXNldHRhYmxlU3RyZWFtLnJlc2V0KCk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gLy8gYXNzdW1lZCBqdXN0IGhhc24ndCBiZWVuIG1hcmtlZCB5ZXQsIHNvIGlnbm9yZQotCQkJCQkvLyB9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXNldHRhYmxlU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZklucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc2V0dGFibGVTdHJlYW0gPT0gbnVsbCkgewotCQkJcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBOdWxsSW5wdXRTdHJlYW0oKTsKLQkJfQotCi0JCS8vIG1hcmsgdGhpcyBvbmNlLCBzdHJlYW0gYXQgInplcm8iIHBvc2l0aW9uCi0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhNQVhfTUFSS19TSVpFKTsKLQkJcmV0dXJuIHJlc2V0dGFibGVTdHJlYW07Ci0JfQotCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gaGFuZGxlTm90UHJvdmlkZWRGcm9tQ29udGVudENhc2UoKSB7Ci0KLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBzcGVjRGVmYXVsdCA9IG51bGw7Ci0JCS8vIHRyeSB7Ci0JCS8vIHNwZWNEZWZhdWx0ID0gZ2V0RW5jb2RpbmdEZXRlY3RvcigpLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJLy8gfQotCQkvLyBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCS8vIC8vIElmIHRoaXMgZXhjZXB0aW9uIG9jY3VycywgYXNzdW1lcyB0aGVyZSBpcwotCQkvLyAvLyBubyBzcGVjRGVmYXVsdAotCQkvLyB9Ci0JCS8vIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vIC8vIElmIHRoaXMgZXhjZXB0aW9uIG9jY3VycywgYXNzdW1lcyB0aGVyZSBpcwotCQkvLyAvLyBubyBzcGVjRGVmYXVsdAotCQkvLyB9Ci0JCS8vIGZpbmFsbHkgewotCQkvLyB0cnkgewotCQkvLyBoYW5kbGVTdHJlYW1DbG9zZShmRW5jb2RpbmdEZXRlY3RvclN0cmVhbSk7Ci0JCS8vIH0KLQkJLy8gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCS8vIC8vIHNldmVyZSBlcnJvciwgbm90IG11Y2ggdG8gZG8gaGVyZQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gdGhpcyBsb2dpYyBzaG91bGQgYmUgbW92ZWQgdG8gJ2RldGVjdGlvbicgaWYgbm90IGFscmVhZHkKLQkJU3RyaW5nIGNoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMoc3BlY0RlZmF1bHQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGNoYXJzZXQsICJwb3N0IGNvbmRpdGlvbiBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQgPSBDb2RlZElPLmNyZWF0ZUVuY29kaW5nTWVtZW50byhjaGFyc2V0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzZXR0YWJsZUlucHV0U3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVTdHJlYW1DbG9zZShJbnB1dFN0cmVhbSByZXNldHRhYmxlSW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJaWYgKHJlc2V0dGFibGVJbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQlpZiAoZkNsaWVudFN1cHBsaWVkU3RyZWFtKSB7Ci0JCQkJcmVzZXR0YWJsZUlucHV0U3RyZWFtLnJlc2V0KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQotCQkJCXJlc2V0dGFibGVJbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gVE9ETyBXZSBqdXN0IGNvcHkgdGhlIGNvbnRlbnQgcHJvcGVydGllcyBlbmNvZGluZyB0byBjdXJyZW50IHJlc291cmNlJ3MKLQkvLyBlbmNvZGluZyBmb3Igbm93LiBNYXkgaW1wcm92ZSB0aGUgVUkgbGF0ZXIgYnkgc2V0dGluZyBhbiBpbmZvcm1hdGlvbmFsCi0JLy8gbWVzc2FnZSBhbmQvb3IgZGlzYWJsZSB0aGUgY29udGVudCBwcm9wZXJ0aWVzIGVuY29kaW5nIGZpZWxkLgotCS8vIFRPRE86IHJlbWFrZSBwcml2YXRlIGVsc2UgcmVtb3ZlCi0Jdm9pZCBtaWdyYXRlQ29udGVudFByb3BlcnRpZXNFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZmluYWwgSUZpbGUgZmlsZSA9IGZJRmlsZTsKLQkJZmluYWwgU3RyaW5nIGNoYXJzZXQgPSBlbmNvZGluZzsKLQkJLy8gVE9ETzogZXh0ZXJuYWxpemUgc3RyaW5nIGxhdGVyCi0JCUpvYiBtaWdyYXRlciA9IG5ldyBKb2IoU1NFQ29yZU1lc3NhZ2VzLk1pZ3JhdGVfQ2hhcnNldCkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJZmlsZS5zZXRDaGFyc2V0KGNoYXJzZXQsIG51bGwpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCW1pZ3JhdGVyLnNldFN5c3RlbSh0cnVlKTsKLQkJbWlncmF0ZXIuc2NoZWR1bGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7Ci0KLQkJZkVuY29kaW5nUnVsZSA9IG51bGw7Ci0JCWZJRmlsZSA9IG51bGw7Ci0JCWZGaWxlbmFtZSA9IG51bGw7Ci0JCWZJbnB1dFN0cmVhbSA9IG51bGw7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCQlmQ2xpZW50U3VwcGxpZWRTdHJlYW0gPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJpbGxlZ2FsIGFyZ3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzZXRBbGwoKTsKLQkJZklGaWxlID0gaUZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQotCQlyZXNldEFsbCgpOwotCQlmRmlsZW5hbWUgPSBmaWxlbmFtZTsKLQkJZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWZDbGllbnRTdXBwbGllZFN0cmVhbSA9IHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmdSdWxlKEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHsKLQotCQlmRW5jb2RpbmdSdWxlID0gZW5jb2RpbmdSdWxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRTdHJlYW1DcmVhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkU3RyZWFtQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzEyMjRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRTdHJlYW1DcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2RlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zLkNoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zLk1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnMuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbDsKLQotCi1wdWJsaWMgY2xhc3MgQ29kZWRTdHJlYW1DcmVhdG9yIGV4dGVuZHMgQ29kZWRJTyB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSU5JVElBTF9CVUZGRVJfU0laRSA9IDEwMjQgKiAxNjsKLQotCS8vIHRoZSAzMiBieXRlcyB1c2VkIGJ5IGRlZmF1bHQgYnkgQnl0ZU91dHB1dFN0cmVhbSBpcwotCS8vIGEgbGl0dGxlIHNtYWxsCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0dSQU1fRVJST1JfX0ZBSUxFRF9UT19GSU5EX0FOWV9DSEFSU0VUX0FOWVdIRVJFXyA9ICJQcm9ncmFtIGVycm9yOiBmYWlsZWQgdG8gZmluZCBhbnkgY2hhcnNldCBhbnl3aGVyZSEiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzE2QkVfQ0hBUlNFVF9OQU1FID0gIlVURi0xNkJFIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTZMRV9DSEFSU0VUX05BTUUgPSAiVVRGLTE2TEUiOyAvLyROT04tTkxTLTEkCi0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNl9DSEFSU0VUX05BTUUgPSAiVVRGLTE2IjsKLQkvLyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzhfQ0hBUlNFVF9OQU1FID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBib29sZWFuIGZDbGllbnRTdXBwbGllZFJlYWRlcjsKLQotCS8vIGZ1dHVyZV9UT0RPOiB0aGlzICdjaGVja0NvbnZlcnNpb24nIGNhbiBiZSBhIGxpdHRsZQotCS8vIHByaWNleSBmb3IgbGFyZ2UKLQkvLyBmaWxlcywgY2hvdWxkIGJlIGEgdXNlciBwcmVmZXJlbmNlLCBvciBzb21ldGhpbmcuCi0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBjaGVja0NvbnZlcnNpb24gPSB0cnVlOwotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvOwotCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50bzsKLQotCXByaXZhdGUgU3RyaW5nIGZGaWxlbmFtZTsKLQotCXByaXZhdGUgYm9vbGVhbiBmSGFzQmVlbkFuYWx5emVkOwotCi0JcHJpdmF0ZSBJRmlsZSBmSUZpbGU7Ci0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmUHJldmlvdXNFbmNvZGluZ01lbWVudG87Ci0KLQlwcml2YXRlIFJlYWRlciBmUmVhZGVyOwotCi0JcHJpdmF0ZSBSZWFkZXIgZlJlc2V0dGFibGVSZWFkZXI7Ci0JcHJpdmF0ZSBieXRlW10gVVRGMTZCRUJPTSA9IG5ldyBieXRlW117KGJ5dGUpIDB4RkUsIChieXRlKSAweEZGfTsKLQotCXByaXZhdGUgYnl0ZVtdIFVURjE2TEVCT00gPSBuZXcgYnl0ZVtdeyhieXRlKSAweEZGLCAoYnl0ZSkgMHhGRX07Ci0JcHJpdmF0ZSBieXRlW10gVVRGM0JZVEVCT00gPSBuZXcgYnl0ZVtdeyhieXRlKSAweEVGLCAoYnl0ZSkgMHhCQiwgKGJ5dGUpIDB4QkZ9OwotCi0JcHVibGljIENvZGVkU3RyZWFtQ3JlYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ29kZWRTdHJlYW1DcmVhdG9yKFN0cmluZyBmaWxlbmFtZSwgY2hhcltdIGNoYXJhY3RlckFycmF5KSB7Ci0JCXN1cGVyKCk7Ci0JCWZGaWxlbmFtZSA9IGZpbGVuYW1lOwotCQlmUmVhZGVyID0gbmV3IENoYXJBcnJheVJlYWRlcihjaGFyYWN0ZXJBcnJheSk7Ci0JfQotCi0JcHVibGljIENvZGVkU3RyZWFtQ3JlYXRvcihTdHJpbmcgZmlsZW5hbWUsIFJlYWRlciByZWFkZXIpIHsKLQkJc3VwZXIoKTsKLQkJZkZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JCWZSZWFkZXIgPSByZWFkZXI7Ci0JfQotCi0JcHVibGljIENvZGVkU3RyZWFtQ3JlYXRvcihTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0ZXh0U3RyaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCWZGaWxlbmFtZSA9IGZpbGVuYW1lOwotCQlmUmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcih0ZXh0U3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcHJpbWFyeSBtZXRob2Qgd2hpY2ggY29udGFpbnMgdGhlIGhpZ2hlc3QgbGV2ZWwgcnVsZXMgZm9yIGhvdyB0bwotCSAqIGRlY2lkZSBhcHByb3ByaWF0ZSBkZWNvZGluZyBydWxlczogMS4gZmlyc3QgY2hlY2sgZm9yIHVuaWNvZGUgc3RyZWFtIDIuCi0JICogdGhlbiBsb29rZWQgZm9yIGVuY29kaW5nIHNwZWNpZmllZCBpbiBjb250ZW50IChhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YKLQkgKiBjb250ZW50IHRoYXQgaXMgaXQgLi4uIHhtbCwgaHRtbCwganNwLCBldGMuIDMuIHRoZW4gY2hlY2sgZm9yIHZhcmlvdXMKLQkgKiBzZXR0aW5nczogZmlsZSBzZXR0aW5ncyBmaXJzdCwgaWYgbnVsbCBjaGVjayBwcm9qZWN0IHNldHRpbmdzLCBpZiBudWxsLAotCSAqIGNoZWNrIHVzZXIgcHJlZmVyZW5jZXMuIDQuIGxhc3RseSAob3IsIHdoYXQgaXMgdGhlIGxhc3QgdXNlcgotCSAqIHByZWZlcmVuY2UpIGlzIHRvIHVzZSAid29ya2JlbmNoIGRlZmF1bHRzIi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYW5hbHl6ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCVJlYWRlciByZXNldHRhYmxlUmVhZGVyID0gZ2V0UmVzZXR0YWJsZVJlYWRlcigpOwotCQl0cnkgewotCQkJaWYgKGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCQlyZXNldHRhYmxlUmVhZGVyLnJlc2V0KCk7Ci0JCQkJZkN1cnJlbnRFbmNvZGluZ01lbWVudG8gPSBjaGVja0ZvckVuY29kaW5nSW5Db250ZW50cygpOwotCQkJfQotCQkJLy8gaWYgZW5jb2Rpbmcgc3RyYXRhZ3kgZG9lc24ndCBwcm92aWRlIGFuc3dlciwKLQkJCS8vIHRoZW4gdHJ5IGZpbGUgc2V0dGluZ3MsIHByb2plY3Qgc2V0dGluZ3MsCi0JCQkvLyB1c2VyIHByZWZlcmVuY2VzLCBhbmQKLQkJCS8vIGZpbmFsbHkgd29ya2JlbmNoIGRlZmF1bHQuCi0JCQkvLwotCQkJaWYgKGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvID09IG51bGwgfHwgZkN1cnJlbnRFbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQlyZXNldHRhYmxlUmVhZGVyLnJlc2V0KCk7Ci0JCQkJZkN1cnJlbnRFbmNvZGluZ01lbWVudG8gPSBnZXRFbmNvZGluZ01lbWVudG9Gcm9tUmVzb3VyY2VBbmRQcmVmZXJlbmNlKCk7Ci0JCQl9Ci0KLQkJCS8vIHVzZSBEZWZhdWx0TmFtZVJ1bGVzIGZyb20gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcyBhcyB0aGUKLQkJCS8vIGZpbmFsIGRlZmF1bHQKLQkJCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCQloYW5kbGVOb3RQcm92aWRlZEZyb21Db250ZW50Q2FzZSgpOwotCQkJfQotCi0JCQlmSGFzQmVlbkFuYWx5emVkID0gdHJ1ZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZXNldHRhYmxlUmVhZGVyICE9IG51bGwpIHsKLQkJCQlyZXNldHRhYmxlUmVhZGVyLnJlc2V0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOZWVkIHRvIGNoZWNrIGNvbnZlcnNpb24gZWFybHkgb24uIFRoZXJlJ3Mgc29tZSBkYW5nZXIgdGhhbiBvbGQKLQkgKiBjb250ZW50cyBvZiBhIGZpbGUgYXJlIHNldCB0byBlbXB0eSwgaWYgYW4gZXhjZXB0aW9uIG9jY3Vycy4KLQkgKiAKLQkgKiBAcGFyYW0gYWxsVGV4dAotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqIEBwYXJhbSBlbmNvZGluZ1J1bGUKLQkgKiBAdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbAotCSAqIEBkZXByZWNhdGVkIC0gd2UgbmVlZCB0byBmaW5kICJjaGVhcGVyIiB3YXkgdG8gdG8gdGhpcyBmdW5jdGlvbmFsaXR5IHNvCi0JICogICAgICAgICAgICAgbGlrZWx5IHRvIGdvIGF3YXkgaW4gZnV0dXJlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ29udmVyc2lvbihFbmNvZGluZ01lbWVudG8gbWVtZW50bywgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGphdmFFbmNvZGluZyA9IG1lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0JCVN0cmluZyBkZXRlY3RlZEVuY29kaW5nID0gbWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCUNoYXJzZXQgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShqYXZhRW5jb2RpbmcpOwotCQlDaGFyc2V0RW5jb2RlciBjaGFyc2V0RW5jb2RlciA9IGNoYXJzZXQubmV3RW5jb2RlcigpOwotCQljaGFyc2V0RW5jb2Rlci5vbk1hbGZvcm1lZElucHV0KENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVCk7Ci0JCWNoYXJzZXRFbmNvZGVyLm9uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwotCQlSZWFkZXIgcmVhZGVyID0gZ2V0UmVzZXR0YWJsZVJlYWRlcigpOwotCQlyZWFkZXIucmVzZXQoKTsKLQkJaW50IGN1cnJlbnRDaGFyID0gcmVhZGVyLnJlYWQoKTsKLQkJaW50IGN1cnJlbnRQb3MgPSAxOwotCQl0cnkgewotCQkJd2hpbGUgKGN1cnJlbnRDaGFyICE9IC0xKSB7Ci0JCQkJLy8gbm90ZTogdGhpcyBjYW4gcHJvYmFibHkgYmUgbWFkZSBtb3JlCi0JCQkJLy8gZWZmaWNpZW50IGxhdGVyIHRvCi0JCQkJLy8gY2hlY2sgYnVmZmVyIGJ5IGJ1ZmZlciwgaW5zdGVhZCBvZgotCQkJCS8vIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuCi0JCQkJdHJ5IHsKLQkJCQkJYm9vbGVhbiBjYW5Db252ZXJ0ID0gY2hhcnNldEVuY29kZXIuY2FuRW5jb2RlKChjaGFyKSBjdXJyZW50Q2hhcik7Ci0JCQkJCWlmICghY2FuQ29udmVydCkgewotCQkJCQkJaWYgKGVuY29kaW5nUnVsZSA9PSBFbmNvZGluZ1J1bGUuSUdOT1JFX0NPTlZFUlNJT05fRVJST1IpIHsKLQkJCQkJCQkvLyBpZiB3ZSdyZSB0b2xkIHRvIGlnbm9yZSB0aGUKLQkJCQkJCQkvLyBlbmNvZGluZyBjb252ZXJzaW9uCi0JCQkJCQkJLy8gZXJyb3IsCi0JCQkJCQkJLy8gbm90aWNlIHdlIHN0aWxsIHdhbnQgdG8gZGV0ZWN0Ci0JCQkJCQkJLy8gYW5kIGxvZyBpdC4gV2Ugc2ltcGx5Ci0JCQkJCQkJLy8gZG9uJ3QgdGhyb3cgdGhlIGV4Y2VwdGlvbiwgYW5kCi0JCQkJCQkJLy8gd2UgZG8gY29udGludWUgd2l0aAotCQkJCQkJCS8vIHRoZQotCQkJCQkJCS8vIHNhdmUuCi0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJFbmNvZGluZyBDb252ZXJzaW9uIEVycm9yIGR1cmluZyBzYXZlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdGhyb3cgbmV3IE1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoamF2YUVuY29kaW5nLCBkZXRlY3RlZEVuY29kaW5nLCBjdXJyZW50UG9zKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50Q2hhciA9IHJlYWRlci5yZWFkKCk7Ci0JCQkJCWN1cnJlbnRQb3MrKzsKLQkJCQl9Ci0JCQkJLy8gSUJNJ3MgSlJFIHNlZW1zIHRvIHRocm93IE5QRSB3aGVuIERCQ1MgY2hhciBpcyBnaXZlbiB0bwotCQkJCS8vIFNCQ1MgY2hhcnNldEVuY29kZXIKLQkJCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgQ2hhckNvbnZlcnNpb25FcnJvcldpdGhEZXRhaWwoamF2YUVuY29kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCS8vIGlmIHdlIGdldCBhbGwgdGhlIHdheSB0aHJvdWdoIGxvb3Agd2l0aG91dCB0aHJvd2luZyBleGNlcHRpb24sCi0JCQkvLyB0aGVuIHRoZXJlIG11c3QKLQkJCS8vIGJlIGFuIGVycm9yIG5vdCBkZXRlY3RhYmxlIHdoZW4gZ29pbmcgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlci4KLQkJCXRocm93IG5ldyBDaGFyQ29udmVyc2lvbkVycm9yV2l0aERldGFpbChqYXZhRW5jb2RpbmcpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlyZWFkZXIucmVzZXQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGNoZWNrRm9yRW5jb2RpbmdJbkNvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0KLQkJLy8gaWYgZW5jb2RpbmcgbWVtZW50byBhbHJlYWR5IHNldCwgYW5kIG5vIG5lZWQgdG8gZ2V0IGFnYWluLgotCQlpZiAoZkVuY29kaW5nTWVtZW50byAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQl9IGVsc2UgewotCQkJaWYgKGZDbGllbnRTdXBwbGllZFJlYWRlcikgewotCQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJCQlJQ29udGVudFR5cGVNYW5hZ2VyIGNvbnRlbnRUeXBlTWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCQkJCXRyeSB7Ci0JCQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gY29udGVudFR5cGVNYW5hZ2VyLmdldERlc2NyaXB0aW9uRm9yKGZSZWFkZXIsIGZGaWxlbmFtZSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCWZFbmNvZGluZ01lbWVudG8gPSBjcmVhdGVNZW1lbnRvKGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlmRW5jb2RpbmdNZW1lbnRvID0gQ29kZWRJTy5jcmVhdGVFbmNvZGluZ01lbWVudG8oIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETzogd29yayBhcm91bmQgZm9yIDUvMTQgYnVnIGluIGJhc2UsIHNob3VsZCBiZQotCQkJCQkvLyByZW1vdmVkIHdoZW4gbW92ZSB1cCB0byA1LzIxCi0JCQkJCS8vIGp1c3QgY3JlYXRlZCBhIHNpbXBsZSBkZWZhdWx0IG9uZQotCQkJCQlmRW5jb2RpbmdNZW1lbnRvID0gQ29kZWRJTy5jcmVhdGVFbmNvZGluZ01lbWVudG8oIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCBzdGF0ZTogZW5jb2RpbmdNZW1lbnRvIHdhcyBudWxsIGJ1dCBubyBpbnB1dCBzdHJlYW0gc3VwcGxpZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCS8vCQl0cnkgewotCQkvLwkJCXJlc3VsdCA9IGdldEVuY29kaW5nRGV0ZWN0b3IoKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJLy8JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgIXJlc3VsdC5pc1ZhbGlkKCkgJiYgIWZvcmNlRGVmYXVsdCgpKSB7Ci0JCS8vCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsKHJlc3VsdCk7Ci0JCS8vCQkJfQotCQkvLwkJfQotCQkvLwkJZmluYWxseSB7Ci0JCS8vCQkJaGFuZGxlU3RyZWFtQ2xvc2UoZkVuY29kaW5nRGV0ZWN0b3JTdHJlYW0pOwotCQkvLwkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGR1bXAoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSwgYm9vbGVhbiB1c2UzQnl0ZUJPTWlmVVRGOCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJZ2V0Q3VycmVudEVuY29kaW5nTWVtZW50bygpOwotCQlTdHJpbmcgamF2YUVuY29kaW5nTmFtZSA9IG51bGw7Ci0JCWlmIChlbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpIHsKLQkJCWlmIChmQ3VycmVudEVuY29kaW5nTWVtZW50by5pc1ZhbGlkKCkpIHsKLQkJCQlqYXZhRW5jb2RpbmdOYW1lID0gZkN1cnJlbnRFbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsKGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLklHTk9SRV9DT05WRVJTSU9OX0VSUk9SKQotCQkJamF2YUVuY29kaW5nTmFtZSA9IGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCQllbHNlIGlmIChlbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQpCi0JCQlqYXZhRW5jb2RpbmdOYW1lID0gZkN1cnJlbnRFbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCk7Ci0JCS8vIHdyaXRlIGFwcHJvcHJpYXRlICJoZWFkZXIiIHVuaWNvZGUgQk9NIGJ5dGVzCi0JCS8vIE5vdGU6IEphdmEgc2VlbXMgdG8gd3JpdGUgYXBwcm9wcmlhdGUgaGVhZGVyIGZvcgotCQkvLyBVVEYtMTYsIGJ1dCBub3QKLQkJLy8gVVRGLTggbm9yIFVURi0xNkJFLiBUaGlzCi0JCS8vIG1heSB2YXJ5IGJ5IEpSRSB2ZXJzaW9uLCBzbyBuZWVkIHRvIHRlc3Qgd2VsbC4KLQkJLy8gTm90ZTogamF2YUVuY29kaW5nTmFtZSBjYW4gYmUgbnVsbCBpbiBpbnZhbGlkCi0JCS8vIGNhc2VzLCBzbyB3ZSBubyBoYXJkCi0JCS8vIHRvIHNraXAgd2hvbGUgY2hlY2sgaWYgdGhhdCdzIHRoZSBjYXNlLgotCQlpZiAoamF2YUVuY29kaW5nTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoKGphdmFFbmNvZGluZ05hbWUuZXF1YWxzKFVURl84X0NIQVJTRVRfTkFNRSkgJiYgdXNlM0J5dGVCT01pZlVURjgpIHx8IChqYXZhRW5jb2RpbmdOYW1lLmVxdWFscyhVVEZfOF9DSEFSU0VUX05BTUUpICYmIGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLmlzVVRGODNCeXRlQk9NVXNlZCgpKSkgewotCQkJCW91dHB1dFN0cmVhbS53cml0ZShVVEYzQllURUJPTSk7Ci0JCQl9IGVsc2UgaWYgKGphdmFFbmNvZGluZ05hbWUuZXF1YWxzKFVURl8xNkxFX0NIQVJTRVRfTkFNRSkpIHsKLQkJCQlvdXRwdXRTdHJlYW0ud3JpdGUoVVRGMTZMRUJPTSk7Ci0JCQl9IGVsc2UgaWYgKGphdmFFbmNvZGluZ05hbWUuZXF1YWxzKFVURl8xNkJFX0NIQVJTRVRfTkFNRSkpIHsKLQkJCQlvdXRwdXRTdHJlYW0ud3JpdGUoVVRGMTZCRUJPTSk7Ci0JCQl9Ci0JCX0KLQkJLy8gVE9ETyBhZGQgYmFjayBpbiBsaW5lIGRlbGltaXRlciBoYW5kbGluZyB0aGUKLQkJLy8gInJpZ2h0IiB3YXkgKHVwZGF0aW5nCi0JCS8vIG1hcmtlcnMsIG5vdCByZXF1aXJpbmcgc3RyaW5nLCBldGMuIC4uIG1heSBuZWVkCi0JCS8vIHRvIG1vdmUgdG8gZG9jdW1lbnQKLQkJLy8gbGV2ZWwpCi0JCS8vYWxsVGV4dEJ1ZmZlciA9Ci0JCS8vIGhhbmRsZUxpbmVEZWxpbWl0ZXIoYWxsVGV4dEJ1ZmZlciwgZG9jdW1lbnQpOwotCQlSZWFkZXIgcmVhZGVyID0gZ2V0UmVzZXR0YWJsZVJlYWRlcigpOwotCQkvLyBiZSBzdXJlIHRvIHRlc3QgbGFyZ2UgInJlYWRlcnMiIC4uLiB3ZSdsbCBuZWVkCi0JCS8vIHRvIG1ha2Ugc3VyZSB0aGV5IGFsbAotCQkvLyBjYW4gcmVzZXQgdG8gaW5pdGlhbCBwb3NpdGlvbiAoU3RyaW5nUmVhZGVyLAotCQkvLyBDaGFyQXJyYXlSZWFkZXIsIGFuZAotCQkvLyBEb2N1bWVudFJlYWRlciBzaG91bGQgYWxsIHdvcmsgb2spLgotCQlyZWFkZXIucmVzZXQoKTsKLQkJLy8gVGhlcmUgbXVzdCBiZSBjbGVhbmVyIGxvZ2ljIHNvbWVob3csIGJ1dCB0aGUKLQkJLy8gaWRlYSBpcyB0aGF0Ci0JCS8vIGphdmFFbmNvZGluZ05hbWUgY2FuIGJlIG51bGwKLQkJLy8gaWYgb3JpZ2luYWwgZGV0ZWN0ZWQgZW5jb2RpbmcgaXMgbm90IHZhbGlkIChhbmQKLQkJLy8gaWYgRk9SQ0VfREVGQVVMVCB3YXMKLQkJLy8gbm90IHNwZWNpZmllZCkuIEhlbmNlLCB3ZSBXQU5UIHRoZSBmaXJzdAotCQkvLyBDaGFyc2V0LmZvck5hbWUgdG8KLQkJLy8gdGhyb3cgYXBwcm9wcmlhdGUgZXhjZXB0aW9uLgotCQlDaGFyc2V0IGNoYXJzZXQgPSBudWxsOwotCi0JCS8vIHRoaXMgY2FsbCBjaGVja3MgIm92ZXJyaWRlIiBwcm9wZXJ0aWVzIGZpbGUKLQkJamF2YUVuY29kaW5nTmFtZSA9IENvZGVkSU8uZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChqYXZhRW5jb2RpbmdOYW1lKTsKLQotCQlpZiAoamF2YUVuY29kaW5nTmFtZSA9PSBudWxsKSB7Ci0JCQljaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQljaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGphdmFFbmNvZGluZ05hbWUpOwotCQl9Ci0JCUNoYXJzZXRFbmNvZGVyIGNoYXJzZXRFbmNvZGVyID0gY2hhcnNldC5uZXdFbmNvZGVyKCk7Ci0JCWlmICghKGVuY29kaW5nUnVsZSA9PSBFbmNvZGluZ1J1bGUuSUdOT1JFX0NPTlZFUlNJT05fRVJST1IpKSB7Ci0JCQljaGFyc2V0RW5jb2Rlci5vbk1hbGZvcm1lZElucHV0KENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVCk7Ci0JCQljaGFyc2V0RW5jb2Rlci5vblVubWFwcGFibGVDaGFyYWN0ZXIoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKTsKLQkJfSBlbHNlIHsKLQkJCWNoYXJzZXRFbmNvZGVyLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQTEFDRSk7Ci0JCQljaGFyc2V0RW5jb2Rlci5vblVubWFwcGFibGVDaGFyYWN0ZXIoQ29kaW5nRXJyb3JBY3Rpb24uUkVQTEFDRSk7Ci0KLQkJfQotCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0sIGNoYXJzZXRFbmNvZGVyKTsKLQkJLy9UT0RPOiB0aGlzIG1heSBubyBsb25nZXIgYmUgbmVlZGVkIChhbmQgaXMgYXQKLQkJLy8gbGVhc3Qgd3Jvbmcgc3BvdCBmb3IKLQkJLy8gaXQpLgotCQkvLwkJaWYgKGNoZWNrQ29udmVyc2lvbiAmJiAoIShlbmNvZGluZ1J1bGUgPT0KLQkJLy8gRW5jb2RpbmdSdWxlLklHTk9SRV9DT05WRVJTSU9OX0VSUk9SKSkpIHsKLQkJLy8JCQljaGVja0NvbnZlcnNpb24oZkN1cnJlbnRFbmNvZGluZ01lbWVudG8sCi0JCS8vIGVuY29kaW5nUnVsZSk7Ci0JCS8vCQl9Ci0JCWNoYXJbXSBjaGFyYnVmID0gbmV3IGNoYXJbQ29kZWRJTy5NQVhfQlVGX1NJWkVdOwotCQlpbnQgblJlYWQgPSAwOwotCQl0cnkgewotCQkJd2hpbGUgKG5SZWFkICE9IC0xKSB7Ci0JCQkJblJlYWQgPSByZWFkZXIucmVhZChjaGFyYnVmLCAwLCBNQVhfQlVGX1NJWkUpOwotCQkJCWlmIChuUmVhZCA+IDApIHsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci53cml0ZShjaGFyYnVmLCAwLCBuUmVhZCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChVbm1hcHBhYmxlQ2hhcmFjdGVyRXhjZXB0aW9uIGUpIHsKLQkJCWNoZWNrQ29udmVyc2lvbihmQ3VycmVudEVuY29kaW5nTWVtZW50bywgZW5jb2RpbmdSdWxlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHNpbmNlIHdlIGRvbid0IG93biB0aGUgb3JpZ2luYWwgb3V0cHV0IHN0cmVhbSwgd2UKLQkJCS8vIHdvbid0IGNsb3NlIGl0IG91cnMuCi0JCQkvLyB0aGUgY2FsbGVyIHdobyBwYXNzZWQgaXQgdG8gdXMgbXVzdCBjbG9zZSBvcmlnaW5hbCBvbmUKLQkJCS8vIHdoZW4gYXBwcm9wcmlhdGUuCi0JCQkvLyAoYnV0IHdlIGRvIGZsdXNoIHRvIGJlIHN1cmUgYWxsIHVwLXRvLWRhdGUpCi0JCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXQzQnl0ZUJPTVByZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuVVNFXzNCWVRFX0JPTV9XSVRIX1VURjgpOwotCX0KLQotCXB1YmxpYyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZ2V0Q29kZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29kZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCX0KLQotCXB1YmxpYyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZ2V0Q29kZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy9Bc3NlcnQuaXNOb3ROdWxsKGZQcmV2aW91c0VuY29kaW5nTWVtZW50bywKLQkJLy8gInByZXZpb3VzRW5jb2RpbmdNZW1lbnRvCi0JCS8vIG5lZWRzIHRvIGJlIHNldCBmaXJzdCIpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5T3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShJTklUSUFMX0JVRkZFUl9TSVpFKTsKLQkJZHVtcChieXRlQXJyYXlPdXRwdXRTdHJlYW0sIGVuY29kaW5nUnVsZSwgZ2V0M0J5dGVCT01QcmVmZXJlbmNlKCkpOwotCQlyZXR1cm4gYnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0Q3VycmVudEVuY29kaW5nTWVtZW50bygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vQXNzZXJ0LmlzTm90TnVsbChmUHJldmlvdXNFbmNvZGluZ01lbWVudG8sCi0JCS8vICJwcmV2aW91c0VuY29kaW5nTWVtZW50bwotCQkvLyBuZWVkcyB0byBiZSBzZXQgZmlyc3QiKTsKLQkJaWYgKCFmSGFzQmVlbkFuYWx5emVkKSB7Ci0JCQlhbmFseXplKCk7Ci0JCX0KLQkJLy8gcG9zdCBjb25kaXRpb24KLQkJQXNzZXJ0LmlzTm90TnVsbChmQ3VycmVudEVuY29kaW5nTWVtZW50bywgImlsbGVnYWwgcG9zdCBjb25kaXRpb24gc3RhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBiZSBzdXJlIHRvIGNhcnJ5IG92ZXIgYXBwcm9wcmlhdGUgZW5jb2RpbmcKLQkJLy8gInN0YXRlIiB0aGF0IG1heSBiZQotCQkvLyByZWxldmVudC4KLQkJaWYgKGZQcmV2aW91c0VuY29kaW5nTWVtZW50byAhPSBudWxsKSB7Ci0JCQlmQ3VycmVudEVuY29kaW5nTWVtZW50by5zZXRVVEY4M0J5dGVCT01Vc2VkKGZQcmV2aW91c0VuY29kaW5nTWVtZW50by5pc1VURjgzQnl0ZUJPTVVzZWQoKSk7Ci0JCX0KLQkJcmV0dXJuIGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9ubHkgd2hlbiBlbmNvZGluZyBpcyBub3QgZGV0ZWN0ZWQgaW4gdGhlIGZpbGUuCi0JICogCi0JICogSGVyZSBpcyBlbmNvZGluZyBsb29rdXAgb3JkZXIgd2Ugd2lsbCB0cnk6IC0gdHJ5IHJlc291cmNlIGNvbnRlbnQKLQkgKiBkZXNjcmlwdGlvbiAoRWNsaXBzZSBUZXh0IGZpbGUgZW5jb2RpbmcpIC0gdHJ5IHJlc291cmNlIGNvbnRlbnQKLQkgKiBwcm9wZXJ0aWVzIChmb3IgSlNQIG9ubHkpIC0gdHJ5IGNvbnRlbnQgdHlwZSBlbmNvZGluZyBwcmVmZXJlbmNlcyAoZm9yCi0JICogSFRNTCBvbmx5KSAtIHRyeSByZXNvdXJjZSBjb250ZW50IGRlc2NyaXB0aW9uIChFY2xpcHNlIFRleHQgZmlsZQotCSAqIGVuY29kaW5nLCBpbXBsaWNpdCBjaGVjaykKLQkgKiAKLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBhcHBlYXJzIGluIGJvdGggQ29kZWRSZWFkZXJDcmVhdG9yIGFuZAotCSAqIENvZGVkU3RyZWFtQ3JlYXRvciAod2l0aCBqdXN0IGEgbWlub3IgZGlmZmVyZW5jZSkuIFRoZXkgc2hvdWxkIGJlIGtlcHQKLQkgKiB0aGUgc2FtZS4KLQkgKi8KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG9Gcm9tUmVzb3VyY2VBbmRQcmVmZXJlbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9IGZFbmNvZGluZ01lbWVudG87Ci0KLQkJLy8gRm9sbG93IEVjbGlwc2UgUGxhdGZvcm0ncyBkaXJlY3Rpb24uIEdldCB0aGUgY2hhcnNldCBmcm9tIElGaWxlLgotCQlpZiAoZklGaWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBjaGFyc2V0ID0gZklGaWxlLmdldENoYXJzZXQoKTsKLQkJCWVuY29kaW5nTWVtZW50byA9IENvZGVkSU8uY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGNoYXJzZXQpOwotCQl9Ci0KLQkJcmV0dXJuIGVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQlwcml2YXRlIFJlYWRlciBnZXRSZXNldHRhYmxlUmVhZGVyKCkgewotCQlpZiAoZlJlc2V0dGFibGVSZWFkZXIgPT0gbnVsbCkgewotCQkJaWYgKGZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQkJZlJlc2V0dGFibGVSZWFkZXIgPSBmUmVhZGVyOwotCQkJfSBlbHNlIHsKLQkJCQlmUmVzZXR0YWJsZVJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmUmVhZGVyKTsKLQkJCQl0cnkgewotCQkJCQlmUmVzZXR0YWJsZVJlYWRlci5tYXJrKE1BWF9NQVJLX1NJWkUpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2UganVzdCBjaGVja2VkIGlmCi0JCQkJCS8vIG1hcmthYmxlCi0JCQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZlJlc2V0dGFibGVSZWFkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90UHJvdmlkZWRGcm9tQ29udGVudENhc2UoKSB7Ci0JCS8vIG1vdmUgdG8gImRldGVjdG9ycyIgaWYgbm90IGFscmVhZHkKLQkJU3RyaW5nIHNwZWNEZWZhdWx0ID0gbnVsbDsKLQkJLy9zcGVjRGVmYXVsdCA9IGdldEVuY29kaW5nRGV0ZWN0b3IoKS5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCVN0cmluZyBjaGFyc2V0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKHNwZWNEZWZhdWx0KTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjaGFyc2V0LCBQUk9HUkFNX0VSUk9SX19GQUlMRURfVE9fRklORF9BTllfQ0hBUlNFVF9BTllXSEVSRV8pOwotCQlmQ3VycmVudEVuY29kaW5nTWVtZW50byA9IENvZGVkSU8uY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGNoYXJzZXQpOwotCX0KLQotCS8vIFRPRE8gV2UganVzdCBjb3B5IHRoZSBjb250ZW50IHByb3BlcnRpZXMgZW5jb2RpbmcgdG8gY3VycmVudCByZXNvdXJjZSdzCi0JLy8gZW5jb2RpbmcgZm9yIG5vdy4gTWF5IGltcHJvdmUgdGhlIFVJIGxhdGVyIGJ5IHNldHRpbmcgYW4gaW5mb3JtYXRpb25hbAotCS8vIG1lc3NhZ2UgYW5kL29yIGRpc2FibGUgdGhlIGNvbnRlbnQgcHJvcGVydGllcyBlbmNvZGluZyBmaWVsZC4KLQkvLyBUT0RPIG1ha2UgcHJpdmlhdGUgaWYgbmVlZGVkLCBlbHNlIHJlbW92ZQotCXZvaWQgbWlncmF0ZUNvbnRlbnRQcm9wZXJ0aWVzRW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmSUZpbGUgIT0gbnVsbCkKLQkJCWZJRmlsZS5zZXRDaGFyc2V0KGVuY29kaW5nLCBudWxsKTsKLQkJZmluYWwgSUZpbGUgZmlsZSA9IGZJRmlsZTsKLQkJZmluYWwgU3RyaW5nIGNoYXJzZXQgPSBlbmNvZGluZzsKLQkJLy8gVE9ETzogZXh0ZXJuYWxpemUgc3RyaW5nIGxhdGVyCi0JCUpvYiBtaWdyYXRlciA9IG5ldyBKb2IoU1NFQ29yZU1lc3NhZ2VzLk1pZ3JhdGVfQ2hhcnNldCkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJZmlsZS5zZXRDaGFyc2V0KGNoYXJzZXQsIG51bGwpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCW1pZ3JhdGVyLnNldFN5c3RlbSh0cnVlKTsKLQkJbWlncmF0ZXIuc2NoZWR1bGUoKTsKLQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7Ci0JCWZGaWxlbmFtZSA9IG51bGw7Ci0JCWZSZWFkZXIgPSBudWxsOwotCQlmUHJldmlvdXNFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCQlmQ3VycmVudEVuY29kaW5nTWVtZW50byA9IG51bGw7Ci0JCWZIYXNCZWVuQW5hbHl6ZWQgPSBmYWxzZTsKLQkJZkNsaWVudFN1cHBsaWVkUmVhZGVyID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KElGaWxlIGZpbGUsIFJlYWRlciByZWFkZXIpIHsKLQkJZklGaWxlID0gZmlsZTsKLQkJc2V0KGZpbGUuZ2V0TmFtZSgpLCByZWFkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgZmlsZW5hbWUsIGNoYXJbXSBjaGFyYWN0ZXJBcnJheSkgewotCQlyZXNldEFsbCgpOwotCQlmRmlsZW5hbWUgPSBmaWxlbmFtZTsKLQkJZlJlYWRlciA9IG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhcmFjdGVyQXJyYXkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgZmlsZW5hbWUsIFJlYWRlciByZWFkZXIpIHsKLQkJcmVzZXRBbGwoKTsKLQkJZkZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JCWZSZWFkZXIgPSByZWFkZXI7Ci0JCWZDbGllbnRTdXBwbGllZFJlYWRlciA9IHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHRleHRTdHJpbmcpIHsKLQkJc2V0KGZpbGVuYW1lLCBuZXcgU3RyaW5nUmVhZGVyKHRleHRTdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmV2aW91c0VuY29kaW5nTWVtZW50byhFbmNvZGluZ01lbWVudG8gcHJldmlvdXNFbmNvZGluZ01lbWVudG8pIHsKLQkJZlByZXZpb3VzRW5jb2RpbmdNZW1lbnRvID0gcHJldmlvdXNFbmNvZGluZ01lbWVudG87Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db21tb25DaGFyc2V0TmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29tbW9uQ2hhcnNldE5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOGM3YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db21tb25DaGFyc2V0TmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQ29tbW9uQ2hhcnNldHMgaXMgYSB1dGlsaXR5IGNsYXNzIHRvIHByb3ZpZGUgYSBjZW50cmFsIHBsYWNlIHRvIG1hcCBzb21lCi0gKiBJQU5BIGNoYXJzZXQgbmFtZSB0byBhIEphdmEgY2hhcnNldCBuYW1lLiBJbiAxLjQgSlJFJ3MgdGhpcyBtb3N0bHkgaXMgYQotICogdGhpbiB3cmFwcGVyIG9mIGV4aXN0aW5nIENoYXJzZXQgZnVuY3Rpb25hbGl0eS4gSXQgZG9lcywgaG93ZXZlciwgYWxsb3cKLSAqIHNvbWUgIm92ZXJyaWRpbmciIG9mIHRoZSBidWlsdCBpbiBKUkUgbWFwcGluZ3MgaW4gdGhlIGV2ZW50IHRoZXkgYXJlCi0gKiBuZWNlc3NhcnkuIFNlZSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBhbHNvIHByb3ZpZGVzIHNvbWUgY29udmVuaWVudCBodW1hbiByZWFkYWJsZSBkZXNjcmlwdGlvbiBmb3IgdGhlCi0gKiBjaGFyc2V0IG5hbWVzIHdoaWNoIGNhbiBiZSB1c2VkIGluIHVzZXIgaW50ZXJmYWNlcy4gVGhlIGRlc2NyaXB0aW9uIGlzIE5MCi0gKiBhd2FyZSBiYXNlZCBvbiBsb2NhbGUuIFRoZSBkYXRhIGlzIHBvcHVsYXRlZCB2aWEgdGhlIGNoYXJzZXQucHJvcGVydGllcwotICogZmlsZSBvbmx5IG9uY2UsIGJhc2VkIG9uIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiB0aGUgaGFzaHRhYmxlcy4KLSAqIDxwPgotICogVGhlIElBTkEgdGFncyBhcmUgYmFzZWQgb24gcmVmZXJlbmNlIGluZm9ybWF0aW9uIGZvdW5kIGF0IHRoZQotICogaHR0cDovL3d3dy5pYW5hLm9yZyBzaXRlLiBTcGVjaWZpY2FsbHkgc2VlCi0gKiBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21tb25DaGFyc2V0TmFtZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBkZWZhdWx0SUFOQW1hcHBpbmdzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBlbmNvZGluZ3MgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHN1cHBvcnRlZEVuY29kaW5nRGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgbGlzdCBvZiBjb21tb25seSBhdmFpbGFibGUgZW5jb2RpbmcgbmFtZXMuIFN1aXRhYmxlIGZvcgotCSAqIHBvcHVsYXRpbmcgYSBVSSBkaWFsb2cgb3IgZHJvcCBkb3duLiBUaGlzIGxpc3Qgd291bGQgYmUgYSBzdWJzZXQgb2YgYWxsCi0JICogcG9zc2libGUgY2hhcnNldHMgdGhlIFZNIHN1cHBvcnRzICh3aGljaCBjYW4gZ2V0IGludG8gdGhlIGh1bmRyZWRzKS4KLQkgKiBGb3IgdGhlIFZNIHN1cHBvcnRlZCBjaGFyc2V0cywgdXNlCi0JICogPGNvZGU+Q2hhcnNldC5hdmFpbGFibGVDaGFyc2V0cygpPC9jb2RlPgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldENvbW1vbkNoYXJzZXROYW1lcygpIHsKLQkJU3RyaW5nW10gZW5jID0gbmV3IFN0cmluZ1tnZXRFbmNvZGluZ3MoKS5zaXplKCldOwotCQlnZXRFbmNvZGluZ3MoKS50b0FycmF5KGVuYyk7Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZWZhdWx0SUFOQW1hcHBpbmdzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgZ2V0RGVmYXVsdElBTkFNYXBwaW5ncygpIHsKLQkJaWYgKGRlZmF1bHRJQU5BbWFwcGluZ3MgPT0gbnVsbCkgewotCQkJZGVmYXVsdElBTkFtYXBwaW5ncyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlCdW5kbGUga2V5QnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKElDb2RlZFJlc291cmNlUGx1Z2luLklEKTsKLQkJCUlQYXRoIGtleVBhdGggPSBuZXcgUGF0aCgiY29uZmlnL2RlZmF1bHRJQU5BLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJVVJMIGxvY2F0aW9uID0gUGxhdGZvcm0uZmluZChrZXlCdW5kbGUsIGtleVBhdGgpOwotCQkJSW5wdXRTdHJlYW0gcHJvcGVydGllc0lucHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcHJvcGVydGllc0lucHV0U3RyZWFtID0gbG9jYXRpb24ub3BlblN0cmVhbSgpOwotCQkJCWRlZmF1bHRJQU5BbWFwcGluZ3MubG9hZChwcm9wZXJ0aWVzSW5wdXRTdHJlYW0pOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiBjYW4ndCByZWFkLCBqdXN0IGFzc3VtZSB0aGVyZSdzIG5vCi0JCQkJLy8gZGVmYXVsdCBJQU5BIG1hcHBpbmdzCi0JCQkJLy8gYW5kIHJlcGVhdGVkIGF0dGVtcHRzIHdpbGwgbm90IG9jY3VyLAotCQkJCS8vIHNpbmNlIHRoZXkKLQkJCQkvLyB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5Ci0JCQkJLy8gUHJvcGVydGllcyBvYmplY3QKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdElBTkFtYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGRpc3BsYXkgKHRyYW5zbGF0ZWQpIHN0cmluZyBmb3IgZW5jb2RpbmcgbmFtZS4gSWYgdGhlcmUgaXMgbm8KLQkgKiAiY3VzdG9tIiB0cmFuc2xhdGVkIHZlcnNpb24gYXZhaWxhYmxlLCBpdCBkZWZlcnMgdG8gdGhlciBWTSdzIENoYXJzZXQKLQkgKiBzdXBwb3J0LiBJdCB3aWxsIHJldHVybiBudWxsIGlmIG5vIGRpc3BsYXkgbmFtZSBpcyBhdmFpbGFibGUuCi0JICogCi0JICogQHBhcmFtIFN0cmluZwotCSAqICAgICAgICAgICAgY2hhcnNldCBuYW1lCi0JICogQHJldHVybiBIdW1hbiBmcmllbmRseSBkaXNwbGF5IG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKFN0cmluZyBjaGFyc2V0TmFtZSkgewotCQlpZiAoY2hhcnNldE5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgZ2V0U3VwcG9ydGVkRW5jb2RpbmdEaXNwbGF5TmFtZXMoKS5nZXQoY2hhcnNldE5hbWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCS8vIGlmIHdlIGRvbid0IGhhdmUgYSBzcGVjaWFsIG9uZSwganVzdCByZXR1cm4KLQkJCS8vIHdoYXQncyBwcm92aWRlZCBieSBDaGFyc2V0Ci0KLQkJCXRyeSB7Ci0JCQkJQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGNoYXJzZXROYW1lKTsKLQkJCQlyZXN1bHQgPSBjaGFyc2V0LmRpc3BsYXlOYW1lKCk7Ci0JCQl9Ci0JCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiBub3Qgc3VwcG9ydGVkLCB0aGUgZGlzcGxheSBuYW1lIGlzCi0JCQkJLy8gdGhlIGxlYXN0IG9mIGNsaWVudHMgY29uY2VybnMgOikKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgamF2YUVuY29kaW5ncy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgZ2V0RW5jb2RpbmdzKCkgewotCQlpZiAoZW5jb2RpbmdzID09IG51bGwpIHsKLQkJCWluaXRIYXNoVGFibGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGVuY29kaW5nczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJYW5hUHJlZmVycmVkQ2hhcnNldE5hbWUoU3RyaW5nIGNoYXJzZXROYW1lKSB7Ci0JCVN0cmluZyBwcmVmZXJyZWROYW1lID0gY2hhcnNldE5hbWU7Ci0KLQkJdHJ5IHsKLQkJCUNoYXJzZXQgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShjaGFyc2V0TmFtZSk7Ci0JCQlpZiAoY2hhcnNldC5uYW1lKCkgIT0gbnVsbCkgewotCQkJCXByZWZlcnJlZE5hbWUgPSBjaGFyc2V0Lm5hbWUoKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGp1c3QgcmV0dXJuIGlucHV0IGlmIGlsbGVnYWwKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGp1c3QgcmV0dXJuIGlucHV0IGlmIGlsbGVnYWwKLQkJfQotCQlyZXR1cm4gcHJlZmVycmVkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVmYXVsdCBJQU5BIG5hbWUgdGhhdCBpcyBsaXN0ZWQgaW4gQ29tbW9uQ2hhcnNldE5hbWVzLiBIZXJlCi0JICogaXMgaG93IGl0IGNoZWNrczogMS4gY2hlY2sgdG8gc2VlIGlmIGNoYXJzZXROYW1lIGlzIGluIHRoZQotCSAqIENvbW1vbkNoYXJzZXROYW1lcyBsaXN0IGFuZCBpZiBzbywganVzdCByZXR1cm4gaXQuIDIuIGNoZWNrIHRvIHNlZSBpZgotCSAqIGNoYXJzZXROYW1lIGlzIGxpc3RlZCBpbiBkZWZhdWx0SUFOQW1hcHBpbmdzIHdoaWNoIGNvbnRhaW5zIGEgbWFwcGluZwotCSAqIG9mIG1vcmUgY29tbW9uIGVuY29kaW5ncyBhbmQgdGhlIGRlZmF1bHQgSUFOQSBuYW1lIHRoZXkgc2hvdWxkIG1hcCB0by4KLQkgKiAzLiByZXR1cm4gZGVmYXVsdElhbmFOYW1lIGlmIGFsbCBlbHNlIGZhaWxzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVycmVkRGVmYXVsdElhbmFOYW1lKFN0cmluZyBjaGFyc2V0TmFtZSwgU3RyaW5nIGRlZmF1bHRJYW5hTmFtZSkgewotCQlTdHJpbmcgcHJlZmVycmVkTmFtZSA9IGRlZmF1bHRJYW5hTmFtZTsKLQkJU3RyaW5nIGd1ZXNzZWROYW1lID0gY2hhcnNldE5hbWU7Ci0JCXRyeSB7Ci0JCQlndWVzc2VkTmFtZSA9IENvZGVkSU8uZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChjaGFyc2V0TmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBqdXN0IGlnbm9yZSBpZiBpbGxlZ2FsCi0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBqdXN0IGlnbm9yZSBpZiBpbGxlZ2FsCi0JCX0KLQkJaWYgKGdldEVuY29kaW5ncygpLmNvbnRhaW5zKGd1ZXNzZWROYW1lKSkKLQkJCXByZWZlcnJlZE5hbWUgPSBndWVzc2VkTmFtZTsKLQkJZWxzZSB7Ci0JCQlwcmVmZXJyZWROYW1lID0gZ2V0RGVmYXVsdElBTkFNYXBwaW5ncygpLmdldFByb3BlcnR5KGd1ZXNzZWROYW1lLCBwcmVmZXJyZWROYW1lKTsKLQkJfQotCi0JCXJldHVybiBwcmVmZXJyZWROYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgZ2V0U3VwcG9ydGVkRW5jb2RpbmdEaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChzdXBwb3J0ZWRFbmNvZGluZ0Rpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlpbml0SGFzaFRhYmxlcygpOwotCQl9Ci0JCXJldHVybiBzdXBwb3J0ZWRFbmNvZGluZ0Rpc3BsYXlOYW1lczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRIYXNoVGFibGVzKCkgewotCQlpZiAoc3VwcG9ydGVkRW5jb2RpbmdEaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJLy8gSW5pdGlhbGl6ZSBoYXNoIHRhYmxlIGZvciBlbmNvZGluZyB0YWJsZQotCQkJc3VwcG9ydGVkRW5jb2RpbmdEaXNwbGF5TmFtZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQllbmNvZGluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSBidW5kbGVTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlVUkwgYnVuZGxlVVJMID0gUGxhdGZvcm0uZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQpLCBQYXRoLmZyb21PU1N0cmluZygiJG5sJC9jb25maWcvY2hhcnNldC5wcm9wZXJ0aWVzIikpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGJ1bmRsZVVSTCAhPSBudWxsKSB7Ci0JCQkJCWJ1bmRsZVN0cmVhbSA9IGJ1bmRsZVVSTC5vcGVuU3RyZWFtKCk7Ci0JCQkJCWJ1bmRsZSA9IG5ldyBQcm9wZXJ0eVJlc291cmNlQnVuZGxlKGJ1bmRsZVN0cmVhbSk7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHRvdGFsTnVtU3RyaW5nID0gYnVuZGxlLmdldFN0cmluZygidG90YWxudW1iZXIiKTsvLyROT04tTkxTLTEkCi0JCQkJaW50IHRvdGFsTnVtID0gMDsKLQkJCQlpZiAodG90YWxOdW1TdHJpbmcubGVuZ3RoKCkgIT0gMCkgewotCQkJCQl0cnkgewotCQkJCQkJdG90YWxOdW0gPSBJbnRlZ2VyLnZhbHVlT2YodG90YWxOdW1TdHJpbmcpLmludFZhbHVlKCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0b3RhbE51bSA9IDA7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsTnVtOyBpKyspIHsKLQkJCQkJU3RyaW5nIGlhbmEgPSBidW5kbGUuZ2V0U3RyaW5nKCJjb2Rlc2V0LiIgKyBpICsgIi5pYW5hIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gYnVuZGxlLmdldFN0cmluZygiY29kZXNldC4iICsgaSArICIubGFiZWwiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JCQkJCWVuY29kaW5ncy5hZGQoaWFuYSk7Ci0JCQkJCXN1cHBvcnRlZEVuY29kaW5nRGlzcGxheU5hbWVzLnB1dChpYW5hLCBkaXNwbGF5TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJpbnZhbGlkIGluc3RhbGwgb3IgY29uZmlndXJhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoYnVuZGxlU3RyZWFtICE9IG51bGwpCi0JCQkJCQlidW5kbGVTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCS8vIHVuaXQgdGVzdCBvbmx5Ci0JCVN0cmluZyB0ZXN0ID0gIkNwMTI1MiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRJYW5hUHJlZmVycmVkQ2hhcnNldE5hbWUodGVzdCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0ICsgIiAtLT4gIiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQotCQl0ZXN0ID0gIk1TOTMyIjsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0SWFuYVByZWZlcnJlZENoYXJzZXROYW1lKHRlc3QpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odGVzdCArICIgLS0+ICIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgQ29tbW9uQ2hhcnNldE5hbWVzKCkgewotCQlzdXBlcigpOwotCQlpbml0SGFzaFRhYmxlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg3ZTAzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi0vKioKLSAqIENvbW1vbiBwcmVmZXJlbmNlIGtleXMgdXNlZCB0byBzcGVjaWZ5IGVuY29kaW5nIGFuZCBlbmQgb2YgbGluZS4KLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzIHsKLQkKLQlwcml2YXRlIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCS8qKgotCSAqIENvbnN0YW50IHRvIGJlIHVzZWQgd2hlbiByZWZlcnJpbmcgdG8gQ1IvTUFDIGxpbmUgZGVsaW1pdGVyCi0JICogQGRlcHJlY2F0ZWQgLSBubyBsb25nZXIgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gIkVPTF9NYWMiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQ29uc3RhbnQgdG8gYmUgdXNlZCB3aGVuIHJlZmVycmluZyB0byBDUkxGL1dJTkRPV1MgbGluZSBkZWxpbWl0ZXIKLQkgKiBAZGVwcmVjYXRlZCAtIG5vIGxvbmdlciB1c2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JMRiA9ICJFT0xfV2luZG93cyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgZW5kLW9mLWxpbmUgY2hhcmFjdGVyKHMpIHRvIHVzZS4KLQkgKiBAZGVwcmVjYXRlZCAtIG5vIGxvbmdlciB1c2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX09GX0xJTkVfQ09ERSA9ICJlbmRPZkxpbmVDb2RlIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIGNoYXJhY3RlciBjb2RlIHRvIHVzZSB3aGVuIHJlYWRpbmcgYSBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX0NPREVTRVQgPSAiaW5wdXRDb2Rlc2V0IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdGFudCB0byBiZSB1c2VkIHdoZW4gcmVmZXJyaW5nIHRvIExGL1VOSVggbGluZSBkZWxpbWl0ZXIKLQkgKiBAZGVwcmVjYXRlZCAtIG5vIGxvbmdlciB1c2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEYgPSAiRU9MX1VuaXgiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQ29uc3RhbnQgdG8gYmUgdXNlZCB3aGVuIHJlZmVycmluZyB0byBObyB0cmFuc2xhdGlvbiBvZiBsaW5lIGRlbGltaXRlcnMKLQkgKiBAZGVwcmVjYXRlZCAtIG5vIGxvbmdlciB1c2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fVFJBTlNMQVRJT04gPSAiIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBjaGFyYWN0ZXIgY29kZSB0byB1c2Ugd2hlbiB3cml0aW5nIGEgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfQ09ERVNFVCA9ICJvdXRwdXRDb2Rlc2V0IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgQ1IvTUFDIGxpbmUgZGVsaW1pdGVyCi0JICogQGRlcHJlY2F0ZWQgLSBubyBsb25nZXIgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19DUiA9ICJcciI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIENSTEYvV0lORE9XUyBsaW5lIGRlbGltaXRlcgotCSAqIEBkZXByZWNhdGVkIC0gbm8gbG9uZ2VyIHVzZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfQ1JMRiA9ICJcclxuIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgTEYvVU5JWCBsaW5lIGRlbGltaXRlcgotCSAqIEBkZXByZWNhdGVkIC0gbm8gbG9uZ2VyIHVzZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfTEYgPSAiXG4iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFN0cmluZyBVc2UgMyBieXRlIEJPTSAoQnl0ZSBPcmRlciBNYXJrKSB3aGVuIHNhdmluZyBVVEYtOCBlbmNvZGVkIGZpbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFXzNCWVRFX0JPTV9XSVRIX1VURjggPSAiVXNlM0J5dGVCT01XaXRoVVRGOCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyOGRiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLQotcHVibGljIGNsYXNzIENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5IHsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9MT0NBVElPTiA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfWE1MX0lEID0gIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNTRV9YTUxfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSBwbHVnaW5JZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGJ1bmRsZUV4aXN0cyhTdHJpbmcgcGx1Z2luSWQpIHsKLQotCQkvLyB0aGlzIGp1c3QgdmVyaWZpZXMgdGhlcmUncyByZWFsbHkgYSBwbHVnaW4gd2l0aCB0aGlzIElEIGluICJzdGFjayIKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCXJldHVybiAoIShidW5kbGUgPT0gbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q29udHJpYnV0b3JQbHVnaW5JZChJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJLy8gVE9ETzogbmVlZCB0byBoYXZlIHJlZ2lzdHJhdGlvbiBpbmZvIGhlcmUsIGJ1dCBmb3Igbm93LCB3ZSdsbCB1c2UKLQkJLy8gc2ltcGxlIGhldXJpc3RpYyB0byBjb3ZlciB0aGUgY2FzZXMgd2Uga25vdyBhYm91dC4KLQkJU3RyaW5nIGZ1bGxJZCA9IG51bGw7Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlmdWxsSWQgPSBERUZBVUxUX0xPQ0FUSU9OOwotCQl9IGVsc2UgewotCQkJZnVsbElkID0gY29udGVudFR5cGUuZ2V0SWQoKTsKLQkJfQotCQkvLyBvbmx5IG9uZSBrbm93biBjYXNlLCBzbyBmYXIsIG9mIGhhcmQgY29kZWQgcmUtZGlyZWN0aW9uCi0JCS8vIChub3Qgc3VyZSB0aGlzIGlzIGV2ZW4gbmVlZGVkLCBidXQganVzdCBpbiBjYXNlKS4KLQkJLy8gV2UgZG9uJ3Qgd2FudCB0byBzdG9yZS9jaGFuZ2UgcnVudGltZS54bWwgcHJlZmVyZW5jZXMKLQkJaWYgKFJVTlRJTUVfWE1MX0lELmVxdWFscyhmdWxsSWQpKSB7Ci0JCQlmdWxsSWQgPSBTU0VfWE1MX0lEOwotCQl9Ci0JCVN0cmluZyBwbHVnaW5JZCA9IGluZmVyUGx1Z2luSWQoZnVsbElkKTsKLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByZWZlcmVuY2VzIGdldERlZmF1bHRQcmVmZXJlbmNlcyhJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBlY2xpcHNlUHJlZmVyZW5jZXMgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRSb290Tm9kZSgpOwotCQkvLyBUT0RPOiBldmVudGF1bGx5IG5lZWQgZXh0ZW5zaW9uIG1lY2hhbmlzbSB0byBhdm9pZCB0aGVzZSBoYXJkIGNvZGVkCi0JCS8vIG1lY2hhbmlzbS4KLQkJLy8gVGhlIGlkZWEgaXMgdG8gbG9hZC9zdG9yZSBiYXNlZCBvbiBwbHVnaW4ncyBwcmVmZXJlbmNlcywgd2hlcmUgdGhlCi0JCS8vIGNvbnRlbnQgdHlwZSB3YXMgY29udHJpYnV0ZWQKLQkJLy8gRXZlbnR1YWxseSwgdG9vLCB3ZSBjb3VsZCBkbyBtb3JlICJkeW5hbWljIGxvb2t1cCIgdG8gZ2V0IHBhcmVudAotCQkvLyB0eXBlcyBmb3IgZGVmYXVsdHMsIGV0Yy4KLQotCQkvLyBHZXQgZGVmYXVsdCBwbHVnaW4gcHJlZmVyZW5jZXMKLQkJU3RyaW5nIHBsdWdpblByZWZlcmVuY2VMb2NhdGlvbiA9IERlZmF1bHRTY29wZS5TQ09QRSArIElQYXRoLlNFUEFSQVRPUiArIGdldENvbnRyaWJ1dG9yUGx1Z2luSWQoY29udGVudFR5cGUpOwotCQlQcmVmZXJlbmNlcyBwbHVnaW5QcmVmZXJlbmNlcyA9IGVjbGlwc2VQcmVmZXJlbmNlcy5ub2RlKHBsdWdpblByZWZlcmVuY2VMb2NhdGlvbik7Ci0KLQkJLy8gdGhlIGJlbG93IGNvZGUgZG9lcyBub3Qgd29yayBhdCB0aGlzIHRpbWUgYmVjYXVzZSBjb250ZW50IHR5cGUKLQkJLy8gcHJlZmVyZW5jZXMgYXJlIHN0b3JlZCBpbiB0aGUgcGxhY2UgYXMgcGx1Z2luIHByZWZlcmVuY2VzCi0KLQkJLy8JCVByZWZlcmVuY2VzIGNvbnRlbnRQcmVmZXJlbmNlcyA9IG51bGw7Ci0JCS8vCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkvLwkJCWNvbnRlbnRQcmVmZXJlbmNlcyA9IHBsdWdpblByZWZlcmVuY2VzLm5vZGUoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCS8vCQl9Ci0JCS8vCQllbHNlIHsKLQkJLy8JCQljb250ZW50UHJlZmVyZW5jZXMgPSBwbHVnaW5QcmVmZXJlbmNlcy5ub2RlKERFRkFVTFRfTE9DQVRJT04gKTsKLQkJLy8JCX0KLQkJLy8KLQkJLy8JCXJldHVybiBjb250ZW50UHJlZmVyZW5jZXM7Ci0KLQkJcmV0dXJuIHBsdWdpblByZWZlcmVuY2VzOwotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0RGVmYXVsdFByZWZlcmVuY2VzKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQlyZXR1cm4gZ2V0RGVmYXVsdFByZWZlcmVuY2VzKGNvbnRlbnRUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIGVjbGlwc2VQcmVmZXJlbmNlcyA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFJvb3ROb2RlKCk7Ci0JCS8vIFRPRE86IGV2ZW50YXVsbHkgbmVlZCBleHRlbnNpb24gbWVjaGFuaXNtIHRvIGF2b2lkIHRoZXNlIGhhcmQgY29kZWQKLQkJLy8gbWVjaGFuaXNtLgotCQkvLyBUaGUgaWRlYSBpcyB0byBsb2FkL3N0b3JlIGJhc2VkIG9uIHBsdWdpbidzIHByZWZlcmVuY2VzLCB3aGVyZSB0aGUKLQkJLy8gY29udGVudCB0eXBlIHdhcyBjb250cmlidXRlZAotCQkvLyBFdmVudHVhbGx5LCB0b28sIHdlIGNvdWxkIGRvIG1vcmUgImR5bmFtaWMgbG9va3VwIiB0byBnZXQgcGFyZW50Ci0JCS8vIHR5cGVzIGZvciBkZWZhdWx0cywgZXRjLgotCi0JCS8vIEdldCBpbnN0YW5jZSBwbHVnaW4gcHJlZmVyZW5jZXMKLQkJU3RyaW5nIHBsdWdpblByZWZlcmVuY2VMb2NhdGlvbiA9IFBsdWdpbi5QTFVHSU5fUFJFRkVSRU5DRV9TQ09QRSArIElQYXRoLlNFUEFSQVRPUiArIGdldENvbnRyaWJ1dG9yUGx1Z2luSWQoY29udGVudFR5cGUpOwotCQlQcmVmZXJlbmNlcyBwbHVnaW5QcmVmZXJlbmNlcyA9IGVjbGlwc2VQcmVmZXJlbmNlcy5ub2RlKHBsdWdpblByZWZlcmVuY2VMb2NhdGlvbik7Ci0KLQkJLy8gdGhlIGJlbG93IGNvZGUgZG9lcyBub3Qgd29yayBhdCB0aGlzIHRpbWUgYmVjYXVzZSBjb250ZW50IHR5cGUKLQkJLy8gcHJlZmVyZW5jZXMgYXJlIHN0b3JlZCBpbiB0aGUgcGxhY2UgYXMgcGx1Z2luIHByZWZlcmVuY2VzCi0KLQkJLy8JCVByZWZlcmVuY2VzIGNvbnRlbnRQcmVmZXJlbmNlcyA9IG51bGw7Ci0JCS8vCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkvLwkJCWNvbnRlbnRQcmVmZXJlbmNlcyA9IHBsdWdpblByZWZlcmVuY2VzLm5vZGUoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCS8vCQl9Ci0JCS8vCQllbHNlIHsKLQkJLy8JCQljb250ZW50UHJlZmVyZW5jZXMgPSBwbHVnaW5QcmVmZXJlbmNlcy5ub2RlKERFRkFVTFRfTE9DQVRJT04gKTsKLQkJLy8JCX0KLQkJLy8KLQkJLy8JCXJldHVybiBjb250ZW50UHJlZmVyZW5jZXM7Ci0JCXJldHVybiBwbHVnaW5QcmVmZXJlbmNlczsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJZCk7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcyhjb250ZW50VHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZXNTdHJpbmcoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlLCBTdHJpbmcga2V5KSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMoY29udGVudFR5cGUpOwotCQlTdHJpbmcgdmFsdWUgPSBwcmVmZXJlbmNlcy5nZXQoa2V5LCBnZXREZWZhdWx0UHJlZmVyZW5jZXMoY29udGVudFR5cGUpLmdldChrZXksIG51bGwpKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZWZlcmVuY2VzU3RyaW5nKFN0cmluZyBjb250ZW50VHlwZUlkLCBTdHJpbmcga2V5KSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMoY29udGVudFR5cGVJZCk7Ci0JCVN0cmluZyB2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChrZXksIGdldERlZmF1bHRQcmVmZXJlbmNlcyhjb250ZW50VHlwZUlkKS5nZXQoa2V5LCBudWxsKSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZnVsbElkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBpbmZlclBsdWdpbklkKFN0cmluZyBmdWxsSWQpIHsKLQkJLy8gc2ltcGx5IHRyaW0gb2ZmIGxhc3QgInNlZ21lbnQiIGZyb20gZnVsbCBJRC4KLQkJaW50IGxhc3RTZWdtZW50UG9zID0gZnVsbElkLmxhc3RJbmRleE9mKCcuJyk7Ci0JCVN0cmluZyBwbHVnaW5JZCA9IG51bGw7Ci0JCWlmIChsYXN0U2VnbWVudFBvcyAhPSAtMSkgewotCQkJcGx1Z2luSWQgPSBmdWxsSWQuc3Vic3RyaW5nKDAsIGxhc3RTZWdtZW50UG9zKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHdlaXJkIGNhc2U/IFdlJ2xsIGF0IGxlYXN0IHB1dC9nZXQgdGhlbSBzb21ld2hlcmUKLQkJCXBsdWdpbklkID0gREVGQVVMVF9MT0NBVElPTjsKLQkJfQotCQlpZiAoIWJ1bmRsZUV4aXN0cyhwbHVnaW5JZCkpIHsKLQkJCS8vIHVzZSBkZWZhdWx0IGxvY2F0aW9uCi0JCQlwbHVnaW5JZCA9IERFRkFVTFRfTE9DQVRJT047Ci0JCX0KLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzgyNjc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIEEgY29udmVuaWVuY2UgY2xhc3MgdG8gc3RhdGljYWxseSBnZXQgcHJlZmVyZW5lbmNlcy4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzIHsKLQotCS8vIGFjdHVhbGx5IGEgbnVsbC9lbXB0eSBzdHJpbmcgYWxzbyBtZWFucyB1c2Ugd29ya2JlbmNoIGRlZmF1bHQgc28gdGhpcwotCS8vIGNvbnN0YW50IG1pZ2h0IG5vdCByZWFsbHkgYmUgbmVjZXNzYXJ5Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0JFTkNIX0RFRkFVTFQgPSAiV09SS0JFTkNIX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRKYXZhUGxhdGZvcm1EZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIG5vdGU6IGl0cyBpbXBvcnRhbnQgdG8gdXNlIHRoaXMgc3lzdGVtIHByb3BlcnR5LAotCQkvLyBpbnN0ZWFkCi0JCS8vIG9mCi0JCS8vIEJ5dGVUb0NoYXJDb252ZXJ0ZXIuZ2V0RGVmYXVsdCgpLmdldENoYXJhY3RlckVuY29kaW5nKCkKLQkJLy8gaW5vcmRlciB0byBoYW5kbGUgY2hhbmdlcyAib24gdGhlIGZseSIuIHRoZQotCQkvLyBCeXRlVG9DaGFyQ29udmVydGVyCi0JCS8vIGRlZmF1bHQgaXMgYXBwYXJlbnRseSBzZXQgb25seSB3aGVuIFZNIHN0YXJ0cy4KLQkJLy8gVGhlcmUncyBub3QgcmVhbGx5IGFueSAiY3Vzb210ZXIgc2NuZXJlcmlvcyIKLQkJLy8gdGhhdCBjaGFuZ2UgdGhlCi0JCS8vIGRlZmF1bHQgZW5jb2RpbmcgIm9uIHRoZSBmbHkiLCBidXQgaXRzIGF0IGxlYXN0Ci0JCS8vIHVzZWQgZHVyaW5nCi0JCS8vIG91ciBhdXRvbWF0ZWQgdGVzdHMuCi0JCVN0cmluZyBlbmMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkvLyByZXR1cm4gYmxhbmsgYXMgbnVsbAotCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbmMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgbmV3TGluZUNvZGUgPSBudWxsOwotCQluZXdMaW5lQ29kZSA9IENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmdldFByZWZlcmVuY2VzU3RyaW5nKGNvbnRlbnRUeXBlSWQsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUpOwotCQlpZiAobmV3TGluZUNvZGUgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IG51bGw7Ci0JCWVsc2UgaWYgKG5ld0xpbmVDb2RlLmVxdWFscyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUikpCi0JCQlyZXN1bHQgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfQ1I7Ci0JCWVsc2UgaWYgKG5ld0xpbmVDb2RlLmVxdWFscyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5MRikpCi0JCQlyZXN1bHQgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfTEY7Ci0JCWVsc2UgaWYgKG5ld0xpbmVDb2RlLmVxdWFscyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUkxGKSkKLQkJCXJlc3VsdCA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlNUUklOR19DUkxGOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY3VycmVudCBvdXRwdXQgZW5jb2RpbmcgcHJlZmVyZW5jZSBmb3IgY29udGVudFR5cGVJZGVudGlmaWVyCi0JICogKHVuaXF1ZSBJQU5BIGVuY29kaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFVzZXJQcmVmZXJyZWRDaGFyc2V0TmFtZShTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlTdHJpbmcgcHJlZkVuY29kaW5nID0gQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXkuZ2V0UHJlZmVyZW5jZXNTdHJpbmcoY29udGVudFR5cGVJZCwgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCQlTdHJpbmcgZW5jb2RpbmcgPSBwcmVmRW5jb2Rpbmc7Ci0JCS8vIGdldCB3b3JrYmVuY2ggZW5jb2RpbmcgcHJlZmVyZW5jZSBpZiBwcmVmZXJlbmNlCi0JCS8vIHJlcXVlc3RzIGl0Ci0JCWlmIChwcmVmRW5jb2RpbmcgPT0gbnVsbCB8fCBwcmVmRW5jb2RpbmcudHJpbSgpLmxlbmd0aCgpID09IDAgfHwgcHJlZkVuY29kaW5nLmVxdWFscyhDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuV09SS0JFTkNIX0RFRkFVTFQpKSB7Ci0JCQllbmNvZGluZyA9IENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRXb3JrYmVuY2hQcmVmZXJyZWRDaGFyc2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBlbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBnZXQgc3BlY2lmaWVkIHByZWZlcmVuY2UuIFN1YmNsYXNzZXMgY2FuJ3Qgb3ZlcnJpZGUsCi0JICogc2luY2Ugd2UgZXhwZWN0IHRoaXMgdG8gd29yayBpbiBhIGNvbnNpc3RlbnQgd2F5LiBOb3RlOiB0aGlzIGlzCi0JICogc3BlY2lmaWMgdG8gSFRNTCBhbmQgQ1NTIGFuZCBpcyBpbnRlbmRlZCB0byBzdXBwbHkgYSAiZGVmYXVsdCBzcGVjIgotCSAqIG90aGVyIHRoYW4gdGhlIHdvcmtiZW5jaCBwbGF0Zm9ybSdzIGRlZmF1bHQsIG9ubHkgZm9yIHRob3NlIGNhc2VzIHdoZXJlCi0JICogdGhlcmUgaXMgbm8gZW5jb2Rpbmcgc3BlY2lmaWVkIGFueXdoZXJlIGVsc2UsIGUuZy4gaW4gdGhlIGZpbGUsIG9yIGFzIGEKLQkgKiBmaWxlIG9yIGZvbGRlciBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVc2VyU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nUHJlZmVyZW5jZSgpIHsKLQkJU3RyaW5nIENvbnRlbnRUeXBlSURfSFRNTCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBnZXRVc2VyU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nUHJlZmVyZW5jZShDb250ZW50VHlwZUlEX0hUTUwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFVzZXJTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmdQcmVmZXJlbmNlKFN0cmluZyBjb250ZW50VHlwZUlEKSB7Ci0JCVN0cmluZyBlbmMgPSBudWxsOwotCi0JCS8vIGZpcnN0IHRyeSB0byBnZXQgYmFzZSdzIGRlZmF1bHQgZW5jb2RpbmcgZm9yIGNvbnRlbnQgdHlwZQotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlEKTsKLQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCWVuYyA9IGNvbnRlbnRUeXBlLmdldERlZmF1bHRDaGFyc2V0KCk7Ci0JCX0KLQkJCi0JCS8vIG5leHQgdHJ5IHRvIGdldCBzc2UncyBkZWZhdWx0IGVuY29kaW5nIGZvciBjb250ZW50IHR5cGUKLQkJaWYgKGVuYyA9PSBudWxsIHx8IGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXkuZ2V0UHJlZmVyZW5jZXNTdHJpbmcoY29udGVudFR5cGVJRCwgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCk7Ci0JCX0KLQkJCi0JCS8vIG5leHQsIGp1c3QgdHJ5IGFuZCB1c2Ugd29ya2JlbmNoIGVuY29kaW5nCi0JCWlmIChlbmMgPT0gbnVsbCB8fCBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWVuYyA9IGdldFdvcmtiZW5jaFNwZWNpZmllZERlZmF1bHRFbmNvZGluZygpOwotCQl9Ci0JCQotCQkvLyByZXR1cm4gYmxhbmsgYXMgbnVsbAotCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbmMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBXb3JrYmVuY2ggZW5jb2RpbmcgcHJlZmVyZW5jZS4gTm90ZTogaWYgd29ya2JlbmNoIGVuY29kaW5nIGlzCi0JICogbnVsbCwgcGxhdGZvcm0gZW5jb2Rpbmcgd2lsbCBiZSByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0V29ya2JlbmNoUHJlZmVycmVkQ2hhcnNldE5hbWUoKSB7Ci0JCVN0cmluZyBjaGFyc2V0ID0gUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCk7Ci0JCWNoYXJzZXQgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0SWFuYVByZWZlcnJlZENoYXJzZXROYW1lKGNoYXJzZXQpOwotCQlyZXR1cm4gY2hhcnNldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIFdvcmtiZW5jaCBlbmNvZGluZyBwcmVmZXJlbmNlLiBXaWxsIHJldHVybiBudWxsIGlmIG5vbmUKLQkgKiBzcGVjaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFdvcmtiZW5jaFNwZWNpZmllZERlZmF1bHRFbmNvZGluZygpIHsKLQkJUmVzb3VyY2VzUGx1Z2luIHJlc291cmNlUGx1Z2luID0gUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpOwotCQlTdHJpbmcgZW5jID0gcmVzb3VyY2VQbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoUmVzb3VyY2VzUGx1Z2luLlBSRUZfRU5DT0RJTkcpOwotCQkvLyByZXR1cm4gYmxhbmsgYXMgbnVsbAotCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbmMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdXNlRGVmYXVsdE5hbWVSdWxlcyhJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZW5jb2RpbmdQcm92aWRlcikgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGVuYyA9IG51bGw7Ci0JCWVuYyA9IGVuY29kaW5nUHJvdmlkZXIuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGVuYzsKLQkJfSBlbHNlIHsKLQkJCWVuYyA9IGdldFVzZXJTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmdQcmVmZXJlbmNlKCk7Ci0JCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlyZXN1bHQgPSBlbmM7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChlbmMgPT0gbnVsbCB8fCBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJZW5jID0gZ2V0V29ya2JlbmNoU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJCWlmIChlbmMgIT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gZW5jOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChlbmMgPT0gbnVsbCB8fCBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJZW5jID0gZ2V0SmF2YVBsYXRmb3JtRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJCS8vIGVuYyBzaG91bGQgbmV2ZXIgYmUgbnVsbCAoYnV0IHdlJ2xsCi0JCQkJCS8vIGNoZWNrIGFueXdheSkKLQkJCQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQkJCQlyZXN1bHQgPSBlbmM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQXNzZXJ0LmlzTm90TnVsbChlbmMsICJwb3N0IGNvbmRpdGlvbiBpbnZhbGlkIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZW5jKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRW5jb2RpbmdNZW1lbnRvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0VuY29kaW5nTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTk1YTg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRW5jb2RpbmdNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRvIHNpbXBseSBob2xkIGluZm9ybWF0aW9uIGFuZCBkYXRhIGFib3V0IHRoZSB0eXBlIG9mCi0gKiBlbmNvZGluZyBmb3VuZCBmb3IgYSByZXNvdXJjZS4gSXQgbm90IG9ubHkgaW5jbHVkZXMgbmFtZXMsIGV0Yy4sIGJ1dCBhbHNvCi0gKiBnaXZlcyBoaW50cyBhYm91dCB0aGUgYWxnb3JpdGhtLCBvciBydWxlLCB0aGF0IHRoZSBlbmNvZG5nIHdhcyBkZXRlcm1pbmVkLgotICogSGF2aW5nIGFsbCB0aGlzIGluZm8gaW4gYSBjZW50cmFsIG9iamVjdCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBEb2N1bWVudAotICogKHRlY2huaWNhbGx5LCBJU3RydWN0dXJlZERvY3VtZW50KSwgYWxsb3dzIGZvciBiZXR0ZXIgdXNlciBlcnJvciBtZXNzYWdlcywKLSAqIGFuZCBiZXR0ZXIgaGFuZGxpbmcgb2Yga25vd2luZyBob3cgdG8gZHVtcCBhIGZpbGUsIGdpdmVuIHdlIGtub3cgaG93IGl0IHdhcwotICogbG9hZGVkLgotICogCi0gKiBOb3RlOiB0aGUgZGF0YSBpbiB0aGlzIGNsYXNzIGlzIG9ubHkgdmFsaWQgaWYgaXRzIGhhcyBhY3R1YWxseSBnb25lIHRocm91Z2gKLSAqIHRoZSBsb2FkaW5nIG9yIGR1bXBpbmcgc2VxdWVuY2UuIEl0IGlzIG5vdCBhY2N1cmF0ZSwgZm9yIGV4YW1wbGUsIGlmIGEKLSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBzaW1wbHkgY3JlYXRlZCBhbmQgdGhlbiBzZXRUZXh0IGNhbGxlZC4gSW4gdGhpcyB0eXBlCi0gKiBvZiBjYXNlLCBhY2N1cmFjeSBmb3IgbG9hZGluZyBhbmQgZHVtcGluZyBpcyBub3QgcmVxdWlyZWQsIHNpbmNlIGl0cyBhbGwKLSAqIHJlLWRpc2NvdmVyZWQuIE9uZSBsaW1pdGF0aW9uIGlzIHRoYXQgc3RydWN0dXJlZERvY3VtZW50J3MgY3JlYXRlZCAiZnJvbQotICogc2NyYXRjaCIgdGhpcyB3YXksIGRvbid0IGhhdmUgYW55IGVuY29kaW5nIGluZm9ybWF0aW9uIHRvIGNvdW50IG9uLCBhbmQKLSAqIHdvdWxkIGhhdmUgdG8gYXJyYW5nZSB0aGUgcHJvY2Vzc2luZyB0byBiZSBkb25lLiAoQW5kIGl0IGlzIGRvbmUsCi0gKiBhdXRvbWF0aWNhbGx5IGlmIGdvaW5nIHRocm91Z2ggbG9hZGVyIG9yIGR1bXBlciwgYnV0IHBlcmhhcHMgbm90IGluIGZ1dHVyZQotICogbmV3IHVzZXMuIFRPRE86IHRoaXMgY2FuIGJlIGlucHJvdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4pCi0gKiAKLSAqIGlzSW5pdGlhbGl6ZWQgaXMgc2V0IHdoZW4gdGhlIGxvYWRlciBvciBkdW1wZXIgcHJvY2Vzc2VzIGhhdmUgYmVlbiB1c2VkLAotICogYnV0IGV2ZW4gdGhpcyBjYW4ndCBiZSBjb3VudGVkIG9uIDEwMCUgaWYgdGhlIGRvY3VtZW50IGhhcyBiZWVuIG1vZGlmaWVkCi0gKiBzaW5jZS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRW5jb2RpbmdNZW1lbnRvIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMT05FRCA9ICJjbG9uZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVFNfQVNTVU1FRF9GT1JfRU1QVFlfSU5QVVQgPSAiRGVmYXVsdHNBc3N1bWVkRm9yRW1wdHlJbnB1dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUU19VU0VEX0RVRV9UT19TTUFMTF9TVFJFQU0gPSAiZGVmYXVsdHNVc2VkRHVlVG9TbWFsbFN0cmVhbSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoKLQkgKiBTdHJpbmdzIHRvIGJlIHVzZWQgZm9yIHRyYWNpbmcuIFRPRE86IG5lZWQgdG8gY2xlYW4gdGhpcyB1cCwgd2Ugbm8KLQkgKiBsb25nZXIgdXNlIGFsbCBvZiB0aGVtCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyA9ICJkZXRlY3RlZFN0YW5kYXJkVW5pY29kZUJ5dGVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQgPSAiZm91bmRFbmNvZGluZ0luQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1VORF9FTkNPRElOR19JTl9TVFJFQU0gPSAiZm91bmRFbmNvZGluZ0luU3RyZWFtIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPVU5EX0VOQ09ESU5HX0lOX1NUUlVDVFVSRURfRE9DVU1FTlQgPSAiZm91bmRFbmNvZGluZ0luU3RydWN0dXJlZERvY3VtZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEdVRVNTRURfRU5DT0RJTkdfRlJPTV9TVFJFQU0gPSAiR3Vlc3NFbmNvZGluZ0Zyb21TdHJlYW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9OQU1FX0ZPVU5EX0FTX0lBTkFfTkFNRSA9ICJub01hcHBpbmdGb3VuZEJ1dEphdmFOYW1lRm91bmRUb0JlSUFOQU5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9OQU1FX0ZPVU5EX0lOX0FMSUFTX05BTUUgPSAibm9NYXBwaW5nRm91bmRCdXRKYXZhTmFtZUZvdW5kSW5BbGlhc1RhYmxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PX0lBTkFfTkFNRV9GT1VORCA9ICJub01hcHBpbmdGb3VuZEZyb21KYXZhTmFtZVRvSUFOQU5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCA9ICJVc2VkQ29udGVudFR5cGVEZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRURfSkFWQV9ERUZBVUxUID0gIlVzZWRKYXZhRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VEX01FTUVOVE9fRlJPTV9MT0FEID0gInVzZWRNZW1lbnRvRnJvbUxvYWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFRF9QUk9QRVJUWV9TRVRUSU5HUyA9ICJVU0VEX1BST1BFUlRZX1NFVFRJTkdTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRURfVVNFUl9TUEVDSUZJRURfUFJFRkVSRU5DRSA9ICJVc2VkVXNlclNwZWNpZmllZFByZWZlcmVuY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFRF9XT1JLU1BBQ0VfREVGQVVMVCA9ICJVc2VkV29ya3NwYWNlRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VSX0lTX1VTSU5HX0pBVkFfRU5DT0RJTkcgPSAiVXNlcklzVXNpbmdKYXZhRW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZkFwcHJvcHJpYXRlRGVmYXVsdDsKLQlwcml2YXRlIFN0cmluZyBmRGV0ZWN0ZWRDaGFyc2V0TmFtZTsKLQlwcml2YXRlIFN0cmluZyBmSW52YWxpZEVuY29kaW5nOwotCi0KLQlwcml2YXRlIFN0cmluZyBmSmF2YUNoYXJzZXROYW1lOwotCXByaXZhdGUgYm9vbGVhbiBmVW5pY29kZVN0cmVhbTsKLQlwcml2YXRlIGJvb2xlYW4gZlVURjgzQnl0ZUJPTVVzZWQ7Ci0JCi0JcHJpdmF0ZSBieXRlW10gZkJPTTsKLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCUVuY29kaW5nTWVtZW50byBvYmplY3QgPSBudWxsOwotCQl0cnkgewotCQkJb2JqZWN0ID0gKEVuY29kaW5nTWVtZW50bykgc3VwZXIuY2xvbmUoKTsKLQkJfQotCQljYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2UncmUgaW1wbGVtZW50aW5nIGhlcmUKLQkJfQotCi0JCXJldHVybiBvYmplY3Q7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZURlZmF1bHQuIFRoaXMgaXMgb25seSBzZXQgaWYgYW4gaW52YWxpZCBlbmNvZGluZwotCSAqIHdhcyBmb3VuZCwgYW5kIGNvbnRhaW5zIGFuIGNoYXJzZXQgYXBwcm9wcmlhdGUgdG8gdXNlIGFzIGEgZGVmYXVsdAotCSAqIHZhbHVlLCBpZiwgZm9yIGV4YW1wbGUsIHRoZSB1c2VyIGRlY2lkZXMgdG8gbG9hZCB0aGUgZG9jdW1lbnQgYW55d2F5LAotCSAqIGV2ZW4gdGhvdWdoIHRoZSBjaGFyc2V0IHdhcyBmb3VuZCB0byBiZSBpbnZhbGlkLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcHByb3ByaWF0ZURlZmF1bHQoKSB7Ci0JCWlmIChmQXBwcm9wcmlhdGVEZWZhdWx0ID09IG51bGwpIHsKLQkJCWZBcHByb3ByaWF0ZURlZmF1bHQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMobnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGZBcHByb3ByaWF0ZURlZmF1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcnNldCBuYW1lLCBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY2hhcnNldCBuYW1lCi0JICogZm91bmQgaW4gZ2V0SmF2YUNoYXJzZXROYW1lLiBUaGlzIGNhbiBoYXBwZW4sIGZvciBleGFtcGxlLCBpZiB0aGVyZSBhcmUKLQkgKiBkaWZmZXJlbmNlcyBpbiBjYXNlLiBUaGlzIG1ldGhvZCBtaWdodCByZXR1cm4gU0hJRlRfSklTLCBhbmQgdGhlIHRoZQotCSAqIGdldEphdmFDaGFyc2V0TmFtZSBtaWdodCByZXR1cm4gU2hpZnRfSklTIC0tIGlmIFNISUZUX0pJUyB3YXMgZGV0ZWN0ZWQKLQkgKiBpbiBmaWxlL2RvY3VtZW50LiBJZiB0aGUgb3JpZ2luYWwgZmlsZSBjb250YWluZWQgdGhlIGNvcnJlY3QgY2FzZSwgdGhlbgotCSAqIHRoaXMgbWV0aG9kIHdvdWxkIHJldHVybiBudWxsLiBUaGUgZ2V0SmF2YUNoYXJzZXROYW1lIGlzIHR5cGljYWxseSB0aGUKLQkgKiBvbmUgdGhhdCBzaG91bGQgYWx3YXlzIGJlIHVzZWQsIGFuZCB0aGlzIG9uZSBvbmx5IHVzZWQgZm9yIGNlcnRhaW4KLQkgKiBlcnJvciBjb25kaXRpb25zLCBvciBvciBpZiB3aGVuIGNyZWF0aW5nIGEgImR1cGxpY2F0ZSIgcmVzb3VyY2UsIGl0IHdhcwotCSAqIGRlc2lyZWQgdG8gdXNlIGV4YWN0bHkgdGhlIGNoYXJzZXQgbmFtZSBhcyBpbiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQuIEFzCi0JICogYW4gZXhhbXBsZSBvZiB0aGlzIGxhdGVyIGNhc2UsIHRoZSBvcmlnaW5hbCBkb2N1bWVudCBtaWdodCBjb250YWluCi0JICogSVNPLTg4NTktOSwgYnV0IHRoZSBkZXRlY3RlZCBjaGFyc2V0IG5hbWUgbWlnaHQgY29udGFpbiBJU08tODg1OS05LUkuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERldGVjdGVkQ2hhcnNldE5hbWUoKSB7Ci0JCXJldHVybiBmRGV0ZWN0ZWRDaGFyc2V0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY2hhcnNldCBuYW1lIHRoYXQgd2FzIGRldGVjdGVkLCBidXQgbm90IGZvdW5kIHRvIGJlIGEgY2hhcnNldAotCSAqIHN1cHBvb3J0ZWQgYnkgdGhlIFZNLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnZhbGlkRW5jb2RpbmcoKSB7Ci0JCXJldHVybiBmSW52YWxpZEVuY29kaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGphdmEgY29ub25pY2FsIGNoYXJzZXQgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUNoYXJzZXROYW1lKCkgewotCQlyZXR1cm4gZkphdmFDaGFyc2V0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiB3ZSBtYXkgYmUgYWJsZSB0byByZW1vdmUgdGhpcyBtZXRob2QsIGlmIGl0IHR1cm5zIG91dCB0aGlzIHdvcmsKLQkgKiBpcyBkb25lIGJ5ICJ0ZXh0IiB0eXBlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0KLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldFVuaWNvZGVCT00oKSB7Ci0JCWJ5dGVbXSBib20gPSBudWxsOwotCQlpZiAoaXNVVEY4M0J5dGVCT01Vc2VkKCkpCi0JCQlib20gPSBJQ29udGVudERlc2NyaXB0aW9uLkJPTV9VVEZfODsKLQkJZWxzZSBpZiAoaXNVbmljb2RlU3RyZWFtKCkpCi0JCQlib20gPSBmQk9NOwotCQlyZXR1cm4gYm9tOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IGluIG91ciBpbXBsZW1lbnRhdGlvbiwgdGhlIHN0cmVhbSBpcyBhIHVuaWNvZGUgc3RyZWFtIGlmIHRoZQotCSAqIGNoYXJzZXQgaXMgVVRGLTE2LCBVVEYtMTZMRSwgb3IgVVRGLTE2QkUuIEEgc3RyZWFtIHdpdGggMyBieXRlIEJPTSBpcwotCSAqIG5vdCBjb25zaWRlcmVkIHVuaWNvZGUgc3RyZWFtIGhlcmUuCi0JICogCi0JICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgaXMgYSB1bmljb2RlIChVVEYtMTYpIHN0cmVhbQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVW5pY29kZVN0cmVhbSgpIHsKLQkJcmV0dXJuIGZVbmljb2RlU3RyZWFtOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IGluIG91ciBpbXBsZW1lbnRhdGlvbiwgdGhlIHN0cmVhbSBpcyBhIHVuaWNvZGUgc3RyZWFtIGlmIHRoZQotCSAqIGNoYXJzZXQgaXMgVVRGLTE2LCBVVEYtMTZMRSwgb3IgVVRGLTE2QkUuIEEgc3RyZWFtIHdpdGggMyBieXRlIEJPTSBpcwotCSAqIG5vdCBjb25zaWRlcmVkIHVuaWNvZGUgc3RyZWFtIGhlcmUuCi0JICogCi0JICogU2V0IGR1cmluZyBsb2FkLCBjYW4gYmUgdXNlZCBieSBkdW1wZXIgdG8gd3JpdGUgMyBieXRlIEJPTSwgd2hpY2ggSmF2YQotCSAqIGRvZXMgbm90IG5vcm1hbGx5IGRvLiBUaGlzIGhlbHBzIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgotCSAqIHByb2dyYW1zICh0aG9zZSB0aGF0IHdyb3RlIHRoZSAzIGJ5dGUgQk9NIHRoZXJlIHRvIGJlZ2luIHdpdGguCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVVEY4M0J5dGVCT01Vc2VkKCkgewotCQlyZXR1cm4gZlVURjgzQnl0ZUJPTVVzZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIGdldEludmFsaWRFbmNvZGluZygpID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYXBwcm9wcmlhdGVEZWZhdWx0LgotCSAqIAotCSAqIEBwYXJhbSBhcHByb3ByaWF0ZURlZmF1bHQKLQkgKiAgICAgICAgICAgIFRoZSBhcHByb3ByaWF0ZURlZmF1bHQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QXBwcm9wcmlhdGVEZWZhdWx0KFN0cmluZyBhcHByb3ByaWF0ZURlZmF1bHQpIHsKLQkJZkFwcHJvcHJpYXRlRGVmYXVsdCA9IGFwcHJvcHJpYXRlRGVmYXVsdDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldERldGVjdGVkQ2hhcnNldE5hbWUoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJZkRldGVjdGVkQ2hhcnNldE5hbWUgPSBkZXRlY3RlZENoYXJzZXROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludmFsaWRFbmNvZGluZyhTdHJpbmcgaW52YWxpZEVuY29kaW5nKSB7Ci0JCWZJbnZhbGlkRW5jb2RpbmcgPSBpbnZhbGlkRW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgamF2YUVuY29kaW5nTmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YUVuY29kaW5nTmFtZQotCSAqICAgICAgICAgICAgVGhlIGphdmFFbmNvZGluZ05hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SmF2YUNoYXJzZXROYW1lKFN0cmluZyBqYXZhQ2hhcnNldE5hbWUpIHsKLQkJZkphdmFDaGFyc2V0TmFtZSA9IGphdmFDaGFyc2V0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaWNvZGVTdHJlYW0oYm9vbGVhbiB1bmljb2RlU3RyZWFtKSB7Ci0JCWZVbmljb2RlU3RyZWFtID0gdW5pY29kZVN0cmVhbTsKLQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVURjgzQnl0ZUJPTWZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSB1VEY4M0J5dGVCT01mb3VuZAotCSAqICAgICAgICAgICAgVGhlIHVURjgzQnl0ZUJPTWZvdW5kIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVURjgzQnl0ZUJPTVVzZWQoYm9vbGVhbiB1VEY4M0J5dGVCT01Vc2VkKSB7Ci0JCWZVVEY4M0J5dGVCT01Vc2VkID0gdVRGODNCeXRlQk9NVXNlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmljb2RlQk9NKGJ5dGVbXSBib20pIHsKLQkJZkJPTSA9IGJvbTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0VuY29kaW5nUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9FbmNvZGluZ1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQyOTg4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0VuY29kaW5nUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotCi0vKioKLSAqIENsYXNzIHRvIHByb3ZpZGVkICJlbnVtZXJhdGVkIHR5cGVzIiBmb3IgZW5jb2RpbmcgcnVsZSBwYXJhbWV0ZXIuIFRoaXMgaXMKLSAqIHRvIGJlIHVzZWQgYnkgY2xpZW50IHRvIGhhdmUgc29tZSBjb250cm9sIG92ZXIgaG93IGVuY29kaW5nIGlzIGRldGVybWluZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1J1bGUgewotCS8qKgotCSAqIENPTlRFTlRfQkFTRUQgbWVhbnMgdGhlIGNsYXNzIHdoaWNoIHVzZXMgdGhlIHBhcmFtZXRlciAoc3VjaCBhcwotCSAqIGNvbnRlbnRUeXBlIExvYWRlcnMpIHNob3VsZCB1c2Ugd2hhdCBldmVyIHJ1bGVzIGl0IG5vcm1hbGx5IHdvdWxkLgotCSAqIChOb3RlLCBzb21lIGNvbnRlbnQgdHlwZSBsb2FkZXJzIG1heSBub3QgYWx3YXlzIGxpdGVyYWxseSB1c2UgdGhlIGZpbGUKLQkgKiBjb250ZW50IHRvIGRldGVybWluZSBlbmNvZGluZywgYnV0IHRoZSBwb2ludCBpcyB0aGV5IHNob3VsZCB1c2Ugd2hhdAotCSAqIGV2ZXIgcnVsZXMgdGhleSBub3JtYWxseSB3b3VsZC4pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbmNvZGluZ1J1bGUgQ09OVEVOVF9CQVNFRCA9IG5ldyBFbmNvZGluZ1J1bGUoIkNPTlRFTlRfQkFTRUQiKTsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEZPUkNFX0RFRkFVTFQgbWVhbnMgdGhlIGNsYXNzIHdoaWNoIHVzZXMgdGhlIHBhcmFtZXRlciAoc3VjaCBhcwotCSAqIGNvbnRlbnRUeXBlIExvYWRlcnMpIHNob3VsZCB1c2Ugd2hhdCBldmVyIGl0IGRlZmluZXMgYXMgdGhlIGRlZmF1bHQKLQkgKiBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVuY29kaW5nUnVsZSBGT1JDRV9ERUZBVUxUID0gbmV3IEVuY29kaW5nUnVsZSgiRk9SQ0VfREVGQVVMVCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJR05PUkVfQ09OVkVSU0lPTl9FUlJPUiBtZWFucyB0aGF0IHRoZSBzYXZlIG9wZXJhdGlvbiBzaG91bGQgc2F2ZSBldmVuCi0JICogaWYgaXQgZW5jb3VudGVycyBjb252ZXJzaW9uIGVycm9ycy4gVGhpcyB3aWxsIHJlc3VsdCBpbiBzb21lIGRhdGEgbG9zcywKLQkgKiBzbyBzaG91bGQgb25seSBiZSB1c2VkIGFmdGVyIHRoZSB1c2VyIGNvbmZpcm1zIHRoYXQgaXMgaW5kZWVkIHdoYXQgdGhleQotCSAqIHdhbnQgdG8gZG8uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbmNvZGluZ1J1bGUgSUdOT1JFX0NPTlZFUlNJT05fRVJST1IgPSBuZXcgRW5jb2RpbmdSdWxlKCJJR05PUkVfQ09OVkVSU0lPTl9FUlJPUiIpOyAvLyROT04tTkxTLTEkCi0KLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGVuY29kaW5nUnVsZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFbmNvZGluZ1J1bGUgaXMgcHJpdmF0ZSwgc28gbm8gb25lIGNhbiBpbnN0YW50aWF0ZQotCSAqIGV4Y2VwdCB0aGlzIGNsYXNzIGl0c2VsZi4KLQkgKi8KLQlwcml2YXRlIEVuY29kaW5nUnVsZShTdHJpbmcgcnVsZU5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJZW5jb2RpbmdSdWxlID0gcnVsZU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGVuY29kaW5nUnVsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lDb2RlZFJlc291cmNlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lDb2RlZFJlc291cmNlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNDkwMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JQ29kZWRSZXNvdXJjZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElDb2RlZFJlc291cmNlUGx1Z2luIHsKLQlTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIyZTBhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkIHsKLQkvKioKLQkgKiBUaGUgQVBQUk9QUklBVEVfREVGQVVMVCBmaWVsZCBpcyB1c2VkIG9ubHkgd2hlbiB0aGUKLQkgKiBJQ29udGVudFR5cGUuZ2V0RGVmYXVsdENoYXJzZXQgcmV0dXJucyBudWxsLiBJdHMgdHlwaWNhbGx5IHNldCBmcm9tCi0JICogdXNlciBwcmVmZXJlbmNlcy4gS25vd24gdXNlcyBjYXNlcyBhcmUgSFRNTCBhbmQgQ1NTLCB3aGVyZSB0aGVyZSBpcyBubwotCSAqICJzcGVjIGRlZmF1bHQiIGZvciB0aG9zZSBjb250ZW50IHR5cGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBBUFBST1BSSUFURV9ERUZBVUxUID0gbmV3IFF1YWxpZmllZE5hbWUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQsICJhcHByb3ByaWF0ZURlZmF1bHQiKTsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBERVRFQ1RFRF9DSEFSU0VUIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgd2hlbiB0aGUgImRldGVjdGVkIiBjaGFyc2V0Ci0JICogaXMgZGlmZmVyZW50IGZyb20gdGhlIGphdmEgY2hhcnNldCwgZXZlbiB0aG91Z2ggZnVuY3Rpb25hbGx5Ci0JICogZXF1aXZlbGVudC4gVGhpcyBjYW4gb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBjYXNlcyBhcmUgZGlmZmVyZW50LAotCSAqIG9yIHdoZW4gYW4gYWxpYXMgbmFtZSBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIGNvbmFuaWNhbCBuYW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBERVRFQ1RFRF9DSEFSU0VUID0gbmV3IFF1YWxpZmllZE5hbWUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQsICJkZXRlY3RlZENoYXJzZXQiKTsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBVTlNVUFBPUlRFRF9DSEFSU0VUIHByb3BlcnR5IGhvbGRzIHRoZSBjaGFyc2V0IHZhbHVlLCBpZiBpdHMgYmVlbgotCSAqIGZvdW5kIHRvIGJlIGFuIHVuc3VwcG90ZWQgY2hhcnNldC4gVGhpcyBpcyBoZWxwZnVsIGluIGVycm9yIG1lc3NhZ2VzLAotCSAqIG9yIGluIGNhc2VzIHdoZW4gZXZlbiB0aG91Z2ggdGhlIGNoYXJzZXQgaXMgaW52YWxpZCwgdGhlIGphdmEgY2hhcnNldAotCSAqIGlzIGFzc3VtZWQgdG8gYmUgdGhlIGRlZmF1bHQuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIFVOU1VQUE9SVEVEX0NIQVJTRVQgPSBuZXcgUXVhbGlmaWVkTmFtZShJQ29kZWRSZXNvdXJjZVBsdWdpbi5JRCwgInVuc3VwcG9ydGVkQ2hhcnNldCIpOyAvLyROT04tTkxTLTEkCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSVJlc291cmNlQ2hhcnNldERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZGNiYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBJU3RyZWFtQ2hhcnNldERldGVjdG9yIHsKLQl2b2lkIHNldChJU3RvcmFnZSBpU3RvcmFnZSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSVN0cmVhbUNoYXJzZXREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JU3RyZWFtQ2hhcnNldERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNTA4ZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JU3RyZWFtQ2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJlYW1DaGFyc2V0RGV0ZWN0b3IgewotCVN0cmluZyBnZXRFbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCVN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0KLQl2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSk7Ci0KLQl2b2lkIHNldChSZWFkZXIgcmVhZGVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL05vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3MTU4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL05vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRKYXZhUGxhdGZvcm1EZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCVN0cmluZyBlbmMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkvLyByZXR1cm4gYmxhbmsgYXMgbnVsbAotCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbmMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVc2VyU3BlY2lmaWVkRGVmYXVsdEZvckNvbnRlbnRUeXBlKElGaWxlIGlGaWxlKSB7Ci0JCVN0cmluZyBlbmMgPSBudWxsOwotCQkKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbnRlbnRUeXBlID0gaUZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkuZ2V0Q29udGVudFR5cGUoKTsKLQkJCQotCQkJLy8gZmlyc3QgdHJ5IHRvIGdldCBiYXNlJ3MgZGVmYXVsdCBlbmNvZGluZyBmb3IgY29udGVudCB0eXBlIAotCQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCQllbmMgPSBjb250ZW50VHlwZS5nZXREZWZhdWx0Q2hhcnNldCgpOwotCQkJfQotCi0JCQkvLyBuZXh0IHRyeSB0byBnZXQgc3NlJ3MgZGVmYXVsdCBlbmNvZGluZyBmb3IgY29udGVudCB0eXBlCi0JCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJZW5jID0gQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXkuZ2V0UHJlZmVyZW5jZXNTdHJpbmcoY29udGVudFR5cGUsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQpOwotCQkJfQotCQkJCi0JCQkvLyByZXR1cm4gYmxhbmsgYXMgbnVsbAotCQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWVuYyA9IG51bGw7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gaWYgY29yZSBleGNlcHRpb24gb2NjdXJzLCBhc3N1bWUgbm8gcHJlZmVyZW5jZSEKLQkJCWVuYyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVc2VyU3BlY2lmaWVkRGVmYXVsdEZvckNvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCVN0cmluZyBlbmMgPSBudWxsOwotCQkKLQkJLy8gZmlyc3QgdHJ5IHRvIGdldCBiYXNlJ3MgZGVmYXVsdCBlbmNvZGluZyBmb3IgY29udGVudCB0eXBlCi0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJZW5jID0gY29udGVudFR5cGUuZ2V0RGVmYXVsdENoYXJzZXQoKTsKLQkJfQotCQkKLQkJLy8gbmV4dCB0cnkgdG8gZ2V0IHNzZSdzIGRlZmF1bHQgZW5jb2RpbmcgZm9yIGNvbnRlbnQgdHlwZQotCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbmMgPSBDb250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheS5nZXRQcmVmZXJlbmNlc1N0cmluZyhjb250ZW50VHlwZUlkLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VUKTsKLQkJfQotCQkKLQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRXb3JrYmVuY2hTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCVJlc291cmNlc1BsdWdpbiByZXNvdXJjZVBsdWdpbiA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKTsKLQkJU3RyaW5nIGVuYyA9IHJlc291cmNlUGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFJlc291cmNlc1BsdWdpbi5QUkVGX0VOQ09ESU5HKTsKLQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzcGVjRGVmYXVsdAotCSAqICAgICAgICAgICAgVGhpcyBpcyB0aGUgZGVmYXVsdCBjaGFyc2V0IG5hbWUgdGhhdCB3b3VsZCBvcmRpbmFyaWx5IGJlCi0JICogICAgICAgICAgICB1c2VkIGZvciBhIHBhcnRpY3VsYXIgdHlwZSBvZiBjb250ZW50LiBOdWxsIG1heSBiZQotCSAqICAgICAgICAgICAgc3BlY2lmaWZlZCBmb3IgdGhvc2UgdHlwZXMgd2l0aCBubyBzcGVjIGRlZmF1bHQuIElmIHRoZSBzcGVjCi0JICogICAgICAgICAgICBkZWZhdWx0IGlzIGtub3duIChhbmQgcGFzc2VkIGluKSwgdGhlbiBpdCB3aWxsIGJlIHJldHVybmVkCi0JICogICAgICAgICAgICBhZnRlciBiZWluZyBjaGVja2VkIHRvIHNlZSBpZiB0aGVyZSdzIGJlIGFueSB1c2VyIHNwZWNpZmllZAotCSAqICAgICAgICAgICAgIm92ZXJyaWRlIiBmb3IgdGhhdCBjaGFyc2V0ICh3aGljaCB3b3VsZCBiZSByYXJlKS4gSW4gb3RoZXIKLQkgKiAgICAgICAgICAgIHdvcmRzLCBpZiB0aGUgc3BlYyBpcyBrbm93biwgdGhlcmUncyBsaXR0bGUgcmVhc29uIHRvIHVzZQotCSAqICAgICAgICAgICAgdGhpcyBtZXRob2QuCi0JICogQHJldHVybiB0aGUgY2hhcnNldCB0aGF0IHNob3VsZCBiZSB1c2VkIGFjY29yZGluZyB0byB0aGUgcnVsZXMKLQkgKiAgICAgICAgIGVzdGFibGlzaGVkIGJ5IHRoaXMgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdXNlRGVmYXVsdE5hbWVSdWxlcyhTdHJpbmcgc3BlY0RlZmF1bHQpIHsKLQkJU3RyaW5nIGVuYyA9IG51bGw7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQllbmMgPSBzcGVjRGVmYXVsdDsKLQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBlbmM7Ci0JCX0gZWxzZSB7Ci0JCQllbmMgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0VXNlclNwZWNpZmllZERlZmF1bHRFbmNvZGluZ1ByZWZlcmVuY2UoKTsKLQkJCWlmIChlbmMgIT0gbnVsbCAmJiBlbmMudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCXJlc3VsdCA9IGVuYy50cmltKCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChlbmMgPT0gbnVsbCB8fCBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJZW5jID0gZ2V0V29ya2JlbmNoU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJCWlmIChlbmMgIT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gZW5jLnRyaW0oKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWVuYyA9IGdldEphdmFQbGF0Zm9ybURlZmF1bHRFbmNvZGluZygpOwotCQkJCQkvLyBlbmMgc2hvdWxkIG5ldmVyIGJlIG51bGwgKGJ1dCB3ZSdsbAotCQkJCQkvLyBjaGVjayBhbnl3YXkpCi0JCQkJCWlmIChlbmMgIT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gZW5jOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Bc3NlcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Bc3NlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUxYjM3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQXNzZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi0vKioKLSAqIDxjb2RlPkFzc2VydDwvY29kZT4gaXMgdXNlZnVsIGZvciBmb3IgZW1iZWRkaW5nIHJ1bnRpbWUgc2FuaXR5IGNoZWNrcyBpbgotICogY29kZS4gVGhlIHByZWRpY2F0ZSBtZXRob2RzIGFsbCB0ZXN0IGEgY29uZGl0aW9uIGFuZCB0aHJvdyBzb21lIHR5cGUgb2YKLSAqIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBkb2VzIG5vdCBob2xkLgotICogPHA+Ci0gKiBBc3NlcnRpb24gZmFpbHVyZSBleGNlcHRpb25zLCBsaWtlIG1vc3QgcnVudGltZSBleGNlcHRpb25zLCBhcmUgdGhyb3duIHdoZW4KLSAqIHNvbWV0aGluZyBpcyBtaXNiZWhhdmluZy4gQXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBpbnZhcmlhYmx5IHVuc3BlY2lmaWVkCi0gKiBiZWhhdmlvcjsgY29uc2VxdWVudGx5LCBjbGllbnRzIHNob3VsZCBuZXZlciByZWx5IG9uIHRoZXNlIGJlaW5nIHRocm93bgotICogKGFuZCBjZXJ0YWlubHkgc2hvdWxkIG5vdCBiZWluZyBjYXRjaGluZyB0aGVtIHNwZWNpZmljYWxseSkuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3NlcnQgewotCi0JLyoqCi0JICogPGNvZGU+QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uPC9jb2RlPiBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRocm93bgotCSAqIGJ5IHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4gPGNvZGU+QXNzZXJ0PC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGlzIGNsYXNzIGlzIG5vdCBkZWNsYXJlZCBwdWJsaWMgdG8gcHJldmVudCBzb21lIG1pc3VzZXM7IHByb2dyYW1zCi0JICogdGhhdCBjYXRjaCBvciBvdGhlcndpc2UgZGVwZW5kIG9uIGFzc2VydGlvbiBmYWlsdXJlcyBhcmUgc3VzY2VwdGlibGUgdG8KLQkgKiB1bmV4cGVjdGVkIGJyZWFrYWdlIHdoZW4gYXNzZXJ0aW9ucyBpbiB0aGUgY29kZSBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiA8L3A+Ci0JICovCi0Jc3RhdGljIGNsYXNzIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbi4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCi0JCSAqLwotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBkZXRhaWwpIHsKLQkJCXN1cGVyKGRldGFpbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzIG5vdAotCSAqIDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlzCi0JICogdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkCi0JICogZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlCi0JICogICAgICAgICBjaGVjayBmYWlscykKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKQotCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzIGlzCi0JICogbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbgotCSAqIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHRlc3QKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcyBpcyBub3QKLQkgKiB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZQotCSAqIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlCi0JICogICAgICAgICBjaGVjayBmYWlscykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKSB7Ci0JCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLwotCXByaXZhdGUgQXNzZXJ0KCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9CdWZmZXJlZExpbWl0ZWRSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9CdWZmZXJlZExpbWl0ZWRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAyNmJkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnVmZmVyZWRMaW1pdGVkUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0vKioKLSAqIFRoaXMgaXMgYSBwcmV0dHkgbGltaXRlZCBpbXBsZW1lbnRhdGlvbiwgc29ydCBvZiBzcGVjaWZpYyAKLSAqIHRvIHRoZSB3YXkgaXRzIHVzZWQgYnkgdG9rZW5pemVycyAoSkZsZXgpLiBUbyByZWFsbHkgCi0gKiBiZSBnZW5lcmFsIHB1cnBvc2UsIHdvdWxkIG5lZWQgbW9yZSB3b3JrLiAKLSAqCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgQnVmZmVyZWRMaW1pdGVkUmVhZGVyIGV4dGVuZHMgQnVmZmVyZWRSZWFkZXIgewotCXByaXZhdGUgaW50IGxpbWl0ZWRDb3VudDsKLQlwcml2YXRlIGludCBuUmVhZDsKLQotCXB1YmxpYyBCdWZmZXJlZExpbWl0ZWRSZWFkZXIoUmVhZGVyIHJlYWRlciwgaW50IHNpemUpIHsKLQkJc3VwZXIocmVhZGVyLCBzaXplKTsKLQkJaWYgKHJlYWRlci5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJbWFyayhzaXplKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaW1wb3NzaWJsZQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJbGltaXRlZENvdW50ID0gc2l6ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJblJlYWQrKzsKLQkJaWYgKG5SZWFkID4gbGltaXRlZENvdW50KSB7Ci0JCQlyZXN1bHQgPSAtMTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IHN1cGVyLnJlYWQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXIgY2J1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaWYgKG5SZWFkICsgbGVuID4gbGltaXRlZENvdW50KSB7Ci0JCQlyZXN1bHQgPSAtMTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IHN1cGVyLnJlYWQoY2J1Ziwgb2ZmLCBsZW4pOwotCQkJblJlYWQgPSBuUmVhZCArIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9CdWZmZXJlZExpbWl0ZWRTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9CdWZmZXJlZExpbWl0ZWRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyODY1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnVmZmVyZWRMaW1pdGVkU3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQnVmZmVyZWRMaW1pdGVkU3RyZWFtIGV4dGVuZHMgQnVmZmVyZWRJbnB1dFN0cmVhbSB7Ci0KLQlwcml2YXRlIGludCBsaW1pdGVkQ291bnQ7Ci0KLQlwdWJsaWMgQnVmZmVyZWRMaW1pdGVkU3RyZWFtKElucHV0U3RyZWFtIGluU3RyZWFtLCBpbnQgc2l6ZSkgewotCQlzdXBlcihpblN0cmVhbSwgc2l6ZSk7Ci0JCW1hcmsoc2l6ZSk7Ci0JCXRyeSB7Ci0JCQlsaW1pdGVkQ291bnQgPSBNYXRoLm1pbihzaXplLCBpblN0cmVhbS5hdmFpbGFibGUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHVubGlrZWx5Ci0JCQlsaW1pdGVkQ291bnQgPSAwOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI2F2YWlsYWJsZSgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gbGltaXRlZENvdW50IC0gcG9zOwotCX0KLQotCS8qKgotCSAqIGNvcGllZCBkb3duIGZyb20gc3VwZXIgY2xhc3MKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5zdXJlT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gY2xvc2VkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBjb3BpZWQgZG93biBmcm9tIHN1cGVyIGNsYXNzIHRoZW4sIGNoYW5nZWQgdG8gc2ltaXVsYXRlIEVPRiBpZiBnb2VzCi0JICogYmV5b25kIGJ1ZmZlcmVkIGFtb3VudAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVPcGVuKCk7Ci0JCS8vIGZvciB0aGlzIHNwZWNpYWwgc3RyZWFtLCBpbmRpY2F0ZSAiZW5kIG9mIGZpbGUiIHdoZW4gYnVmZmVyIGlzCi0JCS8vIGZ1bGwKLQkJaWYgKHBvcyA+PSBsaW1pdGVkQ291bnQpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucmVhZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZm9yIHRoaXMgc3BlY2lhbCBzdHJlYW0sIGluZGljYXRlICJlbmQgb2YgZmlsZSIgd2hlbiBidWZmZXIgaXMKLQkJLy8gZnVsbAotCQlpZiAocG9zID49IGxpbWl0ZWRDb3VudCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiBzdXBlci5yZWFkKGIsIG9mZiwgbGVuKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J5dGVSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwNDZlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnl0ZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gImFkYXB0ZXIiIGNsYXNzLCBzaW1wbHkgdG8gZ2V0IGluIGlucHV0IHN0cmVhbSB0byBhY3QgbGlrZSBhCi0gKiByZWFkZXIuIFdlIGNvdWxkIG5vdCB1c2UgSW5wdXRTdHJlYW1SZWFkZXIgZGlyZWN0bHkgYmVjYXVzZSBpdHMgaW50ZXJuYWwKLSAqIGJ1ZmZlcnMgYXJlIG5vdCBjb250cm9sbGFibGUsIGFuZCBpdCBzb21ldGltZXMgcHVsbHMgdG9vIG11Y2ggb3V0IG9mIGlucHV0Ci0gKiBzdHJlYW0gKGV2ZW4gd2hlbiBpdCB3YXNuJ3QgbmVlZGVkIGZvciBvdXIgcHVycG9zZXMpLgotICogCi0gKiBUaGUgdXNlIG9mIHRoaXMgY2xhc3MgaXMgaGlnaGx5IHNwZWNpYWxpemVkIGFuZCBieSBub3QgbWVhbnMgbWVhbnQgdG8gYmUKLSAqIGdlbmVyYWwgcHVycG9zZS4gSXRzIHVzZSBpcyByZXN0cmljdGVkIHRvIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBpbnB1dAotICogc3RyZWFtIGNhbiBiZSByZWdhcmRlZCBhcyBhc2NpaSBqdXN0IGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB3aGF0IHRoZSByZWFsCi0gKiBlbmNvZGluZyBzaG91bGQgYmUuCi0gKi8KLQotcHVibGljIGNsYXNzIEJ5dGVSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IENvZGVkSU8uTUFYX0JVRl9TSVpFOwotCi0JcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOwotCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKLQotCXByb3RlY3RlZCBCeXRlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRoaXMoaW5wdXRTdHJlYW0sIERFRkFVTFRfQlVGRkVSX1NJWkUpOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBzaXplKSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5mQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ubWFyayhyZWFkQWhlYWRMaW1pdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGIwID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCgpOwotCQlyZXR1cm4gKGIwICYgMHgwMEZGKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjaFtdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobGVuZ3RoID4gdGhpcy5mQnVmZmVyLmxlbmd0aCkgewotCQkJbGVuZ3RoID0gdGhpcy5mQnVmZmVyLmxlbmd0aDsKLQkJfQotCi0JCWludCBjb3VudCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQodGhpcy5mQnVmZmVyLCAwLCBsZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGIwID0gdGhpcy5mQnVmZmVyW2ldOwotCQkJLy8gdGhlIDB4MDBGRiBpcyB0byAibG9zZSIgdGhlIG5lZ2F0aXZlIGJpdHMgZmlsbGVkIGluIHRoZSBieXRlIHRvCi0JCQkvLyBpbnQgY29udmVyc2lvbgotCQkJLy8gKGFuZCB3aGljaCB3b3VsZCBiZSB0aGVyZSBpZiBjYXN0IGRpcmVjdGx5IGZyb20gYnl0ZSB0byBjaGFyKS4KLQkJCWNoYXIgYzAgPSAoY2hhcikgKGIwICYgMHgwMEZGKTsKLQkJCWNoW29mZnNldCArIGldID0gYzA7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLnJlc2V0KCk7Ci0JfQotCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5za2lwKG4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0NvZGVkUmVzb3VyY2VQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Db2RlZFJlc291cmNlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOTI4Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0NvZGVkUmVzb3VyY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvZGVkUmVzb3VyY2VQbHVnaW47Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2RlZFJlc291cmNlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIGltcGxlbWVudHMgSUNvZGVkUmVzb3VyY2VQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDb2RlZFJlc291cmNlUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvZGVkUmVzb3VyY2VQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENvZGVkUmVzb3VyY2VQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlVTRV8zQllURV9CT01fV0lUSF9VVEY4LCBmYWxzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxMWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9OdWxsSW5wdXRTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9OdWxsSW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0NGYyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvTnVsbElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIE51bGxJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNtYXJrKGludCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jbWFya1N1cHBvcnRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJLy8gd2UgY2FuIG1hcmsgbm90aGluZy4KLQkJLy8gYW5kLCB3ZSBhcmUgdXNpbmcgdGhpcyBOdWxsIGNsYXNzIHNwZWNpZmljYWxseSBmb3IKLQkJLy8gYSAiZmFrZSIgcmVzZXR0YWJsZSBzdHJlYW0uCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVzZXQoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jc2tpcChsb25nKQotCSAqLwotCXB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvUmVzb3VyY2VCdW5kbGVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9SZXNvdXJjZUJ1bmRsZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGFhYTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9SZXNvdXJjZUJ1bmRsZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vL1RPRE86IHJld29yayB0aGlzIHdpdGggbmV3IHBsYXRmb3JtL3J1bnRpbWUgQVBJcyAoaWYgc3RpbGwgbmVlZGVkKS4KLQotcHVibGljIGNsYXNzIFJlc291cmNlQnVuZGxlSGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoU3RyaW5nIHJlc291cmNlVVJJKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUJ1bmRsZShyZXNvdXJjZVVSSSwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZShTdHJpbmcgcmVzb3VyY2VVUkksIExvY2FsZSB0YXJnZXRMb2NhbGUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gdHJ5IHRvIGxvYWQgYnVuZGxlIGZyb20gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiB0aGUgcmVzb3VyY2VVUkkKLQkJLy8gd2UgbWFrZSB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSByZXNvdXJjZVVSSSBwb2ludHMgdG8gdGhlIGxvY2FsCi0JCS8vIGZpbGUgc3lzdGVtCi0KLQkJaW50IGluZGV4ID0gcmVzb3VyY2VVUkkubGFzdEluZGV4T2YoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgcmVzb3VyY2VVUkkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gQmVsb3cgd2Ugc2V0ICdyZXNvdXJjZURpcmVjdG9yeScgc28gdGhhdCBpdCBlbmRzIHdpdGggYSAnLycuCi0JCS8vIEhlcmUncyBhbiBleGNlcnB0IGZyb20gdGhlIENsYXNzTG9hZGVyIEphdmFkb2MgLi4uCi0JCS8vIEFueSBVUkwgdGhhdCBlbmRzIHdpdGggYSAnLycgaXMgYXNzdW1lZCB0byByZWZlciB0byBhIGRpcmVjdG9yeS4KLQkJLy8gT3RoZXJ3aXNlLCB0aGUgVVJMIGlzIGFzc3VtZWQKLQkJLy8gdG8gcmVmZXIgdG8gYSBKQVIgZmlsZSB3aGljaCB3aWxsIGJlIG9wZW5lZCBhcyBuZWVkZWQuCi0JCS8vCi0JCVN0cmluZyByZXNvdXJjZURpcmVjdG9yeSA9IHJlc291cmNlVVJJLnN1YnN0cmluZygwLCBpbmRleCArIDEpOwotCQlTdHJpbmcgcmVzb3VyY2VCdW5kbGVOYW1lID0gcmVzb3VyY2VVUkkuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0KLQkJLy8gY3JlYXRlIGEgY2xhc3MgbG9hZGVyIHdpdGggYSBjbGFzcyBwYXRoIHRoYXQgcG9pbnRzIHRvIHRoZSByZXNvdXJjZQotCQkvLyBidW5kbGUncyBsb2NhdGlvbgotCQkvLyAgICAgICAgIAotCQlVUkxbXSBjbGFzc3BhdGggPSBuZXcgVVJMWzFdOwotCQljbGFzc3BhdGhbMF0gPSBQbGF0Zm9ybS5yZXNvbHZlKG5ldyBVUkwocmVzb3VyY2VEaXJlY3RvcnkpKTsKLQkJQ2xhc3NMb2FkZXIgcmVzb3VyY2VMb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIoY2xhc3NwYXRoLCBudWxsKTsKLQotCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlQnVuZGxlTmFtZSwgdGFyZ2V0TG9jYWxlLCByZXNvdXJjZUxvYWRlcik7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvVW5pY29kZUJPTUVuY29kaW5nRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Vbmljb2RlQk9NRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2M5ZDk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Vbmljb2RlQk9NRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLS8qKgotICogVGhpcyBpcyBhICJjb21tb24gZnVuY3Rpb24iIGNsYXNzIHRvIGRlY2lkZSBpZiBhbiBpbnB1dCBzdHJlYW0sIGlzIGEKLSAqIHVuaWNvZGUgc3RyZWFtLgotICovCi1wdWJsaWMgY2xhc3MgVW5pY29kZUJPTUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzE2X0NIQVJTRVRfTkFNRSA9ICJVVEYtMTYiOwotCS8vIC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm90RW5vdWdoSW5wdXRGb3JCT01FeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0KLQkJLyoqCi0JCSAqIERlZmF1bHQgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBOb3RFbm91Z2hJbnB1dEZvckJPTUV4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgTm90RW5vdWdoSW5wdXRGb3JCT01FeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJCXN1cGVyKHMpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIEJCID0gKGJ5dGUpIDB4QkI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBCRiA9IChieXRlKSAweEJGOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgRUYgPSAoYnl0ZSkgMHhFRjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIEZFID0gKGJ5dGUpIC0yOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBGRiA9IChieXRlKSAtMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzE2QkVfQ0hBUlNFVF9OQU1FID0gIlVURi0xNkJFIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTZMRV9DSEFSU0VUX05BTUUgPSAiVVRGLTE2TEUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzhfQ0hBUlNFVF9OQU1FID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW0gPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmTm9CT01Qb3NzaWJsZTsKLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGNoZWNrRm9yQk9NKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlieXRlIGIxID0gZ2V0TmV4dEJ5dGUoaW5wdXRTdHJlYW0pOwotCQkJYnl0ZSBiMiA9IGdldE5leHRCeXRlKGlucHV0U3RyZWFtKTsKLQkJCWlmIChiMSA9PSBGRSAmJiBiMiA9PSBGRikgewotCQkJCXJlc3VsdCA9IGNyZWF0ZUVuY29kaW5nTWVtZW50byhVVEZfMTZCRV9DSEFSU0VUX05BTUUpOwotCQkJCXJlc3VsdC5zZXRVbmljb2RlU3RyZWFtKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYjEgPT0gRkYgJiYgYjIgPT0gRkUpIHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFVURl8xNkxFX0NIQVJTRVRfTkFNRSk7Ci0JCQkJCXJlc3VsdC5zZXRVbmljb2RlU3RyZWFtKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJ5dGUgYjMgPSBnZXROZXh0Qnl0ZSgoaW5wdXRTdHJlYW0pKTsKLQkJCQkJaWYgKGIxID09IEVGICYmIGIyID09IEJCICYmIGIzID09IEJGKSB7Ci0JCQkJCQlyZXN1bHQgPSBjcmVhdGVFbmNvZGluZ01lbWVudG8oVVRGXzhfQ0hBUlNFVF9OQU1FKTsKLQkJCQkJCXJlc3VsdC5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChOb3RFbm91Z2hJbnB1dEZvckJPTUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIGlzIHNvcnQgb2YgdW5leHBlY3RlZCBmb3Igbm9ybWFsIGNhc2VzLCBidXQgY2FuIG9jY3VyIGZvcgotCQkJLy8gZW1wdHkKLQkJCS8vIHN0cmVhbXMuIEFuZCwgdGhpcyBjYW4gb2NjdXIgIm5vcm1hbGx5IiBmb3Igbm9uLUJPTSBzdHJlYW1zCi0JCQkvLyB0aGF0Ci0JCQkvLyBoYXZlIG9ubHkgdHdvCi0JCQkvLyBieXRlcywgYW5kIGZvciB3aGljaCB0aG9zZSB0d28gYnl0ZXMgbWF0Y2ggdGhlIGZpcnN0IHR3byBieXRlcwotCQkJLy8gb2YgVVRGLTgKLQkJCS8vIEJPTSBJbiBhbnkgY2FzZSwgd2UnbGwgc2ltcGx5IHJldHVybiBudWxsOwotCQkJcmVzdWx0ID0gbnVsbDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gb3RoZXIgZXJyb3JzIHNob3VsZCBiZSBpbXBvc3NpYmxlCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgamF2YUVuY29kaW5nTmFtZSkgewotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQllbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGphdmFFbmNvZGluZ05hbWUpOwotCQlTdHJpbmcgaWFuYU5hbWUgPSBDaGFyc2V0LmZvck5hbWUoamF2YUVuY29kaW5nTmFtZSkubmFtZSgpOwotCQllbmNvZGluZ01lbWVudG8uc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShpYW5hTmFtZSk7Ci0JCWlmIChqYXZhRW5jb2RpbmdOYW1lLmVxdWFscyhVVEZfOF9DSEFSU0VUX05BTUUpKSB7Ci0JCQllbmNvZGluZ01lbWVudG8uc2V0VVRGODNCeXRlQk9NVXNlZCh0cnVlKTsKLQkJfQotCQlyZXR1cm4gZW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCXJldHVybiBnZXRFbmNvZGluZ01lbWVudG8oKS5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBJQU5BIGVuY29kaW5nIG5hbWUgaWYgQk9NIGRldGVjdGVkIGluIHN0cmVhbS4gSWYgYSBCT00gaXMKLQkgKiBkZXRlY3RlZCwgdGhlIHN0cmVhbSBpcyBsZWZ0IHBvc2l0aW9uZWQgYWZ0ZXIgcmVhZHlpbmcgdGhlIEJPTS4gSWYgYQotCSAqIEJPTSBpcyBub3QgZGV0ZWN0ZWQsIHRoZSBzdGVhbSBpcyByZXNldC4KLQkgKiAKLQkgKiAweEZFRkYgVVRGLTE2LCBiaWctZW5kaWFuIDB4RkZGRSBVVEYtMTYsIGxpdHRsZS1lbmRpYW4gMHhFRkJCQkYgVVRGLTgKLQkgKiAoQk9NIGlzIG9wdGlvbmFsKQotCSAqIAotCSAqIEBwYXJhbSBpbnB1dFN0cmVhbSAtCi0JICogICAgICAgICAgICBtdXN0IGJlIGEgcmVzZXRhYmxlIChtYXJrIHN1cHBvcnRlZCkgc3RyZWFtIHNvIGl0IGNhbiBiZQotCSAqICAgICAgICAgICAgcmVzZXQsIGlmIG5vdCBCT00gZW5jb2RlZCBzdHJlYW0KLQkgKiBAcmV0dXJuIFN0cmluZyAtIElBTkEgZW5jb2RpbmduYW1lIChtYXkgbm90IHdvcmsgd2VsbCBvbiAxLjMsIGJ1dCAxLjQKLQkgKiAgICAgICAgIHNlZW1zIHRvIGhhdmUgZ29vZCBzdXBwb3J0IGZvciBJQU5BIG5hbWVzKQotCSAqLwotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgewotCi0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlpZiAoIWZOb0JPTVBvc3NpYmxlKSB7Ci0KLQkJCWlmIChmSW5wdXRTdHJlYW0gPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKCFmSW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5wdXRTdHJlYW0gbXVzdCBiZSByZXNldGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlyZXN1bHQgPSBjaGVja0ZvckJPTShmSW5wdXRTdHJlYW0pOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCXByaXZhdGUgYnl0ZSBnZXROZXh0Qnl0ZShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlpbnQgYnl0ZUNoYXJBc0ludCA9IC0xOwotCQkvLyBiZSBzdXJlIHdlIHdvbid0IGJsb2NrCi0JCWlmIChpbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKLQkJCWJ5dGVDaGFyQXNJbnQgPSBpbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCQlieXRlQ2hhckFzSW50ID0gYnl0ZUNoYXJBc0ludCAmIDBYRkY7Ci0JCX0KLQkJLy8gdG8gYXZvaWQgY29uZnVzdGlvbiBvdmVyIG1lYW5pbmcgb2YgcmV0dXJuZWQgYnl0ZSwKLQkJLy8gdGhyb3cgZXhjZXB0aW9uIGlmIEVPRiByZWFjaGVkLgotCQlpZiAoYnl0ZUNoYXJBc0ludCA9PSAtMSkKLQkJCXRocm93IG5ldyBOb3RFbm91Z2hJbnB1dEZvckJPTUV4Y2VwdGlvbigidHlwaWNhbGx5IG5vdCBhbiBlcnJvciIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAoYnl0ZSkgYnl0ZUNoYXJBc0ludDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIFRoZXJlIGlzIG5vIGRlZmF1bHQgZm9yIHRoaXMgY2FzZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmTm9CT01Qb3NzaWJsZSA9IGZhbHNlOwotCQlmSW5wdXRTdHJlYW0gPSBudWxsOwotCi0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJU3RvcmFnZSBpU3RvcmFnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzZXQobmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaVN0b3JhZ2UuZ2V0Q29udGVudHMoKSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCWlmIChyZWFkZXIgaW5zdGFuY2VvZiBCeXRlUmVhZGVyKSB7Ci0JCQlCeXRlUmVhZGVyIGJ5dGVSZWFkZXIgPSAoQnl0ZVJlYWRlcikgcmVhZGVyOwotCQkJZklucHV0U3RyZWFtID0gYnl0ZVJlYWRlci5mSW5wdXRTdHJlYW07Ci0JCX0gZWxzZSB7Ci0JCQlmTm9CT01Qb3NzaWJsZSA9IHRydWU7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL0NoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvQ2hhckNvbnZlcnNpb25FcnJvcldpdGhEZXRhaWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYxOTQ0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvQ2hhckNvbnZlcnNpb25FcnJvcldpdGhEZXRhaWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uczsKLQotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBDaGFyQ29udmVyc2lvbkVycm9yV2l0aERldGFpbCBleHRlbmRzIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIFN0cmluZyBmQ2hhcnNldE5hbWU7Ci0KLQlwdWJsaWMgQ2hhckNvbnZlcnNpb25FcnJvcldpdGhEZXRhaWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgQ2hhckNvbnZlcnNpb25FcnJvcldpdGhEZXRhaWwoU3RyaW5nIGNoYXJzZXROYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCWZDaGFyc2V0TmFtZSA9IGNoYXJzZXROYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkNoYXJzZXROYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldE5hbWUoKSB7Ci0JCXJldHVybiBmQ2hhcnNldE5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL01hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL01hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjMxYmJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEludGVuZGVkIHRvIGJlIGEgbW9yZSBwcmVjaXNlIGZvcm0gb2YgdGhlIE1hbGZvcm1lZElucHV0RXhjZXB0aW9uLCB3aGVyZQotICogY2hhcmFjdGVyIHBvc2l0aW9uIGFuZCBhdHRlbXB0ZWQgZW5jb2RpbmcgY2FuIGJlIGF0dGVtcHRlZC4KLSAqLwotcHVibGljIGNsYXNzIE1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbCBleHRlbmRzIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBpbnQgZkNoYXJQb3NpdGlvbjsKLQlwcml2YXRlIFN0cmluZyBmRGV0ZWN0ZWRDaGFyc2V0TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gZkV4Y2VlZGVkTWF4ID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkphdmFDaGFyc2V0TmFtZTsKLQlwcml2YXRlIGludCBmTWF4QnVmZmVyOwotCi0JLyoqCi0JICogRGlzYWxsb3cgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gSWYgYXR0ZW1wdGVkRW5jb2RpbmcgYW5kIGNoYXJQb3N0aW9uIGNhbgotCSAqIG5vdCBiZSBwcm92aWRlZCwgdXNlIG9uZSBvZiBqYXZhJ3MgTWFsZm9ybWVkRXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoKSB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQlwdWJsaWMgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKFN0cmluZyBlbmNvZGluZ05hbWUsIGludCBjaGFyUG9zdGlvbikgewotCQl0aGlzLmZKYXZhQ2hhcnNldE5hbWUgPSBlbmNvZGluZ05hbWU7Ci0JCXRoaXMuZkRldGVjdGVkQ2hhcnNldE5hbWUgPSBlbmNvZGluZ05hbWU7Ci0JCXRoaXMuZkNoYXJQb3NpdGlvbiA9IGNoYXJQb3N0aW9uOwotCX0KLQotCXB1YmxpYyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoU3RyaW5nIGF0dGVtcHRlZEphdmFFbmNvZGluZywgU3RyaW5nIGF0dGVtcHRlZElBTkFFbmNvZGluZywgaW50IGNoYXJQb3N0aW9uKSB7Ci0JCXRoaXMuZkphdmFDaGFyc2V0TmFtZSA9IGF0dGVtcHRlZEphdmFFbmNvZGluZzsKLQkJdGhpcy5mRGV0ZWN0ZWRDaGFyc2V0TmFtZSA9IGF0dGVtcHRlZElBTkFFbmNvZGluZzsKLQkJdGhpcy5mQ2hhclBvc2l0aW9uID0gY2hhclBvc3Rpb247Ci0JfQotCi0JLyoqCi0JICogSWYgY2hhclBvc2l0aW9uID0gLTEgdGhpcyBjb3VsZCBiZSBiZWNhdXNlIHRoZSBjaGFyYWN0ZXIgcG9zaXRpb24KLQkgKiBleGNlZWRlZCB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSwgbWF4QnVmZmVyLCB0aGVuIGV4Y2VlZGVkTWF4ID0gdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKFN0cmluZyBhdHRlbXB0ZWRKYXZhRW5jb2RpbmcsIFN0cmluZyBhdHRlbXB0ZWRJQU5BRW5jb2RpbmcsIGludCBjaGFyUG9zdGlvbiwgYm9vbGVhbiBleGNlZWRlZE1heCwgaW50IG1heEJ1ZmZlcikgewotCQl0aGlzLmZKYXZhQ2hhcnNldE5hbWUgPSBhdHRlbXB0ZWRKYXZhRW5jb2Rpbmc7Ci0JCXRoaXMuZkRldGVjdGVkQ2hhcnNldE5hbWUgPSBhdHRlbXB0ZWRJQU5BRW5jb2Rpbmc7Ci0JCXRoaXMuZkNoYXJQb3NpdGlvbiA9IGNoYXJQb3N0aW9uOwotCQl0aGlzLmZFeGNlZWRlZE1heCA9IGV4Y2VlZGVkTWF4OwotCQl0aGlzLmZNYXhCdWZmZXIgPSBtYXhCdWZmZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0ZW1wdGVkSUFOQUVuY29kaW5nKCkgewotCQlyZXR1cm4gZkRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0ZW1wdGVkSmF2YUVuY29kaW5nKCkgewotCQlyZXR1cm4gZkphdmFDaGFyc2V0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hhclBvc2l0aW9uKCkgewotCQlyZXR1cm4gZkNoYXJQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXhCdWZmZXIuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heEJ1ZmZlcigpIHsKLQkJcmV0dXJuIGZNYXhCdWZmZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhjZWVkZWRNYXguCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeGNlZWRlZE1heCgpIHsKLQkJcmV0dXJuIGZFeGNlZWRlZE1heDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9NYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWVjNjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9NYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnM7Ci0KLQotcHVibGljIGNsYXNzIE1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwgZXh0ZW5kcyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwgewotCi0JLyoqCi0JICogRGVmYXVsdCA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbC4gSWYgYXR0ZW1wdGVkRW5jb2RpbmcgYW5kIGNoYXJQb3N0aW9uIGNhbgotCSAqIG5vdCBiZSBwcm92aWRlZCwgdXNlIHN1bi5pby5NYWxmb3JtZWRFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGF0dGVtcHRlZEphdmFFbmNvZGluZwotCSAqIEBwYXJhbSBhdHRlbXB0ZWRJQU5BRW5jb2RpbmcKLQkgKiBAcGFyYW0gY2hhclBvc3Rpb24KLQkgKi8KLQlwdWJsaWMgTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbChTdHJpbmcgYXR0ZW1wdGVkSmF2YUVuY29kaW5nLCBTdHJpbmcgYXR0ZW1wdGVkSUFOQUVuY29kaW5nLCBpbnQgY2hhclBvc3Rpb24pIHsKLQkJc3VwZXIoYXR0ZW1wdGVkSmF2YUVuY29kaW5nLCBhdHRlbXB0ZWRJQU5BRW5jb2RpbmcsIGNoYXJQb3N0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjNhZjg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGludGVuZGVkIGZvciBzYW1lIHB1cnBvc2UgYXMgaXQgc3VwZXIgY2xhc3MsIGJ1dCBzaW1wbHkgcHJvdmlkZXMKLSAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhhbiB0aGUgbmFtZSBpbiBlcnJvci4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bAotICogZm9yICJVSXMiIHdoaWNoIGNhbiBwcmVzZW50IHVzZXJzIHdpdGggdGhlIGVycm9yLCBhbmQgdGhlCi0gKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiB0aGF0IGNhbiBiZSB1c2VkIGZvciBhIHBhcnRpY3VsYXIgaW5wdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsIGV4dGVuZHMgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIERlZmF1bHQgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRpbzsKLQotCXB1YmxpYyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsKEVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8pIHsKLQkJdGhpcyhlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpKTsKLQkJZkVuY29kaW5nTWVtZW50aW8gPSBlbmNvZGluZ01lbWVudG87Ci0JfQotCi0JcHJvdGVjdGVkIFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwoU3RyaW5nIGNoYXJzZXROYW1lKSB7Ci0JCXN1cGVyKGNoYXJzZXROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudGlvOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90YXNrcy9JRmlsZVRhc2tTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3Rhc2tzL0lGaWxlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2NTViMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3Rhc2tzL0lGaWxlVGFza1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci0KLS8qKgotICogU2Nhbm5lcnMgZm9yIHRoZSBtYWluIFRhc2sgU2Nhbm5lci4gU2Nhbm5lcnMgbWF5IGJlIGNvbnRyaWJ1dGVkIHVzaW5nIHRoZQotICogb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRhc2tzY2FubmVyIGV4dGVuc2lvbiBwb2ludC4gRm9yIHJlc291cmNlcyBhbmQKLSAqIHJlc291cmNlIGRlbHRhcyB3aXRoIG1hdGNoaW5nIGNvbnRlbnQgdHlwZXMsIHRoZSBtYWluIHNjYW5uZXIgd2lsbCBmaXJzdAotICogY2FsbCB0aGUgc3RhcnR1cCgpIG1ldGhvZCwgc2NhbigpLCBhbmQgdGhlbiBzaHV0ZG93bigpIGluIHNlcXVlbmNlLiBTY2FubmVyCi0gKiBpbnN0YW5jZXMgd2lsbCBiZSByZXVzZWQgYWNyb3NzIHByb2plY3RzIGJ1dCBhcmUgbm90IHNoYXJlZCBwZXIgY29udGVudAotICogdHlwZS4gU2Nhbm5lcnMgc2hvdWxkIG5vdCBob2xkIG9uIHRvIHJlZmVyZW5jZXMgdG8gbW9kZWxzIG9yIHJlc291cmNlcwotICogYWZ0ZXIgc2h1dGRvd24oKSBhbmQgc2hvdWxkIHRha2UgY2FyZSBub3QgdG8gbGVhayBtZW1vcnkgb3IgcmVzb3VyY2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlVGFza1NjYW5uZXIgewotCS8qKgotCSAqIERlZmF1bHQgbWFya2VyIHR5cGUgSUQgb2YgdGFzayBtYXJrZXJzIHRoYXQgYXJlIGNyZWF0ZWQuCi0JICovCi0JU3RyaW5nIFRBU0tfTUFSS0VSX0lEID0gU1NFQ29yZVBsdWdpbi5JRCArICIudGFzayI7IC8vJE5PTi1OTFMtMSQ7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0YXNrIG1hcmtlciB0eXBlIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQgZWFjaCB0aW1lIHRhc2tzIGFyZQotCSAqICAgICAgICAgcmVzY2FubmVkIGFuZCB1c2VkIGJ5IGRlZmF1bHQgd2hlbiBjcmVhdGluZyB0YXNrIG1hcmtlcnMuCi0JICogICAgICAgICBDaGlsZHJlbiBvZiB0aGlzIG1hcmtlciB0eXBlIHdpbGwgYmUgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5LgotCSAqLwotCVN0cmluZyBnZXRNYXJrZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyB0aGF0IHRoZSBsaXN0IG9mIGF1dG9tYXRpY2FsbHkgZGlzY292ZXJlZCB0YXNrcyBmb3IgdGhlIGdpdmVuCi0JICogZmlsZSBiZSB1cGRhdGVkLiBPbmNlIGNvbXBsZXRlZCwgdGhlIGxpc3Qgb2YgdGFza3Mgc2hvdWxkIGNvcnJlc3BvbmQKLQkgKiBleGFjdGx5IHRvIHRoZSBmaWxlJ3MgY29udGVudHMuCi0JICogCi0JICogQHBhcmFtIGZpbGUgLQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gYmUgc2Nhbm5lZAotCSAqIEBwYXJhbSB0YXNrVGFncyAtCi0JICogICAgICAgICAgICB0aGUgbGlzdCBvZiB0YXNrIHRhZ3MgZm9yIHdoaWNoIHRvIHNjYW4KLQkgKiBAcGFyYW0gbW9uaXRvciAtCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1hcHMgY29udGFpbmluZyB0aGUgYXR0cmlidXRlcyBvZiB0YXNrIG1hcmtlcnMgdG8KLQkgKiAgICAgICAgIGJlIGNyZWF0ZWQKLQkgKiAgICAgICAgIDxwPgotCSAqICAgICAgICAgVGhlIHJlc2VydmVkIGF0dHJpYnV0ZSBuYW1lCi0JICogICAgICAgICA8Yj5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50YXNrbWFya2VyPC9iPiBtYXkgYmUgdXNlZCB0bwotCSAqICAgICAgICAgc3BlY2lmeSBhIHR5cGUgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIHRhc2sgbWFya2VyLgotCSAqICAgICAgICAgPC9wPgotCSAqLwotCU1hcFtdIHNjYW4oSUZpbGUgZmlsZSwgVGFza1RhZ1tdIHRhc2tUYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIHNjYW5uZXIgdGhhdCBzY2FubmluZyBpcyBkb25lIGZvciBub3cuIFJlc291cmNlcyBoZWxkIGZyb20KLQkgKiBzdGFydHVwIHNob3VsZCBub3cgYmUgcmVsZWFzZWQuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgLQotCSAqICAgICAgICAgICAgdGhlIHByb2plY3QgdGhhdCB3YXMganVzdCBzY2FubmVkCi0JICovCi0Jdm9pZCBzaHV0ZG93bihJUHJvamVjdCBwcm9qZWN0KTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBzY2FubmVyIHRoYXQgYSBzZXF1ZW5jZSBvZiBzY2FucyBpcyBhYm91dCB0byBiZSByZXF1ZXN0ZWQuCi0JICogSWRlYWxseSB0aGUgdGltZSB0byBsb2FkIHByZWZlcmVuY2VzIGFuZCBwZXJmb3JtIGFueSBleHBlbnNpdmUKLQkgKiBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCAtCi0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB0aGF0IGlzIGFib3V0IHRvIGJlIHNjYW5uZWQKLQkgKiAKLQkgKi8KLQl2b2lkIHN0YXJ0dXAoSVByb2plY3QgcHJvamVjdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3Rhc2tzL1Rhc2tUYWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGFza3MvVGFza1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWI3MjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGFza3MvVGFza1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotCi0vKioKLSAqIFNpbXBsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWVzIHRoYXQgbWFrZSB1cCBhIFRhc2sgVGFnCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYXNrVGFnIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX0hJR0ggPSBJTWFya2VyLlBSSU9SSVRZX0hJR0g7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfTE9XID0gSU1hcmtlci5QUklPUklUWV9MT1c7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfTk9STUFMID0gSU1hcmtlci5QUklPUklUWV9OT1JNQUw7Ci0KLQkvKioKLQkgKiB0aGlzIHRhc2sgdGFnJ3MgcHJpb3JpdHkKLQkgKi8KLQlwcml2YXRlIGludCBmUHJpb3JpdHkgPSBQUklPUklUWV9OT1JNQUw7Ci0JCi0JLyoqCi0JICogdGhpcyB0YXNrIHRhZydzICJ0YWdnaW5nIiB0ZXh0Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZlRhZyA9IG51bGw7Ci0KLQlwdWJsaWMgVGFza1RhZyhTdHJpbmcgdGFnLCBpbnQgcHJpb3JpdHkpIHsKLQkJc3VwZXIoKTsKLQkJZlRhZyA9IHRhZzsKLQkJZlByaW9yaXR5ID0gcHJpb3JpdHk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKLQkJcmV0dXJuIGZQcmlvcml0eTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhZygpIHsKLQkJcmV0dXJuIGZUYWc7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFRhZygpICsgIjoiICsgZ2V0UHJpb3JpdHkoKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRiOWMwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL0ZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAoSW50YWxpbykgLSBidWcgMzAwNDM0IC0gTWFrZSBpbm5lciBjbGFzc2VzIHN0YXRpYyB3aGVyZSBwb3NzaWJsICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuSUZpbGVUYXNrU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2Nhbm5lckluZm8gewotCQlTdHJpbmcgZklkOwotCQlJRmlsZVRhc2tTY2FubmVyIGZTY2FubmVyOwotCi0JCVNjYW5uZXJJbmZvKFN0cmluZyBpZCwgSUZpbGVUYXNrU2Nhbm5lciBzY2FubmVyKSB7Ci0JCQlzdXBlcigpOwotCQkJZklkID0gaWQ7Ci0JCQlmU2Nhbm5lciA9IHNjYW5uZXI7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFNjYW5uZXJJbmZvICYmIGZJZC5lcXVhbHMoKChTY2FubmVySW5mbykgb2JqKS5mSWQpOwotCQl9Ci0KLQkJcHVibGljIElGaWxlVGFza1NjYW5uZXIgZ2V0U2Nhbm5lcigpIHsKLQkJCXJldHVybiBmU2Nhbm5lcjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyIF9pbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoX2luc3RhbmNlID09IG51bGwpIHsKLQkJCV9pbnN0YW5jZSA9IG5ldyBGaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlcigpOwotCQl9Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX0NPTlRFTlRfVFlQRVMgPSAiY29udGVudFR5cGVJZHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGZTY2FubmVyRWxlbWVudHM7Ci0KLQkvLyBhIG1hcHBpbmcgZnJvbSBjb250ZW50IHR5cGVzIHRvIFNjYW5uZXJJbmZvIGluc3RhbmNlcwotCXByaXZhdGUgTWFwIGZTY2FubmVySW5mb3MgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgTkFNRV9TQ0FOTkVSID0gInNjYW5uZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBTQ0FOTkVSX0VYVEVOU0lPTl9QT0lOVF9JRCA9IFNTRUNvcmVQbHVnaW4uSUQgKyAiLnRhc2tzY2FubmVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBGaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlJRmlsZVRhc2tTY2FubmVyW10gZ2V0RmlsZVRhc2tTY2FubmVycyhJQ29udGVudFR5cGVbXSBjb250ZW50VHlwZXMpIHsKLQkJaWYgKGZTY2FubmVyRWxlbWVudHMgPT0gbnVsbCkgewotCQkJcmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQotCQlMaXN0IHNjYW5uZXJJbmZvcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCVNjYW5uZXJJbmZvW10gc2Nhbm5lckluZm9zRm9yQ29udGVudFR5cGUgPSAoU2Nhbm5lckluZm9bXSkgZlNjYW5uZXJJbmZvcy5nZXQoY29udGVudFR5cGVzW2ldLmdldElkKCkpOwotCQkJaWYgKHNjYW5uZXJJbmZvc0ZvckNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCQlzY2FubmVySW5mb3NGb3JDb250ZW50VHlwZSA9IGxvYWRTY2FubmVycyhjb250ZW50VHlwZXNbaV0pOwotCQkJfQotCQkJLy8gb25seSBhZGQgbm9uLWR1cGxpY2F0ZSBzY2FubmVycwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzY2FubmVySW5mb3NGb3JDb250ZW50VHlwZS5sZW5ndGg7IGorKykgewotCQkJCWlmICghc2Nhbm5lckluZm9zLmNvbnRhaW5zKHNjYW5uZXJJbmZvc0ZvckNvbnRlbnRUeXBlW2pdKSkgewotCQkJCQlzY2FubmVySW5mb3MuYWRkKHNjYW5uZXJJbmZvc0ZvckNvbnRlbnRUeXBlW2pdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJSUZpbGVUYXNrU2Nhbm5lcltdIHNjYW5uZXJzID0gbmV3IElGaWxlVGFza1NjYW5uZXJbc2Nhbm5lckluZm9zLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2Nhbm5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCXNjYW5uZXJzW2ldID0gKChTY2FubmVySW5mbykgc2Nhbm5lckluZm9zLmdldChpKSkuZ2V0U2Nhbm5lcigpOwotCQl9Ci0JCXJldHVybiBzY2FubmVyczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ29udGVudFR5cGVJZHMoKSB7Ci0JCWlmIChmU2Nhbm5lckVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJlYWRSZWdpc3RyeSgpOwotCQl9Ci0KLQkJLy8gZmluZCB0aGUgcmVsZXZhbnQgZXh0ZW5zaW9ucwotCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gc2Nhbm5lckVsZW1lbnRzID0gZlNjYW5uZXJFbGVtZW50czsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBzY2FubmVyRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCWlmICghc2Nhbm5lckVsZW1lbnRzW2pdLmdldE5hbWUoKS5lcXVhbHMoTkFNRV9TQ0FOTkVSKSkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZ1tdIGNvbnRlbnRUeXBlSWRzID0gU3RyaW5nVXRpbHMudW5wYWNrKHNjYW5uZXJFbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoQVRUX0NPTlRFTlRfVFlQRVMpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudFR5cGVJZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIXR5cGVzLmNvbnRhaW5zKGNvbnRlbnRUeXBlSWRzW2ldKSkgewotCQkJCQl0eXBlcy5hZGQoY29udGVudFR5cGVJZHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAoU3RyaW5nW10pIHR5cGVzLnRvQXJyYXkobmV3IFN0cmluZ1t0eXBlcy5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIFNjYW5uZXJJbmZvW10gbG9hZFNjYW5uZXJzKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJU2Nhbm5lckluZm9bXSBzY2FubmVySW5mb3MgPSBudWxsOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBkZWxlZ2F0ZUVsZW1lbnRzID0gZlNjYW5uZXJFbGVtZW50czsKLQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGRlbGVnYXRlRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoIWRlbGVnYXRlRWxlbWVudHNbal0uZ2V0TmFtZSgpLmVxdWFscyhOQU1FX1NDQU5ORVIpKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHJpbmdbXSBzdXBwb3J0ZWRDb250ZW50VHlwZUlkcyA9IFN0cmluZ1V0aWxzLnVucGFjayhkZWxlZ2F0ZUVsZW1lbnRzW2pdLmdldEF0dHJpYnV0ZShBVFRfQ09OVEVOVF9UWVBFUykpOwotCQkJCUlDb250ZW50VHlwZVtdIHN1cHBvcnRlZENvbnRlbnRUeXBlcyA9IG5ldyBJQ29udGVudFR5cGVbc3VwcG9ydGVkQ29udGVudFR5cGVJZHMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IHN1cHBvcnRlZENvbnRlbnRUeXBlSWRzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCXN1cHBvcnRlZENvbnRlbnRUeXBlc1trXSA9IGNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZShzdXBwb3J0ZWRDb250ZW50VHlwZUlkc1trXS50cmltKCkpOwotCQkJCX0KLQkJCQlmb3IgKGludCBrID0gMDsgayA8IHN1cHBvcnRlZENvbnRlbnRUeXBlSWRzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCS8vIGFsbG93IHN1YnR5cGVzIHRvIGJlIHJldHVybmVkIGFzIHdlbGwKLQkJCQkJaWYgKHN1cHBvcnRlZENvbnRlbnRUeXBlc1trXSAhPSBudWxsICYmIGNvbnRlbnRUeXBlLmlzS2luZE9mKHN1cHBvcnRlZENvbnRlbnRUeXBlc1trXSkpIHsKLQkJCQkJCWVsZW1lbnRzLmFkZChkZWxlZ2F0ZUVsZW1lbnRzW2pdKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGluc3RhbnRpYXRlIGFuZCBzYXZlIHRoZSBzY2FubmVycwotCQkJTGlzdCBzY2FubmVySW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzLnNpemUoKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUZpbGVUYXNrU2Nhbm5lciBzY2FubmVyID0gKElGaWxlVGFza1NjYW5uZXIpICgoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBlbGVtZW50cy5nZXQoaSkpLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsKLQkJCQkJaWYgKHNjYW5uZXIgIT0gbnVsbCkgewotCQkJCQkJc2Nhbm5lckluZm9MaXN0LmFkZChuZXcgU2Nhbm5lckluZm8oKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGVsZW1lbnRzLmdldChpKSkuZ2V0QXR0cmlidXRlKEFUVF9JRCksIHNjYW5uZXIpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIk5vbi1mYXRhbCBleGNlcHRpb24gY3JlYXRpbmcgdGFzayBzY2FubmVyIGZvciAiICsgY29udGVudFR5cGUuZ2V0SWQoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlzY2FubmVySW5mb3MgPSAoU2Nhbm5lckluZm9bXSkgc2Nhbm5lckluZm9MaXN0LnRvQXJyYXkobmV3IFNjYW5uZXJJbmZvW3NjYW5uZXJJbmZvTGlzdC5zaXplKCldKTsKLQkJCWZTY2FubmVySW5mb3MucHV0KGNvbnRlbnRUeXBlLmdldElkKCksIHNjYW5uZXJJbmZvcyk7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTUkVHSVNUUlkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0ZWQgIiArIHNjYW5uZXJJbmZvcy5sZW5ndGggKyAiIHRhc2sgc2Nhbm5lciBmb3IgIiArIGNvbnRlbnRUeXBlLmdldElkKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2Nhbm5lckluZm9zOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCWZTY2FubmVySW5mb3MgPSBuZXcgSGFzaE1hcCgpOwotCQkvLyBKdXN0IHJlbWVtYmVyIHRoZSBlbGVtZW50cywgc28gcGx1Z2lucyBkb24ndCBoYXZlIHRvIGJlIGFjdGl2YXRlZCwKLQkJLy8gdW5sZXNzIGV4dGVuc2lvbiBhdHRyaWJ1dGVzIG1hdGNoIHRob3NlIG9mIGludGVyZXN0Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoU0NBTk5FUl9FWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJZlNjYW5uZXJFbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9TdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1N0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIyNzFiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1N0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzLklGaWxlVGFza1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzLlRhc2tUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotLyoqCi0gKiBBIGRlbGVnYXRlIHRvIGNyZWF0ZSBJTWFya2VyLlRBU0tzIGZvciAidG9kb3MiIGFuZCBzaW1pbGFyIGNvbW1lbnRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lciBpbXBsZW1lbnRzIElGaWxlVGFza1NjYW5uZXIsIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHsKLQkvLyB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgbmV3IHRhc2tzIGZvciB0aGUgY3VycmVudCBmaWxlCi0JcHJvdGVjdGVkIExpc3QgZk5ld01hcmtlckF0dHJpYnV0ZU1hcHMgPSBudWxsOwotCi0JTGlzdCBvbGRNYXJrZXJzID0gbnVsbDsKLQlwcml2YXRlIGxvbmcgdGltZTA7Ci0JcHJpdmF0ZSBTdHJpbmcgcnVudGltZU1hcmtlclR5cGU7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQkJZk5ld01hcmtlckF0dHJpYnV0ZU1hcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1MpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFuY2UgY3JlYXRlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGVzIHdpdGggd2hpY2ggYSBuZXdseSBjcmVhdGVkIG1hcmtlciB3aWxsIGJlCi0JICogaW5pdGlhbGl6ZWQuIE1vZGlmaWVkIGZyb20gdGhlIG1ldGhvZCBpbiBNYXJrZXJSdWxlckFjdGlvbgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluaXRpYWwgbWFya2VyIGF0dHJpYnV0ZXMKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGNyZWF0ZUluaXRpYWxNYXJrZXJBdHRyaWJ1dGVzKFN0cmluZyB0ZXh0LCBpbnQgZG9jdW1lbnRMaW5lLCBpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgsIGludCBwcmlvcml0eSkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKDYpOwotCQkvLyBtYXJrZXIgbGluZSBudW1iZXJzIGFyZSAxLWJhc2VkCi0JCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTElORV9OVU1CRVIsIG5ldyBJbnRlZ2VyKGRvY3VtZW50TGluZSArIDEpKTsKLQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5UQVNLLCBnZXRNYXJrZXJUeXBlKCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIG5ldyBJbnRlZ2VyKHN0YXJ0T2Zmc2V0KSk7Ci0JCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9FTkQsIG5ldyBJbnRlZ2VyKHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoKSk7Ci0JCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTUVTU0FHRSwgdGV4dCk7Ci0JCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuVVNFUl9FRElUQUJMRSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJc3dpdGNoIChwcmlvcml0eSkgewotCQkJY2FzZSBJTWFya2VyLlBSSU9SSVRZX0hJR0ggOiB7Ci0JCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5QUklPUklUWSwgbmV3IEludGVnZXIoSU1hcmtlci5QUklPUklUWV9ISUdIKSk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElNYXJrZXIuUFJJT1JJVFlfTE9XIDogewotCQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuUFJJT1JJVFksIG5ldyBJbnRlZ2VyKElNYXJrZXIuUFJJT1JJVFlfTE9XKSk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDogewotCQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuUFJJT1JJVFksIG5ldyBJbnRlZ2VyKElNYXJrZXIuUFJJT1JJVFlfTk9STUFMKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrcy5JRmlsZVRhc2tTY2FubmVyI2dldE1hcmtlclR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFya2VyVHlwZSgpIHsKLQkJaWYgKHJ1bnRpbWVNYXJrZXJUeXBlICE9IG51bGwpCi0JCQlyZXR1cm4gcnVudGltZU1hcmtlclR5cGU7Ci0KLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIuVEFTSzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBkZXRlY3RDaGFyc2V0KElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZpbGUuZ2V0Q2hhcnNldCh0cnVlKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0RW5jb2RpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcGFyYW0gZG9jdW1lbnRSZWdpb24KLQkgKiBAcGFyYW0gY29tbWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbmRUYXNrcyhJRG9jdW1lbnQgZG9jdW1lbnQsIFRhc2tUYWdbXSB0YXNrVGFncywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gY29tbWVudCkgewotCQlpZiAoaXNDb21tZW50UmVnaW9uKGRvY3VtZW50UmVnaW9uLCBjb21tZW50KSkgewotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tbWVudCk7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjb21tZW50KTsKLQkJCXRyeSB7Ci0JCQkJaW50IHN0YXJ0TGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydE9mZnNldCk7Ci0JCQkJaW50IGVuZExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZW5kT2Zmc2V0KTsKLQkJCQlmb3IgKGludCBsaW5lTnVtYmVyID0gc3RhcnRMaW5lOyBsaW5lTnVtYmVyIDw9IGVuZExpbmU7IGxpbmVOdW1iZXIrKykgewotCQkJCQlJUmVnaW9uIGxpbmUgPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24obGluZU51bWJlcik7Ci0JCQkJCWludCBiZWdpbiA9IE1hdGgubWF4KHN0YXJ0T2Zmc2V0LCBsaW5lLmdldE9mZnNldCgpKTsKLQkJCQkJaW50IGVuZCA9IE1hdGgubWluKGVuZE9mZnNldCwgbGluZS5nZXRPZmZzZXQoKSArIGxpbmUuZ2V0TGVuZ3RoKCkpOwotCQkJCQlpbnQgbGVuZ3RoID0gZW5kIC0gYmVnaW47Ci0KLQkJCQkJLyogWFhYOiBUaGlzIGdlbmVyYXRlcyBhIGxvdCBvZiBnYXJiYWdlIG9iamVjdHMgKi8KLQotCQkJCQlTdHJpbmcgY29tbWVudGVkVGV4dCA9IGdldENvbW1lbnRlZFRleHQoZG9jdW1lbnQsIGJlZ2luLCBsZW5ndGgpOwotCQkJCQlTdHJpbmcgY29tcGFyaXNvblRleHQgPSBjb21tZW50ZWRUZXh0LnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhc2tUYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpbnQgdGFnSW5kZXggPSBjb21wYXJpc29uVGV4dC5pbmRleE9mKHRhc2tUYWdzW2ldLmdldFRhZygpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSk7Ci0JCQkJCQlpZiAodGFnSW5kZXggPj0gMCkgewotCQkJCQkJCVN0cmluZyBtYXJrZXJEZXNjcmlwdGlvbiA9IGNvbW1lbnRlZFRleHQuc3Vic3RyaW5nKHRhZ0luZGV4KTsKLQkJCQkJCQlpbnQgbWFya2VyT2Zmc2V0ID0gYmVnaW4gKyB0YWdJbmRleDsKLQkJCQkJCQlpbnQgbWFya2VyTGVuZ3RoID0gZW5kIC0gbWFya2VyT2Zmc2V0OwotCQkJCQkJCWZOZXdNYXJrZXJBdHRyaWJ1dGVNYXBzLmFkZChjcmVhdGVJbml0aWFsTWFya2VyQXR0cmlidXRlcyhtYXJrZXJEZXNjcmlwdGlvbiwgbGluZU51bWJlciwgbWFya2VyT2Zmc2V0LCBtYXJrZXJMZW5ndGgsIHRhc2tUYWdzW2ldLmdldFByaW9yaXR5KCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaW5kVGFza3MoSUZpbGUgZmlsZSwgZmluYWwgVGFza1RhZ1tdIHRhc2tUYWdzLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IE1vZGVsSGFuZGxlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SGFuZGxlckZvcihmaWxlKTsKLQotCQkJLy8gcmVjb3JkcyBpZiB0aGUgb3B0aW1pemVkIHN0cmVhbWlzaCBwYXJzZSB3YXMgcG9zc2libGUKLQkJCWJvb2xlYW4gZGlkU3RyZWFtUGFyc2UgPSBmYWxzZTsKLQkJCWZpbmFsIElFbmNvZGVkRG9jdW1lbnQgZGVmYXVsdERvY3VtZW50ID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKGRlZmF1bHREb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gKChJU3RydWN0dXJlZERvY3VtZW50KSBkZWZhdWx0RG9jdW1lbnQpLmdldFBhcnNlcigpOwotCQkJCWlmIChwYXJzZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIHsKLQkJCQkJZGlkU3RyZWFtUGFyc2UgPSB0cnVlOwotCQkJCQlTdHJpbmcgY2hhcnNldCA9IGRldGVjdENoYXJzZXQoZmlsZSk7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciBkb2N1bWVudFBhcnNlciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIHBhcnNlcjsKLQkJCQkJZmluYWwgSURvY3VtZW50IHRleHREb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJCQlzZXREb2N1bWVudENvbnRlbnQodGV4dERvY3VtZW50LCBmaWxlLmdldENvbnRlbnRzKHRydWUpLCBjaGFyc2V0KTsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIHRleHREb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJCWRvY3VtZW50UGFyc2VyLnJlc2V0KG5ldyBEb2N1bWVudFJlYWRlcih0ZXh0RG9jdW1lbnQpKTsKLQkJCQkJZG9jdW1lbnRQYXJzZXIuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIG5vZGVQYXJzZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbikgewotCQkJCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVnaW9ucy5zaXplKCk7IGorKykgewotCQkJCQkJCQlJVGV4dFJlZ2lvbiBjb21tZW50ID0gcmVnaW9ucy5nZXQoaik7Ci0JCQkJCQkJCWZpbmRUYXNrcyh0ZXh0RG9jdW1lbnQsIHRhc2tUYWdzLCBkb2N1bWVudFJlZ2lvbiwgY29tbWVudCk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIGRpc2Nvbm5lY3QgdGhlIGRvY3VtZW50IHJlZ2lvbnMKLQkJCQkJCQlpZiAoZG9jdW1lbnRSZWdpb24uZ2V0UHJldmlvdXMoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCWRvY3VtZW50UmVnaW9uLmdldFByZXZpb3VzKCkuc2V0UHJldmlvdXMobnVsbCk7Ci0JCQkJCQkJCWRvY3VtZW50UmVnaW9uLmdldFByZXZpb3VzKCkuc2V0TmV4dChudWxsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQkJCXRleHREb2N1bWVudC5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCW1vbml0b3Iud29ya2VkKGRvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcmVzZXROb2RlcygpIHsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJCWRvY3VtZW50UGFyc2VyLmdldERvY3VtZW50UmVnaW9ucygpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZGlkU3RyZWFtUGFyc2UpIHsKLQkJCQkvLyBVc2UgYSBTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkJCQlJRW5jb2RlZERvY3VtZW50IGRvY3VtZW50ID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChmaWxlKTsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCXdoaWxlIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVnaW9ucy5zaXplKCk7IGorKykgewotCQkJCQkJCUlUZXh0UmVnaW9uIGNvbW1lbnQgPSByZWdpb25zLmdldChqKTsKLQkJCQkJCQlmaW5kVGFza3MoZG9jdW1lbnQsIHRhc2tUYWdzLCBkb2N1bWVudFJlZ2lvbiwgY29tbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCQltb25pdG9yLndvcmtlZChkb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQlkb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2l0aCAiICsgZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lciBlbmNvdW50ZXJlZCBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gcmVhZGluZyAiICsgZmlsZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIHdpdGggIiArIGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tbWVudGVkVGV4dChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBiZWdpbiwgaW50IGxlbmd0aCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRvY3VtZW50LmdldChiZWdpbiwgbGVuZ3RoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0NvbW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBNYXBbXSBzY2FuKElGaWxlIGZpbGUsIFRhc2tUYWdbXSB0YXNrVGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZOZXdNYXJrZXJBdHRyaWJ1dGVNYXBzLmNsZWFyKCk7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSB8fCAhc2hvdWxkU2NhbihmaWxlKSkgewotCQkJcmV0dXJuIG5ldyBNYXBbMF07Ci0JCX0KLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU1BFUkYpIHsKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJaWYgKHRhc2tUYWdzLmxlbmd0aCA+IDApIHsKLQkJCWZpbmRUYXNrcyhmaWxlLCB0YXNrVGFncywgbW9uaXRvcik7Ci0JCX0KLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU1BFUkYpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyBmb3IgIiArIGZpbGUuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiAoTWFwW10pIGZOZXdNYXJrZXJBdHRyaWJ1dGVNYXBzLnRvQXJyYXkobmV3IE1hcFtmTmV3TWFya2VyQXR0cmlidXRlTWFwcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkb2N1bWVudCBjb250ZW50IGZyb20gdGhpcyBzdHJlYW0gYW5kIGNsb3NlcyB0aGUgc3RyZWFtCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRDb250ZW50KElEb2N1bWVudCBkb2N1bWVudCwgSW5wdXRTdHJlYW0gY29udGVudFN0cmVhbSwgU3RyaW5nIGNoYXJzZXQpIHsKLQkJUmVhZGVyIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjb250ZW50U3RyZWFtLCBjaGFyc2V0KSwgMjA0OCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyMDQ4KTsKLQkJCWNoYXJbXSByZWFkQnVmZmVyID0gbmV3IGNoYXJbMjA0OF07Ci0JCQlpbnQgbiA9IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCW4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpOwotCQkJfQotCQkJZG9jdW1lbnQuc2V0KGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uI3NldEluaXRpYWxpemF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlydW50aW1lTWFya2VyVHlwZSA9IGRhdGEudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCWJvb2xlYW4gc2hvdWxkU2NhbihJUmVzb3VyY2UgcikgewotCQkvLyBza2lwICJkb3QiIGZpbGVzCi0JCVN0cmluZyBzID0gci5nZXROYW1lKCk7Ci0JCXJldHVybiBzLmxlbmd0aCgpID09IDAgfHwgcy5jaGFyQXQoMCkgIT0gJy4nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNodXRkb3duKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMgKyAiIHNodXRkb3duIGZvciAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydHVwKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMgKyAiIHN0YXJ0dXAgZm9yICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTUEVSRikgewotCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTUEVSRikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIGxvYWRpbmcgcHJlZnMgZm9yICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrU2Nhbm5pbmdKb2IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1NjYW5uaW5nSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZmRhNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrU2Nhbm5pbmdKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIChJbnRhbGlvKSAtIGJ1ZyAzMDA0NDMgLSBzb21lIGNvbnN0YW50cyBhcmVuJ3Qgc3RhdGljIGZpbmFsCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBRdWV1ZWluZyBKb2IgZm9yIHByb2Nlc3NpbmcgZGVsdGFzIGFuZCBwcm9qZWN0cy4KLSAqLwotY2xhc3MgVGFza1NjYW5uaW5nSm9iIGV4dGVuZHMgSm9iIHsKLQlzdGF0aWMgZmluYWwgaW50IEpPQl9ERUxBWV9ERUxUQSA9IDEwMDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpPQl9ERUxBWV9QUk9KRUNUID0gNTAwMDsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCA9ICJ0YXNrLXRhZy1wcm9qZWN0cy1hbHJlYWR5LXNjYW5uZWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBMaXN0IGZRdWV1ZSA9IG51bGw7Ci0KLQkvKiogc3ltYm9saWMgbmFtZSBmb3IgT1NHSSBmcmFtZXdvcmsgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NHSV9GUkFNRVdPUktfSUQgPSAib3JnLmVjbGlwc2Uub3NnaSI7IC8vJE5PTi1OTFMtMSQKLQotCVRhc2tTY2FubmluZ0pvYigpIHsKLQkJc3VwZXIoU1NFQ29yZU1lc3NhZ2VzLlRhc2tTY2FubmVyXzApOwotCQlmUXVldWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXNldFByaW9yaXR5KEpvYi5ERUNPUkFURSk7Ci0JCXNldFN5c3RlbSh0cnVlKTsKLQkJc2V0VXNlcihmYWxzZSk7Ci0KLQkJU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KFRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgYWRkUHJvamVjdERlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCUlSZXNvdXJjZSBwcm9qZWN0UmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCi0JCWlmIChwcm9qZWN0UmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQlpZiAoaXNFbmFibGVkT25Qcm9qZWN0KChJUHJvamVjdCkgcHJvamVjdFJlc291cmNlKSkgewotCQkJCWZRdWV1ZS5hZGQoZGVsdGEpOwotCQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1NKT0IpIHsKLQkJCQkJU3RyaW5nIGtpbmQgPSBudWxsOwotCQkJCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6Ci0JCQkJCQkJa2luZCA9ICIgW0lSZXNvdXJjZURlbHRhLkFEREVEXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6Ci0JCQkJCQkJa2luZCA9ICIgW0lSZXNvdXJjZURlbHRhLkNIQU5HRURdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKLQkJCQkJCQlraW5kID0gIiBbSVJlc291cmNlRGVsdGEuUkVNT1ZFRF0iOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEX1BIQU5UT00gOgotCQkJCQkJCWtpbmQgPSAiIFtJUmVzb3VyY2VEZWx0YS5BRERFRF9QSEFOVE9NXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRF9QSEFOVE9NIDoKLQkJCQkJCQlraW5kID0gIiBbSVJlc291cmNlRGVsdGEuUkVNT1ZFRF9QSEFOVE9NXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBkZWx0YSAiICsgZGVsdGEuZ2V0RnVsbFBhdGgoKSArIGtpbmQpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXNjaGVkdWxlKEpPQl9ERUxBWV9ERUxUQSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCBhZGRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3RIYXNOb3RCZWVuRnVsbHlTY2FubmVkKHByb2plY3QpKSB7Ci0JCQlmUXVldWUuYWRkKHByb2plY3QpOwotCQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU0pPQikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc2NoZWR1bGUoSk9CX0RFTEFZX1BST0pFQ1QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBjaGVjayB0byBzZWUgaWYgdGhlIE9TR0kgZnJhbWV3b3JrIGlzIHNodXR0aW5nIGRvd24uCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBTeXN0ZW0gQnVuZGxlIGlzIHN0b3BwZWQgKGllLiB0aGUgZnJhbWV3b3JrIGlzCi0JICogICAgICAgICBzaHV0dGluZyBkb3duKQotCSAqLwotCWJvb2xlYW4gZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSB7Ci0JCS8vIGluIHRoZSBGcmFtZXdvcmsgY2xhc3MgdGhlcmUncyBhIG5vdGU6Ci0JCS8vIHNldCB0aGUgc3RhdGUgb2YgdGhlIFN5c3RlbSBCdW5kbGUgdG8gU1RPUFBJTkcuCi0JCS8vIHRoaXMgbXVzdCBiZSBkb25lIGZpcnN0IGFjY29yZGluZyB0byBzZWN0aW9uIDQuMTkuMiBmcm9tIHRoZSBPU0dpCi0JCS8vIFIzIHNwZWMuCi0JCWJvb2xlYW4gc2h1dHRpbmdEb3duID0gIVBsYXRmb3JtLmlzUnVubmluZygpIHx8IFBsYXRmb3JtLmdldEJ1bmRsZShPU0dJX0ZSQU1FV09SS19JRCkuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuU1RPUFBJTkc7Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NKT0IgJiYgc2h1dHRpbmdEb3duKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRhc2tTY2FubmluZ0pvYjogc3lzdGVtIGlzIHNodXR0aW5nIGRvd24hIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc2h1dHRpbmdEb3duOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkT25Qcm9qZWN0KElQcm9qZWN0IHApIHsKLQkJSVByZWZlcmVuY2VzU2VydmljZSBwcmVmZXJlbmNlc1NlcnZpY2UgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKTsKLQkJSVNjb3BlQ29udGV4dFtdIGxvb2t1cE9yZGVyID0gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgUHJvamVjdFNjb3BlKHApLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQlyZXR1cm4gcHJlZmVyZW5jZXNTZXJ2aWNlLmdldEJvb2xlYW4oVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUsIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUsIGZhbHNlLCBsb29rdXBPcmRlcik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHByb2plY3RIYXNOb3RCZWVuRnVsbHlTY2FubmVkKElSZXNvdXJjZSBwcm9qZWN0KSB7Ci0JCVN0cmluZ1tdIHByb2plY3RzU2Nhbm5lZCA9IFN0cmluZ1V0aWxzLnVucGFjayhTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhUQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQpKTsKLQotCQlib29sZWFuIHNob3VsZFNjYW4gPSB0cnVlOwotCQlTdHJpbmcgbmFtZSA9IHByb2plY3QuZ2V0TmFtZSgpOwotCQlmb3IgKGludCBqID0gMDsgc2hvdWxkU2NhbiAmJiBqIDwgcHJvamVjdHNTY2FubmVkLmxlbmd0aDsgaisrKSB7Ci0JCQlpZiAocHJvamVjdHNTY2FubmVkW2pdLmVxdWFscyhuYW1lKSkgewotCQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1NKT0IpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2Nhbm5pbmcgSm9iIHNraXBwaW5nICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzaG91bGRTY2FuID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNob3VsZFNjYW47Ci0JfQotCi0Jc3luY2hyb25pemVkIExpc3QgcmV0cmlldmVRdWV1ZSgpIHsKLQkJTGlzdCBxdWV1ZSA9IGZRdWV1ZTsKLQkJZlF1ZXVlID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gcXVldWU7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkKLQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQotCQljbGVhbnVwUmVtZW1iZXJlZFByb2plY3RMaXN0KFRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCk7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlMaXN0IGN1cnJlbnRRdWV1ZSA9IHJldHJpZXZlUXVldWUoKTsKLQkJCi0JCXRyeSB7Ci0JCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldFByaW9yaXR5KFRocmVhZC5NSU5fUFJJT1JJVFkpOwotCQl9Ci0JCWNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBub3QgYSBjcml0aWNhbCBwcm9ibGVtCi0JCX0KLQkJCi0JCUxpc3QgZXJyb3JzID0gbnVsbDsKLQkJaW50IHRpY2tzID0gY3VycmVudFF1ZXVlLnNpemUoKTsKLQkJU3RyaW5nIHRhc2tOYW1lID0gbnVsbDsKLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU0pPQikgewotCQkJdGFza05hbWUgPSBTU0VDb3JlTWVzc2FnZXMuVGFza1NjYW5uaW5nSm9iXzAgKyAiICgiICsgdGlja3MgKyAiIHdvcmsgaXRlbXMpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQl0YXNrTmFtZSA9IFNTRUNvcmVNZXNzYWdlcy5UYXNrU2Nhbm5pbmdKb2JfMDsKLQkJfQotCQltb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgdGlja3MpOwotCi0JCUlQcm9ncmVzc01vbml0b3Igc2Nhbk1vbml0b3IgPSBudWxsOwotCQl3aGlsZSAoIWN1cnJlbnRRdWV1ZS5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBvID0gY3VycmVudFF1ZXVlLnJlbW92ZSgwKTsKLQkJCWlmIChmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpIHx8IG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCXRyeSB7Ci0JCQkJc2Nhbk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSyk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBJUmVzb3VyY2VEZWx0YSkgewotCQkJCQlXb3Jrc3BhY2VUYXNrU2Nhbm5lci5nZXRJbnN0YW5jZSgpLnNjYW4oKElSZXNvdXJjZURlbHRhKSBvLCBzY2FuTW9uaXRvcik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQlXb3Jrc3BhY2VUYXNrU2Nhbm5lci5nZXRJbnN0YW5jZSgpLnNjYW4oKElQcm9qZWN0KSBvLCBzY2FuTW9uaXRvcik7Ci0JCQkJCWlmKCFzY2FuTW9uaXRvci5pc0NhbmNlbGVkKCkgKSB7Ci0JCQkJCQlTdHJpbmdbXSBwcm9qZWN0c1ByZXZpb3VzbHlTY2FubmVkID0gU3RyaW5nVXRpbHMudW5wYWNrKFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCkpOwotCQkJCQkJU3RyaW5nW10gdXBkYXRlZFByb2plY3RzID0gbmV3IFN0cmluZ1twcm9qZWN0c1ByZXZpb3VzbHlTY2FubmVkLmxlbmd0aCArIDFdOwotCQkJCQkJdXBkYXRlZFByb2plY3RzW3Byb2plY3RzUHJldmlvdXNseVNjYW5uZWQubGVuZ3RoXSA9ICgoSVJlc291cmNlKSBvKS5nZXROYW1lKCk7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb2plY3RzUHJldmlvdXNseVNjYW5uZWQsIDAsIHVwZGF0ZWRQcm9qZWN0cywgMCwgcHJvamVjdHNQcmV2aW91c2x5U2Nhbm5lZC5sZW5ndGgpOwotCQkJCQkJU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShUQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQsIFN0cmluZ1V0aWxzLnBhY2sodXBkYXRlZFByb2plY3RzKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZXJyb3JzID09IG51bGwpIHsKLQkJCQkJZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCX0KLQkJCQllcnJvcnMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFQ29yZVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCi0JCWlmIChlcnJvcnMgPT0gbnVsbCB8fCBlcnJvcnMuaXNFbXB0eSgpKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGVycm9ycy5zaXplKCkgPT0gMSkgewotCQkJCXN0YXR1cyA9IChJU3RhdHVzKSBlcnJvcnMuZ2V0KDApOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVN0YXR1c1tdIHN0YXRpaSA9IChJU3RhdHVzW10pIGVycm9ycy50b0FycmF5KG5ldyBJU3RhdHVzW2Vycm9ycy5zaXplKCldKTsKLQkJCQlzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoU1NFQ29yZVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgc3RhdGlpLCBTU0VDb3JlTWVzc2FnZXMuVGFza1NjYW5uaW5nSm9iXzEsIG51bGwpOwotCQkJfQotCQl9Ci0KLQkJU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBSZW1lbWJlcmVkUHJvamVjdExpc3QoU3RyaW5nIHByZWZlcmVuY2VOYW1lKSB7Ci0JCVN0cmluZ1tdIHJlbWVtYmVyZWRQcm9qZWN0TmFtZXMgPSBTdHJpbmdVdGlscy51bnBhY2soU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcocHJlZmVyZW5jZU5hbWUpKTsKLQkJSVJlc291cmNlW10gd29ya3NwYWNlUHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCVN0cmluZ1tdIHByb2plY3ROYW1lcyA9IG5ldyBTdHJpbmdbd29ya3NwYWNlUHJvamVjdHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0TmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCXByb2plY3ROYW1lc1tpXSA9IHdvcmtzcGFjZVByb2plY3RzW2ldLmdldE5hbWUoKTsKLQkJfQotCi0JCUxpc3QgcHJvamVjdE5hbWVzVG9SZW1lbWJlciA9IG5ldyBBcnJheUxpc3QocmVtZW1iZXJlZFByb2plY3ROYW1lcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbWVtYmVyZWRQcm9qZWN0TmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVtZW1iZXJlZFByb2plY3RFeGlzdHMgPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyAhcmVtZW1iZXJlZFByb2plY3RFeGlzdHMgJiYgaiA8IHByb2plY3ROYW1lcy5sZW5ndGg7IGorKykgewotCQkJCWlmIChyZW1lbWJlcmVkUHJvamVjdE5hbWVzW2ldLmVxdWFscyhwcm9qZWN0TmFtZXNbal0pKSB7Ci0JCQkJCXJlbWVtYmVyZWRQcm9qZWN0RXhpc3RzID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVtZW1iZXJlZFByb2plY3RFeGlzdHMpIHsKLQkJCQlwcm9qZWN0TmFtZXNUb1JlbWVtYmVyLmFkZChyZW1lbWJlcmVkUHJvamVjdE5hbWVzW2ldKTsKLQkJCX0KLQkJCWVsc2UgaWYgKExvZ2dlci5ERUJVR19UQVNLU0pPQikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVtb3ZpbmcgIiArIHJlbWVtYmVyZWRQcm9qZWN0TmFtZXNbaV0gKyAiIHJlbW92ZWQgZnJvbSAiICsgcHJlZmVyZW5jZU5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9qZWN0TmFtZXNUb1JlbWVtYmVyLnNpemUoKSAhPSByZW1lbWJlcmVkUHJvamVjdE5hbWVzLmxlbmd0aCkgewotCQkJU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShwcmVmZXJlbmNlTmFtZSwgU3RyaW5nVXRpbHMucGFjaygoU3RyaW5nW10pIHByb2plY3ROYW1lc1RvUmVtZW1iZXIudG9BcnJheShuZXcgU3RyaW5nW3Byb2plY3ROYW1lc1RvUmVtZW1iZXIuc2l6ZSgpXSkpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1NjYW5uaW5nU2NoZWR1bGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1Rhc2tTY2FubmluZ1NjaGVkdWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDk1YTZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1NjYW5uaW5nU2NoZWR1bGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotcHVibGljIGNsYXNzIFRhc2tTY2FubmluZ1NjaGVkdWxlciB7Ci0JY2xhc3MgTGlzdGVuZXJWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhLmdldFJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCWludCByZXNvdXJjZVR5cGUgPSBkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKTsKLQkJCQlpZiAocmVzb3VyY2VUeXBlID09IElSZXNvdXJjZS5QUk9KRUNUIHx8IHJlc291cmNlVHlwZSA9PSBJUmVzb3VyY2UuUk9PVCkgewotCQkJCQl0cnkgewotCQkJCQkJZGVsdGEuYWNjZXB0KHRoaXMpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiBoYW5kbGluZyByZXNvdXJjZSBjaGFuZ2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuTUFSS0VSUykgPiAwIHx8IChkZWx0YS5nZXRLaW5kKCkgJiBJUmVzb3VyY2VEZWx0YS5FTkNPRElORykgPiAwIHx8IChkZWx0YS5nZXRLaW5kKCkgJiBJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UpID4gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlJPT1QpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJCQlmSm9iLmFkZFByb2plY3REZWx0YShkZWx0YSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIFRhc2tTY2FubmluZ1NjaGVkdWxlciBzY2hlZHVsZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShUYXNrU2Nhbm5pbmdKb2IuVEFTS19UQUdfUFJPSkVDVFNfQUxSRUFEWV9TQ0FOTkVELCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJc2NoZWR1bGVyLmVucXVldWUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2goSVByb2plY3QgcHJvamVjdCkgewotCQlTdHJpbmdbXSBwcm9qZWN0TmFtZXMgPSBTdHJpbmdVdGlscy51bnBhY2soU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoVGFza1NjYW5uaW5nSm9iLlRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCkpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgZnJlc2hQcm9qZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0TmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghcHJvamVjdE5hbWVzW2ldLmVxdWFscyhwcm9qZWN0LmdldE5hbWUoKSkpIHsKLQkJCQlmcmVzaFByb2plY3RMaXN0LmFkZChwcm9qZWN0TmFtZXNbaV0pOwotCQkJfQotCQl9Ci0JCVN0cmluZyBmcmVzaFByb2plY3RzID0gU3RyaW5nVXRpbHMucGFjaygoU3RyaW5nW10pIGZyZXNoUHJvamVjdExpc3QudG9BcnJheShuZXcgU3RyaW5nW2ZyZXNoUHJvamVjdExpc3Quc2l6ZSgpXSkpOwotCQlTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFRhc2tTY2FubmluZ0pvYi5UQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQsIGZyZXNoUHJvamVjdHMpOyAvLyROT04tTkxTLTEkCi0KLQkJc2NoZWR1bGVyLmVucXVldWUocHJvamVjdCk7Ci0JfQotCi0KLQkvKioKLQkgKiBPbmx5IGZvciB1c2UgYnkgU1NFQ29yZVBsdWdpbiBjbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJaWYgKHNjaGVkdWxlciAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihzY2hlZHVsZXIudmlzaXRvcik7Ci0JCQlzY2hlZHVsZXIuZkpvYi5jYW5jZWwoKTsKLQkJCXRyeSB7Ci0JCQkJc2NoZWR1bGVyLmZKb2Iuam9pbigpOwotCQkJfQotCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogT25seSBmb3IgdXNlIGJ5IFNTRVVJUGx1Z2luIGNsYXNzLCBVSSBieSBuYXR1cmUgb2YgaXRzIG91dHB1dCBiZWluZyBtZWFudCBmb3IgdGhlIHVzZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnR1cCgpIHsKLQkJc2NoZWR1bGVyID0gbmV3IFRhc2tTY2FubmluZ1NjaGVkdWxlcigpOwotCi0JCS8qCi0JCSAqIEFjY29yZGluZyB0bwotCQkgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2UvZGV2ZWxvcG1lbnQvcGVyZm9ybWFuY2UvYmxvb3BlcnMuaHRtbCwKLQkJICogUE9TVF9DSEFOR0UgbGlzdGVuZXJzIGFkZCBhIHRyaXZpYWwgcGVyZm9ybWFuY2UgY29zdC4KLQkJICogCi0JCSAqIEFsd2F5cyBhZGQgbGlzdGVuZXIgc2luY2Ugd2UgbWlnaHQgYmUgZW5hYmxlZCBwZXItcHJvamVjdCBldmVuIGlmIGRpc2FibGVkIHdvcmtzcGFjZS13aWRlLgotCQkgKi8KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoc2NoZWR1bGVyLnZpc2l0b3IsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQotCQlzY2hlZHVsZXIuZW5xdWV1ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQl9Ci0KLQlUYXNrU2Nhbm5pbmdKb2IgZkpvYiA9IG51bGw7Ci0KLQlMaXN0ZW5lclZpc2l0b3IgdmlzaXRvciA9IG51bGw7Ci0KLQlwcml2YXRlIFRhc2tTY2FubmluZ1NjaGVkdWxlcigpIHsKLQkJc3VwZXIoKTsKLQkJZkpvYiA9IG5ldyBUYXNrU2Nhbm5pbmdKb2IoKTsKLQkJdmlzaXRvciA9IG5ldyBMaXN0ZW5lclZpc2l0b3IoKTsKLQl9Ci0KLQl2b2lkIGVucXVldWUoSVByb2plY3QgcHJvamVjdCkgewotCQlmSm9iLmFkZFByb2plY3QocHJvamVjdCk7Ci0JfQotCi0Jdm9pZCBlbnF1ZXVlKElXb3Jrc3BhY2VSb290IHJvb3QpIHsKLQkJSVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IHJvb3QuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJZkpvYi5hZGRQcm9qZWN0KGFsbFByb2plY3RzW2ldKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1RhZ1ByZWZlcmVuY2VLZXlzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1Rhc2tUYWdQcmVmZXJlbmNlS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjNlMzA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1RhZ1ByZWZlcmVuY2VLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIFRhc2tUYWdQcmVmZXJlbmNlS2V5cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQgPSAiaWdub3JlZC1jb250ZW50VHlwZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUdfRU5BQkxFID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUdfTk9ERSA9IFNTRUNvcmVQbHVnaW4uSUQgKyBJUGF0aC5TRVBBUkFUT1IgKyAidGFzay10YWdzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfVEFHX1BFUl9QUk9KRUNUID0gInVzZS1wcm9qZWN0LXNldHRpbmdzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfVEFHX1BSSU9SSVRJRVMgPSAidGFza1ByaW9yaXRpZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUdfVEFHUyA9ICJ0YXNrVGFncyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvV29ya3NwYWNlVGFza1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvV29ya3NwYWNlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzZmZhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1dvcmtzcGFjZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAoSW50YWxpbykgLSBidWcgMzAwNDQzIC0gc29tZSBjb25zdGFudHMgYXJlbid0IHN0YXRpYyBmaW5hbAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuSUZpbGVUYXNrU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuVGFza1RhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLS8qKgotICogRGlzcGF0Y2hlciBmb3Igc2Nhbm5pbmcgYmFzZWQgb24gZGVsdGFzIGFuZCByZXF1ZXN0ZWQgcHJvamVjdHMKLSAqLwotY2xhc3MgV29ya3NwYWNlVGFza1NjYW5uZXIgewotCXByaXZhdGUgc3RhdGljIFdvcmtzcGFjZVRhc2tTY2FubmVyIF9pbnN0YW5jZSA9IG51bGw7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBTWU5USEVUSUNfVEFTSyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnRhc2stc3ludGhldGljIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGSUNBVElPTl9TVEFNUCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLm1vZGlmaWNhdGlvbi1zdGFtcCI7Ci0JcHJpdmF0ZSBib29sZWFuIHByb2NlZWQgPSBmYWxzZTsKLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgV29ya3NwYWNlVGFza1NjYW5uZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChfaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJX2luc3RhbmNlID0gbmV3IFdvcmtzcGFjZVRhc2tTY2FubmVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTUFSS0VSX1RZUEUgPSBJRmlsZVRhc2tTY2FubmVyLlRBU0tfTUFSS0VSX0lEOwotCXByaXZhdGUgTGlzdCBmQWN0aXZlU2Nhbm5lcnMgPSBudWxsOwotCXByaXZhdGUgSUNvbnRlbnRUeXBlW10gZkN1cnJlbnRJZ25vcmVDb250ZW50VHlwZXMgPSBudWxsOwotCXByaXZhdGUgVGFza1RhZ1tdIGZDdXJyZW50VGFza1RhZ3MgPSBudWxsOwotCi0JcHJpdmF0ZSBGaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlciByZWdpc3RyeSA9IG51bGw7Ci0KLQlwcml2YXRlIGxvbmcgdGltZTA7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFdvcmtzcGFjZVRhc2tTY2FubmVyKCkgewotCQlzdXBlcigpOwotCQlyZWdpc3RyeSA9IEZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyLmdldEluc3RhbmNlKCk7Ci0JCWZBY3RpdmVTY2FubmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZkN1cnJlbnRUYXNrVGFncyA9IG5ldyBUYXNrVGFnWzBdOwotCQlmQ3VycmVudElnbm9yZUNvbnRlbnRUeXBlcyA9IG5ldyBJQ29udGVudFR5cGVbMF07Ci0JfQotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBkZXRlY3RDb250ZW50VHlwZXMoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUlDb250ZW50VHlwZVtdIHR5cGVzID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQlpZiAodHlwZXMubGVuZ3RoID09IDApIHsKLQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCS8vIG9wdGltaXplZCBkZXNjcmlwdGlvbiBsb29rdXAsIG1pZ2h0IG5vdCBzdWNjZWVkCi0JCQkJCWQgPSAoKElGaWxlKSByZXNvdXJjZSkuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQkJCXR5cGVzID0gbmV3IElDb250ZW50VHlwZVtde2QuZ2V0Q29udGVudFR5cGUoKX07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvKgotCQkJCQkgKiBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGdpdmVuIHRoZSBhY2Nlc3NpYmxlIGFuZCBmaWxlCi0JCQkJCSAqIHR5cGUgY2hlY2sgYWJvdmUKLQkJCQkJICovCi0JCQkJfQotCQkJfQotCQkJaWYgKHR5cGVzID09IG51bGwpIHsKLQkJCQl0eXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZXNGb3IocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1NDT05URU5UVFlQRSkgewotCQkJCWlmICh0eXBlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCWlmICh0eXBlcy5sZW5ndGggPiAxKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSArICI6ICIgKyAibXVsdGlwbGUgYmFzZWQgb24gbmFtZSAocHJvYmFibHkgaGllcmFyY2hpY2FsKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSArICIgbWF0Y2hlZDogIiArIHR5cGVzW2ldLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJfQotCQllbHNlIHsKLQkJCXByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluaXQoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHJlc291cmNlKTsKLQotCQlJUHJlZmVyZW5jZXNTZXJ2aWNlIHByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCQlJU2NvcGVDb250ZXh0W10gbG9va3VwT3JkZXIgPSBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBQcm9qZWN0U2NvcGUocHJvamVjdCksIG5ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0KLQkJYm9vbGVhbiBwcm9jZWVkID0gcHJlZmVyZW5jZXNTZXJ2aWNlLmdldEJvb2xlYW4oVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUsIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUsIGZhbHNlLCBsb29rdXBPcmRlcik7Ci0KLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU1BSRUZTKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNjYW4gb2YgIiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkgKyAiOiIgKyBwcm9jZWVkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlpZiAocHJvY2VlZCkgewotCQkJU3RyaW5nW10gdGFncyA9IFN0cmluZ1V0aWxzLnVucGFjayhwcmVmZXJlbmNlc1NlcnZpY2UuZ2V0U3RyaW5nKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFLCBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUywgbnVsbCwgbG9va3VwT3JkZXIpKTsKLQkJCVN0cmluZ1tdIHByaW9yaXRpZXMgPSBTdHJpbmdVdGlscy51bnBhY2socHJlZmVyZW5jZXNTZXJ2aWNlLmdldFN0cmluZyhUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSwgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMsIG51bGwsIGxvb2t1cE9yZGVyKSk7Ci0JCQlTdHJpbmdbXSBjdXJyZW50SWdub3JlQ29udGVudFR5cGVJRHMgPSBTdHJpbmdVdGlscy51bnBhY2socHJlZmVyZW5jZXNTZXJ2aWNlLmdldFN0cmluZyhUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSwgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0NPTlRFTlRUWVBFU19JR05PUkVELCBudWxsLCBsb29rdXBPcmRlcikpOwotCQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU1BSRUZTKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludChnZXRDbGFzcygpLmdldE5hbWUoKSArICIgdGFnczogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlTeXN0ZW0ub3V0LnByaW50KHRhZ3NbaV0pOwotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBwcmlvcml0aWVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJpb3JpdGllcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnQocHJpb3JpdGllc1tpXSk7Ci0JCQkJfQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJCVN5c3RlbS5vdXQucHJpbnQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGlnbm9yZWQgY29udGVudCB0eXBlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRJZ25vcmVDb250ZW50VHlwZUlEcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnQoY3VycmVudElnbm9yZUNvbnRlbnRUeXBlSURzW2ldKTsKLQkJCQl9Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQlmQ3VycmVudElnbm9yZUNvbnRlbnRUeXBlcyA9IG5ldyBJQ29udGVudFR5cGVbY3VycmVudElnbm9yZUNvbnRlbnRUeXBlSURzLmxlbmd0aF07Ci0JCQlJQ29udGVudFR5cGVNYW5hZ2VyIGNvbnRlbnRUeXBlTWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50SWdub3JlQ29udGVudFR5cGVJRHMubGVuZ3RoOyBpKyspIHsKLQkJCQlmQ3VycmVudElnbm9yZUNvbnRlbnRUeXBlc1tpXSA9IGNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZShjdXJyZW50SWdub3JlQ29udGVudFR5cGVJRHNbaV0pOwotCQkJfQotCQkJaW50IG1heCA9IE1hdGgubWluKHRhZ3MubGVuZ3RoLCBwcmlvcml0aWVzLmxlbmd0aCk7Ci0JCQlmQ3VycmVudFRhc2tUYWdzID0gbmV3IFRhc2tUYWdbbWF4XTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlpbnQgcHJpb3JpdHkgPSBUYXNrVGFnLlBSSU9SSVRZX05PUk1BTDsKLQkJCQl0cnkgewotCQkJCQlwcmlvcml0eSA9IEludGVnZXIucGFyc2VJbnQocHJpb3JpdGllc1tpXSk7Ci0JCQkJfQotCQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBkZWZhdWx0IHRvIG5vcm1hbCBwcmlvcml0eQotCQkJCX0KLQkJCQlmQ3VycmVudFRhc2tUYWdzW2ldID0gbmV3IFRhc2tUYWcodGFnc1tpXSwgcHJpb3JpdHkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9jZWVkOwotCX0KLQotCXZvaWQgaW50ZXJuYWxTY2FuKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBzY2FuTW9uaXRvcikgewotCQlpZiAoc2Nhbk1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0JCQlpZiAocmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgJiYgIXJlc291cmNlLmlzRGVyaXZlZCgpICYmICFyZXNvdXJjZS5pc1BoYW50b20oKSAmJiAhcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpICYmIG5hbWUubGVuZ3RoKCkgIT0gMCAmJiBuYW1lLmNoYXJBdCgwKSAhPSAnLicpIHsKLQkJCQlpZiAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpID4gMCB8fCAocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLlBST0pFQ1QpID4gMCkgewotCQkJCQlJUmVzb3VyY2VbXSBjaGlsZHJlbiA9ICgoSUNvbnRhaW5lcikgcmVzb3VyY2UpLm1lbWJlcnMoKTsKLQkJCQkJc2Nhbk1vbml0b3IuYmVnaW5UYXNrKCIiLCBjaGlsZHJlbi5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWludGVybmFsU2Nhbihwcm9qZWN0LCBjaGlsZHJlbltpXSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihzY2FuTW9uaXRvciwgMSwgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKSk7Ci0JCQkJCX0KLQkJCQkJc2Nhbk1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCQllbHNlIGlmICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLkZJTEUpID4gMCkgewotCQkJCQlzY2FuRmlsZShwcm9qZWN0LCBmQ3VycmVudFRhc2tUYWdzLCAoSUZpbGUpIHJlc291cmNlLCBzY2FuTW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGludGVybmFsU2NhbihJUmVzb3VyY2VEZWx0YSBkZWx0YSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCVN0cmluZyBuYW1lID0gZGVsdGEuZ2V0RnVsbFBhdGgoKS5sYXN0U2VnbWVudCgpOwotCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmICghcmVzb3VyY2UuaXNEZXJpdmVkKCkgJiYgIXJlc291cmNlLmlzUGhhbnRvbSgpICYmICFyZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgJiYgbmFtZS5sZW5ndGgoKSAhPSAwICYmIG5hbWUuY2hhckF0KDApICE9ICcuJykgewotCQkJCWlmICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLkZPTERFUikgPiAwIHx8IChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPiAwKSB7Ci0JCQkJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBjaGlsZHJlbi5sZW5ndGgpOwotCQkJCQlpZiAobmFtZS5sZW5ndGgoKSAhPSAwICYmIG5hbWUuY2hhckF0KDApICE9ICcuJyAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKSB7Ci0JCQkJCQlmb3IgKGludCBpID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJCQlpbnRlcm5hbFNjYW4oY2hpbGRyZW5baV0sIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSwgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuRklMRSkgPiAwKSB7Ci0JCQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuQURERUQpID4gMCB8fCAoKGRlbHRhLmdldEtpbmQoKSAmIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpID4gMCAmJiAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpID4gMCkpIHsKLQkJCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOwotCQkJCQkJc2NhbkZpbGUoZmlsZS5nZXRQcm9qZWN0KCksIGZDdXJyZW50VGFza1RhZ3MsIGZpbGUsIG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXBsYWNlVGFza01hcmtlcnMoZmluYWwgSUZpbGUgZmlsZSwgZmluYWwgU3RyaW5nW10gbWFya2VyVHlwZXMsIGZpbmFsIE1hcCBtYXJrZXJBdHRyaWJ1dGVNYXBzW10sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBJRmlsZSBmaW5hbEZpbGUgPSBmaWxlOwotCQlpZiAoZmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJdHJ5IHsKLQkJCQlJV29ya3NwYWNlUnVubmFibGUgciA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygiIiwgMik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIERlbGV0ZSBvbGQgVGFzayBtYXJrZXJzIChkb24ndCBkZWxldGUgcmVndWxhcgotCQkJCQkJCSAqIFRhc2tzIHNpbmNlIHRoYXQgaW5jbHVkZXMgdXNlci1kZWZpbmVkIG9uZXMpCi0JCQkJCQkJICovCi0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlpZiAoSU1hcmtlci5UQVNLLmVxdWFscyhtYXJrZXJUeXBlc1tpXSkpIHsKLQkJCQkJCQkJCS8vIG9ubHkgcmVtb3ZlIGlmIHN5bnRoZXRpYwotCQkJCQkJCQkJSU1hcmtlcltdIGZvdW5kTWFya2VycyA9IGZpbGUuZmluZE1hcmtlcnMobWFya2VyVHlwZXNbaV0sIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZm91bmRNYXJrZXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJCQkJaWYgKGZvdW5kTWFya2Vyc1tqXS5nZXRBdHRyaWJ1dGUoU1lOVEhFVElDX1RBU0spICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJZm91bmRNYXJrZXJzW2pdLmRlbGV0ZSgpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCWZpbGUuZGVsZXRlTWFya2VycyhtYXJrZXJUeXBlc1tpXSwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiBkZWxldGluZyBvbGQgdGFza3MiLCBlKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCXByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocHJvY2VlZCAmJiBtYXJrZXJBdHRyaWJ1dGVNYXBzICE9IG51bGwgJiYgbWFya2VyQXR0cmlidXRlTWFwcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJaWYgKExvZ2dlci5ERUJVR19UQVNLUykgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyBtYXJrZXJBdHRyaWJ1dGVNYXBzLmxlbmd0aCArICIgdGFza3MgZm9yICIgKyBmaWxlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJBdHRyaWJ1dGVNYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCVN0cmluZyBzcGVjaWZpZWRNYXJrZXJUeXBlID0gKFN0cmluZykgbWFya2VyQXR0cmlidXRlTWFwc1tpXS5nZXQoSU1hcmtlci5UQVNLKTsKLQkJCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBmaW5hbEZpbGUuY3JlYXRlTWFya2VyKHNwZWNpZmllZE1hcmtlclR5cGUpOwotCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlcyhtYXJrZXJBdHRyaWJ1dGVNYXBzW2ldKTsKLQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlVTRVJfRURJVEFCTEUsIEJvb2xlYW4uRkFMU0UpOwotCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKE1PRElGSUNBVElPTl9TVEFNUCwgTG9uZy50b1N0cmluZyhmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpKTsKLQkJCQkJCQkJaWYgKElNYXJrZXIuVEFTSy5lcXVhbHMoc3BlY2lmaWVkTWFya2VyVHlwZSkpIHsKLQkJCQkJCQkJCS8vIHNldCB0byBzeW50aGV0aWMgYW5kIG1ha2UgdXNlciBlZGl0YWJsZQotCQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShTWU5USEVUSUNfVEFTSywgdHJ1ZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJZmluYWxGaWxlLmdldFdvcmtzcGFjZSgpLnJ1bihyLCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5tb2RpZnlSdWxlKGZpbGUpLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCX0KLQkJCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBub3QgYW4gZXJyb3IgY29uZGl0aW9uCi0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHNjYW4oZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBzY2FuTW9uaXRvcikgewotCQlpZiAoc2Nhbk1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNjYW5uaW5nIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJaWYgKExvZ2dlci5ERUJVR19UQVNLUykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2tpcHBpbmcgaW5hY2Nlc3NpYmxlIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU09WRVJBTExQRVJGKSB7Ci0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXByb2NlZWQgPSBpbml0KHByb2plY3QpOwotCQlpbnRlcm5hbFNjYW4ocHJvamVjdCwgcHJvamVjdCwgc2Nhbk1vbml0b3IpOwotCQlzaHV0ZG93bkRlbGVnYXRlcyhwcm9qZWN0KTsKLQkJCi0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NPVkVSQUxMUEVSRikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIGZvciAiICsgcHJvamVjdC5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQotCXZvaWQgc2NhbihJUmVzb3VyY2VEZWx0YSBkZWx0YSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU09WRVJBTExQRVJGKSB7Ci0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWlmIChpbml0KGRlbHRhLmdldFJlc291cmNlKCkpKSB7Ci0JCQlpbnRlcm5hbFNjYW4oZGVsdGEsIG1vbml0b3IpOwotCQkJc2h1dGRvd25EZWxlZ2F0ZXMoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCkpOwotCQl9Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NPVkVSQUxMUEVSRikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIGZvciAiICsgZGVsdGEuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0Jdm9pZCBzY2FuRmlsZShJUHJvamVjdCBwcm9qZWN0LCBUYXNrVGFnW10gdGFza1RhZ3MsIElGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gMyAic3RhZ2VzIgotCQltb25pdG9yLmJlZ2luVGFzaygiIiwgOCk7Ly8kTk9OLU5MUy0xJAotCQltb25pdG9yLnN1YlRhc2soZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpKTsKLQotCQlmaW5hbCBMaXN0IG1hcmtlckF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlDb250ZW50VHlwZVtdIHR5cGVzID0gZGV0ZWN0Q29udGVudFR5cGVzKGZpbGUpOwotCQlTZXQgbWFya2VyVHlwZXMgPSBuZXcgSGFzaFNldCgzKTsKLQkJLy8gQWx3YXlzIGluY2x1ZGVkIGZvciBzYWZldHkgYW5kIG1pZ3JhdGlvbgotCQltYXJrZXJUeXBlcy5hZGQoREVGQVVMVF9NQVJLRVJfVFlQRSk7Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCUlGaWxlVGFza1NjYW5uZXJbXSBmaWxlU2Nhbm5lcnMgPSBudWxsOwotCQlJRmlsZVRhc2tTY2FubmVyW10gaWdub3JlZEZpbGVTY2FubmVycyA9IG51bGw7Ci0JCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQlpZiAoZkN1cnJlbnRJZ25vcmVDb250ZW50VHlwZXMubGVuZ3RoID09IDApIHsKLQkJCQlmaWxlU2Nhbm5lcnMgPSByZWdpc3RyeS5nZXRGaWxlVGFza1NjYW5uZXJzKHR5cGVzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUxpc3QgdmFsaWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkvLyBvYnRhaW4gYSBmaWx0ZXJlZCBsaXN0IG9mIGRlbGVnYXRlcwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJYm9vbGVhbiBpZ25vcmVDb250ZW50VHlwZSA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZDdXJyZW50SWdub3JlQ29udGVudFR5cGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZ25vcmVDb250ZW50VHlwZSA9IGlnbm9yZUNvbnRlbnRUeXBlIHx8IHR5cGVzW2ldLmlzS2luZE9mKGZDdXJyZW50SWdub3JlQ29udGVudFR5cGVzW2pdKTsKLQkJCQkJfQotCQkJCQlpZiAoIWlnbm9yZUNvbnRlbnRUeXBlKSB7Ci0JCQkJCQl2YWxpZFR5cGVzLmFkZCh0eXBlc1tpXSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZ25vcmVkRmlsZVNjYW5uZXJzID0gcmVnaXN0cnkuZ2V0RmlsZVRhc2tTY2FubmVycyhuZXcgSUNvbnRlbnRUeXBlW10ge3R5cGVzW2ldfSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmlsZVNjYW5uZXJzID0gcmVnaXN0cnkuZ2V0RmlsZVRhc2tTY2FubmVycygoSUNvbnRlbnRUeXBlW10pIHZhbGlkVHlwZXMudG9BcnJheShuZXcgSUNvbnRlbnRUeXBlW3ZhbGlkVHlwZXMuc2l6ZSgpXSkpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlpZiAoaWdub3JlZEZpbGVTY2FubmVycyAhPSBudWxsICYmIGlnbm9yZWRGaWxlU2Nhbm5lcnMubGVuZ3RoID4gMCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaWdub3JlZEZpbGVTY2FubmVycy5sZW5ndGg7IGkrKykKLQkJCQkJbWFya2VyVHlwZXMuYWRkKGlnbm9yZWRGaWxlU2Nhbm5lcnNbaV0uZ2V0TWFya2VyVHlwZSgpKTsKLQkJCX0KLQotCQkJaWYgKGZpbGVTY2FubmVycy5sZW5ndGggPiAwKSB7Ci0JCQkJSVByb2dyZXNzTW9uaXRvciBzY2FubmVyTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMywgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKTsKLQkJCQlzY2FubmVyTW9uaXRvci5iZWdpblRhc2soIiIsIGZpbGVTY2FubmVycy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaiA9IDA7IGZpbGVTY2FubmVycyAhPSBudWxsICYmIGogPCBmaWxlU2Nhbm5lcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJY29udGludWU7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoIWZBY3RpdmVTY2FubmVycy5jb250YWlucyhmaWxlU2Nhbm5lcnNbal0pICYmICFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJCWZpbGVTY2FubmVyc1tqXS5zdGFydHVwKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCQlmQWN0aXZlU2Nhbm5lcnMuYWRkKGZpbGVTY2FubmVyc1tqXSk7Ci0JCQkJCQl9Ci0JCQkJCQltYXJrZXJUeXBlcy5hZGQoZmlsZVNjYW5uZXJzW2pdLmdldE1hcmtlclR5cGUoKSk7Ci0JCQkJCQlNYXBbXSB0YXNrTWFya2VyQXR0cmlidXRlcyA9IGZpbGVTY2FubmVyc1tqXS5zY2FuKGZpbGUsIHRhc2tUYWdzLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHNjYW5uZXJNb25pdG9yLCAxLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spKTsKLQkJCQkJCS8qCi0JCQkJCQkgKiBUT0RPOiBwb29sIHRoZSBtYXJrZXIgcmVzdWx0cyBzbyB0aGVyZSdzIG9ubHkgb25lCi0JCQkJCQkgKiBvcGVyYXRpb24gY3JlYXRpbmcgdGhlbQotCQkJCQkJICovCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhc2tNYXJrZXJBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaWYgKCF0YXNrTWFya2VyQXR0cmlidXRlc1tpXS5jb250YWluc0tleShJTWFya2VyLlRBU0spKSB7Ci0JCQkJCQkJCXRhc2tNYXJrZXJBdHRyaWJ1dGVzW2ldLnB1dChJTWFya2VyLlRBU0ssIGZpbGVTY2FubmVyc1tqXS5nZXRNYXJrZXJUeXBlKCkpOwotCQkJCQkJCX0KLQkJCQkJCQl0YXNrTWFya2VyQXR0cmlidXRlc1tpXS5wdXQoSU1hcmtlci5TT1VSQ0VfSUQsIGZpbGVTY2FubmVyc1tqXS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQkJCQkJbWFya2VyQXR0cmlidXRlcy5hZGQodGFza01hcmtlckF0dHJpYnV0ZXNbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc2Nhbm5lck1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJbW9uaXRvci53b3JrZWQoNCk7Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCS8vIG9ubHkgdXBkYXRlIG1hcmtlcnMgaWYgd2UgcmFuIGEgc2Nhbm5lciBvbiB0aGlzIGZpbGUKLQkJaWYgKGZpbGVTY2FubmVycyAhPSBudWxsICYmIGZpbGVTY2FubmVycy5sZW5ndGggPiAwIHx8Ci0JCQkJaWdub3JlZEZpbGVTY2FubmVycyAhPSBudWxsICYmIGlnbm9yZWRGaWxlU2Nhbm5lcnMubGVuZ3RoID4gMCkgewotCQkJSVByb2dyZXNzTW9uaXRvciBtYXJrZXJVcGRhdGVNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAzLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spOwotCQkJaWYgKG1hcmtlckF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJlcGxhY2VUYXNrTWFya2VycyhmaWxlLCAoU3RyaW5nW10pIG1hcmtlclR5cGVzLnRvQXJyYXkobmV3IFN0cmluZ1ttYXJrZXJUeXBlcy5zaXplKCldKSwgKE1hcFtdKSBtYXJrZXJBdHRyaWJ1dGVzLnRvQXJyYXkobmV3IE1hcFttYXJrZXJBdHRyaWJ1dGVzLnNpemUoKV0pLCBtYXJrZXJVcGRhdGVNb25pdG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCW1vbml0b3Iud29ya2VkKDMpOwotCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaHV0ZG93bkRlbGVnYXRlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZkFjdGl2ZVNjYW5uZXJzLnNpemUoKTsgaisrKSB7Ci0JCQl0cnkgewotCQkJCSgoSUZpbGVUYXNrU2Nhbm5lcikgZkFjdGl2ZVNjYW5uZXJzLmdldChqKSkuc2h1dGRvd24ocHJvamVjdCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKHByb2plY3QuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBlKTsKLQkJCX0KLQkJfQotCQlmQWN0aXZlU2Nhbm5lcnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvU3RydWN0dXJlZE1vZGVsTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZThkMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbE1hbmFnZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQ2xhc3MgdG8gYWxsb3cgYWNjZXNzIHRvIHByb3Blcmx5IGNvbmZpZ3VyZWQgaW1wbGVtZW50b3JzIG9mIElNb2RlbE1hbmFnZXIuCi0gKiAKLSAqIEBzaW5jZSAgMS41ICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUKLSAqLwotZmluYWwgcHVibGljIGNsYXNzIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIgewotCS8qKgotCSAqIERvIG5vdCBhbGxvdyBpbnN0YW5jZXMgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBpbnN0YW5jZSBvZiBJTW9kZWxNYW5hZ2VyLiBSZXR1cm5zIG51bGwgaWYgbW9kZWwKLQkgKiBtYW5hZ2VyIGNhbiBub3QgYmUgY3JlYXRlZCBvciBpcyBub3QgdmFsaWQgKHN1Y2ggYXMsIHdoZW4gd29ya2JlbmNoIGlzCi0JICogc2h1dHRpbmcgZG93bikuCi0JICogCi0JICogQHJldHVybiBJTW9kZWxNYW5hZ2VyIC0gcmV0dXJucyB0aGUgb25lIG1vZGVsIG1hbmFnZXIgZm9yIHN0cnVjdHVyZWQKLQkgKiAgICAgICAgIG1vZGVscyBvciBudWxsIGlmIHRoZSBvd25pbmcgYnVuZGxlIGlzIG5laXRoZXIgYWN0aXZlIG5vcgotCSAqICAgICAgICAgc3RhcnRpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJYm9vbGVhbiBpc1JlYWR5ID0gZmFsc2U7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQkJd2hpbGUgKCFpc1JlYWR5KSB7Ci0JCQlCdW5kbGUgbG9jYWxCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoU1NFQ29yZVBsdWdpbi5JRCk7Ci0JCQlpbnQgc3RhdGUgPSBsb2NhbEJ1bmRsZS5nZXRTdGF0ZSgpOwotCQkJaWYgKHN0YXRlID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCQlpc1JlYWR5ID0gdHJ1ZTsKLQkJCQkvLyBnZXRJbnN0YW5jZSBpcyBhIHN5bmNocm9uaXplZCBzdGF0aWMgbWV0aG9kLgotCQkJCW1vZGVsTWFuYWdlciA9IE1vZGVsTWFuYWdlckltcGwuZ2V0SW5zdGFuY2UoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXRlID09IEJ1bmRsZS5TVEFSVElORykgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0KLQkJCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUsIGp1c3QgbG9vcCBhZ2FpbgotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXRlID09IEJ1bmRsZS5TVE9QUElORyB8fCBzdGF0ZSA9PSBCdW5kbGUuVU5JTlNUQUxMRUQpIHsKLQkJCQlpc1JlYWR5ID0gdHJ1ZTsKLQkJCQltb2RlbE1hbmFnZXIgPSBudWxsOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbm90IHN1cmUgYWJvdXQgb3RoZXIgc3RhdGVzLCAncmVzb2x2ZWQnLCAnaW5zdGFsbGVkJwotCQkJCWlzUmVhZHkgPSB0cnVlOwotCQkJCW1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0ZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWU4MmQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKEludGFsaW8pIC0gYnVnIDMwMDQzNCAtIE1ha2UgaW5uZXIgY2xhc3NlcyBzdGF0aWMgd2hlcmUgcG9zc2libGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5Mb2NhdGlvbktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotCi0vKioKLSAqIE5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLCByZWZlcmVuY2VkIG9yIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgotICogCi0gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBjb29yZGluYXRpbmcgdGhlIGNyZWF0aW9uIGFuZCBkaXNwb3NhbCBvZgotICogc3RydWN0dXJlZCBtb2RlbHMgYnVpbHQgb24gc3RydWN0dXJlZCBkb2N1bWVudHMgZm91bmQgaW4gRmlsZUJ1ZmZlcnMuIEl0Ci0gKiBhbGxvd3MgdGhlIFNTRSBNb2RlbCBNYW5hZ2VyIHRvIGFjdCBhcyBhIGNsaWVudCB0byB0aGUKLSAqIFRleHRGaWxlQnVmZmVyTWFuYWdlci4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgewotCi0Jc3RhdGljIGNsYXNzIERvY3VtZW50SW5mbyB7Ci0JCS8qKgotCQkgKiBUaGUgSVRleHRGaWxlQnVmZmVyCi0JCSAqLwotCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIHBsYXRmb3JtIGNvbnRlbnQtdHlwZSBJRCBvZiB0aGlzIGRvY3VtZW50Ci0JCSAqLwotCQlTdHJpbmcgY29udGVudFR5cGVJRCA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFRoZSBJU3RydWN0dXJlTW9kZWwgY29udGFpbmluZyB0aGlzIGRvY3VtZW50OyBtaWdodCBiZSBudWxsIGF0Ci0JCSAqIHBvaW50cyBpbiB0aGUgSVRleHRGaWxlQnVmZmVyJ3MgbGlmZWN5Y2xlCi0JCSAqLwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQotCQkvKioKLQkJICogV2hldGhlciBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIGNhbGxlZCBjb25uZWN0KCkgZm9yIHRoaXMKLQkJICogRG9jdW1lbnRJbmZvJ3MgdGV4dCBmaWxlYnVmZmVyCi0JCSAqLwotCQlib29sZWFuIHNlbGZDb25uZWN0ZWQgPSBmYWxzZTsKLQotCQlpbnQgYnVmZmVyUmVmZXJlbmNlQ291bnQgPSAwOwotCQlpbnQgbW9kZWxSZWZlcmVuY2VDb3VudCA9IDA7Ci0KLQkJLyoqCi0JCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSAiY29tcGF0aWJpbGl0eSIga2luZCBmcm9tIGJlZm9yZSB0aGVyZSB3YXMKLQkJICogYSBMb2NhdGlvbktpbmQgaGludCBvYmplY3QtLXRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgb3ZlcnJpZGRlbiBhdAotCQkgKiBydW50aW1lLgotCQkgKi8KLQkJTG9jYXRpb25LaW5kIGxvY2F0aW9uS2luZCA9IExvY2F0aW9uS2luZC5OT1JNQUxJWkU7Ci0JfQotCi0JLyoqCi0JICogQSBVUklSZXNvbHZlciBpbnN0YW5jZSBvZiBtb2RlbHMgYnVpbHQgb24gamF2YS5pby5GaWxlcwotCSAqLwotCXN0YXRpYyBjbGFzcyBFeHRlcm5hbFVSSVJlc29sdmVyIGltcGxlbWVudHMgVVJJUmVzb2x2ZXIgewotCQlJUGF0aCBmTG9jYXRpb247Ci0KLQkJRXh0ZXJuYWxVUklSZXNvbHZlcihJUGF0aCBsb2NhdGlvbikgewotCQkJZkxvY2F0aW9uID0gbG9jYXRpb247Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEZpbGVCYXNlTG9jYXRpb24oKSB7Ci0JCQlpZiAoZkxvY2F0aW9uID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGZMb2NhdGlvbi50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmkpIHsKLQkJCXJldHVybiBnZXRMb2NhdGlvbkJ5VVJJKHVyaSwgZ2V0RmlsZUJhc2VMb2NhdGlvbigpLCBmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJCXJldHVybiBnZXRMb2NhdGlvbkJ5VVJJKHVyaSwgZ2V0RmlsZUJhc2VMb2NhdGlvbigpLCByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGJhc2VSZWZlcmVuY2UsIGZhbHNlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJCS8vIGlnbm9yZSByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MgdmFsdWUKLQkJCWlmICh1cmkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmICh1cmkuc3RhcnRzV2l0aCgiZmlsZToiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5IHsKLQkJCQkJVVJMIHVybCA9IG5ldyBVUkwodXJpKTsKLQkJCQkJcmV0dXJuIHVybC5nZXRGaWxlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBVUklIZWxwZXIubm9ybWFsaXplKHVyaSwgYmFzZVJlZmVyZW5jZSwgUGF0aC5ST09ULnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJQ29udGFpbmVyIGdldFJvb3RMb2NhdGlvbigpIHsKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQl9Ci0KLQkJcHVibGljIElucHV0U3RyZWFtIGdldFVSSVN0cmVhbShTdHJpbmcgdXJpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEZpbGVCYXNlTG9jYXRpb24oU3RyaW5nIG5ld0xvY2F0aW9uKSB7Ci0JCQlpZiAobmV3TG9jYXRpb24gIT0gbnVsbCkKLQkJCQlmTG9jYXRpb24gPSBuZXcgUGF0aChuZXdMb2NhdGlvbik7Ci0JCQllbHNlCi0JCQkJZkxvY2F0aW9uID0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgbmV3UHJvamVjdCkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBVUklSZXNvbHZlciBpbnN0YW5jZSBvZiBtb2RlbHMgYnVpbHQgb24gdGhlIGV4dGVuc2libGUgV1NUIFVSSQotCSAqIHJlc29sdmVyCi0JICovCi0Jc3RhdGljIGNsYXNzIENvbW1vblVSSVJlc29sdmVyIGltcGxlbWVudHMgVVJJUmVzb2x2ZXIgewotCQlTdHJpbmcgZkxvY2F0aW9uOwotCQlJUGF0aCBmUGF0aDsKLQkJcHJpdmF0ZSBJUHJvamVjdCBmUHJvamVjdDsKLQkJZmluYWwgc3RhdGljIFN0cmluZyBTRVBBUkFUT1IgPSAiLyI7IC8vJE5PTi1OTFMtMSQgCi0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgRklMRV9QUkVGSVggPSAiZmlsZTovLyI7IC8vJE5PTi1OTFMtMSQKLQotCQlDb21tb25VUklSZXNvbHZlcihJRmlsZSB3b3Jrc3BhY2VGaWxlKSB7Ci0JCQlmUGF0aCA9IHdvcmtzcGFjZUZpbGUuZ2V0RnVsbFBhdGgoKTsKLQkJCWZQcm9qZWN0ID0gd29ya3NwYWNlRmlsZS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEZpbGVCYXNlTG9jYXRpb24oKSB7Ci0JCQlyZXR1cm4gZkxvY2F0aW9uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmkpIHsKLQkJCXJldHVybiBnZXRMb2NhdGlvbkJ5VVJJKHVyaSwgZ2V0RmlsZUJhc2VMb2NhdGlvbigpLCBmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJCXJldHVybiBnZXRMb2NhdGlvbkJ5VVJJKHVyaSwgZ2V0RmlsZUJhc2VMb2NhdGlvbigpLCByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGJhc2VSZWZlcmVuY2UsIGZhbHNlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJCWJvb2xlYW4gYmFzZUhhc1ByZWZpeCA9IGJhc2VSZWZlcmVuY2UgIT0gbnVsbCAmJiBiYXNlUmVmZXJlbmNlLnN0YXJ0c1dpdGgoRklMRV9QUkVGSVgpOwotCQkJU3RyaW5nIHJlZmVyZW5jZSA9IG51bGw7Ci0JCQlpZiAoYmFzZUhhc1ByZWZpeCkgewotCQkJCXJlZmVyZW5jZSA9IGJhc2VSZWZlcmVuY2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZWZlcmVuY2UgPSBGSUxFX1BSRUZJWCArIGJhc2VSZWZlcmVuY2U7Ci0JCQl9Ci0JCQlTdHJpbmcgcmVzdWx0ID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKHJlZmVyZW5jZSwgbnVsbCwgdXJpKTsKLQkJCS8vIExvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsCi0JCQkvLyAiVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKCIKLQkJCS8vICsgcmVmZXJlbmNlICsgIiwgbnVsbCwgIiArdXJpKyIpID0gIiArIHJlc3VsdCk7Ci0JCQlpZiAoIWJhc2VIYXNQcmVmaXggJiYgcmVzdWx0LnN0YXJ0c1dpdGgoRklMRV9QUkVGSVgpICYmIHJlc3VsdC5sZW5ndGgoKSA+IEZJTEVfUFJFRklYLmxlbmd0aCgpKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZyhGSUxFX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCQlyZXR1cm4gZlByb2plY3Q7Ci0JCX0KLQotCQlwdWJsaWMgSUNvbnRhaW5lciBnZXRSb290TG9jYXRpb24oKSB7Ci0JCQlTdHJpbmcgcm9vdCA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShGSUxFX1BSRUZJWCArIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgbnVsbCwgU0VQQVJBVE9SKTsKLQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKG5ldyBQYXRoKHJvb3QpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoKGZpbGVzW2ldLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLQkJCQkJaWYgKGZQYXRoLmlzUHJlZml4T2YoKChJRm9sZGVyKSBmaWxlc1tpXSkuZ2V0RnVsbFBhdGgoKSkpIHsKLQkJCQkJCXJldHVybiAoSUZvbGRlcikgZmlsZXNbaV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0UHJvamVjdCgpOwotCQl9Ci0KLQkJcHVibGljIElucHV0U3RyZWFtIGdldFVSSVN0cmVhbShTdHJpbmcgdXJpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEZpbGVCYXNlTG9jYXRpb24oU3RyaW5nIG5ld0xvY2F0aW9uKSB7Ci0JCQlmTG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgbmV3UHJvamVjdCkgewotCQkJZlByb2plY3QgPSBuZXdQcm9qZWN0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFwcyBpbnRlcmVzdGluZyBkb2N1bWVudHMgaW4gZmlsZSBidWZmZXJzIHRvIHRob3NlIGZpbGUgYnVmZmVycy4KLQkgKiBSZXF1aXJlZCB0byBhbGxvdyB1cyB0byBnbyBmcm9tIHRoZSBkb2N1bWVudCBpbnN0YW5jZXMgdG8gY29tcGxldGUKLQkgKiBtb2RlbHMuCi0JICovCi0JY2xhc3MgRmlsZUJ1ZmZlck1hcHBlciBpbXBsZW1lbnRzIElGaWxlQnVmZmVyTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBidWZmZXJDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBidWZmZXJDb250ZW50UmVwbGFjZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBidWZmZXJDcmVhdGVkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQkJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElUZXh0RmlsZUJ1ZmZlcikgewotCQkJCUlUZXh0RmlsZUJ1ZmZlciB0ZXh0QnVmZmVyID0gKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyOwotCQkJCWlmICghKHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkxlYXJuZWQgbmV3IGJ1ZmZlcjogIiArIGJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiICIgKyBidWZmZXIgKyAiICIgKyAoKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyKS5nZXREb2N1bWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSBuZXcgRG9jdW1lbnRJbmZvKCk7Ci0JCQkJaW5mby5idWZmZXIgPSB0ZXh0QnVmZmVyOwotCQkJCWluZm8uY29udGVudFR5cGVJRCA9IGRldGVjdENvbnRlbnRUeXBlKGJ1ZmZlci5nZXRMb2NhdGlvbigpKS5nZXRJZCgpOwotCQkJCWluZm8uYnVmZmVyUmVmZXJlbmNlQ291bnQrKzsKLQkJCQlmRG9jdW1lbnRNYXAucHV0KHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSwgaW5mbyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBidWZmZXJEaXNwb3NlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgdGV4dEJ1ZmZlciA9IChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcjsKLQkJCQlpZiAoISh0ZXh0QnVmZmVyLmdldERvY3VtZW50KCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChMb2dnZXIuREVCVUdfVEVYVEJVRkZFUkxJRkVDWUNMRSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRGlzY2FyZGVkIGJ1ZmZlcjogIiArIGJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiICIgKyBidWZmZXIgKyAiICIgKyAoKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyKS5nZXREb2N1bWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlpbmZvLmJ1ZmZlclJlZmVyZW5jZUNvdW50LS07Ci0JCQkJCWNoZWNrUmVmZXJlbmNlQ291bnRzKGluZm8sIHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlydHlTdGF0ZUNoYW5nZWQoSUZpbGVCdWZmZXIgYnVmZmVyLCBib29sZWFuIGlzRGlydHkpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkJ1ZmZlciBkaXJ0eSBzdGF0ZSBjaGFuZ2VkOiAoIiArIGlzRGlydHkgKyAiKSAiICsgYnVmZmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArICIgIiArIGJ1ZmZlciArICIgIiArICgoSVRleHRGaWxlQnVmZmVyKSBidWZmZXIpLmdldERvY3VtZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJfQotCQkJCUlUZXh0RmlsZUJ1ZmZlciB0ZXh0QnVmZmVyID0gKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyOwotCQkJCWlmICghKHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpKQotCQkJCQlyZXR1cm47Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLm1vZGVsICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG1zZyA9ICJVcGRhdGluZyBtb2RlbCBkaXJ0eSBzdGF0ZSBmb3IiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTE1BTkFHRU1FTlQgfHwgTG9nZ2VyLkRFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIG1zZyk7Ci0JCQkJCX0KLQkJCQkJaW5mby5tb2RlbC5zZXREaXJ0eVN0YXRlKGlzRGlydHkpOwotCi0JCQkJCUlGaWxlIHdvcmtzcGFjZUZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpKTsKLQkJCQkJaWYgKCFpc0RpcnR5ICYmIHdvcmtzcGFjZUZpbGUgIT0gbnVsbCkgewotCQkJCQkJaW5mby5tb2RlbC5yZXNldFN5bmNocm9uaXphdGlvblN0YW1wKHdvcmtzcGFjZUZpbGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VGYWlsZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5naW5nKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhdGVWYWxpZGF0aW9uQ2hhbmdlZChJRmlsZUJ1ZmZlciBidWZmZXIsIGJvb2xlYW4gaXNTdGF0ZVZhbGlkYXRlZCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgdW5kZXJseWluZ0ZpbGVEZWxldGVkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQkJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElUZXh0RmlsZUJ1ZmZlcikgewotCQkJCWlmIChMb2dnZXIuREVCVUdfVEVYVEJVRkZFUkxJRkVDWUNMRSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRGVsZXRlZCBidWZmZXI6ICIgKyBidWZmZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkgKyAiICIgKyBidWZmZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1bmRlcmx5aW5nRmlsZU1vdmVkKElGaWxlQnVmZmVyIGJ1ZmZlciwgSVBhdGggcGF0aCkgewotCQkJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElUZXh0RmlsZUJ1ZmZlcikgewotCQkJCWlmIChMb2dnZXIuREVCVUdfVEVYVEJVRkZFUkxJRkVDWUNMRSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW92ZWQgYnVmZmVyIGZyb206ICIgKyBidWZmZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkgKyAiICIgKyBidWZmZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIk1vdmVkIGJ1ZmZlciB0bzogIiArIHBhdGgudG9PU1N0cmluZygpICsgIiAiICsgYnVmZmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBpbnN0YW5jZSA9IG5ldyBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyKCk7Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIGZpbmFsIHZvaWQgc2h1dGRvd24oKSB7Ci0JCUZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLnJlbW92ZUZpbGVCdWZmZXJMaXN0ZW5lcihpbnN0YW5jZS5mRmlsZUJ1ZmZlckxpc3RlbmVyKTsKLQotCQlpZiAoTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTE1BTkFHRU1FTlQgfHwgTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTExFQUtTKSB7Ci0JCQlJRG9jdW1lbnRbXSBkYW5nbGluZ0RvY3VtZW50cyA9IChJRG9jdW1lbnRbXSkgaW5zdGFuY2UuZkRvY3VtZW50TWFwLmtleVNldCgpLnRvQXJyYXkobmV3IElEb2N1bWVudFswXSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRhbmdsaW5nRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBpbnN0YW5jZS5mRG9jdW1lbnRNYXAuZ2V0KGRhbmdsaW5nRG9jdW1lbnRzW2ldKTsKLQkJCQlpZiAoaW5mby5tb2RlbFJlZmVyZW5jZUNvdW50ID4gMCkKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJMRUFLRUQgTU9ERUw6ICIgKyBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpICsgIiAiICsgKGluZm8ubW9kZWwgIT0gbnVsbCA/IGluZm8ubW9kZWwuZ2V0SWQoKSA6IG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJaWYgKGluZm8uYnVmZmVyUmVmZXJlbmNlQ291bnQgPiAwKQotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkxFQUtFRCBCVUZGRVI6ICIgKyBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpICsgIiAiICsgaW5mby5idWZmZXIuZ2V0RG9jdW1lbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBmaW5hbCB2b2lkIHN0YXJ0dXAoKSB7Ci0JCUZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLmFkZEZpbGVCdWZmZXJMaXN0ZW5lcihnZXRJbnN0YW5jZSgpLmZGaWxlQnVmZmVyTGlzdGVuZXIpOwotCX0KLQotCS8vIGEgbWFwIG9mIElTdHJ1Y3R1cmVkRG9jdW1lbnRzIHRvIERvY3VtZW50SW5mbyBvYmplY3RzCi0JTWFwIGZEb2N1bWVudE1hcCA9IG51bGw7Ci0KLQlGaWxlQnVmZmVyTWFwcGVyIGZGaWxlQnVmZmVyTGlzdGVuZXIgPSBuZXcgRmlsZUJ1ZmZlck1hcHBlcigpOwotCi0JRmlsZUJ1ZmZlck1vZGVsTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJZkRvY3VtZW50TWFwID0gbmV3IEhhc2h0YWJsZSg0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZUlkKElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgY2FsY3VsYXRlIGEgbW9kZWwgSUQgd2l0aG91dCBhbiBJRmlsZSIpOyAvLyROT04tTkxTLTEkIAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihpYWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgaWQgPSBudWxsOwotCQlJUGF0aCBwYXRoID0gZmlsZS5nZXRGdWxsUGF0aCgpOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkvKgotCQkJICogVGhlIElEIG9mIG1vZGVscyBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBub3JtYWxpemVkIHBhdGhzCi0JCQkgKiBzdG9yZWQgaW4gdGhlIHVuZGVybHlpbmcgRmlsZUJ1ZmZlcnMgdG8gcmV0cmlldmUgdGhlbSBieSBjb21tb24KLQkJCSAqIElEIGxhdGVyIG9uLiBXZSBjaG9zZSB0aGUgRmlsZUJ1ZmZlciBub3JtYWxpemVkIHBhdGggb3ZlciB0aGUKLQkJCSAqIHByZXZpb3VzbHkgdXNlZCBhYnNvbHV0ZSBJRmlsZSBwYXRoIGJlY2F1c2UgdGhlIGJ1ZmZlcnMgc2hvdWxkCi0JCQkgKiBhbHJlYWR5IGV4aXN0IGJlZm9yZSB3ZSBidWlsZCBhIG1vZGVsIGFuZCB3ZSBjYW4ndCByZXRyaWV2ZSBhCi0JCQkgKiBGaWxlQnVmZmVyIHVzaW5nIHRoZSBJRCBvZiBhIG1vZGVsIHRoYXQgZG9lc24ndCB5ZXQgZXhpc3QuCi0JCQkgKi8KLQkJCWlkID0gRmlsZUJ1ZmZlcnMubm9ybWFsaXplTG9jYXRpb24ocGF0aCkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gaWQ7Ci0KLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlSWQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBjYWxjdWxhdGUgYSBtb2RlbCBJRCB3aXRob3V0IGEgZG9jdW1lbnQgcmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBpZCA9IG51bGw7Ci0JCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBnZXRCdWZmZXIoZG9jdW1lbnQpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWlkID0gYnVmZmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzICJpbnRlcmVzdCIgaW4gYSBkb2N1bWVudCwgb3IgcmF0aGVyIHRoZSBmaWxlIGJ1ZmZlciB0aGF0Ci0JICogYmFja3MgaXQuIEludGVudGlvbmFsbHkgdXNlZCB0byBhbHRlciB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBmaWxlCi0JICogYnVmZmVyIHNvIGl0IGlzIG5vdCBhY2NpZGVudGFsbHkgZGlzcG9zZWQgb2Ygd2hpbGUgd2UgaGF2ZSBhIG1vZGVsIG9wZW4KLQkgKiBvbiB0b3Agb2YgaXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGNvbm5lY3QoKSB3aXRob3V0IGEgZG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIGJ1ZmZlck1hbmFnZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLQkJSVBhdGggYnVmZmVyTG9jYXRpb24gPSBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpOwotCQlib29sZWFuIGlzT0sgPSB0cnVlOwotCQl0cnkgewotCQkJYnVmZmVyTWFuYWdlci5jb25uZWN0KGJ1ZmZlckxvY2F0aW9uLCBpbmZvLmxvY2F0aW9uS2luZCwgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCWlzT0sgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gaXNPSzsKLQl9Ci0KLQlVUklSZXNvbHZlciBjcmVhdGVVUklSZXNvbHZlcihJVGV4dEZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCUlQYXRoIGxvY2F0aW9uID0gYnVmZmVyLmdldExvY2F0aW9uKCk7Ci0JCUlGaWxlIHdvcmtzcGFjZUZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCVVSSVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLQkJaWYgKHdvcmtzcGFjZUZpbGUgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZUZpbGUuZ2V0UHJvamVjdCgpOwotCQkJcmVzb2x2ZXIgPSAoVVJJUmVzb2x2ZXIpIHByb2plY3QuZ2V0QWRhcHRlcihVUklSZXNvbHZlci5jbGFzcyk7Ci0JCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJCXJlc29sdmVyID0gbmV3IENvbW1vblVSSVJlc29sdmVyKHdvcmtzcGFjZUZpbGUpOwotCQkJfQotCQkJCi0JCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJCWlmICh3b3Jrc3BhY2VGaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCWJhc2VMb2NhdGlvbiA9IHdvcmtzcGFjZUZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsICYmIHdvcmtzcGFjZUZpbGUuZ2V0TG9jYXRpb25VUkkoKSAhPSBudWxsKSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gd29ya3NwYWNlRmlsZS5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoYmFzZUxvY2F0aW9uID09IG51bGwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSB3b3Jrc3BhY2VGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCXJlc29sdmVyLnNldEZpbGVCYXNlTG9jYXRpb24oYmFzZUxvY2F0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc29sdmVyID0gbmV3IEV4dGVybmFsVVJJUmVzb2x2ZXIobG9jYXRpb24pOwotCQl9Ci0JCXJldHVybiByZXNvbHZlcjsKLQl9Ci0KLQotCUlDb250ZW50VHlwZSBkZXRlY3RDb250ZW50VHlwZShJUGF0aCBsb2NhdGlvbikgewotCQlJQ29udGVudFR5cGUgdHlwZSA9IG51bGw7Ci0KLQkJSVJlc291cmNlIHJlc291cmNlID0gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24obG9jYXRpb24pOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gT3B0aW1pemVkIGRlc2NyaXB0aW9uIGxvb2t1cCwgbWlnaHQgbm90IHN1Y2NlZWQKLQkJCQkJZCA9ICgoSUZpbGUpIHJlc291cmNlKS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCQkJdHlwZSA9IGQuZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFNob3VsZCBub3QgYmUgcG9zc2libGUgZ2l2ZW4gdGhlIGFjY2Vzc2libGUgYW5kIGZpbGUKLQkJCQkJLy8gdHlwZSBjaGVjayBhYm92ZQotCQkJCX0KLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlGaWxlIGZpbGUgPSBGaWxlQnVmZmVycy5nZXRTeXN0ZW1GaWxlQXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCQkJdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihpbnB1dCwgZmlsZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoZmlsZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoSUNvbnRlbnRUeXBlTWFuYWdlci5DVF9URVhUKTsKLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXJlZ2lzdGVycyAiaW50ZXJlc3QiIGluIGEgZG9jdW1lbnQsIG9yIHJhdGhlciB0aGUgZmlsZSBidWZmZXIgdGhhdAotCSAqIGJhY2tzIGl0LiBJbnRlbnRpb25hbGx5IHVzZWQgdG8gYWx0ZXIgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgZmlsZQotCSAqIGJ1ZmZlciBzbyB0aGF0IGl0IGtub3dzIGl0IGNhbiBzYWZlbHkgYmUgZGlzcG9zZWQgb2YuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGRpc2Nvbm5lY3QoKSB3aXRob3V0IGEgZG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQlpZiggaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIGJ1ZmZlck1hbmFnZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLQkJSVBhdGggYnVmZmVyTG9jYXRpb24gPSBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpOwotCQlib29sZWFuIGlzT0sgPSB0cnVlOwotCQl0cnkgewotCQkJYnVmZmVyTWFuYWdlci5kaXNjb25uZWN0KGJ1ZmZlckxvY2F0aW9uLCBpbmZvLmxvY2F0aW9uS2luZCwgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCWlzT0sgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gaXNPSzsKLQl9Ci0KLQlwdWJsaWMgSVRleHRGaWxlQnVmZmVyIGdldEJ1ZmZlcihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGdldCBhIGJ1ZmZlciB3aXRob3V0IGEgZG9jdW1lbnQgcmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpCi0JCQlyZXR1cm4gaW5mby5idWZmZXI7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCVN0cmluZyBnZXRDb250ZW50VHlwZUlEKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKQotCQkJcmV0dXJuIGluZm8uY29udGVudFR5cGVJRDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgZ2V0L2NyZWF0ZSBhIG1vZGVsIHdpdGhvdXQgYSBqYXZhLmlvLkZpbGUiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotCQl0cnkgewotCQkJSVBhdGggbG9jYXRpb24gPSBuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCWlmIChMb2dnZXIuREVCVUdfRklMRUJVRkZFUk1PREVMTUFOQUdFTUVOVCkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIGNvbm5lY3RpbmcgdG8gRmlsZSAiICsgbG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlidWZmZXJNYW5hZ2VyLmNvbm5lY3QobG9jYXRpb24sIExvY2F0aW9uS2luZC5MT0NBVElPTiwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IGJ1ZmZlck1hbmFnZXIuZ2V0VGV4dEZpbGVCdWZmZXIobG9jYXRpb24sIExvY2F0aW9uS2luZC5MT0NBVElPTik7Ci0JCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoYnVmZmVyLmdldERvY3VtZW50KCkpOwotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJLyoKLQkJCQkJICogTm90ZTogImluZm8iIGJlaW5nIG51bGwgYXQgdGhpcyBwb2ludCBpcyBhIHNsaWdodAotCQkJCQkgKiBlcnJvci4KLQkJCQkJICogCi0JCQkJCSAqIFRoZSBjb25uZWN0IGNhbGwgZnJvbSBhYm92ZSAob3IgYXQgc29tZSB0aW1lIGVhcmxpZXIgaW4KLQkJCQkJICogdGhlIHNlc3Npb24pIHdvdWxkIGhhdmUgbm90aWZpZWQgdGhlIEZpbGVCdWZmZXJNYXBwZXIKLQkJCQkJICogb2YgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nIHRleHQgYnVmZmVyIGFuZAotCQkJCQkgKiBjcmVhdGVkIHRoZSBEb2N1bWVudEluZm8gb2JqZWN0IGZvcgotCQkJCQkgKiBJU3RydWN0dXJlZERvY3VtZW50cy4KLQkJCQkJICovCi0JCQkJCWluZm8ubG9jYXRpb25LaW5kID0gTG9jYXRpb25LaW5kLkxPQ0FUSU9OOwotCQkJCQlpbmZvLnNlbGZDb25uZWN0ZWQgPSB0cnVlOwotCQkJCX0KLQkJCQkvKgotCQkJCSAqIENoZWNrIHRoZSBkb2N1bWVudCB0eXBlLiBBbHRob3VnaCByZXR1cm5pbmcgbnVsbCBmb3IKLQkJCQkgKiB1bmtub3duIGRvY3VtZW50cyB3b3VsZCBiZSBmYWlyLCB0cnkgdG8gZ2V0IGEgbW9kZWwgaWYKLQkJCQkgKiB0aGUgZG9jdW1lbnQgaXMgYXQgbGVhc3QgYSB2YWxpZCB0eXBlLgotCQkJCSAqLwotCQkJCUlEb2N1bWVudCBidWZmZXJEb2N1bWVudCA9IGJ1ZmZlci5nZXREb2N1bWVudCgpOwotCQkJCWlmIChidWZmZXJEb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJbW9kZWwgPSBnZXRNb2RlbCgoSVN0cnVjdHVyZWREb2N1bWVudCkgYnVmZmVyRG9jdW1lbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogMTkwNzY4IC0gUXVpY2sgZGlmZiBtYXJrcyBkbyBub3QgZGlzYXBwZWFyIGluIHRoZQotCQkJCQkgKiB2ZXJ0aWNhbCBydWxlciBvZiBKYXZhU2NyaXB0IGVkaXRvciBhbmQKLQkJCQkJICogCi0JCQkJCSAqIDE5MzgwNSAtIENoYW5nZXMgYXJlIG5vdCB0aHJvd24gYXdheSB3aGVuIGNsb3NlCi0JCQkJCSAqIHdpdGggbm8gc2F2ZSBmb3IgZmlsZXMgd2l0aCBubyBzdHJ1Y3R1cmVkIG1vZGVsCi0JCQkJCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGVtICh0ZXh0IGZpbGVzLCBqYXZhc2NyaXB0IGZpbGVzLAotCQkJCQkgKiBldGMpIGluIHdlYiBwcm9qZWN0Ci0JCQkJCSAqLwotCQkJCQlidWZmZXJNYW5hZ2VyLmRpc2Nvbm5lY3QobG9jYXRpb24sIExvY2F0aW9uS2luZC5JRklMRSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFcnJvciBnZXR0aW5nIG1vZGVsIGZvciAiICsgZmlsZS5nZXRQYXRoKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgZ2V0L2NyZWF0ZSBhIG1vZGVsIHdpdGhvdXQgYW4gSUZpbGUiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotCQl0cnkgewotCQkJaWYgKExvZ2dlci5ERUJVR19GSUxFQlVGRkVSTU9ERUxNQU5BR0VNRU5UKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgY29ubmVjdGluZyB0byBJRmlsZSAiICsgZmlsZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gc2VlIFRleHRGaWxlRG9jdW1lbnRQcm92aWRlciNjcmVhdGVGaWxlSW5mbyBhYm91dCB3aHkgd2UgdXNlCi0JCQkvLyBJRmlsZSNnZXRGdWxsUGF0aAotCQkJLy8gaGVyZSwgbm90IElGaWxlI2dldExvY2F0aW9uLgotCQkJSVBhdGggbG9jYXRpb24gPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCWJ1ZmZlck1hbmFnZXIuY29ubmVjdChsb2NhdGlvbiwgTG9jYXRpb25LaW5kLklGSUxFLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IGJ1ZmZlck1hbmFnZXIuZ2V0VGV4dEZpbGVCdWZmZXIobG9jYXRpb24sIExvY2F0aW9uS2luZC5JRklMRSk7Ci0JCQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChidWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBOb3RlOiAiaW5mbyIgYmVpbmcgbnVsbCBhdCB0aGlzIHBvaW50IGlzIGEgc2xpZ2h0Ci0JCQkJCQkgKiBlcnJvci4KLQkJCQkJCSAqIAotCQkJCQkJICogVGhlIGNvbm5lY3QgY2FsbCBmcm9tIGFib3ZlIChvciBhdCBzb21lIHRpbWUKLQkJCQkJCSAqIGVhcmxpZXIgaW4gdGhlIHNlc3Npb24pIHdvdWxkIGhhdmUgbm90aWZpZWQgdGhlCi0JCQkJCQkgKiBGaWxlQnVmZmVyTWFwcGVyIG9mIHRoZSBjcmVhdGlvbiBvZiB0aGUKLQkJCQkJCSAqIGNvcnJlc3BvbmRpbmcgdGV4dCBidWZmZXIgYW5kIGNyZWF0ZWQgdGhlCi0JCQkJCQkgKiBEb2N1bWVudEluZm8gb2JqZWN0IGZvciBJU3RydWN0dXJlZERvY3VtZW50cy4KLQkJCQkJCSAqLwotCQkJCQkJaW5mby5zZWxmQ29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCWluZm8ubG9jYXRpb25LaW5kID0gTG9jYXRpb25LaW5kLklGSUxFOwotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIENoZWNrIHRoZSBkb2N1bWVudCB0eXBlLiBBbHRob3VnaCByZXR1cm5pbmcgbnVsbCBmb3IKLQkJCQkJICogdW5rbm93biBkb2N1bWVudHMgd291bGQgYmUgZmFpciwgdHJ5IHRvIGdldCBhIG1vZGVsIGlmCi0JCQkJCSAqIHRoZSBkb2N1bWVudCBpcyBhdCBsZWFzdCBhIHZhbGlkIHR5cGUuCi0JCQkJCSAqLwotCQkJCQlJRG9jdW1lbnQgYnVmZmVyRG9jdW1lbnQgPSBidWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYgKGJ1ZmZlckRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQkJbW9kZWwgPSBnZXRNb2RlbCgoSVN0cnVjdHVyZWREb2N1bWVudCkgYnVmZmVyRG9jdW1lbnQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLyoKLQkJCQkJCSAqIDE5MDc2OCAtIFF1aWNrIGRpZmYgbWFya3MgZG8gbm90IGRpc2FwcGVhciBpbiB0aGUKLQkJCQkJCSAqIHZlcnRpY2FsIHJ1bGVyIG9mIEphdmFTY3JpcHQgZWRpdG9yIGFuZAotCQkJCQkJICogCi0JCQkJCQkgKiAxOTM4MDUgLSBDaGFuZ2VzIGFyZSBub3QgdGhyb3duIGF3YXkgd2hlbiBjbG9zZQotCQkJCQkJICogd2l0aCBubyBzYXZlIGZvciBmaWxlcyB3aXRoIG5vIHN0cnVjdHVyZWQgbW9kZWwKLQkJCQkJCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGVtICh0ZXh0IGZpbGVzLCBqYXZhc2NyaXB0IGZpbGVzLAotCQkJCQkJICogZXRjKSBpbiB3ZWIgcHJvamVjdAotCQkJCQkJICovCi0JCQkJCQlidWZmZXJNYW5hZ2VyLmRpc2Nvbm5lY3QobG9jYXRpb24sIExvY2F0aW9uS2luZC5JRklMRSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIGdldHRpbmcgbW9kZWwgZm9yICIgKyBmaWxlLmdldEZ1bGxQYXRoKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGdldC9jcmVhdGUgYSBtb2RlbCB3aXRob3V0IGEgZG9jdW1lbnQgcmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5tb2RlbCA9PSBudWxsKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTE1BTkFHRU1FTlQpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBjcmVhdGluZyBtb2RlbCBmb3IgIiArIGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCkgKyAiICIgKyBpbmZvLmJ1ZmZlci5nZXREb2N1bWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlpbmZvLm1vZGVsUmVmZXJlbmNlQ291bnQrKzsKLQotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBNb2RlbEhhbmRsZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEhhbmRsZXJGb3JDb250ZW50VHlwZUlkKGluZm8uY29udGVudFR5cGVJRCk7Ci0JCQlJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQkJbW9kZWwgPSBsb2FkZXIuY3JlYXRlTW9kZWwoZG9jdW1lbnQsIGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwgaGFuZGxlcik7Ci0JCQl0cnkgewotCQkJCWluZm8ubW9kZWwgPSBtb2RlbDsKLQkJCQltb2RlbC5zZXRJZChpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJCS8vIGhhbmRsZXIgbm93IHNldCBieSBsb2FkZXIsIGZvciBub3cKLQkJCQkvLyBtb2RlbC5zZXRNb2RlbEhhbmRsZXIoaGFuZGxlcik7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgbW9kZWwpLnNldENvbnRlbnRUeXBlSWRlbnRpZmllcihpbmZvLmNvbnRlbnRUeXBlSUQpOwotCQkJCX0KLQkJCQltb2RlbC5zZXRSZXNvbHZlcihjcmVhdGVVUklSZXNvbHZlcihnZXRCdWZmZXIoZG9jdW1lbnQpKSk7Ci0JCQkJaWYgKGluZm8uYnVmZmVyLmlzRGlydHkoKSkgewotCQkJCQltb2RlbC5zZXREaXJ0eVN0YXRlKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChSZXNvdXJjZUluVXNlIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJhdHRlbXB0ZWQgdG8gY3JlYXRlIG5ldyBtb2RlbCB3aXRoIGV4aXN0aW5nIElEIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQltb2RlbCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGluZm8ubW9kZWw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCX0KLQotCS8qKgotCSAqIFdpbGwgcmVtb3ZlIHRoZSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIDxjb2RlPmRvY3VtZW50PC9jb2RlPiBpZiBib3RoCi0JICogdGhlcmUgYXJlIG5vIG1vcmUgYnVmZmVyIG9yIG1vZGVsIHJlZmVyZW5jZSBjb3VudHMgZm9yIDxjb2RlPmluZm88L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGluZm8gdGhlIGRvY3VtZW50IGluZm8gdG8gY2hlY2sgZm9yIHJlZmVyZW5jZSBjb3VudHMKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGtleSB0byByZW1vdmUgZnJvbSB0aGUgZG9jdW1lbnQgbWFwIGlmIHRoZXJlIGFyZSBubyBtb3JlCi0JICogcmVmZXJlbmNlcwotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja1JlZmVyZW5jZUNvdW50cyhEb2N1bWVudEluZm8gaW5mbywgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChpbmZvLmJ1ZmZlclJlZmVyZW5jZUNvdW50ID09IDAgJiYgaW5mby5tb2RlbFJlZmVyZW5jZUNvdW50ID09IDApCi0JCQlmRG9jdW1lbnRNYXAucmVtb3ZlKGRvY3VtZW50KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0V4aXN0aW5nQnVmZmVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgY2hlY2sgZm9yIGFuIGV4aXN0aW5nIGJ1ZmZlciB3aXRob3V0IGEgZG9jdW1lbnQgcmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQlyZXR1cm4gaW5mbyAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VNb2RlbChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IHJlbGVhc2UgYSBtb2RlbCB3aXRob3V0IGEgZG9jdW1lbnQgcmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKExvZ2dlci5ERUJVR19GSUxFQlVGRkVSTU9ERUxNQU5BR0VNRU5UKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgbm90aWNlZCBmdWxsIHJlbGVhc2Ugb2YgbW9kZWwgZm9yICIgKyBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpICsgIiAiICsgaW5mby5idWZmZXIuZ2V0RG9jdW1lbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaW5mby5tb2RlbCA9IG51bGw7Ci0JCQlpbmZvLm1vZGVsUmVmZXJlbmNlQ291bnQtLTsKLQkJCWlmIChpbmZvLnNlbGZDb25uZWN0ZWQpIHsKLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTE1BTkFHRU1FTlQpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgZGlzY29ubmVjdGluZyBmcm9tICIgKyBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpICsgIiAiICsgaW5mby5idWZmZXIuZ2V0RG9jdW1lbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlJUGF0aCBsb2NhdGlvbiA9IGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCkuZGlzY29ubmVjdChsb2NhdGlvbiwgaW5mby5sb2NhdGlvbktpbmQsIGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFcnJvciByZWxlYXNpbmcgbW9kZWwgZm9yICIgKyBsb2NhdGlvbiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBbMjY1ODk5XQotCQkJLy8gSW4gc29tZSBzY2VuYXJpb3MsIGEgbW9kZWwgY2FuIGJlIGhlbGQgb250byBhZnRlciB0aGUgZWRpdG9yIGhhcyBiZWVuIGRpc3Bvc2VkIGV2ZW4gaWYgdGhlIGxpZmVjeWNsZSBpcwotCQkJLy8gbWFpbnRhaW5lZCBwcm9wZXJseSAoZS5nLiwgYW4gZWRpdG9yIGJlaW5nIGNsb3NlZCBiZWZvcmUgYSBEaXJ0eVJlZ2lvblByb2Nlc3NvciBoYXMgYSBjaGFuY2UgdG8gY29tcGxldGUpLiBCZWNhdXNlIG9mIHRoaXMsCi0JCQkvLyB0aGUgbWFuYWdlciBjYW5ub3QgYmUgcmVsaWFudCB1cG9uIHRoZSBGaWxlQnVmZmVyTWFwcGVyIGhhdmluZyB0aGUgc29sZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgZkRvY3VtZW50TWFwIGNsZWFudXAKLQkJCWNoZWNrUmVmZXJlbmNlQ291bnRzKGluZm8sIGRvY3VtZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJldmVydChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IHJlbGVhc2UgYSBtb2RlbCB3aXRob3V0IGEgZG9jdW1lbnQgcmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIHdhcyBhc2tlZCB0byByZXZlcnQgYSBkb2N1bWVudCBidXQgd2FzIG5vdCBiZWluZyBtYW5hZ2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCS8vIGdldCBwYXRoIGp1c3QgZm9yIHBvdGVudGlhbCBlcnJvciBtZXNzYWdlCi0JCQlJUGF0aCBsb2NhdGlvbiA9IGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCk7Ci0JCQl0cnkgewotCQkJCS8vIElTU1VFOiBpbiBmdXR1cmUsIGNsaWVudHMgc2hvdWxkIHByb3ZpZGUgcHJvZ3Jlc3MgbW9uaXRvcgotCQkJCWluZm8uYnVmZmVyLnJldmVydChnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSVNTVUU6IHNob3VkbCB3ZSBub3QgYmUgcmUtdGhyb3dpbmcgQ29yZUV4Y2VwdGlvbnM/IE9yCi0JCQkJLy8gbm90IGNhdGNoIHRoZW0gYXQgYWxsPwotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIHJldmVydGluZyBtb2RlbCBmb3IgIiArIGxvY2F0aW9uLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9JRXhlY3V0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvSUV4ZWN1dGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYzU4OTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9JRXhlY3V0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotCi0vKioKLSAqIEFuIGFic3RyYWN0aW9uIHRoYXQgYWxsb3dzIGV2ZW4gcHJvY2Vzc2luZyB0byBiZSBwZXJmb3JtZWQgaW4gYSBkaWZmZXJlbnQKLSAqIGNvbnRleHQsIGUuZy4gYSBkaWZmZXJlbnQgVGhyZWFkLCBpZiBuZWVkZWQuCi0gKiAKLSAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRXhlY3V0aW9uRGVsZWdhdGUgewotCi0Jdm9pZCBleGVjdXRlKElTYWZlUnVubmFibGUgcnVubmFibGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9JTG9ja2FibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvSUxvY2thYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YWE1MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9JTG9ja2FibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotCi0vKioKLSAqIAotICogTm90IEFQSTogbm90IHRvIGJlIHVzZWQgb3IgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gVGhpcyBpcyBhIHNwZWNpYWwKLSAqIHB1cnBvc2UgaW50ZXJmYWNlIHRvIGhlbHAgZ3VhcmQgc29tZSB0aHJlYWRpbmcgaXNzdWVzIGJldHdlZWVuIG1vZGVsIGFuZAotICogZG9jdW1lbnQuIFdpbGwgYmUgY2hhbmdlZCBzb29uLgotICogIAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUxvY2thYmxlIHsKLQotCUlMb2NrIGdldExvY2tPYmplY3QoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9KU1BBd2FyZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0pTUEF3YXJlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllMjI5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0pTUEF3YXJlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQQXdhcmVBZGFwdGVyRmFjdG9yeSBleHRlbmRzIElOb2RlQWRhcHRlckZhY3RvcnkgewotCi0Jdm9pZCBpbml0aWFsaXplV2l0aChFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkQ29udGVudFR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MjY4NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIHRydWUgaWYgYm90aCBwbGF0Zm9ybSBhbmQgdGhpcyBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZGVidWciKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIGFkYXB0ZXIKLQkgKiBub3RpZmljYXRpb24gdGltZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19BREFQVEVSTk9USUZJQ0FUSU9OVElNRSA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9tL2FkYXB0ZXIvbm90aWZpY2F0aW9uL3RpbWUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHN0cnVjdHVyZWQKLQkgKiBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19ET0NVTUVOVCA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3RydWN0dXJlZGRvY3VtZW50IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyBmaWxlIGJ1ZmZlcgotCSAqIG1vZGVsIG1hbmFnZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRklMRUJVRkZFUk1PREVMTUFOQUdFTUVOVCA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZmlsZWJ1ZmZlcnMvbW9kZWxtYW5hZ2VtZW50IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyBmaWxlIGJ1ZmZlcgotCSAqIG1vZGVscyBub3QgYmVpbmcgcmVsZWFzZWQgb24gc2h1dGRvd24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRklMRUJVRkZFUk1PREVMTEVBS1MgPSBERUJVRyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2ZpbGVidWZmZXJzL2xlYWtzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyBmb3JtYXR0aW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0ZPUk1BVCA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZm9ybWF0IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyB0ZXh0IGJ1ZmZlcgotCSAqIGxpZmVjeWNsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19URVhUQlVGRkVSTElGRUNZQ0xFID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9maWxlYnVmZmVycy9saWZlY3ljbGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIG1vZGVsCi0JICogbGlmZWN5Y2xlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0xJRkVDWUNMRSA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3RydWN0dXJlZG1vZGVsL2xpZmVjeWNsZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgbW9kZWwgc3RhdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfTU9ERUxTVEFURSA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3RydWN0dXJlZG1vZGVsL3N0YXRlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyBtb2RlbCBsb2NrCi0JICogc3RhdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfTU9ERUxMT0NLID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvbG9ja3MiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIG1vZGVsCi0JICogbWFuYWdlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19NT0RFTE1BTkFHRVIgPSBERUJVRyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9tb2RlbG1hbmFnZXIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRhc2sgdGFncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UQVNLUyA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRhc2sgdGFncwotCSAqIGNvbnRlbnQgdHlwZSBkZXRlY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NDT05URU5UVFlQRSA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvZGV0ZWN0aW9uIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyB0YXNrIHRhZ3MKLQkgKiBqb2JzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RBU0tTSk9CID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9qb2IiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRhc2sgdGFncwotCSAqIG92ZXJhbGwgcGVyZm9ybWFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NPVkVSQUxMUEVSRiA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3Mvb3ZlcmFsbHRpbWUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRhc2sgdGFncwotCSAqIHBlcmZvcm1hbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RBU0tTUEVSRiA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICogcHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NQUkVGUyA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvcHJlZmVyZW5jZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRhc2sgdGFncwotCSAqIHJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RBU0tTUkVHSVNUUlkgPSBERUJVRyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL3JlZ2lzdHJ5IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qCi0JICogS2VlcCBvdXIgb3duIGNvcHkgaW4gY2FzZSB3ZSB3YW50IHRvIGFkZCBvdGhlciBzZXZlcml0eSBsZXZlbHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSBhIG1lc3NhZ2UgdG8gdGhlIGxvZyB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBsZXZlbAotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgRVJST1IsIFdBUk5JTkcsIElORk8sIE9LCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIGEgbWVzc2FnZSBhbmQgZXhjZXB0aW9uIHRvIHRoZSBsb2cgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgbGV2ZWwKLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIEVSUk9SLCBXQVJOSU5HLCBJTkZPLCBPSwotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRvIGFkZCB0byB0aGUgbG9nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBleGNlcHRpb24gYXMgYW4gZXJyb3IgaW4gdGhlIGxvZyBhbG9uZyB3aXRoIGFuIGFjY29tcGFueWluZwotCSAqIG1lc3NhZ2UKLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0byBhZGQgdG8gdGhlIGxvZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgZXhjZXB0aW9uIGFzIGFuIGVycm9yIGluIHRoZSBsb2cKLQkgKiAKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdG8gYWRkIHRvIHRoZSBsb2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhJU3RhdHVzLkVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5MDI1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL01vZGVsTWFuYWdlclBsdWdpblJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIE1vZGVsTWFuYWdlclBsdWdpblJlZ2lzdHJ5UmVhZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAocmVhZGVyID09IG51bGwpIHsKLQkJCXJlYWRlciA9IG5ldyBNb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlcigpOwotCQl9Ci0JCXJldHVybiByZWFkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX0FEQVBURVJLRVkgPSAiYWRhcHRlcktleUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfQ09OVEVOVFRZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfUkVHSVNURVJBREFQVEVSID0gInJlZ2lzdGVyQWRhcHRlcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJhZGFwdE9uQ3JlYXRlRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gIkFkYXB0T25DcmVhdGVGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogWE1MRWRpdG9yUGx1Z2luUmVnaXN0cnlSZWFkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmFjdG9yaWVzKElEb2N1bWVudFR5cGVIYW5kbGVyIGhhbmRsZXIpIHsKLQkJcmV0dXJuIGxvYWRSZWdpc3RyeShoYW5kbGVyLmdldElkKCkpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEZhY3RvcmllcyhTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gbG9hZFJlZ2lzdHJ5KHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXJGYWN0b3J5IGxvYWRGYWN0b3J5RnJvbUNvbmZpZ3VyYXRpb25FbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBPYmplY3QgcmVxdWVzdGVyVHlwZSkgewotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkgewotCQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9DT05URU5UVFlQRSk7Ci0JCQlpZiAoIWNvbnRlbnRUeXBlLmVxdWFscyhyZXF1ZXN0ZXJUeXBlKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0NMQVNTKTsKLQkJCVN0cmluZyBhZGFwdGVyS2V5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0FEQVBURVJLRVkpOwotCQkJU3RyaW5nIHJlZ2lzdGVyQWRhcHRlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX1JFR0lTVEVSQURBUFRFUik7Ci0KLQkJCS8vIGlmIGNsYXNzTmFtZSBpcyBudWxsLCB0aGVuIG5vIG9uZSBkZWZpbmVkIHRoZSBleHRlbnNpb24gcG9pbnQKLQkJCS8vIGZvciBhZGFwdGVyIGZhY3RvcmllcwotCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShuYW1lKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlmIGFuIGVycm9yIG9jY3VycyBoZXJlLCBpdHMgcHJvYmFibHkgdGhhdCB0aGUgcGx1Z2luCi0JCQkJCS8vIGNvdWxkIG5vdCBiZSBmb3VuZC9sb2FkZWQKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgYnVuZGxlOiAiICsgbmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCX0KLQkJCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQkJYm9vbGVhbiB1c2VFeHRlbmRlZENvbnN0cnVjdG9yID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gZG9SZWdpc3RlckFkYXB0ZXJzID0gZmFsc2U7Ci0JCQkJCU9iamVjdCBhZGFwdGVyS2V5ID0gbnVsbDsKLQotCQkJCQlpZiAocmVnaXN0ZXJBZGFwdGVycyAhPSBudWxsICYmIHJlZ2lzdGVyQWRhcHRlcnMubGVuZ3RoKCkgPiAwICYmIEJvb2xlYW4udmFsdWVPZihyZWdpc3RlckFkYXB0ZXJzKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJZG9SZWdpc3RlckFkYXB0ZXJzID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZiAoYWRhcHRlcktleUNsYXNzICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJQ2xhc3MgYUNsYXNzID0gbnVsbDsKLQkJCQkJCQkvLyBhQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8KLQkJCQkJCQkvLyBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoYWRhcHRlcktleUNsYXNzKSA6Ci0JCQkJCQkJLy8gQ2xhc3MuZm9yTmFtZShhZGFwdGVyS2V5Q2xhc3MpOwotCQkJCQkJCWlmIChidW5kbGUuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuVU5JTlNUQUxMRUQpIHsKLQkJCQkJCQkJYUNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhhZGFwdGVyS2V5Q2xhc3MpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJYUNsYXNzID0gQ2xhc3MuZm9yTmFtZShhZGFwdGVyS2V5Q2xhc3MpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoYUNsYXNzICE9IG51bGwpIHsKLQkJCQkJCQkJdXNlRXh0ZW5kZWRDb25zdHJ1Y3RvciA9IHRydWU7Ci0JCQkJCQkJCWFkYXB0ZXJLZXkgPSBhQ2xhc3M7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlhZGFwdGVyS2V5ID0gYWRhcHRlcktleUNsYXNzOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gYW55RXJyb3JzKSB7Ci0JCQkJCQkJYWRhcHRlcktleSA9IGFkYXB0ZXJLZXlDbGFzczsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXRyeSB7Ci0JCQkJCQlDbGFzcyB0aGVDbGFzcyA9IG51bGw7Ci0JCQkJCQkvLyBDbGFzcyB0aGVDbGFzcyA9IGNsYXNzTG9hZGVyICE9IG51bGwgPwotCQkJCQkJLy8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkgOgotCQkJCQkJLy8gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCQkJCQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5VTklOU1RBTExFRCkgewotCQkJCQkJCXRoZUNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdGhlQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodXNlRXh0ZW5kZWRDb25zdHJ1Y3RvcikgewotCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yW10gY3RvcnMgPSB0aGVDbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKTsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCUNsYXNzW10gcGFyYW1UeXBlcyA9IGN0b3JzW2ldLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQkJCQkJCWlmIChjdG9yc1tpXS5pc0FjY2Vzc2libGUoKSAmJiBwYXJhbVR5cGVzLmxlbmd0aCA9PSAyICYmIHBhcmFtVHlwZXNbMF0uZXF1YWxzKE9iamVjdC5jbGFzcykgJiYgcGFyYW1UeXBlc1sxXS5lcXVhbHMoYm9vbGVhbi5jbGFzcykpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBjdG9yc1tpXS5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117YWRhcHRlcktleSwgbmV3IEJvb2xlYW4oZG9SZWdpc3RlckFkYXB0ZXJzKX0pOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24KLQkJCQkJCQkJCQkvLyBub3QgdG8KLQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uCi0JCQkJCQkJCQkJLy8gbm90IHRvCi0JCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24KLQkJCQkJCQkJCQkvLyBub3QgdG8KLQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbgotCQkJCQkJCQkJCS8vIG5vdCB0bwotCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWNhdGNoIChFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IgZSkgewotCQkJCQkJCQkJCS8vIGxvZyBvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbgotCQkJCQkJCQkJCS8vIG5vdCB0bwotCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJCQlmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRSX0NMQVNTKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBsb2cgb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gbG9nIG9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGxvYWRSZWdpc3RyeShPYmplY3QgY29udGVudFR5cGUpIHsKLQkJTGlzdCBmYWN0b3J5TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoU1NFQ29yZVBsdWdpbi5JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbG9hZEZhY3RvcnlGcm9tQ29uZmlndXJhdGlvbkVsZW1lbnQoZWxlbWVudHNbaV0sIGNvbnRlbnRUeXBlKTsKLQkJCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJCQlmYWN0b3J5TGlzdC5hZGQoZmFjdG9yeSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhY3RvcnlMaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm9DYW5jZWxQcm9ncmVzc01vbml0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm9DYW5jZWxQcm9ncmVzc01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmMTI5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL05vQ2FuY2VsUHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci0KLQotcHVibGljIGNsYXNzIE5vQ2FuY2VsUHJvZ3Jlc3NNb25pdG9yIGV4dGVuZHMgTnVsbFByb2dyZXNzTW9uaXRvciB7Ci0KLQotCXB1YmxpYyBOb0NhbmNlbFByb2dyZXNzTW9uaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2lzQ2FuY2VsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm90SW1wbGVtZW50ZWRFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm90SW1wbGVtZW50ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EwYjk4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL05vdEltcGxlbWVudGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotCi1wdWJsaWMgY2xhc3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JcHVibGljIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotCi0JcHVibGljIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihjYXVzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9OdWxsTWVtZW50by5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9OdWxsTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGE0MzA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTnVsbE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGFuIEVuY29kaW5nTWVtZW50byAoaXRzIHN1cGVyIGNsYXNzKSwKLSAqIHdoZW4gdGhlcmUgaXMgbm90IGluIGZhY3QgQU5ZIGVuY29kaW5nIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZSwgd2hlbiBhCi0gKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgY3JlYXRlZCBkaXJlY3RseSBmcm9tIGEgU3RyaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsTWVtZW50byBleHRlbmRzIEVuY29kaW5nTWVtZW50byB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBOdWxsTWVtZW50bygpIHsKLQkJc3VwZXIoKTsKLQkJU3RyaW5nIGRlZmF1bHRDaGFyc2V0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKG51bGwpOwotCQlzZXRKYXZhQ2hhcnNldE5hbWUoZGVmYXVsdENoYXJzZXQpOwotCQlzZXRBcHByb3ByaWF0ZURlZmF1bHQoZGVmYXVsdENoYXJzZXQpOwotCQlzZXREZXRlY3RlZENoYXJzZXROYW1lKG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Qcm9wYWdhdGluZ0FkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvUHJvcGFnYXRpbmdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMWM0ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Qcm9wYWdhdGluZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGFnYXRpbmdBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCXZvaWQgYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KTsKLQotCUxpc3QgZ2V0QWRhcHRPbkNyZWF0ZUZhY3RvcmllcygpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhZGRpbmcgYSBmYWN0b3J5LAotCSAqIHR5cGljYWxseSBvbiB0aGUgZG9jdW1lbnQgKHRvcCBsZXZlbCkgbm9kZSwgc28gYWxsIG5vZGVzIGNhbiBiZQotCSAqIGFkYXB0ZWQsIGlmIG5lZWRlZC4gVGhpcyBpcyBuZWVkZWQgZm9yIHRob3NlIG9jY2FzaW9ucyB3aGVuIGEgZmFjdG9yeQotCSAqIGlzIGFkZGVkZWQgYWZ0ZXIgc29tZSBub2RlcyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gY3JlYXRlZCBhdCB0aGUgdGltZQotCSAqIHRoZSBmYWN0b3J5IGlzIGFkZGVkLgotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZUZvckZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBJTm9kZU5vdGlmaWVyIG5vZGUpOwotCi0JLy8gZG13OiBzaG91bGQgaGF2ZSBnZXRGYWN0b3J5Rm9yPwotCXZvaWQgcmVsZWFzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBjODRkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotCi0KLQotcHVibGljIGludGVyZmFjZSBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQl2b2lkIGFkZENvbnRyaWJ1dGVkRmFjdG9yaWVzKElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSk7Ci0KLQl2b2lkIHNldENvbnRyaWJ1dGVkRmFjdG9yaWVzKEFycmF5TGlzdCBsaXN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmQxYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFNTRSBDb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU1NFQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBTU0VDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgU1NFQ29yZU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFfbW9kZWxfc19pZF9jYW5fbm90X2JlX251X0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZ3JhbV9FcnJvcl9fTW9kZWxNYW5hZ2VfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmlnaW5hbF9FcnJvcl9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRfQ2hhbmdlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrU2Nhbm5lcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tTY2FubmluZ0pvYl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tTY2FubmluZ0pvYl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pZ3JhdGVfQ2hhcnNldDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZTMyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuVGFza1NjYW5uaW5nU2NoZWR1bGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogU1NFIENvcmUgUGx1Z2luLgotICovCi1wdWJsaWMgY2xhc3MgU1NFQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0Jc3RhdGljIFNTRUNvcmVQbHVnaW4gaW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTU0VDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgU1NFQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFNldCBkZWZhdWx0IG5vbi1VSQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCS8vIHNldCBtb2RlbCBwcmVmZXJlbmNlIGRlZmF1bHRzCi0KLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5VU0VfM0JZVEVfQk9NX1dJVEhfVVRGOCwgZmFsc2UpOwotCQkKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5UQVNLX1RBR19FTkFCTEUsIGZhbHNlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5UQVNLX1RBR19UQUdTLCAiVE9ETyxGSVhNRSxYWFgiKTsgLy8kTk9OLU5MUy0xJAotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlRBU0tfVEFHX1BSSU9SSVRJRVMsICIxLDIsMSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCVRhc2tTY2FubmluZ1NjaGVkdWxlci5zaHV0ZG93bigpOwotCi0JCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuc2h1dGRvd24oKTsKLQotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQotCQkvLyBpbml0aWFsaXplIEZpbGVCdWZmZXIgaGFuZGxpbmcKLQkJRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5zdGFydHVwKCk7Ci0KLQkJLyoqCi0JCSAqIElmIHRoZSB1c2VyIHN0YXJ0cyB0aGUgd29ya2JlbmNoIHdpdGgKLQkJICogLURvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXI9b2ZmLCB0aGUgc2Nhbm5lciBzaG91bGQgYmUKLQkJICogZGlzYWJsZWQKLQkJICovCi0JCVN0cmluZyBzY2FuID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc2NhbiA9PSBudWxsIHx8ICFzY2FuLmVxdWFsc0lnbm9yZUNhc2UoIm9mZiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVRhc2tTY2FubmluZ1NjaGVkdWxlci5zdGFydHVwKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEhhbmRsZXJSZWdpc3RyeSBnZXRNb2RlbEhhbmRsZXJSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIE1vZGVsSGFuZGxlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkgKi8KLQlwdWJsaWMgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZjAxZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUFfbW9kZWxfc19pZF9jYW5fbm90X2JlX251X0VYQ189QSBtb2RlbCdzIGlkIGNhbiBub3QgYmUgbnVsbAotUHJvZ3JhbV9FcnJvcl9fTW9kZWxNYW5hZ2VfRVhDXz1Qcm9ncmFtIEVycm9yOiBNb2RlbE1hbmFnZXJJbXBsOjpzYXZlTW9kZWwuIE1vZGVsIHNob3VsZCBiZSBpbiB0aGUgY2FjaGUKLU9yaWdpbmFsX0Vycm9yX19VSV89T3JpZ2luYWwgRXJyb3I6Ci1UZXh0X0NoYW5nZV9VSV89VGV4dCBDaGFuZ2UKLVRhc2tTY2FubmVyXzA9U2Nhbm5pbmcgZm9yIFRhc2tzCi1UYXNrU2Nhbm5pbmdKb2JfMD1TY2FubmluZwotVGFza1NjYW5uaW5nSm9iXzE9RXJyb3JzIHdoaWxlIGRldGVjdGluZyBUYXNrcwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTWlncmF0ZV9DaGFyc2V0PU1pZ3JhdGUgQ2hhcnNldApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0Fic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9BYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MjVkNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0Fic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIHsKLQlwdWJsaWMgYm9vbGVhbiByZWZyZXNoQ2xlYW51cFByZWZlcmVuY2VzID0gdHJ1ZTsgLy8gc3BlY2lhbCBmbGFnIGZvciBKVW5pdAotCi0JLy8gdGVzdHMgdG8gc2tpcCByZWZyZXNoCi0JLy8gb2YgY2xlYW51cCBwcmVmZXJlbmNlcwotCS8vIHdoZW4gaXQncyBzZXQgdG8gZmFsc2UKLQotCXB1YmxpYyBTdHJpbmcgY2xlYW51cENvbnRlbnQoU3RyaW5nIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQuZ2V0Qnl0ZXMoIlVURjgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBpZCA9IGlucHV0U3RyZWFtLnRvU3RyaW5nKCkgKyBnZXRDb250ZW50VHlwZSgpOwotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoaWQsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gY2xlYW51cAotCQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgMCwgc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpKTsKLQotCQkJLy8gcmV0dXJuIG91dHB1dAotCQkJcmV0dXJuIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWVuc3VyZUNsb3NlZChudWxsLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgY2xlYW51cENvbnRlbnQoU3RyaW5nIGlucHV0LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGlkID0gaW5wdXRTdHJlYW0udG9TdHJpbmcoKSArIGdldENvbnRlbnRUeXBlKCk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJLy8gcmV0dXJuIG91dHB1dAotCQkJcmV0dXJuIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWVuc3VyZUNsb3NlZChudWxsLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQotCQkJLy8gY2xlYW51cAotCQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChzdGFydCA+PSAwICYmIGxlbmd0aCA+PSAwICYmIHN0YXJ0ICsgbGVuZ3RoIDw9IGRvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZgotCQkJCS8vIG1vZGVsIGNoYW5nZWQuCi0JCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0KLQkJCQkvLyBjbGVhbnVwCi0JCQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJCWlmICghc3RydWN0dXJlZE1vZGVsLmlzU2hhcmVkRm9yRWRpdCgpICYmIHN0cnVjdHVyZWRNb2RlbC5pc1NhdmVOZWVkZWQoKSkKLQkJCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJLy8gZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgbnVsbCk7Ci0JCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBGaWxlKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCAwLCBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpOwotCi0JCQkvLyBzYXZlIG91dHB1dCB0byBmaWxlCi0JCQkvLyBvdXRwdXRTdHJlYW0gPSBuZXcKLQkJCS8vIEZpbGVPdXRwdXRTdHJlYW0oZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoZmlsZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cEZpbGUoSUZpbGUgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCS8vIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQotCQkJLy8gY2xlYW51cAotCQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCS8vIHNhdmUgb3V0cHV0IHRvIGZpbGUKLQkJCS8vIG91dHB1dFN0cmVhbSA9IG5ldwotCQkJLy8gRmlsZU91dHB1dFN0cmVhbShmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZShmaWxlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCWlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmaWxlTmFtZSwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCAwLCBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpOwotCi0JCQkvLyBzYXZlIG91dHB1dCB0byBmaWxlCi0JCQkvLyBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgaW5wdXRTdHJlYW0pOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGVOYW1lLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkvLyBzYXZlIG91dHB1dCB0byBmaWxlCi0JCQkvLyBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgaW5wdXRTdHJlYW0pOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgbGVuZ3RoID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJaWYgKChzdGFydCA+PSAwKSAmJiAobGVuZ3RoIDw9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSkpIHsKLQkJCQlWZWN0b3IgYWN0aXZlTm9kZXMgPSBnZXRBY3RpdmVOb2RlcyhzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQkJCWlmIChhY3RpdmVOb2Rlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCU5vZGUgZmlyc3ROb2RlID0gKE5vZGUpIGFjdGl2ZU5vZGVzLmZpcnN0RWxlbWVudCgpOwotCQkJCQlOb2RlIGxhc3ROb2RlID0gKE5vZGUpIGFjdGl2ZU5vZGVzLmxhc3RFbGVtZW50KCk7Ci0JCQkJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkJCQlOb2RlIGVhY2hOb2RlID0gZmlyc3ROb2RlOwotCQkJCQlOb2RlIG5leHROb2RlID0gbnVsbDsKLQotCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIzNjIxCi0JCQkJCS8vIGlmIGRvaW5nIGFueSBzb3J0IG9mIGNsZWFudXAsIHNldCB1cCByZXdyaXRlIHNlc3Npb24vbW9kZWxjaGFuZ2VkCi0JCQkJCUlEb2N1bWVudEV4dGVuc2lvbjQgZG9jRXh0NCA9IG51bGw7Ci0JCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJCQlkb2NFeHQ0ID0gKElEb2N1bWVudEV4dGVuc2lvbjQpIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJfQotCQkJCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHJld3JpdGVTZXNzaW9uID0gbnVsbDsKLQotCQkJCQl0cnkgewotCQkJCQkJLy8gd2hlbmV2ZXIgZm9ybWF0dGluZyBtb2RlbCwgZmlyZQotCQkJCQkJLy8gYWJvdXR0b2NoYW5nZS9tb2RlbGNoYW5nZWQKLQkJCQkJCXN0cnVjdHVyZWRNb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCQkJCXJld3JpdGVTZXNzaW9uID0gKGRvY0V4dDQgPT0gbnVsbCB8fCBkb2NFeHQ0LmdldEFjdGl2ZVJld3JpdGVTZXNzaW9uKCkgIT0gbnVsbCkgPyBudWxsIDogZG9jRXh0NC5zdGFydFJld3JpdGVTZXNzaW9uKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCk7Ci0KLQkJCQkJCXdoaWxlICghZG9uZSkgewotCQkJCQkJCS8vIHVwZGF0ZSAiZG9uZSIKLQkJCQkJCQlkb25lID0gKGVhY2hOb2RlID09IGxhc3ROb2RlKTsKLQotCQkJCQkJLy8gZ2V0IG5leHQgc2libGluZyBiZWZvcmUgY2xlYW51cCBiZWNhdXNlIGVhY2hOb2RlCi0JCQkJCQkJLy8gbWF5Ci0JCQkJCQkJLy8gYmUgZGVsZXRlZCwKLQkJCQkJCQkvLyBmb3IgZXhhbXBsZSB3aGVuIGl0J3MgYW4gZW1wdHkgdGV4dCBub2RlCi0JCQkJCQkJbmV4dE5vZGUgPSBlYWNoTm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJCQkJLy8gY2xlYW51cCBzZWxlY3RlZCBub2RlKHMpCi0JCQkJCQkJY2xlYW51cE5vZGUoZWFjaE5vZGUpOwotCi0JCQkJCQkJLy8gdXBkYXRlIGVhY2ggbm9kZQotCQkJCQkJCWlmIChuZXh0Tm9kZSAhPSBudWxsICYmIG5leHROb2RlLmdldFBhcmVudE5vZGUoKSA9PSBudWxsKQotCQkJCQkJCQkvLyBuZXh0Tm9kZSBpcyBkZWxldGVkIGR1cmluZyBjbGVhbnVwCi0JCQkJCQkJCWVhY2hOb2RlID0gZWFjaE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCWVhY2hOb2RlID0gbmV4dE5vZGU7Ci0KLQkJCQkJCQkvLyBUaGlzIHNob3VsZCBub3QgYmUgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlCi0JCQkJCQkJLy8gc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB3aXRoIGVhY2hOb2RlLgotCQkJCQkJCS8vIFdlIGRvbid0IHdhbnQgYW4gaW5maW5pdGUgbG9vcCBoZXJlLgotCQkJCQkJCWlmIChlYWNoTm9kZSA9PSBudWxsKQotCQkJCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gZm9ybWF0IHNvdXJjZQotCQkJCQkJaWYgKGdldEZvcm1hdFNvdXJjZVByZWZlcmVuY2Uoc3RydWN0dXJlZE1vZGVsKSkgewotCQkJCQkJCS8vIGZvcm1hdCB0aGUgZG9jdW1lbnQKLQkJCQkJCQlJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBnZXRGb3JtYXRQcm9jZXNzb3IoKTsKLQkJCQkJCQlmb3JtYXRQcm9jZXNzb3IuZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCS8vIHdlIG5lZWQgdHdvIGZpbmFsbHkncywganVzdCBpbiBjYXNlIGZpcnN0IGZhaWxzCi0JCQkJCQl0cnkgewotCQkJCQkJCWlmICgoZG9jRXh0NCAhPSBudWxsKSAmJiAocmV3cml0ZVNlc3Npb24gIT0gbnVsbCkpCi0JCQkJCQkJCWRvY0V4dDQuc3RvcFJld3JpdGVTZXNzaW9uKHJld3JpdGVTZXNzaW9uKTsKLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCS8vIGFsd2F5cyBtYWtlIHN1cmUgdG8gZmlyZSBjaGFuZ2VkbW9kZWwgd2hlbiBkb25lCi0JCQkJCQkJc3RydWN0dXJlZE1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCU5vZGUgY2xlYW51cE5vZGUgPSBub2RlOwotCi0JCQkvLyBjbGVhbnVwIHRoZSBvd25lciBub2RlIGlmIGl0J3MgYW4gYXR0cmlidXRlIG5vZGUKLQkJCWlmIChjbGVhbnVwTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0JCQkJY2xlYW51cE5vZGUgPSAoKEF0dHIpIGNsZWFudXBOb2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLQotCQkJLy8gcmVmcmVzaCBjbGVhbnVwIHByZWZlcmVuY2VzIGJlZm9yZSBnZXR0aW5nIGNsZWFudXAgaGFuZGxlcgotCQkJaWYgKHJlZnJlc2hDbGVhbnVwUHJlZmVyZW5jZXMpCi0JCQkJcmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcygpOwotCi0JCQkvLyBnZXQgY2xlYW51cCBoYW5kbGVyCi0JCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZ2V0Q2xlYW51cEhhbmRsZXIoY2xlYW51cE5vZGUpOwotCQkJaWYgKGNsZWFudXBIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkvLyBjbGVhbnVwIGVhY2ggbm9kZQotCQkJCWNsZWFudXBIYW5kbGVyLmNsZWFudXAoY2xlYW51cE5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udmVydExpbmVEZWxpbWl0ZXJzKElEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIG5ld0RlbGltaXRlcikgewotCQlmaW5hbCBpbnQgbGluZUNvdW50ID0gZG9jdW1lbnQuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCQlNYXAgcGFydGl0aW9uZXJzID0gVGV4dFV0aWxpdGllcy5yZW1vdmVEb2N1bWVudFBhcnRpdGlvbmVycyhkb2N1bWVudCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVDb3VudDsgaSsrKSB7Ci0JCQkJZmluYWwgU3RyaW5nIGRlbGltaXRlciA9IGRvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoaSk7Ci0JCQkJaWYgKGRlbGltaXRlciAhPSBudWxsICYmIGRlbGltaXRlci5sZW5ndGgoKSA+IDAgJiYgIWRlbGltaXRlci5lcXVhbHMobmV3RGVsaW1pdGVyKSkgewotCQkJCQlJUmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihpKTsKLQkJCQkJZG9jdW1lbnQucmVwbGFjZShyZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCksIGRlbGltaXRlci5sZW5ndGgoKSwgbmV3RGVsaW1pdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlUZXh0VXRpbGl0aWVzLmFkZERvY3VtZW50UGFydGl0aW9uZXJzKGRvY3VtZW50LCBwYXJ0aXRpb25lcnMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5zdXJlQ2xvc2VkKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7IC8vIGhvcGVsZXNzCi0JCX0KLQkJdHJ5IHsKLQkJCWlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOyAvLyBob3BlbGVzcwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFZlY3RvciBnZXRBY3RpdmVOb2RlcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0Tm9kZU9mZnNldCwgaW50IGxlbmd0aCkgewotCQlWZWN0b3IgYWN0aXZlTm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlOb2RlIHN0YXJ0Tm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE5vZGVPZmZzZXQpOwotCQkJTm9kZSBlbmROb2RlID0gKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBpdCdzIGFuIG5vbi1lbXB0eSBkb2N1bWVudAotCQkJaWYgKHN0YXJ0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJd2hpbGUgKGlzU2libGluZ09mKHN0YXJ0Tm9kZSwgZW5kTm9kZSkgPT0gZmFsc2UpIHsKLQkJCQkJaWYgKGVuZE5vZGUgIT0gbnVsbCkKLQkJCQkJCWVuZE5vZGUgPSBlbmROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKGVuZE5vZGUgPT0gbnVsbCkgewotCQkJCQkJc3RhcnROb2RlID0gc3RhcnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWVuZE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXdoaWxlIChzdGFydE5vZGUgIT0gZW5kTm9kZSkgewotCQkJCQlhY3RpdmVOb2Rlcy5hZGRFbGVtZW50KHN0YXJ0Tm9kZSk7Ci0JCQkJCXN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCQlpZiAoc3RhcnROb2RlICE9IG51bGwpCi0JCQkJCWFjdGl2ZU5vZGVzLmFkZEVsZW1lbnQoc3RhcnROb2RlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhY3RpdmVOb2RlczsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBnZXRDbGVhbnVwSGFuZGxlcihOb2RlIG5vZGUpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZSgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0Q29udmVydEVPTENvZGVzUHJlZmVyZW5jZShJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCWJvb2xlYW4gY29udmVydEVPTENvZGVzID0gdHJ1ZTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IGdldENsZWFudXBIYW5kbGVyKChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbigwKSk7Ci0JCWlmIChjbGVhbnVwSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMgPSBjbGVhbnVwSGFuZGxlci5nZXRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQkJCWNvbnZlcnRFT0xDb2RlcyA9IGNsZWFudXBQcmVmZXJlbmNlcy5nZXRDb252ZXJ0RU9MQ29kZXMoKTsKLQkJfQotCQlyZXR1cm4gY29udmVydEVPTENvZGVzOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RU9MQ29kZVByZWZlcmVuY2UoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCQlJU2NvcGVDb250ZXh0W10gc2NvcGVDb250ZXh0ID0gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgSW5zdGFuY2VTY29wZSgpfTsKLQkJU3RyaW5nIGVvbENvZGUgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoUGxhdGZvcm0uUElfUlVOVElNRSwgUGxhdGZvcm0uUFJFRl9MSU5FX1NFUEFSQVRPUiwgbnVsbCwgc2NvcGVDb250ZXh0KTsKLQotCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZ2V0Q2xlYW51cEhhbmRsZXIoKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKDApKTsKLQkJaWYgKGNsZWFudXBIYW5kbGVyICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcyA9IGNsZWFudXBIYW5kbGVyLmdldENsZWFudXBQcmVmZXJlbmNlcygpOwotCQkJZW9sQ29kZSA9IGNsZWFudXBQcmVmZXJlbmNlcy5nZXRFT0xDb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGVvbENvZGU7Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGdldEZvcm1hdFByb2Nlc3NvcigpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0Rm9ybWF0U291cmNlUHJlZmVyZW5jZShJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCWJvb2xlYW4gZm9ybWF0U291cmNlID0gdHJ1ZTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IGdldENsZWFudXBIYW5kbGVyKChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbigwKSk7Ci0JCWlmIChjbGVhbnVwSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMgPSBjbGVhbnVwSGFuZGxlci5nZXRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQkJCWZvcm1hdFNvdXJjZSA9IGNsZWFudXBQcmVmZXJlbmNlcy5nZXRGb3JtYXRTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gZm9ybWF0U291cmNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2libGluZ09mKE5vZGUgbm9kZSwgTm9kZSBlbmROb2RlKSB7Ci0JCWlmIChlbmROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJTm9kZSBzaWJsaW5nTm9kZSA9IG5vZGU7Ci0JCQl3aGlsZSAoc2libGluZ05vZGUgIT0gbnVsbCkgewotCQkJCWlmIChzaWJsaW5nTm9kZSA9PSBlbmROb2RlKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCXNpYmxpbmdOb2RlID0gc2libGluZ05vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHJlZnJlc2hDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjk4OTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgewotCU5vZGUgY2xlYW51cChOb2RlIG5vZGUpOwotCi0JSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQl2b2lkIHNldENsZWFudXBQcmVmZXJlbmNlcyhJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1MDU4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLQotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyB7Ci0KLQlpbnQgZ2V0QXR0ck5hbWVDYXNlKCk7Ci0KLQlib29sZWFuIGdldENvbXByZXNzRW1wdHlFbGVtZW50VGFncygpOwotCi0JYm9vbGVhbiBnZXRDb252ZXJ0RU9MQ29kZXMoKTsKLQotCVN0cmluZyBnZXRFT0xDb2RlKCk7Ci0KLQlib29sZWFuIGdldEZvcm1hdFNvdXJjZSgpOwotCi0JYm9vbGVhbiBnZXRJbnNlcnRNaXNzaW5nVGFncygpOwotCi0JYm9vbGVhbiBnZXRJbnNlcnRSZXF1aXJlZEF0dHJzKCk7Ci0KLQlib29sZWFuIGdldFF1b3RlQXR0clZhbHVlcygpOwotCi0JaW50IGdldFRhZ05hbWVDYXNlKCk7Ci0KLQl2b2lkIHNldEF0dHJOYW1lQ2FzZShpbnQgYXR0ck5hbWVDYXNlKTsKLQotCXZvaWQgc2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKGJvb2xlYW4gY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKTsKLQotCXZvaWQgc2V0Q29udmVydEVPTENvZGVzKGJvb2xlYW4gY29udmVydEVPTENvZGVzKTsKLQotCXZvaWQgc2V0RU9MQ29kZShTdHJpbmcgRU9MQ29kZSk7Ci0KLQl2b2lkIHNldEZvcm1hdFNvdXJjZShib29sZWFuIGZvcm1hdFNvdXJjZSk7Ci0KLQl2b2lkIHNldEluc2VydE1pc3NpbmdUYWdzKGJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MpOwotCi0Jdm9pZCBzZXRJbnNlcnRSZXF1aXJlZEF0dHJzKGJvb2xlYW4gaW5zZXJ0UmVxdWlyZWRBdHRycyk7Ci0KLQl2b2lkIHNldFByZWZlcmVuY2VzKFByZWZlcmVuY2VzIHByZWZlcmVuY2VzKTsKLQotCXZvaWQgc2V0UXVvdGVBdHRyVmFsdWVzKGJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzKTsKLQotCXZvaWQgc2V0VGFnTmFtZUNhc2UoaW50IHRhZ05hbWVDYXNlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdiY2U0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgYW5kIHJlbGF0ZWQgY2xhc3NlcyBhcmUgJ2ludGVybmFsJyBhbmQgc2hvdWxkIG5vdCAKLSAqIGJlIHRyZWF0ZWQgYXMgQVBJLCBldmVuIHRob3VnaCB1c2VkIGFjcm9zcyBjb21wb25lbnRzIGluIFdUUC4gCi0gKiBDb25zaWRlciBpdCBhIHdvcmsgaW4gcHJvZ3Jlc3MuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgewotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhbiBpbnB1dCBzdHJpbmcgYXMgaW5wdXQsCi0JICogY3JlYXRlcyBhbiBJbnB1dFN0cmVhbSBmcm9tIHRoZSBpbnB1dCBzdHJpbmcsIGNyZWF0ZSBhIHRlbXBvcmFyeSBtb2RlbAotCSAqIG9mIHRoZSBjb250ZW50IHR5cGUgc3BlY2lmaWVkLCBjbGVhbnVwcyB0aGUgd2hvbGUgbW9kZWwsIHRoZW4gcmV0dXJucwotCSAqIHRoZSBjbGVhbmVkIHVwIGlucHV0IHN0cmluZy4KLQkgKi8KLQlTdHJpbmcgY2xlYW51cENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhbiBpbnB1dCBzdHJpbmcgYXMgaW5wdXQsCi0JICogY3JlYXRlcyBhbiBJbnB1dFN0cmVhbSBmcm9tIHRoZSBpbnB1dCBzdHJpbmcsIGNyZWF0ZSBhIHRlbXBvcmFyeSBtb2RlbAotCSAqIG9mIHRoZSBjb250ZW50IHR5cGUgc3BlY2lmaWVkLCBjbGVhbnVwcyB0aGUgbW9kZWwgd2l0aGluIHN0YXJ0IGFuZAotCSAqIGxlbmd0aCwgdGhlbiByZXR1cm5zIHRoZSBjbGVhbmVkIHVwIGlucHV0IHN0cmluZy4KLQkgKi8KLQlTdHJpbmcgY2xlYW51cENvbnRlbnQoU3RyaW5nIGNvbnRlbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIElEb2N1bWVudCBhcyBpbnB1dCwgY3JlYXRlcwotCSAqIGEgdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRG9jdW1lbnQncyBmaWxlCi0JICogZXh0ZW5zaW9uLCBjbGVhbnVwcyB0aGUgd2hvbGUgbW9kZWwsIHRoZW4gcmVsZWFzZXMgdGhlIG1vZGVsLgotCSAqLwotCXZvaWQgY2xlYW51cERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIElEb2N1bWVudCBhcyBpbnB1dCwgY3JlYXRlcwotCSAqIGEgdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRG9jdW1lbnQncyBmaWxlCi0JICogZXh0ZW5zaW9uLCBjbGVhbnVwcyB0aGUgbW9kZWwgd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGgsIHRoZW4gcmVsZWFzZXMKLQkgKiB0aGUgbW9kZWwuCi0JICovCi0Jdm9pZCBjbGVhbnVwRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhbiBJRmlsZSBhcyBpbnB1dCwgY3JlYXRlcyBhCi0JICogdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRmlsZSdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGNsZWFudXBzIHRoZSB3aG9sZSBtb2RlbCwgdGhlbiByZWxlYXNlcyB0aGUgbW9kZWwuIFRoZSBJRmlsZQotCSAqIGlzIHVwZGF0ZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2Ugb2YgdGhlIG1vZGVsIGlzIHJlbGVhc2VkIGluIHRoZQotCSAqIG1vZGVsIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBjbGVhbnVwRmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYW4gSUZpbGUgYXMgaW5wdXQsIGNyZWF0ZXMgYQotCSAqIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUgY2FsY3VsYXRlZCB1c2luZyB0aGUgSUZpbGUncyBmaWxlCi0JICogZXh0ZW5zaW9uLCBjbGVhbnVwcyB0aGUgbW9kZWwgd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGgsIHRoZW4gcmVsZWFzZXMKLQkgKiB0aGUgbW9kZWwuIFRoZSBJRmlsZSBpcyB1cGRhdGVkIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIG9mIHRoZSBtb2RlbCBpcwotCSAqIHJlbGVhc2VkIGluIHRoZSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCXZvaWQgY2xlYW51cEZpbGUoSUZpbGUgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBmaWxlIG5hbWUgYXMgaW5wdXQsY3JlYXRlcyBhbgotCSAqIElucHV0U3RyZWFtIGZyb20gdGhlIGZpbGUsIGNyZWF0ZSBhIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUKLQkgKiBjYWxjdWxhdGVkIHVzaW5nIHRoZSBmaWxlIG5hbWUncyBmaWxlIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIHdob2xlCi0JICogbW9kZWwsIHRoZW4gcmVsZWFzZXMgdGhlIG1vZGVsLiBUaGUgZmlsZSBpcyB1cGRhdGVkIHdoZW4gdGhlIGxhc3QKLQkgKiByZWZlcmVuY2Ugb2YgdGhlIG1vZGVsIGlzIHJlbGVhc2VkIGluIHRoZSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCXZvaWQgY2xlYW51cEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGEgZmlsZSBuYW1lIGFzIGlucHV0LGNyZWF0ZXMgYW4KLQkgKiBJbnB1dFN0cmVhbSBmcm9tIHRoZSBmaWxlLCBjcmVhdGUgYSB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlCi0JICogY2FsY3VsYXRlZCB1c2luZyB0aGUgZmlsZSBuYW1lJ3MgZmlsZSBleHRlbnNpb24sIGNsZWFudXBzIHRoZSBtb2RlbAotCSAqIHdpdGhpbiBzdGFydCBhbmQgbGVuZ3RoLCB0aGVuIHJlbGVhc2VzIHRoZSBtb2RlbC4gVGhlIGZpbGUgaXMgdXBkYXRlZAotCSAqIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIG9mIHRoZSBtb2RlbCBpcyByZWxlYXNlZCBpbiB0aGUgbW9kZWwgbWFuYWdlci4KLQkgKi8KLQl2b2lkIGNsZWFudXBGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGEgbW9kZWwgYXMgaW5wdXQsIGFuZCBjbGVhbnVwcwotCSAqIHRoZSB3aG9sZSBtb2RlbC4KLQkgKi8KLQl2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBtb2RlbCBhcyBpbnB1dCwgYW5kIGNsZWFudXBzCi0JICogdGhlIG1vZGVsIHdpdGhpbiBzdGFydCBhbmQgbGVuZ3RoLgotCSAqLwotCXZvaWQgY2xlYW51cE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGEgbm9kZSBhcyBpbnB1dCwgYW5kIGZvcm1hdHMKLQkgKiB0aGUgbm9kZSBhbmQgYWxsIGl0cyBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGNsZWFudXBOb2RlKE5vZGUgbm9kZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1N0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgzNDQxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIHsKLQlwcml2YXRlIGludCBmQXR0ck5hbWVDYXNlOwotCXByaXZhdGUgYm9vbGVhbiBmQ29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzOwotCXByaXZhdGUgYm9vbGVhbiBmQ29udmVydEVPTENvZGVzOwotCXByaXZhdGUgU3RyaW5nIGZFT0xDb2RlOwotCXByaXZhdGUgYm9vbGVhbiBmRm9ybWF0U291cmNlOwotCXByaXZhdGUgYm9vbGVhbiBmSW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbnNlcnRSZXF1aXJlZEF0dHJzOwotCS8vcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmUgPSBudWxsOwotCXByaXZhdGUgUHJlZmVyZW5jZXMgZlByZWZlcmVuY2VzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlF1b3RlQXR0clZhbHVlczsKLQotCXByaXZhdGUgaW50IGZUYWdOYW1lQ2FzZTsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0ck5hbWVDYXNlKCkgewotCi0JCXJldHVybiBmQXR0ck5hbWVDYXNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldENvbXByZXNzRW1wdHlFbGVtZW50VGFncygpIHsKLQotCQlyZXR1cm4gZkNvbXByZXNzRW1wdHlFbGVtZW50VGFnczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb252ZXJ0RU9MQ29kZXMoKSB7Ci0KLQkJcmV0dXJuIGZDb252ZXJ0RU9MQ29kZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFT0xDb2RlKCkgewotCi0JCXJldHVybiBmRU9MQ29kZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRGb3JtYXRTb3VyY2UoKSB7Ci0KLQkJcmV0dXJuIGZGb3JtYXRTb3VyY2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5zZXJ0TWlzc2luZ1RhZ3MoKSB7Ci0KLQkJcmV0dXJuIGZJbnNlcnRNaXNzaW5nVGFnczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJbnNlcnRSZXF1aXJlZEF0dHJzKCkgewotCi0JCXJldHVybiBmSW5zZXJ0UmVxdWlyZWRBdHRyczsKLQl9Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0KLQkJaWYgKGZQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmUHJlZmVyZW5jZXMgPSBTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQl9Ci0JCXJldHVybiBmUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0UXVvdGVBdHRyVmFsdWVzKCkgewotCi0JCXJldHVybiBmUXVvdGVBdHRyVmFsdWVzOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGFnTmFtZUNhc2UoKSB7Ci0KLQkJcmV0dXJuIGZUYWdOYW1lQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyTmFtZUNhc2UoaW50IGF0dHJOYW1lQ2FzZSkgewotCi0JCWZBdHRyTmFtZUNhc2UgPSBhdHRyTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKGJvb2xlYW4gY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKSB7Ci0KLQkJZkNvbXByZXNzRW1wdHlFbGVtZW50VGFncyA9IGNvbXByZXNzRW1wdHlFbGVtZW50VGFnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0RU9MQ29kZXMoYm9vbGVhbiBjb252ZXJ0RU9MQ29kZXMpIHsKLQotCQlmQ29udmVydEVPTENvZGVzID0gY29udmVydEVPTENvZGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVPTENvZGUoU3RyaW5nIEVPTENvZGUpIHsKLQotCQlmRU9MQ29kZSA9IEVPTENvZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9ybWF0U291cmNlKGJvb2xlYW4gZm9ybWF0U291cmNlKSB7Ci0KLQkJZkZvcm1hdFNvdXJjZSA9IGZvcm1hdFNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRNaXNzaW5nVGFncyhib29sZWFuIGluc2VydE1pc3NpbmdUYWdzKSB7Ci0KLQkJZkluc2VydE1pc3NpbmdUYWdzID0gaW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0UmVxdWlyZWRBdHRycyhib29sZWFuIGluc2VydFJlcXVpcmVkQXR0cnMpIHsKLQotCQlmSW5zZXJ0UmVxdWlyZWRBdHRycyA9IGluc2VydFJlcXVpcmVkQXR0cnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZXMoUHJlZmVyZW5jZXMgcHJlZnMpIHsKLQotCQlmUHJlZmVyZW5jZXMgPSBwcmVmczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRRdW90ZUF0dHJWYWx1ZXMoYm9vbGVhbiBxdW90ZUF0dHJWYWx1ZXMpIHsKLQotCQlmUXVvdGVBdHRyVmFsdWVzID0gcXVvdGVBdHRyVmFsdWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhZ05hbWVDYXNlKGludCB0YWdOYW1lQ2FzZSkgewotCi0JCWZUYWdOYW1lQ2FzZSA9IHRhZ05hbWVDYXNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzA2Y2EwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlciB7Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcihTdHJpbmcgY29udGVudFR5cGUpOwotCi0Jdm9pZCBzZXRDbGVhbnVwUHJvY2Vzc29yKElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBjbGVhbnVwUHJvY2Vzc29yLCBTdHJpbmcgY29udGVudFR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1N0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhNjI0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFzc2VydDsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXJJbXBsIGltcGxlbWVudHMgU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlciB7Ci0JcHJvdGVjdGVkIE1hcCBmQ2xlYW51cFByb2Nlc3NvcnM7Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGdldENsZWFudXBQcm9jZXNzb3IoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoY29udGVudFR5cGUpOwotCi0JCWlmIChmQ2xlYW51cFByb2Nlc3NvcnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiAoSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yKSBmQ2xlYW51cFByb2Nlc3NvcnMuZ2V0KGNvbnRlbnRUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGVhbnVwUHJvY2Vzc29yKElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBjbGVhbnVwUHJvY2Vzc29yLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZW50VHlwZSk7Ci0KLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29ycyA9PSBudWxsKQotCQkJZkNsZWFudXBQcm9jZXNzb3JzID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpZiAoZkNsZWFudXBQcm9jZXNzb3JzID09IG51bGwpCi0JCQlmQ2xlYW51cFByb2Nlc3NvcnMucmVtb3ZlKGNvbnRlbnRUeXBlKTsKLQkJZWxzZQotCQkJZkNsZWFudXBQcm9jZXNzb3JzLnB1dChjb250ZW50VHlwZSwgY2xlYW51cFByb2Nlc3Nvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BYnN0cmFjdERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0Fic3RyYWN0RG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5OTU5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0Fic3RyYWN0RG9jdW1lbnRMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuTWFsZm9ybWVkSW5wdXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Vbm1hcHBhYmxlQ2hhcmFjdGVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZFJlYWRlckNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnMuTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGEgZmlsZSBhbmQgY3JlYXRlcyBhbiBTdHJ1Y3R1cmVkIE1vZGVsLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REb2N1bWVudExvYWRlciBpbXBsZW1lbnRzIElEb2N1bWVudExvYWRlciB7Ci0KLQlwcml2YXRlIENvZGVkUmVhZGVyQ3JlYXRvciBmQ29kZWRSZWFkZXJDcmVhdG9yOwotCXByb3RlY3RlZCBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcjsKLQkvLyBwcml2YXRlIGJvb2xlYW4gZlByb3BlcnRpZXNPYnRhaW5lZDsKLQotCXByb3RlY3RlZCBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50bzsKLQlwcm90ZWN0ZWQgUmVhZGVyIGZGdWxsUHJlcGFyZWRSZWFkZXI7Ci0KLQkvKioKLQkgKiBBYnN0cmFjdExvYWRlciBjb25zdHJ1Y3RvciBhbHNvIGluaXRpYWxpemVzIGVuY29kaW5nIGNvbnZlcnRlci9tYXBwZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3REb2N1bWVudExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nQnVmZmVyIGNvbnZlcnRMaW5lRGVsaW1pdGVycyhTdHJpbmdCdWZmZXIgYWxsVGV4dEJ1ZmZlciwgU3RyaW5nIGxpbmVEZWxpbWl0ZXJUb1VzZSkgewotCQkvLyBUT0RPOiBhdm9pZCB1c2Ugb2YgU3RyaW5nIGluc3RhbmNlCi0JCVN0cmluZyBhbGxUZXh0ID0gYWxsVGV4dEJ1ZmZlci50b1N0cmluZygpOwotCQlJRG9jdW1lbnQgdGVtcERvYyA9IG5ldyBEb2N1bWVudChhbGxUZXh0KTsKLQkJaWYgKGxpbmVEZWxpbWl0ZXJUb1VzZSA9PSBudWxsKQotCQkJbGluZURlbGltaXRlclRvVXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBuZXdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbGluZUNvdW50ID0gdGVtcERvYy5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uIGxpbmVJbmZvID0gdGVtcERvYy5nZXRMaW5lSW5mb3JtYXRpb24oaSk7Ci0JCQkJaW50IGxpbmVTdGFydE9mZnNldCA9IGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJCWludCBsaW5lTGVuZ3RoID0gbGluZUluZm8uZ2V0TGVuZ3RoKCk7Ci0JCQkJaW50IGxpbmVFbmRPZmZzZXQgPSBsaW5lU3RhcnRPZmZzZXQgKyBsaW5lTGVuZ3RoOwotCQkJCW5ld1RleHQuYXBwZW5kKGFsbFRleHQuc3Vic3RyaW5nKGxpbmVTdGFydE9mZnNldCwgbGluZUVuZE9mZnNldCkpOwotCQkJCWlmICgoaSA8IGxpbmVDb3VudCAtIDEpICYmICh0ZW1wRG9jLmdldExpbmVEZWxpbWl0ZXIoaSkgIT0gbnVsbCkpCi0JCQkJCW5ld1RleHQuYXBwZW5kKGxpbmVEZWxpbWl0ZXJUb1VzZSk7Ci0JCQl9Ci0JCQljYXRjaCAob3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkvLyBzaG91bGQgZml4IHVwIHRvIGVpdGhlciB0aHJvdyBub3RoaW5nLCBvciB0aGUgcmlnaHQgdGhpbmcsCi0JCQkJLy8gYnV0Ci0JCQkJLy8gaW4gdGhlIGNvdXJzZSBvZiByZWZhY3RvcmluZywgdGhpcyB3YXMgZWFzaWVzdCAicXVpY2sgZml4Ii4KLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdUZXh0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIElFbmNvZGVkRG9jdW1lbnQsIHRoYXQgaGFzCi0JICogYmVlbiBpbml0aWFsaXplZCB3aXRoIGFwcHJvcHJpYXRlIHBhcnNlci4gRm9yIG1hbnkgbG9hZGVycywgdGhlCi0JICogKGRlZmF1bHQpIHBhcnNlciB1c2VkIGlzIGtub3duIGZvciBhbnkgaW5wdXQuIEZvciBvdGhlcnMsIHRoZSBjb3JyZWN0Ci0JICogcGFyc2VyIChhbmQgaXRzIGluaXRpYWxpemF0aW9uKSBpcyBub3JtYWxseSBkZXBlbmRlbnQgb24gdGhlIGNvbnRlbnQgb2YKLQkgKiB0aGUgZmlsZS4gVGhpcyBuby1hcmd1bWVudCBtZXRob2Qgc2hvdWxkIGFzc3VtZSAiZW1wdHkgaW5wdXQiIGFuZCB3b3VsZAotCSAqIHRoZXJlZm9yZSByZXR1cm4gdGhlIGRlZmF1bHQgcGFyc2VyIGZvciB0aGUgZGVmYXVsdCBjb250ZW50VHlwZS4KLQkgKi8KLQlwdWJsaWMgSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbmV3RW5jb2RlZERvY3VtZW50KCk7Ci0JCS8vIE1ha2Ugc3VyZSBldmVyeSBzdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGFuIEVuY29kaW5nIE1lbWVudG8sCi0JCS8vIHdoaWNoIGlzIHRoZSBkZWZhdWx0IG9uZSBmb3IgImVtcHR5IiBzdHJ1Y3R1cmVkRG9jdW1lbnRzCi0JCVN0cmluZyBjaGFyc2V0ID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLnVzZURlZmF1bHROYW1lUnVsZXMoZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkpOwotCQlTdHJpbmcgc3BlY0RlZmF1bHRDaGFyc2V0ID0gZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKENvZGVkSU8uY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGNoYXJzZXQsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCwgc3BlY0RlZmF1bHRDaGFyc2V0KSk7Ci0KLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKG51bGwpOwotCQlpZiAobGluZURlbGltaXRlciAhPSBudWxsKQotCQkJc3RydWN0dXJlZERvY3VtZW50LnNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIobGluZURlbGltaXRlcik7Ci0KLQkJSURvY3VtZW50UGFydGl0aW9uZXIgZGVmYXVsdFBhcnRpdGlvbmVyID0gZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMpIHsKLQkJCSgoSURvY3VtZW50RXh0ZW5zaW9uMykgc3RydWN0dXJlZERvY3VtZW50KS5zZXREb2N1bWVudFBhcnRpdGlvbmVyKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIGRlZmF1bHRQYXJ0aXRpb25lcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihkZWZhdWx0UGFydGl0aW9uZXIpOwotCQl9Ci0JCWRlZmF1bHRQYXJ0aXRpb25lci5jb25uZWN0KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFic3RyYWN0IHZlcnNpb24gc2hvdWxkIGhhbmRsZSBtb3N0IGNhc2VzLCBidXQgd29uJ3QgaWYKLQkgKiBjb250ZW50VHlwZSBpcyBzZW5zaXRpdmUgdG8gZW5jb2RpbmcsIGFuZC9vciBlbWJlZGRlZCB0eXBlcwotCSAqLwotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoaUZpbGUpOwotCQlpZiAobGluZURlbGltaXRlciAhPSBudWxsKQotCQkJc3RydWN0dXJlZERvY3VtZW50LnNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIobGluZURlbGltaXRlcik7Ci0KLQkJdHJ5IHsKLQotCQkJQ29kZWRSZWFkZXJDcmVhdG9yIGNyZWF0b3IgPSBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKTsKLQkJCWNyZWF0b3Iuc2V0KGlGaWxlKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBjcmVhdG9yLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LnNldEVuY29kaW5nTWVtZW50byhmRW5jb2RpbmdNZW1lbnRvKTsKLQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIgPSBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKS5nZXRDb2RlZFJlYWRlcigpOwotCi0JCQlzZXREb2N1bWVudENvbnRlbnRzRnJvbVJlYWRlcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZGdWxsUHJlcGFyZWRSZWFkZXIpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgIT0gbnVsbCkgewotCQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCX0KLQotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZW5hbWUgPT0gbnVsbCAmJiBpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGhhdmUgYm90aCBudWxsIGZpbGVuYW1lIGFuZCBpbnB1dHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29kZWRSZWFkZXJDcmVhdG9yIGNvZGVkUmVhZGVyQ3JlYXRvciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpOwotCQl0cnkgewotCQkJY29kZWRSZWFkZXJDcmVhdG9yLnNldChmaWxlbmFtZSwgaW5wdXRTdHJlYW0pOwotCQkJY29kZWRSZWFkZXJDcmVhdG9yLnNldEVuY29kaW5nUnVsZShlbmNvZGluZ1J1bGUpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IGNvZGVkUmVhZGVyQ3JlYXRvci5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIgPSBjb2RlZFJlYWRlckNyZWF0b3IuZ2V0Q29kZWRSZWFkZXIoKTsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5zZXRFbmNvZGluZ01lbWVudG8oZkVuY29kaW5nTWVtZW50byk7Ci0JCQlzZXREb2N1bWVudENvbnRlbnRzRnJvbVJlYWRlcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZGdWxsUHJlcGFyZWRSZWFkZXIpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUgaW4gdGhpcyBjb250ZXh0Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoZkZ1bGxQcmVwYXJlZFJlYWRlciAhPSBudWxsKSB7Ci0JCQkJZkZ1bGxQcmVwYXJlZFJlYWRlci5jbG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRDaGFyUG9zdGlvbk9mRmFpbHVyZShCdWZmZXJlZFJlYWRlciBpbnB1dFN0cmVhbSkgewotCQlpbnQgY2hhclBvc2l0aW9uID0gMTsKLQkJaW50IGNoYXJSZWFkID0gLTE7Ci0JCWJvb2xlYW4gZXJyb3JGb3VuZCA9IGZhbHNlOwotCQlkbyB7Ci0JCQl0cnkgewotCQkJCWNoYXJSZWFkID0gaW5wdXRTdHJlYW0ucmVhZCgpOwotCQkJCWNoYXJQb3NpdGlvbisrOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB0aGlzIGlzIGV4cGVjdGVkLCBzaW5jZSB3ZSdyZSBleHBlY3RpbmcgZmFpbHVyZSwKLQkJCQkvLyBzbyBubyBuZWVkIHRvIGRvIGFueXRoaW5nLgotCQkJCWVycm9yRm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXdoaWxlICghKGNoYXJSZWFkID09IC0xIHx8IGVycm9yRm91bmQpKTsKLQotCQlpZiAoZXJyb3JGb3VuZCkKLQkJCS8vIGRtdywgYmxpbmRseSBtb2RpZmllZCB0byArMSB0byBnZXQgdW5pdCB0ZXN0cyB0byB3b3JrLCBtb3ZpbmcKLQkJCS8vIGZyb20gSmF2YSAxLjMsIHRvIDEuNAotCQkJLy8gbm90IHN1cmUgaG93L3doeSB0aGlzIGJlaGF2aW9yIHdvdWxkIGhhdmUgY2hhbmdlZC4gKEl0cyBhcyBpZgotCQkJLy8gJ3JlYWQnIGlzIHJlcG9ydGluZyBlcnJvcgotCQkJLy8gb25lIGNoYXJhY3RlciBlYXJseSkuCi0JCQlyZXR1cm4gY2hhclBvc2l0aW9uICsgMTsKLQkJZWxzZQotCQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29kZWRSZWFkZXJDcmVhdG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2RlZFJlYWRlckNyZWF0b3IgZ2V0Q29kZWRSZWFkZXJDcmVhdG9yKCkgewotCQlpZiAoZkNvZGVkUmVhZGVyQ3JlYXRvciA9PSBudWxsKSB7Ci0JCQlmQ29kZWRSZWFkZXJDcmVhdG9yID0gbmV3IENvZGVkUmVhZGVyQ3JlYXRvcigpOwotCQl9Ci0JCXJldHVybiBmQ29kZWRSZWFkZXJDcmVhdG9yOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHBhcnRpdGlvbmVyIHRvIGJlIHVzZWQgd2l0aCB0aGUKLQkgKiBJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HIHBhcnRpdGlvbmluZwotCSAqIAotCSAqIEByZXR1cm4gSURvY3VtZW50UGFydGl0aW9uZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuY29kaW5nTWVtZW50by4KLQkgKiAKLQkgKiBAcmV0dXJuIEVuY29kaW5nTWVtZW50bwotCSAqLwotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgewotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9ncmFtIEVycm9yOiBlbmNvZGluZ01lbWVudG8gd2FzIGFjY2Vzc2VkIGJlZm9yZSBpdCB3YXMgc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZkVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZ1bGxQcmVwYXJlZFJlYWRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVhZGVyIGdldEZ1bGxQcmVwYXJlZFJlYWRlcigpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmRnVsbFByZXBhcmVkUmVhZGVyID09IG51bGwpIHsKLQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIgPSBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKS5nZXRDb2RlZFJlYWRlcigpOwotCQl9Ci0JCXJldHVybiBmRnVsbFByZXBhcmVkUmVhZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgbGluZSBkZWxpbWl0ZXIgcHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBsaW5lIGRlbGltaXRlcgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQbGF0Zm9ybUxpbmVEZWxpbWl0ZXJQcmVmZXJlbmNlKElGaWxlIGZpbGUpIHsKLQkJSVNjb3BlQ29udGV4dFtdIHNjb3BlQ29udGV4dDsKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQkvLyBwcm9qZWN0IHByZWZlcmVuY2UKLQkJCXNjb3BlQ29udGV4dCA9IG5ldyBJU2NvcGVDb250ZXh0W117bmV3IFByb2plY3RTY29wZShmaWxlLmdldFByb2plY3QoKSl9OwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoUGxhdGZvcm0uUElfUlVOVElNRSwgUGxhdGZvcm0uUFJFRl9MSU5FX1NFUEFSQVRPUiwgbnVsbCwgc2NvcGVDb250ZXh0KTsKLQkJCWlmIChsaW5lRGVsaW1pdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGxpbmVEZWxpbWl0ZXI7Ci0JCX0KLQkJLy8gd29ya3NwYWNlIHByZWZlcmVuY2UKLQkJc2NvcGVDb250ZXh0ID0gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgSW5zdGFuY2VTY29wZSgpfTsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFN0cmluZyhQbGF0Zm9ybS5QSV9SVU5USU1FLCBQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCBudWxsLCBzY29wZUNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKElGaWxlKSBpbnN0ZWFkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBzdWJjbGFzcyBkb2Vzbid0IGltcGxlbWVudCwgcmV0dXJuIHBsYXRmb3JtIGRlZmF1bHQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gZ2V0UGxhdGZvcm1MaW5lRGVsaW1pdGVyUHJlZmVyZW5jZShmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBBIHV0aWxpdHkgbWV0aG9kLCBidXQgZGVwZW5kcyBvbiBzdWJjbGFzc2VzIHRvIGltcGxpbWVudCB0aGUgcHJlZmVycmVkCi0JICogZW5kIG9mIGxpbmUgZm9yIGEgcGFydGljdWxhciBjb250ZW50IHR5cGUuIE5vdGU6IHN1YmNsYXNzZXMgc2hvdWxkIG5vdAotCSAqIHJlLWltcGxlbWVudCB0aGlzIG1ldGhvZCAodGhlcmUncyBubyByZWFzb24gdG8sIGV2ZW4gdGhvdWdoIGl0cyBwYXJ0IG9mCi0JICogaW50ZXJmYWNlKS4gVGhpcyBtZXRob2Qgbm90IG9ubHkgY29udmVydHMgZW5kLW9mLWxpbmUgY2hhcmFjdGVycywgaWYKLQkgKiBuZWVkZWQsIGJ1dCBzZXRzIHRoZSBjb3JyZWN0IGVuZC1vZi1saW5lIGRlbGltaXRlciBpbgotCSAqIHN0cnVjdHVyZWREb2N1bWVudC4gTWlub3Igbm90ZTogY2FuJ3QgdXNlIHRoaXMgZXhhY3QgbWV0aG9kIGluIGR1bXBlcnMsCi0JICogc2luY2UgdGhlIGRlY2lzaW9uIHRvIGNoYW5nZSBvciBub3QgaXMgYSBsaXR0bGUgZGlmZmVyZW50LCBhbmQgc2luY2UKLQkgKiB0aGVyZSB3ZSBoYXZlIHRvIGNoYW5nZSB0ZXh0IG9mIHN0cnVjdHVyZWREb2N1bWVudCBpZiBmb3VuZCB0byBuZWVkCi0JICogY29udmVyc2lvbi4gKFdoZXJlIGFzIGZvciBsb2FkaW5nLCB3ZSBhc3N1bWUgd2UgaGF2ZW4ndCB5ZXQgc2V0IHRleHQgaW4KLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGJ1dCB3aWxsIGJlIGRvbmUgYnkgb3RoZXIgbWV0aG9kIGp1c3QgYSB0aW55IGJpeQotCSAqIGxhdGVyKS4gTmVlZHMgdG8gYmUgcHVibGljIHRvIGhhbmRsZSBpbnRlcmZhY2UuIEl0IGlzIGluIHRoZSBpbnRlcmZhY2UKLQkgKiBqdXN0IHNvIE1vZGVsTWFuYWdlckltcGwgY2FuIHVzZSBpdCBpbiBhIHNwZWNpYWwgY2lyY3Vtc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgaGFuZGxlTGluZURlbGltaXRlcihTdHJpbmdCdWZmZXIgb3JpZ2luYWxTdHJpbmcsIElFbmNvZGVkRG9jdW1lbnQgdGhlRmxhdE1vZGVsKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gaGFuZGxlIGxpbmUgZGVsaW1pdGVycyBzbyBNYXJrZXIgUG9zaXRpb25zIGFyZQotCQkvLyB1cGRhdGVkCi0JCVN0cmluZ0J1ZmZlciBjb252ZXJ0ZWRUZXh0ID0gbnVsbDsKLQkJLy8gYmFzZWQgb24gdGV4dCwgbWFrZSBhIGd1ZXNzIG9uIHdoYXQncyBiZWluZyB1c2VkIGFzCi0JCS8vIGxpbmUgZGVsaW1pdGVyCi0JCVN0cmluZyBwcm9iYWJsZUxpbmVEZWxpbWl0ZXIgPSBUZXh0VXRpbGl0aWVzLmRldGVybWluZUxpbmVEZWxpbWl0ZXIob3JpZ2luYWxTdHJpbmcsIHRoZUZsYXRNb2RlbC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCksIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHByZWZlcnJlZExpbmVEZWxpbWl0ZXIgPSBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKG51bGwpOwotCQlpZiAocHJlZmVycmVkTGluZURlbGltaXRlciA9PSBudWxsKSB7Ci0JCQkvLyB3aGVuIHByZWZlcnJlZExpbmVEZWxpbWl0ZXIgaXMgbnVsbCwgaXQgbWVhbnMgImxlYXZlIGFsb25lIgotCQkJLy8gc28gbm8gY29udmVyc2lvbiBuZWVkZWQuCi0JCQkvLyBzZXQgaGVyZSwgb25seSBpZiBudWxsIChzaG91bGQgYWxyZWFkeSBiZSBzZXQsIGJ1dCBpZiBub3QsCi0JCQkvLyB3ZSdsbCBzZXQgc28gYW55IHN1YnNlcXVlbnQgZWRpdGluZyBpbnNlcnRzIHdoYXQgd2UncmUKLQkJCS8vIGFzc3VtaW5nKQotCQkJaWYgKCF0aGVGbGF0TW9kZWwuZ2V0UHJlZmVycmVkTGluZURlbGltaXRlcigpLmVxdWFscyhwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpKSB7Ci0JCQkJdGhlRmxhdE1vZGVsLnNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIocHJvYmFibGVMaW5lRGVsaW1pdGVyKTsKLQkJCX0KLQkJCWNvbnZlcnRlZFRleHQgPSBvcmlnaW5hbFN0cmluZzsKLQkJfQotCQllbHNlIHsKLQkJCWlmICghcHJlZmVycmVkTGluZURlbGltaXRlci5lcXVhbHMocHJvYmFibGVMaW5lRGVsaW1pdGVyKSkgewotCQkJCS8vIHRlY2huaWNhbGx5LCB3b3VsZG4ndCBoYXZlIHRvIGNvbnZlcnQgbGluZSBkZWxpbWl0ZXJzCi0JCQkJLy8gaGVyZSBhdCBiZWdpbm5pbmcsIGJ1dCB3aGVuIHdlIHNhdmUsIGlmIHRoZSBwcmVmZXJyZWQKLQkJCQkvLyBsaW5lIGRlbGltdGVyIGlzICJsZWF2ZSBhbG9uZSIgdGhlbiB3ZSBkbyBsZWF2ZSBhbG9uZSwKLQkJCQkvLyBzbyBiZXN0IHRvIGJlIHJpZ2h0IGZyb20gYmVnaW5uaW5nLgotCQkJCWNvbnZlcnRlZFRleHQgPSBjb252ZXJ0TGluZURlbGltaXRlcnMob3JpZ2luYWxTdHJpbmcsIHByZWZlcnJlZExpbmVEZWxpbWl0ZXIpOwotCQkJCXRoZUZsYXRNb2RlbC5zZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKHByZWZlcnJlZExpbmVEZWxpbWl0ZXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhleSBhcmUgYWxyZWFkeSB0aGUgc2FtZSwgbm8gY29udmVyc2lvbiBuZWVkZWQKLQkJCQl0aGVGbGF0TW9kZWwuc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihwcmVmZXJyZWRMaW5lRGVsaW1pdGVyKTsKLQkJCQljb252ZXJ0ZWRUZXh0ID0gb3JpZ2luYWxTdHJpbmc7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRlZFRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IElFbmNvZGVkRG9jdW1lbnQgbmV3RW5jb2RlZERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBWZXJ5IG1lY2hhbmljYWwgbWV0aG9kLCBqdXN0IHRvIHJlYWQgdGhlIGNoYXJhY3RlcnMsIG9uY2UgdGhlIHJlYWRlciBpcwotCSAqIGNvcnJlY3RseSBjcmVhdGVkLiBDYW4gdGhyb3cgTWFsRm9ybWVkSW5wdXRFeGNlcHRpb24uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgcmVhZElucHV0U3RyZWFtKFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJaW50IGZCbG9ja3NSZWFkID0gMDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG51bVJlYWQgPSAwOwotCQl0cnkgewotCQkJY2hhciB0QnVmZltdID0gbmV3IGNoYXJbQ29kZWRJTy5NQVhfQlVGX1NJWkVdOwotCQkJd2hpbGUgKG51bVJlYWQgIT0gLTEpIHsKLQkJCQludW1SZWFkID0gcmVhZGVyLnJlYWQodEJ1ZmYsIDAsIHRCdWZmLmxlbmd0aCk7Ci0JCQkJaWYgKG51bVJlYWQgPiAwKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQodEJ1ZmYsIDAsIG51bVJlYWQpOwotCQkJCQlmQmxvY2tzUmVhZCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IE1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbChmRW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpLCBmQmxvY2tzUmVhZCAqIENvZGVkSU8uTUFYX0JVRl9TSVpFICsgbnVtUmVhZCArIGUuZ2V0SW5wdXRMZW5ndGgoKSk7Ci0JCX0KLQkJY2F0Y2ggKFVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IE1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbChmRW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpLCBmQmxvY2tzUmVhZCAqIENvZGVkSU8uTUFYX0JVRl9TSVpFICsgbnVtUmVhZCArIGUuZ2V0SW5wdXRMZW5ndGgoKSk7Ci0KLQkJfQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbG9hZChJRW5jb2RlZERvY3VtZW50IGVuY29kZWREb2N1bWVudCwgUmVhZGVyIGlucHV0U3RyZWFtUmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaW5wdXRTdHJlYW1SZWFkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3RyZWFtIHJlYWRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWludCBSRUFEX0JVRkZFUl9TSVpFID0gODE5MjsKLQkJaW50IE1BWF9CVUZGRVJFRF9TSVpFX0ZPUl9SRVNFVF9NQVJLID0gMjAwMDAwOwotCQkvLyB0ZW1wIC4uLi4gZXZlbnR1YWxseSB3ZSdsbGwgb25seSByZWFkIGFzIG5lZWRlZAotCQlCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpbnB1dFN0cmVhbVJlYWRlciwgTUFYX0JVRkZFUkVEX1NJWkVfRk9SX1JFU0VUX01BUkspOwotCQlidWZmZXJlZFJlYWRlci5tYXJrKE1BWF9CVUZGRVJFRF9TSVpFX0ZPUl9SRVNFVF9NQVJLKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJ5IHsKLQkJCWludCBudW1SZWFkID0gMDsKLQkJCWNoYXIgdEJ1ZmZbXSA9IG5ldyBjaGFyW1JFQURfQlVGRkVSX1NJWkVdOwotCQkJd2hpbGUgKChudW1SZWFkID0gYnVmZmVyZWRSZWFkZXIucmVhZCh0QnVmZiwgMCwgdEJ1ZmYubGVuZ3RoKSkgIT0gLTEpIHsKLQkJCQlidWZmZXIuYXBwZW5kKHRCdWZmLCAwLCBudW1SZWFkKTsKLQkJCX0KLQkJCS8vIHJlbWVtYmVyIC0tIHdlIGRpZG4ndCBvcGVuIHN0cmVhbSAuLi4gc28gd2UgZG9uJ3QgY2xvc2UgaXQKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJLy8gaW50IHBvcyA9IGUuZ2V0SW5wdXRMZW5ndGgoKTsKLQkJCUVuY29kaW5nTWVtZW50byBsb2NhbEVuY29kaW5nTWVtZW50byA9IGdldEVuY29kaW5nTWVtZW50bygpOwotCQkJYm9vbGVhbiBjb3VsZFJlc2V0ID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmNvZGluZ05hbWVJbkVycm9yID0gbG9jYWxFbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0JCQlpZiAoZW5jb2RpbmdOYW1lSW5FcnJvciA9PSBudWxsKSB7Ci0JCQkJZW5jb2RpbmdOYW1lSW5FcnJvciA9IGxvY2FsRW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJYnVmZmVyZWRSZWFkZXIucmVzZXQoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiByZXNldEV4Y2VwdGlvbikgewotCQkJCS8vIHRoZSBvbmx5IGVycnJvIHRoYXQgY2FuIG9jY3VyIGR1cmluZyByZXNldCBpcyBhbgotCQkJCS8vIElPRXhjZXB0aW9uCi0JCQkJLy8gZHVlIHRvIGFscmVhZHkgYmVpbmcgcGFzdCB0aGUgcmVzdCBtYXJrLiBJbiB0aGF0IGNhc2UsIHdlCi0JCQkJLy8gdGhyb3cgbW9yZSBnZW5lcmljIG1lc3NhZ2UKLQkJCQljb3VsZFJlc2V0ID0gZmFsc2U7Ci0JCQl9Ci0JCQkvLyAtMSBjYW4gYmUgdXNlZCBieSBVSSBsYXllciBhcyBhIGNvZGUgdGhhdCAicG9zaXRpb24gY291bGQgbm90Ci0JCQkvLyBiZQotCQkJLy8gZGV0ZXJtaW5lZCIKLQkJCWludCBjaGFyUG9zdGlvbiA9IC0xOwotCQkJaWYgKGNvdWxkUmVzZXQpIHsKLQotCQkJCWNoYXJQb3N0aW9uID0gZ2V0Q2hhclBvc3Rpb25PZkZhaWx1cmUoYnVmZmVyZWRSZWFkZXIpOwotCQkJCS8vIGdldENoYXJQb3N0aW9uT2ZGYWlsdXJlKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpblN0cmVhbSwKLQkJCQkvLyBqYXZhRW5jb2RpbmdOYW1lSW5FcnJvcikpOwotCQkJfQotCQkJLy8gYWxsIG9mIHRoYXQganVzdCB0byB0aHJvdyBtb3JlIGFjY3VyYXRlIGVycm9yCi0JCQkvLyBub3RlOiB3ZSBkbyB0aGUgY29udmVyc2lvbiB0byBpYW5hTmFtZSwgaW5zdGVhZCBvZiB1c2luZyB0aGUKLQkJCS8vIGxvY2FsCi0JCQkvLyB2YXJpYWJsZSwKLQkJCS8vIGJlY2F1c2UgdGhpcyBpcyB1bHRpbWF0ZWx5IG9ubHkgZm9yIHRoZSB1c2VyIGVycm9yIG1lc3NhZ2UKLQkJCS8vICh0aGF0Ci0JCQkvLyBpcywKLQkJCS8vIHRoZSBlcnJvciBvY2N1cnJlZAotCQkJLy8gaW4gY29udGV4dCBvZiBqYXZhRW5jb2RpbmdOYW1lIG5vIG1hdHRlciB3aGF0IGlhbmFFbmNvZGluZ05hbWUKLQkJCS8vIGlzCi0JCQl0aHJvdyBuZXcgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKGVuY29kaW5nTmFtZUluRXJyb3IsIENvZGVkSU8uZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChlbmNvZGluZ05hbWVJbkVycm9yKSwgY2hhclBvc3Rpb24sICFjb3VsZFJlc2V0LCBNQVhfQlVGRkVSRURfU0laRV9GT1JfUkVTRVRfTUFSSyk7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHN0cmluZ2J1ZmZlciA9IGJ1ZmZlcjsKLQkJZW5jb2RlZERvY3VtZW50LnNldChzdHJpbmdidWZmZXIudG9TdHJpbmcoKSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnRzRnJvbVJlYWRlcihJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlTdHJpbmdCdWZmZXIgYWxsVGV4dCA9IHJlYWRJbnB1dFN0cmVhbShyZWFkZXIpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0KGFsbFRleHQudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTI4MDA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotCi0vKioKLSAqIEEgamF2YS5pby5SZWFkZXIgdGhhdCBjYW4gb3BlcmF0ZSBvZmYgb2YgYW4gSURvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgbWFyayA9IDA7Ci0JcHJpdmF0ZSBpbnQgcG9zaXRpb24gPSAwOwotCi0JcHVibGljIERvY3VtZW50UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBEb2N1bWVudFJlYWRlcihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhpcyhkb2N1bWVudCwgMCk7Ci0JfQotCi0JcHVibGljIERvY3VtZW50UmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCwgaW50IGluaXRpYWxQb3NpdGlvbikgewotCQlzdXBlcigpOwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJcG9zaXRpb24gPSBpbml0aWFsUG9zaXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5SZWFkZXIjbWFyayhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW1hcmsgPSBwb3NpdGlvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhcltdIGNidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmKGZEb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQkKLQkJY2hhcltdIHJlYWRDaGFycyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAocG9zaXRpb24gPj0gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJCXJldHVybiAtMTsKLQkJCS8vIHRoZSBJRG9jdW1lbnQgaXMgbGlrZWx5IHVzaW5nIGEgR2FwVGV4dFN0b3JlLCBzbyB3ZSBjYW4ndAotCQkJLy8gcmV0cmlldmUgYSBjaGFyW10gZGlyZWN0bHkKLQkJCWlmIChwb3NpdGlvbiArIGxlbiA+IGZEb2N1bWVudC5nZXRMZW5ndGgoKSkKLQkJCQlyZWFkQ2hhcnMgPSBmRG9jdW1lbnQuZ2V0KHBvc2l0aW9uLCBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSBwb3NpdGlvbikudG9DaGFyQXJyYXkoKTsKLQkJCWVsc2UKLQkJCQlyZWFkQ2hhcnMgPSBmRG9jdW1lbnQuZ2V0KHBvc2l0aW9uLCBsZW4pLnRvQ2hhckFycmF5KCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHJlYWRDaGFycywgMCwgY2J1Ziwgb2ZmLCByZWFkQ2hhcnMubGVuZ3RoKTsKLQkJCS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIiArIHBvc2l0aW9uICsgIjoiICsgcmVhZENoYXJzLmxlbmd0aCArICIgIgotCQkJLy8gKyBTdHJpbmdVdGlscy5lc2NhcGUobmV3IFN0cmluZyhyZWFkQ2hhcnMpKSk7Ci0JCQlwb3NpdGlvbiArPSByZWFkQ2hhcnMubGVuZ3RoOwotCQkJcmV0dXJuIHJlYWRDaGFycy5sZW5ndGg7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSByZWFkaW5nIGZyb20gSURvY3VtZW50OiAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5SZWFkZXIjcmVzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcG9zaXRpb24gPSBtYXJrOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KElEb2N1bWVudCBkb2N1bWVudCwgaW50IGluaXRpYWxQb3NpdGlvbikgewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJcG9zaXRpb24gPSBpbml0aWFsUG9zaXRpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLlJlYWRlciNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoaW50IHBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcG9zaXRpb24gPSBwb3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLlJlYWRlciNza2lwKGxvbmcpCi0JICovCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmKGZEb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0KLQkJbG9uZyBza2lwcGVkID0gbjsKLQkJaWYgKHBvc2l0aW9uICsgbiA+IGZEb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJc2tpcHBlZCA9IGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIHBvc2l0aW9uOwotCQkJcG9zaXRpb24gPSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCX0gZWxzZSB7Ci0JCQlwb3NpdGlvbiArPSBuOwotCQl9Ci0JCXJldHVybiBza2lwcGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSURvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWE4YjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSURvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGV4dGVuZHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQl2b2lkIHNldChJRG9jdW1lbnQgZG9jdW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JRG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSURvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZWZmMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JRG9jdW1lbnRMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBtZXRob2RzIGZvciB0aGUgY3JlYXRpb24gb2YgYW4gSVN0cnVjdHVyZWREb2N1bWVudCBjb3JyZWN0bHkKLSAqIHByZXBhcmVkIHRvIHdvcmsgd2l0aCBhIHBhcnRpY3VsYXIgdHlwZSBvZiBjb250ZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudExvYWRlciB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGEgbmV3IElTdHJ1Y3R1cmVkRG9jdW1lbnQgcHJlcGFyZWQgYnkgdGhpcyBsb2FkZXIKLQkgKi8KLQlJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JLyoqCi0JICogVGhpcyBBUEkgaXMgbGlrZSBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQsIGV4Y2VwdCBpdCBzaG91bGQgcG9wdWxhdGUKLQkgKiB0aGUgc3RydWN0dXJlZERvY3VtZW50IHdpdGggdGhlIGNvbnRlbnRzIG9mIElGaWxlLiBBbHNvLCB0aG9zZQotCSAqIFN0cnVjdHVyZWREb2N1bWVudHMgd2hpY2ggYXJlIHNlbnNpdGl2ZSB0byB0aGUgaW5wdXQgKHRoYXQgaXMsIHRoZQotCSAqIHBhcnNlciBvciBwYXJzZXIgaW5pdGlhbGl6YXRpb24gbXkgcmVxdWlyZSB0aGUgaW5wdXQpIHNob3VsZAotCSAqIGFkZGl0aW9uYWxseSBpbml0aWFsaXplIHRoZSBwYXJzZXIsIGV0Yy4sIGFwcHJvcHJpYXRlIHRvIHRoZSBpbnB1dC4KLQkgKiAKLQkgKiBBcyBhbHdheXMsIHRoZSBhcHByb3ByaWF0ZSBkZWNvZGluZyBzaG91bGQgYmUgdXNlZC4KLQkgKi8KLQlJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChJRmlsZSBpRmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBJRW5jb2RlZERvY3VtZW50LCB0aGF0IGhhcwotCSAqIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhcHByb3ByaWF0ZSBwYXJzZXIuIEZvciBtYW55IGxvYWRlcnMsIHRoZQotCSAqIChkZWZhdWx0KSBwYXJzZXIgdXNlZCBpcyBrbm93biBmb3IgYW55IGlucHV0LiBGb3Igb3RoZXJzLCB0aGUgY29ycmVjdAotCSAqIHBhcnNlciAoYW5kIGl0cyBpbml0aWFsaXphdGlvbikgaXMgbm9ybWFsbHkgZGVwZW5kZW50IG9uIHRoZSBjb250ZW50IG9mCi0JICogdGhlIGZpbGUuIFRoaXMgbm8tYXJndW1lbnQgbWV0aG9kIHNob3VsZCBhc3N1bWUgImVtcHR5IGlucHV0IiBhbmQgd291bGQKLQkgKiB0aGVyZWZvcmUgcmV0dXJuIHRoZSBkZWZhdWx0IHBhcnNlciBmb3IgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuCi0JICovCi0JSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpc3RyZWFtKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCUlFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaXN0cmVhbSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25lcgotCSAqLwotCUlEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCk7Ci0KLQlJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCk7Ci0KLQkvKioKLQkgKiBBIHV0aWxpdHkgbWV0aG9kLCBidXQgZGVwZW5kcyBvbiBzdWJjbGFzc2VzIHRvIGltcGxlbWVudCB0aGUgcHJlZmVycmVkCi0JICogZW5kIG9mIGxpbmUgZm9yIGEgcGFydGljdWxhciBjb250ZW50IHR5cGUuIE5vdGU6IHN1YmNsYXNzZXMgc2hvdWxkIG5vdAotCSAqIHJlLWltcGxlbWVudCB0aGlzIG1ldGhvZCAodGhlcmUncyBubyByZWFzb24gdG8sIGV2ZW4gdGhvdWdoIGl0cyBwYXJ0IG9mCi0JICogaW50ZXJmYWNlKS4gVGhpcyBtZXRob2Qgbm90IG9ubHkgY29udmVydHMgZW5kLW9mLWxpbmUgY2hhcmFjdGVycywgaWYKLQkgKiBuZWVkZWQsIGJ1dCBzZXRzIHRoZSBjb3JyZWN0IGVuZC1vZi1saW5lIGRlbGltaXRlciBpbgotCSAqIHN0cnVjdHVyZWREb2N1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGVpdGhlciB0aGUgb3JpZ2luYWwgc3RyaW5nLAotCSAqIGlmIG5vIGNvbnZlcnNpb24gaXMgbmVlZGVkLCBvciBhIG5ldyBzdHJpbmcgd2l0aCBlbmQtb2YtbGluZXMKLQkgKiBjb252ZXJ0ZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSB0aGUgY29udGVudCdzIGxpbmUgZGVsaW1pdGVycyBzaG91bGQgYmUgcHJlc2VydmVkCi0JICovCi0JU3RyaW5nQnVmZmVyIGhhbmRsZUxpbmVEZWxpbWl0ZXIoU3RyaW5nQnVmZmVyIG9yaWdpbmFsU3RyaW5nLCBJRW5jb2RlZERvY3VtZW50IHRoZVN0cnVjdHVyZWREb2N1bWVudCk7Ci0KLQl2b2lkIHJlbG9hZChJRW5jb2RlZERvY3VtZW50IGRvY3VtZW50LCBSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTYxOGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBBdCB0aGUgbW9tZW50LCB0aGlzIGlzIHByaW1hcmlseSBpbnRlbmRlZCBhcyBhIGNvbnZlbmllbmNlIHRvIGhlbHAgc3dpdGNoCi0gKiBiZXR3ZWVuIHZhcmlvdXMgdHlwZXMgb2YgdGhyZWFkaW5nIG1vZGVscyBpbiB0aGUgZG9jdW1lbnQsIGFsbCBpbiBhIGNlbnRyYWwKLSAqIHBpZWNlIG9mIGNvZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV1JJVEVfU1lOQ0hST05JWkVEID0gMzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVCA9IFdSSVRFX1NZTkNIUk9OSVpFRDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5TWU5DSFJPTklaRUQgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShpbnQgdHlwZSwgUmVnaW9uUGFyc2VyIHBhcnNlcikgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBVTlNZTkNIUk9OSVpFRCA6Ci0JCQkJcmVzdWx0ID0gbmV3IEJhc2ljU3RydWN0dXJlZERvY3VtZW50KHBhcnNlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdSSVRFX1NZTkNIUk9OSVpFRCA6Ci0JCQkJcmVzdWx0ID0gbmV3IEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQocGFyc2VyKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVxdWVzdCBkb2N1bWVudCB0eXBlIHdhcyBub3Qga25vd24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgKHN5c3RlbSBkZWZhdWx0KSBzdHJ1Y3R1cmVkIGRvY3VtZW50IGluaXRpYWxpemVkIHdpdGggdGhlCi0JICogcGFyc2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJzZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKFJlZ2lvblBhcnNlciBwYXJzZXIpIHsKLQkJcmV0dXJuIGdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKERFRkFVTFQsIHBhcnNlcik7Ci0JfQotCi0JLyoqCi0JICogTm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZAotCSAqIAotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RleHRVdGlsaXRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWVjNTk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIHRleHQgZnVuY3Rpb25zLgotICogCi0gKiBAZGVwcmVjYXRlZCAtIG1hcmtlZCBhcyBkZXByZWNhdGVkIHRvIHJlbWluZCB1cyB0byBwaGFzZSB0aGlzIG91dCAoYW5kL29yCi0gKiAgICAgICAgICAgICBtb3ZlIHRvICJmaW5pc2hlZCIgdmVyc2lvbikuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0VXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGlmIHBvc3NpYmxlLCBpdHMgYmVzdCB0byB1c2UKLQkgKiAgICAgICAgICAgICBJRG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBmZ0RlbGltaXRlcnMgPSBuZXcgU3RyaW5nW117IlxuIiwgIlxyIiwgIlxyXG4ifTsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIERldGVybWluZXMgd2hpY2ggb25lIG9mIGZnRGVsaW1pdGVycyBhcHBlYXJzIGZpcnN0IGluIHRoZSB0ZXh0LiBJZiBub25lCi0JICogb2YgdGhlbSB0aGUgaGludCBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXRlcm1pbmVMaW5lRGVsaW1pdGVyKFN0cmluZ0J1ZmZlciB0ZXh0QnVmZmVyLCBTdHJpbmdbXSBwb3NzaWJsZXMsIFN0cmluZyBoaW50KSB7Ci0JCXRyeSB7Ci0JCQkvLyBUT0RPOiBhdm9pZCB1c2Ugb2YgU3RyaW5nIGluc3RhbmNlCi0JCQlTdHJpbmcgdGV4dCA9IHRleHRCdWZmZXIudG9TdHJpbmcoKTsKLQkJCWludFtdIGluZm8gPSBpbmRleE9mKHBvc3NpYmxlcywgdGV4dCwgMCk7Ci0JCQlyZXR1cm4gcG9zc2libGVzW2luZm9bMV1dOwotCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24geCkgewotCQl9Ci0JCXJldHVybiBoaW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcgZ3JlYXRlciB0aGFuIG9mZnNldCBvZiB0aGUgbG9uZ2VzdAotCSAqIG1hdGNoaW5nIHNlYXJjaCBzdHJpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gaW5kZXhPZihTdHJpbmdbXSBzZWFyY2hTdHJpbmdzLCBTdHJpbmcgdGV4dCwgaW50IG9mZnNldCkgewotCi0JCWludFtdIHJlc3VsdCA9IHstMSwgLTF9OwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJaW50IGluZGV4ID0gdGV4dC5pbmRleE9mKHNlYXJjaFN0cmluZ3NbaV0sIG9mZnNldCk7Ci0JCQlpZiAoaW5kZXggPj0gMCkgewotCi0JCQkJaWYgKHJlc3VsdFswXSA9PSAtMSkgewotCQkJCQlyZXN1bHRbMF0gPSBpbmRleDsKLQkJCQkJcmVzdWx0WzFdID0gaTsKLQkJCQl9IGVsc2UgaWYgKGluZGV4IDwgcmVzdWx0WzBdKSB7Ci0JCQkJCXJlc3VsdFswXSA9IGluZGV4OwotCQkJCQlyZXN1bHRbMV0gPSBpOwotCQkJCX0gZWxzZSBpZiAoaW5kZXggPT0gcmVzdWx0WzBdICYmIHNlYXJjaFN0cmluZ3NbaV0ubGVuZ3RoKCkgPiBzZWFyY2hTdHJpbmdzW3Jlc3VsdFsxXV0ubGVuZ3RoKCkpIHsKLQkJCQkJcmVzdWx0WzBdID0gaW5kZXg7Ci0JCQkJCXJlc3VsdFsxXSA9IGk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZmlsZWJ1ZmZlcnMvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2ZpbGVidWZmZXJzL0Jhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjQ2N2I2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZmlsZWJ1ZmZlcnMvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi0vKioKLSAqIEdlbmVyaWMgSURvY3VtZW50RmFjdG9yeSBmb3IgSVN0cnVjdHVyZWREb2N1bWVudHMgdG8gYmUgdXNlZCBieSB0aGUKLSAqIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiBleHRlbnNpb24gcG9pbnQuIFRoaXMgY2xhc3MKLSAqIGlzIG5vdCBtZWFudCB0byBiZSBzdWJjbGFzc2VkLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSBpbXBsZW1lbnRzIElEb2N1bWVudEZhY3RvcnksIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHsKLQotCS8qCi0JICogVGhlIGNvbnRlbnQgdHlwZSBJRCB1c2VkIHRvIGRlY2xhcmUgdGhpcyBmYWN0b3J5OyBpdCBpcyB1c2VkIHRvIGZpbmQKLQkgKiB0aGUgY29ycmVzcG9uZGluZyBzdXBwb3J0IGZvciBjcmVhdGluZyB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGVJZGVudGlmaWVyID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLCBvbmx5IHRvIGJlIHVzZWQgYnkgdGhlCi0JICogb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudENyZWF0aW9uIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRGYWN0b3J5I2NyZWF0ZURvY3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShnZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSk7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0JCXdoaWxlIChoYW5kbGVyID09IG51bGwgJiYgIUlDb250ZW50VHlwZU1hbmFnZXIuQ1RfVEVYVC5lcXVhbHMoY29udGVudFR5cGUuZ2V0SWQoKSkpIHsKLQkJCWhhbmRsZXIgPSBNb2RlbEhhbmRsZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEhhbmRsZXJGb3JDb250ZW50VHlwZUlkKGNvbnRlbnRUeXBlLmdldElkKCkpOwotCQkJY29udGVudFR5cGUgPSBjb250ZW50VHlwZS5nZXRCYXNlVHlwZSgpOwotCQl9Ci0JCWlmIChoYW5kbGVyICE9IG51bGwpIHsKLQkJCWRvY3VtZW50ID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZG9jdW1lbnQgPSBuZXcgSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBmQ29udGVudFR5cGVJZGVudGlmaWVyOwotCX0KLQotCS8qCi0JICogTG9hZHMgdGhlIGNvbnRlbnQgdHlwZSBJRCB0byBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIFN0cnVjdHVyZWQgRG9jdW1lbnQuIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uI3NldEluaXRpYWxpemF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZkNvbnRlbnRUeXBlSWRlbnRpZmllciA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoImNvbnRlbnRUeXBlSWQiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZyAmJiBkYXRhLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZkNvbnRlbnRUeXBlSWRlbnRpZmllciA9IChTdHJpbmcpIGRhdGE7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9BYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0Fic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZThkNjkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0Fic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGluaXRpYWwgSURvY3VtZW50RXh0ZW5zaW9uNCBzdXBwb3J0IC0gIzEwMjgyMgotICogICAgIERhdmlkIENhcnZlciAoSW50YWxpbykgLSBidWcgMzAwNDQzIC0gc29tZSBjb25zdGFudHMgYXJlbid0IHN0YXRpYyBmaW5hbAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgaW1wbGVtZW50cyBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmRm9ybWF0Q29udHJhaW50cyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0JcHVibGljIGJvb2xlYW4gcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzID0gdHJ1ZTsgLy8gc3BlY2lhbCBmbGFnIGZvciBKVW5pdAotCS8qCi0JICogTWF4IGxlbmd0aCBvZiB0ZXh0IHRvIGJlIGZvcm1hdHRlZCB0byBiZSBjb25zaWRlcmVkIGEgInNtYWxsIGNoYW5nZSIKLQkgKiBVc2VkIGZvciBkb2N1bWVudCByZXdyaXRlIHNlc3Npb24gdHlwZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NNQUxMX0ZPUk1BVF9TSVpFID0gMTAwMDsKLQotCXByb3RlY3RlZCB2b2lkIGVuc3VyZUNsb3NlZChPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCi0JCXRyeSB7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7IC8vIGhvcGVsZXNzCi0JCX0KLQkJdHJ5IHsKLQkJCWlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOyAvLyBob3BlbGVzcwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBmb3JtYXRDb250ZW50KFN0cmluZyBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlucHV0ID09IG51bGwpCi0JCQlyZXR1cm4gaW5wdXQ7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciByZWFkLiBXaWxsIHJldHVybiBmb3JtYXR0ZWQKLQkJCS8vIHN0cmluZyBhbmQgTk9UIHNhdmUgbW9kZWwuCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGlkID0gaW5wdXRTdHJlYW0udG9TdHJpbmcoKSArICIuIiArIGdldEZpbGVFeHRlbnNpb24oKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoaWQsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyByZXR1cm4gb3V0cHV0Ci0JCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBmb3JtYXRDb250ZW50KFN0cmluZyBpbnB1dCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoaW5wdXQgPT0gbnVsbCkKLQkJCXJldHVybiBpbnB1dDsKLQotCQlpZiAoKHN0YXJ0ID49IDApICYmIChsZW5ndGggPj0gMCkgJiYgKHN0YXJ0ICsgbGVuZ3RoIDw9IGlucHV0Lmxlbmd0aCgpKSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgcmVhZC4gV2lsbCByZXR1cm4gZm9ybWF0dGVkCi0JCQkJLy8gc3RyaW5nIGFuZCBOT1Qgc2F2ZSBtb2RlbC4KLQkJCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBpZCA9IGlucHV0U3RyZWFtLnRvU3RyaW5nKCkgKyAiLiIgKyBnZXRGaWxlRXh0ZW5zaW9uKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkJLy8gZm9ybWF0Ci0JCQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJCS8vIHJldHVybiBvdXRwdXQKLQkJCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKLQkJCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBpbnB1dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICgoc3RhcnQgPj0gMCkgJiYgKGxlbmd0aCA+PSAwKSAmJiAoc3RhcnQgKyBsZW5ndGggPD0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZgotCQkJCS8vIG1vZGVsIGNoYW5nZWQuCi0JCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0KLQkJCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCQkJLy8gZm9ybWF0Ci0JCQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCQkJLy8gc2F2ZSBtb2RlbCBpZiBuZWVkZWQKLQkJCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdEZpbGUoSUZpbGUgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0KLQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJLy8gZm9yIGRlYnVnZ2luZyBwdXJwb3NlcwotCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQkJSURvY3VtZW50RXh0ZW5zaW9uNCBkb2NFeHQ0ID0gbnVsbDsKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJZG9jRXh0NCA9IChJRG9jdW1lbnRFeHRlbnNpb240KSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQl9Ci0JCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHJld3JpdGVTZXNzaW9uID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQkvLyB3aGVuZXZlciBmb3JtYXR0aW5nIG1vZGVsLCBmaXJlIGFib3V0dG9jaGFuZ2UvbW9kZWxjaGFuZ2VkCi0JCQkJc3RydWN0dXJlZE1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIHJld3JpdGVUeXBlID0gKGxlbmd0aCA+IE1BWF9TTUFMTF9GT1JNQVRfU0laRSkgPyBEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5VTlJFU1RSSUNURUQgOiBEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5VTlJFU1RSSUNURURfU01BTEw7Ci0JCQkJcmV3cml0ZVNlc3Npb24gPSAoZG9jRXh0NCA9PSBudWxsIHx8IGRvY0V4dDQuZ2V0QWN0aXZlUmV3cml0ZVNlc3Npb24oKSAhPSBudWxsKSA/IG51bGwgOiBkb2NFeHQ0LnN0YXJ0UmV3cml0ZVNlc3Npb24ocmV3cml0ZVR5cGUpOwotCi0JCQkJaWYgKChzdGFydCA9PSAwKSAmJiAobGVuZ3RoID09IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSkpCi0JCQkJCXNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KHN0cnVjdHVyZWRNb2RlbCwgZmFsc2UpOwotCQkJCWVsc2UKLQkJCQkJc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoc3RydWN0dXJlZE1vZGVsLCB0cnVlKTsKLQotCQkJCWlmICgoc3RhcnQgPj0gMCkgJiYgKGxlbmd0aCA+PSAwKSAmJiAoc3RhcnQgKyBsZW5ndGggPD0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpKSkgewotCQkJCQlMaXN0IGFjdGl2ZU5vZGVzID0gZ2V0QWxsQWN0aXZlTm9kZXMoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQkJCQkJaWYgKGFjdGl2ZU5vZGVzLnNpemUoKSA+IDApIHsKLQkJCQkJCU5vZGUgZmlyc3ROb2RlID0gKE5vZGUpIGFjdGl2ZU5vZGVzLmdldCgwKTsKLQkJCQkJCU5vZGUgbGFzdE5vZGUgPSAoTm9kZSkgYWN0aXZlTm9kZXMuZ2V0KGFjdGl2ZU5vZGVzLnNpemUoKSAtIDEpOwotCi0JCQkJCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJCQkJCU5vZGUgZWFjaE5vZGUgPSBmaXJzdE5vZGU7Ci0JCQkJCQlOb2RlIG5leHROb2RlID0gbnVsbDsKLQkJCQkJCXdoaWxlICghZG9uZSkgewotCQkJCQkJCS8vIHVwZGF0ZSAiZG9uZSIKLQkJCQkJCQlkb25lID0gKGVhY2hOb2RlID09IGxhc3ROb2RlKTsKLQotCQkJCQkJCS8qCi0JCQkJCQkJICogZ2V0IG5leHQgc2libGluZyBiZWZvcmUgZm9ybWF0IGJlY2F1c2UgZWFjaE5vZGUKLQkJCQkJCQkgKiBtYXkgYmUgZGVsZXRlZCwgZm9yIGV4YW1wbGUgd2hlbiBpdCdzIGFuIGVtcHR5Ci0JCQkJCQkJICogdGV4dCBub2RlCi0JCQkJCQkJICovCi0JCQkJCQkJbmV4dE5vZGUgPSBlYWNoTm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJCQkJLy8gZm9ybWF0IGVhY2ggbm9kZQotCQkJCQkJCWZvcm1hdE5vZGUoZWFjaE5vZGUpOwotCi0JCQkJCQkJLy8gdXBkYXRlIGVhY2ggbm9kZQotCQkJCQkJCWlmICgobmV4dE5vZGUgIT0gbnVsbCkgJiYgKG5leHROb2RlLmdldFBhcmVudE5vZGUoKSA9PSBudWxsKSkKLQkJCQkJCQkJLy8gbmV4dE5vZGUgaXMgZGVsZXRlZCBkdXJpbmcgZm9ybWF0Ci0JCQkJCQkJCWVhY2hOb2RlID0gZWFjaE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCWVhY2hOb2RlID0gbmV4dE5vZGU7Ci0KLQkJCQkJCQkvLyBUaGlzIHNob3VsZCBub3QgYmUgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlCi0JCQkJCQkJLy8gc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB3aXRoIGVhY2hOb2RlLgotCQkJCQkJCS8vIFdlIGRvbid0IHdhbnQgYW4gaW5maW5pdGUgbG9vcCBoZXJlLgotCQkJCQkJCWlmIChlYWNoTm9kZSA9PSBudWxsKQotCQkJCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8gd2UgbmVlZCB0d28gZmluYWxseSdzLCBqdXN0IGluIGNhc2UgZmlyc3QgZmFpbHMKLQkJCQl0cnkgewotCQkJCQlpZiAoKGRvY0V4dDQgIT0gbnVsbCkgJiYgKHJld3JpdGVTZXNzaW9uICE9IG51bGwpKQotCQkJCQkJZG9jRXh0NC5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJLy8gYWx3YXlzIG1ha2Ugc3VyZSB0byBmaXJlIGNoYW5nZWRtb2RlbCB3aGVuIGRvbmUKLQkJCQkJc3RydWN0dXJlZE1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKExvZ2dlci5ERUJVR19GT1JNQVQpIHsKLQkJCQlsb25nIGVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZvcm1hdE1vZGVsIHRpbWU6ICIgKyAoZW5kVGltZSAtIHN0YXJ0VGltZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXROb2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIG5ld05vZGUgPSBub2RlOwotCi0JCQkvLyBmb3JtYXQgdGhlIG93bmVyIG5vZGUgaWYgaXQncyBhbiBhdHRyaWJ1dGUgbm9kZQotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotCQkJCW5ld05vZGUgPSAoKEF0dHIpIG5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCi0JCQkvLyByZWZyZXNoIGZvcm1hdCBwcmVmZXJlbmNlcyBiZWZvcmUgZ2V0dGluZyBmb3JtYXR0ZXIKLQkJCWlmIChyZWZyZXNoRm9ybWF0UHJlZmVyZW5jZXMpCi0JCQkJcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKCk7Ci0KLQkJCS8vIGdldCBmb3JtYXR0ZXIgYW5kIGZvcm1hdCBjb250cmFpbnRzCi0JCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBnZXRGb3JtYXR0ZXIobmV3Tm9kZSk7Ci0JCQkvLyBUT0RPX2Z1dHVyZTogYWRkZWQgYXNzZXJ0IHRvIHJlcGxhY2UgInJlZHVuZGFudCBudWxsIGNoZWNrIi4KLQkJCS8vIGlmIGZvcm1hdHRlciBpcyBldmVyIG51bGwsIHdlIHNob3VsZCBwcm92aWRlIHNvbWUKLQkJCS8vIGRlZmF1bHQgZm9ybWF0dGVyIHRvIHNlcnZlIGFzIHBsYWNlIGhvbGRlci4KLQkJCUFzc2VydC5pc05vdE51bGwoZm9ybWF0dGVyLCAiZm9ybWF0dGVyIHdhcyBudWxsIGZvciBhIG5vZGUsICIpOyAvLyROT04tTkxTLTEkCi0JCQlJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cyA9IGZvcm1hdHRlci5nZXRGb3JtYXRDb250cmFpbnRzKCk7Ci0JCQlmb3JtYXRDb250cmFpbnRzLnNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KHRydWUpOwotCQkJLy8gZm9ybWF0IGVhY2ggbm9kZQotCQkJZm9ybWF0dGVyLmZvcm1hdChuZXdOb2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSBnZXRBbGxBY3RpdmVOb2RlcyBpbnN0ZWFkCi0JICovCi0JcHJvdGVjdGVkIFZlY3RvciBnZXRBY3RpdmVOb2RlcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0Tm9kZU9mZnNldCwgaW50IGxlbmd0aCkgewotCQlMaXN0IGFsbEFjdGl2ZU5vZGVzID0gZ2V0QWxsQWN0aXZlTm9kZXMoc3RydWN0dXJlZE1vZGVsLCBzdGFydE5vZGVPZmZzZXQsIGxlbmd0aCk7Ci0JCXJldHVybiBuZXcgVmVjdG9yKGFsbEFjdGl2ZU5vZGVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBbGxBY3RpdmVOb2RlcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0Tm9kZU9mZnNldCwgaW50IGxlbmd0aCkgewotCQlMaXN0IGFjdGl2ZU5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJTm9kZSBzdGFydE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnROb2RlT2Zmc2V0KTsKLQkJCS8vIHNlZSBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDcxMQotCQkJLy8KLQkJCS8vIFdlIGhhdmUgdG8gd2F0Y2ggZm9yIHNlbGVjdGlvbiBib3VuZGFyeSBjb25kaXRpb25zLiBVc2UgdGhpcyBhcwotCQkJLy8gYW4gZXhhbXBsZTogPGE+dGV4dDwvYT48Yj50ZXh0PC9iPiwKLQkJCS8vIElmIHRoZSB3aG9sZSA8YT4gbm9kZSBpcyBzZWxlY3RlZCwgbGlrZToKLQkJCS8vIHw8YT50ZXh0PC9hPnw8Yj50ZXh0PC9iPiwgd2UgbmVlZCB0byBzdWJzdHJhY3QgdGhlIGxlbmd0aCBieSAxCi0JCQkvLyB0byBmaW5kCi0JCQkvLyB0aGUgbm9kZSBhdCB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb246Ci0JCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGggLSAxKSwKLQkJCS8vIG9yIGVsc2UKLQkJCS8vIHdlJ2QgZmluZCB0aGUgbmV4dCBhZGphY2VudCBub2RlLgotCQkJLy8KLQkJCS8vIEhvd2V2ZXIsIHdoZW4gdGhlIHNlbGVjdGlvbiBsZW5ndGggaXMgMCAobWVhbmluZyBubyB0ZXh0IGlzCi0JCQkvLyBzZWxlY3RlZCksIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGJlZ2lubmluZwotCQkJLy8gb2YgdGhlIG5vZGUgd2Ugd2FudCB0byBmb3JtYXQ6IHw8YT50ZXh0PC9hPjxiPnRleHQ8L2I+LCB0aGUKLQkJCS8vIG5vZGUgYXQgdGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uIGlzOgotCQkJLy8gc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoKS4KLQkJCWludCBlbmROb2RlT2Zmc2V0ID0gbGVuZ3RoID4gMCA/IHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aCAtIDEgOiBzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGg7Ci0JCQlOb2RlIGVuZE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oZW5kTm9kZU9mZnNldCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBpdCdzIGFuIG5vbi1lbXB0eSBkb2N1bWVudAotCQkJaWYgKHN0YXJ0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJd2hpbGUgKGlzU2libGluZ09mKHN0YXJ0Tm9kZSwgZW5kTm9kZSkgPT0gZmFsc2UpIHsKLQkJCQkJaWYgKGVuZE5vZGUgIT0gbnVsbCkKLQkJCQkJCWVuZE5vZGUgPSBlbmROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKGVuZE5vZGUgPT0gbnVsbCkgewotCQkJCQkJc3RhcnROb2RlID0gc3RhcnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCS8vIHNlZQotCQkJCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ3MTEKLQkJCQkJCS8vIGFuZCBub3RlcyBhYm92ZQotCQkJCQkJZW5kTm9kZU9mZnNldCA9IGxlbmd0aCA+IDAgPyBzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGggLSAxIDogc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoOwotCQkJCQkJZW5kTm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihlbmROb2RlT2Zmc2V0KTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXdoaWxlIChzdGFydE5vZGUgIT0gZW5kTm9kZSkgewotCQkJCQlhY3RpdmVOb2Rlcy5hZGQoc3RhcnROb2RlKTsKLQkJCQkJc3RhcnROb2RlID0gc3RhcnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJCWlmIChzdGFydE5vZGUgIT0gbnVsbCkKLQkJCQkJYWN0aXZlTm9kZXMuYWRkKHN0YXJ0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYWN0aXZlTm9kZXM7Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCk7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGdldEZvcm1hdENvbnRyYWludHMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gMjYyMTM1IC0gTlBFIGR1cmluZyBmb3JtYXQgb2YgZW1wdHkgZG9jdW1lbnQKLQkJaWYgKChmRm9ybWF0Q29udHJhaW50cyA9PSBudWxsKSAmJiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oMCk7Ci0KLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBnZXRGb3JtYXR0ZXIobm9kZSk7Ci0JCQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKSB7Ci0JCQkJCWZGb3JtYXRDb250cmFpbnRzID0gZm9ybWF0dGVyLmdldEZvcm1hdENvbnRyYWludHMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdENvbnRyYWludHM7Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGdldEZvcm1hdHRlcihOb2RlIG5vZGUpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaWJsaW5nT2YoTm9kZSBub2RlLCBOb2RlIGVuZE5vZGUpIHsKLQkJaWYgKGVuZE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIHsKLQkJCU5vZGUgc2libGluZ05vZGUgPSBub2RlOwotCQkJd2hpbGUgKHNpYmxpbmdOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoc2libGluZ05vZGUgPT0gZW5kTm9kZSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZQotCQkJCQlzaWJsaW5nTm9kZSA9IHNpYmxpbmdOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9ybWF0UHJlZmVyZW5jZXMoKTsKLQotCXByb3RlY3RlZCB2b2lkIHNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBib29sZWFuIGZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KSB7Ci0JCS8vIDI2MjEzNSAtIE5QRSBkdXJpbmcgZm9ybWF0IG9mIGVtcHR5IGRvY3VtZW50Ci0JCUlTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzID0gZ2V0Rm9ybWF0Q29udHJhaW50cyhzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCWlmIChmb3JtYXRDb250cmFpbnRzICE9IG51bGwpCi0JCQlmb3JtYXRDb250cmFpbnRzLnNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KGZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzAwNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotLyoqCi0gKiBUaGVzZSBhcmUgaXRlbXMgdGhhdCBjaGFuZ2UgZnJvbSBlbGVtZW50IHRvIGVsZW1lbnQuCi0gKiBQYXNzZWQgZnJvbSBub2RlIHRvIG5vZGUgaW4gYSByZWN1cnNpdmUgY2FsbC4KLSAqIGVnLiBjdXJyZW50IGluZGVudCBpcyAyIGRlZXAsIGJ1dCBmb3IgdGhlIG5leHQgbm9kZSBtaWdodCBiZSAzLi4uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIHsKLQlib29sZWFuIGdldENsZWFyQWxsQmxhbmtMaW5lcygpOwotCi0JU3RyaW5nIGdldEN1cnJlbnRJbmRlbnQoKTsKLQotCWJvb2xlYW4gZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKTsKLQotCWJvb2xlYW4gZ2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCgpOwotCi0JLyoqIAotCSAqIHNvbWUgc3BlY2lhbCBlbGVtZW50cyBjYW4gaWdub3JlIGNsZWFyaW5nIGJsYW5rIGxpbmVzCi0JICogKi8KLQl2b2lkIHNldENsZWFyQWxsQmxhbmtMaW5lcyhib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcyk7Ci0KLQl2b2lkIHNldEN1cnJlbnRJbmRlbnQoU3RyaW5nIGN1cnJlbnRJbmRlbnQpOwotCi0Jdm9pZCBzZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChib29sZWFuIGZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KTsKLQkKLQl2b2lkIHNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoYm9vbGVhbiBpblByZXNlcnZlU3BhY2VFbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNlZjE0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotLyoqCi0gKiBUaGVzZSBhcmUgaXRlbXMgdGhhdCBkbyBub3QgY2hhbmdlIGZyb20gZWxlbWVudCB0byBlbGVtZW50LgotICogUGFzc2VkIGZyb20gbm9kZSB0byBub2RlIGluIGEgcmVjdXJzaXZlIGNhbGwgYmVjYXVzZSBzb21ldGltZXMKLSAqIGNoaWxkIG5vZGVzIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgewotCQotCWJvb2xlYW4gZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQlTdHJpbmcgZ2V0SW5kZW50KCk7Ci0KLQlpbnQgZ2V0TGluZVdpZHRoKCk7Ci0KLQl2b2lkIHNldENsZWFyQWxsQmxhbmtMaW5lcyhib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcyk7Ci0KLQl2b2lkIHNldEluZGVudChTdHJpbmcgaW5kZW50KTsKLQotCXZvaWQgc2V0TGluZVdpZHRoKGludCBsaW5lV2lkdGgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4M2FhYzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhlIG1haW4gZm9ybWF0dGluZyBlbmdpbmUuICAKLSAqIExvb3BzIHRocm91Z2ggYWxsIHRoZSBub2RlcyBpbiBhbiBJU3RydWN0dXJlZE1vZGVsLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIHsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgRm9ybWF0UHJvY2Vzc29yIHRha2VzIGFuIElEb2N1bWVudCBhcyBpbnB1dCwgY3JlYXRlcyBhCi0JICogdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRG9jdW1lbnQncyBmaWxlCi0JICogZXh0ZW5zaW9uLCBmb3JtYXRzIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aCwgdGhlbiByZWxlYXNlcyB0aGUKLQkgKiBtb2RlbC4KLQkgKi8KLQl2b2lkIGZvcm1hdERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIEZvcm1hdFByb2Nlc3NvciB0YWtlcyBhbiBJRmlsZSBhcyBpbnB1dCwgY3JlYXRlcyBhCi0JICogdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRmlsZSdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGZvcm1hdHMgdGhlIHdob2xlIG1vZGVsLCB0aGVuIHJlbGVhc2VzIHRoZSBtb2RlbC4KLQkgKi8KLQl2b2lkIGZvcm1hdEZpbGUoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBGb3JtYXRQcm9jZXNzb3IgdGFrZXMgYSBtb2RlbCBhcyBpbnB1dCwgYW5kIGZvcm1hdHMKLQkgKiB0aGUgd2hvbGUgbW9kZWwuCi0JICovCi0Jdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIEZvcm1hdFByb2Nlc3NvciB0YWtlcyBhIG1vZGVsIGFzIGlucHV0LCBhbmQgZm9ybWF0cwotCSAqIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aC4KLQkgKi8KLQl2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBGb3JtYXRQcm9jZXNzb3IgdGFrZXMgYSBub2RlIGFzIGlucHV0LCBhbmQgZm9ybWF0cyB0aGUKLQkgKiBub2RlIGFuZCBhbGwgaXRzIGNoaWxkcmVuLgotCSAqLwotCXZvaWQgZm9ybWF0Tm9kZShOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhpcyA8Y29kZT5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjwvY29kZT4uCi0JICogVGhlIG1vbml0b3IgaXMgdXNlZCB0byBkaXNwbGF5IHByb2dyZXNzIG9yIGNhbmNlbCBpZiB0aGUgZm9ybWF0dGVyIGlzIHJ1biAKLQkgKiBpbiBhIGJhY2tncm91bmQgam9iLgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0Jdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzIzZDEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogS25vd3MgaG93IHRvIGZvcm1hdCBhIHBhcnRpY3VsYXIgbm9kZS4KLSAqIAotICogZWcuIGdlbmVyaWMgbm9kZSwgdGV4dCBub2RlLCBkb2N1bWVudCBub2RlLCBjb21tZW50LCBldGMuLi4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZEZvcm1hdHRlciB7Ci0JCi0Jdm9pZCBmb3JtYXQoTm9kZSBub2RlKTsKLQotCXZvaWQgZm9ybWF0KE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpOwotCi0JSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGdldEZvcm1hdENvbnRyYWludHMoKTsKLQotCUlTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKTsKLQotCXZvaWQgc2V0Rm9ybWF0UHJlZmVyZW5jZXMoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmb3JtYXRQcmVmZXJlbmNlcyk7Ci0KLQl2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNDdlNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0geG1sOnNwYWNlPSdwcmVzZXJ2ZScgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyB7Ci0JcHJpdmF0ZSBib29sZWFuIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRJbmRlbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgYm9vbGVhbiBmRm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkluUHJlc2VydmVTcGFjZUVsZW1lbnQgPSBmYWxzZTsKLQotCXB1YmxpYyBib29sZWFuIGdldENsZWFyQWxsQmxhbmtMaW5lcygpIHsKLQkJcmV0dXJuIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50SW5kZW50KCkgewotCQlyZXR1cm4gZkN1cnJlbnRJbmRlbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKSB7Ci0JCXJldHVybiBmRm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzKSB7Ci0JCWZDbGVhckFsbEJsYW5rTGluZXMgPSBjbGVhckFsbEJsYW5rTGluZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudEluZGVudChTdHJpbmcgY3VycmVudEluZGVudCkgewotCQlmQ3VycmVudEluZGVudCA9IGN1cnJlbnRJbmRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoYm9vbGVhbiBmb3JtYXRXaXRoU2libGluZ0luZGVudCkgewotCQlmRm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQgPSBmb3JtYXRXaXRoU2libGluZ0luZGVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkgewotCQlyZXR1cm4gZkluUHJlc2VydmVTcGFjZUVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudChib29sZWFuIGluUHJlc2VydmVTcGFjZUVsZW1lbnQpIHsKLQkJZkluUHJlc2VydmVTcGFjZUVsZW1lbnQgPSBpblByZXNlcnZlU3BhY2VFbGVtZW50OwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmMWI5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyB7Ci0JcHJpdmF0ZSBib29sZWFuIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZkluZGVudDsKLQlwcml2YXRlIGludCBmTGluZVdpZHRoOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkgewotCQlyZXR1cm4gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZGVudCgpIHsKLQkJcmV0dXJuIGZJbmRlbnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMaW5lV2lkdGgoKSB7Ci0JCXJldHVybiBmTGluZVdpZHRoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsZWFyQWxsQmxhbmtMaW5lcyhib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcykgewotCQlmQ2xlYXJBbGxCbGFua0xpbmVzID0gY2xlYXJBbGxCbGFua0xpbmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluZGVudChTdHJpbmcgaW5kZW50KSB7Ci0JCWZJbmRlbnQgPSBpbmRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZVdpZHRoKGludCBsaW5lV2lkdGgpIHsKLQkJZkxpbmVXaWR0aCA9IGxpbmVXaWR0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvQWJzdHJhY3RNb2RlbEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9BYnN0cmFjdE1vZGVsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQ1NTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9BYnN0cmFjdE1vZGVsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5QbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXI7Ci0KLS8qKgotICogSVNTVUU6IG5lZWQgdG8gcHJvdmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gaW1wcm92ZWQgQVBJLgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCXByaXZhdGUgU3RyaW5nIGFzc29jaWF0ZWRDb250ZW50VHlwZUlkOwotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0U2V0dGluZzsKLQlwcml2YXRlIFN0cmluZyBtb2RlbEhhbmRsZXJJRDsKLQotCXB1YmxpYyBBYnN0cmFjdE1vZGVsSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGVzZSBmYWN0b3JpZXMgYXJlIGFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgbW9kZWwgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIGhvbGRGYWN0b3JpZXMgPSBQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3JpZXModGhpcyk7Ci0JCWlmIChob2xkRmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCXJlc3VsdC5hZGRBbGwoaG9sZEZhY3Rvcmllcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKCkgewotCQlyZXR1cm4gYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gbW9kZWxIYW5kbGVySUQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gZGVmYXVsdFNldHRpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQgPSBjb250ZW50VHlwZUlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoYm9vbGVhbiBkZWZhdWx0UGFyYW0pIHsKLQkJZGVmYXVsdFNldHRpbmcgPSBkZWZhdWx0UGFyYW07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCW1vZGVsSGFuZGxlcklEID0gaWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTExOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW1iZWRkZWRUeXBlSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBUaGVzZSBBZGFwdGVyRmFjdG9yaWVzIGFyZSBOT1QgYWRkZWQgdG8gSVN0cnVjdHVyZWRNb2RlbCdzCi0JICogSUFkYXB0ZXJGYWN0b3J5IFJlZ2lzdHJ5LCBidXQgaW5zdGVhZCBleHBlY3RlZCB0byBiZSBjb25zdWx0ZWQgYXMKLQkgKiBuZWVkZWQgYnkgZnVuY3Rpb25hbGl0eSBhd2FyZSBvZiBlbWJlZGRlZCBjb250ZW50IHR5cGVzLiAgQWRkaXRpb25zCi0JICogdG8gdGhlIG1vZGVsJ3Mgb3duIGZhY3RvcnkgcmVnaXN0cnkgc2hvdWxkIGJlIGRvbmUgaW4KLQkgKiB7QGxpbmsgI2luaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5KX0KLQkgKi8KLQlMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY29udGVudCB0eXBlIGZhbWlseSB0aGlzCi0JICogQ29udGVudFR5cGVEZXNjcmlwdGlvbiBiZWxvbmdzIHRvLgotCSAqLwotCVN0cmluZyBnZXRGYW1pbHlJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbWltZSB0eXBlcyAoYXMgU3RyaW5ncykgdGhpcyBoYW5kbGVyIGlzIGFwcHJvcHJpYXRlCi0JICogZm9yCi0JICovCi0JTGlzdCBnZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKTsKLQkKLQkvKioKLQkgKiBJZiB0aGlzIGhhbmRlciBjYW4gaGFuZGxlIGEgZ2l2ZW4gbWltZVR5cGUuCi0JICogCi0JICogVGhpcyBpcyBhIGxvb3NlciBjaGVjayB0aGFuIHNpbXBseSBjaGVja2luZyBpZiBhIGdpdmUgbWltZVR5cGUKLQkgKiBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgdHlwZXMsIHNvIGl0IHNob3VsZCBiZSB1c2VkIHdpdGggdGhhdAotCSAqIGluIG1pbmQuICBUaGF0IGlzLCB0aGUgc3VwcG9ydGVkIG1pbWVUeXBlIGxpc3Qgc2hvdWxkIGlkZWFsbHkgYmUKLQkgKiBjaGVja2VkIGZpcnN0LgotCSAqIAotCSAqIGVnLiBpZiBhIG1pbWUgdHlwZSBlbmRzIHdpdGggIit4bWwiLCBsaWtlIHZvaWNlK3htbAotCSAqICAgICB0aGUgRW1iZWRkZWRYTUwgaGFuZGxlciBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgaXQKLQkgKiAgICAgCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgaGFuZGxlciB0aGlua3MgY2FuIGhhbmRsZSB0aGUgZ2l2ZW4gbWltZVR5cGUKLQkgKi8KLQlib29sZWFuIGNhbkhhbmRsZU1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB0byBnaXZlIHRoZSBFbWJlZGRlZENvbnRlbnRUeXBlIGFuIG9wcG9ydHVuaXR5IHRvIGFkZAotCSAqIGZhY3RvcmllcyBkaXJlY3RseSB0byB0aGUgSVN0cnVjdHVyZWRNb2RlbCdzIElBZGFwdGVyRmFjdG9yeSByZWdpc3RyeS4gCi0JICovCi0Jdm9pZCBpbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSk7Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplUGFyc2VyLCBmb3IgZXhhbXBsZSwgc2V0dGluZyB1cCBhICJibG9jayIgdGFncyBsaXN0IHVzaW5nIGFuCi0JICogZXh0ZW5kZWQgaW50ZXJmYWNlCi0JICovCi0Jdm9pZCBpbml0aWFsaXplUGFyc2VyKFJlZ2lvblBhcnNlciBwYXJzZXIpOwotCi0JYm9vbGVhbiBpc0RlZmF1bHQoKTsKLQotCUVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SW5zdGFuY2UoKTsKLQotCXZvaWQgdW5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSk7Ci0KLQl2b2lkIHVuaW5pdGlhbGl6ZVBhcnNlcihSZWdpb25QYXJzZXIgcGFyc2VyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9JRG9jdW1lbnRUeXBlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0lEb2N1bWVudFR5cGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNjI5NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0lEb2N1bWVudFR5cGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci0KLS8qKgotICogUmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyB0aGUgbWVjaGFuaXNtcyB1c2VkIGluIHRoZSBjb3JyZWN0IGxvYWRpbmcgb2YgYW4KLSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnQncyBjb250ZW50cyBhbmQgZGV0ZXJtaW5lIGl0cyBzZWxmLWRlc2NyaWJlZCBlbmNvZGluZy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRUeXBlSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBUaGUgTG9hZGVyIGlzIHJlcG9uc2libGUgZm9yIGRlY29kaW5nIHRoZSBSZXNvdXJjZSwKLQkgKi8KLQlJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gbGlrZWx5IHRvIGdvIGF3YXksIHNvIEkgbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8KLQkgKiAgICAgICAgICAgICBkaXNjb3Vyc2FnZSB1c2UKLQkgKi8KLQlJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpOwotCi0JLyoqCi0JICogTXVzdCByZXR1cm4gdW5pcXVlIElEIHRoYXQgaXMgdGhlIHNhbWUgYXMgaWRlbnRpZmllZCBpbiBwbHVnaW4gcmVnaXN0cnkKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9JTW9kZWxIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvSU1vZGVsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODhmMzllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9JTW9kZWxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci0KLQotLyoqCi0gKiBSZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIHRoZSBtZWNoYW5pc21zIHVzZWQgaW4gdGhlIGNvcnJlY3QgbG9hZGluZyBvZiBhbgotICogSVN0cnVjdHVyZWRNb2RlbCdzIGNvbnRlbnRzIGFuZCBpbml0aWFsaXphdGlvbiBvZiBpdHMgYWRhcHRlciBmYWN0b3JpZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsSGFuZGxlciBleHRlbmRzIElEb2N1bWVudFR5cGVIYW5kbGVyIHsKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIEZhY3RvcmllcyB3aGljaCBhcmUgYWRkZWQgYXV0b21hdGljYWxseSBieQotCSAqIElNb2RlbE1hbmFnZXIuIFRoaXMgY2FuIGFuZCB3aWxsIG9mdGVuIGJlIGFuIGVtcHR5IExpc3QgKG9yIG51bGwpLAotCSAqIHNpbmNlIHNvbWUgQWRhcHRlckZhY3RvcmllcyBtdXN0IGJlIGFkZGVkIGJ5IExvYWRlciBkaXJlY3RseSwgYW5kIG1vc3QKLQkgKiBzaG91bGQgYmUgYWRkZWQgYnkgRWRpdG9ycy4gRm9ybWF0QWRhcHRlckZhY3RvcnkgaXMgYW4gZXhhbXBsZSBvZiBvbmUKLQkgKiB0aGF0IGNhbiBiZSByZXR1cm5lZCBoZXJlLCBzaW5jZSB0aGUgdGltaW5nIG9mIGFkZGluZyBpdCBpcyBub3QKLQkgKiBjcml0aWNhbCwgYnV0IGl0IG1heSBiZSBuZWVkZWQgZXZlbiB3aGVuIGFuIGVkaXRvciBpcyBub3QgYmVpbmcgdXNlZC4KLQkgKi8KLQlMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElEIGZvciB0aGUgYXNzb2NpYXRlZCBDb250ZW50VHlwZUhhbmRsZXIgQnV0IGlzIG5lZWRlZCBmb3IKLQkgKiBub3cuCi0JICovCi0JU3RyaW5nIGdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKCk7Ci0KLQkvKioKLQkgKiBUaGUgTG9hZGVyIGlzIHJlcG9uc2libGUgZm9yIGRlY29kaW5nIHRoZSBSZXNvdXJjZSwKLQkgKi8KLQlJTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKTsKLQotCWJvb2xlYW4gaXNEZWZhdWx0KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvQmxvY2tNYXJrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja01hcmtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjhiMzYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja01hcmtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIElTU1VFOiBuZWVkIHRvIHByb3ZpZGUgZnVuY3Rpb25hbGl0eSBpbiBpbXByb3ZlZCBBUEkuIAotICovCi1wdWJsaWMgY2xhc3MgQmxvY2tNYXJrZXIgZXh0ZW5kcyBUYWdNYXJrZXIgewotCi0JLy8gYWxsb3cgZm9yIEpTUCBleHByZXNzaW9ucyB3aXRoaW4gdGhlIGJsb2NrCi0JcHJvdGVjdGVkIGJvb2xlYW4gZkFsbG93SlNQID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGZDYXNlU2Vuc2l0aXZlID0gZmFsc2U7Ci0KLQkvLyB0aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoaXMgdGFnIChCTE9DS19URVhULCBKU1BfQ09OVEVOVCwKLQkvLyBldGMuKQotCXByb3RlY3RlZCBTdHJpbmcgZkNvbnRleHQ7Ci0KLQlwdWJsaWMgQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUsIElUZXh0UmVnaW9uIG1hcmtlciwgU3RyaW5nIGNvbnRleHQpIHsKLQkJdGhpcyh0YWdOYW1lLCBtYXJrZXIsIGNvbnRleHQsIHRydWUpOwotCX0KLQotCXB1YmxpYyBCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSwgSVRleHRSZWdpb24gbWFya2VyLCBTdHJpbmcgY29udGV4dCwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7Ci0JCXRoaXModGFnTmFtZSwgbWFya2VyLCBjb250ZXh0LCBjYXNlU2Vuc2l0aXZlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUsIElUZXh0UmVnaW9uIG1hcmtlciwgU3RyaW5nIGNvbnRleHQsIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSwgYm9vbGVhbiBhbGxvd0pTUCkgewotCQlzdXBlcih0YWdOYW1lLCBtYXJrZXIpOwotCQlzZXRDb250ZXh0KGNvbnRleHQpOwotCQlzZXRDYXNlU2Vuc2l0aXZlKGNhc2VTZW5zaXRpdmUpOwotCQlzZXRBbGxvd0pTUChhbGxvd0pTUCk7Ci0JfQotCi0JcHVibGljIEJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lLCBTdHJpbmcgcmVnaW9uQ29udGV4dCwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7Ci0JCXRoaXModGFnTmFtZSwgbnVsbCwgcmVnaW9uQ29udGV4dCwgY2FzZVNlbnNpdGl2ZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFsbG93SlNQLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhbGxvd3NKU1AoKSB7Ci0JCXJldHVybiBmQWxsb3dKU1A7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBmQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiBmQ2FzZVNlbnNpdGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGxvd0pTUC4KLQkgKiAKLQkgKiBAcGFyYW0gYWxsb3dKU1AKLQkgKiAgICAgICAgICAgIFRoZSBhbGxvd0pTUCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0pTUChib29sZWFuIGFsbG93SlNQKSB7Ci0JCWZBbGxvd0pTUCA9IGFsbG93SlNQOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBzZW5zaXRpdmUpIHsKLQkJZkNhc2VTZW5zaXRpdmUgPSBzZW5zaXRpdmU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgVGhlIGNvbnRleHQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dChTdHJpbmcgY29udGV4dCkgewotCQlmQ29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvQmxvY2tUYWdQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja1RhZ1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmQ2YjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja1RhZ1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIEJsb2NrVGFnUGFyc2VyIHsKLQotCXZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKTsKLQotCXZvaWQgYmVnaW5CbG9ja1NjYW4oU3RyaW5nIHRhZ05hbWUpOwotCi0JQmxvY2tNYXJrZXIgZ2V0QmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpOwotCi0JTGlzdCBnZXRCbG9ja01hcmtlcnMoKTsKLQotCXZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKTsKLQotCXZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvQmxvY2tUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhZDUzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvQmxvY2tUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlcjsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEJsb2NrVG9rZW5pemVyIHsKLQotCXZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKTsKLQotCXZvaWQgYmVnaW5CbG9ja01hcmtlclNjYW4oU3RyaW5nIG5ld1RhZ05hbWUsIFN0cmluZyBjb250ZXh0KTsKLQotCXZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpOwotCi0JTGlzdCBnZXRCbG9ja01hcmtlcnMoKTsKLQotCUlUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCWludCBnZXRPZmZzZXQoKTsKLQotCWJvb2xlYW4gaXNFT0YoKTsKLQotCUJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCk7Ci0KLQl2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcik7Ci0KLQl2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKTsKLQotCXZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSk7Ci0KLQl2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXksIGludCBuZXdPZmZzZXQpOwotCi0Jdm9pZCByZXNldChJbnB1dFN0cmVhbSBpbik7Ci0KLQl2b2lkIHJlc2V0KElucHV0U3RyZWFtIGluLCBpbnQgbmV3T2Zmc2V0KTsKLQotCXZvaWQgcmVzZXQoUmVhZGVyIGluKTsKLQotCXZvaWQgcmVzZXQoUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9JQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0lCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZWFiMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0lCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotLyoqCi0gKiBJQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBqdXN0IGxpa2UgYW4gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotICogZXhjZXB0IHJlc3VsdHMgZnJvbSBwYXJzaW5nIGEgImJsb2NrIHRhZyIgKHN1Y2ggYXMgU0NSSVBUIG9yIFNUWUxFKS4KLSAqIEJlY2F1c2UgdGhlc2UgYXJlICJ2YXJpYWJsZSIgcGFydGl0aW9uIHR5cGVzLCBpdHMgb2Z0ZW4gaGFuZHkgKGVmZmljaWVudCkKLSAqIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHBhcnRpdGlvbiB0eXBlLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBleHRlbmRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCS8qKgotCSAqIFJldHVybiB0aGUgcGFydGlvbiB0eXBlIGZvciB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aW9uIHR5cGUuCi0JICovCi0JU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHBhcnRpb24gdHlwZS4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlLXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZQotCSAqLwotCXZvaWQgc2V0UGFydGl0aW9uVHlwZShTdHJpbmcgcGFydGl0aW9uVHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvSlNQQ2FwYWJsZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0pTUENhcGFibGVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1NTk3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvSlNQQ2FwYWJsZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQQ2FwYWJsZVBhcnNlciBleHRlbmRzIFJlZ2lvblBhcnNlciwgQmxvY2tUYWdQYXJzZXIgewotCXZvaWQgYWRkTmVzdGFibGVQcmVmaXgoVGFnTWFya2VyIG1hcmtlcik7Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRoZSBUYWdNYXJrZXJzIGZvciBwcmVmaXhlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIG5lc3RhYmxlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUxpc3QgZ2V0TmVzdGFibGVQcmVmaXhlcygpOwotCi0Jdm9pZCByZW1vdmVOZXN0YWJsZVByZWZpeChTdHJpbmcgdGFnTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvUmVnaW9uUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvUmVnaW9uUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOGRmYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1JlZ2lvblBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi0KLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFJlZ2lvblBhcnNlciB7Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9ucygpOwotCi0JTGlzdCBnZXRSZWdpb25zKCk7Ci0KLQkvKioKLQkgKiBUaGUgJ25ld0luc3RhbmNlJyBtZXRob2QgaXMgc2ltaWxhciB0byAnY2xvbmUnLCBidXQgZG9lcyBub3QgaW5jbHVkZQotCSAqIHRoZSBjb3B5aW5nIG9mIGFueSBjb250ZW50LiBGb3IgYSBwdXJlIFJlZ2lvblBhcnNlciBpdHNlbGYsIHRoZXJlIHdvdWxkCi0JICogYmUgbGl0dGxlIHN0YXRlIHRvICJjbG9uZSIsIGJ1dCBmb3Igc29tZSBzdWJ0eXBlcywgc3VjaCBhcwotCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciBhbmQgSlNQQ2FwYWJsZVBhcnNlciwgdGhlcmUgY291bGQgdGhlCi0JICogbW9yZSBpbnRlcm5hbCBkYXRhIHRvICJjbG9uZSIsIHN1Y2ggYXMgdGhlIGludGVybmFsIHRva2VuaXplciBzaG91bGQgYmUKLQkgKiBjbG9uZWQgKGluY2x1ZGluZyBibG9jayB0YWdzLCBldGMpLgotCSAqLwotCVJlZ2lvblBhcnNlciBuZXdJbnN0YW5jZSgpOwotCi0Jdm9pZCByZXNldChSZWFkZXIgcmVhZGVyKTsKLQotCS8qKgotCSAqIEFuIGFkZGl0aW9uYWwgb2Zmc2V0IGZvciB1c2Ugd2l0aCBhbnkgcG9zaXRpb24tZGVwZW5kYW50IHBhcnNpbmcgcnVsZXMKLQkgKi8KLQl2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIsIGludCBvZmZzZXQpOwotCi0Jdm9pZCByZXNldChTdHJpbmcgaW5wdXQpOwotCi0JLyoqCi0JICogQW4gYWRkaXRpb25hbCBvZmZzZXQgZm9yIHVzZSB3aXRoIGFueSBwb3NpdGlvbi1kZXBlbmRhbnQgcGFyc2luZyBydWxlcwotCSAqLwotCXZvaWQgcmVzZXQoU3RyaW5nIGlucHV0LCBpbnQgb2Zmc2V0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWU1Y2JhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotcHVibGljIGludGVyZmFjZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIHsKLQotCS8vIFNlbnQgd2hlbiBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgZmlyc3QgcGFyc2VkCi0JcHVibGljIHZvaWQgbm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCS8vIFNlbnQgd2hlbiB0aGUgY2FsbGluZyBwYXJzZXIncyBtb2RlbCB1bmRlcmdvZXMgYSBmdWxsIHJlc2V0Ci0JLy8gICBhbmQgYW55IGluZm9ybWF0aW9uIGJhc2VkIHVwb24gdGhlIG9sZCBtb2RlbCBzaG91bGQgYmUKLQkvLyAgIGNsZWFyZWQKLQlwdWJsaWMgdm9pZCByZXNldE5vZGVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmMmQ3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24gZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIHsKLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld0RvY3VtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRiYmU1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciBleHRlbmRzIFJlZ2lvblBhcnNlciB7Ci0KLQl2b2lkIGFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyKTsKLQotCXZvaWQgcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGhhbmRsZXIpOwotCi0Jdm9pZCByZXNldEhhbmRsZXJzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDk1MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbiBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBsaXN0IG9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzIGxpc3RlbmluZwotCSAqIHRvIHRoaXMgcGFyc2VyLgotCSAqIAotCSAqIEByZXR1cm4gTGlzdCAtIHRoZSBsaXN0IG9mIGxpc3RlbmVycywgdGhlIGxpc3QgbWF5IG5vdCBiZSBudWxsIGFuZCBlYWNoCi0JICogICAgICAgICBlbGVtZW50IGluIGl0IG11c3QgaW1wbGVtZW50IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIKLQkgKi8KLQlMaXN0IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvVGFnTWFya2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvVGFnTWFya2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZTIyNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1RhZ01hcmtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogSVNTVUU6IG5lZWQgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5IGluIGltcHJvdmVkIEFQSS4gCi0gKi8KLQotcHVibGljIGNsYXNzIFRhZ01hcmtlciB7Ci0KLQkvLyBhIElUZXh0UmVnaW9uIChtZWFudCB0byBiZSB1cGRhdGVkIHdpdGggdGhlIG1vZGVsKSBtYXJraW5nIHRoZSBwb3NpdGlvbgotCS8vIHdoZXJlIHRoaXMgdGFnbmFtZSBiZWNvbWVzIGVmZmVjdGl2ZQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBmTWFya2VyID0gbnVsbDsKLQotCS8vIHRoZSB0YWduYW1lCi0JcHJvdGVjdGVkIFN0cmluZyBmVGFnTmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFRhZ01hcmtlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGFnTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRhZ05hbWUodGFnbmFtZSk7Ci0JfQotCi0JcHVibGljIFRhZ01hcmtlcihTdHJpbmcgdGFnbmFtZSwgSVRleHRSZWdpb24gbWFya2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRhZ05hbWUodGFnbmFtZSk7Ci0JCXNldE1hcmtlcihtYXJrZXIpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXRNYXJrZXIoKSB7Ci0JCXJldHVybiBmTWFya2VyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLQkJcmV0dXJuIGZUYWdOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkgewotCQlyZXR1cm4gZk1hcmtlciA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdNYXJrZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRNYXJrZXIoSVRleHRSZWdpb24gbmV3TWFya2VyKSB7Ci0JCWZNYXJrZXIgPSBuZXdNYXJrZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1RhZ25hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRUYWdOYW1lKFN0cmluZyBuZXdUYWdOYW1lKSB7Ci0JCWZUYWdOYW1lID0gbmV3VGFnTmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0Fic3RyYWN0TW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWFmYWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVGFnUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGEgZmlsZSBhbmQgY3JlYXRlcyBhbiBTdHJ1Y3R1cmVkIE1vZGVsLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNb2RlbExvYWRlciBpbXBsZW1lbnRzIElNb2RlbExvYWRlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgZW5jb2RpbmdOYW1lU2VhcmNoTGltaXQgPSAxMDAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgbG9uZyBjb21wdXRlTWVtKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJU3lzdGVtLmdjKCk7Ci0JCQlTeXN0ZW0ucnVuRmluYWxpemF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIFJ1bnRpbWUuZ2V0UnVudGltZSgpLnRvdGFsTWVtb3J5KCkgLSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJvdGVjdGVkIElEb2N1bWVudExvYWRlciBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCi0JLyoqCi0JICogQWJzdHJhY3RMb2FkZXIgY29uc3RydWN0b3IgYWxzbyBpbml0aWFsaXplcyBlbmNvZGluZyBjb252ZXJ0ZXIvbWFwcGVyCi0JICovCi0JcHVibGljIEFic3RyYWN0TW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIExpc3QgZmFjdG9yeUxpc3QpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChtb2RlbCk7Ci0JCUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHJlZ2lzdHJ5LCAiSVN0cnVjdHVyZWRNb2RlbCAiICsgbW9kZWwuZ2V0SWQoKSArICIgaGFzIGEgbnVsbCBGYWN0b3J5UmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChmYWN0b3J5TGlzdCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGZhY3RvcnlMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlyZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHBlcmZvcm0gYWxsIHRoZSBtb2RlbCBpbml0aWFsaXphdGlvbiByZXF1aXJlZCBiZWZvcmUKLQkgKiBpdCBjb250YWlucyBjb250ZW50LCBuYW1lbHksIGl0IHNob3VsZCBjYWxsIG5ld01vZGVsLCB0aGUKLQkgKiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgdGhlbiBhZGQgdGhvc2UgYWRhcHRlciBmYWN0b3JpZXMgd2hpY2gKLQkgKiBtdXN0IGJlIHNldCBiZWZvcmUgY29udGVudCBpcyBhcHBsaWVkLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5Ci0JICogImxvYWQiIG1ldGhvZC4gKHRoaXMgaXMgdGVudGF0aXZlIEFQSSkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbCgpIHsKLQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBuZXdNb2RlbCgpOwotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQltb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlhZGRGYWN0b3JpZXMobW9kZWwsIGdldEFkYXB0ZXJGYWN0b3JpZXMoKSk7Ci0JCQkvLwotCQkJaW5pdEVtYmVkZGVkVHlwZVByZShtb2RlbCwgKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlpbml0RW1iZWRkZWRUeXBlUG9zdChtb2RlbCk7Ci0JCQkvLyBGb3IgdHlwZXMgd2l0aCBwcm9wYWdhdGluZyBhZGFwdGVycywgaXRzIGltcG9ydGFudAotCQkJLy8gdGhhdCB0aGUgcHJvcGFnYXRpbmcgYWRhcHRlciBiZSBpbiBwbGFjZSBiZWZvcmUgdGhlIGNvbnRlbnRzCi0JCQkvLyBhcmUgc2V0LgotCQkJcHJlTG9hZEFkYXB0KG1vZGVsKTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTW9kZWwoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIFN0cmluZyBiYXNlTG9jYXRpb24sIElNb2RlbEhhbmRsZXIgaGFuZGxlcikgewotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG5ld01vZGVsKCk7Ci0JCW1vZGVsLnNldEJhc2VMb2NhdGlvbihiYXNlTG9jYXRpb24pOwotCQkKLQkJLy8gaGFuZGxlciBtdXN0IGJlIHNldCBlYXJseSwgaW5jYXNlIGEgcmUtaW5pdCBpcyAKLQkJLy8gcmVxdWlyZWQgZHVyaW5nIGNyZWF0aW9uLgotCQltb2RlbC5zZXRNb2RlbEhhbmRsZXIoaGFuZGxlcik7Ci0JCQotCQlhZGRGYWN0b3JpZXMobW9kZWwsIGdldEFkYXB0ZXJGYWN0b3JpZXMoKSk7Ci0JCS8vIEZvciB0eXBlcyB3aXRoIHByb3BhZ2F0aW5nIGFkYXB0ZXJzLCBpdCdzIGltcG9ydGFudAotCQkvLyB0aGF0IHRoZSBwcm9wYWdhdGluZyBhZGFwdGVyIGJlIGluIHBsYWNlIGJlZm9yZSB0aGUgY29udGVudHMKLQkJLy8gYXJlIHNldC4KLQkJcHJlTG9hZEFkYXB0KG1vZGVsKTsKLQkJaW5pdEVtYmVkZGVkVHlwZVByZShtb2RlbCwgc3RydWN0dXJlZERvY3VtZW50KTsKLQotCQltb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJLy8KLQkJaW5pdEVtYmVkZGVkVHlwZVBvc3QobW9kZWwpOwotCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBjbG9uaW5nIG1vZGVscy4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsKSB7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbmV3TW9kZWwoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBvbGRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQubmV3SW5zdGFuY2UoKTsKLQkJbmV3TW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vIE5PVEU6IHdlIERPIE5PVCBzaW1wbHkgYWRkIHRoZSBzdGFuZGFyZCBvbmVzIHRvIHRoZSBuZXcgbW9kZWwKLQkJLy8gYWRkRmFjdG9yaWVzKG5ld01vZGVsLCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkpOwotCQkvLyBOb3csIHdlIHRha2UgdGhlIG9wcG9ydHVuaXR5IHRvIGFkZCBGYWN0b3JpZXMgZnJvbSB0aGUgb2xkTW9kZWwncwotCQkvLyByZWdpc3RyeSB0byB0aGUgbmV3IG1vZGVsJ3MgcmVnaXN0cnkgLi4gaWYgdGhleSBkbyBub3QgYWxyZWFkeQotCQkvLyBleGlzdCB0aGVyZS4KLQkJZHVwbGljYXRlRmFjdG9yeVJlZ2lzdHJ5KG5ld01vZGVsLCBvbGRNb2RlbCk7Ci0JCWlmIChuZXdNb2RlbCBpbnN0YW5jZW9mIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSB7Ci0JCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBuZXdNb2RlbCkuc2V0Q29udGVudFR5cGVJZGVudGlmaWVyKG9sZE1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsKLQkJfQotCQkvLyBhZGRGYWN0b3JpZXMobmV3TW9kZWwsIG9sZE1vZGVsKTsKLQkJaW5pdEVtYmVkZGVkVHlwZShvbGRNb2RlbCwgbmV3TW9kZWwpOwotCQkvLyBGb3IgdHlwZXMgd2l0aCBwcm9wYWdhdGluZyBhZGFwdGVycywgaXRzIGltcG9ydGFudAotCQkvLyB0aGF0IHRoZSBwcm9wYWdhdGluZyBhZGFwdGVyIGJlIGluIHBsYWNlIGJlZm9yZSB0aGUgY29udGVudHMKLQkJLy8gYXJlIHNldC4KLQkJcHJlTG9hZEFkYXB0KG5ld01vZGVsKTsKLQkJcmV0dXJuIG5ld01vZGVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBkdXBsaWNhdGVGYWN0b3J5UmVnaXN0cnkoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCkgewotCQlMaXN0IG9sZEFkYXB0ZXJGYWN0b3JpZXMgPSBvbGRNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3JpZXMoKTsKLQkJTGlzdCBuZXdBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBvbGRMaXN0SXRlcmF0b3IgPSBvbGRBZGFwdGVyRmFjdG9yaWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChvbGRMaXN0SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IG9sZEFkYXB0ZXJGYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIG9sZExpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQkvLyBub3cgImNsb25lIiB0aGUgYWRhcHRlcmZhY3RvcnkKLQkJCW5ld0FkYXB0ZXJGYWN0b3JpZXMuYWRkKG9sZEFkYXB0ZXJGYWN0b3J5LmNvcHkoKSk7Ci0JCX0KLQkJLy8gbm93IHRoYXQgd2UgaGF2ZSB0aGUgImNsb25lZCIgbGlzdCwgYWRkIHRvIG5ldyBtb2RlbAotCQlhZGRGYWN0b3JpZXMobmV3TW9kZWwsIG5ld0FkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRob3NlIGZhY3RvcmllcyB3aGljaCBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZQotCSAqIHN0cnVjdHVyZWRNb2RlbCBiZWZvcmUgY29udGVudCBpcyBhcHBsaWVkLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCS8vIGFic3RyYWN0IG1ldGhvZCByZXR1cm5zIG5vbmUKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoMCk7Ci0JfQotCi0JYWJzdHJhY3QgcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpOwotCi0JLyoqCi0JICogTWV0aG9kIGluaXRFbWJlZGRlZFR5cGUsICJwcmUiLXN0YWdlLiBOb3RoaW5nIHRvIGRvIGhlcmUgaW4gc3VwZXIgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZVByZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGluaXRFbWJlZGRlZFR5cGUsICJwcmUiLXN0YWdlLiBCeSBkZWZhdWx0IHNpbXBseSBjYWxscyB0aGUKLQkgKiB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kIHRoYXQgdXNlcyBvbmx5IHRoZSBzdHJ1Y3R1cmVkIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgdGhlIG1vZGVsIGZvciB3aGljaCB0byBpbml0aWFsaXplCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudAotCSAqICAgICAgICAgICAgVGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgY29udGFpbmluZyB0aGUgdGV4dCBjb250ZW50IGZvciB0aGUKLQkgKiAgICAgICAgICAgIG1vZGVsLCB3aGljaCBtYXkgYmUgYSBkaWZmZXJlbnQgaW5zdGFuY2UgdGhhbiB3aGF0IGlzIGluIHRoZQotCSAqICAgICAgICAgICAgbW9kZWwgYXQgdGhpcyBzdGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RW1iZWRkZWRUeXBlUHJlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWluaXRFbWJlZGRlZFR5cGVQcmUobW9kZWwpOwotCX0KLQkJCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZVBvc3QoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBpbml0RW1iZWRkZWRUeXBlLiBOb3RoaW5nIHRvIGRvIGhlcmUgaW4gc3VwZXIgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIG9sZE1vZGVsCi0JICogQHBhcmFtIG5ld01vZGVsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZChJRmlsZSBmaWxlLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJZWxzZQotCQkJc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoZmlsZSk7Ci0KLQkJLy8gVE9ETzogbmVlZCB0byBzdHJhaWdodGVuIG91dCBJRW5jb2RlZERvY3VtZW50IG1lc3MKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQl0cmFuc2Zvcm1JbnN0YW5jZShtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCWVsc2UKLQkJCW1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnNldChzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KCkpOwotCi0JCS8vIG9yaWdpbmFsIGhhY2sKLQkJLy8gbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KChJU3RydWN0dXJlZERvY3VtZW50KQotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLyAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuZmlyZU5ld0RvY3VtZW50KHRoaXMpOwotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQkJLy8gdGVjaG5pY3Egb2YgZnV0dXJlCi0JCS8vIG1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudCgoSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50KTsKLQkJLy8gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQkvLyBub3RlIHdlIGRvbid0IG9wZW4gdGhlIHN0cmVhbSwgc28gd2UgZG9uJ3QgY2xvc2UgaXQKLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKLQkJCXN0cnVjdHVyZWREb2N1bWVudCA9IGdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBhc3N1bWUncyBtb2RlbCBoYXMgYmVlbiBpbml0aWFsaXplZCBhbHJlYWR5IHdpdGggYmFzZSBsb2NhdGlvbgotCQkJc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCksIGlucHV0U3RyZWFtLCBlbmNvZGluZ1J1bGUpOwotCQkJLy8gVE9ETzogbW9kZWwncyBub3QgZGVzaWduZWQgZm9yIHRoaXMhCi0JCQkvLyB3ZSB3YW50IHRvIG1vdmUgdG8gdGhpcyAic2V0IiBtZXRob2QsIGJ1dCB0aGUgJ2ZpcmUnIHdhcyBuZWVkZWQKLQkJCS8vIGFzCi0JCQkvLyBhIHdvcmsgYXJvdW5kIGZvciBzdHJ1Y3V0cmVkTW9kZWwgbm90IGhhbmRsaW5nICdzZXQnIHJpZ2h0LCBidXQKLQkJCS8vIHRoYXQgJ2ZpcmVOZXdEb2N1bWVudCcgbWV0aG9kIHdhcyBjYXVzaW5nIHVuYmFsYW5jZQotCQkJLy8gImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIKLQkJCS8vIGV2ZW50cy4KLQkJCS8vIG1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudCgoSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJCS8vIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQkvLyAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQpLmZpcmVOZXdEb2N1bWVudCh0aGlzKTsKLQkJCW1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnNldChzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KCkpOwotCi0JCX0KLQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0KLQl9Ci0KLQkvKioKLQkgKiBkZXByZWNhdGVkIC0tIHVzZSBFbmNvZGluZ1J1bGUgZm9ybQotCSAqLwotCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBTdHJpbmcgZW5jb2RpbmdOYW1lLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQkvLyBub3RlIHdlIGRvbid0IG9wZW4gdGhlIHN0cmVhbSwgc28gd2UgZG9uJ3QgY2xvc2UgaXQKLQkJLy8gVEVNUCB3b3JrIGFyb3VuZCB0byBtYWludGFpbiBwcmV2aW91cyBmdW5jdGlvbiwKLQkJLy8gdW50aWwgZXZlcnlvbmUgY2FuIGNoYW5nZSB0byBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVAotCQlpZiAoZW5jb2RpbmdOYW1lICE9IG51bGwgJiYgZW5jb2RpbmdOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkvLyByZWRpcmVjdCB0byBuZXcgbWV0aG9kCi0JCQlsb2FkKGlucHV0U3RyZWFtLCBtb2RlbCwgRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQpOwotCQl9Ci0JCWVsc2UgewotCQkJbG9hZChpbnB1dFN0cmVhbSwgbW9kZWwsIEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIGp1bmssIFN0cmluZyBkdW1teSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0JCWxvbmcgbWVtb3J5VXNlZCA9IDA7Ci0JCWlmIChERUJVRykgewotCQkJbWVtb3J5VXNlZCA9IGNvbXB1dGVNZW0oKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibWVhc3VyaW5nIGhlYXAgbWVtb3J5IGZvciAiICsgZmlsZW5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhlYXAgbWVtb3J5IHVzZWQgYmVmb3JlIGxvYWQ6ICIgKwotCQkJLy8gbWVtb3J5VXNlZCk7Ci0JCX0KLQotCQkvLyBkdXJpbmcgYW4gaW5pdGlhbCBsb2FkLCB3ZSBleHBlY3QgdGhlIG9sZGRvY3VtZW50IHRvIGJlIGVtcHR5Ci0JCS8vIGR1cmluZyByZS1sb2FkLCBob3dldmVyLCBpdCB3b3VsZCBiZSBmdWxsLgotCQlJRW5jb2RlZERvY3VtZW50IG5ld3N0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgb2xkU3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJLy8gZ2V0IG5ldyBkb2N1bWVudAotCQlpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotCQkJbmV3c3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5ld3N0cnVjdHVyZWREb2N1bWVudCA9IGdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSk7Ci0JCX0KLQkJaWYgKERFQlVHKSB7Ci0JCQlsb25nIG1lbW9yeUF0RW5kID0gY29tcHV0ZU1lbSgpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJoZWFwIG1lbW9yeSB1c2VkIGFmdGVyIGxvYWRpbmcgbmV3Ci0JCQkvLyBkb2N1bWVudDogIiArIG1lbW9yeUF0RW5kKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIGhlYXAgbWVtb3J5IGltcGxpZWQgdXNlZCBieSBkb2N1bWVudDogIiArIChtZW1vcnlBdEVuZCAtIG1lbW9yeVVzZWQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQotCQkvLyBUT0RPOiBuZWVkIHRvIHN0cmFpZ2h0ZW4gb3V0IElFbmNvZGVkRG9jdW1lbnQgbWVzcwotCQlpZiAobmV3c3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJdHJhbnNmb3JtSW5zdGFuY2UoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIG9sZFN0cnVjdHVyZWREb2N1bWVudCwgKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIG5ld3N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB3ZSBkb24ndCByZWFsbHkgZXhwZWN0IHRoaXMgY2FzZSwganVzdCBpbmNsdWRlZCBmb3Igc2FmZXR5Ci0JCQlvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0KG5ld3N0cnVjdHVyZWREb2N1bWVudC5nZXQoKSk7Ci0JCX0KLQkJLy8gb3JpZ2luYWwgaGFjawotCQkvLyBtb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vICgoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5maXJlTmV3RG9jdW1lbnQodGhpcyk7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQkvLyB0ZWNobmljcSBvZiBmdXR1cmUKLQkJLy8gbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KChJU3RydWN0dXJlZERvY3VtZW50KQotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLyBkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQkJaWYgKERFQlVHKSB7Ci0JCQlsb25nIG1lbW9yeUF0RW5kID0gY29tcHV0ZU1lbSgpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJoZWFwIG1lbW9yeSB1c2VkIGFmdGVyIHNldHRpbmcgdG8gbW9kZWw6ICIKLQkJCS8vICsgbWVtb3J5QXRFbmQpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgaGVhcCBtZW1vcnkgaW1wbGllZCB1c2VkIGJ5IGRvY3VtZW50IGFuZCBtb2RlbDogIiArIChtZW1vcnlBdEVuZCAtIG1lbW9yeVVzZWQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiByZXF1aXJlZCBieSBpbnRlcmZhY2UsIGJlaW5nIGRlY2xhcmVkIGhlcmUgYWJzdHJhY3RseSBqdXN0IGFzIGFub3RoZXIKLQkgKiByZW1pbmRlci4KLQkgKi8KLQlhYnN0cmFjdCBwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpOwotCi0JLyoqCi0JICogVGhlcmUncyBub3RoaW5nIHRvIGRvIGhlcmUgaW4gYWJzdHJhY3QgY2xhc3MgZm9yIGluaXRpYWxpemluZyBhZGFwdGVycy4KLQkgKiBTdWJjbGFzc2VzIGNhbiBhbmQgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBwcm92aWRlIHByb3BlcgotCSAqIGludGlhbGl6YXRpb24gKEZvciBleGFtcGxlLCB0byBnZXQgRE9NIGRvY3VtZW50IGFuZCAnZ2V0QWRhcHRlcicgb24gaXQsCi0JICogc28gdGhhdCB0aGUgZmlyc3Qgbm9kZS9ub3RpZmllciBoYXMgdGhlIGFkYXB0ZXIgb24gaXQuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByZUxvYWRBZGFwdChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0KLQl9Ci0KLQkvKioKLQkgKiBOb3JtYWxseSwgaGVyZSBpbiB0aGUgYWJzdGFjdCBjbGFzcywgdGhlcmUncyBub3RoaW5nIHRvIGRvLCBidXQgd2Ugd2lsbAotCSAqIHJlc2V0IHRleHQsIHNpbmNlIHRoaXMgTUlHSFQgZW5kIHVwIGJlaW5nIGNhbGxlZCB0byByZWNvdmVyIGZyb20gZXJyb3IKLQkgKiBjb25kaXRpb25zIChlLmcuIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZXhjZXB0aW9ucykgQW5kLCBjYW4gYmUgY2FsbGVkIGJ5Ci0JICogc3ViY2xhc3Nlcy4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCByZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkvLyBOb3RlOiB0aGUgIm1pbmltdW1pemF0aW9uIiByb3V0aW5lcwotCQkvLyBvZiAncmVwbGFjZVRleHQnIGFsbG93IG1hbnkgb2xkIG5vZGVzIHRvIHBhc3MgdGhyb3VnaCwgd2hlbgotCQkvLyByZWFsbHkgaXRzIGFzc3VtZWQgdGhleSBhcmUgY3JlYXRlZCBhbmV3LgotCQkvLyBzbyB3ZSBuZWVkIHRvIHVzZSAnc2V0VGV4dCcgKEkgdGhpbmsgInNldFRleHQnIGVuZHMgdXAKLQkJLy8gdGhyb3dpbmcgYSAnbmV3TW9kZWwnIGV2ZW50IHRob3VnaCwgdGhhdCBtYXkgaGF2ZSBzb21lCi0JCS8vIGltcGxpY2F0aW9ucy4KLQkJbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0VGV4dCh0aGlzLCBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQoKSk7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGEgZnJlc2ggY29weSBvZiB0aGUgZGF0YSwgYW5kIHJlcG9wdWxhdGVzIHRoZSBtb2RlbHMKLQkgKiAuLi4gYnkgYSBjYWxsIHRvIHNldFRleHQgb24gdGhlIHN0cnVjdHVyZWREb2N1bWVudC4gVGhpcyBtZXRob2QgaXMKLQkgKiBuZWVkZWQgaW4gc29tZSBjYXNlcyB3aGVyZSBjbGllbnRzIGFyZSBzaGFyaW5nIGEgbW9kZWwgYW5kIHRoZW4gY2hhbmdlcwotCSAqIGNhbmNlbGVkLiBTYXkgZm9yIGV4YW1wbGUsIG9uZSBlZGl0b3IgYW5kIHNldmVyYWwgImRpc3BsYXlzIiBhcmUKLQkgKiBzaGFyaW5nIGEgbW9kZWwsIGlmIHRoZSBlZGl0b3IgaXMgY2xvc2VkIHdpdGhvdXQgc2F2aW5nIGNoYW5nZXMsIHRoZW4KLQkgKiB0aGUgZGlzcGxheXMgc3RpbGwgbmVlZCBhIG1vZGVsLCBidXQgdGhleSBzaG91bGQgcmV2ZXJ0IHRvIHRoZSBvcmlnaW5hbAotCSAqIHVuc2F2ZWQgdmVyc2lvbi4KLQkgKi8KLQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgcmVsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHRlbXAgc29sdXRpb24gLi4uIHdlIHNob3VsZCBiZSBhYmxlIHRvIGRvIGJldHRlciAobW9yZQotCQkJLy8gZWZmaWNpZW50KSBpbiBmdXR1cmUuCi0JCQkvLyBBZGFwdGVycyB3aWxsIChwcm9iYWJseSkgbmVlZCB0byBiZSBzZW5zaXRpdmUgdG8gdGhlIGZhY3QgdGhhdAotCQkJLy8gdGhlIGRvY3VtZW50IGluc3RhbmNlIGNoYW5nZWQKLQkJCS8vIChieSBiZWluZyBsaWZlIGN5Y2xlIGxpc3RlbmVycykKLQkJCWxvYWQoaW5wdXRTdHJlYW0sIHN0cnVjdHVyZWRNb2RlbCwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCi0JCQkvLyAvLyBOb3RlOiB3ZSBhcHBhcmVudGx5IHJlYWQgdGhlIGRhdGEgKGFuZCBlbmNvZGluZykgY29ycmVjdGx5Ci0JCQkvLyAvLyBiZWZvcmUsIHdlIGp1c3QgbmVlZCB0byBtYWtlIHN1cmUgd2UgZm9sbG93ZWQgdGhlIHNhbWUgcnVsZQotCQkJLy8gYXMKLQkJCS8vIC8vIGJlZm9yZS4KLQkJCS8vIEVuY29kaW5nTWVtZW50byBwcmV2aW91c01lbWVudG8gPQotCQkJLy8gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkJLy8gRW5jb2RpbmdSdWxlIHByZXZpb3VzUnVsZSA9IHByZXZpb3VzTWVtZW50by5nZXRFbmNvZGluZ1J1bGUoKTsKLQkJCS8vIC8vSUZpbGUgZmlsZSA9IFJlc291cmNlVXRpbC5nZXRGaWxlRm9yKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCQkvLyAvLyBOb3RlOiB0aGVyZSdzIG9wcG9ydHVuaXR5IGhlcmUgZm9yIHNvbWUgb2RkIGJlaGF2aW9yLCBpZiB0aGUKLQkJCS8vIC8vIHNldHRpbmdzIGhhdmUgY2hhbmdlZCBmcm9tIHRoZSBmaXJzdCBsb2FkIHRvIHRoZSByZWxvYWQuCi0JCQkvLyBCdXQsCi0JCQkvLyAvLyBob3BlZnVsbHksCi0JCQkvLyAvLyB3aWxsIHJlc3VsdCBpbiB0aGUgaW50ZW5kZWQgYmVoYXZpb3IuCi0JCQkvLyBSZWFkZXIgYWxsVGV4dFJlYWRlciA9Ci0JCQkvLyBnZXREb2N1bWVudExvYWRlcigpLnJlYWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgcHJldmlvdXNSdWxlKTsKLQkJCS8vCi0JCQkvLyAvLyBUT0RPOiBhdm9pZCB1c2Ugb2YgU3RyaW5nIGluc3RhbmNlCi0JCQkvLyBnZXREb2N1bWVudExvYWRlcigpLnJlbG9hZChzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksCi0JCQkvLyBhbGxUZXh0UmVhZGVyKTsKLQkJCS8vIC8vIGFuZCBub3cgInJlc2V0IiBlbmNvZGluZyBtZW1lbnRvIHRvIGtlZXAgaXQgY3VycmVudCB3aXRoIHRoZQotCQkJLy8gLy8gb25lCi0JCQkvLyAvLyB0aGF0IHdhcyBqdXN0IGRldGVybWluZWQuCi0JCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0RW5jb2RpbmdNZW1lbnRvKGdldERvY3VtZW50TG9hZGVyKCkuZ2V0RW5jb2RpbmdNZW1lbnRvKCkpOwotCQkJLy8gc3RydWN0dXJlZE1vZGVsLnNldERpcnR5U3RhdGUoZmFsc2UpOwotCQkJLy8gU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWdyID0KLQkJCS8vIHN0cnVjdHVyZWRNb2RlbC5nZXRVbmRvTWFuYWdlcigpOwotCQkJLy8gaWYgKHVuZG9NZ3IgIT0gbnVsbCkgewotCQkJLy8gdW5kb01nci5yZXNldCgpOwotCQkJLy8gfQotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGNvdWxkbid0IGhhcHBlbi4gVGhlIHByb2dyYW0gaGFzIGFwcGFyZW50bHkKLQkJCS8vIHJlYWQgdGhlIG1vZGVsIG9uY2UsIGFuZCB0aGVyZSdkIGJlIG5vIHJlYXNvbiB0aGUgZW5jb2RpbmcKLQkJCS8vIGNvdWxkIG5vdCBiZSB1c2VkIGFnYWluLgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiV2FybmluZzogIFhNTExvYWRlcjo6cmVsb2FkLiAgVGhpcyBleGNlcHRpb24gcmVhbGx5IHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCEhIEJ1dCB3aWxsIGF0dGVtcCB0byBjb250aW51ZSBhZnRlciBkdW1waW5nIHN0YWNrIHRyYWNlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBFcnJvcigiUHJvZ3JhbSBFcnJvciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGNvdWxkbid0IGhhcHBlbi4gVGhlIHByb2dyYW0gaGFzIGFwcGFyZW50bHkKLQkJCS8vIHJlYWQgdGhlIG1vZGVsIG9uY2UsIGFuZCB0aGVyZSdkIGJlIG5vIChjb21tb24pIHJlYXNvbiBpdAotCQkJLy8gY291bGRuJ3QgYmUgbG9hZGVkIGFnYWluLgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiV2FybmluZzogIFhNTExvYWRlcjo6cmVsb2FkLiAgVGhpcyBleGNlcHRpb24gcmVhbGx5IHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCEhIEJ1dCB3aWxsIGF0dGVtcCB0byBjb250aW51ZSBhZnRlciBkdW1waW5nIHN0YWNrIHRyYWNlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBFcnJvcigiUHJvZ3JhbSBFcnJvciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0aGlzIHdvcmsgaXMgZG9uZSBiZXR0ZXIgZWxzZXdoZXJlLCBidXQgZG9uZSBoZXJlIGZvciB0aGlzIHZlcnNpb24gdG8KLQkgKiByZWR1Y2UgY2hhbmdlcy4gZXNwZWNpYWxseSBzaW5jZSB0aGUgbmVlZCBmb3IgaXQgc2hvdWxkIGdvIGF3YXkgb25jZSB3ZQotCSAqIG5vIGxvbmdlciBuZWVkIHRvIHJlLXVzZSBvbGQgZG9jdW1lbnQgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyYW5zZm9ybUluc3RhbmNlKElTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkSW5zdGFuY2UsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3SW5zdGFuY2UpIHsKLQkJLyoqCi0JCSAqIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00OTIwCi0JCSAqIAotCQkgKiBKU1AgdGFnbGliIHN1cHBvcnQgYnJva2VuLCBjb3JyZWN0IGJ5IGR1cGxpY2F0aW5nIGV4dGVuZGVkIHNldHVwCi0JCSAqIGluZm9ybWF0aW9uIChCbG9ja1RhZ1BhcnNlciBleHRlbnNpb24sCi0JCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciBleHRlbnNpb25zKQotCQkgKi8KLQkJUmVnaW9uUGFyc2VyIG9sZFBhcnNlciA9IG9sZEluc3RhbmNlLmdldFBhcnNlcigpOwotCQlSZWdpb25QYXJzZXIgbmV3UGFyc2VyID0gbmV3SW5zdGFuY2UuZ2V0UGFyc2VyKCkubmV3SW5zdGFuY2UoKTsKLQkJLy8gUmVnaXN0ZXIgYWxsIG9mIHRoZSBvbGQgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgb24gdGhlIG5ldwotCQkvLyBwYXJzZXIKLQkJaWYgKG9sZFBhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbiAmJiBuZXdQYXJzZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24pIHsKLQkJCUxpc3Qgb2xkSGFuZGxlcnMgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbikgb2xkUGFyc2VyKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRIYW5kbGVycy5zaXplKCk7IGkrKykgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaGFuZGxlciA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcikgb2xkSGFuZGxlcnMuZ2V0KGkpKTsKLQkJCQlpZiAoaGFuZGxlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24pIHsKLQkJCQkJLyoqCi0JCQkJCSAqIFNraXAgdGhlIHRyYW5zZmVycmluZyBoZXJlLCB0aGUgaGFuZGxlciB3aWxsIGRvIHRoaXMKLQkJCQkJICogYWZ0ZXIgZXZlcnl0aGluZyBlbHNlIGJ1dCB0aGUgc291cmNlIGlzIHRyYW5zZmVycmVkLgotCQkJCQkgKi8KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyKSBvbGRQYXJzZXIpLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoaGFuZGxlcik7Ci0JCQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyKSBuZXdQYXJzZXIpLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoaGFuZGxlcik7Ci0JCQkJCWhhbmRsZXIucmVzZXROb2RlcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBBZGQgYW55IGdsb2JhbCBCbG9ja01hcmtlcnMgdG8gdGhlIG5ldyBwYXJzZXIKLQkJaWYgKG9sZFBhcnNlciBpbnN0YW5jZW9mIEJsb2NrVGFnUGFyc2VyICYmIG5ld1BhcnNlciBpbnN0YW5jZW9mIEJsb2NrVGFnUGFyc2VyKSB7Ci0JCQlMaXN0IG9sZEJsb2NrTWFya2VycyA9ICgoQmxvY2tUYWdQYXJzZXIpIG9sZFBhcnNlcikuZ2V0QmxvY2tNYXJrZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZEJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJCUJsb2NrTWFya2VyIGJsb2NrTWFya2VyID0gKChCbG9ja01hcmtlcikgb2xkQmxvY2tNYXJrZXJzLmdldChpKSk7Ci0JCQkJaWYgKGJsb2NrTWFya2VyLmlzR2xvYmFsKCkpIHsKLQkJCQkJKChCbG9ja1RhZ1BhcnNlcikgbmV3UGFyc2VyKS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgb2xkSW5zdGFuY2UpLnNldFBhcnNlcihuZXdQYXJzZXIpOwotCi0JCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIG9sZEluc3RhbmNlKS5zZXRSZVBhcnNlcihuZXdJbnN0YW5jZS5nZXRSZVBhcnNlcigpLm5ld0luc3RhbmNlKCkpOwotCi0JCWlmIChuZXdJbnN0YW5jZS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gbnVsbDsKLQkJCWlmIChvbGRJbnN0YW5jZSBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMgJiYgbmV3SW5zdGFuY2UgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24zKSB7Ci0JCQkJcGFydGl0aW9uZXIgPSAoKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpICgoSURvY3VtZW50RXh0ZW5zaW9uMykgbmV3SW5zdGFuY2UpLmdldERvY3VtZW50UGFydGl0aW9uZXIoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORykpOwotCQkJCWlmIChwYXJ0aXRpb25lciAhPSBudWxsKSB7Ci0JCQkJCXBhcnRpdGlvbmVyID0gKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpIHBhcnRpdGlvbmVyLm5ld0luc3RhbmNlKCk7Ci0JCQkJfQotCQkJCSgoSURvY3VtZW50RXh0ZW5zaW9uMykgb2xkSW5zdGFuY2UpLnNldERvY3VtZW50UGFydGl0aW9uZXIoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORywgcGFydGl0aW9uZXIpOwotCQkJfQotCQkJaWYgKHBhcnRpdGlvbmVyID09IG51bGwpIHsKLQkJCQlwYXJ0aXRpb25lciA9IChTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKSAoKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpIG5ld0luc3RhbmNlLmdldERvY3VtZW50UGFydGl0aW9uZXIoKSkubmV3SW5zdGFuY2UoKTsKLQkJCQlvbGRJbnN0YW5jZS5zZXREb2N1bWVudFBhcnRpdGlvbmVyKHBhcnRpdGlvbmVyKTsKLQkJCX0KLQkJCWlmIChwYXJ0aXRpb25lciAhPSBudWxsKSB7Ci0JCQkJcGFydGl0aW9uZXIuY29ubmVjdChvbGRJbnN0YW5jZSk7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgZXhpc3RpbmdMaW5lRGVsaW1pdGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWV4aXN0aW5nTGluZURlbGltaXRlciA9IG5ld0luc3RhbmNlLmdldExpbmVEZWxpbWl0ZXIoMCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGVtcHR5IGZpbGUsIGFzc3VtZSBwbGF0Zm9ybSBkZWZhdWx0Ci0JCQkvLyBUT0RPOiBzaG91bGQgYmUgdXNpbmcgdXNlciBzZXQgcHJlZmVyZW5jZSwgcGVyIGNvbnRlbnQgdHlwZT8KLQkJCWV4aXN0aW5nTGluZURlbGltaXRlciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJb2xkSW5zdGFuY2Uuc2V0TGluZURlbGltaXRlcihleGlzdGluZ0xpbmVEZWxpbWl0ZXIpOyAvLyROT04tTkxTLTEkKTsKLQkJaWYgKG5ld0luc3RhbmNlLmdldEVuY29kaW5nTWVtZW50bygpICE9IG51bGwpIHsKLQkJCW9sZEluc3RhbmNlLnNldEVuY29kaW5nTWVtZW50bygoRW5jb2RpbmdNZW1lbnRvKSBuZXdJbnN0YW5jZS5nZXRFbmNvZGluZ01lbWVudG8oKS5jbG9uZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkyMAotCQkgKiAKLQkJICogSlNQIHRhZ2xpYiBzdXBwb3J0IGJyb2tlbiwgY29ycmVjdCBieSBkdXBsaWNhdGluZyBleHRlbmRlZCBzZXR1cAotCQkgKiBpbmZvcm1hdGlvbiAoQmxvY2tUYWdQYXJzZXIgZXh0ZW5zaW9uLAotCQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIgZXh0ZW5zaW9ucykKLQkJICovCi0JCWlmIChvbGRQYXJzZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24gJiYgbmV3UGFyc2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uKSB7Ci0JCQlMaXN0IG9sZEhhbmRsZXJzID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24pIG9sZFBhcnNlcikuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkSGFuZGxlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGhhbmRsZXIgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIpIG9sZEhhbmRsZXJzLmdldChpKSk7Ci0JCQkJaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uKSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24gaGFuZGxlckV4dGVuc2lvbiA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uKSBoYW5kbGVyOwotCQkJCQloYW5kbGVyRXh0ZW5zaW9uLnNldFN0cnVjdHVyZWREb2N1bWVudChvbGRJbnN0YW5jZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN0cmluZyBob2xkU3RyaW5nID0gbmV3SW5zdGFuY2UuZ2V0KCk7Ci0JCW5ld0luc3RhbmNlID0gbnVsbDsKLQkJb2xkSW5zdGFuY2Uuc2V0KGhvbGRTdHJpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxOGZjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0Fic3RyYWN0U3RydWN0dXJlZE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JTG9ja2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuRG9jdW1lbnRDaGFuZ2VkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLkFib3V0VG9CZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkTW9kZWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX01BTkFHRVJfTlVMTCA9ICJXYXJuaW5nOiBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbDo6Y2xvc2U6ICBtb2RlbCBtYW5hZ2VyIHdhcyBudWxsIGR1cmluZyBhIGNsb3NlIG9mIGEgbW9kZWwgKHdoaWNoIHNob3VsZCBiZSBpbXBvc3NpYmxlKSI7IC8vJE5PTi1OTFMtMSQKLQotCWNsYXNzIERpcnR5U3RhdGVXYXRjaGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIHsKLQotCQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCS8vIEkgZG9uJ3QgdGhpbmsgaXRzIHNhZmUgdG8gYXNzdW1lIGEgbmV3IG1vZGVsCi0JCQkvLyBpcyBhbHdheXMgImZyZXNoIiwgc28gd2UnbGwgbGVhdmUgZGlydHkgc3RhdGUKLQkJCS8vIHVuY2hhbmdlZDsKLQkJCS8vIGJ1dCB3ZSdsbCB0ZWxsIGV2ZXJ5b25lIGFib3V0IGl0LgotCQkJc2V0RGlydHlTdGF0ZShmRGlydHlTdGF0ZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCS8vIGRvbid0IGNoYW5nZSBkaXJ0eSBzdGF0ZQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlzZXREaXJ0eVN0YXRlKHRydWUpOwotCQkJLy8gbm8gbmVlZCB0byBsaXN0ZW4gYW55IG1vcmUKLQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEaXJ0eVN0YXRlV2F0Y2hlcik7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlzZXREaXJ0eVN0YXRlKHRydWUpOwotCQkJLy8gbm8gbmVlZCB0byBsaXN0ZW4gYW55IG1vcmUKLQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEaXJ0eVN0YXRlV2F0Y2hlcik7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJc2V0RGlydHlTdGF0ZSh0cnVlKTsKLQkJCS8vIG5vIG5lZWQgdG8gbGlzdGVuIGFueSBtb3JlCi0JCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmRGlydHlTdGF0ZVdhdGNoZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgRG9jdW1lbnRUb01vZGVsTm90aWZpZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIsIElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5BYm91dFRvQmVDaGFuZ2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoQWJvdXRUb0JlQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBJZiB3ZSBkaWRuJ3Qgb3JpZ2luYXRlIHRoZSBjaGFuZ2UsIHRha2Ugbm90ZSB3ZSBhcmUgYWJvdXQgdG8KLQkJCS8vIGNoYW5nZSBiYXNlZCBvbiBvdXIgdW5kZXJseWluZyBkb2N1bWVudCBjaGFuZ2luZy4KLQkJCS8vIElmIHdlIGRpZCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgd2UsIG9yIGNsaWVudCwgc2hvdWxkIGhhdmUKLQkJCS8vIGFscmVhZHkgY2FsbGVkIGFib3V0VG9DaGFuZ2VNb2RlbC4KLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpICE9IHRoaXMpIHsKLQkJCQlhYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCX0KLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNuZXdNb2RlbChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBpZiB3ZSBkaWRuJ3Qgb3JpZ2luYXRlIHRoZSBjaGFuZ2UsIHRha2Ugbm90ZSB3ZSBoYXZlIGNoYW5nZWQKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpICE9IHRoaXMpIHsKLQkJCQljaGFuZ2VkTW9kZWwoKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIjbm9DaGFuZ2Uob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5Ob0NoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gaWYgd2UgZGlkbid0IG9yaWdpbmF0ZSB0aGUgY2hhbmdlLCB0YWtlIG5vdGUgd2UgaGF2ZSBjaGFuZ2VkCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSAhPSB0aGlzKSB7Ci0JCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25vZGVzUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIGlmIHdlIGRpZG4ndCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgdGFrZSBub3RlIHdlIGhhdmUgY2hhbmdlZAotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgIT0gdGhpcykgewotCQkJCWNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNyZWdpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIGlmIHdlIGRpZG4ndCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgdGFrZSBub3RlIHdlIGhhdmUgY2hhbmdlZAotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgIT0gdGhpcykgewotCQkJCWNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNyZWdpb25zUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gaWYgd2UgZGlkbid0IG9yaWdpbmF0ZSB0aGUgY2hhbmdlLCB0YWtlIG5vdGUgd2UgaGF2ZSBjaGFuZ2VkCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSAhPSB0aGlzKSB7Ci0JCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeTsKLQlwcml2YXRlIFN0cmluZyBmQmFzZUxvY2F0aW9uOwotCWJvb2xlYW4gZkRpcnR5U3RhdGU7Ci0JRGlydHlTdGF0ZVdhdGNoZXIgZkRpcnR5U3RhdGVXYXRjaGVyOwotCURvY3VtZW50VG9Nb2RlbE5vdGlmaWVyIGZEb2N1bWVudFRvTW9kZWxOb3RpZmllcjsKLQlwcml2YXRlIFN0cmluZyBmRXhwbGljaXRDb250ZW50VHlwZUlkZW50aWZpZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgZklkOwotCi0JcHJpdmF0ZSBMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyIGZMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyOwotCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgZkxpc3RlbmVyTG9jayA9IG5ldyBieXRlWzBdOwotCXByb3RlY3RlZCBJTG9jayBmTG9ja09iamVjdDsKLQkvLyBwcml2YXRlIFN0cmluZyBmTGluZURlbGltaXRlcjsKLQkvLyBwcml2YXRlIE9iamVjdCBmVHlwZTsKLQlwcml2YXRlIElNb2RlbEhhbmRsZXIgZk1vZGVsSGFuZGxlcjsKLQkvLyBpc3N1ZTogd2Ugc2hvdWxkIG5vdCAiaG9sZCBvbiIgdG8gbW9kZWwgbWFuYWdlciwgY2FuIAotCS8vIGVhc2lseSBnZXQgd2l0aCBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCS8vIGJ1dCB3aWxsIG5lZWQgdG8gYWRkIG1vcmUgbnVsbCBjaGVja3MuCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIGZNb2RlbE1hbmFnZXI7Ci0JcHJpdmF0ZSBpbnQgZk1vZGVsU3RhdGVDaGFuZ2luZzsKLQlwcml2YXRlIE9iamVjdFtdIGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCXByaXZhdGUgYm9vbGVhbiBmTmV3U3RhdGUgPSBmYWxzZTsKLQlwcml2YXRlIFVSSVJlc29sdmVyIGZSZXNvbHZlcjsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50OwotCS8qKgotCSAqIFRoZSB0aW1lIHN0YW1wIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlJ3MgbW9kaWZpY2F0aW9uIGRhdGUsIGF0IHRoZQotCSAqIHRpbWUgdGhpcyBtb2RlbCB3YXMgY3JlYXRlZCwgb3IgdGhlIGxhc3QgdGltZSBpdCB3YXMgc2F2ZWQuIE5vdGU6IGZvcgotCSAqIHRoaXMgdmVyc2lvbiwgdGhpcyB2YXJpYWJsZSBpcyBub3Qgc2V0IGF1dG9tYXRpY2FsbHksIGJlIG5lZWRzIHRvIGJlCi0JICogbWFuYWdlZCBieSBjbGllbnQuIFRoZSBGaWxlTW9kZWxQcm92aWRlciBkb2VzIHRoaXMgZm9yIG1vc3QgY2FzZXMsIGJ1dAotCSAqIGlmIGNsaWVudCBkbyBub3QgdXNlIEZpbGVNb2RlbFByb3ZpZGVyLCB0aGV5IG11c3Qgc2V0IHRoaXMgdmFyaWFibGUKLQkgKi8KLQlwdWJsaWMgbG9uZyBmU3luY2hyb25pemF0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQlwcml2YXRlIGJvb2xlYW4gcmVpbml0aWFsaXphdGlvbk5lZWRlZDsKLQlwcml2YXRlIE9iamVjdCByZWluaXRpYWxpemVTdGF0ZURhdGE7Ci0KLQkvKioKLQkgKiBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCgpIHsKLQotCQlzdXBlcigpOwotCQlmRGlydHlTdGF0ZVdhdGNoZXIgPSBuZXcgRGlydHlTdGF0ZVdhdGNoZXIoKTsKLQkJZkRvY3VtZW50VG9Nb2RlbE5vdGlmaWVyID0gbmV3IERvY3VtZW50VG9Nb2RlbE5vdGlmaWVyKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBqdXN0IGZvciBnZXR0aW5nIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCBtYW5hZ2VyIG9mIHRoZQotCSAqIHJpZ2h0IEltcGwgdHlwZSwgdG8gYmUgdXNlZCAiaW50ZXJuYWxseSIgZm9yIG1ha2luZyBwcm90ZWN0ZWQgY2FsbHMKLQkgKiBkaXJlY3RseSB0byB0aGUgaW1wbCBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIE1vZGVsTWFuYWdlckltcGwgX2dldE1vZGVsTWFuYWdlcigpIHsKLQkJLy8gVE9ET19mdXR1cmU6IHJlZGVzaWduIHNvIHdlIGRvbid0IG5lZWQgdGhpcyAnSW1wbCcgdmVyc2lvbgotCQlpZiAoZk1vZGVsTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlmTW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJfQotCi0JCXJldHVybiAoTW9kZWxNYW5hZ2VySW1wbCkgZk1vZGVsTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkZWNsYXJlIHRoYXQgdGhleSBhcmUgYWJvdXQgdG8gbWFrZSBhCi0JICogImxhcmdlIiBjaGFuZ2UgdG8gdGhlIG1vZGVsLiBUaGlzIGNoYW5nZSBtaWdodCBiZSBpbiB0ZXJtcyBvZiBjb250ZW50Ci0JICogb3IgaXQgbWlnaHQgYmUgaW4gdGVybXMgb2YgdGhlIG1vZGVsIGlkIG9yIGJhc2UgbG9jYXRpb24uIE5vdGUgdGhhdCBpbgotCSAqIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCBub3RpZmljYXRpb24gdG8gbGlzdGVuZXJzIGlzIHNlbnQgb25seQotCSAqIG9uY2UuIE5vdGUgdGhhdCB0aGUgY2xpZW50IHdobyBpcyBtYWtpbmcgdGhlc2UgY2hhbmdlcyBoYXMgdGhlCi0JICogcmVzcG9uc2liaWxpdHkgdG8gcmVzdG9yZSB0aGUgbW9kZWxzIHN0YXRlIG9uY2UgZmluaXNoZWQgd2l0aCB0aGUKLQkgKiBjaGFuZ2VzLiBTZWUgZ2V0TWVtZW50byBhbmQgcmVzdG9yZVN0YXRlLiBUaGUgbWV0aG9kCi0JICogaXNNb2RlbFN0YXRlQ2hhbmdpbmcgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtb2RlbAotCSAqIGlzIGFscmVhZHkgaW4gYSBjaGFuZ2Ugc2VxdWVuY2UuCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb0NoYW5nZU1vZGVsKCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJaW50ZXJuYWxBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhYm91dFRvUmVpbml0aWFsaXplTW9kZWwoKSB7Ci0KLQotCi0JCS8vIG5vdGljZSB0aGlzIGlzIGp1c3QgYSBwdWJsaWMgYXZlbnVlIHRvIG91ciBwcm90ZWN0ZWQgbWV0aG9kCi0JCWZpcmVNb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkZE1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQlzeW5jaHJvbml6ZWQgKGZMaXN0ZW5lckxvY2spIHsKLQkJCWlmIChmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsKSB7Ci0JCQkJZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIgPSBuZXcgTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlcigpOwotCQkJfQotCQkJZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKElNb2RlbFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQlzeW5jaHJvbml6ZWQgKGZMaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKCFVdGlsaXRpZXMuY29udGFpbnMoZk1vZGVsU3RhdGVMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWludCBvbGRTaXplID0gMDsKLQkJCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmTW9kZWxTdGF0ZUxpc3RlbmVycy5sZW5ndGg7Ci0JCQkJfQotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZNb2RlbFN0YXRlTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLwotCQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCQlmTW9kZWxTdGF0ZUxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbG9jayB0byBsb2NrIHRoZSBzbWFsbCBiaXRzIG9mIGRhdGEgYW5kIG9wZXJhdGlvbnMgaW4gdGhlIG1vZGVscwotCSAqIHRoZW1zZWxmZXMuIHRoaXMgbG9jayBpcyAic2hhcmVkIiB3aXRoIGRvY3VtZW50LCBzbywgZXZlbnR1YWxseSwKLQkgKiBjaGFuZ2VzIGNhbiBiZSBtYWRlIHNhZmVmbHkgZnJvbSBlaXRoZXIgc2lkZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBiZWdpbkxvY2soKSB7Ci0KLQkJLy8gaWYgd2UgZ2V0IGEgZGlmZmVyZW50IGxvY2sgb2JqZWN0Ci0JCS8vIHRoYW4gd2UgaGFkIGJlZm9yZSwgYmVzdXJlIHRvIHJlbGVhc2UKLQkJLy8gb2xkIG9uZSBmaXJzdCBiZWZvcmUgbG9zaW5nIGl0LgotCQkvLyBJU1NVRTogdGhpcyBzbWVsbHMgbGlrZSBhbiBlcnJvciBjb25kaXRpb24sCi0JCS8vIHdoZW4gd291bGQgdGhpcyBoYXBwZW4/IGJldHRlciB0byBjaGVjayBpbiBzZXQgZG9jdW1lbnQ/Ci0JCUlMb2NrIGRvY3VtZW50TG9jayA9IGdldExvY2tPYmplY3RGcm9tRG9jdW1lbnQoKTsKLQotCQlpZiAoZkxvY2tPYmplY3QgIT0gbnVsbCAmJiBmTG9ja09iamVjdCAhPSBkb2N1bWVudExvY2spIHsKLQkJCWZMb2NrT2JqZWN0LnJlbGVhc2UoKTsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJNb2RlbCBsb2NrIHJlbGVhc2VkIGVhcmx5IiArIGZMb2NrT2JqZWN0ICsgIiBhcHBhcmVudGx5IGRvY3VtZW50IHN3aXRjaGVkPyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQl9Ci0JCWZMb2NrT2JqZWN0ID0gZG9jdW1lbnRMb2NrOwotCQlpZiAoZkxvY2tPYmplY3QgIT0gbnVsbCkgewotCQkJZkxvY2tPYmplY3QuYWNxdWlyZSgpOwotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIk1vZGVsIGxvY2sgYWNxdWlyZWQ6ICIgKyBmTG9ja09iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIpIHsKLQotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCi0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbnVsbCwgbnVsbCwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsKSB7Ci0KLQkJYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIGxhYmVsLCBudWxsLCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCi0JCWlmIChnZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRVbmRvTWFuYWdlcigpLmJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0KLQkJaWYgKGdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWdldFVuZG9NYW5hZ2VyKCkuYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgZGVzY3JpcHRpb24sIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBhIGNsaWVudCBjb250cm9sbGVkIHdheSBvZiBub3RpZnlpbmcgYWxsIE1vZGVsRXZlbnQKLQkgKiBsaXN0bmVycyB0aGF0IHRoZSBtb2RlbCBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1ldGhvZCBpcyBhIG1hdGNoZWQgcGFpcgotCSAqIHRvIGFib3V0VG9DaGFuZ2VNb2RlbCwgYW5kICptdXN0KiBiZSBjYWxsZWQgYWZ0ZXIgYWJvdXRUb0NoYW5nZU1vZGVsCi0JICogLi4uIG9yIHNvbWUgbGlzdGVuZXJzIGNvdWxkIGJlIGxlZnQgd2FpdGluZyBpbmRlZmluaXRlbHkgZm9yIHRoZQotCSAqIGNoYW5nZWQgZXZlbnQuIFNvLCBpdHMgc3VnZ2VzdGVkIHRoYXQgY2hhbmdlZE1vZGVsIGFsd2F5cyBiZSBpbiBhCi0JICogZmluYWxseSBjbGF1c2UuIExpa2V3aXNlLCBhIGNsaWVudCBzaG91bGQgbmV2ZXIgY2FsbCBjaGFuZ2VkTW9kZWwKLQkgKiB3aXRob3V0IGNhbGxpbmcgYWJvdXRUb0NoYW5nZU1vZGVsIGZpcnN0LiBJbiB0aGUgY2FzZSBvZiBlbWJlZGRlZAotCSAqIGNhbGxzLCB0aGUgbm90aWZpY2F0aW9uIGlzIGp1c3Qgc2VudCBvbmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNoYW5nZWRNb2RlbCgpIHsKLQotCi0JCS8vIG5vdGljZSB0aGlzIGlzIGp1c3QgYSBwdWJsaWMgYXZlbnVlIHRvIG91ciBwcm90ZWN0ZWQgbWV0aG9kCi0JCWludGVybmFsTW9kZWxDaGFuZ2VkKCk7Ci0JCS8vIGFsc28gbm90ZSEKLQkJLy8gaWYgd2UndmUgYmVlbiAiY2hhbmdlZCIgYnkgYSBjbGllbnQsIHdlIG1pZ2h0IHN0aWxsIG5lZWQKLQkJLy8gdG8gYmUgcmUtaW5pdGlhbGl6ZWQsIHNvIHdlJ2xsIGNoZWNrIGFuZCBoYW5kbGUgdGhhdCBoZXJlLgotCQkvLyBOb3RlIG9ubHkgZG9lcyB0aGlzIHByb3ZpZGUgYSBzb2x1dGlvbiB0byBzb21lICJtaXNzZWQiCi0JCS8vIHJlLWluaXRzLCBpbiBwcm92aWRlcyBhIGJ1aWx0IGluIHdheSBmb3IgY2xpZW50cyB0bwotCQkvLyAiZm9yY2UiIHRoZSBtb2RlbCB0byBoYW5kbGUgaXRzZWxmLCBieSBicmFja2V0aW5nIGFueQotCQkvLyBjaGFuZ2VzIHdpdGggYWJvdXRUb0NoYW5nZSBhbmQgY2hhbmdlZCwgdGhlIG1vZGVsIGl0c2VsZgotCQkvLyB3aWxsIGNoZWNrLiBCdXQgb25seSBjYWxsIHJlLWluaXQgaWYgYWxsIG90aGVyIHBlbmRpbmcKLQkJLy8gbW9kZWxDaGFuZ2VkIHN0YXRlcyBoYXZlIGJlZW4gaGFuZGxlZC4KLQkJaWYgKGZNb2RlbFN0YXRlQ2hhbmdpbmcgPT0gMCAmJiBpc1JlaW5pdGlhbGl6YXRpb25OZWVkZWQoKSkgewotCQkJcmVpbml0KCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEJhc2VkIG9uIHNpbWlsYXIgbWV0aG9kIGluIEZpbGVEb2N1bWVudFByb3ZpZGVyLiBJdCB3aWxsIHByb3ZpZGUgd2hhdAotCSAqIHRoZSBtb2RpZmljYXRpb25TdGFtcCB3b3VsZCBiZSBpZiByZXNldFN5bmNocm9uemF0aW9uU3RhbXAocmVzb3VyY2UpCi0JICogd2VyZSB1c2VkLCBhbHRob3VnaCBmb3IgdGhpcyAnY29tcHV0ZScgQVBJLCBubyBjaGFuZ2VzIHRvIHRoZSBpbnN0YW5jZQotCSAqIGFyZSBtYWRlLgotCSAqLwotCXB1YmxpYyBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQotCi0JCWxvbmcgbW9kaWZpY2F0aW9uU3RhbXAgPSByZXNvdXJjZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIG1vZGlmaWNhdGlvblN0YW1wOwotCQl9Ci0JCS8vIE5vdGU6IGNoZWNraW5nIGV4aXN0ZW5jZSBvZiBmaWxlIGlzIGEgbGl0dGxlIGRpZmZlcmVudCB0aGFuCi0JCS8vIGltcGwgaW4KLQkJLy8gdGhlIEZpbGVEb2N1bWVudFByb3ZpZGVyLiBTZWUgZGVmZWN0IG51bWJlciAyMjM3OTAuCi0JCUZpbGUgZmlsZSA9IHBhdGgudG9GaWxlKCk7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJcmV0dXJuIG1vZGlmaWNhdGlvblN0YW1wOwotCQl9Ci0JCW1vZGlmaWNhdGlvblN0YW1wID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJcmV0dXJuIG1vZGlmaWNhdGlvblN0YW1wOwotCX0KLQotCi0JLyoqCi0JICogUHJvdmlkZXMgYSBjb3B5IG9mIHRoZSBtb2RlbCwgYnV0IGEgbmV3IElEIG11c3QgYmUgcHJvdmlkZWQuIFRoZQotCSAqIHByaW5jaXBsZSBvZiB0aGlzIGNvcHkgaXMgbm90IHRvIGNvcHkgZmllbGRzLCBldGMuLCBhcyBpcyB0eXBpY2FsbHkKLQkgKiBkb25lIGluIGEgY2xvbmUgbWV0aG9kLCBidXQgdG8gcmV0dXJuIGEgbW9kZWwgd2l0aCB0aGUgc2FtZSBjb250ZW50IGluCi0JICogdGhlIHN0cnVjdHVyZWREb2N1bWVudC4gTm90ZTogSXQgaXMgdGhlIGNhbGxlcnMgcmVzcG9uc2liaWxpdHkgdG8KLQkgKiBzZXRCYXNlTG9jYXRpb24sIGxpc3RuZXJzLCBldGMuLCBhcyBhcHByb3ByaWF0ZS4gVHlwZSBhbmQgRW5jb2RpbmcgYXJlCi0JICogdGhlIG9ubHkgZmllbGRzIHNldCBieSB0aGlzIG1ldGhvZC4gSWYgdGhlIG5ld0lkIHByb3ZpZGVkIGFscmVhZHkgZXhpc3QKLQkgKiBpbiB0aGUgbW9kZWwgbWFuYWdlciwgYSBSZXNvdXJjZUluVXNlIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY29weShTdHJpbmcgbmV3SWQpIHRocm93cyBSZXNvdXJjZUluVXNlIHsKLQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBudWxsOwotCQkvLyB0aGlzIGZpcnN0IG9uZSBzaG91bGQgZmFpbCwgaWYgbm90LCBpdHMgdHJlYXRlZCBhcyBhbiBlcnJvcgotCQkvLyBJZiB0aGUgY2FsbGVyIHdhbnRzIHRvIHVzZSBhbiBleGlzdGluZyBvbmUsIHRoZXkgY2FuIGNhbGwKLQkJLy8gZ2V0RXhpc3RpbmcKLQkJLy8gYWZ0ZXIgdGhpcyBmYWlsdXJlCi0JCW5ld01vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQobmV3SWQpOwotCQlpZiAobmV3TW9kZWwgIT0gbnVsbCkgewotCQkJLy8gYmUgc3VyZSB0byByZWxlYXNlIHRoZSByZWZlcmVuY2Ugd2UgZ290ICJieSBhY2NpZGVudCIgKGFuZAotCQkJLy8gbm8KLQkJCS8vIGxvbmdlciBuZWVkKQotCQkJbmV3TW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl0aHJvdyBuZXcgUmVzb3VyY2VJblVzZSgpOwotCQl9Ci0JCW5ld01vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuY29weU1vZGVsRm9yRWRpdChnZXRJZCgpLCBuZXdJZCk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQotCS8qKgotCSAqIERpc2FibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2FibGVVbmRvTWFuYWdlbWVudCgpIHsKLQotCQlpZiAoZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKQotCQkJZ2V0VW5kb01hbmFnZXIoKS5kaXNhYmxlVW5kb01hbmFnZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZVVuZG9NYW5hZ2VtZW50KCkgewotCi0JCWlmIChnZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRVbmRvTWFuYWdlcigpLmVuYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogZW5kTG9jayBpcyBwcm90ZWN0ZWQgb25seSBmb3IgYSB2ZXJ5IHNwZWNpYWwgcHVycG9zZS4gU28gc3ViY2xhc3NlcyBjYW4KLQkgKiBjYWxsIGl0IHRvIGVuZCB0aGUgbG9jayBhZnRlciB1cGRhdGVzIGhhdmUgYmVlbiBtYWRlLCBidXQgYmVmb3JlCi0JICogbm90aWZpY2F0aW9ucyBhcmUgc2VudAotCSAqIAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGVuZExvY2soKSB7Ci0JCWlmIChmTG9ja09iamVjdCAhPSBudWxsKSB7Ci0JCQlmTG9ja09iamVjdC5yZWxlYXNlKCk7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMU1RBVEUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW9kZWwgbG9jayByZWxlYXNlZDogIiArIGZMb2NrT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCi0JCWlmIChnZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRVbmRvTWFuYWdlcigpLmVuZFJlY29yZGluZyhyZXF1ZXN0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQotCQlpZiAoZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKQotCQkJZ2V0VW5kb01hbmFnZXIoKS5lbmRSZWNvcmRpbmcocmVxdWVzdGVyLCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbmZvcm1zIGFsbCByZWdpc3RlcmVkIG1vZGVsIHN0YXRlIGxpc3RlbmVycyB0aGF0IHRoZSB0aGUgbW9kZWwgaXMKLQkgKiBhYm91dCB0byB1bmRlciBnbyBhIGNoYW5nZS4gVGhpcyBjaGFuZ2UgbWlnaHQgYmUgaW4gdGVybXMgb2YgY29udGVudHMKLQkgKiBvciBtaWdodCBiZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZWwncyBpZCBvciBiYXNlIGxvY2F0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBmaXJlTW9kZWxBYm91dFRvQmVDaGFuZ2VkKCkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5Ci0JCS8vIGZyb20gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCSgoSU1vZGVsU3RhdGVMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubW9kZWxBYm91dFRvQmVDaGFuZ2VkKHRoaXMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKCkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBOT1RFOiB0cmljayBmb3IgdHJhbnNpdGlvbi4gV2UgYWN0dWFsIHVzZSB0aGUgc2FtZQotCQkJCS8vIGxpc3RlbmVycwotCQkJCS8vIGFzIG1vZGVsU3RhdGUsIGJ1dCBvbmx5IHNlbmQgdGhpcyB0byB0aG9zZSB0aGF0IGhhdmUKLQkJCQkvLyBpbXBsZW1lbnRlZCBNb2RlbFN0YXRlRXh0ZW5kZWQuCi0JCQkJSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldOwotCQkJCWxpc3RlbmVyLm1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZCh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlTW9kZWxDaGFuZ2VkKCkgewotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMKLQkJLy8gdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQKLQkJLy8gYW5kIHJlbW92ZSBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lcgotCQkvLyBhcnJheSBmcm9tIGFub3RoZXIgdGhyZWFkCi0JCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQkoKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm1vZGVsQ2hhbmdlZCh0aGlzKTsKLQkJCQl9Ci0JCQkJLy8gaXRzIHNvIGNyaXRpY2lhbCB0aGF0IHRoZSBiZWdpbi9lbmQgYXJyaXZlIGluCi0JCQkJLy8gcGFpcnMsCi0JCQkJLy8gaWYgdGhlcmUgaGFwcGVuZHMgdG8gYmUgYW4gZXJyb3IgaW4gb25lIG9mIHRoZQotCQkJCS8vIG1vZGVsQ2hhbmdlZCwKLQkJCQkvLyB0aGV5IHdlIHdhbnQgdG8gYmUgc3VyZSByZXN0IGNvbXBsZXRlIG9rLgotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhbGwgcmVnaXN0ZXJlZCBtb2RlbCBzdGF0ZSBsaXN0ZW5lcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlCi0JICogZGlydHkgc3RhdGUgb2YgdGhlIG1vZGVsLiBUaGUgZGlydHkgc3RhdGUgaXMgZW50aXJlbHkgYWJvdXQgY2hhbmdlcyBpbgotCSAqIHRoZSBjb250ZW50IG9mIHRoZSBtb2RlbCAobm90LCBmb3IgZXhhbXBsZSwgYWJvdXQgY2hhbmdlcyB0byBpZCwgb3IKLQkgKiBiYXNlIGxvY2F0aW9uIC0tIHNlZSBtb2RlbE1vdmVkKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIGVsZW1lbnQsIGJvb2xlYW4gaXNEaXJ0eSkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbERpcnR5U3RhdGVDaGFuZ2VkKGVsZW1lbnQsIGlzRGlydHkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU1vZGVsUmVpbml0aWFsaXplZCgpIHsKLQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMU1RBVEUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiSU1vZGVsU3RhdGVMaXN0ZW5lciBldmVudCBmb3IgIiArIGdldElkKCkgKyAiIDogbW9kZWxSZWluaXRpYWxpemVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldOwotCQkJCWxpc3RlbmVyLm1vZGVsUmVpbml0aWFsaXplZCh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluZm9ybXMgYWxsIHJlZ2lzdGVyZWQgbW9kZWwgc3RhdGUgbGlzdGVuZXJzIGFib3V0IHRoZSBkZWxldGlvbiBvZiBhCi0JICogbW9kZWwncyB1bmRlcmx5aW5nIHJlc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsIGVsZW1lbnQpIHsKLQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMU1RBVEUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiSU1vZGVsU3RhdGVMaXN0ZW5lciBldmVudCBmb3IgIiArIGdldElkKCkgKyAiIDogbW9kZWxSZXNvdXJjZURlbGV0ZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkoKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm1vZGVsUmVzb3VyY2VEZWxldGVkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhbGwgcmVnaXN0ZXJlZCBtb2RlbCBzdGF0ZSBsaXN0ZW5lcnMgdGhhdCB0aGUgcmVzb3VyY2UKLQkgKiB1bmRlcmx5aW5nIGEgbW9kZWwgaGFzIGJlZW4gbW92ZWQuIFRoaXMgaXMgdHlwaWNhbGx5IHJlZmxlY3RlZCBpbiBhCi0JICogY2hhbmdlIHRvIHRoZSBpZCwgYmFzZUxvY2F0aW9uLCBvciBib3RoLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvcmlnaW5hbEVsZW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW92ZWRFbGVtZW50KSB7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIklNb2RlbFN0YXRlTGlzdGVuZXIgZXZlbnQgZm9yICIgKyBnZXRJZCgpICsgIiA6IG1vZGVsUmVzb3VyY2VNb3ZlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCSgoSU1vZGVsU3RhdGVMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubW9kZWxSZXNvdXJjZU1vdmVkKG9yaWdpbmFsRWxlbWVudCwgbW92ZWRFbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0KLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRCYXNlTG9jYXRpb24oKSB7Ci0KLQkJcmV0dXJuIGZCYXNlTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbCNnZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkgewotCQlpZiAoZkV4cGxpY2l0Q29udGVudFR5cGVJZGVudGlmaWVyICE9IG51bGwpCi0JCQlyZXR1cm4gZkV4cGxpY2l0Q29udGVudFR5cGVJZGVudGlmaWVyOwotCQlyZXR1cm4gZk1vZGVsSGFuZGxlci5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBGYWN0b3J5UmVnaXN0cnkgZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlpZiAoZmFjdG9yeVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWZhY3RvcnlSZWdpc3RyeSA9IG5ldyBGYWN0b3J5UmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gZmFjdG9yeVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFRoZSBpZCBpcyB0aGUgaWQgdGhhdCB0aGUgbW9kZWwgbWFuYWdlciB1c2VzIHRvIGlkZW50aWZ5IHRoaXMgbW9kZWwKLQkgKiAKLQkgKiBASVNTVUUgLSBubyBvbmUgc2hvdWxkIG5lZWQgdG8ga25vdyBJRCwgc28gdGhpcyBzaG91bGQgYmUgZGVmYXVsdCBhY2Nlc3MgZXZlbnR1YWxseS4gCi0JICogSWYgY2xpZW50cyBiZWxpZXZlIHRoZXkgZG8gbmVlZCBJRCwgYmUgc3VyZSB0byBsZXQgdXMga25vdyAob3BlbiBhIGJ1ZykuIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0KLQkJcmV0dXJuIGZJZDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSUxvY2sgZ2V0TG9ja09iamVjdEZyb21Eb2N1bWVudCgpIHsKLQotCQkvLyB3ZSBhbHdheXMgImdldCBhZnJlc2giIHRoZSBsb2NrIG9iamVjdCBmcm9tIG91ciBkb2N1bWVudCwKLQkJLy8ganVzdCBpbiBjYXNlIHRoZSBpbnN0YW5jZSBvZiB0aGUgZG9jdW1lbnQgY2hhbmdlcy4KLQkJSUxvY2sgcmVzdWx0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBmU3RydWN0dXJlZERvY3VtZW50OwotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBJTG9ja2FibGUpIHsKLQkJCQkvLyByZW1lbWJlciwgbW9yZSB0aGFuIG9uZSBjbGllbnQgY2FuIGdldCB0aGUKLQkJCQkvLyBsb2NrIG9iamVjdCwgaXRzIGR1cmluZyB0aGUgYXF1aXJlIHRoYXQgdGhlCi0JCQkJLy8gbG9jayBvbiB0aGUgdGhyZWFkIGlzIG9idGFpbmVkLgotCQkJCXJlc3VsdCA9ICgoSUxvY2thYmxlKSBkb2MpLmdldExvY2tPYmplY3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24uCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgQ29udGVudFR5cGVEZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBJTW9kZWxIYW5kbGVyIGdldE1vZGVsSGFuZGxlcigpIHsKLQotCQlyZXR1cm4gZk1vZGVsSGFuZGxlcjsKLQl9Ci0KLQotCXB1YmxpYyBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQotCQlyZXR1cm4gX2dldE1vZGVsTWFuYWdlcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JLy8gVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCXB1YmxpYyBpbnQgZ2V0UmVmZXJlbmNlQ291bnQoKSB7Ci0KLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0UmVmZXJlbmNlQ291bnQoZ2V0SWQoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCS8vIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbiBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQlwdWJsaWMgaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yRWRpdCgpIHsKLQotCi0KLQkJaWYgKGdldE1vZGVsTWFuYWdlcigpID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGdldE1vZGVsTWFuYWdlcigpLmdldFJlZmVyZW5jZUNvdW50Rm9yRWRpdChnZXRJZCgpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JLy8gVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCXB1YmxpYyBpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JSZWFkKCkgewotCi0KLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0UmVmZXJlbmNlQ291bnRGb3JSZWFkKGdldElkKCkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKCkgewotCi0JCXJldHVybiByZWluaXRpYWxpemVTdGF0ZURhdGE7Ci0JfQotCi0KLQotCXB1YmxpYyBVUklSZXNvbHZlciBnZXRSZXNvbHZlcigpIHsKLQotCQlyZXR1cm4gZlJlc29sdmVyOwotCX0KLQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzcvMjAwMSAyOjMwOjI2Ci0JICogUE0pCi0JICogCi0JICogQHJldHVybiBsb25nCi0JICovCi0JcHVibGljIGxvbmcgZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKSB7Ci0KLQkJcmV0dXJuIGZTeW5jaHJvbml6YXRpb25TdGFtcDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKSB7Ci0KLQkJSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgc3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJc3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyID0gc3RydWN0dXJlZERvY3VtZW50LmdldFVuZG9NYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdElkKFN0cmluZyBpZCkgewotCQlmSWQgPSBpZDsKLQl9Ci0KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEFib3V0VG9CZUNoYW5nZWQoKSB7Ci0KLQkJLy8gbm90aWNlIHdlIG9ubHkgZmlyZSB0aGlzIGV2ZW50IGlmIHdlIGFyZSBub3QKLQkJLy8gYWxyZWFkeSBpbiBhIG1vZGVsIHN0YXRlIGNoYW5naW5nIHNlcXVlbmNlCi0JCWlmIChmTW9kZWxTdGF0ZUNoYW5naW5nID09IDApIHsKLQotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIklNb2RlbFN0YXRlTGlzdGVuZXIgZXZlbnQgZm9yICIgKyBnZXRJZCgpICsgIiA6IG1vZGVsQWJvdXRUb0JlQ2hhbmdlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlmaXJlTW9kZWxBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgbm90aWZ5aW5nIG1vZGVsIHN0YXRlIGxpc3RlcnMgb2YgYWJvdXQgdG8gY2hhbmdlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIGJlZ2luIGxvY2sgYWZ0ZXIgbGlzdGVuZXJzIG5vdGlmaWVkLCBvdGhlcndpc2UKLQkJCQkvLyBkZWFkbG9jayBjb3VsZCBvY2N1ciBpZiB0aGV5IGNhbGwgdXMgYmFjay4KLQkJCQliZWdpbkxvY2soKTsKLQkJCX0KLQotCQl9Ci0JCS8vIHdlIGFsd2F5cyBpbmNyZW1lbnQgY291bnRlciwgZm9yIGV2ZXJ5IHJlcXVlc3QgKHNvICptdXN0KiByZWNlaXZlCi0JCS8vIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mICdjaGFuZ2VkTW9kZWwnIHJlcXVlc3RzKQotCQlmTW9kZWxTdGF0ZUNoYW5naW5nKys7Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhbGwgcmVnaXN0ZXJlZCBtb2RlbCBzdGF0ZSBsaXN0ZW5lcnMgdGhhdCBhbiBpbXBlbmRpbmcgY2hhbmdlCi0JICogaXMgbm93IGNvbXBsZXRlLiBUaGlzIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIGJ5ICdtb2RlbENoYW5nZWQnCi0JICogc2luY2UgaXQga2VlcHMgdHJhY2sgb2YgY291bnRzLgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGludGVybmFsTW9kZWxDaGFuZ2VkKCkgewotCi0JCS8vIGFsd2F5cyBkZWNyZW1lbnQKLQkJZk1vZGVsU3RhdGVDaGFuZ2luZy0tOwotCi0KLQkJLy8gQ2hlY2sgaW50ZWdyaXR5Ci0JCS8vIHRvIGJlIGxlc3MgdGhhbiB6ZXJvIGlzIGEgcHJvZ3JhbW1pbmcgZXJyb3IsCi0JCS8vIGJ1dCB3ZSdsbCByZXNldCB0byB6ZXJvCi0JCS8vIGFuZCB0cnkgdG8gY29udGludWUKLQkJaWYgKGZNb2RlbFN0YXRlQ2hhbmdpbmcgPCAwKSB7Ci0JCQlmTW9kZWxTdGF0ZUNoYW5naW5nID0gMDsKLQkJCS8vIHNob3VsZCBub3QgYmUgbG9ja2VkLCBidXQganVzdCBpbiBjYXNlCi0JCQllbmRMb2NrKCk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9ncmFtIEVycm9yOiBtb2RlbFN0YXRlQ2hhbmdpbmcgd2FzIGxlc3MgdGhhbiB6ZXJvIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0KLQkJLy8gV2Ugb25seSBmaXJlIHRoaXMgZXZlbnQgaWYgYWxsIHBlbmRpbmcgcmVxdWVzdHMgYXJlIGRvbmUuCi0JCS8vIFRoYXQgaXMsIGlmIHdlJ3ZlIHJlY2VpdmVkIHRoZSBzYW1lIG51bWJlciBvZiBtb2RlbENoYW5nZWQgYXMKLQkJLy8gd2UgaGF2ZSBhYm91dFRvQ2hhbmdlTW9kZWwuCi0JCWlmIChmTW9kZWxTdGF0ZUNoYW5naW5nID09IDApIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbENoYW5nZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWVuZExvY2soKTsKLQkJCS8vIG5vdGlmaWZ5IGxpc3RlbmVycyBvdXRzaWRlIG9mIGxvY2tlZCBzdGF0ZSAob3IgZGVhZGxvY2sKLQkJCS8vIGNhbiBvY2N1ciBpZiBvbmUgb2YgdGhlbSBjYWxscyB1cyBiYWNrLgotCQkJZmlyZU1vZGVsQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQotCQlyZXR1cm4gZkRpcnR5U3RhdGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaGFzIHZlcnkgc3BlY2lhbCBwdXJwb3NlLCBpdHMgdXNlZCBpbiBzdWJjbGFzcwotCSAqICdjaGFuZ2VkTW9kZWwnIHRvIGtub3cgd2hlbiB0byBkbyAiZW5kaW5nIiBzb3J0cyBvZiB0aGluZ3MsIHJpZ2h0Ci0JICogYmVmb3JlIGEgY2FsbCB0byBzdXBlci5DaGFuZ2VkTW9kZWwgd291bGQgaW4gZGVlZCBwdXQgdGhlIG1vZGVsIGluCi0JICogJ2VuZCcgc3RhdGUuIFB1dCBhbm90aGVyIHdheSwgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3ViY2xhc3NlcydzCi0JICogY2hhbmdlZE1vZGVsLCB0aGUgaXNNb2RlbFN0YXRlQ2hhbmdpbmcgaXMgdHJ1ZSwgYnV0IGF0IGVuZCwgaXQgd2lsbCBiZQotCSAqIGZhbHNlLiBTbywgdGhpcyBtZXRob2QgYWxsb3dzIGEgc21hbGwgInBlZWsgYWhlYWQiLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTW9kZWxDaGFuZ2VTdGF0ZU9uVmVyZ2VPZkVuZGluZygpIHsKLQotCi0JCXJldHVybiBmTW9kZWxTdGF0ZUNoYW5naW5nID09IDE7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIGlzIHdpdGhpbiBhCi0JICogImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIgc2VxdWVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlbFN0YXRlQ2hhbmdpbmcoKSB7Ci0KLQotCQlyZXR1cm4gZk1vZGVsU3RhdGVDaGFuZ2luZyA+IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7Ci0KLQkJcmV0dXJuIGZOZXdTdGF0ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlaW5pdGlhbGl6YXRpb25OZWVkZWQoKSB7Ci0KLQkJcmV0dXJuIHJlaW5pdGlhbGl6YXRpb25OZWVkZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTmVlZGVkKCkgewotCi0KLQkJaWYgKCFpc1NoYXJlZEZvckVkaXQoKSkKLQkJCXJldHVybiBpc0RpcnR5KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuaXNTaGFyZWQoZ2V0SWQoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkRm9yRWRpdCgpIHsKLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuaXNTaGFyZWRGb3JFZGl0KGdldElkKCkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvclJlYWQoKSB7Ci0KLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldE1vZGVsTWFuYWdlcigpLmlzU2hhcmVkRm9yUmVhZChnZXRJZCgpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZCgpIHsKLQotCi0JCS8vIG5vdGljZSB0aGlzIGlzIGp1c3QgYSBwdWJsaWMgYXZlbnVlIHRvIG91ciBwcm90ZWN0ZWQgbWV0aG9kCi0JCWZpcmVNb2RlbFJlaW5pdGlhbGl6ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdJbnN0YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IG51bGw7Ci0JCS8vIHdlIGRlbGVnYXRlIHRvIHRoZSBtb2RlbCBtYW5hZ2VyLCBzbyBsb2FkZXIsIGV0Yy4sIGNhbiBiZQotCQkvLyB1c2VkLgotCQluZXdNb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZU5ld0luc3RhbmNlKHRoaXMpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgcmVpbml0KCkgewotCi0KLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlpZiAoZk1vZGVsU3RhdGVDaGFuZ2luZyA9PSAwKSB7Ci0JCQl0cnkgewotCQkJCWFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCWFib3V0VG9SZWluaXRpYWxpemVNb2RlbCgpOwotCQkJCXJlc3VsdCA9IF9nZXRNb2RlbE1hbmFnZXIoKS5yZWluaXRpYWxpemUodGhpcyk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRSZWluaXRpYWxpemVOZWVkZWQoZmFsc2UpOwotCQkJCXNldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YShudWxsKTsKLQkJCQltb2RlbFJlaW5pdGlhbGl6ZWQoKTsKLQkJCQljaGFuZ2VkTW9kZWwoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJpbmRlZWQhISEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tRWRpdCgpIHsKLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1PREVMX01BTkFHRVJfTlVMTCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiBCZSBzdXJlIHRvIGNoZWNrIHRoZSBzaGFyZWQgc3RhdGUgYmVmb3JlIHJlbGVhc2luZy4gKFNpbmNlCi0JCQkgKiBpc1NoYXJlZCBhc3N1bWVzIGEgY291bnQgb2YgMSBtZWFucyBub3Qgc2hhcmVkIC4uLiBhbmQgd2Ugd2FudAotCQkJICogb3VyICcxJyB0byBiZSB0aGF0IG9uZS4pIFRoZSBwcm9ibGVtLCBvZiBjb3Vyc2UsIGlzIHRoYXQKLQkJCSAqIGJldHdlZW4gcHJlLWN5Y2xlIG5vdGlmaWNhdGlvbiBhbmQgcG9zdC1yZWxlYXNlIG5vdGlmaWNhdGlvbiwKLQkJCSAqIHRoZSBtb2RlbCBjb3VsZCBvbmNlIGFnYWluIGhhdmUgYmVjb21lIHNoYXJlZCwgcmVuZGVyaW5nIHRoZQotCQkJICogcmVsZWFzZSBub3RpZmljYXRpb24gaW5jb3JyZWN0LgotCQkJICovCi0JCQlib29sZWFuIGlzU2hhcmVkID0gaXNTaGFyZWQoKTsKLQotCQkJaWYgKCFpc1NoYXJlZCkgewotCQkJCXNpZ25hbFByZUxpZmVDeWNsZUV2ZW50UmVsZWFzZSh0aGlzKTsKLQkJCX0KLQotCQkJX2dldE1vZGVsTWFuYWdlcigpLnJlbGVhc2VGcm9tRWRpdCh0aGlzKTsKLQkJCWlmICghaXNTaGFyZWQpIHsKLQkJCQlzaWduYWxQb3N0TGlmZUN5Y2xlTGlzdGVuZXJSZWxlYXNlKHRoaXMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNT0RFTF9NQU5BR0VSX05VTEwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQkvKgotCQkJICogQmUgc3VyZSB0byBjaGVjayB0aGUgc2hhcmVkIHN0YXRlIGJlZm9yZSByZWxlYXNpbmcuIChTaW5jZQotCQkJICogaXNTaGFyZWQgYXNzdW1lcyBhIGNvdW50IG9mIDEgbWVhbnMgbm90IHNoYXJlZCAuLi4gYW5kIHdlIHdhbnQKLQkJCSAqIG91ciAnMScgdG8gYmUgdGhhdCBvbmUuKSBUaGUgcHJvYmxlbSwgb2YgY291cnNlLCBpcyB0aGF0Ci0JCQkgKiBiZXR3ZWVuIHByZS1jeWNsZSBub3RpZmljYXRpb24gYW5kIHBvc3QtcmVsZWFzZSBub3RpZmljYXRpb24sCi0JCQkgKiB0aGUgbW9kZWwgY291bGQgb25jZSBhZ2FpbiBoYXZlIGJlY29tZSBzaGFyZWQsIHJlbmRlcmluZyB0aGUKLQkJCSAqIHJlbGVhc2Ugbm90aWZpY2F0aW9uIGluY29ycmVjdC4KLQkJCSAqLwotCQkJYm9vbGVhbiBpc1NoYXJlZCA9IGlzU2hhcmVkKCk7Ci0KLQkJCWlmICghaXNTaGFyZWQpIHsKLQkJCQlzaWduYWxQcmVMaWZlQ3ljbGVFdmVudFJlbGVhc2UodGhpcyk7Ci0JCQl9Ci0KLQkJCV9nZXRNb2RlbE1hbmFnZXIoKS5yZWxlYXNlRnJvbVJlYWQodGhpcyk7Ci0KLQkJCWlmICghaXNTaGFyZWQpIHsKLQkJCQlzaWduYWxQb3N0TGlmZUN5Y2xlTGlzdGVuZXJSZWxlYXNlKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJlcGxlbmlzaGVzIHRoZSBtb2RlbCB3aXRoIHRoZSByZXNvdXJjZSB3aXRob3V0IHNhdmluZwotCSAqIGFueSBwb3NzaWJsZSBjaGFuZ2VzLiBJdCBpcyB1c2VkIHdoZW4gb25lIGVkaXRvciBtYXkgYmUgY2xvc2luZywgYW5kCi0JICogc3BlY2lmaWFsbHkgc2F5cyBub3QgdG8gc2F2ZSB0aGUgbW9kZWwsIGJ1dCBhbm90aGVyICJkaXNwbGF5IiBvZiB0aGUKLQkgKiBtb2RlbCBzdGlsbCBuZWVkcyB0byBoYW5nIG9uIHRvIHNvbWUgbW9kZWwsIHNvIG5lZWRzIGEgZnJlc2ggY29weS4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCByZWxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJcmVzdWx0ID0gX2dldE1vZGVsTWFuYWdlcigpLnJlbG9hZE1vZGVsKGdldElkKCksIGlucHV0U3RyZWFtKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVNb2RlbExpZmVjeWNsZUxpc3RlbmVyKElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJLy8gaWYgbWFuYWdlciBpcyBudWxsLCB0aGVuIG5vbmUgaGF2ZSBiZWVuIGFkZGVkLCBzbwotCQkvLyBubyBuZWVkIHRvIHJlbW92ZSBhbnkKLQkJaWYgKGZMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN5bmNocm9uaXplZCAoZkxpc3RlbmVyTG9jaykgewotCQkJZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgbGlzdGVuZXJzLCB3ZSdsbCBpZ25vcmUgdGhlIHJlcXVlc3QKLQkJc3luY2hyb25pemVkIChmTGlzdGVuZXJMb2NrKSB7Ci0JCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZNb2RlbFN0YXRlTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQlpbnQgb2xkU2l6ZSA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzLmxlbmd0aDsKLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsgLy8gaWdub3JlCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBjb3B5IG9sZCB0byBuZXcgaWYgaXRzIG5vdCB0aGUgb25lIHdlIGFyZQotCQkJCQkJLy8gcmVtb3ZpbmcKLQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlCi0JCQkJLy8gb2xkCi0JCQkJLy8gb25lCi0JCQkJZk1vZGVsU3RhdGVMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEEgbWV0aG9kIHRoYXQgbW9kaWZpZXMgdGhlIG1vZGVsJ3Mgc3luY2hyb25pemF0aW9uIHN0YW1wIHRvIG1hdGNoIHRoZQotCSAqIHJlc291cmNlLiBUdXJucyBvdXQgdGhlcmUncyBzZXZlcmFsIHdheXMgb2YgZG9pbmcgaXQsIHNvIHRoaXMgZW5zdXJlcyBhCi0JICogY29tbW9uIGFsZ29yaXRobS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFN5bmNocm9uaXphdGlvblN0YW1wKElSZXNvdXJjZSByZXNvdXJjZSkgewotCi0KLQkJc2V0U3luY2hyb25pemF0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKHJlc291cmNlKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgYSBjbGllbnQgdG8gaW5pdGlhdGUgbm90aWZpY2F0aW9uIHRvIGFsbCBpbnRlcmVzdGVkCi0JICogcGFydGllcyB0aGF0IGEgbW9kZWwncyB1bmRlcmx5aW5nIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VEZWxldGVkKCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJZmlyZU1vZGVsUmVzb3VyY2VEZWxldGVkKHRoaXMpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWxsb3dzIGEgbW9kZWwgY2xpZW50IHRvIGluaXRpYXRlIG5vdGlmaWNhdGlvbiB0byBhbGwKLQkgKiBpbnRlcmVzdGVkIHBhcnRpZXMgdGhhdCBhIG1vZGVsJ3MgdW5kZXJseWluZyByZXNvdXJjZSBsb2NhdGlvbiBoYXMKLQkgKiBjaGFuZ2VkLiBOb3RlOiB3ZSBhc3N1bWUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoYW5nZWQgYmFzZUxvY2F0aW9uLCBJZCwKLQkgKiBldGMuLCBzaW5jZSBpdHMgcmVhbGx5IHVwIHRvIHRoZSBjbGllbnQgdG8gZGV0ZXJtaW5lIHdoYXQncyAibmV3IiBhYm91dAotCSAqIGEgbW92ZWQgbW9kZWwuIENhdXRpb246ICd0aGlzJyBhbmQgJ25ld01vZGVsJyBtYXkgYmUgdGhlIHNhbWUgb2JqZWN0LgotCSAqIFRoaXMgaXMgdGhlIGNhc2UgZm9yIGN1cnJlbnQgd29ya2luZyB3aXRoIEZpbGVNb2RlbFByb3ZpZGVyLCBidXQgaGF2ZQotCSAqIGxlZnQgdGhlIGR1YWwgYXJndW1lbnQgZm9yIGZ1dHVyZSBwb3NzaWJpbGl0aWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJZmlyZU1vZGVsUmVzb3VyY2VNb3ZlZCh0aGlzLCBuZXdNb2RlbCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChzdHJpbmdJZCwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCQl9Ci0KLQkJZmluYWxseSB7Ci0JCQkvLyB3ZSBwdXQgZW5kIG5vdGlmaWNhdGlvbiBpbiBmaW5hbGx5IGJsb2NrLCBzbyBldmVuIGlmCi0JCQkvLyBlcnJvciBvY2N1cnMgZHVyaW5nIHNhdmUsIGxpc3RlbmVycyBhcmUgc3RpbGwgbm90aWZpZWQsCi0JCQkvLyBzaW5jZSB0aGVpciBjb2RlIGNvdWxkIGRlcGVuZCBvbiByZWNlaXZpbmcsIHRvIGNsZWFuIHVwCi0JCQkvLyBzb21lIHN0YXRlLCBvciBjb29yZGluYXRlIG90aGVyIHJlc291cmNlcy4KLQkJCXR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkJbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNhdmUoRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChzdHJpbmdJZCwgZW5jb2RpbmdSdWxlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHdlIHB1dCBlbmQgbm90aWZpY2F0aW9uIGluIGZpbmFsbHkgYmxvY2ssIHNvIGV2ZW4gaWYKLQkJCS8vIGVycm9yIG9jY3VycyBkdXJpbmcgc2F2ZSwgbGlzdGVuZXJzIGFyZSBzdGlsbCBub3RpZmllZCwKLQkJCS8vIHNpbmNlIHRoZWlyIGNvZGUgY291bGQgZGVwZW5kIG9uIHJlY2VpdmluZywgdG8gY2xlYW4gdXAKLQkJCS8vIHNvbWUgc3RhdGUsIG9yIGNvb3JkaW5hdGUgb3RoZXIgcmVzb3VyY2VzLgotCQkJdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCQltb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc2F2ZShJRmlsZSBpRmlsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChpRmlsZSwgc3RyaW5nSWQsIEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQkJfQotCi0JCWZpbmFsbHkgewotCQkJLy8gd2UgcHV0IGVuZCBub3RpZmljYXRpb24gaW4gZmluYWxseSBibG9jaywgc28gZXZlbiBpZgotCQkJLy8gZXJyb3Igb2NjdXJzIGR1cmluZyBzYXZlLCBsaXN0ZW5lcnMgYXJlIHN0aWxsIG5vdGlmaWVkLAotCQkJLy8gc2luY2UgdGhlaXIgY29kZSBjb3VsZCBkZXBlbmQgb24gcmVjZWl2aW5nLCB0byBjbGVhbiB1cAotCQkJLy8gc29tZSBzdGF0ZSwgb3IgY29vcmRpbmF0ZSBvdGhlciByZXNvdXJjZXMuCi0JCQl0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVDsKLQkJCW1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzYXZlKElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyBzdHJpbmdJZCA9IGdldElkKCk7Ci0JCQlfZ2V0TW9kZWxNYW5hZ2VyKCkuc2F2ZU1vZGVsKGlGaWxlLCBzdHJpbmdJZCwgZW5jb2RpbmdSdWxlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHdlIHB1dCBlbmQgbm90aWZpY2F0aW9vbiBpbiBmaW5hbGx5IGJsb2NrLCBzbyBldmVuIGlmCi0JCQkvLyBlcnJvciBvY2N1cnMgZHVyaW5nIHNhdmUsIGxpc3RlbmVycyBhcmUgc3RpbGwgbm90aWZpZWQsCi0JCQkvLyBzaW5jZSB0aGVpciBjb2RlIGNvdWxkIGRlcGVuZCBvbiByZWNlaXZpbmcsIHRvIGNsZWFuIHVwCi0JCQkvLyBzb21lIHN0YXRlLCBvciBjb29yZGluYXRlIG90aGVyIHJlc291cmNlcy4KLQkJCXR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkJbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChzdHJpbmdJZCwgb3V0cHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JCX0KLQotCQlmaW5hbGx5IHsKLQkJCS8vIHdlIHB1dCBlbmQgbm90aWZpY2F0aW9uIGluIGZpbmFsbHkgYmxvY2ssIHNvIGV2ZW4gaWYKLQkJCS8vIGVycm9yIG9jY3VycyBkdXJpbmcgc2F2ZSwgbGlzdGVuZXJzIGFyZSBzdGlsbCBub3RpZmllZCwKLQkJCS8vIHNpbmNlIHRoZWlyIGNvZGUgY291bGQgZGVwZW5kIG9uIHJlY2VpdmluZywgdG8gY2xlYW4gdXAKLQkJCS8vIHNvbWUgc3RhdGUsIG9yIGNvb3JkaW5hdGUgb3RoZXIgcmVzb3VyY2VzLgotCQkJdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCQltb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdHlwaWNhbGx5IHVzZWQgdG8gZGVub3RlIHRoZSBtb2RlbCdzIHVuZGVybHlpbmcKLQkgKiByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlTG9jYXRpb24oamF2YS5sYW5nLlN0cmluZyBuZXdCYXNlTG9jYXRpb24pIHsKLQkJZkJhc2VMb2NhdGlvbiA9IG5ld0Jhc2VMb2NhdGlvbjsKLQkJaWYgKGZSZXNvbHZlciAhPSBudWxsKSB7Ci0JCQlmUmVzb2x2ZXIuc2V0RmlsZUJhc2VMb2NhdGlvbihuZXdCYXNlTG9jYXRpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGVJZGVudGlmaWVyKFN0cmluZyBjb250ZW50VHlwZUlkZW50aWZpZXIpIHsKLQkJZkV4cGxpY2l0Q29udGVudFR5cGVJZGVudGlmaWVyID0gY29udGVudFR5cGVJZGVudGlmaWVyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpcnR5U3RhdGUoYm9vbGVhbiBkaXJ0eVN0YXRlKSB7Ci0KLQkJLy8gbm8gbmVlZCB0byBwcm9jZXNzIChzZXQgb3IgZmlyZSBldmVudCksIGlmIHNhbWUgdmFsdWUKLQkJaWYgKGZEaXJ0eVN0YXRlICE9IGRpcnR5U3RhdGUpIHsKLQkJCS8vIHByZS1jaGFuZ2Ugbm90aWZpY2F0aW9uCi0JCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfRElSVFlfU1RBVEUgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJCU1vZGVsTGlmZWN5Y2xlRXZlbnQgbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0KLQotCQkJLy8gdGhlIGFjdHVhbCBjaGFuZ2UKLQkJCWZEaXJ0eVN0YXRlID0gZGlydHlTdGF0ZTsKLQotCQkJLy8gb2xkIG5vdGlmaWNhdGlvbgotCQkJLy8gVE9ETzogQzMgcmVtb3ZlIG9sZCBub3RpZmljYXRpb24KLQkJCWlmIChmRGlydHlTdGF0ZSA9PSBmYWxzZSkgewotCQkJCS8vIGlmIHdlIGFyZSBiZWluZyBzZXQgdG8gbm90IGRpcnR5IChzdWNoIGFzIGp1c3QgYmVlbiBzYXZlZCkKLQkJCQkvLyB0aGVuIHdlIG5lZWQgdG8gc3RhcnQgbGlzdGVuaW5nIGZvciBjaGFuZ2VzCi0JCQkJLy8gYWdhaW4gdG8ga25vdyB3aGVuIHRvIHNldCBzdGF0ZSB0byB0cnVlOwotCQkJCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLmFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEaXJ0eVN0YXRlV2F0Y2hlcik7Ci0JCQl9Ci0JCQlmaXJlTW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZCh0aGlzLCBkaXJ0eVN0YXRlKTsKLQotCi0JCQkvLyBwb3N0IGNoYW5nZSBub3RpZmljYXRpb24KLQkJCXR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX0RJUlRZX1NUQVRFIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkJbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHdpbGwgbGlrZWx5IGJlIGRlcHJlY2F0ZWQgc29vbiwgaW4gZmF2b3Igb2YgZGlyZWN0ICdhZGRzJwotCSAqICAgICAgICAgICAgIC4uLiBidXQgdGFrZXMgc29tZSByZWRlc2lnbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSkgewotCQl0aGlzLmZhY3RvcnlSZWdpc3RyeSA9IGZhY3RvcnlSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgaWQgaXMgdGhlIGlkIHRoYXQgdGhlIG1vZGVsIG1hbmFnZXIgdXNlcyB0byBpZGVudGlmeSB0aGlzIG1vZGVsLiBJZgotCSAqIGl0IGlzIGJlaW5nIHNldCBoZXJlLCBpdCBtZWFucyB0aGUgbW9kZWwgbWFuZ2VyIGlzIGFscmVhZHkgbWFuYWdpbmcgdGhlCi0JICogbW9kZWwgd2l0aCBhbm90aGVyIGlkLCBzbyB3ZSBoYXZlIHRvIGtlZXAgaXQgaW4gc3luYy4gVGhpcyBtZXRob2QgY2FsbHMKLQkgKiBub3RpZmllcyBsaXN0bmVycywgaWYgdGhleSBoYXZlbid0IGJlZW4gbm90aWZpZWQgYWxyZWFkeSwgdGhhdCBhICJtb2RlbAotCSAqIHN0YXRlIGNoYW5nZSIgaXMgYWJvdXQgdG8gb2NjdXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB0aHJvd3MgUmVzb3VyY2VJblVzZSB7Ci0KLQotCQkvLyBJdCBtYWtlcyBubyBzZW5zZSwgSSBkb24ndCB0aGluaywgdG8gaGF2ZSBhbiBpZCBvZiBudWxsLCBzbwotCQkvLyB3ZSdsbCB0aHJvdyBhbiBpbGxlZ2FsIGFyZ3VtZW50IGV4Y2VwdGlvbiBpZiBzb21lb25lIHRyeXMuIE5vdGU6Ci0JCS8vIHRoZSBJTW9kZWxNYW5hZ2VyIGNvdWxkIG5vdCBtYW5hZ2UgYSBtb2RlbCB3aXRoIGFuIGlkIG9mIG51bGwsCi0JCS8vIHNpbmNlIGl0IHVzZXMgaGFzaHRhYmxlcywgYW5kIHlvdSBjYW4ndCBoYXZlIGEgbnVsbCBpZCBmb3IgYQotCQkvLyBoYXNodGFibGUuCi0JCWlmIChuZXdJZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTU0VDb3JlTWVzc2FnZXMuQV9tb2RlbF9zX2lkX2Nhbl9ub3RfYmVfbnVfRVhDXyk7IC8vJE5PTi1OTFMtMSQgPSAiQSBtb2RlbCdzIGlkIGNhbiBub3QgYmUgbnVsbCIKLQkJLy8gVG8gZ3VhcmQgYWdhaW5zdCB0aHJvd2luZyBhIHNwdXJpb3VzIFJlc291cmNlSW5Vc2UgZXhjZXB0aW9uLAotCQkvLyB3aGljaCBjYW4gb2NjdXIgd2hlbiB0d28gcGllY2VzIG9mIGNvZGUgYm90aCB3YW50IHRvIGNoYW5nZSB0aGUgaWQsCi0JCS8vIHNvIHRoZSBzZWNvbmQgcmVxdWVzdCBpcyBzcHVyaW91cywgd2UnbGwgaWdub3JlIGFueSByZXF1ZXN0cyB0aGF0Ci0JCS8vIGF0dGVtcHQgdG8gY2hhbmdlIHRoZSBpZCB0byB3aGF0IGl0IGFscmVhZHkgaXMgLi4uIG5vdGUsIHdlIHVzZQotCQkvLyAnZXF1YWxzJywgbm90IGlkZW50aXR5ICgnPT0nKSBzbyB0aGF0IHRoaW5ncyBsaWtlCi0JCS8vIHN0cmluZ3MgY2FuIGJlIHVzZWQuIFRoaXMgaXMgdGhlIHNhbWUgY3JpdGVyaWEgdGhhdCBpZHMgYXJlCi0JCS8vIGZvdW5kIGluIG1vZGVsIG1hbmFnZXIgLS0gd2VsbCwgYWN0dWFsbHksIEkganVzdCBjaGVja2VkLCBhbmQgZm9yCi0JCS8vIHRoZSBoYXNodGFibGUgaW1wbCwgdGhlIGNyaXRlcmlhIHVzZXMgLmVxdWFscyBBTkQgdGhlIGNvbmRpdGlvbgotCQkvLyB0aGF0IHRoZSBoYXNoIHZhbHVlcyBiZSBpZGVudGljYWwgKEknbSBhc3N1bWluZyB0aGlzIGlzIGFsd2F5cwotCQkvLyB0cnVlLCBpZiBlcXVhbHMgaXMgdHJ1ZSwgZm9yIG5vdywgSSdtIG5vdCBzdXJlCi0JCS8vIHdlIGNhbiBhc3N1bWUgdGhhdCBoYXNodGFibGUgd2lsbCBhbHdheXMgYmUgdXNlZCwgYnV0IGluCi0JCS8vIGdlbmVyYWwsIHNob3VsZCBtYXRjaC4pCi0JCS8vCi0JCWlmIChuZXdJZC5lcXVhbHMoZklkKSkKLQkJCXJldHVybjsKLQkJLy8gd2UgbXVzdCBndWFyZCBhZ2FpbnN0IHJlYXNzaWduaW5nIGFuIGlkIHRvIG9uZSB0aGF0IHdlIGFscmVhZHkKLQkJLy8gYXJlIG1hbmFnaW5nLgotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBpblVzZSA9ICgoTW9kZWxNYW5hZ2VySW1wbClnZXRNb2RlbE1hbmFnZXIoKSkuaXNJZEluVXNlKG5ld0lkKTsKLQkJCWlmIChpblVzZSkgewotCQkJCXRocm93IG5ldyBSZXNvdXJjZUluVXNlKCk7Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCS8vIG5vcm1hbCBjb2RlIHBhdGgKLQkJCWFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJU3RyaW5nIG9sZElkID0gZklkOwotCQkJZklkID0gbmV3SWQ7Ci0JCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgIT0gbnVsbCkgewotCQkJCS8vIGlmIG1hbmFnZWQgYW5kIHRoZSBpZCBoYXMgY2hhbmdlZCwgbm90aWZ5IHRvCi0JCQkJLy8gSU1vZGVsTWFuYWdlcgotCQkJCS8vIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbiBub3QgdG8gZG8gdGhhdAotCQkJCWlmIChvbGRJZCAhPSBudWxsICYmIG5ld0lkICE9IG51bGwgJiYgIW5ld0lkLmVxdWFscyhvbGRJZCkpIHsKLQkJCQkJZ2V0TW9kZWxNYW5hZ2VyKCkubW92ZU1vZGVsKG9sZElkLCBuZXdJZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gbWFrZSBzdXJlIHRoaXMgZmluYWxseSBpcyBvbmx5IGV4ZWN1dGVkIGlmICdhYm91dCB0byBDaGFuZ2UKLQkJCS8vIG1vZGVsJyBoYXMKLQkJCS8vIGJlZW4gZXhlY3V0ZWQuCi0JCQljaGFuZ2VkTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBjb250ZW50VHlwZURlc2NyaXB0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsSGFuZGxlcihJTW9kZWxIYW5kbGVyIG1vZGVsSGFuZGxlcikgewotCi0JCS8vIG5vIG5lZWQgdG8gZmlyZSBldmVudHMgaWYgbW9kZWxIYW5kbGVyIGhhcyBiZWVuIG51bGwKLQkJLy8gZm9yIHRoaXMgbW9kZWwgLS0KLQkJLy8gdGhpcyBpcyBhbiBhdHRlbXB0IGF0IGluaXRpYWxpemF0aW9uIG9wdGltaXphdGlvbiBhbmQgbWF5IG5lZWQKLQkJLy8gdG8gY2hhbmdlIGluIGZ1dHVyZS4KLQkJYm9vbGVhbiB0cnVlQ2hhbmdlID0gZmFsc2U7Ci0JCWlmIChmTW9kZWxIYW5kbGVyICE9IG51bGwpCi0JCQl0cnVlQ2hhbmdlID0gdHJ1ZTsKLQkJaWYgKHRydWVDaGFuZ2UpIHsKLQkJCWludGVybmFsQWJvdXRUb0JlQ2hhbmdlZCgpOwotCQl9Ci0JCWZNb2RlbEhhbmRsZXIgPSBtb2RlbEhhbmRsZXI7Ci0JCWlmICh0cnVlQ2hhbmdlKSB7Ci0JCQlpbnRlcm5hbE1vZGVsQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGVsTWFuYWdlcihJTW9kZWxNYW5hZ2VyIG5ld01vZGVsTWFuYWdlcikgewotCi0JCWZNb2RlbE1hbmFnZXIgPSBuZXdNb2RlbE1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3U3RhdGUoYm9vbGVhbiBuZXdTdGF0ZSkgewotCi0JCWZOZXdTdGF0ZSA9IG5ld1N0YXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgYSAiZmxhZyIgdGhhdCByZWluaXRpYWxpemF0aW9uIGlzIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWluaXRpYWxpemVOZWVkZWQoYm9vbGVhbiBuZWVkZWQpIHsKLQotCQlyZWluaXRpYWxpemF0aW9uTmVlZGVkID0gbmVlZGVkOwotCX0KLQotCS8qKgotCSAqIEhvbGRzIGFueSBkYXRhIHRoYXQgdGhlIHJlaW5pdCBwcm9jZWR1cmUgbWlnaHQgZmluZCB1c2VmdWwgaW4KLQkgKiByZWluaXRpYWxpemluZyB0aGUgbW9kZWwuIFRoaXMgaXMgaGFuZHksIHNpbmNlIHRoZSByZWluaXRpYWxpemF0aW9uIG1heQotCSAqIG5vdCB0YWtlIHBsYWNlIGF0IG9uY2UsIGFuZCBzb21lICJvbGQiIGRhdGEgbWF5IGJlIG5lZWRlZCB0byBwcm9wZXJseQotCSAqIHVuZG8gcHJldmlvdXMgc2V0dGluZ3MuIE5vdGU6IHRoZSBwYXJhbWV0ZXIgd2FzIGludGVudGlvbmFsbHkgbWFkZSB0bwotCSAqIGJlIG9mIHR5cGUgJ09iamVjdCcgc28gZGlmZmVyZW50IG1vZGVscyBjYW4gdXNlIGluIGRpZmZlcmVudCB3YXlzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YShPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJcmVpbml0aWFsaXplU3RhdGVEYXRhID0gb2JqZWN0OwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0UmVzb2x2ZXIoVVJJUmVzb2x2ZXIgbmV3UmVzb2x2ZXIpIHsKLQotCQlmUmVzb2x2ZXIgPSBuZXdSZXNvbHZlcjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCkgewotCQlib29sZWFuIGxpZmVDeWNsZU5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEaXJ0eVN0YXRlV2F0Y2hlcik7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKGZEb2N1bWVudFRvTW9kZWxOb3RpZmllcik7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEb2N1bWVudFRvTW9kZWxOb3RpZmllcik7Ci0JCQkvLyBwcmVjaGFuZ2Ugbm90aWZpY2F0aW9uCi0JCQlsaWZlQ3ljbGVOb3RpZmljYXRpb24gPSB0cnVlOwotCQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IERvY3VtZW50Q2hhbmdlZChNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVCwgdGhpcywgZlN0cnVjdHVyZWREb2N1bWVudCwgbmV3U3RydWN0dXJlZERvY3VtZW50KTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCQl9Ci0KLQkJLy8gaG9sZCBmb3IgbGlmZSBjeWNsZSBub3RpZmljYXRpb24KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBwcmV2aW91c0RvY3VtZW50ID0gZlN0cnVjdHVyZWREb2N1bWVudDsKLQkJLy8gdGhlIGFjdHVhbCBjaGFuZ2UKLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IG5ld1N0cnVjdHVyZWREb2N1bWVudDsKLQotCi0JCS8vIGF0IHRoZSBzdXBlciBjbGFzcyBsZXZlbCwgd2UnbGwgbGlzdGVuIGZvciBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkJLy8gY2hhbmdlcwotCQkvLyBzbyB3ZSBjYW4gc2V0IG91ciBkaXJ0eSBzdGF0ZSBmbGFnCi0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRpcnR5U3RhdGVXYXRjaGVyKTsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoZkRvY3VtZW50VG9Nb2RlbE5vdGlmaWVyKTsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRvY3VtZW50VG9Nb2RlbE5vdGlmaWVyKTsKLQkJfQotCi0JCWlmIChsaWZlQ3ljbGVOb3RpZmljYXRpb24pIHsKLQkJCS8vIHBvc3QgY2hhbmdlIG5vdGlmaWNhdGlvbgotCQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IERvY3VtZW50Q2hhbmdlZChNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQsIHRoaXMsIHByZXZpb3VzRG9jdW1lbnQsIG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvNy8yMDAxIDI6MzA6MjYKLQkgKiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U3luY2hyb25pemF0aW9uU3RhbXAKLQkgKiAgICAgICAgICAgIGxvbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTeW5jaHJvbml6YXRpb25TdGFtcChsb25nIG5ld1N5bmNocm9uaXphdGlvblN0YW1wKSB7Ci0KLQkJZlN5bmNocm9uaXphdGlvblN0YW1wID0gbmV3U3luY2hyb25pemF0aW9uU3RhbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5kb01hbmFnZXIoSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01hbmFnZXIpIHsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRvY3VtZW50IHdhcyBudWxsIHdoZW4gdW5kbyBtYW5hZ2VyIHNldCBvbiBtb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc3RydWN0dXJlZERvY3VtZW50LnNldFVuZG9NYW5hZ2VyKHVuZG9NYW5hZ2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBUbyBiZSBjYWxsZWQgb25seSBieSAiZnJpZW5kbHkiIGNsYXNzZXMsIHN1Y2ggYXMgTW9kZWxNYW5hZ2VyLCBhbmQKLQkgKiBzdWJjbGFzc2VzLgotCSAqLwotCXZvaWQgc2lnbmFsTGlmZWN5Y2xlRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkgewotCQlpZiAoZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIuc2lnbmFsTGlmZWN5Y2xlRXZlbnQoZXZlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaWduYWxQb3N0TGlmZUN5Y2xlTGlzdGVuZXJSZWxlYXNlKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9SRUxFQVNFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVDsKLQkJLy8gd2hhdCdzIHdyb25nIHdpdGggdGhpcyBkZXNpZ24gdGhhdCBhIGNhc3QgaXMgbmVlZGVkIGhlcmUhPwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQoc3RydWN0dXJlZE1vZGVsLCB0eXBlKTsKLQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5zaWduYWxMaWZlY3ljbGVFdmVudChldmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNpZ25hbFByZUxpZmVDeWNsZUV2ZW50UmVsZWFzZShJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfUkVMRUFTRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJLy8gd2hhdCdzIHdyb25nIHdpdGggdGhpcyBkZXNpZ24gdGhhdCBhIGNhc3QgaXMgbmVlZGVkIGhlcmUhPwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQoc3RydWN0dXJlZE1vZGVsLCB0eXBlKTsKLQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5zaWduYWxMaWZlY3ljbGVFdmVudChldmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9GYWN0b3J5UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvRmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMzAzOTAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvRmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc2ltcGx5IG1haW50YWlucyB0aGUgbGlzdCBvZiBmYWN0b3JpZXMgYW5kIHJldHVybnMgc2luZ2xldG9uCi0gKiBpbnN0YW5jZXMgb2YgdGhlbS4gU29tZSAiYnVpbHQgaW4iIHR5cGVzIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZm9ybQotICogRmFjdG9yeUNvbmZpZywgaWYgbm90IGZvdW5kIHJlZ2lzdGVyZCwgYnV0IG5vcm1hbGx5IGNsaWVudHMgY2FuL3Nob3VsZAotICogcmVnaXN0ZXIgdGhlaXIgb3duIGZhY3Rvcmllcy4KLSAqIAotICogTm90IGludGVuZGVkIGZvciBjbGllbnRzIHRvIHN1YmNsYXNzIG9yIGluc3RhbnRpYXRlLgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWN0b3J5UmVnaXN0cnkgewotCi0JcHJpdmF0ZSBMaXN0IGZhY3RvcmllczsKLQotCS8qKgotCSAqIGludGVudGlvbmFsbHkgZGVmYXVsdCBhY2Nlc3MKLQkgKi8KLQlGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIExpc3QgX2dldEZhY3RvcmllcygpIHsKLQotCQlpZiAoZmFjdG9yaWVzID09IG51bGwpIHsKLQkJCS8vIG1heSBuZWVkIHRvIHVzZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdCgpIGlmCi0JCQkvLyBzeW5jcm9uaXphdGlvbiBiZWNvbWVzCi0JCQkvLyBuZWNlc3NhcnkgKGFuZCBpZiBzbywgcmVtZW1iZXIgdG8gc3luY2hyb25pemUgb24gZmFjdG9yaWVzKQotCQkJZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBmYWN0b3JpZXM7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlfZ2V0RmFjdG9yaWVzKCkuYWRkKGZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyRmFjdG9yaWVzKCkgewotCQlmYWN0b3JpZXMuY2xlYXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRmFjdG9yeVJlZ2lzdHJ5I2NvbnRhaW5zKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgdHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdyZSBub3QgdXNpbmcgY2xvbmVkIGxpc3QsIHNvIHN0cmljdGx5IHNwZWFraW5nCi0JCS8vIGlzIG5vdCB0aHJlYWQgc2FmZS4KLQkJTGlzdCBpbnRlcm5hbExpc3QgPSBfZ2V0RmFjdG9yaWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJuYWxMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgaW50ZXJuYWxMaXN0LmdldChpKTsKLQkJCWlmIChmYWN0b3J5LmlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiB0aGUgbGlzdCBvZiBmYWN0b3JpZXMgaW4gdGhlIHJlZ2lzdHJ5LiBOb3RlOgotCSAqIHRoaXMgY2FuIG5vdCBiZSB1c2VkIHRvIGFkZC9yZW1vdmUgZmFjdG9yaWVzLiBJdHMgcHJpbWFyaWx5IHByb3ZpZGVkCi0JICogZm9yIHRob3NlIGZldyBjYXNlcyB3aGVyZSBhIGxpc3Qgb2YgZmFjdG9yaWVzIG11c3QgYmUgY29waWVkIGZyb20gb25lCi0JICogbW9kZWwgYW5kIGFkZGVkIHRvIGFub3RoZXIuCi0JICovCi0JcHVibGljIExpc3QgZ2V0RmFjdG9yaWVzKCkgewotCQkvLyBub3RlOiBmb3Igb2JqZWN0IGludGVncml0eSwgd2UgZG9uJ3QgbGV0IGFueW9uZSBnZXQKLQkJLy8gb3VyIG1haW4gbGlzdCAoc28gdGhleSBoYXZlIHRvIGFkZCB0aHJvdWdoIGFkZEZhY3RvcnkpLAotCQkvLyBidXQgd2Ugd2lsbCByZXR1cm4gYSBzaGFsbG93ICJjbG9uZWQiIGxpc3QuCi0JCUxpc3QgZmFjdG9yeUxpc3QgPSBuZXcgQXJyYXlMaXN0KF9nZXRGYWN0b3JpZXMoKSk7Ci0JCXJldHVybiBmYWN0b3J5TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIG5vdCBhIHB1cmUgcmVzaXN0cnkuIEZhY3RvcmllcyByZXRyaWV2ZWQgYmFzZWQgb24KLQkgKiB0aGVpciByZXNwb25zZSB0byAiaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSIuIE5vdGUgdGhhdCBpZiB0aGVyZSBpcyBtb3JlCi0JICogdGhhbiBvbmUgZmFjdG9yeSB0aGF0IGNhbiBhbnN3ZXIgJ3RydWUnIHRoYXQgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQKLQkgKiBmYWN0b3J5IGlzIHVzZWQuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgZ2V0RmFjdG9yeUZvcihPYmplY3QgdHlwZSkgewotCi0JCUlOb2RlQWRhcHRlckZhY3RvcnkgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGZhY3RvcmllcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBsaXN0U2l6ZSA9IGZhY3Rvcmllcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSBsaXN0U2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkvLyBJdCBpcyB0aGUgYWRhcHRlciBmYWN0b3JpZXMgcmVzcG9uc2liaWxpdHkgdG8gYW5zd2VyCi0JCQkvLyBpc0ZhY3RvcnlGb3JUeXBlIHNvIGl0IGdldHMgY2hvb3Nlbi4KLQkJCS8vIE5vdGljZSB3ZSBhcmUgZ29pbmcgdGhyb3VnaCB0aGUgbGlzdCBiYWNrd2FyZHMgdG8gZ2V0IHRoZQotCQkJLy8gZmFjdG9yeSBhZGRlZCBsYXN0LgotCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBhID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGZhY3Rvcmllcy5nZXQoaSk7Ci0JCQlpZiAoYS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQkJcmVzdWx0ID0gYTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gbW9kaWZpZWQgdG8gd29yayBvbiBjb3B5IG9mIGxpc3QsIGZvciBWNVBURjEKLQkJLy8gc2VuZCByZWxlYXNlIHRvIGxvY2FsIGNvcHkgb2YgbGlzdAotCQkvLyBvZiBmYWN0b3JpZXMsIHNpbmNlIHNvbWUgZmFjdG9yaWVzLCBkdXJpbmcKLQkJLy8gdGhlaXIgcmVsZWFzZSBmdW5jdGlvbiwgbWF5IHJlbW92ZQotCQkvLyB0aGVtc2VsdmVzIGZyb20gdGhlIHJlZ2lzdHJ5LgotCQlMaXN0IGxvY2FsTGlzdCA9IGdldEZhY3RvcmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsTGlzdC5zaXplKCk7IGkrKykgewotCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBhID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGxvY2FsTGlzdC5nZXQoaSk7Ci0JCQkvLyBUbyBoZWxwIGJ1bGxldCBwcm9vZiBjb2RlLCB3ZSdsbCBjYXRjaCBhbmQgbG9nCi0JCQkvLyBhbnkgbWVzc2FnZXMgdGhyb3duIGJ5IGZhY3RvcmllcyBkdXJpbmcgcmVsZWFzZSwKLQkJCS8vIGJ1dCB3ZSdsbCBhdHRlbXB0IHRvIGtlZXAgZ29pbmcuCi0JCQkvLyBJbiBuZWFybHkgYWxsIGNhc2VzLCB0aG91Z2gsIHN1Y2ggZXJyb3JzIGFyZQotCQkJLy8gc2V2ZXJlIGZvciBwcm9kdWN0L2NsaWVudCwgYW5kIG5lZWQgdG8gYmUgZml4ZWQuCi0JCQl0cnkgewotCQkJCWEucmVsZWFzZSgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiUHJvZ3JhbSBwcm9ibGVtIHJlbGVhc2luZyBmYWN0b3J5IiArIGEsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgZmFjdG9yeSBpZiBpdCBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldEZhY3RvcnlGb3IodHlwZSkuIElmCi0JICogdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSwgYWxsIGFyZSByZW1vdmVkLiBJZiB0aGVyZSBpcyBub25lLCB0aGUgY2FsbAotCSAqIHNpbXBseSByZXR1cm5zICh0aGF0IGlzLCBpdCBpcyBub3QgY29uc2lkZXJlZCBhbiBlcnJvcikuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRmFjdG9yaWVzRm9yKGphdmEubGFuZy5PYmplY3QgdHlwZSkgewotCQlpZiAoZmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCWludCBsaXN0U2l6ZSA9IGZhY3Rvcmllcy5zaXplKCk7Ci0JCQkvLyB3ZSdsbCBnbyBiYWNrd2FyZHMgdGhyb3VnaCBsaXN0LCBzaW5jZSB3ZSdyZSByZW1vdmluZywgc28KLQkJCS8vICdzaXplJyBjaGFuZ2Ugd29uJ3QgbWF0dGVyLgotCQkJLy8gTm90ZTogSSdtIGFzc3VtaW5nIG90aGVyIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uIGRvIG5vdCBjaGFuZ2UKLQkJCS8vIHBvc2l0aW9uCi0JCQkvLyBzaW1wbHkgYmVjYXVzZSBhbm90aGVyIHdhcyByZW1vdmVkLgotCQkJZm9yIChpbnQgaSA9IGxpc3RTaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkvLyBJdCBpcyB0aGUgYWRhcHRlciBmYWN0b3JpZXMgcmVzcG9uc2liaWxpdHkgdG8gYW5zd2VyCi0JCQkJLy8gaXNGYWN0b3J5Rm9yVHlwZSBzbyBpdCBnZXRzIGNob29zZW4uCi0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBhID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGZhY3Rvcmllcy5nZXQoaSk7Ci0JCQkJaWYgKGEuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJCQlmYWN0b3JpZXMucmVtb3ZlKGEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCV9nZXRGYWN0b3JpZXMoKS5yZW1vdmUoZmFjdG9yeSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9MaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkY2YwMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9MaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExpZmVjeWNsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLQotCi0vKioKLSAqIEZvciAiaW50ZXJuYWwgdXNlIiBvbmx5IGJ5IEFic3RyYWN0U3RydWN0dXJlZE1vZGVsCi0gKi8KLQotY2xhc3MgTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBPYmplY3RbXSBmTGlzdGVuZXJzOwotCi0JTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmV3IGNvcHkgb2YgdGhlIGdpdmVuIGxpc3RlbmVyIHRvIHRoZSBsaXN0IG9mIExpZmUgQ3ljbGUKLQkgKiBMaXN0ZW5lcnMuCi0JICogCi0JICogTXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIGxpc3RlbmVyIGFyZSBhbGxvd2VkLiBUaGlzIGlzIHJlcXVpcmVkIHRvCi0JICogc3VwcG9ydCB0aHJlYWRlZCBsaXN0ZW5lciBtYW5hZ2VtZW50IHByb3Blcmx5IGFuZCBmb3IgbW9kZWwtZHJpdmVuIG1vdmUKLQkgKiB0byB3b3JrLiBGb3IgZXhhbXBsZSwgdHdvIGFkZHMgYW5kIGEgc2luZ2xlIHJlbW92ZSBzaG91bGQgcmVzdWx0IGluIHRoZQotCSAqIGxpc3RlbmVyIHN0aWxsIGxpc3RlbmluZyBmb3IgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXZvaWQgYWRkTGlzdGVuZXIoSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKExvZ2dlci5ERUJVRyAmJiBVdGlsaXRpZXMuY29udGFpbnMoZkxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiBsaXN0ZW5pbmcgbW9yZSB0aGFuIG9uY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaW50IG9sZFNpemUgPSAwOwotCQlpZiAoZkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IgZmlyc3QKLQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJb2xkU2l6ZSA9IGZMaXN0ZW5lcnMubGVuZ3RoOwotCQl9Ci0JCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCWlmIChmTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZkxpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBvbGRTaXplKTsKLQkJfQotCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQluZXdMaXN0ZW5lcnNbbmV3U2l6ZSAtIDFdID0gbGlzdGVuZXI7Ci0JCS8vCi0JCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJZkxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgc2luZ2xlIGNvcHkgb2YgdGhlIGdpdmVuIGxpc3RlbmVyIGZyb20gdGhlIGxpc3Qgb2YgTGlmZSBDeWNsZQotCSAqIExpc3RlbmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIHJlbW92ZUxpc3RlbmVyKElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZkxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJaW50IG9sZFNpemUgPSBmTGlzdGVuZXJzLmxlbmd0aDsKLQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCWJvb2xlYW4gcmVtb3ZlZE9uY2UgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGZMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIgJiYgIXJlbW92ZWRPbmNlKSB7Ci0JCQkJCS8vIGlnbm9yZSBvbiB0aGUgZmlyc3QgbWF0Y2gKLQkJCQkJcmVtb3ZlZE9uY2UgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdCdzIG5vdCB0aGUgb25lIHdlIGFyZSByZW1vdmluZwotCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmTGlzdGVuZXJzW2ldOwotCQkJCX0KLQkJCX0KLQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlIG9sZAotCQkJLy8gb25lCi0JCQlmTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQl9Ci0JCWlmIChMb2dnZXIuREVCVUcgJiYgVXRpbGl0aWVzLmNvbnRhaW5zKGZMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIklNb2RlbExpZmVjeWNsZUxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgcmVtb3ZlZCBvbmNlIGJ1dCBzdGlsbCBsaXN0ZW5pbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQl2b2lkIHNpZ25hbExpZmVjeWNsZUV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKExvZ2dlci5ERUJVR19MSUZFQ1lDTEUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJNb2RlbExpZmVjeWNsZUV2ZW50IGZpcmVkIGZvciAiICsgZXZlbnQuZ2V0TW9kZWwoKS5nZXRJZCgpICsgIjogIiArIGV2ZW50LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW9kZWxMaWZlY3ljbGVFdmVudCBmaXJlZCBmb3IgIiArIGV2ZW50LmdldE1vZGVsKCkuZ2V0SWQoKSArICI6ICIgKyBldmVudC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJLy8gV2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUgbGlzdGVuZXIgbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlCi0JCS8vIGxpc3RlbmVyIGFycmF5IGZyb20gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXTsKLQkJCQkvLyBvbmx5IG9uZSB0eXBlIG9mIGxpc3RlbmVyIGZvciBub3cgLi4uIHRoaXMgY291bGQgYmVjb21lCi0JCQkJLy8gbW9yZSBjb21wbGV4Ci0JCQkJaWYgKChldmVudC5nZXRJbnRlcm5hbFR5cGUoKSAmIE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UKSA9PSBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVCkgewotCQkJCQlsaXN0ZW5lci5wcm9jZXNzUHJlTW9kZWxFdmVudChldmVudCk7Ci0JCQkJfQotCQkJCWlmICgoZXZlbnQuZ2V0SW50ZXJuYWxUeXBlKCkgJiBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQpID09IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVCkgewotCQkJCQlsaXN0ZW5lci5wcm9jZXNzUG9zdE1vZGVsRXZlbnQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTW9kZWxMaWZlY3ljbGVFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9Nb2RlbExpZmVjeWNsZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjY2ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9Nb2RlbExpZmVjeWNsZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gZWFybHkgdmVyc2lvbiBvZiBhIGNsYXNzIHRoYXQgbWF5IGNoYW5nZSBvdmVyIHRoZSBuZXh0IGZldwotICogbWlsZXN0b25lcy4KLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbExpZmVjeWNsZUV2ZW50IHsKLQotCi0JLy8gdGhpcyBsaXN0IGlzIGZvciAicHVibGljIiBjb25zdW1wdGlvbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX1NBVkVEID0gMHgwMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX1JFTEVBU0VEID0gMHgwMDAwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9ET0NVTUVOVF9DSEFOR0VEID0gMHgwMDAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX0RJUlRZX1NUQVRFID0gMHgwMDA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX1JFVkVSVD0gMHgwMDA1OwotCi0JLy8gVE9ETzogZmluaXNoIHN1cHBvcnQgZm9yIHRoZXNlCi0JLy8gZm9sbG93aW5nIG5vdCBpbXBsZW1lbnRlZCB5ZXQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9SRUlOSVRJQUxJWkVEID0gMHgwMDA2OwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURBUFRFUlNfTk9USUZJRUQgPSAweDAwMDc7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9SRVNPVVJDRV9NT1ZFRCA9IDB4MDAwODsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX1JFU09VUkNFX0RFTEVURUQgPSAweDAwMDk7Ci0KLQkvLyBUaGlzIGxpc3QgKHVwcGVyIHR3byBieXRlcykgaXMgZm9yIG9ubHkgaW50ZXJuYWwgbWVjaGFuaXNtcyBhbmQKLQkvLyBzdWJjbGFzc2VzCi0JLy8gRm9yIHNpbXBsaWNpdHkgdGhleSBhcmUgIm1hc2tlZCBvdXQiIHdoZW4gY2xpZW50IGNhbGxzIGdldFR5cGUoKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBSRV9FVkVOVCA9IDB4MDEwMDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFTSyA9IDB4MDBGRjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQT1NUX0VWRU5UID0gMHgwMjAwOwotCi0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsOwotCXByaXZhdGUgaW50IGZUeXBlOwotCi0JcHVibGljIE1vZGVsTGlmZWN5Y2xlRXZlbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE1vZGVsTGlmZWN5Y2xlRXZlbnQoaW50IHR5cGUpIHsKLQkJdGhpcygpOwotCQlmVHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIE1vZGVsTGlmZWN5Y2xlRXZlbnQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGludCB0eXBlKSB7Ci0JCXRoaXModHlwZSk7Ci0JCWZNb2RlbCA9IHN0cnVjdHVyZWRNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBkZWJ1Z1N0cmluZyhpbnQgdHlwZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlICYgTUFTSykgewotCQkJY2FzZSBNT0RFTF9TQVZFRCA6Ci0JCQkJcmVzdWx0ID0gIk1PREVMX1NBVkVEIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFTF9SRUxFQVNFRCA6Ci0JCQkJcmVzdWx0ID0gIk1PREVMX1JFTEVBU0VEIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFTF9ET0NVTUVOVF9DSEFOR0VEIDoKLQkJCQlyZXN1bHQgPSAiTU9ERUxfRE9DVU1FTlRfQ0hBTkdFRCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERUxfRElSVFlfU1RBVEUgOgotCQkJCXJlc3VsdCA9ICJNT0RFTF9ESVJUWV9TVEFURSI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCS8qCi0JCQkgKiBjYXNlIE1PREVMX1JFSU5JVElBTElaRUQgOiByZXN1bHQgPSAiTU9ERUxfUkVJTklUSUFMSVpFRCI7Ci0JCQkgKiBicmVhazsgY2FzZSBNT0RFTF9SRUxPQURFRCA6IHJlc3VsdCA9ICJNT0RFTF9SRUxPQURFRCI7IGJyZWFrOwotCQkJICogY2FzZSBBREFQVEVSU19OT1RJRklFRCA6IHJlc3VsdCA9ICJBREFQVEVSU19OT1RJRklFRCI7IGJyZWFrOwotCQkJICogY2FzZSBNT0RFTF9SRVNPVVJDRV9NT1ZFRCA6IHJlc3VsdCA9ICJNT0RFTF9SRVNPVVJDRV9NT1ZFRCI7Ci0JCQkgKiBicmVhazsgY2FzZSBNT0RFTF9SRVNPVVJDRV9ERUxFVEVEIDogcmVzdWx0ID0KLQkJCSAqICJNT0RFTF9SRVNPVVJDRV9ERUxFVEVEIjsgYnJlYWs7Ci0JCQkgKi8KLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1vZGVsTGlmZWN5Y2xlRXZlbnQgZGlkIG5vdCBoYXZlIHZhbGlkIHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRJbnRlcm5hbFR5cGUoKSB7Ci0KLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKCkgewotCi0JCXJldHVybiBmTW9kZWw7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCi0JCS8vIGZvciBub3csIHdlJ2xsIG1hc2sgdHlwZSB0byAicHVibGljIiBvbmVzIHRoaXMgZWFzeQotCQkvLyB3YXkgLi4uIGJ1dCBJIGtub3cgdGhlcmUgbXVzdCBiZSBhIGJldHRlciB3YXkKLQkJcmV0dXJuIGZUeXBlICYgTUFTSzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gIk1vZGVsTGlmZWN5Y2xlRXZlbnQ6ICIgKyBkZWJ1Z1N0cmluZyhmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTW9kZWxNYW5hZ2VySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9Nb2RlbE1hbmFnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzE4NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9Nb2RlbE1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAqICAgICBGcmFuayBaaWdsZXIvV2ViIFBlcmZvcm1hbmNlLCBJbmMuIC0gMjg4MTk2IC0gRGVhZGxvY2sgaW4gTW9kZWxNYW5hZ2VySW1wbCBhZnRlciBJT0V4Y2VwdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkZpbGVCdWZmZXJNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTnVsbE1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRTdHJlYW1DcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zLk1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VBbHJlYWR5RXhpc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuUHJvamVjdFJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLQotLyoqCi0gKiA8cD5Ob3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCwgcmVmZXJlbmNlZCBvciBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KLSAqIENsaWVudHMgc2hvdWxkIG9idGFpbiBhbiBpbnN0YW5jZSBvZiB0aGUgSU1vZGVsTWFuYWdlciBpbnRlcmZhY2UgdGhyb3VnaAotICoge0BsaW5rIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIjZ2V0TW9kZWxNYW5hZ2VyKCl9LjwvcD4KLSAqIAotICogPHA+VGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcsIHJldHJpZXZpbmcsIGFuZCBjYWNoaW5nCi0gKiBTdHJ1Y3R1cmVkTW9kZWxzIEl0IHJldHJpZXZlcyB0aGUgY2FjaGVkIG9iamVjdHMgYnkgYW4gaWQgd2hpY2ggaXMKLSAqIHR5cGljYWxseSBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJlc291cmNlcyBVUkkuIE5vdGU6IEl0cyBpbXBvcnRhbnQgdGhhdAotICogYWxsIGNsaWVudHMgdGhhdCBzaGFyZSBhIHJlc291cmNlIGRvIHNvIHVzaW5nIDxiPmlkZW50aWNhbCA8L2I+Ci0gKiBpZGVudGlmaWVycywgb3IgZWxzZSBkaWZmZXJlbnQgaW5zdGFuY2VzIHdpbGwgYmUgY3JlYXRlZCBhbmQgcmV0cmlldmVkLAotICogZXZlbiBpZiB0aGV5IGFsbCB0ZWNobmljYWxseSBwb2ludCB0byB0aGUgc2FtZSByZXNvdXJjZSBvbiB0aGUgZmlsZSBzeXN0ZW0uCi0gKiBUaGlzIGNsYXNzIGFsc28gcHJvdmlkZXMgYSBjb252ZW5pZW50IHBsYWNlIHRvIHJlZ2lzdGVyIE1vZGVsIExvYWRlcnMgYW5kCi0gKiBEdW1wZXJzIGJhc2VkIG9uICd0eXBlJy48L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbE1hbmFnZXJJbXBsIGltcGxlbWVudHMgSU1vZGVsTWFuYWdlciB7Ci0KLQkKLQkKLQlzdGF0aWMgY2xhc3MgUmVhZEVkaXRUeXBlIHsKLQkJUmVhZEVkaXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCX0KLQl9Ci0KLQljbGFzcyBTaGFyZWRPYmplY3QgewotCQlpbnQgcmVmZXJlbmNlQ291bnRGb3JFZGl0OwotCQlpbnQgcmVmZXJlbmNlQ291bnRGb3JSZWFkOwotCQl2b2xhdGlsZSBJU3RydWN0dXJlZE1vZGVsIHRoZVNoYXJlZE1vZGVsOwotCQlmaW5hbCBJTG9jayBMT0FEX0xPQ0sgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLQkJdm9sYXRpbGUgYm9vbGVhbiBpbml0aWFsaXppbmcgPSB0cnVlOwotCQl2b2xhdGlsZSBib29sZWFuIGRvV2FpdCA9IHRydWU7Ci0JCS8vIFRoZSBmaWVsZCAnaWQnIGlzIG9ubHkgbWVhbnQgZm9yIGRlYnVnCi0JCWZpbmFsIFN0cmluZyBpZDsKLQotCQlTaGFyZWRPYmplY3QoU3RyaW5nIGlkKSB7Ci0JCQl0aGlzLmlkPWlkOwotCQkJLy8gYmUgYXdhcmUsIHRoaXMgbG9jayB3aWxsIGxlYWsgYW5kIGNhdXNlIHRoZSBkZWFkbG9jayBkZXRlY3RvciB0byBiZSBob3JyaWJsZSBpZiB3ZSBuZXZlciByZWxlYXNlIGl0Ci0JCQlMT0FEX0xPQ0suYWNxdWlyZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFdhaXRzIHVudGlsIHRoaXMgc2hhcmVkIG9iamVjdCBoYXMgYmVlbiBhdHRlbXB0ZWQgdG8gYmUgbG9hZGVkLiBUaGUKLQkJICogbG9hZCBpcyAiYXR0ZW1wdGVkIiBiZWNhdXNlIG5vdCBhbGwgbG9hZHMgcmVzdWx0IGluIGEgbW9kZWwuIEhvd2V2ZXIsCi0JCSAqIHVwb24gbGVhdmluZyB0aGlzIG1ldGhvZCwgdGhlU2hhcmVNb2RlbCB2YXJpYWJsZSBpcyB1cC10by1kYXRlLgotCQkgKi8KLQkJcHVibGljIHZvaWQgd2FpdEZvckxvYWRBdHRlbXB0KCkgewotCQkJZmluYWwgYm9vbGVhbiBhbGxvd0ludGVycnVwdCA9IFByZWZVdGlsLkFMTE9XX0lOVEVSUlVQVF9XQUlUSU5HX1RIUkVBRDsKLQkJCWZpbmFsIGxvbmcgdGltZUxpbWl0ID0gKFByZWZVdGlsLldBSVRfREVMQVk9PTApID8gTG9uZy5NQVhfVkFMVUUgOiBQcmVmVXRpbC5ub3coKSArIFByZWZVdGlsLldBSVRfREVMQVk7Ci0JCQlmaW5hbCBKb2IgY3VycmVudCA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkuY3VycmVudEpvYigpOwotCQkJYm9vbGVhbiBpbnRlcnJ1cHRlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQl3aGlsZSAoaW5pdGlhbGl6aW5nKSB7Ci0JCQkJCWlmIChjdXJyZW50IT1udWxsKSB7Ci0JCQkJCQljdXJyZW50LnlpZWxkUnVsZShudWxsKTsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJbG9vcCgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlpZiAoYWxsb3dJbnRlcnJ1cHQpIHsKLQkJCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oIldhaXRpbmcgdGhyZWFkIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgZm9yIG1vZGVsIGlkOiAiK2lkICsgIiB0byBsb2FkIik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWludGVycnVwdGVkPXRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKFByZWZVdGlsLm5vdygpID49IHRpbWVMaW1pdAkpCi0JCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oIldhaXRpbmcgdGhyZWFkIHRpbWVvdXQgZXhjZWVkZWQgd2hpbGUgd2FpdGluZyBmb3IgbW9kZWwgaWQ6ICIraWQgKyAiIHRvIGxvYWQiKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoaW50ZXJydXB0ZWQpIHsKLQkJCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgbG9vcCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CQotCQkJaWYgKGluaXRpYWxpemluZykgewotCQkJCWlmIChMT0FEX0xPQ0suYWNxdWlyZShQcmVmVXRpbC5XQUlUX0lOVEVSVkFMX01TKSkgewotCQkJCQkvLyBpZiB3ZSBnb3QgdGhlIGxvY2ssIGJ1dCBpbml0aWFsaXppbmcgaXMgc3RpbGwgbm90IHRydWUgdGhlIGRlYWRsb2NrIGRldGVjdG9yIGdhdmUgdXMKLQkJCQkJLy8gdGhlIGxvY2sgYW5kIGNhdXNlZCByZWVudHJhbmN5IGludG8gdGhpcyBjcml0aWNhbCBzZWN0aW9uLiBUaGlzIGlzIGludmFsaWQgYW5kIHRoZSAKLQkJCQkJLy8gc2lnbiBvZiBhIGN5Y2xpY2FsIGxvYWQgYXR0ZW1wdC4gSW4gdGhpcyBjYXNlLCB3ZSB0aHJvdWdoIGFuIAotCQkJCQkvLyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBpbiBsZXcgb2YgZW50ZXJpbmcgYSBzcGluLWxvb3AuIAotCQkJCQlpZiAoaW5pdGlhbGl6aW5nKSB7Ci0JCQkJCQlMT0FEX0xPQ0sucmVsZWFzZSgpOwotCQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCJBYm9ydGVkIGN5Y2xpYyBsb2FkIGF0dGVtcHQgZm9yIG1vZGVsIHdpdGggaWQ6ICIrIGlkICk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMT0FEX0xPQ0sucmVsZWFzZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEZsYWdzIHRoaXMgbW9kZWwgYXMgbG9hZGVkLiBBbGwgd2FpdGluZyBtZXRob2RzIG9uCi0JCSAqIHtAbGluayAjd2FpdEZvckxvYWRBdHRlbXB0KCl9IHdpbGwgcHJvY2VlZCBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zLgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0TG9hZGVkKCkgewotCQkJaW5pdGlhbGl6aW5nID0gZmFsc2U7Ci0JCQlMT0FEX0xPQ0sucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBFeGNlcHRpb24gZGVidWdFeGNlcHRpb24gPSBudWxsOwotCi0JLyoqCi0JICogT3VyIHNpbmdsZXRvbiBpbnN0YW5jZQotCSAqLwotCXByaXZhdGUgc3RhdGljIE1vZGVsTWFuYWdlckltcGwgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFJFQURfQlVGRkVSX1NJWkUgPSA0MDk2OwotCi0JLyoqCi0JICogTm90IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLCB3aWxsIGJlIG1hZGUgcmVzdHJpY3RlZCBhY2Nlc3MuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIElNb2RlbE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0KLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IE1vZGVsTWFuYWdlckltcGwoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogT3VyIGNhY2hlIG9mIG1hbmFnZWQgb2JqZWN0cwotCSAqLwotCXByaXZhdGUgTWFwIGZNYW5hZ2VkT2JqZWN0czsKLQotCXByaXZhdGUgTW9kZWxIYW5kbGVyUmVnaXN0cnkgZk1vZGVsSGFuZGxlclJlZ2lzdHJ5OwotCXByaXZhdGUgZmluYWwgUmVhZEVkaXRUeXBlIFJFQUQgPSBuZXcgUmVhZEVkaXRUeXBlKCJyZWFkIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFJlYWRFZGl0VHlwZSBFRElUID0gbmV3IFJlYWRFZGl0VHlwZSgiZWRpdCIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBmaW5hbCBJTG9jayBTWU5DID0gSm9iLmdldEpvYk1hbmFnZXIoKS5uZXdMb2NrKCk7Ci0JLyoqCi0JICogSW50ZW50aW9uYWxseSBkZWZhdWx0IGFjY2VzcyBvbmx5LgotCSAqIAotCSAqLwotCU1vZGVsTWFuYWdlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZNYW5hZ2VkT2JqZWN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8vIFRvIHByZXZlbnQgZGVhZGxvY2tzOiAgYWx3YXlzIGFjcXVpcmUgbXVsdGlwbGUgbG9ja3MgaW4gdGhpcyBvcmRlcjogU1lOQywgc2hhcmVkT2JqZWN0LiAKLQkJLy8gRE8gTk9UIGFjcXVpcmUgYSBTWU5DIHdpdGhpbiBhIHNoYXJlZE9iamVjdCBsb2NrLCB1bmxlc3MgeW91IGFscmVhZHkgb3duIHRoZSBTWU5DIGxvY2sKLQkJLy8gVGlwOiBUcnkgdG8gaG9sZCB0aGUgc21hbGxlc3QgbnVtYmVyIG9mIGxvY2tzIHlvdSBjYW4KLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgX2NvbW1vbkNyZWF0ZU1vZGVsKElGaWxlIGZpbGUsIFN0cmluZyBpZCwgSU1vZGVsSGFuZGxlciBoYW5kbGVyLCBVUklSZXNvbHZlciByZXNvbHZlciwgUmVhZEVkaXRUeXBlIHJ3VHlwZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIElPRXhjZXB0aW9uLENvcmVFeGNlcHRpb24gewotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gbnVsbDsKLQkJCi0JCVNZTkMuYWNxdWlyZSgpOwotCQlzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQotCQl3aGlsZSh0cnVlKSB7Ci0JCQlpZiAoc2hhcmVkT2JqZWN0IT1udWxsKSB7Ci0JCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJfQotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQkvLyB3ZSBrbm93IHRoaXMgb2JqZWN0J3MgbW9kZWwgaGFzIHBhc3NlZCB0aGUgbG9hZCwgaG93ZXZlciwgd2UgZG9uJ3Qga25vdyAKLQkJCS8vIGl0J3MgcmVmZXJlbmNlIGNvdW50IHN0YXR1cy4gSXQgbWlnaHQgaGF2ZSBhbHJlYWR5IGJlZW4gZGlzcG9zZWQuIE9yIGl0IGNvdWxkIGhhdmUgCi0JCQkvLyBiZWVuIGRpc3Bvc2VkIGFuZCBhIGNvbmN1cnJlbnQgdGhyZWFkIGhhcyBhbHJlYWR5IGJlZ3VuIGxvYWRpbmcgaXQsIGluIHdoaWNoIGNhc2UKLQkJCS8vIHdlIHNob3VsZCB1c2UgdGhlIHNoYXJlZG9iamVjdCB0aGV5IGFyZSBsb2FkaW5nLiAKLQkJCS8vIE5PVEU6IFRoaXMgcGF0dGVybiBpcyBhcHBsaWVkIDMgdGltZXMgaW4gdGhpcyBjbGFzcywgYnV0IG9ubHkgZG9jJ2Qgb25jZS4gVGhlIGxvZ2ljIGlzIAotCQkJLy8gZXhhY3RseSB0aGUgc2FtZS4gCi0JCQlTaGFyZWRPYmplY3QgdGVzdE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkJaWYgKHRlc3RPYmplY3Q9PW51bGwpIHsKLQkJCQkvLyBudWxsIG1lYW5zIGl0J3MgYmVlbiBkaXNwb3NlZCwgd2UgbmVlZCB0byBkbyB0aGUgd29yayB0byByZWxvYWQgaXQuCi0JCQkJc2hhcmVkT2JqZWN0ID0gbmV3IFNoYXJlZE9iamVjdChpZCk7Ci0JCQkJZk1hbmFnZWRPYmplY3RzLnB1dChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlfZG9Db21tb25DcmVhdGVNb2RlbChmaWxlLCBpZCwgaGFuZGxlciwgcmVzb2x2ZXIsIHJ3VHlwZSwgZW5jb2RpbmdSdWxlLAotCQkJCQkJc2hhcmVkT2JqZWN0KTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoc2hhcmVkT2JqZWN0ID09IHRlc3RPYmplY3QpIHsKLQkJCQkvLyBpZiBub3RoaW5nIGhhcHBlbmVkLCBqdXN0IGluY3JlbWVudCB0aGUgY291bGQgYW5kIHJldHVybiB0aGUgc2hhcmVkIG1vZGVsCi0JCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCQlpZiAoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsIT1udWxsKSB7Ci0JCQkJCQlfaW5jckNvdW50KHNoYXJlZE9iamVjdCwgcndUeXBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gc2hhcmVkT2JqZWN0ICE9IHRlc3RPYmplY3Qgd2hpY2ggbWVhbnMgdGhlIG9iamVjdCB3ZSB3ZXJlIHdhaXRpbmcgb24gaGFzIGJlZW4gZGlzcG9zZWQKLQkJCQkvLyBhIHJlcGxhY2VtZW50IGhhcyBhbHJlYWR5IGJlZW4gcGxhY2VkIGluIHRoZSBtYW5hZ2VkT2JqZWN0cyB0YWJsZS4gVGhyb3VnaCBhd2F5IG91cgotCQkJCS8vIHN0YWxlIHNoYXJlZE9iamVjdCBhbmQgY29udGludWUgb24gd2l0aCB0aGUgb25lIHdlIGdvdCBmcm9tIHRoZSBxdWV1ZS4gTm90ZTogV2UgZG9uJ3Qga25vdyBpdHMKLQkJCQkvLyBzdGF0ZSwgc28gY29udGludWUgdGhlIHdhaXRGb3JMb2FkLWNoZWNrIGxvb3AuIAotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCXNoYXJlZE9iamVjdCA9IHRlc3RPYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHdlIGV4cGVjdCB0byBhbHdheXMgcmV0dXJuIHNvbWV0aGluZwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCWRlYnVnRXhjZXB0aW9uID0gbmV3IEV4Y2VwdGlvbigiaW5zdGFuY2Ugb25seSBmb3Igc3RhY2sgdHJhY2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiUHJvZ3JhbSBFcnJvcjogbm8gbW9kZWwgcmVjb3JkZWQgZm9yIGlkICIgKyBpZCwgZGVidWdFeGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCS8vIG5vdGU6IGNsaWVudHMgbXVzdCBjYWxsIHJlbGVhc2UgZm9yIGVhY2ggdGltZSB0aGV5IGNhbGwgZ2V0LgotCQlyZXR1cm4gc2hhcmVkT2JqZWN0PT1udWxsID8gbnVsbCA6IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2RlY3JDb3VudChTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0LCBSZWFkRWRpdFR5cGUgdHlwZSkgewotCQlpZiAodHlwZSA9PSBSRUFEKSB7Ci0JCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkLS07Ci0JCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZGlzY29ubmVjdChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRURJVCkgewotCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdC0tOwotCQkJRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRpc2Nvbm5lY3Qoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJfQotCQllbHNlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9kb0NvbW1vbkNyZWF0ZU1vZGVsKElGaWxlIGZpbGUsIFN0cmluZyBpZCwgSU1vZGVsSGFuZGxlciBoYW5kbGVyLAotCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIsIFJlYWRFZGl0VHlwZSByd1R5cGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUsCi0JCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyBYWFg6IERvZXMgbm90IGludGVncmF0ZSB3aXRoIEZpbGVCdWZmZXJzCi0JCWJvb2xlYW4gZG9SZW1vdmUgPSB0cnVlOwotCQl0cnkgewotCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBfY29tbW9uQ3JlYXRlTW9kZWwoaWQsIGhhbmRsZXIsIHJlc29sdmVyKTsKLQkJCQlJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQkJCWlucHV0U3RyZWFtID0gVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oZmlsZS5nZXRDb250ZW50cyh0cnVlKSk7Ci0JCQkJbG9hZGVyLmxvYWQoVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCBtb2RlbCwgZW5jb2RpbmdSdWxlKTsKLQkJCX0KLQkJCWNhdGNoIChSZXNvdXJjZUluVXNlIGUpIHsKLQkJCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSd2ZSBhbHJlYWR5IGZvdW5kCi0JCQkJaGFuZGxlUHJvZ3JhbUVycm9yKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoaW5wdXRTdHJlYW0hPW51bGwpIHsKLQkJCQkJdHJ5IHsgCi0JCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gYWRkIHRvIG91ciBjYWNoZQotCQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbD1tb2RlbDsKLQkJCQlfaW5pdENvdW50KHNoYXJlZE9iamVjdCwgcndUeXBlKTsKLQkJCQlkb1JlbW92ZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCX0KLQkJZmluYWxseXsKLQkJaWYgKGRvUmVtb3ZlKSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsJCi0JCQlmTWFuYWdlZE9iamVjdHMucmVtb3ZlKGlkKTsJCi0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJfQotCQlzaGFyZWRPYmplY3Quc2V0TG9hZGVkKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgX2NvbW1vbkNyZWF0ZU1vZGVsKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTdHJpbmcgaWQsIElNb2RlbEhhbmRsZXIgaGFuZGxlciwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIsIFJlYWRFZGl0VHlwZSByd1R5cGUsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvZ3JhbSBFcnJvcjogaWQgbWF5IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gbnVsbDsKLQkKLQkJU1lOQy5hY3F1aXJlKCk7Ci0JCXNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlTWU5DLnJlbGVhc2UoKTsKLQkJCi0JCXdoaWxlKHRydWUpIHsKLQkJCWlmIChzaGFyZWRPYmplY3QhPW51bGwpIHsKLQkJCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQl9Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCVNoYXJlZE9iamVjdCB0ZXN0T2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCQlpZiAodGVzdE9iamVjdD09bnVsbCkgewotCQkJCS8vIGl0IHdhcyByZW1vdmVkICxzbyBsZXRzIGNyZWF0ZSBpdAotCQkJCXNoYXJlZE9iamVjdCA9IG5ldyBTaGFyZWRPYmplY3QoaWQpOwotCQkJCWZNYW5hZ2VkT2JqZWN0cy5wdXQoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkJX2RvQ29tbW9uQ3JlYXRlTW9kZWwoaW5wdXRTdHJlYW0sIGlkLCBoYW5kbGVyLCByZXNvbHZlciwgcndUeXBlLAotCQkJCQkJZW5jb2RpbmcsIGxpbmVEZWxpbWl0ZXIsIHNoYXJlZE9iamVjdCk7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHNoYXJlZE9iamVjdCA9PSB0ZXN0T2JqZWN0KSB7Ci0JCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCQlpZiAoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsIT1udWxsKSB7Ci0JCQkJCQlfaW5jckNvdW50KHNoYXJlZE9iamVjdCwgcndUeXBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkJc2hhcmVkT2JqZWN0ID0gdGVzdE9iamVjdDsKLQkJCX0KLQkJfQotCQkKLQkJLy8gd2UgZXhwZWN0IHRvIGFsd2F5cyByZXR1cm4gc29tZXRoaW5nCi0JCUFzc2VydC5pc05vdE51bGwoc2hhcmVkT2JqZWN0LCAiUHJvZ3JhbSBFcnJvcjogbm8gbW9kZWwgcmVjb3JkZWQgZm9yIGlkICIgKyBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gbm90ZTogY2xpZW50cyBtdXN0IGNhbGwgcmVsZWFzZSBmb3IgZWFjaCB0aW1lIHRoZXkgY2FsbCBnZXQuCi0JCXJldHVybiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JCi0JfQotCi0JcHJpdmF0ZSB2b2lkIF9kb0NvbW1vbkNyZWF0ZU1vZGVsKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTdHJpbmcgaWQsIElNb2RlbEhhbmRsZXIgaGFuZGxlciwKLQkJCVVSSVJlc29sdmVyIHJlc29sdmVyLCBSZWFkRWRpdFR5cGUgcndUeXBlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyLAotCQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBkb1JlbW92ZSA9IHRydWU7Ci0JCXRyeSB7Ci0JCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IF9jb21tb25DcmVhdGVNb2RlbChpZCwgaGFuZGxlciwgcmVzb2x2ZXIpOwotCQkJCUlNb2RlbExvYWRlciBsb2FkZXIgPSBoYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCQkJaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIm1vZGVsIHdhcyByZXF1ZXN0ZWQgZm9yIGlkICIgKyBpZCArICIgd2l0aG91dCBhIGNvbnRlbnQgSW5wdXRTdHJlYW0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWxvYWRlci5sb2FkKGlkLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIG1vZGVsLCBlbmNvZGluZywgbGluZURlbGltaXRlcik7Ci0JCQl9Ci0JCQljYXRjaCAoUmVzb3VyY2VJblVzZSBlKSB7Ci0JCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2UndmUgYWxyZWFkeSBmb3VuZAotCQkJCWhhbmRsZVByb2dyYW1FcnJvcihlKTsKLQkJCX0KLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJLyoqCi0JCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NDIyOAotCQkJCSAqIAotCQkJCSAqIEVuc3VyZSB0aGF0IHRoZSBjb250ZW50IHR5cGUgaWRlbnRpZmllciBmaWVsZCBvZiB0aGUgbW9kZWwKLQkJCQkgKiBpcyBwcm9wZXJseSBzZXQuIFRoaXMgaXMgbm9ybWFsbHkgaGFuZGxlZCBieSB0aGUKLQkJCQkgKiBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIHdoZW4gd29ya2luZyB3aXRoIGZpbGVzIGFzIGl0IGtub3dzCi0JCQkJICogdGhlIGNvbnRlbnQgdHlwZSBpbiBhZHZhbmNlOyBoZXJlIGlzIHdoZXJlIHdlIGhhbmRsZSBpdCBmb3IKLQkJCQkgKiBzdHJlYW1zLgotCQkJCSAqLwotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSB7Ci0JCQkJCURvY3VtZW50UmVhZGVyIHJlYWRlciA9IG5ldyBEb2N1bWVudFJlYWRlcihtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihyZWFkZXIsIGlkLCBuZXcgUXVhbGlmaWVkTmFtZVswXSk7Ci0JCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCAmJiBkZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpICE9IG51bGwpIHsKLQkJCQkJCSgoQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIG1vZGVsKS5zZXRDb250ZW50VHlwZUlkZW50aWZpZXIoZGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCA9IG1vZGVsOwotCQkJCV9pbml0Q291bnQoc2hhcmVkT2JqZWN0LCByd1R5cGUpOwotCQkJCWRvUmVtb3ZlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJaWYgKGRvUmVtb3ZlKSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCS8vIHJlbW92ZSBpdCBpZiB3ZSBkaWRuJ3QgZ2V0IG9uZSBiYWNrCi0JCQlmTWFuYWdlZE9iamVjdHMucmVtb3ZlKGlkKTsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCXNoYXJlZE9iamVjdC5zZXRMb2FkZWQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBfY29tbW9uQ3JlYXRlTW9kZWwoU3RyaW5nIGlkLCBJTW9kZWxIYW5kbGVyIGhhbmRsZXIsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgUmVzb3VyY2VJblVzZSB7Ci0KLQkJSU1vZGVsTG9hZGVyIGxvYWRlciA9IGhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBsb2FkZXIuY3JlYXRlTW9kZWwoKTsKLQkJLy8gaW4gdGhlIHBhc3QsIGlkIHdhcyBudWxsIGZvciAidW5tYW5hZ2VkIiBjYXNlLCBzbyB3ZSB3b24ndAotCQkvLyB0cnkgYW5kIHNldCBpdAotCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJcmVzdWx0LnNldElkKGlkKTsKLQkJfQotCQlyZXN1bHQuc2V0TW9kZWxIYW5kbGVyKGhhbmRsZXIpOwotCQlyZXN1bHQuc2V0UmVzb2x2ZXIocmVzb2x2ZXIpOwotCQkvLyBzb21lIG9idmlvdXMgcmVkdW5hbmN5IGhlcmUgdGhhdCBtYXliZSBjb3VsZCBiZSBpbXByb3ZlZAotCQkvLyBpbiBmdXR1cmUsIGJ1dCBpcyBuZWNlc3NhcnkgZm9yIG5vdwotCQlyZXN1bHQuc2V0QmFzZUxvY2F0aW9uKGlkKTsKLQkJaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLQkJCXJlc29sdmVyLnNldEZpbGVCYXNlTG9jYXRpb24oaWQpOwotCQl9Ci0JCWFkZEZhY3RvcmllcyhyZXN1bHQsIGhhbmRsZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBfY29tbW9uR2V0TW9kZWwoSUZpbGUgaUZpbGUsIFJlYWRFZGl0VHlwZSByd1R5cGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCi0JCWlmIChpRmlsZSAhPSBudWxsICYmIGlGaWxlLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmcgaWQgPSBjYWxjdWxhdGVJZChpRmlsZSk7Ci0JCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKTsKLQkJCVVSSVJlc29sdmVyIHJlc29sdmVyID0gY2FsY3VsYXRlVVJJUmVzb2x2ZXIoaUZpbGUpOwotCQkJbW9kZWwgPSBfY29tbW9uQ3JlYXRlTW9kZWwoaUZpbGUsIGlkLCBoYW5kbGVyLCByZXNvbHZlciwgcndUeXBlLCBlbmNvZGluZ1J1bGUpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBfY29tbW9uR2V0TW9kZWwoSUZpbGUgaUZpbGUsIFJlYWRFZGl0VHlwZSByd1R5cGUsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBpZCA9IGNhbGN1bGF0ZUlkKGlGaWxlKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IF9jb21tb25HZXRNb2RlbChpRmlsZSwgaWQsIHJ3VHlwZSwgZW5jb2RpbmcsIGxpbmVEZWxpbWl0ZXIpOwotCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgX2NvbW1vbkdldE1vZGVsKElGaWxlIGZpbGUsIFN0cmluZyBpZCwgUmVhZEVkaXRUeXBlIHJ3VHlwZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9ncmFtIEVycm9yOiBpZCBtYXkgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSBudWxsOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQotCQkJd2hpbGUodHJ1ZSkgewotCQkJCWlmIChzaGFyZWRPYmplY3QhPW51bGwpIHsKLQkJCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJCX0KLQkJCQlTWU5DLmFjcXVpcmUoKTsKLQkJCQlTaGFyZWRPYmplY3QgdGVzdE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkJCWlmICh0ZXN0T2JqZWN0PT1udWxsKSB7Ci0JCQkJCS8vIGl0IHdhcyByZW1vdmVkICxzbyBsZXRzIGNyZWF0ZSBpdAotCQkJCQlzaGFyZWRPYmplY3QgPSBuZXcgU2hhcmVkT2JqZWN0KGlkKTsKLQkJCQkJZk1hbmFnZWRPYmplY3RzLnB1dChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCQkJCi0JCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCQlfZG9Db21tb25HZXRNb2RlbChmaWxlLCBpZCwgc2hhcmVkT2JqZWN0LHJ3VHlwZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSBpZiAoc2hhcmVkT2JqZWN0ID09IHRlc3RPYmplY3QpIHsKLQkJCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCQkJaWYgKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCE9bnVsbCkgewotCQkJCQkJCV9pbmNyQ291bnQoc2hhcmVkT2JqZWN0LCByd1R5cGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyB3ZSBnb3QgYSBkaWZmZXJlbnQgb2JqZWN0IHRoYW4gd2hhdCB3ZSB3ZXJlIGV4cGVjdGluZwotCQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQkJLy8gdHdvIHRocmVhZHMgd2VyZSBpbnRlcmVzdGVkIGluIG1vZGVscyBmb3IgdGhlIHNhbWUgaWQuIAotCQkJCQkvLyBUaGUgb3RoZXIgdGhyZWFkIG9uZSwgc28gbGV0cyBiYWNrIG9mZiBhbmQgdHJ5IGFnYWluLiAKLQkJCQkJc2hhcmVkT2JqZWN0ID0gdGVzdE9iamVjdDsgCi0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBpZiB3ZSBkb24ndCBrbm93IGhvdyB0byBjcmVhdGUgYSBtb2RlbAotCQkvLyBmb3IgdGhpcyB0eXBlIG9mIGZpbGUsIHJldHVybiBudWxsCi0JCi0JCS8vIG5vdGU6IGNsaWVudHMgbXVzdCBjYWxsIHJlbGVhc2UgZm9yIGVhY2ggdGltZSB0aGV5IGNhbGwKLQkJLy8gZ2V0LgotCQkJCi0JCXJldHVybiBzaGFyZWRPYmplY3Q9PW51bGwgPyBudWxsIDogc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBfZG9Db21tb25HZXRNb2RlbChJRmlsZSBmaWxlLCBTdHJpbmcgaWQsIFNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QsUmVhZEVkaXRUeXBlIHJ3VHlwZSkgewotCQlib29sZWFuIGRvUmVtb3ZlID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCQlzaGFyZWRPYmplY3QuZG9XYWl0PWZhbHNlOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKGZpbGUpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJc2hhcmVkT2JqZWN0LmRvV2FpdD10cnVlOwotCQkJCX0KLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw9bW9kZWw7Ci0JCQkJCV9pbml0Q291bnQoc2hhcmVkT2JqZWN0LCByd1R5cGUpOwotCQkJCQlkb1JlbW92ZSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChkb1JlbW92ZSkgewotCQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJCWZNYW5hZ2VkT2JqZWN0cy5yZW1vdmUoaWQpOwotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJfQotCQkJc2hhcmVkT2JqZWN0LnNldExvYWRlZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTaGFyZWRPYmplY3QgX2NvbW1vbk5ld01vZGVsKElGaWxlIGlGaWxlLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgYVNoYXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gRmlyc3QsIGNoZWNrIGlmIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIG9uIGZpbGUgc3lzdGVtLgotCQkvLyBpZiBpcyBkb2VzLCB0aGVuIHRocm93IFJlc291cmNlIGluIFVzZSBpZmYgZm9yY2U9PWZhbHNlCi0KLQkJaWYgKGlGaWxlLmV4aXN0cygpICYmICFmb3JjZSkgewotCQkJdGhyb3cgbmV3IFJlc291cmNlQWxyZWFkeUV4aXN0cygpOwotCQl9Ci0JCQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gbnVsbDsKLQkJU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQl0cnkgewotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQotCQkJIHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQotCQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsICYmICFmb3JjZSkgewotCQkJCS8vIGlmIGluIGNhY2hlIGFscmVhZHksIGFuZCBmb3JjZSBpcyBub3QgdHJ1ZSwgdGhlbiB0aGlzIGlzIGFuCi0JCQkJLy8gZXJyb3IKLQkJCQkvLyBpbiBjYWxsCi0JCQkJdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoKTsKLQkJCX0KLQkJCQotCQkJc2hhcmVkT2JqZWN0ID0gbmV3IFNoYXJlZE9iamVjdChpZCk7Ci0JCQlmTWFuYWdlZE9iamVjdHMucHV0KGlkLCBzaGFyZWRPYmplY3QpOwotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJfQotCQkKLQkJLy8gaWYgd2UgZ2V0IHRvIGhlcmUgd2l0aG91dCBhYm92ZSBleGNlcHRpb25zLCB0aGVuIGFsbCBpcyBvawotCQkvLyB0byBnZXQgbW9kZWwgbGlrZSBub3JtYWwsIGJ1dCBzZXQgJ25ldycgYXR0cmlidXRlICh3aGVyZSB0aGUKLQkJLy8gJ25ldycgYXR0cmlidXRlIG1lYW5zIHRoaXMgaXMgYSBtb2RlbCB3aXRob3V0IGEgY29ycmVzcG9uZGluZwotCQkvLyB1bmRlcmx5aW5nIHJlc291cmNlLgotCQlhU2hhcmVkTW9kZWwgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoaUZpbGUpOwotCQlhU2hhcmVkTW9kZWwuc2V0TmV3U3RhdGUodHJ1ZSk7Ci0JCQotCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw9YVNoYXJlZE1vZGVsOwotCQkvLyB3aGVuIHJlc291cmNlIGlzIHByb3ZpZGVkLCB3ZSBjYW4gc2V0Ci0JCS8vIHN5bmNocm9uaXphdGlvbiBzdGFtcCAuLi4gb3RoZXJ3aXNlIGNsaWVudCBzaG91bGQKLQkJLy8gTm90ZTogb25lIGNsaWVudCB3aGljaCBkb2VzIHRoaXMgaXMgRmlsZU1vZGVsUHJvdmlkZXIuCi0JCWFTaGFyZWRNb2RlbC5yZXNldFN5bmNocm9uaXphdGlvblN0YW1wKGlGaWxlKTsKLQkJcmV0dXJuIHNoYXJlZE9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBfZ2V0TW9kZWxGb3IoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgUmVhZEVkaXRUeXBlIGFjY2Vzc1R5cGUpIHsKLQotCQlTdHJpbmcgaWQgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2FsY3VsYXRlSWQoZG9jdW1lbnQpOwotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJaWYgKFJFQUQgPT0gYWNjZXNzVHlwZSkKLQkJCQlyZXR1cm4gZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKEVESVQgPT0gYWNjZXNzVHlwZSkKLQkJCQlyZXR1cm4gZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgInVua25vd24gSVN0cnVjdHVyZWREb2N1bWVudCAiICsgZG9jdW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSBudWxsOwotCQlTWU5DLmFjcXVpcmUoKTsKLQkJc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCVNZTkMucmVsZWFzZSgpOwotCQkKLQkJd2hpbGUodHJ1ZSkgewotCQkJaWYgKHNoYXJlZE9iamVjdCE9bnVsbCkgewotCQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCX0KLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJU2hhcmVkT2JqZWN0IHRlc3RPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJCWlmICh0ZXN0T2JqZWN0PT1udWxsKSB7Ci0JCQkJc2hhcmVkT2JqZWN0ID0gbmV3IFNoYXJlZE9iamVjdChpZCk7Ci0JCQkJZk1hbmFnZWRPYmplY3RzLnB1dChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbChkb2N1bWVudCk7Ci0JCQkJCV9pbml0Q291bnQoc2hhcmVkT2JqZWN0LCBhY2Nlc3NUeXBlKTsKLQkJCQkJc2hhcmVkT2JqZWN0LnNldExvYWRlZCgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoc2hhcmVkT2JqZWN0ID09IHRlc3RPYmplY3QpIHsKLQkJCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJCUFzc2VydC5pc1RydWUoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCArIHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQgPiAwLCAicmVmZXJlbmNlIGNvdW50IHdhcyBsZXNzIHRoYW4gemVybyIpOwotCQkJCQlpZiAoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsIT1udWxsKSB7Ci0JCQkJCQlfaW5jckNvdW50KHNoYXJlZE9iamVjdCwgYWNjZXNzVHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCXNoYXJlZE9iamVjdCA9IHRlc3RPYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzaGFyZWRPYmplY3Q9PW51bGwgPyBudWxsIDogc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBfaW5jckNvdW50KFNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QsIFJlYWRFZGl0VHlwZSB0eXBlKSB7Ci0JCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCWlmICh0eXBlID09IFJFQUQpIHsKLQkJCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkKys7Ci0JCQkJRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNvbm5lY3Qoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gRURJVCkgewotCQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQrKzsKLQkJCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY29ubmVjdChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJfQotCQkJZWxzZQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBfaW5pdENvdW50KFNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QsIFJlYWRFZGl0VHlwZSB0eXBlKSB7Ci0JCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCWlmICh0eXBlID09IFJFQUQpIHsKLQkJCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY29ubmVjdChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQgPSAxOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBFRElUKSB7Ci0JCQkJRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNvbm5lY3Qoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0ID0gMTsKLQkJCX0KLQkJCWVsc2UKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIElNb2RlbEhhbmRsZXIgaGFuZGxlcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKG1vZGVsLCAibW9kZWwgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwocmVnaXN0cnksICJtb2RlbCdzIEZhY3RvcnkgUmVnaXN0cnkgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBmYWN0b3J5TGlzdCA9IGhhbmRsZXIuZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCQlhZGRGYWN0b3JpZXMobW9kZWwsIGZhY3RvcnlMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIExpc3QgZmFjdG9yeUxpc3QpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChtb2RlbCwgIm1vZGVsIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHJlZ2lzdHJ5LCAibW9kZWwncyBGYWN0b3J5IFJlZ2lzdHJ5IGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIE5vdGU6IHdlIGFkZCBhbGwgb2YgdGhlbSBmcm9tIGhhbmRsZXIsIGV2ZW4gaWYKLQkJLy8gYWxyZWFkeSBleGlzdHMuIE1heSBuZWVkIHRvIHJlY29uc2lkZXIgdGhpcy4KLQkJaWYgKGZhY3RvcnlMaXN0ICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmFjdG9yeUxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCXJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSBpZCBwcm92aWRlcyBhIGNvbW1vbiB3YXkgdG8gZGV0ZXJtaW5lIHRoZSBpZCBmcm9tIHRoZSBpbnB1dAotCSAqIC4uLiBuZWVkZWQgdG8gZ2V0IGFuZCBzYXZlIHRoZSBtb2RlbC4gSXQgaXMgYSBzaW1wbGUgY2xhc3MgdXRpbGl0eSwgYnV0Ci0JICogaXMgYW4gaW5zdGFuY2UgbWV0aG9kIHNvIGNhbiBiZSBhY2Nlc3NlZCB2aWEgaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlSWQoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNhbGN1bGF0ZUlkKGZpbGUpOwotCX0KLQotCXByaXZhdGUgSU1vZGVsSGFuZGxlciBjYWxjdWxhdGVUeXBlKElGaWxlIGlGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIElNb2RlbE1hbmFnZXIgbW0gPSAoKE1vZGVsTWFuYWdlclBsdWdpbikKLQkJLy8gUGxhdGZvcm0uZ2V0UGx1Z2luKE1vZGVsTWFuYWdlclBsdWdpbi5JRCkpLmdldE1vZGVsTWFuYWdlcigpOwotCQlNb2RlbEhhbmRsZXJSZWdpc3RyeSBjciA9IGdldE1vZGVsSGFuZGxlclJlZ2lzdHJ5KCk7Ci0JCUlNb2RlbEhhbmRsZXIgY2QgPSBjci5nZXRIYW5kbGVyRm9yKGlGaWxlKTsKLQkJcmV0dXJuIGNkOwotCX0KLQotCXByaXZhdGUgSU1vZGVsSGFuZGxlciBjYWxjdWxhdGVUeXBlKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU1vZGVsSGFuZGxlclJlZ2lzdHJ5IGNyID0gZ2V0TW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQkJSU1vZGVsSGFuZGxlciBjZCA9IGNyLmdldEhhbmRsZXJGb3IoZmlsZW5hbWUsIGlucHV0U3RyZWFtKTsKLQkJcmV0dXJuIGNkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgVVJJUmVzb2x2ZXIgY2FsY3VsYXRlVVJJUmVzb2x2ZXIoSUZpbGUgZmlsZSkgewotCQkvLyBOb3RlOiBzZWUgY29tbWVudCBpbiBwbHVnaW4ueG1sIGZvciBwb3RlbnRpYWxseQotCQkvLyBicmVha2luZyBjaGFuZ2UgaW4gYmVoYXZpb3IuCi0KLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQlVUklSZXNvbHZlciByZXNvbHZlciA9IChVUklSZXNvbHZlcikgcHJvamVjdC5nZXRBZGFwdGVyKFVSSVJlc29sdmVyLmNsYXNzKTsKLQkJaWYgKHJlc29sdmVyID09IG51bGwpCi0JCQlyZXNvbHZlciA9IG5ldyBQcm9qZWN0UmVzb2x2ZXIocHJvamVjdCk7Ci0JCU9iamVjdCBsb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpCi0JCQlsb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb25VUkkoKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpCi0JCQlyZXNvbHZlci5zZXRGaWxlQmFzZUxvY2F0aW9uKGxvY2F0aW9uLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gcmVzb2x2ZXI7Ci0JfQotCi0JLyoKLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBhcHBlYXJzIGluIGJvdGggTW9kZWxNYW5hZ2VySW1wbCBhbmQgSlNFZGl0b3IgKHdpdGgKLQkgKiBqdXN0IGEgbWlub3IgZGlmZmVyZW5jZSkuIFRoZXkgc2hvdWxkIGJlIGtlcHQgdGhlIHNhbWUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSBoYW5kbGVkIGJ5IHBsYXRmb3JtCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbnZlcnRMaW5lRGVsaW1pdGVycyhJRG9jdW1lbnQgZG9jdW1lbnQsIElGaWxlIGlGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE5vdGU6IGNhbGN1bGF0ZVR5cGUoaUZpbGUpIHJldHVybnMgYSBkZWZhdWx0IHhtbCBtb2RlbCBoYW5kbGVyIGlmCi0JCS8vIGNvbnRlbnQgdHlwZSBpcyBudWxsLgotCQlTdHJpbmcgY29udGVudFR5cGVJZCA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpLmdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKCk7Ci0JCVN0cmluZyBlbmRPZkxpbmVDb2RlID0gQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXkuZ2V0UHJlZmVyZW5jZXNTdHJpbmcoY29udGVudFR5cGVJZCwgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSk7Ci0JCS8vIGVuZE9mTGluZUNvZGUgPT0gbnVsbCBtZWFucyB0aGUgY29udGVudCB0eXBlIGRvZXMgbm90IHN1cHBvcnQgdGhpcwotCQkvLyBmdW5jdGlvbiAoZS5nLiBEVEQpCi0JCS8vIGVuZE9mTGluZUNvZGUgPT0gIiIgbWVhbnMgbm8gdHJhbnNsYXRpb24KLQkJaWYgKGVuZE9mTGluZUNvZGUgIT0gbnVsbCAmJiBlbmRPZkxpbmVDb2RlLmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXJUb1VzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGVuZE9mTGluZUNvZGUuZXF1YWxzKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSKSkKLQkJCQlsaW5lRGVsaW1pdGVyVG9Vc2UgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfQ1I7Ci0JCQllbHNlIGlmIChlbmRPZkxpbmVDb2RlLmVxdWFscyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5MRikpCi0JCQkJbGluZURlbGltaXRlclRvVXNlID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0xGOwotCQkJZWxzZSBpZiAoZW5kT2ZMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1JMRikpCi0JCQkJbGluZURlbGltaXRlclRvVXNlID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0NSTEY7Ci0KLQkJCVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJaW50IGxpbmVDb3VudCA9IGRvY3VtZW50LmdldE51bWJlck9mTGluZXMoKTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykgewotCQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGkpOwotCQkJCQlpbnQgbGluZVN0YXJ0T2Zmc2V0ID0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQkJCWludCBsaW5lTGVuZ3RoID0gbGluZUluZm8uZ2V0TGVuZ3RoKCk7Ci0JCQkJCWludCBsaW5lRW5kT2Zmc2V0ID0gbGluZVN0YXJ0T2Zmc2V0ICsgbGluZUxlbmd0aDsKLQotCQkJCQlpZiAoaSA8IGxpbmVDb3VudCAtIDEpIHsKLQkJCQkJCVN0cmluZyBjdXJyZW50TGluZURlbGltaXRlciA9IGRvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoaSk7Ci0JCQkJCQlpZiAoY3VycmVudExpbmVEZWxpbWl0ZXIgIT0gbnVsbCAmJiBjdXJyZW50TGluZURlbGltaXRlci5jb21wYXJlVG8obGluZURlbGltaXRlclRvVXNlKSAhPSAwKQotCQkJCQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IFJlcGxhY2VFZGl0KGxpbmVFbmRPZmZzZXQsIGN1cnJlbnRMaW5lRGVsaW1pdGVyLmxlbmd0aCgpLCBsaW5lRGVsaW1pdGVyVG9Vc2UpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChtdWx0aVRleHRFZGl0LmdldENoaWxkcmVuU2l6ZSgpID4gMCkKLQkJCQkJbXVsdGlUZXh0RWRpdC5hcHBseShkb2N1bWVudCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJLy8ganVzdCBhZGRpbmcgZ2VuZXJpYyBydW50aW1lIGhlcmUsIHVudGlsIHdob2xlIG1ldGhvZAotCQkJCS8vIGRlbGV0ZWQuCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0aGlzIHVzZWQgdG8gYmUgaW4gbG9hZGVyLCBidXQgaGFzIGJlZW4gbW92ZWQgaGVyZQotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBjb3B5KElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFN0cmluZyBuZXdJZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UgewotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCA9IG1vZGVsOwotCQlJTW9kZWxIYW5kbGVyIG1vZGVsSGFuZGxlciA9IG9sZE1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQlJTW9kZWxMb2FkZXIgbG9hZGVyID0gbW9kZWxIYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCS8vIG5ld01vZGVsID0gbG9hZGVyLm5ld01vZGVsKCk7Ci0JCW5ld01vZGVsID0gbG9hZGVyLmNyZWF0ZU1vZGVsKG9sZE1vZGVsKTsKLQkJLy8gbmV3SWQsIG9sZE1vZGVsLmdldFJlc29sdmVyKCksIG9sZE1vZGVsLmdldE1vZGVsTWFuYWdlcigpKTsKLQkJbmV3TW9kZWwuc2V0TW9kZWxIYW5kbGVyKG1vZGVsSGFuZGxlcik7Ci0JCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkU3RydWN0dXJlZERvY3VtZW50ID0KLQkJLy8gb2xkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50ID0KLQkJLy8gb2xkU3RydWN0dXJlZERvY3VtZW50Lm5ld0luc3RhbmNlKCk7Ci0JCS8vIG5ld01vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQluZXdNb2RlbC5zZXRSZXNvbHZlcihvbGRNb2RlbC5nZXRSZXNvbHZlcigpKTsKLQkJbmV3TW9kZWwuc2V0TW9kZWxNYW5hZ2VyKG9sZE1vZGVsLmdldE1vZGVsTWFuYWdlcigpKTsKLQkJLy8gZHVwbGljYXRlRmFjdG9yeVJlZ2lzdHJ5KG5ld01vZGVsLCBvbGRNb2RlbCk7Ci0JCW5ld01vZGVsLnNldElkKG5ld0lkKTsKLQkJLy8gc2V0IHRleHQgb2YgbmV3IG9uZSBhZnRlciBhbGwgaW5pdGlhbGl6YXRpb24gaXMgZG9uZQotCQlTdHJpbmcgY29udGVudHMgPSBvbGRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRUZXh0KCk7Ci0JCW5ld01vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnNldFRleHQodGhpcywgY29udGVudHMpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY29weU1vZGVsRm9yRWRpdChTdHJpbmcgb2xkSWQsIFN0cmluZyBuZXdJZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UgewotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbnVsbDsKLQkJLy8gZ2V0IHRoZSBleGlzdGluZyBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBpZAotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbChvbGRJZCk7Ci0JCS8vIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGlnbm9yZSByZXF1ZXN0ICh0aG91Z2ggdGhpcyB3b3VsZCBub3JtYWxseQotCQkvLyBiZSBhIHByb2dyYW1taW5nIGVycm9yLgotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJLy8gbm93IGJlIHN1cmUgbmV3TW9kZWwgZG9lcyBub3QgZXhpc3QKLQkJCXNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQobmV3SWQpOwotCQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoKTsKLQkJCX0KLQkJCXNoYXJlZE9iamVjdCA9IG5ldyBTaGFyZWRPYmplY3QobmV3SWQpOwotCQkJZk1hbmFnZWRPYmplY3RzLnB1dChuZXdJZCxzaGFyZWRPYmplY3QpOwotCQl9IGZpbmFsbHkgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCX0KLQkJLy8gZ2V0IGxvYWRlciBiYXNlZCBvbiBleGlzdGluZyB0eXBlIChub3RlIHRoZSB0eXBlIGFzc3VtcHRpb24pCi0JCS8vIE9iamVjdCB0eXBlID0gKChJU3RydWN0dXJlZE1vZGVsKSBtb2RlbCkuZ2V0VHlwZSgpOwotCQkvLyBJTW9kZWxIYW5kbGVyIHR5cGUgPSBtb2RlbC5nZXRNb2RlbEhhbmRsZXIoKTsKLQkJLy8gSU1vZGVsTG9hZGVyIGxvYWRlciA9IChJTW9kZWxMb2FkZXIpIGdldE1vZGVsTG9hZGVycygpLmdldCh0eXBlKTsKLQkJLy8gSU1vZGVsTG9hZGVyIGxvYWRlciA9IChJTW9kZWxMb2FkZXIpIGdldE1vZGVsTG9hZGVycygpLmdldCh0eXBlKTsKLQkJLy8gYXNrIHRoZSBsb2FkZXIgdG8gY29weQotCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQlzaGFyZWRPYmplY3QuZG9XYWl0ID0gZmFsc2U7Ci0JCQluZXdNb2RlbCA9IGNvcHkobW9kZWwsIG5ld0lkKTsKLQkJCXNoYXJlZE9iamVjdC5kb1dhaXQgPSB0cnVlOwotCQl9Ci0JCWlmIChuZXdNb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBhZGQgdG8gb3VyIGNhY2hlCi0JCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsPW5ld01vZGVsOwotCQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQgPSAxOwotCQkJCXRyYWNlKCJjb3BpZWQgbW9kZWwiLCBuZXdJZCwgc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJZk1hbmFnZWRPYmplY3RzLnJlbW92ZShuZXdJZCk7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJfQotCQlzaGFyZWRPYmplY3Quc2V0TG9hZGVkKCk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBTaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgdGhlIG5ldyBpbnN0YW5jZSBoYXMgbm8gY29udGVudC4gTm90ZTogdGhpcwotCSAqIHByb2R1Y2VzIGFuIHVubWFuYWdlZCBtb2RlbCwgZm9yIHRlbXBvcmFyeSB1c2UuIElmIGEgdHJ1ZSBzaGFyZWQgbW9kZWwKLQkgKiBpcyBkZXNpcmVkLCB1c2UgImNvcHkiLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU5ld0luc3RhbmNlKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IG9sZE1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQlJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbG9hZGVyLmNyZWF0ZU1vZGVsKG9sZE1vZGVsKTsKLQkJbmV3TW9kZWwuc2V0TW9kZWxIYW5kbGVyKGhhbmRsZXIpOwotCQlpZiAobmV3TW9kZWwgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgewotCQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgbmV3TW9kZWwpLnNldENvbnRlbnRUeXBlSWRlbnRpZmllcihvbGRNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSk7Ci0JCX0KLQkJVVJJUmVzb2x2ZXIgb2xkUmVzb2x2ZXIgPSBvbGRNb2RlbC5nZXRSZXNvbHZlcigpOwotCQluZXdNb2RlbC5zZXRSZXNvbHZlcihvbGRSZXNvbHZlcik7Ci0JCXRyeSB7Ci0JCQluZXdNb2RlbC5zZXRJZChEVVBMSUNBVEVEX01PREVMKTsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB0aGlzIGlzIGFuIHVubWFuYWdlZCBtb2RlbAotCQl9Ci0JCS8vIGJhc2UgbG9jYXRpb24gc2hvdWxkIGJlIG51bGwsIGJ1dCB3ZSdsbCBzZXQgdG8KLQkJLy8gbnVsbCB0byBiZSBzdXJlLgotCQluZXdNb2RlbC5zZXRCYXNlTG9jYXRpb24obnVsbCk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYSBwcm9wZXIKLQkgKiBwYXJzZXIgYXNzaWduZWQuIE5vdGU6IGl0cyBhc3N1bWUgdGhhdCBJRmlsZSBkb2VzIG5vdCBhY3R1YWxseSBleGlzdCBhcwotCSAqIGEgcmVzb3VyY2UgeWV0LiBJZiBpdCBkb2VzLCBSZXNvdXJjZUFscmVhZHlFeGlzdHMgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiB0aGUgcmVzb3VyY2UgZG9lcyBhbHJlYWR5IGV4aXN0LCB0aGVuIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvciBpcwotCSAqIHRoZSByaWdodCBBUEkgdG8gdXNlLgotCSAqIAotCSAqIEB0aHJvd3MgUmVzb3VyY2VJblVzZQotCSAqIAotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlGaWxlLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgUmVzb3VyY2VBbHJlYWR5RXhpc3RzKGlGaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLQkJfQotCQkvLyBXaWxsIHJlY29uc2lkZXIgaW4gZnV0dXJlIHZlcnNpb24KLQkJLy8gU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQkvLyBpZiAoaXNSZXNvdXJjZUluVXNlKGlkKSkgewotCQkvLyB0aHJvdyBuZXcgUmVzb3VyY2VJblVzZShpRmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCS8vIH0KLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG51bGw7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQlsb2FkZXIgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCk7Ci0JCS8vIGZvciB0aGlzIEFQSSwgImNyZWF0ZU5ldyIgd2UgYXNzdW1lIHRoZSBJRmlsZSBkb2VzIG5vdCBleGlzdCB5ZXQKLQkJLy8gYXMgY2hlY2tlZCBhYm92ZSwgc28ganVzdCBjcmVhdGUgZW1wdHkgZG9jdW1lbnQuCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYSBwcm9wZXIKLQkgKiBwYXJzZXIgYXNzaWduZWQuIE5vdGU6IGNsaWVudHMgc2hvdWxkIHZlcmlmeSBJRmlsZSBleGlzdHMgYmVmb3JlIHVzaW5nCi0JICogdGhpcyBtZXRob2QuIElmIHRoaXMgSUZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZW4KLQkgKiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgdGhlIGNvcnJlY3QgQVBJIHRvIHVzZS4KLQkgKiAKLQkgKiBAdGhyb3dzIFJlc291cmNlSW5Vc2UKLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoIWlGaWxlLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGlGaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLQkJfQotCQkvLyBXaWxsIHJlY29uc2lkZXIgaW4gZnV0dXJlIHZlcnNpb24KLQkJLy8gU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQkvLyBpZiAoaXNSZXNvdXJjZUluVXNlKGlkKSkgewotCQkvLyB0aHJvdyBuZXcgUmVzb3VyY2VJblVzZShpRmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCS8vIH0KLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG51bGw7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQlsb2FkZXIgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoaUZpbGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbnZlaWVuY2UgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhCi0JICogcHJvcGVyIHBhcnNlciBhc3NpZ25lZC4gSXQgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGFuIGVtcHR5Ci0JICogc3RydWN0dXJlZERvY3VtZW50IGlzIG5lZWRlZC4gT3RoZXJ3aXNlLCB1c2UgSUZpbGUgZm9ybS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIFRPRE86IHRvIGJlIHJlbW92ZWQgYnkgQzQgZG8gd2UgcmVhbGx5IG5lZWQgdGhpcz8gSQotCSAqICAgICAgICAgICAgIHJlY29tbWVuZCB0byAtIHVzZSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoZmlsZW5hbWUsCi0JICogICAgICAgICAgICAgbnVsbCwgbnVsbCkgLSB0aGUgZmlsZW5hbWUgZG9lcyBub3QgbmVlZCB0byByZXByZXNlbnQgYQotCSAqICAgICAgICAgICAgIHJlYWwgLSBmaWxlLCBidXQgY2FuIHRha2UgZm9yIGZvcm0gb2YgZHVtbXkuanNwLCB0ZXN0LnhtbCwKLQkgKiAgICAgICAgICAgICBldGMuIC0gVGhhdCB3YXkgd2UgZG9uJ3QgaGFyZCBjb2RlIHRoZSBoYW5kbGVyLCBidXQgc3BlY2lmeQotCSAqICAgICAgICAgICAgIHdlIC0gd2FudCB0aGUgaGFuZGxlciB0aGF0ICJnb2VzIHdpdGgiIGEgY2VydGFpbiB0eXBlIG9mIC0KLQkgKiAgICAgICAgICAgICBmaWxlLgotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG51bGw7Ci0JCU1vZGVsSGFuZGxlclJlZ2lzdHJ5IGNyID0gZ2V0TW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY3IuZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlSWQoY29udGVudFR5cGVJZCk7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIlByb2dyYW0gZXJyb3I6IG5vIG1vZGVsIGhhbmRsZXIgZm91bmQgZm9yICIgKyBjb250ZW50VHlwZUlkKTsgLy8kTk9OLU5MUy0xJAotCQlsb2FkZXIgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYQotCSAqIHByb3BlciBwYXJzZXIgYXNzaWduZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLS0gLSBUT0RPOiB0byBiZSByZW1vdmVkIGJ5IEM0IEkgbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8KLQkgKiAgICAgICAgICAgICBkaXNjb3VhZ2UgdXNlIG9mIHRoaXMgbWV0aG9kLiBJdCBkb2VzIG5vdCByZWFsbHkgd29yayBmb3IKLQkgKiAgICAgICAgICAgICBKU1AgZnJhZ21lbnRzLCBzaW5jZSBKU1AgRnJhZ21lbnRzIG5lZWQgYW4gSUZpbGUgdG8KLQkgKiAgICAgICAgICAgICBjb3JyZWN0bHkgbG9vayB1cCB0aGUgY29udGVudCBzZXR0aW5ncy4gVXNlIElGaWxlIGZvcm0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlzdHJlYW0gPSBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0JCWlmIChpc3RyZWFtICE9IG51bGwpIHsKLQkJCWlzdHJlYW0ucmVzZXQoKTsKLQkJfQotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGZpbGVuYW1lLCBpc3RyZWFtKTsKLQkJbG9hZGVyID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoZmlsZW5hbWUsIGlzdHJlYW0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lhbCBjYXNlIG1ldGhvZC4gVGhpcyBtZXRob2Qgd2FzIGNyZWF0ZWQgZm9yIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUKLQkgKiB0aGVyZSBpcyBhbiBlbmNvZGluZyBmb3IgaW5wdXQgc3RyZWFtIHRoYXQgc2hvdWxkIG92ZXJyaWRlIGFsbCB0aGUKLQkgKiBub3JtYWwgcnVsZXMgZm9yIGVuY29kaW5nLiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgYW4gZW5jb2RpbmcKLQkgKiAoY2hhcnNldCkgc3BlY2lmaWVkIGluIEhUVFAgcmVzcG9uc2UgaGVhZGVyLCB0aGVuIHRoYXQgZW5jb2RpbmcgaXMgdXNlZAotCSAqIHRvIHRyYW5zbGF0ZSB0aGUgaW5wdXQgc3RyZWFtIHRvIGEgc3RyaW5nLCBidXQgdGhlbiB0aGUgbm9ybWFsIGVuY29kaW5nCi0JICogcnVsZXMgYXJlIGlnbm9yZWQsIHNvIHRoYXQgdGhlIHN0cmluZyBpcyBub3QgdHJhbnNsYXRlZCB0d2ljZSAoZm9yCi0JICogZXhhbXBsZSwgaWYgaXRzIGFuIEhUTUwgImZpbGUiLCB0aGVuIGV2ZW4gaWYgaXQgY29udGFpbnMgYSBjaGFyc2V0IGluCi0JICogbWV0YSB0YWcsIGl0cyBpZ25vcmVkIHNpbmNlIGl0cyBhc3N1bWVkIGl0cyBhbGwgY29ycmVjdGx5IGRlY29kZWQgYnkKLQkgKiB0aGUgSFRUUCBjaGFyc2V0LgotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIGVuY29kaW5nKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoZmlsZW5hbWUsIGNvbnRlbnQsIHJlc29sdmVyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHdoZW4gdGhlIHJlc291cmNlIGRvZXMgbm90Ci0JICogcmVhbGx5IGV4aXN0IChlLmcuIHdoZW4gY29udGVudCBpcyBiZWluZyBjcmVhdGVkLCBidXQgaGFzbid0IGJlZW4KLQkgKiB3cml0dGVuIHRvIGRpc2sgeWV0KS4gTm90ZSB0aGF0IHNpbmNlIHRoZSBjb250ZW50IGlzIGJlaW5nIHByb3ZpZGVkIGFzCi0JICogYSBTdHJpbmcsIGl0IGlzIGFzc3VtZWQgdG8gYWxyZWFkeSBiZSBkZWNvZGVkIGNvcnJlY3RseSBzbyBubwotCSAqIHRyYW5zZm9ybWF0aW9uIGlzIGRvbmUuCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBjb250ZW50LCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETzogYXZvaWQgYWxsIHRoZXNlIFN0cmluZyBpbnN0YW5jZXMKLQkJU3RyaW5nQnVmZmVyIGNvbnRlbnRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGNvbnRlbnQpOwotCQlJRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gbnVsbDsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShmaWxlbmFtZSwgbnVsbCk7Ci0JCWxvYWRlciA9IGhhbmRsZXIuZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlTdHJpbmdCdWZmZXIgY29udmVydGVkQ29udGVudCA9IGxvYWRlci5oYW5kbGVMaW5lRGVsaW1pdGVyKGNvbnRlbnRCdWZmZXIsIHJlc3VsdCk7Ci0JCXJlc3VsdC5zZXRFbmNvZGluZ01lbWVudG8obmV3IE51bGxNZW1lbnRvKCkpOwotCQlyZXN1bHQuc2V0VGV4dCh0aGlzLCBjb252ZXJ0ZWRDb250ZW50LnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpRmlsZQotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZVVuTWFuYWdlZEVtcHR5TW9kZWxGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKTsKLQkJU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQlVUklSZXNvbHZlciByZXNvbHZlciA9IGNhbGN1bGF0ZVVSSVJlc29sdmVyKGlGaWxlKTsKLQotCQl0cnkgewotCQkJcmVzdWx0ID0gX2NvbW1vbkNyZWF0ZU1vZGVsKGlkLCBoYW5kbGVyLCByZXNvbHZlcik7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2UncmUgbm90IHNoYXJpbmcKLQkJCS8vIChldmVuIGlmIGl0IHJlYWxseSBpcyBpbiB1c2UgLi4uIHdlIGRvbid0IGNhcmUpCi0JCQkvLyB0aGlzIG1heSBuZWVkIHRvIGJlIHJlLWV4YW1pbmVkLgotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTE1BTkFHRVIpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIk1vZGVsTWFuZ2VySW1wbDo6Y3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yLiBNb2RlbCB1bmV4cGVjdGVkbHkgaW4gdXNlLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVpZW5jZSBtZXRob2QuIEl0IGRlcGVuZHMgb24gdGhlIGxvYWRlcnMgbmV3TW9kZWwgbWV0aG9kIHRvIHJldHVybgotCSAqIGFuIGFwcHJvcHJpYXRlIFN0cnVjdXR1cmVkTW9kZWwgYXBwcm9wcmlhdGVseSBpbml0aWFsaXplZC4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gY3JlYXRlVW5NYW5hZ2VkRW1wdHlNb2RlbEZvcihpRmlsZSk7Ci0KLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IHJlc3VsdC5nZXRNb2RlbEhhbmRsZXIoKS5nZXREb2N1bWVudExvYWRlcigpOwotCQlJRW5jb2RlZERvY3VtZW50IGRvY3VtZW50ID0gbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChpRmlsZSk7Ci0KLQkJcmVzdWx0LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnNldFRleHQodGhpcywgZG9jdW1lbnQuZ2V0KCkpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVpZW5jZSBtZXRob2QuIEl0IGRlcGVuZHMgb24gdGhlIGxvYWRlcnMgbmV3TW9kZWwgbWV0aG9kIHRvIHJldHVybgotCSAqIGFuIGFwcHJvcHJpYXRlIFN0cnVjdXR1cmVkTW9kZWwgYXBwcm9wcmlhdGVseSBpbml0aWFsaXplZC4KLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCXJldHVybiBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoY29udGVudFR5cGVJZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVpZW5jZSBtZXRob2QuIEl0IGRlcGVuZHMgb24gdGhlIGxvYWRlcnMgbmV3TW9kZWwgbWV0aG9kIHRvIHJldHVybgotCSAqIGFuIGFwcHJvcHJpYXRlIFN0cnVjdXR1cmVkTW9kZWwgYXBwcm9wcmlhdGVseSBpbml0aWFsaXplZC4KLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKFN0cmluZyBjb250ZW50VHlwZUlkLCBVUklSZXNvbHZlciByZXNvbHZlcikgewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCU1vZGVsSGFuZGxlclJlZ2lzdHJ5IGNyID0gZ2V0TW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY3IuZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlSWQoY29udGVudFR5cGVJZCk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBfY29tbW9uQ3JlYXRlTW9kZWwoVU5NQU5BR0VEX01PREVMLCBoYW5kbGVyLCByZXNvbHZlcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSdyZSBub3Qgc2hhcmluZwotCQkJLy8gKGV2ZW4gaWYgaXQgcmVhbGx5IGlzIGluIHVzZSAuLi4gd2UgZG9uJ3QgY2FyZSkKLQkJCS8vIHRoaXMgbWF5IG5lZWQgdG8gYmUgcmUtZXhhbWluZWQuCi0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMTUFOQUdFUikKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW9kZWxNYW5nZXJJbXBsOjpjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IuIE1vZGVsIHVuZXhwZWN0ZWRseSBpbiB1c2UuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWwoT2JqZWN0IGlkKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJCi0JCVNZTkMuYWNxdWlyZSgpOwotCQkvKioKLQkJICogV2hpbGUgYSBnb29kIGNoZWNrIGluIHRoZW9yeSwgaXQncyBwb3NzaWJsZSBmb3IgYW4gZXZlbnQgZmlyZWQgdG8KLQkJICogY2F1c2UgYSBsaXN0ZW5lciB0byBhY2Nlc3MgYSBtZXRob2QgdGhhdCBjYWxscyB0aGlzIG9uZS4KLQkJICovCi0JCS8vQXNzZXJ0LmlzVHJ1ZShTWU5DLmdldERlcHRoKCk9PTEsICJkZXB0aCBub3QgZXF1YWwgdG8gMSIpOwotCQkvLyBsZXQncyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGl0IGluIG91ciBjYWNoZQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCS8vIGlmIG5vdCwgdGhlbiB3ZSdsbCBzaW1wbHkgcmV0dXJuIG51bGwKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCXJlc3VsdCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJfSBlbHNlIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE5vdGU6IHVzZXJzIG9mIHRoaXMgJ21vZGVsJyBtdXN0IHN0aWxsIHJlbGVhc2UgaXQgd2hlbiBmaW5pc2hlZC4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUncyBub3QgYSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCQotCQlTWU5DLmFjcXVpcmUoKTsJCQotCQkvLyBjcmVhdGUgYSBzbmFwc2hvdAotCQlTZXQgaWRzID0gbmV3IEhhc2hTZXQoZk1hbmFnZWRPYmplY3RzLmtleVNldCgpKTsKLQkJU1lOQy5yZWxlYXNlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpZHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHBvdGVudGlhbElkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJU1lOQy5hY3F1aXJlKCk7CQotCQkJaWYgKGZNYW5hZ2VkT2JqZWN0cy5jb250YWluc0tleShwb3RlbnRpYWxJZCkpIHsKLQkJCQkvLyBjaGVjayB0byBzZWUgaWYgc3RpbGwgdmFsaWQKLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIHRlbXBSZXN1bHQgPSBnZXRFeGlzdGluZ01vZGVsKHBvdGVudGlhbElkKTsKLQkJCQlpZiAodGVtcFJlc3VsdCE9bnVsbCAmJiBkb2N1bWVudCA9PSB0ZW1wUmVzdWx0LmdldFN0cnVjdHVyZWREb2N1bWVudCgpKSB7Ci0JCQkJCXJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KHBvdGVudGlhbElkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90Ci0JICogY3JlYXRlIGEgbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKGlmIGl0Ci0JICogZXhpc3RzKS4gSWYgdGhlIG1vZGVsIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGNhY2hlIG9mIG1vZGVscywKLQkgKiBudWxsIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSkgewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJT2JqZWN0IGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGlkKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90Ci0JICogY3JlYXRlIGEgbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKGlmIGl0Ci0JICogZXhpc3RzKS4gSWYgdGhlIG1vZGVsIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGNhY2hlIG9mIG1vZGVscywKLQkgKiBudWxsIGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBJRmlsZSBmb3JtIC0gdGhpcyBvbmUgd2lsbCBiZWNvbWUgcHJvdGVjdGVkIG9yIHByaXZhdGUKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChPYmplY3QgaWQpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJYm9vbGVhbiBkb1JlbGVhc2UgPSB0cnVlOwotCQkvLyBsZXQncyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGl0IGluIG91ciBjYWNoZQotCQl0cnkgewotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCQkvLyBpZiBub3QsIHRoZW4gd2UnbGwgc2ltcGx5IHJldHVybiBudWxsCi0JCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCQkvLyBpZiBzaGFyZWQgb2JqZWN0IGlzIGluIG91ciBjYWNoZSwgdGhlbiBzaW1wbHkgaW5jcmVtZW50IGl0cyByZWYKLQkJCQkvLyBjb3VudCwKLQkJCQkvLyBhbmQgcmV0dXJuIHRoZSBvYmplY3QuCi0JCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkJZG9SZWxlYXNlPWZhbHNlOwotCQkJCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCQkJaWYgKHNoYXJlZE9iamVjdC5kb1dhaXQpIHsKLQkJCQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCQkJfQotCQkJCQlpZiAoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsIT1udWxsKSB7Ci0JCQkJCQlfaW5jckNvdW50KHNoYXJlZE9iamVjdCwgRURJVCk7Ci0JCQkJCX0KLQkJCQkJcmVzdWx0ID0gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCQkJCX0KLQkJCQl0cmFjZSgiZ290IGV4aXN0aW5nIG1vZGVsIGZvciBFZGl0OiAiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cmFjZSgiICAgaW5jcmVtZW50ZWQgcmVmZXJlbmNlQ291bnRGb3JFZGl0ICIsIGlkLCBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGRvUmVsZWFzZSkgewotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE5vdGU6IHVzZXJzIG9mIHRoaXMgJ21vZGVsJyBtdXN0IHN0aWxsIHJlbGVhc2UgaXQgd2hlbiBmaW5pc2hlZC4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUncyBub3QgYSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCQotCQlTWU5DLmFjcXVpcmUoKTsJCQotCQkvLyBjcmVhdGUgYSBzbmFwc2hvdAotCQlTZXQgaWRzID0gbmV3IEhhc2hTZXQoZk1hbmFnZWRPYmplY3RzLmtleVNldCgpKTsKLQkJU1lOQy5yZWxlYXNlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpZHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHBvdGVudGlhbElkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJU1lOQy5hY3F1aXJlKCk7CQotCQkJaWYgKGZNYW5hZ2VkT2JqZWN0cy5jb250YWluc0tleShwb3RlbnRpYWxJZCkpIHsKLQkJCQkvLyBjaGVjayB0byBzZWUgaWYgc3RpbGwgdmFsaWQKLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIHRlbXBSZXN1bHQgPSBnZXRFeGlzdGluZ01vZGVsKHBvdGVudGlhbElkKTsKLQkJCQlpZiAodGVtcFJlc3VsdCE9bnVsbCAmJiBkb2N1bWVudCA9PSB0ZW1wUmVzdWx0LmdldFN0cnVjdHVyZWREb2N1bWVudCgpKSB7Ci0JCQkJCXJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHBvdGVudGlhbElkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSkgewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJT2JqZWN0IGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGlkKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90Ci0JICogY3JlYXRlIGEgbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKGlmIGl0Ci0JICogZXhpc3RzKS4gSWYgdGhlIG1vZGVsIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGNhY2hlIG9mIG1vZGVscywKLQkgKiBudWxsIGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBJRmlsZSBmb3JtIC0gdGhpcyBvbmUgd2lsbCBiZWNvbWUgcHJvdGVjdGVkIG9yIHByaXZhdGUKLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlib29sZWFuIGRvUmVsZWFzZSA9IHRydWU7Ci0JCS8vIGxldCdzIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgaW4gb3VyIGNhY2hlCi0JCXRyeSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJCS8vIGlmIG5vdCwgdGhlbiB3ZSdsbCBzaW1wbHkgcmV0dXJuIG51bGwKLQkJCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJCS8vIGlmIHNoYXJlZCBvYmplY3QgaXMgaW4gb3VyIGNhY2hlLCB0aGVuIHNpbXBseSBpbmNyZW1lbnQgaXRzIHJlZgotCQkJCS8vIGNvdW50LAotCQkJCS8vIGFuZCByZXR1cm4gdGhlIG9iamVjdC4KLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlkb1JlbGVhc2U9ZmFsc2U7Ci0KLQkJCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJCWlmIChzaGFyZWRPYmplY3QuZG9XYWl0KSB7Ci0JCQkJCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCE9bnVsbCkgewotCQkJCQkJX2luY3JDb3VudChzaGFyZWRPYmplY3QsIFJFQUQpOwotCQkJCQl9Ci0JCQkJCXJlc3VsdCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZG9SZWxlYXNlKQotCQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRE1XOiBUb20sIHRoaXMgaXMgInNwZWNpYWwiIGZvciBsaW5rcyBidWlsZGVyIEFzc3VtaW5nIGl0cwotCSAqICAgICAgICAgICAgIHN0aWxsIG5lZWRlZCwgd291bGRuJ3QgaXQgYmUgYmV0dGVyIHRvIGNoYW5nZSB0bwotCSAqICAgICAgICAgICAgIGdldEV4aXN0aW5nTW9kZWxzKCk/IC0tIHdpbGwgYmUgcmVtb3ZlZC4gSXRzIG5vdCB0aHJlYWQKLQkgKiAgICAgICAgICAgICBzYWZlIGZvciBvbmUgdGhyZWFkIHRvIGdldCB0aGUgRW51bWVyYXRpb24sIHdoZW4gdW5kZXJseWluZwotCSAqICAgICAgICAgICAgIGRhdGEgY291bGQgYmUgY2hhbmdlZCBpbiBhbm90aGVyIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgIEVudW1lcmF0aW9uIGdldEV4aXN0aW5nTW9kZWxJZHMoKSB7Ci0JCXRyeSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCS8vIGNyZWF0ZSBhIGNvcHkKLQkJCVZlY3RvciBrZXlzID0gbmV3IFZlY3RvciggZk1hbmFnZWRPYmplY3RzLmtleVNldCgpICk7Ci0JCQlyZXR1cm4ga2V5cy5lbGVtZW50cygpOwotCQl9IGZpbmFsbHkgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvLyBUT0RPOiByZXBsYWNlIChvciBzdXBwbGVtZW50KSB0aGlzIGlzIGEgIm1vZGVsIGluZm8iIGFzc29jaWF0aW9uIHRvIHRoZQotCS8vIElGaWxlIHRoYXQgY3JlYXRlZCB0aGUgbW9kZWwKLQlwcml2YXRlIElGaWxlIGdldEZpbGVGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcGF0aCA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJT2JqZWN0IGlkID0gbW9kZWwuZ2V0SWQoKTsKLQkJCWlmIChpZCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcGF0aCA9IGlkLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLy8gVE9PRE8gbmVlZHMgcmV3b3JrIGZvciBsaW5rZWQgcmVzb3VyY2VzCi0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJRmlsZSBmaWxlID0gcm9vdC5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgocGF0aCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIHByaW1hcnkgZm9ybXMgdG8gZ2V0IGEgbWFuYWdlZCBtb2RlbAotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgRURJVCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIEVESVQsIGVuY29kaW5nUnVsZSk7Ci0JfQotCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgRURJVCwgZW5jb2RpbmcsIGxpbmVEZWxpbWl0ZXIpOwotCX0KLQotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gX2dldE1vZGVsRm9yKGRvY3VtZW50LCBFRElUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIKLQkgKiBAZGVwcmVjYXRlZCB1c2UgSUZpbGUgb3IgU3RyaW5nIGZvcm0KLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KE9iamVjdCBpZCwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgInJlcXVlc3RlZCBtb2RlbCBpZCBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nSWQgPSBpZC50b1N0cmluZygpOwotCQlyZXR1cm4gZ2V0TW9kZWxGb3JFZGl0KHN0cmluZ0lkLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIHJlc29sdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBJRmlsZSBvciBTdHJpbmcgZm9ybQotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoT2JqZWN0IGlkLCBPYmplY3QgbW9kZWxUeXBlLCBTdHJpbmcgZW5jb2RpbmdOYW1lLCBTdHJpbmcgbGluZURlbGltaXRlciwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nSWQgPSBpZC50b1N0cmluZygpOwotCQlyZXR1cm4gZ2V0TW9kZWxGb3JFZGl0KHN0cmluZ0lkLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIHJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KFN0cmluZyBpZCwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvZ3JhbSBFcnJvcjogaWQgbWF5IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0KLQkJSW5wdXRTdHJlYW0gaXN0cmVhbSA9IFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShpZCwgaXN0cmVhbSk7Ci0JCWlmIChoYW5kbGVyICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IF9jb21tb25DcmVhdGVNb2RlbChpc3RyZWFtLCBpZCwgaGFuZGxlciwgcmVzb2x2ZXIsIEVESVQsIG51bGwsIG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIm5vIG1vZGVsIGhhbmRsZXIgZm91bmQgZm9yIGlkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgcHJpbWFyeSBmb3JtcyB0byBnZXQgYSBtYW5hZ2VkIG1vZGVsCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIFJFQUQsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgUkVBRCwgZW5jb2RpbmdSdWxlKTsKLQl9Ci0KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBTdHJpbmcgZW5jb2RpbmdOYW1lLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIFJFQUQsIGVuY29kaW5nTmFtZSwgbGluZURlbGltaXRlcik7Ci0JfQotCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXJldHVybiBfZ2V0TW9kZWxGb3IoZG9jdW1lbnQsIFJFQUQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlcgotCSAqIEBkZXByZWNhdGVkIHVzZSBJRmlsZSBvciBTdHJpbmcgZm9ybQotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoT2JqZWN0IGlkLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nSWQgPSBpZC50b1N0cmluZygpOwotCQlyZXR1cm4gZ2V0TW9kZWxGb3JSZWFkKHN0cmluZ0lkLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIHJlc29sdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIKLQkgKiBAZGVwcmVjYXRlZCB1c2UgSUZpbGUgZm9ybQotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoT2JqZWN0IGlkLCBPYmplY3QgbW9kZWxUeXBlLCBTdHJpbmcgZW5jb2RpbmdOYW1lLCBTdHJpbmcgbGluZURlbGltaXRlciwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN0cmluZ0lkID0gaWQudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGdldE1vZGVsRm9yUmVhZChzdHJpbmdJZCwgVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCByZXNvbHZlcik7Ci0JfQotCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChTdHJpbmcgaWQsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaXN0cmVhbSA9IFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShpZCwgaXN0cmVhbSk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gX2NvbW1vbkNyZWF0ZU1vZGVsKGlzdHJlYW0sIGlkLCBoYW5kbGVyLCByZXNvbHZlciwgUkVBRCwgbnVsbCwgbnVsbCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBvbmx5IHRlbXBvcmFyaWx5IHZpc2libGUKLQkgKi8KLQlwdWJsaWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgZ2V0TW9kZWxIYW5kbGVyUmVnaXN0cnkoKSB7Ci0JCWlmIChmTW9kZWxIYW5kbGVyUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZk1vZGVsSGFuZGxlclJlZ2lzdHJ5ID0gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gZk1vZGVsSGFuZGxlclJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlciNnZXROZXdNb2RlbEZvckVkaXQoSUZpbGUsIGJvb2xlYW4pCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSBfY29tbW9uTmV3TW9kZWwoaUZpbGUsIGZvcmNlKTsKLQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9IDE7Ci0JCX0KLQkJc2hhcmVkT2JqZWN0LnNldExvYWRlZCgpOwotCQlyZXR1cm4gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlciNnZXROZXdNb2RlbEZvclJlYWQoSUZpbGUsIGJvb2xlYW4pCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IF9jb21tb25OZXdNb2RlbChpRmlsZSwgZm9yY2UpOwotCQlTWU5DLmFjcXVpcmUoKTsKLQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJaWYgKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCE9bnVsbCkgewotCQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQgPSAxOwotCQkJfQotCQl9Ci0JCVNZTkMucmVsZWFzZSgpOwotCQlzaGFyZWRPYmplY3Quc2V0TG9hZGVkKCk7Ci0JCXJldHVybiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqICAgICAgICAgICAgbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICovCi0JcHVibGljICBpbnQgZ2V0UmVmZXJlbmNlQ291bnQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkKLQkJU1lOQy5hY3F1aXJlKCk7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCXN5bmNocm9uaXplZCAoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJY291bnQgPSBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkICsgc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yRWRpdChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgY291bnQgPSAwOwotCQlTWU5DLmFjcXVpcmUoKTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCWNvdW50ID0gc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yUmVhZChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgY291bnQgPSAwOwotCQlTWU5DLmFjcXVpcmUoKTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCWNvdW50ID0gc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ29udmVydExpbmVEZWxpbWl0ZXJzKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSwgRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50bykgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwsIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmdldE51bWJlck9mTGluZXMoKSA+IDEpIHsKLQkJCWNvbnZlcnRMaW5lRGVsaW1pdGVycyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIGlGaWxlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVQcm9ncmFtRXJyb3IoVGhyb3dhYmxlIHQpIHsKLQotCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJJbXBvc3NpYmxlIFByb2dyYW0gRXJyb3IiLCB0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHVibGljICBib29sZWFuIGlzU2hhcmVkKE9iamVjdCBpZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBjb3VudCA9IDA7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVNZTkMuYWNxdWlyZSgpOwotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJY291bnQgPSBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkICsgc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCXJlc3VsdCA9IGNvdW50ID4gMTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwKLQkgKi8KLQlwdWJsaWMgIGJvb2xlYW4gaXNTaGFyZWRGb3JFZGl0KE9iamVjdCBpZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBjb3VudCA9IDA7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVNZTkMuYWNxdWlyZSgpOwotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJY291bnQgPSBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0OwotCQkJfQotCQl9IGVsc2UgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCX0KLQkJcmVzdWx0ID0gY291bnQgPiAxOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbAotCSAqLwotCXB1YmxpYyAgYm9vbGVhbiBpc1NoYXJlZEZvclJlYWQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU1lOQy5hY3F1aXJlKCk7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCQljb3VudCA9IHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQ7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJfQotCQlyZXN1bHQgPSBjb3VudCA+IDE7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIG1hbmFnZXIgaXMgd2l0aGluIGEKLQkgKiAiYWJvdXRUb0NoYW5nZSIgYW5kICJjaGFuZ2VkIiBzZXF1ZW5jZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB0aGUgbWFuYWdlciBkb2VzIG5vdCBvdGhlcndpc2UgaW50ZXJhY3Qgd2l0aCB0aGVzZSBzdGF0ZXMKLQkgKiBAcmV0dXJuIGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0ZUNoYW5naW5nKCkgewotCQkvLyBkb2Vzbid0IHNlZW0gdG8gYmUgdXNlZCBhbnltb3JlCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjaGFuZ2VzIHRoZSBpZCBvZiB0aGUgbW9kZWwuIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVNb2RlbChPYmplY3Qgb2xkSWQsIE9iamVjdCBuZXdJZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG9sZElkLCAib2xkIGlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlBc3NlcnQuaXNOb3ROdWxsKG5ld0lkLCAibmV3IGlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTWU5DLmFjcXVpcmUoKTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQob2xkSWQpOwotCQkvLyBpZiBub3QgZm91bmQgaW4gY2FjaGUsIGlnbm9yZSByZXF1ZXN0LgotCQkvLyB0aGlzIHdvdWxkIG5vcm1hbGx5IGJlIGEgcHJvZ3JhbSBlcnJvcgotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCWZNYW5hZ2VkT2JqZWN0cy5yZW1vdmUob2xkSWQpOwotCQkJZk1hbmFnZWRPYmplY3RzLnB1dChuZXdJZCwgc2hhcmVkT2JqZWN0KTsKLQkJfQotCQlTWU5DLnJlbGVhc2UoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyByZWFkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBpYW5hRW5jb2RpbmdOYW1lKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCVN0cmluZyBhbGxUZXh0ID0gbnVsbDsKLQkJaWYgKChpYW5hRW5jb2RpbmdOYW1lICE9IG51bGwpICYmIChpYW5hRW5jb2RpbmdOYW1lLmxlbmd0aCgpICE9IDApKSB7Ci0JCQlTdHJpbmcgZW5jID0gQ29kZWRJTy5nZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGlhbmFFbmNvZGluZ05hbWUpOwotCQkJaWYgKGVuYyA9PSBudWxsKSB7Ci0JCQkJLy8gaWYgbm8gY29udmVyc2lvbiB3YXMgcG9zc2libGUsIGxldCdzIGFzc3VtZSB0aGF0Ci0JCQkJLy8gdGhlIGVuY29kaW5nIGlzIGFscmVhZHkgYSBqYXZhIGVuY29kaW5nIG5hbWUsIHNvIHdlJ2xsCi0JCQkJLy8gcHJvY2VlZCB3aXRoIHRoYXQgYXNzdW1wdGlvbi4gVGhpcyBpcyB0aGUgY2FzZSwgZm9yCi0JCQkJLy8gZXhhbXBsZSwKLQkJCQkvLyBmb3IgdGhlIHJlbG9hZCgpIHByb2NlZHVyZS4KLQkJCQkvLyBJZiBpbiBmYWN0IGl0IGlzIG5vdCBhIHZhbGlkIGphdmEgZW5jb2RpbmcsIHRoZW4KLQkJCQkvLyB0aGUgImFsbFRleHQ9IiBsaW5lIHdpbGwgY2F1c2UgYW4KLQkJCQkvLyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JCQkJZW5jID0gaWFuYUVuY29kaW5nTmFtZTsKLQkJCX0KLQkJCWFsbFRleHQgPSByZWFkSW5wdXRTdHJlYW0obmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtLCBlbmMpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHdlIG5vcm1hbGx5IGFzc3VtZSBlbmNvZGluZyBpcyBwcm92aWRlZCBmb3IgdGhpcyBtZXRob2QsIGJ1dCBpZgotCQkJLy8gbm90LAotCQkJLy8gd2UnbGwgdXNlIHBsYXRmb3JtIGRlZmF1bHQKLQkJCWFsbFRleHQgPSByZWFkSW5wdXRTdHJlYW0obmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKSk7Ci0JCX0KLQkJcmV0dXJuIGFsbFRleHQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVhZElucHV0U3RyZWFtKElucHV0U3RyZWFtUmVhZGVyIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWludCBudW1SZWFkID0gMDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2hhciB0QnVmZltdID0gbmV3IGNoYXJbUkVBRF9CVUZGRVJfU0laRV07Ci0JCXdoaWxlICgobnVtUmVhZCA9IGlucHV0U3RyZWFtLnJlYWQodEJ1ZmYsIDAsIHRCdWZmLmxlbmd0aCkpICE9IC0xKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRCdWZmLCAwLCBudW1SZWFkKTsKLQkJfQotCQkvLyByZW1lbWJlciAtLSB3ZSBkaWRuJ3Qgb3BlbiBzdHJlYW0gLi4uIHNvIHdlIGRvbid0IGNsb3NlIGl0Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlciNyZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCByZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCi0JCS8vIGdldEhhbmRsZXIgKGFzc3VtZSBpdHMgdGhlICJuZXcgb25lIikKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gbW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCk7Ci0JCS8vIGdldExvYWRlciBmb3IgdGhhdCBuZXcgb25lCi0JCUlNb2RlbExvYWRlciBsb2FkZXIgPSBoYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCS8vIGFzayBpdCB0byByZWluaXRpYWxpemUKLQkJbW9kZWwgPSBsb2FkZXIucmVpbml0aWFsaXplKG1vZGVsKTsKLQkJLy8gdGhlIGxvYWRlciBzaG91bGQgY2hlY2sgdG8gc2VlIGlmIHRoZSBvbmUgaXQgcmVjZWl2ZWQKLQkJLy8gaXMgdGhlIHNhbWUgdHlwZSBpdCB3b3VsZCBub3JtYWxseSBjcmVhdGUuCi0JCS8vIGlmIG5vdCwgaXQgbXVzdCAic3RhcnQgZnJvbSBzY3JhdGNoIiBhbmQgY3JlYXRlIGEgd2hvbGUKLQkJLy8gbmV3IG9uZS4KLQkJLy8gaWYgaXQgaXMgb2YgdGhlIHNhbWUgdHlwZSwgaXQgc2hvdWxkIGp1c3QgJ3JlcGxhY2UgdGV4dCcKLQkJLy8gcmVwbGFjaW5nIGFsbCB0aGUgZXhpc3RpbmcgdGV4dCB3aXRoIHRoZSBuZXcgdGV4dC4KLQkJLy8gdGhlIGltcG9ydGFudCBvbmUgaXMgdGhlIEpTUCBsb2FkZXIgLi4uIGl0IHNob3VsZCBnbyB0aHJvdWdoCi0JCS8vIGl0cyBlbWJlZGRlZCBjb250ZW50IGNoZWNraW5nIGFuZCBpbml0aWFsaXphdGlvbgotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JIHZvaWQgcmVsZWFzZUZyb21FZGl0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCU9iamVjdCBpZCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRJZCgpOwotCQlpZiAoaWQuZXF1YWxzKFVOTUFOQUdFRF9NT0RFTCkgfHwgaWQuZXF1YWxzKERVUExJQ0FURURfTU9ERUwpKSB7Ci0JCQljbGVhbnVwRGlzY2FyZGVkTW9kZWwoc3RydWN0dXJlZE1vZGVsKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlbGVhc2VGcm9tRWRpdChpZCk7Ci0JCX0KLQotCX0KLQkKLQkgdm9pZCByZWxlYXNlRnJvbVJlYWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJT2JqZWN0IGlkID0gc3RydWN0dXJlZE1vZGVsLmdldElkKCk7Ci0JCWlmIChpZC5lcXVhbHMoVU5NQU5BR0VEX01PREVMKSB8fCBpZC5lcXVhbHMoRFVQTElDQVRFRF9NT0RFTCkpIHsKLQkJCWNsZWFudXBEaXNjYXJkZWRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVsZWFzZUZyb21SZWFkKGlkKTsKLQkJfQotCi0JfQotCS8qKgotCSAqIGRlZmF1bHQgZm9yIHVzZSBpbiBzYW1lIHBhY2thZ2UsIG5vdCBzdWJjbGFzc2VzCi0JICogCi0JICovCi0JIHByaXZhdGUgdm9pZCByZWxlYXNlRnJvbUVkaXQoT2JqZWN0IGlkKSB7Ci0JCS8vIElTU1VFOiBtYW55IG9mIHRoZXNlIGFzc2VydHMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gImxvZ3MiCi0JCS8vIGFuZCBjb250aW51ZSB0byBsaW1wIGFsb25nPwotCi0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IG51bGw7Ci0KLQkJLy8gSVNTVUU6IGhlcmUgd2UgbmVlZCBiZXR0ZXIgInNwZWMiIHdoYXQgdG8gZG8gd2l0aAotCQkvLyB1bm1hbmFnZWQgb3IgZHVwbGljYXRlZCBtb2RlbHMuIFJlbGVhc2Ugc3RpbGwgbmVlZHMKLQkJLy8gdG8gYmUgY2FsbGVkIG9uIHRoZW0sIGZvciBub3csIGJ1dCB0aGUgbW9kZWwgbWFuYWdlcgotCQkvLyBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCi0JCWlmIChpZC5lcXVhbHMoVU5NQU5BR0VEX01PREVMKSB8fCBpZC5lcXVhbHMoRFVQTElDQVRFRF9NT0RFTCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklkcyBvZiBVTk1BTkFHRURfTU9ERUwgb3IgRFVQTElDQVRFRF9NT0RFTCBhcmUgaWxsZWdhbCBoZXJlIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCXNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkKLQkJCUFzc2VydC5pc05vdE51bGwoc2hhcmVkT2JqZWN0LCAicmVsZWFzZSB3YXMgcmVxdWVzdGVkIG9uIGEgbW9kZWwgdGhhdCB3YXMgbm90IGJlaW5nIG1hbmFnZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJX2RlY3JDb3VudChzaGFyZWRPYmplY3QsIEVESVQpOwotCQkJCWlmICgoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA9PSAwKSAmJiAoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9PSAwKSkgewotCQkJCQlkaXNjYXJkTW9kZWwoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkvLyBpZiBlZGl0IGdvZXMgdG8gemVybywgYnV0IHN0aWxsIG9wZW4gZm9yIHJlYWQsCi0JCQkvLyB0aGVuIHdlIHNob3VsZCByZWxvYWQgaGVyZSwgc28gd2UgYXJlIGluIHN5bmNoIHdpdGgKLQkJCS8vIGNvbnRlbnRzIG9uIGRpc2suCi0JCQkvLyBJU1NVRTogc2hvdWxkIHdlIGNoZWNrIGlzRGlydHkgaGVyZT8KLQkJCS8vIEFOU1dFUjogaGVyZSwgZm9yIG5vdyBub3cuIG1vZGVsIHN0aWxsIGhhcyBpdHMgb3duIGRpcnR5Ci0JCQkvLyBmbGFnIGZvciBzb21lIHJlYXNvbi4KLQkJCS8vIHdlIG5lZWQgdG8gYWRkcmVzcyAqIHRoYXQgKiB0b28uCi0KLQkJCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCQlpZiAoKHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQgPiAwKSAmJiAoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9PSAwKSAmJiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuaXNEaXJ0eSgpKSB7Ci0JCQkJCXNpZ25hbFByZUxpZmVDeWNsZUxpc3RlbmVyUmV2ZXJ0KHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCk7Ci0JCQkJCXJldmVydE1vZGVsKGlkLCBzaGFyZWRPYmplY3QpOwotCQkJCQkvKgotCQkJCQkgKiBCZWNhdXNlIG1vZGVsIGV2ZW50cyBhcmUgZmlyZWQgdG8gbm90aWZ5IGFib3V0IHRoZQotCQkJCQkgKiByZXZlcnQncyBjaGFuZ2VzLCBhbmQgbGlzdGVuZXJzIGNhbiBzdGlsbCBnZXQvcmVsZWFzZQotCQkJCQkgKiB0aGUgbW9kZWwgZnJvbSB0aGlzIHRocmVhZCAobG9ja2luZyBwcmV2ZW50cyBpdCBiZWluZwotCQkJCQkgKiBkb25lIGZyb20gb3RoZXIgdGhyZWFkcyksIHRoZSByZWZlcmVuY2UgY291bnRzIGNvdWxkCi0JCQkJCSAqIGhhdmUgY2hhbmdlZCBzaW5jZSB3ZSBlbnRlcmVkIHRoaXMgaWYgYmxvY2ssIGFuZCB0aGUKLQkJCQkJICogbW9kZWwgY291bGQgaGF2ZSBiZWVuIGRpc2NhcmRlZC4gIENoZWNrIHRoZSBjb3VudHMgYWdhaW4uCi0JCQkJCSAqLwotCQkJCQlpZiAoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA+IDAgJiYgc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9PSAwKSB7Ci0JCQkJCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuc2V0RGlydHlTdGF0ZShmYWxzZSk7Ci0JCQkJCX0KLQkJCQkJc2lnbmFsUG9zdExpZmVDeWNsZUxpc3RlbmVyUmV2ZXJ0KHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIGZvciBub3csIHRob3VnaCBwdWJsaWMgZm9ybXMgaGF2ZSBiZWVuIHJlcXVlc3RlZCwgaW4gcGFzdC4KLQlwcml2YXRlIHZvaWQgcmV2ZXJ0TW9kZWwoT2JqZWN0IGlkLCBTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkucmV2ZXJ0KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNpZ25hbFByZUxpZmVDeWNsZUxpc3RlbmVyUmV2ZXJ0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9SRVZFUlQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJLy8gd2hhdCdzIHdyb25nIHdpdGggdGhpcyBkZXNpZ24gdGhhdCBhIGNhc3QgaXMgbmVlZGVkIGhlcmUhPwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQoc3RydWN0dXJlZE1vZGVsLCB0eXBlKTsKLQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5zaWduYWxMaWZlY3ljbGVFdmVudChldmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNpZ25hbFBvc3RMaWZlQ3ljbGVMaXN0ZW5lclJldmVydChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfUkVWRVJUIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkvLyB3aGF0J3Mgd3Jvbmcgd2l0aCB0aGlzIGRlc2lnbiB0aGF0IGEgY2FzdCBpcyBuZWVkZWQgaGVyZSE/Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudChzdHJ1Y3R1cmVkTW9kZWwsIHR5cGUpOwotCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLnNpZ25hbExpZmVjeWNsZUV2ZW50KGV2ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzY2FyZE1vZGVsKE9iamVjdCBpZCwgU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCkgewotCQlTWU5DLmFjcXVpcmUoKTsKLQkJZk1hbmFnZWRPYmplY3RzLnJlbW92ZShpZCk7Ci0JCVNZTkMucmVsZWFzZSgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpIHsKLQkJCVBsYXRmb3JtLmdldExvZyhTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFQ29yZVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgIkF0dGVtcHRlZCB0byBkaXNjYXJkIGEgc3RydWN0dXJlZCBtb2RlbCBidXQgdGhlIHVuZGVybHlpbmcgZG9jdW1lbnQgaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gbnVsbDogIiArIHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSwgbnVsbCkpOwotCQl9Ci0KLQkJY2xlYW51cERpc2NhcmRlZE1vZGVsKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBEaXNjYXJkZWRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJLyoKLQkJICogVGhpcyBjYWxsIChhbmQgc2V0dGluZyB0aGUgU3RydWN0dXJlZERvY3VtZW50IHRvIG51bGwpIHdlcmUKLQkJICogcHJldmlvdXNseSBkb25lIHdpdGhpbiB0aGUgbW9kZWwgaXRzZWxmLCBidXQgZm9yIGNvbmN1cnJlbmN5IGl0Ci0JCSAqIG11c3QgYmUgZG9uZSBoZXJlIGR1cmluZyBhIHN5bmNocm9uaXplZCByZWxlYXNlLgotCQkgKi8KLQkJc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpLnJlbGVhc2UoKTsKLQotCQkvKgotCQkgKiBGb3Igc3RydWN0dXJlZCBkb2N1bWVudHMgb3JpZ2luYXRpbmcgZnJvbSBmaWxlIGJ1ZmZlcnMsIGRpc2Nvbm5lY3QKLQkJICogdXMgZnJvbSB0aGUgZmlsZSBidWZmZXIsIG5vdy4KLQkJICovCi0JCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlTW9kZWwoc3RydWN0dXJlZERvY3VtZW50KTsKLQotCQkvKgotCQkgKiBTZXR0aW5nIHRoZSBkb2N1bWVudCB0byBudWxsIGlzIHJlcXVpcmVkIHNpbmNlIHNvbWUgc3ViY2xhc3NlcyBvZgotCQkgKiBtb2RlbCBtaWdodCBoYXZlICJjbGVhbnVwIiBvZiBsaXN0ZW5lcnMsIGV0Yy4sIHRvIHJlbW92ZSwgd2hpY2gKLQkJICogd2VyZSBpbml0aWFsaXplZCBkdXJpbmcgdGhlIGluaXRpYWwgc2V0U3RydWN0dXJlZERvY3VtZW50LgotCQkgKiAKLQkJICogVGhlIG1vZGVsIGl0c2VsZiBpbiBwYXJ0aWN1bGFyIG1heSBoYXZlIGludGVybmFsIGxpc3RlbmVycyB1c2VkIHRvCi0JCSAqIGNvb3JkaW5hdGUgdGhlIGRvY3VtZW50IHdpdGggaXRzIG93biAic3RydWN0dXJlIi4KLQkJICovCi0JCXN0cnVjdHVyZWRNb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQobnVsbCk7Ci0JfQotCi0JCi0JLyoqCi0JICogZGVmYXVsdCBmb3IgdXNlIGluIHNhbWUgcGFja2FnZSwgbm90IHN1YmNsYXNzZXMKLQkgKiAKLQkgKi8KLQkgcHJpdmF0ZSB2b2lkIHJlbGVhc2VGcm9tUmVhZChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gbnVsbDsKLQotCQlpZiAoaWQuZXF1YWxzKFVOTUFOQUdFRF9NT0RFTCkgfHwgaWQuZXF1YWxzKERVUExJQ0FURURfTU9ERUwpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJZHMgb2YgVU5NQU5BR0VEX01PREVMIG9yIERVUExJQ0FURURfTU9ERUwgYXJlIGlsbGVnYWwgaGVyZSIpOwotCQl9Ci0JCWVsc2UgewotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJQXNzZXJ0LmlzTm90TnVsbChzaGFyZWRPYmplY3QsICJyZWxlYXNlIHdhcyByZXF1ZXN0ZWQgb24gYSBtb2RlbCB0aGF0IHdhcyBub3QgYmVpbmcgbWFuYWdlZCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCX0KLQkJU1lOQy5hY3F1aXJlKCk7Ci0JCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCV9kZWNyQ291bnQoc2hhcmVkT2JqZWN0LCBSRUFEKTsKLQkJCWlmICgoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA9PSAwKSAmJiAoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9PSAwKSkgewotCQkJCWRpc2NhcmRNb2RlbChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCX0KLQkJfQotCQlTWU5DLnJlbGVhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90IHVzZQotCSAqIHRoZSBjYWNoZWQgdmVyc2lvbiwgYnV0IGZvcmNlcyB0aGUgY2FjaGVkIHZlcnNpb24gdG8gYmUgcmVwbGFjZWQgd2l0aCBhCi0JICogZnJlc2gsIHVuY2hhbmdlZCB2ZXJzaW9uLiBOb3RlOiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBjaGFuZ2UgYW55Ci0JICogcmVmZXJlbmNlIGNvdW50cy4gQWxzbywgaWYgdGhlcmUgaXMgbm90IGFscmVhZHkgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUKLQkgKiBtb2RlbCwgdGhlbiB0aGlzIGNhbGwgaXMgZXNzZW50aWFsbHkgaWdub3JlZCAodGhhdCBpcywgaXQgZG9lcyBub3QgcHV0Ci0JICogYSBtb2RlbCBpbiB0aGUgY2FjaGUpIGFuZCByZXR1cm5zIG51bGwuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSB3aWxsIGJlY29tZSBwcm90ZWN0ZWQsIHVzZSByZWxvYWQgZGlyZWN0bHkgb24gbW9kZWwKLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgcmVsb2FkTW9kZWwoT2JqZWN0IGlkLCBqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGdldCB0aGUgZXhpc3RpbmcgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaWQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKGlkKTsKLQkJLy8gZm9yIHRoZSBtb2RlbCB0byBiZSBudWxsIGlzIHByb2JhYmx5IGFuIGVycm9yICh0aGF0IGlzLAotCQkvLyByZWxvYWQgc2hvdWxkIG5vdCBoYXZlIGJlZW4gY2FsbGVkLCBidXQgd2UnbGwgZ3VhcmQgYWdhaW5zdAotCQkvLyBhIG51bGwgcG9pbnRlciBleGFtcGxlIGFuZCByZXR1cm4gbnVsbCBpZiB3ZSBhcmUgbm8gbG9uZ2VyIG1hbmFnaW5nCi0JCS8vIHRoYXQgbW9kZWwuCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGxvYWRlciBiYXNlZCBvbiBleGlzdGluZyB0eXBlCi0JCQkvLyBkbXdUT0RPIGV2YWx1YXRlIHdoZW4gcmVsb2FkIHNob3VsZCBvY2N1cgotCQkJLy8gd2l0aCBwb3RlbnRpYWxseSBuZXcgdHlwZSAoZS5nLiBodG1sICdzYXZlIGFzJyBqc3ApLgotCQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gc3RydWN0dXJlZE1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQkJSU1vZGVsTG9hZGVyIGxvYWRlciA9IGhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJCS8vIGFzayB0aGUgbG9hZGVyIHRvIHJlLWxvYWQKLQkJCWxvYWRlci5yZWxvYWQoVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCBzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJdHJhY2UoInJlLWxvYWRpbmcgbW9kZWwiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVNb2RlbChJRmlsZSBpRmlsZSwgU3RyaW5nIGlkLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiZmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGxldCdzIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgaW4gb3VyIGNhY2hlCi0JCi0JCVNZTkMuYWNxdWlyZSgpOwotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgPT0gbnVsbCB8fCBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwgPT0gbnVsbCkgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFNTRUNvcmVNZXNzYWdlcy5Qcm9ncmFtX0Vycm9yX19Nb2RlbE1hbmFnZV9FWENfKTsgLy8kTk9OLU5MUy0xJCA9ICJQcm9ncmFtIEVycm9yOiBNb2RlbE1hbmFnZXJJbXBsOjpzYXZlTW9kZWwuIE1vZGVsIHNob3VsZCBiZSBpbiB0aGUgY2FjaGUiCi0JCX0gCi0JCWVsc2UgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQkKLQkJCS8qKgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMTYxMAotCQkJICogCi0JCQkgKiBTeW5jIHJlbW92ZWQgZnJvbSBoZXJlIHRvIHByZXZlbnQgZGVhZGxvY2suIEFsdGhvdWdoIHRoZSBtb2RlbAotCQkJICogaW5zdGFuY2UgbWF5IGRpc2FwcGVhciBvciBiZSBtYWRlIGludmFsaWQgd2hpbGUgdGhlIHNhdmUgaXMKLQkJCSAqIGhhcHBlbmluZywgdGhlIGRvY3VtZW50IGl0c2VsZiBzdGlsbCBoYXMgdGhlIGNvbnRlbnRzIHdlJ3JlCi0JCQkgKiB0cnlpbmcgdG8gc2F2ZS4gU2ltdWx0YW5lb3VzIHNhdmVzIHNob3VsZCBiZSB0aHJvdHRsZWQgYnkKLQkJCSAqIHJlc291cmNlIGxvY2tpbmcgd2l0aG91dCBvdXIgaW50ZXJ2ZW50aW9uLgotCQkJICovCi0JCQlib29sZWFuIHNhdmVkID0gZmFsc2U7Ci0JCQkvLyBpZiB0aGlzIG1vZGVsIHdhcyBiYXNlZCBvbiBhIEZpbGUgQnVmZmVyIGFuZCB3ZSdyZSB3cml0aW5nIGJhY2sKLQkJCS8vIHRvIHRoZSBzYW1lIGxvY2F0aW9uLCB1c2UgdGhlIGJ1ZmZlciB0byBkbyB0aGUgd3JpdGluZwotCQkJaWYgKEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc0V4aXN0aW5nQnVmZmVyKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSkpIHsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcihzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCUlQYXRoIGZpbGVMb2NhdGlvbiA9IEZpbGVCdWZmZXJzLm5vcm1hbGl6ZUxvY2F0aW9uKGlGaWxlLmdldEZ1bGxQYXRoKCkpOwotCQkJCWlmIChmaWxlTG9jYXRpb24uZXF1YWxzKGJ1ZmZlci5nZXRMb2NhdGlvbigpKSkgewotCQkJCQlidWZmZXIuY29tbWl0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRydWUpOwotCQkJCQlzYXZlZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFzYXZlZCkgewotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCXNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoZG9jdW1lbnQsIGlGaWxlLCBlbmNvZGluZ1J1bGUpOwotCQkJCXRyYWNlKCJzYXZpbmcgbW9kZWwiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXROZXdTdGF0ZShmYWxzZSk7Ci0JCX0JCi0JfQotCi0JLyoqCi0JICogU2F2aW5nIHRoZSBtb2RlbCByZWFsbHkganVzdCBtZWFucyB0byBzYXZlIGl0J3Mgc3RydWN0dXJlZCBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gb3V0cHV0U3RyZWFtCi0JICogQHBhcmFtIGVuY29kaW5nUnVsZQotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTW9kZWwoU3RyaW5nIGlkLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbGV0J3Mgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiBvdXIgY2FjaGUKLQotCQlTWU5DLmFjcXVpcmUoKTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTU0VDb3JlTWVzc2FnZXMuUHJvZ3JhbV9FcnJvcl9fTW9kZWxNYW5hZ2VfRVhDXyk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvZ3JhbSBFcnJvcjogTW9kZWxNYW5hZ2VySW1wbDo6c2F2ZU1vZGVsLiBNb2RlbCBzaG91bGQgYmUgaW4gdGhlIGNhY2hlIgotCQl9Ci0JCWVsc2UgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQkvKioKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjE2MTAKLQkJCSAqIAotCQkJICogU3luYyByZW1vdmVkIGZyb20gaGVyZSB0byBwcmV2ZW50IGRlYWRsb2NrLiBBbHRob3VnaCB0aGUgbW9kZWwKLQkJCSAqIGluc3RhbmNlIG1heSBkaXNhcHBlYXIgb3IgYmUgbWFkZSBpbnZhbGlkIHdoaWxlIHRoZSBzYXZlIGlzCi0JCQkgKiBoYXBwZW5pbmcsIHRoZSBkb2N1bWVudCBpdHNlbGYgc3RpbGwgaGFzIHRoZSBjb250ZW50cyB3ZSdyZQotCQkJICogdHJ5aW5nIHRvIHNhdmUuIFNpbXVsdGFuZW91cyBzYXZlcyBzaG91bGQgYmUgdGhyb3R0bGVkIGJ5Ci0JCQkgKiByZXNvdXJjZSBsb2NraW5nIHdpdGhvdXQgb3VyIGludGVydmVudGlvbi4KLQkJCSAqLwotCQkJLyoKLQkJCSAqIGlmIHRoaXMgbW9kZWwgd2FzIGJhc2VkIG9uIGEgRmlsZSBCdWZmZXIgYW5kIHdlJ3JlIHdyaXRpbmcgYmFjawotCQkJICogdG8gdGhlIHNhbWUgbG9jYXRpb24sIHVzZSB0aGUgYnVmZmVyIHRvIGRvIHRoZSB3cml0aW5nCi0JCQkgKi8KLQkJCWlmIChGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNFeGlzdGluZ0J1ZmZlcihzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpKSB7Ci0JCQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRCdWZmZXIoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQlidWZmZXIuY29tbWl0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRydWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSUZpbGUgaUZpbGUgPSBnZXRGaWxlRm9yKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCk7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJc2F2ZVN0cnVjdHVyZWREb2N1bWVudChkb2N1bWVudCwgaUZpbGUpOwotCQkJCXRyYWNlKCJzYXZpbmcgbW9kZWwiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXROZXdTdGF0ZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHRoaXMgbWV0aG9kIGlzIGxlc3MgZWZmaWNpZW50IHRoYW4gSUZpbGUgZm9ybSwgc2luY2UgaXQKLQkgKiAgICAgICAgICAgICByZXF1aXJlcyBhbiBleHRyYSAiY29weSIgb2YgYnl0ZSBhcnJheSwgYW5kIHNob3VsZCBiZSBhdm9pZAotCSAqICAgICAgICAgICAgIGluIGZhdm9yIG9mIHRoZSBJRmlsZSBmb3JtLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVNb2RlbChTdHJpbmcgaWQsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQotCQlTWU5DLmFjcXVpcmUoKTsKLQkJLy8gbGV0J3Mgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiBvdXIgY2FjaGUKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTU0VDb3JlTWVzc2FnZXMuUHJvZ3JhbV9FcnJvcl9fTW9kZWxNYW5hZ2VfRVhDXyk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvZ3JhbSBFcnJvcjogTW9kZWxNYW5hZ2VySW1wbDo6c2F2ZU1vZGVsLiBNb2RlbCBzaG91bGQgYmUgaW4gdGhlIGNhY2hlIgotCQl9Ci0JCWVsc2UgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJQ29kZWRTdHJlYW1DcmVhdG9yIGNvZGVkU3RyZWFtQ3JlYXRvciA9IG5ldyBDb2RlZFN0cmVhbUNyZWF0b3IoKTsKLQkJCQljb2RlZFN0cmVhbUNyZWF0b3Iuc2V0KHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRJZCgpLCBuZXcgRG9jdW1lbnRSZWFkZXIoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKSk7Ci0JCQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldFByZXZpb3VzRW5jb2RpbmdNZW1lbnRvKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRFbmNvZGluZ01lbWVudG8oKSk7Ci0JCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IGNvZGVkU3RyZWFtQ3JlYXRvci5nZXRDb2RlZEJ5dGVBcnJheU91dHB1dFN0cmVhbShlbmNvZGluZ1J1bGUpOwotCQkJCWJ5dGVbXSBvdXRwdXRCeXRlcyA9IGJ5dGVBcnJheU91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpOwotCQkJCW91dHB1dFN0cmVhbS53cml0ZShvdXRwdXRCeXRlcyk7Ci0JCQkJdHJhY2UoInNhdmluZyBtb2RlbCIsIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQkJCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuc2V0TmV3U3RhdGUoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgSUZpbGUgaUZpbGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50LCBpRmlsZSwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiZmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc0V4aXN0aW5nQnVmZmVyKHN0cnVjdHVyZWREb2N1bWVudCkpIHsKLQkJCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyKHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlpZiAoYnVmZmVyLmdldExvY2F0aW9uKCkuZXF1YWxzKGlGaWxlLmdldEZ1bGxQYXRoKCkpIHx8IGJ1ZmZlci5nZXRMb2NhdGlvbigpLmVxdWFscyhpRmlsZS5nZXRMb2NhdGlvbigpKSkgewotCQkJCWJ1ZmZlci5jb21taXQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKTsKLQkJCS8vIElEb2N1bWVudER1bXBlciBkdW1wZXIgPSBoYW5kbGVyLmdldERvY3VtZW50RHVtcGVyKCk7Ci0JCQlDb2RlZFN0cmVhbUNyZWF0b3IgY29kZWRTdHJlYW1DcmVhdG9yID0gbmV3IENvZGVkU3RyZWFtQ3JlYXRvcigpOwotCQkJUmVhZGVyIHJlYWRlciA9IG5ldyBEb2N1bWVudFJlYWRlcihzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldChpRmlsZSwgcmVhZGVyKTsKLQkJCWNvZGVkU3RyZWFtQ3JlYXRvci5zZXRQcmV2aW91c0VuY29kaW5nTWVtZW50byhzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0RW5jb2RpbmdNZW1lbnRvKCkpOwotCQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9IGNvZGVkU3RyZWFtQ3JlYXRvci5nZXRDdXJyZW50RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQkJCS8vIGJlIHN1cmUgZG9jdW1lbnQncyBpcyB1cGRhdGVkLCBpbiBjYXNlIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW4KLQkJCS8vIGdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKGVuY29kaW5nTWVtZW50byk7Ci0KLQkJCS8vIENvbnZlcnQgbGluZSBkZWxpbWl0ZXJzIGFmdGVyIGVuY29kaW5nIG1lbWVudG8gaXMgZmlndXJlZCBvdXQsCi0JCQkvLyBidXQKLQkJCS8vIGJlZm9yZSB3cml0aW5nIHRvIG91dHB1dCBzdHJlYW0uCi0JCQloYW5kbGVDb252ZXJ0TGluZURlbGltaXRlcnMoc3RydWN0dXJlZERvY3VtZW50LCBpRmlsZSwgZW5jb2RpbmdSdWxlLCBlbmNvZGluZ01lbWVudG8pOwotCi0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY29kZWRCeXRlU3RyZWFtID0gY29kZWRTdHJlYW1DcmVhdG9yLmdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGVuY29kaW5nUnVsZSk7Ci0JCQlJbnB1dFN0cmVhbSBjb2RlZFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb2RlZEJ5dGVTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCQlpZiAoaUZpbGUuZXhpc3RzKCkpCi0JCQkJaUZpbGUuc2V0Q29udGVudHMoY29kZWRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwpOwotCQkJZWxzZQotCQkJCWlGaWxlLmNyZWF0ZShjb2RlZFN0cmVhbSwgZmFsc2UsIG51bGwpOwotCQkJY29kZWRCeXRlU3RyZWFtLmNsb3NlKCk7Ci0JCQljb2RlZFN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tbW9uIHRyYWNlIG1ldGhvZAotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFjZShTdHJpbmcgbXNnLCBPYmplY3QgaWQpIHsKLQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTE1BTkFHRVIpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIG1zZyArICIgIiArIFV0aWxpdGllcy5tYWtlU2hvcnRJZChpZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbW1vbiB0cmFjZSBtZXRob2QKLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhY2UoU3RyaW5nIG1zZywgT2JqZWN0IGlkLCBpbnQgdmFsdWUpIHsKLQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTE1BTkFHRVIpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIG1zZyArIFV0aWxpdGllcy5tYWtlU2hvcnRJZChpZCkgKyAiICgiICsgdmFsdWUgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCi0JIGJvb2xlYW4gaXNJZEluVXNlKFN0cmluZyBuZXdJZCkgewotCQkJYm9vbGVhbiBpblVzZSA9IGZhbHNlOwotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlTaGFyZWRPYmplY3Qgb2JqZWN0ID0oU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KG5ld0lkKTsKLQkJCWlmIChvYmplY3QhPW51bGwpIHsKLQkJCQlpblVzZSA9IG9iamVjdC50aGVTaGFyZWRNb2RlbCE9bnVsbDsKLQkJCX0KLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJcmV0dXJuIGluVXNlOwotCQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL1ByZWZVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL1ByZWZVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMjlhZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9QcmVmVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqICAgICANCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQ29uZmlndXJhdGlvblNjb3BlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOw0KLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOw0KLQ0KLWNsYXNzIFByZWZVdGlsIHsNCi0NCi0Jc3RhdGljIGxvbmcgV0FJVF9JTlRFUlZBTF9NUyA9IDUwMDsNCi0Jc3RhdGljIGludCBXQUlUX0RFTEFZID0gZ2V0SW50KCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxtYW5hZ2VyLm1heFdhaXREdXJpbmdDb25jdXJyZW50TG9hZCIpOw0KLQlzdGF0aWMgYm9vbGVhbiBBTExPV19JTlRFUlJVUFRfV0FJVElOR19USFJFQUQgPSBnZXRCb29sZWFuKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxtYW5hZ2VyLmFsbG93SW50ZXJydXB0c0R1cmluZ0NvbmN1cnJlbnRMb2FkIik7DQotDQotCS8qKiBCYXNlIG9mIG1pbGxpc2Vjb25kIHRpbWluZ3MsIHRvIGF2b2lkIHdyYXBwaW5nICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUlMTElfT1JJR0lOID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIG1pbGxpc2Vjb25kIHRpbWUgb2Zmc2V0IGJ5IG9yaWdpbg0KLQkgKi8NCi0Jc3RhdGljIGZpbmFsIGxvbmcgbm93KCkgew0KLQkJcmV0dXJuIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gTUlMTElfT1JJR0lOOw0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBJRWNsaXBzZVByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgTElTVEVORVI7DQotCXN0YXRpYyB7DQotCQlJbnN0YW5jZVNjb3BlIHNjb3BlID0gbmV3IEluc3RhbmNlU2NvcGUoKTsNCi0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgaW5zdGFuY2VQcmVmcyA9IHNjb3BlLmdldE5vZGUoU1NFQ29yZVBsdWdpbi5JRCk7DQotCQlMSVNURU5FUiA9IG5ldyBJRWNsaXBzZVByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7DQotDQotCQkJcHVibGljIHZvaWQgcHJlZmVyZW5jZUNoYW5nZShQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsNCi0NCi0JCQkJaWYgKCJtb2RlbG1hbmFnZXIubWF4V2FpdER1cmluZ0NvbmN1cnJlbnRMb2FkIi5lcXVhbHMoZXZlbnQuZ2V0S2V5KCkpKSB7DQotCQkJCQlXQUlUX0RFTEFZID0gZ2V0SW50KCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxtYW5hZ2VyLm1heFdhaXREdXJpbmdDb25jdXJyZW50TG9hZCIpOw0KLQkJCQl9DQotCQkJCWVsc2UgaWYgKCJtb2RlbG1hbmFnZXIuYWxsb3dJbnRlcnJ1cHRzRHVyaW5nQ29uY3VycmVudExvYWQiLmVxdWFscyhldmVudC5nZXRLZXkoKSkpIHsNCi0JCQkJCUFMTE9XX0lOVEVSUlVQVF9XQUlUSU5HX1RIUkVBRCA9IGdldEJvb2xlYW4oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbG1hbmFnZXIuYWxsb3dJbnRlcnJ1cHRzRHVyaW5nQ29uY3VycmVudExvYWQiKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX07DQotCQlpbnN0YW5jZVByZWZzLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihMSVNURU5FUik7DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgew0KLQkJLy8gSW1wb3J0YW5jZSBvcmRlciBpczoNCi0JCS8vIGRlZmF1bHQtZGVmYXVsdCA8IGluc3RhbmNlU2NvcGUgPCBjb25maWd1cmF0aW9uU2NvcGUgPCBzeXN0ZW1Qcm9wZXJ0eQ0KLQkJLy8gPCBlbnZWYXINCi0JCVN0cmluZyB2YWx1ZSA9IG51bGw7DQotDQotCQlpZiAodmFsdWUgPT0gbnVsbCkgew0KLQkJCXZhbHVlID0gU3lzdGVtLmdldGVudihwcm9wZXJ0eSk7DQotCQl9DQotCQlpZiAodmFsdWUgPT0gbnVsbCkgew0KLQkJCXZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5KTsNCi0JCX0NCi0JCWlmICh2YWx1ZSA9PSBudWxsKSB7DQotCQkJSVByZWZlcmVuY2VzU2VydmljZSBwcmVmZXJlbmNlc1NlcnZpY2UgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKTsNCi0JCQkNCi0JCQlTdHJpbmcga2V5ID0gcHJvcGVydHk7DQotCQkJaWYgKHByb3BlcnR5ICE9IG51bGwgJiYgcHJvcGVydHkuc3RhcnRzV2l0aChTU0VDb3JlUGx1Z2luLklEKSkgew0KLQkJCQkvLyArMSwgaW5jbHVkZSB0aGUgIi4iDQotCQkJCWtleSA9IHByb3BlcnR5LnN1YnN0cmluZyhTU0VDb3JlUGx1Z2luLklELmxlbmd0aCgpICsgMSwgcHJvcGVydHkubGVuZ3RoKCkpOw0KLQkJCX0NCi0JCQlJbnN0YW5jZVNjb3BlIGluc3RhbmNlID0gbmV3IEluc3RhbmNlU2NvcGUoKTsNCi0JCQlDb25maWd1cmF0aW9uU2NvcGUgY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb25TY29wZSgpOw0KLQkJCQ0KLQkJCVByZWZlcmVuY2VzIGluc3RhbmNlTm9kZSA9IGluc3RhbmNlLmdldE5vZGUoU1NFQ29yZVBsdWdpbi5JRCk7DQotCQkJUHJlZmVyZW5jZXMgY29uZmlnTm9kZSA9IGNvbmZpZy5nZXROb2RlKFNTRUNvcmVQbHVnaW4uSUQpOw0KLQkJCXZhbHVlID0gcHJlZmVyZW5jZXNTZXJ2aWNlLmdldChrZXksIGdldERlZmF1bHQocHJvcGVydHkpLCBuZXcgUHJlZmVyZW5jZXNbXXtjb25maWdOb2RlLGluc3RhbmNlTm9kZX0pOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHZhbHVlOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0KFN0cmluZyBwcm9wZXJ0eSkgew0KLQkJLy8gdGhpcyBpcyB0aGUgImRlZmF1bHQtZGVmYXVsdCINCi0JCWlmICgib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsbWFuYWdlci5tYXhXYWl0RHVyaW5nQ29uY3VycmVudExvYWQiLmVxdWFscyhwcm9wZXJ0eSkpIHsNCi0JCQlyZXR1cm4gIjAiOw0KLQkJfQ0KLQkJZWxzZSBpZiAoIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbG1hbmFnZXIuYWxsb3dJbnRlcnJ1cHRzRHVyaW5nQ29uY3VycmVudExvYWQiLmVxdWFscyhwcm9wZXJ0eSkpIHsNCi0JCQlyZXR1cm4gImZhbHNlIjsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5KSB7DQotCQlTdHJpbmcgcHJvcGVydHkgPSBnZXRQcm9wZXJ0eShrZXkpOw0KLQkJLy8gaWYgKHByb3BlcnR5ICE9IG51bGwpIHsNCi0JCS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJUd2VhazogIiArIGtleSArICI9IiArIEJvb2xlYW4ucGFyc2VCb29sZWFuKHByb3BlcnR5KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJLy8gfQ0KLQkJcmV0dXJuIChwcm9wZXJ0eSAhPSBudWxsID8gQm9vbGVhbi52YWx1ZU9mKHByb3BlcnR5KSA6IEJvb2xlYW4udmFsdWVPZihnZXREZWZhdWx0KGtleSkpKQ0KLQkJCQkuYm9vbGVhblZhbHVlKCk7DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldEludChTdHJpbmcga2V5KSB7DQotCQlTdHJpbmcgcHJvcGVydHkgPSBnZXRQcm9wZXJ0eShrZXkpOw0KLQkJaW50IHNpemUgPSAwOw0KLQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsNCi0JCQl0cnkgew0KLQkJCQlzaXplID0gSW50ZWdlci5wYXJzZUludChwcm9wZXJ0eSk7DQotCQkJCS8vCVN5c3RlbS5vdXQucHJpbnRsbigiVHdlYWs6ICIgKyBrZXkgKyAiPSIgKyBzaXplKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJfQ0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KLQkJCQlzaXplID0gZ2V0RGVmYXVsdEludChrZXksIHByb3BlcnR5LCBzaXplKTsNCi0JCQl9DQotCQl9DQotCQllbHNlIHsNCi0JCQlzaXplID0gZ2V0RGVmYXVsdEludChrZXksIHByb3BlcnR5LCBzaXplKTsNCi0JCX0NCi0JCXJldHVybiBzaXplOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIGludCBnZXREZWZhdWx0SW50KFN0cmluZyBrZXksIFN0cmluZyBwcm9wZXJ0eSwgaW50IHNpemUpIHsNCi0JCS8vIGlnbm9yZWQNCi0JCXRyeSB7DQotCQkJc2l6ZSA9IEludGVnZXIucGFyc2VJbnQoZ2V0RGVmYXVsdChrZXkpKTsNCi0JCX0NCi0JCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZTEpIHsNCi0JCQloYW5kbGVJbnRQYXJzZUV4Y2VwdGlvbihrZXksIHByb3BlcnR5LCBlMSk7DQotCQkJc2l6ZSA9IDA7DQotCQl9DQotCQlyZXR1cm4gc2l6ZTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZUludFBhcnNlRXhjZXB0aW9uKFN0cmluZyBrZXksIFN0cmluZyBwcm9wZXJ0eSwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUxKSB7DQotCQlFeGNlcHRpb24gbiA9IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoDQotCQkJCSJFeGNlcHRpb24gZHVyaW5nIHBhcnNlIG9mIGRlZmF1bHQgdmFsdWUgZm9yIGtleSAnJ3swfScnIHZhbHVlIHdhcyAnJ3sxfScnLiBVc2luZyAwIGluc3RlYWQiLCAvLyROT04tTkxTLTEkDQotCQkJCWtleSwgcHJvcGVydHkpLCBlMSk7DQotCQluLnByaW50U3RhY2tUcmFjZSgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGExMGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci0KLS8qKgotICogVGhlIGVudHJpZXMgaW4gdGhpcyByZWdpc3RyeSBhcmUsIGNvbmNlcHR1YWxseSwgc2luZ2xldG9uJ3MgU2luY2Ugb25seSBvbmUKLSAqIGluc3RhbmNlIGlzIGNyZWF0ZWQgaW4gdGhlIHJlZ2lzdHJ5LCBhbmQgdGhlbiB0aGF0IGluc3RhbmNlIHJldHVybmVkIHdoZW4KLSAqIHJlcXVpcmVkLgotICogCi0gKiBOb3RlIHRoYXQgdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubyAncmVtb3ZlJyBtZXRob2QsIFNpbmNlIHRoZSByZWdpc3RyeQotICogaXRzZWxmIGlzIHJlYWQgaXQgd2hlbiBvbmNlLCBmcm9tIHRoZSBwbGF0Zm9ybSdzIHBsdWdpbiByZWdpc3RyeSwgYW5kIGlzCi0gKiBub3QgaW50ZW5kZWQgdG8gYmUgbW9kaWZpZWQgYWZ0ZXIgdGhhdC4gQSBjaGFuZ2UgaW4gYW4gZXh0ZW5zdGlvbiBpbiBhCi0gKiBwbHVnaW4ueG1sIHdpbGwgb25seSB0YWtlIGVmZmVjdCB3aGVuIHRoZSB3b3JrYmVuY2ggaXMgcmUtc3RhcnRlZC4KLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBFbWJlZGRlZFR5cGVSZWdpc3RyeSB7Ci0KLQkvKioKLQkgKiBNZXRob2QgdG8gcmV0dXJuIHRoZSBzcGVjaWZpYyB0eXBlIGZvciB0aGUgc3BlY2lmaWMgbWltZXR5cGUuCi0JICovCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0VHlwZUZvcihTdHJpbmcgbWltZVR5cGUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWE4OTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLQotCi0vKioKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbCBpbXBsZW1lbnRzIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgc3RhdGljIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSGFzaFNldCBoYXNoU2V0ID0gbnVsbDsKLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgcmVnaXN0cnlEZWZhdWx0SGFuZGxlciA9IG51bGw7Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudFR5cGVSZWdpc3RyeSNnZXRUeXBlRm9yKFN0cmluZykKLQkgKi8KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29udGVudFR5cGVSZWdpc3RyeUltcGwuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWhhc2hTZXQgPSBuZXcgSGFzaFNldCgpOwotCQluZXcgRW1iZWRkZWRUeXBlUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoaGFzaFNldCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb250ZW50VHlwZVJlZ2lzdHJ5I2FkZChDb250ZW50VHlwZURlc2NyaXB0aW9uKQotCSAqLwotCXZvaWQgYWRkKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKLQkJaGFzaFNldC5hZGQoY29udGVudFR5cGVEZXNjcmlwdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCXJldHVybiBnZXRUeXBlRm9yKCJ0ZXh0L2h0bWwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRSZWdpc3RyeURlZmF1bHQuIFdlIGNhY2hlIHRoZSBkZWZhdWx0IGhhbmRsZXIsIHNpbmNlIGNhbid0Ci0JICogY2hhbmdlIG9uY2UgcGx1Z2luIGRlc2NyaXB0b3JzIGFyZSBsb2FkZWQuCi0JICogCi0JICogQHJldHVybiBFbWJlZGRlZFR5cGVIYW5kbGVyCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldFJlZ2lzdHJ5RGVmYXVsdCgpIHsKLQkJaWYgKHJlZ2lzdHJ5RGVmYXVsdEhhbmRsZXIgPT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBoYXNoU2V0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoKHJlZ2lzdHJ5RGVmYXVsdEhhbmRsZXIgPT0gbnVsbCkgJiYgKGl0Lmhhc05leHQoKSkpIHsgLy8gc2FmZQotCQkJCS8vIGNhc3QKLQkJCQkvLyBzaW5jZQotCQkJCS8vICdhZGQnCi0JCQkJLy8gcmVxdWlyZXMKLQkJCQkvLyBFbWJlZGRlZENvbnRlbnRUeXBlRGVzY3JpcHRpb24KLQkJCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGl0ZW0gPSAoRW1iZWRkZWRUeXBlSGFuZGxlcikgaXQubmV4dCgpOwotCQkJCWlmICgoaXRlbSAhPSBudWxsKSAmJiAoaXRlbS5pc0RlZmF1bHQoKSkpIHsKLQkJCQkJcmVnaXN0cnlEZWZhdWx0SGFuZGxlciA9IGl0ZW07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVnaXN0cnlEZWZhdWx0SGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgY29udGVudFR5cGVEZXNjcmlwdGlvbiBiYXNlZCBvbiBsaXRlcmFsIGlkLiBJdHMgYmFzaWNhbGx5IGEKLQkgKiAiZmlyc3QgZm91bmQgZmlyc3QgcmV0dXJuZWQiLiBOb3RlIHRoZSBvcmRlciBpcyBmYWlybHkgdW5wcmVkaWN0YWJsZSwKLQkgKiBzbyBub24tdW5pcXVlIGlkcyB3b3VsZCBjYXVzZSBwcm9ibGVtcy4KLQkgKi8KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRUeXBlRm9yKFN0cmluZyBtaW1lVHlwZSkgewotCQkvLyBOb3RlOiB0aGUgcmVhc29uIHdlIGhhdmUgdGhpcyBwcmVjb25kaXRpb24gaXMgdGhhdCB0aGUKLQkJLy8gZGVmYXVsdCBpcyBkaWZmZXJlbnQgaW5zaWRlIHRoZSByZWdpc3RyeSB0aGFuIHdoZW4gY2FsbGVkLAotCQkvLyBmb3IgZXhhbXBsZSwgZnJvbSB0aGUgSlNQTG9hZGVyLiBGb3IgdGhlIEpTUExvYWRlciwgaWYgdGhlcmUKLQkJLy8gaXMgbm8gbWltZXR5cGUsIHRoZSBkZWZhdWx0IHNob3VsZCBiZSBIVE1MLiBIZXJlLCBpZiB0aGVyZSBpcwotCQkvLyBzb21lIG1pbWV0eXBlLCBidXQgaXQgaXMgbm90IHJlY29nbml6ZWQsIHdlIHJldHVybiBhIGRlZmF1bHQKLQkJLy8gZm9yIFhNTC4gVGhpcyBpcyByZXF1aXJlZCBmb3IgdmFyaW91cyB2b2ljZSB4bWwgdHlwZXMsIGV0Yy4KLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBmb3VuZCA9IG51bGw7Ci0JCWlmIChtaW1lVHlwZSA9PSBudWxsIHx8IG1pbWVUeXBlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlmb3VuZCA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJfSBlbHNlIHsKLQkJCUl0ZXJhdG9yIGl0ID0gaGFzaFNldC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKChmb3VuZCA9PSBudWxsKSAmJiAoaXQuaGFzTmV4dCgpKSkgeyAvLyBzYWZlIGNhc3Qgc2luY2UKLQkJCQkvLyAnYWRkJyByZXF1aXJlcwotCQkJCS8vIEVtYmVkZGVkQ29udGVudFR5cGVEZXNjcmlwdGlvbgotCQkJCUVtYmVkZGVkVHlwZUhhbmRsZXIgaXRlbSA9IChFbWJlZGRlZFR5cGVIYW5kbGVyKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKChpdGVtICE9IG51bGwpICYmIChpdGVtLmdldFN1cHBvcnRlZE1pbWVUeXBlcygpLmNvbnRhaW5zKG1pbWVUeXBlKSkpIHsKLQkJCQkJZm91bmQgPSBpdGVtOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpZiBubyBleGFjdCBtYXRjaCwgZG8gdGhlICJsb29zZXIiIGNoZWNrCi0JCQlpZihmb3VuZCA9PSBudWxsKSB7Ci0JCQkJaXQgPSBoYXNoU2V0Lml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKChmb3VuZCA9PSBudWxsKSAmJiAoaXQuaGFzTmV4dCgpKSkgeyAKLQkJCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBpdGVtID0gKEVtYmVkZGVkVHlwZUhhbmRsZXIpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKChpdGVtICE9IG51bGwpICYmIChpdGVtLmNhbkhhbmRsZU1pbWVUeXBlKG1pbWVUeXBlKSkpIHsKLQkJCQkJCWZvdW5kID0gaXRlbTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIG5vIG1hdGNoZXMsIHVzZSBkZWZhdWx0Ci0JCWlmIChmb3VuZCA9PSBudWxsKSB7Ci0JCQlmb3VuZCA9IGdldFJlZ2lzdHJ5RGVmYXVsdCgpOwotCQl9Ci0JCXJldHVybiBmb3VuZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OThmN2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRUeXBlUmVnaXN0cnlSZWFkZXIgewotCXByb3RlY3RlZCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImVtYmVkZGVkVHlwZUhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQotCXByb3RlY3RlZCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIFRBR19OQU1FID0gImVtYmVkZGVkVHlwZUhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQlFbWJlZGRlZFR5cGVSZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW1iZWRkZWRUeXBlSGFuZGxlciByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCi0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbiA9IG51bGw7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQl0cnkgewotCQkJCWNvbnRlbnRUeXBlRGVzY3JpcHRpb24gPSAoRW1iZWRkZWRUeXBlSGFuZGxlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9DTEFTUyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZW50VHlwZURlc2NyaXB0aW9uLCAiRXJyb3IgcmVhZGluZyBjb250ZW50IHR5cGUgZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gY29udGVudFR5cGVEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBXZSBzaW1wbHkgcmVxdWlyZSBhbiAnYWRkJyBtZXRob2QsIG9mIHdoYXQgZXZlciBpdCBpcyB3ZSBhcmUgdG8gcmVhZAotCSAqIGludG8KLQkgKi8KLQl2b2lkIHJlYWRSZWdpc3RyeShTZXQgc2V0KSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZENvbnRlbnRUeXBlID0gcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJCS8vIG51bGwgY2FuIGJlIHJldHVybmVkIGlmIHRoZXJlJ3MgYW4gZXJyb3IgcmVhZGluZyB0aGUKLQkJCQkvLyBlbGVtZW50Ci0JCQkJaWYgKGVtYmVkZGVkQ29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJCQlzZXQuYWRkKGVtYmVkZGVkQ29udGVudFR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmJmYTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJSZWdpc3RyeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgaW5zdGFuY2UgPSBudWxsOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJOQUxfREVGQVVMVF9FWFRFTlNJT04gPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgTW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBJTW9kZWxIYW5kbGVyIGRlZmF1bHRIYW5kbGVyID0gbnVsbDsKLQlwcml2YXRlIE1vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG5ldyBNb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlcigpOwotCi0JcHJpdmF0ZSBNb2RlbEhhbmRsZXJSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJcmVhZGVyID0gbmV3IE1vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyKCkucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGRlZmF1bHQgbW9kZWwgaGFuZGxlci4gTm90ZTogd2Ugc3RpbGwgZ28gdGhyb3VnaCB0aGUgcmVnaXN0cnkKLQkgKiB0byBiZSBzdXJlIHRvIGdldCB0aGUgZXhpc3RpbmcgaW5zdGFuY2UsIGJ1dCB0aGVuIHdlIGRvIHJlbWVtYmVyIGl0LCBzbwotCSAqIHN1YnNlcXVlbnQgcmVxdWVzdHMgd2lsbCBiZSBmYXN0ZXIuIFRoZSBmaXJzdCB0aW1lIHRocm91Z2gsIHdlIGRvIGNoZWNrCi0JICogdGhlIHdob2xlIGxpc3QsIHRvIGJlIHN1cmUgdGhlcmUgaXMgb25seSBvbmUuCi0JICogCi0JICovCi0JZmluYWwgcHVibGljIElNb2RlbEhhbmRsZXIgZ2V0RGVmYXVsdCgpIHsKLQkJaWYgKGRlZmF1bHRIYW5kbGVyID09IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVhZGVyLmVsZW1lbnRzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWJvb2xlYW4gb2ZJbnRlcmVzdCA9IHJlYWRlci5pc0VsZW1lbnREZWZhdWx0KGVsZW1lbnRzW2ldKTsKLQkJCQlpZiAob2ZJbnRlcmVzdCkgewotCQkJCQkvKgotCQkJCQkgKiBJZiwgaGVyZSB3aXRoaW4gdGhlIHNlYXJjaCBsb29wIHdlJ3ZlIGFscmVhZHkgZm91bmQgb25lCi0JCQkJCSAqIGRlZmF1bHRIYW5kbGVyLCB0aGVuIHNvbWV0aGluZyBpcyB3cm9uZyEKLQkJCQkJICovCi0JCQkJCWlmIChkZWZhdWx0SGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCQlkZWZhdWx0SGFuZGxlciA9IHJlYWRlci5nZXRJbnN0YW5jZShlbGVtZW50c1tpXSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSAiUHJvZ3JhbSBvciBjb25maWd1cmF0aW9uIGVycm9yLiBNb3JlIHRoYW4gb25lIGRlZmF1bHQgY29udGVudCBoYW5kbGVyIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIGVycm9yU3RyaW5nKTsKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXJyb3JTdHJpbmcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWZhdWx0SGFuZGxlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSAiUHJvZ3JhbSBvciBjb25maWd1cmF0aW9uIGVycm9yLiBObyBkZWZhdWx0IGNvbnRlbnQgdHlwZSBoYW5kbGVyIGZvdW5kLiI7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBlcnJvclN0cmluZyk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGVycm9yU3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYSBNb2RlbEhhbmRsZXIgYmFzZWQgb24gbGl0ZXJhbCBleHRlbnNpb24gaWQuIEl0J3MgYmFzaWNhbGx5IGEKLQkgKiAiZmlyc3QgZm91bmQgZmlyc3QgcmV0dXJuZWQiLiBObyBzcGVjaWZpYyBvcmRlciBpcyBndWFyYW50ZWVkIGFuZCB0aGUKLQkgKiB1bmlxdWVuZXNzIG9mIElEcyBpcyBub3QgY29uc2lkZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uSWQKLQkgKiBAcmV0dXJuIHRoZSBnaXZlbiBleHRlbnNpb24sIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIElNb2RlbEhhbmRsZXIgZ2V0SGFuZGxlckV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uSWQpIHsKLQkJSU1vZGVsSGFuZGxlciBmb3VuZCA9IG51bGw7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVhZGVyLmVsZW1lbnRzOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBjdXJyZW50SWQgPSByZWFkZXIuZ2V0SWQoZWxlbWVudHNbaV0pOwotCQkJCWlmIChleHRlbnNpb25JZC5lcXVhbHMoY3VycmVudElkKSkgewotCQkJCQlJTW9kZWxIYW5kbGVyIGl0ZW0gPSByZWFkZXIuZ2V0SW5zdGFuY2UoZWxlbWVudHNbaV0pOwotCQkJCQlmb3VuZCA9IGl0ZW07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKExvZ2dlci5ERUJVRyl7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiVGhlcmUgd2VyZSBubyBNb2RlbCBIYW5kbGVyIGZvdW5kIGluIHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZm91bmQ7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHJlZ2lzdGVyZWQgSU1vZGVsSGFuZGxlciBmb3IgYSBnaXZlbiBuYW1lZCBmaWxlJ3MgY29udGVudAotCSAqIHR5cGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gcHJvdmlkZURlZmF1bHQgc2hvdWxkIHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBiZSB1c2VkIGluIHRoZSBhYnNlbmNlIG9mIG90aGVyIG1ldGhvZHMKLQkgKiBAcmV0dXJuIFRoZSBJTW9kZWxIYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGdpdmVuCi0JICogICAgICAgICBmaWxlLiBJZiBhbiBleGFjdCBtYXRjaCBpcyBub3QgZm91bmQsIHRoZSBtb3N0LXNwZWNpZmljIG1hdGNoCi0JICogICAgICAgICBhY2NvcmRpbmcgdG8gSUNvbnRlbnRUeXBlLmlzS2luZE9mKCkgd2lsbCBiZSByZXR1cm5lZC4gSWYgbm9uZQotCSAqICAgICAgICAgYXJlIGZvdW5kLCBlaXRoZXIgYSBkZWZhdWx0IG9yIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSU1vZGVsSGFuZGxlciBnZXRIYW5kbGVyRm9yKElGaWxlIGZpbGUsIGJvb2xlYW4gcHJvdmlkZURlZmF1bHQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSU1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIgPSBudWxsOwotCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IG51bGw7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IG51bGw7Ci0JCWJvb2xlYW4gYWNjZXNzaWJsZSA9IGZpbGUuaXNBY2Nlc3NpYmxlKCk7Ci0JCWlmIChhY2Nlc3NpYmxlKSB7Ci0JCQkvKiBUcnkgdGhlIG9wdGltaXplZCBtZXRob2QgZmlyc3QgYXMgdGhlIGRlc2NyaXB0aW9uIG1heSBiZSBjYWNoZWQgKi8KLQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkvLyB1c2UgdGhlIHByb3ZpZGVkIGRlc2NyaXB0aW9uCi0JCQkJY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIHVzZSB0aGUgbW9yZSB0aG9yb3VnaCBkaXNjb3ZlcnkgbWV0aG9kIHRvIGdldCBhIGRlc2NyaXB0aW9uICovCi0JCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNvbnRlbnRzID0gZmlsZS5nZXRDb250ZW50cyhmYWxzZSk7Ci0JCQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldERlc2NyaXB0aW9uRm9yKGNvbnRlbnRzLCBmaWxlLmdldE5hbWUoKSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCWNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90aGluZyBmdXJ0aGVyIGNhbiBiZSBkb25lLCBidXQgd2lsbCBsb2cgZm9yIGRlYnVnZ2luZwotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkJCS8vIG5vdGhpbmcgY2FuIGJlIGRvbmUKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIElmIHdlIGNvdWxkbid0IGdldCB0aGUgY29udGVudCB0eXBlIGZyb20gYSBkZXNjcmlwdGlvbiwgdHJ5IGJhc2luZwotCQkgKiBpdCBvbiBqdXN0IHRoZSBmaWxlbmFtZQotCQkgKi8KLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKGZpbGUuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQltb2RlbEhhbmRsZXIgPSBnZXRIYW5kbGVyRm9yQ29udGVudFR5cGUoY29udGVudFR5cGUpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IG51bGwgJiYgcHJvdmlkZURlZmF1bHQpIHsKLQkJCS8vIGhhcmQgY29kaW5nIGZvciBudWxsIGNvbnRlbnQgdHlwZQotCQkJbW9kZWxIYW5kbGVyID0gZ2V0SGFuZGxlckV4dGVuc2lvbihJTlRFUk5BTF9ERUZBVUxUX0VYVEVOU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBtb2RlbEhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHJlZ2lzdGVyZWQgSU1vZGVsSGFuZGxlciBmb3IgYSBnaXZlbiBuYW1lZCBmaWxlJ3MgY29udGVudAotCSAqIHR5cGUuIFdpbGwgY2hlY2sgZm9yIGEgZGVmYXVsdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4gVGhlIElNb2RlbEhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIGZpbGUuIElmIGFuIGV4YWN0IG1hdGNoIGlzIG5vdCBmb3VuZCwgdGhlIG1vc3Qtc3BlY2lmaWMgbWF0Y2gKLQkgKiAgICAgICAgIGFjY29yZGluZyB0byBJQ29udGVudFR5cGUuaXNLaW5kT2YoKSB3aWxsIGJlIHJldHVybmVkLiBJZiBub25lCi0JICogICAgICAgICBhcmUgZm91bmQsIGVpdGhlciBhIGRlZmF1bHQgb3IgbnVsbCB3aWxsIGJlIHJldHVybmVkLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJTW9kZWxIYW5kbGVyIGdldEhhbmRsZXJGb3IoSUZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0SGFuZGxlckZvcihmaWxlLCB0cnVlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSByZWdpc3RlcmVkIElNb2RlbEhhbmRsZXIgZm9yIGEgZ2l2ZW4gbmFtZWQgSW5wdXRTdHJlYW0uCi0JICogCi0JICogQHBhcmFtIGlucHV0TmFtZQotCSAqIEBwYXJhbSBpbnB1dFN0cmVhbQotCSAqIEByZXR1cm4gVGhlIElNb2RlbEhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIGlucHV0LiBJZiBhbiBleGFjdCBtYXRjaCBpcyBub3QgZm91bmQsIHRoZSBtb3N0LXNwZWNpZmljIG1hdGNoCi0JICogICAgICAgICBhY2NvcmRpbmcgdG8gSUNvbnRlbnRUeXBlLmlzS2luZE9mKCkgd2lsbCBiZSByZXR1cm5lZC4gSWYgbm9uZQotCSAqICAgICAgICAgYXJlIGZvdW5kLCBlaXRoZXIgYSBkZWZhdWx0IG9yIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElNb2RlbEhhbmRsZXIgZ2V0SGFuZGxlckZvcihTdHJpbmcgaW5wdXROYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaVN0cmVhbSA9IFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKTsKLQkJSU1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIgPSBudWxsOwotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBudWxsOwotCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpU3RyZWFtLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJCQljb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihVdGlsaXRpZXMuZ2V0TGltaXRlZFN0cmVhbShpU3RyZWFtKSwgaW5wdXROYW1lKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChpU3RyZWFtICE9IG51bGwgJiYgaVN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCQkJaVN0cmVhbS5yZXNldCgpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQljb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihpbnB1dE5hbWUpOwotCQl9Ci0JCS8vIGlmIGFsbCBlbHNlIGZhaWxlZCwgdHJ5IHRvIGRldGVjdCBzb2xlbHkgb24gY29udGVudHM7IGRvbmUgbGFzdCBmb3IKLQkJLy8gcGVyZm9ybWFuY2UgcmVhc29ucwotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoVXRpbGl0aWVzLmdldExpbWl0ZWRTdHJlYW0oaVN0cmVhbSksIG51bGwpOwotCQl9Ci0JCW1vZGVsSGFuZGxlciA9IGdldEhhbmRsZXJGb3JDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0JCXJldHVybiBtb2RlbEhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHJlZ2lzdGVyZWQgSU1vZGVsSGFuZGxlciBmb3IgYSBnaXZlbiBJQ29udGVudFR5cGUuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHJldHVybiBUaGUgSU1vZGVsSGFuZGxlciByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY29udGVudCB0eXBlLiBJZiBhbgotCSAqICAgICAgICAgZXhhY3QgbWF0Y2ggaXMgbm90IGZvdW5kLCB0aGUgbW9zdC1zcGVjaWZpYyBtYXRjaCBhY2NvcmRpbmcgdG8KLQkgKiAgICAgICAgIElDb250ZW50VHlwZS5pc0tpbmRPZigpIHdpbGwgYmUgcmV0dXJuZWQuIElmIG5vbmUgYXJlIGZvdW5kLAotCSAqICAgICAgICAgZWl0aGVyIGEgZGVmYXVsdCBvciBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0JICovCi0JcHJpdmF0ZSBJTW9kZWxIYW5kbGVyIGdldEhhbmRsZXJGb3JDb250ZW50VHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBleGFjdENvbnRlbnRUeXBlRWxlbWVudCA9IG51bGw7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQga2luZE9mQ29udGVudFR5cGVFbGVtZW50ID0gbnVsbDsKLQkJCWludCBraW5kT2ZDb250ZW50VHlwZURlcHRoID0gMDsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVhZGVyLmVsZW1lbnRzOwotCQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aCAmJiBleGFjdENvbnRlbnRUeXBlRWxlbWVudCA9PSBudWxsOyBpKyspIHsKLQkJCQkJU3RyaW5nIGN1cnJlbnRJZCA9IHJlYWRlci5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChlbGVtZW50c1tpXSk7Ci0JCQkJCUlDb250ZW50VHlwZSBhc3NvY2lhdGVkQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjdXJyZW50SWQpOwotCQkJCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKGFzc29jaWF0ZWRDb250ZW50VHlwZSkpIHsKLQkJCQkJCWV4YWN0Q29udGVudFR5cGVFbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY29udGVudFR5cGUuaXNLaW5kT2YoYXNzb2NpYXRlZENvbnRlbnRUeXBlKSkgewotCQkJCQkJLyoKLQkJCQkJCSAqIFVwZGF0ZSB0aGUga2luZE9mRWxlbWVudCB2YXJpYWJsZSBvbmx5IGlmIHRoaXMKLQkJCQkJCSAqIGVsZW1lbnQncyBjb250ZW50IHR5cGUgaXMgImRlZXBlciIgKGRlcHRoIHRlc3QKLQkJCQkJCSAqIGVuc3VyZXMgdGhlIGZpcnN0IGNvbnRlbnQgdHlwZSBpcyByZW1lbWJlcmVkKQotCQkJCQkJICovCi0JCQkJCQlJQ29udGVudFR5cGUgdGVzdENvbnRlbnRUeXBlID0gYXNzb2NpYXRlZENvbnRlbnRUeXBlOwotCQkJCQkJaW50IHRlc3REZXB0aCA9IDA7Ci0JCQkJCQl3aGlsZSAodGVzdENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCQkJCQl0ZXN0RGVwdGgrKzsKLQkJCQkJCQl0ZXN0Q29udGVudFR5cGUgPSB0ZXN0Q29udGVudFR5cGUuZ2V0QmFzZVR5cGUoKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh0ZXN0RGVwdGggPiBraW5kT2ZDb250ZW50VHlwZURlcHRoKSB7Ci0JCQkJCQkJa2luZE9mQ29udGVudFR5cGVFbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJCQkJa2luZE9mQ29udGVudFR5cGVEZXB0aCA9IHRlc3REZXB0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKExvZ2dlci5ERUJVRyl7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlRoZXJlIHdlcmUgbm8gTW9kZWwgSGFuZGxlciBmb3VuZCBpbiByZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZXhhY3RDb250ZW50VHlwZUVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWhhbmRsZXIgPSByZWFkZXIuZ2V0SW5zdGFuY2UoZXhhY3RDb250ZW50VHlwZUVsZW1lbnQpOwotCQkJfQotCQkJZWxzZSBpZiAoa2luZE9mQ29udGVudFR5cGVFbGVtZW50ICE9IG51bGwpIHsKLQkJCQloYW5kbGVyID0gcmVhZGVyLmdldEluc3RhbmNlKGtpbmRPZkNvbnRlbnRUeXBlRWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0JCQkvLyB0ZW1wIGhhcmQgY29kaW5nIGZvciBudWxsIGNvbnRlbnQgdHlwZSBhcmd1bWVudHMKLQkJCWhhbmRsZXIgPSBnZXRIYW5kbGVyRXh0ZW5zaW9uKElOVEVSTkFMX0RFRkFVTFRfRVhURU5TSU9OKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBoYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSByZWdpc3RlcmVkIElNb2RlbEhhbmRsZXIgZm9yIGEgZ2l2ZW4gY29udGVudCB0eXBlIElELiBObwotCSAqIHNwZWNpZmljIG9yZGVyIGlzIGd1YXJhbnRlZWQgYW5kIHRoZSB1bmlxdWVuZXNzIG9mIElEcyBpcyBub3QKLQkgKiBjb25zaWRlcmVkLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqIEByZXR1cm4gVGhlIElNb2RlbEhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgdHlwZSBJRC4gSWYKLQkgKiAgICAgICAgIGFuIGV4YWN0IG1hdGNoIGlzIG5vdCBmb3VuZCwgdGhlIG1vc3Qtc3BlY2lmaWMgbWF0Y2ggYWNjb3JkaW5nCi0JICogICAgICAgICB0byBJQ29udGVudFR5cGUuaXNLaW5kT2YoKSB3aWxsIGJlIHJldHVybmVkLiBJZiBub25lIGFyZSBmb3VuZCwKLQkgKiAgICAgICAgIGVpdGhlciBhIGRlZmF1bHQgb3IgbnVsbCB3aWxsIGJlIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBJTW9kZWxIYW5kbGVyIGdldEhhbmRsZXJGb3JDb250ZW50VHlwZUlkKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQlyZXR1cm4gZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkNjExZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MganVzdCBjb252ZXJ0cyB3aGF0J3MgaW4gdGhlIHBsdWdpbnMgcmVnaXN0cnkgaW50byBhIGZvcm0gbW9yZQotICogZWFzaWx5IHVzZWFibGUgYnkgb3RoZXJzLCB0aGUgQ29udGVudFR5cGVSZWdpc3RyeS4KLSAqLwotY2xhc3MgTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIgewotCXByaXZhdGUgSGFzaE1hcCBhbGxSZWFkeUNyZWF0ZUluc3RhbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIFN0cmluZyBBVFRfQVNTT0NJQVRFRF9DT05URU5UX1RZUEUgPSAiYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBBVFRfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzOwotCXByb3RlY3RlZCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gIm1vZGVsSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQkvLwotCXByb3RlY3RlZCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIFRBR19OQU1FID0gIm1vZGVsSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vCi0JLyoqCi0JICogQ29udGVudFR5cGVSZWdpc3RyeVJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCU1vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCVN0cmluZyBnZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQVNTT0NJQVRFRF9DT05URU5UX1RZUEUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JU3RyaW5nIGdldElkKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBpZFZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJcmV0dXJuIGlkVmFsdWU7Ci0JfQotCi0Jc3luY2hyb25pemVkIElNb2RlbEhhbmRsZXIgZ2V0SW5zdGFuY2UoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gTWF5IG5lZWQgdG8gcmVjb25zaWRlciwgYnV0IGZvciBub3csIHdlJ2xsIGFzc3VtZSBhbGwgY2xpZW50cyBtdXN0Ci0JCS8vIHN1YmNsYXNzIEFic3RyYWN0Q29udGVudFR5cGVJZGVudGlmaWVyLiBJdHMgZWFzaWVyIGFuZCBzYWZlciwgZm9yCi0JCS8vIHRoaXMKLQkJLy8gbG93IGxldmVsICJzeXN0ZW0iIG9iamVjdC4gKFRoYXQgaXMsIHdlIGNhbiBjaGVjayBhbmQgc2V0ICJwYWNrYWdlCi0JCS8vIHByb3RlY3RlZCIKLQkJLy8gYXR0cmlidXRlcy4KLQkJQWJzdHJhY3RNb2RlbEhhbmRsZXIgbW9kZWxIYW5kbGVyID0gKEFic3RyYWN0TW9kZWxIYW5kbGVyKSBhbGxSZWFkeUNyZWF0ZUluc3RhbmNlcy5nZXQoZ2V0SWQoZWxlbWVudCkpOwotCQlpZiAobW9kZWxIYW5kbGVyID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWxIYW5kbGVyID0gKEFic3RyYWN0TW9kZWxIYW5kbGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsKLQkJCQlpZiAobW9kZWxIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJYWxsUmVhZHlDcmVhdGVJbnN0YW5jZXMucHV0KGdldElkKGVsZW1lbnQpLCBtb2RlbEhhbmRsZXIpOwotCQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RFRkFVTFQpOwotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwgJiYgInRydWUiLmVxdWFscyhkZWZhdWx0VmFsdWUpKSAvLyROT04tTkxTLTEkCi0JCQkJCQltb2RlbEhhbmRsZXIuc2V0RGVmYXVsdCh0cnVlKTsKLQkJCQkJZWxzZQotCQkJCQkJbW9kZWxIYW5kbGVyLnNldERlZmF1bHQoZmFsc2UpOwotCQkJCQkvLyBUT0RPIC0tIHNldCBhbmQgY2hlY2sgYXR0cmlidXRlcyB2cy4gY3JlYXRlZCBpbnN0YW5jZQotCQkJCQkvL2NvbnRlbnRUeXBlSWRlbnRpZmllci5zZXRPckNoZWNrSWQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnREZWZhdWx0KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfREVGQVVMVCk7Ci0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiAidHJ1ZSIuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIgcmVhZFJlZ2lzdHJ5KCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQkvLyBqdXN0IHJlbWVtYmVyIHRoZSBlbGVtZW50cywgc28gcGx1Z2lucyBkb24ndCBoYXZlIHRvCi0JCQkvLyBiZSBhY3RpdmF0ZWQsIHVubGVzcyBleHRlbnNpb24gbWF0Y2hlcyB0aG9zZSAib2YgaW50ZXJlc3QiLgotCQkJZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJVdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYjJhNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotCi0vKioKLSAqIAotICogTGlrZWx5IGEgdGVtcG9yYXJ5IGNsYXNzIHRvIGJlIHJlcGxhY2VkIGJ5IHBsdWdpbiwgZXZlbnR1YWxseS4KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlclV0aWxpdHkgewotCi0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgY29udGVudFR5cGVSZWdpc3RyeTsKLQotCXB1YmxpYyBzdGF0aWMgSURvY3VtZW50VHlwZUhhbmRsZXIgZ2V0Q29udGVudFR5cGVGb3IoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gZ2V0Q29udGVudFR5cGVSZWdpc3RyeSgpLmdldEhhbmRsZXJGb3JDb250ZW50VHlwZUlkKHN0cmluZyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgZ2V0Q29udGVudFR5cGVSZWdpc3RyeSgpIHsKLQkJaWYgKGNvbnRlbnRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJY29udGVudFR5cGVSZWdpc3RyeSA9IE1vZGVsSGFuZGxlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRUeXBlUmVnaXN0cnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCXJldHVybiBnZXRFbWJlZGRlZENvbnRlbnRUeXBlRm9yKCJ0ZXh0L2h0bWwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRFbWJlZGRlZENvbnRlbnRUeXBlRm9yKFN0cmluZyBzdHJpbmcpIHsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBpbnN0YW5jZSA9IG51bGw7Ci0JCWluc3RhbmNlID0gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCkuZ2V0VHlwZUZvcihzdHJpbmcpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIE1vZGVsSGFuZGxlclV0aWxpdHkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9QbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyZTJkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9QbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiAKLSAqIENsaWVudHMgY2FuIG1ha2UgdXNlIG9mIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHRvIGhhbmRsZSB0aGUgb3B0aW9uYWwgYWRhcHRlcgotICogY2xhc3MgYW5kIGtleS4gVHlwaWNhbGx5LCBtYW55IGNsaWVudHMgdXNlIGEgdHlwaWNhbCBwYXR0ZXJuIG9mIHByb3ZpZGluZwotICogYW4gYWRhcHRlciBjbGFzcyBhbmQga2V5IGluIHRoZWlyIG51bGwgYXJndW1lbnQgY29uc3RydWN0b3IgYW55d2F5LCBzbwotICogdGhleSdkIG9ubHkgaGF2ZSB0byB1c2UgSUV4ZWN1dGFibGVFeHRlbnNpb24gaWYgdGhlIGZhY3Rvcnkgd2FzIGZvciBtb3JlCi0gKiB0aGFuIG9uZS4KLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlciB7Ci0JLy8JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX0FEQVBURVJLRVkgPSAiYWRhcHRlcktleUNsYXNzIjsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX1JFR0lTVEVSQURBUFRFUiA9ICJyZWdpc3RlckFkYXB0ZXJzIjsKLQkvLyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyIHJlYWRlciA9IG51bGw7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChyZWFkZXIgPT0gbnVsbCkgewotCQkJcmVhZGVyID0gbmV3IFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlcigpOwotCQl9Ci0JCXJldHVybiByZWFkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQVRUUl9DT05URU5UVFlQRSA9ICJjb250ZW50VHlwZUlkZW50aWZlcklkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY29udGVudFR5cGVGYWN0b3J5Q29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmFjdG9yaWVzKElEb2N1bWVudFR5cGVIYW5kbGVyIGhhbmRsZXIpIHsKLQkJcmV0dXJuIGxvYWRSZWdpc3RyeShoYW5kbGVyLmdldElkKCkpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEZhY3RvcmllcyhTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gbG9hZFJlZ2lzdHJ5KHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXJGYWN0b3J5IGxvYWRGYWN0b3J5RnJvbUNvbmZpZ3VyYXRpb25FbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBPYmplY3QgcmVxdWVzdGVyVHlwZSkgewotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkgewotCQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9DT05URU5UVFlQRSk7Ci0JCQlpZiAoIXJlcXVlc3RlclR5cGUuZXF1YWxzKGNvbnRlbnRUeXBlKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0NMQVNTKTsKLQkJCS8vCQkJU3RyaW5nIGFkYXB0ZXJLZXlDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfQURBUFRFUktFWSk7Ci0JCQkvLwkJCVN0cmluZyByZWdpc3RlckFkYXB0ZXJzID0KLQkJCS8vIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfUkVHSVNURVJBREFQVEVSKTsKLQotCQkJLy8gaWYgY2xhc3NOYW1lIGlzIG51bGwsIHRoZW4gbm8gb25lIGRlZmluZWQgdGhlIGV4dGVuc2lvbiBwb2ludAotCQkJLy8gZm9yIGFkYXB0ZXIgZmFjdG9yaWVzCi0JCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRSX0NMQVNTKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWYgYW4gZXJyb3Igb2NjdXJzIGhlcmUsIGl0cyBwcm9iYWJseSB0aGF0IHRoZSBwbHVnaW4KLQkJCQkJLy8gY291bGQgbm90IGJlIGZvdW5kL2xvYWRlZAotCQkJCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgY2xhc3M6ICIgKyBjbGFzc05hbWUsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWYgYW4gZXJyb3Igb2NjdXJzIGhlcmUsIGl0cyBwcm9iYWJseSB0aGF0IHRoZSBwbHVnaW4KLQkJCQkJLy8gY291bGQgbm90IGJlIGZvdW5kL2xvYWRlZCAtLSBidXQgaW4gYW55IGNhc2Ugd2UganVzdAotCQkJCQkvLyB3YW50Ci0JCQkJCS8vIHRvIGxvZyB0aGUgZXJyb3IgYW5kIGNvbnRpbnVlIHJ1bm5pbmcgYW5kIGJlc3Qgd2UgY2FuLgotCQkJCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgY2xhc3M6ICIgKyBjbGFzc05hbWUsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCS8vCQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCS8vCQkJCQlmYWN0b3J5ID0gb2xkQXR0cmlidXRlc0NvZGUoZWxlbWVudCwgZmFjdG9yeSwgY2xhc3NOYW1lLAotCQkJCS8vIHBsdWdpbik7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGxvYWRSZWdpc3RyeShPYmplY3QgY29udGVudFR5cGUpIHsKLQkJTGlzdCBmYWN0b3J5TGlzdCA9IG51bGw7IC8vIG5ldyBWZWN0b3IoKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoU1NFQ29yZVBsdWdpbi5JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJCS8vIHRoaXMgaXMgY2FsbGVkIGEgbG90LCBzbyBkb24ndCBjcmVhdGUgdmVjdG9yIHVubGVzcyByZWFsbHkKLQkJCQkvLyBuZWVkZWQKLQkJCQkvLyBUT0RPOiBjb3VsZCBldmVudHVhbGx5IGNhY2hlIGluIGEgaGFzaHRhYmxlLCBvciBzb21ldGhpbmcsCi0JCQkJLy8gdG8gYXZvaWQgcmVwZWF0IHByb2Nlc3NpbmcKLQkJCQlmYWN0b3J5TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGxvYWRGYWN0b3J5RnJvbUNvbmZpZ3VyYXRpb25FbGVtZW50KGVsZW1lbnRzW2ldLCBjb250ZW50VHlwZSk7Ci0JCQkJCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQkJCQlmYWN0b3J5TGlzdC5hZGQoZmFjdG9yeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5TGlzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Db250ZXh0UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Db250ZXh0UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWFmZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ29udGV4dFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIFJlZ2lvbnMgb2YgdGhpcyBjbGFzcyBhcmUgaW50ZW5kZWQgc3BlY2lmaWNhbGx5IGZvciBYTUwvSFRNTC9KU1BzLiBPdGhlcgotICogbGFuZ3VhZ2VzIG1heSBuZWVkIHRoZWlyIG93biBzdWJjbGFzc2VzLiAoU2VlIHRoZSB1cGRhdGVNb2RlbCBtZXRob2QpLgotICovCi1wdWJsaWMgY2xhc3MgQ29udGV4dFJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGg7Ci0KLQlwcm90ZWN0ZWQgaW50IGZTdGFydDsKLQlwcm90ZWN0ZWQgaW50IGZUZXh0TGVuZ3RoOwotCXByb3RlY3RlZCBTdHJpbmcgZlR5cGU7Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dFJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ29udGV4dFJlZ2lvbihTdHJpbmcgbmV3Q29udGV4dCwgaW50IG5ld1N0YXJ0LCBpbnQgbmV3VGV4dExlbmd0aCwgaW50IG5ld0xlbmd0aCkgewotCQlmVHlwZSA9IG5ld0NvbnRleHQ7Ci0JCWZTdGFydCA9IG5ld1N0YXJ0OwotCQlmVGV4dExlbmd0aCA9IG5ld1RleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBuZXdMZW5ndGg7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gaTsKLQotCX0KLQotCWJvb2xlYW4gYWxsTGV0dGVyT3JEaWdpdChTdHJpbmcgY2hhbmdlcykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkvLyBUT19ET19GVVRVUkU6IGNoZWNrIHRoYXQgYSBKYXZhIExldHRlciBvciBEaWdpdCBpcwotCQkJLy8gdGhlIHNhbWUgdGhpbmcgYXMgYW4gWE1MIGxldHRlciBvciBkaWdpdAotCQkJaWYgKCEoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjaGFuZ2VzLmNoYXJBdChpKSkpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlib29sZWFuIGFsbFdoaXRlU3BhY2UoU3RyaW5nIGNoYW5nZXMpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYW5nZXMuY2hhckF0KGkpKSkgewotCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlib29sZWFuIGNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdChTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBNYWtlIHN1cmUgd2UgYXJlIGluIGEgbm9uLXdoaXRlIHNwYWNlIGFyZWEKLQkJaWYgKChyZXF1ZXN0U3RhcnQgPD0gKGdldFRleHRFbmQoKSkpICYmIChhbGxMZXR0ZXJPckRpZ2l0KGNoYW5nZXMpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWJvb2xlYW4gY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIHdlIGFyZSBpbiB0aGUgIndoaXRlIHNwYWNlIiBhcmVhIG9mIGEgcmVnaW9uLCB0aGVuCi0JCS8vIHdlIGRvbid0IHdhbnQgdG8gaGFuZGxlLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkvLyB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uIGlzIGNvbnNpZGVyIGFueXdoZXJlIHRoYXQgd291bGQKLQkJLy8gbGVhdmUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoaXMgY2hhcmFjdGVyIGFuZCB0aGUgdGV4dCBwYXJ0LgotCQkvLyBhbmQgb2YgY291cnNlLCB3ZSBjYW4gaW5zZXJ0IHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSByZWdpb24KLQkJLy8KLQkJLy8gaWYgdGhlcmUgaXMgbm8gd2hpdGVzcGFjZSBpbiB0aGlzIHJlZ2lvbiwgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIKLQkJaWYgKGdldEVuZCgpID4gZ2V0VGV4dEVuZCgpKSB7Ci0JCQkvLyBubyBuZWVkIHRvIGFkZCBvbmUgdG8gZW5kIG9mIHRleHQsIGFzIHdlIHVzZWQgdG8sIHNpbmNlIHdlCi0JCQkvLyBjaGFuZ2UgZGVmaW5pdGlvbiBvZiBsZW5ndGggdG8gZXF1YXRlIHRvIG9mZnNldCBwbHVzIG9uZS4KLQkJCWlmIChyZXF1ZXN0U3RhcnQgPiBnZXRUZXh0RW5kKCkpIHsKLQkJCQkvLyBvaywgd2UgYXJlIGluIHRoZSB3aGl0ZXNwYWNlIHJlZ2lvbiwgc28gd2UgY2FuJ3QgaGFuZGxlLAotCQkJCS8vIHVubGVzcwotCQkJCS8vIHdlIGFyZSBqdXN0IGluc2VydGluZyB3aGl0ZXNwYWNlLgotCQkJCWlmIChhbGxXaGl0ZVNwYWNlKGNoYW5nZXMpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHBvc2l0aW9uKSB7Ci0KLQkJcmV0dXJuIGZTdGFydCA8PSBwb3NpdGlvbiAmJiBwb3NpdGlvbiA8IGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBzdHJpbmcpIHsKLQkJZlR5cGUgPSBzdHJpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgc2hvcnRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9IHNob3J0Q2xhc3NOYW1lICsgIi0tPiAiICsgZ2V0VHlwZSgpICsgIjogIiArIGdldFN0YXJ0KCkgKyAiLSIgKyBnZXRUZXh0RW5kKCkgKyAoZ2V0VGV4dEVuZCgpICE9IGdldEVuZCgpID8gKCIvIiArIGdldEVuZCgpKSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCS8vIE5PVEU6IGlmIHRoZSBkb2N1bWVudCBoZWxkIGJ5IGFueSByZWdpb24gaGFzIGJlZW4gdXBkYXRlZCBhbmQgdGhlCi0JCS8vIHJlZ2lvbiBvZmZzZXRzIGhhdmUgbm90Ci0JCS8vIHlldCBiZWVuIHVwZGF0ZWQsIHRoZSBvdXRwdXQgZnJvbSB0aGlzIG1ldGhvZCBpbnZhbGlkLgotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIHRoZSBmb3VyIHR5cGVzIHdlIHVzZWQgdG8gaGFuZGxlIGhlcmUsIGhhdmUgYWxsIGJlZW4gbW92ZWQgdG8KLQkJLy8gc3BlY2lmaWMgcmVnaW9uIGNsYXNzZXMuCi0JCS8vIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFCi0JCS8vIFhNTF9UQUdfQVRUUklCVVRFX05BTUUKLQkJLy8gWE1MX0NPTlRFTlQKLQkJLy8gWE1MX0NEQVRBX1RFWFQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Gb3JlaWduUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Gb3JlaWduUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYjVhMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wYXJzZXIvRm9yZWlnblJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBGb3JlaWduUmVnaW9uIGV4dGVuZHMgQ29udGV4dFJlZ2lvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBsYW5ndWFnZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc3Vycm91bmRpbmdUYWcgPSBudWxsOwotCi0JcHVibGljIEZvcmVpZ25SZWdpb24oU3RyaW5nIG5ld0NvbnRleHQsIGludCBuZXdTdGFydCwgaW50IG5ld1RleHRMZW5ndGgsIGludCBuZXdMZW5ndGgpIHsKLQkJc3VwZXIobmV3Q29udGV4dCwgbmV3U3RhcnQsIG5ld1RleHRMZW5ndGgsIG5ld0xlbmd0aCk7Ci0JfQotCi0JcHVibGljIEZvcmVpZ25SZWdpb24oU3RyaW5nIG5ld0NvbnRleHQsIGludCBuZXdTdGFydCwgaW50IG5ld1RleHRMZW5ndGgsIGludCBuZXdMZW5ndGgsIFN0cmluZyBuZXdMYW5ndWFnZSkgewotCQlzdXBlcihuZXdDb250ZXh0LCBuZXdTdGFydCwgbmV3VGV4dExlbmd0aCwgbmV3TGVuZ3RoKTsKLQkJc2V0TGFuZ3VhZ2UobmV3TGFuZ3VhZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExhbmd1YWdlKCkgewotCQlyZXR1cm4gbGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3Vycm91bmRpbmdUYWcoKSB7Ci0JCXJldHVybiBzdXJyb3VuZGluZ1RhZzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3TGFuZ3VhZ2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShqYXZhLmxhbmcuU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCWxhbmd1YWdlID0gbmV3TGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1N1cnJvdW5kaW5nVGFnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3Vycm91bmRpbmdUYWcoamF2YS5sYW5nLlN0cmluZyBuZXdTdXJyb3VuZGluZ1RhZykgewotCQlzdXJyb3VuZGluZ1RhZyA9IG5ld1N1cnJvdW5kaW5nVGFnOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRk9SRUlHTjogIiArIHN1cGVyLnRvU3RyaW5nKCk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0bm9kZSwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShjaGFuZ2VzLCBsZW5ndGhUb1JlcGxhY2UpOwotCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQoZmxhdG5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBmbGF0bm9kZSwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2VmMjc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMgYXJlIG5vdyBtYW5hZ2VkIGJ5IGVhY2ggaW5kaXZpZHVhbAotICogICAgICAgICAgICAgY29udGVudCB0eXBlLiAoWFhDb3JlUHJlZmVyZW5jZU5hbWVzKQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMgewotCVN0cmluZyBUQUJfV0lEVEggPSAidGFiV2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTElORV9XSURUSCA9ICJsaW5lV2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU1BMSVRfTVVMVElfQVRUUlMgPSAic3BsaXRNdWx0aUF0dHJzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElOREVOVF9VU0lOR19UQUJTID0gImluZGVudFVzaW5nVGFicyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDTEVBUl9BTExfQkxBTktfTElORVMgPSAiY2xlYXJBbGxCbGFua0xpbmVzIjsvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFHX05BTUVfQ0FTRSA9ICJ0YWdOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfQ0FTRSA9ICJhdHRyTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBGT1JNQVRUSU5HX1NVUFBPUlRFRCA9ICJmb3JtYXR0aW5nU3VwcG9ydGVkIjsvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgUFJFRkVSUkVEX01BUktVUF9DQVNFX1NVUFBPUlRFRCA9ICJwcmVmZXJyZWRNYXJrdXBDYXNlU3VwcG9ydGVkIjsvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFTS19UQUdfVEFHUyA9ICJ0YXNrLXRhZy10YWdzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQVNLX1RBR19QUklPUklUSUVTID0gInRhc2stdGFnLXByaW9yaXRpZXMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBU0tfVEFHX0VOQUJMRSA9ICJ0YXNrLXRhZ3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBU0tfVEFHX1BST0pFQ1RTX0lHTk9SRUQgPSAidGFzay10YWctcHJvamVjdHMtdG9JZ25vcmUiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIHRoZXNlIGFyZSBwcmVmZXJlbmNlcyB0aGF0IHNob3VsZCBiZSBpbmhlcml0ZWQgZnJvbSB0aGUgImVtYmVkZGVkCi0JICogcHJlZmVyZW5jZSBzdG9yZSIgZm9yIGV4YW1wbGU6IGlmIHlvdSBhc2sgZm9yIHRoIE9WRVJWSUVXX1JVTEVSCi0JICogcHJlZmVyZW5jZSBmb3IgSlNQLCB5b3Ugd2lsbCBhdXRvbWF0aWNhbGx5IGdldCB0aGUgcHJlZmVyZW5jZSBmcm9tIHRoZQotCSAqIEhUTUwgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlTdHJpbmcgRU1CRURERURfQ09OVEVOVF9UWVBFX1BSRUZFUkVOQ0VTW10gPSB7VEFCX1dJRFRILCBMSU5FX1dJRFRILCBTUExJVF9NVUxUSV9BVFRSUywgSU5ERU5UX1VTSU5HX1RBQlMsIENMRUFSX0FMTF9CTEFOS19MSU5FUywgVEFHX05BTUVfQ0FTRSwgQVRUUl9OQU1FX0NBU0UsfTsKLQotCVN0cmluZyBGT1JNQVRUSU5HX1BSRUZFUkVOQ0VTW10gPSB7VEFCX1dJRFRILCBMSU5FX1dJRFRILCBTUExJVF9NVUxUSV9BVFRSUywgSU5ERU5UX1VTSU5HX1RBQlMsIENMRUFSX0FMTF9CTEFOS19MSU5FUyx9OwotCi0JU3RyaW5nIEFVVE8gPSAiQXV0byI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBVVEZfOCA9ICJVVEYtOCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBJU09fODg1OV8xID0gIklTTy04ODU5LTEiOy8vJE5PTi1OTFMtMSQKLQotCWludCBBU0lTID0gMDsKLQlpbnQgTE9XRVIgPSAxOwotCWludCBVUFBFUiA9IDI7Ci0KLQkvLyBjbGVhbnVwIHByZWZlcmVuY2UgbmFtZXMKLQlTdHJpbmcgQ0xFQU5VUF9UQUdfTkFNRV9DQVNFID0gImNsZWFudXBUYWdOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDTEVBTlVQX0FUVFJfTkFNRV9DQVNFID0gImNsZWFudXBBdHRyTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTID0gImNvbXByZXNzRW1wdHlFbGVtZW50VGFncyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBJTlNFUlRfUkVRVUlSRURfQVRUUlMgPSAiaW5zZXJ0UmVxdWlyZWRBdHRycyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBJTlNFUlRfTUlTU0lOR19UQUdTID0gImluc2VydE1pc3NpbmdUYWdzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFFVT1RFX0FUVFJfVkFMVUVTID0gInF1b3RlQXR0clZhbHVlcyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBGT1JNQVRfU09VUkNFID0gImZvcm1hdFNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05WRVJUX0VPTF9DT0RFUyA9ICJjb252ZXJ0RU9MQ29kZXMiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0xFQU5VUF9FT0xfQ09ERSA9ICJjbGVhbnVwRU9MQ29kZSI7Ly8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIExBU1RfQUNUSVZFX1BBR0UgPSAibGFzdEFjdGl2ZVBhZ2UiOy8vJE5PTi1OTFMtMSQJCi0KLQkvLyBuZWVkIHRvIHB1dCBkZWZhdWx0IHRhYiB3aWR0aCBwcmVmZXJlbmNlIGhlcmUgc28gaXQgaXMgYWNjZXNzaWJsZSBieQotCS8vIGJvdGggbW9kZWwgYW5kIGVkaXRvcgotCS8vIHRoaXMgd2F5LCBlZGl0b3IgZG9lcyBub3QgbmVlZCB0byBxdWVyeSBtb2RlbCdzIGRlZmF1bHQgdGFiIHdpZHRoCi0JLy8gcHJlZmVyZW5jZQotCWludCBERUZBVUxUX1RBQl9XSURUSCA9IDQ7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwNTYzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5UYXNrVGFnUHJlZmVyZW5jZUtleXM7Ci0KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyB0YXNrVGFnRGVmYXVsdHMgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSk7Ci0JCXRhc2tUYWdEZWZhdWx0cy5wdXRCb29sZWFuKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUsIGZhbHNlKTsKLQkJdGFza1RhZ0RlZmF1bHRzLnB1dChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUywgIlRPRE8sRklYTUUsWFhYIik7IC8vJE5PTi1OTFMtMSQKLQkJdGFza1RhZ0RlZmF1bHRzLnB1dChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUywgIjEsMiwxIik7IC8vJE5PTi1OTFMtMSQKLQkJdGFza1RhZ0RlZmF1bHRzLnB1dChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvcGVydHl0ZXN0ZXIvU3RydWN0dXJlZEZpbGVQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm9wZXJ0eXRlc3Rlci9TdHJ1Y3R1cmVkRmlsZVByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NGJjMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm9wZXJ0eXRlc3Rlci9TdHJ1Y3R1cmVkRmlsZVByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm9wZXJ0eXRlc3RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBBIFByb3BlcnR5IFRlc3RlciB0aGF0IG9wZXJhdGVzIG9uIElGaWxlcyBhbmQgdmFsaWRhdGVzCi0gKiB0aGF0IHRoZSBleHBlY3RlZCBjb250ZW50IHR5cGUgaWQgbWF0Y2hlcyB0aGF0IG9mIHRoZSBjb250ZW50Ci0gKiB0eXBlIG9mIHRoZSBmaWxlLCBvciBhbnkgb2YgdGhlIGJhc2UgY29udGVudCB0eXBlcy4KLSAqIAotICogQmFzZWQgb24gb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5wcm9wZXJ0eXRlc3Rlci5GaWxlUHJvcGVydHlUZXN0ZXIKLSAqIAotICogQGRlcHJlY2F0ZWQgdXNlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQgaW5zdGVhZAotICogCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg4MjE2IAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEZpbGVQcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKLQotCS8qKgotCSAqIEEgcHJvcGVydHkgaW5kaWNhdGluZyB0aGF0IHdlIGFyZSBsb29raW5nIHRvIHZlcmlmeSB0aGF0IHRoZSBmaWxlIG1hdGNoZXMKLQkgKiB0aGUgY29udGVudCB0eXBlIG1hdGNoaW5nIHRoZSBnaXZlbiBpZGVudGlmaWVyLiBUaGUgaWRlbnRpZmllciBpcwotCSAqIHByb3ZpZGVkIGFzIHRoZSBleHBlY3RlZCB2YWx1ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ09OVEVOVF9UWVBFX0lEID0gImNvbnRlbnRUeXBlSWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLklQcm9wZXJ0eVRlc3RlciN0ZXN0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlpZihQUk9QRVJUWV9DT05URU5UX1RZUEVfSUQuZXF1YWxzKHByb3BlcnR5KSAmJiAoZXhwZWN0ZWRWYWx1ZSAhPSBudWxsKSAmJiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKChJRmlsZSkgcmVjZWl2ZXIpLmV4aXN0cygpKQotCQkJcmV0dXJuIHRlc3RDb250ZW50VHlwZSgoSUZpbGUpIHJlY2VpdmVyLCBleHBlY3RlZFZhbHVlLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgdGhlIGNvbnRlbnQgdHlwZSBmb3IgPGNvZGU+ZmlsZTwvY29kZT4gKG9yIGFueSBiYXNlIGNvbnRlbnQgdHlwZXMpIAotCSAqIG1hdGNoZXMgdGhlIDxjb2RlPmNvbnRlbnRUeXBlSWQ8L2NvZGU+LiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoaXMgbWV0aG9kIGNhbGwgY291bGQKLQkgKiBjYXVzZSB0aGUgZmlsZSB0byBiZSByZWFkLiBJdCBpcyBhbHNvIHBvc3NpYmxlICh0aHJvdWdoIHBvb3IgcGx1Zy1pbgotCSAqIGRlc2lnbikgZm9yIHRoaXMgbWV0aG9kIHRvIGxvYWQgcGx1Zy1pbnMuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIGZvciB3aGljaCB0aGUgY29udGVudCB0eXBlIHNob3VsZCBiZSBkZXRlcm1pbmVkOyBtdXN0Ci0JICogICAgICAgICAgICBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSWQKLQkgKiAgICAgICAgICAgIFRoZSBleHBlY3RlZCBjb250ZW50IHR5cGU7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUncyBjb250ZW50IHR5cGUgKG9yIGJhc2UgY29udGVudCB0eXBlcykgCi0JICogICAgICAgICBoYXMgYW4gaWRlbnRpZmllciB0aGF0IG1hdGNoZXMgPGNvZGU+Y29udGVudFR5cGVJZDwvY29kZT47Ci0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB0ZXN0Q29udGVudFR5cGUoZmluYWwgSUZpbGUgZmlsZSwgU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJZmluYWwgU3RyaW5nIGV4cGVjdGVkVmFsdWUgPSBjb250ZW50VHlwZUlkLnRyaW0oKTsKLQotCQl0cnkgewotCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJd2hpbGUgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKGV4cGVjdGVkVmFsdWUuZXF1YWxzKGNvbnRlbnRUeXBlLmdldElkKCkpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuZ2V0QmFzZVR5cGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBbMjMyODMxXSAtIExvZyBtZXNzYWdlcyBvbmx5IHdoZW4gZGVidWdnaW5nCi0JCQlpZihMb2dnZXIuREVCVUcpCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Fic3RyYWN0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhOWM4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Fic3RyYWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBJQWRhcHRlckZhY3RvcnkuIEFsbCBpbXBsZW1lbnRlcnMgb2YKLSAqIElBZGFwdGVyRmFjdG9yeSBzaG91bGQgc3ViY2xhc3MgdGhpcyBjbGFzcy4gVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgdXNlcwotICogaXRzZWxmICh0aGlzKSBhcyB0aGUga2V5LiBTdWJjbGFzc2VzIG5lZWQgdG8gcHJvdmlkZSBhIHdheSB0byBjcmVhdGUgdGhlCi0gKiBhZGFwdGVyLCBhbmQgY2FuIG92ZXJyaWRlIG9yIGNhbGwgb3RoZXIgbWV0aG9kcy4KLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQotCi0KLQlwcml2YXRlIE9iamVjdCBmQWRhcHRlcktleTsKLQotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkUmVnaXN0ZXJBZGFwdGVyOwotCi0JLyoqCi0JICogSWYgdGhpcyBkZWZhdWx0IGNvbnN0cnVjdG9yIHVzZWQsIHNldEFkYXB0ZXJLZXkgYW5kIHNldFNob3VsZFJlZ2lzdGVyCi0JICogc2hvdWxkIGJlIHVzZWQgdG8gcHJvcGVybHkgaW5pdGlhbGl6ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQotCX0KLQotCi0JcHVibGljIEFic3RyYWN0QWRhcHRlckZhY3RvcnkoT2JqZWN0IGFkYXB0ZXJLZXkpIHsKLQkJdGhpcyhhZGFwdGVyS2V5LCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWNsYXNzZXMgbWF5IGV4dGVuZGVkIHRoaXMgY29uc3RydWN0b3IsIGlmIG5lZWRlZC4KLQkgKi8KLQotCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5KE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQotCQlzdXBlcigpOwotCQlmQWRhcHRlcktleSA9IGFkYXB0ZXJLZXk7Ci0JCWZTaG91bGRSZWdpc3RlckFkYXB0ZXIgPSByZWdpc3RlckFkYXB0ZXJzOwotCi0JfQotCi0JLyoqCi0JICogSVNTVUU6IHNob3VsZCBiZSBmaW5hbC4gU2VlIHRob3NlIHRoYXQgaW1wbGVtZW50IGl0IAotCSAqIGZvciBjb21wbGljYXRpbmcgZGV0YWlscyBhbmQgInVua25vd25zIi4gCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJYWRhcHRlciA9IHRhcmdldC5nZXRFeGlzdGluZ0FkYXB0ZXIoZkFkYXB0ZXJLZXkpOwotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCWFkYXB0ZXIgPSBhZGFwdE5ldyh0YXJnZXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG5vcm1hbGx5IGltcGxlbWVudCB0aGVpciBvd24gJ2NvcHknIG1ldGhvZC4gQnkKLQkgKiBkZWZhdWx0LCB3ZSdsbCByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2UsIGZvciBjb252ZW5pZW5jZSBvZiB0aG9zZSB1c2luZwotCSAqIHNpbmdsZXRvbiBmYWN0b3JpZXMgKHdoaWNoIGhhdmUgbm8gc3RhdGUsIGFuZCBzbyBuZWVkIHRvIGRvIGFueXRoaW5nIG9uCi0JICogJ3JlbGVhc2UnKS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBuZWVkcyB0byByZXR1cm4gdHJ1ZSBvZiB0aGlzIGZhY3RvcnkgaXMgZm9yIGFkYXB0ZXJzIG9mCi0JICogdHlwZSAndHlwZScuIEl0IGlzIHJlcXVpcmVkIHRoYXQgaXQgcmV0dXJuIHRydWUgaWYgJ2VxdWFscycgYW5kIHRoaXMKLQkgKiBkZWZhdWx0IGJlaGF2aW9yIGlzIHByb3ZpZGVkIGJ5IHRoaXMgc3VwZXIgY2xhc3MuIENsaWVudHMgbWF5IGV4dGVuZAotCSAqIHRoaXMgYmVoYXZpb3IgaWYgbW9yZSBjb21wbGV4IGxvZ2ljIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKGZBZGFwdGVyS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBuZWVkIHRvICJjbGVhbnVwIiB0aGVpciBhZGFwdGVyIGZhY3RvcnksIHJlbGVhc2UKLQkgKiBhZGFwdGVycywgcmVzb3VyY2VzLCBldGMuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCBpZiBzdWNoCi0JICogY2xlYW4gdXAgaXMgcmVxdWlyZWQuIE5vdGU6IHdoaWxlIGN1cnJlbnQgYmVoYXZpb3IgaXMgdG8gZG8gbm90aGluZywKLQkgKiBzdWJjbGFzc2VzIHNob3VsZCBub3QgYXNzdW1lIHRoaXMgd291bGQgYWx3YXlzIGJlIHRydWUsIHNvIHNob3VsZAotCSAqIGFsd2F5cyBjYWxsIHN1cGVyLnJlbGVhc2UgYXQgdGhlIGVuZCBvZiB0aGVpciBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZGVmYXVsdCBmb3Igc3VwZXJjbGFzcyBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogT25seSBmb3Igc3BlY2lhbCBjYXNlcyB0aGVyZSB0aGUgYWRhcHRlciBrZXkgY2FuIGJlIHNldCBpbiB0aGUKLQkgKiBjb25zdHJ1Y3Rvci4gSXQgY2FuIGJlIHNldCBoZXJlLiBJZiBpdCBpcyBzZXQgbW9yZSB0aGFuLCBhbmQKLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBzZXRBZGFwdGVyS2V5KE9iamVjdCBrZXkpIHsKLQkJaWYgKGZBZGFwdGVyS2V5ICE9IG51bGwgJiYgIShmQWRhcHRlcktleS5lcXVhbHMoa2V5KSkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJTm9kZUFkYXB0ZXIgS2V5IGNhbm5vdCBiZSBjaGFuZ2VkLiIpOyAvLyROT04tTkxTLTEkCi0JCWZBZGFwdGVyS2V5ID0ga2V5OwotCX0KLQotCS8qKgotCSAqIENhbiBiZSBjYWxsZWQgYnkgc3ViY2xhc3NlcyBkdXJpbmcgJ2FkYXB0JyBwcm9jZXNzLCBidXQgbXVzdCBub3QgYmUKLQkgKiBvdmVycmlkZGVuIG9yIHJlaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJTm9kZUFkYXB0ZXIgYWRhcHROZXcoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVBZGFwdGVyKHRhcmdldCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWlmIChmU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKSB7Ci0JCQkJdGFyZ2V0LmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZC4gSXQgaXMgY2FsbGVkIGJ5IGluZnJhc3RydWN0dXJlCi0JICogd2hlbiBhbiBpbnN0YW5jZSBpcyBuZWVkZWQuIEl0IGlzIHByb3ZpZGVkIHRoZSBub2RlIG5vdGlmaWVyLCB3aGljaCBtYXkKLQkgKiBvciBtYXkgbm90IGJlIHJlbGV2ZW50IHdoZW4gY3JlYXRpbmcgdGhlIGFkYXB0ZXIuIE5vdGU6IHRoZSBhZGFwdGVyCi0JICogZG9lcyBub3QgaGF2ZSB0byBsaXRlcmFsbHkgYmUgYSBuZXcgaW50YW5jZSBhbmQgaXMgYWN0dWFsbHkgcmVjb21tZW5kZWQKLQkgKiB0byB0eXBpY2FsbHkgYmUgYSBzaW5nbGV0b24gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEByZXR1cm4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpOwotCi0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIGZTaG91bGRSZWdpc3RlckFkYXB0ZXI7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRTaG91bGRSZWdpc3RlckFkYXB0ZXIoYm9vbGVhbiBzaG91bGRSZWdpc3RlckFkYXB0ZXIpIHsKLQkJLy8gSVNTVUU6IHRlY2huaWNhbGx5IHdlIHByb2JhYmx5IHNob3VsZCBub3QgYWxsb3cgdGhpcyB2YWx1ZSB0bwotCQkvLyBjaGFuZ2UsIGFmdGVyIGluaXRpYWxpemF0aW9uLCBidXQgaXMgbm90IHNvIGVhc3kgdG8gZG8sCi0JCS8vIGFuZCBJJ20gbm90IHN1cmUgaXRzICJ3b3J0aCIgdGhlIHByb3RlY3Rpb24uCi0JCWZTaG91bGRSZWdpc3RlckFkYXB0ZXIgPSBzaG91bGRSZWdpc3RlckFkYXB0ZXI7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGdldEFkYXB0ZXJLZXkoKSB7Ci0JCXJldHVybiBmQWRhcHRlcktleTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Fic3RyYWN0Tm90aWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQWJzdHJhY3ROb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjE4NDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQWJzdHJhY3ROb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci0KLQotCi0vKioKLSAqIEFic3RyYWN0Tm90aWZpZXIgaXMgc2ltaWxhciB0byAoYW5kIGJhc2VkIG9uKSB0aGUgRU1GIE5vdGlmaWVySW1wbCBjbGFzcywKLSAqIGJ1dCBpcyBub3QgcmVsYXRlZCB0byBFTUYgcGVyIHNlLiBUaGlzIGNsYXNzIGlzIHNpbXBsZXIgKHRoYXQgaXMsIG5vdCBhcwotICogbWFueSBmdW5jdGlvbnMpLgotICogCi0gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBJTm9kZU5vdGlmaWVyIG11c3Qgc3ViY2xhc3MgdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm90aWZpZXIgaW1wbGVtZW50cyBJTm9kZU5vdGlmaWVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgZ3Jvd3RoQ29uc3RhbnQgPSAzOwotCXByaXZhdGUgaW50IGFkYXB0ZXJDb3VudCA9IDA7Ci0KLQlwcml2YXRlIElOb2RlQWRhcHRlcltdIGZBZGFwdGVyczsKLQotCS8qKgotCSAqIEFic3RyYWN0Tm90aWZpZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3ROb3RpZmllcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGRBZGFwdGVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRBZGFwdGVyKElOb2RlQWRhcHRlciBhZGFwdGVyKSB7Ci0KLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZW5zdXJlQ2FwYWNpdHkoYWRhcHRlckNvdW50ICsgMSk7Ci0JCWZBZGFwdGVyc1thZGFwdGVyQ291bnQrK10gPSBhZGFwdGVyOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZW5zdXJlQ2FwYWNpdHkoaW50IG5lZWRlZCkgewotCQlpZiAoZkFkYXB0ZXJzID09IG51bGwpIHsKLQkJCS8vIGZpcnN0IHRpbWUKLQkJCWZBZGFwdGVycyA9IG5ldyBJTm9kZUFkYXB0ZXJbbmVlZGVkICsgZ3Jvd3RoQ29uc3RhbnRdOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBvbGRMZW5ndGggPSBmQWRhcHRlcnMubGVuZ3RoOwotCQlpZiAob2xkTGVuZ3RoIDwgbmVlZGVkKSB7Ci0JCQlJTm9kZUFkYXB0ZXJbXSBvbGRBZGFwdGVycyA9IGZBZGFwdGVyczsKLQkJCUlOb2RlQWRhcHRlcltdIG5ld0FkYXB0ZXJzID0gbmV3IElOb2RlQWRhcHRlcltuZWVkZWQgKyBncm93dGhDb25zdGFudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEFkYXB0ZXJzLCAwLCBuZXdBZGFwdGVycywgMCwgYWRhcHRlckNvdW50KTsKLQkJCWZBZGFwdGVycyA9IG5ld0FkYXB0ZXJzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTk9UIEFQSTogdXNlZCBvbmx5IGZvciB0ZXN0aW5nLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRBZGFwdGVyQ291bnQoKSB7Ci0JCXJldHVybiBhZGFwdGVyQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBiZWhhdmlvciBmb3IgZ2V0dGluZyBhbiBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSU5vZGVBZGFwdGVyIGdldEFkYXB0ZXJGb3IoT2JqZWN0IHR5cGUpIHsKLQkJLy8gZmlyc3QsIHdlJ2xsIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgb25lCi0JCUlOb2RlQWRhcHRlciByZXN1bHQgPSBnZXRFeGlzdGluZ0FkYXB0ZXIodHlwZSk7Ci0JCS8vIGlmIHdlIGRpZG4ndCBmaW5kIG9uZSBpbiBvdXIgbGlzdCBhbHJlYWR5LAotCQkvLyBsZXQncyBjcmVhdGUgaXQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlGYWN0b3J5UmVnaXN0cnkgcmVnID0gZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCQlpZiAocmVnICE9IG51bGwpIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSByZWcuZ2V0RmFjdG9yeUZvcih0eXBlKTsKLQkJCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IGZhY3RvcnkuYWRhcHQodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJLy8gV2Ugd29uJ3QgcHJldmVudCBudWxsIGZyb20gYmVpbmcgcmV0dXJuZWQsIGJ1dCBpdCB3b3VsZCBiZQotCQkJLy8gdW51c3VhbC4KLQkJCS8vIEl0IG1pZ2h0IGJlIGJlY2F1c2UgRmFjdG9yeSBpcyBub3Qgd29ya2luZyBjb3JyZWN0bHksIG9yCi0JCQkvLyBub3QgaW5zdGFsbGVkLCBzbyB3ZSdsbCBhbGxvdyB3YXJuaW5nIG1lc3NhZ2UuCi0JCQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcuZGlzcGxheVdhcm5pbmdzKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogbm8gYWRhcHRlciB3YXMgZm91bmQgb3IgY3JlYXRlZCBmb3IgIiArIHR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjbG9uZSBvZiBsaXN0LCBzaW5jZSBjbGllbnRzIHNob3VsZCBub3QgbWFuaXB1bGF0ZQotCSAqIG91ciBsaXN0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCB1c2UgYWRkL3JlbW92ZUFkYXB0ZXIuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uIGdldEFkYXB0ZXJzKCkgewotCQlpZiAoZkFkYXB0ZXJzICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyQ291bnQgPT0gMCkgewotCQkJCWZBZGFwdGVycyA9IG51bGw7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBuZWVkIHRvIG1ha2UgYSBuZXcgYXJyYXksIHRvIGJlIHN1cmUKLQkJCQkvLyBpdCBkb2Vzbid0IGNvbnRhaW4gbnVsbHMgYXQgZW5kLCB3aGljaCBtYXkgYmUKLQkJCQkvLyBwcmVzZW50IHRoZXJlIGZvciAiZ3Jvd3RoIi4KLQkJCQlJTm9kZUFkYXB0ZXJbXSB0ZW1wQWRhcHRlcnMgPSBuZXcgSU5vZGVBZGFwdGVyW2FkYXB0ZXJDb3VudF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShmQWRhcHRlcnMsIDAsIHRlbXBBZGFwdGVycywgMCwgYWRhcHRlckNvdW50KTsKLQkJCQkvLyBFTUYgdXNlcyB0aGUgdW5tb2RpZmlhYmxlQ29sbGVjdGlvbi4gSXRzIGEgYml0IG9mIGEKLQkJCQkvLyBwZXJmb3JtYW5jZQotCQkJCS8vIGRyYWluLCBidXQgbWF5IHdhbnQgdG8gbGVhdmUgaW4gc2luY2UKLQkJCQkvLyBpdCB3b3VsZCAiZmFpbCBmYXN0IiBpZiBzb21lb25lIHdhcyB0cnlpbmcgdG8gbW9kaWZ5IHRoZQotCQkJCS8vIGxpc3QuCi0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oQXJyYXlzLmFzTGlzdCh0ZW1wQWRhcHRlcnMpKTsKLQkJCQkvLyByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXdBZGFwdGVycyk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHJpdmF0ZSBsb25nIGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEoKSB7Ci0JCS8vIHRvICJyZS1nZXQiIHRoZSBwcm9wZXJ0eSBlYWNoIHRpbWUgaXMgYSBsaXR0bGUgYXdrd2FyZCwgYnV0IHdlCi0JCS8vIGRvIGl0IHRoYXQgd2F5IHRvIGF2b2lkIGFkZGluZyBpbnN0YW5jZSB2YXJpYWJsZSBqdXN0IGZvcgotCQkvLyBkZWJ1Z2dpbmcuCi0JCS8vIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBkZWJ1Z0FkYXB0ZXJOb3RpZmNhdGlvblRpbWUKLQkJLy8gaXMgdHJ1ZS4KLQkJZmluYWwgU3RyaW5nIGNyaXRlcmlhU3RyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb20vYWRhcHRlci9ub3RpZmljYXRpb24vdGltZS9jcml0ZXJpYSIpOyAvLyROT04tTkxTLTEkCi0JCWxvbmcgY3JpdGVyaWEgPSAtMTsKLQkJaWYgKGNyaXRlcmlhU3RyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJY3JpdGVyaWEgPSBMb25nLnBhcnNlTG9uZyhjcml0ZXJpYVN0cik7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjYXRjaCB0byBiZSBzdXJlIHdlIGRvbid0IGJ1cmIgaW4gbm90aWZpY2F0aW9uIGxvb3AsCi0JCQkJLy8gYnV0IGlnbm9yZSwgc2luY2UganVzdCBhIGRlYnVnIGFpZAotCQkJfQotCQl9Ci0JCXJldHVybiBjcml0ZXJpYTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIElOb2RlQWRhcHRlciBnZXRFeGlzdGluZ0FkYXB0ZXIoT2JqZWN0IHR5cGUpIHsKLQkJSU5vZGVBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlckNvdW50OyBpKyspIHsKLQkJCUlOb2RlQWRhcHRlciBhID0gZkFkYXB0ZXJzW2ldOwotCQkJaWYgKGEgIT0gbnVsbCAmJiBhLmlzQWRhcHRlckZvclR5cGUodHlwZSkpIHsKLQkJCQlyZXN1bHQgPSBhOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIGlmIHdlIGRpZG4ndCBmaW5kIG9uZSBpbiBvdXIgbGlzdCwKLQkJLy8gcmV0dXJuIHRoZSBudWxsIHJlc3VsdAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWFic3RyYWN0IHB1YmxpYyBGYWN0b3J5UmVnaXN0cnkgZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnkoaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCi0JCWludCBsb2NhbEFkYXB0ZXJDb3VudCA9IDA7Ci0JCUlOb2RlQWRhcHRlcltdIGxvY2FsQWRhcHRlcnMgPSBudWxsOwotCi0JCS8vIGxvY2sgb2JqZWN0IHdoaWxlIG1ha2luZyBsb2NhbCBhc3NpZ25tZW50cwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmIChmQWRhcHRlcnMgIT0gbnVsbCkgewotCQkJCWxvY2FsQWRhcHRlckNvdW50ID0gYWRhcHRlckNvdW50OwotCQkJCWxvY2FsQWRhcHRlcnMgPSBuZXcgSU5vZGVBZGFwdGVyW2xvY2FsQWRhcHRlckNvdW50XTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZBZGFwdGVycywgMCwgbG9jYWxBZGFwdGVycywgMCwgbG9jYWxBZGFwdGVyQ291bnQpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEFkYXB0ZXJDb3VudDsgaSsrKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYSA9IGxvY2FsQWRhcHRlcnNbaV07Ci0KLQkJCWlmIChMb2dnZXIuREVCVUdfQURBUFRFUk5PVElGSUNBVElPTlRJTUUpIHsKLQkJCQlsb25nIGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEgPSBnZXRBZGFwdGVyVGltZUNyaXRlcmlhKCk7Ci0JCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkvLyAqKiBrZWVwIHRoaXMgbGluZSBpZGVudGljYWwgd2l0aCBub24tZGVidWcgdmVyc2lvbiEhCi0JCQkJYS5ub3RpZnlDaGFuZ2VkKHRoaXMsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLQkJCQlsb25nIG5vdGlmeUR1cmF0aW9uID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQkJaWYgKGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEgPj0gMCAmJiBub3RpZnlEdXJhdGlvbiA+IGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGFwdGVyIG5vdGlmeUR1cmF0aW9uOiAiICsgbm90aWZ5RHVyYXRpb24gKyAiICBjbGFzczogIiArIGEuZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXRyeSB7Ci0JCQkJCS8vICoqIGtlZXAgdGhpcyBsaW5lIGlkZW50aWNhbCB3aXRoIGRlYnVnIHZlcnNpb24hIQotCQkJCQlhLm5vdGlmeUNoYW5nZWQodGhpcywgZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSXRzIGltcG9ydGFudCB0byAia2VlcCBnb2luZyIsIHNpbmNlIG5vdGlmaWNhdGlvbnMKLQkJCQkJLy8gb2NjdXIgYmV0d2VlbiBhbgotCQkJCQkvLyBhYm91dFRvQ2hhbmdlIGV2ZW50IGFuZCBhIGNoYW5nZWQgZXZlbnQgLS0gdGhlCi0JCQkJCS8vIGNoYW5nZWQgZXZlbnQgdHlwaWNhbGx5IGJlaW5nIHJlcXVpcmUKLQkJCQkJLy8gdG8gcmVzdG9yZSBzdGF0ZSwgZXRjLiBTbywgd2UganVzdCBsb2cgbWVzc2FnZSwgZG8KLQkJCQkJLy8gbm90IHJlLXRocm93IGl0LCBidXQKLQkJCQkJLy8gdHlwaWNhbGx5IHRoZSBleGNlcHRpb24gZG9lcyBpbmRpY2F0ZSBhIHNlcmlvdXMKLQkJCQkJLy8gcHJvZ3JhbSBlcnJvci4KLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQSBzdHJ1Y3R1cmVkIG1vZGVsIGNsaWVudCwgIiArIGEgKyAiIHRocmV3IGZvbGxvd2luZyBleGNlcHRpb24gZHVyaW5nIGFkYXB0ZXIgbm90aWZpY2F0aW9uICgiICsgSU5vZGVOb3RpZmllci5FVkVOVF9UWVBFX1NUUklOR1NbZXZlbnRUeXBlXSArICIgKSIsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCX0KLQotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUFkYXB0ZXIoSU5vZGVBZGFwdGVyIGEpIHsKLQkJaWYgKGZBZGFwdGVycyA9PSBudWxsIHx8IGEgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG5ld0luZGV4ID0gMDsKLQkJSU5vZGVBZGFwdGVyW10gbmV3QWRhcHRlcnMgPSBuZXcgSU5vZGVBZGFwdGVyW2ZBZGFwdGVycy5sZW5ndGhdOwotCQlpbnQgb2xkQWRhcHRlckNvdW50ID0gYWRhcHRlckNvdW50OwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IG9sZEluZGV4ID0gMDsgb2xkSW5kZXggPCBvbGRBZGFwdGVyQ291bnQ7IG9sZEluZGV4KyspIHsKLQkJCUlOb2RlQWRhcHRlciBjYW5kaWRhdGUgPSBmQWRhcHRlcnNbb2xkSW5kZXhdOwotCQkJaWYgKGEgPT0gY2FuZGlkYXRlKSB7Ci0JCQkJYWRhcHRlckNvdW50LS07Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfQotCQkJZWxzZQotCQkJCW5ld0FkYXB0ZXJzW25ld0luZGV4KytdID0gZkFkYXB0ZXJzW29sZEluZGV4XTsKLQkJfQotCQlpZiAoZm91bmQpCi0JCQlmQWRhcHRlcnMgPSBuZXdBZGFwdGVyczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvRG9jdW1lbnRDaGFuZ2VkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0RvY3VtZW50Q2hhbmdlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDdhNGVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvRG9jdW1lbnRDaGFuZ2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTGlmZWN5Y2xlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotcHVibGljIGNsYXNzIERvY3VtZW50Q2hhbmdlZCBleHRlbmRzIE1vZGVsTGlmZWN5Y2xlRXZlbnQgewotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmTmV3RG9jdW1lbnQ7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZk9sZERvY3VtZW50OwotCi0JcHJvdGVjdGVkIERvY3VtZW50Q2hhbmdlZCgpIHsKLQotCQlzdXBlcihNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX0RPQ1VNRU5UX0NIQU5HRUQpOwotCi0JfQotCi0JcHJvdGVjdGVkIERvY3VtZW50Q2hhbmdlZChpbnQgYWRkaXRpb25hbFR5cGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQotCQlzdXBlcihtb2RlbCwgTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9ET0NVTUVOVF9DSEFOR0VEIHwgYWRkaXRpb25hbFR5cGUpOwotCi0JfQotCi0JcHVibGljIERvY3VtZW50Q2hhbmdlZChpbnQgYWRkaXRpb25hbFR5cGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkRG9jdW1lbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3RG9jdW1lbnQpIHsKLQotCQl0aGlzKGFkZGl0aW9uYWxUeXBlLCBtb2RlbCk7Ci0JCWZPbGREb2N1bWVudCA9IG9sZERvY3VtZW50OwotCQlmTmV3RG9jdW1lbnQgPSBuZXdEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXROZXdEb2N1bWVudCgpIHsKLQotCQlyZXR1cm4gZk5ld0RvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldE9sZERvY3VtZW50KCkgewotCi0JCXJldHVybiBmT2xkRG9jdW1lbnQ7Ci0JfQotCi0Jdm9pZCBzZXROZXdEb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld0RvY3VtZW50KSB7Ci0KLQkJZk5ld0RvY3VtZW50ID0gbmV3RG9jdW1lbnQ7Ci0JfQotCi0Jdm9pZCBzZXRPbGREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG9sZERvY3VtZW50KSB7Ci0KLQkJZk9sZERvY3VtZW50ID0gb2xkRG9jdW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2Y4MzUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuTW9kZWxMaWZlY3ljbGVFdmVudDsKLQotLyoqCi0gKiBUaGlzIGlzIGFuIGVhcmx5IHZlcnNpb24gb2YgYSBjbGFzcyB0aGF0IG1heSBjaGFuZ2Ugb3ZlciB0aGUgbmV4dCBmZXcKLSAqIG1pbGVzdG9uZXMuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciB7Ci0KLQl2b2lkIHByb2Nlc3NQb3N0TW9kZWxFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KTsKLQotCXZvaWQgcHJvY2Vzc1ByZU1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzMDhmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogUmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGEgbmV3IE1vZGVsIGZyb20gYSByZXNvdXJjZSwgb3IgYXMgYSBuZXcsIGVtcHR5Ci0gKiBpbnN0YW5jZS4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbExvYWRlciB7Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHBlcmZvcm0gYWxsIHRoZSBtb2RlbCBpbml0aWFsaXphdGlvbiByZXF1aXJlZCBiZWZvcmUKLQkgKiBpdCBjb250YWlucyBjb250ZW50LCBuYW1lbHksIGl0IHNob3VsZCBjYWxsIG5ld01vZGVsLCB0aGUKLQkgKiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgdGhlbiBzZXRBZGFwdGVyRmFjdG9yaWVzLiAodGhpcyBpcwotCSAqIHRlbnRhdGl2ZSkKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKCk7Ci0KLQkvKioKLQkgKiBNZXRob2QgY3JlYXRlTW9kZWwuIENyZWF0ZXMgYSBuZXcgbW9kZWwgYmFzZWQgb24gb2xkIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkTW9kZWwKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkTW9kZWwKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhvc2UgZmFjdG9yaWVzIHdoaWNoIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlCi0JICogc3RydWN0dXJlZE1vZGVsIGJlZm9yZSBjb250ZW50IGlzIGFwcGxpZWQuCi0JICovCi0JTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0KLQl2b2lkIGxvYWQoSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0Jdm9pZCBsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQl2b2lkIGxvYWQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIGVuY29kaW5nTmFtZSwgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCUlNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyByZXR1cm4gYW4gbmV3LCBlbXB0eSBTdHJ1Y3R1cmVkIE1vZGVsCi0JICogYXBwcm9wcmlhdGUgZm9yIGl0c2VsZi4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCk7Ci0KLQlJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBnZXQgYSBmcmVzaCBjb3B5IG9mIHRoZSBkYXRhLCBhbmQgcmVwb3B1bGF0ZSB0aGUKLQkgKiBtb2RlbHMgLi4uIG5vcm1hbGx5IGJ5IGEgY2FsbCB0byBzZXRUZXh0IG9uIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZvcgotCSAqIFN0cnVjdHVyZWRNb2RlbHMuIFRoaXMgbWV0aG9kIGlzIG5lZWRlZCBpbiBzb21lIGNhc2VzIHdoZXJlIGNsaWVudHMgYXJlCi0JICogc2hhcmluZyBhIG1vZGVsIGFuZCB0aGVuIGNoYW5nZXMgY2FuY2VsZWQuIFNheSBmb3IgZXhhbXBsZSwgb25lIGVkaXRvcgotCSAqIGFuZCBzZXZlcmFsICJkaXNwbGF5cyIgYXJlIHNoYXJpbmcgYSBtb2RlbCwgaWYgdGhlIGVkaXRvciBpcyBjbG9zZWQKLQkgKiB3aXRob3V0IHNhdmluZyBjaGFuZ2VzLCB0aGVuIHRoZSBkaXNwbGF5cyBzdGlsbCBuZWVkIGEgbW9kZWwsIGJ1dCB0aGV5Ci0JICogc2hvdWxkIHJldmVydCB0byB0aGUgb3JpZ2luYWwgdW5zYXZlZCB2ZXJzaW9uLgotCSAqLwotCXZvaWQgcmVsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIFN0cnVjdHVyZWQgTW9kZWwgd2l0aCB0aGUgZ2l2ZW4gU3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlIGFzCi0JICogaXRzIGRvY3VtZW50IChpbnN0ZWFkIG9mIGEgbmV3IGRvY3VtZW50IGluc3RhbmNlIGFzIHdlbGwpCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBJTW9kZWxIYW5kbGVyIGhhbmRsZXIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjNkMGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VBbHJlYWR5RXhpc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFByb3ZpZGVzIEFQSXMgZm9yIG1hbmFnaW5nIChnZXQsIHJlbGVhc2UsIHNhdmUsIGFuZCBzYXZlIGFzKSBTU0UgU3RydWN0dXJlZAotICogTW9kZWxzLgotICogPC9wPgotICogPHA+Ci0gKiBTdHJ1Y3R1cmVkIE1vZGVscyBjcmVhdGVkIGZyb20gYW4gaW1wbGVtZW50b3Igb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGJlCi0gKiBlaXRoZXIgbWFuYWdlZCBvciB1bm1hbmFnZWQuIE1hbmFnZWQgbW9kZWxzIGFyZSBzaGFyZWQgdXNpbmcgcmVmZXJlbmNlCi0gKiBjb3VudHMsIHNvIHVudGlsIHRoYXQgY291bnQgaGFzIGJlZW4gZGVjcmVtZW50ZWQgdG8gemVybywgdGhlIG1vZGVsIHdpbGwKLSAqIGNvbnRpbnVlIHRvIGV4aXN0IGluIG1lbW9yeS4gV2hlbiBtYW5hZ2VkLCBtb2RlbHMgY2FuIGJlIGxvb2tlZCB1cCB1c2luZwotICogdGhlaXIgSURzIG9yIHRoZWlyIElTdHJ1Y3R1cmVkRG9jdW1lbnRzLCB3aGljaCBjYW4gYmUgYWR2YW50YWdlb3VzIHdoZW4KLSAqIGJ1aWxkaW5nIG9uIEFQSXMgdGhhdCBhcmVuJ3Qgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIGZvciBTU0UgKHN1Y2ggYXMgdGhvc2UKLSAqIHJldm9sdmluZyBhcm91bmQgSURvY3VtZW50cykuIFVubWFuYWdlZCBtb2RlbHMgb2ZmZXIgbm8gc3VjaCBmZWF0dXJlcywgYW5kCi0gKiBhcmUgbGFyZ2VseSB1c2VkIGZvciB0YXNrcyB3aGVyZSB0aGVpciBjb250ZW50cyBhcmUgZXBoZW1lcmFsLCBzdWNoIGFzIGZvcgotICogcG9wdWxhdGluZyBhIHNvdXJjZSB2aWV3ZXIgd2l0aCBzeW50YXgtY29sb3JlZCBjb250ZW50LgotICogPC9wPgotICogPHA+Ci0gKiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGFjY2VzcyB1c2VkIHdoZW4gcmV0cmlldmluZyBhIG1vZGVsIGZyb20gdGhlIG1vZGVsCi0gKiBtYW5hZ2VyOiBSRUFEIGFuZCBFRElULiBUaGUgY29udGVudHMgb2YgYSBtb2RlbCBjYW4gYmUgbW9kaWZpZWQgcmVnYXJkbGVzcwotICogb2Ygd2hpY2ggYWNjZXNzIHR5cGUgaXMgdXNlZCwgYnV0IGFueSBjbGllbnQgd2hvIGdldHMgYSBtb2RlbCBmb3IgRURJVCBpcwotICogZXhwbGljaXRseSBkZWNsYXJpbmcgdGhhdCB0aGV5IGFyZSBpbnRlcmVzdGVkIGluIHNhdmluZyB0aG9zZSBjaGFuZ2VkCi0gKiBjb250ZW50cy4gVGhlIEVESVQgYW5kIFJFQUQgcmVmZXJlbmNlIGNvdW50cyBhcmUgdmlzaWJsZSB0byBldmVyeW9uZSwgYXMKLSAqIGFyZSBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIGEgbWFuYWdlZCBtb2RlbCBpcyBzaGFyZWQKLSAqIGFtb25nIG11bHRpcGxlIGNsaWVudHMgYWNjZXNzaW5nIGl0IGZvciBSRUFEIG9yIEVESVQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1hbmFnZWQgbW9kZWxzIHdob3NlIGNvbnRlbnRzIGFyZSAiZGlydHkiIHdpdGggUkVBRCBhbmQgRURJVCBjb3VudHMgYWJvdmUKLSAqIHplcm8gd2lsbCBiZSByZXZlcnRlZCB0byB0aGUgb24tZGlzayBjb250ZW50IGlmIHRoZSBFRElUIGNvdW50IGRyb3BzIHRvCi0gKiB6ZXJvIHdoaWxlIHRoZSBSRUFEIGNvdW50IHJlbWFpbnMgYWJvdmUgemVyby4KLSAqIDwvcD4KLSAqIDxwPgotICogU2hhcmVkIG1vZGVscyBmb3Igd2hpY2ggdGhlIHJlYWQgYW5kIGVkaXQgY291bnRzIGhhdmUgYm90aCBkcm9wcGVkIHRvIHplcm8KLSAqIGFyZSBubyBsb25nZXIgdmFsaWQgZm9yIHVzZSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgaGF2ZSBiZWVuIGdhcmJhZ2UKLSAqIGNvbGxlY3RlZCBvciBub3QuIEl0IGlzIHBvc3NpYmxlLCBidXQgbm90IGd1YXJhbnRlZWQsIHRoYXQgdGhlIHVuZGVybHlpbmcKLSAqIHN0cnVjdHVyZWQgZG9jdW1lbnQgaXMgc3RpbGwgdmFsaWQgYW5kIG1heSBldmVuIGJlIHVzZWQgaW4gY29uc3RydWN0aW5nIGEKLSAqIG5ldyBzaGFyZWQgbW9kZWwuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIAotICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogQ2xpZW50cyBzaG91bGQgb2J0YWluIGFuIGluc3RhbmNlIG9mIHRoZSBJTW9kZWxNYW5hZ2VyIGludGVyZmFjZSB0aHJvdWdoCi0gKiB7QGxpbmsgU3RydWN0dXJlZE1vZGVsTWFuYWdlciNnZXRNb2RlbE1hbmFnZXIoKX0uPC9wPgotICogICAgICAgICAgICAgIDwvcD4KLSAqICAgICAgICAgICAgICA8cD4KLSAqIEBzZWUge0BsaW5rIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXJ9PC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbE1hbmFnZXIgewotCi0JLyoqCi0JICogQSBmaXhlZCBJRCB1c2VkIGZvciBtb2RlbHMgd2hpY2ggd2VyZSBjcmVhdGVkIGFzIGR1cGxpY2F0ZXMgb2YgZXhpc3RpbmcKLQkgKiBtb2RlbHMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBEVVBMSUNBVEVEX01PREVMID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyLkRVUExJQ0FURURfTU9ERUwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIGZpeGVkIElEIHVzZWQgZm9yIHVubWFuYWdlZCBtb2RlbHMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVTk1BTkFHRURfTU9ERUwgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIuVU5NQU5BR0VEX01PREVMIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ2FsY3VsYXRlIGlkIHByb3ZpZGVzIGEgY29tbW9uIHdheSB0byBkZXRlcm1pbmUgdGhlIGlkIGZyb20gdGhlIGlucHV0Ci0JICogLi4uIG5lZWRlZCB0byBnZXQgYW5kIHNhdmUgdGhlIG1vZGVsLiBJdCBpcyBhIHNpbXBsZSBjbGFzcyB1dGlsaXR5LCBidXQKLQkgKiBpcyBhbiBpbnN0YW5jZSBtZXRob2Qgc28gY2FuIGJlIGFjY2Vzc2VkIHZpYSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBjYWxjdWxhdGVJZChJRmlsZSBmaWxlKTsKLQotCS8qKgotCSAqIENvcGllcyBhIG1vZGVsIHdpdGggdGhlIG9sZCBpZCAKLQkgKiBAcGFyYW0gb2xkSWQgLSB0aGUgb2xkIG1vZGVsJ3MgSUQKLQkgKiBAcGFyYW0gbmV3SWQgLSB0aGUgbmV3IG1vZGVsJ3MgSUQKLQkgKiBAcmV0dXJuIHRoZSBuZXcgbW9kZWwKLQkgKiBAdGhyb3dzIFJlc291cmNlSW5Vc2UgaWYgdGhlIGdpdmVuIG5ldyBJRCBpcyBhbHJlYWR5IGluIHVzZSBieSBhIG1hbmFnZWQgbW9kZWwKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGNvcHlNb2RlbEZvckVkaXQoU3RyaW5nIG9sZElkLCBTdHJpbmcgbmV3SWQpIHRocm93cyBSZXNvdXJjZUluVXNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldywgYnV0IGVtcHR5LCB1bm1hbmFnZWQgbW9kZWwgb2YgdGhlIHNhbWUga2luZCBhcyB0aGUgb25lCi0JICogZ2l2ZW4uIEZvciBhIG1hbmFnZWQgbW9kZWwgd2l0aCB0aGUgc2FtZSBjb250ZW50cywgdXNlICJjb3B5Ii4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcmV0dXJuIHRoZSBtb2RlbCwgb3IgbnVsbCBvZiBvbmUgY291bGQgbm90IGJlIGNyZWF0ZWQKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBmaWxlJ3MgY29udGVudHMgY2FuIG5vdCBiZSByZWFkIG9yIGl0cyBkZXRlY3RlZCBlbmNvZGluZyBkb2VzIG5vdCBzdXBwb3J0IGl0cyBjb250ZW50cwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU5ld0luc3RhbmNlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhIHByb3BlcgotCSAqIHBhcnNlciBhc3NpZ25lZC4gSWYgdGhlIHJlc291cmNlIGRvZXMgYWxyZWFkeSBleGlzdCwgdGhlbgotCSAqIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvciBpcyB0aGUgcmlnaHQgQVBJIHRvIHVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gaUZpbGUKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCwgb3IgbnVsbCBpZiBvbmUgY291bGQgbm90IGJlIGNyZWF0ZWQKLQkgKiBAdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cwotCSAqICAgICAgICAgICAgIGlmIHRoZSBJRmlsZSBhbHJlYWR5IGV4aXN0cwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIG9yIGRlc2NyaXB0aW9uIGNhbiBub3QgYmUgcmVhZAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUncyBjb250ZW50cyBjYW4gbm90IGJlIHJlYWQgb3IgaXRzIGRldGVjdGVkIGVuY29kaW5nIGRvZXMgbm90IHN1cHBvcnQgaXRzIGNvbnRlbnRzCi0JICogQHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMgaWYgdGhlIGdpdmUgZmlsZSBhbHJlYWR5IGV4aXN0cwotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhIHByb3BlcgotCSAqIHBhcnNlciBhc3NpZ25lZC4gTm90ZTogY2xpZW50cyBzaG91bGQgdmVyaWZ5IElGaWxlIGV4aXN0cyBiZWZvcmUgdXNpbmcKLQkgKiB0aGlzIG1ldGhvZC4gSWYgdGhpcyBJRmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlbgotCSAqIHtAbGluayAjY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlKX0gaXMgdGhlIGNvcnJlY3QgQVBJIHRvIHVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gaUZpbGUgLSB0aGUgZmlsZQotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50LCBvciBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgY3JlYXRlZAotCSAqIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIG9yIGRlc2NyaXB0aW9uIGNhbiBub3QgYmUgcmVhZAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUncyBjb250ZW50cyBjYW4gbm90IGJlIHJlYWQgb3IgaXRzIGRldGVjdGVkIGVuY29kaW5nIGRvZXMgbm90IHN1cHBvcnQgaXRzIGNvbnRlbnRzCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYQotCSAqIHByb3BlciBwYXJzZXIgYXNzaWduZWQuIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBhbiBlbXB0eQotCSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBuZWVkZWQuIE90aGVyd2lzZSwgdXNlIElGaWxlIGZvcm0uCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSWQKLQkgKiBAcmV0dXJuIGEgc3RydWN0dXJlZCBkb2N1bWVudCB3aXRoIHRoZSBjb3JyZWN0IHBhcnNpbmcgc2V0dXAgZm9yIHRoZQotCSAqICAgICAgICAgZ2l2ZW4gY29udGVudCB0eXBlIElELCBvciBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgY3JlYXRlZCBvcgotCSAqICAgICAgICAgdGhlIGdpdmVuIGNvbnRlbnQgdHlwZSBJRCBpcyB1bmtub3duIG9yIHVuc3VwcG9ydGVkCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgSUZpbGUgZm9ybSBpbnN0ZWFkIGFzIHRoZSBjb3JyZWN0IGVuY29kaW5nIGFuZCBjb250ZW50IHJ1bGVzIG1heSBub3QgYmUgYXBwbGllZCBvdGhlcndpc2UKLQkgKiAKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgcHJvcGVybHkgY29uZmlndXJlZCBzdHJ1Y3R1cmVkIGRvY3VtZW50IGZvciB0aGUgZ2l2ZW4gY29udGVudHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZSAtIHRoZSBmaWxlbmFtZSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gZ3Vlc3MgdGhlIGNvbnRlbnQgdHlwZQotCSAqIEBwYXJhbSBjb250ZW50cyAtIHRoZSBjb250ZW50cyB0byBsb2FkCi0JICogQHBhcmFtIHJlc29sdmVyIC0gdGhlIFVSSVJlc29sdmVyIHRvIHVzZSBmb3IgbG9jYXRpbmcgYW55IG5lZWRlZCByZXNvdXJjZXMKLQkgKiBAcmV0dXJuIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IG9yIG51bGwgb2Ygb25lIGNvdWxkIG5vdCBiZSBjcmVhdGVkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgY29udGVudCB0eXBlIGNhbiBub3QgYmUgZGV0ZXJtaW5lZAotCSAqLyAKLQlJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGNvbnRlbnRzLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHByb3Blcmx5IGNvbmZpZ3VyZWQgc3RydWN0dXJlZCBkb2N1bWVudCBmb3IgdGhlIGdpdmVuIGNvbnRlbnRzIHdpdGggdGhlIGdpdmVuIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUgLSB0aGUgZmlsZW5hbWUsIHdoaWNoIG1heSBiZSB1c2VkIHRvIGd1ZXNzIHRoZSBjb250ZW50IHR5cGUKLQkgKiBAcGFyYW0gaW5wdXRTdHJlYW0gLSB0aGUgY29udGVudHMgdG8gbG9hZAotCSAqIEBwYXJhbSByZXNvbHZlciAtIHRoZSBVUklSZXNvbHZlciB0byB1c2UgZm9yIGxvY2F0aW5nIGFueSBuZWVkZWQgcmVzb3VyY2VzCi0JICogQHBhcmFtIGlhbmFFbmNvZGluZ05hbWUgLSB0aGUgSUFOQSBzcGVjaWZpZWQgZW5jb2RpbmcgdG8gdXNlIHdoZW4gcmVhZGluZyB0aGUgY29udGVudHMKLQkgKiBAcmV0dXJuIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IG9yIG51bGwgaWYgb25lIGNvdWxkIG5vdCBiZSBjcmVhdGVkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgY29udGVudCB0eXBlIGNhbiBub3QgYmUgZGV0ZXJtaW5lZAotCSAqIEBkZXByZWNhdGVkIC0gY2xpZW50cyBzaG91bGQgY29udmVydCB0aGUgSW5wdXRTdHJlYW0gaW50byB0ZXh0IHRoZW1zZWx2ZXMKLQkgKiAgICAgICAgICAgICBhbmQgdGhlbiB1c2UgdGhlIHZlcnNpb24gb2YgdGhpcyBtZXRob2QgdGFraW5nIGEgU3RyaW5nIGZvciBpdHMKLQkgKiAgICAgICAgICAgICBjb250ZW50Ci0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIsIFN0cmluZyBpYW5hRW5jb2RpbmdOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgcHJvcGVybHkgY29uZmlndXJlZCBzdHJ1Y3R1cmVkIGRvY3VtZW50IGZvciB0aGUgZ2l2ZW4gY29udGVudHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZSAtIHRoZSBmaWxlbmFtZSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gZ3Vlc3MgdGhlIGNvbnRlbnQgdHlwZQotCSAqIEBwYXJhbSBjb250ZW50IC0gdGhlIGNvbnRlbnRzIHRvIGxvYWQKLQkgKiBAcGFyYW0gcmVzb2x2ZXIgLSB0aGUgVVJJUmVzb2x2ZXIgdG8gdXNlIGZvciBsb2NhdGluZyBhbnkgcmVmZXJlbmNlZCByZXNvdXJjZXMKLQkgKiBAcmV0dXJuIGEgc3RydWN0dXJlZCBkb2N1bWVudCB3aXRoIHRoZSBjb3JyZWN0IHBhcnNpbmcgc2V0dXAgZm9yIHRoZQotCSAqICAgICAgICAgZ2l2ZW4gZmlsZW5hbWUsIG9yIG51bGwgaWYgb25lIGNvdWxkIG5vdCBiZSBjcmVhdGVkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgZGV0ZWN0ZWQgZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBpdHMgY29udGVudHMKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBjb250ZW50LCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiB1bm1hbmFnZWQgbW9kZWwgcG9wdWxhdGVkIHdpdGggdGhlIGdpdmVuIElGaWxlJ3MKLQkgKiBjb250ZW50cwotCSAqIAotCSAqIEBwYXJhbSBpRmlsZQotCSAqIEByZXR1cm4gYSBzdHJ1Y3R1cmVkIG1vZGVsLCBvciBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgY3JlYXRlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIG9yIGRlc2NyaXB0aW9uIGNhbiBub3QgYmUgcmVhZAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUncyBjb250ZW50cyBjYW4gbm90IGJlIHJlYWQgb3IgaXRzIGRldGVjdGVkIGVuY29kaW5nIGRvZXMgbm90IHN1cHBvcnQgaXRzIGNvbnRlbnRzCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4gSXQgZGVwZW5kcyBvbiB0aGUgbG9hZGVyJ3MgbmV3TW9kZWwgbWV0aG9kIHRvIHJldHVybgotCSAqIGFuIGFwcHJvcHJpYXRlIFN0cnVjdXR1cmVkTW9kZWwgYXBwcm9wcmlhdGVseSBpbml0aWFsaXplZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGVJZAotCSAqIEByZXR1cm4gYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gY29udGVudCB0eXBlLCBvciBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgY3JlYXRlZCBvciB0aGUgY29udGVudCB0eXBlIGlzIHVuc3VwcG9ydGVkCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihTdHJpbmcgY29udGVudFR5cGVJZCwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpOwotCi0JLyoqCi0JICogTm90ZTogY2FsbGVycyBvZiB0aGlzIG1ldGhvZCBtdXN0IHN0aWxsIHJlbGVhc2UgdGhlIG1vZGVsIHdoZW4gZmluaXNoZWQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBtb2RlbCBjb250YWluaW5nIHRoZSBnaXZlIGRvY3VtZW50LCBpbmNyZW1lbnRpbmcKLQkgKiAgICAgICAgIGl0cyBlZGl0IGNvdW50LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vdCBhIG1vZGVsIGNvcnJlc3BvbmRpbmcKLQkgKiAgICAgICAgIHRvIHRoaXMgZG9jdW1lbnQuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChJRG9jdW1lbnQgZG9jdW1lbnQpOwotCi0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIHRoZSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gZmlsZSwgaW5jcmVtZW50aW5nIGl0cyBlZGl0Ci0JICogICAgICAgICBjb3VudCwgb3IgbnVsbCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhpcyBmaWxlLgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoSUZpbGUgZmlsZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuIHRoZSBzdHJ1Y3R1cmVkIG1vZGVsIHdpdGggdGhlIGdpdmVuIElELCBpbmNyZW1lbnRpbmcgaXRzIGVkaXQKLQkgKiAgICAgICAgIGNvdW50LCBvciBudWxsIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGlzIElECi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIE5vdGU6IGNhbGxlcnMgb2YgdGhpcyBtZXRob2QgbXVzdCBzdGlsbCByZWxlYXNlIHRoZSBtb2RlbCB3aGVuIGZpbmlzaGVkLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEByZXR1cm4gdGhlIHN0cnVjdHVyZWQgbW9kZWwgY29udGFpbmluZyB0aGUgZ2l2ZSBkb2N1bWVudCwgaW5jcmVtZW50aW5nCi0JICogICAgICAgICBpdHMgcmVhZCBjb3VudCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBub3QgYSBtb2RlbCBjb3JyZXNwb25kaW5nCi0JICogICAgICAgICB0byB0aGlzIGRvY3VtZW50LgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoSURvY3VtZW50IGRvY3VtZW50KTsKLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBtb2RlbCBmb3IgdGhlIGdpdmVuIGZpbGUsIGluY3JlbWVudGluZyBpdHMgcmVhZAotCSAqICAgICAgICAgY291bnQsIG9yIG51bGwgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoaXMgZmlsZS4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuIHRoZSBzdHJ1Y3R1cmVkIG1vZGVsIHdpdGggdGhlIGdpdmVuIElELCBpbmNyZW1lbnRpbmcgaXRzIGVkaXQKLQkgKiAgICAgICAgIGNvdW50LCBvciBudWxsIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGlzIElECi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gaW50ZXJuYWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RXhpc3RpbmdNb2RlbElkcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIHRoZSBnaXZlbiBmaWxlLiBJZiBvbmUgZG9lcyBub3QgYWxyZWFkeQotCSAqIGV4aXN0cywgb25lIHdpbGwgYmUgY3JlYXRlZCB3aXRoIGFuIGVkaXQgY291bnQgb2YgMS4gSWYgb25lIGFscmVhZHkKLQkgKiBleGlzdHMsIGl0cyBlZGl0IGNvdW50IHdpbGwgYmUgaW5jcmVtZW50ZWQgYmVmb3JlIGl0IGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBpRmlsZQotCSAqIEByZXR1cm4gYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gZmlsZSwgb3IgbnVsbCBpZiBvbmUgY291bGQgbm90Ci0JICogICAgICAgICBiZSBmb3VuZCBvciBjcmVhdGVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBmaWxlJ3MgY29udGVudHMgb3IgZGVzY3JpcHRpb24gY2FuIG5vdCBiZSByZWFkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgZGV0ZWN0ZWQgZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBpdHMgY29udGVudHMKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gZmlsZS4gSWYgb25lIGRvZXMgbm90IGFscmVhZHkKLQkgKiBleGlzdHMsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhbiBlZGl0IGNvdW50IG9mIDEuIElmIG9uZSBhbHJlYWR5Ci0JICogZXhpc3RzLCBpdHMgZWRpdCBjb3VudCB3aWxsIGJlIGluY3JlbWVudGVkIGJlZm9yZSBpdCBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gaUZpbGUKLQkgKiBAcGFyYW0gZW5jb2RpbmdSdWxlIHRoZSBydWxlIGZvciBoYW5kbGluZyBlbmNvZGluZwotCSAqIEByZXR1cm4gYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gZmlsZSwgb3IgbnVsbCBpZiBvbmUgY291bGQgbm90Ci0JICogICAgICAgICBiZSBmb3VuZCBvciBjcmVhdGVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBmaWxlJ3MgY29udGVudHMgb3IgZGVzY3JpcHRpb24gY2FuIG5vdCBiZSByZWFkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgZGV0ZWN0ZWQgZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBpdHMgY29udGVudHMKLQkgKiBAZGVwcmVjYXRlZCAtIGVuY29kaW5nIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgZmlsZSdzCi0JICogICAgICAgICAgICAgY29udGVudHMgb3IgdXNlciBwcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBFbmNvZGluZyBhbmQgdGhlIGxpbmUgZGVsaW1pdGVyIHVzZWQgYXJlIGhhbmRsZWQKLQkgKiAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBmaWxlJ3MgY29udGVudHMgb3IgdXNlcgotCSAqICAgICAgICAgICAgIHByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIHRoZSBnaXZlbiBkb2N1bWVudC4gSWYgb25lIGRvZXMgbm90Ci0JICogYWxyZWFkeSBleGlzdHMsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhbiBlZGl0IGNvdW50IG9mIDEuIElmIG9uZQotCSAqIGFscmVhZHkgZXhpc3RzLCBpdHMgZWRpdCBjb3VudCB3aWxsIGJlIGluY3JlbWVudGVkIGJlZm9yZSBpdCBpcwotCSAqIHJldHVybmVkLiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBvbmx5IHRvIGludGVyYWN0IHdpdGggZG9jdW1lbnRzCi0JICogY29udGFpbmVkIHdpdGhpbiBGaWxlIEJ1ZmZlcnMuCi0JICogCi0JICogQHBhcmFtIHRleHRGaWxlQnVmZmVyRG9jdW1lbnQKLQkgKiBAcmV0dXJuIGEgc3RydWN0dXJlZCBtb2RlbCBmb3IgdGhlIGdpdmVuIGRvY3VtZW50LCBvciBudWxsIGlmIHRoZXJlIGlzCi0JICogICAgICAgICBpbnN1ZmZpY2llbnQgaW5mb3JtYXRpb24ga25vd24gYWJvdXQgdGhlIGRvY3VtZW50IGluc3RhbmNlIHRvCi0JICogICAgICAgICBkbyBzbwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJU3RydWN0dXJlZERvY3VtZW50IHRleHRGaWxlQnVmZmVyRG9jdW1lbnQpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIHRoZSBnaXZlbiBjb250ZW50cyB1c2luZyB0aGUgZ2l2ZW4gSUQuCi0JICogSWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhbiBlZGl0IGNvdW50Ci0JICogb2YgMS4gSWYgb25lIGFscmVhZHkgZXhpc3RzLCBpdHMgZWRpdCBjb3VudCB3aWxsIGJlIGluY3JlbWVudGVkIGJlZm9yZQotCSAqIGl0IGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgLSB0aGUgaWQgZm9yIHRoZSBtb2RlbAotCSAqIEBwYXJhbSBpblN0cmVhbQotCSAqICAgICAgICAgICAgLSB0aGUgaW5pdGlhbCBjb250ZW50cyBvZiB0aGUgbW9kZWwKLQkgKiBAcGFyYW0gcmVzb2x2ZXIKLQkgKiAgICAgICAgICAgIC0gdGhlIFVSSVJlc29sdmVyIHRvIHVzZSBmb3IgbG9jYXRpbmcgYW55IG5lZWRlZCByZXNvdXJjZXMKLQkgKiBAcmV0dXJuIGEgc3RydWN0dXJlZCBtb2RlbCBmb3IgdGhlIGdpdmVuIGNvbnRlbnQsIG9yIG51bGwgaWYgb25lIGNvdWxkCi0JICogICAgICAgICBub3QgYmUgZm91bmQgb3IgY3JlYXRlZAotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgY29udGVudHMgY2FuIG5vdCBiZSByZWFkIG9yIGl0cyBkZXRlY3RlZCBlbmNvZGluZwotCSAqICAgICAgICAgICAgIGRvZXMgbm90IHN1cHBvcnQgaXRzIGNvbnRlbnRzCi0JICogQGRlcHJlY2F0ZWQgLSBhIFVSSSByZXNvbHZlciBzaG91bGQgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIHdoZW4KLQkgKiAgICAgICAgICAgICBuZWVkZWQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoU3RyaW5nIGlkLCBJbnB1dFN0cmVhbSBpblN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gZmlsZS4gSWYgb25lIGRvZXMgbm90IGFscmVhZHkKLQkgKiBleGlzdHMsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhIHJlYWQgY291bnQgb2YgMS4gSWYgb25lIGFscmVhZHkKLQkgKiBleGlzdHMsIGl0cyByZWFkIGNvdW50IHdpbGwgYmUgaW5jcmVtZW50ZWQgYmVmb3JlIGl0IGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBpRmlsZQotCSAqIEByZXR1cm4gYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gZmlsZSwgb3IgbnVsbCBpZiBvbmUgY291bGQgbm90Ci0JICogICAgICAgICBiZSBmb3VuZCBvciBjcmVhdGVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBmaWxlJ3MgY29udGVudHMgb3IgZGVzY3JpcHRpb24gY2FuIG5vdCBiZSByZWFkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgZGV0ZWN0ZWQgZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBpdHMgY29udGVudHMKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gZW5jb2RpbmcgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBmaWxlJ3MKLQkgKiAgICAgICAgICAgICBjb250ZW50cyBvciB1c2VyIHByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIEVuY29kaW5nIGFuZCB0aGUgbGluZSBkZWxpbWl0ZXIgdXNlZCBhcmUgaGFuZGxlZAotCSAqICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIGZpbGUncyBjb250ZW50cyBvciB1c2VyCi0JICogICAgICAgICAgICAgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RydWN0dXJlZCBtb2RlbCBmb3IgdGhlIGdpdmVuIGRvY3VtZW50LiBJZiBvbmUgZG9lcyBub3QKLQkgKiBhbHJlYWR5IGV4aXN0cywgb25lIHdpbGwgYmUgY3JlYXRlZCB3aXRoIGEgcmVhZCBjb3VudCBvZiAxLiBJZiBvbmUKLQkgKiBhbHJlYWR5IGV4aXN0cywgaXRzIHJlYWQgY291bnQgd2lsbCBiZSBpbmNyZW1lbnRlZCBiZWZvcmUgaXQgaXMKLQkgKiByZXR1cm5lZC4gVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgb25seSB0byBpbnRlcmFjdCB3aXRoIGRvY3VtZW50cwotCSAqIGNvbnRhaW5lZCB3aXRoaW4gRmlsZSBCdWZmZXJzLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0RmlsZUJ1ZmZlckRvY3VtZW50Ci0JICogQHJldHVybiBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIHRoZSBnaXZlbiBkb2N1bWVudCwgb3IgbnVsbCBpZiB0aGVyZSBpcwotCSAqICAgICAgICAgaW5zdWZmaWNpZW50IGluZm9ybWF0aW9uIGtub3duIGFib3V0IHRoZSBkb2N1bWVudCBpbnN0YW5jZSB0bwotCSAqICAgICAgICAgZG8gc28KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSVN0cnVjdHVyZWREb2N1bWVudCB0ZXh0RmlsZUJ1ZmZlckRvY3VtZW50KTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gY29udGVudHMgdXNpbmcgdGhlIGdpdmVuIElELgotCSAqIElmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBvbmUgd2lsbCBiZSBjcmVhdGVkIHdpdGggYW4gcmVhZCBjb3VudAotCSAqIG9mIDEuIElmIG9uZSBhbHJlYWR5IGV4aXN0cywgaXRzIHJlYWQgY291bnQgd2lsbCBiZSBpbmNyZW1lbnRlZCBiZWZvcmUKLQkgKiBpdCBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIC0gdGhlIGlkIGZvciB0aGUgbW9kZWwKLQkgKiBAcGFyYW0gaW5TdHJlYW0KLQkgKiAgICAgICAgICAgIC0gdGhlIGluaXRpYWwgY29udGVudHMgb2YgdGhlIG1vZGVsCi0JICogQHBhcmFtIHJlc29sdmVyCi0JICogICAgICAgICAgICAtIHRoZSBVUklSZXNvbHZlciB0byB1c2UgZm9yIGxvY2F0aW5nIGFueSBuZWVkZWQgcmVzb3VyY2VzCi0JICogQHJldHVybiBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIHRoZSBnaXZlbiBjb250ZW50LCBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kIG9yIGNyZWF0ZWQKLQkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgZGV0ZWN0ZWQgZW5jb2RpbmcKLQkgKiAgICAgICAgICAgICBkb2VzIG5vdCBzdXBwb3J0IGl0cyBjb250ZW50cwotCSAqIEBkZXByZWNhdGVkIC0gYSBVUkkgcmVzb2x2ZXIgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB3aGVuCi0JICogICAgICAgICAgICAgbmVlZGVkCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5TdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBjcmVhdGUgYSBuZXcgbW9kZWwgaWYgaXQgYWxyZWFkeSBleGlzdHMgLi4uIGlmCi0JICogZm9yY2UgaXMgZmFsc2UuIFRoZSBpZGVhIGlzIHRoYXQgYSBjbGllbnQgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qgb25jZQotCSAqIHdpdGggZm9yY2Ugc2V0IHRvIGZhbHNlLiBJZiB0aGUgZXhjZXB0aW9uIGlzIHRocm93biwgdGhlbiBwcm9tcHQgY2xpZW50Ci0JICogaWYgdGhleSB3YW50IHRvIG92ZXJ3cml0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaUZpbGUKLQkgKiBAcGFyYW0gZm9yY2UKLQkgKiBAcmV0dXJuIHRoZSBuZXcgc3RydWN0dXJlZCBtb2RlbCwgb3IgCi0JICogQHRocm93cyBSZXNvdXJjZUluVXNlIGlmIHRoZSBnaXZlbiBuZXcgSUQgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYSBtYW5hZ2VkIG1vZGVsCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBmaWxlJ3MgY29udGVudHMgb3IgZGVzY3JpcHRpb24gY2FuIG5vdCBiZSByZWFkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgZGV0ZWN0ZWQgZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBpdHMgY29udGVudHMKLQkgKiBAdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cyBpZiB0aGUgZ2l2ZSBmaWxlIGFscmVhZHkgZXhpc3RzCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIFJlc291cmNlSW5Vc2UsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY3JlYXRlIGEgbmV3IG1vZGVsIGlmIGl0IGFscmVhZHkgZXhpc3RzIC4uLiBpZgotCSAqIGZvcmNlIGlzIGZhbHNlLiBUaGUgaWRlYSBpcyB0aGF0IGEgY2xpZW50IHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIG9uY2UKLQkgKiB3aXRoIGZvcmNlIHNldCB0byBmYWxzZS4gSWYgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZW4gcHJvbXB0IGNsaWVudAotCSAqIGlmIHRoZXkgd2FudCB0byBvdmVyd3JpdGUuCi0JICogCi0JICogQHBhcmFtIGlGaWxlCi0JICogQHBhcmFtIGZvcmNlCi0JICogQHJldHVybiB0aGUgbmV3IHN0cnVjdHVyZWQgbW9kZWwsIG9yIAotCSAqIEB0aHJvd3MgUmVzb3VyY2VJblVzZSBpZiB0aGUgZ2l2ZW4gbmV3IElEIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGEgbWFuYWdlZCBtb2RlbAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIG9yIGRlc2NyaXB0aW9uIGNhbiBub3QgYmUgcmVhZAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUncyBjb250ZW50cyBjYW4gbm90IGJlIHJlYWQgb3IgaXRzIGRldGVjdGVkIGVuY29kaW5nIGRvZXMgbm90IHN1cHBvcnQgaXRzIGNvbnRlbnRzCi0JICogQHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMgaWYgdGhlIGdpdmUgZmlsZSBhbHJlYWR5IGV4aXN0cwotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29tYmluZWQgInJlYWQiIGFuZCAiZWRpdCIgcmVmZXJlbmNlIGNvdW50cwotCSAqIG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbAotCSAqIEBkZXByZWNhdGVkIC0gaW50ZXJuYWwgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgbW9kZWwKLQkgKiAgICAgICAgICAgICBpdHNlbGYKLQkgKi8KLQlpbnQgZ2V0UmVmZXJlbmNlQ291bnQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgImVkaXQiIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwKLQkgKiBAZGVwcmVjYXRlZCAtIGludGVybmFsIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIG1vZGVsIGl0c2VsZgotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudEZvckVkaXQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgInJlYWQiIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKiBAZGVwcmVjYXRlZCAtIGludGVybmFsIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIG1vZGVsIGl0c2VsZgotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudEZvclJlYWQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbAotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciAiZWRpdCIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwKLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkRm9yRWRpdChPYmplY3QgaWQpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyICJyZWFkIiByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbAotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWRGb3JSZWFkKE9iamVjdCBpZCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIG5vdCBncmFudWxhciBlbm91Z2gKLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGUgbW9kZWwgbWFuYWdlciBpcyB3aXRoaW4gYQotCSAqICJhYm91dFRvQ2hhbmdlIiBhbmQgImNoYW5nZWQiIHNlcXVlbmNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhdGVDaGFuZ2luZygpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2hhbmdlcyB0aGUgaWQgb2YgdGhlIG1vZGVsLiAKLQkgKiAKLQkgKiBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXZvaWQgbW92ZU1vZGVsKE9iamVjdCBvbGRJZCwgT2JqZWN0IG5ld0lkKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgd2hlbiB0aGUgY29udGVudCB0eXBlIG9mIGEgbW9kZWwgY2hhbmdlcy4gSXQncwotCSAqIGFzc3VtZWQgdGhlIGNvbnRlbnRUeXBlIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCwgYW5kIHRoaXMgbWV0aG9kIHVzZXMKLQkgKiB0aGUgdGV4dCBvZiB0aGUgb2xkIG9uZSwgdG8gcmVwb3B1bGF0ZSB0aGUgdGV4dCBvZiB0aGUgbmV3IG9uZS4gSW4KLQkgKiB0aGVvcnksIHRoZSBhY3R1YWwgaW5zdGFuY2UgY291bGQgY2hhbmdlLCAoZS5nLiB1c2luZyAnc2F2ZUFzJyB0byBnbwotCSAqIGZyb20geG1sIHRvIGR0ZCksIGJ1dCBpbiBwcmFjdGljZSwgdGhlIGludGVudCBvZiB0aGlzIEFQSSBpcyB0byByZXR1cm4KLQkgKiB0aGUgc2FtZSBpbnN0YW5jZSwganVzdCB1c2luZyBkaWZmZXJlbnQgaGFuZGxlcnMsIGFkYXB0ZXIgZmFjdG9yaWVzLAotCSAqIGV0Yy4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90IHVzZQotCSAqIHRoZSBjYWNoZWQgdmVyc2lvbiwgYnV0IGZvcmNlcyB0aGUgY2FjaGVkIHZlcnNpb24gdG8gYmUgcmVwbGFjZWQgd2l0aCBhCi0JICogZnJlc2gsIHVuY2hhbmdlZCB2ZXJzaW9uLiBOb3RlOiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBjaGFuZ2UgYW55Ci0JICogcmVmZXJlbmNlIGNvdW50cy4gQWxzbywgaWYgdGhlcmUgaXMgbm90IGFscmVhZHkgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUKLQkgKiBtb2RlbCwgdGhlbiB0aGlzIGNhbGwgaXMgZXNzZW50aWFsbHkgaWdub3JlZCAodGhhdCBpcywgaXQgZG9lcyBub3QgcHV0Ci0JICogYSBtb2RlbCBpbiB0aGUgY2FjaGUpIGFuZCByZXR1cm5zIG51bGwuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIHJlbG9hZE1vZGVsKE9iamVjdCBpZCwgSW5wdXRTdHJlYW0gaW5TdHJlYW0pIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBzdHJ1Y3R1cmVkIGRvY3VtZW50IHRvIHRoZSBnaXZlbiBmaWxlLiBJZgotCSAqIHRoZSBkb2N1bWVudCBiZWxvbmdzIHRvIGEgbWFuYWdlZCBtb2RlbCwgdGhhdCBtb2RlbCB3aWxsIGJlIHNhdmVkIGFuZAotCSAqIG1hcmtlZCBhcyBub24tZGlydHkuCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudAotCSAqICAgICAgICAgICAgLSB0aGUgc3RydWN0dXJlZCBkb2N1bWVudAotCSAqIEBwYXJhbSBpRmlsZQotCSAqICAgICAgICAgICAgLSB0aGUgZmlsZSB0byBzYXZlIHRvCi0JICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBmaWxlJ3MgY29udGVudHMgb3IgZGVzY3JpcHRpb24gY2FuIG5vdCBiZSByZWFkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgZGV0ZWN0ZWQgZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBpdHMgY29udGVudHMKLQkgKi8KLQl2b2lkIHNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIElGaWxlIGlGaWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbFN0YXRlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsU3RhdGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTRlNDczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsU3RhdGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi0KLS8qKgotICogSW50ZXJmYWNlIGZvciB0aG9zZSB3YW50aW5nIHRvIGxpc3RlbiB0byBhIG1vZGVsJ3Mgc3RhdGUgY2hhbmdpbmcuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBBIG1vZGVsIGlzIGFib3V0IHRvIGJlIGNoYW5nZWQuIFRoaXMgdHlwaWNhbGx5IGlzIGluaXRpYXRlZCBieSBvbmUKLQkgKiBjbGllbnQgb2YgdGhlIG1vZGVsLCB0byBzaWduYWwgYSBsYXJnZSBjaGFuZ2UgYW5kL29yIGEgY2hhbmdlIHRvIHRoZQotCSAqIG1vZGVsJ3MgSUQgb3IgYmFzZSBMb2NhdGlvbi4gQSB0eXBpY2FsIHVzZSBtaWdodCBiZSBpZiBhIGNsaWVudCBtaWdodAotCSAqIHdhbnQgdG8gc3VzcGVuZCBwcm9jZXNzaW5nIHVudGlsIGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLgotCSAqLwotCXZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpOwotCi0JLyoqCi0JICogU2lnbmFscyB0aGF0IHRoZSBjaGFuZ2VzIGZvcmV0b2xkIGJ5IG1vZGVsQWJvdXRUb0JlQ2hhbmdlZCBoYXZlIGJlZW4KLQkgKiBtYWRlLiBBIHR5cGljYWwgdXNlIG1pZ2h0IGJlIHRvIHJlZnJlc2gsIG9yIHRvIHJlc3VtZSBwcm9jZXNzaW5nIHRoYXQKLQkgKiB3YXMgc3VzcGVuZGVkIGFzIGEgcmVzdWx0IG9mIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZC4KLQkgKi8KLQl2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgYSBtb2RlbCdzIGRpcnR5IHN0YXRlIGhhcyBjaGFuZ2VkLCBhbmQgcGFzc2VzIHRoYXQgc3RhdGUKLQkgKiBpbiBpc0RpcnR5LiBBIG1vZGVsIGJlY29tZXMgZGlydHkgd2hlbiBhbnkgY2hhbmdlIGlzIG1hZGUsIGFuZCBiZWNvbWVzCi0JICogbm90LWRpcnR5IHdoZW4gdGhlIG1vZGVsIGlzIHNhdmVkLgotCSAqLwotCXZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpOwotCi0JLyoqCi0JICogQSBtb2RlbERlbGV0ZWQgbWVhbnMgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZC4gVGhlCi0JICogbW9kZWwgaXRzZWxmIGlzIG5vdCByZW1vdmVkIGZyb20gbW9kZWwgbWFuYWdlbWVudCB1bnRpbCBhbGwgaGF2ZQotCSAqIHJlbGVhc2VkIGl0LiBOb3RlOiBiYXNlTG9jYXRpb24gaXMgbm90IChuZWNlc3NhcmlseSkgY2hhbmdlZCBpbiB0aGlzCi0JICogZXZlbnQsIGJ1dCBtYXkgbm90IGJlIGFjY3VyYXRlLgotCSAqLwotCXZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCk7Ci0KLQkvKioKLQkgKiBBIG1vZGVsIGhhcyBiZWVuIHJlbmFtZWQgb3IgY29waWVkIChhcyBpbiBzYXZlQXMuLikuIEluIHRoZSByZW5hbWVkCi0JICogY2FzZSwgdGhlIHR3byBwYXJhbWVudGVycyBhcmUgdGhlIHNhbWUgaW5zdGFuY2UsIGFuZCBvbmx5IGNvbnRhaW4gdGhlCi0JICogbmV3IGluZm8gZm9yIGlkIGFuZCBiYXNlIGxvY2F0aW9uLgotCSAqLwotCXZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpOwotCi0Jdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpOwotCi0Jdm9pZCBtb2RlbFJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpOwotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lOb2RlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODhhMjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBub2RlcyB0byBiZSBhZGFwdGVkLgotICogCi0gKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyB0eXBlIG9mIGFkYXB0ZXIgKElBZGFwdGFibGUpIGFuZCBiYXNlCi0gKiBhZGFwdGVyIGlzIHRoYXQgdGhlc2UgYWRhcHRlcnMgYXJlIG5vdGlmaWVkIG9mIGNoYW5nZXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIFRoZSBpbmZyYXN0cnVjdHVyZSBjYWxscyB0aGlzIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIGFkYXB0ZXIgaXMKLQkgKiBhcHByb3ByaWF0ZSBmb3IgJ3R5cGUnLiBUeXBpY2FsbHksIGFkYXB0ZXJzIHJldHVybiB0cnVlIGJhc2VkIG9uCi0JICogaWRlbnRpdHkgY29tcGFyaXNvbiB0byAndHlwZScsIGJ1dCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgdGhhdCBpcywgdGhlCi0JICogZGVjaXNpb24gY2FuIGJlIGJhc2VkIG9uIGNvbXBsZXggbG9naWMuCi0JICogCi0JICovCi0JYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKTsKLQotCS8qKgotCSAqIFNlbnQgdG8gYWRhcHRlciB3aGVuIG5vdGlmaWVyIGNoYW5nZXMuIEVhY2ggbm90aWZpZXIgaXMgcmVzcG9uc2libGUgZm9yCi0JICogZGVmaW5pbmcgc3BlY2lmaWMgZXZlbnRUeXBlcywgZmVhdHVyZSBjaGFuZ2VkLCBldGMuCi0JICogCi0JICogSVNTVUU6IG1heSBiZSBtb3JlIGV2b2x2YWJsZSBpZiB0aGUgYXJndW1lbnQgd2FzIG9uZSBiaWcgJ25vdGlmaWVyCi0JICogZXZlbnQnIGluc3RhbmNlLgotCSAqLwotCXZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTI1MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIElOb2RlTm90aWZpZXJzIGNhbiBiZSBhZGFwdGVkIGJ5IElOb2RlQWRhcHRlcnMuIFRoaXMgZmFjdG9yeSBpbnRlcmZhY2UKLSAqIHByb3ZpZGVzIGEgd2F5IHRvIHByb3ZpZGUgZmFjdG9yaWVzIHdoaWNoIGFyZSBpbnZva2VkIGJ5IHRoZSBpbmZyYXN0cnVjdHVyZQotICogdG8gbWFuYWdlIHRoaXMgcHJvY2VzcywgZnJvbSBjcmVhdGluZywgdG8gYWRhcHRpbmcsIHRvIHJlbGVhc2luZywgaWYKLSAqIHJlcXVpcmVkLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlQWRhcHRlckZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhbiBhZGFwdGVyIGZhY3RvcnkgaXMgdG8gY3JlYXRlIGFuIGFkYXB0ZXIgYW5kCi0JICogYXNzb2NpYXRlIGl0IHdpdGggYW4gSU5vZGVOb3RpZmllci4gVGhpcyBhZGFwdCBtZXRob2QgTWV0aG9kIHRoYXQKLQkgKiByZXR1cm5zIHRoZSBhZGFwdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0LiBUaGUKLQkgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCBhZGRBZGFwdGVyIG9uIHRoZSBhZGFwdGVkCi0JICogb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QgaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIsIGlmIGFwcHJvcHJpYXRlLgotCSAqIAotCSAqIE5vdGU6IHRoZSBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciByZXR1cm5lZCBtYXkgYmUgYSBzaW5nbGV0b24gb3Igbm90Ci0JICogLi4uIGRlcGVuZGluZyBvbiB0aGUgbmVlZHMgb2YgdGhlIElOb2RlQWRhcHRlciAuLi4gYnV0IGluIGdlbmVyYWwgaXQgaXMKLQkgKiByZWNvbW1lbmRlZCBmb3IgYW4gYWRhcHRlciB0byBiZSBzdGF0ZWxlc3MsIHNvIHRoZSBlZmZpY2llbmNpZXMgb2YgYQotCSAqIHNpbmdsZXRvbiBjYW4gYmUgZ2FpbmVkLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBub2RlIG5vdGlmaWVyIHRvIGJlIGFkYXB0ZWQKLQkgKi8KLQlJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBvYmplY3QpOwotCi0JLyoqCi0JICogVW5saWtlIGNsb25lLCB0aGlzIG1ldGhvZCBtYXkgb3IgbWF5IG5vdCByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2UsIHN1Y2gKLQkgKiBhcyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgSUFkYXB0ZXJGYWN0b3J5IGlzIGludGVuZGVkIHRvIGJlIGEgc2luZ2xldG9uLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhpcyBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpOwotCi0JLyoqCi0JICogaXNGYWN0b3J5Rm9yVHlwZSBpcyBjYWxsZWQgYnkgaW5mcmFzdHJ1Y3R1cmUgdG8gZGVjaWRlIGlmIHRoaXMgYWRhcHRlcgotCSAqIGZhY3RvcnkgaXMgYXBwb3JpYXRlIHRvIHVzZSBmb3IgYW4gYWRhcHRlciByZXF1ZXN0IHRoYXQgc3BlY2lmaWVzCi0JICogJ3R5cGUnLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIC0KLQkgKiAgICAgICAgICAgIHNhbWUgb2JqZWN0IHVzZWQgdG8gaWRlbnRpZnkvcmVxdWVzdCBhZGFwdGVycy4KLQkgKiBAcmV0dXJuIHRydWUgaWYgZmFjdG9yeSBpcyBhcHByb3ByaWF0ZSBmb3IgdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCWJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSk7Ci0KLQkvKioKLQkgKiByZWxlYXNlIGlzIGNhbGxlZCBieSBpbmZyYXN0cnVjdHVyZSB3aGVuIHRoZSBmYWN0b3J5IHJlZ2lzdHJ5IGlzCi0JICogcmVsZWFzZWQgKHdoaWNoIGlzIGRvbmUgd2hlbiBhIHN0cnVjdHVyZWQgbW9kZWwgaXMgcmVsZWFzZWQpLiBUaGlzCi0JICogaW50ZW5lZCBmb3IgdGhlIGZhY3RvcnkgdG8gYmUgYWxsb3dlZCB0byBjbGVhbiB1cCBhbnkgc3RhdGUgaW5mb3JtYXRpb24KLQkgKiBpdCBtYXkgaGF2ZS4KLQkgKiAKLQkgKiBOb3RlOiB3aGlsZSBub3QgcmVjb21tZW5kZWQsIGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zLCBpZiBpbmRpdmlkdWFsCi0JICogYWRhcHRlcnMgbmVlZCBzb21lIGNsZWFudXAgKG9yIG5lZWQgdG8gYmUgcmVsZWFzZWQpIGl0IGlzICh0eXBpY2FsbHkpCi0JICogdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkgdG8gdHJhY2sgdGhlbSwgYW5kIGluaXRpYXRlCi0JICogd2hhdCBldmVyIGNsZWFuIHVwIGlzIG5lZWRlZC4gSW4gb3RoZXIgd29ya3MsIGNsZWFudXAgYXQgdGhlIGFkYXRwZXIKLQkgKiBsZXZlbCBpcyBub3QgcHJvdmlkZWQgYnkgaW5mcmFzdHJ1Y3R1cmUuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lOb2RlTm90aWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVOb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzZmZTc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVOb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogSU5vZGVOb3RpZmllcnMgYW5kIElOb2RlQWRhcHRlcnMgZm9ybSBhIGNvbGxhYm9yYXRpb24gdGhhdCBhbGxvd3MgY2xpZW50cwotICogdG8gdXNlIHRoZSB0eXBpY2FsIGFkYXB0ZXIgcGF0dGVybiBidXQgd2l0aCBub3RpZmljYXRpb24gYWRkZWQsIHRoYXQgaXMsCi0gKiBjbGllbnQncyBhZGFwdGVycyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIG5vZGVOb3RpZmllciBjaGFuZ2VzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlTm90aWZpZXIgewotCi0JLyoqCi0JICogVGhlIGNoYW5nZSByZXByZXNlbnRzIGEgbm9uLXN0cnVjdHVyYWwgY2hhbmdlLCBzZW50IHRvIG5vZGUgbm90aWZpZXIncwotCSAqIHBhcmVudC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IENIQU5HRSA9IDE7Ci0JLyoqCi0JICogVGhlIGNoYW5nZSByZXByZXNlbnRzIGFuIGFkZCBldmVudC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IEFERCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgY2hhbmdlIHJlcHJlc2VudHMgYSByZW1vdmUgZXZlbnQuCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSAzOwotCi0JLyoqCi0JICogVGhlIGNoYW5nZSByZXByZXNlbnRzIGEgc3RydWN0dXJhbCBjaGFuZ2UsIHNlbnQgdG8gbGVhc3QtY29tbW9uIHBhcmVudAotCSAqIG9mIG5vZGUgbm90aWZpZXJzIGludm9sdmVkIGluIHRoZSBzdHJ1Y3R1cmFsIGNoYW5nZQotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgU1RSVUNUVVJFX0NIQU5HRUQgPSA0OwotCi0JLyoqCi0JICogVGhlIGNoYW5nZSByZXByZXNlbnRzIGEgbm90aWZpY2F0aW9uIHRvIHBhcmVudCBub3RpZmllciB0aGFuIGl0cwotCSAqIGNvbnRlbnRzIGhhdmUgY2hhbmdlZC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQ0hBTkdFRCA9IDU7Ci0KLQotCS8qKgotCSAqIE5PVCBBUEk6IHRoZXNlIHN0cmluZ3MgYXJlIGZvciBwcmludGluZywgc3VjaCBhcyBkdXJpbmcgZGVidWdnaW5nCi0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVWRU5UX1RZUEVfU1RSSU5HUyA9IG5ldyBTdHJpbmdbXXsidW5kZWZpbmVkIiwgIkNIQU5HRSIsICJBREQiLCAiUkVNT1ZFIiwgIlNUUlVDVFVSRV9DSEFOR0VEIiwgIkNPTlRFTlRfQ0hBTkdFRCJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCi0KLQkvKioKLQkgKiBBZGQgYW4gYWRhcHRlciBvZiB0aGlzIG5vdGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogICAgICAgICAgICB0aGUgYWRhcHRlciB0byBiZSBhZGRlZAotCSAqIAotCSAqLwotCXZvaWQgYWRkQWRhcHRlcihJTm9kZUFkYXB0ZXIgYWRhcHRlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZXhpc2l0aW5nIGFkYXB0ZXIgb2YgdHlwZSAidHlwZSIgb3IgaWYgbm9uZSBmb3VuZCBjcmVhdGUgYQotCSAqIG5ldyBhZGFwdGVyIHVzaW5nIGEgcmVnaXN0ZXJlZCBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlJTm9kZUFkYXB0ZXIgZ2V0QWRhcHRlckZvcihPYmplY3QgdHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSByZWFkLW9ubHkgQ29sbGVjdGlvbiBvZiB0aGUgQWRhcHRlcnMgdG8gdGhpcyBub3RpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIGNvbGxlY3Rpb24gb2YgYWRhcHRlcnMuCi0JICovCi0JQ29sbGVjdGlvbiBnZXRBZGFwdGVycygpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIGV4aXNpdGluZyBhZGFwdGVyIG9mIHR5cGUgInR5cGUiIG9yIG51bGwgaWYgbm9uZSBmb3VuZAotCSAqLwotCUlOb2RlQWRhcHRlciBnZXRFeGlzdGluZ0FkYXB0ZXIoT2JqZWN0IHR5cGUpOwotCi0JLyoqCi0JICogc2VudCB0byBhZGFwdGVyIHdoZW4gaXRzIG5vZGVOb3RpZmllciBjaGFuZ2VzLgotCSAqLwotCXZvaWQgbm90aWZ5KGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpOwotCi0JLyoqCi0JICogUmVtb3ZlIGFuIGFkYXB0ZXIgb2YgdGhpcyBub3RpZmllci4gSWYgdGhlIGFkYXB0ZXIgZG9lcyBub3QgZXhpc3QgZm9yCi0JICogdGhpcyBub2RlIG5vdGlmaWVyLCB0aGlzIHJlcXVlc3QgaXMgaWdub3JlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqICAgICAgICAgICAgdGhlIGFkYXB0ZXIgdG8gcmVtb3ZlCi0JICovCi0Jdm9pZCByZW1vdmVBZGFwdGVyKElOb2RlQWRhcHRlciBhZGFwdGVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVN0cnVjdHVyZWRNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JU3RydWN0dXJlZE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYTU1ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JU3RydWN0dXJlZE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VBbHJlYWR5RXhpc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLQotCi0vKioKLSAqIElTdHJ1Y3R1cmVkTW9kZWxzIGFyZSBtYWlubHkgaW50ZXJlc3RpbmcgYnkgdGhlaXIgZXh0ZW5zaW9ucyBhbmQKLSAqIGltcGxlbWVudGVycy4gVGhlIG1haW4gcHVycG9zZWQgb2YgdGhpcyBhYnN0cmFjdGlvbiBpcyB0byBwcm92aWRlIGEgY29tbW9uCi0gKiBtZWFucyB0byBtYW5hZ2UgbW9kZWxzIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIHN0cnVjdHVyZWQgZG9jdW1lbnQuCi0gKiAKLSAqIDxwPgotICogVE9ETzogdGhpcyBpbnRlcmZhY2UgbmVlZHMgdG9uIG9mIGNsZWFudXAhCi0gKiA8L3A+Ci0gKiAKLSAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZE1vZGVsIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBjbGllbnRzIHRvIGRlY2xhcmUgdGhhdCB0aGV5IGFyZSBhYm91dCB0byBtYWtlIGEKLQkgKiAibGFyZ2UiIGNoYW5nZSB0byB0aGUgbW9kZWwuIFRoaXMgY2hhbmdlIG1pZ2h0IGJlIGluIHRlcm1zIG9mIGNvbnRlbnQKLQkgKiBvciBpdCBtaWdodCBiZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZWwgaWQgb3IgYmFzZSBsb2NhdGlvbi4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIG5vdGlmaWNhdGlvbiB0byBsaXN0ZW5lcnMgaXMKLQkgKiBzZW50IG9ubHkgb25jZS4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCB3aG8gaXMgbWFraW5nIHRoZXNlIGNoYW5nZXMgaGFzIHRoZSByZXNwb25zaWJpbGl0eQotCSAqIHRvIHJlc3RvcmUgdGhlIG1vZGVsJ3Mgc3RhdGUgb25jZSBmaW5pc2hlZCB3aXRoIHRoZSBjaGFuZ2VzLiBTZWUKLQkgKiBnZXRNZW1lbnRvIGFuZCByZXN0b3JlU3RhdGUuCi0JICogCi0JICogVGhlIG1ldGhvZCBpc01vZGVsU3RhdGVDaGFuZ2luZyBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkZXRlcm1pbmUgaWYKLQkgKiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBpbiBhIGNoYW5nZSBzZXF1ZW5jZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIG1hdGNoZWQgcGFpciB0byBjaGFuZ2VkTW9kZWwsIGFuZCBtdXN0IGJlIGNhbGxlZAotCSAqIGJlZm9yZSBjaGFuZ2VkTW9kZWwuIEEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3Qgbm9yIGNhbGwgYWJvdXRUb0NoYW5nZU1vZGVsIHdpdGhvdXQKLQkgKiBjYWxsaW5nIGNoYW5nZWRNb2RlbCBsYXRlciBmcm9tIHRoZSBzYW1lIFRocmVhZC4KLQkgKi8KLQl2b2lkIGFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0Jdm9pZCBhZGRNb2RlbExpZmVjeWNsZUxpc3RlbmVyKElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCXZvaWQgYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKElNb2RlbFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3Rlcik7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGEgY2xpZW50IGNvbnRyb2xsZWQgd2F5IG9mIG5vdGlmeWluZyBhbGwgTW9kZWxFdmVudAotCSAqIGxpc3RlbmVycyB0aGF0IHRoZSBtb2RlbCBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1ldGhvZCBpcyBhIG1hdGNoZWQKLQkgKiBwYWlyIHRvIGFib3V0VG9DaGFuZ2VNb2RlbCwgYW5kIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFib3V0VG9DaGFuZ2VNb2RlbAotCSAqIC4uLiBvciBzb21lIGxpc3RlbmVycyBjb3VsZCBiZSBsZWZ0IHdhaXRpbmcgaW5kZWZpbml0ZWx5IGZvciB0aGUKLQkgKiBjaGFuZ2VkIGV2ZW50LiBTbywgaXRzIHN1Z2dlc3RlZCB0aGF0IGNoYW5nZWRNb2RlbCBhbHdheXMgYmUgaW4gYQotCSAqIGZpbmFsbHkgY2xhdXNlLiBMaWtld2lzZSwgYSBjbGllbnQgc2hvdWxkIG5ldmVyIGNhbGwgY2hhbmdlZE1vZGVsCi0JICogd2l0aG91dCBjYWxsaW5nIGFib3V0VG9DaGFuZ2VNb2RlbCBmaXJzdC4KLQkgKiAKLQkgKiBJbiB0aGUgY2FzZSBvZiBlbWJlZGRlZCBjYWxscywgdGhlIG5vdGlmaWNhdGlvbiBpcyBqdXN0IHNlbnQgb25jZS4KLQkgKiAKLQkgKi8KLQl2b2lkIGNoYW5nZWRNb2RlbCgpOwotCi0JbG9uZyBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoSVJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogQHNlZSBJTW9kZWxNYW5hZ2VyI2NvcHlNb2RlbEZvckVkaXQoU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjb3B5KFN0cmluZyBpZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UsIFJlc291cmNlQWxyZWFkeUV4aXN0czsKLQotCS8qKgotCSAqIERpc2FibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gdGhlIGFiaWxpdHkgdG8gZW5hYmxlIGFuZCBkaXNhYmxlIFVuZG8gbWFuYWdlbWVudCBmb3IgdGhlCi0JICogICAgICAgICAgICAgbW9kZWwgY2Fubm90IGJlIGd1YXJhbnRlZWQgYXMgaXQgaW1wbGljaXRseSByZXF1aXJlcwotCSAqICAgICAgICAgICAgIGtub3dsZWRnZSBvZiB0aGUgdW5kZXJseWluZyB1bmRvL3JlZG8gaW1wbGVtZW50YXRpb24KLQkgKi8KLQl2b2lkIGRpc2FibGVVbmRvTWFuYWdlbWVudCgpOwotCi0JLyoqCi0JICogRW5hYmxlIHVuZG8gbWFuYWdlbWVudC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIHRoZSBhYmlsaXR5IHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBVbmRvIG1hbmFnZW1lbnQgZm9yIHRoZQotCSAqICAgICAgICAgICAgIG1vZGVsIGNhbm5vdCBiZSBndWFyYW50ZWVkIGFzIGl0IGltcGxpY2l0bHkgcmVxdWlyZXMKLQkgKiAgICAgICAgICAgICBrbm93bGVkZ2Ugb2YgdGhlIHVuZGVybHlpbmcgdW5kby9yZWRvIGltcGxlbWVudGF0aW9uCi0JICovCi0Jdm9pZCBlbmFibGVVbmRvTWFuYWdlbWVudCgpOwotCi0JLyoqCi0JICogRW5kIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKTsKLQotCS8qKgotCSAqIEVuZCByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgYSBjbGllbnQtZGVmaW5lZCB2YWx1ZSBmb3Igd2hhdCB0aGF0IGNsaWVudCAoYW5kL29yIGxvYWRlcikKLQkgKiBjb25zaWRlcnMgdGhlICJiYXNlIiBvZiB0aGUgc3RydWN0dXJlZCBtb2RlbC4gRnJlcXVlbnRseSB0aGUgbG9jYXRpb24KLQkgKiBpcyBlaXRoZXIgYSB3b3Jrc3BhY2Ugcm9vdC1yZWxhdGl2ZSBwYXRoIG9mIGEgd29ya3NwYWNlIHJlc291cmNlIG9yIGFuCi0JICogYWJzb2x1dGUgcGF0aCBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi0JICovCi0JU3RyaW5nIGdldEJhc2VMb2NhdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBjb250ZW50IHR5cGUgaWRlbnRpZmllciAoU3RyaW5nKSBmb3IgdGhpcyBtb2RlbC4KLQkgKiAgICAgICAgIFRoaXMgdmFsdWUgbWF5IGJlIG1vcmUgYWNjdXJhdGUgdGhhbiB0aGUgY29udGVudCB0eXBlIGFnYWluc3QKLQkgKiAgICAgICAgIHdoaWNoIHRoZSBtb2RlbCBoYW5kbGVyIHdhcyByZWdpc3RlcmVkLgotCSAqICAgICAgICAgCi0JICogICAgICAgICBAc2VlIElNb2RlbEhhbmRsZXIjZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoKQotCSAqLwotCVN0cmluZyBnZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG1vZGVsJ3MgRmFjdG9yeVJlZ2lzdHJ5LiBBIG1vZGVsIGlzIG5vdCB2YWxpZCB3aXRob3V0IG9uZS4KLQkgKi8KLQlGYWN0b3J5UmVnaXN0cnkgZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0KLQkvKioKLQkgKiBUaGUgaWQgaXMgdGhlIGlkIHRoYXQgdGhlIG1vZGVsIG1hbmFnZXIgdXNlcyB0byBpZGVudGlmeSB0aGlzIG1vZGVsCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBhIHRleHQgb2Zmc2V0IHdpdGhpbiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudAotCSAqIEByZXR1cm4gYW4gSW5kZXhlZFJlZ2lvbiBjb250YWluaW5nIHRoaXMgb2Zmc2V0IG9yIG51bGwgaWYgb25lIGNvdWxkCi0JICogICAgICAgICBub3QgYmUgZm91bmQKLQkgKi8KLQlJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBtb2RlbCdzIGhhbmRsZXIKLQkgKi8KLQlJTW9kZWxIYW5kbGVyIGdldE1vZGVsSGFuZGxlcigpOwotCi0JSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbAotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudCgpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlZGl0LXJlc3BvbnNpYmxlIHJlZmVyZW5jZSBjb3VudCBvZgotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudEZvckVkaXQoKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVhZGVyIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JSZWFkKCk7Ci0KLQlPYmplY3QgZ2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKCk7Ci0KLQkvKioKLQkgKiBHZXQgVVJJIHJlc29sdXRpb24gaGVscGVyCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSB1c2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigqKSBpbnN0ZWFkCi0JICovCi0JVVJJUmVzb2x2ZXIgZ2V0UmVzb2x2ZXIoKTsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBtb2RpZmljYXRpb24gZGF0ZSBvZiB1bmRlcmx5aW5nIHJlc291cmNlLCB3aGVuIHRoaXMgbW9kZWwgd2FzIG9wZW4sIG9yCi0JICogbGFzdCBzYXZlZC4gKE5vdGU6IGZvciB0aGlzIHZlcnNpb24sIHRoZSBjbGllbnQgbXVzdCBtYW5hZ2UgdGhlCi0JICogYWNjdXJhY3kgb2YgdGhpcyBkYXRhKQotCSAqLwotCWxvbmcgZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQotCS8qKgotCSAqIEdldCB1bmRvIG1hbmFnZXIuCi0JICovCi0JSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNEaXJ0eSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIGlzIHdpdGhpbiBhCi0JICogImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIgc2VxdWVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlbFN0YXRlQ2hhbmdpbmcoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNOZXcoKTsKLQotCWJvb2xlYW4gaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgaWYgdGhlIG1vZGVsIGlzIGRpcnR5IGFuZCBpZiB0aGUgbW9kZWwgaXMKLQkgKiBzaGFyZWQgZm9yIHdyaXRlIGFjY2Vzcy4gVGhlIGxhc3Qgd3JpdGVyIGFzIHRoZSByZXNwb25zaWJpbGl0eSB0byBiZQotCSAqIHN1cmUgdGhlIHVzZXIgaXMgcHJvbXB0ZWQgdG8gc2F2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGVpdGhlciBpc1NoYXJlZEZvclJlYWQgb3IgaXNTaGFyZWRGb3JFZGl0Ci0JICogaXMgdHJ1ZS4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWRGb3JFZGl0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWRGb3JSZWFkKCk7Ci0KLQkvKioKLQkgKiBuZXdJbnN0YW5jZSBpcyBzaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgdGhhdCB0aGUgbmV3SW5zdGFuY2UgY29udGFpbnMKLQkgKiBubyBjb250ZW50LiBJdHMgcHVycG9zZSBpcyBzbyBjbGllbnRzIGNhbiBnZXQgYSB0ZW1wb3JhcnksIHVubWFuYWdlZCwKLQkgKiBtb2RlbCBvZiB0aGUgc2FtZSAidHlwZSIgYXMgdGhlIG9yaWdpbmFsLiBOb3RlOiB0aGUgY2xpZW50IG1heSBzdGlsbAotCSAqIG5lZWQgdG8gZG8gc29tZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgbW9kZWwgcmV0dXJuZWQgYnkgbmV3SW5zdGFuY2UsCi0JICogZGVwZW5kaW5nIG9uIGRlc2lyZWQgdXNlLiBGb3IgZXhhbXBsZSwgdGhlIG9ubHkgZmFjdG9yaWVzIGluIHRoZQotCSAqIG5ld0luc3RhbmNlIGFyZSB0aG9zZSB0aGF0IHdvdWxkIGJlIG5vcm1hbGx5IGJlIGNyZWF0ZWQgZm9yIGEgbW9kZWwgb2YKLQkgKiB0aGUgZ2l2ZW4gY29udGVudFR5cGUuIE90aGVycyBhcmUgbm90IGNvcGllZCBhdXRvbWF0aWNhbGx5LCBhbmQgaWYKLQkgKiBkZXNpcmVkLCBzaG91bGQgYmUgYWRkZWQgYnkgY2xpZW50LgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3SW5zdGFuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBhIHJlaW5pdGlhbGl6YXRpb24gcHJvY2VkdXJlLiBGb3IgdGhpcyBtb2RlbC4gTm90ZSBmb3IgZnV0dXJlOgotCSAqIHRoZXJlIG1heSBiZSBhIGRheSB3aGVyZSB0aGUgbW9kZWwgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCBpcyBhCi0JICogZGlmZmVyZW50IGluc3RhbmNlIHRoYW4gdGhlIGluc3RhbmNlIGl0IHdhcyBjYWxsZWQgb24uIFRoaXMgd2lsbCBvY2N1cgotCSAqIHdoZW4gdGhlcmUgaXMgZnVsbCBzdXBwb3J0IGZvciAic2F2ZSBhcyIgdHlwZSBmdW5jdGlvbnMsIHdoZXJlIHRoZQotCSAqIG1vZGVsIGNvdWxkIHRoZW9yZXRpY2FsbHkgY2hhbmdlIGNvbXBsZXRlbHkuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCByZWluaXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqIAotCSAqLwotCXZvaWQgcmVsZWFzZUZyb21FZGl0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqIAotCSAqLwotCXZvaWQgcmVsZWFzZUZyb21SZWFkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJlcGxlbmlzaGVzIHRoZSBtb2RlbCB3aXRoIHRoZSByZXNvdXJjZSB3aXRob3V0IHNhdmluZwotCSAqIGFueSBwb3NzaWJsZSBjaGFuZ2VzLiBJdCBpcyB1c2VkIHdoZW4gb25lIGVkaXRvciBtYXkgYmUgY2xvc2luZywgYW5kCi0JICogc3BlY2lmaWNhbGx5IHNheXMgbm90IHRvIHNhdmUgdGhlIG1vZGVsLCBidXQgYW5vdGhlciAiZGlzcGxheSIgb2YgdGhlCi0JICogbW9kZWwgc3RpbGwgbmVlZHMgdG8gaGFuZyBvbiB0byBzb21lIG1vZGVsLCBzbyBuZWVkcyBhIGZyZXNoIGNvcHkuCi0JICogCi0JICogT25seSB2YWxpZCBmb3IgdXNlIHdpdGggbWFuYWdlZCBtb2RlbHMuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCByZWxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXZvaWQgcmVtb3ZlTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQl2b2lkIHJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEEgbWV0aG9kIHRoYXQgbW9kaWZpZXMgdGhlIG1vZGVsJ3Mgc3luY2hyb25pemF0aW9uIHN0YW1wIHRvIG1hdGNoIHRoZQotCSAqIHJlc291cmNlLiBUdXJucyBvdXQgdGhlcmUncyBzZXZlcmFsIHdheXMgb2YgZG9pbmcgaXQsIHNvIHRoaXMgZW5zdXJlcyBhCi0JICogY29tbW9uIGFsZ29yaXRobS4KLQkgKi8KLQl2b2lkIHJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoSVJlc291cmNlIHJlc291cmNlKTsKLQotCXZvaWQgcmVzb3VyY2VEZWxldGVkKCk7Ci0KLQl2b2lkIHJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCk7Ci0KLQl2b2lkIHNhdmUoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHdpbGwgc2F2ZSBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHByaW9yaXRpZXMgc3BlY2lmaWVkIGZvciB0aGUgSUZpbGUgCi0JICovCi0Jdm9pZCBzYXZlKEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXZvaWQgc2F2ZShJRmlsZSBpRmlsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB3aWxsIHNhdmUgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBwcmlvcml0aWVzIHNwZWNpZmllZCBmb3IgdGhlIElGaWxlIAotCSAqLwotCXZvaWQgc2F2ZShJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0Jdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldHMgdGhlIGJhc2UgbG9jYXRpb24gb2YgdGhpcyBtb2RlbCB0byB0aGUgbmV3IHZhbHVlLCBhbHNvIHVwZGF0aW5nCi0JICogdGhlIHZhbHVlIGluIGl0cyBVUkkgcmVzb2x1dGlvbiBoZWxwZXIgaWYgb25lIGlzIHByZXNlbnQuCi0JICogCi0JICogQHBhcmFtIG5ld0Jhc2VMb2NhdGlvbgotCSAqLwotCXZvaWQgc2V0QmFzZUxvY2F0aW9uKFN0cmluZyBuZXdCYXNlTG9jYXRpb24pOwotCi0JcHVibGljIHZvaWQgc2V0RGlydHlTdGF0ZShib29sZWFuIGRpcnR5U3RhdGUpOwotCi0Jdm9pZCBzZXRGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KTsKLQotCS8qKgotCSAqIFRoZSBpZCBpcyB0aGUgaWQgdGhhdCB0aGUgbW9kZWwgbWFuYWdlciB1c2VzIHRvIGlkZW50aWZ5IHRoaXMgbW9kZWwKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyBpZCkgdGhyb3dzIFJlc291cmNlSW5Vc2U7Ci0KLQl2b2lkIHNldE1vZGVsSGFuZGxlcihJTW9kZWxIYW5kbGVyIG1vZGVsSGFuZGxlcik7Ci0KLQl2b2lkIHNldE1vZGVsTWFuYWdlcihJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcik7Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdTdGF0ZShib29sZWFuIG5ld1N0YXRlKTsKLQotCS8qKgotCSAqIFNldHMgYSAiZmxhZyIgdGhhdCByZWluaXRpYWxpemF0aW9uIGlzIG5lZWRlZC4KLQkgKi8KLQl2b2lkIHNldFJlaW5pdGlhbGl6ZU5lZWRlZChib29sZWFuIGIpOwotCi0JLyoqCi0JICogSG9sZHMgYW55IGRhdGEgdGhhdCB0aGUgcmVpbml0aWFsaXphdGlvbiBwcm9jZWR1cmUgbWlnaHQgZmluZCB1c2VmdWwgaW4KLQkgKiByZWluaXRpYWxpemluZyB0aGUgbW9kZWwuIFRoaXMgaXMgaGFuZHksIHNpbmNlIHRoZSByZWluaXRpYWxpemF0aW9uIG1heQotCSAqIG5vdCB0YWtlIHBsYWNlIGF0IG9uY2UsIGFuZCBzb21lICJvbGQiIGRhdGEgbWF5IGJlIG5lZWRlZCB0byBwcm9wZXJseQotCSAqIHVuZG8gcHJldmlvdXMgc2V0dGluZ3MuIE5vdGU6IHRoZSBwYXJhbWV0ZXIgd2FzIGludGVudGlvbmFsbHkgbWFkZSB0bwotCSAqIGJlIG9mIHR5cGUgJ09iamVjdCcgc28gZGlmZmVyZW50IG1vZGVscyBjYW4gdXNlIGluIGRpZmZlcmVudCB3YXlzLgotCSAqLwotCXZvaWQgc2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogU2V0IHRoZSBVUkkgcmVzb2x1dGlvbiBoZWxwZXIKLQkgKi8KLQl2b2lkIHNldFJlc29sdmVyKFVSSVJlc29sdmVyIHVyaVJlc29sdmVyKTsKLQotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KTsKLQotCS8qKgotCSAqIFNldCB1bmRvIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBzZXRVbmRvTWFuYWdlcihJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0luZGV4ZWRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSW5kZXhlZFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWU5NTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSW5kZXhlZFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi0KLS8qKgotICogVGhpcyB0eXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgcG9zaXRpb25zIGFuZCBsZW5ndGhzIGluIHNvdXJjZS4gTm90aWNlIHRoYXQKLSAqIHdoaWxlIGdldEVuZE9mZnNldCBhbmQgZ2V0TGVuZ3RoIGFyZSByZWR1bmRhbnQsIGdpdmVuIHRoYXQKLSAqIAotICogPHByZT4KLSAqIDxjb2RlPgotICogICAgICAgICAgZ2V0RW5kT2Zmc2V0KCkgPT0gZ2V0U3RhcnRPZmZzZXQoKSArIGdldExlbmd0aCgpOyAKLSAqIDwvY29kZT4KLSAqIDwvcHJlPgotICogCi0gKiB3ZSBwcm92aWRlIChyZXF1aXJlKSBib3RoIHNpbmNlIGluIHNvbWUgY2FzZXMgaW1wbGVtZW50b3JzIG1heSBiZSBhYmxlIHRvCi0gKiBwcm92aWRlIG9uZSBvciB0aGUgb3RoZXIgbW9yZSBlZmZpY2llbnRseS4KLSAqIAotICogTm90ZTogaXQgaXMgbm90IHBhcnQgb2YgdGhlIEFQSSBjb250cmFjdCB0aGF0IGltcGxlbWVudG9ycyBvZiBJbmRleGVkUmVnaW9uIC0tCi0gKiBhcyBhIHdob2xlIGNvbGxlY3Rpb24gZm9yIGEgcGFydGljdWxhciBzb3VyY2UgLS0gbXVzdCBjb21wbGV0ZWx5IGNvdmVyIHRoZQotICogb3JpZ2luYWwgc291cmNlLiBUaGV5IGN1cnJlbnRseSBvZnRlbiBkbywgc28gdGhvdWdodCBJJ2QgbWVudGlvbiBleHBsaWNpdGx5Ci0gKiB0aGlzIG1heSBub3QgYWx3YXlzIGJlIHRydWUuCi0gKiAKLSAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJbmRleGVkUmVnaW9uIHsKLQotCS8qKgotCSAqIENhbiBiZSB1c2VkIHRvIHRlc3QgaWYgdGhlIGluZGV4ZWQgcmVnaW9ucyBjb250YWlucyB0aGUgdGVzdCBwb3NpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGVzdFBvc2l0aW9uCi0JICogQHJldHVybiB0cnVlIGlmIHRlc3QgcG9zaXRpb24gaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHN0YXJ0IG9mZnNldAotCSAqICAgICAgICAgYW5kIGxlc3MgdGhhbiBzdGFydCBvZmZzZXQgcGx1cyBsZW5ndGguCi0JICovCi0JYm9vbGVhbiBjb250YWlucyhpbnQgdGVzdFBvc2l0aW9uKTsKLQotCS8qKgotCSAqIENhbiBiZSB1c2VkIHRvIGdldCBlbmQgb2Zmc2V0IG9mIHNvdXJjZSB0ZXh0LCByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YKLQkgKiBkb2N1bW50LiBJbXBsZW1lbnRlcnMgc2hvdWxkIHJldHVybiAtMSBpZiwgb3Igc29tZSByZWFzb24sIHRoZSByZWdpb24KLQkgKiBpcyBub3QgdmFsaWQuCi0JICogCi0JICogQHJldHVybiBlbmRvZmZzZXQKLQkgKi8KLQlpbnQgZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBDYW4gYmUgdXNlZCB0byBnZXQgc291cmNlIHBvc3Rpb24gb2YgYmVnaW5uaW5nIG9mIGluZGV4ZWQgcmVnaW9uLgotCSAqIEltcGxlbWVudGVycyBzaG91bGQgcmV0dXJuIC0xIGlmLCBvciBzb21lIHJlYXNvbiwgdGhlIHJlZ2lvbiBpcyBub3QKLQkgKiB2YWxpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCBwb3NpdGlvbiBvZiBzdGFydCBvZiBpbmRleCByZWdpb24uCi0JICovCi0JaW50IGdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBDYW4gYmUgdXNlZCB0byBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIHRleHQuIEltcGxlbWVudGVycyBzaG91bGQKLQkgKiByZXR1cm4gLTEgaWYsIG9yIHNvbWUgcmVhc29uLCB0aGUgcmVnaW9uIGlzIG5vdCB2YWxpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCBwb3NpdGlvbiBvZiBsZW5ndGggb2YgaW5kZXggcmVnaW9uLgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1N0cnVjdHVyZWRNb2RlbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlYmM0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1N0cnVjdHVyZWRNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTWFuYWdlckltcGw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBDbGFzcyB0byBhbGxvdyBhY2Nlc3MgdG8gTW9kZWxNYW5hZ2VyLiBOb3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSB0aGUgb25lIHRoYXQgaXMgaW4KLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHRydWN0dXJlZE1vZGVsTWFuYWdlcgotICovCi1maW5hbCBwdWJsaWMgY2xhc3MgU3RydWN0dXJlZE1vZGVsTWFuYWdlciB7Ci0JLyoqCi0JICogRG8gbm90IGFsbG93IGluc3RhbmNlcyB0byBiZSBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZE1vZGVsTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGluc3RhbmNlIG9mIElNb2RlbE1hbmFnZXIuIFJldHVybnMgbnVsbCBpZiBtb2RlbAotCSAqIG1hbmFnZXIgY2FuIG5vdCBiZSBjcmVhdGVkIG9yIGlzIG5vdCB2YWxpZCAoc3VjaCBhcywgd2hlbiB3b3JrYmVuY2ggaXMKLQkgKiBzaHV0dGluZyBkb3duKS4KLQkgKiAKLQkgKiBAcmV0dXJuIElNb2RlbE1hbmFnZXIgLSByZXR1cm5zIHRoZSBvbmUgbW9kZWwgbWFuYWdlciBmb3Igc3RydWN0dXJlZAotCSAqICAgICAgICAgbW9kZWwKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSB0aGUgb25lIHRoYXQgaXMgaW4KLQkgKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCWJvb2xlYW4gaXNSZWFkeSA9IGZhbHNlOwotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCXdoaWxlICghaXNSZWFkeSkgewotCQkJQnVuZGxlIGxvY2FsQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFNTRUNvcmVQbHVnaW4uSUQpOwotCQkJaW50IHN0YXRlID0gbG9jYWxCdW5kbGUuZ2V0U3RhdGUoKTsKLQkJCWlmIChzdGF0ZSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQkJaXNSZWFkeSA9IHRydWU7Ci0JCQkJLy8gZ2V0SW5zdGFuY2UgaXMgYSBzeW5jaHJvbml6ZWQgc3RhdGljIG1ldGhvZC4KLQkJCQltb2RlbE1hbmFnZXIgPSBNb2RlbE1hbmFnZXJJbXBsLmdldEluc3RhbmNlKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGF0ZSA9PSBCdW5kbGUuU1RBUlRJTkcpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlLCBqdXN0IGxvb3AgYWdhaW4KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGF0ZSA9PSBCdW5kbGUuU1RPUFBJTkcgfHwgc3RhdGUgPT0gQnVuZGxlLlVOSU5TVEFMTEVEKSB7Ci0JCQkJaXNSZWFkeSA9IHRydWU7Ci0JCQkJbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vdCBzdXJlIGFib3V0IG90aGVyIHN0YXRlcywgJ3Jlc29sdmVkJywgJ2luc3RhbGxlZCcKLQkJCQlpc1JlYWR5ID0gdHJ1ZTsKLQkJCQltb2RlbE1hbmFnZXIgPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbE1hbmFnZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRW5jb2RlZERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lFbmNvZGVkRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2NDcxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lFbmNvZGVkRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHN0cmljdGx5IHRvIGRlZmluZSBpbXBvcnRhbnQgImRvY3VtZW50IHByb3BlcnRpZXMiIG5vdAotICogZm91bmQgaW4gSURvY3VtZW50LCBidXQgbm90IGNlbnRyYWwgdG8gIlN0cnVjdHVyZWREb2N1bWVudCIuCi0gKiAKLSAqIEl0cyBub3QgdG8gYmUgYmUgaW1wbG1lbnRlZCBieSBjbGllbnRzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElFbmNvZGVkRG9jdW1lbnQgZXh0ZW5kcyBJRG9jdW1lbnQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5jb2RpbmcgbWVtZW50byBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbmNvZGluZyBtZW1lbnRvIGZvciB0aGlzIGRvY3VtZW50LgotCSAqLwotCUVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZWZlcnJlZCBsaW5lIGRlbGltaXRlciBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKi8KLQlTdHJpbmcgZ2V0UHJlZmVycmVkTGluZURlbGltaXRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZW5jb2RpbmcgbWVtZW50byBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKiAKLQkgKiBJcyBub3QgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMsIG9ubHkgZG9jdW1lbnQgY3JlYXRpb24gY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYWxFbmNvZGluZ01lbWVudG8KLQkgKi8KLQl2b2lkIHNldEVuY29kaW5nTWVtZW50byhFbmNvZGluZ01lbWVudG8gbG9jYWxFbmNvZGluZ01lbWVudG8pOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJlZmVycmVkTGluZURlbGltaXRlci4gSXMgbm90IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLCBvbmx5Ci0JICogZG9jdW1lbnQgY3JlYXRpb24gY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYmFibGVMaW5lRGVsaW1pdGVyCi0JICovCi0Jdm9pZCBzZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKFN0cmluZyBwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTdHJ1Y3R1cmVkRG9jdW1lbnRQcm9wb3NlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JU3RydWN0dXJlZERvY3VtZW50UHJvcG9zZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwZjQ3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTdHJ1Y3R1cmVkRG9jdW1lbnRQcm9wb3NlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotCi0KLS8qKgotICogQSBJU3RydWN0dXJlZERvY3VtZW50IGlzIGEgY29sbGVjdGlvbiBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLiBJdCdzCi0gKiBvZnRlbiBjYWxsZWQgYSAiZmxhdCBtb2RlbCIgYmVjYXVzZSBpdHMgZG9lcyBjb250YWluIHNvbWUgc3RydWN0dXJhbAotICogaW5mb3JtYXRpb24sIGJ1dCBub3QgdmVyeSBtdWNoLCB1c3VhbGx5LCBhdCBtb3N0LCBhIGZldyBsZXZlbHMgb2YKLSAqIGNvbnRhaW5tZW50LgotICogCi0gKiBDbGllbnRzIHNob3VsZCBub3QgaW1wbGVtZW50LgotICogCi0gKiBAZGVwcmVjYXRlZCAtIHdhcyBuZXZlciB1c2VkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWREb2N1bWVudFByb3Bvc2VkIGV4dGVuZHMgSURvY3VtZW50LCBJRG9jdW1lbnRFeHRlbnNpb24sIElBZGFwdGFibGUgewotCi0JLyoqCi0JICogVGhlIGRvY3VtZW50IGNoYW5naW5nIGxpc3RlbmVycyByZWNlaXZlcyB0aGUgc2FtZSBldmVudHMgYXMgdGhlCi0JICogZG9jdW1lbnQgbGlzdGVuZXJzLCBidXQgdGhlIGRpZmZlcmVuY2UgaXMgdGhlIHRpbWluZyBhbmQKLQkgKiBzeW5jaHJvbml6YXRpb24gb2YgZGF0YSBjaGFuZ2VzIGFuZCBub3RpZmljYXRpb25zLgotCSAqLwotCXZvaWQgYWRkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIHRoaXMgQVBJIGVuc3VyZXMgdGhhdCBhbnkgcG9ydGlvbiBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIHN0YXJ0T2ZmIHRvCi0JICogbGVuZ3RoIGlzIG5vdCByZWFkb25seSAodGhhdCBpcywgdGhhdCBpdHMgZWRpdGFibGUpLiBOb3RlIHRoYXQgaWYgdGhlCi0JICogcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBvdGhlciByZWFkb25seSByZWdpb25zLCB0aG9zZSBvdGhlciByZWFkb25seQotCSAqIHJlZ2lvbnMgd2lsbCBiZSBhZGp1c3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICovCi0Jdm9pZCBjbGVhclJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRydWUgaWYgYW55IHBvcnRpb24gb2Ygc3RhcnRPZmZzZXQgdG8gbGVuZ3RoIGlzIHJlYWRvbmx5Ci0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ2lvbiBjb250YWluZWQgYnkgb2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIFJlc3R1cm5zIGEgbGlzdCBvZiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqIAotCSAqIE5vdGU6IHBvc3NpYmx5IGV4cGVuc2l2ZSBjYWxsLCBub3QgdG8gYmUgdXNlZCBjYXN1YWxseS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldFJlZ2lvbkxpc3QoKTsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGlzIGRvY3VtZW50LgotCSAqIAotCSAqIFNhbWUgYXMgJ2dldCcgaW4gc3VwZXIgY2xhc3MsIGFkZGVkIGZvciBkZXNjcmlwdGl2ZW5lc3MuCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBvZiB0aGlzIGRvY3VtZW50LgotCSAqLwotCVN0cmluZyBnZXRUZXh0KCk7Ci0KLQkvKioKLQkgKiBjYXVzZXMgdGhhdCBwb3J0aW9uIG9mIHRoZSBkb2N1bWVudCBmcm9tIHN0YXJ0T2Zmc2V0IHRvIGxlbmd0aCB0byBiZQotCSAqIG1hcmtlZCBhcyByZWFkb25seS4gTm90ZSB0aGF0IGlmIHRoaXMgcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBzb21lIG90aGVyCi0JICogcmVnaW9uIHdpdGggaXMgcmVhZG9ubHksIHRoZSByZWdpb25zIGFyZSBlZmZlY3Rpdmx5IGNvbWJpbmVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKi8KLQl2b2lkIG1ha2VSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogbmV3SW5zdGFuY2UgaXMgc2ltaWxhciB0byBjbG9uZSwgZXhjZXB0IGl0IGNvbnRhaW5zIG5vIGRhdGEuIE9uZQotCSAqIGltcG9ydGFudCB0aGluZyB0byBkdXBsaWNhdGUgaXMgdGhlIHBhcnNlciwgd2l0aCB0aGUgcGFyc2VyIGNvcnJlY3RseQotCSAqICJjbG9uZWQiLCBpbmNsdWRpbmcgaXRzIHRva2VuaW56ZXIsIGJsb2NrIHRhZ3MsIGV0Yy4KLQkgKiAKLQkgKiBOT1RFOiBldmVuIGFmdGVyIG9idGFpbmluZyBhICduZXdJbnN0YW5jZScgdGhlIGNsaWVudCBtYXkgaGF2ZSB0byBkbwotCSAqIHNvbWUgaW5pdGlhbGl6YXRpb24sIGZvciBleGFtcGxlLCBpdCBtYXkgbmVlZCB0byBhZGQgaXRzIG93biBtb2RlbAotCSAqIGxpc3RlbmVycy4gT3IsIGFzIGFub3RoZXIgZXhhbXBsZSwgaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGEKLQkgKiBwYXJzZXIgb2YgdHlwZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIsIHRoZW4gdGhlIGNsaWVudCBtYXkgbmVlZAotCSAqIHRvIGFkZCBpdHMgb3duIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgdG8gdGhhdCBwYXJzZXIsIGlmIGl0IGlzCi0JICogaW4gZmFjdCBuZWVkZWQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFByb3Bvc2VkIG5ld0luc3RhbmNlKCk7Ci0KLQkvKioKLQkgKiBUaGUgZG9jdW1lbnQgY2hhbmdpbmcgbGlzdGVuZXJzIHJlY2VpdmVzIHRoZSBzYW1lIGV2ZW50cyBhcyB0aGUKLQkgKiBkb2N1bWVudCBsaXN0ZW5lcnMsIGJ1dCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgdGltaW5nIGFuZAotCSAqIHN5bmNocm9uaXphdGlvbiBvZiBkYXRhIGNoYW5nZXMgYW5kIG5vdGlmaWNhdGlvbnMuCi0JICovCi0Jdm9pZCByZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICogCi0JICogcmVwbGFjZVRleHQgcmVwbGFjZXMgdGhlIHRleHQgZnJvbSBvbGRTdGFydCB0byBvbGRFbmQgd2l0aCB0aGUgbmV3IHRleHQKLQkgKiBmb3VuZCBpbiB0aGUgcmVxdWVzdGVkQ2hhbmdlIHN0cmluZy4gSWYgb2xkU3RhcnQgYW5kIG9sZEVuZCBhcmUgZXF1YWwsCi0JICogaXQgaXMgYW4gaW5zZXJ0aW9uIHJlcXVlc3QuIElmIHJlcXVlc3RlZENoYW5nZSBpcyBudWxsIChvciBlbXB0eSkgaXQgaXMKLQkgKiBhIGRlbGV0ZSByZXF1ZXN0LiBPdGhlcndpc2UgaXQgaXMgYSByZXBsYWNlIHJlcXVlc3QuCi0JICogCi0JICogU2ltaWxhciB0byAncmVwbGFjZScgaW4gc3VwZXIgY2xhc3MuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UpOwotCi0JLyoqCi0JICogTm90ZSwgc2FtZSBhcyByZXBsYWNlVGV4dCBBUEksIGJ1dCB3aWxsIGFsbG93IHJlYWRvbmx5IGFyZWFzIHRvIGJlCi0JICogcmVwbGFjZWQuIFRoaXMgbWV0aG9kIGlzIG5vdCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cywgb25seQotCSAqIGluZnJhc3RydWN0dXJlLiBGb3IgZXhhbXBsZSwgb25lIGNhc2Ugd2hlcmUgaXRzIG9rIGlzIHdpdGggdW5kbwotCSAqIG9wZXJhdGlvbnMgKHNpbmNlLCBwcmVzdW1hYmx5LCBpZiB1c2VyIGp1c3QgZGlkIHNvbWV0aGluZyB0aGF0Ci0JICogaGFwcGVuZGVkIHRvIGludm9sdmUgc29tZSBpbnNlcnRpbmcgcmVhZG9ubHkgdGV4dCwgdGhleSBzaG91bGQgbm9ybWFsbHkKLQkgKiBiZSBhbGxvd2VkIHRvIHN0aWxsIHVuZG8gdGhhdCBvcGVyYXRpb24uIFRoZXJlIG1pZ2h0IGJlIG90aGVyIGNhc2VzCi0JICogd2hlcmUgaXRzIHVzZWQgdG8gZ2l2ZSB0aGUgdXNlciBhIGNob2ljZSwgZS5nLiAieW91IGFyZSBhYm91dCB0bwotCSAqIG92ZXJ3cml0ZSByZWFkIG9ubHkgcG9ydGlvbnMsIGRvIHlvdSB3YW50IHRvIGNvbnRpbnVlIi4KLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBvdmVycmlkZVJlYWRPbmx5cmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UpOwotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW4gdGVybXMgb2YgVGV4dC4KLQkgKiAKLQkgKiBUaGUgc2V0VGV4dCBtZXRob2QgcmVwbGFjZXMgYWxsIHRleHQgaW4gdGhlIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCByZXF1ZXN0aW5nIHRoZSBkb2N1bWVudCBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBhbGxUZXh0IC0KLQkgKiAgICAgICAgICAgIGFsbCB0aGUgdGV4dCBvZiB0aGUgZG9jdW1lbnQuCi0JICogQHJldHVybiBOZXdEb2N1bWVudEV2ZW50IC0gYmVzaWRlcyBjYXVzaW5nIHRoaXMgZXZlbnQgdG8gYmUgc2VudCB0bwotCSAqICAgICAgICAgZG9jdW1lbnQgbGlzdGVuZXJzLCB0aGUgZXZlbnQgaXMgcmV0dXJuZWQuCi0JICovCi0JTmV3RG9jdW1lbnRFdmVudCBzZXRUZXh0KE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBhbGxUZXh0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuY29kaW5nIG1lbWVudG8gZm9yIHRoaXMgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgZW5jb2RpbmcgbWVtZW50byBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKi8KLQlFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaW5lIGRlbGltaXRlciBkZXRlY3RlZCB3aGVuIHRoaXMgZG9jdW1lbnQgd2FzIHJlYWQgZnJvbQotCSAqIHN0b3JhZ2UuCi0JICogCi0JICogQHJldHVybiBsaW5lIGRlbGltaXRlciBkZXRlY3RlZCB3aGVuIHRoaXMgZG9jdW1lbnQgd2FzIHJlYWQgZnJvbQotCSAqICAgICAgICAgc3RvcmFnZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGV0ZWN0ZWRMaW5lRGVsaW1pdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlbmNvZGluZyBtZW1lbnRvIGZvciB0aGlzIGRvY3VtZW50LgotCSAqIAotCSAqIElzIG5vdCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cywgb25seSBkb2N1bWVudCBjcmVhdGlvbiBjbGFzc2VzLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhbEVuY29kaW5nTWVtZW50bwotCSAqLwotCXZvaWQgc2V0RW5jb2RpbmdNZW1lbnRvKEVuY29kaW5nTWVtZW50byBsb2NhbEVuY29kaW5nTWVtZW50byk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXRlY3RlZCBsaW5lIGRlbGltaXRlciB3aGVuIHRoZSBkb2N1bWVudCB3YXMgcmVhZC4gSXMgbm90IHRvCi0JICogYmUgY2FsbGVkIGJ5IGNsaWVudHMsIG9ubHkgZG9jdW1lbnQgY3JlYXRpb24gY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYmFibGVMaW5lRGVsaW1pdGVyCi0JICovCi0Jdm9pZCBzZXREZXRlY3RlZExpbmVEZWxpbWl0ZXIoU3RyaW5nIHByb2JhYmxlTGluZURlbGltaXRlcik7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgd2F5IGZvciBjbGllbnRzIHRvIGNvbXBhcmUgYSBzdHJpbmcgd2l0aCBhCi0JICogcmVnaW9uIG9mIHRoZSBkb2N1bW5ldCwgd2l0aG91dCBoYXZpbmcgdG8gcmV0cmlldmUgKGNyZWF0ZSkgYSBzdHJpbmcKLQkgKiBmcm9tIHRoZSBkb2N1bWVudCwgdGh1cyBtb3JlIGVmZmljaWVudCBvZiBsb3RzIG9mIGNvbXBhcmlzb25zIGJlaW5nCi0JICogZG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWdub3JlQ2FzZSAtCi0JICogICAgICAgICAgICBpZiB0cnVlIHRoZSBjaGFyYWN0ZXJzIGFyZSBjb21wYXJlZCBiYXNlZCBvbiBpZGVudGl0eS4gSWYKLQkgKiAgICAgICAgICAgIGZhbHNlLCB0aGUgc3RyaW5nIGFyZSBjb21wYXJlZCB3aXRoIGNhc2UgYWNjb3VudGVkIGZvci4KLQkgKiBAcGFyYW0gdGVzdFN0cmluZyAtCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGNvbXBhcmUuCi0JICogQHBhcmFtIGRvY3VtZW50T2Zmc2V0IC0KLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBpbiB0aGUgb2Zmc2V0IHRvIHN0YXJ0IHRoZSBjb21wYXJpc29uLgotCSAqIEBwYXJhbSBsZW5ndGggLQotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBpbiB0aGUgZG9jdW1lbnQgdG8gY29tcGFyZSAoTm90ZTogdGVjaG5pY2FsbHksCi0JICogICAgICAgICAgICBjbGllbnRzIGNvdWxkIGp1c3QgcHJvdmlkZSB0aGUgc3RyaW5nLCBhbmQgd2UgY291bGQgaW5mZXIKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggZnJvbSB0aGUgc3RyaW5nIHN1cHBsaWVkLCBidXQgdGhpcyBsZWF2ZXMgZXZlcnkKLQkgKiAgICAgICAgICAgIGNsaWVudCB0byBjb3JyZWN0bHkgbm90IGV2ZW4gYXNrIHVzIGlmIHRoZSB0aGUgc3RyaW5nIGxlbmd0aAotCSAqICAgICAgICAgICAgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgbGVuZ3RoLCBzbyB0aGlzIGlzIGFuIGVmZm9ydCB0bwotCSAqICAgICAgICAgICAgbWF4aW1pemUgcGVyZm9ybWFuY2Ugd2l0aCBjb3JyZWN0IGNvZGUuCi0JICogQHJldHVybiB0cnVlIGlmIG1hdGNoZXMsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIHN0cmluZ01hdGNoZXMoYm9vbGVhbiBpZ25vcmVDYXNlLCBTdHJpbmcgdGVzdFN0cmluZywgaW50IGRvY3VtZW50T2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQkKLQlQb3NpdGlvbiBjcmVhdGVQb3NpdGlvbihpbnQgb2Zmc2V0LCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyB0eXBlKTsKLQkKLQlQb3NpdGlvbiBjcmVhdGVQb3NpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyB0eXBlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvQWJvdXRUb0JlQ2hhbmdlZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9BYm91dFRvQmVDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0OTY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9BYm91dFRvQmVDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHNlbmQgdG8gc3RydWN0dXJlZCBkb2N1bWVudCBsaXN0ZW5lcnMuIEl0IGlzIHBlcmZlY3RseQotICogYW5hbGFnb3VzIHRvIGl0cyBjb3JyZXNwb25kaW5nIGpmYWNlIERvY3VtZW50RXZlbnQgYW5kIGlzIHByb3ZpZGVkIHNpbXBseQotICogdG8gYWxsb3cgY2xpZW50cyB0byBkaXN0aW5ndWlzaCB0aGUgc291cmNlIG9mIHRoZSBldmVudC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBYm91dFRvQmVDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIGRvY3VtZW50IGludm9sdmVkIGluIHRoZSBjaGFuZ2UKLQkgKiBAcGFyYW0gb3JpZ2luYWxSZXF1ZXN0ZXIKLQkgKiAgICAgICAgICAgIHNvdXJjZSBvZiBvcmlnaW5hbCByZXF1ZXN0Ci0JICogQHBhcmFtIGNoYW5nZXMKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGNoYW5nZXMKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBvZmZzZXQgb2YgcmVxdWVzdAotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UKLQkgKiAgICAgICAgICAgIGFtb3VudCwgaWYgYW55LCBvZiByZXBsYWNlZCB0ZXh0Ci0JICovCi0JcHVibGljIEFib3V0VG9CZUNoYW5nZWRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBPYmplY3Qgb3JpZ2luYWxSZXF1ZXN0ZXIsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3RlciwgY2hhbmdlcywgb2Zmc2V0LCBsZW5ndGhUb1JlcGxhY2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL0lNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDQ1NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50czsKLQotCi0KLS8qKgotICogQ2xpZW50cyBjYW4gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBhbmQgcmVnaXN0ZXIgd2l0aCB0aGUKLSAqIHN0cnVjdHVyZWREb2N1bWVudCB1c2luZyBhZGRBYm91dFRvQmVDaGFuZ2VkTGlzdG5lciB0byBiZSBub3RpZmllZCB0aGF0IHRoZQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIGFib3V0IHRvIGJlIGNoYW5nZWQsIGJ1dCBoYXNuJ3QgYmVlbiBjaGFuZ2VkIGF0IHRoZQotICogdGltZSB0aGlzIGV2ZW50IGlzIGZpcmVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQl2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChBYm91dFRvQmVDaGFuZ2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1MzVhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVtb3ZlZCBzaW5jZSB3ZSBub3cgc3ViY2xhc3MgRG9jdW1lbnRFdmVudC4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTmV3RG9jdW1lbnRDb250ZW50RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05ld0RvY3VtZW50Q29udGVudEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOGRiNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTmV3RG9jdW1lbnRDb250ZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGUgTmV3RG9jdW1lbnRDb250ZW50RXZlbnQgaXMgZmlyZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiBhCi0gKiBJU3RydWN0dXJlZERvY3VtZW50IHJlcGxhY2VzIGFsbCBvZiBpdHMgdGV4dC4KLSAqIAotICogSVNTVUU6IG5vdCBjdXJyZW50bHkgdXNlZCwgYnV0IHRoZXJlJ3Mgc3RpbGwgc29tZSBlZmZpY2llbmNpZXMgdG8gYmUgaGFkIHNvCi0gKiBwbGFuIHRvIGltcGxlbWVudC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdEb2N1bWVudENvbnRlbnRFdmVudCBleHRlbmRzIE5ld0RvY3VtZW50RXZlbnQgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBiZWluZyBjaGFuZ2VkCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyCi0JICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgcmVxdWVzdGVyIG9mIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgTmV3RG9jdW1lbnRDb250ZW50RXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgT2JqZWN0IG9yaWdpbmFsUmVxdWVzdGVyKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3Rlcik7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05ld0RvY3VtZW50RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05ld0RvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5YTczYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9OZXdEb2N1bWVudEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogVGhlIE5ld0RvY3VtZW50RXZlbnQgaXMgZmlyZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiBhIElTdHJ1Y3R1cmVkRG9jdW1lbnQKLSAqIHNldHMgb3IgcmVwbGFjZXMgYWxsIG9mIGl0cyB0ZXh0LgotICogCi0gKiBJU1NVRTogbmVlZCB0byBjaGFuZ2Ugc28gdGhpcyBpcyB1c2VkIGZvciAnc2V0JyBvbmx5LgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0RvY3VtZW50RXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIE5ld0RvY3VtZW50RXZlbnQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICBiZWluZyBjaGFuZ2VkCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyCi0JICogICAgICAgICAgICBzb3VyY2Ugb2YgcmVxdWVzdAotCSAqLwotCXB1YmxpYyBOZXdEb2N1bWVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlcikgewotCQlzdXBlcihkb2N1bWVudCwgb3JpZ2luYWxSZXF1ZXN0ZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiBpbnQgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXNuJ3QgbWVhbiBxdWl0ZSB0aGUgc2FtZSB0aGluZyBhcyB0aGUgSVN0cnVjdHVyZWREb2N1bWVudAotCSAqIEV2ZW50cyBpbiB0aGUgc3VwZXIgY2xhc3MuIEl0IGFsd2F5cyB3aWxsIHJldHVybiB6ZXJvLgotCSAqIAotCSAqIEByZXR1cm4gaW50IGZvciBhIG5ld0RvY3VtZW50LCB0aGUgb2Zmc2V0IG9mIGlzIGFsd2F5cyAwCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIEZvciBhIG5ldyBkb2N1bWVudCwgdGhlIHRleHQgaW52b2x2ZWQgaXMgdGhlIGNvbXBsZXRlIHRleHQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHRleHQgdGhhdCBpcyB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGUgZG9jdW1uZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgcmVzdWx0cyA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFRleHQoKTsKLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTm9DaGFuZ2VFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTm9DaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTAwNGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05vQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHNlbnQgaWYsIGFmdGVyIGFuYWx5c2lzLCBpdCBpcyBmb3VuZCB0aGVyZSBpcyBubyByZWFzb24gdG8KLSAqIGNoYW5nZSB0aGUgc3RydWN0dXJlZERvY3VtZW50LiBUaGlzIG1pZ2h0IG9jY3VyLCBmb3IgZXhhbXBsZSwgaWYgc29tZW9uZQotICogcGFzdGVzIGluIHRoZSBleGFjdCBzYW1lIHRleHQgdGhhdCB0aGV5IGFyZSByZXBsYWNpbmcsIG9yIGlmIHNvbWVvbmUgdHJpZXMKLSAqIHRvIGNoYW5nZSBhIHJlYWQtb25seSByZWdpb24uCi0gKiAKLSAqIFRoaXMgbWlnaHQgYmUgaW1wb3J0YW50LCBmb3IgZXhhbXBsZSwgaWYgc29tZSBzdGF0ZSB2YXJpYWJsZXMgYXJlIHNldCBvbiBhbgotICogImFib3V0IHRoZSBjaGFuZ2UiIGV2ZW50LiB0aGVuIGlmIHRoZXJlIGlzIG5vIGNoYW5nZSAoaS5lLm5vIG90aGVyIGV2ZW50IGlzCi0gKiBmaXJlZCksIHRob3NlIHN0YXRlIHZhcmlhYmxlcyBjb3VsZCByZXNldCwgb3Igd2hhdGV2ZXIsIHVwb24gcmVjZWl2aW5nIHRoaXMKLSAqIGV2ZW50LgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5vQ2hhbmdlRXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0JLyoqCi0JICogTk9fQ09OVEVOVF9DSEFOR0UgbWVhbnMgdGhhdCBhIHNvbWUgdGV4dCB3YXMgcmVxdWVzdGVkIHRvIGJlIHJlcGxhY2VkCi0JICogd2l0aCBpZGVudGljYWwgdGV4dCwgc28gbm8gY2hhbmdlIGlzIGFjdHVhbGx5IGRvbmUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTk9fQ09OVEVOVF9DSEFOR0UgPSAyOwotCS8qKgotCSAqIE5PX0VWRU5UIGlzIHVzZWQgaW4gcmFyZSBlcnJvciBjb25kaXRpb25zLCB3aGVuLCBiYXNpY2FsbHksIGEgcmVxdWVzdAotCSAqIHRvIGNoYW5nZSB0aGUgZG9jdW1lbnQgaXMgbWFkZSBiZWZvcmUgdGhlIHByZXZpb3VzIHJlcXVlc3QgaGFzCi0JICogY29tcGxldGVkLiBUaGlzIGV2ZW50IHRvIHVzZWQgc28gYWJvdXRUb0NoYW5nZS9DaGFuZ2VkIGN5Y2xlcyBjYW4KLQkgKiBjb21wbGV0ZSBhcyByZXF1aXJlZCwgYnV0IHRoZSBkb2N1bWVudCBpcyBtb3N0IGxpa2VseSBub3QgbW9kaWZpZWQgYXMKLQkgKiBleHBlY3RlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT19FVkVOVCA9IDg7Ci0JLyoqCi0JICogUkVBRF9PTkxZX1NUQVRFX0NIQU5HRSBtZWFucyB0aGF0IHRoZSAicmVhZCBvbmx5IiBzdGF0ZSBvZiB0aGUgdGV4dCB3YXMKLQkgKiBjaGFuZ2VkLCBub3QgdGhlIGNvbnRlbnQgaXRzZWxmLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFQURfT05MWV9TVEFURV9DSEFOR0UgPSA0OwotCi0JLyoqCi0JICogc2V0IHRvIG9uZSBvZiB0aGUgYWJvdmUgZGV0YWlsZWQgcmVhc29ucyBmb3Igd2h5IG5vIGNoYW5nZSB3YXMgZG9uZS4KLQkgKi8KLQlwdWJsaWMgaW50IHJlYXNvbiA9IDA7Ci0KLQkvKioKLQkgKiBOb0NoYW5nZUV2ZW50IGNvbnN0cnVjdG9yLiBUaGlzIGV2ZW50IGNhbiBvY2N1ciBpZiB0aGVyZSB3YXMgYSByZXF1ZXN0Ci0JICogdG8gbW9kaWZ5IGEgZG9jdW1lbnQgb3IgaXRzIHByb3BlcnRpZXMsIGJ1dCB0aGVyZSBhcyBub3QgcmVhbGx5IGlzIG5vCi0JICogY2hhbmdlIHRvIGEgZG9jdW1lbnQncyBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gb3JpZ2luYWxTb3VyY2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKiBAcGFyYW0gY2hhbmdlcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBOb0NoYW5nZUV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc291cmNlLCBPYmplY3Qgb3JpZ2luYWxTb3VyY2UsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgb3JpZ2luYWxTb3VyY2UsIGNoYW5nZXMsIG9mZnNldCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9SZWdpb25DaGFuZ2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbkNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWQ0MzgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbkNoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyB1c2VkIHdoZW4gYSBkb2N1bWVudCByZWdpb24gY2hhbmdlcyBpbiBhIG5vbi1zdHJ1Y3R1cmFsIHdheS4KLSAqIE5vbi1zdHJ1Y3R1cmFsLCB0aGF0IGlzLCBhcyBmYXIgYXMgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgY29uY2VybmVkLgotICogVGhlIHdob2xlIHJlZ2lvbiwgYWxvbmcgd2l0aCB0aGUgbmV3IHRleHQgaXMgc2VudCwganVzdCBpbiBjYXNlIGEgbGlzdGVuZXIKLSAqIChlLmcuIGEgdHJlZSBtb2RlbCkgbWlnaHQgbWFrZSBpdHMgb3duIGRldGVybWluYXRpb24gb2Ygd2hhdCB0byBkbywgYW5kCi0gKiBuZWVkcyB0aGUgd2hvbGUgcmVnaW9uIHRvIGFjdCBhcHByb3ByaWF0ZWx5LgotICogCi0gKiBOb3RlOiB1c2VycyBzaG91bGQgbm90IG1ha2UgYXNzdW1wdGlvbnMgYWJvdXQgd2hldGhlciB0aGUgcmVnaW9uIGlzCi0gKiBsaXRlcmFsbHkgdGhlIHNhbWUgaW5zdGFuY2Ugb3Igbm90IC0tIGl0IGlzIGN1cnJlbnRseSBhIGRpZmZlcmVudCBpbnN0YW5jZQotICogdGhhdCBpcyBpZGVudGljYWwgdG8gdGhlIG9sZCBleGNlcHQgZm9yIHRoZSBjaGFuZ2VkIHJlZ2lvbiwgYnV0IHRoaXMKLSAqIGltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uQ2hhbmdlZEV2ZW50IGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgewotCXByaXZhdGUgSVRleHRSZWdpb24gZkNoYW5nZWRSZWdpb247Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGluc3RhbmNlIG9mIGEgUmVnaW9uQ2hhbmdlZEV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQuCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyCi0JICogICAgICAgICAgICB0aGUgb2JqZWN0IG1ha2luZyB0aGUgcmVxdWVzdCBmb3IgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogICAgICAgICAgICB0aGUgY29udGFpbmluZyByZWdpb24KLQkgKiBAcGFyYW0gY2hhbmdlZFJlZ2lvbgotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiB0aGF0IGhhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBjaGFuZ2VzCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gbGVuZ3RoVG9SZXBsYWNlCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIHNwZWNpZmllZCB0byBiZSByZXBsYWNlZC4KLQkgKi8KLQlwdWJsaWMgUmVnaW9uQ2hhbmdlZEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIGNoYW5nZWRSZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3RlciwgY2hhbmdlcywgb2Zmc2V0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQlmQ2hhbmdlZFJlZ2lvbiA9IGNoYW5nZWRSZWdpb247Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IHJlZ2lvbiBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgcmVnaW9uIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uKCkgewotCQlyZXR1cm4gZkNoYW5nZWRSZWdpb247Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCByZWdpb24gY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCByZWdpb24gY2hhbmdlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvUmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbnNSZXBsYWNlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTJlNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvUmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyB1c2VkIHdoZW4gYSBub2RlJ3MgcmVnaW9ucyBjaGFuZ2UsIGJ1dCB0aGUgZG9jdW1lbnQgcmVnaW9uCi0gKiBpdHNlbGYgZG9lc24ndC4gVGhpcyBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGUgZG9jdW1lbnQKLSAqIHJlZ2lvbiwgdGhhdCBtYXkgc3RpbGwgaGF2ZSBjaGFuZ2VkLiBBbHNvLCBpdHMgYXNzdW1lZC9yZXF1aXJlZCB0aGF0IGFsbAotICogdGhlIHJlZ2lvbnMgYXJlIHJlcGxhY2VkIChldmVuIHRob3NlIHRoYXQgbWF5IG5vdCBoYXZlIGNoYW5nZWQpLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgewotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IGZOZXdSZWdpb25zOwotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IGZPbGRSZWdpb25zOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgUmVnaW9uc1JlcGxhY2VkRXZlbnQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQuCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyIC0KLQkgKiAgICAgICAgICAgIHJlcXVlc3RlciBvZiB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gLQotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiBjb250YWluaW5nIHRoZSBjaGFuZ2UuCi0JICogQHBhcmFtIG9sZFJlZ2lvbnMgLQotCSAqICAgICAgICAgICAgdGhlIG9sZCBSZWdpb25zIGJlaW5nIHJlcGxhY2VkLgotCSAqIEBwYXJhbSBuZXdSZWdpb25zIC0KLQkgKiAgICAgICAgICAgIHRoZSBuZXcgcmVnaW9ucyBiZWluZyBhZGRlZC4KLQkgKiBAcGFyYW0gY2hhbmdlcyAtCi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBvZmZzZXQgLQotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UgLQotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIHJlcGxhY2UuCi0JICovCi0JcHVibGljIFJlZ2lvbnNSZXBsYWNlZEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgU3RyaW5nIGNoYW5nZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJc3VwZXIoZG9jdW1lbnQsIG9yaWdpbmFsUmVxdWVzdGVyLCBjaGFuZ2VzLCBvZmZzZXQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCWZPbGRSZWdpb25zID0gb2xkUmVnaW9uczsKLQkJZk5ld1JlZ2lvbnMgPSBuZXdSZWdpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5ldyB0ZXh0IHJlZ2lvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV3IHRleHQgcmVnaW9ucy4KLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldE5ld1JlZ2lvbnMoKSB7Ci0JCXJldHVybiBmTmV3UmVnaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvbGQgdGV4dCByZWdpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9sZCB0ZXh0IHJlZ2lvbnMuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uTGlzdCBnZXRPbGRSZWdpb25zKCkgewotCQlyZXR1cm4gZk9sZFJlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24uCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvU3RydWN0dXJlZERvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5MzBmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBJU3RydWN0dXJlZERvY3VtZW50IGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBJU3RydWN0dXJlZERvY3VtZW50LCBhZnRlcgotICogdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgYWN0cyBvbiBhIHJlcXVlc3QuIE5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQsCi0gKiBleGNlcHQgYnkgc3ViY2xhc3NlcyBpbiBpbmZyYXN0cnVjdHVyZS4gTm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkKLSAqIGNsaWVudHMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXh0ZW5kcyBEb2N1bWVudEV2ZW50IHsKLQlwcml2YXRlIFN0cmluZyBmRGVsZXRlZFRleHQ7Ci0JcHJpdmF0ZSBPYmplY3QgZk9yaWdpbmFsUmVxdWVzdGVyOwotCi0JLyoqCi0JICogVGhlcmUgaXMgbm8gcHVibGljIG51bGwtYXJnIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFdlIGFzc3VtZSAoYW5kIHJlcXVpcmUpIHRoYXQgYW4gSVN0cnVjdHVyZWREb2N1bWVudCdzIGFyZSBhbHdheXMgdGhlCi0JICogc291cmNlIG9mIFN0cnVjdHVyZWREb2N1bWVudCBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBiZWluZyBjaGFuZ2VkCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIHNvdXJjZSIpOyAvLyROT04tTkxTLTEkCi0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT3JpZ2luYWxSZXF1ZXN0ZXIgPSBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBXZSBhc3N1bWUgKGFuZCByZXF1aXJlKSB0aGF0IGFuIElTdHJ1Y3R1cmVkRG9jdW1lbnQncyBhcmUgYWx3YXlzIHRoZQotCSAqIHNvdXJjZSBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgYmVpbmcgY2hhbmdlZC4KLQkgKiBAcGFyYW0gb3JpZ2luYWxSZXF1ZXN0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHJlcXVlc3RlciBvZiB0aGUgY2hhbmdlLgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlcikgewotCQl0aGlzKGRvY3VtZW50KTsKLQkJZk9yaWdpbmFsUmVxdWVzdGVyID0gb3JpZ2luYWxSZXF1ZXN0ZXI7Ci0JfQotCi0JLyoqCi0JICogV2UgYXNzdW1lIChhbmQgcmVxdWlyZSkgdGhhdCBhbiBJU3RydWN0dXJlZERvY3VtZW50J3MgYXJlIGFsd2F5cyB0aGUKLQkgKiBzb3VyY2Ugb2YgU3RydWN0dXJlZERvY3VtZW50IGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQgLQotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQuCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyIC0KLQkgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gY2hhbmdlcyAtCi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmV3IHRleHQKLQkgKiBAcGFyYW0gb2Zmc2V0IC0KLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gbGVuZ3RoVG9SZXBsYWNlIC0KLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGV4dCB0byByZXBsYWNlLgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlciwgU3RyaW5nIGNoYW5nZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJdGhpcyhkb2N1bWVudCk7Ci0JCWZPcmlnaW5hbFJlcXVlc3RlciA9IG9yaWdpbmFsUmVxdWVzdGVyOwotCQlmVGV4dCA9IGNoYW5nZXM7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZMZW5ndGggPSBsZW5ndGhUb1JlcGxhY2U7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgdGhlIHRleHQgdGhhdCBpcyBiZWluZyBkZWxldGVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgdGhhdCBpcyBiZWluZyBkZWxldGVkLCBvciBudWxsIGlmIG5vbmUgaXMgYmVpbmcKLQkgKiAgICAgICAgIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWxldGVkVGV4dCgpIHsKLQkJcmV0dXJuIGZEZWxldGVkVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBvYmplY3QgdGhhdCBvcmlnaW5hbGx5IGNhdXNlZCB0aGUgZXZlbnQgdG8KLQkgKiBmaXJlLiBUaGlzIGlzIHR5cGljYWxseSBub3QgdGhlIG9iamVjdCB0aGF0IGNyZWF0ZWQgdGhlIGV2ZW50ICh0aGUKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50KSBidXQgaW5zdGVhZCB0aGUgb2JqZWN0IHRoYXQgbWFkZSBhIHJlcXVlc3QgdG8gdGhlCi0JICogSVN0cnVjdHVyZWREb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvYmplY3QgdGhhdCBtYWRlIHRoZSByZXF1ZXN0IHRvIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSB7Ci0JCXJldHVybiBmT3JpZ2luYWxSZXF1ZXN0ZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byAnZ2V0RG9jdW1lbnQnIGV4Y2VwdCBpdCByZXR1cm5zIGFuIG9iamVjdAotCSAqIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlIChuYW1lbHksIGEgSVN0cnVjdHVyZWREb2N1bWVudCwgaW5zdGVhZCBvZgotCSAqIElEb2N1bWVudCkuCi0JICogCi0JICogQHJldHVybiBJU3RydWN0dXJlZERvY3VtbnQgLSB0aGUgZG9jdW1lbnQgYmVpbmcgY2hhbmdlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJLy8gYSBzYWZlIGNhc2UsIHNpbmNlIGNvbnN0cnVjdG9yIGNhbiBvbmx5IGJlIGNhbGxlZCB3aXRoIGEKLQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudAotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBOb3QgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMsIG9ubHkgcGFyc2VycyBhbmQgcmVwYXJzZXJzLiAod2lsbAotCSAqIGV2ZW50dWFsbHkgYmUgbW92ZWQgdG8gYW4gU1BJIHBhY2thZ2UpLgotCSAqIAotCSAqIEBwYXJhbSBuZXdEZWxldGVkVGV4dCAtCi0JICogICAgICAgICAgICB0aGUgdGV4dCB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZFRleHQoU3RyaW5nIG5ld0RlbGV0ZWRUZXh0KSB7Ci0JCWZEZWxldGVkVGV4dCA9IG5ld0RlbGV0ZWRUZXh0OwotCX0KLQotCS8qKgotCSAqIGZvciBkZWJ1Z2dpbmcgb25seQotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gbmVlZCB0byBmaXggdW5pdCB0ZXN0cyB3aGljaCBkZXBlbmQgb24gdGhpcyBleGFjdCBmb3JtYXQsCi0JICogICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhpcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCS8vIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJbc291cmNlPSIgKyBzb3VyY2UgKyAiXSI7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwOGI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHVzZWQgd2hlbiBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgZGVsZXRlZCwgb3IgcmVwbGFjZWQKLSAqIHdpdGggbW9yZSB0aGFuIG9uZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBvciB3aGVuIHNpbXBseSBtb3JlIHRoYW4gb25lCi0gKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNoYW5nZXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZklzRW50aXJlRG9jdW1lbnRSZXBsYWNlZDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQKLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQgLQotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQuCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyIC0KLQkgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAtCi0JICogICAgICAgICAgICB0aGUgb2xkIGRvY3VtZW50IHJlZ2lvbnMgcmVtb3ZlZC4KLQkgKiBAcGFyYW0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAtCi0JICogICAgICAgICAgICB0aGUgbmV3IGRvY3VtZW50IHJlZ2lvbnMgYWRkZWQuCi0JICogQHBhcmFtIGNoYW5nZXMgLQotCSAqICAgICAgICAgICAgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IGNoYW5nZS4KLQkgKiBAcGFyYW0gb2Zmc2V0IC0KLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gbGVuZ3RoVG9SZXBsYWNlIC0KLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGV4dCByZXF1ZXN0ZWQgdG8gYmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgU3RyaW5nIGNoYW5nZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJc3VwZXIoZG9jdW1lbnQsIG9yaWdpbmFsUmVxdWVzdGVyLCBjaGFuZ2VzLCBvZmZzZXQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsKLQkJZk5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBPYmplY3Qgb3JpZ2luYWxSZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlLCBib29sZWFuIGVudGlyZURvY3VtZW50UmVwbGFjZWQpIHsKLQkJdGhpcyhkb2N1bWVudCwgb3JpZ2luYWxSZXF1ZXN0ZXIsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIGNoYW5nZXMsIG9mZnNldCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJZklzRW50aXJlRG9jdW1lbnRSZXBsYWNlZCA9IGVudGlyZURvY3VtZW50UmVwbGFjZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV3IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQlyZXR1cm4gZk5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvbGQgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQlyZXR1cm4gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbnRpcmVEb2N1bWVudFJlcGxhY2VkKCkgewotCQlyZXR1cm4gZklzRW50aXJlRG9jdW1lbnRSZXBsYWNlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4Y2VwdGlvbnMvUmVzb3VyY2VBbHJlYWR5RXhpc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4Y2VwdGlvbnMvUmVzb3VyY2VBbHJlYWR5RXhpc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZmYwZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9leGNlcHRpb25zL1Jlc291cmNlQWxyZWFkeUV4aXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zOwotCi0KLQotLyoqCi0gKiBJbmRpY2F0ZXMgdGhhdCBhIFJlc291cmNlIHdoaWNoIGEgbW9kZWwgb3IgZG9jdW1lbnQgd2FzIGV4cGVjdGVkIHRvIGNyZWF0ZQotICogYWxyZWFkeSBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUFscmVhZHlFeGlzdHMgZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFJlc291cmNlQWxyZWFkeUV4aXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUFscmVhZHlFeGlzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzb3VyY2VBbHJlYWR5RXhpc3RzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBbHJlYWR5RXhpc3RzKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXhjZXB0aW9ucy9SZXNvdXJjZUluVXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4Y2VwdGlvbnMvUmVzb3VyY2VJblVzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWNiZmFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXhjZXB0aW9ucy9SZXNvdXJjZUluVXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnM7Ci0KLQotCi0vKioKLSAqIEluZGljYXRlcyB0aGF0IGEgbW9kZWwgd2l0aCBhIHBhcnRpY3VsYXIgSUQgYWxyZWFkeSBleGlzdHMKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlSW5Vc2UgZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFJlc291cmNlQWxyZWFkeUV4aXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUluVXNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJlc291cmNlQWxyZWFkeUV4aXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFJlc291cmNlSW5Vc2UoU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTW9kZWxNYW5hZ2VyUHJvcG9zZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU1vZGVsTWFuYWdlclByb3Bvc2VkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZTk0MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTW9kZWxNYW5hZ2VyUHJvcG9zZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VBbHJlYWR5RXhpc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBSZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgSVN0cnVjdHVyZWRNb2RlbHMuCi0gKiAKLSAqIFRoaXMgYWxsb3dzIGNsaWVudHMgdG8gc2hhcmUgbW9kZWxzLCBzbyB0aGV5IGRvIG5vdCBoYXZlIHRvIGJlIHJlLWNyZWF0ZWQKLSAqIG9yIHBhc3NlZCBhcm91bmQgZnJvbSBvbmUgY2xpZW50IHRvIGFub3RoZXIuIENsaWVudHMgc2hvdWxkIGludGVybmFsbHkKLSAqIGVuZm9yY2UgdGhhdCBtb2RlbHMgYXJlIGdvdHRlbiBhbmQgcmVsZWFzZWQgZnJvbSBsb2NhdGlvbnMgY2xvc2UgdG8gZWFjaAotICogb3RoZXIgdG8gcHJldmVudCBtb2RlbCBsZWFrcy4KLSAqIAotICogVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gZ2V0IGEgbW9kZWwgYmFzZWQgb24gdXNhZ2UgYW5kIHJlc3BvbnNpYmlsaXR5OiBmb3IKLSAqICdNT0RJRlknLCBqdXN0IGZvciAnU0hBUkVEJywgYW5kICdVTlNIQVJFRCcuIENvbnRyYXJ5IHRvIHRoZWlyIG5hbWVzLCBhCi0gKiBtb2RlbCBjYW4gdGVjaG5pY2FsbHkgYmUgbW9kaWZpZWQsIGFuZCBhbGwgbW9kaWZpY2F0aW9ucyBkaXJlY3RseSBhZmZlY3QKLSAqIHRoZSBjb21tb25seSBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbW9kZWwuIEl0IGlzIHBhcnQgb2YgdGhlIEFQSSBjb250cmFjdCwKLSAqIGhvd2V2ZXIsIHRoYXQgY2xpZW50cyB3aG8gZ2V0IGEgbW9kZWwgZm9yIFNIQVJFRCBkbyBub3QgbW9kaWZ5IGl0LiBUaGUKLSAqIHNpZ25pZmljYW5jZSBvZiB0aGUgJ01PRElGWScgbW9kZWwgaXMgdGhhdCB0aGUgY2xpZW50IGlzIHJlZ2lzdGVyaW5nIHRoZWlyCi0gKiBpbnRlcmVzdCBpbiBzYXZpbmcgY2hhbmdlcyB0byB0aGUgbW9kZWwuCi0gKiAKLSAqIENsaWVudHMgY2FuIHJlZmVyZW5jZSB0aGlzIGludGVyZmFjZSwgYnV0IHNob3VsZCBub3QgaW1wbGVtZW50LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxNYW5hZ2VyUHJvcG9zZWQgewotCi0JLyoqCi0JICogQWNjZXNzVHlwZSBpcyB1c2VkIGludGVybmFsbHkgYXMgYSBKUkUgMS40IGNvbXBhdGlibGUgZW51bWVyYXRlZCB0eXBlLgotCSAqIE5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCi0JICovCi0Jc3RhdGljIGNsYXNzIEFjY2Vzc1R5cGUgewotCQlwcml2YXRlIFN0cmluZyBmVHlwZTsKLQotCQkvKioKLQkJICogZGVmYXVsdCBhY2Nlc3MgY29udHJ1Y3RvciB3ZSB1c2UgdG8gY3JlYXRlIG91ciBzcGVjaWZpYyBjb25zdGFudHMuCi0JCSAqIAotCQkgKiBAcGFyYW0gdHlwZQotCQkgKi8KLQkJQWNjZXNzVHlwZShTdHJpbmcgdHlwZSkgewotCQkJc3VwZXIoKTsKLQkJCWZUeXBlID0gdHlwZTsKLQkJfQotCi0JCS8qKgotCQkgKiBGb3IgZGVidWcgcHVycG9zZXMgb25seS4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk1vZGVsIEFjY2VzcyBUeXBlOiAiICsgZlR5cGU7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0YW50IHRvIHByb3ZpZGUgY29tcGlsZSB0aW1lIHNhZmUgcGFyYW1ldGVyLiA8Y29kZT5OT1RTSEFSRUQ8L2NvZGU+c2lnbmlmaWVzCi0JICogdGhlIGNsaWVudCBpbnRlbnRpYWxseSB3YW50cyBhIG1vZGVsIHRoYXQgaXMgbm90IHNoYXJlZCB3aXRoIG90aGVyCi0JICogY2xpZW50cy4gTk9UU0hBUkVEIG1vZGVscyBjYW4gbm90IGJlIHNhdmVkLgotCSAqLwotCWZpbmFsIEFjY2Vzc1R5cGUgTk9UU0hBUkVEID0gbmV3IEFjY2Vzc1R5cGUoIk5PVFNIQVJFRCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdGFudCB0byBwcm92aWRlIGNvbXBpbGUtdGltZSBzYWZlIHBhcmFtZXRlci4gPGNvZGU+U0hBUkVEPC9jb2RlPnNpZ25pZmllcwotCSAqIHRoZSBjbGllbnQgaXMgbm90IGludGVuZGluZyB0byBtYWtlIGNoYW5nZXMgYW5kIGRvZXMgbm90IGNhcmUgd2hldGhlcgotCSAqIHRoZSBtb2RlbCBhY2Nlc3NlZCBpcyBzYXZlZC4KLQkgKi8KLQlmaW5hbCBBY2Nlc3NUeXBlIFNIQVJFRCA9IG5ldyBBY2Nlc3NUeXBlKCJTSEFSRUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgdG8gcHJvdmlkZSBjb21waWxlLXRpbWUgc2FmZSBwYXJhbWV0ZXIuIDxjb2RlPk1PRElGWTwvY29kZT5zaWduaWZpZXMKLQkgKiB0aGUgY2xpZW50IGlzIGludGVuZGluZyB0byBtYWtlIGNoYW5nZXMgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBzYXZpbmcKLQkgKiBjaGFuZ2VzIChvciBub3QpIGlmIHRoZXkgYXJlIHRoZSBsYXN0IG9uZSBob2xkaW5nIE1PRElGWSBhY2Nlc3MgdG8gdGhlCi0JICogbW9kZWwgYmVmb3JlIGl0J3MgcmVsZWFzZWQuCi0JICovCi0JZmluYWwgQWNjZXNzVHlwZSBNT0RJRlkgPSBuZXcgQWNjZXNzVHlwZSgiTU9ESUZZIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGNvcHlNb2RlbCBpcyBzaW1pbGFyIHRvIGEgZGVlcCBjbG9uZS4gVGhlIHJlc3VsdGluZyBtb2RlbCBpcyBzaGFyZWQsCi0JICogYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiBSZWFkRWRpdFR5cGUuIElmIGEgbW9kZWwgYWxyZWFkeSBpcyBiZWluZwotCSAqIG1hbmFnZWQgZm9yICduZXdMb2NhdGlvbicgdGhlbiBhIFJlc291cmNlSW5Vc2UgZXhjZXB0aW9uIGlzIHRocm93biwKLQkgKiB1bmxlc3MgdGhlIFJlYWRFZGl0VHlwZSBpcyBOT1RTSEFSRUQsIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdGluZyBtb2RlbAotCSAqIGNhbiBub3QgYmUgc2F2ZWQuCi0JICogCi0JICogQHBhcmFtIG9sZExvY2F0aW9uCi0JICogQHBhcmFtIG5ld0xvY2F0aW9uCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBSZXNvdXJjZUluVXNlCi0JICogCi0JICogSVNTVUU6IGlzIHRoaXMgaW1wb3J0YW50IGVub3VnaCB0byBiZSBBUEksIG9yIGNhbiBjbGllbnRzIHNvbHZlCi0JICogdGhlbXNlbHZlcwotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgY29weU1vZGVsKElQYXRoIG9sZExvY2F0aW9uLCBJUGF0aCBuZXdMb2NhdGlvbiwgQWNjZXNzVHlwZSB0eXBlKSB0aHJvd3MgUmVzb3VyY2VJblVzZTsKLQotCS8qKgotCSAqIGNyZWF0ZU5ld0luc3RhbmNlIGlzIHNpbWlsYXIgdG8gY2xvbmUsIGV4Y2VwdCB0aGUgbmV3IGluc3RhbmNlIGhhcyBubwotCSAqIHRleHQgY29udGVudC4gTm90ZTogdGhpcyBwcm9kdWNlcyBhbiBVTlNIQVJFRCBtb2RlbCwgZm9yIHRlbXBvcmFyeSB1c2UsCi0JICogdGhhdCBoYXMgdGhlIHNhbWUgY2hhcmFjdGVyaXN0aWNzIGFzIG9yaWdpbmFsIG1vZGVsLiBJZiBhIHRydWUgc2hhcmVkCi0JICogbW9kZWwgaXMgZGVzaXJlZCwgdXNlICJjb3B5Ii4KLQkgKiAKLQkgKiBJU1NVRTogc3RpbGwgbmVlZGVkPwotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0ZXIKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU5ld0luc3RhbmNlKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhIHByb3BlcgotCSAqIHBhcnNlciBhc3NpZ25lZC4gTm90ZTogaXRzIGFzc3VtZSB0aGF0IElQYXRoIGRvZXMgbm90IGFjdHVhbGx5IGV4aXN0IGFzCi0JICogYSByZXNvdXJjZSB5ZXQuIElmIGl0IGRvZXMsIFJlc291cmNlQWxyZWFkeUV4aXN0cyBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIHRoZSByZXNvdXJjZSBkb2VzIGFscmVhZHkgZXhpc3QsIHRoZW4gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yIGlzCi0JICogdGhlIHJpZ2h0IEFQSSB0byB1c2UuCi0JICogCi0JICogSVNTVUU6IGRvIHdlIHdhbnQgdG8gc3VwcG9ydCB0aGlzIHZpYSBtb2RlbCBtYW5hZ2VyLCBvciBlbHNlIHdoZXJlPwotCSAqIElTU1VFOiBkbyB3ZSBuZWVkIHR3byBvZiB0aGVzZT8gV2hhdCdzIGxlZ2FjeSB1c2UgY2FzZT8KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50Rm9yKElQYXRoIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYSBwcm9wZXIKLQkgKiBwYXJzZXIgYXNzaWduZWQuIE5vdGU6IGNsaWVudHMgc2hvdWxkIHZlcmlmeSB0aGF0IHRoZSByZXNvdXJjZQotCSAqIGlkZW50aWZpZWQgYnkgdGhlIElQYXRoIGV4aXN0cyBiZWZvcmUgdXNpbmcgdGhpcyBtZXRob2QuIElmIHRoaXMgSUZpbGUKLQkgKiBkb2VzIG5vdCBleGlzdCwgdGhlbiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgdGhlIGNvcnJlY3QgQVBJIHRvCi0JICogdXNlLgotCSAqIAotCSAqIElTU1VFOiBkbyB3ZSB3YW50IHRvIHN1cHBvcnQgdGhpcyB2aWEgbW9kZWwgbWFuYWdlciwgb3IgZWxzZSB3aGVyZT8KLQkgKiBJU1NVRTogZG8gd2UgbmVlZCB0d28gb2YgdGhlc2U/IFdoYXQncyBsZWdhY3kgdXNlIGNhc2U/Ci0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoSVBhdGggbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBOb3RlOiBjYWxsZXJzIG9mIHRoaXMgbWV0aG9kIG11c3Qgc3RpbGwgcmVsZWFzZSB0aGUgbW9kZWwgd2hlbgotCSAqIGZpbmlzaGVkLiBSZXR1cm5zIHRoZSBtb2RlbCBmb3IgdGhpcyBkb2N1bWVudCBpZiBpdCBhbHJlYWR5IGV4aXN0cyBhbmQKLQkgKiBpcyBiZWluZyBzaGFyZWQuIFJldHVybnMgbnVsbCBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZS4gVGhlIFJlYWRFZGl0VHlwZQotCSAqIG11c3QgYmUgZWl0aGVyIE1PRElGWSBvciBTSEFSRUQuCi0JICogCi0JICogSVNTVUU6IHNob3VsZCB3ZSBhY2NlcHQgSURvY3VtZW50IG9uIHBhcmFtZXRlciBmb3IgZnV0dXJlIGV2b2x1dGlvbiwKLQkgKiBhbmQgY29uc3RyYWluIHRvIFN0cnVjdHVyZWREb2N1bWVudHMgYXQgcnVudGltZT8KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIEFjY2Vzc1R5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50KTsKLQotCS8qKgotCSAqIENhbGxlcnMgb2YgdGhpcyBtZXRob2QgbXVzdCBzdGlsbCByZWxlYXNlIHRoZSBtb2RlbCB3aGVuIGZpbmlzaGVkLgotCSAqIFJldHVybnMgdGhlIG1vZGVsIGZvciB0aGlzIGxvY2F0aW9uIGlmIGl0IGFscmVhZHkgZXhpc3RzIGFuZCBpcyBiZWluZwotCSAqIHNoYXJlZC4gUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLiBUaGUgUmVhZEVkaXRUeXBlIG11c3QgYmUKLQkgKiBlaXRoZXIgTU9ESUZZIG9yIFNIQVJFRC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBBY2Nlc3NUeXBlIHR5cGUsIElQYXRoIGxvY2F0aW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGVsIHRoYXQgaGFzIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQgYXMgaXRzIHN0cnVjdHVyZWQKLQkgKiBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIEFjY2Vzc1R5cGUgdHlwZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIElEb2N1bWVudCBkb2N1bWVudCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RlbCBiYXNlZCBvbiB0aGUgY29udGVudCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgotCSAqIAotCSAqIE5vdGU6IGlmIHRoZSBNb2RlbE1hbmFnZXIgZG9lcyBub3Qga25vdyBob3cgdG8gY3JlYXRlIGEgbW9kZWwgZm9yIAotCSAqIHN1Y2ggYSBmaWxlIGZvciBjb250ZW50LCBudWxsIGlzIHJldHVybi4KLQkgKiBJU1NVRTogc2hvdWxkIHdlIHRocm93IHNvbWUgc3BlY2lhbCwgbWVhbmluZ2Z1bCwgY2hlY2tlZCAKLQkgKiBleGNlcHRpb24gaW5zdGVhZD8KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBBY2Nlc3NUeXBlIHR5cGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJUGF0aCBsb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY3JlYXRlIGEgbmV3IG1vZGVsIGlmIGl0IGFscmVhZHkgZXhpc3RzIC4uLiBpZgotCSAqIGZvcmNlIGlzIGZhbHNlLiBUaGUgaWRlYSBpcyB0aGF0IGEgY2xpZW50IHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIG9uY2UKLQkgKiB3aXRoIGZvcmNlIHNldCB0byBmYWxzZS4gSWYgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZW4gcHJvbXB0IGNsaWVudAotCSAqIGlmIHRoZXkgd2FudCB0byBvdmVyd3JpdGUuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBmb3JjZQotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cwotCSAqIEB0aHJvd3MgUmVzb3VyY2VJblVzZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIElQYXRoIGxvY2F0aW9uLCBib29sZWFuIGZvcmNlLCBBY2Nlc3NUeXBlIHR5cGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWQoSVBhdGggbG9jYXRpb24pOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbCwgc2hhcmVkIGluIHRoZSBzcGVjaWZpZWQgd2F5LiBUaGUgUmVhZEVkaXRUeXBlIG11c3QgYmUKLQkgKiBlaXRoZXIgTU9ESUZZIG9yIFNIQVJFRC4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKElQYXRoIGxvY2F0aW9uLCBBY2Nlc3NUeXBlIHR5cGUpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250ZW50IHR5cGUgb2YgYSBtb2RlbCBjaGFuZ2VzLiBJdHMKLQkgKiBhc3N1bWVkIHRoZSBjb250ZW50VHlwZSBoYXMgYWxyZWFkeSBiZWVuIGNoYW5nZWQsIGFuZCB0aGlzIG1ldGhvZCB1c2VzCi0JICogdGhlIHRleHQgb2YgdGhlIG9sZCBvbmUsIHRvIHJlcG9wdWxhdGUgdGhlIHRleHQgb2YgdGhlIG5ldyBvbmUuCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCBieSBjbGllbnRzIHRvIHNpZ25pZnkgdGhhdCB0aGV5IGFyZSBmaW5pc2hlZCB3aXRoIGEgbW9kZWwKLQkgKiBhbmQgd2lsbCBubyBsb25nZXIgYWNjZXNzIGl0IG9yIGFueSBvZiBpdHMgdW5kZXJseWluZyBkYXRhIChzdWNoIGFzIGl0cwotCSAqIHN0cnVjdHVyZWQgZG9jdW1lbnQpLiBUaGUgUmVhZEVkaXRUeXBlIG11c3QgbWF0Y2ggd2hhdCBldmVyIHRoZSBjbGllbnQKLQkgKiB1c2VkIGluIHRoZSBjb3JyZXNwb25kaW5nICdnZXQnIG1ldGhvZC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBmb3IgZXZlcnkgJ2dldCcuIENsaWVudHMgc2hvdWxkIHVzZSB0aGUKLQkgKiB0cnkvZmluYWxseSBwYXR0ZXJuIHRvIGVuc3VyZSB0aGUgcmVsZWFzZSBpcyBjYWxsZWQgZXZlbiBpZiB0aGVyZSBpcyBhbgotCSAqIHVuZXhwZWN0ZWQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0ZXIKLQkgKiBAcGFyYW0gc3RydWN0dXJlZE1vZGVsCi0JICogQHBhcmFtIHR5cGUKLQkgKi8KLQl2b2lkIHJlbGVhc2VNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgQWNjZXNzVHlwZSB0eXBlKTsKLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgdW5kZXJseWluZyBkb2N1bWVudCB0byB0aGUgSVBhdGguCi0JICogCi0JICogSVNTVUU6IHdlIHdhbnQgdG8ganVzdCAiZHVtcCIgY29udGVudHMgdG8gbG9jYXRpb24sIGJ1dCBuZWVkIHRvIHNwZWMuCi0JICogYWxsIHRoZSBkaWZmZXJlbnQgY2FzZXMgb2Ygc2hhcmVkLCBldGMuCi0JICogCi0JICogP0lmIHRvIHNhbWUgbG9jYXRpb24gYXMgJ2dldCcsIHRoZW4gc2FtZSBpbnN0YW5jZSBvZiBtb2RlbCwgSWYgdG8KLQkgKiBkaWZmZXJlbnQgbG9jYXRpb24gKGVzcC4gaWYgc2hhcmVkKSB0aGVuIG5lZWQgdG8gbGVhdmUgb2xkIGluc3RhbmNlIG9mCi0JICogbW9kZWwsIGNyZWF0ZSBuZXcgbW9kZWwsIGFuZCBzYXZlIHRvIG5ldyBsb2NhdGlvbi4gPwotCSAqIAotCSAqIENhc2VzOiBJUGF0aCBpcyBudWxsLCB3cml0ZSB0byBJUGF0aCBjcmVhdGVkIHdpdGggSVBhdGggc3BlY2lmaWNlZCBhbmQKLQkgKiBlcXVhbHMgSVBhdGggY3JlYXRlZCB3aXRoLCB3cml0ZSB0byBJUGF0aCBJUGF0aCBzcGVjaWZpZWQgYW5kIG5vdAotCSAqIGVxdWFscyBJUGF0aCBjcmVhdGVkIHdpdGgsIGR1bXBzIHRvIG5ldyBJUGF0aCwgbm8gY2hhbmdlIGluIGN1cnJlbnQKLQkgKiBtb2RlbCBzdGF0ZS4KLQkgKiAKLQkgKiBJU1NVRTogdGhpbmsgdGhyb3VnaCAnbm9ybWFsaXphdGlvbicgY2FzZXMKLQkgKiAKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZE1vZGVsCi0JICogQHBhcmFtIGxvY2F0aW9uIC0gYWxyZWFkeSBub3JtYWxpemVkPwotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogSVNTVUU6IHJlc291cmNlIGFsZWFkeSBleGlzdHM/IHZldG8gb3ZlcnJpZGUKLQkgKi8KLQl2b2lkIHNhdmVNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgSVBhdGggbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIHVuZGVybHlpbmcgZG9jdW1lbnQgdG8gdGhlIElQYXRoIGlmIHRoZSBtb2RlbCBpcyBvbmx5IHNoYXJlZAotCSAqIGZvciBFRElUIGJ5IG9uZSBjbGllbnQuIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHdheSBmb3IgJ2JhY2tncm91bmQKLQkgKiBqb2JzJyB0byBzYXZlIG1vZGVscywgaW4gY2FzZSB0aGUgbW9kZWwgaXMgYmVpbmcgc2hhcmVkIGJ5IGFuIGVkaXRvciwKLQkgKiBvciBvdGhlciBjbGllbnQgdGhhdCBtaWdodCBkZXNpcmUgdXNlciBpbnRlcnZlbnRpb24gdG8gc2F2ZSBhIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkTW9kZWwKLQkgKiBAcGFyYW0gbG9jYXRpb24gLSBhbHJlYWR5IG5vcm1hbGl6ZWQ/Ci0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBJU1NVRTogaXMgbG9jYWl0b24gbmVlZGVkIGluIHRoaXMgY2FzZSwgb3IganVzdCB1c2UgdGhlIG9uZSBpdCB3YXMKLQkgKiBjcmVhdGVkIHdpdGgKLQkgKi8KLQl2b2lkIHNhdmVNb2RlbElmTm90U2hhcmVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBJUGF0aCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU1vZGVsU3RhdGVMaXN0ZW5lclByb3Bvc2VkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lNb2RlbFN0YXRlTGlzdGVuZXJQcm9wb3NlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODRmYzcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU1vZGVsU3RhdGVMaXN0ZW5lclByb3Bvc2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLm1vZGVsOwotCi0KLS8qKgotICogSW50ZXJmYWNlIGZvciB0aG9zZSB3YW50aW5nIHRvIGxpc3RlbiB0byBhIG1vZGVsJ3Mgc3RhdGUgY2hhbmdpbmcuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbFN0YXRlTGlzdGVuZXJQcm9wb3NlZCB7Ci0KLQkvKioKLQkgKiBBIG1vZGVsIGlzIGFib3V0IHRvIGJlIGNoYW5nZWQuIFRoZSBldmVudCBvYmplY3QgaXRzZWxmIHNpZ25pZmllcyB3aGljaAotCSAqIG1vZGVsLCBhbmQgYW55IHBlcnRpbmVudCBpbmZvcm1hdGlvbi4KLQkgKi8KLQl2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogU2lnbmFscyB0aGF0IHRoZSBjaGFuZ2VzIGZvcmV0b2xkIGJ5IG1vZGVsQWJvdXRUb0JlQ2hhbmdlZCBoYXZlIGJlZW4KLQkgKiBtYWRlLiBBIHR5cGljYWwgdXNlIG1pZ2h0IGJlIHRvIHJlZnJlc2gsIG9yIHRvIHJlc3VtZSBwcm9jZXNzaW5nIHRoYXQKLQkgKiB3YXMgc3VzcGVuZGVkIGFzIGEgcmVzdWx0IG9mIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZC4KLQkgKi8KLQl2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lOb2RlQWRhcHRlckZhY3RvcnlNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lOb2RlQWRhcHRlckZhY3RvcnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMmQxNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTm9kZUFkYXB0ZXJGYWN0b3J5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLS8qKgotICogUHJvdmlkZXMgYSBtZWFucyBmb3IgY2xpZW50cyB0byByZWdpc3RlciBJQWRhcHRlckZhY3RvcmllcyBmb3IgdXNlCi0gKiBieSBpbmZyYXN0cnVjdHVyZSB3aGVuIFN0cnVjdHVyZWRNb2RlbHMgYXJlIGNyZWF0ZWQuIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlQWRhcHRlckZhY3RvcnlNYW5hZ2VyIHsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBmYWN0b3J5Ci0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICovCi0Jdm9pZCBhZGRBZGFwdGVyRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIElDb250ZW50VHlwZSBjb250ZW50VHlwZSk7Ci0KLQl2b2lkIHJlbW92ZUFkYXB0ZXJGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKTsKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lTdHJ1Y3R1cmVkTW9kZWxFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JU3RydWN0dXJlZE1vZGVsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiYzNiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lTdHJ1Y3R1cmVkTW9kZWxFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLm1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkTW9kZWxFdmVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSVN0cnVjdHVyZWRNb2RlbFByb3Bvc2VkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lTdHJ1Y3R1cmVkTW9kZWxQcm9wb3NlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDk4NGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSVN0cnVjdHVyZWRNb2RlbFByb3Bvc2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBJU3RydWN0dXJlZE1vZGVsJ3MgYXJlIG1haW5seSBpbnRlcmVzdGluZyBieSB0aGVpciBleHRlbnNpb25zIGFuZAotICogaW1wbGVtZW50ZXJzLiBUaGUgbWFpbiBwdXJwb3NlZCBvZiB0aGlzIGFic3RyYWN0aW9uIGl0IHRvIHByb3ZpZGUgYSBjb21tb24KLSAqIHdheSB0byBtYW5hZ2UgbW9kZWxzIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIHN0cnVjdHVyZWQgZG9jdW1uZXQuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRNb2RlbFByb3Bvc2VkIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBjbGllbnRzIHRvIGRlY2xhcmUgdGhhdCB0aGV5IGFyZSBhYm91dCB0byBtYWtlIGEKLQkgKiAibGFyZ2UiIGNoYW5nZSB0byB0aGUgbW9kZWwuIFRoaXMgY2hhbmdlIG1pZ2h0IGJlIGluIHRlcm1zIG9mIGNvbnRlbnQKLQkgKiBvciBpdCBtaWdodCBiZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZWwgaWQgb3IgYmFzZSBsb2NhdGlvbi4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIG5vdGlmaWNhdGlvbiB0byBsaXN0ZW5lcnMgaXMKLQkgKiBzZW50IG9ubHkgb25jZS4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCB3aG8gaXMgbWFraW5nIHRoZXNlIGNoYW5nZXMgaGFzIHRoZSByZXNwb25zaWJpbGl0eQotCSAqIHRvIHJlc3RvcmUgdGhlIG1vZGVsJ3Mgc3RhdGUgb25jZSBmaW5pc2hlZCB3aXRoIHRoZSBjaGFuZ2VzLiBTZWUKLQkgKiBnZXRNZW1lbnRvIGFuZCByZXN0b3JlU3RhdGUuCi0JICogCi0JICogVGhlIG1ldGhvZCBpc01vZGVsU3RhdGVDaGFuZ2luZyBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkZXRlcm1pbmUgaWYKLQkgKiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBpbiBhIGNoYW5nZSBzZXF1ZW5jZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIG1hdGNoZWQgcGFpciB0byBjaGFuZ2VkTW9kZWwsIGFuZCBtdXN0IGJlIGNhbGxlZAotCSAqIGJlZm9yZSBjaGFuZ2VkTW9kZWwuIEEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3Qgbm9yIGNhbGwgYWJvdXRUb0NoYW5nZU1vZGVsIHdpdGhvdXQKLQkgKiBjYWxsaW5nIGNoYW5nZWRNb2RlbCBsYXRlciBmcm9tIHRoZSBzYW1lIFRocmVhZC4KLQkgKi8KLQl2b2lkIGFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0Jdm9pZCBhZGRNb2RlbFN0YXRlTGlzdGVuZXIoSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgYSBjbGllbnQgY29udHJvbGxlZCB3YXkgb2Ygbm90aWZ5aW5nIGFsbCBNb2RlbEV2ZW50Ci0JICogbGlzdG5lcnMgdGhhdCB0aGUgbW9kZWwgaGFzIGJlZW4gY2hhbmdlZC4gVGhpcyBtZXRob2QgaXMgYSBtYXRjaGVkIHBhaXIKLQkgKiB0byBhYm91dFRvQ2hhbmdlTW9kZWwsIGFuZCBtdXN0IGJlIGNhbGxlZCBhZnRlciBhYm91dFRvQ2hhbmdlTW9kZWwgLi4uCi0JICogb3Igc29tZSBsaXN0ZW5lcnMgY291bGQgYmUgbGVmdCB3YWl0aW5nIGluZGVmaW5pdGVseSBmb3IgdGhlIGNoYW5nZWQKLQkgKiBldmVudC4gU28sIGl0cyBzdWdnZXN0ZWQgdGhhdCBjaGFuZ2VkTW9kZWwgYWx3YXlzIGJlIGluIGEgZmluYWxseQotCSAqIGNsYXVzZS4gTGlrZXdpc2UsIGEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3QuCi0JICogCi0JICogSW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIHRoZSBub3RpZmljYXRpb24gaXMganVzdCBzZW50IG9uY2UuCi0JICogCi0JICovCi0Jdm9pZCBjaGFuZ2VkTW9kZWwoKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgYSBjbGllbnQtZGVmaW5lZCB2YWx1ZSBmb3Igd2hhdCB0aGF0IGNsaWVudCAoYW5kL29yIGxvYWRlcikKLQkgKiBjb25zaWRlcnMgdGhlICJiYXNlIiBvZiB0aGUgc3RydWN0dXJlZCBtb2RlbC4gRnJlcXVlbnRseSB0aGUgbG9jYXRpb24KLQkgKiBpcyBlaXRoZXIgYSB3b3Jrc3BhY2Ugcm9vdC1yZWxhdGl2ZSBwYXRoIG9mIGEgd29ya3NwYWNlIHJlc291cmNlIG9yIGFuCi0JICogYWJzb2x1dGUgcGF0aCBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi0JICovCi0JSVBhdGggZ2V0TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgY29udGVudCB0eXBlIGlkZW50aWZpZXIgKFN0cmluZykgZm9yIHRoaXMgbW9kZWwuCi0JICovCi0JSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBtb2RlbCdzIEZhY3RvcnlSZWdpc3RyeS4gQSBtb2RlbCBpcyBub3QgdmFsaWQgd2l0aG91dCBvbmUuCi0JICovCi0JRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCByZWdpb24gYXQgb2Zmc2V0LiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8KLQkgKiBJbmRleGVkUmVnaW9uIHRoYXQgY29udGFpbnMgb2Zmc2V0LgotCSAqLwotCUluZGV4ZWRSZWdpb24gZ2V0SW5kZXhlZFJlZ2lvbihpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIElTU1VFOiBkbyB3ZSB3YW50IHRvIHByb3ZpZGUgdGhpcz8gSG93IHRvIGVuc3VyZSBqb2IvdGhyZWFkIHNhZmV0eQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlJbmRleGVkUmVnaW9uW10gZ2V0SW5kZXhlZFJlZ2lvbnMoKTsKLQotCS8qKgotCSAqIFJyZXR1cm5zIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IHRoYXQgdW5kZXJsaWVzIHRoaXMgbW9kZWwKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNEaXJ0eSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIGlzIHdpdGhpbiBhCi0JICogImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIgc2VxdWVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlbFN0YXRlQ2hhbmdpbmcoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNOZXcoKTsKLQotCWJvb2xlYW4gaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgaWYgdGhlIG1vZGVsIGlzIGRpcnR5IGFuZCBpZiB0aGUgbW9kZWwgaXMKLQkgKiBzaGFyZWQgZm9yIHdyaXRlIGFjY2Vzcy4gVGhlIGxhc3Qgd3JpdGVyIGFzIHRoZSByZXNwb25zaWJpbGl0eSB0byBiZQotCSAqIHN1cmUgdGhlIHVzZXIgaXMgcHJvbXB0ZWQgdG8gc2F2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKTsKLQotCS8qKgotCSAqIG5ld0luc3RhbmNlIGlzIHNpbWlsYXIgdG8gY2xvbmUsIGV4Y2VwdCB0aGF0IHRoZSBuZXdJbnN0YW5jZSBjb250YWlucwotCSAqIG5vIGNvbnRlbnQuIEl0cyBwdXJwb3NlIGlzIHNvIGNsaWVudHMgY2FuIGdldCBhIHRlbXBvcmFyeSwgdW5tYW5hZ2VkLAotCSAqIG1vZGVsIG9mIHRoZSBzYW1lICJ0eXBlIiBhcyB0aGUgb3JpZ2luYWwuIE5vdGU6IHRoZSBjbGllbnQgbWF5IHN0aWxsCi0JICogbmVlZCB0byBkbyBzb21lIGludGlhbGl6YXRpb24gb2YgdGhlIG1vZGVsIHJldHVybmVkIGJ5IG5ld0luc3RhbmNlLAotCSAqIGRlcGVuZGluZyBvbiBkZXNpcmVkIHVzZS4gRm9yIGV4YW1wbGUsIHRoZSBvbmx5IGZhY3RvcmllcyBpbiB0aGUKLQkgKiBuZXdJbnN0YW5jZSBhcmUgdGhvc2UgdGhhdCB3b3VsZCBiZSBub3JtYWxseSBiZSBjcmVhdGVkIGZvciBhIG1vZGVsIG9mCi0JICogdGhlIGdpdmVuIGNvbnRlbnRUeXBlLiBPdGhlcnMgYXJlIG5vdCBjb3BpZWQgYXV0b21hdGljYWxseSwgYW5kIGlmCi0JICogZGVzaXJlZCwgc2hvdWxkIGJlIGFkZGVkIGJ5IGNsaWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsUHJvcG9zZWQgbmV3SW5zdGFuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQl2b2lkIHJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2Q0ZWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLQotCi0vKioKLSAqIEEgSVN0cnVjdHVyZWREb2N1bWVudCBpcyBhIGNvbGxlY3Rpb24gb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy4gSXQncwotICogb2Z0ZW4gY2FsbGVkICJmbGF0IiBiZWNhdXNlIGl0cyBjb250ZW50cyBieSBkZXNpZ24gZG8gbm90IGNvbnRhaW4gbXVjaAotICogc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBiZXlvbmQgY29udGFpbm1lbnQuIENsaWVudHMgc2hvdWxkIG5vdCBpbXBsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWREb2N1bWVudCBleHRlbmRzIElFbmNvZGVkRG9jdW1lbnQsIElEb2N1bWVudEV4dGVuc2lvbiwgSUFkYXB0YWJsZSB7Ci0KLQl2b2lkIGFkZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBUaGUgU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXJzIGFuZCBNb2RlbENoYW5nZWRMaXN0ZW5lcnMgYXJlIHZlcnkKLQkgKiBzaW1pbGFyLiBUaGV5IGJvdGggcmVjZWl2ZSBpZGVudGljYWwgZXZlbnRzLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGUKLQkgKiB0aW1pbmcuIFRoZSAicHVyZSIgU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXJzIGFyZSBub3RpZmllZCBhZnRlciB0aGUKLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZCwgYnV0IGJlZm9yZSBvdGhlciwgcmVsYXRlZCBtb2RlbHMKLQkgKiBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgc3VjaCBhcyB0aGUgU3RydWN0dXJhbCBNb2RlbC4gVGhlIFN0cnVjdHVyYWwKLQkgKiBtb2RlbCBpcyBpbiBmYWN0IGl0c2VsZiBhICJwdXJlIiBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0bmVyLiBUaGUKLQkgKiBNb2RlbENoYW5nZWRMaXN0ZW5lcnMgY2FuIHJlc3QgYXNzdXJlZCB0aGF0IGFsbCBtb2RlbHMgYW5kIGRhdGEgaGF2ZQotCSAqIGJlZW4gdXBkYXRlZCBmcm9tIHRoZSBjaGFuZ2UgYnkgdGhlIHRpZW0gdGhleSBhcmUgbm90aWZpZWQuIFRoaXMgaXMKLQkgKiBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgdGhlIHRleHQgd2lkZ2V0LCBmb3IgZXhhbXBsZSwgd2hpY2ggbWF5IHJlbHkKLQkgKiBvbiBib3RoIHN0cnVjdHVyZWREb2N1bWVudCBhbmQgc3RydWN0dXJhbCBtb2RlbCBpbmZvcm1hdGlvbi4KLQkgKi8KLQl2b2lkIGFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBUaGUgU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXJzIGFuZCBNb2RlbENoYW5nZWRMaXN0ZW5lcnMgYXJlIHZlcnkKLQkgKiBzaW1pbGFyLiBUaGV5IGJvdGggcmVjZWl2ZSBpZGVudGljYWwgZXZlbnRzLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGUKLQkgKiB0aW1pbmcuIFRoZSAicHVyZSIgU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXJzIGFyZSBub3RpZmllZCBhZnRlciB0aGUKLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZCwgYnV0IGJlZm9yZSBvdGhlciwgcmVsYXRlZCBtb2RlbHMKLQkgKiBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgc3VjaCBhcyB0aGUgU3RydWN0dXJhbCBNb2RlbC4gVGhlIFN0cnVjdHVyYWwKLQkgKiBtb2RlbCBpcyBpbiBmYWN0IGl0c2VsZiBhICJwdXJlIiBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0bmVyLiBUaGUKLQkgKiBNb2RlbENoYW5nZWRMaXN0ZW5lcnMgY2FuIHJlc3QgYXNzdXJlZCB0aGF0IGFsbCBtb2RlbHMgYW5kIGRhdGEgaGF2ZQotCSAqIGJlZW4gdXBkYXRlZCBmcm9tIHRoZSBjaGFuZ2UgYnkgdGhlIHRpZW0gdGhleSBhcmUgbm90aWZpZWQuIFRoaXMgaXMKLQkgKiBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgdGhlIHRleHQgd2lkZ2V0LCBmb3IgZXhhbXBsZSwgd2hpY2ggbWF5IHJlbHkKLQkgKiBvbiBib3RoIHN0cnVjdHVyZWREb2N1bWVudCBhbmQgc3RydWN0dXJhbCBtb2RlbCBpbmZvcm1hdGlvbi4KLQkgKi8KLQl2b2lkIGFkZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogdGhpcyBBUEkgZW5zdXJlcyB0aGF0IGFueSBwb3J0aW9uIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gc3RhcnRPZmYgdG8KLQkgKiBsZW5ndGggaXMgbm90IHJlYWRvbmx5ICh0aGF0IGlzLCB0aGF0IGl0cyBlZGl0YWJsZSkuIE5vdGUgdGhhdCBpZiB0aGUKLQkgKiByYW5nZSBvdmVybGFwcyB3aXRoIG90aGVyIHJlYWRvbmx5IHJlZ2lvbnMsIHRob3NlIG90aGVyIHJlYWRvbmx5Ci0JICogcmVnaW9ucyB3aWxsIGJlIGFkanVzdGVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKi8KLQl2b2lkIGNsZWFyUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiBhbnkgcG9ydGlvbiBvZiBzdGFydE9mZnNldCB0byBsZW5ndGggaXMgcmVhZG9ubHkKLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gY29udGFpbnNSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdG8gcmVtZW1iZXIgaW5mbyBhYm91dCB0aGUgZW5jb2RpbmcgV2hlbiB0aGUgcmVzb3VyY2UKLQkgKiB3YXMgbGFzdCBsb2FkZWQgb3Igc2F2ZWQuIE5vdGU6IGl0IGlzIG5vdCBrZXB0ICJjdXJyZW50IiwgdGhhdCBpcywgY2FuCi0JICogbm90IGJlIGRlcGVuZGVkIG9uIGJsaW5kbHkgdG8gcmVmbGVjdCB3aGF0IGVuY29kaW5nIHRvIHVzZS4gRm9yIHRoYXQsCi0JICogbXVzdCBnbyB0aHJvdWdoIHRoZSBub3JtYWwgcnVsZXMgZXhwcmVzc2VkIGluIExvYWRlcnMgYW5kIER1bXBlcnMuCi0JICovCi0KLQlFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCS8qKgotCSAqIFRoaXMgY2FuIGJlIGNvbnNpZGVyZWQgdGhlIHByZWZlcnJlZCBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCk7Ci0KLQlpbnQgZ2V0TGluZU9mT2Zmc2V0KGludCBvZmZzZXQpOyAvLyB0aHJvd3MgU291cmNlRWRpdGluZ0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoZSBwYXJzZXIgaXMgbm93IHJlcXVpcmVkIG9uIGNvbnN0cnVjdG9yLCBzbyB0aGVyZSBhcmUgb2NjYXNpb25zIGl0Ci0JICogbmVlZHMgdG8gYmUgcmV0cmlldmVkLCBzdWNoIGFzIHRvIGJlIGluaXRpYWxpemVkIGJ5IEVtYmVkZGVkQ29udGVudFR5cGUKLQkgKi8KLQlSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpCi0JICogQHJldHVybgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldFJlZ2lvbkxpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb248L2NvZGU+IGF0IHRoZSBnaXZlbiBjaGFyYWN0ZXIgb2Zmc2V0LgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uPC9jb2RlPiBhdCB0aGUgZ2l2ZW4gY2hhcmFjdGVyIG9mZnNldC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpOwotCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+SVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjwvY29kZT5zIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UuCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcmV0dXJuIDxjb2RlPklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb248L2NvZGU+cyBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGludCBvZmZzZXQsIGludCBsZW5ndGgpOwotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIDxjb2RlPklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb248L2NvZGU+cyBpbiB0aGUgZG9jdW1lbnQuCi0JICogQHJldHVybiBhbGwgPGNvZGU+SVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjwvY29kZT5zIGluIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQotCS8qKgotCSAqIE5vdGU6IHRoaXMgbWV0aG9kIHdhcyBtYWRlIHB1YmxpYywgYW5kIHBhcnQgb2YgdGhlIGludGVyZmFjZSwgZm9yCi0JICogZWFzaWVyIHRlc3RpbmcuIENsaWVudHMgbm9ybWFsbHkgbmV2ZXIgbWFuaXB1bGF0ZSB0aGUgcmVwYXJzZXIgZGlyZWN0bHkKLQkgKiAobm9yIHNob3VsZCB0aGV5IG5lZWQgdG8pLgotCSAqLwotCUlTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIGdldFJlUGFyc2VyKCk7Ci0KLQlTdHJpbmcgZ2V0VGV4dCgpOwotCi0JSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKTsKLQotCS8qKgotCSAqIGNhdXNlcyB0aGF0IHBvcnRpb24gb2YgdGhlIGRvY3VtZW50IGZyb20gc3RhcnRPZmZzZXQgdG8gbGVuZ3RoIHRvIGJlCi0JICogbWFya2VkIGFzIHJlYWRvbmx5LiBOb3RlIHRoYXQgaWYgdGhpcyByYW5nZSBvdmVybGFwcyB3aXRoIHNvbWUgb3RoZXIKLQkgKiByZWdpb24gd2l0aCBpcyByZWFkb25seSwgdGhlIHJlZ2lvbnMgYXJlIGVmZmVjdGl2bHkgY29tYmluZWQuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqLwotCXZvaWQgbWFrZVJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiBuZXdJbnN0YW5jZSBpcyBzaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgaXQgY29udGFpbnMgbm8gZGF0YS4gT25lCi0JICogaW1wb3J0YW50IHRoaW5nIHRvIGR1cGxpY2F0ZSBpcyB0aGUgcGFyc2VyLCB3aXRoIHRoZSBwYXJzZXIgY29ycmVjdGx5Ci0JICogImNsb25lZCIsIGluY2x1ZGluZyBpdHMgdG9rZW5pbnplciwgYmxvY2sgdGFncywgZXRjLgotCSAqIAotCSAqIE5PVEU6IGV2ZW4gYWZ0ZXIgb2J0YWluaW5nIGEgJ25ld0luc3RhbmNlJyB0aGUgY2xpZW50IG1heSBoYXZlIHRvIGRvCi0JICogc29tZSBpbml0aWFsaXphdGlvbiwgZm9yIGV4YW1wbGUsIGl0IG1heSBuZWVkIHRvIGFkZCBpdHMgb3duIG1vZGVsCi0JICogbGlzdGVuZXJzLiBPciwgYXMgYW5vdGhlciBleGFtcGxlLCBpZiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBoYXMgYQotCSAqIHBhcnNlciBvZiB0eXBlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciwgdGhlbiB0aGUgY2xpZW50IG1heSBuZWVkCi0JICogdG8gYWRkIGl0cyBvd24gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciB0byB0aGF0IHBhcnNlciwgaWYgaXQgaXMKLQkgKiBpbiBmYWN0IG5lZWRlZC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IG5ld0luc3RhbmNlKCk7Ci0KLQl2b2lkIHJlbW92ZURvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQl2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQl2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICogCi0JICogcmVwbGFjZVRleHQgcmVwbGFjZXMgdGhlIHRleHQgZnJvbSBvbGRTdGFydCB0byBvbGRFbmQgd2l0aCB0aGUgbmV3IHRleHQKLQkgKiBmb3VuZCBpbiB0aGUgcmVxdWVzdGVkQ2hhbmdlIHN0cmluZy4gSWYgb2xkU3RhcnQgYW5kIG9sZEVuZCBhcmUgZXF1YWwsCi0JICogaXQgaXMgYW4gaW5zZXJ0aW9uIHJlcXVlc3QuIElmIHJlcXVlc3RlZENoYW5nZSBpcyBudWxsIChvciBlbXB0eSkgaXQgaXMKLQkgKiBhIGRlbGV0ZSByZXF1ZXN0LiBPdGhlcndpc2UgaXQgaXMgYSByZXBsYWNlIHJlcXVlc3QuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHNvdXJjZSwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UpOwotCi0JLyoqCi0JICogTm90ZSwgc2FtZSBhcyByZXBsYWNlVGV4dCBBUEksIGJ1dCB3aWxsIGFsbG93IHJlYWRvbmx5IGFyZWFzIHRvIGJlCi0JICogcmVwbGFjZWQuIFRoaXMgc2hvdWxkIHNlbGRvbSBiZSBjYWxsZWQgd2l0aCBhIHZhbHVlIG9mICJ0cnVlIiBmb3IKLQkgKiBpZ25vcmVSZWFkT25seVNldHRpbmcuIE9uZSBjYXNlIHdoZXJlIGl0cyBvayBpcyB3aXRoIHVuZG8gb3BlcmF0aW9ucwotCSAqIChzaW5jZSwgcHJlc3VtYWJseSwgaWYgdXNlciBqdXN0IGRpZCBzb21ldGhpbmcgdGhhdCBoYXBwZW5kZWQgdG8KLQkgKiBpbnZvbHZlIHNvbWUgaW5zZXJ0aW5nIHJlYWRvbmx5IHRleHQsIHRoZXkgc2hvdWxkIG5vcm1hbGx5IGJlIGFsbG93ZWQKLQkgKiB0byBzdGlsbCB1bmRvIHRoYXQgb3BlcmF0aW9uLiBPdGhlcndpc2UsIEkgY2FuJ3QgdGhpbmsgb2YgYSBzaW5nbGUKLQkgKiBleGFtcGxlLCB1bmxlc3MgaXRzIHRvIGdpdmUgdGhlIHVzZXIgYSBjaG9pY2UsIGUuZy4gInlvdSBhcmUgYWJvdXQgdG8KLQkgKiBvdmVyd3JpdGUgcmVhZCBvbmx5IHBvcnRpb25zLCBkbyB5b3Ugd2FudCB0byBjb250aW51ZSIuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHNvdXJjZSwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UsIGJvb2xlYW4gaWdub3JlUmVhZE9ubHlTZXR0aW5nKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHRvIHJlbWVtYmVyIGluZm8gYWJvdXQgdGhlIGVuY29kaW5nIFdoZW4gdGhlIHJlc291cmNlCi0JICogd2FzIGxhc3QgbG9hZGVkIG9yIHNhdmVkLiBOb3RlOiBpdCBpcyBub3Qga2VwdCAiY3VycmVudCIsIHRoYXQgaXMsIGNhbgotCSAqIG5vdCBiZSBkZXBlbmRlZCBvbiBibGluZGx5IHRvIHJlZmxlY3Qgd2hhdCBlbmNvZGluZyB0byB1c2UuIEZvciB0aGF0LAotCSAqIG11c3QgZ28gdGhyb3VnaCB0aGUgbm9ybWFsIHJ1bGVzIGV4cHJlc3NlZCBpbiBMb2FkZXJzIGFuZCBEdW1wZXJzLgotCSAqLwotCXZvaWQgc2V0RW5jb2RpbmdNZW1lbnRvKEVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8pOwotCi0JcHVibGljIHZvaWQgc2V0TGluZURlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKTsKLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgQVBJcyB0byBtYW5pcHVsYXRlIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IGluIHRlcm1zIG9mIFRleHQuCi0JICogCi0JICogVGhlIHNldFRleHQgbWV0aG9kIHJlcGxhY2VzIGFsbCB0ZXh0IGluIHRoZSBtb2RlbC4KLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBzZXRUZXh0KE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBhbGxUZXh0KTsKLQotCXZvaWQgc2V0VW5kb01hbmFnZXIoSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01hbmFnZXIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIwM2IyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotLyoqCi0gKiBBIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2YgSVRleHRSZWdpb25zLiBJdCBpcyBhIHN0cnVjdHVyYWwKLSAqIHVuaXQsIGJ1dCBhIG1pbmltYWwgb25lLiBGb3IgZXhhbXBsZSwgaW4gbWlnaHQgY29uc2lzdCBvZiBhICJzdGFydCB0YWciIGJ1dAotICogbm90IGEgd2hvbGUgWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBleHRlbmRzIElUZXh0UmVnaW9uQ29sbGVjdGlvbiB7Ci0KLQkvKioKLQkgKiBBZGRzIGEgdGV4dCByZWdpb24gdG8gdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbiBvZiByZWdpb25zIGNvbnRhaW5lZCBieQotCSAqIHRoaXMgcmVnaW9uLiBJdCBpcyB0aGUgcGFyc2VycyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgaXRzIGEKLQkgKiBjb3JyZWN0IHJlZ2lvbiAodGhhdCBpcywgaXRzIHN0YXJ0IG9mZnNldCBpcyBvbmUgZ3JlYXRlciB0aGFuIHByZXZpb3VzCi0JICogcmVnaW9ucyBlbmQgb2Zmc2V0KQotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGRSZWdpb24oSVRleHRSZWdpb24gYVJlZ2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiB0aGF0IGZvbGxvd3MgdGhpcyBvbmUgb3IgbnVsbCBpZgotCSAqIGF0IGVuZCBvZiBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiB0aGF0IGZvbGxvd3MgdGhpcyBvbmUuCi0JICogCi0JICogSVNTVUU6IGZvciB0aHJlYWQgc2FmZXR5LCB0aGlzIHNob3VsZCBiZSBtb3JlIHJlc3RyaWN0aXZlLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TmV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIHJlZ2lvbnMgcGFyZW50IGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyByZWdpb25zIHBhcmVudCBkb2N1bWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGdldFBhcmVudERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiB0aGF0IHByZWNlZWRzIHRoaXMgb25lIG9yIG51bGwKLQkgKiBpZiBhdCBiZWdpbm5pbmcgb2YgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gdGhhdCBmb2xsb3dzIHRoaXMgb25lLgotCSAqIAotCSAqIElTU1VFOiBmb3IgdGhyZWFkIHNhZmV0eSwgdGhpcyBzaG91bGQgYmUgbW9yZSByZXN0cmljdGl2ZS4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZpb3VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBkb2N1bWVudCBoYXMgYmVlbiBkZWxldGVkLCBhbmQgaXMgbm8gbG9uZ2VyIHBhcnQKLQkgKiBvZiB0aGUgYWN0dWFsIHN0cnVjdHVyZWQgZG9jdW1lbnQuIFRoaXMgZmllbGQgY2FuIGJlIHVzZWQgaW4KLQkgKiBtdWx0aS10aHJlYWRlZCBvcGVyYXRpb25zLCB3aGljaCBtYXkgcmV0cmlldmUgYSBsb25nIGxpc3Qgb2YgcmVnaW9ucwotCSAqIGFuZCBiZSBpdGVyYXRpbmcgdGhyb3VnaCB0aGVtIGF0IHRoZSBzYW1lIHRpbWUgdGhlIGRvY3VtZW50IGlzCi0JICogbW9kaWZpZWQsIGFuZCByZWdpb25zIGRlbGV0ZWQuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgcmVnaW9uIGlzIG5vIGxvbmdlciBwYXJ0IG9mIGRvY3VtZW50LgotCSAqLwotCWJvb2xlYW4gaXNEZWxldGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiB3YXMgZW5kZWQgIm5hdHVyYWxseSIKLQkgKiBieSBzeW50YWN0aWMgcnVsZXMsIG9yIGlmIHNpbXBseSBhc3N1bWVkIHRvIGVuZCBzbyBhbm90aGVyIGNvdWxkIGJlCi0JICogc3RhcnRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgcmVnaW9uIGhhcyBzeW50YWN0aWMgZW5kLgotCSAqLwotCWJvb2xlYW4gaXNFbmRlZCgpOwotCi0JLyoqCi0JICogVGVzdHMgaXMgcmVnaW9uIGlzIGVxdWFsIHRvIHRoaXMgb25lLCBpZ25vcmluZyBwb3NpdGlvbiBvZmZzZXRzIG9mCi0JICogc2hpZnQuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogQHBhcmFtIHNoaWZ0Ci0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gc2FtZUFzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpOwotCi0JLyoqCi0JICogVGVzdHMgaWYgPGNvZGU+b2xkUmVnaW9uPC9jb2RlPiBpcyBzYW1lIGFzIDxjb2RlPm5ld1JlZ2lvbjwvY29kZT4sCi0JICogaWdub3JpbmcgcG9zaXRpb24gb2Zmc2V0cyBvZiA8Y29kZT5zaGlmdDwvY29kZT4uCi0JICogCi0JICogSVNTVUU6IHdoaWNoIGRvY3VtZW50IHJlZ2lvbiBhcmUgb2xkIGFuZCBuZXcgaW4/Ci0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkUmVnaW9uCi0JICogQHBhcmFtIGRvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIG5ld1JlZ2lvbgotCSAqIEBwYXJhbSBzaGlmdAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiBvbGRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIG5ld1JlZ2lvbiwgaW50IHNoaWZ0KTsKLQotCS8qKgotCSAqIFNldCB0byB0cnVlIGlmL3doZW4gdGhpcyByZWdpb24gaXMgcmVtb3ZlZCBmcm9tIGEgZG9jdW1lbnQsIGR1cmluZyB0aGUKLQkgKiBwcm9jZXNzIG9mIHJlLXBhcnNpbmcuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsZXRlZAotCSAqLwotCXZvaWQgc2V0RGVsZXRlZChib29sZWFuIGRlbGV0ZWQpOwotCi0JLyoqCi0JICogU2V0IHRvIHRydWUgYnkgcGFyc2VyL3JlcGFyc2VyIGlmIHJlZ2lvbiBkZWVtZWQgdG8gZW5kIHN5bnRhY3RpY2FsbHkuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gaGFzRW5kCi0JICovCi0Jdm9pZCBzZXRFbmRlZChib29sZWFuIGhhc0VuZCk7Ci0KLQkvKioKLQkgKiBTZXRzIGxlbmd0aCBvZiByZWdpb24uCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIHNldExlbmd0aChpbnQgbmV3TGVuZ3RoKTsKLQotCS8qKgotCSAqIEFzc2lnbnMgcG9pbnRlciB0byBuZXh0IHJlZ2lvbiwgb3IgbnVsbCBpZiBsYXN0IHJlZ2lvbi4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgc2V0TmV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05leHQpOwotCi0JLyoqCi0JICogQXNzaWducyBwYXJlbnQgZG9jdW1uZXQuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpOwotCi0JLyoqCi0JICogQXNzaWducyBwb2ludGVyIHRvIHByZXZpb3VzIHJlZ2lvbiwgb3IgbnVsbCBpZiBmaXJzdCByZWdpb24uCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIHNldFByZXZpb3VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3UHJldmlvdXMpOwotCi0JLyoqCi0JICogU2V0cyBzdGFydCBvZmZzZXQgb2YgcmVnaW9uLCByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YgZG9jdW1lbnQuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIHNldFN0YXJ0KGludCBuZXdTdGFydCk7Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzQ0MzFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgYSBjbGFzcyB1c2VkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIHNvIHRoZQotICogaW1wbGVtZW50YXRpb24gb2YgaG93IHRoZSBsaXN0IGlzIGZvcm1lZCBjYW4gYmUgaGlkZGVuIChlbmNhcHN1bGF0ZWQgYnkKLSAqIHRoaXMgY2xhc3MpLgotICogCi0gKiBJU1NVRTogc2hvdWxkIGV4dGVuZCBJVGV4dFJlZ2lvbkxpc3QgaW5zdGVhZD8KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGVudW1lcmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gZW51bWVyYXRpb24uCi0JICovCi0JRW51bWVyYXRpb24gZWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgc2l6ZSBvZiBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gc2l6ZSBvZiBsaXN0LgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIGF0IGluZGV4IGkuCi0JICogCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIGluZGV4IG9mIHJlZ2lvbiB0byByZXR1cm4KLQkgKiBAcmV0dXJuIHRoZSByZWdpb24gYXQgc3BlY2lmaWVkIG9mZnNldC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGl0ZW0oaW50IGkpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25UeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9uVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjMjAxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbmluZyBmb3IgU3RydWN0dXJlZERvY3VtZW50cy4KLSAqIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFBhcnRpdGlvblR5cGVzIHsKLQotCVN0cmluZyBERUZBVUxUX1BBUlRJVElPTiA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVOS05PV05fUEFSVElUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuVU5LTk9XTl9QQVJUSVRJT05fVFlQRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFBhcnRpdGlvbmluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTk0MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0vKioKLSAqIElkZW50aWZpZXMgdGhlIHdheSB0aGF0IERvY3VtZW50cyBhcmUgcGFydGl0aW9uZWQuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nIHsKLQkKLQkvKiogU3RyaW5nIHRvIGlkZW50aWZ5IGRlZmF1bHQgcGFydGl0aW9uaW5nKi8KLQlTdHJpbmcgREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZGVmYXVsdF9zdHJ1Y3R1cmVkX3RleHRfcGFydGl0aW9uaW5nIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1M2Y4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbjsKLQotCi0vKioKLSAqIEEgcGFydGl0aW9uZXIgaW50ZXJmYWNlIHJlcXVpcmVkIGZvciBoYW5kbGluZyB0aGUgZW1iZWRkZWQgY29udGVudCB0eXBlIAotICogcHJvcGVybHkuIAotICogCi0gKiBJU1NVRTogbmVlZCB0byBpbnZlc3RpZ2F0ZSBuZWNlc3NpdHkgb2YgdGhlc2UgbWV0aG9kcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIGV4dGVuZHMgSURvY3VtZW50UGFydGl0aW9uZXIgewotCi0JLyoqCi0JICogVXNlZCBieSBKU1AgcGFydGl0aW9uZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHBhcnRpdGlvbmVyIG9mIHRoZQotCSAqIGVtYmVkZGVkIGNvbnRlbnQgdHlwZSBnZXRzIHRvIGNyZWF0ZSB0aGUgcGFydGl0aW9uIGluIGNhc2UgdGhlIHNwZWNpZmljCi0JICogY2xhc3NlcyBhcmUgaW1wb3J0YW50LgotCSAqIAotCSAqIElTU1VFOiBpbnZlc3RpZ2F0ZSBpZiB3ZSByZWFsbHkgbmVlZCB0aGlzLi4uCi0JICovCi0JSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHBhcnRpdGlvblR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRGVmYXVsdCBwYXJ0aXRpb24gdHlwZSBmb3IgdGhpcyBwYXJ0aXRpb25lci4KLQkgKiA8cD4KLQkgKiBlZzoKLQkgKiA8YnI+PGNvZGU+b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQ8L2NvZGU+Ci0JICogPGJyPjxjb2RlPm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUPC9jb2RlPgotCSAqIDxicj48Y29kZT5vcmcuZWNsaXBzZS53c3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVDwvY29kZT4KLQkgKiA8L3A+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9ucwotCSAqIAotCSAqIEByZXR1cm4gdGhlIERlZmF1bHQgcGFydGl0aW9uIHR5cGUgZm9yIHRoaXMgcGFydGl0aW9uZXIuCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aWN1bGFyIHBhcnRpdGlvbiB0eXBlIGZvciB0aGUgZ2l2ZW4gcmVnaW9uL29mZnNldC4KLQkgKiA8cD4KLQkgKiBlZzoKLQkgKiA8YnI+PGNvZGU+b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQ8L2NvZGU+Ci0JICogPGJyPjxjb2RlPm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUPC9jb2RlPgotCSAqIDxicj48Y29kZT5vcmcuZWNsaXBzZS53c3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVDwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHJlZ2lvbiBvZiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudAotCSAqIEBwYXJhbSBvZmZzZXQgaW4gdGhlIElTdHJ1Y3R1cmVkRG91Y21lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aWN1bGFyIHBhcnRpdGlvbiB0eXBlIGZvciB0aGUgZ2l2ZW4gcmVnaW9uL29mZnNldC4KLQkgKi8KLQlTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5nIG9mIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIAotCSAqIGJldHdlZW4gdGhlIDIgcmVnaW9uIHBhcmFtZXRlcnMuCi0JICogVXNlZnVsIGZvciBmaW5kaW5nIHRoZSBwYXJ0aXRpb24gdHlwZSBvZiBhIDAgbGVuZ3RoIHJlZ2lvbi4KLQkgKiBlZy4KLQkgKiA8cHJlPgotCSAqIAk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+fDwvc2NyaXB0PgotCSAqIDwvcHJlPgotCSAqIEBwYXJhbSBwcmV2aW91c05vZGUKLQkgKiBAcGFyYW0gbmV4dE5vZGUKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aXRpb24gdHlwZSBvZiB0aGUgbm9kZSBiZXR3ZWVuIHByZXZpb3VzTm9kZSBhbmQgbmV4dE5vZGUKLQkgKiBAZGVwcmVjYXRlZCBtb3ZlIHRvIElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMiAtPgotCSAqICBTdHJpbmcgZ2V0Q29udGVudFR5cGUoaW50IG9mZnNldCwgYm9vbGVhbiBwcmVmZXJPcGVuUGFydGl0aW9ucyk7Ci0JICovCi0JU3RyaW5nIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNOb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFRleHRSZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhY2RmYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0KLS8qKgotICogSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgZGVzY3JpYmVzIHRoZSBjaGFyYWN0ZXJpc3RpY3MgYW5kIHJlc3BvbnNpYmlsaXRpZXMKLSAqIGZvciByZXBhcnNpbmcgYSBzdHJ1Y3R1cmVkIGRvY3VtZW50LgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFRleHRSZVBhcnNlciB7Ci0KLQkvKioKLQkgKiBCZWdpbnMgdGhlIHByb2Nlc3Mgb2YgcmVwYXJzaW5nLCBieSBwcm92aWRpbmcgdGhlIGluZm9ybWF0aW9uIG5lZWRlZAotCSAqIGZvciB0aGUgcmVwYXJzZS4gVGhlIHJlcGFyc2UgaXMgYWN0dWFsbHkgcGVyZm9ybWVkIHdoZW4gdGhlIHJlcGFyc2UKLQkgKiBtZXRob2QgaXMgY2FsbGVkLiBXaWxsIHRocm91Z2ggYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGRvY3VtZW50IGFzCi0JICogbm90IGJlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogQHBhcmFtIGxlbmd0aFRvUmVwbGFjZQotCSAqIEBwYXJhbSBjaGFuZ2VzCi0JICovCi0Jdm9pZCBpbml0aWFsaXplKE9iamVjdCByZXF1ZXN0ZXIsIGludCBzdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSwgU3RyaW5nIGNoYW5nZXMpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgdG8gZW5hYmxlIG11bHRpcGxlIHRocmVhZHMgdG8gcmVwYXJzZSBhCi0JICogZG9jdW1lbnQuIFRoaXMgaXMgbmVlZGVkIHNpbmNlIHRoZSBpbnRpYWxpemUgbWV0aG9kIHNldHMgc3RhdGUKLQkgKiB2YXJpYWJsZXMgdGhhdCBtdXN0IGJlICJpbiBzeW5jIiB3aXRoIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgcmVwYXJzZXIsIHVzZWQgd2hlbiBjbG9uaW5nIGRvY3VtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgcmVwYXJzZXIuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCk7Ci0KLQkvKioKLQkgKiBBbiBlbnRyeSBwb2ludCBmb3IgcmVwYXJzaW5nLiBJdCBuZWVkcyB0byBjYWxjdWxhdGVzIHRoZSBkaXJ0eSBzdGFydAotCSAqIGFuZCBkaXJ0eSBlbmQgaW4gdGVybXMgb2Ygc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zIGJhc2VkIG9uIHRoZQotCSAqIHN0YXJ0IHBvaW50IGFuZCBsZW5ndGggb2YgdGhlIGNoYW5nZXMsIHdoaWNoIGFyZSBwcm92aWRlZCBieSB0aGUKLQkgKiBpbml0aWFsaXplIG1ldGhvZC4gV2lsbCB0aHJvdWdoIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBkb2N1bWVudCBhcwotCSAqIG5vdCBiZSBzZXQuCi0JICogCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoKTsKLQotCi0KLQkvKioKLQkgKiBUaGUgcmVwYXJzZXIgaXMgaW5pdGlhbGl6ZWQgd2l0aCBpdHMgZG9jdW1lbnQsIGVpdGhlciBpbiBvciBzaG9ydGx5Ci0JICogYWZ0ZXIgaXRzIGNvbnN0cnVjdGVkIGlzIGNhbGxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMjgxYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0KLS8qKgotICogQSBzaW1wbGUgZGVzY3JpcHRpb24gb2YgYSBiaXQgb2YgdGV4dCAodGVjaG5pY2FsbHksIGEgYml0IG9mIGEgdGV4dCBidWZmZXIpCi0gKiB0aGF0IGhhcyBhICJ0eXBlIiBhc3NvY2lhdGVkIHdpdGggaXQuIEZvciBleGFtcGxlLCBmb3IgdGhlIFhNTCB0ZXh0Ci0gKiAiJkxUO0lNRyZHVDsiLCB0aGUgJyA8JyBtaWdodCBmb3JtIGEgcmVnaW9uIG9mIHR5cGUgIm9wZW4gYnJhY2tldCIgd2hlcmUgYXMKLSAqIHRoZSB0ZXh0ICJJTUciIG1pZ2h0IGZvcm0gYSByZWdpb24gb2YgdHlwZSAidGFnIG5hbWUiLgotICogCi0gKiBOb3RlIHRoYXQgdGhlcmUgYXJlIHRocmVlIHBvc2l0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSByZWdpb24sIHRoZSBzdGFydCwKLSAqIHRoZSBlbmQsIGFuZCB0aGUgZW5kIG9mIHRoZSB0ZXh0LiBUaGUgZW5kIG9mIHRoZSByZWdpb24gc2hvdWxkIGFsd2F5cyBiZQotICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBlbmQgb2YgdGhlIHRleHQsIGJlY2F1c2UgdGhlIGVuZCBvZiB0aGUgdGV4dAotICogc2ltcGx5IGluY2x1ZGVzIGFueSB3aGl0ZSBzcGFjZSB0aGF0IG1pZ2h0IGZvbGxvdyB0aGUgbm9uLXdoaXRlc3BhY2UKLSAqIHBvcnRpb24gb2YgdGhlIHJlZ2lvbi4gVGhpcyB3aGl0ZXNwYWNlIGlzIGFzc3VtZWQgdG8gYmUgaWdub3JhYmxlIGV4Y2VwdAotICogZm9yIHJlYXNvbnMgb2YgbWFpbnRhaW5pbmcgaXQgaW4gdGhlIG9yaWdpbmFsIGRvY3VtZW50IGZvciBmb3JtYXR0aW5nLAotICogYXBwZWFyYW5jZSwgZXRjLgotICogCi0gKiBGb2xsb3dzIHRoZSBQcmltZSBEaXJlY3RpdmVzOgotICogCi0gKiBnZXRFbmQoKSA9PSBnZXRTdGFydCgpICsgZ2V0TGVuZ3RoKCkKLSAqIAotICogZ2V0VGV4dEVuZCgpID09IGdldFN0YXJ0KCkgKyBnZXRUZXh0TGVuZ3RoKCk7Ci0gKiAKLSAqIEV2ZW50IHRob3VnaCAnZW5kJyBhbmQgJ2xlbmd0aCcgYXJlIHJlZHVuZGFudCAoZ2l2ZW4gc3RhcnQpLCBib3RoIG1ldGhvZHMKLSAqIGFyZSBwcm92aWRlZCwgc2luY2Ugc29tZSBwYXJzZXJzL2ltcGxlbWVudGF0aW9ucyBmYXZvciBvbmUgb3IgdGhlIG90aGVyIGZvcgotICogZWZmaWNpZW5jeS4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWdpb24gewotCi0JLyoqCi0JICogQ2hhbmdlcyBsZW5ndGggb2YgcmVnaW9uLiBNYXkgYmUgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuCi0JICogemVyby4gSXQgbWF5IG5vdCwgaG93ZXZlciwgY2F1c2UgdGhlIGxlbmd0aCBvZiB0aGUgcmVnaW9uIHRvIGJlIGxlc3MKLQkgKiB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIG9yIGFuIGlsbGVnYWwgYXJndW1lbnQgYWNjZXB0aW9uIG1heSBiZSB0aHJvd24KLQkgKiBhdCBydW50aW1lLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpOwotCi0JLyoqCi0JICogQ2hhbmdlcyBzdGFydCBvZmZzZXQgb2YgcmVnaW9uLiBNYXkgYmUgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlcgotCSAqIHRoYW4gemVyby4gSXQgbWF5IG5vdCwgaG93ZXZlciwgY2F1c2UgdGhlIG9mZnNldCBvZiB0aGUgcmVnaW9uIHRvIGJlCi0JICogbGVzcyB0aGFuIHplcm8sIG9yIGFuIGlsbGVnYWwgYXJndW1lbnQgYWNjZXB0aW9uIG1heSBiZSB0aHJvd24gYXQKLQkgKiBydW50aW1lLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGp1c3RTdGFydChpbnQgaSk7Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRleHQgbGVuZ3RoIG9mIHJlZ2lvbi4KLQkgKiAKLQkgKiBNYXkgYmUgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHplcm8uIEl0IG1heSBub3QsIGhvd2V2ZXIsCi0JICogY2F1c2UgdGhlIHRleHQgbGVuZ3RoIG9mIHRoZSByZWdpb24gdG8gYmUgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgYQotCSAqIHJlZ2lvbiwgb3IgYW4gaWxsZWdhbCBhcmd1bWVudCBhY2NlcHRpb24gbWF5IGJlIHRocm93biBhdCBydW50aW1lLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKTsKLQotCS8qKgotCSAqIE1ha2VzIHRoaXMgcmVnaW9ucyBzdGFydCwgbGVuZ3RoLCBhbmQgdGV4dCBsZW5ndGggZXF1YWwgdG8gdGhlCi0JICogcGFyZW10ZXIncyBzdGFydCwgbGVuZ3RoLCBhbmQgdGV4dCBsZW5ndGguCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqLwotCXZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgb2Zmc2V0IG9mIHRoaXMgcmVnaW9uLiBXaGV0aGVyIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAqIGRvY3VtZW50LCBvciBhbm90aGVyIHJlZ2lvbiBkZXBlbmRzIG9uIHRoZSBzdWJ0eXBlLgotCSAqIAotCSAqIEZvbGxvd3MgdGhlIFByaW1lIERpcmVjdGl2ZTogZ2V0RW5kKCkgPT0gZ2V0U3RhcnQoKSArIGdldExlbmd0aCgpCi0JICogCi0JICogQHJldHVybiB0aGUgZW5kIG9mZnNldCBvZiB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0RW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbi4KLQkgKiAKLQkgKiBGb2xsb3dzIHRoZSBQcmltZSBEaXJlY3RpdmU6IGdldEVuZCgpID09IGdldFN0YXJ0KCkgKyBnZXRMZW5ndGgoKQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmVnaW9uLgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IG9mIHRoZSByZWdpb24uIFdoZXRoZXIgaXMgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50LAotCSAqIG9yIGFub3RoZXIgcmVnaW9uIGRlcGVuZHMgb24gdGhlIHN1YnR5cGUuCi0JICogCi0JICogRm9sbG93cyB0aGUgUHJpbWUgRGlyZWN0aXZlOiBnZXRFbmQoKSA9PSBnZXRTdGFydCgpICsgZ2V0TGVuZ3RoKCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGFydCBvZiB0aGUgcmVnaW9uLgotCSAqLwotCWludCBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBJbiBzb21lIGltcGxlbWVudGF0aW9ucywgdGhlICJlbmQiIG9mIHRoZSByZWdpb24gKGFjY2Vzc2libGUgdmlhCi0JICogZ2V0RW5kKCkpIGFsc28gY29udGFpbnMgYW55IGFuZCBhbGwgd2hpdGUgc3BhY2UgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZQotCSAqIHByZXNlbnQgYWZ0ZXIgdGhlICJ0b2tlbiIgKHJlYWQ6IHJlbGV2YW50KSBwYXJ0IG9mIHRoZSByZWdpb24uIFRoaXMKLQkgKiBtZXRob2QsIGdldFRleHRFbmQoKSwgaXMgc3BlY2lmaWMgZm9yIHRoZSAidG9rZW4iIHBhcnQgb2YgdGhlIHJlZ2lvbiwKLQkgKiB3aXRob3V0IHRoZSB3aGl0ZXNwYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHRleHQgb2YgdGhpcyByZWdpb24uCi0JICovCi0JaW50IGdldFRleHRFbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBUaGUgdGV4dCBsZW5ndGggaXMgZXF1YWwgdG8gbGVuZ3RoIGlmIHRoZXJlIGlzIG5vIHdoaXRlIHNwYWNlIGF0IHRoZQotCSAqIGVuZCBvZiBhIHJlZ2lvbi4gT3RoZXJ3aXNlIGl0IGlzIHNtYWxsZXIgdGhhbiBsZW5ndGguCi0JICogCi0JICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IG9mIHRoaXMgcmVnaW9uLgotCSAqLwotCWludCBnZXRUZXh0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgcmVnaW9uLgotCSAqIAotCSAqIEBzZWUgcmVnaW9udHlwZXMsIHN0cnVjdHVyZWRkb2N1bWVudHJlZ2lvbnR5cGVzCi0JICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogQWxsb3dzIHRoZSByZWdpb24gaXRzZWxmIHRvIHBhcnRpY2lwYXRlIGluIHJlcGFyc2luZyBwcm9jZXNzLgotCSAqIAotCSAqIFRoZSByZWdpb24gaXRzZWxmIGNhbiBkZWNpZGUgaWYgaXQgY2FuIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQKLQkgKiB0byByZXR1cm4sIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgY2hhbmdlLiBJZiBpdCBjYW4gbm90LCB0aGlzIG1ldGhvZAotCSAqIG11c3QgcmV0dXJuIG51bGwsIHNvIGEgImhpZ2hlciBsZXZlbCIgcmVwYXJzaW5nIHByb2Nlc3Mgd2lsbCBiZSBnaXZlbgotCSAqIHRoZSBvcHB1cnR1bml0eSB0byBkZWNpZGUuIElmIGl0IHJldHVybnMgYW4gRXZlbnQsIHRoYXQncyBpdCwgbm90IG90aGVyCi0JICogcmVwYXJzaW5nIHByb2Nlc3Mgd2lsbCBnZXQgYW4gb3BwdXJ0dW5pdHkgdG8gcmVwYXJzZS4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqIAotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVRleHRSZWdpb25Db2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVRleHRSZWdpb25Db2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ODkwYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLS8qKgotICogSVRleHRSZWdpb25Db2xsZWN0aW9uLCBhcyBpdHMgbmFtZSBpbXBsaWVzLCBpcyBhIGNvbGxlY3Rpb24gb2YKLSAqIElUZXh0UmVnaW9ucy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWdpb25Db2xsZWN0aW9uIGV4dGVuZHMgSVRleHRSZWdpb24gewotCi0JLyoqCi0JICogVXNlZCB0byBkZXRlcm1pbmUgaWYgYSByZWdpb24gY29udGFpbnMgYSBwYXJ0aWN1bGFyIG9mZnNldCwgd2hlcmUKLQkgKiBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiBhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIHRydWUgaWYgb2Zmc2V0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byByZWdpb25zIHN0YXJ0IGFuZAotCSAqICAgICAgICAgbGVzcyB0aGFuIGl0cyBlbmQgb2Zmc2V0LgotCSAqLwotCWJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRldGVybWluZSBpZiBhIHJlZ2lvbiBjb250YWlucyBhIHBhcnRpY3VsYXIgb2Zmc2V0LgotCSAqIAotCSAqIElTU1VFOiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRoaXMgaXMgcmVhbGx5IGZvciEgKHRoYXQgaXMsIGhvdyB0bwotCSAqIGRlc2NyaWJlIGl0LCBvciBpZiBzdGlsbCBuZWVkZWQpLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIHRydWUgaWYgb2Zmc2V0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byByZWdpb25zIHN0YXJ0IGFuZAotCSAqICAgICAgICAgbGVzcyB0aGFuIGl0cyBlbmQgb2Zmc2V0LgotCSAqLwotCWJvb2xlYW4gY29udGFpbnNPZmZzZXQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhpcyByZWdpb24sIHJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZgotCSAqIGRvY3VtZW50LgotCSAqIAotCSAqIEZvciBzb21lIHN1YnR5cGVzLCBidXQgbm90IGFsbCwgaXQgaXMgZXF1aXZpbGVudCB0byBnZXRFbmQoKS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbmQgb2Zmc2V0IG9mIHRoaXMgcmVnaW9uLgotCSAqLwotCWludCBnZXRFbmRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQsIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50IG9mCi0JICogdGhlIGNvbnRhaW5lZCByZWdpb24uCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lZFJlZ2lvbgotCSAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24uCi0JICovCi0JaW50IGdldEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgcmVnaW9uIG9mIHRob3NlIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbiBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IHJlZ2lvbi4KLQkgKi8KLQlJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbCB0ZXh0IG9mIHRoaXMgcmVnaW9uLCBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmdWxsIHRleHQgb2YgdGhpcyByZWdpb24sIGluY2x1ZGluZyB3aGl0ZXNwYWNlLgotCSAqLwotCVN0cmluZyBnZXRGdWxsVGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbCB0ZXh0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmdWxsIHRleHQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24sIGluY2x1ZGluZyB3aGl0ZXNwYWNlLgotCSAqLwotCVN0cmluZyBnZXRGdWxsVGV4dChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFzdCByZWdpb24gb2YgdGhvc2UgY29udGFpbmVkIGJ5IHRoaXMgcmVnaW9uIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgbGFzdCByZWdpb24uCi0JICovCi0JSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlZ2lvbnMgY29udGFpbmVkIGJ5IHRoaXMgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByZWdpb25zIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWdpb24gdGhhdCBjb250YWlucyBvZmZzZXQuIEluIHRoZSBjYXNlIG9mICJuZXN0ZWQiCi0JICogcmVnaW9ucywgcmV0dXJucyB0aGUgdG9wIG1vc3QgcmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZiBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIHRoZSByZWdpb24gdGhhdCBjb250YWlucyBvZmZzZXQuIEluIHRoZSBjYXNlIG9mICJuZXN0ZWQiCi0JICogICAgICAgICByZWdpb25zLCByZXR1cm5zIHRoZSB0b3AgbW9zdCByZWdpb24uCi0JICovCi0JSVRleHRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWdpb25zIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBOb3RlOiBubyBhc3N1bXB0aW9ucyBzaG91bGQgYmUgbWFkZSBhYm91dCB0aGUgb2JqZWN0IGlkZW50aXR5IG9mIHRoZQotCSAqIHJlZ2lvbnMgcmV0dXJuZWQuIFB1dCBhbm90aGVyIHdheSwgZHVlIHRvIG1lbW9yeSB1c2Ugb3B0aW1pemF0aW9ucywKLQkgKiBldmVuIGlmIHRoZSB1bmRlcmx5aW5nIHRleHQgaGFzIG5vdCBjaGFuZ2VkLCB0aGUgcmVnaW9ucyBtYXkgb3IgbWF5IG5vdAotCSAqIGJlIHRoZSBzYW1lIG9uZXMgcmV0dXJuZWQgZnJvbSBvbmUgY2FsbCB0byB0aGUgbmV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZWdpb25zIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlJVGV4dFJlZ2lvbkxpc3QgZ2V0UmVnaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoaXMgcmVnaW9uLCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mCi0JICogdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGlzIHJlZ2lvbgotCSAqLwotCWludCBnZXRTdGFydE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCByZWxhdGl2ZSB0byB0aGUKLQkgKiBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgY29udGFpbmVkIHJlZ2lvbgotCSAqLwotCWludCBnZXRTdGFydE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbiwgbm90IGluY2x1ZGluZyB3aGl0ZSBzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IG9mIHRoaXMgcmVnaW9uLCBub3QgaW5jbHVkaW5nIHdoaXRlIHNwYWNlLgotCSAqLwotCVN0cmluZyBnZXRUZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCBub3QgaW5jbHVkaW5nIHdoaXRlIHNwYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24sIG5vdCBpbmNsdWRpbmcgd2hpdGUgc3BhY2UuCi0JICovCi0JU3RyaW5nIGdldFRleHQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHRleHQgb2YgdGhpcyByZWdpb24sIG5vdCBpbmNsdWRpbmcgd2hpdGUKLQkgKiBzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSB0ZXh0IG9mIHRoaXMgcmVnaW9uLCBub3QgaW5jbHVkaW5nIHdoaXRlCi0JICogICAgICAgICBzcGFjZS4KLQkgKi8KLQlpbnQgZ2V0VGV4dEVuZE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGUgdGV4dCBvZiB0aGUgY29udGFpbmVkIHJlZ2lvbiwgbm90Ci0JICogaW5jbHVkaW5nIHdoaXRlIHNwYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHRleHQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24sIG5vdAotCSAqICAgICAgICAgaW5jbHVkaW5nIHdoaXRlIHNwYWNlLgotCSAqLwotCWludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbik7Ci0KLQkvKioKLQkgKiBBc3NpZ25zIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5lZCBpbiB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZWRSZWdpb25zCi0JICovCi0Jdm9pZCBzZXRSZWdpb25zKElUZXh0UmVnaW9uTGlzdCBjb250YWluZWRSZWdpb25zKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NGNhODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0vKioKLSAqIElUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5zIG90aGVyIHJlZ2lvbnMsIGxpa2UgYSBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24KLSAqIGJ1dCBpcyBpdHNlbGYgYSByZWdpb24gaW4gYW4gSVRleHRSZWdpb25Db2xsZWN0aW9uLCBzbyBpdHMgInBhcmVudCIgcmVnaW9uCi0gKiBpcyBtYWludGFpbmVkLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGV4dFJlZ2lvbkNvbnRhaW5lciBleHRlbmRzIElUZXh0UmVnaW9uQ29sbGVjdGlvbiB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCByZWdpb24uCi0JICovCi0JSVRleHRSZWdpb25Db2xsZWN0aW9uIGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcGFyZW50IHJlZ2lvbi4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gdGhpcyByZWdpb24gaXMgY29udGFpbmVkIGluLgotCSAqLwotCXZvaWQgc2V0UGFyZW50KElUZXh0UmVnaW9uQ29sbGVjdGlvbiBwYXJlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTRkM2U4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogSVRleHRSZWdpb25MaXN0IGlzIHRvIHByb3ZpZGUgYSBsaXN0IG9mIHJlZ2lvbnMuIEl0IGNhbiBiZSB1c2VkIHNvIGNsaWVudHMKLSAqIGRvIG5vdCBuZWVkIHRvIGJlIGF3YXJlIG9mIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWdpb25MaXN0IHsKLQotCS8qKgotCSAqIEFkZHMgcmVnaW9uIHRvIHRoZSBsaXN0LgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHksIHdoaWxlIGxpc3QgaXMgYmVpbmcgY3JlYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZChJVGV4dFJlZ2lvbiByZWdpb24pOwotCi0JLyoqCi0JICogQWRkcyBuZXcgcmVnaW9ucyB0byB0aGUgbGlzdC4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LCB3aGlsZSBsaXN0IGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqIEBwYXJhbSBuZXdSZWdpb25zCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb250ZW50cyBvZiB0aGlzIGxpc3Qgd2VyZSBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5zZXJ0UG9zLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyk7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCByZWdpb25zIGZyb20gdGhlIGxpc3QuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seSwgd2hpbGUgbGlzdCBpcyBiZWluZyBjcmVhdGVkLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ2lvbiBhdCA8Y29kZT5pbmRleDwvY29kZT4sIHdoZXJlIDAgaXMgZmlyc3Qgb25lIGluCi0JICogdGhlIGxpc3QuIFRocm93cyBhbiA8Y29kZT5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb248L2NvZGU+IGlmCi0JICogbGlzdCBpcyBlbXB0eSwgb3IgaWYgaW5kZXggaXMgb3V0IG9mIHJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0KGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiA8Y29kZT5yZWdpb248L2NvZGU+IG9yIC0xIGlmIDxjb2RlPnJlZ2lvbjwvY29kZT4KLQkgKiBpcyBub3QgaW4gdGhlIGxpc3QuCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGluZGV4T2YoSVRleHRSZWdpb24gcmVnaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBsaXN0IGhhcyBubyByZWdpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBsaXN0IGhhcyBubyByZWdpb25zLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKTsKLQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgdGhpcyBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHRoaXMgbGlzdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHJlZ2lvbiBhdCBpbmRleC4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LCB3aGlsZSBsaXN0IGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIHJlbW92ZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgcmVnaW9uLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHksIHdoaWxlIGxpc3QgaXMgYmVpbmcgY3JlYXRlZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoSVRleHRSZWdpb24gcmVnaW9uKTsKLQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgcmVnaW9uTGlzdCBmcm9tIHRoaXMgbGlzdC4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LCB3aGlsZSBsaXN0IGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsKElUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKTsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgcmVnaW9ucyBpbiBhbiBhcnJheS4gTm8gYXNzdW1wdGlvbnMgc2hvdWxkIGJlCi0JICogbWFkZSBpZiB0aGUgcmVnaW9ucyBpbiB0aGUgYXJyYXkgYXJlIGNsb25lcyBhcmUgc2FtZSBpbnN0YW5jZSBvZgotCSAqIG9yaWdpbmFsIHJlZ2lvbi4KLQkgKiAKLQkgKiBJU1NVRTogZG8gd2UgbmVlZCB0byBzcGVjaWZ5IGlmIGNsb25lZCBjb3BpZXMgb3Igbm90PwotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmVnaW9ucy4KLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb25bXSB0b0FycmF5KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9CYXNpY1N0cnVjdHVyZWREb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0Jhc2ljU3RydWN0dXJlZERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYWZkNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0Jhc2ljU3RydWN0dXJlZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGluaXRpYWwgSURvY3VtZW50RXh0ZW5zaW9uNCBzdXBwb3J0IC0gIzEwMjgyMgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VlIGFsc28gIzIzOTExNSkKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKEludGFsaW8pIC0gYnVnIDMwMDQzNCAtIE1ha2UgaW5uZXIgY2xhc3NlcyBzdGF0aWMgd2hlcmUgcG9zc2libGUKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKEludGFsaW8pIC0gYnVnIDMwMDQ0MyAtIHNvbWUgY29uc3RhbnRzIGFyZW4ndCBzdGF0aWMgZmluYWwKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQYXJ0aXRpb25pbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdExpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUxpbmVUcmFja2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuQWJvdXRUb0JlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5TdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBUaGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2Ygc3RydWN0dXJlZCBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50IGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudCwgSURvY3VtZW50RXh0ZW5zaW9uLCBJRG9jdW1lbnRFeHRlbnNpb24zLCBJRG9jdW1lbnRFeHRlbnNpb240LCBDaGFyU2VxdWVuY2UsIElSZWdpb25Db21wYXJpYmxlIHsKLQotCS8qKgotCSAqIFRoaXMgVGhyZWFkTG9jYWwgY29uc3RydWN0IGlzIHVzZWQgc28gZWFjaCB0aHJlYWQgY2FuIG1haW50YWluIGl0cyBvbmx5Ci0JICogcG9pbnRlciB0byB0aGUgZG91YmxlIGxpbmtlZCBsaXN0IHRoYXQgbWFuYWdlcyB0aGUgZG9jdW1lbnRzIHJlZ2lvbnMuCi0JICogVGhlIG9ubHkgdGhpbmcgd2UgImdhdXJkIiBmb3IgaXMgdGhhdCBhIHByZXZpb3VzbHkgY2FjaGVkIHJlZ2lvbiBoYXMKLQkgKiBiZWVuIGRlbGV0ZWQuCi0JICogCi0JICogVGhlIG9iamVjdCB0aGF0IGlzIGtlcHQgaW4gdGhlIHRocmVhZCBsb2NhbCdzIG1hcCwgaXMganVzdCBhIHBvaW50ZXIgdG8KLQkgKiBhbiBhcnJheSBwb3NpdGlvbi4gVGhhdCdzIGJlY2F1c2UgdGhlIG9iamVjdCB0aGVyZSBuZWVkcyB0byBiZSAiZnJlZSIKLQkgKiBmcm9tIHJlZmVyZW5jZXMgdG8gb3RoZXIgb2JqZWN0cywgb3IgaXQgd2lsbCBub3QgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDdXJyZW50RG9jdW1lbnRSZWdpb25DYWNoZSB7Ci0JCS8vIEknbSBhc3N1bWluZyBmb3Igbm93IHRoZXJlIHdvdWxkIG5ldmVyIGJlIHNvIG1hbnkgdGhyZWFkcyB0aGF0Ci0JCS8vIHRoaXMgYXJyYXlMaXN0IG5lZWRzIHRvIGJlIGJvdW5kZWQsIG9yICdjbGVhbmVkIHVwJy4KLQkJLy8gdGhpcyBhc3N1bXB0aW9uIHNob3VsZCBiZSB0ZXN0ZWQgaW4gcHJhY3RpY2UgYW5kIGxvbmcgcnVubmluZwotCQkvLyBqb2JzIC0tIGZvdW5kIG5vdCB0byBiZSBhIGdvb2QgYXNzdW1wdGlvbi4gU2VlIGJlbG93LgotCQlwcml2YXRlIExpc3QgY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdCgpKTsKLQkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU0laRSA9IDUwOwotCi0KLQkJcHJpdmF0ZSBUaHJlYWRMb2NhbCB0aHJlYWRMb2NhbENhY2hlUG9zaXRpb24gPSBuZXcgVGhyZWFkTG9jYWwoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldCgpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJCWludCBwb3MgPSBnZXRUaHJlYWRMb2NhbFBvc2l0aW9uKCk7Ci0JCQl0cnkgewotCQkJCXJlZ2lvbiA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LmdldChwb3MpOwotCQkJfQotCQkJY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCS8vIGV2ZW4gdGhvdWdoIHRoZSBjYWNoZWRSZWdpb25Qb3NpdGlvbiBpcyBzeW5jaHJvbml6ZWQsCi0JCQkJLy8gdGhhdCBqdXN0IG1lYW5zIGVhY2ggYWNjZXNzIGlzIHN5bmNyb25pemVkLCBpdHMKLQkJCQkvLyBzdGlsbCBwb3NzaWJsZSBmb3IgYW5vdGhlciB0aHJlYWQgdG8gY2F1c2UgaXQgdG8KLQkJCQkvLyBiZSBjbGVhcmVkLCBhZnRlciB0aGlzIHRocmVhZCBnZXRzIGl0IHBvc2l0aW9uLgotCQkJCS8vIFNvLCBpZiB0aGF0IGhhcHBlbnMsIGFsbCB3ZSBjYW4gZG8gaXMgcmVzZXQgdG8gYmVnaW5uaW5nLgotCQkJCS8vIFRoaXMgc2hvdWxkIGJlIGV4dHJlbWVseSByYXJlIChpbiBvdGhlciB3b3JkcywgcHJvYmFibHkKLQkJCQkvLyBub3Qgd29ydGggdXNpbmcgc3luY2hyb25pemVkIGJsb2NrcwotCQkJCS8vIHRvIGFjY2VzcyBjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LgotCQkJCXJlaW5pdFRocmVhZExvY2FsUG9zaXRpb24oKTsKLQkJCQlyZXNldFRvSW5pdGlhbFN0YXRlKCk7Ci0JCQl9Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQlyZWdpb24gPSByZXNldFRvSW5pdGlhbFN0YXRlKCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkvLyByZWdpb24gbm90IG51bGwKLQkJCWlmIChyZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCQlyZWdpb24gPSByZXNldFRvSW5pdGlhbFN0YXRlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgZ2V0VGhyZWFkTG9jYWxQb3NpdGlvbigpIHsKLQkJCU9iamVjdCB0aHJlYWRMb2NhbE9iamVjdCA9IHRocmVhZExvY2FsQ2FjaGVQb3NpdGlvbi5nZXQoKTsKLQkJCWludCBwb3MgPSAtMTsKLQkJCWlmICh0aHJlYWRMb2NhbE9iamVjdCA9PSBudWxsKSB7Ci0KLQkJCQlwb3MgPSByZWluaXRUaHJlYWRMb2NhbFBvc2l0aW9uKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwb3MgPSAoKEludGVnZXIpIHRocmVhZExvY2FsT2JqZWN0KS5pbnRWYWx1ZSgpOwotCQkJfQotCQkJcmV0dXJuIHBvczsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIGludCByZWluaXRUaHJlYWRMb2NhbFBvc2l0aW9uKCkgewotCQkJSW50ZWdlciBwb3NpdGlvbjsKLQkJCWludCBwb3M7Ci0JCQkvLyBUT0RPX2Z1dHVyZTogdGhpbmsgb2YgYSBiZXR0ZXIgc29sdXRpb24gdGhhdCBkb2Vzbid0Ci0JCQkvLyByZXF1aXJlIHRoaXMga2x1ZGdlLiBUaGlzIGlzIGVzcGVjaWFsbHkgcmVxdWlyZWQgYmVjYXVzZQotCQkJLy8gc29tZSBpbmZyYXN0dXJlLCBzdWNoIGFzIHJlY29uY2lsZXIsIGFjdHVhbGx5IG51bGwgb3V0Ci0JCQkvLyB0aGVpciB0aHJlYWQgb2JqZWN0IGFuZCByZWNyZWF0ZSBpdCwgNTAwIG1zZWNzIGxhdGVyCi0JCQkvLyAoYXBwcm94aW1hdGVseSkuCi0JCQkvLyBOb3RlOiB0aGUgbGlrZWx5IHNvbHV0aW9uIGluIGZ1dHVyZSBpcyB0byBjbGVhciBhZnRlciBldmVyeQotCQkJLy8gaGVhdnkgdXNlIG9mIGdldENhY2hlZFJlZ2lvbiwgc3VjaCBhcyBpbiBjcmVhdGluZyBub2RlCi0JCQkvLyBsaXN0cywgb3IgcmVwYXJzaW5nIG9yIHBhcnRpb25pbmcuCi0JCQlpZiAoY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS5zaXplKCkgPiBNQVhfU0laRSkgewotCQkJCWNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuY2xlYXIoKTsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5IGNsZWFyZWQgYXQgc2l6ZSAiICsgTUFYX1NJWkUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJcG9zaXRpb24gPSBuZXcgSW50ZWdlcihjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LnNpemUoKSk7Ci0JCQl0aHJlYWRMb2NhbENhY2hlUG9zaXRpb24uc2V0KHBvc2l0aW9uKTsKLQkJCWNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuYWRkKHBvc2l0aW9uLmludFZhbHVlKCksIG51bGwpOwotCQkJcG9zID0gcG9zaXRpb24uaW50VmFsdWUoKTsKLQkJCXJldHVybiBwb3M7Ci0JCX0KLQotCQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzZXRUb0luaXRpYWxTdGF0ZSgpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uOwotCQkJcmVnaW9uID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCXNldChyZWdpb24pOwotCQkJcmV0dXJuIHJlZ2lvbjsKLQkJfQotCi0JCXZvaWQgc2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCQl0cnkgewotCQkJCWludCBwb3MgPSBnZXRUaHJlYWRMb2NhbFBvc2l0aW9uKCk7Ci0JCQkJY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS5zZXQocG9zLCByZWdpb24pOwotCQkJfQotCQkJY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCS8vIGV2ZW4gdGhvdWdoIHRoZSBjYWNoZWRSZWdpb25Qb3NpdGlvbiBpcyBzeW5jaHJvbml6ZWQsCi0JCQkJLy8gdGhhdCBqdXN0IG1lYW5zIGVhY2ggYWNjZXNzIGlzIHN5bmNyb25pemVkLCBpdHMKLQkJCQkvLyBzdGlsbCBwb3NzaWJsZSBmb3IgYW5vdGhlciB0aHJlYWQgdG8gY2F1c2UgaXQgdG8KLQkJCQkvLyBiZSBjbGVhcmVkLCBhZnRlciB0aGlzIHRocmVhZCBnZXRzIGl0IHBvc2l0aW9uLgotCQkJCS8vIFNvLCBpZiB0aGF0IGhhcHBlbnMsIGFsbCB3ZSBjYW4gZG8gaXMgcmVzZXQgdG8gYmVnaW5uaW5nLgotCQkJCS8vIFRoaXMgc2hvdWxkIGJlIGV4dHJlbWVseSByYXJlIChpbiBvdGhlciB3b3JkcywgcHJvYmFibHkKLQkJCQkvLyBub3Qgd29ydGggdXNpbmcgc3luY2hyb25pemVkIGJsb2NrcwotCQkJCS8vIHRvIGFjY2VzcyBjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LgotCQkJCXJlaW5pdFRocmVhZExvY2FsUG9zaXRpb24oKTsKLQkJCQlyZXNldFRvSW5pdGlhbFN0YXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIE51bGxEb2N1bWVudEV2ZW50IGlzIHVzZWQgdG8gY29tcGxldGUgdGhlICJhYm91dFRvQ2hhbmdlIiBhbmQKLQkgKiAiY2hhbmdlZCIgY3ljbGUsIHdoZW4gaW4gZmFjdCB0aGUgb3JpZ2luYWwgY2hhbmdlIGlzIG5vIGxvbmdlciB2YWxpZC4KLQkgKiBUaGUgb25seSBrbm93biAodmFsaWQpIGNhc2Ugb2YgdGhpcyBpcyB3aGVuIGEgbW9kZWwgcmUtaW5pdGlhbGl6ZSB0YWtlcwotCSAqIHBsYWNlLCB3aGljaCBjYXVzZXMgc2V0VGV4dCB0byBiZSBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZiBzb21lIHByZXZpb3VzCi0JICogY2hhbmdlLiBbVGhpcyBhcmNoaXRlY3R1cmUgd2lsbCBiZSBpbXByb3ZlZCBpbiBmdXR1cmVdLgotCSAqLwotCXB1YmxpYyBjbGFzcyBOdWxsRG9jdW1lbnRFdmVudCBleHRlbmRzIERvY3VtZW50RXZlbnQgewotCQlwdWJsaWMgTnVsbERvY3VtZW50RXZlbnQoKSB7Ci0JCQl0aGlzKEJhc2ljU3RydWN0dXJlZERvY3VtZW50LnRoaXMsIDAsIDAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJpdmF0ZSBOdWxsRG9jdW1lbnRFdmVudChJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQkJc3VwZXIoZG9jLCBvZmZzZXQsIGxlbmd0aCwgdGV4dCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUmVnaXN0ZXJlZFJlcGxhY2UgewotCQkvKiogVGhlIG93bmVyIG9mIHRoaXMgcmVwbGFjZSBvcGVyYXRpb24uICovCi0JCUlEb2N1bWVudExpc3RlbmVyIGZPd25lcjsKLQkJLyoqIFRoZSByZXBsYWNlIG9wZXJhdGlvbiAqLwotCQlJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgZlJlcGxhY2U7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgYnVuZGxlIG9iamVjdC4KLQkJICogCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBsaXN0ZW5lciBvd25pbmcgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uCi0JCSAqIEBwYXJhbSByZXBsYWNlCi0JCSAqICAgICAgICAgICAgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uCi0JCSAqLwotCQlSZWdpc3RlcmVkUmVwbGFjZShJRG9jdW1lbnRMaXN0ZW5lciBvd25lciwgSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlIHJlcGxhY2UpIHsKLQkJCWZPd25lciA9IG93bmVyOwotCQkJZlJlcGxhY2UgPSByZXBsYWNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhlc2UgY29udHJvbCB2YXJpYWJsZSBpc24ndCBtYXJrIGFzICdmaW5hbCcgc2luY2UgdGhlcmUncyBzb21lIHVuaXQKLQkgKiB0ZXN0cyB0aGF0IG1hbmlwdWxhdGUgaXQuIEZvciBmaW5hbCBwcm9kdWN0LCBpdCBzaG91bGQgYmUuCi0JICovCi0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIFVTRV9MT0NBTF9USFJFQUQgPSB0cnVlOwotCi0JLyoqCi0JICogcHVyZWx5IGZvciBkZWJ1Z2dpbmcvcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzIEluIHByYWN0aWNlLCB3b3VsZCBhbHdheXMKLQkgKiBiZSAndHJ1ZScuIChhbmQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBieSBjYWxsZWQgYnkgY2xpZW50cykuIEl0cyBub3QKLQkgKiAnZmluYWwnIG9yIHByaXZhdGUganVzdCBzbyBpdCBjYW4gYmUgdmFyaWVkIGR1cmluZwotCSAqIGRlYnVnZ2luZy9wZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBydW5zLgotCSAqIAotCSAqIEBwYXJhbSB1c2VfbG9jYWxfdGhyZWFkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFVTRV9MT0NBTF9USFJFQUQoZmluYWwgYm9vbGVhbiB1c2VfbG9jYWxfdGhyZWFkKSB7Ci0JCVVTRV9MT0NBTF9USFJFQUQgPSB1c2VfbG9jYWxfdGhyZWFkOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjYWNoZWREb2N1bWVudFJlZ2lvbjsKLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG87Ci0JcHJpdmF0ZSBib29sZWFuIGZBY2NlcHRQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZXMgPSB0cnVlOwotCXByaXZhdGUgQ3VycmVudERvY3VtZW50UmVnaW9uQ2FjaGUgZkN1cnJlbnREb2N1bWVudFJlZ2lvbkNhY2hlOwotCXByaXZhdGUgRG9jdW1lbnRFdmVudCBmRG9jdW1lbnRFdmVudDsKLQlwcml2YXRlIElEb2N1bWVudExpc3RlbmVyW10gZkRvY3VtZW50TGlzdGVuZXJzOwotCi0JLyoqCi0JICogVGhlIHJlZ2lzdGVyZWQgZG9jdW1lbnQgcGFydGl0aW9uZXJzLgotCSAqLwotCXByaXZhdGUgTWFwIGZEb2N1bWVudFBhcnRpdGlvbmVyczsKLQkvKiogVGhlIHJlZ2lzdGVyZWQgZG9jdW1lbnQgcGFydGl0aW9uaW5nIGxpc3RlbmVycyAqLwotCXByaXZhdGUgTGlzdCBmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0RG9jdW1lbnRSZWdpb247Ci0JcHJpdmF0ZSBSZWdpb25QYXJzZXIgZlBhcnNlcjsKLQlwcml2YXRlIEdlbmVyaWNQb3NpdGlvbk1hbmFnZXIgZlBvc2l0aW9uTWFuYWdlcjsKLQlwcml2YXRlIExpc3QgZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzOwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXJbXSBmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyczsKLQlwcml2YXRlIGludCBmUmVlbnRyYW5jZUNvdW50ID0gMDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIGZSZVBhcnNlcjsKLQlwcml2YXRlIGludCBmU3RvcHBlZENvdW50ID0gMDsKLQotCXByaXZhdGUgSVRleHRTdG9yZSBmU3RvcmU7Ci0JcHJpdmF0ZSBPYmplY3RbXSBmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyczsKLQlwcml2YXRlIE9iamVjdFtdIGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzOwotCXByaXZhdGUgT2JqZWN0W10gZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBMaXN0IGZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZlRyYWNrZXI7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBmVW5kb01hbmFnZXI7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3REb2N1bWVudFJlZ2lvbjsKLQotCXByaXZhdGUgYnl0ZVtdIGxpc3RlbmVyTG9jayA9IG5ldyBieXRlWzBdOwotCXByaXZhdGUgTnVsbERvY3VtZW50RXZlbnQgTlVMTF9ET0NVTUVOVF9FVkVOVDsKLQotCS8qKgotCSAqIFRoZW9yZXRpY2FsbHksIGEgZG9jdW1lbnQgY2FuIGNvbnRhaW4gbWl4ZWQgbGluZSBkZWxpbWl0ZXJzLCBidXQgdGhlCi0JICogdXNlcidzIHByZWZlcmVuY2UgaXMgdXN1YWxseSB0byBiZSBpbnRlcm5hbGx5IGNvbnNpc3RlbnQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZkluaXRpYWxMaW5lRGVsaW1pdGVyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSA9ICJfUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUllfIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEN1cnJlbnQgcmV3cml0ZSBzZXNzaW9uLCBvciBub25lIGlmIG5vdCBwcmVzZW50bHkgcmV3cml0aW5nLgotCSAqLwotCXByaXZhdGUgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBmQWN0aXZlUmV3cml0ZVNlc3Npb247Ci0JLyoqCi0JICogTGFzdCBtb2RpZmljYXRpb24gc3RhbXAsIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBvbiBjaGFuZ2UuCi0JICovCi0JcHJpdmF0ZSBsb25nIGZNb2RpZmljYXRpb25TdGFtcDsKLQkvKioKLQkgKiBLZWVwcyB0cmFjayBvZiBuZXh0IG1vZGlmaWNhdGlvbiBzdGFtcC4KLQkgKi8KLQlwcml2YXRlIGxvbmcgZk5leHRNb2RpZmljYXRpb25TdGFtcD0gSURvY3VtZW50RXh0ZW5zaW9uNC5VTktOT1dOX01PRElGSUNBVElPTl9TVEFNUDsKLQkvKioKLQkgKiBkZWJ1ZyB2YXJpYWJsZSBvbmx5Ci0JICogCi0JICogQHBhcmFtIHBhcnNlcgotCSAqLwotCXByaXZhdGUgbG9uZyBzdGFydFN0cmVhbVRpbWU7Ci0JLyoqCi0JICogZGVidWcgdmFyaWFibGUgb25seQotCSAqIAotCSAqIEBwYXJhbSBwYXJzZXIKLQkgKi8KLQlwcml2YXRlIGxvbmcgc3RhcnRUaW1lOwotCi0JcHVibGljIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KCkgewotCQlzdXBlcigpOwotCQlmQ3VycmVudERvY3VtZW50UmVnaW9uQ2FjaGUgPSBuZXcgQ3VycmVudERvY3VtZW50UmVnaW9uQ2FjaGUoKTsKLQkJc2V0VGV4dFN0b3JlKG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUoNTAsIDMwMCkpOwotCQlzZXRMaW5lVHJhY2tlcihuZXcgRGVmYXVsdExpbmVUcmFja2VyKCkpOwotCQlOVUxMX0RPQ1VNRU5UX0VWRU5UID0gbmV3IE51bGxEb2N1bWVudEV2ZW50KCk7Ci0KLQkJaW50ZXJuYWxfYWRkUG9zaXRpb25DYXRlZ29yeShSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSk7Ci0JCWludGVybmFsX2FkZFBvc2l0aW9uVXBkYXRlcihuZXcgRGVsZXRlRXF1YWxQb3NpdGlvblVwZGF0ZXIoUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlkpKTsKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIHByaW1hcnkgd2F5IHRvIGdldCBhIG5ldyBzdHJ1Y3R1cmVkRG9jdW1lbnQuIEl0cyBiZXN0IHRvCi0JICogdXNlIHRoZSBmYWN0b3J5IG1ldGhvZHMgaW4gTW9kZWxNYW5nZXIgdG8gY3JlYXRlIGEgbmV3Ci0JICogSVN0cnVjdHVyZWREb2N1bWVudCwgc2luY2UgaXQgd2lsbCBnZXQgYW5kIGluaXRpYWxpemUgdGhlIHBhcnNlcgotCSAqIGFjY29yZGluZyB0byB0aGUgZGVzaXJlZCBjb250ZW50IHR5cGUuCi0JICovCi0JcHVibGljIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KFJlZ2lvblBhcnNlciBwYXJzZXIpIHsKLQkJdGhpcygpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHBhcnNlciwgIlByb2dyYW0gRXJyb3I6IElTdHJ1Y3R1cmVkRG9jdW1lbnQgY2FuIG5vdCBiZSBjcmVhdGVkIHdpdGggbnVsbCBwYXJzZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBnbyB0aHJvdWdoIHNldHRlciBpbiBjYXNlIHRoZXJlIGlzIHNpZGUgZWZmZWN0cwotCQlpbnRlcm5hbF9zZXRQYXJzZXIocGFyc2VyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2NsZWFyRG9jdW1lbnRFdmVudCgpIHsKLQkJLy8gbm8gaGFyZCBhbmQgZmFzdCByZXF1aXJlbWVudCB0byBudWxsIG91dCAuLi4ganVzdCBzZWVtcyBsaWtlCi0JCS8vIGEgZ29vZCBpZGVhLCBzaW5jZSB3ZSBhcmUgZG9uZSB3aXRoIGl0LgotCQlmRG9jdW1lbnRFdmVudCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlKE9iamVjdFtdIGxpc3RlbmVycykgewotCQkvLyBtb3N0IERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZCBsaXN0ZW5lcnMgZG8gbm90IGFudGljaXBhdGUKLQkJLy8gRG9jdW1lbnRFdmVudCA9PSBudWxsLiBTbyBtYWtlIHN1cmUgZG9jdW1lbnRFdmVudCBpcyBub3QKLQkJLy8gbnVsbC4gKHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgeWV0IGl0IGRvZXMgc29tZXRpbWVzKQotCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RXZlbnQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQkJfQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCS8vIE5vdGU6IHRoZSBkb2NFdmVudCBpcyBjcmVhdGVkIGluIHJlcGxhY2VUZXh0IEFQSQotCQkJLy8gZmlyZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJKChJRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkuZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKGZEb2N1bWVudEV2ZW50KTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCX0KLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJbG9uZyBzdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgSVN0cnVjdHVyZWREb2N1bWVudDo6ZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50LiBUaW1lIHdhcyAiICsgKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSArICIgbXNlY3MgdG8gZmlyZSBOZXdNb2RlbEV2ZW50IHRvIGluc3RhbmNlIG9mICIgKyBob2xkTGlzdGVuZXJzW2ldLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlEb2N1bWVudFBhcnRpdGlvbmVyc0Fib3V0VG9DaGFuZ2UoRG9jdW1lbnRFdmVudCBkb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZSA9IGZEb2N1bWVudFBhcnRpdGlvbmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSURvY3VtZW50UGFydGl0aW9uZXIgcCA9IChJRG9jdW1lbnRQYXJ0aXRpb25lcikgZS5uZXh0KCk7Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCXAuZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKGRvY3VtZW50RXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlRG9jdW1lbnRDaGFuZ2VkKE9iamVjdFtdIGxpc3RlbmVycywgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCS8vIE5PVEU6IGRvY3VtZW50IGV2ZW50IGlzIGNyZWF0ZWQgaW4gcmVwbGFjZSBUZXh0IEFQSSBhbmQgc2V0VGV4dAotCQkJLy8gQVBJCi0JCQkvLyBub3cgZmlyZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkvLyBOb3RlczogZkRvY3VtZW50RXZlbnQgY2FuIGJlICJzdWRkZW5seSIgbnVsbCwgaWYgb25lIG9mCi0JCQkJCS8vIHRoZQotCQkJCQkvLyBwcmV2aW91cyBjaGFuZ2VzCi0JCQkJCS8vIGNhdXNlZCBhICJzZXRUZXh0IiB0byBiZSBjYWxsZWQuIFRoZSBvbmx5IGtub3duIGNhc2Ugb2YKLQkJCQkJLy8gdGhpcwotCQkJCQkvLyBpcyBhIG1vZGVsIHJlc2V0Ci0JCQkJCS8vIGR1ZSB0byBwYWdlIGRpcmVjdGl2ZSBjaGFuZ2luZy4gRXZlbnR1YWxseSB3ZSBzaG91bGQKLQkJCQkJLy8gY2hhbmdlCi0JCQkJCS8vIGFyY2hldGVjdHVyZSB0byBoYXZlCi0JCQkJCS8vIGV2ZW50IHF1ZSBhbmQgYmUgYWJsZSB0byAiY2FuY2VsIiBwZW5kaW5nIGV2ZW50cywgYnV0Ci0JCQkJCS8vIGZvcgotCQkJCQkvLyBub3csIHdlJ2xsIGp1c3QgcGFzcyBhCi0JCQkJCS8vIE51bGxEb2N1bWVudEV2ZW50LiBCeSB0aGUgd2F5LCBpdCBpcyBpbXBvcnRhbnQgdG8gc2VuZAotCQkJCQkvLyBzb21ldGhpbmcsIHNpbmNlIGNsaWVudHMgbWlnaHQKLQkJCQkJLy8gaGF2ZSBpbmRldGVybWluYW50IHN0YXRlIGR1ZSB0byAiYWJvdXRUb0NoYW5nZSIgYmVpbmcKLQkJCQkJLy8gc2VudAotCQkJCQkvLyBlYXJsaWVyLgotCQkJCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJCQkJKChJRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkuZG9jdW1lbnRDaGFuZ2VkKE5VTExfRE9DVU1FTlRfRVZFTlQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJKChJRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkuZG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudEV2ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzRG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZG9jdW1lbnRFdmVudCkgewotCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBmRG9jdW1lbnRQYXJ0aXRpb25lcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCUlEb2N1bWVudFBhcnRpdGlvbmVyIHAgPSAoSURvY3VtZW50UGFydGl0aW9uZXIpIGUubmV4dCgpOwotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQlpZiAocCBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uKSB7Ci0JCQkJCQkvLyBJUmVnaW9uIGNoYW5nZWRQYXJ0aW9uID0KLQkJCQkJCSgoSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24pIHApLmRvY3VtZW50Q2hhbmdlZDIoZG9jdW1lbnRFdmVudCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwLmRvY3VtZW50Q2hhbmdlZChkb2N1bWVudEV2ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIE5vQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubm9DaGFuZ2UoZXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlRXZlbnQoT2JqZWN0W10gbGlzdGVuZXJzLCBSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkucmVnaW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJKChJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLnJlZ2lvbnNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJKChJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm5vZGVzUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZShPYmplY3RbXSBsaXN0ZW5lcnMpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQkvLyBOb3RlOiB0aGUgZG9jRXZlbnQgaXMgY3JlYXRlZCBpbiByZXBsYWNlVGV4dCBBUEkKLQkJCS8vIGZpcmUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCS8vIG5vdGljZSB0aGUgQWJvdXRUb0JlQ2hhbmdlZEV2ZW50IGlzIGNyZWF0ZWQgZnJvbSB0aGUKLQkJCQkJLy8gRG9jdW1lbnRFdmVudCwgc2luY2UgaXQgaXMgKG5lYXJseSkKLQkJCQkJLy8gdGhlIHNhbWUgaW5mb3JtYXRpb24uID9XaGF0IHRvIGRvIGFib3V0Ci0JCQkJCS8vIG9yaWdpbmFsUmVxdWVzdGVyPwotCQkJCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZkRvY3VtZW50RXZlbnQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQkJCQkJfQotCQkJCQlBYm91dFRvQmVDaGFuZ2VkRXZlbnQgYWJvdXRUb0JlQ2hhbmdlZEV2ZW50ID0gbmV3IEFib3V0VG9CZUNoYW5nZWRFdmVudCh0aGlzLCBudWxsLCBmRG9jdW1lbnRFdmVudC5nZXRUZXh0KCksIGZEb2N1bWVudEV2ZW50LmdldE9mZnNldCgpLCBmRG9jdW1lbnRFdmVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlIGFkZExpc3RuZXJzIHJlcXVpcmVzIGEKLQkJCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyCi0JCQkJCSgoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbEFib3V0VG9CZUNoYW5nZWQoYWJvdXRUb0JlQ2hhbmdlZEV2ZW50KTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCX0KLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJbG9uZyBzdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgSVN0cnVjdHVyZWREb2N1bWVudDo6ZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50LiBUaW1lIHdhcyAiICsgKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSArICIgbXNlY3MgdG8gZmlyZSBOZXdNb2RlbEV2ZW50IHRvIGluc3RhbmNlIG9mICIgKyBob2xkTGlzdGVuZXJzW2ldLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjcXVpcmVMb2NrKCkgewotCQkvLyBkbyBub3RoaW5nIGhlcmUgaW4gc3VwZXIgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBhZGRNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZwotCQkJLy8gKGFuZCBpZiBpdCBpcywgcHJpbnQgYSB3YXJuaW5nIHRvIGFpZCBkZWJ1Z2dpbmcsIGlmIG5lZWRlZCkKLQkJCWlmICghVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQlpbnQgb2xkU2l6ZSA9IDA7Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUgc3VyZSwgZm9yCi0JCQkJCS8vIGZpcnN0Ci0JCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCQlvbGRTaXplID0gZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCX0KLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBvbGRTaXplKTsKLQkJCQl9Ci0JCQkJLy8gYWRkIGxpc3RlbmVyIHRvIGxhc3QgcG9zaXRpb24KLQkJCQluZXdMaXN0ZW5lcnNbbmV3U2l6ZSAtIDFdID0gbGlzdGVuZXI7Ci0JCQkJLy8KLQkJCQkvLyBub3cgc3dpdGNoIG5ldyBmb3Igb2xkCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0bmVycyBhbmQgTW9kZWxDaGFnbmVkTGlzdGVuZXJzIGFyZSB2ZXJ5Ci0JICogc2ltaWxhci4gVGhleSBib3RoIHJlY2VpdmUgaWRlbnRpY2FsIGV2ZW50cy4gVGhlIGRpZmZlcmVuY2UgaXMgdGhlCi0JICogdGltaW5nLiBUaGUgInB1cmUiIFN0cnVjdHVyZWREb2N1bWVudExpc3RuZXJzIGFyZSBub3RpZmllZCBhZnRlciB0aGUKLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZCwgYnV0IGJlZm9yZSBvdGhlciwgcmVsYXRlZCBtb2RlbHMKLQkgKiBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgc3VjaCBhcyB0aGUgU3RydWN0dXJhbCBNb2RlbC4gVGhlIFN0cnVjdHVyYWwKLQkgKiBtb2RlbCBpcyBpbiBmYWN0IGl0c2VsZiBhICJwdXJlIiBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0bmVyLiBUaGUKLQkgKiBNb2RlbENoYW5nZWRMaXN0ZW5lcnMgY2FuIHJlc3QgYXNzdXJlZCB0aGF0IGFsbCBtb2RlbHMgYW5kIGRhdGEgaGF2ZQotCSAqIGJlZW4gdXBkYXRlZCBmcm9tIHRoZSBjaGFuZ2UgYnkgdGhlIHRpZW0gdGhleSBhcmUgbm90aWZpZWQuIFRoaXMgaXMKLQkgKiBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgdGhlIHRleHQgd2lkZ2V0LCBmb3IgZXhhbXBsZSwgd2hpY2ggbWF5IHJlbHkKLQkgKiBvbiBib3RoIHN0cnVjdHVyZWREb2N1bWVudCBhbmQgc3RydWN0dXJhbCBtb2RlbCBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJU3RydWN0dXJlZERvY3VtZW50OjphZGRNb2RlbENoYW5nZWRMaXN0ZW5lci4gUmVxdWVzdCB0byBhZGQgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gc3RydWN0dXJlZERvY3VtZW50LiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZwotCQkJLy8gKGFuZCBpZiBpdCBpcywgcHJpbnQgYSB3YXJuaW5nIHRvIGFpZCBkZWJ1Z2dpbmcsIGlmIG5lZWRlZCkKLQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJU3RydWN0dXJlZERvY3VtZW50OjphZGRNb2RlbENoYW5nZWRMaXN0ZW5lci4gbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiB3YXMgYWRkZWRlZCBtb3JlIHRoYW4gb25jZS4gIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6YWRkTW9kZWxDaGFuZ2VkTGlzdGVuZXIuIEFkZGluZyBhbiBpbnN0YW5jZSBvZiAiICsgbGlzdGVuZXIuZ2V0Q2xhc3MoKSArICIgYXMgYSBsaXN0ZW5lciBvbiBzdHJ1Y3R1cmVkRG9jdW1lbnQuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWludCBvbGRTaXplID0gMDsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJfQotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLwotCQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCQkvLwotCQkJCS8vIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZCwKLQkJCQkvLyBzZW5kIHRoZSBuZXcgbW9kZWwgZXZlbnQgdG8gdGhhdCBvbmUgcGFydGljdWxhciBsaXN0ZW5lciwKLQkJCQkvLyBzbyBpdAotCQkJCS8vIGNhbiBpbml0aWFsaXplIGl0c2VsZiB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb2RlbAotCQkJCS8vIGxpc3RlbmVyLm5ld01vZGVsKG5ldyBOZXdNb2RlbEV2ZW50KHRoaXMsIGxpc3RlbmVyKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6YWRkU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIuIFJlcXVlc3QgdG8gYWRkIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHN0cnVjdHVyZWREb2N1bWVudC4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIG1ha2Ugc3VyZSBsaXN0ZW5lciBpcyBub3QgYWxyZWFkeSBpbiBsaXN0ZW5pbmcKLQkJCS8vIChhbmQgaWYgaXQgaXMsIHByaW50IGEgd2FybmluZyB0byBhaWQgZGVidWdnaW5nLCBpZiBuZWVkZWQpCi0JCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmFkZFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLiBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHdhcyBhZGRlZGVkIG1vcmUgdGhhbiBvbmNlLiAiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJU3RydWN0dXJlZERvY3VtZW50OjphZGRTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lci4gQWRkaW5nIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHN0cnVjdHVyZWREb2N1bWVudC4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaW50IG9sZFNpemUgPSAwOwotCQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCX0KLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLwotCQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJLy8KLQkJCQkvLyB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQsCi0JCQkJLy8gc2VuZCB0aGUgbmV3IG1vZGVsIGV2ZW50IHRvIHRoYXQgb25lIHBhcnRpY3VsYXIgbGlzdGVuZXIsCi0JCQkJLy8gc28gaXQKLQkJCQkvLyBjYW4gaW5pdGlhbGl6ZSBpdHNlbGYgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW9kZWwKLQkJCQkvLyBsaXN0ZW5lci5uZXdNb2RlbChuZXcgTmV3TW9kZWxFdmVudCh0aGlzLCBsaXN0ZW5lcikpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogV2UgbWFuYWdlIG91ciBvd24gZG9jdW1lbnQgbGlzdG5lcnMsIGluc3RlYWQgb2YgZGVsZWdhdGluZyB0byBvdXIKLQkgKiBwYXJlbnREb2N1bWVudCwgc28gd2UgY2FuIGZpcmUgYXQgdmVyeSBlbmQgKGFuZCBub3Qgd2hlbiB0aGUKLQkgKiBwYXJlbnREb2N1bWVudCBjaGFuZ2VzKS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBsaXN0ZW5lciBpcyBub3QgYWxyZWFkeSBpbiBsaXN0ZW5pbmcKLQkJCS8vIChhbmQgaWYgaXQgaXMsIHByaW50IGEgd2FybmluZyB0byBhaWQgZGVidWdnaW5nLCBpZiBuZWVkZWQpCi0JCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmRG9jdW1lbnRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWludCBvbGRTaXplID0gMDsKLQkJCQlpZiAoZkRvY3VtZW50TGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUgc3VyZSwgZm9yCi0JCQkJCS8vIGZpcnN0Ci0JCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCQlvbGRTaXplID0gZkRvY3VtZW50TGlzdGVuZXJzLmxlbmd0aDsKLQkJCQl9Ci0JCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCQlJRG9jdW1lbnRMaXN0ZW5lcltdIG5ld0xpc3RlbmVycyA9IG51bGw7Ci0JCQkJbmV3TGlzdGVuZXJzID0gbmV3IElEb2N1bWVudExpc3RlbmVyW25ld1NpemVdOwotCQkJCWlmIChmRG9jdW1lbnRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZEb2N1bWVudExpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBvbGRTaXplKTsKLQkJCQl9Ci0JCQkJLy8gYWRkIGxpc3RlbmVyIHRvIGxhc3QgcG9zaXRpb24KLQkJCQluZXdMaXN0ZW5lcnNbbmV3U2l6ZSAtIDFdID0gbGlzdGVuZXI7Ci0JCQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQkJCWZEb2N1bWVudExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNhZGREb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIpCi0JICogCi0JICogUmVnaXN0ZXJzIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcgbGlzdGVuZXIgd2l0aCB0aGUgZG9jdW1lbnQuIEFmdGVyCi0JICogcmVnaXN0cmF0aW9uIHRoZSBJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBpcyBpbmZvcm1lZCBhYm91dCBlYWNoCi0JICogcGFydGl0aW9uIGNoYW5nZSBjYXVzZSBieSBhIGRvY3VtZW50IG1hbmlwdWxhdGlvbi4gSWYgYSBkb2N1bWVudAotCSAqIHBhcnRpdGlvbmluZyBsaXN0ZW5lciBpcyBhbHNvIGEgZG9jdW1lbnQgbGlzdGVuZXIsIHRoZSBmb2xsb3dpbmcKLQkgKiBub3RpZmljYXRpb24gc2VxdWVuY2UgaXMgZ3VhcmFudGVlZCBpZiBhIGRvY3VtZW50IG1hbmlwdWxhdGlvbiBjaGFuZ2VzCi0JICogdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZzogMSkKLQkgKiBsaXN0ZW5lci5kb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCk7IDIpCi0JICogbGlzdGVuZXIuZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKCk7IDMpCi0JICogbGlzdGVuZXIuZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQpOyBJZiB0aGUgbGlzdGVuZXIgaXMgYWxyZWFkeQotCSAqIHJlZ2lzdGVyZWQgbm90aGluZyBoYXBwZW5zLgotCSAqIAotCSAqIEBzZWUgSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIKLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIoSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJQXNzZXJ0LmlzTm90TnVsbChsaXN0ZW5lcik7Ci0JCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCQlmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJfQotCQkJaWYgKCFmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQotCQkJCWZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgcG9zaXRpb24gdG8gdGhlIGRvY3VtZW50J3MgZGVmYXVsdCBwb3NpdGlvbiBjYXRlZ29yeS4gVGhlCi0JICogZGVmYXVsdCBjYXRlZ29yeSBtdXN0IGJlIHNwZWNpZmllZCBieSB0aGUgaW1wbGVtZW50ZXIuIEEgcG9zaXRpb24gdGhhdAotCSAqIGhhcyBiZWVuIGFkZGVkIHRvIGEgcG9zaXRpb24gY2F0ZWdvcnkgaXMgdXBkYXRlZCBhdCBlYWNoIGNoYW5nZSBhcHBsaWVkCi0JICogdG8gdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBwb3NpdGlvbiBpcyBub3QgYSB2YWxpZCByYW5nZSBpbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkuYWRkUG9zaXRpb24ocG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2FkZFBvc2l0aW9uCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHJhbmdlIGluIHRoZSBkb2N1bWVudAotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSBjYXRlZ29yeSBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkuYWRkUG9zaXRpb24oY2F0ZWdvcnksIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNhZGRQb3NpdGlvbkNhdGVnb3J5Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaW50ZXJuYWxfYWRkUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjYWRkUG9zaXRpb25VcGRhdGVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQlpbnRlcm5hbF9hZGRQb3NpdGlvblVwZGF0ZXIodXBkYXRlcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgbGlzdGVuZXIgYXMgb25lIHdoaWNoIGlzIG5vdGlmaWVkIGJlZm9yZSB0aG9zZQotCSAqIGRvY3VtZW50IGxpc3RlbmVycyBhZGRlZCB3aXRoIDxjb2RlPmFkZERvY3VtZW50TGlzdGVuZXI8L2NvZGU+IGFyZQotCSAqIG5vdGlmaWVkLiBJZiB0aGUgZ2l2ZW4gbGlzdGVuZXIgaXMgYWxzbyByZWdpc3RlcmVkIHVzaW5nCi0JICogPGNvZGU+YWRkRG9jdW1lbnRMaXN0ZW5lcjwvY29kZT4gaXQgd2lsbCBiZSBub3RpZmllZCB0d2ljZS4gSWYgdGhlCi0JICogbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIG5vdGhpbmcgaGFwcGVucy4KLQkgKiA8cD4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgZm9yIHB1YmxpYyB1c2UsIGl0IG1heSBvbmx5IGJlIGNhbGxlZCBieQotCSAqIGltcGxlbWVudGVycyBvZiA8Y29kZT5JRG9jdW1lbnRBZGFwdGVyPC9jb2RlPiBhbmQgb25seSBpZiB0aG9zZQotCSAqIGltcGxlbWVudGVycyBuZWVkIHRvIGltcGxlbWVudCA8Y29kZT5JRG9jdW1lbnRMaXN0ZW5lcjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50QWRhcHRlcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkIGFzIHByZW5vdGlmaWVkIGRvY3VtZW50IGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGRvY3VtZW50QWRhcHRlcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCWludCBwcmV2aW91c1NpemUgPSBmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJSURvY3VtZW50TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgSURvY3VtZW50TGlzdGVuZXJbcHJldmlvdXNTaXplICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgMCwgbGlzdGVuZXJzLCAwLCBwcmV2aW91c1NpemUpOwotCQkJCWxpc3RlbmVyc1twcmV2aW91c1NpemVdID0gZG9jdW1lbnRBZGFwdGVyOwotCQkJCWZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMgPSBuZXcgSURvY3VtZW50TGlzdGVuZXJbMV07Ci0JCQkJZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnNbMF0gPSBkb2N1bWVudEFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjY2hhckF0KGludCkKLQkgKi8KLQlwdWJsaWMgY2hhciBjaGFyQXQoaW50IGFyZzApIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRDaGFyKDApOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBBUEkgcmVtb3ZlcyBhbGwgcmVhZCBvbmx5IHBvc2l0aW9ucywgYXMgc2hvdWxkIGJlIGRvbmUKLQkgKiB3ZSAnc2V0VGV4dCcgaXMgY2FsbGVkLiBOb3RlOiBhbiBhbHRlcm5hdGl2ZSBhbGdvcml0aG0gbWF5IHNpbXBseQotCSAqIHJlbW92ZSB0aGUgY2F0ZWdvcnkgKGFuZCBpdCB3b3VsZCBnZXQgYWRkZWQgYmFjayBpbiBsYXRlciwgaWYvd2hlbgotCSAqIHJlYWRvbmx5IHJlZ2lvbnMgYWRkZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyUmVhZE9ubHkoKSB7Ci0JCVBvc2l0aW9uW10gcG9zaXRpb25zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBvc2l0aW9ucyA9IGdldFBvc2l0aW9ucyhSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvZ3JhbSBlcnJvcjogc2hvdWxkIG5ldmVyIG9jY3VyIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJUG9zaXRpb24gcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07Ci0JCQkvLyBub3RlIHdlIGRvbid0IGZpcmUgdGhlICJhYm91dCB0byBjaGFuZ2UiIG9yICJjaGFuZ2VkIiBldmVudHMsCi0JCQkvLyBzaW5jZSBwcmVzdW1hYmx5LCB0ZXh0IGlzIGFsbCBnb2luZyBhd2F5IGFuZCBiZWluZyByZXBsYWNlZAotCQkJLy8gYW55d2F5LgotCQkJcG9zaXRpb24uZGVsZXRlKCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNsZWFyUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIFRPRE8gRFcgSSBzdGlsbCBuZWVkIHRvIGltcGxlbWVudCBzbWFydGVyIGFsZ29yaXRobSB0aGF0Ci0JCS8vIGFkdXN0IGV4aXN0aW5nIFJPIHJlZ2lvbnMsIGlmIG5lZWRlZC4gRm9yIG5vdywgSSdsbCBqdXN0Ci0JCS8vIHJlbW92ZSBhbnkgdGhhdCBvdmVybGFwLgotCQl0cnkgewotCQkJUG9zaXRpb25bXSBwb3NpdGlvbnMgPSBnZXRQb3NpdGlvbnMoUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlQb3NpdGlvbiBwb3NpdGlvbiA9IHBvc2l0aW9uc1tpXTsKLQkJCQlpZiAocG9zaXRpb24ub3ZlcmxhcHNXaXRoKHN0YXJ0T2Zmc2V0LCBsZW5ndGgpKSB7Ci0JCQkJCVN0cmluZyBlZmZlY3RlZFRleHQgPSB0aGlzLmdldChzdGFydE9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJLy8gZkRvY3VtZW50RXZlbnQgPSBuZXcgRG9jdW1lbnRFdmVudCh0aGlzLCBzdGFydE9mZnNldCwKLQkJCQkJLy8gbGVuZ3RoLCBlZmZlY3RlZFRleHQpOwotCQkJCQlmaXJlUmVhZE9ubHlBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JCQkJCXBvc2l0aW9uLmRlbGV0ZSgpOwotCQkJCQlOb0NoYW5nZUV2ZW50IG5vQ2hhbmdlRXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudCh0aGlzLCBudWxsLCBlZmZlY3RlZFRleHQsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCQkJCQlub0NoYW5nZUV2ZW50LnJlYXNvbiA9IE5vQ2hhbmdlRXZlbnQuUkVBRF9PTkxZX1NUQVRFX0NIQU5HRTsKLQkJCQkJZmlyZVJlYWRPbmx5U3RydWN0dXJlZERvY3VtZW50RXZlbnQobm9DaGFuZ2VFdmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGp1c3QgbWVhbnMgbm8gcmVhZG9ubHkgcmVnaW9ucyBiZWVuIGRlZmluZWQgeWV0Ci0JCQkvLyBzbyBub3RoaW5nIHRvIGRvLgotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGluZGV4IGF0IHdoaWNoIGEgPGNvZGU+UG9zaXRpb248L2NvZGU+IHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG9mZnNldCB3b3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBnaXZlbiBjYXRlZ29yeS4gQXMgdGhlCi0JICogb3JkZXJpbmcgaW5zaWRlIGEgY2F0ZWdvcnkgb25seSBkZXBlbmRzIG9uIHRoZSBvZmZzZXQsIHRoZSBpbmRleCBtdXN0Ci0JICogYmUgY2hvb3NlbiB0byBiZSB0aGUgZmlyc3Qgb2YgYWxsIHBvc2l0aW9ucyB3aXRoIHRoZSBzYW1lIG9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIHRoZSBjYXRlZ29yeSBpbiB3aGljaCB3b3VsZCBiZSBhZGRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBvZmZzZXQgdG8gYmUgY29uc2lkZXJlZAotCSAqIEByZXR1cm4gdGhlIGluZGV4IGludG8gdGhlIGNhdGVnb3J5Ci0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIG9mZnNldCBpcyBpbnZhbGlkIGluIHRoaXMgZG9jdW1lbnQKLQkgKiBAZXhjZXB0aW9uIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBjYXRlZ29yeSBpcyB1bmRlZmluZWQgaW4gdGhpcyBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBpbnQgY29tcHV0ZUluZGV4SW5DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnksIGludCBvZmZzZXQpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0UG9zaXRpb25NYW5hZ2VyKCkuY29tcHV0ZUluZGV4SW5DYXRlZ29yeShjYXRlZ29yeSwgb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBnaXZlbiB0ZXh0LiBGb3IgYSBnaXZlbiBpbXBsZW1lbnRlcgotCSAqIG9mIHRoaXMgaW50ZXJmYWNlIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNhbWUgcmVzdWx0IGFzCi0JICogPGNvZGU+c2V0KHRleHQpOyBnZXROdW1iZXJPZkxpbmVzKCk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB3aG9zZSBudW1iZXIgb2YgbGluZXMgc2hvdWxkIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBnaXZlbiB0ZXh0Ci0JICovCi0JcHVibGljIGludCBjb21wdXRlTnVtYmVyT2ZMaW5lcyhTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmNvbXB1dGVOdW1iZXJPZkxpbmVzKHRleHQpOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBwYXJ0aXRpb25pbmcgb2YgdGhlIGdpdmVuIGRvY3VtZW50IHJhbmdlIHVzaW5nIHRoZQotCSAqIGRvY3VtZW50J3MgcGFydGl0aW9uZXIuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IG9mZnNldCBhdCB3aGljaCB0aGUgcmFuZ2Ugc3RhcnRzCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgcmFuZ2UKLQkgKiBAcmV0dXJuIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmFuZ2UncyBwYXJ0aXRpb25pbmcKLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogQHRocm93cyBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVR5cGVkUmVnaW9uW10gY29tcHV0ZVBhcnRpdGlvbmluZyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlJVHlwZWRSZWdpb25bXSB0eXBlZFJlZ2lvbnMgPSBudWxsOwotCQl0cnkgewotCQkJdHlwZWRSZWdpb25zID0gY29tcHV0ZVBhcnRpdGlvbmluZyhJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBvZmZzZXQsIGxlbmd0aCwgZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSBpbiB0aGlzIGNvbnRleHQKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlpZiAodHlwZWRSZWdpb25zID09IG51bGwpIHsKLQkJCXR5cGVkUmVnaW9ucyA9IG5ldyBJVHlwZWRSZWdpb25bMF07Ci0JCX0KLQkJcmV0dXJuIHR5cGVkUmVnaW9uczsKLQl9Ci0KLQotCXB1YmxpYyBJVHlwZWRSZWdpb25bXSBjb21wdXRlUGFydGl0aW9uaW5nKFN0cmluZyBwYXJ0aXRpb25pbmcsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gaW5jbHVkZVplcm9MZW5ndGhQYXJ0aXRpb25zKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiB7Ci0JCWlmICgoMCA+IG9mZnNldCkgfHwgKDAgPiBsZW5ndGgpIHx8IChvZmZzZXQgKyBsZW5ndGggPiBnZXRMZW5ndGgoKSkpCi0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IGdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nKTsKLQotCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpCi0JCQlyZXR1cm4gKChJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpIHBhcnRpdGlvbmVyKS5jb21wdXRlUGFydGl0aW9uaW5nKG9mZnNldCwgbGVuZ3RoLCBpbmNsdWRlWmVyb0xlbmd0aFBhcnRpdGlvbnMpOwotCQllbHNlIGlmIChwYXJ0aXRpb25lciAhPSBudWxsKQotCQkJcmV0dXJuIHBhcnRpdGlvbmVyLmNvbXB1dGVQYXJ0aXRpb25pbmcob2Zmc2V0LCBsZW5ndGgpOwotCQllbHNlIGlmIChJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLmVxdWFscyhwYXJ0aXRpb25pbmcpKQotCQkJcmV0dXJuIG5ldyBUeXBlZFJlZ2lvbltde25ldyBUeXBlZFJlZ2lvbihvZmZzZXQsIGxlbmd0aCwgREVGQVVMVF9DT05URU5UX1RZUEUpfTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2NvbnRhaW5zUG9zaXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gZ2V0UG9zaXRpb25NYW5hZ2VyKCkuY29udGFpbnNQb3NpdGlvbihjYXRlZ29yeSwgb2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2NvbnRhaW5zUG9zaXRpb25DYXRlZ29yeQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVBvc2l0aW9uW10gcG9zaXRpb25zID0gZ2V0UG9zaXRpb25zKFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUG9zaXRpb24gcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07Ci0JCQkJaWYgKHBvc2l0aW9uLm92ZXJsYXBzV2l0aChzdGFydE9mZnNldCwgbGVuZ3RoKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQkJLy8ganVzdCBtZWFucyBubyByZWFkb25seSByZWdpb25zIGJlZW4gZGVmaW5lZCB5ZXQKLQkJCS8vIHNvIG9idmlvdXNseSBmYWxzZQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZVBvc3ROb3RpZmljYXRpb25DaGFuZ2VzKCkgewotCQlpZiAoZlN0b3BwZWRDb3VudCA+IDApCi0JCQlyZXR1cm47Ci0JCXdoaWxlIChmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMgIT0gbnVsbCkgewotCQkJTGlzdCBjaGFuZ2VzID0gZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzOwotCQkJZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzID0gbnVsbDsKLQkJCUl0ZXJhdG9yIGUgPSBjaGFuZ2VzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlSZWdpc3RlcmVkUmVwbGFjZSByZXBsYWNlID0gKFJlZ2lzdGVyZWRSZXBsYWNlKSBlLm5leHQoKTsKLQkJCQlyZXBsYWNlLmZSZXBsYWNlLnBlcmZvcm0odGhpcywgcmVwbGFjZS5mT3duZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2VkKCkgewotCQkvLyBtb3N0IERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZCBsaXN0ZW5lcnMgZG8gbm90IGFudGljaXBhdGUKLQkJLy8gRG9jdW1lbnRFdmVudCA9PSBudWxsLiBTbyBtYWtlIHN1cmUgZG9jdW1lbnRFdmVudCBpcyBub3QKLQkJLy8gbnVsbC4gKHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgeWV0IGl0IGRvZXMgc29tZXRpbWVzKQotCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RXZlbnQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQkJfQotCi0JCV9maXJlU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZShmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycyk7Ci0JCS8vIE5vdGU6IHRoZSBkb2NFdmVudCBpcyBjcmVhdGVkIGluIHJlcGxhY2VUZXh0IEFQSSEgKG9yIHNldCBUZXh0KQotCQlfZmlyZURvY3VtZW50QWJvdXRUb0NoYW5nZShmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyk7Ci0JCW5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzQWJvdXRUb0NoYW5nZShmRG9jdW1lbnRFdmVudCk7Ci0JCV9maXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZEb2N1bWVudExpc3RlbmVycyk7Ci0JfQotCi0JLyoqCi0JICogRmlyZXMgdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZyBjaGFuZ2VkIG5vdGlmaWNhdGlvbiB0byBhbGwgcmVnaXN0ZXJlZAotCSAqIGRvY3VtZW50IHBhcnRpdGlvbmluZyBsaXN0ZW5lcnMuIFVzZXMgYSByb2J1c3QgaXRlcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgcGFydGl0aW9uaW5nIGNoYW5nZWQgZXZlbnQKLQkgKiAKLQkgKiBAc2VlIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVEb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQoRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyA9PSBudWxsIHx8IGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5zaXplKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyk7Ci0JCUl0ZXJhdG9yIGUgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIgbCA9IChJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcikgZS5uZXh0KCk7Ci0JCQlpZiAobCBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMikgewotCQkJCUlEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMiBleHRlbnNpb24yID0gKElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMikgbDsKLQkJCQlleHRlbnNpb24yLmRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsIGluc3RhbmNlb2YgSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24pIHsKLQkJCQlJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbiBleHRlbnNpb24gPSAoSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24pIGw7Ci0JCQkJZXh0ZW5zaW9uLmRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZCh0aGlzLCBldmVudC5nZXRDb3ZlcmFnZSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWwuZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKHRoaXMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZVJlYWRPbmx5QWJvdXRUb0JlQ2hhbmdlZCgpIHsKLQkJX2ZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzKTsKLQkJLy8gTm90ZTogdGhlIGRvY0V2ZW50IGlzIGNyZWF0ZWQgaW4gcmVwbGFjZVRleHQgQVBJISAob3Igc2V0IFRleHQpCi0JCS8vIF9maXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzKTsKLQkJLy8gX2ZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2UoZkRvY3VtZW50TGlzdGVuZXJzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZVJlYWRPbmx5U3RydWN0dXJlZERvY3VtZW50RXZlbnQoTm9DaGFuZ2VFdmVudCBldmVudCkgewotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBldmVudCk7Ci0JCS8vIF9maXJlRG9jdW1lbnRDaGFuZ2VkKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCS8vIF9maXJlRG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQkvLyBfY2xlYXJEb2N1bWVudEV2ZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChOb0NoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJbm90aWZ5RG9jdW1lbnRQYXJ0aXRpb25lcnNEb2N1bWVudENoYW5nZWQoZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2NsZWFyRG9jdW1lbnRFdmVudCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoUmVnaW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJbm90aWZ5RG9jdW1lbnRQYXJ0aXRpb25lcnNEb2N1bWVudENoYW5nZWQoZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2NsZWFyRG9jdW1lbnRFdmVudCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlub3RpZnlEb2N1bWVudFBhcnRpdGlvbmVyc0RvY3VtZW50Q2hhbmdlZChldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlfY2xlYXJEb2N1bWVudEV2ZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCW5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzRG9jdW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZkRvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCV9jbGVhckRvY3VtZW50RXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCdzIGNvbXBsZXRlIHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXQoKSB7Ci0JCXJldHVybiBnZXRTdG9yZSgpLmdldCgwLCBnZXRMZW5ndGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBsZW5ndGggY2hhcmFjdGVycyBmcm9tIHRoZSBkb2N1bWVudCdzIHRleHQgc3RhcnRpbmcgZnJvbSB0aGUKLQkgKiBzcGVjaWZpZWQgcG9zaXRpb24uCi0JICogCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqIAotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB0aGUgcmFuZ2UgaXMgbm90IHZhbGlkIGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWludCBteUxlbmd0aCA9IGdldExlbmd0aCgpOwotCQlpZiAoMCA+IG9mZnNldCkKLQkJCW9mZnNldCA9IDA7Ci0JCWlmICgwID4gbGVuZ3RoKQotCQkJbGVuZ3RoID0gMDsKLQkJaWYgKG9mZnNldCArIGxlbmd0aCA+IG15TGVuZ3RoKSB7Ci0JCQkvLyBmaXJzdCB0cnkgYWRqdXN0aW5nIGxlbmd0aCB0byBmaXQKLQkJCWludCBsZXNzTGVuZ3RoID0gbXlMZW5ndGggLSBvZmZzZXQ7Ci0JCQlpZiAoKGxlc3NMZW5ndGggPj0gMCkgJiYgKG9mZnNldCArIGxlc3NMZW5ndGggPT0gbXlMZW5ndGgpKSB7Ci0JCQkJbGVuZ3RoID0gbGVzc0xlbmd0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHNlY29uZCwgdHJ5IG9mZnNldAotCQkJCWludCBtb3JlT2Zmc2V0ID0gbXlMZW5ndGggLSBsZW5ndGg7Ci0JCQkJaWYgKChtb3JlT2Zmc2V0ID49IDApICYmIChtb3JlT2Zmc2V0ICsgbGVuZ3RoID09IG15TGVuZ3RoKSkgewotCQkJCQlvZmZzZXQgPSBtb3JlT2Zmc2V0OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gY2FuIGhhcHBlbiBpZiBteUxlbmd0aCBpcyAwLgotCQkJCQkvLyBubyBhZGp1c3RtZW50IHBvc3NpYmxlLgotCQkJCQlyZXN1bHQgPSBuZXcgU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRTdG9yZSgpLmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKFVTRV9MT0NBTF9USFJFQUQpIHsKLQkJCXJlc3VsdCA9IGZDdXJyZW50RG9jdW1lbnRSZWdpb25DYWNoZS5nZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGNhY2hlZERvY3VtZW50UmVnaW9uOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjZ2V0Q2hhcgotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBwb3NpdGlvbiBpcyBub3QgYSB2YWxpZCByYW5nZSBpbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRDaGFyKGludCBwb3MpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWNoYXIgcmVzdWx0ID0gMHgwMDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGdldFN0b3JlKCkuZ2V0KHBvcyk7Ci0JCX0KLQkJY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGRvY3VtZW50IHBhcnRpdGlvbiBjb250YWluaW5nIHRoZSBnaXZlbgotCSAqIGNoYXJhY3RlciBwb3NpdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXREb2N1bWVudFBhcnRpdGlvbmVyKCkuZ2V0Q29udGVudFR5cGUob2Zmc2V0KTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoU3RyaW5nIHBhcnRpdGlvbmluZywgaW50IG9mZnNldCwgYm9vbGVhbiBwcmVmZXJPcGVuUGFydGl0aW9ucykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gewotCQlpZiAoKDAgPiBvZmZzZXQpIHx8IChvZmZzZXQgPiBnZXRMZW5ndGgoKSkpCi0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IGdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nKTsKLQotCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpCi0JCQlyZXR1cm4gKChJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpIHBhcnRpdGlvbmVyKS5nZXRDb250ZW50VHlwZShvZmZzZXQsIHByZWZlck9wZW5QYXJ0aXRpb25zKTsKLQkJZWxzZSBpZiAocGFydGl0aW9uZXIgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJ0aXRpb25lci5nZXRDb250ZW50VHlwZShvZmZzZXQpOwotCQllbHNlIGlmIChJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLmVxdWFscyhwYXJ0aXRpb25pbmcpKQotCQkJcmV0dXJuIERFRkFVTFRfQ09OVEVOVF9UWVBFOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoKSB7Ci0JCQotCQlTdHJpbmcgbGluZURlbGltaXRlcj0gbnVsbDsKLQkJCi0JCXRyeSB7Ci0JCQlsaW5lRGVsaW1pdGVyPSBnZXRMaW5lRGVsaW1pdGVyKDApOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCX0KLQkKLQkJaWYgKGxpbmVEZWxpbWl0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBsaW5lRGVsaW1pdGVyOwotCi0JCWlmIChmSW5pdGlhbExpbmVEZWxpbWl0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBmSW5pdGlhbExpbmVEZWxpbWl0ZXI7Ci0KLQkJU3RyaW5nIHN5c0xpbmVEZWxpbWl0ZXI9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBkZWxpbWl0ZXJzPSBnZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCk7Ci0JCUFzc2VydC5pc1RydWUoZGVsaW1pdGVycy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGRlbGltaXRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkZWxpbWl0ZXJzW2ldLmVxdWFscyhzeXNMaW5lRGVsaW1pdGVyKSkgewotCQkJCWxpbmVEZWxpbWl0ZXI9IHN5c0xpbmVEZWxpbWl0ZXI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChsaW5lRGVsaW1pdGVyID09IG51bGwpCi0JCQlsaW5lRGVsaW1pdGVyPSBkZWxpbWl0ZXJzWzBdOwotCQotCQlyZXR1cm4gbGluZURlbGltaXRlcjsKLQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQncyBwYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBAc2VlIElEb2N1bWVudFBhcnRpdGlvbmVyCi0JICovCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBnZXREb2N1bWVudFBhcnRpdGlvbmVyKElEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkcpOwotCX0KLQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERvY3VtZW50UGFydGl0aW9uZXIoU3RyaW5nIHBhcnRpdGlvbmluZykgewotCi0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIGRvY3VtZW50UGFydGl0aW9uZXIgPSBudWxsOwotCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzICE9IG51bGwpIHsKLQkJCWRvY3VtZW50UGFydGl0aW9uZXIgPSAoSURvY3VtZW50UGFydGl0aW9uZXIpIGZEb2N1bWVudFBhcnRpdGlvbmVycy5nZXQocGFydGl0aW9uaW5nKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRQYXJ0aXRpb25lcjsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmV0dXJuIGVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJLy8gc2hvdWxkIHdlIHVwZGF0ZSBjYWNoZWROb2RlPwotCQkvLyBXZSBzaG91bGQgdG8ga2VlcCBjb25zaXN0ZW50IHBoaWxvc29waHkgb2YgcmVtZW1iZXJpbmcgbGFzdAotCQkvLyByZXF1ZXN0ZWQgcG9zaXRpb24sCi0JCS8vIGZvciBlZmZpY2llbmN5LgotCQlzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihmaXJzdERvY3VtZW50UmVnaW9uKTsKLQkJcmV0dXJuIGZpcnN0RG9jdW1lbnRSZWdpb247Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJLy8gc2hvdWxkIHdlIHVwZGF0ZSBjYWNoZWROb2RlPwotCQkvLyBXZSBzaG91bGQgdG8ga2VlcCBjb25zaXN0ZW50IHBoaWxvc29waHkgb2YgcmVtZW1iZXJpbmcgbGFzdAotCQkvLyByZXF1ZXN0ZWQgcG9zaXRpb24sCi0JCS8vIGZvciBlZmZpY2llbmN5LgotCQlzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihsYXN0RG9jdW1lbnRSZWdpb24pOwotCQlyZXR1cm4gbGFzdERvY3VtZW50UmVnaW9uOwotCX0KLQotCS8qCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGFydGl0aW9ucwotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBnZXRMZWdhbENvbnRlbnRUeXBlcyhJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HKTsKLQkJfQotCQljYXRjaCAoQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUgaW4gdGhpcyBjb250ZXh0Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoU3RyaW5nIHBhcnRpdGlvbmluZykgdGhyb3dzIEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiB7Ci0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25pbmcpOwotCQlpZiAocGFydGl0aW9uZXIgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJ0aXRpb25lci5nZXRMZWdhbENvbnRlbnRUeXBlcygpOwotCQlpZiAoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORy5lcXVhbHMocGFydGl0aW9uaW5nKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117REVGQVVMVF9DT05URU5UX1RZUEV9OwotCQl0aHJvdyBuZXcgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0gbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCkgewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldExlZ2FsTGluZURlbGltaXRlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNnZXRMZW5ndGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldFN0b3JlKCkuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I2dldExpbmVEZWxpbWl0ZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJcmV0dXJuIGdldERlZmF1bHRMaW5lRGVsaW1pdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGluZSBkZWxpbWl0ZXIgb2YgdGhhdCBsaW5lCi0JICogCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSBsaW5lIG51bWJlciBpcyBpbnZhbGlkIGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcihpbnQgbGluZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldExpbmVEZWxpbWl0ZXIobGluZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbGluZS4gVGhlIGxpbmUgaXMgZGVzY3JpYmVkIGJ5Ci0JICogaXRzIG9mZnNldCBhbmQgaXRzIGxlbmd0aCBleGNsdWRpbmcgdGhlIGxpbmUncyBkZWxpbWl0ZXIuCi0JICogCi0JICogQHBhcmFtIGxpbmUKLQkgKiAgICAgICAgICAgIHRoZSBsaW5lIG9mIGludGVyZXN0Ci0JICogQHJldHVybiBhIGxpbmUgZGVzY3JpcHRpb24KLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxpbmUgbnVtYmVyIGlzIGludmFsaWQgaW4gdGhpcyBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24gZ2V0TGluZUluZm9ybWF0aW9uKGludCBsaW5lKSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUcmFja2VyKCkuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbGluZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LiBUaGUgZGVzY3JpcHRpb24KLQkgKiBjb250YWlucyB0aGUgb2Zmc2V0IGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBsaW5lIGV4Y2x1ZGluZyB0aGUgbGluZSdzCi0JICogZGVsaW1pdGVyLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2hvc2UgbGluZSBzaG91bGQgYmUgZGVzY3JpYmVkCi0JICogQHJldHVybiBhIHJlZ2lvbiBkZXNjcmliaW5nIHRoZSBsaW5lCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIG9mZnNldCBpcyBpbnZhbGlkIGluIHRoaXMgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uIGdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGludCBvZmZzZXQpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChvZmZzZXQpOwotCX0KLQotCS8qCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsaW5lIGluZm9ybWF0aW9uCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVMZW5ndGgoaW50IGxpbmUpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXRMaW5lTGVuZ3RoKGxpbmUpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiBsaW5lLgotCSAqIAotCSAqIEBwYXJhbSBsaW5lCi0JICogICAgICAgICAgICB0aGUgbGluZSBvZiBpbnRlcmVzdAotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50IG9mZnNldAotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgbGluZSBudW1iZXIgaXMgaW52YWxpZCBpbiB0aGlzIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGludCBnZXRMaW5lT2Zmc2V0KGludCBsaW5lKSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUcmFja2VyKCkuZ2V0TGluZU9mZnNldChsaW5lKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVPZk9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGdldFRyYWNrZXIoKS5nZXRMaW5lTnVtYmVyT2ZPZmZzZXQob2Zmc2V0KTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJaWYgKExvZ2dlci5ERUJVR19ET0NVTUVOVCkKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRGV2LiBQcm9ncmFtIEluZm8gT25seTogSVN0cnVjdHVyZWREb2N1bWVudDo6Z2V0TGluZU9mT2Zmc2V0OiBvZmZzZXQgb3V0IG9mIHJhbmdlLCB6ZXJvIGFzc3VtZWQuIG9mZnNldCA9ICIgKyBvZmZzZXQsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJlc3VsdCA9IDA7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhpcyBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGlzIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxpbmVzKCkgewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldE51bWJlck9mTGluZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGluZXMgd2hpY2ggYXJlIG9jY3VwaWVkIGJ5IGEgZ2l2ZW4gdGV4dCByYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgdGV4dCByYW5nZQotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHNwZWNpZmllZCB0ZXh0IHJhbmdlCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGxpbmVzIG9jY3VwaWVkIGJ5IHRoZSBzcGVjaWZpZWQgcmFuZ2UKLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgc3BlY2lmaWVkIHJhbmdlIGlzIGludmFsaWQgaW4gdGhpcyB0cmFja2VyCi0JICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxpbmVzKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXROdW1iZXJPZkxpbmVzKG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHB1YmxpYywgdGVtcG9yYXJpbHksIGZvciB1c2UgYnkgdGFnIGxpYiBjbGFzc2VzLgotCSAqLwotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAoZlBhcnNlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJU3RydWN0dXJlZERvY3VtZW50OjpnZXRQYXJzZXIuIFBhcnNlciBuZWVkcyB0byBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQgcGFydGl0aW9uIGluIHdoaWNoIHRoZSBwb3NpdGlvbiBpcyBsb2NhdGVkLiBUaGUKLQkgKiBwYXJ0aXRpb24gaXMgc3BlY2lmaWVkIGFzIHR5cGVkIHJlZ2lvbi4KLQkgKi8KLQlwdWJsaWMgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlJVHlwZWRSZWdpb24gcGFydGl0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhcnRpdGlvbiA9IGdldFBhcnRpdGlvbihJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBvZmZzZXQsIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlpZiAocGFydGl0aW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBFcnJvcigpOwotCQl9Ci0JCXJldHVybiBwYXJ0aXRpb247Ci0JfQotCi0KLQlwdWJsaWMgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihTdHJpbmcgcGFydGl0aW9uaW5nLCBpbnQgb2Zmc2V0LCBib29sZWFuIHByZWZlck9wZW5QYXJ0aXRpb25zKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiB7Ci0JCWlmICgoMCA+IG9mZnNldCkgfHwgKG9mZnNldCA+IGdldExlbmd0aCgpKSkKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCQlJVHlwZWRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IGdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nKTsKLQotCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpIHsKLQkJCXJlc3VsdCA9ICgoSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24yKSBwYXJ0aXRpb25lcikuZ2V0UGFydGl0aW9uKG9mZnNldCwgcHJlZmVyT3BlblBhcnRpdGlvbnMpOwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvbmVyICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHBhcnRpdGlvbmVyLmdldFBhcnRpdGlvbihvZmZzZXQpOwotCQl9Ci0JCWVsc2UgaWYgKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcuZXF1YWxzKHBhcnRpdGlvbmluZykpIHsKLQkJCXJlc3VsdCA9IG5ldyBUeXBlZFJlZ2lvbigwLCBnZXRMZW5ndGgoKSwgREVGQVVMVF9DT05URU5UX1RZUEUpOwotCQl9Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQYXJ0aXRpb25pbmdzKCkgewotCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gcGFydGl0aW9uaW5ncyA9IG5ldyBTdHJpbmdbZkRvY3VtZW50UGFydGl0aW9uZXJzLnNpemUoKV07Ci0JCWZEb2N1bWVudFBhcnRpdGlvbmVycy5rZXlTZXQoKS50b0FycmF5KHBhcnRpdGlvbmluZ3MpOwotCQlyZXR1cm4gcGFydGl0aW9uaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBwb3NpdGlvbiBjYXRlZ29yaWVzIGFkZGVkIHRvIHRoaXMgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFBvc2l0aW9uQ2F0ZWdvcmllcygpIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmdldFBvc2l0aW9uQ2F0ZWdvcmllcygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcG9zaXRpb25NYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlciBnZXRQb3NpdGlvbk1hbmFnZXIoKSB7Ci0JCWlmIChmUG9zaXRpb25NYW5hZ2VyID09IG51bGwpIHsKLQkJCWZQb3NpdGlvbk1hbmFnZXIgPSBuZXcgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gZlBvc2l0aW9uTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBQb3NpdGlvbnMgb2YgdGhlIGdpdmVuIHBvc2l0aW9uIGNhdGVnb3J5LgotCSAqIAotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIGNhdGVnb3J5IGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRQb3NpdGlvbnMoU3RyaW5nIGNhdGVnb3J5KSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmdldFBvc2l0aW9ucyhjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjZ2V0UG9zaXRpb25VcGRhdGVycwotCSAqLwotCXB1YmxpYyBJUG9zaXRpb25VcGRhdGVyW10gZ2V0UG9zaXRpb25VcGRhdGVycygpIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmdldFBvc2l0aW9uVXBkYXRlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIHdoaWNoIGlzIHRoZSBjYXNlIGlmIHRoZSBvZmZzZXQgaXMganVzdAotCSAqIGJlZm9yZSBvciBqdXN0IGFmdGVyIHRoZSBleGlzdGluZyB0ZXh0LiBDb21wYXJlIHdpdGgKLQkgKiBnZXROb2RlQXRDaGFyYWN0ZXJPZmZzZXQuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0KLQkJLy8gRklYTUU6IG5lZWQgdG8gc3luY2ggb24gJ2NhY2hlZFJlZ2lvbicgKGJ1dCBzaW5jZSB0aGF0J3MgYQotCQkvLyBjb25zdGFudGx5IGNoYW5naW5nIG9iamVjdCwgd2UKLQkJLy8gY2FuJ3QsIHNvIG5lZWQgdG8gYWRkIGEgInJlZ2lvbl9sb2NrIiBvYmplY3QsIGFuZCB1c2UgaXQgaGVyZSwgYW5kCi0JCS8vIGluIHJlLXBhcnNlci4KLQkJLy8gT2gsIGFuZCBuZWVkIHRvIG1ha2Ugc3VyZSwgYWZ0ZXIgc3luY2gsIHRoYXQgdGhlIHJlZ2lvbiBpcyBub3QKLQkJLy8gZGVsZXRlZCwgYW5kIGlmIHNvLCBJIGd1ZXNzIGdvIGJhY2sKLQkJLy8gdG8gdGhlIGJlZ2lubmluZyEKLQotCQkvLyBjYWNoZWQgbm9kZSBjYW4gYmUgbnVsbCB3aGVuIGRvY3VtZW50IGlzIGVtcHR5Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcG90ZW50aWFsQ2FjaGVkUmVnaW9uID0gZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHBvdGVudGlhbENhY2hlZFJlZ2lvbiAhPSBudWxsKSB7Ci0KLQkJCS8vIAotCi0JCQkvLyBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHJpZ2h0IG5vZGUsIHJldHVybiB0aGF0LgotCQkJaWYgKHBvdGVudGlhbENhY2hlZFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJcmVzdWx0ID0gcG90ZW50aWFsQ2FjaGVkUmVnaW9uOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZmlyc3QsIGZpbmQgb3V0IHdoYXQgZGlyZWN0aW9uIHRvIGdvLCByZWxhdGl2ZSB0bwotCQkJCS8vIGNhY2hlZE5vZGUuCi0JCQkJLy8gbmVnYXRpdmUgbWVhbnMgInRvd2FyZHMgdGhlIGZyb250IiBvZiB0aGUgZmlsZSwKLQkJCQkvLyBwb3N0aXRpdmUKLQkJCQkvLyBtZWFucwotCQkJCS8vIHRvd2FyZHMgdGhlIGVuZC4KLQkJCQlpbnQgZGlyZWN0aW9uID0gb2Zmc2V0IC0gcG90ZW50aWFsQ2FjaGVkUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJaWYgKGRpcmVjdGlvbiA8IDApIHsKLQkJCQkJLy8gc2VhcmNoIHRvd2FyZHMgYmVnaW5uaW5nCi0JCQkJCXdoaWxlICghcG90ZW50aWFsQ2FjaGVkUmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGVtcE5vZGUgPSBwb3RlbnRpYWxDYWNoZWRSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCQkJCWlmICh0ZW1wTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlwb3RlbnRpYWxDYWNoZWRSZWdpb24gPSB0ZW1wTm9kZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gc2VhcmNoIHRvd2FyZHMgZW5kCi0JCQkJCS8vIFRoZXJlIGlzIGEgbGVnaXRhbWF0IGNvbmRpdGlvbiB3aGVyZSB0aGUKLQkJCQkJLy8gb2Zmc2V0IHdpbGwgbm90IGJlIGNvbnRhaW5lZCBpbiBhbnkgbm9kZSwKLQkJCQkJLy8gd2hpY2ggaXMgaWYgdGhlIG9mZnNldCBpcyBqdXN0IHBhc3QgdGhlIGxhc3QKLQkJCQkJLy8gY2hhcmFjdGVyIG9mIHRleHQuCi0JCQkJCS8vIEFuZCwgd2UgbXVzdCBnYXVyZCBhZ2FpbnN0IHNldHRpbmcgY2FjaGVkTm9kZSB0bwotCQkJCQkvLyBudWxsIQotCQkJCQl3aGlsZSAoIXBvdGVudGlhbENhY2hlZFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRlbXBOb2RlID0gcG90ZW50aWFsQ2FjaGVkUmVnaW9uLmdldE5leHQoKTsKLQkJCQkJCWlmICh0ZW1wTm9kZSA9PSBudWxsKQotCQkJCQkJCWJyZWFrOwotCQkJCQkJZWxzZQotCQkJCQkJCXBvdGVudGlhbENhY2hlZFJlZ2lvbiA9IHRlbXBOb2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmVzdWx0ID0gcG90ZW50aWFsQ2FjaGVkUmVnaW9uOwotCQl9Ci0JCS8vIGp1c3QgdG8gYmUgZG91Ymx5IHN1cmUgd2UgbmV2ZXIgYXNzaWduIG51bGwgdG8gYW4gYWxyZWFkeSB2YWxpZAotCQkvLyBjYWNoZWRSZWdpb24uCi0JCS8vIEkgYmVsaWV2ZSBhbnkgdGltZSAncmVzdWx0JyBpcyBudWxsIGF0IHRoaXMgcG9pbnQsIHRoYXQganVzdCBtZWFucwotCQkvLyB3ZSBoYXZlIGFuCi0JCS8vIGVtcHR5IGRvY3VtZW50LCBhbmQgdGhlIGNhY2hlZFJlZ2lvbiBpcyBhbHJlYWR5IG51bGwsIGJ1dCB3ZSBjaGVjawotCQkvLyBhbmQgcHJpbnQKLQkJLy8gd2FybmluZywganVzdCBzbyBkdXJpbmcgZGV2ZWxvcG1lbnQgd2UgYmUgc3VyZSB3ZSBuZXZlciBhY2NpZGVudGx5Ci0JCS8vIGJyZWFrIHRoaXMgYXNzdW1wdGlvbi4KLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24ocmVzdWx0KTsKLQkJZWxzZSBpZiAoZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9ncmFtIEVycm9yOiBubyByZWdpb24gY291bGQgYmUgZm91bmQgdG8gY2FjaGUsIGJ1dCBjYWNoZSB3YXMgbm9uIG51bGwuIEluZGljYXRlcyBjb3JydXB0ZWQgbW9kZWwgb3IgcmVnaW9uIGxpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZ2V0UmVnaW9uTGlzdCgpIHsKLQkJQ29yZU5vZGVMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChnZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpCi0JCQlyZXN1bHQgPSBuZXcgQ29yZU5vZGVMaXN0KG51bGwpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBuZXcgQ29yZU5vZGVMaXN0KGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKDAsIGdldExlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJbiB0aGUgY2FzZSBvZiAwIGxlbmd0aCwgdGhlIDxjb2RlPklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb248L2NvZGU+Ci0JICogYXQgdGhlIGNoYXJhY3RlciBvZmZzZXQgaXMgcmV0dXJlbmVkLiBJbiBvdGhlciB3b3JkcywgdGhlIHJlZ2lvbiB0byB0aGUKLQkgKiByaWdodCBvZiB0aGUgY2FyZXQgaXMgcmV0dXJuZWQuIGV4Y2VwdCBmb3IgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsCi0JICogdGhlbiB0aGUgbGFzdCByZWdpb24gaXMgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE90aGVyd2lzZSBhbGwgdGhlIHJlZ2lvbnMgImluYmV0d2VlbiIgdGhlIGluZGljYXRlZCByYW5nZSBhcmUgcmV0dXJuZWQsCi0JICogaW5jbHVkaW5nIHRoZSByZWdpb25zIHdoaWNoIG92ZXJsYXAgdGhlIHJlZ2lvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogPGJyPgotCSAqIGVnLgotCSAqIDxwPgotCSAqIDxicj4KLQkgKiBlZy4KLQkgKiAKLQkgKiA8cHJlPgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2h0bWwmZ3Q7WyZsdDtoZWFkJmd0OyZsdDsvaGVhZCZndDtdJmx0Oy9odG1sJmd0OyByZXR1cm5zICZsdDtoZWFkJmd0OywmbHQ7L2hlYWQmZ3Q7Ci0JICogPC9wcmU+Ci0JICogICAgPHByZT4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICZsdDtodFttbCZndDsmbHQ7aGVhZCZndDsmbHQ7L2hlXWFkJmd0OyZsdDsvaHRtbCZndDsgcmV0dXJucyAmbHQ7aHRtbCZndDssJmx0O2hlYWQmZ3Q7LCZsdDsvaGVhZCZndDsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiA8cHJlPgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7aHRtbCZndDtbJmx0O2hlYWQmZ3Q7Jmx0Oy9oZWFkJmd0O10mbHQ7L2h0bWwmZ3Q7IHJldHVybnMgJmx0O2hlYWQmZ3Q7LCZsdDsvaGVhZCZndDsKLQkgKiA8L3ByZT4KLQkgKiAgICA8cHJlPgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7aHRbbWwmZ3Q7Jmx0O2hlYWQmZ3Q7Jmx0Oy9oZV1hZCZndDsmbHQ7L2h0bWwmZ3Q7IHJldHVybnMgJmx0O2h0bWwmZ3Q7LCZsdDtoZWFkJmd0OywmbHQ7L2hlYWQmZ3Q7Ci0JICogPC9wcmU+Ci0JICogCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQotCQlpZiAobGVuZ3RoIDwgMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbid0IGhhdmUgbmVnYXRpdmUgbGVuZ3RoIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0aGlzIHdpbGwgbWFrZSB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgcmFuZ2UgcG9pbnQgaW50byB0aGUgc2VsZWN0aW9uCi0JCS8vIGVnLiA8aHRtbD5bPGhlYWQ+PC9oZWFkPl08L2h0bWw+Ci0JCS8vIHdpbGwgcmV0dXJuIDxoZWFkPiw8L2hlYWQ+IGluc3RlYWQgb2YgPGhlYWQ+LDwvaGVhZD4sPC9odG1sPgotCQlpZiAobGVuZ3RoID4gMCkKLQkJCWxlbmd0aC0tOwotCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBzdGFydCB0aHJlYWQgc2FmZSBibG9jawotCQl0cnkgewotCQkJYWNxdWlyZUxvY2soKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCArIGxlbmd0aCk7Ci0JCQl3aGlsZSAoY3VycmVudFJlZ2lvbiAhPSBlbmRSZWdpb24gJiYgY3VycmVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0cy5hZGQoY3VycmVudFJlZ2lvbik7Ci0JCQkJY3VycmVudFJlZ2lvbiA9IGN1cnJlbnRSZWdpb24uZ2V0TmV4dCgpOwotCQkJfQotCQkJLy8gbmVlZCB0byBhZGQgdGhhdCBsYXN0IGVuZCByZWdpb24KLQkJCS8vIGNhbiBiZSBudWxsIGluIHRoZSBjYXNlIG9mIGFuIGVtcHR5IGRvY3VtZW50Ci0JCQlpZiAoZW5kUmVnaW9uICE9IG51bGwpCi0JCQkJcmVzdWx0cy5hZGQoZW5kUmVnaW9uKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXJlbGVhc2VMb2NrKCk7Ci0JCX0KLQkJLy8gZW5kIHRocmVhZCBzYWZlIGJsb2NrCi0KLQkJcmV0dXJuIChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10pIHJlc3VsdHMudG9BcnJheShuZXcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltyZXN1bHRzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIHdhcyBtYWRlIHB1YmxpYyBmb3IgZWFzaWVyIHRlc3RpbmcuIE5vcm1hbGx5IHNob3VsZCBuZXZlciBiZSB1c2VkIGJ5Ci0JICogY2xpZW50IGNvZGVzLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBnZXRSZVBhcnNlcigpIHsKLQkJaWYgKGZSZVBhcnNlciA9PSBudWxsKSB7Ci0JCQlmUmVQYXJzZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQkJCWZSZVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZSZVBhcnNlcjsKLQl9Ci0KLQlwcml2YXRlIElUZXh0U3RvcmUgZ2V0U3RvcmUoKSB7Ci0JCXJldHVybiBmU3RvcmU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgcmVzdWx0ID0gZ2V0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQncyBsaW5lIHRyYWNrZXIuIEFzc3VtZXMgdGhhdCB0aGUgZG9jdW1lbnQgaGFzIGJlZW4KLQkgKiBpbml0aWFsaXplZCB3aXRoIGEgbGluZSB0cmFja2VyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50J3MgbGluZSB0cmFja2VyCi0JICovCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZ2V0VHJhY2tlcigpIHsKLQkJcmV0dXJuIGZUcmFja2VyOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBnZXRVbmRvTWFuYWdlcigpIHsKLQkJaWYgKGZVbmRvTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlmVW5kb01hbmFnZXIgPSBuZXcgU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBmVW5kb01hbmFnZXI7Ci0JfQotCi0Jdm9pZCBpbml0aWFsaXplRmlyc3RBbmRMYXN0RG9jdW1lbnRSZWdpb24oKSB7Ci0JCS8vIGNhY2hlZCBOb2RlIG11c3QgYWxzbyBiZSBmaXJzdCwgYXQgdGhlIGluaXRpYWwgcG9pbnQuIE9ubHkKLQkJLy8gdmFsaWQKLQkJLy8gdG8gY2FsbCB0aGlzIG1ldGhvZCByaWdodCBhZnRlciB0aGUgZmlyc3QgcGFyc2UuCi0JCS8vIAotCQkvLyB3aGVuIHN0YXJ0aW5nIGFmcmVzaCwgb3VyIGNhY2hlZE5vZGUgc2hvdWxkIGJlIG91ciBmaXJzdE5vZGUsCi0JCS8vIHNvIGJlIHN1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgZmlyc3ROb2RlCi0JCWZpcnN0RG9jdW1lbnRSZWdpb24gPSBnZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpOwotCQkvLyBiZSBzdXJlIHRvIHVzZSAnZ2V0TmV4dCcgZm9yIHRoaXMgaW5pdGlhbCBmaW5kaW5nIG9mIHRoZSBsYXN0Ci0JCS8vIG5vZGUsCi0JCS8vIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBub2RlLmdldExhc3ROb2RlIG1heSBzaW1wbHkgY2FsbAotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiEKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGZpcnN0RG9jdW1lbnRSZWdpb247Ci0JCWlmIChhTm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBkZWZlY3QgMjU0NjA3OiB0byBoYW5kbGUgZW1wdHkgZG9jdW1lbnRzIHJpZ2h0LCBpZgotCQkJLy8gZmlyc3Rub2RlIGlzCi0JCQkvLyBudWxsLCBtYWtlIHN1cmUgbGFzdCBub2RlIGlzIG51bGwgdG9vCi0JCQlsYXN0RG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJd2hpbGUgKGFOb2RlICE9IG51bGwpIHsKLQkJCQlsYXN0RG9jdW1lbnRSZWdpb24gPSBhTm9kZTsKLQkJCQlhTm9kZSA9IGFOb2RlLmdldE5leHQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2luc2VydFBvc2l0aW9uVXBkYXRlcgotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydFBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIsIGludCBpbmRleCkgewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5pbnNlcnRQb3NpdGlvblVwZGF0ZXIodXBkYXRlciwgaW5kZXgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbF9hZGRQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5hZGRQb3NpdGlvbkNhdGVnb3J5KGNhdGVnb3J5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxfYWRkUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5hZGRQb3NpdGlvblVwZGF0ZXIodXBkYXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsX3NldFBhcnNlcihSZWdpb25QYXJzZXIgbmV3UGFyc2VyKSB7Ci0JCWZQYXJzZXIgPSBuZXdQYXJzZXI7Ci0JfQotCi0JU3RyaW5nIGludGVybmFsR2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGludCBteUxlbmd0aCA9IGdldExlbmd0aCgpOwotCQkvLyBpZiAoKDAgPiBvZmZzZXQpIHx8ICgwID4gbGVuZ3RoKSB8fCAob2Zmc2V0ICsgbGVuZ3RoID4gbXlMZW5ndGgpKQotCQkvLyB0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQkJcmVzdWx0ID0gZ2V0U3RvcmUoKS5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXF1ZXN0ZXIKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRMZW5ndGgKLQkgKiBAcGFyYW0gY2hhbmdlcwotCSAqIEBwYXJhbSBtb2RpZmljYXRpb25TdGFtcAotCSAqIEBwYXJhbSBpZ25vcmVSZWFkT25seVNldHRpbmdzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgaW50ZXJuYWxSZXBsYWNlVGV4dChPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIGNoYW5nZXMsIGxvbmcgbW9kaWZpY2F0aW9uU3RhbXAsIGJvb2xlYW4gaWdub3JlUmVhZE9ubHlTZXR0aW5ncykgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCi0JCXN0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCQlpZiAoY2hhbmdlcyA9PSBudWxsKQotCQkJY2hhbmdlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIAotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOjpyZXBsYWNlVGV4dCgiICsgc3RhcnQgKyAiLCIgKyByZXBsYWNlbWVudExlbmd0aCArICIsIiArIGNoYW5nZXMgKyAiKSIpOyAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCWlmIChEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudE9ubHkgfHwgRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RSYXdTdHJ1Y3R1cmVkRG9jdW1lbnRPbmx5KSB7Ci0JCQlzdGFydFN0cmVhbVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQl0cnkgewotCQkJLy8gTm90ZTogZXZlbnQgbXVzdCBiZSBjb21wdXRlZCBiZWZvcmUgJ2ZpcmUnIG1ldGhvZCBjYWxsZWQKLQkJCWZEb2N1bWVudEV2ZW50ID0gbmV3IERvY3VtZW50RXZlbnQodGhpcywgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjaGFuZ2VzKTsKLQkJCWZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2VkKCk7Ci0KLQkJCXRyeSB7Ci0JCQkJYWNxdWlyZUxvY2soKTsKLQotCQkJCWlmICghaWdub3JlUmVhZE9ubHlTZXR0aW5ncyAmJiAoY29udGFpbnNSZWFkT25seShzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgpKSkgewotCQkJCQlOb0NoYW5nZUV2ZW50IG5vQ2hhbmdlRXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudCh0aGlzLCByZXF1ZXN0ZXIsIGNoYW5nZXMsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCk7Ci0JCQkJCW5vQ2hhbmdlRXZlbnQucmVhc29uID0gTm9DaGFuZ2VFdmVudC5SRUFEX09OTFlfU1RBVEVfQ0hBTkdFOwotCQkJCQlyZXN1bHQgPSBub0NoYW5nZUV2ZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gdXBkYXRlTW9kZWwocmVxdWVzdGVyLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIGNoYW5nZXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXJlbGVhc2VMb2NrKCk7Ci0JCQl9Ci0KLQotCQkJaWYgKERlYnVnLnBlcmZUZXN0UmF3U3RydWN0dXJlZERvY3VtZW50T25seSB8fCBEZWJ1Zy5wZXJmVGVzdCkgewotCQkJCWxvbmcgc3RvcFN0cmVhbVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgVGltZSBmb3IgSVN0cnVjdHVyZWREb2N1bWVudCByYXcgcmVwbGFjZVRleHQ6ICIgKyAoc3RvcFN0cmVhbVRpbWUgLSBzdGFydFN0cmVhbVRpbWUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJldmVudCB0eXBlIHJldHVybmVkIGJ5IHJlcGxhY2VUZXh0V2l0aE5vRGVidWdnaW5nVGhyZWFkOiAiICsgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gRlVUVVJFX1RPX0RPOiBpbXBsZW1lbnQgY2FsbGJhY2sgbWVjaGFuaXNtPyB0byBhdm9pZCBpbnN0YW5jZW9mCi0JCQkvLyBhbmQgY2FzdGluZwotCQkJLy8gZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IG11c3QgYmUgY2FsbGVkIGluIG9yZGVyIHRvIGVuZAotCQkJLy8gZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkIHN0YXRlCi0KLQotCQkJLy8gaW5jcmVtZW50IG1vZGlmaWNhdGlvbiBzdGFtcCBpZiBtb2RpZmljYXRpb25zIHdlcmUgbWFkZQotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmICEocmVzdWx0IGluc3RhbmNlb2YgTm9DaGFuZ2VFdmVudCkpIHsKLQkJCQlmTW9kaWZpY2F0aW9uU3RhbXA9IG1vZGlmaWNhdGlvblN0YW1wOwotCQkJCWZOZXh0TW9kaWZpY2F0aW9uU3RhbXA9IE1hdGgubWF4KGZNb2RpZmljYXRpb25TdGFtcCwgZk5leHRNb2RpZmljYXRpb25TdGFtcCk7Ci0JCQkJZkRvY3VtZW50RXZlbnQuZk1vZGlmaWNhdGlvblN0YW1wID0gZk1vZGlmaWNhdGlvblN0YW1wOwotCQkJfQotCQkJCQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJLy8gcmVzdWx0IHNob3VsZCBub3QgYmUgbnVsbCwgYnV0IGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLAotCQkJCS8vIGl0IHdpbGwgYmUKLQkJCQkvLyBzbyBzZW5kIGEgbm9DaGFuZ2VFdmVudCBhbmQgbG9nIHRoZSBwcm9ibGVtCi0JCQkJTm9DaGFuZ2VFdmVudCBub0NoYW5nZUV2ZW50ID0gbmV3IE5vQ2hhbmdlRXZlbnQodGhpcywgcmVxdWVzdGVyLCBjaGFuZ2VzLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgpOwotCQkJCW5vQ2hhbmdlRXZlbnQucmVhc29uID0gTm9DaGFuZ2VFdmVudC5OT19FVkVOVDsKLQkJCQlmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQobm9DaGFuZ2VFdmVudCk7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJQcm9ncmFtIEVycm9yOiBpbnZhbGlkIHN0cnVjdHVyZWQgZG9jdW1lbnQgZXZlbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlZ2lvbkNoYW5nZWRFdmVudCkgewotCQkJCQlmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoKFJlZ2lvbkNoYW5nZWRFdmVudCkgcmVzdWx0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBSZWdpb25zUmVwbGFjZWRFdmVudCkgewotCQkJCQkJZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KChSZWdpb25zUmVwbGFjZWRFdmVudCkgcmVzdWx0KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkgewotCQkJCQkJCS8vIHByb2JhYmx5IG1vcmUgZWZmaWNpZW50IHRvIG1hcmsgb2xkIHJlZ2lvbnMgYXMKLQkJCQkJCQkvLyAnZGVsZXRlZCcgYXQgdGhlIHRpbWUKLQkJCQkJCQkvLyB0aGF0IGFyZSBkZXRlcm1pbmVkIHRvIGJlIGRlbGV0ZWQsIGJ1dCBJJ2xsIGRvCi0JCQkJCQkJLy8gaGVyZQotCQkJCQkJCS8vIGluIHRoZW4gY2VudHJhbCBzcG90Ci0JCQkJCQkJLy8gZm9yIHByb2dyYW1taW5nIGVhc2UuCi0JCQkJCQkJdXBkYXRlRGVsZXRlZEZpZWxkcygoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHJlc3VsdCk7Ci0JCQkJCQkJZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkgcmVzdWx0KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBOb0NoYW5nZUV2ZW50KSB7Ci0JCQkJCQkJCWZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCgoTm9DaGFuZ2VFdmVudCkgcmVzdWx0KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCS8vIGlmIGhlcmUsIHRoaXMgbWVhbnMgYSBuZXcgZXZlbnQgd2FzIGNyZWF0ZWQKLQkJCQkJCQkJLy8gYW5kIG5vdCBoYW5kbGVkIGhlcmUKLQkJCQkJCQkJLy8ganVzdCBzZW5kIGEgbm8gZXZlbnQgdW50aWwgdGhpcyBpc3N1ZSBpcwotCQkJCQkJCQkvLyByZXNvbHZlZC4KLQkJCQkJCQkJTm9DaGFuZ2VFdmVudCBub0NoYW5nZUV2ZW50ID0gbmV3IE5vQ2hhbmdlRXZlbnQodGhpcywgcmVxdWVzdGVyLCBjaGFuZ2VzLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgpOwotCQkJCQkJCQlub0NoYW5nZUV2ZW50LnJlYXNvbiA9IE5vQ2hhbmdlRXZlbnQuTk9fRVZFTlQ7Ci0JCQkJCQkJCWZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChub0NoYW5nZUV2ZW50KTsKLQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlByb2dyYW0gRXJyb3I6IHVuZXhwZWN0ZWQgc3RydWN0dXJlZCBkb2N1bWVudCBldmVudDogIiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudE9ubHkpIHsKLQkJCQlsb25nIHN0b3BTdHJlYW1UaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IFRvdGFsIFRpbWUgZm9yIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnQgc2lnbmFsaW5nL3Byb2Nlc3NpbmcgaW4gcmVwbGFjZVRleHQ6ICIgKyAoc3RvcFN0cmVhbVRpbWUgLSBzdGFydFN0cmVhbVRpbWUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmVzdW1lUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNsZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCi0JCXJldHVybiBnZXRMZW5ndGgoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbWFrZVJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCkgewotCQltYWtlUmVhZE9ubHkoc3RhcnRPZmZzZXQsIGxlbmd0aCwgZmFsc2UsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoLCBib29sZWFuIGNhbkluc2VydEJlZm9yZSwgYm9vbGVhbiBjYW5JbnNlcnRBZnRlcikgewkKLQkJLy8gZG9lc24ndCBtYWtlIHNlbnNlIHRvIGhhdmUgYSByZWFkb25seSByZWdpb24gb2YgMCBsZW5ndGgsCi0JCS8vIHNvIHdlJ2xsIGlnbm9yZSB0aG9zZSByZXF1ZXN0cwotCQlpZiAobGVuZ3RoIDw9IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBhZmZlY3RlZFRleHQgPSB0aGlzLmdldChzdGFydE9mZnNldCwgbGVuZ3RoKTsKLQkJLy8gYSBkb2N1bWVudCBldmVudCBmb3IgInJlYWQgb25seSIgY2hhbmdlIC4uLiBtdXN0Ci0JCS8vIGJlIGZvbGxvd2VkIGJ5ICJubyBjaGFuZ2UiIHN0cnVjdHVyZWREb2N1bWVudCBldmVudAotCQkvLyBmRG9jdW1lbnRFdmVudCA9IG5ldyBEb2N1bWVudEV2ZW50KHRoaXMsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgsCi0JCS8vIGFmZmVjdGVkVGV4dCk7Ci0JCWZpcmVSZWFkT25seUFib3V0VG9CZUNoYW5nZWQoKTsKLQkJLy8gaWYgKGNvbnRhaW5zUmVhZE9ubHkoc3RhcnRPZmZzZXQsIGxlbmd0aCkpIHsKLQkJLy8gYWRqdXN0UmVhZE9ubHlSZWdpb25zKHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCQkvLyB9IGVsc2UgewotCQkvLyB3ZSBjYW4gYmxpbmRseSBhZGQgY2F0ZWdvcnksIHNpbmNlIG5vIGhhcm0gZG9uZSBpZiBhbHJlYWR5Ci0JCS8vIGV4aXN0cy4KLQkJYWRkUG9zaXRpb25DYXRlZ29yeShSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSk7Ci0JCVBvc2l0aW9uIG5ld1Bvc2l0aW9uID0gbmV3IFJlYWRPbmx5UG9zaXRpb24oc3RhcnRPZmZzZXQsIGxlbmd0aCwgY2FuSW5zZXJ0QmVmb3JlKTsKLQkJdHJ5IHsKLQkJCWFkZFBvc2l0aW9uKFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZLCBuZXdQb3NpdGlvbik7Ci0JCQkvLyBGSVhNRTogbmVlZCB0byBjaGFuZ2UgQVBJIHRvIHBhc3MgaW4gcmVxdWVzdGVyLCBzbyB0aGlzIGV2ZW50Ci0JCQkvLyBjYW4gYmUKLQkJCS8vIGNyZWF0ZWQgY29ycmVjdGx5LCBpbnN0ZWFkIG9mIHVzaW5nIG51bGwuCi0JCQlOb0NoYW5nZUV2ZW50IG5vQ2hhbmdlRXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudCh0aGlzLCBudWxsLCBhZmZlY3RlZFRleHQsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCQkJbm9DaGFuZ2VFdmVudC5yZWFzb24gPSBOb0NoYW5nZUV2ZW50LlJFQURfT05MWV9TVEFURV9DSEFOR0U7Ci0JCQlmaXJlUmVhZE9ubHlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChub0NoYW5nZUV2ZW50KTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gZm9yIG5vdywgbG9nIGFuZCBpZ25vcmUuIFBlcmhhcHMgbGF0ZXIgd2UKLQkJCS8vIGNvdWxkIGFkanVzdCB0byBoYW5kbGUgc29tZSBjYXNlcz8KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oKCJjb3VsZCBub3QgY3JlYXRlIHJlYWRvbmx5IHJlZ2lvbiBhdCAiICsgc3RhcnRPZmZzZXQgKyAiIHRvICIgKyBsZW5ndGgpLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIG5ldmVyIG9jY3VyLCBzaW5jZSB3ZSBhZGQgY2F0ZWdvcnkKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBuZXdJbnN0YW5jZSgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBuZXdJbnN0YW5jZSA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkubmV3SW5zdGFuY2UoKSk7Ci0JCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIG5ld0luc3RhbmNlKS5zZXRSZVBhcnNlcihnZXRSZVBhcnNlcigpLm5ld0luc3RhbmNlKCkpOwotCQlpZiAoZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgewotCQkJbmV3SW5zdGFuY2Uuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcigoKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpIGdldERvY3VtZW50UGFydGl0aW9uZXIoKSkubmV3SW5zdGFuY2UoKSk7Ci0JCQluZXdJbnN0YW5jZS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKCkuY29ubmVjdChuZXdJbnN0YW5jZSk7Ci0JCX0KLQkJbmV3SW5zdGFuY2Uuc2V0TGluZURlbGltaXRlcihnZXRMaW5lRGVsaW1pdGVyKCkpOwotCQlpZiAoZ2V0RW5jb2RpbmdNZW1lbnRvKCkgIT0gbnVsbCkgewotCQkJbmV3SW5zdGFuY2Uuc2V0RW5jb2RpbmdNZW1lbnRvKChFbmNvZGluZ01lbWVudG8pIGdldEVuY29kaW5nTWVtZW50bygpLmNsb25lKCkpOwotCQl9Ci0JCXJldHVybiBuZXdJbnN0YW5jZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LklSZWdpb25Db21wYXJpYmxlI3JlZ2lvbk1hdGNoZXMoaW50LAotCSAqICAgICAgaW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlJVGV4dFN0b3JlIHN0b3JlID0gZ2V0U3RvcmUoKTsKLQkJaWYgKHN0b3JlIGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCXJlc3VsdCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIHN0b3JlKS5yZWdpb25NYXRjaGVzKG9mZnNldCwgbGVuZ3RoLCBzdHJpbmdUb0NvbXBhcmUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gZ2V0KG9mZnNldCwgbGVuZ3RoKS5lcXVhbHMoc3RyaW5nVG9Db21wYXJlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJSVRleHRTdG9yZSBzdG9yZSA9IGdldFN0b3JlKCk7Ci0JCWlmIChzdG9yZSBpbnN0YW5jZW9mIElSZWdpb25Db21wYXJpYmxlKSB7Ci0JCQlyZXN1bHQgPSAoKElSZWdpb25Db21wYXJpYmxlKSBzdG9yZSkucmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2Uob2Zmc2V0LCBsZW5ndGgsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBnZXQob2Zmc2V0LCBsZW5ndGgpLmVxdWFsc0lnbm9yZUNhc2Uoc3RyaW5nVG9Db21wYXJlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jcmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UpCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZShJRG9jdW1lbnRMaXN0ZW5lciBvd25lciwgSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlIHJlcGxhY2UpIHsKLQkJaWYgKGZBY2NlcHRQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZXMpIHsKLQkJCWlmIChmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMgPT0gbnVsbCkKLQkJCQlmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzLmFkZChuZXcgUmVnaXN0ZXJlZFJlcGxhY2Uob3duZXIsIHJlcGxhY2UpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VMb2NrKCkgewotCQkvLyBkbyBub3RoaW5nIGhlcmUgaW4gc3VwZXIgY2xhc3MKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKChmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycyAhPSBudWxsKSAmJiAobGlzdGVuZXIgIT0gbnVsbCkpIHsKLQkJCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCQlpbnQgb2xkU2l6ZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzLmxlbmd0aDsKLQkJCQkJaW50IG5ld1NpemUgPSBvbGRTaXplIC0gMTsKLQkJCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLQkJCQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgeyAvLyBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlCi0JCQkJCQkJLy8gcmVtb3ZpbmcKLQkJCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyc1tpXTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBub3cgdGhhdCB3ZSBoYXZlIGEgbmV3IGFycmF5LCBsZXQncyBzd2l0Y2ggaXQgZm9yIHRoZQotCQkJCQkvLyBvbGQKLQkJCQkJLy8gb25lCi0JCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzICE9IG51bGwpICYmIChsaXN0ZW5lciAhPSBudWxsKSkgewotCQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZSByZXF1ZXN0Ci0JCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJCWludCBvbGRTaXplID0gZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7IC8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gY29weSBvbGQgdG8gbmV3IGlmIGl0cyBub3QgdGhlIG9uZSB3ZSBhcmUKLQkJCQkJCQkvLyByZW1vdmluZwotCQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzW2ldOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlCi0JCQkJCS8vIG9sZAotCQkJCQkvLyBvbmUKLQkJCQkJZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycyAhPSBudWxsKSAmJiAobGlzdGVuZXIgIT0gbnVsbCkpIHsKLQkJCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQkJaW50IG9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgeyAvLyBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlCi0JCQkJCQkJLy8gcmVtb3ZpbmcKLQkJCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnNbaV07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUKLQkJCQkJLy8gb2xkCi0JCQkJCS8vIG9uZQotCQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihJRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoKGZEb2N1bWVudExpc3RlbmVycyAhPSBudWxsKSAmJiAobGlzdGVuZXIgIT0gbnVsbCkpIHsKLQkJCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZkRvY3VtZW50TGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQkJaW50IG9sZFNpemUgPSBmRG9jdW1lbnRMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCQlJRG9jdW1lbnRMaXN0ZW5lcltdIG5ld0xpc3RlbmVycyA9IG5ldyBJRG9jdW1lbnRMaXN0ZW5lcltuZXdTaXplXTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLQkJCQkJCWlmIChmRG9jdW1lbnRMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsgLy8gaWdub3JlCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBjb3B5IG9sZCB0byBuZXcgaWYgaXRzIG5vdCB0aGUgb25lIHdlIGFyZQotCQkJCQkJCS8vIHJlbW92aW5nCi0JCQkJCQkJbmV3TGlzdGVuZXJzW2luZGV4KytdID0gZkRvY3VtZW50TGlzdGVuZXJzW2ldOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlCi0JCQkJCS8vIG9sZAotCQkJCQkvLyBvbmUKLQkJCQkJZkRvY3VtZW50TGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcihJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlBc3NlcnQuaXNOb3ROdWxsKGxpc3RlbmVyKTsKLQkJCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCQlmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIDxjb2RlPlBvc2l0aW9uPC9jb2RlPiBmcm9tIHRoZSBkb2N1bWVudCdzIGRlZmF1bHQKLQkgKiBwb3NpdGlvbiBjYXRlZ29yeS4gVGhlIGRlZmF1bHQgcG9zaXRpb24gY2F0ZWdvcnkgaXMgdG8gYmUgZGVmaW5lZCBieQotCSAqIHRoZSBpbXBsZW1lbnRlcnMuIElmIHRoZSBwb3NpdGlvbiBpcyBub3QgcGFydCBvZiB0aGUgZG9jdW1lbnQncyBkZWZhdWx0Ci0JICogY2F0ZWdvcnkgbm90aGluZyBoYXBwZW5zLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCWdldFBvc2l0aW9uTWFuYWdlcigpLnJlbW92ZVBvc2l0aW9uKHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNyZW1vdmVQb3NpdGlvbgotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSBjYXRlZ29yeSBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5yZW1vdmVQb3NpdGlvbihjYXRlZ29yeSwgcG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I3JlbW92ZVBvc2l0aW9uQ2F0ZWdvcnkKLQkgKiBAZXhjZXB0aW9uIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB0aGUgY2F0ZWdvcnkgaXMgbm90IGRlZmluZWQgZm9yIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCWdldFBvc2l0aW9uTWFuYWdlcigpLnJlbW92ZVBvc2l0aW9uQ2F0ZWdvcnkoY2F0ZWdvcnkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I3JlbW92ZVBvc2l0aW9uVXBkYXRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIpIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkucmVtb3ZlUG9zaXRpb25VcGRhdGVyKHVwZGF0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGRvY3VtZW50IGxpc3RlbmVyIGZyb20gdGVoIGRvY3VtZW50J3MgbGlzdCBvZgotCSAqIHByZW5vdGlmaWVkIGRvY3VtZW50IGxpc3RlbmVycy4gSWYgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkIHdpdGgKLQkgKiB0aGUgZG9jdW1lbnQgbm90aGluZyBoYXBwZW5zLgotCSAqIDxwPgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBmb3IgcHVibGljIHVzZSwgaXQgbWF5IG9ubHkgYmUgY2FsbGVkIGJ5Ci0JICogaW1wbGVtZW50ZXJzIG9mIDxjb2RlPklEb2N1bWVudEFkYXB0ZXI8L2NvZGU+IGFuZCBvbmx5IGlmIHRob3NlCi0JICogaW1wbGVtZW50ZXJzIG5lZWQgdG8gaW1wbGVtZW50IDxjb2RlPklEb2N1bWVudExpc3RlbmVyPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRBZGFwdGVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZAotCSAqIAotCSAqIEBzZWUgI2FkZFByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcihJRG9jdW1lbnRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciBkb2N1bWVudEFkYXB0ZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgZG9jdW1lbnRBZGFwdGVyKSkgewotCQkJCWludCBwcmV2aW91c1NpemUgPSBmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJaWYgKHByZXZpb3VzU2l6ZSA+IDEpIHsKLQkJCQkJSURvY3VtZW50TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgSURvY3VtZW50TGlzdGVuZXJbcHJldmlvdXNTaXplIC0gMV07Ci0JCQkJCWludCBwcmV2aW91c0luZGV4ID0gMDsKLQkJCQkJaW50IG5ld0luZGV4ID0gMDsKLQkJCQkJd2hpbGUgKHByZXZpb3VzSW5kZXggPCBwcmV2aW91c1NpemUpIHsKLQkJCQkJCWlmIChmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyc1twcmV2aW91c0luZGV4XSAhPSBkb2N1bWVudEFkYXB0ZXIpCi0JCQkJCQkJbGlzdGVuZXJzW25ld0luZGV4KytdID0gZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnNbcHJldmlvdXNJbmRleF07Ci0JCQkJCQlwcmV2aW91c0luZGV4Kys7Ci0JCQkJCX0KLQkJCQkJZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgZm9yIElOVEVSTkFMIFVTRSBPTkxZIGFuZCBpcyBOT1QgQVBJLgotCSAqIAotCSAqIFJlYnVpbGRzIHRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY2hhaW4gZnJvbSB0aGUgZXhpc3RpbmcgdGV4dC4KLQkgKiBGaWxlQnVmZmVyIHN1cHBvcnQgZG9lcyBub3QgYWxsb3cgY2xpZW50cyB0byBrbm93IHRoZSBkb2N1bWVudCdzCi0JICogbG9jYXRpb24gYmVmb3JlIHRoZSB0ZXh0IGNvbnRlbnRzIGFyZSBzZXQuCi0JICogCi0JICogQHNlZSBzZXQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGFyc2UoT2JqZWN0IHJlcXVlc3RlcikgewotCQlzdG9wUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQkJY2xlYXJSZWFkT25seSgpOwotCi0JCXRyeSB7Ci0JCQlhY3F1aXJlTG9jaygpOwotCi0JCQlDaGFyU2VxdWVuY2VSZWFkZXIgc3ViU2V0VGV4dFN0b3JlUmVhZGVyID0gbmV3IENoYXJTZXF1ZW5jZVJlYWRlcigoQ2hhclNlcXVlbmNlKSBnZXRTdG9yZSgpLCAwLCBnZXRTdG9yZSgpLmdldExlbmd0aCgpKTsKLQkJCXJlc2V0UGFyc2VyKHN1YlNldFRleHRTdG9yZVJlYWRlciwgMCk7Ci0JCQkvLwotCQkJc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oZ2V0UGFyc2VyKCkuZ2V0RG9jdW1lbnRSZWdpb25zKCkpOwotCQkJLy8gd2hlbiBzdGFydGluZyBhZnJlc2gsIG91ciBjYWNoZWROb2RlIHNob3VsZCBiZSBvdXIgZmlyc3ROb2RlLAotCQkJLy8gc28gYmUgc3VyZSB0byBpbml0aWFsaXplIHRoZSBmaXJzdE5vZGUgYW5kIGxhc3ROb2RlCi0JCQlpbml0aWFsaXplRmlyc3RBbmRMYXN0RG9jdW1lbnRSZWdpb24oKTsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLnNldFBhcmVudERvY3VtZW50KGdldENhY2hlZERvY3VtZW50UmVnaW9uKCksIHRoaXMpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJcmVsZWFzZUxvY2soKTsKLQkJfQotCi0JCXJlc3VtZVBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjcmVwbGFjZQotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBwb3NpdGlvbiBpcyBub3QgYSB2YWxpZCByYW5nZSBpbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0ZXh0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGU6IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OnJlcGxhY2UoaW50LCBpbnQsIFN0cmluZykgLi4uLiBpdHMgYmV0dGVyIHRvIHVzZSByZXBsYWNlVGV4dChzb3VyY2UsIHN0cmluZywgaW50LCBpbnQpIEFQSSBmb3Igc3RydWN0dXJlZERvY3VtZW50IHVwZGF0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgbGVuZ3RoLCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSB0ZXh0IHdpdGggIm5ld1RleHQiIHN0YXJ0aW5nIGF0IHBvc2l0aW9uICJzdGFydCIgZm9yIGEKLQkgKiBsZW5ndGggb2YgInJlcGxhY2VMZW5ndGgiLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBwb3MKLQkgKiAgICAgICAgICAgIHN0YXJ0IG9mZnNldCBvZiB0ZXh0IHRvIHJlcGxhY2UgTm9uZSBvZiB0aGUgb2Zmc2V0cyBpbmNsdWRlCi0JICogICAgICAgICAgICBkZWxpbWl0ZXJzIG9mIHByZWNlZWRpbmcgbGluZXMuIE9mZnNldCAwIGlzIHRoZSBmaXJzdAotCSAqICAgICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSBkb2N1bWVudC4KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICBzdGFydCBvZmZzZXQgb2YgdGV4dCB0byByZXBsYWNlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHN0YXJ0IG9mZnNldCBvZiB0ZXh0IHRvIHJlcGxhY2UKLQkgKiAgICAgICAgICAgIDxwPgotCSAqICAgICAgICAgICAgSW1wbGVtZW50b3JzIGhhdmUgdG8gbm90aWZ5IFRleHRDaGFuZ2VkIGxpc3RlbmVycyBhZnRlciB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgaGFzIGJlZW4gdXBkYXRlZC4gVGhlIFRleHRDaGFuZ2VkRXZlbnQgc2hvdWxkIGJlIHNldAotCSAqICAgICAgICAgICAgYXMgZm9sbG93czoKLQkgKiAKLQkgKiBldmVudC50eXBlID0gU1dULlRleHRSZXBsYWNlZCBldmVudC5zdGFydCA9IHN0YXJ0IG9mIHRoZSByZXBsYWNlZCB0ZXh0Ci0JICogZXZlbnQubnVtUmVwbGFjZWRMaW5lcyA9IG51bWJlciBvZiByZXBsYWNlZCBsaW5lcyBldmVudC5udW1OZXdMaW5lcyA9Ci0JICogbnVtYmVyIG9mIG5ldyBsaW5lcyBldmVudC5yZXBsYWNlZExlbmd0aCA9IGxlbmd0aCBvZiB0aGUgcmVwbGFjZWQgdGV4dAotCSAqIGV2ZW50Lm5ld0xlbmd0aCA9IGxlbmd0aCBvZiB0aGUgbmV3IHRleHQKLQkgKiAKLQkgKiBOT1RFOiBudW1OZXdMaW5lcyBpcyB0aGUgbnVtYmVyIG9mIGluc2VydGVkIGxpbmVzIGFuZCBudW1SZXBsYWNlZExpbmVzCi0JICogaXMgdGhlIG51bWJlciBvZiBkZWxldGVkIGxpbmVzIGJhc2VkIG9uIHRoZSBjaGFuZ2UgdGhhdCBvY2N1cnMKLQkgKiB2aXN1YWxseS4gRm9yIGV4YW1wbGU6Ci0JICogCi0JICogcmVwbGFjZWRUZXh0IG5ld1RleHQgbnVtUmVwbGFjZWRMaW5lcyBudW1OZXdMaW5lcyAiIiAiXG4iIDAgMSAiXG5cbiIKLQkgKiAiYSIgMiAwICJhIiAiXG5cbiIgMCAyCi0JICovCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW4gdGVybXMgb2YgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IHBvcywgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGxlbmd0aCA9PSAwICYmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSkKLQkJCXJldHVybiByZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHBvcywgbGVuZ3RoLCB0ZXh0LCBnZXRNb2RpZmljYXRpb25TdGFtcCgpLCB0cnVlKTsKLQkJZWxzZQotCQkJcmV0dXJuIHJlcGxhY2VUZXh0KHJlcXVlc3RlciwgcG9zLCBsZW5ndGgsIHRleHQsIGdldE5leHRNb2RpZmljYXRpb25TdGFtcCgpLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IHN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyBjaGFuZ2VzLCBib29sZWFuIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MpIHsKLQkJbG9uZyBtb2RpZmljYXRpb25TdGFtcDsKLQkJCi0JCWlmIChyZXBsYWNlbWVudExlbmd0aCA9PSAwICYmIChjaGFuZ2VzID09IG51bGwgfHwgY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkKLQkJCW1vZGlmaWNhdGlvblN0YW1wID0gZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJZWxzZQotCQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBnZXROZXh0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCi0JCXJldHVybiByZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgbW9kaWZpY2F0aW9uU3RhbXAsIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MpOwotCX0KLQkKLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCByZXF1ZXN0ZXIsIGludCBzdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgY2hhbmdlcywgbG9uZyBtb2RpZmljYXRpb25TdGFtcCwgYm9vbGVhbiBpZ25vcmVSZWFkT25seVNldHRpbmdzKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50ID0gaW50ZXJuYWxSZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgbW9kaWZpY2F0aW9uU3RhbXAsIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MpOwotCQlyZXR1cm4gZXZlbnQ7Ci0JfQotCi0Jdm9pZCByZXNldFBhcnNlcihpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCUlUZXh0U3RvcmUgdGV4dFN0b3JlID0gZ2V0U3RvcmUoKTsKLQkJaWYgKHRleHRTdG9yZSBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkgewotCQkJQ2hhclNlcXVlbmNlUmVhZGVyIHN1YlNldFRleHRTdG9yZVJlYWRlciA9IG5ldyBDaGFyU2VxdWVuY2VSZWFkZXIoKENoYXJTZXF1ZW5jZSkgdGV4dFN0b3JlLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCQkJcGFyc2VyLnJlc2V0KHN1YlNldFRleHRTdG9yZVJlYWRlciwgc3RhcnRPZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIG5ld05vZGVUZXh0ID0gZ2V0KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCk7Ci0JCQlwYXJzZXIucmVzZXQobmV3Tm9kZVRleHQsIHN0YXJ0T2Zmc2V0KTsKLQotCQl9Ci0KLQl9Ci0KLQl2b2lkIHJlc2V0UGFyc2VyKFJlYWRlciByZWFkZXIsIGludCBzdGFydE9mZnNldCkgewotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5yZXNldChyZWFkZXIsIHN0YXJ0T2Zmc2V0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3Jlc3VtZVBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpIHsKLQkJLS1mU3RvcHBlZENvdW50OwotCQlpZiAoZlN0b3BwZWRDb3VudCA9PSAwICYmIGZSZWVudHJhbmNlQ291bnQgPT0gMCkKLQkJCWV4ZWN1dGVQb3N0Tm90aWZpY2F0aW9uQ2hhbmdlcygpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MgaW4gMy4wIC0gdXNlIGEgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIKLQkgKiAgICAgICAgICAgICBkaXJlY3RseQotCSAqIEBzZWUgSURvY3VtZW50I3NlYXJjaAotCSAqLwotCXB1YmxpYyBpbnQgc2VhcmNoKGludCBzdGFydFBvc2l0aW9uLCBTdHJpbmcgZmluZFN0cmluZywgYm9vbGVhbiBmb3J3YXJkU2VhcmNoLCBib29sZWFuIGNhc2VTZW5zaXRpdmUsIGJvb2xlYW4gd2hvbGVXb3JkKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQkvLyAoZG13KSBJIGFkZGVkIHRoaXMgd2FybmluZywgdG8ga25vdyBpZiBzdGlsbCBiZWluZyB1c2VkLiBJJ20gbm90Ci0JCS8vIHN1cmUgaXQKLQkJLy8gd29ya3MgYXMgZXhwZWN0ZWQgYW55IGxvbmdlci4KLQkJLy8gYnV0IHRoZSB3YXJuaW5nIHNob3VsZCBiZSByZW1vdmVkLCBvbmNlIGtub3cuCi0JCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJXQVJOSU5HOiB1c2luZyB1bnN1cHBvcnRlZCBkZXByZWNhdGVkIG1ldGhvZCAnc2VhcmNoJyIpOyAvLyROT04tTkxTLTEkCi0JCWludCBvZmZzZXQgPSAtMTsKLQkJSVJlZ2lvbiBtYXRjaCA9IG5ldyBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcih0aGlzKS5maW5kKHN0YXJ0UG9zaXRpb24sIGZpbmRTdHJpbmcsIGZvcndhcmRTZWFyY2gsIGNhc2VTZW5zaXRpdmUsIHdob2xlV29yZCwgZmFsc2UpOwotCQlpZiAobWF0Y2ggIT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gbWF0Y2guZ2V0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNzZXRUZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGU6IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OnNldFRleHQoU3RyaW5nKSAuLi4uIGl0cyBiZXR0ZXIgdG8gdXNlIHNldFRleHQoc291cmNlLCBzdHJpbmcpIEFQSSBmb3Igc3RydWN0dXJlZERvY3VtZW50IHVwZGF0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldFRleHQobnVsbCwgc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1heSBiZSBtYXJrZWQgcHVibGljLCBidXQgc2hvdWxkIGJlIHBhY2thZ2VkIHByb3RlY3RlZCwgb25jZQotCSAqIHJlZmFjdG9yaW5nIGlzIGNvbXBsZXRlIChpbiBvdGhlciB3b3Jkcywgbm90IGZvciBjbGllbnQgdXNlKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWRSZWdpb24pIHsKLQkJaWYgKFVTRV9MT0NBTF9USFJFQUQpIHsKLQkJCWZDdXJyZW50RG9jdW1lbnRSZWdpb25DYWNoZS5zZXQoc3RydWN0dXJlZFJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWNoZWREb2N1bWVudFJlZ2lvbiA9IHN0cnVjdHVyZWRSZWdpb247Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkb2N1bWVudCdzIHBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEBzZWUgSURvY3VtZW50UGFydGl0aW9uZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFBhcnRpdGlvbmVyKElEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKSB7Ci0JCXNldERvY3VtZW50UGFydGl0aW9uZXIoSURvY3VtZW50RXh0ZW5zaW9uMy5ERUZBVUxUX1BBUlRJVElPTklORywgcGFydGl0aW9uZXIpOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihTdHJpbmcgcGFydGl0aW9uaW5nLCBJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikgewotCQlpZiAocGFydGl0aW9uZXIgPT0gbnVsbCkgewotCQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmVycyAhPSBudWxsKSB7Ci0JCQkJZkRvY3VtZW50UGFydGl0aW9uZXJzLnJlbW92ZShwYXJ0aXRpb25pbmcpOwotCQkJCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMuc2l6ZSgpID09IDApCi0JCQkJCWZEb2N1bWVudFBhcnRpdGlvbmVycyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzID09IG51bGwpCi0JCQkJZkRvY3VtZW50UGFydGl0aW9uZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZEb2N1bWVudFBhcnRpdGlvbmVycy5wdXQocGFydGl0aW9uaW5nLCBwYXJ0aXRpb25lcik7Ci0JCX0KLQkJRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQodGhpcyk7Ci0JCWV2ZW50LnNldFBhcnRpdGlvbkNoYW5nZShwYXJ0aXRpb25pbmcsIDAsIGdldExlbmd0aCgpKTsKLQkJZmlyZURvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmdNZW1lbnRvKEVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8pIHsKLQkJdGhpcy5lbmNvZGluZ01lbWVudG8gPSBlbmNvZGluZ01lbWVudG87Ci0JfQotCi0Jdm9pZCBzZXRGaXJzdERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCWZpcnN0RG9jdW1lbnRSZWdpb24gPSByZWdpb247Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNzZXRJbml0aWFsTGluZURlbGltaXRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxMaW5lRGVsaW1pdGVyKFN0cmluZyBsaW5lRGVsaW1pdGVyKSB7Ci0JCS8vIG1ha2Ugc3VyZSBvdXIgcHJlZmVycmVkIGRlbGltaXRlciBpcwotCQkvLyBvbmUgb2YgdGhlIGxlZ2FsIG9uZXMKLQkJaWYgKFV0aWxpdGllcy5jb250YWluc1N0cmluZyhnZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCksIGxpbmVEZWxpbWl0ZXIpKSB7Ci0JCQlmSW5pdGlhbExpbmVEZWxpbWl0ZXI9IGxpbmVEZWxpbWl0ZXI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX0RPQ1VNRU5UKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJBdHRlbXB0IHRvIHNldCBsaW5lZGVsaW1pdGVyIHRvIG5vbi1sZWdhbCBkZWxpbWl0ZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlmSW5pdGlhbExpbmVEZWxpbWl0ZXIgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoUGxhdGZvcm0uUElfUlVOVElNRSwgUGxhdGZvcm0uUFJFRl9MSU5FX1NFUEFSQVRPUiwgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpLCBuZXcgSVNjb3BlQ29udGV4dFtdIHsgbmV3IEluc3RhbmNlU2NvcGUoKSB9KTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQl2b2lkIHNldExhc3REb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlsYXN0RG9jdW1lbnRSZWdpb24gPSByZWdpb247Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQjc2V0TGluZURlbGltaXRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmVEZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgewotCQlzZXRJbml0aWFsTGluZURlbGltaXRlcihkZWxpbWl0ZXIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRvY3VtZW50J3MgbGluZSB0cmFja2VyLiBNdXN0IGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0JICogdGhlIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSB0cmFja2VyCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQncyBsaW5lIHRyYWNrZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TGluZVRyYWNrZXIoSUxpbmVUcmFja2VyIHRyYWNrZXIpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbCh0cmFja2VyKTsKLQkJZlRyYWNrZXIgPSB0cmFja2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcnNlcihSZWdpb25QYXJzZXIgbmV3UGFyc2VyKSB7Ci0JCWludGVybmFsX3NldFBhcnNlcihuZXdQYXJzZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwb3NpdGlvbk1hbmFnZXIKLQkgKiAgICAgICAgICAgIFRoZSBwb3NpdGlvbk1hbmFnZXIgdG8gc2V0LgotCSAqLwotCS8vIFRPRE86IG1ha2UgcHJpdmF0ZSBpcyBuZWVkZWQsIGVsc2UgcmVtb3ZlCi0Jdm9pZCBzZXRQb3NpdGlvbk1hbmFnZXIoR2VuZXJpY1Bvc2l0aW9uTWFuYWdlciBwb3NpdGlvbk1hbmFnZXIpIHsKLQkJZlBvc2l0aW9uTWFuYWdlciA9IHBvc2l0aW9uTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZVBhcnNlcihJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdSZVBhcnNlcikgewotCQlmUmVQYXJzZXIgPSBuZXdSZVBhcnNlcjsKLQkJaWYgKGZSZVBhcnNlciAhPSBudWxsKSB7Ci0JCQlmUmVQYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW4gdGVybXMgb2YgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgc2V0VGV4dChPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgdGhlU3RyaW5nKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IHJlcGxhY2VUZXh0KHJlcXVlc3RlciwgMCwgZ2V0TGVuZ3RoKCksIHRoZVN0cmluZywgZ2V0TmV4dE1vZGlmaWNhdGlvblN0YW1wKCksIHRydWUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRvY3VtZW50J3MgdGV4dCBzdG9yZS4gTXVzdCBiZSBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLQkgKiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc3RvcmUKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCdzIHRleHQgc3RvcmUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VGV4dFN0b3JlKElUZXh0U3RvcmUgc3RvcmUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChzdG9yZSk7Ci0JCWZTdG9yZSA9IHN0b3JlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVuZG9NYW5hZ2VyKElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyKSB7Ci0KLQkJLy8gaWYgdGhlIHVuZG8gbWFuYWdlciBoYXMgYWxyZWFkeSBiZWVuIHNldCwgdGhlbgotCQkvLyBmYWlsIGZhc3QsIHNpbmNlIGNoYW5naW5nIHRoZSB1bmRvIG1hbmFnZXIgd2lsbCBsZWFkCi0JCS8vIHRvIHVudXN1YWwgcmVzdWx0cyAob3IgYXQgbGVhc3QgbG9zcyBvZiB1bmRvIHN0YWNrKS4KLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsICYmIGZVbmRvTWFuYWdlciAhPSB1bmRvTWFuYWdlcikgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBjaGFuZ2UgdW5kbyBtYW5hZ2VyIG9uY2UgaXRzIGJlZW4gc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCWZVbmRvTWFuYWdlciA9IHVuZG9NYW5hZ2VyOwotCQl9Ci0JfQotCi0KLQkvKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydFNlcXVlbnRpYWxSZXdyaXRlKGJvb2xlYW4gbm9ybWFsaXplZCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jc3RvcFBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKSB7Ci0JCSsrZlN0b3BwZWRDb3VudDsKLQl9Ci0KLQotCS8qCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BTZXF1ZW50aWFsUmV3cml0ZSgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ujc3ViU2VxdWVuY2UoaW50LCBpbnQpCi0JICovCi0JcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgYXJnMCwgaW50IGFyZzEpIHsKLQkJcmV0dXJuIGdldChhcmcwLCBhcmcxKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURlbGV0ZWRGaWVsZHMoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucyA9IGV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRSZWdpb25zLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gb2xkUmVnaW9ucy5pdGVtKGkpOwotCQkJc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLnNldERlbGV0ZWQodHJ1ZSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSByZS1wYXJzZXIuIE5vdGU6IHRoaXMgbWV0aG9kIG1heSBiZSAicHVibGljIiBidXQgc2hvdWxkIG9ubHkKLQkgKiBiZSBjYWxsZWQgYnkgcmUtcGFyc2VycyBpbiB0aGUgcmlnaHQgY2lyY3Vtc3RhbmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVEb2N1bWVudERhdGEoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlLCBTdHJpbmcgY2hhbmdlcykgewotCQlzdG9wUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQkJZ2V0U3RvcmUoKS5yZXBsYWNlKHN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UsIGNoYW5nZXMpOwotCQl0cnkgewotCQkJZ2V0VHJhY2tlcigpLnJlcGxhY2Uoc3RhcnQsIGxlbmd0aFRvUmVwbGFjZSwgY2hhbmdlcyk7Ci0JCX0KLQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIGJlIGltcG9zc2libGUgaGVyZSwgYnV0IHdpbGwgbG9nIGZvciBub3cKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKGZQb3NpdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlBvc2l0aW9uTWFuYWdlci51cGRhdGVQb3NpdGlvbnMobmV3IERvY3VtZW50RXZlbnQodGhpcywgc3RhcnQsIGxlbmd0aFRvUmVwbGFjZSwgY2hhbmdlcykpOwotCQl9Ci0JCWZNb2RpZmljYXRpb25TdGFtcCsrOwotCQlmTmV4dE1vZGlmaWNhdGlvblN0YW1wPSBNYXRoLm1heChmTW9kaWZpY2F0aW9uU3RhbXAsIGZOZXh0TW9kaWZpY2F0aW9uU3RhbXApOwotCQlyZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlLCBTdHJpbmcgY2hhbmdlcykgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlJU3RydWN0dXJlZFRleHRSZVBhcnNlciByZVBhcnNlciA9IGdldFJlUGFyc2VyKCk7Ci0JCS8vIGluaXRpYWxpemUgdGhlIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIHdpdGggdGhlIHN0YW5kYXJkIGRhdGEKLQkJLy8gdGhhdCdzCi0JCS8vIGFsd2F5cyBuZWVkZWQKLQkJcmVQYXJzZXIuaW5pdGlhbGl6ZShyZXF1ZXN0ZXIsIHN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UsIGNoYW5nZXMpOwotCQlyZXN1bHQgPSByZVBhcnNlci5yZXBhcnNlKCk7Ci0JCS8vIGlmIHJlc3VsdCBpcyBudWxsIGF0IHRoaXMgcG9pbnQsIHRoZW4gdGhlcmUgbXVzdCBiZSBhbiBlcnJvciwgc2luY2UKLQkJLy8gZXZlbiBpZiB0aGVyZQotCQkvLyB3YXMgbm8gY2hhbmdlIChlaXRoZXIgZGlzYWxsb3cgZHVlIHRvIHJlYWRvbmx5LCBvciBhIHBlcnNvbiBwYXN0ZWQKLQkJLy8gdGhlIHNhbWUgdGhpbmcKLQkJLy8gdGhleSBoYWQgc2VsZWN0ZWQpIHRoZW4gYSAiTm9DaGFuZ2UiIGV2ZW50IHNob3VsZCBoYXZlIGJlZW4gZmlyZWQuCi0JCUFzc2VydC5pc05vdE51bGwocmVzdWx0LCAibm8gc3RydWN0dXJlZERvY3VtZW50IGV2ZW50IHdhcyBjcmVhdGVkIGluIElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OnVwZGF0ZVN0cnVjdHVyZWREb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudCNnZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0TGluZURlbGltaXRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQjc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIoU3RyaW5nIHByb2JhYmxlTGluZURlbGltaXRlcikgewotCQlzZXRJbml0aWFsTGluZURlbGltaXRlcihwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpOwotCi0JfQotCi0KLQkvKioKLQkgKiBDbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZSByZXdyaXRhYmxlIHNlc3Npb24gZm9yIHRoZSBTU0UuCi0JICogCi0JICovCi0Jc3RhdGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJld3JpdGVTZXNzaW9uIGV4dGVuZHMgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiB7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgc2Vzc2lvbi4KLQkJICogCi0JCSAqIEBwYXJhbSBzZXNzaW9uVHlwZQotCQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoaXMgc2Vzc2lvbgotCQkgKi8KLQkJcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudFJld3JpdGVTZXNzaW9uKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIHNlc3Npb25UeXBlKSB7Ci0JCQlzdXBlcihzZXNzaW9uVHlwZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNzdGFydFJld3JpdGVTZXNzaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUpCi0JICovCi0JcHVibGljIERvY3VtZW50UmV3cml0ZVNlc3Npb24gc3RhcnRSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCS8vIGRlbGVnYXRlIHRvIHN1Yi1jbGFzcywgc28gVUkgdGhyZWFkaW5nIGlzIGhhbmRsZWQgY29ycmVjdGx5Ci0JCXJldHVybiBpbnRlcm5hbFN0YXJ0UmV3cml0ZVNlc3Npb24oc2Vzc2lvblR5cGUpOwotCX0KLQotCS8qKgotCSAqIE5PVC1BUEkuIEZpbmFsIHByb3RlY3RlZCBzbyBjbGllbnRzIG1heSBjYWxsIHRoaXMgbWV0aG9kIGlmIG5lZWRlZCwgYnV0Ci0JICogY2Fubm90IG92ZXJyaWRlLgotCSAqIAotCSAqIEBwYXJhbSBzZXNzaW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCBEb2N1bWVudFJld3JpdGVTZXNzaW9uIGludGVybmFsU3RhcnRSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpICE9IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhbHJlYWR5IGluIGEgcmV3cml0ZSBzZXNzaW9uIik7Ci0KLQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzZXNzaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJld3JpdGVTZXNzaW9uKHNlc3Npb25UeXBlKTsKLQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50IGV2ZW50ID0gbmV3IERvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudCh0aGlzLCBzZXNzaW9uLCBEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQuU0VTU0lPTl9TVEFSVCk7Ci0JCWZpcmVEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQoZXZlbnQpOwotCi0JCUlMaW5lVHJhY2tlciB0cmFja2VyID0gZ2V0VHJhY2tlcigpOwotCQlpZiAodHJhY2tlciBpbnN0YW5jZW9mIElMaW5lVHJhY2tlckV4dGVuc2lvbikgewotCQkJSUxpbmVUcmFja2VyRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChJTGluZVRyYWNrZXJFeHRlbnNpb24pIHRyYWNrZXI7Ci0JCQlleHRlbnNpb24uc3RhcnRSZXdyaXRlU2Vzc2lvbihzZXNzaW9uKTsKLQkJfQotCi0JCXN0YXJ0UmV3cml0ZVNlc3Npb25PblBhcnRpdGlvbmVycyhzZXNzaW9uKTsKLQotCQlpZiAoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuU0VRVUVOVElBTCA9PSBzZXNzaW9uVHlwZSkKLQkJCXN0YXJ0U2VxdWVudGlhbFJld3JpdGUoZmFsc2UpOwotCQllbHNlIGlmIChEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5TVFJJQ1RMWV9TRVFVRU5USUFMID09IHNlc3Npb25UeXBlKQotCQkJc3RhcnRTZXF1ZW50aWFsUmV3cml0ZSh0cnVlKTsKLQotCQlmQWN0aXZlUmV3cml0ZVNlc3Npb24gPSBzZXNzaW9uOwotCQlyZXR1cm4gc2Vzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIGdpdmVuIHJld3JpdGUgc2Vzc2lvbi4KLQkgKgotCSAqIEBwYXJhbSBzZXNzaW9uIHRoZSByZXdyaXRlIHNlc3Npb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JZmluYWwgdm9pZCBzdGFydFJld3JpdGVTZXNzaW9uT25QYXJ0aXRpb25lcnMoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzZXNzaW9uKSB7Ci0JCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZT0gZkRvY3VtZW50UGFydGl0aW9uZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgcGFydGl0aW9uZXI9IGUubmV4dCgpOwotCQkJCWlmIChwYXJ0aXRpb25lciBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMykgewotCQkJCQlJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjMgZXh0ZW5zaW9uPSAoSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24zKSBwYXJ0aXRpb25lcjsKLQkJCQkJZXh0ZW5zaW9uLnN0YXJ0UmV3cml0ZVNlc3Npb24oc2Vzc2lvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzdG9wUmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzZXNzaW9uKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHN1Yi1jbGFzcywgc28gVUkgdGhyZWFkaW5nIGlzIGhhbmRsZWQgY29ycmVjdGx5Ci0JCWludGVybmFsU3RvcFJld3JpdGVTZXNzaW9uKHNlc3Npb24pOwotCX0KLQotCS8qKgotCSAqIE5PVC1BUEkuIEZpbmFsIHByb3RlY3RlZCBzbyBjbGllbnRzIG1heSBjYWxsIHRoaXMgbWV0aG9kIGlmIG5lZWRlZCwgYnV0Ci0JICogY2Fubm90IG92ZXJyaWRlLgotCSAqIAotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxTdG9wUmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzZXNzaW9uKSB7Ci0JCWlmIChmQWN0aXZlUmV3cml0ZVNlc3Npb24gPT0gc2Vzc2lvbikgewotCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUgc2Vzc2lvblR5cGUgPSBzZXNzaW9uLmdldFNlc3Npb25UeXBlKCk7Ci0JCQlpZiAoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuU0VRVUVOVElBTCA9PSBzZXNzaW9uVHlwZSB8fCBEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5TVFJJQ1RMWV9TRVFVRU5USUFMID09IHNlc3Npb25UeXBlKQotCQkJCXN0b3BTZXF1ZW50aWFsUmV3cml0ZSgpOwotCi0JCQlzdG9wUmV3cml0ZVNlc3Npb25PblBhcnRpdGlvbmVycyhzZXNzaW9uKTsKLQotCQkJSUxpbmVUcmFja2VyIHRyYWNrZXIgPSBnZXRUcmFja2VyKCk7Ci0JCQlpZiAodHJhY2tlciBpbnN0YW5jZW9mIElMaW5lVHJhY2tlckV4dGVuc2lvbikgewotCQkJCUlMaW5lVHJhY2tlckV4dGVuc2lvbiBleHRlbnNpb24gPSAoSUxpbmVUcmFja2VyRXh0ZW5zaW9uKSB0cmFja2VyOwotCQkJCWV4dGVuc2lvbi5zdG9wUmV3cml0ZVNlc3Npb24oc2Vzc2lvbiwgZ2V0KCkpOwotCQkJfQotCi0JCQlmQWN0aXZlUmV3cml0ZVNlc3Npb24gPSBudWxsOwotCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50IGV2ZW50ID0gbmV3IERvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudCh0aGlzLCBzZXNzaW9uLCBEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQuU0VTU0lPTl9TVE9QKTsKLQkJCWZpcmVEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcHMgdGhlIGdpdmVuIHJld3JpdGUgc2Vzc2lvbi4KLQkgKgotCSAqIEBwYXJhbSBzZXNzaW9uIHRoZSByZXdyaXRlIHNlc3Npb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JZmluYWwgdm9pZCBzdG9wUmV3cml0ZVNlc3Npb25PblBhcnRpdGlvbmVycyhEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24pIHsKLQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmVycyAhPSBudWxsKSB7Ci0JCQlEb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWRFdmVudCBldmVudD0gbmV3IERvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZEV2ZW50KHRoaXMpOwotCQkJSXRlcmF0b3IgZT0gZkRvY3VtZW50UGFydGl0aW9uZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgcGFydGl0aW9uaW5nPSAoU3RyaW5nKSBlLm5leHQoKTsKLQkJCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lcj0gKElEb2N1bWVudFBhcnRpdGlvbmVyKSBmRG9jdW1lbnRQYXJ0aXRpb25lcnMuZ2V0KHBhcnRpdGlvbmluZyk7Ci0JCQkJaWYgKHBhcnRpdGlvbmVyIGluc3RhbmNlb2YgSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24zKSB7Ci0JCQkJCUlEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMyBleHRlbnNpb249IChJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjMpIHBhcnRpdGlvbmVyOwotCQkJCQlleHRlbnNpb24uc3RvcFJld3JpdGVTZXNzaW9uKHNlc3Npb24pOwotCQkJCQlldmVudC5zZXRQYXJ0aXRpb25DaGFuZ2UocGFydGl0aW9uaW5nLCAwLCBnZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFldmVudC5pc0VtcHR5KCkpCi0JCQkJZmlyZURvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNnZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpCi0JICovCi0JcHVibGljIERvY3VtZW50UmV3cml0ZVNlc3Npb24gZ2V0QWN0aXZlUmV3cml0ZVNlc3Npb24oKSB7Ci0JCXJldHVybiBmQWN0aXZlUmV3cml0ZVNlc3Npb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjYWRkRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIoSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCQkJQXNzZXJ0LmlzTm90TnVsbChsaXN0ZW5lcik7Ci0JCQlpZiAoZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJCWZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCX0KLQkJCWlmICghZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQotCQkJCWZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNyZW1vdmVEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcihJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCUFzc2VydC5pc05vdE51bGwobGlzdGVuZXIpOwotCQkJaWYgKGZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXJzICE9IG51bGwpCi0JCQkJZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240I3JlcGxhY2UoaW50LCBpbnQsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQsIGxvbmcgbW9kaWZpY2F0aW9uU3RhbXApIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgbGVuZ3RoLCB0ZXh0LCBtb2RpZmljYXRpb25TdGFtcCwgdHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjc2V0KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgdGV4dCwgbG9uZyBtb2RpZmljYXRpb25TdGFtcCkgewotCQkvLyBidWcgMTUxMDY5IC0gb3ZlcndyaXRlIHJlYWQgb25seSByZWdpb25zIHdoZW4gc2V0dGluZyBlbnRpcmUgZG9jdW1lbnQKLQkJIHJlcGxhY2VUZXh0KG51bGwsIDAsIGdldExlbmd0aCgpLCB0ZXh0LCBtb2RpZmljYXRpb25TdGFtcCwgdHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKQotCSAqLwotCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQlyZXR1cm4gZk1vZGlmaWNhdGlvblN0YW1wOwotCX0KLQkKLQlwcml2YXRlIGxvbmcgZ2V0TmV4dE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQlpZiAoZk5leHRNb2RpZmljYXRpb25TdGFtcCA9PSBMb25nLk1BWF9WQUxVRSB8fCBmTmV4dE1vZGlmaWNhdGlvblN0YW1wID09IElEb2N1bWVudEV4dGVuc2lvbjQuVU5LTk9XTl9NT0RJRklDQVRJT05fU1RBTVApCi0JCQlmTmV4dE1vZGlmaWNhdGlvblN0YW1wPSAwOwotCQllbHNlCi0JCQlmTmV4dE1vZGlmaWNhdGlvblN0YW1wPSBmTmV4dE1vZGlmaWNhdGlvblN0YW1wICsgMTsKLQotCQlyZXR1cm4gZk5leHRNb2RpZmljYXRpb25TdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyBhbiBldmVudCwgYXMgc3BlY2lmaWVkLCB0byB0aGUgYXNzb2NpYXRlZCBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgZXZlbnQgdG8gZmlyZSwgZWl0aGVyIGEgc3RhcnQgb3Igc3RvcCBldmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZURvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudChmaW5hbCBEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXJzID09IG51bGwgfHwgZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lciBsID0gKElEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQlsLmRvY3VtZW50UmV3cml0ZVNlc3Npb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJLy8gbG9nZ2VkIGZvciB1cwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0Jhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiYTliMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChJbnRhbGlvKSAtIGJ1ZyAzMDA0MzAgLSBTdHJpbmcgY29uY2F0ZW5hdGlvbgotICogICAgIERhdmlkIENhcnZlciAoSW50YWxpbykgLSBidWcgMzAwNDI3IC0gQ29tcGFyaXNvbiBvZiBTdHJpbmcgT2JqZWN0cyA9PSBvciAhPQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLQotCi1wdWJsaWMgY2xhc3MgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TVE9SRV9OT1RfQVNTSUdORUQgPSAidGV4dCBzdG9yZSBub3QgYXNzaWduZWQgeWV0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRFRklORUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnN0cnVjdHVyZWREb2N1bWVudC5VTkRFRklORUQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElUZXh0UmVnaW9uTGlzdCBfcmVnaW9uczsKLQkvKioKLQkgKiBoYXMgdGhpcyByZWdpb24gYmVlbiByZW1vdmVkIGZyb20gaXRzIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBNQVNLX0lTX0RFTEVURUQgPSAxOwotCS8qKgotCSAqIHdhcyB0aGlzIHJlZ2lvbiB0ZXJtaW5hdGVkIG5vcm1hbGx5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBNQVNLX0lTX0VOREVEID0gMSA8PCAxOwotCi0JcHJpdmF0ZSBieXRlIGZJc0RlbGV0ZWRPckVuZGVkID0gMDsKLQotCS8qKgotCSAqIGFsbG93IGEgcG9pbnRlciBiYWNrIHRvIHRoaXMgbm9kZXMgbW9kZWwKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZlBhcmVudERvY3VtZW50OwotCQotCXByb3RlY3RlZCBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IHN0YXJ0OwotCi0JcHVibGljIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCQlfcmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCX0KLQotCS8qKgotCSAqIEV2ZW4gaW5zaWRlLXRoaXMgY2xhc3MgdXNlcyBvZiAncmVnaW9ucycgc2hvdWxkIHVzZSB0aGlzIG1ldGhvZCwgYXMKLQkgKiB0aGlzIGlzIHdoZXJlIChzb2Z0KSBtZW1vcnkgbWFuYWdlbWVudC9yZXBhcnNpbmcsIGV0Yy4sIHdpbGwgYmUKLQkgKiBjZW50cmFsaXplZC4KLQkgKi8KLQlwcml2YXRlIElUZXh0UmVnaW9uTGlzdCBfZ2V0UmVnaW9ucygpIHsKLQotCQlyZXR1cm4gX3JlZ2lvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVnaW9uKElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJX2dldFJlZ2lvbnMoKS5hZGQoYVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0KGludCBpKSB7Ci0JCXN0YXJ0ICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlzdGFydCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IGkpIHsKLQotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSA8PSBpICYmIGkgPCBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KGNvbnRhaW5lZFJlZ2lvbikgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IGdldEVuZE9mZnNldChjb250YWluZWRSZWdpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJc3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmQgYW5kIGdldEVuZE9mZnNldCBhcmUgdGhlIHNhbWUgb25seSBmb3IKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gc3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIGdldEVuZCBhbmQgZ2V0RW5kT2Zmc2V0IGFyZSB0aGUgc2FtZSBvbmx5IGZvcgotCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KGNvbnRhaW5lZFJlZ2lvbikgKyBjb250YWluZWRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCkgewotCQlpZiAoX2dldFJlZ2lvbnMoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBfZ2V0UmVnaW9ucygpLmdldCgwKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGdldFBhcmVudERvY3VtZW50KCkuZ2V0KHN0YXJ0LCBmTGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWludCByZWdpb25TdGFydCA9IGFSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCWludCByZWdpb25MZW5ndGggPSBhUmVnaW9uLmdldExlbmd0aCgpOwotCQkJcmVzdWx0ID0gZlBhcmVudERvY3VtZW50LmdldChzdGFydCArIHJlZ2lvblN0YXJ0LCByZWdpb25MZW5ndGgpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChTdHJpbmcgY29udGV4dCkgewotCQkvLyBETVc6IGxvb3BpbmcgaXMgZmFzdGVyIHRoYW4gZW51bWVyYXRpb24sCi0JCS8vIHNvIHN3aXRjaGVkIGFyb3VuZCAyLzEyLzAzCi0JCS8vIEVudW1lcmF0aW9uIGUgPSBnZXRSZWdpb25zKCkuZWxlbWVudHMoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGggPSBnZXRSZWdpb25zKCkuc2l6ZSgpOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHJlc3VsdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXJlZ2lvbiA9IGdldFJlZ2lvbnMoKS5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoY29udGV4dCkpCi0JCQkJc2IuYXBwZW5kKGdldEZ1bGxUZXh0KHJlZ2lvbikpOwotCQl9Ci0JCXJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCWlmIChfZ2V0UmVnaW9ucygpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIF9nZXRSZWdpb25zKCkuZ2V0KF9nZXRSZWdpb25zKCkuc2l6ZSgpIC0gMSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldE5leHQoKSB7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCkgewotCQlyZXR1cm4gX2dldFJlZ2lvbnMoKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0KLQkJcmV0dXJuIGZQYXJlbnREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2aW91cygpIHsKLQkJcmV0dXJuIHByZXZpb3VzOwotCX0KLQotCS8qKgotCSAqIFRoZSBwYXJhbWV0ZXIgb2Zmc2V0IHJlZmVycyB0byB0aGUgb3ZlcmFsbCBvZmZzZXQgaW4gdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCWlmIChfZ2V0UmVnaW9ucygpICE9IG51bGwpIHsKLQkJCWludCB0aGlzU3RhcnRPZmZzZXQgPSBnZXRTdGFydE9mZnNldCgpOwotCQkJaWYgKG9mZnNldCA8IHRoaXNTdGFydE9mZnNldCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWludCB0aGlzRW5kT2Zmc2V0ID0gZ2V0U3RhcnRPZmZzZXQoKSArIGdldExlbmd0aCgpOwotCQkJaWYgKG9mZnNldCA+IHRoaXNFbmRPZmZzZXQpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkvLyB0cmFuc2Zvcm0gdGhlIHJlcXVlc3RlZCBvZmZzZXQgdG8gdGhlICJzY2FsZSIgdGhhdAotCQkJLy8gcmVnaW9ucyBhcmUgc3RvcmVkIGluLCB3aGljaCBhcmUgYWxsIHJlbGF0aXZlIHRvIHRoZQotCQkJLy8gc3RhcnQgcG9pbnQuCi0JCQkvLyBpbnQgdHJhbnNmb3JtZWRPZmZzZXQgPSBvZmZzZXQgLSBnZXRTdGFydE9mZnNldCgpOwotCQkJLy8KLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZ2V0UmVnaW9ucygpOwotCQkJaW50IGxlbmd0aCA9IHJlZ2lvbnMuc2l6ZSgpOwotCQkJaW50IGxvdyA9IDA7Ci0JCQlpbnQgaGlnaCA9IGxlbmd0aDsKLQkJCWludCBtaWQgPSAwOwotCQkJLy8gQmluYXJ5IHNlYXJjaCBmb3IgdGhlIHJlZ2lvbgotCQkJd2hpbGUgKGxvdyA8IGhpZ2gpIHsKLQkJCQltaWQgPSBsb3cgKyAoKGhpZ2ggLSBsb3cpID4+IDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KG1pZCk7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVnaW9uKHMpIGluIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb246OmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0OiAiICsgcmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZXF1ZXN0ZWQgb2Zmc2V0OiAiICsgb2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiB0cmFuc2Zvcm1lZE9mZnNldDogIiArCi0JCQkJCS8vIHRyYW5zZm9ybWVkT2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gc3RhcnQ6ICIgKyByZWdpb24uZ2V0U3RhcnQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgcmVnaW9uIGVuZDogIiArIHJlZ2lvbi5nZXRFbmQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgcmVnaW9uIHR5cGU6ICIgKyByZWdpb24uZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gY2xhc3M6ICIgKyByZWdpb24uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCX0KLQkJCQkvLyBSZWdpb24gaXMgYmVmb3JlIHRoaXMgb25lCi0JCQkJaWYgKG9mZnNldCA8IHJlZ2lvbi5nZXRTdGFydCgpICsgdGhpc1N0YXJ0T2Zmc2V0KQotCQkJCQloaWdoID0gbWlkOwotCQkJCWVsc2UgaWYgKG9mZnNldCA+IChyZWdpb24uZ2V0RW5kKCkgKyB0aGlzU3RhcnRPZmZzZXQgLSAxKSkKLQkJCQkJbG93ID0gbWlkICsgMTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uTGlzdCBnZXRSZWdpb25zKCkgewotCQlyZXR1cm4gX2dldFJlZ2lvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTdGFydCBhbmQgZ2V0U3RhcnRPZmZzZXQgYXJlIHRoZSBzYW1lIG9ubHkgZm9yCi0JICogSVN0cnVjdXRyZWREb2N1bWVudFJlZ2lvbnMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnQgYW5kIGdldFN0YXJ0T2Zmc2V0IGFyZSB0aGUgc2FtZSBvbmx5IGZvcgotCSAqIElTdHJ1Y3V0cmVkRG9jdW1lbnRSZWdpb25zCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJLy8gYXNzZXJ0OiBjb250YWluZWRSZWdpb24gY2FuIG5vdCBiZSBudWxsCi0JCS8vIChtaWdodCBiZSBwZXJmb3JtYW5jZSBoaXQgaWYgbGl0ZXJhbGx5IHB1dCBpbiBhc3NlcnQgY2FsbCwKLQkJLy8gYnV0IGNvbnRhaW5lZFJlZ2lvbiBjYW4gbm90IGJlIG51bGwpLiBOZWVkcyB0byBiZSBjaGVja2VkCi0JCS8vIGJ5IGNhbGxpbmcgY29kZS4KLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgKyBjb250YWluZWRSZWdpb24uZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGZQYXJlbnREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQkJLy8gbGlrZWx5IHRvIGhhcHBlbiBkdXJpbmcgaW5zcGVjdGluZwotCQkJCXJlc3VsdCA9IFRFWFRfU1RPUkVfTk9UX0FTU0lHTkVEOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gZlBhcmVudERvY3VtZW50LmdldChzdGFydCwgZkxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQkvLyBhc3NlcnQ6IGFSZWdpb24gY2FuIG5vdCBiZSBudWxsCi0JCS8vIChtaWdodCBiZSBwZXJmb3JtYW5jZSBoaXQgaWYgbGl0ZXJhbGx5IHB1dCBpbiBhc3NlcnQgY2FsbCwKLQkJLy8gYnV0IGFSZWdpb24gY2FuIG5vdCBiZSBudWxsKS4gTmVlZHMgdG8gYmUgY2hlY2tlZAotCQkvLyBieSBjYWxsaW5nIGNvZGUuCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZlBhcmVudERvY3VtZW50LmdldCh0aGlzLmdldFN0YXJ0T2Zmc2V0KGFSZWdpb24pLCBhUmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgZmlyc3QgcmVnaW9uIHdpdGggdGhlIG1hdGNoaW5nIGNvbnRleHQgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChTdHJpbmcgY29udGV4dCkgewotCQkvLyBETVc6IGxvb3BpbmcgaXMgZmFzdGVyIHRoYW4gZW51bWVyYXRpb24sCi0JCS8vIHNvIHN3aXRjaGVkIGFyb3VuZCAyLzEyLzAzCi0JCS8vIEVudW1lcmF0aW9uIGUgPSBnZXRSZWdpb25zKCkuZWxlbWVudHMoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGggPSBnZXRSZWdpb25zKCkuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlyZWdpb24gPSBnZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKGNvbnRleHQpKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0VGV4dChyZWdpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gc3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBfZ2V0UmVnaW9ucygpLmdldChfZ2V0UmVnaW9ucygpLnNpemUoKSAtIDEpOwotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoY29udGFpbmVkUmVnaW9uKSArIGNvbnRhaW5lZFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgdHlwZSBvZiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIC4uLiBub3QgdG8gYmUgY29uZnVzZWQKLQkgKiB3aXRoIHR5cGUgb2YgWE1MIG5vZGUhIFRoaXMgaXMgc3ViY2xhc3NlZCwgaWYgc29tZXRoaW5nIG90aGVyIHRoYW4gdHlwZQotCSAqIG9mIGZpcnN0IHJlZ2lvbiBpcyBkZXNpcmVkLgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IFVOREVGSU5FRDsKLQkJSVRleHRSZWdpb25MaXN0IHN1YnJlZ2lvbnMgPSBnZXRSZWdpb25zKCk7Ci0JCWlmIChzdWJyZWdpb25zICE9IG51bGwgJiYgc3VicmVnaW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlJVGV4dFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IHN1YnJlZ2lvbnMuZ2V0KDApOwotCQkJaWYgKGZpcnN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBmaXJzdFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jaXNEZWxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7Ci0JCXJldHVybiAoZklzRGVsZXRlZE9yRW5kZWQgJiBNQVNLX0lTX0RFTEVURUQpICE9IDAgfHwgKGZQYXJlbnREb2N1bWVudCA9PSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZGVkKCkgewotCQlyZXR1cm4gKGZJc0RlbGV0ZWRPckVuZGVkICYgTUFTS19JU19FTkRFRCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiByZWdpb24gPT0gbnVsbCwgd2UgcmV0dXJuIGZhbHNlOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIGlmIHRoZSByZWdpb25zIGFyZSB0aGUgc2FtZSBpbnN0YW5jZSwgdGhleSBhcmUgZXF1YWwKLQkJCWlmICh0aGlzID09IHJlZ2lvbikgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBub24tdHJpdmlhbCBwYXJ0Ci0JCQkJLy8gbm90ZTogd2UgY2hhbmdlIGZvciB0eXBlIGZpcnN0LCB0aGVuIHN0YXJ0IG9mZnNldCBhbmQgZW5kCi0JCQkJLy8gb2Zmc2V0LAotCQkJCS8vIHNpbmNlIHRoYXQgd291bGQgZGVjaWRlIG1hbnkgY2FzZXMgcmlnaHQgYXdheSBhbmQgYXZvaWQgdGhlCi0JCQkJLy8gdGV4dCBjb21wYXJpc29uCi0JCQkJaWYgKGdldFR5cGUoKS5lcXVhbHMocmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJaWYgKHNhbWVPZmZzZXRzQXMocmVnaW9uLCBzaGlmdCkgJiYgc2FtZVRleHRBcyhyZWdpb24sIHNoaWZ0KSkgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdEb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgYW55IHJlZ2lvbiBpcyBudWxsLCB3ZSByZXR1cm4gZmFsc2UgKGV2ZW4gaWYgYm90aCBhcmUhKQotCQlpZiAoKG9sZFJlZ2lvbiAhPSBudWxsKSAmJiAobmV3UmVnaW9uICE9IG51bGwpKSB7Ci0JCQkvLyBpZiB0aGUgcmVnaW9ucyBhcmUgdGhlIHNhbWUgaW5zdGFuY2UsIHRoZXkgYXJlIGVxdWFsCi0JCQlpZiAob2xkUmVnaW9uID09IG5ld1JlZ2lvbikgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBub24tdHJpdmlhbCBwYXJ0Ci0JCQkJLy8gbm90ZTogd2UgY2hhbmdlIGZvciB0eXBlIGZpcnN0LCB0aGVuIHN0YXJ0IG9mZnNldCBhbmQgZW5kCi0JCQkJLy8gb2Zmc2V0LAotCQkJCS8vIHNpbmNlIHRoYXQgd291bGQgZGVjaWRlIG1hbnkgY2FzZXMgcmlnaHQgYXdheSBhbmQgYXZvaWQgdGhlCi0JCQkJLy8gdGV4dCBjb21wYXJpc29uCi0JCQkJaWYgKG9sZFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKG5ld1JlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJCWlmIChzYW1lT2Zmc2V0c0FzKG9sZFJlZ2lvbiwgbmV3RG9jdW1lbnRSZWdpb24sIG5ld1JlZ2lvbiwgc2hpZnQpKSB7Ci0JCQkJCQlpZiAoc2FtZVRleHRBcyhvbGRSZWdpb24sIG5ld0RvY3VtZW50UmVnaW9uLCBuZXdSZWdpb24sIHNoaWZ0KSkgewotCQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNhbWVPZmZzZXRzQXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQlpZiAoZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSAtIHNoaWZ0KSB7Ci0JCQlpZiAoZ2V0RW5kT2Zmc2V0KCkgPT0gcmVnaW9uLmdldEVuZE9mZnNldCgpIC0gc2hpZnQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNhbWVPZmZzZXRzQXMoSVRleHRSZWdpb24gb2xkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIGludCBzaGlmdCkgewotCQlpZiAoZ2V0U3RhcnRPZmZzZXQob2xkUmVnaW9uKSA9PSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChuZXdSZWdpb24pIC0gc2hpZnQpIHsKLQkJCWlmIChnZXRFbmRPZmZzZXQob2xkUmVnaW9uKSA9PSBkb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQobmV3UmVnaW9uKSAtIHNoaWZ0KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYW1lVGV4dEFzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChnZXRUZXh0KCkuZXF1YWxzKHJlZ2lvbi5nZXRUZXh0KCkpKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyBJU1NVRTogd2Ugc2hvdWxkIG5vdCBuZWVkIHRoaXMKLQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYW1lVGV4dEFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAoZ2V0VGV4dChvbGRSZWdpb24pLmVxdWFscyhkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5ld1JlZ2lvbikpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jc2V0RGVsZXRlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZChib29sZWFuIGlzRGVsZXRlZCkgewotCQlpZiAoaXNEZWxldGVkKQotCQkJZklzRGVsZXRlZE9yRW5kZWQgfD0gTUFTS19JU19ERUxFVEVEOwotCQllbHNlCi0JCQlmSXNEZWxldGVkT3JFbmRlZCAmPSB+TUFTS19JU19ERUxFVEVEOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdIYXNFbmQKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRlZChib29sZWFuIG5ld0hhc0VuZCkgewotCQlpZiAobmV3SGFzRW5kKQotCQkJZklzRGVsZXRlZE9yRW5kZWQgfD0gTUFTS19JU19FTkRFRDsKLQkJZWxzZQotCQkJZklzRGVsZXRlZE9yRW5kZWQgJj0gfk1BU0tfSVNfRU5ERUQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKLQkJLy8gdGV4dExlbmd0aCA9IG5ld0xlbmd0aDsKLQkJZkxlbmd0aCA9IG5ld0xlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3TmV4dCkgewotCQluZXh0ID0gbmV3TmV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZQYXJlbnREb2N1bWVudCA9IGRvY3VtZW50OwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdQcmV2aW91cykgewotCQlwcmV2aW91cyA9IG5ld1ByZXZpb3VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbnMoSVRleHRSZWdpb25MaXN0IGNvbnRhaW5lZFJlZ2lvbnMpIHsKLQkJX3JlZ2lvbnMgPSBjb250YWluZWRSZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBuZXdTdGFydCkgewotCQlzdGFydCA9IG5ld1N0YXJ0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCS8vIE5PVEU6IGlmIHRoZSBkb2N1bWVudCBoZWxkIGJ5IGFueSByZWdpb24gaGFzIGJlZW4gdXBkYXRlZCBhbmQgdGhlCi0JCS8vIHJlZ2lvbiBvZmZzZXRzIGhhdmUgbm90Ci0JCS8vIHlldCBiZWVuIHVwZGF0ZWQsIHRoZSBvdXRwdXQgZnJvbSB0aGlzIG1ldGhvZCBpbnZhbGlkLgotCQkvLyBBbHNvIG5vdGUsIHRoaXMgbWV0aG9kIGNhbiBub3QgYmUgY2hhbmdlZCwgd2l0aG91dCAiYnJlYWtpbmciCi0JCS8vIHVuaXQgdGVzdHMsIHNpbmNlIHNvbWUgb2YgdGhlbSBjb21wYXJlIGN1cnJlbnQgcmVzdWx0cyB0byBwcmV2aW91cwotCQkvLyByZXN1bHRzLgotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gIlsiICsgZ2V0U3RhcnQoKSArICIsICIgKyBnZXRFbmQoKSArICJdICgiICsgZ2V0VGV4dCgpICsgIikiOyAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURvd25TdHJlYW1SZWdpb25zKElUZXh0UmVnaW9uIGNoYW5nZWRSZWdpb24sIGludCBsZW5ndGhEaWZmZXJlbmNlKSB7Ci0JCWludCBsaXN0TGVuZ3RoID0gX2dldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCWludCBzdGFydEluZGV4ID0gMDsKLQkJLy8gZmlyc3QsIGxvb3AgdGhyb3VnaCB0byBmaW5kIGluZGV4IG9mIHdoZXJlIHRvIHN0YXJ0Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBfZ2V0UmVnaW9ucygpLmdldChpKTsKLQkJCWlmIChyZWdpb24gPT0gY2hhbmdlZFJlZ2lvbikgewotCQkJCXN0YXJ0SW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIG5vdywgYmVnaW5uaW5nIG9uZSBwYXN0IHRoZSBvbmUgdGhhdCB3YXMgY2hhbmdlZCwgbG9vcAotCQkvLyB0aHJvdWdoIHRvIGVuZCBvZiBsaXN0LCBhZGp1c3RpbmcgdGhlIHN0YXJ0IHBvc3Rpb25zLgotCQlzdGFydEluZGV4Kys7Ci0JCWZvciAoaW50IGogPSBzdGFydEluZGV4OyBqIDwgbGlzdExlbmd0aDsgaisrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBfZ2V0UmVnaW9ucygpLmdldChqKTsKLQkJCXJlZ2lvbi5hZGp1c3RTdGFydChsZW5ndGhEaWZmZXJlbmNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJLy8gR2V0IHRoZSByZWdpb24gcG9pbnRlZCB0byBieSB0aGUgcmVxdWVzdFN0YXJ0IHBvc3Rpb24sIGFuZCBnaXZlCi0JCS8vIHRoYXQgcmVnaW9uIGEgY2hhbmNlIHRvIGVmZmVjdAotCQkvLyB0aGUgdXBkYXRlLgotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChyZXF1ZXN0U3RhcnQpOwotCQkvLyBpZiB0aGVyZSBpcyBubyByZWdpb24sIHRoZW4gdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIG11c3QgY29tZSByaWdodAotCQkvLyBhZnRlciB0aGUKLQkJLy8gbm9kZSAoYW5kIHJpZ2h0IGFmdGVyIHRoZSBsYXN0IHJlZ2lvbikuIFRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsCi0JCS8vIHdoZW4gc29tZW9uZQotCQkvLyB0eXBlcyBzb21ldGhpbmcgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIG9yIG1vcmUgY29tbW9ubHksIHdoZW4KLQkJLy8gdGhleSBhcmUgcmlnaHQKLQkJLy8gYXQgdGhlIGJlZ2lubmluZyBvZiBvbmUgbm9kZSwgYW5kIHRoZSBkaXJ0eSBzdGFydCBpcyB0aGVyZWZvcmUKLQkJLy8gY2FsY3VsYXRlZCB0byBiZSB0aGUKLQkJLy8gcHJldmlvdXMgbm9kZS4KLQkJLy8gU28sIGluIHRoaXMgY2FzZSwgd2UnbGwgZ2l2ZSB0aGUgbGFzdCByZWdpb24gYSBjaGFuY2UgdG8gc2VlIGlmIGl0Ci0JCS8vIHdhbnRzIHRvCi0JCS8vIHN3YWxsb3cgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIC0tIGJ1dCBvbmx5IGZvciBpbnNlcnRzIC0tIGRlbGV0ZXMKLQkJLy8gYW5kICJyZXBsYWNlcyIKLQkJLy8gc2hvdWxkIGJlIHJlcGFyc2VkIGlmIHRoZXkgYXJlIGluIHRoZXNlIGJvcmRlciByZWdpb25zLCBhbmQgb25seSBpZgotCQkvLyB0aGUKLQkJaWYgKChyZWdpb24gPT0gbnVsbCkgJiYgKGxlbmd0aFRvUmVwbGFjZSA9PSAwKSkgewotCQkJcmVnaW9uID0gX2dldFJlZ2lvbnMoKS5nZXQoX2dldFJlZ2lvbnMoKS5zaXplKCkgLSAxKTsKLQkJCS8vIG1ha2Ugc3VyZSB0aGUgcmVnaW9uIGlzIGNvbnRpZ3VvdXMKLQkJCWlmIChnZXRFbmRPZmZzZXQocmVnaW9uKSA9PSByZXF1ZXN0U3RhcnQpIHsKLQkJCQlyZXN1bHQgPSByZWdpb24udXBkYXRlUmVnaW9uKHJlcXVlc3RlciwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJLy8KLQkJCQkvLyBJZiB0aGUgcmVxdWVzdGVkIGNoYW5nZSBzcGFucyBtb3JlIHRoYW4gb25lIHJlZ2lvbiwgdGhlbgotCQkJCS8vIHdlIGRvbid0IGdpdmUgdGhlIHJlZ2lvbiBhIGNoYW5jZSB0byB1cGRhdGUuCi0JCQkJaWYgKChjb250YWluc09mZnNldChyZWdpb24sIHJlcXVlc3RTdGFydCkpICYmIChjb250YWluc09mZnNldChyZWdpb24sIHJlcXVlc3RTdGFydCArIGxlbmd0aFRvUmVwbGFjZSkpKSB7Ci0JCQkJCXJlc3VsdCA9IHJlZ2lvbi51cGRhdGVSZWdpb24ocmVxdWVzdGVyLCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGlmIHJlc3VsdCBpcyBub3QgbnVsbCwgdGhlbiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3RhcnQgYW5kIGVuZAotCQkvLyBwb3N0aW9ucyBvZiB0aGUgcmVnaW9ucyB0aGF0IGZvbGxvdyB0aGlzIG9uZQotCQkvLyBpZiByZXN1bHQgaXMgbnVsbCwgdGhlbiBhcHBseSB0aGUgZmxhdG5vZGUgc3BlY2lmaWMgY2hlY2tzIG9uIHdoYXQKLQkJLy8gaXQgY2FuIGNoYW5nZQotCQkvLyAoaS5lLiBtb3JlIHRoYW4gb25lIHJlZ2lvbiwgYnV0IG5vIGNoYW5nZSB0byB0aGUgbm9kZSBpdHNlbGYpCi0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJLy8gVGhhdCBpcywgYSByZWdpb24gZGVjaWRlZCBpdCBjb3VsZCBoYW5kbGUgdGhlIGNoYW5nZSBhbmQKLQkJCS8vIGNyZWF0ZWQKLQkJCS8vIGEgcmVnaW9uIGNoYW5nZWQgZXZlbnQuCi0JCQlBc3NlcnQuaXNUcnVlKHJlc3VsdCBpbnN0YW5jZW9mIFJlZ2lvbkNoYW5nZWRFdmVudCwgIlByb2dyYW0gRXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJdXBkYXRlRG93blN0cmVhbVJlZ2lvbnMoKChSZWdpb25DaGFuZ2VkRXZlbnQpIHJlc3VsdCkuZ2V0UmVnaW9uKCksIGxlbmd0aERpZmZlcmVuY2UpOwotCQkJLy8gUExVUywgd2UgbmVlZCB0byB1cGRhdGUgb3VyIG93biBub2RlIGVuZCBwb2ludCAobGVuZ3RoKQotCQkJc2V0TGVuZ3RoKGdldExlbmd0aCgpICsgbGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NoYXJTZXF1ZW5jZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NoYXJTZXF1ZW5jZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWIyOWI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9DaGFyU2VxdWVuY2VSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotcHVibGljIGNsYXNzIENoYXJTZXF1ZW5jZVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0JcHJpdmF0ZSBpbnQgZkN1cnJlbnRQb3NpdGlvbjsKLQlwcml2YXRlIGludCBmTWF4aW11bVJlYWRPZmZzZXQ7Ci0KLQlwcml2YXRlIENoYXJTZXF1ZW5jZSBmT3JpZ2luYWxTb3VyY2U7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JQ2hhclNlcXVlbmNlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIENoYXJTZXF1ZW5jZVJlYWRlcihDaGFyU2VxdWVuY2Ugb3JpZ2luYWxTb3VyY2UsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJLy8gSVNTVUU6IHNob3VsZCB3ZSAiZmFpbCBmYXN0IiBpZiByZXF1ZXN0ZWQgbGVuZ3RoIGlzIG1vcmUgdGhhbiB0aGVyZQotCQkvLyBpcz8KLQkJZk9yaWdpbmFsU291cmNlID0gb3JpZ2luYWxTb3VyY2U7Ci0JCWludCBzdGFydE9mZnNldCA9IG9mZnNldDsKLQkJaW50IG1heFJlcXVlc3RlZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoOwotCQlpbnQgbWF4UG9zc2libGVPZmZzZXQgPSAwICsgb3JpZ2luYWxTb3VyY2UubGVuZ3RoKCk7Ci0JCWZNYXhpbXVtUmVhZE9mZnNldCA9IE1hdGgubWluKG1heFJlcXVlc3RlZE9mZnNldCwgbWF4UG9zc2libGVPZmZzZXQpOwotCi0JCWZDdXJyZW50UG9zaXRpb24gPSBzdGFydE9mZnNldDsKLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsb2NrT2JqZWN0Ci0JICovCi0JQ2hhclNlcXVlbmNlUmVhZGVyKE9iamVjdCBsb2NrT2JqZWN0KSB7Ci0JCXN1cGVyKGxvY2tPYmplY3QpOwotCQkvLyBmb3IgdGhyZWFkIHNhZmV0eSwgbWF5IG5lZWQgdG8gYWRkIGJhY2sgbG9ja2luZyBtZWNoYW5pc20KLQkJLy8gaW4gb3VyIGN1c3RvbSBjb25zdHJ1Y3Rvci4gVGhpcyBjb25zdHJ1Y3RvciBsZWZ0IGhlcmUganVzdAotCQkvLyBmb3IgYSByZW1pbmRlci4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gd2hlbiB3ZSBjbG9zZQotCQkvLyAobWF5IGJlIHRvIGV2ZW50dWFsbHkgInVubG9jayIgb3IgbnVsbCBvdXQgc29tZSB2YXJpYmxlcwotCQkvLyBqdXN0IGZvciBoeWdlbmUuCi0JCS8vIG9yLCBwZXJoYXBzIGlmIGFscmVhZHkgY2xvc2VkIG9uY2UgdGhyb3cgSU9FeGNlcHRpb24/IGZvcgotCQkvLyBjb25zaXN0ZW5jeT8KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9yaWdpbmFsU291cmNlLgotCSAqIEBkZXByZWNhdGVkIC0gb25seSB0ZW1wb3JhcmlseSBwdWJsaWMsIHNob3VsZCBiZSAnZGVmYXVsdCcgZXZlbnR1YWxseQotCSAqICAgICAgICAgICAgIG9yIGdvIGF3YXkgYWx0b2dldGhlci4KLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIGdldE9yaWdpbmFsU291cmNlKCkgewotCQlyZXR1cm4gZk9yaWdpbmFsU291cmNlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpZiAoZkN1cnJlbnRQb3NpdGlvbiA8IGZNYXhpbXVtUmVhZE9mZnNldCkgewotCQkJcmVzdWx0ID0gZk9yaWdpbmFsU291cmNlLmNoYXJBdChmQ3VycmVudFBvc2l0aW9uKyspOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVhZCBjaGFyYWN0ZXJzIGludG8gYSBwb3J0aW9uIG9mIGFuIGFycmF5LiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrCi0JICogdW50aWwgc29tZSBpbnB1dCBpcyBhdmFpbGFibGUsIGFuIEkvTyBlcnJvciBvY2N1cnMsIG9yIHRoZSBlbmQgb2YgdGhlCi0JICogc3RyZWFtIGlzIHJlYWNoZWQuCi0JICogCi0JICogQHBhcmFtIGNidWYKLQkgKiAgICAgICAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlcgotCSAqIEBwYXJhbSBvZmYKLQkgKiAgICAgICAgICAgIE9mZnNldCBhdCB3aGljaCB0byBzdGFydCBzdG9yaW5nIGNoYXJhY3RlcnMKLQkgKiBAcGFyYW0gbGVuCi0JICogICAgICAgICAgICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KLQkgKiAgICAgICAgIGhhcyBiZWVuIHJlYWNoZWQKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotCSAqLwotCi0JcHVibGljIGludCByZWFkKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgY2hhcnNUb1JlYWQgPSAtMTsKLQkJLy8gaWYgYWxyZWFkeSBvdmVyIG1heCwganVzdCByZXR1cm4gLTEKLQkJLy8gcmVtZW1iZXIsIGN1cnJlbnRQb3NpdGlvbiBpcyB3aGF0IGlzIGdldHRpbmcgcmVhZHkgdG8gYmUgcmVhZAotCQkvLyAodGhhdCBpcywgaXRzIGFscmVhZHkgYmVlbiBpbmNyZW1lbnRlZCBpbiByZWFkKCkpLgotCQlpZiAoZkN1cnJlbnRQb3NpdGlvbiA8IGZNYXhpbXVtUmVhZE9mZnNldCkgewotCi0KLQkJCWludCBidWZmTWF4VG9SZWFkID0gY2J1Zi5sZW5ndGggLSBvZmY7Ci0JCQlpbnQgbWluUmVxdWVzdGVkID0gTWF0aC5taW4oYnVmZk1heFRvUmVhZCwgbGVuKTsKLQkJCWludCBsZW5ndGhSZW1haW5pbmcgPSBmTWF4aW11bVJlYWRPZmZzZXQgLSBmQ3VycmVudFBvc2l0aW9uOwotCQkJY2hhcnNUb1JlYWQgPSBNYXRoLm1pbihtaW5SZXF1ZXN0ZWQsIGxlbmd0aFJlbWFpbmluZyk7Ci0KLQotCQkJQ2hhclNlcXVlbmNlIHNlcSA9IGZPcmlnaW5hbFNvdXJjZS5zdWJTZXF1ZW5jZShmQ3VycmVudFBvc2l0aW9uLCBmQ3VycmVudFBvc2l0aW9uICsgY2hhcnNUb1JlYWQpOwotCQkJLy8gZm9yIG5vdywgaGFyZCBhc3N1bXB0aW9uIHRoYXQgb3JpZ2luYWwgaXMgYSBTdHJpbmcgc2luY2Ugc291cmNlCi0JCQkvLyBpcyBhc3N1bWVkIHRvIGJlIGRvY3VtZW50LCBvciB0ZXh0IHN0b3JlCi0JCQlTdHJpbmcgc2VxU3RyaW5nID0gKFN0cmluZykgc2VxOwotCQkJc2VxU3RyaW5nLmdldENoYXJzKDAsIHNlcVN0cmluZy5sZW5ndGgoKSwgY2J1Ziwgb2ZmKTsKLQotCi0KLQkJCWZDdXJyZW50UG9zaXRpb24gPSBmQ3VycmVudFBvc2l0aW9uICsgY2hhcnNUb1JlYWQ7Ci0KLQotCQl9Ci0JCXJldHVybiBjaGFyc1RvUmVhZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQ29yZU5vZGVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQ29yZU5vZGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhY2Q5MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NvcmVOb2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBDb3JlTm9kZUxpc3QgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCB7Ci0JaW50IGNvdW50ZWRMZW5ndGg7Ci0JaW50IGN1cnJlbnRJbmRleCA9IC0xOwotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIGZsYXROb2RlczsKLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWQ7Ci0KLQkvKioKLQkgKiBDb3JlTm9kZUxpc3QgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29yZU5vZGVMaXN0KCkgewotCQlzdXBlcigpOwotCQkvLyBjcmVhdGUgYW4gYXJyYXksIGV2ZW4gaWYgemVybyBsZW5ndGgKLQkJZmxhdE5vZGVzID0gbmV3IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bMF07Ci0JfQotCi0JcHVibGljIENvcmVOb2RlTGlzdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld0hlYWQpIHsKLQkJc3VwZXIoKTsKLQkJLy8gc2F2ZSBoZWFkCi0JCWhlYWQgPSBuZXdIZWFkOwotCQlpbnQgY291bnQgPSAwOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvdW50Tm9kZSA9IG5ld0hlYWQ7Ci0JCS8vIHdlIGhhdmUgdG8gZ28gdGhyb3VnaCB0aGUgbGlzdCBvbmNlLCB0byBnZXQgaXRzCi0JCS8vIGxlbmd0aCBpbiBvcmRlciB0byBjcmVhdGUgdGhlIGFycmF5Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gbnVsbCkgewotCQkJY291bnQrKzsKLQkJCWNvdW50Tm9kZSA9IGNvdW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJLy8gY3JlYXRlIGFuIGFycmF5LCBldmVuIGlmIHplcm8gbGVuZ3RoCi0JCWZsYXROb2RlcyA9IG5ldyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW2NvdW50XTsKLQkJLy8gc3RhcnQgY291bnROb2RlIG92ZXIgYWdhaW4sIHNvIHRvIHNwZWFrLgotCQljb3VudE5vZGUgPSBuZXdIZWFkOwotCQljb3VudCA9IDA7Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gbnVsbCkgewotCQkJZmxhdE5vZGVzW2NvdW50KytdID0gY291bnROb2RlOwotCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlpZiAoY291bnQgPiAwKSB7Ci0JCQljdXJyZW50SW5kZXggPSAwOwotCQkJLy8gZWxzZSBpdCBzdGF5cyBhdCAtMSBpbml0aWFsaXplZCBhdCBvYmplY3QgY3JlYXRpb24KLQkJCS8vCi0JCQkvLyBzYXZlIGxlbmd0aAotCQkJY291bnRlZExlbmd0aCA9IGNvdW50OwotCQl9Ci0JfQotCi0JcHVibGljIENvcmVOb2RlTGlzdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZCkgewotCQlzdXBlcigpOwotCQkvLyBzYXZlIGhlYWQKLQkJaGVhZCA9IHN0YXJ0OwotCQlpbnQgY291bnQgPSAwOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvdW50Tm9kZSA9IHN0YXJ0OwotCQlpZiAoKHN0YXJ0ID09IG51bGwpIHx8IChlbmQgPT0gbnVsbCkpIHsKLQkJCS8vIGVycm9yIGNvbmRpdGlvbgotCQkJLy90aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNdXN0IHByb3ZpZGUgc3RhcnQgYW5kIGVuZAotCQkJLy8gbm9kZXMgdG8gY29uc3RydWN0IENvcmVOb2RlTGlzdCIpOwotCQl9IGVsc2UgewotCQkJY291bnQgPSAxOwotCQkJd2hpbGUgKChjb3VudE5vZGUgIT0gbnVsbCkgJiYgKGNvdW50Tm9kZSAhPSBlbmQpKSB7Ci0JCQkJY291bnQrKzsKLQkJCQljb3VudE5vZGUgPSBjb3VudE5vZGUuZ2V0TmV4dCgpOwotCQkJfQotCQl9Ci0JCS8vIGlmIHdlIGVuZGVkIGJlY2F1c2UgdGhlIGxhc3Qgb25lIHdhcyBudWxsLAotCQkvLyBiYWNrdXAgb25lLgotCQlpZiAoY291bnROb2RlID09IG51bGwpCi0JCQljb3VudC0tOwotCQlpZiAoY291bnQgPCAwKSB7Ci0JCQljb3VudCA9IDA7Ci0JCX0KLQkJZmxhdE5vZGVzID0gbmV3IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bY291bnRdOwotCQlpZiAoY291bnQgPiAwKSB7Ci0JCQlmbGF0Tm9kZXNbMF0gPSBjb3VudE5vZGUgPSBzdGFydDsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDwgY291bnQ7IGkrKykgewotCQkJCWZsYXROb2Rlc1tpXSA9IGZsYXROb2Rlc1tpIC0gMV0uZ2V0TmV4dCgpOwotCQkJfQotCi0JCX0KLQkJY3VycmVudEluZGV4ID0gMDsKLQkJY291bnRlZExlbmd0aCA9IGNvdW50OwotCX0KLQotCXB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKChmbGF0Tm9kZXMgIT0gbnVsbCkgJiYgKGZsYXROb2Rlcy5sZW5ndGggPiAwKSkKLQkJCXJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbihmbGF0Tm9kZXNbMF0sIGZsYXROb2Rlc1tmbGF0Tm9kZXMubGVuZ3RoIC0gMV0pOwotCQllbHNlCi0JCQlyZXN1bHQgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24obnVsbCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmbGF0Tm9kZXMubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzKE9iamVjdCBvKSB7Ci0JCWlmIChmbGF0Tm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGF0Tm9kZXMubGVuZ3RoOyBpKyspCi0JCQlpZiAoZmxhdE5vZGVzW2ldID09IG8pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpdGVtKGludCBpKSB7Ci0JCXJldHVybiBmbGF0Tm9kZXNbaV07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0RlbGV0ZUVxdWFsUG9zaXRpb25VcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvRGVsZXRlRXF1YWxQb3NpdGlvblVwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzNzgzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvRGVsZXRlRXF1YWxQb3NpdGlvblVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRQb3NpdGlvblVwZGF0ZXI7Ci0KLS8qKgotICogRm9sbG93cyB0aGUgYmVoYXZpb3Igb2YgRGVmYXVsdFBvc2l0aW9uVXBkYXRlciBleGNlcHQgaW4gYWRkaXRpb24gdG8KLSAqIGRlbGV0aW5nL292ZXJ3cml0aW5nIHRleHQgd2hpY2ggY29tcGxldGVseSBjb250YWlucyB0aGUgcG9zaXRpb24gZGVsZXRlcwotICogdGhlIHBvc2l0aW9uLCBkZWxldGluZyB0ZXh0IHRoYXQgZXF1YWxzIHRoZSB0ZXh0IGluIHBvc2l0aW9uIGFsc28gZGVsZXRlcwotICogdGhlIHBvc2l0aW9uLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdFBvc2l0aW9uVXBkYXRlcgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlRXF1YWxQb3NpdGlvblVwZGF0ZXIgZXh0ZW5kcyBEZWZhdWx0UG9zaXRpb25VcGRhdGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqLwotCXB1YmxpYyBEZWxldGVFcXVhbFBvc2l0aW9uVXBkYXRlcihTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJc3VwZXIoY2F0ZWdvcnkpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudGx5IGludmVzdGlnYXRlZCBwb3NpdGlvbiBoYXMgYmVlbiBkZWxldGVkCi0JICogYnkgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uIHNwZWNpZmllZCBpbiB0aGUgY3VycmVudCBldmVudC4gSWYgc28sIGl0Ci0JICogZGVsZXRlcyB0aGUgcG9zaXRpb24gYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgZG9jdW1lbnQncyBwb3NpdGlvbgotCSAqIGNhdGVnb3J5LgotCSAqIAotCSAqIE5PVEU6IHBvc2l0aW9uIGlzIGRlbGV0ZWQgaWYgY3VycmVudCBldmVudCBjb21wbGV0ZWx5IG92ZXJ3cml0ZXMKLQkgKiBwb3NpdGlvbiBPUiBpZiBjdXJyZW50IGV2ZW50IGRlbGV0ZXMgdGhlIGFyZWEgc3Vycm91bmRpbmcvaW5jbHVkaW5nIHRoZQotCSAqIHBvc2l0aW9uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwb3NpdGlvbiBoYXMgYmVlbiBkZWxldGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm90RGVsZXRlZCgpIHsKLQkJLy8gcG9zaXRpb24gaXMgZGVsZXRlZCBpZiBjdXJyZW50IGV2ZW50IGNvbXBsZXRlbHkgb3ZlcndyaXRlcyBwb3NpdGlvbgotCQkvLyBPUiBpZgotCQkvLyBjdXJyZW50IGV2ZW50IGRlbGV0ZXMgdGhlIGFyZWEgc3Vycm91bmRpbmcvaW5jbHVkaW5nIHRoZSBwb3NpdGlvbgotCQlpZiAoKGZPZmZzZXQgPCBmUG9zaXRpb24ub2Zmc2V0ICYmIChmUG9zaXRpb24ub2Zmc2V0ICsgZlBvc2l0aW9uLmxlbmd0aCA8IGZPZmZzZXQgKyBmTGVuZ3RoKSkgfHwgKGZPZmZzZXQgPD0gZlBvc2l0aW9uLm9mZnNldCAmJiAoZlBvc2l0aW9uLm9mZnNldCArIGZQb3NpdGlvbi5sZW5ndGggPD0gZk9mZnNldCArIGZMZW5ndGgpICYmIGZSZXBsYWNlTGVuZ3RoID09IDApKSB7Ci0KLQkJCWZQb3NpdGlvbi5kZWxldGUoKTsKLQotCQkJdHJ5IHsKLQkJCQlmRG9jdW1lbnQucmVtb3ZlUG9zaXRpb24oZ2V0Q2F0ZWdvcnkoKSwgZlBvc2l0aW9uKTsKLQkJCX0gY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24geCkgewotCQkJfQotCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9HZW5lcmljUG9zaXRpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvR2VuZXJpY1Bvc2l0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTQyMmEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9HZW5lcmljUG9zaXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0UG9zaXRpb25VcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklQb3NpdGlvblVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogQmFzZWQgb24gdGhlIFBvc2l0aW9uIG1hbmFnZW1lbnQgbWV0aG9kcyBmcm9tCi0gKiBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFic3RyYWN0RG9jdW1lbnQKLSAqLwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZkNoYXJTZXF1ZW5jZTsKLQotCi0KLQlwcml2YXRlIE1hcCBmUG9zaXRpb25zOwotCS8qKiBBbGwgcmVnaXN0ZXJlZCBkb2N1bWVudCBwb3NpdGlvbiB1cGRhdGVycyAqLwotCXByaXZhdGUgTGlzdCBmUG9zaXRpb25VcGRhdGVyczsKLQotCS8qKgotCSAqIGRvbid0IGFsbG93IGluc3RhbnRpYXRpb24gd2l0aCBvdXQgZG9jdW1lbnQgcG9pbnRlcgotCSAqIAotCSAqLwotCXByaXZhdGUgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlcihDaGFyU2VxdWVuY2UgY2hhclNlcXVlbmNlKSB7Ci0JCXRoaXMoKTsKLQkJLy8gd2Ugb25seSB1c2UgY2hhclNlcXVlbmNlIGZvciAibGVuZ3RoIiwgdG8KLQkJLy8gbWFkZSBtb3JlIGdlbmVyaWMgdGhhbiAiZG9jdW1lbnQiIGV2ZW4gInRleHQgc3RvcmUiCi0JCWZDaGFyU2VxdWVuY2UgPSBjaGFyU2VxdWVuY2U7Ci0JCWNvbXBsZXRlSW5pdGlhbGl6YXRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjYWRkUG9zaXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWFkZFBvc2l0aW9uKElEb2N1bWVudC5ERUZBVUxUX0NBVEVHT1JZLCBwb3NpdGlvbik7Ci0JCX0KLQkJY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNhZGRQb3NpdGlvbihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQotCQlpZiAoKDAgPiBwb3NpdGlvbi5vZmZzZXQpIHx8ICgwID4gcG9zaXRpb24ubGVuZ3RoKSB8fCAocG9zaXRpb24ub2Zmc2V0ICsgcG9zaXRpb24ubGVuZ3RoID4gZ2V0RG9jdW1lbnRMZW5ndGgoKSkpCi0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJTGlzdCBsaXN0ID0gKExpc3QpIGZQb3NpdGlvbnMuZ2V0KGNhdGVnb3J5KTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJbGlzdC5hZGQoY29tcHV0ZUluZGV4SW5Qb3NpdGlvbkxpc3QobGlzdCwgcG9zaXRpb24ub2Zmc2V0KSwgcG9zaXRpb24pOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNhZGRQb3NpdGlvbkNhdGVnb3J5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSkpCi0JCQlmUG9zaXRpb25zLnB1dChjYXRlZ29yeSwgbmV3IEFycmF5TGlzdCgpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjYWRkUG9zaXRpb25VcGRhdGVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyKSB7Ci0JCWluc2VydFBvc2l0aW9uVXBkYXRlcih1cGRhdGVyLCBmUG9zaXRpb25VcGRhdGVycy5zaXplKCkpOwotCX0KLQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZG9jdW1lbnQgbGlzdGVuZXJzLCBwb3NpdGlvbnMsIGFuZCBwb3NpdGlvbiB1cGRhdGVycy4gTXVzdAotCSAqIGJlIGNhbGxlZCBpbnNpZGUgdGhlIGNvbnN0cnVjdG9yIGFmdGVyIHRoZSBpbXBsZW1lbnRhdGlvbiBwbHVnLWlucyBoYXZlCi0JICogYmVlbiBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcGxldGVJbml0aWFsaXphdGlvbigpIHsKLQotCQlmUG9zaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJZlBvc2l0aW9uVXBkYXRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJYWRkUG9zaXRpb25DYXRlZ29yeShJRG9jdW1lbnQuREVGQVVMVF9DQVRFR09SWSk7Ci0JCWFkZFBvc2l0aW9uVXBkYXRlcihuZXcgRGVmYXVsdFBvc2l0aW9uVXBkYXRlcihJRG9jdW1lbnQuREVGQVVMVF9DQVRFR09SWSkpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNjb21wdXRlSW5kZXhJbkNhdGVnb3J5KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIGludCBjb21wdXRlSW5kZXhJbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQotCQlpZiAoMCA+IG9mZnNldCB8fCBvZmZzZXQgPiBnZXREb2N1bWVudExlbmd0aCgpKQotCQkJdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKCk7Ci0KLQkJTGlzdCBjID0gKExpc3QpIGZQb3NpdGlvbnMuZ2V0KGNhdGVnb3J5KTsKLQkJaWYgKGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJcmV0dXJuIGNvbXB1dGVJbmRleEluUG9zaXRpb25MaXN0KGMsIG9mZnNldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaW5kZXggaW4gdGhlIGxpc3Qgb2YgcG9zaXRpb25zIGF0IHdoaWNoIGEgcG9zaXRpb24gd2l0aAotCSAqIHRoZSBnaXZlbiBvZmZzZXQgd291bGQgYmUgaW5zZXJ0ZWQuIFRoZSBwb3NpdGlvbiBpcyBzdXBwb3NlZCB0byBiZWNvbWUKLQkgKiB0aGUgZmlyc3QgaW4gdGhpcyBsaXN0IG9mIGFsbCBwb3NpdGlvbnMgd2l0aCB0aGUgc2FtZSBvZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9ucwotCSAqICAgICAgICAgICAgdGhlIGxpc3QgaW4gd2hpY2ggdGhlIGluZGV4IGlzIGNvbXB1dGVkCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBmb3Igd2hpY2ggdGhlIGluZGV4IGlzIGNvbXB1dGVkCi0JICogQHJldHVybiB0aGUgY29tcHV0ZWQgaW5kZXgKLQkgKiAKLQkgKiBAc2VlIElEb2N1bWVudCNjb21wdXRlSW5kZXhJbkNhdGVnb3J5KFN0cmluZywgaW50KQotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgaW50IGNvbXB1dGVJbmRleEluUG9zaXRpb25MaXN0KExpc3QgcG9zaXRpb25zLCBpbnQgb2Zmc2V0KSB7Ci0KLQkJaWYgKHBvc2l0aW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiAwOwotCi0JCWludCBsZWZ0ID0gMDsKLQkJaW50IHJpZ2h0ID0gcG9zaXRpb25zLnNpemUoKSAtIDE7Ci0JCWludCBtaWQgPSAwOwotCQlQb3NpdGlvbiBwID0gbnVsbDsKLQotCQl3aGlsZSAobGVmdCA8IHJpZ2h0KSB7Ci0KLQkJCW1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKLQotCQkJcCA9IChQb3NpdGlvbikgcG9zaXRpb25zLmdldChtaWQpOwotCQkJaWYgKG9mZnNldCA8IHAuZ2V0T2Zmc2V0KCkpIHsKLQkJCQlpZiAobGVmdCA9PSBtaWQpCi0JCQkJCXJpZ2h0ID0gbGVmdDsKLQkJCQllbHNlCi0JCQkJCXJpZ2h0ID0gbWlkIC0gMTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9mZnNldCA+IHAuZ2V0T2Zmc2V0KCkpIHsKLQkJCQlpZiAocmlnaHQgPT0gbWlkKQotCQkJCQlsZWZ0ID0gcmlnaHQ7Ci0JCQkJZWxzZQotCQkJCQlsZWZ0ID0gbWlkICsgMTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9mZnNldCA9PSBwLmdldE9mZnNldCgpKSB7Ci0JCQkJbGVmdCA9IHJpZ2h0ID0gbWlkOwotCQkJfQotCi0JCX0KLQotCQlpbnQgcG9zID0gbGVmdDsKLQkJcCA9IChQb3NpdGlvbikgcG9zaXRpb25zLmdldChwb3MpOwotCQlpZiAob2Zmc2V0ID4gcC5nZXRPZmZzZXQoKSkgewotCQkJLy8gYXBwZW5kIHRvIHRoZSBlbmQKLQkJCXBvcysrOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gZW50cnkgd2lsbCBiZWNhbWUgdGhlIGZpcnN0IG9mIGFsbCBlbnRyaWVzIHdpdGggdGhlIHNhbWUKLQkJCS8vIG9mZnNldAotCQkJZG8gewotCQkJCS0tcG9zOwotCQkJCWlmIChwb3MgPCAwKQotCQkJCQlicmVhazsKLQkJCQlwID0gKFBvc2l0aW9uKSBwb3NpdGlvbnMuZ2V0KHBvcyk7Ci0JCQl9Ci0JCQl3aGlsZSAob2Zmc2V0ID09IHAuZ2V0T2Zmc2V0KCkpOwotCQkJKytwb3M7Ci0JCX0KLQotCQlBc3NlcnQuaXNUcnVlKDAgPD0gcG9zICYmIHBvcyA8PSBwb3NpdGlvbnMuc2l6ZSgpKTsKLQotCQlyZXR1cm4gcG9zOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNjb250YWluc1Bvc2l0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCi0JCWlmIChjYXRlZ29yeSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUxpc3QgbGlzdCA9IChMaXN0KSBmUG9zaXRpb25zLmdldChjYXRlZ29yeSk7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgaW5kZXggPSBjb21wdXRlSW5kZXhJblBvc2l0aW9uTGlzdChsaXN0LCBvZmZzZXQpOwotCQlpZiAoaW5kZXggPCBzaXplKSB7Ci0JCQlQb3NpdGlvbiBwID0gKFBvc2l0aW9uKSBsaXN0LmdldChpbmRleCk7Ci0JCQl3aGlsZSAocCAhPSBudWxsICYmIHAub2Zmc2V0ID09IG9mZnNldCkgewotCQkJCWlmIChwLmxlbmd0aCA9PSBsZW5ndGgpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCSsraW5kZXg7Ci0JCQkJcCA9IChpbmRleCA8IHNpemUpID8gKFBvc2l0aW9uKSBsaXN0LmdldChpbmRleCkgOiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmIChjYXRlZ29yeSAhPSBudWxsKQotCQkJcmV0dXJuIGZQb3NpdGlvbnMuY29udGFpbnNLZXkoY2F0ZWdvcnkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQotCXB1YmxpYyBpbnQgZ2V0RG9jdW1lbnRMZW5ndGgoKSB7Ci0JCXJldHVybiBmQ2hhclNlcXVlbmNlLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHBvc2l0aW9ucyBtYW5hZ2VkIGJ5IHRoZSBkb2N1bWVudCBncm91cGVkIGJ5IGNhdGVnb3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50J3MgcG9zaXRpb25zCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXREb2N1bWVudE1hbmFnZWRQb3NpdGlvbnMoKSB7Ci0JCXJldHVybiBmUG9zaXRpb25zOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNnZXRQb3NpdGlvbkNhdGVnb3JpZXMoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQb3NpdGlvbkNhdGVnb3JpZXMoKSB7Ci0JCVN0cmluZ1tdIGNhdGVnb3JpZXMgPSBuZXcgU3RyaW5nW2ZQb3NpdGlvbnMuc2l6ZSgpXTsKLQkJSXRlcmF0b3Iga2V5cyA9IGZQb3NpdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKQotCQkJY2F0ZWdvcmllc1tpXSA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotCQlyZXR1cm4gY2F0ZWdvcmllczsKLQl9Ci0KLQotCXB1YmxpYyBQb3NpdGlvbltdIGdldFBvc2l0aW9ucyhTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJTGlzdCBjID0gKExpc3QpIGZQb3NpdGlvbnMuZ2V0KGNhdGVnb3J5KTsKLQkJaWYgKGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJUG9zaXRpb25bXSBwb3NpdGlvbnMgPSBuZXcgUG9zaXRpb25bYy5zaXplKCldOwotCQljLnRvQXJyYXkocG9zaXRpb25zKTsKLQkJcmV0dXJuIHBvc2l0aW9uczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjZ2V0UG9zaXRpb25VcGRhdGVycygpCi0JICovCi0JcHVibGljIElQb3NpdGlvblVwZGF0ZXJbXSBnZXRQb3NpdGlvblVwZGF0ZXJzKCkgewotCQlJUG9zaXRpb25VcGRhdGVyW10gdXBkYXRlcnMgPSBuZXcgSVBvc2l0aW9uVXBkYXRlcltmUG9zaXRpb25VcGRhdGVycy5zaXplKCldOwotCQlmUG9zaXRpb25VcGRhdGVycy50b0FycmF5KHVwZGF0ZXJzKTsKLQkJcmV0dXJuIHVwZGF0ZXJzOwotCX0KLQotCi0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjaW5zZXJ0UG9zaXRpb25VcGRhdGVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5zZXJ0UG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlciwgaW50IGluZGV4KSB7Ci0KLQkJZm9yIChpbnQgaSA9IGZQb3NpdGlvblVwZGF0ZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoZlBvc2l0aW9uVXBkYXRlcnMuZ2V0KGkpID09IHVwZGF0ZXIpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGluZGV4ID09IGZQb3NpdGlvblVwZGF0ZXJzLnNpemUoKSkKLQkJCWZQb3NpdGlvblVwZGF0ZXJzLmFkZCh1cGRhdGVyKTsKLQkJZWxzZQotCQkJZlBvc2l0aW9uVXBkYXRlcnMuYWRkKGluZGV4LCB1cGRhdGVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgewotCQl0cnkgewotCQkJcmVtb3ZlUG9zaXRpb24oSURvY3VtZW50LkRFRkFVTFRfQ0FURUdPUlksIHBvc2l0aW9uKTsKLQkJfQotCQljYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb24oamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb24pCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVBvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgUG9zaXRpb24gcG9zaXRpb24pIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQotCQlpZiAocG9zaXRpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJTGlzdCBjID0gKExpc3QpIGZQb3NpdGlvbnMuZ2V0KGNhdGVnb3J5KTsKLQkJaWYgKGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJLy8gcmVtb3ZlIGJhc2VkIG9uIGlkZW50aXR5IG5vdCBlcXVhbGl0eQotCQlpbnQgc2l6ZSA9IGMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHBvc2l0aW9uID09IGMuZ2V0KGkpKSB7Ci0JCQkJYy5yZW1vdmUoaSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I3JlbW92ZVBvc2l0aW9uQ2F0ZWdvcnkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgdGhyb3dzIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCi0JCWlmIChjYXRlZ29yeSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghY29udGFpbnNQb3NpdGlvbkNhdGVnb3J5KGNhdGVnb3J5KSkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJZlBvc2l0aW9ucy5yZW1vdmUoY2F0ZWdvcnkpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVQb3NpdGlvblVwZGF0ZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUG9zaXRpb25VcGRhdGVyKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyKSB7Ci0JCWZvciAoaW50IGkgPSBmUG9zaXRpb25VcGRhdGVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKGZQb3NpdGlvblVwZGF0ZXJzLmdldChpKSA9PSB1cGRhdGVyKSB7Ci0JCQkJZlBvc2l0aW9uVXBkYXRlcnMucmVtb3ZlKGkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogVXBkYXRlcyBhbGwgcG9zaXRpb25zIG9mIGFsbCBjYXRlZ29yaWVzIHRvIHRoZSBjaGFuZ2UgZGVzY3JpYmVkIGJ5IHRoZQotCSAqIGRvY3VtZW50IGV2ZW50LiBBbGwgcmVnaXN0ZXJlZCBkb2N1bWVudCB1cGRhdGVycyBhcmUgY2FsbGVkIGluIHRoZQotCSAqIHNlcXVlbmNlIHRoZXkgaGF2ZSBiZWVuIGFycmFuZ2VkLiBVc2VzIGEgcm9idXN0IGl0ZXJhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGV2ZW50IGRlc2NyaWJpbmcgdGhlIGNoYW5nZSB0byB3aGljaCB0byBhZGFwdAotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9ucwotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVQb3NpdGlvbnMoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGZQb3NpdGlvblVwZGF0ZXJzKTsKLQkJSXRlcmF0b3IgZSA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJUG9zaXRpb25VcGRhdGVyIHUgPSAoSVBvc2l0aW9uVXBkYXRlcikgZS5uZXh0KCk7Ci0JCQl1LnVwZGF0ZShldmVudCk7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0lFeGVjdXRpb25EZWxlZ2F0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0lFeGVjdXRpb25EZWxlZ2F0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2VkMjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9JRXhlY3V0aW9uRGVsZWdhdGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JRXhlY3V0aW9uRGVsZWdhdGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUV4ZWN1dGlvbkRlbGVnYXRhYmxlIHsKLQotCXZvaWQgc2V0RXhlY3V0aW9uRGVsZWdhdGUoSUV4ZWN1dGlvbkRlbGVnYXRlIGV4ZWN1dGlvbkRlbGVnYXRlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9JUmVnaW9uQ29tcGFyaWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0lSZWdpb25Db21wYXJpYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMzA0MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0lSZWdpb25Db21wYXJpYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZWdpb25Db21wYXJpYmxlIHsKLQlib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSk7Ci0KLQlib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0pvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAyYjUwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JRXhlY3V0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLklMb2NrYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0KLS8qKgotICogQW4gSVN0cnVjdHVyZWREb2N1bWVudCB0aGF0IHBlcmZvcm1zIG1vc3Qgb2YgaXRzIGNvbXB1dGF0aW9uIGFuZCBldmVudAotICogbm90aWZpY2F0aW9uIHRocm91Z2ggYW4gSUV4ZWN1dGlvbkRlbGVnYXRlLgotICogCi0gKiBJZiB0aGUgZGVsZWdhdGUgaGFzIG5vdCBiZWVuIHNldCwgd2UgZXhlY3V0ZSBvbiBjdXJyZW50IHRocmVhZCwgbGlrZQotICogIm5vcm1hbCIuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIG5vcm1hbCBub24tZWRpdG9yIHVzZSAod2hpY2ggc2hvdWxkIHN0aWxsLAotICogdWx0aW1hdGVseSwgYmUgcHJvdGVjdGVkIGJ5IGEgc2NoZWR1bGluZyBydWxlKS4gRm9yIGV2ZXJ5IG9wZXJhdGlvbiwgYQotICogcnVubmFibGUgaXMgY3JlYXRlZCwgZXZlbiBpZiBsYXRlciAoaW4gdGhlIGV4ZWN1dGlvbiBkZWxlZ2F0ZSBpbnN0YW5jZSkgaXQKLSAqIGlzIGRlY2lkZWQgbm90aGluZyBzcGVjaWFsIGlzIG5lZWRlZCAodGhhdCBpcywgaW4gZmFjdCBiZWluZyBjYWxsZWQgZnJvbSBhbgotICogZWRpdG9yJ3MgZGlzcGxheSB0aHJlYWQsIGluIHdoaWNoIGNhc2UgaXRzIGp1c3QgZXhlY3V0ZWQpIGluIHRoZSBVSS4KLSAqLwotcHVibGljIGNsYXNzIEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQgZXh0ZW5kcyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCBpbXBsZW1lbnRzIElFeGVjdXRpb25EZWxlZ2F0YWJsZSwgSUxvY2thYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEpvYlNhZmVSdW5uYWJsZSBpbXBsZW1lbnRzIElTYWZlUnVubmFibGUgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJLy8gbG9nZ2VkIGluIFNhZmVSdW5uZXIKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0YWNrIGZFeGVjdXRpb25EZWxlZ2F0ZXMgPSBuZXcgU3RhY2soKTsKLQlwcml2YXRlIElMb2NrIGZMb2NrYWJsZSA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOwotCi0JcHVibGljIEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudChSZWdpb25QYXJzZXIgcGFyc2VyKSB7Ci0JCXN1cGVyKHBhcnNlcik7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhY3F1aXJlTG9jaygpIHsKLQkJZ2V0TG9ja09iamVjdCgpLmFjcXVpcmUoKTsKLQl9Ci0KLQlwcml2YXRlIElFeGVjdXRpb25EZWxlZ2F0ZSBnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpIHsKLQkJaWYgKCFmRXhlY3V0aW9uRGVsZWdhdGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiAoSUV4ZWN1dGlvbkRlbGVnYXRlKSBmRXhlY3V0aW9uRGVsZWdhdGVzLnBlZWsoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklMb2NrYWJsZSNnZXRMb2NrKCkKLQkgKi8KLQotCXB1YmxpYyBJTG9jayBnZXRMb2NrT2JqZWN0KCkgewotCQlyZXR1cm4gZkxvY2thYmxlOwotCX0KLQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVsZWFzZUxvY2soKSB7Ci0JCWdldExvY2tPYmplY3QoKS5yZWxlYXNlKCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudC5yZXBsYWNlKGludCwgaW50LCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZShmaW5hbCBpbnQgb2Zmc2V0LCBmaW5hbCBpbnQgbGVuZ3RoLCBmaW5hbCBTdHJpbmcgdGV4dCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJSUV4ZWN1dGlvbkRlbGVnYXRlIGRlbGVnYXRlID0gZ2V0RXhlY3V0aW9uRGVsZWdhdGUoKTsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXN1cGVyLnJlcGxhY2Uob2Zmc2V0LCBsZW5ndGgsIHRleHQpOwotCQl9Ci0JCWVsc2UgewotCQkJSm9iU2FmZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IEpvYlNhZmVSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudC5zdXBlci5yZXBsYWNlKG9mZnNldCwgbGVuZ3RoLCB0ZXh0KTsKLQkJCQl9Ci0JCQl9OwotCQkJZGVsZWdhdGUuZXhlY3V0ZShydW5uYWJsZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNC5yZXBsYWNlKGludCwgaW50LCBTdHJpbmcsIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZShmaW5hbCBpbnQgb2Zmc2V0LCBmaW5hbCBpbnQgbGVuZ3RoLCBmaW5hbCBTdHJpbmcgdGV4dCwgZmluYWwgbG9uZyBtb2RpZmljYXRpb25TdGFtcCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJSUV4ZWN1dGlvbkRlbGVnYXRlIGRlbGVnYXRlID0gZ2V0RXhlY3V0aW9uRGVsZWdhdGUoKTsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXN1cGVyLnJlcGxhY2Uob2Zmc2V0LCBsZW5ndGgsIHRleHQsIG1vZGlmaWNhdGlvblN0YW1wKTsKLQkJfQotCQllbHNlIHsKLQkJCUpvYlNhZmVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBKb2JTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCUpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQuc3VwZXIucmVwbGFjZShvZmZzZXQsIGxlbmd0aCwgdGV4dCwgbW9kaWZpY2F0aW9uU3RhbXApOwotCQkJCX0KLQkJCX07Ci0JCQlkZWxlZ2F0ZS5leGVjdXRlKHJ1bm5hYmxlKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I3JlcGxhY2VUZXh0KGphdmEubGFuZy5PYmplY3QsIGludCwgaW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlVGV4dChmaW5hbCBPYmplY3QgcmVxdWVzdGVyLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCByZXBsYWNlbWVudExlbmd0aCwgZmluYWwgU3RyaW5nIGNoYW5nZXMpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQgPSBudWxsOwotCQlJRXhlY3V0aW9uRGVsZWdhdGUgZGVsZWdhdGUgPSBnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpOwotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJZXZlbnQgPSBzdXBlci5yZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmaW5hbCBPYmplY3RbXSByZXN1bHRTbG90ID0gbmV3IE9iamVjdFsxXTsKLQkJCUpvYlNhZmVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBKb2JTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCXJlc3VsdFNsb3RbMF0gPSBKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LnN1cGVyLnJlcGxhY2VUZXh0KHJlcXVlc3Rlciwgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjaGFuZ2VzKTsKLQkJCQl9Ci0JCQl9OwotCQkJZGVsZWdhdGUuZXhlY3V0ZShydW5uYWJsZSk7Ci0JCQlldmVudCA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgcmVzdWx0U2xvdFswXTsKLQkJfQotCQlyZXR1cm4gZXZlbnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCNyZXBsYWNlVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGludCwgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoZmluYWwgT2JqZWN0IHJlcXVlc3RlciwgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIGZpbmFsIFN0cmluZyBjaGFuZ2VzLCBmaW5hbCBib29sZWFuIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQgPSBudWxsOwotCQlJRXhlY3V0aW9uRGVsZWdhdGUgZGVsZWdhdGUgPSBnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpOwotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJZXZlbnQgPSBzdXBlci5yZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgaWdub3JlUmVhZE9ubHlTZXR0aW5ncyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmaW5hbCBPYmplY3RbXSByZXN1bHRTbG90ID0gbmV3IE9iamVjdFsxXTsKLQkJCUpvYlNhZmVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBKb2JTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCXJlc3VsdFNsb3RbMF0gPSBKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LnN1cGVyLnJlcGxhY2VUZXh0KHJlcXVlc3Rlciwgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjaGFuZ2VzLCBpZ25vcmVSZWFkT25seVNldHRpbmdzKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQlyZXN1bHRTbG90WzBdID0gbmV3IE5vQ2hhbmdlRXZlbnQoSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudC50aGlzLCByZXF1ZXN0ZXIsIGNoYW5nZXMsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCk7Ci0JCQkJCXN1cGVyLmhhbmRsZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCX0KLQkJCX07Ci0JCQlkZWxlZ2F0ZS5leGVjdXRlKHJ1bm5hYmxlKTsKLQkJCWV2ZW50ID0gKFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSByZXN1bHRTbG90WzBdOwotCQl9Ci0JCXJldHVybiBldmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGVjdXRpb25EZWxlZ2F0ZShJRXhlY3V0aW9uRGVsZWdhdGUgZGVsZWdhdGUpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpCi0JCQlmRXhlY3V0aW9uRGVsZWdhdGVzLnB1c2goZGVsZWdhdGUpOwotCQllbHNlIGlmICghZkV4ZWN1dGlvbkRlbGVnYXRlcy5pc0VtcHR5KCkpCi0JCQlmRXhlY3V0aW9uRGVsZWdhdGVzLnBvcCgpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBzZXRUZXh0KGZpbmFsIE9iamVjdCByZXF1ZXN0ZXIsIGZpbmFsIFN0cmluZyB0aGVTdHJpbmcpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQgPSBudWxsOwotCQlJRXhlY3V0aW9uRGVsZWdhdGUgZXhlY3V0aW9uRGVsZWdhdGUgPSBnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpOwotCQlpZiAoZXhlY3V0aW9uRGVsZWdhdGUgPT0gbnVsbCkgewotCQkJZXZlbnQgPSBzdXBlci5zZXRUZXh0KHJlcXVlc3RlciwgdGhlU3RyaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCWZpbmFsIE9iamVjdFtdIHJlc3VsdFNsb3QgPSBuZXcgT2JqZWN0WzFdOwotCQkJSm9iU2FmZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IEpvYlNhZmVSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJcmVzdWx0U2xvdFswXSA9IEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQuc3VwZXIuc2V0VGV4dChyZXF1ZXN0ZXIsIHRoZVN0cmluZyk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCXJlc3VsdFNsb3RbMF0gPSBuZXcgTm9DaGFuZ2VFdmVudChKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LnRoaXMsIHJlcXVlc3RlciwgdGhlU3RyaW5nLCAwLCAwKTsKLQkJCQkJc3VwZXIuaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfTsKLQkJCWV4ZWN1dGlvbkRlbGVnYXRlLmV4ZWN1dGUocnVubmFibGUpOwotCQkJZXZlbnQgPSAoU3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHJlc3VsdFNsb3RbMF07Ci0JCX0KLQkJcmV0dXJuIGV2ZW50OwotCX0KLQotCXB1YmxpYyBEb2N1bWVudFJld3JpdGVTZXNzaW9uIHN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUgc2Vzc2lvblR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24gPSBudWxsOwotCQlJRXhlY3V0aW9uRGVsZWdhdGUgZXhlY3V0aW9uRGVsZWdhdGUgPSBnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpOwotCQlpZiAoZXhlY3V0aW9uRGVsZWdhdGUgPT0gbnVsbCkgewotCQkJc2Vzc2lvbiA9IGludGVybmFsU3RhcnRSZXdyaXRlU2Vzc2lvbihzZXNzaW9uVHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmaW5hbCBPYmplY3RbXSByZXN1bHRTbG90ID0gbmV3IE9iamVjdFsxXTsKLQkJCWZpbmFsIERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIGZpbmFsU2Vzc2lvblR5cGUgPSBzZXNzaW9uVHlwZTsKLQkJCUpvYlNhZmVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBKb2JTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCXJlc3VsdFNsb3RbMF0gPSBpbnRlcm5hbFN0YXJ0UmV3cml0ZVNlc3Npb24oZmluYWxTZXNzaW9uVHlwZSk7Ci0JCQkJfQotCQkJfTsKLQkJCWV4ZWN1dGlvbkRlbGVnYXRlLmV4ZWN1dGUocnVubmFibGUpOwotCQkJaWYgKHJlc3VsdFNsb3RbMF0gaW5zdGFuY2VvZiBUaHJvd2FibGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigoVGhyb3dhYmxlKSByZXN1bHRTbG90WzBdKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlc3Npb24gPSAoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbikgcmVzdWx0U2xvdFswXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2Vzc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wUmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzZXNzaW9uKSB7Ci0JCUlFeGVjdXRpb25EZWxlZ2F0ZSBleGVjdXRpb25EZWxlZ2F0ZSA9IGdldEV4ZWN1dGlvbkRlbGVnYXRlKCk7Ci0JCWlmIChleGVjdXRpb25EZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQlpbnRlcm5hbFN0b3BSZXdyaXRlU2Vzc2lvbihzZXNzaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCWZpbmFsIERvY3VtZW50UmV3cml0ZVNlc3Npb24gZmluYWxTZXNzaW9uID0gc2Vzc2lvbjsKLQkJCUpvYlNhZmVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBKb2JTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCWludGVybmFsU3RvcFJld3JpdGVTZXNzaW9uKGZpbmFsU2Vzc2lvbik7Ci0JCQkJfQotCQkJfTsKLQkJCWV4ZWN1dGlvbkRlbGVnYXRlLmV4ZWN1dGUocnVubmFibGUpOwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9NaW5pbWFsRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9NaW5pbWFsRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzZmYyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvTWluaW1hbERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUG9zaXRpb25VcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci0KLQotLyoqCi0gKiBQdXJlbHkgYSBkdW1teSAibWFya2VyIiBpbnN0YW5jZSBmb3IgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyB3aGljaCBhcmUKLSAqIGNyZWF0ZWQgdGVtb3JhcmlseSBpbiB0aGUgY291cnNlIG9mIHJlLXBhcnNpbmcuIFByaW1hcmlseSBhIHBsYWNlIGhvbGRlciwKLSAqIGJ1dCBjYW4gYmUgbmVlZGVkIHRvIGdldCB0ZXh0IGZyb20uCi0gKi8KLXB1YmxpYyBjbGFzcyBNaW5pbWFsRG9jdW1lbnQgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50IHsKLQlwcml2YXRlIFN1YlNldFRleHRTdG9yZSBkYXRhOwotCi0JLyoqCi0JICogTWFya2VkIHByaXZhdGUgdG8gYmUgc3VyZSBuZXZlciBjcmVhdGVkIHdpdGhvdXQgZGF0YSBiZWluZyBpbml0aWFsaXplZC4KLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBNaW5pbWFsRG9jdW1lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE1pbmltYWxEb2N1bWVudChTdWJTZXRUZXh0U3RvcmUgaW5pdGlhbENvbnRlbnRzKSB7Ci0JCXRoaXMoKTsKLQkJZGF0YSA9IGluaXRpYWxDb250ZW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRMaXN0ZW5lcihJRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcihJRG9jdW1lbnRMaXN0ZW5lciBkb2N1bWVudEFkYXB0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJLy8gVE9ETzogdGhpcyBpcyBjYWxsZWQgZnJvbSBub3RpZmllciBsb29wIGluYXBwcm9wcmlhdGVseQotCQkvLwl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7Ci0JfQotCi0JcHVibGljIGludCBjb21wdXRlSW5kZXhJbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBjb21wdXRlTnVtYmVyT2ZMaW5lcyhTdHJpbmcgdGV4dCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVR5cGVkUmVnaW9uW10gY29tcHV0ZVBhcnRpdGlvbmluZyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGZpcmVOZXdEb2N1bWVudChPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0KCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gZGF0YS5nZXQoMCwgZGF0YS5nZXRMZW5ndGgoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkYXRhLmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCX0gY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKCJvZmZzZXQ6ICIgKyBvZmZzZXQgKyAiIGxlbmd0aDogIiArIGxlbmd0aCArICJcbmRvY3VtZW50IGxlbmd0aDogIiArIGRhdGEuZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGNoYXIgZ2V0Q2hhcihpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZGF0YS5nZXQob2Zmc2V0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQkvLyB0ZW1wIGZpeAotCQlyZXR1cm4gbnVsbDsKLQkJLy8JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldExlZ2FsTGluZURlbGltaXRlcnMoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZGF0YS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZlcmVkTGluZURlbGltaXRlcigpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKGludCBsaW5lKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRMaW5lSW5mb3JtYXRpb24oaW50IGxpbmUpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZUxlbmd0aChpbnQgbGluZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRMaW5lT2Zmc2V0KGludCBsaW5lKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVPZk9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZMaW5lcygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxpbmVzKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiQW4gaW5zdGFuY2Ugb2YgTWluaW1hbERvY3VtZW50IHdhcyBhc2tlZCBmb3IgaXRzIHBhcnRpdGlvbiwgc29tZXRpbWUgaW5kaWNhdGluZyBhIGRlbGV0ZWQgcmVnaW9uIHdhcyBiZWluZyBhY2Nlc3NlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFR5cGVkUmVnaW9uKDAsMCwgInVuZGVmaW5lZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFBvc2l0aW9uQ2F0ZWdvcmllcygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFBvc2l0aW9uW10gZ2V0UG9zaXRpb25zKFN0cmluZyBjYXRlZ29yeSkgdGhyb3dzIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVBvc2l0aW9uVXBkYXRlcltdIGdldFBvc2l0aW9uVXBkYXRlcnMoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldFJlZ2lvbkxpc3QoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBnZXRSZVBhcnNlcigpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZGF0YS5nZXQoMCwgZGF0YS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I2dldFVuZG9NYW5hZ2VyKCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydFBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIsIGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIFRPRE86IHRoaXMgaXMgY2FsbGVkIGZyb20gbm90aWZpZXIgbG9vcCBpbmFwcHJvcHJpYXRlbHkKLQkJLy8JdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IG5ld0luc3RhbmNlKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3JlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2Uob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2UoSURvY3VtZW50TGlzdGVuZXIgb3duZXIsIElSZXBsYWNlIHJlcGxhY2UpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcihJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGRvY3VtZW50QWRhcHRlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBsYWNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0ZXh0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCWRhdGEucmVwbGFjZShvZmZzZXQsIGxlbmd0aCwgdGV4dCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCBzb3VyY2UsIGludCBvbGRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgcmVxdWVzdGVkQ2hhbmdlKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCNyZXBsYWNlVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50LCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCBzb3VyY2UsIGludCBvbGRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgcmVxdWVzdGVkQ2hhbmdlLCBib29sZWFuIGlnbm9yZVJlYWRPbmx5U2V0dGluZykgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3Jlc3VtZVBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBzZWFyY2goaW50IHN0YXJ0T2Zmc2V0LCBTdHJpbmcgZmluZFN0cmluZywgYm9vbGVhbiBmb3J3YXJkU2VhcmNoLCBib29sZWFuIGNhc2VTZW5zaXRpdmUsIGJvb2xlYW4gd2hvbGVXb3JkKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIHRleHQpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vCQlkYXRhLnNldCh0ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFBhcnRpdGlvbmVyKElEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nTWVtZW50byhFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgc2V0VGV4dChPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgYWxsVGV4dCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQjc2V0VW5kb01hbmFnZXIob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG8uU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmRvTWFuYWdlcihJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3N0YXJ0U2VxdWVudGlhbFJld3JpdGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydFNlcXVlbnRpYWxSZXdyaXRlKGJvb2xlYW4gbm9ybWFsaXplKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jc3RvcFBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jc3RvcFNlcXVlbnRpYWxSZXdyaXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wU2VxdWVudGlhbFJld3JpdGUoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaW5lRGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpIHsKLQkJCi0JfQotCQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1JlYWRPbmx5UG9zaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9SZWFkT25seVBvc2l0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNGJjY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1JlYWRPbmx5UG9zaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotCi1jbGFzcyBSZWFkT25seVBvc2l0aW9uIGV4dGVuZHMgUG9zaXRpb24gewotCXByaXZhdGUgYm9vbGVhbiBmSW5jbHVkZVN0YXJ0T2Zmc2V0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgUmVhZE9ubHlQb3NpdGlvbihpbnQgbmV3T2Zmc2V0LCBpbnQgbmV3TGVuZ3RoLCBib29sZWFuIGluY2x1ZGVTdGFydCkgewotCQlzdXBlcihuZXdPZmZzZXQsIG5ld0xlbmd0aCk7Ci0JCWZJbmNsdWRlU3RhcnRPZmZzZXQgPSBpbmNsdWRlU3RhcnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gb3ZlcmxhcHNXaXRoKGludCBuZXdPZmZzZXQsIGludCBuZXdMZW5ndGgpIHsKLQkJYm9vbGVhbiBvdmVybGFwc1dpdGggPSBzdXBlci5vdmVybGFwc1dpdGgobmV3T2Zmc2V0LCBuZXdMZW5ndGgpOwotCQlpZiAob3ZlcmxhcHNXaXRoKSB7Ci0JCQkvKgotCQkJICogQlVHMTU3NTI2IElmIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVhZCBvbmx5IHJlZ2lvbiBhbmQgbGVuZ3RoID0KLQkJCSAqIDAgbW9zdCBsaWtlbHkgYXNraW5nIHRvIGluc2VydCBhbmQgd2FudCB0byBhbGwgaW5zZXJ0aW5nIGJlZm9yZQotCQkJICogcmVhZCBvbmx5IHJlZ2lvbgotCQkJICovCi0JCQlpZiAoZkluY2x1ZGVTdGFydE9mZnNldCAmJiAobmV3TGVuZ3RoID09IDApICYmICh0aGlzLmxlbmd0aCAhPSAwKSAmJiAobmV3T2Zmc2V0ID09IHRoaXMub2Zmc2V0KSkgewotCQkJCW92ZXJsYXBzV2l0aCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBvdmVybGFwc1dpdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0NjY4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAoSW50YWxpbykgLSBidWcgMzAwNDI3IC0gQ29tcGFyaXNvbiBvZiBTdHJpbmcgT2JqZWN0cyB1c2luZyA9PSBvciAhPQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVGFnUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNlbnRyYWxpemVkIHBsYWNlIHRvIHB1dCAicmVwYXJzaW5nIiBsb2dpYy4gVGhpcyBpcwotICogdGhlIGxvZ2ljIHRoYXQgcmVwYXJzZXMgdGhlIHRleHQgaW5jcmVtZW50YWxseSwgYXMgYSB1c2VyIHR5cGVzIGluIG5ldwotICogY2hhcmFjdGVycywgb3IgRE9NIG5vZGVzIGFyZSBpbnNlcnRlZCBvciBkZWxldGVkLiBOb3RlOiBpdCBpcyBub3QgYSB0aHJlYWQKLSAqIHNhZmUgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkaXJ0eUVuZCA9IG51bGw7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlTdGFydCA9IG51bGw7Ci0JZmluYWwgcHJpdmF0ZSBTdHJpbmcgZG91YmxlUXVvdGUgPSBuZXcgU3RyaW5nKG5ldyBjaGFyW117J1wiJ30pOwotCXByb3RlY3RlZCBmaW5hbCBDb3JlTm9kZUxpc3QgRU1QVFlfTElTVCA9IG5ldyBDb3JlTm9kZUxpc3QoKTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZDaGFuZ2VzOwotCXByb3RlY3RlZCBTdHJpbmcgZkRlbGV0ZWRUZXh0OwotCXByb3RlY3RlZCBib29sZWFuIGZJc0VudGlyZURvY3VtZW50OwotCi0JcHJpdmF0ZSBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlciBmRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZkxlbmd0aERpZmZlcmVuY2U7Ci0JcHJvdGVjdGVkIGludCBmTGVuZ3RoVG9SZXBsYWNlOwotCXByb3RlY3RlZCBPYmplY3QgZlJlcXVlc3RlcjsKLQlwcm90ZWN0ZWQgaW50IGZTdGFydDsKLQkvLyBub3RlOiB0aGlzIGlzIHRoZSBpbXBsIGNsYXNzIG9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQsIG5vdCB0aGUgaW50ZXJmYWNlCi0JLy8gRlVUVVJFX1RPX0RPOiBJIGJlbGlldmUgc29tZSBvZiB0aGVzZSBjYW4gYmUgbWFkZSBwcml2YXRlIG5vdy4/Ci0JcHJvdGVjdGVkIEJhc2ljU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQkvKioKLQkgKiB2YXJpYWJsZSB1c2VkIGluIGFudGljaWFwYXRpb24gb2YgbXVsdGl0aHJlYWRpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcnNpbmc7Ci0JZmluYWwgcHJpdmF0ZSBTdHJpbmcgc2luZ2xlUXVvdGUgPSBuZXcgU3RyaW5nKG5ldyBjaGFyW117J1wnJ30pOwotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBfY2hlY2tCbG9ja05vZGVMaXN0KExpc3QgYmxvY2tUYWdMaXN0KSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChibG9ja1RhZ0xpc3QgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja1RhZ0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlciBibG9ja1RhZyA9IChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcikgYmxvY2tUYWdMaXN0LmdldChpKTsKLQkJCQlTdHJpbmcgdGFnTmFtZSA9IGJsb2NrVGFnLmdldFRhZ05hbWUoKTsKLQkJCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsTmFtZSgiPCIgKyB0YWdOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJYnJlYWs7Ci0JCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbE5hbWUoIjwvIiArIHRhZ05hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbW1vbiB1dGlsaXR5IGZvciBjaGVja2luZyBmb3IgY3JpdGljYWwgd29yZCBzdWNoIGFzICIgPFNDUklQVD4iCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBfY2hlY2tGb3JDcml0aWNhbFdvcmQoU3RyaW5nIGNyaXRpY2FsVGFyZ2V0LCBib29sZWFuIGNoZWNrRW5kKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCBkb2N1bWVudExlbmd0aCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCWludCBwcm9wTGVuID0gZkxlbmd0aFRvUmVwbGFjZTsKLQkJaWYgKHByb3BMZW4gPiBkb2N1bWVudExlbmd0aCkKLQkJCXByb3BMZW4gPSBkb2N1bWVudExlbmd0aDsKLQkJaW50IHN0YXJ0TmVpZ2hib3Job29kID0gZlN0YXJ0IC0gY3JpdGljYWxUYXJnZXQubGVuZ3RoKCk7Ci0JCWludCBhZGp1c3RJbnNlcnQgPSAwOwotCQlpZiAoc3RhcnROZWlnaGJvcmhvb2QgPCAwKSB7Ci0JCQlhZGp1c3RJbnNlcnQgPSAwIC0gc3RhcnROZWlnaGJvcmhvb2Q7Ci0JCQlzdGFydE5laWdoYm9yaG9vZCA9IDA7Ci0JCX0KLQkJaW50IGVuZE5laWdoYm9yaG9vZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgKyBjcml0aWNhbFRhcmdldC5sZW5ndGgoKSAtIDE7Ci0JCWlmIChlbmROZWlnaGJvcmhvb2QgPiBkb2N1bWVudExlbmd0aCkKLQkJCWVuZE5laWdoYm9yaG9vZCA9IGRvY3VtZW50TGVuZ3RoIC0gMTsKLQkJaW50IG9sZGxlbiA9IGVuZE5laWdoYm9yaG9vZCAtIHN0YXJ0TmVpZ2hib3Job29kOyAvLyArIDE7Ci0JCWlmIChvbGRsZW4gKyBzdGFydE5laWdoYm9yaG9vZCA+IGRvY3VtZW50TGVuZ3RoKSB7Ci0JCQlvbGRsZW4gPSBkb2N1bWVudExlbmd0aCAtIHN0YXJ0TmVpZ2hib3Job29kOwotCQl9Ci0JCVN0cmluZyBvbGRUZXh0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXQoc3RhcnROZWlnaGJvcmhvb2QsIG9sZGxlbik7Ci0JCVN0cmluZyBwZWVrID0gU3RyaW5nVXRpbHMucGFzdGUob2xkVGV4dCwgZkNoYW5nZXMsIGNyaXRpY2FsVGFyZ2V0Lmxlbmd0aCgpIC0gYWRqdXN0SW5zZXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJYm9vbGVhbiBpc0NyaXRpY2FsU3RyaW5nID0gY2hlY2tUYWdOYW1lcyhvbGRUZXh0LCBjcml0aWNhbFRhcmdldCwgY2hlY2tFbmQpOwotCQlib29sZWFuIHRvQmVDcml0aWNhbFN0cmluZyA9IGNoZWNrVGFnTmFtZXMocGVlaywgY3JpdGljYWxUYXJnZXQsIGNoZWNrRW5kKTsKLQkJaWYgKChpc0NyaXRpY2FsU3RyaW5nICE9IHRvQmVDcml0aWNhbFN0cmluZykgfHwgLy8gT1IgaWYgYm90aCBhcmUKLQkJCQkJLy8gY3JpdGljYWwgYW5kIHRoZXJlJ3MKLQkJCQkJLy8gYSBjaGFuZ2UgaW4gdGhlIGVuZAotCQkJCQkvLyB0YWcgKCc+JykKLQkJCQkJKChpc0NyaXRpY2FsU3RyaW5nICYmIHRvQmVDcml0aWNhbFN0cmluZykgJiYgKGNoYW5nZUluSXNFbmRlZFN0YXRlKG9sZFRleHQsIHBlZWspKSkpIHsKLQkJCS8vIGlmIGl0IGludm9sdmVzIGEgY2hhbmdlIG9mIGEgY3JpdGljYWwgc3RyaW5nIChtYWtpbmcgb25lIHdoZXJlCi0JCQkvLyB0aGVyZSB3YXNuJ3QsIG9yIHJlbW92aW5nCi0JCQkvLyBvbmUgd2hlcmUgdGhlcmUgd2FzIG9uZSkgdGhlbiByZXBhcnNlIGV2ZXJ0aGluZy4KLQkJCXJlc3VsdCA9IHJlcGFyc2UoMCwgZG9jdW1lbnRMZW5ndGggLSAxKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgaW50IF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzKENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCWludCBzdGFydE9mRGlmZmVyZW5jZXMgPSAtMTsKLQkJaW50IG5ld05vZGVzTGVuZ3RoID0gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWJvb2xlYW4gZm91bmREaWZmZXJlbmNlID0gZmFsc2U7Ci0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkvLyB3ZSdsbCBjb250cm9sIG91ciBsb29wIGJhc2VkIG9uIHRoZSBvbGQgTGlzdCBsZW5ndGgKLQkJaW50IG9sZE5vZGVzTGVuZ3RoID0gb2xkTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCS8vIGJlIHN1cmUgdG8gY2hlY2sgJ2RvbmUnIGZpcnN0LCBzbyBzdGFydE9mRGlmZmVyZW5jZXMgaXNuJ3QKLQkJLy8gaWNyZW1lbnRlZCBpZiBkb25lIGlzIHRydWUKLQkJZG9uZSA6IHdoaWxlICgoIWRvbmUpICYmICgrK3N0YXJ0T2ZEaWZmZXJlbmNlcyA8IG9sZE5vZGVzTGVuZ3RoKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlID0gb2xkTm9kZXMuaXRlbShzdGFydE9mRGlmZmVyZW5jZXMpOwotCQkJLy8gdGhpcyBsZXNzVGhhbkVmZmVjdGVkUmVnaW9uIGlzIHRvIGNoZWNrIHRvIGJlIHN1cmUgdGhlIG5vZGUgaXMKLQkJCS8vIGluZmFjdCBhIGNhbmRpZGF0ZQotCQkJLy8gdG8gYmUgY29uc2lkZXJlZCBhcyAib2xkIi4gVGhpcyBjaGVjayBpcyBpbXBvcnRhbnQgZm9yIHRoZSBjYXNlCi0JCQkvLyB3aGVyZSBzb21lCi0JCQkvLyB0ZXh0IGlzIHJlcGxhY2VpbmcgdGV4dCB0aGF0Ci0JCQkvLyBhcHBlYXJzIGlkZW50aWNhbCwgYnV0IGlzIGEgZGlmZmVyZW50IGluc3RhbmNlLiBGb3IgZXhhbXBsZSwgaWYKLQkJCS8vIHRoZSB0ZXh0Ci0JCQkvLyBpcyA8UD48Qj48L0I+PC9QPiBhbmQgPEI+PC9CPiBpcyBpbnNlcnRlZCBhdCBwb3N0aW9uIDMsCi0JCQkvLyByZXN1bHRpbmcgaW4gPFA+PEI+PC9CPjxCPjwvQj48L1A+Ci0JCQkvLyB3ZSBkbyBub3Qgd2FudCB0aGUKLQkJCS8vIGZpcnN0IDxCPiB0byBiZSBjb25zaWRlcmVkIG9sZCAuLi4gaXQgaXMgdGhlIG5ldyBvbmUsIHRoZQotCQkJLy8gc2Vjb25kCi0JCQkvLyA8Qj4gaXMgdGhlIG9sZCBvbmUuCi0JCQlpZiAoX2xlc3NUaGFuRWZmZWN0ZWRSZWdpb24ob2xkTm9kZSkpIHsKLQkJCQkvLyBiZSBzdXJlIHRvIGNoZWNrIHRoYXQgd2UgaGF2ZSBuZXcgbm9kZXMgdG8gY29tcGFyZSBhZ2FpbnN0LgotCQkJCWlmIChzdGFydE9mRGlmZmVyZW5jZXMgPiBuZXdOb2Rlc0xlbmd0aCkgewotCQkJCQlmb3VuZERpZmZlcmVuY2UgPSBmYWxzZTsKLQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCWNvbnRpbnVlIGRvbmU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8KLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlID0gbmV3Tm9kZXMuaXRlbShzdGFydE9mRGlmZmVyZW5jZXMpOwotCQkJCQkvLyBub3RlOiBzaGlmdCBpcyAwIHdoaWxlIGF0IGJlZ2lubmluZyBvZiBsaXN0LCBiZWZvcmUgdGhlCi0JCQkJCS8vIGluc2VydGlvbiAob3IgZGVsZXRpb24pIHBvaW50LiBBZnRlciB0aGF0LCBpdCBpcwotCQkJCQkvLyBmU3RhcnQrZkxlbmd0aERpZmZlcmVuY2UKLQkJCQkJaWYgKCEob2xkTm9kZS5zYW1lQXMobmV3Tm9kZSwgMCkpKSB7Ci0JCQkJCQlmb3VuZERpZmZlcmVuY2UgPSB0cnVlOwotCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCQljb250aW51ZSBkb25lOwotCQkJCQl9IGVsc2UgeyAvLyBpZiB0aGV5IGFyZSBlcXVhbCwgdGhlbiB3ZSB3aWxsIGJlIGtlZXBpbmcgdGhlCi0JCQkJCQkvLyBvbGQgb25lLCBzbwotCQkJCQkJLy8gd2UgbmVlZCB0byBiZSBzdXJlIGl0cyBwYXJlbnREb2N1bWVudCBpcyBzZXQgYmFjawotCQkJCQkJLy8gdG8KLQkJCQkJCS8vIHRoZSByaWdodCBpbnN0YW5jZQotCQkJCQkJb2xkTm9kZS5zZXRQYXJlbnREb2N1bWVudChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gd2UgZGlkbid0IGxpdGVyYWxseSBmaW5kIGEgZGlmZmVyZW5jZSwgYnV0IHdlIGNvdW50IGl0IGFzCi0JCQkJLy8gc3VjaCBieSBpbXBsaWNhdGlvbgotCQkJCWZvdW5kRGlmZmVyZW5jZSA9IHRydWU7Ci0JCQkJZG9uZSA9IHRydWU7Ci0JCQkJY29udGludWUgZG9uZTsKLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSBsaXRlcmFsbHkgZm91bmQgYSBkaWZmZXJlbmNlLCB0aGVuIGFsbCBpcyBvayBhbmQgd2UgY2FuCi0JCS8vIHJldHVybgotCQkvLyBpdC4KLQkJLy8gaWYgd2UgZGlkIG5vdCBsaXRlcmFsbHkgZmluZCBvbmUsIHRoZW4gd2UgaGF2ZSB0byBkZWNpZGUgd2h5LgotCQlpZiAoIWZvdW5kRGlmZmVyZW5jZSkgewotCQkJaWYgKG5ld05vZGVzTGVuZ3RoID09IG9sZE5vZGVzTGVuZ3RoKSB7IC8vIHRoZW4gbGlzdHMgYXJlCi0JCQkJLy8gaWRlbnRpY2FsCi0JCQkJLy8gKGFuZCBtYXkgYmUgb2YgemVybwotCQkJCS8vIGxlbmd0aCkKLQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSAtMTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG5ld05vZGVzTGVuZ3RoID4gb2xkTm9kZXNMZW5ndGgpIHsgLy8gdGhlbiBsaXN0cyBhcmUKLQkJCQkJLy8gaWRlbnRpY2FsIGV4Y2VwdCBmb3IKLQkJCQkJLy8gbmV3Tm9kZXMgYWRkZWQKLQkJCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gb2xkTm9kZXNMZW5ndGg7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKG5ld05vZGVzTGVuZ3RoIDwgb2xkTm9kZXNMZW5ndGgpIHsgLy8gdGhlbiBsaXN0cyBhcmUKLQkJCQkJCS8vIGlkZW50aWNhbCBleGNlcHQKLQkJCQkJCS8vIGZvciBvbGQgTm9kZXMKLQkJCQkJCS8vIGRlbGV0ZWQKLQkJCQkJCXN0YXJ0T2ZEaWZmZXJlbmNlcyA9IG5ld05vZGVzTGVuZ3RoOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGFydE9mRGlmZmVyZW5jZXM7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgX2NvbXB1dGVTdGFydE9mRGlmZmVyZW5jZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlUGFyYW0sIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGVQYXJhbSwgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMpIHsKLQkJaW50IHN0YXJ0T2ZEaWZmZXJlbmNlcyA9IC0xOwotCQlpbnQgbmV3UmVnaW9uc0xlbmd0aCA9IG5ld1JlZ2lvbnMuc2l6ZSgpOwotCQlib29sZWFuIGZvdW5kRGlmZmVyZW5jZSA9IGZhbHNlOwotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJLy8gd2UnbGwgY29udHJvbCBvdXIgbG9vcCBiYXNlZCBvbiB0aGUgb2xkIExpc3QgbGVuZ3RoCi0JCWludCBvbGRSZWdpb25zTGVuZ3RoID0gb2xkUmVnaW9ucy5zaXplKCk7Ci0JCS8vIGJlIHN1cmUgdG8gY2hlY2sgJ2RvbmUnIGZpcnN0LCBzbyBzdGFydE9mRGlmZmVyZW5jZXMgaXNuJ3QKLQkJLy8gaWNyZW1lbnRlZCBpZiBkb25lIGlzIHRydWUKLQkJZG9uZSA6IHdoaWxlICgoIWRvbmUpICYmICgrK3N0YXJ0T2ZEaWZmZXJlbmNlcyA8IG9sZFJlZ2lvbnNMZW5ndGgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBvbGRSZWdpb24gPSBvbGRSZWdpb25zLmdldChzdGFydE9mRGlmZmVyZW5jZXMpOwotCQkJLy8gdGhpcyBsZXNzVGhhbkVmZmVjdGVkUmVnaW9uIGlzIHRvIGNoZWNrIHRvIGJlIHN1cmUgdGhlIG5vZGUgaXMKLQkJCS8vIGluZmFjdCBhIGNhbmRpZGF0ZQotCQkJLy8gdG8gYmUgY29uc2lkZXJlZCBhcyAib2xkIi4gVGhpcyBjaGVjayBpcyBpbXBvcnRhbnQgZm9yIHRoZSBjYXNlCi0JCQkvLyB3aGVyZSBzb21lCi0JCQkvLyB0ZXh0IGlzIHJlcGxhY2VpbmcgdGV4dCB0aGF0Ci0JCQkvLyBhcHBlYXJzIGlkZW50aWNhbCwgYnV0IGlzIGEgZGlmZmVyZW50IGluc3RhbmNlLiBGb3IgZXhhbXBsZSwgaWYKLQkJCS8vIHRoZSB0ZXh0Ci0JCQkvLyBpcyA8UD48Qj48L0I+PC9QPiBhbmQgPEI+PC9CPiBpcyBpbnNlcnRlZCBhdCBwb3N0aW9uIDMsCi0JCQkvLyByZXN1bHRpbmcgaW4gPFA+PEI+PC9CPjxCPjwvQj48L1A+Ci0JCQkvLyB3ZSBkbyBub3Qgd2FudCB0aGUKLQkJCS8vIGZpcnN0IDxCPiB0byBiZSBjb25zaWRlcmVkIG9sZCAuLi4gaXQgaXMgdGhlIG5ldyBvbmUsIHRoZQotCQkJLy8gc2Vjb25kCi0JCQkvLyA8Qj4gaXMgdGhlIG9sZCBvbmUuCi0JCQlpZiAoX2xlc3NUaGFuRWZmZWN0ZWRSZWdpb24ob2xkTm9kZVBhcmFtLCBvbGRSZWdpb24pKSB7Ci0JCQkJLy8gYmUgc3VyZSB0byBjaGVjayB0aGF0IHdlIGhhdmUgbmV3IG5vZGVzIHRvIGNvbXBhcmUgYWdhaW5zdC4KLQkJCQlpZiAoc3RhcnRPZkRpZmZlcmVuY2VzID4gbmV3UmVnaW9uc0xlbmd0aCkgewotCQkJCQlmb3VuZERpZmZlcmVuY2UgPSBmYWxzZTsKLQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCWNvbnRpbnVlIGRvbmU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8KLQkJCQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gbmV3UmVnaW9ucy5nZXQoc3RhcnRPZkRpZmZlcmVuY2VzKTsKLQkJCQkJLy8gbm90ZTogc2hpZnQgaXMgMCB3aGlsZSBhdCBiZWdpbm5pbmcgb2YgbGlzdCwgYmVmb3JlIHRoZQotCQkJCQkvLyBpbnNlcnRpb24gKG9yIGRlbGV0aW9uKSBwb2ludC4gQWZ0ZXIgdGhhdCwgaXQgaXMKLQkJCQkJLy8gZlN0YXJ0K2ZMZW5ndGhEaWZmZXJlbmNlCi0JCQkJCWlmICghKG9sZE5vZGVQYXJhbS5zYW1lQXMob2xkUmVnaW9uLCBuZXdOb2RlUGFyYW0sIG5ld1JlZ2lvbiwgMCkpKSB7Ci0JCQkJCQlmb3VuZERpZmZlcmVuY2UgPSB0cnVlOwotCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCQljb250aW51ZSBkb25lOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gaWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gd2Ugd2lsbCBiZSBrZWVwaW5nIHRoZSBvbGQKLQkJCQkJCS8vIG9uZS4KLQkJCQkJCS8vIHVubGlrZSB0aGUgZmxhdG5vZGUgY2FzZSwgdGhlcmUgaXMgbm8gcmVhc29uIHRvCi0JCQkJCQkvLyB1cGRhdGUKLQkJCQkJCS8vIHRoZSB0ZXh0c3RvcmUsIHNpbmNlIGl0cyB0aGUgc2FtZSB0ZXh0IHN0b3JlIGluCi0JCQkJCQkvLyBlaXRoZXIgY2FzZQotCQkJCQkJLy8gKHNpbmNlIGl0cyB0aGUgc2FtZSBmbGF0bm9kZSkKLQkJCQkJCS8vb2xkUmVnaW9uLnNldFRleHRTdG9yZShmU3RydWN0dXJlZERvY3VtZW50LnBhcmVudERvY3VtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gd2UgZGlkbid0IGxpdGVyYWxseSBmaW5kIGEgZGlmZmVyZW5jZSwgYnV0IHdlIGNvdW50IGl0IGFzCi0JCQkJLy8gc3VjaCBieSBpbXBsaWNhdGlvbgotCQkJCWZvdW5kRGlmZmVyZW5jZSA9IHRydWU7Ci0JCQkJZG9uZSA9IHRydWU7Ci0JCQkJY29udGludWUgZG9uZTsKLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSBsaXRlcmFsbHkgZm91bmQgYSBkaWZmZXJlbmNlLCB0aGVuIGFsbCBpcyBvayBhbmQgd2UgY2FuCi0JCS8vIHJldHVybgotCQkvLyBpdC4KLQkJLy8gaWYgd2UgZGlkIG5vdCBsaXRlcmFsbHkgZmluZCBvbmUsIHRoZW4gd2UgaGF2ZSB0byBkZWNpZGUgd2h5LgotCQlpZiAoIWZvdW5kRGlmZmVyZW5jZSkgewotCQkJaWYgKG5ld1JlZ2lvbnNMZW5ndGggPT0gb2xkUmVnaW9uc0xlbmd0aCkgeyAvLyB0aGVuIGxpc3RzIGFyZQotCQkJCS8vIGlkZW50aWNhbCAoYW5kIG1heQotCQkJCS8vIGJlIG9mIHplcm8gbGVuZ3RoKQotCQkJCXN0YXJ0T2ZEaWZmZXJlbmNlcyA9IC0xOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobmV3UmVnaW9uc0xlbmd0aCA+IG9sZFJlZ2lvbnNMZW5ndGgpIHsgLy8gdGhlbiBsaXN0cyBhcmUKLQkJCQkJLy8gaWRlbnRpY2FsIGV4Y2VwdAotCQkJCQkvLyBmb3IgbmV3UmVnaW9ucwotCQkJCQkvLyBhZGRlZAotCQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSBvbGRSZWdpb25zTGVuZ3RoOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChuZXdSZWdpb25zTGVuZ3RoIDwgb2xkUmVnaW9uc0xlbmd0aCkgeyAvLyB0aGVuIGxpc3RzCi0JCQkJCQkvLyBhcmUgaWRlbnRpY2FsCi0JCQkJCQkvLyBleGNlcHQgZm9yCi0JCQkJCQkvLyBvbGQgTm9kZXMKLQkJCQkJCS8vIGRlbGV0ZWQKLQkJCQkJCXN0YXJ0T2ZEaWZmZXJlbmNlcyA9IG5ld1JlZ2lvbnNMZW5ndGg7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YXJ0T2ZEaWZmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBQYXJ0IDEgb2YgMiBzdGVwcyB0byBkbyBhIGNvcmVfcmVwYXJzZQotCSAqIAotCSAqIFBhcnNlcyBhIHBvcnRpb24gb2YgdGhlIGN1cnJlbnQgdGV4dCBpbiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBhbmQKLQkgKiByZXR1cm5zIHRoZSByYXcgcmVzdWx0Ci0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIF9jb3JlX3JlcGFyc2VfdGV4dChpbnQgcmVzY2FuU3RhcnQsIGludCByZXNjYW5FbmQpIHsKLQkJZlN0cnVjdHVyZWREb2N1bWVudC5yZXNldFBhcnNlcihyZXNjYW5TdGFydCwgcmVzY2FuRW5kKTsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkuZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogUGFydCAyIG9mIDIgc3RlcHMgdG8gZG8gYSBjb3JlX3JlcGFyc2UKLQkgKiAKLQkgKiBJbnRlZ3JhdGVzIGEgbGlzdCBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIGJhc2VkIG9uIHRoZSBjdXJyZW50Ci0JICogdGV4dCBjb250ZW50cyBvZiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBpbnRvIHRoZSBJU3RydWN0dXJlZERvY3VtZW50Ci0JICogZGF0YSBzdHJ1Y3R1cmUKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IF9jb3JlX3JlcGFyc2VfdXBkYXRlX21vZGVsKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3Tm9kZXNIZWFkLCBpbnQgcmVzY2FuU3RhcnQsIGludCByZXNjYW5FbmQsIENvcmVOb2RlTGlzdCBvbGROb2RlcywgYm9vbGVhbiBmaXJzdFRpbWUpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJQ29yZU5vZGVMaXN0IG5ld05vZGVzID0gbnVsbDsKLQkJLy8gcmVzY2FuCi0JCW5ld05vZGVzID0gbmV3IENvcmVOb2RlTGlzdChuZXdOb2Rlc0hlYWQpOwotCQkvLyBhZGp1c3Qgb3VyIG5ld05vZGUgY2hhaW4gc28gdGhlIG9mZnNldCBwb3NpdGlvbnMgbWF0Y2gKLQkJLy8gb3VyIHRleHQgc3RvcmUgKG5vdCB0aGUgc2ltcGxlIHN0cmluZyBvZiB0ZXh0IHJlcGFyc2VkKQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChuZXdOb2Rlc0hlYWQsIHJlc2NhblN0YXJ0KTsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgcGFyZW50RG9jdW1lbnQgdmFyaWFibGUgb2YgZWFjaCBpbnN0YW5jZSBpbiB0aGUgbmV3Ci0JCS8vIGNoYWluCi0JCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLnNldFBhcmVudERvY3VtZW50KG5ld05vZGVzSGVhZCwgZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vIGluaXRpYWxpemUgdGhlIHN0cnVjdHVyZWREb2N1bWVudCB2YXJpYWJsZSBvZiBlYWNoIGluc3RhbmNlIGluIHRoZQotCQkvLyBuZXcgY2hhaW4KLQkJLy9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQobmV3Tm9kZXNIZWFkLAotCQkvLyBmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJLy8KLQkJaWYgKGZpcnN0VGltZSkgewotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihuZXdOb2Rlc0hlYWQpOwotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5pbml0aWFsaXplRmlyc3RBbmRMYXN0RG9jdW1lbnRSZWdpb24oKTsKLQkJCS8vIG5vdGU6IHNpbmNlIHdlIGFyZSBpbnNlcnRpbmcgbm9kZXMsIGZvciB0aGUgZmlyc3QgdGltZSwgdGhlcmUKLQkJCS8vIGlzCi0JCQkvLyBubyBhZGp1c3RtZW50cwotCQkJLy8gdG8gZG93bnN0cmVhbSBzdHVmZiBuZWNlc3NhcnkuCi0JCQlyZXN1bHQgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudCwgZlJlcXVlc3Rlciwgb2xkTm9kZXMsIG5ld05vZGVzLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlLCBmSXNFbnRpcmVEb2N1bWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3RlOiBpbnRlZ3JhdGVzIGNoYW5nZXMgaW50byBtb2RlbCBhcyBhIHNpZGUgZWZmZWN0Ci0JCQlyZXN1bHQgPSBtaW5pbXVtRXZlbnQob2xkTm9kZXMsIG5ld05vZGVzKTsKLQkJfQotCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvcmVOb2RlTGlzdCBfZm9ybU1pbmltdW1MaXN0KENvcmVOb2RlTGlzdCBmbGF0bm9kZXMsIGludCBzdGFydE9mRGlmZmVyZW5jZXMsIGludCBlbmRPZkRpZmZlcmVuY2VzKSB7Ci0JCUNvcmVOb2RlTGlzdCBtaW5pbWFsTm9kZXMgPSBudWxsOwotCQkvLyBpZiBzdGFydE9mRGlmZmVyY2VzIGlzIHN0aWxsIGl0cyBpbml0aWFsIHZhbHVlLCB0aGVuIHdlIGhhdmUgYW4KLQkJLy8gZW1wdHkgZG9jdW1lbnQKLQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA9PSAtMSkgewotCQkJbWluaW1hbE5vZGVzID0gRU1QVFlfTElTVDsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIHdlIGRvIG5vdCBoYXZlIGFueSBmbGF0bm9kZSBpbiBvdXIgZmxhdG5vZGUgbGlzdCwgdGhlbgotCQkJLy8gc2ltcGx5Ci0JCQkvLyByZXR1cm4gb3VyIHN0YW5kYXJkIGVtcHR5IGxpc3QKLQkJCWlmIChmbGF0bm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCW1pbmltYWxOb2RlcyA9IEVNUFRZX0xJU1Q7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGlmIHN0YXJ0T2ZEaWZmZXJlbmNlcyBpcyBncmVhdGVyIHRoYW4gZW5kT2ZEaWZmZXJlbmNlcywKLQkJCQkvLyB0aGVuCi0JCQkJLy8gdGhhdCBtZWFucyB0aGUgY2FsY3VsYXRpb25zICJjcm9zc2VkIiBlYWNoIG90aGVyLCBhbmQKLQkJCQkvLyBoZW5jZSwKLQkJCQkvLyB0aGVyZSByZWFsbHkgaXMgbm8gZGlmZmVyZW5jZXMsIHNvLCBhZ2FpbiwgcmV0dXJuIHRoZSBlbXB0eQotCQkJCS8vIGxpc3QKLQkJCQlpZiAoc3RhcnRPZkRpZmZlcmVuY2VzID4gZW5kT2ZEaWZmZXJlbmNlcykgewotCQkJCQltaW5pbWFsTm9kZXMgPSBFTVBUWV9MSVNUOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHRoZSBsYXN0IGNoZWNrIGJlIHN1cmUgd2UgaGF2ZSBzb21lIGRpZmZlcm5jZXMKLQkJCQkJaWYgKChlbmRPZkRpZmZlcmVuY2VzID4gLTEpKSB7Ci0JCQkJCQltaW5pbWFsTm9kZXMgPSBuZXcgQ29yZU5vZGVMaXN0KGZsYXRub2Rlcy5pdGVtKHN0YXJ0T2ZEaWZmZXJlbmNlcyksIGZsYXRub2Rlcy5pdGVtKGVuZE9mRGlmZmVyZW5jZXMpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHRoZXJlIHdlcmUgbm8gZGlmZmVyZW5jZXMsIHRoZSBsaXN0IHdhc24ndAotCQkJCQkJLy8gbWluaW1pemVkLCBzbyBzaW1wbHkgcmV0dXJuIGl0LgotCQkJCQkJbWluaW1hbE5vZGVzID0gZmxhdG5vZGVzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtaW5pbWFsTm9kZXM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIF9ncmVhdGVyVGhhbkVmZmVjdGVkUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgbm9kZVN0YXJ0ID0gb2xkTm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgY2hhbmdlZFJlZ2lvbkVuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxOwotCQlyZXN1bHQgPSBub2RlU3RhcnQgPiBjaGFuZ2VkUmVnaW9uRW5kOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBfZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uIG9sZFJlZ2lvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBvbGROb2RlLmdldFN0YXJ0T2Zmc2V0KG9sZFJlZ2lvbik7Ci0JCWludCBlZmZlY3RlZFJlZ2lvbkVuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxOwotCQlyZXN1bHQgPSByZWdpb25TdGFydE9mZnNldCA+IGVmZmVjdGVkUmVnaW9uRW5kOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBfbGVzc1RoYW5FZmZlY3RlZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IG5vZGVFbmQgPSBvbGROb2RlLmdldEVuZE9mZnNldCgpIC0gMTsKLQkJcmVzdWx0ID0gbm9kZUVuZCA8IGZTdGFydDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gX2xlc3NUaGFuRWZmZWN0ZWRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJVGV4dFJlZ2lvbiBvbGRSZWdpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IG5vZGVFbmQgPSBvbGROb2RlLmdldEVuZE9mZnNldChvbGRSZWdpb24pIC0gMTsKLQkJcmVzdWx0ID0gbm9kZUVuZCA8IGZTdGFydDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gX3JlZ2lvbnNTYW1lS2luZChJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIElUZXh0UmVnaW9uIG9sZFJlZ2lvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiBvbmUgcmVnaW9uIGlzIGEgY29udGFpbmVyIHJlZ2lvbiwgYW5kIHRoZSBvdGhlciBub3QsIGFsd2F5cwotCQkvLyByZXR1cm4gZmFsc2UKLQkJLy8gZWxzZSwganVzdCBjaGVjayB0aGVpciB0eXBlLgotCQkvLyAgICAgIERXIGRydWluZyByZWZhY3RvcmluZywgbG9va3MgbGlrZSBhICJ0eXBvIiBoZXJlLCB1c2luZyAnb2xkJyBpbgotCQkvLyBib3RoLgotCQkvLwkJaWYgKGlzQ29udGFpbmVyUmVnaW9uKG9sZFJlZ2lvbikgIT0gaXNDb250YWluZXJSZWdpb24ob2xkUmVnaW9uKSkKLQkJaWYgKGlzQ29sbGVjdGlvblJlZ2lvbihvbGRSZWdpb24pICE9IGlzQ29sbGVjdGlvblJlZ2lvbihuZXdSZWdpb24pKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKG9sZFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKG5ld1JlZ2lvbi5nZXRUeXBlKCkpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLwlwcml2YXRlIGJvb2xlYW4gaGFzQ29sbGVjdGlvblJlZ2lvbnMoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCS8vCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCS8vCQlpZiAoYVJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCS8vCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbkNvbnRhaW50ZXIgPSAoSVRleHRSZWdpb25Db2xsZWN0aW9uKQotCS8vIGFSZWdpb247Ci0JLy8JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHJlZ2lvbkNvbnRhaW50ZXIuZ2V0UmVnaW9ucygpOwotCS8vCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JLy8JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JLy8JCQkJaWYgKGFSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkvLwkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkvLwkJCQkJYnJlYWs7Ci0JLy8JCQkJfQotCS8vCQkJfQotCS8vCQl9Ci0JLy8JCXJldHVybiByZXN1bHQ7Ci0JLy8JfQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHNwZWNpZmljYWxseSB0byBkZXRlY3QgY2hhbmdlcyBpbiAnaXNFbmRlZCcgc3RhdGUsCi0JICogYWx0aG91Z2ggaXQgc3RpbGwgZG9lcyBzbyB3aXRoIGhldXJpc3RpY3MuIElmIG51bWJlciBvZiAnPicgY2hhbmdlcywKLQkgKiBhc3N1bWUgdGhlIGlzRW5kZWQgc3RhdGUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoYW5nZUluSXNFbmRlZFN0YXRlKFN0cmluZyBvbGRUZXh0LCBTdHJpbmcgbmV3VGV4dCkgewotCQlpbnQgbk9sZCA9IFN0cmluZ1V0aWxzLm9jY3VycmVuY2VzT2Yob2xkVGV4dCwgJz4nKTsKLQkJaW50IG5OZXcgPSBTdHJpbmdVdGlscy5vY2N1cnJlbmNlc09mKG5ld1RleHQsICc+Jyk7Ci0JCXJldHVybiAhKG5PbGQgPT0gbk5ldyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQW5kQXNzaWduUGFyZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQob2xkTm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIHRleHRSZWdpb25Db2xsZWN0aW9uID0gKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSB0ZXh0UmVnaW9uQ29sbGVjdGlvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbkxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiBpbm5lclJlZ2lvbiA9IHJlZ2lvbkxpc3QuZ2V0KGkpOwotCQkJCWNoZWNrQW5kQXNzaWduUGFyZW50KG9sZE5vZGUsIGlubmVyUmVnaW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEEgY2hhbmdlIHRvIGEgQ0RBVEEgdGFnIGNhbiByZXN1bHQgaW4gYWxsIGJlaW5nIHJlcGFyc2VkLgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDREFUQSgpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiPCFbQ0RBVEFbIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiXV0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJZiBhIGNvbW1lbnQgc3RhcnQgb3IgZW5kIHRhZyBpcyBiZWluZyBhZGRlZCBvciBkZWxldGVkLCB3ZSdsbCByZXNjYW4KLQkgKiB0aGUgd2hvbGUgZG9jdW1lbnQuIFRoZSByZWFzb24gaXMgdGhhdCBjb250ZW50IHRoYXQgaXMgcmV2ZWFsZWQgb3IKLQkgKiBjb21tZW50ZWQgb3V0IGNhbiBlZmZlY3QgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSByZXN0IG9mIHRoZQotCSAqIGRvY3VtZW50LiBOb3RlOiBmb3Igbm93IHRoaXMgaXMgdmVyeSBYTUwgc3BlY2lmaWMsIGNhbiByZWZhY3Rvci9pbXByb3ZlCi0JICogbGF0ZXIuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ29tbWVudHMoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwhLS0iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCItLT4iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyB3ZSdsbCBhbHNvIGNoZWNrIGZvciB0aGVzZSBkZWdlbmVyYXRlIGNhc2VzCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwhLS0tPiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29tbW9uIHV0aWxpdHkgZm9yIGNoZWNraW5nIGZvciBjcml0aWNhbCB3b3JkIHN1Y2ggYXMgIiA8U0NSSVBUPiIKLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDcml0aWNhbEtleShTdHJpbmcgY3JpdGljYWxUYXJnZXQpIHsKLQkJcmV0dXJuIF9jaGVja0ZvckNyaXRpY2FsV29yZChjcml0aWNhbFRhcmdldCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENvbW1vbiB1dGlsaXR5IGZvciBjaGVja2luZyBmb3IgY3JpdGljYWwgd29yZCBzdWNoIGFzICIgPFNDUklQVD4iCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyaXRpY2FsTmFtZShTdHJpbmcgY3JpdGljYWxUYXJnZXQpIHsKLQkJcmV0dXJuIF9jaGVja0ZvckNyaXRpY2FsV29yZChjcml0aWNhbFRhcmdldCwgdHJ1ZSk7Ci0JfQotCi0JLy8JLyoqCi0JLy8JICogQ3VycmVudGx5IHRoaXMgbWV0aG9kIGlzIHByZXR0eSBzcGVjaWZpYyB0byA/TUwKLQkvLwkgKiBAZGVwcmVjYXRlZCAtIG5vdCByZWFsbHkgZGVwcmVjYXRlZCwgYnV0IHBsYW4gdG8gbWFrZQotCS8vCSAqIHByb3RlY3RlZCAuLi4gSSdtIG5vdCBzdXJlIHdoeSBpdHMgcHVibGljIG9yIG1pc3NwZWxsZWQ/Ci0JLy8JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Cb3VuZHJ5Q2FzZXMoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIENhc2UgMTogU2VlIGlmIHRoZSBsYW5ndWFnZSdzIHN5bnRheCByZXF1aXJlcyB0aGF0IG11bHRpcGxlCi0JCS8vIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgYmUgcmVzY2FubmVkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblN5bnRheCgpOwotCQl9Ci0JCS8vIENhc2UgMjogImJsb2NrIHRhZ3MiIHdob3NlIGNvbnRlbnQgaXMgbGVmdCB1bnBhcnNlZAotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCU9iamVjdCBwYXJzZXIgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpOwotCQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIEJsb2NrVGFnUGFyc2VyKSB7Ci0JCQkJTGlzdCBibG9ja1RhZ3MgPSAoKEJsb2NrVGFnUGFyc2VyKSBwYXJzZXIpLmdldEJsb2NrTWFya2VycygpOwotCQkJCXJlc3VsdCA9IF9jaGVja0Jsb2NrTm9kZUxpc3QoYmxvY2tUYWdzKTsKLQkJCX0KLQkJfQotCQkvLyBGVVRVUkVfVE9fRE86IGlzIHRoZXJlIGEgYmV0dGVyIHBsYWNlIHRvIGRvIHRoaXM/Ci0JCS8vIG9yISBkbyB3ZSBhbHJlYWR5IGRvIGl0IHNvbWUgb3RoZXIgbW9yZSBjZW50cmFsIHBsYWNlPwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJlc3VsdC5zZXREZWxldGVkVGV4dChmRGVsZXRlZFRleHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQWxsb3cgYSByZXBhcnNlciB0byBjaGVjayBmb3IgZXh0cmEgc3ludGFjdGljIGNhc2VzIHRoYXQgcmVxdWlyZQotCSAqIHBhcnNpbmcgYmV5b25kIHRoZSBmbGF0Tm9kZSBib3VuZGFyeS4KLQkgKiAKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgWE1MLWNlbnRyaWMuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25TeW50YXgoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdDsKLQkJLy8gQ2FzZSAxOiBRdW90ZSBjaGFyYWN0ZXJzIGFyZSBpbnZvbHZlZAotCQlyZXN1bHQgPSBjaGVja0ZvclF1b3RlcygpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCS8vIENhc2UgMjogVGhlIGlucHV0IGZvcm1zIG9yIHVuZG9lcyBhIGNvbW1lbnQgYmVnaW5uaW5nIG9yCi0JCQkvLyBjb21tZW50Ci0JCQkvLyBlbmQKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ29tbWVudHMoKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCS8vIENhc2UgMzogVGhlIGlucHV0IGZvcm1zIG9yIHVuZG9lcyBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLQkJCXJlc3VsdCA9IGNoZWNrRm9yUEkoKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCS8vIENhc2UgNDogVGhlIGlucHV0IGZvcm1zIG9yIHVuZG9lcyBhIENEQVRBIHNlY3Rpb24KLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ0RBVEEoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgY2hhbmdlIHJlcXVlc3QgZXhhY3RseSBtYXRjaGVzIHRoZSB0ZXh0IGl0IHdvdWxkIGJlCi0JICogcmVwbGFjaW5nLiAoSW4gZnV0dXJlLCB0aGlzLCBvciBzaW1pbGFyIG1ldGhvZCBpcyB3aGVyZSB0byBjaGVjayBmb3IKLQkgKiAicmVhZCBvbmx5IiBhdHRlbXB0ZWQgY2hhbmdlLikKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yTm9DaGFuZ2UoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGRvbid0IGNoZWNrIGVxdWFscyB1bmxlc3MgbGVuZ3RocyBtYXRjaAotCQkvLyBzaG91bGQgYmUgYSB0aW55IGJpdCBmYXN0ZXIsIHNpbmNlIHVzdWFsbHkgbm90Ci0JCS8vIG9mIGVxdWFsIGxlbmd0aHMgKEknbSBzdXJwcmlzZWQgU3RyaW5nJ3MgZXF1YWxzIG1ldGhvZAotCQkvLyBkb2Vzbid0IGRvIHRoaXMuKQotCQlpZiAoKGZDaGFuZ2VzICE9IG51bGwpICYmIChmRGVsZXRlZFRleHQgIT0gbnVsbCkgJiYgKGZDaGFuZ2VzLmxlbmd0aCgpID09IGZEZWxldGVkVGV4dC5sZW5ndGgoKSkgJiYgKGZDaGFuZ2VzLmVxdWFscyhmRGVsZXRlZFRleHQpKSkgewotCQkJcmVzdWx0ID0gbmV3IE5vQ2hhbmdlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudCwgZlJlcXVlc3RlciwgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkoKE5vQ2hhbmdlRXZlbnQpcmVzdWx0KS5yZWFzb24gPSBOb0NoYW5nZUV2ZW50Lk5PX0NPTlRFTlRfQ0hBTkdFOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQSBjaGFuZ2UgdG8gYSBQSSB0YWcgY2FuIHJlc3VsdCBpbiBhbGwgYmVpbmcgcmVwYXJzZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvclBJKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8PyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIj8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyAgRm9yIHNpbXBsaWNpdHksIGlmIGVpdGhlciB0ZXh0IHRvIGJlIGRlbGV0ZWQsIG9yIHRleHQgdG8gYmUgaW5zZXJ0ZWQKLQkvLyBjb250YWlucyBhdCBsZWFzdAotCS8vICBvbmUgcXVvdGUsIHdlJ2xsIHNlYXJjaCBmb3IgcHJldmlvdXMgcXVvdGUgaW4gZG9jdW1lbnQsIGlmIGFueSwgYW5kIHVzZQotCS8vIHRoYXQgZmxhdG5vZGUgYXMKLQkvLyAgYSBkaXJ0eSBzdGFydCwgYW5kIHdlJ2xsIHVzZSBlbmQgb2YgZG9jdW1lbnQgYXMgZGlydHkgZW5kLiBXZSBuZWVkIHRvCi0JLy8gYXNzdW1lIGVpdGhlciBcIiBvcgotCS8vICBcJyBpcyBhbiBleGNlcHRhYmxlIHF1b3RlLiAoTk9URTogdGhpcyBpcywgbG9vc2VseSwgYW4gWE1MIGFzc3VtcHRpb24KLQkvLyAtLQotCS8vIG90aGVyIGxhbmd1YWdlcwotCS8vICB3b3VsZCBkaWZmZXIsIGJ1dCB3ZSdsbCAiaGFyZCBjb2RlIiBmb3IgWE1MIGZvciBub3cuCi0JLy8gZnV0dXJlX1RPRE86IHRoaXMgaXMgYSByZWFsbHkgYmFkIGhldXJpc3RpYyAuLi4gd2Ugc2hvdWxkIGJlIGxvb2tpbmcKLQkvLyBmb3IKLQkvLyBvZGQgbnVtYmVyIG9mIHF1b3RlcwotCS8vIHdpdGhpbiBhIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAob3Igc29tZXRoaW5nISkgVGhpcyBjYXVzZXMgd2F5IHRvbwotCS8vIG11Y2ggcmVwYXJzaW5nIG9uCi0JLy8gc2ltcGxlIGNhc2VzLCBsaWtlIGRlbGV0aW5nIGEgdGFnIHdpdGggYSBxdW90ZWQgYXR0cmlidXRlIQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JRdW90ZXMoKSB7Ci0JCS8vIHJvdXRpbmUgaXMgc3VwcG9ydGVkIHdpdGggbnVsbCBvciBlbXB0eSBzdHJpbmcgbWVhbmluZyB0aGUgc2FtZQotCQkvLyB0aGluZzogZGVsZXRpb24KLQkJaWYgKGZDaGFuZ2VzID09IG51bGwpCi0JCQlmQ2hhbmdlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnQgZGlydHlTdGFydFBvcyA9IC0xOwotCQkJU3RyaW5nIHByb3Bvc2VkRGVsZXRpb24gPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJaWYgKGZTdGFydCA8IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlpZiAoKGZDaGFuZ2VzLmluZGV4T2Yoc2luZ2xlUXVvdGUpID4gLTEpIHx8IChwcm9wb3NlZERlbGV0aW9uLmluZGV4T2Yoc2luZ2xlUXVvdGUpID4gLTEpKSB7Ci0JCQkJCUlSZWdpb24gc2luZ2xlUXVvdGVSZWdpb24gPSBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpLmZpbmQoZlN0YXJ0LCBzaW5nbGVRdW90ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCQlpZiAoc2luZ2xlUXVvdGVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJZGlydHlTdGFydFBvcyA9IHNpbmdsZVF1b3RlUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICgoZkNoYW5nZXMuaW5kZXhPZihkb3VibGVRdW90ZSkgPiAtMSkgfHwgKHByb3Bvc2VkRGVsZXRpb24uaW5kZXhPZihkb3VibGVRdW90ZSkgPiAtMSkpIHsKLQkJCQkJSVJlZ2lvbiBkb3VibGVRdW90ZVJlZ2lvbiA9IGdldEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyKCkuZmluZChmU3RhcnQsIGRvdWJsZVF1b3RlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCWlmIChkb3VibGVRdW90ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlkaXJ0eVN0YXJ0UG9zID0gZG91YmxlUXVvdGVSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGlydHlTdGFydFBvcyA+IC0xKSB7Ci0JCQkJLy8gdGhlbiB3ZSBmb3VuZCBvbmUsIGRvIGNyZWF0ZSBuZXcgc3RydWN0dXJlZERvY3VtZW50IGV2ZW50Ci0JCQkJLy8gYmFzZWQgb24gdGhlIHByZXZpb3VzIHF1b3RlIHRvIGVuZCBvZiBkb2N1bWVudAotCQkJCS8vIGV4Y2VwdCwgd2UgbmVlZCB0byBiZSBwb3NpdGl2ZSB0aGF0IHRoZSBwcmV2aW91cyBxdW90ZSBpcwotCQkJCS8vIGluIGEgInNhZmUgc3RhcnQiIHJlZ2lvbiAoZS5nLiBpZiBpbiBKU1AgY29udGVudCwgd2UgbmVlZAotCQkJCS8vIHRvCi0JCQkJLy8gYmFja3VwIHRpbGwgd2UgaW5jbHVkZSB0aGUgd2hvbGUgSlNQIHJlZ2lvbiwgaW4gb3JkZXIgZm9yCi0JCQkJLy8gaXQKLQkJCQkvLyB0byBiZSBjb3JyZWN0bHkgcmUtcGFyc2VkLiBUaGUgYmFja2luZyB1cCBpcyBkb25lIGluIHRoZQotCQkJCS8vIHJlcGFyc2UvZmluZCBkaXJ0eSBzdGFydCBmcm9tIGhpbnQKLQkJCQkvLyBtZXRob2QuCi0JCQkJcmVzdWx0ID0gcmVwYXJzZShkaXJ0eVN0YXJ0UG9zLCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tIZXVyaXN0aWNzKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0Zvck5vQ2hhbmdlKCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJvdW5kcnlDYXNlcygpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcXVpY2tDaGVjaygpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGFrZXMgaW50byBhY2NvdW50ICJ0YWcgbmFtZSIgcnVsZXMgZm9yIGNvbXBhcmlzb25zOyBjYXNlLWluc2Vuc2l0aXZlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1RhZ05hbWVzKFN0cmluZyBjb21wYXJlVGV4dCwgU3RyaW5nIGNyaXRpY2FsVGFyZ2V0LCBib29sZWFuIGNoZWNrRW5kKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmICgoY29tcGFyZVRleHQgPT0gbnVsbCkgfHwgKGNyaXRpY2FsVGFyZ2V0ID09IG51bGwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgcG9zT2ZDcml0aWNhbFdvcmQgPSBjb21wYXJlVGV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoY3JpdGljYWxUYXJnZXQudG9Mb3dlckNhc2UoKSk7Ci0JCXJlc3VsdCA9IHBvc09mQ3JpdGljYWxXb3JkID4gLTE7Ci0JCWlmIChjaGVja0VuZCAmJiByZXN1bHQpIHsKLQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRydWUgcmlnaHQgYXdheSwgd2UnbGwgb25seSByZXR1cm4gdHJ1ZQotCQkJLy8gdGhlCi0JCQkvLyBwb3RlbnRpYWxseSBtYXRjaGVkIHRhZyBpcyBpbmRlZWQgYSB0YWcsIGZvciBleGFtcGxlLCBpZgotCQkJLy8gPFNDUklQVAotCQkJLy8gYmVjb21lcyA8U0NSSVBUUyB3ZSBkb24ndCB3YW50IHRvIHNheSB0aGUgbGF0dGVyIGlzIGEgY3JpdGljYWwKLQkJCS8vIHRhZwotCQkJaW50IGxhc3RQb3MgPSBwb3NPZkNyaXRpY2FsV29yZCArIGNyaXRpY2FsVGFyZ2V0Lmxlbmd0aCgpOwotCQkJaWYgKGxhc3RQb3MgPCBjb21wYXJlVGV4dC5sZW5ndGgoKSkgewotCQkJCWNoYXIgbGFzdENoYXIgPSBjb21wYXJlVGV4dC5jaGFyQXQobGFzdFBvcyk7Ci0JCQkJLy8gRnV0dXJlOiBjaGVjayBmb3JtYWwgZGVmaW5pdGlvbiBvZiB0aGlzIGphdmEgbWV0aG9kLCB2cy4KLQkJCQkvLyBYTUwKLQkJCQkvLyBwYXJzaW5nIHJ1bGVzCi0JCQkJcmVzdWx0ID0gKCFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGxhc3RDaGFyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29yZSByZXBhcnNpbmcgbWV0aG9kIC4uLiBhZnRlciB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5IGVuZCBoYXZlCi0JICogYmVlbiBjYWxjdWxhdGVkIGVsc2V3aGVyZSwgYW5kIHRoZSB0ZXh0IHVwZGF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNvcmVfcmVwYXJzZShpbnQgcmVzY2FuU3RhcnQsIGludCByZXNjYW5FbmQsIENvcmVOb2RlTGlzdCBvbGROb2RlcywgYm9vbGVhbiBmaXJzdFRpbWUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2Rlc0hlYWQgPSBudWxsOwotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQluZXdOb2Rlc0hlYWQgPSBfY29yZV9yZXBhcnNlX3RleHQocmVzY2FuU3RhcnQsIHJlc2NhbkVuZCk7Ci0JCXJlc3VsdCA9IF9jb3JlX3JlcGFyc2VfdXBkYXRlX21vZGVsKG5ld05vZGVzSGVhZCwgcmVzY2FuU3RhcnQsIHJlc2NhbkVuZCwgb2xkTm9kZXMsIGZpcnN0VGltZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHN0YXRlIHRvICJub3QgcGFyc2luZyIKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGVuZFJlUGFyc2UoKSB7Ci0JCWlzUGFyc2luZyA9IGZhbHNlOwotCQlkaXJ0eVN0YXJ0ID0gbnVsbDsKLQkJZGlydHlFbmQgPSBudWxsOwotCQlmQ2hhbmdlcyA9IG51bGw7Ci0JCWZEZWxldGVkVGV4dCA9IG51bGw7Ci0JCWZJc0VudGlyZURvY3VtZW50ID0gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZERpcnR5RW5kKGludCBlbmQpIHsKLQkJLy8gQ2F1dGlvbjogaGVyZSdzIG9uZSBwbGFjZSB3ZSBoYXZlIHRvIGNhc3QKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGVuZCk7Ci0JCS8vIGlmIG5vdCB3ZWxsIGZvcm1lZCwgZ2V0IG9uZSBwYXN0LCBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhlcmUKLQkJaWYgKChyZXN1bHQgIT0gbnVsbCkgJiYgKCFyZXN1bHQuaXNFbmRlZCgpKSkgewotCQkJaWYgKHJlc3VsdC5nZXROZXh0KCkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5nZXROZXh0KCk7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxzbywgZ2V0IG9uZSBwYXN0IGlmIGV4YWN0bHkgZXF1YWwgdG8gdGhlIGVuZCAodGhpcyB3YXMgbmVlZGVkCi0JCS8vIGFzIGEgc2ltcGxlIGZpeCB0byB3aGVuIGEgd2hvbGUgZXhhY3QgcmVnaW9uIGlzIGRlbGV0ZWQuCi0JCS8vIHRoZXJlJ3MgcHJvYmFibHkgYSBiZXR0ZXIgd2F5LgotCQlpZiAoKHJlc3VsdCAhPSBudWxsKSAmJiAoZW5kID09IHJlc3VsdC5nZXRFbmQoKSkpIHsKLQkJCWlmIChyZXN1bHQuZ2V0TmV4dCgpICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQkJfQotCQl9Ci0JCS8vIG1vdmVkIHRvIHN1YmNsYXNzIGZvciBxdWljayB0cmFuc2l0aW9uCi0JCS8vIDEyLzYvMjAwMSAtIFNpbmNlIHdlJ3ZlIGNoYW5nZWQgdGhlIHBhcnNlci9zY2FubmVyIHRvIGFsbG93IGEgbG9uZQotCQkvLyAnPCcgd2l0aG91dAotCQkvLyBhbHdheXMgaW50ZXJwcmV0dGluZyBpdCBhcyBzdGFydCBvZiBhIHRhZyBuYW1lLCB3ZSBuZWVkIHRvIGJlIGEKLQkJLy8gbGl0dGxlIGZhbmNpZXIsIGluIG9yZGVyCi0JCS8vIHRvICJza2lwIiBvdmVyIGFueSBwbGFpbiAnb2wgY29udGVudCBiZXR3ZWVuIHRoZSBsb25lICc8JyBhbmQgYW55Ci0JCS8vIHBvdGVudGlhbCBtZWF0aW5nCi0JCS8vIHJlZ2lvbnMgcGFzdCBwbGFpbiAnb2wgY29udGVudC4KLQkJLy8JCWlmIChpc0xvbmVPcGVuRm9sbG93ZWRCeUNvbnRlbnQocmVzdWx0KSAmJiAocmVzdWx0LmdldE5leHQoKSAhPQotCQkvLyBudWxsKSkgewotCQkvLwkJCXJlc3VsdCA9IHJlc3VsdC5nZXROZXh0KCk7Ci0JCS8vCQl9Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24ocmVzdWx0KTsKLQkJZGlydHlFbmQgPSByZXN1bHQ7Ci0JCXJldHVybiBkaXJ0eUVuZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaW5kRGlydHlTdGFydChpbnQgc3RhcnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJLy8gaGV1cmlzdGljOiBpZiB0aGUgcG9zdGlvbiBpcyBleGFjdGx5IGVxdWFsIHRvIHRoZSBzdGFydCwgdGhlbgotCQkvLyBnbyBiYWNrIG9uZSBtb3JlLCBpZiBpdCBleGlzdHMuIFRoaXMgcHJldmVudHMgcHJvYmxlbXMgd2l0aAotCQkvLyBpbnNlcnRpb25zCi0JCS8vIG9mIHRleHQgdGhhdCBzaG91bGQgYmUgbWVyZ2VkIHdpdGggdGhlIHByZXZpb3VzIG5vZGUgaW5zdGVhZCBvZgotCQkvLyBzaW1wbHkgaHVuZwotCQkvLyBvZmYgb2YgaXQgYXMgYSBzZXBhcmF0ZSBub2RlIChleC46IFhNTCBjb250ZW50IGluc2VydGVkIHJpZ2h0Ci0JCS8vIGJlZm9yZQotCQkvLyBhbiBvcGVuCi0JCS8vIGJyYWNrZXQgc2hvdWxkIGJlY29tZSBwYXJ0IG9mIHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUpCi0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91cyA9IHJlc3VsdC5nZXRQcmV2aW91cygpOwotCQkJaWYgKChwcmV2aW91cyAhPSBudWxsKSAmJiAoKCEocHJldmlvdXMuaXNFbmRlZCgpKSkgfHwgKHN0YXJ0ID09IHJlc3VsdC5nZXRTdGFydCgpKSkpIHsKLQkJCQlyZXN1bHQgPSBwcmV2aW91czsKLQkJCX0KLQkJCS8vIElmIHdlIGFyZSBub3cgYXQgdGhlIGVuZCBvZiBhICJ0YWcgZGVwZW5kZW50IiBjb250ZW50IGFyZWEgKG9yCi0JCQkvLyBKU1AgYXJlYSkKLQkJCS8vIHRoZW4gd2UgbmVlZCB0byBiYWNrIHVwIGFsbCB0aGUgd2F5IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhhdC4KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcG90ZW50aWFsID0gcmVzdWx0OwotCQkJLy8gbW92ZWQgdG8gc3ViY2xhc3MgdG8gc3BlZWQgdHJhbnNpdGlvbgotCQkJLy8JCQl3aGlsZSAoaXNQYXJ0T2ZCbG9ja1JlZ2lvbihwb3RlbnRpYWwpKSB7Ci0JCQkvLwkJCQlwb3RlbnRpYWwgPSBwb3RlbnRpYWwuZ2V0UHJldmlvdXMoKTsKLQkJCS8vCQkJfQotCQkJaWYgKHBvdGVudGlhbCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcG90ZW50aWFsOwotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24ocmVzdWx0KTsKLQkJCX0KLQkJfQotCQlkaXJ0eVN0YXJ0ID0gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb3JlTm9kZUxpc3QgZm9ybU9sZE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlTdGFydCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkaXJ0eUVuZCkgewotCQlDb3JlTm9kZUxpc3Qgb2xkTm9kZXMgPSBuZXcgQ29yZU5vZGVMaXN0KGRpcnR5U3RhcnQsIGRpcnR5RW5kKTsKLQkJLy8gTm93IHNhdmUgdGhlIG9sZCB0ZXh0LCB0aGF0ICJnb2VzIHdpdGgiIHRoZSBvbGQgbm9kZXMgYW5kIHJlZ2lvbnMuCi0JCS8vIE5vdGljZSB3ZSBhcmUgZ2V0dGluZyBpdCBkaXJlY3RseSBmcm9tIHRoZSB0ZXh0IHN0b3JlCi0JCVN0cmluZyBvbGRUZXh0ID0gbnVsbDsKLQkJaW50IG9sZFN0YXJ0ID0gLTE7Ci0JCWludCBvbGRFbmQgPSAtMTsKLQkJLy8gbWFrZSBzdXJlIHRoZXJlIGlzIHNvbWUgdGV4dCwgaWYgbm90LCB1c2UgZW1wdHkgc3RyaW5nCi0JCS8vIChpZiBvbmUgbm9kZSBpcyBub3QgbnVsbCwgdGhlIG90aGVyIHNob3VsZCBBTFdBWVMgYmUgbm90IG51bGwgdG9vLAotCQkvLyBzaW5jZSBpdAotCQkvLyB3b3VsZCBhdCBsZWFzdCBiZSBlcXVhbCB0byBpdC4pCi0JCWlmIChkaXJ0eVN0YXJ0ICE9IG51bGwpIHsKLQkJCW9sZFN0YXJ0ID0gZGlydHlTdGFydC5nZXRTdGFydCgpOwotCQkJb2xkRW5kID0gZGlydHlFbmQuZ2V0RW5kKCk7Ci0JCQlvbGRUZXh0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXQob2xkU3RhcnQsIG9sZEVuZCAtIG9sZFN0YXJ0KTsKLQkJfSBlbHNlIHsKLQkJCW9sZFN0YXJ0ID0gMDsKLQkJCW9sZEVuZCA9IDA7Ci0JCQlvbGRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBjcmVhdGUgYSB0ZW1wb3JhcnkgdGV4dCBzdG9yZSBmb3IgdGhpcyB0ZXh0Ci0JCVN1YlNldFRleHRTdG9yZSBzdWJUZXh0U3RvcmUgPSBuZXcgU3ViU2V0VGV4dFN0b3JlKG9sZFRleHQsIG9sZFN0YXJ0LCBvbGRFbmQsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCQkvLyBOb3cgdXBkYXRlIHRoZSB0ZXh0IHN0b3JlIG9mIHRoZSBvbGROb2RlcwotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5zZXRQYXJlbnREb2N1bWVudChvbGROb2RlcywgbmV3IE1pbmltYWxEb2N1bWVudChzdWJUZXh0U3RvcmUpKTsKLQkJcmV0dXJuIG9sZE5vZGVzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIuCi0JICovCi0JcHVibGljIEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyIGdldEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyKCkgewotCQlpZiAoZkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyID09IG51bGwpIHsKLQkJCWZGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlciA9IG5ldyBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcihmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQlyZXR1cm4gZkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyOwotCX0KLQotCS8vIE5vdGU6IGlmIHRoZWFkIHNhZmV0eSBpcyBuZWVkZWQsIHRoaXMgYW5kIGFsbCB0aGUgb3RoZXIgcHVibGljIG1ldGhvZHMKLQkvLyBvZiB0aGlzIGNsYXNzCi0JLy8gc2hvdWxkIGJlIHN5bmNocm9uaXplZC4KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKE9iamVjdCByZXF1ZXN0ZXIsIGludCBzdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSwgU3RyaW5nIGNoYW5nZXMpIHsKLQkJaXNQYXJzaW5nID0gdHJ1ZTsKLQkJZlJlcXVlc3RlciA9IHJlcXVlc3RlcjsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZMZW5ndGhUb1JlcGxhY2UgPSBsZW5ndGhUb1JlcGxhY2U7Ci0JCWZDaGFuZ2VzID0gY2hhbmdlczsKLQkJLy8gbm90aWNlIHRoaXMgb25lIGlzIGRlcml2ZWQKLQkJZkxlbmd0aERpZmZlcmVuY2UgPSBVdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShmQ2hhbmdlcywgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCWZEZWxldGVkVGV4dCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCWludCBkb2NMZW5ndGggPSBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpOwotCQlmSXNFbnRpcmVEb2N1bWVudCA9IGxlbmd0aFRvUmVwbGFjZSA+PSBkb2NMZW5ndGggJiYgZG9jTGVuZ3RoID4gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnROb2RlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzT2xkTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0T2xkTm9kZSwgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROZXcgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROZXcgPSBudWxsOwotCQkvLwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFByZXZpb3VzID0gcHJldmlvdXNPbGROb2RlOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5leHQgPSBuZXh0T2xkTm9kZTsKLQkJLy8KLQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJLy8gZ2V0IHBvaW50ZXJzCi0JCQlmaXJzdE5ldyA9IG5ld05vZGVzLml0ZW0oMCk7Ci0JCQlsYXN0TmV3ID0gbmV3Tm9kZXMuaXRlbShuZXdOb2Rlcy5nZXRMZW5ndGgoKSAtIDEpOwotCQkJLy8gc3dpdGNoIHN1cnJvdW5kaW5nIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMnIHJlZmVyZW5jZXMgdG8KLQkJCS8vIGxpc3RzCi0JCQlpZiAob2xkUHJldmlvdXMgIT0gbnVsbCkKLQkJCQlvbGRQcmV2aW91cy5zZXROZXh0KGZpcnN0TmV3KTsKLQkJCWlmIChvbGROZXh0ICE9IG51bGwpIHsKLQkJCQlvbGROZXh0LnNldFByZXZpb3VzKGxhc3ROZXcpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBTSURFIEVGRkVDVAotCQkJCS8vIGlmIG9sZE5leHQgaXMgbnVsbCwgdGhhdCBtZWFucyB3ZSBhcmUgcmVwbGFjZWluZyB0aGUKLQkJCQkvLyBsYXN0Tm9kZSBpbiB0aGUgY2hhaW4sCi0JCQkJLy8gc28gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN0cnVjdHVyZWREb2N1bWVudHMgbGFzdE5vZGUgYXMKLQkJCQkvLyB0aGUKLQkJCQkvLyBsYXN0IG9mIHRoZSBuZXcgbm9kZXMuCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRMYXN0RG9jdW1lbnRSZWdpb24obmV3Tm9kZXMuaXRlbShuZXdOb2Rlcy5nZXRMZW5ndGgoKSAtIDEpKTsKLQkJCX0KLQkJCWlmIChmaXJzdE5ldyAhPSBudWxsKQotCQkJCWZpcnN0TmV3LnNldFByZXZpb3VzKG9sZFByZXZpb3VzKTsKLQkJCWlmIChsYXN0TmV3ICE9IG51bGwpCi0JCQkJbGFzdE5ldy5zZXROZXh0KG9sZE5leHQpOwotCQl9Ci0JCS8vIGVsc2Ugbm90aGluZyB0byBpbnNlcnQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkUmVnaW9uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29sbGVjdGlvblJlZ2lvbihJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXJldHVybiAoYVJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzaW5nKCkgewotCQlyZXR1cm4gaXNQYXJzaW5nOwotCX0KLQotCS8qKgotCSAqIFRoZSBtaW5pbWl6YXRpb24gYWxnb3JpdGhtIHNpbXBseSBjaGVja3MgdGhlIG9sZCBub2RlcyB0byBzZWUgaWYgYW55IG9mCi0JICogdGhlbSAic3Vydml2ZWQiIHRoZSByZXNjYW4gYW5kIGFyZSB1bmNoYW5nZWQuIElmIHNvLCB0aGUgaW5zdGFuY2Ugb2YKLQkgKiB0aGUgb2xkIG5vZGUgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBuZXcgbm9kZS4gQmVmb3JlIHRoZSByZXF1ZXN0ZWQKLQkgKiBjaGFuZ2UsIG5lZWQgdG8gY2hlY2sgdHlwZSwgb2Zmc2V0cywgYW5kIHRleHQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzYW1lLgotCSAqIEFmdGVyIHRoZSByZXF1ZXN0ZWQgY2hhbmdlLCBuZWVkIHRvIGNoZWNrIHR5cGUgYW5kIHRleHQsIGJ1dCBhZGp1c3QgdGhlCi0JICogb2Zmc2V0cyB0byB3aGF0IGV2ZXIgdGhlIGNoYW5nZSB3YXMuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IG1pbmltdW1FdmVudChDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBldmVudCA9IG51bGw7Ci0JCUNvcmVOb2RlTGlzdCBtaW5pbWFsT2xkTm9kZXMgPSBudWxsOwotCQlDb3JlTm9kZUxpc3QgbWluaW1hbE5ld05vZGVzID0gbnVsbDsKLQkJLy8gVG8gbWluaW1pemUgbm9kZXMsIHdlJ2xsIGNvbGxlY3QgYWxsIHRob3NlCi0JCS8vIHRoYXQgYXJlIG5vdCBlcXVhbCBpbnRvIG9sZCBhbmQgbmV3IGxpc3RzCi0JCS8vIE5vdGU6IHdlIGFzc3VtZSB0aGF0IG9sZCBhbmQgbmV3IG5vZGVzCi0JCS8vIGFyZSBiYXNpY2FsbHkgY29udGlndW91cyAtLSBhbmQgd2UgZm9yY2UgaXQgdG8gYmUgc28sCi0JCS8vIGJ5IHN0YXJ0aW5nIGF0IHRoZSBiZWdpbm5pbmcgdG8KLQkJLy8gZmluZCBmaXJzdCBkaWZmZXJlbmNlLCBhbmQgdGhlbiBzdGFydGluZyBhdCB0aGUgZW5kIHRvIGZpbmQKLQkJLy8gbGFzdCBkaWZmZXJlbmNlLiBFdmVyeXRoaW5nIGluIGJldHdlZW4gd2UgYXNzdW1lIGlzIGRpZmZlcmVudC4KLQkJLy8KLQkJLy8KLQkJLy8KLQkJLy8gc3RhcnRPZkRpZmZlcmVuY2VzIGlzIHRoZSBpbmRleCBpbnRvIHRoZSBjb3JlIG5vZGUgbGlzdCB3aGVyZSB0aGUKLQkJLy8gZmlyc3QgZGlmZmVyZW5jZQotCQkvLyBvY2N1cnMuIEJ1dCBpdCBtYXkgcG9pbnQgaW50byB0aGUgb2xkIG9yIHRoZSBuZXcgbGlzdC4KLQkJaW50IHN0YXJ0T2ZEaWZmZXJlbmNlcyA9IF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzKG9sZE5vZGVzLCBuZXdOb2Rlcyk7Ci0JCWludCBlbmRPZkRpZmZlcmVuY2VzT2xkID0gLTE7Ci0JCWludCBlbmRPZkRpZmZlcmVuY2VzTmV3ID0gLTE7Ci0JCS8vIGlmIG9uZSBvZiB0aGUgbGlzdHMgYXJlIHNob3J0ZXIgdGhhbiB3aGVyZSB0aGUgZGlmZmVyZW5jZXMgc3RhcnQsCi0JCS8vIHRoZW4KLQkJLy8gdGhlbiBzb21lIHBvcnRpb24gb2YgdGhlIGxpc3RzIGFyZSBpZGVudGljYWwKLQkJaWYgKChzdGFydE9mRGlmZmVyZW5jZXMgPj0gb2xkTm9kZXMuZ2V0TGVuZ3RoKCkpIHx8IChzdGFydE9mRGlmZmVyZW5jZXMgPj0gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQlpZiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPCBuZXdOb2Rlcy5nZXRMZW5ndGgoKSkgewotCQkJCS8vIFRoZW4gdGhlcmUgYXJlIG5ldyByZWdpb25zIHRvIGFkZAotCQkJCS8vICAgICB0aGVzZSBsZW5ndGhzIHdpbGwgY2F1c2UgdGhlIHZlY3RvciBvZiBvbGQgb25lcyB0byBub3QKLQkJCQkvLyAgICAgaGF2ZSBhbnkgZWxlbWVudHMsIGFuZCB0aGUgdmVjdG9yIG9mIG5ldyByZWdpb25zIHRvIGhhdmUKLQkJCQkvLyAgICAganVzdCB0aGUgbmV3IG9uZXMgbm90IGluIGNvbW1vbiB3aXRoIHRoZSBvbGQgb25lcwotCQkJCS8vc3RhcnRPZkRpZmZlcmVuY2VzIHNob3VsZCBlcXVhbCBvbGROb2Rlcy5nZXRMZW5ndGgoKSwKLQkJCQkvLyBjYWxjdWxhdGVkIGFib3ZlIG9uIF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzCi0JCQkJbWluaW1hbE9sZE5vZGVzID0gRU1QVFlfTElTVDsKLQkJCQllbmRPZkRpZmZlcmVuY2VzTmV3ID0gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgLSAxOwotCQkJCW1pbmltYWxOZXdOb2RlcyA9IF9mb3JtTWluaW11bUxpc3QobmV3Tm9kZXMsIHN0YXJ0T2ZEaWZmZXJlbmNlcywgZW5kT2ZEaWZmZXJlbmNlc05ldyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA+IG5ld05vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJCS8vIGRlbGV0ZSBvbGQKLQkJCQkJLy8gdGhlbiB0aGVyZSBhcmUgb2xkIHJlZ2lvbnMgdG8gZGVsZXRlCi0JCQkJCS8vICAgIHRoZXNlIGxlbmd0aHMgd2lsbCBjYXVzZSB0aGUgdmVjdG9yIG9mIG9sZCByZWdpb25zIHRvCi0JCQkJCS8vICAgIGNvbnRhaW4gdGhlIG9uZXMgdG8gZGVsZXRlLCBhbmQgdGhlIHZlY3RvciBvZiBuZXcKLQkJCQkJLy8gcmVnaW9ucwotCQkJCQkvLyAgICBub3QgaGF2ZSBhbnkgZWxlbWVudHMKLQkJCQkJLy9zdGFydE9mRGlmZmVyZW5jZXMgc2hvdWxkIGVxdWFsIG5ld05vZGVzLmdldExlbmd0aCgpLAotCQkJCQkvLyBjYWxjdWxhdGVkIGFib3ZlIG9uIF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzCi0JCQkJCWVuZE9mRGlmZmVyZW5jZXNPbGQgPSBvbGROb2Rlcy5nZXRMZW5ndGgoKSAtIDE7Ci0JCQkJCW1pbmltYWxPbGROb2RlcyA9IF9mb3JtTWluaW11bUxpc3Qob2xkTm9kZXMsIHN0YXJ0T2ZEaWZmZXJlbmNlcywgZW5kT2ZEaWZmZXJlbmNlc09sZCk7Ci0JCQkJCW1pbmltYWxOZXdOb2RlcyA9IEVNUFRZX0xJU1Q7Ci0JCQkJfSBlbHNlCi0JCQkJCS8vIHVubGlrZWx5IGV2ZW50Ci0JCQkJCWV2ZW50ID0gbmV3IE5vQ2hhbmdlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudCwgZlJlcXVlc3RlciwgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBXZSBmb3VuZCBhIG5vcm1hbCBzdGFydE9mRGlmZmVybmNlcywgYnV0IGhhdmUgbm90IHlldCBmb3VuZCB0aGUKLQkJCS8vIGVuZHMuCi0JCQkvLyBXZSdsbCBsb29rIGZvciB0aGUgZW5kIG9mIGRpZmZlcmVuY2VzIGJ5IGdvaW5nIGJhY2t3YXJkcyBkb3duCi0JCQkvLyB0aGUgdHdvIGxpc3RzLgotCQkJLy8gSGVyZSB3ZSBuZWVkIGEgc2VwZXJhdGUgaW5kZXggZm9yIGVhY2ggYXJyYXksIHNpbmNlIHRoZXkgbWF5IGJlCi0JCQkvLyAoYW5kCi0JCQkvLyBwcm9iYWJseSBhcmUpIG9mIGRpZmZlcmVudCBsZW5ndGhzLgotCQkJaW50IGluZGV4T2xkID0gb2xkTm9kZXMuZ2V0TGVuZ3RoKCkgLSAxOwotCQkJaW50IGluZGV4TmV3ID0gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgLSAxOwotCQkJLy8gVGhlIGdyZWF0ZXJUaGFuRWZmZWN0ZWRSZWdpb24gaXMgaW1wb3J0YW50IHRvIGdhdXJkIGFnYWluc3QKLQkJCS8vIGluY29ycmVjdCBjb3VudGluZwotCQkJLy8gd2hlbiBzb21ldGhpbmcgaWRlbnRpY2FsIGlzIGluc2VydGVkIHRvIHdoYXQncyBhbHJlYWR5IHRoZXJlCi0JCQkvLyAoc2VlIG1pbmltaXphdGlvbiB0ZXN0IGNhc2UgNSkKLQkJCS8vIE5vdGU6IHRoZSBpbmRleE9sZCA+IHN0YXJ0T2ZEaWZmZXJlbmNlcyBrZWVwcyBpbmRleE9sZCBmcm9tCi0JCQkvLyBnZXR0aW5nIHRvbyBzbWFsbCwKLQkJCS8vIHNvIHRoYXQgdGhlIHN1YnNlcXVlbnQgb2xkTm9kZXMuaXRlbShpbmRleE9sZCkgaXMgYWx3YXlzIHZhbGlkLgotCQkJd2hpbGUgKChpbmRleE9sZCA+PSBzdGFydE9mRGlmZmVyZW5jZXMpICYmIChfZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbihvbGROb2Rlcy5pdGVtKGluZGV4T2xkKSkpKSB7Ci0JCQkJaWYgKCEob2xkTm9kZXMuaXRlbShpbmRleE9sZCkuc2FtZUFzKG5ld05vZGVzLml0ZW0oaW5kZXhOZXcpLCBmTGVuZ3RoRGlmZmVyZW5jZSkpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGlmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIHdlIHdpbGwgYmUga2VlcGluZyB0aGUgb2xkIG9uZSwKLQkJCQkJLy8gc28KLQkJCQkJLy8gd2UgbmVlZCB0byBiZSBzdXJlIGl0cyBwYXJlbnREb2N1bWVudCBpcyBzZXQgYmFjayB0bwotCQkJCQkvLyB0aGUKLQkJCQkJLy8gcmlnaHQgaW5zdGFuY2UKLQkJCQkJb2xkTm9kZXMuaXRlbShpbmRleE9sZCkuc2V0UGFyZW50RG9jdW1lbnQoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQkJfQotCQkJCWluZGV4T2xkLS07Ci0JCQkJaW5kZXhOZXctLTsKLQkJCX0KLQkJCWVuZE9mRGlmZmVyZW5jZXNPbGQgPSBpbmRleE9sZDsKLQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBpbmRleE5ldzsKLQkJCW1pbmltYWxPbGROb2RlcyA9IF9mb3JtTWluaW11bUxpc3Qob2xkTm9kZXMsIHN0YXJ0T2ZEaWZmZXJlbmNlcywgZW5kT2ZEaWZmZXJlbmNlc09sZCk7Ci0JCQltaW5pbWFsTmV3Tm9kZXMgPSBfZm9ybU1pbmltdW1MaXN0KG5ld05vZGVzLCBzdGFydE9mRGlmZmVyZW5jZXMsIGVuZE9mRGlmZmVyZW5jZXNOZXcpOwotCQl9IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3REb3duU3RyZWFtTm9kZSA9IG51bGw7Ci0JCWV2ZW50ID0gcmVnaW9uQ2hlY2sobWluaW1hbE9sZE5vZGVzLCBtaW5pbWFsTmV3Tm9kZXMpOwotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJZmlyc3REb3duU3RyZWFtTm9kZSA9IG1pbmltYWxPbGROb2Rlcy5pdGVtKDApLmdldE5leHQoKTsKLQkJCWlmIChmaXJzdERvd25TdHJlYW1Ob2RlICE9IG51bGwgJiYgZkxlbmd0aERpZmZlcmVuY2UgIT0gMCkgeyAvLyBpZgotCQkJCS8vIGZpcnN0RG93blN0cmVhbQotCQkJCS8vIGlzCi0JCQkJLy8gbnVsbCwKLQkJCQkvLyB0aGVuCi0JCQkJLy8gd2UncmUKLQkJCQkvLyBhdAotCQkJCS8vIHRoZQotCQkJCS8vIGVuZAotCQkJCS8vIG9mCi0JCQkJLy8gdGhlCi0JCQkJLy8gZG9jdW1lbnQKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChmaXJzdERvd25TdHJlYW1Ob2RlLCBmTGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQl9IC8vCi0JCX0gZWxzZSB7Ci0JCQlldmVudCA9IG5vZGVzUmVwbGFjZWRDaGVjayhtaW5pbWFsT2xkTm9kZXMsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCQkvLyBub3cgc3BsaWNlIHRoZSBuZXcgY2hhaW4gb2Ygbm9kZXMgdG8gd2hlcmUgdGhlIG9sZCBjaGFpbiBpcyAob3IKLQkJCS8vIHdhcykKLQkJCS8vIHRoZSBmaXJzdERvd25TdHJlYW1Ob2RlICh0aGUgZmlyc3Qgb2YgdGhvc2UgYWZ0ZXIgdGhlIG5ldwotCQkJLy8gbm9kZXMpCi0JCQkvLyBpcwotCQkJLy8gcmVtZW1iZXJlZCBhcyBhIHRpbnkgb3B0aW1pemF0aW9uLgotCQkJaWYgKG1pbmltYWxPbGROb2Rlcy5nZXRMZW5ndGgoKSA9PSAwICYmIG1pbmltYWxOZXdOb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkvLyBpZiBubyBvbGQgbm9kZXMgYXJlIGJlaW5nIGRlbGV0ZWQsIHRoZW4gdXNlIHRoZQotCQkJCS8vIHRoZSBuZXdOb2RlcyBvZmZzZXQgKG1pbnVzIG9uZSkgdG8gZmluZCB0aGUgcG9pbnQgdG8KLQkJCQkvLyB1cGRhdGUgZG93bnN0cmVhbSBub2RlcywgYW5kIGFmdGVyIHVwZGF0aW5nIGRvd25zdHJlYW0KLQkJCQkvLyBub2RlcyBwb3N0aW9ucywgaW5zZXJ0IHRoZSBuZXcgb25lcy4KLQkJCQlpbnQgaW5zZXJ0T2Zmc2V0ID0gbWluaW1hbE5ld05vZGVzLml0ZW0oMCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RPbGRVbmNoYW5nZWROb2RlID0gbnVsbDsKLQkJCQlpZiAoaW5zZXJ0T2Zmc2V0ID4gMCkgewotCQkJCQlsYXN0T2xkVW5jaGFuZ2VkTm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5zZXJ0T2Zmc2V0IC0gMSk7Ci0JCQkJCWZpcnN0RG93blN0cmVhbU5vZGUgPSBsYXN0T2xkVW5jaGFuZ2VkTm9kZS5nZXROZXh0KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gd2UncmUgaW5zZXJ0aW5nIGF0IHZlcnkgYmVnaW5uaW5nCi0JCQkJCWZpcnN0RG93blN0cmVhbU5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCS8vIFNJREUgRUZGRUNUOiBjaGFuZ2UgdGhlIGZpcnN0Tm9kZSBwb2ludGVyIGlmIHdlJ3JlCi0JCQkJCS8vIGluc2VydGluZyBhdCBiZWdpbm5pbmcKLQkJCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRGaXJzdERvY3VtZW50UmVnaW9uKG1pbmltYWxOZXdOb2Rlcy5pdGVtKDApKTsKLQkJCQl9Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuYWRqdXN0U3RhcnQoZmlyc3REb3duU3RyZWFtTm9kZSwgZkxlbmd0aERpZmZlcmVuY2UpOwotCQkJCWluc2VydE5vZGVzKGxhc3RPbGRVbmNoYW5nZWROb2RlLCBmaXJzdERvd25TdHJlYW1Ob2RlLCBtaW5pbWFsTmV3Tm9kZXMpOwotCQkJCS8vIHRoaXMgKG5vZGVzIHJlcGxhY2VkKSBpcyB0aGUgb25seSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8KLQkJCQkvLyB1cGRhdGUgdGhlIGNhY2hlZCBOb2RlCi0JCQkJcmVTZXRDYWNoZWROb2RlKG1pbmltYWxPbGROb2RlcywgbWluaW1hbE5ld05vZGVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmlyc3REb3duU3RyZWFtTm9kZSA9IHN3aXRjaE5vZGVMaXN0cyhtaW5pbWFsT2xkTm9kZXMsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCQkJLy8gbm8gbmVlZCB0byBhZGp1c3QgdGhlIGxlbmd0aCBvZiB0aGUgbmV3IG5vZGVzIHRoZW1zZWx2ZXMsCi0JCQkJLy8gdGhleQotCQkJCS8vIGFyZSBhbHJlYWR5IGNvcnJlY3QsIGJ1dCB3ZSBkbyBuZWVkIHRvCi0JCQkJLy8gYWRqdXN0IGFsbCAiZG93biBzdHJlYW0iIG5vZGVzIHdpdGggdGhlIGxlbmd0aCBvZiB0aGUKLQkJCQkvLyBpbnNlcnRpb24gb3IgZGVsZXRpb24KLQkJCQkvLyAtLS0gYWRqdXN0bWVudCBtb3ZlZCB0byBjYWxsaW5nIG1ldGhvZC4KLQkJCQlpZiAoZmlyc3REb3duU3RyZWFtTm9kZSAhPSBudWxsKSB7Ci0JCQkJCS8vICYmIGV2ZW50ICE9IG51bGwKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuYWRqdXN0U3RhcnQoZmlyc3REb3duU3RyZWFtTm9kZSwgZkxlbmd0aERpZmZlcmVuY2UpOwotCQkJCX0gLy8KLQkJCQkvLyB0aGlzIChub2RlcyByZXBsYWNlZCkgaXMgdGhlIG9ubHkgY2FzZSB3aGVyZSB3ZSBuZWVkIHRvCi0JCQkJLy8gdXBkYXRlIHRoZSBjYWNoZWQgTm9kZQotCQkJCXJlU2V0Q2FjaGVkTm9kZShtaW5pbWFsT2xkTm9kZXMsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGV2ZW50OwotCX0KLQotCS8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIGFic3RyYWN0LgotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBub2Rlc1JlcGxhY2VkQ2hlY2soQ29yZU5vZGVMaXN0IG9sZE5vZGVzLCBDb3JlTm9kZUxpc3QgbmV3Tm9kZXMpIHsKLQkJLy8gYWN0dWFsbHksIG5vdGhpbmcgdG8gY2hlY2sgaGVyZSwgc2luY2UgKGFuZCBhc3N1bWluZykgd2UndmUgYWxyZWFkeQotCQkvLyBtaW5pbWl6ZWQgdGhlIG51bWJlciBvZiBub2RlcywgYW5kIHJ1bGVkIG91dCBtZXJlIHJlZ2lvbiBjaGFuZ2VzCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBvbGROb2RlcywgbmV3Tm9kZXMsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UsIGZJc0VudGlyZURvY3VtZW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBIG1ldGhvZCB0byBhbGxvdyBhbnkgaGV1cmlzdGljICJxdWljayBjaGVja3MiIHRoYXQgbWlnaHQgY292ZXIgbWFueQotCSAqIG1hbnkgY2FzZXMsIGJlZm9yZSBleHBlbmRpbmcgdGhlIHRpbWUgb24gYSBmdWxsIHJlcGFyc2UuCi0JICogIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBxdWlja0NoZWNrKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgZGlydHkgc3RhcnQgaXMgbnVsbCwgdGhlbiB3ZSBoYXZlIGFuIGVtcHR5IGRvY3VtZW50LgotCQkvLyBpbiB3aGljaCBjYXNlIHdlJ2xsIHJldHVybiBudWxsIHNvIGV2ZXJ5dGhpbmcgY2FuIGJlCi0JCS8vIHJlcGFyc2VkICJmcm9tIHNjcmF0Y2giIC4gSWYgaXRzIG5vdCBudWxsLCB3ZSdsbCBnaXZlIHRoZSBmbGF0bm9kZQotCQkvLyBhCi0JCS8vIGNoYW5jZQotCQkvLyB0byBoYW5kbGUsIGJ1dCBvbmx5IGlmIHRoZXJlIGlzIG9uZSBmbGF0bm9kZSBpbnZvbHZlZC4KLQkJaWYgKGRpcnR5U3RhcnQgIT0gbnVsbCAmJiBkaXJ0eVN0YXJ0ID09IGRpcnR5RW5kKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhcmdldE5vZGUgPSBkaXJ0eVN0YXJ0OwotCQkJcmVzdWx0ID0gZGlydHlTdGFydC51cGRhdGVSZWdpb24oZlJlcXVlc3RlciwgdGFyZ2V0Tm9kZSwgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkvLyBhdCB0aGlzIHBvaW50IG9ubHksIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSB0ZXh0IHN0b3JlIGFuZAotCQkJCS8vIGFuZCBkb3duc3RyZWFtIG5vZGVzLgotCQkJCS8vIEZVVFVSRV9UT19ETzogY2FuIHRoaXMgZGVwZW5kZW5jeSBvbiBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkJCQkvLyBtZXRob2QgYmUgZWxpbWluYXRlZD8KLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnVwZGF0ZURvY3VtZW50RGF0YShmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UsIGZDaGFuZ2VzKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0RG93blN0cmVhbU5vZGUgPSB0YXJnZXROb2RlLmdldE5leHQoKTsKLQkJCQkvLyB0aGVuIGZsYXRub2RlIG11c3QgaGF2ZSBiZWVuIHRoZSBsYXN0IG9uZSwgc28gbmVlZCB0bwotCQkJCS8vIHVwZGF0ZQotCQkJCS8vIGFueSBkb3duc3RyZWFtIG9uZXMKLQkJCQlpZiAoZmlyc3REb3duU3RyZWFtTm9kZSAhPSBudWxsKSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLmFkanVzdFN0YXJ0KGZpcnN0RG93blN0cmVhbU5vZGUsIGZMZW5ndGhEaWZmZXJlbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIElmIG9ubHkgb25lIG5vZGUgaXMgaW52b2x2ZWQsIHNlZXMgaG93IG1hbnkgcmVnaW9ucyBhcmUgY2hhbmdlZC4gSWYKLQkgKiBvbmx5IG9uZSwgdGhlbiBpdHMgYSAncmVnaW9uQ2hhbmdlZCcgZXZlbnQgLi4uIGlmIG1vcmUgdGhhbiBvbmUsIGl0cyBhCi0JICogJ3JlZ2lvbnNSZXBsYWNlZCcgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlZ2lvbkNoZWNrKENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6cmVnaW9uc1JlcGxhY2VkQ2hlY2siKTsgLy8kTk9OLU5MUy0xJAotCQkvLyROT04tTkxTLTEkCi0JCS8vJE5PTi1OTFMtMSQKLQkJLy8gdGhlICJyZWdpb25zUmVwbGFjZWQiIGV2ZW50IGNvdWxkIG9ubHkgYmUgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUKLQkJLy8gbm9kZWxpc3RzCi0JCS8vIGFyZSBlYWNoIG9ubHkgIjEiIGluIGxlbmd0aC4KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IG9sZExlbmd0aCA9IG9sZE5vZGVzLmdldExlbmd0aCgpOwotCQlpbnQgbmV3TGVuZ3RoID0gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWlmICgob2xkTGVuZ3RoICE9IDEpIHx8IChuZXdMZW5ndGggIT0gMSkpIHsKLQkJCXJlc3VsdCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUgPSBvbGROb2Rlcy5pdGVtKDApOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlID0gbmV3Tm9kZXMuaXRlbSgwKTsKLQkJCXJlc3VsdCA9IHJlZ2lvbkNoZWNrKG9sZE5vZGUsIG5ld05vZGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSWYgb25seSBvbmUgbm9kZSBpcyBpbnZvbHZlZCwgc2VlcyBob3cgbWFueSByZWdpb25zIGFyZSBjaGFuZ2VkLiBJZgotCSAqIG9ubHkgb25lLCB0aGVuIGl0cyBhICdyZWdpb25DaGFuZ2VkJyBldmVudCAuLi4gaWYgbW9yZSB0aGFuIG9uZSwgaXRzIGEKLQkgKiAncmVnaW9uc1JlcGxhY2VkJyBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVnaW9uQ2hlY2soSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGUpIHsKLQkJLy8KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMgPSBvbGROb2RlLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMgPSBuZXdOb2RlLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb25bXSBvbGRSZWdpb25zQXJyYXkgPSBvbGRSZWdpb25zLnRvQXJyYXkoKTsKLQkJSVRleHRSZWdpb25bXSBuZXdSZWdpb25zQXJyYXkgPSBuZXdSZWdpb25zLnRvQXJyYXkoKTsKLQkJLy8KLQkJLy8gZm9yIHRoZSAncmVnaW9uc1JlcGxhY2VkJyBldmVudCwgd2UgZG9uJ3QgY2FyZSBpZgotCQkvLyB0aGUgcmVnaW9ucyBjaGFuZ2VkIGR1ZSB0byB0eXBlLCBvciB0ZXh0LAotCQkvLyB3ZSdsbCBqdXN0IGNvbGxlY3QgYWxsIHRob3NlIHRoYXQgYXJlIG5vdCBlcXVhbAotCQkvLyBpbnRvIHRoZSBvbGQgYW5kIG5ldyByZWdpb24gbGlzdHMuCi0JCS8vIE5vdGU6IHdlLCBvZiBjb3Vyc2UsIGFzc3VtZSB0aGF0IG9sZCBhbmQgbmV3IHJlZ2lvbnMKLQkJLy8gYXJlIGJhc2ljYWxseSBjb250aWd1b3VzIC0tIGFuZCB3ZSBmb3JjZSBpdCB0byBiZSBzbywKLQkJLy8gZXZlbiBpZiBub3QgbGl0ZXJhbGx5IHNvLCBieSBzdGFydGluZyBhdCBiZWdpbm5pbmcgdG8KLQkJLy8gZmluZCBmaXJzdCBkaWZmZXJlbmNlLCBhbmQgdGhlbiBzdGFydGluZyBhdCBlbmQgdG8gZmluZAotCQkvLyBsYXN0IGRpZmZlcmVuY2UuIEV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiB3ZSBhc3N1bWUgaXMgZGlmZmVyZW50LgotCQkvLwotCQkvLyBnb2luZyB1cCBpcyBlYXN5LCB3ZSBzdGFydCBhdCB6ZXJvIGluIGVhY2gsIGFuZCBjb250aW51ZQotCQkvLyB0aWxsIHJlZ2lvbnMgYXJlIG5vdCB0aGUgc2FtZS4KLQkJaW50IHN0YXJ0T2ZEaWZmZXJlbmNlcyA9IF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzKG9sZE5vZGUsIG9sZFJlZ2lvbnMsIG5ld05vZGUsIG5ld1JlZ2lvbnMpOwotCQlpbnQgZW5kT2ZEaWZmZXJlbmNlc09sZCA9IC0xOwotCQlpbnQgZW5kT2ZEaWZmZXJlbmNlc05ldyA9IC0xOwotCQkvLwotCQkvLwotCQkvLyBpZiBvbmUgb2YgdGhlIGxpc3RzIGFyZSBzaG9ydGVyIHRoYW4gd2hlcmUgdGhlIGRpZmZlcmVuY2VzIHN0YXJ0LAotCQkvLyB0aGVuCi0JCS8vIHRoZW4gc29tZSBwb3J0aW9uIG9mIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsCi0JCWlmICgoc3RhcnRPZkRpZmZlcmVuY2VzID49IG9sZFJlZ2lvbnMuc2l6ZSgpKSB8fCAoc3RhcnRPZkRpZmZlcmVuY2VzID49IG5ld1JlZ2lvbnMuc2l6ZSgpKSkgewotCQkJaWYgKG9sZFJlZ2lvbnMuc2l6ZSgpIDwgbmV3UmVnaW9ucy5zaXplKCkpIHsKLQkJCQkvLyBJTlNFUlQgQ0FTRQotCQkJCS8vIHRoZW4gdGhlcmUgYXJlIG5ldyByZWdpb25zIHRvIGFkZAotCQkJCS8vICAgICB0aGVzZSBsZW5ndGhzIHdpbGwgY2F1c2UgdGhlIHZlY3RvciBvZiBvbGQgb25lcyB0byBub3QKLQkJCQkvLyAgICAgaGF2ZSBhbnkgZWxlbWVudHMsIGFuZCB0aGUgdmVjdG9yIG9mIG5ldyByZWdpb25zIHRvIGhhdmUKLQkJCQkvLyAgICAganVzdCB0aGUgbmV3IG9uZXMuCi0JCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gb2xkUmVnaW9uc0FycmF5Lmxlbmd0aDsKLQkJCQllbmRPZkRpZmZlcmVuY2VzT2xkID0gb2xkUmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJZW5kT2ZEaWZmZXJlbmNlc05ldyA9IG5ld1JlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob2xkUmVnaW9ucy5zaXplKCkgPiBuZXdSZWdpb25zLnNpemUoKSkgewotCQkJCQkvLyBERUxFVEUgQ0FTRQotCQkJCQkvLyB0aGVuIHRoZXJlIGFyZSBvbGQgcmVnaW9ucyB0byBkZWxldGUKLQkJCQkJLy8gICAgdGhlc2UgbGVuZ3RocyB3aWxsIGNhdXNlIHRoZSB2ZWN0b3Igb2Ygb2xkIHJlZ2lvbnMgdG8KLQkJCQkJLy8gICAgY29udGFpbiB0aGUgb25lcyB0byBkZWxldGUsIGFuZCB0aGUgdmVjdG9yIG9mIG5ldwotCQkJCQkvLyByZWdpb25zCi0JCQkJCS8vICAgIG5vdCBoYXZlIGFueSBlbGVtZW50cwotCQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSBuZXdSZWdpb25zQXJyYXkubGVuZ3RoOwotCQkJCQllbmRPZkRpZmZlcmVuY2VzT2xkID0gb2xkUmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBuZXdSZWdpb25zQXJyYXkubGVuZ3RoIC0gMTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBlbHNlIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsIQotCQkJCQkvLyB1bmxpa2VseSBldmVudCwgcHJvYmFibHkgZXJyb3IgaW4gY3VycmVudCBkZXNpZ24sIHNpbmNlCi0JCQkJCS8vIHdlIGNoZWNrIGZvciBpZGVudGl0eSBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YKLQkJCQkJLy8gcmVwYXJzaW5nLgotCQkJCQlyZXN1bHQgPSBuZXcgTm9DaGFuZ2VFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+IC0xKSAmJiAoZW5kT2ZEaWZmZXJlbmNlc09sZCA8IDApICYmIChlbmRPZkRpZmZlcmVuY2VzTmV3IDwgMCkpIHsKLQkJCQkvLyBXZSBmb3VuZCBhIG5vcm1hbCBzdGFydE9mRGlmZmVybmNlcywgYnV0IGhhdmUgbm90IHlldCBmb3VuZAotCQkJCS8vIHRoZSBlbmRzLgotCQkJCS8vIFdlJ2xsIGxvb2sgZm9yIHRoZSBlbmQgb2YgZGlmZmVyZW5jZXMgYnkgZ29pbmcgYmFja3dhcmRzCi0JCQkJLy8gZG93biB0aGUgdHdvIGxpc3RzLgotCQkJCS8vIEhlcmUgd2UgbmVlZCBhIHNlcGVyYXRlIGluZGV4IGZvciBlYWNoIGFycmF5LCBzaW5jZSB0aGV5Ci0JCQkJLy8gbWF5Ci0JCQkJLy8gYmUgKGFuZAotCQkJCS8vIHByb2JhYmx5IGFyZSkgb2YgZGlmZmVyZW50IGxlbmd0aHMuCi0JCQkJaW50IGluZGV4T2xkID0gb2xkUmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJaW50IGluZGV4TmV3ID0gbmV3UmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJd2hpbGUgKChpbmRleE9sZCA+PSBzdGFydE9mRGlmZmVyZW5jZXMpICYmIChfZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbihvbGROb2RlLCBvbGRSZWdpb25zQXJyYXlbaW5kZXhPbGRdKSkpIHsKLQkJCQkJaWYgKCghKG9sZE5vZGUuc2FtZUFzKG9sZFJlZ2lvbnNBcnJheVtpbmRleE9sZF0sIG5ld05vZGUsIG5ld1JlZ2lvbnNBcnJheVtpbmRleE5ld10sIGZMZW5ndGhEaWZmZXJlbmNlKSkpKSB7Ci0JCQkJCQkvL2VuZE9mRGlmZmVyZW5jZXNPbGQgPSBpbmRleE9uZTsKLQkJCQkJCS8vZW5kT2ZEaWZmZXJlbmNlc05ldyA9IGluZGV4VHdvOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaW5kZXhPbGQtLTsKLQkJCQkJaW5kZXhOZXctLTsKLQkJCQl9Ci0JCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IGluZGV4T2xkOwotCQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBpbmRleE5ldzsKLQkJCX0KLQkJfQotCQkvLwotCQkvLyByZXN1bHQgIT0gbnVsbCBtZWFucyB0aGUgaW1wb3NzaWJsZSBjYXNlIGFib3ZlIG9jY3VycmVkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJLy8gTm93IGZvcm0gdGhlIHR3byB2ZWN0b3JzIG9mIGRpZmZlcmVudCByZWdpb25zCi0JCQlJVGV4dFJlZ2lvbkxpc3QgaG9sZE9sZFJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgaG9sZE5ld1JlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0JCQlpZiAoc3RhcnRPZkRpZmZlcmVuY2VzID4gLTEgJiYgZW5kT2ZEaWZmZXJlbmNlc09sZCA+IC0xKSB7Ci0JCQkJZm9yIChpbnQgaSA9IHN0YXJ0T2ZEaWZmZXJlbmNlczsgaSA8PSBlbmRPZkRpZmZlcmVuY2VzT2xkOyBpKyspIHsKLQkJCQkJaG9sZE9sZFJlZ2lvbnMuYWRkKG9sZFJlZ2lvbnNBcnJheVtpXSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+IC0xICYmIGVuZE9mRGlmZmVyZW5jZXNOZXcgPiAtMSkgewotCQkJCWZvciAoaW50IGkgPSBzdGFydE9mRGlmZmVyZW5jZXM7IGkgPD0gZW5kT2ZEaWZmZXJlbmNlc05ldzsgaSsrKSB7Ci0JCQkJCWhvbGROZXdSZWdpb25zLmFkZChuZXdSZWdpb25zQXJyYXlbaV0pOwotCQkJCX0KLQkJCX0KLQkJCWlmIChob2xkT2xkUmVnaW9ucy5zaXplKCkgPT0gMCAmJiBob2xkTmV3UmVnaW9ucy5zaXplKCkgPT0gMCkgewotCQkJCS8vIHRoZW4gdGhpcyBtZWFucyB0aGUgcmVnaW9ucyB3ZXJlIGlkZW50aWNhbCwgd2hpY2ggbWVhbnMKLQkJCQkvLyBzb21lb25lCi0JCQkJLy8gcGFzdGVkIGV4YWN0bHkgdGhlIHNhbWUgdGhpbmcgdGhleSBoYWQgc2VsZWN0ZWQsIG9yICEhIQotCQkJCS8vIHNvbWVvbmUgZGVsZXRlZCB0aGUgZW5kIGJyYWNrZXQgb2YgdGhlIHRhZy4gISEhPwotCQkJCXJlc3VsdCA9IG5ldyBOb0NoYW5nZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJfSBlbHNlIHsKLQkJCQkvL0lmIGJvdGggaG9sZE9sZFJlZ2lvbnMgYW5kIGhvbGROZXdSZWdpb25zIGFyZSBvZiBsZW5ndGggMSwKLQkJCQkvLyB0aGVuIGl0cwotCQkJCS8vIGEgInJlZ2lvbiBjaGFuZ2VkIiBldmVudCwgZWxzZSBhICJyZWdpb25zIHJlcGxhY2VkIiBldmVudC4KLQkJCQkvLyBzbyB3ZSB3YW50IHRoZSBuZXcgaW5zdGFuY2Ugb2YgcmVnaW9uIHRvIGJlY29tZSBwYXJ0IG9mIHRoZQotCQkJCS8vIG9sZCBpbnN0YW5jZSBvZiBvbGQgbm9kZQotCQkJCWlmICgoaG9sZE9sZFJlZ2lvbnMuc2l6ZSgpID09IDEpICYmIChob2xkTmV3UmVnaW9ucy5zaXplKCkgPT0gMSkgJiYgX3JlZ2lvbnNTYW1lS2luZCgoaG9sZE5ld1JlZ2lvbnMuZ2V0KDApKSwgKGhvbGRPbGRSZWdpb25zLmdldCgwKSkpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5ld09sZFJlZ2lvbiA9IHN3YXBOZXdGb3JPbGRSZWdpb24ob2xkTm9kZSwgaG9sZE9sZFJlZ2lvbnMuZ2V0KDApLCBuZXdOb2RlLCBob2xkTmV3UmVnaW9ucy5nZXQoMCkpOwotCQkJCQkvLyAtLSBuZWVkIHRvIHVwZGF0ZSBhbnkgZG93biBzdHJlYW0gcmVnaW9ucywgd2l0aGluIHRoaXMKLQkJCQkJLy8gJ29sZE5vZGUnCi0JCQkJCXVwZGF0ZURvd25TdHJlYW1SZWdpb25zKG9sZE5vZGUsIG5ld09sZFJlZ2lvbik7Ci0JCQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudCwgZlJlcXVlc3Rlciwgb2xkTm9kZSwgbmV3T2xkUmVnaW9uLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXBsYWNlUmVnaW9ucyhvbGROb2RlLCBob2xkT2xkUmVnaW9ucywgbmV3Tm9kZSwgaG9sZE5ld1JlZ2lvbnMpOwotCQkJCQkvLyAtLSBuZWVkIHRvIHVwZGF0ZSBhbnkgZG93biBzdHJlYW0gcmVnaW9ucywgd2l0aGluIHRoaXMKLQkJCQkJLy8gJ29sZE5vZGUnCi0JCQkJCS8vIGRvbid0IG5lZWQgd2l0aCB0aGUgd2F5IHJlcGxhY2VSZWdpb25zIGlzIGltcGxlbWVudGVkLgotCQkJCQkvLyBJdCBoYW5kbGVzLgotCQkJCQkvL2lmKGhvbGROZXdSZWdpb25zLnNpemUoKSA+IDApCi0JCQkJCS8vdXBkYXRlRG93blN0cmVhbVJlZ2lvbnMob2xkTm9kZSwgKElUZXh0UmVnaW9uKQotCQkJCQkvLyBob2xkTmV3UmVnaW9ucy5sYXN0RWxlbWVudCgpKTsKLQkJCQkJcmVzdWx0ID0gbmV3IFJlZ2lvbnNSZXBsYWNlZEV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIG9sZE5vZGUsIGhvbGRPbGRSZWdpb25zLCBob2xkTmV3UmVnaW9ucywgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQW4gZW50cnkgcG9pbnQgZm9yIHJlcGFyc2luZy4gSXQgY2FsY3VsYXRlcyB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5Ci0JICogZW5kIGZsYXRub2RlcyBiYXNlZCBvbiB0aGUgc3RhcnQgcG9pbnQgYW5kIGxlbmd0aCBvZiB0aGUgY2hhbmdlcy4KLQkgKiAgCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHdlIGRvIG5vdCBoYXZlIGEgY2FjaGVkTm9kZSwgdGhlbiB0aGUgZG9jdW1lbnQKLQkJLy8gbXVzdCBiZSBlbXB0eSwgc28gc2ltcGx5IHVzZSAnbnVsbCcgYXMgdGhlIGRpcnR5U3RhcnQgYW5kIGRpcnR5RW5kCi0JCS8vIG90aGVyd2lzZSwgZmluZCB0aGVtLgotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCWZpbmREaXJ0eVN0YXJ0KGZTdGFydCk7Ci0JCQlpbnQgZW5kID0gZlN0YXJ0ICsgZkxlbmd0aFRvUmVwbGFjZTsKLQkJCWZpbmREaXJ0eUVuZChlbmQpOwotCQl9Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50LmdldENhY2hlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2hlY2tIZXVyaXN0aWNzKCk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSByZXBhcnNlKGRpcnR5U3RhcnQsIGRpcnR5RW5kKTsKLQkJfQotCQllbmRSZVBhcnNlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQW4gZW50cnkgcG9pbnQgZm9yIHJlcGFyc2luZy4gSXQgY2FsY3VsYXRlcyB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5Ci0JICogZW5kIGZsYXRub2RlcyBiYXNlZCBvbiBzdWdnZXN0ZWQgcG9zaXRpb25zIHRvIGJlZ2luIGFuZCBlbmQuIFRoaXMgaXMKLQkgKiBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHBhcnNpbmcgbXVzdCBnbyBiZXlvbmQgdGhlIGltbWVkaWF0ZSBub2RlIGFuZAotCSAqIGl0cyBkaXJlY3QgbmVpZ2hib3JzLgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShpbnQgcmVTY2FuU3RhcnRIaW50LCBpbnQgcmVTY2FuRW5kSGludCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB3ZSBkbyBub3QgaGF2ZSBhIGNhY2hlZE5vZGUsIHRoZW4gdGhlIGRvY3VtZW50Ci0JCS8vIG11c3QgYmUgZW1wdHksIHNvIHNpbXBseSB1c2UgJ251bGwnIGFzIHRoZSBkaXJ0eVN0YXJ0IGFuZCBkaXJ0eUVuZAotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCWZpbmREaXJ0eVN0YXJ0KHJlU2NhblN0YXJ0SGludCk7Ci0JCQlmaW5kRGlydHlFbmQocmVTY2FuRW5kSGludCk7Ci0JCX0KLQkJcmVzdWx0ID0gcmVwYXJzZShkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCk7Ci0JCWlzUGFyc2luZyA9IGZhbHNlOwotCQkvLyBkZWJ1ZwotCQkvL3ZlcmlmeVN0cnVjdHVyZWQocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29yZSByZXBhcnNpbmcgbWV0aG9kIC4uLiBhZnRlciB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5IGVuZCBoYXZlCi0JICogYmVlbiBjYWxjdWxhdGVkIGVsc2V3aGVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IHJlc2NhblN0YXJ0ID0gLTE7Ci0JCWludCByZXNjYW5FbmQgPSAtMTsKLQkJYm9vbGVhbiBmaXJzdFRpbWUgPSBmYWxzZTsKLQkJLy8KLQkJLy8gInNhdmUiIHRoZSBvbGROb2RlcyAodGhhdCBtYXkgYmUgcmVwbGFjZWQpIGluIGEgbGlzdAotCQlDb3JlTm9kZUxpc3Qgb2xkTm9kZXMgPSBmb3JtT2xkTm9kZXMoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCQlpZiAoZGlydHlTdGFydCA9PSBudWxsIHx8IGRpcnR5RW5kID09IG51bGwpIHsKLQkJCS8vIGRpcnR5U3RhcnQgb3IgZGlydHkgZW5kIGFyZSBudWxsLCB0aGVuIHRoYXQgbWVhbnMgd2UgZGlkbid0Ci0JCQkvLyBoYXZlCi0JCQkvLyBhCi0JCQkvLyBjYWNoZWQgbm9kZSwgd2hpY2ggbWVhbnMgd2UgaGF2ZSBhbiBlbXB0eSBkb2N1bWVudCwgc28gd2UKLQkJCS8vIGp1c3QgbmVlZCB0byByZXNjYW4gdGhlIGNoYW5nZXMKLQkJCXJlc2NhblN0YXJ0ID0gMDsKLQkJCXJlc2NhbkVuZCA9IGZDaGFuZ2VzLmxlbmd0aCgpOwotCQkJZmlyc3RUaW1lID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCS8vIHNldCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gcmVzY2FuCi0JCQlyZXNjYW5TdGFydCA9IGRpcnR5U3RhcnQuZ2V0U3RhcnQoKTsKLQkJCS8vCi0JCQkvLyBzZXQgdGhlIGVuZCBvZiB0aGUgdGV4dCB0byByZXNjYW4KLQkJCS8vIG5vdGljZSB3ZSB1c2UgdGhlIHNhbWUgcmF0aW9uYWxlIGFzIGZvciB0aGUgcmVzY2FuU3RhcnQsCi0JCQkvLyB3aXRoIHRoZSBhZGRlZCBjYXZlYXQgdGhhdCBsZW5ndGggaGFzIHRvIGJlIGFkZGVkIHRvIGl0LAotCQkJLy8gdG8gY29tcGVuc2F0ZSBmb3IgdGhlIG5ldyB0ZXh0IHdoaWNoIGhhcyBiZWVuIGFkZGVkIG9yIGRlbGV0ZWQuCi0JCQkvLyBJZiBjaGFuZ2VzIGhhcyB6ZXJvIGxlbmd0aCwgdGhlbiAibGVuZ3RoIiB3aWxsIGJlIG5lZ2F0aXZlLAotCQkJLy8gc2luY2UKLQkJCS8vIHdlIGFyZSBkZWxldGluZyB0ZXh0LiBPdGhlcndpc2UsIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0JCQkvLyB3aGF0J3Mgc2VsZWN0ZWQgdG8gYmUgcmVwbGFjZWQgYW5kIHRoZSBsZW5ndGggb2YgdGhlIG5ldyB0ZXh0LgotCQkJcmVzY2FuRW5kID0gZGlydHlFbmQuZ2V0RW5kKCkgKyBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJfQotCQkvLyBub3cgdGhhdCB3ZSBoYXZlIHRoZSBvbGQgc3R1ZmYgInNhdmVkIiBhd2F5LCB1cGRhdGUgdGhlIGRvY3VtZW50Ci0JCS8vIHdpdGggdGhlIGNoYW5nZXMuCi0JCS8vIEZVVFVSRV9UT19ETyAtLSBkb24ndCBmaXJlICJkb2N1bWVudCBjaGFuZ2VkIiBldmVudCB0aWxsIGxhdGVyCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQudXBkYXRlRG9jdW1lbnREYXRhKGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSwgZkNoYW5nZXMpOwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0gbm93IHRoZSByZWFsIHdvcmsKLQkJcmVzdWx0ID0gY29yZV9yZXBhcnNlKHJlc2NhblN0YXJ0LCByZXNjYW5FbmQsIG9sZE5vZGVzLCBmaXJzdFRpbWUpOwotCQkvLwotCQkvLyBldmVudCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLCBpbmNhc2UgdGhlcmUgaXMKLQkJLy8gc29tZSBvcGl0bWl6YXRpb24gdGhleSBjYW4gZG8KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGUsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zKSB7Ci0JCWludCBpbnNlcnRQb3MgPSAtMTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBvbGROb2RlLmdldFJlZ2lvbnMoKTsKLQkJLy8gbWFrZSBhIGZha2UgZmxhdG5vZGUgdG8gYmUgbmV3IHBhcmVudCBvZiBvbGRSZWdpb25zLCBzbyB0aGVpciB0ZXh0Ci0JCS8vIHdpbGwgYmUgcmlnaHQuCi0JCS8vSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBob2xkT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Ci0JCS8vIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZE5vZGUpOwotCQkvLwotCQkvLyBuZWVkIHRvIHJlc2V0IHRoZSBwYXJlbnQgb2YgdGhlIG5ldyB0by1iZS1pbnNlcnRlZCByZWdpb25zIHRvIGJlCi0JCS8vIHRoZQotCQkvLyBzYW1lIG9sZE5vZGUgdGhhdCBpcyB0aGUgb25lIGhhdmluZyBpdHMgcmVnaW9ucyBjaGFuZ2VkCi0JCS8vIERXLCA0LzE2LzIwMDMsIHJlbW92ZWQgc2luY2UgSVRleHRSZWdpb24gbm8gbG9uZ2VyIGhhcyBwYXJlbnQuCi0JCS8vIAkJSVRleHRSZWdpb25Db250YWluZXIgb2xkUGFyZW50ID0gb2xkTm9kZTsKLQkJLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3UmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkvLwkJCUFic3RyYWN0UmVnaW9uIHJlZ2lvbiA9IChBYnN0cmFjdFJlZ2lvbikgbmV3UmVnaW9ucy5lbGVtZW50QXQoaSk7Ci0JCS8vCQkJcmVnaW9uLnNldFBhcmVudChvbGRQYXJlbnQpOwotCQkvLwkJfQotCQkvLyBpZiB0aGVyZSBhcmUgbm8gb2xkIHJlZ2lvbnMsIGluc2VydCB0aGUgbmV3IHJlZ2lvbnMgYWNjb3JkaW5nIHRvCi0JCS8vIG9mZnNldAotCQlpZiAob2xkUmVnaW9ucy5zaXplKCkgPT0gMCkgewotCQkJSVRleHRSZWdpb24gZmlyc3ROZXdSZWdpb24gPSBuZXdSZWdpb25zLmdldCgwKTsKLQkJCWludCBmaXJzdE9mZnNldCA9IG5ld05vZGUuZ2V0U3RhcnRPZmZzZXQoZmlyc3ROZXdSZWdpb24pOwotCQkJLy8gaWYgYXQgYmVnaW5uaW5nLCBpbnNlcnQgdGhlcmUKLQkJCWlmIChmaXJzdE9mZnNldCA9PSAwKSB7Ci0JCQkJaW5zZXJ0UG9zID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8KLQkJCQlJVGV4dFJlZ2lvbiByZWdpb25BdE9mZnNldCA9IG9sZE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZmlyc3RPZmZzZXQpOwotCQkJCWlmIChyZWdpb25BdE9mZnNldCA9PSBudWxsKQotCQkJCQlpbnNlcnRQb3MgPSByZWdpb25zLnNpemUoKTsKLQkJCQllbHNlCi0JCQkJCWluc2VydFBvcyA9IHJlZ2lvbnMuaW5kZXhPZihyZWdpb25BdE9mZnNldCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBlbHNlLCBkZWxldGUgb2xkIG9uZXMgYmVmb3JlIGluc2VydGluZyBuZXcgb25lcyBpbiB0aGVpciBwbGFjZQotCQkJSVRleHRSZWdpb24gZmlyc3RPbGRSZWdpb24gPSBvbGRSZWdpb25zLmdldCgwKTsKLQkJCWluc2VydFBvcyA9IHJlZ2lvbnMuaW5kZXhPZihmaXJzdE9sZFJlZ2lvbik7Ci0JCQlyZWdpb25zLnJlbW92ZUFsbChvbGRSZWdpb25zKTsKLQkJfQotCQlyZWdpb25zLmFkZEFsbChpbnNlcnRQb3MsIG5ld1JlZ2lvbnMpOwotCQkvLyBub3cgcmVnaW9ucyB2ZWN0b3Igb2YgZWFjaCBub2RlIHNob3VsZCBiZSBvZiBlcXVhbCBsZW5ndGgsCi0JCS8vIHNvIGdvIHRocm91Z2ggZWFjaCwgYW5kIG1ha2Ugc3VyZSB0aGUgb2xkIHJlZ2lvbnMKLQkJLy8gb2Zmc2V0cyBtYXRjaGVzIHRoZSBuZXcgcmVnaW9ucyBvZmZzZXRzCi0JCS8vICh3ZSdsbCBqdXN0IGFzc2lnbiB0aGVtIGFsbCwgYnV0IGNvdWxkIGJlIHNsaWdodGx5IG1vcmUgZWZmaWVjaWVudCkKLQkJSVRleHRSZWdpb25MaXN0IGFsbE5ld1JlZ2lvbnMgPSBuZXdOb2RlLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuZXh0T2xkaXNoUmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlJVGV4dFJlZ2lvbiBuZXh0TmV3UmVnaW9uID0gYWxsTmV3UmVnaW9ucy5nZXQoaSk7Ci0JCQluZXh0T2xkaXNoUmVnaW9uLmVxdWF0ZVBvc2l0aW9ucyhuZXh0TmV3UmVnaW9uKTsKLQkJCWNoZWNrQW5kQXNzaWduUGFyZW50KG9sZE5vZGUsIG5leHRPbGRpc2hSZWdpb24pOwotCQl9Ci0JCW9sZE5vZGUuc2V0TGVuZ3RoKG5ld05vZGUuZ2V0TGVuZ3RoKCkpOwotCQlvbGROb2RlLnNldEVuZGVkKG5ld05vZGUuaXNFbmRlZCgpKTsKLQkJb2xkTm9kZS5zZXRQYXJlbnREb2N1bWVudChuZXdOb2RlLmdldFBhcmVudERvY3VtZW50KCkpOwotCQkvLyByZW1vdmVkIGNvbmNlcHQgb2YgcGFydCBvZiB0aGVzZSByZWdpb25zLCBzbyBubyBsb25nZXIgbmVlZCB0byBkby4KLQkJLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkUmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkvLwkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgb2xkUmVnaW9ucy5lbGVtZW50QXQoaSk7Ci0JCS8vCQkJcmVnaW9uLnNldFBhcmVudChob2xkT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJLy8JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVTZXRDYWNoZWROb2RlKENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCS8vIHVzZSB0aGUgbGFzdCBuZXdOb2RlIGFzIHRoZSBuZXcgY2FjaGVkTm9kZSBwb3N0aW9uLCB1bmxlc3MgaXRzIG51bGwKLQkJLy8gKGUuZy4gd2hlbiBub2RlcyBhcmUgZGVsZXRlZCkgaW4gd2hpY2ggY2FzZSwgYXNzaWduCi0JCS8vIGl0IHRvIGEgInNhZmUiIG5vZGUgc28gd2UgZG9uJ3QgbG9zZSByZWZlcmVuY2UgdG8gdGhlCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudCEKLQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJLy8gdXNlIGxhc3QgbmV3IG5vZGUgYXMgdGhlIGNhY2hlCi0JCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKG5ld05vZGVzLml0ZW0obmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgLSAxKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiBjYWNoZWROb2RlIGlzIGFuIG9sZCBub2RlLCB0aGVuIHdlJ3JlIGluIHRyb3VibGU6Ci0JCQkvLyB3ZSBjYW4ndCBsZWF2ZSBpdCBhcyB0aGUgY2FjaGVkIG5vZGUhIGFuZCBpdHMgYWxyZWFkeQotCQkJLy8gYmVlbiBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgbW9kZWwsIHNvIHdlIGNhbid0IGRvIGdldE5leHQKLQkJCS8vIG9yIGdldFByZXZpb3VzLCBzbyB3ZSdsbCBnZXQgb25lIHRoYXQgaXMgcmlnaHQgYmVmb3JlCi0JCQkvLyAob3IgcmlnaHQgYWZ0ZXIpIHRoZSBvZmZzZXQgb2YgdGhlIG9sZCBub2RlcyB0aGF0IGFyZSBiZWluZwotCQkJLy8gZGVsZXRlZC4KLQkJCS8vIAotCQkJLy8gaWYgbmV3Tm9kZXNIZWFkIGFuZCBjYWNoZWROb2RlIGFyZSBib3RoIG51bGwsIHRoZW4KLQkJCS8vIGl0IG1lYW5zIHdlIHdlcmUgYXNrZWQgdG8gaW5zZXJ0IGFuIGVtcHR5IHN0cmluZyBpbnRvCi0JCQkvLyBhbiBlbXB0eSBkb2N1bWVudC4gU28gd2UgaGF2ZSBub3RoaW5nIHRvIGRvIGhlcmUKLQkJCS8vICh0aGF0IGlzLCB3ZSBoYXZlIG5vIG5vZGUgdG8gY2FjaGUpCi0JCQkvLyBzaW1pbGFybHkgaWYgdGhlcmUgYXJlIG5vIG5ldyBub2RlcyBhbmQgbm8gb2xkIG5vZGVzIHRoZW4KLQkJCS8vIG5vdGhpbmcgdG8gZG8gKGJ1dCB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4gLi4uIHdlIHNob3VsZG4ndAotCQkJLy8gZ2V0IHRoZXJlIGlmIHRoZXJlIGlzIG5vIGV2ZW50IHRvIGdlbmVyYXRlKS4KLQkJCWlmICgoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpICYmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQkJLy8gbm90ZTogd2UgY2FuJ3Qgc2ltcGxlIHVzZSBub2RlQXRDaGFyYWN0ZXJPZmZzZXQsIHNpbmNlIGl0Ci0JCQkJLy8gZGVwZW5kcyBvbiBjYWNoZWROb2RlLgotCQkJCWlmIChvbGROb2Rlcy5pbmNsdWRlcyhmU3RydWN0dXJlZERvY3VtZW50LmdldENhY2hlZERvY3VtZW50UmVnaW9uKCkpKQotCQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQl9Ci0JCQlpZiAoKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSAmJiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSkgewotCQkJCS8vIHRoaXMgd2lsbCBoYXBwZW4gbm93IGxlZ2l0YW1hdGVseSB3aGVuIGFsbCB0ZXh0IGlzIGRlbGV0ZWQKLQkJCQkvLyBmcm9tIGEgZG9jdW1lbnQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOjpyZVNldENhY2hlZE5vZGU6IGNvdWxkIG5vdCBmaW5kIGEgbm9kZSB0byBjYWNoZSEgKGl0cyBvayBpZiBhbGwgdGV4dCBkZWxldGVkKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJLy8gTk9URTogdGhpcyBtZXRob2QgKGFuZCBjbGFzcykgZGVwZW5kIG9uIGJlaW5nIGFibGUgdG8KLQkJLy8gZG8gdGhlIGZvbGxvd2luZyBjYXN0IChpLmUuIHJlZmVyZW5jZXMgc29tZSBmaWVsZHMgZGlyZWN0bHkpCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIG5ld1N0cnVjdHVyZWREb2N1bWVudDsKLQkJZkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3BsaWNlKENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3RPbGQgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0TmV3ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0T2xkID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0TmV3ID0gbnVsbDsKLQkJLy8KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRQcmV2aW91cyA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTmV4dCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3UHJldmlvdXMgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05leHQgPSBudWxsOwotCQkvLwotCQkvLyBpZiBjYWxsZWQgd2l0aCBib3RoIGFyZ3VtZW50cyBlbXB0eSBsaXN0cywgd2UgY2FuIGRpc3JlZ2FyZC4KLQkJLy8gdGhpcyBoYXBwZW5zLCBmb3IgZXhhbXBsZSwgd2hlbiBzb21lIHRleHQgaXMgcmVwbGFjZWQgd2l0aCB0aGUKLQkJLy8gaWRlbnRpY2FsIHRleHQuCi0JCWlmICgob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgJiYgKG5ld05vZGVzLmdldExlbmd0aCgpID09IDApKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyBnZXQgcG9pbnRlcnMKLQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJZmlyc3ROZXcgPSBuZXdOb2Rlcy5pdGVtKDApOwotCQkJbGFzdE5ldyA9IG5ld05vZGVzLml0ZW0obmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJfQotCQkvLwotCQlpZiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlmaXJzdE9sZCA9IG9sZE5vZGVzLml0ZW0oMCk7Ci0JCQlsYXN0T2xkID0gb2xkTm9kZXMuaXRlbShvbGROb2Rlcy5nZXRMZW5ndGgoKSAtIDEpOwotCQkJaWYgKGZpcnN0T2xkICE9IG51bGwpCi0JCQkJb2xkUHJldmlvdXMgPSBmaXJzdE9sZC5nZXRQcmV2aW91cygpOwotCQkJaWYgKGxhc3RPbGQgIT0gbnVsbCkKLQkJCQlvbGROZXh0ID0gbGFzdE9sZC5nZXROZXh0KCk7Ci0JCX0KLQkJLy8gaGFuZGxlIHN3aXRjaAotCQlpZiAobmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBzd2l0Y2ggc3Vycm91bmRpbmcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucycgcmVmZXJlbmNlcyB0bwotCQkJLy8gbGlzdHMKLQkJCWlmIChvbGRQcmV2aW91cyAhPSBudWxsKQotCQkJCW9sZFByZXZpb3VzLnNldE5leHQoZmlyc3ROZXcpOwotCQkJaWYgKG5ld1ByZXZpb3VzICE9IG51bGwpCi0JCQkJbmV3UHJldmlvdXMuc2V0TmV4dChmaXJzdE9sZCk7Ci0JCQlpZiAob2xkTmV4dCAhPSBudWxsKQotCQkJCW9sZE5leHQuc2V0UHJldmlvdXMobGFzdE5ldyk7Ci0JCQlpZiAobmV3TmV4dCAhPSBudWxsKQotCQkJCW5ld05leHQuc2V0UHJldmlvdXMobGFzdE9sZCk7Ci0JCQkvLyBzd2l0Y2ggbGlzdCBwb2ludGVycyB0byBzdXJyb3VuZGluZyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQlpZiAoZmlyc3RPbGQgIT0gbnVsbCkKLQkJCQlmaXJzdE9sZC5zZXRQcmV2aW91cyhuZXdQcmV2aW91cyk7Ci0JCQlpZiAobGFzdE9sZCAhPSBudWxsKQotCQkJCWxhc3RPbGQuc2V0TmV4dChuZXdOZXh0KTsKLQkJCWlmIChmaXJzdE5ldyAhPSBudWxsKQotCQkJCWZpcnN0TmV3LnNldFByZXZpb3VzKG9sZFByZXZpb3VzKTsKLQkJCWlmIChsYXN0TmV3ICE9IG51bGwpCi0JCQkJbGFzdE5ldy5zZXROZXh0KG9sZE5leHQpOwotCQl9IGVsc2UgewotCQkJLy8gc2hvcnQgY2lyY3VpdCB3aGVuIHRoZXJlIGFyZSBubyBuZXcgbm9kZXMKLQkJCWlmIChvbGRQcmV2aW91cyAhPSBudWxsKQotCQkJCW9sZFByZXZpb3VzLnNldE5leHQob2xkTmV4dCk7Ci0JCQlpZiAob2xkTmV4dCAhPSBudWxsKQotCQkJCW9sZE5leHQuc2V0UHJldmlvdXMob2xkUHJldmlvdXMpOwotCQl9Ci0JCS8vCi0JCS8vIFNJREUgRUZGRUNUcwotCQkvLyBpZiB3ZSBoYXZlIG9sZE5vZGVzLCBhbmQgaWYgb2xkTmV4dCBvciBvbGRQcmV2aW91cyBpcyBudWxsLAotCQkvLyB0aGF0IG1lYW5zIHdlIGFyZSByZXBsYWNpbmcKLQkJLy8gdGhlIGxhc3ROb2RlIG9yIGZpcnN0Tm9kZSB0aGUgc3RydWN0dXJlZERvY3VtZW50cydzIGNoYWluIG9mIG5vZGVzLAotCQkvLyBzbyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3RydWN0dXJlZERvY3VtZW50cyBsYXN0IG9yIGZpcnN0IE5vZGUKLQkJLy8gYXMgdGhlIGxhc3Qgb3IgZmlyc3Qgb2YgdGhlIG5ldyBub2Rlcy4KLQkJLy8gKGFuZCBzb21ldGltZXMgZXZlbiB0aGVzZSB3aWxsIGJlIG51bGwhIHN1Y2ggYXMgd2hlbiBkZWxldGluZyBhbGwKLQkJLy8gdGV4dCBpbiBhIGRvY3VtZW50KS4KLQkJaWYgKChvbGROZXh0ID09IG51bGwpICYmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQlpZiAobmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRMYXN0RG9jdW1lbnRSZWdpb24obGFzdE5ldyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGluIHRoaXMgY2FzZSwgdGhlIGxhc3Qgbm9kZSBpcyBiZWluZyBkZWxldGVkLCBidXQgbm90Ci0JCQkJLy8gcmVwbGFjZWQKLQkJCQkvLyB3aXRoIGFueXRoaW5nLiBJbiB0aGlzIGNhc2UsIHdlIGNhbiBqdXN0IGJhY2sgdXAgb25lCi0JCQkJLy8gZnJvbSB0aGUgZmlyc3Qgb2xkIG5vZGUKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldExhc3REb2N1bWVudFJlZ2lvbihmaXJzdE9sZC5nZXRQcmV2aW91cygpKTsKLQkJCX0KLQkJfQotCQlpZiAoKG9sZFByZXZpb3VzID09IG51bGwpICYmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQlpZiAobmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRGaXJzdERvY3VtZW50UmVnaW9uKGZpcnN0TmV3KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gaW4gdGhpcyBjYXNlIHRoZSBmaXJzdCBub2RlIGlzIGJlaW5nIGRlbGV0ZWQsIGJ1dCBub3QKLQkJCQkvLyByZXBsYWNlZAotCQkJCS8vIHdpdGggYW55dGhpbmcuIFNvLCB3ZSBqdXN0IGdvIG9uZSBmb3J3YXJkIHBhc3QgdGhlIGxhc3Qgb2xkCi0JCQkJLy8gbm9kZS4KLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldEZpcnN0RG9jdW1lbnRSZWdpb24obGFzdE9sZC5nZXROZXh0KCkpOwotCQkJfQotCQl9Ci0JCS8vIGFzIGEgdGlueSBvcHRpbWl6YXRpb24sIHdlIHJldHVybiB0aGUgZmlyc3Qgb2YgdGhlIGRvd25zdHJlYW0KLQkJLy8gbm9kZXMsCi0JCS8vIGlmIGFueQotCQlyZXR1cm4gb2xkTmV4dDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byAicmV1c2UiIHRoZSBvbGQgY29udGFpbmVyIHJlZ2lvbiwgd2hlbgotCSAqIGZvdW5kIHRvIGJlIHNhbWUgKHNvIHNhbWUgaW5zdGFuY2UgZG9lc24ndCBjaGFuZ2UpLiBUaGUgZ29hbCBpcyB0bwotCSAqICJ0cmFuc2Zvcm0iIHRoZSBvbGQgcmVnaW9uLCBzbyBpdHMgZXF1aXZlbGVudCB0byB0aGUgbmV3bHkgcGFyc2VkIG9uZS4KLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBzd2FwTmV3Rm9yT2xkUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSwgSVRleHRSZWdpb24gb2xkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGUsIElUZXh0UmVnaW9uIG5ld1JlZ2lvbikgewotCQkvLyBtYWtlcyB0aGUgb2xkIHJlZ2lvbiBpbnN0YW5jZSB0aGUgY29ycmVjdCBzaXplLgotCQlvbGRSZWdpb24uZXF1YXRlUG9zaXRpb25zKG5ld1JlZ2lvbik7Ci0JCS8vIGFkanVzdHMgb2xkIG5vZGUgaW5zdGFuY2UgYXBwcm9wcmlhdGVseQotCQlvbGROb2RlLnNldExlbmd0aChuZXdOb2RlLmdldExlbmd0aCgpKTsKLQkJb2xkTm9kZS5zZXRFbmRlZChuZXdOb2RlLmlzRW5kZWQoKSk7Ci0JCS8vIHdlIGRvIGhhdmUgdG8gc2V0IHRoZSBwYXJlbnQgZG9jdW1lbnQsIHNpbmNlIHRoZSBvbGROb2RlJ3MKLQkJLy8gd2VyZSBzZXQgdG8gYSB0ZW1wb3Jhcnkgb25lLCB0aGVuIG5ld05vZGUncyBoYXZlIHRoZQotCQkvLyByaWdodCBvbmUuCi0JCW9sZE5vZGUuc2V0UGFyZW50RG9jdW1lbnQobmV3Tm9kZS5nZXRQYXJlbnREb2N1bWVudCgpKTsKLQkJLy8gaWYgd2UncmUgdHJhbnNmb3JtaW5nIGEgY29udGFpbmVyIHJlZ2lvbiwgd2UgbmVlZCB0byBiZSBzdXJlIHRvCi0JCS8vIHRyYW5zZmVyIHRoZSBuZXcgZW1iZWRkZWQgcmVnaW9ucywgdG8gdGhlIG9sZCBwYXJlbnQKLQkJLy8gTm90ZTogaWYgb2xkUmVnaW9uIGhhc0VtYmVkZGVkUmVnaW9ucywgdGhlbiB3ZSBrbm93IHRoZQotCQkvLyBuZXdSZWdpb24gZG9lcyB0b28sIHNpbmNlIHdlIGdvdCBoZXJlIGJlY2F1c2UgdGhleSB3ZXJlIHRoZQotCQkvLyBzYW1lIHR5cGUuCi0JCWlmIChpc0NvbGxlY3Rpb25SZWdpb24ob2xkUmVnaW9uKSkgeyAvLyB8fAotCQkJLy8gaGFzQ29udGFpbmVyUmVnaW9ucyhvbGRSZWdpb24pKQotCQkJLy8gewotCQkJdHJhbnNmZXJFbWJlZGRlZFJlZ2lvbnMob2xkTm9kZSwgKElUZXh0UmVnaW9uQ29udGFpbmVyKSBvbGRSZWdpb24sIChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgbmV3UmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gb2xkUmVnaW9uOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzd2l0Y2hOb2RlTGlzdHMoQ29yZU5vZGVMaXN0IG9sZE5vZGVzLCBDb3JlTm9kZUxpc3QgbmV3Tm9kZXMpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBzcGxpY2Uob2xkTm9kZXMsIG5ld05vZGVzKTsKLQkJLy8gZW5zdXJlIHRoYXQgdGhlIG9sZCBub2RlcyBob2xkIG5vIHJlZmVyZW5jZXMgdG8gdGhlIGV4aXN0aW5nIG1vZGVsCi0JCWlmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3RJdGVtID0gb2xkTm9kZXMuaXRlbSgwKTsKLQkJCWZpcnN0SXRlbS5zZXRQcmV2aW91cyhudWxsKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdEl0ZW0gPSBvbGROb2Rlcy5pdGVtKG9sZE5vZGVzLmdldExlbmd0aCgpIC0gMSk7Ci0JCQlsYXN0SXRlbS5zZXROZXh0KG51bGwpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gInJldXNlIiB0aGUgb2xkIGNvbnRhaW5lciByZWdpb24sIHdoZW4KLQkgKiBmb3VuZCB0byBiZSBzYW1lIChzbyBzYW1lIGluc3RhbmNlIGRvZXNuJ3QgY2hhbmdlKS4gVGhlIGdvYWwgaXMgdG8KLQkgKiAidHJhbnNmb3JtIiB0aGUgb2xkIHJlZ2lvbiwgc28gaXRzIGVxdWl2ZWxlbnQgdG8gdGhlIG5ld2x5IHBhcnNlZCBvbmUuCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFuc2ZlckVtYmVkZGVkUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uQ29udGFpbmVyIG9sZFJlZ2lvbiwgSVRleHRSZWdpb25Db250YWluZXIgbmV3UmVnaW9uKSB7Ci0JCS8vIHRoZSBvbGRSZWdpb24gc2hvdWxkIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgcGFyZW50LCBzaW5jZQotCQkvLyB3ZSBnb3QgaGVyZSBiZWNhdXNlIGFsbCdzIGVxdWl2ZWxlbnQgZXhjZXB0IHRoZSByZWdpb24KLQkJLy8gcG9zdGlvbnMgaGF2ZSBjaGFuZ2VkLgotCQkvL29sZFJlZ2lvbi5zZXRQYXJlbnQobmV3UmVnaW9uLmdldFBhcmVudCgpKTsKLQkJLy8gYnV0IHdlIHNob3VsZCBjaGVjayBpZiB0aGVyZSdzICJuZXN0ZWQiIGVtYmVkZGVkIHJlZ2lvbnMsIGFuZCBpZgotCQkvLyBzbywgd2UgY2FuIGp1c3QgbW92ZSB0aGVtIG92ZXIuIHNldHRpbmcgdGhlaXIgcGFyZW50IGFzIHRoaXMgb2xkCi0JCS8vIHJlZ2lvbi4KLQkJSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnNUb1RyYW5zZmVyID0gbmV3UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJb2xkUmVnaW9uLnNldFJlZ2lvbnMobmV3UmVnaW9uc1RvVHJhbnNmZXIpOwotCQlJdGVyYXRvciBuZXdSZWdpb25zSW5PbGRPbmUgPSBuZXdSZWdpb25zVG9UcmFuc2Zlci5pdGVyYXRvcigpOwotCQl3aGlsZSAobmV3UmVnaW9uc0luT2xkT25lLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gbmV3T25lID0gKElUZXh0UmVnaW9uKSBuZXdSZWdpb25zSW5PbGRPbmUubmV4dCgpOwotCQkJaWYgKGlzQ29sbGVjdGlvblJlZ2lvbihuZXdPbmUpKSB7IC8vIHx8Ci0JCQkJLy8gaGFzQ29udGFpbmVyUmVnaW9ucyhuZXdPbmUpKSB7Ci0JCQkJLy8oKElUZXh0UmVnaW9uQ29udGFpbmVyKSBuZXdPbmUpLnNldFBhcmVudChvbGRSZWdpb24pOwotCQkJCW9sZFJlZ2lvbi5zZXRSZWdpb25zKG5ld1JlZ2lvbi5nZXRSZWdpb25zKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURvd25TdHJlYW1SZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIGxhc3RLbm93blJlZ2lvbikgewotCQkvLyBzbyBhbGwgcmVnaW9ucyBhZnRlciB0aGUgbGFzdCBrbm93biByZWdpb24gKGxhc3Qga25vd24gdG8gYmUgb2spCi0JCS8vIGhhdmUgdG8gaGF2ZSB0aGVpciBzdGFydCBhbmQgZW5kIHZhbHVlcyBhZGp1c3RlZC4KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWludCBsaXN0TGVuZ3RoID0gcmVnaW9ucy5zaXplKCk7Ci0JCWludCBzdGFydEluZGV4ID0gMDsKLQkJLy8gZmlyc3QsIGxvb3AgdGhyb3VnaCB0byBmaW5kIHdoZXJlIHRvIHN0YXJ0Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyZWdpb24gPT0gbGFzdEtub3duUmVnaW9uKSB7Ci0JCQkJc3RhcnRJbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gbm93LCBiZWdpbm5pbmcgb25lIHBhc3QgdGhlIGxhc3Qga25vd24gb25lLCBsb29wCi0JCS8vIHRocm91Z2ggdG8gZW5kIG9mIGxpc3QsIGFkanVzdGluZyB0aGUgc3RhcnQgYW5kIGVuZCBwb3N0aW9ucy4KLQkJc3RhcnRJbmRleCsrOwotCQlmb3IgKGludCBqID0gc3RhcnRJbmRleDsgaiA8IGxpc3RMZW5ndGg7IGorKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaik7Ci0JCQlyZWdpb24uYWRqdXN0U3RhcnQoZkxlbmd0aERpZmZlcmVuY2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5MTE5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLQotCXByaXZhdGUgaW50IGNvdW50OwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRIZWFkOwotCi0JLyoqCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdIZWFkKSB7Ci0JCXN1cGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY291bnROb2RlID0gaGVhZCA9IG5ld0hlYWQ7Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gbnVsbCkgewotCQkJY291bnQrKzsKLQkJCWNvdW50Tm9kZSA9IGNvdW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKERlYnVnLkRFQlVHID4gNSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOIE5vZGVzIGluIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uIENvbnRydWN0b3I6ICIgKyBjb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY291bnROb2RlID0gaGVhZCA9IHN0YXJ0OwotCQlpZiAoKHN0YXJ0ID09IG51bGwpIHx8IChlbmQgPT0gbnVsbCkpIHsKLQkJCS8vIGVycm9yIGNvbmRpdGlvbgotCQkJY291bnQgPSAwOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vSWYgYm90aCBub2RlcyBhcmUgbm9uLW51bGwsIHdlIGFzc3VtZSB0aGVyZSBpcyBhbHdheXMgYXQgbGVhc3Qgb25lCi0JCS8vIGl0ZW0KLQkJY291bnQgPSAxOwotCQl3aGlsZSAoY291bnROb2RlICE9IGVuZCkgewotCQkJY291bnQrKzsKLQkJCWNvdW50Tm9kZSA9IGNvdW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnLkRFQlVHID4gNSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOIE5vZGVzIGluIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uIENvbnRydWN0b3I6ICIgKyBjb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIGhhc01vcmVFbGVtZW50cyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQlyZXR1cm4gY291bnQgPiAwOwotCX0KLQotCS8qKgotCSAqIG5leHRFbGVtZW50IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IG5leHRFbGVtZW50KCkgewotCQlpZiAoY291bnQgPiAwKSB7Ci0JCQljb3VudC0tOwotCQkJb2xkSGVhZCA9IGhlYWQ7Ci0JCQloZWFkID0gaGVhZC5nZXROZXh0KCk7Ci0JCQlyZXR1cm4gb2xkSGVhZDsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjFiMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYWRqdXN0U3RhcnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSwgaW50IGFkanVzdG1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJYU5vZGUuYWRqdXN0U3RhcnQoYWRqdXN0bWVudCk7Ci0JCQlhTm9kZSA9IGFOb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgY291bnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaWYgKGZsYXROb2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZmxhdE5vZGVzLmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZsYXROb2Rlcy5pdGVtKGkpOwotCQkJCS8vIGRvbid0IGtub3cgd2h5LCBidXQgd2UncmUgZ2V0dGluZyBudWxsIHBvaW50ZXIgZXhjZXB0aW9ucwotCQkJCS8vIGluIHRoaXMgbWV0aG9kCi0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSByZXN1bHQgKyBub2RlLmdldE51bWJlck9mUmVnaW9ucygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGdldFRleHQoQ29yZU5vZGVMaXN0IGZsYXROb2RlcykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGZsYXROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkvL0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYU5vZGUgPSBudWxsOwotCQkJaW50IGxlbmd0aCA9IGZsYXROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlidWZmLmFwcGVuZChmbGF0Tm9kZXMuaXRlbShpKS5nZXRUZXh0KCkpOwotCQkJfQotCQkJcmVzdWx0ID0gYnVmZi50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDb3JlTm9kZUxpc3Qgc2V0UGFyZW50RG9jdW1lbnQoQ29yZU5vZGVMaXN0IG5vZGVsaXN0LCBJU3RydWN0dXJlZERvY3VtZW50IHRleHRTdG9yZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGVsaXN0LCAibm9kZWxpc3Qgd2FzIG51bGwgaW4gQ29yZU5vZGVMaXN0OjpzZXRUZXh0U3RvcmUoQ29yZU5vZGVMaXN0LCBTdHJ1Y3R1cmVkVGV4dFN0b3JlKSIpOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW4gPSBub2RlbGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gbm9kZWxpc3QuaXRlbShpKTsKLQkJCS8vQXNzZXJ0LmlzTm90TnVsbChub2RlLCAid2hvJ3MgcHV0dGluZyBudWxsIGluIHRoZSBub2RlIGxpc3Q/IGluCi0JCQkvLyBDb3JlTm9kZUxpc3Q6OnNldFRleHRTdG9yZShDb3JlTm9kZUxpc3QsCi0JCQkvLyBTdHJ1Y3R1cmVkVGV4dFN0b3JlKSIpOyAvLyROT04tTkxTLTEkCi0JCQlub2RlLnNldFBhcmVudERvY3VtZW50KHRleHRTdG9yZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVsaXN0OwotCX0KLQotCS8vCXB1YmxpYyBmaW5hbCBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCS8vIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlLAotCS8vIEJhc2ljU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCS8vCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFOb2RlID0gaGVhZE5vZGU7Ci0JLy8JCXdoaWxlIChhTm9kZSAhPSBudWxsKSB7Ci0JLy8JCQlhTm9kZS5zZXRQYXJlbnREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCS8vCQkJYU5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgYU5vZGUuZ2V0TmV4dCgpOwotCS8vCQl9Ci0JLy8JCXJldHVybiBoZWFkTm9kZTsKLQkvLwl9Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJYU5vZGUuc2V0UGFyZW50RG9jdW1lbnQoZG9jdW1lbnQpOwotCQkJYU5vZGUgPSBhTm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgVmVjdG9yIHRvVmVjdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQkJd2hpbGUgKGFOb2RlICE9IG51bGwpIHsKLQkJCXYuYWRkRWxlbWVudChhTm9kZSk7Ci0JCQlhTm9kZSA9IGFOb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvcigpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50U2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzMxYWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5TZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFNlcXVlbnRpYWxSZXdyaXRlVGV4dFN0b3JlIGV4dGVuZHMgU2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUgaW1wbGVtZW50cyBDaGFyU2VxdWVuY2UsIElSZWdpb25Db21wYXJpYmxlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50U2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUoSVRleHRTdG9yZSBzb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjY2hhckF0KGludCkKLQkgKi8KLQlwdWJsaWMgY2hhciBjaGFyQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBnZXQoaW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNsZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGMKLQkgKiBAcGFyYW0gZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2hlc0lnbm9yZUNhc2UoY2hhciBjMSwgY2hhciBjMikgewotCQkvLyB3ZSBjaGVjayBib3RoIGNhc2UgY29udmVyc2lvbnMgdG8gaGFuZGxlIHRob3NlIGZldyBjYXNlcywKLQkJLy8gaW4gbGFuZ3VhZ2VzIHN1Y2ggYXMgVHVya2lzaCwgd2hpY2ggaGF2ZSBzb21lIGNoYXJhY3RlcnMKLQkJLy8gd2hpY2ggc29ydCBvZiBoYXZlIDMgY2FzZXMuCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYzEpID09IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMikpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYzEpID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjMikpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgY29tcGFyZUxlbmd0aCA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJaWYgKGNvbXBhcmVMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJaWYgKGVuZE9mZnNldCA8PSBsZW5ndGgoKSkgewotCQkJCXJlc3VsdCA9IHJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBzdHJpbmdUb0NvbXBhcmUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIGFsbCBsZW5ndGhzIGhhdmUgYmVlbiBjaGVja2VkIGFuZCBmYWxsIHdpdGhpbnQKLQkgKiBleGNlcHRhYmxlIGxpbWl0cwotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gc3RyaW5nVG9Db21wYXJlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZWdpb25NYXRjaGVzKGludCBvZmZzZXQsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlpbnQgc3RyaW5nT2Zmc2V0ID0gMDsKLQkJaW50IGxlbiA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoY2hhckF0KGkpICE9IHN0cmluZ1RvQ29tcGFyZS5jaGFyQXQoc3RyaW5nT2Zmc2V0KyspKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWludCBjb21wYXJlTGVuZ3RoID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlpZiAoY29tcGFyZUxlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCWludCBlbmRPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0JCQlpZiAoZW5kT2Zmc2V0IDw9IGxlbmd0aCgpKSB7Ci0JCQkJcmVzdWx0ID0gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2Uob2Zmc2V0LCBzdHJpbmdUb0NvbXBhcmUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWludCBzdHJpbmdPZmZzZXQgPSAwOwotCQlpbnQgbGVuID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICghbWF0Y2hlc0lnbm9yZUNhc2UoY2hhckF0KGkpLCBzdHJpbmdUb0NvbXBhcmUuY2hhckF0KHN0cmluZ09mZnNldCsrKSkpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNzdWJTZXF1ZW5jZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewotCi0JCXJldHVybiBnZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyNWU3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIFZpYWNoZXNsYXYgS2FiYW5vdmljaC9FeGFkZWwgOTc4MTcgV3JvbmcgYWxnb3JpdG0gaW4gY2xhc3MgU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlCi0gKiAgICAgCQkJaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3ODE3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkdhcFRleHRTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmU7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUgaW1wbGVtZW50cyBJVGV4dFN0b3JlLCBDaGFyU2VxdWVuY2UsIElSZWdpb25Db21wYXJpYmxlIHsKLQotCXByaXZhdGUgR2FwVGV4dFN0b3JlIGZJbnRlcm5hbFN0b3JlOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUoKSB7Ci0JCXRoaXMoNTAsIDMwMCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvd1dhdGVybWFyawotCSAqIEBwYXJhbSBoaWdoV2F0ZXJtYXJrCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFRleHRTdG9yZShpbnQgbG93V2F0ZXJtYXJrLCBpbnQgaGlnaFdhdGVybWFyaykgewotCQlzdXBlcigpOwotCQlmSW50ZXJuYWxTdG9yZSA9IG5ldyBHYXBUZXh0U3RvcmUobG93V2F0ZXJtYXJrLCBoaWdoV2F0ZXJtYXJrKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjY2hhckF0KGludCkKLQkgKi8KLQlwdWJsaWMgY2hhciBjaGFyQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBmSW50ZXJuYWxTdG9yZS5nZXQoaW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI2dldChpbnQpCi0JICovCi0JcHVibGljIGNoYXIgZ2V0KGludCBvZmZzZXQpIHsKLQotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0KG9mZnNldCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjZ2V0KGludCwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNnZXRMZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCi0JCXJldHVybiBmSW50ZXJuYWxTdG9yZS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjbGVuZ3RoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGxlbmd0aCgpIHsKLQotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG1hdGNoZXNJZ25vcmVDYXNlKGNoYXIgYzEsIGNoYXIgYzIpIHsKLQkJLy8gd2UgY2hlY2sgYm90aCBjYXNlIGNvbnZlcnNpb25zIHRvIGhhbmRsZSB0aG9zZSBmZXcgY2FzZXMsCi0JCS8vIGluIGxhbmd1YWdlcyBzdWNoIGFzIFR1cmtpc2gsIHdoaWNoIGhhdmUgc29tZSBjaGFyYWN0ZXJzCi0JCS8vIHdoaWNoIHNvcnQgb2YgaGF2ZSAzIGNhc2VzLgotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMxKSA9PSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYzIpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMxKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYzIpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IGNvbXBhcmVMZW5ndGggPSBzdHJpbmdUb0NvbXBhcmUubGVuZ3RoKCk7Ci0JCWlmIChjb21wYXJlTGVuZ3RoID09IGxlbmd0aCkgewotCQkJaW50IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aDsKLQkJCWlmIChlbmRPZmZzZXQgPD0gbGVuZ3RoKCkpIHsKLQkJCQlyZXN1bHQgPSByZWdpb25NYXRjaGVzKG9mZnNldCwgc3RyaW5nVG9Db21wYXJlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYXNzdW1lcyBhbGwgbGVuZ3RocyBoYXZlIGJlZW4gY2hlY2tlZCBhbmQgZmFsbCB3aXRoaW50Ci0JICogZXhjZXB0YWJsZSBsaW1pdHMKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHBhcmFtIHN0cmluZ1RvQ29tcGFyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJaW50IHN0cmluZ09mZnNldCA9IDA7Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBzdHJpbmdUb0NvbXBhcmUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBlbmQ7IGkrKykgewotCQkJaWYgKGNoYXJBdChpKSAhPSBzdHJpbmdUb0NvbXBhcmUuY2hhckF0KHN0cmluZ09mZnNldCsrKSkgewotCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgY29tcGFyZUxlbmd0aCA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJaWYgKGNvbXBhcmVMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJaWYgKGVuZE9mZnNldCA8PSBsZW5ndGgoKSkgewotCQkJCXJlc3VsdCA9IHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKG9mZnNldCwgc3RyaW5nVG9Db21wYXJlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGludCBvZmZzZXQsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlpbnQgc3RyaW5nT2Zmc2V0ID0gMDsKLQkJaW50IGVuZCA9IG9mZnNldCArIHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpZiAoIW1hdGNoZXNJZ25vcmVDYXNlKGNoYXJBdChpKSwgc3RyaW5nVG9Db21wYXJlLmNoYXJBdChzdHJpbmdPZmZzZXQrKykpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNyZXBsYWNlKGludCwgaW50LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCWZJbnRlcm5hbFN0b3JlLnJlcGxhY2Uob2Zmc2V0LCBsZW5ndGgsIHRleHQpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjc2V0KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyB0ZXh0KSB7Ci0JCWZJbnRlcm5hbFN0b3JlLnNldCh0ZXh0KTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNzdWJTZXF1ZW5jZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewotCQkvLyBjb252ZXJ0ICdlbmQnIHRvICdsZW5ndGgnCi0JCXJldHVybiBmSW50ZXJuYWxTdG9yZS5nZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3ViU2V0VGV4dFN0b3JlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3ViU2V0VGV4dFN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhY2E4YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N1YlNldFRleHRTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLS8qKgotICogVGhpcyBpcyBhIGNvbnZpZW5jZSBvciB1dGlsaXR5IGNsYXNzIHRoYXQgYWxsb3dzIHlvdSB0byBtYWtlIGEgY29weSBvZiBhCi0gKiBwYXJ0IG9mIGEgbGFyZ2VyIHRleHQgc3RvcmUsIGJ1dCBoYXZlIHRoZSBjb3B5IGJlaGF2ZSBhcyBpZiBpdCB3YXMgdGhlCi0gKiBsYXJnZXIgdGV4dCBzdG9yZS4KLSAqIAotICogSW4gb3RoZXIgd29yZHMsIGl0IHByb3ZpZGVzIGEgc3Vic2V0IG9mIGEgbGFyZ2VyIGRvY3VtZW50LCB0aGF0ICJsb29rcyBsaWtlIgotICogdGhlIG9yZ2luYWwgZG9jdW1lbnQuIFRoYXQgaXMsICJsb29rcyBsaWtlIiBpbiB0ZXJtcyBvZiBvZmZzZXRzIGFuZCBsZW5ndGhzLgotICogVmFsaWQgYWNjZXNzIGNhbiBvbmx5IGJlIG1hZGUgdG8gZGF0YSBiZXR3ZWVuIHRoZSBvcmlnbmFsIG9mZnNldHMsIGV2ZW4KLSAqIHRob3VnaCB0aG9zZSBvZmZzZXRzIGFyZSBpbiB0aGUgc2FtZSB1bml0cyBhdCB0aGUgb3JpZ2luYWwsIGFuZCBldmVuIHRob3VnaAotICogdGhlIGxlbmd0aCBhcHBlYXJzIHRvIGJlIGxvbmcuCi0gKiAKLSAqIEZvciBleGFtcGxlLCBpZiBhIHN1YnNldHRleHQgc3RvcmUgaXMgY3JlYXRlZCBmb3IgdGhlIGRlZiBwYXJ0IG9mIGFiY2RlZmdoLAotICogdGhlbiBnZXQoMyw1KSBpcyB2YWxpZCwgZ2V0TGVuZ3RoIGlzIDguIEFueSBvdGhlciBhY2Nlc3MsIHN1Y2ggYXMKLSAqIGdldENoYXIoMiksIHdvdWxkIGJlIGludmFsaWQuCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmU7Ci0KLS8qKgotICogU2ltaWxhciB0byBiYXNpY3Mgb2YgSURvY3VtZW50LCBidXQgdGhlIG9mZnNldHMgYXJlIG1hcHBlZCBmcm9tIGNvb3JkaW5hdGVzCi0gKiBvZiB1bmRlcmx5aW5nIHN0b3JhZ2UgdG8gYSAidmlydHVhbCIgZG9jdW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJTZXRUZXh0U3RvcmUgaW1wbGVtZW50cyBJVGV4dFN0b3JlIHsKLQlwcml2YXRlIGludCBwc2V1ZG9CZWdpbk9mZnNldDsgLy8gbWFwcyB0byAiemVybyIgcG9zdGlvbiBvZiBuZXcgdGV4dAotCS8vcHJpdmF0ZSBpbnQgcHNldWRvRW5kT2Zmc2V0OwotCXByaXZhdGUgaW50IHBzZXVkb0xlbmd0aDsgLy8gbGVuZ3RoIG9mIG9sZC9vcmlnaW5hbCBkb2N1bWVudAotCXByaXZhdGUgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCS8qKgotCSAqIFN1YlNldFRleHRTdG9yZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBpbml0aWFsQ29udGVudAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdWJTZXRUZXh0U3RvcmUoU3RyaW5nIGluaXRpYWxDb250ZW50LCBpbnQgYmVnaW5PZmZzZXQsIGludCBlbmRPZmZzZXQsIGludCBvcmlnaW5hbERvY3VtZW50TGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCXBzZXVkb0JlZ2luT2Zmc2V0ID0gYmVnaW5PZmZzZXQ7Ci0JCS8vcHNldWRvRW5kT2Zmc2V0ID0gZW5kT2Zmc2V0OwotCQkvLyB1c2VkIHRvIGJlIG9yaWdpbmFsRG9jdW1lbnQuZ2V0TGVuZ3RoIC4uLiBub3Qgc3VyZSBpZiB1c2VkLCBvcgotCQkvLyB3aGljaAotCQkvLyBpcyByaWdodAotCQlwc2V1ZG9MZW5ndGggPSBvcmlnaW5hbERvY3VtZW50TGVuZ3RoOwotCQlzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGluaXRpYWxDb250ZW50KTsKLQkJLy9zZXQoaW5pdGlhbENvbnRlbnQpOwotCX0KLQotCS8vIHRoaXMgaXMgb3VyICJwcml2YXRlIiBnZXQsIHdoaWNoIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQKLQkvLyB1c2UgdG8gZ2V0IHVzaW5nICJyZWFsIiBjb29yZGluYXRlcyBvZiB1bmRlcmx5aW5nIHJlcHJlc2VudGF0aW9uLgotCXByaXZhdGUgU3RyaW5nIF9nZXQoaW50IGJlZ2luLCBpbnQgbGVuZ3RoKSB7Ci0JCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCWludCBzcmNFbmQgPSBiZWdpbiArIGxlbmd0aDsKLQkJc3RyaW5nQnVmZmVyLmdldENoYXJzKGJlZ2luLCBzcmNFbmQsIGNoYXJzLCAwKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoY2hhcnMpOwotCX0KLQotCXB1YmxpYyBjaGFyIGdldChpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBzdHJpbmdCdWZmZXIuY2hhckF0KG9mZnNldCAtIHBzZXVkb0JlZ2luT2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gYmVnaW4KLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBlbmQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KGludCBiZWdpbiwgaW50IGxlbmd0aCkgewotCQkvLyByZW1hcCB0aGUgYmVnaW4gYW5kIGVuZCB0byAiYXBwZWFyIiB0byBiZSBpbiB0aGUKLQkJLy8gc2FtZSBjb29yZGluYXRlcyBvZiB0aGUgb3JpZ2luYWwgcGFyZW50RG9jdW1lbnQKLQkJcmV0dXJuIF9nZXQoYmVnaW4gLSBwc2V1ZG9CZWdpbk9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gYmVnaW4KLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBlbmQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBjaGFyIGdldENoYXIoaW50IHBvcykgewotCQkvLyByZW1hcCB0aGUgYmVnaW4gYW5kIGVuZCB0byAiYXBwZWFyIiB0byBiZSBpbiB0aGUKLQkJLy8gc2FtZSBjb29yZGluYXRlcyBvZiB0aGUgb3JpZ2luYWwgcGFyZW50RG9jdW1lbnQKLQkJcmV0dXJuIGdldChwb3MgLSBwc2V1ZG9CZWdpbk9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogV2UgcmVkZWZpbmUgZ2V0TGVuZ3RoIHNvIGl0cyBub3QgdGhlIHRydWUgbGVuZ3RoIG9mIHRoaXMgc3ViLXNldAotCSAqIGRvY3VtZW50LCBidXQgdGhlIGxlbmd0aCBvZiB0aGUgb3JpZ2luYWwuIFRoaXMgaXMgbmVlZGVkLCBhcyBhIHNpbXBsZQotCSAqIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHNlZSBpZiB0aGUgcHNldWRvIGVuZCBpcyBlcXVhbCB0aGUgbGFzdAotCSAqIHBvc2l0aW9uIG9mIHRoZSBvcmlnaW5hbCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHBzZXVkb0xlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggYXMgaWYgY29uc2lkZXJlZCBhIHRydWUsIHN0YW5kYWxvbmUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRydWVMZW5ndGgoKSB7Ci0JCXJldHVybiBzdHJpbmdCdWZmZXIubGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwbGFjZShpbnQgYmVnaW4sIGludCBsZW5ndGgsIFN0cmluZyBjaGFuZ2VzKSB7Ci0JCS8vIHJlbWFwIHRoZSBiZWdpbiBhbmQgZW5kIHRvICJhcHBlYXIiIHRvIGJlIGluIHRoZQotCQkvLyBzYW1lIGNvb3JkaW5hdGVzIG9mIHRoZSBvcmlnaW5hbCBwYXJlbnREb2N1bWVudAotCQlpbnQgZW5kID0gYmVnaW4gKyBsZW5ndGg7Ci0JCXN0cmluZ0J1ZmZlci5yZXBsYWNlKGJlZ2luIC0gcHNldWRvQmVnaW5PZmZzZXQsIGVuZCwgY2hhbmdlcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyB0ZXh0KSB7Ci0JCXN0cmluZ0J1ZmZlci5zZXRMZW5ndGgoMCk7Ci0JCXN0cmluZ0J1ZmZlci5hcHBlbmQodGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1RleHRSZWdpb25MaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1RleHRSZWdpb25MaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjYyYjc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9UZXh0UmVnaW9uTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChJbnRhbGlvKSAtIGJ1ZyAzMDA0MzQgLSBNYWtlIGlubmVyIGNsYXNzZXMgc3RhdGljIHdoZXJlIHBvc3NpYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFRleHRSZWdpb25MaXN0SW1wbCBpbXBsZW1lbnRzIElUZXh0UmVnaW9uTGlzdCB7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBjbGFzcyBOdWxsSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0JCXB1YmxpYyBOdWxsSXRlcmF0b3IoKSB7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCByZW1vdmUgcmVnaW9ucyB2aWEgaXRlcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlZ2lvbkl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlwcml2YXRlIElUZXh0UmVnaW9uW10gZkl0ZXJhdG9yUmVnaW9uczsKLQkJcHJpdmF0ZSBpbnQgaW5kZXggPSAtMTsKLQkJcHJpdmF0ZSBpbnQgbWF4aW5kZXggPSAtMTsKLQotCQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoSVRleHRSZWdpb25bXSByZWdpb25zKSB7Ci0JCQlmSXRlcmF0b3JSZWdpb25zID0gcmVnaW9uczsKLQkJCW1heGluZGV4ID0gZkl0ZXJhdG9yUmVnaW9ucy5sZW5ndGggLSAxOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBpbmRleCA8IG1heGluZGV4OwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJaWYgKCEoaW5kZXggPCBtYXhpbmRleCkpCi0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCXJldHVybiBmSXRlcmF0b3JSZWdpb25zWysraW5kZXhdOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJaWYgKGluZGV4IDwgMCkgewotCQkJCS8vIG5leHQoKSBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW4gbm90IHJlbW92ZSByZWdpb25zIHdpdGhvdXQgcHJpb3IgaW52b2NhdGlvbiBvZiBuZXh0KCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW4gbm90IHJlbW92ZSByZWdpb25zIHZpYSBpdGVyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBncm93dGhDb25zdGFudCA9IDI7Ci0KLQlwcml2YXRlIElUZXh0UmVnaW9uW10gZlJlZ2lvbnM7Ci0JcHJpdmF0ZSBpbnQgZlJlZ2lvbnNDb3VudCA9IDA7Ci0KLQlwdWJsaWMgVGV4dFJlZ2lvbkxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUZXh0UmVnaW9uTGlzdEltcGwoSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QpIHsKLQkJdGhpcygpOwotCQlmUmVnaW9ucyA9IChJVGV4dFJlZ2lvbltdKSByZWdpb25MaXN0LnRvQXJyYXkoKS5jbG9uZSgpOwotCQlmUmVnaW9uc0NvdW50ID0gZlJlZ2lvbnMubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbnN1cmVDYXBhY2l0eShmUmVnaW9uc0NvdW50ICsgMSk7Ci0JCWZSZWdpb25zW2ZSZWdpb25zQ291bnQrK10gPSByZWdpb247Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5zZXJ0UG9zLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9uTGlzdCkgewotCQkvLyBiZWdpbm5pbmcgb2YgbGlzdCBpcyAwIHRvIGluc2VydFBvcy0xCi0JCS8vIHJlbWFpbmRlciBvZiBsaXN0IGlzIGluc2VydFBvcyB0byBmUmVnaW9uc0NvdW50Ci0JCS8vIHJlc3VsdGluZyB0b3RhbCB3aWxsIGJlIGJlIGZSZWdpb25zQ291bnQgKyBuZXdSZWdpb25zLnNpemUoKQotCQlpZiAoaW5zZXJ0UG9zIDwgMCB8fCBpbnNlcnRQb3MgPiBmUmVnaW9uc0NvdW50KSB7Ci0JCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGluc2VydFBvcyk7Ci0JCX0KLQotCQlpbnQgbmV3UmVnaW9uTGlzdFNpemUgPSBuZXdSZWdpb25MaXN0LnNpemUoKTsKLQotCQllbnN1cmVDYXBhY2l0eShmUmVnaW9uc0NvdW50ICsgbmV3UmVnaW9uTGlzdFNpemUpOwotCi0JCWludCBudW1Nb3ZlZCA9IGZSZWdpb25zQ291bnQgLSBpbnNlcnRQb3M7Ci0JCWlmIChudW1Nb3ZlZCA+IDApCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGZSZWdpb25zLCBpbnNlcnRQb3MsIGZSZWdpb25zLCBpbnNlcnRQb3MgKyBuZXdSZWdpb25MaXN0U2l6ZSwgbnVtTW92ZWQpOwotCi0JCWlmIChuZXdSZWdpb25MaXN0IGluc3RhbmNlb2YgVGV4dFJlZ2lvbkxpc3RJbXBsICYmICgoVGV4dFJlZ2lvbkxpc3RJbXBsKSBuZXdSZWdpb25MaXN0KS5mUmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KCgoVGV4dFJlZ2lvbkxpc3RJbXBsKSBuZXdSZWdpb25MaXN0KS5mUmVnaW9ucywgMCwgZlJlZ2lvbnMsIGluc2VydFBvcywgbmV3UmVnaW9uTGlzdFNpemUpOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdSZWdpb25MaXN0U2l6ZTsgaSsrKSB7Ci0JCQkJZlJlZ2lvbnNbaW5zZXJ0UG9zKytdID0gbmV3UmVnaW9uTGlzdC5nZXQoaSk7Ci0JCQl9Ci0JCX0KLQkJZlJlZ2lvbnNDb3VudCArPSBuZXdSZWdpb25MaXN0U2l6ZTsKLQkJcmV0dXJuIG5ld1JlZ2lvbkxpc3RTaXplICE9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCS8vIG5vdGU6IHNpemUgb2YgYXJyYXkgaXMgbm90IHJlZHVjZWQhCi0JCWZSZWdpb25zQ291bnQgPSAwOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbnN1cmVDYXBhY2l0eShpbnQgbmVlZGVkKSB7Ci0JCWlmIChmUmVnaW9ucyA9PSBudWxsKSB7Ci0JCQkvLyBmaXJzdCB0aW1lCi0JCQlmUmVnaW9ucyA9IG5ldyBJVGV4dFJlZ2lvbltuZWVkZWRdOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBvbGRMZW5ndGggPSBmUmVnaW9ucy5sZW5ndGg7Ci0JCWlmIChvbGRMZW5ndGggPCBuZWVkZWQpIHsKLQkJCUlUZXh0UmVnaW9uW10gb2xkQWRhcHRlcnMgPSBmUmVnaW9uczsKLQkJCUlUZXh0UmVnaW9uW10gbmV3QWRhcHRlcnMgPSBuZXcgSVRleHRSZWdpb25bbmVlZGVkICsgZ3Jvd3RoQ29uc3RhbnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRBZGFwdGVycywgMCwgbmV3QWRhcHRlcnMsIDAsIGZSZWdpb25zQ291bnQpOwotCQkJZlJlZ2lvbnMgPSBuZXdBZGFwdGVyczsKLQkJfQotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXQoaW50IGluZGV4KSB7Ci0JCS8vIGZSZWdpb25Db3VudCBtYXkgbm90IGVxdWFsIGZSZWdpb25zLmxlbmd0aAotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGZSZWdpb25zQ291bnQpIHsKLQkJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oaW5kZXgpOwotCQl9Ci0JCXJldHVybiBmUmVnaW9uc1tpbmRleF07Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJaWYgKGZSZWdpb25zICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZSZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChyZWdpb24uZXF1YWxzKGZSZWdpb25zW2ldKSkgewotCQkJCQkJcmVzdWx0ID0gaTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIGZSZWdpb25zQ291bnQgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCWlmIChzaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG5ldyBOdWxsSXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgUmVnaW9uSXRlcmF0b3IodG9BcnJheSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiByZW1vdmUoaW50IGluZGV4KSB7Ci0JCS8vIG11Y2ggbW9yZSBlZmZpY2llbnQgd2F5cyB0byBpbXBsZW1lbnQgdGhpcywgYnV0Ci0JCS8vIEkgZG91YnQgaWYgY2FsbGVkIG9mdGVuCi0JCUlUZXh0UmVnaW9uIG9uZVRvUmVtb3ZlID0gZ2V0KGluZGV4KTsKLQkJcmVtb3ZlKG9uZVRvUmVtb3ZlKTsKLQkJcmV0dXJuIG9uZVRvUmVtb3ZlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShJVGV4dFJlZ2lvbiBhKSB7Ci0JCWlmIChmUmVnaW9ucyA9PSBudWxsIHx8IGEgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG5ld0luZGV4ID0gMDsKLQkJSVRleHRSZWdpb25bXSBuZXdSZWdpb25zID0gbmV3IElUZXh0UmVnaW9uW2ZSZWdpb25zQ291bnRdOwotCQlpbnQgb2xkUmVnaW9uQ291bnQgPSBmUmVnaW9uc0NvdW50OwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IG9sZEluZGV4ID0gMDsgb2xkSW5kZXggPCBvbGRSZWdpb25Db3VudDsgb2xkSW5kZXgrKykgewotCQkJSVRleHRSZWdpb24gY2FuZGlkYXRlID0gZlJlZ2lvbnNbb2xkSW5kZXhdOwotCQkJaWYgKGEgPT0gY2FuZGlkYXRlKSB7Ci0JCQkJZlJlZ2lvbnNDb3VudC0tOwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0gZWxzZQotCQkJCW5ld1JlZ2lvbnNbbmV3SW5kZXgrK10gPSBmUmVnaW9uc1tvbGRJbmRleF07Ci0JCX0KLQkJaWYgKGZvdW5kKQotCQkJZlJlZ2lvbnMgPSBuZXdSZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbChJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCkgewotCQkvLyBtdWNoIG1vcmUgZWZmaWNpZW50IHdheXMgdG8gaW1wbGVtZW50IHRoaXMsIGJ1dAotCQkvLyBJIGRvdWJ0IGlmIGNhbGxlZCBvZnRlbgotCQlpZiAocmVnaW9uTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbkxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQl0aGlzLnJlbW92ZShyZWdpb25MaXN0LmdldChpKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGZSZWdpb25zQ291bnQ7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uW10gdG9BcnJheSgpIHsKLQkJLy8gcmV0dXJuICJjbG9uZSIgb2YgaW50ZXJuYWwgYXJyYXkKLQkJSVRleHRSZWdpb25bXSBuZXdBcnJheSA9IG5ldyBJVGV4dFJlZ2lvbltmUmVnaW9uc0NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShmUmVnaW9ucywgMCwgbmV3QXJyYXksIDAsIGZSZWdpb25zQ291bnQpOwotCQlyZXR1cm4gbmV3QXJyYXk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRyaW1Ub1NpemUoKSB7Ci0JCWlmIChmUmVnaW9ucy5sZW5ndGggPiBmUmVnaW9uc0NvdW50KSB7Ci0JCQlJVGV4dFJlZ2lvbltdIG5ld1JlZ2lvbnMgPSBuZXcgSVRleHRSZWdpb25bZlJlZ2lvbnNDb3VudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZSZWdpb25zLCAwLCBuZXdSZWdpb25zLCAwLCBmUmVnaW9uc0NvdW50KTsKLQkJCWZSZWdpb25zID0gbmV3UmVnaW9uczsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL0lTdHJ1Y3R1cmVkUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvSVN0cnVjdHVyZWRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyYjc2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvSVN0cnVjdHVyZWRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLQotLyoqCi0gKiBMaWtlIHN1cGVyIGNsYXNzIGV4Y2VwdCBhbGxvd3MgbGVuZ3RoIGFuZCBvZmZzZXQgdG8gYmUgbW9kaWZpZWQuIFRoaXMgaXMKLSAqIGNvbnZlbmllbnQgZm9yIHNvbWUgYWxnb3JpdGhtcywgYW5kIGFsbG93cyByZWdpb24gb2JqZWN0cyB0byBiZSByZXVzZWQuCi0gKiBOb3RlOiBUaGVyZSBNSUdIVCBiZSBzb21lIGNvZGUgdGhhdCBhc3N1bWVzIHJlZ2lvbnMgYXJlIGltbXV0YWJsZS4gVGhpcwotICogY2xhc3Mgd291bGQgbm90IGJlIGFwcHJvcHJpYXRlIGZvciB0aG9zZSB1c2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkUmVnaW9uIGV4dGVuZHMgSVJlZ2lvbiB7Ci0Jdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCk7Ci0KLQl2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9JU3RydWN0dXJlZFR5cGVkUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWEyMWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9JU3RydWN0dXJlZFR5cGVkUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLQotLyoqCi0gKiBTaW1pbGFyIHRvIGV4dGVuZGVkIGludGVyZmFjZSwgZXhjZXB0IGl0IGFsbG93cyB0aGUgbGVuZ3RoLCBvZmZzZXQsIGFuZAotICogdHlwZSB0byBiZSBzZXQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gaXRlcmF0aW5nIHRocm91Z2ggYSBudW1iZXIgb2YgInNtYWxsIgotICogcmVnaW9ucywgdGhhdCBhbGwgbWFwIHRvIHRoZSB0aGUgc2FtZSBwYXJ0aW9uIHJlZ2lvbnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBleHRlbmRzIElTdHJ1Y3R1cmVkUmVnaW9uLCBJVHlwZWRSZWdpb24gewotCXZvaWQgc2V0VHlwZShTdHJpbmcgcGFydGl0aW9uVHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU2ltcGxlU3RydWN0dXJlZFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1NpbXBsZVN0cnVjdHVyZWRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhMWRlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU2ltcGxlU3RydWN0dXJlZFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotCi0KLQotLyoqCi0gKiBTaW1pbGFyIHRvIGpmYWNlIHJlZ2lvbiBleGNlcHQgd2Ugd2FudGVkIGEgc2V0dGluZyBvbiBsZW5ndGgKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVN0cnVjdHVyZWRSZWdpb24gaW1wbGVtZW50cyBJU3RydWN0dXJlZFJlZ2lvbiB7Ci0JLyoqIFRoZSByZWdpb24gbGVuZ3RoICovCi0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQotCS8qKiBUaGUgcmVnaW9uIG9mZnNldCAqLwotCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIHJlZ2lvbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdHJ1Y3R1cmVkUmVnaW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBUd28gcmVnaW9ucyBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIG9mZnNldCBhbmQgbGVuZ3RoLgotCSAqIAotCSAqIEBzZWUgT2JqZWN0I2VxdWFscwotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIElSZWdpb24pIHsKLQkJCUlSZWdpb24gciA9IChJUmVnaW9uKSBvOwotCQkJcmV0dXJuIHIuZ2V0T2Zmc2V0KCkgPT0gZk9mZnNldCAmJiByLmdldExlbmd0aCgpID09IGZMZW5ndGg7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVnaW9uI2dldExlbmd0aAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlZ2lvbiNnZXRPZmZzZXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjaGFzaENvZGUgaGFzY29kZSBpcyBvdmVycmlkZGVuIHNpbmNlIHdlIHByb3ZpZGUgb3VyIG93bgotCSAqICAgICAgZXF1YWxzLgotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAoZk9mZnNldCA8PCAyNCkgfCAoZkxlbmd0aCA8PCAxNik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGVuZ3RoLgotCSAqIAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIFRoZSBsZW5ndGggdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpIHsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCkgewotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1NpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1NpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODIyYThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotCi0KLQotLyoqCi0gKiBTaW1pbGFyIGphY2UgVHlwZWRSZWdpb24sIGJ1dCBoYWQgdG8gc3ViY2xhc3Mgb3VyIHZlcnNpb24gd2hpY2ggYWxsb3dlZAotICogbGVuZ3RoIHRvIGJlIHNldC4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBleHRlbmRzIFNpbXBsZVN0cnVjdHVyZWRSZWdpb24gaW1wbGVtZW50cyBJU3RydWN0dXJlZFR5cGVkUmVnaW9uIHsKLQotCS8qKiBUaGUgcmVnaW9uJ3MgdHlwZSAqLwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHR5cGVkIHJlZ2lvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gc3BlY2lmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgcmVnaW9uJ3Mgb2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbidzIGxlbmd0aAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uJ3MgdHlwZQotCSAqLwotCXB1YmxpYyBTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIob2Zmc2V0LCBsZW5ndGgpOwotCQlmVHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogVHdvIHR5cGVkIHBvc2l0aW9ucyBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIG9mZnNldCwgbGVuZ3RoLCBhbmQKLQkgKiB0eXBlLgotCSAqIAotCSAqIEBzZWUgT2JqZWN0I2VxdWFscwotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbikgewotCQkJU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uIHIgPSAoU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uKSBvOwotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhyKSAmJiAoKGZUeXBlID09IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gbnVsbCkgfHwgZlR5cGUuZXF1YWxzKHIuZ2V0VHlwZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJVHlwZWRSZWdpb24jZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCNoYXNoQ29kZQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCB0eXBlID0gZlR5cGUgPT0gbnVsbCA/IDAgOiBmVHlwZS5oYXNoQ29kZSgpOwotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKSB8IHR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlmVHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcy5hcHBlbmQoZ2V0T2Zmc2V0KCkpOwotCQlzLmFwcGVuZCgiOiIpOyAvLyROT04tTkxTLTEkCi0JCXMuYXBwZW5kKGdldExlbmd0aCgpKTsKLQkJcy5hcHBlbmQoIiAtICIpOyAvLyROT04tTkxTLTEkCi0JCXMuYXBwZW5kKGdldFR5cGUoKSk7Ci0JCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlOWIxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5JQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci0KLQotLyoqCi0gKiBCYXNlIERvY3VtZW50IHBhcnRpdGlvbmVyIGZvciBTdHJ1Y3R1cmVkRG9jdW1lbnRzLiBCTE9DS19URVhUIElUZXh0UmVnaW9ucwotICogaGF2ZSBhIHBhcnRpdGlvbiB0eXBlIG9mIEJMT0NLIG9yIEJMT0NLOlRBR05BTUUgaWYgYSBzdXJyb3VuZGluZyB0YWduYW1lCi0gKiB3YXMgcmVjb3JkZWQuCi0gKiAKLSAqIFN1YmNsYXNzZXMgc2hvdWxkIHN5bmNocm9uaXplIGFjY2VzcyB0byA8Y29kZT5pbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZTwvY29kZT4gdXNpbmcgdGhlIGxvY2sKLSAqIDxjb2RlPlBBUlRJVElPTl9MT0NLPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRQYXJ0aXRpb25lciwgSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgewotCi0Jc3RhdGljIGNsYXNzIENhY2hlZENvbXB1dGVkUGFydGl0aW9ucyB7Ci0JCWludCBmTGVuZ3RoOwotCQlpbnQgZk9mZnNldDsKLQkJSVR5cGVkUmVnaW9uW10gZlBhcnRpdGlvbnM7Ci0JCWJvb2xlYW4gaXNJblZhbGlkOwotCi0JCUNhY2hlZENvbXB1dGVkUGFydGl0aW9ucyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zKSB7Ci0JCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQkJZkxlbmd0aCA9IGxlbmd0aDsKLQkJCWZQYXJ0aXRpb25zID0gcGFydGl0aW9uczsKLQkJCWlzSW5WYWxpZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENhY2hlZENvbXB1dGVkUGFydGl0aW9ucyBjYWNoZWRQYXJ0aXRpb25zID0gbmV3IENhY2hlZENvbXB1dGVkUGFydGl0aW9ucygtMSwgLTEsIG51bGwpOwotCXByb3RlY3RlZCBTdHJpbmdbXSBmU3VwcG9ydGVkVHlwZXMgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFR5cGVkUmVnaW9uIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlID0gbmV3IFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbigwLCAwLCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT04pOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IFBBUlRJVElPTl9MT0NLID0gbmV3IE9iamVjdCgpOwotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnRpdGlvbmluZyBvZiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGNvbm5lY3RlZCBkb2N1bWVudC4KLQkgKiBUaGVyZSBtdXN0IGJlIGEgZG9jdW1lbnQgY29ubmVjdGVkIHRvIHRoaXMgcGFydGl0aW9uZXIuCi0JICogCi0JICogTm90ZTogdGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMsIHVubGVzcyB0aGV5IGNvbnRyb2wKLQkgKiB0aGUgdGhyZWFkaW5nIHRoYXQgaW5jbHVkZXMgbW9kaWZpY2F0aW9ucyB0byB0aGUgZG9jdW1lbnQuIE90aGVyd2lzZQotCSAqIHRoZSBkb2N1bWVudCBjb3VsZCBiZSBtb2RpZmllZCB3aGlsZSBwYXJ0aXRpb25zIGFyZSBiZWluZyBjb21wdXRlZC4gV2UKLQkgKiBhZHZpc2UgdGhhdCBjbGllbnRzIHVzZSB0aGUgY29tcHV0ZVBhcnRpdGlvbnMgQVBJIGRpcmVjdGx5IGZyb20gdGhlCi0JICogZG9jdW1lbnQsIHNvIHRoZXkgd29uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIHJhbmdlIG9mIGludGVyZXN0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2Ugb2YgaW50ZXJlc3QKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aXRpb25pbmcgb2YgdGhlIHJhbmdlCi0JICovCi0JcHVibGljIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkb2N1bWVudCBwYXJ0aXRpb25lciBpcyBub3QgY29ubmVjdGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJVHlwZWRSZWdpb25bXSByZXN1bHRzID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKGNhY2hlZFBhcnRpdGlvbnMpIHsKLQkJCWlmICgoIWNhY2hlZFBhcnRpdGlvbnMuaXNJblZhbGlkKSAmJiAob2Zmc2V0ID09IGNhY2hlZFBhcnRpdGlvbnMuZk9mZnNldCkgJiYgKGxlbmd0aCA9PSBjYWNoZWRQYXJ0aXRpb25zLmZMZW5ndGgpKQotCQkJCXJlc3VsdHMgPSBjYWNoZWRQYXJ0aXRpb25zLmZQYXJ0aXRpb25zOwotCQl9Ci0KLQkJaWYgKHJlc3VsdHMgPT0gbnVsbCkgewotCQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQkJcmVzdWx0cyA9IG5ldyBJVHlwZWRSZWdpb25bXXtnZXRQYXJ0aXRpb24ob2Zmc2V0KX07Ci0JCQl9IGVsc2UgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpbnQgZW5kUG9zID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJCWlmIChlbmRQb3MgPiBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJCS8vIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSBtb2RlbCBpbnN0YW5jZSBpcyBiZWluZwotCQkJCQkvLyBjaGFuZ2VkCi0JCQkJCS8vIGFuZCBldmVyeW9uZSdzIG5vdCB5ZXQgdXAgdG8gZGF0ZQotCQkJCQlyZXR1cm4gbmV3IElUeXBlZFJlZ2lvbltde2NyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgZ2V0VW5rbm93bigpKX07Ci0JCQkJfQotCQkJCWludCBjdXJyZW50UG9zID0gb2Zmc2V0OwotCQkJCUlTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gcHJldmlvdXNQYXJ0aXRpb24gPSBudWxsOwotCQkJCXdoaWxlIChjdXJyZW50UG9zIDwgZW5kUG9zKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gcGFydGl0aW9uID0gbnVsbDsKLQkJCQkJc3luY2hyb25pemVkIChQQVJUSVRJT05fTE9DSykgewotCQkJCQkJaW50ZXJuYWxHZXRQYXJ0aXRpb24oY3VycmVudFBvcywgZmFsc2UpOwotCQkJCQkJY3VycmVudFBvcyArPSBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRMZW5ndGgoKTsKLQkJCQkJCQotCQkJCQkJLy8gY2hlY2sgaWYgdGhpcyBwYXJ0aXRpb24ganVzdCBjb250aW51ZXMgbGFzdCBvbmUKLQkJCQkJCS8vICh0eXBlIGlzIHRoZSBzYW1lKSwKLQkJCQkJCS8vIGlmIHNvLCBqdXN0IGV4dGVuZCBsZW5ndGggb2YgbGFzdCBvbmUsIG5vdCBuZWVkIHRvCi0JCQkJCQkvLyBjcmVhdGUgbmV3Ci0JCQkJCQkvLyBpbnN0YW5jZS4KLQkJCQkJCWlmIChwcmV2aW91c1BhcnRpdGlvbiAhPSBudWxsICYmIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLmdldFR5cGUoKS5lcXVhbHMocHJldmlvdXNQYXJ0aXRpb24uZ2V0VHlwZSgpKSkgewotCQkJCQkJCS8vIHNhbWUgcGFydGl0aW9uIHR5cGUKLQkJCQkJCQlwcmV2aW91c1BhcnRpdGlvbi5zZXRMZW5ndGgocHJldmlvdXNQYXJ0aXRpb24uZ2V0TGVuZ3RoKCkgKyBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRMZW5ndGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBub3QgdGhlIHNhbWUsIHNvIGFkZCB0byBsaXN0Ci0JCQkJCQkJcGFydGl0aW9uID0gY3JlYXRlTmV3UGFydGl0aW9uSW5zdGFuY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocGFydGl0aW9uICE9IG51bGwpIHsKLQkJCQkJCWxpc3QuYWRkKHBhcnRpdGlvbik7Ci0JCQkJCQkvLyBhbmQgbWFrZSBjdXJyZW50LCBwcmV2aW91cwotCQkJCQkJcHJldmlvdXNQYXJ0aXRpb24gPSBwYXJ0aXRpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzdWx0cyA9IG5ldyBJVHlwZWRSZWdpb25bbGlzdC5zaXplKCldOwotCQkJCWxpc3QudG9BcnJheShyZXN1bHRzKTsKLQkJCX0KLQkJCWlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHsKLQkJCQkvLyB0cnVuY2F0ZSByZXR1cm5lZCByZXN1bHRzIHRvIHJlcXVlc3RlZCByYW5nZQotCQkJCWlmIChyZXN1bHRzWzBdLmdldE9mZnNldCgpIDwgb2Zmc2V0ICYmIHJlc3VsdHNbMF0gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFJlZ2lvbikgewotCQkJCQkoKElTdHJ1Y3R1cmVkUmVnaW9uKSByZXN1bHRzWzBdKS5zZXRPZmZzZXQob2Zmc2V0KTsKLQkJCQl9Ci0JCQkJaW50IGxhc3RFbmQgPSByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0uZ2V0T2Zmc2V0KCkgKyByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0uZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKGxhc3RFbmQgPiBvZmZzZXQgKyBsZW5ndGggJiYgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRSZWdpb24pIHsKLQkJCQkJKChJU3RydWN0dXJlZFJlZ2lvbikgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdKS5zZXRMZW5ndGgob2Zmc2V0ICsgbGVuZ3RoIC0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLmdldE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQgKGNhY2hlZFBhcnRpdGlvbnMpIHsKLQkJCQljYWNoZWRQYXJ0aXRpb25zLmZMZW5ndGggPSBsZW5ndGg7Ci0JCQkJY2FjaGVkUGFydGl0aW9ucy5mT2Zmc2V0ID0gb2Zmc2V0OwotCQkJCWNhY2hlZFBhcnRpdGlvbnMuZlBhcnRpdGlvbnMgPSByZXN1bHRzOwotCQkJCWNhY2hlZFBhcnRpdGlvbnMuaXNJblZhbGlkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludmFsaWRhdGVQYXJ0aXRpb25DYWNoZSgpIHsKLQkJc3luY2hyb25pemVkIChjYWNoZWRQYXJ0aXRpb25zKSB7Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmlzSW5WYWxpZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25uZWN0cyB0aGUgZG9jdW1lbnQgdG8gdGhlIHBhcnRpdGlvbmVyLCBpLmUuIGluZGljYXRlcyB0aGUgYmVnaW4gb2YKLQkgKiB0aGUgdXNhZ2Ugb2YgdGhlIHJlY2VpdmVyIGFzIHBhcnRpdGlvbmVyIG9mIHRoZSBnaXZlbiBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJaW52YWxpZGF0ZVBhcnRpdGlvbkNhY2hlKCk7Ci0JCQl0aGlzLmZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGlzIGNsYXNzIGFuZCBBUEkgYXJlIGZvciBTdHJ1Y3R1cmVkIERvY3VtZW50cyBvbmx5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIElUZXh0UmVnaW9uQ29udGFpbmVyIGl0c2VsZiBjb250YWlucyBhbm90aGVyCi0JICogSVRleHRSZWdpb25Db250YWluZXIKLQkgKiAKLQkgKiBAcGFyYW0gSVRleHRSZWdpb25Db250YWluZXIKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0VtYmVkZGVkUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGFpbmVyKSB7Ci0JCWJvb2xlYW4gY29udGFpbnNFbWJlZGRlZFJlZ2lvbiA9IGZhbHNlOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCWNvbnRhaW5zRW1iZWRkZWRSZWdpb24gPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluc0VtYmVkZGVkUmVnaW9uOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVOZXdQYXJ0aXRpb25JbnN0YW5jZSgpIHsKLQkJc3luY2hyb25pemVkIChQQVJUSVRJT05fTE9DSykgewotCQkJcmV0dXJuIG5ldyBTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24oaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2UuZ2V0T2Zmc2V0KCksIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLmdldExlbmd0aCgpLCBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRUeXBlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29uY3JldGUgcGFydGl0aW9uIGZyb20gdGhlIGdpdmVuIHZhbHVlcy4gUmV0dXJucyBhIG5ldwotCSAqIGluc3RhbmNlIGZvciBlYWNoIGNhbGwuCi0JICogCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4gSVR5cGVkUmVnaW9uCi0JICogCi0JICogVE9ETzogc2hvdWxkIGJlIHByb3RlY3RlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFR5cGVkUmVnaW9uIGNyZWF0ZVBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbihvZmZzZXQsIGxlbmd0aCwgdHlwZSk7Ci0JfQotCi0JLyoqCi0JICogRGlzY29ubmVjdHMgdGhlIGRvY3VtZW50IGZyb20gdGhlIHBhcnRpdGlvbmVyLCBpLmUuIGluZGljYXRlcyB0aGUgZW5kCi0JICogb2YgdGhlIHVzYWdlIG9mIHRoZSByZWNlaXZlciBhcyBwYXJ0aXRpb25lciBvZiB0aGUgZ2l2ZW4gZG9jdW1lbnQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2Rpc2Nvbm5lY3QoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNjb25uZWN0KCkgewotCQlpbnZhbGlkYXRlUGFydGl0aW9uQ2FjaGUoKTsKLQkJdGhpcy5mU3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbmZvcm1zIGFib3V0IGEgZm9ydGhjb21pbmcgZG9jdW1lbnQgY2hhbmdlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpbnZhbGlkYXRlUGFydGl0aW9uQ2FjaGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZC4gVGhlIHBhcnRpdGlvbmVyIHVwZGF0ZXMgdGhlIHNldCBvZgotCSAqIHJlZ2lvbnMgYW5kIHJldHVybnMgd2hldGhlciB0aGUgc3RydWN0dXJlIG9mIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcKLQkgKiBoYXMgYmVlbiBjaGFuZ2VkLCBpLmUuIHdoZXRoZXIgcGFydGl0aW9ucyBoYXZlIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXIjZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHsKLQkJCS8vIHBhcnRpdGlvbnMgZG9uJ3QgYWx3YXlzIGNoYW5nZSB3aGlsZSBkb2N1bWVudCByZWdpb25zIGRvLAotCQkJLy8gYnV0IHRoYXQncyB0aGUgb25seSAicXVpY2sgY2hlY2siIHdlIGhhdmUuCi0JCQkvLyBJJ20gbm90IHN1cmUgaWYgc29tZXRoaW5nIG1vcmUgc29waGlzdGljYXRlZCB3aWxsIGJlIG5lZWRlZAotCQkJLy8gaW4gdGhlIGZ1dHVyZS4gKGRtdywgMDIvMTgvMDQpLgotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRvUGFyc2VyU3BlY2lmaWNDaGVjayhpbnQgb2Zmc2V0LCBib29sZWFuIHBhcnRpdGlvbkZvdW5kLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXh0LCBJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0KSB7Ci0JCS8vIHRoaXMgKGNvbmNlcHR1YWxseSkgYWJzdHJhY3QgbWV0aG9kIGlzIG5vdCBjb25jZXJuZWQgd2l0aAotCQkvLyBzcGVjaWZpYyByZWdpb24gdHlwZXMKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgcGFydGl0aW9uIGNvbnRhaW5pbmcgdGhlIGdpdmVuCi0JICogY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBkb2N1bWVudC4gVGhlIGRvY3VtZW50IGhhcyBwcmV2aW91c2x5Ci0JICogYmVlbiBjb25uZWN0ZWQgdG8gdGhlIHBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNnZXRDb250ZW50VHlwZShpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBnZXRQYXJ0aXRpb24ob2Zmc2V0KS5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogVG8gYmUgdXNlZCBieSBkZWZhdWx0IQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0KLQkJcmV0dXJuIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgYWxsIHBvc3NpYmxlIGNvbnRlbnQgdHlwZXMgdGhlIHBhcnRpdGlvbmVyIHN1cHBvcnRzLgotCSAqIEkuZS4gQW55IHJlc3VsdCBkZWxpdmVyZWQgYnkgdGhpcyBwYXJ0aXRpb25lciBtYXkgbm90IGNvbnRhaW4gYSBjb250ZW50Ci0JICogdHlwZSB3aGljaCB3b3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhpcyBtZXRob2QncyByZXN1bHQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2dldExlZ2FsQ29udGVudFR5cGVzKCkKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlpZiAoZlN1cHBvcnRlZFR5cGVzID09IG51bGwpIHsKLQkJCWluaXRMZWdhbENvbnRlbnRUeXBlcygpOwotCQl9Ci0JCXJldHVybiBmU3VwcG9ydGVkVHlwZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGNoYXJhY3RlciBwb3NpdGlvbiBvZiB0aGUKLQkgKiBnaXZlbiBkb2N1bWVudC4gVGhlIGRvY3VtZW50IGhhcyBwcmV2aW91c2x5IGJlZW4gY29ubmVjdGVkIHRvIHRoZQotCSAqIHBhcnRpdGlvbmVyLgotCSAqIAotCSAqIE5vdGU6IHRoaXMgc2hvdWxkbid0IGJlIGNhbGxlZCBkaXJlY3RseSBieSBjbGllbnRzLCB1bmxlc3MgdGhleSBjb250cm9sCi0JICogdGhlIHRocmVhZGluZyB0aGF0IGluY2x1ZGVzIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvY3VtZW50LiBPdGhlcndpc2UKLQkgKiB0aGUgZG9jdW1lbnQgY291bGQgYmUgbW9kaWZpZWQgd2hpbGUgcGFydGl0aW9ucyBhcmUgYmVpbmcgY29tcHV0ZWQuIFdlCi0JICogYWR2aXNlIHRoYXQgY2xpZW50cyB1c2UgdGhlIGdldFBhcnRpdGlvbiBBUEkgZGlyZWN0bHkgZnJvbSB0aGUKLQkgKiBkb2N1bWVudCwgc28gdGhleSB3b24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoYXQuCi0JICogCi0JICogCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2dldFBhcnRpdGlvbihpbnQpCi0JICovCi0JcHVibGljIElUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oaW50IG9mZnNldCkgewotCQlpbnRlcm5hbEdldFBhcnRpdGlvbihvZmZzZXQsIHRydWUpOwotCQlyZXR1cm4gY3JlYXRlTmV3UGFydGl0aW9uSW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvbkZyb21CbG9ja2VkVGV4dChJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQsIFN0cmluZyByZXN1bHQpIHsKLQkJLy8gcGFyc2VyIHNlbnNpdGl2ZSBjb2RlIHdhcyBtb3ZlZCB0byBzdWJjbGFzcyBmb3IgcXVpY2sgdHJhbnNpdGlvbgotCQkvLyB0aGlzIChjb25jZXB0dWFsbHkpIGFic3RyYWN0IHZlcnNpb24gaXNuJ3QgY29uY2VybmVkIHdpdGggYmxvY2tlZAotCQkvLyB0ZXh0Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoRm9yZWlnblJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHRhZ25hbWUgPSByZWdpb24uZ2V0U3Vycm91bmRpbmdUYWcoKTsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh0YWduYW1lICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9ICJCTE9DSzoiICsgdGFnbmFtZS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9ICJCTE9DSyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gYmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0KLQkJLy8gcmVnaW9ucyBzaG91bGQgbmV2ZXIgYmUgbnVsbCwgb3IgaG9sZCB6ZXJvIHJlZ2lvbnMsIGJ1dCBqdXN0IGluCi0JCS8vIGNhc2UuLi4KLQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCAmJiByZWdpb25zLnNpemUoKSA+IDApIHsKLQkJCWlmIChyZWdpb25zLnNpemUoKSA9PSAxKSB7Ci0JCQkJLy8gaWYgb25seSBvbmUsIHRoZW4gaXRzIGEgInB1cmUiIGJsb2NrZWQgbm90ZS4KLQkJCQkvLyBpZiBtb3JlIHRoYW4gb25lLCB0aGVuIG11c3QgY29udGFpbiBzb21lIGVtYmVkZGVkIHJlZ2lvbgotCQkJCS8vIGNvbnRhaW5lcgotCQkJCUlUZXh0UmVnaW9uIGJsb2NrZWRSZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJCQkvLyBkb3VibGUgY2hlY2sgZm9yIGNvZGUgc2FmZWZ5LCB0aG91Z2ggc2hvdWxkIGFsd2F5cyBiZSB0cnVlCi0JCQkJaWYgKGJsb2NrZWRSZWdpb24gaW5zdGFuY2VvZiBGb3JlaWduUmVnaW9uKSB7Ci0JCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKEZvcmVpZ25SZWdpb24pIGJsb2NrZWRSZWdpb24sIG9mZnNldCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBtdXN0IGhhdmUgc29tZSBlbWJlZGRlZCByZWdpb24gY29udGFpbmVyLCBzbyB3ZSdsbCBtYWtlCi0JCQkJLy8gc3VyZSB3ZSdsbCBnZXQgdGhlIGFwcHJvcHJpYXRlIG9uZQotCQkJCXJlc3VsdCA9IGdldFJlbGV2ZW50UmVnaW9uVHlwZShibG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBvZmZzZXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldFBhcnRpdGlvblR5cGUuCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJLy8gaWYgaXQgZ2V0J3MgdG8gdGhpcyAicmF3IiBsZXZlbCwgdGhlbgotCQkvLyBtdXN0IGJlIGRlZmF1bHQuCi0JCXJldHVybiBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnRpdGlvbiBiYXNlZCBvbiByZWdpb24gdHlwZS4gVGhpcyBiYXNpY2FsbHkgbWFwcyBmcm9tCi0JICogb25lIHJlZ2lvbi10eXBlIHNwYWNlIHRvIGFub3RoZXIsIGhpZ2hlciBsZXZlbCwgcmVnaW9uLXR5cGUgc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCk7Ci0JCS8vCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgQ29udGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkvLwkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24sIG9mZnNldCk7Ci0JCS8vCQl9IGVsc2UgewotCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24sIG9mZnNldCk7Ci0JCX0KLQotCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25Gcm9tQmxvY2tlZFRleHQocmVnaW9uLCBvZmZzZXQsIHJlc3VsdCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCS8qKgotCSAqIFNpbWlsYXIgdG8gbWV0aG9kIHdpdGggJ0lUZXh0UmVnaW9uJyBhcyBhcmd1bWVudCwgZXhjZXB0IGZvcgotCSAqIFJlZ2lvbkNvbnRhaW5lcnMsIGlmIGl0IGhhcyBlbWJlZGRlZCByZWdpb25zLCB0aGVuIHdlIG5lZWQgdG8gZHJpbGwKLQkgKiBkb3duIGFuZCByZXR1cm4gRG9jdW1lbnRQYXJ0aXRpb24gYmFzZWQgb24gImxvd2VzdCBsZXZlbCIgcmVnaW9uIHR5cGUuCi0JICogRm9yIGV4YW1wbGUsIGluIDxib2R5IGlkPSIgPCU9IG9iamVjdC5nZXRJRCgpICU+IiA+IFRoZSB0ZXh0IGJldHdlZW4KLQkgKiA8JT0gYW5kICU+IHdvdWxkIGJlIGEgImphdmEgcmVnaW9uIiBub3QgYW4gIkhUTUwgcmVnaW9uIi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb25Db250YWluZXIgcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIFRPRE8gdGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgJ2NsZWFuZWQgdXAnIGFmdGVyIHJlZmFjdG9yaW5nCi0JCS8vIGl0cyBpbnN0YW5jZW9mIGxvZ2ljIHNlZW1zIG1lc3NlZCB1cCBub3cuCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uIGNvcmVSZWdpb24gPSByZWdpb247Ci0JCQlpZiAoY29yZVJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZSgoSVRleHRSZWdpb25Db250YWluZXIpIGNvcmVSZWdpb24sICgoSVRleHRSZWdpb25Db250YWluZXIpIGNvcmVSZWdpb24pLmdldFJlZ2lvbnMoKSwgb2Zmc2V0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZShyZWdpb24pOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZSgoSVRleHRSZWdpb24pIHJlZ2lvbiwgb2Zmc2V0KTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbkNvbnRhaW5lciBjb3JlUmVnaW9uLCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucywgaW50IG9mZnNldCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChjb3JlUmVnaW9uLmNvbnRhaW5zT2Zmc2V0KHJlZ2lvbiwgb2Zmc2V0KSkgewotCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHBhcnRpdGlvbiB0eXBlIGZvciB0aGUgemVyby1sZW5ndGggcGFydGl0aW9uIGJldHdlZW4gYQotCSAqIHN0YXJ0IHRhZyBhbmQgZW5kIHRhZyB3aXRoIHRoZSBnaXZlbiBuYW1lIHJlZ2lvbnMuCi0JICogCi0JICogQHBhcmFtIHByZXZpb3VzU3RhcnRUYWdOYW1lUmVnaW9uCi0JICogQHBhcmFtIG5leHRFbmRUYWdOYW1lUmVnaW9uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNOb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSVRleHRSZWdpb24gYXQgdGhlIGdpdmVuIG9mZnNldC4gRm9yIG1vc3QgY2FzZXMsIHRoaXMgd2lsbAotCSAqIGJlIHRoZSBmbGF0Tm9kZSBpdHNlbGYuIFNob3VsZCBpdCBjb250YWluIGFuIGVtYmVkZGVkCi0JICogSVRleHRSZWdpb25Db250YWluZXIsIHdpbGwgcmV0dXJuIHRoZSBpbnRlcm5hbCByZWdpb24gYXQgdGhlIG9mZnNldAotCSAqIAotCSAqIAotCSAqIEBwYXJhbSBmbGF0Tm9kZQotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIElUZXh0UmVnaW9uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVsZXZlbnRSZWdpb25UeXBlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIGludCBvZmZzZXQpIHsKLQkJLy8JCSogTm90ZTogdGhlIG9yaWdpbmFsIGZvcm0gb2YgdGhpcyBtZXRob2QgLS0gd2hpY2ggcmV0dXJuZWQgImRlZXAiCi0JCS8vIHJlZ2lvbiwgaXNuJ3QgdGhhdAotCQkvLwkJKiB1c2VmdWwsIGFmdGVyIGRvaW5nIHBhcmVudCBlbGltaW5hdGlvbiByZWZhY3RvcmluZywKLQkJLy8JCSogc2luY2Ugb25jZSB0aGUgZGVlcCByZWdpb24gaXMgcmV0dXJuZWQsIGl0cyBoYXJkIHRvIGdldCBpdHMgdGV4dAotCQkvLyBvciBvZmZzZXQgd2l0aG91dAotCQkvLwkJKiBwcm9wZXIgcGFyZW50LgotCQlJVGV4dFJlZ2lvbiByZXN1bHRSZWdpb24gPSBudWxsOwotCQlpZiAoY29udGFpbnNFbWJlZGRlZFJlZ2lvbihmbGF0Tm9kZSkpIHsKLQkJCXJlc3VsdFJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAocmVzdWx0UmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQlyZXN1bHRSZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVzdWx0UmVnaW9uKS5nZXRSZWdpb25zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlpZiAoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikpIHsKLQkJCQkJCXJlc3VsdFJlZ2lvbiA9IHJlZ2lvbjsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzdWx0UmVnaW9uID0gZmxhdE5vZGU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFJlZ2lvbi5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogVG8gYmUgdXNlZCwgaW5zdGVhZCBvZiBkZWZhdWx0LCB3aGVuIHRoZXJlIGlzIHNvbWUgdGhpbmcgc3VycHJpc2luZwotCSAqIGFib3V0IGFyZSBhdHRlbXB0IHRvIHBhcnRpdGlvbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5rbm93bigpIHsKLQkJcmV0dXJuIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTjsKLQl9Ci0KLQkvKioKLQkgKiB0byBiZSBhYnN0cmFjdCBldmVudHVhbGx5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlmU3VwcG9ydGVkVHlwZXMgPSBuZXcgU3RyaW5nW117SVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OLCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT059OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnRpdGlvbiBjb250YWluaW5nIHRoZSBnaXZlbiBjaGFyYWN0ZXIgcG9zaXRpb24gb2YgdGhlCi0JICogZ2l2ZW4gZG9jdW1lbnQuIFRoZSBkb2N1bWVudCBoYXMgcHJldmlvdXNseSBiZWVuIGNvbm5lY3RlZCB0byB0aGUKLQkgKiBwYXJ0aXRpb25lci4gSWYgdGhlIGNoZWNrQmV0d2VlbiBwYXJhbWV0ZXIgaXMgdHJ1ZSwgYW4gb2Zmc2V0IGJldHdlZW4gYQotCSAqIHN0YXJ0IGFuZCBlbmQgdGFnIHdpbGwgcmV0dXJuIGEgemVyby1sZW5ndGggcmVnaW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnRlcm5hbEdldFBhcnRpdGlvbihpbnQgb2Zmc2V0LCBib29sZWFuIGNoZWNrQmV0d2VlbikgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkb2N1bWVudCBwYXJ0aXRpb25lciBpcyBub3QgY29ubmVjdGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWJvb2xlYW4gcGFydGl0aW9uRm91bmQgPSBmYWxzZTsKLQkJaW50IGRvY0xlbmd0aCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCS8vIGdldCBkb2N1bWVudCByZWdpb24gdHlwZSBhbmQgbWFwIHRvIHBhcnRpdGlvbiB0eXBlIDoKLQkJLy8gTm90ZTogYSBwYXJ0aW9uIGNhbiBiZSBzbWFsbGVyIHRoYW4gYSBmbGF0bm9kZSwgaWYgdGhhdCBmbGF0bm9kZQotCQkvLyBjb250YWlucyBhIHJlZ2lvbiBjb250YWluZXIuCi0JCS8vIFRoYXQncyB3aHkgd2UgbmVlZCB0byBnZXQgInJlbGV2ZW50IHJlZ2lvbiIuCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkvLyBmbGF0Tm9kZSBpcyBudWxsIGlmIGVtcHR5IGRvY3VtZW50Ci0JCS8vIHRoaXMgaXMga2luZyBvZiBhICJub3JtYWwgY2FzZSIgZm9yIGVtcHR5IGRvY3VtZW50Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJaWYgKGRvY0xlbmd0aCA9PSAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBJbiBvcmRlciB0byBwcmV2ZW50IGluZmluaXRlIGVycm9yIGxvb3BzLCB0aGlzIHBhcnRpdGlvbgotCQkJCSAqIG11c3QgbmV2ZXIgaGF2ZSBhIHplcm8gbGVuZ3RoIHVubGVzcyB0aGUgZG9jdW1lbnQgaXMgYWxzbwotCQkJCSAqIHplcm8gbGVuZ3RoCi0JCQkJICovCi0JCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCAwLCBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpKTsKLQkJCQlwYXJ0aXRpb25Gb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKgotCQkJCSAqIFRoaXMgY2FzZSBpcyAidW51c3VhbCIuIFdoZW4gd291bGQgcmVnaW9uIGJlIG51bGwsIGFuZAotCQkJCSAqIGRvY3VtZW50IGxvbmdlciB0aGFuIDAuIEkgdGhpbmsgdGhpcyBtZWFucyBzb21ldGhpbmcncyAib3V0Ci0JCQkJICogb2Ygc3luYyIuIEFuZCB3ZSBtYXkgd2FudCB0byAiZmxhZyIgdGhhdCBmYWN0IGFuZCBqdXN0Ci0JCQkJICogcmV0dXJuIG9uZSBiaWcgcmVnaW9uIG9mICd1bmtub3duJywgaW5zdGVhZCBvZiBvbmUKLQkJCQkgKiBjaGFyYWN0ZXIgYXQgYSB0aW1lLgotCQkJCSAqLwotCQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMSwgZ2V0VW5rbm93bigpKTsKLQkJCQlwYXJ0aXRpb25Gb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCX0JCi0JCWVsc2UgaWYgKGNoZWNrQmV0d2VlbikgewotCQkJLy8gZG13OiBtaW5pbWl6ZXMgb3V0IHRvIHRoZSBmaXJzdCBpZiB0ZXN0IGFib3ZlCi0JCQkvLwkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCAmJiBkb2NMZW5ndGggPT0gMCkgewotCQkJLy8JCQkJLy8ga25vd24gc3BlY2lhbCBjYXNlIGZvciBhbiBlbXB0eSBkb2N1bWVudAotCQkJLy8JCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCAwLCBnZXREZWZhdWx0KCkpOwotCQkJLy8JCQkJcGFydGl0aW9uRm91bmQgPSB0cnVlOwotCQkJLy8JCQl9Ci0JCQkvLwkJCWVsc2UKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSA9PSBvZmZzZXQpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQkJaWYgKHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJSVRleHRSZWdpb24gbmV4dCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0ID0gcHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCXBhcnRpdGlvbkZvdW5kID0gZG9QYXJzZXJTcGVjaWZpY0NoZWNrKG9mZnNldCwgcGFydGl0aW9uRm91bmQsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIG5leHQsIHByZXZpb3VzU3RhcnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcGFydGl0aW9uRm91bmQgJiYgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCS8qIFdlIHdhbnQgdGhlIGFjdHVhbCBJVGV4dFJlZ2lvbiBhbmQgbm90IGEgcG9zc2libGUgSVRleHRSZWdpb25Db2xsZWN0aW9uIHRoYXQKLQkJCSAqIGNvdWxkIGJlIHJldHVybmVkIGJ5IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQKLQkJCSAqIFRoaXMgYWxsb3dzIGZvciBjb3JyZWN0IHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIGNvbnRlbnQgYXNzaXN0LgotCQkJICovCi0JCQlEZWVwUmVnaW9uIHJlc3VsdFJlZ2lvbiA9IGdldERlZXBSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIG9mZnNldCk7Ci0JCQlwYXJ0aXRpb25Gb3VuZCA9IGlzRG9jdW1lbnRSZWdpb25CYXNlZFBhcnRpdGlvbihzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlc3VsdFJlZ2lvbi5yZWdpb24sIG9mZnNldCk7Ci0JCQlpZiAoIXBhcnRpdGlvbkZvdW5kKSB7Ci0JCQkJaWYgKHJlc3VsdFJlZ2lvbi5yZWdpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdHlwZSA9IGdldFBhcnRpdGlvblR5cGUocmVzdWx0UmVnaW9uLnJlZ2lvbiwgb2Zmc2V0KTsKLQkJCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCByZXN1bHRSZWdpb24uZW5kIC0gb2Zmc2V0LCB0eXBlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBjYW4gaGFwcGVuIGF0IEVPRgotCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI0ODg2Ci0JCQkJCS8vIFRoZSB1bmtub3duIHR5cGUgd2FzIGNhdXNpbmcgcHJvYmxlbXMgd2l0aCBjb250ZW50IGFzc2lzdCBpbiBKU1AgZG9jdW1lbnRzCi0JCQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMSwgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVlcFJlZ2lvbiB7Ci0JCWludCBlbmQ7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbjsKLQkJRGVlcFJlZ2lvbihJVGV4dFJlZ2lvbiByLCBpbnQgZSkgewotCQkJcmVnaW9uID0gcjsKLQkJCWVuZCA9IGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8cD5Vbmxpa2Uge0BsaW5rIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50KX0gdGhpcyB3aWxsIGRpZwotCSAqIGludG8gPGNvZGU+SVRleHRSZWdpb25Db2xsZWN0aW9uPC9jb2RlPiB0byBmaW5kIHRoZSByZWdpb24gY29udGFpbmluZyB0aGUgZ2l2ZW4gb2Zmc2V0PC9wPgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24gdGhlIGNvbnRhaW5pbmcgcmVnaW9uIG9mIHRoZSBnaXZlbiA8Y29kZT5vZmZzZXQ8L2NvZGU+Ci0JICogQHBhcmFtIG9mZnNldCB0byB0aGUgb3ZlcmFsbCBvZmZzZXQgaW4gdGhlIGRvY3VtZW50LgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPklUZXh0UmVnaW9uPC9jb2RlPiBjb250YWluaW5nIHRoZSBnaXZlbiA8Y29kZT5vZmZzZXQ8L2NvZGU+LCB3aWxsIG5ldmVyIGJlCi0JICogYSA8Y29kZT5JVGV4dFJlZ2lvbkNvbGxleHRpb248L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBEZWVwUmVnaW9uIGdldERlZXBSZWdpb25BdENoYXJhY3Rlck9mZnNldChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlJVGV4dFJlZ2lvbiB0ZXh0ID0gcmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCWludCBlbmQgPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCWVuZCArPSB0ZXh0LmdldFN0YXJ0KCk7Ci0JCXdoaWxlICh0ZXh0IGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQl0ZXh0ID0gKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHRleHQpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQllbmQgKz0gdGV4dC5nZXRTdGFydCgpOwotCQl9Ci0JCWlmICh0ZXh0ICE9IG51bGwpCi0JCQllbmQgKz0gdGV4dC5nZXRMZW5ndGgoKTsKLQkJcmV0dXJuIG5ldyBEZWVwUmVnaW9uKHRleHQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgZm9yIGEgcGVyLVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvdmVycmlkZSBzZWxlY3RpbmcgdGhlCi0JICogcGFydGl0aW9uIHR5cGUgdXNpbmcgbW9yZSB0aGFuIGp1c3QgYSBzaW5nbGUgSVRleHRSZWdpb24uCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqICAgICAgICAgICAgdGhlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSBjb250YWluZWRDaGlsZFJlZ2lvbgotCSAqICAgICAgICAgICAgYW4gSVRleHRSZWdpb24gd2l0aGluIHRoZSBnaXZlbiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiAgICAgICAgICAgIHRoYXQgd291bGQgbm9ybWFsbHkgZGV0ZXJtaW5lIHRoZSBwYXJ0aXRpb24gdHlwZSBieSBpdHNlbGYKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgb2Zmc2V0Ci0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXJ0aXRpb24gdHlwZSB3aWxsIGJlIG92ZXJyaWRkZW4sIGZhbHNlIHRvCi0JICogICAgICAgICBjb250aW51ZSBub3JtYWwgcHJvY2Vzc2luZwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRG9jdW1lbnRSZWdpb25CYXNlZFBhcnRpdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gY29udGFpbmVkQ2hpbGRSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJc3luY2hyb25pemVkIChQQVJUSVRJT05fTE9DSykgewotCQkJaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2Uuc2V0T2Zmc2V0KG9mZnNldCk7Ci0JCQlpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCWludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLnNldFR5cGUodHlwZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9Db21tYW5kQ3Vyc29yUG9zaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9Db21tYW5kQ3Vyc29yUG9zaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM5Y2Y1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vQ29tbWFuZEN1cnNvclBvc2l0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmRDdXJzb3JQb3NpdGlvbiB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgc2V0IHRvIGFmdGVyIHRoaXMgY29tbWFuZCBpcyByZWRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0UmVkb0N1cnNvclBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFJlZG9TZWxlY3Rpb25MZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSBzZXQgdG8gYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHVuZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRVbmRvQ3Vyc29yUG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0VW5kb1NlbGVjdGlvbkxlbmd0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIGJlIHVzZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKi8KLQl2b2lkIHNldFJlZG9DdXJzb3JQb3NpdGlvbihpbnQgY3Vyc29yUG9zaXRpb24pOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRleHQgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKi8KLQl2b2lkIHNldFJlZG9TZWxlY3Rpb25MZW5ndGgoaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgdXNlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqLwotCXZvaWQgc2V0VW5kb0N1cnNvclBvc2l0aW9uKGludCBjdXJzb3JQb3NpdGlvbik7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqLwotCXZvaWQgc2V0VW5kb1NlbGVjdGlvbkxlbmd0aChpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9JRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0lEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzI4ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0lEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IncyBpbnB1dCBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IncyBpbnB1dCBkb2N1bWVudAotCSAqLwotCUlEb2N1bWVudCBnZXREb2N1bWVudCgpOwotCi0JLyoqCi0JICogU2V0cyBhIG5ldyBzZWxlY3Rpb24gaW4gdGhlIGRvY3VtZW50IGFzIGEgcmVzdWx0IG9mIGFuIHVuZG8gb3BlcmF0aW9uLgotCSAqIAotCSAqIFVuZG9Eb2N1bWVudEV2ZW50IGNvbnRhaW5zIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIHVuZG8gb3BlcmF0aW9uLCBhbmQgdGhlCi0JICogb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIG5ldyBzZWxlY3Rpb24uIEltcGxlbWVudGF0aW9uIG9mCi0JICogSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgY2FuIGNoZWNrIGlmIGl0J3MgdGhlIHJlcXVlc3RlciB0aGF0IGNhdXNlZAotCSAqIHRoZSBuZXcgc2VsZWN0aW9uLCBhbmQgZGVjaWRlIGlmIHRoZSBuZXcgc2VsZWN0aW9uIHNob3VsZCBiZSBhcHBsaWVkLgotCSAqLwotCXZvaWQgdW5kb09wZXJhdGlvblNlbGVjdGlvbkNoYW5nZWQoVW5kb0RvY3VtZW50RXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0lTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzNTFiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCk7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbik7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIENvbm5lY3QgdGhlIG1lZGlhdG9yIHRvIHRoZSB1bmRvIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBjb25uZWN0KElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKTsKLQotCS8qKgotCSAqIERpc2FibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqLwotCXZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0KLQkvKioKLQkgKiBEaXNjb25uZWN0IHRoZSBtZWRpYXRvciBmcm9tIHRoZSB1bmRvIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBkaXNjb25uZWN0KElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKTsKLQotCS8qKgotCSAqIEVuYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0Jdm9pZCBlbmFibGVVbmRvTWFuYWdlbWVudCgpOwotCi0JLyoqCi0JICogRW5kIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKTsKLQotCS8qKgotCSAqIEVuZCByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIE5vcm1hbGx5LCB0aGUgdW5kbyBtYW5hZ2VyIGNhbiBmaWd1cmUgb3V0IHRoZSBiZXN0IHRpbWVzIHdoZW4gdG8gZW5kIGEKLQkgKiBwZW5kaW5nIGNvbW1hbmQgYW5kIGJlZ2luIGEgbmV3IG9uZSAuLi4gdG8gdGhlIHN0cnVjdHVyZSBvZiBhIHN0cnVjdHVlZAotCSAqIGRvY3VtZW50LiBUaGVyZSBhcmUgdGltZXMsIGhvd2V2ZXIsIHdoZW4gY2xpZW50cyBtYXkgd2lzaCB0byBvdmVycmlkZQotCSAqIHRob3NlIGFsZ29yaXRobXMgYW5kIGVuZCBvbmUgZWFybGllciB0aGFuIG5vcm1hbC4gVGhlIG9uZSBrbm93biBjYXNlIGlzCi0JICogZm9yIG11bHRpcGFnZSBlZGl0b3JzLiBJZiBhIHVzZXIgaXMgb24gb25lIHBhZ2UsIGFuZCB0eXBlICcxMjMnIGFzCi0JICogYXR0cmlidXRlIHZhbHVlLCB0aGVuIGNsaWNrIGFyb3VuZCB0byBvdGhlciBwYXJ0cyBvZiBwYWdlLCBvciBkaWZmZXJlbnQKLQkgKiBwYWdlcywgdGhlbiByZXR1cm4gdG8gJzEyM3wnIGFuZCB0eXBlIDQ1NiwgdGhlbiAidW5kbyIgdGhleSB0eXBpY2FsbHkKLQkgKiBleHBlY3QgdGhlIHVuZG8gdG8ganVzdCB1bmRvIHdoYXQgdGhleSBqdXN0IHR5cGVkLCB0aGUgNDU2LCBub3QgdGhlCi0JICogd2hvbGUgYXR0cmlidXRlIHZhbHVlLgotCSAqIDxwPgotCSAqIElmIHRoZXJlIGlzIG5vIHBlbmRpbmcgY29tbWFuZCwgdGhlIHJlcXVlc3QgaXMgaWdub3JlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JjZUVuZE9mUGVuZGluZ0NvbW1hbmQoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnJlbnRQb3NpdGlvbiwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiBTb21lIGNsaWVudHMgbmVlZCB0byBkbyBjb21wbGljYXRlZCB0aGluZ3Mgd2l0aCB1bmRvIHN0YWNrLiBQbHVzLCBpbgotCSAqIHNvbWUgY2FzZXMsIGlmIGNsaWVudHMgc2V0Q29tbWFuZFN0YWNrIHRlbXBvcmFyaWx5LCB0aGV5IGhhdmUKLQkgKiByZXBvbnNpYmlsaXR5IHRvIHNldCBiYWNrIHRvIG9yaWdpbmFsIG9uZSB3aGVuIGZpbmlzaGVkLgotCSAqLwotCXB1YmxpYyBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJlZG8gY29tbWFuZCBldmVuIGlmIGl0J3Mgbm90IGNvbW1pdHRlZCB5ZXQuCi0JICovCi0JQ29tbWFuZCBnZXRSZWRvQ29tbWFuZCgpOwotCi0JLyoqCi0JICogR2V0IHRoZSB1bmRvIGNvbW1hbmQgZXZlbiBpZiBpdCdzIG5vdCBjb21taXR0ZWQgeWV0LgotCSAqLwotCUNvbW1hbmQgZ2V0VW5kb0NvbW1hbmQoKTsKLQotCS8qKgotCSAqIFJlZG8gdGhlIGxhc3QgY29tbWFuZCBpbiB0aGUgdW5kbyBtYW5hZ2VyLgotCSAqLwotCXZvaWQgcmVkbygpOwotCi0JLyoqCi0JICogUmVkbyB0aGUgbGFzdCBjb21tYW5kIGluIHRoZSB1bmRvIG1hbmFnZXIgYW5kIG5vdGlmeSB0aGUgcmVxdWVzdGVyCi0JICogYWJvdXQgdGhlIG5ldyBzZWxlY3Rpb24uCi0JICovCi0Jdm9pZCByZWRvKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3Rlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgYXQgbGVhc3Qgb25lIHRleHQgY2hhbmdlIGNhbiBiZSByZXBlYXRlZC4gQSB0ZXh0IGNoYW5nZQotCSAqIGNhbiBiZSByZXBlYXRlZCBvbmx5IGlmIGl0IHdhcyBleGVjdXRlZCBhbmQgcm9sbGVkIGJhY2suCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbiB0ZXh0IGNoYW5nZSBjYW4gYmUgcmVwZWF0ZWQKLQkgKi8KLQlib29sZWFuIHJlZG9hYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGNvbW1hbmQgc3RhY2suCi0JICovCi0Jdm9pZCBzZXRDb21tYW5kU3RhY2soQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayk7Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBsYXN0IGNvbW1hbmQgaW4gdGhlIHVuZG8gbWFuYWdlci4KLQkgKi8KLQl2b2lkIHVuZG8oKTsKLQotCS8qKgotCSAqIFVuZG8gdGhlIGxhc3QgY29tbWFuZCBpbiB0aGUgdW5kbyBtYW5hZ2VyIGFuZCBub3RpZnkgdGhlIHJlcXVlc3RlcgotCSAqIGFib3V0IHRoZSBuZXcgc2VsZWN0aW9uLgotCSAqLwotCXZvaWQgdW5kbyhJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSB0ZXh0IGNoYW5nZSBjYW4gYmUgcm9sbGVkIGJhY2suCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbmUgdGV4dCBjaGFuZ2UgY2FuIGJlIHJvbGxlZAotCSAqICAgICAgICAgYmFjawotCSAqLwotCWJvb2xlYW4gdW5kb2FibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA4NWY1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIFN0cnVjdHVyZWRUZXh0Q29tbWFuZCB7Ci0KLQlTdHJpbmcgZ2V0VGV4dERlbGV0ZWQoKTsKLQotCWludCBnZXRUZXh0RW5kKCk7Ci0KLQlTdHJpbmcgZ2V0VGV4dEluc2VydGVkKCk7Ci0KLQlpbnQgZ2V0VGV4dFN0YXJ0KCk7Ci0KLQl2b2lkIHNldFRleHREZWxldGVkKFN0cmluZyB0ZXh0RGVsZXRlZCk7Ci0KLQl2b2lkIHNldFRleHRFbmQoaW50IHRleHRFbmQpOwotCi0Jdm9pZCBzZXRUZXh0SW5zZXJ0ZWQoU3RyaW5nIHRleHRJbnNlcnRlZCk7Ci0KLQl2b2lkIHNldFRleHRTdGFydChpbnQgdGV4dFN0YXJ0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbW1hbmRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21tYW5kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGYyYmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbW1hbmRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cyBTdHJ1Y3R1cmVkVGV4dENvbW1hbmQgewotCi0JcHJvdGVjdGVkIElEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOyAvLyBuZWVkZWQgZm9yIHVwZGF0aW5nIHRoZSB0ZXh0Ci0JcHJvdGVjdGVkIFN0cmluZyBmVGV4dERlbGV0ZWQgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZlRleHRFbmQgPSAtMTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUZXh0SW5zZXJ0ZWQgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZlRleHRTdGFydCA9IC0xOwotCi0JLyoqCi0JICogV2UgaGF2ZSBuby1hcmcgY29uc3RydWN0b3Igbm9uLXB1YmxpYyB0byBmb3JjZSBkb2N1bWVudCB0byBiZSBzcGVjZmllZC4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMoKTsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7IC8vIG5lZWRlZCBmb3IgdXBkYXRpbmcgdGhlIHRleHQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCX0KLQotCS8qKgotCSAqIGdldFRleHREZWxldGVkIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHREZWxldGVkKCkgewotCQlyZXR1cm4gZlRleHREZWxldGVkOwotCX0KLQotCS8qKgotCSAqIHRleHRFbmQgaXMgdGhlIHNhbWUgYXMgKHRleHRTdGFydCArIHRleHRJbnNlcnRlZC5sZW5ndGgoKSkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmVGV4dEVuZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUZXh0SW5zZXJ0ZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGV4dEluc2VydGVkKCkgewotCQlyZXR1cm4gZlRleHRJbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUZXh0U3RhcnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7Ci0JCXJldHVybiBmVGV4dFN0YXJ0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkvLyBub3RlOiBvbmUgb2YgdGhlIGZldyBwbGFjZXMgd2UgcHJvZ3JhbWF0aWNhbGx5IGlnbm9yZSByZWFkLW9ubHkKLQkJCS8vIHNldHRpbmdzCi0JCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudCkucmVwbGFjZVRleHQodGhpcywgZlRleHRTdGFydCwgZlRleHREZWxldGVkLmxlbmd0aCgpLCBmVGV4dEluc2VydGVkLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJZkRvY3VtZW50LnJlcGxhY2UoZlRleHRTdGFydCwgZlRleHREZWxldGVkLmxlbmd0aCgpLCBmVGV4dEluc2VydGVkKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBhc3N1bWVkIGltcG9zc2libGUsIGZvciBub3cKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0VGV4dERlbGV0ZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dERlbGV0ZWQoamF2YS5sYW5nLlN0cmluZyB0ZXh0RGVsZXRlZCkgewotCQlmVGV4dERlbGV0ZWQgPSB0ZXh0RGVsZXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUZXh0RW5kIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRFbmQoaW50IHRleHRFbmQpIHsKLQkJZlRleHRFbmQgPSB0ZXh0RW5kOwotCX0KLQotCS8qKgotCSAqIHNldFRleHRJbnNlcnRlZCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0SW5zZXJ0ZWQoamF2YS5sYW5nLlN0cmluZyB0ZXh0SW5zZXJ0ZWQpIHsKLQkJZlRleHRJbnNlcnRlZCA9IHRleHRJbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUZXh0U3RhcnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFN0YXJ0KGludCB0ZXh0U3RhcnQpIHsKLQkJZlRleHRTdGFydCA9IHRleHRTdGFydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJLy8gbm90ZTogb25lIG9mIHRoZSBmZXcgcGxhY2VzIHdlIHByb2dyYW1hdGljYWxseSBpZ25vcmUgcmVhZC1vbmx5Ci0JCQkvLyBzZXR0aW5ncwotCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLnJlcGxhY2VUZXh0KHRoaXMsIGZUZXh0U3RhcnQsIGZUZXh0SW5zZXJ0ZWQubGVuZ3RoKCksIGZUZXh0RGVsZXRlZCwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWZEb2N1bWVudC5yZXBsYWNlKGZUZXh0U3RhcnQsIGZUZXh0SW5zZXJ0ZWQubGVuZ3RoKCksIGZUZXh0RGVsZXRlZCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gYXNzdW1lZCBpbXBvc3NpYmxlLCBmb3Igbm93Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmNzYzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGV4dGVuZHMgQ29tcG91bmRDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZEN1cnNvclBvc2l0aW9uIHsKLQlwcm90ZWN0ZWQgaW50IGZSZWRvQ3Vyc29yUG9zaXRpb24gPSAtMTsKLQlwcm90ZWN0ZWQgaW50IGZSZWRvU2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCXByb3RlY3RlZCBpbnQgZlVuZG9DdXJzb3JQb3NpdGlvbiA9IC0xOwotCXByb3RlY3RlZCBpbnQgZlVuZG9TZWxlY3Rpb25MZW5ndGggPSAwOwotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoaW50IHJlc3VsdEluZGV4KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKGludCByZXN1bHRJbmRleCwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgZGVzY3JpcHRpb24sIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKFN0cmluZyBsYWJlbCwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIobGFiZWwsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbiwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSBzZXQgdG8gYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVkb0N1cnNvclBvc2l0aW9uKCkgewotCQlpbnQgY3Vyc29yUG9zaXRpb24gPSAtMTsKLQotCQlpZiAoZlJlZG9DdXJzb3JQb3NpdGlvbiAhPSAtMSkKLQkJCWN1cnNvclBvc2l0aW9uID0gZlJlZG9DdXJzb3JQb3NpdGlvbjsKLQkJZWxzZSBpZiAoIWNvbW1hbmRMaXN0LmlzRW1wdHkoKSkgewotCQkJaW50IGNvbW1hbmRMaXN0U2l6ZSA9IGNvbW1hbmRMaXN0LnNpemUoKTsKLQkJCUNvbW1hbmQgbGFzdENvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZExpc3QuZ2V0KGNvbW1hbmRMaXN0U2l6ZSAtIDEpOwotCi0JCQlpZiAobGFzdENvbW1hbmQgaW5zdGFuY2VvZiBDb21tYW5kQ3Vyc29yUG9zaXRpb24pCi0JCQkJY3Vyc29yUG9zaXRpb24gPSAoKENvbW1hbmRDdXJzb3JQb3NpdGlvbikgbGFzdENvbW1hbmQpLmdldFJlZG9DdXJzb3JQb3NpdGlvbigpOwotCQl9Ci0KLQkJcmV0dXJuIGN1cnNvclBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyByZWRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlZG9TZWxlY3Rpb25MZW5ndGgoKSB7Ci0JCXJldHVybiBmUmVkb1NlbGVjdGlvbkxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgc2V0IHRvIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFVuZG9DdXJzb3JQb3NpdGlvbigpIHsKLQkJaW50IGN1cnNvclBvc2l0aW9uID0gLTE7Ci0KLQkJaWYgKGZVbmRvQ3Vyc29yUG9zaXRpb24gIT0gLTEpCi0JCQljdXJzb3JQb3NpdGlvbiA9IGZVbmRvQ3Vyc29yUG9zaXRpb247Ci0JCWVsc2UgaWYgKCFjb21tYW5kTGlzdC5pc0VtcHR5KCkpIHsKLQkJCS8vIG5ldmVyIHVzZWQKLQkJCS8vaW50IGNvbW1hbmRMaXN0U2l6ZSA9IGNvbW1hbmRMaXN0LnNpemUoKTsKLQkJCUNvbW1hbmQgZmlyc3RDb21tYW5kID0gKENvbW1hbmQpIGNvbW1hbmRMaXN0LmdldCgwKTsKLQotCQkJaWYgKGZpcnN0Q29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRDdXJzb3JQb3NpdGlvbikKLQkJCQljdXJzb3JQb3NpdGlvbiA9ICgoQ29tbWFuZEN1cnNvclBvc2l0aW9uKSBmaXJzdENvbW1hbmQpLmdldFVuZG9DdXJzb3JQb3NpdGlvbigpOwotCQl9Ci0KLQkJcmV0dXJuIGN1cnNvclBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFVuZG9TZWxlY3Rpb25MZW5ndGgoKSB7Ci0JCXJldHVybiBmVW5kb1NlbGVjdGlvbkxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgdXNlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZG9DdXJzb3JQb3NpdGlvbihpbnQgY3Vyc29yUG9zaXRpb24pIHsKLQkJZlJlZG9DdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyByZWRvbmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVkb1NlbGVjdGlvbkxlbmd0aChpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWZSZWRvU2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSB1c2VkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5kb0N1cnNvclBvc2l0aW9uKGludCBjdXJzb3JQb3NpdGlvbikgewotCQlmVW5kb0N1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRleHQgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHVuZG9uZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJZlVuZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTliOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGluaXRpYWwgSURvY3VtZW50RXh0ZW5zaW9uNCBzdXBwb3J0IC0gIzEwMjgyMgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgewotCi0JY2xhc3MgSW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lciBpbXBsZW1lbnRzIENvbW1hbmRTdGFja0xpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChFdmVudE9iamVjdCBldmVudCkgewotCQkJcmVzZXRJbnRlcm5hbENvbW1hbmRzKCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIHsKLQotCQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBEbyBub3RoaW5nLiBEbyBub3QgcHVzaCB0aGUgbmV3IG1vZGVsJ3Mgc3RydWN0dXJlZERvY3VtZW50Ci0JCQkvLyBjaGFuZ2VzCi0JCQkvLyBvbnRvIHRoZSB1bmRvIGNvbW1hbmQgc3RhY2ssIG9yIGVsc2UgdGhlIHVzZXIgbWF5IGJlIGFibGUgdG8KLQkJCS8vIHVuZG8KLQkJCS8vIGFuIGV4aXN0aW5nIGZpbGUgdG8gYW4gZW1wdHkgZmlsZS4KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIFNpbmNlICJubyBjaGFuZ2UiLCBkbyBub3RoaW5nLgotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzU3RydWN0dXJlZERvY3VtZW50RXZlbnQoU3RyaW5nIHRleHREZWxldGVkLCBTdHJpbmcgdGV4dEluc2VydGVkLCBpbnQgdGV4dFN0YXJ0LCBpbnQgdGV4dEVuZCkgewotCQkJaWYgKGZUZXh0Q29tbWFuZCAhPSBudWxsICYmIHRleHRTdGFydCA9PSBmVGV4dENvbW1hbmQuZ2V0VGV4dEVuZCgpKSB7Ci0JCQkJLy8gYXBwZW5kIHRvIHRoZSB0ZXh0IGNvbW1hbmQKLQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dERlbGV0ZWQoZlRleHRDb21tYW5kLmdldFRleHREZWxldGVkKCkuY29uY2F0KHRleHREZWxldGVkKSk7Ci0JCQkJZlRleHRDb21tYW5kLnNldFRleHRJbnNlcnRlZChmVGV4dENvbW1hbmQuZ2V0VGV4dEluc2VydGVkKCkuY29uY2F0KHRleHRJbnNlcnRlZCkpOwotCQkJCWZUZXh0Q29tbWFuZC5zZXRUZXh0RW5kKHRleHRFbmQpOwotCQkJfQotCQkJZWxzZSBpZiAoZlRleHRDb21tYW5kICE9IG51bGwgJiYgdGV4dFN0YXJ0ID09IGZUZXh0Q29tbWFuZC5nZXRUZXh0U3RhcnQoKSAtIDEgJiYgdGV4dEVuZCA8PSBmVGV4dENvbW1hbmQuZ2V0VGV4dEVuZCgpIC0gMSAmJiB0ZXh0RGVsZXRlZC5sZW5ndGgoKSA9PSAxICYmIHRleHRJbnNlcnRlZC5sZW5ndGgoKSA9PSAwICYmIGZUZXh0Q29tbWFuZC5nZXRUZXh0RGVsZXRlZCgpLmxlbmd0aCgpID4gMCkgewotCQkJCS8vIGJhY2tzcGFjZSBwcmVzc2VkCi0JCQkJLy8gZXJhc2UgYSBjaGFyYWN0ZXIgaW4gdGhlIGZpbGUKLQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dERlbGV0ZWQodGV4dERlbGV0ZWQuY29uY2F0KGZUZXh0Q29tbWFuZC5nZXRUZXh0RGVsZXRlZCgpKSk7Ci0JCQkJZlRleHRDb21tYW5kLnNldFRleHRTdGFydCh0ZXh0U3RhcnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY3JlYXRlTmV3VGV4dENvbW1hbmQodGV4dERlbGV0ZWQsIHRleHRJbnNlcnRlZCwgdGV4dFN0YXJ0LCB0ZXh0RW5kKTsKLQkJCX0KLQotCQkJLy8gc2F2ZSBjdXJzb3IgcG9zaXRpb24KLQkJCWZDdXJzb3JQb3NpdGlvbiA9IHRleHRFbmQ7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBOb3RlOiBmTGlzdGVuaW5nIHRlbGxzIHVzIGlmIHdlIHNob3VsZCBsaXN0ZW4gdG8gdGhlCi0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4KLQkJCS8vIGZMaXN0ZW5pbmcgaXMgc2V0IHRvIGZhbHNlIHJpZ2h0IGJlZm9yZSB0aGUgdW5kby9yZWRvIHByb2Nlc3MKLQkJCS8vIGFuZAotCQkJLy8gdGhlbiBzZXQgdG8gdHJ1ZSBhZ2FpbgotCQkJLy8gcmlnaHQgYWZ0ZXIgdGhlIHVuZG8vcmVkbyBwcm9jZXNzIHRvIGJsb2NrIG91dCBhbmQgaWdub3JlIGFsbAotCQkJLy8gU3RydWN0dXJlZERvY3VtZW50RXZlbnRzIGdlbmVyYXRlZAotCQkJLy8gYnkgdGhlIHVuZG8vcmVkbyBwcm9jZXNzLgotCi0JCQkvLyBQcm9jZXNzIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGlmIGZMaXN0ZW5pbmcgaXMgdHJ1ZS4KLQkJCS8vCi0JCQkvLyBXZSBhcmUgZXhlY3V0aW5nIGEgY29tbWFuZCBmcm9tIHRoZSBjb21tYW5kIHN0YWNrIGlmIHRoZQotCQkJLy8gcmVxdWVzdGVyCi0JCQkvLyBpcyBhIGNvbW1hbmQgKGZvciBleGFtcGxlLCB1bmRvL3JlZG8pLgotCQkJLy8gV2Ugc2hvdWxkIG5vdCBwcm9jZXNzIHRoZSBmbGF0IG1vZGVsIGV2ZW50IHdoZW4gd2UgYXJlCi0JCQkvLyBleGVjdXRpbmcgYQotCQkJLy8gY29tbWFuZCBmcm9tIHRoZSBjb21tYW5kIHN0YWNrLgotCQkJaWYgKGZVbmRvTWFuYWdlbWVudEVuYWJsZWQgJiYgIShzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpIGluc3RhbmNlb2YgQ29tbWFuZCkpIHsKLQkJCQkvLyBjaGVjayByZXF1ZXN0ZXIgaWYgbm90IHJlY29yZGluZwotCQkJCWlmICghZlJlY29yZGluZykKLQkJCQkJY2hlY2tSZXF1ZXN0ZXIoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSk7Ci0KLQkJCQkvLyBwcm9jZXNzIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCQkJCVN0cmluZyB0ZXh0RGVsZXRlZCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldERlbGV0ZWRUZXh0KCk7Ci0JCQkJU3RyaW5nIHRleHRJbnNlcnRlZCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFRleHQoKTsKLQkJCQlpbnQgdGV4dFN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IHRleHRFbmQgPSB0ZXh0U3RhcnQgKyB0ZXh0SW5zZXJ0ZWQubGVuZ3RoKCk7Ci0JCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHRleHREZWxldGVkLCB0ZXh0SW5zZXJ0ZWQsIHRleHRTdGFydCwgdGV4dEVuZCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ0hBTkdFX1RFWFQgPSBTU0VDb3JlTWVzc2FnZXMuVGV4dF9DaGFuZ2VfVUlfOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2sgZkNvbW1hbmRTdGFjayA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNvbXBvdW5kQ29tbWFuZERlc2NyaXB0aW9uID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmQ29tcG91bmRDb21tYW5kTGFiZWwgPSBudWxsOwotCWludCBmQ3Vyc29yUG9zaXRpb24gPSAwOwotCS8vIHByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmU3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyIGZJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyOwotCS8vIHByaXZhdGUgTWFwIGZUZXh0Vmlld2VyVG9MaXN0ZW5lck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvcltdIGZNZWRpYXRvcnMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmUmVjb3JkaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgZlJlY29yZGluZ0NvdW50ID0gMDsKLQlwcml2YXRlIE9iamVjdCBmUmVxdWVzdGVyOwotCVN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwgZlRleHRDb21tYW5kID0gbnVsbDsKLQlwcml2YXRlIGludCBmVW5kb0N1cnNvclBvc2l0aW9uID0gLTE7Ci0JYm9vbGVhbiBmVW5kb01hbmFnZW1lbnRFbmFibGVkID0gdHJ1ZTsKLQlwcml2YXRlIGludCBmVW5kb1NlbGVjdGlvbkxlbmd0aCA9IDA7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcigpIHsKLQkJdGhpcyhuZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIoQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlzZXRDb21tYW5kU3RhY2soY29tbWFuZFN0YWNrKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvcihJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcikgewotCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmTWVkaWF0b3JzLCBtZWRpYXRvcikpIHsKLQkJCWludCBvbGRTaXplID0gMDsKLQotCQkJaWYgKGZNZWRpYXRvcnMgIT0gbnVsbCkgewotCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvciBmaXJzdAotCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCW9sZFNpemUgPSBmTWVkaWF0b3JzLmxlbmd0aDsKLQkJCX0KLQotCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCUlEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yW10gbmV3TWVkaWF0b3JzID0gbmV3IElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yW25ld1NpemVdOwotCQkJaWYgKGZNZWRpYXRvcnMgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoZk1lZGlhdG9ycywgMCwgbmV3TWVkaWF0b3JzLCAwLCBvbGRTaXplKTsKLQkJCX0KLQotCQkJLy8gYWRkIHRoZSBuZXcgdW5kbyBtZWRpYXRvciB0byBsYXN0IHBvc2l0aW9uCi0JCQluZXdNZWRpYXRvcnNbbmV3U2l6ZSAtIDFdID0gbWVkaWF0b3I7Ci0KLQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCWZNZWRpYXRvcnMgPSBuZXdNZWRpYXRvcnM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKG1lZGlhdG9yKTsKLQkJCWFkZERvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IobWVkaWF0b3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIG51bGwsIG51bGwpOwotCi0JCWZVbmRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQkJZlVuZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIG51bGwpOwotCi0JCWZVbmRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQkJZlVuZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJLy8gc2F2ZSB0aGUgcmVxdWVzdGVyCi0JCWZSZXF1ZXN0ZXIgPSByZXF1ZXN0ZXI7Ci0KLQkJLy8gdXBkYXRlIGxhYmVsIGFuZCBkZXNjIG9ubHkgb24gdGhlIGZpcnN0IGxldmVsIHdoZW4gcmVjb3JkaW5nIGlzCi0JCS8vIG5lc3RlZAotCQlpZiAoZlJlY29yZGluZ0NvdW50ID09IDApIHsKLQkJCWZDb21wb3VuZENvbW1hbmRMYWJlbCA9IGxhYmVsOwotCQkJaWYgKGZDb21wb3VuZENvbW1hbmRMYWJlbCA9PSBudWxsKQotCQkJCWZDb21wb3VuZENvbW1hbmRMYWJlbCA9IFRFWFRfQ0hBTkdFX1RFWFQ7Ci0KLQkJCWZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQkJaWYgKGZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJCWZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9IFRFWFRfQ0hBTkdFX1RFWFQ7Ci0KLQkJCS8vIGNsZWFyIGNvbW1hbmRzCi0JCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCQkJZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JCX0KLQotCQkvLyB1cGRhdGUgY291bnRlciBhbmQgZmxhZwotCQlmUmVjb3JkaW5nQ291bnQrKzsKLQkJZlJlY29yZGluZyA9IHRydWU7Ci0KLQkJLy8gbm8gdW5kbyBjdXJzb3IgcG9zaXRpb24gYW5kIHVuZG8gc2VsZWN0aW9uIGxlbmd0aCBzcGVjaWZpZWQKLQkJLy8gcmVzZXQgdW5kbyBjdXJzb3IgcG9zaXRpb24gYW5kIHVuZG8gc2VsZWN0aW9uIGxlbmd0aAotCQlmVW5kb0N1cnNvclBvc2l0aW9uID0gLTE7Ci0JCWZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQotCQlmVW5kb0N1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0JCWZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uTGVuZ3RoOwotCX0KLQotCXZvaWQgY2hlY2tSZXF1ZXN0ZXIoT2JqZWN0IHJlcXVlc3RlcikgewotCQlpZiAoZlJlcXVlc3RlciAhPSBudWxsICYmICFmUmVxdWVzdGVyLmVxdWFscyhyZXF1ZXN0ZXIpKSB7Ci0JCQkvLyBGb3JjZSByZXN0YXJ0IG9mIHJlY29yZGluZyBzbyB0aGUgbGFzdCBjb21wb3VuZCBjb21tYW5kIGlzCi0JCQkvLyBjbG9zZWQuCi0JCQkvLwotCQkJLy8gSG93ZXZlciwgd2Ugc2hvdWxkIG5vdCBmb3JjZSByZXN0YXJ0IG9mIHJlY29yZGluZyB3aGVuIHRoZQotCQkJLy8gcmVxdWVzdCBjYW1lIGZyb20gU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlciBvcgotCQkJLy8gWE1MTW9kZWxJbXBsCi0JCQkvLyBiZWNhdXNlIGN1dC9wYXN0ZSByZXF1ZXN0cyBhbmQgY2hhcmFjdGVyIGluc2VydHMgdG8gdGhlCi0JCQkvLyB0ZXh0Vmlld2VyIGFyZSBmcm9tIFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIsCi0JCQkvLyBhbmQgcmVxdWVzdHMgdG8gZGVsZXRlIGEgbm9kZSBpbiB0aGUgWE1MVGFibGVUcmVlVmlld2VyIGFyZQotCQkJLy8gZnJvbSBYTUxNb2RlbEltcGwgKHdoaWNoIGltcGxlbWVudHMgSVN0cnVjdHVyZWRNb2RlbCkuCi0KLQkJCWlmICghKHJlcXVlc3RlciBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwgfHwgcmVxdWVzdGVyIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpIHsKLQkJCQlyZXNldEludGVybmFsQ29tbWFuZHMoKTsKLQkJCX0KLQkJfQotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobWVkaWF0b3IpOwotCQlpZiAoZkRvY3VtZW50ID09IG51bGwpIHsKLQkJCS8vIGFkZCB0aGlzIHVuZG8gbWFuYWdlciBhcyBzdHJ1Y3R1cmVkIGRvY3VtZW50IGxpc3RlbmVyCi0JCQlmRG9jdW1lbnQgPSBtZWRpYXRvci5nZXREb2N1bWVudCgpOwotCQkJLy8gZnV0dXJlX1RPRE86IGV2ZW50dWFsbHkgd2Ugd2FudCB0byByZWZhY3RvciBvciBhbGxvdyBlaXRoZXIKLQkJCS8vIHR5cGUgb2YgZG9jdW1lbnQsIGJ1dCBmb3Igbm93LCB3ZSdsbCBkbyBpbnN0YW5jZW9mIGNoZWNrLCBhbmQKLQkJCS8vIGZhaWwKLQkJCS8vIGlmIG5vdCByaWdodCB0eXBlCi0JCQlpZiAoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50KS5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihnZXRJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25seSBtZWRpdGF0b3Igd2l0aCBzdHJ1Y3R1cmVkIGRvY3VtZW50cyBjdXJyZW50bHkgaGFuZGxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBpZiB3ZSd2ZSBhbHJlYWR5IGhhZCBvdXIgZG9jdW1lbnQgc2V0LCB3ZSdsbCBqdXN0IGRvIHRoaXMgZmFpbAotCQkJLy8gZmFzdCBpbnRlZ3JpdHkgY2hlY2sKLQkJCWlmICghZkRvY3VtZW50LmVxdWFscyhtZWRpYXRvci5nZXREb2N1bWVudCgpKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb25uZWN0aW9uIHRvIHVuZG8gbWFuYWdlciBmYWlsZWQuIERvY3VtZW50IGZvciBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IgaW5jb25pc3RlbnQgd2l0aCB1bmRvIG1hbmFnZXIuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWFkZERvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IobWVkaWF0b3IpOwotCX0KLQotCXZvaWQgY3JlYXRlTmV3VGV4dENvbW1hbmQoU3RyaW5nIHRleHREZWxldGVkLCBTdHJpbmcgdGV4dEluc2VydGVkLCBpbnQgdGV4dFN0YXJ0LCBpbnQgdGV4dEVuZCkgewotCQlTdHJ1Y3R1cmVkVGV4dENvbW1hbmRJbXBsIHRleHRDb21tYW5kID0gbmV3IFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoZkRvY3VtZW50KTsKLQkJdGV4dENvbW1hbmQuc2V0TGFiZWwoVEVYVF9DSEFOR0VfVEVYVCk7Ci0JCXRleHRDb21tYW5kLnNldERlc2NyaXB0aW9uKFRFWFRfQ0hBTkdFX1RFWFQpOwotCQl0ZXh0Q29tbWFuZC5zZXRUZXh0U3RhcnQodGV4dFN0YXJ0KTsKLQkJdGV4dENvbW1hbmQuc2V0VGV4dEVuZCh0ZXh0RW5kKTsKLQkJdGV4dENvbW1hbmQuc2V0VGV4dERlbGV0ZWQodGV4dERlbGV0ZWQpOwotCQl0ZXh0Q29tbWFuZC5zZXRUZXh0SW5zZXJ0ZWQodGV4dEluc2VydGVkKTsKLQotCQlpZiAoZlJlY29yZGluZykgewotCQkJaWYgKGZDb21wb3VuZENvbW1hbmQgPT0gbnVsbCkgewotCQkJCVN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb21wb3VuZENvbW1hbmQgPSBuZXcgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKCk7Ci0JCQkJY29tcG91bmRDb21tYW5kLnNldFVuZG9DdXJzb3JQb3NpdGlvbihmVW5kb0N1cnNvclBvc2l0aW9uKTsKLQkJCQljb21wb3VuZENvbW1hbmQuc2V0VW5kb1NlbGVjdGlvbkxlbmd0aChmVW5kb1NlbGVjdGlvbkxlbmd0aCk7Ci0KLQkJCQljb21wb3VuZENvbW1hbmQuc2V0TGFiZWwoZkNvbXBvdW5kQ29tbWFuZExhYmVsKTsKLQkJCQljb21wb3VuZENvbW1hbmQuc2V0RGVzY3JpcHRpb24oZkNvbXBvdW5kQ29tbWFuZERlc2NyaXB0aW9uKTsKLQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKHRleHRDb21tYW5kKTsKLQotCQkJCWZDb21wb3VuZENvbW1hbmQgPSBjb21wb3VuZENvbW1hbmQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQ29tcG91bmRDb21tYW5kLmFwcGVuZCh0ZXh0Q29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmQ29tbWFuZFN0YWNrLmV4ZWN1dGUodGV4dENvbW1hbmQpOwotCQl9Ci0KLQkJZlRleHRDb21tYW5kID0gdGV4dENvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogRGlzYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCkgewotCQlmVW5kb01hbmFnZW1lbnRFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcikgewotCQlyZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKG1lZGlhdG9yKTsKLQotCQlpZiAoZk1lZGlhdG9ycyAhPSBudWxsICYmIGZNZWRpYXRvcnMubGVuZ3RoID09IDAgJiYgZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSB0aGlzIHVuZG8gbWFuYWdlciBhcyBzdHJ1Y3R1cmVkIGRvY3VtZW50IGxpc3RlbmVyCi0JCQkvLyBmdXR1cmVfVE9ETzogZXZlbnR1YWxseSB3ZSB3YW50IHRvIHJlZmFjdG9yIG9yIGFsbG93IGVpdGhlcgotCQkJLy8gdHlwZSBvZiBkb2N1bWVudCwgYnV0IGZvciBub3csIHdlJ2xsIGRvIGluc3RhbmNlb2YgY2hlY2ssIGFuZAotCQkJLy8gZmFpbAotCQkJLy8gaWYgbm90IHJpZ2h0IHR5cGUKLQkJCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGdldEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvbmx5IG1lZGl0YXRvciB3aXRoIHN0cnVjdHVyZWQgZG9jdW1lbnRzIGN1cnJlbnRseSBoYW5kbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIGlmIG5vIGxvbmdlciBsaXN0ZW5pbmcgdG8gZG9jdW1lbnQsIHRoZW4gZG9udCBldmVuIHRyYWNrIGl0Ci0JCQkvLyBhbnltb3JlCi0JCQkvLyAodGhpcyBhbGxvd3MgY29ubmVjdCB0byByZWNvbm5lY3QgdG8gZG9jdW1lbnQgYWdhaW4pCi0JCQlmRG9jdW1lbnQgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZW5hYmxlVW5kb01hbmFnZW1lbnQoKSB7Ci0JCWZVbmRvTWFuYWdlbWVudEVuYWJsZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IChmVGV4dENvbW1hbmQgIT0gbnVsbCkgPyBmVGV4dENvbW1hbmQuZ2V0VGV4dEVuZCgpIDogLTE7Ci0JCWludCBzZWxlY3Rpb25MZW5ndGggPSAwOwotCi0JCWVuZFJlY29yZGluZyhyZXF1ZXN0ZXIsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJLy8gUmVjb3JkaW5nIGNvdWxkIGJlIHN0b3BwZWQgYnkgZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKCkuIE1ha2Ugc3VyZQotCQkvLyB3ZSBhcmUgc3RpbGwgcmVjb3JkaW5nIGJlZm9yZSBwcm9jZWVkaW5nLCBvciBlbHNlIGZSZWNvcmRpbmdDb3VudAotCQkvLyBtYXkgbm90IGJlIGJhbGFuY2VkLgotCQlpZiAoZlJlY29yZGluZykgewotCQkJaWYgKGZDb21wb3VuZENvbW1hbmQgIT0gbnVsbCkgewotCQkJCWZDb21wb3VuZENvbW1hbmQuc2V0UmVkb0N1cnNvclBvc2l0aW9uKGN1cnNvclBvc2l0aW9uKTsKLQkJCQlmQ29tcG91bmRDb21tYW5kLnNldFJlZG9TZWxlY3Rpb25MZW5ndGgoc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCX0KLQotCQkJLy8gZW5kIHJlY29yZGluZyBpcyBhIGxvZ2ljYWwgc3RvcHBpbmcgcG9pbnQgZm9yIHRleHQgY29tbWFuZCwKLQkJCS8vIGV2ZW4gd2hlbiBmUmVjb3JkaW5nQ291bnQgPiAwIChpbiBuZXN0ZWQgYmVnaW5SZWNvcmRpbmcpCi0JCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCi0JCQkvLyB1cGRhdGUgY291bnRlciBhbmQgZmxhZwotCQkJaWYgKGZSZWNvcmRpbmdDb3VudCA+IDApCi0JCQkJZlJlY29yZGluZ0NvdW50LS07Ci0JCQlpZiAoZlJlY29yZGluZ0NvdW50ID09IDApIHsKLQkJCQkKLQkJCQkvLyBGaW5hbGx5IGV4ZWN1dGUgdGhlIGNvbW1hbmRzIGFjY3VtdWxhdGVkIGluIHRoZSBjb21wb3VuZCBjb21tYW5kLgotCQkJCQotCQkJCWlmIChmQ29tcG91bmRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJZkNvbW1hbmRTdGFjay5leGVjdXRlKGZDb21wb3VuZENvbW1hbmQpOwotCQkJCX0KLQkJCQkKLQkJCQlmUmVjb3JkaW5nID0gZmFsc2U7Ci0KLQkJCQkvLyByZXNldCBjb21wb3VuZCBjb21tYW5kIG9ubHkgd2hlbiBmUmVjb3JkaW5nQ291bnQgPT0KLQkJCQkvLyAwCi0JCQkJZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JCQkJZkNvbXBvdW5kQ29tbWFuZExhYmVsID0gbnVsbDsKLQkJCQlmQ29tcG91bmRDb21tYW5kRGVzY3JpcHRpb24gPSBudWxsOwotCi0JCQkJLy8gQWxzbyByZXNldCBmUmVxdWVzdGVyCi0JCQkJZlJlcXVlc3RlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBmaW5kIG1vZGVsIGdpdmVuIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZpbmRTdHJ1Y3R1cmVkTW9kZWwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIjZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JjZUVuZE9mUGVuZGluZ0NvbW1hbmQoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnJlbnRQb3NpdGlvbiwgaW50IGxlbmd0aCkgewotCQlpZiAoZlJlY29yZGluZykKLQkJCWVuZFJlY29yZGluZyhyZXF1ZXN0ZXIsIGN1cnJlbnRQb3NpdGlvbiwgbGVuZ3RoKTsKLQkJZWxzZQotCQkJcmVzZXRJbnRlcm5hbENvbW1hbmRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciNnZXRDb21tYW5kU3RhY2soKQotCSAqLwotCXB1YmxpYyBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZkNvbW1hbmRTdGFjazsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2tMaXN0ZW5lciBnZXRJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQlpZiAoZkludGVybmFsQ29tbWFuZFN0YWNrTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkludGVybmFsQ29tbWFuZFN0YWNrTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBmSW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgZ2V0SW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJaWYgKGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyID09IG51bGwpIHsKLQkJCWZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyID0gbmV3IEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgZ2V0UmVkb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBmQ29tbWFuZFN0YWNrLmdldFJlZG9Db21tYW5kKCk7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgZ2V0VW5kb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBmQ29tbWFuZFN0YWNrLmdldFVuZG9Db21tYW5kKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJcmVkbyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlcikgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gZmluZFN0cnVjdHVyZWRNb2RlbChmRG9jdW1lbnQpOwotCi0JCWlmIChyZWRvYWJsZSgpKSB7Ci0JCQlJRG9jdW1lbnRFeHRlbnNpb240IGRvY0V4dDQgPSBudWxsOwotCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiByZXdyaXRlU2Vzc2lvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCUNvbW1hbmQgcmVkb0NvbW1hbmQgPSBnZXRSZWRvQ29tbWFuZCgpOwotCQkJCWlmIChyZWRvQ29tbWFuZCBpbnN0YW5jZW9mIENvbXBvdW5kQ29tbWFuZCAmJgotCQkJCQkJbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJCWRvY0V4dDQgPSAoSURvY3VtZW50RXh0ZW5zaW9uNCltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJcmV3cml0ZVNlc3Npb24gPSAoZG9jRXh0NCA9PSBudWxsKSA/IG51bGwgOgotCQkJCQlkb2NFeHQ0LnN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEKTsKLQotCQkJCS8vIG1ha2Ugc3VyZSB0byByZWRvIGJlZm9yZSBzZXR0aW5nIGRvY3VtZW50IHNlbGVjdGlvbgotCQkJCWZDb21tYW5kU3RhY2sucmVkbygpOwotCi0JCQkJLy8gc2V0IGRvY3VtZW50IHNlbGVjdGlvbgotCQkJCXNldFJlZG9Eb2N1bWVudFNlbGVjdGlvbihyZXF1ZXN0ZXIsIHJlZG9Db21tYW5kKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChkb2NFeHQ0ICE9IG51bGwgJiYgcmV3cml0ZVNlc3Npb24gIT0gbnVsbCkKLQkJCQkJZG9jRXh0NC5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWRvYWJsZSgpIHsKLQkJcmV0dXJuIGZDb21tYW5kU3RhY2suY2FuUmVkbygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKSB7Ci0JCWlmIChmTWVkaWF0b3JzICE9IG51bGwgJiYgbWVkaWF0b3IgIT0gbnVsbCkgewotCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgYXJyYXksIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmTWVkaWF0b3JzLCBtZWRpYXRvcikpIHsKLQkJCQlpbnQgb2xkU2l6ZSA9IGZNZWRpYXRvcnMubGVuZ3RoOwotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3JbXSBuZXdNZWRpYXRvcnMgPSBuZXcgSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3JbbmV3U2l6ZV07Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQlpZiAoZk1lZGlhdG9yc1tpXSA9PSBtZWRpYXRvcikgeyAvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlIHJlbW92aW5nCi0JCQkJCQluZXdNZWRpYXRvcnNbaW5kZXgrK10gPSBmTWVkaWF0b3JzW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlIG9sZAotCQkJCS8vIG9uZQotCQkJCWZNZWRpYXRvcnMgPSBuZXdNZWRpYXRvcnM7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlc2V0SW50ZXJuYWxDb21tYW5kcygpIHsKLQkJLy8gRWl0aGVyIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgY2hhbmdlIGV2ZW50IGlzCi0JCS8vIGNoYW5nZWQsIG9yIHRoZSBjb21tYW5kIHN0YWNrIGlzIGNoYW5nZWQuIE5lZWQgdG8gcmVzZXQgaW50ZXJuYWwKLQkJLy8gY29tbWFuZHMgc28gd2Ugd29uJ3QgY29udGludWUgdG8gYXBwZW5kIGNoYW5nZXMuCi0JCWZDb21wb3VuZENvbW1hbmQgPSBudWxsOwotCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCi0JCS8vIEFsc28gcmVzZXQgZlJlcXVlc3RlcgotCQlmUmVxdWVzdGVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21tYW5kU3RhY2soQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlpZiAoZkNvbW1hbmRTdGFjayAhPSBudWxsKQotCQkJZkNvbW1hbmRTdGFjay5yZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcihnZXRJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyKCkpOwotCi0JCWZDb21tYW5kU3RhY2sgPSBjb21tYW5kU3RhY2s7Ci0KLQkJaWYgKGZDb21tYW5kU3RhY2sgIT0gbnVsbCkKLQkJCWZDb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoZ2V0SW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVkb0RvY3VtZW50U2VsZWN0aW9uKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlciwgQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IC0xOwotCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRDdXJzb3JQb3NpdGlvbikgewotCQkJQ29tbWFuZEN1cnNvclBvc2l0aW9uIGNvbW1hbmRDdXJzb3JQb3NpdGlvbiA9IChDb21tYW5kQ3Vyc29yUG9zaXRpb24pIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRSZWRvQ3Vyc29yUG9zaXRpb24oKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRSZWRvU2VsZWN0aW9uTGVuZ3RoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Q29tbWFuZCkgewotCQkJU3RydWN0dXJlZFRleHRDb21tYW5kIHN0cnVjdHVyZWRUZXh0Q29tbWFuZCA9IChTdHJ1Y3R1cmVkVGV4dENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0U3RhcnQoKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0SW5zZXJ0ZWQoKS5sZW5ndGgoKTsKLQkJfQotCi0JCWlmIChjdXJzb3JQb3NpdGlvbiA+IC0xICYmIGZNZWRpYXRvcnMgIT0gbnVsbCAmJiBmTWVkaWF0b3JzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZk1lZGlhdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGZNZWRpYXRvcnNbaV0uZ2V0RG9jdW1lbnQoKTsKLQkJCQlmTWVkaWF0b3JzW2ldLnVuZG9PcGVyYXRpb25TZWxlY3Rpb25DaGFuZ2VkKG5ldyBVbmRvRG9jdW1lbnRFdmVudChyZXF1ZXN0ZXIsIGRvY3VtZW50LCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VW5kb0RvY3VtZW50U2VsZWN0aW9uKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlciwgQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IC0xOwotCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRDdXJzb3JQb3NpdGlvbikgewotCQkJQ29tbWFuZEN1cnNvclBvc2l0aW9uIGNvbW1hbmRDdXJzb3JQb3NpdGlvbiA9IChDb21tYW5kQ3Vyc29yUG9zaXRpb24pIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRVbmRvQ3Vyc29yUG9zaXRpb24oKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Q29tbWFuZCkgewotCQkJU3RydWN0dXJlZFRleHRDb21tYW5kIHN0cnVjdHVyZWRUZXh0Q29tbWFuZCA9IChTdHJ1Y3R1cmVkVGV4dENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0U3RhcnQoKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0RGVsZXRlZCgpLmxlbmd0aCgpOwotCQl9Ci0KLQkJaWYgKGN1cnNvclBvc2l0aW9uID4gLTEgJiYgZk1lZGlhdG9ycyAhPSBudWxsICYmIGZNZWRpYXRvcnMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTWVkaWF0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZk1lZGlhdG9yc1tpXS5nZXREb2N1bWVudCgpOwotCQkJCWZNZWRpYXRvcnNbaV0udW5kb09wZXJhdGlvblNlbGVjdGlvbkNoYW5nZWQobmV3IFVuZG9Eb2N1bWVudEV2ZW50KHJlcXVlc3RlciwgZG9jdW1lbnQsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXVuZG8obnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbyhJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIpIHsKLQkJLy8gRm9yY2UgYW4gZW5kUmVjb3JkaW5nIGJlZm9yZSB1bmRvLgotCQkvLwotCQkvLyBGb3IgZXhhbXBsZSwgcmVjb3JkaW5nIHdhcyB0dXJuZWQgb24gb24gdGhlIERlc2lnbiBQYWdlIG9mCi0JCS8vIFBhZ2VEZXNpZ25lci4KLQkJLy8gVGhlbiB1bmRvIGlzIGludm9rZWQgb24gdGhlIFNvdXJjZSBQYWdlLiBSZWNvcmRpbmcgc2hvdWxkIGJlCi0JCS8vIHN0b3BwZWQgYmVmb3JlIHdlIHVuZG8uCi0JCS8vIE5vdGUgdGhhdCByZWRvIHNob3VsZCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gd2Ugc3dpdGNoIHRvIHRoZSBTb3VyY2UKLQkJLy8gUGFnZS4KLQkJLy8gVGhlcmVmb3JlLCB0aGlzIGZvcmNlIGVuZGluZyBvZiByZWNvcmRpbmcgaXMgbm90IG5lZWRlZCBpbiByZWRvLgotCQlpZiAoZlJlY29yZGluZykKLQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQotCQlpZiAodW5kb2FibGUoKSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IGZpbmRTdHJ1Y3R1cmVkTW9kZWwoZkRvY3VtZW50KTsKLQkJCUlEb2N1bWVudEV4dGVuc2lvbjQgZG9jRXh0NCA9IG51bGw7Ci0JCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHJld3JpdGVTZXNzaW9uID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQlDb21tYW5kIHVuZG9Db21tYW5kID0gZ2V0VW5kb0NvbW1hbmQoKTsKLQkJCQlpZiAodW5kb0NvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3VuZENvbW1hbmQgJiYKLQkJCQkJCW1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uNCkgewotCQkJCQlkb2NFeHQ0ID0gKElEb2N1bWVudEV4dGVuc2lvbjQpbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJfQotCQkJCXJld3JpdGVTZXNzaW9uID0gKGRvY0V4dDQgPT0gbnVsbCkgPyBudWxsIDoKLQkJCQkJZG9jRXh0NC5zdGFydFJld3JpdGVTZXNzaW9uKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCk7Ci0JCQkJCi0JCQkJLy8gbWFrZSBzdXJlIHRvIHVuZG8gYmVmb3JlIHNldHRpbmcgZG9jdW1lbnQgc2VsZWN0aW9uCi0JCQkJZkNvbW1hbmRTdGFjay51bmRvKCk7Ci0KLQkJCQkvLyBzZXQgZG9jdW1lbnQgc2VsZWN0aW9uCi0JCQkJc2V0VW5kb0RvY3VtZW50U2VsZWN0aW9uKHJlcXVlc3RlciwgdW5kb0NvbW1hbmQpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKGRvY0V4dDQgIT0gbnVsbCAmJiByZXdyaXRlU2Vzc2lvbiAhPSBudWxsKQotCQkJCQlkb2NFeHQ0LnN0b3BSZXdyaXRlU2Vzc2lvbihyZXdyaXRlU2Vzc2lvbik7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHVuZG9hYmxlKCkgewotCQlyZXR1cm4gZkNvbW1hbmRTdGFjay5jYW5VbmRvKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1VuZG9Eb2N1bWVudEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vVW5kb0RvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlZTQ2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vVW5kb0RvY3VtZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgVW5kb0RvY3VtZW50RXZlbnQgewotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBmUmVxdWVzdGVyOwotCi0JcHVibGljIFVuZG9Eb2N1bWVudEV2ZW50KElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlciwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWZSZXF1ZXN0ZXIgPSByZXF1ZXN0ZXI7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gZk9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgZ2V0UmVxdWVzdGVyKCkgewotCQlyZXR1cm4gZlJlcXVlc3RlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvQWJzdHJhY3RNZW1vcnlMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0Fic3RyYWN0TWVtb3J5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjNjBhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvQWJzdHJhY3RNZW1vcnlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKiAgICAgDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47DQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7DQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0Ow0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZ2lzdHJhdGlvbjsNCi1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudDsNCi1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEFkbWluOw0KLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50Q29uc3RhbnRzOw0KLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50SGFuZGxlcjsNCi0NCi0vKioNCi0gKiBUaGlzIHJlc3BvbmRzIHRvIG1lbW9yeSBldmVudHMuDQotICogDQotICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgY2hpbGQgb2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBldmVudHMgeW91IGFyZSBpbnRlcmVzdGVkIGluLg0KLSAqIFRoZW4gY2FsbCBjb25uZWN0KCkgdG8gc3RhcnQgbGlzdGVuaW5nLiBUbyBzdG9wIGxpc3RlbmluZyBjYWxsIGRpc2Nvbm5lY3QoKTsNCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZW1vcnlMaXN0ZW5lciBpbXBsZW1lbnRzIEV2ZW50SGFuZGxlciB7DQotCS8qKg0KLQkgKiBUaGUgZXZlbnQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBtZW1vcnkgaXMgcnVubmluZyBsb3cgYXQgdGhlIGxvd2VzdCBzZXZlcml0eS4NCi0JICogTGlzdGVuZXJzIGFyZSByZXF1ZXN0ZWQgdG8gcmVsZWFzZSBjYWNoZXMgdGhhdCBjYW4gZWFzaWx5IGJlIHJlY29tcHV0ZWQuDQotCSAqIFRoZSBKYXZhIFZNIGlzIG5vdCBzZXJpb3VzbHkgaW4gdHJvdWJsZSwgYnV0IHByb2Nlc3Mgc2l6ZSBpcyBnZXR0aW5nIGhpZ2hlciB0aGFuIA0KLQkgKiBpcyBkZWVtZWQgYWNjZXB0YWJsZS4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVl9OT1JNQUwgPSAib3JnL2VjbGlwc2UvZXF1aW5veC9ldmVudHMvTWVtb3J5RXZlbnQvTk9STUFMIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqDQotCSAqIFRoZSBldmVudCB0aGF0IGluZGljYXRlcyB0aGF0IG1lbW9yeSBpcyBydW5uaW5nIGxvdyBhdCBtZWRpdW0gc2V2ZXJpdHkuIA0KLQkgKiBMaXN0ZW5lcnMgYXJlIHJlcXVlc3RlZCB0byByZWxlYXNlIGludGVybWVkaWF0ZSBidWlsZCByZXN1bHRzLCBjb21wbGV4IG1vZGVscywgZXRjLg0KLQkgKiBNZW1vcnkgaXMgZ2V0dGluZyBsb3cgYW5kIG1heSBjYXVzZSBvcGVyYXRpbmcgc3lzdGVtIGxldmVsIHN0cmVzcywgc3VjaCBhcyBzd2FwcGluZy4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVl9TRVJJT1VTID0gIm9yZy9lY2xpcHNlL2VxdWlub3gvZXZlbnRzL01lbW9yeUV2ZW50L1NFUklPVVMiOyAvLyROT04tTkxTLTEkDQotCQ0KLQkvKioNCi0JICogVGhlIGV2ZW50IHRoYXQgaW5kaWNhdGVzIHRoYXQgbWVtb3J5IGlzIHJ1bm5pbmcgbG93IGF0IGhpZ2hlc3Qgc2V2ZXJpdHkuDQotCSAqIExpc3RlbmVycyBhcmUgcmVxdWVzdGVkIHRvIGRvIHRoaW5ncyBsaWtlIGNsb3NlIGVkaXRvcnMgYW5kIHBlcnNwZWN0aXZlcywgY2xvc2UgZGF0YWJhc2UgY29ubmVjdGlvbnMsIGV0Yy4NCi0JICogUmVzdG9yaW5nIHRoZXNlIHJlc291cmNlcyBhbmQgY2FjaGVzIGNvbnN0aXR1dGVzIGxvdHMgb2Ygd29yaywgYnV0IG1lbW9yeSBpcyBzbyBsb3cgdGhhdA0KLQkgKiBkcmFzdGljIG1lYXN1cmVzIGFyZSByZXF1aXJlZC4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVl9DUklUSUNBTCA9ICJvcmcvZWNsaXBzZS9lcXVpbm94L2V2ZW50cy9NZW1vcnlFdmVudC9DUklUSUNBTCI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCS8qKg0KLQkgKiBBbGwgb2YgdGhlIHZhbGlkIG1lbW9yeSBzZXZlcml0aWVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNFVl9BTEwgPSB7IFNFVl9OT1JNQUwsIFNFVl9TRVJJT1VTLCBTRVZfQ1JJVElDQUwgfTsNCi0NCi0JLyoqDQotCSAqIFVzZWQgdG8gcmVnaXN0ZXIgdGhlIHtAbGluayBFdmVudEFkbWlufSBsaXN0ZW5lcg0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBDT05URVhUID0NCi0JCShTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKSAhPSBudWxsKSA/DQotCQkJCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEJ1bmRsZUNvbnRleHQoKSA6IG51bGw7DQotDQotCS8qKg0KLQkgKiB0aGUgc2V2ZXJpdGllcyB0aGF0IHdpbGwgYmUgcmVhY3RlZCB0bw0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBMaXN0IGZTZXZlcml0aWVzOw0KLQkNCi0JLyoqDQotCSAqIHNlcnZpY2UgdXNlZCB0byByZWdpc3RlciB0aGlzIGxpc3RlbmVyDQotCSAqLw0KLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gZlJlZ2lzdGVyU2VydmljZTsNCi0NCi0JLyoqDQotCSAqIFdpbGwgbGlzdGVuIHRvIGFsbCBtZW1vcnkgZXZlbnRzDQotCSAqLw0KLQlwdWJsaWMgQWJzdHJhY3RNZW1vcnlMaXN0ZW5lcigpIHsNCi0JCXRoaXMoQWJzdHJhY3RNZW1vcnlMaXN0ZW5lci5TRVZfQUxMKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogV2lsbCBsaXN0ZW4gdG8gbWVtb3J5IGV2ZW50cyBvZiB0aGUgZ2l2ZW4gPGNvZGU+c2V2ZXJpdHk8L2NvZGU+DQotCSAqIA0KLQkgKiBAcGFyYW0gc2V2ZXJpdHkgbGlzdGVuIGZvciBtZW1vcnkgZXZlbnRzIG9mIHRoaXMgc2V2ZXJpdHkNCi0JICovDQotCXB1YmxpYyBBYnN0cmFjdE1lbW9yeUxpc3RlbmVyKFN0cmluZyBzZXZlcml0eSkgew0KLQkJQXNzZXJ0LmlzTm90TnVsbChzZXZlcml0eSwgIlNldmVyaXR5IGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCUxpc3Qgc2V2ZXJpdGllcyA9IG5ldyBBcnJheUxpc3QoMSk7DQotCQlzZXZlcml0aWVzLmFkZChzZXZlcml0eSk7DQotCQlmU2V2ZXJpdGllcyA9IHNldmVyaXRpZXM7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBXaWxsIGxpc3RlbiB0byBtZW1vcnkgZXZlbnRzIG9mIHRoZSBnaXZlbiA8Y29kZT5zZXZlcml0aWVzPC9jb2RlPg0KLQkgKiANCi0JICogQHBhcmFtIHNldmVyaXRpZXMgbGlzdGVuIGZvciBtZW1vcnkgZXZlbnRzIGZvciBhbnkgb2YgdGhlc2Ugc2V2ZXJpdGllcw0KLQkgKi8NCi0JcHVibGljIEFic3RyYWN0TWVtb3J5TGlzdGVuZXIoU3RyaW5nW10gc2V2ZXJpdGllcykgew0KLQkJQXNzZXJ0LmlzTm90TnVsbChzZXZlcml0aWVzLCAiU2V2ZXJpdGllcyBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJQXNzZXJ0LmlzTGVnYWwoc2V2ZXJpdGllcy5sZW5ndGggPiAwLCAiU2V2ZXJpdGllcyBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIHNldmVyaXR5Iik7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJZlNldmVyaXRpZXMgPSBBcnJheXMuYXNMaXN0KHNldmVyaXRpZXMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBXaWxsIGxpc3RlbiB0byBtZW1vcnkgZXZlbnRzIG9mIHRoZSBnaXZlbiA8Y29kZT5zZXZlcml0aWVzPC9jb2RlPg0KLQkgKiANCi0JICogQHBhcmFtIHNldmVyaXRpZXMgbGlzdGVuIGZvciBtZW1vcnkgZXZlbnRzIGZvciBhbnkgb2YgdGhlc2Ugc2V2ZXJpdGllcw0KLQkgKi8NCi0JcHVibGljIEFic3RyYWN0TWVtb3J5TGlzdGVuZXIoTGlzdCBzZXZlcml0aWVzKSB7DQotCQlBc3NlcnQuaXNOb3ROdWxsKHNldmVyaXRpZXMsICJTZXZlcml0aWVzIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQlBc3NlcnQuaXNMZWdhbCghc2V2ZXJpdGllcy5pc0VtcHR5KCksICJTZXZlcml0aWVzIG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgc2V2ZXJpdHkiKTsgLy8kTk9OLU5MUy0xJA0KLQkJZlNldmVyaXRpZXMgPSBzZXZlcml0aWVzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDb25uZWN0IHRoaXMgbGlzdGVuZXIgdG8gdGhlIHtAbGluayBFdmVudEFkbWlufQ0KLQkgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgY29ubmVjdCgpIHsNCi0JCWlmIChDT05URVhUICE9IG51bGwpIHsNCi0JCQkvLyBOT1RFOiBUaGlzIGlzIFRFTVBPUkFSWSBDT0RFIG5lZWRlZCB0byBsb2FkIHRoZSBwbHVnaW4NCi0JCQkvLyB1bnRpbCBpdHMgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBwcm9kdWN0DQotCQkJLy8gVE9ETzogUmVtb3ZlIG1lDQotCQkJQnVuZGxlIGIgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmVxdWlub3guZXZlbnQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWlmIChiICE9IG51bGwgJiYgYi5nZXRTdGF0ZSgpID09IEJ1bmRsZS5SRVNPTFZFRCkgew0KLQkJCQl0cnkgew0KLQkJCQkJYi5zdGFydChCdW5kbGUuU1RBUlRfVFJBTlNJRU5UKTsNCi0JCQkJfQ0KLQkJCQljYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsNCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJCX0NCi0JCQl9DQotCQkJLy8gZW5kIHJlbW92ZSBtZQ0KLQkJCQ0KLQkJCS8vcmVnaXN0ZXIgdGhpcyBoYW5kbGVyDQotCQkJU3RyaW5nW10gc2V2ZXJpdGllcyA9IChTdHJpbmdbXSlmU2V2ZXJpdGllcy50b0FycmF5KG5ldyBTdHJpbmdbZlNldmVyaXRpZXMuc2l6ZSgpXSk7DQotCQkJSGFzaHRhYmxlIHByb3AgPSBuZXcgSGFzaHRhYmxlKDEpOw0KLQkJCXByb3AucHV0KEV2ZW50Q29uc3RhbnRzLkVWRU5UX1RPUElDLCBzZXZlcml0aWVzKTsNCi0JCQlmUmVnaXN0ZXJTZXJ2aWNlID0gQ09OVEVYVC5yZWdpc3RlclNlcnZpY2UoRXZlbnRIYW5kbGVyLmNsYXNzLmdldE5hbWUoKSwgdGhpcywgcHJvcCk7DQotCQkJDQotCQkJLy9jYWxsIGFueSBpbXBsZW1lbnRlciBzcGVjaWZpYyBjb25uZWN0IGNvZGUNCi0JCQlkb0Nvbm5lY3QoKTsNCi0JCX0gZWxzZSB7DQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkVycm9yIGFjY2Vzc2luZyBidW5kbGUgY29udGV4dC4gSXMgUGxhdGZvcm0gcnVubmluZz8gTm90IHRyYWNraW5nIG1lbW9yeSBldmVudHMuICIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIERpc2Nvbm5lY3QgdGhpcyBsaXN0ZW5lciB0byB0aGUge0BsaW5rIEV2ZW50QWRtaW59DQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBkaXNjb25uZWN0KCkgew0KLQkJaWYgKGZSZWdpc3RlclNlcnZpY2UgIT0gbnVsbCkgew0KLQkJCWZSZWdpc3RlclNlcnZpY2UudW5yZWdpc3RlcigpOw0KLQkJCWZSZWdpc3RlclNlcnZpY2UgPSBudWxsOw0KLQkJfQ0KLQkJDQotCQkvL2NhbGwgYW55IGltcGxlbWVudGVyIHNwZWNpZmljIGRpc2Nvbm5lY3QgY29kZQ0KLQkJZG9EaXNjb25uZWN0KCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDxwPkZpbHRlciBvdXQgYW55IGV2ZW50cyB0aGF0IGFyZSBub3Qgb2YgdGhlIHR5cGUgdGhhdCB0aGlzIGxpc3RlbmVyIGhhbmRsZXM8L3A+DQotCSAqIA0KLQkgKiBAc2VlIG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnRIYW5kbGVyI2hhbmRsZUV2ZW50KG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQpDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgew0KLQkJaWYgKGZTZXZlcml0aWVzLmNvbnRhaW5zKGV2ZW50LmdldFRvcGljKCkpKSB7DQotCQkJaGFuZGxlTWVtb3J5RXZlbnQoZXZlbnQpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBJbXBsZW1lbnRpbmcgY2hpbGQgY2xhc3NlcyBtYXkgYXNzdW1lIHRoYXQgb25seSB7QGxpbmsgRXZlbnR9cyBvZiB0aGUgdHlwZXMNCi0JICogZ2l2ZW4gdG8gdGhlIGNvbnN0cnVjdG9yIHdpbGwgYmUgZ2l2ZW4gdG8gdGhpcyBtZXRob2QuDQotCSAqIA0KLQkgKiBAcGFyYW0gZXZlbnQgdGhlIHtAbGluayBFdmVudH0gd2l0aCBhIHRvcGljIGVxdWFsIHRvIG9uZSBvZiB0aGUgbWVtb3J5DQotCSAqIHNldmVyaXRpZXMgdGhhdCB0aGlzIGxpc3RlbmVyIGlzIGxpc3RlbmluZyBmb3INCi0JICovDQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZU1lbW9yeUV2ZW50KEV2ZW50IGV2ZW50KTsNCi0JDQotCS8qKg0KLQkgKiBJbXBsZW1lbnRlcnMgbWF5IG92ZXJydW4gdGhpcyBtZXRob2QgdG8gZG8gc2V0dXAgYWZ0ZXIgY29ubmVjdGlvbiBvZiB0aGlzIGxpc3RlbmVyDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBkb0Nvbm5lY3QoKSB7DQotCQkvL2RvIG5vdGhpbmcgYnkgZGVmYXVsdA0KLQl9DQotCQ0KLQkvKioNCi0JICogSW1wbGVtZW50ZXJzIG1heSBvdmVycnVuIHRoaXMgbWV0aG9kIHRvIGRvIHRlYXIgZG93biBhZnRlciBkaXNjb25uZWN0aW9uIG9mIHRoaXMgbGlzdGVuZXINCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGRvRGlzY29ubmVjdCgpIHsNCi0JCS8vZG8gbm90aGluZyBieSBkZWZhdWx0DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0Fzc2VydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0Fzc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2QxZWUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotLyoqCi0gKiA8Y29kZT5Bc3NlcnQ8L2NvZGU+IGlzIHVzZWZ1bCBmb3IgZm9yIGVtYmVkZGluZyBydW50aW1lIHNhbml0eSBjaGVja3MgaW4KLSAqIGNvZGUuIFRoZSBwcmVkaWNhdGUgbWV0aG9kcyBhbGwgdGVzdCBhIGNvbmRpdGlvbiBhbmQgdGhyb3cgc29tZSB0eXBlIG9mCi0gKiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlmIHRoZSBjb25kaXRpb24gZG9lcyBub3QgaG9sZC4KLSAqIDxwPgotICogQXNzZXJ0aW9uIGZhaWx1cmUgZXhjZXB0aW9ucywgbGlrZSBtb3N0IHJ1bnRpbWUgZXhjZXB0aW9ucywgYXJlIHRocm93biB3aGVuCi0gKiBzb21ldGhpbmcgaXMgbWlzYmVoYXZpbmcuIEFzc2VydGlvbiBmYWlsdXJlcyBhcmUgaW52YXJpYWJseSB1bnNwZWNpZmllZAotICogYmVoYXZpb3I7IGNvbnNlcXVlbnRseSwgY2xpZW50cyBzaG91bGQgbmV2ZXIgcmVseSBvbiB0aGVzZSBiZWluZyB0aHJvd24KLSAqIChhbmQgY2VydGFpbmx5IHNob3VsZCBub3QgYmVpbmcgY2F0Y2hpbmcgdGhlbSBzcGVjaWZpY2FsbHkpLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzZXJ0IHsKLQotCS8qKgotCSAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24KLQkgKiBieSBzb21lIG9mIHRoZSBtZXRob2RzIGluIDxjb2RlPkFzc2VydDwvY29kZT4uCi0JICogPHA+Ci0JICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcwotCSAqIHRoYXQgY2F0Y2ggb3Igb3RoZXJ3aXNlIGRlcGVuZCBvbiBhc3NlcnRpb24gZmFpbHVyZXMgYXJlIHN1c2NlcHRpYmxlIHRvCi0JICogdW5leHBlY3RlZCBicmVha2FnZSB3aGVuIGFzc2VydGlvbnMgaW4gdGhlIGNvZGUgYXJlIGFkZGVkIG9yIHJlbW92ZWQuCi0JICogPC9wPgotCSAqLwotCWNsYXNzIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbi4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCi0JCSAqLwotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBkZXRhaWwpIHsKLQkJCXN1cGVyKGRldGFpbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzIG5vdAotCSAqIDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlzCi0JICogdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBpc0xlZ2FsKGV4cHJlc3Npb24sICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgbm90Ci0JICogPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMKLQkgKiB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQKLQkgKiBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBpcwotCSAqIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB0ZXN0Ci0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlzTm90TnVsbChvYmplY3QsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBpcwotCSAqIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLiBUaGUgZ2l2ZW4KLQkgKiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB0ZXN0Ci0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQkvL0xvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAibnVsbF9hcmd1bWVudDogIiArIG1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgQXNzZXJ0KCkubmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcyBpcyBub3QKLQkgKiB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBpc1RydWUoZXhwcmVzc2lvbiwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdAotCSAqIHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlCi0JICogaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pIHsKLQkJCXRocm93IG5ldyBBc3NlcnQoKS5uZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4gKi8KLQlwcml2YXRlIEFzc2VydCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvRGVidWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9EZWJ1Zy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGY4OTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9EZWJ1Zy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKEludGFsaW8pIC0gYnVnIDMwMDQzMCAtIFN0cmluZyBjb25jYXRlbmF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIERlYnVnIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2hlY2tGb3JNZW1vcnlMZWFrcyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGNvbGxlY3RTdGF0cyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVCVUcgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RIUkVBRExPQ0FMID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdCcmVha3BvaW50cyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z0NhcmV0TWVkaWF0b3IgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdEaXNwbGF5VHJlZVBvc2l0aW9ucyA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnTWVkaWF0b3IgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z05vdGlmaWNhdGlvbiA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z05vdGlmaWNhdGlvbkFuZEV2ZW50cyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnTm90aWZ5RGVmZXJyZWQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdSZWNvbmNpbGluZyA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnUnRmRm9ybWF0UHJvdmlkZXIgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1RhZ2xpYnMgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1Rva2VuaXplciA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnVHJlZU1vZGVsID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnVXBkYXRlVHJlZVBvc2l0aW9ucyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkaXNwbGF5SW5mbyA9IGZhbHNlOwotCi0JLyoqIGVmZmVjdHMgb3V0cHV0IG9mIExvZ2dlciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkaXNwbGF5VG9Db25zb2xlID0gdHJ1ZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGlzcGxheVdhcm5pbmdzID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaGVhZFBhcnNpbmcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4ganNEZWJ1Z0NvbnRleHRBc3Npc3QgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBqc0RlYnVnU3ludGF4Q29sb3JpbmcgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NLUyA9IGZhbHNlOwotCS8vIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdEFkYXB0ZXJDbGFzc0xvYWRpbmcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3RGb3JtYXQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3RSYXdTdHJ1Y3R1cmVkRG9jdW1lbnRPbmx5ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50T25seSA9IGZhbHNlOwotCi0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gc3ludGF4SGlnaGxpZ2h0aW5nID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlU3RhbmRhcmRFb2xJbldpZGdldCA9IGZhbHNlOwotCi0JLyoqCi0JICogRm9yIHRlc3RzIGFuZCBkZWJ1ZyBvbmx5Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgZHVtcChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlkdW1wKHN0cnVjdHVyZWREb2N1bWVudCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBkdW1wKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBib29sZWFuIHZlcmJvc2UpIHsKLQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIGZsYXROb2RlID0gbnVsbDsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJEdW1wIG9mIHN0cnVjdHVyZWREb2N1bWVudDoiKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlFbnVtZXJhdGlvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gZmxhdE5vZGVzLmVsZW1lbnRzKCk7Ci0JCXdoaWxlIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlmbGF0Tm9kZSA9IChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghdmVyYm9zZSkgewotCQkJCVN0cmluZyBvdXRTdHJpbmcgPSBmbGF0Tm9kZS50b1N0cmluZygpOwotCQkJCW91dFN0cmluZyA9IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlscy5lc2NhcGUob3V0U3RyaW5nKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ob3V0U3RyaW5nKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZHVtcChmbGF0Tm9kZSwgdmVyYm9zZSk7Ci0JCQl9Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiPSA9ID0gPSA9ID0iKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiBAcGFyYW0gdmVyYm9zZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBkdW1wKElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24sIGJvb2xlYW4gdmVyYm9zZSkgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh2ZXJib3NlKSB7Ci0JCQlwcmludFBhcmVudChyZWdpb24pOwotCQl9Ci0JCXByaW50Q2hpbGRSZWdpb25zKHJlZ2lvbiwgMCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludENoaWxkUmVnaW9ucyhJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uLCBpbnQgZGVwdGgpIHsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyA9PT4gLy8gSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbkNvbGxlY3Rpb24gPSByZWdpb247Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVnaW9uKTsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gcmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9uTGlzdC5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHIgPSByZWdpb25MaXN0LmdldChpKTsKLQkJCQlpZiAociBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmMgPSAoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByOwotCQkJCQlwcmludENoaWxkUmVnaW9ucyhyYywgZGVwdGgrKyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHNwYWNlKGRlcHRoKSArIHIpOwotCQkJCQlkZXB0aC0tOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbXBsZSB1dGlsaXR5IHRvIG1ha2Ugc3VyZSBwcmludGxuJ3MgYXJlIHNvbWUgd2hhdCBpbiBvcmRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc3luY2hyb25pemVkIHZvaWQgcHJpbnRsbihTdHJpbmcgbXNnKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICJcdCIgKyBtc2cpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFBhcmVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBbcGFyZW50IGRvY3VtZW50OiAiICsgdG9TdHJpbmdVdGlsKHJlZ2lvbi5nZXRQYXJlbnREb2N1bWVudCgpKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRQYXJlbnQoSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJcHJpbnRQYXJlbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHJlZ2lvbik7Ci0JCX0gZWxzZSBpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCXByaW50UGFyZW50KChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKTsKLQkJfSBlbHNlCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBbcGFyZW50IGRvY3VtZW50OiAiICsgIihuYSkiICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UGFyZW50KElUZXh0UmVnaW9uQ29udGFpbmVyIHJlZ2lvbikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBbcGFyZW50IGRvY3VtZW50OiAiICsgdG9TdHJpbmdVdGlsKHJlZ2lvbi5nZXRQYXJlbnQoKSkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVwdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNwYWNlKGludCBkZXB0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gIiAgIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHJlc3VsdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgewotCQkJc2IuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmVzdWx0ID0gc2IudG9TdHJpbmcoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0b1N0cmluZ1V0aWwoSVN0cnVjdHVyZWREb2N1bWVudCBvYmplY3QpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHNob3J0Q2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSBzaG9ydENsYXNzTmFtZTsKLQkJLy8gTk9URTogaWYgdGhlIGRvY3VtZW50IGhlbGQgYnkgYW55IHJlZ2lvbiBoYXMgYmVlbiB1cGRhdGVkIGFuZCB0aGUKLQkJLy8gcmVnaW9uIG9mZnNldHMgaGF2ZSBub3QKLQkJLy8geWV0IGJlZW4gdXBkYXRlZCwgdGhlIG91dHB1dCBmcm9tIHRoaXMgbWV0aG9kIGludmFsaWQuCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0b1N0cmluZ1V0aWwoSVRleHRSZWdpb25Db2xsZWN0aW9uIG9iamVjdCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gb2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgc2hvcnRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9IHNob3J0Q2xhc3NOYW1lOwotCQkvLyBOT1RFOiBpZiB0aGUgZG9jdW1lbnQgaGVsZCBieSBhbnkgcmVnaW9uIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoZQotCQkvLyByZWdpb24gb2Zmc2V0cyBoYXZlIG5vdAotCQkvLyB5ZXQgYmVlbiB1cGRhdGVkLCB0aGUgb3V0cHV0IGZyb20gdGhpcyBtZXRob2QgaW52YWxpZC4KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCS8qKgotCSAqIERlYnVnIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIERlYnVnKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Eb2N1bWVudElucHV0U3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvRG9jdW1lbnRJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWQwOTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Eb2N1bWVudElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIERvY3VtZW50SW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgaW50IGZNYXJrID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlBvc2l0aW9uID0gMDsKLQotCXB1YmxpYyBEb2N1bWVudElucHV0U3RyZWFtKElEb2N1bWVudCBzb3VyY2UpIHsKLQkJc3VwZXIoKTsKLQkJZkRvY3VtZW50ID0gc291cmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNhdmFpbGFibGUoKQotCSAqLwotCXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIGZQb3NpdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNtYXJrKGludCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7Ci0JCWZNYXJrID0gZlBvc2l0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNtYXJrU3VwcG9ydGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVhZCgpCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChmUG9zaXRpb24gPCBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQkJcmV0dXJuIGZEb2N1bWVudC5nZXRDaGFyKGZQb3NpdGlvbisrKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gLTE7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVzZXQoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZQb3NpdGlvbiA9IGZNYXJrOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNza2lwKGxvbmcpCi0JICovCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWxvbmcgc2tpcHBlZCA9IG47Ci0JCWlmIChuIDwgZkRvY3VtZW50LmdldExlbmd0aCgpIC0gZlBvc2l0aW9uKSB7Ci0JCQlza2lwcGVkID0gbjsKLQkJCWZQb3NpdGlvbiArPSBza2lwcGVkOwotCQl9IGVsc2UgewotCQkJc2tpcHBlZCA9IGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIGZQb3NpdGlvbjsKLQkJCWZQb3NpdGlvbiA9IGZEb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gc2tpcHBlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvSmFyVXRpbGl0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvSmFyVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYmVkYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0phclV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgSmFyVXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIEBzZWUgaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3AvZXJyYXRhXzFfMV9hXzA0MjgwMC5odG1sLCBJc3N1ZXMKLQkgKiAgICAgIDggJiA5Ci0JICogCi0JICogICAgICAiVGhlcmUgYXJlIHR3byBjYXNlcy4gSW4gYm90aCBjYXNlcyB0aGUgVExEX1VSSSBpcyB0byBiZQotCSAqICAgICAgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdlYiBBcHBsaWNhdGlvbi4gSW4gdGhlCi0JICogICAgICBmaXJzdCBjYXNlIHRoZSBUTERfVVJJIHJlZmVycyB0byBhIFRMRCBmaWxlIGRpcmVjdGx5LiBJbiB0aGUKLQkgKiAgICAgIHNlY29uZCBjYXNlLCB0aGUgVExEX1VSSSByZWZlcnMgdG8gYSBKQVIgZmlsZS4gSWYgc28sIHRoYXQgSkFSCi0JICogICAgICBmaWxlIHNob3VsZCBoYXZlIGEgVExEIGF0IGxvY2F0aW9uIE1FVEEtSU5GL3RhZ2xpYi50bGQuIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUDExX1RBR0xJQiA9ICJNRVRBLUlORi90YWdsaWIudGxkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlSmFyRmlsZShaaXBGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWZpbGUuY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkvLyBubyBjbGVhbnVwIGNhbiBiZSBkb25lCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhIHN0cmVhbSB0byBhIGxvY2FsIGNvcHkgb2YgdGhlIGlucHV0IG9yIG51bGwgaWYgbm90IHBvc3NpYmxlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRDYWNoZWRJbnB1dFN0cmVhbShTdHJpbmcgamFyRmlsZW5hbWUsIFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJRmlsZSB0ZXN0RmlsZSA9IG5ldyBGaWxlKGphckZpbGVuYW1lKTsKLQkJaWYgKCF0ZXN0RmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBnZXRJbnB1dFN0cmVhbShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoamFyRmlsZW5hbWUpKSwgZW50cnlOYW1lKTsKLQotCQlJbnB1dFN0cmVhbSBjYWNoZSA9IG51bGw7Ci0JCVppcEZpbGUgamFyZmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXJmaWxlID0gbmV3IFppcEZpbGUoamFyRmlsZW5hbWUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4YykgewotCQkJY2xvc2VKYXJGaWxlKGphcmZpbGUpOwotCQl9Ci0KLQkJaWYgKGphcmZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlaaXBFbnRyeSB6ZW50cnkgPSBqYXJmaWxlLmdldEVudHJ5KGVudHJ5TmFtZSk7Ci0JCQkJaWYgKHplbnRyeSAhPSBudWxsKSB7Ci0JCQkJCUlucHV0U3RyZWFtIGVudHJ5SW5wdXRTdHJlYW0gPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJZW50cnlJbnB1dFN0cmVhbSA9IGphcmZpbGUuZ2V0SW5wdXRTdHJlYW0oemVudHJ5KTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gaW9FeGMpIHsKLQkJCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCQkJfQotCi0JCQkJCWlmIChlbnRyeUlucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQkJCWludCBjOwotCQkJCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZmZlciA9IG51bGw7Ci0JCQkJCQlpZiAoemVudHJ5LmdldFNpemUoKSA+IDApIHsKLQkJCQkJCQlidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKChpbnQpIHplbnRyeS5nZXRTaXplKCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQkJfQotCQkJCQkJLy8gYXJyYXkgZGltIHJlc3RyaWN0aW9uPwotCQkJCQkJYnl0ZSBieXRlc1tdID0gbmV3IGJ5dGVbMjA0OF07Ci0JCQkJCQl0cnkgewotCQkJCQkJCXdoaWxlICgoYyA9IGVudHJ5SW5wdXRTdHJlYW0ucmVhZChieXRlcykpID49IDApIHsKLQkJCQkJCQkJYnVmZmVyLndyaXRlKGJ5dGVzLCAwLCBjKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2FjaGUgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyLnRvQnl0ZUFycmF5KCkpOwotCQkJCQkJCWNsb3NlSmFyRmlsZShqYXJmaWxlKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJCQkvLyBubyBjbGVhbnVwIGNhbiBiZSBkb25lCi0JCQkJCQl9Ci0JCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQllbnRyeUlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQljbG9zZUphckZpbGUoamFyZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhY2hlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGNvcHlBbmRDbG9zZVN0cmVhbShJbnB1dFN0cmVhbSBvcmlnaW5hbCkgewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlJbnB1dFN0cmVhbSBjYWNoZWRDb3B5ID0gbnVsbDsKLQotCQlpZiAob3JpZ2luYWwgIT0gbnVsbCkgewotCQkJaW50IGM7Ci0JCQkvLyBhcnJheSBkaW0gcmVzdHJpY3Rpb24/Ci0JCQlieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKChjID0gb3JpZ2luYWwucmVhZChieXRlcykpID49IDApIHsKLQkJCQkJYnVmZmVyLndyaXRlKGJ5dGVzLCAwLCBjKTsKLQkJCQl9Ci0JCQkJY2FjaGVkQ29weSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIudG9CeXRlQXJyYXkoKSk7Ci0JCQkJY2xvc2VTdHJlYW0ob3JpZ2luYWwpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2FjaGVkQ29weTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gamFyUmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSB6aXAgZmlsZQotCSAqIEByZXR1cm4gYSBzdHJpbmcgYXJyYXkgY29udGFpbmluZyB0aGUgZW50cnkgcGF0aHMgdG8gZXZlcnkgZmlsZSBpbiB0aGlzCi0JICogICAgICAgICB6aXAgcmVzb3VyY2UsIGV4Y2x1ZGluZyBkaXJlY3RvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RW50cnlOYW1lcyhJUmVzb3VyY2UgamFyUmVzb3VyY2UpIHsKLQkJaWYgKGphclJlc291cmNlID09IG51bGwgfHwgamFyUmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFIHx8ICFqYXJSZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RW50cnlOYW1lcyhqYXJSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIG5ldyBaaXBJbnB1dFN0cmVhbSgoKElGaWxlKSBqYXJSZXNvdXJjZSkuZ2V0Q29udGVudHMoKSksIHRydWUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJfQotCi0JCUlQYXRoIGxvY2F0aW9uID0gamFyUmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0RW50cnlOYW1lcyhsb2NhdGlvbi50b1N0cmluZygpKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGphckZpbGVuYW1lCi0JICogICAgICAgICAgICB0aGUgbG9jYXRpb24gb2YgdGhlIHppcCBmaWxlCi0JICogQHJldHVybiBhIHN0cmluZyBhcnJheSBjb250YWluaW5nIHRoZSBlbnRyeSBwYXRocyB0byBldmVyeSBmaWxlIGluIHRoZQotCSAqICAgICAgICAgemlwIGZpbGUgYXQgdGhpcyBsb2NhdGlvbiwgZXhjbHVkaW5nIGRpcmVjdG9yaWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFbnRyeU5hbWVzKFN0cmluZyBqYXJGaWxlbmFtZSkgewotCQlyZXR1cm4gZ2V0RW50cnlOYW1lcyhqYXJGaWxlbmFtZSwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0RW50cnlOYW1lcyhTdHJpbmcgZmlsZW5hbWUsIFppcElucHV0U3RyZWFtIGphcklucHV0U3RyZWFtLCBib29sZWFuIGV4Y2x1ZGVEaXJlY3RvcmllcykgewotCQlMaXN0IGVudHJ5TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlaaXBFbnRyeSB6ID0gamFySW5wdXRTdHJlYW0uZ2V0TmV4dEVudHJ5KCk7Ci0JCQl3aGlsZSAoeiAhPSBudWxsKSB7Ci0JCQkJaWYgKCEoei5pc0RpcmVjdG9yeSgpICYmIGV4Y2x1ZGVEaXJlY3RvcmllcykpCi0JCQkJCWVudHJ5TmFtZXMuYWRkKHouZ2V0TmFtZSgpKTsKLQkJCQl6ID0gamFySW5wdXRTdHJlYW0uZ2V0TmV4dEVudHJ5KCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFppcEV4Y2VwdGlvbiB6RXhjKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiSmFyVXRpbGl0aWVzIFppcEV4Y2VwdGlvbjogKHN0cmVhbSkgIiArIGZpbGVuYW1lLCB6RXhjKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjKSB7Ci0JCQkvLyBubyBjbGVhbnVwIGNhbiBiZSBkb25lCi0JCX0KLQkJZmluYWxseSB7Ci0JCQljbG9zZVN0cmVhbShqYXJJbnB1dFN0cmVhbSk7Ci0JCX0KLQkJU3RyaW5nW10gbmFtZXMgPSAoU3RyaW5nW10pIGVudHJ5TmFtZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2xvc2VTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdHJ5IHsKLQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBqYXJGaWxlbmFtZQotCSAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIHRoZSB6aXAgZmlsZQotCSAqIEBwYXJhbSBleGNsdWRlRGlyZWN0b3JpZXMKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdG8gbm90IGluY2x1ZGUgZGlyZWN0b3JpZXMgaW4gdGhlIHJlc3VsdHMKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVudHJ5IHBhdGhzIHRvIGV2ZXJ5IGZpbGUgaW4gdGhlCi0JICogICAgICAgICB6aXAgZmlsZSBhdCB0aGlzIGxvY2F0aW9uLCBleGNsdWRpbmcgZGlyZWN0b3JpZXMgaWYgaW5kaWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFbnRyeU5hbWVzKFN0cmluZyBqYXJGaWxlbmFtZSwgYm9vbGVhbiBleGNsdWRlRGlyZWN0b3JpZXMpIHsKLQkJWmlwRmlsZSBqYXJmaWxlID0gbnVsbDsKLQkJTGlzdCBlbnRyeU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlGaWxlIGYgPSBuZXcgRmlsZShqYXJGaWxlbmFtZSk7Ci0JCWlmIChmLmV4aXN0cygpICYmIGYuY2FuUmVhZCgpKSB7Ci0JCQl0cnkgewotCQkJCWphcmZpbGUgPSBuZXcgWmlwRmlsZShmKTsKLQkJCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gamFyZmlsZS5lbnRyaWVzKCk7Ci0JCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJWmlwRW50cnkgeiA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCQlpZiAoISh6LmlzRGlyZWN0b3J5KCkgJiYgZXhjbHVkZURpcmVjdG9yaWVzKSkKLQkJCQkJCWVudHJ5TmFtZXMuYWRkKHouZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoWmlwRXhjZXB0aW9uIHpFeGMpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiSmFyVXRpbGl0aWVzIFppcEV4Y2VwdGlvbjogIiArIGphckZpbGVuYW1lICsgIiAiICsgekV4Yy5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4YykgewotCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWNsb3NlSmFyRmlsZShqYXJmaWxlKTsKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSBuYW1lcyA9IChTdHJpbmdbXSkgZW50cnlOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGphclJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgemlwIGZpbGUKLQkgKiBAcGFyYW0gZW50cnlOYW1lCi0JICogICAgICAgICAgICB0aGUgZW50cnkncyBwYXRoIGluIHRoZSB6aXAgZmlsZQotCSAqIEByZXR1cm4gYW4gSW5wdXRTdHJlYW0gdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBlbnRyeSBvciBudWxsIGlmCi0JICogICAgICAgICBub3QgcG9zc2libGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElSZXNvdXJjZSBqYXJSZXNvdXJjZSwgU3RyaW5nIGVudHJ5TmFtZSkgewotCQlpZiAoamFyUmVzb3VyY2UgPT0gbnVsbCB8fCBqYXJSZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUgfHwgIWphclJlc291cmNlLmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIHppcFN0cmVhbSA9ICgoSUZpbGUpIGphclJlc291cmNlKS5nZXRDb250ZW50cygpOwotCQkJcmV0dXJuIGdldElucHV0U3RyZWFtKGphclJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgbmV3IFppcElucHV0U3RyZWFtKHppcFN0cmVhbSksIGVudHJ5TmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbm8gY2xlYW51cCBjYW4gYmUgZG9uZSwgcHJvYmFibHkgb3V0IG9mIHN5bmMKLQkJfQotCi0JCUlQYXRoIGxvY2F0aW9uID0gamFyUmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRJbnB1dFN0cmVhbShsb2NhdGlvbi50b1N0cmluZygpLCBlbnRyeU5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyBmaWxlbmFtZSwgWmlwSW5wdXRTdHJlYW0gemlwLCBTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCUlucHV0U3RyZWFtIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlaaXBFbnRyeSB6ID0gemlwLmdldE5leHRFbnRyeSgpOwotCQkJd2hpbGUgKHogIT0gbnVsbCAmJiAhei5nZXROYW1lKCkuZXF1YWxzKGVudHJ5TmFtZSkpIHsKLQkJCQl6ID0gemlwLmdldE5leHRFbnRyeSgpOwotCQkJfQotCQkJaWYgKHogIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IGNvcHlBbmRDbG9zZVN0cmVhbSh6aXApOwotCQkJfQotCQl9Ci0JCWNhdGNoIChaaXBFeGNlcHRpb24gekV4YykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkphclV0aWxpdGllcyBaaXBFeGNlcHRpb246IChzdHJlYW0pICIgKyBmaWxlbmFtZSwgekV4Yyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4YykgewotCQkJLy8gbm8gY2xlYW51cCBjYW4gYmUgZG9uZQotCQl9Ci0JCWZpbmFsbHkgewotCQkJY2xvc2VTdHJlYW0oemlwKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBqYXJGaWxlbmFtZQotCSAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIHRoZSB6aXAgZmlsZQotCSAqIEBwYXJhbSBlbnRyeU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBlbnRyeSdzIHBhdGggaW4gdGhlIHppcCBmaWxlCi0JICogQHJldHVybiBhbiBJbnB1dFN0cmVhbSB0byB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGVudHJ5IG9yIG51bGwgaWYKLQkgKiAgICAgICAgIG5vdCBwb3NzaWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIGphckZpbGVuYW1lLCBTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCS8vIGNoZWNrIHNhbml0eQotCQlpZiAoamFyRmlsZW5hbWUgPT0gbnVsbCB8fCBqYXJGaWxlbmFtZS5sZW5ndGgoKSA8IDEgfHwgZW50cnlOYW1lID09IG51bGwgfHwgZW50cnlOYW1lLmxlbmd0aCgpIDwgMSkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEpBUiBmaWxlcyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBsZWFkaW5nICcvJyBpbiBtZW1iZXIgbmFtZXMKLQkJU3RyaW5nIGludGVybmFsTmFtZSA9IG51bGw7Ci0JCWlmIChlbnRyeU5hbWUuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQlpbnRlcm5hbE5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDEpOwotCQllbHNlCi0JCQlpbnRlcm5hbE5hbWUgPSBlbnRyeU5hbWU7Ci0KLQkJcmV0dXJuIGdldENhY2hlZElucHV0U3RyZWFtKGphckZpbGVuYW1lLCBpbnRlcm5hbE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIGEgVVJMIHBvaW50aW50IHRvIGEgemlwIGZpbGUKLQkgKiBAcmV0dXJuIGEgY2FjaGVkIGNvcHkgb2YgdGhlIGNvbnRlbnRzIGF0IHRoaXMgVVJMLCBvcGVuaW5nIGl0IGFzIGEgZmlsZQotCSAqICAgICAgICAgaWYgaXQgaXMgYSBqYXI6ZmlsZTogVVJMLCBhbmQgdXNpbmcgYSBVUkxDb25uZWN0aW9uIG90aGVyd2lzZSwKLQkgKiAgICAgICAgIG9yIG51bGwgaWYgaXQgY291bGQgbm90IGJlIHJlYWQuIEFsbCBzb2NrZXRzIGFuZCBmaWxlIGhhbmRsZXMKLQkgKiAgICAgICAgIGFyZSBjbG9zZWQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFVSTCB1cmwpIHsKLQkJU3RyaW5nIHVybFN0cmluZyA9IHVybC50b1N0cmluZygpOwotCQlpZiAodXJsU3RyaW5nLmxlbmd0aCgpID4gMTIgJiYgdXJsU3RyaW5nLnN0YXJ0c1dpdGgoImphcjpmaWxlOiIpICYmIHVybFN0cmluZy5pbmRleE9mKCIhLyIpID4gOSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWludCBmaWxlSW5kZXggPSB1cmxTdHJpbmcuaW5kZXhPZigiIS8iKTsgLy8kTk9OLU5MUy0xJCAKLQkJCVN0cmluZyBqYXJGaWxlTmFtZSA9IHVybFN0cmluZy5zdWJzdHJpbmcoOSwgZmlsZUluZGV4KTsKLQkJCWlmIChmaWxlSW5kZXggPCB1cmxTdHJpbmcubGVuZ3RoKCkpIHsKLQkJCQlTdHJpbmcgamFyUGF0aCA9IHVybFN0cmluZy5zdWJzdHJpbmcoZmlsZUluZGV4ICsgMSk7Ci0JCQkJcmV0dXJuIGdldElucHV0U3RyZWFtKGphckZpbGVOYW1lLCBqYXJQYXRoKTsKLQkJCX0KLQkJfQotCi0JCUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJSmFyVVJMQ29ubmVjdGlvbiBqYXJVcmxDb25uZWN0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCW9wZW5Db25uZWN0aW9uLnNldERlZmF1bHRVc2VDYWNoZXMoZmFsc2UpOwotCQkJb3BlbkNvbm5lY3Rpb24uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKLQkJCWlmIChvcGVuQ29ubmVjdGlvbiBpbnN0YW5jZW9mIEphclVSTENvbm5lY3Rpb24pIHsKLQkJCQlqYXJVcmxDb25uZWN0aW9uID0gKEphclVSTENvbm5lY3Rpb24pIG9wZW5Db25uZWN0aW9uOwotCQkJCUphckZpbGUgamFyRmlsZSA9IGphclVybENvbm5lY3Rpb24uZ2V0SmFyRmlsZSgpOwotCQkJCWlucHV0ID0gamFyRmlsZS5nZXRJbnB1dFN0cmVhbShqYXJVcmxDb25uZWN0aW9uLmdldEphckVudHJ5KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW5wdXQgPSBvcGVuQ29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJfQotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY29weUFuZENsb3NlU3RyZWFtKGlucHV0KTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIE1heSBiZSBhIGZpbGUgVVJMIGNvbm5lY3Rpb24sIGRvIG5vdCBsb2cKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChqYXJVcmxDb25uZWN0aW9uICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlqYXJVcmxDb25uZWN0aW9uLmdldEphckZpbGUoKS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQkJY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIGlnbm9yZS4gQ2FuIGhhcHBlbiBpbiBjYXNlIHRoZSBzdHJlYW0uY2xvc2UoKSBkaWQgY2xvc2UKLQkJCQkJICogdGhlIGphciBmaWxlIHNlZQotCQkJCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwNzUwCi0JCQkJCSAqLwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9QYXRoSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvUGF0aEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODM1MDg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9QYXRoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAoSW50YWxpbykgLSBidWcgMzAwNDMwIC0gU3RyaW5nIGNvbmNhdGVuYXRpb24KLSAqICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIGhlbHBlciBtZXRob2RzIHRvIG1hbmFnZSBhbmQgY29udmVydCBsaW5rcyBPcmlnaW5hbGx5IHBhcnQgb2YKLSAqIHRoZSBMaW5rc01hbmFnZXIgCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXRoSGVscGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLV0FSRF9TTEFTSCA9ICJcXCI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSRF9TTEFTSCA9ICIvIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMQVRJVkVfUEFUSF9TSUcgPSAiLi4vIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBhZGp1c3QgcmVsYXRpdmUgcGF0aCBpc3NpZGUgdGhlIGFic29sdXRlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGp1c3RQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKChpID0gcGF0aC5pbmRleE9mKFJFTEFUSVZFX1BBVEhfU0lHKSkgPiAwKSB7Ci0JCQkvLyBzcGxpdCB0aGUgc3RyaW5nIGludG8gdHdvCi0JCQlTdHJpbmcgcGFydDEgPSBwYXRoLnN1YnN0cmluZygwLCBpIC0gMSk7Ci0JCQlTdHJpbmcgcGFydDIgPSBwYXRoLnN1YnN0cmluZyhpICsgUkVMQVRJVkVfUEFUSF9TSUcubGVuZ3RoKCkgLSAxKTsKLQkJCS8vIHN0cmlwIG9uZSBwYXRoIHNlZyBmcm9tIHBhcnQxCi0JCQlpbnQgaiA9IHBhcnQxLmxhc3RJbmRleE9mKEZPUldBUkRfU0xBU0gpOwotCQkJaWYgKGogPT0gLTEpIHsKLQkJCQkvLyBjYW4ndCByZXNvbHZlLiBwYXNzZWQgcGF0aCBpcyBsaWtlCi0JCQkJLy8gRTovZWNsaXBzZXByb2plY3QvLi4vLi4vc2FtcGxlLmNzcy4KLQkJCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJcGFydDEgPSBwYXJ0MS5zdWJzdHJpbmcoMCwgaik7Ci0JCQlwYXRoID0gcGFydDEgKyBwYXJ0MjsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdHJhaWxpbmcgdXJsIHNsYXNoIGlmIG5lZWRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZFRyYWlsaW5nVVJMU2xhc2goU3RyaW5nIGlucHV0KSB7Ci0JCS8vIGNoZWNrIHRvIHNlZSBhbHJlYWR5IGEgc2xhc2gKLQkJaWYgKCFpbnB1dC5lbmRzV2l0aChGT1JXQVJEX1NMQVNIKSkgewotCQkJaW5wdXQgKz0gRk9SV0FSRF9TTEFTSDsKLQkJfQotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0byByZWxhdGl2ZSB1cmwgYmFzZWQgb24gYmFzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1JlbGF0aXZlKFN0cmluZyBpbnB1dCwgU3RyaW5nIGJhc2UpIHsKLQkJLy8gdG9rZW5pemUgdGhlIHN0cmluZ3MKLQkJU3RyaW5nVG9rZW5pemVyIGlucHV0VG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbnB1dCwgRk9SV0FSRF9TTEFTSCk7Ci0JCVN0cmluZ1Rva2VuaXplciBiYXNlVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihiYXNlLCBGT1JXQVJEX1NMQVNIKTsKLQkJU3RyaW5nIHRva2VuMSA9ICIiLCB0b2tlbjIgPSAiIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkvLwotCQkvLyBHbyB0aHJvdWdoIHVudGlsIGVxdWxzCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoIWlucHV0VG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSB8fCAhYmFzZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJYnJlYWs7Ci0JCQl0b2tlbjEgPSBiYXNlVG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJdG9rZW4yID0gaW5wdXRUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAoIXRva2VuMS5lcXVhbHModG9rZW4yKSkKLQkJCQlicmVhazsKLQkJfQotCQkvLyBub3cgZ2VuZXJhdGUgdGhlIGJhY2tzCi0JCVN0cmluZyBvdXRwdXQgPSAiIjsvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIob3V0cHV0KTsKLQkJd2hpbGUgKGJhc2VUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQliYXNlVG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJc2IuYXBwZW5kKCIuLi8iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNiLmFwcGVuZCh0b2tlbjIpOwotCQkvLyBnZW5lcmF0ZSB0aGUgcmVzdAotCQl3aGlsZSAoaW5wdXRUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlzYi5hcHBlbmQoRk9SV0FSRF9TTEFTSCk7Ci0JCQlzYi5hcHBlbmQoaW5wdXRUb2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQl9Ci0JCW91dHB1dCA9IHNiLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBvdXRwdXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluaW5nIGZvbGRlciBwYXRoLiBXaWxsIGhhbmRsZSBib3RoIHVybCBhbmQgZmlsZSBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGFpbmluZ0ZvbGRlclBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJU3RyaW5nIHJldFZhbHVlID0gcGF0aDsKLQotCQlpbnQgdXJsU2xhc2hJbmRleCA9IHBhdGgubGFzdEluZGV4T2YoRk9SV0FSRF9TTEFTSCk7Ci0JCWludCBmaWxlUGF0aFNsYXNoSW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKLQkJaW50IGluZGV4ID0gZmlsZVBhdGhTbGFzaEluZGV4OwotCQlpZiAodXJsU2xhc2hJbmRleCA+IGZpbGVQYXRoU2xhc2hJbmRleCkKLQkJCWluZGV4ID0gdXJsU2xhc2hJbmRleDsKLQkJaWYgKGluZGV4ID49IDApCi0JCQlyZXRWYWx1ZSA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJcmV0dXJuIHJldFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBsZWFkaW5nIHBhdGggc2VwYXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlTGVhZGluZ1BhdGhTZXBhcmF0b3IoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGguc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoRmlsZS5zZXBhcmF0b3IubGVuZ3RoKCkpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgbGVhZGluZyBwYXRoIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUxlYWRpbmdTZXBhcmF0b3IoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGguc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoRmlsZS5zZXBhcmF0b3IubGVuZ3RoKCkpOwotCQllbHNlIGlmIChwYXRoLnN0YXJ0c1dpdGgoRk9SV0FSRF9TTEFTSCkgfHwgcGF0aC5zdGFydHNXaXRoKEJBQ0tXQVJEX1NMQVNIKSkKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhGT1JXQVJEX1NMQVNILmxlbmd0aCgpKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogU3dpdGNoIHRvIGZpbGUgcGF0aCBzbGFzaGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3dpdGNoVG9GaWxlUGF0aFNsYXNoZXMoU3RyaW5nIHBhdGgpIHsKLQkJcGF0aCA9IHBhdGgucmVwbGFjZShGT1JXQVJEX1NMQVNILmNoYXJBdCgwKSwgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJcGF0aCA9IHBhdGgucmVwbGFjZShCQUNLV0FSRF9TTEFTSC5jaGFyQXQoMCksIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFN3aXRjaCB0byBmaWxlIHBhdGggc2xhc2hlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN3aXRjaFRvRm9yd2FyZFNsYXNoZXMoU3RyaW5nIHBhdGgpIHsKLQkJcGF0aCA9IHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsIEZPUldBUkRfU0xBU0guY2hhckF0KDApKTsKLQkJcGF0aCA9IHBhdGgucmVwbGFjZShCQUNLV0FSRF9TTEFTSC5jaGFyQXQoMCksIEZPUldBUkRfU0xBU0guY2hhckF0KDApKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1Byb2plY3RSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1Byb2plY3RSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTIxZjk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Qcm9qZWN0UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoZSBVUklSZXNvbHZlciBpbnRlcmZhY2UgaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSByZXNvbHZlciBmcm9tCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdFJlc29sdmVyIGltcGxlbWVudHMgVVJJUmVzb2x2ZXIgewotCXByaXZhdGUgU3RyaW5nIGZGaWxlQmFzZUxvY2F0aW9uID0gbnVsbDsKLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0ID0gbnVsbDsKLQotCS8qKgotCSAqIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgY2xpZW50cyB1c2UKLQkgKiBwcm9qZWN0LmdldEFkYXB0ZXIoVVJJUmVzb2x2ZXIuY2xhc3MpIHRvIG9idGFpbiBhIFVSSVJlc29sdmVyIGF3YXJlIG9mCi0JICogdGhlIFByb2plY3QncyBzcGVjaWFsIHJlcXVpcmVtZW50cy4gTm90ZSB0aGF0IGEgVVJJUmVzb2x2ZXIgbWF5IG5vdCBiZQotCSAqIHJldHVybmVkIGF0IGFsbCBzbyBtYW51YWxseSBjcmVhdGluZyB0aGlzIG9iamVjdCBtYXkgc3RpbGwgYmUgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFByb2plY3RSZXNvbHZlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVCYXNlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBmRmlsZUJhc2VMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSk7Ci0JfQotCi0JLy8gZGVmZWN0IDI0NDgxNyBlbmQKLQkvKioKLQkgKiBSZXNvbHZlIHRoZSAocG9zc2libHkgcmVsYXRpdmUpIFVSSSBhY29yZGluZyB0byBSRkMxODA4IHVzaW5nIHRoZQotCSAqIGRlZmF1bHQgZmlsZSBiYXNlIGxvY2F0aW9uLiBSZXNvbHZlcyByZXNvdXJjZSByZWZlcmVuY2VzIGludG8gYWJzb2x1dGUKLQkgKiByZXNvdXJjZSBsb2NhdGlvbnMgd2l0aG91dCBlbnN1cmluZyB0aGF0IHRoZSByZXNvdXJjZSBhY3R1YWxseSBleGlzdHMuCi0JICogCi0JICogTm90ZTogY3VycmVudGx5IHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyBpcyBpZ25vcmVkIGluIHRoaXMKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBnZXRGaWxlQmFzZUxvY2F0aW9uKCksIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvKgotCQkgKiBkZWZlY3QgMjQ0ODE3IHRyeSB7IFVSTCBhVVJMID0gbmV3IFVSTCh1cmkpOwotCQkgKi8KLQkJLyoqCi0JCSAqIEFuIGFjdHVhbCBVUkwgd2FzIGdpdmVuLCBidXQgb25seSB0aGUgImZpbGU6Ly8vIiBwcm90b2NvbCBpcwotCQkgKiBzdXBwb3J0ZWQuIFJlc29sdmUgdGhlIFVSSSBieSBmaW5kaW5nIHRoZSBmaWxlIHRvIHdoaWNoIGl0IHBvaW50cy4KLQkJICovCi0JCS8qCi0JCSAqIGRlZmVjdCAyNDQ4MTcgaWYgKCFhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJwbGF0Zm9ybSIpKSB7Ci0JCSAqIC8vJE5PTi1OTFMtMSQgaWYgKGFVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSAmJgotCQkgKiAoYVVSTC5nZXRIb3N0KCkuZXF1YWxzKCJsb2NhbGhvc3QiKSB8fCBhVVJMLmdldEhvc3QoKS5sZW5ndGgoKSA9PQotCQkgKiAwKSkgeyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJCByZXR1cm4gYVVSTC5nZXRGaWxlKCk7IH0gcmV0dXJuCi0JCSAqIHVyaTsgfSB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWZ1RXhjKSB7IH0KLQkJICovCi0JCS8vIGRlZmVjdCAyNDQ4MTcgc3RhcnQKLQkJaWYgKGlzRmlsZVVSTCh1cmkpKSB7Ci0JCQl0cnkgewotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCQkJcmV0dXJuIGdldFBhdGgodXJsKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCS8vIGRlZmVjdCAyNDQ4MTcgZW5kCi0KLQkJLy8gd2hpY2ggb2YgdGhlIHNlcnZlcmFsIGFyZSB3ZSBzdXBwb3NlIHRvIHVzZSBoZXJlPwotCQkvLwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MTIyMwotCQkvLyBXb3JrYXJvdW5kIGZvciBwcm9ibGVtIGluIFVSSUhlbHBlcjsgdXJpcyBzdGFydGluZyB3aXRoICcvJyBhcmUKLQkJLy8gcmV0dXJuZWQgYXMtaXMuCi0JCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0JCWlmICh1cmkuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUlQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KCk7Ci0JCQlpZiAocCAhPSBudWxsICYmIHAuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlJRmlsZSBmaWxlID0gcC5nZXRGaWxlKHVyaSk7Ci0JCQkJCi0JCQkJaWYgKGZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCWlmIChsb2NhdGlvbiA9PSBudWxsICYmIGZpbGUuZ2V0TG9jYXRpb25VUkkoKSAhPSBudWxsKSB7Ci0JCQkJCWxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCWxvY2F0aW9uID0gZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCWxvY2F0aW9uID0gVVJJSGVscGVyLm5vcm1hbGl6ZSh1cmksIGJhc2VSZWZlcmVuY2UsIGdldFJvb3RMb2NhdGlvblN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSB0aGUgZ2V0TG9jYXRpb25CeVVSSSBhY3Rpb24gdXNpbmcgdGhlIGJhc2VSZWZlcmVuY2UgYXMgdGhlCi0JICogcG9pbnQgb2YgcmVmZXJlbmNlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9yIHRoaXMgcmVzb2x2ZXIKLQkgKiAKLQkgKiBOb3RlOiBjdXJyZW50bHkgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzIGlzIGlnbm9yZWQgaW4gdGhpcwotCSAqIGltcGxlbWVudGF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBiYXNlUmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBob3N0Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQYXRoKElQYXRoIHBhdGgsIFN0cmluZyBob3N0KSB7Ci0JCUlQYXRoIG5ld1BhdGggPSBwYXRoOwotCQkvLyBUaGV5IGFyZSBwb3RlbnRpYWxseSBmb3Igb25seSBXaW5kb3dzIG9wZXJhdGluZyBzeXN0ZW0uCi0JCS8vIGEuKSBpZiBwYXRoIGhhcyBhIGRldmljZSwgYW5kIGlmIGl0IGJlZ2lucyB3aXRoIElQYXRoLlNFUEFSQVRPUiwKLQkJLy8gcmVtb3ZlIGl0Ci0JCWZpbmFsIFN0cmluZyBkZXZpY2UgPSBwYXRoLmdldERldmljZSgpOwotCQlpZiAoKGRldmljZSAhPSBudWxsKSAmJiAoZGV2aWNlLmxlbmd0aCgpID4gMCkpIHsKLQkJCWlmIChkZXZpY2UuY2hhckF0KDApID09IElQYXRoLlNFUEFSQVRPUikgewotCQkJCWZpbmFsIFN0cmluZyBuZXdEZXZpY2UgPSBkZXZpY2Uuc3Vic3RyaW5nKDEpOwotCQkJCW5ld1BhdGggPSBwYXRoLnNldERldmljZShuZXdEZXZpY2UpOwotCQkJfQotCQl9Ci0JCS8vIGIuKSBpZiBpdCBoYXMgYSBob3N0bmFtZSwgaXQgaXMgVU5DIG5hbWUuLi4gQW55IGphdmEgb3IgZWNsaXBzZSBhcGkKLQkJLy8gaGVscHMgaXQgPz8KLQkJaWYgKHBhdGggIT0gbnVsbCAmJiBob3N0ICE9IG51bGwgJiYgaG9zdC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlJUGF0aCB1bmNQYXRoID0gbmV3IFBhdGgoaG9zdCk7Ci0JCQl1bmNQYXRoID0gdW5jUGF0aC5hcHBlbmQocGF0aCk7Ci0JCQluZXdQYXRoID0gdW5jUGF0aC5tYWtlVU5DKHRydWUpOwotCQl9Ci0JCXJldHVybiBuZXdQYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aChVUkwgdXJsKSB7Ci0JCVN0cmluZyByZWYgPSB1cmwuZ2V0UmVmKCkgPT0gbnVsbCA/ICIiIDogIiMiICsgdXJsLmdldFJlZigpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3RyaW5nIHN0clBhdGggPSB1cmwuZ2V0RmlsZSgpICsgcmVmOwotCQlJUGF0aCBwYXRoOwotCQlpZiAoc3RyUGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlwYXRoID0gUGF0aC5ST09UOwotCQl9Ci0JCWVsc2UgewotCQkJcGF0aCA9IG5ldyBQYXRoKHN0clBhdGgpOwotCQkJU3RyaW5nIHF1ZXJ5ID0gbnVsbDsKLQkJCVN0cmluZ1Rva2VuaXplciBwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0clBhdGgsICI/Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCB0b2tlbkNvdW50ID0gcGFyc2VyLmNvdW50VG9rZW5zKCk7Ci0JCQlpZiAodG9rZW5Db3VudCA9PSAyKSB7Ci0JCQkJcGF0aCA9IG5ldyBQYXRoKChTdHJpbmcpIHBhcnNlci5uZXh0RWxlbWVudCgpKTsKLQkJCQlxdWVyeSA9IChTdHJpbmcpIHBhcnNlci5uZXh0RWxlbWVudCgpOwotCQkJfQotCQkJaWYgKHF1ZXJ5ID09IG51bGwpIHsKLQkJCQlwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGgudG9TdHJpbmcoKSwgIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRva2VuQ291bnQgPSBwYXJzZXIuY291bnRUb2tlbnMoKTsKLQkJCQlpZiAodG9rZW5Db3VudCA9PSAyKSB7Ci0JCQkJCXBhdGggPSBuZXcgUGF0aCgoU3RyaW5nKSBwYXJzZXIubmV4dEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRQYXRoKHBhdGgsIHVybC5nZXRIb3N0KCkpOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIgZ2V0Um9vdExvY2F0aW9uKCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSb290TG9jYXRpb25TdHJpbmcoKSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0JCWlmIChmUHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmUHJvamVjdC5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCWxvY2F0aW9uID0gZlByb2plY3QuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQl9Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsICYmIGZQcm9qZWN0LmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkgewotCQkJbG9jYXRpb24gPSBmUHJvamVjdC5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCWxvY2F0aW9uID0gZlByb2plY3QuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0VVJJU3RyZWFtKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gZGVmZWN0IDI0NDgxNyBzdGFydAotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXNzZWRTcGVjCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRmlsZVVSTChTdHJpbmcgcGFzc2VkU3BlYykgewotCQlpZiAocGFzc2VkU3BlYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZmluYWwgU3RyaW5nIHNwZWMgPSBwYXNzZWRTcGVjLnRyaW0oKTsKLQkJaWYgKHNwZWMubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZpbmFsIGludCBsaW1pdCA9IHNwZWMubGVuZ3RoKCk7Ci0JCVN0cmluZyBuZXdQcm90b2NvbCA9IG51bGw7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBsaW1pdDsgaW5kZXgrKykgewotCQkJZmluYWwgY2hhciBwID0gc3BlYy5jaGFyQXQoaW5kZXgpOwotCQkJaWYgKHAgPT0gJy8nKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChwID09ICc6JykgeyAvLyROT04tTkxTLTEkCi0JCQkJbmV3UHJvdG9jb2wgPSBzcGVjLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChuZXdQcm90b2NvbCAhPSBudWxsICYmIG5ld1Byb3RvY29sLmNvbXBhcmVUb0lnbm9yZUNhc2UoImZpbGUiKSA9PSAwKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbGVCYXNlTG9jYXRpb24oU3RyaW5nIG5ld0ZpbGVCYXNlTG9jYXRpb24pIHsKLQkJZkZpbGVCYXNlTG9jYXRpb24gPSBuZXdGaWxlQmFzZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgbmV3UHJvamVjdCkgewotCQlmUHJvamVjdCA9IG5ld1Byb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1Jlc291cmNlVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1Jlc291cmNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU5ZWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9SZXNvdXJjZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIG1ha2VzIGFzc3VtcHRpb25zIG9uIGJlaGFsZiBvZiB0aGUgcmVxdWVzdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVV0aWwgewotCi0JLyoqCi0JICogT2J0YWlucyB0aGUgSUZpbGUgZm9yIGEgbW9kZWwKLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIHRoZSBtb2RlbCB0byB1c2UKLQkgKiBAcmV0dXJuIHRoZSBJRmlsZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbW9kZWwsIGlmIGl0IGNhbWUgZnJvbSBhbiBJRmlsZSwKLQkgKiAgICAgICAgIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlRm9yKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlJUGF0aCBsb2NhdGlvbiA9IG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJLy8gaWYgdGhlIHBhdGggaXMgbm90IGEgcGF0aCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIHRoZXJlIGFyZSBhdCBsZWFzdAotCQkvLyAyIHNlZ21lbnRzLCBpdCBtaWdodCBiZSBpbiB0aGUgd29ya3NwYWNlCi0JCUlGaWxlW10gZmlsZXMgPSByb290LmZpbmRGaWxlc0ZvckxvY2F0aW9uKGxvY2F0aW9uKTsKLQkJaWYgKGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCWZpbGUgPSBmaWxlc1swXTsKLQkJfQotCQllbHNlIGlmIChsb2NhdGlvbi5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCS8vIHJlbWVtYmVyLCB0aGlzIElGaWxlIGlzbid0IGd1YXJhbnRlZWQgdG8gZXhpc3QKLQkJCWZpbGUgPSByb290LmdldEZpbGUobG9jYXRpb24pOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIE9idGFpbiBJRmlsZXMgZnJvbSBJU3RydWN0dXJlZE1vZGVsIChpbmNsdWRlcyBsaW5rZWRSZXNvdXJjZXMpCi0JICogCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBmaWxlcyBpbiB0aGUgd29ya3NwYWNlLCBvciBhbiBlbXB0eSBhcnJheSBpZgotCSAqICAgICAgICAgbm9uZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGVbXSBnZXRGaWxlc0ZvcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSUZpbGVbXSBmaWxlcyA9IG51bGw7Ci0JCUlQYXRoIGxvY2F0aW9uID0gbmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJLy8gaWYgdGhlIHBhdGggaXMgbm90IGEgcGF0aCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIHRoZXJlIGFyZSBhdCBsZWFzdAotCQkvLyAyIHNlZ21lbnRzLCBpdCBtaWdodCBiZSBpbiB0aGUgd29ya3NwYWNlCi0JCWlmICghbG9jYXRpb24udG9GaWxlKCkuZXhpc3RzKCkgJiYgbG9jYXRpb24uc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkvLyByZW1lbWJlciwgdGhpcyBJRmlsZSBpc24ndCBndWFyYW50ZWVkIHRvIGV4aXN0Ci0JCQlmaWxlcyA9IG5ldyBJRmlsZVtde3Jvb3QuZ2V0RmlsZShsb2NhdGlvbil9OwotCQl9Ci0JCWVsc2UgewotCQkJZmlsZXMgPSByb290LmZpbmRGaWxlc0ZvckxvY2F0aW9uKGxvY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1NjcmlwdExhbmd1YWdlS2V5cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1NjcmlwdExhbmd1YWdlS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDRkN2FhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9TY3JpcHRMYW5ndWFnZUtleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotLyoqCi0gKiBDb250YWlucyBsaXN0IG9mIHNjcmlwdCBsYW5ndWFnZXMgYW5kIG1pbWUgdHlwZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBTY3JpcHRMYW5ndWFnZUtleXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKQVZBX0xBTkdVQUdFX0tFWVMgPSBuZXcgU3RyaW5nW117ImphdmEifTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVNDUklQVCA9ICJqYXZhc2NyaXB0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTID0geyJqYXZhc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4wIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4xIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4yIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4zIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS40IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS41IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS42IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJzYXNoc2NyaXB0In07IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQVNDUklQVF9NSU1FX1RZUEVfS0VZUyA9IHsidGV4dC9qYXZhc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJ0ZXh0L2pzY3JpcHQiLCAvLyROT04tTkxTLTEkCi0JCQkJInRleHQvc2FzaHNjcmlwdCJ9OyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvU29ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2RmMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1NvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotLyoqCi0gKiBUaGUgU29ydE9wZXJhdGlvbiB0YWtlcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBhbmQgcmV0dXJucyBhIHNvcnRlZAotICogY29sbGVjdGlvbiBvZiB0aGVzZSBvYmplY3RzLiBDb25jcmV0ZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBwcm92aWRlIHRoZQotICogY3JpdGVyaWEgZm9yIHRoZSBzb3J0aW5nIG9mIHRoZSBvYmplY3RzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZSBvYmplY3RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU29ydGVyIHsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZmYgZWxlbWVudFR3byBpcyAnZ3JlYXRlciB0aGFuJyBlbGVtZW50T25lLiBUaGlzIGlzIHRoZQotCSAqICdvcmRlcmluZycgbWV0aG9kIG9mIHRoZSBzb3J0IG9wZXJhdGlvbi4gRWFjaCBzdWJjbGFzcyBvdmVycmlkZXMgdGhpcwotCSAqIG1ldGhvZCB3aXRoIHRoZSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIHRoZSAnZ3JlYXRlciB0aGFuJyBjb25jZXB0Ci0JICogZm9yIHRoZSBvYmplY3RzIGJlaW5nIHNvcnRlZC4gSWYgZWxlbWVudE9uZSBhbmQgZWxlbWVudFR3byBhcmUKLQkgKiBlcXVpdmFsZW50IGluIHRlcm1zIG9mIHRoZWlyIHNvcnRpbmcgb3JkZXIsIHRoaXMgbWV0aG9kIG11c3QgcmV0dXJuCi0JICogJ2ZhbHNlJy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBlbGVtZW50T25lLCBPYmplY3QgZWxlbWVudFR3byk7Ci0KLQkvKioKLQkgKiBTb3J0IHRoZSBvYmplY3RzIGluIHRoZSBhcnJheSBhbmQgcmV0dXJuIHRoZSBhcnJheS4KLQkgKi8KLQlwcml2YXRlIE9iamVjdFtdIHF1aWNrU29ydChPYmplY3RbXSBhcnJheSwgaW50IGxlZnQsIGludCByaWdodCkgewotCQlpbnQgb3JpZ2luYWxMZWZ0ID0gbGVmdDsKLQkJaW50IG9yaWdpbmFsUmlnaHQgPSByaWdodDsKLQkJT2JqZWN0IG1pZCA9IGFycmF5WyhsZWZ0ICsgcmlnaHQpIC8gMl07Ci0KLQkJZG8gewotCQkJd2hpbGUgKGNvbXBhcmUoYXJyYXlbbGVmdF0sIG1pZCkpCi0JCQkJbGVmdCsrOwotCQkJd2hpbGUgKGNvbXBhcmUobWlkLCBhcnJheVtyaWdodF0pKQotCQkJCXJpZ2h0LS07Ci0JCQlpZiAobGVmdCA8PSByaWdodCkgewotCQkJCU9iamVjdCB0bXAgPSBhcnJheVtsZWZ0XTsKLQkJCQlhcnJheVtsZWZ0XSA9IGFycmF5W3JpZ2h0XTsKLQkJCQlhcnJheVtyaWdodF0gPSB0bXA7Ci0JCQkJbGVmdCsrOwotCQkJCXJpZ2h0LS07Ci0JCQl9Ci0JCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOwotCi0JCWlmIChvcmlnaW5hbExlZnQgPCByaWdodCkKLQkJCWFycmF5ID0gcXVpY2tTb3J0KGFycmF5LCBvcmlnaW5hbExlZnQsIHJpZ2h0KTsKLQkJaWYgKGxlZnQgPCBvcmlnaW5hbFJpZ2h0KQotCQkJYXJyYXkgPSBxdWlja1NvcnQoYXJyYXksIGxlZnQsIG9yaWdpbmFsUmlnaHQpOwotCi0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgKHF1aWNrKXNvcnRlZCBhcnJheSBmcm9tIHRoaXMgdW5zb3J0ZWQgYXJyYXkuIFRoZSBvcmlnaW5hbAotCSAqIGFycmF5IGlzIG5vdCBtb2RpZmllZC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gc29ydChPYmplY3RbXSB1blNvcnRlZENvbGxlY3Rpb24pIHsKLQkJaW50IHNpemUgPSB1blNvcnRlZENvbGxlY3Rpb24ubGVuZ3RoOwotCQlPYmplY3RbXSBzb3J0ZWRDb2xsZWN0aW9uID0gbmV3IE9iamVjdFtzaXplXTsKLQotCQkvL2NvcHkgdGhlIGFycmF5IHNvIGNhbiByZXR1cm4gYSBuZXcgc29ydGVkIGNvbGxlY3Rpb24KLQkJU3lzdGVtLmFycmF5Y29weSh1blNvcnRlZENvbGxlY3Rpb24sIDAsIHNvcnRlZENvbGxlY3Rpb24sIDAsIHNpemUpOwotCQlpZiAoc2l6ZSA+IDEpCi0JCQlxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgMCwgc2l6ZSAtIDEpOwotCi0JCXJldHVybiBzb3J0ZWRDb2xsZWN0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9UZXh0VXRpbGl0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvVGV4dFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjNmYTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9UZXh0VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi0vKioKLSAqIENvbGxlY3Rpb24gb2YgdGV4dCBmdW5jdGlvbnMuCi0gKiBAZGVwcmVjYXRlZCAtIHRoZSBKRmFjZSBjbGFzcyBpcyBwdWJsaWMgaW4gMy4xCi0gKi8KLS8vIFRoaXMgY2xhc3Mgd2FzIG9yaWdpbmFsbHkgY29waWVkIGZyb20gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwgYW5kIG1hZGUKLS8vIHB1YmxpYwotcHVibGljIGNsYXNzIFRleHRVdGlsaXRpZXMgewotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdGV4dCBlbmRzIHdpdGggb25lIG9mIHRoZSBnaXZlbiBzZWFyY2ggc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5kc1dpdGgoU3RyaW5nW10gc2VhcmNoU3RyaW5ncywgU3RyaW5nIHRleHQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGV4dC5lbmRzV2l0aChzZWFyY2hTdHJpbmdzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcG9zaXRpb24gaW4gdGhlIHN0cmluZyBncmVhdGVyIHRoYW4gb2Zmc2V0IG9mIHRoZSBsb25nZXN0Ci0JICogbWF0Y2hpbmcgc2VhcmNoIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGluZGV4T2YoU3RyaW5nW10gc2VhcmNoU3RyaW5ncywgU3RyaW5nIHRleHQsIGludCBvZmZzZXQpIHsKLQotCQlpbnRbXSByZXN1bHQgPSB7LTEsIC0xfTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlYXJjaFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWludCBpbmRleCA9IHRleHQuaW5kZXhPZihzZWFyY2hTdHJpbmdzW2ldLCBvZmZzZXQpOwotCQkJaWYgKGluZGV4ID49IDApIHsKLQotCQkJCWlmIChyZXN1bHRbMF0gPT0gLTEpIHsKLQkJCQkJcmVzdWx0WzBdID0gaW5kZXg7Ci0JCQkJCXJlc3VsdFsxXSA9IGk7Ci0JCQkJfSBlbHNlIGlmIChpbmRleCA8IHJlc3VsdFswXSkgewotCQkJCQlyZXN1bHRbMF0gPSBpbmRleDsKLQkJCQkJcmVzdWx0WzFdID0gaTsKLQkJCQl9IGVsc2UgaWYgKGluZGV4ID09IHJlc3VsdFswXSAmJiBzZWFyY2hTdHJpbmdzW2ldLmxlbmd0aCgpID4gc2VhcmNoU3RyaW5nc1tyZXN1bHRbMV1dLmxlbmd0aCgpKSB7Ci0JCQkJCXJlc3VsdFswXSA9IGluZGV4OwotCQkJCQlyZXN1bHRbMV0gPSBpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvVVJJUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9VUklSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjI1OWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9VUklSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICogCi0gKiBTaG91bGQgdXNlIGV4dGVuc2libGUgVVJJUmVzb2x2ZXIgZnJvbSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyCi0gKiBpbnN0ZWFkLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgVVJJUmVzb2x2ZXIgewotCi0JU3RyaW5nIGdldEZpbGVCYXNlTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIChwb3NzaWJseSByZWxhdGl2ZSkgVVJJIGFjb3JkaW5nIHRvIFJGQzE4MDggdXNpbmcgdGhlCi0JICogZGVmYXVsdCBmaWxlIGJhc2UgbG9jYXRpb24uIFJlc29sdmVzIHJlc291cmNlIHJlZmVyZW5jZXMgaW50byBhYnNvbHV0ZQotCSAqIHJlc291cmNlIGxvY2F0aW9ucyB3aXRob3V0IGVuc3VyaW5nIHRoYXQgdGhlIHJlc291cmNlIGFjdHVhbGx5IGV4aXN0cy4KLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIChwb3NzaWJseSByZWxhdGl2ZSkgVVJJIGFjb3JkaW5nIHRvIFJGQzE4MDggdXNpbmcgdGhlCi0JICogZGVmYXVsdCBmaWxlIGJhc2UgbG9jYXRpb24uIFJlc29sdmVzIHJlc291cmNlIHJlZmVyZW5jZXMgaW50byBhYnNvbHV0ZQotCSAqIHJlc291cmNlIGxvY2F0aW9ucyB3aXRob3V0IGVuc3VyaW5nIHRoYXQgdGhlIHJlc291cmNlIGFjdHVhbGx5IGV4aXN0cy4KLQkgKiAKLQkgKiBJZiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MgaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbAotCSAqIHByb3Blcmx5IHJlc29sdmUgdGhlIFVSSSBpZiBpdCBpcyBhIHZhbGlkIFVSSSB0byBhbm90aGVyIChhcHByb3ByaWF0ZSkKLQkgKiBwcm9qZWN0LgotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKTsKLQotCS8qKgotCSAqIFBlcmZvcm0gdGhlIGdldExvY2F0aW9uQnlVUkkgYWN0aW9uIHVzaW5nIHRoZSBiYXNlUmVmZXJlbmNlIGFzIHRoZQotCSAqIHBvaW50IG9mIHJlZmVyZW5jZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGZvciB0aGlzIHJlc29sdmVyCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UpOwotCi0JLyoqCi0JICogUGVyZm9ybSB0aGUgZ2V0TG9jYXRpb25CeVVSSSBhY3Rpb24gdXNpbmcgdGhlIGJhc2VSZWZlcmVuY2UgYXMgdGhlCi0JICogcG9pbnQgb2YgcmVmZXJlbmNlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9yIHRoaXMgcmVzb2x2ZXIKLQkgKiAKLQkgKiBJZiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MgaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbAotCSAqIHByb3Blcmx5IHJlc29sdmUgdGhlIFVSSSBpZiBpdCBpcyBhIHZhbGlkIFVSSSB0byBhbm90aGVyIChhcHByb3ByaWF0ZSkKLQkgKiBwcm9qZWN0LgotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlLCBib29sZWFuIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyk7Ci0KLQlJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQlJQ29udGFpbmVyIGdldFJvb3RMb2NhdGlvbigpOwotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gcmV0dXJuIGEgZGlyZWN0IGlucHV0c3RyZWFtIHRvIHRoZSBnaXZlbiBVUkkgd2hpY2ggbXVzdCBiZQotCSAqIHJlbGF0aXZlIHRvIHRoZSBkZWZhdWx0IHBvaW50IG9mIHJlZmVyZW5jZS4KLQkgKiAKLQkgKi8KLQlJbnB1dFN0cmVhbSBnZXRVUklTdHJlYW0oU3RyaW5nIHVyaSk7Ci0KLQl2b2lkIHNldEZpbGVCYXNlTG9jYXRpb24oU3RyaW5nIG5ld0xvY2F0aW9uKTsKLQotCXZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBuZXdQcm9qZWN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1V0aWxpdGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1V0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTFjNWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9VdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5CdWZmZXJlZExpbWl0ZWRTdHJlYW07Ci0KLQotCi1wdWJsaWMgY2xhc3MgVXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIGEgY29tbW9uIGNhbGN1bGF0aW9uIGluIHNvbWUgb2YgdGhlIHBhcnNpbmcgbWV0aG9kcyAoZS5nLiBpbgotCSAqIENvbnRleHRSZWdpb24gYW5kIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShTdHJpbmcgY2hhbmdlcywgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBkZXRlcm1pbmUgdGhlIGxlbmd0aCBieSB0aGUgdGV4dCBpdHNlbGYsIG9yLCBpZiB0aGVyZSBpcyBubyB0ZXh0IHRvCi0JCS8vIGluc2VydCAoaS5lLiB3ZSBhcmUgZG9pbmcgYSBkZWxldGUpIHRoZW4gY2FsY3VsYXRlIHRoZSBsZW5ndGggYXMKLQkJLy8gYSBuZWdhdGl2ZSBudW1iZXIgdG8gZGVub3RlIHRoZSBhbW91bnQgdG8gZGVsZXRlLgotCQkvLyBGb3IgYSBzdHJhaWdodCBpbnNlcnQsIHRoZSBzZWxlY3Rpb24gTGVuZ3RoIHdpbGwgYmUgemVyby4KLQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSAwOwotCQlpZiAoY2hhbmdlcyA9PSBudWxsKSB7Ci0JCQkvLyB0aGUgZGVsZXRlIGNhc2UKLQkJCWxlbmd0aERpZmZlcmVuY2UgPSAwIC0gbGVuZ3RoVG9SZXBsYWNlOwotCQl9Ci0JCWVsc2UgewotCQkJbGVuZ3RoRGlmZmVyZW5jZSA9IGNoYW5nZXMubGVuZ3RoKCkgLSBsZW5ndGhUb1JlcGxhY2U7Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImxlbmd0aERpZmZlcmVuY2U6ICIgKyBsZW5ndGhEaWZmZXJlbmNlKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGxlbmd0aERpZmZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmZiBib3RoIHBhcmFtZXRlcnMgYXJlIG5vdCBudWxsIGFuZCB0aGUgb2JqZWN0IGlzIHdpdGhpbgotCSAqIHRoZSBhcnJheS4gQ2FyZWZ1bCwgdGhpcyB1c2VzIGlkZW50aXR5LiBOb3QgZ29vZCBmb3IgYmFzaWMgc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0W10gb2JqZWN0QXJyYXksIE9iamVjdCBvYmplY3QpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgb2JqZWN0IG9yIG9iamVjdEFycmF5IGlzIG51bGwsIHJldHVybiBmYWxzZQotCQlpZiAoKG9iamVjdEFycmF5ICE9IG51bGwpICYmIChvYmplY3QgIT0gbnVsbCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0QXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAob2JqZWN0QXJyYXlbaV0gPT0gb2JqZWN0KSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc1N0cmluZyhTdHJpbmdbXSBvYmplY3RBcnJheSwgU3RyaW5nIG9iamVjdCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiBvYmplY3Qgb3Igb2JqZWN0QXJyYXkgaXMgbnVsbCwgcmV0dXJuIGZhbHNlCi0JCWlmICgob2JqZWN0QXJyYXkgIT0gbnVsbCkgJiYgKG9iamVjdCAhPSBudWxsKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChvYmplY3RBcnJheVtpXS5lcXVhbHMob2JqZWN0KSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgYW4gSW5wdXRTdHJlYW0gaGFzIG1hcmsvcmVzZXQgc3VwcG9ydCwgaXMgcmVhZGxpbWl0IGlzCi0JICogc2V0LCBhbmQgdGhhdCB0aGUgc3RyZWFtIGlzICJsaW1pdGFibGUiICh0aGF0IGlzLCByZXBvcnRzICJlbmQgb2YKLQkgKiBpbnB1dCIgcmF0aGVyIHRoYW4gYWxsb3cgZ29pbmcgcGFzdCBtYXJrKS4gVGhpcyBpcyB2ZXJ5IHNwZWNpYWxpemVkCi0JICogc3RyZWFtIGludHJvZHVjZWQgdG8gb3ZlcmNvbWUKLQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjcyMTEuIFNlZSBhbHNvCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY4NTY1Ci0JICovCi0JcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRMaW1pdGVkU3RyZWFtKElucHV0U3RyZWFtIG9yaWdpbmFsKSB7Ci0JCWlmIChvcmlnaW5hbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvcmlnaW5hbCBpbnN0YW5jZW9mIEJ1ZmZlcmVkTGltaXRlZFN0cmVhbSkKLQkJCXJldHVybiBvcmlnaW5hbDsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZExpbWl0ZWRTdHJlYW0ob3JpZ2luYWwsIENvZGVkSU8uTUFYX0JVRl9TSVpFKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFbnN1cmVzIHRoYXQgYW4gSW5wdXRTdHJlYW0gaGFzIG1hcmsvcmVzZXQgc3VwcG9ydC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSXQncyB2aXRhbCB0aGF0IGEgQnVmZmVyZWRJbnB1dFN0cmVhbSA8Yj5ub3Q8L2I+IGJlIHdyYXBwZWQgaW4gYW5vdGhlcgotCSAqIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYXMgZWFjaCBjYW4gcHJlZW1wdGl2ZWx5IGNvbnN1bWUgPGk+bjwvaT4gYnl0ZXMKLQkgKiAoZS5nLiAyMDQ4KSBmcm9tIHRoZSBwYXJlbnQgc3RyZWFtIGJlZm9yZSBhbnkgcmVxdWVzdHMgYXJlIG1hZGUuIFRoZQotCSAqIGNhc2NhZGluZyBlZmZlY3QgaXMgdGhhdCB0aGUgc2Vjb25kL2lubmVyIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gY2FuIG5ldmVyCi0JICogcmV3aW5kIGl0c2VsZiB0byB0aGUgZmlyc3QgPGk+bjwvaT4gYnl0ZXMgc2luY2UgdGhleSB3ZXJlIGFscmVhZHkKLQkgKiBjb25zdW1lZCBieSBpdHMgcGFyZW50LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oSW5wdXRTdHJlYW0gb3JpZ2luYWwpIHsKLQkJaWYgKG9yaWdpbmFsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9yaWdpbmFsLm1hcmtTdXBwb3J0ZWQoKSkKLQkJCXJldHVybiBvcmlnaW5hbDsKLQkJSW5wdXRTdHJlYW0gYnVmZmVyZWQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShvcmlnaW5hbCwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQlidWZmZXJlZC5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCXJldHVybiBidWZmZXJlZDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGZvciBsb2cvdHJhY2UgbWVzc2FnZXMuIElkIGlzIGFzc3VtZWQgdG8gYmUgc29tZSBmb3JtIG9mIGEKLQkgKiBmaWxlbmFtZS4gU2VlIElNb2RlbE1hbmFnZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVNob3J0SWQoT2JqZWN0IGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJaWQgPSAiTk9JRCI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgd2hvbGUgPSBpZC50b1N0cmluZygpOwotCQlTdHJpbmcgcGFydCA9IHdob2xlLnN1YnN0cmluZyh3aG9sZS5sYXN0SW5kZXhPZigiLyIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuICIuLi4iICsgcGFydDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVXRpbGl0aWVzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFV0aWxpdGllcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9ySW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2YjkyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9ySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRXJyb3JJbmZvIHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGludCgpOwotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKTsKLQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCk7Ci0KLQlwdWJsaWMgaW50IGdldFN0YXRlKCk7Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0VGFyZ2V0VHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzYwMjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRSZXBvcnRlcihWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIpOwotCi0JLyoqCi0JICovCi0Jdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjJmNjA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25NZXNzYWdlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJR05PUkUgPSAtMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT1JNQVRJT04gPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSAyOwotCXByaXZhdGUgaW50IGxlbmd0aDsKLQotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0JcHJpdmF0ZSBpbnQgb2Zmc2V0OwotCXByaXZhdGUgaW50IHNldmVyaXR5OwotCi0JLyoqCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25NZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgb2Zmc2V0LCBpbnQgc2V2ZXJpdHkpIHsKLQkJdGhpcyhtZXNzYWdlLCBvZmZzZXQsIDAsIHNldmVyaXR5KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBzZXZlcml0eSkgewotCQlzdXBlcigpOwotCi0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQkJdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gdGhpcy5tZXNzYWdlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIHRoaXMuc2V2ZXJpdHk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uUmVwb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvblJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTA2YjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXBvcnRlciB7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlcG9ydChWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlKTsKLQkKLQl2b2lkIHJlcG9ydChFcnJvckluZm8gaW5mbyk7Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRvckdyb3VwTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzRjMjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVZhbGlkYXRvckdyb3VwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yR3JvdXBMaXN0ZW5lciBpbXBsZW1lbnRzIElWYWxpZGF0b3JHcm91cExpc3RlbmVyIHsKLQotCU1hcCBmRGlhZ25vc3RpY01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWcgPSBmYWxzZTsKLQotCXB1YmxpYyBWYWxpZGF0b3JHcm91cExpc3RlbmVyKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXN1cGVyLmZpbmFsaXplKCk7Ci0JCWlmIChmRGlhZ25vc3RpY01hcCAhPSBudWxsICYmICFmRGlhZ25vc3RpY01hcC5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIHBhdGhzID0gZkRpYWdub3N0aWNNYXAua2V5U2V0KCkudG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiTGVha2VkIG1vZGVsOiAiICsgcGF0aHNbaV0pOwotCQkJCXZhbGlkYXRpb25GaW5pc2hpbmcoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKChJUGF0aCkgcGF0aHNbaV0pLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRpb25GaW5pc2hpbmcoSVJlc291cmNlIHJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSkgewotCQlpZiAoX2RlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaW5pc2hpbmc6IiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSAoSVN0cnVjdHVyZWRNb2RlbCkgZkRpYWdub3N0aWNNYXAucmVtb3ZlKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uU3RhcnRpbmcoSVJlc291cmNlIHJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSkgewotCQlpZiAoX2RlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZzogIiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCQl0cnkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiAhbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCQkJLy8gcG9zc2libGUgd2hlbiBzaHV0dGluZyBkb3duCi0JCQkJaWYgKG1vZGVsTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJZkRpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLmdldEZ1bGxQYXRoKCksIG1vZGVsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxY2ZjMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbmluZyBmb3IgU3RydWN0dXJlZERvY3VtZW50cy4KLSAqIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFBhcnRpdGlvbnMgewotCi0JU3RyaW5nIERFRkFVTFRfUEFSVElUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuU1RfREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVU5LTk9XTl9QQVJUSVRJT04gPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5VTktOT1dOX1BBUlRJVElPTl9UWVBFIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91dGlscy9TdHJpbmdVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91dGlscy9TdHJpbmdVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmRjYTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbHMvU3RyaW5nVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChJbnRhbGlvKSAtIGJ1ZyAzMDA0MzAgLSBTdHJpbmcgY29uY2F0ZW5hdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBTdHJpbmdVdGlscyB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1QRVJTVEFORCA9ICImIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFNUEVSU1RBTkRfRU5USVRZID0gIiYmOyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVJSSUFHRV9SRVRVUk4gPSAiXHIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FSUklBR0VfUkVUVVJOX0VOVElUWSA9ICJcXHIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSAiXHIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JMRiA9ICJcclxuIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElNSVRFUlMgPSAiIFx0XG5cclxmIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9RVU9URSA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgRE9VQkxFX1FVT1RFX0NIQVIgPSAnXCInOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFX0VOVElUWSA9ICImcXVvdDsiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUVVBTF9TSUdOID0gIj0iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVQUxfU0lHTl9FTlRJVFkgPSAiJiM2MTsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUFURVJfVEhBTiA9ICI+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUFURVJfVEhBTl9FTlRJVFkgPSAiJmd0OyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMRVNTX1RIQU4gPSAiPCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMRVNTX1RIQU5fRU5USVRZID0gIiZsdDsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEYgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9GRUVEID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfRkVFRF9FTlRJVFkgPSAiXFxuIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfRkVFRF9UQUcgPSAiPGRsPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1RBQiA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1RBQl9FTlRJVFkgPSAiXFx0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfVEFCX1RBRyA9ICI8ZGQ+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9RVU9URSA9ICInIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBTSU5HTEVfUVVPVEVfQ0hBUiA9ICdcJyc7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEVfRU5USVRZID0gIiYjMDM5OyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFX0VOVElUWSA9ICImbmJzcDsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFwcGVuZCBhcHBlbmRTdHJpbmcgdG8gdGhlIGVuZCBvZiBhU3RyaW5nIG9ubHkgaWYgYVN0cmluZyBkb2VzIG5vdCBlbmQKLQkgKiB3aXRoIHRoZSBpbnNlcnRTdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwZW5kSWZOb3RFbmRXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgYXBwZW5kU3RyaW5nKSB7Ci0JCWlmICgoYVN0cmluZyAhPSBudWxsKSAmJiAoYXBwZW5kU3RyaW5nICE9IG51bGwpKQotCQkJaWYgKGFTdHJpbmcuZW5kc1dpdGgoYXBwZW5kU3RyaW5nKSkKLQkJCQlyZXR1cm4gYVN0cmluZzsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gYVN0cmluZyArIGFwcGVuZFN0cmluZzsKLQkJZWxzZQotCQkJcmV0dXJuIGFTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQnJlYWtzIG91dCBzcGFjZS1zZXBhcmF0ZWQgd29yZHMgaW50byBhbiBhcnJheSBvZiB3b3Jkcy4gRm9yIGV4YW1wbGU6Ci0JICogPGNvZGU+Im5vIGNvbW1lbnQiPC9jb2RlPiBpbnRvIGFuIGFycmF5IDxjb2RlPmFbMF09Im5vIjwvY29kZT4gYW5kCi0JICogPGNvZGU+YVsxXT0gImNvbW1lbnQiPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiB3b3JkcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gYXNBcnJheShTdHJpbmcgdmFsdWUpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSk7Ci0JCXdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJbGlzdC5hZGQoc3Rvay5uZXh0VG9rZW4oKSk7Ci0JCX0KLQkJU3RyaW5nIHJlc3VsdFtdID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEJyZWFrcyBvdXQgZGVsaW0tc2VwYXJhdGVkIHdvcmRzIGludG8gYW4gYXJyYXkgb2Ygd29yZHMuIEZvciBleGFtcGxlOgotCSAqIDxjb2RlPiJubyBjb21tZW50IjwvY29kZT4gaW50byBhbiBhcnJheSA8Y29kZT5hWzBdPSJubyI8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmFbMV09ICJjb21tZW50IjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygd29yZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGFzQXJyYXkoU3RyaW5nIHZhbHVlLCBTdHJpbmcgZGVsaW0pIHsKLQkJcmV0dXJuIGFzQXJyYXkodmFsdWUsIGRlbGltLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQnJlYWtzIG91dCBkZWxpbS1zZXBhcmF0ZWQgd29yZHMgaW50byBhbiBhcnJheSBvZiB3b3Jkcy4gRm9yIGV4YW1wbGU6Ci0JICogPGNvZGU+Im5vIGNvbW1lbnQiPC9jb2RlPiBpbnRvIGFuIGFycmF5IDxjb2RlPmFbMF09Im5vIjwvY29kZT4gYW5kCi0JICogPGNvZGU+YVsxXT0gImNvbW1lbnQiPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiB3b3JkcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gYXNBcnJheShTdHJpbmcgdmFsdWUsIFN0cmluZyBkZWxpbSwgYm9vbGVhbiByZXR1cm5Ub2tlbnMpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgZGVsaW0sIHJldHVyblRva2Vucyk7Ci0JCXdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJbGlzdC5hZGQoc3Rvay5uZXh0VG9rZW4oKSk7Ci0JCX0KLQkJU3RyaW5nIHJlc3VsdFtdID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEJyZWFrcyBvdXQgZGVsaW0tc2VwYXJhdGVkIHdvcmRzIGludG8gYW4gYXJyYXkgb2Ygd29yZHMuIEZvciBleGFtcGxlOgotCSAqIDxjb2RlPiJhYmMsLGRlZiI8L2NvZGU+IGludG8gYW4gYXJyYXkgPGNvZGU+YVswXT0iYWJjIjwvY29kZT4sCi0JICogPGNvZGU+YVsxXT1udWxsPC9jb2RlPiwgYW5kIDxjb2RlPmFbMl09ICJkZWYiPC9jb2RlPiB3aGVyZSAiLCIgaXMKLQkgKiB0aGUgZGVsaW0uCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygd29yZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGFzRml4ZWRBcnJheShTdHJpbmcgdmFsdWUsIFN0cmluZyBkZWxpbSkgewotCQlTdHJpbmcgYXJyYXlbXSA9IGFzQXJyYXkodmFsdWUsIGRlbGltLCB0cnVlKTsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlib29sZWFuIHN0cmluZ0ZvdW5kID0gZmFsc2U7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHRva2VuID0gYXJyYXlbaV07Ci0JCQlpZiAodG9rZW4uY29tcGFyZVRvKGRlbGltKSA9PSAwKSB7Ci0JCQkJaWYgKCFzdHJpbmdGb3VuZCkKLQkJCQkJbGlzdC5hZGQobnVsbCk7Ci0JCQkJc3RyaW5nRm91bmQgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWxpc3QuYWRkKHRva2VuKTsKLQkJCQlzdHJpbmdGb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gYWRkIG9uZSBtb3JlIG51bGwgaWYgbGFzdCB0b2tlbiBpcyB0aGUgZGVsaW0KLQkJaWYgKCFzdHJpbmdGb3VuZCkKLQkJCWxpc3QuYWRkKG51bGwpOwotCi0JCVN0cmluZyByZXN1bHRbXSA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaG9wKFN0cmluZyBzb3VyY2UpIHsKLQkJcmV0dXJuIGNob3Aoc291cmNlLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hvcChTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBzb3VyY2Uuc3Vic3RyaW5nKDAsIHNvdXJjZS5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nW10gYXJyYXlPZlN0cmluZ3MsIFN0cmluZyBuZWVkbGUsIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAobmVlZGxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChhcnJheU9mU3RyaW5ncyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChjYXNlU2Vuc2l0aXZlKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5T2ZTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG5lZWRsZS5lcXVhbHMoYXJyYXlPZlN0cmluZ3NbaV0pKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlPZlN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAobmVlZGxlLmVxdWFsc0lnbm9yZUNhc2UoYXJyYXlPZlN0cmluZ3NbaV0pKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0xldHRlcnMoU3RyaW5nIGZ1bGxWYWx1ZSkgewotCi0JCWlmIChmdWxsVmFsdWUgPT0gbnVsbCB8fCBmdWxsVmFsdWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQljaGFyW10gY2hhcnMgPSBmdWxsVmFsdWUudG9DaGFyQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmdWxsVmFsdWUubGVuZ3RoKCk7IGkrKykKLQkJCWlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoY2hhcnNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNMaW5lRGVsaW1pdGVyKFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBpbmRleE9mTGluZURlbGltaXRlcihhU3RyaW5nKSAhPSAtMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0TGluZURlbGltaXRlcnMoU3RyaW5nIGFsbFRleHQsIFN0cmluZyBsaW5lRGVsaW1pdGVyVG9Vc2UpIHsKLQkJSURvY3VtZW50IHRlbXBEb2MgPSBuZXcgRG9jdW1lbnQoYWxsVGV4dCk7Ci0KLQkJaWYgKGxpbmVEZWxpbWl0ZXJUb1VzZSA9PSBudWxsKQotCQkJbGluZURlbGltaXRlclRvVXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIG5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbGluZUNvdW50ID0gdGVtcERvYy5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIobmV3VGV4dCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uIGxpbmVJbmZvID0gdGVtcERvYy5nZXRMaW5lSW5mb3JtYXRpb24oaSk7Ci0JCQkJaW50IGxpbmVTdGFydE9mZnNldCA9IGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJCWludCBsaW5lTGVuZ3RoID0gbGluZUluZm8uZ2V0TGVuZ3RoKCk7Ci0JCQkJaW50IGxpbmVFbmRPZmZzZXQgPSBsaW5lU3RhcnRPZmZzZXQgKyBsaW5lTGVuZ3RoOwotCQkJCXNiLmFwcGVuZChhbGxUZXh0LnN1YnN0cmluZyhsaW5lU3RhcnRPZmZzZXQsIGxpbmVFbmRPZmZzZXQpKTsKLQotCQkJCWlmICgoaSA8IGxpbmVDb3VudCAtIDEpICYmICh0ZW1wRG9jLmdldExpbmVEZWxpbWl0ZXIoaSkgIT0gbnVsbCkpIHsKLQkJCQkJc2IuYXBwZW5kKGxpbmVEZWxpbWl0ZXJUb1VzZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQluZXdUZXh0ID0gc2IudG9TdHJpbmcoKTsKLQotCQlyZXR1cm4gbmV3VGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBhbGwgaW5zdGFuY2VzIG9mIHNwZWNpYWwgSFRNTCBjaGFyYWN0ZXJzIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0JICogSFRNTCBlbnRpdHkgZXF1aXZhbGVudC4gV0FSTklORyBvbmx5IHVzZSB0aGlzIG1ldGhvZCBmb3Igc3RyaW5ncyB0aGF0Ci0JICogZG9udCBhbHJlYWR5IGhhdmUgSFRNTC1zcGVjaWZpYyBpdGVtcyBzdWNoIGFzIHRhZ3MgYW5kIGVudGl0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgU3RyaW5nIHRvIGNvbnZlcnQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgY29udmVydGVkIHN0cmluZwotCSAqIEBzZWUgSFRNTFByaW50ZXIjY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgQU1QRVJTVEFORCwgQU1QRVJTVEFORF9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMRVNTX1RIQU4sIExFU1NfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBHUkVBVEVSX1RIQU4sIEdSRUFURVJfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMSU5FX0ZFRUQsIExJTkVfRkVFRF9UQUcpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMSU5FX1RBQiwgTElORV9UQUJfVEFHKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgU0lOR0xFX1FVT1RFLCBTSU5HTEVfUVVPVEVfRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgRE9VQkxFX1FVT1RFLCBET1VCTEVfUVVPVEVfRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgU1BBQ0UgKyBTUEFDRSwgU1BBQ0VfRU5USVRZICsgU1BBQ0VfRU5USVRZKTsgLy8gcmVwbGFjaW5nCi0JCS8vIGV2ZXJ5Ci0JCS8vIHNwYWNlCi0JCS8vIHdvdWxkCi0JCS8vIGJlCi0JCS8vIHRvbwotCQkvLyBtdWNoCi0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgc3RyaW5nIGludG8gYSBmb3JtIHRoYXQgd2lsbCBub3QgY29uZmxpY3Qgd2l0aCBzYXZpbmcgaXQKLQkgKiBpbnRvIGFuIElOSSBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBub3JtYWxTdHJpbmcpIHsKLQkJaWYgKG5vcm1hbFN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBlc2NhcGVkQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5vcm1hbFN0cmluZywgRVFVQUxfU0lHTiArIExJTkVfRkVFRCArIENBUlJJQUdFX1JFVFVSTiArIExJTkVfVEFCLCB0cnVlKTsKLQkJU3RyaW5nIGNodW5rID0gbnVsbDsKLQkJd2hpbGUgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJY2h1bmsgPSB0b2tlci5uZXh0VG9rZW4oKTsKLQkJCWlmIChjaHVuay5lcXVhbHMoRVFVQUxfU0lHTikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChFUVVBTF9TSUdOX0VOVElUWSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjaHVuay5lcXVhbHMoTElORV9GRUVEKSkgewotCQkJCWVzY2FwZWRCdWZmZXIuYXBwZW5kKExJTkVfRkVFRF9FTlRJVFkpOwotCQkJfQotCQkJZWxzZSBpZiAoY2h1bmsuZXF1YWxzKENBUlJJQUdFX1JFVFVSTikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChDQVJSSUFHRV9SRVRVUk5fRU5USVRZKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNodW5rLmVxdWFscyhMSU5FX1RBQikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChMSU5FX1RBQl9FTlRJVFkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZXNjYXBlZEJ1ZmZlci5hcHBlbmQoY2h1bmspOwotCQkJfQotCQl9Ci0JCXJldHVybiBlc2NhcGVkQnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZ2l2ZW4gdGV4dCB3aXRob3V0IGEgdHJhaWxpbmcgZGVsaW1pdGVyCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlyc3RMaW5lT2YoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDwgMSkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJSURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCh0ZXh0KTsKLQkJdHJ5IHsKLQkJCWludCBsaW5lTnVtYmVyID0gZG9jLmdldExpbmVPZk9mZnNldCgwKTsKLQkJCUlSZWdpb24gbGluZSA9IGRvYy5nZXRMaW5lSW5mb3JtYXRpb24obGluZU51bWJlcik7Ci0JCQlyZXR1cm4gZG9jLmdldChsaW5lLmdldE9mZnNldCgpLCBsaW5lLmdldExlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZMYXN0TGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxhc3RMaW5lRGVsaW1pdGVyKGFTdHJpbmcsIGFTdHJpbmcubGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZMYXN0TGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZywgaW50IG9mZnNldCkgewotCQlpbnQgaW5kZXggPSAtMTsKLQotCQlpZiAoYVN0cmluZyAhPSBudWxsICYmIGFTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpbmRleCA9IGFTdHJpbmcubGFzdEluZGV4T2YoQ1JMRiwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCWluZGV4ID0gYVN0cmluZy5sYXN0SW5kZXhPZihDUiwgb2Zmc2V0KTsKLQkJCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJCWluZGV4ID0gYVN0cmluZy5sYXN0SW5kZXhPZihMRiwgb2Zmc2V0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mTGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxpbmVEZWxpbWl0ZXIoYVN0cmluZywgMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZkxpbmVEZWxpbWl0ZXIoU3RyaW5nIGFTdHJpbmcsIGludCBvZmZzZXQpIHsKLQkJaW50IGluZGV4ID0gLTE7Ci0KLQkJaWYgKGFTdHJpbmcgIT0gbnVsbCAmJiBhU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJaW5kZXggPSBhU3RyaW5nLmluZGV4T2YoQ1JMRiwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCWluZGV4ID0gYVN0cmluZy5pbmRleE9mKENSLCBvZmZzZXQpOwotCQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCQkJaW5kZXggPSBhU3RyaW5nLmluZGV4T2YoTEYsIG9mZnNldCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZk5vbmJsYW5rKFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBpbmRleE9mTm9uYmxhbmsoYVN0cmluZywgMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZk5vbmJsYW5rKFN0cmluZyBhU3RyaW5nLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBpbmRleCA9IC0xOwotCi0JCWlmIChhU3RyaW5nICE9IG51bGwgJiYgYVN0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBhU3RyaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoREVMSU1JVEVSUy5pbmRleE9mKGFTdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAxKSkgPT0gLTEpIHsKLQkJCQkJaW5kZXggPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IGluc2VydFN0cmluZyB0byB0aGUgYmVnaW5uaW5nIG9mIGFTdHJpbmcgb25seSBpZiBhU3RyaW5nIGRvZXMKLQkgKiBub3Qgc3RhcnQgd2l0aCB0aGUgaW5zZXJ0U3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc2VydElmTm90U3RhcnRXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgaW5zZXJ0U3RyaW5nKSB7Ci0JCWlmICgoYVN0cmluZyAhPSBudWxsKSAmJiAoaW5zZXJ0U3RyaW5nICE9IG51bGwpKQotCQkJaWYgKGFTdHJpbmcuc3RhcnRzV2l0aChpbnNlcnRTdHJpbmcpKQotCQkJCXJldHVybiBhU3RyaW5nOwotCQkJZWxzZQotCQkJCXJldHVybiBpbnNlcnRTdHJpbmcgKyBhU3RyaW5nOwotCQllbHNlCi0JCQlyZXR1cm4gYVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNRdW90ZWQoU3RyaW5nIHN0cmluZykgewotCQlpZiAoKHN0cmluZyA9PSBudWxsKSB8fCAoc3RyaW5nLmxlbmd0aCgpIDwgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGxhc3RJbmRleCA9IHN0cmluZy5sZW5ndGgoKSAtIDE7Ci0JCWNoYXIgZmlyc3RDaGFyID0gc3RyaW5nLmNoYXJBdCgwKTsKLQkJY2hhciBsYXN0Q2hhciA9IHN0cmluZy5jaGFyQXQobGFzdEluZGV4KTsKLQotCQlyZXR1cm4gKCgoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URV9DSEFSKSAmJiAobGFzdENoYXIgPT0gU0lOR0xFX1FVT1RFX0NIQVIpKSB8fCAoKGZpcnN0Q2hhciA9PSBET1VCTEVfUVVPVEVfQ0hBUikgJiYgKGxhc3RDaGFyID09IERPVUJMRV9RVU9URV9DSEFSKSkpOwotCX0KLQotCS8qKgotCSAqIFVuaXQgdGVzdHMuCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJLy8gdGVzdFBhc3RlKCk7Ci0JCXRlc3RTdHJpcE5vbkxldHRlckRpZ2l0cygpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgbWVyZ2VkIGZvcm0gb2YgYm90aCBzdHJpbmdzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWVyZ2UoU3RyaW5nIG5ld1N0YXJ0LCBTdHJpbmcgbmV3RW5kKSB7Ci0JCVN0cmluZ1tdIHJlZ2lvbnMgPSBvdmVybGFwUmVnaW9ucyhuZXdTdGFydCwgbmV3RW5kKTsKLQkJcmV0dXJuIHJlZ2lvbnNbMF0gKyByZWdpb25zWzFdICsgcmVnaW9uc1syXTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBvY2N1cnJlbmNlc09mKFN0cmluZyBzZWFyY2hTdHJpbmcsIGNoYXIgdGFyZ2V0Q2hhcikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaW50IGxlbiA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKHRhcmdldENoYXIgPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKSkKLQkJCQlyZXN1bHQrKzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVuZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIAotCSAqIFJldHVybnMgYSAzIFN0cmluZyBhcnJheSBjb250YWluaW5nIHVuaXF1ZSB0ZXh0IGZyb20gdGhlIHN0YXJ0LAotCSAqIGR1cGxpY2F0ZWQgdGV4dCB0aGF0IG92ZXJsYXBzIHRoZSBzdGFydCBhbmQgZW5kLCBhbmQgdGhlIHVuaXF1ZSB0ZXh0Ci0JICogZnJvbSB0aGUgZW5kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG92ZXJsYXBSZWdpb25zKFN0cmluZyBzdGFydCwgU3RyaW5nIGVuZCkgewotCQlTdHJpbmdbXSByZXN1bHRzID0gbnVsbDsKLQkJaWYgKHN0YXJ0ICE9IG51bGwgJiYgZW5kID09IG51bGwpIHsKLQkJCXJlc3VsdHMgPSBuZXcgU3RyaW5nW117c3RhcnQsICIiLCAiIn07IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsIGVuZH07IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gbnVsbCAmJiBlbmQgPT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsICIifTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgIT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCi0JCQlpbnQgc3RhcnRMZW5ndGggPSBzdGFydC5sZW5ndGgoKTsKLQkJCWludCBlbmRMZW5ndGggPSBlbmQubGVuZ3RoKCk7Ci0KLQkJCWlmIChzdGFydExlbmd0aCA9PSAwIHx8IGVuZExlbmd0aCA9PSAwKSB7Ci0JCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsICIifTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHRzID0gbmV3IFN0cmluZ1szXTsKLQkJCQlTdHJpbmcgdGVzdFN0YXJ0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdGVzdEVuZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IG1lcmdlTGVuZ3RoID0gTWF0aC5taW4oc3RhcnRMZW5ndGgsIGVuZExlbmd0aCk7Ci0JCQkJYm9vbGVhbiBmaW5pc2hlZCA9IGZhbHNlOwotCQkJCXdoaWxlIChtZXJnZUxlbmd0aCA+IDAgJiYgIWZpbmlzaGVkKSB7Ci0JCQkJCXRlc3RTdGFydCA9IHN0YXJ0LnN1YnN0cmluZyhzdGFydExlbmd0aCAtIG1lcmdlTGVuZ3RoKTsKLQkJCQkJdGVzdEVuZCA9IGVuZC5zdWJzdHJpbmcoMCwgbWVyZ2VMZW5ndGgpOwotCQkJCQkvLyBjYXNlIHNlbnNpdGl2ZQotCQkJCQlpZiAodGVzdFN0YXJ0LmVxdWFscyh0ZXN0RW5kKSkgewotCQkJCQkJZmluaXNoZWQgPSB0cnVlOwotCQkJCQkJcmVzdWx0c1swXSA9IHN0YXJ0LnN1YnN0cmluZygwLCBzdGFydExlbmd0aCAtIG1lcmdlTGVuZ3RoKTsKLQkJCQkJCXJlc3VsdHNbMV0gPSBzdGFydC5zdWJzdHJpbmcoc3RhcnRMZW5ndGggLSBtZXJnZUxlbmd0aCk7Ci0JCQkJCQlyZXN1bHRzWzJdID0gZW5kLnN1YnN0cmluZyhtZXJnZUxlbmd0aCk7Ci0JCQkJCX0KLQkJCQkJbWVyZ2VMZW5ndGgtLTsKLQkJCQl9Ci0JCQkJaWYgKCFmaW5pc2hlZCkgewotCQkJCQlyZXN1bHRzWzBdID0gc3RhcnQ7Ci0JCQkJCXJlc3VsdHNbMV0gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXN1bHRzWzJdID0gZW5kOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBQYWNrcyBhbiBhcnJheSBvZiBTdHJpbmdzIGludG8gYSBzaW5nbGUgY29tbWEgZGVsaW1pdGVkIFN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5ncwotCSAqIEByZXR1cm4KLQkgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2soU3RyaW5nW10gc3RyaW5ncykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWJ1Zi5hcHBlbmQoU3RyaW5nVXRpbHMucmVwbGFjZShzdHJpbmdzW2ldLCAiLCIsICImY29tbWE7IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChpIDwgc3RyaW5ncy5sZW5ndGggLSAxKQotCQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIFBhc3RlcyB0aGUgbmV3IHRleHQgaW50byB0aGUgb2xkIGF0IHRoZSBzdGFydCBwb3NpdGlvbiwgcmVwbGFjaW5nIHRleHQKLQkgKiBpbXBsaWVkIGJ5IGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXN0ZShTdHJpbmcgb2xkVGV4dCwgU3RyaW5nIG5ld1RleHQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgc3RhcnRJbmRleCA9IHN0YXJ0OwotCQlpbnQgZW5kSW5kZXggPSBzdGFydCArIGxlbmd0aDsKLQkJaWYgKHN0YXJ0SW5kZXggPiBvbGRUZXh0Lmxlbmd0aCgpKSB7Ci0JCQlzdGFydEluZGV4ID0gb2xkVGV4dC5sZW5ndGgoKTsKLQkJfQotCQlzYi5hcHBlbmQob2xkVGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCkpOwotCQkvLyBudWxsIG9yIGVtcHR5IG5ldyB0ZXh0IGFjY29tcGxpY2hlcyBhIGRlbGV0ZQotCQlpZiAobmV3VGV4dCAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQobmV3VGV4dCk7Ci0JCX0KLQkJaWYgKGVuZEluZGV4IDwgb2xkVGV4dC5sZW5ndGgoKSkgewotCi0JCQlzYi5hcHBlbmQob2xkVGV4dC5zdWJzdHJpbmcoZW5kSW5kZXgpKTsKLQkJfQotCQlyZXN1bHQgPSBzYi50b1N0cmluZygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgbWF0Y2hpbmcgbGl0ZXJhbCBwb3J0aW9ucyBvZiBhIHN0cmluZyB3aXRoIGFub3RoZXIgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgYVN0cmluZywgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkgewotCQlpZiAoYVN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBub3JtYWxTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbGVuZ3RoID0gYVN0cmluZy5sZW5ndGgoKTsKLQkJaW50IHBvc2l0aW9uID0gMDsKLQkJaW50IHByZXZpb3VzID0gMDsKLQkJaW50IHNwYWNlciA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihub3JtYWxTdHJpbmcpOwotCQl3aGlsZSAocG9zaXRpb24gKyBzcGFjZXIgLSAxIDwgbGVuZ3RoICYmIGFTdHJpbmcuaW5kZXhPZihzb3VyY2UsIHBvc2l0aW9uKSA+IC0xKSB7Ci0JCQlwb3NpdGlvbiA9IGFTdHJpbmcuaW5kZXhPZihzb3VyY2UsIHByZXZpb3VzKTsKLQkJCXNiLmFwcGVuZChub3JtYWxTdHJpbmcpOwotCQkJc2IuYXBwZW5kKGFTdHJpbmcuc3Vic3RyaW5nKHByZXZpb3VzLCBwb3NpdGlvbikpOwotCQkJc2IuYXBwZW5kKHRhcmdldCk7Ci0JCQlwb3NpdGlvbiArPSBzcGFjZXI7Ci0JCQlwcmV2aW91cyA9IHBvc2l0aW9uOwotCQl9Ci0JCXNiLmFwcGVuZChhU3RyaW5nLnN1YnN0cmluZyhwb3NpdGlvbiwgYVN0cmluZy5sZW5ndGgoKSkpOwotCQlub3JtYWxTdHJpbmcgPSBzYi50b1N0cmluZygpOwotCi0JCXJldHVybiBub3JtYWxTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZSB0aGUgZW50aXR5IHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBkZWxpbWl0ZXJzIGluIHRleHQgd2hlcmUgdGhleQotCSAqIGhhdmUgYmVlbiByZXBsYWNlZCBieSB0aGUgcHJvcGVyIFVuaWNvZGUgdmFsdWVzIHRocm91Z2ggYSBET00gdGV4dAotCSAqIHBhcnNlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXN0b3JlTWFya2VycyhTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgY29udGVudCA9IHRleHQ7Ci0JCWNvbnRlbnQgPSByZXBsYWNlKGNvbnRlbnQsIEFNUEVSU1RBTkQsIEFNUEVSU1RBTkRfRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgTEVTU19USEFOLCBMRVNTX1RIQU5fRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgR1JFQVRFUl9USEFOLCBHUkVBVEVSX1RIQU5fRU5USVRZKTsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBleHRyYSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYW5kIHF1b3RlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwKFN0cmluZyBxdW90ZWRTdHJpbmcpIHsKLQkJaWYgKHF1b3RlZFN0cmluZyA9PSBudWxsIHx8IHF1b3RlZFN0cmluZy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIHF1b3RlZFN0cmluZzsKLQkJU3RyaW5nIHRyaW1tZWQgPSBxdW90ZWRTdHJpbmcudHJpbSgpOwotCQlpZiAodHJpbW1lZC5sZW5ndGgoKSA8IDIpCi0JCQlyZXR1cm4gcXVvdGVkU3RyaW5nOwotCi0JCWNoYXIgZmlyc3QgPSB0cmltbWVkLmNoYXJBdCgwKTsKLQkJY2hhciBuZXh0VG9MYXN0ID0gdHJpbW1lZC5jaGFyQXQodHJpbW1lZC5sZW5ndGgoKSAtIDIpOwotCQljaGFyIGxhc3QgPSB0cmltbWVkLmNoYXJBdCh0cmltbWVkLmxlbmd0aCgpIC0gMSk7Ci0KLQkJaWYgKChmaXJzdCA9PSAnXCInICYmIGxhc3QgPT0gJ1wiJyAmJiBuZXh0VG9MYXN0ICE9ICdcXCcpIHx8IChmaXJzdCA9PSAnXCcnICYmIGxhc3QgPT0gJ1wnJyAmJiBuZXh0VG9MYXN0ICE9ICdcXCcpKSB7Ci0JCQlyZXR1cm4gdHJpbW1lZC5zdWJzdHJpbmcoMSwgdHJpbW1lZC5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCXJldHVybiB0cmltbWVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHN0cmlwcyBhbnl0aGluZyBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZyB0aGF0Ci0JICogaXMgbm90IGEgbGV0dGVyIG9yIGRpZ2l0LiBJdCBpcyB1c2VkIGJ5IHNvbWUgZW5jb2RpbmcgZGV0ZWN0b3JzIHRvIGNvbWUKLQkgKiB1cCB3aXRoIHRoZSBlbmNvZGluZyBuYW1lIGZyb20gaWxsZm9ybWVkIGlucHV0IChlLmcgaW4gPD94bWwKLQkgKiBlbmNvZGluZz0iYWJjPz4gLS0gd2hlcmUgZmluYWwgcXVvdGUgaXMgbGVmdCBvZmYsIHRoZSAnPicgaXMgcmV0dXJuZWQKLQkgKiB3aXRoIHRoZSByZXN0IG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgJ2FiYycpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwTm9uTGV0dGVyRGlnaXRzKFN0cmluZyBmdWxsVmFsdWUpIHsKLQkJaWYgKGZ1bGxWYWx1ZSA9PSBudWxsIHx8IGZ1bGxWYWx1ZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZ1bGxWYWx1ZTsKLQkJaW50IGZ1bGxWYWx1ZUxlbmd0aCA9IGZ1bGxWYWx1ZS5sZW5ndGgoKTsKLQkJaW50IGZpcnN0UG9zID0gMDsKLQkJd2hpbGUgKGZpcnN0UG9zIDwgZnVsbFZhbHVlTGVuZ3RoICYmICFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGZ1bGxWYWx1ZS5jaGFyQXQoZmlyc3RQb3MpKSkgewotCQkJZmlyc3RQb3MrKzsKLQkJfQotCQlpbnQgbGFzdFBvcyA9IGZ1bGxWYWx1ZUxlbmd0aCAtIDE7Ci0JCXdoaWxlIChsYXN0UG9zID4gZmlyc3RQb3MgJiYgIUNoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoZnVsbFZhbHVlLmNoYXJBdChsYXN0UG9zKSkpIHsKLQkJCWxhc3RQb3MtLTsKLQkJfQotCQlTdHJpbmcgcmVzdWx0ID0gZnVsbFZhbHVlOwotCQlpZiAoZmlyc3RQb3MgIT0gMCB8fCBsYXN0UG9zICE9IGZ1bGxWYWx1ZUxlbmd0aCkgewotCQkJcmVzdWx0ID0gZnVsbFZhbHVlLnN1YnN0cmluZyhmaXJzdFBvcywgbGFzdFBvcyArIDEpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogU2ltaWxhciB0byBzdHJpcCwgZXhjZXB0IHF1b3RlcyBkb24ndCBuZWVkIHRvIG1hdGNoIHN1Y2ggYXMgIlVURicgaXMKLQkgKiBzdGlsbCBzdHJpcHBlZCBvZiBib3RoIHF1b3Rlcy4gKFBsdXMsIHRoaXMgb25lIGRvZXMgbm90IGRldGVjdCBlc2NhcGVkCi0JICogcXVvdGVzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwUXVvdGVzKFN0cmluZyBxdW90ZWRWYWx1ZSkgewotCQlpZiAocXVvdGVkVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBub3JtYWxseSB3aWxsIG5ldmVyIGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBibGFua3MsCi0JCS8vIGJ1dCBpZiBpdCBkb2VzLCB3ZSdsbCBkbyBsZW5pZW50IGludGVycHJldGF0aW9uCi0JCXJldHVybiBzdHJpcFF1b3Rlc0xlYXZlSW5zaWRlU3BhY2UocXVvdGVkVmFsdWUpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBMaWtlIHN0cmlwIHF1b3RlcywgZXhjZXB0IGxlYXZlcyB0aGUgc3RhcnQgYW5kIGVuZCBzcGFjZSBpbnNpZGUgdGhlCi0JICogcXVvdGVzCi0JICogCi0JICogQHBhcmFtIHF1b3RlZFZhbHVlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwUXVvdGVzTGVhdmVJbnNpZGVTcGFjZShTdHJpbmcgcXVvdGVkVmFsdWUpIHsKLQkJaWYgKHF1b3RlZFZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gbm9tYWxseSB3aWxsIG5ldmVyIGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBibGFua3MgLi4uIGJ1dCBqdXN0IGluCi0JCS8vIGNhc2UuCi0JCVN0cmluZyByZXN1bHQgPSBxdW90ZWRWYWx1ZS50cmltKCk7Ci0JCWludCBsZW4gPSByZXN1bHQubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQljaGFyIGZpcnN0Q2hhciA9IHJlc3VsdC5jaGFyQXQoMCk7Ci0JCQlpZiAoKGZpcnN0Q2hhciA9PSBTSU5HTEVfUVVPVEVfQ0hBUikgfHwgKGZpcnN0Q2hhciA9PSBET1VCTEVfUVVPVEVfQ0hBUikpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDEsIGxlbik7Ci0JCQl9Ci0JCQlsZW4gPSByZXN1bHQubGVuZ3RoKCk7Ci0JCQlpZiAobGVuID4gMCkgewotCQkJCWNoYXIgbGFzdENoYXIgPSByZXN1bHQuY2hhckF0KGxlbiAtIDEpOwotCQkJCWlmICgobGFzdENoYXIgPT0gU0lOR0xFX1FVT1RFX0NIQVIpIHx8IChsYXN0Q2hhciA9PSBET1VCTEVfUVVPVEVfQ0hBUikpIHsKLQkJCQkJcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZygwLCBsZW4gLSAxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFBhc3RlKCkgewotCQlTdHJpbmcgdGVzdFN0cmluZyA9ICJUaGUgcXVpY2sgYnJvd24gZm94IC4uLiI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKHRlc3RTdHJpbmcsIG51bGwsIDQsIDUpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKHRlc3RTdHJpbmcsIG51bGwsIDQsIDYpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKHRlc3RTdHJpbmcsICIiLCA0LCA2KSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKHRlc3RTdHJpbmcsICJmYXN0IiwgNCwgNikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbihwYXN0ZSh0ZXN0U3RyaW5nLCAiZmFzdCAiLCA0LCA2KSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKHRlc3RTdHJpbmcsICJCdXQgIiwgMCwgMCkpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbihwYXN0ZSgiIiwgImJ1cnAiLCA0LCA2KSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRlc3RTdHJpcE5vbkxldHRlckRpZ2l0cygpIHsKLQkJU3RyaW5nIHRlc3RTdHJpbmcgPSAiYWJjIjsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odGVzdFN0cmluZyArICIgLS0+IiArIHN0cmlwTm9uTGV0dGVyRGlnaXRzKHRlc3RTdHJpbmcpICsgIjwtLSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gIlwiYWJjXCIiOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gIlwiYWItYzE/IjsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odGVzdFN0cmluZyArICIgLS0+IiArIHN0cmlwTm9uTGV0dGVyRGlnaXRzKHRlc3RTdHJpbmcpICsgIjwtLSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFN0cmluZyA9ICIrKysiOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gImFiYz0iOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gImFiYyAiOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoYm9vbGVhbiBib29sZWFuVmFsdWUpIHsKLQkJaWYgKGJvb2xlYW5WYWx1ZSkKLQkJCXJldHVybiBUUlVFOwotCQllbHNlCi0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlICJlc2NhcGVkIiBjaGFycyBmcm9tIGEgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlKFN0cmluZyBhU3RyaW5nKSB7Ci0JCWlmIChhU3RyaW5nID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIG5vcm1hbFN0cmluZyA9IHJlcGxhY2UoYVN0cmluZywgRVFVQUxfU0lHTl9FTlRJVFksIEVRVUFMX1NJR04pOwotCQlub3JtYWxTdHJpbmcgPSByZXBsYWNlKG5vcm1hbFN0cmluZywgTElORV9GRUVEX0VOVElUWSwgTElORV9GRUVEKTsKLQkJbm9ybWFsU3RyaW5nID0gcmVwbGFjZShub3JtYWxTdHJpbmcsIENBUlJJQUdFX1JFVFVSTl9FTlRJVFksIENBUlJJQUdFX1JFVFVSTik7Ci0JCW5vcm1hbFN0cmluZyA9IHJlcGxhY2Uobm9ybWFsU3RyaW5nLCBMSU5FX1RBQl9FTlRJVFksIExJTkVfVEFCKTsKLQkJcmV0dXJuIG5vcm1hbFN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVFbmRPZihTdHJpbmcgbmV3U3RhcnQsIFN0cmluZyBuZXdFbmQpIHsKLQkJU3RyaW5nW10gcmVnaW9ucyA9IG92ZXJsYXBSZWdpb25zKG5ld1N0YXJ0LCBuZXdFbmQpOwotCQlyZXR1cm4gcmVnaW9uc1syXTsKLQl9Ci0KLQkvKioKLQkgKiBVbnBhY2tzIGEgY29tbWEgZGVsaW1pdGVkIFN0cmluZyBpbnRvIGFuIGFycmF5IG9mIFN0cmluZ3MKLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqIEByZXR1cm4KLQkgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdW5wYWNrKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJLy8gc2luY2Ugd2UncmUgc2VwYXJhdGluZyB0aGUgdmFsdWVzIHdpdGggJywnLCBlc2NhcGUgJywnIGluIHRoZQotCQkJLy8gdmFsdWVzCi0JCQlsaXN0LmFkZChTdHJpbmdVdGlscy5yZXBsYWNlKHRva2VyLm5leHRUb2tlbigpLCAiJmNvbW1hOyIsICIsIikudHJpbSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLQotCS8qKgotCSAqIFN0cmluZ1V0aWxzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdVdGlscygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkNDc2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU4N2Q4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWQwZTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIE1heSAxNCAyMjo0NDo0NSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OTI1YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1dlZCBKdW4gMTUgMTQ6MTQ6NDYgRURUIDIwMDUKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2ZjA4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjMwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzJhN2NkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lLCAyMDA4PC9wPgotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzCi1wbHVnLWluICgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMKLXByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YQotCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UKLUZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eQotKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91cgotdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0Ci10aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kCi1zdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQKLXBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4gSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkKLWZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCBmb3IgaW5mb3JtYXRpb25hbAotcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayB0byB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgZm9yCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotCi08aDQ+T3BlbiBNb2JpbGUgQWxsaWFuY2UgRFREczwvaDQ+Ci0KLTxwPlRoZSBwbHVnLWluIGlzIGFjY29tcGFuaWVkIGJ5IGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMKLSgmcXVvdDtXQVAgRFREcyZxdW90OykgZGVmaW5lZCBieSB0aGUgV2lyZWxlc3MgQXBwbGljYXRpb24gUHJvdG9jb2wKLShXQVApIEZvcnVtLiBUaGUgV0FQIEZvcnVtIGhhcyBub3cgYmVlbiBjb25zb2xpZGF0ZWQgaW50byB0aGUgT3BlbgotTW9iaWxlIEFsbGlhbmNlIChPTUEpLiBUaGUgV0FQIERURHMgYXJlIHRoZSBmb2xsb3dpbmcgZmlsZXMgbG9jYXRlZCBpbgotdGhlIHBsdWctaW46PC9wPgotPHVsPgotCTxsaT48c3Ryb25nPndtbDExLmR0ZDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC93bWxfMS4xLnhtbCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC93bWxfMS4xLnhtbDwvYT48L2xpPgotCTxsaT48c3Ryb25nPndtbDEzLmR0ZDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC93bWwxMy5kdGQiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQvd21sMTMuZHRkPC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+eGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQ8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQveGh0bWwtbW9iaWxlMTAuZHRkIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3hodG1sLW1vYmlsZTEwLmR0ZDwvYT48L2xpPgotPC91bD4KLQotPHA+WW91ciB1c2Ugb2YgdGhlIFdBUCBEVERzIGlzIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotb2YgdGhlIEVQTC48L3A+Ci0KLTxwPk1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFdBUCBhbmQgdGhlIE9NQSBpcyBhdmFpbGFibGUgYXQgPGEKLQlocmVmPSJodHRwOi8vd3d3Lm9wZW5tb2JpbGVhbGxpYW5jZS5vcmcvdGVjaC9hZmZpbGlhdGVzL3dhcC93YXBpbmRleC5odG1sIj5odHRwOi8vd3d3Lm9wZW5tb2JpbGVhbGxpYW5jZS5vcmcvdGVjaC9hZmZpbGlhdGVzL3dhcC93YXBpbmRleC5odG1sPC9hPi48L3A+Ci0KLTxoND5XM0MgRFREczwvaDQ+Ci0KLTxwPlRoZSBwbHVnLWluIGlzIGFjY29tcGFuaWVkIGJ5IGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMgKCZxdW90OwotVzNDIERURHMmcXVvdDspIGRlZmluZWQgYnkgdGhlIHRoZSBXM0MgRXh0ZW5zaWJsZSBIeXBlclRleHQgTWFya3VwCi1MYW5ndWFnZSAoWEhUTUwpIDEuMS4gWEhUTUwgaXMgZGVzY3JpYmVkIGF0IDxhCi0JaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS8iPmh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvPC9hPi48L3A+Ci1UaGUgVzNDIERURHMgYXJlIHRoZSBmb2xsb3dpbmcgZmlsZXMgbG9jYXRlZCBpbiB0aGUgcGx1Zy1pbjoKLTxwPgotPHVsPgotCTxsaT48c3Ryb25nPnhodG1sMTEtZmxhdC5kdGQ8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLmR0ZCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkPC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+eGh0bWwxLWZyYW1lc2V0LmR0ZDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLWZyYW1lc2V0LmR0ZCIKLQkJdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLWZyYW1lc2V0LmR0ZDwvYT48L2xpPgotCTxsaT48c3Ryb25nPnhodG1sMS1zdHJpY3Q8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIgotCQl0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZDwvYT48L2xpPgotCTxsaT48c3Ryb25nPnhodG1sMS10cmFuc2l0aW9uYWwuZHRkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIKLQkJdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQ8L2E+PC9saT4KLQk8bGk+PHN0cm9uZz54aHRtbC1iYXNpYzEwLWYuZHRkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtYmFzaWMveGh0bWwtYmFzaWMxMC5kdGQiCi0JCXRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy94aHRtbC1iYXNpYzEwLmR0ZDwvYT48L2xpPgotCTxsaT48c3Ryb25nPnhodG1sLWxhdDEuZW50PC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1sYXQxLmVudCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtbGF0MS5lbnQ8L2E+PC9saT4KLQk8bGk+PHN0cm9uZz54aHRtbC1zcGVjaWFsLmVudDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtc3BlY2lhbC5lbnQiCi0JCXRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLXNwZWNpYWwuZW50PC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+eGh0bWwtc3ltYm9sLmVudDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtc3ltYm9sLmVudCIKLQkJdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtc3ltYm9sLmVudDwvYT48L2xpPgotPC91bD4KLQotPHA+QXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNS4xMCBvZiB0aGUgRkFRIGxvY2F0ZWQgYXQgPGEKLQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL0lQUi1GQVEtMjAwMDA2MjAuaHRtbCNEVEQiCi0JdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUS0yMDAwMDYyMC5odG1sI0RURDwvYT4sCi15b3VyIHVzZSBvZiB0aGUgVzNDIERURHMgaXMgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotVzNDIFNvZnR3YXJlIExpY2Vuc2UgYSBjb3B5IG9mIHdoaWNoIGlzIGluY2x1ZGVkIGluIHRoZSBmaWxlIDxhCi0JaHJlZj0iYWJvdXRfZmlsZXMvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwLmh0bSI+YWJvdXRfZmlsZXMvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwLmh0bTwvYT4KLWFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQotCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwIgotCXRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMDwvYT4uPC9wPgotPGg0PldTREwgU2NoZW1hczwvaDQ+Ci0KLTxwPlRoZSBwbHVnLWluIGlzIGFjY29tcGFuaWVkIGJ5IGZpdmUgc2NoZW1hIGZpbGVzLiBZb3VyIHVzZSBvZiB0aGUKLWZvbGxvd2luZyBmaWxlcyBsb2NhdGVkIGluIHRoZSB4c2QgZGlyZWN0b3J5IG9mIHRoZSBwbHVnLWluOjwvcD4KLQotPHVsPgotCTxsaT48c3Ryb25nPmh0dHAueHNkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC88L2E+PC9saT4KLQk8bGk+PHN0cm9uZz5zb2FwLnhzZDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvPC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+d3NkbC54c2Q8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvPC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+d3NkbC1taW5lLnhzZDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvPC9hPjwvbGk+Ci08L3VsPgotCi08cD5pcyBnb3Zlcm5lZCBieSB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICZxdW90O0xpY2Vuc2UgZm9yCi1XU0RMIFNjaGVtYSBGaWxlcyZxdW90OyBhIGNvcHkgd2hpY2ggaXMgbG9jYXRlZCBpbiA8YQotCWhyZWY9ImFib3V0X2ZpbGVzL3dzZGwtc2NoZW1hLWZpbGVzLWxpY2Vuc2UudHh0Ij5hYm91dF9maWxlcy93c2RsLXNjaGVtYS1maWxlcy1saWNlbnNlLnR4dDwvYT4uPC9wPgotCi08cD5UaGUgZm9sbG93aW5nIGZpbGUgbG9jYXRlZCBpbiB0aGUgeHNkIGRpcmVjdG9yeSBvZiB0aGUgcGx1Zy1pbjoKLTxwPgotPHVsPgotCTxsaT48c3Ryb25nPnNvYXAtZW5jLnhzZDwvc3Ryb25nPgotPC91bD4KLQotPHA+aXMgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBXM0MgU29mdHdhcmUKLUxpY2Vuc2UgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNS4xMCBvZiB0aGUgRkFRIGxvY2F0ZWQgYXQgPGEKLQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL0lQUi1GQVEtMjAwMDA2MjAuaHRtbCNEVEQiCi0JdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUS0yMDAwMDYyMC5odG1sI0RURDwvYT4uCi1BIGNvcHkgb2YgdGhlIFczQyBTb2Z0d2FyZSBMaWNlbnNlIGlzIGxvY2F0ZWQgaW4gPGEKLQlocmVmPSJhYm91dF9maWxlcy9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAuaHRtIj5hYm91dF9maWxlcy9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAuaHRtPC9hPgotYW5kIGlzIGFsc28gYXZhaWwKLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMC5odG0gYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMmFjN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgotCi0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iSFRNTCBUaWR5LCBzZWUgd3d3LnczLm9yZyI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMF9maWxlcy9iYXNlLmNzcyI+PHRpdGxlPlczQyBJUFIgU09GVFdBUkUgTk9USUNFPC90aXRsZT48L2hlYWQ+PGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiIgdGV4dD0iIzAwMDAwMCI+Ci08aDE+VzNDPHN1cD6uPC9zdXA+IFNPRlRXQVJFIE5PVElDRSBBTkQgTElDRU5TRTwvaDE+Ci0KLTxoMz5Db3B5cmlnaHQgqSAxOTk0LTIwMDIgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvIj5Xb3JsZAotV2lkZSBXZWIgQ29uc29ydGl1bTwvYT4sICg8YSBocmVmPSJodHRwOi8vd3d3Lmxjcy5taXQuZWR1LyI+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YKLVRlY2hub2xvZ3k8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LmlucmlhLmZyLyI+SW5zdGl0dXQgTmF0aW9uYWwgZGUKLVJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWU8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LmtlaW8uYWMuanAvIj5LZWlvIFVuaXZlcnNpdHk8L2E+KS4gQWxsIFJpZ2h0cwotUmVzZXJ2ZWQuIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvPC9oMz4KLQotPHA+VGhpcyBXM0Mgd29yayAoaW5jbHVkaW5nIHNvZnR3YXJlLCBkb2N1bWVudHMsIG9yIG90aGVyIHJlbGF0ZWQKLWl0ZW1zKSBpcyBiZWluZyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgdW5kZXIgdGhlCi1mb2xsb3dpbmcgbGljZW5zZS4gQnkgb2J0YWluaW5nLCB1c2luZyBhbmQvb3IgY29weWluZyB0aGlzIHdvcmssCi15b3UgKHRoZSBsaWNlbnNlZSkgYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLCBhbmQgd2lsbAotY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9uczo8L3A+Ci0KLTxwPlBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKLWFuZCBpdHMgZG9jdW1lbnRhdGlvbiwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwmbmJzcDsgZm9yIGFueQotcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgb3Igcm95YWx0eSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdAoteW91IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBvbiBBTEwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQKLWRvY3VtZW50YXRpb24gb3IgcG9ydGlvbnMgdGhlcmVvZiwgaW5jbHVkaW5nIG1vZGlmaWNhdGlvbnMsIHRoYXQKLXlvdSBtYWtlOjwvcD4KLQotPG9sPgotPGxpPlRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZgotdGhlIHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSB3b3JrLjwvbGk+Ci0KLTxsaT5BbnkgcHJlLWV4aXN0aW5nIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBkaXNjbGFpbWVycywgbm90aWNlcywgb3IKLXRlcm1zIGFuZCBjb25kaXRpb25zLiBJZiBub25lIGV4aXN0LCBhIHNob3J0IG5vdGljZSBvZiB0aGUKLWZvbGxvd2luZyBmb3JtIChoeXBlcnRleHQgaXMgcHJlZmVycmVkLCB0ZXh0IGlzIHBlcm1pdHRlZCkgc2hvdWxkCi1iZSB1c2VkIHdpdGhpbiB0aGUgYm9keSBvZiBhbnkgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIGNvZGU6Ci0iQ29weXJpZ2h0IKkgWyRkYXRlLW9mLXNvZnR3YXJlXSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8iPldvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW08L2E+LCAoPGEgaHJlZj0iaHR0cDovL3d3dy5sY3MubWl0LmVkdS8iPk1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mCi1UZWNobm9sb2d5PC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5pbnJpYS5mci8iPkluc3RpdHV0IE5hdGlvbmFsIGRlCi1SZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlPC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5rZWlvLmFjLmpwLyI+S2VpbyBVbml2ZXJzaXR5PC9hPikuIEFsbCBSaWdodHMKLVJlc2VydmVkLiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyI8L2xpPgotCi08bGk+Tm90aWNlIG9mIGFueSBjaGFuZ2VzIG9yIG1vZGlmaWNhdGlvbnMgdG8gdGhlIFczQyBmaWxlcywKLWluY2x1ZGluZyB0aGUgZGF0ZSBjaGFuZ2VzIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZQotVVJJcyB0byB0aGUgbG9jYXRpb24gZnJvbSB3aGljaCB0aGUgY29kZSBpcyBkZXJpdmVkLik8L2xpPgotPC9vbD4KLQotPHA+VEhJUyBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMsIiBBTkQKLUNPUFlSSUdIVCBIT0xERVJTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFCi1VU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJECi1QQVJUWSBQQVRFTlRTLCBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy48L3A+Ci0KLTxwPkNPUFlSSUdIVCBIT0xERVJTIFdJTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi1TUEVDSUFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBBTlkgVVNFIE9GIFRIRQotU09GVFdBUkUgT1IgRE9DVU1FTlRBVElPTi48L3A+Ci0KLTxwPlRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIGNvcHlyaWdodCBob2xkZXJzIG1heSBOT1QgYmUgdXNlZCBpbgotYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQKLXNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodCBpbiB0aGlzCi1zb2Z0d2FyZSBhbmQgYW55IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4KLXdpdGggY29weXJpZ2h0IGhvbGRlcnMuPC9wPgotCi08cD5fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX188L3A+Ci0KLTxwPlRoaXMgZm9ybXVsYXRpb24gb2YgVzNDJ3Mgbm90aWNlIGFuZCBsaWNlbnNlIGJlY2FtZSBhY3RpdmUgb24KLUF1Z3VzdCAxNCAxOTk4IHNvIGFzIHRvIGltcHJvdmUgY29tcGF0aWJpbGl0eSB3aXRoIEdQTC4gVGhpcwotdmVyc2lvbiBlbnN1cmVzIHRoYXQgVzNDIHNvZnR3YXJlIGxpY2Vuc2luZyB0ZXJtcyBhcmUgbm8gbW9yZQotcmVzdHJpY3RpdmUgdGhhbiBHUEwgYW5kIGNvbnNlcXVlbnRseSBXM0Mgc29mdHdhcmUgbWF5IGJlCi1kaXN0cmlidXRlZCBpbiBHUEwgcGFja2FnZXMuIFNlZSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA1MTkuaHRtbCI+b2xkZXIgZm9ybXVsYXRpb248L2E+IGZvcgotdGhlIHBvbGljeSBwcmlvciB0byB0aGlzIGRhdGUuIFBsZWFzZSBzZWUgb3VyIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUS5odG1sIj5Db3B5cmlnaHQgRkFRPC9hPiBmb3IgY29tbW9uIHF1ZXN0aW9ucyBhYm91dAotdXNpbmcgbWF0ZXJpYWxzIGZyb20gb3VyIHNpdGUsIGluY2x1ZGluZyBzcGVjaWZpYyB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZm9yIHBhY2thZ2VzIGxpa2UgbGlid3d3LCBBbWF5YSwgYW5kIEppZ3Nhdy4gT3RoZXIKLXF1ZXN0aW9ucyBhYm91dCB0aGlzIG5vdGljZSBjYW4gYmUgZGlyZWN0ZWQgdG8gPGEgaHJlZj0ibWFpbHRvOnNpdGUtcG9saWN5QHczLm9yZyI+c2l0ZS1wb2xpY3lAdzMub3JnPC9hPi48YnI+Ci0mbmJzcDs8L3A+Ci0KLTxwPiZuYnNwOzwvcD4KLQotPGFkZHJlc3M+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvSGVscC9XZWJtYXN0ZXIuaHRtbCI+d2VibWFzdGVyPC9hPjxicj4KLSAobGFzdCB1cGRhdGVkICREYXRlOiAyMDA3LzA1LzE1IDAyOjQyOjI0ICQpPC9hZGRyZXNzPgotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwX2ZpbGVzL2Jhc2UuY3NzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjBfZmlsZXMvYmFzZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNTdhYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjBfZmlsZXMvYmFzZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMTk5Ny0yMDAzIFczQyAoTUlULCBFUkNJTSwgS2VpbykuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICBUaGUgZm9sbG93aW5nIHNvZnR3YXJlIGxpY2Vuc2luZyBydWxlcyBhcHBseToKLSAgIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlICovCi0KLS8qICRJZDogYmFzZS5jc3MsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyNCBkYXZpZF93aWxsaWFtcyBFeHAgJCAqLwotCi0vKiB0aGlzIHN0eWxlIHNoZWV0IGRlZmluZXMgdGhlIGJhc2ljIHN0eWxlIGZvciBhbGwgVzNDIHBhZ2VzICovCi0vKiB5b3UgY2FuIHBvaW50IHRvIHRoaXMgYnkgYWRkaW5nOgotCi0gICAgIDxMSU5LIHJlbD0iU3R5bGVzaGVldCIgaHJlZj0iL1N0eWxlU2hlZXRzL2Jhc2UiPgotCi0KLSAgIGluIHRoZSBIRUFEIG9mIHlvdXIgSFRNTCBkb2N1bWVudCAqLwotCi1ib2R5IHsKLSAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Ci0gIGNvbG9yOiBibGFjazsKLSAgYmFja2dyb3VuZDogd2hpdGU7Ci19Ci0KLWE6bGluaywgYTphY3RpdmUgewotICBjb2xvcjogIzAwZTsKLSAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Ci19Ci0KLWE6dmlzaXRlZCB7Ci0gIGNvbG9yOiAjNTI5OwotICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKLX0KLQotZGl2LmludHJvIHsKLSAgbWFyZ2luLWxlZnQ6IDUlOwotICBtYXJnaW4tcmlnaHQ6IDUlOwotICBmb250LXN0eWxlOiBpdGFsaWMKLX0KLQotcHJlIHsKLSAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZQotfQotCi1hOmxpbmsgaW1nLCBhOnZpc2l0ZWQgaW1nIHsKLSAgIGJvcmRlci1zdHlsZTogbm9uZQotfQotCi1hIGltZyB7IGNvbG9yOiB3aGl0ZTsgfSAgICAgICAgLyogaGlkZSB0aGUgYm9yZGVyIGluIE5ldHNjYXBlIDQgKi8KLUBtZWRpYSBhbGwgeyAgICAgICAgICAgICAgICAgICAvKiBoaWRlIGZyb20gTmV0c2NhcGUgNCAqLwotICBhIGltZyB7IGNvbG9yOiBpbmhlcml0OyB9ICAgIC8qIHVuZG8gdGhlIHJ1bGUgYWJvdmUgKi8KLX0KLQotdWwudG9jLCBvbC50b2MgewotICBsaXN0LXN0eWxlOiBkaXNjOwotICBsaXN0LXN0eWxlOiBub25lOwotfQotCi1kaXYuaXNzdWUgewotICBwYWRkaW5nOiAwLjVlbTsKLSAgYm9yZGVyOiBub25lOwotICBtYXJnaW4tcmlnaHQ6IDUlOwotfQotCi0uaGlkZW1lIHsgZGlzcGxheTogbm9uZSB9Ci0KLUBtZWRpYSBwcmludCB7Ci0KLSAgdGFibGUgewotICAgIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZAotICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL3dzZGwtc2NoZW1hLWZpbGVzLWxpY2Vuc2UudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy93c2RsLXNjaGVtYS1maWxlcy1saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1ZjgxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL3dzZGwtc2NoZW1hLWZpbGVzLWxpY2Vuc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotQ29weXJpZ2h0IDIwMDEgLSAyMDA1LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24KLUFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotTGljZW5zZSBmb3IgV1NETCBTY2hlbWEgRmlsZXMKLQotVGhlIEF1dGhvcnMgZ3JhbnQgcGVybWlzc2lvbiB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBXU0RMIFNjaGVtYSAKLUZpbGVzIGluIGFueSBtZWRpdW0gd2l0aG91dCBmZWUgb3Igcm95YWx0eSBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGFuZCAKLWxpY2Vuc2UgYXJlIGRpc3RyaWJ1dGVkIHdpdGggdGhlbS4gIFRoZSBvcmlnaW5hbHMgb2YgdGhlc2UgZmlsZXMgY2FuIAotYmUgbG9jYXRlZCBhdDoKLQotICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8KLSAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvCi0gICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8KLSAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvCi0gICAgCi0KLVRIRVNFIFNDSEVNQSBGSUxFUyBBUkUgUFJPVklERUQgIkFTIElTLCIgQU5EIFRIRSBBVVRIT1JTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAotT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhFU0UgRklMRVMsIElOQ0xVRElORywgQlVUIE5PVCAKLUxJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgCi1OT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLiAgVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCAKLUlORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiAKLVJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRVNFIEZJTEVTLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgCi1pbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlc2UgZmlsZXMgb3IgYW55IHByb2dyYW0gCi1vciBzZXJ2aWNlIHRoYXQgdXNlcyB0aGVzZSBmaWxlcywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGl0bGUgdG8gY29weXJpZ2h0IAotaW4gdGhlc2UgZmlsZXMgd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCi0KLU5vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTY0NTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgZHRkcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXRfZmlsZXMvLFwKLSAgICAgICAgICAgICAgIHhzZC8KLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSB4c2QvLFwKLSAgICAgICAgICAgICAgIGR0ZHMvLFwKLSAgICAgICAgICAgICAgIGFib3V0X2ZpbGVzLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvSFRNTGxhdDEuZW50IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL0hUTUxsYXQxLmVudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0NDQ4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvSFRNTGxhdDEuZW50CisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgIDwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAgICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMS8vRU4vL0hUTUwiPgotICAgICAlSFRNTGxhdDE7Ci0tLT4KLQotPCFFTlRJVFkgbmJzcCAgIENEQVRBICImIzE2MDsiIC0tIG5vLWJyZWFrIHNwYWNlID0gbm9uLWJyZWFraW5nIHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBMCBJU09udW0gLS0+Ci08IUVOVElUWSBpZXhjbCAgQ0RBVEEgIiYjMTYxOyIgLS0gaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyaywgVSswMEExIElTT251bSAtLT4KLTwhRU5USVRZIGNlbnQgICBDREFUQSAiJiMxNjI7IiAtLSBjZW50IHNpZ24sIFUrMDBBMiBJU09udW0gLS0+Ci08IUVOVElUWSBwb3VuZCAgQ0RBVEEgIiYjMTYzOyIgLS0gcG91bmQgc2lnbiwgVSswMEEzIElTT251bSAtLT4KLTwhRU5USVRZIGN1cnJlbiBDREFUQSAiJiMxNjQ7IiAtLSBjdXJyZW5jeSBzaWduLCBVKzAwQTQgSVNPbnVtIC0tPgotPCFFTlRJVFkgeWVuICAgIENEQVRBICImIzE2NTsiIC0tIHllbiBzaWduID0geXVhbiBzaWduLCBVKzAwQTUgSVNPbnVtIC0tPgotPCFFTlRJVFkgYnJ2YmFyIENEQVRBICImIzE2NjsiIC0tIGJyb2tlbiBiYXIgPSBicm9rZW4gdmVydGljYWwgYmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBNiBJU09udW0gLS0+Ci08IUVOVElUWSBzZWN0ICAgQ0RBVEEgIiYjMTY3OyIgLS0gc2VjdGlvbiBzaWduLCBVKzAwQTcgSVNPbnVtIC0tPgotPCFFTlRJVFkgdW1sICAgIENEQVRBICImIzE2ODsiIC0tIGRpYWVyZXNpcyA9IHNwYWNpbmcgZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBOCBJU09kaWEgLS0+Ci08IUVOVElUWSBjb3B5ICAgQ0RBVEEgIiYjMTY5OyIgLS0gY29weXJpZ2h0IHNpZ24sIFUrMDBBOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRmICAgQ0RBVEEgIiYjMTcwOyIgLS0gZmVtaW5pbmUgb3JkaW5hbCBpbmRpY2F0b3IsIFUrMDBBQSBJU09udW0gLS0+Ci08IUVOVElUWSBsYXF1byAgQ0RBVEEgIiYjMTcxOyIgLS0gbGVmdC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxlZnQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQUIgSVNPbnVtIC0tPgotPCFFTlRJVFkgbm90ICAgIENEQVRBICImIzE3MjsiIC0tIG5vdCBzaWduLCBVKzAwQUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2h5ICAgIENEQVRBICImIzE3MzsiIC0tIHNvZnQgaHlwaGVuID0gZGlzY3JldGlvbmFyeSBoeXBoZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFEIElTT251bSAtLT4KLTwhRU5USVRZIHJlZyAgICBDREFUQSAiJiMxNzQ7IiAtLSByZWdpc3RlcmVkIHNpZ24gPSByZWdpc3RlcmVkIHRyYWRlIG1hcmsgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUUgSVNPbnVtIC0tPgotPCFFTlRJVFkgbWFjciAgIENEQVRBICImIzE3NTsiIC0tIG1hY3JvbiA9IHNwYWNpbmcgbWFjcm9uID0gb3ZlcmxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFQTCBvdmVyYmFyLCBVKzAwQUYgSVNPZGlhIC0tPgotPCFFTlRJVFkgZGVnICAgIENEQVRBICImIzE3NjsiIC0tIGRlZ3JlZSBzaWduLCBVKzAwQjAgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGx1c21uIENEQVRBICImIzE3NzsiIC0tIHBsdXMtbWludXMgc2lnbiA9IHBsdXMtb3ItbWludXMgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjEgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMiAgIENEQVRBICImIzE3ODsiIC0tIHN1cGVyc2NyaXB0IHR3byA9IHN1cGVyc2NyaXB0IGRpZ2l0IHR3bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3F1YXJlZCwgVSswMEIyIElTT251bSAtLT4KLTwhRU5USVRZIHN1cDMgICBDREFUQSAiJiMxNzk7IiAtLSBzdXBlcnNjcmlwdCB0aHJlZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IHRocmVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjdWJlZCwgVSswMEIzIElTT251bSAtLT4KLTwhRU5USVRZIGFjdXRlICBDREFUQSAiJiMxODA7IiAtLSBhY3V0ZSBhY2NlbnQgPSBzcGFjaW5nIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCNCBJU09kaWEgLS0+Ci08IUVOVElUWSBtaWNybyAgQ0RBVEEgIiYjMTgxOyIgLS0gbWljcm8gc2lnbiwgVSswMEI1IElTT251bSAtLT4KLTwhRU5USVRZIHBhcmEgICBDREFUQSAiJiMxODI7IiAtLSBwaWxjcm93IHNpZ24gPSBwYXJhZ3JhcGggc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgbWlkZG90IENEQVRBICImIzE4MzsiIC0tIG1pZGRsZSBkb3QgPSBHZW9yZ2lhbiBjb21tYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gR3JlZWsgbWlkZGxlIGRvdCwgVSswMEI3IElTT251bSAtLT4KLTwhRU5USVRZIGNlZGlsICBDREFUQSAiJiMxODQ7IiAtLSBjZWRpbGxhID0gc3BhY2luZyBjZWRpbGxhLCBVKzAwQjggSVNPZGlhIC0tPgotPCFFTlRJVFkgc3VwMSAgIENEQVRBICImIzE4NTsiIC0tIHN1cGVyc2NyaXB0IG9uZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjkgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3JkbSAgIENEQVRBICImIzE4NjsiIC0tIG1hc2N1bGluZSBvcmRpbmFsIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQkEgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmFxdW8gIENEQVRBICImIzE4NzsiIC0tIHJpZ2h0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcmlnaHQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQkIgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzE0IENEQVRBICImIzE4ODsiIC0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgcXVhcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gb25lIHF1YXJ0ZXIsIFUrMDBCQyBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMTIgQ0RBVEEgIiYjMTg5OyIgLS0gdnVsZ2FyIGZyYWN0aW9uIG9uZSBoYWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiBvbmUgaGFsZiwgVSswMEJEIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMzNCBDREFUQSAiJiMxOTA7IiAtLSB2dWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzLCBVKzAwQkUgSVNPbnVtIC0tPgotPCFFTlRJVFkgaXF1ZXN0IENEQVRBICImIzE5MTsiIC0tIGludmVydGVkIHF1ZXN0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHR1cm5lZCBxdWVzdGlvbiBtYXJrLCBVKzAwQkYgSVNPbnVtIC0tPgotPCFFTlRJVFkgQWdyYXZlIENEQVRBICImIzE5MjsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBncmF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFhY3V0ZSBDREFUQSAiJiMxOTM7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBY2lyYyAgQ0RBVEEgIiYjMTk0OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBdGlsZGUgQ0RBVEEgIiYjMTk1OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXVtbCAgIENEQVRBICImIzE5NjsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBBcmluZyAgQ0RBVEEgIiYjMTk3OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHJpbmcgYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFFbGlnICBDREFUQSAiJiMxOTg7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBBRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIENjZWRpbCBDREFUQSAiJiMxOTk7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBDIHdpdGggY2VkaWxsYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzcgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVncmF2ZSBDREFUQSAiJiMyMDA7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFYWN1dGUgQ0RBVEEgIiYjMjAxOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWNpcmMgIENEQVRBICImIzIwMjsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgRXVtbCAgIENEQVRBICImIzIwMzsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJZ3JhdmUgQ0RBVEEgIiYjMjA0OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWFjdXRlIENEQVRBICImIzIwNTsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0QgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEljaXJjICBDREFUQSAiJiMyMDY7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0UgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEl1bWwgICBDREFUQSAiJiMyMDc7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRiBJU09sYXQxIC0tPgotPCFFTlRJVFkgRVRIICAgIENEQVRBICImIzIwODsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEVUSCwgVSswMEQwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBOdGlsZGUgQ0RBVEEgIiYjMjA5OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTiB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2dyYXZlIENEQVRBICImIzIxMDsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9hY3V0ZSBDREFUQSAiJiMyMTE7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPY2lyYyAgQ0RBVEEgIiYjMjEyOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBPdGlsZGUgQ0RBVEEgIiYjMjEzOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENSBJU09sYXQxIC0tPgotPCFFTlRJVFkgT3VtbCAgIENEQVRBICImIzIxNDsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ2IElTT2xhdDEgLS0+Ci08IUVOVElUWSB0aW1lcyAgQ0RBVEEgIiYjMjE1OyIgLS0gbXVsdGlwbGljYXRpb24gc2lnbiwgVSswMEQ3IElTT251bSAtLT4KLTwhRU5USVRZIE9zbGFzaCBDREFUQSAiJiMyMTY7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggc3Ryb2tlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHNsYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWdyYXZlIENEQVRBICImIzIxNzsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVhY3V0ZSBDREFUQSAiJiMyMTg7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBVY2lyYyAgQ0RBVEEgIiYjMjE5OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBVdW1sICAgQ0RBVEEgIiYjMjIwOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFlhY3V0ZSBDREFUQSAiJiMyMjE7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBZIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEREIElTT2xhdDEgLS0+Ci08IUVOVElUWSBUSE9STiAgQ0RBVEEgIiYjMjIyOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVEhPUk4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBzemxpZyAgQ0RBVEEgIiYjMjIzOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHNoYXJwIHMgPSBlc3MtemVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERiBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWdyYXZlIENEQVRBICImIzIyNDsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZ3JhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBhIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWFjdXRlIENEQVRBICImIzIyNTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhY2lyYyAgQ0RBVEEgIiYjMjI2OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXRpbGRlIENEQVRBICImIzIyNzsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhdW1sICAgQ0RBVEEgIiYjMjI4OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBhcmluZyAgQ0RBVEEgIiYjMjI5OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCByaW5nIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSByaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWVsaWcgIENEQVRBICImIzIzMDsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGlnYXR1cmUgYWUsIFUrMDBFNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgY2NlZGlsIENEQVRBICImIzIzMTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBjIHdpdGggY2VkaWxsYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTcgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVncmF2ZSBDREFUQSAiJiMyMzI7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWFjdXRlIENEQVRBICImIzIzMzsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlY2lyYyAgQ0RBVEEgIiYjMjM0OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgZXVtbCAgIENEQVRBICImIzIzNTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWdyYXZlIENEQVRBICImIzIzNjsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpYWN1dGUgQ0RBVEEgIiYjMjM3OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGljaXJjICBDREFUQSAiJiMyMzg7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpdW1sICAgQ0RBVEEgIiYjMjM5OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBldGggICAgQ0RBVEEgIiYjMjQwOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGV0aCwgVSswMEYwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBudGlsZGUgQ0RBVEEgIiYjMjQxOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIG4gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9ncmF2ZSBDREFUQSAiJiMyNDI7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2FjdXRlIENEQVRBICImIzI0MzsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvY2lyYyAgQ0RBVEEgIiYjMjQ0OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgb3RpbGRlIENEQVRBICImIzI0NTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdW1sICAgQ0RBVEEgIiYjMjQ2OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBkaXZpZGUgQ0RBVEEgIiYjMjQ3OyIgLS0gZGl2aXNpb24gc2lnbiwgVSswMEY3IElTT251bSAtLT4KLTwhRU5USVRZIG9zbGFzaCBDREFUQSAiJiMyNDg7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHN0cm9rZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBvIHNsYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWdyYXZlIENEQVRBICImIzI0OTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY5IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1YWN1dGUgQ0RBVEEgIiYjMjUwOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVjaXJjICBDREFUQSAiJiMyNTE7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZCIElTT2xhdDEgLS0+Ci08IUVOVElUWSB1dW1sICAgQ0RBVEEgIiYjMjUyOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZDIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5YWN1dGUgQ0RBVEEgIiYjMjUzOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRob3JuICBDREFUQSAiJiMyNTQ7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdGhvcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZFIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5dW1sICAgQ0RBVEEgIiYjMjU1OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZGIElTT2xhdDEgLS0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL0hUTUxzcGVjaWFsLmVudCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9IVE1Mc3BlY2lhbC5lbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZTVjNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL0hUTUxzcGVjaWFsLmVudAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTwhLS0gU3BlY2lhbCBjaGFyYWN0ZXJzIGZvciBIVE1MIC0tPgotCi08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgIDwhRU5USVRZICUgSFRNTHNwZWNpYWwgUFVCTElDCi0gICAgICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbC8vRU4vL0hUTUwiPgotICAgICAlSFRNTHNwZWNpYWw7IC0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIENEQVRBIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBJU08gMTA2NDYgbmFtZXMuIAotCi0tLT4KLQotPCEtLSBDMCBDb250cm9scyBhbmQgQmFzaWMgTGF0aW4gLS0+Ci08IUVOVElUWSBxdW90ICAgIENEQVRBICImIzM0OyIgICAtLSBxdW90YXRpb24gbWFyayA9IEFQTCBxdW90ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDAyMiBJU09udW0gLS0+Ci08IUVOVElUWSBhbXAgICAgIENEQVRBICImIzM4OyIgICAtLSBhbXBlcnNhbmQsIFUrMDAyNiBJU09udW0gLS0+Ci08IUVOVElUWSBsdCAgICAgIENEQVRBICImIzYwOyIgICAtLSBsZXNzLXRoYW4gc2lnbiwgVSswMDNDIElTT251bSAtLT4KLTwhRU5USVRZIGd0ICAgICAgQ0RBVEEgIiYjNjI7IiAgIC0tIGdyZWF0ZXItdGhhbiBzaWduLCBVKzAwM0UgSVNPbnVtIC0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUEgLS0+Ci08IUVOVElUWSBPRWxpZyAgIENEQVRBICImIzMzODsiICAtLSBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIE9FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTUyIElTT2xhdDIgLS0+Ci08IUVOVElUWSBvZWxpZyAgIENEQVRBICImIzMzOTsiICAtLSBsYXRpbiBzbWFsbCBsaWdhdHVyZSBvZSwgVSswMTUzIElTT2xhdDIgLS0+Ci08IS0tIGxpZ2F0dXJlIGlzIGEgbWlzbm9tZXIsIHRoaXMgaXMgYSBzZXBhcmF0ZSBjaGFyYWN0ZXIgaW4gc29tZSBsYW5ndWFnZXMgLS0+Ci08IUVOVElUWSBTY2Fyb24gIENEQVRBICImIzM1MjsiICAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBTIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjAgSVNPbGF0MiAtLT4KLTwhRU5USVRZIHNjYXJvbiAgQ0RBVEEgIiYjMzUzOyIgIC0tIGxhdGluIHNtYWxsIGxldHRlciBzIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjEgSVNPbGF0MiAtLT4KLTwhRU5USVRZIFl1bWwgICAgQ0RBVEEgIiYjMzc2OyIgIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNzggSVNPbGF0MiAtLT4KLQotPCEtLSBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMgLS0+Ci08IUVOVElUWSBjaXJjICAgIENEQVRBICImIzcxMDsiICAtLSBtb2RpZmllciBsZXR0ZXIgY2lyY3VtZmxleCBhY2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAyQzYgSVNPcHViIC0tPgotPCFFTlRJVFkgdGlsZGUgICBDREFUQSAiJiM3MzI7IiAgLS0gc21hbGwgdGlsZGUsIFUrMDJEQyBJU09kaWEgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGVuc3AgICAgQ0RBVEEgIiYjODE5NDsiIC0tIGVuIHNwYWNlLCBVKzIwMDIgSVNPcHViIC0tPgotPCFFTlRJVFkgZW1zcCAgICBDREFUQSAiJiM4MTk1OyIgLS0gZW0gc3BhY2UsIFUrMjAwMyBJU09wdWIgLS0+Ci08IUVOVElUWSB0aGluc3AgIENEQVRBICImIzgyMDE7IiAtLSB0aGluIHNwYWNlLCBVKzIwMDkgSVNPcHViIC0tPgotPCFFTlRJVFkgenduaiAgICBDREFUQSAiJiM4MjA0OyIgLS0gemVybyB3aWR0aCBub24tam9pbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDBDIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHp3aiAgICAgQ0RBVEEgIiYjODIwNTsiIC0tIHplcm8gd2lkdGggam9pbmVyLCBVKzIwMEQgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbHJtICAgICBDREFUQSAiJiM4MjA2OyIgLS0gbGVmdC10by1yaWdodCBtYXJrLCBVKzIwMEUgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgcmxtICAgICBDREFUQSAiJiM4MjA3OyIgLS0gcmlnaHQtdG8tbGVmdCBtYXJrLCBVKzIwMEYgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbmRhc2ggICBDREFUQSAiJiM4MjExOyIgLS0gZW4gZGFzaCwgVSsyMDEzIElTT3B1YiAtLT4KLTwhRU5USVRZIG1kYXNoICAgQ0RBVEEgIiYjODIxMjsiIC0tIGVtIGRhc2gsIFUrMjAxNCBJU09wdWIgLS0+Ci08IUVOVElUWSBsc3F1byAgIENEQVRBICImIzgyMTY7IiAtLSBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxOCBJU09udW0gLS0+Ci08IUVOVElUWSByc3F1byAgIENEQVRBICImIzgyMTc7IiAtLSByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2JxdW8gICBDREFUQSAiJiM4MjE4OyIgLS0gc2luZ2xlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUEgTkVXIC0tPgotPCFFTlRJVFkgbGRxdW8gICBDREFUQSAiJiM4MjIwOyIgLS0gbGVmdCBkb3VibGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmRxdW8gICBDREFUQSAiJiM4MjIxOyIgLS0gcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDFEIElTT251bSAtLT4KLTwhRU5USVRZIGJkcXVvICAgQ0RBVEEgIiYjODIyMjsiIC0tIGRvdWJsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFFIE5FVyAtLT4KLTwhRU5USVRZIGRhZ2dlciAgQ0RBVEEgIiYjODIyNDsiIC0tIGRhZ2dlciwgVSsyMDIwIElTT3B1YiAtLT4KLTwhRU5USVRZIERhZ2dlciAgQ0RBVEEgIiYjODIyNTsiIC0tIGRvdWJsZSBkYWdnZXIsIFUrMjAyMSBJU09wdWIgLS0+Ci08IUVOVElUWSBwZXJtaWwgIENEQVRBICImIzgyNDA7IiAtLSBwZXIgbWlsbGUgc2lnbiwgVSsyMDMwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsc2FxdW8gIENEQVRBICImIzgyNDk7IiAtLSBzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzOSBJU08gcHJvcG9zZWQgLS0+Ci08IS0tIGxzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkIC0tPgotPCFFTlRJVFkgcnNhcXVvICBDREFUQSAiJiM4MjUwOyIgLS0gc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDNBIElTTyBwcm9wb3NlZCAtLT4KLTwhLS0gcnNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSBldXJvICAgQ0RBVEEgIiYjODM2NDsiICAtLSBldXJvIHNpZ24sIFUrMjBBQyBORVcgLS0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL0hUTUxzeW1ib2wuZW50IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL0hUTUxzeW1ib2wuZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjRiZmUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9IVE1Mc3ltYm9sLmVudAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi08IS0tIE1hdGhlbWF0aWNhbCwgR3JlZWsgYW5kIFN5bWJvbGljIGNoYXJhY3RlcnMgZm9yIEhUTUwgLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgICAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMvL0VOLy9IVE1MIj4KLSAgICAgJUhUTUxzeW1ib2w7IC0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIENEQVRBIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBJU08gMTA2NDYgbmFtZXMuIAotCi0tLT4KLQotPCEtLSBMYXRpbiBFeHRlbmRlZC1CIC0tPgotPCFFTlRJVFkgZm5vZiAgICAgQ0RBVEEgIiYjNDAyOyIgLS0gbGF0aW4gc21hbGwgZiB3aXRoIGhvb2sgPSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmbG9yaW4sIFUrMDE5MiBJU090ZWNoIC0tPgotCi08IS0tIEdyZWVrIC0tPgotPCFFTlRJVFkgQWxwaGEgICAgQ0RBVEEgIiYjOTEzOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYWxwaGEsIFUrMDM5MSAtLT4KLTwhRU5USVRZIEJldGEgICAgIENEQVRBICImIzkxNDsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGJldGEsIFUrMDM5MiAtLT4KLTwhRU5USVRZIEdhbW1hICAgIENEQVRBICImIzkxNTsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGdhbW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzkzIElTT2dyazMgLS0+Ci08IUVOVElUWSBEZWx0YSAgICBDREFUQSAiJiM5MTY7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5NCBJU09ncmszIC0tPgotPCFFTlRJVFkgRXBzaWxvbiAgQ0RBVEEgIiYjOTE3OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXBzaWxvbiwgVSswMzk1IC0tPgotPCFFTlRJVFkgWmV0YSAgICAgQ0RBVEEgIiYjOTE4OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgemV0YSwgVSswMzk2IC0tPgotPCFFTlRJVFkgRXRhICAgICAgQ0RBVEEgIiYjOTE5OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXRhLCBVKzAzOTcgLS0+Ci08IUVOVElUWSBUaGV0YSAgICBDREFUQSAiJiM5MjA7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciB0aGV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5OCBJU09ncmszIC0tPgotPCFFTlRJVFkgSW90YSAgICAgQ0RBVEEgIiYjOTIxOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgaW90YSwgVSswMzk5IC0tPgotPCFFTlRJVFkgS2FwcGEgICAgQ0RBVEEgIiYjOTIyOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIga2FwcGEsIFUrMDM5QSAtLT4KLTwhRU5USVRZIExhbWJkYSAgIENEQVRBICImIzkyMzsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5QiBJU09ncmszIC0tPgotPCFFTlRJVFkgTXUgICAgICAgQ0RBVEEgIiYjOTI0OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbXUsIFUrMDM5QyAtLT4KLTwhRU5USVRZIE51ICAgICAgIENEQVRBICImIzkyNTsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG51LCBVKzAzOUQgLS0+Ci08IUVOVElUWSBYaSAgICAgICBDREFUQSAiJiM5MjY7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciB4aSwgVSswMzlFIElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWljcm9uICBDREFUQSAiJiM5Mjc7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWljcm9uLCBVKzAzOUYgLS0+Ci08IUVOVElUWSBQaSAgICAgICBDREFUQSAiJiM5Mjg7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaSwgVSswM0EwIElTT2dyazMgLS0+Ci08IUVOVElUWSBSaG8gICAgICBDREFUQSAiJiM5Mjk7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciByaG8sIFUrMDNBMSAtLT4KLTwhLS0gdGhlcmUgaXMgbm8gU2lnbWFmLCBhbmQgbm8gVSswM0EyIGNoYXJhY3RlciBlaXRoZXIgLS0+Ci08IUVOVElUWSBTaWdtYSAgICBDREFUQSAiJiM5MzE7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBMyBJU09ncmszIC0tPgotPCFFTlRJVFkgVGF1ICAgICAgQ0RBVEEgIiYjOTMyOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGF1LCBVKzAzQTQgLS0+Ci08IUVOVElUWSBVcHNpbG9uICBDREFUQSAiJiM5MzM7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciB1cHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E1IElTT2dyazMgLS0+Ci08IUVOVElUWSBQaGkgICAgICBDREFUQSAiJiM5MzQ7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIENoaSAgICAgIENEQVRBICImIzkzNTsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGNoaSwgVSswM0E3IC0tPgotPCFFTlRJVFkgUHNpICAgICAgQ0RBVEEgIiYjOTM2OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcHNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E4IElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWVnYSAgICBDREFUQSAiJiM5Mzc7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWVnYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBOSBJU09ncmszIC0tPgotCi08IUVOVElUWSBhbHBoYSAgICBDREFUQSAiJiM5NDU7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGJldGEgICAgIENEQVRBICImIzk0NjsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBiZXRhLCBVKzAzQjIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGdhbW1hICAgIENEQVRBICImIzk0NzsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBnYW1tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCMyBJU09ncmszIC0tPgotPCFFTlRJVFkgZGVsdGEgICAgQ0RBVEEgIiYjOTQ4OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I0IElTT2dyazMgLS0+Ci08IUVOVElUWSBlcHNpbG9uICBDREFUQSAiJiM5NDk7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgZXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCNSBJU09ncmszIC0tPgotPCFFTlRJVFkgemV0YSAgICAgQ0RBVEEgIiYjOTUwOyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHpldGEsIFUrMDNCNiBJU09ncmszIC0tPgotPCFFTlRJVFkgZXRhICAgICAgQ0RBVEEgIiYjOTUxOyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGV0YSwgVSswM0I3IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YSAgICBDREFUQSAiJiM5NTI7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGlvdGEgICAgIENEQVRBICImIzk1MzsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBpb3RhLCBVKzAzQjkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGthcHBhICAgIENEQVRBICImIzk1NDsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBrYXBwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCQSBJU09ncmszIC0tPgotPCFFTlRJVFkgbGFtYmRhICAgQ0RBVEEgIiYjOTU1OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCQiBJU09ncmszIC0tPgotPCFFTlRJVFkgbXUgICAgICAgQ0RBVEEgIiYjOTU2OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG11LCBVKzAzQkMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG51ICAgICAgIENEQVRBICImIzk1NzsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBudSwgVSswM0JEIElTT2dyazMgLS0+Ci08IUVOVElUWSB4aSAgICAgICBDREFUQSAiJiM5NTg7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgeGksIFUrMDNCRSBJU09ncmszIC0tPgotPCFFTlRJVFkgb21pY3JvbiAgQ0RBVEEgIiYjOTU5OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9taWNyb24sIFUrMDNCRiBORVcgLS0+Ci08IUVOVElUWSBwaSAgICAgICBDREFUQSAiJiM5NjA7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgcGksIFUrMDNDMCBJU09ncmszIC0tPgotPCFFTlRJVFkgcmhvICAgICAgQ0RBVEEgIiYjOTYxOyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHJobywgVSswM0MxIElTT2dyazMgLS0+Ci08IUVOVElUWSBzaWdtYWYgICBDREFUQSAiJiM5NjI7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgZmluYWwgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hICAgIENEQVRBICImIzk2MzsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDMyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGF1ICAgICAgQ0RBVEEgIiYjOTY0OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRhdSwgVSswM0M0IElTT2dyazMgLS0+Ci08IUVOVElUWSB1cHNpbG9uICBDREFUQSAiJiM5NjU7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgdXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDNSBJU09ncmszIC0tPgotPCFFTlRJVFkgcGhpICAgICAgQ0RBVEEgIiYjOTY2OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBoaSwgVSswM0M2IElTT2dyazMgLS0+Ci08IUVOVElUWSBjaGkgICAgICBDREFUQSAiJiM5Njc7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgY2hpLCBVKzAzQzcgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBzaSAgICAgIENEQVRBICImIzk2ODsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBwc2ksIFUrMDNDOCBJU09ncmszIC0tPgotPCFFTlRJVFkgb21lZ2EgICAgQ0RBVEEgIiYjOTY5OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9tZWdhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0M5IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YXN5bSBDREFUQSAiJiM5Nzc7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0QxIE5FVyAtLT4KLTwhRU5USVRZIHVwc2loICAgIENEQVRBICImIzk3ODsiIC0tIGdyZWVrIHVwc2lsb24gd2l0aCBob29rIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNEMiBORVcgLS0+Ci08IUVOVElUWSBwaXYgICAgICBDREFUQSAiJiM5ODI7IiAtLSBncmVlayBwaSBzeW1ib2wsIFUrMDNENiBJU09ncmszIC0tPgotCi08IS0tIEdlbmVyYWwgUHVuY3R1YXRpb24gLS0+Ci08IUVOVElUWSBidWxsICAgICBDREFUQSAiJiM4MjI2OyIgLS0gYnVsbGV0ID0gYmxhY2sgc21hbGwgY2lyY2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAyMiBJU09wdWIgIC0tPgotPCEtLSBidWxsZXQgaXMgTk9UIHRoZSBzYW1lIGFzIGJ1bGxldCBvcGVyYXRvciwgVSsyMjE5IC0tPgotPCFFTlRJVFkgaGVsbGlwICAgQ0RBVEEgIiYjODIzMDsiIC0tIGhvcml6b250YWwgZWxsaXBzaXMgPSB0aHJlZSBkb3QgbGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAyNiBJU09wdWIgIC0tPgotPCFFTlRJVFkgcHJpbWUgICAgQ0RBVEEgIiYjODI0MjsiIC0tIHByaW1lID0gbWludXRlcyA9IGZlZXQsIFUrMjAzMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgUHJpbWUgICAgQ0RBVEEgIiYjODI0MzsiIC0tIGRvdWJsZSBwcmltZSA9IHNlY29uZHMgPSBpbmNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDMzIElTT3RlY2ggLS0+Ci08IUVOVElUWSBvbGluZSAgICBDREFUQSAiJiM4MjU0OyIgLS0gb3ZlcmxpbmUgPSBzcGFjaW5nIG92ZXJzY29yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwM0UgTkVXIC0tPgotPCFFTlRJVFkgZnJhc2wgICAgQ0RBVEEgIiYjODI2MDsiIC0tIGZyYWN0aW9uIHNsYXNoLCBVKzIwNDQgTkVXIC0tPgotCi08IS0tIExldHRlcmxpa2UgU3ltYm9scyAtLT4KLTwhRU5USVRZIHdlaWVycCAgIENEQVRBICImIzg0NzI7IiAtLSBzY3JpcHQgY2FwaXRhbCBQID0gcG93ZXIgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBXZWllcnN0cmFzcyBwLCBVKzIxMTggSVNPYW1zbyAtLT4KLTwhRU5USVRZIGltYWdlICAgIENEQVRBICImIzg0NjU7IiAtLSBibGFja2xldHRlciBjYXBpdGFsIEkgPSBpbWFnaW5hcnkgcGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMTEgSVNPYW1zbyAtLT4KLTwhRU5USVRZIHJlYWwgICAgIENEQVRBICImIzg0NzY7IiAtLSBibGFja2xldHRlciBjYXBpdGFsIFIgPSByZWFsIHBhcnQgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjExQyBJU09hbXNvIC0tPgotPCFFTlRJVFkgdHJhZGUgICAgQ0RBVEEgIiYjODQ4MjsiIC0tIHRyYWRlIG1hcmsgc2lnbiwgVSsyMTIyIElTT251bSAtLT4KLTwhRU5USVRZIGFsZWZzeW0gIENEQVRBICImIzg1MDE7IiAtLSBhbGVmIHN5bWJvbCA9IGZpcnN0IHRyYW5zZmluaXRlIGNhcmRpbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjEzNSBORVcgLS0+Ci08IS0tIGFsZWYgc3ltYm9sIGlzIE5PVCB0aGUgc2FtZSBhcyBoZWJyZXcgbGV0dGVyIGFsZWYsCi0gICAgIFUrMDVEMCBhbHRob3VnaCB0aGUgc2FtZSBnbHlwaCBjb3VsZCBiZSB1c2VkIHRvIGRlcGljdCBib3RoIGNoYXJhY3RlcnMgLS0+Ci0KLTwhLS0gQXJyb3dzIC0tPgotPCFFTlRJVFkgbGFyciAgICAgQ0RBVEEgIiYjODU5MjsiIC0tIGxlZnR3YXJkcyBhcnJvdywgVSsyMTkwIElTT251bSAtLT4KLTwhRU5USVRZIHVhcnIgICAgIENEQVRBICImIzg1OTM7IiAtLSB1cHdhcmRzIGFycm93LCBVKzIxOTEgSVNPbnVtLS0+Ci08IUVOVElUWSByYXJyICAgICBDREFUQSAiJiM4NTk0OyIgLS0gcmlnaHR3YXJkcyBhcnJvdywgVSsyMTkyIElTT251bSAtLT4KLTwhRU5USVRZIGRhcnIgICAgIENEQVRBICImIzg1OTU7IiAtLSBkb3dud2FyZHMgYXJyb3csIFUrMjE5MyBJU09udW0gLS0+Ci08IUVOVElUWSBoYXJyICAgICBDREFUQSAiJiM4NTk2OyIgLS0gbGVmdCByaWdodCBhcnJvdywgVSsyMTk0IElTT2Ftc2EgLS0+Ci08IUVOVElUWSBjcmFyciAgICBDREFUQSAiJiM4NjI5OyIgLS0gZG93bndhcmRzIGFycm93IHdpdGggY29ybmVyIGxlZnR3YXJkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY2FycmlhZ2UgcmV0dXJuLCBVKzIxQjUgTkVXIC0tPgotPCFFTlRJVFkgbEFyciAgICAgQ0RBVEEgIiYjODY1NjsiIC0tIGxlZnR3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMCBJU090ZWNoIC0tPgotPCEtLSBJU08gMTA2NDYgZG9lcyBub3Qgc2F5IHRoYXQgbEFyciBpcyB0aGUgc2FtZSBhcyB0aGUgJ2lzIGltcGxpZWQgYnknIGFycm93Ci0gICAgYnV0IGFsc28gZG9lcyBub3QgaGF2ZSBhbnkgb3RoZXIgY2hhcmFjdGVyIGZvciB0aGF0IGZ1bmN0aW9uLiBTbyA/IGxBcnIgY2FuCi0gICAgYmUgdXNlZCBmb3IgJ2lzIGltcGxpZWQgYnknIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSB1QXJyICAgICBDREFUQSAiJiM4NjU3OyIgLS0gdXB3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMSBJU09hbXNhIC0tPgotPCFFTlRJVFkgckFyciAgICAgQ0RBVEEgIiYjODY1ODsiIC0tIHJpZ2h0d2FyZHMgZG91YmxlIGFycm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjFEMiBJU090ZWNoIC0tPgotPCEtLSBJU08gMTA2NDYgZG9lcyBub3Qgc2F5IHRoaXMgaXMgdGhlICdpbXBsaWVzJyBjaGFyYWN0ZXIgYnV0IGRvZXMgbm90IGhhdmUgCi0gICAgIGFub3RoZXIgY2hhcmFjdGVyIHdpdGggdGhpcyBmdW5jdGlvbiBzbyA/Ci0gICAgIHJBcnIgY2FuIGJlIHVzZWQgZm9yICdpbXBsaWVzJyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgZEFyciAgICAgQ0RBVEEgIiYjODY1OTsiIC0tIGRvd253YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMyBJU09hbXNhIC0tPgotPCFFTlRJVFkgaEFyciAgICAgQ0RBVEEgIiYjODY2MDsiIC0tIGxlZnQgcmlnaHQgZG91YmxlIGFycm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjFENCBJU09hbXNhIC0tPgotCi08IS0tIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMgLS0+Ci08IUVOVElUWSBmb3JhbGwgICBDREFUQSAiJiM4NzA0OyIgLS0gZm9yIGFsbCwgVSsyMjAwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwYXJ0ICAgICBDREFUQSAiJiM4NzA2OyIgLS0gcGFydGlhbCBkaWZmZXJlbnRpYWwsIFUrMjIwMiBJU090ZWNoICAtLT4KLTwhRU5USVRZIGV4aXN0ICAgIENEQVRBICImIzg3MDc7IiAtLSB0aGVyZSBleGlzdHMsIFUrMjIwMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgZW1wdHkgICAgQ0RBVEEgIiYjODcwOTsiIC0tIGVtcHR5IHNldCA9IG51bGwgc2V0ID0gZGlhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjA1IElTT2Ftc28gLS0+Ci08IUVOVElUWSBuYWJsYSAgICBDREFUQSAiJiM4NzExOyIgLS0gbmFibGEgPSBiYWNrd2FyZCBkaWZmZXJlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgaXNpbiAgICAgQ0RBVEEgIiYjODcxMjsiIC0tIGVsZW1lbnQgb2YsIFUrMjIwOCBJU090ZWNoIC0tPgotPCFFTlRJVFkgbm90aW4gICAgQ0RBVEEgIiYjODcxMzsiIC0tIG5vdCBhbiBlbGVtZW50IG9mLCBVKzIyMDkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG5pICAgICAgIENEQVRBICImIzg3MTU7IiAtLSBjb250YWlucyBhcyBtZW1iZXIsIFUrMjIwQiBJU090ZWNoIC0tPgotPCEtLSBzaG91bGQgdGhlcmUgYmUgYSBtb3JlIG1lbW9yYWJsZSBuYW1lIHRoYW4gJ25pJz8gLS0+Ci08IUVOVElUWSBwcm9kICAgICBDREFUQSAiJiM4NzE5OyIgLS0gbi1hcnkgcHJvZHVjdCA9IHByb2R1Y3Qgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMEYgSVNPYW1zYiAtLT4KLTwhLS0gcHJvZCBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMCAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGknIHRob3VnaAotICAgICB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgc3VtICAgICAgQ0RBVEEgIiYjODcyMTsiIC0tIG4tYXJ5IHN1bWF0aW9uLCBVKzIyMTEgSVNPYW1zYiAtLT4KLTwhLS0gc3VtIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EzICdncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYScKLSAgICAgdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBtaW51cyAgICBDREFUQSAiJiM4NzIyOyIgLS0gbWludXMgc2lnbiwgVSsyMjEyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsb3dhc3QgICBDREFUQSAiJiM4NzI3OyIgLS0gYXN0ZXJpc2sgb3BlcmF0b3IsIFUrMjIxNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgcmFkaWMgICAgQ0RBVEEgIiYjODczMDsiIC0tIHNxdWFyZSByb290ID0gcmFkaWNhbCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIxQSBJU090ZWNoIC0tPgotPCFFTlRJVFkgcHJvcCAgICAgQ0RBVEEgIiYjODczMzsiIC0tIHByb3BvcnRpb25hbCB0bywgVSsyMjFEIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbmZpbiAgICBDREFUQSAiJiM4NzM0OyIgLS0gaW5maW5pdHksIFUrMjIxRSBJU090ZWNoIC0tPgotPCFFTlRJVFkgYW5nICAgICAgQ0RBVEEgIiYjODczNjsiIC0tIGFuZ2xlLCBVKzIyMjAgSVNPYW1zbyAtLT4KLTwhRU5USVRZIGFuZCAgICAgIENEQVRBICImIzg3NDM7IiAtLSBsb2dpY2FsIGFuZCA9IHdlZGdlLCBVKzIyMjcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9yICAgICAgIENEQVRBICImIzg3NDQ7IiAtLSBsb2dpY2FsIG9yID0gdmVlLCBVKzIyMjggSVNPdGVjaCAtLT4KLTwhRU5USVRZIGNhcCAgICAgIENEQVRBICImIzg3NDU7IiAtLSBpbnRlcnNlY3Rpb24gPSBjYXAsIFUrMjIyOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgY3VwICAgICAgQ0RBVEEgIiYjODc0NjsiIC0tIHVuaW9uID0gY3VwLCBVKzIyMkEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGludCAgICAgIENEQVRBICImIzg3NDc7IiAtLSBpbnRlZ3JhbCwgVSsyMjJCIElTT3RlY2ggLS0+Ci08IUVOVElUWSB0aGVyZTQgICBDREFUQSAiJiM4NzU2OyIgLS0gdGhlcmVmb3JlLCBVKzIyMzQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHNpbSAgICAgIENEQVRBICImIzg3NjQ7IiAtLSB0aWxkZSBvcGVyYXRvciA9IHZhcmllcyB3aXRoID0gc2ltaWxhciB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyM0MgSVNPdGVjaCAtLT4KLTwhLS0gdGlsZGUgb3BlcmF0b3IgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyB0aGUgdGlsZGUsIFUrMDA3RSwKLSAgICAgYWx0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCB0byByZXByZXNlbnQgYm90aCAgLS0+Ci08IUVOVElUWSBjb25nICAgICBDREFUQSAiJiM4NzczOyIgLS0gYXBwcm94aW1hdGVseSBlcXVhbCB0bywgVSsyMjQ1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBhc3ltcCAgICBDREFUQSAiJiM4Nzc2OyIgLS0gYWxtb3N0IGVxdWFsIHRvID0gYXN5bXB0b3RpYyB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyNDggSVNPYW1zciAtLT4KLTwhRU5USVRZIG5lICAgICAgIENEQVRBICImIzg4MDA7IiAtLSBub3QgZXF1YWwgdG8sIFUrMjI2MCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZXF1aXYgICAgQ0RBVEEgIiYjODgwMTsiIC0tIGlkZW50aWNhbCB0bywgVSsyMjYxIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsZSAgICAgICBDREFUQSAiJiM4ODA0OyIgLS0gbGVzcy10aGFuIG9yIGVxdWFsIHRvLCBVKzIyNjQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGdlICAgICAgIENEQVRBICImIzg4MDU7IiAtLSBncmVhdGVyLXRoYW4gb3IgZXF1YWwgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjY1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdWIgICAgICBDREFUQSAiJiM4ODM0OyIgLS0gc3Vic2V0IG9mLCBVKzIyODIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cCAgICAgIENEQVRBICImIzg4MzU7IiAtLSBzdXBlcnNldCBvZiwgVSsyMjgzIElTT3RlY2ggLS0+Ci08IS0tIG5vdGUgdGhhdCBuc3VwLCAnbm90IGEgc3VwZXJzZXQgb2YsIFUrMjI4MycgaXMgbm90IGNvdmVyZWQgYnkgdGhlIFN5bWJvbCAKLSAgICAgZm9udCBlbmNvZGluZyBhbmQgaXMgbm90IGluY2x1ZGVkLiBTaG91bGQgaXQgYmUsIGZvciBzeW1tZXRyeT8KLSAgICAgSXQgaXMgaW4gSVNPYW1zbiAgLS0+IAotPCFFTlRJVFkgbnN1YiAgICAgQ0RBVEEgIiYjODgzNjsiIC0tIG5vdCBhIHN1YnNldCBvZiwgVSsyMjg0IElTT2Ftc24gLS0+Ci08IUVOVElUWSBzdWJlICAgICBDREFUQSAiJiM4ODM4OyIgLS0gc3Vic2V0IG9mIG9yIGVxdWFsIHRvLCBVKzIyODYgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cGUgICAgIENEQVRBICImIzg4Mzk7IiAtLSBzdXBlcnNldCBvZiBvciBlcXVhbCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyODcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9wbHVzICAgIENEQVRBICImIzg4NTM7IiAtLSBjaXJjbGVkIHBsdXMgPSBkaXJlY3Qgc3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI5NSBJU09hbXNiIC0tPgotPCFFTlRJVFkgb3RpbWVzICAgQ0RBVEEgIiYjODg1NTsiIC0tIGNpcmNsZWQgdGltZXMgPSB2ZWN0b3IgcHJvZHVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyOTcgSVNPYW1zYiAtLT4KLTwhRU5USVRZIHBlcnAgICAgIENEQVRBICImIzg4Njk7IiAtLSB1cCB0YWNrID0gb3J0aG9nb25hbCB0byA9IHBlcnBlbmRpY3VsYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMkE1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzZG90ICAgICBDREFUQSAiJiM4OTAxOyIgLS0gZG90IG9wZXJhdG9yLCBVKzIyQzUgSVNPYW1zYiAtLT4KLTwhLS0gZG90IG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMEI3IG1pZGRsZSBkb3QgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBUZWNobmljYWwgLS0+Ci08IUVOVElUWSBsY2VpbCAgICBDREFUQSAiJiM4OTY4OyIgLS0gbGVmdCBjZWlsaW5nID0gYXBsIHVwc3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzA4IElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgcmNlaWwgICAgQ0RBVEEgIiYjODk2OTsiIC0tIHJpZ2h0IGNlaWxpbmcsIFUrMjMwOSBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxmbG9vciAgIENEQVRBICImIzg5NzA7IiAtLSBsZWZ0IGZsb29yID0gYXBsIGRvd25zdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMEEgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSByZmxvb3IgICBDREFUQSAiJiM4OTcxOyIgLS0gcmlnaHQgZmxvb3IsIFUrMjMwQiBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxhbmcgICAgIENEQVRBICImIzkwMDE7IiAtLSBsZWZ0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBicmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzI5IElTT3RlY2ggLS0+Ci08IS0tIGxhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0MgJ2xlc3MgdGhhbicgCi0gICAgIG9yIFUrMjAzOSAnc2luZ2xlIGxlZnQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotPCFFTlRJVFkgcmFuZyAgICAgQ0RBVEEgIiYjOTAwMjsiIC0tIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzJBIElTT3RlY2ggLS0+Ci08IS0tIHJhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0UgJ2dyZWF0ZXIgdGhhbicgCi0gICAgIG9yIFUrMjAzQSAnc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrJyAtLT4KLQotPCEtLSBHZW9tZXRyaWMgU2hhcGVzIC0tPgotPCFFTlRJVFkgbG96ICAgICAgQ0RBVEEgIiYjOTY3NDsiIC0tIGxvemVuZ2UsIFUrMjVDQSBJU09wdWIgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBTeW1ib2xzIC0tPgotPCFFTlRJVFkgc3BhZGVzICAgQ0RBVEEgIiYjOTgyNDsiIC0tIGJsYWNrIHNwYWRlIHN1aXQsIFUrMjY2MCBJU09wdWIgLS0+Ci08IS0tIGJsYWNrIGhlcmUgc2VlbXMgdG8gbWVhbiBmaWxsZWQgYXMgb3Bwb3NlZCB0byBob2xsb3cgLS0+Ci08IUVOVElUWSBjbHVicyAgICBDREFUQSAiJiM5ODI3OyIgLS0gYmxhY2sgY2x1YiBzdWl0ID0gc2hhbXJvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyNjYzIElTT3B1YiAtLT4KLTwhRU5USVRZIGhlYXJ0cyAgIENEQVRBICImIzk4Mjk7IiAtLSBibGFjayBoZWFydCBzdWl0ID0gdmFsZW50aW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjY2NSBJU09wdWIgLS0+Ci08IUVOVElUWSBkaWFtcyAgICBDREFUQSAiJiM5ODMwOyIgLS0gYmxhY2sgZGlhbW9uZCBzdWl0LCBVKzI2NjYgSVNPcHViIC0tPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9mcmFtZXNldC5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvZnJhbWVzZXQuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDQ5ZGQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9mcmFtZXNldC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08IS0tCi0gICAgVGhpcyBpcyB0aGUgSFRNTCA0LjAxIEZyYW1lc2V0IERURCwgd2hpY2ggc2hvdWxkIGJlCi0gICAgdXNlZCBmb3IgZG9jdW1lbnRzIHdpdGggZnJhbWVzLiBUaGlzIERURCBpcyBpZGVudGljYWwKLSAgICB0byB0aGUgSFRNTCA0LjAxIFRyYW5zaXRpb25hbCBEVEQgZXhjZXB0IGZvciB0aGUKLSAgICBjb250ZW50IG1vZGVsIG9mIHRoZSAiSFRNTCIgZWxlbWVudDogaW4gZnJhbWVzZXQgCi0gICAgZG9jdW1lbnRzLCB0aGUgIkZSQU1FU0VUIiBlbGVtZW50IHJlcGxhY2VzIHRoZSAiQk9EWSIgCi0gICAgZWxlbWVudC4KLQotICAgICAgICAgIERyYWZ0OiAkRGF0ZTogMjAwOC8wNy8yMiAwNzozNzowMSAkCi0KLSAgICAgICAgICBBdXRob3JzOgotICAgICAgICAgICAgICBEYXZlIFJhZ2dldHQgPGRzckB3My5vcmc+Ci0gICAgICAgICAgICAgIEFybmF1ZCBMZSBIb3JzIDxsZWhvcnNAdzMub3JnPgotICAgICAgICAgICAgICBJYW4gSmFjb2JzIDxpakB3My5vcmc+Ci0KLSAgICBGdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IEhUTUwgNC4wMSBpcyBhdmFpbGFibGUgYXQ6Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0LgotLS0+Ci08IUVOVElUWSAlIEhUTUwuVmVyc2lvbiAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiIKLSAgLS0gVHlwaWNhbCB1c2FnZToKLQotICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9mcmFtZXNldC5kdGQiPgotICAgIDxodG1sPgotICAgIDxoZWFkPgotICAgIC4uLgotICAgIDwvaGVhZD4KLSAgICA8ZnJhbWVzZXQ+Ci0gICAgLi4uCi0gICAgPC9mcmFtZXNldD4KLSAgICA8L2h0bWw+Ci0tLT4KLQotPCFFTlRJVFkgJSBIVE1MLkZyYW1lc2V0ICJJTkNMVURFIj4KLTwhRU5USVRZICUgSFRNTDQuZHRkIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotJUhUTUw0LmR0ZDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvbG9vc2UuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL2xvb3NlLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZmI0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvbG9vc2UuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5MyArMCwwIEBACi08IS0tCi0gICAgVGhpcyBpcyB0aGUgSFRNTCA0LjAxIFRyYW5zaXRpb25hbCBEVEQsIHdoaWNoIGluY2x1ZGVzCi0gICAgcHJlc2VudGF0aW9uIGF0dHJpYnV0ZXMgYW5kIGVsZW1lbnRzIHRoYXQgVzNDIGV4cGVjdHMgdG8gcGhhc2Ugb3V0Ci0gICAgYXMgc3VwcG9ydCBmb3Igc3R5bGUgc2hlZXRzIG1hdHVyZXMuIEF1dGhvcnMgc2hvdWxkIHVzZSB0aGUgU3RyaWN0Ci0gICAgRFREIHdoZW4gcG9zc2libGUsIGJ1dCBtYXkgdXNlIHRoZSBUcmFuc2l0aW9uYWwgRFREIHdoZW4gc3VwcG9ydAotICAgIGZvciBwcmVzZW50YXRpb24gYXR0cmlidXRlIGFuZCBlbGVtZW50cyBpcyByZXF1aXJlZC4KLQotICAgIEhUTUwgNCBpbmNsdWRlcyBtZWNoYW5pc21zIGZvciBzdHlsZSBzaGVldHMsIHNjcmlwdGluZywKLSAgICBlbWJlZGRpbmcgb2JqZWN0cywgaW1wcm92ZWQgc3VwcG9ydCBmb3IgcmlnaHQgdG8gbGVmdCBhbmQgbWl4ZWQKLSAgICBkaXJlY3Rpb24gdGV4dCwgYW5kIGVuaGFuY2VtZW50cyB0byBmb3JtcyBmb3IgaW1wcm92ZWQKLSAgICBhY2Nlc3NpYmlsaXR5IGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMuCi0KLSAgICAgICAgICBEcmFmdDogJERhdGU6IDIwMDgvMDcvMjIgMDc6Mzc6MDEgJAotCi0gICAgICAgICAgQXV0aG9yczoKLSAgICAgICAgICAgICAgRGF2ZSBSYWdnZXR0IDxkc3JAdzMub3JnPgotICAgICAgICAgICAgICBBcm5hdWQgTGUgSG9ycyA8bGVob3JzQHczLm9yZz4KLSAgICAgICAgICAgICAgSWFuIEphY29icyA8aWpAdzMub3JnPgotCi0gICAgRnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBIVE1MIDQuMDEgaXMgYXZhaWxhYmxlIGF0OgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQKLQotCi0gICAgVGhlIEhUTUwgNC4wMSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVzIGFkZGl0aW9uYWwKLSAgICBzeW50YWN0aWMgY29uc3RyYWludHMgdGhhdCBjYW5ub3QgYmUgZXhwcmVzc2VkIHdpdGhpbgotICAgIHRoZSBEVERzLgotCi0tLT4KLTwhRU5USVRZICUgSFRNTC5WZXJzaW9uICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSAgLS0gVHlwaWNhbCB1c2FnZToKLQotICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLSAgICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAuLi4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgLi4uCi0gICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLQotICAgIFRoZSBVUkkgdXNlZCBhcyBhIHN5c3RlbSBpZGVudGlmaWVyIHdpdGggdGhlIHB1YmxpYyBpZGVudGlmaWVyIGFsbG93cwotICAgIHRoZSB1c2VyIGFnZW50IHRvIGRvd25sb2FkIHRoZSBEVEQgYW5kIGVudGl0eSBzZXRzIGFzIG5lZWRlZC4KLQotICAgIFRoZSBGUEkgZm9yIHRoZSBTdHJpY3QgSFRNTCA0LjAxIERURCBpczoKLQotICAgICAgICAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKLQotICAgIFRoaXMgdmVyc2lvbiBvZiB0aGUgc3RyaWN0IERURCBpczoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L3N0cmljdC5kdGQKLQotICAgIEF1dGhvcnMgc2hvdWxkIHVzZSB0aGUgU3RyaWN0IERURCB1bmxlc3MgdGhleSBuZWVkIHRoZQotICAgIHByZXNlbnRhdGlvbiBjb250cm9sIGZvciB1c2VyIGFnZW50cyB0aGF0IGRvbid0IChhZGVxdWF0ZWx5KQotICAgIHN1cHBvcnQgc3R5bGUgc2hlZXRzLgotCi0gICAgSWYgeW91IGFyZSB3cml0aW5nIGEgZG9jdW1lbnQgdGhhdCBpbmNsdWRlcyBmcmFtZXMsIHVzZSAKLSAgICB0aGUgZm9sbG93aW5nIEZQSToKLQotICAgICAgICAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiIKLQotICAgIFRoaXMgdmVyc2lvbiBvZiB0aGUgZnJhbWVzZXQgRFREIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvZnJhbWVzZXQuZHRkCi0KLSAgICBVc2UgdGhlIGZvbGxvd2luZyAocmVsYXRpdmUpIFVSSXMgdG8gcmVmZXIgdG8gCi0gICAgdGhlIERURHMgYW5kIGVudGl0eSBkZWZpbml0aW9ucyBvZiB0aGlzIHNwZWNpZmljYXRpb246Ci0KLSAgICAic3RyaWN0LmR0ZCIKLSAgICAibG9vc2UuZHRkIgotICAgICJmcmFtZXNldC5kdGQiCi0gICAgIkhUTUxsYXQxLmVudCIKLSAgICAiSFRNTHN5bWJvbC5lbnQiCi0gICAgIkhUTUxzcGVjaWFsLmVudCIKLQotLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSW1wb3J0ZWQgTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEZlYXR1cmUgU3dpdGNoIGZvciBmcmFtZXNldCBkb2N1bWVudHMgLS0+Ci08IUVOVElUWSAlIEhUTUwuRnJhbWVzZXQgIklHTk9SRSI+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGUgIkNEQVRBIgotICAgIC0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDb250ZW50VHlwZXMgIkNEQVRBIgotICAgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldCAiQ0RBVEEiCi0gICAgLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0cyAiQ0RBVEEiCi0gICAgLS0gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTGFuZ3VhZ2VDb2RlICJOQU1FIgotICAgIC0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMxNzY2XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJhY3RlciAiQ0RBVEEiCi0gICAgLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBMaW5rVHlwZXMgIkNEQVRBIgotICAgIC0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBNZWRpYURlc2MgIkNEQVRBIgotICAgIC0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycwotICAgIC0tPgotCi08IUVOVElUWSAlIFVSSSAiQ0RBVEEiCi0gICAgLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsCi0gICAgICAgc2VlIFtVUkldCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgRGF0ZXRpbWUgIkNEQVRBIiAtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci0KLQotPCFFTlRJVFkgJSBTY3JpcHQgIkNEQVRBIiAtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLQotPCFFTlRJVFkgJSBTdHlsZVNoZWV0ICJDREFUQSIgLS0gc3R5bGUgc2hlZXQgZGF0YSAtLT4KLQotPCFFTlRJVFkgJSBGcmFtZVRhcmdldCAiQ0RBVEEiIC0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tPgotCi0KLTwhRU5USVRZICUgVGV4dCAiQ0RBVEEiPgotCi0KLTwhLS0gUGFyYW1ldGVyIEVudGl0aWVzIC0tPgotCi08IUVOVElUWSAlIGhlYWQubWlzYyAiU0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1QiIC0tIHJlcGVhdGFibGUgaGVhZCBlbGVtZW50cyAtLT4KLQotPCFFTlRJVFkgJSBoZWFkaW5nICJIMXxIMnxIM3xINHxINXxINiI+Ci0KLTwhRU5USVRZICUgbGlzdCAiVUwgfCBPTCB8ICBESVIgfCBNRU5VIj4KLQotPCFFTlRJVFkgJSBwcmVmb3JtYXR0ZWQgIlBSRSI+Ci0KLTwhRU5USVRZICUgQ29sb3IgIkNEQVRBIiAtLSBhIGNvbG9yIHVzaW5nIHNSR0I6ICNSUkdHQkIgYXMgSGV4IHZhbHVlcyAtLT4KLQotPCEtLSBUaGVyZSBhcmUgYWxzbyAxNiB3aWRlbHkga25vd24gY29sb3IgbmFtZXMgd2l0aCB0aGVpciBzUkdCIHZhbHVlczoKLQotICAgIEJsYWNrICA9ICMwMDAwMDAgICAgR3JlZW4gID0gIzAwODAwMAotICAgIFNpbHZlciA9ICNDMEMwQzAgICAgTGltZSAgID0gIzAwRkYwMAotICAgIEdyYXkgICA9ICM4MDgwODAgICAgT2xpdmUgID0gIzgwODAwMAotICAgIFdoaXRlICA9ICNGRkZGRkYgICAgWWVsbG93ID0gI0ZGRkYwMAotICAgIE1hcm9vbiA9ICM4MDAwMDAgICAgTmF2eSAgID0gIzAwMDA4MAotICAgIFJlZCAgICA9ICNGRjAwMDAgICAgQmx1ZSAgID0gIzAwMDBGRgotICAgIFB1cnBsZSA9ICM4MDAwODAgICAgVGVhbCAgID0gIzAwODA4MAotICAgIEZ1Y2hzaWE9ICNGRjAwRkYgICAgQXF1YSAgID0gIzAwRkZGRgotIC0tPgotCi08IUVOVElUWSAlIGJvZHljb2xvcnMgIgotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQgYmFja2dyb3VuZCBjb2xvciAtLQotICB0ZXh0ICAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQgdGV4dCBjb2xvciAtLQotICBsaW5rICAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gY29sb3Igb2YgbGlua3MgLS0KLSAgdmxpbmsgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGNvbG9yIG9mIHZpc2l0ZWQgbGlua3MgLS0KLSAgYWxpbmsgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGNvbG9yIG9mIHNlbGVjdGVkIGxpbmtzIC0tCi0gICI+Ci0KLTwhLS09PT09PT09PT09PT09PT09IENoYXJhY3RlciBtbmVtb25pYyBlbnRpdGllcyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbjEvL0VOLy9IVE1MIgotICAgIkhUTUxsYXQxLmVudCI+Ci0lSFRNTGxhdDE7Ci0KLTwhRU5USVRZICUgSFRNTHN5bWJvbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMvL0VOLy9IVE1MIgotICAgIkhUTUxzeW1ib2wuZW50Ij4KLSVIVE1Mc3ltYm9sOwotCi08IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbC8vRU4vL0hUTUwiCi0gICAiSFRNTHNwZWNpYWwuZW50Ij4KLSVIVE1Mc3BlY2lhbDsKLTwhLS09PT09PT09PT09PT09PT09PT09IEdlbmVyaWMgQXR0cmlidXRlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgY29yZWF0dHJzCi0gImlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcyAtLQotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRCAgLS0gYXNzb2NpYXRlZCBzdHlsZSBpbmZvIC0tCi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBhZHZpc29yeSB0aXRsZSAtLSIKLSAgPgotCi08IUVOVElUWSAlIGkxOG4KLSAibGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI0lNUExJRUQgIC0tIGRpcmVjdGlvbiBmb3Igd2Vhay9uZXV0cmFsIHRleHQgLS0iCi0gID4KLQotPCFFTlRJVFkgJSBldmVudHMKLSAib25jbGljayAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGNsaWNrZWQgLS0KLSAgb25kYmxjbGljayAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGRvdWJsZSBjbGlja2VkLS0KLSAgb25tb3VzZWRvd24gJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIHByZXNzZWQgZG93biAtLQotICBvbm1vdXNldXAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIGJ1dHRvbiB3YXMgcmVsZWFzZWQgLS0KLSAgb25tb3VzZW92ZXIgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgb250byAtLQotICBvbm1vdXNlbW92ZSAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIHdhcyBtb3ZlZCB3aXRoaW4gLS0KLSAgb25tb3VzZW91dCAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgYXdheSAtLQotICBvbmtleXByZXNzICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHByZXNzZWQgYW5kIHJlbGVhc2VkIC0tCi0gIG9ua2V5ZG93biAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcHJlc3NlZCBkb3duIC0tCi0gIG9ua2V5dXAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcmVsZWFzZWQgLS0iCi0gID4KLQotPCEtLSBSZXNlcnZlZCBGZWF0dXJlIFN3aXRjaCAtLT4KLTwhRU5USVRZICUgSFRNTC5SZXNlcnZlZCAiSUdOT1JFIj4KLQotPCEtLSBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tPgotPCFbICVIVE1MLlJlc2VydmVkOyBbCi08IUVOVElUWSAlIHJlc2VydmVkCi0gImRhdGFzcmMgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBhIHNpbmdsZSBvciB0YWJ1bGFyIERhdGEgU291cmNlIC0tCi0gIGRhdGFmbGQgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSB0aGUgcHJvcGVydHkgb3IgY29sdW1uIG5hbWUgLS0KLSAgZGF0YWZvcm1hdGFzIChwbGFpbnRleHR8aHRtbCkgcGxhaW50ZXh0IC0tIHRleHQgb3IgaHRtbCAtLSIKLSAgPgotXV0+Ci0KLTwhRU5USVRZICUgcmVzZXJ2ZWQgIiI+Ci0KLTwhRU5USVRZICUgYXR0cnMgIiVjb3JlYXR0cnM7ICVpMThuOyAlZXZlbnRzOyI+Ci0KLTwhRU5USVRZICUgYWxpZ24gImFsaWduIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5KSAgI0lNUExJRUQiCi0gICAgICAgICAgICAgICAgICAgLS0gZGVmYXVsdCBpcyBsZWZ0IGZvciBsdHIgcGFyYWdyYXBocywgcmlnaHQgZm9yIHJ0bCAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgTWFya3VwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgZm9udHN0eWxlCi0gIlRUIHwgSSB8IEIgfCBVIHwgUyB8IFNUUklLRSB8IEJJRyB8IFNNQUxMIj4KLQotPCFFTlRJVFkgJSBwaHJhc2UgIkVNIHwgU1RST05HIHwgREZOIHwgQ09ERSB8Ci0gICAgICAgICAgICAgICAgICAgU0FNUCB8IEtCRCB8IFZBUiB8IENJVEUgfCBBQkJSIHwgQUNST05ZTSIgPgotCi08IUVOVElUWSAlIHNwZWNpYWwKLSAgICJBIHwgSU1HIHwgQVBQTEVUIHwgT0JKRUNUIHwgRk9OVCB8IEJBU0VGT05UIHwgQlIgfCBTQ1JJUFQgfAotICAgIE1BUCB8IFEgfCBTVUIgfCBTVVAgfCBTUEFOIHwgQkRPIHwgSUZSQU1FIj4KLQotPCFFTlRJVFkgJSBmb3JtY3RybCAiSU5QVVQgfCBTRUxFQ1QgfCBURVhUQVJFQSB8IExBQkVMIHwgQlVUVE9OIj4KLQotPCEtLSAlaW5saW5lOyBjb3ZlcnMgaW5saW5lIG9yICJ0ZXh0LWxldmVsIiBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgaW5saW5lICIjUENEQVRBIHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVzcGVjaWFsOyB8ICVmb3JtY3RybDsiPgotCi08IUVMRU1FTlQgKCVmb250c3R5bGU7fCVwaHJhc2U7KSAtIC0gKCVpbmxpbmU7KSo+Ci08IUFUVExJU1QgKCVmb250c3R5bGU7fCVwaHJhc2U7KQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgKFNVQnxTVVApIC0gLSAoJWlubGluZTspKiAgICAtLSBzdWJzY3JpcHQsIHN1cGVyc2NyaXB0IC0tPgotPCFBVFRMSVNUIChTVUJ8U1VQKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgU1BBTiAtIC0gKCVpbmxpbmU7KSogICAgICAgICAtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBTUEFOCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlcmVzZXJ2ZWQ7CQkJICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIEJETyAtIC0gKCVpbmxpbmU7KSogICAgICAgICAgLS0gSTE4TiBCaURpIG92ZXItcmlkZSAtLT4KLTwhQVRUTElTVCBCRE8KLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNSRVFVSVJFRCAtLSBkaXJlY3Rpb25hbGl0eSAtLQotICA+Ci0KLTwhRUxFTUVOVCBCQVNFRk9OVCAtIE8gRU1QVFkgICAgICAgICAgIC0tIGJhc2UgZm9udCBzaXplIC0tPgotPCFBVFRMSVNUIEJBU0VGT05UCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gYmFzZSBmb250IHNpemUgZm9yIEZPTlQgZWxlbWVudHMgLS0KLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIHRleHQgY29sb3IgLS0KLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZvbnQgbmFtZXMgLS0KLSAgPgotCi08IUVMRU1FTlQgRk9OVCAtIC0gKCVpbmxpbmU7KSogICAgICAgICAtLSBsb2NhbCBjaGFuZ2UgdG8gZm9udCAtLT4KLTwhQVRUTElTVCBGT05UCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICAlaTE4bjsJCSAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gWyt8LV1ubiBlLmcuIHNpemU9IisxIiwgc2l6ZT0iNCIgLS0KLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIHRleHQgY29sb3IgLS0KLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZvbnQgbmFtZXMgLS0KLSAgPgotCi08IUVMRU1FTlQgQlIgLSBPIEVNUFRZICAgICAgICAgICAgICAgICAtLSBmb3JjZWQgbGluZSBicmVhayAtLT4KLTwhQVRUTElTVCBCUgotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgY2xlYXIgICAgICAgKGxlZnR8YWxsfHJpZ2h0fG5vbmUpIG5vbmUgLS0gY29udHJvbCBvZiB0ZXh0IGZsb3cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEhUTUwgY29udGVudCBtb2RlbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gICAgSFRNTCBoYXMgdHdvIGJhc2ljIGNvbnRlbnQgbW9kZWxzOgotCi0gICAgICAgICVpbmxpbmU7ICAgICBjaGFyYWN0ZXIgbGV2ZWwgZWxlbWVudHMgYW5kIHRleHQgc3RyaW5ncwotICAgICAgICAlYmxvY2s7ICAgICAgYmxvY2stbGlrZSBlbGVtZW50cyBlLmcuIHBhcmFncmFwaHMgYW5kIGxpc3RzCi0tLT4KLQotPCFFTlRJVFkgJSBibG9jawotICAgICAiUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBDRU5URVIgfAotICAgICAgTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLSAgICAgIFRBQkxFIHwgRklFTERTRVQgfCBBRERSRVNTIj4KLQotPCFFTlRJVFkgJSBmbG93ICIlYmxvY2s7IHwgJWlubGluZTsiPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBEb2N1bWVudCBCb2R5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQk9EWSBPIE8gKCVmbG93OykqICsoSU5TfERFTCkgLS0gZG9jdW1lbnQgYm9keSAtLT4KLTwhQVRUTElTVCBCT0RZCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBvbmxvYWQgICAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIGxvYWRlZCAtLQotICBvbnVubG9hZCAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIHJlbW92ZWQgLS0KLSAgYmFja2dyb3VuZCAgICAgICVVUkk7ICAgICAgI0lNUExJRUQgIC0tIHRleHR1cmUgdGlsZSBmb3IgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgLS0KLSAgJWJvZHljb2xvcnM7ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGJnY29sb3IsIHRleHQsIGxpbmssIHZsaW5rLCBhbGluayAtLQotICA+Ci0KLTwhRUxFTUVOVCBBRERSRVNTIC0gLSAoKCVpbmxpbmU7KXxQKSogIC0tIGluZm9ybWF0aW9uIG9uIGF1dGhvciAtLT4KLTwhQVRUTElTVCBBRERSRVNTCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBESVYgLSAtICglZmxvdzspKiAgICAgICAgICAgIC0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIERJVgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFsaWduLCB0ZXh0IGFsaWdubWVudCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgQ0VOVEVSIC0gLSAoJWZsb3c7KSogICAgICAgICAtLSBzaG9ydGhhbmQgZm9yIERJViBhbGlnbj1jZW50ZXIgLS0+Ci08IUFUVExJU1QgQ0VOVEVSCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgU2hhcGUgIihyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpIj4KLTwhRU5USVRZICUgQ29vcmRzICJDREFUQSIgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLT4KLQotPCFFTEVNRU5UIEEgLSAtICglaW5saW5lOykqIC0oQSkgICAgICAgLS0gYW5jaG9yIC0tPgotPCFBVFRMSVNUIEEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgY29udGVudCB0eXBlIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lZCBsaW5rIGVuZCAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQgIC0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tCi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSBmb3J3YXJkIGxpbmsgdHlwZXMgLS0KLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIHJldmVyc2UgbGluayB0eXBlcyAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBmb3IgdXNlIHdpdGggY2xpZW50LXNpZGUgaW1hZ2UgbWFwcyAtLQotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRCAgLS0gZm9yIHVzZSB3aXRoIGNsaWVudC1zaWRlIGltYWdlIG1hcHMgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDbGllbnQtc2lkZSBpbWFnZSBtYXBzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBUaGVzZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRvY3VtZW50IG9yIGdyb3VwZWQgaW4gYQotICAgICBzZXBhcmF0ZSBkb2N1bWVudCBhbHRob3VnaCB0aGlzIGlzbid0IHlldCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IUVMRU1FTlQgTUFQIC0gLSAoKCVibG9jazspIHwgQVJFQSkrIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLT4KLTwhQVRUTElTVCBNQVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBmb3IgcmVmZXJlbmNlIGJ5IHVzZW1hcCAtLQotICA+Ci0KLTwhRUxFTUVOVCBBUkVBIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCBhcmVhIC0tPgotPCFBVFRMSVNUIEFSRUEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBjb250cm9scyBpbnRlcnByZXRhdGlvbiBvZiBjb29yZHMgLS0KLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVEICAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLQotICBub2hyZWYgICAgICAobm9ocmVmKSAgICAgICAjSU1QTElFRCAgLS0gdGhpcyByZWdpb24gaGFzIG5vIGFjdGlvbiAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBMSU5LIEVsZW1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFJlbGF0aW9uc2hpcCB2YWx1ZXMgY2FuIGJlIHVzZWQgaW4gcHJpbmNpcGxlOgotCi0gICBhKSBmb3IgZG9jdW1lbnQgc3BlY2lmaWMgdG9vbGJhcnMvbWVudXMgd2hlbiB1c2VkCi0gICAgICB3aXRoIHRoZSBMSU5LIGVsZW1lbnQgaW4gZG9jdW1lbnQgaGVhZCBlLmcuCi0gICAgICAgIHN0YXJ0LCBjb250ZW50cywgcHJldmlvdXMsIG5leHQsIGluZGV4LCBlbmQsIGhlbHAKLSAgIGIpIHRvIGxpbmsgdG8gYSBzZXBhcmF0ZSBzdHlsZSBzaGVldCAocmVsPXN0eWxlc2hlZXQpCi0gICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPXNjcmlwdCkKLSAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mCi0gICAgICBodG1sIG5vZGVzIGFyZSByZW5kZXJlZCBpbnRvIHByaW50ZWQgZG9jdW1lbnRzCi0gICBlKSB0byBtYWtlIGEgbGluayB0byBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIGUuZy4gYSBwb3N0c2NyaXB0IG9yIHBkZiB2ZXJzaW9uIChyZWw9YWx0ZXJuYXRlIG1lZGlhPXByaW50KQotLS0+Ci0KLTwhRUxFTUVOVCBMSU5LIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGEgbWVkaWEtaW5kZXBlbmRlbnQgbGluayAtLT4KLTwhQVRUTElTVCBMSU5LCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRCAgLS0gY2hhciBlbmNvZGluZyBvZiBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIGhyZWZsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBhZHZpc29yeSBjb250ZW50IHR5cGUgLS0KLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIGZvcndhcmQgbGluayB0eXBlcyAtLQotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gcmV2ZXJzZSBsaW5rIHR5cGVzIC0tCi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVEICAtLSBmb3IgcmVuZGVyaW5nIG9uIHRoZXNlIG1lZGlhIC0tCi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVEICAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEltYWdlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gTGVuZ3RoIGRlZmluZWQgaW4gc3RyaWN0IERURCBmb3IgY2VsbHBhZGRpbmcvY2VsbHNwYWNpbmcgLS0+Ci08IUVOVElUWSAlIExlbmd0aCAiQ0RBVEEiIC0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhRU5USVRZICUgTXVsdGlMZW5ndGggIkNEQVRBIiAtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci0KLTwhWyAlSFRNTC5GcmFtZXNldDsgWwotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aHMgIkNEQVRBIiAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBNdWx0aUxlbmd0aCAtLT4KLV1dPgotCi08IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiIC0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci0KLTwhRU5USVRZICUgSUFsaWduICIodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkiIC0tIGNlbnRlcj8gLS0+Ci0KLTwhLS0gVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0ZXh0LW9ubHkgVUFzIGFzIHdlbGwgYXMgCi0gICB0byBtYWtlIGltYWdlIGNvbnRlbnQgdW5kZXJzdGFuZGFibGUgYW5kIG5hdmlnYWJsZSAKLSAgIHRvIHVzZXJzIG9mIG5vbi12aXN1YWwgVUFzLCB5b3UgbmVlZCB0byBwcm92aWRlCi0gICBhIGRlc2NyaXB0aW9uIHdpdGggQUxULCBhbmQgYXZvaWQgc2VydmVyLXNpZGUgaW1hZ2UgbWFwcyAtLT4KLTwhRUxFTUVOVCBJTUcgLSBPIEVNUFRZICAgICAgICAgICAgICAgIC0tIEVtYmVkZGVkIGltYWdlIC0tPgotPCFBVFRMSVNUIElNRwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIFVSSSBvZiBpbWFnZSB0byBlbWJlZCAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGxpbmsgdG8gbG9uZyBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZW1lbnRzIGFsdCkgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgaW1hZ2UgZm9yIHNjcmlwdGluZyAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgaGVpZ2h0IC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSB3aWR0aCAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRCAgLS0gdXNlIHNlcnZlci1zaWRlIGltYWdlIG1hcCAtLQotICBhbGlnbiAgICAgICAlSUFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGxpbmsgYm9yZGVyIHdpZHRoIC0tCi0gIGhzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBob3Jpem9udGFsIGd1dHRlciAtLQotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgZ3V0dGVyIC0tCi0gID4KLQotPCEtLSBVU0VNQVAgcG9pbnRzIHRvIGEgTUFQIGVsZW1lbnQgd2hpY2ggbWF5IGJlIGluIHRoaXMgZG9jdW1lbnQKLSAgb3IgYW4gZXh0ZXJuYWwgZG9jdW1lbnQsIGFsdGhvdWdoIHRoZSBsYXR0ZXIgaXMgbm90IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PSBPQkpFQ1QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0KLSAgT0JKRUNUIGlzIHVzZWQgdG8gZW1iZWQgb2JqZWN0cyBhcyBwYXJ0IG9mIEhUTUwgcGFnZXMgCi0gIFBBUkFNIGVsZW1lbnRzIHNob3VsZCBwcmVjZWRlIG90aGVyIGNvbnRlbnQuIFNHTUwgbWl4ZWQgY29udGVudAotICBtb2RlbCB0ZWNobmljYWxpdHkgcHJlY2x1ZGVzIHNwZWNpZnlpbmcgdGhpcyBmb3JtYWxseSAuLi4KLS0tPgotCi08IUVMRU1FTlQgT0JKRUNUIC0gLSAoUEFSQU0gfCAlZmxvdzspKgotIC0tIGdlbmVyaWMgZW1iZWRkZWQgb2JqZWN0IC0tPgotPCFBVFRMSVNUIE9CSkVDVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgZGVjbGFyZSAgICAgKGRlY2xhcmUpICAgICAgI0lNUExJRUQgIC0tIGRlY2xhcmUgYnV0IGRvbid0IGluc3RhbnRpYXRlIGZsYWcgLS0KLSAgY2xhc3NpZCAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGlkZW50aWZpZXMgYW4gaW1wbGVtZW50YXRpb24gLS0KLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGJhc2UgVVJJIGZvciBjbGFzc2lkLCBkYXRhLCBhcmNoaXZlLS0KLSAgZGF0YSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHJlZmVyZW5jZSB0byBvYmplY3QncyBkYXRhIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIGRhdGEgLS0KLSAgY29kZXR5cGUgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGNvbnRlbnQgdHlwZSBmb3IgY29kZSAtLQotICBhcmNoaXZlICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyAtLQotICBzdGFuZGJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gbWVzc2FnZSB0byBzaG93IHdoaWxlIGxvYWRpbmcgLS0KLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIGhlaWdodCAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgd2lkdGggLS0KLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHN1Ym1pdCBhcyBwYXJ0IG9mIGZvcm0gLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWxpZ24gICAgICAgJUlBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBsaW5rIGJvcmRlciB3aWR0aCAtLQotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gaG9yaXpvbnRhbCBndXR0ZXIgLS0KLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIGd1dHRlciAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgUEFSQU0gLSBPIEVNUFRZICAgICAgICAgICAgICAtLSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZSAtLT4KLTwhQVRUTElTVCBQQVJBTQotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVEIC0tIHByb3BlcnR5IG5hbWUgLS0KLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHByb3BlcnR5IHZhbHVlIC0tCi0gIHZhbHVldHlwZSAgIChEQVRBfFJFRnxPQkpFQ1QpIERBVEEgICAtLSBIb3cgdG8gaW50ZXJwcmV0IHZhbHVlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHZhbHVldHlwZT1yZWYgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBKYXZhIEFQUExFVCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIE9uZSBvZiBjb2RlIG9yIG9iamVjdCBhdHRyaWJ1dGVzIG11c3QgYmUgcHJlc2VudC4KLSAgUGxhY2UgUEFSQU0gZWxlbWVudHMgYmVmb3JlIG90aGVyIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBBUFBMRVQgLSAtIChQQVJBTSB8ICVmbG93OykqIC0tIEphdmEgYXBwbGV0IC0tPgotPCFBVFRMSVNUIEFQUExFVAotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIG9wdGlvbmFsIGJhc2UgVVJJIGZvciBhcHBsZXQgLS0KLSAgYXJjaGl2ZSAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBhcmNoaXZlIGxpc3QgLS0KLSAgY29kZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGFwcGxldCBjbGFzcyBmaWxlIC0tCi0gIG9iamVjdCAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzZXJpYWxpemVkIGFwcGxldCBmaWxlIC0tCi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gYWxsb3dzIGFwcGxldHMgdG8gZmluZCBlYWNoIG90aGVyIC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNSRVFVSVJFRCAtLSBpbml0aWFsIHdpZHRoIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNSRVFVSVJFRCAtLSBpbml0aWFsIGhlaWdodCAtLQotICBhbGlnbiAgICAgICAlSUFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGhvcml6b250YWwgZ3V0dGVyIC0tCi0gIHZzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBndXR0ZXIgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIb3Jpem9udGFsIFJ1bGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgSFIgLSBPIEVNUFRZIC0tIGhvcml6b250YWwgcnVsZSAtLT4KLTwhQVRUTElTVCBIUgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWxpZ24gICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRAotICBub3NoYWRlICAgICAobm9zaGFkZSkgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFBhcmFncmFwaHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBQIC0gTyAoJWlubGluZTspKiAgICAgICAgICAgIC0tIHBhcmFncmFwaCAtLT4KLTwhQVRUTElTVCBQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gYWxpZ24sIHRleHQgYWxpZ25tZW50IC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSGVhZGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBUaGVyZSBhcmUgc2l4IGxldmVscyBvZiBoZWFkaW5ncyBmcm9tIEgxICh0aGUgbW9zdCBpbXBvcnRhbnQpCi0gIHRvIEg2ICh0aGUgbGVhc3QgaW1wb3J0YW50KS4KLS0tPgotCi08IUVMRU1FTlQgKCVoZWFkaW5nOykgIC0gLSAoJWlubGluZTspKiAtLSBoZWFkaW5nIC0tPgotPCFBVFRMSVNUICglaGVhZGluZzspCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gYWxpZ24sIHRleHQgYWxpZ25tZW50IC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUHJlZm9ybWF0dGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBleGNsdWRlcyBtYXJrdXAgZm9yIGltYWdlcyBhbmQgY2hhbmdlcyBpbiBmb250IHNpemUgLS0+Ci08IUVOVElUWSAlIHByZS5leGNsdXNpb24gIklNR3xPQkpFQ1R8QVBQTEVUfEJJR3xTTUFMTHxTVUJ8U1VQfEZPTlR8QkFTRUZPTlQiPgotCi08IUVMRU1FTlQgUFJFIC0gLSAoJWlubGluZTspKiAtKCVwcmUuZXhjbHVzaW9uOykgLS0gcHJlZm9ybWF0dGVkIHRleHQgLS0+Ci08IUFUVExJU1QgUFJFCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICB3aWR0aCAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT0gSW5saW5lIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBRIC0gLSAoJWlubGluZTspKiAgICAgICAgICAgIC0tIHNob3J0IGlubGluZSBxdW90YXRpb24gLS0+Ci08IUFUVExJU1QgUQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3Igc291cmNlIGRvY3VtZW50IG9yIG1zZyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEJsb2NrLWxpa2UgUXVvdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBCTE9DS1FVT1RFIC0gLSAoJWZsb3c7KSogICAgIC0tIGxvbmcgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIEJMT0NLUVVPVEUKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIHNvdXJjZSBkb2N1bWVudCBvciBtc2cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbnNlcnRlZC9EZWxldGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0KLTwhLS0gSU5TL0RFTCBhcmUgaGFuZGxlZCBieSBpbmNsdXNpb24gb24gQk9EWSAtLT4KLTwhRUxFTUVOVCAoSU5TfERFTCkgLSAtICglZmxvdzspKiAgICAgIC0tIGluc2VydGVkIHRleHQsIGRlbGV0ZWQgdGV4dCAtLT4KLTwhQVRUTElTVCAoSU5TfERFTCkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBpbmZvIG9uIHJlYXNvbiBmb3IgY2hhbmdlIC0tCi0gIGRhdGV0aW1lICAgICVEYXRldGltZTsgICAgICNJTVBMSUVEICAtLSBkYXRlIGFuZCB0aW1lIG9mIGNoYW5nZSAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IExpc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZGVmaW5pdGlvbiBsaXN0cyAtIERUIGZvciB0ZXJtLCBERCBmb3IgaXRzIGRlZmluaXRpb24gLS0+Ci0KLTwhRUxFTUVOVCBETCAtIC0gKERUfEREKSsgICAgICAgICAgICAgIC0tIGRlZmluaXRpb24gbGlzdCAtLT4KLTwhQVRUTElTVCBETAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQgIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgPgotCi08IUVMRU1FTlQgRFQgLSBPICglaW5saW5lOykqICAgICAgICAgICAtLSBkZWZpbml0aW9uIHRlcm0gLS0+Ci08IUVMRU1FTlQgREQgLSBPICglZmxvdzspKiAgICAgICAgICAgICAtLSBkZWZpbml0aW9uIGRlc2NyaXB0aW9uIC0tPgotPCFBVFRMSVNUIChEVHxERCkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLSBPcmRlcmVkIGxpc3RzIChPTCkgTnVtYmVyaW5nIHN0eWxlCi0KLSAgICAxICAgYXJhYmxpYyBudW1iZXJzICAgICAxLCAyLCAzLCAuLi4KLSAgICBhICAgbG93ZXIgYWxwaGEgICAgICAgICBhLCBiLCBjLCAuLi4KLSAgICBBICAgdXBwZXIgYWxwaGEgICAgICAgICBBLCBCLCBDLCAuLi4KLSAgICBpICAgbG93ZXIgcm9tYW4gICAgICAgICBpLCBpaSwgaWlpLCAuLi4KLSAgICBJICAgdXBwZXIgcm9tYW4gICAgICAgICBJLCBJSSwgSUlJLCAuLi4KLQotICAgIFRoZSBzdHlsZSBpcyBhcHBsaWVkIHRvIHRoZSBzZXF1ZW5jZSBudW1iZXIgd2hpY2ggYnkgZGVmYXVsdAotICAgIGlzIHJlc2V0IHRvIDEgZm9yIHRoZSBmaXJzdCBsaXN0IGl0ZW0gaW4gYW4gb3JkZXJlZCBsaXN0LgotCi0gICAgVGhpcyBjYW4ndCBiZSBleHByZXNzZWQgZGlyZWN0bHkgaW4gU0dNTCBkdWUgdG8gY2FzZSBmb2xkaW5nLgotLS0+Ci0KLTwhRU5USVRZICUgT0xTdHlsZSAiQ0RBVEEiICAgICAgLS0gY29uc3RyYWluZWQgdG86ICIoMXxhfEF8aXxJKSIgLS0+Ci0KLTwhRUxFTUVOVCBPTCAtIC0gKExJKSsgICAgICAgICAgICAgICAgIC0tIG9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBPTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJU9MU3R5bGU7ICAgICAgI0lNUExJRUQgIC0tIG51bWJlcmluZyBzdHlsZSAtLQotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRCAgLS0gcmVkdWNlZCBpbnRlcml0ZW0gc3BhY2luZyAtLQotICBzdGFydCAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIC0tCi0gID4KLQotPCEtLSBVbm9yZGVyZWQgTGlzdHMgKFVMKSBidWxsZXQgc3R5bGVzIC0tPgotPCFFTlRJVFkgJSBVTFN0eWxlICIoZGlzY3xzcXVhcmV8Y2lyY2xlKSI+Ci0KLTwhRUxFTUVOVCBVTCAtIC0gKExJKSsgICAgICAgICAgICAgICAgIC0tIHVub3JkZXJlZCBsaXN0IC0tPgotPCFBVFRMSVNUIFVMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICB0eXBlICAgICAgICAlVUxTdHlsZTsgICAgICAjSU1QTElFRCAgLS0gYnVsbGV0IHN0eWxlIC0tCi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVEICAtLSByZWR1Y2VkIGludGVyaXRlbSBzcGFjaW5nIC0tCi0gID4KLQotPCFFTEVNRU5UIChESVJ8TUVOVSkgLSAtIChMSSkrIC0oJWJsb2NrOykgLS0gZGlyZWN0b3J5IGxpc3QsIG1lbnUgbGlzdCAtLT4KLTwhQVRUTElTVCBESVIKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVEIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgPgotPCFBVFRMSVNUIE1FTlUKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVEIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgPgotCi08IUVOVElUWSAlIExJU3R5bGUgIkNEQVRBIiAtLSBjb25zdHJhaW5lZCB0bzogIiglVUxTdHlsZTt8JU9MU3R5bGU7KSIgLS0+Ci0KLTwhRUxFTUVOVCBMSSAtIE8gKCVmbG93OykqICAgICAgICAgICAgIC0tIGxpc3QgaXRlbSAtLT4KLTwhQVRUTElTVCBMSQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUxJU3R5bGU7ICAgICAgI0lNUExJRUQgIC0tIGxpc3QgaXRlbSBzdHlsZSAtLQotICB2YWx1ZSAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXQgc2VxdWVuY2UgbnVtYmVyIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRm9ybXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhRUxFTUVOVCBGT1JNIC0gLSAoJWZsb3c7KSogLShGT1JNKSAgIC0tIGludGVyYWN0aXZlIGZvcm0gLS0+Ci08IUFUVExJU1QgRk9STQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWN0aW9uICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIHNlcnZlci1zaWRlIGZvcm0gaGFuZGxlciAtLQotICBtZXRob2QgICAgICAoR0VUfFBPU1QpICAgICBHRVQgICAgICAgLS0gSFRUUCBtZXRob2QgdXNlZCB0byBzdWJtaXQgdGhlIGZvcm0tLQotICBlbmN0eXBlICAgICAlQ29udGVudFR5cGU7ICAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRCAgLS0gbGlzdCBvZiBNSU1FIHR5cGVzIGZvciBmaWxlIHVwbG9hZCAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZSBvZiBmb3JtIGZvciBzY3JpcHRpbmcgLS0KLSAgb25zdWJtaXQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBmb3JtIHdhcyBzdWJtaXR0ZWQgLS0KLSAgb25yZXNldCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBmb3JtIHdhcyByZXNldCAtLQotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRCAgLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0KLSAgYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAgI0lNUExJRUQgIC0tIGxpc3Qgb2Ygc3VwcG9ydGVkIGNoYXJzZXRzIC0tCi0gID4KLQotPCEtLSBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZCAtLT4KLTwhRUxFTUVOVCBMQUJFTCAtIC0gKCVpbmxpbmU7KSogLShMQUJFTCkgLS0gZm9ybSBmaWVsZCBsYWJlbCB0ZXh0IC0tPgotPCFBVFRMSVNUIExBQkVMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBmb3IgICAgICAgICBJRFJFRiAgICAgICAgICAjSU1QTElFRCAgLS0gbWF0Y2hlcyBmaWVsZCBJRCB2YWx1ZSAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICA+Ci0KLTwhRU5USVRZICUgSW5wdXRUeXBlCi0gICIoVEVYVCB8IFBBU1NXT1JEIHwgQ0hFQ0tCT1ggfAotICAgIFJBRElPIHwgU1VCTUlUIHwgUkVTRVQgfAotICAgIEZJTEUgfCBISURERU4gfCBJTUFHRSB8IEJVVFRPTikiCi0gICA+Ci0KLTwhLS0gYXR0cmlidXRlIG5hbWUgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0IGFuZCByZXNldCAtLT4KLTwhRUxFTUVOVCBJTlBVVCAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBJTlBVVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUlucHV0VHlwZTsgICAgVEVYVCAgICAgIC0tIHdoYXQga2luZCBvZiB3aWRnZXQgaXMgbmVlZGVkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBTcGVjaWZ5IGZvciByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzIC0tCi0gIGNoZWNrZWQgICAgIChjaGVja2VkKSAgICAgICNJTVBMSUVEICAtLSBmb3IgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2sgYm94ZXMgLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRCAgLS0gZm9yIHRleHQgYW5kIHBhc3N3ZCAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3BlY2lmaWMgdG8gZWFjaCB0eXBlIG9mIGZpZWxkIC0tCi0gIG1heGxlbmd0aCAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBtYXggY2hhcnMgZm9yIHRleHQgZmllbGRzIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBmb3IgZmllbGRzIHdpdGggaW1hZ2VzIC0tCi0gIGFsdCAgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRCAgLS0gdXNlIHNlcnZlci1zaWRlIGltYWdlIG1hcCAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gc29tZSB0ZXh0IHdhcyBzZWxlY3RlZCAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgTUlNRSB0eXBlcyBmb3IgZmlsZSB1cGxvYWQgLS0KLSAgYWxpZ24gICAgICAgJUlBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBTRUxFQ1QgLSAtIChPUFRHUk9VUHxPUFRJT04pKyAtLSBvcHRpb24gc2VsZWN0b3IgLS0+Ci08IUFUVExJU1QgU0VMRUNUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gZmllbGQgbmFtZSAtLQotICBzaXplICAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcm93cyB2aXNpYmxlIC0tCi0gIG11bHRpcGxlICAgIChtdWx0aXBsZSkgICAgICNJTVBMSUVEICAtLSBkZWZhdWx0IGlzIHNpbmdsZSBzZWxlY3Rpb24gLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IHZhbHVlIHdhcyBjaGFuZ2VkIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBPUFRHUk9VUCAtIC0gKE9QVElPTikrIC0tIG9wdGlvbiBncm91cCAtLT4KLTwhQVRUTElTVCBPUFRHUk9VUAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gZm9yIHVzZSBpbiBoaWVyYXJjaGljYWwgbWVudXMgLS0KLSAgPgotCi08IUVMRU1FTlQgT1BUSU9OIC0gTyAoI1BDREFUQSkgICAgICAgICAtLSBzZWxlY3RhYmxlIGNob2ljZSAtLT4KLTwhQVRUTElTVCBPUFRJT04KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNlbGVjdGVkICAgIChzZWxlY3RlZCkgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGZvciB1c2UgaW4gaGllcmFyY2hpY2FsIG1lbnVzIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBkZWZhdWx0cyB0byBlbGVtZW50IGNvbnRlbnQgLS0KLSAgPgotCi08IUVMRU1FTlQgVEVYVEFSRUEgLSAtICgjUENEQVRBKSAgICAgICAtLSBtdWx0aS1saW5lIHRleHQgZmllbGQgLS0+Ci08IUFUVExJU1QgVEVYVEFSRUEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHJvd3MgICAgICAgIE5VTUJFUiAgICAgICAgICNSRVFVSVJFRAotICBjb2xzICAgICAgICBOVU1CRVIgICAgICAgICAjUkVRVUlSRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gc29tZSB0ZXh0IHdhcyBzZWxlY3RlZCAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCEtLQotICAjUENEQVRBIGlzIHRvIHNvbHZlIHRoZSBtaXhlZCBjb250ZW50IHByb2JsZW0sCi0gIHBlciBzcGVjaWZpY2F0aW9uIG9ubHkgd2hpdGVzcGFjZSBpcyBhbGxvd2VkIHRoZXJlIQotIC0tPgotPCFFTEVNRU5UIEZJRUxEU0VUIC0gLSAoI1BDREFUQSxMRUdFTkQsKCVmbG93OykqKSAtLSBmb3JtIGNvbnRyb2wgZ3JvdXAgLS0+Ci08IUFUVExJU1QgRklFTERTRVQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIExFR0VORCAtIC0gKCVpbmxpbmU7KSogICAgICAgLS0gZmllbGRzZXQgbGVnZW5kIC0tPgotPCFFTlRJVFkgJSBMQWxpZ24gIih0b3B8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCFBVFRMSVNUIExFR0VORAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBhbGlnbiAgICAgICAlTEFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gcmVsYXRpdmUgdG8gZmllbGRzZXQgLS0KLSAgPgotCi08IUVMRU1FTlQgQlVUVE9OIC0gLQotICAgICAoJWZsb3c7KSogLShBfCVmb3JtY3RybDt8Rk9STXxJU0lOREVYfEZJRUxEU0VUfElGUkFNRSkKLSAgICAgLS0gcHVzaCBidXR0b24gLS0+Ci08IUFUVExJU1QgQlVUVE9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VudCB0byBzZXJ2ZXIgd2hlbiBzdWJtaXR0ZWQgLS0KLSAgdHlwZSAgICAgICAgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpIHN1Ym1pdCAtLSBmb3IgdXNlIGFzIGZvcm0gYnV0dG9uIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09IFRhYmxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBJRVRGIEhUTUwgdGFibGUgc3RhbmRhcmQsIHNlZSBbUkZDMTk0Ml0gLS0+Ci0KLTwhLS0KLSBUaGUgQk9SREVSIGF0dHJpYnV0ZSBzZXRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGZyYW1lIGFyb3VuZCB0aGUKLSB0YWJsZS4gVGhlIGRlZmF1bHQgdW5pdHMgYXJlIHNjcmVlbiBwaXhlbHMuCi0KLSBUaGUgRlJBTUUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgZnJhbWUgYXJvdW5kCi0gdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gQ0FMUyB0byBhdm9pZCBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgVkFMSUdOIGF0dHJpYnV0ZS4KLQotIFRoZSB2YWx1ZSAiYm9yZGVyIiBpcyBpbmNsdWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAotIDxUQUJMRSBCT1JERVI+IHdoaWNoIHlpZWxkcyBmcmFtZT1ib3JkZXIgYW5kIGJvcmRlcj1pbXBsaWVkCi0gRm9yIDxUQUJMRSBCT1JERVI9MT4geW91IGdldCBib3JkZXI9MSBhbmQgZnJhbWU9aW1wbGllZC4gSW4gdGhpcwotIGNhc2UsIGl0IGlzIGFwcHJvcHJpYXRlIHRvIHRyZWF0IHRoaXMgYXMgZnJhbWU9Ym9yZGVyIGZvciBiYWNrd2FyZHMKLSBjb21wYXRpYmlsaXR5IHdpdGggZGVwbG95ZWQgYnJvd3NlcnMuCi0tLT4KLTwhRU5USVRZICUgVEZyYW1lICIodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikiPgotCi08IS0tCi0gVGhlIFJVTEVTIGF0dHJpYnV0ZSBkZWZpbmVzIHdoaWNoIHJ1bGVzIHRvIGRyYXcgYmV0d2VlbiBjZWxsczoKLQotIElmIFJVTEVTIGlzIGFic2VudCB0aGVuIGFzc3VtZToKLSAgICAgIm5vbmUiIGlmIEJPUkRFUiBpcyBhYnNlbnQgb3IgQk9SREVSPTAgb3RoZXJ3aXNlICJhbGwiCi0tLT4KLQotPCFFTlRJVFkgJSBUUnVsZXMgIihub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpIj4KLSAgCi08IS0tIGhvcml6b250YWwgcGxhY2VtZW50IG9mIHRhYmxlIHJlbGF0aXZlIHRvIGRvY3VtZW50IC0tPgotPCFFTlRJVFkgJSBUQWxpZ24gIihsZWZ0fGNlbnRlcnxyaWdodCkiPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGxoYWxpZ24KLSAgImFsaWduICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQKLSAgIGNoYXIgICAgICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFsaWdubWVudCBjaGFyLCBlLmcuIGNoYXI9JzonIC0tCi0gICBjaGFyb2ZmICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvZmZzZXQgZm9yIGFsaWdubWVudCBjaGFyIC0tIgotICA+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGx2YWxpZ24KLSAgInZhbGlnbiAgICAgKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCIKLSAgPgotCi08IUVMRU1FTlQgVEFCTEUgLSAtCi0gICAgIChDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKyk+Ci08IUVMRU1FTlQgQ0FQVElPTiAgLSAtICglaW5saW5lOykqICAgICAtLSB0YWJsZSBjYXB0aW9uIC0tPgotPCFFTEVNRU5UIFRIRUFEICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgaGVhZGVyIC0tPgotPCFFTEVNRU5UIFRGT09UICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgZm9vdGVyIC0tPgotPCFFTEVNRU5UIFRCT0RZICAgIE8gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgYm9keSAtLT4KLTwhRUxFTUVOVCBDT0xHUk9VUCAtIE8gKENPTCkqICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiBncm91cCAtLT4KLTwhRUxFTUVOVCBDT0wgICAgICAtIE8gRU1QVFkgICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiAtLT4KLTwhRUxFTUVOVCBUUiAgICAgICAtIE8gKFRIfFREKSsgICAgICAgIC0tIHRhYmxlIHJvdyAtLT4KLTwhRUxFTUVOVCAoVEh8VEQpICAtIE8gKCVmbG93OykqICAgICAgIC0tIHRhYmxlIGhlYWRlciBjZWxsLCB0YWJsZSBkYXRhIGNlbGwtLT4KLQotPCFBVFRMSVNUIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGFibGUgZWxlbWVudCAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3VtbWFyeSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIHB1cnBvc2Uvc3RydWN0dXJlIGZvciBzcGVlY2ggb3V0cHV0LS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHRhYmxlIHdpZHRoIC0tCi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBjb250cm9scyBmcmFtZSB3aWR0aCBhcm91bmQgdGFibGUgLS0KLSAgZnJhbWUgICAgICAgJVRGcmFtZTsgICAgICAgI0lNUExJRUQgIC0tIHdoaWNoIHBhcnRzIG9mIGZyYW1lIHRvIHJlbmRlciAtLQotICBydWxlcyAgICAgICAlVFJ1bGVzOyAgICAgICAjSU1QTElFRCAgLS0gcnVsaW5ncyBiZXR3ZWVuIHJvd3MgYW5kIGNvbHMgLS0KLSAgY2VsbHNwYWNpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHNwYWNpbmcgYmV0d2VlbiBjZWxscyAtLQotICBjZWxscGFkZGluZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gc3BhY2luZyB3aXRoaW4gY2VsbHMgLS0KLSAgYWxpZ24gICAgICAgJVRBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHRhYmxlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHdpbmRvdyAtLQotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gYmFja2dyb3VuZCBjb2xvciBmb3IgY2VsbHMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gIGRhdGFwYWdlc2l6ZSBDREFUQSAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRU5USVRZICUgQ0FsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBDQVBUSU9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBhbGlnbiAgICAgICAlQ0FsaWduOyAgICAgICAjSU1QTElFRCAgLS0gcmVsYXRpdmUgdG8gdGFibGUgLS0KLSAgPgotCi08IS0tCi1DT0xHUk9VUCBncm91cHMgYSBzZXQgb2YgQ09MIGVsZW1lbnRzLiBJdCBhbGxvd3MgeW91IHRvIGdyb3VwCi1zZXZlcmFsIHNlbWFudGljYWxseSByZWxhdGVkIGNvbHVtbnMgdG9nZXRoZXIuCi0tLT4KLTwhQVRUTElTVCBDT0xHUk9VUAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3BhbiAgICAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIGRlZmF1bHQgbnVtYmVyIG9mIGNvbHVtbnMgaW4gZ3JvdXAgLS0KLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQgIC0tIGRlZmF1bHQgd2lkdGggZm9yIGVuY2xvc2VkIENPTHMgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi08IS0tCi0gQ09MIGVsZW1lbnRzIGRlZmluZSB0aGUgYWxpZ25tZW50IHByb3BlcnRpZXMgZm9yIGNlbGxzIGluCi0gb25lIG9yIG1vcmUgY29sdW1ucy4KLQotIFRoZSBXSURUSCBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1ucywgZS5nLgotCi0gICAgIHdpZHRoPTY0ICAgICAgICB3aWR0aCBpbiBzY3JlZW4gcGl4ZWxzCi0gICAgIHdpZHRoPTAuNSogICAgICByZWxhdGl2ZSB3aWR0aCBvZiAwLjUKLQotIFRoZSBTUEFOIGF0dHJpYnV0ZSBjYXVzZXMgdGhlIGF0dHJpYnV0ZXMgb2Ygb25lCi0gQ09MIGVsZW1lbnQgdG8gYXBwbHkgdG8gbW9yZSB0aGFuIG9uZSBjb2x1bW4uCi0tLT4KLTwhQVRUTElTVCBDT0wgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGNvbHVtbiBncm91cHMgYW5kIHByb3BlcnRpZXMgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNwYW4gICAgICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBDT0wgYXR0cmlidXRlcyBhZmZlY3QgTiBjb2x1bW5zIC0tCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVEICAtLSBjb2x1bW4gd2lkdGggc3BlY2lmaWNhdGlvbiAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLTwhLS0KLSAgICBVc2UgVEhFQUQgdG8gZHVwbGljYXRlIGhlYWRlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgaGVhZGVycyB3aGVuCi0gICAgVEJPRFkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBURk9PVCB0byBkdXBsaWNhdGUgZm9vdGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBmb290ZXJzIHdoZW4KLSAgICBUQk9EWSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIG11bHRpcGxlIFRCT0RZIHNlY3Rpb25zIHdoZW4gcnVsZXMgYXJlIG5lZWRlZAotICAgIGJldHdlZW4gZ3JvdXBzIG9mIHRhYmxlIHJvd3MuCi0tLT4KLTwhQVRUTElTVCAoVEhFQUR8VEJPRFl8VEZPT1QpICAgICAgICAgIC0tIHRhYmxlIHNlY3Rpb24gLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotPCFBVFRMSVNUIFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGFibGUgcm93IC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gYmFja2dyb3VuZCBjb2xvciBmb3Igcm93IC0tCi0gID4KLQotCi08IS0tIFNjb3BlIGlzIHNpbXBsZXIgdGhhbiBoZWFkZXJzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcyAtLT4KLTwhRU5USVRZICUgU2NvcGUgIihyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKSI+Ci0KLTwhLS0gVEggaXMgZm9yIGhlYWRlcnMsIFREIGZvciBkYXRhLCBidXQgZm9yIGNlbGxzIGFjdGluZyBhcyBib3RoIHVzZSBURCAtLT4KLTwhQVRUTElTVCAoVEh8VEQpICAgICAgICAgICAgICAgICAgICAgIC0tIGhlYWRlciBvciBkYXRhIGNlbGwgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBhYmJyZXZpYXRpb24gZm9yIGhlYWRlciBjZWxsIC0tCi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWxhdGVkIGhlYWRlcnMtLQotICBoZWFkZXJzICAgICBJRFJFRlMgICAgICAgICAjSU1QTElFRCAgLS0gbGlzdCBvZiBpZCdzIGZvciBoZWFkZXIgY2VsbHMgLS0KLSAgc2NvcGUgICAgICAgJVNjb3BlOyAgICAgICAgI0lNUExJRUQgIC0tIHNjb3BlIGNvdmVyZWQgYnkgaGVhZGVyIGNlbGxzIC0tCi0gIHJvd3NwYW4gICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBudW1iZXIgb2Ygcm93cyBzcGFubmVkIGJ5IGNlbGwgLS0KLSAgY29sc3BhbiAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIG51bWJlciBvZiBjb2xzIHNwYW5uZWQgYnkgY2VsbCAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICBub3dyYXAgICAgICAobm93cmFwKSAgICAgICAjSU1QTElFRCAgLS0gc3VwcHJlc3Mgd29yZCB3cmFwIC0tCi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBjZWxsIGJhY2tncm91bmQgY29sb3IgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHdpZHRoIGZvciBjZWxsIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBoZWlnaHQgZm9yIGNlbGwgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IERvY3VtZW50IEZyYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZSBjb250ZW50IG1vZGVsIGZvciBIVE1MIGRvY3VtZW50cyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIEhFQUQgaXMKLSAgZm9sbG93ZWQgYnkgYSBGUkFNRVNFVCBvciBCT0RZIGVsZW1lbnQuIFRoZSB3aWRlc3ByZWFkIG9taXNzaW9uIG9mCi0gIHRoZSBCT0RZIHN0YXJ0IHRhZyBtYWtlcyBpdCBpbXByYWN0aWNhbCB0byBkZWZpbmUgdGhlIGNvbnRlbnQgbW9kZWwKLSAgd2l0aG91dCB0aGUgdXNlIG9mIGEgbWFya2VkIHNlY3Rpb24uCi0tLT4KLQotPCFbICVIVE1MLkZyYW1lc2V0OyBbCi08IUVMRU1FTlQgRlJBTUVTRVQgLSAtICgoRlJBTUVTRVR8RlJBTUUpKyAmIE5PRlJBTUVTPykgLS0gd2luZG93IHN1YmRpdmlzaW9uLS0+Ci08IUFUVExJU1QgRlJBTUVTRVQKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIHJvd3MgICAgICAgICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVEICAtLSBsaXN0IG9mIGxlbmd0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAxMDAlICgxIHJvdykgLS0KLSAgY29scyAgICAgICAgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDEwMCUgKDEgY29sKSAtLQotICBvbmxvYWQgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYWxsIHRoZSBmcmFtZXMgaGF2ZSBiZWVuIGxvYWRlZCAgLS0gCi0gIG9udW5sb2FkICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhbGwgdGhlIGZyYW1lcyBoYXZlIGJlZW4gcmVtb3ZlZCAtLSAKLSAgPgotXV0+Ci0KLTwhWyAlSFRNTC5GcmFtZXNldDsgWwotPCEtLSByZXNlcnZlZCBmcmFtZSBuYW1lcyBzdGFydCB3aXRoICJfIiBvdGhlcndpc2Ugc3RhcnRzIHdpdGggbGV0dGVyIC0tPgotPCFFTEVNRU5UIEZSQU1FIC0gTyBFTVBUWSAgICAgICAgICAgICAgLS0gc3Vid2luZG93IC0tPgotPCFBVFRMSVNUIEZSQU1FCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gbGluayB0byBsb25nIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcGxlbWVudHMgdGl0bGUpIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lIG9mIGZyYW1lIGZvciB0YXJnZXR0aW5nIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBzb3VyY2Ugb2YgZnJhbWUgY29udGVudCAtLQotICBmcmFtZWJvcmRlciAoMXwwKSAgICAgICAgICAxICAgICAgICAgLS0gcmVxdWVzdCBmcmFtZSBib3JkZXJzPyAtLQotICBtYXJnaW53aWR0aCAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gbWFyZ2luIHdpZHRocyBpbiBwaXhlbHMgLS0KLSAgbWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICAgICAgI0lNUExJRUQgIC0tIG1hcmdpbiBoZWlnaHQgaW4gcGl4ZWxzIC0tCi0gIG5vcmVzaXplICAgIChub3Jlc2l6ZSkgICAgICNJTVBMSUVEICAtLSBhbGxvdyB1c2VycyB0byByZXNpemUgZnJhbWVzPyAtLQotICBzY3JvbGxpbmcgICAoeWVzfG5vfGF1dG8pICBhdXRvICAgICAgLS0gc2Nyb2xsYmFyIG9yIG5vbmUgLS0KLSAgPgotXV0+Ci0KLTwhRUxFTUVOVCBJRlJBTUUgLSAtICglZmxvdzspKiAgICAgICAgIC0tIGlubGluZSBzdWJ3aW5kb3cgLS0+Ci08IUFUVExJU1QgSUZSQU1FCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gbGluayB0byBsb25nIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcGxlbWVudHMgdGl0bGUpIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lIG9mIGZyYW1lIGZvciB0YXJnZXR0aW5nIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBzb3VyY2Ugb2YgZnJhbWUgY29udGVudCAtLQotICBmcmFtZWJvcmRlciAoMXwwKSAgICAgICAgICAxICAgICAgICAgLS0gcmVxdWVzdCBmcmFtZSBib3JkZXJzPyAtLQotICBtYXJnaW53aWR0aCAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gbWFyZ2luIHdpZHRocyBpbiBwaXhlbHMgLS0KLSAgbWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICAgICAgI0lNUExJRUQgIC0tIG1hcmdpbiBoZWlnaHQgaW4gcGl4ZWxzIC0tCi0gIHNjcm9sbGluZyAgICh5ZXN8bm98YXV0bykgIGF1dG8gICAgICAtLSBzY3JvbGxiYXIgb3Igbm9uZSAtLQotICBhbGlnbiAgICAgICAlSUFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIGZyYW1lIGhlaWdodCAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gZnJhbWUgd2lkdGggLS0KLSAgPgotCi08IVsgJUhUTUwuRnJhbWVzZXQ7IFsKLTwhRU5USVRZICUgbm9mcmFtZXMuY29udGVudCAiKEJPRFkpIC0oTk9GUkFNRVMpIj4KLV1dPgotCi08IUVOVElUWSAlIG5vZnJhbWVzLmNvbnRlbnQgIiglZmxvdzspKiI+Ci0KLTwhRUxFTUVOVCBOT0ZSQU1FUyAtIC0gJW5vZnJhbWVzLmNvbnRlbnQ7Ci0gLS0gYWx0ZXJuYXRlIGNvbnRlbnQgY29udGFpbmVyIGZvciBub24gZnJhbWUtYmFzZWQgcmVuZGVyaW5nIC0tPgotPCFBVFRMSVNUIE5PRlJBTUVTCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IEhlYWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tICVoZWFkLm1pc2M7IGRlZmluZWQgZWFybGllciBvbiBhcyAiU0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1QiIC0tPgotPCFFTlRJVFkgJSBoZWFkLmNvbnRlbnQgIlRJVExFICYgSVNJTkRFWD8gJiBCQVNFPyI+Ci0KLTwhRUxFTUVOVCBIRUFEIE8gTyAoJWhlYWQuY29udGVudDspICsoJWhlYWQubWlzYzspIC0tIGRvY3VtZW50IGhlYWQgLS0+Ci08IUFUVExJU1QgSEVBRAotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyIC0tCi0gIHByb2ZpbGUgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lZCBkaWN0aW9uYXJ5IG9mIG1ldGEgaW5mbyAtLQotICA+Ci0KLTwhLS0gVGhlIFRJVExFIGVsZW1lbnQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgZmxvdyBvZiB0ZXh0LgotICAgICAgIEl0IHNob3VsZCBiZSBkaXNwbGF5ZWQsIGZvciBleGFtcGxlIGFzIHRoZSBwYWdlIGhlYWRlciBvcgotICAgICAgIHdpbmRvdyB0aXRsZS4gRXhhY3RseSBvbmUgdGl0bGUgaXMgcmVxdWlyZWQgcGVyIGRvY3VtZW50LgotICAgIC0tPgotPCFFTEVNRU5UIFRJVExFIC0gLSAoI1BDREFUQSkgLSglaGVhZC5taXNjOykgLS0gZG9jdW1lbnQgdGl0bGUgLS0+Ci08IUFUVExJU1QgVElUTEUgJWkxOG4+Ci0KLTwhRUxFTUVOVCBJU0lOREVYIC0gTyBFTVBUWSAgICAgICAgICAgIC0tIHNpbmdsZSBsaW5lIHByb21wdCAtLT4KLTwhQVRUTElTVCBJU0lOREVYCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyIC0tCi0gIHByb21wdCAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBwcm9tcHQgbWVzc2FnZSAtLT4KLQotPCFFTEVNRU5UIEJBU0UgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gZG9jdW1lbnQgYmFzZSBVUkkgLS0+Ci08IUFUVExJU1QgQkFTRQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIHRoYXQgYWN0cyBhcyBiYXNlIFVSSSAtLQotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRCAgLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0KLSAgPgotCi08IUVMRU1FTlQgTUVUQSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBnZW5lcmljIG1ldGFpbmZvcm1hdGlvbiAtLT4KLTwhQVRUTElTVCBNRVRBCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIsIGZvciB1c2Ugd2l0aCBjb250ZW50IC0tCi0gIGh0dHAtZXF1aXYgIE5BTUUgICAgICAgICAgICNJTVBMSUVEICAtLSBIVFRQIHJlc3BvbnNlIGhlYWRlciBuYW1lICAtLQotICBuYW1lICAgICAgICBOQU1FICAgICAgICAgICAjSU1QTElFRCAgLS0gbWV0YWluZm9ybWF0aW9uIG5hbWUgLS0KLSAgY29udGVudCAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVEIC0tIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gLS0KLSAgc2NoZW1lICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNlbGVjdCBmb3JtIG9mIGNvbnRlbnQgLS0KLSAgPgotCi08IUVMRU1FTlQgU1RZTEUgLSAtICVTdHlsZVNoZWV0ICAgICAgICAtLSBzdHlsZSBpbmZvIC0tPgotPCFBVFRMSVNUIFNUWUxFCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIsIGZvciB1c2Ugd2l0aCB0aXRsZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQgLS0gY29udGVudCB0eXBlIG9mIHN0eWxlIGxhbmd1YWdlIC0tCi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVEICAtLSBkZXNpZ25lZCBmb3IgdXNlIHdpdGggdGhlc2UgbWVkaWEgLS0KLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IHRpdGxlIC0tCi0gID4KLQotPCFFTEVNRU5UIFNDUklQVCAtIC0gJVNjcmlwdDsgICAgICAgICAgLS0gc2NyaXB0IHN0YXRlbWVudHMgLS0+Ci08IUFUVExJU1QgU0NSSVBUCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQgLS0gY29udGVudCB0eXBlIG9mIHNjcmlwdCBsYW5ndWFnZSAtLQotICBsYW5ndWFnZSAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gcHJlZGVmaW5lZCBzY3JpcHQgbGFuZ3VhZ2UgbmFtZSAtLQotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBhbiBleHRlcm5hbCBzY3JpcHQgLS0KLSAgZGVmZXIgICAgICAgKGRlZmVyKSAgICAgICAgI0lNUExJRUQgIC0tIFVBIG1heSBkZWZlciBleGVjdXRpb24gb2Ygc2NyaXB0IC0tCi0gIGV2ZW50ICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICBmb3IgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgTk9TQ1JJUFQgLSAtICglZmxvdzspKgotICAtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBzY3JpcHQtYmFzZWQgcmVuZGVyaW5nIC0tPgotPCFBVFRMSVNUIE5PU0NSSVBUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IFN0cnVjdHVyZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IUVOVElUWSAlIHZlcnNpb24gInZlcnNpb24gQ0RBVEEgI0ZJWEVEICclSFRNTC5WZXJzaW9uOyciPgotCi08IVsgJUhUTUwuRnJhbWVzZXQ7IFsKLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICJIRUFELCBGUkFNRVNFVCI+Ci1dXT4KLQotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEJPRFkiPgotCi08IUVMRU1FTlQgSFRNTCBPIE8gKCVodG1sLmNvbnRlbnQ7KSAgICAtLSBkb2N1bWVudCByb290IGVsZW1lbnQgLS0+Ci08IUFUVExJU1QgSFRNTAotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyIC0tCi0gICV2ZXJzaW9uOwotICA+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvc3RyaWN0LmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9zdHJpY3QuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDMyY2I4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9zdHJpY3QuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsODcwICswLDAgQEAKLTwhLS0KLSAgICBUaGlzIGlzIEhUTUwgNC4wMSBTdHJpY3QgRFRELCB3aGljaCBleGNsdWRlcyB0aGUgcHJlc2VudGF0aW9uIAotICAgIGF0dHJpYnV0ZXMgYW5kIGVsZW1lbnRzIHRoYXQgVzNDIGV4cGVjdHMgdG8gcGhhc2Ugb3V0IGFzIAotICAgIHN1cHBvcnQgZm9yIHN0eWxlIHNoZWV0cyBtYXR1cmVzLiBBdXRob3JzIHNob3VsZCB1c2UgdGhlIFN0cmljdAotICAgIERURCB3aGVuIHBvc3NpYmxlLCBidXQgbWF5IHVzZSB0aGUgVHJhbnNpdGlvbmFsIERURCB3aGVuIHN1cHBvcnQKLSAgICBmb3IgcHJlc2VudGF0aW9uIGF0dHJpYnV0ZSBhbmQgZWxlbWVudHMgaXMgcmVxdWlyZWQuCi0gICAgCi0gICAgSFRNTCA0IGluY2x1ZGVzIG1lY2hhbmlzbXMgZm9yIHN0eWxlIHNoZWV0cywgc2NyaXB0aW5nLAotICAgIGVtYmVkZGluZyBvYmplY3RzLCBpbXByb3ZlZCBzdXBwb3J0IGZvciByaWdodCB0byBsZWZ0IGFuZCBtaXhlZAotICAgIGRpcmVjdGlvbiB0ZXh0LCBhbmQgZW5oYW5jZW1lbnRzIHRvIGZvcm1zIGZvciBpbXByb3ZlZAotICAgIGFjY2Vzc2liaWxpdHkgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcy4KLQotICAgICAgICAgIERyYWZ0OiAkRGF0ZTogMjAwOC8wNy8yMiAwNzozNzowMSAkCi0KLSAgICAgICAgICBBdXRob3JzOgotICAgICAgICAgICAgICBEYXZlIFJhZ2dldHQgPGRzckB3My5vcmc+Ci0gICAgICAgICAgICAgIEFybmF1ZCBMZSBIb3JzIDxsZWhvcnNAdzMub3JnPgotICAgICAgICAgICAgICBJYW4gSmFjb2JzIDxpakB3My5vcmc+Ci0KLSAgICBGdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IEhUTUwgNC4wMSBpcyBhdmFpbGFibGUgYXQ6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNAotCi0KLSAgICBUaGUgSFRNTCA0LjAxIHNwZWNpZmljYXRpb24gaW5jbHVkZXMgYWRkaXRpb25hbAotICAgIHN5bnRhY3RpYyBjb25zdHJhaW50cyB0aGF0IGNhbm5vdCBiZSBleHByZXNzZWQgd2l0aGluCi0gICAgdGhlIERURHMuCi0KLS0tPgotPCEtLQotICAgIFR5cGljYWwgdXNhZ2U6Ci0KLSAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+Ci0gICAgPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgLi4uCi0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgIC4uLgotICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci0KLSAgICBUaGUgVVJJIHVzZWQgYXMgYSBzeXN0ZW0gaWRlbnRpZmllciB3aXRoIHRoZSBwdWJsaWMgaWRlbnRpZmllciBhbGxvd3MKLSAgICB0aGUgdXNlciBhZ2VudCB0byBkb3dubG9hZCB0aGUgRFREIGFuZCBlbnRpdHkgc2V0cyBhcyBuZWVkZWQuCi0KLSAgICBUaGUgRlBJIGZvciB0aGUgVHJhbnNpdGlvbmFsIEhUTUwgNC4wMSBEVEQgaXM6Ci0KLSAgICAgICAgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotCi0gICAgVGhpcyB2ZXJzaW9uIG9mIHRoZSB0cmFuc2l0aW9uYWwgRFREIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkCi0KLSAgICBJZiB5b3UgYXJlIHdyaXRpbmcgYSBkb2N1bWVudCB0aGF0IGluY2x1ZGVzIGZyYW1lcywgdXNlIAotICAgIHRoZSBmb2xsb3dpbmcgRlBJOgotCi0gICAgICAgICItLy9XM0MvL0RURCBIVE1MIDQuMDEgRnJhbWVzZXQvL0VOIgotCi0gICAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBmcmFtZXNldCBEVEQgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9mcmFtZXNldC5kdGQKLQotICAgIFVzZSB0aGUgZm9sbG93aW5nIChyZWxhdGl2ZSkgVVJJcyB0byByZWZlciB0byAKLSAgICB0aGUgRFREcyBhbmQgZW50aXR5IGRlZmluaXRpb25zIG9mIHRoaXMgc3BlY2lmaWNhdGlvbjoKLQotICAgICJzdHJpY3QuZHRkIgotICAgICJsb29zZS5kdGQiCi0gICAgImZyYW1lc2V0LmR0ZCIKLSAgICAiSFRNTGxhdDEuZW50IgotICAgICJIVE1Mc3ltYm9sLmVudCIKLSAgICAiSFRNTHNwZWNpYWwuZW50IgotCi0tLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBJbXBvcnRlZCBOYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gRmVhdHVyZSBTd2l0Y2ggZm9yIGZyYW1lc2V0IGRvY3VtZW50cyAtLT4KLTwhRU5USVRZICUgSFRNTC5GcmFtZXNldCAiSUdOT1JFIj4KLQotPCFFTlRJVFkgJSBDb250ZW50VHlwZSAiQ0RBVEEiCi0gICAgLS0gbWVkaWEgdHlwZSwgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlcyAiQ0RBVEEiCi0gICAgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgdHlwZXMsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0ICJDREFUQSIKLSAgICAtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXRzICJDREFUQSIKLSAgICAtLSBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBMYW5ndWFnZUNvZGUgIk5BTUUiCi0gICAgLS0gYSBsYW5ndWFnZSBjb2RlLCBhcyBwZXIgW1JGQzE3NjZdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcmFjdGVyICJDREFUQSIKLSAgICAtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIAotICAgIC0tPgotCi08IUVOVElUWSAlIExpbmtUeXBlcyAiQ0RBVEEiCi0gICAgLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcwotICAgIC0tPgotCi08IUVOVElUWSAlIE1lZGlhRGVzYyAiQ0RBVEEiCi0gICAgLS0gc2luZ2xlIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIGRlc2NyaXB0b3JzCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgVVJJICJDREFUQSIKLSAgICAtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwKLSAgICAgICBzZWUgW1VSSV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBEYXRldGltZSAiQ0RBVEEiIC0tIGRhdGUgYW5kIHRpbWUgaW5mb3JtYXRpb24uIElTTyBkYXRlIGZvcm1hdCAtLT4KLQotCi08IUVOVElUWSAlIFNjcmlwdCAiQ0RBVEEiIC0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotCi08IUVOVElUWSAlIFN0eWxlU2hlZXQgIkNEQVRBIiAtLSBzdHlsZSBzaGVldCBkYXRhIC0tPgotCi0KLQotPCFFTlRJVFkgJSBUZXh0ICJDREFUQSI+Ci0KLQotPCEtLSBQYXJhbWV0ZXIgRW50aXRpZXMgLS0+Ci0KLTwhRU5USVRZICUgaGVhZC5taXNjICJTQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVCIgLS0gcmVwZWF0YWJsZSBoZWFkIGVsZW1lbnRzIC0tPgotCi08IUVOVElUWSAlIGhlYWRpbmcgIkgxfEgyfEgzfEg0fEg1fEg2Ij4KLQotPCFFTlRJVFkgJSBsaXN0ICJVTCB8IE9MIj4KLQotPCFFTlRJVFkgJSBwcmVmb3JtYXR0ZWQgIlBSRSI+Ci0KLQotPCEtLT09PT09PT09PT09PT09PT0gQ2hhcmFjdGVyIG1uZW1vbmljIGVudGl0aWVzID09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBIVE1MbGF0MSBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIExhdGluMS8vRU4vL0hUTUwiCi0gICAiSFRNTGxhdDEuZW50Ij4KLSVIVE1MbGF0MTsKLQotPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scy8vRU4vL0hUTUwiCi0gICAiSFRNTHN5bWJvbC5lbnQiPgotJUhUTUxzeW1ib2w7Ci0KLTwhRU5USVRZICUgSFRNTHNwZWNpYWwgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsLy9FTi8vSFRNTCIKLSAgICJIVE1Mc3BlY2lhbC5lbnQiPgotJUhUTUxzcGVjaWFsOwotPCEtLT09PT09PT09PT09PT09PT09PT0gR2VuZXJpYyBBdHRyaWJ1dGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBjb3JlYXR0cnMKLSAiaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQgIC0tIGRvY3VtZW50LXdpZGUgdW5pcXVlIGlkIC0tCi0gIGNsYXNzICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBjbGFzc2VzIC0tCi0gIHN0eWxlICAgICAgICVTdHlsZVNoZWV0OyAgICNJTVBMSUVEICAtLSBhc3NvY2lhdGVkIHN0eWxlIGluZm8gLS0KLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IHRpdGxlIC0tIgotICA+Ci0KLTwhRU5USVRZICUgaTE4bgotICJsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCAgLS0gbGFuZ3VhZ2UgY29kZSAtLQotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjSU1QTElFRCAgLS0gZGlyZWN0aW9uIGZvciB3ZWFrL25ldXRyYWwgdGV4dCAtLSIKLSAgPgotCi08IUVOVElUWSAlIGV2ZW50cwotICJvbmNsaWNrICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIGJ1dHRvbiB3YXMgY2xpY2tlZCAtLQotICBvbmRibGNsaWNrICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIGJ1dHRvbiB3YXMgZG91YmxlIGNsaWNrZWQtLQotICBvbm1vdXNlZG93biAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIGJ1dHRvbiB3YXMgcHJlc3NlZCBkb3duIC0tCi0gIG9ubW91c2V1cCAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgYnV0dG9uIHdhcyByZWxlYXNlZCAtLQotICBvbm1vdXNlb3ZlciAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIHdhcyBtb3ZlZCBvbnRvIC0tCi0gIG9ubW91c2Vtb3ZlICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgd2FzIG1vdmVkIHdpdGhpbiAtLQotICBvbm1vdXNlb3V0ICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIHdhcyBtb3ZlZCBhd2F5IC0tCi0gIG9ua2V5cHJlc3MgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcHJlc3NlZCBhbmQgcmVsZWFzZWQgLS0KLSAgb25rZXlkb3duICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEga2V5IHdhcyBwcmVzc2VkIGRvd24gLS0KLSAgb25rZXl1cCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEga2V5IHdhcyByZWxlYXNlZCAtLSIKLSAgPgotCi08IS0tIFJlc2VydmVkIEZlYXR1cmUgU3dpdGNoIC0tPgotPCFFTlRJVFkgJSBIVE1MLlJlc2VydmVkICJJR05PUkUiPgotCi08IS0tIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0+Ci08IVsgJUhUTUwuUmVzZXJ2ZWQ7IFsKLTwhRU5USVRZICUgcmVzZXJ2ZWQKLSAiZGF0YXNyYyAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGEgc2luZ2xlIG9yIHRhYnVsYXIgRGF0YSBTb3VyY2UgLS0KLSAgZGF0YWZsZCAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHRoZSBwcm9wZXJ0eSBvciBjb2x1bW4gbmFtZSAtLQotICBkYXRhZm9ybWF0YXMgKHBsYWludGV4dHxodG1sKSBwbGFpbnRleHQgLS0gdGV4dCBvciBodG1sIC0tIgotICA+Ci1dXT4KLQotPCFFTlRJVFkgJSByZXNlcnZlZCAiIj4KLQotPCFFTlRJVFkgJSBhdHRycyAiJWNvcmVhdHRyczsgJWkxOG47ICVldmVudHM7Ij4KLQotCi08IS0tPT09PT09PT09PT09PT09PT09PSBUZXh0IE1hcmt1cCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGZvbnRzdHlsZQotICJUVCB8IEkgfCBCIHwgQklHIHwgU01BTEwiPgotCi08IUVOVElUWSAlIHBocmFzZSAiRU0gfCBTVFJPTkcgfCBERk4gfCBDT0RFIHwKLSAgICAgICAgICAgICAgICAgICBTQU1QIHwgS0JEIHwgVkFSIHwgQ0lURSB8IEFCQlIgfCBBQ1JPTllNIiA+Ci0KLTwhRU5USVRZICUgc3BlY2lhbAotICAgIkEgfCBJTUcgfCBPQkpFQ1QgfCBCUiB8IFNDUklQVCB8IE1BUCB8IFEgfCBTVUIgfCBTVVAgfCBTUEFOIHwgQkRPIj4KLQotPCFFTlRJVFkgJSBmb3JtY3RybCAiSU5QVVQgfCBTRUxFQ1QgfCBURVhUQVJFQSB8IExBQkVMIHwgQlVUVE9OIj4KLQotPCEtLSAlaW5saW5lOyBjb3ZlcnMgaW5saW5lIG9yICJ0ZXh0LWxldmVsIiBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgaW5saW5lICIjUENEQVRBIHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVzcGVjaWFsOyB8ICVmb3JtY3RybDsiPgotCi08IUVMRU1FTlQgKCVmb250c3R5bGU7fCVwaHJhc2U7KSAtIC0gKCVpbmxpbmU7KSo+Ci08IUFUVExJU1QgKCVmb250c3R5bGU7fCVwaHJhc2U7KQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgKFNVQnxTVVApIC0gLSAoJWlubGluZTspKiAgICAtLSBzdWJzY3JpcHQsIHN1cGVyc2NyaXB0IC0tPgotPCFBVFRMSVNUIChTVUJ8U1VQKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgU1BBTiAtIC0gKCVpbmxpbmU7KSogICAgICAgICAtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBTUEFOCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlcmVzZXJ2ZWQ7CQkJICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIEJETyAtIC0gKCVpbmxpbmU7KSogICAgICAgICAgLS0gSTE4TiBCaURpIG92ZXItcmlkZSAtLT4KLTwhQVRUTElTVCBCRE8KLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNSRVFVSVJFRCAtLSBkaXJlY3Rpb25hbGl0eSAtLQotICA+Ci0KLQotPCFFTEVNRU5UIEJSIC0gTyBFTVBUWSAgICAgICAgICAgICAgICAgLS0gZm9yY2VkIGxpbmUgYnJlYWsgLS0+Ci08IUFUVExJU1QgQlIKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBIVE1MIGNvbnRlbnQgbW9kZWxzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICAgIEhUTUwgaGFzIHR3byBiYXNpYyBjb250ZW50IG1vZGVsczoKLQotICAgICAgICAlaW5saW5lOyAgICAgY2hhcmFjdGVyIGxldmVsIGVsZW1lbnRzIGFuZCB0ZXh0IHN0cmluZ3MKLSAgICAgICAgJWJsb2NrOyAgICAgIGJsb2NrLWxpa2UgZWxlbWVudHMgZS5nLiBwYXJhZ3JhcGhzIGFuZCBsaXN0cwotLS0+Ci0KLTwhRU5USVRZICUgYmxvY2sKLSAgICAgIlAgfCAlaGVhZGluZzsgfCAlbGlzdDsgfCAlcHJlZm9ybWF0dGVkOyB8IERMIHwgRElWIHwgTk9TQ1JJUFQgfAotICAgICAgQkxPQ0tRVU9URSB8IEZPUk0gfCBIUiB8IFRBQkxFIHwgRklFTERTRVQgfCBBRERSRVNTIj4KLQotPCFFTlRJVFkgJSBmbG93ICIlYmxvY2s7IHwgJWlubGluZTsiPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBEb2N1bWVudCBCb2R5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQk9EWSBPIE8gKCVibG9jazt8U0NSSVBUKSsgKyhJTlN8REVMKSAtLSBkb2N1bWVudCBib2R5IC0tPgotPCFBVFRMSVNUIEJPRFkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG9ubG9hZCAgICAgICAgICAlU2NyaXB0OyAgICNJTVBMSUVEICAtLSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gbG9hZGVkIC0tCi0gIG9udW5sb2FkICAgICAgICAlU2NyaXB0OyAgICNJTVBMSUVEICAtLSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCAtLQotICA+Ci0KLTwhRUxFTUVOVCBBRERSRVNTIC0gLSAoJWlubGluZTspKiAtLSBpbmZvcm1hdGlvbiBvbiBhdXRob3IgLS0+Ci08IUFUVExJU1QgQUREUkVTUwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgRElWIC0gLSAoJWZsb3c7KSogICAgICAgICAgICAtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBESVYKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLQotPCEtLT09PT09PT09PT09PT09PT09PSBUaGUgQW5jaG9yIEVsZW1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBTaGFwZSAiKHJlY3R8Y2lyY2xlfHBvbHl8ZGVmYXVsdCkiPgotPCFFTlRJVFkgJSBDb29yZHMgIkNEQVRBIiAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsZW5ndGhzIC0tPgotCi08IUVMRU1FTlQgQSAtIC0gKCVpbmxpbmU7KSogLShBKSAgICAgICAtLSBhbmNob3IgLS0+Ci08IUFUVExJU1QgQQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQgIC0tIGNoYXIgZW5jb2Rpbmcgb2YgbGlua2VkIHJlc291cmNlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBhZHZpc29yeSBjb250ZW50IHR5cGUgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWVkIGxpbmsgZW5kIC0tCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIGxpbmtlZCByZXNvdXJjZSAtLQotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCAgLS0gbGFuZ3VhZ2UgY29kZSAtLQotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gZm9yd2FyZCBsaW5rIHR5cGVzIC0tCi0gIHJldiAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSByZXZlcnNlIGxpbmsgdHlwZXMgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICByZWN0ICAgICAgLS0gZm9yIHVzZSB3aXRoIGNsaWVudC1zaWRlIGltYWdlIG1hcHMgLS0KLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQgIC0tIGZvciB1c2Ugd2l0aCBjbGllbnQtc2lkZSBpbWFnZSBtYXBzIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gQ2xpZW50LXNpZGUgaW1hZ2UgbWFwcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gVGhlc2UgY2FuIGJlIHBsYWNlZCBpbiB0aGUgc2FtZSBkb2N1bWVudCBvciBncm91cGVkIGluIGEKLSAgICAgc2VwYXJhdGUgZG9jdW1lbnQgYWx0aG91Z2ggdGhpcyBpc24ndCB5ZXQgd2lkZWx5IHN1cHBvcnRlZCAtLT4KLQotPCFFTEVNRU5UIE1BUCAtIC0gKCglYmxvY2s7KSB8IEFSRUEpKyAtLSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0+Ci08IUFUVExJU1QgTUFQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gZm9yIHJlZmVyZW5jZSBieSB1c2VtYXAgLS0KLSAgPgotCi08IUVMRU1FTlQgQVJFQSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgYXJlYSAtLT4KLTwhQVRUTElTVCBBUkVBCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICByZWN0ICAgICAgLS0gY29udHJvbHMgaW50ZXJwcmV0YXRpb24gb2YgY29vcmRzIC0tCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVEICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsZW5ndGhzIC0tCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIGxpbmtlZCByZXNvdXJjZSAtLQotICBub2hyZWYgICAgICAobm9ocmVmKSAgICAgICAjSU1QTElFRCAgLS0gdGhpcyByZWdpb24gaGFzIG5vIGFjdGlvbiAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBMSU5LIEVsZW1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFJlbGF0aW9uc2hpcCB2YWx1ZXMgY2FuIGJlIHVzZWQgaW4gcHJpbmNpcGxlOgotCi0gICBhKSBmb3IgZG9jdW1lbnQgc3BlY2lmaWMgdG9vbGJhcnMvbWVudXMgd2hlbiB1c2VkCi0gICAgICB3aXRoIHRoZSBMSU5LIGVsZW1lbnQgaW4gZG9jdW1lbnQgaGVhZCBlLmcuCi0gICAgICAgIHN0YXJ0LCBjb250ZW50cywgcHJldmlvdXMsIG5leHQsIGluZGV4LCBlbmQsIGhlbHAKLSAgIGIpIHRvIGxpbmsgdG8gYSBzZXBhcmF0ZSBzdHlsZSBzaGVldCAocmVsPXN0eWxlc2hlZXQpCi0gICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPXNjcmlwdCkKLSAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mCi0gICAgICBodG1sIG5vZGVzIGFyZSByZW5kZXJlZCBpbnRvIHByaW50ZWQgZG9jdW1lbnRzCi0gICBlKSB0byBtYWtlIGEgbGluayB0byBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIGUuZy4gYSBwb3N0c2NyaXB0IG9yIHBkZiB2ZXJzaW9uIChyZWw9YWx0ZXJuYXRlIG1lZGlhPXByaW50KQotLS0+Ci0KLTwhRUxFTUVOVCBMSU5LIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGEgbWVkaWEtaW5kZXBlbmRlbnQgbGluayAtLT4KLTwhQVRUTElTVCBMSU5LCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRCAgLS0gY2hhciBlbmNvZGluZyBvZiBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIGhyZWZsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBhZHZpc29yeSBjb250ZW50IHR5cGUgLS0KLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIGZvcndhcmQgbGluayB0eXBlcyAtLQotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gcmV2ZXJzZSBsaW5rIHR5cGVzIC0tCi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVEICAtLSBmb3IgcmVuZGVyaW5nIG9uIHRoZXNlIG1lZGlhIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW1hZ2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBMZW5ndGggZGVmaW5lZCBpbiBzdHJpY3QgRFREIGZvciBjZWxscGFkZGluZy9jZWxsc3BhY2luZyAtLT4KLTwhRU5USVRZICUgTGVuZ3RoICJDREFUQSIgLS0gbm4gZm9yIHBpeGVscyBvciBubiUgZm9yIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aCAiQ0RBVEEiIC0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLQotPCFbICVIVE1MLkZyYW1lc2V0OyBbCi08IUVOVElUWSAlIE11bHRpTGVuZ3RocyAiQ0RBVEEiIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIE11bHRpTGVuZ3RoIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgUGl4ZWxzICJDREFUQSIgLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLQotCi08IS0tIFRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGV4dC1vbmx5IFVBcyBhcyB3ZWxsIGFzIAotICAgdG8gbWFrZSBpbWFnZSBjb250ZW50IHVuZGVyc3RhbmRhYmxlIGFuZCBuYXZpZ2FibGUgCi0gICB0byB1c2VycyBvZiBub24tdmlzdWFsIFVBcywgeW91IG5lZWQgdG8gcHJvdmlkZQotICAgYSBkZXNjcmlwdGlvbiB3aXRoIEFMVCwgYW5kIGF2b2lkIHNlcnZlci1zaWRlIGltYWdlIG1hcHMgLS0+Ci08IUVMRU1FTlQgSU1HIC0gTyBFTVBUWSAgICAgICAgICAgICAgICAtLSBFbWJlZGRlZCBpbWFnZSAtLT4KLTwhQVRUTElTVCBJTUcKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRCAtLSBVUkkgb2YgaW1hZ2UgdG8gZW1iZWQgLS0KLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVEIC0tIHNob3J0IGRlc2NyaXB0aW9uIC0tCi0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBsaW5rIHRvIGxvbmcgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wbGVtZW50cyBhbHQpIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lIG9mIGltYWdlIGZvciBzY3JpcHRpbmcgLS0KLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIGhlaWdodCAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgd2lkdGggLS0KLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0KLSAgaXNtYXAgICAgICAgKGlzbWFwKSAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBzZXJ2ZXItc2lkZSBpbWFnZSBtYXAgLS0KLSAgPgotCi08IS0tIFVTRU1BUCBwb2ludHMgdG8gYSBNQVAgZWxlbWVudCB3aGljaCBtYXkgYmUgaW4gdGhpcyBkb2N1bWVudAotICBvciBhbiBleHRlcm5hbCBkb2N1bWVudCwgYWx0aG91Z2ggdGhlIGxhdHRlciBpcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCAtLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09IE9CSkVDVCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBPQkpFQ1QgaXMgdXNlZCB0byBlbWJlZCBvYmplY3RzIGFzIHBhcnQgb2YgSFRNTCBwYWdlcyAKLSAgUEFSQU0gZWxlbWVudHMgc2hvdWxkIHByZWNlZGUgb3RoZXIgY29udGVudC4gU0dNTCBtaXhlZCBjb250ZW50Ci0gIG1vZGVsIHRlY2huaWNhbGl0eSBwcmVjbHVkZXMgc3BlY2lmeWluZyB0aGlzIGZvcm1hbGx5IC4uLgotLS0+Ci0KLTwhRUxFTUVOVCBPQkpFQ1QgLSAtIChQQVJBTSB8ICVmbG93OykqCi0gLS0gZ2VuZXJpYyBlbWJlZGRlZCBvYmplY3QgLS0+Ci08IUFUVExJU1QgT0JKRUNUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBkZWNsYXJlICAgICAoZGVjbGFyZSkgICAgICAjSU1QTElFRCAgLS0gZGVjbGFyZSBidXQgZG9uJ3QgaW5zdGFudGlhdGUgZmxhZyAtLQotICBjbGFzc2lkICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gaWRlbnRpZmllcyBhbiBpbXBsZW1lbnRhdGlvbiAtLQotICBjb2RlYmFzZSAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gYmFzZSBVUkkgZm9yIGNsYXNzaWQsIGRhdGEsIGFyY2hpdmUtLQotICBkYXRhICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gcmVmZXJlbmNlIHRvIG9iamVjdCdzIGRhdGEgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGNvbnRlbnQgdHlwZSBmb3IgZGF0YSAtLQotICBjb2RldHlwZSAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gY29udGVudCB0eXBlIGZvciBjb2RlIC0tCi0gIGFyY2hpdmUgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBVUklzIC0tCi0gIHN0YW5kYnkgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBtZXNzYWdlIHRvIHNob3cgd2hpbGUgbG9hZGluZyAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgaGVpZ2h0IC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSB3aWR0aCAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3VibWl0IGFzIHBhcnQgb2YgZm9ybSAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgUEFSQU0gLSBPIEVNUFRZICAgICAgICAgICAgICAtLSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZSAtLT4KLTwhQVRUTElTVCBQQVJBTQotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVEIC0tIHByb3BlcnR5IG5hbWUgLS0KLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHByb3BlcnR5IHZhbHVlIC0tCi0gIHZhbHVldHlwZSAgIChEQVRBfFJFRnxPQkpFQ1QpIERBVEEgICAtLSBIb3cgdG8gaW50ZXJwcmV0IHZhbHVlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHZhbHVldHlwZT1yZWYgLS0KLSAgPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhvcml6b250YWwgUnVsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBIUiAtIE8gRU1QVFkgLS0gaG9yaXpvbnRhbCBydWxlIC0tPgotPCFBVFRMSVNUIEhSCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFBhcmFncmFwaHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBQIC0gTyAoJWlubGluZTspKiAgICAgICAgICAgIC0tIHBhcmFncmFwaCAtLT4KLTwhQVRUTElTVCBQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhlYWRpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgVGhlcmUgYXJlIHNpeCBsZXZlbHMgb2YgaGVhZGluZ3MgZnJvbSBIMSAodGhlIG1vc3QgaW1wb3J0YW50KQotICB0byBINiAodGhlIGxlYXN0IGltcG9ydGFudCkuCi0tLT4KLQotPCFFTEVNRU5UICglaGVhZGluZzspICAtIC0gKCVpbmxpbmU7KSogLS0gaGVhZGluZyAtLT4KLTwhQVRUTElTVCAoJWhlYWRpbmc7KQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQcmVmb3JtYXR0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGV4Y2x1ZGVzIG1hcmt1cCBmb3IgaW1hZ2VzIGFuZCBjaGFuZ2VzIGluIGZvbnQgc2l6ZSAtLT4KLTwhRU5USVRZICUgcHJlLmV4Y2x1c2lvbiAiSU1HfE9CSkVDVHxCSUd8U01BTEx8U1VCfFNVUCI+Ci0KLTwhRUxFTUVOVCBQUkUgLSAtICglaW5saW5lOykqIC0oJXByZS5leGNsdXNpb247KSAtLSBwcmVmb3JtYXR0ZWQgdGV4dCAtLT4KLTwhQVRUTElTVCBQUkUKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PSBJbmxpbmUgUXVvdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIFEgLSAtICglaW5saW5lOykqICAgICAgICAgICAgLS0gc2hvcnQgaW5saW5lIHF1b3RhdGlvbiAtLT4KLTwhQVRUTElTVCBRCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBzb3VyY2UgZG9jdW1lbnQgb3IgbXNnIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gQmxvY2stbGlrZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEJMT0NLUVVPVEUgLSAtICglYmxvY2s7fFNDUklQVCkrIC0tIGxvbmcgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIEJMT0NLUVVPVEUKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIHNvdXJjZSBkb2N1bWVudCBvciBtc2cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbnNlcnRlZC9EZWxldGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0KLTwhLS0gSU5TL0RFTCBhcmUgaGFuZGxlZCBieSBpbmNsdXNpb24gb24gQk9EWSAtLT4KLTwhRUxFTUVOVCAoSU5TfERFTCkgLSAtICglZmxvdzspKiAgICAgIC0tIGluc2VydGVkIHRleHQsIGRlbGV0ZWQgdGV4dCAtLT4KLTwhQVRUTElTVCAoSU5TfERFTCkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBpbmZvIG9uIHJlYXNvbiBmb3IgY2hhbmdlIC0tCi0gIGRhdGV0aW1lICAgICVEYXRldGltZTsgICAgICNJTVBMSUVEICAtLSBkYXRlIGFuZCB0aW1lIG9mIGNoYW5nZSAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IExpc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZGVmaW5pdGlvbiBsaXN0cyAtIERUIGZvciB0ZXJtLCBERCBmb3IgaXRzIGRlZmluaXRpb24gLS0+Ci0KLTwhRUxFTUVOVCBETCAtIC0gKERUfEREKSsgICAgICAgICAgICAgIC0tIGRlZmluaXRpb24gbGlzdCAtLT4KLTwhQVRUTElTVCBETAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgRFQgLSBPICglaW5saW5lOykqICAgICAgICAgICAtLSBkZWZpbml0aW9uIHRlcm0gLS0+Ci08IUVMRU1FTlQgREQgLSBPICglZmxvdzspKiAgICAgICAgICAgICAtLSBkZWZpbml0aW9uIGRlc2NyaXB0aW9uIC0tPgotPCFBVFRMSVNUIChEVHxERCkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotCi08IUVMRU1FTlQgT0wgLSAtIChMSSkrICAgICAgICAgICAgICAgICAtLSBvcmRlcmVkIGxpc3QgLS0+Ci08IUFUVExJU1QgT0wKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLSBVbm9yZGVyZWQgTGlzdHMgKFVMKSBidWxsZXQgc3R5bGVzIC0tPgotPCFFTEVNRU5UIFVMIC0gLSAoTEkpKyAgICAgICAgICAgICAgICAgLS0gdW5vcmRlcmVkIGxpc3QgLS0+Ci08IUFUVExJU1QgVUwKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotCi0KLTwhRUxFTUVOVCBMSSAtIE8gKCVmbG93OykqICAgICAgICAgICAgIC0tIGxpc3QgaXRlbSAtLT4KLTwhQVRUTElTVCBMSQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBGb3JtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCFFTEVNRU5UIEZPUk0gLSAtICglYmxvY2s7fFNDUklQVCkrIC0oRk9STSkgLS0gaW50ZXJhY3RpdmUgZm9ybSAtLT4KLTwhQVRUTElTVCBGT1JNCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBhY3Rpb24gICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQgLS0gc2VydmVyLXNpZGUgZm9ybSBoYW5kbGVyIC0tCi0gIG1ldGhvZCAgICAgIChHRVR8UE9TVCkgICAgIEdFVCAgICAgICAtLSBIVFRQIG1ldGhvZCB1c2VkIHRvIHN1Ym1pdCB0aGUgZm9ybS0tCi0gIGVuY3R5cGUgICAgICVDb250ZW50VHlwZTsgICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCi0gIGFjY2VwdCAgICAgICVDb250ZW50VHlwZXM7ICNJTVBMSUVEICAtLSBsaXN0IG9mIE1JTUUgdHlwZXMgZm9yIGZpbGUgdXBsb2FkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lIG9mIGZvcm0gZm9yIHNjcmlwdGluZyAtLQotICBvbnN1Ym1pdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGZvcm0gd2FzIHN1Ym1pdHRlZCAtLQotICBvbnJlc2V0ICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGZvcm0gd2FzIHJlc2V0IC0tCi0gIGFjY2VwdC1jaGFyc2V0ICVDaGFyc2V0czsgICNJTVBMSUVEICAtLSBsaXN0IG9mIHN1cHBvcnRlZCBjaGFyc2V0cyAtLQotICA+Ci0KLTwhLS0gRWFjaCBsYWJlbCBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiBPTkUgZmllbGQgLS0+Ci08IUVMRU1FTlQgTEFCRUwgLSAtICglaW5saW5lOykqIC0oTEFCRUwpIC0tIGZvcm0gZmllbGQgbGFiZWwgdGV4dCAtLT4KLTwhQVRUTElTVCBMQUJFTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgZm9yICAgICAgICAgSURSRUYgICAgICAgICAgI0lNUExJRUQgIC0tIG1hdGNoZXMgZmllbGQgSUQgdmFsdWUgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgPgotCi08IUVOVElUWSAlIElucHV0VHlwZQotICAiKFRFWFQgfCBQQVNTV09SRCB8IENIRUNLQk9YIHwKLSAgICBSQURJTyB8IFNVQk1JVCB8IFJFU0VUIHwKLSAgICBGSUxFIHwgSElEREVOIHwgSU1BR0UgfCBCVVRUT04pIgotICAgPgotCi08IS0tIGF0dHJpYnV0ZSBuYW1lIHJlcXVpcmVkIGZvciBhbGwgYnV0IHN1Ym1pdCBhbmQgcmVzZXQgLS0+Ci08IUVMRU1FTlQgSU5QVVQgLSBPIEVNUFRZICAgICAgICAgICAgICAtLSBmb3JtIGNvbnRyb2wgLS0+Ci08IUFUVExJU1QgSU5QVVQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHR5cGUgICAgICAgICVJbnB1dFR5cGU7ICAgIFRFWFQgICAgICAtLSB3aGF0IGtpbmQgb2Ygd2lkZ2V0IGlzIG5lZWRlZCAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3VibWl0IGFzIHBhcnQgb2YgZm9ybSAtLQotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gU3BlY2lmeSBmb3IgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2tib3hlcyAtLQotICBjaGVja2VkICAgICAoY2hlY2tlZCkgICAgICAjSU1QTElFRCAgLS0gZm9yIHJhZGlvIGJ1dHRvbnMgYW5kIGNoZWNrIGJveGVzIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgcmVhZG9ubHkgICAgKHJlYWRvbmx5KSAgICAgI0lNUExJRUQgIC0tIGZvciB0ZXh0IGFuZCBwYXNzd2QgLS0KLSAgc2l6ZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNwZWNpZmljIHRvIGVhY2ggdHlwZSBvZiBmaWVsZCAtLQotICBtYXhsZW5ndGggICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gbWF4IGNoYXJzIGZvciB0ZXh0IGZpZWxkcyAtLQotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gZm9yIGZpZWxkcyB3aXRoIGltYWdlcyAtLQotICBhbHQgICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0KLSAgaXNtYXAgICAgICAgKGlzbWFwKSAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBzZXJ2ZXItc2lkZSBpbWFnZSBtYXAgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgb25zZWxlY3QgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHNvbWUgdGV4dCB3YXMgc2VsZWN0ZWQgLS0KLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IHZhbHVlIHdhcyBjaGFuZ2VkIC0tCi0gIGFjY2VwdCAgICAgICVDb250ZW50VHlwZXM7ICNJTVBMSUVEICAtLSBsaXN0IG9mIE1JTUUgdHlwZXMgZm9yIGZpbGUgdXBsb2FkIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBTRUxFQ1QgLSAtIChPUFRHUk9VUHxPUFRJT04pKyAtLSBvcHRpb24gc2VsZWN0b3IgLS0+Ci08IUFUVExJU1QgU0VMRUNUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gZmllbGQgbmFtZSAtLQotICBzaXplICAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcm93cyB2aXNpYmxlIC0tCi0gIG11bHRpcGxlICAgIChtdWx0aXBsZSkgICAgICNJTVBMSUVEICAtLSBkZWZhdWx0IGlzIHNpbmdsZSBzZWxlY3Rpb24gLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IHZhbHVlIHdhcyBjaGFuZ2VkIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBPUFRHUk9VUCAtIC0gKE9QVElPTikrIC0tIG9wdGlvbiBncm91cCAtLT4KLTwhQVRUTElTVCBPUFRHUk9VUAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gZm9yIHVzZSBpbiBoaWVyYXJjaGljYWwgbWVudXMgLS0KLSAgPgotCi08IUVMRU1FTlQgT1BUSU9OIC0gTyAoI1BDREFUQSkgICAgICAgICAtLSBzZWxlY3RhYmxlIGNob2ljZSAtLT4KLTwhQVRUTElTVCBPUFRJT04KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNlbGVjdGVkICAgIChzZWxlY3RlZCkgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGZvciB1c2UgaW4gaGllcmFyY2hpY2FsIG1lbnVzIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBkZWZhdWx0cyB0byBlbGVtZW50IGNvbnRlbnQgLS0KLSAgPgotCi08IUVMRU1FTlQgVEVYVEFSRUEgLSAtICgjUENEQVRBKSAgICAgICAtLSBtdWx0aS1saW5lIHRleHQgZmllbGQgLS0+Ci08IUFUVExJU1QgVEVYVEFSRUEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHJvd3MgICAgICAgIE5VTUJFUiAgICAgICAgICNSRVFVSVJFRAotICBjb2xzICAgICAgICBOVU1CRVIgICAgICAgICAjUkVRVUlSRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gc29tZSB0ZXh0IHdhcyBzZWxlY3RlZCAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCEtLQotICAjUENEQVRBIGlzIHRvIHNvbHZlIHRoZSBtaXhlZCBjb250ZW50IHByb2JsZW0sCi0gIHBlciBzcGVjaWZpY2F0aW9uIG9ubHkgd2hpdGVzcGFjZSBpcyBhbGxvd2VkIHRoZXJlIQotIC0tPgotPCFFTEVNRU5UIEZJRUxEU0VUIC0gLSAoI1BDREFUQSxMRUdFTkQsKCVmbG93OykqKSAtLSBmb3JtIGNvbnRyb2wgZ3JvdXAgLS0+Ci08IUFUVExJU1QgRklFTERTRVQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIExFR0VORCAtIC0gKCVpbmxpbmU7KSogICAgICAgLS0gZmllbGRzZXQgbGVnZW5kIC0tPgotCi08IUFUVExJU1QgTEVHRU5ECi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gID4KLQotPCFFTEVNRU5UIEJVVFRPTiAtIC0KLSAgICAgKCVmbG93OykqIC0oQXwlZm9ybWN0cmw7fEZPUk18RklFTERTRVQpCi0gICAgIC0tIHB1c2ggYnV0dG9uIC0tPgotPCFBVFRMSVNUIEJVVFRPTgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNlbnQgdG8gc2VydmVyIHdoZW4gc3VibWl0dGVkIC0tCi0gIHR5cGUgICAgICAgIChidXR0b258c3VibWl0fHJlc2V0KSBzdWJtaXQgLS0gZm9yIHVzZSBhcyBmb3JtIGJ1dHRvbiAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PSBUYWJsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gSUVURiBIVE1MIHRhYmxlIHN0YW5kYXJkLCBzZWUgW1JGQzE5NDJdIC0tPgotCi08IS0tCi0gVGhlIEJPUkRFUiBhdHRyaWJ1dGUgc2V0cyB0aGUgdGhpY2tuZXNzIG9mIHRoZSBmcmFtZSBhcm91bmQgdGhlCi0gdGFibGUuIFRoZSBkZWZhdWx0IHVuaXRzIGFyZSBzY3JlZW4gcGl4ZWxzLgotCi0gVGhlIEZSQU1FIGF0dHJpYnV0ZSBzcGVjaWZpZXMgd2hpY2ggcGFydHMgb2YgdGhlIGZyYW1lIGFyb3VuZAotIHRoZSB0YWJsZSBzaG91bGQgYmUgcmVuZGVyZWQuIFRoZSB2YWx1ZXMgYXJlIG5vdCB0aGUgc2FtZSBhcwotIENBTFMgdG8gYXZvaWQgYSBuYW1lIGNsYXNoIHdpdGggdGhlIFZBTElHTiBhdHRyaWJ1dGUuCi0KLSBUaGUgdmFsdWUgImJvcmRlciIgaXMgaW5jbHVkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGgKLSA8VEFCTEUgQk9SREVSPiB3aGljaCB5aWVsZHMgZnJhbWU9Ym9yZGVyIGFuZCBib3JkZXI9aW1wbGllZAotIEZvciA8VEFCTEUgQk9SREVSPTE+IHlvdSBnZXQgYm9yZGVyPTEgYW5kIGZyYW1lPWltcGxpZWQuIEluIHRoaXMKLSBjYXNlLCBpdCBpcyBhcHByb3ByaWF0ZSB0byB0cmVhdCB0aGlzIGFzIGZyYW1lPWJvcmRlciBmb3IgYmFja3dhcmRzCi0gY29tcGF0aWJpbGl0eSB3aXRoIGRlcGxveWVkIGJyb3dzZXJzLgotLS0+Ci08IUVOVElUWSAlIFRGcmFtZSAiKHZvaWR8YWJvdmV8YmVsb3d8aHNpZGVzfGxoc3xyaHN8dnNpZGVzfGJveHxib3JkZXIpIj4KLQotPCEtLQotIFRoZSBSVUxFUyBhdHRyaWJ1dGUgZGVmaW5lcyB3aGljaCBydWxlcyB0byBkcmF3IGJldHdlZW4gY2VsbHM6Ci0KLSBJZiBSVUxFUyBpcyBhYnNlbnQgdGhlbiBhc3N1bWU6Ci0gICAgICJub25lIiBpZiBCT1JERVIgaXMgYWJzZW50IG9yIEJPUkRFUj0wIG90aGVyd2lzZSAiYWxsIgotLS0+Ci0KLTwhRU5USVRZICUgVFJ1bGVzICIobm9uZSB8IGdyb3VwcyB8IHJvd3MgfCBjb2xzIHwgYWxsKSI+Ci0gIAotPCEtLSBob3Jpem9udGFsIHBsYWNlbWVudCBvZiB0YWJsZSByZWxhdGl2ZSB0byBkb2N1bWVudCAtLT4KLTwhRU5USVRZICUgVEFsaWduICIobGVmdHxjZW50ZXJ8cmlnaHQpIj4KLQotPCEtLSBob3Jpem9udGFsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzIC0tPgotPCFFTlRJVFkgJSBjZWxsaGFsaWduCi0gICJhbGlnbiAgICAgIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5fGNoYXIpICNJTVBMSUVECi0gICBjaGFyICAgICAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhbGlnbm1lbnQgY2hhciwgZS5nLiBjaGFyPSc6JyAtLQotICAgY2hhcm9mZiAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb2Zmc2V0IGZvciBhbGlnbm1lbnQgY2hhciAtLSIKLSAgPgotCi08IS0tIHZlcnRpY2FsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzIC0tPgotPCFFTlRJVFkgJSBjZWxsdmFsaWduCi0gICJ2YWxpZ24gICAgICh0b3B8bWlkZGxlfGJvdHRvbXxiYXNlbGluZSkgI0lNUExJRUQiCi0gID4KLQotPCFFTEVNRU5UIFRBQkxFIC0gLQotICAgICAoQ0FQVElPTj8sIChDT0wqfENPTEdST1VQKiksIFRIRUFEPywgVEZPT1Q/LCBUQk9EWSspPgotPCFFTEVNRU5UIENBUFRJT04gIC0gLSAoJWlubGluZTspKiAgICAgLS0gdGFibGUgY2FwdGlvbiAtLT4KLTwhRUxFTUVOVCBUSEVBRCAgICAtIE8gKFRSKSsgICAgICAgICAgIC0tIHRhYmxlIGhlYWRlciAtLT4KLTwhRUxFTUVOVCBURk9PVCAgICAtIE8gKFRSKSsgICAgICAgICAgIC0tIHRhYmxlIGZvb3RlciAtLT4KLTwhRUxFTUVOVCBUQk9EWSAgICBPIE8gKFRSKSsgICAgICAgICAgIC0tIHRhYmxlIGJvZHkgLS0+Ci08IUVMRU1FTlQgQ09MR1JPVVAgLSBPIChDT0wpKiAgICAgICAgICAtLSB0YWJsZSBjb2x1bW4gZ3JvdXAgLS0+Ci08IUVMRU1FTlQgQ09MICAgICAgLSBPIEVNUFRZICAgICAgICAgICAtLSB0YWJsZSBjb2x1bW4gLS0+Ci08IUVMRU1FTlQgVFIgICAgICAgLSBPIChUSHxURCkrICAgICAgICAtLSB0YWJsZSByb3cgLS0+Ci08IUVMRU1FTlQgKFRIfFREKSAgLSBPICglZmxvdzspKiAgICAgICAtLSB0YWJsZSBoZWFkZXIgY2VsbCwgdGFibGUgZGF0YSBjZWxsLS0+Ci0KLTwhQVRUTElTVCBUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIC0tIHRhYmxlIGVsZW1lbnQgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHN1bW1hcnkgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBwdXJwb3NlL3N0cnVjdHVyZSBmb3Igc3BlZWNoIG91dHB1dC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSB0YWJsZSB3aWR0aCAtLQotICBib3JkZXIgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gY29udHJvbHMgZnJhbWUgd2lkdGggYXJvdW5kIHRhYmxlIC0tCi0gIGZyYW1lICAgICAgICVURnJhbWU7ICAgICAgICNJTVBMSUVEICAtLSB3aGljaCBwYXJ0cyBvZiBmcmFtZSB0byByZW5kZXIgLS0KLSAgcnVsZXMgICAgICAgJVRSdWxlczsgICAgICAgI0lNUExJRUQgIC0tIHJ1bGluZ3MgYmV0d2VlbiByb3dzIGFuZCBjb2xzIC0tCi0gIGNlbGxzcGFjaW5nICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBzcGFjaW5nIGJldHdlZW4gY2VsbHMgLS0KLSAgY2VsbHBhZGRpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHNwYWNpbmcgd2l0aGluIGNlbGxzIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICBkYXRhcGFnZXNpemUgQ0RBVEEgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi0KLTwhQVRUTElTVCBDQVBUSU9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS0KLUNPTEdST1VQIGdyb3VwcyBhIHNldCBvZiBDT0wgZWxlbWVudHMuIEl0IGFsbG93cyB5b3UgdG8gZ3JvdXAKLXNldmVyYWwgc2VtYW50aWNhbGx5IHJlbGF0ZWQgY29sdW1ucyB0b2dldGhlci4KLS0tPgotPCFBVFRMSVNUIENPTEdST1VQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzcGFuICAgICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gZGVmYXVsdCBudW1iZXIgb2YgY29sdW1ucyBpbiBncm91cCAtLQotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRCAgLS0gZGVmYXVsdCB3aWR0aCBmb3IgZW5jbG9zZWQgQ09McyAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLTwhLS0KLSBDT0wgZWxlbWVudHMgZGVmaW5lIHRoZSBhbGlnbm1lbnQgcHJvcGVydGllcyBmb3IgY2VsbHMgaW4KLSBvbmUgb3IgbW9yZSBjb2x1bW5zLgotCi0gVGhlIFdJRFRIIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW5zLCBlLmcuCi0KLSAgICAgd2lkdGg9NjQgICAgICAgIHdpZHRoIGluIHNjcmVlbiBwaXhlbHMKLSAgICAgd2lkdGg9MC41KiAgICAgIHJlbGF0aXZlIHdpZHRoIG9mIDAuNQotCi0gVGhlIFNQQU4gYXR0cmlidXRlIGNhdXNlcyB0aGUgYXR0cmlidXRlcyBvZiBvbmUKLSBDT0wgZWxlbWVudCB0byBhcHBseSB0byBtb3JlIHRoYW4gb25lIGNvbHVtbi4KLS0tPgotPCFBVFRMSVNUIENPTCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gY29sdW1uIGdyb3VwcyBhbmQgcHJvcGVydGllcyAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3BhbiAgICAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIENPTCBhdHRyaWJ1dGVzIGFmZmVjdCBOIGNvbHVtbnMgLS0KLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQgIC0tIGNvbHVtbiB3aWR0aCBzcGVjaWZpY2F0aW9uIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotPCEtLQotICAgIFVzZSBUSEVBRCB0byBkdXBsaWNhdGUgaGVhZGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBoZWFkZXJzIHdoZW4KLSAgICBUQk9EWSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIFRGT09UIHRvIGR1cGxpY2F0ZSBmb290ZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGZvb3RlcnMgd2hlbgotICAgIFRCT0RZIHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgbXVsdGlwbGUgVEJPRFkgc2VjdGlvbnMgd2hlbiBydWxlcyBhcmUgbmVlZGVkCi0gICAgYmV0d2VlbiBncm91cHMgb2YgdGFibGUgcm93cy4KLS0tPgotPCFBVFRMSVNUIChUSEVBRHxUQk9EWXxURk9PVCkgICAgICAgICAgLS0gdGFibGUgc2VjdGlvbiAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi08IUFUVExJU1QgVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB0YWJsZSByb3cgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotCi08IS0tIFNjb3BlIGlzIHNpbXBsZXIgdGhhbiBoZWFkZXJzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcyAtLT4KLTwhRU5USVRZICUgU2NvcGUgIihyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKSI+Ci0KLTwhLS0gVEggaXMgZm9yIGhlYWRlcnMsIFREIGZvciBkYXRhLCBidXQgZm9yIGNlbGxzIGFjdGluZyBhcyBib3RoIHVzZSBURCAtLT4KLTwhQVRUTElTVCAoVEh8VEQpICAgICAgICAgICAgICAgICAgICAgIC0tIGhlYWRlciBvciBkYXRhIGNlbGwgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBhYmJyZXZpYXRpb24gZm9yIGhlYWRlciBjZWxsIC0tCi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWxhdGVkIGhlYWRlcnMtLQotICBoZWFkZXJzICAgICBJRFJFRlMgICAgICAgICAjSU1QTElFRCAgLS0gbGlzdCBvZiBpZCdzIGZvciBoZWFkZXIgY2VsbHMgLS0KLSAgc2NvcGUgICAgICAgJVNjb3BlOyAgICAgICAgI0lNUExJRUQgIC0tIHNjb3BlIGNvdmVyZWQgYnkgaGVhZGVyIGNlbGxzIC0tCi0gIHJvd3NwYW4gICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBudW1iZXIgb2Ygcm93cyBzcGFubmVkIGJ5IGNlbGwgLS0KLSAgY29sc3BhbiAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIG51bWJlciBvZiBjb2xzIHNwYW5uZWQgYnkgY2VsbCAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgSGVhZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gJWhlYWQubWlzYzsgZGVmaW5lZCBlYXJsaWVyIG9uIGFzICJTQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVCIgLS0+Ci08IUVOVElUWSAlIGhlYWQuY29udGVudCAiVElUTEUgJiBCQVNFPyI+Ci0KLTwhRUxFTUVOVCBIRUFEIE8gTyAoJWhlYWQuY29udGVudDspICsoJWhlYWQubWlzYzspIC0tIGRvY3VtZW50IGhlYWQgLS0+Ci08IUFUVExJU1QgSEVBRAotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyIC0tCi0gIHByb2ZpbGUgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lZCBkaWN0aW9uYXJ5IG9mIG1ldGEgaW5mbyAtLQotICA+Ci0KLTwhLS0gVGhlIFRJVExFIGVsZW1lbnQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgZmxvdyBvZiB0ZXh0LgotICAgICAgIEl0IHNob3VsZCBiZSBkaXNwbGF5ZWQsIGZvciBleGFtcGxlIGFzIHRoZSBwYWdlIGhlYWRlciBvcgotICAgICAgIHdpbmRvdyB0aXRsZS4gRXhhY3RseSBvbmUgdGl0bGUgaXMgcmVxdWlyZWQgcGVyIGRvY3VtZW50LgotICAgIC0tPgotPCFFTEVNRU5UIFRJVExFIC0gLSAoI1BDREFUQSkgLSglaGVhZC5taXNjOykgLS0gZG9jdW1lbnQgdGl0bGUgLS0+Ci08IUFUVExJU1QgVElUTEUgJWkxOG4+Ci0KLQotPCFFTEVNRU5UIEJBU0UgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gZG9jdW1lbnQgYmFzZSBVUkkgLS0+Ci08IUFUVExJU1QgQkFTRQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQgLS0gVVJJIHRoYXQgYWN0cyBhcyBiYXNlIFVSSSAtLQotICA+Ci0KLTwhRUxFTUVOVCBNRVRBIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGdlbmVyaWMgbWV0YWluZm9ybWF0aW9uIC0tPgotPCFBVFRMSVNUIE1FVEEKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciwgZm9yIHVzZSB3aXRoIGNvbnRlbnQgLS0KLSAgaHR0cC1lcXVpdiAgTkFNRSAgICAgICAgICAgI0lNUExJRUQgIC0tIEhUVFAgcmVzcG9uc2UgaGVhZGVyIG5hbWUgIC0tCi0gIG5hbWUgICAgICAgIE5BTUUgICAgICAgICAgICNJTVBMSUVEICAtLSBtZXRhaW5mb3JtYXRpb24gbmFtZSAtLQotICBjb250ZW50ICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiAtLQotICBzY2hlbWUgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VsZWN0IGZvcm0gb2YgY29udGVudCAtLQotICA+Ci0KLTwhRUxFTUVOVCBTVFlMRSAtIC0gJVN0eWxlU2hlZXQgICAgICAgIC0tIHN0eWxlIGluZm8gLS0+Ci08IUFUVExJU1QgU1RZTEUKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciwgZm9yIHVzZSB3aXRoIHRpdGxlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRCAtLSBjb250ZW50IHR5cGUgb2Ygc3R5bGUgbGFuZ3VhZ2UgLS0KLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQgIC0tIGRlc2lnbmVkIGZvciB1c2Ugd2l0aCB0aGVzZSBtZWRpYSAtLQotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgdGl0bGUgLS0KLSAgPgotCi08IUVMRU1FTlQgU0NSSVBUIC0gLSAlU2NyaXB0OyAgICAgICAgICAtLSBzY3JpcHQgc3RhdGVtZW50cyAtLT4KLTwhQVRUTElTVCBTQ1JJUFQKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQgIC0tIGNoYXIgZW5jb2Rpbmcgb2YgbGlua2VkIHJlc291cmNlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRCAtLSBjb250ZW50IHR5cGUgb2Ygc2NyaXB0IGxhbmd1YWdlIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIGFuIGV4dGVybmFsIHNjcmlwdCAtLQotICBkZWZlciAgICAgICAoZGVmZXIpICAgICAgICAjSU1QTElFRCAgLS0gVUEgbWF5IGRlZmVyIGV4ZWN1dGlvbiBvZiBzY3JpcHQgLS0KLSAgZXZlbnQgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gIGZvciAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBOT1NDUklQVCAtIC0gKCVibG9jazspKwotICAtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBzY3JpcHQtYmFzZWQgcmVuZGVyaW5nIC0tPgotPCFBVFRMSVNUIE5PU0NSSVBUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IFN0cnVjdHVyZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IUVOVElUWSAlIGh0bWwuY29udGVudCAiSEVBRCwgQk9EWSI+Ci0KLTwhRUxFTUVOVCBIVE1MIE8gTyAoJWh0bWwuY29udGVudDspICAgIC0tIGRvY3VtZW50IHJvb3QgZWxlbWVudCAtLT4KLTwhQVRUTElTVCBIVE1MCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIgLS0KLSAgPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3dtbDExLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy93bWwxMS5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYjEyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3dtbDExLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi08IS0tCi1XaXJlbGVzcyBNYXJrdXAgTGFuZ3VhZ2UgKFdNTCkgRG9jdW1lbnQgVHlwZSBEZWZpbml0aW9uLgotCi1Db3B5cmlnaHQgV2lyZWxlc3MgQXBwbGljYXRpb24gUHJvdG9jb2wgRm9ydW0gTHRkLiwgMTk5OCwxOTk5LgotICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKLQotV01MIGlzIGFuIFhNTCBsYW5ndWFnZS4gIFR5cGljYWwgdXNhZ2U6Ci0gICA8P3htbCB2ZXJzaW9uPSIxLjAiPz4KLSAgIDwhRE9DVFlQRSB3bWwgUFVCTElDICItLy9XQVBGT1JVTS8vRFREIFdNTCAxLjEvL0VOIgotICAgICAgICAgICJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQvd21sXzEuMS54bWwiPgotICAgPHdtbD4KLSAgIC4uLgotICAgPC93bWw+Ci0KLVRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIFdpcmVsZXNzIAotQXBwbGljYXRpb24gUHJvdG9jb2wgRm9ydW0gTHRkLiB3ZWIgc2l0ZSBhdAotaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvZG9jcy9jb3B5cmlnaHQuaHRtLgotLS0+Ci0KLTwhRU5USVRZICUgbGVuZ3RoICAiQ0RBVEEiPiAgICA8IS0tIFswLTldKyBmb3IgcGl4ZWxzIG9yIFswLTldKyIlIiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotPCFFTlRJVFkgJSB2ZGF0YSAgICJDREFUQSI+ICAgIDwhLS0gYXR0cmlidXRlIHZhbHVlIHBvc3NpYmx5IGNvbnRhaW5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIHJlZmVyZW5jZXMgLS0+Ci08IUVOVElUWSAlIEhSRUYgICAgIiV2ZGF0YTsiPiAgPCEtLSBVUkksIFVSTCBvciBVUk4gZGVzaWduYXRpbmcgYSBoeXBlcnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuIE1heSBjb250YWluIHZhcmlhYmxlIHJlZmVyZW5jZXMgLS0+Ci08IUVOVElUWSAlIGJvb2xlYW4gICAgICAiKHRydWV8ZmFsc2UpIj4KLTwhRU5USVRZICUgbnVtYmVyICAiTk1UT0tFTiI+ICA8IS0tIGEgbnVtYmVyLCB3aXRoIGZvcm1hdCBbMC05XSsgLS0+Ci08IUVOVElUWSAlIGNvcmVhdHRycyAgImlkICAgIElEICAgICAjSU1QTElFRCAKLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgQ0RBVEEgICNJTVBMSUVEIj4KLQotCi0KLTwhRU5USVRZICUgZW1waCAgICAiZW0gfCBzdHJvbmcgfCBiIHwgaSB8IHUgfCBiaWcgfCBzbWFsbCI+Ci08IUVOVElUWSAlIGxheW91dCAgImJyIj4KLQotPCFFTlRJVFkgJSB0ZXh0ICAgICAiI1BDREFUQSB8ICVlbXBoOyI+Ci0KLTwhLS0gZmxvdyBjb3ZlcnMgImNhcmQtbGV2ZWwiIGVsZW1lbnRzLCBzdWNoIGFzIHRleHQgYW5kIGltYWdlcyAtLT4KLTwhRU5USVRZICUgZmxvdyAgICAgIiV0ZXh0OyB8ICVsYXlvdXQ7IHwgaW1nIHwgYW5jaG9yIHwgYSB8IHRhYmxlIj4KLQotPCEtLSBUYXNrIHR5cGVzIC0tPgotPCFFTlRJVFkgJSB0YXNrICAgImdvIHwgcHJldiB8IG5vb3AgfCByZWZyZXNoIj4KLQotPCEtLSBOYXZpZ2F0aW9uIGFuZCBldmVudCBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgbmF2ZWxtdHMgImRvIHwgb25ldmVudCI+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERlY2tzIGFuZCBDYXJkcyA9PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCB3bWwgKCBoZWFkPywgdGVtcGxhdGU/LCBjYXJkKyApPgotPCFBVFRMSVNUIHdtbAotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tIGNhcmQgaW50cmluc2ljIGV2ZW50cyAtLT4KLTwhRU5USVRZICUgY2FyZGV2Ci0gIm9uZW50ZXJmb3J3YXJkICAlSFJFRjsgICAgICAgICAgI0lNUExJRUQKLSAgb25lbnRlcmJhY2t3YXJkICVIUkVGOyAgICAgICAgICAjSU1QTElFRAotICBvbnRpbWVyICAgICAgICAgJUhSRUY7ICAgICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gY2FyZCBmaWVsZCB0eXBlcyAtLT4KLTwhRU5USVRZICUgZmllbGRzICAiJWZsb3c7IHwgaW5wdXQgfCBzZWxlY3QgfCBmaWVsZHNldCI+Ci0KLTwhRUxFTUVOVCBjYXJkIChvbmV2ZW50KiwgdGltZXI/LCAoZG8gfCBwKSopPgotPCFBVFRMSVNUIGNhcmQKLSAgdGl0bGUgICAgICAgICAgICV2ZGF0YTsgICAgICAgI0lNUExJRUQKLSAgbmV3Y29udGV4dCAgICAgICVib29sZWFuOyAgICAgImZhbHNlIgotICBvcmRlcmVkICAgICAgICAgJWJvb2xlYW47ICAgICAidHJ1ZSIKLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAgI0lNUExJRUQKLSAgJWNhcmRldjsKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBFdmVudCBCaW5kaW5ncyA9PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBkbyAoJXRhc2s7KT4KLTwhQVRUTElTVCBkbwotICB0eXBlICAgICAgICAgQ0RBVEEgICAgICAgI1JFUVVJUkVECi0gIGxhYmVsICAgICAgICAldmRhdGE7ICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICAgTk1UT0tFTiAgICAgI0lNUExJRUQKLSAgb3B0aW9uYWwgICAgICVib29sZWFuOyAgICJmYWxzZSIKLSAgeG1sOmxhbmcgICAgIE5NVE9LRU4gICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIG9uZXZlbnQgKCV0YXNrOyk+Ci08IUFUVExJU1Qgb25ldmVudAotICB0eXBlICAgICAgICAgQ0RBVEEgICAgICAgI1JFUVVJUkVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRGVjay1sZXZlbCBkZWNsYXJhdGlvbnMgPT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgaGVhZCAoIGFjY2VzcyB8IG1ldGEgKSs+Ci08IUFUVExJU1QgaGVhZAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCB0ZW1wbGF0ZSAoJW5hdmVsbXRzOykqPgotPCFBVFRMSVNUIHRlbXBsYXRlCi0gICVjYXJkZXY7Ci0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGFjY2VzcyBFTVBUWT4KLTwhQVRUTElTVCBhY2Nlc3MKLSAgZG9tYWluICAgICAgIENEQVRBICAgICAgICNJTVBMSUVECi0gIHBhdGggICAgICAgICBDREFUQSAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBtZXRhIEVNUFRZPgotPCFBVFRMSVNUIG1ldGEKLSAgaHR0cC1lcXVpdiAgICAgQ0RBVEEgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICAgICBDREFUQSAgICAgICNJTVBMSUVECi0gIGZvcnVhICAgICAgICAgICVib29sZWFuOyAgI0lNUExJRUQKLSAgY29udGVudCAgICAgICAgQ0RBVEEgICAgICAjUkVRVUlSRUQKLSAgc2NoZW1lICAgICAgICAgQ0RBVEEgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IFRhc2tzID09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGdvIChwb3N0ZmllbGQgfCBzZXR2YXIpKj4KLTwhQVRUTElTVCBnbwotICBocmVmICAgICAgICAgICAgJUhSRUY7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgc2VuZHJlZmVyZXIgICAgICVib29sZWFuOyAgICAgICAiZmFsc2UiCi0gIG1ldGhvZCAgICAgICAgICAocG9zdHxnZXQpICAgICAgImdldCIKLSAgYWNjZXB0LWNoYXJzZXQgIENEQVRBICAgICAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBwcmV2IChzZXR2YXIpKj4KLTwhQVRUTElTVCBwcmV2Ci0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIHJlZnJlc2ggKHNldHZhcikqPgotPCFBVFRMSVNUIHJlZnJlc2gKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgbm9vcCBFTVBUWT4KLTwhQVRUTElTVCBub29wCi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gcG9zdGZpZWxkID09PT09PT09PT09PT09PT0tLT4KLSAKLTwhRUxFTUVOVCBwb3N0ZmllbGQgRU1QVFk+Ci08IUFUVExJU1QgcG9zdGZpZWxkCi0gIG5hbWUgICAgICAgICAldmRhdGE7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgdmFsdWUgICAgICAgICV2ZGF0YTsgICAgICAgICAgICNSRVFVSVJFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IHZhcmlhYmxlcyA9PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBzZXR2YXIgRU1QVFk+Ci08IUFUVExJU1Qgc2V0dmFyCi0gIG5hbWUgICAgICAgICAldmRhdGE7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgdmFsdWUgICAgICAgICV2ZGF0YTsgICAgICAgICAgICNSRVFVSVJFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IENhcmQgRmllbGRzID09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIHNlbGVjdCAob3B0Z3JvdXB8b3B0aW9uKSs+Ci08IUFUVExJU1Qgc2VsZWN0Ci0gIHRpdGxlICAgICAgICAldmRhdGE7ICAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICAgTk1UT0tFTiAgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgICV2ZGF0YTsgICAgICAgICAgICNJTVBMSUVECi0gIGluYW1lICAgICAgICBOTVRPS0VOICAgICAgICAgICAjSU1QTElFRAotICBpdmFsdWUgICAgICAgJXZkYXRhOyAgICAgICAgICAgI0lNUExJRUQKLSAgbXVsdGlwbGUgICAgICVib29sZWFuOyAgICAgICAgICJmYWxzZSIKLSAgdGFiaW5kZXggICAgICVudW1iZXI7ICAgICAgICAgICNJTVBMSUVECi0gIHhtbDpsYW5nICAgICBOTVRPS0VOICAgICAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBvcHRncm91cCAob3B0Z3JvdXB8b3B0aW9uKSsgPgotPCFBVFRMSVNUIG9wdGdyb3VwCi0gIHRpdGxlICAgICAgJXZkYXRhOyAgICAjSU1QTElFRAotICB4bWw6bGFuZyAgIE5NVE9LRU4gICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgb3B0aW9uICgjUENEQVRBIHwgb25ldmVudCkqPgotPCFBVFRMSVNUIG9wdGlvbgotICB2YWx1ZSAgICAgICV2ZGF0YTsgICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAldmRhdGE7ICAgICNJTVBMSUVECi0gIG9ucGljayAgICAgJUhSRUY7ICAgICAjSU1QTElFRAotICB4bWw6bGFuZyAgIE5NVE9LRU4gICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgaW5wdXQgRU1QVFk+Ci08IUFUVExJU1QgaW5wdXQKLSAgbmFtZSAgICAgICBOTVRPS0VOICAgICAgICAgICAjUkVRVUlSRUQKLSAgdHlwZSAgICAgICAodGV4dHxwYXNzd29yZCkgICAidGV4dCIKLSAgdmFsdWUgICAgICAldmRhdGE7ICAgICAgICAgICAjSU1QTElFRAotICBmb3JtYXQgICAgIENEQVRBICAgICAgICAgICAgICNJTVBMSUVECi0gIGVtcHR5b2sgICAgJWJvb2xlYW47ICAgICAgICAgImZhbHNlIgotICBzaXplICAgICAgICVudW1iZXI7ICAgICAgICAgICNJTVBMSUVECi0gIG1heGxlbmd0aCAgJW51bWJlcjsgICAgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAlbnVtYmVyOyAgICAgICAgICAjSU1QTElFRAotICB0aXRsZSAgICAgICV2ZGF0YTsgICAgICAgICAgICNJTVBMSUVECi0gIHhtbDpsYW5nICAgTk1UT0tFTiAgICAgICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgZmllbGRzZXQgKCVmaWVsZHM7IHwgZG8pKiA+Ci08IUFUVExJU1QgZmllbGRzZXQKLSAgdGl0bGUgICAgICAgICAgICV2ZGF0YTsgICAgICAjSU1QTElFRAotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIHRpbWVyIEVNUFRZPgotPCFBVFRMSVNUIHRpbWVyCi0gIG5hbWUgICAgICAgTk1UT0tFTiAgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAldmRhdGE7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIElBbGlnbiAiKHRvcHxtaWRkbGV8Ym90dG9tKSIgPgotCi08IUVMRU1FTlQgaW1nIEVNUFRZPgotPCFBVFRMSVNUIGltZwotICBhbHQgICAgICAgICV2ZGF0YTsgICAgICAjUkVRVUlSRUQKLSAgc3JjICAgICAgICAlSFJFRjsgICAgICAgI1JFUVVJUkVECi0gIGxvY2Fsc3JjICAgJXZkYXRhOyAgICAgICNJTVBMSUVECi0gIHZzcGFjZSAgICAgJWxlbmd0aDsgICAgICIwIgotICBoc3BhY2UgICAgICVsZW5ndGg7ICAgICAiMCIKLSAgYWxpZ24gICAgICAlSUFsaWduOyAgICAgImJvdHRvbSIKLSAgaGVpZ2h0ICAgICAlbGVuZ3RoOyAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAlbGVuZ3RoOyAgICAgI0lNUExJRUQKLSAgeG1sOmxhbmcgICBOTVRPS0VOICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBBbmNob3IgPT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgYW5jaG9yICggI1BDREFUQSB8IGJyIHwgaW1nIHwgZ28gfCBwcmV2IHwgcmVmcmVzaCApKj4KLTwhQVRUTElTVCBhbmNob3IKLSAgdGl0bGUgICAgICAgICV2ZGF0YTsgICAgICAjSU1QTElFRAotICB4bWw6bGFuZyAgICAgTk1UT0tFTiAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGEgKCAjUENEQVRBIHwgYnIgfCBpbWcgKSo+Ci08IUFUVExJU1QgYQotICBocmVmICAgICAgICAgJUhSRUY7ICAgICAgICNSRVFVSVJFRAotICB0aXRsZSAgICAgICAgJXZkYXRhOyAgICAgICNJTVBMSUVECi0gIHhtbDpsYW5nICAgICBOTVRPS0VOICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBUYWJsZXMgPT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgdGFibGUgKHRyKSs+Ci08IUFUVExJU1QgdGFibGUKLSAgdGl0bGUgICAgICAgJXZkYXRhOyAgICAjSU1QTElFRAotICBhbGlnbiAgICAgICBDREFUQSAgICAgICNJTVBMSUVECi0gIGNvbHVtbnMgICAgICVudW1iZXI7ICAgI1JFUVVJUkVECi0gIHhtbDpsYW5nICAgIE5NVE9LRU4gICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgdHIgKHRkKSs+Ci08IUFUVExJU1QgdHIKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgdGQgKCAldGV4dDsgfCAlbGF5b3V0OyB8IGltZyB8IGFuY2hvciB8IGEgKSo+Ci08IUFUVExJU1QgdGQKLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBUZXh0IGxheW91dCBhbmQgbGluZSBicmVha3MgPT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgZW0gICAgICglZmxvdzspKj4KLTwhQVRUTElTVCBlbQotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBzdHJvbmcgKCVmbG93OykqPgotPCFBVFRMSVNUIHN0cm9uZwotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBiICAgICAgKCVmbG93OykqPgotPCFBVFRMSVNUIGIKLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgaSAgICAgICglZmxvdzspKj4KLTwhQVRUTElTVCBpCi0gIHhtbDpsYW5nICAgICAgICBOTVRPS0VOICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIHUgICAgICAoJWZsb3c7KSo+Ci08IUFUVExJU1QgdQotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBiaWcgICAgKCVmbG93OykqPgotPCFBVFRMSVNUIGJpZwotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBzbWFsbCAgKCVmbG93OykqPgotPCFBVFRMSVNUIHNtYWxsCi0gIHhtbDpsYW5nICAgICAgICBOTVRPS0VOICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTlRJVFkgJSBUQWxpZ24gIihsZWZ0fHJpZ2h0fGNlbnRlcikiPgotPCFFTlRJVFkgJSBXcmFwTW9kZSAiKHdyYXB8bm93cmFwKSIgPgotPCFFTEVNRU5UIHAgKCVmaWVsZHM7IHwgZG8pKj4KLTwhQVRUTElTVCBwCi0gIGFsaWduICAgICAgICVUQWxpZ247ICAgICAibGVmdCIKLSAgbW9kZSAgICAgICAgJVdyYXBNb2RlOyAgICNJTVBMSUVECi0gIHhtbDpsYW5nICAgIE5NVE9LRU4gICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBiciBFTVBUWT4KLTwhQVRUTElTVCBicgotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRU5USVRZIHF1b3QgICImIzM0OyI+ICAgICA8IS0tIHF1b3RhdGlvbiBtYXJrIC0tPgotPCFFTlRJVFkgYW1wICAgIiYjMzg7IzM4OyI+IDwhLS0gYW1wZXJzYW5kIC0tPgotPCFFTlRJVFkgYXBvcyAgIiYjMzk7Ij4gICAgIDwhLS0gYXBvc3Ryb3BoZSAtLT4KLTwhRU5USVRZIGx0ICAgICImIzM4OyM2MDsiPiA8IS0tIGxlc3MgdGhhbiAtLT4KLTwhRU5USVRZIGd0ICAgICImIzYyOyI+ICAgICA8IS0tIGdyZWF0ZXIgdGhhbiAtLT4KLTwhRU5USVRZIG5ic3AgICImIzE2MDsiPiAgICA8IS0tIG5vbi1icmVha2luZyBzcGFjZSAtLT4KLTwhRU5USVRZIHNoeSAgICImIzE3MzsiPiAgICA8IS0tIHNvZnQgaHlwaGVuIChkaXNjcmV0aW9uYXJ5IGh5cGhlbikgLS0+Ci0KLTwhLS0KLUNvcHlyaWdodCBXaXJlbGVzcyBBcHBsaWNhdGlvbiBQcm90b2NvbCBGb3J1bSBMdGQuLCAxOTk4LDE5OTkuCi0gICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAotLS0+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvd21sMTMuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3dtbDEzLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkODViMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvd21sMTMuZHRkCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLWJhc2ljMTAtZi5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtYmFzaWMxMC1mLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzZDI1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtYmFzaWMxMC1mLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDMwODYgKzAsMCBAQAotPCEtLSBYSFRNTCBCYXNpYyAxLjAgRFREICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJhc2ljMTAuZHRkIC0tPgotCi08IS0tIFhIVE1MIEJhc2ljIDEuMCBEVEQKLQotICAgICBUaGlzIGlzIFhIVE1MIEJhc2ljLCBhIHByb3BlciBzdWJzZXQgb2YgWEhUTUwuCi0KLSAgICAgVGhlIEV4dGVuc2libGUgSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZSAoWEhUTUwpCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bQotICAgICAgICAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUKLSAgICAgICAgIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuCi0gICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhlIFhIVE1MIEJhc2ljIERURAotICAgICBhbmQgaXRzIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMKLSAgICAgaGVyZWJ5IGdyYW50ZWQgaW4gcGVycGV0dWl0eSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZQotICAgICBhbmQgdGhpcyBwYXJhZ3JhcGggYXBwZWFyIGluIGFsbCBjb3BpZXMuICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZQotICAgICBubyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhlIERURCBmb3IgYW55IHB1cnBvc2UuCi0KLSAgICAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3NlZCBvciBpbXBsaWVkIHdhcnJhbnR5LgotCi0gICAgICAgIEVkaXRvcnM6ICAgIE11cnJheSBNLiBBbHRoZWltIDxtYWlsdG86YWx0aGVpbUBlbmcuc3VuLmNvbT4KLSAgICAgICAgICAgICAgICAgICAgUGV0ZXIgU3RhcmsgICAgICAgPG1haWx0bzpQZXRlci5TdGFya0BlY3MuZXJpY3Nzb24uc2U+Ci0gICAgICAgIFJldmlzaW9uOiAgICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0tLT4KLTwhLS0gVGhpcyBpcyB0aGUgZHJpdmVyIGZpbGUgZm9yIHZlcnNpb24gMS4wIG9mIHRoZSBYSFRNTCBCYXNpYyBEVEQuCi0KLSAgICAgVGhpcyBEVEQgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgUFVCTElDOiAiLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiIKLSAgICAgU1lTVEVNOiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtYmFzaWMveGh0bWwtYmFzaWMxMC5kdGQiCi0tLT4KLTwhRU5USVRZICUgWEhUTUwudmVyc2lvbiAgIi0vL1czQy8vRFREIFhIVE1MIEJhc2ljIDEuMC8vRU4iID4KLQotPCEtLSBVc2UgdGhpcyBVUkkgdG8gaWRlbnRpZnkgdGhlIGRlZmF1bHQgbmFtZXNwYWNlOgotCi0gICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLQotICAgICBTZWUgdGhlIFF1YWxpZmllZCBOYW1lcyBtb2R1bGUgZm9yIGluZm9ybWF0aW9uCi0gICAgIG9uIHRoZSB1c2Ugb2YgbmFtZXNwYWNlIHByZWZpeGVzIGluIHRoZSBEVEQuCi0tLT4KLTwhRU5USVRZICUgTlMucHJlZml4ZWQgIklHTk9SRSIgPgotPCFFTlRJVFkgJSBYSFRNTC5wcmVmaXggICIiID4KLQotPCEtLSBSZXNlcnZlZCBmb3IgdXNlIHdpdGggdGhlIFhMaW5rIG5hbWVzcGFjZToKLS0tPgotPCFFTlRJVFkgJSBYTElOSy54bWxucyAiIiA+Ci08IUVOVElUWSAlIFhMSU5LLnhtbG5zLmF0dHJpYiAiIiA+Ci0KLTwhLS0gRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgdXNpbmcgWEhUTUwgQmFzaWMgMS4wIGRpcmVjdGx5LCB1c2UKLSAgICAgdGhlIEZQSSBpbiB0aGUgRE9DVFlQRSBkZWNsYXJhdGlvbiwgd2l0aCB0aGUgeG1sbnMgYXR0cmlidXRlCi0gICAgIG9uIHRoZSBkb2N1bWVudCBlbGVtZW50IHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IG5hbWVzcGFjZToKLQotICAgICAgICAgPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0gICAgICAgICA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIEJhc2ljIDEuMC8vRU4iCi0gICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLWJhc2ljL3hodG1sLWJhc2ljMTAuZHRkIiA+Ci0gICAgICAgICA8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiIgPgotICAgICAgICAgLi4uCi0gICAgICAgICA8L2h0bWw+Ci0tLT4KLQotPCEtLSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSB3aXRoIGRvY3VtZW50IHByb2ZpbGVzIC0tPgotPCFFTlRJVFkgJSBYSFRNTC5wcm9maWxlICAiIiA+Ci0KLTwhLS0gQmlkaXJlY3Rpb25hbCBUZXh0IGZlYXR1cmVzCi0gICAgIFRoaXMgZmVhdHVyZS10ZXN0IGVudGl0eSBpcyB1c2VkIHRvIGRlY2xhcmUgZWxlbWVudHMKLSAgICAgYW5kIGF0dHJpYnV0ZXMgdXNlZCBmb3IgYmlkaXJlY3Rpb25hbCB0ZXh0IHN1cHBvcnQuCi0tLT4KLTwhRU5USVRZICUgWEhUTUwuYmlkaSAgIklHTk9SRSIgPgotCi08P2RvYyB0eXBlPSJkb2N0eXBlIiByb2xlPSJ0aXRsZSIgeyBYSFRNTCBCYXNpYyAxLjAgfSA/PgotCi08IS0tIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhRU5USVRZICUgeGh0bWwtZXZlbnRzLm1vZHVsZSAgICJJR05PUkUiID4KLTwhRU5USVRZICUgeGh0bWwtYmRvLm1vZHVsZSAgICAgICIlWEhUTUwuYmlkaTsiID4KLQotPCFFTlRJVFkgJSB4aHRtbC1tb2RlbC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIEJhc2ljIDEuMCBEb2N1bWVudCBNb2RlbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJhc2ljMTAtbW9kZWwtMS5tb2QiID4KLQotPCFFTlRJVFkgJSB4aHRtbC1mcmFtZXdvcmsubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBNb2R1bGFyIEZyYW1ld29yayAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWZyYW1ld29yay0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBNb2R1bGFyIEZyYW1ld29yayBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1mcmFtZXdvcmstMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgTW9kdWxhciBGcmFtZXdvcmsgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1mcmFtZXdvcmstMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTW9kdWxhciBGcmFtZXdvcmsKLQotICAgICBUaGlzIHJlcXVpcmVkIG1vZHVsZSBpbnN0YW50aWF0ZXMgdGhlIG1vZHVsZXMgbmVlZGVkCi0gICAgIHRvIHN1cHBvcnQgdGhlIFhIVE1MIG1vZHVsYXJpemF0aW9uIG1vZGVsLCBpbmNsdWRpbmc6Ci0KLSAgICAgICAgKyAgbm90YXRpb25zCi0gICAgICAgICsgIGRhdGF0eXBlcwotICAgICAgICArICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzCi0gICAgICAgICsgIGNvbW1vbiBhdHRyaWJ1dGVzCi0gICAgICAgICsgIGRvY3VtZW50IG1vZGVsCi0gICAgICAgICsgIGNoYXJhY3RlciBlbnRpdGllcwotCi0gICAgIFRoZSBJbnRyaW5zaWMgRXZlbnRzIG1vZHVsZSBpcyBpZ25vcmVkIGJ5IGRlZmF1bHQgYnV0Ci0gICAgIG9jY3VycyBpbiB0aGlzIG1vZHVsZSBiZWNhdXNlIGl0IG11c3QgYmUgaW5zdGFudGlhdGVkCi0gICAgIHByaW9yIHRvIEF0dHJpYnV0ZXMgYnV0IGFmdGVyIERhdGF0eXBlcy4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWFyY2gubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYXJjaC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1hcmNoLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzZSBBcmNoaXRlY3R1cmUgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1hcmNoLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJhc2UgQXJjaGl0ZWN0dXJlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWFyY2gtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzZSBBcmNoaXRlY3R1cmUgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1hcmNoLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFRoaXMgb3B0aW9uYWwgbW9kdWxlIGluY2x1ZGVzIGRlY2xhcmF0aW9ucyB0aGF0IGVuYWJsZSBYSFRNTCB0byBiZSB1c2VkCi0gICAgIGFzIGEgYmFzZSBhcmNoaXRlY3R1cmUgYWNjb3JkaW5nIHRvIHRoZSAnQXJjaGl0ZWN0dXJhbCBGb3JtcyBEZWZpbml0aW9uCi0gICAgIFJlcXVpcmVtZW50cycgKEFubmV4IEEuMywgSVNPL0lFQyAxMDc0NCwgMm5kIGVkaXRpb24pLiBGb3IgbW9yZSBpbmZvcm1hdGlvbgotICAgICBvbiB1c2Ugb2YgYXJjaGl0ZWN0dXJhbCBmb3Jtcywgc2VlIHRoZSBIeVRpbWUgd2ViIHNpdGUgYXQ6Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuaHl0aW1lLm9yZy8KLS0tPgotCi08P0lTMTA3NDQgQXJjQmFzZSB4aHRtbCA/PgotCi08IU5PVEFUSU9OIHhodG1sIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBBRkRSIEFSQ0JBU0UgWEhUTUwgMS4xLy9FTiIgPgotCi08IS0tIEVudGl0eSBkZWNsYXJhdGlvbiBmb3IgYXNzb2NpYXRlZCBBcmNoaXRlY3R1cmFsIERURAotLS0+Ci08IUVOVElUWSB4aHRtbC1hcmNoLmR0ZAotICAgICAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCBBcmNoaXRlY3R1cmUgMS4xLy9FTiIKLSAgICAgICAgICAgICAieGh0bWwxMS1hcmNoLmR0ZCIgPgotCi08P0lTMTA3NDQ6YXJjaCB4aHRtbAotICAgIHB1YmxpYy1pZCAgICAgICA9ICAiLS8vVzNDLy9OT1RBVElPTiBBRkRSIEFSQ0JBU0UgWEhUTUwgMS4xLy9FTiIKLSAgICBkdGQtcHVibGljLWlkICAgPSAgIi0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0gICAgZHRkLXN5c3RlbS1pZCAgID0gICJ4aHRtbDExLmR0ZCIKLSAgICBkb2MtZWxlbS1mb3JtICAgPSAgImh0bWwiCi0gICAgZm9ybS1hdHQgICAgICAgID0gICJodG1sIgotICAgIHJlbmFtZXItYXR0ICAgICA9ICAiaHRuYW1lcyIKLSAgICBzdXBwcmVzc29yLWF0dCAgPSAgImh0c3VwcCIKLSAgICBkYXRhLWlnbm9yZS1hdHQgPSAgImh0aWduIgotICAgIGF1dG8gICAgICAgICAgICA9ICAiQXJjQXV0byIKLSAgICBvcHRpb25zICAgICAgICAgPSAgIkh0TW9kUmVxIEh0TW9kT3B0IgotICAgIEh0TW9kUmVxICAgICAgICA9ICAiRnJhbWV3b3JrIFRleHQgSHlwZXJ0ZXh0IExpc3RzIFN0cnVjdHVyZSIKLSAgICBIdE1vZE9wdCAgICAgICAgPSAgIlN0YW5kYXJkIgotPz4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYXJjaC0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLW5vdGF0aW9ucy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ub3RhdGlvbnMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtbm90YXRpb25zLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT05TIFhIVE1MIE5vdGF0aW9ucyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLW5vdGF0aW9ucy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBOb3RhdGlvbnMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ub3RhdGlvbnMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJAotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTlMgWEhUTUwgTm90YXRpb25zIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtbm90YXRpb25zLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIE5vdGF0aW9ucwotCi0gICAgIGRlZmluZXMgdGhlIGZvbGxvd2luZyBub3RhdGlvbnMsIG1hbnkgb2YgdGhlc2UgaW1wb3J0ZWQgZnJvbSAKLSAgICAgb3RoZXIgc3BlY2lmaWNhdGlvbnMgYW5kIHN0YW5kYXJkcy4gV2hlbiBhbiBleGlzdGluZyBGUEkgaXMKLSAgICAga25vd24sIGl0IGlzIGluY29ycG9yYXRlZCBoZXJlLgotLS0+Ci0KLTwhLS0gWE1MIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBTR01MIGFuZCBYTUwgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVzNDIFhNTCAxLjAgUmVjb21tZW5kYXRpb24gLS0+Ci08IU5PVEFUSU9OIHczYy14bWwgCi0gICAgIFBVQkxJQyAiSVNPIDg4NzkvL05PVEFUSU9OIEV4dGVuc2libGUgTWFya3VwIExhbmd1YWdlIChYTUwpIDEuMC8vRU4iID4KLQotPCEtLSBYTUwgMS4wIENEQVRBIC0tPgotPCFOT1RBVElPTiBjZGF0YSAKLSAgICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhNTCAxLjA6IENEQVRBLy9FTiIgPgotCi08IS0tIFNHTUwgRm9ybWFsIFB1YmxpYyBJZGVudGlmaWVycyAtLT4KLTwhTk9UQVRJT04gZnBpCi0gICAgIFBVQkxJQyAiSVNPIDg4Nzk6MTk4Ni8vTk9UQVRJT04gRm9ybWFsIFB1YmxpYyBJZGVudGlmaWVyLy9FTiIgPgotCi08IS0tIFhIVE1MIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBMZW5ndGggZGVmaW5lZCBmb3IgY2VsbHBhZGRpbmcvY2VsbHNwYWNpbmcgLS0+Ci0KLTwhLS0gbm4gZm9yIHBpeGVscyBvciBubiUgZm9yIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotPCFOT1RBVElPTiBsZW5ndGggCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBMZW5ndGgvL0VOIiA+Ci0KLTwhLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcyAtLT4KLTwhTk9UQVRJT04gbGlua1R5cGVzIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTGlua1R5cGVzLy9FTiIgPgotCi08IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLTwhTk9UQVRJT04gbWVkaWFEZXNjIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTWVkaWFEZXNjLy9FTiIgPgotCi08IS0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLTwhTk9UQVRJT04gbXVsdGlMZW5ndGggCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBNdWx0aUxlbmd0aC8vRU4iID4KLQotPCEtLSBvbmUgb3IgbW9yZSBkaWdpdHMgKE5VTUJFUikgLS0+Ci08IU5PVEFUSU9OIG51bWJlciAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IE51bWJlci8vRU4iID4KLQotPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotPCFOT1RBVElPTiBwaXhlbHMgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBQaXhlbHMvL0VOIiA+Ci0KLTwhLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci08IU5PVEFUSU9OIHNjcmlwdCAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFNjcmlwdC8vRU4iID4KLQotPCEtLSB0ZXh0dWFsIGNvbnRlbnQgLS0+Ci08IU5PVEFUSU9OIHRleHQgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBUZXh0Ly9FTiIgPgotCi08IS0tIEltcG9ydGVkIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotPCFOT1RBVElPTiBjaGFyYWN0ZXIgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDaGFyYWN0ZXIvL0VOIiA+Ci0KLTwhLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNoYXJzZXQgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDaGFyc2V0Ly9FTiIgPgotCi08IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY2hhcnNldHMgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDaGFyc2V0cy8vRU4iID4KLQotPCEtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjb250ZW50VHlwZSAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENvbnRlbnRUeXBlLy9FTiIgPgotCi08IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjb250ZW50VHlwZXMgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDb250ZW50VHlwZXMvL0VOIiA+Ci0KLTwhLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotPCFOT1RBVElPTiBkYXRldGltZSAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IERhdGV0aW1lLy9FTiIgPgotCi08IS0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMxNzY2XSAtLT4KLTwhTk9UQVRJT04gbGFuZ3VhZ2VDb2RlIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTGFuZ3VhZ2VDb2RlLy9FTiIgPgotCi08IS0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLCBzZWUgW1VSSV0gLS0+Ci08IU5PVEFUSU9OIHVyaSAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFVSSS8vRU4iID4KLQotPCEtLSBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMsIHNlZSBbVVJJXSAtLT4KLTwhTk9UQVRJT04gdXJpcyAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFVSSXMvL0VOIiA+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLW5vdGF0aW9ucy0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWRhdGF0eXBlcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1kYXRhdHlwZXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtZGF0YXR5cGVzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgRGF0YXR5cGVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtZGF0YXR5cGVzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIERhdGF0eXBlcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWRhdGF0eXBlcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBEYXRhdHlwZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1kYXRhdHlwZXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRGF0YXR5cGVzCi0KLSAgICAgZGVmaW5lcyBjb250YWluZXJzIGZvciB0aGUgZm9sbG93aW5nIGRhdGF0eXBlcywgbWFueSBvZgotICAgICB0aGVzZSBpbXBvcnRlZCBmcm9tIG90aGVyIHNwZWNpZmljYXRpb25zIGFuZCBzdGFuZGFyZHMuCi0tLT4KLQotPCEtLSBMZW5ndGggZGVmaW5lZCBmb3IgY2VsbHBhZGRpbmcvY2VsbHNwYWNpbmcgLS0+Ci0KLTwhLS0gbm4gZm9yIHBpeGVscyBvciBubiUgZm9yIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotPCFFTlRJVFkgJSBMZW5ndGguZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcyAtLT4KLTwhRU5USVRZICUgTGlua1R5cGVzLmRhdGF0eXBlICJOTVRPS0VOUyIgPgotCi08IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLTwhRU5USVRZICUgTWVkaWFEZXNjLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLTwhRU5USVRZICUgTXVsdGlMZW5ndGguZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gb25lIG9yIG1vcmUgZGlnaXRzIChOVU1CRVIpIC0tPgotPCFFTlRJVFkgJSBOdW1iZXIuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLTwhRU5USVRZICUgUGl4ZWxzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotPCFFTlRJVFkgJSBTY3JpcHQuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gdGV4dHVhbCBjb250ZW50IC0tPgotPCFFTlRJVFkgJSBUZXh0LmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIEltcG9ydGVkIERhdGF0eXBlcyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotPCFFTlRJVFkgJSBDaGFyYWN0ZXIuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENoYXJzZXQuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDaGFyc2V0cy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDb250ZW50VHlwZS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ29udGVudFR5cGVzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGRhdGUgYW5kIHRpbWUgaW5mb3JtYXRpb24uIElTTyBkYXRlIGZvcm1hdCAtLT4KLTwhRU5USVRZICUgRGF0ZXRpbWUuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gZm9ybWFsIHB1YmxpYyBpZGVudGlmaWVyLCBhcyBwZXIgW0lTTzg4NzldIC0tPgotPCFFTlRJVFkgJSBGUEkuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBsYW5ndWFnZSBjb2RlLCBhcyBwZXIgW1JGQzE3NjZdIC0tPgotPCFFTlRJVFkgJSBMYW5ndWFnZUNvZGUuZGF0YXR5cGUgIk5NVE9LRU4iID4KLQotPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtVUkldIC0tPgotPCFFTlRJVFkgJSBVUkkuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzLCBzZWUgW1VSSV0gLS0+Ci08IUVOVElUWSAlIFVSSXMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWRhdGF0eXBlcy0xLm1vZCAtLT4KLV1dPgotCi08IS0tIHBsYWNlaG9sZGVyIGZvciBYTGluayBzdXBwb3J0IG1vZHVsZSAtLT4KLTwhRU5USVRZICUgeGh0bWwteGxpbmsubW9kICIiID4KLQotCi08IUVOVElUWSAlIHhodG1sLXFuYW1lLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXFuYW1lLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXFuYW1lLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgUXVhbGlmaWVkIE5hbWVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtcW5hbWUtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFFuYW1lIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1xbmFtZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBRdWFsaWZpZWQgTmFtZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1xbmFtZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBYSFRNTCBRbmFtZSAoUXVhbGlmaWVkIE5hbWUpIE1vZHVsZQotCi0gICAgIFRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0d28gcGFydHMsIGxhYmVsZWQgU2VjdGlvbiAnQScgYW5kICdCJzoKLQotICAgICAgIFNlY3Rpb24gQSBkZWNsYXJlcyBwYXJhbWV0ZXIgZW50aXRpZXMgdG8gc3VwcG9ydCBuYW1lc3BhY2UtCi0gICAgICAgcXVhbGlmaWVkIG5hbWVzLCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLCBhbmQgbmFtZSBwcmVmaXhpbmcgCi0gICAgICAgZm9yIFhIVE1MIGFuZCBleHRlbnNpb25zLgotICAgIAotICAgICAgIFNlY3Rpb24gQiBkZWNsYXJlcyBwYXJhbWV0ZXIgZW50aXRpZXMgdXNlZCB0byBwcm92aWRlCi0gICAgICAgbmFtZXNwYWNlLXF1YWxpZmllZCBuYW1lcyBmb3IgYWxsIFhIVE1MIGVsZW1lbnQgdHlwZXM6Ci0KLSAgICAgICAgICVhcHBsZXQucW5hbWU7ICAgdGhlIHhtbG5zLXF1YWxpZmllZCBuYW1lIGZvciA8YXBwbGV0PgotICAgICAgICAgJWJhc2UucW5hbWU7ICAgICB0aGUgeG1sbnMtcXVhbGlmaWVkIG5hbWUgZm9yIDxiYXNlPgotICAgICAgICAgLi4uCi0KLSAgICAgWEhUTUwgZXh0ZW5zaW9ucyB3b3VsZCBjcmVhdGUgYSBtb2R1bGUgc2ltaWxhciB0byB0aGlzIG9uZS4gCi0gICAgIEluY2x1ZGVkIGluIHRoZSBYSFRNTCBkaXN0cmlidXRpb24gaXMgYSB0ZW1wbGF0ZSBtb2R1bGUgCi0gICAgICgndGVtcGxhdGUtcW5hbWUtMS5tb2QnKSBzdWl0YWJsZSBmb3IgdGhpcyBwdXJwb3NlLgotLS0+Ci0KLTwhLS0gU2VjdGlvbiBBOiBYSFRNTCBYTUwgTmFtZXNwYWNlIEZyYW1ld29yayA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCEtLSAxLiBEZWNsYXJlIGEgJVhIVE1MLnByZWZpeGVkOyBjb25kaXRpb25hbCBzZWN0aW9uIGtleXdvcmQsIHVzZWQKLSAgICAgICAgdG8gYWN0aXZhdGUgbmFtZXNwYWNlIHByZWZpeGluZy4gVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIAotICAgICAgICBpbmhlcml0ICclTlMucHJlZml4ZWQ7JyBmcm9tIHRoZSBEVEQgZHJpdmVyLCBzbyB0aGF0IHVubGVzcyAKLSAgICAgICAgb3ZlcnJpZGRlbiwgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGZvbGxvd3MgdGhlIG92ZXJhbGwgRFREIAotICAgICAgICBwcmVmaXhpbmcgc2NoZW1lLgotLS0+Ci08IUVOVElUWSAlIE5TLnByZWZpeGVkICJJR05PUkUiID4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ZWQgIiVOUy5wcmVmaXhlZDsiID4KLQotPCEtLSAyLiBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAoZWcuLCAlWEhUTUwueG1sbnM7KSBjb250YWluaW5nIAotICAgICAgICB0aGUgVVJJIHJlZmVyZW5jZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBYSFRNTCBuYW1lc3BhY2U6Ci0tLT4KLTwhRU5USVRZICUgWEhUTUwueG1sbnMgICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiA+Ci0KLTwhLS0gMy4gRGVjbGFyZSBwYXJhbWV0ZXIgZW50aXRpZXMgKGVnLiwgJVhIVE1MLnByZWZpeDspIGNvbnRhaW5pbmcKLSAgICAgICAgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHByZWZpeCBzdHJpbmcocykgdG8gdXNlIHdoZW4gcHJlZml4aW5nIAotICAgICAgICBpcyBlbmFibGVkLiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGluIHRoZSBEVEQgZHJpdmVyIG9yIHRoZQotICAgICAgICBpbnRlcm5hbCBzdWJzZXQgb2YgYW4gZG9jdW1lbnQgaW5zdGFuY2UuIElmIG5vIGRlZmF1bHQgcHJlZml4Ci0gICAgICAgIGlzIGRlc2lyZWQsIHRoaXMgbWF5IGJlIGRlY2xhcmVkIGFzIGFuIGVtcHR5IHN0cmluZy4KLQotICAgICBOT1RFOiBBcyBzcGVjaWZpZWQgaW4gW1hNTE5BTUVTXSwgdGhlIG5hbWVzcGFjZSBwcmVmaXggc2VydmVzIAotICAgICBhcyBhIHByb3h5IGZvciB0aGUgVVJJIHJlZmVyZW5jZSwgYW5kIGlzIG5vdCBpbiBpdHNlbGYgc2lnbmlmaWNhbnQuCi0tLT4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ICAiIiA+Ci0KLTwhLS0gNC4gRGVjbGFyZSBwYXJhbWV0ZXIgZW50aXRpZXMgKGVnLiwgJVhIVE1MLnBmeDspIGNvbnRhaW5pbmcgdGhlIAotICAgICAgICBjb2xvbml6ZWQgcHJlZml4KGVzKSAoZWcuLCAnJVhIVE1MLnByZWZpeDs6JykgdXNlZCB3aGVuIAotICAgICAgICBwcmVmaXhpbmcgaXMgYWN0aXZlLCBhbiBlbXB0eSBzdHJpbmcgd2hlbiBpdCBpcyBub3QuCi0tLT4KLTwhWyVYSFRNTC5wcmVmaXhlZDtbCi08IUVOVElUWSAlIFhIVE1MLnBmeCAgIiVYSFRNTC5wcmVmaXg7OiIgPgotXV0+Ci08IUVOVElUWSAlIFhIVE1MLnBmeCAgIiIgPgotCi08IS0tIGRlY2xhcmUgcXVhbGlmaWVkIG5hbWUgZXh0ZW5zaW9ucyBoZXJlIC4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtcW5hbWUtZXh0cmEubW9kICIiID4KLQotCi08IS0tIDUuIFRoZSBwYXJhbWV0ZXIgZW50aXR5ICVYSFRNTC54bWxucy5leHRyYS5hdHRyaWI7IG1heSBiZQotICAgICAgICByZWRlY2xhcmVkIHRvIGNvbnRhaW4gYW55IG5vbi1YSFRNTCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gCi0gICAgICAgIGF0dHJpYnV0ZXMgZm9yIG5hbWVzcGFjZXMgZW1iZWRkZWQgaW4gWEhUTUwuIFRoZSBkZWZhdWx0IAotICAgICAgICBpcyBhbiBlbXB0eSBzdHJpbmcuICBYTGluayBzaG91bGQgYmUgaW5jbHVkZWQgaGVyZSBpZiB1c2VkIAotICAgICAgICBpbiB0aGUgRFRELgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYiAiIiA+Ci0KLTwhLS0gVGhlIHJlbWFpbmRlciBvZiBTZWN0aW9uIEEgaXMgb25seSBmb2xsb3dlZCBpbiBYSFRNTCwgbm90IGV4dGVuc2lvbnMuIC0tPgotCi08IS0tIERlY2xhcmUgYSBwYXJhbWV0ZXIgZW50aXR5ICVOUy5kZWNsLmF0dHJpYjsgY29udGFpbmluZwotICAgICBhbGwgWE1MIE5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgdXNlZCBpbiB0aGUgRFRELCBwbHVzIHRoZQotICAgICB4bWxucyBkZWNsYXJhdGlvbiBmb3IgWEhUTUwsIGl0cyBmb3JtIGRlcGVuZGVudCBvbiB3aGV0aGVyIAotICAgICBwcmVmaXhpbmcgaXMgYWN0aXZlLiAKLS0tPgotPCFbJVhIVE1MLnByZWZpeGVkO1sKLTwhRU5USVRZICUgTlMuZGVjbC5hdHRyaWIKLSAgICAgInhtbG5zOiVYSFRNTC5wcmVmaXg7ICAlVVJJLmRhdGF0eXBlOyAgICNGSVhFRCAnJVhIVE1MLnhtbG5zOycKLSAgICAgICVYSFRNTC54bWxucy5leHRyYS5hdHRyaWI7IgotPgotXV0+Ci08IUVOVElUWSAlIE5TLmRlY2wuYXR0cmliCi0gICAgICIlWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliOyIKLT4KLQotPCEtLSBUaGlzIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSBYTGluayBzdXBwb3J0LgotLS0+Ci08IUVOVElUWSAlIFhMSU5LLnhtbG5zLmF0dHJpYiAiIiA+Ci0KLTwhLS0gRGVjbGFyZSBhIHBhcmFtZXRlciBlbnRpdHkgJU5TLmRlY2wuYXR0cmliOyBjb250YWluaW5nIGFsbCAKLSAgICAgWE1MIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhdHRyaWJ1dGVzIHVzZWQgYnkgWEhUTUwsIGluY2x1ZGluZwotICAgICBhIGRlZmF1bHQgeG1sbnMgYXR0cmlidXRlIHdoZW4gcHJlZml4aW5nIGlzIGluYWN0aXZlLgotLS0+Ci08IVslWEhUTUwucHJlZml4ZWQ7WwotPCFFTlRJVFkgJSBYSFRNTC54bWxucy5hdHRyaWIKLSAgICAgIiVOUy5kZWNsLmF0dHJpYjsKLSAgICAgICVYTElOSy54bWxucy5hdHRyaWI7IgotPgotXV0+Ci08IUVOVElUWSAlIFhIVE1MLnhtbG5zLmF0dHJpYgotICAgICAieG1sbnMgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjRklYRUQgJyVYSFRNTC54bWxuczsnCi0gICAgICAlWExJTksueG1sbnMuYXR0cmliOyIKLT4KLQotPCEtLSBwbGFjZWhvbGRlciBmb3IgcXVhbGlmaWVkIG5hbWUgcmVkZWNsYXJhdGlvbnMgLS0+Ci08IUVOVElUWSAlIHhodG1sLXFuYW1lLnJlZGVjbCAiIiA+Ci0KLQotPCEtLSBTZWN0aW9uIEI6IFhIVE1MIFF1YWxpZmllZCBOYW1lcyA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCEtLSA2LiBUaGlzIHNlY3Rpb24gZGVjbGFyZXMgcGFyYW1ldGVyIGVudGl0aWVzIHVzZWQgdG8gcHJvdmlkZQotICAgICAgICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzIGZvciBhbGwgWEhUTUwgZWxlbWVudCB0eXBlcy4KLS0tPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWFwcGxldC0xLm1vZCAtLT4KLTwhRU5USVRZICUgYXBwbGV0LnFuYW1lICAiJVhIVE1MLnBmeDthcHBsZXQiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1iYXNlLTEubW9kIC0tPgotPCFFTlRJVFkgJSBiYXNlLnFuYW1lICAgICIlWEhUTUwucGZ4O2Jhc2UiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1iZG8tMS5tb2QgLS0+Ci08IUVOVElUWSAlIGJkby5xbmFtZSAgICAgIiVYSFRNTC5wZng7YmRvIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmxrcGhyYXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGFkZHJlc3MucW5hbWUgIiVYSFRNTC5wZng7YWRkcmVzcyIgPgotPCFFTlRJVFkgJSBibG9ja3F1b3RlLnFuYW1lICAiJVhIVE1MLnBmeDtibG9ja3F1b3RlIiA+Ci08IUVOVElUWSAlIHByZS5xbmFtZSAgICAgIiVYSFRNTC5wZng7cHJlIiA+Ci08IUVOVElUWSAlIGgxLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDEiID4KLTwhRU5USVRZICUgaDIucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoMiIgPgotPCFFTlRJVFkgJSBoMy5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2gzIiA+Ci08IUVOVElUWSAlIGg0LnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDQiID4KLTwhRU5USVRZICUgaDUucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoNSIgPgotPCFFTlRJVFkgJSBoNi5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2g2IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmxrcHJlcy0xLm1vZCAtLT4KLTwhRU5USVRZICUgaHIucW5hbWUgICAgICAiJVhIVE1MLnBmeDtociIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJsa3N0cnVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgZGl2LnFuYW1lICAgICAiJVhIVE1MLnBmeDtkaXYiID4KLTwhRU5USVRZICUgcC5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtwIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtZWRpdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgaW5zLnFuYW1lICAgICAiJVhIVE1MLnBmeDtpbnMiID4KLTwhRU5USVRZICUgZGVsLnFuYW1lICAgICAiJVhIVE1MLnBmeDtkZWwiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1mb3JtLTEubW9kIC0tPgotPCFFTlRJVFkgJSBmb3JtLnFuYW1lICAgICIlWEhUTUwucGZ4O2Zvcm0iID4KLTwhRU5USVRZICUgbGFiZWwucW5hbWUgICAiJVhIVE1MLnBmeDtsYWJlbCIgPgotPCFFTlRJVFkgJSBpbnB1dC5xbmFtZSAgICIlWEhUTUwucGZ4O2lucHV0IiA+Ci08IUVOVElUWSAlIHNlbGVjdC5xbmFtZSAgIiVYSFRNTC5wZng7c2VsZWN0IiA+Ci08IUVOVElUWSAlIG9wdGdyb3VwLnFuYW1lICAiJVhIVE1MLnBmeDtvcHRncm91cCIgPgotPCFFTlRJVFkgJSBvcHRpb24ucW5hbWUgICIlWEhUTUwucGZ4O29wdGlvbiIgPgotPCFFTlRJVFkgJSB0ZXh0YXJlYS5xbmFtZSAgIiVYSFRNTC5wZng7dGV4dGFyZWEiID4KLTwhRU5USVRZICUgZmllbGRzZXQucW5hbWUgICIlWEhUTUwucGZ4O2ZpZWxkc2V0IiA+Ci08IUVOVElUWSAlIGxlZ2VuZC5xbmFtZSAgIiVYSFRNTC5wZng7bGVnZW5kIiA+Ci08IUVOVElUWSAlIGJ1dHRvbi5xbmFtZSAgIiVYSFRNTC5wZng7YnV0dG9uIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaHlwZXJ0ZXh0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBhLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O2EiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbWFnZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgaW1nLnFuYW1lICAgICAiJVhIVE1MLnBmeDtpbWciID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbmxwaHJhcy0xLm1vZCAtLT4KLTwhRU5USVRZICUgYWJici5xbmFtZSAgICAiJVhIVE1MLnBmeDthYmJyIiA+Ci08IUVOVElUWSAlIGFjcm9ueW0ucW5hbWUgIiVYSFRNTC5wZng7YWNyb255bSIgPgotPCFFTlRJVFkgJSBjaXRlLnFuYW1lICAgICIlWEhUTUwucGZ4O2NpdGUiID4KLTwhRU5USVRZICUgY29kZS5xbmFtZSAgICAiJVhIVE1MLnBmeDtjb2RlIiA+Ci08IUVOVElUWSAlIGRmbi5xbmFtZSAgICAgIiVYSFRNTC5wZng7ZGZuIiA+Ci08IUVOVElUWSAlIGVtLnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZW0iID4KLTwhRU5USVRZICUga2JkLnFuYW1lICAgICAiJVhIVE1MLnBmeDtrYmQiID4KLTwhRU5USVRZICUgcS5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtxIiA+Ci08IUVOVElUWSAlIHNhbXAucW5hbWUgICAgIiVYSFRNTC5wZng7c2FtcCIgPgotPCFFTlRJVFkgJSBzdHJvbmcucW5hbWUgICIlWEhUTUwucGZ4O3N0cm9uZyIgPgotPCFFTlRJVFkgJSB2YXIucW5hbWUgICAgICIlWEhUTUwucGZ4O3ZhciIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlubHByZXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGIucW5hbWUgICAgICAgIiVYSFRNTC5wZng7YiIgPgotPCFFTlRJVFkgJSBiaWcucW5hbWUgICAgICIlWEhUTUwucGZ4O2JpZyIgPgotPCFFTlRJVFkgJSBpLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O2kiID4KLTwhRU5USVRZICUgc21hbGwucW5hbWUgICAiJVhIVE1MLnBmeDtzbWFsbCIgPgotPCFFTlRJVFkgJSBzdWIucW5hbWUgICAgICIlWEhUTUwucGZ4O3N1YiIgPgotPCFFTlRJVFkgJSBzdXAucW5hbWUgICAgICIlWEhUTUwucGZ4O3N1cCIgPgotPCFFTlRJVFkgJSB0dC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3R0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW5sc3RydWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBici5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2JyIiA+Ci08IUVOVElUWSAlIHNwYW4ucW5hbWUgICAgIiVYSFRNTC5wZng7c3BhbiIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlzbWFwLTEubW9kIChhbHNvIGNzaXNtYXAsIHNzaXNtYXApIC0tPgotPCFFTlRJVFkgJSBtYXAucW5hbWUgICAgICIlWEhUTUwucGZ4O21hcCIgPgotPCFFTlRJVFkgJSBhcmVhLnFuYW1lICAgICIlWEhUTUwucGZ4O2FyZWEiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1saW5rLTEubW9kIC0tPgotPCFFTlRJVFkgJSBsaW5rLnFuYW1lICAgICIlWEhUTUwucGZ4O2xpbmsiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1saXN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBkbC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2RsIiA+Ci08IUVOVElUWSAlIGR0LnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZHQiID4KLTwhRU5USVRZICUgZGQucW5hbWUgICAgICAiJVhIVE1MLnBmeDtkZCIgPgotPCFFTlRJVFkgJSBvbC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O29sIiA+Ci08IUVOVElUWSAlIHVsLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dWwiID4KLTwhRU5USVRZICUgbGkucW5hbWUgICAgICAiJVhIVE1MLnBmeDtsaSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLW1ldGEtMS5tb2QgLS0+Ci08IUVOVElUWSAlIG1ldGEucW5hbWUgICAgIiVYSFRNTC5wZng7bWV0YSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXBhcmFtLTEubW9kIC0tPgotPCFFTlRJVFkgJSBwYXJhbS5xbmFtZSAgICIlWEhUTUwucGZ4O3BhcmFtIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtb2JqZWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBvYmplY3QucW5hbWUgICIlWEhUTUwucGZ4O29iamVjdCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXNjcmlwdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgc2NyaXB0LnFuYW1lICAiJVhIVE1MLnBmeDtzY3JpcHQiID4KLTwhRU5USVRZICUgbm9zY3JpcHQucW5hbWUgICIlWEhUTUwucGZ4O25vc2NyaXB0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtc3RydWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBodG1sLnFuYW1lICAgICIlWEhUTUwucGZ4O2h0bWwiID4KLTwhRU5USVRZICUgaGVhZC5xbmFtZSAgICAiJVhIVE1MLnBmeDtoZWFkIiA+Ci08IUVOVElUWSAlIHRpdGxlLnFuYW1lICAgIiVYSFRNTC5wZng7dGl0bGUiID4KLTwhRU5USVRZICUgYm9keS5xbmFtZSAgICAiJVhIVE1MLnBmeDtib2R5IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtc3R5bGUtMS5tb2QgLS0+Ci08IUVOVElUWSAlIHN0eWxlLnFuYW1lICAgIiVYSFRNTC5wZng7c3R5bGUiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC10YWJsZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgdGFibGUucW5hbWUgICAiJVhIVE1MLnBmeDt0YWJsZSIgPgotPCFFTlRJVFkgJSBjYXB0aW9uLnFuYW1lICIlWEhUTUwucGZ4O2NhcHRpb24iID4KLTwhRU5USVRZICUgdGhlYWQucW5hbWUgICAiJVhIVE1MLnBmeDt0aGVhZCIgPgotPCFFTlRJVFkgJSB0Zm9vdC5xbmFtZSAgICIlWEhUTUwucGZ4O3Rmb290IiA+Ci08IUVOVElUWSAlIHRib2R5LnFuYW1lICAgIiVYSFRNTC5wZng7dGJvZHkiID4KLTwhRU5USVRZICUgY29sZ3JvdXAucW5hbWUgICIlWEhUTUwucGZ4O2NvbGdyb3VwIiA+Ci08IUVOVElUWSAlIGNvbC5xbmFtZSAgICAgIiVYSFRNTC5wZng7Y29sIiA+Ci08IUVOVElUWSAlIHRyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dHIiID4KLTwhRU5USVRZICUgdGgucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0aCIgPgotPCFFTlRJVFkgJSB0ZC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3RkIiA+Ci0KLQotPCEtLSBQcm92aXNpb25hbCBYSFRNTCAyLjAgUXVhbGlmaWVkIE5hbWVzICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWltYWdlLTIubW9kIC0tPgotPCFFTlRJVFkgJSBhbHQucW5hbWUgICAgICIlWEhUTUwucGZ4O2FsdCIgPgotCi08IS0tIGVuZCBvZiB4aHRtbC1xbmFtZS0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWV2ZW50cy5tb2R1bGUgIklHTk9SRSIgPgotPCFbJXhodG1sLWV2ZW50cy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ldmVudHMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBJbnRyaW5zaWMgRXZlbnRzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtZXZlbnRzLTEubW9kIiA+Ci0leGh0bWwtZXZlbnRzLm1vZDtdXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1hdHRyaWJzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWF0dHJpYnMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYXR0cmlicy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENvbW1vbiBBdHRyaWJ1dGVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYXR0cmlicy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBDb21tb24gQXR0cmlidXRlcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1hdHRyaWJzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENvbW1vbiBBdHRyaWJ1dGVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtYXR0cmlicy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBDb21tb24gQXR0cmlidXRlcwotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIG1hbnkgb2YgdGhlIGNvbW1vbiBhdHRyaWJ1dGVzIGZvciB0aGUgWEhUTUwgRFRELgotICAgICAlTlMuZGVjbC5hdHRyaWI7IGlzIGRlY2xhcmVkIGluIHRoZSBYSFRNTCBRbmFtZSBtb2R1bGUuCi0tLT4KLQotPCFFTlRJVFkgJSBpZC5hdHRyaWIKLSAgICAgImlkICAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgY2xhc3MuYXR0cmliCi0gICAgICJjbGFzcyAgICAgICAgTk1UT0tFTlMgICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIHRpdGxlLmF0dHJpYgotICAgICAidGl0bGUgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSBDb3JlLmV4dHJhLmF0dHJpYiAiIiA+Ci0KLTwhRU5USVRZICUgQ29yZS5hdHRyaWIKLSAgICAgIiVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlaWQuYXR0cmliOwotICAgICAgJWNsYXNzLmF0dHJpYjsKLSAgICAgICV0aXRsZS5hdHRyaWI7Ci0gICAgICAlQ29yZS5leHRyYS5hdHRyaWI7IgotPgotCi08IUVOVElUWSAlIGxhbmcuYXR0cmliCi0gICAgICJ4bWw6bGFuZyAgICAgJUxhbmd1YWdlQ29kZS5kYXRhdHlwZTsgICNJTVBMSUVEIgotPgotCi08IVslWEhUTUwuYmlkaTtbCi08IUVOVElUWSAlIGRpci5hdHRyaWIKLSAgICAgImRpciAgICAgICAgICAoIGx0ciB8IHJ0bCApICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgSTE4bi5hdHRyaWIKLSAgICAgIiVkaXIuYXR0cmliOwotICAgICAgJWxhbmcuYXR0cmliOyIKLT4KLQotXV0+Ci08IUVOVElUWSAlIEkxOG4uYXR0cmliCi0gICAgICIlbGFuZy5hdHRyaWI7IgotPgotCi08IUVOVElUWSAlIENvbW1vbi5leHRyYS5hdHRyaWIgIiIgPgotCi08IS0tIGludHJpbnNpYyBldmVudCBhdHRyaWJ1dGVzIGRlY2xhcmVkIHByZXZpb3VzbHkKLS0tPgotPCFFTlRJVFkgJSBFdmVudHMuYXR0cmliICIiID4KLQotPCFFTlRJVFkgJSBDb21tb24uYXR0cmliCi0gICAgICIlQ29yZS5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICAlRXZlbnRzLmF0dHJpYjsKLSAgICAgICVDb21tb24uZXh0cmEuYXR0cmliOyIKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYXR0cmlicy0xLm1vZCAtLT4KLV1dPgotCi08IS0tIHBsYWNlaG9sZGVyIGZvciBjb250ZW50IG1vZGVsIHJlZGVjbGFyYXRpb25zIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1tb2RlbC5yZWRlY2wgIiIgPgotCi0KLTwhRU5USVRZICUgeGh0bWwtbW9kZWwubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbW9kZWwubW9kdWxlO1sKLTwhLS0gaW5zdGFudGlhdGUgdGhlIERvY3VtZW50IE1vZGVsIG1vZHVsZSBkZWNsYXJlZCBpbiB0aGUgRFREIGRyaXZlcgotLS0+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCYXNpYyAxLjAgRG9jdW1lbnQgTW9kZWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJhc2ljMTAtbW9kZWwtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MIEJhc2ljLCBhIHByb3BlciBzdWJzZXQgb2YgWEhUTUwuCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBCYXNpYyAxLjAgRG9jdW1lbnQgTW9kZWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLWJhc2ljL3hodG1sLWJhc2ljMTAtbW9kZWwtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gWEhUTUwgQmFzaWMgRG9jdW1lbnQgTW9kZWwKLQotICAgICBUaGlzIG1vZHVsZSBkZXNjcmliZXMgdGhlIGdyb3VwaW5ncyBvZiBlbGVtZW50cyB0aGF0IG1ha2UgdXAKLSAgICAgY29tbW9uIGNvbnRlbnQgbW9kZWxzIGZvciBYSFRNTCBlbGVtZW50cy4KLS0tPgotCi08IS0tIE9wdGlvbmFsIEVsZW1lbnRzIGluIGhlYWQgIC4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIEhlYWRPcHRzLm1peAotICAgICAiKCAlbWV0YS5xbmFtZTsgfCAlbGluay5xbmFtZTsgfCAlb2JqZWN0LnFuYW1lOyApKiIgPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIE1pc2MuY2xhc3MgIiIgPgotCi08IS0tIElubGluZSBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIElubFN0cnVjdC5jbGFzcyAiJWJyLnFuYW1lOyB8ICVzcGFuLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubFBocmFzLmNsYXNzCi0gICAgICJ8ICVlbS5xbmFtZTsgfCAlc3Ryb25nLnFuYW1lOyB8ICVkZm4ucW5hbWU7IHwgJWNvZGUucW5hbWU7Ci0gICAgICB8ICVzYW1wLnFuYW1lOyB8ICVrYmQucW5hbWU7IHwgJXZhci5xbmFtZTsgfCAlY2l0ZS5xbmFtZTsKLSAgICAgIHwgJWFiYnIucW5hbWU7IHwgJWFjcm9ueW0ucW5hbWU7IHwgJXEucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5sUHJlcy5jbGFzcyAiIiA+Ci0KLTwhRU5USVRZICUgSTE4bi5jbGFzcyAiIiA+Ci0KLTwhRU5USVRZICUgQW5jaG9yLmNsYXNzICJ8ICVhLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubFNwZWNpYWwuY2xhc3MgInwgJWltZy5xbmFtZTsgfCAlb2JqZWN0LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubEZvcm0uY2xhc3MKLSAgICAgInwgJWlucHV0LnFuYW1lOyB8ICVzZWxlY3QucW5hbWU7IHwgJXRleHRhcmVhLnFuYW1lOwotICAgICAgfCAlbGFiZWwucW5hbWU7IgotPgotCi08IUVOVElUWSAlIElubGluZS5leHRyYSAiIiA+Ci0KLTwhRU5USVRZICUgSW5saW5lLmNsYXNzCi0gICAgICIlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubEZvcm0uY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyIKLT4KLQotPCFFTlRJVFkgJSBJbmxOb0FuY2hvci5jbGFzcwotICAgICAiJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubEZvcm0uY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyIKLT4KLQotPCFFTlRJVFkgJSBJbmxOb0FuY2hvci5taXgKLSAgICAgIiVJbmxOb0FuY2hvci5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCFFTlRJVFkgJSBJbmxpbmUubWl4Ci0gICAgICIlSW5saW5lLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tIEJsb2NrIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIEhlYWRpbmcuY2xhc3MKLSAgICAgIiVoMS5xbmFtZTsgfCAlaDIucW5hbWU7IHwgJWgzLnFuYW1lOwotICAgICAgfCAlaDQucW5hbWU7IHwgJWg1LnFuYW1lOyB8ICVoNi5xbmFtZTsiCi0+Ci08IUVOVElUWSAlIExpc3QuY2xhc3MgICIldWwucW5hbWU7IHwgJW9sLnFuYW1lOyB8ICVkbC5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBUYWJsZS5jbGFzcyAifCAldGFibGUucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgRm9ybS5jbGFzcyAgInwgJWZvcm0ucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrU3RydWN0LmNsYXNzICIlcC5xbmFtZTsgfCAlZGl2LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEJsa1BocmFzLmNsYXNzCi0gICAgICJ8ICVwcmUucW5hbWU7IHwgJWJsb2NrcXVvdGUucW5hbWU7IHwgJWFkZHJlc3MucW5hbWU7IgotPgotCi08IUVOVElUWSAlIEJsa1ByZXMuY2xhc3MgIiIgPgotCi08IUVOVElUWSAlIEJsa1NwZWNpYWwuY2xhc3MKLSAgICAgIiVUYWJsZS5jbGFzczsKLSAgICAgICVGb3JtLmNsYXNzOyIKLT4KLQotPCFFTlRJVFkgJSBCbG9jay5leHRyYSAiIiA+Ci0KLTwhRU5USVRZICUgQmxvY2suY2xhc3MKLSAgICAgIiVCbGtTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlQmxrUGhyYXMuY2xhc3M7Ci0gICAgICAlQmxrU3BlY2lhbC5jbGFzczsKLSAgICAgICVCbG9jay5leHRyYTsiCi0+Ci0KLTwhRU5USVRZICUgQmxvY2subWl4Ci0gICAgICIlSGVhZGluZy5jbGFzczsKLSAgICAgIHwgJUxpc3QuY2xhc3M7Ci0gICAgICB8ICVCbG9jay5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSBBbGwgQ29udGVudCBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBkZWNsYXJlcyBhbGwgY29udGVudCBleGNlcHQgdGFibGVzCi0tLT4KLTwhRU5USVRZICUgRmxvd05vVGFibGUubWl4Ci0gICAgICIlSGVhZGluZy5jbGFzczsKLSAgICAgIHwgJUxpc3QuY2xhc3M7Ci0gICAgICB8ICVCbGtTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlQmxrUGhyYXMuY2xhc3M7Ci0gICAgICAlRm9ybS5jbGFzczsKLSAgICAgICVCbG9jay5leHRyYTsKLSAgICAgIHwgJUlubGluZS5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCFFTlRJVFkgJSBGbG93Lm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxvY2suY2xhc3M7Ci0gICAgICB8ICVJbmxpbmUuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJhc2ljMTAtbW9kZWwtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1jaGFyZW50Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWNoYXJlbnQubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtY2hhcmVudC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENoYXJhY3RlciBFbnRpdGllcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWNoYXJlbnQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQ2hhcmFjdGVyIEVudGl0aWVzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWNoYXJlbnQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ2hhcmFjdGVyIEVudGl0aWVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtY2hhcmVudC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgRW50aXRpZXMgZm9yIFhIVE1MCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIHNldCBvZiBjaGFyYWN0ZXIgZW50aXRpZXMgZm9yIFhIVE1MLAotICAgICBpbmNsdWRpbmcgdGhlIExhdGluIDEsIFN5bWJvbCBhbmQgU3BlY2lhbCBjaGFyYWN0ZXIgY29sbGVjdGlvbnMuCi0tLT4KLQotPCFFTlRJVFkgJSB4aHRtbC1sYXQxCi0gICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgInhodG1sLWxhdDEuZW50IiA+Ci08IUVOVElUWSAlIHhodG1sLXN5bWJvbAotICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICAgICJ4aHRtbC1zeW1ib2wuZW50IiA+Ci08IUVOVElUWSAlIHhodG1sLXNwZWNpYWwKLSAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAieGh0bWwtc3BlY2lhbC5lbnQiID4KLQotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICA8IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgICAgICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1sYXQxLmVudCI+Ci0gICAgJUhUTUxsYXQxOwotLS0+Ci0KLTwhRU5USVRZIG5ic3AgICAiJiMxNjA7Ij4gPCEtLSBuby1icmVhayBzcGFjZSA9IG5vbi1icmVha2luZyBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTAgSVNPbnVtIC0tPgotPCFFTlRJVFkgaWV4Y2wgICImIzE2MTsiPiA8IS0tIGludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmssIFUrMDBBMSBJU09udW0gLS0+Ci08IUVOVElUWSBjZW50ICAgIiYjMTYyOyI+IDwhLS0gY2VudCBzaWduLCBVKzAwQTIgSVNPbnVtIC0tPgotPCFFTlRJVFkgcG91bmQgICImIzE2MzsiPiA8IS0tIHBvdW5kIHNpZ24sIFUrMDBBMyBJU09udW0gLS0+Ci08IUVOVElUWSBjdXJyZW4gIiYjMTY0OyI+IDwhLS0gY3VycmVuY3kgc2lnbiwgVSswMEE0IElTT251bSAtLT4KLTwhRU5USVRZIHllbiAgICAiJiMxNjU7Ij4gPCEtLSB5ZW4gc2lnbiA9IHl1YW4gc2lnbiwgVSswMEE1IElTT251bSAtLT4KLTwhRU5USVRZIGJydmJhciAiJiMxNjY7Ij4gPCEtLSBicm9rZW4gYmFyID0gYnJva2VuIHZlcnRpY2FsIGJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTYgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2VjdCAgICImIzE2NzsiPiA8IS0tIHNlY3Rpb24gc2lnbiwgVSswMEE3IElTT251bSAtLT4KLTwhRU5USVRZIHVtbCAgICAiJiMxNjg7Ij4gPCEtLSBkaWFlcmVzaXMgPSBzcGFjaW5nIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTggSVNPZGlhIC0tPgotPCFFTlRJVFkgY29weSAgICImIzE2OTsiPiA8IS0tIGNvcHlyaWdodCBzaWduLCBVKzAwQTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3JkZiAgICImIzE3MDsiPiA8IS0tIGZlbWluaW5lIG9yZGluYWwgaW5kaWNhdG9yLCBVKzAwQUEgSVNPbnVtIC0tPgotPCFFTlRJVFkgbGFxdW8gICImIzE3MTsiPiA8IS0tIGxlZnQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsZWZ0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEFCIElTT251bSAtLT4KLTwhRU5USVRZIG5vdCAgICAiJiMxNzI7Ij4gPCEtLSBub3Qgc2lnbiA9IGRpc2NyZXRpb25hcnkgaHlwaGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBQyBJU09udW0gLS0+Ci08IUVOVElUWSBzaHkgICAgIiYjMTczOyI+IDwhLS0gc29mdCBoeXBoZW4gPSBkaXNjcmV0aW9uYXJ5IGh5cGhlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUQgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmVnICAgICImIzE3NDsiPiA8IS0tIHJlZ2lzdGVyZWQgc2lnbiA9IHJlZ2lzdGVyZWQgdHJhZGUgbWFyayBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBRSBJU09udW0gLS0+Ci08IUVOVElUWSBtYWNyICAgIiYjMTc1OyI+IDwhLS0gbWFjcm9uID0gc3BhY2luZyBtYWNyb24gPSBvdmVybGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQVBMIG92ZXJiYXIsIFUrMDBBRiBJU09kaWEgLS0+Ci08IUVOVElUWSBkZWcgICAgIiYjMTc2OyI+IDwhLS0gZGVncmVlIHNpZ24sIFUrMDBCMCBJU09udW0gLS0+Ci08IUVOVElUWSBwbHVzbW4gIiYjMTc3OyI+IDwhLS0gcGx1cy1taW51cyBzaWduID0gcGx1cy1vci1taW51cyBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCMSBJU09udW0gLS0+Ci08IUVOVElUWSBzdXAyICAgIiYjMTc4OyI+IDwhLS0gc3VwZXJzY3JpcHQgdHdvID0gc3VwZXJzY3JpcHQgZGlnaXQgdHdvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzcXVhcmVkLCBVKzAwQjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMyAgICImIzE3OTsiPiA8IS0tIHN1cGVyc2NyaXB0IHRocmVlID0gc3VwZXJzY3JpcHQgZGlnaXQgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGN1YmVkLCBVKzAwQjMgSVNPbnVtIC0tPgotPCFFTlRJVFkgYWN1dGUgICImIzE4MDsiPiA8IS0tIGFjdXRlIGFjY2VudCA9IHNwYWNpbmcgYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI0IElTT2RpYSAtLT4KLTwhRU5USVRZIG1pY3JvICAiJiMxODE7Ij4gPCEtLSBtaWNybyBzaWduLCBVKzAwQjUgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGFyYSAgICImIzE4MjsiPiA8IS0tIHBpbGNyb3cgc2lnbiA9IHBhcmFncmFwaCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCNiBJU09udW0gLS0+Ci08IUVOVElUWSBtaWRkb3QgIiYjMTgzOyI+IDwhLS0gbWlkZGxlIGRvdCA9IEdlb3JnaWFuIGNvbW1hCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBHcmVlayBtaWRkbGUgZG90LCBVKzAwQjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgY2VkaWwgICImIzE4NDsiPiA8IS0tIGNlZGlsbGEgPSBzcGFjaW5nIGNlZGlsbGEsIFUrMDBCOCBJU09kaWEgLS0+Ci08IUVOVElUWSBzdXAxICAgIiYjMTg1OyI+IDwhLS0gc3VwZXJzY3JpcHQgb25lID0gc3VwZXJzY3JpcHQgZGlnaXQgb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRtICAgIiYjMTg2OyI+IDwhLS0gbWFzY3VsaW5lIG9yZGluYWwgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCQSBJU09udW0gLS0+Ci08IUVOVElUWSByYXF1byAgIiYjMTg3OyI+IDwhLS0gcmlnaHQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByaWdodCBwb2ludGluZyBndWlsbGVtZXQsIFUrMDBCQiBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMTQgIiYjMTg4OyI+IDwhLS0gdnVsZ2FyIGZyYWN0aW9uIG9uZSBxdWFydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiBvbmUgcXVhcnRlciwgVSswMEJDIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMxMiAiJiMxODk7Ij4gPCEtLSB2dWxnYXIgZnJhY3Rpb24gb25lIGhhbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIG9uZSBoYWxmLCBVKzAwQkQgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzM0ICImIzE5MDsiPiA8IS0tIHZ1bGdhciBmcmFjdGlvbiB0aHJlZSBxdWFydGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMsIFUrMDBCRSBJU09udW0gLS0+Ci08IUVOVElUWSBpcXVlc3QgIiYjMTkxOyI+IDwhLS0gaW52ZXJ0ZWQgcXVlc3Rpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHVybmVkIHF1ZXN0aW9uIG1hcmssIFUrMDBCRiBJU09udW0gLS0+Ci08IUVOVElUWSBBZ3JhdmUgIiYjMTkyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGdyYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgQWFjdXRlICImIzE5MzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFjaXJjICAiJiMxOTQ7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEF0aWxkZSAiJiMxOTU7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBdW1sICAgIiYjMTk2OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFyaW5nICAiJiMxOTc7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggcmluZyBhYm92ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSByaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgQUVsaWcgICImIzE5ODsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEFFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIEFFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQ2NlZGlsICImIzE5OTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEMgd2l0aCBjZWRpbGxhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWdyYXZlICImIzIwMDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzggSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVhY3V0ZSAiJiMyMDE7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFY2lyYyAgIiYjMjAyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFdW1sICAgIiYjMjAzOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0IgSVNPbGF0MSAtLT4KLTwhRU5USVRZIElncmF2ZSAiJiMyMDQ7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJYWN1dGUgIiYjMjA1OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWNpcmMgICImIzIwNjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgSXVtbCAgICImIzIwNzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFVEggICAgIiYjMjA4OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRVRILCBVKzAwRDAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE50aWxkZSAiJiMyMDk7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBOIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPZ3JhdmUgIiYjMjEwOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2FjdXRlICImIzIxMTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9jaXJjICAiJiMyMTI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE90aWxkZSAiJiMyMTM7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBPdW1sICAgIiYjMjE0OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRpbWVzICAiJiMyMTU7Ij4gPCEtLSBtdWx0aXBsaWNhdGlvbiBzaWduLCBVKzAwRDcgSVNPbnVtIC0tPgotPCFFTlRJVFkgT3NsYXNoICImIzIxNjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBzdHJva2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gc2xhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBVZ3JhdmUgIiYjMjE3OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWFjdXRlICImIzIxODsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVjaXJjICAiJiMyMTk7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFV1bWwgICAiJiMyMjA7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgWWFjdXRlICImIzIyMTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFRIT1JOICAiJiMyMjI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBUSE9STiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHN6bGlnICAiJiMyMjM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgc2hhcnAgcyA9IGVzcy16ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhZ3JhdmUgIiYjMjI0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBncmF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIGEgZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhYWN1dGUgIiYjMjI1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFjaXJjICAiJiMyMjY7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhdGlsZGUgIiYjMjI3OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGF1bWwgICAiJiMyMjg7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFyaW5nICAiJiMyMjk7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIHJpbmcgYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBhIHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBhZWxpZyAgIiYjMjMwOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGFlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsaWdhdHVyZSBhZSwgVSswMEU2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBjY2VkaWwgIiYjMjMxOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGMgd2l0aCBjZWRpbGxhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWdyYXZlICImIzIzMjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlYWN1dGUgIiYjMjMzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVjaXJjICAiJiMyMzQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBldW1sICAgIiYjMjM1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpZ3JhdmUgIiYjMjM2OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGlhY3V0ZSAiJiMyMzc7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWNpcmMgICImIzIzODsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGl1bWwgICAiJiMyMzk7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGV0aCAgICAiJiMyNDA7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZXRoLCBVKzAwRjAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG50aWxkZSAiJiMyNDE7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbiB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2dyYXZlICImIzI0MjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvYWN1dGUgIiYjMjQzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9jaXJjICAiJiMyNDQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdGlsZGUgIiYjMjQ1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG91bWwgICAiJiMyNDY7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGRpdmlkZSAiJiMyNDc7Ij4gPCEtLSBkaXZpc2lvbiBzaWduLCBVKzAwRjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3NsYXNoICImIzI0ODsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggc3Ryb2tlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIG8gc2xhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY4IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1Z3JhdmUgIiYjMjQ5OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVhY3V0ZSAiJiMyNTA7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWNpcmMgICImIzI1MTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHV1bWwgICAiJiMyNTI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHlhY3V0ZSAiJiMyNTM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdGhvcm4gICImIzI1NDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB0aG9ybiB3aXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgeXVtbCAgICImIzI1NTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB5IHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRiBJU09sYXQxIC0tPgotCi08IS0tIE1hdGhlbWF0aWNhbCwgR3JlZWsgYW5kIFN5bWJvbGljIGNoYXJhY3RlcnMgZm9yIEhUTUwgLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgICAgICAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLXN5bWJvbC5lbnQiPgotICAgICAlSFRNTHN5bWJvbDsKLS0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBVbmljb2RlIG5hbWVzLiAKLS0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUIgLS0+Ci08IUVOVElUWSBmbm9mICAgICAiJiM0MDI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBmIHdpdGggaG9vayA9IGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZsb3JpbiwgVSswMTkyIElTT3RlY2ggLS0+Ci0KLTwhLS0gR3JlZWsgLS0+Ci08IUVOVElUWSBBbHBoYSAgICAiJiM5MTM7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBhbHBoYSwgVSswMzkxIC0tPgotPCFFTlRJVFkgQmV0YSAgICAgIiYjOTE0OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYmV0YSwgVSswMzkyIC0tPgotPCFFTlRJVFkgR2FtbWEgICAgIiYjOTE1OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZ2FtbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIERlbHRhICAgICImIzkxNjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzk0IElTT2dyazMgLS0+Ci08IUVOVElUWSBFcHNpbG9uICAiJiM5MTc7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBlcHNpbG9uLCBVKzAzOTUgLS0+Ci08IUVOVElUWSBaZXRhICAgICAiJiM5MTg7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB6ZXRhLCBVKzAzOTYgLS0+Ci08IUVOVElUWSBFdGEgICAgICAiJiM5MTk7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBldGEsIFUrMDM5NyAtLT4KLTwhRU5USVRZIFRoZXRhICAgICImIzkyMDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRoZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzk4IElTT2dyazMgLS0+Ci08IUVOVElUWSBJb3RhICAgICAiJiM5MjE7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBpb3RhLCBVKzAzOTkgLS0+Ci08IUVOVElUWSBLYXBwYSAgICAiJiM5MjI7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBrYXBwYSwgVSswMzlBIC0tPgotPCFFTlRJVFkgTGFtYmRhICAgIiYjOTIzOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbGFtYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzlCIElTT2dyazMgLS0+Ci08IUVOVElUWSBNdSAgICAgICAiJiM5MjQ7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBtdSwgVSswMzlDIC0tPgotPCFFTlRJVFkgTnUgICAgICAgIiYjOTI1OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbnUsIFUrMDM5RCAtLT4KLTwhRU5USVRZIFhpICAgICAgICImIzkyNjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHhpLCBVKzAzOUUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE9taWNyb24gICImIzkyNzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9taWNyb24sIFUrMDM5RiAtLT4KLTwhRU5USVRZIFBpICAgICAgICImIzkyODsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBpLCBVKzAzQTAgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFJobyAgICAgICImIzkyOTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHJobywgVSswM0ExIC0tPgotPCEtLSB0aGVyZSBpcyBubyBTaWdtYWYsIGFuZCBubyBVKzAzQTIgY2hhcmFjdGVyIGVpdGhlciAtLT4KLTwhRU5USVRZIFNpZ21hICAgICImIzkzMTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0EzIElTT2dyazMgLS0+Ci08IUVOVElUWSBUYXUgICAgICAiJiM5MzI7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB0YXUsIFUrMDNBNCAtLT4KLTwhRU5USVRZIFVwc2lsb24gICImIzkzMzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFBoaSAgICAgICImIzkzNDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBoaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBNiBJU09ncmszIC0tPgotPCFFTlRJVFkgQ2hpICAgICAgIiYjOTM1OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgY2hpLCBVKzAzQTcgLS0+Ci08IUVOVElUWSBQc2kgICAgICAiJiM5MzY7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwc2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE9tZWdhICAgICImIzkzNzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9tZWdhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E5IElTT2dyazMgLS0+Ci0KLTwhRU5USVRZIGFscGhhICAgICImIzk0NTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBhbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCMSBJU09ncmszIC0tPgotPCFFTlRJVFkgYmV0YSAgICAgIiYjOTQ2OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGJldGEsIFUrMDNCMiBJU09ncmszIC0tPgotPCFFTlRJVFkgZ2FtbWEgICAgIiYjOTQ3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGdhbW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0IzIElTT2dyazMgLS0+Ci08IUVOVElUWSBkZWx0YSAgICAiJiM5NDg7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGVwc2lsb24gICImIzk0OTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBlcHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I1IElTT2dyazMgLS0+Ci08IUVOVElUWSB6ZXRhICAgICAiJiM5NTA7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgemV0YSwgVSswM0I2IElTT2dyazMgLS0+Ci08IUVOVElUWSBldGEgICAgICAiJiM5NTE7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZXRhLCBVKzAzQjcgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRoZXRhICAgICImIzk1MjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCOCBJU09ncmszIC0tPgotPCFFTlRJVFkgaW90YSAgICAgIiYjOTUzOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGlvdGEsIFUrMDNCOSBJU09ncmszIC0tPgotPCFFTlRJVFkga2FwcGEgICAgIiYjOTU0OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGthcHBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0JBIElTT2dyazMgLS0+Ci08IUVOVElUWSBsYW1iZGEgICAiJiM5NTU7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbGFtYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0JCIElTT2dyazMgLS0+Ci08IUVOVElUWSBtdSAgICAgICAiJiM5NTY7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbXUsIFUrMDNCQyBJU09ncmszIC0tPgotPCFFTlRJVFkgbnUgICAgICAgIiYjOTU3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG51LCBVKzAzQkQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHhpICAgICAgICImIzk1ODsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB4aSwgVSswM0JFIElTT2dyazMgLS0+Ci08IUVOVElUWSBvbWljcm9uICAiJiM5NTk7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgb21pY3JvbiwgVSswM0JGIE5FVyAtLT4KLTwhRU5USVRZIHBpICAgICAgICImIzk2MDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwaSwgVSswM0MwIElTT2dyazMgLS0+Ci08IUVOVElUWSByaG8gICAgICAiJiM5NjE7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcmhvLCBVKzAzQzEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hZiAgICImIzk2MjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBmaW5hbCBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDMiBJU09ncmszIC0tPgotPCFFTlRJVFkgc2lnbWEgICAgIiYjOTYzOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0MzIElTT2dyazMgLS0+Ci08IUVOVElUWSB0YXUgICAgICAiJiM5NjQ7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGF1LCBVKzAzQzQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHVwc2lsb24gICImIzk2NTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB1cHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0M1IElTT2dyazMgLS0+Ci08IUVOVElUWSBwaGkgICAgICAiJiM5NjY7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcGhpLCBVKzAzQzYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGNoaSAgICAgICImIzk2NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBjaGksIFUrMDNDNyBJU09ncmszIC0tPgotPCFFTlRJVFkgcHNpICAgICAgIiYjOTY4OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBzaSwgVSswM0M4IElTT2dyazMgLS0+Ci08IUVOVElUWSBvbWVnYSAgICAiJiM5Njk7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgb21lZ2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRoZXRhc3ltICImIzk3NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzRDEgTkVXIC0tPgotPCFFTlRJVFkgdXBzaWggICAgIiYjOTc4OyI+IDwhLS0gZ3JlZWsgdXBzaWxvbiB3aXRoIGhvb2sgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0QyIE5FVyAtLT4KLTwhRU5USVRZIHBpdiAgICAgICImIzk4MjsiPiA8IS0tIGdyZWVrIHBpIHN5bWJvbCwgVSswM0Q2IElTT2dyazMgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGJ1bGwgICAgICImIzgyMjY7Ij4gPCEtLSBidWxsZXQgPSBibGFjayBzbWFsbCBjaXJjbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDIyIElTT3B1YiAgLS0+Ci08IS0tIGJ1bGxldCBpcyBOT1QgdGhlIHNhbWUgYXMgYnVsbGV0IG9wZXJhdG9yLCBVKzIyMTkgLS0+Ci08IUVOVElUWSBoZWxsaXAgICAiJiM4MjMwOyI+IDwhLS0gaG9yaXpvbnRhbCBlbGxpcHNpcyA9IHRocmVlIGRvdCBsZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDI2IElTT3B1YiAgLS0+Ci08IUVOVElUWSBwcmltZSAgICAiJiM4MjQyOyI+IDwhLS0gcHJpbWUgPSBtaW51dGVzID0gZmVldCwgVSsyMDMyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBQcmltZSAgICAiJiM4MjQzOyI+IDwhLS0gZG91YmxlIHByaW1lID0gc2Vjb25kcyA9IGluY2hlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMzMgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9saW5lICAgICImIzgyNTQ7Ij4gPCEtLSBvdmVybGluZSA9IHNwYWNpbmcgb3ZlcnNjb3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzRSBORVcgLS0+Ci08IUVOVElUWSBmcmFzbCAgICAiJiM4MjYwOyI+IDwhLS0gZnJhY3Rpb24gc2xhc2gsIFUrMjA0NCBORVcgLS0+Ci0KLTwhLS0gTGV0dGVybGlrZSBTeW1ib2xzIC0tPgotPCFFTlRJVFkgd2VpZXJwICAgIiYjODQ3MjsiPiA8IS0tIHNjcmlwdCBjYXBpdGFsIFAgPSBwb3dlciBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFdlaWVyc3RyYXNzIHAsIFUrMjExOCBJU09hbXNvIC0tPgotPCFFTlRJVFkgaW1hZ2UgICAgIiYjODQ2NTsiPiA8IS0tIGJsYWNrbGV0dGVyIGNhcGl0YWwgSSA9IGltYWdpbmFyeSBwYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjExMSBJU09hbXNvIC0tPgotPCFFTlRJVFkgcmVhbCAgICAgIiYjODQ3NjsiPiA8IS0tIGJsYWNrbGV0dGVyIGNhcGl0YWwgUiA9IHJlYWwgcGFydCBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTFDIElTT2Ftc28gLS0+Ci08IUVOVElUWSB0cmFkZSAgICAiJiM4NDgyOyI+IDwhLS0gdHJhZGUgbWFyayBzaWduLCBVKzIxMjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgYWxlZnN5bSAgIiYjODUwMTsiPiA8IS0tIGFsZWYgc3ltYm9sID0gZmlyc3QgdHJhbnNmaW5pdGUgY2FyZGluYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTM1IE5FVyAtLT4KLTwhLS0gYWxlZiBzeW1ib2wgaXMgTk9UIHRoZSBzYW1lIGFzIGhlYnJldyBsZXR0ZXIgYWxlZiwKLSAgICAgVSswNUQwIGFsdGhvdWdoIHRoZSBzYW1lIGdseXBoIGNvdWxkIGJlIHVzZWQgdG8gZGVwaWN0IGJvdGggY2hhcmFjdGVycyAtLT4KLQotPCEtLSBBcnJvd3MgLS0+Ci08IUVOVElUWSBsYXJyICAgICAiJiM4NTkyOyI+IDwhLS0gbGVmdHdhcmRzIGFycm93LCBVKzIxOTAgSVNPbnVtIC0tPgotPCFFTlRJVFkgdWFyciAgICAgIiYjODU5MzsiPiA8IS0tIHVwd2FyZHMgYXJyb3csIFUrMjE5MSBJU09udW0tLT4KLTwhRU5USVRZIHJhcnIgICAgICImIzg1OTQ7Ij4gPCEtLSByaWdodHdhcmRzIGFycm93LCBVKzIxOTIgSVNPbnVtIC0tPgotPCFFTlRJVFkgZGFyciAgICAgIiYjODU5NTsiPiA8IS0tIGRvd253YXJkcyBhcnJvdywgVSsyMTkzIElTT251bSAtLT4KLTwhRU5USVRZIGhhcnIgICAgICImIzg1OTY7Ij4gPCEtLSBsZWZ0IHJpZ2h0IGFycm93LCBVKzIxOTQgSVNPYW1zYSAtLT4KLTwhRU5USVRZIGNyYXJyICAgICImIzg2Mjk7Ij4gPCEtLSBkb3dud2FyZHMgYXJyb3cgd2l0aCBjb3JuZXIgbGVmdHdhcmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjYXJyaWFnZSByZXR1cm4sIFUrMjFCNSBORVcgLS0+Ci08IUVOVElUWSBsQXJyICAgICAiJiM4NjU2OyI+IDwhLS0gbGVmdHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQwIElTT3RlY2ggLS0+Ci08IS0tIFVuaWNvZGUgZG9lcyBub3Qgc2F5IHRoYXQgbEFyciBpcyB0aGUgc2FtZSBhcyB0aGUgJ2lzIGltcGxpZWQgYnknIGFycm93Ci0gICAgYnV0IGFsc28gZG9lcyBub3QgaGF2ZSBhbnkgb3RoZXIgY2hhcmFjdGVyIGZvciB0aGF0IGZ1bmN0aW9uLiBTbyA/IGxBcnIgY2FuCi0gICAgYmUgdXNlZCBmb3IgJ2lzIGltcGxpZWQgYnknIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSB1QXJyICAgICAiJiM4NjU3OyI+IDwhLS0gdXB3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMSBJU09hbXNhIC0tPgotPCFFTlRJVFkgckFyciAgICAgIiYjODY1ODsiPiA8IS0tIHJpZ2h0d2FyZHMgZG91YmxlIGFycm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjFEMiBJU090ZWNoIC0tPgotPCEtLSBVbmljb2RlIGRvZXMgbm90IHNheSB0aGlzIGlzIHRoZSAnaW1wbGllcycgY2hhcmFjdGVyIGJ1dCBkb2VzIG5vdCBoYXZlIAotICAgICBhbm90aGVyIGNoYXJhY3RlciB3aXRoIHRoaXMgZnVuY3Rpb24gc28gPwotICAgICByQXJyIGNhbiBiZSB1c2VkIGZvciAnaW1wbGllcycgYXMgSVNPdGVjaCBzdWdnZXN0cyAtLT4KLTwhRU5USVRZIGRBcnIgICAgICImIzg2NTk7Ij4gPCEtLSBkb3dud2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDMgSVNPYW1zYSAtLT4KLTwhRU5USVRZIGhBcnIgICAgICImIzg2NjA7Ij4gPCEtLSBsZWZ0IHJpZ2h0IGRvdWJsZSBhcnJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxRDQgSVNPYW1zYSAtLT4KLQotPCEtLSBNYXRoZW1hdGljYWwgT3BlcmF0b3JzIC0tPgotPCFFTlRJVFkgZm9yYWxsICAgIiYjODcwNDsiPiA8IS0tIGZvciBhbGwsIFUrMjIwMCBJU090ZWNoIC0tPgotPCFFTlRJVFkgcGFydCAgICAgIiYjODcwNjsiPiA8IS0tIHBhcnRpYWwgZGlmZmVyZW50aWFsLCBVKzIyMDIgSVNPdGVjaCAgLS0+Ci08IUVOVElUWSBleGlzdCAgICAiJiM4NzA3OyI+IDwhLS0gdGhlcmUgZXhpc3RzLCBVKzIyMDMgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGVtcHR5ICAgICImIzg3MDk7Ij4gPCEtLSBlbXB0eSBzZXQgPSBudWxsIHNldCA9IGRpYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwNSBJU09hbXNvIC0tPgotPCFFTlRJVFkgbmFibGEgICAgIiYjODcxMTsiPiA8IS0tIG5hYmxhID0gYmFja3dhcmQgZGlmZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMDcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGlzaW4gICAgICImIzg3MTI7Ij4gPCEtLSBlbGVtZW50IG9mLCBVKzIyMDggSVNPdGVjaCAtLT4KLTwhRU5USVRZIG5vdGluICAgICImIzg3MTM7Ij4gPCEtLSBub3QgYW4gZWxlbWVudCBvZiwgVSsyMjA5IElTT3RlY2ggLS0+Ci08IUVOVElUWSBuaSAgICAgICAiJiM4NzE1OyI+IDwhLS0gY29udGFpbnMgYXMgbWVtYmVyLCBVKzIyMEIgSVNPdGVjaCAtLT4KLTwhLS0gc2hvdWxkIHRoZXJlIGJlIGEgbW9yZSBtZW1vcmFibGUgbmFtZSB0aGFuICduaSc/IC0tPgotPCFFTlRJVFkgcHJvZCAgICAgIiYjODcxOTsiPiA8IS0tIG4tYXJ5IHByb2R1Y3QgPSBwcm9kdWN0IHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjBGIElTT2Ftc2IgLS0+Ci08IS0tIHByb2QgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAzQTAgJ2dyZWVrIGNhcGl0YWwgbGV0dGVyIHBpJyB0aG91Z2gKLSAgICAgdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCBmb3IgYm90aCAtLT4KLTwhRU5USVRZIHN1bSAgICAgICImIzg3MjE7Ij4gPCEtLSBuLWFyeSBzdW1hdGlvbiwgVSsyMjExIElTT2Ftc2IgLS0+Ci08IS0tIHN1bSBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMyAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgc2lnbWEnCi0gICAgIHRob3VnaCB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgbWludXMgICAgIiYjODcyMjsiPiA8IS0tIG1pbnVzIHNpZ24sIFUrMjIxMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgbG93YXN0ICAgIiYjODcyNzsiPiA8IS0tIGFzdGVyaXNrIG9wZXJhdG9yLCBVKzIyMTcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHJhZGljICAgICImIzg3MzA7Ij4gPCEtLSBzcXVhcmUgcm9vdCA9IHJhZGljYWwgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMUEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHByb3AgICAgICImIzg3MzM7Ij4gPCEtLSBwcm9wb3J0aW9uYWwgdG8sIFUrMjIxRCBJU090ZWNoIC0tPgotPCFFTlRJVFkgaW5maW4gICAgIiYjODczNDsiPiA8IS0tIGluZmluaXR5LCBVKzIyMUUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGFuZyAgICAgICImIzg3MzY7Ij4gPCEtLSBhbmdsZSwgVSsyMjIwIElTT2Ftc28gLS0+Ci08IUVOVElUWSBhbmQgICAgICAiJiM4NzQzOyI+IDwhLS0gbG9naWNhbCBhbmQgPSB3ZWRnZSwgVSsyMjI3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBvciAgICAgICAiJiM4NzQ0OyI+IDwhLS0gbG9naWNhbCBvciA9IHZlZSwgVSsyMjI4IElTT3RlY2ggLS0+Ci08IUVOVElUWSBjYXAgICAgICAiJiM4NzQ1OyI+IDwhLS0gaW50ZXJzZWN0aW9uID0gY2FwLCBVKzIyMjkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGN1cCAgICAgICImIzg3NDY7Ij4gPCEtLSB1bmlvbiA9IGN1cCwgVSsyMjJBIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbnQgICAgICAiJiM4NzQ3OyI+IDwhLS0gaW50ZWdyYWwsIFUrMjIyQiBJU090ZWNoIC0tPgotPCFFTlRJVFkgdGhlcmU0ICAgIiYjODc1NjsiPiA8IS0tIHRoZXJlZm9yZSwgVSsyMjM0IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzaW0gICAgICAiJiM4NzY0OyI+IDwhLS0gdGlsZGUgb3BlcmF0b3IgPSB2YXJpZXMgd2l0aCA9IHNpbWlsYXIgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjNDIElTT3RlY2ggLS0+Ci08IS0tIHRpbGRlIG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgdGhlIHRpbGRlLCBVKzAwN0UsCi0gICAgIGFsdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgdG8gcmVwcmVzZW50IGJvdGggIC0tPgotPCFFTlRJVFkgY29uZyAgICAgIiYjODc3MzsiPiA8IS0tIGFwcHJveGltYXRlbHkgZXF1YWwgdG8sIFUrMjI0NSBJU090ZWNoIC0tPgotPCFFTlRJVFkgYXN5bXAgICAgIiYjODc3NjsiPiA8IS0tIGFsbW9zdCBlcXVhbCB0byA9IGFzeW1wdG90aWMgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjQ4IElTT2Ftc3IgLS0+Ci08IUVOVElUWSBuZSAgICAgICAiJiM4ODAwOyI+IDwhLS0gbm90IGVxdWFsIHRvLCBVKzIyNjAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGVxdWl2ICAgICImIzg4MDE7Ij4gPCEtLSBpZGVudGljYWwgdG8sIFUrMjI2MSBJU090ZWNoIC0tPgotPCFFTlRJVFkgbGUgICAgICAgIiYjODgwNDsiPiA8IS0tIGxlc3MtdGhhbiBvciBlcXVhbCB0bywgVSsyMjY0IElTT3RlY2ggLS0+Ci08IUVOVElUWSBnZSAgICAgICAiJiM4ODA1OyI+IDwhLS0gZ3JlYXRlci10aGFuIG9yIGVxdWFsIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI2NSBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3ViICAgICAgIiYjODgzNDsiPiA8IS0tIHN1YnNldCBvZiwgVSsyMjgyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdXAgICAgICAiJiM4ODM1OyI+IDwhLS0gc3VwZXJzZXQgb2YsIFUrMjI4MyBJU090ZWNoIC0tPgotPCEtLSBub3RlIHRoYXQgbnN1cCwgJ25vdCBhIHN1cGVyc2V0IG9mLCBVKzIyODMnIGlzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBTeW1ib2wgCi0gICAgIGZvbnQgZW5jb2RpbmcgYW5kIGlzIG5vdCBpbmNsdWRlZC4gU2hvdWxkIGl0IGJlLCBmb3Igc3ltbWV0cnk/Ci0gICAgIEl0IGlzIGluIElTT2Ftc24gIC0tPiAKLTwhRU5USVRZIG5zdWIgICAgICImIzg4MzY7Ij4gPCEtLSBub3QgYSBzdWJzZXQgb2YsIFUrMjI4NCBJU09hbXNuIC0tPgotPCFFTlRJVFkgc3ViZSAgICAgIiYjODgzODsiPiA8IS0tIHN1YnNldCBvZiBvciBlcXVhbCB0bywgVSsyMjg2IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdXBlICAgICAiJiM4ODM5OyI+IDwhLS0gc3VwZXJzZXQgb2Ygb3IgZXF1YWwgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjg3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBvcGx1cyAgICAiJiM4ODUzOyI+IDwhLS0gY2lyY2xlZCBwbHVzID0gZGlyZWN0IHN1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyOTUgSVNPYW1zYiAtLT4KLTwhRU5USVRZIG90aW1lcyAgICImIzg4NTU7Ij4gPCEtLSBjaXJjbGVkIHRpbWVzID0gdmVjdG9yIHByb2R1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjk3IElTT2Ftc2IgLS0+Ci08IUVOVElUWSBwZXJwICAgICAiJiM4ODY5OyI+IDwhLS0gdXAgdGFjayA9IG9ydGhvZ29uYWwgdG8gPSBwZXJwZW5kaWN1bGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjJBNSBJU090ZWNoIC0tPgotPCFFTlRJVFkgc2RvdCAgICAgIiYjODkwMTsiPiA8IS0tIGRvdCBvcGVyYXRvciwgVSsyMkM1IElTT2Ftc2IgLS0+Ci08IS0tIGRvdCBvcGVyYXRvciBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDBCNyBtaWRkbGUgZG90IC0tPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgVGVjaG5pY2FsIC0tPgotPCFFTlRJVFkgbGNlaWwgICAgIiYjODk2ODsiPiA8IS0tIGxlZnQgY2VpbGluZyA9IGFwbCB1cHN0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMwOCBJU09hbXNjICAtLT4KLTwhRU5USVRZIHJjZWlsICAgICImIzg5Njk7Ij4gPCEtLSByaWdodCBjZWlsaW5nLCBVKzIzMDkgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSBsZmxvb3IgICAiJiM4OTcwOyI+IDwhLS0gbGVmdCBmbG9vciA9IGFwbCBkb3duc3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzBBIElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgcmZsb29yICAgIiYjODk3MTsiPiA8IS0tIHJpZ2h0IGZsb29yLCBVKzIzMEIgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSBsYW5nICAgICAiJiM5MDAxOyI+IDwhLS0gbGVmdC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0gYnJhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMyOSBJU090ZWNoIC0tPgotPCEtLSBsYW5nIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMDNDICdsZXNzIHRoYW4nIAotICAgICBvciBVKzIwMzkgJ3NpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrJyAtLT4KLTwhRU5USVRZIHJhbmcgICAgICImIzkwMDI7Ij4gPCEtLSByaWdodC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0ga2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMyQSBJU090ZWNoIC0tPgotPCEtLSByYW5nIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMDNFICdncmVhdGVyIHRoYW4nIAotICAgICBvciBVKzIwM0EgJ3NpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaycgLS0+Ci0KLTwhLS0gR2VvbWV0cmljIFNoYXBlcyAtLT4KLTwhRU5USVRZIGxveiAgICAgICImIzk2NzQ7Ij4gPCEtLSBsb3plbmdlLCBVKzI1Q0EgSVNPcHViIC0tPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgU3ltYm9scyAtLT4KLTwhRU5USVRZIHNwYWRlcyAgICImIzk4MjQ7Ij4gPCEtLSBibGFjayBzcGFkZSBzdWl0LCBVKzI2NjAgSVNPcHViIC0tPgotPCEtLSBibGFjayBoZXJlIHNlZW1zIHRvIG1lYW4gZmlsbGVkIGFzIG9wcG9zZWQgdG8gaG9sbG93IC0tPgotPCFFTlRJVFkgY2x1YnMgICAgIiYjOTgyNzsiPiA8IS0tIGJsYWNrIGNsdWIgc3VpdCA9IHNoYW1yb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjY2MyBJU09wdWIgLS0+Ci08IUVOVElUWSBoZWFydHMgICAiJiM5ODI5OyI+IDwhLS0gYmxhY2sgaGVhcnQgc3VpdCA9IHZhbGVudGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzI2NjUgSVNPcHViIC0tPgotPCFFTlRJVFkgZGlhbXMgICAgIiYjOTgzMDsiPiA8IS0tIGJsYWNrIGRpYW1vbmQgc3VpdCwgVSsyNjY2IElTT3B1YiAtLT4KLQotPCEtLSBTcGVjaWFsIGNoYXJhY3RlcnMgZm9yIEhUTUwgLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICAgICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zcGVjaWFsLmVudCI+Ci0gICAgICVIVE1Mc3BlY2lhbDsKLS0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBVbmljb2RlIG5hbWVzLiAKLS0tPgotCi08IS0tIEMwIENvbnRyb2xzIGFuZCBCYXNpYyBMYXRpbiAtLT4KLTwhRU5USVRZIHF1b3QgICAgIiYjMzQ7Ij4gPCEtLSAgcXVvdGF0aW9uIG1hcmsgPSBBUEwgcXVvdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwMjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgYW1wICAgICAiJiMzODsjMzg7Ij4gPCEtLSAgYW1wZXJzYW5kLCBVKzAwMjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgbHQgICAgICAiJiMzODsjNjA7Ij4gPCEtLSAgbGVzcy10aGFuIHNpZ24sIFUrMDAzQyBJU09udW0gLS0+Ci08IUVOVElUWSBndCAgICAgICImIzYyOyI+IDwhLS0gIGdyZWF0ZXItdGhhbiBzaWduLCBVKzAwM0UgSVNPbnVtIC0tPgotPCFFTlRJVFkgYXBvcwkgIiYjMzk7Ij4gPCEtLSAgYXBvc3Ryb3BoZSBtYXJrLCBVKzAwMjcgSVNPbnVtIC0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUEgLS0+Ci08IUVOVElUWSBPRWxpZyAgICImIzMzODsiPiA8IS0tICBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIE9FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTUyIElTT2xhdDIgLS0+Ci08IUVOVElUWSBvZWxpZyAgICImIzMzOTsiPiA8IS0tICBsYXRpbiBzbWFsbCBsaWdhdHVyZSBvZSwgVSswMTUzIElTT2xhdDIgLS0+Ci08IS0tIGxpZ2F0dXJlIGlzIGEgbWlzbm9tZXIsIHRoaXMgaXMgYSBzZXBhcmF0ZSBjaGFyYWN0ZXIgaW4gc29tZSBsYW5ndWFnZXMgLS0+Ci08IUVOVElUWSBTY2Fyb24gICImIzM1MjsiPiA8IS0tICBsYXRpbiBjYXBpdGFsIGxldHRlciBTIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjAgSVNPbGF0MiAtLT4KLTwhRU5USVRZIHNjYXJvbiAgIiYjMzUzOyI+IDwhLS0gIGxhdGluIHNtYWxsIGxldHRlciBzIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjEgSVNPbGF0MiAtLT4KLTwhRU5USVRZIFl1bWwgICAgIiYjMzc2OyI+IDwhLS0gIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNzggSVNPbGF0MiAtLT4KLQotPCEtLSBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMgLS0+Ci08IUVOVElUWSBjaXJjICAgICImIzcxMDsiPiA8IS0tICBtb2RpZmllciBsZXR0ZXIgY2lyY3VtZmxleCBhY2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAyQzYgSVNPcHViIC0tPgotPCFFTlRJVFkgdGlsZGUgICAiJiM3MzI7Ij4gPCEtLSAgc21hbGwgdGlsZGUsIFUrMDJEQyBJU09kaWEgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGVuc3AgICAgIiYjODE5NDsiPiA8IS0tIGVuIHNwYWNlLCBVKzIwMDIgSVNPcHViIC0tPgotPCFFTlRJVFkgZW1zcCAgICAiJiM4MTk1OyI+IDwhLS0gZW0gc3BhY2UsIFUrMjAwMyBJU09wdWIgLS0+Ci08IUVOVElUWSB0aGluc3AgICImIzgyMDE7Ij4gPCEtLSB0aGluIHNwYWNlLCBVKzIwMDkgSVNPcHViIC0tPgotPCFFTlRJVFkgenduaiAgICAiJiM4MjA0OyI+IDwhLS0gemVybyB3aWR0aCBub24tam9pbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDBDIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHp3aiAgICAgIiYjODIwNTsiPiA8IS0tIHplcm8gd2lkdGggam9pbmVyLCBVKzIwMEQgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbHJtICAgICAiJiM4MjA2OyI+IDwhLS0gbGVmdC10by1yaWdodCBtYXJrLCBVKzIwMEUgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgcmxtICAgICAiJiM4MjA3OyI+IDwhLS0gcmlnaHQtdG8tbGVmdCBtYXJrLCBVKzIwMEYgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbmRhc2ggICAiJiM4MjExOyI+IDwhLS0gZW4gZGFzaCwgVSsyMDEzIElTT3B1YiAtLT4KLTwhRU5USVRZIG1kYXNoICAgIiYjODIxMjsiPiA8IS0tIGVtIGRhc2gsIFUrMjAxNCBJU09wdWIgLS0+Ci08IUVOVElUWSBsc3F1byAgICImIzgyMTY7Ij4gPCEtLSBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxOCBJU09udW0gLS0+Ci08IUVOVElUWSByc3F1byAgICImIzgyMTc7Ij4gPCEtLSByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2JxdW8gICAiJiM4MjE4OyI+IDwhLS0gc2luZ2xlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUEgTkVXIC0tPgotPCFFTlRJVFkgbGRxdW8gICAiJiM4MjIwOyI+IDwhLS0gbGVmdCBkb3VibGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmRxdW8gICAiJiM4MjIxOyI+IDwhLS0gcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDFEIElTT251bSAtLT4KLTwhRU5USVRZIGJkcXVvICAgIiYjODIyMjsiPiA8IS0tIGRvdWJsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFFIE5FVyAtLT4KLTwhRU5USVRZIGRhZ2dlciAgIiYjODIyNDsiPiA8IS0tIGRhZ2dlciwgVSsyMDIwIElTT3B1YiAtLT4KLTwhRU5USVRZIERhZ2dlciAgIiYjODIyNTsiPiA8IS0tIGRvdWJsZSBkYWdnZXIsIFUrMjAyMSBJU09wdWIgLS0+Ci08IUVOVElUWSBwZXJtaWwgICImIzgyNDA7Ij4gPCEtLSBwZXIgbWlsbGUgc2lnbiwgVSsyMDMwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsc2FxdW8gICImIzgyNDk7Ij4gPCEtLSBzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzOSBJU08gcHJvcG9zZWQgLS0+Ci08IS0tIGxzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkIC0tPgotPCFFTlRJVFkgcnNhcXVvICAiJiM4MjUwOyI+IDwhLS0gc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDNBIElTTyBwcm9wb3NlZCAtLT4KLTwhLS0gcnNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSBldXJvICAgIiYjODM2NDsiPiA8IS0tICBldXJvIHNpZ24sIFUrMjBBQyBORVcgLS0+Ci0KLQotPCEtLSBlbmQgb2YgeGh0bWwtY2hhcmVudC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1mcmFtZXdvcmstMS5tb2QgLS0+Ci0KLQotPCFFTlRJVFkgJSBwcmUuY29udGVudAotICAgICAiKCAjUENEQVRBCi0gICAgICB8ICVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlQW5jaG9yLmNsYXNzOwotICAgICAgJUlubGluZS5leHRyYTsgKSoiCi0+Ci0KLTwhRU5USVRZICUgeGh0bWwtdGV4dC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFRleHQgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC10ZXh0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFRleHQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXRleHQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgVGV4dCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLXRleHQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVGV4dHVhbCBDb250ZW50Ci0KLSAgICAgVGhlIFRleHQgbW9kdWxlIGluY2x1ZGVzIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGNvcmUgCi0gICAgIHRleHQgY29udGFpbmVyIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzLgotLS0+Ci0KLTwhRU5USVRZICUgeGh0bWwtaW5sc3RydWN0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWlubHN0cnVjdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1pbmxzdHJ1Y3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWlubHN0cnVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbmxpbmUgU3RydWN0dXJhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1pbmxzdHJ1Y3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW5saW5lIFN0cnVjdHVyYWwKLQotICAgICAgICBiciwgc3BhbgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAKLSAgICAgdXNlZCB0byBzdXBwb3J0IGlubGluZS1sZXZlbCBzdHJ1Y3R1cmFsIG1hcmt1cC4KLS0tPgotCi08IS0tIGJyOiBmb3JjZWQgbGluZSBicmVhayAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBici5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJyLmVsZW1lbnQ7WwotCi08IUVOVElUWSAlIGJyLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBici5xbmFtZSAgImJyIiA+Ci08IUVMRU1FTlQgJWJyLnFuYW1lOyAgJWJyLmNvbnRlbnQ7ID4KLQotPCEtLSBlbmQgb2YgYnIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBici5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVici5xbmFtZTsKLSAgICAgICVDb3JlLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGJyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gc3BhbjogZ2VuZXJpYyBpbmxpbmUgY29udGFpbmVyIC4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHNwYW4uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzcGFuLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzcGFuLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3Bhbi5xbmFtZSAgInNwYW4iID4KLTwhRUxFTUVOVCAlc3Bhbi5xbmFtZTsgICVzcGFuLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNwYW4uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzcGFuLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3Bhbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3Bhbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc3Bhbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1pbmxwaHJhcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbmxwaHJhcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1pbmxwaHJhcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaW5scGhyYXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW5saW5lIFBocmFzYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW5scGhyYXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1pbmxwaHJhcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbmxpbmUgUGhyYXNhbAotCi0gICAgICAgIGFiYnIsIGFjcm9ueW0sIGNpdGUsIGNvZGUsIGRmbiwgZW0sIGtiZCwgcSwgc2FtcCwgc3Ryb25nLCB2YXIKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGlubGluZS1sZXZlbCBwaHJhc2FsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGFiYnIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhYmJyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhYmJyLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYWJici5xbmFtZSAgImFiYnIiID4KLTwhRUxFTUVOVCAlYWJici5xbmFtZTsgICVhYmJyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFiYnIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhYmJyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWJici5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWJici5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWJici5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGFjcm9ueW0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhY3JvbnltLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhY3JvbnltLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYWNyb255bS5xbmFtZSAgImFjcm9ueW0iID4KLTwhRUxFTUVOVCAlYWNyb255bS5xbmFtZTsgICVhY3JvbnltLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFjcm9ueW0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhY3JvbnltLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWNyb255bS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWNyb255bS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWNyb255bS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGNpdGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjaXRlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjaXRlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgY2l0ZS5xbmFtZSAgImNpdGUiID4KLTwhRUxFTUVOVCAlY2l0ZS5xbmFtZTsgICVjaXRlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNpdGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjaXRlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY2l0ZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY2l0ZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY2l0ZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGNvZGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjb2RlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjb2RlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgY29kZS5xbmFtZSAgImNvZGUiID4KLTwhRUxFTUVOVCAlY29kZS5xbmFtZTsgICVjb2RlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNvZGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjb2RlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY29kZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY29kZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY29kZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGRmbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRmbi5lbGVtZW50O1sKLTwhRU5USVRZICUgZGZuLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZGZuLnFuYW1lICAiZGZuIiA+Ci08IUVMRU1FTlQgJWRmbi5xbmFtZTsgICVkZm4uY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGZuLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGZuLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGZuLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkZm4ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRmbi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGVtLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZW0uZWxlbWVudDtbCi08IUVOVElUWSAlIGVtLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZW0ucW5hbWUgICJlbSIgPgotPCFFTEVNRU5UICVlbS5xbmFtZTsgICVlbS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBlbS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGVtLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZW0uYXR0bGlzdDtbCi08IUFUVExJU1QgJWVtLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBlbS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGtiZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWtiZC5lbGVtZW50O1sKLTwhRU5USVRZICUga2JkLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUga2JkLnFuYW1lICAia2JkIiA+Ci08IUVMRU1FTlQgJWtiZC5xbmFtZTsgICVrYmQuY29udGVudDsgPgotPCEtLSBlbmQgb2Yga2JkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUga2JkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsla2JkLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVrYmQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGtiZC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVxLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBxLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgcS5xbmFtZSAgInEiID4KLTwhRUxFTUVOVCAlcS5xbmFtZTsgICVxLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBxLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2l0ZSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgcS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHNhbXAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzYW1wLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzYW1wLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc2FtcC5xbmFtZSAgInNhbXAiID4KLTwhRUxFTUVOVCAlc2FtcC5xbmFtZTsgICVzYW1wLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNhbXAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzYW1wLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc2FtcC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc2FtcC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc2FtcC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHN0cm9uZy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN0cm9uZy5lbGVtZW50O1sKLTwhRU5USVRZICUgc3Ryb25nLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3Ryb25nLnFuYW1lICAic3Ryb25nIiA+Ci08IUVMRU1FTlQgJXN0cm9uZy5xbmFtZTsgICVzdHJvbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3Ryb25nLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3Ryb25nLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3Ryb25nLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzdHJvbmcucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHN0cm9uZy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHZhci5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXZhci5lbGVtZW50O1sKLTwhRU5USVRZICUgdmFyLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgdmFyLnFuYW1lICAidmFyIiA+Ci08IUVMRU1FTlQgJXZhci5xbmFtZTsgICV2YXIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdmFyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdmFyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldmFyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV2YXIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHZhci5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxwaHJhcy0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWJsa3N0cnVjdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ibGtzdHJ1Y3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYmxrc3RydWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJsa3N0cnVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCbG9jayBTdHJ1Y3R1cmFsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWJsa3N0cnVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCbG9jayBTdHJ1Y3R1cmFsCi0KLSAgICAgICAgZGl2LCBwCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBibG9jay1sZXZlbCBzdHJ1Y3R1cmFsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGRpdi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRpdi5lbGVtZW50O1sKLTwhRU5USVRZICUgZGl2LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGRpdi5xbmFtZSAgImRpdiIgPgotPCFFTEVNRU5UICVkaXYucW5hbWU7ICAlZGl2LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRpdi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRpdi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRpdi5hdHRsaXN0O1sKLTwhLS0gZW5kIG9mIGRpdi5hdHRsaXN0IC0tPl1dPgotPCFBVFRMSVNUICVkaXYucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLQotPCFFTlRJVFkgJSBwLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcC5lbGVtZW50O1sKLTwhRU5USVRZICUgcC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiID4KLTwhRU5USVRZICUgcC5xbmFtZSAgInAiID4KLTwhRUxFTUVOVCAlcC5xbmFtZTsgICVwLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgcC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ibGtwaHJhcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ibGtwaHJhcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ibGtwaHJhcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ibGtwaHJhcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCbG9jayBQaHJhc2FsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ibGtwaHJhcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtYmxrcGhyYXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmxvY2sgUGhyYXNhbAotCi0gICAgICAgIGFkZHJlc3MsIGJsb2NrcXVvdGUsIHByZSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgYmxvY2stbGV2ZWwgcGhyYXNhbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBhZGRyZXNzLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYWRkcmVzcy5lbGVtZW50O1sKLTwhRU5USVRZICUgYWRkcmVzcy5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiID4KLTwhRU5USVRZICUgYWRkcmVzcy5xbmFtZSAgImFkZHJlc3MiID4KLTwhRUxFTUVOVCAlYWRkcmVzcy5xbmFtZTsgICVhZGRyZXNzLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFkZHJlc3MuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhZGRyZXNzLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWRkcmVzcy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWRkcmVzcy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWRkcmVzcy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGJsb2NrcXVvdGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVibG9ja3F1b3RlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBibG9ja3F1b3RlLmNvbnRlbnQKLSAgICAgIiggJUJsb2NrLm1peDsgKSsiCi0+Ci08IUVOVElUWSAlIGJsb2NrcXVvdGUucW5hbWUgICJibG9ja3F1b3RlIiA+Ci08IUVMRU1FTlQgJWJsb2NrcXVvdGUucW5hbWU7ICAlYmxvY2txdW90ZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBibG9ja3F1b3RlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmxvY2txdW90ZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJsb2NrcXVvdGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJsb2NrcXVvdGUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGNpdGUgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGJsb2NrcXVvdGUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwcmUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVwcmUuZWxlbWVudDtbCi08IUVOVElUWSAlIHByZS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgCi0gICAgICB8ICVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICB8ICV0dC5xbmFtZTsgfCAlaS5xbmFtZTsgfCAlYi5xbmFtZTsKLSAgICAgICVJMThuLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgIHwgJXNjcmlwdC5xbmFtZTsgfCAlbWFwLnFuYW1lOwotICAgICAgJUlubGluZS5leHRyYTsgKSoiCi0+Ci08IUVOVElUWSAlIHByZS5xbmFtZSAgInByZSIgPgotPCFFTEVNRU5UICVwcmUucW5hbWU7ICAlcHJlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHByZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHByZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXByZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcHJlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICB4bWw6c3BhY2UgICAgKCBwcmVzZXJ2ZSApICAgICAgICAgICAgICNGSVhFRCAncHJlc2VydmUnCi0+Ci08IS0tIGVuZCBvZiBwcmUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uICBIZWFkaW5nIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIEhlYWRpbmcuY29udGVudCAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIgPgotCi08IUVOVElUWSAlIGgxLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDEuZWxlbWVudDtbCi08IUVOVElUWSAlIGgxLnFuYW1lICAiaDEiID4KLTwhRUxFTUVOVCAlaDEucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoMS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGgxLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDEuYXR0bGlzdDtbCi08IUFUVExJU1QgJWgxLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoMS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGgyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDIuZWxlbWVudDtbCi08IUVOVElUWSAlIGgyLnFuYW1lICAiaDIiID4KLTwhRUxFTUVOVCAlaDIucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoMi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGgyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWgyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoMi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGgzLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDMuZWxlbWVudDtbCi08IUVOVElUWSAlIGgzLnFuYW1lICAiaDMiID4KLTwhRUxFTUVOVCAlaDMucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoMy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGgzLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDMuYXR0bGlzdDtbCi08IUFUVExJU1QgJWgzLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoMy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGg0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDQuZWxlbWVudDtbCi08IUVOVElUWSAlIGg0LnFuYW1lICAiaDQiID4KLTwhRUxFTUVOVCAlaDQucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoNC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGg0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWg0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoNC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGg1LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDUuZWxlbWVudDtbCi08IUVOVElUWSAlIGg1LnFuYW1lICAiaDUiID4KLTwhRUxFTUVOVCAlaDUucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoNS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGg1LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWg1LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoNS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGg2LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDYuZWxlbWVudDtbCi08IUVOVElUWSAlIGg2LnFuYW1lICAiaDYiID4KLTwhRUxFTUVOVCAlaDYucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoNi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGg2LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDYuYXR0bGlzdDtbCi08IUFUVExJU1QgJWg2LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoNi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ibGtwaHJhcy0xLm1vZCAtLT4KLV1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC10ZXh0LTEubW9kIC0tPgotCi0KLTwhRU5USVRZICUgeGh0bWwtaHlwZXJ0ZXh0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSHlwZXJ0ZXh0IDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaHlwZXJ0ZXh0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEh5cGVydGV4dCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWh5cGVydGV4dC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBIeXBlcnRleHQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1oeXBlcnRleHQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSHlwZXJ0ZXh0Ci0KLSAgICAgICAgYQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBhbmNob3IgKCdhJykgZWxlbWVudCB0eXBlLCB3aGljaAotICAgICBkZWZpbmVzIHRoZSBzb3VyY2Ugb2YgYSBoeXBlcnRleHQgbGluay4gVGhlIGRlc3RpbmF0aW9uCi0gICAgIChvciBsaW5rICd0YXJnZXQnKSBpcyBpZGVudGlmaWVkIHZpYSBpdHMgJ2lkJyBhdHRyaWJ1dGUgCi0gICAgIHJhdGhlciB0aGFuIHRoZSAnbmFtZScgYXR0cmlidXRlIGFzIHdhcyB1c2VkIGluIEhUTUwuCi0tLT4KLQotPCEtLSAuLi4uLi4uLi4uLi4gIEFuY2hvciBFbGVtZW50ICAuLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWEuZWxlbWVudDtbCi08IUVOVElUWSAlIGEuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubE5vQW5jaG9yLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGEucW5hbWUgICJhIiA+Ci08IUVMRU1FTlQgJWEucW5hbWU7ICAlYS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBhLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWEuYXR0bGlzdDtbCi08IUFUVExJU1QgJWEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGhyZWYgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNoYXJzZXQgICAgICAlQ2hhcnNldC5kYXRhdHlwZTsgICAgICAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIGhyZWZsYW5nICAgICAlTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlOyAgI0lNUExJRUQKLSAgICAgIHJlbCAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIHJldiAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGEuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaHlwZXJ0ZXh0LTEubW9kIC0tPgotCi0KLTwhRU5USVRZICUgeGh0bWwtbGlzdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpc3RzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtbGlzdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBMaXN0cyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1saXN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpc3RzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtbGlzdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBMaXN0cwotCi0gICAgICAgIGRsLCBkdCwgZGQsIG9sLCB1bCwgbGkKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgbGlzdC1vcmllbnRlZCBlbGVtZW50IHR5cGVzCi0gICAgIGFuZCB0aGVpciBhdHRyaWJ1dGVzLgotLS0+Ci0KLTwhRU5USVRZICUgZGwucW5hbWUgICJkbCIgPgotPCFFTlRJVFkgJSBkdC5xbmFtZSAgImR0IiA+Ci08IUVOVElUWSAlIGRkLnFuYW1lICAiZGQiID4KLTwhRU5USVRZICUgb2wucW5hbWUgICJvbCIgPgotPCFFTlRJVFkgJSB1bC5xbmFtZSAgInVsIiA+Ci08IUVOVElUWSAlIGxpLnFuYW1lICAibGkiID4KLQotPCEtLSBkbDogRGVmaW5pdGlvbiBMaXN0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZGwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkbC5lbGVtZW50O1sKLTwhRU5USVRZICUgZGwuY29udGVudCAgIiggJWR0LnFuYW1lOyB8ICVkZC5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAlZGwucW5hbWU7ICAlZGwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBkdDogRGVmaW5pdGlvbiBUZXJtIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZHQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkdC5lbGVtZW50O1sKLTwhRU5USVRZICUgZHQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICVkdC5xbmFtZTsgICVkdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGR0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZHQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWR0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGRkOiBEZWZpbml0aW9uIERlc2NyaXB0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBkZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkZC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTEVNRU5UICVkZC5xbmFtZTsgICVkZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWRkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG9sOiBPcmRlcmVkIExpc3QgKG51bWJlcmVkIHN0eWxlcykgLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW9sLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvbC5jb250ZW50ICAiKCAlbGkucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJW9sLnFuYW1lOyAgJW9sLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG9sLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb2wuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVvbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlb2wucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIG9sLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdWw6IFVub3JkZXJlZCBMaXN0IChidWxsZXQgc3R5bGVzKSAuLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHVsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldWwuZWxlbWVudDtbCi08IUVOVElUWSAlIHVsLmNvbnRlbnQgICIoICVsaS5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAldWwucW5hbWU7ICAldWwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdWwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB1bC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXVsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV1bC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBsaTogTGlzdCBJdGVtIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbGkuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVsaS5lbGVtZW50O1sKLTwhRU5USVRZICUgbGkuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlbGkucW5hbWU7ICAlbGkuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbGkuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsaS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWxpLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVsaS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgbGkuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbGlzdC0xLm1vZCAtLT4KLQotCi08IS0tIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IC0tPgotCi08IS0tIEltYWdlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWltYWdlLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWltYWdlLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWltYWdlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW1hZ2VzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaW1hZ2UtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW1hZ2VzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW1hZ2UtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJvdmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW1hZ2VzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtaW1hZ2UtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW1hZ2VzCi0KLSAgICAgICAgaW1nCi0KLSAgICAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgbWFya3VwIHRvIHN1cHBvcnQgYmFzaWMgaW1hZ2UgZW1iZWRkaW5nLgotLS0+Ci0KLTwhLS0gVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0ZXh0LW9ubHkgVUFzIGFzIHdlbGwgYXMgdG8gbWFrZQotICAgICBpbWFnZSBjb250ZW50IHVuZGVyc3RhbmRhYmxlIGFuZCBuYXZpZ2FibGUgdG8gdXNlcnMgb2YKLSAgICAgbm9uLXZpc3VhbCBVQXMsIHlvdSBuZWVkIHRvIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB3aXRoCi0gICAgIHRoZSAnYWx0JyBhdHRyaWJ1dGUsIGFuZCBhdm9pZCBzZXJ2ZXItc2lkZSBpbWFnZSBtYXBzLgotLS0+Ci0KLTwhRU5USVRZICUgaW1nLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaW1nLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBpbWcuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGltZy5xbmFtZSAgImltZyIgPgotPCFFTEVNRU5UICVpbWcucW5hbWU7ICAlaW1nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGltZy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGltZy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWltZy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaW1nLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBzcmMgICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgYWx0ICAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIGxvbmdkZXNjICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlaWdodCAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIHdpZHRoICAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGltZy5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbWFnZS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFRhYmxlcyBNb2R1bGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXRhYmxlLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXRhYmxlLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXRhYmxlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzaWMgVGFibGVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYmFzaWMtdGFibGUtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJhc2ljIFRhYmxlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNpYy10YWJsZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwgQmFzaWMsIGEgcHJvcGVyIHN1YnNldCBvZiBYSFRNTC4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2ljIFRhYmxlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWJhc2ljLXRhYmxlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJhc2ljIFRhYmxlcwotCi0gICAgICAgIHRhYmxlLCBjYXB0aW9uLCB0ciwgdGgsIHRkCi0KLSAgICAgVGhpcyB0YWJsZSBtb2R1bGUgZGVjbGFyZXMgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZGVmaW5pbmcKLSAgICAgYSB0YWJsZSBtb2RlbCBiYXNlZCBmdW5kYW1lbnRhbGx5IG9uIGZlYXR1cmVzIGZvdW5kIGluIHRoZQotICAgICB3aWRlbHktZGVwbG95ZWQgSFRNTCAzLjIgdGFibGUgbW9kZWwuICBXaGlsZSB0aGlzIG1vZHVsZQotICAgICBtaW1pY3MgdGhlIGNvbnRlbnQgbW9kZWwgYW5kIHRhYmxlIGF0dHJpYnV0ZXMgb2YgSFRNTCAzLjIKLSAgICAgdGFibGVzLCB0aGUgZWxlbWVudCB0eXBlcyBkZWNsYXJlZCBoZXJlaW4gYWxzbyBpbmNsdWRlcyBhbGwKLSAgICAgSFRNTCA0IGNvbW1vbiBhbmQgbW9zdCBvZiB0aGUgSFRNTCA0IHRhYmxlIGF0dHJpYnV0ZXMuCi0tLT4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBlbGVtZW50IHR5cGUgbmFtZXM6Ci0tLT4KLTwhRU5USVRZICUgdGFibGUucW5hbWUgICJ0YWJsZSIgPgotPCFFTlRJVFkgJSBjYXB0aW9uLnFuYW1lICAiY2FwdGlvbiIgPgotPCFFTlRJVFkgJSB0ci5xbmFtZSAgInRyIiA+Ci08IUVOVElUWSAlIHRoLnFuYW1lICAidGgiID4KLTwhRU5USVRZICUgdGQucW5hbWUgICJ0ZCIgPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMKLS0tPgotPCFFTlRJVFkgJSBDZWxsSEFsaWduLmF0dHJpYgotICAgICAiYWxpZ24gICAgICAgICggbGVmdAotICAgICAgICAgICAgICAgICAgIHwgY2VudGVyCi0gICAgICAgICAgICAgICAgICAgfCByaWdodCApICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIHZlcnRpY2FsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzCi0tLT4KLTwhRU5USVRZICUgQ2VsbFZBbGlnbi5hdHRyaWIKLSAgICAgInZhbGlnbiAgICAgICAoIHRvcAotICAgICAgICAgICAgICAgICAgIHwgbWlkZGxlCi0gICAgICAgICAgICAgICAgICAgfCBib3R0b20gKSAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIHNjb3BlIGlzIHNpbXBsZXIgdGhhbiBheGVzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcwotLS0+Ci08IUVOVElUWSAlIHNjb3BlLmF0dHJpYgotICAgICAic2NvcGUgICAgICAgICggcm93IHwgY29sICApICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSB0YWJsZTogVGFibGUgRWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdGFibGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0YWJsZS5lbGVtZW50O1sKLTwhRU5USVRZICUgdGFibGUuY29udGVudAotICAgICAiKCAlY2FwdGlvbi5xbmFtZTs/LCAldHIucW5hbWU7KyApIgotPgotPCFFTEVNRU5UICV0YWJsZS5xbmFtZTsgICV0YWJsZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0YWJsZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRhYmxlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGFibGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRhYmxlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBzdW1tYXJ5ICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiB0YWJsZS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGNhcHRpb246IFRhYmxlIENhcHRpb24gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBjYXB0aW9uLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslY2FwdGlvbi5lbGVtZW50O1sKLTwhRU5USVRZICUgY2FwdGlvbi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWNhcHRpb24ucW5hbWU7ICAlY2FwdGlvbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBjYXB0aW9uLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgY2FwdGlvbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWNhcHRpb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJWNhcHRpb24ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGNhcHRpb24uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0cjogVGFibGUgUm93IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdHIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0ci5lbGVtZW50O1sKLTwhRU5USVRZICUgdHIuY29udGVudCAgIiggJXRoLnFuYW1lOyB8ICV0ZC5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAldHIucW5hbWU7ICAldHIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdHIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0ci5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0ci5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdHIuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0aDogVGFibGUgSGVhZGVyIENlbGwgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gdGggaXMgZm9yIGhlYWRlciBjZWxscywgdGQgZm9yIGRhdGEsCi0gICAgIGJ1dCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggdXNlIHRkCi0tLT4KLQotPCFFTlRJVFkgJSB0aC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRoLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0aC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvd05vVGFibGUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAldGgucW5hbWU7ICAldGguY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGguZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0aC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRoLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0aC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgYWJiciAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgYXhpcyAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVhZGVycyAgICAgIElEUkVGUyAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgJXNjb3BlLmF0dHJpYjsKLSAgICAgIHJvd3NwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICBjb2xzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdGguYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0ZDogVGFibGUgRGF0YSBDZWxsIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdGQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0ZC5lbGVtZW50O1sKLTwhRU5USVRZICUgdGQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3dOb1RhYmxlLm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJXRkLnFuYW1lOyAgJXRkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0ZC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGFiYnIgICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGF4aXMgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlYWRlcnMgICAgICBJRFJFRlMgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICVzY29wZS5hdHRyaWI7Ci0gICAgICByb3dzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgY29sc3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJhc2ljLXRhYmxlLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gRm9ybXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtZm9ybS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1mb3JtLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWZvcm0ubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNpYyBGb3JtcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJhc2ljLWZvcm0tMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgU2ltcGxpZmllZCBGb3JtcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmFzaWMtZm9ybS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwgQmFzaWMsIGEgcHJvcGVyIHN1YnNldCBvZiBYSFRNTC4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2ljIEZvcm1zIDEuMC8vRU4iICAKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1iYXNpYy1mb3JtLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJhc2ljIEZvcm1zCi0KLSAgICAgVGhpcyBmb3JtcyBtb2R1bGUgaXMgYmFzZWQgb24gdGhlIEhUTUwgMy4yIGZvcm1zIG1vZGVsLCB3aXRoCi0gICAgIHRoZSBXQUktcmVxdWVzdGVkIGFkZGl0aW9uIG9mIHRoZSBsYWJlbCBlbGVtZW50LiBXaGlsZSB0aGlzIAotICAgICBtb2R1bGUgZXNzZW50aWFsbHkgbWltaWNzIHRoZSBjb250ZW50IG1vZGVsIGFuZCBhdHRyaWJ1dGVzIG9mIAotICAgICBIVE1MIDMuMiBmb3JtcywgdGhlIGVsZW1lbnQgdHlwZXMgZGVjbGFyZWQgaGVyZWluIGFsc28gaW5jbHVkZQotICAgICBhbGwgSFRNTCA0IGNvbW1vbiBhdHRyaWJ1dGVzLgotCi0gICAgICAgIGZvcm0sIGxhYmVsLCBpbnB1dCwgc2VsZWN0LCBvcHRpb24sIHRleHRhcmVhCi0tLT4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBlbGVtZW50IHR5cGUgbmFtZXM6Ci0tLT4KLTwhRU5USVRZICUgZm9ybS5xbmFtZSAgImZvcm0iID4KLTwhRU5USVRZICUgbGFiZWwucW5hbWUgICJsYWJlbCIgPgotPCFFTlRJVFkgJSBpbnB1dC5xbmFtZSAgImlucHV0IiA+Ci08IUVOVElUWSAlIHNlbGVjdC5xbmFtZSAgInNlbGVjdCIgPgotPCFFTlRJVFkgJSBvcHRpb24ucW5hbWUgICJvcHRpb24iID4KLTwhRU5USVRZICUgdGV4dGFyZWEucW5hbWUgICJ0ZXh0YXJlYSIgPgotCi08IS0tICVCbGtOb0Zvcm0ubWl4OyBpbmNsdWRlcyBhbGwgbm9uLWZvcm0gYmxvY2sgZWxlbWVudHMsCi0gICAgIHBsdXMgJU1pc2MuY2xhc3M7Ci0tLT4KLTwhRU5USVRZICUgQmxrTm9Gb3JtLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxrU3RydWN0LmNsYXNzOwotICAgICAgJUJsa1BocmFzLmNsYXNzOwotICAgICAgJUJsa1ByZXMuY2xhc3M7Ci0gICAgICB8ICV0YWJsZS5xbmFtZTsgCi0gICAgICAlQmxvY2suZXh0cmE7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gZm9ybTogRm9ybSBFbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGZvcm0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVmb3JtLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBmb3JtLmNvbnRlbnQKLSAgICAgIiggJUJsa05vRm9ybS5taXg7ICkrIgotPgotPCFFTEVNRU5UICVmb3JtLnFuYW1lOyAgJWZvcm0uY29udGVudDsgPgotPCEtLSBlbmQgb2YgZm9ybS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGZvcm0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVmb3JtLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVmb3JtLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhY3Rpb24gICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgbWV0aG9kICAgICAgICggZ2V0IHwgcG9zdCApICAgICAgICAgICAnZ2V0JwotICAgICAgZW5jdHlwZSAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJwotPgotPCEtLSBlbmQgb2YgZm9ybS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGxhYmVsOiBGb3JtIEZpZWxkIExhYmVsIFRleHQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBsYWJlbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxhYmVsLmVsZW1lbnQ7WwotPCEtLSBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZAotLS0+Ci08IUVOVElUWSAlIGxhYmVsLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSAKLSAgICAgIHwgJWlucHV0LnFuYW1lOyB8ICVzZWxlY3QucW5hbWU7IHwgJXRleHRhcmVhLnFuYW1lOwotICAgICAgfCAlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUkxOG4uY2xhc3M7Ci0gICAgICAlSW5sUHJlcy5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7ICkqIgotPgotPCFFTEVNRU5UICVsYWJlbC5xbmFtZTsgICVsYWJlbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBsYWJlbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGxhYmVsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbGFiZWwuYXR0bGlzdDtbCi08IUFUVExJU1QgJWxhYmVsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBmb3IgICAgICAgICAgSURSRUYgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBsYWJlbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGlucHV0OiBGb3JtIENvbnRyb2wgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBpbnB1dC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWlucHV0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBpbnB1dC5jb250ZW50ICAiRU1QVFkiID4KLTwhRUxFTUVOVCAlaW5wdXQucW5hbWU7ICAlaW5wdXQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaW5wdXQuZWxlbWVudCAtLT5dXT4KLQotPCEtLSBCYXNpYyBGb3JtcyByZW1vdmVzICdpbWFnZScgYW5kICdmaWxlJyBpbnB1dCB0eXBlcy4KLS0tPgotPCFFTlRJVFkgJSBpbnB1dC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWlucHV0LmF0dGxpc3Q7WwotPCFFTlRJVFkgJSBJbnB1dFR5cGUuY2xhc3MKLSAgICAgIiggdGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfCByYWRpbyAKLSAgICAgIHwgc3VibWl0IHwgcmVzZXQgfCBoaWRkZW4gKSIKLT4KLTwhLS0gYXR0cmlidXRlIG5hbWUgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0ICYgcmVzZXQKLS0tPgotPCFBVFRMSVNUICVpbnB1dC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgdHlwZSAgICAgICAgICVJbnB1dFR5cGUuY2xhc3M7ICAgICAgICAndGV4dCcKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHZhbHVlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNoZWNrZWQgICAgICAoIGNoZWNrZWQgKSAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHNpemUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIG1heGxlbmd0aCAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIHNyYyAgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGlucHV0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gc2VsZWN0OiBPcHRpb24gU2VsZWN0b3IgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHNlbGVjdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNlbGVjdC5lbGVtZW50O1sKLTwhRU5USVRZICUgc2VsZWN0LmNvbnRlbnQgICIoICVvcHRpb24ucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXNlbGVjdC5xbmFtZTsgICVzZWxlY3QuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc2VsZWN0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc2VsZWN0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc2VsZWN0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzZWxlY3QucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHNpemUgICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG11bHRpcGxlICAgICAoIG11bHRpcGxlICkgICAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHNlbGVjdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG9wdGlvbjogU2VsZWN0YWJsZSBDaG9pY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvcHRpb24uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvcHRpb24uZWxlbWVudDtbCi08IUVOVElUWSAlIG9wdGlvbi5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRUxFTUVOVCAlb3B0aW9uLnFuYW1lOyAgJW9wdGlvbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBvcHRpb24uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBvcHRpb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVvcHRpb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJW9wdGlvbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc2VsZWN0ZWQgICAgICggc2VsZWN0ZWQgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdmFsdWUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2Ygb3B0aW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGV4dGFyZWE6IE11bHRpLUxpbmUgVGV4dCBGaWVsZCAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRleHRhcmVhLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGV4dGFyZWEuZWxlbWVudDtbCi08IUVOVElUWSAlIHRleHRhcmVhLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTEVNRU5UICV0ZXh0YXJlYS5xbmFtZTsgICV0ZXh0YXJlYS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0ZXh0YXJlYS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRleHRhcmVhLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGV4dGFyZWEuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRleHRhcmVhLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICByb3dzICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNSRVFVSVJFRAotICAgICAgY29scyAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjUkVRVUlSRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHRleHRhcmVhLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJhc2ljLWZvcm0tMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBMaW5rIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1saW5rLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWxpbmsubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtbGluay5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpbmsgRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWxpbmstMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTGluayBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbGluay0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMaW5rIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1saW5rLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIExpbmsgZWxlbWVudAotCi0gICAgICAgIGxpbmsKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgbGluayBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLAotICAgICB3aGljaCBjb3VsZCAoaW4gcHJpbmNpcGxlKSBiZSB1c2VkIHRvIGRlZmluZSBkb2N1bWVudC1sZXZlbCBsaW5rcwotICAgICB0byBleHRlcm5hbCByZXNvdXJjZXMgc3VjaCBhczoKLQotICAgICBhKSBmb3IgZG9jdW1lbnQgc3BlY2lmaWMgdG9vbGJhcnMvbWVudXMsIGUuZy4gc3RhcnQsIGNvbnRlbnRzLAotICAgICAgICBwcmV2aW91cywgbmV4dCwgaW5kZXgsIGVuZCwgaGVscAotICAgICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQgKHJlbD0ic3R5bGVzaGVldCIpCi0gICAgIGMpIHRvIG1ha2UgYSBsaW5rIHRvIGEgc2NyaXB0IChyZWw9InNjcmlwdCIpCi0gICAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mIGh0bWwgbm9kZXMgYXJlCi0gICAgICAgIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgICAgZSkgdG8gbWFrZSBhIGxpbmsgdG8gYSBwcmludGFibGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICAgIGUuZy4gYSBwb3N0c2NyaXB0IG9yIHBkZiB2ZXJzaW9uIChyZWw9ImFsdGVybmF0ZSIgbWVkaWE9InByaW50IikKLS0tPgotCi08IS0tIGxpbms6IE1lZGlhLUluZGVwZW5kZW50IExpbmsgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBsaW5rLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbGluay5lbGVtZW50O1sKLTwhRU5USVRZICUgbGluay5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgbGluay5xbmFtZSAgImxpbmsiID4KLTwhRUxFTUVOVCAlbGluay5xbmFtZTsgICVsaW5rLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGxpbmsuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsaW5rLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbGluay5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbGluay5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2hhcnNldCAgICAgICVDaGFyc2V0LmRhdGF0eXBlOyAgICAgICAjSU1QTElFRAotICAgICAgaHJlZiAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgaHJlZmxhbmcgICAgICVMYW5ndWFnZUNvZGUuZGF0YXR5cGU7ICAjSU1QTElFRAotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgcmVsICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgcmV2ICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgbWVkaWEgICAgICAgICVNZWRpYURlc2MuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgbGluay5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1saW5rLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gRG9jdW1lbnQgTWV0YWluZm9ybWF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtbWV0YS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1tZXRhLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLW1ldGEubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBNZXRhaW5mb3JtYXRpb24gMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1tZXRhLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIERvY3VtZW50IE1ldGFpbmZvcm1hdGlvbiBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLW1ldGEtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTWV0YWluZm9ybWF0aW9uIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtbWV0YS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBNZXRhIEluZm9ybWF0aW9uCi0KLSAgICAgICAgbWV0YQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBtZXRhIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHVzZWQgdG8gcHJvdmlkZSBkZWNsYXJhdGl2ZSBkb2N1bWVudCBtZXRhaW5mb3JtYXRpb24uCi0tLT4KLQotPCEtLSBtZXRhOiBHZW5lcmljIE1ldGFpbmZvcm1hdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbWV0YS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW1ldGEuZWxlbWVudDtbCi08IUVOVElUWSAlIG1ldGEuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIG1ldGEucW5hbWUgICJtZXRhIiA+Ci08IUVMRU1FTlQgJW1ldGEucW5hbWU7ICAlbWV0YS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBtZXRhLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbWV0YS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW1ldGEuYXR0bGlzdDtbCi08IUFUVExJU1QgJW1ldGEucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgaHR0cC1lcXVpdiAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgbmFtZSAgICAgICAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgY29udGVudCAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIHNjaGVtZSAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIG1ldGEuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbWV0YS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIEJhc2UgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWJhc2UubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYmFzZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1iYXNlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzZSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYmFzZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCYXNlIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2UgRWxlbWVudCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWJhc2UtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmFzZSBlbGVtZW50Ci0KLSAgICAgICAgYmFzZQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBiYXNlIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHVzZWQgdG8gZGVmaW5lIGEgYmFzZSBVUkkgYWdhaW5zdCB3aGljaCByZWxhdGl2ZSBVUklzIGluIHRoZQotICAgICBkb2N1bWVudCB3aWxsIGJlIHJlc29sdmVkLgotCi0gICAgIE5vdGUgdGhhdCB0aGlzIG1vZHVsZSBhbHNvIHJlZGVjbGFyZXMgdGhlIGNvbnRlbnQgbW9kZWwgZm9yCi0gICAgIHRoZSBoZWFkIGVsZW1lbnQgdG8gaW5jbHVkZSB0aGUgYmFzZSBlbGVtZW50LgotLS0+Ci0KLTwhLS0gYmFzZTogRG9jdW1lbnQgQmFzZSBVUkkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJhc2UuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyViYXNlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBiYXNlLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBiYXNlLnFuYW1lICAiYmFzZSIgPgotPCFFTEVNRU5UICViYXNlLnFuYW1lOyAgJWJhc2UuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYmFzZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJhc2UuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyViYXNlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICViYXNlLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgIGhyZWYgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI1JFUVVJUkVECi0+Ci08IS0tIGVuZCBvZiBiYXNlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaGVhZC5jb250ZW50Ci0gICAgIiggJUhlYWRPcHRzLm1peDssCi0gICAgICggKCAldGl0bGUucW5hbWU7LCAlSGVhZE9wdHMubWl4OywgKCAlYmFzZS5xbmFtZTssICVIZWFkT3B0cy5taXg7ICk/ICkKLSAgICAgfCAoICViYXNlLnFuYW1lOywgJUhlYWRPcHRzLm1peDssICggJXRpdGxlLnFuYW1lOywgJUhlYWRPcHRzLm1peDsgKSkpKSIKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmFzZS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFBhcmFtIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXBhcmFtLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXBhcmFtLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXBhcmFtLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgUGFyYW0gRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLXBhcmFtLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFBhcmFtIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1wYXJhbS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBQYXJhbSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtcGFyYW0tMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gUGFyYW1ldGVycyBmb3IgSmF2YSBBcHBsZXRzIGFuZCBFbWJlZGRlZCBPYmplY3RzCi0KLSAgICAgICAgcGFyYW0KLQotICAgICBUaGlzIG1vZHVsZSBwcm92aWRlcyBkZWNsYXJhdGlvbnMgZm9yIHRoZSBwYXJhbSBlbGVtZW50LCAKLSAgICAgdXNlZCB0byBwcm92aWRlIG5hbWVkIHByb3BlcnR5IHZhbHVlcyBmb3IgdGhlIGFwcGxldAotICAgICBhbmQgb2JqZWN0IGVsZW1lbnRzLiAKLS0tPgotCi08IS0tIHBhcmFtOiBOYW1lZCBQcm9wZXJ0eSBWYWx1ZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBwYXJhbS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXBhcmFtLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBwYXJhbS5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgcGFyYW0ucW5hbWUgICJwYXJhbSIgPgotPCFFTEVNRU5UICVwYXJhbS5xbmFtZTsgICVwYXJhbS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBwYXJhbS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHBhcmFtLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcGFyYW0uYXR0bGlzdDtbCi08IUFUVExJU1QgJXBhcmFtLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsgCi0gICAgICAlaWQuYXR0cmliOwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIHZhbHVlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHZhbHVldHlwZSAgICAoIGRhdGEgfCByZWYgfCBvYmplY3QgKSAgJ2RhdGEnCi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBwYXJhbS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1wYXJhbS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIEVtYmVkZGVkIE9iamVjdCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLW9iamVjdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1vYmplY3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtb2JqZWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRW1iZWRkZWQgT2JqZWN0IDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtb2JqZWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEVtYmVkZGVkIE9iamVjdCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLW9iamVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBFbWJlZGRlZCBPYmplY3QgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1vYmplY3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRW1iZWRkZWQgT2JqZWN0cwotCi0gICAgICAgIG9iamVjdAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBvYmplY3QgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgdXNlZCB0byBlbWJlZCBleHRlcm5hbCBvYmplY3RzIGFzIHBhcnQgb2YgWEhUTUwgcGFnZXMuIEluIHRoZQotICAgICBkb2N1bWVudCwgcGxhY2UgcGFyYW0gZWxlbWVudHMgcHJpb3IgdG8gdGhlIG9iamVjdCBlbGVtZW50cyAKLSAgICAgdGhhdCByZXF1aXJlIHRoZWlyIGNvbnRlbnQuCi0KLSAgICAgTm90ZSB0aGF0IHVzZSBvZiB0aGlzIG1vZHVsZSByZXF1aXJlcyBpbnN0YW50aWF0aW9uIG9mIHRoZSAKLSAgICAgUGFyYW0gRWxlbWVudCBNb2R1bGUgcHJpb3IgdG8gdGhpcyBtb2R1bGUuCi0tLT4KLQotPCEtLSBvYmplY3Q6IEdlbmVyaWMgRW1iZWRkZWQgT2JqZWN0IC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgb2JqZWN0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslb2JqZWN0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvYmplY3QuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyB8ICVwYXJhbS5xbmFtZTsgKSoiCi0+Ci08IUVOVElUWSAlIG9iamVjdC5xbmFtZSAgIm9iamVjdCIgPgotPCFFTEVNRU5UICVvYmplY3QucW5hbWU7ICAlb2JqZWN0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG9iamVjdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG9iamVjdC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW9iamVjdC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlb2JqZWN0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBkZWNsYXJlICAgICAgKCBkZWNsYXJlICkgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjbGFzc2lkICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjb2RlYmFzZSAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBkYXRhICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICBjb2RldHlwZSAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICBhcmNoaXZlICAgICAgJVVSSXMuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBzdGFuZGJ5ICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWlnaHQgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICB3aWR0aCAgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBvYmplY3QuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtb2JqZWN0LTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtc3RydWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRG9jdW1lbnQgU3RydWN0dXJlIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtc3RydWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFN0cnVjdHVyZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXN0cnVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBEb2N1bWVudCBTdHJ1Y3R1cmUgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1zdHJ1Y3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRG9jdW1lbnQgU3RydWN0dXJlCi0KLSAgICAgICAgdGl0bGUsIGhlYWQsIGJvZHksIGh0bWwKLQotICAgICBUaGUgU3RydWN0dXJlIE1vZHVsZSBkZWZpbmVzIHRoZSBtYWpvciBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFuZCAKLSAgICAgdGhlaXIgYXR0cmlidXRlcy4KLQotICAgICBOb3RlIHRoYXQgdGhlIGNvbnRlbnQgbW9kZWwgb2YgdGhlIGhlYWQgZWxlbWVudCB0eXBlIGlzIHJlZGVjbGFyZWQgCi0gICAgIHdoZW4gdGhlIEJhc2UgTW9kdWxlIGlzIGluY2x1ZGVkIGluIHRoZSBEVEQuCi0KLSAgICAgVGhlIHBhcmFtZXRlciBlbnRpdHkgY29udGFpbmluZyB0aGUgWE1MIG5hbWVzcGFjZSBVUkkgdmFsdWUgdXNlZCAKLSAgICAgZm9yIFhIVE1MIGlzICclWEhUTUwueG1sbnM7JywgZGVmaW5lZCBpbiB0aGUgUXVhbGlmaWVkIE5hbWVzIG1vZHVsZS4KLS0tPgotCi08IS0tIHRpdGxlOiBEb2N1bWVudCBUaXRsZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBUaGUgdGl0bGUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgIEl0IHNob3VsZCBiZSBkaXNwbGF5ZWQsIGZvciBleGFtcGxlIGFzIHRoZSBwYWdlIGhlYWRlciBvcgotICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLS0tPgotCi08IUVOVElUWSAlIHRpdGxlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGl0bGUuZWxlbWVudDtbCi08IUVOVElUWSAlIHRpdGxlLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTlRJVFkgJSB0aXRsZS5xbmFtZSAgInRpdGxlIiA+Ci08IUVMRU1FTlQgJXRpdGxlLnFuYW1lOyAgJXRpdGxlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRpdGxlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGl0bGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0aXRsZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGl0bGUucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOyAKLSAgICAgICVJMThuLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRpdGxlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gaGVhZDogRG9jdW1lbnQgSGVhZCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGhlYWQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoZWFkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoZWFkLmNvbnRlbnQKLSAgICAiKCAlSGVhZE9wdHMubWl4OywgJXRpdGxlLnFuYW1lOywgJUhlYWRPcHRzLm1peDsgKSIKLT4KLTwhRU5USVRZICUgaGVhZC5xbmFtZSAgImhlYWQiID4KLTwhRUxFTUVOVCAlaGVhZC5xbmFtZTsgICVoZWFkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGhlYWQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoZWFkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaGVhZC5hdHRsaXN0O1sKLTwhLS0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2Ugd2l0aCBkb2N1bWVudCBwcm9maWxlcwotLS0+Ci08IUVOVElUWSAlIHByb2ZpbGUuYXR0cmliCi0gICAgICJwcm9maWxlICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICclWEhUTUwucHJvZmlsZTsnIgotPgotCi08IUFUVExJU1QgJWhlYWQucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOyAKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgICVwcm9maWxlLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGhlYWQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBib2R5OiBEb2N1bWVudCBCb2R5IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYm9keS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJvZHkuZWxlbWVudDtbCi08IUVOVElUWSAlIGJvZHkuY29udGVudAotICAgICAiKCAlQmxvY2subWl4OyApKyIKLT4KLTwhRU5USVRZICUgYm9keS5xbmFtZSAgImJvZHkiID4KLTwhRUxFTUVOVCAlYm9keS5xbmFtZTsgICVib2R5LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJvZHkuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBib2R5LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYm9keS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYm9keS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYm9keS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGh0bWw6IFhIVE1MIERvY3VtZW50IEVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBodG1sLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaHRtbC5lbGVtZW50O1sKLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICAiKCAlaGVhZC5xbmFtZTssICVib2R5LnFuYW1lOyApIiA+Ci08IUVOVElUWSAlIGh0bWwucW5hbWUgICJodG1sIiA+Ci08IUVMRU1FTlQgJWh0bWwucW5hbWU7ICAlaHRtbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBodG1sLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaHRtbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWh0bWwuYXR0bGlzdDtbCi08IS0tIHZlcnNpb24gYXR0cmlidXRlIHZhbHVlIGRlZmluZWQgaW4gZHJpdmVyCi0tLT4KLTwhRU5USVRZICUgWEhUTUwudmVyc2lvbi5hdHRyaWIKLSAgICAgInZlcnNpb24gICAgICAlRlBJLmRhdGF0eXBlOyAgICAgICAgICAgI0ZJWEVEICclWEhUTUwudmVyc2lvbjsnIgotPgotCi08IS0tIHNlZSB0aGUgUXVhbGlmaWVkIE5hbWVzIG1vZHVsZSBmb3IgaW5mb3JtYXRpb24gCi0gICAgIG9uIGhvdyB0byBleHRlbmQgWEhUTUwgdXNpbmcgWE1MIG5hbWVzcGFjZXMgCi0tLT4KLTwhQVRUTElTVCAlaHRtbC5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7IAotICAgICAgJVhIVE1MLnZlcnNpb24uYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaHRtbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1zdHJ1Y3QtMS5tb2QgLS0+Ci0KLQotPCEtLSBlbmQgb2YgWEhUTUwgQmFzaWMgMS4wIERURCAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1sYXQxLmVudCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1sYXQxLmVudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIxOThlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtbGF0MS5lbnQKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICA8IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgICAgICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1sYXQxLmVudCI+Ci0gICAgJUhUTUxsYXQxOwotLS0+Ci0KLTwhRU5USVRZIG5ic3AgICAiJiMxNjA7Ij4gPCEtLSBuby1icmVhayBzcGFjZSA9IG5vbi1icmVha2luZyBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTAgSVNPbnVtIC0tPgotPCFFTlRJVFkgaWV4Y2wgICImIzE2MTsiPiA8IS0tIGludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmssIFUrMDBBMSBJU09udW0gLS0+Ci08IUVOVElUWSBjZW50ICAgIiYjMTYyOyI+IDwhLS0gY2VudCBzaWduLCBVKzAwQTIgSVNPbnVtIC0tPgotPCFFTlRJVFkgcG91bmQgICImIzE2MzsiPiA8IS0tIHBvdW5kIHNpZ24sIFUrMDBBMyBJU09udW0gLS0+Ci08IUVOVElUWSBjdXJyZW4gIiYjMTY0OyI+IDwhLS0gY3VycmVuY3kgc2lnbiwgVSswMEE0IElTT251bSAtLT4KLTwhRU5USVRZIHllbiAgICAiJiMxNjU7Ij4gPCEtLSB5ZW4gc2lnbiA9IHl1YW4gc2lnbiwgVSswMEE1IElTT251bSAtLT4KLTwhRU5USVRZIGJydmJhciAiJiMxNjY7Ij4gPCEtLSBicm9rZW4gYmFyID0gYnJva2VuIHZlcnRpY2FsIGJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTYgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2VjdCAgICImIzE2NzsiPiA8IS0tIHNlY3Rpb24gc2lnbiwgVSswMEE3IElTT251bSAtLT4KLTwhRU5USVRZIHVtbCAgICAiJiMxNjg7Ij4gPCEtLSBkaWFlcmVzaXMgPSBzcGFjaW5nIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTggSVNPZGlhIC0tPgotPCFFTlRJVFkgY29weSAgICImIzE2OTsiPiA8IS0tIGNvcHlyaWdodCBzaWduLCBVKzAwQTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3JkZiAgICImIzE3MDsiPiA8IS0tIGZlbWluaW5lIG9yZGluYWwgaW5kaWNhdG9yLCBVKzAwQUEgSVNPbnVtIC0tPgotPCFFTlRJVFkgbGFxdW8gICImIzE3MTsiPiA8IS0tIGxlZnQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsZWZ0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEFCIElTT251bSAtLT4KLTwhRU5USVRZIG5vdCAgICAiJiMxNzI7Ij4gPCEtLSBub3Qgc2lnbiA9IGFuZ2xlZCBkYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBQyBJU09udW0gLS0+Ci08IUVOVElUWSBzaHkgICAgIiYjMTczOyI+IDwhLS0gc29mdCBoeXBoZW4gPSBkaXNjcmV0aW9uYXJ5IGh5cGhlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUQgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmVnICAgICImIzE3NDsiPiA8IS0tIHJlZ2lzdGVyZWQgc2lnbiA9IHJlZ2lzdGVyZWQgdHJhZGUgbWFyayBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBRSBJU09udW0gLS0+Ci08IUVOVElUWSBtYWNyICAgIiYjMTc1OyI+IDwhLS0gbWFjcm9uID0gc3BhY2luZyBtYWNyb24gPSBvdmVybGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQVBMIG92ZXJiYXIsIFUrMDBBRiBJU09kaWEgLS0+Ci08IUVOVElUWSBkZWcgICAgIiYjMTc2OyI+IDwhLS0gZGVncmVlIHNpZ24sIFUrMDBCMCBJU09udW0gLS0+Ci08IUVOVElUWSBwbHVzbW4gIiYjMTc3OyI+IDwhLS0gcGx1cy1taW51cyBzaWduID0gcGx1cy1vci1taW51cyBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCMSBJU09udW0gLS0+Ci08IUVOVElUWSBzdXAyICAgIiYjMTc4OyI+IDwhLS0gc3VwZXJzY3JpcHQgdHdvID0gc3VwZXJzY3JpcHQgZGlnaXQgdHdvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzcXVhcmVkLCBVKzAwQjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMyAgICImIzE3OTsiPiA8IS0tIHN1cGVyc2NyaXB0IHRocmVlID0gc3VwZXJzY3JpcHQgZGlnaXQgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGN1YmVkLCBVKzAwQjMgSVNPbnVtIC0tPgotPCFFTlRJVFkgYWN1dGUgICImIzE4MDsiPiA8IS0tIGFjdXRlIGFjY2VudCA9IHNwYWNpbmcgYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI0IElTT2RpYSAtLT4KLTwhRU5USVRZIG1pY3JvICAiJiMxODE7Ij4gPCEtLSBtaWNybyBzaWduLCBVKzAwQjUgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGFyYSAgICImIzE4MjsiPiA8IS0tIHBpbGNyb3cgc2lnbiA9IHBhcmFncmFwaCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCNiBJU09udW0gLS0+Ci08IUVOVElUWSBtaWRkb3QgIiYjMTgzOyI+IDwhLS0gbWlkZGxlIGRvdCA9IEdlb3JnaWFuIGNvbW1hCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBHcmVlayBtaWRkbGUgZG90LCBVKzAwQjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgY2VkaWwgICImIzE4NDsiPiA8IS0tIGNlZGlsbGEgPSBzcGFjaW5nIGNlZGlsbGEsIFUrMDBCOCBJU09kaWEgLS0+Ci08IUVOVElUWSBzdXAxICAgIiYjMTg1OyI+IDwhLS0gc3VwZXJzY3JpcHQgb25lID0gc3VwZXJzY3JpcHQgZGlnaXQgb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRtICAgIiYjMTg2OyI+IDwhLS0gbWFzY3VsaW5lIG9yZGluYWwgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCQSBJU09udW0gLS0+Ci08IUVOVElUWSByYXF1byAgIiYjMTg3OyI+IDwhLS0gcmlnaHQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByaWdodCBwb2ludGluZyBndWlsbGVtZXQsIFUrMDBCQiBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMTQgIiYjMTg4OyI+IDwhLS0gdnVsZ2FyIGZyYWN0aW9uIG9uZSBxdWFydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiBvbmUgcXVhcnRlciwgVSswMEJDIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMxMiAiJiMxODk7Ij4gPCEtLSB2dWxnYXIgZnJhY3Rpb24gb25lIGhhbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIG9uZSBoYWxmLCBVKzAwQkQgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzM0ICImIzE5MDsiPiA8IS0tIHZ1bGdhciBmcmFjdGlvbiB0aHJlZSBxdWFydGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMsIFUrMDBCRSBJU09udW0gLS0+Ci08IUVOVElUWSBpcXVlc3QgIiYjMTkxOyI+IDwhLS0gaW52ZXJ0ZWQgcXVlc3Rpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHVybmVkIHF1ZXN0aW9uIG1hcmssIFUrMDBCRiBJU09udW0gLS0+Ci08IUVOVElUWSBBZ3JhdmUgIiYjMTkyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGdyYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgQWFjdXRlICImIzE5MzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFjaXJjICAiJiMxOTQ7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEF0aWxkZSAiJiMxOTU7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBdW1sICAgIiYjMTk2OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFyaW5nICAiJiMxOTc7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggcmluZyBhYm92ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSByaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgQUVsaWcgICImIzE5ODsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEFFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIEFFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQ2NlZGlsICImIzE5OTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEMgd2l0aCBjZWRpbGxhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWdyYXZlICImIzIwMDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzggSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVhY3V0ZSAiJiMyMDE7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFY2lyYyAgIiYjMjAyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFdW1sICAgIiYjMjAzOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0IgSVNPbGF0MSAtLT4KLTwhRU5USVRZIElncmF2ZSAiJiMyMDQ7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJYWN1dGUgIiYjMjA1OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWNpcmMgICImIzIwNjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgSXVtbCAgICImIzIwNzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFVEggICAgIiYjMjA4OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRVRILCBVKzAwRDAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE50aWxkZSAiJiMyMDk7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBOIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPZ3JhdmUgIiYjMjEwOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2FjdXRlICImIzIxMTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9jaXJjICAiJiMyMTI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE90aWxkZSAiJiMyMTM7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBPdW1sICAgIiYjMjE0OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRpbWVzICAiJiMyMTU7Ij4gPCEtLSBtdWx0aXBsaWNhdGlvbiBzaWduLCBVKzAwRDcgSVNPbnVtIC0tPgotPCFFTlRJVFkgT3NsYXNoICImIzIxNjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBzdHJva2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gc2xhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBVZ3JhdmUgIiYjMjE3OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWFjdXRlICImIzIxODsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVjaXJjICAiJiMyMTk7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFV1bWwgICAiJiMyMjA7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgWWFjdXRlICImIzIyMTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFRIT1JOICAiJiMyMjI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBUSE9STiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHN6bGlnICAiJiMyMjM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgc2hhcnAgcyA9IGVzcy16ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhZ3JhdmUgIiYjMjI0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBncmF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIGEgZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhYWN1dGUgIiYjMjI1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFjaXJjICAiJiMyMjY7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhdGlsZGUgIiYjMjI3OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGF1bWwgICAiJiMyMjg7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFyaW5nICAiJiMyMjk7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIHJpbmcgYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBhIHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBhZWxpZyAgIiYjMjMwOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGFlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsaWdhdHVyZSBhZSwgVSswMEU2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBjY2VkaWwgIiYjMjMxOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGMgd2l0aCBjZWRpbGxhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWdyYXZlICImIzIzMjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlYWN1dGUgIiYjMjMzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVjaXJjICAiJiMyMzQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBldW1sICAgIiYjMjM1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpZ3JhdmUgIiYjMjM2OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGlhY3V0ZSAiJiMyMzc7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWNpcmMgICImIzIzODsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGl1bWwgICAiJiMyMzk7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGV0aCAgICAiJiMyNDA7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZXRoLCBVKzAwRjAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG50aWxkZSAiJiMyNDE7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbiB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2dyYXZlICImIzI0MjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvYWN1dGUgIiYjMjQzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9jaXJjICAiJiMyNDQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdGlsZGUgIiYjMjQ1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG91bWwgICAiJiMyNDY7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGRpdmlkZSAiJiMyNDc7Ij4gPCEtLSBkaXZpc2lvbiBzaWduLCBVKzAwRjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3NsYXNoICImIzI0ODsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggc3Ryb2tlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIG8gc2xhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY4IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1Z3JhdmUgIiYjMjQ5OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVhY3V0ZSAiJiMyNTA7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWNpcmMgICImIzI1MTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHV1bWwgICAiJiMyNTI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHlhY3V0ZSAiJiMyNTM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdGhvcm4gICImIzI1NDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB0aG9ybiB3aXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgeXVtbCAgICImIzI1NTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB5IHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRiBJU09sYXQxIC0tPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLW1vYmlsZTEwLWZsYXQuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLW1vYmlsZTEwLWZsYXQuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjExNTAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDMyMTYgKzAsMCBAQAotPCEtLSBYSFRNTCBNb2JpbGUgMS4wIERURCAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1tb2JpbGUxMC5kdGQgLS0+Ci08IS0tIAotICAgICBUaGlzIGlzIFhIVE1MIE1vYmlsZSBwcm9maWxlLCBhIHByb3BlciBzdWJzZXQgb2YgWEhUTUwuCi0gICAgIAotICAgICAJQFdpcmVsZXNzIEFwcGxpY2F0aW9uIFByb3RvY29sIEZvcnVtLCBMdGQuIDIwMDEuCi0KLQlUZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBXaXJlbGVzcyBBcHBsaWNhdGlvbiBQcm90b2NvbCBGb3J1bSBMdGQuIAotCVdlYiBzaXRlIChodHRwOi8vd3d3LndhcGZvcnVtLm9yZy93aGF0L2NvcHlyaWdodC5odG0pLgotICAgIAotLS0+Ci08IS0tIFRoaXMgaXMgdGhlIGRyaXZlciBmaWxlIGZvciB2ZXJzaW9uIDEuMCBvZiB0aGUgWEhUTUwgTW9iaWxlIERURC4KLQotICAgICBUaGlzIERURCBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICBQVUJMSUM6ICItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIgotICAgICBTWVNURU06ICJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQveGh0bWwtbW9iaWxlMTAuZHRkIgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnZlcnNpb24gICItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIiA+Ci0KLTwhLS0gVXNlIHRoaXMgVVJJIHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IG5hbWVzcGFjZToKLQotICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0KLSAgICAgU2VlIHRoZSBRdWFsaWZpZWQgTmFtZXMgbW9kdWxlIGZvciBpbmZvcm1hdGlvbgotICAgICBvbiB0aGUgdXNlIG9mIG5hbWVzcGFjZSBwcmVmaXhlcyBpbiB0aGUgRFRELgotLS0+Ci08IUVOVElUWSAlIE5TLnByZWZpeGVkICJJR05PUkUiID4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ICAiIiA+Ci0KLTwhLS0gRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgdXNpbmcgWEhUTUwgTW9iaWxlIDEuMCBkaXJlY3RseSwgdXNlCi0gICAgIHRoZSBGUEkgaW4gdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24sIHdpdGggdGhlIHhtbG5zIGF0dHJpYnV0ZQotICAgICBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudCB0byBpZGVudGlmeSB0aGUgZGVmYXVsdCBuYW1lc3BhY2U6Ci0KLSAgICAgICAgIDw/eG1sIHZlcnNpb249IjEuMCI/PgotICAgICAgICAgPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIgotICAgICAgICAgICAgICJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQveGh0bWwtbW9iaWxlMTAuZHRkIiA+Ci0gICAgICAgICA8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiIgPgotICAgICAgICAgLi4uCi0gICAgICAgICA8L2h0bWw+Ci0tLT4KLQotPCEtLSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSB3aXRoIGRvY3VtZW50IHByb2ZpbGVzIC0tPgotPCFFTlRJVFkgJSBYSFRNTC5wcm9maWxlICAiIiA+Ci0KLTwhLS0gSW5saW5lIFN0eWxlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtaW5sc3R5bGUubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgU3R5bGUgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5sc3R5bGUtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW5saW5lIFN0eWxlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW5sc3R5bGUtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgSW5saW5lIFN0eWxlIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5sc3R5bGUtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW5saW5lIFN0eWxlCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlICdzdHlsZScgYXR0cmlidXRlLCB1c2VkIHRvIHN1cHBvcnQgaW5saW5lCi0gICAgIHN0eWxlIG1hcmt1cC4gVGhpcyBtb2R1bGUgbXVzdCBiZSBpbnN0YW50aWF0ZWQgcHJpb3IgdG8gdGhlIFhIVE1MCi0gICAgIENvbW1vbiBBdHRyaWJ1dGVzIG1vZHVsZSBpbiBvcmRlciB0byBiZSBpbmNsdWRlZCBpbiAlQ29yZS5hdHRyaWI7LgotLS0+Ci0KLTwhRU5USVRZICUgc3R5bGUuYXR0cmliCi0gICAgICJzdHlsZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi0KLTwhRU5USVRZICUgQ29yZS5leHRyYS5hdHRyaWIKLSAgICAgIiVzdHlsZS5hdHRyaWI7IgotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxzdHlsZS0xLm1vZCAtLT4KLQotCi08IS0tIERvY3VtZW50IE1vZGVsIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLW1vZGVsLm1vZAotICAgICBQVUJMSUMgIi0vL1dBUEZPUlVNLy9FTlRJVElFUyBYSFRNTCBNb2JpbGUgMS4wIERvY3VtZW50IE1vZGVsIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3hodG1sLW1vYmlsZTEwLW1vZGVsLTEubW9kIiA+Ci0KLTwhLS0gWEhUTUwgRnJhbWV3b3JrIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIFhIVE1MLmJpZGkgICJJR05PUkUiID4KLTwhRU5USVRZICUgeGh0bWwtZnJhbWV3b3JrLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgTW9kdWxhciBGcmFtZXdvcmsgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZnJhbWV3b3JrLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIE1vZHVsYXIgRnJhbWV3b3JrIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWZyYW1ld29yay0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgTW9kdWxhciBGcmFtZXdvcmsgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1mcmFtZXdvcmstMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTW9kdWxhciBGcmFtZXdvcmsKLQotICAgICBUaGlzIHJlcXVpcmVkIG1vZHVsZSBpbnN0YW50aWF0ZXMgdGhlIG1vZHVsZXMgbmVlZGVkCi0gICAgIHRvIHN1cHBvcnQgdGhlIFhIVE1MIG1vZHVsYXJpemF0aW9uIG1vZGVsLCBpbmNsdWRpbmc6Ci0KLSAgICAgICAgKyAgbm90YXRpb25zCi0gICAgICAgICsgIGRhdGF0eXBlcwotICAgICAgICArICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzCi0gICAgICAgICsgIGNvbW1vbiBhdHRyaWJ1dGVzCi0gICAgICAgICsgIGRvY3VtZW50IG1vZGVsCi0gICAgICAgICsgIGNoYXJhY3RlciBlbnRpdGllcwotCi0gICAgIFRoZSBJbnRyaW5zaWMgRXZlbnRzIG1vZHVsZSBpcyBpZ25vcmVkIGJ5IGRlZmF1bHQgYnV0Ci0gICAgIG9jY3VycyBpbiB0aGlzIG1vZHVsZSBiZWNhdXNlIGl0IG11c3QgYmUgaW5zdGFudGlhdGVkCi0gICAgIHByaW9yIHRvIEF0dHJpYnV0ZXMgYnV0IGFmdGVyIERhdGF0eXBlcy4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWFyY2gubW9kdWxlICJJR05PUkUiID4KLTwhWyV4aHRtbC1hcmNoLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWFyY2gubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEFyY2hpdGVjdHVyZSAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWFyY2gtMS5tb2QiID4KLSV4aHRtbC1hcmNoLm1vZDtdXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ub3RhdGlvbnMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbm90YXRpb25zLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLW5vdGF0aW9ucy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OUyBYSFRNTCBOb3RhdGlvbnMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ub3RhdGlvbnMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTm90YXRpb25zIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbm90YXRpb25zLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OUyBYSFRNTCBOb3RhdGlvbnMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1ub3RhdGlvbnMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTm90YXRpb25zCi0KLSAgICAgZGVmaW5lcyB0aGUgZm9sbG93aW5nIG5vdGF0aW9ucywgbWFueSBvZiB0aGVzZSBpbXBvcnRlZCBmcm9tCi0gICAgIG90aGVyIHNwZWNpZmljYXRpb25zIGFuZCBzdGFuZGFyZHMuIFdoZW4gYW4gZXhpc3RpbmcgRlBJIGlzCi0gICAgIGtub3duLCBpdCBpcyBpbmNvcnBvcmF0ZWQgaGVyZS4KLS0tPgotCi08IS0tIFhNTCBOb3RhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gU0dNTCBhbmQgWE1MIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFczQyBYTUwgMS4wIFJlY29tbWVuZGF0aW9uIC0tPgotPCFOT1RBVElPTiB3M2MteG1sCi0gICAgIFBVQkxJQyAiSVNPIDg4NzkvL05PVEFUSU9OIEV4dGVuc2libGUgTWFya3VwIExhbmd1YWdlIChYTUwpIDEuMC8vRU4iID4KLQotPCEtLSBYTUwgMS4wIENEQVRBIC0tPgotPCFOT1RBVElPTiBjZGF0YQotICAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWE1MIDEuMDogQ0RBVEEvL0VOIiA+Ci0KLTwhLS0gU0dNTCBGb3JtYWwgUHVibGljIElkZW50aWZpZXJzIC0tPgotPCFOT1RBVElPTiBmcGkKLSAgICAgUFVCTElDICJJU08gODg3OToxOTg2Ly9OT1RBVElPTiBGb3JtYWwgUHVibGljIElkZW50aWZpZXIvL0VOIiA+Ci0KLTwhLS0gWEhUTUwgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGZvciBjZWxscGFkZGluZy9jZWxsc3BhY2luZyAtLT4KLQotPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IU5PVEFUSU9OIGxlbmd0aAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTGVuZ3RoLy9FTiIgPgotCi08IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMgLS0+Ci08IU5PVEFUSU9OIGxpbmtUeXBlcwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTGlua1R5cGVzLy9FTiIgPgotCi08IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLTwhTk9UQVRJT04gbWVkaWFEZXNjCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBNZWRpYURlc2MvL0VOIiA+Ci0KLTwhLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotPCFOT1RBVElPTiBtdWx0aUxlbmd0aAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTXVsdGlMZW5ndGgvL0VOIiA+Ci0KLTwhLS0gb25lIG9yIG1vcmUgZGlnaXRzIChOVU1CRVIpIC0tPgotPCFOT1RBVElPTiBudW1iZXIKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IE51bWJlci8vRU4iID4KLQotPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotPCFOT1RBVElPTiBwaXhlbHMKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFBpeGVscy8vRU4iID4KLQotPCEtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLTwhTk9UQVRJT04gc2NyaXB0Ci0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBTY3JpcHQvL0VOIiA+Ci0KLTwhLS0gdGV4dHVhbCBjb250ZW50IC0tPgotPCFOT1RBVElPTiB0ZXh0Ci0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBUZXh0Ly9FTiIgPgotCi08IS0tIEltcG9ydGVkIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotPCFOT1RBVElPTiBjaGFyYWN0ZXIKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENoYXJhY3Rlci8vRU4iID4KLQotPCEtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY2hhcnNldAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ2hhcnNldC8vRU4iID4KLQotPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNoYXJzZXRzCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDaGFyc2V0cy8vRU4iID4KLQotPCEtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjb250ZW50VHlwZQotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ29udGVudFR5cGUvL0VOIiA+Ci0KLTwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgdHlwZXMsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNvbnRlbnRUeXBlcwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ29udGVudFR5cGVzLy9FTiIgPgotCi08IS0tIGRhdGUgYW5kIHRpbWUgaW5mb3JtYXRpb24uIElTTyBkYXRlIGZvcm1hdCAtLT4KLTwhTk9UQVRJT04gZGF0ZXRpbWUKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IERhdGV0aW1lLy9FTiIgPgotCi08IS0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMzMDY2XSAtLT4KLTwhTk9UQVRJT04gbGFuZ3VhZ2VDb2RlCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBMYW5ndWFnZUNvZGUvL0VOIiA+Ci0KLTwhLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsIHNlZSBbVVJJXSAtLT4KLTwhTk9UQVRJT04gdXJpCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBVUkkvL0VOIiA+Ci0KLTwhLS0gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzLCBzZWUgW1VSSV0gLS0+Ci08IU5PVEFUSU9OIHVyaXMKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFVSSXMvL0VOIiA+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLW5vdGF0aW9ucy0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWRhdGF0eXBlcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1kYXRhdHlwZXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtZGF0YXR5cGVzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgRGF0YXR5cGVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtZGF0YXR5cGVzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIERhdGF0eXBlcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWRhdGF0eXBlcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgRGF0YXR5cGVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZGF0YXR5cGVzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIERhdGF0eXBlcwotCi0gICAgIGRlZmluZXMgY29udGFpbmVycyBmb3IgdGhlIGZvbGxvd2luZyBkYXRhdHlwZXMsIG1hbnkgb2YKLSAgICAgdGhlc2UgaW1wb3J0ZWQgZnJvbSBvdGhlciBzcGVjaWZpY2F0aW9ucyBhbmQgc3RhbmRhcmRzLgotLS0+Ci0KLTwhLS0gTGVuZ3RoIGRlZmluZWQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotCi08IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhRU5USVRZICUgTGVuZ3RoLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMgLS0+Ci08IUVOVElUWSAlIExpbmtUeXBlcy5kYXRhdHlwZSAiTk1UT0tFTlMiID4KLQotPCEtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMgLS0+Ci08IUVOVElUWSAlIE1lZGlhRGVzYy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci08IUVOVElUWSAlIE11bHRpTGVuZ3RoLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIG9uZSBvciBtb3JlIGRpZ2l0cyAoTlVNQkVSKSAtLT4KLTwhRU5USVRZICUgTnVtYmVyLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci08IUVOVElUWSAlIFBpeGVscy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLTwhRU5USVRZICUgU2NyaXB0LmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHRleHR1YWwgY29udGVudCAtLT4KLTwhRU5USVRZICUgVGV4dC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBJbXBvcnRlZCBEYXRhdHlwZXMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAtLT4KLTwhRU5USVRZICUgQ2hhcmFjdGVyLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDaGFyc2V0LmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ2hhcnNldHMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gQ29sb3Igc3BlY2lmaWNhdGlvbiB1c2luZyBjb2xvciBuYW1lIG9yIHNSR0IgKCNSUkdHQkIpIHZhbHVlcyAtLT4KLTwhRU5USVRZICUgQ29sb3IuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gbWVkaWEgdHlwZSwgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ29udGVudFR5cGUuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgdHlwZXMsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENvbnRlbnRUeXBlcy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci08IUVOVElUWSAlIERhdGV0aW1lLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGZvcm1hbCBwdWJsaWMgaWRlbnRpZmllciwgYXMgcGVyIFtJU084ODc5XSAtLT4KLTwhRU5USVRZICUgRlBJLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMzMDY2XSAtLT4KLTwhRU5USVRZICUgTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlICJOTVRPS0VOIiA+Ci0KLTwhLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsIHNlZSBbVVJJXSAtLT4KLTwhRU5USVRZICUgVVJJLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycywgc2VlIFtVUkldIC0tPgotPCFFTlRJVFkgJSBVUklzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGVuZCBvZiB4aHRtbC1kYXRhdHlwZXMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBwbGFjZWhvbGRlciBmb3IgWExpbmsgc3VwcG9ydCBtb2R1bGUgLS0+Ci08IUVOVElUWSAlIHhodG1sLXhsaW5rLm1vZCAiIiA+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1xbmFtZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIFF1YWxpZmllZCBOYW1lcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLXFuYW1lLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBRbmFtZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtcW5hbWUtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIFF1YWxpZmllZCBOYW1lcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXFuYW1lLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSMyMDAwLTEwLTIyOiBhZGRlZCBxbmFtZSBkZWNsYXJhdGlvbnMgZm9yIHJ1YnkgZWxlbWVudHMKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gWEhUTUwgUW5hbWUgKFF1YWxpZmllZCBOYW1lKSBNb2R1bGUKLQotICAgICBUaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdHdvIHBhcnRzLCBsYWJlbGVkIFNlY3Rpb24gJ0EnIGFuZCAnQic6Ci0KLSAgICAgICBTZWN0aW9uIEEgZGVjbGFyZXMgcGFyYW1ldGVyIGVudGl0aWVzIHRvIHN1cHBvcnQgbmFtZXNwYWNlLQotICAgICAgIHF1YWxpZmllZCBuYW1lcywgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucywgYW5kIG5hbWUgcHJlZml4aW5nCi0gICAgICAgZm9yIFhIVE1MIGFuZCBleHRlbnNpb25zLgotCi0gICAgICAgU2VjdGlvbiBCIGRlY2xhcmVzIHBhcmFtZXRlciBlbnRpdGllcyB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzIGZvciBhbGwgWEhUTUwgZWxlbWVudCB0eXBlczoKLQotICAgICAgICAgJWFwcGxldC5xbmFtZTsgICB0aGUgeG1sbnMtcXVhbGlmaWVkIG5hbWUgZm9yIDxhcHBsZXQ+Ci0gICAgICAgICAlYmFzZS5xbmFtZTsgICAgIHRoZSB4bWxucy1xdWFsaWZpZWQgbmFtZSBmb3IgPGJhc2U+Ci0gICAgICAgICAuLi4KLQotICAgICBYSFRNTCBleHRlbnNpb25zIHdvdWxkIGNyZWF0ZSBhIG1vZHVsZSBzaW1pbGFyIHRvIHRoaXMgb25lLgotICAgICBJbmNsdWRlZCBpbiB0aGUgWEhUTUwgZGlzdHJpYnV0aW9uIGlzIGEgdGVtcGxhdGUgbW9kdWxlCi0gICAgICgndGVtcGxhdGUtcW5hbWUtMS5tb2QnKSBzdWl0YWJsZSBmb3IgdGhpcyBwdXJwb3NlLgotLS0+Ci0KLTwhLS0gU2VjdGlvbiBBOiBYSFRNTCBYTUwgTmFtZXNwYWNlIEZyYW1ld29yayA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCEtLSAxLiBEZWNsYXJlIGEgJVhIVE1MLnByZWZpeGVkOyBjb25kaXRpb25hbCBzZWN0aW9uIGtleXdvcmQsIHVzZWQKLSAgICAgICAgdG8gYWN0aXZhdGUgbmFtZXNwYWNlIHByZWZpeGluZy4gVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkCi0gICAgICAgIGluaGVyaXQgJyVOUy5wcmVmaXhlZDsnIGZyb20gdGhlIERURCBkcml2ZXIsIHNvIHRoYXQgdW5sZXNzCi0gICAgICAgIG92ZXJyaWRkZW4sIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb2xsb3dzIHRoZSBvdmVyYWxsIERURAotICAgICAgICBwcmVmaXhpbmcgc2NoZW1lLgotLS0+Ci08IUVOVElUWSAlIE5TLnByZWZpeGVkICJJR05PUkUiID4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ZWQgIiVOUy5wcmVmaXhlZDsiID4KLQotPCEtLSAyLiBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAoZWcuLCAlWEhUTUwueG1sbnM7KSBjb250YWluaW5nCi0gICAgICAgIHRoZSBVUkkgcmVmZXJlbmNlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIFhIVE1MIG5hbWVzcGFjZToKLS0tPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucyAgImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiID4KLQotPCEtLSAzLiBEZWNsYXJlIHBhcmFtZXRlciBlbnRpdGllcyAoZWcuLCAlWEhUTUwucHJlZml4OykgY29udGFpbmluZwotICAgICAgICB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcHJlZml4IHN0cmluZyhzKSB0byB1c2Ugd2hlbiBwcmVmaXhpbmcKLSAgICAgICAgaXMgZW5hYmxlZC4gVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBpbiB0aGUgRFREIGRyaXZlciBvciB0aGUKLSAgICAgICAgaW50ZXJuYWwgc3Vic2V0IG9mIGFuIGRvY3VtZW50IGluc3RhbmNlLiBJZiBubyBkZWZhdWx0IHByZWZpeAotICAgICAgICBpcyBkZXNpcmVkLCB0aGlzIG1heSBiZSBkZWNsYXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuCi0KLSAgICAgTk9URTogQXMgc3BlY2lmaWVkIGluIFtYTUxOQU1FU10sIHRoZSBuYW1lc3BhY2UgcHJlZml4IHNlcnZlcwotICAgICBhcyBhIHByb3h5IGZvciB0aGUgVVJJIHJlZmVyZW5jZSwgYW5kIGlzIG5vdCBpbiBpdHNlbGYgc2lnbmlmaWNhbnQuCi0tLT4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ICAiIiA+Ci0KLTwhLS0gNC4gRGVjbGFyZSBwYXJhbWV0ZXIgZW50aXRpZXMgKGVnLiwgJVhIVE1MLnBmeDspIGNvbnRhaW5pbmcgdGhlCi0gICAgICAgIGNvbG9uaXplZCBwcmVmaXgoZXMpIChlZy4sICclWEhUTUwucHJlZml4OzonKSB1c2VkIHdoZW4KLSAgICAgICAgcHJlZml4aW5nIGlzIGFjdGl2ZSwgYW4gZW1wdHkgc3RyaW5nIHdoZW4gaXQgaXMgbm90LgotLS0+Ci08IVslWEhUTUwucHJlZml4ZWQ7WwotPCFFTlRJVFkgJSBYSFRNTC5wZnggICIlWEhUTUwucHJlZml4OzoiID4KLV1dPgotPCFFTlRJVFkgJSBYSFRNTC5wZnggICIiID4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBuYW1lIGV4dGVuc2lvbnMgaGVyZSAuLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXFuYW1lLWV4dHJhLm1vZCAiIiA+Ci0KLQotPCEtLSA1LiBUaGUgcGFyYW1ldGVyIGVudGl0eSAlWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliOyBtYXkgYmUKLSAgICAgICAgcmVkZWNsYXJlZCB0byBjb250YWluIGFueSBub24tWEhUTUwgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0gICAgICAgIGF0dHJpYnV0ZXMgZm9yIG5hbWVzcGFjZXMgZW1iZWRkZWQgaW4gWEhUTUwuIFRoZSBkZWZhdWx0Ci0gICAgICAgIGlzIGFuIGVtcHR5IHN0cmluZy4gIFhMaW5rIHNob3VsZCBiZSBpbmNsdWRlZCBoZXJlIGlmIHVzZWQKLSAgICAgICAgaW4gdGhlIERURC4KLS0tPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucy5leHRyYS5hdHRyaWIgIiIgPgotCi08IS0tIFRoZSByZW1haW5kZXIgb2YgU2VjdGlvbiBBIGlzIG9ubHkgZm9sbG93ZWQgaW4gWEhUTUwsIG5vdCBleHRlbnNpb25zLiAtLT4KLQotPCEtLSBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAlTlMuZGVjbC5hdHRyaWI7IGNvbnRhaW5pbmcKLSAgICAgYWxsIFhNTCBOYW1lc3BhY2UgZGVjbGFyYXRpb25zIHVzZWQgaW4gdGhlIERURCwgcGx1cyB0aGUKLSAgICAgeG1sbnMgZGVjbGFyYXRpb24gZm9yIFhIVE1MLCBpdHMgZm9ybSBkZXBlbmRlbnQgb24gd2hldGhlcgotICAgICBwcmVmaXhpbmcgaXMgYWN0aXZlLgotLS0+Ci08IVslWEhUTUwucHJlZml4ZWQ7WwotPCFFTlRJVFkgJSBOUy5kZWNsLmF0dHJpYgotICAgICAieG1sbnM6JVhIVE1MLnByZWZpeDsgICVVUkkuZGF0YXR5cGU7ICAgI0ZJWEVEICclWEhUTUwueG1sbnM7JwotICAgICAgJVhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYjsiCi0+Ci1dXT4KLTwhRU5USVRZICUgTlMuZGVjbC5hdHRyaWIKLSAgICAgIiVYSFRNTC54bWxucy5leHRyYS5hdHRyaWI7IgotPgotCi08IS0tIFRoaXMgaXMgYSBwbGFjZWhvbGRlciBmb3IgZnV0dXJlIFhMaW5rIHN1cHBvcnQuCi0tLT4KLTwhRU5USVRZICUgWExJTksueG1sbnMuYXR0cmliICIiID4KLQotPCEtLSBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAlTlMuZGVjbC5hdHRyaWI7IGNvbnRhaW5pbmcgYWxsCi0gICAgIFhNTCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXR0cmlidXRlcyB1c2VkIGJ5IFhIVE1MLCBpbmNsdWRpbmcKLSAgICAgYSBkZWZhdWx0IHhtbG5zIGF0dHJpYnV0ZSB3aGVuIHByZWZpeGluZyBpcyBpbmFjdGl2ZS4KLS0tPgotPCFbJVhIVE1MLnByZWZpeGVkO1sKLTwhRU5USVRZICUgWEhUTUwueG1sbnMuYXR0cmliCi0gICAgICIlTlMuZGVjbC5hdHRyaWI7Ci0gICAgICAlWExJTksueG1sbnMuYXR0cmliOyIKLT4KLV1dPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucy5hdHRyaWIKLSAgICAgInhtbG5zICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0ZJWEVEICclWEhUTUwueG1sbnM7JwotICAgICAgJVhMSU5LLnhtbG5zLmF0dHJpYjsiCi0+Ci0KLTwhLS0gcGxhY2Vob2xkZXIgZm9yIHF1YWxpZmllZCBuYW1lIHJlZGVjbGFyYXRpb25zIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS5yZWRlY2wgIiIgPgotCi0KLTwhLS0gU2VjdGlvbiBCOiBYSFRNTCBRdWFsaWZpZWQgTmFtZXMgOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhLS0gNi4gVGhpcyBzZWN0aW9uIGRlY2xhcmVzIHBhcmFtZXRlciBlbnRpdGllcyB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICAgbmFtZXNwYWNlLXF1YWxpZmllZCBuYW1lcyBmb3IgYWxsIFhIVE1MIGVsZW1lbnQgdHlwZXMuCi0tLT4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1hcHBsZXQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGFwcGxldC5xbmFtZSAgIiVYSFRNTC5wZng7YXBwbGV0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmFzZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgYmFzZS5xbmFtZSAgICAiJVhIVE1MLnBmeDtiYXNlIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmRvLTEubW9kIC0tPgotPCFFTlRJVFkgJSBiZG8ucW5hbWUgICAgICIlWEhUTUwucGZ4O2JkbyIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJsa3BocmFzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBhZGRyZXNzLnFuYW1lICIlWEhUTUwucGZ4O2FkZHJlc3MiID4KLTwhRU5USVRZICUgYmxvY2txdW90ZS5xbmFtZSAgIiVYSFRNTC5wZng7YmxvY2txdW90ZSIgPgotPCFFTlRJVFkgJSBwcmUucW5hbWUgICAgICIlWEhUTUwucGZ4O3ByZSIgPgotPCFFTlRJVFkgJSBoMS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2gxIiA+Ci08IUVOVElUWSAlIGgyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDIiID4KLTwhRU5USVRZICUgaDMucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoMyIgPgotPCFFTlRJVFkgJSBoNC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2g0IiA+Ci08IUVOVElUWSAlIGg1LnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDUiID4KLTwhRU5USVRZICUgaDYucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoNiIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJsa3ByZXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGhyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aHIiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGRpdi5xbmFtZSAgICAgIiVYSFRNTC5wZng7ZGl2IiA+Ci08IUVOVElUWSAlIHAucW5hbWUgICAgICAgIiVYSFRNTC5wZng7cCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWVkaXQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGlucy5xbmFtZSAgICAgIiVYSFRNTC5wZng7aW5zIiA+Ci08IUVOVElUWSAlIGRlbC5xbmFtZSAgICAgIiVYSFRNTC5wZng7ZGVsIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtZm9ybS0xLm1vZCAtLT4KLTwhRU5USVRZICUgZm9ybS5xbmFtZSAgICAiJVhIVE1MLnBmeDtmb3JtIiA+Ci08IUVOVElUWSAlIGxhYmVsLnFuYW1lICAgIiVYSFRNTC5wZng7bGFiZWwiID4KLTwhRU5USVRZICUgaW5wdXQucW5hbWUgICAiJVhIVE1MLnBmeDtpbnB1dCIgPgotPCFFTlRJVFkgJSBzZWxlY3QucW5hbWUgICIlWEhUTUwucGZ4O3NlbGVjdCIgPgotPCFFTlRJVFkgJSBvcHRncm91cC5xbmFtZSAgIiVYSFRNTC5wZng7b3B0Z3JvdXAiID4KLTwhRU5USVRZICUgb3B0aW9uLnFuYW1lICAiJVhIVE1MLnBmeDtvcHRpb24iID4KLTwhRU5USVRZICUgdGV4dGFyZWEucW5hbWUgICIlWEhUTUwucGZ4O3RleHRhcmVhIiA+Ci08IUVOVElUWSAlIGZpZWxkc2V0LnFuYW1lICAiJVhIVE1MLnBmeDtmaWVsZHNldCIgPgotPCFFTlRJVFkgJSBsZWdlbmQucW5hbWUgICIlWEhUTUwucGZ4O2xlZ2VuZCIgPgotPCFFTlRJVFkgJSBidXR0b24ucW5hbWUgICIlWEhUTUwucGZ4O2J1dHRvbiIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWh5cGVydGV4dC0xLm1vZCAtLT4KLTwhRU5USVRZICUgYS5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDthIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW1hZ2UtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGltZy5xbmFtZSAgICAgIiVYSFRNTC5wZng7aW1nIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW5scGhyYXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGFiYnIucW5hbWUgICAgIiVYSFRNTC5wZng7YWJiciIgPgotPCFFTlRJVFkgJSBhY3JvbnltLnFuYW1lICIlWEhUTUwucGZ4O2Fjcm9ueW0iID4KLTwhRU5USVRZICUgY2l0ZS5xbmFtZSAgICAiJVhIVE1MLnBmeDtjaXRlIiA+Ci08IUVOVElUWSAlIGNvZGUucW5hbWUgICAgIiVYSFRNTC5wZng7Y29kZSIgPgotPCFFTlRJVFkgJSBkZm4ucW5hbWUgICAgICIlWEhUTUwucGZ4O2RmbiIgPgotPCFFTlRJVFkgJSBlbS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2VtIiA+Ci08IUVOVElUWSAlIGtiZC5xbmFtZSAgICAgIiVYSFRNTC5wZng7a2JkIiA+Ci08IUVOVElUWSAlIHEucW5hbWUgICAgICAgIiVYSFRNTC5wZng7cSIgPgotPCFFTlRJVFkgJSBzYW1wLnFuYW1lICAgICIlWEhUTUwucGZ4O3NhbXAiID4KLTwhRU5USVRZICUgc3Ryb25nLnFuYW1lICAiJVhIVE1MLnBmeDtzdHJvbmciID4KLTwhRU5USVRZICUgdmFyLnFuYW1lICAgICAiJVhIVE1MLnBmeDt2YXIiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbmxwcmVzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBiLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O2IiID4KLTwhRU5USVRZICUgYmlnLnFuYW1lICAgICAiJVhIVE1MLnBmeDtiaWciID4KLTwhRU5USVRZICUgaS5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtpIiA+Ci08IUVOVElUWSAlIHNtYWxsLnFuYW1lICAgIiVYSFRNTC5wZng7c21hbGwiID4KLTwhRU5USVRZICUgc3ViLnFuYW1lICAgICAiJVhIVE1MLnBmeDtzdWIiID4KLTwhRU5USVRZICUgc3VwLnFuYW1lICAgICAiJVhIVE1MLnBmeDtzdXAiID4KLTwhRU5USVRZICUgdHQucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0dCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlubHN0cnVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgYnIucW5hbWUgICAgICAiJVhIVE1MLnBmeDticiIgPgotPCFFTlRJVFkgJSBzcGFuLnFuYW1lICAgICIlWEhUTUwucGZ4O3NwYW4iID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pc21hcC0xLm1vZCAoYWxzbyBjc2lzbWFwLCBzc2lzbWFwKSAtLT4KLTwhRU5USVRZICUgbWFwLnFuYW1lICAgICAiJVhIVE1MLnBmeDttYXAiID4KLTwhRU5USVRZICUgYXJlYS5xbmFtZSAgICAiJVhIVE1MLnBmeDthcmVhIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtbGluay0xLm1vZCAtLT4KLTwhRU5USVRZICUgbGluay5xbmFtZSAgICAiJVhIVE1MLnBmeDtsaW5rIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtbGlzdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgZGwucW5hbWUgICAgICAiJVhIVE1MLnBmeDtkbCIgPgotPCFFTlRJVFkgJSBkdC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2R0IiA+Ci08IUVOVElUWSAlIGRkLnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZGQiID4KLTwhRU5USVRZICUgb2wucW5hbWUgICAgICAiJVhIVE1MLnBmeDtvbCIgPgotPCFFTlRJVFkgJSB1bC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3VsIiA+Ci08IUVOVElUWSAlIGxpLnFuYW1lICAgICAgIiVYSFRNTC5wZng7bGkiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1tZXRhLTEubW9kIC0tPgotPCFFTlRJVFkgJSBtZXRhLnFuYW1lICAgICIlWEhUTUwucGZ4O21ldGEiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1wYXJhbS0xLm1vZCAtLT4KLTwhRU5USVRZICUgcGFyYW0ucW5hbWUgICAiJVhIVE1MLnBmeDtwYXJhbSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLW9iamVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgb2JqZWN0LnFuYW1lICAiJVhIVE1MLnBmeDtvYmplY3QiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1zY3JpcHQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIHNjcmlwdC5xbmFtZSAgIiVYSFRNTC5wZng7c2NyaXB0IiA+Ci08IUVOVElUWSAlIG5vc2NyaXB0LnFuYW1lICAiJVhIVE1MLnBmeDtub3NjcmlwdCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXN0cnVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgaHRtbC5xbmFtZSAgICAiJVhIVE1MLnBmeDtodG1sIiA+Ci08IUVOVElUWSAlIGhlYWQucW5hbWUgICAgIiVYSFRNTC5wZng7aGVhZCIgPgotPCFFTlRJVFkgJSB0aXRsZS5xbmFtZSAgICIlWEhUTUwucGZ4O3RpdGxlIiA+Ci08IUVOVElUWSAlIGJvZHkucW5hbWUgICAgIiVYSFRNTC5wZng7Ym9keSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXN0eWxlLTEubW9kIC0tPgotPCFFTlRJVFkgJSBzdHlsZS5xbmFtZSAgICIlWEhUTUwucGZ4O3N0eWxlIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtdGFibGUtMS5tb2QgLS0+Ci08IUVOVElUWSAlIHRhYmxlLnFuYW1lICAgIiVYSFRNTC5wZng7dGFibGUiID4KLTwhRU5USVRZICUgY2FwdGlvbi5xbmFtZSAiJVhIVE1MLnBmeDtjYXB0aW9uIiA+Ci08IUVOVElUWSAlIHRoZWFkLnFuYW1lICAgIiVYSFRNTC5wZng7dGhlYWQiID4KLTwhRU5USVRZICUgdGZvb3QucW5hbWUgICAiJVhIVE1MLnBmeDt0Zm9vdCIgPgotPCFFTlRJVFkgJSB0Ym9keS5xbmFtZSAgICIlWEhUTUwucGZ4O3Rib2R5IiA+Ci08IUVOVElUWSAlIGNvbGdyb3VwLnFuYW1lICAiJVhIVE1MLnBmeDtjb2xncm91cCIgPgotPCFFTlRJVFkgJSBjb2wucW5hbWUgICAgICIlWEhUTUwucGZ4O2NvbCIgPgotPCFFTlRJVFkgJSB0ci5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3RyIiA+Ci08IUVOVElUWSAlIHRoLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dGgiID4KLTwhRU5USVRZICUgdGQucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0ZCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXJ1YnktMS5tb2QgLS0+Ci0KLTwhRU5USVRZICUgcnVieS5xbmFtZSAgICAiJVhIVE1MLnBmeDtydWJ5IiA+Ci08IUVOVElUWSAlIHJiYy5xbmFtZSAgICAgIiVYSFRNTC5wZng7cmJjIiA+Ci08IUVOVElUWSAlIHJ0Yy5xbmFtZSAgICAgIiVYSFRNTC5wZng7cnRjIiA+Ci08IUVOVElUWSAlIHJiLnFuYW1lICAgICAgIiVYSFRNTC5wZng7cmIiID4KLTwhRU5USVRZICUgcnQucW5hbWUgICAgICAiJVhIVE1MLnBmeDtydCIgPgotPCFFTlRJVFkgJSBycC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3JwIiA+Ci0KLTwhLS0gUHJvdmlzaW9uYWwgWEhUTUwgMi4wIFF1YWxpZmllZCBOYW1lcyAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbWFnZS0yLm1vZCAtLT4KLTwhRU5USVRZICUgYWx0LnFuYW1lICAgICAiJVhIVE1MLnBmeDthbHQiID4KLQotPCEtLSBlbmQgb2YgeGh0bWwtcW5hbWUtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ldmVudHMubW9kdWxlICJJR05PUkUiID4KLTwhWyV4aHRtbC1ldmVudHMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtZXZlbnRzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgSW50cmluc2ljIEV2ZW50cyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWV2ZW50cy0xLm1vZCIgPgotJXhodG1sLWV2ZW50cy5tb2Q7XV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYXR0cmlicy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1hdHRyaWJzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWF0dHJpYnMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDb21tb24gQXR0cmlidXRlcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWF0dHJpYnMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQ29tbW9uIEF0dHJpYnV0ZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYXR0cmlicy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ29tbW9uIEF0dHJpYnV0ZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1hdHRyaWJzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIENvbW1vbiBBdHRyaWJ1dGVzCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgbWFueSBvZiB0aGUgY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHRoZSBYSFRNTCBEVEQuCi0gICAgICVOUy5kZWNsLmF0dHJpYjsgaXMgZGVjbGFyZWQgaW4gdGhlIFhIVE1MIFFuYW1lIG1vZHVsZS4KLS0tPgotCi08IUVOVElUWSAlIGlkLmF0dHJpYgotICAgICAiaWQgICAgICAgICAgIElEICAgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSBjbGFzcy5hdHRyaWIKLSAgICAgImNsYXNzICAgICAgICBOTVRPS0VOUyAgICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgdGl0bGUuYXR0cmliCi0gICAgICJ0aXRsZSAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIENvcmUuZXh0cmEuYXR0cmliICIiID4KLQotPCFFTlRJVFkgJSBDb3JlLmF0dHJpYgotICAgICAiJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVpZC5hdHRyaWI7Ci0gICAgICAlY2xhc3MuYXR0cmliOwotICAgICAgJXRpdGxlLmF0dHJpYjsKLSAgICAgICVDb3JlLmV4dHJhLmF0dHJpYjsiCi0+Ci0KLTwhRU5USVRZICUgbGFuZy5hdHRyaWIKLSAgICAgInhtbDpsYW5nICAgICAlTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlOyAgI0lNUExJRUQiCi0+Ci0KLTwhWyVYSFRNTC5iaWRpO1sKLTwhRU5USVRZICUgZGlyLmF0dHJpYgotICAgICAiZGlyICAgICAgICAgICggbHRyIHwgcnRsICkgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSBJMThuLmF0dHJpYgotICAgICAiJWRpci5hdHRyaWI7Ci0gICAgICAlbGFuZy5hdHRyaWI7IgotPgotCi1dXT4KLTwhRU5USVRZICUgSTE4bi5hdHRyaWIKLSAgICAgIiVsYW5nLmF0dHJpYjsiCi0+Ci0KLTwhRU5USVRZICUgQ29tbW9uLmV4dHJhLmF0dHJpYiAiIiA+Ci0KLTwhLS0gaW50cmluc2ljIGV2ZW50IGF0dHJpYnV0ZXMgZGVjbGFyZWQgcHJldmlvdXNseQotLS0+Ci08IUVOVElUWSAlIEV2ZW50cy5hdHRyaWIgIiIgPgotCi08IUVOVElUWSAlIENvbW1vbi5hdHRyaWIKLSAgICAgIiVDb3JlLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgICVFdmVudHMuYXR0cmliOwotICAgICAgJUNvbW1vbi5leHRyYS5hdHRyaWI7IgotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1hdHRyaWJzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gcGxhY2Vob2xkZXIgZm9yIGNvbnRlbnQgbW9kZWwgcmVkZWNsYXJhdGlvbnMgLS0+Ci08IUVOVElUWSAlIHhodG1sLW1vZGVsLnJlZGVjbCAiIiA+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1tb2RlbC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1tb2RlbC5tb2R1bGU7WwotPCEtLSBpbnN0YW50aWF0ZSB0aGUgRG9jdW1lbnQgTW9kZWwgbW9kdWxlIGRlY2xhcmVkIGluIHRoZSBEVEQgZHJpdmVyCi0tLT4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIE1vYmlsZSAxLjAgRG9jdW1lbnQgTW9kZWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLW1vYmlsZTEwLW1vZGVsLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCBNb2JpbGUsIGEgcHJvcGVyIHN1YnNldCBvZiBYSFRNTC4KLSAgICAgCUBXaXJlbGVzcyBBcHBsaWNhdGlvbiBQcm90b2NvbCBGb3J1bSwgTHRkLiAyMDAxLgotCi0JVGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgV2lyZWxlc3MgQXBwbGljYXRpb24gUHJvdG9jb2wgRm9ydW0gTHRkLiAKLQlXZWIgc2l0ZSAoaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvd2hhdC9jb3B5cmlnaHQuaHRtKS4KLSAgICAKLS0tPgotPCEtLSBYSFRNTCBNb2JpbGUgRG9jdW1lbnQgTW9kZWwKLQotICAgICBUaGlzIG1vZHVsZSBkZXNjcmliZXMgdGhlIGdyb3VwaW5ncyBvZiBlbGVtZW50cyB0aGF0IG1ha2UgdXAKLSAgICAgY29tbW9uIGNvbnRlbnQgbW9kZWxzIGZvciBYSFRNTCBlbGVtZW50cy4KLS0tPgotCi08IS0tIE9wdGlvbmFsIEVsZW1lbnRzIGluIGhlYWQgIC4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIEhlYWRPcHRzLm1peAotICAgICAiKCAlbWV0YS5xbmFtZTsgfCAlbGluay5xbmFtZTsgfCAlb2JqZWN0LnFuYW1lOyB8ICVzdHlsZS5xbmFtZTsgKSoiID4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBNaXNjLmNsYXNzICIiID4KLQotPCEtLSBJbmxpbmUgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBJbmxTdHJ1Y3QuY2xhc3MgIiVici5xbmFtZTsgfCAlc3Bhbi5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxQaHJhcy5jbGFzcwotICAgICAifCAlZW0ucW5hbWU7IHwgJXN0cm9uZy5xbmFtZTsgfCAlZGZuLnFuYW1lOyB8ICVjb2RlLnFuYW1lOwotICAgICAgfCAlc2FtcC5xbmFtZTsgfCAla2JkLnFuYW1lOyB8ICV2YXIucW5hbWU7IHwgJWNpdGUucW5hbWU7Ci0gICAgICB8ICVhYmJyLnFuYW1lOyB8ICVhY3JvbnltLnFuYW1lOyB8ICVxLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubFByZXMuY2xhc3MKLSAgICAgInwgJWkucW5hbWU7IHwgJWIucW5hbWU7IHwgJWJpZy5xbmFtZTsgfCAlc21hbGwucW5hbWU7ICIgPgotCi0KLTwhRU5USVRZICUgSTE4bi5jbGFzcyAiIiA+Ci0KLTwhRU5USVRZICUgQW5jaG9yLmNsYXNzICJ8ICVhLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubFNwZWNpYWwuY2xhc3MgInwgJWltZy5xbmFtZTsgfCAlb2JqZWN0LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubEZvcm0uY2xhc3MKLSAgICAgInwgJWlucHV0LnFuYW1lOyB8ICVzZWxlY3QucW5hbWU7IHwgJXRleHRhcmVhLnFuYW1lOwotICAgICAgfCAlbGFiZWwucW5hbWU7IgotPgotCi08IUVOVElUWSAlIElubGluZS5leHRyYSAiIiA+Ci0KLTwhRU5USVRZICUgSW5saW5lLmNsYXNzCi0gICAgICIlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubEZvcm0uY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyIKLT4KLQotPCFFTlRJVFkgJSBJbmxOb0FuY2hvci5jbGFzcwotICAgICAiJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubEZvcm0uY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyIKLT4KLQotPCFFTlRJVFkgJSBJbmxOb0FuY2hvci5taXgKLSAgICAgIiVJbmxOb0FuY2hvci5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCFFTlRJVFkgJSBJbmxpbmUubWl4Ci0gICAgICIlSW5saW5lLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tIEJsb2NrIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIEhlYWRpbmcuY2xhc3MKLSAgICAgIiVoMS5xbmFtZTsgfCAlaDIucW5hbWU7IHwgJWgzLnFuYW1lOwotICAgICAgfCAlaDQucW5hbWU7IHwgJWg1LnFuYW1lOyB8ICVoNi5xbmFtZTsiCi0+Ci08IUVOVElUWSAlIExpc3QuY2xhc3MgICIldWwucW5hbWU7IHwgJW9sLnFuYW1lOyB8ICVkbC5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBUYWJsZS5jbGFzcyAifCAldGFibGUucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgRm9ybS5jbGFzcyAgInwgJWZvcm0ucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgRmllbGRzZXQuY2xhc3MgICJ8ICVmaWVsZHNldC5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBCbGtTdHJ1Y3QuY2xhc3MgIiVwLnFuYW1lOyB8ICVkaXYucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrUGhyYXMuY2xhc3MKLSAgICAgInwgJXByZS5xbmFtZTsgfCAlYmxvY2txdW90ZS5xbmFtZTsgfCAlYWRkcmVzcy5xbmFtZTsiCi0+Ci0KLTwhRU5USVRZICUgQmxrUHJlcy5jbGFzcyAifCAlaHIucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrU3BlY2lhbC5jbGFzcwotICAgICAiJVRhYmxlLmNsYXNzOwotICAgICAgJUZvcm0uY2xhc3M7Ci0gICAgICAlRmllbGRzZXQuY2xhc3M7IgotPgotCi08IUVOVElUWSAlIEJsb2NrLmV4dHJhICIiID4KLQotPCFFTlRJVFkgJSBCbG9jay5jbGFzcwotICAgICAiJUJsa1N0cnVjdC5jbGFzczsKLSAgICAgICVCbGtQaHJhcy5jbGFzczsKLSAgICAgICVCbGtQcmVzLmNsYXNzOwotICAgICAgJUJsa1NwZWNpYWwuY2xhc3M7Ci0gICAgICAlQmxvY2suZXh0cmE7IgotPgotCi08IUVOVElUWSAlIEJsa05vRm9ybS5taXgKLSAgICAgIiVIZWFkaW5nLmNsYXNzOwotICAgICAgfCAlTGlzdC5jbGFzczsKLSAgICAgIHwgJUJsa1N0cnVjdC5jbGFzczsKLSAgICAgICVCbGtQaHJhcy5jbGFzczsKLSAgICAgICVCbGtQcmVzLmNsYXNzOwotICAgICAgJVRhYmxlLmNsYXNzOwotICAgICAgJUJsb2NrLmV4dHJhOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IUVOVElUWSAlIEJsb2NrLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxvY2suY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gQWxsIENvbnRlbnQgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gZGVjbGFyZXMgYWxsIGNvbnRlbnQgZXhjZXB0IHRhYmxlcwotLS0+Ci08IUVOVElUWSAlIEZsb3dOb1RhYmxlLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxrU3RydWN0LmNsYXNzOwotICAgICAgJUJsa1BocmFzLmNsYXNzOwotICAgICAgJUZvcm0uY2xhc3M7Ci0gICAgICAlQmxvY2suZXh0cmE7Ci0gICAgICB8ICVJbmxpbmUuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLQotPCFFTlRJVFkgJSBGbG93Lm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxvY2suY2xhc3M7Ci0gICAgICB8ICVJbmxpbmUuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLW1vYmlsZTEwLW1vZGVsLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtY2hhcmVudC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1jaGFyZW50Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWNoYXJlbnQubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDaGFyYWN0ZXIgRW50aXRpZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1jaGFyZW50LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIENoYXJhY3RlciBFbnRpdGllcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1jaGFyZW50LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDaGFyYWN0ZXIgRW50aXRpZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1jaGFyZW50LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIENoYXJhY3RlciBFbnRpdGllcyBmb3IgWEhUTUwKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgc2V0IG9mIGNoYXJhY3RlciBlbnRpdGllcyBmb3IgWEhUTUwsCi0gICAgIGluY2x1ZGluZyB0aGUgTGF0aW4gMSwgU3ltYm9sIGFuZCBTcGVjaWFsIGNoYXJhY3RlciBjb2xsZWN0aW9ucy4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWxhdDEKLSAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMSBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAieGh0bWwtbGF0MS5lbnQiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWE1MLWNvbXBhdGlibGUgSVNPIExhdGluIDEgQ2hhcmFjdGVyIEVudGl0eSBTZXQgZm9yIFhIVE1MIC4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbGF0MS5lbnQKLQotICAgICBUeXBpY2FsIGludm9jYXRpb246Ci0KLSAgICAgICA8IUVOVElUWSAlIHhodG1sLWxhdDEKLSAgICAgICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgICAgICAgICJ4aHRtbC1sYXQxLmVudCIgPgotICAgICAgICV4aHRtbC1sYXQxOwotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxIGZvciBYSFRNTC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGF0MS5lbnQiCi0KLSAgICAgUmV2aXNpb246ICAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoIGNvbmZvcm1pbmcKLSAgICAgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbiBJU08gODg3OSwgcHJvdmlkZWQKLSAgICAgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotCi08IUVOVElUWSBuYnNwICAgIiYjMTYwOyIgPjwhLS0gbm8tYnJlYWsgc3BhY2UgPSBub24tYnJlYWtpbmcgc3BhY2UsIFUrMDBBMCBJU09udW0gLS0+Ci08IUVOVElUWSBpZXhjbCAgIiYjMTYxOyIgPjwhLS0gaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyaywgVSswMEExIElTT251bSAtLT4KLTwhRU5USVRZIGNlbnQgICAiJiMxNjI7IiA+PCEtLSBjZW50IHNpZ24sIFUrMDBBMiBJU09udW0gLS0+Ci08IUVOVElUWSBwb3VuZCAgIiYjMTYzOyIgPjwhLS0gcG91bmQgc2lnbiwgVSswMEEzIElTT251bSAtLT4KLTwhRU5USVRZIGN1cnJlbiAiJiMxNjQ7IiA+PCEtLSBjdXJyZW5jeSBzaWduLCBVKzAwQTQgSVNPbnVtIC0tPgotPCFFTlRJVFkgeWVuICAgICImIzE2NTsiID48IS0tIHllbiBzaWduID0geXVhbiBzaWduLCBVKzAwQTUgSVNPbnVtIC0tPgotPCFFTlRJVFkgYnJ2YmFyICImIzE2NjsiID48IS0tIGJyb2tlbiBiYXIgPSBicm9rZW4gdmVydGljYWwgYmFyLCBVKzAwQTYgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2VjdCAgICImIzE2NzsiID48IS0tIHNlY3Rpb24gc2lnbiwgVSswMEE3IElTT251bSAtLT4KLTwhRU5USVRZIHVtbCAgICAiJiMxNjg7IiA+PCEtLSBkaWFlcmVzaXMgPSBzcGFjaW5nIGRpYWVyZXNpcywgVSswMEE4IElTT2RpYSAtLT4KLTwhRU5USVRZIGNvcHkgICAiJiMxNjk7IiA+PCEtLSBjb3B5cmlnaHQgc2lnbiwgVSswMEE5IElTT251bSAtLT4KLTwhRU5USVRZIG9yZGYgICAiJiMxNzA7IiA+PCEtLSBmZW1pbmluZSBvcmRpbmFsIGluZGljYXRvciwgVSswMEFBIElTT251bSAtLT4KLTwhRU5USVRZIGxhcXVvICAiJiMxNzE7IiA+PCEtLSBsZWZ0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyayA9IGxlZnQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQUIgSVNPbnVtIC0tPgotPCFFTlRJVFkgbm90ICAgICImIzE3MjsiID48IS0tIG5vdCBzaWduLCBVKzAwQUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2h5ICAgICImIzE3MzsiID48IS0tIHNvZnQgaHlwaGVuID0gZGlzY3JldGlvbmFyeSBoeXBoZW4sIFUrMDBBRCBJU09udW0gLS0+Ci08IUVOVElUWSByZWcgICAgIiYjMTc0OyIgPjwhLS0gcmVnaXN0ZXJlZCBzaWduID0gcmVnaXN0ZXJlZCB0cmFkZSBtYXJrIHNpZ24sIFUrMDBBRSBJU09udW0gLS0+Ci08IUVOVElUWSBtYWNyICAgIiYjMTc1OyIgPjwhLS0gbWFjcm9uID0gc3BhY2luZyBtYWNyb24gPSBvdmVybGluZSA9IEFQTCBvdmVyYmFyLCBVKzAwQUYgSVNPZGlhIC0tPgotPCFFTlRJVFkgZGVnICAgICImIzE3NjsiID48IS0tIGRlZ3JlZSBzaWduLCBVKzAwQjAgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGx1c21uICImIzE3NzsiID48IS0tIHBsdXMtbWludXMgc2lnbiA9IHBsdXMtb3ItbWludXMgc2lnbiwgVSswMEIxIElTT251bSAtLT4KLTwhRU5USVRZIHN1cDIgICAiJiMxNzg7IiA+PCEtLSBzdXBlcnNjcmlwdCB0d28gPSBzdXBlcnNjcmlwdCBkaWdpdCB0d28gPSBzcXVhcmVkLCBVKzAwQjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMyAgICImIzE3OTsiID48IS0tIHN1cGVyc2NyaXB0IHRocmVlID0gc3VwZXJzY3JpcHQgZGlnaXQgdGhyZWUgPSBjdWJlZCwgVSswMEIzIElTT251bSAtLT4KLTwhRU5USVRZIGFjdXRlICAiJiMxODA7IiA+PCEtLSBhY3V0ZSBhY2NlbnQgPSBzcGFjaW5nIGFjdXRlLCBVKzAwQjQgSVNPZGlhIC0tPgotPCFFTlRJVFkgbWljcm8gICImIzE4MTsiID48IS0tIG1pY3JvIHNpZ24sIFUrMDBCNSBJU09udW0gLS0+Ci08IUVOVElUWSBwYXJhICAgIiYjMTgyOyIgPjwhLS0gcGlsY3JvdyBzaWduID0gcGFyYWdyYXBoIHNpZ24sIFUrMDBCNiBJU09udW0gLS0+Ci08IUVOVElUWSBtaWRkb3QgIiYjMTgzOyIgPjwhLS0gbWlkZGxlIGRvdCA9IEdlb3JnaWFuIGNvbW1hID0gR3JlZWsgbWlkZGxlIGRvdCwgVSswMEI3IElTT251bSAtLT4KLTwhRU5USVRZIGNlZGlsICAiJiMxODQ7IiA+PCEtLSBjZWRpbGxhID0gc3BhY2luZyBjZWRpbGxhLCBVKzAwQjggSVNPZGlhIC0tPgotPCFFTlRJVFkgc3VwMSAgICImIzE4NTsiID48IS0tIHN1cGVyc2NyaXB0IG9uZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IG9uZSwgVSswMEI5IElTT251bSAtLT4KLTwhRU5USVRZIG9yZG0gICAiJiMxODY7IiA+PCEtLSBtYXNjdWxpbmUgb3JkaW5hbCBpbmRpY2F0b3IsIFUrMDBCQSBJU09udW0gLS0+Ci08IUVOVElUWSByYXF1byAgIiYjMTg3OyIgPjwhLS0gcmlnaHQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrID0gcmlnaHQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQkIgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzE0ICImIzE4ODsiID48IS0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgcXVhcnRlciA9IGZyYWN0aW9uIG9uZSBxdWFydGVyLCBVKzAwQkMgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzEyICImIzE4OTsiID48IS0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgaGFsZiA9IGZyYWN0aW9uIG9uZSBoYWxmLCBVKzAwQkQgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzM0ICImIzE5MDsiID48IS0tIHZ1bGdhciBmcmFjdGlvbiB0aHJlZSBxdWFydGVycyA9IGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzLCBVKzAwQkUgSVNPbnVtIC0tPgotPCFFTlRJVFkgaXF1ZXN0ICImIzE5MTsiID48IS0tIGludmVydGVkIHF1ZXN0aW9uIG1hcmsgPSB0dXJuZWQgcXVlc3Rpb24gbWFyaywgVSswMEJGIElTT251bSAtLT4KLTwhRU5USVRZIEFncmF2ZSAiJiMxOTI7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEEgd2l0aCBncmF2ZSA9IGxhdGluIGNhcGl0YWwgQSBncmF2ZSwgVSswMEMwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBYWN1dGUgIiYjMTkzOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBBIHdpdGggYWN1dGUsIFUrMDBDMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgQWNpcmMgICImIzE5NDsiID48IS0tIGxhdGluIGNhcGl0YWwgQSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBDMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXRpbGRlICImIzE5NTsiID48IS0tIGxhdGluIGNhcGl0YWwgQSB3aXRoIHRpbGRlLCBVKzAwQzMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEF1bWwgICAiJiMxOTY7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEEgd2l0aCBkaWFlcmVzaXMsIFUrMDBDNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXJpbmcgICImIzE5NzsiID48IS0tIGxhdGluIGNhcGl0YWwgQSB3aXRoIHJpbmcgYWJvdmUgPSBsYXRpbiBjYXBpdGFsIEEgcmluZywgVSswMEM1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBBRWxpZyAgIiYjMTk4OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBBRSA9IGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgQUUsIFUrMDBDNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQ2NlZGlsICImIzE5OTsiID48IS0tIGxhdGluIGNhcGl0YWwgQyB3aXRoIGNlZGlsbGEsIFUrMDBDNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWdyYXZlICImIzIwMDsiID48IS0tIGxhdGluIGNhcGl0YWwgRSB3aXRoIGdyYXZlLCBVKzAwQzggSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVhY3V0ZSAiJiMyMDE7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEUgd2l0aCBhY3V0ZSwgVSswMEM5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFY2lyYyAgIiYjMjAyOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBFIHdpdGggY2lyY3VtZmxleCwgVSswMENBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFdW1sICAgIiYjMjAzOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBFIHdpdGggZGlhZXJlc2lzLCBVKzAwQ0IgSVNPbGF0MSAtLT4KLTwhRU5USVRZIElncmF2ZSAiJiMyMDQ7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEkgd2l0aCBncmF2ZSwgVSswMENDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJYWN1dGUgIiYjMjA1OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBJIHdpdGggYWN1dGUsIFUrMDBDRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWNpcmMgICImIzIwNjsiID48IS0tIGxhdGluIGNhcGl0YWwgSSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBDRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgSXVtbCAgICImIzIwNzsiID48IS0tIGxhdGluIGNhcGl0YWwgSSB3aXRoIGRpYWVyZXNpcywgVSswMENGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFVEggICAgIiYjMjA4OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBFVEgsIFUrMDBEMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgTnRpbGRlICImIzIwOTsiID48IS0tIGxhdGluIGNhcGl0YWwgTiB3aXRoIHRpbGRlLCBVKzAwRDEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9ncmF2ZSAiJiMyMTA7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIE8gd2l0aCBncmF2ZSwgVSswMEQyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPYWN1dGUgIiYjMjExOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBPIHdpdGggYWN1dGUsIFUrMDBEMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2NpcmMgICImIzIxMjsiID48IS0tIGxhdGluIGNhcGl0YWwgTyB3aXRoIGNpcmN1bWZsZXgsIFUrMDBENCBJU09sYXQxIC0tPgotPCFFTlRJVFkgT3RpbGRlICImIzIxMzsiID48IS0tIGxhdGluIGNhcGl0YWwgTyB3aXRoIHRpbGRlLCBVKzAwRDUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE91bWwgICAiJiMyMTQ7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIE8gd2l0aCBkaWFlcmVzaXMsIFUrMDBENiBJU09sYXQxIC0tPgotPCFFTlRJVFkgdGltZXMgICImIzIxNTsiID48IS0tIG11bHRpcGxpY2F0aW9uIHNpZ24sIFUrMDBENyBJU09udW0gLS0+Ci08IUVOVElUWSBPc2xhc2ggIiYjMjE2OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBPIHdpdGggc3Ryb2tlID0gbGF0aW4gY2FwaXRhbCBPIHNsYXNoLCBVKzAwRDggSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVncmF2ZSAiJiMyMTc7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIFUgd2l0aCBncmF2ZSwgVSswMEQ5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBVYWN1dGUgIiYjMjE4OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBVIHdpdGggYWN1dGUsIFUrMDBEQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWNpcmMgICImIzIxOTsiID48IS0tIGxhdGluIGNhcGl0YWwgVSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBEQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgVXVtbCAgICImIzIyMDsiID48IS0tIGxhdGluIGNhcGl0YWwgVSB3aXRoIGRpYWVyZXNpcywgVSswMERDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBZYWN1dGUgIiYjMjIxOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBZIHdpdGggYWN1dGUsIFUrMDBERCBJU09sYXQxIC0tPgotPCFFTlRJVFkgVEhPUk4gICImIzIyMjsiID48IS0tIGxhdGluIGNhcGl0YWwgVEhPUk4sIFUrMDBERSBJU09sYXQxIC0tPgotPCFFTlRJVFkgc3psaWcgICImIzIyMzsiID48IS0tIGxhdGluIHNtYWxsIHNoYXJwIHMgPSBlc3MtemVkLCBVKzAwREYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFncmF2ZSAiJiMyMjQ7IiA+PCEtLSBsYXRpbiBzbWFsbCBhIHdpdGggZ3JhdmUgPSBsYXRpbiBzbWFsbCBhIGdyYXZlLCBVKzAwRTAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFhY3V0ZSAiJiMyMjU7IiA+PCEtLSBsYXRpbiBzbWFsbCBhIHdpdGggYWN1dGUsIFUrMDBFMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWNpcmMgICImIzIyNjsiID48IS0tIGxhdGluIHNtYWxsIGEgd2l0aCBjaXJjdW1mbGV4LCBVKzAwRTIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGF0aWxkZSAiJiMyMjc7IiA+PCEtLSBsYXRpbiBzbWFsbCBhIHdpdGggdGlsZGUsIFUrMDBFMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXVtbCAgICImIzIyODsiID48IS0tIGxhdGluIHNtYWxsIGEgd2l0aCBkaWFlcmVzaXMsIFUrMDBFNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXJpbmcgICImIzIyOTsiID48IS0tIGxhdGluIHNtYWxsIGEgd2l0aCByaW5nIGFib3ZlID0gbGF0aW4gc21hbGwgYSByaW5nLCBVKzAwRTUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFlbGlnICAiJiMyMzA7IiA+PCEtLSBsYXRpbiBzbWFsbCBhZSA9IGxhdGluIHNtYWxsIGxpZ2F0dXJlIGFlLCBVKzAwRTYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGNjZWRpbCAiJiMyMzE7IiA+PCEtLSBsYXRpbiBzbWFsbCBjIHdpdGggY2VkaWxsYSwgVSswMEU3IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlZ3JhdmUgIiYjMjMyOyIgPjwhLS0gbGF0aW4gc21hbGwgZSB3aXRoIGdyYXZlLCBVKzAwRTggSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVhY3V0ZSAiJiMyMzM7IiA+PCEtLSBsYXRpbiBzbWFsbCBlIHdpdGggYWN1dGUsIFUrMDBFOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWNpcmMgICImIzIzNDsiID48IS0tIGxhdGluIHNtYWxsIGUgd2l0aCBjaXJjdW1mbGV4LCBVKzAwRUEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGV1bWwgICAiJiMyMzU7IiA+PCEtLSBsYXRpbiBzbWFsbCBlIHdpdGggZGlhZXJlc2lzLCBVKzAwRUIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGlncmF2ZSAiJiMyMzY7IiA+PCEtLSBsYXRpbiBzbWFsbCBpIHdpdGggZ3JhdmUsIFUrMDBFQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWFjdXRlICImIzIzNzsiID48IS0tIGxhdGluIHNtYWxsIGkgd2l0aCBhY3V0ZSwgVSswMEVEIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpY2lyYyAgIiYjMjM4OyIgPjwhLS0gbGF0aW4gc21hbGwgaSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBFRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgaXVtbCAgICImIzIzOTsiID48IS0tIGxhdGluIHNtYWxsIGkgd2l0aCBkaWFlcmVzaXMsIFUrMDBFRiBJU09sYXQxIC0tPgotPCFFTlRJVFkgZXRoICAgICImIzI0MDsiID48IS0tIGxhdGluIHNtYWxsIGV0aCwgVSswMEYwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBudGlsZGUgIiYjMjQxOyIgPjwhLS0gbGF0aW4gc21hbGwgbiB3aXRoIHRpbGRlLCBVKzAwRjEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9ncmF2ZSAiJiMyNDI7IiA+PCEtLSBsYXRpbiBzbWFsbCBvIHdpdGggZ3JhdmUsIFUrMDBGMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2FjdXRlICImIzI0MzsiID48IS0tIGxhdGluIHNtYWxsIG8gd2l0aCBhY3V0ZSwgVSswMEYzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvY2lyYyAgIiYjMjQ0OyIgPjwhLS0gbGF0aW4gc21hbGwgbyB3aXRoIGNpcmN1bWZsZXgsIFUrMDBGNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgb3RpbGRlICImIzI0NTsiID48IS0tIGxhdGluIHNtYWxsIG8gd2l0aCB0aWxkZSwgVSswMEY1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdW1sICAgIiYjMjQ2OyIgPjwhLS0gbGF0aW4gc21hbGwgbyB3aXRoIGRpYWVyZXNpcywgVSswMEY2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBkaXZpZGUgIiYjMjQ3OyIgPjwhLS0gZGl2aXNpb24gc2lnbiwgVSswMEY3IElTT251bSAtLT4KLTwhRU5USVRZIG9zbGFzaCAiJiMyNDg7IiA+PCEtLSBsYXRpbiBzbWFsbCBvIHdpdGggc3Ryb2tlLCA9IGxhdGluIHNtYWxsIG8gc2xhc2gsIFUrMDBGOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWdyYXZlICImIzI0OTsiID48IS0tIGxhdGluIHNtYWxsIHUgd2l0aCBncmF2ZSwgVSswMEY5IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1YWN1dGUgIiYjMjUwOyIgPjwhLS0gbGF0aW4gc21hbGwgdSB3aXRoIGFjdXRlLCBVKzAwRkEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVjaXJjICAiJiMyNTE7IiA+PCEtLSBsYXRpbiBzbWFsbCB1IHdpdGggY2lyY3VtZmxleCwgVSswMEZCIElTT2xhdDEgLS0+Ci08IUVOVElUWSB1dW1sICAgIiYjMjUyOyIgPjwhLS0gbGF0aW4gc21hbGwgdSB3aXRoIGRpYWVyZXNpcywgVSswMEZDIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5YWN1dGUgIiYjMjUzOyIgPjwhLS0gbGF0aW4gc21hbGwgeSB3aXRoIGFjdXRlLCBVKzAwRkQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRob3JuICAiJiMyNTQ7IiA+PCEtLSBsYXRpbiBzbWFsbCB0aG9ybiB3aXRoLCBVKzAwRkUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHl1bWwgICAiJiMyNTU7IiA+PCEtLSBsYXRpbiBzbWFsbCB5IHdpdGggZGlhZXJlc2lzLCBVKzAwRkYgSVNPbGF0MSAtLT4KLTwhLS0gZW5kIG9mIHhodG1sLWxhdDEuZW50IC0tPgotCi0KLTwhRU5USVRZICUgeGh0bWwtc3ltYm9sCi0gICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgInhodG1sLXN5bWJvbC5lbnQiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gSVNPIE1hdGgsIEdyZWVrIGFuZCBTeW1ib2xpYyBDaGFyYWN0ZXIgRW50aXR5IFNldCBmb3IgWEhUTUwgLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtc3ltYm9sLmVudAotCi0gICAgIFR5cGljYWwgaW52b2NhdGlvbjoKLQotICAgICAgIDwhRU5USVRZICUgeGh0bWwtc3ltYm9sCi0gICAgICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICAgICAgICAgICAieGh0bWwtc3ltYm9sLmVudCIgPgotICAgICAgICV4aHRtbC1zeW1ib2w7Ci0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMgZm9yIFhIVE1MLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zeW1ib2wuZW50IgotCi0gICAgIFJldmlzaW9uOiAgJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aCBjb25mb3JtaW5nCi0gICAgIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4gSVNPIDg4NzksIHByb3ZpZGVkCi0gICAgIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IFtTR01MXSBsaXN0KSBkbyBub3QgY2xhc2ggd2l0aAotICAgICBhbnkgZXhpc3RpbmcgSVNPIDg4NzkgZW50aXR5IG5hbWVzLiBJU08gMTA2NDYgW0lTTzEwNjQ2XSBjaGFyYWN0ZXIKLSAgICAgbnVtYmVycyBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIEVudGl0eSB2YWx1ZXMgYXJlCi0gICAgIGRlY2ltYWwgY29udmVyc2lvbnMgb2YgdGhlIElTTyAxMDY0NiB2YWx1ZXMgYW5kIHJlZmVyIHRvIHRoZQotICAgICBkb2N1bWVudCBjaGFyYWN0ZXIgc2V0LiBOYW1lcyBhcmUgVW5pY29kZSBbVU5JQ09ERV0gbmFtZXMuCi0tLT4KLQotPCEtLSBMYXRpbiBFeHRlbmRlZC1CIC0tPgotPCFFTlRJVFkgZm5vZiAgICAgIiYjNDAyOyIgPjwhLS0gbGF0aW4gc21hbGwgZiB3aXRoIGhvb2sgPSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmbG9yaW4sIFUrMDE5MiBJU090ZWNoIC0tPgotCi08IS0tIEdyZWVrIC0tPgotPCFFTlRJVFkgQWxwaGEgICAgIiYjOTEzOyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYWxwaGEsIFUrMDM5MSAtLT4KLTwhRU5USVRZIEJldGEgICAgICImIzkxNDsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGJldGEsIFUrMDM5MiAtLT4KLTwhRU5USVRZIEdhbW1hICAgICImIzkxNTsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGdhbW1hLCBVKzAzOTMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIERlbHRhICAgICImIzkxNjsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGRlbHRhLCBVKzAzOTQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIEVwc2lsb24gICImIzkxNzsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGVwc2lsb24sIFUrMDM5NSAtLT4KLTwhRU5USVRZIFpldGEgICAgICImIzkxODsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHpldGEsIFUrMDM5NiAtLT4KLTwhRU5USVRZIEV0YSAgICAgICImIzkxOTsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGV0YSwgVSswMzk3IC0tPgotPCFFTlRJVFkgVGhldGEgICAgIiYjOTIwOyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGhldGEsIFUrMDM5OCBJU09ncmszIC0tPgotPCFFTlRJVFkgSW90YSAgICAgIiYjOTIxOyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgaW90YSwgVSswMzk5IC0tPgotPCFFTlRJVFkgS2FwcGEgICAgIiYjOTIyOyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIga2FwcGEsIFUrMDM5QSAtLT4KLTwhRU5USVRZIExhbWJkYSAgICImIzkyMzsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGxhbWJkYSwgVSswMzlCIElTT2dyazMgLS0+Ci08IUVOVElUWSBNdSAgICAgICAiJiM5MjQ7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBtdSwgVSswMzlDIC0tPgotPCFFTlRJVFkgTnUgICAgICAgIiYjOTI1OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbnUsIFUrMDM5RCAtLT4KLTwhRU5USVRZIFhpICAgICAgICImIzkyNjsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHhpLCBVKzAzOUUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE9taWNyb24gICImIzkyNzsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9taWNyb24sIFUrMDM5RiAtLT4KLTwhRU5USVRZIFBpICAgICAgICImIzkyODsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBpLCBVKzAzQTAgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFJobyAgICAgICImIzkyOTsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHJobywgVSswM0ExIC0tPgotPCEtLSB0aGVyZSBpcyBubyBTaWdtYWYsIGFuZCBubyBVKzAzQTIgY2hhcmFjdGVyIGVpdGhlciAtLT4KLTwhRU5USVRZIFNpZ21hICAgICImIzkzMTsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHNpZ21hLCBVKzAzQTMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFRhdSAgICAgICImIzkzMjsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRhdSwgVSswM0E0IC0tPgotPCFFTlRJVFkgVXBzaWxvbiAgIiYjOTMzOyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBNSBJU09ncmszIC0tPgotPCFFTlRJVFkgUGhpICAgICAgIiYjOTM0OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGhpLCBVKzAzQTYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIENoaSAgICAgICImIzkzNTsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGNoaSwgVSswM0E3IC0tPgotPCFFTlRJVFkgUHNpICAgICAgIiYjOTM2OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcHNpLCBVKzAzQTggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE9tZWdhICAgICImIzkzNzsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9tZWdhLCBVKzAzQTkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGFscGhhICAgICImIzk0NTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBhbHBoYSwgVSswM0IxIElTT2dyazMgLS0+Ci08IUVOVElUWSBiZXRhICAgICAiJiM5NDY7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgYmV0YSwgVSswM0IyIElTT2dyazMgLS0+Ci08IUVOVElUWSBnYW1tYSAgICAiJiM5NDc7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZ2FtbWEsIFUrMDNCMyBJU09ncmszIC0tPgotPCFFTlRJVFkgZGVsdGEgICAgIiYjOTQ4OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGRlbHRhLCBVKzAzQjQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGVwc2lsb24gICImIzk0OTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBlcHNpbG9uLCBVKzAzQjUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHpldGEgICAgICImIzk1MDsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciB6ZXRhLCBVKzAzQjYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGV0YSAgICAgICImIzk1MTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBldGEsIFUrMDNCNyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGhldGEgICAgIiYjOTUyOyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhLCBVKzAzQjggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGlvdGEgICAgICImIzk1MzsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBpb3RhLCBVKzAzQjkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGthcHBhICAgICImIzk1NDsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBrYXBwYSwgVSswM0JBIElTT2dyazMgLS0+Ci08IUVOVElUWSBsYW1iZGEgICAiJiM5NTU7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbGFtYmRhLCBVKzAzQkIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG11ICAgICAgICImIzk1NjsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBtdSwgVSswM0JDIElTT2dyazMgLS0+Ci08IUVOVElUWSBudSAgICAgICAiJiM5NTc7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbnUsIFUrMDNCRCBJU09ncmszIC0tPgotPCFFTlRJVFkgeGkgICAgICAgIiYjOTU4OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHhpLCBVKzAzQkUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG9taWNyb24gICImIzk1OTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBvbWljcm9uLCBVKzAzQkYgTkVXIC0tPgotPCFFTlRJVFkgcGkgICAgICAgIiYjOTYwOyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBpLCBVKzAzQzAgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHJobyAgICAgICImIzk2MTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciByaG8sIFUrMDNDMSBJU09ncmszIC0tPgotPCFFTlRJVFkgc2lnbWFmICAgIiYjOTYyOyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGZpbmFsIHNpZ21hLCBVKzAzQzIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hICAgICImIzk2MzsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBzaWdtYSwgVSswM0MzIElTT2dyazMgLS0+Ci08IUVOVElUWSB0YXUgICAgICAiJiM5NjQ7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGF1LCBVKzAzQzQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHVwc2lsb24gICImIzk2NTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciB1cHNpbG9uLCBVKzAzQzUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBoaSAgICAgICImIzk2NjsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwaGksIFUrMDNDNiBJU09ncmszIC0tPgotPCFFTlRJVFkgY2hpICAgICAgIiYjOTY3OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGNoaSwgVSswM0M3IElTT2dyazMgLS0+Ci08IUVOVElUWSBwc2kgICAgICAiJiM5Njg7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcHNpLCBVKzAzQzggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG9tZWdhICAgICImIzk2OTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBvbWVnYSwgVSswM0M5IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YXN5bSAiJiM5Nzc7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEgc3ltYm9sLCBVKzAzRDEgTkVXIC0tPgotPCFFTlRJVFkgdXBzaWggICAgIiYjOTc4OyIgPjwhLS0gZ3JlZWsgdXBzaWxvbiB3aXRoIGhvb2sgc3ltYm9sLCBVKzAzRDIgTkVXIC0tPgotPCFFTlRJVFkgcGl2ICAgICAgIiYjOTgyOyIgPjwhLS0gZ3JlZWsgcGkgc3ltYm9sLCBVKzAzRDYgSVNPZ3JrMyAtLT4KLQotPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgotPCFFTlRJVFkgYnVsbCAgICAgIiYjODIyNjsiID48IS0tIGJ1bGxldCA9IGJsYWNrIHNtYWxsIGNpcmNsZSwgVSsyMDIyIElTT3B1YiAgLS0+Ci08IS0tIGJ1bGxldCBpcyBOT1QgdGhlIHNhbWUgYXMgYnVsbGV0IG9wZXJhdG9yLCBVKzIyMTkgLS0+Ci08IUVOVElUWSBoZWxsaXAgICAiJiM4MjMwOyIgPjwhLS0gaG9yaXpvbnRhbCBlbGxpcHNpcyA9IHRocmVlIGRvdCBsZWFkZXIsIFUrMjAyNiBJU09wdWIgIC0tPgotPCFFTlRJVFkgcHJpbWUgICAgIiYjODI0MjsiID48IS0tIHByaW1lID0gbWludXRlcyA9IGZlZXQsIFUrMjAzMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgUHJpbWUgICAgIiYjODI0MzsiID48IS0tIGRvdWJsZSBwcmltZSA9IHNlY29uZHMgPSBpbmNoZXMsIFUrMjAzMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb2xpbmUgICAgIiYjODI1NDsiID48IS0tIG92ZXJsaW5lID0gc3BhY2luZyBvdmVyc2NvcmUsIFUrMjAzRSBORVcgLS0+Ci08IUVOVElUWSBmcmFzbCAgICAiJiM4MjYwOyIgPjwhLS0gZnJhY3Rpb24gc2xhc2gsIFUrMjA0NCBORVcgLS0+Ci0KLTwhLS0gTGV0dGVybGlrZSBTeW1ib2xzIC0tPgotPCFFTlRJVFkgd2VpZXJwICAgIiYjODQ3MjsiID48IS0tIHNjcmlwdCBjYXBpdGFsIFAgPSBwb3dlciBzZXQgPSBXZWllcnN0cmFzcyBwLCBVKzIxMTggSVNPYW1zbyAtLT4KLTwhRU5USVRZIGltYWdlICAgICImIzg0NjU7IiA+PCEtLSBibGFja2xldHRlciBjYXBpdGFsIEkgPSBpbWFnaW5hcnkgcGFydCwgVSsyMTExIElTT2Ftc28gLS0+Ci08IUVOVElUWSByZWFsICAgICAiJiM4NDc2OyIgPjwhLS0gYmxhY2tsZXR0ZXIgY2FwaXRhbCBSID0gcmVhbCBwYXJ0IHN5bWJvbCwgVSsyMTFDIElTT2Ftc28gLS0+Ci08IUVOVElUWSB0cmFkZSAgICAiJiM4NDgyOyIgPjwhLS0gdHJhZGUgbWFyayBzaWduLCBVKzIxMjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgYWxlZnN5bSAgIiYjODUwMTsiID48IS0tIGFsZWYgc3ltYm9sID0gZmlyc3QgdHJhbnNmaW5pdGUgY2FyZGluYWwsIFUrMjEzNSBORVcgLS0+Ci08IS0tIGFsZWYgc3ltYm9sIGlzIE5PVCB0aGUgc2FtZSBhcyBoZWJyZXcgbGV0dGVyIGFsZWYsIFUrMDVEMCBhbHRob3VnaAotICAgICB0aGUgc2FtZSBnbHlwaCBjb3VsZCBiZSB1c2VkIHRvIGRlcGljdCBib3RoIGNoYXJhY3RlcnMgLS0+Ci0KLTwhLS0gQXJyb3dzIC0tPgotPCFFTlRJVFkgbGFyciAgICAgIiYjODU5MjsiID48IS0tIGxlZnR3YXJkcyBhcnJvdywgVSsyMTkwIElTT251bSAtLT4KLTwhRU5USVRZIHVhcnIgICAgICImIzg1OTM7IiA+PCEtLSB1cHdhcmRzIGFycm93LCBVKzIxOTEgSVNPbnVtLS0+Ci08IUVOVElUWSByYXJyICAgICAiJiM4NTk0OyIgPjwhLS0gcmlnaHR3YXJkcyBhcnJvdywgVSsyMTkyIElTT251bSAtLT4KLTwhRU5USVRZIGRhcnIgICAgICImIzg1OTU7IiA+PCEtLSBkb3dud2FyZHMgYXJyb3csIFUrMjE5MyBJU09udW0gLS0+Ci08IUVOVElUWSBoYXJyICAgICAiJiM4NTk2OyIgPjwhLS0gbGVmdCByaWdodCBhcnJvdywgVSsyMTk0IElTT2Ftc2EgLS0+Ci08IUVOVElUWSBjcmFyciAgICAiJiM4NjI5OyIgPjwhLS0gZG93bndhcmRzIGFycm93IHdpdGggY29ybmVyIGxlZnR3YXJkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY2FycmlhZ2UgcmV0dXJuLCBVKzIxQjUgTkVXIC0tPgotPCFFTlRJVFkgbEFyciAgICAgIiYjODY1NjsiID48IS0tIGxlZnR3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMCBJU090ZWNoIC0tPgotPCEtLSBVbmljb2RlIGRvZXMgbm90IHNheSB0aGF0IGxBcnIgaXMgdGhlIHNhbWUgYXMgdGhlICdpcyBpbXBsaWVkIGJ5JyBhcnJvdwotICAgIGJ1dCBhbHNvIGRvZXMgbm90IGhhdmUgYW55IG90aGVyIGNoYXJhY3RlciBmb3IgdGhhdCBmdW5jdGlvbi4gU28gPyBsQXJyIGNhbgotICAgIGJlIHVzZWQgZm9yICdpcyBpbXBsaWVkIGJ5JyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgdUFyciAgICAgIiYjODY1NzsiID48IS0tIHVwd2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDEgSVNPYW1zYSAtLT4KLTwhRU5USVRZIHJBcnIgICAgICImIzg2NTg7IiA+PCEtLSByaWdodHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQyIElTT3RlY2ggLS0+Ci08IS0tIFVuaWNvZGUgZG9lcyBub3Qgc2F5IHRoaXMgaXMgdGhlICdpbXBsaWVzJyBjaGFyYWN0ZXIgYnV0IGRvZXMgbm90IGhhdmUKLSAgICAgYW5vdGhlciBjaGFyYWN0ZXIgd2l0aCB0aGlzIGZ1bmN0aW9uIHNvID8KLSAgICAgckFyciBjYW4gYmUgdXNlZCBmb3IgJ2ltcGxpZXMnIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSBkQXJyICAgICAiJiM4NjU5OyIgPjwhLS0gZG93bndhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQzIElTT2Ftc2EgLS0+Ci08IUVOVElUWSBoQXJyICAgICAiJiM4NjYwOyIgPjwhLS0gbGVmdCByaWdodCBkb3VibGUgYXJyb3csIFUrMjFENCBJU09hbXNhIC0tPgotCi08IS0tIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMgLS0+Ci08IUVOVElUWSBmb3JhbGwgICAiJiM4NzA0OyIgPjwhLS0gZm9yIGFsbCwgVSsyMjAwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwYXJ0ICAgICAiJiM4NzA2OyIgPjwhLS0gcGFydGlhbCBkaWZmZXJlbnRpYWwsIFUrMjIwMiBJU090ZWNoICAtLT4KLTwhRU5USVRZIGV4aXN0ICAgICImIzg3MDc7IiA+PCEtLSB0aGVyZSBleGlzdHMsIFUrMjIwMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgZW1wdHkgICAgIiYjODcwOTsiID48IS0tIGVtcHR5IHNldCA9IG51bGwgc2V0ID0gZGlhbWV0ZXIsIFUrMjIwNSBJU09hbXNvIC0tPgotPCFFTlRJVFkgbmFibGEgICAgIiYjODcxMTsiID48IS0tIG5hYmxhID0gYmFja3dhcmQgZGlmZmVyZW5jZSwgVSsyMjA3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBpc2luICAgICAiJiM4NzEyOyIgPjwhLS0gZWxlbWVudCBvZiwgVSsyMjA4IElTT3RlY2ggLS0+Ci08IUVOVElUWSBub3RpbiAgICAiJiM4NzEzOyIgPjwhLS0gbm90IGFuIGVsZW1lbnQgb2YsIFUrMjIwOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgbmkgICAgICAgIiYjODcxNTsiID48IS0tIGNvbnRhaW5zIGFzIG1lbWJlciwgVSsyMjBCIElTT3RlY2ggLS0+Ci08IS0tIHNob3VsZCB0aGVyZSBiZSBhIG1vcmUgbWVtb3JhYmxlIG5hbWUgdGhhbiAnbmknPyAtLT4KLTwhRU5USVRZIHByb2QgICAgICImIzg3MTk7IiA+PCEtLSBuLWFyeSBwcm9kdWN0ID0gcHJvZHVjdCBzaWduLCBVKzIyMEYgSVNPYW1zYiAtLT4KLTwhLS0gcHJvZCBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMCAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGknIHRob3VnaAotICAgICB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgc3VtICAgICAgIiYjODcyMTsiID48IS0tIG4tYXJ5IHN1bWF0aW9uLCBVKzIyMTEgSVNPYW1zYiAtLT4KLTwhLS0gc3VtIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EzICdncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYScKLSAgICAgdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBtaW51cyAgICAiJiM4NzIyOyIgPjwhLS0gbWludXMgc2lnbiwgVSsyMjEyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsb3dhc3QgICAiJiM4NzI3OyIgPjwhLS0gYXN0ZXJpc2sgb3BlcmF0b3IsIFUrMjIxNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgcmFkaWMgICAgIiYjODczMDsiID48IS0tIHNxdWFyZSByb290ID0gcmFkaWNhbCBzaWduLCBVKzIyMUEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHByb3AgICAgICImIzg3MzM7IiA+PCEtLSBwcm9wb3J0aW9uYWwgdG8sIFUrMjIxRCBJU090ZWNoIC0tPgotPCFFTlRJVFkgaW5maW4gICAgIiYjODczNDsiID48IS0tIGluZmluaXR5LCBVKzIyMUUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGFuZyAgICAgICImIzg3MzY7IiA+PCEtLSBhbmdsZSwgVSsyMjIwIElTT2Ftc28gLS0+Ci08IUVOVElUWSBhbmQgICAgICAiJiM4NzQzOyIgPjwhLS0gbG9naWNhbCBhbmQgPSB3ZWRnZSwgVSsyMjI3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBvciAgICAgICAiJiM4NzQ0OyIgPjwhLS0gbG9naWNhbCBvciA9IHZlZSwgVSsyMjI4IElTT3RlY2ggLS0+Ci08IUVOVElUWSBjYXAgICAgICAiJiM4NzQ1OyIgPjwhLS0gaW50ZXJzZWN0aW9uID0gY2FwLCBVKzIyMjkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGN1cCAgICAgICImIzg3NDY7IiA+PCEtLSB1bmlvbiA9IGN1cCwgVSsyMjJBIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbnQgICAgICAiJiM4NzQ3OyIgPjwhLS0gaW50ZWdyYWwsIFUrMjIyQiBJU090ZWNoIC0tPgotPCFFTlRJVFkgdGhlcmU0ICAgIiYjODc1NjsiID48IS0tIHRoZXJlZm9yZSwgVSsyMjM0IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzaW0gICAgICAiJiM4NzY0OyIgPjwhLS0gdGlsZGUgb3BlcmF0b3IgPSB2YXJpZXMgd2l0aCA9IHNpbWlsYXIgdG8sIFUrMjIzQyBJU090ZWNoIC0tPgotPCEtLSB0aWxkZSBvcGVyYXRvciBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIHRoZSB0aWxkZSwgVSswMDdFLAotICAgICBhbHRob3VnaCB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIHRvIHJlcHJlc2VudCBib3RoICAtLT4KLTwhRU5USVRZIGNvbmcgICAgICImIzg3NzM7IiA+PCEtLSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvLCBVKzIyNDUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGFzeW1wICAgICImIzg3NzY7IiA+PCEtLSBhbG1vc3QgZXF1YWwgdG8gPSBhc3ltcHRvdGljIHRvLCBVKzIyNDggSVNPYW1zciAtLT4KLTwhRU5USVRZIG5lICAgICAgICImIzg4MDA7IiA+PCEtLSBub3QgZXF1YWwgdG8sIFUrMjI2MCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZXF1aXYgICAgIiYjODgwMTsiID48IS0tIGlkZW50aWNhbCB0bywgVSsyMjYxIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsZSAgICAgICAiJiM4ODA0OyIgPjwhLS0gbGVzcy10aGFuIG9yIGVxdWFsIHRvLCBVKzIyNjQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGdlICAgICAgICImIzg4MDU7IiA+PCEtLSBncmVhdGVyLXRoYW4gb3IgZXF1YWwgdG8sIFUrMjI2NSBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3ViICAgICAgIiYjODgzNDsiID48IS0tIHN1YnNldCBvZiwgVSsyMjgyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdXAgICAgICAiJiM4ODM1OyIgPjwhLS0gc3VwZXJzZXQgb2YsIFUrMjI4MyBJU090ZWNoIC0tPgotPCEtLSBub3RlIHRoYXQgbnN1cCwgJ25vdCBhIHN1cGVyc2V0IG9mLCBVKzIyODMnIGlzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBTeW1ib2wKLSAgICAgZm9udCBlbmNvZGluZyBhbmQgaXMgbm90IGluY2x1ZGVkLiBTaG91bGQgaXQgYmUsIGZvciBzeW1tZXRyeT8KLSAgICAgSXQgaXMgaW4gSVNPYW1zbiAgLS0+Ci08IUVOVElUWSBuc3ViICAgICAiJiM4ODM2OyIgPjwhLS0gbm90IGEgc3Vic2V0IG9mLCBVKzIyODQgSVNPYW1zbiAtLT4KLTwhRU5USVRZIHN1YmUgICAgICImIzg4Mzg7IiA+PCEtLSBzdWJzZXQgb2Ygb3IgZXF1YWwgdG8sIFUrMjI4NiBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3VwZSAgICAgIiYjODgzOTsiID48IS0tIHN1cGVyc2V0IG9mIG9yIGVxdWFsIHRvLCBVKzIyODcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9wbHVzICAgICImIzg4NTM7IiA+PCEtLSBjaXJjbGVkIHBsdXMgPSBkaXJlY3Qgc3VtLCBVKzIyOTUgSVNPYW1zYiAtLT4KLTwhRU5USVRZIG90aW1lcyAgICImIzg4NTU7IiA+PCEtLSBjaXJjbGVkIHRpbWVzID0gdmVjdG9yIHByb2R1Y3QsIFUrMjI5NyBJU09hbXNiIC0tPgotPCFFTlRJVFkgcGVycCAgICAgIiYjODg2OTsiID48IS0tIHVwIHRhY2sgPSBvcnRob2dvbmFsIHRvID0gcGVycGVuZGljdWxhciwgVSsyMkE1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzZG90ICAgICAiJiM4OTAxOyIgPjwhLS0gZG90IG9wZXJhdG9yLCBVKzIyQzUgSVNPYW1zYiAtLT4KLTwhLS0gZG90IG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMEI3IG1pZGRsZSBkb3QgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBUZWNobmljYWwgLS0+Ci08IUVOVElUWSBsY2VpbCAgICAiJiM4OTY4OyIgPjwhLS0gbGVmdCBjZWlsaW5nID0gYXBsIHVwc3RpbGUsIFUrMjMwOCBJU09hbXNjICAtLT4KLTwhRU5USVRZIHJjZWlsICAgICImIzg5Njk7IiA+PCEtLSByaWdodCBjZWlsaW5nLCBVKzIzMDkgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSBsZmxvb3IgICAiJiM4OTcwOyIgPjwhLS0gbGVmdCBmbG9vciA9IGFwbCBkb3duc3RpbGUsIFUrMjMwQSBJU09hbXNjICAtLT4KLTwhRU5USVRZIHJmbG9vciAgICImIzg5NzE7IiA+PCEtLSByaWdodCBmbG9vciwgVSsyMzBCIElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgbGFuZyAgICAgIiYjOTAwMTsiID48IS0tIGxlZnQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGJyYSwgVSsyMzI5IElTT3RlY2ggLS0+Ci08IS0tIGxhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0MgJ2xlc3MgdGhhbicKLSAgICAgb3IgVSsyMDM5ICdzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaycgLS0+Ci08IUVOVElUWSByYW5nICAgICAiJiM5MDAyOyIgPjwhLS0gcmlnaHQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGtldCwgVSsyMzJBIElTT3RlY2ggLS0+Ci08IS0tIHJhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0UgJ2dyZWF0ZXIgdGhhbicKLSAgICAgb3IgVSsyMDNBICdzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotCi08IS0tIEdlb21ldHJpYyBTaGFwZXMgLS0+Ci08IUVOVElUWSBsb3ogICAgICAiJiM5Njc0OyIgPjwhLS0gbG96ZW5nZSwgVSsyNUNBIElTT3B1YiAtLT4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIFN5bWJvbHMgLS0+Ci08IUVOVElUWSBzcGFkZXMgICAiJiM5ODI0OyIgPjwhLS0gYmxhY2sgc3BhZGUgc3VpdCwgVSsyNjYwIElTT3B1YiAtLT4KLTwhLS0gYmxhY2sgaGVyZSBzZWVtcyB0byBtZWFuIGZpbGxlZCBhcyBvcHBvc2VkIHRvIGhvbGxvdyAtLT4KLTwhRU5USVRZIGNsdWJzICAgICImIzk4Mjc7IiA+PCEtLSBibGFjayBjbHViIHN1aXQgPSBzaGFtcm9jaywgVSsyNjYzIElTT3B1YiAtLT4KLTwhRU5USVRZIGhlYXJ0cyAgICImIzk4Mjk7IiA+PCEtLSBibGFjayBoZWFydCBzdWl0ID0gdmFsZW50aW5lLCBVKzI2NjUgSVNPcHViIC0tPgotPCFFTlRJVFkgZGlhbXMgICAgIiYjOTgzMDsiID48IS0tIGJsYWNrIGRpYW1vbmQgc3VpdCwgVSsyNjY2IElTT3B1YiAtLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtc3ltYm9sLmVudCAtLT4KLQotCi08IUVOVElUWSAlIHhodG1sLXNwZWNpYWwKLSAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAieGh0bWwtc3BlY2lhbC5lbnQiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWE1MLWNvbXBhdGlibGUgSVNPIFNwZWNpYWwgQ2hhcmFjdGVyIEVudGl0eSBTZXQgZm9yIFhIVE1MIC4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtc3BlY2lhbC5lbnQKLQotICAgICBUeXBpY2FsIGludm9jYXRpb246Ci0KLSAgICAgICA8IUVOVElUWSAlIHhodG1sLXNwZWNpYWwKLSAgICAgICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgICAgICAgICJ4aHRtbC1zcGVjaWFsLmVudCIgPgotICAgICAgICV4aHRtbC1zcGVjaWFsOwotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsIGZvciBYSFRNTC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3BlY2lhbC5lbnQiCi0KLSAgICAgUmV2aXNpb246ICAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoIGNvbmZvcm1pbmcKLSAgICAgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbiBJU08gODg3OSwgcHJvdmlkZWQKLSAgICAgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLQotICAgICBSZXZpc2lvbnM6Ci0yMDAwLTEwLTI4OiBhZGRlZCAmYXBvczsgYW5kIGFsdGVyZWQgWE1MIFByZWRlZmluZWQgRW50aXRpZXMgZm9yIGNvbXBhdGliaWxpdHkKLS0tPgotCi08IS0tIFJlbGV2YW50IElTTyBlbnRpdHkgc2V0IGlzIGdpdmVuIHVubGVzcyBuYW1lcyBhcmUgbmV3bHkgaW50cm9kdWNlZC4KLSAgICAgTmV3IG5hbWVzIChpLmUuLCBub3QgaW4gSVNPIDg4NzkgW1NHTUxdIGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoCi0gICAgIGFueSBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBbSVNPMTA2NDZdIGNoYXJhY3RlcgotICAgICBudW1iZXJzIGFyZSBnaXZlbiBmb3IgZWFjaCBjaGFyYWN0ZXIsIGluIGhleC4gRW50aXR5IHZhbHVlcyBhcmUKLSAgICAgZGVjaW1hbCBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlCi0gICAgIGRvY3VtZW50IGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBVbmljb2RlIFtVTklDT0RFXSBuYW1lcy4KLS0tPgotCi08IS0tIEMwIENvbnRyb2xzIGFuZCBCYXNpYyBMYXRpbiAtLT4KLTwhRU5USVRZIGx0ICAgICAgIiYjMzg7JiM2MDsiID48IS0tIGxlc3MtdGhhbiBzaWduLCBVKzAwM0MgSVNPbnVtIC0tPgotPCFFTlRJVFkgZ3QgICAgICAiJiM2MjsiID48IS0tIGdyZWF0ZXItdGhhbiBzaWduLCBVKzAwM0UgSVNPbnVtIC0tPgotPCFFTlRJVFkgYW1wICAgICAiJiMzODsmIzM4OyIgPjwhLS0gYW1wZXJzYW5kLCBVKzAwMjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgYXBvcyAgICAiJiMzOTsiID48IS0tIGFwb3N0cm9waGUsIFUrMDAyNyBJU09udW0gLS0+Ci08IUVOVElUWSBxdW90ICAgICImIzM0OyIgPjwhLS0gcXVvdGF0aW9uIG1hcmsgPSBBUEwgcXVvdGUsIFUrMDAyMiBJU09udW0gLS0+Ci0KLTwhLS0gTGF0aW4gRXh0ZW5kZWQtQSAtLT4KLTwhRU5USVRZIE9FbGlnICAgIiYjMzM4OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBPRSwgVSswMTUyIElTT2xhdDIgLS0+Ci08IUVOVElUWSBvZWxpZyAgICImIzMzOTsiID48IS0tIGxhdGluIHNtYWxsIGxpZ2F0dXJlIG9lLCBVKzAxNTMgSVNPbGF0MiAtLT4KLQotPCEtLSBsaWdhdHVyZSBpcyBhIG1pc25vbWVyLCB0aGlzIGlzIGEgc2VwYXJhdGUgY2hhcmFjdGVyIGluIHNvbWUgbGFuZ3VhZ2VzIC0tPgotPCFFTlRJVFkgU2Nhcm9uICAiJiMzNTI7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBTIHdpdGggY2Fyb24sIFUrMDE2MCBJU09sYXQyIC0tPgotPCFFTlRJVFkgc2Nhcm9uICAiJiMzNTM7IiA+PCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgcyB3aXRoIGNhcm9uLCBVKzAxNjEgSVNPbGF0MiAtLT4KLTwhRU5USVRZIFl1bWwgICAgIiYjMzc2OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGRpYWVyZXNpcywgVSswMTc4IElTT2xhdDIgLS0+Ci0KLTwhLS0gU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzIC0tPgotPCFFTlRJVFkgY2lyYyAgICAiJiM3MTA7IiA+PCEtLSBtb2RpZmllciBsZXR0ZXIgY2lyY3VtZmxleCBhY2NlbnQsIFUrMDJDNiBJU09wdWIgLS0+Ci08IUVOVElUWSB0aWxkZSAgICImIzczMjsiID48IS0tIHNtYWxsIHRpbGRlLCBVKzAyREMgSVNPZGlhIC0tPgotCi08IS0tIEdlbmVyYWwgUHVuY3R1YXRpb24gLS0+Ci08IUVOVElUWSBlbnNwICAgICImIzgxOTQ7IiA+PCEtLSBlbiBzcGFjZSwgVSsyMDAyIElTT3B1YiAtLT4KLTwhRU5USVRZIGVtc3AgICAgIiYjODE5NTsiID48IS0tIGVtIHNwYWNlLCBVKzIwMDMgSVNPcHViIC0tPgotPCFFTlRJVFkgdGhpbnNwICAiJiM4MjAxOyIgPjwhLS0gdGhpbiBzcGFjZSwgVSsyMDA5IElTT3B1YiAtLT4KLTwhRU5USVRZIHp3bmogICAgIiYjODIwNDsiID48IS0tIHplcm8gd2lkdGggbm9uLWpvaW5lciwgVSsyMDBDIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHp3aiAgICAgIiYjODIwNTsiID48IS0tIHplcm8gd2lkdGggam9pbmVyLCBVKzIwMEQgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbHJtICAgICAiJiM4MjA2OyIgPjwhLS0gbGVmdC10by1yaWdodCBtYXJrLCBVKzIwMEUgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgcmxtICAgICAiJiM4MjA3OyIgPjwhLS0gcmlnaHQtdG8tbGVmdCBtYXJrLCBVKzIwMEYgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbmRhc2ggICAiJiM4MjExOyIgPjwhLS0gZW4gZGFzaCwgVSsyMDEzIElTT3B1YiAtLT4KLTwhRU5USVRZIG1kYXNoICAgIiYjODIxMjsiID48IS0tIGVtIGRhc2gsIFUrMjAxNCBJU09wdWIgLS0+Ci08IUVOVElUWSBsc3F1byAgICImIzgyMTY7IiA+PCEtLSBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyaywgVSsyMDE4IElTT251bSAtLT4KLTwhRU5USVRZIHJzcXVvICAgIiYjODIxNzsiID48IS0tIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyaywgVSsyMDE5IElTT251bSAtLT4KLTwhRU5USVRZIHNicXVvICAgIiYjODIxODsiID48IS0tIHNpbmdsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFBIE5FVyAtLT4KLTwhRU5USVRZIGxkcXVvICAgIiYjODIyMDsiID48IS0tIGxlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmRxdW8gICAiJiM4MjIxOyIgPjwhLS0gcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMUQgSVNPbnVtIC0tPgotPCFFTlRJVFkgYmRxdW8gICAiJiM4MjIyOyIgPjwhLS0gZG91YmxlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUUgTkVXIC0tPgotPCFFTlRJVFkgZGFnZ2VyICAiJiM4MjI0OyIgPjwhLS0gZGFnZ2VyLCBVKzIwMjAgSVNPcHViIC0tPgotPCFFTlRJVFkgRGFnZ2VyICAiJiM4MjI1OyIgPjwhLS0gZG91YmxlIGRhZ2dlciwgVSsyMDIxIElTT3B1YiAtLT4KLTwhRU5USVRZIHBlcm1pbCAgIiYjODI0MDsiID48IS0tIHBlciBtaWxsZSBzaWduLCBVKzIwMzAgSVNPdGVjaCAtLT4KLQotPCEtLSBsc2FxdW8gaXMgcHJvcG9zZWQgYnV0IG5vdCB5ZXQgSVNPIHN0YW5kYXJkaXplZCAtLT4KLTwhRU5USVRZIGxzYXF1byAgIiYjODI0OTsiID48IS0tIHNpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMzkgSVNPIHByb3Bvc2VkIC0tPgotPCEtLSByc2FxdW8gaXMgcHJvcG9zZWQgYnV0IG5vdCB5ZXQgSVNPIHN0YW5kYXJkaXplZCAtLT4KLTwhRU5USVRZIHJzYXF1byAgIiYjODI1MDsiID48IS0tIHNpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywgVSsyMDNBIElTTyBwcm9wb3NlZCAtLT4KLTwhRU5USVRZIGV1cm8gICAgIiYjODM2NDsiID48IS0tIGV1cm8gc2lnbiwgVSsyMEFDIE5FVyAtLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtc3BlY2lhbC5lbnQgLS0+Ci0KLQotPCEtLSBlbmQgb2YgeGh0bWwtY2hhcmVudC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1mcmFtZXdvcmstMS5tb2QgLS0+Ci0KLQotPCEtLSBYSFRNTCBDb3JlIE1vZHVsZXMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgcHJlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQQotICAgICAgfCAlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7ICkqIgotPgotCi08IUVOVElUWSAlIHhodG1sLXRleHQubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBUZXh0IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXRleHQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgVGV4dCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtdGV4dC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgVGV4dCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXRleHQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVGV4dHVhbCBDb250ZW50Ci0KLSAgICAgVGhlIFRleHQgbW9kdWxlIGluY2x1ZGVzIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGNvcmUKLSAgICAgdGV4dCBjb250YWluZXIgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMuCi0tLT4KLQotPCFFTlRJVFkgJSB4aHRtbC1pbmxzdHJ1Y3QubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtaW5sc3RydWN0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWlubHN0cnVjdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBTdHJ1Y3R1cmFsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaW5sc3RydWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIElubGluZSBTdHJ1Y3R1cmFsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWlubHN0cnVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxzdHJ1Y3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW5saW5lIFN0cnVjdHVyYWwKLQotICAgICAgICBiciwgc3BhbgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcwotICAgICB1c2VkIHRvIHN1cHBvcnQgaW5saW5lLWxldmVsIHN0cnVjdHVyYWwgbWFya3VwLgotLS0+Ci0KLTwhLS0gYnI6IGZvcmNlZCBsaW5lIGJyZWFrIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYnIuZWxlbWVudDtbCi0KLTwhRU5USVRZICUgYnIuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGJyLnFuYW1lICAiYnIiID4KLTwhRUxFTUVOVCAlYnIucW5hbWU7ICAlYnIuY29udGVudDsgPgotCi08IS0tIGVuZCBvZiBici5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYnIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJyLnFuYW1lOwotICAgICAgJUNvcmUuYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYnIuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBzcGFuOiBnZW5lcmljIGlubGluZSBjb250YWluZXIgLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgc3Bhbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNwYW4uZWxlbWVudDtbCi08IUVOVElUWSAlIHNwYW4uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzcGFuLnFuYW1lICAic3BhbiIgPgotPCFFTEVNRU5UICVzcGFuLnFuYW1lOyAgJXNwYW4uY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3Bhbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHNwYW4uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzcGFuLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzcGFuLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzcGFuLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWlubHN0cnVjdC0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWlubHBocmFzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWlubHBocmFzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWlubHBocmFzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1pbmxwaHJhcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbmxpbmUgUGhyYXNhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbmxwaHJhcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxwaHJhcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbmxpbmUgUGhyYXNhbAotCi0gICAgICAgIGFiYnIsIGFjcm9ueW0sIGNpdGUsIGNvZGUsIGRmbiwgZW0sIGtiZCwgcSwgc2FtcCwgc3Ryb25nLCB2YXIKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGlubGluZS1sZXZlbCBwaHJhc2FsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGFiYnIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhYmJyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhYmJyLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYWJici5xbmFtZSAgImFiYnIiID4KLTwhRUxFTUVOVCAlYWJici5xbmFtZTsgICVhYmJyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFiYnIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhYmJyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWJici5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWJici5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWJici5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGFjcm9ueW0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhY3JvbnltLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhY3JvbnltLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYWNyb255bS5xbmFtZSAgImFjcm9ueW0iID4KLTwhRUxFTUVOVCAlYWNyb255bS5xbmFtZTsgICVhY3JvbnltLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFjcm9ueW0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhY3JvbnltLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWNyb255bS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWNyb255bS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWNyb255bS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGNpdGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjaXRlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjaXRlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgY2l0ZS5xbmFtZSAgImNpdGUiID4KLTwhRUxFTUVOVCAlY2l0ZS5xbmFtZTsgICVjaXRlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNpdGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjaXRlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY2l0ZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY2l0ZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY2l0ZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGNvZGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjb2RlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjb2RlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgY29kZS5xbmFtZSAgImNvZGUiID4KLTwhRUxFTUVOVCAlY29kZS5xbmFtZTsgICVjb2RlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNvZGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjb2RlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY29kZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY29kZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY29kZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGRmbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRmbi5lbGVtZW50O1sKLTwhRU5USVRZICUgZGZuLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZGZuLnFuYW1lICAiZGZuIiA+Ci08IUVMRU1FTlQgJWRmbi5xbmFtZTsgICVkZm4uY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGZuLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGZuLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGZuLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkZm4ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRmbi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGVtLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZW0uZWxlbWVudDtbCi08IUVOVElUWSAlIGVtLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZW0ucW5hbWUgICJlbSIgPgotPCFFTEVNRU5UICVlbS5xbmFtZTsgICVlbS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBlbS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGVtLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZW0uYXR0bGlzdDtbCi08IUFUVExJU1QgJWVtLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBlbS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGtiZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWtiZC5lbGVtZW50O1sKLTwhRU5USVRZICUga2JkLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUga2JkLnFuYW1lICAia2JkIiA+Ci08IUVMRU1FTlQgJWtiZC5xbmFtZTsgICVrYmQuY29udGVudDsgPgotPCEtLSBlbmQgb2Yga2JkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUga2JkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsla2JkLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVrYmQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGtiZC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVxLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBxLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgcS5xbmFtZSAgInEiID4KLTwhRUxFTUVOVCAlcS5xbmFtZTsgICVxLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBxLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2l0ZSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgcS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHNhbXAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzYW1wLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzYW1wLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc2FtcC5xbmFtZSAgInNhbXAiID4KLTwhRUxFTUVOVCAlc2FtcC5xbmFtZTsgICVzYW1wLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNhbXAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzYW1wLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc2FtcC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc2FtcC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc2FtcC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHN0cm9uZy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN0cm9uZy5lbGVtZW50O1sKLTwhRU5USVRZICUgc3Ryb25nLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3Ryb25nLnFuYW1lICAic3Ryb25nIiA+Ci08IUVMRU1FTlQgJXN0cm9uZy5xbmFtZTsgICVzdHJvbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3Ryb25nLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3Ryb25nLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3Ryb25nLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzdHJvbmcucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHN0cm9uZy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHZhci5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXZhci5lbGVtZW50O1sKLTwhRU5USVRZICUgdmFyLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgdmFyLnFuYW1lICAidmFyIiA+Ci08IUVMRU1FTlQgJXZhci5xbmFtZTsgICV2YXIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdmFyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdmFyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldmFyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV2YXIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHZhci5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxwaHJhcy0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWJsa3N0cnVjdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ibGtzdHJ1Y3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYmxrc3RydWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJsa3N0cnVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCbG9jayBTdHJ1Y3R1cmFsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1ibGtzdHJ1Y3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmxvY2sgU3RydWN0dXJhbAotCi0gICAgICAgIGRpdiwgcAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgYmxvY2stbGV2ZWwgc3RydWN0dXJhbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBkaXYuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkaXYuZWxlbWVudDtbCi08IUVOVElUWSAlIGRpdi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBkaXYucW5hbWUgICJkaXYiID4KLTwhRUxFTUVOVCAlZGl2LnFuYW1lOyAgJWRpdi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkaXYuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkaXYuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkaXYuYXR0bGlzdDtbCi08IUFUVExJU1QgJWRpdi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGl2LmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgcC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXAuZWxlbWVudDtbCi08IUVOVElUWSAlIHAuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIiA+Ci08IUVOVElUWSAlIHAucW5hbWUgICJwIiA+Ci08IUVMRU1FTlQgJXAucW5hbWU7ICAlcC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBwLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXAuYXR0bGlzdDtbCi08IUFUVExJU1QgJXAucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHAuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmxrc3RydWN0LTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYmxrcGhyYXMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYmxrcGhyYXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYmxrcGhyYXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYmxrcGhyYXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmxvY2sgUGhyYXNhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmxrcGhyYXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1ibGtwaHJhcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCbG9jayBQaHJhc2FsCi0KLSAgICAgICAgYWRkcmVzcywgYmxvY2txdW90ZSwgcHJlLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2Ci0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBibG9jay1sZXZlbCBwaHJhc2FsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGFkZHJlc3MuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhZGRyZXNzLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhZGRyZXNzLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIgPgotPCFFTlRJVFkgJSBhZGRyZXNzLnFuYW1lICAiYWRkcmVzcyIgPgotPCFFTEVNRU5UICVhZGRyZXNzLnFuYW1lOyAgJWFkZHJlc3MuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYWRkcmVzcy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGFkZHJlc3MuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhZGRyZXNzLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhZGRyZXNzLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBhZGRyZXNzLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmxvY2txdW90ZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJsb2NrcXVvdGUuZWxlbWVudDtbCi08IUVOVElUWSAlIGJsb2NrcXVvdGUuY29udGVudAotICAgICAiKCAlQmxvY2subWl4OyApKyIKLT4KLTwhRU5USVRZICUgYmxvY2txdW90ZS5xbmFtZSAgImJsb2NrcXVvdGUiID4KLTwhRUxFTUVOVCAlYmxvY2txdW90ZS5xbmFtZTsgICVibG9ja3F1b3RlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJsb2NrcXVvdGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBibG9ja3F1b3RlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYmxvY2txdW90ZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYmxvY2txdW90ZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2l0ZSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgYmxvY2txdW90ZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHByZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXByZS5lbGVtZW50O1sKLTwhRU5USVRZICUgcHJlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQQotICAgICAgfCAlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgfCAldHQucW5hbWU7IHwgJWkucW5hbWU7IHwgJWIucW5hbWU7Ci0gICAgICAlSTE4bi5jbGFzczsKLSAgICAgICVBbmNob3IuY2xhc3M7Ci0gICAgICB8ICVzY3JpcHQucW5hbWU7IHwgJW1hcC5xbmFtZTsKLSAgICAgICVJbmxpbmUuZXh0cmE7ICkqIgotPgotPCFFTlRJVFkgJSBwcmUucW5hbWUgICJwcmUiID4KLTwhRUxFTUVOVCAlcHJlLnFuYW1lOyAgJXByZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBwcmUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwcmUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVwcmUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXByZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgeG1sOnNwYWNlICAgICggcHJlc2VydmUgKSAgICAgICAgICAgICAjRklYRUQgJ3ByZXNlcnZlJwotPgotPCEtLSBlbmQgb2YgcHJlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLiAgSGVhZGluZyBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBIZWFkaW5nLmNvbnRlbnQgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiID4KLQotPCFFTlRJVFkgJSBoMS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWgxLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoMS5xbmFtZSAgImgxIiA+Ci08IUVMRU1FTlQgJWgxLnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWgxLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoMS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDEuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWgyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoMi5xbmFtZSAgImgyIiA+Ci08IUVMRU1FTlQgJWgyLnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWgyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoMi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDIuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWgzLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoMy5xbmFtZSAgImgzIiA+Ci08IUVMRU1FTlQgJWgzLnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDMuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWgzLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoMy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDMuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWg0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoNC5xbmFtZSAgImg0IiA+Ci08IUVMRU1FTlQgJWg0LnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWg0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoNC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDQuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWg1LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoNS5xbmFtZSAgImg1IiA+Ci08IUVMRU1FTlQgJWg1LnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWg1LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoNS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWg2LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoNi5xbmFtZSAgImg2IiA+Ci08IUVMRU1FTlQgJWg2LnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDYuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWg2LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoNi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDYuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmxrcGhyYXMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtdGV4dC0xLm1vZCAtLT4KLQotCi08IUVOVElUWSAlIHhodG1sLWh5cGVydGV4dC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEh5cGVydGV4dCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1oeXBlcnRleHQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSHlwZXJ0ZXh0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaHlwZXJ0ZXh0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBIeXBlcnRleHQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1oeXBlcnRleHQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSHlwZXJ0ZXh0Ci0KLSAgICAgICAgYQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBhbmNob3IgKCdhJykgZWxlbWVudCB0eXBlLCB3aGljaAotICAgICBkZWZpbmVzIHRoZSBzb3VyY2Ugb2YgYSBoeXBlcnRleHQgbGluay4gVGhlIGRlc3RpbmF0aW9uCi0gICAgIChvciBsaW5rICd0YXJnZXQnKSBpcyBpZGVudGlmaWVkIHZpYSBpdHMgJ2lkJyBhdHRyaWJ1dGUKLSAgICAgcmF0aGVyIHRoYW4gdGhlICduYW1lJyBhdHRyaWJ1dGUgYXMgd2FzIHVzZWQgaW4gSFRNTC4KLS0tPgotCi08IS0tIC4uLi4uLi4uLi4uLiAgQW5jaG9yIEVsZW1lbnQgIC4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBhLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYS5lbGVtZW50O1sKLTwhRU5USVRZICUgYS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5sTm9BbmNob3IubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYS5xbmFtZSAgImEiID4KLTwhRUxFTUVOVCAlYS5xbmFtZTsgICVhLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgaHJlZiAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgY2hhcnNldCAgICAgICVDaGFyc2V0LmRhdGF0eXBlOyAgICAgICAjSU1QTElFRAotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgaHJlZmxhbmcgICAgICVMYW5ndWFnZUNvZGUuZGF0YXR5cGU7ICAjSU1QTElFRAotICAgICAgcmVsICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgcmV2ICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgYS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1oeXBlcnRleHQtMS5tb2QgLS0+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1saXN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGlzdHMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGlzdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBMaXN0cyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1saXN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMaXN0cyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWxpc3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTGlzdHMKLQotICAgICAgICBkbCwgZHQsIGRkLCBvbCwgdWwsIGxpCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGxpc3Qtb3JpZW50ZWQgZWxlbWVudCB0eXBlcwotICAgICBhbmQgdGhlaXIgYXR0cmlidXRlcy4KLS0tPgotCi08IUVOVElUWSAlIGRsLnFuYW1lICAiZGwiID4KLTwhRU5USVRZICUgZHQucW5hbWUgICJkdCIgPgotPCFFTlRJVFkgJSBkZC5xbmFtZSAgImRkIiA+Ci08IUVOVElUWSAlIG9sLnFuYW1lICAib2wiID4KLTwhRU5USVRZICUgdWwucW5hbWUgICJ1bCIgPgotPCFFTlRJVFkgJSBsaS5xbmFtZSAgImxpIiA+Ci0KLTwhLS0gZGw6IERlZmluaXRpb24gTGlzdCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGRsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZGwuZWxlbWVudDtbCi08IUVOVElUWSAlIGRsLmNvbnRlbnQgICIoICVkdC5xbmFtZTsgfCAlZGQucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJWRsLnFuYW1lOyAgJWRsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRsLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGwucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRsLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZHQ6IERlZmluaXRpb24gVGVybSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGR0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZHQuZWxlbWVudDtbCi08IUVOVElUWSAlIGR0LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlZHQucW5hbWU7ICAlZHQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZHQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkdC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWR0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkdC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZHQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBkZDogRGVmaW5pdGlvbiBEZXNjcmlwdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZGQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkZC5lbGVtZW50O1sKLTwhRU5USVRZICUgZGQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlZGQucW5hbWU7ICAlZGQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRkLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkZC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBvbDogT3JkZXJlZCBMaXN0IChudW1iZXJlZCBzdHlsZXMpIC4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgb2wuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvbC5lbGVtZW50O1sKLTwhRU5USVRZICUgb2wuY29udGVudCAgIiggJWxpLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICVvbC5xbmFtZTsgICVvbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBvbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG9sLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb2wuYXR0bGlzdDtbCi08IUFUVExJU1QgJW9sLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBvbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHVsOiBVbm9yZGVyZWQgTGlzdCAoYnVsbGV0IHN0eWxlcykgLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB1bC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXVsLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB1bC5jb250ZW50ICAiKCAlbGkucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXVsLnFuYW1lOyAgJXVsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHVsLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdWwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV1bC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldWwucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHVsLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gbGk6IExpc3QgSXRlbSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGxpLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbGkuZWxlbWVudDtbCi08IUVOVElUWSAlIGxpLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWxpLnFuYW1lOyAgJWxpLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGxpLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbGkuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVsaS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbGkucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGxpLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWxpc3QtMS5tb2QgLS0+Ci0KLTwhLS0gRXh0ZW5kIGxpc3RzIHdpdGggdmFsdWUgYW5kIHN0YXJ0IGF0dHJpYnV0ZXMgLS0+IAotPCFBVFRMSVNUICVsaS5xbmFtZTsKLSAgICAgIHZhbHVlICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgICNJTVBMSUVECi0+Ci08IUFUVExJU1QgJW9sLnFuYW1lOwotICAgICAgc3RhcnQgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IC0tPgotCi08IS0tIEltYWdlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWltYWdlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW1hZ2VzIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWltYWdlLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEltYWdlcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWltYWdlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSb3Zpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbWFnZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbWFnZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbWFnZXMKLQotICAgICAgICBpbWcKLQotICAgICBUaGlzIG1vZHVsZSBwcm92aWRlcyBtYXJrdXAgdG8gc3VwcG9ydCBiYXNpYyBpbWFnZSBlbWJlZGRpbmcuCi0tLT4KLQotPCEtLSBUbyBhdm9pZCBwcm9ibGVtcyB3aXRoIHRleHQtb25seSBVQXMgYXMgd2VsbCBhcyB0byBtYWtlCi0gICAgIGltYWdlIGNvbnRlbnQgdW5kZXJzdGFuZGFibGUgYW5kIG5hdmlnYWJsZSB0byB1c2VycyBvZgotICAgICBub24tdmlzdWFsIFVBcywgeW91IG5lZWQgdG8gcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHdpdGgKLSAgICAgdGhlICdhbHQnIGF0dHJpYnV0ZSwgYW5kIGF2b2lkIHNlcnZlci1zaWRlIGltYWdlIG1hcHMuCi0tLT4KLQotPCFFTlRJVFkgJSBpbWcuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVpbWcuZWxlbWVudDtbCi08IUVOVElUWSAlIGltZy5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgaW1nLnFuYW1lICAiaW1nIiA+Ci08IUVMRU1FTlQgJWltZy5xbmFtZTsgICVpbWcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaW1nLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaW1nLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaW1nLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVpbWcucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHNyYyAgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBhbHQgICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNSRVFVSVJFRAotICAgICAgbG9uZ2Rlc2MgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVpZ2h0ICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgd2lkdGggICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgaW1nLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWltYWdlLTEubW9kIC0tPgotCi0KLTwhLS0gVGFibGVzIE1vZHVsZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtdGFibGUubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNpYyBUYWJsZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmFzaWMtdGFibGUtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJhc2ljIFRhYmxlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNpYy10YWJsZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwgQmFzaWMsIGEgcHJvcGVyIHN1YnNldCBvZiBYSFRNTC4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNpYyBUYWJsZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1iYXNpYy10YWJsZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCYXNpYyBUYWJsZXMKLQotICAgICAgICB0YWJsZSwgY2FwdGlvbiwgdHIsIHRoLCB0ZAotCi0gICAgIFRoaXMgdGFibGUgbW9kdWxlIGRlY2xhcmVzIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGRlZmluaW5nCi0gICAgIGEgdGFibGUgbW9kZWwgYmFzZWQgZnVuZGFtZW50YWxseSBvbiBmZWF0dXJlcyBmb3VuZCBpbiB0aGUKLSAgICAgd2lkZWx5LWRlcGxveWVkIEhUTUwgMy4yIHRhYmxlIG1vZGVsLiAgV2hpbGUgdGhpcyBtb2R1bGUKLSAgICAgbWltaWNzIHRoZSBjb250ZW50IG1vZGVsIGFuZCB0YWJsZSBhdHRyaWJ1dGVzIG9mIEhUTUwgMy4yCi0gICAgIHRhYmxlcywgdGhlIGVsZW1lbnQgdHlwZXMgZGVjbGFyZWQgaGVyZWluIGFsc28gaW5jbHVkZXMgYWxsCi0gICAgIEhUTUwgNCBjb21tb24gYW5kIG1vc3Qgb2YgdGhlIEhUTUwgNCB0YWJsZSBhdHRyaWJ1dGVzLgotLS0+Ci0KLTwhLS0gZGVjbGFyZSBxdWFsaWZpZWQgZWxlbWVudCB0eXBlIG5hbWVzOgotLS0+Ci08IUVOVElUWSAlIHRhYmxlLnFuYW1lICAidGFibGUiID4KLTwhRU5USVRZICUgY2FwdGlvbi5xbmFtZSAgImNhcHRpb24iID4KLTwhRU5USVRZICUgdHIucW5hbWUgICJ0ciIgPgotPCFFTlRJVFkgJSB0aC5xbmFtZSAgInRoIiA+Ci08IUVOVElUWSAlIHRkLnFuYW1lICAidGQiID4KLQotPCEtLSBob3Jpem9udGFsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzCi0tLT4KLTwhRU5USVRZICUgQ2VsbEhBbGlnbi5hdHRyaWIKLSAgICAgImFsaWduICAgICAgICAoIGxlZnQKLSAgICAgICAgICAgICAgICAgICB8IGNlbnRlcgotICAgICAgICAgICAgICAgICAgIHwgcmlnaHQgKSAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cwotLS0+Ci08IUVOVElUWSAlIENlbGxWQWxpZ24uYXR0cmliCi0gICAgICJ2YWxpZ24gICAgICAgKCB0b3AKLSAgICAgICAgICAgICAgICAgICB8IG1pZGRsZQotICAgICAgICAgICAgICAgICAgIHwgYm90dG9tICkgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSBzY29wZSBpcyBzaW1wbGVyIHRoYW4gYXhlcyBhdHRyaWJ1dGUgZm9yIGNvbW1vbiB0YWJsZXMKLS0tPgotPCFFTlRJVFkgJSBzY29wZS5hdHRyaWIKLSAgICAgInNjb3BlICAgICAgICAoIHJvdyB8IGNvbCAgKSAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhLS0gdGFibGU6IFRhYmxlIEVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRhYmxlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGFibGUuZWxlbWVudDtbCi08IUVOVElUWSAlIHRhYmxlLmNvbnRlbnQKLSAgICAgIiggJWNhcHRpb24ucW5hbWU7PywgJXRyLnFuYW1lOysgKSIKLT4KLTwhRUxFTUVOVCAldGFibGUucW5hbWU7ICAldGFibGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGFibGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0YWJsZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRhYmxlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0YWJsZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc3VtbWFyeSAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgdGFibGUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBjYXB0aW9uOiBUYWJsZSBDYXB0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgY2FwdGlvbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWNhcHRpb24uZWxlbWVudDtbCi08IUVOVElUWSAlIGNhcHRpb24uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICVjYXB0aW9uLnFuYW1lOyAgJWNhcHRpb24uY29udGVudDsgPgotPCEtLSBlbmQgb2YgY2FwdGlvbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGNhcHRpb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVjYXB0aW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVjYXB0aW9uLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBjYXB0aW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdHI6IFRhYmxlIFJvdyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldHIuZWxlbWVudDtbCi08IUVOVElUWSAlIHRyLmNvbnRlbnQgICIoICV0aC5xbmFtZTsgfCAldGQucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXRyLnFuYW1lOyAgJXRyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdHIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0ci5hdHRsaXN0O1sKLTwhQVRUTElTVCAldHIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGg6IFRhYmxlIEhlYWRlciBDZWxsIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIHRoIGlzIGZvciBoZWFkZXIgY2VsbHMsIHRkIGZvciBkYXRhLAotICAgICBidXQgZm9yIGNlbGxzIGFjdGluZyBhcyBib3RoIHVzZSB0ZAotLS0+Ci0KLTwhRU5USVRZICUgdGguZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0aC5lbGVtZW50O1sKLTwhRU5USVRZICUgdGguY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3dOb1RhYmxlLm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJXRoLnFuYW1lOyAgJXRoLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRoLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGguYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0aC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGgucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGFiYnIgICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGF4aXMgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlYWRlcnMgICAgICBJRFJFRlMgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICVzY29wZS5hdHRyaWI7Ci0gICAgICByb3dzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgY29sc3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRoLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGQ6IFRhYmxlIERhdGEgQ2VsbCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRkLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGQuZWxlbWVudDtbCi08IUVOVElUWSAlIHRkLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Tm9UYWJsZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICV0ZC5xbmFtZTsgICV0ZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0ZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGQuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhYmJyICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBheGlzICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWFkZXJzICAgICAgSURSRUZTICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICAlc2NvcGUuYXR0cmliOwotICAgICAgcm93c3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgIGNvbHNwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0ZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1iYXNpYy10YWJsZS0xLm1vZCAtLT4KLQotCi08IS0tIEZvcm1zIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gCi0JWEhUTUwgYmFzaWMgZm9ybXMgbW9kdWxlIGV4dGVuZGVkIHdpdGggb3B0Z3JvdXAgYW5kIGZpZWxkc2V0Ci0tLT4KLTwhRUxFTUVOVCAlb3B0Z3JvdXAucW5hbWU7ICglb3B0aW9uLnFuYW1lOykrPgotPCFBVFRMSVNUICVvcHRncm91cC5xbmFtZTsKLQklQ29tbW9uLmF0dHJpYjsgCi0JbGFiZWwgJVRleHQuZGF0YXR5cGU7ICNSRVFVSVJFRAotPgotPCFFTlRJVFkgJSBzZWxlY3QuY29udGVudCAiKCAlb3B0Z3JvdXAucW5hbWU7IHwgJW9wdGlvbi5xbmFtZTsgKSsiPgotPCFFTEVNRU5UICVmaWVsZHNldC5xbmFtZTsgKCNQQ0RBVEEgfCAlRmxvdy5taXg7KSo+Ci08IUFUVExJU1QgJWZpZWxkc2V0LnFuYW1lOwotCSVDb21tb24uYXR0cmliOyAKLT4KLTwhRU5USVRZICUgZm9ybS5jb250ZW50ICIoICVCbGtOb0Zvcm0ubWl4OyB8ICVmaWVsZHNldC5xbmFtZTsgKSsiPgotPCFFTlRJVFkgJSB4aHRtbC1mb3JtLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzaWMgRm9ybXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmFzaWMtZm9ybS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBTaW1wbGlmaWVkIEZvcm1zIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNpYy1mb3JtLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCBCYXNpYywgYSBwcm9wZXIgc3Vic2V0IG9mIFhIVE1MLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2ljIEZvcm1zIDEuMC8vRU4iICAKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1iYXNpYy1mb3JtLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJhc2ljIEZvcm1zCi0KLSAgICAgVGhpcyBmb3JtcyBtb2R1bGUgaXMgYmFzZWQgb24gdGhlIEhUTUwgMy4yIGZvcm1zIG1vZGVsLCB3aXRoCi0gICAgIHRoZSBXQUktcmVxdWVzdGVkIGFkZGl0aW9uIG9mIHRoZSBsYWJlbCBlbGVtZW50LiBXaGlsZSB0aGlzIAotICAgICBtb2R1bGUgZXNzZW50aWFsbHkgbWltaWNzIHRoZSBjb250ZW50IG1vZGVsIGFuZCBhdHRyaWJ1dGVzIG9mIAotICAgICBIVE1MIDMuMiBmb3JtcywgdGhlIGVsZW1lbnQgdHlwZXMgZGVjbGFyZWQgaGVyZWluIGFsc28gaW5jbHVkZQotICAgICBhbGwgSFRNTCA0IGNvbW1vbiBhdHRyaWJ1dGVzLgotCi0gICAgICAgIGZvcm0sIGxhYmVsLCBpbnB1dCwgc2VsZWN0LCBvcHRpb24sIHRleHRhcmVhCi0tLT4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBlbGVtZW50IHR5cGUgbmFtZXM6Ci0tLT4KLTwhRU5USVRZICUgZm9ybS5xbmFtZSAgImZvcm0iID4KLTwhRU5USVRZICUgbGFiZWwucW5hbWUgICJsYWJlbCIgPgotPCFFTlRJVFkgJSBpbnB1dC5xbmFtZSAgImlucHV0IiA+Ci08IUVOVElUWSAlIHNlbGVjdC5xbmFtZSAgInNlbGVjdCIgPgotPCFFTlRJVFkgJSBvcHRpb24ucW5hbWUgICJvcHRpb24iID4KLTwhRU5USVRZICUgdGV4dGFyZWEucW5hbWUgICJ0ZXh0YXJlYSIgPgotCi08IS0tICVCbGtOb0Zvcm0ubWl4OyBpbmNsdWRlcyBhbGwgbm9uLWZvcm0gYmxvY2sgZWxlbWVudHMsCi0gICAgIHBsdXMgJU1pc2MuY2xhc3M7Ci0tLT4KLTwhRU5USVRZICUgQmxrTm9Gb3JtLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxrU3RydWN0LmNsYXNzOwotICAgICAgJUJsa1BocmFzLmNsYXNzOwotICAgICAgJUJsa1ByZXMuY2xhc3M7Ci0gICAgICB8ICV0YWJsZS5xbmFtZTsgCi0gICAgICAlQmxvY2suZXh0cmE7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gZm9ybTogRm9ybSBFbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGZvcm0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVmb3JtLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBmb3JtLmNvbnRlbnQKLSAgICAgIiggJUJsa05vRm9ybS5taXg7ICkrIgotPgotPCFFTEVNRU5UICVmb3JtLnFuYW1lOyAgJWZvcm0uY29udGVudDsgPgotPCEtLSBlbmQgb2YgZm9ybS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGZvcm0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVmb3JtLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVmb3JtLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhY3Rpb24gICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgbWV0aG9kICAgICAgICggZ2V0IHwgcG9zdCApICAgICAgICAgICAnZ2V0JwotICAgICAgZW5jdHlwZSAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJwotPgotPCEtLSBlbmQgb2YgZm9ybS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGxhYmVsOiBGb3JtIEZpZWxkIExhYmVsIFRleHQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBsYWJlbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxhYmVsLmVsZW1lbnQ7WwotPCEtLSBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZAotLS0+Ci08IUVOVElUWSAlIGxhYmVsLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSAKLSAgICAgIHwgJWlucHV0LnFuYW1lOyB8ICVzZWxlY3QucW5hbWU7IHwgJXRleHRhcmVhLnFuYW1lOwotICAgICAgfCAlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUkxOG4uY2xhc3M7Ci0gICAgICAlSW5sUHJlcy5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7ICkqIgotPgotPCFFTEVNRU5UICVsYWJlbC5xbmFtZTsgICVsYWJlbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBsYWJlbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGxhYmVsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbGFiZWwuYXR0bGlzdDtbCi08IUFUVExJU1QgJWxhYmVsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBmb3IgICAgICAgICAgSURSRUYgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBsYWJlbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGlucHV0OiBGb3JtIENvbnRyb2wgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBpbnB1dC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWlucHV0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBpbnB1dC5jb250ZW50ICAiRU1QVFkiID4KLTwhRUxFTUVOVCAlaW5wdXQucW5hbWU7ICAlaW5wdXQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaW5wdXQuZWxlbWVudCAtLT5dXT4KLQotPCEtLSBCYXNpYyBGb3JtcyByZW1vdmVzICdpbWFnZScgYW5kICdmaWxlJyBpbnB1dCB0eXBlcy4KLS0tPgotPCFFTlRJVFkgJSBpbnB1dC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWlucHV0LmF0dGxpc3Q7WwotPCFFTlRJVFkgJSBJbnB1dFR5cGUuY2xhc3MKLSAgICAgIiggdGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfCByYWRpbyAKLSAgICAgIHwgc3VibWl0IHwgcmVzZXQgfCBoaWRkZW4gKSIKLT4KLTwhLS0gYXR0cmlidXRlIG5hbWUgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0ICYgcmVzZXQKLS0tPgotPCFBVFRMSVNUICVpbnB1dC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgdHlwZSAgICAgICAgICVJbnB1dFR5cGUuY2xhc3M7ICAgICAgICAndGV4dCcKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHZhbHVlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNoZWNrZWQgICAgICAoIGNoZWNrZWQgKSAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHNpemUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIG1heGxlbmd0aCAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIHNyYyAgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGlucHV0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gc2VsZWN0OiBPcHRpb24gU2VsZWN0b3IgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHNlbGVjdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNlbGVjdC5lbGVtZW50O1sKLTwhRU5USVRZICUgc2VsZWN0LmNvbnRlbnQgICIoICVvcHRpb24ucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXNlbGVjdC5xbmFtZTsgICVzZWxlY3QuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc2VsZWN0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc2VsZWN0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc2VsZWN0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzZWxlY3QucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHNpemUgICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG11bHRpcGxlICAgICAoIG11bHRpcGxlICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHNlbGVjdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG9wdGlvbjogU2VsZWN0YWJsZSBDaG9pY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvcHRpb24uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvcHRpb24uZWxlbWVudDtbCi08IUVOVElUWSAlIG9wdGlvbi5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRUxFTUVOVCAlb3B0aW9uLnFuYW1lOyAgJW9wdGlvbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBvcHRpb24uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBvcHRpb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVvcHRpb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJW9wdGlvbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc2VsZWN0ZWQgICAgICggc2VsZWN0ZWQgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdmFsdWUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2Ygb3B0aW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGV4dGFyZWE6IE11bHRpLUxpbmUgVGV4dCBGaWVsZCAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRleHRhcmVhLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGV4dGFyZWEuZWxlbWVudDtbCi08IUVOVElUWSAlIHRleHRhcmVhLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTEVNRU5UICV0ZXh0YXJlYS5xbmFtZTsgICV0ZXh0YXJlYS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0ZXh0YXJlYS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRleHRhcmVhLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGV4dGFyZWEuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRleHRhcmVhLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICByb3dzICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNSRVFVSVJFRAotICAgICAgY29scyAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjUkVRVUlSRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHRleHRhcmVhLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJhc2ljLWZvcm0tMS5tb2QgLS0+Ci0KLQotPCEtLSBMaW5rIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1saW5rLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGluayBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWxpbmstMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTGluayBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbGluay0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGluayBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGluay0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBMaW5rIGVsZW1lbnQKLQotICAgICAgICBsaW5rCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGxpbmsgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgd2hpY2ggY291bGQgKGluIHByaW5jaXBsZSkgYmUgdXNlZCB0byBkZWZpbmUgZG9jdW1lbnQtbGV2ZWwgbGlua3MKLSAgICAgdG8gZXh0ZXJuYWwgcmVzb3VyY2VzIHN1Y2ggYXM6Ci0KLSAgICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzLCBlLmcuIHN0YXJ0LCBjb250ZW50cywKLSAgICAgICAgcHJldmlvdXMsIG5leHQsIGluZGV4LCBlbmQsIGhlbHAKLSAgICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9InN0eWxlc2hlZXQiKQotICAgICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPSJzY3JpcHQiKQotICAgICBkKSBieSBzdHlsZSBzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YgaHRtbCBub2RlcyBhcmUKLSAgICAgICAgcmVuZGVyZWQgaW50byBwcmludGVkIGRvY3VtZW50cwotICAgICBlKSB0byBtYWtlIGEgbGluayB0byBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgICAgZS5nLiBhIHBvc3RzY3JpcHQgb3IgcGRmIHZlcnNpb24gKHJlbD0iYWx0ZXJuYXRlIiBtZWRpYT0icHJpbnQiKQotLS0+Ci0KLTwhLS0gbGluazogTWVkaWEtSW5kZXBlbmRlbnQgTGluayAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGxpbmsuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVsaW5rLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBsaW5rLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBsaW5rLnFuYW1lICAibGluayIgPgotPCFFTEVNRU5UICVsaW5rLnFuYW1lOyAgJWxpbmsuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbGluay5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGxpbmsuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVsaW5rLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVsaW5rLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBjaGFyc2V0ICAgICAgJUNoYXJzZXQuZGF0YXR5cGU7ICAgICAgICNJTVBMSUVECi0gICAgICBocmVmICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBocmVmbGFuZyAgICAgJUxhbmd1YWdlQ29kZS5kYXRhdHlwZTsgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICByZWwgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICByZXYgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICBtZWRpYSAgICAgICAgJU1lZGlhRGVzYy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBsaW5rLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWxpbmstMS5tb2QgLS0+Ci0KLQotPCEtLSBEb2N1bWVudCBNZXRhaW5mb3JtYXRpb24gTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1tZXRhLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTWV0YWluZm9ybWF0aW9uIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW1ldGEtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRG9jdW1lbnQgTWV0YWluZm9ybWF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbWV0YS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTWV0YWluZm9ybWF0aW9uIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbWV0YS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBNZXRhIEluZm9ybWF0aW9uCi0KLSAgICAgICAgbWV0YQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBtZXRhIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHVzZWQgdG8gcHJvdmlkZSBkZWNsYXJhdGl2ZSBkb2N1bWVudCBtZXRhaW5mb3JtYXRpb24uCi0tLT4KLQotPCEtLSBtZXRhOiBHZW5lcmljIE1ldGFpbmZvcm1hdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbWV0YS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW1ldGEuZWxlbWVudDtbCi08IUVOVElUWSAlIG1ldGEuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIG1ldGEucW5hbWUgICJtZXRhIiA+Ci08IUVMRU1FTlQgJW1ldGEucW5hbWU7ICAlbWV0YS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBtZXRhLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbWV0YS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW1ldGEuYXR0bGlzdDtbCi08IUFUVExJU1QgJW1ldGEucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgaHR0cC1lcXVpdiAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgbmFtZSAgICAgICAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgY29udGVudCAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIHNjaGVtZSAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIG1ldGEuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbWV0YS0xLm1vZCAtLT4KLQotCi08IS0tIEJhc2UgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWJhc2UubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmFzZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCYXNlIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1iYXNlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJhc2UgZWxlbWVudAotCi0gICAgICAgIGJhc2UKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgYmFzZSBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLAotICAgICB1c2VkIHRvIGRlZmluZSBhIGJhc2UgVVJJIGFnYWluc3Qgd2hpY2ggcmVsYXRpdmUgVVJJcyBpbiB0aGUKLSAgICAgZG9jdW1lbnQgd2lsbCBiZSByZXNvbHZlZC4KLQotICAgICBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgYWxzbyByZWRlY2xhcmVzIHRoZSBjb250ZW50IG1vZGVsIGZvcgotICAgICB0aGUgaGVhZCBlbGVtZW50IHRvIGluY2x1ZGUgdGhlIGJhc2UgZWxlbWVudC4KLS0tPgotCi08IS0tIGJhc2U6IERvY3VtZW50IEJhc2UgVVJJIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBiYXNlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYmFzZS5lbGVtZW50O1sKLTwhRU5USVRZICUgYmFzZS5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgYmFzZS5xbmFtZSAgImJhc2UiID4KLTwhRUxFTUVOVCAlYmFzZS5xbmFtZTsgICViYXNlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJhc2UuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBiYXNlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYmFzZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYmFzZS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICBocmVmICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNSRVFVSVJFRAotPgotPCEtLSBlbmQgb2YgYmFzZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGhlYWQuY29udGVudAotICAgICIoICVIZWFkT3B0cy5taXg7LAotICAgICAoICggJXRpdGxlLnFuYW1lOywgJUhlYWRPcHRzLm1peDssICggJWJhc2UucW5hbWU7LCAlSGVhZE9wdHMubWl4OyApPyApCi0gICAgIHwgKCAlYmFzZS5xbmFtZTssICVIZWFkT3B0cy5taXg7LCAoICV0aXRsZS5xbmFtZTssICVIZWFkT3B0cy5taXg7ICkpKSkiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJhc2UtMS5tb2QgLS0+Ci0KLQotPCEtLSBTdHlsZXNoZWV0cyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1zdHlsZS5tb2QgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFN0eWxlIFNoZWV0cyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zdHlsZS0xLm1vZCI+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIERvY3VtZW50IFN0eWxlIFNoZWV0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXN0eWxlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgU3R5bGUgU2hlZXRzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3R5bGUtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gU3R5bGUgU2hlZXRzCi0KLSAgICAgICAgc3R5bGUKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgc3R5bGUgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgdXNlZCB0byBlbWJlZCBzdHlsZSBzaGVldCBpbmZvcm1hdGlvbiBpbiB0aGUgZG9jdW1lbnQgaGVhZCBlbGVtZW50LgotLS0+Ci0KLTwhLS0gc3R5bGU6IFN0eWxlIFNoZWV0IEluZm9ybWF0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHN0eWxlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc3R5bGUuZWxlbWVudDtbCi08IUVOVElUWSAlIHN0eWxlLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTlRJVFkgJSBzdHlsZS5xbmFtZSAgInN0eWxlIiA+Ci08IUVMRU1FTlQgJXN0eWxlLnFuYW1lOyAgJXN0eWxlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHN0eWxlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3R5bGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzdHlsZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3R5bGUucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJXRpdGxlLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI1JFUVVJUkVECi0gICAgICBtZWRpYSAgICAgICAgJU1lZGlhRGVzYy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICB4bWw6c3BhY2UgICAgKCBwcmVzZXJ2ZSApICAgICAgICAgICAgICNGSVhFRCAncHJlc2VydmUnCi0+Ci08IS0tIGVuZCBvZiBzdHlsZS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1zdHlsZS0xLm1vZCAtLT4KLQotCi08IS0tIFBhcmFtIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXBhcmFtLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgUGFyYW0gRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1wYXJhbS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBQYXJhbSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtcGFyYW0tMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFBhcmFtIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1wYXJhbS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBQYXJhbWV0ZXJzIGZvciBKYXZhIEFwcGxldHMgYW5kIEVtYmVkZGVkIE9iamVjdHMKLQotICAgICAgICBwYXJhbQotCi0gICAgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHBhcmFtIGVsZW1lbnQsCi0gICAgIHVzZWQgdG8gcHJvdmlkZSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZXMgZm9yIHRoZSBhcHBsZXQKLSAgICAgYW5kIG9iamVjdCBlbGVtZW50cy4KLS0tPgotCi08IS0tIHBhcmFtOiBOYW1lZCBQcm9wZXJ0eSBWYWx1ZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBwYXJhbS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXBhcmFtLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBwYXJhbS5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgcGFyYW0ucW5hbWUgICJwYXJhbSIgPgotPCFFTEVNRU5UICVwYXJhbS5xbmFtZTsgICVwYXJhbS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBwYXJhbS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHBhcmFtLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcGFyYW0uYXR0bGlzdDtbCi08IUFUVExJU1QgJXBhcmFtLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVpZC5hdHRyaWI7Ci0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgdmFsdWUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdmFsdWV0eXBlICAgICggZGF0YSB8IHJlZiB8IG9iamVjdCApICAnZGF0YScKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHBhcmFtLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXBhcmFtLTEubW9kIC0tPgotCi0KLTwhLS0gRW1iZWRkZWQgT2JqZWN0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtb2JqZWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRW1iZWRkZWQgT2JqZWN0IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW9iamVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBFbWJlZGRlZCBPYmplY3QgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1vYmplY3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEVtYmVkZGVkIE9iamVjdCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW9iamVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBFbWJlZGRlZCBPYmplY3RzCi0KLSAgICAgICAgb2JqZWN0Ci0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIG9iamVjdCBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLCB1c2VkCi0gICAgIHRvIGVtYmVkIGV4dGVybmFsIG9iamVjdHMgYXMgcGFydCBvZiBYSFRNTCBwYWdlcy4gSW4gdGhlIGRvY3VtZW50LAotICAgICBwbGFjZSBwYXJhbSBlbGVtZW50cyBwcmlvciB0byBvdGhlciBjb250ZW50IHdpdGhpbiB0aGUgb2JqZWN0IGVsZW1lbnQuCi0KLSAgICAgTm90ZSB0aGF0IHVzZSBvZiB0aGlzIG1vZHVsZSByZXF1aXJlcyBpbnN0YW50aWF0aW9uIG9mIHRoZSBQYXJhbQotICAgICBFbGVtZW50IE1vZHVsZS4KLS0tPgotCi08IS0tIG9iamVjdDogR2VuZXJpYyBFbWJlZGRlZCBPYmplY3QgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvYmplY3QuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvYmplY3QuZWxlbWVudDtbCi08IUVOVElUWSAlIG9iamVjdC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7IHwgJXBhcmFtLnFuYW1lOyApKiIKLT4KLTwhRU5USVRZICUgb2JqZWN0LnFuYW1lICAib2JqZWN0IiA+Ci08IUVMRU1FTlQgJW9iamVjdC5xbmFtZTsgICVvYmplY3QuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygb2JqZWN0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb2JqZWN0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb2JqZWN0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVvYmplY3QucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGRlY2xhcmUgICAgICAoIGRlY2xhcmUgKSAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNsYXNzaWQgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNvZGViYXNlICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGRhdGEgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIGNvZGV0eXBlICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIGFyY2hpdmUgICAgICAlVVJJcy5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHN0YW5kYnkgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlaWdodCAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIHdpZHRoICAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIG9iamVjdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1vYmplY3QtMS5tb2QgLS0+Ci0KLQotPCEtLSBEb2N1bWVudCBTdHJ1Y3R1cmUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1zdHJ1Y3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBEb2N1bWVudCBTdHJ1Y3R1cmUgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3RydWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFN0cnVjdHVyZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXN0cnVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRG9jdW1lbnQgU3RydWN0dXJlIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3RydWN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIERvY3VtZW50IFN0cnVjdHVyZQotCi0gICAgICAgIHRpdGxlLCBoZWFkLCBib2R5LCBodG1sCi0KLSAgICAgVGhlIFN0cnVjdHVyZSBNb2R1bGUgZGVmaW5lcyB0aGUgbWFqb3Igc3RydWN0dXJhbCBlbGVtZW50cyBhbmQKLSAgICAgdGhlaXIgYXR0cmlidXRlcy4KLQotICAgICBOb3RlIHRoYXQgdGhlIGNvbnRlbnQgbW9kZWwgb2YgdGhlIGhlYWQgZWxlbWVudCB0eXBlIGlzIHJlZGVjbGFyZWQKLSAgICAgd2hlbiB0aGUgQmFzZSBNb2R1bGUgaXMgaW5jbHVkZWQgaW4gdGhlIERURC4KLQotICAgICBUaGUgcGFyYW1ldGVyIGVudGl0eSBjb250YWluaW5nIHRoZSBYTUwgbmFtZXNwYWNlIFVSSSB2YWx1ZSB1c2VkCi0gICAgIGZvciBYSFRNTCBpcyAnJVhIVE1MLnhtbG5zOycsIGRlZmluZWQgaW4gdGhlIFF1YWxpZmllZCBOYW1lcyBtb2R1bGUuCi0tLT4KLQotPCEtLSB0aXRsZTogRG9jdW1lbnQgVGl0bGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVGhlIHRpdGxlIGVsZW1lbnQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgZmxvdyBvZiB0ZXh0LgotICAgICBJdCBzaG91bGQgYmUgZGlzcGxheWVkLCBmb3IgZXhhbXBsZSBhcyB0aGUgcGFnZSBoZWFkZXIgb3IKLSAgICAgd2luZG93IHRpdGxlLiBFeGFjdGx5IG9uZSB0aXRsZSBpcyByZXF1aXJlZCBwZXIgZG9jdW1lbnQuCi0tLT4KLQotPCFFTlRJVFkgJSB0aXRsZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRpdGxlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0aXRsZS5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRU5USVRZICUgdGl0bGUucW5hbWUgICJ0aXRsZSIgPgotPCFFTEVNRU5UICV0aXRsZS5xbmFtZTsgICV0aXRsZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0aXRsZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRpdGxlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGl0bGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRpdGxlLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRpdGxlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gaGVhZDogRG9jdW1lbnQgSGVhZCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGhlYWQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoZWFkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoZWFkLmNvbnRlbnQKLSAgICAiKCAlSGVhZE9wdHMubWl4OywgJXRpdGxlLnFuYW1lOywgJUhlYWRPcHRzLm1peDsgKSIKLT4KLTwhRU5USVRZICUgaGVhZC5xbmFtZSAgImhlYWQiID4KLTwhRUxFTUVOVCAlaGVhZC5xbmFtZTsgICVoZWFkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGhlYWQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoZWFkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaGVhZC5hdHRsaXN0O1sKLTwhLS0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2Ugd2l0aCBkb2N1bWVudCBwcm9maWxlcwotLS0+Ci08IUVOVElUWSAlIHByb2ZpbGUuYXR0cmliCi0gICAgICJwcm9maWxlICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICclWEhUTUwucHJvZmlsZTsnIgotPgotCi08IUFUVExJU1QgJWhlYWQucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgJXByb2ZpbGUuYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaGVhZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGJvZHk6IERvY3VtZW50IEJvZHkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBib2R5LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYm9keS5lbGVtZW50O1sKLTwhRU5USVRZICUgYm9keS5jb250ZW50Ci0gICAgICIoICVCbG9jay5taXg7ICkrIgotPgotPCFFTlRJVFkgJSBib2R5LnFuYW1lICAiYm9keSIgPgotPCFFTEVNRU5UICVib2R5LnFuYW1lOyAgJWJvZHkuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYm9keS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJvZHkuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVib2R5LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVib2R5LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBib2R5LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gaHRtbDogWEhUTUwgRG9jdW1lbnQgRWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGh0bWwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVodG1sLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgICIoICVoZWFkLnFuYW1lOywgJWJvZHkucW5hbWU7ICkiID4KLTwhRU5USVRZICUgaHRtbC5xbmFtZSAgImh0bWwiID4KLTwhRUxFTUVOVCAlaHRtbC5xbmFtZTsgICVodG1sLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGh0bWwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBodG1sLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaHRtbC5hdHRsaXN0O1sKLTwhLS0gdmVyc2lvbiBhdHRyaWJ1dGUgdmFsdWUgZGVmaW5lZCBpbiBkcml2ZXIKLS0tPgotPCFFTlRJVFkgJSBYSFRNTC52ZXJzaW9uLmF0dHJpYgotICAgICAidmVyc2lvbiAgICAgICVGUEkuZGF0YXR5cGU7ICAgICAgICAgICAjRklYRUQgJyVYSFRNTC52ZXJzaW9uOyciCi0+Ci0KLTwhLS0gc2VlIHRoZSBRdWFsaWZpZWQgTmFtZXMgbW9kdWxlIGZvciBpbmZvcm1hdGlvbgotICAgICBvbiBob3cgdG8gZXh0ZW5kIFhIVE1MIHVzaW5nIFhNTCBuYW1lc3BhY2VzCi0tLT4KLTwhQVRUTElTVCAlaHRtbC5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlWEhUTUwudmVyc2lvbi5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBodG1sLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXN0cnVjdC0xLm1vZCAtLT4KLQotCi08IS0tIEJsb2NrIFByZXNlbnRhdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1ibGtwcmVzLm1vZCBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgUHJlc2VudGF0aW9uIDEuMC8vRU4iCi0gCQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJsa3ByZXMtMS5tb2QiPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCbG9jayBQcmVzZW50YXRpb24gTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ibGtwcmVzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQcmVzZW50YXRpb24gMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1ibGtwcmVzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJsb2NrIFByZXNlbnRhdGlvbmFsIEVsZW1lbnRzCi0KLSAgICAgICAgaHIKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGJsb2NrLWxldmVsIHByZXNlbnRhdGlvbmFsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGhyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaHIuZWxlbWVudDtbCi08IUVOVElUWSAlIGhyLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBoci5xbmFtZSAgImhyIiA+Ci08IUVMRU1FTlQgJWhyLnFuYW1lOyAgJWhyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGhyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaHIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoci5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaHIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGhyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJsa3ByZXMtMS5tb2QgLS0+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIAotCUlubGluZSBQcmVzZW50YXRpb246IGIsIGJpZywgaSwgc21hbGwJCQotLS0+Ci08IUVOVElUWSAlIHN1Yi5lbGVtZW50ICJJR05PUkUiPgotPCFFTlRJVFkgJSBzdWIuYXR0bGlzdCAiSUdOT1JFIj4KLTwhRU5USVRZICUgc3VwLmVsZW1lbnQgIklHTk9SRSI+Ci08IUVOVElUWSAlIHN1cC5hdHRsaXN0ICJJR05PUkUiPgotPCFFTlRJVFkgJSB0dC5lbGVtZW50ICJJR05PUkUiPgotPCFFTlRJVFkgJSB0dC5hdHRsaXN0ICJJR05PUkUiPgotPCFFTlRJVFkgJSB4aHRtbC1pbmxwcmVzLm1vZCBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFByZXNlbnRhdGlvbiAxLjAvL0VOIgotCQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWlubHByZXMtMS5tb2QiPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbmxpbmUgUHJlc2VudGF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbmxwcmVzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgUHJlc2VudGF0aW9uIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5scHJlcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbmxpbmUgUHJlc2VudGF0aW9uYWwgRWxlbWVudHMKLQotICAgICAgICBiLCBiaWcsIGksIHNtYWxsLCBzdWIsIHN1cCwgdHQKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGlubGluZS1sZXZlbCBwcmVzZW50YXRpb25hbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBiLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYi5lbGVtZW50O1sKLTwhRU5USVRZICUgYi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGIucW5hbWUgICJiIiA+Ci08IUVMRU1FTlQgJWIucW5hbWU7ICAlYi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBiLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGIuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBiaWcuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyViaWcuZWxlbWVudDtbCi08IUVOVElUWSAlIGJpZy5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGJpZy5xbmFtZSAgImJpZyIgPgotPCFFTEVNRU5UICViaWcucW5hbWU7ICAlYmlnLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJpZy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJpZy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJpZy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYmlnLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBiaWcuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBpLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaS5lbGVtZW50O1sKLTwhRU5USVRZICUgaS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGkucW5hbWUgICJpIiA+Ci08IUVMRU1FTlQgJWkucW5hbWU7ICAlaS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBpLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWkuYXR0bGlzdDtbCi08IUFUVExJU1QgJWkucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGkuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzbWFsbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNtYWxsLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzbWFsbC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHNtYWxsLnFuYW1lICAic21hbGwiID4KLTwhRUxFTUVOVCAlc21hbGwucW5hbWU7ICAlc21hbGwuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc21hbGwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzbWFsbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXNtYWxsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzbWFsbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc21hbGwuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdWIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzdWIuZWxlbWVudDtbCi08IUVOVElUWSAlIHN1Yi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHN1Yi5xbmFtZSAgInN1YiIgPgotPCFFTEVNRU5UICVzdWIucW5hbWU7ICAlc3ViLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHN1Yi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHN1Yi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXN1Yi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3ViLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzdWIuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdXAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzdXAuZWxlbWVudDtbCi08IUVOVElUWSAlIHN1cC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHN1cC5xbmFtZSAgInN1cCIgPgotPCFFTEVNRU5UICVzdXAucW5hbWU7ICAlc3VwLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHN1cC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHN1cC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXN1cC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3VwLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzdXAuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0dC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXR0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0dC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHR0LnFuYW1lICAidHQiID4KLTwhRUxFTUVOVCAldHQucW5hbWU7ICAldHQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdHQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0dC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXR0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0dC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdHQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaW5scHJlcy0xLm1vZCAtLT4KLQotCi08IS0tIGVuZCBvZiBYSFRNTCBNb2JpbGUgMS4wIERURCAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtc3BlY2lhbC5lbnQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtc3BlY2lhbC5lbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNzA5ZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLXNwZWNpYWwuZW50CisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCEtLSBTcGVjaWFsIGNoYXJhY3RlcnMgZm9yIEhUTUwgLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICAgICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zcGVjaWFsLmVudCI+Ci0gICAgICVIVE1Mc3BlY2lhbDsKLS0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBVbmljb2RlIG5hbWVzLiAKLS0tPgotCi08IS0tIEMwIENvbnRyb2xzIGFuZCBCYXNpYyBMYXRpbiAtLT4KLTwhRU5USVRZIHF1b3QgICAgIiYjMzQ7Ij4gPCEtLSAgcXVvdGF0aW9uIG1hcmsgPSBBUEwgcXVvdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwMjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgYW1wICAgICAiJiMzODsjMzg7Ij4gPCEtLSAgYW1wZXJzYW5kLCBVKzAwMjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgbHQgICAgICAiJiMzODsjNjA7Ij4gPCEtLSAgbGVzcy10aGFuIHNpZ24sIFUrMDAzQyBJU09udW0gLS0+Ci08IUVOVElUWSBndCAgICAgICImIzYyOyI+IDwhLS0gIGdyZWF0ZXItdGhhbiBzaWduLCBVKzAwM0UgSVNPbnVtIC0tPgotPCFFTlRJVFkgYXBvcwkgIiYjMzk7Ij4gPCEtLSAgYXBvc3Ryb3BoZSBtYXJrLCBVKzAwMjcgSVNPbnVtIC0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUEgLS0+Ci08IUVOVElUWSBPRWxpZyAgICImIzMzODsiPiA8IS0tICBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIE9FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTUyIElTT2xhdDIgLS0+Ci08IUVOVElUWSBvZWxpZyAgICImIzMzOTsiPiA8IS0tICBsYXRpbiBzbWFsbCBsaWdhdHVyZSBvZSwgVSswMTUzIElTT2xhdDIgLS0+Ci08IS0tIGxpZ2F0dXJlIGlzIGEgbWlzbm9tZXIsIHRoaXMgaXMgYSBzZXBhcmF0ZSBjaGFyYWN0ZXIgaW4gc29tZSBsYW5ndWFnZXMgLS0+Ci08IUVOVElUWSBTY2Fyb24gICImIzM1MjsiPiA8IS0tICBsYXRpbiBjYXBpdGFsIGxldHRlciBTIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjAgSVNPbGF0MiAtLT4KLTwhRU5USVRZIHNjYXJvbiAgIiYjMzUzOyI+IDwhLS0gIGxhdGluIHNtYWxsIGxldHRlciBzIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjEgSVNPbGF0MiAtLT4KLTwhRU5USVRZIFl1bWwgICAgIiYjMzc2OyI+IDwhLS0gIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNzggSVNPbGF0MiAtLT4KLQotPCEtLSBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMgLS0+Ci08IUVOVElUWSBjaXJjICAgICImIzcxMDsiPiA8IS0tICBtb2RpZmllciBsZXR0ZXIgY2lyY3VtZmxleCBhY2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAyQzYgSVNPcHViIC0tPgotPCFFTlRJVFkgdGlsZGUgICAiJiM3MzI7Ij4gPCEtLSAgc21hbGwgdGlsZGUsIFUrMDJEQyBJU09kaWEgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGVuc3AgICAgIiYjODE5NDsiPiA8IS0tIGVuIHNwYWNlLCBVKzIwMDIgSVNPcHViIC0tPgotPCFFTlRJVFkgZW1zcCAgICAiJiM4MTk1OyI+IDwhLS0gZW0gc3BhY2UsIFUrMjAwMyBJU09wdWIgLS0+Ci08IUVOVElUWSB0aGluc3AgICImIzgyMDE7Ij4gPCEtLSB0aGluIHNwYWNlLCBVKzIwMDkgSVNPcHViIC0tPgotPCFFTlRJVFkgenduaiAgICAiJiM4MjA0OyI+IDwhLS0gemVybyB3aWR0aCBub24tam9pbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDBDIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHp3aiAgICAgIiYjODIwNTsiPiA8IS0tIHplcm8gd2lkdGggam9pbmVyLCBVKzIwMEQgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbHJtICAgICAiJiM4MjA2OyI+IDwhLS0gbGVmdC10by1yaWdodCBtYXJrLCBVKzIwMEUgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgcmxtICAgICAiJiM4MjA3OyI+IDwhLS0gcmlnaHQtdG8tbGVmdCBtYXJrLCBVKzIwMEYgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbmRhc2ggICAiJiM4MjExOyI+IDwhLS0gZW4gZGFzaCwgVSsyMDEzIElTT3B1YiAtLT4KLTwhRU5USVRZIG1kYXNoICAgIiYjODIxMjsiPiA8IS0tIGVtIGRhc2gsIFUrMjAxNCBJU09wdWIgLS0+Ci08IUVOVElUWSBsc3F1byAgICImIzgyMTY7Ij4gPCEtLSBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxOCBJU09udW0gLS0+Ci08IUVOVElUWSByc3F1byAgICImIzgyMTc7Ij4gPCEtLSByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2JxdW8gICAiJiM4MjE4OyI+IDwhLS0gc2luZ2xlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUEgTkVXIC0tPgotPCFFTlRJVFkgbGRxdW8gICAiJiM4MjIwOyI+IDwhLS0gbGVmdCBkb3VibGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmRxdW8gICAiJiM4MjIxOyI+IDwhLS0gcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDFEIElTT251bSAtLT4KLTwhRU5USVRZIGJkcXVvICAgIiYjODIyMjsiPiA8IS0tIGRvdWJsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFFIE5FVyAtLT4KLTwhRU5USVRZIGRhZ2dlciAgIiYjODIyNDsiPiA8IS0tIGRhZ2dlciwgVSsyMDIwIElTT3B1YiAtLT4KLTwhRU5USVRZIERhZ2dlciAgIiYjODIyNTsiPiA8IS0tIGRvdWJsZSBkYWdnZXIsIFUrMjAyMSBJU09wdWIgLS0+Ci08IUVOVElUWSBwZXJtaWwgICImIzgyNDA7Ij4gPCEtLSBwZXIgbWlsbGUgc2lnbiwgVSsyMDMwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsc2FxdW8gICImIzgyNDk7Ij4gPCEtLSBzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzOSBJU08gcHJvcG9zZWQgLS0+Ci08IS0tIGxzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkIC0tPgotPCFFTlRJVFkgcnNhcXVvICAiJiM4MjUwOyI+IDwhLS0gc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDNBIElTTyBwcm9wb3NlZCAtLT4KLTwhLS0gcnNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSBldXJvICAgIiYjODM2NDsiPiA8IS0tICBldXJvIHNpZ24sIFUrMjBBQyBORVcgLS0+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtc3ltYm9sLmVudCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1zeW1ib2wuZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY4NzZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1zeW1ib2wuZW50CisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLTwhLS0gTWF0aGVtYXRpY2FsLCBHcmVlayBhbmQgU3ltYm9saWMgY2hhcmFjdGVycyBmb3IgSFRNTCAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgICA8IUVOVElUWSAlIEhUTUxzeW1ib2wgUFVCTElDCi0gICAgICAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtc3ltYm9sLmVudCI+Ci0gICAgICVIVE1Mc3ltYm9sOwotLS0+Ci0KLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotCi08IS0tIFJlbGV2YW50IElTTyBlbnRpdHkgc2V0IGlzIGdpdmVuIHVubGVzcyBuYW1lcyBhcmUgbmV3bHkgaW50cm9kdWNlZC4KLSAgICAgTmV3IG5hbWVzIChpLmUuLCBub3QgaW4gSVNPIDg4NzkgbGlzdCkgZG8gbm90IGNsYXNoIHdpdGggYW55Ci0gICAgIGV4aXN0aW5nIElTTyA4ODc5IGVudGl0eSBuYW1lcy4gSVNPIDEwNjQ2IGNoYXJhY3RlciBudW1iZXJzCi0gICAgIGFyZSBnaXZlbiBmb3IgZWFjaCBjaGFyYWN0ZXIsIGluIGhleC4gdmFsdWVzIGFyZSBkZWNpbWFsCi0gICAgIGNvbnZlcnNpb25zIG9mIHRoZSBJU08gMTA2NDYgdmFsdWVzIGFuZCByZWZlciB0byB0aGUgZG9jdW1lbnQKLSAgICAgY2hhcmFjdGVyIHNldC4gTmFtZXMgYXJlIFVuaWNvZGUgbmFtZXMuIAotLS0+Ci0KLTwhLS0gTGF0aW4gRXh0ZW5kZWQtQiAtLT4KLTwhRU5USVRZIGZub2YgICAgICImIzQwMjsiPiA8IS0tIGxhdGluIHNtYWxsIGYgd2l0aCBob29rID0gZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmxvcmluLCBVKzAxOTIgSVNPdGVjaCAtLT4KLQotPCEtLSBHcmVlayAtLT4KLTwhRU5USVRZIEFscGhhICAgICImIzkxMzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGFscGhhLCBVKzAzOTEgLS0+Ci08IUVOVElUWSBCZXRhICAgICAiJiM5MTQ7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBiZXRhLCBVKzAzOTIgLS0+Ci08IUVOVElUWSBHYW1tYSAgICAiJiM5MTU7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBnYW1tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5MyBJU09ncmszIC0tPgotPCFFTlRJVFkgRGVsdGEgICAgIiYjOTE2OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIEVwc2lsb24gICImIzkxNzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGVwc2lsb24sIFUrMDM5NSAtLT4KLTwhRU5USVRZIFpldGEgICAgICImIzkxODsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHpldGEsIFUrMDM5NiAtLT4KLTwhRU5USVRZIEV0YSAgICAgICImIzkxOTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGV0YSwgVSswMzk3IC0tPgotPCFFTlRJVFkgVGhldGEgICAgIiYjOTIwOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGhldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIElvdGEgICAgICImIzkyMTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGlvdGEsIFUrMDM5OSAtLT4KLTwhRU5USVRZIEthcHBhICAgICImIzkyMjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGthcHBhLCBVKzAzOUEgLS0+Ci08IUVOVElUWSBMYW1iZGEgICAiJiM5MjM7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBsYW1iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOUIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE11ICAgICAgICImIzkyNDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG11LCBVKzAzOUMgLS0+Ci08IUVOVElUWSBOdSAgICAgICAiJiM5MjU7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBudSwgVSswMzlEIC0tPgotPCFFTlRJVFkgWGkgICAgICAgIiYjOTI2OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgeGksIFUrMDM5RSBJU09ncmszIC0tPgotPCFFTlRJVFkgT21pY3JvbiAgIiYjOTI3OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21pY3JvbiwgVSswMzlGIC0tPgotPCFFTlRJVFkgUGkgICAgICAgIiYjOTI4OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGksIFUrMDNBMCBJU09ncmszIC0tPgotPCFFTlRJVFkgUmhvICAgICAgIiYjOTI5OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcmhvLCBVKzAzQTEgLS0+Ci08IS0tIHRoZXJlIGlzIG5vIFNpZ21hZiwgYW5kIG5vIFUrMDNBMiBjaGFyYWN0ZXIgZWl0aGVyIC0tPgotPCFFTlRJVFkgU2lnbWEgICAgIiYjOTMxOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFRhdSAgICAgICImIzkzMjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRhdSwgVSswM0E0IC0tPgotPCFFTlRJVFkgVXBzaWxvbiAgIiYjOTMzOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBNSBJU09ncmszIC0tPgotPCFFTlRJVFkgUGhpICAgICAgIiYjOTM0OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGhpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E2IElTT2dyazMgLS0+Ci08IUVOVElUWSBDaGkgICAgICAiJiM5MzU7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBjaGksIFUrMDNBNyAtLT4KLTwhRU5USVRZIFBzaSAgICAgICImIzkzNjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBOCBJU09ncmszIC0tPgotPCFFTlRJVFkgT21lZ2EgICAgIiYjOTM3OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21lZ2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTkgSVNPZ3JrMyAtLT4KLQotPCFFTlRJVFkgYWxwaGEgICAgIiYjOTQ1OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGFscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0IxIElTT2dyazMgLS0+Ci08IUVOVElUWSBiZXRhICAgICAiJiM5NDY7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgYmV0YSwgVSswM0IyIElTT2dyazMgLS0+Ci08IUVOVElUWSBnYW1tYSAgICAiJiM5NDc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZ2FtbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGRlbHRhICAgICImIzk0ODsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCNCBJU09ncmszIC0tPgotPCFFTlRJVFkgZXBzaWxvbiAgIiYjOTQ5OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHpldGEgICAgICImIzk1MDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB6ZXRhLCBVKzAzQjYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGV0YSAgICAgICImIzk1MTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBldGEsIFUrMDNCNyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGhldGEgICAgIiYjOTUyOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I4IElTT2dyazMgLS0+Ci08IUVOVElUWSBpb3RhICAgICAiJiM5NTM7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgaW90YSwgVSswM0I5IElTT2dyazMgLS0+Ci08IUVOVElUWSBrYXBwYSAgICAiJiM5NTQ7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIga2FwcGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQkEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGxhbWJkYSAgICImIzk1NTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBsYW1iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQkIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG11ICAgICAgICImIzk1NjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBtdSwgVSswM0JDIElTT2dyazMgLS0+Ci08IUVOVElUWSBudSAgICAgICAiJiM5NTc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbnUsIFUrMDNCRCBJU09ncmszIC0tPgotPCFFTlRJVFkgeGkgICAgICAgIiYjOTU4OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHhpLCBVKzAzQkUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG9taWNyb24gICImIzk1OTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBvbWljcm9uLCBVKzAzQkYgTkVXIC0tPgotPCFFTlRJVFkgcGkgICAgICAgIiYjOTYwOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBpLCBVKzAzQzAgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHJobyAgICAgICImIzk2MTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciByaG8sIFUrMDNDMSBJU09ncmszIC0tPgotPCFFTlRJVFkgc2lnbWFmICAgIiYjOTYyOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGZpbmFsIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0MyIElTT2dyazMgLS0+Ci08IUVOVElUWSBzaWdtYSAgICAiJiM5NjM7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRhdSAgICAgICImIzk2NDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0YXUsIFUrMDNDNCBJU09ncmszIC0tPgotPCFFTlRJVFkgdXBzaWxvbiAgIiYjOTY1OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBoaSAgICAgICImIzk2NjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwaGksIFUrMDNDNiBJU09ncmszIC0tPgotPCFFTlRJVFkgY2hpICAgICAgIiYjOTY3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGNoaSwgVSswM0M3IElTT2dyazMgLS0+Ci08IUVOVElUWSBwc2kgICAgICAiJiM5Njg7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcHNpLCBVKzAzQzggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG9tZWdhICAgICImIzk2OTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBvbWVnYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDOSBJU09ncmszIC0tPgotPCFFTlRJVFkgdGhldGFzeW0gIiYjOTc3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNEMSBORVcgLS0+Ci08IUVOVElUWSB1cHNpaCAgICAiJiM5Nzg7Ij4gPCEtLSBncmVlayB1cHNpbG9uIHdpdGggaG9vayBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzRDIgTkVXIC0tPgotPCFFTlRJVFkgcGl2ICAgICAgIiYjOTgyOyI+IDwhLS0gZ3JlZWsgcGkgc3ltYm9sLCBVKzAzRDYgSVNPZ3JrMyAtLT4KLQotPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgotPCFFTlRJVFkgYnVsbCAgICAgIiYjODIyNjsiPiA8IS0tIGJ1bGxldCA9IGJsYWNrIHNtYWxsIGNpcmNsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMjIgSVNPcHViICAtLT4KLTwhLS0gYnVsbGV0IGlzIE5PVCB0aGUgc2FtZSBhcyBidWxsZXQgb3BlcmF0b3IsIFUrMjIxOSAtLT4KLTwhRU5USVRZIGhlbGxpcCAgICImIzgyMzA7Ij4gPCEtLSBob3Jpem9udGFsIGVsbGlwc2lzID0gdGhyZWUgZG90IGxlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMjYgSVNPcHViICAtLT4KLTwhRU5USVRZIHByaW1lICAgICImIzgyNDI7Ij4gPCEtLSBwcmltZSA9IG1pbnV0ZXMgPSBmZWV0LCBVKzIwMzIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIFByaW1lICAgICImIzgyNDM7Ij4gPCEtLSBkb3VibGUgcHJpbWUgPSBzZWNvbmRzID0gaW5jaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb2xpbmUgICAgIiYjODI1NDsiPiA8IS0tIG92ZXJsaW5lID0gc3BhY2luZyBvdmVyc2NvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDNFIE5FVyAtLT4KLTwhRU5USVRZIGZyYXNsICAgICImIzgyNjA7Ij4gPCEtLSBmcmFjdGlvbiBzbGFzaCwgVSsyMDQ0IE5FVyAtLT4KLQotPCEtLSBMZXR0ZXJsaWtlIFN5bWJvbHMgLS0+Ci08IUVOVElUWSB3ZWllcnAgICAiJiM4NDcyOyI+IDwhLS0gc2NyaXB0IGNhcGl0YWwgUCA9IHBvd2VyIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gV2VpZXJzdHJhc3MgcCwgVSsyMTE4IElTT2Ftc28gLS0+Ci08IUVOVElUWSBpbWFnZSAgICAiJiM4NDY1OyI+IDwhLS0gYmxhY2tsZXR0ZXIgY2FwaXRhbCBJID0gaW1hZ2luYXJ5IHBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTExIElTT2Ftc28gLS0+Ci08IUVOVElUWSByZWFsICAgICAiJiM4NDc2OyI+IDwhLS0gYmxhY2tsZXR0ZXIgY2FwaXRhbCBSID0gcmVhbCBwYXJ0IHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMUMgSVNPYW1zbyAtLT4KLTwhRU5USVRZIHRyYWRlICAgICImIzg0ODI7Ij4gPCEtLSB0cmFkZSBtYXJrIHNpZ24sIFUrMjEyMiBJU09udW0gLS0+Ci08IUVOVElUWSBhbGVmc3ltICAiJiM4NTAxOyI+IDwhLS0gYWxlZiBzeW1ib2wgPSBmaXJzdCB0cmFuc2Zpbml0ZSBjYXJkaW5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMzUgTkVXIC0tPgotPCEtLSBhbGVmIHN5bWJvbCBpcyBOT1QgdGhlIHNhbWUgYXMgaGVicmV3IGxldHRlciBhbGVmLAotICAgICBVKzA1RDAgYWx0aG91Z2ggdGhlIHNhbWUgZ2x5cGggY291bGQgYmUgdXNlZCB0byBkZXBpY3QgYm90aCBjaGFyYWN0ZXJzIC0tPgotCi08IS0tIEFycm93cyAtLT4KLTwhRU5USVRZIGxhcnIgICAgICImIzg1OTI7Ij4gPCEtLSBsZWZ0d2FyZHMgYXJyb3csIFUrMjE5MCBJU09udW0gLS0+Ci08IUVOVElUWSB1YXJyICAgICAiJiM4NTkzOyI+IDwhLS0gdXB3YXJkcyBhcnJvdywgVSsyMTkxIElTT251bS0tPgotPCFFTlRJVFkgcmFyciAgICAgIiYjODU5NDsiPiA8IS0tIHJpZ2h0d2FyZHMgYXJyb3csIFUrMjE5MiBJU09udW0gLS0+Ci08IUVOVElUWSBkYXJyICAgICAiJiM4NTk1OyI+IDwhLS0gZG93bndhcmRzIGFycm93LCBVKzIxOTMgSVNPbnVtIC0tPgotPCFFTlRJVFkgaGFyciAgICAgIiYjODU5NjsiPiA8IS0tIGxlZnQgcmlnaHQgYXJyb3csIFUrMjE5NCBJU09hbXNhIC0tPgotPCFFTlRJVFkgY3JhcnIgICAgIiYjODYyOTsiPiA8IS0tIGRvd253YXJkcyBhcnJvdyB3aXRoIGNvcm5lciBsZWZ0d2FyZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNhcnJpYWdlIHJldHVybiwgVSsyMUI1IE5FVyAtLT4KLTwhRU5USVRZIGxBcnIgICAgICImIzg2NTY7Ij4gPCEtLSBsZWZ0d2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDAgSVNPdGVjaCAtLT4KLTwhLS0gVW5pY29kZSBkb2VzIG5vdCBzYXkgdGhhdCBsQXJyIGlzIHRoZSBzYW1lIGFzIHRoZSAnaXMgaW1wbGllZCBieScgYXJyb3cKLSAgICBidXQgYWxzbyBkb2VzIG5vdCBoYXZlIGFueSBvdGhlciBjaGFyYWN0ZXIgZm9yIHRoYXQgZnVuY3Rpb24uIFNvID8gbEFyciBjYW4KLSAgICBiZSB1c2VkIGZvciAnaXMgaW1wbGllZCBieScgYXMgSVNPdGVjaCBzdWdnZXN0cyAtLT4KLTwhRU5USVRZIHVBcnIgICAgICImIzg2NTc7Ij4gPCEtLSB1cHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQxIElTT2Ftc2EgLS0+Ci08IUVOVElUWSByQXJyICAgICAiJiM4NjU4OyI+IDwhLS0gcmlnaHR3YXJkcyBkb3VibGUgYXJyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMUQyIElTT3RlY2ggLS0+Ci08IS0tIFVuaWNvZGUgZG9lcyBub3Qgc2F5IHRoaXMgaXMgdGhlICdpbXBsaWVzJyBjaGFyYWN0ZXIgYnV0IGRvZXMgbm90IGhhdmUgCi0gICAgIGFub3RoZXIgY2hhcmFjdGVyIHdpdGggdGhpcyBmdW5jdGlvbiBzbyA/Ci0gICAgIHJBcnIgY2FuIGJlIHVzZWQgZm9yICdpbXBsaWVzJyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgZEFyciAgICAgIiYjODY1OTsiPiA8IS0tIGRvd253YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMyBJU09hbXNhIC0tPgotPCFFTlRJVFkgaEFyciAgICAgIiYjODY2MDsiPiA8IS0tIGxlZnQgcmlnaHQgZG91YmxlIGFycm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjFENCBJU09hbXNhIC0tPgotCi08IS0tIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMgLS0+Ci08IUVOVElUWSBmb3JhbGwgICAiJiM4NzA0OyI+IDwhLS0gZm9yIGFsbCwgVSsyMjAwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwYXJ0ICAgICAiJiM4NzA2OyI+IDwhLS0gcGFydGlhbCBkaWZmZXJlbnRpYWwsIFUrMjIwMiBJU090ZWNoICAtLT4KLTwhRU5USVRZIGV4aXN0ICAgICImIzg3MDc7Ij4gPCEtLSB0aGVyZSBleGlzdHMsIFUrMjIwMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgZW1wdHkgICAgIiYjODcwOTsiPiA8IS0tIGVtcHR5IHNldCA9IG51bGwgc2V0ID0gZGlhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjA1IElTT2Ftc28gLS0+Ci08IUVOVElUWSBuYWJsYSAgICAiJiM4NzExOyI+IDwhLS0gbmFibGEgPSBiYWNrd2FyZCBkaWZmZXJlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgaXNpbiAgICAgIiYjODcxMjsiPiA8IS0tIGVsZW1lbnQgb2YsIFUrMjIwOCBJU090ZWNoIC0tPgotPCFFTlRJVFkgbm90aW4gICAgIiYjODcxMzsiPiA8IS0tIG5vdCBhbiBlbGVtZW50IG9mLCBVKzIyMDkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG5pICAgICAgICImIzg3MTU7Ij4gPCEtLSBjb250YWlucyBhcyBtZW1iZXIsIFUrMjIwQiBJU090ZWNoIC0tPgotPCEtLSBzaG91bGQgdGhlcmUgYmUgYSBtb3JlIG1lbW9yYWJsZSBuYW1lIHRoYW4gJ25pJz8gLS0+Ci08IUVOVElUWSBwcm9kICAgICAiJiM4NzE5OyI+IDwhLS0gbi1hcnkgcHJvZHVjdCA9IHByb2R1Y3Qgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMEYgSVNPYW1zYiAtLT4KLTwhLS0gcHJvZCBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMCAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGknIHRob3VnaAotICAgICB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgc3VtICAgICAgIiYjODcyMTsiPiA8IS0tIG4tYXJ5IHN1bWF0aW9uLCBVKzIyMTEgSVNPYW1zYiAtLT4KLTwhLS0gc3VtIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EzICdncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYScKLSAgICAgdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBtaW51cyAgICAiJiM4NzIyOyI+IDwhLS0gbWludXMgc2lnbiwgVSsyMjEyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsb3dhc3QgICAiJiM4NzI3OyI+IDwhLS0gYXN0ZXJpc2sgb3BlcmF0b3IsIFUrMjIxNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgcmFkaWMgICAgIiYjODczMDsiPiA8IS0tIHNxdWFyZSByb290ID0gcmFkaWNhbCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIxQSBJU090ZWNoIC0tPgotPCFFTlRJVFkgcHJvcCAgICAgIiYjODczMzsiPiA8IS0tIHByb3BvcnRpb25hbCB0bywgVSsyMjFEIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbmZpbiAgICAiJiM4NzM0OyI+IDwhLS0gaW5maW5pdHksIFUrMjIxRSBJU090ZWNoIC0tPgotPCFFTlRJVFkgYW5nICAgICAgIiYjODczNjsiPiA8IS0tIGFuZ2xlLCBVKzIyMjAgSVNPYW1zbyAtLT4KLTwhRU5USVRZIGFuZCAgICAgICImIzg3NDM7Ij4gPCEtLSBsb2dpY2FsIGFuZCA9IHdlZGdlLCBVKzIyMjcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9yICAgICAgICImIzg3NDQ7Ij4gPCEtLSBsb2dpY2FsIG9yID0gdmVlLCBVKzIyMjggSVNPdGVjaCAtLT4KLTwhRU5USVRZIGNhcCAgICAgICImIzg3NDU7Ij4gPCEtLSBpbnRlcnNlY3Rpb24gPSBjYXAsIFUrMjIyOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgY3VwICAgICAgIiYjODc0NjsiPiA8IS0tIHVuaW9uID0gY3VwLCBVKzIyMkEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGludCAgICAgICImIzg3NDc7Ij4gPCEtLSBpbnRlZ3JhbCwgVSsyMjJCIElTT3RlY2ggLS0+Ci08IUVOVElUWSB0aGVyZTQgICAiJiM4NzU2OyI+IDwhLS0gdGhlcmVmb3JlLCBVKzIyMzQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHNpbSAgICAgICImIzg3NjQ7Ij4gPCEtLSB0aWxkZSBvcGVyYXRvciA9IHZhcmllcyB3aXRoID0gc2ltaWxhciB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyM0MgSVNPdGVjaCAtLT4KLTwhLS0gdGlsZGUgb3BlcmF0b3IgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyB0aGUgdGlsZGUsIFUrMDA3RSwKLSAgICAgYWx0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCB0byByZXByZXNlbnQgYm90aCAgLS0+Ci08IUVOVElUWSBjb25nICAgICAiJiM4NzczOyI+IDwhLS0gYXBwcm94aW1hdGVseSBlcXVhbCB0bywgVSsyMjQ1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBhc3ltcCAgICAiJiM4Nzc2OyI+IDwhLS0gYWxtb3N0IGVxdWFsIHRvID0gYXN5bXB0b3RpYyB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyNDggSVNPYW1zciAtLT4KLTwhRU5USVRZIG5lICAgICAgICImIzg4MDA7Ij4gPCEtLSBub3QgZXF1YWwgdG8sIFUrMjI2MCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZXF1aXYgICAgIiYjODgwMTsiPiA8IS0tIGlkZW50aWNhbCB0bywgVSsyMjYxIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsZSAgICAgICAiJiM4ODA0OyI+IDwhLS0gbGVzcy10aGFuIG9yIGVxdWFsIHRvLCBVKzIyNjQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGdlICAgICAgICImIzg4MDU7Ij4gPCEtLSBncmVhdGVyLXRoYW4gb3IgZXF1YWwgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjY1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdWIgICAgICAiJiM4ODM0OyI+IDwhLS0gc3Vic2V0IG9mLCBVKzIyODIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cCAgICAgICImIzg4MzU7Ij4gPCEtLSBzdXBlcnNldCBvZiwgVSsyMjgzIElTT3RlY2ggLS0+Ci08IS0tIG5vdGUgdGhhdCBuc3VwLCAnbm90IGEgc3VwZXJzZXQgb2YsIFUrMjI4MycgaXMgbm90IGNvdmVyZWQgYnkgdGhlIFN5bWJvbCAKLSAgICAgZm9udCBlbmNvZGluZyBhbmQgaXMgbm90IGluY2x1ZGVkLiBTaG91bGQgaXQgYmUsIGZvciBzeW1tZXRyeT8KLSAgICAgSXQgaXMgaW4gSVNPYW1zbiAgLS0+IAotPCFFTlRJVFkgbnN1YiAgICAgIiYjODgzNjsiPiA8IS0tIG5vdCBhIHN1YnNldCBvZiwgVSsyMjg0IElTT2Ftc24gLS0+Ci08IUVOVElUWSBzdWJlICAgICAiJiM4ODM4OyI+IDwhLS0gc3Vic2V0IG9mIG9yIGVxdWFsIHRvLCBVKzIyODYgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cGUgICAgICImIzg4Mzk7Ij4gPCEtLSBzdXBlcnNldCBvZiBvciBlcXVhbCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyODcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9wbHVzICAgICImIzg4NTM7Ij4gPCEtLSBjaXJjbGVkIHBsdXMgPSBkaXJlY3Qgc3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI5NSBJU09hbXNiIC0tPgotPCFFTlRJVFkgb3RpbWVzICAgIiYjODg1NTsiPiA8IS0tIGNpcmNsZWQgdGltZXMgPSB2ZWN0b3IgcHJvZHVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyOTcgSVNPYW1zYiAtLT4KLTwhRU5USVRZIHBlcnAgICAgICImIzg4Njk7Ij4gPCEtLSB1cCB0YWNrID0gb3J0aG9nb25hbCB0byA9IHBlcnBlbmRpY3VsYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMkE1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzZG90ICAgICAiJiM4OTAxOyI+IDwhLS0gZG90IG9wZXJhdG9yLCBVKzIyQzUgSVNPYW1zYiAtLT4KLTwhLS0gZG90IG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMEI3IG1pZGRsZSBkb3QgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBUZWNobmljYWwgLS0+Ci08IUVOVElUWSBsY2VpbCAgICAiJiM4OTY4OyI+IDwhLS0gbGVmdCBjZWlsaW5nID0gYXBsIHVwc3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzA4IElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgcmNlaWwgICAgIiYjODk2OTsiPiA8IS0tIHJpZ2h0IGNlaWxpbmcsIFUrMjMwOSBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxmbG9vciAgICImIzg5NzA7Ij4gPCEtLSBsZWZ0IGZsb29yID0gYXBsIGRvd25zdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMEEgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSByZmxvb3IgICAiJiM4OTcxOyI+IDwhLS0gcmlnaHQgZmxvb3IsIFUrMjMwQiBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxhbmcgICAgICImIzkwMDE7Ij4gPCEtLSBsZWZ0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBicmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzI5IElTT3RlY2ggLS0+Ci08IS0tIGxhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0MgJ2xlc3MgdGhhbicgCi0gICAgIG9yIFUrMjAzOSAnc2luZ2xlIGxlZnQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotPCFFTlRJVFkgcmFuZyAgICAgIiYjOTAwMjsiPiA8IS0tIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzJBIElTT3RlY2ggLS0+Ci08IS0tIHJhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0UgJ2dyZWF0ZXIgdGhhbicgCi0gICAgIG9yIFUrMjAzQSAnc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrJyAtLT4KLQotPCEtLSBHZW9tZXRyaWMgU2hhcGVzIC0tPgotPCFFTlRJVFkgbG96ICAgICAgIiYjOTY3NDsiPiA8IS0tIGxvemVuZ2UsIFUrMjVDQSBJU09wdWIgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBTeW1ib2xzIC0tPgotPCFFTlRJVFkgc3BhZGVzICAgIiYjOTgyNDsiPiA8IS0tIGJsYWNrIHNwYWRlIHN1aXQsIFUrMjY2MCBJU09wdWIgLS0+Ci08IS0tIGJsYWNrIGhlcmUgc2VlbXMgdG8gbWVhbiBmaWxsZWQgYXMgb3Bwb3NlZCB0byBob2xsb3cgLS0+Ci08IUVOVElUWSBjbHVicyAgICAiJiM5ODI3OyI+IDwhLS0gYmxhY2sgY2x1YiBzdWl0ID0gc2hhbXJvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyNjYzIElTT3B1YiAtLT4KLTwhRU5USVRZIGhlYXJ0cyAgICImIzk4Mjk7Ij4gPCEtLSBibGFjayBoZWFydCBzdWl0ID0gdmFsZW50aW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjY2NSBJU09wdWIgLS0+Ci08IUVOVElUWSBkaWFtcyAgICAiJiM5ODMwOyI+IDwhLS0gYmxhY2sgZGlhbW9uZCBzdWl0LCBVKzI2NjYgSVNPcHViIC0tPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMS1mcmFtZXNldC5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxLWZyYW1lc2V0LmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzZjc5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxLWZyYW1lc2V0LmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMjUgKzAsMCBAQAotPCEtLQotICAgRXh0ZW5zaWJsZSBIVE1MIHZlcnNpb24gMS4wIEZyYW1lc2V0IERURAotCi0gICBUaGlzIGlzIHRoZSBzYW1lIGFzIEhUTUwgNC4wIEZyYW1lc2V0IGV4Y2VwdCBmb3IKLSAgIGNoYW5nZXMgZHVlIHRvIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIFhNTCBhbmQgU0dNTC4KLQotICAgTmFtZXNwYWNlID0gaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbAotCi0gICBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgc2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEKLQotICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwKLSAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotCi0gICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiIKLSAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkIgotCi0gICAkUmV2aXNpb246IDEuMSAkCi0gICAkRGF0ZTogMjAwNy8wNS8xNSAwMjo0MjoyMiAkCi0KLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMSBmb3IgWEhUTUwvL0VOIgotICAgInhodG1sLWxhdDEuZW50Ij4KLSVIVE1MbGF0MTsKLQotPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scyBmb3IgWEhUTUwvL0VOIgotICAgInhodG1sLXN5bWJvbC5lbnQiPgotJUhUTUxzeW1ib2w7Ci0KLTwhRU5USVRZICUgSFRNTHNwZWNpYWwgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsIGZvciBYSFRNTC8vRU4iCi0gICAieGh0bWwtc3BlY2lhbC5lbnQiPgotJUhUTUxzcGVjaWFsOwotCi08IS0tPT09PT09PT09PT09PT09PT09IEltcG9ydGVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlICJDREFUQSI+Ci0gICAgPCEtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlcyAiQ0RBVEEiPgotICAgIDwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgdHlwZXMsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldCAiQ0RBVEEiPgotICAgIDwhLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldHMgIkNEQVRBIj4KLSAgICA8IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBMYW5ndWFnZUNvZGUgIk5NVE9LRU4iPgotICAgIDwhLS0gYSBsYW5ndWFnZSBjb2RlLCBhcyBwZXIgW1JGQzE3NjZdIC0tPgotCi08IUVOVElUWSAlIENoYXJhY3RlciAiQ0RBVEEiPgotICAgIDwhLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAtLT4KLQotPCFFTlRJVFkgJSBOdW1iZXIgIkNEQVRBIj4KLSAgICA8IS0tIG9uZSBvciBtb3JlIGRpZ2l0cyAtLT4KLQotPCFFTlRJVFkgJSBMaW5rVHlwZXMgIkNEQVRBIj4KLSAgICA8IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMgLS0+Ci0KLTwhRU5USVRZICUgTWVkaWFEZXNjICJDREFUQSI+Ci0gICAgPCEtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMgLS0+Ci0KLTwhRU5USVRZICUgVVJJICJDREFUQSI+Ci0gICAgPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtSRkMyMzk2XSAtLT4KLQotPCFFTlRJVFkgJSBVcmlMaXN0ICJDREFUQSI+Ci0gICAgPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMgLS0+Ci0KLTwhRU5USVRZICUgRGF0ZXRpbWUgIkNEQVRBIj4KLSAgICA8IS0tIGRhdGUgYW5kIHRpbWUgaW5mb3JtYXRpb24uIElTTyBkYXRlIGZvcm1hdCAtLT4KLQotPCFFTlRJVFkgJSBTY3JpcHQgIkNEQVRBIj4KLSAgICA8IS0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotCi08IUVOVElUWSAlIFN0eWxlU2hlZXQgIkNEQVRBIj4KLSAgICA8IS0tIHN0eWxlIHNoZWV0IGRhdGEgLS0+Ci0KLTwhRU5USVRZICUgVGV4dCAiQ0RBVEEiPgotICAgIDwhLS0gdXNlZCBmb3IgdGl0bGVzIGV0Yy4gLS0+Ci0KLTwhRU5USVRZICUgRnJhbWVUYXJnZXQgIk5NVE9LRU4iPgotICAgIDwhLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0+Ci0KLTwhRU5USVRZICUgTGVuZ3RoICJDREFUQSI+Ci0gICAgPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci0KLTwhRU5USVRZICUgTXVsdGlMZW5ndGggIkNEQVRBIj4KLSAgICA8IS0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLQotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aHMgIkNEQVRBIj4KLSAgICA8IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIE11bHRpTGVuZ3RoIC0tPgotCi08IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiPgotICAgIDwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLQotPCEtLSB0aGVzZSBhcmUgdXNlZCBmb3IgaW1hZ2UgbWFwcyAtLT4KLQotPCFFTlRJVFkgJSBTaGFwZSAiKHJlY3R8Y2lyY2xlfHBvbHl8ZGVmYXVsdCkiPgotCi08IUVOVElUWSAlIENvb3JkcyAiQ0RBVEEiPgotICAgIDwhLS0gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLT4KLQotPCEtLSB1c2VkIGZvciBvYmplY3QsIGFwcGxldCwgaW1nLCBpbnB1dCBhbmQgaWZyYW1lIC0tPgotPCFFTlRJVFkgJSBJbWdBbGlnbiAiKHRvcHxtaWRkbGV8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCEtLSBhIGNvbG9yIHVzaW5nIHNSR0I6ICNSUkdHQkIgYXMgSGV4IHZhbHVlcyAtLT4KLTwhRU5USVRZICUgQ29sb3IgIkNEQVRBIj4KLQotPCEtLSBUaGVyZSBhcmUgYWxzbyAxNiB3aWRlbHkga25vd24gY29sb3IgbmFtZXMgd2l0aCB0aGVpciBzUkdCIHZhbHVlczoKLQotICAgIEJsYWNrICA9ICMwMDAwMDAgICAgR3JlZW4gID0gIzAwODAwMAotICAgIFNpbHZlciA9ICNDMEMwQzAgICAgTGltZSAgID0gIzAwRkYwMAotICAgIEdyYXkgICA9ICM4MDgwODAgICAgT2xpdmUgID0gIzgwODAwMAotICAgIFdoaXRlICA9ICNGRkZGRkYgICAgWWVsbG93ID0gI0ZGRkYwMAotICAgIE1hcm9vbiA9ICM4MDAwMDAgICAgTmF2eSAgID0gIzAwMDA4MAotICAgIFJlZCAgICA9ICNGRjAwMDAgICAgQmx1ZSAgID0gIzAwMDBGRgotICAgIFB1cnBsZSA9ICM4MDAwODAgICAgVGVhbCAgID0gIzAwODA4MAotICAgIEZ1Y2hzaWE9ICNGRjAwRkYgICAgQXF1YSAgID0gIzAwRkZGRgotLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEdlbmVyaWMgQXR0cmlidXRlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY29yZSBhdHRyaWJ1dGVzIGNvbW1vbiB0byBtb3N0IGVsZW1lbnRzCi0gIGlkICAgICAgIGRvY3VtZW50LXdpZGUgdW5pcXVlIGlkCi0gIGNsYXNzICAgIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMKLSAgc3R5bGUgICAgYXNzb2NpYXRlZCBzdHlsZSBpbmZvCi0gIHRpdGxlICAgIGFkdmlzb3J5IHRpdGxlL2FtcGxpZmljYXRpb24KLS0tPgotPCFFTlRJVFkgJSBjb3JlYXR0cnMKLSAiaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSBpbnRlcm5hdGlvbmFsaXphdGlvbiBhdHRyaWJ1dGVzCi0gIGxhbmcgICAgICAgIGxhbmd1YWdlIGNvZGUgKGJhY2t3YXJkcyBjb21wYXRpYmxlKQotICB4bWw6bGFuZyAgICBsYW5ndWFnZSBjb2RlIChhcyBwZXIgWE1MIDEuMCBzcGVjKQotICBkaXIgICAgICAgICBkaXJlY3Rpb24gZm9yIHdlYWsvbmV1dHJhbCB0ZXh0Ci0tLT4KLTwhRU5USVRZICUgaTE4bgotICJsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICB4bWw6bGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIGF0dHJpYnV0ZXMgZm9yIGNvbW1vbiBVSSBldmVudHMKLSAgb25jbGljayAgICAgYSBwb2ludGVyIGJ1dHRvbiB3YXMgY2xpY2tlZAotICBvbmRibGNsaWNrICBhIHBvaW50ZXIgYnV0dG9uIHdhcyBkb3VibGUgY2xpY2tlZAotICBvbm1vdXNlZG93biBhIHBvaW50ZXIgYnV0dG9uIHdhcyBwcmVzc2VkIGRvd24KLSAgb25tb3VzZXVwICAgYSBwb2ludGVyIGJ1dHRvbiB3YXMgcmVsZWFzZWQKLSAgb25tb3VzZW1vdmUgYSBwb2ludGVyIHdhcyBtb3ZlZCBvbnRvIHRoZSBlbGVtZW50Ci0gIG9ubW91c2VvdXQgIGEgcG9pbnRlciB3YXMgbW92ZWQgYXdheSBmcm9tIHRoZSBlbGVtZW50Ci0gIG9ua2V5cHJlc3MgIGEga2V5IHdhcyBwcmVzc2VkIGFuZCByZWxlYXNlZAotICBvbmtleWRvd24gICBhIGtleSB3YXMgcHJlc3NlZCBkb3duCi0gIG9ua2V5dXAgICAgIGEga2V5IHdhcyByZWxlYXNlZAotLS0+Ci08IUVOVElUWSAlIGV2ZW50cwotICJvbmNsaWNrICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmRibGNsaWNrICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlZG93biAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNldXAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlb3ZlciAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlbW92ZSAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlb3V0ICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleXByZXNzICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleWRvd24gICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleXVwICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIGF0dHJpYnV0ZXMgZm9yIGVsZW1lbnRzIHRoYXQgY2FuIGdldCB0aGUgZm9jdXMKLSAgYWNjZXNza2V5ICAgYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyCi0gIHRhYmluZGV4ICAgIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIKLSAgb25mb2N1cyAgICAgdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cwotICBvbmJsdXIgICAgICB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cwotLS0+Ci08IUVOVElUWSAlIGZvY3VzCi0gImFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhRU5USVRZICUgYXR0cnMgIiVjb3JlYXR0cnM7ICVpMThuOyAlZXZlbnRzOyI+Ci0KLTwhLS0gdGV4dCBhbGlnbm1lbnQgZm9yIHAsIGRpdiwgaDEtaDYuIFRoZSBkZWZhdWx0IGlzCi0gICAgIGFsaWduPSJsZWZ0IiBmb3IgbHRyIGhlYWRpbmdzLCAicmlnaHQiIGZvciBydGwgLS0+Ci0KLTwhRU5USVRZICUgVGV4dEFsaWduICJhbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVEIj4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gVGV4dCBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBzcGVjaWFsCi0gICAiYnIgfCBzcGFuIHwgYmRvIHxvYmplY3QgfCBhcHBsZXQgfCBpbWcgfCBtYXAgfCBpZnJhbWUiPgotCi08IUVOVElUWSAlIGZvbnRzdHlsZSAidHQgfCBpIHwgYiB8IGJpZyB8IHNtYWxsIHwgdQotICAgICAgICAgICAgICAgICAgICAgIHwgcyB8IHN0cmlrZSB8Zm9udCB8IGJhc2Vmb250Ij4KLQotPCFFTlRJVFkgJSBwaHJhc2UgImVtIHwgc3Ryb25nIHwgZGZuIHwgY29kZSB8IHEgfCBzdWIgfCBzdXAgfAotICAgICAgICAgICAgICAgICAgIHNhbXAgfCBrYmQgfCB2YXIgfCBjaXRlIHwgYWJiciB8IGFjcm9ueW0iPgotCi08IUVOVElUWSAlIGlubGluZS5mb3JtcyAiaW5wdXQgfCBzZWxlY3QgfCB0ZXh0YXJlYSB8IGxhYmVsIHwgYnV0dG9uIj4KLQotPCEtLSB0aGVzZSBjYW4gb2NjdXIgYXQgYmxvY2sgb3IgaW5saW5lIGxldmVsIC0tPgotPCFFTlRJVFkgJSBtaXNjICJpbnMgfCBkZWwgfCBzY3JpcHQgfCBub3NjcmlwdCI+Ci0KLTwhRU5USVRZICUgaW5saW5lICJhIHwgJXNwZWNpYWw7IHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVpbmxpbmUuZm9ybXM7Ij4KLQotPCEtLSAlSW5saW5lOyBjb3ZlcnMgaW5saW5lIG9yICJ0ZXh0LWxldmVsIiBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgSW5saW5lICIoI1BDREFUQSB8ICVpbmxpbmU7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEJsb2NrIGxldmVsIGVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGhlYWRpbmcgImgxfGgyfGgzfGg0fGg1fGg2Ij4KLTwhRU5USVRZICUgbGlzdHMgInVsIHwgb2wgfCBkbCB8IG1lbnUgfCBkaXIiPgotPCFFTlRJVFkgJSBibG9ja3RleHQgInByZSB8IGhyIHwgYmxvY2txdW90ZSB8IGFkZHJlc3MgfCBjZW50ZXIiPgotCi08IUVOVElUWSAlIGJsb2NrCi0gICAgInAgfCAlaGVhZGluZzsgfCBkaXYgfCAlbGlzdHM7IHwgJWJsb2NrdGV4dDsgfCBpc2luZGV4IHwgZmllbGRzZXQgfCB0YWJsZSI+Ci0KLTwhRU5USVRZICUgQmxvY2sgIiglYmxvY2s7IHwgZm9ybSB8ICVtaXNjOykqIj4KLQotPCEtLSAlRmxvdzsgbWl4ZXMgQmxvY2sgYW5kIElubGluZSBhbmQgaXMgdXNlZCBmb3IgbGlzdCBpdGVtcyBldGMuIC0tPgotPCFFTlRJVFkgJSBGbG93ICIoI1BDREFUQSB8ICVibG9jazsgfCBmb3JtIHwgJWlubGluZTsgfCAlbWlzYzspKiI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gQ29udGVudCBtb2RlbHMgZm9yIGV4Y2x1c2lvbnMgPT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gYSBlbGVtZW50cyB1c2UgJUlubGluZTsgZXhjbHVkaW5nIGEgLS0+Ci0KLTwhRU5USVRZICUgYS5jb250ZW50Ci0gICAiKCNQQ0RBVEEgfCAlc3BlY2lhbDsgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJWlubGluZS5mb3JtczsgfCAlbWlzYzspKiI+Ci0KLTwhLS0gcHJlIHVzZXMgJUlubGluZSBleGNsdWRpbmcgaW1nLCBvYmplY3QsIGFwcGxldCwgYmlnLCBzbWFsbCwKLSAgICAgc3ViLCBzdXAsIGZvbnQsIG9yIGJhc2Vmb250IC0tPgotCi08IUVOVElUWSAlIHByZS5jb250ZW50Ci0gICAiKCNQQ0RBVEEgfCBhIHwgYnIgfCBzcGFuIHwgYmRvIHwgbWFwIHwgdHQgfCBpIHwgYiB8IHUgfCBzIHwKLSAgICAgICVwaHJhc2U7IHwgJWlubGluZS5mb3JtczspKiI+Ci0KLTwhLS0gZm9ybSB1c2VzICVGbG93OyBleGNsdWRpbmcgZm9ybSAtLT4KLQotPCFFTlRJVFkgJSBmb3JtLmNvbnRlbnQgIigjUENEQVRBIHwgJWJsb2NrOyB8ICVpbmxpbmU7IHwgJW1pc2M7KSoiPgotCi08IS0tIGJ1dHRvbiB1c2VzICVGbG93OyBidXQgZXhjbHVkZXMgYSwgZm9ybSwgZm9ybSBjb250cm9scywgaWZyYW1lIC0tPgotCi08IUVOVElUWSAlIGJ1dHRvbi5jb250ZW50Ci0gICAiKCNQQ0RBVEEgfCBwIHwgJWhlYWRpbmc7IHwgZGl2IHwgJWxpc3RzOyB8ICVibG9ja3RleHQ7IHwKLSAgICAgIHRhYmxlIHwgYnIgfCBzcGFuIHwgYmRvIHwgb2JqZWN0IHwgYXBwbGV0IHwgaW1nIHwgbWFwIHwKLSAgICAgICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlbWlzYzspKiI+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IFN0cnVjdHVyZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gdGhlIG5hbWVzcGFjZSBVUkkgZGVzaWduYXRlcyB0aGUgZG9jdW1lbnQgcHJvZmlsZSAtLT4KLQotPCFFTEVNRU5UIGh0bWwgKGhlYWQsIGZyYW1lc2V0KT4KLTwhQVRUTElTVCBodG1sCi0gICVpMThuOwotICB4bWxucyAgICAgICAlVVJJOyAgICAgICAgICAjRklYRUQgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgSGVhZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIihzY3JpcHR8c3R5bGV8bWV0YXxsaW5rfG9iamVjdHxpc2luZGV4KSoiPgotCi08IS0tIGNvbnRlbnQgbW9kZWwgaXMgJWhlYWQubWlzYzsgY29tYmluZWQgd2l0aCBhIHNpbmdsZQotICAgICB0aXRsZSBhbmQgYW4gb3B0aW9uYWwgYmFzZSBlbGVtZW50IGluIGFueSBvcmRlciAtLT4KLQotPCFFTEVNRU5UIGhlYWQgKCVoZWFkLm1pc2M7LAotICAgICAoKHRpdGxlLCAlaGVhZC5taXNjOywgKGJhc2UsICVoZWFkLm1pc2M7KT8pIHwKLSAgICAgIChiYXNlLCAlaGVhZC5taXNjOywgKHRpdGxlLCAlaGVhZC5taXNjOykpKSk+Ci0KLTwhQVRUTElTVCBoZWFkCi0gICVpMThuOwotICBwcm9maWxlICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gVGhlIHRpdGxlIGVsZW1lbnQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgZmxvdyBvZiB0ZXh0LgotICAgICAgIEl0IHNob3VsZCBiZSBkaXNwbGF5ZWQsIGZvciBleGFtcGxlIGFzIHRoZSBwYWdlIGhlYWRlciBvcgotICAgICAgIHdpbmRvdyB0aXRsZS4gRXhhY3RseSBvbmUgdGl0bGUgaXMgcmVxdWlyZWQgcGVyIGRvY3VtZW50LgotICAgIC0tPgotPCFFTEVNRU5UIHRpdGxlICgjUENEQVRBKT4KLTwhQVRUTElTVCB0aXRsZSAlaTE4bjs+Ci0KLTwhLS0gZG9jdW1lbnQgYmFzZSBVUkkgLS0+Ci0KLTwhRUxFTUVOVCBiYXNlIEVNUFRZPgotPCFBVFRMSVNUIGJhc2UKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tIGdlbmVyaWMgbWV0YWluZm9ybWF0aW9uIC0tPgotPCFFTEVNRU5UIG1ldGEgRU1QVFk+Ci08IUFUVExJU1QgbWV0YQotICAlaTE4bjsKLSAgaHR0cC1lcXVpdiAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgY29udGVudCAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVECi0gIHNjaGVtZSAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBSZWxhdGlvbnNoaXAgdmFsdWVzIGNhbiBiZSB1c2VkIGluIHByaW5jaXBsZToKLQotICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzIHdoZW4gdXNlZAotICAgICAgd2l0aCB0aGUgbGluayBlbGVtZW50IGluIGRvY3VtZW50IGhlYWQgZS5nLgotICAgICAgICBzdGFydCwgY29udGVudHMsIHByZXZpb3VzLCBuZXh0LCBpbmRleCwgZW5kLCBoZWxwCi0gICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQgKHJlbD0ic3R5bGVzaGVldCIpCi0gICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPSJzY3JpcHQiKQotICAgZCkgYnkgc3R5bGVzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YKLSAgICAgIGh0bWwgbm9kZXMgYXJlIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgZS5nLiBhIFBvc3RTY3JpcHQgb3IgUERGIHZlcnNpb24gKHJlbD0iYWx0ZXJuYXRlIiBtZWRpYT0icHJpbnQiKQotLS0+Ci0KLTwhRUxFTUVOVCBsaW5rIEVNUFRZPgotPCFBVFRMSVNUIGxpbmsKLSAgJWF0dHJzOwotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRAotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRAotICA+Ci0KLTwhLS0gc3R5bGUgaW5mbywgd2hpY2ggbWF5IGluY2x1ZGUgQ0RBVEEgc2VjdGlvbnMgLS0+Ci08IUVMRU1FTlQgc3R5bGUgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIHN0eWxlCi0gICVpMThuOwotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQKLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgeG1sOnNwYWNlICAgKHByZXNlcnZlKSAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLSAgPgotCi08IS0tIHNjcmlwdCBzdGF0ZW1lbnRzLCB3aGljaCBtYXkgaW5jbHVkZSBDREFUQSBzZWN0aW9ucyAtLT4KLTwhRUxFTUVOVCBzY3JpcHQgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIHNjcmlwdAotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQKLSAgbGFuZ3VhZ2UgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGVmZXIgICAgICAgKGRlZmVyKSAgICAgICAgI0lNUExJRUQKLSAgeG1sOnNwYWNlICAgKHByZXNlcnZlKSAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLSAgPgotCi08IS0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIHNjcmlwdC1iYXNlZCByZW5kZXJpbmcgLS0+Ci0KLTwhRUxFTUVOVCBub3NjcmlwdCAlRmxvdzs+Ci08IUFUVExJU1Qgbm9zY3JpcHQKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PSBGcmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gb25seSBvbmUgbm9mcmFtZXMgZWxlbWVudCBwZXJtaXR0ZWQgcGVyIGRvY3VtZW50IC0tPgotCi08IUVMRU1FTlQgZnJhbWVzZXQgKGZyYW1lc2V0fGZyYW1lfG5vZnJhbWVzKSo+Ci08IUFUVExJU1QgZnJhbWVzZXQKLSAgJWNvcmVhdHRyczsKLSAgcm93cyAgICAgICAgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQKLSAgY29scyAgICAgICAgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQKLSAgb25sb2FkICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb251bmxvYWQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIHJlc2VydmVkIGZyYW1lIG5hbWVzIHN0YXJ0IHdpdGggIl8iIG90aGVyd2lzZSBzdGFydHMgd2l0aCBsZXR0ZXIgLS0+Ci0KLTwhLS0gdGlsZWQgd2luZG93IHdpdGhpbiBmcmFtZXNldCAtLT4KLQotPCFFTEVNRU5UIGZyYW1lIEVNUFRZPgotPCFBVFRMSVNUIGZyYW1lCi0gICVjb3JlYXR0cnM7Ci0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGZyYW1lYm9yZGVyICgxfDApICAgICAgICAgICIxIgotICBtYXJnaW53aWR0aCAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBtYXJnaW5oZWlnaHQgJVBpeGVsczsgICAgICAjSU1QTElFRAotICBub3Jlc2l6ZSAgICAobm9yZXNpemUpICAgICAjSU1QTElFRAotICBzY3JvbGxpbmcgICAoeWVzfG5vfGF1dG8pICAiYXV0byIKLSAgPgotCi08IS0tIGlubGluZSBzdWJ3aW5kb3cgLS0+Ci0KLTwhRUxFTUVOVCBpZnJhbWUgJUZsb3c7PgotPCFBVFRMSVNUIGlmcmFtZQotICAlY29yZWF0dHJzOwotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBmcmFtZWJvcmRlciAoMXwwKSAgICAgICAgICAiMSIKLSAgbWFyZ2lud2lkdGggJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgbWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICAgICAgI0lNUExJRUQKLSAgc2Nyb2xsaW5nICAgKHllc3xub3xhdXRvKSAgImF1dG8iCi0gIGFsaWduICAgICAgICVJbWdBbGlnbjsgICAgICNJTVBMSUVECi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBmcmFtZS1iYXNlZCByZW5kZXJpbmcgLS0+Ci0KLTwhRUxFTUVOVCBub2ZyYW1lcyAoYm9keSk+Ci08IUFUVExJU1Qgbm9mcmFtZXMKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IERvY3VtZW50IEJvZHkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBib2R5ICVGbG93Oz4KLTwhQVRUTElTVCBib2R5Ci0gICVhdHRyczsKLSAgb25sb2FkICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb251bmxvYWQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgYmFja2dyb3VuZCAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgdGV4dCAgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgbGluayAgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgdmxpbmsgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgYWxpbmsgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZGl2ICVGbG93Oz4gIDwhLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1QgZGl2Ci0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQYXJhZ3JhcGhzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgcCAlSW5saW5lOz4KLTwhQVRUTElTVCBwCi0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIZWFkaW5ncyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZXJlIGFyZSBzaXggbGV2ZWxzIG9mIGhlYWRpbmdzIGZyb20gaDEgKHRoZSBtb3N0IGltcG9ydGFudCkKLSAgdG8gaDYgKHRoZSBsZWFzdCBpbXBvcnRhbnQpLgotLS0+Ci0KLTwhRUxFTUVOVCBoMSAgJUlubGluZTs+Ci08IUFUVExJU1QgaDEKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhRUxFTUVOVCBoMiAlSW5saW5lOz4KLTwhQVRUTElTVCBoMgotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCFFTEVNRU5UIGgzICVJbmxpbmU7PgotPCFBVFRMSVNUIGgzCi0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IUVMRU1FTlQgaDQgJUlubGluZTs+Ci08IUFUVExJU1QgaDQKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhRUxFTUVOVCBoNSAlSW5saW5lOz4KLTwhQVRUTElTVCBoNQotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCFFTEVNRU5UIGg2ICVJbmxpbmU7PgotPCFBVFRMSVNUIGg2Ci0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFVub3JkZXJlZCBsaXN0IGJ1bGxldCBzdHlsZXMgLS0+Ci0KLTwhRU5USVRZICUgVUxTdHlsZSAiKGRpc2N8c3F1YXJlfGNpcmNsZSkiPgotCi08IS0tIFVub3JkZXJlZCBsaXN0IC0tPgotCi08IUVMRU1FTlQgdWwgKGxpKSs+Ci08IUFUVExJU1QgdWwKLSAgJWF0dHJzOwotICB0eXBlICAgICAgICAlVUxTdHlsZTsgICAgICNJTVBMSUVECi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIE9yZGVyZWQgbGlzdCBudW1iZXJpbmcgc3R5bGUKLQotICAgIDEgICBhcmFiaWMgbnVtYmVycyAgICAgIDEsIDIsIDMsIC4uLgotICAgIGEgICBsb3dlciBhbHBoYSAgICAgICAgIGEsIGIsIGMsIC4uLgotICAgIEEgICB1cHBlciBhbHBoYSAgICAgICAgIEEsIEIsIEMsIC4uLgotICAgIGkgICBsb3dlciByb21hbiAgICAgICAgIGksIGlpLCBpaWksIC4uLgotICAgIEkgICB1cHBlciByb21hbiAgICAgICAgIEksIElJLCBJSUksIC4uLgotCi0gICAgVGhlIHN0eWxlIGlzIGFwcGxpZWQgdG8gdGhlIHNlcXVlbmNlIG51bWJlciB3aGljaCBieSBkZWZhdWx0Ci0gICAgaXMgcmVzZXQgdG8gMSBmb3IgdGhlIGZpcnN0IGxpc3QgaXRlbSBpbiBhbiBvcmRlcmVkIGxpc3QuCi0tLT4KLTwhRU5USVRZICUgT0xTdHlsZSAiQ0RBVEEiPgotCi08IS0tIE9yZGVyZWQgKG51bWJlcmVkKSBsaXN0IC0tPgotCi08IUVMRU1FTlQgb2wgKGxpKSs+Ci08IUFUVExJU1Qgb2wKLSAgJWF0dHJzOwotICB0eXBlICAgICAgICAlT0xTdHlsZTsgICAgICAjSU1QTElFRAotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRAotICBzdGFydCAgICAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gc2luZ2xlIGNvbHVtbiBsaXN0IChERVBSRUNBVEVEKSAtLT4gCi08IUVMRU1FTlQgbWVudSAobGkpKz4KLTwhQVRUTElTVCBtZW51Ci0gICVhdHRyczsKLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gbXVsdGlwbGUgY29sdW1uIGxpc3QgKERFUFJFQ0FURUQpIC0tPiAKLTwhRUxFTUVOVCBkaXIgKGxpKSs+Ci08IUFUVExJU1QgZGlyCi0gICVhdHRyczsKLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gTElTdHlsZSBpcyBjb25zdHJhaW5lZCB0bzogIiglVUxTdHlsZTt8JU9MU3R5bGU7KSIgLS0+Ci08IUVOVElUWSAlIExJU3R5bGUgIkNEQVRBIj4KLQotPCEtLSBsaXN0IGl0ZW0gLS0+Ci0KLTwhRUxFTUVOVCBsaSAlRmxvdzs+Ci08IUFUVExJU1QgbGkKLSAgJWF0dHJzOwotICB0eXBlICAgICAgICAlTElTdHlsZTsgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gZGVmaW5pdGlvbiBsaXN0cyAtIGR0IGZvciB0ZXJtLCBkZCBmb3IgaXRzIGRlZmluaXRpb24gLS0+Ci0KLTwhRUxFTUVOVCBkbCAoZHR8ZGQpKz4KLTwhQVRUTElTVCBkbAotICAlYXR0cnM7Ci0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGR0ICVJbmxpbmU7PgotPCFBVFRMSVNUIGR0Ci0gICVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgZGQgJUZsb3c7PgotPCFBVFRMSVNUIGRkCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBBZGRyZXNzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGluZm9ybWF0aW9uIG9uIGF1dGhvciAtLT4KLQotPCFFTEVNRU5UIGFkZHJlc3MgJUlubGluZTs+Ci08IUFUVExJU1QgYWRkcmVzcwotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGhyIEVNUFRZPgotPCFBVFRMSVNUIGhyCi0gICVhdHRyczsKLSAgYWxpZ24gICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRAotICBub3NoYWRlICAgICAobm9zaGFkZSkgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY29udGVudCBpcyAlSW5saW5lOyBleGNsdWRpbmcgCi0gICAgICAgICJpbWd8b2JqZWN0fGFwcGxldHxiaWd8c21hbGx8c3VifHN1cHxmb250fGJhc2Vmb250IiAtLT4KLQotPCFFTEVNRU5UIHByZSAlcHJlLmNvbnRlbnQ7PgotPCFBVFRMSVNUIHByZQotICAlYXR0cnM7Ci0gIHdpZHRoICAgICAgICVOdW1iZXI7ICAgICAgI0lNUExJRUQKLSAgeG1sOnNwYWNlICAgKHByZXNlcnZlKSAgICAjRklYRUQgJ3ByZXNlcnZlJwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEJsb2NrLWxpa2UgUXVvdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBibG9ja3F1b3RlICVGbG93Oz4KLTwhQVRUTElTVCBibG9ja3F1b3RlCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBUZXh0IGFsaWdubWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNlbnRlciBjb250ZW50IC0tPgotPCFFTEVNRU5UIGNlbnRlciAlRmxvdzs+Ci08IUFUVExJU1QgY2VudGVyCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbnNlcnRlZC9EZWxldGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0KLTwhLS0KLSAgaW5zL2RlbCBhcmUgYWxsb3dlZCBpbiBibG9jayBhbmQgaW5saW5lIGNvbnRlbnQsIGJ1dCBpdHMKLSAgaW5hcHByb3ByaWF0ZSB0byBpbmNsdWRlIGJsb2NrIGNvbnRlbnQgd2l0aGluIGFuIGlucyBlbGVtZW50Ci0gIG9jY3VycmluZyBpbiBpbmxpbmUgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIGlucyAlRmxvdzs+Ci08IUFUVExJU1QgaW5zCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZGVsICVGbG93Oz4KLTwhQVRUTElTVCBkZWwKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkYXRldGltZSAgICAlRGF0ZXRpbWU7ICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY29udGVudCBpcyAlSW5saW5lOyBleGNlcHQgdGhhdCBhbmNob3JzIHNob3VsZG4ndCBiZSBuZXN0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBhICVhLmNvbnRlbnQ7PgotPCFBVFRMSVNUIGEKLSAgJWF0dHJzOwotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICAicmVjdCIKLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09IElubGluZSBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgc3BhbiAlSW5saW5lOz4gPCEtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBzcGFuCi0gICVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgYmRvICVJbmxpbmU7PiAgPCEtLSBJMThOIEJpRGkgb3Zlci1yaWRlIC0tPgotPCFBVFRMSVNUIGJkbwotICAlY29yZWF0dHJzOwotICAlZXZlbnRzOwotICBsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICB4bWw6bGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjUkVRVUlSRUQKLSAgPgotCi08IUVMRU1FTlQgYnIgRU1QVFk+ICAgPCEtLSBmb3JjZWQgbGluZSBicmVhayAtLT4KLTwhQVRUTElTVCBicgotICAlY29yZWF0dHJzOwotICBjbGVhciAgICAgICAobGVmdHxhbGx8cmlnaHR8bm9uZSkgIm5vbmUiCi0gID4KLQotPCFFTEVNRU5UIGVtICVJbmxpbmU7PiAgIDwhLS0gZW1waGFzaXMgLS0+Ci08IUFUVExJU1QgZW0gJWF0dHJzOz4KLQotPCFFTEVNRU5UIHN0cm9uZyAlSW5saW5lOz4gICA8IS0tIHN0cm9uZyBlbXBoYXNpcyAtLT4KLTwhQVRUTElTVCBzdHJvbmcgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGRmbiAlSW5saW5lOz4gICA8IS0tIGRlZmluaXRpb25hbCAtLT4KLTwhQVRUTElTVCBkZm4gJWF0dHJzOz4KLQotPCFFTEVNRU5UIGNvZGUgJUlubGluZTs+ICAgPCEtLSBwcm9ncmFtIGNvZGUgLS0+Ci08IUFUVExJU1QgY29kZSAlYXR0cnM7PgotCi08IUVMRU1FTlQgc2FtcCAlSW5saW5lOz4gICA8IS0tIHNhbXBsZSAtLT4KLTwhQVRUTElTVCBzYW1wICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBrYmQgJUlubGluZTs+ICA8IS0tIHNvbWV0aGluZyB1c2VyIHdvdWxkIHR5cGUgLS0+Ci08IUFUVExJU1Qga2JkICVhdHRyczs+Ci0KLTwhRUxFTUVOVCB2YXIgJUlubGluZTs+ICAgPCEtLSB2YXJpYWJsZSAtLT4KLTwhQVRUTElTVCB2YXIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGNpdGUgJUlubGluZTs+ICAgPCEtLSBjaXRhdGlvbiAtLT4KLTwhQVRUTElTVCBjaXRlICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBhYmJyICVJbmxpbmU7PiAgIDwhLS0gYWJicmV2aWF0aW9uIC0tPgotPCFBVFRMSVNUIGFiYnIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGFjcm9ueW0gJUlubGluZTs+ICAgPCEtLSBhY3JvbnltIC0tPgotPCFBVFRMSVNUIGFjcm9ueW0gJWF0dHJzOz4KLQotPCFFTEVNRU5UIHEgJUlubGluZTs+ICAgPCEtLSBpbmxpbmVkIHF1b3RlIC0tPgotPCFBVFRMSVNUIHEKLSAgICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgID4KLQotPCFFTEVNRU5UIHN1YiAlSW5saW5lOz4gPCEtLSBzdWJzY3JpcHQgLS0+Ci08IUFUVExJU1Qgc3ViICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzdXAgJUlubGluZTs+IDwhLS0gc3VwZXJzY3JpcHQgLS0+Ci08IUFUVExJU1Qgc3VwICVhdHRyczs+Ci0KLTwhRUxFTUVOVCB0dCAlSW5saW5lOz4gICA8IS0tIGZpeGVkIHBpdGNoIGZvbnQgLS0+Ci08IUFUVExJU1QgdHQgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGkgJUlubGluZTs+ICAgPCEtLSBpdGFsaWMgZm9udCAtLT4KLTwhQVRUTElTVCBpICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBiICVJbmxpbmU7PiAgIDwhLS0gYm9sZCBmb250IC0tPgotPCFBVFRMSVNUIGIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGJpZyAlSW5saW5lOz4gICA8IS0tIGJpZ2dlciBmb250IC0tPgotPCFBVFRMSVNUIGJpZyAlYXR0cnM7PgotCi08IUVMRU1FTlQgc21hbGwgJUlubGluZTs+ICAgPCEtLSBzbWFsbGVyIGZvbnQgLS0+Ci08IUFUVExJU1Qgc21hbGwgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHUgJUlubGluZTs+ICAgPCEtLSB1bmRlcmxpbmUgLS0+Ci08IUFUVExJU1QgdSAlYXR0cnM7PgotCi08IUVMRU1FTlQgcyAlSW5saW5lOz4gICA8IS0tIHN0cmlrZS10aHJvdWdoIC0tPgotPCFBVFRMSVNUIHMgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHN0cmlrZSAlSW5saW5lOz4gICA8IS0tIHN0cmlrZS10aHJvdWdoIC0tPgotPCFBVFRMSVNUIHN0cmlrZSAlYXR0cnM7PgotCi08IUVMRU1FTlQgYmFzZWZvbnQgRU1QVFk+ICA8IS0tIGJhc2UgZm9udCBzaXplIC0tPgotPCFBVFRMSVNUIGJhc2Vmb250Ci0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRAotICBjb2xvciAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICBmYWNlICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBmb250ICVJbmxpbmU7PiA8IS0tIGxvY2FsIGNoYW5nZSB0byBmb250IC0tPgotPCFBVFRMSVNUIGZvbnQKLSAgJWNvcmVhdHRyczsKLSAgJWkxOG47Ci0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGNvbG9yICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIGZhY2UgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09IE9iamVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBvYmplY3QgaXMgdXNlZCB0byBlbWJlZCBvYmplY3RzIGFzIHBhcnQgb2YgSFRNTCBwYWdlcy4KLSAgcGFyYW0gZWxlbWVudHMgc2hvdWxkIHByZWNlZGUgb3RoZXIgY29udGVudC4gUGFyYW1ldGVycwotICBjYW4gYWxzbyBiZSBleHByZXNzZWQgYXMgYXR0cmlidXRlL3ZhbHVlIHBhaXJzIG9uIHRoZQotICBvYmplY3QgZWxlbWVudCBpdHNlbGYgd2hlbiBicmV2aXR5IGlzIGRlc2lyZWQuCi0tLT4KLQotPCFFTEVNRU5UIG9iamVjdCAoI1BDREFUQSB8IHBhcmFtIHwgJWJsb2NrOyB8IGZvcm0gfCVpbmxpbmU7IHwgJW1pc2M7KSo+Ci08IUFUVExJU1Qgb2JqZWN0Ci0gICVhdHRyczsKLSAgZGVjbGFyZSAgICAgKGRlY2xhcmUpICAgICAgI0lNUExJRUQKLSAgY2xhc3NpZCAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0YSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgY29kZXR5cGUgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgYXJjaGl2ZSAgICAgJVVyaUxpc3Q7ICAgICAgI0lNUExJRUQKLSAgc3RhbmRieSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIHBhcmFtIGlzIHVzZWQgdG8gc3VwcGx5IGEgbmFtZWQgcHJvcGVydHkgdmFsdWUuCi0gIEluIFhNTCBpdCB3b3VsZCBzZWVtIG5hdHVyYWwgdG8gZm9sbG93IFJERiBhbmQgc3VwcG9ydCBhbgotICBhYmJyZXZpYXRlZCBzeW50YXggd2hlcmUgdGhlIHBhcmFtIGVsZW1lbnRzIGFyZSByZXBsYWNlZAotICBieSBhdHRyaWJ1dGUgdmFsdWUgcGFpcnMgb24gdGhlIG9iamVjdCBzdGFydCB0YWcuCi0tLT4KLTwhRUxFTUVOVCBwYXJhbSBFTVBUWT4KLTwhQVRUTElTVCBwYXJhbQotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWV0eXBlICAgKGRhdGF8cmVmfG9iamVjdCkgImRhdGEiCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSmF2YSBhcHBsZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBPbmUgb2YgY29kZSBvciBvYmplY3QgYXR0cmlidXRlcyBtdXN0IGJlIHByZXNlbnQuCi0gIFBsYWNlIHBhcmFtIGVsZW1lbnRzIGJlZm9yZSBvdGhlciBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgYXBwbGV0ICgjUENEQVRBIHwgcGFyYW0gfCAlYmxvY2s7IHwgZm9ybSB8ICVpbmxpbmU7IHwgJW1pc2M7KSo+Ci08IUFUVExJU1QgYXBwbGV0Ci0gICVjb3JlYXR0cnM7Ci0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGFyY2hpdmUgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGNvZGUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIG9iamVjdCAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNSRVFVSVJFRAotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjUkVRVUlSRUQKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gICBUbyBhdm9pZCBhY2Nlc3NpYmlsaXR5IHByb2JsZW1zIGZvciBwZW9wbGUgd2hvIGFyZW4ndAotICAgYWJsZSB0byBzZWUgdGhlIGltYWdlLCB5b3Ugc2hvdWxkIHByb3ZpZGUgYSB0ZXh0Ci0gICBkZXNjcmlwdGlvbiB1c2luZyB0aGUgYWx0IGFuZCBsb25nZGVzYyBhdHRyaWJ1dGVzLgotICAgSW4gYWRkaXRpb24sIGF2b2lkIHRoZSB1c2Ugb2Ygc2VydmVyLXNpZGUgaW1hZ2UgbWFwcy4KLS0tPgotCi08IUVMRU1FTlQgaW1nIEVNUFRZPgotPCFBVFRMSVNUIGltZwotICAlYXR0cnM7Ci0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaXNtYXAgICAgICAgKGlzbWFwKSAgICAgICAgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIHVzZW1hcCBwb2ludHMgdG8gYSBtYXAgZWxlbWVudCB3aGljaCBtYXkgYmUgaW4gdGhpcyBkb2N1bWVudAotICBvciBhbiBleHRlcm5hbCBkb2N1bWVudCwgYWx0aG91Z2ggdGhlIGxhdHRlciBpcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCAtLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDbGllbnQtc2lkZSBpbWFnZSBtYXBzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBUaGVzZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRvY3VtZW50IG9yIGdyb3VwZWQgaW4gYQotICAgICBzZXBhcmF0ZSBkb2N1bWVudCBhbHRob3VnaCB0aGlzIGlzbid0IHlldCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IUVMRU1FTlQgbWFwICgoJWJsb2NrOyB8IGZvcm0gfCAlbWlzYzspKyB8IGFyZWErKT4KLTwhQVRUTElTVCBtYXAKLSAgJWkxOG47Ci0gICVldmVudHM7Ci0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNSRVFVSVJFRAotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBhcmVhIEVNUFRZPgotPCFBVFRMSVNUIGFyZWEKLSAgJWF0dHJzOwotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICAicmVjdCIKLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgbm9ocmVmICAgICAgKG5vaHJlZikgICAgICAgI0lNUExJRUQKLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRm9ybXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGZvcm0gJWZvcm0uY29udGVudDs+ICAgPCEtLSBmb3JtcyBzaG91bGRuJ3QgYmUgbmVzdGVkIC0tPgotCi08IUFUVExJU1QgZm9ybQotICAlYXR0cnM7Ci0gIGFjdGlvbiAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRAotICBtZXRob2QgICAgICAoZ2V0fHBvc3QpICAgICAiZ2V0IgotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBlbmN0eXBlICAgICAlQ29udGVudFR5cGU7ICAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICBvbnN1Ym1pdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnJlc2V0ICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRAotICBhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7ICAjSU1QTElFRAotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgRWFjaCBsYWJlbCBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiBPTkUgZmllbGQKLSAgTGFiZWwgZWxlbWVudHMgc2hvdWxkbid0IGJlIG5lc3RlZC4KLS0tPgotPCFFTEVNRU5UIGxhYmVsICVJbmxpbmU7PgotPCFBVFRMSVNUIGxhYmVsCi0gICVhdHRyczsKLSAgZm9yICAgICAgICAgSURSRUYgICAgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVOVElUWSAlIElucHV0VHlwZQotICAiKHRleHQgfCBwYXNzd29yZCB8IGNoZWNrYm94IHwKLSAgICByYWRpbyB8IHN1Ym1pdCB8IHJlc2V0IHwKLSAgICBmaWxlIHwgaGlkZGVuIHwgaW1hZ2UgfCBidXR0b24pIgotICAgPgotCi08IS0tIHRoZSBuYW1lIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBmb3IgYWxsIGJ1dCBzdWJtaXQgJiByZXNldCAtLT4KLQotPCFFTEVNRU5UIGlucHV0IEVNUFRZPiAgICAgPCEtLSBmb3JtIGNvbnRyb2wgLS0+Ci08IUFUVExJU1QgaW5wdXQKLSAgJWF0dHJzOwotICB0eXBlICAgICAgICAlSW5wdXRUeXBlOyAgICAidGV4dCIKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgY2hlY2tlZCAgICAgKGNoZWNrZWQpICAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgcmVhZG9ubHkgICAgKHJlYWRvbmx5KSAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgbWF4bGVuZ3RoICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgYWx0ICAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25zZWxlY3QgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgc2VsZWN0IChvcHRncm91cHxvcHRpb24pKz4gIDwhLS0gb3B0aW9uIHNlbGVjdG9yIC0tPgotPCFBVFRMSVNUIHNlbGVjdAotICAlYXR0cnM7Ci0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG11bHRpcGxlICAgIChtdWx0aXBsZSkgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIG9wdGdyb3VwIChvcHRpb24pKz4gICA8IS0tIG9wdGlvbiBncm91cCAtLT4KLTwhQVRUTElTVCBvcHRncm91cAotICAlYXR0cnM7Ci0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRAotICA+Ci0KLTwhRUxFTUVOVCBvcHRpb24gKCNQQ0RBVEEpPiAgICAgPCEtLSBzZWxlY3RhYmxlIGNob2ljZSAtLT4KLTwhQVRUTElTVCBvcHRpb24KLSAgJWF0dHJzOwotICBzZWxlY3RlZCAgICAoc2VsZWN0ZWQpICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCB0ZXh0YXJlYSAoI1BDREFUQSk+ICAgICA8IS0tIG11bHRpLWxpbmUgdGV4dCBmaWVsZCAtLT4KLTwhQVRUTElTVCB0ZXh0YXJlYQotICAlYXR0cnM7Ci0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHJvd3MgICAgICAgICVOdW1iZXI7ICAgICAgICNSRVFVSVJFRAotICBjb2xzICAgICAgICAlTnVtYmVyOyAgICAgICAjUkVRVUlSRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgcmVhZG9ubHkgICAgKHJlYWRvbmx5KSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25zZWxlY3QgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIFRoZSBmaWVsZHNldCBlbGVtZW50IGlzIHVzZWQgdG8gZ3JvdXAgZm9ybSBmaWVsZHMuCi0gIE9ubHkgb25lIGxlZ2VuZCBlbGVtZW50IHNob3VsZCBvY2N1ciBpbiB0aGUgY29udGVudAotICBhbmQgaWYgcHJlc2VudCBzaG91bGQgb25seSBiZSBwcmVjZWRlZCBieSB3aGl0ZXNwYWNlLgotLS0+Ci08IUVMRU1FTlQgZmllbGRzZXQgKCNQQ0RBVEEgfCBsZWdlbmQgfCAlYmxvY2s7IHwgZm9ybSB8ICVpbmxpbmU7IHwgJW1pc2M7KSo+Ci08IUFUVExJU1QgZmllbGRzZXQKLSAgJWF0dHJzOwotICA+Ci0KLTwhRU5USVRZICUgTEFsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhRUxFTUVOVCBsZWdlbmQgJUlubGluZTs+ICAgICA8IS0tIGZpZWxkc2V0IGxhYmVsIC0tPgotPCFBVFRMSVNUIGxlZ2VuZAotICAlYXR0cnM7Ci0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIGFsaWduICAgICAgICVMQWxpZ247ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotIENvbnRlbnQgaXMgJUZsb3c7IGV4Y2x1ZGluZyBhLCBmb3JtLCBmb3JtIGNvbnRyb2xzLCBpZnJhbWUKLS0tPiAKLTwhRUxFTUVOVCBidXR0b24gJWJ1dHRvbi5jb250ZW50Oz4gIDwhLS0gcHVzaCBidXR0b24gLS0+Ci08IUFUVExJU1QgYnV0dG9uCi0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpICJzdWJtaXQiCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBzaW5nbGUtbGluZSB0ZXh0IGlucHV0IGNvbnRyb2wgKERFUFJFQ0FURUQpIC0tPgotPCFFTEVNRU5UIGlzaW5kZXggRU1QVFk+Ci08IUFUVExJU1QgaXNpbmRleAotICAlY29yZWF0dHJzOwotICAlaTE4bjsKLSAgcHJvbXB0ICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT0gVGFibGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIERlcml2ZWQgZnJvbSBJRVRGIEhUTUwgdGFibGUgc3RhbmRhcmQsIHNlZSBbUkZDMTk0Ml0gLS0+Ci0KLTwhLS0KLSBUaGUgYm9yZGVyIGF0dHJpYnV0ZSBzZXRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGZyYW1lIGFyb3VuZCB0aGUKLSB0YWJsZS4gVGhlIGRlZmF1bHQgdW5pdHMgYXJlIHNjcmVlbiBwaXhlbHMuCi0KLSBUaGUgZnJhbWUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgZnJhbWUgYXJvdW5kCi0gdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gQ0FMUyB0byBhdm9pZCBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgdmFsaWduIGF0dHJpYnV0ZS4KLS0tPgotPCFFTlRJVFkgJSBURnJhbWUgIih2b2lkfGFib3ZlfGJlbG93fGhzaWRlc3xsaHN8cmhzfHZzaWRlc3xib3h8Ym9yZGVyKSI+Ci0KLTwhLS0KLSBUaGUgcnVsZXMgYXR0cmlidXRlIGRlZmluZXMgd2hpY2ggcnVsZXMgdG8gZHJhdyBiZXR3ZWVuIGNlbGxzOgotCi0gSWYgcnVsZXMgaXMgYWJzZW50IHRoZW4gYXNzdW1lOgotICAgICAibm9uZSIgaWYgYm9yZGVyIGlzIGFic2VudCBvciBib3JkZXI9IjAiIG90aGVyd2lzZSAiYWxsIgotLS0+Ci0KLTwhRU5USVRZICUgVFJ1bGVzICIobm9uZSB8IGdyb3VwcyB8IHJvd3MgfCBjb2xzIHwgYWxsKSI+Ci0gIAotPCEtLSBob3Jpem9udGFsIHBsYWNlbWVudCBvZiB0YWJsZSByZWxhdGl2ZSB0byBkb2N1bWVudCAtLT4KLTwhRU5USVRZICUgVEFsaWduICIobGVmdHxjZW50ZXJ8cmlnaHQpIj4KLQotPCEtLSBob3Jpem9udGFsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzCi0KLSAgY2hhciAgICAgICAgYWxpZ25tZW50IGNoYXIsIGUuZy4gY2hhcj0iOiIKLSAgY2hhcm9mZiAgICAgb2Zmc2V0IGZvciBhbGlnbm1lbnQgY2hhcgotLS0+Ci08IUVOVElUWSAlIGNlbGxoYWxpZ24KLSAgImFsaWduICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQKLSAgIGNoYXIgICAgICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgIGNoYXJvZmYgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbHZhbGlnbgotICAidmFsaWduICAgICAodG9wfG1pZGRsZXxib3R0b218YmFzZWxpbmUpICNJTVBMSUVEIgotICA+Ci0KLTwhRUxFTUVOVCB0YWJsZQotICAgICAoY2FwdGlvbj8sIChjb2wqfGNvbGdyb3VwKiksIHRoZWFkPywgdGZvb3Q/LCAodGJvZHkrfHRyKykpPgotPCFFTEVNRU5UIGNhcHRpb24gICVJbmxpbmU7PgotPCFFTEVNRU5UIHRoZWFkICAgICh0cikrPgotPCFFTEVNRU5UIHRmb290ICAgICh0cikrPgotPCFFTEVNRU5UIHRib2R5ICAgICh0cikrPgotPCFFTEVNRU5UIGNvbGdyb3VwIChjb2wpKj4KLTwhRUxFTUVOVCBjb2wgICAgICBFTVBUWT4KLTwhRUxFTUVOVCB0ciAgICAgICAodGh8dGQpKz4KLTwhRUxFTUVOVCB0aCAgICAgICAlRmxvdzs+Ci08IUVMRU1FTlQgdGQgICAgICAgJUZsb3c7PgotCi08IUFUVExJU1QgdGFibGUKLSAgJWF0dHJzOwotICBzdW1tYXJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBib3JkZXIgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBmcmFtZSAgICAgICAlVEZyYW1lOyAgICAgICAjSU1QTElFRAotICBydWxlcyAgICAgICAlVFJ1bGVzOyAgICAgICAjSU1QTElFRAotICBjZWxsc3BhY2luZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBjZWxscGFkZGluZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBhbGlnbiAgICAgICAlVEFsaWduOyAgICAgICAjSU1QTElFRAotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRU5USVRZICUgQ0FsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBjYXB0aW9uCi0gICVhdHRyczsKLSAgYWxpZ24gICAgICAgJUNBbGlnbjsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi1jb2xncm91cCBncm91cHMgYSBzZXQgb2YgY29sIGVsZW1lbnRzLiBJdCBhbGxvd3MgeW91IHRvIGdyb3VwCi1zZXZlcmFsIHNlbWFudGljYWxseSByZWxhdGVkIGNvbHVtbnMgdG9nZXRoZXIuCi0tLT4KLTwhQVRUTElTVCBjb2xncm91cAotICAlYXR0cnM7Ci0gIHNwYW4gICAgICAgICVOdW1iZXI7ICAgICAgICIxIgotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRAotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCEtLQotIGNvbCBlbGVtZW50cyBkZWZpbmUgdGhlIGFsaWdubWVudCBwcm9wZXJ0aWVzIGZvciBjZWxscyBpbgotIG9uZSBvciBtb3JlIGNvbHVtbnMuCi0KLSBUaGUgd2lkdGggYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbnMsIGUuZy4KLQotICAgICB3aWR0aD02NCAgICAgICAgd2lkdGggaW4gc2NyZWVuIHBpeGVscwotICAgICB3aWR0aD0wLjUqICAgICAgcmVsYXRpdmUgd2lkdGggb2YgMC41Ci0KLSBUaGUgc3BhbiBhdHRyaWJ1dGUgY2F1c2VzIHRoZSBhdHRyaWJ1dGVzIG9mIG9uZQotIGNvbCBlbGVtZW50IHRvIGFwcGx5IHRvIG1vcmUgdGhhbiBvbmUgY29sdW1uLgotLS0+Ci08IUFUVExJU1QgY29sCi0gICVhdHRyczsKLSAgc3BhbiAgICAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVECi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IS0tCi0gICAgVXNlIHRoZWFkIHRvIGR1cGxpY2F0ZSBoZWFkZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGhlYWRlcnMgd2hlbgotICAgIHRib2R5IHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgdGZvb3QgdG8gZHVwbGljYXRlIGZvb3RlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgZm9vdGVycyB3aGVuCi0gICAgdGJvZHkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBtdWx0aXBsZSB0Ym9keSBzZWN0aW9ucyB3aGVuIHJ1bGVzIGFyZSBuZWVkZWQKLSAgICBiZXR3ZWVuIGdyb3VwcyBvZiB0YWJsZSByb3dzLgotLS0+Ci08IUFUVExJU1QgdGhlYWQKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCFBVFRMSVNUIHRmb290Ci0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCB0Ym9keQotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IUFUVExJU1QgdHIKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBTY29wZSBpcyBzaW1wbGVyIHRoYW4gaGVhZGVycyBhdHRyaWJ1dGUgZm9yIGNvbW1vbiB0YWJsZXMgLS0+Ci08IUVOVElUWSAlIFNjb3BlICIocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkiPgotCi08IS0tIHRoIGlzIGZvciBoZWFkZXJzLCB0ZCBmb3IgZGF0YSBhbmQgZm9yIGNlbGxzIGFjdGluZyBhcyBib3RoIC0tPgotCi08IUFUVExJU1QgdGgKLSAgJWF0dHJzOwotICBhYmJyICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBheGlzICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBoZWFkZXJzICAgICBJRFJFRlMgICAgICAgICAjSU1QTElFRAotICBzY29wZSAgICAgICAlU2NvcGU7ICAgICAgICAjSU1QTElFRAotICByb3dzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgY29sc3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgbm93cmFwICAgICAgKG5vd3JhcCkgICAgICAgI0lNUExJRUQKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUFUVExJU1QgdGQKLSAgJWF0dHJzOwotICBhYmJyICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBheGlzICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBoZWFkZXJzICAgICBJRFJFRlMgICAgICAgICAjSU1QTElFRAotICBzY29wZSAgICAgICAlU2NvcGU7ICAgICAgICAjSU1QTElFRAotICByb3dzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgY29sc3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgbm93cmFwICAgICAgKG5vd3JhcCkgICAgICAgI0lNUExJRUQKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxLXN0cmljdC5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxLXN0cmljdC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjExYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMS1zdHJpY3QuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsOTg4ICswLDAgQEAKLTwhLS0KLSAgIEV4dGVuc2libGUgSFRNTCB2ZXJzaW9uIDEuMCBTdHJpY3QgRFRECi0KLSAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgSFRNTCA0LjAgU3RyaWN0IGV4Y2VwdCBmb3IKLSAgIGNoYW5nZXMgZHVlIHRvIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIFhNTCBhbmQgU0dNTC4KLQotICAgTmFtZXNwYWNlID0gaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbAotCi0gICBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgc2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEKLQotICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwKLSAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotCi0gICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiCi0KLSAgICRSZXZpc2lvbjogMS4xICQKLSAgICREYXRlOiAyMDA3LzA1LzE1IDAyOjQyOjIyICQKLQotLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09IENoYXJhY3RlciBtbmVtb25pYyBlbnRpdGllcyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxIGZvciBYSFRNTC8vRU4iCi0gICAieGh0bWwtbGF0MS5lbnQiPgotJUhUTUxsYXQxOwotCi08IUVOVElUWSAlIEhUTUxzeW1ib2wgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAieGh0bWwtc3ltYm9sLmVudCI+Ci0lSFRNTHN5bWJvbDsKLQotPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICJ4aHRtbC1zcGVjaWFsLmVudCI+Ci0lSFRNTHNwZWNpYWw7Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSW1wb3J0ZWQgTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGUgIkNEQVRBIj4KLSAgICA8IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGVzICJDREFUQSI+Ci0gICAgPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0ICJDREFUQSI+Ci0gICAgPCEtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0cyAiQ0RBVEEiPgotICAgIDwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIExhbmd1YWdlQ29kZSAiTk1UT0tFTiI+Ci0gICAgPCEtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0gLS0+Ci0KLTwhRU5USVRZICUgQ2hhcmFjdGVyICJDREFUQSI+Ci0gICAgPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotCi08IUVOVElUWSAlIE51bWJlciAiQ0RBVEEiPgotICAgIDwhLS0gb25lIG9yIG1vcmUgZGlnaXRzIC0tPgotCi08IUVOVElUWSAlIExpbmtUeXBlcyAiQ0RBVEEiPgotICAgIDwhLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcyAtLT4KLQotPCFFTlRJVFkgJSBNZWRpYURlc2MgIkNEQVRBIj4KLSAgICA8IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLQotPCFFTlRJVFkgJSBVUkkgIkNEQVRBIj4KLSAgICA8IS0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLCBzZWUgW1JGQzIzOTZdIC0tPgotCi08IUVOVElUWSAlIFVyaUxpc3QgIkNEQVRBIj4KLSAgICA8IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycyAtLT4KLQotPCFFTlRJVFkgJSBEYXRldGltZSAiQ0RBVEEiPgotICAgIDwhLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotCi08IUVOVElUWSAlIFNjcmlwdCAiQ0RBVEEiPgotICAgIDwhLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci0KLTwhRU5USVRZICUgU3R5bGVTaGVldCAiQ0RBVEEiPgotICAgIDwhLS0gc3R5bGUgc2hlZXQgZGF0YSAtLT4KLQotPCFFTlRJVFkgJSBUZXh0ICJDREFUQSI+Ci0gICAgPCEtLSB1c2VkIGZvciB0aXRsZXMgZXRjLiAtLT4KLQotPCFFTlRJVFkgJSBGcmFtZVRhcmdldCAiTk1UT0tFTiI+Ci0gICAgPCEtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLT4KLQotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIj4KLSAgICA8IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLQotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aCAiQ0RBVEEiPgotICAgIDwhLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotCi08IUVOVElUWSAlIE11bHRpTGVuZ3RocyAiQ0RBVEEiPgotICAgIDwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgTXVsdGlMZW5ndGggLS0+Ci0KLTwhRU5USVRZICUgUGl4ZWxzICJDREFUQSI+Ci0gICAgPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotCi08IS0tIHRoZXNlIGFyZSB1c2VkIGZvciBpbWFnZSBtYXBzIC0tPgotCi08IUVOVElUWSAlIFNoYXBlICIocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KSI+Ci0KLTwhRU5USVRZICUgQ29vcmRzICJDREFUQSI+Ci0gICAgPCEtLSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsZW5ndGhzIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBHZW5lcmljIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNvcmUgYXR0cmlidXRlcyBjb21tb24gdG8gbW9zdCBlbGVtZW50cwotICBpZCAgICAgICBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZAotICBjbGFzcyAgICBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzc2VzCi0gIHN0eWxlICAgIGFzc29jaWF0ZWQgc3R5bGUgaW5mbwotICB0aXRsZSAgICBhZHZpc29yeSB0aXRsZS9hbXBsaWZpY2F0aW9uCi0tLT4KLTwhRU5USVRZICUgY29yZWF0dHJzCi0gImlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVECi0gIGNsYXNzICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHN0eWxlICAgICAgICVTdHlsZVNoZWV0OyAgICNJTVBMSUVECi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gaW50ZXJuYXRpb25hbGl6YXRpb24gYXR0cmlidXRlcwotICBsYW5nICAgICAgICBsYW5ndWFnZSBjb2RlIChiYWNrd2FyZHMgY29tcGF0aWJsZSkKLSAgeG1sOmxhbmcgICAgbGFuZ3VhZ2UgY29kZSAoYXMgcGVyIFhNTCAxLjAgc3BlYykKLSAgZGlyICAgICAgICAgZGlyZWN0aW9uIGZvciB3ZWFrL25ldXRyYWwgdGV4dAotLS0+Ci08IUVOVElUWSAlIGkxOG4KLSAibGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgeG1sOmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSBhdHRyaWJ1dGVzIGZvciBjb21tb24gVUkgZXZlbnRzCi0gIG9uY2xpY2sgICAgIGEgcG9pbnRlciBidXR0b24gd2FzIGNsaWNrZWQKLSAgb25kYmxjbGljayAgYSBwb2ludGVyIGJ1dHRvbiB3YXMgZG91YmxlIGNsaWNrZWQKLSAgb25tb3VzZWRvd24gYSBwb2ludGVyIGJ1dHRvbiB3YXMgcHJlc3NlZCBkb3duCi0gIG9ubW91c2V1cCAgIGEgcG9pbnRlciBidXR0b24gd2FzIHJlbGVhc2VkCi0gIG9ubW91c2Vtb3ZlIGEgcG9pbnRlciB3YXMgbW92ZWQgb250byB0aGUgZWxlbWVudAotICBvbm1vdXNlb3V0ICBhIHBvaW50ZXIgd2FzIG1vdmVkIGF3YXkgZnJvbSB0aGUgZWxlbWVudAotICBvbmtleXByZXNzICBhIGtleSB3YXMgcHJlc3NlZCBhbmQgcmVsZWFzZWQKLSAgb25rZXlkb3duICAgYSBrZXkgd2FzIHByZXNzZWQgZG93bgotICBvbmtleXVwICAgICBhIGtleSB3YXMgcmVsZWFzZWQKLS0tPgotPCFFTlRJVFkgJSBldmVudHMKLSAib25jbGljayAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25kYmxjbGljayAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZWRvd24gJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZXVwICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZW92ZXIgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZW1vdmUgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZW91dCAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25rZXlwcmVzcyAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25rZXlkb3duICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25rZXl1cCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSBhdHRyaWJ1dGVzIGZvciBlbGVtZW50cyB0aGF0IGNhbiBnZXQgdGhlIGZvY3VzCi0gIGFjY2Vzc2tleSAgIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlcgotICB0YWJpbmRleCAgICBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyCi0gIG9uZm9jdXMgICAgIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMKLSAgb25ibHVyICAgICAgdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMKLS0tPgotPCFFTlRJVFkgJSBmb2N1cwotICJhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IUVOVElUWSAlIGF0dHJzICIlY29yZWF0dHJzOyAlaTE4bjsgJWV2ZW50czsiPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBUZXh0IEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIHNwZWNpYWwKLSAgICJiciB8IHNwYW4gfCBiZG8gfCBvYmplY3QgfCBpbWcgfCBtYXAiPgotCi08IUVOVElUWSAlIGZvbnRzdHlsZSAidHQgfCBpIHwgYiB8IGJpZyB8IHNtYWxsIj4KLQotPCFFTlRJVFkgJSBwaHJhc2UgImVtIHwgc3Ryb25nIHwgZGZuIHwgY29kZSB8IHEgfCBzdWIgfCBzdXAgfAotICAgICAgICAgICAgICAgICAgIHNhbXAgfCBrYmQgfCB2YXIgfCBjaXRlIHwgYWJiciB8IGFjcm9ueW0iPgotCi08IUVOVElUWSAlIGlubGluZS5mb3JtcyAiaW5wdXQgfCBzZWxlY3QgfCB0ZXh0YXJlYSB8IGxhYmVsIHwgYnV0dG9uIj4KLQotPCEtLSB0aGVzZSBjYW4gb2NjdXIgYXQgYmxvY2sgb3IgaW5saW5lIGxldmVsIC0tPgotPCFFTlRJVFkgJSBtaXNjICJpbnMgfCBkZWwgfCBzY3JpcHQgfCBub3NjcmlwdCI+Ci0KLTwhRU5USVRZICUgaW5saW5lICJhIHwgJXNwZWNpYWw7IHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVpbmxpbmUuZm9ybXM7Ij4KLQotPCEtLSAlSW5saW5lOyBjb3ZlcnMgaW5saW5lIG9yICJ0ZXh0LWxldmVsIiBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgSW5saW5lICIoI1BDREFUQSB8ICVpbmxpbmU7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEJsb2NrIGxldmVsIGVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGhlYWRpbmcgImgxfGgyfGgzfGg0fGg1fGg2Ij4KLTwhRU5USVRZICUgbGlzdHMgInVsIHwgb2wgfCBkbCI+Ci08IUVOVElUWSAlIGJsb2NrdGV4dCAicHJlIHwgaHIgfCBibG9ja3F1b3RlIHwgYWRkcmVzcyI+Ci0KLTwhRU5USVRZICUgYmxvY2sKLSAgICAgInAgfCAlaGVhZGluZzsgfCBkaXYgfCAlbGlzdHM7IHwgJWJsb2NrdGV4dDsgfCBmaWVsZHNldCB8IHRhYmxlIj4KLQotPCFFTlRJVFkgJSBCbG9jayAiKCVibG9jazsgfCBmb3JtIHwgJW1pc2M7KSoiPgotCi08IS0tICVGbG93OyBtaXhlcyBCbG9jayBhbmQgSW5saW5lIGFuZCBpcyB1c2VkIGZvciBsaXN0IGl0ZW1zIGV0Yy4gLS0+Ci08IUVOVElUWSAlIEZsb3cgIigjUENEQVRBIHwgJWJsb2NrOyB8IGZvcm0gfCAlaW5saW5lOyB8ICVtaXNjOykqIj4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDb250ZW50IG1vZGVscyBmb3IgZXhjbHVzaW9ucyA9PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBhIGVsZW1lbnRzIHVzZSAlSW5saW5lOyBleGNsdWRpbmcgYSAtLT4KLQotPCFFTlRJVFkgJSBhLmNvbnRlbnQKLSAgICIoI1BDREFUQSB8ICVzcGVjaWFsOyB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlaW5saW5lLmZvcm1zOyB8ICVtaXNjOykqIj4KLQotPCEtLSBwcmUgdXNlcyAlSW5saW5lIGV4Y2x1ZGluZyBpbWcsIG9iamVjdCwgYmlnLCBzbWFsbCwgc3VwIG9yIHN1cCAtLT4KLQotPCFFTlRJVFkgJSBwcmUuY29udGVudAotICAgIigjUENEQVRBIHwgYSB8IGJyIHwgc3BhbiB8IGJkbyB8IG1hcCB8IHR0IHwgaSB8IGIgfAotICAgICAgJXBocmFzZTsgfCAlaW5saW5lLmZvcm1zOykqIj4KLQotPCEtLSBmb3JtIHVzZXMgJUJsb2NrOyBleGNsdWRpbmcgZm9ybSAtLT4KLQotPCFFTlRJVFkgJSBmb3JtLmNvbnRlbnQgIiglYmxvY2s7IHwgJW1pc2M7KSoiPgotCi08IS0tIGJ1dHRvbiB1c2VzICVGbG93OyBidXQgZXhjbHVkZXMgYSwgZm9ybSBhbmQgZm9ybSBjb250cm9scyAtLT4KLQotPCFFTlRJVFkgJSBidXR0b24uY29udGVudAotICAgIigjUENEQVRBIHwgcCB8ICVoZWFkaW5nOyB8IGRpdiB8ICVsaXN0czsgfCAlYmxvY2t0ZXh0OyB8Ci0gICAgdGFibGUgfCAlc3BlY2lhbDsgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBTdHJ1Y3R1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIHRoZSBuYW1lc3BhY2UgVVJJIGRlc2lnbmF0ZXMgdGhlIGRvY3VtZW50IHByb2ZpbGUgLS0+Ci0KLTwhRUxFTUVOVCBodG1sIChoZWFkLCBib2R5KT4KLTwhQVRUTElTVCBodG1sCi0gICVpMThuOwotICB4bWxucyAgICAgICAlVVJJOyAgICAgICAgICAjRklYRUQgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgSGVhZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIihzY3JpcHR8c3R5bGV8bWV0YXxsaW5rfG9iamVjdCkqIj4KLQotPCEtLSBjb250ZW50IG1vZGVsIGlzICVoZWFkLm1pc2M7IGNvbWJpbmVkIHdpdGggYSBzaW5nbGUKLSAgICAgdGl0bGUgYW5kIGFuIG9wdGlvbmFsIGJhc2UgZWxlbWVudCBpbiBhbnkgb3JkZXIgLS0+Ci0KLTwhRUxFTUVOVCBoZWFkICglaGVhZC5taXNjOywKLSAgICAgKCh0aXRsZSwgJWhlYWQubWlzYzssIChiYXNlLCAlaGVhZC5taXNjOyk/KSB8Ci0gICAgICAoYmFzZSwgJWhlYWQubWlzYzssICh0aXRsZSwgJWhlYWQubWlzYzspKSkpPgotCi08IUFUVExJU1QgaGVhZAotICAlaTE4bjsKLSAgcHJvZmlsZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIFRoZSB0aXRsZSBlbGVtZW50IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGZsb3cgb2YgdGV4dC4KLSAgICAgICBJdCBzaG91bGQgYmUgZGlzcGxheWVkLCBmb3IgZXhhbXBsZSBhcyB0aGUgcGFnZSBoZWFkZXIgb3IKLSAgICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLSAgICAtLT4KLTwhRUxFTUVOVCB0aXRsZSAoI1BDREFUQSk+Ci08IUFUVExJU1QgdGl0bGUgJWkxOG47PgotCi08IS0tIGRvY3VtZW50IGJhc2UgVVJJIC0tPgotCi08IUVMRU1FTlQgYmFzZSBFTVBUWT4KLTwhQVRUTElTVCBiYXNlCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBnZW5lcmljIG1ldGFpbmZvcm1hdGlvbiAtLT4KLTwhRUxFTUVOVCBtZXRhIEVNUFRZPgotPCFBVFRMSVNUIG1ldGEKLSAgJWkxOG47Ci0gIGh0dHAtZXF1aXYgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGNvbnRlbnQgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRAotICBzY2hlbWUgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgUmVsYXRpb25zaGlwIHZhbHVlcyBjYW4gYmUgdXNlZCBpbiBwcmluY2lwbGU6Ci0KLSAgIGEpIGZvciBkb2N1bWVudCBzcGVjaWZpYyB0b29sYmFycy9tZW51cyB3aGVuIHVzZWQKLSAgICAgIHdpdGggdGhlIGxpbmsgZWxlbWVudCBpbiBkb2N1bWVudCBoZWFkIGUuZy4KLSAgICAgICAgc3RhcnQsIGNvbnRlbnRzLCBwcmV2aW91cywgbmV4dCwgaW5kZXgsIGVuZCwgaGVscAotICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9InN0eWxlc2hlZXQiKQotICAgYykgdG8gbWFrZSBhIGxpbmsgdG8gYSBzY3JpcHQgKHJlbD0ic2NyaXB0IikKLSAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mCi0gICAgICBodG1sIG5vZGVzIGFyZSByZW5kZXJlZCBpbnRvIHByaW50ZWQgZG9jdW1lbnRzCi0gICBlKSB0byBtYWtlIGEgbGluayB0byBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIGUuZy4gYSBQb3N0U2NyaXB0IG9yIFBERiB2ZXJzaW9uIChyZWw9ImFsdGVybmF0ZSIgbWVkaWE9InByaW50IikKLS0tPgotCi08IUVMRU1FTlQgbGluayBFTVBUWT4KLTwhQVRUTElTVCBsaW5rCi0gICVhdHRyczsKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIHN0eWxlIGluZm8sIHdoaWNoIG1heSBpbmNsdWRlIENEQVRBIHNlY3Rpb25zIC0tPgotPCFFTEVNRU5UIHN0eWxlICgjUENEQVRBKT4KLTwhQVRUTElTVCBzdHlsZQotICAlaTE4bjsKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVECi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVECi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIHhtbDpzcGFjZSAgIChwcmVzZXJ2ZSkgICAgICNGSVhFRCAncHJlc2VydmUnCi0gID4KLQotPCEtLSBzY3JpcHQgc3RhdGVtZW50cywgd2hpY2ggbWF5IGluY2x1ZGUgQ0RBVEEgc2VjdGlvbnMgLS0+Ci08IUVMRU1FTlQgc2NyaXB0ICgjUENEQVRBKT4KLTwhQVRUTElTVCBzY3JpcHQKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRlZmVyICAgICAgIChkZWZlcikgICAgICAgICNJTVBMSUVECi0gIHhtbDpzcGFjZSAgIChwcmVzZXJ2ZSkgICAgICNGSVhFRCAncHJlc2VydmUnCi0gID4KLQotPCEtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBzY3JpcHQtYmFzZWQgcmVuZGVyaW5nIC0tPgotCi08IUVMRU1FTlQgbm9zY3JpcHQgJUJsb2NrOz4KLTwhQVRUTElTVCBub3NjcmlwdAotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGJvZHkgJUJsb2NrOz4KLTwhQVRUTElTVCBib2R5Ci0gICVhdHRyczsKLSAgb25sb2FkICAgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQKLSAgb251bmxvYWQgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZGl2ICVGbG93Oz4gIDwhLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1QgZGl2Ci0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQYXJhZ3JhcGhzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgcCAlSW5saW5lOz4KLTwhQVRUTElTVCBwCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIZWFkaW5ncyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZXJlIGFyZSBzaXggbGV2ZWxzIG9mIGhlYWRpbmdzIGZyb20gaDEgKHRoZSBtb3N0IGltcG9ydGFudCkKLSAgdG8gaDYgKHRoZSBsZWFzdCBpbXBvcnRhbnQpLgotLS0+Ci0KLTwhRUxFTUVOVCBoMSAgJUlubGluZTs+Ci08IUFUVExJU1QgaDEKLSAgICVhdHRyczsKLSAgID4KLQotPCFFTEVNRU5UIGgyICVJbmxpbmU7PgotPCFBVFRMSVNUIGgyCi0gICAlYXR0cnM7Ci0gICA+Ci0KLTwhRUxFTUVOVCBoMyAlSW5saW5lOz4KLTwhQVRUTElTVCBoMwotICAgJWF0dHJzOwotICAgPgotCi08IUVMRU1FTlQgaDQgJUlubGluZTs+Ci08IUFUVExJU1QgaDQKLSAgICVhdHRyczsKLSAgID4KLQotPCFFTEVNRU5UIGg1ICVJbmxpbmU7PgotPCFBVFRMSVNUIGg1Ci0gICAlYXR0cnM7Ci0gICA+Ci0KLTwhRUxFTUVOVCBoNiAlSW5saW5lOz4KLTwhQVRUTElTVCBoNgotICAgJWF0dHJzOwotICAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFVub3JkZXJlZCBsaXN0IC0tPgotCi08IUVMRU1FTlQgdWwgKGxpKSs+Ci08IUFUVExJU1QgdWwKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS0gT3JkZXJlZCAobnVtYmVyZWQpIGxpc3QgLS0+Ci0KLTwhRUxFTUVOVCBvbCAobGkpKz4KLTwhQVRUTElTVCBvbAotICAlYXR0cnM7Ci0gID4KLQotPCEtLSBsaXN0IGl0ZW0gLS0+Ci0KLTwhRUxFTUVOVCBsaSAlRmxvdzs+Ci08IUFUVExJU1QgbGkKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS0gZGVmaW5pdGlvbiBsaXN0cyAtIGR0IGZvciB0ZXJtLCBkZCBmb3IgaXRzIGRlZmluaXRpb24gLS0+Ci0KLTwhRUxFTUVOVCBkbCAoZHR8ZGQpKz4KLTwhQVRUTElTVCBkbAotICAlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGR0ICVJbmxpbmU7PgotPCFBVFRMSVNUIGR0Ci0gICVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgZGQgJUZsb3c7PgotPCFBVFRMSVNUIGRkCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBBZGRyZXNzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGluZm9ybWF0aW9uIG9uIGF1dGhvciAtLT4KLQotPCFFTEVNRU5UIGFkZHJlc3MgJUlubGluZTs+Ci08IUFUVExJU1QgYWRkcmVzcwotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGhyIEVNUFRZPgotPCFBVFRMSVNUIGhyCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQcmVmb3JtYXR0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNvbnRlbnQgaXMgJUlubGluZTsgZXhjbHVkaW5nICJpbWd8b2JqZWN0fGJpZ3xzbWFsbHxzdWJ8c3VwIiAtLT4KLQotPCFFTEVNRU5UIHByZSAlcHJlLmNvbnRlbnQ7PgotPCFBVFRMSVNUIHByZQotICAlYXR0cnM7Ci0gIHhtbDpzcGFjZSAocHJlc2VydmUpICNGSVhFRCAncHJlc2VydmUnCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gQmxvY2stbGlrZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGJsb2NrcXVvdGUgJUJsb2NrOz4KLTwhQVRUTElTVCBibG9ja3F1b3RlCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbnNlcnRlZC9EZWxldGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIGlucy9kZWwgYXJlIGFsbG93ZWQgaW4gYmxvY2sgYW5kIGlubGluZSBjb250ZW50LCBidXQgaXRzCi0gIGluYXBwcm9wcmlhdGUgdG8gaW5jbHVkZSBibG9jayBjb250ZW50IHdpdGhpbiBhbiBpbnMgZWxlbWVudAotICBvY2N1cnJpbmcgaW4gaW5saW5lIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBpbnMgJUZsb3c7PgotPCFBVFRMSVNUIGlucwotICAlYXR0cnM7Ci0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRhdGV0aW1lICAgICVEYXRldGltZTsgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGRlbCAlRmxvdzs+Ci08IUFUVExJU1QgZGVsCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBBbmNob3IgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNvbnRlbnQgaXMgJUlubGluZTsgZXhjZXB0IHRoYXQgYW5jaG9ycyBzaG91bGRuJ3QgYmUgbmVzdGVkIC0tPgotCi08IUVMRU1FTlQgYSAlYS5jb250ZW50Oz4KLTwhQVRUTElTVCBhCi0gICVhdHRyczsKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgc2hhcGUgICAgICAgJVNoYXBlOyAgICAgICAgInJlY3QiCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PSBJbmxpbmUgRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIHNwYW4gJUlubGluZTs+IDwhLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1Qgc3BhbgotICAlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGJkbyAlSW5saW5lOz4gIDwhLS0gSTE4TiBCaURpIG92ZXItcmlkZSAtLT4KLTwhQVRUTElTVCBiZG8KLSAgJWNvcmVhdHRyczsKLSAgJWV2ZW50czsKLSAgbGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgeG1sOmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI1JFUVVJUkVECi0gID4KLQotPCFFTEVNRU5UIGJyIEVNUFRZPiAgIDwhLS0gZm9yY2VkIGxpbmUgYnJlYWsgLS0+Ci08IUFUVExJU1QgYnIKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgZW0gJUlubGluZTs+ICAgPCEtLSBlbXBoYXNpcyAtLT4KLTwhQVRUTElTVCBlbSAlYXR0cnM7PgotCi08IUVMRU1FTlQgc3Ryb25nICVJbmxpbmU7PiAgIDwhLS0gc3Ryb25nIGVtcGhhc2lzIC0tPgotPCFBVFRMSVNUIHN0cm9uZyAlYXR0cnM7PgotCi08IUVMRU1FTlQgZGZuICVJbmxpbmU7PiAgIDwhLS0gZGVmaW5pdGlvbmFsIC0tPgotPCFBVFRMSVNUIGRmbiAlYXR0cnM7PgotCi08IUVMRU1FTlQgY29kZSAlSW5saW5lOz4gICA8IS0tIHByb2dyYW0gY29kZSAtLT4KLTwhQVRUTElTVCBjb2RlICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzYW1wICVJbmxpbmU7PiAgIDwhLS0gc2FtcGxlIC0tPgotPCFBVFRMSVNUIHNhbXAgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGtiZCAlSW5saW5lOz4gIDwhLS0gc29tZXRoaW5nIHVzZXIgd291bGQgdHlwZSAtLT4KLTwhQVRUTElTVCBrYmQgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHZhciAlSW5saW5lOz4gICA8IS0tIHZhcmlhYmxlIC0tPgotPCFBVFRMSVNUIHZhciAlYXR0cnM7PgotCi08IUVMRU1FTlQgY2l0ZSAlSW5saW5lOz4gICA8IS0tIGNpdGF0aW9uIC0tPgotPCFBVFRMSVNUIGNpdGUgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGFiYnIgJUlubGluZTs+ICAgPCEtLSBhYmJyZXZpYXRpb24gLS0+Ci08IUFUVExJU1QgYWJiciAlYXR0cnM7PgotCi08IUVMRU1FTlQgYWNyb255bSAlSW5saW5lOz4gICA8IS0tIGFjcm9ueW0gLS0+Ci08IUFUVExJU1QgYWNyb255bSAlYXR0cnM7PgotCi08IUVMRU1FTlQgcSAlSW5saW5lOz4gICA8IS0tIGlubGluZWQgcXVvdGUgLS0+Ci08IUFUVExJU1QgcQotICAlYXR0cnM7Ci0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIHN1YiAlSW5saW5lOz4gPCEtLSBzdWJzY3JpcHQgLS0+Ci08IUFUVExJU1Qgc3ViICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzdXAgJUlubGluZTs+IDwhLS0gc3VwZXJzY3JpcHQgLS0+Ci08IUFUVExJU1Qgc3VwICVhdHRyczs+Ci0KLTwhRUxFTUVOVCB0dCAlSW5saW5lOz4gICA8IS0tIGZpeGVkIHBpdGNoIGZvbnQgLS0+Ci08IUFUVExJU1QgdHQgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGkgJUlubGluZTs+ICAgPCEtLSBpdGFsaWMgZm9udCAtLT4KLTwhQVRUTElTVCBpICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBiICVJbmxpbmU7PiAgIDwhLS0gYm9sZCBmb250IC0tPgotPCFBVFRMSVNUIGIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGJpZyAlSW5saW5lOz4gICA8IS0tIGJpZ2dlciBmb250IC0tPgotPCFBVFRMSVNUIGJpZyAlYXR0cnM7PgotCi08IUVMRU1FTlQgc21hbGwgJUlubGluZTs+ICAgPCEtLSBzbWFsbGVyIGZvbnQgLS0+Ci08IUFUVExJU1Qgc21hbGwgJWF0dHJzOz4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09IE9iamVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBvYmplY3QgaXMgdXNlZCB0byBlbWJlZCBvYmplY3RzIGFzIHBhcnQgb2YgSFRNTCBwYWdlcy4KLSAgcGFyYW0gZWxlbWVudHMgc2hvdWxkIHByZWNlZGUgb3RoZXIgY29udGVudC4gUGFyYW1ldGVycwotICBjYW4gYWxzbyBiZSBleHByZXNzZWQgYXMgYXR0cmlidXRlL3ZhbHVlIHBhaXJzIG9uIHRoZQotICBvYmplY3QgZWxlbWVudCBpdHNlbGYgd2hlbiBicmV2aXR5IGlzIGRlc2lyZWQuCi0tLT4KLQotPCFFTEVNRU5UIG9iamVjdCAoI1BDREFUQSB8IHBhcmFtIHwgJWJsb2NrOyB8IGZvcm0gfCAlaW5saW5lOyB8ICVtaXNjOykqPgotPCFBVFRMSVNUIG9iamVjdAotICAlYXR0cnM7Ci0gIGRlY2xhcmUgICAgIChkZWNsYXJlKSAgICAgICNJTVBMSUVECi0gIGNsYXNzaWQgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRhdGEgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gIGNvZGV0eXBlICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gIGFyY2hpdmUgICAgICVVcmlMaXN0OyAgICAgICNJTVBMSUVECi0gIHN0YW5kYnkgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBwYXJhbSBpcyB1c2VkIHRvIHN1cHBseSBhIG5hbWVkIHByb3BlcnR5IHZhbHVlLgotICBJbiBYTUwgaXQgd291bGQgc2VlbSBuYXR1cmFsIHRvIGZvbGxvdyBSREYgYW5kIHN1cHBvcnQgYW4KLSAgYWJicmV2aWF0ZWQgc3ludGF4IHdoZXJlIHRoZSBwYXJhbSBlbGVtZW50cyBhcmUgcmVwbGFjZWQKLSAgYnkgYXR0cmlidXRlIHZhbHVlIHBhaXJzIG9uIHRoZSBvYmplY3Qgc3RhcnQgdGFnLgotLS0+Ci08IUVMRU1FTlQgcGFyYW0gRU1QVFk+Ci08IUFUVExJU1QgcGFyYW0KLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWV0eXBlICAgKGRhdGF8cmVmfG9iamVjdCkgImRhdGEiCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW1hZ2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICAgVG8gYXZvaWQgYWNjZXNzaWJpbGl0eSBwcm9ibGVtcyBmb3IgcGVvcGxlIHdobyBhcmVuJ3QKLSAgIGFibGUgdG8gc2VlIHRoZSBpbWFnZSwgeW91IHNob3VsZCBwcm92aWRlIGEgdGV4dAotICAgZGVzY3JpcHRpb24gdXNpbmcgdGhlIGFsdCBhbmQgbG9uZ2Rlc2MgYXR0cmlidXRlcy4KLSAgIEluIGFkZGl0aW9uLCBhdm9pZCB0aGUgdXNlIG9mIHNlcnZlci1zaWRlIGltYWdlIG1hcHMuCi0gICBOb3RlIHRoYXQgaW4gdGhpcyBEVEQgdGhlcmUgaXMgbm8gbmFtZSBhdHRyaWJ1dGUuIFRoYXQKLSAgIGlzIG9ubHkgYXZhaWxhYmxlIGluIHRoZSB0cmFuc2l0aW9uYWwgYW5kIGZyYW1lc2V0IERURC4KLS0tPgotCi08IUVMRU1FTlQgaW1nIEVNUFRZPgotPCFBVFRMSVNUIGltZwotICAlYXR0cnM7Ci0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaXNtYXAgICAgICAgKGlzbWFwKSAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIHVzZW1hcCBwb2ludHMgdG8gYSBtYXAgZWxlbWVudCB3aGljaCBtYXkgYmUgaW4gdGhpcyBkb2N1bWVudAotICBvciBhbiBleHRlcm5hbCBkb2N1bWVudCwgYWx0aG91Z2ggdGhlIGxhdHRlciBpcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCAtLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDbGllbnQtc2lkZSBpbWFnZSBtYXBzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBUaGVzZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRvY3VtZW50IG9yIGdyb3VwZWQgaW4gYQotICAgICBzZXBhcmF0ZSBkb2N1bWVudCBhbHRob3VnaCB0aGlzIGlzbid0IHlldCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IUVMRU1FTlQgbWFwICgoJWJsb2NrOyB8IGZvcm0gfCAlbWlzYzspKyB8IGFyZWErKT4KLTwhQVRUTElTVCBtYXAKLSAgJWkxOG47Ci0gICVldmVudHM7Ci0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNSRVFVSVJFRAotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBhcmVhIEVNUFRZPgotPCFBVFRMSVNUIGFyZWEKLSAgJWF0dHJzOwotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICAicmVjdCIKLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgbm9ocmVmICAgICAgKG5vaHJlZikgICAgICAgI0lNUExJRUQKLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRm9ybXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhRUxFTUVOVCBmb3JtICVmb3JtLmNvbnRlbnQ7PiAgIDwhLS0gZm9ybXMgc2hvdWxkbid0IGJlIG5lc3RlZCAtLT4KLQotPCFBVFRMSVNUIGZvcm0KLSAgJWF0dHJzOwotICBhY3Rpb24gICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQKLSAgbWV0aG9kICAgICAgKGdldHxwb3N0KSAgICAgImdldCIKLSAgZW5jdHlwZSAgICAgJUNvbnRlbnRUeXBlOyAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgb25zdWJtaXQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25yZXNldCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQKLSAgYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkCi0gIExhYmVsIGVsZW1lbnRzIHNob3VsZG4ndCBiZSBuZXN0ZWQuCi0tLT4KLTwhRUxFTUVOVCBsYWJlbCAlSW5saW5lOz4KLTwhQVRUTElTVCBsYWJlbAotICAlYXR0cnM7Ci0gIGZvciAgICAgICAgIElEUkVGICAgICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTlRJVFkgJSBJbnB1dFR5cGUKLSAgIih0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8Ci0gICAgcmFkaW8gfCBzdWJtaXQgfCByZXNldCB8Ci0gICAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKSIKLSAgID4KLQotPCEtLSB0aGUgbmFtZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0ICYgcmVzZXQgLS0+Ci0KLTwhRUxFTUVOVCBpbnB1dCBFTVBUWT4gICAgIDwhLS0gZm9ybSBjb250cm9sIC0tPgotPCFBVFRMSVNUIGlucHV0Ci0gICVhdHRyczsKLSAgdHlwZSAgICAgICAgJUlucHV0VHlwZTsgICAgInRleHQiCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGNoZWNrZWQgICAgIChjaGVja2VkKSAgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIG1heGxlbmd0aCAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGFsdCAgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIGFjY2VwdCAgICAgICVDb250ZW50VHlwZXM7ICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIHNlbGVjdCAob3B0Z3JvdXB8b3B0aW9uKSs+ICA8IS0tIG9wdGlvbiBzZWxlY3RvciAtLT4KLTwhQVRUTElTVCBzZWxlY3QKLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBtdWx0aXBsZSAgICAobXVsdGlwbGUpICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBvcHRncm91cCAob3B0aW9uKSs+ICAgPCEtLSBvcHRpb24gZ3JvdXAgLS0+Ci08IUFUVExJU1Qgb3B0Z3JvdXAKLSAgJWF0dHJzOwotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgPgotCi08IUVMRU1FTlQgb3B0aW9uICgjUENEQVRBKT4gICAgIDwhLS0gc2VsZWN0YWJsZSBjaG9pY2UgLS0+Ci08IUFUVExJU1Qgb3B0aW9uCi0gICVhdHRyczsKLSAgc2VsZWN0ZWQgICAgKHNlbGVjdGVkKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgdGV4dGFyZWEgKCNQQ0RBVEEpPiAgICAgPCEtLSBtdWx0aS1saW5lIHRleHQgZmllbGQgLS0+Ci08IUFUVExJU1QgdGV4dGFyZWEKLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICByb3dzICAgICAgICAlTnVtYmVyOyAgICAgICAjUkVRVUlSRUQKLSAgY29scyAgICAgICAgJU51bWJlcjsgICAgICAgI1JFUVVJUkVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBUaGUgZmllbGRzZXQgZWxlbWVudCBpcyB1c2VkIHRvIGdyb3VwIGZvcm0gZmllbGRzLgotICBPbmx5IG9uZSBsZWdlbmQgZWxlbWVudCBzaG91bGQgb2NjdXIgaW4gdGhlIGNvbnRlbnQKLSAgYW5kIGlmIHByZXNlbnQgc2hvdWxkIG9ubHkgYmUgcHJlY2VkZWQgYnkgd2hpdGVzcGFjZS4KLS0tPgotPCFFTEVNRU5UIGZpZWxkc2V0ICgjUENEQVRBIHwgbGVnZW5kIHwgJWJsb2NrOyB8IGZvcm0gfCAlaW5saW5lOyB8ICVtaXNjOykqPgotPCFBVFRMSVNUIGZpZWxkc2V0Ci0gICVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgbGVnZW5kICVJbmxpbmU7PiAgICAgPCEtLSBmaWVsZHNldCBsYWJlbCAtLT4KLTwhQVRUTElTVCBsZWdlbmQKLSAgJWF0dHJzOwotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSBDb250ZW50IGlzICVGbG93OyBleGNsdWRpbmcgYSwgZm9ybSBhbmQgZm9ybSBjb250cm9scwotLS0+IAotPCFFTEVNRU5UIGJ1dHRvbiAlYnV0dG9uLmNvbnRlbnQ7PiAgPCEtLSBwdXNoIGJ1dHRvbiAtLT4KLTwhQVRUTElTVCBidXR0b24KLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgInN1Ym1pdCIKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT0gVGFibGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIERlcml2ZWQgZnJvbSBJRVRGIEhUTUwgdGFibGUgc3RhbmRhcmQsIHNlZSBbUkZDMTk0Ml0gLS0+Ci0KLTwhLS0KLSBUaGUgYm9yZGVyIGF0dHJpYnV0ZSBzZXRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGZyYW1lIGFyb3VuZCB0aGUKLSB0YWJsZS4gVGhlIGRlZmF1bHQgdW5pdHMgYXJlIHNjcmVlbiBwaXhlbHMuCi0KLSBUaGUgZnJhbWUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgZnJhbWUgYXJvdW5kCi0gdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gQ0FMUyB0byBhdm9pZCBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgdmFsaWduIGF0dHJpYnV0ZS4KLS0tPgotPCFFTlRJVFkgJSBURnJhbWUgIih2b2lkfGFib3ZlfGJlbG93fGhzaWRlc3xsaHN8cmhzfHZzaWRlc3xib3h8Ym9yZGVyKSI+Ci0KLTwhLS0KLSBUaGUgcnVsZXMgYXR0cmlidXRlIGRlZmluZXMgd2hpY2ggcnVsZXMgdG8gZHJhdyBiZXR3ZWVuIGNlbGxzOgotCi0gSWYgcnVsZXMgaXMgYWJzZW50IHRoZW4gYXNzdW1lOgotICAgICAibm9uZSIgaWYgYm9yZGVyIGlzIGFic2VudCBvciBib3JkZXI9IjAiIG90aGVyd2lzZSAiYWxsIgotLS0+Ci0KLTwhRU5USVRZICUgVFJ1bGVzICIobm9uZSB8IGdyb3VwcyB8IHJvd3MgfCBjb2xzIHwgYWxsKSI+Ci0gIAotPCEtLSBob3Jpem9udGFsIHBsYWNlbWVudCBvZiB0YWJsZSByZWxhdGl2ZSB0byBkb2N1bWVudCAtLT4KLTwhRU5USVRZICUgVEFsaWduICIobGVmdHxjZW50ZXJ8cmlnaHQpIj4KLQotPCEtLSBob3Jpem9udGFsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzCi0KLSAgY2hhciAgICAgICAgYWxpZ25tZW50IGNoYXIsIGUuZy4gY2hhcj0nOicKLSAgY2hhcm9mZiAgICAgb2Zmc2V0IGZvciBhbGlnbm1lbnQgY2hhcgotLS0+Ci08IUVOVElUWSAlIGNlbGxoYWxpZ24KLSAgImFsaWduICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQKLSAgIGNoYXIgICAgICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgIGNoYXJvZmYgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbHZhbGlnbgotICAidmFsaWduICAgICAodG9wfG1pZGRsZXxib3R0b218YmFzZWxpbmUpICNJTVBMSUVEIgotICA+Ci0KLTwhRUxFTUVOVCB0YWJsZQotICAgICAoY2FwdGlvbj8sIChjb2wqfGNvbGdyb3VwKiksIHRoZWFkPywgdGZvb3Q/LCAodGJvZHkrfHRyKykpPgotPCFFTEVNRU5UIGNhcHRpb24gICVJbmxpbmU7PgotPCFFTEVNRU5UIHRoZWFkICAgICh0cikrPgotPCFFTEVNRU5UIHRmb290ICAgICh0cikrPgotPCFFTEVNRU5UIHRib2R5ICAgICh0cikrPgotPCFFTEVNRU5UIGNvbGdyb3VwIChjb2wpKj4KLTwhRUxFTUVOVCBjb2wgICAgICBFTVBUWT4KLTwhRUxFTUVOVCB0ciAgICAgICAodGh8dGQpKz4KLTwhRUxFTUVOVCB0aCAgICAgICAlRmxvdzs+Ci08IUVMRU1FTlQgdGQgICAgICAgJUZsb3c7PgotCi08IUFUVExJU1QgdGFibGUKLSAgJWF0dHJzOwotICBzdW1tYXJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBib3JkZXIgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBmcmFtZSAgICAgICAlVEZyYW1lOyAgICAgICAjSU1QTElFRAotICBydWxlcyAgICAgICAlVFJ1bGVzOyAgICAgICAjSU1QTElFRAotICBjZWxsc3BhY2luZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBjZWxscGFkZGluZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRU5USVRZICUgQ0FsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBjYXB0aW9uCi0gICVhdHRyczsKLSAgPgotCi08IS0tCi1jb2xncm91cCBncm91cHMgYSBzZXQgb2YgY29sIGVsZW1lbnRzLiBJdCBhbGxvd3MgeW91IHRvIGdyb3VwCi1zZXZlcmFsIHNlbWFudGljYWxseSByZWxhdGVkIGNvbHVtbnMgdG9nZXRoZXIuCi0tLT4KLTwhQVRUTElTVCBjb2xncm91cAotICAlYXR0cnM7Ci0gIHNwYW4gICAgICAgICVOdW1iZXI7ICAgICAgICIxIgotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRAotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCEtLQotIGNvbCBlbGVtZW50cyBkZWZpbmUgdGhlIGFsaWdubWVudCBwcm9wZXJ0aWVzIGZvciBjZWxscyBpbgotIG9uZSBvciBtb3JlIGNvbHVtbnMuCi0KLSBUaGUgd2lkdGggYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbnMsIGUuZy4KLQotICAgICB3aWR0aD02NCAgICAgICAgd2lkdGggaW4gc2NyZWVuIHBpeGVscwotICAgICB3aWR0aD0wLjUqICAgICAgcmVsYXRpdmUgd2lkdGggb2YgMC41Ci0KLSBUaGUgc3BhbiBhdHRyaWJ1dGUgY2F1c2VzIHRoZSBhdHRyaWJ1dGVzIG9mIG9uZQotIGNvbCBlbGVtZW50IHRvIGFwcGx5IHRvIG1vcmUgdGhhbiBvbmUgY29sdW1uLgotLS0+Ci08IUFUVExJU1QgY29sCi0gICVhdHRyczsKLSAgc3BhbiAgICAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVECi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IS0tCi0gICAgVXNlIHRoZWFkIHRvIGR1cGxpY2F0ZSBoZWFkZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGhlYWRlcnMgd2hlbgotICAgIHRib2R5IHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgdGZvb3QgdG8gZHVwbGljYXRlIGZvb3RlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgZm9vdGVycyB3aGVuCi0gICAgdGJvZHkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBtdWx0aXBsZSB0Ym9keSBzZWN0aW9ucyB3aGVuIHJ1bGVzIGFyZSBuZWVkZWQKLSAgICBiZXR3ZWVuIGdyb3VwcyBvZiB0YWJsZSByb3dzLgotLS0+Ci08IUFUVExJU1QgdGhlYWQKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCFBVFRMSVNUIHRmb290Ci0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCB0Ym9keQotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IUFUVExJU1QgdHIKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotCi08IS0tIFNjb3BlIGlzIHNpbXBsZXIgdGhhbiBoZWFkZXJzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcyAtLT4KLTwhRU5USVRZICUgU2NvcGUgIihyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKSI+Ci0KLTwhLS0gdGggaXMgZm9yIGhlYWRlcnMsIHRkIGZvciBkYXRhIGFuZCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggLS0+Ci0KLTwhQVRUTElTVCB0aAotICAlYXR0cnM7Ci0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVECi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVECi0gIHJvd3NwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICBjb2xzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCB0ZAotICAlYXR0cnM7Ci0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVECi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVECi0gIHJvd3NwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICBjb2xzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjOWVlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTk2ICswLDAgQEAKLTwhLS0KLSAgIEV4dGVuc2libGUgSFRNTCB2ZXJzaW9uIDEuMCBUcmFuc2l0aW9uYWwgRFRECi0KLSAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgSFRNTCA0LjAgVHJhbnNpdGlvbmFsIGV4Y2VwdCBmb3IKLSAgIGNoYW5nZXMgZHVlIHRvIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIFhNTCBhbmQgU0dNTC4KLQotICAgTmFtZXNwYWNlID0gaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbAotCi0gICBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgc2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEKLQotICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwKLSAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotCi0gICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiCi0KLSAgICRSZXZpc2lvbjogMS4xICQKLSAgICREYXRlOiAyMDA3LzA1LzE1IDAyOjQyOjIyICQKLQotLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09IENoYXJhY3RlciBtbmVtb25pYyBlbnRpdGllcyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxIGZvciBYSFRNTC8vRU4iCi0gICAieGh0bWwtbGF0MS5lbnQiPgotJUhUTUxsYXQxOwotCi08IUVOVElUWSAlIEhUTUxzeW1ib2wgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAieGh0bWwtc3ltYm9sLmVudCI+Ci0lSFRNTHN5bWJvbDsKLQotPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICJ4aHRtbC1zcGVjaWFsLmVudCI+Ci0lSFRNTHNwZWNpYWw7Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSW1wb3J0ZWQgTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGUgIkNEQVRBIj4KLSAgICA8IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGVzICJDREFUQSI+Ci0gICAgPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0ICJDREFUQSI+Ci0gICAgPCEtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0cyAiQ0RBVEEiPgotICAgIDwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIExhbmd1YWdlQ29kZSAiTk1UT0tFTiI+Ci0gICAgPCEtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0gLS0+Ci0KLTwhRU5USVRZICUgQ2hhcmFjdGVyICJDREFUQSI+Ci0gICAgPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotCi08IUVOVElUWSAlIE51bWJlciAiQ0RBVEEiPgotICAgIDwhLS0gb25lIG9yIG1vcmUgZGlnaXRzIC0tPgotCi08IUVOVElUWSAlIExpbmtUeXBlcyAiQ0RBVEEiPgotICAgIDwhLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcyAtLT4KLQotPCFFTlRJVFkgJSBNZWRpYURlc2MgIkNEQVRBIj4KLSAgICA8IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLQotPCFFTlRJVFkgJSBVUkkgIkNEQVRBIj4KLSAgICA8IS0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLCBzZWUgW1JGQzIzOTZdIC0tPgotCi08IUVOVElUWSAlIFVyaUxpc3QgIkNEQVRBIj4KLSAgICA8IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycyAtLT4KLQotPCFFTlRJVFkgJSBEYXRldGltZSAiQ0RBVEEiPgotICAgIDwhLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotCi08IUVOVElUWSAlIFNjcmlwdCAiQ0RBVEEiPgotICAgIDwhLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci0KLTwhRU5USVRZICUgU3R5bGVTaGVldCAiQ0RBVEEiPgotICAgIDwhLS0gc3R5bGUgc2hlZXQgZGF0YSAtLT4KLQotPCFFTlRJVFkgJSBUZXh0ICJDREFUQSI+Ci0gICAgPCEtLSB1c2VkIGZvciB0aXRsZXMgZXRjLiAtLT4KLQotPCFFTlRJVFkgJSBGcmFtZVRhcmdldCAiTk1UT0tFTiI+Ci0gICAgPCEtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLT4KLQotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIj4KLSAgICA8IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLQotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aCAiQ0RBVEEiPgotICAgIDwhLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotCi08IUVOVElUWSAlIE11bHRpTGVuZ3RocyAiQ0RBVEEiPgotICAgIDwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgTXVsdGlMZW5ndGggLS0+Ci0KLTwhRU5USVRZICUgUGl4ZWxzICJDREFUQSI+Ci0gICAgPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotCi08IS0tIHRoZXNlIGFyZSB1c2VkIGZvciBpbWFnZSBtYXBzIC0tPgotCi08IUVOVElUWSAlIFNoYXBlICIocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KSI+Ci0KLTwhRU5USVRZICUgQ29vcmRzICJDREFUQSI+Ci0gICAgPCEtLSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsZW5ndGhzIC0tPgotCi08IS0tIHVzZWQgZm9yIG9iamVjdCwgYXBwbGV0LCBpbWcsIGlucHV0IGFuZCBpZnJhbWUgLS0+Ci08IUVOVElUWSAlIEltZ0FsaWduICIodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkiPgotCi08IS0tIGEgY29sb3IgdXNpbmcgc1JHQjogI1JSR0dCQiBhcyBIZXggdmFsdWVzIC0tPgotPCFFTlRJVFkgJSBDb2xvciAiQ0RBVEEiPgotCi08IS0tIFRoZXJlIGFyZSBhbHNvIDE2IHdpZGVseSBrbm93biBjb2xvciBuYW1lcyB3aXRoIHRoZWlyIHNSR0IgdmFsdWVzOgotCi0gICAgQmxhY2sgID0gIzAwMDAwMCAgICBHcmVlbiAgPSAjMDA4MDAwCi0gICAgU2lsdmVyID0gI0MwQzBDMCAgICBMaW1lICAgPSAjMDBGRjAwCi0gICAgR3JheSAgID0gIzgwODA4MCAgICBPbGl2ZSAgPSAjODA4MDAwCi0gICAgV2hpdGUgID0gI0ZGRkZGRiAgICBZZWxsb3cgPSAjRkZGRjAwCi0gICAgTWFyb29uID0gIzgwMDAwMCAgICBOYXZ5ICAgPSAjMDAwMDgwCi0gICAgUmVkICAgID0gI0ZGMDAwMCAgICBCbHVlICAgPSAjMDAwMEZGCi0gICAgUHVycGxlID0gIzgwMDA4MCAgICBUZWFsICAgPSAjMDA4MDgwCi0gICAgRnVjaHNpYT0gI0ZGMDBGRiAgICBBcXVhICAgPSAjMDBGRkZGCi0tLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gR2VuZXJpYyBBdHRyaWJ1dGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBjb3JlIGF0dHJpYnV0ZXMgY29tbW9uIHRvIG1vc3QgZWxlbWVudHMKLSAgaWQgICAgICAgZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQKLSAgY2xhc3MgICAgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcwotICBzdHlsZSAgICBhc3NvY2lhdGVkIHN0eWxlIGluZm8KLSAgdGl0bGUgICAgYWR2aXNvcnkgdGl0bGUvYW1wbGlmaWNhdGlvbgotLS0+Ci08IUVOVElUWSAlIGNvcmVhdHRycwotICJpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIGludGVybmF0aW9uYWxpemF0aW9uIGF0dHJpYnV0ZXMKLSAgbGFuZyAgICAgICAgbGFuZ3VhZ2UgY29kZSAoYmFja3dhcmRzIGNvbXBhdGlibGUpCi0gIHhtbDpsYW5nICAgIGxhbmd1YWdlIGNvZGUgKGFzIHBlciBYTUwgMS4wIHNwZWMpCi0gIGRpciAgICAgICAgIGRpcmVjdGlvbiBmb3Igd2Vhay9uZXV0cmFsIHRleHQKLS0tPgotPCFFTlRJVFkgJSBpMThuCi0gImxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIHhtbDpsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gYXR0cmlidXRlcyBmb3IgY29tbW9uIFVJIGV2ZW50cwotICBvbmNsaWNrICAgICBhIHBvaW50ZXIgYnV0dG9uIHdhcyBjbGlja2VkCi0gIG9uZGJsY2xpY2sgIGEgcG9pbnRlciBidXR0b24gd2FzIGRvdWJsZSBjbGlja2VkCi0gIG9ubW91c2Vkb3duIGEgcG9pbnRlciBidXR0b24gd2FzIHByZXNzZWQgZG93bgotICBvbm1vdXNldXAgICBhIHBvaW50ZXIgYnV0dG9uIHdhcyByZWxlYXNlZAotICBvbm1vdXNlbW92ZSBhIHBvaW50ZXIgd2FzIG1vdmVkIG9udG8gdGhlIGVsZW1lbnQKLSAgb25tb3VzZW91dCAgYSBwb2ludGVyIHdhcyBtb3ZlZCBhd2F5IGZyb20gdGhlIGVsZW1lbnQKLSAgb25rZXlwcmVzcyAgYSBrZXkgd2FzIHByZXNzZWQgYW5kIHJlbGVhc2VkCi0gIG9ua2V5ZG93biAgIGEga2V5IHdhcyBwcmVzc2VkIGRvd24KLSAgb25rZXl1cCAgICAgYSBrZXkgd2FzIHJlbGVhc2VkCi0tLT4KLTwhRU5USVRZICUgZXZlbnRzCi0gIm9uY2xpY2sgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uZGJsY2xpY2sgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2Vkb3duICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2V1cCAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2VvdmVyICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2Vtb3ZlICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2VvdXQgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ua2V5cHJlc3MgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ua2V5ZG93biAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ua2V5dXAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gYXR0cmlidXRlcyBmb3IgZWxlbWVudHMgdGhhdCBjYW4gZ2V0IHRoZSBmb2N1cwotICBhY2Nlc3NrZXkgICBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIKLSAgdGFiaW5kZXggICAgcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlcgotICBvbmZvY3VzICAgICB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzCi0gIG9uYmx1ciAgICAgIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzCi0tLT4KLTwhRU5USVRZICUgZm9jdXMKLSAiYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCFFTlRJVFkgJSBhdHRycyAiJWNvcmVhdHRyczsgJWkxOG47ICVldmVudHM7Ij4KLQotPCEtLSB0ZXh0IGFsaWdubWVudCBmb3IgcCwgZGl2LCBoMS1oNi4gVGhlIGRlZmF1bHQgaXMKLSAgICAgYWxpZ249ImxlZnQiIGZvciBsdHIgaGVhZGluZ3MsICJyaWdodCIgZm9yIHJ0bCAtLT4KLQotPCFFTlRJVFkgJSBUZXh0QWxpZ24gImFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQiPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBUZXh0IEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIHNwZWNpYWwKLSAgICJiciB8IHNwYW4gfCBiZG8gfCBvYmplY3QgfCBhcHBsZXQgfCBpbWcgfCBtYXAgfCBpZnJhbWUiPgotCi08IUVOVElUWSAlIGZvbnRzdHlsZSAidHQgfCBpIHwgYiB8IGJpZyB8IHNtYWxsIHwgdQotICAgICAgICAgICAgICAgICAgICAgIHwgcyB8IHN0cmlrZSB8Zm9udCB8IGJhc2Vmb250Ij4KLQotPCFFTlRJVFkgJSBwaHJhc2UgImVtIHwgc3Ryb25nIHwgZGZuIHwgY29kZSB8IHEgfCBzdWIgfCBzdXAgfAotICAgICAgICAgICAgICAgICAgIHNhbXAgfCBrYmQgfCB2YXIgfCBjaXRlIHwgYWJiciB8IGFjcm9ueW0iPgotCi08IUVOVElUWSAlIGlubGluZS5mb3JtcyAiaW5wdXQgfCBzZWxlY3QgfCB0ZXh0YXJlYSB8IGxhYmVsIHwgYnV0dG9uIj4KLQotPCEtLSB0aGVzZSBjYW4gb2NjdXIgYXQgYmxvY2sgb3IgaW5saW5lIGxldmVsIC0tPgotPCFFTlRJVFkgJSBtaXNjICJpbnMgfCBkZWwgfCBzY3JpcHQgfCBub3NjcmlwdCI+Ci0KLTwhRU5USVRZICUgaW5saW5lICJhIHwgJXNwZWNpYWw7IHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVpbmxpbmUuZm9ybXM7Ij4KLQotPCEtLSAlSW5saW5lOyBjb3ZlcnMgaW5saW5lIG9yICJ0ZXh0LWxldmVsIiBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgSW5saW5lICIoI1BDREFUQSB8ICVpbmxpbmU7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEJsb2NrIGxldmVsIGVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGhlYWRpbmcgImgxfGgyfGgzfGg0fGg1fGg2Ij4KLTwhRU5USVRZICUgbGlzdHMgInVsIHwgb2wgfCBkbCB8IG1lbnUgfCBkaXIiPgotPCFFTlRJVFkgJSBibG9ja3RleHQgInByZSB8IGhyIHwgYmxvY2txdW90ZSB8IGFkZHJlc3MgfCBjZW50ZXIgfCBub2ZyYW1lcyI+Ci0KLTwhRU5USVRZICUgYmxvY2sKLSAgICAicCB8ICVoZWFkaW5nOyB8IGRpdiB8ICVsaXN0czsgfCAlYmxvY2t0ZXh0OyB8IGlzaW5kZXggfGZpZWxkc2V0IHwgdGFibGUiPgotCi08IUVOVElUWSAlIEJsb2NrICIoJWJsb2NrOyB8IGZvcm0gfCAlbWlzYzspKiI+Ci0KLTwhLS0gJUZsb3c7IG1peGVzIEJsb2NrIGFuZCBJbmxpbmUgYW5kIGlzIHVzZWQgZm9yIGxpc3QgaXRlbXMgZXRjLiAtLT4KLTwhRU5USVRZICUgRmxvdyAiKCNQQ0RBVEEgfCAlYmxvY2s7IHwgZm9ybSB8ICVpbmxpbmU7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENvbnRlbnQgbW9kZWxzIGZvciBleGNsdXNpb25zID09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGEgZWxlbWVudHMgdXNlICVJbmxpbmU7IGV4Y2x1ZGluZyBhIC0tPgotCi08IUVOVElUWSAlIGEuY29udGVudAotICAgIigjUENEQVRBIHwgJXNwZWNpYWw7IHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVpbmxpbmUuZm9ybXM7IHwgJW1pc2M7KSoiPgotCi08IS0tIHByZSB1c2VzICVJbmxpbmUgZXhjbHVkaW5nIGltZywgb2JqZWN0LCBhcHBsZXQsIGJpZywgc21hbGwsCi0gICAgIHN1Yiwgc3VwLCBmb250LCBvciBiYXNlZm9udCAtLT4KLQotPCFFTlRJVFkgJSBwcmUuY29udGVudAotICAgIigjUENEQVRBIHwgYSB8IGJyIHwgc3BhbiB8IGJkbyB8IG1hcCB8IHR0IHwgaSB8IGIgfCB1IHwgcyB8Ci0gICAgICAlcGhyYXNlOyB8ICVpbmxpbmUuZm9ybXM7KSoiPgotCi08IS0tIGZvcm0gdXNlcyAlRmxvdzsgZXhjbHVkaW5nIGZvcm0gLS0+Ci0KLTwhRU5USVRZICUgZm9ybS5jb250ZW50ICIoI1BDREFUQSB8ICVibG9jazsgfCAlaW5saW5lOyB8ICVtaXNjOykqIj4KLQotPCEtLSBidXR0b24gdXNlcyAlRmxvdzsgYnV0IGV4Y2x1ZGVzIGEsIGZvcm0sIGZvcm0gY29udHJvbHMsIGlmcmFtZSAtLT4KLQotPCFFTlRJVFkgJSBidXR0b24uY29udGVudAotICAgIigjUENEQVRBIHwgcCB8ICVoZWFkaW5nOyB8IGRpdiB8ICVsaXN0czsgfCAlYmxvY2t0ZXh0OyB8Ci0gICAgICB0YWJsZSB8IGJyIHwgc3BhbiB8IGJkbyB8IG9iamVjdCB8IGFwcGxldCB8IGltZyB8IG1hcCB8Ci0gICAgICAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBTdHJ1Y3R1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIHRoZSBuYW1lc3BhY2UgVVJJIGRlc2lnbmF0ZXMgdGhlIGRvY3VtZW50IHByb2ZpbGUgLS0+Ci0KLTwhRUxFTUVOVCBodG1sIChoZWFkLCBib2R5KT4KLTwhQVRUTElTVCBodG1sCi0gICVpMThuOwotICB4bWxucyAgICAgICAlVVJJOyAgICAgICAgICAjRklYRUQgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgSGVhZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIihzY3JpcHR8c3R5bGV8bWV0YXxsaW5rfG9iamVjdHxpc2luZGV4KSoiPgotCi08IS0tIGNvbnRlbnQgbW9kZWwgaXMgJWhlYWQubWlzYzsgY29tYmluZWQgd2l0aCBhIHNpbmdsZQotICAgICB0aXRsZSBhbmQgYW4gb3B0aW9uYWwgYmFzZSBlbGVtZW50IGluIGFueSBvcmRlciAtLT4KLQotPCFFTEVNRU5UIGhlYWQgKCVoZWFkLm1pc2M7LAotICAgICAoKHRpdGxlLCAlaGVhZC5taXNjOywgKGJhc2UsICVoZWFkLm1pc2M7KT8pIHwKLSAgICAgIChiYXNlLCAlaGVhZC5taXNjOywgKHRpdGxlLCAlaGVhZC5taXNjOykpKSk+Ci0KLTwhQVRUTElTVCBoZWFkCi0gICVpMThuOwotICBwcm9maWxlICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gVGhlIHRpdGxlIGVsZW1lbnQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgZmxvdyBvZiB0ZXh0LgotICAgICAgIEl0IHNob3VsZCBiZSBkaXNwbGF5ZWQsIGZvciBleGFtcGxlIGFzIHRoZSBwYWdlIGhlYWRlciBvcgotICAgICAgIHdpbmRvdyB0aXRsZS4gRXhhY3RseSBvbmUgdGl0bGUgaXMgcmVxdWlyZWQgcGVyIGRvY3VtZW50LgotICAgIC0tPgotPCFFTEVNRU5UIHRpdGxlICgjUENEQVRBKT4KLTwhQVRUTElTVCB0aXRsZSAlaTE4bjs+Ci0KLTwhLS0gZG9jdW1lbnQgYmFzZSBVUkkgLS0+Ci0KLTwhRUxFTUVOVCBiYXNlIEVNUFRZPgotPCFBVFRMSVNUIGJhc2UKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tIGdlbmVyaWMgbWV0YWluZm9ybWF0aW9uIC0tPgotPCFFTEVNRU5UIG1ldGEgRU1QVFk+Ci08IUFUVExJU1QgbWV0YQotICAlaTE4bjsKLSAgaHR0cC1lcXVpdiAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgY29udGVudCAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVECi0gIHNjaGVtZSAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBSZWxhdGlvbnNoaXAgdmFsdWVzIGNhbiBiZSB1c2VkIGluIHByaW5jaXBsZToKLQotICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzIHdoZW4gdXNlZAotICAgICAgd2l0aCB0aGUgbGluayBlbGVtZW50IGluIGRvY3VtZW50IGhlYWQgZS5nLgotICAgICAgICBzdGFydCwgY29udGVudHMsIHByZXZpb3VzLCBuZXh0LCBpbmRleCwgZW5kLCBoZWxwCi0gICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQgKHJlbD0ic3R5bGVzaGVldCIpCi0gICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPSJzY3JpcHQiKQotICAgZCkgYnkgc3R5bGVzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YKLSAgICAgIGh0bWwgbm9kZXMgYXJlIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgZS5nLiBhIFBvc3RTY3JpcHQgb3IgUERGIHZlcnNpb24gKHJlbD0iYWx0ZXJuYXRlIiBtZWRpYT0icHJpbnQiKQotLS0+Ci0KLTwhRUxFTUVOVCBsaW5rIEVNUFRZPgotPCFBVFRMSVNUIGxpbmsKLSAgJWF0dHJzOwotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRAotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRAotICA+Ci0KLTwhLS0gc3R5bGUgaW5mbywgd2hpY2ggbWF5IGluY2x1ZGUgQ0RBVEEgc2VjdGlvbnMgLS0+Ci08IUVMRU1FTlQgc3R5bGUgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIHN0eWxlCi0gICVpMThuOwotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQKLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgeG1sOnNwYWNlICAgKHByZXNlcnZlKSAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLSAgPgotCi08IS0tIHNjcmlwdCBzdGF0ZW1lbnRzLCB3aGljaCBtYXkgaW5jbHVkZSBDREFUQSBzZWN0aW9ucyAtLT4KLTwhRUxFTUVOVCBzY3JpcHQgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIHNjcmlwdAotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQKLSAgbGFuZ3VhZ2UgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGVmZXIgICAgICAgKGRlZmVyKSAgICAgICAgI0lNUExJRUQKLSAgeG1sOnNwYWNlICAgKHByZXNlcnZlKSAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLSAgPgotCi08IS0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIHNjcmlwdC1iYXNlZCByZW5kZXJpbmcgLS0+Ci0KLTwhRUxFTUVOVCBub3NjcmlwdCAlRmxvdzs+Ci08IUFUVExJU1Qgbm9zY3JpcHQKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PSBGcmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gaW5saW5lIHN1YndpbmRvdyAtLT4KLQotPCFFTEVNRU5UIGlmcmFtZSAlRmxvdzs+Ci08IUFUVExJU1QgaWZyYW1lCi0gICVjb3JlYXR0cnM7Ci0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGZyYW1lYm9yZGVyICgxfDApICAgICAgICAgICIxIgotICBtYXJnaW53aWR0aCAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBtYXJnaW5oZWlnaHQgJVBpeGVsczsgICAgICAjSU1QTElFRAotICBzY3JvbGxpbmcgICAoeWVzfG5vfGF1dG8pICAiYXV0byIKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIGZyYW1lLWJhc2VkIHJlbmRlcmluZyAtLT4KLQotPCFFTEVNRU5UIG5vZnJhbWVzICVGbG93Oz4KLTwhQVRUTElTVCBub2ZyYW1lcwotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGJvZHkgJUZsb3c7PgotPCFBVFRMSVNUIGJvZHkKLSAgJWF0dHJzOwotICBvbmxvYWQgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnVubG9hZCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBiYWNrZ3JvdW5kICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICB0ZXh0ICAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICBsaW5rICAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICB2bGluayAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICBhbGluayAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBkaXYgJUZsb3c7PiAgPCEtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBkaXYKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFBhcmFncmFwaHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBwICVJbmxpbmU7PgotPCFBVFRMSVNUIHAKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhlYWRpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgVGhlcmUgYXJlIHNpeCBsZXZlbHMgb2YgaGVhZGluZ3MgZnJvbSBoMSAodGhlIG1vc3QgaW1wb3J0YW50KQotICB0byBoNiAodGhlIGxlYXN0IGltcG9ydGFudCkuCi0tLT4KLQotPCFFTEVNRU5UIGgxICAlSW5saW5lOz4KLTwhQVRUTElTVCBoMQotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCFFTEVNRU5UIGgyICVJbmxpbmU7PgotPCFBVFRMSVNUIGgyCi0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IUVMRU1FTlQgaDMgJUlubGluZTs+Ci08IUFUVExJU1QgaDMKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhRUxFTUVOVCBoNCAlSW5saW5lOz4KLTwhQVRUTElTVCBoNAotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCFFTEVNRU5UIGg1ICVJbmxpbmU7PgotPCFBVFRMSVNUIGg1Ci0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IUVMRU1FTlQgaDYgJUlubGluZTs+Ci08IUFUVExJU1QgaDYKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IExpc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gVW5vcmRlcmVkIGxpc3QgYnVsbGV0IHN0eWxlcyAtLT4KLQotPCFFTlRJVFkgJSBVTFN0eWxlICIoZGlzY3xzcXVhcmV8Y2lyY2xlKSI+Ci0KLTwhLS0gVW5vcmRlcmVkIGxpc3QgLS0+Ci0KLTwhRUxFTUVOVCB1bCAobGkpKz4KLTwhQVRUTElTVCB1bAotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVVTFN0eWxlOyAgICAgI0lNUExJRUQKLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gT3JkZXJlZCBsaXN0IG51bWJlcmluZyBzdHlsZQotCi0gICAgMSAgIGFyYWJpYyBudW1iZXJzICAgICAgMSwgMiwgMywgLi4uCi0gICAgYSAgIGxvd2VyIGFscGhhICAgICAgICAgYSwgYiwgYywgLi4uCi0gICAgQSAgIHVwcGVyIGFscGhhICAgICAgICAgQSwgQiwgQywgLi4uCi0gICAgaSAgIGxvd2VyIHJvbWFuICAgICAgICAgaSwgaWksIGlpaSwgLi4uCi0gICAgSSAgIHVwcGVyIHJvbWFuICAgICAgICAgSSwgSUksIElJSSwgLi4uCi0KLSAgICBUaGUgc3R5bGUgaXMgYXBwbGllZCB0byB0aGUgc2VxdWVuY2UgbnVtYmVyIHdoaWNoIGJ5IGRlZmF1bHQKLSAgICBpcyByZXNldCB0byAxIGZvciB0aGUgZmlyc3QgbGlzdCBpdGVtIGluIGFuIG9yZGVyZWQgbGlzdC4KLS0tPgotPCFFTlRJVFkgJSBPTFN0eWxlICJDREFUQSI+Ci0KLTwhLS0gT3JkZXJlZCAobnVtYmVyZWQpIGxpc3QgLS0+Ci0KLTwhRUxFTUVOVCBvbCAobGkpKz4KLTwhQVRUTElTVCBvbAotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVPTFN0eWxlOyAgICAgICNJTVBMSUVECi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVECi0gIHN0YXJ0ICAgICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBzaW5nbGUgY29sdW1uIGxpc3QgKERFUFJFQ0FURUQpIC0tPiAKLTwhRUxFTUVOVCBtZW51IChsaSkrPgotPCFBVFRMSVNUIG1lbnUKLSAgJWF0dHJzOwotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBtdWx0aXBsZSBjb2x1bW4gbGlzdCAoREVQUkVDQVRFRCkgLS0+IAotPCFFTEVNRU5UIGRpciAobGkpKz4KLTwhQVRUTElTVCBkaXIKLSAgJWF0dHJzOwotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBMSVN0eWxlIGlzIGNvbnN0cmFpbmVkIHRvOiAiKCVVTFN0eWxlO3wlT0xTdHlsZTspIiAtLT4KLTwhRU5USVRZICUgTElTdHlsZSAiQ0RBVEEiPgotCi08IS0tIGxpc3QgaXRlbSAtLT4KLQotPCFFTEVNRU5UIGxpICVGbG93Oz4KLTwhQVRUTElTVCBsaQotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVMSVN0eWxlOyAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBkZWZpbml0aW9uIGxpc3RzIC0gZHQgZm9yIHRlcm0sIGRkIGZvciBpdHMgZGVmaW5pdGlvbiAtLT4KLQotPCFFTEVNRU5UIGRsIChkdHxkZCkrPgotPCFBVFRMSVNUIGRsCi0gICVhdHRyczsKLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZHQgJUlubGluZTs+Ci08IUFUVExJU1QgZHQKLSAgJWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBkZCAlRmxvdzs+Ci08IUFUVExJU1QgZGQKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEFkZHJlc3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gaW5mb3JtYXRpb24gb24gYXV0aG9yIC0tPgotCi08IUVMRU1FTlQgYWRkcmVzcyAlSW5saW5lOz4KLTwhQVRUTElTVCBhZGRyZXNzCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIb3Jpem9udGFsIFJ1bGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgaHIgRU1QVFk+Ci08IUFUVExJU1QgaHIKLSAgJWF0dHJzOwotICBhbGlnbiAgICAgICAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVECi0gIG5vc2hhZGUgICAgIChub3NoYWRlKSAgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUHJlZm9ybWF0dGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBjb250ZW50IGlzICVJbmxpbmU7IGV4Y2x1ZGluZyAKLSAgICAgICAgImltZ3xvYmplY3R8YXBwbGV0fGJpZ3xzbWFsbHxzdWJ8c3VwfGZvbnR8YmFzZWZvbnQiIC0tPgotCi08IUVMRU1FTlQgcHJlICVwcmUuY29udGVudDs+Ci08IUFUVExJU1QgcHJlCi0gICVhdHRyczsKLSAgd2lkdGggICAgICAgJU51bWJlcjsgICAgICAjSU1QTElFRAotICB4bWw6c3BhY2UgICAocHJlc2VydmUpICAgICNGSVhFRCAncHJlc2VydmUnCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gQmxvY2stbGlrZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGJsb2NrcXVvdGUgJUZsb3c7PgotPCFBVFRMSVNUIGJsb2NrcXVvdGUKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgYWxpZ25tZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY2VudGVyIGNvbnRlbnQgLS0+Ci08IUVMRU1FTlQgY2VudGVyICVGbG93Oz4KLTwhQVRUTElTVCBjZW50ZXIKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEluc2VydGVkL0RlbGV0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgaW5zL2RlbCBhcmUgYWxsb3dlZCBpbiBibG9jayBhbmQgaW5saW5lIGNvbnRlbnQsIGJ1dCBpdHMKLSAgaW5hcHByb3ByaWF0ZSB0byBpbmNsdWRlIGJsb2NrIGNvbnRlbnQgd2l0aGluIGFuIGlucyBlbGVtZW50Ci0gIG9jY3VycmluZyBpbiBpbmxpbmUgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIGlucyAlRmxvdzs+Ci08IUFUVExJU1QgaW5zCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZGVsICVGbG93Oz4KLTwhQVRUTElTVCBkZWwKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkYXRldGltZSAgICAlRGF0ZXRpbWU7ICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY29udGVudCBpcyAlSW5saW5lOyBleGNlcHQgdGhhdCBhbmNob3JzIHNob3VsZG4ndCBiZSBuZXN0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBhICVhLmNvbnRlbnQ7PgotPCFBVFRMSVNUIGEKLSAgJWF0dHJzOwotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICAicmVjdCIKLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09IElubGluZSBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgc3BhbiAlSW5saW5lOz4gPCEtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBzcGFuCi0gICVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgYmRvICVJbmxpbmU7PiAgPCEtLSBJMThOIEJpRGkgb3Zlci1yaWRlIC0tPgotPCFBVFRMSVNUIGJkbwotICAlY29yZWF0dHJzOwotICAlZXZlbnRzOwotICBsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICB4bWw6bGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjUkVRVUlSRUQKLSAgPgotCi08IUVMRU1FTlQgYnIgRU1QVFk+ICAgPCEtLSBmb3JjZWQgbGluZSBicmVhayAtLT4KLTwhQVRUTElTVCBicgotICAlY29yZWF0dHJzOwotICBjbGVhciAgICAgICAobGVmdHxhbGx8cmlnaHR8bm9uZSkgIm5vbmUiCi0gID4KLQotPCFFTEVNRU5UIGVtICVJbmxpbmU7PiAgIDwhLS0gZW1waGFzaXMgLS0+Ci08IUFUVExJU1QgZW0gJWF0dHJzOz4KLQotPCFFTEVNRU5UIHN0cm9uZyAlSW5saW5lOz4gICA8IS0tIHN0cm9uZyBlbXBoYXNpcyAtLT4KLTwhQVRUTElTVCBzdHJvbmcgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGRmbiAlSW5saW5lOz4gICA8IS0tIGRlZmluaXRpb25hbCAtLT4KLTwhQVRUTElTVCBkZm4gJWF0dHJzOz4KLQotPCFFTEVNRU5UIGNvZGUgJUlubGluZTs+ICAgPCEtLSBwcm9ncmFtIGNvZGUgLS0+Ci08IUFUVExJU1QgY29kZSAlYXR0cnM7PgotCi08IUVMRU1FTlQgc2FtcCAlSW5saW5lOz4gICA8IS0tIHNhbXBsZSAtLT4KLTwhQVRUTElTVCBzYW1wICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBrYmQgJUlubGluZTs+ICA8IS0tIHNvbWV0aGluZyB1c2VyIHdvdWxkIHR5cGUgLS0+Ci08IUFUVExJU1Qga2JkICVhdHRyczs+Ci0KLTwhRUxFTUVOVCB2YXIgJUlubGluZTs+ICAgPCEtLSB2YXJpYWJsZSAtLT4KLTwhQVRUTElTVCB2YXIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGNpdGUgJUlubGluZTs+ICAgPCEtLSBjaXRhdGlvbiAtLT4KLTwhQVRUTElTVCBjaXRlICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBhYmJyICVJbmxpbmU7PiAgIDwhLS0gYWJicmV2aWF0aW9uIC0tPgotPCFBVFRMSVNUIGFiYnIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGFjcm9ueW0gJUlubGluZTs+ICAgPCEtLSBhY3JvbnltIC0tPgotPCFBVFRMSVNUIGFjcm9ueW0gJWF0dHJzOz4KLQotPCFFTEVNRU5UIHEgJUlubGluZTs+ICAgPCEtLSBpbmxpbmVkIHF1b3RlIC0tPgotPCFBVFRMSVNUIHEKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBzdWIgJUlubGluZTs+IDwhLS0gc3Vic2NyaXB0IC0tPgotPCFBVFRMSVNUIHN1YiAlYXR0cnM7PgotCi08IUVMRU1FTlQgc3VwICVJbmxpbmU7PiA8IS0tIHN1cGVyc2NyaXB0IC0tPgotPCFBVFRMSVNUIHN1cCAlYXR0cnM7PgotCi08IUVMRU1FTlQgdHQgJUlubGluZTs+ICAgPCEtLSBmaXhlZCBwaXRjaCBmb250IC0tPgotPCFBVFRMSVNUIHR0ICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBpICVJbmxpbmU7PiAgIDwhLS0gaXRhbGljIGZvbnQgLS0+Ci08IUFUVExJU1QgaSAlYXR0cnM7PgotCi08IUVMRU1FTlQgYiAlSW5saW5lOz4gICA8IS0tIGJvbGQgZm9udCAtLT4KLTwhQVRUTElTVCBiICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBiaWcgJUlubGluZTs+ICAgPCEtLSBiaWdnZXIgZm9udCAtLT4KLTwhQVRUTElTVCBiaWcgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHNtYWxsICVJbmxpbmU7PiAgIDwhLS0gc21hbGxlciBmb250IC0tPgotPCFBVFRMSVNUIHNtYWxsICVhdHRyczs+Ci0KLTwhRUxFTUVOVCB1ICVJbmxpbmU7PiAgIDwhLS0gdW5kZXJsaW5lIC0tPgotPCFBVFRMSVNUIHUgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHMgJUlubGluZTs+ICAgPCEtLSBzdHJpa2UtdGhyb3VnaCAtLT4KLTwhQVRUTElTVCBzICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzdHJpa2UgJUlubGluZTs+ICAgPCEtLSBzdHJpa2UtdGhyb3VnaCAtLT4KLTwhQVRUTElTVCBzdHJpa2UgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGJhc2Vmb250IEVNUFRZPiAgPCEtLSBiYXNlIGZvbnQgc2l6ZSAtLT4KLTwhQVRUTElTVCBiYXNlZm9udAotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQKLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZm9udCAlSW5saW5lOz4gPCEtLSBsb2NhbCBjaGFuZ2UgdG8gZm9udCAtLT4KLTwhQVRUTElTVCBmb250Ci0gICVjb3JlYXR0cnM7Ci0gICVpMThuOwotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBjb2xvciAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICBmYWNlICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PSBPYmplY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0KLSAgb2JqZWN0IGlzIHVzZWQgdG8gZW1iZWQgb2JqZWN0cyBhcyBwYXJ0IG9mIEhUTUwgcGFnZXMuCi0gIHBhcmFtIGVsZW1lbnRzIHNob3VsZCBwcmVjZWRlIG90aGVyIGNvbnRlbnQuIFBhcmFtZXRlcnMKLSAgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGFzIGF0dHJpYnV0ZS92YWx1ZSBwYWlycyBvbiB0aGUKLSAgb2JqZWN0IGVsZW1lbnQgaXRzZWxmIHdoZW4gYnJldml0eSBpcyBkZXNpcmVkLgotLS0+Ci0KLTwhRUxFTUVOVCBvYmplY3QgKCNQQ0RBVEEgfCBwYXJhbSB8ICVibG9jazsgfCBmb3JtIHwgJWlubGluZTsgfCAlbWlzYzspKj4KLTwhQVRUTElTVCBvYmplY3QKLSAgJWF0dHJzOwotICBkZWNsYXJlICAgICAoZGVjbGFyZSkgICAgICAjSU1QTElFRAotICBjbGFzc2lkICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBjb2RlYmFzZSAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkYXRhICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBjb2RldHlwZSAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBhcmNoaXZlICAgICAlVXJpTGlzdDsgICAgICAjSU1QTElFRAotICBzdGFuZGJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhbGlnbiAgICAgICAlSW1nQWxpZ247ICAgICAjSU1QTElFRAotICBib3JkZXIgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgcGFyYW0gaXMgdXNlZCB0byBzdXBwbHkgYSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZS4KLSAgSW4gWE1MIGl0IHdvdWxkIHNlZW0gbmF0dXJhbCB0byBmb2xsb3cgUkRGIGFuZCBzdXBwb3J0IGFuCi0gIGFiYnJldmlhdGVkIHN5bnRheCB3aGVyZSB0aGUgcGFyYW0gZWxlbWVudHMgYXJlIHJlcGxhY2VkCi0gIGJ5IGF0dHJpYnV0ZSB2YWx1ZSBwYWlycyBvbiB0aGUgb2JqZWN0IHN0YXJ0IHRhZy4KLS0tPgotPCFFTEVNRU5UIHBhcmFtIEVNUFRZPgotPCFBVFRMSVNUIHBhcmFtCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZXR5cGUgICAoZGF0YXxyZWZ8b2JqZWN0KSAiZGF0YSIKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBKYXZhIGFwcGxldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIE9uZSBvZiBjb2RlIG9yIG9iamVjdCBhdHRyaWJ1dGVzIG11c3QgYmUgcHJlc2VudC4KLSAgUGxhY2UgcGFyYW0gZWxlbWVudHMgYmVmb3JlIG90aGVyIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBhcHBsZXQgKCNQQ0RBVEEgfCBwYXJhbSB8ICVibG9jazsgfCBmb3JtIHwgJWlubGluZTsgfCAlbWlzYzspKj4KLTwhQVRUTElTVCBhcHBsZXQKLSAgJWNvcmVhdHRyczsKLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgYXJjaGl2ZSAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgY29kZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgb2JqZWN0ICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI1JFUVVJUkVECi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNSRVFVSVJFRAotICBhbGlnbiAgICAgICAlSW1nQWxpZ247ICAgICAjSU1QTElFRAotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEltYWdlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgIFRvIGF2b2lkIGFjY2Vzc2liaWxpdHkgcHJvYmxlbXMgZm9yIHBlb3BsZSB3aG8gYXJlbid0Ci0gICBhYmxlIHRvIHNlZSB0aGUgaW1hZ2UsIHlvdSBzaG91bGQgcHJvdmlkZSBhIHRleHQKLSAgIGRlc2NyaXB0aW9uIHVzaW5nIHRoZSBhbHQgYW5kIGxvbmdkZXNjIGF0dHJpYnV0ZXMuCi0gICBJbiBhZGRpdGlvbiwgYXZvaWQgdGhlIHVzZSBvZiBzZXJ2ZXItc2lkZSBpbWFnZSBtYXBzLgotLS0+Ci0KLTwhRUxFTUVOVCBpbWcgRU1QVFk+Ci08IUFUVExJU1QgaW1nCi0gICVhdHRyczsKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVECi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRAotICBhbGlnbiAgICAgICAlSW1nQWxpZ247ICAgICAjSU1QTElFRAotICBib3JkZXIgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gdXNlbWFwIHBvaW50cyB0byBhIG1hcCBlbGVtZW50IHdoaWNoIG1heSBiZSBpbiB0aGlzIGRvY3VtZW50Ci0gIG9yIGFuIGV4dGVybmFsIGRvY3VtZW50LCBhbHRob3VnaCB0aGUgbGF0dGVyIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENsaWVudC1zaWRlIGltYWdlIG1hcHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFRoZXNlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgb3IgZ3JvdXBlZCBpbiBhCi0gICAgIHNlcGFyYXRlIGRvY3VtZW50IGFsdGhvdWdoIHRoaXMgaXNuJ3QgeWV0IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBtYXAgKCglYmxvY2s7IHwgZm9ybSB8ICVtaXNjOykrIHwgYXJlYSspPgotPCFBVFRMSVNUIG1hcAotICAlaTE4bjsKLSAgJWV2ZW50czsKLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI1JFUVVJUkVECi0gIGNsYXNzICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHN0eWxlICAgICAgICVTdHlsZVNoZWV0OyAgICNJTVBMSUVECi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGFyZWEgRU1QVFk+Ci08IUFUVExJU1QgYXJlYQotICAlYXR0cnM7Ci0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgICJyZWN0IgotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBub2hyZWYgICAgICAobm9ocmVmKSAgICAgICAjSU1QTElFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBGb3JtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgZm9ybSAlZm9ybS5jb250ZW50Oz4gICA8IS0tIGZvcm1zIHNob3VsZG4ndCBiZSBuZXN0ZWQgLS0+Ci0KLTwhQVRUTElTVCBmb3JtCi0gICVhdHRyczsKLSAgYWN0aW9uICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVECi0gIG1ldGhvZCAgICAgIChnZXR8cG9zdCkgICAgICJnZXQiCi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIGVuY3R5cGUgICAgICVDb250ZW50VHlwZTsgICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCi0gIG9uc3VibWl0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ucmVzZXQgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIGFjY2VwdCAgICAgICVDb250ZW50VHlwZXM7ICNJTVBMSUVECi0gIGFjY2VwdC1jaGFyc2V0ICVDaGFyc2V0czsgICNJTVBMSUVECi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZAotICBMYWJlbCBlbGVtZW50cyBzaG91bGRuJ3QgYmUgbmVzdGVkLgotLS0+Ci08IUVMRU1FTlQgbGFiZWwgJUlubGluZTs+Ci08IUFUVExJU1QgbGFiZWwKLSAgJWF0dHJzOwotICBmb3IgICAgICAgICBJRFJFRiAgICAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRU5USVRZICUgSW5wdXRUeXBlCi0gICIodGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfAotICAgIHJhZGlvIHwgc3VibWl0IHwgcmVzZXQgfAotICAgIGZpbGUgfCBoaWRkZW4gfCBpbWFnZSB8IGJ1dHRvbikiCi0gICA+Ci0KLTwhLS0gdGhlIG5hbWUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGZvciBhbGwgYnV0IHN1Ym1pdCAmIHJlc2V0IC0tPgotCi08IUVMRU1FTlQgaW5wdXQgRU1QVFk+ICAgICA8IS0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBpbnB1dAotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVJbnB1dFR5cGU7ICAgICJ0ZXh0IgotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBjaGVja2VkICAgICAoY2hlY2tlZCkgICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBtYXhsZW5ndGggICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBhbHQgICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRAotICBhbGlnbiAgICAgICAlSW1nQWxpZ247ICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBzZWxlY3QgKG9wdGdyb3VwfG9wdGlvbikrPiAgPCEtLSBvcHRpb24gc2VsZWN0b3IgLS0+Ci08IUFUVExJU1Qgc2VsZWN0Ci0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgbXVsdGlwbGUgICAgKG11bHRpcGxlKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgb3B0Z3JvdXAgKG9wdGlvbikrPiAgIDwhLS0gb3B0aW9uIGdyb3VwIC0tPgotPCFBVFRMSVNUIG9wdGdyb3VwCi0gICVhdHRyczsKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVECi0gID4KLQotPCFFTEVNRU5UIG9wdGlvbiAoI1BDREFUQSk+ICAgICA8IS0tIHNlbGVjdGFibGUgY2hvaWNlIC0tPgotPCFBVFRMSVNUIG9wdGlvbgotICAlYXR0cnM7Ci0gIHNlbGVjdGVkICAgIChzZWxlY3RlZCkgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIHRleHRhcmVhICgjUENEQVRBKT4gICAgIDwhLS0gbXVsdGktbGluZSB0ZXh0IGZpZWxkIC0tPgotPCFBVFRMSVNUIHRleHRhcmVhCi0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgcm93cyAgICAgICAgJU51bWJlcjsgICAgICAgI1JFUVVJUkVECi0gIGNvbHMgICAgICAgICVOdW1iZXI7ICAgICAgICNSRVFVSVJFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgVGhlIGZpZWxkc2V0IGVsZW1lbnQgaXMgdXNlZCB0byBncm91cCBmb3JtIGZpZWxkcy4KLSAgT25seSBvbmUgbGVnZW5kIGVsZW1lbnQgc2hvdWxkIG9jY3VyIGluIHRoZSBjb250ZW50Ci0gIGFuZCBpZiBwcmVzZW50IHNob3VsZCBvbmx5IGJlIHByZWNlZGVkIGJ5IHdoaXRlc3BhY2UuCi0tLT4KLTwhRUxFTUVOVCBmaWVsZHNldCAoI1BDREFUQSB8IGxlZ2VuZCB8ICVibG9jazsgfCBmb3JtIHwgJWlubGluZTsgfCAlbWlzYzspKj4KLTwhQVRUTElTVCBmaWVsZHNldAotICAlYXR0cnM7Ci0gID4KLQotPCFFTlRJVFkgJSBMQWxpZ24gIih0b3B8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCFFTEVNRU5UIGxlZ2VuZCAlSW5saW5lOz4gICAgIDwhLS0gZmllbGRzZXQgbGFiZWwgLS0+Ci08IUFUVExJU1QgbGVnZW5kCi0gICVhdHRyczsKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgJUxBbGlnbjsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gQ29udGVudCBpcyAlRmxvdzsgZXhjbHVkaW5nIGEsIGZvcm0sIGZvcm0gY29udHJvbHMsIGlmcmFtZQotLS0+IAotPCFFTEVNRU5UIGJ1dHRvbiAlYnV0dG9uLmNvbnRlbnQ7PiAgPCEtLSBwdXNoIGJ1dHRvbiAtLT4KLTwhQVRUTElTVCBidXR0b24KLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgInN1Ym1pdCIKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIHNpbmdsZS1saW5lIHRleHQgaW5wdXQgY29udHJvbCAoREVQUkVDQVRFRCkgLS0+Ci08IUVMRU1FTlQgaXNpbmRleCBFTVBUWT4KLTwhQVRUTElTVCBpc2luZGV4Ci0gICVjb3JlYXR0cnM7Ci0gICVpMThuOwotICBwcm9tcHQgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PSBUYWJsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gRGVyaXZlZCBmcm9tIElFVEYgSFRNTCB0YWJsZSBzdGFuZGFyZCwgc2VlIFtSRkMxOTQyXSAtLT4KLQotPCEtLQotIFRoZSBib3JkZXIgYXR0cmlidXRlIHNldHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgZnJhbWUgYXJvdW5kIHRoZQotIHRhYmxlLiBUaGUgZGVmYXVsdCB1bml0cyBhcmUgc2NyZWVuIHBpeGVscy4KLQotIFRoZSBmcmFtZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoaWNoIHBhcnRzIG9mIHRoZSBmcmFtZSBhcm91bmQKLSB0aGUgdGFibGUgc2hvdWxkIGJlIHJlbmRlcmVkLiBUaGUgdmFsdWVzIGFyZSBub3QgdGhlIHNhbWUgYXMKLSBDQUxTIHRvIGF2b2lkIGEgbmFtZSBjbGFzaCB3aXRoIHRoZSB2YWxpZ24gYXR0cmlidXRlLgotLS0+Ci08IUVOVElUWSAlIFRGcmFtZSAiKHZvaWR8YWJvdmV8YmVsb3d8aHNpZGVzfGxoc3xyaHN8dnNpZGVzfGJveHxib3JkZXIpIj4KLQotPCEtLQotIFRoZSBydWxlcyBhdHRyaWJ1dGUgZGVmaW5lcyB3aGljaCBydWxlcyB0byBkcmF3IGJldHdlZW4gY2VsbHM6Ci0KLSBJZiBydWxlcyBpcyBhYnNlbnQgdGhlbiBhc3N1bWU6Ci0gICAgICJub25lIiBpZiBib3JkZXIgaXMgYWJzZW50IG9yIGJvcmRlcj0iMCIgb3RoZXJ3aXNlICJhbGwiCi0tLT4KLQotPCFFTlRJVFkgJSBUUnVsZXMgIihub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpIj4KLSAgCi08IS0tIGhvcml6b250YWwgcGxhY2VtZW50IG9mIHRhYmxlIHJlbGF0aXZlIHRvIGRvY3VtZW50IC0tPgotPCFFTlRJVFkgJSBUQWxpZ24gIihsZWZ0fGNlbnRlcnxyaWdodCkiPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMKLQotICBjaGFyICAgICAgICBhbGlnbm1lbnQgY2hhciwgZS5nLiBjaGFyPSc6JwotICBjaGFyb2ZmICAgICBvZmZzZXQgZm9yIGFsaWdubWVudCBjaGFyCi0tLT4KLTwhRU5USVRZICUgY2VsbGhhbGlnbgotICAiYWxpZ24gICAgICAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeXxjaGFyKSAjSU1QTElFRAotICAgY2hhciAgICAgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICAgY2hhcm9mZiAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIHZlcnRpY2FsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzIC0tPgotPCFFTlRJVFkgJSBjZWxsdmFsaWduCi0gICJ2YWxpZ24gICAgICh0b3B8bWlkZGxlfGJvdHRvbXxiYXNlbGluZSkgI0lNUExJRUQiCi0gID4KLQotPCFFTEVNRU5UIHRhYmxlCi0gICAgIChjYXB0aW9uPywgKGNvbCp8Y29sZ3JvdXAqKSwgdGhlYWQ/LCB0Zm9vdD8sICh0Ym9keSt8dHIrKSk+Ci08IUVMRU1FTlQgY2FwdGlvbiAgJUlubGluZTs+Ci08IUVMRU1FTlQgdGhlYWQgICAgKHRyKSs+Ci08IUVMRU1FTlQgdGZvb3QgICAgKHRyKSs+Ci08IUVMRU1FTlQgdGJvZHkgICAgKHRyKSs+Ci08IUVMRU1FTlQgY29sZ3JvdXAgKGNvbCkqPgotPCFFTEVNRU5UIGNvbCAgICAgIEVNUFRZPgotPCFFTEVNRU5UIHRyICAgICAgICh0aHx0ZCkrPgotPCFFTEVNRU5UIHRoICAgICAgICVGbG93Oz4KLTwhRUxFTUVOVCB0ZCAgICAgICAlRmxvdzs+Ci0KLTwhQVRUTElTVCB0YWJsZQotICAlYXR0cnM7Ci0gIHN1bW1hcnkgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIGZyYW1lICAgICAgICVURnJhbWU7ICAgICAgICNJTVBMSUVECi0gIHJ1bGVzICAgICAgICVUUnVsZXM7ICAgICAgICNJTVBMSUVECi0gIGNlbGxzcGFjaW5nICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIGNlbGxwYWRkaW5nICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIGFsaWduICAgICAgICVUQWxpZ247ICAgICAgICNJTVBMSUVECi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTlRJVFkgJSBDQWxpZ24gIih0b3B8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCFBVFRMSVNUIGNhcHRpb24KLSAgJWF0dHJzOwotICBhbGlnbiAgICAgICAlQ0FsaWduOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLWNvbGdyb3VwIGdyb3VwcyBhIHNldCBvZiBjb2wgZWxlbWVudHMuIEl0IGFsbG93cyB5b3UgdG8gZ3JvdXAKLXNldmVyYWwgc2VtYW50aWNhbGx5IHJlbGF0ZWQgY29sdW1ucyB0b2dldGhlci4KLS0tPgotPCFBVFRMSVNUIGNvbGdyb3VwCi0gICVhdHRyczsKLSAgc3BhbiAgICAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVECi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IS0tCi0gY29sIGVsZW1lbnRzIGRlZmluZSB0aGUgYWxpZ25tZW50IHByb3BlcnRpZXMgZm9yIGNlbGxzIGluCi0gb25lIG9yIG1vcmUgY29sdW1ucy4KLQotIFRoZSB3aWR0aCBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1ucywgZS5nLgotCi0gICAgIHdpZHRoPTY0ICAgICAgICB3aWR0aCBpbiBzY3JlZW4gcGl4ZWxzCi0gICAgIHdpZHRoPTAuNSogICAgICByZWxhdGl2ZSB3aWR0aCBvZiAwLjUKLQotIFRoZSBzcGFuIGF0dHJpYnV0ZSBjYXVzZXMgdGhlIGF0dHJpYnV0ZXMgb2Ygb25lCi0gY29sIGVsZW1lbnQgdG8gYXBwbHkgdG8gbW9yZSB0aGFuIG9uZSBjb2x1bW4uCi0tLT4KLTwhQVRUTElTVCBjb2wKLSAgJWF0dHJzOwotICBzcGFuICAgICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhLS0KLSAgICBVc2UgdGhlYWQgdG8gZHVwbGljYXRlIGhlYWRlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgaGVhZGVycyB3aGVuCi0gICAgdGJvZHkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSB0Zm9vdCB0byBkdXBsaWNhdGUgZm9vdGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBmb290ZXJzIHdoZW4KLSAgICB0Ym9keSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIG11bHRpcGxlIHRib2R5IHNlY3Rpb25zIHdoZW4gcnVsZXMgYXJlIG5lZWRlZAotICAgIGJldHdlZW4gZ3JvdXBzIG9mIHRhYmxlIHJvd3MuCi0tLT4KLTwhQVRUTElTVCB0aGVhZAotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IUFUVExJU1QgdGZvb3QKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCFBVFRMSVNUIHRib2R5Ci0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCB0cgotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIFNjb3BlIGlzIHNpbXBsZXIgdGhhbiBoZWFkZXJzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcyAtLT4KLTwhRU5USVRZICUgU2NvcGUgIihyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKSI+Ci0KLTwhLS0gdGggaXMgZm9yIGhlYWRlcnMsIHRkIGZvciBkYXRhIGFuZCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggLS0+Ci0KLTwhQVRUTElTVCB0aAotICAlYXR0cnM7Ci0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVECi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVECi0gIHJvd3NwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICBjb2xzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICBub3dyYXAgICAgICAobm93cmFwKSAgICAgICAjSU1QTElFRAotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhQVRUTElTVCB0ZAotICAlYXR0cnM7Ci0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVECi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVECi0gIHJvd3NwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICBjb2xzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICBub3dyYXAgICAgICAobm93cmFwKSAgICAgICAjSU1QTElFRAotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDExLWZsYXQuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMTEtZmxhdC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYTg1MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMTEtZmxhdC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEzICswLDAgQEAKLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIDEuMSBEVEQgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbDExLmR0ZAotLS0+Ci0KLTwhLS0gWEhUTUwgMS4xIERURAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0KLSAgICAgVGhlIEV4dGVuc2libGUgSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZSAoWEhUTUwpCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bQotICAgICAgICAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUKLSAgICAgICAgIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuCi0gICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhlIFhIVE1MIERURCBhbmQgaXRzIAotICAgICBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSAKLSAgICAgZ3JhbnRlZCBpbiBwZXJwZXR1aXR5LCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCAKLSAgICAgdGhpcyBwYXJhZ3JhcGggYXBwZWFyIGluIGFsbCBjb3BpZXMuICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyAKLSAgICAgcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoZSBEVEQgZm9yIGFueSBwdXJwb3NlLgotCi0gICAgIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzZWQgb3IgaW1wbGllZCB3YXJyYW50eS4KLQotICAgICAgICBBdXRob3I6ICAgICBNdXJyYXkgTS4gQWx0aGVpbSA8YWx0aGVpbUBlbmcuc3VuLmNvbT4KLSAgICAgICAgUmV2aXNpb246ICAgJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQKLQotLS0+Ci08IS0tIFRoaXMgaXMgdGhlIGRyaXZlciBmaWxlIGZvciB2ZXJzaW9uIDEuMSBvZiB0aGUgWEhUTUwgRFRELgotCi0gICAgIFBsZWFzZSB1c2UgdGhpcyBmb3JtYWwgcHVibGljIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgaXQ6Ci0KLSAgICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnZlcnNpb24gICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIiA+Ci0KLTwhLS0gVXNlIHRoaXMgVVJJIHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IG5hbWVzcGFjZToKLQotICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0KLSAgICAgU2VlIHRoZSBRdWFsaWZpZWQgTmFtZXMgbW9kdWxlIGZvciBpbmZvcm1hdGlvbgotICAgICBvbiB0aGUgdXNlIG9mIG5hbWVzcGFjZSBwcmVmaXhlcyBpbiB0aGUgRFRELgotLS0+Ci08IUVOVElUWSAlIE5TLnByZWZpeGVkICJJR05PUkUiID4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ICIiID4KLQotPCEtLSBSZXNlcnZlZCBmb3IgdXNlIHdpdGggdGhlIFhMaW5rIG5hbWVzcGFjZToKLS0tPgotPCFFTlRJVFkgJSBYTElOSy54bWxucyAiIiA+Ci08IUVOVElUWSAlIFhMSU5LLnhtbG5zLmF0dHJpYiAiIiA+Ci0KLTwhLS0gRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgdXNpbmcgWEhUTUwgMS4xIGRpcmVjdGx5LCB1c2UgdGhlIEZQSQotICAgICBpbiB0aGUgRE9DVFlQRSBkZWNsYXJhdGlvbiwgd2l0aCB0aGUgeG1sbnMgYXR0cmlidXRlIG9uIHRoZQotICAgICBkb2N1bWVudCBlbGVtZW50IHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IG5hbWVzcGFjZToKLQotICAgICAgIDw/eG1sIHZlcnNpb249IjEuMCI/PgotICAgICAgIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIgInhodG1sMTEuZHRkIj4KLSAgICAgICA8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgICB4bWw6bGFuZz0iZW4iPgotICAgICAgIC4uLgotICAgICAgIDwvaHRtbD4KLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotLS0+Ci0KLTwhLS0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2Ugd2l0aCBkb2N1bWVudCBwcm9maWxlcyAtLT4KLTwhRU5USVRZICUgWEhUTUwucHJvZmlsZSAgIiIgPgotCi08IS0tIEJpZGlyZWN0aW9uYWwgVGV4dCBmZWF0dXJlcwotICAgICBUaGlzIGZlYXR1cmUtdGVzdCBlbnRpdHkgaXMgdXNlZCB0byBkZWNsYXJlIGVsZW1lbnRzCi0gICAgIGFuZCBhdHRyaWJ1dGVzIHVzZWQgZm9yIGJpZGlyZWN0aW9uYWwgdGV4dCBzdXBwb3J0LgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLmJpZGkgICJJTkNMVURFIiA+Ci0KLTw/ZG9jIHR5cGU9ImRvY3R5cGUiIHJvbGU9InRpdGxlIiB7IFhIVE1MIDEuMSB9ID8+Ci0KLTwhLS0gOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhLS0gUHJlLUZyYW1ld29yayBSZWRlY2xhcmF0aW9uIHBsYWNlaG9sZGVyICAuLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gdGhpcyBzZXJ2ZXMgYXMgYSBsb2NhdGlvbiB0byBpbnNlcnQgbWFya3VwIGRlY2xhcmF0aW9ucwotICAgICBpbnRvIHRoZSBEVEQgcHJpb3IgdG8gdGhlIGZyYW1ld29yayBkZWNsYXJhdGlvbnMuCi0tLT4KLTwhRU5USVRZICUgeGh0bWwtcHJlZnctcmVkZWNsLm1vZHVsZSAiSUdOT1JFIiA+Ci08IVsleGh0bWwtcHJlZnctcmVkZWNsLm1vZHVsZTtbCi0leGh0bWwtcHJlZnctcmVkZWNsLm1vZDsKLTwhLS0gZW5kIG9mIHhodG1sLXByZWZ3LXJlZGVjbC5tb2R1bGUgLS0+XV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtZXZlbnRzLm1vZHVsZSAiSU5DTFVERSIgPgotCi08IS0tIElubGluZSBTdHlsZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWlubHN0eWxlLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWlubHN0eWxlLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWlubHN0eWxlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFN0eWxlIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWlubHN0eWxlLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIElubGluZSBTdHlsZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWlubHN0eWxlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgSW5saW5lIFN0eWxlIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5sc3R5bGUtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW5saW5lIFN0eWxlCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlICdzdHlsZScgYXR0cmlidXRlLCB1c2VkIHRvIHN1cHBvcnQgaW5saW5lCi0gICAgIHN0eWxlIG1hcmt1cC4gVGhpcyBtb2R1bGUgbXVzdCBiZSBpbnN0YW50aWF0ZWQgcHJpb3IgdG8gdGhlIFhIVE1MCi0gICAgIENvbW1vbiBBdHRyaWJ1dGVzIG1vZHVsZSBpbiBvcmRlciB0byBiZSBpbmNsdWRlZCBpbiAlQ29yZS5hdHRyaWI7LgotLS0+Ci0KLTwhRU5USVRZICUgc3R5bGUuYXR0cmliCi0gICAgICJzdHlsZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi0KLTwhRU5USVRZICUgQ29yZS5leHRyYS5hdHRyaWIKLSAgICAgIiVzdHlsZS5hdHRyaWI7IgotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxzdHlsZS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIGRlY2xhcmUgRG9jdW1lbnQgTW9kZWwgbW9kdWxlIGluc3RhbnRpYXRlZCBpbiBmcmFtZXdvcmsKLS0tPgotPCFFTlRJVFkgJSB4aHRtbC1tb2RlbC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIDEuMSBEb2N1bWVudCBNb2RlbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sMTEtbW9kZWwtMS5tb2QiID4KLQotPCEtLSBNb2R1bGFyIEZyYW1ld29yayBNb2R1bGUgKHJlcXVpcmVkKSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1mcmFtZXdvcmsubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtZnJhbWV3b3JrLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWZyYW1ld29yay5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIE1vZHVsYXIgRnJhbWV3b3JrIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWZyYW1ld29yay0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBNb2R1bGFyIEZyYW1ld29yayBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1mcmFtZXdvcmstMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgTW9kdWxhciBGcmFtZXdvcmsgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1mcmFtZXdvcmstMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTW9kdWxhciBGcmFtZXdvcmsKLQotICAgICBUaGlzIHJlcXVpcmVkIG1vZHVsZSBpbnN0YW50aWF0ZXMgdGhlIG1vZHVsZXMgbmVlZGVkCi0gICAgIHRvIHN1cHBvcnQgdGhlIFhIVE1MIG1vZHVsYXJpemF0aW9uIG1vZGVsLCBpbmNsdWRpbmc6Ci0KLSAgICAgICAgKyAgbm90YXRpb25zCi0gICAgICAgICsgIGRhdGF0eXBlcwotICAgICAgICArICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzCi0gICAgICAgICsgIGNvbW1vbiBhdHRyaWJ1dGVzCi0gICAgICAgICsgIGRvY3VtZW50IG1vZGVsCi0gICAgICAgICsgIGNoYXJhY3RlciBlbnRpdGllcwotCi0gICAgIFRoZSBJbnRyaW5zaWMgRXZlbnRzIG1vZHVsZSBpcyBpZ25vcmVkIGJ5IGRlZmF1bHQgYnV0Ci0gICAgIG9jY3VycyBpbiB0aGlzIG1vZHVsZSBiZWNhdXNlIGl0IG11c3QgYmUgaW5zdGFudGlhdGVkCi0gICAgIHByaW9yIHRvIEF0dHJpYnV0ZXMgYnV0IGFmdGVyIERhdGF0eXBlcy4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWFyY2gubW9kdWxlICJJR05PUkUiID4KLTwhWyV4aHRtbC1hcmNoLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWFyY2gubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEFyY2hpdGVjdHVyZSAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWFyY2gtMS5tb2QiID4KLSV4aHRtbC1hcmNoLm1vZDtdXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ub3RhdGlvbnMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbm90YXRpb25zLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLW5vdGF0aW9ucy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OUyBYSFRNTCBOb3RhdGlvbnMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ub3RhdGlvbnMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTm90YXRpb25zIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbm90YXRpb25zLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT05TIFhIVE1MIE5vdGF0aW9ucyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW5vdGF0aW9ucy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBOb3RhdGlvbnMKLQotICAgICBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgbm90YXRpb25zLCBtYW55IG9mIHRoZXNlIGltcG9ydGVkIGZyb20KLSAgICAgb3RoZXIgc3BlY2lmaWNhdGlvbnMgYW5kIHN0YW5kYXJkcy4gV2hlbiBhbiBleGlzdGluZyBGUEkgaXMKLSAgICAga25vd24sIGl0IGlzIGluY29ycG9yYXRlZCBoZXJlLgotLS0+Ci0KLTwhLS0gWE1MIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBTR01MIGFuZCBYTUwgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVzNDIFhNTCAxLjAgUmVjb21tZW5kYXRpb24gLS0+Ci08IU5PVEFUSU9OIHczYy14bWwKLSAgICAgUFVCTElDICJJU08gODg3OS8vTk9UQVRJT04gRXh0ZW5zaWJsZSBNYXJrdXAgTGFuZ3VhZ2UgKFhNTCkgMS4wLy9FTiIgPgotCi08IS0tIFhNTCAxLjAgQ0RBVEEgLS0+Ci08IU5PVEFUSU9OIGNkYXRhCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYTUwgMS4wOiBDREFUQS8vRU4iID4KLQotPCEtLSBTR01MIEZvcm1hbCBQdWJsaWMgSWRlbnRpZmllcnMgLS0+Ci08IU5PVEFUSU9OIGZwaQotICAgICBQVUJMSUMgIklTTyA4ODc5OjE5ODYvL05PVEFUSU9OIEZvcm1hbCBQdWJsaWMgSWRlbnRpZmllci8vRU4iID4KLQotPCEtLSBYSFRNTCBOb3RhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTGVuZ3RoIGRlZmluZWQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotCi08IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhTk9UQVRJT04gbGVuZ3RoCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBMZW5ndGgvL0VOIiA+Ci0KLTwhLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcyAtLT4KLTwhTk9UQVRJT04gbGlua1R5cGVzCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBMaW5rVHlwZXMvL0VOIiA+Ci0KLTwhLS0gc2luZ2xlIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIGRlc2NyaXB0b3JzIC0tPgotPCFOT1RBVElPTiBtZWRpYURlc2MKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IE1lZGlhRGVzYy8vRU4iID4KLQotPCEtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci08IU5PVEFUSU9OIG11bHRpTGVuZ3RoCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBNdWx0aUxlbmd0aC8vRU4iID4KLQotPCEtLSBvbmUgb3IgbW9yZSBkaWdpdHMgKE5VTUJFUikgLS0+Ci08IU5PVEFUSU9OIG51bWJlcgotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTnVtYmVyLy9FTiIgPgotCi08IS0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci08IU5PVEFUSU9OIHBpeGVscwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogUGl4ZWxzLy9FTiIgPgotCi08IS0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotPCFOT1RBVElPTiBzY3JpcHQKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFNjcmlwdC8vRU4iID4KLQotPCEtLSB0ZXh0dWFsIGNvbnRlbnQgLS0+Ci08IU5PVEFUSU9OIHRleHQKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFRleHQvL0VOIiA+Ci0KLTwhLS0gSW1wb3J0ZWQgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gLS0+Ci08IU5PVEFUSU9OIGNoYXJhY3RlcgotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ2hhcmFjdGVyLy9FTiIgPgotCi08IS0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjaGFyc2V0Ci0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDaGFyc2V0Ly9FTiIgPgotCi08IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY2hhcnNldHMKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENoYXJzZXRzLy9FTiIgPgotCi08IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNvbnRlbnRUeXBlCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDb250ZW50VHlwZS8vRU4iID4KLQotPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY29udGVudFR5cGVzCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDb250ZW50VHlwZXMvL0VOIiA+Ci0KLTwhLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotPCFOT1RBVElPTiBkYXRldGltZQotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogRGF0ZXRpbWUvL0VOIiA+Ci0KLTwhLS0gYSBsYW5ndWFnZSBjb2RlLCBhcyBwZXIgW1JGQzMwNjZdIC0tPgotPCFOT1RBVElPTiBsYW5ndWFnZUNvZGUKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IExhbmd1YWdlQ29kZS8vRU4iID4KLQotPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtVUkldIC0tPgotPCFOT1RBVElPTiB1cmkKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFVSSS8vRU4iID4KLQotPCEtLSBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMsIHNlZSBbVVJJXSAtLT4KLTwhTk9UQVRJT04gdXJpcwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogVVJJcy8vRU4iID4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbm90YXRpb25zLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtZGF0YXR5cGVzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWRhdGF0eXBlcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1kYXRhdHlwZXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBEYXRhdHlwZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1kYXRhdHlwZXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRGF0YXR5cGVzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtZGF0YXR5cGVzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIERhdGF0eXBlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWRhdGF0eXBlcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBEYXRhdHlwZXMKLQotICAgICBkZWZpbmVzIGNvbnRhaW5lcnMgZm9yIHRoZSBmb2xsb3dpbmcgZGF0YXR5cGVzLCBtYW55IG9mCi0gICAgIHRoZXNlIGltcG9ydGVkIGZyb20gb3RoZXIgc3BlY2lmaWNhdGlvbnMgYW5kIHN0YW5kYXJkcy4KLS0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGZvciBjZWxscGFkZGluZy9jZWxsc3BhY2luZyAtLT4KLQotPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIExlbmd0aC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzIC0tPgotPCFFTlRJVFkgJSBMaW5rVHlwZXMuZGF0YXR5cGUgIk5NVE9LRU5TIiA+Ci0KLTwhLS0gc2luZ2xlIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIGRlc2NyaXB0b3JzIC0tPgotPCFFTlRJVFkgJSBNZWRpYURlc2MuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBvbmUgb3IgbW9yZSBkaWdpdHMgKE5VTUJFUikgLS0+Ci08IUVOVElUWSAlIE51bWJlci5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotPCFFTlRJVFkgJSBQaXhlbHMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci08IUVOVElUWSAlIFNjcmlwdC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSB0ZXh0dWFsIGNvbnRlbnQgLS0+Ci08IUVOVElUWSAlIFRleHQuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gSW1wb3J0ZWQgRGF0YXR5cGVzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gLS0+Ci08IUVOVElUWSAlIENoYXJhY3Rlci5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ2hhcnNldC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENoYXJzZXRzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENvbnRlbnRUeXBlLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDb250ZW50VHlwZXMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotPCFFTlRJVFkgJSBEYXRldGltZS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBmb3JtYWwgcHVibGljIGlkZW50aWZpZXIsIGFzIHBlciBbSVNPODg3OV0gLS0+Ci08IUVOVElUWSAlIEZQSS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMzA2Nl0gLS0+Ci08IUVOVElUWSAlIExhbmd1YWdlQ29kZS5kYXRhdHlwZSAiTk1UT0tFTiIgPgotCi08IS0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLCBzZWUgW1VSSV0gLS0+Ci08IUVOVElUWSAlIFVSSS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMsIHNlZSBbVVJJXSAtLT4KLTwhRU5USVRZICUgVVJJcy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBlbmQgb2YgeGh0bWwtZGF0YXR5cGVzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gcGxhY2Vob2xkZXIgZm9yIFhMaW5rIHN1cHBvcnQgbW9kdWxlIC0tPgotPCFFTlRJVFkgJSB4aHRtbC14bGluay5tb2QgIiIgPgotCi0KLTwhRU5USVRZICUgeGh0bWwtcW5hbWUubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtcW5hbWUubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtcW5hbWUubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBRdWFsaWZpZWQgTmFtZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1xbmFtZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgUW5hbWUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXFuYW1lLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIFF1YWxpZmllZCBOYW1lcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXFuYW1lLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSMyMDAwLTEwLTIyOiBhZGRlZCBxbmFtZSBkZWNsYXJhdGlvbnMgZm9yIHJ1YnkgZWxlbWVudHMKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gWEhUTUwgUW5hbWUgKFF1YWxpZmllZCBOYW1lKSBNb2R1bGUKLQotICAgICBUaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdHdvIHBhcnRzLCBsYWJlbGVkIFNlY3Rpb24gJ0EnIGFuZCAnQic6Ci0KLSAgICAgICBTZWN0aW9uIEEgZGVjbGFyZXMgcGFyYW1ldGVyIGVudGl0aWVzIHRvIHN1cHBvcnQgbmFtZXNwYWNlLQotICAgICAgIHF1YWxpZmllZCBuYW1lcywgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucywgYW5kIG5hbWUgcHJlZml4aW5nCi0gICAgICAgZm9yIFhIVE1MIGFuZCBleHRlbnNpb25zLgotCi0gICAgICAgU2VjdGlvbiBCIGRlY2xhcmVzIHBhcmFtZXRlciBlbnRpdGllcyB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzIGZvciBhbGwgWEhUTUwgZWxlbWVudCB0eXBlczoKLQotICAgICAgICAgJWFwcGxldC5xbmFtZTsgICB0aGUgeG1sbnMtcXVhbGlmaWVkIG5hbWUgZm9yIDxhcHBsZXQ+Ci0gICAgICAgICAlYmFzZS5xbmFtZTsgICAgIHRoZSB4bWxucy1xdWFsaWZpZWQgbmFtZSBmb3IgPGJhc2U+Ci0gICAgICAgICAuLi4KLQotICAgICBYSFRNTCBleHRlbnNpb25zIHdvdWxkIGNyZWF0ZSBhIG1vZHVsZSBzaW1pbGFyIHRvIHRoaXMgb25lLgotICAgICBJbmNsdWRlZCBpbiB0aGUgWEhUTUwgZGlzdHJpYnV0aW9uIGlzIGEgdGVtcGxhdGUgbW9kdWxlCi0gICAgICgndGVtcGxhdGUtcW5hbWUtMS5tb2QnKSBzdWl0YWJsZSBmb3IgdGhpcyBwdXJwb3NlLgotLS0+Ci0KLTwhLS0gU2VjdGlvbiBBOiBYSFRNTCBYTUwgTmFtZXNwYWNlIEZyYW1ld29yayA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCEtLSAxLiBEZWNsYXJlIGEgJVhIVE1MLnByZWZpeGVkOyBjb25kaXRpb25hbCBzZWN0aW9uIGtleXdvcmQsIHVzZWQKLSAgICAgICAgdG8gYWN0aXZhdGUgbmFtZXNwYWNlIHByZWZpeGluZy4gVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkCi0gICAgICAgIGluaGVyaXQgJyVOUy5wcmVmaXhlZDsnIGZyb20gdGhlIERURCBkcml2ZXIsIHNvIHRoYXQgdW5sZXNzCi0gICAgICAgIG92ZXJyaWRkZW4sIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb2xsb3dzIHRoZSBvdmVyYWxsIERURAotICAgICAgICBwcmVmaXhpbmcgc2NoZW1lLgotLS0+Ci08IUVOVElUWSAlIE5TLnByZWZpeGVkICJJR05PUkUiID4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ZWQgIiVOUy5wcmVmaXhlZDsiID4KLQotPCEtLSAyLiBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAoZWcuLCAlWEhUTUwueG1sbnM7KSBjb250YWluaW5nCi0gICAgICAgIHRoZSBVUkkgcmVmZXJlbmNlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIFhIVE1MIG5hbWVzcGFjZToKLS0tPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucyAgImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiID4KLQotPCEtLSAzLiBEZWNsYXJlIHBhcmFtZXRlciBlbnRpdGllcyAoZWcuLCAlWEhUTUwucHJlZml4OykgY29udGFpbmluZwotICAgICAgICB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcHJlZml4IHN0cmluZyhzKSB0byB1c2Ugd2hlbiBwcmVmaXhpbmcKLSAgICAgICAgaXMgZW5hYmxlZC4gVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBpbiB0aGUgRFREIGRyaXZlciBvciB0aGUKLSAgICAgICAgaW50ZXJuYWwgc3Vic2V0IG9mIGFuIGRvY3VtZW50IGluc3RhbmNlLiBJZiBubyBkZWZhdWx0IHByZWZpeAotICAgICAgICBpcyBkZXNpcmVkLCB0aGlzIG1heSBiZSBkZWNsYXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuCi0KLSAgICAgTk9URTogQXMgc3BlY2lmaWVkIGluIFtYTUxOQU1FU10sIHRoZSBuYW1lc3BhY2UgcHJlZml4IHNlcnZlcwotICAgICBhcyBhIHByb3h5IGZvciB0aGUgVVJJIHJlZmVyZW5jZSwgYW5kIGlzIG5vdCBpbiBpdHNlbGYgc2lnbmlmaWNhbnQuCi0tLT4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ICAiIiA+Ci0KLTwhLS0gNC4gRGVjbGFyZSBwYXJhbWV0ZXIgZW50aXRpZXMgKGVnLiwgJVhIVE1MLnBmeDspIGNvbnRhaW5pbmcgdGhlCi0gICAgICAgIGNvbG9uaXplZCBwcmVmaXgoZXMpIChlZy4sICclWEhUTUwucHJlZml4OzonKSB1c2VkIHdoZW4KLSAgICAgICAgcHJlZml4aW5nIGlzIGFjdGl2ZSwgYW4gZW1wdHkgc3RyaW5nIHdoZW4gaXQgaXMgbm90LgotLS0+Ci08IVslWEhUTUwucHJlZml4ZWQ7WwotPCFFTlRJVFkgJSBYSFRNTC5wZnggICIlWEhUTUwucHJlZml4OzoiID4KLV1dPgotPCFFTlRJVFkgJSBYSFRNTC5wZnggICIiID4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBuYW1lIGV4dGVuc2lvbnMgaGVyZSAuLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXFuYW1lLWV4dHJhLm1vZCAiIiA+Ci0KLQotPCEtLSA1LiBUaGUgcGFyYW1ldGVyIGVudGl0eSAlWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliOyBtYXkgYmUKLSAgICAgICAgcmVkZWNsYXJlZCB0byBjb250YWluIGFueSBub24tWEhUTUwgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0gICAgICAgIGF0dHJpYnV0ZXMgZm9yIG5hbWVzcGFjZXMgZW1iZWRkZWQgaW4gWEhUTUwuIFRoZSBkZWZhdWx0Ci0gICAgICAgIGlzIGFuIGVtcHR5IHN0cmluZy4gIFhMaW5rIHNob3VsZCBiZSBpbmNsdWRlZCBoZXJlIGlmIHVzZWQKLSAgICAgICAgaW4gdGhlIERURC4KLS0tPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucy5leHRyYS5hdHRyaWIgIiIgPgotCi08IS0tIFRoZSByZW1haW5kZXIgb2YgU2VjdGlvbiBBIGlzIG9ubHkgZm9sbG93ZWQgaW4gWEhUTUwsIG5vdCBleHRlbnNpb25zLiAtLT4KLQotPCEtLSBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAlTlMuZGVjbC5hdHRyaWI7IGNvbnRhaW5pbmcKLSAgICAgYWxsIFhNTCBOYW1lc3BhY2UgZGVjbGFyYXRpb25zIHVzZWQgaW4gdGhlIERURCwgcGx1cyB0aGUKLSAgICAgeG1sbnMgZGVjbGFyYXRpb24gZm9yIFhIVE1MLCBpdHMgZm9ybSBkZXBlbmRlbnQgb24gd2hldGhlcgotICAgICBwcmVmaXhpbmcgaXMgYWN0aXZlLgotLS0+Ci08IVslWEhUTUwucHJlZml4ZWQ7WwotPCFFTlRJVFkgJSBOUy5kZWNsLmF0dHJpYgotICAgICAieG1sbnM6JVhIVE1MLnByZWZpeDsgICVVUkkuZGF0YXR5cGU7ICAgI0ZJWEVEICclWEhUTUwueG1sbnM7JwotICAgICAgJVhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYjsiCi0+Ci1dXT4KLTwhRU5USVRZICUgTlMuZGVjbC5hdHRyaWIKLSAgICAgIiVYSFRNTC54bWxucy5leHRyYS5hdHRyaWI7IgotPgotCi08IS0tIFRoaXMgaXMgYSBwbGFjZWhvbGRlciBmb3IgZnV0dXJlIFhMaW5rIHN1cHBvcnQuCi0tLT4KLTwhRU5USVRZICUgWExJTksueG1sbnMuYXR0cmliICIiID4KLQotPCEtLSBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAlTlMuZGVjbC5hdHRyaWI7IGNvbnRhaW5pbmcgYWxsCi0gICAgIFhNTCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXR0cmlidXRlcyB1c2VkIGJ5IFhIVE1MLCBpbmNsdWRpbmcKLSAgICAgYSBkZWZhdWx0IHhtbG5zIGF0dHJpYnV0ZSB3aGVuIHByZWZpeGluZyBpcyBpbmFjdGl2ZS4KLS0tPgotPCFbJVhIVE1MLnByZWZpeGVkO1sKLTwhRU5USVRZICUgWEhUTUwueG1sbnMuYXR0cmliCi0gICAgICIlTlMuZGVjbC5hdHRyaWI7Ci0gICAgICAlWExJTksueG1sbnMuYXR0cmliOyIKLT4KLV1dPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucy5hdHRyaWIKLSAgICAgInhtbG5zICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0ZJWEVEICclWEhUTUwueG1sbnM7JwotICAgICAgJVhMSU5LLnhtbG5zLmF0dHJpYjsiCi0+Ci0KLTwhLS0gcGxhY2Vob2xkZXIgZm9yIHF1YWxpZmllZCBuYW1lIHJlZGVjbGFyYXRpb25zIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS5yZWRlY2wgIiIgPgotCi0KLTwhLS0gU2VjdGlvbiBCOiBYSFRNTCBRdWFsaWZpZWQgTmFtZXMgOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhLS0gNi4gVGhpcyBzZWN0aW9uIGRlY2xhcmVzIHBhcmFtZXRlciBlbnRpdGllcyB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICAgbmFtZXNwYWNlLXF1YWxpZmllZCBuYW1lcyBmb3IgYWxsIFhIVE1MIGVsZW1lbnQgdHlwZXMuCi0tLT4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1hcHBsZXQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGFwcGxldC5xbmFtZSAgIiVYSFRNTC5wZng7YXBwbGV0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmFzZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgYmFzZS5xbmFtZSAgICAiJVhIVE1MLnBmeDtiYXNlIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmRvLTEubW9kIC0tPgotPCFFTlRJVFkgJSBiZG8ucW5hbWUgICAgICIlWEhUTUwucGZ4O2JkbyIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJsa3BocmFzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBhZGRyZXNzLnFuYW1lICIlWEhUTUwucGZ4O2FkZHJlc3MiID4KLTwhRU5USVRZICUgYmxvY2txdW90ZS5xbmFtZSAgIiVYSFRNTC5wZng7YmxvY2txdW90ZSIgPgotPCFFTlRJVFkgJSBwcmUucW5hbWUgICAgICIlWEhUTUwucGZ4O3ByZSIgPgotPCFFTlRJVFkgJSBoMS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2gxIiA+Ci08IUVOVElUWSAlIGgyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDIiID4KLTwhRU5USVRZICUgaDMucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoMyIgPgotPCFFTlRJVFkgJSBoNC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2g0IiA+Ci08IUVOVElUWSAlIGg1LnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDUiID4KLTwhRU5USVRZICUgaDYucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoNiIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJsa3ByZXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGhyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aHIiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGRpdi5xbmFtZSAgICAgIiVYSFRNTC5wZng7ZGl2IiA+Ci08IUVOVElUWSAlIHAucW5hbWUgICAgICAgIiVYSFRNTC5wZng7cCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWVkaXQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGlucy5xbmFtZSAgICAgIiVYSFRNTC5wZng7aW5zIiA+Ci08IUVOVElUWSAlIGRlbC5xbmFtZSAgICAgIiVYSFRNTC5wZng7ZGVsIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtZm9ybS0xLm1vZCAtLT4KLTwhRU5USVRZICUgZm9ybS5xbmFtZSAgICAiJVhIVE1MLnBmeDtmb3JtIiA+Ci08IUVOVElUWSAlIGxhYmVsLnFuYW1lICAgIiVYSFRNTC5wZng7bGFiZWwiID4KLTwhRU5USVRZICUgaW5wdXQucW5hbWUgICAiJVhIVE1MLnBmeDtpbnB1dCIgPgotPCFFTlRJVFkgJSBzZWxlY3QucW5hbWUgICIlWEhUTUwucGZ4O3NlbGVjdCIgPgotPCFFTlRJVFkgJSBvcHRncm91cC5xbmFtZSAgIiVYSFRNTC5wZng7b3B0Z3JvdXAiID4KLTwhRU5USVRZICUgb3B0aW9uLnFuYW1lICAiJVhIVE1MLnBmeDtvcHRpb24iID4KLTwhRU5USVRZICUgdGV4dGFyZWEucW5hbWUgICIlWEhUTUwucGZ4O3RleHRhcmVhIiA+Ci08IUVOVElUWSAlIGZpZWxkc2V0LnFuYW1lICAiJVhIVE1MLnBmeDtmaWVsZHNldCIgPgotPCFFTlRJVFkgJSBsZWdlbmQucW5hbWUgICIlWEhUTUwucGZ4O2xlZ2VuZCIgPgotPCFFTlRJVFkgJSBidXR0b24ucW5hbWUgICIlWEhUTUwucGZ4O2J1dHRvbiIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWh5cGVydGV4dC0xLm1vZCAtLT4KLTwhRU5USVRZICUgYS5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDthIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW1hZ2UtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGltZy5xbmFtZSAgICAgIiVYSFRNTC5wZng7aW1nIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW5scGhyYXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGFiYnIucW5hbWUgICAgIiVYSFRNTC5wZng7YWJiciIgPgotPCFFTlRJVFkgJSBhY3JvbnltLnFuYW1lICIlWEhUTUwucGZ4O2Fjcm9ueW0iID4KLTwhRU5USVRZICUgY2l0ZS5xbmFtZSAgICAiJVhIVE1MLnBmeDtjaXRlIiA+Ci08IUVOVElUWSAlIGNvZGUucW5hbWUgICAgIiVYSFRNTC5wZng7Y29kZSIgPgotPCFFTlRJVFkgJSBkZm4ucW5hbWUgICAgICIlWEhUTUwucGZ4O2RmbiIgPgotPCFFTlRJVFkgJSBlbS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2VtIiA+Ci08IUVOVElUWSAlIGtiZC5xbmFtZSAgICAgIiVYSFRNTC5wZng7a2JkIiA+Ci08IUVOVElUWSAlIHEucW5hbWUgICAgICAgIiVYSFRNTC5wZng7cSIgPgotPCFFTlRJVFkgJSBzYW1wLnFuYW1lICAgICIlWEhUTUwucGZ4O3NhbXAiID4KLTwhRU5USVRZICUgc3Ryb25nLnFuYW1lICAiJVhIVE1MLnBmeDtzdHJvbmciID4KLTwhRU5USVRZICUgdmFyLnFuYW1lICAgICAiJVhIVE1MLnBmeDt2YXIiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbmxwcmVzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBiLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O2IiID4KLTwhRU5USVRZICUgYmlnLnFuYW1lICAgICAiJVhIVE1MLnBmeDtiaWciID4KLTwhRU5USVRZICUgaS5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtpIiA+Ci08IUVOVElUWSAlIHNtYWxsLnFuYW1lICAgIiVYSFRNTC5wZng7c21hbGwiID4KLTwhRU5USVRZICUgc3ViLnFuYW1lICAgICAiJVhIVE1MLnBmeDtzdWIiID4KLTwhRU5USVRZICUgc3VwLnFuYW1lICAgICAiJVhIVE1MLnBmeDtzdXAiID4KLTwhRU5USVRZICUgdHQucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0dCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlubHN0cnVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgYnIucW5hbWUgICAgICAiJVhIVE1MLnBmeDticiIgPgotPCFFTlRJVFkgJSBzcGFuLnFuYW1lICAgICIlWEhUTUwucGZ4O3NwYW4iID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pc21hcC0xLm1vZCAoYWxzbyBjc2lzbWFwLCBzc2lzbWFwKSAtLT4KLTwhRU5USVRZICUgbWFwLnFuYW1lICAgICAiJVhIVE1MLnBmeDttYXAiID4KLTwhRU5USVRZICUgYXJlYS5xbmFtZSAgICAiJVhIVE1MLnBmeDthcmVhIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtbGluay0xLm1vZCAtLT4KLTwhRU5USVRZICUgbGluay5xbmFtZSAgICAiJVhIVE1MLnBmeDtsaW5rIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtbGlzdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgZGwucW5hbWUgICAgICAiJVhIVE1MLnBmeDtkbCIgPgotPCFFTlRJVFkgJSBkdC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2R0IiA+Ci08IUVOVElUWSAlIGRkLnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZGQiID4KLTwhRU5USVRZICUgb2wucW5hbWUgICAgICAiJVhIVE1MLnBmeDtvbCIgPgotPCFFTlRJVFkgJSB1bC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3VsIiA+Ci08IUVOVElUWSAlIGxpLnFuYW1lICAgICAgIiVYSFRNTC5wZng7bGkiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1tZXRhLTEubW9kIC0tPgotPCFFTlRJVFkgJSBtZXRhLnFuYW1lICAgICIlWEhUTUwucGZ4O21ldGEiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1wYXJhbS0xLm1vZCAtLT4KLTwhRU5USVRZICUgcGFyYW0ucW5hbWUgICAiJVhIVE1MLnBmeDtwYXJhbSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLW9iamVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgb2JqZWN0LnFuYW1lICAiJVhIVE1MLnBmeDtvYmplY3QiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1zY3JpcHQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIHNjcmlwdC5xbmFtZSAgIiVYSFRNTC5wZng7c2NyaXB0IiA+Ci08IUVOVElUWSAlIG5vc2NyaXB0LnFuYW1lICAiJVhIVE1MLnBmeDtub3NjcmlwdCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXN0cnVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgaHRtbC5xbmFtZSAgICAiJVhIVE1MLnBmeDtodG1sIiA+Ci08IUVOVElUWSAlIGhlYWQucW5hbWUgICAgIiVYSFRNTC5wZng7aGVhZCIgPgotPCFFTlRJVFkgJSB0aXRsZS5xbmFtZSAgICIlWEhUTUwucGZ4O3RpdGxlIiA+Ci08IUVOVElUWSAlIGJvZHkucW5hbWUgICAgIiVYSFRNTC5wZng7Ym9keSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXN0eWxlLTEubW9kIC0tPgotPCFFTlRJVFkgJSBzdHlsZS5xbmFtZSAgICIlWEhUTUwucGZ4O3N0eWxlIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtdGFibGUtMS5tb2QgLS0+Ci08IUVOVElUWSAlIHRhYmxlLnFuYW1lICAgIiVYSFRNTC5wZng7dGFibGUiID4KLTwhRU5USVRZICUgY2FwdGlvbi5xbmFtZSAiJVhIVE1MLnBmeDtjYXB0aW9uIiA+Ci08IUVOVElUWSAlIHRoZWFkLnFuYW1lICAgIiVYSFRNTC5wZng7dGhlYWQiID4KLTwhRU5USVRZICUgdGZvb3QucW5hbWUgICAiJVhIVE1MLnBmeDt0Zm9vdCIgPgotPCFFTlRJVFkgJSB0Ym9keS5xbmFtZSAgICIlWEhUTUwucGZ4O3Rib2R5IiA+Ci08IUVOVElUWSAlIGNvbGdyb3VwLnFuYW1lICAiJVhIVE1MLnBmeDtjb2xncm91cCIgPgotPCFFTlRJVFkgJSBjb2wucW5hbWUgICAgICIlWEhUTUwucGZ4O2NvbCIgPgotPCFFTlRJVFkgJSB0ci5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3RyIiA+Ci08IUVOVElUWSAlIHRoLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dGgiID4KLTwhRU5USVRZICUgdGQucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0ZCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXJ1YnktMS5tb2QgLS0+Ci0KLTwhRU5USVRZICUgcnVieS5xbmFtZSAgICAiJVhIVE1MLnBmeDtydWJ5IiA+Ci08IUVOVElUWSAlIHJiYy5xbmFtZSAgICAgIiVYSFRNTC5wZng7cmJjIiA+Ci08IUVOVElUWSAlIHJ0Yy5xbmFtZSAgICAgIiVYSFRNTC5wZng7cnRjIiA+Ci08IUVOVElUWSAlIHJiLnFuYW1lICAgICAgIiVYSFRNTC5wZng7cmIiID4KLTwhRU5USVRZICUgcnQucW5hbWUgICAgICAiJVhIVE1MLnBmeDtydCIgPgotPCFFTlRJVFkgJSBycC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3JwIiA+Ci0KLTwhLS0gUHJvdmlzaW9uYWwgWEhUTUwgMi4wIFF1YWxpZmllZCBOYW1lcyAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbWFnZS0yLm1vZCAtLT4KLTwhRU5USVRZICUgYWx0LnFuYW1lICAgICAiJVhIVE1MLnBmeDthbHQiID4KLQotPCEtLSBlbmQgb2YgeGh0bWwtcW5hbWUtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ldmVudHMubW9kdWxlICJJR05PUkUiID4KLTwhWyV4aHRtbC1ldmVudHMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtZXZlbnRzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgSW50cmluc2ljIEV2ZW50cyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWV2ZW50cy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbnRyaW5zaWMgRXZlbnRzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ldmVudHMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgSW50cmluc2ljIEV2ZW50cyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWV2ZW50cy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbnRyaW5zaWMgRXZlbnQgQXR0cmlidXRlcwotCi0gICAgIFRoZXNlIGFyZSB0aGUgZXZlbnQgYXR0cmlidXRlcyBkZWZpbmVkIGluIEhUTUwgNC4wLAotICAgICBTZWN0aW9uIDE4LjIuMyAiSW50cmluc2ljIEV2ZW50cyIuIFRoaXMgbW9kdWxlIG11c3QgYmUKLSAgICAgaW5zdGFudGlhdGVkIHByaW9yIHRvIHRoZSBBdHRyaWJ1dGVzIE1vZHVsZSBidXQgYWZ0ZXIKLSAgICAgdGhlIERhdGF0eXBlIE1vZHVsZSBpbiB0aGUgTW9kdWxhciBGcmFtZXdvcmsgbW9kdWxlLgotCi0gICAgIk5vdGU6IEF1dGhvcnMgb2YgSFRNTCBkb2N1bWVudHMgYXJlIGFkdmlzZWQgdGhhdCBjaGFuZ2VzCi0gICAgIGFyZSBsaWtlbHkgdG8gb2NjdXIgaW4gdGhlIHJlYWxtIG9mIGludHJpbnNpYyBldmVudHMKLSAgICAgKGUuZy4sIGhvdyBzY3JpcHRzIGFyZSBib3VuZCB0byBldmVudHMpLiBSZXNlYXJjaCBpbgotICAgICB0aGlzIHJlYWxtIGlzIGNhcnJpZWQgb24gYnkgbWVtYmVycyBvZiB0aGUgVzNDIERvY3VtZW50Ci0gICAgIE9iamVjdCBNb2RlbCBXb3JraW5nIEdyb3VwIChzZWUgdGhlIFczQyBXZWIgc2l0ZSBhdAotICAgICBodHRwOi8vd3d3LnczLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb24pLiIKLS0tPgotPCEtLSBOT1RFOiBCZWNhdXNlIHRoZSBBVFRMSVNUIGRlY2xhcmF0aW9ucyBpbiB0aGlzIG1vZHVsZSBvY2N1cgotICAgICBiZWZvcmUgdGhlaXIgcmVzcGVjdGl2ZSBFTEVNRU5UIGRlY2xhcmF0aW9ucyBpbiBvdGhlcgotICAgICBtb2R1bGVzLCB0aGVyZSBtYXkgYmUgYSBkZXBlbmRlbmN5IG9uIHRoaXMgbW9kdWxlIHRoYXQKLSAgICAgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaWYgYW55IG9mIHRoZSBwYXJhbWV0ZXIgZW50aXRpZXMgdXNlZAotICAgICBmb3IgZWxlbWVudCB0eXBlIG5hbWVzIChlZy4sICVhLnFuYW1lOykgYXJlIHJlZGVjbGFyZWQuCi0tLT4KLQotPCFFTlRJVFkgJSBFdmVudHMuYXR0cmliCi0gICAgICJvbmNsaWNrICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmRibGNsaWNrICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbm1vdXNlZG93biAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbm1vdXNldXAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbm1vdXNlb3ZlciAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbm1vdXNlbW92ZSAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbm1vdXNlb3V0ICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmtleXByZXNzICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmtleWRvd24gICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmtleXVwICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBvbiBhbmNob3IgZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJWEucW5hbWU7Ci0gICAgIG9uZm9jdXMgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgICNJTVBMSUVECi0gICAgIG9uYmx1ciAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gYWRkaXRpb25hbCBhdHRyaWJ1dGVzIG9uIGZvcm0gZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJWZvcm0ucW5hbWU7Ci0gICAgICBvbnN1Ym1pdCAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbnJlc2V0ICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gYWRkaXRpb25hbCBhdHRyaWJ1dGVzIG9uIGxhYmVsIGVsZW1lbnQKLS0tPgotPCFBVFRMSVNUICVsYWJlbC5xbmFtZTsKLSAgICAgIG9uZm9jdXMgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uYmx1ciAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgb24gaW5wdXQgZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJWlucHV0LnFuYW1lOwotICAgICAgb25mb2N1cyAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25ibHVyICAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25zZWxlY3QgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25jaGFuZ2UgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBvbiBzZWxlY3QgZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJXNlbGVjdC5xbmFtZTsKLSAgICAgIG9uZm9jdXMgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uYmx1ciAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uY2hhbmdlICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgb24gdGV4dGFyZWEgZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJXRleHRhcmVhLnFuYW1lOwotICAgICAgb25mb2N1cyAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25ibHVyICAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25zZWxlY3QgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25jaGFuZ2UgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBvbiBidXR0b24gZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJWJ1dHRvbi5xbmFtZTsKLSAgICAgIG9uZm9jdXMgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uYmx1ciAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgb24gYm9keSBlbGVtZW50Ci0tLT4KLTwhQVRUTElTVCAlYm9keS5xbmFtZTsKLSAgICAgIG9ubG9hZCAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9udW5sb2FkICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgb24gYXJlYSBlbGVtZW50Ci0tLT4KLTwhQVRUTElTVCAlYXJlYS5xbmFtZTsKLSAgICAgIG9uZm9jdXMgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uYmx1ciAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtZXZlbnRzLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYXR0cmlicy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1hdHRyaWJzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWF0dHJpYnMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDb21tb24gQXR0cmlidXRlcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWF0dHJpYnMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQ29tbW9uIEF0dHJpYnV0ZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYXR0cmlicy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDb21tb24gQXR0cmlidXRlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWF0dHJpYnMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQ29tbW9uIEF0dHJpYnV0ZXMKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyBtYW55IG9mIHRoZSBjb21tb24gYXR0cmlidXRlcyBmb3IgdGhlIFhIVE1MIERURC4KLSAgICAgJU5TLmRlY2wuYXR0cmliOyBpcyBkZWNsYXJlZCBpbiB0aGUgWEhUTUwgUW5hbWUgbW9kdWxlLgotLS0+Ci0KLTwhRU5USVRZICUgaWQuYXR0cmliCi0gICAgICJpZCAgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIGNsYXNzLmF0dHJpYgotICAgICAiY2xhc3MgICAgICAgIE5NVE9LRU5TICAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSB0aXRsZS5hdHRyaWIKLSAgICAgInRpdGxlICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgQ29yZS5leHRyYS5hdHRyaWIgIiIgPgotCi08IUVOVElUWSAlIENvcmUuYXR0cmliCi0gICAgICIlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJWlkLmF0dHJpYjsKLSAgICAgICVjbGFzcy5hdHRyaWI7Ci0gICAgICAldGl0bGUuYXR0cmliOwotICAgICAgJUNvcmUuZXh0cmEuYXR0cmliOyIKLT4KLQotPCFFTlRJVFkgJSBsYW5nLmF0dHJpYgotICAgICAieG1sOmxhbmcgICAgICVMYW5ndWFnZUNvZGUuZGF0YXR5cGU7ICAjSU1QTElFRCIKLT4KLQotPCFbJVhIVE1MLmJpZGk7WwotPCFFTlRJVFkgJSBkaXIuYXR0cmliCi0gICAgICJkaXIgICAgICAgICAgKCBsdHIgfCBydGwgKSAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIEkxOG4uYXR0cmliCi0gICAgICIlZGlyLmF0dHJpYjsKLSAgICAgICVsYW5nLmF0dHJpYjsiCi0+Ci0KLV1dPgotPCFFTlRJVFkgJSBJMThuLmF0dHJpYgotICAgICAiJWxhbmcuYXR0cmliOyIKLT4KLQotPCFFTlRJVFkgJSBDb21tb24uZXh0cmEuYXR0cmliICIiID4KLQotPCEtLSBpbnRyaW5zaWMgZXZlbnQgYXR0cmlidXRlcyBkZWNsYXJlZCBwcmV2aW91c2x5Ci0tLT4KLTwhRU5USVRZICUgRXZlbnRzLmF0dHJpYiAiIiA+Ci0KLTwhRU5USVRZICUgQ29tbW9uLmF0dHJpYgotICAgICAiJUNvcmUuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgJUV2ZW50cy5hdHRyaWI7Ci0gICAgICAlQ29tbW9uLmV4dHJhLmF0dHJpYjsiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWF0dHJpYnMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBwbGFjZWhvbGRlciBmb3IgY29udGVudCBtb2RlbCByZWRlY2xhcmF0aW9ucyAtLT4KLTwhRU5USVRZICUgeGh0bWwtbW9kZWwucmVkZWNsICIiID4KLQotCi08IUVOVElUWSAlIHhodG1sLW1vZGVsLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLW1vZGVsLm1vZHVsZTtbCi08IS0tIGluc3RhbnRpYXRlIHRoZSBEb2N1bWVudCBNb2RlbCBtb2R1bGUgZGVjbGFyZWQgaW4gdGhlIERURCBkcml2ZXIKLS0tPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgMS4xIERvY3VtZW50IE1vZGVsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sMTEtbW9kZWwtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MIDEuMSwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIDEuMSBEb2N1bWVudCBNb2RlbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS1tb2RlbC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBYSFRNTCAxLjEgRG9jdW1lbnQgTW9kZWwKLQotICAgICBUaGlzIG1vZHVsZSBkZXNjcmliZXMgdGhlIGdyb3VwaW5ncyBvZiBlbGVtZW50cyB0aGF0IG1ha2UgdXAKLSAgICAgY29tbW9uIGNvbnRlbnQgbW9kZWxzIGZvciBYSFRNTCBlbGVtZW50cy4KLQotICAgICBYSFRNTCBoYXMgdGhyZWUgYmFzaWMgY29udGVudCBtb2RlbHM6Ci0KLSAgICAgICAgICVJbmxpbmUubWl4OyAgY2hhcmFjdGVyLWxldmVsIGVsZW1lbnRzCi0gICAgICAgICAlQmxvY2subWl4OyAgIGJsb2NrLWxpa2UgZWxlbWVudHMsIGVnLiwgcGFyYWdyYXBocyBhbmQgbGlzdHMKLSAgICAgICAgICVGbG93Lm1peDsgICAgYW55IGJsb2NrIG9yIGlubGluZSBlbGVtZW50cwotCi0gICAgIEFueSBwYXJhbWV0ZXIgZW50aXRpZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUgbWF5IGJlIHVzZWQKLSAgICAgdG8gY3JlYXRlIGVsZW1lbnQgY29udGVudCBtb2RlbHMsIGJ1dCB0aGUgYWJvdmUgdGhyZWUgYXJlCi0gICAgIGNvbnNpZGVyZWQgJ2dsb2JhbCcgKGluc29mYXIgYXMgdGhhdCB0ZXJtIGFwcGxpZXMgaGVyZSkuCi0KLSAgICAgVGhlIHJlc2VydmVkIHdvcmQgJyNQQ0RBVEEnIChpbmRpY2F0aW5nIGEgdGV4dCBzdHJpbmcpIGlzIG5vdwotICAgICBpbmNsdWRlZCBleHBsaWNpdGx5IHdpdGggZWFjaCBlbGVtZW50IGRlY2xhcmF0aW9uIHRoYXQgaXMKLSAgICAgZGVjbGFyZWQgYXMgbWl4ZWQgY29udGVudCwgYXMgWE1MIHJlcXVpcmVzIHRoYXQgdGhpcyB0b2tlbgotICAgICBvY2N1ciBmaXJzdCBpbiBhIGNvbnRlbnQgbW9kZWwgc3BlY2lmaWNhdGlvbi4KLS0tPgotPCEtLSBFeHRlbmRpbmcgdGhlIE1vZGVsCi0KLSAgICAgV2hpbGUgaW4gc29tZSBjYXNlcyB0aGlzIG1vZHVsZSBtYXkgbmVlZCB0byBiZSByZXdyaXR0ZW4gdG8KLSAgICAgYWNjb21tb2RhdGUgY2hhbmdlcyB0byB0aGUgZG9jdW1lbnQgbW9kZWwsIG1pbm9yIGV4dGVuc2lvbnMKLSAgICAgbWF5IGJlIGFjY29tcGxpc2hlZCBieSByZWRlY2xhcmluZyBhbnkgb2YgdGhlIHRocmVlICouZXh0cmE7Ci0gICAgIHBhcmFtZXRlciBlbnRpdGllcyB0byBjb250YWluIGV4dGVuc2lvbiBlbGVtZW50IHR5cGVzIGFzIGZvbGxvd3M6Ci0KLSAgICAgICAgICVNaXNjLmV4dHJhOyAgICB3aG9zZSBwYXJlbnQgbWF5IGJlIGFueSBibG9jayBvcgotICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZSBlbGVtZW50LgotCi0gICAgICAgICAlSW5saW5lLmV4dHJhOyAgd2hvc2UgcGFyZW50IG1heSBiZSBhbnkgaW5saW5lIGVsZW1lbnQuCi0KLSAgICAgICAgICVCbG9jay5leHRyYTsgICB3aG9zZSBwYXJlbnQgbWF5IGJlIGFueSBibG9jayBlbGVtZW50LgotCi0gICAgIElmIHVzZWQsIHRoZXNlIHBhcmFtZXRlciBlbnRpdGllcyBtdXN0IGJlIGFuIE9SLXNlcGFyYXRlZAotICAgICBsaXN0IGJlZ2lubmluZyB3aXRoIGFuIE9SIHNlcGFyYXRvciAoInwiKSwgZWcuLCAifCBhIHwgYiB8IGMiCi0KLSAgICAgQWxsIGJsb2NrIGFuZCBpbmxpbmUgKi5jbGFzcyBwYXJhbWV0ZXIgZW50aXRpZXMgbm90IHBhcnQKLSAgICAgb2YgdGhlICpzdHJ1Y3QuY2xhc3MgY2xhc3NlcyBiZWdpbiB3aXRoICJ8ICIgdG8gYWxsb3cgZm9yCi0gICAgIGV4Y2x1c2lvbiBmcm9tIG1peGVzLgotLS0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uLi4gIE9wdGlvbmFsIEVsZW1lbnRzIGluIGhlYWQgIC4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBIZWFkT3B0cy5taXgKLSAgICAgIiggJXNjcmlwdC5xbmFtZTsgfCAlc3R5bGUucW5hbWU7IHwgJW1ldGEucW5hbWU7Ci0gICAgICB8ICVsaW5rLnFuYW1lOyB8ICVvYmplY3QucW5hbWU7ICkqIgotPgotCi08IS0tIC4uLi4uLi4uLi4uLi4uLi4uICBNaXNjZWxsYW5lb3VzIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gaW5zIGFuZCBkZWwgYXJlIHVzZWQgdG8gZGVub3RlIGVkaXRpbmcgY2hhbmdlcwotLS0+Ci08IUVOVElUWSAlIEVkaXQuY2xhc3MgInwgJWlucy5xbmFtZTsgfCAlZGVsLnFuYW1lOyIgPgotCi08IS0tIHNjcmlwdCBhbmQgbm9zY3JpcHQgYXJlIHVzZWQgdG8gY29udGFpbiBzY3JpcHRzCi0gICAgIGFuZCBhbHRlcm5hdGl2ZSBjb250ZW50Ci0tLT4KLTwhRU5USVRZICUgU2NyaXB0LmNsYXNzICJ8ICVzY3JpcHQucW5hbWU7IHwgJW5vc2NyaXB0LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIE1pc2MuZXh0cmEgIiIgPgotCi08IS0tIFRoZXNlIGVsZW1lbnRzIGFyZSBuZWl0aGVyIGJsb2NrIG5vciBpbmxpbmUsIGFuZCBjYW4KLSAgICAgZXNzZW50aWFsbHkgYmUgdXNlZCBhbnl3aGVyZSBpbiB0aGUgZG9jdW1lbnQgYm9keS4KLS0tPgotPCFFTlRJVFkgJSBNaXNjLmNsYXNzCi0gICAgICIlRWRpdC5jbGFzczsKLSAgICAgICVTY3JpcHQuY2xhc3M7Ci0gICAgICAlTWlzYy5leHRyYTsiCi0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4gIElubGluZSBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBJbmxTdHJ1Y3QuY2xhc3MgIiVici5xbmFtZTsgfCAlc3Bhbi5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxQaHJhcy5jbGFzcwotICAgICAifCAlZW0ucW5hbWU7IHwgJXN0cm9uZy5xbmFtZTsgfCAlZGZuLnFuYW1lOyB8ICVjb2RlLnFuYW1lOwotICAgICAgfCAlc2FtcC5xbmFtZTsgfCAla2JkLnFuYW1lOyB8ICV2YXIucW5hbWU7IHwgJWNpdGUucW5hbWU7Ci0gICAgICB8ICVhYmJyLnFuYW1lOyB8ICVhY3JvbnltLnFuYW1lOyB8ICVxLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubFByZXMuY2xhc3MKLSAgICAgInwgJXR0LnFuYW1lOyB8ICVpLnFuYW1lOyB8ICViLnFuYW1lOyB8ICViaWcucW5hbWU7Ci0gICAgICB8ICVzbWFsbC5xbmFtZTsgfCAlc3ViLnFuYW1lOyB8ICVzdXAucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSTE4bi5jbGFzcyAifCAlYmRvLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEFuY2hvci5jbGFzcyAifCAlYS5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxTcGVjaWFsLmNsYXNzCi0gICAgICJ8ICVpbWcucW5hbWU7IHwgJW1hcC5xbmFtZTsKLSAgICAgIHwgJW9iamVjdC5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxGb3JtLmNsYXNzCi0gICAgICJ8ICVpbnB1dC5xbmFtZTsgfCAlc2VsZWN0LnFuYW1lOyB8ICV0ZXh0YXJlYS5xbmFtZTsKLSAgICAgIHwgJWxhYmVsLnFuYW1lOyB8ICVidXR0b24ucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5saW5lLmV4dHJhICIiID4KLQotPCFFTlRJVFkgJSBSdWJ5LmNsYXNzICJ8ICVydWJ5LnFuYW1lOyIgPgotCi08IS0tICVJbmxpbmUuY2xhc3M7IGluY2x1ZGVzIGFsbCBpbmxpbmUgZWxlbWVudHMsCi0gICAgIHVzZWQgYXMgYSBjb21wb25lbnQgaW4gbWl4ZXMKLS0tPgotPCFFTlRJVFkgJSBJbmxpbmUuY2xhc3MKLSAgICAgIiVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlSW5sUHJlcy5jbGFzczsKLSAgICAgICVJMThuLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubEZvcm0uY2xhc3M7Ci0gICAgICAlUnVieS5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7IgotPgotCi08IS0tICVJbmxOb1J1YnkuY2xhc3M7IGluY2x1ZGVzIGFsbCBpbmxpbmUgZWxlbWVudHMKLSAgICAgZXhjZXB0IHJ1YnksIHVzZWQgYXMgYSBjb21wb25lbnQgaW4gbWl4ZXMKLS0tPgotPCFFTlRJVFkgJSBJbmxOb1J1YnkuY2xhc3MKLSAgICAgIiVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlSW5sUHJlcy5jbGFzczsKLSAgICAgICVJMThuLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubEZvcm0uY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyIKLT4KLQotPCEtLSAlTm9SdWJ5LmNvbnRlbnQ7IGluY2x1ZGVzIGFsbCBpbmxpbmVzIGV4Y2VwdCBydWJ5Ci0tLT4KLTwhRU5USVRZICUgTm9SdWJ5LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQQotICAgICAgfCAlSW5sTm9SdWJ5LmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7ICkqIgotPgotCi08IS0tICVJbmxOb0FuY2hvci5jbGFzczsgaW5jbHVkZXMgYWxsIG5vbi1hbmNob3IgaW5saW5lcywKLSAgICAgdXNlZCBhcyBhIGNvbXBvbmVudCBpbiBtaXhlcwotLS0+Ci08IUVOVElUWSAlIElubE5vQW5jaG9yLmNsYXNzCi0gICAgICIlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUlubFByZXMuY2xhc3M7Ci0gICAgICAlSTE4bi5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubEZvcm0uY2xhc3M7Ci0gICAgICAlUnVieS5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7IgotPgotCi08IS0tICVJbmxOb0FuY2hvci5taXg7IGluY2x1ZGVzIGFsbCBub24tYW5jaG9yIGlubGluZXMKLS0tPgotPCFFTlRJVFkgJSBJbmxOb0FuY2hvci5taXgKLSAgICAgIiVJbmxOb0FuY2hvci5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSAlSW5saW5lLm1peDsgaW5jbHVkZXMgYWxsIGlubGluZSBlbGVtZW50cywgaW5jbHVkaW5nICVNaXNjLmNsYXNzOwotLS0+Ci08IUVOVElUWSAlIElubGluZS5taXgKLSAgICAgIiVJbmxpbmUuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uICBCbG9jayBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbiB0aGUgSFRNTCA0LjAgRFRELCBoZWFkaW5nIGFuZCBsaXN0IGVsZW1lbnRzIHdlcmUgaW5jbHVkZWQKLSAgICAgaW4gdGhlICVibG9jazsgcGFyYW1ldGVyIGVudGl0eS4gVGhlICVIZWFkaW5nLmNsYXNzOyBhbmQKLSAgICAgJUxpc3QuY2xhc3M7IHBhcmFtZXRlciBlbnRpdGllcyBtdXN0IG5vdyBiZSBpbmNsdWRlZCBleHBsaWNpdGx5Ci0gICAgIG9uIGVsZW1lbnQgZGVjbGFyYXRpb25zIHdoZXJlIGRlc2lyZWQuCi0tLT4KLQotPCFFTlRJVFkgJSBIZWFkaW5nLmNsYXNzCi0gICAgICIlaDEucW5hbWU7IHwgJWgyLnFuYW1lOyB8ICVoMy5xbmFtZTsKLSAgICAgIHwgJWg0LnFuYW1lOyB8ICVoNS5xbmFtZTsgfCAlaDYucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgTGlzdC5jbGFzcyAiJXVsLnFuYW1lOyB8ICVvbC5xbmFtZTsgfCAlZGwucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgVGFibGUuY2xhc3MgInwgJXRhYmxlLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEZvcm0uY2xhc3MgICJ8ICVmb3JtLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEZpZWxkc2V0LmNsYXNzICAifCAlZmllbGRzZXQucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrU3RydWN0LmNsYXNzICIlcC5xbmFtZTsgfCAlZGl2LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEJsa1BocmFzLmNsYXNzCi0gICAgICJ8ICVwcmUucW5hbWU7IHwgJWJsb2NrcXVvdGUucW5hbWU7IHwgJWFkZHJlc3MucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrUHJlcy5jbGFzcyAifCAlaHIucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrU3BlY2lhbC5jbGFzcwotICAgICAiJVRhYmxlLmNsYXNzOwotICAgICAgJUZvcm0uY2xhc3M7Ci0gICAgICAlRmllbGRzZXQuY2xhc3M7IgotPgotCi08IUVOVElUWSAlIEJsb2NrLmV4dHJhICIiID4KLQotPCEtLSAlQmxvY2suY2xhc3M7IGluY2x1ZGVzIGFsbCBibG9jayBlbGVtZW50cywKLSAgICAgdXNlZCBhcyBhbiBjb21wb25lbnQgaW4gbWl4ZXMKLS0tPgotPCFFTlRJVFkgJSBCbG9jay5jbGFzcwotICAgICAiJUJsa1N0cnVjdC5jbGFzczsKLSAgICAgICVCbGtQaHJhcy5jbGFzczsKLSAgICAgICVCbGtQcmVzLmNsYXNzOwotICAgICAgJUJsa1NwZWNpYWwuY2xhc3M7Ci0gICAgICAlQmxvY2suZXh0cmE7IgotPgotCi08IS0tICVCbG9jay5taXg7IGluY2x1ZGVzIGFsbCBibG9jayBlbGVtZW50cyBwbHVzICVNaXNjLmNsYXNzOwotLS0+Ci08IUVOVElUWSAlIEJsb2NrLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxvY2suY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLiAgQWxsIENvbnRlbnQgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSAlRmxvdy5taXg7IGluY2x1ZGVzIGFsbCB0ZXh0IGNvbnRlbnQsIGJsb2NrIGFuZCBpbmxpbmUKLS0tPgotPCFFTlRJVFkgJSBGbG93Lm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxvY2suY2xhc3M7Ci0gICAgICB8ICVJbmxpbmUuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sMTEtbW9kZWwtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1jaGFyZW50Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWNoYXJlbnQubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtY2hhcmVudC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENoYXJhY3RlciBFbnRpdGllcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWNoYXJlbnQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQ2hhcmFjdGVyIEVudGl0aWVzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWNoYXJlbnQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ2hhcmFjdGVyIEVudGl0aWVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtY2hhcmVudC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgRW50aXRpZXMgZm9yIFhIVE1MCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIHNldCBvZiBjaGFyYWN0ZXIgZW50aXRpZXMgZm9yIFhIVE1MLAotICAgICBpbmNsdWRpbmcgdGhlIExhdGluIDEsIFN5bWJvbCBhbmQgU3BlY2lhbCBjaGFyYWN0ZXIgY29sbGVjdGlvbnMuCi0tLT4KLQotPCFFTlRJVFkgJSB4aHRtbC1sYXQxCi0gICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgInhodG1sLWxhdDEuZW50IiA+Ci08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODYKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgIDwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAgICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMSBmb3IgWEhUTUwvL0VOIgotICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLWxhdDEuZW50Ij4KLSAgICAlSFRNTGxhdDE7Ci0tLT4KLQotPCFFTlRJVFkgbmJzcCAgICImIzE2MDsiPiA8IS0tIG5vLWJyZWFrIHNwYWNlID0gbm9uLWJyZWFraW5nIHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBMCBJU09udW0gLS0+Ci08IUVOVElUWSBpZXhjbCAgIiYjMTYxOyI+IDwhLS0gaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyaywgVSswMEExIElTT251bSAtLT4KLTwhRU5USVRZIGNlbnQgICAiJiMxNjI7Ij4gPCEtLSBjZW50IHNpZ24sIFUrMDBBMiBJU09udW0gLS0+Ci08IUVOVElUWSBwb3VuZCAgIiYjMTYzOyI+IDwhLS0gcG91bmQgc2lnbiwgVSswMEEzIElTT251bSAtLT4KLTwhRU5USVRZIGN1cnJlbiAiJiMxNjQ7Ij4gPCEtLSBjdXJyZW5jeSBzaWduLCBVKzAwQTQgSVNPbnVtIC0tPgotPCFFTlRJVFkgeWVuICAgICImIzE2NTsiPiA8IS0tIHllbiBzaWduID0geXVhbiBzaWduLCBVKzAwQTUgSVNPbnVtIC0tPgotPCFFTlRJVFkgYnJ2YmFyICImIzE2NjsiPiA8IS0tIGJyb2tlbiBiYXIgPSBicm9rZW4gdmVydGljYWwgYmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBNiBJU09udW0gLS0+Ci08IUVOVElUWSBzZWN0ICAgIiYjMTY3OyI+IDwhLS0gc2VjdGlvbiBzaWduLCBVKzAwQTcgSVNPbnVtIC0tPgotPCFFTlRJVFkgdW1sICAgICImIzE2ODsiPiA8IS0tIGRpYWVyZXNpcyA9IHNwYWNpbmcgZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBOCBJU09kaWEgLS0+Ci08IUVOVElUWSBjb3B5ICAgIiYjMTY5OyI+IDwhLS0gY29weXJpZ2h0IHNpZ24sIFUrMDBBOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRmICAgIiYjMTcwOyI+IDwhLS0gZmVtaW5pbmUgb3JkaW5hbCBpbmRpY2F0b3IsIFUrMDBBQSBJU09udW0gLS0+Ci08IUVOVElUWSBsYXF1byAgIiYjMTcxOyI+IDwhLS0gbGVmdC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxlZnQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQUIgSVNPbnVtIC0tPgotPCFFTlRJVFkgbm90ICAgICImIzE3MjsiPiA8IS0tIG5vdCBzaWduID0gZGlzY3JldGlvbmFyeSBoeXBoZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFDIElTT251bSAtLT4KLTwhRU5USVRZIHNoeSAgICAiJiMxNzM7Ij4gPCEtLSBzb2Z0IGh5cGhlbiA9IGRpc2NyZXRpb25hcnkgaHlwaGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBRCBJU09udW0gLS0+Ci08IUVOVElUWSByZWcgICAgIiYjMTc0OyI+IDwhLS0gcmVnaXN0ZXJlZCBzaWduID0gcmVnaXN0ZXJlZCB0cmFkZSBtYXJrIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFFIElTT251bSAtLT4KLTwhRU5USVRZIG1hY3IgICAiJiMxNzU7Ij4gPCEtLSBtYWNyb24gPSBzcGFjaW5nIG1hY3JvbiA9IG92ZXJsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBUEwgb3ZlcmJhciwgVSswMEFGIElTT2RpYSAtLT4KLTwhRU5USVRZIGRlZyAgICAiJiMxNzY7Ij4gPCEtLSBkZWdyZWUgc2lnbiwgVSswMEIwIElTT251bSAtLT4KLTwhRU5USVRZIHBsdXNtbiAiJiMxNzc7Ij4gPCEtLSBwbHVzLW1pbnVzIHNpZ24gPSBwbHVzLW9yLW1pbnVzIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEIxIElTT251bSAtLT4KLTwhRU5USVRZIHN1cDIgICAiJiMxNzg7Ij4gPCEtLSBzdXBlcnNjcmlwdCB0d28gPSBzdXBlcnNjcmlwdCBkaWdpdCB0d28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNxdWFyZWQsIFUrMDBCMiBJU09udW0gLS0+Ci08IUVOVElUWSBzdXAzICAgIiYjMTc5OyI+IDwhLS0gc3VwZXJzY3JpcHQgdGhyZWUgPSBzdXBlcnNjcmlwdCBkaWdpdCB0aHJlZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY3ViZWQsIFUrMDBCMyBJU09udW0gLS0+Ci08IUVOVElUWSBhY3V0ZSAgIiYjMTgwOyI+IDwhLS0gYWN1dGUgYWNjZW50ID0gc3BhY2luZyBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjQgSVNPZGlhIC0tPgotPCFFTlRJVFkgbWljcm8gICImIzE4MTsiPiA8IS0tIG1pY3JvIHNpZ24sIFUrMDBCNSBJU09udW0gLS0+Ci08IUVOVElUWSBwYXJhICAgIiYjMTgyOyI+IDwhLS0gcGlsY3JvdyBzaWduID0gcGFyYWdyYXBoIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI2IElTT251bSAtLT4KLTwhRU5USVRZIG1pZGRvdCAiJiMxODM7Ij4gPCEtLSBtaWRkbGUgZG90ID0gR2VvcmdpYW4gY29tbWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEdyZWVrIG1pZGRsZSBkb3QsIFUrMDBCNyBJU09udW0gLS0+Ci08IUVOVElUWSBjZWRpbCAgIiYjMTg0OyI+IDwhLS0gY2VkaWxsYSA9IHNwYWNpbmcgY2VkaWxsYSwgVSswMEI4IElTT2RpYSAtLT4KLTwhRU5USVRZIHN1cDEgICAiJiMxODU7Ij4gPCEtLSBzdXBlcnNjcmlwdCBvbmUgPSBzdXBlcnNjcmlwdCBkaWdpdCBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI5IElTT251bSAtLT4KLTwhRU5USVRZIG9yZG0gICAiJiMxODY7Ij4gPCEtLSBtYXNjdWxpbmUgb3JkaW5hbCBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEJBIElTT251bSAtLT4KLTwhRU5USVRZIHJhcXVvICAiJiMxODc7Ij4gPCEtLSByaWdodC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHJpZ2h0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEJCIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMxNCAiJiMxODg7Ij4gPCEtLSB2dWxnYXIgZnJhY3Rpb24gb25lIHF1YXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIG9uZSBxdWFydGVyLCBVKzAwQkMgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzEyICImIzE4OTsiPiA8IS0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgaGFsZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gb25lIGhhbGYsIFUrMDBCRCBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMzQgIiYjMTkwOyI+IDwhLS0gdnVsZ2FyIGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiB0aHJlZSBxdWFydGVycywgVSswMEJFIElTT251bSAtLT4KLTwhRU5USVRZIGlxdWVzdCAiJiMxOTE7Ij4gPCEtLSBpbnZlcnRlZCBxdWVzdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0dXJuZWQgcXVlc3Rpb24gbWFyaywgVSswMEJGIElTT251bSAtLT4KLTwhRU5USVRZIEFncmF2ZSAiJiMxOTI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggZ3JhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBYWN1dGUgIiYjMTkzOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgQWNpcmMgICImIzE5NDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXRpbGRlICImIzE5NTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEF1bWwgICAiJiMxOTY7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXJpbmcgICImIzE5NzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCByaW5nIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBBRWxpZyAgIiYjMTk4OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgQUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBDY2VkaWwgIiYjMTk5OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQyB3aXRoIGNlZGlsbGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM3IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFZ3JhdmUgIiYjMjAwOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWFjdXRlICImIzIwMTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVjaXJjICAiJiMyMDI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0EgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEV1bWwgICAiJiMyMDM7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWdyYXZlICImIzIwNDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0MgSVNPbGF0MSAtLT4KLTwhRU5USVRZIElhY3V0ZSAiJiMyMDU7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENEIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJY2lyYyAgIiYjMjA2OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJdW1sICAgIiYjMjA3OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0YgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVUSCAgICAiJiMyMDg7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFVEgsIFUrMDBEMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgTnRpbGRlICImIzIwOTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE4gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9ncmF2ZSAiJiMyMTA7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPYWN1dGUgIiYjMjExOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2NpcmMgICImIzIxMjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENCBJU09sYXQxIC0tPgotPCFFTlRJVFkgT3RpbGRlICImIzIxMzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE91bWwgICAiJiMyMTQ7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENiBJU09sYXQxIC0tPgotPCFFTlRJVFkgdGltZXMgICImIzIxNTsiPiA8IS0tIG11bHRpcGxpY2F0aW9uIHNpZ24sIFUrMDBENyBJU09udW0gLS0+Ci08IUVOVElUWSBPc2xhc2ggIiYjMjE2OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIHN0cm9rZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyBzbGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDggSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVncmF2ZSAiJiMyMTc7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBVYWN1dGUgIiYjMjE4OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWNpcmMgICImIzIxOTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgVXVtbCAgICImIzIyMDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBZYWN1dGUgIiYjMjIxOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERCBJU09sYXQxIC0tPgotPCFFTlRJVFkgVEhPUk4gICImIzIyMjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFRIT1JOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERSBJU09sYXQxIC0tPgotPCFFTlRJVFkgc3psaWcgICImIzIyMzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBzaGFycCBzID0gZXNzLXplZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFncmF2ZSAiJiMyMjQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGdyYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFhY3V0ZSAiJiMyMjU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWNpcmMgICImIzIyNjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGF0aWxkZSAiJiMyMjc7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXVtbCAgICImIzIyODsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXJpbmcgICImIzIyOTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggcmluZyBhYm92ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIGEgcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFlbGlnICAiJiMyMzA7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxpZ2F0dXJlIGFlLCBVKzAwRTYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGNjZWRpbCAiJiMyMzE7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYyB3aXRoIGNlZGlsbGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU3IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlZ3JhdmUgIiYjMjMyOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTggSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVhY3V0ZSAiJiMyMzM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWNpcmMgICImIzIzNDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGV1bWwgICAiJiMyMzU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGlncmF2ZSAiJiMyMzY7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWFjdXRlICImIzIzNzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVEIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpY2lyYyAgIiYjMjM4OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgaXVtbCAgICImIzIzOTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRiBJU09sYXQxIC0tPgotPCFFTlRJVFkgZXRoICAgICImIzI0MDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBldGgsIFUrMDBGMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgbnRpbGRlICImIzI0MTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBuIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvZ3JhdmUgIiYjMjQyOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9hY3V0ZSAiJiMyNDM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2NpcmMgICImIzI0NDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG90aWxkZSAiJiMyNDU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgb3VtbCAgICImIzI0NjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgZGl2aWRlICImIzI0NzsiPiA8IS0tIGRpdmlzaW9uIHNpZ24sIFUrMDBGNyBJU09udW0gLS0+Ci08IUVOVElUWSBvc2xhc2ggIiYjMjQ4OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBzdHJva2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyBzbGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjggSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVncmF2ZSAiJiMyNDk7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWFjdXRlICImIzI1MDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZBIElTT2xhdDEgLS0+Ci08IUVOVElUWSB1Y2lyYyAgIiYjMjUxOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgdXVtbCAgICImIzI1MjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgeWFjdXRlICImIzI1MzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB5IHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZEIElTT2xhdDEgLS0+Ci08IUVOVElUWSB0aG9ybiAgIiYjMjU0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHRob3JuIHdpdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZFIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5dW1sICAgIiYjMjU1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZGIElTT2xhdDEgLS0+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1zeW1ib2wKLSAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scyBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAieGh0bWwtc3ltYm9sLmVudCIgPgotPCEtLSBNYXRoZW1hdGljYWwsIEdyZWVrIGFuZCBTeW1ib2xpYyBjaGFyYWN0ZXJzIGZvciBIVE1MIC0tPgotCi08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgIDwhRU5USVRZICUgSFRNTHN5bWJvbCBQVUJMSUMKLSAgICAgICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scyBmb3IgWEhUTUwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zeW1ib2wuZW50Ij4KLSAgICAgJUhUTUxzeW1ib2w7Ci0tLT4KLQotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2OgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci0KLTwhLS0gUmVsZXZhbnQgSVNPIGVudGl0eSBzZXQgaXMgZ2l2ZW4gdW5sZXNzIG5hbWVzIGFyZSBuZXdseSBpbnRyb2R1Y2VkLgotICAgICBOZXcgbmFtZXMgKGkuZS4sIG5vdCBpbiBJU08gODg3OSBsaXN0KSBkbyBub3QgY2xhc2ggd2l0aCBhbnkKLSAgICAgZXhpc3RpbmcgSVNPIDg4NzkgZW50aXR5IG5hbWVzLiBJU08gMTA2NDYgY2hhcmFjdGVyIG51bWJlcnMKLSAgICAgYXJlIGdpdmVuIGZvciBlYWNoIGNoYXJhY3RlciwgaW4gaGV4LiB2YWx1ZXMgYXJlIGRlY2ltYWwKLSAgICAgY29udmVyc2lvbnMgb2YgdGhlIElTTyAxMDY0NiB2YWx1ZXMgYW5kIHJlZmVyIHRvIHRoZSBkb2N1bWVudAotICAgICBjaGFyYWN0ZXIgc2V0LiBOYW1lcyBhcmUgVW5pY29kZSBuYW1lcy4gCi0tLT4KLQotPCEtLSBMYXRpbiBFeHRlbmRlZC1CIC0tPgotPCFFTlRJVFkgZm5vZiAgICAgIiYjNDAyOyI+IDwhLS0gbGF0aW4gc21hbGwgZiB3aXRoIGhvb2sgPSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmbG9yaW4sIFUrMDE5MiBJU090ZWNoIC0tPgotCi08IS0tIEdyZWVrIC0tPgotPCFFTlRJVFkgQWxwaGEgICAgIiYjOTEzOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYWxwaGEsIFUrMDM5MSAtLT4KLTwhRU5USVRZIEJldGEgICAgICImIzkxNDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGJldGEsIFUrMDM5MiAtLT4KLTwhRU5USVRZIEdhbW1hICAgICImIzkxNTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGdhbW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzkzIElTT2dyazMgLS0+Ci08IUVOVElUWSBEZWx0YSAgICAiJiM5MTY7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5NCBJU09ncmszIC0tPgotPCFFTlRJVFkgRXBzaWxvbiAgIiYjOTE3OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXBzaWxvbiwgVSswMzk1IC0tPgotPCFFTlRJVFkgWmV0YSAgICAgIiYjOTE4OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgemV0YSwgVSswMzk2IC0tPgotPCFFTlRJVFkgRXRhICAgICAgIiYjOTE5OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXRhLCBVKzAzOTcgLS0+Ci08IUVOVElUWSBUaGV0YSAgICAiJiM5MjA7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB0aGV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5OCBJU09ncmszIC0tPgotPCFFTlRJVFkgSW90YSAgICAgIiYjOTIxOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgaW90YSwgVSswMzk5IC0tPgotPCFFTlRJVFkgS2FwcGEgICAgIiYjOTIyOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIga2FwcGEsIFUrMDM5QSAtLT4KLTwhRU5USVRZIExhbWJkYSAgICImIzkyMzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5QiBJU09ncmszIC0tPgotPCFFTlRJVFkgTXUgICAgICAgIiYjOTI0OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbXUsIFUrMDM5QyAtLT4KLTwhRU5USVRZIE51ICAgICAgICImIzkyNTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG51LCBVKzAzOUQgLS0+Ci08IUVOVElUWSBYaSAgICAgICAiJiM5MjY7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB4aSwgVSswMzlFIElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWljcm9uICAiJiM5Mjc7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWljcm9uLCBVKzAzOUYgLS0+Ci08IUVOVElUWSBQaSAgICAgICAiJiM5Mjg7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaSwgVSswM0EwIElTT2dyazMgLS0+Ci08IUVOVElUWSBSaG8gICAgICAiJiM5Mjk7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciByaG8sIFUrMDNBMSAtLT4KLTwhLS0gdGhlcmUgaXMgbm8gU2lnbWFmLCBhbmQgbm8gVSswM0EyIGNoYXJhY3RlciBlaXRoZXIgLS0+Ci08IUVOVElUWSBTaWdtYSAgICAiJiM5MzE7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBMyBJU09ncmszIC0tPgotPCFFTlRJVFkgVGF1ICAgICAgIiYjOTMyOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGF1LCBVKzAzQTQgLS0+Ci08IUVOVElUWSBVcHNpbG9uICAiJiM5MzM7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB1cHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E1IElTT2dyazMgLS0+Ci08IUVOVElUWSBQaGkgICAgICAiJiM5MzQ7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIENoaSAgICAgICImIzkzNTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGNoaSwgVSswM0E3IC0tPgotPCFFTlRJVFkgUHNpICAgICAgIiYjOTM2OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcHNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E4IElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWVnYSAgICAiJiM5Mzc7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWVnYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBOSBJU09ncmszIC0tPgotCi08IUVOVElUWSBhbHBoYSAgICAiJiM5NDU7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGJldGEgICAgICImIzk0NjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBiZXRhLCBVKzAzQjIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGdhbW1hICAgICImIzk0NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBnYW1tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCMyBJU09ncmszIC0tPgotPCFFTlRJVFkgZGVsdGEgICAgIiYjOTQ4OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I0IElTT2dyazMgLS0+Ci08IUVOVElUWSBlcHNpbG9uICAiJiM5NDk7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCNSBJU09ncmszIC0tPgotPCFFTlRJVFkgemV0YSAgICAgIiYjOTUwOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHpldGEsIFUrMDNCNiBJU09ncmszIC0tPgotPCFFTlRJVFkgZXRhICAgICAgIiYjOTUxOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGV0YSwgVSswM0I3IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YSAgICAiJiM5NTI7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGlvdGEgICAgICImIzk1MzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBpb3RhLCBVKzAzQjkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGthcHBhICAgICImIzk1NDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBrYXBwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCQSBJU09ncmszIC0tPgotPCFFTlRJVFkgbGFtYmRhICAgIiYjOTU1OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCQiBJU09ncmszIC0tPgotPCFFTlRJVFkgbXUgICAgICAgIiYjOTU2OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG11LCBVKzAzQkMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG51ICAgICAgICImIzk1NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBudSwgVSswM0JEIElTT2dyazMgLS0+Ci08IUVOVElUWSB4aSAgICAgICAiJiM5NTg7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgeGksIFUrMDNCRSBJU09ncmszIC0tPgotPCFFTlRJVFkgb21pY3JvbiAgIiYjOTU5OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9taWNyb24sIFUrMDNCRiBORVcgLS0+Ci08IUVOVElUWSBwaSAgICAgICAiJiM5NjA7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcGksIFUrMDNDMCBJU09ncmszIC0tPgotPCFFTlRJVFkgcmhvICAgICAgIiYjOTYxOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHJobywgVSswM0MxIElTT2dyazMgLS0+Ci08IUVOVElUWSBzaWdtYWYgICAiJiM5NjI7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZmluYWwgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hICAgICImIzk2MzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDMyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGF1ICAgICAgIiYjOTY0OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRhdSwgVSswM0M0IElTT2dyazMgLS0+Ci08IUVOVElUWSB1cHNpbG9uICAiJiM5NjU7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDNSBJU09ncmszIC0tPgotPCFFTlRJVFkgcGhpICAgICAgIiYjOTY2OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBoaSwgVSswM0M2IElTT2dyazMgLS0+Ci08IUVOVElUWSBjaGkgICAgICAiJiM5Njc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgY2hpLCBVKzAzQzcgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBzaSAgICAgICImIzk2ODsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwc2ksIFUrMDNDOCBJU09ncmszIC0tPgotPCFFTlRJVFkgb21lZ2EgICAgIiYjOTY5OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9tZWdhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0M5IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YXN5bSAiJiM5Nzc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0QxIE5FVyAtLT4KLTwhRU5USVRZIHVwc2loICAgICImIzk3ODsiPiA8IS0tIGdyZWVrIHVwc2lsb24gd2l0aCBob29rIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNEMiBORVcgLS0+Ci08IUVOVElUWSBwaXYgICAgICAiJiM5ODI7Ij4gPCEtLSBncmVlayBwaSBzeW1ib2wsIFUrMDNENiBJU09ncmszIC0tPgotCi08IS0tIEdlbmVyYWwgUHVuY3R1YXRpb24gLS0+Ci08IUVOVElUWSBidWxsICAgICAiJiM4MjI2OyI+IDwhLS0gYnVsbGV0ID0gYmxhY2sgc21hbGwgY2lyY2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAyMiBJU09wdWIgIC0tPgotPCEtLSBidWxsZXQgaXMgTk9UIHRoZSBzYW1lIGFzIGJ1bGxldCBvcGVyYXRvciwgVSsyMjE5IC0tPgotPCFFTlRJVFkgaGVsbGlwICAgIiYjODIzMDsiPiA8IS0tIGhvcml6b250YWwgZWxsaXBzaXMgPSB0aHJlZSBkb3QgbGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAyNiBJU09wdWIgIC0tPgotPCFFTlRJVFkgcHJpbWUgICAgIiYjODI0MjsiPiA8IS0tIHByaW1lID0gbWludXRlcyA9IGZlZXQsIFUrMjAzMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgUHJpbWUgICAgIiYjODI0MzsiPiA8IS0tIGRvdWJsZSBwcmltZSA9IHNlY29uZHMgPSBpbmNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDMzIElTT3RlY2ggLS0+Ci08IUVOVElUWSBvbGluZSAgICAiJiM4MjU0OyI+IDwhLS0gb3ZlcmxpbmUgPSBzcGFjaW5nIG92ZXJzY29yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwM0UgTkVXIC0tPgotPCFFTlRJVFkgZnJhc2wgICAgIiYjODI2MDsiPiA8IS0tIGZyYWN0aW9uIHNsYXNoLCBVKzIwNDQgTkVXIC0tPgotCi08IS0tIExldHRlcmxpa2UgU3ltYm9scyAtLT4KLTwhRU5USVRZIHdlaWVycCAgICImIzg0NzI7Ij4gPCEtLSBzY3JpcHQgY2FwaXRhbCBQID0gcG93ZXIgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBXZWllcnN0cmFzcyBwLCBVKzIxMTggSVNPYW1zbyAtLT4KLTwhRU5USVRZIGltYWdlICAgICImIzg0NjU7Ij4gPCEtLSBibGFja2xldHRlciBjYXBpdGFsIEkgPSBpbWFnaW5hcnkgcGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMTEgSVNPYW1zbyAtLT4KLTwhRU5USVRZIHJlYWwgICAgICImIzg0NzY7Ij4gPCEtLSBibGFja2xldHRlciBjYXBpdGFsIFIgPSByZWFsIHBhcnQgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjExQyBJU09hbXNvIC0tPgotPCFFTlRJVFkgdHJhZGUgICAgIiYjODQ4MjsiPiA8IS0tIHRyYWRlIG1hcmsgc2lnbiwgVSsyMTIyIElTT251bSAtLT4KLTwhRU5USVRZIGFsZWZzeW0gICImIzg1MDE7Ij4gPCEtLSBhbGVmIHN5bWJvbCA9IGZpcnN0IHRyYW5zZmluaXRlIGNhcmRpbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjEzNSBORVcgLS0+Ci08IS0tIGFsZWYgc3ltYm9sIGlzIE5PVCB0aGUgc2FtZSBhcyBoZWJyZXcgbGV0dGVyIGFsZWYsCi0gICAgIFUrMDVEMCBhbHRob3VnaCB0aGUgc2FtZSBnbHlwaCBjb3VsZCBiZSB1c2VkIHRvIGRlcGljdCBib3RoIGNoYXJhY3RlcnMgLS0+Ci0KLTwhLS0gQXJyb3dzIC0tPgotPCFFTlRJVFkgbGFyciAgICAgIiYjODU5MjsiPiA8IS0tIGxlZnR3YXJkcyBhcnJvdywgVSsyMTkwIElTT251bSAtLT4KLTwhRU5USVRZIHVhcnIgICAgICImIzg1OTM7Ij4gPCEtLSB1cHdhcmRzIGFycm93LCBVKzIxOTEgSVNPbnVtLS0+Ci08IUVOVElUWSByYXJyICAgICAiJiM4NTk0OyI+IDwhLS0gcmlnaHR3YXJkcyBhcnJvdywgVSsyMTkyIElTT251bSAtLT4KLTwhRU5USVRZIGRhcnIgICAgICImIzg1OTU7Ij4gPCEtLSBkb3dud2FyZHMgYXJyb3csIFUrMjE5MyBJU09udW0gLS0+Ci08IUVOVElUWSBoYXJyICAgICAiJiM4NTk2OyI+IDwhLS0gbGVmdCByaWdodCBhcnJvdywgVSsyMTk0IElTT2Ftc2EgLS0+Ci08IUVOVElUWSBjcmFyciAgICAiJiM4NjI5OyI+IDwhLS0gZG93bndhcmRzIGFycm93IHdpdGggY29ybmVyIGxlZnR3YXJkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY2FycmlhZ2UgcmV0dXJuLCBVKzIxQjUgTkVXIC0tPgotPCFFTlRJVFkgbEFyciAgICAgIiYjODY1NjsiPiA8IS0tIGxlZnR3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMCBJU090ZWNoIC0tPgotPCEtLSBVbmljb2RlIGRvZXMgbm90IHNheSB0aGF0IGxBcnIgaXMgdGhlIHNhbWUgYXMgdGhlICdpcyBpbXBsaWVkIGJ5JyBhcnJvdwotICAgIGJ1dCBhbHNvIGRvZXMgbm90IGhhdmUgYW55IG90aGVyIGNoYXJhY3RlciBmb3IgdGhhdCBmdW5jdGlvbi4gU28gPyBsQXJyIGNhbgotICAgIGJlIHVzZWQgZm9yICdpcyBpbXBsaWVkIGJ5JyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgdUFyciAgICAgIiYjODY1NzsiPiA8IS0tIHVwd2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDEgSVNPYW1zYSAtLT4KLTwhRU5USVRZIHJBcnIgICAgICImIzg2NTg7Ij4gPCEtLSByaWdodHdhcmRzIGRvdWJsZSBhcnJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxRDIgSVNPdGVjaCAtLT4KLTwhLS0gVW5pY29kZSBkb2VzIG5vdCBzYXkgdGhpcyBpcyB0aGUgJ2ltcGxpZXMnIGNoYXJhY3RlciBidXQgZG9lcyBub3QgaGF2ZSAKLSAgICAgYW5vdGhlciBjaGFyYWN0ZXIgd2l0aCB0aGlzIGZ1bmN0aW9uIHNvID8KLSAgICAgckFyciBjYW4gYmUgdXNlZCBmb3IgJ2ltcGxpZXMnIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSBkQXJyICAgICAiJiM4NjU5OyI+IDwhLS0gZG93bndhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQzIElTT2Ftc2EgLS0+Ci08IUVOVElUWSBoQXJyICAgICAiJiM4NjYwOyI+IDwhLS0gbGVmdCByaWdodCBkb3VibGUgYXJyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMUQ0IElTT2Ftc2EgLS0+Ci0KLTwhLS0gTWF0aGVtYXRpY2FsIE9wZXJhdG9ycyAtLT4KLTwhRU5USVRZIGZvcmFsbCAgICImIzg3MDQ7Ij4gPCEtLSBmb3IgYWxsLCBVKzIyMDAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHBhcnQgICAgICImIzg3MDY7Ij4gPCEtLSBwYXJ0aWFsIGRpZmZlcmVudGlhbCwgVSsyMjAyIElTT3RlY2ggIC0tPgotPCFFTlRJVFkgZXhpc3QgICAgIiYjODcwNzsiPiA8IS0tIHRoZXJlIGV4aXN0cywgVSsyMjAzIElTT3RlY2ggLS0+Ci08IUVOVElUWSBlbXB0eSAgICAiJiM4NzA5OyI+IDwhLS0gZW1wdHkgc2V0ID0gbnVsbCBzZXQgPSBkaWFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMDUgSVNPYW1zbyAtLT4KLTwhRU5USVRZIG5hYmxhICAgICImIzg3MTE7Ij4gPCEtLSBuYWJsYSA9IGJhY2t3YXJkIGRpZmZlcmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjA3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBpc2luICAgICAiJiM4NzEyOyI+IDwhLS0gZWxlbWVudCBvZiwgVSsyMjA4IElTT3RlY2ggLS0+Ci08IUVOVElUWSBub3RpbiAgICAiJiM4NzEzOyI+IDwhLS0gbm90IGFuIGVsZW1lbnQgb2YsIFUrMjIwOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgbmkgICAgICAgIiYjODcxNTsiPiA8IS0tIGNvbnRhaW5zIGFzIG1lbWJlciwgVSsyMjBCIElTT3RlY2ggLS0+Ci08IS0tIHNob3VsZCB0aGVyZSBiZSBhIG1vcmUgbWVtb3JhYmxlIG5hbWUgdGhhbiAnbmknPyAtLT4KLTwhRU5USVRZIHByb2QgICAgICImIzg3MTk7Ij4gPCEtLSBuLWFyeSBwcm9kdWN0ID0gcHJvZHVjdCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwRiBJU09hbXNiIC0tPgotPCEtLSBwcm9kIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EwICdncmVlayBjYXBpdGFsIGxldHRlciBwaScgdGhvdWdoCi0gICAgIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBzdW0gICAgICAiJiM4NzIxOyI+IDwhLS0gbi1hcnkgc3VtYXRpb24sIFUrMjIxMSBJU09hbXNiIC0tPgotPCEtLSBzdW0gaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAzQTMgJ2dyZWVrIGNhcGl0YWwgbGV0dGVyIHNpZ21hJwotICAgICB0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCBmb3IgYm90aCAtLT4KLTwhRU5USVRZIG1pbnVzICAgICImIzg3MjI7Ij4gPCEtLSBtaW51cyBzaWduLCBVKzIyMTIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxvd2FzdCAgICImIzg3Mjc7Ij4gPCEtLSBhc3RlcmlzayBvcGVyYXRvciwgVSsyMjE3IElTT3RlY2ggLS0+Ci08IUVOVElUWSByYWRpYyAgICAiJiM4NzMwOyI+IDwhLS0gc3F1YXJlIHJvb3QgPSByYWRpY2FsIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjFBIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwcm9wICAgICAiJiM4NzMzOyI+IDwhLS0gcHJvcG9ydGlvbmFsIHRvLCBVKzIyMUQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGluZmluICAgICImIzg3MzQ7Ij4gPCEtLSBpbmZpbml0eSwgVSsyMjFFIElTT3RlY2ggLS0+Ci08IUVOVElUWSBhbmcgICAgICAiJiM4NzM2OyI+IDwhLS0gYW5nbGUsIFUrMjIyMCBJU09hbXNvIC0tPgotPCFFTlRJVFkgYW5kICAgICAgIiYjODc0MzsiPiA8IS0tIGxvZ2ljYWwgYW5kID0gd2VkZ2UsIFUrMjIyNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb3IgICAgICAgIiYjODc0NDsiPiA8IS0tIGxvZ2ljYWwgb3IgPSB2ZWUsIFUrMjIyOCBJU090ZWNoIC0tPgotPCFFTlRJVFkgY2FwICAgICAgIiYjODc0NTsiPiA8IS0tIGludGVyc2VjdGlvbiA9IGNhcCwgVSsyMjI5IElTT3RlY2ggLS0+Ci08IUVOVElUWSBjdXAgICAgICAiJiM4NzQ2OyI+IDwhLS0gdW5pb24gPSBjdXAsIFUrMjIyQSBJU090ZWNoIC0tPgotPCFFTlRJVFkgaW50ICAgICAgIiYjODc0NzsiPiA8IS0tIGludGVncmFsLCBVKzIyMkIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHRoZXJlNCAgICImIzg3NTY7Ij4gPCEtLSB0aGVyZWZvcmUsIFUrMjIzNCBJU090ZWNoIC0tPgotPCFFTlRJVFkgc2ltICAgICAgIiYjODc2NDsiPiA8IS0tIHRpbGRlIG9wZXJhdG9yID0gdmFyaWVzIHdpdGggPSBzaW1pbGFyIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIzQyBJU090ZWNoIC0tPgotPCEtLSB0aWxkZSBvcGVyYXRvciBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIHRoZSB0aWxkZSwgVSswMDdFLAotICAgICBhbHRob3VnaCB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIHRvIHJlcHJlc2VudCBib3RoICAtLT4KLTwhRU5USVRZIGNvbmcgICAgICImIzg3NzM7Ij4gPCEtLSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvLCBVKzIyNDUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGFzeW1wICAgICImIzg3NzY7Ij4gPCEtLSBhbG1vc3QgZXF1YWwgdG8gPSBhc3ltcHRvdGljIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI0OCBJU09hbXNyIC0tPgotPCFFTlRJVFkgbmUgICAgICAgIiYjODgwMDsiPiA8IS0tIG5vdCBlcXVhbCB0bywgVSsyMjYwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBlcXVpdiAgICAiJiM4ODAxOyI+IDwhLS0gaWRlbnRpY2FsIHRvLCBVKzIyNjEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxlICAgICAgICImIzg4MDQ7Ij4gPCEtLSBsZXNzLXRoYW4gb3IgZXF1YWwgdG8sIFUrMjI2NCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZ2UgICAgICAgIiYjODgwNTsiPiA8IS0tIGdyZWF0ZXItdGhhbiBvciBlcXVhbCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyNjUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1YiAgICAgICImIzg4MzQ7Ij4gPCEtLSBzdWJzZXQgb2YsIFUrMjI4MiBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3VwICAgICAgIiYjODgzNTsiPiA8IS0tIHN1cGVyc2V0IG9mLCBVKzIyODMgSVNPdGVjaCAtLT4KLTwhLS0gbm90ZSB0aGF0IG5zdXAsICdub3QgYSBzdXBlcnNldCBvZiwgVSsyMjgzJyBpcyBub3QgY292ZXJlZCBieSB0aGUgU3ltYm9sIAotICAgICBmb250IGVuY29kaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuIFNob3VsZCBpdCBiZSwgZm9yIHN5bW1ldHJ5PwotICAgICBJdCBpcyBpbiBJU09hbXNuICAtLT4gCi08IUVOVElUWSBuc3ViICAgICAiJiM4ODM2OyI+IDwhLS0gbm90IGEgc3Vic2V0IG9mLCBVKzIyODQgSVNPYW1zbiAtLT4KLTwhRU5USVRZIHN1YmUgICAgICImIzg4Mzg7Ij4gPCEtLSBzdWJzZXQgb2Ygb3IgZXF1YWwgdG8sIFUrMjI4NiBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3VwZSAgICAgIiYjODgzOTsiPiA8IS0tIHN1cGVyc2V0IG9mIG9yIGVxdWFsIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI4NyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb3BsdXMgICAgIiYjODg1MzsiPiA8IS0tIGNpcmNsZWQgcGx1cyA9IGRpcmVjdCBzdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjk1IElTT2Ftc2IgLS0+Ci08IUVOVElUWSBvdGltZXMgICAiJiM4ODU1OyI+IDwhLS0gY2lyY2xlZCB0aW1lcyA9IHZlY3RvciBwcm9kdWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI5NyBJU09hbXNiIC0tPgotPCFFTlRJVFkgcGVycCAgICAgIiYjODg2OTsiPiA8IS0tIHVwIHRhY2sgPSBvcnRob2dvbmFsIHRvID0gcGVycGVuZGljdWxhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyQTUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHNkb3QgICAgICImIzg5MDE7Ij4gPCEtLSBkb3Qgb3BlcmF0b3IsIFUrMjJDNSBJU09hbXNiIC0tPgotPCEtLSBkb3Qgb3BlcmF0b3IgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwQjcgbWlkZGxlIGRvdCAtLT4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIFRlY2huaWNhbCAtLT4KLTwhRU5USVRZIGxjZWlsICAgICImIzg5Njg7Ij4gPCEtLSBsZWZ0IGNlaWxpbmcgPSBhcGwgdXBzdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMDggSVNPYW1zYyAgLS0+Ci08IUVOVElUWSByY2VpbCAgICAiJiM4OTY5OyI+IDwhLS0gcmlnaHQgY2VpbGluZywgVSsyMzA5IElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgbGZsb29yICAgIiYjODk3MDsiPiA8IS0tIGxlZnQgZmxvb3IgPSBhcGwgZG93bnN0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMwQSBJU09hbXNjICAtLT4KLTwhRU5USVRZIHJmbG9vciAgICImIzg5NzE7Ij4gPCEtLSByaWdodCBmbG9vciwgVSsyMzBCIElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgbGFuZyAgICAgIiYjOTAwMTsiPiA8IS0tIGxlZnQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGJyYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMjkgSVNPdGVjaCAtLT4KLTwhLS0gbGFuZyBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDAzQyAnbGVzcyB0aGFuJyAKLSAgICAgb3IgVSsyMDM5ICdzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaycgLS0+Ci08IUVOVElUWSByYW5nICAgICAiJiM5MDAyOyI+IDwhLS0gcmlnaHQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGtldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMkEgSVNPdGVjaCAtLT4KLTwhLS0gcmFuZyBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDAzRSAnZ3JlYXRlciB0aGFuJyAKLSAgICAgb3IgVSsyMDNBICdzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotCi08IS0tIEdlb21ldHJpYyBTaGFwZXMgLS0+Ci08IUVOVElUWSBsb3ogICAgICAiJiM5Njc0OyI+IDwhLS0gbG96ZW5nZSwgVSsyNUNBIElTT3B1YiAtLT4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIFN5bWJvbHMgLS0+Ci08IUVOVElUWSBzcGFkZXMgICAiJiM5ODI0OyI+IDwhLS0gYmxhY2sgc3BhZGUgc3VpdCwgVSsyNjYwIElTT3B1YiAtLT4KLTwhLS0gYmxhY2sgaGVyZSBzZWVtcyB0byBtZWFuIGZpbGxlZCBhcyBvcHBvc2VkIHRvIGhvbGxvdyAtLT4KLTwhRU5USVRZIGNsdWJzICAgICImIzk4Mjc7Ij4gPCEtLSBibGFjayBjbHViIHN1aXQgPSBzaGFtcm9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzI2NjMgSVNPcHViIC0tPgotPCFFTlRJVFkgaGVhcnRzICAgIiYjOTgyOTsiPiA8IS0tIGJsYWNrIGhlYXJ0IHN1aXQgPSB2YWxlbnRpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyNjY1IElTT3B1YiAtLT4KLTwhRU5USVRZIGRpYW1zICAgICImIzk4MzA7Ij4gPCEtLSBibGFjayBkaWFtb25kIHN1aXQsIFUrMjY2NiBJU09wdWIgLS0+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1zcGVjaWFsCi0gICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgInhodG1sLXNwZWNpYWwuZW50IiA+Ci08IS0tIFNwZWNpYWwgY2hhcmFjdGVycyBmb3IgSFRNTCAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgICA8IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgICAgICAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLXNwZWNpYWwuZW50Ij4KLSAgICAgJUhUTUxzcGVjaWFsOwotLS0+Ci0KLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotCi08IS0tIFJlbGV2YW50IElTTyBlbnRpdHkgc2V0IGlzIGdpdmVuIHVubGVzcyBuYW1lcyBhcmUgbmV3bHkgaW50cm9kdWNlZC4KLSAgICAgTmV3IG5hbWVzIChpLmUuLCBub3QgaW4gSVNPIDg4NzkgbGlzdCkgZG8gbm90IGNsYXNoIHdpdGggYW55Ci0gICAgIGV4aXN0aW5nIElTTyA4ODc5IGVudGl0eSBuYW1lcy4gSVNPIDEwNjQ2IGNoYXJhY3RlciBudW1iZXJzCi0gICAgIGFyZSBnaXZlbiBmb3IgZWFjaCBjaGFyYWN0ZXIsIGluIGhleC4gdmFsdWVzIGFyZSBkZWNpbWFsCi0gICAgIGNvbnZlcnNpb25zIG9mIHRoZSBJU08gMTA2NDYgdmFsdWVzIGFuZCByZWZlciB0byB0aGUgZG9jdW1lbnQKLSAgICAgY2hhcmFjdGVyIHNldC4gTmFtZXMgYXJlIFVuaWNvZGUgbmFtZXMuIAotLS0+Ci0KLTwhLS0gQzAgQ29udHJvbHMgYW5kIEJhc2ljIExhdGluIC0tPgotPCFFTlRJVFkgcXVvdCAgICAiJiMzNDsiPiA8IS0tICBxdW90YXRpb24gbWFyayA9IEFQTCBxdW90ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDAyMiBJU09udW0gLS0+Ci08IUVOVElUWSBhbXAgICAgICImIzM4OyMzODsiPiA8IS0tICBhbXBlcnNhbmQsIFUrMDAyNiBJU09udW0gLS0+Ci08IUVOVElUWSBsdCAgICAgICImIzM4OyM2MDsiPiA8IS0tICBsZXNzLXRoYW4gc2lnbiwgVSswMDNDIElTT251bSAtLT4KLTwhRU5USVRZIGd0ICAgICAgIiYjNjI7Ij4gPCEtLSAgZ3JlYXRlci10aGFuIHNpZ24sIFUrMDAzRSBJU09udW0gLS0+Ci08IUVOVElUWSBhcG9zCSAiJiMzOTsiPiA8IS0tICBhcG9zdHJvcGhlIG1hcmssIFUrMDAyNyBJU09udW0gLS0+Ci0KLTwhLS0gTGF0aW4gRXh0ZW5kZWQtQSAtLT4KLTwhRU5USVRZIE9FbGlnICAgIiYjMzM4OyI+IDwhLS0gIGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgT0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNTIgSVNPbGF0MiAtLT4KLTwhRU5USVRZIG9lbGlnICAgIiYjMzM5OyI+IDwhLS0gIGxhdGluIHNtYWxsIGxpZ2F0dXJlIG9lLCBVKzAxNTMgSVNPbGF0MiAtLT4KLTwhLS0gbGlnYXR1cmUgaXMgYSBtaXNub21lciwgdGhpcyBpcyBhIHNlcGFyYXRlIGNoYXJhY3RlciBpbiBzb21lIGxhbmd1YWdlcyAtLT4KLTwhRU5USVRZIFNjYXJvbiAgIiYjMzUyOyI+IDwhLS0gIGxhdGluIGNhcGl0YWwgbGV0dGVyIFMgd2l0aCBjYXJvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE2MCBJU09sYXQyIC0tPgotPCFFTlRJVFkgc2Nhcm9uICAiJiMzNTM7Ij4gPCEtLSAgbGF0aW4gc21hbGwgbGV0dGVyIHMgd2l0aCBjYXJvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE2MSBJU09sYXQyIC0tPgotPCFFTlRJVFkgWXVtbCAgICAiJiMzNzY7Ij4gPCEtLSAgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE3OCBJU09sYXQyIC0tPgotCi08IS0tIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycyAtLT4KLTwhRU5USVRZIGNpcmMgICAgIiYjNzEwOyI+IDwhLS0gIG1vZGlmaWVyIGxldHRlciBjaXJjdW1mbGV4IGFjY2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDJDNiBJU09wdWIgLS0+Ci08IUVOVElUWSB0aWxkZSAgICImIzczMjsiPiA8IS0tICBzbWFsbCB0aWxkZSwgVSswMkRDIElTT2RpYSAtLT4KLQotPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgotPCFFTlRJVFkgZW5zcCAgICAiJiM4MTk0OyI+IDwhLS0gZW4gc3BhY2UsIFUrMjAwMiBJU09wdWIgLS0+Ci08IUVOVElUWSBlbXNwICAgICImIzgxOTU7Ij4gPCEtLSBlbSBzcGFjZSwgVSsyMDAzIElTT3B1YiAtLT4KLTwhRU5USVRZIHRoaW5zcCAgIiYjODIwMTsiPiA8IS0tIHRoaW4gc3BhY2UsIFUrMjAwOSBJU09wdWIgLS0+Ci08IUVOVElUWSB6d25qICAgICImIzgyMDQ7Ij4gPCEtLSB6ZXJvIHdpZHRoIG5vbi1qb2luZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMEMgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgendqICAgICAiJiM4MjA1OyI+IDwhLS0gemVybyB3aWR0aCBqb2luZXIsIFUrMjAwRCBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBscm0gICAgICImIzgyMDY7Ij4gPCEtLSBsZWZ0LXRvLXJpZ2h0IG1hcmssIFUrMjAwRSBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBybG0gICAgICImIzgyMDc7Ij4gPCEtLSByaWdodC10by1sZWZ0IG1hcmssIFUrMjAwRiBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBuZGFzaCAgICImIzgyMTE7Ij4gPCEtLSBlbiBkYXNoLCBVKzIwMTMgSVNPcHViIC0tPgotPCFFTlRJVFkgbWRhc2ggICAiJiM4MjEyOyI+IDwhLS0gZW0gZGFzaCwgVSsyMDE0IElTT3B1YiAtLT4KLTwhRU5USVRZIGxzcXVvICAgIiYjODIxNjsiPiA8IS0tIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDE4IElTT251bSAtLT4KLTwhRU5USVRZIHJzcXVvICAgIiYjODIxNzsiPiA8IS0tIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxOSBJU09udW0gLS0+Ci08IUVOVElUWSBzYnF1byAgICImIzgyMTg7Ij4gPCEtLSBzaW5nbGUgbG93LTkgcXVvdGF0aW9uIG1hcmssIFUrMjAxQSBORVcgLS0+Ci08IUVOVElUWSBsZHF1byAgICImIzgyMjA7Ij4gPCEtLSBsZWZ0IGRvdWJsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxQyBJU09udW0gLS0+Ci08IUVOVElUWSByZHF1byAgICImIzgyMjE7Ij4gPCEtLSByaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMUQgSVNPbnVtIC0tPgotPCFFTlRJVFkgYmRxdW8gICAiJiM4MjIyOyI+IDwhLS0gZG91YmxlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUUgTkVXIC0tPgotPCFFTlRJVFkgZGFnZ2VyICAiJiM4MjI0OyI+IDwhLS0gZGFnZ2VyLCBVKzIwMjAgSVNPcHViIC0tPgotPCFFTlRJVFkgRGFnZ2VyICAiJiM4MjI1OyI+IDwhLS0gZG91YmxlIGRhZ2dlciwgVSsyMDIxIElTT3B1YiAtLT4KLTwhRU5USVRZIHBlcm1pbCAgIiYjODI0MDsiPiA8IS0tIHBlciBtaWxsZSBzaWduLCBVKzIwMzAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxzYXF1byAgIiYjODI0OTsiPiA8IS0tIHNpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDM5IElTTyBwcm9wb3NlZCAtLT4KLTwhLS0gbHNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSByc2FxdW8gICImIzgyNTA7Ij4gPCEtLSBzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwM0EgSVNPIHByb3Bvc2VkIC0tPgotPCEtLSByc2FxdW8gaXMgcHJvcG9zZWQgYnV0IG5vdCB5ZXQgSVNPIHN0YW5kYXJkaXplZCAtLT4KLTwhRU5USVRZIGV1cm8gICAiJiM4MzY0OyI+IDwhLS0gIGV1cm8gc2lnbiwgVSsyMEFDIE5FVyAtLT4KLQotCi08IS0tIGVuZCBvZiB4aHRtbC1jaGFyZW50LTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWZyYW1ld29yay0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFBvc3QtRnJhbWV3b3JrIFJlZGVjbGFyYXRpb24gcGxhY2Vob2xkZXIgIC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIHRoaXMgc2VydmVzIGFzIGEgbG9jYXRpb24gdG8gaW5zZXJ0IG1hcmt1cCBkZWNsYXJhdGlvbnMKLSAgICAgaW50byB0aGUgRFREIGZvbGxvd2luZyB0aGUgZnJhbWV3b3JrIGRlY2xhcmF0aW9ucy4KLS0tPgotPCFFTlRJVFkgJSB4aHRtbC1wb3N0ZnctcmVkZWNsLm1vZHVsZSAiSUdOT1JFIiA+Ci08IVsleGh0bWwtcG9zdGZ3LXJlZGVjbC5tb2R1bGU7WwotJXhodG1sLXBvc3Rmdy1yZWRlY2wubW9kOwotPCEtLSBlbmQgb2YgeGh0bWwtcG9zdGZ3LXJlZGVjbC5tb2R1bGUgLS0+XV0+Ci0KLTwhLS0gVGV4dCBNb2R1bGUgKFJlcXVpcmVkKSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtdGV4dC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC10ZXh0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXRleHQubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBUZXh0IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXRleHQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgVGV4dCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtdGV4dC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBUZXh0IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtdGV4dC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBUZXh0dWFsIENvbnRlbnQKLQotICAgICBUaGUgVGV4dCBtb2R1bGUgaW5jbHVkZXMgZGVjbGFyYXRpb25zIGZvciBhbGwgY29yZQotICAgICB0ZXh0IGNvbnRhaW5lciBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcy4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWlubHN0cnVjdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbmxzdHJ1Y3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtaW5sc3RydWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW5saW5lIFN0cnVjdHVyYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW5sc3RydWN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBTdHJ1Y3R1cmFsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5sc3RydWN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIElubGluZSBTdHJ1Y3R1cmFsCi0KLSAgICAgICAgYnIsIHNwYW4KLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMKLSAgICAgdXNlZCB0byBzdXBwb3J0IGlubGluZS1sZXZlbCBzdHJ1Y3R1cmFsIG1hcmt1cC4KLS0tPgotCi08IS0tIGJyOiBmb3JjZWQgbGluZSBicmVhayAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBici5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJyLmVsZW1lbnQ7WwotCi08IUVOVElUWSAlIGJyLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBici5xbmFtZSAgImJyIiA+Ci08IUVMRU1FTlQgJWJyLnFuYW1lOyAgJWJyLmNvbnRlbnQ7ID4KLQotPCEtLSBlbmQgb2YgYnIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBici5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVici5xbmFtZTsKLSAgICAgICVDb3JlLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGJyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gc3BhbjogZ2VuZXJpYyBpbmxpbmUgY29udGFpbmVyIC4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHNwYW4uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzcGFuLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzcGFuLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3Bhbi5xbmFtZSAgInNwYW4iID4KLTwhRUxFTUVOVCAlc3Bhbi5xbmFtZTsgICVzcGFuLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNwYW4uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzcGFuLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3Bhbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3Bhbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc3Bhbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1pbmxwaHJhcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbmxwaHJhcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1pbmxwaHJhcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaW5scGhyYXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW5saW5lIFBocmFzYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW5scGhyYXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxwaHJhcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbmxpbmUgUGhyYXNhbAotCi0gICAgICAgIGFiYnIsIGFjcm9ueW0sIGNpdGUsIGNvZGUsIGRmbiwgZW0sIGtiZCwgcSwgc2FtcCwgc3Ryb25nLCB2YXIKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGlubGluZS1sZXZlbCBwaHJhc2FsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGFiYnIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhYmJyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhYmJyLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYWJici5xbmFtZSAgImFiYnIiID4KLTwhRUxFTUVOVCAlYWJici5xbmFtZTsgICVhYmJyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFiYnIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhYmJyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWJici5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWJici5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWJici5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGFjcm9ueW0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhY3JvbnltLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhY3JvbnltLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYWNyb255bS5xbmFtZSAgImFjcm9ueW0iID4KLTwhRUxFTUVOVCAlYWNyb255bS5xbmFtZTsgICVhY3JvbnltLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFjcm9ueW0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhY3JvbnltLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWNyb255bS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWNyb255bS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWNyb255bS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGNpdGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjaXRlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjaXRlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgY2l0ZS5xbmFtZSAgImNpdGUiID4KLTwhRUxFTUVOVCAlY2l0ZS5xbmFtZTsgICVjaXRlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNpdGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjaXRlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY2l0ZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY2l0ZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY2l0ZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGNvZGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjb2RlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjb2RlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgY29kZS5xbmFtZSAgImNvZGUiID4KLTwhRUxFTUVOVCAlY29kZS5xbmFtZTsgICVjb2RlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNvZGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjb2RlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY29kZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY29kZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY29kZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGRmbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRmbi5lbGVtZW50O1sKLTwhRU5USVRZICUgZGZuLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZGZuLnFuYW1lICAiZGZuIiA+Ci08IUVMRU1FTlQgJWRmbi5xbmFtZTsgICVkZm4uY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGZuLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGZuLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGZuLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkZm4ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRmbi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGVtLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZW0uZWxlbWVudDtbCi08IUVOVElUWSAlIGVtLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZW0ucW5hbWUgICJlbSIgPgotPCFFTEVNRU5UICVlbS5xbmFtZTsgICVlbS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBlbS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGVtLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZW0uYXR0bGlzdDtbCi08IUFUVExJU1QgJWVtLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBlbS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGtiZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWtiZC5lbGVtZW50O1sKLTwhRU5USVRZICUga2JkLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUga2JkLnFuYW1lICAia2JkIiA+Ci08IUVMRU1FTlQgJWtiZC5xbmFtZTsgICVrYmQuY29udGVudDsgPgotPCEtLSBlbmQgb2Yga2JkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUga2JkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsla2JkLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVrYmQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGtiZC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVxLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBxLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgcS5xbmFtZSAgInEiID4KLTwhRUxFTUVOVCAlcS5xbmFtZTsgICVxLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBxLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2l0ZSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgcS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHNhbXAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzYW1wLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzYW1wLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc2FtcC5xbmFtZSAgInNhbXAiID4KLTwhRUxFTUVOVCAlc2FtcC5xbmFtZTsgICVzYW1wLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNhbXAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzYW1wLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc2FtcC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc2FtcC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc2FtcC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHN0cm9uZy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN0cm9uZy5lbGVtZW50O1sKLTwhRU5USVRZICUgc3Ryb25nLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3Ryb25nLnFuYW1lICAic3Ryb25nIiA+Ci08IUVMRU1FTlQgJXN0cm9uZy5xbmFtZTsgICVzdHJvbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3Ryb25nLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3Ryb25nLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3Ryb25nLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzdHJvbmcucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHN0cm9uZy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHZhci5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXZhci5lbGVtZW50O1sKLTwhRU5USVRZICUgdmFyLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgdmFyLnFuYW1lICAidmFyIiA+Ci08IUVMRU1FTlQgJXZhci5xbmFtZTsgICV2YXIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdmFyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdmFyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldmFyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV2YXIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHZhci5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxwaHJhcy0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWJsa3N0cnVjdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ibGtzdHJ1Y3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYmxrc3RydWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJsa3N0cnVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCbG9jayBTdHJ1Y3R1cmFsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJsa3N0cnVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCbG9jayBTdHJ1Y3R1cmFsCi0KLSAgICAgICAgZGl2LCBwCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBibG9jay1sZXZlbCBzdHJ1Y3R1cmFsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGRpdi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRpdi5lbGVtZW50O1sKLTwhRU5USVRZICUgZGl2LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGRpdi5xbmFtZSAgImRpdiIgPgotPCFFTEVNRU5UICVkaXYucW5hbWU7ICAlZGl2LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRpdi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRpdi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRpdi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGl2LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkaXYuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcC5lbGVtZW50O1sKLTwhRU5USVRZICUgcC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiID4KLTwhRU5USVRZICUgcC5xbmFtZSAgInAiID4KLTwhRUxFTUVOVCAlcC5xbmFtZTsgICVwLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgcC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ibGtwaHJhcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ibGtwaHJhcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ibGtwaHJhcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ibGtwaHJhcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCbG9jayBQaHJhc2FsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ibGtwaHJhcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmxrcGhyYXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmxvY2sgUGhyYXNhbAotCi0gICAgICAgIGFkZHJlc3MsIGJsb2NrcXVvdGUsIHByZSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgYmxvY2stbGV2ZWwgcGhyYXNhbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBhZGRyZXNzLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYWRkcmVzcy5lbGVtZW50O1sKLTwhRU5USVRZICUgYWRkcmVzcy5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiID4KLTwhRU5USVRZICUgYWRkcmVzcy5xbmFtZSAgImFkZHJlc3MiID4KLTwhRUxFTUVOVCAlYWRkcmVzcy5xbmFtZTsgICVhZGRyZXNzLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFkZHJlc3MuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhZGRyZXNzLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWRkcmVzcy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWRkcmVzcy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWRkcmVzcy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGJsb2NrcXVvdGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVibG9ja3F1b3RlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBibG9ja3F1b3RlLmNvbnRlbnQKLSAgICAgIiggJUJsb2NrLm1peDsgKSsiCi0+Ci08IUVOVElUWSAlIGJsb2NrcXVvdGUucW5hbWUgICJibG9ja3F1b3RlIiA+Ci08IUVMRU1FTlQgJWJsb2NrcXVvdGUucW5hbWU7ICAlYmxvY2txdW90ZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBibG9ja3F1b3RlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmxvY2txdW90ZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJsb2NrcXVvdGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJsb2NrcXVvdGUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGNpdGUgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGJsb2NrcXVvdGUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwcmUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVwcmUuZWxlbWVudDtbCi08IUVOVElUWSAlIHByZS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEKLSAgICAgIHwgJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgIHwgJXR0LnFuYW1lOyB8ICVpLnFuYW1lOyB8ICViLnFuYW1lOwotICAgICAgJUkxOG4uY2xhc3M7Ci0gICAgICAlQW5jaG9yLmNsYXNzOwotICAgICAgfCAlc2NyaXB0LnFuYW1lOyB8ICVtYXAucW5hbWU7Ci0gICAgICAlSW5saW5lLmV4dHJhOyApKiIKLT4KLTwhRU5USVRZICUgcHJlLnFuYW1lICAicHJlIiA+Ci08IUVMRU1FTlQgJXByZS5xbmFtZTsgICVwcmUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcHJlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcHJlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcHJlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVwcmUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHhtbDpzcGFjZSAgICAoIHByZXNlcnZlICkgICAgICAgICAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLT4KLTwhLS0gZW5kIG9mIHByZS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4gIEhlYWRpbmcgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgSGVhZGluZy5jb250ZW50ICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIiA+Ci0KLTwhRU5USVRZICUgaDEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoMS5lbGVtZW50O1sKLTwhRU5USVRZICUgaDEucW5hbWUgICJoMSIgPgotPCFFTEVNRU5UICVoMS5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGgxLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoMS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGgxLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoMi5lbGVtZW50O1sKLTwhRU5USVRZICUgaDIucW5hbWUgICJoMiIgPgotPCFFTEVNRU5UICVoMi5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGgyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoMi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGgyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDMuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoMy5lbGVtZW50O1sKLTwhRU5USVRZICUgaDMucW5hbWUgICJoMyIgPgotPCFFTEVNRU5UICVoMy5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGgzLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDMuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoMy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDMucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGgzLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoNC5lbGVtZW50O1sKLTwhRU5USVRZICUgaDQucW5hbWUgICJoNCIgPgotPCFFTEVNRU5UICVoNC5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGg0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoNC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGg0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoNS5lbGVtZW50O1sKLTwhRU5USVRZICUgaDUucW5hbWUgICJoNSIgPgotPCFFTEVNRU5UICVoNS5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGg1LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoNS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGg1LmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDYuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoNi5lbGVtZW50O1sKLTwhRU5USVRZICUgaDYucW5hbWUgICJoNiIgPgotPCFFTEVNRU5UICVoNi5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGg2LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDYuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoNi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDYucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGg2LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJsa3BocmFzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXRleHQtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBIeXBlcnRleHQgTW9kdWxlIChyZXF1aXJlZCkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1oeXBlcnRleHQubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtaHlwZXJ0ZXh0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWh5cGVydGV4dC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEh5cGVydGV4dCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1oeXBlcnRleHQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSHlwZXJ0ZXh0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaHlwZXJ0ZXh0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEh5cGVydGV4dCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWh5cGVydGV4dC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBIeXBlcnRleHQKLQotICAgICAgICBhCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGFuY2hvciAoJ2EnKSBlbGVtZW50IHR5cGUsIHdoaWNoCi0gICAgIGRlZmluZXMgdGhlIHNvdXJjZSBvZiBhIGh5cGVydGV4dCBsaW5rLiBUaGUgZGVzdGluYXRpb24KLSAgICAgKG9yIGxpbmsgJ3RhcmdldCcpIGlzIGlkZW50aWZpZWQgdmlhIGl0cyAnaWQnIGF0dHJpYnV0ZQotICAgICByYXRoZXIgdGhhbiB0aGUgJ25hbWUnIGF0dHJpYnV0ZSBhcyB3YXMgdXNlZCBpbiBIVE1MLgotLS0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uICBBbmNob3IgRWxlbWVudCAgLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxOb0FuY2hvci5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBhLnFuYW1lICAiYSIgPgotPCFFTEVNRU5UICVhLnFuYW1lOyAgJWEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBocmVmICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjaGFyc2V0ICAgICAgJUNoYXJzZXQuZGF0YXR5cGU7ICAgICAgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICBocmVmbGFuZyAgICAgJUxhbmd1YWdlQ29kZS5kYXRhdHlwZTsgICNJTVBMSUVECi0gICAgICByZWwgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICByZXYgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBhLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWh5cGVydGV4dC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIExpc3RzIE1vZHVsZSAocmVxdWlyZWQpICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWxpc3QubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbGlzdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1saXN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGlzdHMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGlzdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBMaXN0cyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1saXN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpc3RzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGlzdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBMaXN0cwotCi0gICAgICAgIGRsLCBkdCwgZGQsIG9sLCB1bCwgbGkKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgbGlzdC1vcmllbnRlZCBlbGVtZW50IHR5cGVzCi0gICAgIGFuZCB0aGVpciBhdHRyaWJ1dGVzLgotLS0+Ci0KLTwhRU5USVRZICUgZGwucW5hbWUgICJkbCIgPgotPCFFTlRJVFkgJSBkdC5xbmFtZSAgImR0IiA+Ci08IUVOVElUWSAlIGRkLnFuYW1lICAiZGQiID4KLTwhRU5USVRZICUgb2wucW5hbWUgICJvbCIgPgotPCFFTlRJVFkgJSB1bC5xbmFtZSAgInVsIiA+Ci08IUVOVElUWSAlIGxpLnFuYW1lICAibGkiID4KLQotPCEtLSBkbDogRGVmaW5pdGlvbiBMaXN0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZGwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkbC5lbGVtZW50O1sKLTwhRU5USVRZICUgZGwuY29udGVudCAgIiggJWR0LnFuYW1lOyB8ICVkZC5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAlZGwucW5hbWU7ICAlZGwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBkdDogRGVmaW5pdGlvbiBUZXJtIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZHQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkdC5lbGVtZW50O1sKLTwhRU5USVRZICUgZHQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICVkdC5xbmFtZTsgICVkdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGR0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZHQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWR0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGRkOiBEZWZpbml0aW9uIERlc2NyaXB0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBkZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkZC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTEVNRU5UICVkZC5xbmFtZTsgICVkZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWRkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG9sOiBPcmRlcmVkIExpc3QgKG51bWJlcmVkIHN0eWxlcykgLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW9sLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvbC5jb250ZW50ICAiKCAlbGkucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJW9sLnFuYW1lOyAgJW9sLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG9sLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb2wuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVvbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlb2wucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIG9sLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdWw6IFVub3JkZXJlZCBMaXN0IChidWxsZXQgc3R5bGVzKSAuLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHVsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldWwuZWxlbWVudDtbCi08IUVOVElUWSAlIHVsLmNvbnRlbnQgICIoICVsaS5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAldWwucW5hbWU7ICAldWwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdWwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB1bC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXVsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV1bC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBsaTogTGlzdCBJdGVtIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbGkuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVsaS5lbGVtZW50O1sKLTwhRU5USVRZICUgbGkuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlbGkucW5hbWU7ICAlbGkuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbGkuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsaS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWxpLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVsaS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgbGkuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbGlzdC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IC0tPgotCi08IS0tIEVkaXQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWVkaXQubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtZWRpdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1lZGl0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRWRpdGluZyBFbGVtZW50cyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1lZGl0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEVkaXRpbmcgRWxlbWVudHMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWVkaXQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRWRpdGluZyBNYXJrdXAgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1lZGl0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEVkaXRpbmcgRWxlbWVudHMKLQotICAgICAgICBpbnMsIGRlbAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZXMgdXNlZCB0byBpbmRpY2F0ZQotICAgICBpbnNlcnRlZCBhbmQgZGVsZXRlZCBjb250ZW50IHdoaWxlIGVkaXRpbmcgYSBkb2N1bWVudC4KLS0tPgotCi08IS0tIGluczogSW5zZXJ0ZWQgVGV4dCAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBpbnMuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVpbnMuZWxlbWVudDtbCi08IUVOVElUWSAlIGlucy5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBpbnMucW5hbWUgICJpbnMiID4KLTwhRUxFTUVOVCAlaW5zLnFuYW1lOyAgJWlucy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBpbnMuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBpbnMuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVpbnMuYXR0bGlzdDtbCi08IUFUVExJU1QgJWlucy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2l0ZSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgZGF0ZXRpbWUgICAgICVEYXRldGltZS5kYXRhdHlwZTsgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgaW5zLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZGVsOiBEZWxldGVkIFRleHQgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGRlbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRlbC5lbGVtZW50O1sKLTwhRU5USVRZICUgZGVsLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGRlbC5xbmFtZSAgImRlbCIgPgotPCFFTEVNRU5UICVkZWwucW5hbWU7ICAlZGVsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRlbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRlbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRlbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGVsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBjaXRlICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBkYXRldGltZSAgICAgJURhdGV0aW1lLmRhdGF0eXBlOyAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBkZWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtZWRpdC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIEJJREkgT3ZlcnJpZGUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWJkby5tb2R1bGUgIiVYSFRNTC5iaWRpOyIgPgotPCFbJXhodG1sLWJkby5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1iZG8ubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCSURJIE92ZXJyaWRlIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmRvLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJETyBFbGVtZW50IE1vZHVsZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJkby0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCRE8gRWxlbWVudCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJkby0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCaWRpcmVjdGlvbmFsIE92ZXJyaWRlIChiZG8pIEVsZW1lbnQKLQotICAgICBUaGlzIG1vZHVsZXMgZGVjbGFyZXMgdGhlIGVsZW1lbnQgJ2JkbycsIHVzZWQgdG8gb3ZlcnJpZGUgdGhlCi0gICAgIFVuaWNvZGUgYmlkaXJlY3Rpb25hbCBhbGdvcml0aG0gZm9yIHNlbGVjdGVkIGZyYWdtZW50cyBvZiB0ZXh0LgotCi0gICAgIERFUEVOREVOQ0lFUzoKLSAgICAgUmVsaWVzIG9uIHRoZSBjb25kaXRpb25hbCBzZWN0aW9uIGtleXdvcmQgJVhIVE1MLmJpZGk7IGRlY2xhcmVkCi0gICAgIGFzICJJTkNMVURFIi4gQmlkaXJlY3Rpb25hbCB0ZXh0IHN1cHBvcnQgaW5jbHVkZXMgYm90aCB0aGUgYmRvCi0gICAgIGVsZW1lbnQgYW5kIHRoZSAnZGlyJyBhdHRyaWJ1dGUuCi0tLT4KLQotPCFFTlRJVFkgJSBiZG8uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyViZG8uZWxlbWVudDtbCi08IUVOVElUWSAlIGJkby5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGJkby5xbmFtZSAgImJkbyIgPgotPCFFTEVNRU5UICViZG8ucW5hbWU7ICAlYmRvLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJkby5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJkby5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJkby5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYmRvLnFuYW1lOwotICAgICAgJUNvcmUuYXR0cmliOwotICAgICAgeG1sOmxhbmcgICAgICVMYW5ndWFnZUNvZGUuZGF0YXR5cGU7ICAjSU1QTElFRAotICAgICAgZGlyICAgICAgICAgICggbHRyIHwgcnRsICkgICAgICAgICAgICAjUkVRVUlSRUQKLT4KLV1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1iZG8tMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBSdWJ5IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSBSdWJ5LmNvbW1vbi5hdHRsaXN0cyAiSU5DTFVERSIgPgotPCFFTlRJVFkgJSBSdWJ5LmNvbW1vbi5hdHRyaWIgIiVDb21tb24uYXR0cmliOyIgPgotPCFFTlRJVFkgJSB4aHRtbC1ydWJ5Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXJ1YnkubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtcnVieS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFJ1YnkgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9ydWJ5L3hodG1sLXJ1YnktMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgUnVieSBNb2R1bGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtcnVieS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk5LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0KLSAgICAgVGhpcyBtb2R1bGUgaXMgYmFzZWQgb24gdGhlIFczQyBSdWJ5IEFubm90YXRpb24gU3BlY2lmaWNhdGlvbjoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9ydWJ5Ci0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFJ1YnkgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3J1YnkveGh0bWwtcnVieS0xLm1vZCIKLQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFJ1YnkgRWxlbWVudHMKLQotICAgICAgICBydWJ5LCByYmMsIHJ0YywgcmIsIHJ0LCBycAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgcnVieSBhbm5vdGF0aW9uIG1hcmt1cC4KLS0tPgotCi08IS0tIGRlY2xhcmUgcXVhbGlmaWVkIGVsZW1lbnQgdHlwZSBuYW1lczoKLS0tPgotPCFFTlRJVFkgJSBydWJ5LnFuYW1lICAicnVieSIgPgotPCFFTlRJVFkgJSByYmMucW5hbWUgICJyYmMiID4KLTwhRU5USVRZICUgcnRjLnFuYW1lICAicnRjIiA+Ci08IUVOVElUWSAlIHJiLnFuYW1lICAicmIiID4KLTwhRU5USVRZICUgcnQucW5hbWUgICJydCIgPgotPCFFTlRJVFkgJSBycC5xbmFtZSAgInJwIiA+Ci0KLTwhLS0gcnAgZmFsbGJhY2sgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdC4KLS0tPgotPCFFTlRJVFkgJSBSdWJ5LmZhbGxiYWNrICJJTkNMVURFIiA+Ci08IUVOVElUWSAlIFJ1YnkuZmFsbGJhY2subWFuZGF0b3J5ICJJR05PUkUiID4KLQotPCEtLSBDb21wbGV4IHJ1YnkgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdDsgaXQgbWF5IGJlIAotICAgICBvdmVycmlkZGVuIGJ5IG90aGVyIG1vZHVsZXMgdG8gaWdub3JlIGl0LgotLS0+Ci08IUVOVElUWSAlIFJ1YnkuY29tcGxleCAiSU5DTFVERSIgPgotCi08IS0tIEZyYWdtZW50cyBmb3IgdGhlIGNvbnRlbnQgbW9kZWwgb2YgdGhlIHJ1YnkgZWxlbWVudCAtLT4KLTwhWyVSdWJ5LmZhbGxiYWNrO1sKLTwhWyVSdWJ5LmZhbGxiYWNrLm1hbmRhdG9yeTtbCi08IUVOVElUWSAlIFJ1YnkuY29udGVudC5zaW1wbGUgCi0gICAgICIoICVyYi5xbmFtZTssICVycC5xbmFtZTssICVydC5xbmFtZTssICVycC5xbmFtZTsgKSIKLT4KLV1dPgotPCFFTlRJVFkgJSBSdWJ5LmNvbnRlbnQuc2ltcGxlIAotICAgICAiKCAlcmIucW5hbWU7LCAoICVydC5xbmFtZTsgfCAoICVycC5xbmFtZTssICVydC5xbmFtZTssICVycC5xbmFtZTsgKSApICkiCi0+Ci1dXT4KLTwhRU5USVRZICUgUnVieS5jb250ZW50LnNpbXBsZSAiKCAlcmIucW5hbWU7LCAlcnQucW5hbWU7ICkiID4KLQotPCFbJVJ1YnkuY29tcGxleDtbCi08IUVOVElUWSAlIFJ1YnkuY29udGVudC5jb21wbGV4IAotICAgICAifCAoICVyYmMucW5hbWU7LCAlcnRjLnFuYW1lOywgJXJ0Yy5xbmFtZTs/ICkiCi0+Ci1dXT4KLTwhRU5USVRZICUgUnVieS5jb250ZW50LmNvbXBsZXggIiIgPgotCi08IS0tIENvbnRlbnQgbW9kZWxzIG9mIHRoZSByYiBhbmQgdGhlIHJ0IGVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0bwotICAgICBhbGxvdyBvdGhlciBpbmxpbmUtbGV2ZWwgZWxlbWVudHMgb2YgaXRzIHBhcmVudCBtYXJrdXAgbGFuZ3VhZ2UsCi0gICAgIGJ1dCBpdCBzaG91bGQgbm90IGluY2x1ZGUgcnVieSBkZXNjZW5kZW50IGVsZW1lbnRzLiBUaGUgZm9sbG93aW5nCi0gICAgIHBhcmFtZXRlciBlbnRpdHkgJU5vUnVieS5jb250ZW50OyBjYW4gYmUgdXNlZCB0byByZWRlZmluZQotICAgICB0aG9zZSBjb250ZW50IG1vZGVscyB3aXRoIG1pbmltdW0gZWZmb3J0LiAgSXQncyBkZWZpbmVkIGFzCi0gICAgICcoICNQQ0RBVEEgKScgYnkgZGVmYXVsdC4KLS0tPgotPCFFTlRJVFkgJSBOb1J1YnkuY29udGVudCAiKCAjUENEQVRBICkiID4KLQotPCEtLSBvbmUgb3IgbW9yZSBkaWdpdHMgKE5VTUJFUikgLS0+Ci08IUVOVElUWSAlIE51bWJlci5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBydWJ5IGVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgcnVieS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXJ1YnkuZWxlbWVudDtbCi08IUVOVElUWSAlIHJ1YnkuY29udGVudAotICAgICAiKCAlUnVieS5jb250ZW50LnNpbXBsZTsgJVJ1YnkuY29udGVudC5jb21wbGV4OyApIgotPgotPCFFTEVNRU5UICVydWJ5LnFuYW1lOyAgJXJ1YnkuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcnVieS5lbGVtZW50IC0tPl1dPgotCi08IVslUnVieS5jb21wbGV4O1sKLTwhLS0gcmJjIChydWJ5IGJhc2UgY29tcG9uZW50KSBlbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHJiYy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXJiYy5lbGVtZW50O1sKLTwhRU5USVRZICUgcmJjLmNvbnRlbnQKLSAgICAgIiglcmIucW5hbWU7KSsiCi0+Ci08IUVMRU1FTlQgJXJiYy5xbmFtZTsgICVyYmMuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcmJjLmVsZW1lbnQgLS0+XV0+Ci0KLTwhLS0gcnRjIChydWJ5IHRleHQgY29tcG9uZW50KSBlbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHJ0Yy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXJ0Yy5lbGVtZW50O1sKLTwhRU5USVRZICUgcnRjLmNvbnRlbnQKLSAgICAgIiglcnQucW5hbWU7KSsiCi0+Ci08IUVMRU1FTlQgJXJ0Yy5xbmFtZTsgICVydGMuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcnRjLmVsZW1lbnQgLS0+XV0+Ci1dXT4KLQotPCEtLSByYiAocnVieSBiYXNlKSBlbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgcmIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVyYi5lbGVtZW50O1sKLTwhLS0gJXJiLmNvbnRlbnQ7IHVzZXMgJU5vUnVieS5jb250ZW50OyBhcyBpdHMgY29udGVudCBtb2RlbCwKLSAgICAgd2hpY2ggaXMgJyggI1BDREFUQSApJyBieSBkZWZhdWx0LiBJdCBtYXkgYmUgb3ZlcnJpZGRlbgotICAgICBieSBvdGhlciBtb2R1bGVzIHRvIGFsbG93IG90aGVyIGlubGluZS1sZXZlbCBlbGVtZW50cwotICAgICBvZiBpdHMgcGFyZW50IG1hcmt1cCBsYW5ndWFnZSwgYnV0IGl0IHNob3VsZCBub3QgaW5jbHVkZQotICAgICBydWJ5IGRlc2NlbmRlbnQgZWxlbWVudHMuCi0tLT4KLTwhRU5USVRZICUgcmIuY29udGVudCAiJU5vUnVieS5jb250ZW50OyIgPgotPCFFTEVNRU5UICVyYi5xbmFtZTsgICVyYi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiByYi5lbGVtZW50IC0tPl1dPgotCi08IS0tIHJ0IChydWJ5IHRleHQpIGVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBydC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXJ0LmVsZW1lbnQ7WwotPCEtLSAlcnQuY29udGVudDsgdXNlcyAlTm9SdWJ5LmNvbnRlbnQ7IGFzIGl0cyBjb250ZW50IG1vZGVsLAotICAgICB3aGljaCBpcyAnKCAjUENEQVRBICknIGJ5IGRlZmF1bHQuIEl0IG1heSBiZSBvdmVycmlkZGVuCi0gICAgIGJ5IG90aGVyIG1vZHVsZXMgdG8gYWxsb3cgb3RoZXIgaW5saW5lLWxldmVsIGVsZW1lbnRzCi0gICAgIG9mIGl0cyBwYXJlbnQgbWFya3VwIGxhbmd1YWdlLCBidXQgaXQgc2hvdWxkIG5vdCBpbmNsdWRlCi0gICAgIHJ1YnkgZGVzY2VuZGVudCBlbGVtZW50cy4KLS0tPgotPCFFTlRJVFkgJSBydC5jb250ZW50ICIlTm9SdWJ5LmNvbnRlbnQ7IiA+Ci0KLTwhRUxFTUVOVCAlcnQucW5hbWU7ICAlcnQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcnQuZWxlbWVudCAtLT5dXT4KLQotPCEtLSByYnNwYW4gYXR0cmlidXRlIGlzIHVzZWQgZm9yIGNvbXBsZXggcnVieSBvbmx5IC4uLi4uLiAtLT4KLTwhWyVSdWJ5LmNvbXBsZXg7WwotPCFFTlRJVFkgJSBydC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXJ0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVydC5xbmFtZTsKLSAgICAgIHJic3BhbiAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgIjEiCi0+Ci08IS0tIGVuZCBvZiBydC5hdHRsaXN0IC0tPl1dPgotXV0+Ci0KLTwhLS0gcnAgKHJ1YnkgcGFyZW50aGVzaXMpIGVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IVslUnVieS5mYWxsYmFjaztbCi08IUVOVElUWSAlIHJwLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcnAuZWxlbWVudDtbCi08IUVOVElUWSAlIHJwLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSApIgotPgotPCFFTEVNRU5UICVycC5xbmFtZTsgICVycC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBycC5lbGVtZW50IC0tPl1dPgotXV0+Ci0KLTwhLS0gUnVieSBDb21tb24gQXR0cmlidXRlcwotCi0gICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgQVRUTElTVCBkZWNsYXJhdGlvbnMgcHJvdmlkZSBhbiBlYXN5IHdheQotICAgICB0byBkZWZpbmUgY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHJ1YnkgZWxlbWVudHMuICBUaGVzZSBkZWNsYXJhdGlvbnMKLSAgICAgYXJlIGlnbm9yZWQgYnkgZGVmYXVsdC4KLQotICAgICBSdWJ5IGVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBoYXZlIGNvbW1vbiBhdHRyaWJ1dGVzIG9mIGl0cwotICAgICBwYXJlbnQgbWFya3VwIGxhbmd1YWdlLiAgRm9yIGV4YW1wbGUsIGlmIGEgbWFya3VwIGxhbmd1YWdlIGRlZmluZXMKLSAgICAgY29tbW9uIGF0dHJpYnV0ZXMgYXMgYSBwYXJhbWV0ZXIgZW50aXR5ICVhdHRyczssIHlvdSBtYXkgYWRkCi0gICAgIHRob3NlIGF0dHJpYnV0ZXMgYnkganVzdCBkZWNsYXJpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgZW50aXRpZXMKLQotICAgICAgICAgPCFFTlRJVFkgJSBSdWJ5LmNvbW1vbi5hdHRsaXN0cyAgIklOQ0xVREUiID4KLSAgICAgICAgIDwhRU5USVRZICUgUnVieS5jb21tb24uYXR0cmliICAiJWF0dHJzOyIgPgotCi0gICAgIGJlZm9yZSBpbmNsdWRpbmcgdGhlIFJ1YnkgbW9kdWxlLgotLS0+Ci0KLTwhRU5USVRZICUgUnVieS5jb21tb24uYXR0bGlzdHMgICJJR05PUkUiID4KLTwhWyVSdWJ5LmNvbW1vbi5hdHRsaXN0cztbCi08IUVOVElUWSAlIFJ1YnkuY29tbW9uLmF0dHJpYiAgIiIgPgotCi08IS0tIGNvbW1vbiBhdHRyaWJ1dGVzIGZvciBydWJ5IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBSdWJ5LmNvbW1vbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJVJ1YnkuY29tbW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVydWJ5LnFuYW1lOwotICAgICAgJVJ1YnkuY29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIFJ1YnkuY29tbW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhWyVSdWJ5LmNvbXBsZXg7WwotPCEtLSBjb21tb24gYXR0cmlidXRlcyBmb3IgcmJjIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgUmJjLmNvbW1vbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJVJiYy5jb21tb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJXJiYy5xbmFtZTsKLSAgICAgICVSdWJ5LmNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBSYmMuY29tbW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHJ0YyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIFJ0Yy5jb21tb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVSdGMuY29tbW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVydGMucW5hbWU7Ci0gICAgICAlUnVieS5jb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgUnRjLmNvbW1vbi5hdHRsaXN0IC0tPl1dPgotXV0+Ci0KLTwhLS0gY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHJiIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIFJiLmNvbW1vbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJVJiLmNvbW1vbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcmIucW5hbWU7Ci0gICAgICAlUnVieS5jb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgUmIuY29tbW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHJ0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIFJ0LmNvbW1vbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJVJ0LmNvbW1vbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcnQucW5hbWU7Ci0gICAgICAlUnVieS5jb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgUnQuY29tbW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhWyVSdWJ5LmZhbGxiYWNrO1sKLTwhLS0gY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHJwIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIFJwLmNvbW1vbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJVJwLmNvbW1vbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcnAucW5hbWU7Ci0gICAgICAlUnVieS5jb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgUnAuY29tbW9uLmF0dGxpc3QgLS0+XV0+Ci1dXT4KLV1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ydWJ5LTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gUHJlc2VudGF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtcHJlcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1wcmVzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXByZXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBQcmVzZW50YXRpb24gMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtcHJlcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBQcmVzZW50YXRpb24gTW9kdWxlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1wcmVzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFByZXNlbnRhdGlvbiAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXByZXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gUHJlc2VudGF0aW9uYWwgRWxlbWVudHMKLQotICAgICBUaGlzIG1vZHVsZSBkZWZpbmVzIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIGZvcgotICAgICBzaW1wbGUgcHJlc2VudGF0aW9uLXJlbGF0ZWQgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgeGh0bWwtaW5scHJlcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbmxwcmVzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWlubHByZXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgUHJlc2VudGF0aW9uIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaW5scHJlcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbmxpbmUgUHJlc2VudGF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbmxwcmVzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBQcmVzZW50YXRpb24gMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxwcmVzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIElubGluZSBQcmVzZW50YXRpb25hbCBFbGVtZW50cwotCi0gICAgICAgIGIsIGJpZywgaSwgc21hbGwsIHN1Yiwgc3VwLCB0dAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgaW5saW5lLWxldmVsIHByZXNlbnRhdGlvbmFsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyViLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBiLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYi5xbmFtZSAgImIiID4KLTwhRUxFTUVOVCAlYi5xbmFtZTsgICViLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBiLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGJpZy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJpZy5lbGVtZW50O1sKLTwhRU5USVRZICUgYmlnLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYmlnLnFuYW1lICAiYmlnIiA+Ci08IUVMRU1FTlQgJWJpZy5xbmFtZTsgICViaWcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYmlnLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmlnLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYmlnLmF0dGxpc3Q7WwotPCFBVFRMSVNUICViaWcucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGJpZy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGkuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVpLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBpLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgaS5xbmFtZSAgImkiID4KLTwhRUxFTUVOVCAlaS5xbmFtZTsgICVpLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGkuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBpLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHNtYWxsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc21hbGwuZWxlbWVudDtbCi08IUVOVElUWSAlIHNtYWxsLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc21hbGwucW5hbWUgICJzbWFsbCIgPgotPCFFTEVNRU5UICVzbWFsbC5xbmFtZTsgICVzbWFsbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzbWFsbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHNtYWxsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc21hbGwuYXR0bGlzdDtbCi08IUFUVExJU1QgJXNtYWxsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzbWFsbC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHN1Yi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN1Yi5lbGVtZW50O1sKLTwhRU5USVRZICUgc3ViLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3ViLnFuYW1lICAic3ViIiA+Ci08IUVMRU1FTlQgJXN1Yi5xbmFtZTsgICVzdWIuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3ViLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3ViLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3ViLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzdWIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHN1Yi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHN1cC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN1cC5lbGVtZW50O1sKLTwhRU5USVRZICUgc3VwLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3VwLnFuYW1lICAic3VwIiA+Ci08IUVMRU1FTlQgJXN1cC5xbmFtZTsgICVzdXAuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3VwLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3VwLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3VwLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzdXAucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHN1cC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHR0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldHQuZWxlbWVudDtbCi08IUVOVElUWSAlIHR0LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgdHQucW5hbWUgICJ0dCIgPgotPCFFTEVNRU5UICV0dC5xbmFtZTsgICV0dC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0dC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHR0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldHQuYXR0bGlzdDtbCi08IUFUVExJU1QgJXR0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0dC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxwcmVzLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYmxrcHJlcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ibGtwcmVzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWJsa3ByZXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQcmVzZW50YXRpb24gMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ibGtwcmVzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJsb2NrIFByZXNlbnRhdGlvbiBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJsa3ByZXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgUHJlc2VudGF0aW9uIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmxrcHJlcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCbG9jayBQcmVzZW50YXRpb25hbCBFbGVtZW50cwotCi0gICAgICAgIGhyCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBibG9jay1sZXZlbCBwcmVzZW50YXRpb25hbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBoci5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWhyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoci5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgaHIucW5hbWUgICJociIgPgotPCFFTEVNRU5UICVoci5xbmFtZTsgICVoci5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoci5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGhyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaHIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWhyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoci5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ibGtwcmVzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXByZXMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBMaW5rIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1saW5rLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWxpbmsubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtbGluay5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpbmsgRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1saW5rLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIExpbmsgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWxpbmstMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGluayBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGluay0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBMaW5rIGVsZW1lbnQKLQotICAgICAgICBsaW5rCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGxpbmsgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgd2hpY2ggY291bGQgKGluIHByaW5jaXBsZSkgYmUgdXNlZCB0byBkZWZpbmUgZG9jdW1lbnQtbGV2ZWwgbGlua3MKLSAgICAgdG8gZXh0ZXJuYWwgcmVzb3VyY2VzIHN1Y2ggYXM6Ci0KLSAgICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzLCBlLmcuIHN0YXJ0LCBjb250ZW50cywKLSAgICAgICAgcHJldmlvdXMsIG5leHQsIGluZGV4LCBlbmQsIGhlbHAKLSAgICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9InN0eWxlc2hlZXQiKQotICAgICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPSJzY3JpcHQiKQotICAgICBkKSBieSBzdHlsZXNoZWV0cyB0byBjb250cm9sIGhvdyBjb2xsZWN0aW9ucyBvZiBodG1sIG5vZGVzIGFyZQotICAgICAgICByZW5kZXJlZCBpbnRvIHByaW50ZWQgZG9jdW1lbnRzCi0gICAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgICBlLmcuIGEgcG9zdHNjcmlwdCBvciBwZGYgdmVyc2lvbiAocmVsPSJhbHRlcm5hdGUiIG1lZGlhPSJwcmludCIpCi0tLT4KLQotPCEtLSBsaW5rOiBNZWRpYS1JbmRlcGVuZGVudCBMaW5rIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbGluay5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxpbmsuZWxlbWVudDtbCi08IUVOVElUWSAlIGxpbmsuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGxpbmsucW5hbWUgICJsaW5rIiA+Ci08IUVMRU1FTlQgJWxpbmsucW5hbWU7ICAlbGluay5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBsaW5rLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbGluay5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWxpbmsuYXR0bGlzdDtbCi08IUFUVExJU1QgJWxpbmsucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGNoYXJzZXQgICAgICAlQ2hhcnNldC5kYXRhdHlwZTsgICAgICAgI0lNUExJRUQKLSAgICAgIGhyZWYgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhyZWZsYW5nICAgICAlTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlOyAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIHJlbCAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIHJldiAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIG1lZGlhICAgICAgICAlTWVkaWFEZXNjLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGxpbmsuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbGluay0xLm1vZCAtLT4KLV1dPgotCi08IS0tIERvY3VtZW50IE1ldGFpbmZvcm1hdGlvbiBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLW1ldGEubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbWV0YS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1tZXRhLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTWV0YWluZm9ybWF0aW9uIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW1ldGEtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRG9jdW1lbnQgTWV0YWluZm9ybWF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbWV0YS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBNZXRhaW5mb3JtYXRpb24gMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1tZXRhLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIE1ldGEgSW5mb3JtYXRpb24KLQotICAgICAgICBtZXRhCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIG1ldGEgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgdXNlZCB0byBwcm92aWRlIGRlY2xhcmF0aXZlIGRvY3VtZW50IG1ldGFpbmZvcm1hdGlvbi4KLS0tPgotCi08IS0tIG1ldGE6IEdlbmVyaWMgTWV0YWluZm9ybWF0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBtZXRhLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbWV0YS5lbGVtZW50O1sKLTwhRU5USVRZICUgbWV0YS5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgbWV0YS5xbmFtZSAgIm1ldGEiID4KLTwhRUxFTUVOVCAlbWV0YS5xbmFtZTsgICVtZXRhLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG1ldGEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBtZXRhLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbWV0YS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbWV0YS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICBodHRwLWVxdWl2ICAgTk1UT0tFTiAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBuYW1lICAgICAgICAgTk1UT0tFTiAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjb250ZW50ICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgc2NoZW1lICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgbWV0YS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1tZXRhLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gQmFzZSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtYmFzZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1iYXNlLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWJhc2UubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmFzZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCYXNlIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2UgRWxlbWVudCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJhc2UtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmFzZSBlbGVtZW50Ci0KLSAgICAgICAgYmFzZQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBiYXNlIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHVzZWQgdG8gZGVmaW5lIGEgYmFzZSBVUkkgYWdhaW5zdCB3aGljaCByZWxhdGl2ZSBVUklzIGluIHRoZQotICAgICBkb2N1bWVudCB3aWxsIGJlIHJlc29sdmVkLgotCi0gICAgIE5vdGUgdGhhdCB0aGlzIG1vZHVsZSBhbHNvIHJlZGVjbGFyZXMgdGhlIGNvbnRlbnQgbW9kZWwgZm9yCi0gICAgIHRoZSBoZWFkIGVsZW1lbnQgdG8gaW5jbHVkZSB0aGUgYmFzZSBlbGVtZW50LgotLS0+Ci0KLTwhLS0gYmFzZTogRG9jdW1lbnQgQmFzZSBVUkkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJhc2UuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyViYXNlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBiYXNlLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBiYXNlLnFuYW1lICAiYmFzZSIgPgotPCFFTEVNRU5UICViYXNlLnFuYW1lOyAgJWJhc2UuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYmFzZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJhc2UuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyViYXNlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICViYXNlLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgIGhyZWYgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI1JFUVVJUkVECi0+Ci08IS0tIGVuZCBvZiBiYXNlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaGVhZC5jb250ZW50Ci0gICAgIiggJUhlYWRPcHRzLm1peDssCi0gICAgICggKCAldGl0bGUucW5hbWU7LCAlSGVhZE9wdHMubWl4OywgKCAlYmFzZS5xbmFtZTssICVIZWFkT3B0cy5taXg7ICk/ICkKLSAgICAgfCAoICViYXNlLnFuYW1lOywgJUhlYWRPcHRzLm1peDssICggJXRpdGxlLnFuYW1lOywgJUhlYWRPcHRzLm1peDsgKSkpKSIKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmFzZS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFNjcmlwdGluZyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXNjcmlwdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1zY3JpcHQubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtc2NyaXB0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgU2NyaXB0aW5nIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXNjcmlwdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBEb2N1bWVudCBTY3JpcHRpbmcgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1zY3JpcHQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgU2NyaXB0aW5nIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc2NyaXB0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFNjcmlwdGluZwotCi0gICAgICAgIHNjcmlwdCwgbm9zY3JpcHQKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyBlbGVtZW50IHR5cGVzIGFuZCBhdHRyaWJ1dGVzIHVzZWQgdG8gcHJvdmlkZQotICAgICBzdXBwb3J0IGZvciBleGVjdXRhYmxlIHNjcmlwdHMgYXMgd2VsbCBhcyBhbiBhbHRlcm5hdGUgY29udGVudAotICAgICBjb250YWluZXIgd2hlcmUgc2NyaXB0cyBhcmUgbm90IHN1cHBvcnRlZC4KLS0tPgotCi08IS0tIHNjcmlwdDogU2NyaXB0aW5nIFN0YXRlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBzY3JpcHQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzY3JpcHQuZWxlbWVudDtbCi08IUVOVElUWSAlIHNjcmlwdC5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRU5USVRZICUgc2NyaXB0LnFuYW1lICAic2NyaXB0IiA+Ci08IUVMRU1FTlQgJXNjcmlwdC5xbmFtZTsgICVzY3JpcHQuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc2NyaXB0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc2NyaXB0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc2NyaXB0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzY3JpcHQucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgY2hhcnNldCAgICAgICVDaGFyc2V0LmRhdGF0eXBlOyAgICAgICAjSU1QTElFRAotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjUkVRVUlSRUQKLSAgICAgIHNyYyAgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGRlZmVyICAgICAgICAoIGRlZmVyICkgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHhtbDpzcGFjZSAgICAoIHByZXNlcnZlICkgICAgICAgICAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLT4KLTwhLS0gZW5kIG9mIHNjcmlwdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG5vc2NyaXB0OiBOby1TY3JpcHQgQWx0ZXJuYXRlIENvbnRlbnQgLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBub3NjcmlwdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW5vc2NyaXB0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBub3NjcmlwdC5jb250ZW50Ci0gICAgICIoICVCbG9jay5taXg7ICkrIgotPgotPCFFTlRJVFkgJSBub3NjcmlwdC5xbmFtZSAgIm5vc2NyaXB0IiA+Ci08IUVMRU1FTlQgJW5vc2NyaXB0LnFuYW1lOyAgJW5vc2NyaXB0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG5vc2NyaXB0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbm9zY3JpcHQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVub3NjcmlwdC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbm9zY3JpcHQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIG5vc2NyaXB0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXNjcmlwdC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFN0eWxlIFNoZWV0cyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1zdHlsZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1zdHlsZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1zdHlsZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFN0eWxlIFNoZWV0cyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zdHlsZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBEb2N1bWVudCBTdHlsZSBTaGVldCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtc3R5bGUtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIFN0eWxlIFNoZWV0cyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXN0eWxlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFN0eWxlIFNoZWV0cwotCi0gICAgICAgIHN0eWxlCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIHN0eWxlIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHVzZWQgdG8gZW1iZWQgc3R5bGVzaGVldCBpbmZvcm1hdGlvbiBpbiB0aGUgZG9jdW1lbnQgaGVhZCBlbGVtZW50LgotLS0+Ci0KLTwhLS0gc3R5bGU6IFN0eWxlIFNoZWV0IEluZm9ybWF0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBzdHlsZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN0eWxlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzdHlsZS5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRU5USVRZICUgc3R5bGUucW5hbWUgICJzdHlsZSIgPgotPCFFTEVNRU5UICVzdHlsZS5xbmFtZTsgICVzdHlsZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzdHlsZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHN0eWxlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3R5bGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXN0eWxlLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICV0aXRsZS5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNSRVFVSVJFRAotICAgICAgbWVkaWEgICAgICAgICVNZWRpYURlc2MuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgeG1sOnNwYWNlICAgICggcHJlc2VydmUgKSAgICAgICAgICAgICAjRklYRUQgJ3ByZXNlcnZlJwotPgotPCEtLSBlbmQgb2Ygc3R5bGUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtc3R5bGUtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBJbWFnZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1pbWFnZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbWFnZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1pbWFnZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEltYWdlcyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbWFnZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbWFnZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbWFnZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUm92aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbWFnZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbWFnZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbWFnZXMKLQotICAgICAgICBpbWcKLQotICAgICBUaGlzIG1vZHVsZSBwcm92aWRlcyBtYXJrdXAgdG8gc3VwcG9ydCBiYXNpYyBpbWFnZSBlbWJlZGRpbmcuCi0tLT4KLQotPCEtLSBUbyBhdm9pZCBwcm9ibGVtcyB3aXRoIHRleHQtb25seSBVQXMgYXMgd2VsbCBhcyB0byBtYWtlCi0gICAgIGltYWdlIGNvbnRlbnQgdW5kZXJzdGFuZGFibGUgYW5kIG5hdmlnYWJsZSB0byB1c2VycyBvZgotICAgICBub24tdmlzdWFsIFVBcywgeW91IG5lZWQgdG8gcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHdpdGgKLSAgICAgdGhlICdhbHQnIGF0dHJpYnV0ZSwgYW5kIGF2b2lkIHNlcnZlci1zaWRlIGltYWdlIG1hcHMuCi0tLT4KLQotPCFFTlRJVFkgJSBpbWcuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVpbWcuZWxlbWVudDtbCi08IUVOVElUWSAlIGltZy5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgaW1nLnFuYW1lICAiaW1nIiA+Ci08IUVMRU1FTlQgJWltZy5xbmFtZTsgICVpbWcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaW1nLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaW1nLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaW1nLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVpbWcucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHNyYyAgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBhbHQgICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNSRVFVSVJFRAotICAgICAgbG9uZ2Rlc2MgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVpZ2h0ICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgd2lkdGggICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgaW1nLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWltYWdlLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gQ2xpZW50LXNpZGUgSW1hZ2UgTWFwIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtY3Npc21hcC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1jc2lzbWFwLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWNzaXNtYXAubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBDbGllbnQtc2lkZSBJbWFnZSBNYXBzIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWNzaXNtYXAtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQ2xpZW50LXNpZGUgSW1hZ2UgTWFwIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtY3Npc21hcC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBDbGllbnQtc2lkZSBJbWFnZSBNYXBzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtY3Npc21hcC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBDbGllbnQtc2lkZSBJbWFnZSBNYXBzCi0KLSAgICAgICAgYXJlYSwgbWFwCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgdG8gc3VwcG9ydCBjbGllbnQtc2lkZQotICAgICBpbWFnZSBtYXBzLiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIEltYWdlIE1vZHVsZSAob3IgYSBtb2R1bGUKLSAgICAgZGVjbGFyaW5nIHRoZSBpbWcgZWxlbWVudCB0eXBlKSBiZSBpbmNsdWRlZCBpbiB0aGUgRFRELgotCi0gICAgIFRoZXNlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgb3IgZ3JvdXBlZCBpbiBhCi0gICAgIHNlcGFyYXRlIGRvY3VtZW50LCBhbHRob3VnaCB0aGUgbGF0dGVyIGlzbid0IHdpZGVseSBzdXBwb3J0ZWQKLS0tPgotCi08IUVOVElUWSAlIGFyZWEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhcmVhLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhcmVhLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBhcmVhLnFuYW1lICAiYXJlYSIgPgotPCFFTEVNRU5UICVhcmVhLnFuYW1lOyAgJWFyZWEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYXJlYS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIFNoYXBlLmRhdGF0eXBlICIoIHJlY3QgfCBjaXJjbGUgfCBwb2x5IHwgZGVmYXVsdCApIj4KLTwhRU5USVRZICUgQ29vcmRzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IUVOVElUWSAlIGFyZWEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhcmVhLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhcmVhLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBocmVmICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBzaGFwZSAgICAgICAgJVNoYXBlLmRhdGF0eXBlOyAgICAgICAgICdyZWN0JwotICAgICAgY29vcmRzICAgICAgICVDb29yZHMuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgbm9ocmVmICAgICAgICggbm9ocmVmICkgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgYWx0ICAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGFyZWEuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBtb2RpZnkgYW5jaG9yIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGxpc3QKLSAgICAgdG8gYWxsb3cgZm9yIGNsaWVudC1zaWRlIGltYWdlIG1hcHMKLS0tPgotPCFBVFRMSVNUICVhLnFuYW1lOwotICAgICAgc2hhcGUgICAgICAgICVTaGFwZS5kYXRhdHlwZTsgICAgICAgICAncmVjdCcKLSAgICAgIGNvb3JkcyAgICAgICAlQ29vcmRzLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBtb2RpZnkgaW1nIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGxpc3QKLSAgICAgdG8gYWxsb3cgZm9yIGNsaWVudC1zaWRlIGltYWdlIG1hcHMKLS0tPgotPCFBVFRMSVNUICVpbWcucW5hbWU7Ci0gICAgICB1c2VtYXAgICAgICAgSURSRUYgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gbW9kaWZ5IGZvcm0gaW5wdXQgYXR0cmlidXRlIGRlZmluaXRpb24gbGlzdAotICAgICB0byBhbGxvdyBmb3IgY2xpZW50LXNpZGUgaW1hZ2UgbWFwcwotLS0+Ci08IUFUVExJU1QgJWlucHV0LnFuYW1lOwotICAgICAgdXNlbWFwICAgICAgIElEUkVGICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIG1vZGlmeSBvYmplY3QgYXR0cmlidXRlIGRlZmluaXRpb24gbGlzdAotICAgICB0byBhbGxvdyBmb3IgY2xpZW50LXNpZGUgaW1hZ2UgbWFwcwotLS0+Ci08IUFUVExJU1QgJW9iamVjdC5xbmFtZTsKLSAgICAgIHVzZW1hcCAgICAgICBJRFJFRiAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSAndXNlbWFwJyBwb2ludHMgdG8gdGhlICdpZCcgYXR0cmlidXRlIG9mIGEgPG1hcD4gZWxlbWVudCwKLSAgICAgd2hpY2ggbXVzdCBiZSBpbiB0aGUgc2FtZSBkb2N1bWVudDsgc3VwcG9ydCBmb3IgZXh0ZXJuYWwKLSAgICAgZG9jdW1lbnQgbWFwcyB3YXMgbm90IHdpZGVseSBzdXBwb3J0ZWQgaW4gSFRNTCBhbmQgaXMKLSAgICAgZWxpbWluYXRlZCBpbiBYSFRNTC4KLQotICAgICBJdCBpcyBjb25zaWRlcmVkIGFuIGVycm9yIGZvciB0aGUgZWxlbWVudCBwb2ludGVkIHRvIGJ5Ci0gICAgIGEgdXNlbWFwIElEUkVGIHRvIG9jY3VyIGluIGFueXRoaW5nIGJ1dCBhIDxtYXA+IGVsZW1lbnQuCi0tLT4KLQotPCFFTlRJVFkgJSBtYXAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVtYXAuZWxlbWVudDtbCi08IUVOVElUWSAlIG1hcC5jb250ZW50Ci0gICAgICIoKCAlQmxvY2subWl4OyApIHwgJWFyZWEucW5hbWU7ICkrIgotPgotPCFFTlRJVFkgJSBtYXAucW5hbWUgICJtYXAiID4KLTwhRUxFTUVOVCAlbWFwLnFuYW1lOyAgJW1hcC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBtYXAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBtYXAuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVtYXAuYXR0bGlzdDtbCi08IUFUVExJU1QgJW1hcC5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICBpZCAgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgJWNsYXNzLmF0dHJpYjsKLSAgICAgICV0aXRsZS5hdHRyaWI7Ci0gICAgICAlQ29yZS5leHRyYS5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICAlRXZlbnRzLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIG1hcC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1jc2lzbWFwLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gU2VydmVyLXNpZGUgSW1hZ2UgTWFwIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtc3Npc21hcC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1zc2lzbWFwLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXNzaXNtYXAubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBTZXJ2ZXItc2lkZSBJbWFnZSBNYXBzIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXNzaXNtYXAtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgU2VydmVyLXNpZGUgSW1hZ2UgTWFwIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtc3Npc21hcC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBTZXJ2ZXItc2lkZSBJbWFnZSBNYXBzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3Npc21hcC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0jMjAwMC0xMC0yMjogYWRkZWQgZGVjbGFyYXRpb24gZm9yICdpc21hcCcgb24gPGlucHV0PgotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBTZXJ2ZXItc2lkZSBJbWFnZSBNYXBzCi0KLSAgICAgVGhpcyBhZGRzIHRoZSAnaXNtYXAnIGF0dHJpYnV0ZSB0byB0aGUgaW1nIGFuZCBpbnB1dCBlbGVtZW50cwotICAgICB0byBzdXBwb3J0IHNlcnZlci1zaWRlIHByb2Nlc3Npbmcgb2YgYSB1c2VyIHNlbGVjdGlvbi4KLS0tPgotCi08IUFUVExJU1QgJWltZy5xbmFtZTsKLSAgICAgIGlzbWFwICAgICAgICAoIGlzbWFwICkgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLQotPCFBVFRMSVNUICVpbnB1dC5xbmFtZTsKLSAgICAgIGlzbWFwICAgICAgICAoIGlzbWFwICkgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtc3Npc21hcC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFBhcmFtIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXBhcmFtLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXBhcmFtLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXBhcmFtLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgUGFyYW0gRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1wYXJhbS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBQYXJhbSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtcGFyYW0tMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgUGFyYW0gRWxlbWVudCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXBhcmFtLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFBhcmFtZXRlcnMgZm9yIEphdmEgQXBwbGV0cyBhbmQgRW1iZWRkZWQgT2JqZWN0cwotCi0gICAgICAgIHBhcmFtCi0KLSAgICAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgZGVjbGFyYXRpb25zIGZvciB0aGUgcGFyYW0gZWxlbWVudCwKLSAgICAgdXNlZCB0byBwcm92aWRlIG5hbWVkIHByb3BlcnR5IHZhbHVlcyBmb3IgdGhlIGFwcGxldAotICAgICBhbmQgb2JqZWN0IGVsZW1lbnRzLgotLS0+Ci0KLTwhLS0gcGFyYW06IE5hbWVkIFByb3BlcnR5IFZhbHVlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHBhcmFtLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcGFyYW0uZWxlbWVudDtbCi08IUVOVElUWSAlIHBhcmFtLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBwYXJhbS5xbmFtZSAgInBhcmFtIiA+Ci08IUVMRU1FTlQgJXBhcmFtLnFuYW1lOyAgJXBhcmFtLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHBhcmFtLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcGFyYW0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVwYXJhbS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcGFyYW0ucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJWlkLmF0dHJpYjsKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICB2YWx1ZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB2YWx1ZXR5cGUgICAgKCBkYXRhIHwgcmVmIHwgb2JqZWN0ICkgICdkYXRhJwotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgcGFyYW0uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtcGFyYW0tMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBFbWJlZGRlZCBPYmplY3QgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1vYmplY3QubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtb2JqZWN0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLW9iamVjdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEVtYmVkZGVkIE9iamVjdCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1vYmplY3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRW1iZWRkZWQgT2JqZWN0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtb2JqZWN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEVtYmVkZGVkIE9iamVjdCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW9iamVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBFbWJlZGRlZCBPYmplY3RzCi0KLSAgICAgICAgb2JqZWN0Ci0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIG9iamVjdCBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLCB1c2VkCi0gICAgIHRvIGVtYmVkIGV4dGVybmFsIG9iamVjdHMgYXMgcGFydCBvZiBYSFRNTCBwYWdlcy4gSW4gdGhlIGRvY3VtZW50LAotICAgICBwbGFjZSBwYXJhbSBlbGVtZW50cyBwcmlvciB0byBvdGhlciBjb250ZW50IHdpdGhpbiB0aGUgb2JqZWN0IGVsZW1lbnQuCi0KLSAgICAgTm90ZSB0aGF0IHVzZSBvZiB0aGlzIG1vZHVsZSByZXF1aXJlcyBpbnN0YW50aWF0aW9uIG9mIHRoZSBQYXJhbQotICAgICBFbGVtZW50IE1vZHVsZS4KLS0tPgotCi08IS0tIG9iamVjdDogR2VuZXJpYyBFbWJlZGRlZCBPYmplY3QgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvYmplY3QuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvYmplY3QuZWxlbWVudDtbCi08IUVOVElUWSAlIG9iamVjdC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7IHwgJXBhcmFtLnFuYW1lOyApKiIKLT4KLTwhRU5USVRZICUgb2JqZWN0LnFuYW1lICAib2JqZWN0IiA+Ci08IUVMRU1FTlQgJW9iamVjdC5xbmFtZTsgICVvYmplY3QuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygb2JqZWN0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb2JqZWN0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb2JqZWN0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVvYmplY3QucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGRlY2xhcmUgICAgICAoIGRlY2xhcmUgKSAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNsYXNzaWQgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNvZGViYXNlICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGRhdGEgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIGNvZGV0eXBlICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIGFyY2hpdmUgICAgICAlVVJJcy5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHN0YW5kYnkgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlaWdodCAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIHdpZHRoICAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIG9iamVjdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1vYmplY3QtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBUYWJsZXMgTW9kdWxlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC10YWJsZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC10YWJsZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC10YWJsZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFRhYmxlcyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC10YWJsZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBUYWJsZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC10YWJsZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBUYWJsZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC10YWJsZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBUYWJsZXMKLQotICAgICAgICB0YWJsZSwgY2FwdGlvbiwgdGhlYWQsIHRmb290LCB0Ym9keSwgY29sZ3JvdXAsIGNvbCwgdHIsIHRoLCB0ZAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZXMgdXNlZCB0byBwcm92aWRlCi0gICAgIHRhYmxlIG1hcmt1cCBzaW1pbGFyIHRvIEhUTUwgNC4wLCBpbmNsdWRpbmcgZmVhdHVyZXMgdGhhdCBlbmFibGUKLSAgICAgYmV0dGVyIGFjY2Vzc2liaWxpdHkgZm9yIG5vbi12aXN1YWwgdXNlciBhZ2VudHMuCi0tLT4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBlbGVtZW50IHR5cGUgbmFtZXM6Ci0tLT4KLTwhRU5USVRZICUgdGFibGUucW5hbWUgICJ0YWJsZSIgPgotPCFFTlRJVFkgJSBjYXB0aW9uLnFuYW1lICAiY2FwdGlvbiIgPgotPCFFTlRJVFkgJSB0aGVhZC5xbmFtZSAgInRoZWFkIiA+Ci08IUVOVElUWSAlIHRmb290LnFuYW1lICAidGZvb3QiID4KLTwhRU5USVRZICUgdGJvZHkucW5hbWUgICJ0Ym9keSIgPgotPCFFTlRJVFkgJSBjb2xncm91cC5xbmFtZSAgImNvbGdyb3VwIiA+Ci08IUVOVElUWSAlIGNvbC5xbmFtZSAgImNvbCIgPgotPCFFTlRJVFkgJSB0ci5xbmFtZSAgInRyIiA+Ci08IUVOVElUWSAlIHRoLnFuYW1lICAidGgiID4KLTwhRU5USVRZICUgdGQucW5hbWUgICJ0ZCIgPgotCi08IS0tIFRoZSBmcmFtZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoaWNoIHBhcnRzIG9mIHRoZSBmcmFtZSBhcm91bmQKLSAgICAgdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gICAgIENBTFMgdG8gYXZvaWQgYSBuYW1lIGNsYXNoIHdpdGggdGhlIHZhbGlnbiBhdHRyaWJ1dGUuCi0tLT4KLTwhRU5USVRZICUgZnJhbWUuYXR0cmliCi0gICAgICJmcmFtZSAgICAgICAgKCB2b2lkCi0gICAgICAgICAgICAgICAgICAgfCBhYm92ZQotICAgICAgICAgICAgICAgICAgIHwgYmVsb3cKLSAgICAgICAgICAgICAgICAgICB8IGhzaWRlcwotICAgICAgICAgICAgICAgICAgIHwgbGhzCi0gICAgICAgICAgICAgICAgICAgfCByaHMKLSAgICAgICAgICAgICAgICAgICB8IHZzaWRlcwotICAgICAgICAgICAgICAgICAgIHwgYm94Ci0gICAgICAgICAgICAgICAgICAgfCBib3JkZXIgKSAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIFRoZSBydWxlcyBhdHRyaWJ1dGUgZGVmaW5lcyB3aGljaCBydWxlcyB0byBkcmF3IGJldHdlZW4gY2VsbHM6Ci0KLSAgICAgSWYgcnVsZXMgaXMgYWJzZW50IHRoZW4gYXNzdW1lOgotCi0gICAgICAgIm5vbmUiIGlmIGJvcmRlciBpcyBhYnNlbnQgb3IgYm9yZGVyPSIwIiBvdGhlcndpc2UgImFsbCIKLS0tPgotPCFFTlRJVFkgJSBydWxlcy5hdHRyaWIKLSAgICAgInJ1bGVzICAgICAgICAoIG5vbmUKLSAgICAgICAgICAgICAgICAgICB8IGdyb3VwcwotICAgICAgICAgICAgICAgICAgIHwgcm93cwotICAgICAgICAgICAgICAgICAgIHwgY29scwotICAgICAgICAgICAgICAgICAgIHwgYWxsICkgICAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSBob3Jpem9udGFsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzCi0tLT4KLTwhRU5USVRZICUgQ2VsbEhBbGlnbi5hdHRyaWIKLSAgICAgImFsaWduICAgICAgICAoIGxlZnQKLSAgICAgICAgICAgICAgICAgICB8IGNlbnRlcgotICAgICAgICAgICAgICAgICAgIHwgcmlnaHQKLSAgICAgICAgICAgICAgICAgICB8IGp1c3RpZnkKLSAgICAgICAgICAgICAgICAgICB8IGNoYXIgKSAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNoYXIgICAgICAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIGNoYXJvZmYgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZSBmb3IgY2VsbCBjb250ZW50cwotLS0+Ci08IUVOVElUWSAlIENlbGxWQWxpZ24uYXR0cmliCi0gICAgICJ2YWxpZ24gICAgICAgKCB0b3AKLSAgICAgICAgICAgICAgICAgICB8IG1pZGRsZQotICAgICAgICAgICAgICAgICAgIHwgYm90dG9tCi0gICAgICAgICAgICAgICAgICAgfCBiYXNlbGluZSApICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIHNjb3BlIGlzIHNpbXBsZXIgdGhhbiBheGVzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcwotLS0+Ci08IUVOVElUWSAlIHNjb3BlLmF0dHJpYgotICAgICAic2NvcGUgICAgICAgICggcm93Ci0gICAgICAgICAgICAgICAgICAgfCBjb2wKLSAgICAgICAgICAgICAgICAgICB8IHJvd2dyb3VwCi0gICAgICAgICAgICAgICAgICAgfCBjb2xncm91cCApICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIHRhYmxlOiBUYWJsZSBFbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0YWJsZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRhYmxlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0YWJsZS5jb250ZW50Ci0gICAgICIoICVjYXB0aW9uLnFuYW1lOz8sICggJWNvbC5xbmFtZTsqIHwgJWNvbGdyb3VwLnFuYW1lOyogKSwKLSAgICAgICgoICV0aGVhZC5xbmFtZTs/LCAldGZvb3QucW5hbWU7PywgJXRib2R5LnFuYW1lOysgKSB8ICggJXRyLnFuYW1lOysgKSkpIgotPgotPCFFTEVNRU5UICV0YWJsZS5xbmFtZTsgICV0YWJsZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0YWJsZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRhYmxlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGFibGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRhYmxlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBzdW1tYXJ5ICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICB3aWR0aCAgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBib3JkZXIgICAgICAgJVBpeGVscy5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICAlZnJhbWUuYXR0cmliOwotICAgICAgJXJ1bGVzLmF0dHJpYjsKLSAgICAgIGNlbGxzcGFjaW5nICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIGNlbGxwYWRkaW5nICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHRhYmxlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gY2FwdGlvbjogVGFibGUgQ2FwdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGNhcHRpb24uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjYXB0aW9uLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjYXB0aW9uLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlY2FwdGlvbi5xbmFtZTsgICVjYXB0aW9uLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNhcHRpb24uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjYXB0aW9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY2FwdGlvbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY2FwdGlvbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY2FwdGlvbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRoZWFkOiBUYWJsZSBIZWFkZXIgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBVc2UgdGhlYWQgdG8gZHVwbGljYXRlIGhlYWRlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGhlYWRlcnMgd2hlbgotICAgICB0Ym9keSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotLS0+Ci0KLTwhRU5USVRZICUgdGhlYWQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0aGVhZC5lbGVtZW50O1sKLTwhRU5USVRZICUgdGhlYWQuY29udGVudCAgIiggJXRyLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICV0aGVhZC5xbmFtZTsgICV0aGVhZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0aGVhZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRoZWFkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGhlYWQuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRoZWFkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0aGVhZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRmb290OiBUYWJsZSBGb290ZXIgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBVc2UgdGZvb3QgdG8gZHVwbGljYXRlIGZvb3RlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGZvb3RlcnMgd2hlbgotICAgICB0Ym9keSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotLS0+Ci0KLTwhRU5USVRZICUgdGZvb3QuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0Zm9vdC5lbGVtZW50O1sKLTwhRU5USVRZICUgdGZvb3QuY29udGVudCAgIiggJXRyLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICV0Zm9vdC5xbmFtZTsgICV0Zm9vdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0Zm9vdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRmb290LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGZvb3QuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRmb290LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0Zm9vdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRib2R5OiBUYWJsZSBCb2R5IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBVc2UgbXVsdGlwbGUgdGJvZHkgc2VjdGlvbnMgd2hlbiBydWxlcyBhcmUgbmVlZGVkCi0gICAgIGJldHdlZW4gZ3JvdXBzIG9mIHRhYmxlIHJvd3MuCi0tLT4KLQotPCFFTlRJVFkgJSB0Ym9keS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRib2R5LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0Ym9keS5jb250ZW50ICAiKCAldHIucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXRib2R5LnFuYW1lOyAgJXRib2R5LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRib2R5LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGJvZHkuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0Ym9keS5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGJvZHkucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRib2R5LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gY29sZ3JvdXA6IFRhYmxlIENvbHVtbiBHcm91cCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGNvbGdyb3VwIGdyb3VwcyBhIHNldCBvZiBjb2wgZWxlbWVudHMuIEl0IGFsbG93cyB5b3UKLSAgICAgdG8gZ3JvdXAgc2V2ZXJhbCBzZW1hbnRpY2FsbHktcmVsYXRlZCBjb2x1bW5zIHRvZ2V0aGVyLgotLS0+Ci0KLTwhRU5USVRZICUgY29sZ3JvdXAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjb2xncm91cC5lbGVtZW50O1sKLTwhRU5USVRZICUgY29sZ3JvdXAuY29udGVudCAgIiggJWNvbC5xbmFtZTsgKSoiID4KLTwhRUxFTUVOVCAlY29sZ3JvdXAucW5hbWU7ICAlY29sZ3JvdXAuY29udGVudDsgPgotPCEtLSBlbmQgb2YgY29sZ3JvdXAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjb2xncm91cC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWNvbGdyb3VwLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVjb2xncm91cC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc3BhbiAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgIHdpZHRoICAgICAgICAlTXVsdGlMZW5ndGguZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGNvbGdyb3VwLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gY29sOiBUYWJsZSBDb2x1bW4gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGNvbCBlbGVtZW50cyBkZWZpbmUgdGhlIGFsaWdubWVudCBwcm9wZXJ0aWVzIGZvcgotICAgICBjZWxscyBpbiBvbmUgb3IgbW9yZSBjb2x1bW5zLgotCi0gICAgIFRoZSB3aWR0aCBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUKLSAgICAgY29sdW1ucywgZS5nLgotCi0gICAgICAgd2lkdGg9IjY0IiAgICAgICAgd2lkdGggaW4gc2NyZWVuIHBpeGVscwotICAgICAgIHdpZHRoPSIwLjUqIiAgICAgIHJlbGF0aXZlIHdpZHRoIG9mIDAuNQotCi0gICAgIFRoZSBzcGFuIGF0dHJpYnV0ZSBjYXVzZXMgdGhlIGF0dHJpYnV0ZXMgb2Ygb25lCi0gICAgIGNvbCBlbGVtZW50IHRvIGFwcGx5IHRvIG1vcmUgdGhhbiBvbmUgY29sdW1uLgotLS0+Ci0KLTwhRU5USVRZICUgY29sLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslY29sLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjb2wuY29udGVudCAgIkVNUFRZIiA+Ci08IUVMRU1FTlQgJWNvbC5xbmFtZTsgICVjb2wuY29udGVudDsgPgotPCEtLSBlbmQgb2YgY29sLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgY29sLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY29sLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVjb2wucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHNwYW4gICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICB3aWR0aCAgICAgICAgJU11bHRpTGVuZ3RoLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBjb2wuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0cjogVGFibGUgUm93IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdHIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0ci5lbGVtZW50O1sKLTwhRU5USVRZICUgdHIuY29udGVudCAgIiggJXRoLnFuYW1lOyB8ICV0ZC5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAldHIucW5hbWU7ICAldHIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdHIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0ci5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0ci5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdHIuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0aDogVGFibGUgSGVhZGVyIENlbGwgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gdGggaXMgZm9yIGhlYWRlciBjZWxscywgdGQgZm9yIGRhdGEsCi0gICAgIGJ1dCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggdXNlIHRkCi0tLT4KLQotPCFFTlRJVFkgJSB0aC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRoLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0aC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTEVNRU5UICV0aC5xbmFtZTsgICV0aC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0aC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRoLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGguYXR0bGlzdDtbCi08IUFUVExJU1QgJXRoLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhYmJyICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBheGlzICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWFkZXJzICAgICAgSURSRUZTICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICAlc2NvcGUuYXR0cmliOwotICAgICAgcm93c3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgIGNvbHNwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0aC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRkOiBUYWJsZSBEYXRhIENlbGwgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0ZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0ZC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTEVNRU5UICV0ZC5xbmFtZTsgICV0ZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0ZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGQuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhYmJyICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBheGlzICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWFkZXJzICAgICAgSURSRUZTICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICAlc2NvcGUuYXR0cmliOwotICAgICAgcm93c3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgIGNvbHNwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0ZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC10YWJsZS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIEZvcm1zIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWZvcm0ubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtZm9ybS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1mb3JtLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRm9ybXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZm9ybS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBGb3JtcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1mb3JtLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEZvcm1zIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZm9ybS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBGb3JtcwotCi0gICAgICAgIGZvcm0sIGxhYmVsLCBpbnB1dCwgc2VsZWN0LCBvcHRncm91cCwgb3B0aW9uLAotICAgICAgICB0ZXh0YXJlYSwgZmllbGRzZXQsIGxlZ2VuZCwgYnV0dG9uCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgbWFya3VwIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3Igb25saW5lCi0gICAgIGZvcm1zLCBiYXNlZCBvbiB0aGUgZmVhdHVyZXMgZm91bmQgaW4gSFRNTCA0LjAgZm9ybXMuCi0tLT4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBlbGVtZW50IHR5cGUgbmFtZXM6Ci0tLT4KLTwhRU5USVRZICUgZm9ybS5xbmFtZSAgImZvcm0iID4KLTwhRU5USVRZICUgbGFiZWwucW5hbWUgICJsYWJlbCIgPgotPCFFTlRJVFkgJSBpbnB1dC5xbmFtZSAgImlucHV0IiA+Ci08IUVOVElUWSAlIHNlbGVjdC5xbmFtZSAgInNlbGVjdCIgPgotPCFFTlRJVFkgJSBvcHRncm91cC5xbmFtZSAgIm9wdGdyb3VwIiA+Ci08IUVOVElUWSAlIG9wdGlvbi5xbmFtZSAgIm9wdGlvbiIgPgotPCFFTlRJVFkgJSB0ZXh0YXJlYS5xbmFtZSAgInRleHRhcmVhIiA+Ci08IUVOVElUWSAlIGZpZWxkc2V0LnFuYW1lICAiZmllbGRzZXQiID4KLTwhRU5USVRZICUgbGVnZW5kLnFuYW1lICAibGVnZW5kIiA+Ci08IUVOVElUWSAlIGJ1dHRvbi5xbmFtZSAgImJ1dHRvbiIgPgotCi08IS0tICVCbGtOb0Zvcm0ubWl4OyBpbmNsdWRlcyBhbGwgbm9uLWZvcm0gYmxvY2sgZWxlbWVudHMsCi0gICAgIHBsdXMgJU1pc2MuY2xhc3M7Ci0tLT4KLTwhRU5USVRZICUgQmxrTm9Gb3JtLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxrU3RydWN0LmNsYXNzOwotICAgICAgJUJsa1BocmFzLmNsYXNzOwotICAgICAgJUJsa1ByZXMuY2xhc3M7Ci0gICAgICAlVGFibGUuY2xhc3M7Ci0gICAgICAlQmxvY2suZXh0cmE7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gZm9ybTogRm9ybSBFbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGZvcm0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVmb3JtLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBmb3JtLmNvbnRlbnQKLSAgICAgIiggJUJsa05vRm9ybS5taXg7Ci0gICAgICB8ICVmaWVsZHNldC5xbmFtZTsgKSsiCi0+Ci08IUVMRU1FTlQgJWZvcm0ucW5hbWU7ICAlZm9ybS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBmb3JtLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZm9ybS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWZvcm0uYXR0bGlzdDtbCi08IUFUVExJU1QgJWZvcm0ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGFjdGlvbiAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBtZXRob2QgICAgICAgKCBnZXQgfCBwb3N0ICkgICAgICAgICAgICdnZXQnCi0gICAgICBlbmN0eXBlICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnCi0gICAgICBhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHMuZGF0YXR5cGU7ICAgICNJTVBMSUVECi0gICAgICBhY2NlcHQgICAgICAgJUNvbnRlbnRUeXBlcy5kYXRhdHlwZTsgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBmb3JtLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gbGFiZWw6IEZvcm0gRmllbGQgTGFiZWwgVGV4dCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkCi0tLT4KLQotPCFFTlRJVFkgJSBsYWJlbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxhYmVsLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBsYWJlbC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEKLSAgICAgIHwgJWlucHV0LnFuYW1lOyB8ICVzZWxlY3QucW5hbWU7IHwgJXRleHRhcmVhLnFuYW1lOyB8ICVidXR0b24ucW5hbWU7Ci0gICAgICB8ICVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlSTE4bi5jbGFzczsKLSAgICAgICVJbmxQcmVzLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubGluZS5leHRyYTsKLSAgICAgICVNaXNjLmNsYXNzOyApKiIKLT4KLTwhRUxFTUVOVCAlbGFiZWwucW5hbWU7ICAlbGFiZWwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbGFiZWwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsYWJlbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWxhYmVsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVsYWJlbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgZm9yICAgICAgICAgIElEUkVGICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgbGFiZWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBpbnB1dDogRm9ybSBDb250cm9sIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgaW5wdXQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVpbnB1dC5lbGVtZW50O1sKLTwhRU5USVRZICUgaW5wdXQuY29udGVudCAgIkVNUFRZIiA+Ci08IUVMRU1FTlQgJWlucHV0LnFuYW1lOyAgJWlucHV0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGlucHV0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaW5wdXQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVpbnB1dC5hdHRsaXN0O1sKLTwhRU5USVRZICUgSW5wdXRUeXBlLmNsYXNzCi0gICAgICIoIHRleHQgfCBwYXNzd29yZCB8IGNoZWNrYm94IHwgcmFkaW8gfCBzdWJtaXQKLSAgICAgIHwgcmVzZXQgfCBmaWxlIHwgaGlkZGVuIHwgaW1hZ2UgfCBidXR0b24gKSIKLT4KLTwhLS0gYXR0cmlidXRlICduYW1lJyByZXF1aXJlZCBmb3IgYWxsIGJ1dCBzdWJtaXQgJiByZXNldAotLS0+Ci08IUFUVExJU1QgJWlucHV0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICB0eXBlICAgICAgICAgJUlucHV0VHlwZS5jbGFzczsgICAgICAgICd0ZXh0JwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdmFsdWUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgY2hlY2tlZCAgICAgICggY2hlY2tlZCApICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgZGlzYWJsZWQgICAgICggZGlzYWJsZWQgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgcmVhZG9ubHkgICAgICggcmVhZG9ubHkgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgc2l6ZSAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgbWF4bGVuZ3RoICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgc3JjICAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgYWx0ICAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgYWNjZXB0ICAgICAgICVDb250ZW50VHlwZXMuZGF0YXR5cGU7ICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgaW5wdXQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBzZWxlY3Q6IE9wdGlvbiBTZWxlY3RvciAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgc2VsZWN0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc2VsZWN0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzZWxlY3QuY29udGVudAotICAgICAiKCAlb3B0Z3JvdXAucW5hbWU7IHwgJW9wdGlvbi5xbmFtZTsgKSsiCi0+Ci08IUVMRU1FTlQgJXNlbGVjdC5xbmFtZTsgICVzZWxlY3QuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc2VsZWN0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc2VsZWN0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc2VsZWN0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzZWxlY3QucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHNpemUgICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG11bHRpcGxlICAgICAoIG11bHRpcGxlICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGRpc2FibGVkICAgICAoIGRpc2FibGVkICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHNlbGVjdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG9wdGdyb3VwOiBPcHRpb24gR3JvdXAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvcHRncm91cC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW9wdGdyb3VwLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvcHRncm91cC5jb250ZW50ICAiKCAlb3B0aW9uLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICVvcHRncm91cC5xbmFtZTsgICVvcHRncm91cC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBvcHRncm91cC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG9wdGdyb3VwLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb3B0Z3JvdXAuYXR0bGlzdDtbCi08IUFUVExJU1QgJW9wdGdyb3VwLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBkaXNhYmxlZCAgICAgKCBkaXNhYmxlZCApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBsYWJlbCAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNSRVFVSVJFRAotPgotPCEtLSBlbmQgb2Ygb3B0Z3JvdXAuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBvcHRpb246IFNlbGVjdGFibGUgQ2hvaWNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgb3B0aW9uLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslb3B0aW9uLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvcHRpb24uY29udGVudCAgIiggI1BDREFUQSApIiA+Ci08IUVMRU1FTlQgJW9wdGlvbi5xbmFtZTsgICVvcHRpb24uY29udGVudDsgPgotPCEtLSBlbmQgb2Ygb3B0aW9uLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb3B0aW9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb3B0aW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVvcHRpb24ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHNlbGVjdGVkICAgICAoIHNlbGVjdGVkICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGRpc2FibGVkICAgICAoIGRpc2FibGVkICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGxhYmVsICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHZhbHVlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIG9wdGlvbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRleHRhcmVhOiBNdWx0aS1MaW5lIFRleHQgRmllbGQgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0ZXh0YXJlYS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRleHRhcmVhLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0ZXh0YXJlYS5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRUxFTUVOVCAldGV4dGFyZWEucW5hbWU7ICAldGV4dGFyZWEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGV4dGFyZWEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0ZXh0YXJlYS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRleHRhcmVhLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0ZXh0YXJlYS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgcm93cyAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjUkVRVUlSRUQKLSAgICAgIGNvbHMgICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI1JFUVVJUkVECi0gICAgICBkaXNhYmxlZCAgICAgKCBkaXNhYmxlZCApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICByZWFkb25seSAgICAgKCByZWFkb25seSApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiB0ZXh0YXJlYS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGZpZWxkc2V0OiBGb3JtIENvbnRyb2wgR3JvdXAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSAjUENEQVRBIGlzIHRvIHNvbHZlIHRoZSBtaXhlZCBjb250ZW50IHByb2JsZW0sCi0gICAgIHBlciBzcGVjaWZpY2F0aW9uIG9ubHkgd2hpdGVzcGFjZSBpcyBhbGxvd2VkCi0tLT4KLQotPCFFTlRJVFkgJSBmaWVsZHNldC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWZpZWxkc2V0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBmaWVsZHNldC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlbGVnZW5kLnFuYW1lOyB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWZpZWxkc2V0LnFuYW1lOyAgJWZpZWxkc2V0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGZpZWxkc2V0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZmllbGRzZXQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVmaWVsZHNldC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZmllbGRzZXQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGZpZWxkc2V0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gbGVnZW5kOiBGaWVsZHNldCBMZWdlbmQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGxlZ2VuZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxlZ2VuZC5lbGVtZW50O1sKLTwhRU5USVRZICUgbGVnZW5kLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlbGVnZW5kLnFuYW1lOyAgJWxlZ2VuZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBsZWdlbmQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsZWdlbmQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVsZWdlbmQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWxlZ2VuZC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgbGVnZW5kLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gYnV0dG9uOiBQdXNoIEJ1dHRvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJ1dHRvbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJ1dHRvbi5lbGVtZW50O1sKLTwhRU5USVRZICUgYnV0dG9uLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQQotICAgICAgfCAlQmxrTm9Gb3JtLm1peDsKLSAgICAgIHwgJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVJbmxQcmVzLmNsYXNzOwotICAgICAgJUkxOG4uY2xhc3M7Ci0gICAgICAlSW5sU3BlY2lhbC5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7ICkqIgotPgotPCFFTEVNRU5UICVidXR0b24ucW5hbWU7ICAlYnV0dG9uLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJ1dHRvbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJ1dHRvbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJ1dHRvbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYnV0dG9uLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB2YWx1ZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgKCBidXR0b24gfCBzdWJtaXQgfCByZXNldCApICdzdWJtaXQnCi0gICAgICBkaXNhYmxlZCAgICAgKCBkaXNhYmxlZCApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBidXR0b24uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtZm9ybS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIExlZ2FjeSBNYXJrdXAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWxlZ2FjeS5tb2R1bGUgIklHTk9SRSIgPgotPCFbJXhodG1sLWxlZ2FjeS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1sZWdhY3kubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMZWdhY3kgTWFya3VwIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWxlZ2FjeS0xLm1vZCIgPgotJXhodG1sLWxlZ2FjeS5tb2Q7XV0+Ci0KLTwhLS0gRG9jdW1lbnQgU3RydWN0dXJlIE1vZHVsZSAocmVxdWlyZWQpICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtc3RydWN0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXN0cnVjdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1zdHJ1Y3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBEb2N1bWVudCBTdHJ1Y3R1cmUgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3RydWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFN0cnVjdHVyZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXN0cnVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBEb2N1bWVudCBTdHJ1Y3R1cmUgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zdHJ1Y3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRG9jdW1lbnQgU3RydWN0dXJlCi0KLSAgICAgICAgdGl0bGUsIGhlYWQsIGJvZHksIGh0bWwKLQotICAgICBUaGUgU3RydWN0dXJlIE1vZHVsZSBkZWZpbmVzIHRoZSBtYWpvciBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFuZAotICAgICB0aGVpciBhdHRyaWJ1dGVzLgotCi0gICAgIE5vdGUgdGhhdCB0aGUgY29udGVudCBtb2RlbCBvZiB0aGUgaGVhZCBlbGVtZW50IHR5cGUgaXMgcmVkZWNsYXJlZAotICAgICB3aGVuIHRoZSBCYXNlIE1vZHVsZSBpcyBpbmNsdWRlZCBpbiB0aGUgRFRELgotCi0gICAgIFRoZSBwYXJhbWV0ZXIgZW50aXR5IGNvbnRhaW5pbmcgdGhlIFhNTCBuYW1lc3BhY2UgVVJJIHZhbHVlIHVzZWQKLSAgICAgZm9yIFhIVE1MIGlzICclWEhUTUwueG1sbnM7JywgZGVmaW5lZCBpbiB0aGUgUXVhbGlmaWVkIE5hbWVzIG1vZHVsZS4KLS0tPgotCi08IS0tIHRpdGxlOiBEb2N1bWVudCBUaXRsZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBUaGUgdGl0bGUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgIEl0IHNob3VsZCBiZSBkaXNwbGF5ZWQsIGZvciBleGFtcGxlIGFzIHRoZSBwYWdlIGhlYWRlciBvcgotICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLS0tPgotCi08IUVOVElUWSAlIHRpdGxlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGl0bGUuZWxlbWVudDtbCi08IUVOVElUWSAlIHRpdGxlLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTlRJVFkgJSB0aXRsZS5xbmFtZSAgInRpdGxlIiA+Ci08IUVMRU1FTlQgJXRpdGxlLnFuYW1lOyAgJXRpdGxlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRpdGxlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGl0bGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0aXRsZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGl0bGUucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdGl0bGUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBoZWFkOiBEb2N1bWVudCBIZWFkIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgaGVhZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWhlYWQuZWxlbWVudDtbCi08IUVOVElUWSAlIGhlYWQuY29udGVudAotICAgICIoICVIZWFkT3B0cy5taXg7LCAldGl0bGUucW5hbWU7LCAlSGVhZE9wdHMubWl4OyApIgotPgotPCFFTlRJVFkgJSBoZWFkLnFuYW1lICAiaGVhZCIgPgotPCFFTEVNRU5UICVoZWFkLnFuYW1lOyAgJWhlYWQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaGVhZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGhlYWQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoZWFkLmF0dGxpc3Q7WwotPCEtLSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSB3aXRoIGRvY3VtZW50IHByb2ZpbGVzCi0tLT4KLTwhRU5USVRZICUgcHJvZmlsZS5hdHRyaWIKLSAgICAgInByb2ZpbGUgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgJyVYSFRNTC5wcm9maWxlOyciCi0+Ci0KLTwhQVRUTElTVCAlaGVhZC5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICAlcHJvZmlsZS5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoZWFkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gYm9keTogRG9jdW1lbnQgQm9keSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJvZHkuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVib2R5LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBib2R5LmNvbnRlbnQKLSAgICAgIiggJUJsb2NrLm1peDsgKSsiCi0+Ci08IUVOVElUWSAlIGJvZHkucW5hbWUgICJib2R5IiA+Ci08IUVMRU1FTlQgJWJvZHkucW5hbWU7ICAlYm9keS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBib2R5LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYm9keS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJvZHkuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJvZHkucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGJvZHkuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBodG1sOiBYSFRNTCBEb2N1bWVudCBFbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgaHRtbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWh0bWwuZWxlbWVudDtbCi08IUVOVElUWSAlIGh0bWwuY29udGVudCAgIiggJWhlYWQucW5hbWU7LCAlYm9keS5xbmFtZTsgKSIgPgotPCFFTlRJVFkgJSBodG1sLnFuYW1lICAiaHRtbCIgPgotPCFFTEVNRU5UICVodG1sLnFuYW1lOyAgJWh0bWwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaHRtbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGh0bWwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVodG1sLmF0dGxpc3Q7WwotPCEtLSB2ZXJzaW9uIGF0dHJpYnV0ZSB2YWx1ZSBkZWZpbmVkIGluIGRyaXZlcgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnZlcnNpb24uYXR0cmliCi0gICAgICJ2ZXJzaW9uICAgICAgJUZQSS5kYXRhdHlwZTsgICAgICAgICAgICNGSVhFRCAnJVhIVE1MLnZlcnNpb247JyIKLT4KLQotPCEtLSBzZWUgdGhlIFF1YWxpZmllZCBOYW1lcyBtb2R1bGUgZm9yIGluZm9ybWF0aW9uCi0gICAgIG9uIGhvdyB0byBleHRlbmQgWEhUTUwgdXNpbmcgWE1MIG5hbWVzcGFjZXMKLS0tPgotPCFBVFRMSVNUICVodG1sLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVYSFRNTC52ZXJzaW9uLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGh0bWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtc3RydWN0LTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gZW5kIG9mIFhIVE1MIDEuMSBEVEQgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNDU3MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjAgPSBYSFRNTCAxLjAgU3RyaWN0Ci1kb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuMSA9IFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwKLWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS4yID0gWEhUTUwgMS4wIEZyYW1lc2V0Ci1kb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuMyA9IFhIVE1MIEJhc2ljIDEuMAotZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjQgPSBYSFRNTCAxLjEKLWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS41ID0gWEhUTUwgTVAgMS4wCi1kb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuNiA9IFdNTCAxLjMKLUJ1bmRsZS1OYW1lLjAgPSBTdGFuZGFyZCBTY2hlbWFzIGFuZCBEVERzCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzYTlkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQotICAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgICA8IS0tIENhdGFsb2cgQ29udHJpYnV0aW9ucyAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBSZWdpc3RlciB3ZWxsIGtub3duIFdlYiBEVERzIGFuZCBYU0RzICAgIC0tPgotICAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotICAgIDwhLS0gbmV3IGZvcm0gLS0+Ci0KLSAgICA8IS0tIAotICAgICAgICBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDQ4MQotICAgICAgICB5b3UgbWF5IGhhdmUgdG8gY29tbWVudCBvdXQgZm9sbG93aW5nIGV4dGVuc2lvbiBpZiB1c2VkIAotICAgICAgICBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gCi0gICAgICAgIAotICAgIC0tPgotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNhdGFsb2dDb250cmlidXRpb25zIj4KLSAgICAgICAgPGNhdGFsb2dDb250cmlidXRpb24gaWQ9ImRlZmF1bHQiPgotCi0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vV0FQRk9SVU0vL0RURCBXTUwgMS4xLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMvd21sMTEuZHRkIj4KLSAgICAgICAgICAgIDwvcHVibGljPgotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy94aHRtbDEtc3RyaWN0LmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMveGh0bWwxLWZyYW1lc2V0LmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLWZyYW1lc2V0LmR0ZCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCBCYXNpYyAxLjAvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy94aHRtbC1iYXNpYzEwLWYuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtYmFzaWMveGh0bWwtYmFzaWMxMC5kdGQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMveGh0bWwxMS1mbGF0LmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4KLSAgICAgICAgICAgIDwvcHVibGljPgotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1dBUEZPUlVNLy9EVEQgWEhUTUwgTW9iaWxlIDEuMC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL3hodG1sLW1vYmlsZTEwLWZsYXQuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3hodG1sLW1vYmlsZTEwLmR0ZCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XQVBGT1JVTS8vRFREIFdNTCAxLjMvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy93bWwxMy5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQvd21sMTMuZHRkIj4KLSAgICAgICAgICAgIDwvcHVibGljPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMvZnJhbWVzZXQuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvZnJhbWVzZXQuZHRkIj4KLSAgICAgICAgICAgIDwvcHVibGljPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRU5USVRJRVMgTGF0aW4gMS8vRU4vL0hUTUwiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL0hUTUxsYXQxLmVudCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9IkhUTUxsYXQxLmVudCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwvL0VOLy9IVE0iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL0hUTUxzcGVjaWFsLmVudCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9IkhUTUxzcGVjaWFsLmVudCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMvL0VOLy9IVE1MIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy9IVE1Mc3ltYm9sLmVudCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9IkhUTUxzeW1ib2wuZW50Ij4KLSAgICAgICAgICAgIDwvcHVibGljPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy9sb29zZS5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0gICAgICAgIAotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy9zdHJpY3QuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLQotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICAgICAgIHVyaT0ieHNkL3dzZGwueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgICAgICAgICAgICAgdXJpPSJ4c2Qvc29hcC54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLSAgICAgICAgICAgICAgICB1cmk9InhzZC9odHRwLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIgotICAgICAgICAgICAgICAgIHVyaT0ieHNkL3dzZGwtbWltZS54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgdXJpPSJ4c2Qvc29hcGVuYy54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0idXJuOm9hc2lzOm5hbWVzOnRjOmVudGl0eTp4bWxuczp4bWw6Y2F0YWxvZyIKLSAgICAgICAgICAgICAgICB1cmk9InhzZC94bWxjYXRhbG9nMTEueHNkIiAvPgotCi0KLSAgICAgICAgICAgIDwhLS0gdGhlc2UgYXJlIHJlbW92ZWQgZnJvbSB0aGUgY2F0YWxvZywgc2luY2UgdGhleSBhcmUgLW5vdC0gCi0gICAgICAgICAgICB0aGUgc2FtZSBhcyB0aG9zZSBpbiB0aGUgeHNkLnVpIHBsdWdpbiwgd2hpY2ggCi0gICAgICAgICAgICBwb2ludCB0byB0aGUgb3JnLmVjbGlwc2UueHNkIHZlcnNpb25zCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9YTUxTY2hlbWEuZHRkIiAvPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPHN5c3RlbQotICAgICAgICAgICAgICAgIHN5c3RlbUlkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy94bWwueHNkIiAvPgotICAgICAgICAgICAgIC0tPgotICAgICAgICA8L2NhdGFsb2dDb250cmlidXRpb24+Ci0KLSAgICA8L2V4dGVuc2lvbj4KLQotCi0KLQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudFR5cGVzIj4KLSAgICAgICAgPGRvY3VtZW50VHlwZQotICAgICAgICAgICAgZWxlbWVudE5hbWU9Imh0bWwiCi0gICAgICAgICAgICBkaXNwbGF5TmFtZT0iJWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS4wIgotICAgICAgICAgICAgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgICAgICAgaXNYSFRNTD0idHJ1ZSIKLSAgICAgICAgICAgIGhhc0ZyYW1lc2V0PSJmYWxzZSIKLSAgICAgICAgICAgIHB1YmxpY0lEPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAgICAgICAgIHN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLSAgICAgICAgPC9kb2N1bWVudFR5cGU+Ci0gICAgICAgIDxkb2N1bWVudFR5cGUKLSAgICAgICAgICAgIGVsZW1lbnROYW1lPSJodG1sIgotICAgICAgICAgICAgZGlzcGxheU5hbWU9IiVkb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuMSIKLSAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgIGlzWEhUTUw9InRydWUiCi0gICAgICAgICAgICBoYXNGcmFtZXNldD0iZmFsc2UiCi0gICAgICAgICAgICBwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICAgICBkZWZhdWx0WEhUTUw9InRydWUiCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0gICAgICAgIDwvZG9jdW1lbnRUeXBlPgotICAgICAgICA8ZG9jdW1lbnRUeXBlCi0gICAgICAgICAgICBlbGVtZW50TmFtZT0iaHRtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSIlZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjIiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICBpc1hIVE1MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9InRydWUiCi0gICAgICAgICAgICBwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiIKLSAgICAgICAgICAgIHN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1mcmFtZXNldC5kdGQiPgotICAgICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICAgICAgPGRvY3VtZW50VHlwZQotICAgICAgICAgICAgZWxlbWVudE5hbWU9Imh0bWwiCi0gICAgICAgICAgICBkaXNwbGF5TmFtZT0iJWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS4zIgotICAgICAgICAgICAgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgICAgICAgaXNYSFRNTD0idHJ1ZSIKLSAgICAgICAgICAgIGhhc0ZyYW1lc2V0PSJmYWxzZSIKLSAgICAgICAgICAgIHB1YmxpY0lEPSItLy9XM0MvL0RURCBYSFRNTCBCYXNpYyAxLjAvL0VOIgotICAgICAgICAgICAgc3lzdGVtSUQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLWJhc2ljL3hodG1sLWJhc2ljMTAuZHRkIj4KLSAgICAgICAgPC9kb2N1bWVudFR5cGU+Ci0gICAgICAgIDxkb2N1bWVudFR5cGUKLSAgICAgICAgICAgIGVsZW1lbnROYW1lPSJodG1sIgotICAgICAgICAgICAgZGlzcGxheU5hbWU9IiVkb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuNCIKLSAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgIGlzWEhUTUw9InRydWUiCi0gICAgICAgICAgICBoYXNGcmFtZXNldD0iZmFsc2UiCi0gICAgICAgICAgICBwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIKLSAgICAgICAgICAgIHN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLmR0ZCI+Ci0gICAgICAgIDwvZG9jdW1lbnRUeXBlPgotICAgICAgICA8ZG9jdW1lbnRUeXBlCi0gICAgICAgICAgICBlbGVtZW50TmFtZT0iaHRtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSIlZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjUiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICBpc1hIVE1MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9ImZhbHNlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1dBUEZPUlVNLy9EVEQgWEhUTUwgTW9iaWxlIDEuMC8vRU4iCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3hodG1sLW1vYmlsZTEwLmR0ZCI+Ci0gICAgICAgIDwvZG9jdW1lbnRUeXBlPgotICAgICAgICA8ZG9jdW1lbnRUeXBlCi0gICAgICAgICAgICBlbGVtZW50TmFtZT0id21sIgotICAgICAgICAgICAgZGlzcGxheU5hbWU9IiVkb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuNiIKLSAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iIgotICAgICAgICAgICAgaXNXTUw9InRydWUiCi0gICAgICAgICAgICBoYXNGcmFtZXNldD0iZmFsc2UiCi0gICAgICAgICAgICBwdWJsaWNJRD0iLS8vV0FQRk9SVU0vL0RURCBXTUwgMS4zLy9FTiIKLSAgICAgICAgICAgIGRlZmF1bHRXTUw9InRydWUiCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3dtbDEzLmR0ZCI+Ci0gICAgICAgIDwvZG9jdW1lbnRUeXBlPgotICAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL2h0dHAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy94c2QvaHR0cC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDY2ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy94c2QvaHR0cC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotIAotQ29weXJpZ2h0IDIwMDEgLSAyMDA1LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24KLUFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotTGljZW5zZSBmb3IgV1NETCBTY2hlbWEgRmlsZXMKLQotVGhlIEF1dGhvcnMgZ3JhbnQgcGVybWlzc2lvbiB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBXU0RMIFNjaGVtYSAKLUZpbGVzIGluIGFueSBtZWRpdW0gd2l0aG91dCBmZWUgb3Igcm95YWx0eSBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGFuZCAKLWxpY2Vuc2UgYXJlIGRpc3RyaWJ1dGVkIHdpdGggdGhlbS4gIFRoZSBvcmlnaW5hbHMgb2YgdGhlc2UgZmlsZXMgY2FuIAotYmUgbG9jYXRlZCBhdDoKLQotaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwL3dzZGwtaHR0cC54c2QKLQotVEhFU0UgU0NIRU1BIEZJTEVTIEFSRSBQUk9WSURFRCAiQVMgSVMsIiBBTkQgVEhFIEFVVEhPUlMgTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgCi1PUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIFJFR0FSRElORyBUSEVTRSBGSUxFUywgSU5DTFVESU5HLCBCVVQgTk9UIAotTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCAKLU5PTi1JTkZSSU5HRU1FTlQgT1IgVElUTEUuICBUSEUgQVVUSE9SUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIAotSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIE9SIAotUkVMQVRJTkcgVE8gQU5ZIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFU0UgRklMRVMuCi0KLVRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIHRoZSBBdXRob3JzIG1heSBOT1QgYmUgdXNlZCBpbiBhbnkgbWFubmVyLCAKLWluY2x1ZGluZyBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGVzZSBmaWxlcyBvciBhbnkgcHJvZ3JhbSAKLW9yIHNlcnZpY2UgdGhhdCB1c2VzIHRoZXNlIGZpbGVzLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaXRsZSB0byBjb3B5cmlnaHQgCi1pbiB0aGVzZSBmaWxlcyB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCB0aGUgQXV0aG9ycy4KLQotTm8gb3RoZXIgcmlnaHRzIGFyZSBncmFudGVkIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuCi0KLQotCi0gIC0tPiAKLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIj4KLQotCTxpbXBvcnQgbmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0KLSAgIAk8ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiB0eXBlPSJodHRwOmFkZHJlc3NUeXBlIi8+Ci0KLSAgIAk8Y29tcGxleFR5cGUgbmFtZT0iYWRkcmVzc1R5cGUiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCTxleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotCQkJPHNlcXVlbmNlLz4KLQotICAgCQkJPGF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotICAgCTwvY29tcGxleFR5cGU+Ci0KLSAgIAk8ZWxlbWVudCBuYW1lPSJiaW5kaW5nIiB0eXBlPSJodHRwOmJpbmRpbmdUeXBlIi8+Ci0gICAJPGNvbXBsZXhUeXBlIG5hbWU9ImJpbmRpbmdUeXBlIj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQk8ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLQotCQkJPHNlcXVlbmNlLz4KLQkgICAgICAJCTxhdHRyaWJ1dGUgbmFtZT0idmVyYiIgdHlwZT0iTk1UT0tFTiIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLSAgIAk8L2NvbXBsZXhUeXBlPgotCi0gICAJPGVsZW1lbnQgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJodHRwOm9wZXJhdGlvblR5cGUiLz4KLSAgIAk8Y29tcGxleFR5cGUgbmFtZT0ib3BlcmF0aW9uVHlwZSI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQotCQk8ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLQkJCTxzZXF1ZW5jZS8+Ci0JICAgICAgCQk8YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4KLQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQotICAgCTxlbGVtZW50IG5hbWU9InVybEVuY29kZWQiPgotICAgICAgCQk8Y29tcGxleFR5cGUvPiAgCQkKLSAgIAk8L2VsZW1lbnQ+Ci0KLSAgIAk8ZWxlbWVudCBuYW1lPSJ1cmxSZXBsYWNlbWVudCI+Ci0gICAgICAJCTxjb21wbGV4VHlwZS8+Ci0gICAgIAk8L2VsZW1lbnQ+Ci08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9zb2FwLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3NvYXAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWY4NTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3NvYXAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gCi1Db3B5cmlnaHQgMjAwMSAtIDIwMDUsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbgotQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1MaWNlbnNlIGZvciBXU0RMIFNjaGVtYSBGaWxlcwotCi1UaGUgQXV0aG9ycyBncmFudCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFdTREwgU2NoZW1hIAotRmlsZXMgaW4gYW55IG1lZGl1bSB3aXRob3V0IGZlZSBvciByb3lhbHR5IGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgYW5kIAotbGljZW5zZSBhcmUgZGlzdHJpYnV0ZWQgd2l0aCB0aGVtLiAgVGhlIG9yaWdpbmFscyBvZiB0aGVzZSBmaWxlcyBjYW4gCi1iZSBsb2NhdGVkIGF0OgotCi1odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvMjAwMy0wMi0xMS54c2QKLQotVEhFU0UgU0NIRU1BIEZJTEVTIEFSRSBQUk9WSURFRCAiQVMgSVMsIiBBTkQgVEhFIEFVVEhPUlMgTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgCi1PUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIFJFR0FSRElORyBUSEVTRSBGSUxFUywgSU5DTFVESU5HLCBCVVQgTk9UIAotTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCAKLU5PTi1JTkZSSU5HRU1FTlQgT1IgVElUTEUuICBUSEUgQVVUSE9SUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIAotSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIE9SIAotUkVMQVRJTkcgVE8gQU5ZIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFU0UgRklMRVMuCi0KLVRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIHRoZSBBdXRob3JzIG1heSBOT1QgYmUgdXNlZCBpbiBhbnkgbWFubmVyLCAKLWluY2x1ZGluZyBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGVzZSBmaWxlcyBvciBhbnkgcHJvZ3JhbSAKLW9yIHNlcnZpY2UgdGhhdCB1c2VzIHRoZXNlIGZpbGVzLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaXRsZSB0byBjb3B5cmlnaHQgCi1pbiB0aGVzZSBmaWxlcyB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCB0aGUgQXV0aG9ycy4KLQotTm8gb3RoZXIgcmlnaHRzIGFyZSBncmFudGVkIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuCi0KLQotLS0+IAotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iID4KLQotICA8eHM6aW1wb3J0IG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgLz4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbmNvZGluZ1N0eWxlIiA+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICJlbmNvZGluZ1N0eWxlIiBpbmRpY2F0ZXMgYW55IGNhbm9uaWNhbGl6YXRpb24gY29udmVudGlvbnMgZm9sbG93ZWQgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250YWluaW5nIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgdGhlIHZhbHVlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgaW5kaWNhdGVzIHRoZSBwYXR0ZXJuIGRlc2NyaWJlZCBpbiBTT0FQIHNwZWNpZmljYXRpb24KLSAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0KLSAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6YW55VVJJIiAvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYmluZGluZyIgdHlwZT0ic29hcDp0QmluZGluZyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRCaW5kaW5nIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmlsaXR5RWxlbWVudCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRyYW5zcG9ydCIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN0eWxlIiB0eXBlPSJzb2FwOnRTdHlsZUNob2ljZSIgdXNlPSJvcHRpb25hbCIgLz4KLQotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ0U3R5bGVDaG9pY2UiID4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIiA+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJwYyIgLz4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZG9jdW1lbnQiIC8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLQotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJzb2FwOnRPcGVyYXRpb24iIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0T3BlcmF0aW9uIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmlsaXR5RWxlbWVudCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNvYXBBY3Rpb24iIHR5cGU9InhzOmFueVVSSSIgdXNlPSJvcHRpb25hbCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdHlsZSIgdHlwZT0ic29hcDp0U3R5bGVDaG9pY2UiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLQotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYm9keSIgdHlwZT0ic29hcDp0Qm9keSIgLz4KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9InRCb2R5QXR0cmlidXRlcyIgPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmdTdHlsZSIgdHlwZT0ic29hcDplbmNvZGluZ1N0eWxlIiB1c2U9Im9wdGlvbmFsIiAvPgkgICAKLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZSIgdHlwZT0ic29hcDp1c2VDaG9pY2UiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJvcHRpb25hbCIgLz4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRCb2R5IiA+Ci0KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2liaWxpdHlFbGVtZW50IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGFydHMiIHR5cGU9InhzOk5NVE9LRU5TIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmID0gInNvYXA6dEJvZHlBdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InVzZUNob2ljZSIgPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciID4KLQotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsaXRlcmFsIiAvPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJlbmNvZGVkIiAvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJmYXVsdCIgdHlwZT0ic29hcDp0RmF1bHQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0RmF1bHRSZXMiIGFic3RyYWN0PSJ0cnVlIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InNvYXA6dEJvZHkiID4KLQotCSAgICA8eHM6YXR0cmlidXRlIHJlZj0id3NkbDpyZXF1aXJlZCIgdXNlPSJvcHRpb25hbCIgLz4gCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGFydHMiIHR5cGU9InhzOk5NVE9LRU5TIiB1c2U9InByb2hpYml0ZWQiIC8+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9InNvYXA6dEJvZHlBdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PiAgCQotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEZhdWx0IiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJzb2FwOnRGYXVsdFJlcyI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotCi0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaGVhZGVyIiB0eXBlPSJzb2FwOnRIZWFkZXIiIC8+Ci0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJ0SGVhZGVyQXR0cmlidXRlcyIgPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXJ0IiB0eXBlPSJ4czpOTVRPS0VOIiB1c2U9InJlcXVpcmVkIiAvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlIiB0eXBlPSJzb2FwOnVzZUNob2ljZSIgdXNlPSJyZXF1aXJlZCIgLz4KLQotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmdTdHlsZSIgdHlwZT0ic29hcDplbmNvZGluZ1N0eWxlIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0ib3B0aW9uYWwiIC8+ICAgICAgCi0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0SGVhZGVyIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmlsaXR5RWxlbWVudCIgPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJzb2FwOmhlYWRlcmZhdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotCi0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9InNvYXA6dEhlYWRlckF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImhlYWRlcmZhdWx0IiB0eXBlPSJzb2FwOnRIZWFkZXJGYXVsdCIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRIZWFkZXJGYXVsdCIgPgotCTx4czphdHRyaWJ1dGVHcm91cCByZWY9InNvYXA6dEhlYWRlckF0dHJpYnV0ZXMiIC8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgdHlwZT0ic29hcDp0QWRkcmVzcyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRBZGRyZXNzIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmlsaXR5RWxlbWVudCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9zb2FwZW5jLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3NvYXBlbmMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWM4MGRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3NvYXBlbmMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNTg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04JyA/PgotCi08IS0tIFNjaGVtYSBmb3IgdGhlIFNPQVAvMS4xIGVuY29kaW5nCi0KLVBvcnRpb25zIMKpIDIwMDEgRGV2ZWxvcE1lbnRvci4gCi3CqSAyMDAxIFczQyAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gIAotIAotVGhpcyBkb2N1bWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgVzNDIFNvZnR3YXJlIExpY2Vuc2UgWzFdIGFzIGRlc2NyaWJlZCBpbiB0aGUgRkFRIFsyXS4KLVsxXSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMAotWzJdIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUS0yMDAwMDYyMC5odG1sI0RURCAKLUJ5IG9idGFpbmluZywgdXNpbmcgYW5kL29yIGNvcHlpbmcgdGhpcyB3b3JrLCB5b3UgKHRoZSBsaWNlbnNlZSkgYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLCBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zOgotCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgb3Igcm95YWx0eSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9uIEFMTCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIG9yIHBvcnRpb25zIHRoZXJlb2YsIGluY2x1ZGluZyBtb2RpZmljYXRpb25zLCB0aGF0IHlvdSBtYWtlOgotCi0xLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGlzIE5PVElDRSBpbiBhIGxvY2F0aW9uIHZpZXdhYmxlIHRvIHVzZXJzIG9mIHRoZSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgd29yay4gCi0KLTIuICBBbnkgcHJlLWV4aXN0aW5nIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBkaXNjbGFpbWVycywgbm90aWNlcywgb3IgdGVybXMgYW5kIGNvbmRpdGlvbnMuIElmIG5vbmUgZXhpc3QsIGEgc2hvcnQgbm90aWNlIG9mIHRoZSBmb2xsb3dpbmcgZm9ybSAoaHlwZXJ0ZXh0IGlzIHByZWZlcnJlZCwgdGV4dCBpcyBwZXJtaXR0ZWQpIHNob3VsZCBiZSB1c2VkIHdpdGhpbiB0aGUgYm9keSBvZiBhbnkgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIGNvZGU6ICJDb3B5cmlnaHQgwqkgMjAwMSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLCAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8iIAotCi0zLiAgTm90aWNlIG9mIGFueSBjaGFuZ2VzIG9yIG1vZGlmaWNhdGlvbnMgdG8gdGhlIFczQyBmaWxlcywgaW5jbHVkaW5nIHRoZSBkYXRlIGNoYW5nZXMgd2VyZSBtYWRlLiAoV2UgcmVjb21tZW5kIHlvdSBwcm92aWRlIFVSSXMgdG8gdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggdGhlIGNvZGUgaXMgZGVyaXZlZC4pICAgCi0KLU9yaWdpbmFsIFczQyBmaWxlczsgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNi9zb2FwLWVuY29kaW5nCi1DaGFuZ2VzIG1hZGU6IAotICAgICAtIHJldmVydGVkIG5hbWVzcGFjZSB0byBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAtIHJldmVydGVkIHJvb3QgdG8gb25seSBhbGxvdyAwIGFuZCAxIGFzIGxleGljYWwgdmFsdWVzCi0JIC0gcmVtb3ZlZCBkZWZhdWx0IHZhbHVlIGZyb20gcm9vdCBhdHRyaWJ1dGUgZGVjbGFyYXRpb24KLQotVEhJUyBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMsIiBBTkQgQ09QWVJJR0hUIEhPTERFUlMgTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFIFVTRSBPRiBUSEUgU09GVFdBUkUgT1IgRE9DVU1FTlRBVElPTiBXSUxMIE5PVCBJTkZSSU5HRSBBTlkgVEhJUkQgUEFSVFkgUEFURU5UUywgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMuCi0KLUNPUFlSSUdIVCBIT0xERVJTIFdJTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIEFOWSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04uCi0KLVRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIGNvcHlyaWdodCBob2xkZXJzIG1heSBOT1QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHQgaG9sZGVycy4KLQotLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgPgotICAgICAgICAKLSA8eHM6YXR0cmlidXRlIG5hbWU9InJvb3QiID4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLQkgICAncm9vdCcgY2FuIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggc2VyaWFsaXphdGlvbiByb290cyBmcm9tIG90aGVyCi0gICAgICAgZWxlbWVudHMgdGhhdCBhcmUgcHJlc2VudCBpbiBhIHNlcmlhbGl6YXRpb24gYnV0IGFyZSBub3Qgcm9vdHMgb2YKLSAgICAgICBhIHNlcmlhbGl6ZWQgdmFsdWUgZ3JhcGggCi0JIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpzaW1wbGVUeXBlPgotCi0gICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpib29sZWFuJz4KLQkgICA8eHM6cGF0dGVybiB2YWx1ZT0nMHwxJyAvPgotCSA8L3hzOnJlc3RyaWN0aW9uPgotICAgPC94czpzaW1wbGVUeXBlPgotIDwveHM6YXR0cmlidXRlPgotCi0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJjb21tb25BdHRyaWJ1dGVzIiA+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0JICA8eHM6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBBdHRyaWJ1dGVzIGNvbW1vbiB0byBhbGwgZWxlbWVudHMgdGhhdCBmdW5jdGlvbiBhcyBhY2Nlc3NvcnMgb3IgCi0gICAgICAgIHJlcHJlc2VudCBpbmRlcGVuZGVudCAobXVsdGktcmVmKSB2YWx1ZXMuICBUaGUgaHJlZiBhdHRyaWJ1dGUgaXMKLSAgICAgICAgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBhIG1hbm5lciBsaWtlIENPTlJFRi4gIFRoYXQgaXMsIHRoZSBlbGVtZW50Ci0gICAgICAgIGNvbnRlbnQgc2hvdWxkIGJlIGVtcHR5IGlmZiB0aGUgaHJlZiBhdHRyaWJ1dGUgYXBwZWFycwotCSAgPC94czpkb2N1bWVudGF0aW9uPgotCTwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIgLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9InhzOmFueVVSSSIgLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLSAgPCEtLSBHbG9iYWwgQXR0cmlidXRlcy4gIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNhYmxlIHZpYSBxdWFsaWZpZWQgYXR0cmlidXRlIG5hbWVzIG9uIGFueSBjb21wbGV4IHR5cGUgcmVmZXJlbmNpbmcgdGhlbS4gLS0+Ci0gICAgICAgCi0gIDwhLS0gQXJyYXkgYXR0cmlidXRlcy4gTmVlZGVkIHRvIGdpdmUgdGhlIHR5cGUgYW5kIGRpbWVuc2lvbnMgb2YgYW4gYXJyYXkncyBjb250ZW50cywgYW5kIHRoZSBvZmZzZXQgZm9yIHBhcnRpYWxseS10cmFuc21pdHRlZCBhcnJheXMuIC0tPgotCi0gICAKLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYXJyYXlDb29yZGluYXRlIiA+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIgLz4KLSAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICAgIAotICA8eHM6YXR0cmlidXRlIG5hbWU9ImFycmF5VHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9Im9mZnNldCIgdHlwZT0idG5zOmFycmF5Q29vcmRpbmF0ZSIgLz4KLSAgCi0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJhcnJheUF0dHJpYnV0ZXMiID4KLSAgICA8eHM6YXR0cmlidXRlIHJlZj0idG5zOmFycmF5VHlwZSIgLz4KLSAgICA8eHM6YXR0cmlidXRlIHJlZj0idG5zOm9mZnNldCIgLz4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4gICAgCi0gIAotICA8eHM6YXR0cmlidXRlIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJ0bnM6YXJyYXlDb29yZGluYXRlIiAvPiAKLSAgCi0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJhcnJheU1lbWJlckF0dHJpYnV0ZXMiID4KLQotICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ0bnM6cG9zaXRpb24iIC8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+ICAgIAotCi0gIDx4czpncm91cCBuYW1lPSJBcnJheSIgPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JPC94czpzZXF1ZW5jZT4KLSAgPC94czpncm91cD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJBcnJheSIgdHlwZT0idG5zOkFycmF5IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXJyYXkiID4KLQotICAgIDx4czphbm5vdGF0aW9uPgotCSAgPHhzOmRvY3VtZW50YXRpb24+Ci0JICAgJ0FycmF5JyBpcyBhIGNvbXBsZXggdHlwZSBmb3IgYWNjZXNzb3JzIGlkZW50aWZpZWQgYnkgcG9zaXRpb24gCi0JICA8L3hzOmRvY3VtZW50YXRpb24+Ci0JPC94czphbm5vdGF0aW9uPgotICAgIDx4czpncm91cCByZWY9InRuczpBcnJheSIgbWluT2NjdXJzPSIwIiAvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczphcnJheUF0dHJpYnV0ZXMiIC8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gIDwveHM6Y29tcGxleFR5cGU+IAotCi0gIDwhLS0gJ1N0cnVjdCcgaXMgYSBjb21wbGV4IHR5cGUgZm9yIGFjY2Vzc29ycyBpZGVudGlmaWVkIGJ5IG5hbWUuIAotICAgICAgIENvbnN0cmFpbnQ6IE5vIGVsZW1lbnQgbWF5IGJlIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBhbnkgb3RoZXIsCi0gICAgICAgbm9yIG1heSBhbnkgZWxlbWVudCBoYXZlIGEgbWF4T2NjdXJzID4gMS4gLS0+Ci0KLSAgIAotICA8eHM6ZWxlbWVudCBuYW1lPSJTdHJ1Y3QiIHR5cGU9InRuczpTdHJ1Y3QiIC8+Ci0KLSAgPHhzOmdyb3VwIG5hbWU9IlN0cnVjdCIgPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JPC94czpzZXF1ZW5jZT4KLSAgPC94czpncm91cD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iU3RydWN0IiA+Ci0gICAgPHhzOmdyb3VwIHJlZj0idG5zOlN0cnVjdCIgbWluT2NjdXJzPSIwIiAvPgotCi0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgPC94czpjb21wbGV4VHlwZT4gCi0KLSAgPCEtLSAnQmFzZTY0JyBjYW4gYmUgdXNlZCB0byBzZXJpYWxpemUgYmluYXJ5IGRhdGEgdXNpbmcgYmFzZTY0IGVuY29kaW5nCi0gICAgICAgYXMgZGVmaW5lZCBpbiBSRkMyMDQ1IGJ1dCB3aXRob3V0IHRoZSBNSU1FIGxpbmUgbGVuZ3RoIGxpbWl0YXRpb24uIC0tPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImJhc2U2NCIgPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpiYXNlNjRCaW5hcnkiIC8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotIDwhLS0gRWxlbWVudCBkZWNsYXJhdGlvbnMgY29ycmVzcG9uZGluZyB0byBlYWNoIG9mIHRoZSBzaW1wbGUgdHlwZXMgaW4gdGhlIAotICAgICAgWE1MIFNjaGVtYXMgU3BlY2lmaWNhdGlvbi4gLS0+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZHVyYXRpb24iIHR5cGU9InRuczpkdXJhdGlvbiIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZHVyYXRpb24iID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZHVyYXRpb24iID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGF0ZVRpbWUiIHR5cGU9InRuczpkYXRlVGltZSIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZGF0ZVRpbWUiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZGF0ZVRpbWUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLQotCi0gIDx4czplbGVtZW50IG5hbWU9Ik5PVEFUSU9OIiB0eXBlPSJ0bnM6Tk9UQVRJT04iIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJOT1RBVElPTiIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpRTmFtZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgCi0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idGltZSIgdHlwZT0idG5zOnRpbWUiIC8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dGltZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJkYXRlIiB0eXBlPSJ0bnM6ZGF0ZSIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZGF0ZSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpkYXRlIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdZZWFyTW9udGgiIHR5cGU9InRuczpnWWVhck1vbnRoIiAvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJnWWVhck1vbnRoIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmdZZWFyTW9udGgiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZ1llYXIiIHR5cGU9InRuczpnWWVhciIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ1llYXIiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Z1llYXIiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZ01vbnRoRGF5IiB0eXBlPSJ0bnM6Z01vbnRoRGF5IiAvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJnTW9udGhEYXkiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Z01vbnRoRGF5IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdEYXkiIHR5cGU9InRuczpnRGF5IiAvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJnRGF5IiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmdEYXkiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZ01vbnRoIiB0eXBlPSJ0bnM6Z01vbnRoIiAvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJnTW9udGgiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Z01vbnRoIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotICAKLSAgPHhzOmVsZW1lbnQgbmFtZT0iYm9vbGVhbiIgdHlwZT0idG5zOmJvb2xlYW4iIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJib29sZWFuIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Ym9vbGVhbiIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJiYXNlNjRCaW5hcnkiIHR5cGU9InRuczpiYXNlNjRCaW5hcnkiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJiYXNlNjRCaW5hcnkiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpiYXNlNjRCaW5hcnkiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaGV4QmluYXJ5IiB0eXBlPSJ0bnM6aGV4QmluYXJ5IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iaGV4QmluYXJ5IiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpoZXhCaW5hcnkiID4KLSAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImZsb2F0IiB0eXBlPSJ0bnM6ZmxvYXQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJmbG9hdCIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmZsb2F0IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImRvdWJsZSIgdHlwZT0idG5zOmRvdWJsZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRvdWJsZSIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmRvdWJsZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJhbnlVUkkiIHR5cGU9InRuczphbnlVUkkiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhbnlVUkkiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbnlVUkkiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iUU5hbWUiIHR5cGU9InRuczpRTmFtZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlFOYW1lIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6UU5hbWUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgCi0gIDx4czplbGVtZW50IG5hbWU9InN0cmluZyIgdHlwZT0idG5zOnN0cmluZyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InN0cmluZyIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJub3JtYWxpemVkU3RyaW5nIiB0eXBlPSJ0bnM6bm9ybWFsaXplZFN0cmluZyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5vcm1hbGl6ZWRTdHJpbmciID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpub3JtYWxpemVkU3RyaW5nIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InRva2VuIiB0eXBlPSJ0bnM6dG9rZW4iIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0b2tlbiIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnRva2VuIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Imxhbmd1YWdlIiB0eXBlPSJ0bnM6bGFuZ3VhZ2UiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsYW5ndWFnZSIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmxhbmd1YWdlIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InRuczpOYW1lIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTmFtZSIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOk5hbWUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iTk1UT0tFTiIgdHlwZT0idG5zOk5NVE9LRU4iIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJOTVRPS0VOIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Tk1UT0tFTiIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJOQ05hbWUiIHR5cGU9InRuczpOQ05hbWUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJOQ05hbWUiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpOQ05hbWUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iTk1UT0tFTlMiIHR5cGU9InRuczpOTVRPS0VOUyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5NVE9LRU5TIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Tk1UT0tFTlMiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iSUQiIHR5cGU9InRuczpJRCIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IklEIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6SUQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iSURSRUYiIHR5cGU9InRuczpJRFJFRiIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IklEUkVGIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6SURSRUYiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iRU5USVRZIiB0eXBlPSJ0bnM6RU5USVRZIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRU5USVRZIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6RU5USVRZIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IklEUkVGUyIgdHlwZT0idG5zOklEUkVGUyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IklEUkVGUyIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOklEUkVGUyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJFTlRJVElFUyIgdHlwZT0idG5zOkVOVElUSUVTIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRU5USVRJRVMiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpFTlRJVElFUyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJkZWNpbWFsIiB0eXBlPSJ0bnM6ZGVjaW1hbCIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRlY2ltYWwiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpkZWNpbWFsIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImludGVnZXIiIHR5cGU9InRuczppbnRlZ2VyIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iaW50ZWdlciIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmludGVnZXIiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibm9uUG9zaXRpdmVJbnRlZ2VyIiB0eXBlPSJ0bnM6bm9uUG9zaXRpdmVJbnRlZ2VyIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibm9uUG9zaXRpdmVJbnRlZ2VyIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6bm9uUG9zaXRpdmVJbnRlZ2VyIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im5lZ2F0aXZlSW50ZWdlciIgdHlwZT0idG5zOm5lZ2F0aXZlSW50ZWdlciIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5lZ2F0aXZlSW50ZWdlciIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm5lZ2F0aXZlSW50ZWdlciIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJsb25nIiB0eXBlPSJ0bnM6bG9uZyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImxvbmciID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpsb25nIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImludCIgdHlwZT0idG5zOmludCIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImludCIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmludCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJzaG9ydCIgdHlwZT0idG5zOnNob3J0IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2hvcnQiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzaG9ydCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJieXRlIiB0eXBlPSJ0bnM6Ynl0ZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImJ5dGUiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpieXRlIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im5vbk5lZ2F0aXZlSW50ZWdlciIgdHlwZT0idG5zOm5vbk5lZ2F0aXZlSW50ZWdlciIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5vbk5lZ2F0aXZlSW50ZWdlciIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ1bnNpZ25lZExvbmciIHR5cGU9InRuczp1bnNpZ25lZExvbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZExvbmciID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp1bnNpZ25lZExvbmciID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idW5zaWduZWRJbnQiIHR5cGU9InRuczp1bnNpZ25lZEludCIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InVuc2lnbmVkSW50IiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRJbnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idW5zaWduZWRTaG9ydCIgdHlwZT0idG5zOnVuc2lnbmVkU2hvcnQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZFNob3J0IiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRTaG9ydCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ1bnNpZ25lZEJ5dGUiIHR5cGU9InRuczp1bnNpZ25lZEJ5dGUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZEJ5dGUiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp1bnNpZ25lZEJ5dGUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0icG9zaXRpdmVJbnRlZ2VyIiB0eXBlPSJ0bnM6cG9zaXRpdmVJbnRlZ2VyIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0icG9zaXRpdmVJbnRlZ2VyIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6cG9zaXRpdmVJbnRlZ2VyIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImFueVR5cGUiIC8+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3dzZGwtbWltZS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC93c2RsLW1pbWUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmRmYmViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3dzZGwtbWltZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAKLUNvcHlyaWdodCAyMDAxLTIwMDUsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbgotQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1MaWNlbnNlIGZvciBXU0RMIFNjaGVtYSBGaWxlcwotCi1UaGUgQXV0aG9ycyBncmFudCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFdTREwgU2NoZW1hIAotRmlsZXMgaW4gYW55IG1lZGl1bSB3aXRob3V0IGZlZSBvciByb3lhbHR5IGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgYW5kIAotbGljZW5zZSBhcmUgZGlzdHJpYnV0ZWQgd2l0aCB0aGVtLiAgVGhlIG9yaWdpbmFscyBvZiB0aGVzZSBmaWxlcyBjYW4gCi1iZSBsb2NhdGVkIGF0OgotCi1odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvMjAwNC0wOC0yNC54c2QKLQotVEhFU0UgU0NIRU1BIEZJTEVTIEFSRSBQUk9WSURFRCAiQVMgSVMsIiBBTkQgVEhFIEFVVEhPUlMgTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgCi1PUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIFJFR0FSRElORyBUSEVTRSBGSUxFUywgSU5DTFVESU5HLCBCVVQgTk9UIAotTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCAKLU5PTi1JTkZSSU5HRU1FTlQgT1IgVElUTEUuICBUSEUgQVVUSE9SUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIAotSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIE9SIAotUkVMQVRJTkcgVE8gQU5ZIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFU0UgRklMRVMuCi0KLVRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIHRoZSBBdXRob3JzIG1heSBOT1QgYmUgdXNlZCBpbiBhbnkgbWFubmVyLCAKLWluY2x1ZGluZyBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGVzZSBmaWxlcyBvciBhbnkgcHJvZ3JhbSAKLW9yIHNlcnZpY2UgdGhhdCB1c2VzIHRoZXNlIGZpbGVzLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaXRsZSB0byBjb3B5cmlnaHQgCi1pbiB0aGVzZSBmaWxlcyB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCB0aGUgQXV0aG9ycy4KLQotTm8gb3RoZXIgcmlnaHRzIGFyZSBncmFudGVkIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuCi0KLQotICAtLT4gCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyI+Ci0JPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0JPGVsZW1lbnQgbmFtZT0iY29udGVudCIgdHlwZT0ibWltZTpjb250ZW50VHlwZSIvPgotCTxjb21wbGV4VHlwZSBuYW1lPSJjb250ZW50VHlwZSI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotCQkJCTxzZXF1ZW5jZS8+Ci0JCQkJPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCQk8YXR0cmlidXRlIG5hbWU9InBhcnQiIHR5cGU9Ik5NVE9LRU4iIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGVsZW1lbnQgbmFtZT0ibXVsdGlwYXJ0UmVsYXRlZCIgdHlwZT0ibWltZTptdWx0aXBhcnRSZWxhdGVkVHlwZSIvPgotCTxjb21wbGV4VHlwZSBuYW1lPSJtdWx0aXBhcnRSZWxhdGVkVHlwZSI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgcmVmPSJtaW1lOnBhcnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8ZWxlbWVudCBuYW1lPSJwYXJ0IiB0eXBlPSJtaW1lOnRQYXJ0Ii8+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9InRQYXJ0Ij4KLQkJPHNlcXVlbmNlPgotCQkJPGFueSBuYW1lc3BhY2U9IiMjYW55IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwvc2VxdWVuY2U+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0iTk1UT0tFTiIgdXNlPSJvcHRpb25hbCIvPgotCTwvY29tcGxleFR5cGU+Ci0gICAJPGVsZW1lbnQgbmFtZT0ibWltZVhtbCIgdHlwZSA9ICJtaW1lOnRNaW1lWG1sIi8+Ci0gICAJPGNvbXBsZXhUeXBlIG5hbWU9InRNaW1lWG1sIj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0JCQkJPHNlcXVlbmNlLz4KLQkJCQk8YXR0cmlidXRlIG5hbWU9InBhcnQiIHR5cGU9Ik5NVE9LRU4iIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotICAgCTwvY29tcGxleFR5cGU+Ci08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3dzZGwueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy94c2Qvd3NkbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ODFkNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy94c2Qvd3NkbC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAKLUNvcHlyaWdodCAyMDAxIC0gMjAwNSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgTWljcm9zb2Z0IENvcnBvcmF0aW9uCi1BbGwgUmlnaHRzIFJlc2VydmVkCi0KLUxpY2Vuc2UgZm9yIFdTREwgU2NoZW1hIEZpbGVzCi0KLVRoZSBBdXRob3JzIGdyYW50IHBlcm1pc3Npb24gdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgV1NETCBTY2hlbWEgCi1GaWxlcyBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBhbmQgCi1saWNlbnNlIGFyZSBkaXN0cmlidXRlZCB3aXRoIHRoZW0uICBUaGUgb3JpZ2luYWxzIG9mIHRoZXNlIGZpbGVzIGNhbiAKLWJlIGxvY2F0ZWQgYXQ6Ci0KLWh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvMjAwNC0wOC0yNC54c2QKLQotVEhFU0UgU0NIRU1BIEZJTEVTIEFSRSBQUk9WSURFRCAiQVMgSVMsIiBBTkQgVEhFIEFVVEhPUlMgTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgCi1PUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIFJFR0FSRElORyBUSEVTRSBGSUxFUywgSU5DTFVESU5HLCBCVVQgTk9UIAotTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCAKLU5PTi1JTkZSSU5HRU1FTlQgT1IgVElUTEUuICBUSEUgQVVUSE9SUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIAotSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIE9SIAotUkVMQVRJTkcgVE8gQU5ZIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFU0UgRklMRVMuCi0KLVRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIHRoZSBBdXRob3JzIG1heSBOT1QgYmUgdXNlZCBpbiBhbnkgbWFubmVyLCAKLWluY2x1ZGluZyBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGVzZSBmaWxlcyBvciBhbnkgcHJvZ3JhbSAKLW9yIHNlcnZpY2UgdGhhdCB1c2VzIHRoZXNlIGZpbGVzLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaXRsZSB0byBjb3B5cmlnaHQgCi1pbiB0aGVzZSBmaWxlcyB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCB0aGUgQXV0aG9ycy4KLQotTm8gb3RoZXIgcmlnaHRzIGFyZSBncmFudGVkIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuCi0KLQotLS0+IAotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgPgotICAgCi0gIDx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSIgbmFtZT0idERvY3VtZW50YXRpb24iID4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InREb2N1bWVudGVkIiA+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFRoaXMgdHlwZSBpcyBleHRlbmRlZCBieSAgY29tcG9uZW50IHR5cGVzIHRvIGFsbG93IHRoZW0gdG8gYmUgZG9jdW1lbnRlZAotICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJkb2N1bWVudGF0aW9uIiB0eXBlPSJ3c2RsOnREb2N1bWVudGF0aW9uIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotIDwhLS0gaW1wbGVtZW50ZWQgcmVzb2x1dGlvbiBvZiBzd2ExMjQgLS0+Ci0gPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRFeHRlbnNpYmxlQXR0cmlidXRlc0RvY3VtZW50ZWQiIGFic3RyYWN0PSJ0cnVlIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnREb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIFRoaXMgdHlwZSBpcyBleHRlbmRlZCBieSBjb21wb25lbnQgdHlwZXMgdG8gYWxsb3cgYXR0cmlidXRlcyBmcm9tIG90aGVyIG5hbWVzcGFjZXMgdG8gYmUgYWRkZWQuCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4gICAKLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8IS0tIGltcGxlbWVudGVkIHJlc29sdXRpb24gb2Ygc3dhMTI0IC0tPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEV4dGVuc2libGVEb2N1bWVudGVkIiBhYnN0cmFjdD0idHJ1ZSIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICBUaGlzIHR5cGUgaXMgZXh0ZW5kZWQgYnkgY29tcG9uZW50IHR5cGVzIHRvIGFsbG93IGVsZW1lbnRzIGZyb20gb3RoZXIgbmFtZXNwYWNlcyB0byBiZSBhZGRlZC4KLSAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPiAgIAotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJkZWZpbml0aW9ucyIgdHlwZT0id3NkbDp0RGVmaW5pdGlvbnMiID4KLSAgICA8eHM6a2V5IG5hbWU9Im1lc3NhZ2UiID4KLSAgICAgIDx4czpzZWxlY3RvciB4cGF0aD0id3NkbDptZXNzYWdlIiAvPgotICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIgLz4KLSAgICA8L3hzOmtleT4KLSAgICA8eHM6a2V5IG5hbWU9InBvcnRUeXBlIiA+Ci0gICAgICA8eHM6c2VsZWN0b3IgeHBhdGg9IndzZGw6cG9ydFR5cGUiIC8+Ci0gICAgICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIiAvPgotICAgIDwveHM6a2V5PgotICAgIDx4czprZXkgbmFtZT0iYmluZGluZyIgPgotICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ3c2RsOmJpbmRpbmciIC8+Ci0gICAgICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIiAvPgotICAgIDwveHM6a2V5PgotICAgIDx4czprZXkgbmFtZT0ic2VydmljZSIgPgotICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ3c2RsOnNlcnZpY2UiIC8+Ci0gICAgICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIiAvPgotICAgIDwveHM6a2V5PgotICAgIDx4czprZXkgbmFtZT0iaW1wb3J0IiA+Ci0gICAgICA8eHM6c2VsZWN0b3IgeHBhdGg9IndzZGw6aW1wb3J0IiAvPgotICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZXNwYWNlIiAvPgotICAgIDwveHM6a2V5PgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmdyb3VwIG5hbWU9ImFueVRvcExldmVsT3B0aW9uYWxFbGVtZW50IiA+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEFueSB0b3AgbGV2ZWwgb3B0aW9uYWwgZWxlbWVudCBhbGxvd2VkIHRvIGFwcGVhciBtb3JlIHRoZW4gb25jZSAtIGFueSBjaGlsZCBvZiBkZWZpbml0aW9ucyBlbGVtZW50IGV4Y2VwdCB3c2RsOnR5cGVzLiBBbnkgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGlzIGFsbG93ZWQgaW4gYW55IHBsYWNlLgotICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW1wb3J0IiB0eXBlPSJ3c2RsOnRJbXBvcnQiIC8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlcyIgdHlwZT0id3NkbDp0VHlwZXMiIC8+ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiAgdHlwZT0id3NkbDp0TWVzc2FnZSIgPgotICAgICAgICA8eHM6dW5pcXVlIG5hbWU9InBhcnQiID4KLSAgICAgICAgICA8eHM6c2VsZWN0b3IgeHBhdGg9IndzZGw6cGFydCIgLz4KLSAgICAgICAgICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIiAvPgotICAgICAgICA8L3hzOnVuaXF1ZT4KLSAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InBvcnRUeXBlIiB0eXBlPSJ3c2RsOnRQb3J0VHlwZSIgLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImJpbmRpbmciICB0eXBlPSJ3c2RsOnRCaW5kaW5nIiAvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VydmljZSIgIHR5cGU9IndzZGw6dFNlcnZpY2UiID4KLSAgICAgICAgPHhzOnVuaXF1ZSBuYW1lPSJwb3J0IiA+Ci0gICAgICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ3c2RsOnBvcnQiIC8+Ci0gICAgICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIgLz4KLSAgICAgICAgPC94czp1bmlxdWU+Ci0JICA8L3hzOmVsZW1lbnQ+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0KLSAgPCEtLSBpbXBsZW1lbnRlZCByZXNvbHV0aW9uIG9mIGVyMDE1IGFuZCBVUEEgZml4LiBBU0sgLS0+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0RGVmaW5pdGlvbnMiPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZURvY3VtZW50ZWQiPgotICAgICAgICA8eHM6c2VxdWVuY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ3c2RsOmFueVRvcExldmVsT3B0aW9uYWxFbGVtZW50Ii8+Ci0gICAgICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4czpncm91cCByZWY9IndzZGw6YW55VG9wTGV2ZWxPcHRpb25hbEVsZW1lbnQiLz4KLSAgICAgICAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIiB1c2U9Ci0ib3B0aW9uYWwiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRJbXBvcnQiID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVBdHRyaWJ1dGVzRG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0VHlwZXMiID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+ICAgCi0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIiAvPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+ICAgCi0gIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idE1lc3NhZ2UiID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+ICAgCi0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJ0IiB0eXBlPSJ3c2RsOnRQYXJ0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+ICAgCi0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRQYXJ0IiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PiAgIAotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlQXR0cmlidXRlc0RvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudCIgdHlwZT0ieHM6UU5hbWUiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0ib3B0aW9uYWwiIC8+ICAgIAotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4gICAKLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idFBvcnRUeXBlIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PiAgIAotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlQXR0cmlidXRlc0RvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0id3NkbDp0T3BlcmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+ICAgCi0gIDwveHM6Y29tcGxleFR5cGU+Ci0gICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRPcGVyYXRpb24iID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+ICAgCi0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIiA+Ci0JICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6Y2hvaWNlPgotICAgICAgICAgICAgPHhzOmdyb3VwIHJlZj0id3NkbDpyZXF1ZXN0LXJlc3BvbnNlLW9yLW9uZS13YXktb3BlcmF0aW9uIiAvPgotICAgICAgICAgICAgPHhzOmdyb3VwIHJlZj0id3NkbDpzb2xpY2l0LXJlc3BvbnNlLW9yLW5vdGlmaWNhdGlvbi1vcGVyYXRpb24iIC8+Ci0gICAgICAgICAgPC94czpjaG9pY2U+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBhcmFtZXRlck9yZGVyIiB0eXBlPSJ4czpOTVRPS0VOUyIgdXNlPSJvcHRpb25hbCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+ICAgCi0gIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgCi0gIDx4czpncm91cCBuYW1lPSJyZXF1ZXN0LXJlc3BvbnNlLW9yLW9uZS13YXktb3BlcmF0aW9uIiA+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5wdXQiIHR5cGU9IndzZGw6dFBhcmFtIiAvPgotCSAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0nMCcgPgotCSAgICA8eHM6ZWxlbWVudCBuYW1lPSJvdXRwdXQiIHR5cGU9IndzZGw6dFBhcmFtIiAvPgotCQk8eHM6ZWxlbWVudCBuYW1lPSJmYXVsdCIgdHlwZT0id3NkbDp0RmF1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmdyb3VwIG5hbWU9InNvbGljaXQtcmVzcG9uc2Utb3Itbm90aWZpY2F0aW9uLW9wZXJhdGlvbiIgPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9Im91dHB1dCIgdHlwZT0id3NkbDp0UGFyYW0iIC8+Ci0JICA8eHM6c2VxdWVuY2UgbWluT2NjdXJzPScwJyA+Ci0JICAgIDx4czplbGVtZW50IG5hbWU9ImlucHV0IiB0eXBlPSJ3c2RsOnRQYXJhbSIgLz4KLQkJPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHQiIHR5cGU9IndzZGw6dEZhdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCSAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmdyb3VwPgotICAgICAgICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRQYXJhbSIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZUF0dHJpYnV0ZXNEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEZhdWx0IiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlQXR0cmlidXRlc0RvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0QmluZGluZyIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZURvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0id3NkbDp0QmluZGluZ09wZXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEJpbmRpbmdPcGVyYXRpb25NZXNzYWdlIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJvcHRpb25hbCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEJpbmRpbmdPcGVyYXRpb25GYXVsdCIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZURvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0QmluZGluZ09wZXJhdGlvbiIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZURvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImlucHV0IiB0eXBlPSJ3c2RsOnRCaW5kaW5nT3BlcmF0aW9uTWVzc2FnZSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Im91dHB1dCIgdHlwZT0id3NkbDp0QmluZGluZ09wZXJhdGlvbk1lc3NhZ2UiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJmYXVsdCIgdHlwZT0id3NkbDp0QmluZGluZ09wZXJhdGlvbkZhdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idFNlcnZpY2UiID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwb3J0IiB0eXBlPSJ3c2RsOnRQb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idFBvcnQiID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJpbmRpbmciIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6YXR0cmlidXRlIG5hbWU9ImFycmF5VHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEV4dGVuc2liaWxpdHlFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgPgotICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ3c2RsOnJlcXVpcmVkIiB1c2U9Im9wdGlvbmFsIiAvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3htbGNhdGFsb2cxMS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC94bWxjYXRhbG9nMTEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWM3OTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3htbGNhdGFsb2cxMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tIA0KLUNvcHlyaWdodCAoYykgVGhlIE9yZ2FuaXphdGlvbiBmb3IgdGhlIEFkdmFuY2VtZW50IG9mIFN0cnVjdHVyZWQgSW5mb3JtYXRpb24gU3RhbmRhcmRzIA0KLVtPQVNJU10gMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0NCi1PQVNJUyB0YWtlcyBubyBwb3NpdGlvbiByZWdhcmRpbmcgdGhlIHZhbGlkaXR5IG9yIHNjb3BlIG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb3Igb3RoZXIgcmlnaHRzDQotdGhhdCBtaWdodCBiZSBjbGFpbWVkIHRvIHBlcnRhaW4gdG8gdGhlIGltcGxlbWVudGF0aW9uIG9yIHVzZSBvZiB0aGUgdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudA0KLW9yIHRoZSBleHRlbnQgdG8gd2hpY2ggYW55IGxpY2Vuc2UgdW5kZXIgc3VjaCByaWdodHMgbWlnaHQgb3IgbWlnaHQgbm90IGJlIGF2YWlsYWJsZTsgbmVpdGhlciBkb2VzIGl0DQotcmVwcmVzZW50IHRoYXQgaXQgaGFzIG1hZGUgYW55IGVmZm9ydCB0byBpZGVudGlmeSBhbnkgc3VjaCByaWdodHMuIEluZm9ybWF0aW9uIG9uIE9BU0lTJ3MgcHJvY2VkdXJlcw0KLXdpdGggcmVzcGVjdCB0byByaWdodHMgaW4gT0FTSVMgc3BlY2lmaWNhdGlvbnMgY2FuIGJlIGZvdW5kIGF0IHRoZSBPQVNJUyB3ZWJzaXRlLiBDb3BpZXMgb2YgY2xhaW1zIG9mDQotcmlnaHRzIG1hZGUgYXZhaWxhYmxlIGZvciBwdWJsaWNhdGlvbiBhbmQgYW55IGFzc3VyYW5jZXMgb2YgbGljZW5zZXMgdG8gYmUgbWFkZSBhdmFpbGFibGUsIG9yIHRoZSByZXN1bHQNCi1vZiBhbiBhdHRlbXB0IG1hZGUgdG8gb2J0YWluIGEgZ2VuZXJhbCBsaWNlbnNlIG9yIHBlcm1pc3Npb24gZm9yIHRoZSB1c2Ugb2Ygc3VjaCBwcm9wcmlldGFyeSByaWdodHMgYnkNCi1pbXBsZW1lbnRvcnMgb3IgdXNlcnMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uLCBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgT0FTSVMgRXhlY3V0aXZlIERpcmVjdG9yLg0KLQ0KLU9BU0lTIGludml0ZXMgYW55IGludGVyZXN0ZWQgcGFydHkgdG8gYnJpbmcgdG8gaXRzIGF0dGVudGlvbiBhbnkgY29weXJpZ2h0cywgcGF0ZW50cyBvciBwYXRlbnQNCi1hcHBsaWNhdGlvbnMsIG9yIG90aGVyIHByb3ByaWV0YXJ5IHJpZ2h0cyB3aGljaCBtYXkgY292ZXIgdGVjaG5vbG9neSB0aGF0IG1heSBiZSByZXF1aXJlZCB0byBpbXBsZW1lbnQNCi10aGlzIHNwZWNpZmljYXRpb24uIFBsZWFzZSBhZGRyZXNzIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgT0FTSVMgRXhlY3V0aXZlIERpcmVjdG9yLg0KLQ0KLVRoaXMgZG9jdW1lbnQgYW5kIHRyYW5zbGF0aW9ucyBvZiBpdCBtYXkgYmUgY29waWVkIGFuZCBmdXJuaXNoZWQgdG8gb3RoZXJzLCBhbmQgZGVyaXZhdGl2ZSB3b3JrcyB0aGF0DQotY29tbWVudCBvbiBvciBvdGhlcndpc2UgZXhwbGFpbiBpdCBvciBhc3Npc3QgaW4gaXRzIGltcGxlbWVudGF0aW9uIG1heSBiZSBwcmVwYXJlZCwgY29waWVkLCBwdWJsaXNoZWQgYW5kDQotZGlzdHJpYnV0ZWQsIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgcmVzdHJpY3Rpb24gb2YgYW55IGtpbmQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodA0KLW5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlIGluY2x1ZGVkIG9uIGFsbCBzdWNoIGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3Jrcy4gSG93ZXZlciwgdGhpcyBkb2N1bWVudA0KLWl0c2VsZiBtYXkgbm90IGJlIG1vZGlmaWVkIGluIGFueSB3YXksIHN1Y2ggYXMgYnkgcmVtb3ZpbmcgdGhlIGNvcHlyaWdodCBub3RpY2Ugb3IgcmVmZXJlbmNlcyB0byBPQVNJUywNCi1leGNlcHQgYXMgbmVlZGVkIGZvciB0aGUgcHVycG9zZSBvZiBkZXZlbG9waW5nIE9BU0lTIHNwZWNpZmljYXRpb25zLCBpbiB3aGljaCBjYXNlIHRoZSBwcm9jZWR1cmVzIGZvcg0KLWNvcHlyaWdodHMgZGVmaW5lZCBpbiB0aGUgT0FTSVMgSW50ZWxsZWN0dWFsIFByb3BlcnR5IFJpZ2h0cyBkb2N1bWVudCBtdXN0IGJlIGZvbGxvd2VkLCBvciBhcyByZXF1aXJlZCB0bw0KLXRyYW5zbGF0ZSBpdCBpbnRvIGxhbmd1YWdlcyBvdGhlciB0aGFuIEVuZ2xpc2guDQotDQotVGhlIGxpbWl0ZWQgcGVybWlzc2lvbnMgZ3JhbnRlZCBhYm92ZSBhcmUgcGVycGV0dWFsIGFuZCB3aWxsIG5vdCBiZSByZXZva2VkIGJ5IE9BU0lTIG9yIGl0cyBzdWNjZXNzb3JzDQotb3IgYXNzaWducy4NCi0NCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpcyBwcm92aWRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzIGFuZCBPQVNJUyBESVNDTEFJTVMNCi1BTEwgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIEFOWSBXQVJSQU5UWSBUSEFUIFRIRSBVU0UgT0YgVEhFDQotSU5GT1JNQVRJT04gSEVSRUlOIFdJTEwgTk9UIElORlJJTkdFIEFOWSBSSUdIVFMgT1IgQU5ZIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUw0KLUZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4NCi0NCi1PQVNJUyBoYXMgYmVlbiBub3RpZmllZCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGNsYWltZWQgaW4gcmVnYXJkIHRvIHNvbWUgb3IgYWxsIG9mIHRoZSBjb250ZW50cw0KLW9mIHRoaXMgc3BlY2lmaWNhdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gY29uc3VsdCB0aGUgb25saW5lIGxpc3Qgb2YgY2xhaW1lZCByaWdodHMuDQotIC0tPg0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgeG1sbnM6ZXI9InVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciDQotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9InVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciDQotICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotDQotICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIi8+DQotDQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJwdWJJZENoYXJzIj4NCi0gICAgPCEtLSBBIHN0cmluZyBvZiB0aGUgY2hhcmFjdGVycyBkZWZpbmVkIGFzIHB1YklkQ2hhciBpbiBwcm9kdWN0aW9uIDEzDQotICAgICAgICAgb2YgdGhlIFNlY29uZCBFZGl0aW9uIG9mIHRoZSBYTUwgMS4wIFJlY29tbWVuZGF0aW9uLiBEb2VzIG5vdCBpbmNsdWRlDQotICAgICAgICAgdGhlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBiZWNhdXNlIHRoZXkncmUgbm9ybWFsaXplZCBieSBYTUwgcGFyc2luZy4gLS0+DQotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPg0KLSAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJbYS16QS1aMC05XC0nXChcKSssLi86PT87ISojQCRfJV0qIi8+DQotICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICA8L3hzOnNpbXBsZVR5cGU+DQotDQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJwdWJsaWNJZGVudGlmaWVyIj4NCi0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9ImVyOnB1YklkQ2hhcnMiLz4NCi0gIDwveHM6c2ltcGxlVHlwZT4NCi0NCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InBhcnRpYWxQdWJsaWNJZGVudGlmaWVyIj4NCi0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9ImVyOnB1YklkQ2hhcnMiLz4NCi0gIDwveHM6c2ltcGxlVHlwZT4NCi0NCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InN5c3RlbU9yUHVibGljIj4NCi0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+DQotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzeXN0ZW0iLz4NCi0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InB1YmxpYyIvPg0KLSAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgPC94czpzaW1wbGVUeXBlPg0KLQ0KLSAgPCEtLSBUaGUgZ2xvYmFsIGF0dHJpYnV0ZSB4bWw6YmFzZSBpcyBub3QgZXhwbGljaXRseSBkZWNsYXJlZDsgLS0+DQotICA8IS0tIGl0IGlzIGFsbG93ZWQgYnkgdGhlIGFueUF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuIC0tPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNhdGFsb2ciPg0KLSAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6cHVibGljIi8+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJlcjpzeXN0ZW0iLz4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOnVyaSIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6cmV3cml0ZVN5c3RlbSIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6cmV3cml0ZVVSSSIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6dXJpU3VmZml4Ii8+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJlcjpzeXN0ZW1TdWZmaXgiLz4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOmRlbGVnYXRlUHVibGljIi8+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJlcjpkZWxlZ2F0ZVN5c3RlbSIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6ZGVsZWdhdGVVUkkiLz4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOm5leHRDYXRhbG9nIi8+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJlcjpncm91cCIvPg0KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9InNraXAiLz4NCi0gICAgPC94czpjaG9pY2U+DQotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+DQotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJlZmVyIiB0eXBlPSJlcjpzeXN0ZW1PclB1YmxpYyIvPg0KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0icHVibGljIj4NCi0gICAgPHhzOmNvbXBsZXhDb250ZW50Pg0KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHVibGljSWQiIHR5cGU9ImVyOnB1YmxpY0lkZW50aWZpZXIiDQotICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPg0KLSAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+DQotICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgPC94czpjb21wbGV4Q29udGVudD4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic3lzdGVtIj4NCi0gICAgPHhzOmNvbXBsZXhDb250ZW50Pg0KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3lzdGVtSWQiIHR5cGU9InhzOnN0cmluZyINCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+DQotICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4NCi0gICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1cmkiPg0KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+DQotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVR5cGUiPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czphbnlVUkkiDQotICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPg0KLSAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+DQotICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgPC94czpjb21wbGV4Q29udGVudD4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0icmV3cml0ZVN5c3RlbSI+DQotICAgIDx4czpjb21wbGV4Q29udGVudD4NCi0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN5c3RlbUlkU3RhcnRTdHJpbmciDQotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4czpzdHJpbmciDQotICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJld3JpdGVQcmVmaXgiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4NCi0gICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPg0KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InJld3JpdGVVUkkiPg0KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+DQotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVR5cGUiPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1cmlTdGFydFN0cmluZyINCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzOnN0cmluZyINCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmV3cml0ZVByZWZpeCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPg0KLSAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+DQotICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgPC94czpjb21wbGV4Q29udGVudD4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic3lzdGVtU3VmZml4Ij4NCi0gICAgPHhzOmNvbXBsZXhDb250ZW50Pg0KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3lzdGVtSWRTdWZmaXgiDQotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4czpzdHJpbmciDQotICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPg0KLSAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+DQotICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgPC94czpjb21wbGV4Q29udGVudD4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idXJpU3VmZml4Ij4NCi0gICAgPHhzOmNvbXBsZXhDb250ZW50Pg0KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXJpU3VmZml4Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHM6c3RyaW5nIg0KLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4NCi0gICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPg0KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRlbGVnYXRlUHVibGljIj4NCi0gICAgPHhzOmNvbXBsZXhDb250ZW50Pg0KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHVibGljSWRTdGFydFN0cmluZyINCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImVyOnBhcnRpYWxQdWJsaWNJZGVudGlmaWVyIg0KLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+DQotICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4NCi0gICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkZWxlZ2F0ZVN5c3RlbSI+DQotICAgIDx4czpjb21wbGV4Q29udGVudD4NCi0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN5c3RlbUlkU3RhcnRTdHJpbmciDQotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4czpzdHJpbmciDQotICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4NCi0gICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPg0KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRlbGVnYXRlVVJJIj4NCi0gICAgPHhzOmNvbXBsZXhDb250ZW50Pg0KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXJpU3RhcnRTdHJpbmciDQotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4czpzdHJpbmciDQotICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4NCi0gICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPg0KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5leHRDYXRhbG9nIj4NCi0gICAgPHhzOmNvbXBsZXhDb250ZW50Pg0KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPg0KLSAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+DQotICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgPC94czpjb21wbGV4Q29udGVudD4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ3JvdXAiPg0KLSAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6cHVibGljIi8+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJlcjpzeXN0ZW0iLz4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOnVyaSIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6cmV3cml0ZVN5c3RlbSIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6cmV3cml0ZVVSSSIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6dXJpU3VmZml4Ii8+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJlcjpzeXN0ZW1TdWZmaXgiLz4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOmRlbGVnYXRlUHVibGljIi8+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJlcjpkZWxlZ2F0ZVN5c3RlbSIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6ZGVsZWdhdGVVUkkiLz4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOm5leHRDYXRhbG9nIi8+DQotICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIvPg0KLSAgICA8L3hzOmNob2ljZT4NCi0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcmVmZXIiIHR5cGU9ImVyOnN5c3RlbU9yUHVibGljIi8+DQotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+DQotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi0gIDx4czplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9ImVyOmNhdGFsb2ciLz4NCi0gIDx4czplbGVtZW50IG5hbWU9InB1YmxpYyIgdHlwZT0iZXI6cHVibGljIi8+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJzeXN0ZW0iIHR5cGU9ImVyOnN5c3RlbSIvPg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idXJpIiB0eXBlPSJlcjp1cmkiLz4NCi0gIDx4czplbGVtZW50IG5hbWU9InJld3JpdGVTeXN0ZW0iIHR5cGU9ImVyOnJld3JpdGVTeXN0ZW0iLz4NCi0gIDx4czplbGVtZW50IG5hbWU9InJld3JpdGVVUkkiIHR5cGU9ImVyOnJld3JpdGVVUkkiLz4NCi0gIDx4czplbGVtZW50IG5hbWU9InN5c3RlbVN1ZmZpeCIgdHlwZT0iZXI6c3lzdGVtU3VmZml4Ii8+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJ1cmlTdWZmaXgiIHR5cGU9ImVyOnVyaVN1ZmZpeCIvPg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGVsZWdhdGVQdWJsaWMiIHR5cGU9ImVyOmRlbGVnYXRlUHVibGljIi8+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJkZWxlZ2F0ZVN5c3RlbSIgdHlwZT0iZXI6ZGVsZWdhdGVTeXN0ZW0iLz4NCi0gIDx4czplbGVtZW50IG5hbWU9ImRlbGVnYXRlVVJJIiB0eXBlPSJlcjpkZWxlZ2F0ZVVSSSIvPg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibmV4dENhdGFsb2ciIHR5cGU9ImVyOm5leHRDYXRhbG9nIi8+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJncm91cCIgdHlwZT0iZXI6Z3JvdXAiLz4NCi0NCi08L3hzOnNjaGVtYT4NCi0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5N2QwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWNvbnRlbnRtb2RlbCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1zZWFyY2giLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtdmFsaWRhdGlvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1jYXRhbG9nIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWVtZk1vZGVsU3luY2giLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy9kb20vVHJlZVdhbGtlckltcGwiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL3Jhbmdlcy9Eb2N1bWVudFJhbmdlIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvdzNjL2RvbS9yYW5nZXMvUmFuZ2UiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL3RyYXZlcnNhbC9Eb2N1bWVudFRyYXZlcnNhbCIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL3czYy9kb20vdHJhdmVyc2FsL05vZGVGaWx0ZXIiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL3RyYXZlcnNhbC9Ob2RlSXRlcmF0b3IiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL3RyYXZlcnNhbC9UcmVlV2Fsa2VyIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvdzNjL2RvbS9yYW5nZXMvUmFuZ2VFeGNlcHRpb24iLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL2ltcGwvWE1MRXJyb3JSZXBvcnRlciIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMvcGFyc2Vycy9TdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24iLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9BdWdtZW50YXRpb25zIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvTmFtZXNwYWNlQ29udGV4dCIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL1FOYW1lIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvWE1MQXR0cmlidXRlcyIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL1hNTExvY2F0b3IiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9YTUxSZXNvdXJjZUlkZW50aWZpZXIiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9YTklFeGNlcHRpb24iLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9wYXJzZXIvWE1MRW50aXR5UmVzb2x2ZXIiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9wYXJzZXIvWE1MSW5wdXRTb3VyY2UiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3BhcnNlcnMvU0FYUGFyc2VyIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy9wYXJzZXJzL0Fic3RyYWN0U0FYUGFyc2VyIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3M2Y4YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi14bWxtb2RlbC5qYXIKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZV8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NmU0ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZS9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvZGVidWcvdHJhY2VmaWx0ZXI9Ci1vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvZGVidWcvY21kb2N1bWVudG1hbmFnZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZS9kZWJ1Zy9jbWRvY3VtZW50Y2FjaGU9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE3NTE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+PC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDA1MzA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSNTYXQgTWFyIDI0IDAyOjE4OjIzIEVEVCAyMDA3DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYTVjNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1dlZCBOb3YgMTUgMDI6MjY6MTAgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Y2E1YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNXZWQgTm92IDE1IDAyOjEzOjMxIEVTVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzM2U2NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0lJQotCi0ldGFibGUKLSVwdWJsaWMKLSVmaW5hbAotJWNsYXNzIFhNTDEwTmFtZXMKLSVmdW5jdGlvbiBpc1ZhbGlkWE1MMTBOYW1lCi0ldHlwZSBib29sZWFuCi0ldW5pY29kZQotJWlnbm9yZWNhc2UKLSVidWZmZXIgMjA0OAotJWFwaXByaXZhdGUKLQotUyA9IChceDIwIHwgXHgwOSB8IFx4MEQgfCBceDBBKQotCi1CYXNlQ2hhciA9IFtcdTAwNDEtXHUwMDVBXHUwMDYxLVx1MDA3QVx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDBGRlx1MDEwMC1cdTAxMzFcdTAxMzQtXHUwMTNFXHUwMTQxLVx1MDE0OFx1MDE0QS1cdTAxN0VcdTAxODAtXHUwMUMzXHUwMUNELVx1MDFGMFx1MDFGNC1cdTAxRjVcdTAxRkEtXHUwMjE3XHUwMjUwLVx1MDJBOFx1MDJCQi1cdTAyQzFcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzQ0VcdTAzRDAtXHUwM0Q2XHUwM0RBXHUwM0RDXHUwM0RFXHUwM0UwXHUwM0UyLVx1MDNGM1x1MDQwMS1cdTA0MENcdTA0MEUtXHUwNDRGXHUwNDUxLVx1MDQ1Q1x1MDQ1RS1cdTA0ODFcdTA0OTAtXHUwNEM0XHUwNEM3LVx1MDRDOFx1MDRDQi1cdTA0Q0NcdTA0RDAtXHUwNEVCXHUwNEVFLVx1MDRGNVx1MDRGOC1cdTA0RjlcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4Nlx1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIxLVx1MDYzQVx1MDY0MS1cdTA2NEFcdTA2NzEtXHUwNkI3XHUwNkJBLVx1MDZCRVx1MDZDMC1cdTA2Q0VcdTA2RDAtXHUwNkQzXHUwNkQ1XHUwNkU1LVx1MDZFNlx1MDkwNS1cdTA5MzlcdTA5M0RcdTA5NTgtXHUwOTYxXHUwOTg1LVx1MDk4Q1x1MDk4Ri1cdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5REMtXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMC1cdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGLVx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyLVx1MEEzM1x1MEEzNS1cdTBBMzZcdTBBMzgtXHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThCXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyLVx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRTBcdTBCMDUtXHUwQjBDXHUwQjBGLVx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyLVx1MEIzM1x1MEIzNi1cdTBCMzlcdTBCM0RcdTBCNUMtXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OS1cdTBCOUFcdTBCOUNcdTBCOUUtXHUwQjlGXHUwQkEzLVx1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI1XHUwQkI3LVx1MEJCOVx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzNcdTBDMzUtXHUwQzM5XHUwQzYwLVx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0RFXHUwQ0UwLVx1MENFMVx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQyOFx1MEQyQS1cdTBEMzlcdTBENjAtXHUwRDYxXHUwRTAxLVx1MEUyRVx1MEUzMFx1MEUzMi1cdTBFMzNcdTBFNDAtXHUwRTQ1XHUwRTgxLVx1MEU4Mlx1MEU4NFx1MEU4Ny1cdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUEtXHUwRUFCXHUwRUFELVx1MEVBRVx1MEVCMFx1MEVCMi1cdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNjlcdTEwQTAtXHUxMEM1XHUxMEQwLVx1MTBGNlx1MTEwMFx1MTEwMi1cdTExMDNcdTExMDUtXHUxMTA3XHUxMTA5XHUxMTBCLVx1MTEwQ1x1MTEwRS1cdTExMTJcdTExM0NcdTExM0VcdTExNDBcdTExNENcdTExNEVcdTExNTBcdTExNTQtXHUxMTU1XHUxMTU5XHUxMTVGLVx1MTE2MVx1MTE2M1x1MTE2NVx1MTE2N1x1MTE2OVx1MTE2RC1cdTExNkVcdTExNzItXHUxMTczXHUxMTc1XHUxMTlFXHUxMUE4XHUxMUFCXHUxMUFFLVx1MTFBRlx1MTFCNy1cdTExQjhcdTExQkFcdTExQkMtXHUxMUMyXHUxMUVCXHUxMUYwXHUxMUY5XHUxRTAwLVx1MUU5Qlx1MUVBMC1cdTFFRjlcdTFGMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIxMjZcdTIxMkEtXHUyMTJCXHUyMTJFXHUyMTgwLVx1MjE4Mlx1MzA0MS1cdTMwOTRcdTMwQTEtXHUzMEZBXHUzMTA1LVx1MzEyQ1x1QUMwMC1cdUQ3QTNdCi0KLUlkZW9ncmFwaGljID0gW1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XQotCi1Db21iaW5pbmdDaGFyID0gW1x1MDMwMC1cdTAzNDVcdTAzNjAtXHUwMzYxXHUwNDgzLVx1MDQ4Nlx1MDU5MS1cdTA1QTFcdTA1QTMtXHUwNUI5XHUwNUJCLVx1MDVCRFx1MDVCRlx1MDVDMS1cdTA1QzJcdTA1QzRcdTA2NEItXHUwNjUyXHUwNjcwXHUwNkQ2LVx1MDZEQ1x1MDZERC1cdTA2REZcdTA2RTAtXHUwNkU0XHUwNkU3LVx1MDZFOFx1MDZFQS1cdTA2RURcdTA5MDEtXHUwOTAzXHUwOTNDXHUwOTNFLVx1MDk0Q1x1MDk0RFx1MDk1MS1cdTA5NTRcdTA5NjItXHUwOTYzXHUwOTgxLVx1MDk4M1x1MDlCQ1x1MDlCRVx1MDlCRlx1MDlDMC1cdTA5QzRcdTA5QzctXHUwOUM4XHUwOUNCLVx1MDlDRFx1MDlEN1x1MDlFMi1cdTA5RTNcdTBBMDJcdTBBM0NcdTBBM0VcdTBBM0ZcdTBBNDAtXHUwQTQyXHUwQTQ3LVx1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNzAtXHUwQTcxXHUwQTgxLVx1MEE4M1x1MEFCQ1x1MEFCRS1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEIwMS1cdTBCMDNcdTBCM0NcdTBCM0UtXHUwQjQzXHUwQjQ3LVx1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTYtXHUwQjU3XHUwQjgyLVx1MEI4M1x1MEJCRS1cdTBCQzJcdTBCQzYtXHUwQkM4XHUwQkNBLVx1MEJDRFx1MEJEN1x1MEMwMS1cdTBDMDNcdTBDM0UtXHUwQzQ0XHUwQzQ2LVx1MEM0OFx1MEM0QS1cdTBDNERcdTBDNTUtXHUwQzU2XHUwQzgyLVx1MEM4M1x1MENCRS1cdTBDQzRcdTBDQzYtXHUwQ0M4XHUwQ0NBLVx1MENDRFx1MENENS1cdTBDRDZcdTBEMDItXHUwRDAzXHUwRDNFLVx1MEQ0M1x1MEQ0Ni1cdTBENDhcdTBENEEtXHUwRDREXHUwRDU3XHUwRTMxXHUwRTM0LVx1MEUzQVx1MEU0Ny1cdTBFNEVcdTBFQjFcdTBFQjQtXHUwRUI5XHUwRUJCLVx1MEVCQ1x1MEVDOC1cdTBFQ0RcdTBGMTgtXHUwRjE5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFXHUwRjNGXHUwRjcxLVx1MEY4NFx1MEY4Ni1cdTBGOEJcdTBGOTAtXHUwRjk1XHUwRjk3XHUwRjk5LVx1MEZBRFx1MEZCMS1cdTBGQjdcdTBGQjlcdTIwRDAtXHUyMERDXHUyMEUxXHUzMDJBLVx1MzAyRlx1MzA5OVx1MzA5QV0KLQotRGlnaXQgPSAgW1x1MDAzMC1cdTAwMzlcdTA2NjAtXHUwNjY5XHUwNkYwLVx1MDZGOVx1MDk2Ni1cdTA5NkZcdTA5RTYtXHUwOUVGXHUwQTY2LVx1MEE2Rlx1MEFFNi1cdTBBRUZcdTBCNjYtXHUwQjZGXHUwQkU3LVx1MEJFRlx1MEM2Ni1cdTBDNkZcdTBDRTYtXHUwQ0VGXHUwRDY2LVx1MEQ2Rlx1MEU1MC1cdTBFNTlcdTBFRDAtXHUwRUQ5XHUwRjIwLVx1MEYyOV0KLQotRXh0ZW5kZXIgPSBbXHUwMEI3XHUwMkQwXHUwMkQxXHUwMzg3XHUwNjQwXHUwRTQ2XHUwRUM2XHUzMDA1XHUzMDMxLVx1MzAzNVx1MzA5RC1cdTMwOUVcdTMwRkMtXHUzMEZFXQotCi1MZXR0ZXIgPSAoe0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30pCi0KLU5hbWVDaGFyID0gKHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IC4gfCAtIHwgXyB8IDogfCB7Q29tYmluaW5nQ2hhcn0gfCB7RXh0ZW5kZXJ9KQotCi1OYW1lID0gKHtMZXR0ZXJ9IHwgXyB8IDogKSAoe05hbWVDaGFyfSkqCi0KLQotCi0lewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0JICovCi0JcHVibGljIFhNTDEwTmFtZXMoKSB7Ci0JCXRoaXMuenpSZWFkZXIgPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRYTUwxME5hbWUoU3RyaW5nIHN0cmluZ1RvQ2hlY2spIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJeXlyZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoc3RyaW5nVG9DaGVjaykpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gaXNWYWxpZFhNTDEwTmFtZSgpOwotCQl9Ci0JCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBiZSBpbXBvc3NpYmxlIHdpdGggc3RyaW5ncywgYnV0IGlmIG9jY3VycywganVzdCBtZWFucwotCQkJLy8gIm5vdCIKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0lfQotCi0KLQotCi0lJQotCi08WVlJTklUSUFMPgotewotCi0JLy8gZG9uJ3QgbWF0Y2ggaWYgY29udGFpbnMgdHJhaWxpbmcgb3IgZW1iZWRkZWQgc3BhY2UKLQl7TmFtZX0ge1N9KyAgICAgICAgIHtyZXR1cm4gZmFsc2U7fQotCXtOYW1lfSB7U30rIHtOYW1lfSAge3JldHVybiBmYWxzZTt9Ci0KLQl7TmFtZX0gICAgICAgICAgICAgIHtyZXR1cm4gdHJ1ZTt9Ci0KLQkvLyBtYXRjaCBhbnl0aGluZyBzaG91bGQgY29tZSBsYXN0Ci0JLiAgICAgICAgICAgICAgICAgICB7cmV0dXJuIGZhbHNlO30KLQotfQotCi0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+Ci17Ci0Je3JldHVybiBmYWxzZTt9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDViMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLypubHNYWFgqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsNCi0NCi0NCi0lJQ0KLQ0KLSV7DQotDQotDQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsNCi0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZw0KLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7DQotDQotDQotCXB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsNCi0gICAgICAgICAgICAgICAgLyogdGhlIGlucHV0IGRldmljZSAqLw0KLSAgICAgICAgICAgICAgICB6elJlYWRlciA9IGluOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotICAgICAgICAgICAgICAgIHp6U3RhdGUgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotICAgICAgICAgICAgICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotICAgICAgICAgICAgICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsNCi0NCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8NCi0gICAgICAgICAgICAgICAgenpNYXJrZWRQb3MgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLw0KLSAgICAgICAgICAgICAgICB6elB1c2hiYWNrUG9zID0gMDsNCi0NCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotICAgICAgICAgICAgICAgIHp6Q3VycmVudFBvcyA9IDA7DQotDQotICAgICAgICAgICAgICAgIC8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLw0KLSAgICAgICAgICAgICAgICB6elN0YXJ0UmVhZCA9IDA7DQotDQotICAgICAgICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgICAgICAgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0gICAgICAgICAgICAgICAgICogZnJvbSBpbnB1dA0KLSAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgenpFbmRSZWFkID0gMDsNCi0NCi0gICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotICAgICAgICAgICAgICAgIHl5bGluZSA9IDA7DQotDQotICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgICAgICAgICAgICAgICB5eWNoYXIgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKioNCi0gICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQNCi0gICAgICAgICAgICAgICAgICogb2YgdGhlIG1hdGNoZWQgdGV4dA0KLSAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgeXljb2x1bW4gPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKioNCi0gICAgICAgICAgICAgICAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcNCi0gICAgICAgICAgICAgICAgICogb2YgYSBsaW5lDQotICAgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgICAgICAgLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLSAgICAgICAgICAgICAgICB6ekF0RU9GID0gZmFsc2U7DQotDQotICAgICAgICAgICAgICAgIC8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLw0KLSAgICAgICAgICAgICAgICB6ekVPRkRvbmUgPSBmYWxzZTsNCi0NCi0NCi0gICAgICAgICAgICAgICAgZlN0YXRlU3RhY2suY2xlYXIoKTsNCi0NCi0gICAgICAgICAgICAgICAgaGFzTW9yZSA9IHRydWU7DQotICAJCQ0KLSAgCX0NCi0NCi0NCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOw0KLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOw0KLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7DQotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOw0KLQkJCXZhbHVlVGV4dCA9IG51bGw7DQotCQl9IGVsc2Ugew0KLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOw0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgew0KLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47DQotCX0NCi0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7DQotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotDQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgew0KLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCX0NCi0JDQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7DQotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7DQotCX0JDQotDQotJX0NCi0NCi0lZW9mew0KLQloYXNNb3JlPWZhbHNlOw0KLSVlb2Z9DQotDQotJXB1YmxpYw0KLSVjbGFzcyBYTUxIZWFkVG9rZW5pemVyDQotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4NCi0ldHlwZSBTdHJpbmcNCi0lY2hhcg0KLSV1bmljb2RlDQotJWlnbm9yZWNhc2UgDQotLy8lZGVidWcNCi0lc3dpdGNoDQotJWJ1ZmZlciA4MTkyDQotDQotVVRGMTZCRSA9IFx4RkVceEZGDQotVVRGMTZMRSA9IFx4RkZceEZFDQotVVRGODNCeXRlQk9NID0gXHhFRlx4QkJceEJGDQotDQotLy9TcGFjZUNoYXIgPSBbXHgyMFx4MDldDQotDQotLy8gWzNdIFMgOjo9ICgweDIwIHwgMHg5IHwgMHhEIHwgMHhBKSsNCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdDQotDQotLy9CZWdpbkF0dHJpYmVWYWx1ZSA9IHtTfSogXD0ge1N9Kg0KLQ0KLUxpbmVUZXJtaW5hdG9yID0gXHJ8XG4NCi0NCi0vLyBaIGlzIHRoZSBzaW5nbGUtYnl0ZSB6ZXJvIGNoYXJhY3RlciB0byBiZSB1c2VkIGluIHBhcnNpbmcgZG91YmxlLWJ5dGUgZmlsZXMNCi1aID0gKFx4MDApPw0KLVNfVVRGID0ge1p9e1N9e1p9DQotQmVnaW5BdHRyaWJ1dGVWYWx1ZVVURiA9IHtTX1VURn0qIFw9IHtTX1VURn0qDQotDQotJXN0YXRlIFNUX1hNTERlY2wNCi0lc3RhdGUgUXVvdGVkQXR0cmlidXRlVmFsdWUNCi0lc3RhdGUgRFFfU1RSSU5HDQotJXN0YXRlIFNRX1NUUklORw0KLSVzdGF0ZSBVbkRlbGltaXRlZFN0cmluZw0KLQ0KLSUlDQotDQotDQotPFlZSU5JVElBTD4gIA0KLXsNCi0JLy8gZm9yY2UgdG8gc3RhcnQgYXQgYmVnaW5uaW5nIG9mIGxpbmUgKF4pIGFuZCBhdCBiZWdpbm5pbmcgb2YgZmlsZSAoeXljaGFyID09IDApDQotCV57VVRGMTZCRX0gICAJCXtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9fQ0KLQlee1VURjE2TEV9ICAgCQl7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fX0NCi0JXntVVEY4M0J5dGVCT019ICAgCXtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO319DQotCQ0KLQkvLyBmb3JjZSB0byBiZSBzdGFydGVkIG9uIGZpcnN0IGxpbmUsIGJ1dCB3ZSBkbyBhbGxvdyBwcmVjZWVkaW5nIHNwYWNlcw0KLQleIHtTX1VURn0qICh7Wn08e1p9XD97Wn14e1p9bXtafWx7Wn0pe1NfVVRGfSsge2lmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fX0NCi0JDQotfQkNCi0JDQotPFNUX1hNTERlY2w+IA0KLXsNCi0JKHtafXZ7Wn1le1p9cntafXN7Wn1pe1p9b3tafW57Wn0pIHtCZWdpbkF0dHJpYnV0ZVZhbHVlVVRGfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFZlcnNpb247fQ0KLQkoe1p9ZXtafW57Wn1je1p9b3tafWR7Wn1pe1p9bntafWd7Wn0pIHtCZWdpbkF0dHJpYnV0ZVZhbHVlVVRGfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7fQ0KLQkvLyBub3RlIHRoZSAiZm9yY2VkIGVuZCIgKHZpYSAnaGFzTW9yZT1mYWxzZScpIG9uY2UgdGhlIGVuZCBvZiBYTUwgRGVjbGFyYXRpb24gZm91bmQNCi0JLy8gVGhpcyBpcyBzaW5jZSBub24tYXNjaWkgY2hhcnMgbWF5IGZvbGxvdyBhbmQgbWF5IGNhdXNlIElPRXhjZXB0aW9ucyB3aGljaCB3b3VsZCBub3Qgb2NjdXIgb25jZSBzdHJlYW0gaXMgDQotCS8vIHJlYWQgd2l0aCBpbmNvcnJlY3QgZW5jb2RpbmcgKHN1Y2ggYXMgaWYgcGxhdGZvcm0gZW5jb2RpbmcgaXMgaW4gZWZmZWN0IHVudGlsIHRydWUgZW5jb2RpbmcgZGV0ZWN0ZWQpLiANCi0JKHtafVw/e1p9PntafSkgICAge3l5YmVnaW4oWVlJTklUSUFMKTsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kO30NCi19CQ0KLQ0KLQkNCi0NCi08UXVvdGVkQXR0cmlidXRlVmFsdWU+DQotew0KLQl7Wn1cIntafSAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0NCi0Je1p9XCd7Wn0JCQl7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQ0KLQkvLyBpbiB0aGlzIHN0YXRlLCBhbnl0aGluZyBvdGhlciB0aGFuIGEgc3BhY2UgY2hhcmFjdGVyIGNhbiBzdGFydCBhbiB1bmRlbGltaXRlZCBzdHJpbmcNCi0Je1NfVVRGfSouICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApO30NCi0NCi19CQ0KLQ0KLQ0KLTxEUV9TVFJJTkc+DQotew0KLQ0KLQl7Wn1cIntafSAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0NCi0gIAl7Wn17TGluZVRlcm1pbmF0b3J9e1p9ICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XD97Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn08e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCVteXHgwMF0JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0NCi0NCi19DQotDQotPFNRX1NUUklORz4NCi17DQotDQotCXtafVwne1p9ICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTt9DQotICAJe1p9e0xpbmVUZXJtaW5hdG9yfXtafSAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafSV7Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafTx7Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0JW15ceDAwXQkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQ0KLQ0KLX0NCi0NCi08VW5EZWxpbWl0ZWRTdHJpbmc+DQotew0KLQ0KLQl7U19VVEZ9ICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQ0KLSAgCXtafXtMaW5lVGVybWluYXRvcn17Wn0gICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn1cP3tafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9PHtafQkNCi0JeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCS8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQ0KLQl7Wn1cJ3tafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQ0KLQkNCi0Je1p9XCJ7Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30NCi0JDQotCVteXHgwMF0JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0NCi0NCi19DQotDQotLy8gVGhlICJtYXRjaCBhbnl0aGluZyIgcnVsZSBzaG91bGQgYWx3YXlzIGJlIGluIGVmZmVjdCBleGNlcHQgZm9yIHdoZW4gbG9va2luZyBmb3IgZW5kIG9mIHN0cmluZw0KLS8vIChUaGF0IGlzLCByZW1lbWJlciB0byB1cGRhdGUgc3RhdGUgbGlzdCBpZi93aGVuIG5ldyBzdGF0ZXMgYWRkZWQpDQotLnxcbgl7aWYoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fX0NCi0NCi0vLyB0aGlzIHJ1bGUgYWx3YXlzIGluIGVmZmVjdA0KLTw8RU9GPj4gICAgICAgICB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GO30NCi0NCi0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGROYW1lcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZE5hbWVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5NzU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZE5hbWVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0b2tlbml6ZXIiIGRlZmF1bHQ9IlhNTDEwTmFtZXMiPgotCQotCTwhLS0gTm90ZTogZm9yIEVjbGlwc2UgZW52LiwgdGhlIEpGbGV4IDEuNCBqYXIgc2hvdWxkIGJlIGFkZGVkIAotCXRvIHRoZSBhbnQgZ2xvYmFsIGVudHJpZXMgIC0tPgotCTx0YXNrZGVmIGNsYXNzbmFtZT0iSkZsZXguYW50dGFzay5KRmxleFRhc2siIG5hbWU9ImpmbGV4IiAvPgotCQkKLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJYTUwxME5hbWVzLmpGbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iSGVhZFBhcnNlcnMiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0iLi4vc3JjIi8+Ci0JCTwhLS0gdG91Y2ggY2F1c2VzIHRvIGFsd2F5cyBidWlsZCwgcmVtb3ZlIGZvciByZWFsICdtYWtlJyBiZWhhdmlvciAtLT4KLQkJPHRvdWNoIGZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iLz4KLQkJCQkJCi0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IlhNTDEwTmFtZXMiIGRlcGVuZHM9ImluaXQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJ1bi1qZmxleCIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJydW4tamZsZXgiIGRlcGVuZHM9ImluaXQiPgotCQk8amZsZXgKLQkgICAgCWZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iCi0JICAgIAlkZXN0ZGlyPSIke2Rlc3QuZGlyfSIKLQkJCXZlcmJvc2U9InRydWUiCi0JCQlub2Jhaz0idHJ1ZSIKLQkJCXRpbWU9Im9uIgotCSAgICAvPgotCTwvdGFyZ2V0PgotCQotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGRQYXJzZXIueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGRQYXJzZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTYxOWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkUGFyc2VyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0b2tlbml6ZXIiIGRlZmF1bHQ9IkhlYWRUb2tlbml6ZXIiPgotCQotCTwhLS0gTm90ZTogZm9yIEVjbGlwc2UgZW52LiwgdGhlIEpGbGV4IDEuNCBqYXIgc2hvdWxkIGJlIGFkZGVkIAotCXRvIHRoZSBhbnQgZ2xvYmFsIGVudHJpZXMgIC0tPgotCTx0YXNrZGVmIGNsYXNzbmFtZT0iSkZsZXguYW50dGFzay5KRmxleFRhc2siIG5hbWU9ImpmbGV4IiAvPgotCQkKLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJYTUxIZWFkVG9rZW5pemVyLmpGbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iSGVhZFBhcnNlcnMiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0iLi4vc3JjIi8+Ci0JCTwhLS0gdG91Y2ggY2F1c2VzIHRvIGFsd2F5cyBidWlsZCwgcmVtb3ZlIGZvciByZWFsICdtYWtlJyBiZWhhdmlvciAtLT4KLQkJPHRvdWNoIGZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iLz4KLQkJCQkJCi0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IkhlYWRUb2tlbml6ZXIiIGRlcGVuZHM9ImluaXQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJ1bi1qZmxleCIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJydW4tamZsZXgiIGRlcGVuZHM9ImluaXQiPgotCQk8amZsZXgKLQkgICAgCWZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iCi0JICAgIAlkZXN0ZGlyPSIke2Rlc3QuZGlyfSIKLQkJCXZlcmJvc2U9InRydWUiCi0JCQlub2Jhaz0idHJ1ZSIKLQkJCXRpbWU9Im9uIgotCSAgICAvPgotCTwvdGFyZ2V0PgotCQotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1Njc3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS42MDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5tb2RlbHF1ZXJ5aW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW1mMnhtbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZvcm1hdHRlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guaW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gucXVpY2tzY2FuO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS51dGlsOyB2ZXJzaW9uPSIzLjgiLAotIGNvbS5pYm0uaWN1LnRleHQ7IHZlcnNpb249IjMuOCIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLnhlcmNlcztidW5kbGUtdmVyc2lvbj0iWzIuOS4wLDMuMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMjAwLDMuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMTAwLDEuMy4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMy4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMy4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMSwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eTsgZXhjbHVkZTo9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvUkVBRE1FLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTY0NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRIZSBYTUwgc3BlY2lmaWMgbW9kZWwgaW1wbGVtZW50YXRpb24uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNDliMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBEZXZUaW1lU3VwcG9ydC8KLXNvdXJjZS4uID0gc3JjLWNhdGFsb2cvLFwKLSAgICAgICAgICAgc3JjLWNvbnRlbnRtb2RlbC8sXAotICAgICAgICAgICBzcmMtdmFsaWRhdGlvbi8sXAotICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgc3JjLWVtZk1vZGVsU3luY2gvLFwKLSAgICAgICAgICAgc3JjLXNlYXJjaC8KLQotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2MWViMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhtbCI+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy94bWwvb3ZlcnZpZXcuaHRtbCIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MuY29udGVudG91dGxpbmUiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5wcm9wZXJ0aWVzIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUuc291cmNlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnNvdXJjZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5hcGFjaGUueGVyY2VzIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci08L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZTc0M2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIFhNTCBNb2RlbAotU3RydWN0dXJlZF9YTUxfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1TdHJ1Y3R1cmVkIFhNTCBEb2N1bWVudCBGYWN0b3J5IEV4dGVuc2lvbgotWE1MX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPVhNTCAoSWxsZm9ybWVkKQotIyBjb250ZW50bW9kZWwgc3RyaW5ncwotQ29udGVudF9Nb2RlbF9Eb2N1bWVudF9GYWN0b3JpZXNfRXh0ZW5zaW9uLm5hbWU9Q29udGVudCBNb2RlbCBEb2N1bWVudCBGYWN0b3JpZXMKLUNvbnRlbnRfTW9kZWxfQW5ub3RhdGlvbl9GaWxlc19FeHRlbnNpb24ubmFtZT1Db250ZW50IE1vZGVsIEFubm90YXRpb24gRmlsZXMKLU1vZGVsX1F1ZXJ5X0V4dGVuc2lvbi5uYW1lPU1vZGVsIFF1ZXJ5IEV4dGVuc2lvbgotWE1MX0NhdGFsb2dfQ29udHJpYnV0aW9uc19FeHRlbnNpb25fUG9pbnQubmFtZT1YTUwgQ2F0YWxvZyBDb250cmlidXRpb25zIEV4dGVuc2lvbiBQb2ludAotWFNMX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPVhTTAotWE1JX0NvbnRlbnRfVHlwZT1YTUkKLVhNTF9WYWxpZGF0b3IubmFtZT1YTUwgVmFsaWRhdG9yCi1YTUxfVmFsaWRhdGlvbl9FcnJvcl9DdXN0b21pemVyLm5hbWU9WE1MIFZhbGlkYXRvciBFcnJvciBDdXN0b21pemVyIEV4dGVuc2lvbiBQb2ludAotX3ZhbGlkYXRpb25NYXJrZXIubmFtZT1YTUwgUHJvYmxlbQotX3Rhc2tNYXJrZXIubmFtZT1YTUwgVGFzawpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZjZhMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPCEtLSBBbiBleHRlbnNpb24gZm9yIGNvbnRyaWJ1dGluZyBhIFhNTCB2YWxpZGF0aW9uIGVycm9yIGN1c3RvbWl6ZXIuIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXJyb3JDdXN0b21pemVyIiBuYW1lPSIlWE1MX1ZhbGlkYXRpb25fRXJyb3JfQ3VzdG9taXplci5uYW1lIiBzY2hlbWE9InNjaGVtYS9lcnJvckN1c3RvbWl6ZXIuZXhzZCIvPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0JCTxtb2RlbEhhbmRsZXIKLQkJCWRlZmF1bHQ9InRydWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JYTUwiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0JCTxtb2RlbEhhbmRsZXIKLQkJCWRlZmF1bHQ9InRydWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JYTUwiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyMiI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5lbWJlZGRlZFR5cGVIYW5kbGVyIj4KLQkJPGVtYmVkZGVkVHlwZUhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkWE1MIj4KLQkJPC9lbWJlZGRlZFR5cGVIYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRhc2tzY2FubmVyIj4KLQkJPHNjYW5uZXIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGFza3MuWE1MRmlsZVRhc2tTY2FubmVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrcy5YTUxGaWxlVGFza1NjYW5uZXI6b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRhc2tNYXJrZXIiCi0JCQljb250ZW50VHlwZUlkcz0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCWlkPSJ0YXNrTWFya2VyIgotCQluYW1lPSIlX3Rhc2tNYXJrZXIubmFtZSIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotCQk8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGFza21hcmtlciIvPgotCQk8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotCTwvZXh0ZW5zaW9uPgotCSAKLSAgIDwhLS0gSGVyZSB3ZSBkZWZpbmUgYSBuZXcgZXh0ZW5zaW9uIHBvaW50LiAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZAotICAgICAgICB0byBwcm9ncmFtbWF0aWNhbGx5IGNvbnRyaWJ1dGUgY2F0YWxvZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZy4gLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjYXRhbG9nQ29udHJpYnV0aW9ucyIgbmFtZT0iJVhNTF9DYXRhbG9nX0NvbnRyaWJ1dGlvbnNfRXh0ZW5zaW9uX1BvaW50Lm5hbWUiIHNjaGVtYT0ic2NoZW1hL2NhdGFsb2dDb250cmlidXRpb25zLmV4c2QiLz4KLQotICAgPCEtLSBUaGlzIGV4dGVuc2lvbiBwb2ludCBleHRlbmRzIHRoZSBDb21tb24gRXh0ZW5zYmlsZSBVUkkgUmVzb2x2ZXIgc28gdGhhdAotICAgICAgICB0aGUgWE1MIENhdGFsb2cgY2FuIHBhcnRpY2lwYXJlIGluIHJlc29sdmluZyBwcm9jZXNzZXMuIC0tPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5yZXNvbHZlckV4dGVuc2lvbnMiPgotICAgICAgPHJlc29sdmVyRXh0ZW5zaW9uCi0gICAgICAgICAgICBzdGFnZT0icG9zdG5vcm1hbGl6YXRpb24iCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuWE1MQ2F0YWxvZ1VSSVJlc29sdmVyRXh0ZW5zaW9uIj4KLSAgICAgIDwvcmVzb2x2ZXJFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfWE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudGZhY3RvcmllczIiCi0JCW5hbWU9IiVTdHJ1Y3R1cmVkX1hNTF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzLkJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ieHNsIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InhzbHQiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0iZGFkeCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ3c2RsIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Im5zdCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ4bWkiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ieHNkIj4KLQkJPC9maWxlVHlwZXM+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdFByb2Nlc3NvcnMiPgotCQk8cHJvY2Vzc29yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZvcm1hdHRlci5YTUxGb3JtYXR0ZXJGb3JtYXRQcm9jZXNzb3IiCi0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJPC9wcm9jZXNzb3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzMDgzIC0tPlwKLQk8IS0tICBGWUk6IHRoaXMgeG1pIHR5cGUgKnNob3VsZCogYmUgZGVmaW5lZCBpbiBFTUYsIGJ1dCwgc2luY2UgaXNuJ3QKLQkJCXdlIHdpbGwgaGVyZS4gSW4gZnV0dXJlIHZlcnNpb25zIGlzIGNvdWxkIGJlIHJlbW92ZWQgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZS5jb250ZW50VHlwZXMiPgotCQk8Y29udGVudC10eXBlCi0JCQlmaWxlLWV4dGVuc2lvbnM9InhtaSIKLQkJCXByaW9yaXR5PSJsb3ciCi0JCQluYW1lPSIlWE1JX0NvbnRlbnRfVHlwZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1pc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJPC9jb250ZW50LXR5cGU+Ci0KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ4bWwseHNsLHhzbHQsd3NkbCx4c2QsZXhzZCx4bWkiCi0JCQlwcmlvcml0eT0ibG93IgotCQkJbmFtZT0iJVhNTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUudGV4dCIKLQkJCWRlZmF1bHQtY2hhcnNldD0iVVRGLTgiPgotCQkJPGRlc2NyaWJlciBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkNvbnRlbnREZXNjcmliZXJGb3JYTUwiIC8+Ci0JCTwvY29udGVudC10eXBlPgotCi0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0ieHNsLHhzbHQiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVYU0xfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWRlZmF1bHQtY2hhcnNldD0iVVRGLTgiPgotCQk8L2NvbnRlbnQtdHlwZT4KLQk8L2V4dGVuc2lvbj4KLQotCi0JPCEtLSBpbml0aWFsaXplIHhtbCBjb3JlIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplciBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkb2N1bWVudEZhY3RvcmllcyIgbmFtZT0iJUNvbnRlbnRfTW9kZWxfRG9jdW1lbnRfRmFjdG9yaWVzX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9kb2N1bWVudEZhY3Rvcmllcy5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtb2RlbFF1ZXJ5RXh0ZW5zaW9ucyIgbmFtZT0iJU1vZGVsX1F1ZXJ5X0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9tb2RlbFF1ZXJ5RXh0ZW5zaW9ucy5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJhbm5vdGF0aW9uRmlsZXMiIG5hbWU9IiVDb250ZW50X01vZGVsX0Fubm90YXRpb25fRmlsZXNfRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2Fubm90YXRpb25GaWxlcy5leHNkIi8+CQotCQkKLQk8ZXh0ZW5zaW9uIAotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBjb250ZXh0PSJVSSIKLSAgICAgICAgICAgIGtleT0icmVuZGVyZXJGYWN0b3J5IgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW1mMnhtbC5FTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5Ij4KLSAgICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICA8L2V4dGVuc2lvbj4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBSZWdpc3RlciB0aGUgWE1MIHZhbGlkYXRvciB3aXRoIHRoZSB2YWxpZGF0aW9uIAkJLS0+Ci0JPCEtLSBmcmFtZXdvcmsuIAkJCQkJCQkJCQkgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0idmFsaWRhdGlvbk1hcmtlciIKLSAgICAgICAgIG5hbWU9IiVfdmFsaWRhdGlvbk1hcmtlci5uYW1lIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByb2JsZW1tYXJrZXIiLz4KLSAgICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0gPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gaWQ9InhtbCIgbmFtZT0iJVhNTF9WYWxpZGF0b3IubmFtZSIgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIGJ1aWxkPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yIgotICAgICAgICAgICAgbWFudWFsPSJ0cnVlIgotICAgICAgICAgICAgc291cmNlaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWE1MIgotICAgICAgICAgICAgdmVyc2lvbj0iMyIKLSAgICAgICAgICAgIG1hcmtlcklkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudmFsaWRhdGlvbk1hcmtlciI+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgIDxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI+PC9jb250ZW50VHlwZT4KLSAgICAgICAgICAgICAgIDxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSI+PC9jb250ZW50VHlwZT4KLSAgICAgICAgICAgICAgIDxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSI+PC9jb250ZW50VHlwZT4KLSAgICAgICAgICAgICAgIDxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRsZHNvdXJjZSI+PC9jb250ZW50VHlwZT4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ieG1sIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgICA8ZXhjbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLQkJCQk8cHJvamVjdE5hdHVyZSBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk5hdHVyZSIvPgotCQkJCTxwcm9qZWN0TmF0dXJlIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUiLz4KLSAgICAJCQk8ZmlsZSBjYXNlU2Vuc2l0aXZlPSJ0cnVlIiBuYW1lPSIucHJvamVjdCIgdHlwZT0iZmlsZSIvPgotICAgIAkJCTxmaWxlIGNhc2VTZW5zaXRpdmU9InRydWUiIG5hbWU9Ii5jbGFzc3BhdGgiIHR5cGU9ImZpbGUiLz4KLSAgICAJCQk8ZmlsZSBjYXNlU2Vuc2l0aXZlPSJ0cnVlIiBuYW1lPSIuc2V0dGluZ3MiICB0eXBlPSJmb2xkZXIiLz4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2V4Y2x1ZGU+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvYW5ub3RhdGlvbkZpbGVzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvYW5ub3RhdGlvbkZpbGVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MTdmNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2Fubm90YXRpb25GaWxlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIiBpZD0iYW5ub3RhdGlvbkZpbGVzIiBuYW1lPSJDb250ZW50IE1vZGVsIEFubm90YXRpb24gRmlsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFubm90YXRpb25GaWxlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb25GaWxlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHVibGljSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9jYXRhbG9nQ29udHJpYnV0aW9ucy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2NhdGFsb2dDb250cmlidXRpb25zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YmFkMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2NhdGFsb2dDb250cmlidXRpb25zLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiIGlkPSJjYXRhbG9nQ29udHJpYnV0aW9ucyIgbmFtZT0iWE1MIENhdGFsb2cgQ29udHJpYnV0aW9ucyBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIHRvIHNwZWNpZnkgZW50cmllcyBmb3IgWE1MIENhdGFsb2cuICBDYXRhbG9nIGVudHJpZXMgaGF2ZSBmb3JtYXQgc3BlY2lmaWVkIGluICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2Rvd25sb2FkLnBocC8xNDA0MS94bWwtY2F0YWxvZ3MuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMuaHRtbCZsdDsvYSZndDsuICAKLUVhY2ggY2F0YWxvZyBleHRlbnNpb24gY29uc2lzdHMgb2YgYSBzaW5nbGUgY2F0YWxvZ0NvbnRyaWJ1dGlvbiBlbGVtZW50LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2F0YWxvZ0NvbnRyaWJ1dGlvbiIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNhdGFsb2dDb250cmlidXRpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBjYXRhbG9nQ29udHJpYnV0aW9uIGVsZW1lbnQgbWF5IGhhdmUgaWQsIGFuZCBpdCBpcyBqdXN0IGEgY29udGFpbmVyIGZvciB0aGUgY29udHJpYnV0ZWQgY2F0YWxvZyBlbnRyaWVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwdWJsaWMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3lzdGVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InVyaSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJuZXh0Q2F0YWxvZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWQgb2YgdGhlIGNhdGFsb2cgdG8gd2hpY2ggZW50cmllcyB3aWxsIGJlIGFkZGVkLiBDb3VsZCBiZSAmcXVvdDtkZWZhdWx0JnF1b3Q7LCBhbmQgaWYgb21taXRlZCwgZW50cmllcyBhcmUgYWRkZWQgdG8gdGhlIGRlZmF1bHQgd29ya3NwYWNlIGNhdGFsb2cuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InB1YmxpYyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIHB1YmxpYyBlbGVtZW50IGFzc29jaWF0ZXMgYSBVUkkgcmVmZXJlbmNlIHdpdGggdGhlIHB1YmxpYyBpZGVudGl0aWVyIHBvcnRpb24gb2YgYW4gZXh0ZXJuYWwgaWRlbnRpZmllci4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElkIG9mIHRoZSBlbGVtZW50LCBvcHRpb25hbC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwdWJsaWNJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcHVibGljIGlkZW50aWZpZXIgcG9ydGlvbiBvZiBhbiBleHRlcm5hbCBpZGVudGlmaWVyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHVyaSBhdHRyaWJ1dGUgY291bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbi54bWwgZmlsZSwgdXNlIHBsYXRmb3JtOi8gb3IgZmlsZTovIHByb3RvY29scy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id2ViVVJMIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFsdGVybmF0aXZlIFdlYiBhZGRyZXNzIGZvciB0aGUgcHVibGljIElECi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InN5c3RlbSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIHN5c3RlbSBlbGVtZW50cyBhc3NvY2lhdGVzIGEgVVJJIHJlZmVyZW5jZSB3aXRoIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiBhbiBleHRlcm5hbCBpZGVudGlmaWVyCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZCBvZiB0aGUgZWxlbWVudCwgb3B0aW9uYWwuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3lzdGVtSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHN5c3RlbSBpZGVudGlmaWVyIHBvcnRpb24gb2YgYW4gZXh0ZXJuYWwgaWRlbnRpZmllci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSB1cmkgYXR0cmlidXRlIGNvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4ueG1sIGZpbGUsIHVzZSBwbGF0Zm9ybTovIG9yIGZpbGU6LyBwcm90b2NvbHMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ1cmkiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSB1cmkgZWxlbWVudCBhc3NvY2lhdGVzIGEgVVJJIHJlZmVyZW5jZSB3aXRoIHRoZSBhIFVSSSByZWZlcmVuY2UgdGhhdCBpcyBub3QgcGFydCBvZiBhbiBleHRlcm5hbCBpZGVudGlmaWVyLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWQgb2YgdGhlIGVsZW1lbnQsIG9wdGlvbmFsLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHVyaSBhdHRyaWJ1dGUgY291bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbi54bWwgZmlsZSwgdXNlIHBsYXRmb3JtOi8gb3IgZmlsZTovIHByb3RvY29scy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIFVSSSByZWZlcmVuY2UgdGhhdCBpcyBub3QgcGFydCBvZiBhbiBleHRlcm5hbCBpZGVudGl0aWVyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJuZXh0Q2F0YWxvZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIG5leHRDYXRhbG9nIGVsZW1lbnRzIGluZGljYXRlIGFkZGl0aW9uYWwgY2F0YWxvZyBlbnRyeSBmaWxlKHMpIHRvIGJlIGNvbnNpZGVyZWQgZHVyaW5nIHRoZSBwcm9jZXNzIG9mIHJlc29sdXRpb24uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElkIG9mIHRoZSBlbGVtZW50LCBvcHRpb25hbC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgdXJpIGF0dHJpYnV0ZSBjb3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcGx1Z2luLnhtbCBmaWxlLCB1c2UgcGxhdGZvcm06LyBvciBmaWxlOi8gcHJvdG9jb2xzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIAotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNhdGFsb2dDb250cmlidXRpb25zJnF1b3Q7Jmd0OwotICAgICAgJmx0O2NhdGFsb2dDb250cmlidXRpb24mZ3Q7IAotICAgICAgICAgJmx0O3N5c3RlbSAKLSAgICAgICAgICAgICAgIHN5c3RlbUlkPSZxdW90O2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvJnF1b3Q7Ci0gICAgICAgICAgICAgICB1cmk9JnF1b3Q7ZGF0YS94c2Qvd3NkbC54bWwmcXVvdDsgJmd0OyAKLSAgICAgICAgICAgICZsdDtwcm9wZXJ0eSAKLSAgICAgICAgICAgICAgICAgIG5hbWU9JnF1b3Q7d2ViVVJMJnF1b3Q7Ci0gICAgICAgICAgICAgICAgICB2YWx1ZT0mcXVvdDtodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7L3N5c3RlbSZndDsKLSAgICAgICAgICZsdDt1cmkKLSAgICAgICAgICAgICAgIG5hbWU9JnF1b3Q7aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyZxdW90OyAKLSAgICAgICAgICAgICAgIHVyaT0mcXVvdDtkYXRhL3hzZC9zb2FwLnhzZCZxdW90Oy8mZ3Q7IAotICAgICAgICAgJmx0O3B1YmxpYwotICAgICAgICAgICAgICAgcHVibGljSWQ9JnF1b3Q7aHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtJnF1b3Q7Ci0gICAgICAgICAgICAgICB1cmk9JnF1b3Q7ZGF0YS94c2QvWFNMU2NoZW1hLnhzZCZxdW90OyZndDsKLSAgICAgICAgICZsdDsvcHVibGljJmd0OwotICAgICAgICAgJmx0O25leHRDYXRhbG9nCi0gICAgICAgICAgICAgICBpZD0mcXVvdDtuZXN0ZWRDYXRhbG9nJnF1b3Q7IAotICAgICAgICAgICAgICAgY2F0YWxvZz0mcXVvdDtkYXRhL2NhdGFsb2cxLnhtbCZxdW90Oy8mZ3Q7IAotICAgICAgJmx0Oy9jYXRhbG9nQ29udHJpYnV0aW9uJmd0OyAKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvZG9jdW1lbnRGYWN0b3JpZXMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9kb2N1bWVudEZhY3Rvcmllcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDBkOTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9kb2N1bWVudEZhY3Rvcmllcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIiBpZD0iZG9jdW1lbnRGYWN0b3JpZXMiIG5hbWU9IkNvbnRlbnQgTW9kZWwgRG9jdW1lbnQgRmFjdG9yaWVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2Vycm9yQ3VzdG9taXplci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2Vycm9yQ3VzdG9taXplci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDhmMTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9lcnJvckN1c3RvbWl6ZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgaWQ9ImVycm9yQ3VzdG9taXplciIgbmFtZT0iWE1MIFZhbGlkYXRpb24gRXJyb3IgQ3VzdG9taXplciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZXJyb3IgY3VzdG9taXplciBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGEgY2xpZW50IHRvIGNvbnRyaWJ1dGUgYW4gZXJyb3IgY3VzdG9taXplciBmb3IgYSBzcGVjaWZpYyBuYW1lc3BhY2UuIFRoZSBlcnJvciBjdXN0b21pemVyIGNhbiBwcm92aWRlIGVycm9yIG1lc3NhZ2VzIHRoYXQgYXJlIG1vcmUgZG9tYWluIHNwZWNpZmljIHRoYW4gdGhlIGdlbmVyaWMgZXJyb3IgbWVzc2FnZXMgcHJvdmlkZWQgYnkgdGhlIHVuZGVybHlpbmcgZ2VuZXJpYyBYTUwgdmFsaWRhdG9yLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlcnJvckN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImVycm9yQ3VzdG9taXplciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZXNwYWNlIGZvciB3aGljaCB0aGlzIGVycm9yIGN1c3RvbWl6ZXIgd2lsbCBjb25zaWRlciBlcnJvciBjdXN0b21pemF0aW9ucy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbi5JRXJyb3JNZXNzYWdlQ3VzdG9taXplciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gRXJyb3IgQ3VzdG9taXplciBjb250cmlidXRpb246Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICAgaWQ9JnF1b3Q7c2FtcGxlRXJyb3JDdXN0b21pemVyJnF1b3Q7Ci0gICAgICAgICBuYW1lPSZxdW90O1NhbXBsZSBFcnJvciBDdXN0b21pemVyJnF1b3Q7Ci0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZXJyb3JDdXN0b21pemVyJnF1b3Q7Jmd0OwotICAgICAgJmx0O2Vycm9yQ3VzdG9taXplcgotICAgICAgICAgICAgbmFtZXNwYWNlPSZxdW90O2h0dHA6Ly9zYW1wbGUubmFtZXNwYWNlJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuU2FtcGxlRXJyb3JDdXN0b21pemVyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHN1cHBsaWVkIGNsYXNzIG11c3QgaW1wbGVtZW50ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbi5JRXJyb3JNZXNzYWdlQ3VzdG9taXplciZsdDsvY29kZSZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvbW9kZWxRdWVyeUV4dGVuc2lvbnMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9tb2RlbFF1ZXJ5RXh0ZW5zaW9ucy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjJmOTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9tb2RlbFF1ZXJ5RXh0ZW5zaW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiIGlkPSJtb2RlbFF1ZXJ5RXh0ZW5zaW9ucyIgbmFtZT0iTW9kZWwgUXVlcnkgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgaW50ZXJuYWw9InRydWUiIC8+Ci0gICAgICAgICA8L2FwcGluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1vZGVsUXVlcnlFeHRlbnNpb24iLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1vZGVsUXVlcnlFeHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEFsbG93cyBmb3IgdGhlIGN1c3RvbWl6YXRpb24gb2YgcmV0dXJuZWQgdmF1ZXMgZnJvbSBhIE1vZGVsUXVlcnkgb2JqZWN0LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbjoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBDb250ZW50IFR5cGVzIGZvciB3aGljaCB0byB1c2UgdGhpcyBleHRlbnNpb24KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU4NmMwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBNb2VsbGVyIC0gQWRkZWQgWE1MIENhdGFsb2dzIDEuMSBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JRGVsZWdhdGVDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JUmV3cml0ZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklTdWZmaXhFbnRyeTsKLXB1YmxpYyBjbGFzcyBDYXRhbG9nIGltcGxlbWVudHMgSUNhdGFsb2cKLXsKLQotCWNsYXNzIENhdGFsb2dMUwotCXsKLQkJcHVibGljIHZvaWQgbG9hZCgpCi0JCXsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzYXZlKCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJbmV3IENhdGFsb2dXcml0ZXIoKS53cml0ZShDYXRhbG9nLnRoaXMsIGxvY2F0aW9uKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBEZWZhdWx0Q2F0YWxvZ0xTIGV4dGVuZHMgQ2F0YWxvZ0xTCi0JewotCQlwdWJsaWMgdm9pZCBsb2FkKCkKLQkJewotCQkJTmV4dENhdGFsb2cgdXNlckNhdGFsb2dSZWZlcmVuY2UgPSBuZXcgTmV4dENhdGFsb2coKTsKLQkJCXVzZXJDYXRhbG9nUmVmZXJlbmNlLnNldElkKFhNTENvcmVQbHVnaW4uVVNFUl9DQVRBTE9HX0lEKTsKLQkJCXVzZXJDYXRhbG9nUmVmZXJlbmNlLnNldENhdGFsb2dMb2NhdGlvbihVU0VSX0NBVEFMT0dfRklMRSk7Ci0JCQlhZGRDYXRhbG9nRWxlbWVudCh1c2VyQ2F0YWxvZ1JlZmVyZW5jZSk7Ci0KLQkJCU5leHRDYXRhbG9nIHN5c3RlbUNhdGFsb2dSZWZlcmVuY2UgPSBuZXcgTmV4dENhdGFsb2coKTsKLQkJCXN5c3RlbUNhdGFsb2dSZWZlcmVuY2Uuc2V0SWQoWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRCk7Ci0JCQlzeXN0ZW1DYXRhbG9nUmVmZXJlbmNlLnNldENhdGFsb2dMb2NhdGlvbihTWVNURU1fQ0FUQUxPR19GSUxFKTsKLQkJCWFkZENhdGFsb2dFbGVtZW50KHN5c3RlbUNhdGFsb2dSZWZlcmVuY2UpOwotCi0JCQkvKgotCQkJICogSGVyZSB3ZSBzYXZlIHRoZSBmaWxlIGluIG9yZGVyIHRvICdyZWZsZWN0JyB0aGUgY2F0YWxvZyB0aGF0Ci0JCQkgKiB3ZSd2ZSBjcmVhdGVkIGZyb20gcGx1Zy1pbiBleHRlbnNpb25zIHRvIGRpc2suIFRoZSAnZGVmYXVsdCcKLQkJCSAqIGNhdGFsb2cgaXMgb25seSBldmVyIHdyaXR0ZW4gdG8gZGlzayBhbmQgbmV2ZXIgcmVhZCBmcm9tIGRpc2suCi0JCQkgKi8KLQkJCXNhdmUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbXBhcmF0b3IgTE9OR0VTVF9SRVdSSVRFX0ZJUlNUID0gbmV3IENvbXBhcmF0b3IoKSAKLQl7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgZW50cnkxLCBPYmplY3QgZW50cnkyKSAKLQkJewotCQkJU3RyaW5nIHN0YXJ0MSA9ICgoSVJld3JpdGVFbnRyeSllbnRyeTEpLmdldFN0YXJ0U3RyaW5nKCk7Ci0JCQlTdHJpbmcgc3RhcnQyID0gKChJUmV3cml0ZUVudHJ5KWVudHJ5MikuZ2V0U3RhcnRTdHJpbmcoKTsKLQkJCQotCQkJLy8gQmlnZ2VyIGlzIGVhcmxpZXIKLQkJCXJldHVybiBzdGFydDIubGVuZ3RoKCkgLSBzdGFydDEubGVuZ3RoKCk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGFyYXRvciBMT05HRVNUX1NVRkZJWF9GSVJTVCA9IG5ldyBDb21wYXJhdG9yKCkgCi0JewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGVudHJ5MSwgT2JqZWN0IGVudHJ5MikgCi0JCXsKLQkJCVN0cmluZyBzdWZmaXgxID0gKChJU3VmZml4RW50cnkpZW50cnkxKS5nZXRTdWZmaXgoKTsKLQkJCVN0cmluZyBzdWZmaXgyID0gKChJU3VmZml4RW50cnkpZW50cnkyKS5nZXRTdWZmaXgoKTsKLQkJCQotCQkJLy8gQmlnZ2VyIGlzIGVhcmxpZXIKLQkJCXJldHVybiBzdWZmaXgyLmxlbmd0aCgpIC0gc3VmZml4MS5sZW5ndGgoKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21wYXJhdG9yIExPTkdFU1RfREVMRUdBVEVfUFJFRklYX0ZJUlNUID0gbmV3IENvbXBhcmF0b3IoKSAKLQl7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgZW50cnkxLCBPYmplY3QgZW50cnkyKSAKLQkJewotCQkJU3RyaW5nIHByZWZpeDEgPSAoKElEZWxlZ2F0ZUNhdGFsb2cpZW50cnkxKS5nZXRTdGFydFN0cmluZygpOwotCQkJU3RyaW5nIHByZWZpeDIgPSAoKElEZWxlZ2F0ZUNhdGFsb2cpZW50cnkyKS5nZXRTdGFydFN0cmluZygpOwotCQkJCi0JCQkvLyBCaWdnZXIgaXMgZWFybGllcgotCQkJcmV0dXJuIHByZWZpeDIubGVuZ3RoKCkgLSBwcmVmaXgxLmxlbmd0aCgpOwotCQl9Ci0JfTsKLQotCWNsYXNzIEludGVybmFsUmVzb2x2ZXIKLQl7Ci0JCXByb3RlY3RlZCBNYXAgcHVibGljTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlwcm90ZWN0ZWQgTWFwIHN5c3RlbU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHJvdGVjdGVkIE1hcCB1cmlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIFRoZXNlIGFyZSBzb3J0ZWQgYnkgbG9uZ2VzdCAia2V5IiBmaXJzdC4KLQkJcHJvdGVjdGVkIExpc3QgcmV3cml0ZVN5c3RlbUxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlwcm90ZWN0ZWQgTGlzdCByZXdyaXRlVXJpTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXByb3RlY3RlZCBMaXN0IHN1ZmZpeFN5c3RlbUxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlwcm90ZWN0ZWQgTGlzdCBzdWZmaXhVcmlMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcHJvdGVjdGVkIExpc3QgZGVsZWdhdGVQdWJsaWNMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcHJvdGVjdGVkIExpc3QgZGVsZWdhdGVTeXN0ZW1MaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcHJvdGVjdGVkIExpc3QgZGVsZWdhdGVVcmlMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCi0JCUludGVybmFsUmVzb2x2ZXIoKQotCQl7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBjYXRhbG9nRWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQkJewotCQkJCUlDYXRhbG9nRWxlbWVudCBjYXRhbG9nRWxlbWVudCA9IChJQ2F0YWxvZ0VsZW1lbnQpIGkubmV4dCgpOwotCQkJCWlmIChjYXRhbG9nRWxlbWVudC5nZXRUeXBlKCkgPT0gSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpCi0JCQkJewotCQkJCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gKElDYXRhbG9nRW50cnkpIGNhdGFsb2dFbGVtZW50OwotCQkJCQlNYXAgbWFwID0gZ2V0RW50cnlNYXAoZW50cnkuZ2V0RW50cnlUeXBlKCkpOwotCQkJCQltYXAucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeSk7Ci0JCQkJfSAKLQkJCQllbHNlIGlmIChjYXRhbG9nRWxlbWVudC5nZXRUeXBlKCkgPT0gSUNhdGFsb2dFbGVtZW50LlRZUEVfUkVXUklURSkgCi0JCQkJewotCQkJCQlJUmV3cml0ZUVudHJ5IGVudHJ5ID0gKElSZXdyaXRlRW50cnkpIGNhdGFsb2dFbGVtZW50OwotCQkJCQlpZiAoZW50cnkuZ2V0RW50cnlUeXBlKCkgPT0gSVJld3JpdGVFbnRyeS5SRVdSSVRFX1RZUEVfU1lTVEVNKSAKLQkJCQkJewotCQkJCQkJcmV3cml0ZVN5c3RlbUxpc3QuYWRkKGVudHJ5KTsKLQkJCQkJfSAKLQkJCQkJZWxzZSAKLQkJCQkJewotCQkJCQkJcmV3cml0ZVVyaUxpc3QuYWRkKGVudHJ5KTsKLQkJCQkJfQotCQkJCX0gCi0JCQkJZWxzZSBpZiAoY2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX1NVRkZJWCkgCi0JCQkJewotCQkJCQlJU3VmZml4RW50cnkgZW50cnkgPSAoSVN1ZmZpeEVudHJ5KSBjYXRhbG9nRWxlbWVudDsKLQkJCQkJaWYgKGVudHJ5LmdldEVudHJ5VHlwZSgpID09IElTdWZmaXhFbnRyeS5TVUZGSVhfVFlQRV9TWVNURU0pIAotCQkJCQl7Ci0JCQkJCQlzdWZmaXhTeXN0ZW1MaXN0LmFkZChlbnRyeSk7Ci0JCQkJCX0gCi0JCQkJCWVsc2UgCi0JCQkJCXsKLQkJCQkJCXN1ZmZpeFVyaUxpc3QuYWRkKGVudHJ5KTsKLQkJCQkJfQotCQkJCX0gCi0JCQkJZWxzZSBpZiAoY2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX0RFTEVHQVRFKSAKLQkJCQl7Ci0JCQkJCUlEZWxlZ2F0ZUNhdGFsb2cgZGVsZWdhdGUgPSAoSURlbGVnYXRlQ2F0YWxvZykgY2F0YWxvZ0VsZW1lbnQ7Ci0JCQkJCWlmIChkZWxlZ2F0ZS5nZXRFbnRyeVR5cGUoKSA9PSBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfUFVCTElDKSAKLQkJCQkJewotCQkJCQkJZGVsZWdhdGVQdWJsaWNMaXN0LmFkZChkZWxlZ2F0ZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZGVsZWdhdGUuZ2V0RW50cnlUeXBlKCkgPT0gSURlbGVnYXRlQ2F0YWxvZy5ERUxFR0FURV9UWVBFX1NZU1RFTSkgCi0JCQkJCXsKLQkJCQkJCWRlbGVnYXRlU3lzdGVtTGlzdC5hZGQoZGVsZWdhdGUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgCi0JCQkJCXsKLQkJCQkJCWRlbGVnYXRlVXJpTGlzdC5hZGQoZGVsZWdhdGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlDb2xsZWN0aW9ucy5zb3J0KHJld3JpdGVTeXN0ZW1MaXN0LCBMT05HRVNUX1JFV1JJVEVfRklSU1QpOwotCQkJQ29sbGVjdGlvbnMuc29ydChyZXdyaXRlVXJpTGlzdCwgTE9OR0VTVF9SRVdSSVRFX0ZJUlNUKTsKLQotCQkJQ29sbGVjdGlvbnMuc29ydChzdWZmaXhTeXN0ZW1MaXN0LCBMT05HRVNUX1NVRkZJWF9GSVJTVCk7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KHN1ZmZpeFVyaUxpc3QsIExPTkdFU1RfU1VGRklYX0ZJUlNUKTsKLQkJCi0JCQlDb2xsZWN0aW9ucy5zb3J0KGRlbGVnYXRlUHVibGljTGlzdCwgTE9OR0VTVF9ERUxFR0FURV9QUkVGSVhfRklSU1QpOwotCQkJQ29sbGVjdGlvbnMuc29ydChkZWxlZ2F0ZVN5c3RlbUxpc3QsIExPTkdFU1RfREVMRUdBVEVfUFJFRklYX0ZJUlNUKTsKLQkJCUNvbGxlY3Rpb25zLnNvcnQoZGVsZWdhdGVVcmlMaXN0LCBMT05HRVNUX0RFTEVHQVRFX1BSRUZJWF9GSVJTVCk7Ci0JCX0KLQotCQlwcml2YXRlIE1hcCBnZXRFbnRyeU1hcChpbnQgZW50cnlUeXBlKQotCQl7Ci0JCQlNYXAgbWFwID0gc3lzdGVtTWFwOwotCQkJc3dpdGNoIChlbnRyeVR5cGUpCi0JCQl7Ci0JCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM6Ci0JCQkJbWFwID0gcHVibGljTWFwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOgotCQkJCW1hcCA9IHVyaU1hcDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gbWFwOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRNYXBwZWRVUkkoTWFwIG1hcCwgU3RyaW5nIGtleSkKLQkJewotCQkJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gKENhdGFsb2dFbnRyeSkgbWFwLmdldChrZXkpOwotCQkJaWYoZW50cnkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmcgdXJpID0gZW50cnkuZ2V0VVJJKCk7Ci0JCQl0cnkKLQkJCXsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIENTIDogZG8gd2UgcmVhbGx5IHdhbnQgdG8gcmVzb2x2ZSB0aGVzZSBoZXJlPwotICAgICAgICAgICAgICAgIC8vIEknbSBndWVzc2luZyB3ZSBzaG91bGQgcmV0dXJuIHRoZSAncGxhdGZvcm06JyBmb3JtIG9mIHRoZSBVUkkKLSAgICAgICAgICAgICAgICAvLyB0byB0aGUgY2FsbGVyLgotICAgICAgICAgICAgICAgIGlmICh1cmkuc3RhcnRzV2l0aCgicGxhdGZvcm06IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB7ICAKLQkJCQkgIFVSTCBlbnRyeVVSTCA9IG5ldyBVUkwoZW50cnkuZ2V0QWJzb2x1dGVQYXRoKHVyaSkpOyAgICAgICAgICAgICAgICAKLQkJCQkgIHVyaSA9IFBsYXRmb3JtLnJlc29sdmUoZW50cnlVUkwpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZW5zdXJlIFVSSSdzIGFyZSBvZiBmb3JtICJmaWxlOi8vL0Q6L1hYWCIgYW5kIE5PVCAgCi0gICAgICAgICAgICAgICAgICAvLyAiZmlsZTpEOi9YWFgiLiAgT3RoZXJ3aXNlIHRoZSBFTUYgVVJJIGNsYXNzIGdldHMgY29uZnVzZWQKLSAgICAgICAgICAgICAgICAgIC8vIChzZWUgYnVnIDEwMzYwNykgCi0gICAgICAgICAgICAgICAgICBTdHJpbmcgRklMRV9TQ0hFTUUgPSAiZmlsZToiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUUpICYmICF1cmkuc3RhcnRzV2l0aChGSUxFX1NDSEVNRSArICIvIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdXJpID0gRklMRV9TQ0hFTUUgKyAiLy8vIiArIHVyaS5zdWJzdHJpbmcoRklMRV9TQ0hFTUUubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICByZXR1cm4gdXJpOyAKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHJlc29sdmVQdWJsaWMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0JCQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLQkJewotCQkJU3RyaW5nIHJlc3VsdCA9IGdldE1hcHBlZFVSSShwdWJsaWNNYXAsIHB1YmxpY0lkKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSBnZXRNYXBwZWRVUkkoc3lzdGVtTWFwLCBzeXN0ZW1JZCk7Ci0JCQl9Ci0JCQkvLyBvdXIgY2xpZW50cyB1c2VkIHRvIHBhc3MgbmFtZXNwYWNlIGluIHBsYWNlIG9mIHB1YmxpYyBpZCwgc28gd2UgbmVlZCB0byBjaGVjayB1cmkgbWFwIGZvciB0aG9zZQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IGdldE1hcHBlZFVSSSh1cmlNYXAsIHB1YmxpY0lkKTsKLQkJCX0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSByZXNvbHZlRGVsZWdhdGVDYXRhbG9ncyhkZWxlZ2F0ZVB1YmxpY0xpc3QsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQl9Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gcmVzb2x2ZVN1Ym9yZGluYXRlQ2F0YWxvZ3MoCi0JCQkJCQlJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVN5c3RlbShTdHJpbmcgc3lzdGVtSWQpCi0JCQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLQkJewotCQkJU3RyaW5nIHJlc3VsdCA9IGdldE1hcHBlZFVSSShzeXN0ZW1NYXAsIHN5c3RlbUlkKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSByZXNvbHZlUmV3cml0ZShyZXdyaXRlU3lzdGVtTGlzdCwgc3lzdGVtSWQpOwotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IHJlc29sdmVTdWZmaXgoc3VmZml4U3lzdGVtTGlzdCwgc3lzdGVtSWQpOwotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IHJlc29sdmVEZWxlZ2F0ZUNhdGFsb2dzKGRlbGVnYXRlU3lzdGVtTGlzdCwgc3lzdGVtSWQsIHN5c3RlbUlkKTsgLy8gc3lzdGVtSWQgaXMgdGhlIGtleSBmb3IgInN0YXJ0U3RyaW5nIgotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IHJlc29sdmVTdWJvcmRpbmF0ZUNhdGFsb2dzKAotCQkJCQkJSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSwgbnVsbCwgc3lzdGVtSWQpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIHJlc29sdmVSZXdyaXRlKExpc3QgcmV3cml0ZUxpc3QsIFN0cmluZyBzZWFyY2hTdHJpbmcpIAotCQl7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmV3cml0ZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgCi0JCQl7Ci0JCQkJSVJld3JpdGVFbnRyeSBlbnRyeSA9IChJUmV3cml0ZUVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIHN0YXJ0U3RyaW5nID0gZW50cnkuZ2V0U3RhcnRTdHJpbmcoKTsKLQkJCQlpZiAoc2VhcmNoU3RyaW5nLnN0YXJ0c1dpdGgoc3RhcnRTdHJpbmcpKSAKLQkJCQl7Ci0JCQkJCXJldHVybiBlbnRyeS5nZXRSZXdyaXRlUHJlZml4KCkgKyBzZWFyY2hTdHJpbmcuc3Vic3RyaW5nKHN0YXJ0U3RyaW5nLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIHJlc29sdmVTdWZmaXgoTGlzdCBzdWZmaXhMaXN0LCBTdHJpbmcgc2VhcmNoU3RyaW5nKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc3VmZml4TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVN1ZmZpeEVudHJ5IGVudHJ5ID0gKElTdWZmaXhFbnRyeSkgaXQubmV4dCgpOwotCQkJCWlmIChzZWFyY2hTdHJpbmcuZW5kc1dpdGgoZW50cnkuZ2V0U3VmZml4KCkpKSB7Ci0JCQkJCXJldHVybiBlbnRyeS5nZXRVUkkoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZURlbGVnYXRlQ2F0YWxvZ3MoTGlzdCBkZWxlZ2F0ZUNhdGFsb2dzLCBTdHJpbmcga2V5LAotCQkJCVN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLQkJewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVsZWdhdGVDYXRhbG9ncy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUlEZWxlZ2F0ZUNhdGFsb2cgZGVsZWdhdGUgPSAoSURlbGVnYXRlQ2F0YWxvZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCQotCQkJCWlmIChrZXkuc3RhcnRzV2l0aChkZWxlZ2F0ZS5nZXRTdGFydFN0cmluZygpKSkgewotCQotCQkJCQlJQ2F0YWxvZyBjYXRhbG9nID0gZGVsZWdhdGUuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkKLQkJCQkJewotCQkJCQkJc3dpdGNoIChkZWxlZ2F0ZS5nZXRFbnRyeVR5cGUoKSkKLQkJCQkJCXsKLQkJCQkJCWNhc2UgSURlbGVnYXRlQ2F0YWxvZy5ERUxFR0FURV9UWVBFX1BVQkxJQzoKLQkJCQkJCQlyZXN1bHQgPSBjYXRhbG9nLnJlc29sdmVQdWJsaWMoa2V5LCBzeXN0ZW1JZCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElEZWxlZ2F0ZUNhdGFsb2cuREVMRUdBVEVfVFlQRV9TWVNURU06Ci0JCQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlU3lzdGVtKHN5c3RlbUlkKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSURlbGVnYXRlQ2F0YWxvZy5ERUxFR0FURV9UWVBFX1VSSToKLQkJCQkJCQlyZXN1bHQgPSBjYXRhbG9nLnJlc29sdmVVUkkoc3lzdGVtSWQpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJCXsKLQkJCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVVSSShTdHJpbmcgdXJpKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAotCQkJCUlPRXhjZXB0aW9uCi0JCXsKLQkJCVN0cmluZyByZXN1bHQgPSBnZXRNYXBwZWRVUkkodXJpTWFwLCB1cmkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IHJlc29sdmVSZXdyaXRlKHJld3JpdGVVcmlMaXN0LCB1cmkpOwotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IHJlc29sdmVTdWZmaXgoc3VmZml4VXJpTGlzdCwgdXJpKTsKLQkJCX0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSByZXNvbHZlRGVsZWdhdGVDYXRhbG9ncyhkZWxlZ2F0ZVVyaUxpc3QsIHVyaSwgdXJpKTsgLy8gdXJpIGlzIHRyZWF0ZWQgYXMgdGhlIHN5c3RlbUlkCi0JCQl9Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gcmVzb2x2ZVN1Ym9yZGluYXRlQ2F0YWxvZ3MoCi0JCQkJCQlJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJLCBudWxsLCB1cmkpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCWNsYXNzIFN5c3RlbUNhdGFsb2dMUyBleHRlbmRzIENhdGFsb2dMUwotCXsKLQkJcHVibGljIHZvaWQgbG9hZCgpCi0JCXsKLQkJCW5ldyBDYXRhbG9nQ29udHJpYnV0b3JSZWdpc3RyeVJlYWRlcihDYXRhbG9nLnRoaXMpLnJlYWRSZWdpc3RyeSgpOwotCi0JCQkvKgotCQkJICogSGVyZSB3ZSBzYXZlIHRoZSBmaWxlIGluIG9yZGVyIHRvICdyZWZsZWN0JyB0aGUgY2F0YWxvZyB0aGF0Ci0JCQkgKiB3ZSd2ZSBjcmVhdGVkIGZyb20gcGx1Z2luIGV4dGVuc2lvbnMgdG8gZGlzay4gCi0JCQkgKiBUaGUgJ3N5c3RlbScgY2F0YWxvZyBpcyBvbmx5IGV2ZXIgd3JpdHRlbiB0byBkaXNrIGFuZCBuZXZlciByZWFkIGZyb20gZGlzay4KLQkJCSAqLwotCQkJc2F2ZSgpOwotCQl9Ci0JfQotCi0JY2xhc3MgVXNlckNhdGFsb2dMUyBleHRlbmRzIENhdGFsb2dMUwotCXsKLQkJcHVibGljIHZvaWQgbG9hZCgpCi0JCXsKLQkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeQotCQkJewotCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsICYmIGxvY2F0aW9uLmxlbmd0aCgpID4gMCkgCi0JCQkJewotCQkJCQlVUkwgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0JCQkJCWlucHV0U3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCQkJYm9vbGVhbiBvbGROb3RpZmljYXRpb25FbmFibGVkID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJCQljbGVhcigpOwotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkJQ2F0YWxvZ1JlYWRlci5yZWFkKENhdGFsb2cudGhpcywgaW5wdXRTdHJlYW0pOwotCQkJCQl9IGZpbmFsbHkKLQkJCQkJewotCQkJCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChvbGROb3RpZmljYXRpb25FbmFibGVkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQljbGVhcigpOwotCQkJCX0KLQkJCQlub3RpZnlDaGFuZ2VkKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQkvLyBUaGlzIGlzIE9LIHNpbmNlIHRoZSBjYXRhbG9nIG1heSBub3QgZXhpc3QgYmVmb3JlIHdlIGNyZWF0ZSBpdAotCQkJfSBmaW5hbGx5Ci0JCQl7Ci0JCQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0JCQkJewotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQkJCXsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19GSUxFID0gImRlZmF1bHRfY2F0YWxvZy54bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fQ0FUQUxPR19GSUxFID0gInN5c3RlbV9jYXRhbG9nLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQ0FUQUxPR19GSUxFID0gInVzZXJfY2F0YWxvZy54bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJhc2U7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjYXRhbG9nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZ0xTIGNhdGFsb2dMUzsKLQotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0KLQlwcm90ZWN0ZWQgSW50ZXJuYWxSZXNvbHZlciBpbnRlcm5hbFJlc29sdmVyOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkOwotCi0JcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvbjsKLQotCXByb3RlY3RlZCBDYXRhbG9nU2V0IHJlc291cmNlU2V0OwotCi0JcHVibGljIENhdGFsb2coQ2F0YWxvZ1NldCBjYXRhbG9nUmVzb3VyY2VTZXQsIFN0cmluZyBpZCwgU3RyaW5nIGxvY2F0aW9uKQotCXsKLQkJdGhpcy5yZXNvdXJjZVNldCA9IGNhdGFsb2dSZXNvdXJjZVNldDsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0KLQkJaWYgKFhNTENvcmVQbHVnaW4uREVGQVVMVF9DQVRBTE9HX0lELmVxdWFscyhpZCkpCi0JCXsKLQkJCWNhdGFsb2dMUyA9IG5ldyBEZWZhdWx0Q2F0YWxvZ0xTKCk7Ci0JCX0gZWxzZSBpZiAoWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRC5lcXVhbHMoaWQpKQotCQl7Ci0JCQljYXRhbG9nTFMgPSBuZXcgU3lzdGVtQ2F0YWxvZ0xTKCk7Ci0JCX0gZWxzZQotCQl7Ci0JCQljYXRhbG9nTFMgPSBuZXcgVXNlckNhdGFsb2dMUygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQpCi0JewotCQljYXRhbG9nRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQllbGVtZW50LnNldE93bmVyQ2F0YWxvZyh0aGlzKTsKLQkJaW50ZXJuYWxSZXNvbHZlciA9IG51bGw7Ci0JCW5vdGlmeUFkZEVsZW1lbnQoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRW50cmllc0Zyb21DYXRhbG9nKElDYXRhbG9nIGNhdGFsb2cpCi0JewotCQl0cnkKLQkJewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlpZiAoY2F0YWxvZyAhPSBudWxsKQotCQkJewotCQkJCUlDYXRhbG9nRWxlbWVudFtdIGVudHJpZXMgPSAoKENhdGFsb2cpY2F0YWxvZykuZ2V0Q2F0YWxvZ0VsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJQ2F0YWxvZ0VsZW1lbnQgY2xvbmUgPSAoQ2F0YWxvZ0VsZW1lbnQpKChDYXRhbG9nRWxlbWVudCllbnRyaWVzW2ldKS5jbG9uZSgpOwotCQkJCQlhZGRDYXRhbG9nRWxlbWVudChjbG9uZSk7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQl7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJhcmd1bWVudCB3YXMgbnVsbCBpbiBDYXRhbG9nLmFkZEVudHJpZXNGcm9tQ2F0YWxvZyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZmluYWxseQotCQl7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKHRydWUpOwotCQl9Ci0JCWludGVybmFsUmVzb2x2ZXIgPSBudWxsOwotCQlub3RpZnlDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUNhdGFsb2dMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkKLQl7Ci0JCWNhdGFsb2dFbGVtZW50cy5jbGVhcigpOwotCQlpbnRlcm5hbFJlc29sdmVyID0gbnVsbDsKLQkJbm90aWZ5Q2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnQgY3JlYXRlQ2F0YWxvZ0VsZW1lbnQoaW50IHR5cGUpCi0JewotCQlzd2l0Y2ggKHR5cGUpCi0JCXsKLQkJY2FzZSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWToKLQkJCXJldHVybiBuZXcgQ2F0YWxvZ0VudHJ5KCk7IC8vIFRPRE86IFNob3VsZCBiZSBraW5kIG9mIGRlcHJlY2F0ZWQKLQkJY2FzZSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ORVhUX0NBVEFMT0c6Ci0JCQlyZXR1cm4gbmV3IE5leHRDYXRhbG9nKCk7Ci0JCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzoKLQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNOgotCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk6Ci0JCQlyZXR1cm4gbmV3IENhdGFsb2dFbnRyeSh0eXBlKTsKLQkJY2FzZSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9SRVdSSVRFOgkKLQkJY2FzZSBJUmV3cml0ZUVudHJ5LlJFV1JJVEVfVFlQRV9TWVNURU06Ci0JCWNhc2UgSVJld3JpdGVFbnRyeS5SRVdSSVRFX1RZUEVfVVJJOgotCQkJcmV0dXJuIG5ldyBSZXdyaXRlRW50cnkodHlwZSk7Ci0JCWNhc2UgSUNhdGFsb2dFbGVtZW50LlRZUEVfU1VGRklYOgkKLQkJY2FzZSBJU3VmZml4RW50cnkuU1VGRklYX1RZUEVfU1lTVEVNOgotCQljYXNlIElTdWZmaXhFbnRyeS5TVUZGSVhfVFlQRV9VUkk6Ci0JCQlyZXR1cm4gbmV3IFN1ZmZpeEVudHJ5KHR5cGUpOwotCQljYXNlIElDYXRhbG9nRWxlbWVudC5UWVBFX0RFTEVHQVRFOgkKLQkJY2FzZSBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfUFVCTElDOgotCQljYXNlIElEZWxlZ2F0ZUNhdGFsb2cuREVMRUdBVEVfVFlQRV9TWVNURU06Ci0JCWNhc2UgSURlbGVnYXRlQ2F0YWxvZy5ERUxFR0FURV9UWVBFX1VSSToKLQkJCXJldHVybiBuZXcgRGVsZWdhdGVDYXRhbG9nKHR5cGUpOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBlbGVtZW50IHR5cGUgIiArIHR5cGUpOy8vJE5PTi1OTFMtMSAvLyBNYWtlcyBubyBzZW5zZSBhdCBhbGwhCi0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2UoKQotCXsKLQkJcmV0dXJuIGJhc2U7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldENhdGFsb2dFbGVtZW50cyhpbnQgdHlwZSkKLQl7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ2F0YWxvZ0VsZW1lbnRbXSBlbGVtZW50cyA9IChJQ2F0YWxvZ0VsZW1lbnRbXSkgY2F0YWxvZ0VsZW1lbnRzCi0JCQkJLnRvQXJyYXkobmV3IElDYXRhbG9nRWxlbWVudFtjYXRhbG9nRWxlbWVudHMuc2l6ZSgpXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCXsKLQkJCUlDYXRhbG9nRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQlpZiAoZWxlbWVudC5nZXRUeXBlKCkgPT0gdHlwZSkKLQkJCXsKLQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nRW50cnlbXSBnZXRDYXRhbG9nRW50cmllcygpCi0JewotCQlMaXN0IHJlc3VsdCA9IGdldENhdGFsb2dFbGVtZW50cyhJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWSk7Ci0JCXJldHVybiAoSUNhdGFsb2dFbnRyeVtdKSByZXN1bHQKLQkJCQkudG9BcnJheShuZXcgSUNhdGFsb2dFbnRyeVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIElEZWxlZ2F0ZUNhdGFsb2dbXSBnZXREZWxlZ2F0ZUNhdGFsb2dzKCkgCi0JewotCQlMaXN0IHJlc3VsdCA9IGdldENhdGFsb2dFbGVtZW50cyhJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ERUxFR0FURSk7Ci0JCXJldHVybiAoSURlbGVnYXRlQ2F0YWxvZ1tdKSByZXN1bHQKLQkJCQkudG9BcnJheShuZXcgSURlbGVnYXRlQ2F0YWxvZ1tyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyBJUmV3cml0ZUVudHJ5W10gZ2V0UmV3cml0ZUVudHJpZXMoKSAKLQl7Ci0JCUxpc3QgcmVzdWx0ID0gZ2V0Q2F0YWxvZ0VsZW1lbnRzKElDYXRhbG9nRWxlbWVudC5UWVBFX1JFV1JJVEUpOwotCQlyZXR1cm4gKElSZXdyaXRlRW50cnlbXSkgcmVzdWx0Ci0JCQkJLnRvQXJyYXkobmV3IElSZXdyaXRlRW50cnlbcmVzdWx0LnNpemUoKV0pOwotCX0KLQkKLQlwdWJsaWMgSVN1ZmZpeEVudHJ5W10gZ2V0U3VmZml4RW50cmllcygpIAotCXsKLQkJTGlzdCByZXN1bHQgPSBnZXRDYXRhbG9nRWxlbWVudHMoSUNhdGFsb2dFbGVtZW50LlRZUEVfU1VGRklYKTsKLQkJcmV0dXJuIChJU3VmZml4RW50cnlbXSkgcmVzdWx0Ci0JCQkJLnRvQXJyYXkobmV3IElTdWZmaXhFbnRyeVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCQotCXByb3RlY3RlZCBDYXRhbG9nU2V0IGdldENhdGFsb2dTZXQoKQotCXsKLQkJcmV0dXJuIHJlc291cmNlU2V0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotCXsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKQotCXsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBJTmV4dENhdGFsb2dbXSBnZXROZXh0Q2F0YWxvZ3MoKQotCXsKLQkJTGlzdCByZXN1bHQgPSBnZXRDYXRhbG9nRWxlbWVudHMoSUNhdGFsb2dFbGVtZW50LlRZUEVfTkVYVF9DQVRBTE9HKTsKLQkJcmV0dXJuIChJTmV4dENhdGFsb2dbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElOZXh0Q2F0YWxvZ1tyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIEludGVybmFsUmVzb2x2ZXIgZ2V0T3JDcmVhdGVJbnRlcm5hbFJlc29sdmVyKCkKLQl7Ci0JCWlmIChpbnRlcm5hbFJlc29sdmVyID09IG51bGwpCi0JCXsKLQkJCWludGVybmFsUmVzb2x2ZXIgPSBuZXcgSW50ZXJuYWxSZXNvbHZlcigpOwotCQl9Ci0JCXJldHVybiBpbnRlcm5hbFJlc29sdmVyOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpCi0JewotCQlyZXR1cm4gaXNOb3RpZmljYXRpb25FbmFibGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCWNhdGFsb2dMUy5sb2FkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5QWRkRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQgZW50cnkpCi0JewotCQlpZiAoaXNOb3RpZmljYXRpb25FbmFibGVkKQotCQl7Ci0JCQlJQ2F0YWxvZ0V2ZW50IGV2ZW50ID0gbmV3IENhdGFsb2dFdmVudCh0aGlzLCBlbnRyeSwKLQkJCQkJSUNhdGFsb2dFdmVudC5FTEVNRU5UX0FEREVEKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlDaGFuZ2VkKCkKLQl7Ci0JCUlDYXRhbG9nRXZlbnQgZXZlbnQgPSBuZXcgQ2F0YWxvZ0V2ZW50KHRoaXMsIG51bGwsCi0JCQkJSUNhdGFsb2dFdmVudC5DSEFOR0VEKTsKLQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSUNhdGFsb2dFdmVudCBldmVudCkKLQl7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbGlzdC5hZGRBbGwobGlzdGVuZXJMaXN0KTsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCXsKLQkJCUlDYXRhbG9nTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUNhdGFsb2dMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5jYXRhbG9nQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlSZW1vdmVFbGVtZW50KElDYXRhbG9nRWxlbWVudCBlbGVtZW50KQotCXsKLQkJaWYgKGlzTm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJewotCQkJSUNhdGFsb2dFdmVudCBldmVudCA9IG5ldyBDYXRhbG9nRXZlbnQodGhpcywgZWxlbWVudCwKLQkJCQkJSUNhdGFsb2dFdmVudC5FTEVNRU5UX1JFTU9WRUQpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNhdGFsb2dFbGVtZW50KElDYXRhbG9nRWxlbWVudCBlbGVtZW50KQotCXsKLQkJY2F0YWxvZ0VsZW1lbnRzLnJlbW92ZShlbGVtZW50KTsKLQkJaW50ZXJuYWxSZXNvbHZlciA9IG51bGw7Ci0JCW5vdGlmeVJlbW92ZUVsZW1lbnQoZWxlbWVudCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElDYXRhbG9nTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVQdWJsaWMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0JCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldE9yQ3JlYXRlSW50ZXJuYWxSZXNvbHZlcigpLnJlc29sdmVQdWJsaWMocHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVTdWJvcmRpbmF0ZUNhdGFsb2dzKGludCBlbnRyeVR5cGUsIFN0cmluZyBwdWJsaWNJZCwKLQkJCVN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLQl7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBnZXROZXh0Q2F0YWxvZ3MoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspCi0JCXsKLQkJCUlOZXh0Q2F0YWxvZyBuZXh0Q2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLQkJCUlDYXRhbG9nIGNhdGFsb2cgPSBuZXh0Q2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkKLQkJCXsKLQkJCQlzd2l0Y2ggKGVudHJ5VHlwZSkKLQkJCQl7Ci0JCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOgotCQkJCQlyZXN1bHQgPSBjYXRhbG9nLnJlc29sdmVQdWJsaWMocHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNOgotCQkJCQlyZXN1bHQgPSBjYXRhbG9nLnJlc29sdmVTeXN0ZW0oc3lzdGVtSWQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk6Ci0JCQkJCXJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZVVSSShzeXN0ZW1JZCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJewotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVTeXN0ZW0oU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAotCQkJSU9FeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRPckNyZWF0ZUludGVybmFsUmVzb2x2ZXIoKS5yZXNvbHZlU3lzdGVtKHN5c3RlbUlkKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0T3JDcmVhdGVJbnRlcm5hbFJlc29sdmVyKCkucmVzb2x2ZVVSSSh1cmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCWNhdGFsb2dMUy5zYXZlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmFzZShTdHJpbmcgYmFzZSkKLQl7Ci0JCXRoaXMuYmFzZSA9IGJhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKQotCXsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikKLQl7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gYikKLQl7Ci0JCWlzTm90aWZpY2F0aW9uRW5hYmxlZCA9IGI7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nRWxlbWVudFtdIGdldENhdGFsb2dFbGVtZW50cygpCi0JewotCQlyZXR1cm4gKElDYXRhbG9nRWxlbWVudFtdKSBjYXRhbG9nRWxlbWVudHMudG9BcnJheShuZXcgSUNhdGFsb2dFbGVtZW50W2NhdGFsb2dFbGVtZW50cy5zaXplKCldKTsKLQl9Ci0JCi0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0NvbnRyaWJ1dG9yUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dDb250cmlidXRvclJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMDFjNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0NvbnRyaWJ1dG9yUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIENhdGFsb2dDb250cmlidXRvclJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJjYXRhbG9nQ29udHJpYnV0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NPTlRSSUJVVElPTiA9ICJjYXRhbG9nQ29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAvKgotICAgKiB0aGlzIGlzIGEgc2FtcGxlIGV4cHRlbnNpb24gCi0gICAqIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jYXRhbG9nQ29udHJpYnV0aW9ucyI+IAotICAgKiA8Y2F0YWxvZ0NvbnRyaWJ1dGlvbj4KLSAgICogICAgPHVyaQotICAgKiAgICAgICAgICAgICBuYW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKLSAgICogICAgICAgICAgICAgdXJpPSJ4c2Qvc29hcC54c2QiLz4gCi0gICAqICAgCTxwdWJsaWMKLSAgICogICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0gICAqICAgICAgICAgIHVyaT0iZHRkcy94aHRtbDExLWZsYXQuZHRkIi8+IAotICAgKiAgCTxuZXh0Q2F0YWxvZyBpZD0ibmVzdGVkQ2F0YWxvZyIgY2F0YWxvZz0iZGF0YS9jYXRhbG9nMS54bWwiLz4gCi0gICAqICA8L2NhdGFsb2dDb250cmlidXRpb24+IAotICAgKiAgPC9leHRlbnNpb24+Ci0gICAqICAKLSAgICovCi0gIHByb3RlY3RlZCBJQ2F0YWxvZyBjYXRhbG9nOwotCi0gIHByb3RlY3RlZCBTdHJpbmcgZGVjbGFyaW5nRXh0ZW5zaW9uSWQ7Ci0gIAotICBwcm90ZWN0ZWQgQ2F0YWxvZ0NvbnRyaWJ1dG9yUmVnaXN0cnlSZWFkZXIoSUNhdGFsb2cgYUNhdGFsb2cpCi0gIHsKLSAgICBjYXRhbG9nID0gYUNhdGFsb2c7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgcGFyc2UgaXQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVBhdGgoVVJMIHBsYXRmb3JtVVJMLCBTdHJpbmcgcGF0aCkgCi0gIHsgICAgICAKLQlTdHJpbmcgZmlsZUxvY2F0aW9uID0gcGF0aDsKLQlpbnQgamFyUGF0aFN0YXJ0ID0gcGF0aC5pbmRleE9mKCJqYXI6Iik7IC8vJE5PTi1OTFMtMSQKLQlqYXJQYXRoU3RhcnQgPSBqYXJQYXRoU3RhcnQgPCAwID8gMCA6IGphclBhdGhTdGFydCArICJqYXI6Ii5sZW5ndGgoKTsgLy8kTk9OLU5MUy0xJAotCWludCBqYXJQYXRoRW5kID0gcGF0aC5pbmRleE9mKCIhIik7IC8vJE5PTi1OTFMtMSQKLQlqYXJQYXRoRW5kID0gamFyUGF0aEVuZCA8IDAgPyBwYXRoLmxlbmd0aCgpIDogamFyUGF0aEVuZDsKLQlmaWxlTG9jYXRpb24gPSBwYXRoLnN1YnN0cmluZyhqYXJQYXRoU3RhcnQsIGphclBhdGhFbmQpOwotCQotCVN0cmluZyByZXN1bHQgPSBwYXRoOwotCVN0cmluZyByZXNvbHZlZExvY2F0aW9uID0gZmlsZUxvY2F0aW9uOwotCVVSTCByZXNvbHZlZFVSTCA9IG51bGw7Ci0gICAgaWYgKGZpbGVMb2NhdGlvbi5zdGFydHNXaXRoKCJwbGF0Zm9ybTovcGx1Z2luIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICAvLyB0aGlzIGlzIHRoZSBzcGVjbGlhbCBjYXNlLCB3aGVyZSB0aGUgcmVzb3VyY2UgaXMgbG9jYXRlZCByZWxhdGl2ZSAKLSAgICAgIC8vIHRvIGFub3RoZXIgcGx1Z2luIChub3QgdGhlIG9uZSB0aGF0IGRlY2xhcmVzIHRoZSBleHRlbnNpb24gcG9pbnQpCi0gICAgICAvLwotCQl0cnkKLQkJewotCQkJcmVzb2x2ZWRVUkwgPSBQbGF0Zm9ybS5yZXNvbHZlKG5ldyBVUkwoZmlsZUxvY2F0aW9uKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfSAKLSAgICB9Ci0gICAgZWxzZXsKLSAgICAJIC8vIHRoaXMgaXMgdGhlIHR5cGljYWwgY2FzZSwgd2hlcmUgdGhlIHJlc291cmNlIGlzIGxvY2F0ZWQgcmVsYXRpdmUKLSAgICAgICAgLy8gdG8gdGhlIHBsdWdpbiB0aGF0IGRlY2xhcmVzIHRoZSBleHRlbnNpb24gcG9pbnQKLSAgICAJIHRyeSB7Ci0gICAgCSAgICAgCXJlc29sdmVkVVJMID0gbmV3IFVSTChQbGF0Zm9ybS5yZXNvbHZlKHBsYXRmb3JtVVJMKSwgZmlsZUxvY2F0aW9uKTsKLSAgICAJIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAJICAgIAkvLyBkbyBub3RoaW5nCi0gICAgCSB9Ci0gICAgfQotICAgCi0gICBpZihyZXNvbHZlZFVSTCAhPSBudWxsKXsKLSAgICAJcmVzb2x2ZWRMb2NhdGlvbiA9IHJlc29sdmVkVVJMLnRvRXh0ZXJuYWxGb3JtKCkucmVwbGFjZSgnXFwnLCAnLycpOwotICAgIAlyZXN1bHQgPSByZXN1bHQucmVwbGFjZUZpcnN0KGZpbGVMb2NhdGlvbiwgcmVzb2x2ZWRMb2NhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgVVJMIGdldFBsYXRmb3JtVVJMKFN0cmluZyBwbHVnaW5JZCl7Ci0JICBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQl7Ci0JCQlVUkwgYnVuZGxlRW50cnkgPSBidW5kbGUuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlpZihidW5kbGVFbnRyeSAhPSBudWxsKXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCXJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGJ1bmRsZUVudHJ5KTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyByZXNvbHZlUGF0aChTdHJpbmcgcGF0aCkKLSAgewotCSAgcmV0dXJuIHJlc29sdmVQYXRoKGdldFBsYXRmb3JtVVJMKGRlY2xhcmluZ0V4dGVuc2lvbklkKSwgcGF0aCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHRyeQotICAgIHsKLQkgIGRlY2xhcmluZ0V4dGVuc2lvbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgfQotICAgIAotICAgIGlmIChUQUdfQ09OVFJJQlVUSU9OLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpewotICAgIAlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBtYXBwaW5nSW5mb0VsZW1lbnRMaXN0ID0gZWxlbWVudC5nZXRDaGlsZHJlbihPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1BVQkxJQyk7Ci0gICAgCXByb2Nlc3NNYXBwaW5nSW5mb0VsZW1lbnRzKG1hcHBpbmdJbmZvRWxlbWVudExpc3QpOwotICAgIAltYXBwaW5nSW5mb0VsZW1lbnRMaXN0ID0gZWxlbWVudC5nZXRDaGlsZHJlbihPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1NZU1RFTSk7Ci0gICAgCXByb2Nlc3NNYXBwaW5nSW5mb0VsZW1lbnRzKG1hcHBpbmdJbmZvRWxlbWVudExpc3QpOwotICAgIAltYXBwaW5nSW5mb0VsZW1lbnRMaXN0ID0gZWxlbWVudC5nZXRDaGlsZHJlbihPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1VSSSk7Ci0gICAgCXByb2Nlc3NNYXBwaW5nSW5mb0VsZW1lbnRzKG1hcHBpbmdJbmZvRWxlbWVudExpc3QpOwotICAgIAlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBuZXh0Q2F0YWxvZ0VsZW1lbnRMaXN0ID0gZWxlbWVudC5nZXRDaGlsZHJlbihPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX05FWFRfQ0FUQUxPRyk7Ci0gICAgCXByb2Nlc3NOZXh0Q2F0YWxvZ0VsZW1lbnRzKG5leHRDYXRhbG9nRWxlbWVudExpc3QpOwotICAgIAkKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJvY2Vzc01hcHBpbmdJbmZvRWxlbWVudHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRFbGVtZW50TGlzdCkKLSAgewotICAgIGlmIChjYXRhbG9nID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEVsZW1lbnRMaXN0Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBjaGlsZEVsZW1lbnRMaXN0W2ldOwotICAgICAgU3RyaW5nIG5hbWUgPSBjaGlsZEVsZW1lbnQuZ2V0TmFtZSgpOwotICAgICAgU3RyaW5nIGtleSA9IG51bGw7Ci0JCi0gICAgICBpbnQgdHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM7Ci0gICAgICBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19QVUJMSUMuZXF1YWxzKG5hbWUpKQotICAgICAgewotICAgICAgICBrZXkgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1BVQkxJQ19JRCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1NZU1RFTS5lcXVhbHMobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfU1lTVEVNX0lEKTsKLSAgICAgICAgdHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU07Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1VSSS5lcXVhbHMobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgICAgIHR5cGUgPSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19ORVhUX0NBVEFMT0cuZXF1YWxzKG5hbWUpKQotICAgICAgewotICAgICAgICBwcm9jZXNzTmV4dENhdGFsb2dFbGVtZW50cyhuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50W117Y2hpbGRFbGVtZW50fSk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGtleS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfZW50cnlfa2V5X25vdF9zZXQpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIFN0cmluZyBlbnRyeVVSSSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJKTsgLy8gbWFuZGF0b3J5Ci0gICAgICBpZiAoZW50cnlVUkkgPT0gbnVsbCB8fCBlbnRyeVVSSS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX2VudHJ5X3VyaV9ub3Rfc2V0KTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQgPSBjYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KHR5cGUpOwotICAgICAgaWYgKGNhdGFsb2dFbGVtZW50IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkKLSAgICAgIHsKLSAgICAgICAgSUNhdGFsb2dFbnRyeSBlbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBjYXRhbG9nRWxlbWVudDsKLSAgICAgICAgZW50cnkuc2V0S2V5KGtleSk7Ci0JCVN0cmluZyByZXNvbHZlZFBhdGggPSByZXNvbHZlUGF0aChlbnRyeVVSSSk7Ci0JCWVudHJ5LnNldFVSSShyZXNvbHZlZFBhdGgpOwotICAgICAgICBTdHJpbmcgaWQgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0lEKTsgLy8gb3B0aW9uYWwKLSAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgIWlkLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIGVudHJ5LnNldElkKGlkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gcHJvY2VzcyBhbnkgb3RoZXIgYXR0cmlidXRlcwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKS5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZU5hbWVzKClbal07Ci0gICAgICAgIGlmICghYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSkgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9OQU1FKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1BVQkxJQ19JRCkKLSAgICAgICAgICAgICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfU1lTVEVNX0lEKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0cpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQpCi0gICAgICAgICAgICAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0JBU0UpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpOwotICAgICAgICAgIGlmIChhdHRyVmFsdWUgIT0gbnVsbCAmJiAhYXR0clZhbHVlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXRhbG9nRWxlbWVudC5zZXRBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZSwgYXR0clZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGFsb2cuYWRkQ2F0YWxvZ0VsZW1lbnQoY2F0YWxvZ0VsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzTmV4dENhdGFsb2dFbGVtZW50cyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZEVsZW1lbnRMaXN0KQotICB7Ci0gICAgaWYgKGNhdGFsb2cgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRWxlbWVudExpc3QubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkRWxlbWVudCA9IGNoaWxkRWxlbWVudExpc3RbaV07Ci0gICAgICBTdHJpbmcgbG9jYXRpb24gPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0cpOyAvLyBtYW5kYXRvcnkKLSAgICAgIGlmIChsb2NhdGlvbiA9PSBudWxsIHx8IGxvY2F0aW9uLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX25leHRfY2F0YWxvZ19sb2NhdGlvbl91cmlfbm90X3NldCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgSU5leHRDYXRhbG9nIG5leHRDYXRhbG9nID0gbmV3IE5leHRDYXRhbG9nKCk7Ci0JICBTdHJpbmcgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZVBhdGgobG9jYXRpb24pOwotICAgICAgbmV4dENhdGFsb2cuc2V0Q2F0YWxvZ0xvY2F0aW9uKHJlc29sdmVkUGF0aCk7Ci0JICBTdHJpbmcgaWQgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0lEKTsKLQkgIGlmIChpZCAhPSBudWxsICYmICFpZC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7IAotCQkgIG5leHRDYXRhbG9nLnNldElkKGlkKTsKLSAgICAgIH0KLSAgICAgIGNhdGFsb2cuYWRkQ2F0YWxvZ0VsZW1lbnQobmV4dENhdGFsb2cpOwotICAgIH0KLSAgfQotICAKLSAKLSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg2ZTIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBNb2xsZXIgLSBqZXNwZXJAc2Vsc2thYmV0Lm9yZyAtIGJ1ZyAxMTIyODQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBDYXRhbG9nRWxlbWVudCBpbXBsZW1lbnRzIElDYXRhbG9nRWxlbWVudAotewotCWludCB0eXBlOwotCi0JU3RyaW5nIGlkOwotCi0JU3RyaW5nIGJhc2U7Ci0KLQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlJQ2F0YWxvZyBvd25lckNhdGFsb2c7Ci0KLQlwdWJsaWMgQ2F0YWxvZ0VsZW1lbnQoaW50IGFUeXBlKQotCXsKLQkJc3VwZXIoKTsKLQkJdHlwZSA9IGFUeXBlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0JewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2UoKQotCXsKLQkJcmV0dXJuIGJhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmFzZShTdHJpbmcgYmFzZSkKLQl7Ci0JCXRoaXMuYmFzZSA9IGJhc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZSkKLQl7Ci0JCXJldHVybiAoU3RyaW5nKSBhdHRyaWJ1dGVzLmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotCXsKLQkJYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBdHRyaWJ1dGVzKCkKLQl7Ci0JCUNvbGxlY3Rpb24gYyA9IGF0dHJpYnV0ZXMudmFsdWVzKCk7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbYy5zaXplKCldOwotCQlhdHRyaWJ1dGVzLmtleVNldCgpLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkKLQl7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpCi0JewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nIGdldE93bmVyQ2F0YWxvZygpCi0JewotCQlyZXR1cm4gb3duZXJDYXRhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE93bmVyQ2F0YWxvZyhJQ2F0YWxvZyBjYXRhbG9nKQotCXsKLQkJdGhpcy5vd25lckNhdGFsb2cgPSBjYXRhbG9nOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIG1ha2VBYnNvbHV0ZShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgbG9jYXRpb24pCi0JewotCQlVUkwgbG9jYWwgPSBudWxsOwotCQlsb2NhdGlvbiA9IGxvY2F0aW9uLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJdHJ5Ci0JCXsKLQkJCVVSTCBiYXNlVVJMID0gbmV3IFVSTChiYXNlTG9jYXRpb24pOwotCQkJbG9jYWwgPSBuZXcgVVJMKGJhc2VVUkwsIGxvY2F0aW9uKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0JCXsKLQkJfQotCi0JCWlmIChsb2NhbCAhPSBudWxsKQotCQl7Ci0JCQlyZXR1cm4gbG9jYWwudG9TdHJpbmcoKTsKLQkJfSBlbHNlCi0JCXsKLQkJCXJldHVybiBsb2NhdGlvbjsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKFN0cmluZyBwYXRoKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCVVSSSB1cmkgPSBuZXcgVVJJKHBhdGgpOwotCQkJaWYgKHVyaS5pc0Fic29sdXRlKCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHBhdGg7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotCQl7Ci0JCX0KLQotCQlpZiAodGhpcy5iYXNlICE9IG51bGwgJiYgIXRoaXMuYmFzZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCXJldHVybiBtYWtlQWJzb2x1dGUoYmFzZSwgcGF0aCk7CQkKLQkJfQotCQkKLQkJU3RyaW5nIHJlc3VsdCA9IHBhdGg7Ci0JCUNhdGFsb2cgY2F0YWxvZyA9IChDYXRhbG9nKSBnZXRPd25lckNhdGFsb2coKTsKLQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkKLQkJewotCQkJU3RyaW5nIGJhc2UgPSBjYXRhbG9nLmdldEJhc2UoKTsKLQkJCWlmIChiYXNlID09IG51bGwgfHwgYmFzZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJYmFzZSA9IGNhdGFsb2cuZ2V0TG9jYXRpb24oKTsKLQkJCX0KLQkJCXJlc3VsdCA9IG1ha2VBYnNvbHV0ZShiYXNlLCBwYXRoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkgIC8qCi0JICAgKiBTaW5jZSB3ZSBkb24ndCBoYXZlIGV2ZW50cyBub3RpZmljYXRpb25zIGZvciBlbnRyeSBwcm9wZXJ0aWVzLCBjbG9uZSgpCi0JICAgKiBjb3VsZCBhbGxvdyB0byBjb3B5IGFuZCBlZGl0IGVudHJ5IGFuZCB0aGVuIHJlcGxhY2UgaXQgaW4gY2F0YWxvZy4gRW50cnkKLQkgICAqIHJlcGxhY2VtZW50IHdpbGwgc2lnbmFsIElDYXRhbG9nRXZlbnQgQHJldHVybgotCSAgICovCi0JICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLQkgIHsKLQkJSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQgPSBvd25lckNhdGFsb2cuY3JlYXRlQ2F0YWxvZ0VsZW1lbnQodHlwZSk7Ci0JICAgIFN0cmluZ1tdIGF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzKCk7ICAgCi0JICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykKLQkgICAgewotCSAgICAgIFN0cmluZyBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbaV07Ci0JICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lKTsKLQkgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotCSAgICB9Ci0JCWVsZW1lbnQuc2V0T3duZXJDYXRhbG9nKG93bmVyQ2F0YWxvZyk7Ci0JCWVsZW1lbnQuc2V0SWQoaWQpOwotCQllbGVtZW50LnNldEJhc2UoYmFzZSk7Ci0JICAgIHJldHVybiBlbGVtZW50OwotCSAgfQotCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTBhOGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBDYXRhbG9nRW50cnkgZXh0ZW5kcyBDYXRhbG9nRWxlbWVudCBpbXBsZW1lbnRzIElDYXRhbG9nRW50cnksIENsb25lYWJsZQotewotICBpbnQgZW50cnlUeXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzsKLSAgU3RyaW5nIGtleTsKLSAgU3RyaW5nIHVyaTsKLQotICBwcm90ZWN0ZWQgQ2F0YWxvZ0VudHJ5KGludCBhbkVudHJ5VHlwZSkKLSAgewotICAgIHN1cGVyKElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKTsKLSAgICBlbnRyeVR5cGUgPSBhbkVudHJ5VHlwZTsKLSAgfQotCi0gIHByb3RlY3RlZCBDYXRhbG9nRW50cnkoKQotICB7Ci0gICAgc3VwZXIoSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RW50cnlUeXBlKGludCB2YWx1ZSkKLSAgewotICAgIGVudHJ5VHlwZSA9IHZhbHVlOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFbnRyeVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGVudHJ5VHlwZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBrZXkgPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgewotICAgIHJldHVybiBrZXk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdXJpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgdXJpID0gdmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgewotICAgIENhdGFsb2dFbnRyeSBlbnRyeSA9IChDYXRhbG9nRW50cnkpc3VwZXIuY2xvbmUoKTsKLQllbnRyeS5zZXRFbnRyeVR5cGUoZW50cnlUeXBlKTsKLSAgICBlbnRyeS5zZXRLZXkoa2V5KTsKLSAgICBlbnRyeS5zZXRVUkkodXJpKTsKLSAgICByZXR1cm4gZW50cnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYmE2NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFdmVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ2F0YWxvZ0V2ZW50IGltcGxlbWVudHMgSUNhdGFsb2dFdmVudAotewotICBwcm90ZWN0ZWQgSUNhdGFsb2cgY2F0YWxvZzsKLSAgcHJvdGVjdGVkIElDYXRhbG9nRWxlbWVudCBjYXRhbG9nRWxlbWVudDsKLSAgcHJvdGVjdGVkIGludCBldmVudFR5cGU7Ci0KLSAgcHVibGljIENhdGFsb2dFdmVudChDYXRhbG9nIGNhdGFsb2csIElDYXRhbG9nRWxlbWVudCBlbGVtZW50LCBpbnQgZXZlbnRUeXBlKQotICB7Ci0gICAgdGhpcy5jYXRhbG9nID0gY2F0YWxvZzsKLSAgICB0aGlzLmNhdGFsb2dFbGVtZW50ID0gZWxlbWVudDsKLSAgICB0aGlzLmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLSAgfQotCi0gIHB1YmxpYyBJQ2F0YWxvZyBnZXRDYXRhbG9nKCkKLSAgewotICAgIHJldHVybiBjYXRhbG9nOwotICB9Ci0KLSAgcHVibGljIElDYXRhbG9nRWxlbWVudCBnZXRDYXRhbG9nRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gY2F0YWxvZ0VsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZXZlbnRUeXBlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1M2ExNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1JlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTW9lbGxlciAtIEFkZGVkIFhNTCBDYXRhbG9ncyAxLjEgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JRGVsZWdhdGVDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklSZXdyaXRlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSVN1ZmZpeEVudHJ5OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENhdGFsb2dSZWFkZXIKLXsKLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlYWQoQ2F0YWxvZyB4bWxDYXRhbG9nLCBJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICAgIGZhY3Rvcnkuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL25vbnZhbGlkYXRpbmcvbG9hZC1leHRlcm5hbC1kdGQiLCBmYWxzZSk7Ly8kTk9OLU5MUy0xJAotICAgICAgU0FYUGFyc2VyIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGlucHV0KSwgbmV3IENhdGFsb2dDb250ZW50SGFuZGxlcih4bWxDYXRhbG9nKSk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgfQotICB9Ci0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ2F0YWxvZ0NvbnRlbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLSAgewotICAgIHByb3RlY3RlZCBDYXRhbG9nIGNhdGFsb2c7Ci0gICAgcHJvdGVjdGVkIFN0YWNrIGJhc2VVUklTdGFjayA9IG5ldyBTdGFjaygpOwotCi0gICAgcHVibGljIENhdGFsb2dDb250ZW50SGFuZGxlcihDYXRhbG9nIHhtbENhdGFsb2cpCi0gICAgewotICAgICAgdGhpcy5jYXRhbG9nID0geG1sQ2F0YWxvZzsKLSAgICAgIFN0cmluZyBiYXNlID0geG1sQ2F0YWxvZy5nZXRCYXNlKCk7Ci0gICAgICBpZihiYXNlID09IG51bGwgfHwgYmFzZSA9PSAiIikgeyAgLy8kTk9OLU5MUy0xJAotICAgIAkgIGJhc2UgPSB4bWxDYXRhbG9nLmdldExvY2F0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBiYXNlVVJJU3RhY2sucHVzaChiYXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAvLyBzZXQgYmFzZSBhdHRyaWJ1dGUgeG1sOmJhc2UKLSAgICAgIFN0cmluZyBiYXNlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9CQVNFKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGJhc2UgIT0gbnVsbCAmJiAhYmFzZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgICAgLy8gc2luY2UgdGhlIHhtbDpiYXNlIGF0dHJpYnV0ZSBjYW4gYmUgcmVsYXRpdmUgdG8gdGhlIGVuY2xvc2luZyBlbGVtZW50J3MgZWZmZWN0aXZlIGJhc2UsIHdlJ3JlIG1haW50YWluaW5nIGEKLSAgICAgICAgICAvLyBzdGFjayBvZiBhYnNvbHV0ZSBVUklzCi0JCSAgaWYgKFVSSS5jcmVhdGVVUkkoYmFzZSkuaXNSZWxhdGl2ZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJhc2UgPSBVUkkucmVzb2x2ZVJlbGF0aXZlVVJJKGJhc2UsIGJhc2VVUklTdGFjay5wZWVrKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYmFzZVVSSVN0YWNrLnB1c2goVVJJSGVscGVyLmVuc3VyZVVSSVByb3RvY29sRm9ybWF0KGJhc2UpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgCSAgYmFzZVVSSVN0YWNrLnB1c2goYmFzZVVSSVN0YWNrLnBlZWsoKSk7Ci0gICAgICB9Ci0KLQkgIC8vIHByb2Nlc3NpbmcgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgc3RhcnQKLQkgIGlmIChsb2NhbE5hbWUuZXF1YWxzKENvbXBhdGFiaWxpdHlDb25zdGFudHMuVEFHX1VTRVJfRU5UUlkpKQotICAgICAgewotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBDb21wYXRhYmlsaXR5Q29uc3RhbnRzLkFUVF9UWVBFKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBib29sZWFuIGlzU3lzdGVtID0gZmFsc2U7Ci0gICAgICAgIGlmICh0eXBlTmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgIAlpc1N5c3RlbSA9ICh0eXBlTmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKCJTWVNURU0iKSA9PSAwKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIElDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gbmV3IENhdGFsb2dFbnRyeShpc1N5c3RlbSA/IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU0gOiBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDKTsKLSAgICAgICAgY2F0YWxvZ0VudHJ5LnNldEtleShhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBDb21wYXRhYmlsaXR5Q29uc3RhbnRzLkFUVF9JRCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBlbnRyeVVyaSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIENvbXBhdGFiaWxpdHlDb25zdGFudHMuQVRUX1VSSSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIC8vIEZvciByZWxhdGl2ZSBVUklzLCB0cnkgdG8gcmVzb2x2ZSB0aGVtIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgVVJJLgotICAgICAgICBjYXRhbG9nRW50cnkuc2V0VVJJKHJlc29sdmVSZWxhdGl2ZShlbnRyeVVyaSkpOwotCi0gICAgICAgIFN0cmluZyB3ZWJVUkwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBDb21wYXRhYmlsaXR5Q29uc3RhbnRzLkFUVF9XRUJfVVJMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAod2ViVVJMICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgCWNhdGFsb2dFbnRyeS5zZXRBdHRyaWJ1dGVWYWx1ZSgKLSAgICAgICAgCQkJSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwsIHdlYlVSTCk7Ci0gICAgICAgIH0KLQkJY2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChjYXRhbG9nRW50cnkpOwotCQlyZXR1cm47Ci0gICAgICB9Ci0JICAvLyAgcHJvY2Vzc2luZyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBlbmQKLQkgIElDYXRhbG9nRWxlbWVudCBjYXRhbG9nRWxlbWVudCA9IG51bGw7Ci0KLSAgICAgIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1BVQkxJQy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAJICAvLyA2LjUuMy4gVGhlIHB1YmxpYyBFbnRyeQotICAgIAkgIGNhdGFsb2dFbGVtZW50ID0gY3JlYXRlRW50cnkoYXR0cmlidXRlcywgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQywgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUFVCTElDX0lEKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgIAkgIC8vIDYuNS40LiBUaGUgc3lzdGVtIEVsZW1lbnQKLSAgICAJICBjYXRhbG9nRWxlbWVudCA9IGNyZWF0ZUVudHJ5KGF0dHJpYnV0ZXMsIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU0sIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1NZU1RFTV9JRCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1VSSS5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAJICAvLyA2LjUuOS4gVGhlIHVyaSBFbGVtZW50Ci0gICAgCSAgY2F0YWxvZ0VsZW1lbnQgPSBjcmVhdGVFbnRyeShhdHRyaWJ1dGVzLCBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9OQU1FKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfUkVXUklURV9TWVNURU0uZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgCSAgLy8gNi41LjUuIFRoZSByZXdyaXRlU3lzdGVtIEVsZW1lbnQKLSAgICAJICBjYXRhbG9nRWxlbWVudCA9IGNyZWF0ZVJld3JpdGUoYXR0cmlidXRlcywgSVJld3JpdGVFbnRyeS5SRVdSSVRFX1RZUEVfU1lTVEVNLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSURfU1RBUlRfU1RSSU5HKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfUkVXUklURV9VUkkuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgCSAgLy8gNi41LjkuIFRoZSB1cmkgRWxlbWVudAotICAgIAkgIGNhdGFsb2dFbGVtZW50ID0gY3JlYXRlUmV3cml0ZShhdHRyaWJ1dGVzLCBJUmV3cml0ZUVudHJ5LlJFV1JJVEVfVFlQRV9VUkksIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSV9TVEFSVF9TVFJJTkcpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19ERUxFR0FURV9QVUJMSUMuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgCSAgLy8gNi41LjcuIFRoZSBkZWxlZ2F0ZVB1YmxpYyBFbGVtZW50Ci0gICAgCSAgY2F0YWxvZ0VsZW1lbnQgPSBjcmVhdGVEZWxlZ2F0ZShhdHRyaWJ1dGVzLCBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfUFVCTElDLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9QVUJMSUNfSURfU1RBUlRfU1RSSU5HKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfREVMRUdBVEVfU1lTVEVNLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgIAkgIC8vIDYuNS44LiBUaGUgZGVsZWdhdGVTeXN0ZW0gRWxlbWVudAotICAgIAkgIGNhdGFsb2dFbGVtZW50ID0gY3JlYXRlRGVsZWdhdGUoYXR0cmlidXRlcywgSURlbGVnYXRlQ2F0YWxvZy5ERUxFR0FURV9UWVBFX1NZU1RFTSwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfU1lTVEVNX0lEX1NUQVJUX1NUUklORyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX0RFTEVHQVRFX1VSSS5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAJICAvLyA2LjUuMTIuIFRoZSBkZWxlZ2F0ZVVSSSBFbGVtZW50Ci0gICAgCSAgY2F0YWxvZ0VsZW1lbnQgPSBjcmVhdGVEZWxlZ2F0ZShhdHRyaWJ1dGVzLCBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfVVJJLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUklfU1RBUlRfU1RSSU5HKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNX1NVRkZJWC5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAJICAvLyA2LjUuNi4gVGhlIHN5c3RlbVN1ZmZpeCBFbGVtZW50Ci0gICAgCSAgY2F0YWxvZ0VsZW1lbnQgPSBjcmVhdGVTdWZmaXgoYXR0cmlidXRlcywgSVN1ZmZpeEVudHJ5LlNVRkZJWF9UWVBFX1NZU1RFTSwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfU1lTVEVNX0lEX1NVRkZGSVgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19VUklfU1VGRklYLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgIAkgIC8vIDYuNS4xMS4gVGhlIHVyaVN1ZmZpeCBFbGVtZW50Ci0gICAgCSAgY2F0YWxvZ0VsZW1lbnQgPSBjcmVhdGVTdWZmaXgoYXR0cmlidXRlcywgSVN1ZmZpeEVudHJ5LlNVRkZJWF9UWVBFX1VSSSwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJX1NVRkZJWCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX05FWFRfQ0FUQUxPRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgY2F0YWxvZ0VsZW1lbnQgPSBjcmVhdGVOZXh0Q2F0YWxvZyhhdHRyaWJ1dGVzKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGNhdGFsb2dFbGVtZW50ID09IG51bGwpCi0gICAgICB7Ci0gICAgCS8vIGRvIG5vdCBzZXQgdGhlIGV4dHJhIGluZm9ybWF0aW9uCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotCSAgU3RyaW5nIGF0dHJJZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0lEKTsvLyROT04tTkxTLTEkCi0JICBpZiAoYXR0cklkICE9IG51bGwgJiYgISAiIi5lcXVhbHMoYXR0cklkKSkgY2F0YWxvZ0VsZW1lbnQuc2V0SWQoYXR0cklkKTsvLyROT04tTkxTLTEkCi0gICAgICAvLyBwcm9jZXNzIGFueSBvdGhlciBhdHRyaWJ1dGVzCi0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGorKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaik7Ci0gICAgICAgIGlmICghYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSkgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9OQU1FKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1BVQkxJQ19JRCkKLSAgICAgICAgICAgICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfU1lTVEVNX0lEKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0cpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQpCi0gICAgICAgICAgICAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0JBU0UpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoYXR0ck5hbWUpOwotICAgICAgICAgIGlmIChhdHRyVmFsdWUgIT0gbnVsbCAmJiAhYXR0clZhbHVlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXRhbG9nRWxlbWVudC5zZXRBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZSwgYXR0clZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGFsb2cuYWRkQ2F0YWxvZ0VsZW1lbnQoY2F0YWxvZ0VsZW1lbnQpOwotCi0gICAgfQotCi0JcHJpdmF0ZSBJQ2F0YWxvZ0VsZW1lbnQgY3JlYXRlTmV4dENhdGFsb2coQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0cpOyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIE5leHRDYXRhbG9nIGRlbGVnYXRlID0gbmV3IE5leHRDYXRhbG9nKCk7Ci0gICAgICAgIGRlbGVnYXRlLnNldEJhc2UoKFN0cmluZyliYXNlVVJJU3RhY2sucGVlaygpKTsKLSAgICAgICAgZGVsZWdhdGUuc2V0Q2F0YWxvZ0xvY2F0aW9uKGxvY2F0aW9uKTsgIAotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0gICAgcHJpdmF0ZSBJQ2F0YWxvZ0VudHJ5IGNyZWF0ZUVudHJ5KEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgaW50IGVudHJ5VHlwZSwgU3RyaW5nIGtleUF0dHJpYnV0ZU5hbWUpIHsKLSAgICAJU3RyaW5nIGtleSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIGtleUF0dHJpYnV0ZU5hbWUpOyAvLyROT04tTkxTLTEkCi0gICAgCWlmIChrZXkgPT0gbnVsbCB8fCBrZXkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgIAl7Ci0gICAgCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfZW50cnlfa2V5X25vdF9zZXQpOwotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAJU3RyaW5nIGVudHJ5VVJJID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJKTsgLy8kTk9OLU5MUy0xJAotICAgIAlpZiAoZW50cnlVUkkgPT0gbnVsbCB8fCBlbnRyeVVSSS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgCXsKLSAgICAJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19lbnRyeV91cmlfbm90X3NldCk7Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIAlDYXRhbG9nRW50cnkgZW50cnkgPSBuZXcgQ2F0YWxvZ0VudHJ5KGVudHJ5VHlwZSk7Ci0gICAgCWVudHJ5LnNldEtleShrZXkpOwotICAgIAllbnRyeS5zZXRVUkkocmVzb2x2ZVJlbGF0aXZlKGVudHJ5VVJJKSk7Ci0gICAgCXJldHVybiBlbnRyeTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElSZXdyaXRlRW50cnkgY3JlYXRlUmV3cml0ZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIGludCBlbnRyeVR5cGUsIFN0cmluZyBwcmVmaXhTdHJpbmdOYW1lKSB7Ci0gICAgCVN0cmluZyBzdGFydFN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIHByZWZpeFN0cmluZ05hbWUpOyAvLyROT04tTkxTLTEkCi0gICAgCWlmIChzdGFydFN0cmluZyA9PSBudWxsIHx8IHN0YXJ0U3RyaW5nLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAJewotICAgIAkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX3Jld3JpdGVfc3RhcnRTdHJpbmdfbm90X3NldCk7Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIAlTdHJpbmcgcHJlZml4ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUkVXUklURV9QUkVGSVgpOyAvLyROT04tTkxTLTEkCi0gICAgCWlmIChwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXguZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgIAl7Ci0gICAgCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfcmV3cml0ZV9wcmVmaXhfbm90X3NldCk7Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIAlSZXdyaXRlRW50cnkgZW50cnkgPSBuZXcgUmV3cml0ZUVudHJ5KGVudHJ5VHlwZSk7Ci0gICAgCWVudHJ5LnNldFN0YXJ0U3RyaW5nKHN0YXJ0U3RyaW5nKTsKLSAgICAJZW50cnkuc2V0UmV3cml0ZVByZWZpeChyZXNvbHZlUmVsYXRpdmUocHJlZml4KSk7Ci0gICAgCXJldHVybiBlbnRyeTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElEZWxlZ2F0ZUNhdGFsb2cgY3JlYXRlRGVsZWdhdGUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBpbnQgZW50cnlUeXBlLCBTdHJpbmcgc3RhcnRTdHJpbmdBdHRyTmFtZSkgewotICAgIAlTdHJpbmcgc3RhcnRTdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBzdGFydFN0cmluZ0F0dHJOYW1lKTsgLy8kTk9OLU5MUy0xJAotICAgIAlpZiAoc3RhcnRTdHJpbmcgPT0gbnVsbCB8fCBzdGFydFN0cmluZy5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgCXsKLSAgICAJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19kZWxlZ2F0ZV9wcmVmaXhfbm90X3NldCk7Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIAlTdHJpbmcgY2F0YWxvZ1VyaSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0cpOyAvLyROT04tTkxTLTEkCi0gICAgCWlmIChjYXRhbG9nVXJpID09IG51bGwgfHwgY2F0YWxvZ1VyaS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgCXsKLSAgICAJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19kZWxlZ2F0ZV9wcmVmaXhfbm90X3NldCk7Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIAlEZWxlZ2F0ZUNhdGFsb2cgZW50cnkgPSBuZXcgRGVsZWdhdGVDYXRhbG9nKGVudHJ5VHlwZSk7Ci0gICAgCWVudHJ5LnNldFN0YXJ0U3RyaW5nKHN0YXJ0U3RyaW5nKTsKLSAgICAJZW50cnkuc2V0Q2F0YWxvZ0xvY2F0aW9uKGNhdGFsb2dVcmkpOwotICAgIAlyZXR1cm4gZW50cnk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3VmZml4RW50cnkgY3JlYXRlU3VmZml4KEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgaW50IGVudHJ5VHlwZSwgU3RyaW5nIHN1ZmZpeEF0dHJOYW1lKSB7Ci0gICAgCVN0cmluZyBzdWZmaXggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBzdWZmaXhBdHRyTmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAJaWYgKHN1ZmZpeCA9PSBudWxsIHx8IHN1ZmZpeC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgCXsKLSAgICAJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19zdWZmaXhfc3RyaW5nX25vdF9zZXQpOwotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAJU3RyaW5nIHVyaSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSk7IC8vJE5PTi1OTFMtMSQKLSAgICAJaWYgKHVyaSA9PSBudWxsIHx8IHVyaS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgCXsKLSAgICAJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19zdWZmaXhfdXJpX25vdF9zZXQpOwotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAJU3VmZml4RW50cnkgZW50cnkgPSBuZXcgU3VmZml4RW50cnkoZW50cnlUeXBlKTsKLSAgICAJZW50cnkuc2V0U3VmZml4KHN1ZmZpeCk7Ci0gICAgCWVudHJ5LnNldFVSSShyZXNvbHZlUmVsYXRpdmUodXJpKSk7Ci0gICAgCXJldHVybiBlbnRyeTsKLSAgICB9Ci0KLQlwcml2YXRlIFN0cmluZyByZXNvbHZlUmVsYXRpdmUoU3RyaW5nIGVudHJ5VVJJKSAKLQl7Ci0JCWlmKFVSSS5jcmVhdGVVUkkoZW50cnlVUkkpLmlzUmVsYXRpdmUoKSkgCi0JCXsKLSAgICAgICAgCWVudHJ5VVJJID0gVVJJLnJlc29sdmVSZWxhdGl2ZVVSSShlbnRyeVVSSSwgYmFzZVVSSVN0YWNrLnBlZWsoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCQlyZXR1cm4gVVJJSGVscGVyLmVuc3VyZVVSSVByb3RvY29sRm9ybWF0KGVudHJ5VVJJKTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChiYXNlVVJJU3RhY2suc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgYmFzZVVSSVN0YWNrLnBvcCgpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgfSAgCi0gIAotICAvLyBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eQotICBpbnRlcmZhY2UgQ29tcGF0YWJpbGl0eUNvbnN0YW50c3sKLQkgIAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEX1hNTF9DQVRBTE9HX1NFVFRJTkdTID0gIlhNTENhdGFsb2dTZXR0aW5ncyI7IC8vJE5PTi1OTFMtMSQKLQkgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRF9VU0VSX0VOVFJJRVMgPSAiVXNlckVudHJpZXMiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVVNFUl9FTlRSWSA9ICJVc2VyRW50cnkiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRSA9ICJUWVBFIjsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gIklEIjsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1VSSSA9ICJVUkkiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfV0VCX1VSTCA9ICJXRUJfVVJMIjsgLy8kTk9OLU5MUy0xJAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nU2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZmJkMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ2F0YWxvZ1NldCB7Ci0JcHJvdGVjdGVkIE1hcCB1cmlSZXNvdXJjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIE1hcCBjYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCXB1YmxpYyBDYXRhbG9nU2V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEZpbmQgYSBDYXRhbG9nIHdpdGggdGhlIGdpdmVuIElELiAgSWYgb25lIGlzIG5vdCBmb3VuZCwgY3JlYXRlIG9uZSBhdCB0aGUgZ2l2ZW4gVVJJLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSB1cmkgLSB0aGUgVVJJLCB0aGUgcGFyZW50IG9mIHRoaXMgZmlsZSBwYXRoIG11c3QgYWxyZWFkeSBleGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ2F0YWxvZyBsb29rdXBPckNyZWF0ZUNhdGFsb2coU3RyaW5nIGlkLCBTdHJpbmcgdXJpKSB7Ci0JCUNhdGFsb2cgY2F0YWxvZyA9IGdldENhdGFsb2coaWQsIHVyaSk7Ci0JCWlmIChjYXRhbG9nID09IG51bGwpIHsKLQkJCWNhdGFsb2cgPSBuZXcgQ2F0YWxvZyh0aGlzLCBpZCwgdXJpKTsKLQkJCXRyeSB7Ci0JCQkJY2F0YWxvZy5sb2FkKCk7Ci0JCQkJdXJpUmVzb3VyY2VNYXAucHV0KHVyaSwgY2F0YWxvZyk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB3ZSBjYXRjaCBhbmQgbG9nIGFsbCBleGNlcHRpb25zLCB0byBkaXNhbGxvdwotCQkJCS8vIG9uZSBiYWQgZXh0ZW5zaW9uIGludGVyZmVyaW5nIHdpdGggb3RoZXJzCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXJyb3IgbG9hZGluZyBjYXRhbG9nOiAiICsgaWQgKyAiICIgKyB1cmksIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2F0YWxvZzsKLQl9Ci0KLQlwcml2YXRlIENhdGFsb2cgZ2V0Q2F0YWxvZyhTdHJpbmcgaWQsIFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIChDYXRhbG9nKSB1cmlSZXNvdXJjZU1hcC5nZXQodXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXRDYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbihTdHJpbmcgbG9naWNhbFVSSSwgU3RyaW5nIGFjdHVhbFVSSSkgewotCQljYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbnMucHV0KGxvZ2ljYWxVUkksIGFjdHVhbFVSSSk7Ci0JfQotCi0JLy8gTmV2ZXIgdXNlZD8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dQZXJzaXN0ZW5jZUxvY2F0aW9uKFN0cmluZyBpZCkgewotCQlyZXR1cm4gKFN0cmluZykgY2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb25zLmdldChpZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1dyaXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1dyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQ1MTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JRGVsZWdhdGVDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JUmV3cml0ZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklTdWZmaXhFbnRyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFdyaXRlIE9BU0lTIFhNTCBDYXRhbG9nIGZvcm1hdAotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDYXRhbG9nV3JpdGVyCi17Ci0gIHByaXZhdGUgRG9jdW1lbnQgZG9jOwotCi0gIHB1YmxpYyB2b2lkIHdyaXRlKElDYXRhbG9nIHhtbENhdGFsb2csIFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLQlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQl0cnkgewotICAgICAgdmlzaXRDYXRhbG9nKHhtbENhdGFsb2cpOwotICAgICAgb3V0cHV0U3RyZWFtID0gZ2V0T3V0cHV0U3RyZWFtKHVyaSk7Ci0gICAgICBzZXJpYWxpemUob3V0cHV0U3RyZWFtKTsKLQl9Ci0JZmluYWxseSB7Ci0JICBpZihvdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotCQlvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQkgIH0KLQl9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZShJQ2F0YWxvZyBjYXRhbG9nLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoY2F0YWxvZyAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0Q2F0YWxvZyhjYXRhbG9nKTsKLSAgICAgIHNlcmlhbGl6ZShvcyk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHZpc2l0Q2F0YWxvZyhJQ2F0YWxvZyB4bWxDYXRhbG9nKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZG9jID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICB9Ci0gICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIEVsZW1lbnQgY2F0YWxvZ0VsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5uYW1lc3BhY2VOYW1lLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX0NBVEFMT0cpOwotICAgIGRvYy5hcHBlbmRDaGlsZChjYXRhbG9nRWxlbWVudCk7Ci0gICAgcHJvY2Vzc0NhdGFsb2dFbnRyaWVzKHhtbENhdGFsb2csIGNhdGFsb2dFbGVtZW50KTsKLSAgICBwcm9jZXNzTmV4dENhdGFsb2dzKHhtbENhdGFsb2csIGNhdGFsb2dFbGVtZW50KTsKLSAgICBwcm9jZXNzRGVsZWdhdGVDYXRhbG9ncyh4bWxDYXRhbG9nLCBjYXRhbG9nRWxlbWVudCk7Ci0gICAgcHJvY2Vzc1N1ZmZpeEVudHJpZXMoeG1sQ2F0YWxvZywgY2F0YWxvZ0VsZW1lbnQpOwotICAgIHByb2Nlc3NSZXdyaXRlRW50cmllcyh4bWxDYXRhbG9nLCBjYXRhbG9nRWxlbWVudCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJvY2Vzc1Jld3JpdGVFbnRyaWVzKElDYXRhbG9nIGNhdGFsb2csIEVsZW1lbnQgcGFyZW50KQotICB7Ci0gICAgSVJld3JpdGVFbnRyeVtdIGNhdGFsb2dFbnRyaWVzID0gY2F0YWxvZy5nZXRSZXdyaXRlRW50cmllcygpOwotICAgIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2F0YWxvZ0VudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVJld3JpdGVFbnRyeSBlbnRyeSA9IGNhdGFsb2dFbnRyaWVzW2ldOwotICAgICAgU3RyaW5nIHN0YXJ0U3RyaW5nID0gZW50cnkuZ2V0U3RhcnRTdHJpbmcoKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBlbnRyeS5nZXRSZXdyaXRlUHJlZml4KCk7Ci0JICBFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0JIAotICAgICBzd2l0Y2ggKGVudHJ5LmdldEVudHJ5VHlwZSgpKQotICAgICAgewotICAgICAgICBjYXNlIElSZXdyaXRlRW50cnkuUkVXUklURV9UWVBFX1NZU1RFTSA6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfUkVXUklURV9TWVNURU0pOwotICAgICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1NZU1RFTV9JRF9TVEFSVF9TVFJJTkcsIHN0YXJ0U3RyaW5nKTsKLSAgICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUkVXUklURV9QUkVGSVgsIHByZWZpeCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElSZXdyaXRlRW50cnkuUkVXUklURV9UWVBFX1VSSToKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19SRVdSSVRFX1VSSSk7Ci0gICAgICAgICAgaWYgKGNoaWxkRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLQkgICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSV9TVEFSVF9TVFJJTkcsIHN0YXJ0U3RyaW5nKTsKLQkgICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1JFV1JJVEVfUFJFRklYLCBwcmVmaXgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNldEF0dHJpYnV0ZXMoZW50cnksIGNoaWxkRWxlbWVudCk7Ci0gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjaGlsZEVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzU3VmZml4RW50cmllcyhJQ2F0YWxvZyBjYXRhbG9nLCBFbGVtZW50IHBhcmVudCkKLSAgewotICAgIElTdWZmaXhFbnRyeVtdIHN1ZmZpeEVudHJpZXMgPSBjYXRhbG9nLmdldFN1ZmZpeEVudHJpZXMoKTsKLSAgICAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1ZmZpeEVudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVN1ZmZpeEVudHJ5IGVudHJ5ID0gc3VmZml4RW50cmllc1tpXTsKLSAgICAgIFN0cmluZyBzdWZmaXhTdHJpbmcgPSBlbnRyeS5nZXRTdWZmaXgoKTsKLSAgICAgIFN0cmluZyB1cmkgPSBlbnRyeS5nZXRVUkkoKTsKLQkgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLQkgCi0gICAgIHN3aXRjaCAoZW50cnkuZ2V0RW50cnlUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgSVN1ZmZpeEVudHJ5LlNVRkZJWF9UWVBFX1NZU1RFTSA6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNX1NVRkZJWCk7Ci0gICAgICAgICAgaWYgKGNoaWxkRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfU1lTVEVNX0lEX1NVRkZGSVgsIHN1ZmZpeFN0cmluZyk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSVN1ZmZpeEVudHJ5LlNVRkZJWF9UWVBFX1VSSToKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19VUklfU1VGRklYKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotCSAgICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJX1NVRkZJWCwgc3VmZml4U3RyaW5nKTsKLQkgICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKGNoaWxkRWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzZXRBdHRyaWJ1dGVzKGVudHJ5LCBjaGlsZEVsZW1lbnQpOwotICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJvY2Vzc0RlbGVnYXRlQ2F0YWxvZ3MoSUNhdGFsb2cgY2F0YWxvZywgRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICBJRGVsZWdhdGVDYXRhbG9nW10gZGVsZWdhdGVDYXRhbG9ncyA9IGNhdGFsb2cuZ2V0RGVsZWdhdGVDYXRhbG9ncygpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWxlZ2F0ZUNhdGFsb2dzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElEZWxlZ2F0ZUNhdGFsb2cgZW50cnkgPSBkZWxlZ2F0ZUNhdGFsb2dzW2ldOwotICAgICAgU3RyaW5nIHByZWZpeFN0cmluZyA9IGVudHJ5LmdldFN0YXJ0U3RyaW5nKCk7Ci0gICAgICBTdHJpbmcgY2F0YWxvZ0xvY2F0aW9uID0gZW50cnkuZ2V0Q2F0YWxvZ0xvY2F0aW9uKCk7Ci0gICAgICBFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0KLSAgICAgIHN3aXRjaCAoZW50cnkuZ2V0RW50cnlUeXBlKCkpCi0gICAgICB7Ci0gICAgICBjYXNlIElEZWxlZ2F0ZUNhdGFsb2cuREVMRUdBVEVfVFlQRV9QVUJMSUM6Ci0gICAgICAgIGNoaWxkRWxlbWVudCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX0RFTEVHQVRFX1BVQkxJQyk7Ci0gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUFVCTElDX0lEX1NUQVJUX1NUUklORywgcHJlZml4U3RyaW5nKTsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0csIGNhdGFsb2dMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElEZWxlZ2F0ZUNhdGFsb2cuREVMRUdBVEVfVFlQRV9TWVNURU06Ci0gICAgICAgIGNoaWxkRWxlbWVudCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX0RFTEVHQVRFX1NZU1RFTSk7Ci0gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfU1lTVEVNX0lEX1NUQVJUX1NUUklORywgcHJlZml4U3RyaW5nKTsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0csIGNhdGFsb2dMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElEZWxlZ2F0ZUNhdGFsb2cuREVMRUdBVEVfVFlQRV9VUkk6Ci0gICAgICAgIGNoaWxkRWxlbWVudCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX0RFTEVHQVRFX1VSSSk7Ci0gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJX1NUQVJUX1NUUklORywgcHJlZml4U3RyaW5nKTsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0csIGNhdGFsb2dMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNldEF0dHJpYnV0ZXMoZW50cnksIGNoaWxkRWxlbWVudCk7Ci0gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjaGlsZEVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzQ2F0YWxvZ0VudHJpZXMoSUNhdGFsb2cgY2F0YWxvZywgRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICBJQ2F0YWxvZ0VudHJ5W10gY2F0YWxvZ0VudHJpZXMgPSBjYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0gIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2F0YWxvZ0VudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGNhdGFsb2dFbnRyaWVzW2ldOwotICAgICAgU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgU3RyaW5nIHVyaSA9IGVudHJ5LmdldFVSSSgpOwotICAgICAgRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBudWxsOwotCSAKLSAgICAgIHN3aXRjaCAoZW50cnkuZ2V0RW50cnlUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQyA6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfUFVCTElDKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9QVUJMSUNfSUQsIGtleSk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSA6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQsIGtleSk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSSA6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfVVJJKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9OQU1FLCBrZXkpOwotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkksIHVyaSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAJICBzZXRBdHRyaWJ1dGVzKGVudHJ5LCBjaGlsZEVsZW1lbnQpOwotICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0QXR0cmlidXRlcyhJQ2F0YWxvZ0VsZW1lbnQgZW50cnksIEVsZW1lbnQgY2hpbGRFbGVtZW50KQotICB7Ci0gICAgU3RyaW5nW10gYXR0cmlidXRlcyA9IGVudHJ5LmdldEF0dHJpYnV0ZXMoKTsgICAKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspCi0gICAgewotICAgICAgU3RyaW5nIGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXTsKLSAgICAgIGlmIChhdHRyTmFtZSAhPSBudWxsICYmICFhdHRyTmFtZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBlbnRyeS5nZXRBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZSk7Ci0gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCAmJiBhdHRyVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgU3RyaW5nIGlkID0gZW50cnkuZ2V0SWQoKTsKLSAgICBpZiAoaWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0lELCBpZCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NOZXh0Q2F0YWxvZ3MoSUNhdGFsb2cgY2F0YWxvZywgRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICAvLyBoYW5kbGUgY2F0YWxvZyBlbnRyaWVzCi0gICAgSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gY2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLSAgICBFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAvL2R3IFN0cmluZyBhdHRyVmFsdWUgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElOZXh0Q2F0YWxvZyBkZWxlZ2F0ZSA9IG5leHRDYXRhbG9nc1tpXTsKLSAgICAgIGNoaWxkRWxlbWVudCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX05FWFRfQ0FUQUxPRyk7Ci0gICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjaGlsZEVsZW1lbnQpOwotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBkZWxlZ2F0ZS5nZXRDYXRhbG9nTG9jYXRpb24oKTsKLSAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0csIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBzZXRBdHRyaWJ1dGVzKGRlbGVnYXRlLCBjaGlsZEVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgLy8gVW5sZXNzIGEgd2lkdGggaXMgc2V0LCB0aGVyZSB3aWxsIGJlIG9ubHkgbGluZSBicmVha3MgYnV0IG5vCi0gICAgICAvLyBpbmRlbnRhdGlvbi4KLSAgICAgIC8vIFRoZSBJQk0gSkRLIGFuZCB0aGUgU3VuIEpESyBkb24ndCBhZ3JlZSBvbiB0aGUgcHJvcGVydHkgbmFtZSwKLSAgICAgIC8vIHNvIHdlIHNldCB0aGVtIGJvdGguCi0gICAgICAvLwotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW59aW5kZW50LWFtb3VudCIsICIyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBTdHJpbmcgZW5jb2RpbmcgPSAiVVRGLTgiOyAvLyBUQkQgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsIGVuY29kaW5nKTsKLSAgICAgIH0KLSAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvYyksIG5ldyBTdHJlYW1SZXN1bHQob3V0cHV0U3RyZWFtKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgZmlsZVBhdGggPSByZW1vdmVQcm90b2NvbCh1cmkpOwotICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKLSAgICBPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0gICAgcmV0dXJuIHN0cmVhbTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcmVtb3ZlUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSB1cmk7ICAKLSAgICBTdHJpbmcgcHJvdG9jb2xfcGF0dGVybiA9ICI6IjsgLy8kTk9OLU5MUy0xJAotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZihwcm90b2NvbF9wYXR0ZXJuKTsKLSAgICAgIGlmIChpbmRleCA+IDIpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoaW5kZXggKyBwcm90b2NvbF9wYXR0ZXJuLmxlbmd0aCgpKTsgICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9EZWxlZ2F0ZUNhdGFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0RlbGVnYXRlQ2F0YWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2U3MjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0RlbGVnYXRlQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBKZXNwZXIgU3RlZW4gTW9lbGxlcgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSmVzcGVyIFN0ZWVuIE1vZWxsZXIgLSBBZGRlZCBYTUwgQ2F0YWxvZ3MgMS4xIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JRGVsZWdhdGVDYXRhbG9nOwotCi0KLQotcHVibGljIGNsYXNzIERlbGVnYXRlQ2F0YWxvZyBleHRlbmRzIFR5cGVkQ2F0YWxvZ0VsZW1lbnQgaW1wbGVtZW50cyBJRGVsZWdhdGVDYXRhbG9nCi17Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotICBwcml2YXRlIElDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nOwotICBwcml2YXRlIFN0cmluZyBzdGFydFN0cmluZzsgCi0KLSAgcHVibGljIFN0cmluZyBnZXRTdGFydFN0cmluZygpIAotICB7Ci0gICAgcmV0dXJuIHN0YXJ0U3RyaW5nOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U3RhcnRTdHJpbmcoU3RyaW5nIHN0YXJ0U3RyaW5nKSAKLSAgewotICAgIHRoaXMuc3RhcnRTdHJpbmcgPSBzdGFydFN0cmluZzsKLSAgfQotCi0gIHB1YmxpYyBEZWxlZ2F0ZUNhdGFsb2coaW50IHR5cGUpCi0gIHsKLSAgICBzdXBlcihJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ERUxFR0FURSwgdHlwZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbG9jYXRpb247Ci0gIH0KLQotICBwdWJsaWMgSUNhdGFsb2cgZ2V0UmVmZXJlbmNlZENhdGFsb2coKQotICB7Ci0gICAgaWYgKHJlZmVyZW5jZWRDYXRhbG9nID09IG51bGwpCi0gICAgewotICAgICAgcmVmZXJlbmNlZENhdGFsb2cgPSAoKENhdGFsb2cpb3duZXJDYXRhbG9nKS5nZXRDYXRhbG9nU2V0KCkubG9va3VwT3JDcmVhdGVDYXRhbG9nKGdldElkKCksIGdldEFic29sdXRlUGF0aChsb2NhdGlvbikpOwotICAgIH0KLSAgICByZXR1cm4gcmVmZXJlbmNlZENhdGFsb2c7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDYXRhbG9nTG9jYXRpb24oU3RyaW5nIHVyaSkKLSAgewotICAgIGxvY2F0aW9uID0gdXJpOwotICAgIHJlZmVyZW5jZWRDYXRhbG9nID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICB7Ci0gICAgRGVsZWdhdGVDYXRhbG9nIG5leHRDYXRhbG9nID0gKERlbGVnYXRlQ2F0YWxvZylzdXBlci5jbG9uZSgpOwotICAgIG5leHRDYXRhbG9nLnNldENhdGFsb2dMb2NhdGlvbihsb2NhdGlvbik7Ci0gICAgbmV4dENhdGFsb2cuc2V0U3RhcnRTdHJpbmcoc3RhcnRTdHJpbmcpOwotICAgIHJldHVybiBuZXh0Q2F0YWxvZzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvTmV4dENhdGFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL05leHRDYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Zjc1NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvTmV4dENhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBSYWogTWFuZGF5YW0sIElCTQotICogICAgICAgICAgIDEzNjQwMCBOZXh0Q2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpIHRha2VzIGEgbG90IG9mIHRpbWUgY29tcHV0aW5nIGNvbnN0YW50IGluZm9ybWF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotCi0KLQotcHVibGljIGNsYXNzIE5leHRDYXRhbG9nIGV4dGVuZHMgQ2F0YWxvZ0VsZW1lbnQgaW1wbGVtZW50cyBJTmV4dENhdGFsb2cKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0gIHByaXZhdGUgSUNhdGFsb2cgcmVmZXJlbmNlZENhdGFsb2c7Ci0KLSAgcHVibGljIE5leHRDYXRhbG9nKCkKLSAgewotICAgIHN1cGVyKElDYXRhbG9nRWxlbWVudC5UWVBFX05FWFRfQ0FUQUxPRyk7Ci0gIH0KLSAgICAKLSAgcHVibGljIFN0cmluZyBnZXRDYXRhbG9nTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIElDYXRhbG9nIGdldFJlZmVyZW5jZWRDYXRhbG9nKCkKLSAgewotICAgIGlmIChyZWZlcmVuY2VkQ2F0YWxvZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlZmVyZW5jZWRDYXRhbG9nID0gKChDYXRhbG9nKW93bmVyQ2F0YWxvZykuZ2V0Q2F0YWxvZ1NldCgpLmxvb2t1cE9yQ3JlYXRlQ2F0YWxvZyhnZXRJZCgpLCBnZXRBYnNvbHV0ZVBhdGgobG9jYXRpb24pKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlZmVyZW5jZWRDYXRhbG9nOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0xvY2F0aW9uKFN0cmluZyB1cmkpCi0gIHsKLSAgICBsb2NhdGlvbiA9IHVyaTsKLSAgICByZWZlcmVuY2VkQ2F0YWxvZyA9IG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICB7Ci0JTmV4dENhdGFsb2cgbmV4dENhdGFsb2cgPSAoTmV4dENhdGFsb2cpc3VwZXIuY2xvbmUoKTsKLQluZXh0Q2F0YWxvZy5zZXRDYXRhbG9nTG9jYXRpb24obG9jYXRpb24pOwotICAgIHJldHVybiBuZXh0Q2F0YWxvZzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvT0FTSVNDYXRhbG9nQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9PQVNJU0NhdGFsb2dDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxNmE2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9PQVNJU0NhdGFsb2dDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTW9lbGxlciAtIEFkZGVkIFhNTCBDYXRhbG9ncyAxLjEgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1wdWJsaWMgaW50ZXJmYWNlIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cwotewotICBTdHJpbmcgbmFtZXNwYWNlTmFtZSA9ICJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVHlwZXMgb2YgdGhlIGNhdGFsb2cgZW50cmllcyAqLwotICAvKiogVGhlIENBVEFMT0cgZWxlbWVudCBuYW1lLiAqLwotICBTdHJpbmcgVEFHX0NBVEFMT0cgPSAiY2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBHUk9VUCBjYXRhbG9nIGVudHJ5LiAqLwotICBTdHJpbmcgVEFHX0dST1VQID0gImdyb3VwIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIFBVQkxJQyBjYXRhbG9nIGVudHJ5LiAqLwotICBTdHJpbmcgVEFHX1BVQkxJQyA9ICJwdWJsaWMiOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgU1lTVEVNIGNhdGFsb2cgZXRucnkuICovCi0gIFN0cmluZyBUQUdfU1lTVEVNID0gInN5c3RlbSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBVUkkgY2F0YWxvZyBlbnRyeS4gKi8KLSAgU3RyaW5nIFRBR19VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIFJFV1JJVEVfU1lTVEVNIGNhdGFsb2cgZW50cnkuICovCi0gIFN0cmluZyBUQUdfUkVXUklURV9TWVNURU0gPSAicmV3cml0ZVN5c3RlbSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBSRVdSSVRFX1VSSSBjYXRhbG9nIGVudHJ5LiAqLwotICBTdHJpbmcgVEFHX1JFV1JJVEVfVVJJID0gInJld3JpdGVVUkkiOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgc3lzdGVtU3VmZml4IGNhdGFsb2cgZW50cnkuICovCi0gIFN0cmluZyBUQUdfU1lTVEVNX1NVRkZJWCA9ICJzeXN0ZW1TdWZmaXgiOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgdXJpU3VmZml4IGNhdGFsb2cgZW50cnkuICovCi0gIFN0cmluZyBUQUdfVVJJX1NVRkZJWCA9ICJ1cmlTdWZmaXgiOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgREVMRUdBVEVfUFVCTElDIGNhdGFsb2cgZW50cnkuICovCi0gIFN0cmluZyBUQUdfREVMRUdBVEVfUFVCTElDID0gImRlbGVnYXRlUHVibGljIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIERFTEVHQVRFX1NZU1RFTSBjYXRhbG9nIGVudHJ5LiAqLwotICBTdHJpbmcgVEFHX0RFTEVHQVRFX1NZU1RFTSA9ICJkZWxlZ2F0ZVN5c3RlbSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBERUxFR0FURV9VUkkgY2F0YWxvZyBlbnRyeS4gKi8KLSAgU3RyaW5nIFRBR19ERUxFR0FURV9VUkkgPSAiZGVsZWdhdGVVUkkiOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgTkVYVF9DQVRBTE9HIGNhdGFsb2cgZW50cnkuICovCi0gIFN0cmluZyBUQUdfTkVYVF9DQVRBTE9HID0gIm5leHRDYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAvKiogQXR0cmlidXRlcyAqLwotICAvKiogQXR0cmlidXRlIGlkIHVzZWQgaW4gYWxsIGNhdGFsb2cgZW50cmllcyAqLwotICBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIEF0dHJpYnV0ZSBpZCBiYXNlIGluIGFsbCBjYXRhbG9nIGVudHJpZXMgKi8KLSAgU3RyaW5nIEFUVFJfQkFTRSA9ICJ4bWw6YmFzZSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIEF0dHJpYnV0ZSBpZCBwcmVmZXIgaW4gY2F0YWxvZyBlbnRyaWVzOiBDQVRBTE9HLCBHUk9VUCAqLwotICBTdHJpbmcgQVRUUl9QUkVGRVJFID0gInByZWZlciI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBQVUJMSUMgKi8KLSAgU3RyaW5nIEFUVFJfUFVCTElDX0lEID0gInB1YmxpY0lkIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFNZU1RFTQotICAgKi8KLSAgU3RyaW5nIEFUVFJfU1lTVEVNX0lEID0gInN5c3RlbUlkIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFNZU1RFTV9TVUZGSVgKLSAgICovCi0gIFN0cmluZyBBVFRSX1NZU1RFTV9JRF9TVUZGRklYID0gInN5c3RlbUlkU3VmZml4IjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFVSSQotICAgKi8KLSAgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFBVQkxJQywgVVJJCi0gICAqLwotICBTdHJpbmcgQVRUUl9VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFVSSV9TVUZGSVgKLSAgICovCi0gIFN0cmluZyBBVFRSX1VSSV9TVUZGSVggPSAidXJpU3VmZml4IjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFJFV1JJVEVfU1lTVEVNLCBERUxFR0FURV9TWVNURU0KLSAgICovCi0gIFN0cmluZyBBVFRSX1NZU1RFTV9JRF9TVEFSVF9TVFJJTkcgPSAic3lzdGVtSWRTdGFydFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBSRVdSSVRFX1NZU1RFTSwgUkVXUklURV9VUkkKLSAgICovCi0gIFN0cmluZyBBVFRSX1JFV1JJVEVfUFJFRklYID0gInJld3JpdGVQcmVmaXgiOyAvLyROT04tTkxTLTEkCi0gIC8qKgotICAgKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogREVMRUdBVEVfUFVCTElDCi0gICAqLwotICBTdHJpbmcgQVRUUl9QVUJMSUNfSURfU1RBUlRfU1RSSU5HID0gInB1YmxpY0lkU3RhcnRTdHJpbmciOyAvLyROT04tTkxTLTEkCi0gIC8qKgotICAgKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogREVMRUdBVEVfUFVCTElDLAotICAgKiBERUxFR0FURV9TWVNURU0sIERFTEVHQVRFX1VSSSwgTkVYVF9DQVRBTE9HCi0gICAqLwotICBTdHJpbmcgQVRUUl9DQVRBTE9HID0gImNhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0gIC8qKgotICAgKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogUkVXUklURV9VUkksIERFTEVHQVRFX1VSSQotICAgKi8KLSAgU3RyaW5nIEFUVFJfVVJJX1NUQVJUX1NUUklORyA9ICJ1cmlTdGFydFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL1Jld3JpdGVFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvUmV3cml0ZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTU5MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvUmV3cml0ZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IEplc3BlciBTdGVlbiBNb2VsbGVyCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBKZXNwZXIgU3RlZW4gTW9lbGxlciAtIEFkZGVkIFhNTCBDYXRhbG9ncyAxLjEgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklSZXdyaXRlRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBSZXdyaXRlRW50cnkgZXh0ZW5kcyBUeXBlZENhdGFsb2dFbGVtZW50IGltcGxlbWVudHMgSVJld3JpdGVFbnRyeSwgQ2xvbmVhYmxlIAotewotCVN0cmluZyBzdGFydFN0cmluZzsKLQlTdHJpbmcgcmV3cml0ZVByZWZpeDsKLQotCXByb3RlY3RlZCBSZXdyaXRlRW50cnkoaW50IGFuRW50cnlUeXBlKSAKLQl7Ci0JCXN1cGVyKElDYXRhbG9nRWxlbWVudC5UWVBFX1JFV1JJVEUsIGFuRW50cnlUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0U3RyaW5nKCkgCi0JewotCQlyZXR1cm4gc3RhcnRTdHJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnRTdHJpbmcoU3RyaW5nIHN0YXJ0U3RyaW5nKSAKLQl7Ci0JCXRoaXMuc3RhcnRTdHJpbmcgPSBzdGFydFN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJld3JpdGVQcmVmaXgoKSAKLQl7Ci0JCXJldHVybiByZXdyaXRlUHJlZml4OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJld3JpdGVQcmVmaXgoU3RyaW5nIHJld3JpdGVQcmVmaXgpIAotCXsKLQkJdGhpcy5yZXdyaXRlUHJlZml4ID0gcmV3cml0ZVByZWZpeDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0JewotCQlSZXdyaXRlRW50cnkgZW50cnkgPSAoUmV3cml0ZUVudHJ5KSBzdXBlci5jbG9uZSgpOwotCQllbnRyeS5zZXRSZXdyaXRlUHJlZml4KHJld3JpdGVQcmVmaXgpOwotCQllbnRyeS5zZXRTdGFydFN0cmluZyhzdGFydFN0cmluZyk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9TdWZmaXhFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvU3VmZml4RW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkYWFhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9TdWZmaXhFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBKZXNwZXIgU3RlZW4gTW9lbGxlcgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSmVzcGVyIFN0ZWVuIE1vZWxsZXIgLSBBZGRlZCBYTUwgQ2F0YWxvZ3MgMS4xIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JU3VmZml4RW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBTdWZmaXhFbnRyeSBleHRlbmRzIFR5cGVkQ2F0YWxvZ0VsZW1lbnQgaW1wbGVtZW50cyBJU3VmZml4RW50cnksIENsb25lYWJsZQotewotICBTdHJpbmcgc3VmZml4OwotICBTdHJpbmcgdXJpOwotCi0gIHByb3RlY3RlZCBTdWZmaXhFbnRyeShpbnQgYW5FbnRyeVR5cGUpCi0gIHsKLSAgICBzdXBlcihJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9TVUZGSVgsIGFuRW50cnlUeXBlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFN1ZmZpeChTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBzdWZmaXggPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkKLSAgewotICAgIHJldHVybiBzdWZmaXg7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdXJpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgdXJpID0gdmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgewotICAgIFN1ZmZpeEVudHJ5IGVudHJ5ID0gKFN1ZmZpeEVudHJ5KXN1cGVyLmNsb25lKCk7Ci0gICAgZW50cnkuc2V0U3VmZml4KHN1ZmZpeCk7Ci0gICAgZW50cnkuc2V0VVJJKHVyaSk7Ci0gICAgcmV0dXJuIGVudHJ5OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9UeXBlZENhdGFsb2dFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9UeXBlZENhdGFsb2dFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OTJkNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvVHlwZWRDYXRhbG9nRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBKZXNwZXIgU3RlZW4gTW9lbGxlcgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSmVzcGVyIFN0ZWVuIE1vZWxsZXIgLSBBZGRlZCBYTUwgQ2F0YWxvZ3MgMS4xIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotCi1wdWJsaWMgY2xhc3MgVHlwZWRDYXRhbG9nRWxlbWVudCBleHRlbmRzIENhdGFsb2dFbGVtZW50IAotewotCXByb3RlY3RlZCBpbnQgZW50cnlUeXBlOwotCi0JcHVibGljIFR5cGVkQ2F0YWxvZ0VsZW1lbnQoaW50IHR5cGUsIGludCBlbnRyeVR5cGUpIAotCXsKLQkJc3VwZXIodHlwZSk7Ci0JCXRoaXMuZW50cnlUeXBlID0gZW50cnlUeXBlOwotCX0KLQotCWZpbmFsIHB1YmxpYyB2b2lkIHNldEVudHJ5VHlwZShpbnQgdmFsdWUpIAotCXsKLQkgICAgZW50cnlUeXBlID0gdmFsdWU7Ci0JfQotCi0JZmluYWwgcHVibGljIGludCBnZXRFbnRyeVR5cGUoKSAKLQl7Ci0JICAgIHJldHVybiBlbnRyeVR5cGU7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSAKLQl7Ci0JCVR5cGVkQ2F0YWxvZ0VsZW1lbnQgdGVtcCA9IChUeXBlZENhdGFsb2dFbGVtZW50KXN1cGVyLmNsb25lKCk7Ci0JCXRlbXAuc2V0RW50cnlUeXBlKHRoaXMuZ2V0RW50cnlUeXBlKCkpOwotCQlyZXR1cm4gdGVtcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dVUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjRhZjA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dVUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBpbmplY3QgdGhlIFhNTENhdGFsb2cgcmVzb2x1dGlvbiBiZWhhdmlvdXIgaW50byB0aGUKLSAqIENvbW1vbiBFeHRlbnNpYmxlIFVSSSBSZXNvbHZlci4gVGhpcyBjbGFzcyBpcyByZWZlcmVuY2VkIGluIHRoZSBYTUwgQ2F0YWxvZwotICogcGx1Z2luJ3MgcGx1Z2luLnhtbCBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ1VSSVJlc29sdmVyRXh0ZW5zaW9uIGltcGxlbWVudHMgVVJJUmVzb2x2ZXJFeHRlbnNpb24KLXsKLSAgcHVibGljIFN0cmluZyByZXNvbHZlKElGaWxlIGZpbGUsIFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgLy8gaWYgd2UgaGF2ZSBjYXRhbG9nIGluIGEgcHJvamVjdCB3ZSBtYXkgYWRkIGl0Ci0gICAgLy8gdG8gdGhlIGNhdGFsb2cgbWFuYWdlciBmaXJzdAotICAgIElDYXRhbG9nIGNhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotICAgIGlmIChjYXRhbG9nID09IG51bGwpCi0gICAgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX3Jlc29sdXRpb25fbnVsbF9jYXRhbG9nKTsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBTdHJpbmcgcmVzb2x2ZWQgPSBudWxsOwotICAgIGlmIChzeXN0ZW1JZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICByZXNvbHZlZCA9IGNhdGFsb2cucmVzb2x2ZVN5c3RlbShzeXN0ZW1JZCk7Ci0gICAgICAgIGlmIChyZXNvbHZlZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb2x2ZWQgPSBjYXRhbG9nLnJlc29sdmVVUkkoc3lzdGVtSWQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKQotICAgICAgewotICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfcmVzb2x1dGlvbl9tYWxmb3JtZWRfdXJsKTsKLSAgICAgICAgcmVzb2x2ZWQgPSBudWxsOwotICAgICAgfQotICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGllKQotICAgICAgewotICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfcmVzb2x1dGlvbl9pb19leGNlcHRpb24pOwotICAgICAgICByZXNvbHZlZCA9IG51bGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChyZXNvbHZlZCA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmIChwdWJsaWNJZCAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBDUyA6IHRoaXMgaXMgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYnVnIDk2NzcyCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEZvciBzY2hlbWFzIHdlIGFsd2F5cyB1c2UgbG9jYXRpb25zIHdoZXJlIGF2YWlsYWJsZSBhbmQgb25seSB1c2UKLSAgICAgICAgLy8gbmFtZXNwYWNlIHdoZW4gbm8gbG9jYXRpb24gaXMgc3BlY2lmaWVkLiAgRm9yIFhNTCBlbnRpdGllcyAoc3VjaCBhcyBET0NUWVBFKSAKLSAgICAgICAgLy8gZGVmYXVsdCBhbHdheXMgdXRpbGl6ZSB0aGUgcHVibGljIGNhdGFsb2cgZW50cnkuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoaXMgbGFtZSB0ZXN0IGJlbG93IHJvdWdobHkgZGlzY3JpbWluYXRlIGJldHdlZW4gc2NoZW1hIGFuZCBYTUwgZW50aXRpZXMuCi0gICAgICAgIC8vIFRPRE8gKGJ1ZyAxMDMyNDMpIHJlbW92ZSB0aGlzIGxhbWUgdGVzdCBvbmNlIHdlIG1vdmUgdG8gdGhlIG5ldyBVUklSZXNvbHZlciBBUEkKLSAgICAgICAgLy8gc2luY2UgdGhlIG5ldyBBUEkgaXMgZXhwbGljaXQgYWJvdXQgbmFtZXNwYWNlIGFuZCBwdWJsaWNJZAotICAgICAgICAvLyAKLSAgICAgICAgaWYgKCEoc3lzdGVtSWQgIT0gbnVsbCAmJiBzeXN0ZW1JZC5lbmRzV2l0aCgiLnhzZCIpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzb2x2ZWQgPSBjYXRhbG9nLnJlc29sdmVQdWJsaWMocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlZCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXNvbHZlZCA9IGNhdGFsb2cucmVzb2x2ZVVSSShwdWJsaWNJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpCi0gICAgICAgICAgewotICAgICAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX3Jlc29sdXRpb25fbWFsZm9ybWVkX3VybCk7Ci0gICAgICAgICAgICByZXNvbHZlZCA9IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfcmVzb2x1dGlvbl9pb19leGNlcHRpb24pOwotICAgICAgICAgICAgcmVzb2x2ZWQgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzb2x2ZWQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzk2Yjc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBNb2VsbGVyIC0gQWRkZWQgWE1MIENhdGFsb2dzIDEuMSBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicuCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2F0YWxvZwotewotICAgIC8qKgotICAgICAqIFJldHVybnMgY2F0YWxvZyBpZCBzdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNhdGFsb2cgaWQgc3RyaW5nCi0gICAgICovCi0gICAgU3RyaW5nIGdldElkKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyBjYXRhbG9nIGlkIHN0cmluZwotICAgICAqIAotICAgICAqLwotICAgIHZvaWQgc2V0SWQoU3RyaW5nIGlkKTsKLSAgICAKLSAgICAKLSAgICB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbik7Ci0gICAgU3RyaW5nIGdldExvY2F0aW9uKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBhcHBsaWNhYmxlIG9yIFNZU1RFTSBpZGVudGlmaWVyLgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHNlYXJjaGVzIHRoZSBDYXRhbG9nIGFuZCByZXR1cm5zIHRoZSBzeXN0ZW0gaWRlbnRpZmllcgotICAgICAqIHNwZWNpZmllZCBmb3IgdGhlIGdpdmVuIHN5c3RlbSBvciBpZGVudGlmaWVycy4gSWYgbm8gYXBwcm9wcmlhdGUKLSAgICAgKiBvciBTWVNURU0gZW50cnkgaXMgZm91bmQgaW4gdGhlIENhdGFsb2csIG51bGwgaXMgcmV0dXJuZWQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBwdWJsaWNJZAotICAgICAqICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgdG8gbG9jYXRlIGluIHRoZSBjYXRhbG9nLiBQdWJsaWMKLSAgICAgKiAgICAgICAgICAgIGlkZW50aWZpZXJzIGFyZSBub3JtYWxpemVkIGJlZm9yZSBjb21wYXJpc29uLgotICAgICAqIEBwYXJhbSBzeXN0ZW1JZAotICAgICAqICAgICAgICAgICAgVGhlIG5vbWluYWwgc3lzdGVtIGlkZW50aWZpZXIgZm9yIHRoZSBlbnRpdHkgaW4gcXVlc3Rpb24gKGFzCi0gICAgICogICAgICAgICAgICBwcm92aWRlZCBpbiB0aGUgc291cmNlIGRvY3VtZW50KS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFRoZSBmb3JtYWwgc3lzdGVtIGlkZW50aWZpZXIgb2YgYSBzdWJvcmRpbmF0ZSBjYXRhbG9nIGNhbm5vdAotICAgICAqICAgICAgICAgICAgIGJlIHR1cm5lZCBpbnRvIGEgdmFsaWQgVVJMLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBFcnJvciByZWFkaW5nIHN1Ym9yZGluYXRlIGNhdGFsb2cgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBzeXN0ZW0gaWRlbnRpZmllciB0byB1c2UuIE5vdGUgdGhhdCB0aGUgbm9taW5hbCBzeXN0ZW0KLSAgICAgKiAgICAgICAgIGlkZW50aWZpZXIgaXMgbm90IHJldHVybmVkIGlmIGEgbWF0Y2ggaXMgbm90IGZvdW5kIGluIHRoZQotICAgICAqICAgICAgICAgY2F0YWxvZywgaW5zdGVhZCBudWxsIGlzIHJldHVybmVkIHRvIGluZGljYXRlIHRoYXQgbm8gbWF0Y2ggd2FzCi0gICAgICogICAgICAgICBmb3VuZC4KLSAgICAgKi8KLSAgICBTdHJpbmcgcmVzb2x2ZVB1YmxpYyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBhcHBsaWNhYmxlIFNZU1RFTSBzeXN0ZW0gaWRlbnRpZmllci4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBJZiBhIFNZU1RFTSBlbnRyeSBleGlzdHMgaW4gdGhlIENhdGFsb2cgZm9yIHRoZSBzeXN0ZW0gSUQgc3BlY2lmaWVkLAotICAgICAqIHJldHVybiB0aGUgbWFwcGVkIHZhbHVlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBPbiBXaW5kb3dzLWJhc2VkIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGUgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzeXN0ZW0KLSAgICAgKiBpZGVudGlmaWVyIHByb3ZpZGVkIGFuZCB0aGUgU1lTVEVNIGVudHJpZXMgaW4gdGhlIENhdGFsb2cgaXMKLSAgICAgKiBjYXNlLWluc2Vuc2l0aXZlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3lzdGVtSWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBzeXN0ZW0gSUQgdG8gbG9jYXRlIGluIHRoZSBjYXRhbG9nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHJlc29sdmVkIHN5c3RlbSBpZGVudGlmaWVyLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgVGhlIGZvcm1hbCBzeXN0ZW0gaWRlbnRpZmllciBvZiBhIHN1Ym9yZGluYXRlIGNhdGFsb2cgY2Fubm90Ci0gICAgICogICAgICAgICAgICAgYmUgdHVybmVkIGludG8gYSB2YWxpZCBVUkwuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIEVycm9yIHJlYWRpbmcgc3Vib3JkaW5hdGUgY2F0YWxvZyBmaWxlLgotICAgICAqLwotICAgIFN0cmluZyByZXNvbHZlU3lzdGVtKFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBhcHBsaWNhYmxlIFVSSS4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBJZiBhIFVSSSBlbnRyeSBleGlzdHMgaW4gdGhlIENhdGFsb2cgZm9yIHRoZSBVUkkgc3BlY2lmaWVkLCByZXR1cm4gdGhlCi0gICAgICogbWFwcGVkIHZhbHVlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBVUkkgY29tcGFyaXNvbiBpcyBjYXNlIHNlbnNpdGl2ZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqICAgICAgICAgICAgVGhlIFVSSSB0byBsb2NhdGUgaW4gdGhlIGNhdGFsb2cuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgcmVzb2x2ZWQgVVJJLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgVGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIGEgc3Vib3JkaW5hdGUgY2F0YWxvZyBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgICAgICB0dXJuZWQgaW50byBhIHZhbGlkIFVSTC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgRXJyb3IgcmVhZGluZyBzdWJvcmRpbmF0ZSBjYXRhbG9nIGZpbGUuCi0gICAgICovCi0gICAgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBjYXRhbG9nIGVsZW1lbnQgdG8gdGhlIGNvbGxlY3Rpb24gb2YgdGhlIGNhdGFsb2cgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQgLQotICAgICAqICAgICAgICAgICAgY2F0YWxvZyBlbGVtZW50Ci0gICAgICovCi0gICAgdm9pZCBhZGRDYXRhbG9nRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGNhdGFsb2cgZWxlbWVudCBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIHRoZSBjYXRhbG9nIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50IC0KLSAgICAgKiAgICAgICAgICAgIGNhdGFsb2cgZWxlbWVudAotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBjYXRhbG9nIGVsZW1lbnRzIG9mIHR5cGUgSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNhdGFsb2cgZWxlbWVudHMKLSAgICAgKi8KLSAgICBJQ2F0YWxvZ0VudHJ5W10gZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2F0YWxvZyBlbGVtZW50cyBvZiB0eXBlIElDYXRhbG9nRWxlbWVudC5UWVBFX1JFV1JJVEUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJld3JpdGUgY2F0YWxvZyBlbGVtZW50cwotICAgICAqLwotICAgIElSZXdyaXRlRW50cnlbXSBnZXRSZXdyaXRlRW50cmllcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBjYXRhbG9nIGVsZW1lbnRzIG9mIHR5cGUgSUNhdGFsb2dFbGVtZW50LlRZUEVfU1VGRklYCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBzdWZmaXggZW50cnkgZWxlbWVudHMKLSAgICAgKi8KLSAgICBJU3VmZml4RW50cnlbXSBnZXRTdWZmaXhFbnRyaWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNhdGFsb2cgZWxlbWVudHMgb2YgdHlwZSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ERUxFR0FURQotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZGVsZWdhdGUgY2F0YWxvZyBlbGVtZW50cwotICAgICAqLwotICAgIElEZWxlZ2F0ZUNhdGFsb2dbXSBnZXREZWxlZ2F0ZUNhdGFsb2dzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNhdGFsb2cgZWxlbWVudHMgb2YgdHlwZQotICAgICAqIElDYXRhbG9nRWxlbWVudC5UWVBFX0RFTEVHQVRFCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBjYXRhbG9nIGVsZW1lbnRzCi0gICAgICovCi0gICAgSU5leHRDYXRhbG9nW10gZ2V0TmV4dENhdGFsb2dzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIG5ldyBjYXRhbG9nIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUuIElmIHRoZSB0eXBlIGlzIG9uZQotICAgICAqIG9mIEVMRU1FTlRfVFlQRSwgdGhlIHJlc3VsdCBlbnRyeSB3aWxsIGhhdmUgY29ycmVzcG9uZGluZyBpbnRlcmZhY2UuCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIElDYXRhbG9nRWxlbWVudCBjcmVhdGVDYXRhbG9nRWxlbWVudChpbnQgdHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIGNhdGFsb2cuCi0gICAgICogCi0gICAgICovCi0gICAgdm9pZCBjbGVhcigpOwotICAgIAotICAgIC8vdm9pZCBsb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgIAotICAgIHZvaWQgc2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICogTG9hZHMgY2F0YWxvZyBmcm9tIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uIEV4cGVjdGluZyBPQVNJUyBYTUwgQ2F0YWxvZwotICAgICAqIGZvcm1hdAotICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhdGlvbiAtCi0gICAgICogICAgICAgICAgICB1cmkgb2YgdGhlIGZpbGUgd2hlcmUgY2F0YWxvZyB3aWxsIGJlIHNhdmVkCi0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KLSAgICAgKiAgICAgICAgICAgICBwcm9ibGVtIGxvYWRpbmcgZmlsZQotICAgICAqIAotICAgICAqLwotICAgIC8vdm9pZCBsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAqIFNhdmVzIGNhdGFsb2cgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiBPQVNJUyBYTUwgQ2F0YWxvZyBmb3JtYXQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gLQotICAgICAqICAgICAgICAgICAgdXJpIG9mIHRoZSBmaWxlIHdoZXJlIGNhdGFsb2cgd2lsbCBiZSBzYXZlZAotCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtCi0gICAgICogICAgICAgICAgICAgcHJvYmxlbSBzYXZpbmcgZmlsZQotICAgICAqIAotICAgICAqLwotICAgIC8vdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNvcGllcyBhbGwgY2F0YWxvZyBlbnRyaWVzIGZyb20gc291cmNlIGNhdGFsb2cgdG8gdGhpcyBvbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdGFsb2cgLQotICAgICAqICAgICAgICAgICAgc291cmNlIGNhdGFsb2cKLSAgICAgKiBAcGFyYW0gaW5jbHVkZU5lc3RlZCAtCi0gICAgICogICAgICAgICAgICBhIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIHdldGhlciB0byBpbmNsdWRlIGVudHJpZXMgb2YgdGhlCi0gICAgICogICAgICAgICAgICBzYW1lIHR5cGUgZnJvbSB0aGUgbmVzdGVkIGNhdGFsb2dzCi0gICAgICovCi0gICAgdm9pZCBhZGRFbnRyaWVzRnJvbUNhdGFsb2coSUNhdGFsb2cgY2F0YWxvZyk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbGlzdGVuZXIgb2YgdGhlIGNhdGFsb2cgZXZlbnRzCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIC0KLSAgICAgKiAgICAgICAgICAgIGxpc3RlbmVyIG9mIHRoZSBjYXRhbG9nIGV2ZW50cwotICAgICAqIEBzZWUgSUNhdGFsb2dFdmVudAotICAgICAqLwotICAgIHZvaWQgYWRkTGlzdGVuZXIoSUNhdGFsb2dMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgb2YgdGhlIGNhdGFsb2cgZXZlbnRzCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIC0KLSAgICAgKiAgICAgICAgICAgIGxpc3RlbmVyIG9mIHRoZSBjYXRhbG9nIGV2ZW50cwotICAgICAqIEBzZWUgSUNhdGFsb2dFdmVudAotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUNhdGFsb2dMaXN0ZW5lciBsaXN0ZW5lcik7ICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDExYzliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBNb2VsbGVyIC0gQWRkZWQgWE1MIENhdGFsb2dzIDEuMSBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7Ci0KLQotLyoqCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2F0YWxvZ0VsZW1lbnQKLXsKLSAgICAvKiogVHlwZXMgb2YgdGhlIGNhdGFsb2cgZW50cmllcyAqLwotICAgIC8qKiBUaGUgUFVCTElDLCBVUkkgb3IgU1lTVEVNIENhdGFsb2cgRW50cnkuICovCi0gICAgaW50IFRZUEVfRU5UUlkgPSAxOwotCi0gICAgLyoqIFRoZSBORVhUX0NBVEFMT0cgQ2F0YWxvZyBFbnRyeSB0eXBlLiAqLwotICAgIGludCBUWVBFX05FWFRfQ0FUQUxPRyA9IDEwOwotCi0gICAgLyoqIFJld3JpdGUgdHlwZXMgKHNpbmNlIFhNTCBDYXRhbG9ncyAxLjEpICovCi0gICAgaW50IFRZUEVfUkVXUklURSA9IDIwOwotCi0gICAgLyoqIERlbGVnYXRlIHR5cGVzIChzaW5jZVhNTCBDYXRhbG9ncyAxLjEpICovCi0gICAgaW50IFRZUEVfREVMRUdBVEUgPSAzMDsKLSAgICAKLSAgICAvKiogU3VmZml4IHR5cGVzIChzaW5jZSBYTUwgQ2F0YWxvZ3MgMS4xKSAgKi8KLSAgICBpbnQgVFlQRV9TVUZGSVggPSA0MDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB3aXRoIHNwZWNpZmllZCBuYW1lLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgd2l0aCBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiBAc2VlICNzZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcpCi0gICAgICovCi0gICAgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBuYW1lZCBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCB3aWxsIGJlIHNldAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgbmFtZWQgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEF0dHJpYnV0ZVZhbHVlKCkKLSAgICAgKi8KLSAgICB2b2lkIHNldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhdHRyaWJ1dGUgbmFtZXMgZm9yIGFueSBkeW5hbWljIGF0dHJpYnV0ZXMgdGhhdCBtYXkgZXhpc3QKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFycmF5IG9mIGF0dHJpYnV0ZSBuYW1lcwotICAgICAqIEBzZWUgI2dldEF0dHJpYnV0ZVZhbHVlKCkKLSAgICAgKiBAc2VlICNzZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcpCi0gICAgICovCi0gICAgU3RyaW5nW10gZ2V0QXR0cmlidXRlcygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgZWxlbWVudCdzIGlkIHN0cmluZwotICAgICAqIAotICAgICAqIEByZXR1cm4gZWxlbWVudCdzIGlkIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIGVsZW1lbnQncyBpZCBzdHJpbmcKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldE93bmVyQ2F0YWxvZyhJQ2F0YWxvZyBjYXRhbG9nKTsKLSAgICAKLSAgICBwdWJsaWMgSUNhdGFsb2cgZ2V0T3duZXJDYXRhbG9nKCk7Ci0KLQl2b2lkIHNldEJhc2UoU3RyaW5nIGJhc2UpOwotCi0JU3RyaW5nIGdldEJhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyZGJmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhdGFsb2dFbnRyeSBleHRlbmRzIElDYXRhbG9nRWxlbWVudAotewotICAgIC8qKiBUaGUgUFVCTElDIENhdGFsb2cgRW50cnkgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRSWV9UWVBFX1BVQkxJQyA9IDI7Ci0KLSAgICAvKiogVGhlIFNZU1RFTSBDYXRhbG9nIEVudHJ5IHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5UUllfVFlQRV9TWVNURU0gPSAzOwotCi0gICAgLyoqIFRoZSBVUkkgQ2F0YWxvZyBFbnRyeSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVFJZX1RZUEVfVVJJID0gNDsKLQotICAgIC8qKiBBdHRyaWJ1dGUgbmFtZSBmb3IgV2ViIGFkZHJlc3Mgb2YgY2F0YWxvZyBlbnRyeSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfV0VCX1VSTCA9ICJ3ZWJVUkwiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW50cnlUeXBlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW50cnlUeXBlKGludCBlbnRyeVR5cGUpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RW50cnlUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVUkkoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIHVyaSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0V2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjU3NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi0KLQotLyoqCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2F0YWxvZ0V2ZW50Ci17Ci0gICAgLyoqICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRCA9IDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX0FEREVEID0gMTsKLQotICAgIC8qKiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfUkVNT1ZFRCA9IDI7Ci0KLSAgICAvKiogKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX0NIQU5HRUQgPSAzOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIElDYXRhbG9nIGdldENhdGFsb2coKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUNhdGFsb2dFbGVtZW50IGdldENhdGFsb2dFbGVtZW50KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0xpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjM2RjMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBUaGUgY2xpZW50cyBvZiB0aGUgY2F0YWxvZyB0aGF0IHdhbnQgdG8gbGlzdGVuIHRvIGNhdGFsb2cgY2hhbmdlcyBzaG91bGQKLSAqIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIAotICogQHNlZSBJQ2F0YWxvZywgSUNhdGFsb2dFdmVudCwKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRhbG9nTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyCi17Ci0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgYWxsb3dzIHRvIHJlYWN0IHRvIGNhdGFsb2cgZXZlbnRzCi0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IC0KLSAgICAgKiAgICAgICAgICAgIGFuIGV2ZW50IHRoYXQgY2xpZW50IHNob3VsZCByZWFjdCB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNhdGFsb2dDaGFuZ2VkKElDYXRhbG9nRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSURlbGVnYXRlQ2F0YWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSURlbGVnYXRlQ2F0YWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjA0MGIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lEZWxlZ2F0ZUNhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSmVzcGVyIFN0ZWVuIE1vZWxsZXIKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIEplc3BlciBTdGVlbiBNb2VsbGVyIC0gQWRkZWQgWE1MIENhdGFsb2dzIDEuMSBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURlbGVnYXRlQ2F0YWxvZyBleHRlbmRzIElDYXRhbG9nRWxlbWVudAotewotICAgIC8qKiBUaGUgU1lTVEVNIENhdGFsb2cgRW50cnkgdHlwZS4gKi8KLSAgICBpbnQgREVMRUdBVEVfVFlQRV9QVUJMSUMgPSAzMTsKLQotICAgIC8qKiBUaGUgU1lTVEVNIENhdGFsb2cgRW50cnkgdHlwZS4gKi8KLSAgICBpbnQgREVMRUdBVEVfVFlQRV9TWVNURU0gPSAzMjsKLQotICAgIC8qKiBUaGUgVVJJIENhdGFsb2cgRW50cnkgdHlwZS4gKi8KLSAgICBpbnQgREVMRUdBVEVfVFlQRV9VUkkgPSAzMzsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbnRyeVR5cGUKLSAgICAgKi8KLSAgICB2b2lkIHNldEVudHJ5VHlwZShpbnQgZW50cnlUeXBlKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBpbnQgZ2V0RW50cnlUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICovCi0gICAgdm9pZCBzZXRTdGFydFN0cmluZyhTdHJpbmcga2V5KTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U3RhcnRTdHJpbmcoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgbG9jYXRpb24gb2YgdGhlIHJlZmVyZW5jZWQgY2F0YWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpIC0KLSAgICAgKiAgICAgICAgICAgIGxvY2F0aW9uIHVyaSBvZiB0aGUgcmVmZXJlbmNlZCBjYXRhbG9nCi0gICAgICovCi0gICAgdm9pZCBzZXRDYXRhbG9nTG9jYXRpb24oU3RyaW5nIHVyaSk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbG9jYXRpb24gdXJpIG9mIHRoZSByZWZlcmVuY2VkIGNhdGFsb2cuCi0gICAgICogCi0gICAgICogQHJldHVybiBsb2NhdGlvbiB1cmkgb2YgdGhlIHJlZmVyZW5jZWQgY2F0YWxvZwotICAgICAqLwotICAgIFN0cmluZyBnZXRDYXRhbG9nTG9jYXRpb24oKTsKLSAgICAKLSAgICBJQ2F0YWxvZyBnZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSU5leHRDYXRhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JTmV4dENhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjOTM5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JTmV4dENhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbDsKLQotCi0KLS8qKgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBuZXh0Q2F0YWxvZyBPQVNJUyBYTUwgY2F0YWxvZyBlbGVtZW50LiBPYmplY3Qgb2YgdGhlCi0gKiBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2Ugd291bGQgc2VydmUgYXMgYSByZWZlcmVuY2UgdG8gdGhlCi0gKiBjYXRhbG9nIG9iamVjdC4KLSAqIAotICogQHNlZSBJQ2F0YWxvZywgSUNhdGFsb2dFbGVtZW50Ci0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGN1cnJlbnRseSBpcyB1c2VkIG9ubHkgYnkgdGhlIGNhdGFsb2cgaXRzZWxmLiBOZWVkIHRvIGZpbmQgaWYKLSAqIHRoZXJlIGFyZSBhbnkgY2xpZW50cyB0aGF0IG5lZWQgaXQuCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmV4dENhdGFsb2cgZXh0ZW5kcyBJQ2F0YWxvZ0VsZW1lbnQKLXsKLSAgICAvKioKLSAgICAgKiBTZXQgbG9jYXRpb24gb2YgdGhlIHJlZmVyZW5jZWQgY2F0YWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpIC0KLSAgICAgKiAgICAgICAgICAgIGxvY2F0aW9uIHVyaSBvZiB0aGUgcmVmZXJlbmNlZCBjYXRhbG9nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0xvY2F0aW9uKFN0cmluZyB1cmkpOwotCi0gICAgLyoqCi0gICAgICogR2V0IGxvY2F0aW9uIHVyaSBvZiB0aGUgcmVmZXJlbmNlZCBjYXRhbG9nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gbG9jYXRpb24gdXJpIG9mIHRoZSByZWZlcmVuY2VkIGNhdGFsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dMb2NhdGlvbigpOwotICAgIAotICAgIHB1YmxpYyBJQ2F0YWxvZyBnZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCi0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lSZXdyaXRlRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lSZXdyaXRlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5NTU5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JUmV3cml0ZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IEplc3BlciBTdGVlbiBNb2VsbGVyCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBKZXNwZXIgU3RlZW4gTW9lbGxlciAtIEFkZGVkIFhNTCBDYXRhbG9ncyAxLjEgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZXdyaXRlRW50cnkgZXh0ZW5kcyBJQ2F0YWxvZ0VsZW1lbnQKLXsKLSAgICAvKiogVGhlIHJld3JpdGVTeXN0ZW0gQ2F0YWxvZyB0eXBlLiAqLwotICAgIGludCBSRVdSSVRFX1RZUEVfU1lTVEVNID0gMjE7Ci0KLSAgICAvKiogVGhlIFVSSSBDYXRhbG9nIEVudHJ5IHR5cGUuICovCi0gICAgaW50IFJFV1JJVEVfVFlQRV9VUkkgPSAyMjsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbnRyeVR5cGUKLSAgICAgKi8KLSAgICB2b2lkIHNldEVudHJ5VHlwZShpbnQgZW50cnlUeXBlKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBpbnQgZ2V0RW50cnlUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICovCi0gICAgdm9pZCBzZXRTdGFydFN0cmluZyhTdHJpbmcgc3RhcnRTdHJpbmcpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIFN0cmluZyBnZXRTdGFydFN0cmluZygpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIFN0cmluZyBnZXRSZXdyaXRlUHJlZml4KCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICovCi0gICAgdm9pZCBzZXRSZXdyaXRlUHJlZml4KFN0cmluZyB1cmkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSVN1ZmZpeEVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JU3VmZml4RW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwNDAxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JU3VmZml4RW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSmVzcGVyIFN0ZWVuIE1vZWxsZXIKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIEplc3BlciBTdGVlbiBNb2VsbGVyIC0gQWRkZWQgWE1MIENhdGFsb2dzIDEuMSBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN1ZmZpeEVudHJ5IGV4dGVuZHMgSUNhdGFsb2dFbGVtZW50Ci17Ci0gICAgLyoqIFRoZSByZXdyaXRlU3lzdGVtIENhdGFsb2cgdHlwZS4gKi8KLSAgICBpbnQgU1VGRklYX1RZUEVfU1lTVEVNID0gNDE7Ci0KLSAgICAvKiogVGhlIFVSSSBDYXRhbG9nIEVudHJ5IHR5cGUuICovCi0gICAgaW50IFNVRkZJWF9UWVBFX1VSSSA9IDQyOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGVudHJ5VHlwZQotICAgICAqLwotICAgIHZvaWQgc2V0RW50cnlUeXBlKGludCBlbnRyeVR5cGUpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIGludCBnZXRFbnRyeVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKi8KLSAgICB2b2lkIHNldFN1ZmZpeChTdHJpbmcgc3VmZml4U3RyaW5nKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U3VmZml4KCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgU3RyaW5nIGdldFVSSSgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqLwotICAgIHZvaWQgc2V0VVJJKFN0cmluZyB1cmkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQW55RWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQW55RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmE0NzAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUFueUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNQW55RWxlbWVudCBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTUFueUVsZW1lbnQgZXh0ZW5kcyBDTUNvbnRlbnQgewotLyoqCi0gKiBnZXROYW1lc3BhY2VVUkkgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjcxOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0vKioKLSAqIEF0dHJpYnV0ZURlY2xhcmF0aW9uIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZXh0ZW5kcyBDTU5vZGUgewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05BTCAgID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUlSRUQgICA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJWEVEICAgICAgPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9ISUJJVEVEID0gNDsKLS8qKgotICogZ2V0QXR0ck5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldEF0dHJOYW1lKCk7Ci0vKioKLSAqIGdldEF0dHJUeXBlIG1ldGhvZAotICogQHJldHVybiBDTURhdGFUeXBlCi0gKi8KLUNNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKTsKLS8qKgotICogZ2V0RGVmYXVsdFZhbHVlIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKiBAZGVwcmVjYXRlZCAtLSB0byBiZSByZXBsYWNlZCBpbiBmdXR1cmUgd2l0aCBhZGRpdGlvbmFsIENNRGF0YVR5cGUgbWV0aG9kcyAoY3VycmVudGx5IGZvdW5kIG9uIENNRGF0YVR5cGVIZWxwZXIpCi0gKi8KLVN0cmluZyBnZXREZWZhdWx0VmFsdWUoKTsKLS8qKgotICogZ2V0RW51bUF0dHIgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEudXRpbC5FbnVtZXJhdGlvbgotICogQGRlcHJlY2F0ZWQgLS0gdG8gYmUgcmVwbGFjZWQgaW4gZnV0dXJlIHdpdGggYWRkaXRpb25hbCBDTURhdGFUeXBlIG1ldGhvZHMgKGN1cnJlbnRseSBmb3VuZCBvbiBDTURhdGFUeXBlSGVscGVyKQotICovCi1FbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpOwotLyoqCi0gKiBnZXRVc2FnZSBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKi8KLWludCBnZXRVc2FnZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMThiMjk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENNQ29udGVudCBleHRlbmRzIENNTm9kZQotewotLyoqCi0gKiBnZXRNYXhPY2N1ciBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKgotICogSWYgLTEsIGl0J3MgVU5CT1VOREVELgotICovCi1pbnQgZ2V0TWF4T2NjdXIoKTsKLS8qKgotICogZ2V0TWluT2NjdXIgbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICoKLSAqIElmIDAsIGl0J3MgT1BUSU9OQUwuCi0gKiBJZiAxLCBpdCdzIFJFUVVJUkVELgotICovCi1pbnQgZ2V0TWluT2NjdXIoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURhdGFUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01EYXRhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQ3MjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTURhdGFUeXBlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01EYXRhVHlwZSBleHRlbmRzIENNTm9kZSB7Ci0gICAgCi0gIC8vIHRvZG8uLi4gYXQgc29tZSBwb2ludCB3ZSBzaG91bGQgcmVtb3ZlIHRoZXNlIG5hbWVzIHRvCi0gIC8vIGF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdmlhIHRoZSBpbnRlcmZhY2VzCi0gIC8vCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQSA9ICJDREFUQSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIklEIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUYgPSAiSURSRUYiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRlMgPSAiSURSRUZTIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZID0gIkVOVElUWSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUSUVTID0gIkVOVElUSUVTIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT04gPSAiTk9UQVRJT04iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOID0gIk5NVE9LRU4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOUyA9ICJOTVRPS0VOUyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5VTUJFUiA9ICJOVU1CRVIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBVUkkgPSAiVVJJIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTSA9ICJFTlVNIjsgLy8kTk9OLU5MUy0xJAotCi0gIHN0YXRpYyBmaW5hbCBpbnQgSU1QTElFRF9WQUxVRV9OT05FICAgICAgICAgICAgID0gMTsKLSAgc3RhdGljIGZpbmFsIGludCBJTVBMSUVEX1ZBTFVFX0ZJWEVEICAgICAgICAgICAgPSAyOwotICBzdGF0aWMgZmluYWwgaW50IElNUExJRURfVkFMVUVfREVGQVVMVCAgICAgICAgICA9IDM7Ci0KLS8qKgotICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpOyAgICAKLQotLyoqCi0gKiBnZXRJbXBsaWVkVmFsdWVLaW5kIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBSZXR1cm5zIG9uZSBvZiA6Ci0gKiBJTVBMSUVEX1ZBTFVFX05PTkUsIElNUExJRURfVkFMVUVfRklYRUQsIElNUExJRURfVkFMVUVfREVGQVVMVC4KLSAqLyAgICAgIAotCi1pbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpOyAgCi0KLS8qKgotICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgIAotICoKLSAqIFJldHVybnMgdGhlIGltcGxpZWQgdmFsdWUgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLSAqLwotU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpOwotCi0vKioKLSAqIGdldFR5cGVOYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLSAqCi0gKi8KLVN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLQotLyoqCi0gKiBnZXRUeXBlTmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICoKLSAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdWl0YWJsZSBkZWZhdWx0IHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgZGF0YSB0eXBlIGlzIGNyZWF0ZWQuCi0gKiBUaGlzIHJldHVybnMgbnVsbCBvZiBhIHN1aXRhYmxlIGRlZmF1bHQgaXMgbm90IGF2YWlsYWJsZS4KLSAqLwotU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDdhNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNRG9jdW1lbnQgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudCBleHRlbmRzIENNTm9kZSB7Ci0vKioKLSAqIGdldEVsZW1lbnRzIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotICoKLSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRWxlbWVudERlY2xhcmF0aW9uCi0gKi8KLUNNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCk7Ci0vKioKLSAqIGdldEVudGl0aWVzIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotICoKLSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRW50aXR5RGVjbGFyYXRpb24KLSAqLwotQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKTsKLS8qKgotICogZ2V0TmFtZXNwYWNlIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVzcGFjZQotICovCi1DTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlNGQ4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTURvY3VtZW50YXRpb24gaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudGF0aW9uIGV4dGVuZHMgQ01Ob2RlIHsgICAgICAgIAotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKTsKLSAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRWxlbWVudERlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNDgwNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRWxlbWVudERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTUVsZW1lbnREZWNsYXJhdGlvbiBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBleHRlbmRzIENNQ29udGVudCB7Ci0gIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOWSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFkgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JWEVEID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQ0RBVEEgPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENEQVRBID0gNTsgLy8gdG9kby4uLiBjbGFyaWZ5IHRoaXMgb25lCi0vKioKLSAqIGdldEF0dHJpYnV0ZXMgbWV0aG9kCi0gKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0gKgotICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBBdHRyaWJ1dGVEZWNsYXJhdGlvbgotICovCi1DTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCk7Ci0vKioKLSAqIGdldENNQ29udGVudCBtZXRob2QKLSAqIEByZXR1cm4gQ01Db250ZW50Ci0gKgotICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoaXMgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwuCi0gKiBUaGlzIGNhbiBiZSBhbiBDTUVsZW1lbnREZWNsYXJhdGlvbiBvciBhIENNR3JvdXAKLSAqLwotQ01Db250ZW50IGdldENvbnRlbnQoKTsKLS8qKgotICogZ2V0Q29udGVudFR5cGUgbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICoKLSAqIFJldHVybnMgb25lIG9mIDoKLSAqIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLgotICovCi1wdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCk7Ci0vKioKLSAqIGdldEVsZW1lbnROYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXRFbGVtZW50TmFtZSgpOwotCi0vKioKLSAqIGdldERhdGFUeXBlIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLUNNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKTsKLQotLyoqCi0gKiBnZXRMb2NhbEVsZW1lbnRzIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotICoKLSAqIFJldHVybnMgYSBsaXN0IG9mIGxvY2FsbHkgZGVmaW5lZCBlbGVtZW50cy4KLSAqLwotQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRW50aXR5RGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVudGl0eURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjU0MzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRW50aXR5RGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNRW50aXR5RGVjbGFyYXRpb24gaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01FbnRpdHlEZWNsYXJhdGlvbiBleHRlbmRzIENNTm9kZSB7Ci0gIAotLyoqCi0gKiBnZXROYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXROYW1lKCk7Ci0vKioKLSAqIGdldFZhbHVlIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXRWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDFjYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNR3JvdXAgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Hcm91cCBleHRlbmRzIENNQ29udGVudCB7Ci0gIAotCXN0YXRpYyBmaW5hbCBpbnQgQUxMID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IENIT0lDRSA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBTRVFVRU5DRSA9IDE7Ci0vKioKLSAqIGdldENoaWxkTm9kZXMgbWV0aG9kCi0gKiBAcmV0dXJuIENNTm9kZUxpc3QKLSAqCi0gKiBSZXR1cm5zIGNoaWxkIENNTm9kZUxpc3QsIHdoaWNoIGluY2x1ZGVzIEVsZW1lbnREZWZpbml0aW9uIG9yIENNRWxlbWVudC4KLSAqLwotQ01Ob2RlTGlzdCBnZXRDaGlsZE5vZGVzKCk7Ci0KLS8qKgotICogZ2V0T3BlcmF0aW9uIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBSZXR1cm5zIG9uZSBvZiA6Ci0gKiBBTE9ORSAoYSksIFNFUVVFTkNFIChhLGIpLCBDSE9JQ0UgKGF8YiksIEFMTCAoYSZiKS4KLSAqLwotaW50IGdldE9wZXJhdG9yKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVkTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc5YjgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVkTm9kZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotLyoqCi0gKiBOYW1lZENNTm9kZU1hcAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNTmFtZWROb2RlTWFwIHsKLS8qKgotICogZ2V0TGVuZ3RoIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqLwotaW50IGdldExlbmd0aCgpOwotLyoqCi0gKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0gKiBAcmV0dXJuIENNTm9kZQotICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1DTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKTsKLS8qKgotICogaXRlbSBtZXRob2QKLSAqIEByZXR1cm4gQ01Ob2RlCi0gKiBAcGFyYW0gaW5kZXggaW50Ci0gKi8KLUNNTm9kZSBpdGVtKGludCBpbmRleCk7Ci0KLS8qKgotICoKLSAqLwotSXRlcmF0b3IgaXRlcmF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMGJjYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTU5hbWVzcGFjZSBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTU5hbWVzcGFjZSBleHRlbmRzIENNTm9kZSB7Ci0gIAotLyoqCi0gKiBnZXRQcmVmaXggbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldFByZWZpeCgpOwotLyoqCi0gKiBnZXRVUkkgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldFVSSSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQ5NWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNTm9kZSBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTU5vZGUgeyAgICAgICAgCi0gIAotICBzdGF0aWMgZmluYWwgaW50IEFOWV9FTEVNRU5UICAgICAgICAgICA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVfREVDTEFSQVRJT04gPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgREFUQV9UWVBFICAgICAgICAgICAgID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IERPQ1VNRU5UICAgICAgICAgICAgICA9IDQ7Ci0Jc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX0RFQ0xBUkFUSU9OICAgPSA1OwotCXN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0RFQ0xBUkFUSU9OICAgID0gNjsKLQlzdGF0aWMgZmluYWwgaW50IEdST1VQICAgICAgICAgICAgICAgICA9IDc7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9TUEFDRSAgICAgICAgICAgID0gODsKLSAgc3RhdGljIGZpbmFsIGludCBET0NVTUVOVEFUSU9OICAgICAgICAgPSA5OwotLyoqCi0gKiBnZXROb2RlTmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1TdHJpbmcgZ2V0Tm9kZU5hbWUoKTsKLS8qKgotICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICoKLSAqIFJldHVybnMgb25lIG9mIDoKLSAqCi0gKi8KLWludCBnZXROb2RlVHlwZSgpOwotCi0vKioKLSAqIHN1cHBvcnRzIG1ldGhvZAotICogQHJldHVybiBib29sZWFuCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLSAqCi0gKi8KLWJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLS8qKgotICogZ2V0UHJvcGVydHkgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLSAqCi0gKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotICoKLSAqLwotT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOyAvL3RvZG8gdGhyb3cgdW5zdXBwb3J0ZWQgcHJvcGVydHkgZXhjZXB0aW9uCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGFkYmY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTU5vZGVMaXN0IGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNTm9kZUxpc3QgewotICAKLS8qKgotICogZ2V0TGVuZ3RoIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqLwotaW50IGdldExlbmd0aCgpOwotLyoqCi0gKiBpdGVtIG1ldGhvZAotICogQHJldHVybiBDTU5vZGUKLSAqIEBwYXJhbSBpbmRleCBpbnQKLSAqLwotQ01Ob2RlIGl0ZW0oaW50IGluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29udGVudE1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDJiMTYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3RvcnkuQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXI7Ci0KLQotLyoqCi0gKiBDb250ZW50TW9kZWxNYW5hZ2VyIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxNYW5hZ2VyIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBwcml2YXRlIHN0YXRpYyBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5IGluZmVycmVkR3JhbW1hckZhY3Rvcnk7Ci0JcHJpdmF0ZSBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5IGNtRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5IGFubm90YXRpb25GaWxlUmVnaXN0cnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb250ZW50TW9kZWxNYW5hZ2VyIGluc3RhbmNlOwotCi0JcHVibGljIENvbnRlbnRNb2RlbE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50TW9kZWxNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQ29udGVudE1vZGVsTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmksIFN0cmluZyByZXNvdXJjZVR5cGUpIHsKLQkJaWYgKHJlc291cmNlVHlwZSA9PSBudWxsICYmIHVyaSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVzb3VyY2VUeXBlID0gdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQl9Ci0KLQkJaWYgKHJlc291cmNlVHlwZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQlDTURvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gZ2V0Q01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnkocmVzb3VyY2VUeXBlKTsKLQkJcmV0dXJuIGZhY3RvcnkgIT0gbnVsbCA/IGZhY3RvcnkuY3JlYXRlQ01Eb2N1bWVudCh1cmkpIDogbnVsbDsKLQl9Ci0KLQotCXByaXZhdGUgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSBnZXRDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlpZiAoY21Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQljbURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5ID0gbmV3IENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCW5ldyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKGNtRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBjbURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5OwotCX0KLQotCi0JcHVibGljIExpc3QgZ2V0QW5ub3RhdGlvbkZpbGVzSW5mb3MoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5KCkuZ2V0QW5ub3RhdGlvbkZpbGVzSW5mb3MocHVibGljSWQpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeSBnZXRBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5KCkgewotCQlpZiAoYW5ub3RhdGlvbkZpbGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5ID0gbmV3IEFubm90YXRpb25GaWxlUmVnaXN0cnkoKTsKLQkJCW5ldyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyKGFubm90YXRpb25GaWxlUmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBhM2IzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLSAgICAgICAgIAotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb24KLXsgICAgICAgCi0gIHByb3RlY3RlZCBIYXNodGFibGUgaGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOyAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBBbm5vdGF0aW9uKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U3BlYyhTdHJpbmcgc3BlYykKLSAgewotICAgIGhhc2h0YWJsZS5wdXQoInNwZWMiLCBzcGVjKTsgLy8kTk9OLU5MUy0xJAotICB9ICAgICAKLQotICBwdWJsaWMgU3RyaW5nIGdldFNwZWMoKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmcpaGFzaHRhYmxlLmdldCgic3BlYyIpOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgICAgIAotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBoYXNodGFibGUucHV0KG5hbWUsIHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgeyAgICAgCi0gICAgcmV0dXJuIChTdHJpbmcpaGFzaHRhYmxlLmdldChwcm9wZXJ0eU5hbWUpOwotICB9ICAgIAotCi0gIHB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZUxpc3QoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7IC8vIHRvZG8KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Fubm90YXRpb24vQW5ub3RhdGlvbk1hcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Fubm90YXRpb24vQW5ub3RhdGlvbk1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjkzMDM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb25NYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmlsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlUGFyc2VyOwotCi0KLS8qKgotICogQW5ub3RhdGlvbk1hcAotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbk1hcCB7Ci0JcHJvdGVjdGVkIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIGhhc2h0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUgPSB0cnVlOwotCi0JcHVibGljIEFubm90YXRpb25NYXAoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgewotCQl0aGlzLmlzQ2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlTdHJpbmcgc3BlYyA9IGFubm90YXRpb24uZ2V0U3BlYygpOwotCQlpZiAoc3BlYyAhPSBudWxsKSB7Ci0JCQlsaXN0LmFkZChhbm5vdGF0aW9uKTsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3BlYywgIltdfFx0XG5cclxmICIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNtTm9kZVNwZWMgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlhZGRBbm5vdGF0aW9uRm9yQ01Ob2RlU3BlYyhjbU5vZGVTcGVjLCBhbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb25Gb3JDTU5vZGVTcGVjKFN0cmluZyBjbU5vZGVTcGVjLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJU3RyaW5nIGtleSA9IGlzQ2FzZVNlbnNpdGl2ZSA/IGNtTm9kZVNwZWMgOiBjbU5vZGVTcGVjLnRvTG93ZXJDYXNlKCk7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSBoYXNodGFibGUuZ2V0KGtleSk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJCWhhc2h0YWJsZS5wdXQoa2V5LCBsaXN0KTsKLQkJfQotCQlsaXN0LmFkZChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBjbU5vZGVTcGVjLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcga2V5ID0gaXNDYXNlU2Vuc2l0aXZlID8gY21Ob2RlU3BlYyA6IGNtTm9kZVNwZWMudG9Mb3dlckNhc2UoKTsKLQkJTGlzdCBhbm5vdGF0aW9uTGlzdCA9IChMaXN0KSBoYXNodGFibGUuZ2V0KGtleSk7Ci0JCWlmIChhbm5vdGF0aW9uTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBhbm5vdGF0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQW5ub3RhdGlvbikgaS5uZXh0KCk7Ci0JCQkJcmVzdWx0ID0gYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KENNTm9kZSBjbU5vZGUsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBjbU5vZGVTcGVjID0gKFN0cmluZykgY21Ob2RlLmdldFByb3BlcnR5KCJzcGVjIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNtTm9kZVNwZWMgPT0gbnVsbCkgewotCQkJY21Ob2RlU3BlYyA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotCQl9Ci0JCWlmIChjbU5vZGVTcGVjICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGdldFByb3BlcnR5KGNtTm9kZVNwZWMsIHByb3BlcnR5TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZChTdHJpbmcgdXJpLCBTdHJpbmcgYnVuZGxlSWQpIHRocm93cyBFeGNlcHRpb24gewotCQlBbm5vdGF0aW9uRmlsZVBhcnNlciBwYXJzZXIgPSBuZXcgQW5ub3RhdGlvbkZpbGVQYXJzZXIoKTsKLQkJQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvID0gbmV3IEFubm90YXRpb25GaWxlSW5mbyh1cmksIGJ1bmRsZUlkKTsKLQkJcGFyc2VyLnBhcnNlKHRoaXMsIGZpbGVJbmZvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01BbnlFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQW55RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwMGE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01BbnlFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ01BbnlFbGVtZW50SW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBDTUFueUVsZW1lbnQKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2VVUkk7ICAKLQotICBwdWJsaWMgQ01BbnlFbGVtZW50SW1wbChTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgbWluT2NjdXIgPSAtMTsKLSAgfSAgICAgICAgICAgICAKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTm9kZU5hbWUoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiB1cmkgIT0gbnVsbCA/ICgiYW55IyIgKyB1cmkpIDogImFueSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICB9Ci0KLSAgLy8gaW1wbGVtZW50cyBDTU5vZGUKLSAgLy8KLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gY29tcHV0ZU5vZGVOYW1lKG5hbWVzcGFjZVVSSSk7Ci0gIH0KLSAKLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gQU5ZX0VMRU1FTlQ7Ci0gIH0gCi0KLSAgLy8gaW1wbGVtZW50cyBDTUFueUVsZW1lbnQKLSAgLy8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfSAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1NTRiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uCi17Ci0gIHByb3RlY3RlZCBDTURhdGFUeXBlIGRhdGFUeXBlOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5vZGVOYW1lOyAgICAKLSAgcHJvdGVjdGVkIGludCB1c2FnZTsgIAotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudCBjbURvY3VtZW50OwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmVmaXhRdWFsaWZpY2F0aW9uOwotICBwcm90ZWN0ZWQgTGlzdCB4c2lUeXBlczsKLSAgICAgICAgICAgICAgICAKLSAgcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKFN0cmluZyBub2RlTmFtZSwgaW50IHVzYWdlKQotICB7Ci0gICAgdGhpcyhub2RlTmFtZSwgdXNhZ2UsIG5ldyBDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBLCAiIikpOwotICB9ICAgICAKLQotICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoU3RyaW5nIG5vZGVOYW1lLCBpbnQgdXNhZ2UsIENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsgICAgICAgIAotICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTsKLSAgICB0aGlzLnVzYWdlID0gdXNhZ2U7Ci0gICAgdGhpcy5kYXRhVHlwZSA9IGRhdGFUeXBlOyAKLSAgfSAgICAKLQotICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgewotICAgIHJldHVybiBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7ICAgCi0gICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkNNRG9jdW1lbnQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGNtRG9jdW1lbnQ7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJYU0lUeXBlcyIpKSAvLyROT04tTkxTLTEkCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICByZXN1bHQgPSB4c2lUeXBlczsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25zUHJlZml4UXVhbGlmaWNhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmVzdWx0ID0gcHJlZml4UXVhbGlmaWNhdGlvbiA/ICJxdWFsaWZpZWQiIDogInVucXVhbGlmaWVkIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfSAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcmVmaXhRdWFsaWZpY2F0aW9uKGJvb2xlYW4gcXVhbGlmaWVkKQotICB7Ci0gICAgcHJlZml4UXVhbGlmaWNhdGlvbiA9IHF1YWxpZmllZDsKLSAgfSAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgc2V0WFNJVHlwZXMoTGlzdCBsaXN0KQotICB7Ci0gICAgeHNpVHlwZXMgPSBsaXN0OwotICB9Ci0gICAgIAotICBwdWJsaWMgdm9pZCBzZXRDTURvY3VtZW50KENNRG9jdW1lbnQgY21Eb2N1bWVudCkKLSAgewotICAgIHRoaXMuY21Eb2N1bWVudCA9IGNtRG9jdW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgewotICAgIHJldHVybiBub2RlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5vZGVOYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QXR0clR5cGUoQ01EYXRhVHlwZSBkYXRhVHlwZSkKLSAgewotICAgIHRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBDTURhdGFUeXBlIGdldEF0dHJUeXBlKCkKLSAgewotICAgIHJldHVybiBkYXRhVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0VXNhZ2UoKQotICB7Ci0gICAgcmV0dXJuIHVzYWdlOwotICB9Ci0gICAgICAgICAgIAotICAvKiogQGRlcHJlY2F0ZWQgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKQotICB7Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0gICAgICAgICAgICAgICAgIAotCi0gIC8qKiBAZGVwcmVjYXRlZCAqLwotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Db250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzU3ZWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTUNvbnRlbnRJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNQ29udGVudAotewotICBwcm90ZWN0ZWQgaW50IG1pbk9jY3VyID0gMDsKLSAgcHJvdGVjdGVkIGludCBtYXhPY2N1ciA9IC0xOyAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgLy8gaW1wbGVtZW50cyBDTUNvbnRlbnQKLSAgLy8KLSAgcHVibGljIGludCBnZXRNYXhPY2N1cigpCi0gIHsKLSAgICByZXR1cm4gbWF4T2NjdXI7Ci0gIH0gICAgICAgICAgCi0gCi0gIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKQotICB7Ci0gICAgcmV0dXJuIG1pbk9jY3VyOwotICB9ICAKLSAgICAgCi0gIC8vIGltcGxlbWVudGF0aW9uIHNwZWNpZmljCi0gIC8vCi0gIHB1YmxpYyB2b2lkIHNldE1heE9jY3VyKGludCBuKQotICB7Ci0gICAgbWF4T2NjdXIgPSBuOwotICB9ICAgICAgICAgIAotIAotICBwdWJsaWMgdm9pZCBzZXRNaW5PY2N1cihpbnQgbikKLSAgewotICAgIG1pbk9jY3VyID0gbjsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTURhdGFUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRGF0YVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMDQ2MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRGF0YVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIENNRGF0YVR5cGVJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNRGF0YVR5cGUKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBkYXRhVHlwZU5hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmdbXSBlbnVtZXJhdGVkVmFsdWVzOyAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgaW5zdGFuY2VWYWx1ZTsKLQotICBwdWJsaWMgQ01EYXRhVHlwZUltcGwoU3RyaW5nIGRhdGFUeXBlTmFtZSwgU3RyaW5nIGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICB0aGlzLmRhdGFUeXBlTmFtZSA9IGRhdGFUeXBlTmFtZTsKLSAgICB0aGlzLmluc3RhbmNlVmFsdWUgPSBpbnN0YW5jZVZhbHVlOwotICAgIHRoaXMuZW51bWVyYXRlZFZhbHVlcyA9IG5ldyBTdHJpbmdbMF07Ci0gIH0KLQotICBwdWJsaWMgQ01EYXRhVHlwZUltcGwoU3RyaW5nIGRhdGFUeXBlTmFtZSwgU3RyaW5nW10gZW51bWVyYXRlZFZhbHVlcykKLSAgewotICAgIHRoaXMuZGF0YVR5cGVOYW1lID0gZGF0YVR5cGVOYW1lOwotICAgIHRoaXMuZW51bWVyYXRlZFZhbHVlcyA9IGVudW1lcmF0ZWRWYWx1ZXM7ICAgCi0gICAgdGhpcy5pbnN0YW5jZVZhbHVlID0gZW51bWVyYXRlZFZhbHVlc1swXTsKLSAgfQotCi0KLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldERhdGFUeXBlTmFtZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGRhdGFUeXBlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpCi0gIHsKLSAgICByZXR1cm4gSU1QTElFRF9WQUxVRV9OT05FOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpCi0gIHsKLSAgICByZXR1cm4gZW51bWVyYXRlZFZhbHVlczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZVZhbHVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Eb2N1bWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTURvY3VtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzc2YThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTURvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotCi0KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50SW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50Ci17Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGVsZW1lbnRzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGxvY2FsRWxlbWVudFBvb2w7Ci0gIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgYW55RWxlbWVudHM7Ci0KLSAgcHVibGljIENNRG9jdW1lbnRJbXBsKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpCi0gIHsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIERPQ1VNRU5UOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotIAotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmVzdWx0ID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0gICAgICAgICAgICAgICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0KLSAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkKLSAgewotICAgIHJldHVybiBlbGVtZW50czsKLSAgfQotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwgZ2V0QW55RWxlbWVudHMoKQotICB7IAotICAgIGlmIChhbnlFbGVtZW50cyA9PSBudWxsKQotICAgIHsKLSAgICAgIGFueUVsZW1lbnRzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICAgIH0KLSAgICByZXR1cm4gYW55RWxlbWVudHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwgZ2V0TG9jYWxFbGVtZW50UG9vbCgpCi0gIHsgCi0gICAgaWYgKGxvY2FsRWxlbWVudFBvb2wgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBsb2NhbEVsZW1lbnRQb29sID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICAgIH0gICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBsb2NhbEVsZW1lbnRQb29sOwotICB9Ci0KLSAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkKLSAgewotICAgIHJldHVybiBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gIH0KLQotICBwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzliOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLQotcHVibGljIGNsYXNzIENNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7ICAgICAgICAgIAotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudCBjbURvY3VtZW50OwotICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJpYnV0ZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBsb2NhbEVsZW1lbnRNYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gIHByb3RlY3RlZCBDTUNvbnRlbnQgY29udGVudDsKLSAgcHJvdGVjdGVkIENNRGF0YVR5cGUgZGF0YVR5cGU7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzTG9jYWw7Ci0KLSAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uSW1wbChDTURvY3VtZW50IGNtRG9jdW1lbnQsIFN0cmluZyBuYW1lKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5jbURvY3VtZW50ID0gY21Eb2N1bWVudDsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9ICAgICAKLQotICAvLyBpbXBsZW1lbnRzIENNTm9kZQotICAvLwotICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0gCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIEVMRU1FTlRfREVDTEFSQVRJT047Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsgCi0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7ICAgICAgICAgICAgICAgCi0gICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uc1ByZWZpeFF1YWxpZmljYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGlzTG9jYWwgPyAidW5xdWFsaWZpZWQiIDogInF1YWxpZmllZCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0gICAgCi0gICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiQ01Eb2N1bWVudCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmVzdWx0ID0gY21Eb2N1bWVudDsgICAgICAgCi0gICAgfSAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAgICAgICAgICAgICAgIAotICAvLyBpbXBsZW1lbnRzIENNRWxlbWVudERlY2xhcmF0aW9uCi0gIC8vCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkKLSAgewotICAgIHJldHVybiBhdHRyaWJ1dGVNYXA7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnQ7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkKLSAgewotICAgIHJldHVybiBNSVhFRDsKLSAgfSAgICAgICAgICAgIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpCi0gIHsgCi0gICAgcmV0dXJuIGRhdGFUeXBlOwotICB9Ci0KLSAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKQotICB7IAotICAgIHJldHVybiBsb2NhbEVsZW1lbnRNYXA7Ci0gIH0gCi0gICAgCi0gIC8vCi0gIC8vCi0gIHB1YmxpYyB2b2lkIHNldENvbnRlbnQoQ01Db250ZW50IGNtQ29udGVudCkKLSAgewotICAgIGNvbnRlbnQgPSBjbUNvbnRlbnQ7Ci0gIH0gICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldERhdGFUeXBlKENNRGF0YVR5cGUgY21EYXRhVHlwZSkKLSAgewotICAgIGRhdGFUeXBlID0gY21EYXRhVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwgZ2V0QXR0cmlidXRlTWFwKCkKLSAgewotICAgIHJldHVybiBhdHRyaWJ1dGVNYXA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMb2NhbChib29sZWFuIGlzTG9jYWwpCi0gIHsKLSAgICB0aGlzLmlzTG9jYWwgPSBpc0xvY2FsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUVudGl0eURlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWQ5N2ZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUVudGl0eURlY2xhcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTUVudGl0eURlY2xhcmF0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0KLSAgcHVibGljIENNRW50aXR5RGVjbGFyYXRpb25JbXBsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIEVOVElUWV9ERUNMQVJBVElPTjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLSAKLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLX0gICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUdyb3VwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YzRlY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNR3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDTUdyb3VwSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBDTUdyb3VwCi17Ci0gIHByb3RlY3RlZCBDTU5vZGVMaXN0IG5vZGVMaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGludCBvcGVyYXRvcjsgIAotCi0gIHB1YmxpYyBDTUdyb3VwSW1wbChDTU5vZGVMaXN0IG5vZGVMaXN0LCBpbnQgb3BlcmF0b3IpCi0gIHsKLSAgICB0aGlzLm5vZGVMaXN0ID0gbm9kZUxpc3Q7Ci0gICAgdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gR1JPVVA7Ci0gIH0KLSAKLSAgcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpCi0gIHsKLSAgICByZXR1cm4gbm9kZUxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE9wZXJhdG9yKCkKLSAgewotICAgIHJldHVybiBvcGVyYXRvcjsKLSAgfSAKLX0gICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5hbWVkTm9kZU1hcEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlNjNkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLQotcHVibGljIGNsYXNzIENNTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIAotewotICBwdWJsaWMgc3RhdGljIENNTmFtZWROb2RlTWFwSW1wbCBFTVBUWV9OQU1FRF9OT0RFX01BUCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvKioKLSAgICogQ01OYW1lZE5vZGVNYXBJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gICAqLwotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsKCkKLSAgewotICAJc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwoQ01OYW1lZE5vZGVNYXAgaW5pdGlhbENvbnRlbnRzTWFwKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChpbml0aWFsQ29udGVudHNNYXAgIT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IGluaXRpYWxDb250ZW50c01hcC5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKLQkJCQlwdXQoaW5pdGlhbENvbnRlbnRzTWFwLml0ZW0oaikpOwotCQkJfQotCQl9Ci0JfQotICAvKioKLSAgICogZ2V0TGVuZ3RoIG1ldGhvZAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHVibGljIGludCBnZXRMZW5ndGgoKQotICB7Ci0gIAlyZXR1cm4gdGFibGUuc2l6ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIGdldE5hbWVkSXRlbSBtZXRob2QKLSAgICogQHJldHVybiBDTU5vZGUKLSAgICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICAgKi8KLSAgcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpCi0gIHsKLSAgCXJldHVybiAoQ01Ob2RlKXRhYmxlLmdldChuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBpdGVtIG1ldGhvZAotICAgKiBAcmV0dXJuIENNTm9kZQotICAgKiBAcGFyYW0gaW5kZXggaW50Ci0gICAqLwotICBwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KQotICB7Ci0gICAgQ01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IHNpemUgPSB0YWJsZS5zaXplKCk7Ci0gICAgaWYgKGluZGV4IDwgc2l6ZSkKLSAgICB7Ci0gICAgICBFbnVtZXJhdGlvbiB2YWx1ZXMgPSB0YWJsZS5lbGVtZW50cygpOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8PSBpbmRleDsgaSsrKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAoQ01Ob2RlKXZhbHVlcy5uZXh0RWxlbWVudCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgSGFzaHRhYmxlIGdldEhhc2h0YWJsZSgpCi0gIHsKLSAgICAgICAgICByZXR1cm4gdGFibGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpCi0gIHsKLSAgICAgICAgICByZXR1cm4gdGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgfSAgICAgICAgCi0gIAotICBwdWJsaWMgdm9pZCBwdXQoQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIHRhYmxlLnB1dChjbU5vZGUuZ2V0Tm9kZU5hbWUoKSwgY21Ob2RlKTsKLSAgfQotfQotICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTJlMmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01Ob2RlCi17ICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzSW5mZXJyZWQgPSBmYWxzZTsKLSAgIAotICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgewotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0gCi0gIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gCi0KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7ICAgICAgICAgICAgICAKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoImlzSW5mZXJyZWQiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmVzdWx0ID0gaXNJbmZlcnJlZCA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0KLSAgcHVibGljIHZvaWQgc2V0SW5mZXJyZWQoYm9vbGVhbiBpc0luZmVycmVkKQotICB7Ci0gICAgdGhpcy5pc0luZmVycmVkID0gaXNJbmZlcnJlZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Ob2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjYmEzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Ob2RlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBDTU5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIENNTm9kZUxpc3QgCi17Ci0gIHB1YmxpYyBzdGF0aWMgQ01Ob2RlTGlzdEltcGwgRU1QVFlfTk9ERV9MSVNUID0gbmV3IENNTm9kZUxpc3RJbXBsKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotICBwcm90ZWN0ZWQgTGlzdCBsaXN0OwotCi0gIHB1YmxpYyBDTU5vZGVMaXN0SW1wbCgpCi0gIHsKLSAgICB0aGlzKG5ldyBWZWN0b3IoKSk7Ci0gIH0KLQotICBwdWJsaWMgQ01Ob2RlTGlzdEltcGwoTGlzdCBsaXN0KQotICB7Ci0gICAgdGhpcy5saXN0ID0gbGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBnZXRMZW5ndGggbWV0aG9kCi0gICAqIEByZXR1cm4gaW50Ci0gICAqLwotICBwdWJsaWMgaW50IGdldExlbmd0aCgpCi0gIHsKLSAgICByZXR1cm4gbGlzdC5zaXplKCk7Ci0gIH0KLSAgLyoqCi0gICAqIGl0ZW0gbWV0aG9kCi0gICAqIEByZXR1cm4gQ01Ob2RlCi0gICAqIEBwYXJhbSBpbmRleCBpbnQKLSAgICovCi0gIHB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpCi0gIHsKLSAgICByZXR1cm4gKENNTm9kZSlsaXN0LmdldChpbmRleCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldExpc3QoKQotICB7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpCi0gIHsKLSAgICByZXR1cm4gbGlzdC5pdGVyYXRvcigpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhDTU5vZGUgY21Ob2RlKQotICB7Ci0gICAgcmV0dXJuIGxpc3QuY29udGFpbnMoY21Ob2RlKTsKLSAgfSAKLSAgCi0gIHB1YmxpYyB2b2lkIGFkZChDTU5vZGUgY21Ob2RlKQotICB7Ci0gICAgbGlzdC5hZGQoY21Ob2RlKTsKLSAgfSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODRiZTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0vLyB0aGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGJ1aWxkIGEgZ3JhbW1hciBkb2N1bWVudCBnaXZlbiBhIGxvY2FsIGZpbGUgbmFtZQotLy8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudEZhY3RvcnkKLXsgICAKLSAgcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MzdiOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IKLXsKLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZkVsZW1lbnQ7Ci0gIHByaXZhdGUgQ01Eb2N1bWVudEZhY3RvcnkgZmFjdG9yeTsKLQotICBwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnkgZ2V0RmFjdG9yeSgpCi0gIHsKLSAgICBpZiAoZmFjdG9yeSA9PSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBmYWN0b3J5ID0gKENNRG9jdW1lbnRGYWN0b3J5KSBmRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiBsb2FkaW5nIENNRG9jdW1lbnRGYWN0b3J5IixlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFjdG9yeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjQwM2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkgCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5IGluc3RhbmNlOwotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBERUZBVUxUX1JFU09VUkNFX1RZUEUgPSAiKiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBNYXAgcmVzb3VyY2VUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByb3RlY3RlZCBWZWN0b3IgZG9jdW1lbnRCdWlsZGVyTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotCXB1YmxpYyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5KCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHB1dEZhY3RvcnkoU3RyaW5nIHJlc291cmNlVHlwZSwgQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yIGZhY3RvcnlEZXNjcmlwdG9yKSB7Ci0JCXJlc291cmNlVHlwZU1hcC5wdXQocmVzb3VyY2VUeXBlLCBmYWN0b3J5RGVzY3JpcHRvcik7Ci0JfQotCi0JcHVibGljIENNRG9jdW1lbnRGYWN0b3J5IGdldEZhY3RvcnkoU3RyaW5nIHJlc291cmNlVHlwZSkgewotCQlDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IgZmFjdG9yeURlc2NyaXB0b3IgPSBudWxsOwotCQlpZiAocmVzb3VyY2VUeXBlICE9IG51bGwpIHsKLQkJCWZhY3RvcnlEZXNjcmlwdG9yID0gKENNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvcikgcmVzb3VyY2VUeXBlTWFwLmdldChyZXNvdXJjZVR5cGUpOwotCQl9Ci0JCWlmIChmYWN0b3J5RGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkvLyAoZG13KSBpc3N1ZTogYSBkZWZhdWx0IHR5cGUgb2YgJyonIG1lYW5zIHdoYXQ/IHJlZ2lzdGVyZWQgYXMKLQkJCS8vICcqJyBpcyB0aGUgd2F5IHRoaXMgd29ya3Mgbm93LiBpcyB0aGF0IHRoZSBpbnRlbnQ/IE9yIHNob3VsZCBpdAotCQkJLy8gbWVhbiByZWdpc3RlcmVkIGFzIGFueSBvdGhlciB0eXBlPwotCQkJZmFjdG9yeURlc2NyaXB0b3IgPSAoQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yKSByZXNvdXJjZVR5cGVNYXAuZ2V0KERFRkFVTFRfUkVTT1VSQ0VfVFlQRSk7Ci0JCX0KLQkJcmV0dXJuIGZhY3RvcnlEZXNjcmlwdG9yICE9IG51bGwgPyBmYWN0b3J5RGVzY3JpcHRvci5nZXRGYWN0b3J5KCkgOiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4YjE5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJkb2N1bWVudEZhY3RvcmllcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRSA9ICJ0eXBlIjsgICAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBTdHJpbmcgcGx1Z2luSWQsIGV4dGVuc2lvblBvaW50SWQ7Ci0gIAotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeTsKLSAgCi0gIHB1YmxpYyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBTdHJpbmcgYnVuZGxlaWQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoYnVuZGxlaWQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0gICAgaWYgKHBvaW50ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKQotICAgIHsKLSAgICAgIFN0cmluZyBmYWN0b3J5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotICAgICAgU3RyaW5nIGZpbGVuYW1lRXh0ZW5zaW9ucyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKTsKLSAgICAgIGlmIChmYWN0b3J5Q2xhc3MgIT0gbnVsbCAmJiBmaWxlbmFtZUV4dGVuc2lvbnMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IoZWxlbWVudCk7Ci0gICAgICAgICAgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZpbGVuYW1lRXh0ZW5zaW9ucywgIiwiKTsgc3QuaGFzTW9yZVRva2VucygpOyApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgCVN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCXJlZ2lzdHJ5LnB1dEZhY3RvcnkodG9rZW4sIGRlc2NyaXB0b3IpOwkKLSAgICAgICAgICB9ICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZUluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWEzNzJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhbm5vdGF0aW9uIGZpbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmlsZUluZm8gewotCXByaXZhdGUgU3RyaW5nIGZBbm5vdGF0aW9uRmlsZUxvY2F0aW9uOwotCXByaXZhdGUgU3RyaW5nIGZCdW5kbGVJZDsKLQotCXB1YmxpYyBBbm5vdGF0aW9uRmlsZUluZm8oU3RyaW5nIGFubm90YXRpb25GaWxlTG9jYXRpb24sIFN0cmluZyBidW5kbGVJZCkgewotCQlmQW5ub3RhdGlvbkZpbGVMb2NhdGlvbiA9IGFubm90YXRpb25GaWxlTG9jYXRpb247Ci0JCWZCdW5kbGVJZCA9IGJ1bmRsZUlkOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGFubm90YXRpb24gZmlsZSBhcyBvcmlnaW5hbGx5IHNwZWNpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbkZpbGVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGZBbm5vdGF0aW9uRmlsZUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYnVuZGxlIGlkIHdoZXJlIHRoZSBhbm5vdGF0aW9uIGZpbGUgaXMgbG9jYXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnVuZGxlSWQoKSB7Ci0JCXJldHVybiBmQnVuZGxlSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvbkZpbGVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MTkxNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvbkZpbGVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmlsZVBhcnNlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEX0FOTk9UQVRJT05TID0gImFic3RyYWN0R3JhbW1hckFubm90YXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRF9BTk5PVEFUSU9OID0gImFubm90YXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEX1BST1BFUlRZID0gInByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHBhcnNlIGFuIGFubm90YXRpb24gZmlsZSBhbmQgc3RvcmUgdGhlCi0JICogY29udGVudHMgaW50byBhbiBhbm5vdGF0aW9uTWFwCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlKEFubm90YXRpb25NYXAgYW5ub3RhdGlvbk1hcCwgSW5wdXRTdHJlYW0gaW5wdXQsIEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIG1vdmUgdG8gWGVyY2VzLTIuLi4uIGFkZCAnY29udGV4dENsYXNzTG9hZGVyJyBzdHVmZgotCQlDbGFzc0xvYWRlciBwcmV2Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQl0cnkgewotCQkJU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJCVNBWFBhcnNlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dCksIG5ldyBBbm5vdGF0aW9uTWFwQ29udGVudEhhbmRsZXIoYW5ub3RhdGlvbk1hcCwgZmlsZUluZm8pKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHByZXZDbGFzc0xvYWRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcGFyc2UgYW4gYW5ub3RhdGlvbiBmaWxlIGFuZCBzdG9yZSB0aGUKLQkgKiBjb250ZW50cyBpbnRvIGFuIGFubm90YXRpb25NYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShBbm5vdGF0aW9uTWFwIG1hcCwgQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJVVJMIHVybCA9IFBsYXRmb3JtLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKGZpbGVJbmZvLmdldEJ1bmRsZUlkKCkpLCBQYXRoLmZyb21PU1N0cmluZyhmaWxlSW5mby5nZXRBbm5vdGF0aW9uRmlsZUxvY2F0aW9uKCkpKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCWlucHV0U3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCQlwYXJzZShtYXAsIGlucHV0U3RyZWFtLCBmaWxlSW5mbyk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl0aHJvdyAoZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBBbm5vdGF0aW9uTWFwQ29udGVudEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0JCXByaXZhdGUgQW5ub3RhdGlvbk1hcCBhbm5vdGF0aW9uTWFwOwotCQlwcml2YXRlIEFubm90YXRpb24gY3VycmVudEFubm90YXRpb247Ci0JCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eU5hbWU7Ci0JCXByaXZhdGUgU3RyaW5nQnVmZmVyIHByb3BlcnR5VmFsdWVCdWZmZXI7Ci0JCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCXByaXZhdGUgQW5ub3RhdGlvbkZpbGVJbmZvIGZGaWxlSW5mbzsKLQotCQlwdWJsaWMgQW5ub3RhdGlvbk1hcENvbnRlbnRIYW5kbGVyKEFubm90YXRpb25NYXAgYW5ub3RhdGlvbk1hcCwgQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvKSB7Ci0JCQl0aGlzLmFubm90YXRpb25NYXAgPSBhbm5vdGF0aW9uTWFwOwotCQkJdGhpcy5mRmlsZUluZm8gPSBmaWxlSW5mbzsKLQkJfQotCi0JCXByaXZhdGUgVVJMIGdlbmVyYXRlUHJvcGVydGllc0ZpbGVVUkwoQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvLCBTdHJpbmcgcHJvcGVydGllc0xvY2F0aW9uKSB7Ci0JCQlVUkwgcHJvcGVydGllc1VSTCA9IG51bGw7Ci0KLQkJCS8vIHByZXBlbmQgJG5sJCB2YXJpYWJsZSB0byBsb2NhdGlvbgotCQkJSVBhdGggYW5ub3RhdGlvblBhdGggPSBQYXRoLmZyb21PU1N0cmluZygiJG5sJC8iICsgZmlsZUluZm8uZ2V0QW5ub3RhdGlvbkZpbGVMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uLnhtbCBmaWxlCi0JCQlJUGF0aCBhbm5vdGF0aW9uRm9sZGVyID0gYW5ub3RhdGlvblBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJLy8gYXBwZW5kIGxvY2F0aW9uIG9mIHByb3BlcnRpbGVzIGZpbGUKLQkJCUlQYXRoIHByb3BlcnRpZXNGaWxlID0gYW5ub3RhdGlvbkZvbGRlci5hcHBlbmQocHJvcGVydGllc0xvY2F0aW9uKTsKLQkJCS8vIGFwcGVuZCAucHJvcGVydGllcyBleHRlbnNpb24gaWYgbmVlZGVkCi0JCQlpZiAocHJvcGVydGllc0ZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpID09IG51bGwpCi0JCQkJcHJvcGVydGllc0ZpbGUgPSBwcm9wZXJ0aWVzRmlsZS5hZGRGaWxlRXh0ZW5zaW9uKCJwcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGNyZWF0ZSBhIFVSTCBvdXQgb2YgdGhlIHByb3BlcnRpZXMgZmlsZSBsb2NhdGlvbgotCQkJcHJvcGVydGllc1VSTCA9IFBsYXRmb3JtLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKGZpbGVJbmZvLmdldEJ1bmRsZUlkKCkpLCBwcm9wZXJ0aWVzRmlsZSk7Ci0JCQlyZXR1cm4gcHJvcGVydGllc1VSTDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlwcm9wZXJ0eVZhbHVlQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaWYgKGxvY2FsTmFtZS5lcXVhbHMoVEFHX0lEX0FOTk9UQVRJT05TKSkgewotCQkJCWludCBhdHRyaWJ1dGVzTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNMZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0TG9jYWxOYW1lKGkpOwotCQkJCQlTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotCQkJCQlpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoInByb3BlcnRpZXNMb2NhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCVVSTCBidW5kbGVVUkwgPSBnZW5lcmF0ZVByb3BlcnRpZXNGaWxlVVJMKGZGaWxlSW5mbywgYXR0cmlidXRlVmFsdWUpOwotCQkJCQkJaWYgKGJ1bmRsZVVSTCAhPSBudWxsKSB7Ci0JCQkJCQkJSW5wdXRTdHJlYW0gYnVuZGxlU3RyZWFtID0gbnVsbDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlidW5kbGVTdHJlYW0gPSBidW5kbGVVUkwub3BlblN0cmVhbSgpOwotCQkJCQkJCQlyZXNvdXJjZUJ1bmRsZSA9IG5ldyBQcm9wZXJ0eVJlc291cmNlQnVuZGxlKGJ1bmRsZVN0cmVhbSk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAoYnVuZGxlU3RyZWFtICE9IG51bGwpCi0JCQkJCQkJCQkJYnVuZGxlU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHguZ2V0TWVzc2FnZSgpLCB4KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscygiY2FzZVNlbnNpdGl2ZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCWlmIChhdHRyaWJ1dGVWYWx1ZS50cmltKCkuZXF1YWxzKCJmYWxzZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJYW5ub3RhdGlvbk1hcC5zZXRDYXNlU2Vuc2l0aXZlKGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoVEFHX0lEX0FOTk9UQVRJT04pKSB7Ci0JCQkJY3VycmVudEFubm90YXRpb24gPSBudWxsOwotCQkJCVN0cmluZyBzcGVjVmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJzcGVjIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoc3BlY1ZhbHVlICE9IG51bGwpIHsKLQkJCQkJY3VycmVudEFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbigpOwotCQkJCQljdXJyZW50QW5ub3RhdGlvbi5zZXRTcGVjKHNwZWNWYWx1ZSk7Ci0JCQkJfQotCQkJCWFubm90YXRpb25NYXAuYWRkQW5ub3RhdGlvbihjdXJyZW50QW5ub3RhdGlvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19JRF9QUk9QRVJUWSkpIHsKLQkJCQlpZiAoY3VycmVudEFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQljdXJyZW50UHJvcGVydHlOYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJaWYgKGN1cnJlbnRQcm9wZXJ0eU5hbWUgIT0gbnVsbCAmJiBjdXJyZW50QW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlQnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKHByb3BlcnR5VmFsdWUgIT0gbnVsbCkgewotCQkJCQlpZiAocHJvcGVydHlWYWx1ZS5zdGFydHNXaXRoKCIlIikgJiYgcmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXByb3BlcnR5VmFsdWUgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcocHJvcGVydHlWYWx1ZS5zdWJzdHJpbmcoMSkpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gaWdub3JlIGFueSBleGNlcHRpb24gdGhhdCBvY2N1cnMgd2hpbGUgdHJ5aW5nCi0JCQkJCQkJLy8gdG8gZmV0Y2ggYSByZXNvdXJjZQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWN1cnJlbnRBbm5vdGF0aW9uLnNldFByb3BlcnR5KGN1cnJlbnRQcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGxvY2FsTmFtZS5lcXVhbHMoVEFHX0lEX0FOTk9UQVRJT04pKSB7Ci0JCQkJY3VycmVudEFubm90YXRpb24gPSBudWxsOwotCQkJfQotCQkJZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfSURfUFJPUEVSVFkpKSB7Ci0JCQkJY3VycmVudFByb3BlcnR5TmFtZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCQlpZiAoY3VycmVudFByb3BlcnR5TmFtZSAhPSBudWxsICYmIGN1cnJlbnRBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlwcm9wZXJ0eVZhbHVlQnVmZmVyLmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OTkxZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvbkZpbGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gYXNzb2NpYXRlIG9uZSBvciBtb3JlIGFubm90YXRpb24gZmlsZXMgd2l0aCBhIGdyYW1tYXIKLSAqIGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25GaWxlUmVnaXN0cnkgewotCXByaXZhdGUgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeSgpIHsKLQkJbmV3IEFubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXIodGhpcykucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdCBnZXRBbm5vdGF0aW9uRmlsZXNJbmZvcyhTdHJpbmcgcHVibGljSWQpIHsKLQkJTGlzdCB0aGVMaXN0ID0gKExpc3QpIG1hcC5nZXQocHVibGljSWQpOwotCQlyZXR1cm4gdGhlTGlzdCAhPSBudWxsID8gdGhlTGlzdCA6IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0JCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRBbm5vdGF0aW9uRmlsZShTdHJpbmcgcHVibGljSWQsIEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbykgewotCQlMaXN0IGZpbGVJbmZvcyA9IChMaXN0KSBtYXAuZ2V0KHB1YmxpY0lkKTsKLQkJaWYgKGZpbGVJbmZvcyA9PSBudWxsKSB7Ci0JCQlmaWxlSW5mb3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQltYXAucHV0KHB1YmxpY0lkLCBmaWxlSW5mb3MpOwotCQl9Ci0JCWZpbGVJbmZvcy5hZGQoZmlsZUluZm8pOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVBbm5vdGF0aW9uRmlsZShTdHJpbmcgcHVibGljSWQsIEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbykgewotCQlMaXN0IGZpbGVJbmZvcyA9IChMaXN0KSBtYXAuZ2V0KHB1YmxpY0lkKTsKLQkJaWYgKGZpbGVJbmZvcyAhPSBudWxsKSB7Ci0JCQlmaWxlSW5mb3MucmVtb3ZlKGZpbGVJbmZvKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3YzQyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnaW4gbWFuaWZlc3RzIGFuZCBhZGRzIGVhY2ggc3BlY2lmaWVkIGdyYW1hbXIKLSAqIGFubm90YXRpb24gZmlsZSB3aXRoIHRoZSBBbm5vdGF0aW9uUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJhbm5vdGF0aW9uRmlsZXMiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiYW5ub3RhdGlvbkZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BVQkxJQ19JRCA9ICJwdWJsaWNJZCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTE9DQVRJT04gPSAibG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFubm90YXRpb25GaWxlUmVnaXN0cnkgYW5ub3RhdGlvbkZpbGVSZWdpc3RyeTsKLQotCXB1YmxpYyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyKEFubm90YXRpb25GaWxlUmVnaXN0cnkgYW5ub3RhdGlvbkZpbGVSZWdpc3RyeSkgewotCQl0aGlzLmFubm90YXRpb25GaWxlUmVnaXN0cnkgPSBhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQocGx1Z2luSWQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJlYWRFbGVtZW50KCkgLSBwYXJzZSBhbmQgZGVhbCB3aXRoIGFuIGV4dGVuc2lvbiBsaWtlOgotCSAqIAotCSAqIDxleHRlbnNpb24KLQkgKiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsX2ltcGxlbWVudGF0aW9uIj4KLQkgKiA8dXRpbF9pbXBsZW1lbnRhdGlvbiBjbGFzcyA9Ci0JICogY29yZy5lY2xpcHNlLndzdC5iYXNldXRpbC5DTVV0aWxJbXBsZW1lbnRhdGlvbkltcGwgLz4gPC9leHRlbnNpb24+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCVN0cmluZyBwdWJsaWNJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QVUJMSUNfSUQpOwotCQkJU3RyaW5nIGxvY2F0aW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xPQ0FUSU9OKTsKLQkJCWlmIChwdWJsaWNJZCAhPSBudWxsICYmIGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgYnVuZGxlSWQgPSBlbGVtZW50LmdldE5hbWVzcGFjZSgpOwotCQkJCQlBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8gPSBuZXcgQW5ub3RhdGlvbkZpbGVJbmZvKGxvY2F0aW9uLCBidW5kbGVJZCk7Ci0JCQkJCWFubm90YXRpb25GaWxlUmVnaXN0cnkuYWRkQW5ub3RhdGlvbkZpbGUocHVibGljSWQsIGZpbGVJbmZvKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2JsZW0gYWRkaW5nIGFubm90YXRpb24gZmlsZSAiICsgbG9jYXRpb24sIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvblV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25VdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTA4OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvblV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbnRlbnRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25VdGlsaXR5IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZEFubm90YXRpb25zRm9yR3JhbW1hcihTdHJpbmcgcHVibGljSWQsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkgewotCQlMaXN0IGFubm90YXRpb25GaWxlcyA9IENvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uRmlsZXNJbmZvcyhwdWJsaWNJZCk7Ci0JCUFubm90YXRpb25NYXAgbWFwID0gKEFubm90YXRpb25NYXApIGNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImFubm90YXRpb25NYXAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGFubm90YXRpb25GaWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQl0cnkgewotCQkJCQlBbm5vdGF0aW9uRmlsZUluZm8gYW5ub3RhdGlvbkZpbGVJbmZvID0gKEFubm90YXRpb25GaWxlSW5mbykgaS5uZXh0KCk7Ci0JCQkJCUFubm90YXRpb25GaWxlUGFyc2VyIHBhcnNlciA9IG5ldyBBbm5vdGF0aW9uRmlsZVBhcnNlcigpOwotCQkJCQlwYXJzZXIucGFyc2UobWFwLCBhbm5vdGF0aW9uRmlsZUluZm8pOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9SZXNvdXJjZUJ1bmRsZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vUmVzb3VyY2VCdW5kbGVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlZWJhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9SZXNvdXJjZUJ1bmRsZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VCdW5kbGVIZWxwZXIKLXsKLSAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZShTdHJpbmcgcmVzb3VyY2VVUkksIExvY2FsZSB0YXJnZXRMb2NhbGUpIHRocm93cyBFeGNlcHRpb24KLSAgewotCSAgLy8gdHJ5IHRvIGxvYWQgYnVuZGxlIGZyb20gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiB0aGUgcmVzb3VyY2VVUkkKLSAgICAvLyB3ZSBtYWtlIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHJlc291cmNlVVJJIHBvaW50cyB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0KLSAgICAgICAgIAotICAgIGludCBpbmRleCA9IHJlc291cmNlVVJJLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgewotICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCByZXNvdXJjZVVSSSIpOyAvLyROT04tTkxTLTEkCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIC8vIEJlbG93IHdlIHNldCAncmVzb3VyY2VEaXJlY3RvcnknIHNvIHRoYXQgaXQgZW5kcyB3aXRoIGEgJy8nLgotICAgIC8vIEhlcmUncyBhbiBleGNlcnB0IGZyb20gdGhlIENsYXNzTG9hZGVyIEphdmFkb2MgLi4uCi0gICAgLy8gQW55IFVSTCB0aGF0IGVuZHMgd2l0aCBhICcvJyBpcyBhc3N1bWVkIHRvIHJlZmVyIHRvIGEgZGlyZWN0b3J5LiBPdGhlcndpc2UsIHRoZSBVUkwgaXMgYXNzdW1lZAotICAgIC8vIHRvIHJlZmVyIHRvIGEgSkFSIGZpbGUgd2hpY2ggd2lsbCBiZSBvcGVuZWQgYXMgbmVlZGVkLiAKLSAgICAvLwotICAgIFN0cmluZyByZXNvdXJjZURpcmVjdG9yeSA9IHJlc291cmNlVVJJLnN1YnN0cmluZygwLCBpbmRleCArIDEpOwotICAgIFN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUgPSByZXNvdXJjZVVSSS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAKLSAgICAvLyBjcmVhdGUgYSBjbGFzcyBsb2FkZXIgd2l0aCBhIGNsYXNzIHBhdGggdGhhdCBwb2ludHMgdG8gdGhlIHJlc291cmNlIGJ1bmRsZSdzIGxvY2F0aW9uCi0gICAgLy8gICAgICAgICAKLSAgICBVUkxbXSBjbGFzc3BhdGggPSBuZXcgVVJMWzFdOwotICAgIGNsYXNzcGF0aFswXSA9IFBsYXRmb3JtLnJlc29sdmUobmV3IFVSTChyZXNvdXJjZURpcmVjdG9yeSkpOwotCSAgQ2xhc3NMb2FkZXIgcmVzb3VyY2VMb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIoY2xhc3NwYXRoLCBudWxsKTsgCi0gICAgICAgCi0gIAlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlQnVuZGxlTmFtZSwgdGFyZ2V0TG9jYWxlLCByZXNvdXJjZUxvYWRlcik7Ci0JfSAgCi0KLSAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZShTdHJpbmcgcmVzb3VyY2VVUkkpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLQkgIHJldHVybiBnZXRSZXNvdXJjZUJ1bmRsZShyZXNvdXJjZVVSSSwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9JbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWQ4MTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9JbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01BbnlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUVsZW1lbnREZWNsYXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTm9kZUxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURlc2NyaXB0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi0gCi0KLXB1YmxpYyBjbGFzcyBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5Ci17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIEluZmVycmVkR3JhbW1hckZhY3RvcnkoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudEltcGwgY21kb2N1bWVudCA9bmV3IENNRG9jdW1lbnRJbXBsKHVyaSk7Ci0gICAgY21kb2N1bWVudC5zZXRJbmZlcnJlZCh0cnVlKTsKLSAgICByZXR1cm4gY21kb2N1bWVudDsKLSAgfSAgICAKLSAKLSAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uKENNRG9jdW1lbnQgY21Eb2N1bWVudCwgRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGlzTG9jYWwpCi0gIHsKLSAgICBTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnRJbXBsIGNtRG9jdW1lbnRJbXBsID0gKENNRG9jdW1lbnRJbXBsKWNtRG9jdW1lbnQ7Ci0KLSAgICBDTU5hbWVkTm9kZU1hcEltcGwgZWxlbWVudE1hcCA9IGlzTG9jYWwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENNTmFtZWROb2RlTWFwSW1wbCljbURvY3VtZW50SW1wbC5nZXRMb2NhbEVsZW1lbnRQb29sKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENNTmFtZWROb2RlTWFwSW1wbCljbURvY3VtZW50SW1wbC5nZXRFbGVtZW50cygpOwotCi0gICAgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uSW1wbCllbGVtZW50TWFwLmdldE5hbWVkSXRlbShsb2NhbE5hbWUpOwotICAgIGlmIChlZCA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUgZWQgIiArIGxvY2FsTmFtZSk7Ci0gICAgICBlZCA9IG5ldyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwoY21Eb2N1bWVudCwgbG9jYWxOYW1lKTsKLSAgICAgIGVkLnNldEluZmVycmVkKHRydWUpOwotICAgICAgZWQuc2V0TG9jYWwoaXNMb2NhbCk7Ci0gICAgICBlZC5zZXRNYXhPY2N1cigxKTsKLSAgICAgIENNR3JvdXBJbXBsIGdyb3VwID0gbmV3IENNR3JvdXBJbXBsKG5ldyBDTU5vZGVMaXN0SW1wbCgpLCBDTUdyb3VwLkNIT0lDRSk7Ci0gICAgICBncm91cC5zZXRJbmZlcnJlZCh0cnVlKTsKLSAgICAgIGdyb3VwLnNldE1pbk9jY3VyKDApOwotICAgICAgZ3JvdXAuc2V0TWF4T2NjdXIoLTEpOwotICAgICAgZWQuc2V0Q29udGVudChncm91cCk7ICAgICAgICAgICAgCi0gICAgICBlbGVtZW50TWFwLnB1dChlZCk7Ci0gICAgfSAKLQotICAgIC8vIGxvb2t1cCBvciBjcmVhdGUgdGhlIGF0dHJpYnV0ZXMKLSAgICAvLwotICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVNYXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICBpbnQgYXR0cmlidXRlTWFwTGVuZ3RoID0gYXR0cmlidXRlTWFwLmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlTWFwTGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgQXR0ciBhdHRyID0gKEF0dHIpYXR0cmlidXRlTWFwLml0ZW0oaSk7Ci0gICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCllZC5nZXRBdHRyaWJ1dGVNYXAoKS5nZXROYW1lZEl0ZW0oYXR0ci5nZXROb2RlTmFtZSgpKTsKLSAgICAgIGlmIChhZCA9PSBudWxsKQotICAgICAgeyAgICAgCi0gICAgICAgIC8vIHRvZG8uLi4gdXNlIGFuIGF0dHJpYnV0ZSBwb29sIHRvIGJlIG1vcmUgZWZmaWNpZW50PwotICAgICAgICBhZCA9IG5ldyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbChhdHRyLmdldE5vZGVOYW1lKCksIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotICAgICAgICBhZC5zZXRJbmZlcnJlZCh0cnVlKTsKLSAgICAgICAgZWQuZ2V0QXR0cmlidXRlTWFwKCkucHV0KGFkKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVkOwotICB9ICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ01Db250ZW50KENNRG9jdW1lbnQgcGFyZW50Q01Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWQsIENNRG9jdW1lbnQgY2hpbGRDTURvY3VtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjaGlsZEVkLCBib29sZWFuIGlzTG9jYWwsIFN0cmluZyB1cmkpCi0gIHsKLSAgICAvLyBhZGQgZWxlbWVudCB0byB0aGUgcGFyZW50J3MgY29udGVudAotICAgIC8vIGNvbnNpZGVyIGFsbCBjb250ZW50IHRvIGJlIG9mIHRoZSBmb3JtIChBIHwgQiB8IEMpKiAgICAKLSAgICAvLwotICAgIENNR3JvdXBJbXBsIGdyb3VwID0gKENNR3JvdXBJbXBsKXBhcmVudEVkLmdldENvbnRlbnQoKTsKLSAgICBDTU5vZGVMaXN0SW1wbCBncm91cENoaWxkTm9kZUxpc3QgPSAoQ01Ob2RlTGlzdEltcGwpZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotCi0gICAgaWYgKHBhcmVudENNRG9jdW1lbnQgPT0gY2hpbGRDTURvY3VtZW50KQotICAgIHsKLSAgICAgIGlmICghZ3JvdXBDaGlsZE5vZGVMaXN0LmNvbnRhaW5zKGNoaWxkRWQpKQotICAgICAgewotICAgICAgICBncm91cENoaWxkTm9kZUxpc3QuYWRkKGNoaWxkRWQpOwotICAgICAgfQotICAgICAgaWYgKGlzTG9jYWwpCi0gICAgICB7Ci0gICAgICAgIENNTmFtZWROb2RlTWFwSW1wbCBsb2NhbEVsZW1lbnRNYXAgPSAoQ01OYW1lZE5vZGVNYXBJbXBsKXBhcmVudEVkLmdldExvY2FsRWxlbWVudHMoKTsKLSAgICAgICAgbG9jYWxFbGVtZW50TWFwLnB1dChjaGlsZEVkKTsKLSAgICAgIH0KLSAgICB9ICAgICAKLSAgICBlbHNlCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIENNQW55RWxlbWVudCBjbUFueUVsZW1lbnQgPSBsb29rdXBPckNyZWF0ZUNNQW55RWxlbWVudCgoQ01Eb2N1bWVudEltcGwpcGFyZW50Q01Eb2N1bWVudCwgdXJpKTsKLSAgICAgIGlmICghZ3JvdXBDaGlsZE5vZGVMaXN0LmNvbnRhaW5zKGNtQW55RWxlbWVudCkpCi0gICAgICB7Ci0gICAgICAgIGdyb3VwQ2hpbGROb2RlTGlzdC5hZGQoY21BbnlFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9ICAgICAgCi0gIH0gICAKLQotICBwcm90ZWN0ZWQgQ01BbnlFbGVtZW50IGxvb2t1cE9yQ3JlYXRlQ01BbnlFbGVtZW50KENNRG9jdW1lbnRJbXBsIHBhcmVudENNRG9jdW1lbnQsIFN0cmluZyB1cmkpCi0gIHsKLSAgICBDTU5hbWVkTm9kZU1hcEltcGwgYW55RWxlbWVudE1hcCA9IHBhcmVudENNRG9jdW1lbnQuZ2V0QW55RWxlbWVudHMoKTsKLSAgICBDTUFueUVsZW1lbnRJbXBsIGFueUVsZW1lbnQgPSAoQ01BbnlFbGVtZW50SW1wbClhbnlFbGVtZW50TWFwLmdldE5hbWVkSXRlbShDTUFueUVsZW1lbnRJbXBsLmNvbXB1dGVOb2RlTmFtZSh1cmkpKTsKLSAgICBpZiAoYW55RWxlbWVudCA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlIGFueUVsZW1lbnQgIiArIHVyaSk7Ci0gICAgICBhbnlFbGVtZW50ID0gbmV3IENNQW55RWxlbWVudEltcGwodXJpKTsKLSAgICAgIGFueUVsZW1lbnQuc2V0SW5mZXJyZWQodHJ1ZSk7Ci0gICAgICBhbnlFbGVtZW50TWFwLnB1dChhbnlFbGVtZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIGFueUVsZW1lbnQ7Ci0gIH0gCi0gICAgICAKLQotICBwdWJsaWMgdm9pZCBkZWJ1Z1ByaW50KENvbGxlY3Rpb24gY29sbGVjdGlvbikKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpaXRlci5uZXh0KCk7IAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNtRG9jdW1lbnQgKCIgKyBjbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIikgKyIpIik7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgQ01OYW1lZE5vZGVNYXBJbXBsIGVsZW1lbnRNYXAgPSAoQ01OYW1lZE5vZGVNYXBJbXBsKWNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsKLSAgICAgIGludCBzaXplID0gZWxlbWVudE1hcC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgewotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbillbGVtZW50TWFwLml0ZW0oaSk7Ci0gICAgICAgIENNRGVzY3JpcHRpb25CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIEVMRU1FTlQgIiArIGVkLmdldE5vZGVOYW1lKCkgKyAiID0gIiArIGJ1aWxkZXIuYnVpbGREZXNjcmlwdGlvbihlZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkOTQ5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uLk1vZGVsUXVlcnlFeHRlbnNpb247Ci0KLS8qKgotICogRGVzY3JpYmVzIGFuIGV4dGVuc2lvbiB0byB0aGUgPGNvZGU+bW9kZWxRdWVyeUV4dGVuc2lvbjwvY29kZT4gZXh0ZW5zaW9uCi0gKiBwb2ludC4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRV9BVFRSSUJVVEUgPSAiY29udGVudFR5cGUiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfQVRUUklCVVRFID0gIm5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFJJQlVURSA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgY29udGVudFR5cGVJZDsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotICBwcml2YXRlIE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uOwotCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGNvbmZpZ3VyYXRpb24gPSBlbGVtZW50OwotICB9Ci0KLSAgcHVibGljIE1vZGVsUXVlcnlFeHRlbnNpb24gY3JlYXRlTW9kZWxRdWVyeUV4dGVuc2lvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwpCi0gICAgeyAgCi0gICAgICBleHRlbnNpb24gPSAoTW9kZWxRdWVyeUV4dGVuc2lvbikgY29uZmlndXJhdGlvbi5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENMQVNTX0FUVFJJQlVURSk7Ci0gICAgfSAgCi0gICAgcmV0dXJuIGV4dGVuc2lvbjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGVJZCgpCi0gIHsKLSAgICBpZiAoY29udGVudFR5cGVJZCA9PSBudWxsKQotICAgIHsKLSAgICAgIGNvbnRlbnRUeXBlSWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShDT05URU5UX1RZUEVfQVRUUklCVVRFKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbnRlbnRUeXBlSWQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoTkFNRVNQQUNFX0FUVFJJQlVURSk7Ci0gICAgfQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjMjhmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGw7Ci0gICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uLk1vZGVsUXVlcnlFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VySW1wbCBpbXBsZW1lbnRzIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyCi17ICAgICAgICAgICAKLSAgcHJvdGVjdGVkIE1vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeSBtb2RlbFF1ZXJ5RXh0ZW5zaW9uUmVnaXN0cnkgPSBuZXcgTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0KLSAgcHVibGljIExpc3QgZ2V0RGF0YVR5cGVWYWx1ZXMoRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKQotICB7ICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAKLSAgICBTdHJpbmcgY29udGVudFR5cGVJZCA9IGdldENvbnRlbnRUeXBlSWQoZWxlbWVudCk7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZShjbU5vZGUpOwotICAgIFN0cmluZyBuYW1lID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgCi0gICAgZm9yIChJdGVyYXRvciBpID0gbW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5LmdldEFwcGxpY2FibGVFeHRlbnNpb25zKGNvbnRlbnRUeXBlSWQsIG5hbWVzcGFjZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uID0gKE1vZGVsUXVlcnlFeHRlbnNpb24paS5uZXh0KCk7Ci0gICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBudWxsOwotICAgICAgaWYgKGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pCi0gICAgICB7ICAKLSAgICAgICAgdmFsdWVzID0gZXh0ZW5zaW9uLmdldEF0dHJpYnV0ZVZhbHVlcyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2YWx1ZXMgPSBleHRlbnNpb24uZ2V0RWxlbWVudFZhbHVlcyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUpOyAgICAgICAgCi0gICAgICB9Ci0gICAgICBpZiAodmFsdWVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QodmFsdWVzKSk7Ci0gICAgICB9ICAKLSAgICB9ICAKLSAgICByZXR1cm4gbGlzdDsgIAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIGZpbHRlckF2YWlsYWJsZUVsZW1lbnRDb250ZW50KExpc3QgY21ub2RlcywgRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgewotCSAgZmlsdGVyQXZhaWxhYmxlRWxlbWVudENvbnRlbnQoY21ub2RlcywgZWxlbWVudCwgZWQsIE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBmaWx0ZXJBdmFpbGFibGVFbGVtZW50Q29udGVudChMaXN0IGNtbm9kZXMsIEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucykKLSAgewotICAgIFN0cmluZyBjb250ZW50VHlwZUlkID0gZ2V0Q29udGVudFR5cGVJZChlbGVtZW50KTsKLSAgICBTdHJpbmcgcGFyZW50TmFtZXNwYWNlID0gZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQotCUxpc3QgbW9kZWxRdWVyeUV4dGVuc2lvbnMgPSBtb2RlbFF1ZXJ5RXh0ZW5zaW9uUmVnaXN0cnkuZ2V0QXBwbGljYWJsZUV4dGVuc2lvbnMoY29udGVudFR5cGVJZCwgcGFyZW50TmFtZXNwYWNlKTsKLQlpZigoaW5jbHVkZU9wdGlvbnMgJiBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVMpID4gMCkKLQl7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBjbW5vZGVzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBjbU5vZGUgPSAoQ01Ob2RlKWoubmV4dCgpOyAgCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2UoY21Ob2RlKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgIAotICAgICAgICBib29sZWFuIGluY2x1ZGUgPSB0cnVlOwotICAgICAgICBmb3IoaW50IGsgPSAwOyBrIDwgbW9kZWxRdWVyeUV4dGVuc2lvbnMuc2l6ZSgpICYmIGluY2x1ZGU7IGsrKykgewotICAgICAgICB7Ci0gICAgICAgICAgICBNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChNb2RlbFF1ZXJ5RXh0ZW5zaW9uKW1vZGVsUXVlcnlFeHRlbnNpb25zLmdldChrKTsKLSAgICAgICAgICAgIGluY2x1ZGUgPSBleHRlbnNpb24uaXNBcHBsaWNhYmxlQ2hpbGRFbGVtZW50KGVsZW1lbnQsIG5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgICAgICAgICBpZiAoIWluY2x1ZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY21Ob2RlIGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgICAgai5yZW1vdmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gYWRkIE1RRS1wcm92aWRlZCBjb250ZW50Ci0gICAgZm9yKGludCBrID0gMDsgayA8IG1vZGVsUXVlcnlFeHRlbnNpb25zLnNpemUoKTsgaysrKQotICAgIHsKLSAgICAgICAgTW9kZWxRdWVyeUV4dGVuc2lvbiBleHRlbnNpb24gPSAoTW9kZWxRdWVyeUV4dGVuc2lvbiltb2RlbFF1ZXJ5RXh0ZW5zaW9ucy5nZXQoayk7Ci0gICAgICAgIGNtbm9kZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZXh0ZW5zaW9uLmdldEF2YWlsYWJsZUVsZW1lbnRDb250ZW50KGVsZW1lbnQsIHBhcmVudE5hbWVzcGFjZSwgaW5jbHVkZU9wdGlvbnMpKSk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXROYW1lc3BhY2UoQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWNtTm9kZS5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkgICAgICAgICAgCi0gICAgeyAgICAgCi0gICAgICBuYW1lc3BhY2UgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgICAgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb250ZW50VHlwZUlkKE5vZGUgbm9kZSkKLSAgewotICAgIFN0cmluZyBjb250ZW50VHlwZUlkID0gIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICBJRE9NTm9kZSBkb21Ob2RlID0gKElET01Ob2RlKSBub2RlOwotICAgICAgY29udGVudFR5cGVJZCA9IGRvbU5vZGUuZ2V0TW9kZWwoKS5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLSAgICB9ICAgCi0gICAgcmV0dXJuIGNvbnRlbnRUeXBlSWQ7Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNjZmNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJtb2RlbFF1ZXJ5RXh0ZW5zaW9ucyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAibW9kZWxRdWVyeUV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBMaXN0IGRlc2NyaXB0b3JzOwotCi0gIHB1YmxpYyBMaXN0IGdldEFwcGxpY2FibGVFeHRlbnNpb25zKFN0cmluZyBjb250ZW50VHlwZUlkLCBTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChjb250ZW50VHlwZUlkICE9IG51bGwpCi0gICAgewotICAgICAgZW5zdXJlRXh0ZW5zaW9uc0xvYWRlZCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKE1vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlSWQuZXF1YWxzKGRlc2NyaXB0b3IuZ2V0Q29udGVudFR5cGVJZCgpKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmdldE5hbWVzcGFjZSgpID09IG51bGwgfHwgIGRlc2NyaXB0b3IuZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTW9kZWxRdWVyeUV4dGVuc2lvbiBleHRlbnNpb24gPSBkZXNjcmlwdG9yLmNyZWF0ZU1vZGVsUXVlcnlFeHRlbnNpb24oKTsKLSAgICAgICAgICAgICAgbGlzdC5hZGQoZXh0ZW5zaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAlMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ibGVtIGNyZWF0aW5nIG1vZGVsIHF1ZXJ5IGV4dGVuc2lvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIC8qCi0gICAqICBUT0RPIDogY29uc2lkZXIgcHJvdmlkaW5nIGEgbm9uLXBsdWdpbiBtZWFucyBhZGQvcmVtb3ZlIGV4dGVuc2lvbnMKLSAgICogICAKLSAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uKQotICB7ICAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUV4dGVuc2lvbihNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVwcmVjYXRlZCBleHRlbnNpb24pCi0gIHsKLSAgfSovCi0KLSAgLyoqCi0gICAqIFJlYWRzIGFsbCBleHRlbnNpb25zLgotICAgKiA8cD4KLSAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBpbiBvcmRlciB0byByZWxvYWQgZnJvbSBhIGNoYW5nZWQKLSAgICogZXh0ZW5zaW9uIHJlZ2lzdHJ5LgotICAgKiA8L3A+Ci0gICAqLwotICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlbG9hZEV4dGVuc2lvbnMoKQotICB7Ci0gICAgZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgU3RyaW5nIGJ1bmRsZWlkID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQgICAgICAKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKGJ1bmRsZWlkLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvcihlbGVtZW50c1tpXSk7Ci0gICAgICBkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZXMgdGhlIGV4dGVuc2lvbnMgaGF2ZSBiZWVuIGxvYWRlZCBhdCBsZWFzdCBvbmNlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGVuc3VyZUV4dGVuc2lvbnNMb2FkZWQoKQotICB7Ci0gICAgaWYgKGRlc2NyaXB0b3JzID09IG51bGwpCi0gICAgewotICAgICAgcmVsb2FkRXh0ZW5zaW9ucygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvQ01EYXRhVHlwZVZhbHVlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTURhdGFUeXBlVmFsdWVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5ZmE2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTURhdGFUeXBlVmFsdWVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLQotCi1wdWJsaWMgY2xhc3MgQ01EYXRhVHlwZVZhbHVlSGVscGVyCi17Ci0gIHByb3RlY3RlZCBpbnQgaWRDb3VudCA9IDA7Ci0KLQotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQsIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7Ci0gICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLSAgICAgICAKLSAgICBpZiAoaXNYU0lUeXBlKGFkKSkgICAgICAgICAKLSAgICB7ICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gZ2V0UXVhbGlmaWVkWFNJVHlwZXMoYWQsIG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgIHZhbHVlID0gbGlzdC5zaXplKCkgPiAwID8gKFN0cmluZylsaXN0LmdldCgwKSA6IG51bGw7Ci0gICAgfSAKLQotICAgIC8vIHNoYW1lbGVzcyBoYWNrCi0gICAgLy8KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoYWQuZ2V0QXR0ck5hbWUoKS5lcXVhbHMoInhtbDpsYW5nIikpICAgICAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHZhbHVlID0gIkVOIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLQotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIENNRGF0YVR5cGUgZGF0YVR5cGUgPSBhZC5nZXRBdHRyVHlwZSgpOwotICAgICAgaWYgKGRhdGFUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZhbHVlID0gZ2V0VmFsdWUoZGF0YVR5cGUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoQ01EYXRhVHlwZSBkYXRhVHlwZSkKLSAgewotICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0gICAgdmFsdWUgPSBkYXRhVHlwZS5nZXRJbXBsaWVkVmFsdWUoKTsKLQotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGRhdGFUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLSAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMCkKLSAgICAgIHsKLSAgICAgICAgdmFsdWUgPSB2YWx1ZXNbMF07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgdmFsdWUgPSBkYXRhVHlwZS5nZW5lcmF0ZUluc3RhbmNlVmFsdWUoKTsKLSAgICB9ICAgICAgICAgICAgICAgCi0KLSAgICAvLyBIZXJlIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHdlIGhhbmRsZSBEVEQncyBJRCByZWxhdGVkIGRhdGF0eXBlcy4KLSAgICAvLyBUaGVzZSB2YWx1ZXMgbXVzdCBiZSBnZW5lcmF0ZWQvdmFsaWRhdGUgYnkgY29uc2lkZXJpbmcgdGhlIGVudGlyZSB4bWwgZmlsZQotICAgIC8vIHNvIHdlIGNhbid0IHJlbHkgb24gdGhlICdnZW5lcmF0ZUluc3RhbmNlVmFsdWUnIG1ldGhvZC4KLSAgICAvLwotICAgIC8vIHRvZG8uLi4gZmluZCBhIG5pY2VyIHdheSB0byBoYW5kbGUgdGhpcyAgICAKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZGF0YVR5cGVOYW1lID0gZGF0YVR5cGUuZ2V0RGF0YVR5cGVOYW1lKCk7Ci0gICAgICBpZiAoZGF0YVR5cGVOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChkYXRhVHlwZU5hbWUuZXF1YWxzKCJJRCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9ICJpZHZhbHVlIiArIGlkQ291bnQrKzsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGRhdGFUeXBlTmFtZS5lcXVhbHMoIklEUkVGIikgfHwgZGF0YVR5cGVOYW1lLmVxdWFscygiSURSRUZTIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWUgPSAiaWR2YWx1ZTAiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0gCi0gICAgICAKLQotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkRW1wdHlWYWx1ZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKQotICB7ICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gYWQuZ2V0QXR0clR5cGUoKTsKLSAgICBpZiAoZGF0YVR5cGUgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHByb3BlcnR5VmFsdWUgPSAoU3RyaW5nKWRhdGFUeXBlLmdldFByb3BlcnR5KCJpc1ZhbGlkRW1wdHlWYWx1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAocHJvcGVydHlWYWx1ZSAhPSBudWxsICYmIHByb3BlcnR5VmFsdWUuZXF1YWxzKCJmYWxzZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgfQotICAgIH0gICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1hTSVR5cGUoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgeyAgICAgICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKGFkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ0eXBlIikpICAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpYWQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZU5hbWUgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAobmFtZXNwYWNlTmFtZSAhPSBudWxsICYmIG5hbWVzcGFjZU5hbWUuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsgICAgICAgICAgIAotICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgIAotCi0gIHB1YmxpYyBMaXN0IGdldFF1YWxpZmllZFhTSVR5cGVzKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQsIE5hbWVzcGFjZVRhYmxlIHRhYmxlKQotICB7ICAgICAgICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBMaXN0IHhzaVR5cGVzID0gKExpc3QpYWQuZ2V0UHJvcGVydHkoIlhTSVR5cGVzIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoeHNpVHlwZXMgIT0gbnVsbCAmJiB4c2lUeXBlcy5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzaVR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7IAotICAgICAgICBTdHJpbmcgdXJpUXVhbGlmaWVkTmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgIFN0cmluZ1tdIGNvbXBvbmVudHMgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VVJJUXVhbGlmaWVkTmFtZUNvbXBvbmVudHModXJpUXVhbGlmaWVkTmFtZSk7ICAKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHRhYmxlLmdldFByZWZpeEZvclVSSShjb21wb25lbnRzWzBdICE9IG51bGwgPyBjb21wb25lbnRzWzBdIDogIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSA/IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgIjoiICsgY29tcG9uZW50c1sxXSA6ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzWzFdOwotICAgICAgICBsaXN0LmFkZCh0eXBlTmFtZSk7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL0NNVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGU1NTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL0NNVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI5NzAwNSAtIFNvbWUgc3RhdGljIGNvbnN0YW50cyBub3QgbWFkZSBmaW5hbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01WaXNpdG9yOwotCi0KLQotcHVibGljIGNsYXNzIENNVmFsaWRhdG9yCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nRWxlbWVudENvbnRlbnRDb21wYXJhdG9yIHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yID0gbmV3IFN0cmluZ0VsZW1lbnRDb250ZW50Q29tcGFyYXRvcigpOwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdyYXBoTm9kZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIC8qKgotICAgKiBHcmFwaE5vZGUKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgR3JhcGhOb2RlCi0gIHsKLSAgICBwdWJsaWMgU3RyaW5nIG5hbWU7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNUZXJtaW5hbDsKLSAgICBwdWJsaWMgVmVjdG9yIGFyY0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwdWJsaWMgR3JhcGhOb2RlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQXJjKEFyYyBhcmMpCi0gICAgewotICAgICAgYXJjTGlzdC5hZGRFbGVtZW50KGFyYyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgcmV0dXJuICJbR3JhcGhOb2RlICIgKyBuYW1lICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBBcmMKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQXJjCi0gIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UICA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQRUFUICAgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTkFMID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVWX0lOICA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUX05FWFQgPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTksgICAgID0gNjsKLQotICAgIHB1YmxpYyBpbnQga2luZDsKLSAgICBwdWJsaWMgU3RyaW5nIG5hbWU7Ci0gICAgcHVibGljIEdyYXBoTm9kZSBub2RlOwotICAgIHB1YmxpYyBDTU5vZGUgY21Ob2RlOwotCi0gICAgcHVibGljIEFyYyhpbnQga2luZCwgR3JhcGhOb2RlIG5vZGUsIENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgdGhpcyhraW5kLCAiIiwgbm9kZSwgY21Ob2RlKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHByb3RlY3RlZCBBcmMoaW50IGtpbmQsIFN0cmluZyBuYW1lLCBHcmFwaE5vZGUgbm9kZSwgQ01Ob2RlIGNtTm9kZSkKLSAgICB7Ci0gICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgdGhpcy5raW5kID0ga2luZDsKLSAgICAgIHRoaXMubm9kZSA9IG5vZGU7Ci0gICAgICB0aGlzLmNtTm9kZSA9IGNtTm9kZTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHcmFwaEdlbmVyYXRvcgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBHcmFwaEdlbmVyYXRvciBleHRlbmRzIENNVmlzaXRvcgotICB7Ci0gICAgcHVibGljIGludCBpbmRlbnQ7Ci0gICAgcHVibGljIGludCBjb3VudDsKLSAgICBwdWJsaWMgR3JhcGhOb2RlIHN0YXJ0R3JhcGhOb2RlOwotICAgIHB1YmxpYyBDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENvbnRleHQKLSAgICB7Ci0gICAgICBHcmFwaE5vZGUgZnJvbTsKLSAgICAgIEdyYXBoTm9kZSB0bzsKLQotICAgICAgQ29udGV4dChHcmFwaE5vZGUgZnJvbSwgR3JhcGhOb2RlIHRvKQotICAgICAgewotICAgICAgICB0aGlzLmZyb20gPSBmcm9tOwotICAgICAgICB0aGlzLnRvID0gdG87Ci0gICAgICB9Ci0KLSAgICAgIEdyYXBoTm9kZSBnZXRMYXN0R3JhcGhOb2RlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICh0byAhPSBudWxsKSA/IHRvIDogZnJvbTsKLSAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBHcmFwaEdlbmVyYXRvcigpCi0gICAgewotICAgICAgc3RhcnRHcmFwaE5vZGUgPSBuZXcgR3JhcGhOb2RlKGdldEdyYXBoTm9kZU5hbWUoKSk7Ci0gICAgICBjb250ZXh0ID0gbmV3IENvbnRleHQoc3RhcnRHcmFwaE5vZGUsIG51bGwpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVHcmFwaChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgICB7Ci0gICAgICBpbnQgY29udGVudFR5cGUgPSBlZC5nZXRDb250ZW50VHlwZSgpOwotCi0gICAgICBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgfHwKLSAgICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKQotICAgICAgewotICAgICAgICB2aXNpdENNTm9kZShlZC5nZXRDb250ZW50KCkpOwotICAgICAgfQotICAgICAgLy8gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBLi4uIG5vIGdyYXBoIHJlcXVpcmVkCi0gICAgICAvLyBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkuLi4gbm8gZ3JhcGggcmVxdWlyZWQKLSAgICAgIGNvbnRleHQuZ2V0TGFzdEdyYXBoTm9kZSgpLmlzVGVybWluYWwgPSB0cnVlOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRHcmFwaE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIm4iICsgY291bnQrKzsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIEdyYXBoTm9kZSBnZXRTdGFydEdyYXBoTm9kZSgpCi0gICAgewotICAgICAgcmV0dXJuIHN0YXJ0R3JhcGhOb2RlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogICAgICAgICAgICAgICAgcmVwZWF0Ci0gICAgICogICAgICAgICAgICAgKy0tLS0jLS0tLS0rCi0gICAgICogICAgICAgICAgICAgfCAgICAgICAgICB8Ci0gICAgICogICAgICAgICAgICAgdiAgICAgICAgICB8Ci0gICAgICogIHByZXYgLS0jLT4gaW4gLS0neCctPiBvdXQgLS0jLT4gbmV4dAotICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KLSAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICogICstLS0tLS0tLS0tLS0tLS0tIy0tLS0tLS0tLS0tLS0tKwotICAgICAqICAgICAgICAgICAgICAgIG9wdGlvbmFsCi0gICAgICoKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBcmNzKEdyYXBoTm9kZSBpbiwgR3JhcGhOb2RlIG91dCwgQ01Db250ZW50IGNtQ29udGVudCkKLSAgICB7Ci0gICAgICBjcmVhdGVBcmNzKGluLCBvdXQsIGNtQ29udGVudCwgZmFsc2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFyY3MoR3JhcGhOb2RlIGluLCBHcmFwaE5vZGUgb3V0LCBDTUNvbnRlbnQgY21Db250ZW50LCBib29sZWFuIGlzQWxsR3JvdXApCi0gICAgewotICAgICAgLy9wcmludGxuKCIrY3JlYXRlQXJjcygpICIgKyBlZC5nZXREZXNjcmlwdGlvbigpICsgIiAiICsgZWQuZ2V0TWluT2NjdXIoKSk7Ci0gICAgICBHcmFwaE5vZGUgcHJldiA9IGNvbnRleHQuZnJvbTsKLSAgICAgIEdyYXBoTm9kZSBuZXh0ID0gbmV3IEdyYXBoTm9kZShnZXRHcmFwaE5vZGVOYW1lKCkpOwotCi0gICAgICBwcmV2LmFkZEFyYyhuZXcgQXJjKEFyYy5QUkVWX0lOLCBpbiwgY21Db250ZW50KSk7Ci0gICAgICBvdXQuYWRkQXJjKG5ldyBBcmMoQXJjLk9VVF9ORVhULCBuZXh0LCBjbUNvbnRlbnQpKTsKLQotICAgICAgaWYgKGNvbnRleHQudG8gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmV4dC5hZGRBcmMobmV3IEFyYyhBcmMuTElOSywgY29udGV4dC50bywgY21Db250ZW50KSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNvbnRleHQuZnJvbSA9IG5leHQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjbUNvbnRlbnQuZ2V0TWluT2NjdXIoKSA9PSAwKQotICAgICAgewotICAgICAgICAvLyB0b2RvLi4uIHNob3VsZCB3ZSBzZWUgaWYgYW4gb3B0aW9uYWwgYXJjIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQ/Ci0gICAgICAgIHByZXYuYWRkQXJjKG5ldyBBcmMoQXJjLk9QVElPTkFMLCBuZXh0LCBjbUNvbnRlbnQpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGNtQ29udGVudC5nZXRNYXhPY2N1cigpID09IC0xIHx8IGNtQ29udGVudC5nZXRNYXhPY2N1cigpID4gMSB8fCBpc0FsbEdyb3VwKQotICAgICAgewotICAgICAgICBvdXQuYWRkQXJjKG5ldyBBcmMoQXJjLlJFUEVBVCwgaW4sIGNtQ29udGVudCkpOwotICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZ3JvdXApCi0gICAgewotICAgICAgQ29udGV4dCBwcmV2Q29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICBHcmFwaE5vZGUgaW4gPSBuZXcgR3JhcGhOb2RlKCIoIiArIGdldEdyYXBoTm9kZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIEdyYXBoTm9kZSBvdXQgPSBuZXcgR3JhcGhOb2RlKCIpIiArIGdldEdyYXBoTm9kZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgaW50IGdyb3VwT3BlcmF0b3IgPSBncm91cC5nZXRPcGVyYXRvcigpOwotICAgICAgaWYgKGdyb3VwT3BlcmF0b3IgPT0gQ01Hcm91cC5TRVFVRU5DRSkKLSAgICAgIHsKLSAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0KGluLCBudWxsKTsKLSAgICAgICAgc3VwZXIudmlzaXRDTUdyb3VwKGdyb3VwKTsKLSAgICAgICAgY29udGV4dC5mcm9tLmFkZEFyYyhuZXcgQXJjKEFyYy5MSU5LLCBvdXQsIGdyb3VwKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChncm91cE9wZXJhdG9yID09IENNR3JvdXAuQ0hPSUNFIHx8Ci0gICAgICAgICAgICAgICBncm91cE9wZXJhdG9yID09IENNR3JvdXAuQUxMKQotICAgICAgewotICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHQoaW4sIG91dCk7Ci0gICAgICAgIHN1cGVyLnZpc2l0Q01Hcm91cChncm91cCk7Ci0gICAgICB9Ci0KLSAgICAgIGNvbnRleHQgPSBwcmV2Q29udGV4dDsKLSAgICAgIGNyZWF0ZUFyY3MoaW4sIG91dCwgZ3JvdXAsIGdyb3VwT3BlcmF0b3IgPT0gQ01Hcm91cC5BTEwpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgICB7Ci0gICAgICBHcmFwaE5vZGUgaW4gPSBuZXcgR3JhcGhOb2RlKGdldEdyYXBoTm9kZU5hbWUoKSk7Ci0gICAgICBHcmFwaE5vZGUgb3V0ID0gbmV3IEdyYXBoTm9kZShnZXRHcmFwaE5vZGVOYW1lKCkpOwotICAgICAgY3JlYXRlQXJjcyhpbiwgb3V0LCBlZCk7Ci0gICAgICBpbi5hZGRBcmMobmV3IEFyYyhBcmMuRUxFTUVOVCwgZWQuZ2V0RWxlbWVudE5hbWUoKSwgb3V0LCBlZCkpOwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICAgIHsKLSAgICAgIEdyYXBoTm9kZSBpbiA9IG5ldyBHcmFwaE5vZGUoZ2V0R3JhcGhOb2RlTmFtZSgpKTsKLSAgICAgIEdyYXBoTm9kZSBvdXQgPSBuZXcgR3JhcGhOb2RlKGdldEdyYXBoTm9kZU5hbWUoKSk7Ci0gICAgICBjcmVhdGVBcmNzKGluLCBvdXQsIGFueUVsZW1lbnQpOwotICAgICAgaW4uYWRkQXJjKG5ldyBBcmMoQXJjLkVMRU1FTlQsICJhbnkiLCBvdXQsIGFueUVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotCi0gIC8vIHRvZG8uLiBpbXBsZW1lbnQgY2FjaGUgc3RyYXRlZ3kgaG9vaywgaGFuZGxlIG5hbWUgc3BhY2VzLCBsb2NhbHMgZXRjLgotICAvLwotICBwdWJsaWMgR3JhcGhOb2RlIGxvb2t1cE9yQ3JlYXRlR3JhcGgoQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgewotICAgIE9iamVjdCBrZXkgPSBlbGVtZW50OwotICAgIEdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSlncmFwaE5vZGVUYWJsZS5nZXQoa2V5KTsKLSAgICBpZiAobm9kZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5vZGUgPSBjcmVhdGVHcmFwaChlbGVtZW50KTsKLSAgICAgIGdyYXBoTm9kZVRhYmxlLnB1dChrZXksIG5vZGUpOwotICAgIH0KLSAgICByZXR1cm4gbm9kZTsKLSAgfQotCi0gIHB1YmxpYyBHcmFwaE5vZGUgY3JlYXRlR3JhcGgoQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgewotICAgIEdyYXBoR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBHcmFwaEdlbmVyYXRvcigpOwotICAgIGdlbmVyYXRvci5nZW5lcmF0ZUdyYXBoKGVsZW1lbnQpOwotICAgIHJldHVybiBnZW5lcmF0b3IuZ2V0U3RhcnRHcmFwaE5vZGUoKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgcHJpbnRHcmFwaChHcmFwaE5vZGUgbm9kZSwgVmVjdG9yIG5hbWVkQXJjTGlzdCwgVmVjdG9yIHVuYW1lZEFyY0xpc3QsIGludCBpbmRlbnQpCi0gIHsKLSAgICAvL1N0cmluZyBkZWNvcmF0aW9uID0gbm9kZS5pc1Rlcm1pbmFsID8gIiAqIiA6ICIiOwotICAgIC8vcHJpbnRsbkluZGVudGVkKGluZGVudCwgIkdyYXBoTm9kZToiICsgbm9kZS5uYW1lICsgZGVjb3JhdGlvbik7Ci0KLSAgICBpbmRlbnQgKz0gMjsKLSAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBub2RlLmFyY0xpc3QuZWxlbWVudHMoKSA7IGUuaGFzTW9yZUVsZW1lbnRzKCkgOykKLSAgICB7Ci0gICAgICBBcmMgYXJjID0gKEFyYyllLm5leHRFbGVtZW50KCk7Ci0gICAgICAvL2Jvb2xlYW4gdmlzaXQgPSBmYWxzZTsKLSAgICAgIC8vcHJpbnRsbkluZGVudGVkKGluZGVudCwgIkFyYzoiICsgYXJjLm5hbWUgKyAiICgiICsgYXJjLmtpbmQgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgewotICAgICAgICAvL3RhYmxlLmFkZChjdXJyZW50R3JhbW1hck9iamVjdCwgYXJjLmdyYW1tYXJPYmplY3QpOwotICAgICAgICBpZiAoIW5hbWVkQXJjTGlzdC5jb250YWlucyhhcmMpKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZWRBcmNMaXN0LmFkZChhcmMpOwotICAgICAgICAgIHVuYW1lZEFyY0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgcHJpbnRHcmFwaChhcmMubm9kZSwgbmFtZWRBcmNMaXN0LCB1bmFtZWRBcmNMaXN0LCBpbmRlbnQgKyAyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIXVuYW1lZEFyY0xpc3QuY29udGFpbnMoYXJjKSkKLSAgICAgICAgewotICAgICAgICAgIHVuYW1lZEFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgICAgICAgcHJpbnRHcmFwaChhcmMubm9kZSwgbmFtZWRBcmNMaXN0LCB1bmFtZWRBcmNMaXN0LCBpbmRlbnQgKyAyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50R3JhcGgoR3JhcGhOb2RlIG5vZGUpCi0gIHsKLSAgICBwcmludEdyYXBoKG5vZGUsIG5ldyBWZWN0b3IoKSwgbmV3IFZlY3RvcigpLCAwKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgdmFsaWRhdGVFbGVtZW50TGlzdChFbGVtZW50TGlzdCBpbml0aWFsTGlzdCwgR3JhcGhOb2RlIGluaXRpYWxHcmFwaE5vZGUsIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvciBjb21wYXJhdG9yLCBSZXN1bHQgcmVzdWx0LCBib29sZWFuIGluaXRpYWxMb29wRmxhZykgewotCSAgU3RhY2sgYXJjU3RhY2sgPSBuZXcgU3RhY2soKTsKLQkgIGFyY1N0YWNrLnB1c2gobmV3IEFyY1N0YWNrSXRlbShudWxsLCBmYWxzZSkpOwotCSAgYm9vbGVhbiBsb29wRmxhZyA9IGluaXRpYWxMb29wRmxhZzsKLQkgIEVsZW1lbnRMaXN0IGVsZW1lbnRMaXN0ID0gaW5pdGlhbExpc3Q7Ci0JICBHcmFwaE5vZGUgZ3JhcGhOb2RlID0gaW5pdGlhbEdyYXBoTm9kZTsKLQkgIHdoaWxlKCFhcmNTdGFjay5pc0VtcHR5KCkgJiYgIXJlc3VsdC5pc1ZhbGlkKSB7Ci0JCSAgQXJjU3RhY2tJdGVtIHN0YWNrRWxlbWVudCA9IChBcmNTdGFja0l0ZW0pIGFyY1N0YWNrLnBlZWsoKTsKLQkJICBpZihzdGFja0VsZW1lbnQuaXNWaXNpdGVkKSB7Ci0JCQkgIGFyY1N0YWNrLnBvcCgpOwotCQkJICBpZihzdGFja0VsZW1lbnQuYXJjICE9IG51bGwpIHsKLQkJCQkgIHJlc3VsdC5wb3Aoc3RhY2tFbGVtZW50LmFyYyk7Ci0JCQkJICBjb250aW51ZTsKLQkJCSAgfQotCQkgIH0gZWxzZSB7Ci0JCQkgIHN0YWNrRWxlbWVudC5pc1Zpc2l0ZWQgPSB0cnVlOwotCQkJICByZXN1bHQucHVzaChzdGFja0VsZW1lbnQuYXJjKTsKLQkJCSAgZ3JhcGhOb2RlID0gc3RhY2tFbGVtZW50LmFyYy5ub2RlOwotCQkJICBsb29wRmxhZyA9IHN0YWNrRWxlbWVudC5sb29wRmxhZzsKLQkJICB9IAotCQkgIGlmKGVsZW1lbnRMaXN0ID09IG51bGwgJiYgZ3JhcGhOb2RlLmlzVGVybWluYWwpIHsKLQkJCSAgcmVzdWx0LmlzVmFsaWQgPSB0cnVlOwotCQkgIH0gZWxzZSB7Ci0JCQkgIGZvcihJdGVyYXRvciBhcmNJdGVyYXRvciA9IGdyYXBoTm9kZS5hcmNMaXN0Lml0ZXJhdG9yKCk7IGFyY0l0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkgIEFyYyBhcmMgPSAoQXJjKWFyY0l0ZXJhdG9yLm5leHQoKTsKLQkJCQkgIGJvb2xlYW4gdHJhdmVyc2VBcmMgPSBmYWxzZTsKLQkJCQkgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkgewotCQkJCQkgIGlmKGVsZW1lbnRMaXN0ICE9IG51bGwgJiYgY29tcGFyYXRvci5tYXRjaGVzKGVsZW1lbnRMaXN0LmhlYWQsIGFyYy5jbU5vZGUpKSB7Ci0JCQkJCQkgIGxvb3BGbGFnID0gZmFsc2U7Ci0JCQkJCQkgIHRyYXZlcnNlQXJjID0gdHJ1ZTsKLQkJCQkJCSAgZWxlbWVudExpc3QgPSBlbGVtZW50TGlzdC50YWlsOyAvLyBpbmNyZW1lbnQgb3VyIHBvc2l0aW9uIGluIHRoZSBsaXN0Ci0JCQkJCSAgfQotCQkJCSAgfSBlbHNlIGlmKGFyYy5raW5kID09IEFyYy5SRVBFQVQpIHsKLQkJCQkJICBpZighbG9vcEZsYWcpIHsKLQkJCQkJCSAgdHJhdmVyc2VBcmMgPSB0cnVlOwotCQkJCQkgIH0KLQkJCQkJICBsb29wRmxhZyA9IHRydWU7Ci0JCQkJICB9IGVsc2UgewotCQkJCQkgIHRyYXZlcnNlQXJjID0gdHJ1ZTsKLQkJCQkgIH0KLQkJCQkgIGlmKHRyYXZlcnNlQXJjKSB7Ci0JCQkJCSAgaWYgKHJlc3VsdC5jYW5QdXNoKGFyYykpIHsgLy8gdGVzdCB0byBzZWUgaWYgd2UgY2FuIHB1c2ggdGhpcyBhcmMgZHVlIHRvIGZhY2V0IGNvbnN0cmFpbnRzICAKLQkJCQkJCSAgYXJjU3RhY2sucHVzaChuZXcgQXJjU3RhY2tJdGVtKGFyYywgbG9vcEZsYWcpKTsKLQkJCQkJICB9Ci0JCQkJICB9Ci0JCQkgIH0KLQkJICB9Ci0JICB9Ci0gIH0KLSAgCi0gIAotICBwcml2YXRlIGNsYXNzIEFyY1N0YWNrSXRlbSB7Ci0JICAKLQkgIEFyYyBhcmM7Ci0JICBib29sZWFuIGxvb3BGbGFnOwotCSAgYm9vbGVhbiBpc1Zpc2l0ZWQ7Ci0JICAKLQkgIHB1YmxpYyBBcmNTdGFja0l0ZW0oQXJjIGFyYywgYm9vbGVhbiBsb29wZmxhZykgewotCQkgIHRoaXMuYXJjID0gYXJjOwotCQkgIHRoaXMubG9vcEZsYWcgPSBsb29wZmxhZzsKLQkJICB0aGlzLmlzVmlzaXRlZCA9IGFyYyA9PSBudWxsOwotCSAgfQotCi0gIH0KLQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBFbGVtZW50TGlzdCBjcmVhdGVFbGVtZW50TGlzdChpbnQgY29udGVudFR5cGUsIExpc3QgdiwgRWxlbWVudENvbnRlbnRDb21wYXJhdG9yIGNvbXBhcmF0b3IsIFJlc3VsdCByZXN1bHQpCi0gIHsKLSAgICBFbGVtZW50TGlzdCBmaXJzdCA9IG51bGw7Ci0gICAgRWxlbWVudExpc3QgcHJldiA9IG51bGw7Ci0KLSAgICBpbnQgc2l6ZSA9IHYuc2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gdi5nZXQoaSk7Ci0gICAgICBpZiAobyAhPSBudWxsICYmICFjb21wYXJhdG9yLmlzSWdub3JhYmxlKG8pKQotICAgICAgewotICAgICAgICBpZiAoY29tcGFyYXRvci5pc0VsZW1lbnQobykpCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50TGlzdCBsaXN0ID0gbmV3IEVsZW1lbnRMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5oZWFkID0gbzsKLQotICAgICAgICAgIGlmIChwcmV2ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJldi50YWlsID0gbGlzdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZpcnN0ID0gbGlzdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcHJldiA9IGxpc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5pc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgcmVzdWx0LmVycm9ySW5kZXggPSBpOwotICAgICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2UgPSAiRWxlbWVudCBjYW4gbm90IGluY2x1ZGUgUENEQVRBIGNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZpcnN0OwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBlbGVtZW50Q29udGVudCwgRWxlbWVudENvbnRlbnRDb21wYXJhdG9yIGNvbXBhcmF0b3IsIFJlc3VsdCByZXN1bHQpCi0gIHsKLSAgICBpbnQgY29udGVudFR5cGUgPSBlZC5nZXRDb250ZW50VHlwZSgpOwotCi0gICAgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8Ci0gICAgICAgIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpCi0gICAgewotICAgICAgRWxlbWVudExpc3QgZWxlbWVudExpc3QgPSBjcmVhdGVFbGVtZW50TGlzdChjb250ZW50VHlwZSwgZWxlbWVudENvbnRlbnQsIGNvbXBhcmF0b3IsIHJlc3VsdCk7Ci0gICAgICBpZiAocmVzdWx0LmlzVmFsaWQgPT0gdHJ1ZSkKLSAgICAgIHsgIAotICAgICAgICAgIGJvb2xlYW4gaXNHcmFwaFZhbGlkYXRpb25OZWVkZWQgPSAhKGVsZW1lbnRMaXN0ID09IG51bGwgJiYgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQpOwotICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIC8vIGV4cGxpY2l0bHkgaGFuZGxlICdBbGwnIGdyb3VwcwotICAgICAgICAgIC8vCi0gICAgICAgICAgQ01Db250ZW50IGNvbnRlbnQgPSBlZC5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCAmJiBjb250ZW50LmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkdST1VQKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENNR3JvdXAgZ3JvdXAgPSAoQ01Hcm91cCljb250ZW50OwotICAgICAgICAgICAgaWYgKGdyb3VwLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5BTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlzR3JhcGhWYWxpZGF0aW9uTmVlZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgIHZhbGlkYXRBbGxHcm91cENvbnRlbnQoZWxlbWVudENvbnRlbnQsIGNvbXBhcmF0b3IsIGdyb3VwLCByZXN1bHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICAgIH0gIAotICAgICAgICAgIAotICAgICAgICAgIGlmIChpc0dyYXBoVmFsaWRhdGlvbk5lZWRlZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgZWxlbWVudExpc3QgdXNpbmcgYSBncmFwaAotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHJlc3VsdC5pc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBHcmFwaE5vZGUgbm9kZSA9IGxvb2t1cE9yQ3JlYXRlR3JhcGgoZWQpOwotICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50TGlzdChlbGVtZW50TGlzdCwgbm9kZSwgY29tcGFyYXRvciwgcmVzdWx0LCBmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEpCi0gICAgewotICAgICAgaW50IHNpemUgPSBlbGVtZW50Q29udGVudC5zaXplKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBlbGVtZW50Q29udGVudC5nZXQoaSk7Ci0gICAgICAgIGlmIChjb21wYXJhdG9yLmlzRWxlbWVudChvKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5pc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgcmVzdWx0LmVycm9ySW5kZXggPSBpOwotICAgICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2UgPSAiRWxlbWVudCBtYXkgb25seSBpbmNsdWRlIFBDREFUQSBjb250ZW50IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKQotICAgIHsKLSAgICAgIGludCBzaXplID0gZWxlbWVudENvbnRlbnQuc2l6ZSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gZWxlbWVudENvbnRlbnQuZ2V0KGkpOwotICAgICAgICBpZiAoIWNvbXBhcmF0b3IuaXNJZ25vcmFibGUobykpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIHJlc3VsdC5lcnJvckluZGV4ID0gaTsKLSAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlID0gIkVsZW1lbnQgbWF5IG5vdCBjb250YWluIFBDREFUQSBvciBFbGVtZW50IGNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy9lbHNlIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkpCi0gICAgLy8gewotICAgIC8vICAgYXNzdW1lIGVsZW1lbnRDb250ZW50IHdpbGwgYWx3YXlzIGJlIHZhbGlkIGZvciB0aGlzIGNvbnRlbnQgdHlwZQotICAgIC8vIH0KLSAgfQotICAgIAotICBzdGF0aWMgY2xhc3MgSXRlbUNvdW50Ci0gIHsKLSAgICBpbnQgY291bnQgPSAwOyAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRBbGxHcm91cENvbnRlbnQoTGlzdCBlbGVtZW50Q29udGVudCwgRWxlbWVudENvbnRlbnRDb21wYXJhdG9yIGNvbXBhcmF0b3IsIENNR3JvdXAgYWxsR3JvdXAsIFJlc3VsdCByZXN1bHQpIAotICB7Ci0gICAgYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLSAgICBib29sZWFuIGlzUGFydGlhbGx5VmFsaWQgPSB0cnVlOwotICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBDTU5vZGVMaXN0IGxpc3QgPSBhbGxHcm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgZm9yIChpbnQgaiA9IGxpc3QuZ2V0TGVuZ3RoKCkgLSAxOyBqID49IDA7IGotLSkKLSAgICB7Ci0gICAgICBDTU5vZGUgbm9kZSA9IGxpc3QuaXRlbShqKTsgICAgICAKLSAgICAgIGlmIChtYXAuZ2V0KG5vZGUpID09IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgbWFwLnB1dChub2RlLCBuZXcgSXRlbUNvdW50KCkpOwotICAgICAgfSAgCi0gICAgfSAgICAKLSAgICBpbnQgdmFsaWRpdGlvbkNvdW50ID0gMDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50Q29udGVudC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgdmFsaWRpdGlvbkNvdW50KyspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsgICAgICAgIAotICAgICAgaWYgKGNvbXBhcmF0b3IuaXNFbGVtZW50KG8pKQotICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgIC8vIHRlc3QgdG8gc2VlIGlmIHRoZSBlbGVtZW50IGlzIGxpc3RlZCBpbiB0aGUgYWxsIGdyb3VwCi0gICAgICAgIC8vCi0gICAgICAgIENNTm9kZSBtYXRjaGluZ0NNTm9kZSA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGogPSBsaXN0LmdldExlbmd0aCgpIC0gMTsgaiA+PSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICBDTU5vZGUgbm9kZSA9IGxpc3QuaXRlbShqKTsKLSAgICAgICAgICBpZiAoY29tcGFyYXRvci5tYXRjaGVzKG8sIG5vZGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoaW5nQ01Ob2RlID0gbm9kZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gICAgICAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKG1hdGNoaW5nQ01Ob2RlID09IG51bGwpCi0gICAgICAgIHsgICAgIAotICAgICAgICAgIGlzUGFydGlhbGx5VmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAKLSAgICAgICAgICAvLyB0ZXN0IHRvIHNlZSB0aGF0IHRoZSBlbGVtZW50IG9jY3VycyBvbmx5IG9uY2UKLSAgICAgICAgICAvLwotICAgICAgICAgIEl0ZW1Db3VudCBpdGVtQ291bnQgPSAoSXRlbUNvdW50KW1hcC5nZXQobWF0Y2hpbmdDTU5vZGUpOwotICAgICAgICAgIGlmIChpdGVtQ291bnQgIT0gbnVsbCkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIGlmIChpdGVtQ291bnQuY291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIGFsbG93IHRvbyBtYW55IGVsZW1lbnRzIQotICAgICAgICAgICAgICAvLyB3ZSBjb25zaWRlciAnbm90IGVub3VnaCcgdG8gYmUgcGFydGlhbGx5IHZhbGlkLi4uIGJ1dCBub3QgJ3RvbyBtYW55JwotICAgICAgICAgICAgICBpc1BhcnRpYWxseVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGl0ZW1Db3VudC5jb3VudCsrOwotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgfQotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgIH0KLSAgICBpZiAoaXNWYWxpZCkKLSAgICB7ICAKLSAgICAgIGZvciAoaW50IGogPSBsaXN0LmdldExlbmd0aCgpIC0gMTsgaiA+PSAwOyBqLS0pCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBub2RlID0gbGlzdC5pdGVtKGopOyAgICAgIAotICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgICAgICB7ICAKLSAgICAgICAgICBDTUNvbnRlbnQgY29udGVudCA9IChDTUNvbnRlbnQpbm9kZTsKLSAgICAgICAgICBJdGVtQ291bnQgaXRlbUNvdW50ID0gKEl0ZW1Db3VudCltYXAuZ2V0KG5vZGUpOwotLy8gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiY29udGVudCAiICsgY29udGVudC5nZXROb2RlTmFtZSgpICsgIiAiICsgY29udGVudC5nZXRNaW5PY2N1cigpKTsKLSAgICAgICAgICBpZiAoaXRlbUNvdW50LmNvdW50IDwgY29udGVudC5nZXRNaW5PY2N1cigpKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQgJiYgaXNQYXJ0aWFsbHlWYWxpZCkKLSAgICB7Ci0gICAgICAoKEVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0KXJlc3VsdCkuc2V0UGFydGlhbFZhbGlkYXRpb25Db3VudCh2YWxpZGl0aW9uQ291bnQpOwotICAgIH0gIAotICAgIHJlc3VsdC5pc1ZhbGlkID0gaXNWYWxpZDsKLSAgfSAgCi0gIAotICAKLSAgcHVibGljIHZvaWQgZ2V0T3JpZ2luQXJyYXkoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgZWxlbWVudENvbnRlbnQsIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvciBjb21wYXJhdG9yLCBFbGVtZW50UGF0aFJlY29yZGluZ1Jlc3VsdCByZXN1bHQpCi0gIHsKLSAgICBDTU5vZGVbXSBjbU5vZGVBcnJheSA9IG51bGw7Ci0gICAgdmFsaWRhdGUoZWQsIGVsZW1lbnRDb250ZW50LCBjb21wYXJhdG9yLCByZXN1bHQpOwotICAgIGlmIChyZXN1bHQuaXNWYWxpZCkKLSAgICB7Ci0gICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gZWQuZ2V0RGF0YVR5cGUoKTsKLSAgICAgIGludCBzaXplID0gZWxlbWVudENvbnRlbnQuc2l6ZSgpOwotICAgICAgY21Ob2RlQXJyYXkgPSBuZXcgQ01Ob2RlW3NpemVdOwotICAgICAgVmVjdG9yIG9yaWdpbkxpc3QgPSByZXN1bHQuZ2V0RWxlbWVudE9yaWdpbkxpc3QoKTsKLSAgICAgIGludCBvcmlnaW5MaXN0U2l6ZSA9IG9yaWdpbkxpc3Quc2l6ZSgpOyAKLSAgICAgIGludCBvcmlnaW5MaXN0SW5kZXggPSAwOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gZWxlbWVudENvbnRlbnQuZ2V0KGkpOwotICAgICAgICBpZiAoY29tcGFyYXRvci5pc0VsZW1lbnQobykpCi0gICAgICAgIHsgICAgIAotICAgICAgICAgIGlmIChvcmlnaW5MaXN0SW5kZXggPCBvcmlnaW5MaXN0U2l6ZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjbU5vZGVBcnJheVtpXSA9IChDTU5vZGUpb3JpZ2luTGlzdC5nZXQob3JpZ2luTGlzdEluZGV4KTsKLSAgICAgICAgICAgIG9yaWdpbkxpc3RJbmRleCsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb21wYXJhdG9yLmlzUENEYXRhKG8pKQotICAgICAgICB7Ci0gICAgICAgICAgY21Ob2RlQXJyYXlbaV0gPSBkYXRhVHlwZTsKLSAgICAgICAgfQotICAgICAgICAvLyBlbHNlIHRoZSBDTU5vZGUgYXQgdGhpcyBpbmRleCBpcyBudWxsCi0gICAgICB9Ci0gICAgICByZXN1bHQuc2V0T3JpZ2luQXJyYXkoY21Ob2RlQXJyYXkpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGNvbGxlY3ROYW1lZEFyY3MoR3JhcGhOb2RlIG5vZGUsIExpc3QgbmFtZWRBcmNMaXN0LCBpbnQgaW5kZW50KQotICB7Ci0gICAgLy9wcmludGxuSW5kZW50ZWQoaW5kZW50LCAiR3JhcGhOb2RlOiIgKyBub2RlLm5hbWUgKyBkZWNvcmF0aW9uKTsKLSAgICBpbmRlbnQgKz0gMjsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBub2RlLmFyY0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCkgOykKLSAgICB7Ci0gICAgICBBcmMgYXJjID0gKEFyYylpLm5leHQoKTsKLSAgICAgIC8vcHJpbnRsbkluZGVudGVkKGluZGVudCwgIkFyYzoiICsgYXJjLm5hbWUgKyAiICgiICsgYXJjLmtpbmQgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgeyAKLSAgICAgICAgaWYgKCFuYW1lZEFyY0xpc3QuY29udGFpbnMoYXJjKSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVkQXJjTGlzdC5hZGQoYXJjKTsKLSAgICAgICAgICBjb2xsZWN0TmFtZWRBcmNzKGFyYy5ub2RlLCBuYW1lZEFyY0xpc3QsIGluZGVudCArIDIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhcmMua2luZCAhPSBBcmMuUkVQRUFUICYmIGFyYy5raW5kICE9IEFyYy5PUFRJT05BTCkKLSAgICAgIHsKLSAgICAgICAgY29sbGVjdE5hbWVkQXJjcyhhcmMubm9kZSwgbmFtZWRBcmNMaXN0LCBpbmRlbnQgKyAyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIAotICBwcml2YXRlIExpc3QgZ2V0TWF0Y2hpbmdBcmNzKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBTdHJpbmcgZWxlbWVudE5hbWUpCi0gIHsKLSAgICBMaXN0IGFyY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgR3JhcGhOb2RlIGdyYXBoTm9kZSA9IGxvb2t1cE9yQ3JlYXRlR3JhcGgoZWQpOwotICAgIGlmIChlbGVtZW50TmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIGhlcmUgd2UgYWRkIHRoZSAncm9vdCcgYXJjCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBncmFwaE5vZGUuYXJjTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKSA7KQotICAgICAgewotICAgICAgICBBcmMgYXJjID0gKEFyYylpLm5leHQoKTsKLSAgICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5QUkVWX0lOKQotICAgICAgICB7Ci0gICAgICAgICAgYXJjTGlzdC5hZGQoYXJjKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7IAotICAgICAgTGlzdCBuYW1lZEFyY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBjb2xsZWN0TmFtZWRBcmNzKGdyYXBoTm9kZSwgbmFtZWRBcmNzLCAwKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVkQXJjcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBBcmMgYXJjID0gKEFyYylpLm5leHQoKTsKLSAgICAgICAgaWYgKGFyYy5jbU5vZGUgIT0gbnVsbCAmJiBlbGVtZW50TmFtZS5lcXVhbHMoYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgYXJjTGlzdC5hZGQoYXJjKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICB9ICAgICAgCi0gICAgcmV0dXJuIGFyY0xpc3Q7Ci0gIH0KLQotICAKLSAgcHJpdmF0ZSB2b2lkIGNvbGxlY3ROZXh0U2libGluZ3MoR3JhcGhOb2RlIG5vZGUsIExpc3QgbmV4dFNpYmxpbmdMaXN0LCBMaXN0IG5hbWVkQXJjTGlzdCwgTGlzdCB1bmFtZWRBcmNMaXN0LCBpbnQgaW5kZW50KQotICB7Ci0gICAgLy9wcmludGxuSW5kZW50ZWQoaW5kZW50LCAiR3JhcGhOb2RlOiIgKyBub2RlLm5hbWUgKyBkZWNvcmF0aW9uKTsKLSAgICBpbmRlbnQgKz0gMjsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBub2RlLmFyY0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBBcmMgYXJjID0gKEFyYylpLm5leHQoKTsKLSAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgIHsgICAgICAgCi0gICAgICAgIGlmICghbmFtZWRBcmNMaXN0LmNvbnRhaW5zKGFyYykpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYXJjLmNtTm9kZSAhPSBudWxsKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgbmV4dFNpYmxpbmdMaXN0LmFkZChhcmMuY21Ob2RlKTsKLSAgICAgICAgICAgIGlmIChhcmMuY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gfHwKLSAgICAgICAgICAgICAgICBhcmMuY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFOWV9FTEVNRU5UKQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIG5hbWVkQXJjTGlzdC5hZGQoYXJjKTsKLSAgICAgICAgICAgICAgQ01Db250ZW50IGNtTm9kZSA9IChDTUNvbnRlbnQpYXJjLmNtTm9kZTsgCi0gICAgICAgICAgICAgIGlmIChjbU5vZGUuZ2V0TWluT2NjdXIoKSA9PSAwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdW5hbWVkQXJjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBjb2xsZWN0TmV4dFNpYmxpbmdzKGFyYy5ub2RlLCBuZXh0U2libGluZ0xpc3QsIG5hbWVkQXJjTGlzdCwgdW5hbWVkQXJjTGlzdCwgaW5kZW50ICsgMik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIXVuYW1lZEFyY0xpc3QuY29udGFpbnMoYXJjKSkKLSAgICAgICAgewotICAgICAgICAgIHVuYW1lZEFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgICAgICAgY29sbGVjdE5leHRTaWJsaW5ncyhhcmMubm9kZSwgbmV4dFNpYmxpbmdMaXN0LCBuYW1lZEFyY0xpc3QsIHVuYW1lZEFyY0xpc3QsIGluZGVudCArIDIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgCi0gIH0KLSAgICAKLSAgcHVibGljIENNTm9kZVtdIGdldE5leHRTaWJsaW5ncyhDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgU3RyaW5nIGVsZW1lbnROYW1lKQotICB7Ci0gICAgTGlzdCBhcmNMaXN0ID0gZ2V0TWF0Y2hpbmdBcmNzKGVkLCBlbGVtZW50TmFtZSk7Ci0gICAgTGlzdCBuZXh0U2libGluZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gYXJjTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEFyYyBhcmMgPSAoQXJjKWkubmV4dCgpOwotICAgICAgY29sbGVjdE5leHRTaWJsaW5ncyhhcmMubm9kZSwgbmV4dFNpYmxpbmdMaXN0LCBuZXcgQXJyYXlMaXN0KCksIG5ldyBBcnJheUxpc3QoKSwgMCk7ICAgICAgCi0gICAgfSAgCi0gICAgQ01Ob2RlW10gcmVzdWx0ID0gbmV3IENNTm9kZVtuZXh0U2libGluZ0xpc3Quc2l6ZSgpXTsKLSAgICBuZXh0U2libGluZ0xpc3QudG9BcnJheShyZXN1bHQpOyAgICAKLSAgICAvL1N5c3RlbS5vdXQucHJpbnQoImdldE5leHRTaWJsaW5nKCIgK2VsZW1lbnROYW1lICsgIikiKTsKLSAgICAvL2ZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQotICAgIC8vewotICAgIC8vICBTeXN0ZW0ub3V0LnByaW50KCJbIiArIHJlc3VsdFtpXS5nZXROb2RlTmFtZSgpICsgIl0iKTsKLSAgICAvL30gIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXN1bHQKLSAgewotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotICAgIHB1YmxpYyBpbnQgZXJyb3JJbmRleCA9IC0xOwotICAgIHB1YmxpYyBTdHJpbmcgZXJyb3JNZXNzYWdlOwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVwZWF0VHJhdmVyc2VkOyAvLyBkZXRlY3RzIGlmIGEgcmVwZWF0IGhhcyBiZWVuIHRyYXZlcnNlZAotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuUHVzaChBcmMgYXJjKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwdXNoKEFyYyBhcmMpCi0gICAgewotICAgICAgLy8gb3ZlcmlkZSB0aGlzIG1ldGhvZCB0byByZWNvcmQgdHJhdmVyc2VkIG5vZGVzCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIHBvcChBcmMgYXJjKQotICAgIHsKLSAgICAgIC8vIG92ZXJpZGUgdGhpcyBtZXRob2QgdG8gcmVjb3JkIHRyYXZlcnNlZCBub2RlcwotICAgIH0KLSAgICBwdWJsaWMgQ01Ob2RlW10gZ2V0T3JpZ2luQXJyYXkoKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBFbGVtZW50UGF0aFJlY29yZGluZ1Jlc3VsdCBleHRlbmRzIFJlc3VsdAotICB7ICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBhY3RpdmVJdGVtQ291bnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByb3RlY3RlZCBMaXN0IGluYWN0aXZlSXRlbUNvdW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgCi0gICAgcHJvdGVjdGVkIFZlY3RvciBlbGVtZW50T3JpZ2luU3RhY2sgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJvdGVjdGVkIENNTm9kZVtdIG9yaWdpbkFycmF5ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgaW50IHBhcnRpYWxWYWxpZGF0aW9uQ291bnQgPSAwOwotCi0gICAgCi0gICAgLy8gdGhpcyBtZXRob2QgaXMgdXNlZCB0byBzdXBwb3J0IGZhY2V0IGNvdW50cwotICAgIC8vCi0gICAgcHVibGljIGJvb2xlYW4gY2FuUHVzaChBcmMgYXJjKQotICAgIHsgICAgIAotICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOyAgICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLlJFUEVBVCkKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICBpZiAoYXJjLmNtTm9kZSBpbnN0YW5jZW9mIENNQ29udGVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDTUNvbnRlbnQgY29udGVudCA9IChDTUNvbnRlbnQpYXJjLmNtTm9kZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gd2Ugb25seSBuZWVkIHRvIGRvICdzcGVjaWFsJyBmYWNldCBjaGVja2luZyBpZiB0aGUgbWF4T2NjdXJzIGlzID4gMQotICAgICAgICAgICAgLy8gdmFsdWVzIG9mICcwJyBhbmQgJy0xJyAodW5ib3VuZGVkKSB3b3JrICdmb3IgZnJlZScgd2l0aG91dCBhbnkgc3BlY2lhbCBjaGVja2luZwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGlmIChjb250ZW50LmdldE1heE9jY3VyKCkgPiAxKQotICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgIEl0ZW1Db3VudCBpdGVtQ291bnQgPSAoSXRlbUNvdW50KWFjdGl2ZUl0ZW1Db3VudExpc3QuZ2V0KGFjdGl2ZUl0ZW1Db3VudExpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAvLyBoZXJlIHdlIG5lZWQgdG8gY29tcHV0ZSBpZiB3ZSBjYW4gZG8gYW5vdGhlciByZXBlYXQKLSAgICAgICAgICAgICAgLy8gaWYgd2UgaW5jcmVhc2UgdGhlIHJlcGVhdCBjb3VudCBieSAnMScgd2lsbCB0aGlzIHZpb2xhdGUgdGhlIG1heE9jY3VycwotICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICBpZiAoaXRlbUNvdW50LmNvdW50ICsgMSA+PSBjb250ZW50LmdldE1heE9jY3VyKCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNhblB1c2ggUkVQRUFUICgiICsgaXRlbUNvdW50LmNvdW50ICsgIikiICsgY29udGVudC5nZXROb2RlTmFtZSgpICsgIiByZXN1bHQ9ICIgKyByZXN1bHQpOyAgICAgICAgICAgIAotICAgICAgICAgIH0gCi0gICAgICAgIH0gICAgICAgCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgICAvL1N5c3RlbS5vdXQuZmx1c2goKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHB1c2goQXJjIGFyYykKLSAgICB7Ci0gICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wdXNoKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGVsZW1lbnRPcmlnaW5TdGFjay5hZGQoYXJjLmNtTm9kZSk7Ci0gICAgICAgIHBhcnRpYWxWYWxpZGF0aW9uQ291bnQgPSBNYXRoLm1heChlbGVtZW50T3JpZ2luU3RhY2suc2l6ZSgpLCBwYXJ0aWFsVmFsaWRhdGlvbkNvdW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5QUkVWX0lOKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcHVzaCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBhY3RpdmVJdGVtQ291bnRMaXN0LmFkZChuZXcgSXRlbUNvdW50KCkpOyAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLk9VVF9ORVhUKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wdXNoKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSArICJbIiArIGFyYyArICJdIik7Ci0gICAgICAgIGludCBzaXplID0gYWN0aXZlSXRlbUNvdW50TGlzdC5zaXplKCk7Ci0gICAgICAgIEl0ZW1Db3VudCBpdGVtQ291bnQgPSAoSXRlbUNvdW50KWFjdGl2ZUl0ZW1Db3VudExpc3QuZ2V0KHNpemUgLSAxKTsKLSAgICAgICAgYWN0aXZlSXRlbUNvdW50TGlzdC5yZW1vdmUoc2l6ZSAtIDEpOwotICAgICAgICBpbmFjdGl2ZUl0ZW1Db3VudExpc3QuYWRkKGl0ZW1Db3VudCk7IAotICAgICAgfSAgICAgIAotICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLlJFUEVBVCkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXB1c2goIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgSXRlbUNvdW50IGl0ZW1Db3VudCA9IChJdGVtQ291bnQpYWN0aXZlSXRlbUNvdW50TGlzdC5nZXQoYWN0aXZlSXRlbUNvdW50TGlzdC5zaXplKCkgLSAxKTsKLSAgICAgICAgaXRlbUNvdW50LmNvdW50Kys7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJyZXBlYXQoIiArIGl0ZW1Db3VudC5jb3VudCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICB9ICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3AoQXJjIGFyYykKLSAgICB7Ci0gICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wb3AoIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgaW50IHNpemUgPSBlbGVtZW50T3JpZ2luU3RhY2suc2l6ZSgpOwotICAgICAgICBlbGVtZW50T3JpZ2luU3RhY2sucmVtb3ZlKHNpemUgLSAxKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5QUkVWX0lOKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcG9wKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGFjdGl2ZUl0ZW1Db3VudExpc3QucmVtb3ZlKGFjdGl2ZUl0ZW1Db3VudExpc3Quc2l6ZSgpIC0gMSk7ICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5PVVRfTkVYVCkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXBvcCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBpbnQgc2l6ZSA9IGluYWN0aXZlSXRlbUNvdW50TGlzdC5zaXplKCk7Ci0gICAgICAgIEl0ZW1Db3VudCBpdGVtQ291bnQgPSAoSXRlbUNvdW50KWluYWN0aXZlSXRlbUNvdW50TGlzdC5nZXQoc2l6ZSAtIDEpOwotICAgICAgICBpbmFjdGl2ZUl0ZW1Db3VudExpc3QucmVtb3ZlKHNpemUgLSAxKTsKLSAgICAgICAgYWN0aXZlSXRlbUNvdW50TGlzdC5hZGQoaXRlbUNvdW50KTsgICAgIAotICAgICAgfSAgCi0gICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuUkVQRUFUKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcG9wKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIEl0ZW1Db3VudCBpdGVtQ291bnQgPSAoSXRlbUNvdW50KWFjdGl2ZUl0ZW1Db3VudExpc3QuZ2V0KGFjdGl2ZUl0ZW1Db3VudExpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgIGl0ZW1Db3VudC5jb3VudC0tOwotICAgICAgfSAgICAgCi0gICAgfQotCi0gICAgcHVibGljIFZlY3RvciBnZXRFbGVtZW50T3JpZ2luTGlzdCgpCi0gICAgewotICAgICAgcmV0dXJuIGVsZW1lbnRPcmlnaW5TdGFjazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ01Ob2RlW10gZ2V0T3JpZ2luQXJyYXkoKQotICAgIHsKLSAgICAgIHJldHVybiBvcmlnaW5BcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPcmlnaW5BcnJheShDTU5vZGVbXSBvcmlnaW5BcnJheSkKLSAgICB7Ci0gICAgICB0aGlzLm9yaWdpbkFycmF5ID0gb3JpZ2luQXJyYXk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0UGFydGlhbFZhbGlkYXRpb25Db3VudCgpCi0gICAgewotICAgICAgcmV0dXJuIHBhcnRpYWxWYWxpZGF0aW9uQ291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFydGlhbFZhbGlkYXRpb25Db3VudChpbnQgcGFydGlhbFZhbGlkYXRpb25Db3VudCkKLSAgICB7Ci0gICAgICB0aGlzLnBhcnRpYWxWYWxpZGF0aW9uQ291bnQgPSBwYXJ0aWFsVmFsaWRhdGlvbkNvdW50OwotICAgIH0KLSAgfSAgCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhdGhSZWNvcmRpbmdSZXN1bHQgZXh0ZW5kcyBSZXN1bHQKLSAgewotICAgIHByb3RlY3RlZCBWZWN0b3IgYXJjTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHB1YmxpYyB2b2lkIHB1c2goQXJjIGFyYykKLSAgICB7Ci0gICAgICBhcmNMaXN0LmFkZChhcmMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcChBcmMgYXJjKQotICAgIHsKLSAgICAgIGludCBzaXplID0gYXJjTGlzdC5zaXplKCk7Ci0gICAgICBhcmNMaXN0LnJlbW92ZShzaXplIC0gMSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QXJjTGlzdCgpCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFyY0xpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEFyYyBhcmMgPSAoQXJjKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoYXJjKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIE1hdGNoTW9kZWxOb2RlIGdldE1hdGNoTW9kZWwoKQotICAgIHsKLSAgICAgIE1hdGNoTW9kZWxOb2RlQnVpbGRlciBidWlsZGVyID0gbmV3IE1hdGNoTW9kZWxOb2RlQnVpbGRlcihhcmNMaXN0KTsKLSAgICAgIGJ1aWxkZXIuYnVpbGRNYXRjaE1vZGVsKCk7Ci0gICAgICByZXR1cm4gYnVpbGRlci5nZXRSb290KCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hdGNoTW9kZWxOb2RlCi0gIHsKLSAgICBwdWJsaWMgQ01Ob2RlIGNtTm9kZTsKLSAgICBwdWJsaWMgTGlzdCBjaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKLSAgICBwdWJsaWMgT2JqZWN0IGRhdGE7Ci0KLSAgICBwdWJsaWMgTWF0Y2hNb2RlbE5vZGUoTWF0Y2hNb2RlbE5vZGUgcGFyZW50LCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIHRoaXMuY21Ob2RlID0gY21Ob2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50TW9kZWwoaW50IGluZGVudCkKLSAgICB7Ci0gICAgICAvL1N0cmluZyBjbU5vZGVOYW1lID0gY21Ob2RlICE9IG51bGwgPyBjbU5vZGUuZ2V0Tm9kZU5hbWUoKSA6ICJudWxsIjsKLSAgICAgIC8vcHJpbnRsbkluZGVudGVkKGluZGVudCwgIk1hdGNoTW9kZWxOb2RlIDogIiArIGNtTm9kZU5hbWUpOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBNYXRjaE1vZGVsTm9kZSBjaGlsZCA9IChNYXRjaE1vZGVsTm9kZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGNoaWxkLnByaW50TW9kZWwoaW5kZW50ICsgMik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXRjaE1vZGVsTm9kZUJ1aWxkZXIKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IGFyY0xpc3Q7Ci0gICAgcHJvdGVjdGVkIExpc3Qgc3RhY2sgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJvdGVjdGVkIE1hdGNoTW9kZWxOb2RlIHJvb3Q7Ci0gICAgcHJvdGVjdGVkIE1hdGNoTW9kZWxOb2RlIGN1cnJlbnQ7Ci0KLSAgICBwdWJsaWMgTWF0Y2hNb2RlbE5vZGVCdWlsZGVyKExpc3QgYXJjTGlzdCkKLSAgICB7Ci0gICAgICB0aGlzLmFyY0xpc3QgPSBhcmNMaXN0OwotICAgICAgcm9vdCA9IG5ldyBNYXRjaE1vZGVsTm9kZShudWxsLCBudWxsKTsKLSAgICAgIHB1c2gocm9vdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHVzaChNYXRjaE1vZGVsTm9kZSBub2RlKQotICAgIHsKLSAgICAgIGN1cnJlbnQgPSBub2RlOwotICAgICAgc3RhY2suYWRkKG5vZGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvcCgpCi0gICAgewotICAgICAgaW50IHNpemUgPSBzdGFjay5zaXplKCk7Ci0gICAgICBzdGFjay5yZW1vdmUoc2l6ZSAtIDEpOwotICAgICAgY3VycmVudCA9IChNYXRjaE1vZGVsTm9kZSlzdGFjay5nZXQoc2l6ZSAtIDIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ01Hcm91cChDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIHJldHVybiBjbU5vZGUgIT0gbnVsbCAmJiBjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuR1JPVVA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYnVpbGRNYXRjaE1vZGVsKCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXJjTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQXJjIGFyYyA9IChBcmMpaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgIGN1cnJlbnQuY2hpbGRyZW4uYWRkKG5ldyBNYXRjaE1vZGVsTm9kZShjdXJyZW50LCBhcmMuY21Ob2RlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLlBSRVZfSU4pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNDTUdyb3VwKGFyYy5jbU5vZGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1hdGNoTW9kZWxOb2RlIG5ld01vZGVsTm9kZSA9IG5ldyBNYXRjaE1vZGVsTm9kZShjdXJyZW50LCBhcmMuY21Ob2RlKTsKLSAgICAgICAgICAgIGN1cnJlbnQuY2hpbGRyZW4uYWRkKG5ld01vZGVsTm9kZSk7Ci0gICAgICAgICAgICBwdXNoKG5ld01vZGVsTm9kZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5PVVRfTkVYVCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0NNR3JvdXAoYXJjLmNtTm9kZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcG9wKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5SRVBFQVQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNDTUdyb3VwKGFyYy5jbU5vZGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvcCgpOwotICAgICAgICAgICAgTWF0Y2hNb2RlbE5vZGUgbmV3TW9kZWxOb2RlID0gbmV3IE1hdGNoTW9kZWxOb2RlKGN1cnJlbnQsIGFyYy5jbU5vZGUpOwotICAgICAgICAgICAgY3VycmVudC5jaGlsZHJlbi5hZGQobmV3TW9kZWxOb2RlKTsKLSAgICAgICAgICAgIHB1c2gobmV3TW9kZWxOb2RlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWF0Y2hNb2RlbE5vZGUgZ2V0Um9vdCgpCi0gICAgewotICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudENvbnRlbnRDb21wYXJhdG9yCi0gIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0lnbm9yYWJsZShPYmplY3Qgbyk7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNQQ0RhdGEoT2JqZWN0IG8pOwotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudChPYmplY3Qgbyk7Ci0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgbywgQ01Ob2RlIGNtTm9kZSk7Ci0gIH0KLQotICAvKioKLSAgICogQSBsaW5rZWQgbGlzdAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBFbGVtZW50TGlzdAotICB7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBoZWFkOwotICAgIHByb3RlY3RlZCBFbGVtZW50TGlzdCB0YWlsOwotCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50TGlzdCBjcmVhdGUoTGlzdCB2KQotICAgIHsKLSAgICAgIEVsZW1lbnRMaXN0IGZpcnN0ID0gbnVsbDsKLSAgICAgIEVsZW1lbnRMaXN0IHByZXYgPSBudWxsOwotCi0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50TGlzdCBsaXN0ID0gbmV3IEVsZW1lbnRMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5oZWFkID0gbzsKLQotICAgICAgICAgIGlmIChwcmV2ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJldi50YWlsID0gbGlzdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZpcnN0ID0gbGlzdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcHJldiA9IGxpc3Q7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBmaXJzdDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHJpbmcgPSAiWyIgKyBoZWFkICsgIl0sIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgIGlmICh0YWlsICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHN0cmluZyArPSB0YWlsLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBzdHJpbmc7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0cmluZ0VsZW1lbnRDb250ZW50Q29tcGFyYXRvcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdFbGVtZW50Q29udGVudENvbXBhcmF0b3IgaW1wbGVtZW50cyBFbGVtZW50Q29udGVudENvbXBhcmF0b3IKLSAgewotICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JhYmxlKE9iamVjdCBvKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHJpbmcgPSBvLnRvU3RyaW5nKCk7Ci0gICAgICByZXR1cm4gc3RyaW5nLnN0YXJ0c1dpdGgoIiEiKSB8fCBzdHJpbmcuc3RhcnRzV2l0aCgiPyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BDRGF0YShPYmplY3QgbykKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyaW5nID0gby50b1N0cmluZygpOwotICAgICAgcmV0dXJuIHN0cmluZy5zdGFydHNXaXRoKCInIikgfHwgc3RyaW5nLnN0YXJ0c1dpdGgoIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudChPYmplY3QgbykKLSAgICB7Ci0gICAgICByZXR1cm4gIWlzSWdub3JhYmxlKG8pICYmICFpc1BDRGF0YShvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBvLCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICBpZiAoY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0gICAgICB7IAotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWNtTm9kZTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBvLnRvU3RyaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZigiXSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IG5hbWUuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOyAgICAgICAgCi0KLSAgICAgICAgLy8gVE9ETy4uLiBoZXJlJ3Mgd2UgY29uc2lkZXIgc3Vic3RpdHV0aW9uIGdyb3Vwcy4uLiByZXZpc2l0IHRvIHNlZSBpZiB0aGlzIHNob3VsZCBiZSBtb3ZlZCBpbnRvIHZhbGlkYXRvciBjb2RlCi0gICAgICAgIGlmICghcmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgQ01Ob2RlTGlzdCBjbU5vZGVMaXN0ID0gKENNTm9kZUxpc3QpZWxlbWVudC5nZXRQcm9wZXJ0eSgiU3Vic3RpdHV0aW9uR3JvdXAiKTsgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKGNtTm9kZUxpc3QgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY21Ob2RlTGlzdExlbmd0aCA9IGNtTm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAoY21Ob2RlTGlzdExlbmd0aCA+IDEpCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY21Ob2RlTGlzdExlbmd0aDsgaSsrKQotICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gYWx0ZXJuYXRpdmVDTUVsZW1lbnREZWNsYXJhdGlvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbiljbU5vZGVMaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFsdE5hbWUgPSBhbHRlcm5hdGl2ZUNNRWxlbWVudERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmFtZS5lcXVhbHNJZ25vcmVDYXNlKGFsdE5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAgCi0gICAgICB9ICAgCi0gICAgICBlbHNlIGlmIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQU5ZX0VMRU1FTlQpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIHN0cmluZyA9IG8udG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKHN0cmluZy5lcXVhbHMoIioiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBDTUFueUVsZW1lbnQgYW55RWxlbWVudCA9IChDTUFueUVsZW1lbnQpY21Ob2RlOwotICAgICAgICAgIFN0cmluZyBhbnlFbGVtZW50VVJJID0gYW55RWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsgICAgCi0gICAgICAgICAgaWYgKGFueUVsZW1lbnRVUkkgIT0gbnVsbCkKLSAgICAgICAgICB7ICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChhbnlFbGVtZW50VVJJLmVxdWFscygiIyNhbnkiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGFueUVsZW1lbnRVUkkuZXF1YWxzKCIjI290aGVyIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsgICAgIAotICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOyAgICAKLSAgICAgICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpYW55RWxlbWVudC5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBleGNsdWRlZFVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaWYgKGV4Y2x1ZGVkVVJJICE9IG51bGwpCi0gICAgICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBzcGVjaWZpZWRVUkkgPSBnZXRVUklGb3JDb250ZW50U3BlY2lmaWNhdGlvbihzdHJpbmcpOwotICAgICAgICAgICAgICAgICAgaWYgKHNwZWNpZmllZFVSSSAhPSBudWxsICYmIGV4Y2x1ZGVkVVJJLmVxdWFscyhzcGVjaWZpZWRVUkkpKQotICAgICAgICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIGVsc2UgaWYgKGFueUVsZW1lbnRVUkkuZXF1YWxzKCIjI3RhcmdldE5hbWVzcGFjZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWFueUVsZW1lbnQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2VVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIFN0cmluZyBzcGVjaWZpZWRVUkkgPSBnZXRVUklGb3JDb250ZW50U3BlY2lmaWNhdGlvbihzdHJpbmcpOwotICAgICAgICAgICAgICAgIGlmIChzcGVjaWZpZWRVUkkgIT0gbnVsbCAmJiAhdGFyZ2V0TmFtZXNwYWNlVVJJLmVxdWFscyhzcGVjaWZpZWRVUkkpKQotICAgICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlICAKLSAgICAgICAgICAgIHsgICAgICAgIAotICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgICBTdHJpbmcgc3BlY2lmaWVkVVJJID0gZ2V0VVJJRm9yQ29udGVudFNwZWNpZmljYXRpb24oc3RyaW5nKTsKLSAgICAgICAgICAgICAgaWYgKHNwZWNpZmllZFVSSSAhPSBudWxsICYmICFhbnlFbGVtZW50VVJJLmVxdWFscyhzcGVjaWZpZWRVUkkpKQotICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICB9ICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgICAgZWxzZSAKLSAgICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgICAKLSAgICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VVJJRm9yQ29udGVudFNwZWNpZmljYXRpb24oU3RyaW5nIHNwZWNpZmljYXRpb24pCi0gICAgeyAgICAgICAgICAgCi0gICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGludCBpbmRleCA9IHNwZWNpZmljYXRpb24uaW5kZXhPZigiXSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBzcGVjaWZpY2F0aW9uLnN1YnN0cmluZygxLCBpbmRleCk7Ci0gICAgICB9IAotICAgICAgcmV0dXJuIHJlc3VsdDsgIAotICAgIH0KLSAgfSAgICAgIAotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBjcmVhdGVTdHJpbmdMaXN0KFN0cmluZyBhcmdbXSwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gc3RhcnRJbmRleDsgaSA8IGFyZy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB2LmFkZChhcmdbaV0pOwotICAgIH0KLSAgICByZXR1cm4gdjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvRE9NVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9ET01WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGExMWEyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9ET01WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIEEgc3BlY2lhbCBDTVZhbGlkYXRvciB0aGF0IGtub3dzIGFib3V0IERPTXMKLSAqLwotcHVibGljIGNsYXNzIERPTVZhbGlkYXRvciBleHRlbmRzIENNVmFsaWRhdG9yCi17ICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKE5vZGUgbm9kZSkKLSAgeyAgIAotICAgIHJldHVybiBET01OYW1lc3BhY2VIZWxwZXIuZ2V0TmFtZXNwYWNlVVJJKG5vZGUpOwotICAgIC8vcmV0dXJuIG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gIH0KLSAgICAgICAgICAKLQotICAvLwotICAvLyBUaGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2shIQotICAvLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZhbGxiYWNrTmFtZXBhY2VVUkkoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgICAKLSAgICBTdHJpbmcgZmFsbGJhY2tOYW1lcGFjZVVSSSA9IG51bGw7Ci0gICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpZWQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgZmFsbGJhY2tOYW1lcGFjZVVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICB9ICAKLSAgICByZXR1cm4gZmFsbGJhY2tOYW1lcGFjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGUgdGhlIEVsZW1lbnQncyBOb2RlTGlzdCBhcyBhIExpc3Qgb2Ygc3RyaW5ncyB0aGF0IHRoZSB2YWxpZGF0b3IgcmVjb2duaXplcwotICAgKi8KLSAgcHVibGljIExpc3QgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGJvb2xlYW4gaXNOYW1lc3BhY2VBd2FyZSA9IGlzTmFtZXNwYWNlQXdhcmUoZWQpOwotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOyAgICAgICAgIAotICAgIGZvciAoTm9kZSBjaGlsZE5vZGUgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGROb2RlICE9IG51bGw7IGNoaWxkTm9kZSA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpKQotICAgIHsgCi0gICAgICB2LmFkZChjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbihjaGlsZE5vZGUsIGlzTmFtZXNwYWNlQXdhcmUsIGlzTmFtZXNwYWNlQXdhcmUgPyBnZXRGYWxsYmFja05hbWVwYWNlVVJJKGVkKSA6IG51bGwpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0KLQotCi0gIHB1YmxpYyBMaXN0IGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChMaXN0IG5vZGVMaXN0LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgeyAgICAgICAgICAgICAKLSAgICBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUgPSBpc05hbWVzcGFjZUF3YXJlKGVkKTsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsgICAgICAgICAgICAKLSAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBub2RlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IChOb2RlKWkubmV4dCgpOwotICAgICAgdi5hZGQoY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb24obm9kZSwgaXNOYW1lc3BhY2VBd2FyZSwgZ2V0RmFsbGJhY2tOYW1lcGFjZVVSSShlZCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbmNvZGUgdGhlIE5vZGUgYXMgYSBzdHJpbmcgdGhhdCB0aGUgdmFsaWRhdG9yIHJlY29nbml6ZXMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb24oTm9kZSBub2RlLCBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUsIFN0cmluZyBmYWxsYmFja05hbWVwYWNlVVJJKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9ICIhIjsgLy8kTk9OLU5MUy0xJAotICAgIHN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKQotICAgIHsKLSAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotICAgICAgeyAgCi0gICAgICAgIFN0cmluZyBub2RlTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsgIAotICAgICAgICBpZiAobm9kZU5hbWUuc3RhcnRzV2l0aCgianNwOiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsgIAotICAgICAgICAgIHJlc3VsdCA9ICIhIjsgLy8gdHJlYXQgaXQgYXMgYSBjb21tZW50IHNvIHRoYXQgaXQncyBpZ25vcmVkIGJ5IHRoZSB2YWxpZGF0b3IgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc05hbWVzcGFjZUF3YXJlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShub2RlTmFtZSk7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gZ2V0TmFtZXNwYWNlVVJJKG5vZGUpOwotICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSAiWyIgKyB1cmkgKyAiXSIgKyByZXN1bHQ7ICAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIGVsc2UgaWYgKGZhbGxiYWNrTmFtZXBhY2VVUkkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gIlsiICsgZmFsbGJhY2tOYW1lcGFjZVVSSSArICJdIiArIHJlc3VsdDsgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9ICAKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gbm9kZU5hbWU7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgLy9Db250ZW50TW9kZWxNYW5hZ2VyLnByaW50bG4oInJlc3VsdCAiICsgcmVzdWx0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gIj8iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9ICIhIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSAiXCIiICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIFN0cmluZyBkYXRhID0gKChUZXh0KW5vZGUpLmdldERhdGEoKTsKLSAgICAgICAgLy8gaGVyZSB3ZSB0ZXN0IHRvIHNlZSBpZiB0aGUgdGVzdCBub2RlIGlzICdpZ25vcmFibGUnCi0gICAgICAgIGlmIChkYXRhICE9IG51bGwgJiYgZGF0YS50cmltKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gIlwiIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9ICIhIjsgLy8gdG9kby4uLiB1c2UgYW5vdGhlciBzeW1ib2w/IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgTGlzdCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBzd2l0Y2ggKGNtTm9kZS5nZXROb2RlVHlwZSgpKQotICAgIHsKLSAgICAgIGNhc2UgQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gOgotICAgICAgeyAgICAgICAgIAotICAgICAgICBsaXN0LmFkZChjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkZvckNNRWxlbWVudERlY2xhcmF0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbiljbU5vZGUpKTsgICAKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIENNTm9kZS5EQVRBX1RZUEUgOgotICAgICAgewotICAgICAgICBsaXN0LmFkZCgiXCIiICsgY21Ob2RlLmdldE5vZGVOYW1lKCkgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDTU5vZGUuR1JPVVAgOgotICAgICAgewotICAgICAgICBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3RGb3JDTUdyb3VwKChDTUdyb3VwKWNtTm9kZSwgbGlzdCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDTU5vZGUuQU5ZX0VMRU1FTlQgOgotICAgICAgewotICAgICAgICBsaXN0LmFkZCgiKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdCA6Ci0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKCIhIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgICAgCi0KLSAgLyoqCi0gICAqIAotICAgKi8gICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uRm9yQ01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgIAotICAgIENNRG9jdW1lbnQgZG9jdW1lbnQgPSAoQ01Eb2N1bWVudCllZC5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIHVyaSA9IGRvY3VtZW50ICE9IG51bGwgPyAoU3RyaW5nKWRvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIikgOiBudWxsOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIHN0cmluZyA9IGVkLmdldE5vZGVOYW1lKCk7Ci0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAKLSAgICAgIHN0cmluZyA9ICJbIiArIHVyaSArICJdIiArIHN0cmluZzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIHJldHVybiBzdHJpbmc7Ci0gIH0KLSAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0Rm9yQ01Hcm91cChDTUdyb3VwIGdyb3VwLCBMaXN0IGxpc3QpCi0gIHsgICAgICAgICAKLSAgICBDTUdyb3VwQ29udGVudFZpc2l0b3IgdmlzaXRvciA9IG5ldyBDTUdyb3VwQ29udGVudFZpc2l0b3IoZ3JvdXAsIGxpc3QpOwotICAgIHZpc2l0b3IudmlzaXRDTU5vZGUoZ3JvdXApOwotICB9IAotICAgICAKLSAgcHJvdGVjdGVkIGNsYXNzIENNR3JvdXBDb250ZW50VmlzaXRvciBleHRlbmRzIENNVmlzaXRvcgotICB7ICAKLSAgICBwcm90ZWN0ZWQgQ01Hcm91cCByb290OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotICAgIHB1YmxpYyBDTUdyb3VwQ29udGVudFZpc2l0b3IoQ01Hcm91cCByb290LCBMaXN0IGxpc3QpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHRoaXMucm9vdCA9IHJvb3Q7ICAgICAgICAKLSAgICAgIHRoaXMubGlzdCA9IGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIGlmIChlZC5nZXRNaW5PY2N1cigpID4gMCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25Gb3JDTUVsZW1lbnREZWNsYXJhdGlvbihlZCkpOwotICAgICAgfQotICAgIH0gICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdENNQW55RWxlbWVudChDTUFueUVsZW1lbnQgYW55RWxlbWVudCkKLSAgICB7ICAgCi0gICAgICBsaXN0LmFkZCgiKiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZ3JvdXApCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKGdyb3VwID09IHJvb3QgfHwgZ3JvdXAuZ2V0TWluT2NjdXIoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGludCBvcCA9IGdyb3VwLmdldE9wZXJhdG9yKCk7Ci0gICAgICAgIGlmIChvcCA9PSBDTUdyb3VwLlNFUVVFTkNFKQotICAgICAgICB7Ci0gICAgICAgICAgc3VwZXIudmlzaXRDTUdyb3VwKGdyb3VwKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvcCA9PSBDTUdyb3VwLkNIT0lDRSkKLSAgICAgICAgewotICAgICAgICAgIENNTm9kZUxpc3Qgbm9kZUxpc3QgPSBncm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2aXNpdENNTm9kZShub2RlTGlzdC5pdGVtKDApKTsKLSAgICAgICAgICB9ICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7IAotICAgIHJldHVybiBlZCAhPSBudWxsID8gZWQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9pc05hbWVTcGFjZUF3YXJlIikgIT0gbnVsbCA6IGZhbHNlOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIENNTm9kZVtdIGdldE9yaWdpbkFycmF5KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBFbGVtZW50UGF0aFJlY29yZGluZ1Jlc3VsdCByZXN1bHQgPSBuZXcgRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQoKTsKLSAgICBnZXRPcmlnaW5BcnJheShlZCwgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGVsZW1lbnQsIGVkKSwgc3RyaW5nQ29udGVudENvbXBhcml0b3IsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdC5nZXRPcmlnaW5BcnJheSgpOwotICB9Ci0gICAgICAgICAgICAgICAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIE1hdGNoTW9kZWxOb2RlIGdldE1hdGNoTW9kZWwoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIE1hdGNoTW9kZWxOb2RlIG1hdGNoTW9kZWxOb2RlID0gbnVsbDsKLSAgICBQYXRoUmVjb3JkaW5nUmVzdWx0IHJlc3VsdCA9IG5ldyBQYXRoUmVjb3JkaW5nUmVzdWx0KCk7Ci0gICAgdmFsaWRhdGUoZWQsIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChlbGVtZW50LCBlZCksIHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yLCByZXN1bHQpOwotICAgIGlmIChyZXN1bHQuaXNWYWxpZCkKLSAgICB7Ci0gICAgICBtYXRjaE1vZGVsTm9kZSA9IHJlc3VsdC5nZXRNYXRjaE1vZGVsKCk7Ci0gICAgfQotICAgIHJldHVybiBtYXRjaE1vZGVsTm9kZTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIExpc3QgY2xvbmUoTGlzdCBsaXN0KQotICB7ICAgCi0gICAgTGlzdCByZXN1bHQgPSBuZXcgVmVjdG9yKGxpc3Quc2l6ZSgpKTsKLSAgICByZXN1bHQuYWRkQWxsKGxpc3QpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5JbnNlcnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbnQgaW5zZXJ0SW5kZXgsIENNTm9kZSBjbU5vZGUpCi0gIHsgICAgICAgICAgIAotICAgIExpc3QgY2xvbmVkTGlzdCA9IGNsb25lKGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCk7Ci0gICAgaW5zZXJ0KGNsb25lZExpc3QsIGluc2VydEluZGV4LCBjbU5vZGUpOwotICAgIGJvb2xlYW4gcmVzdWx0ID0gaXNQYXJ0aWFsbHlWYWxpZChlZCwgY2xvbmVkTGlzdCk7ICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5JbnNlcnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbnQgaW5zZXJ0SW5kZXgsIExpc3QgY21Ob2RlTGlzdCkKLSAgeyAgICAgICAgICAgICAgCi0gICAgTGlzdCBjbG9uZWRMaXN0ID0gY2xvbmUoY29udGVudFNwZWNpZmljYXRpb25MaXN0KTsKLSAgICBpbnNlcnQoY2xvbmVkTGlzdCwgaW5zZXJ0SW5kZXgsIGNtTm9kZUxpc3QpOwotICAgIHJldHVybiBpc1ZhbGlkKGVkLCBjbG9uZWRMaXN0KTsKLSAgfSAgCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbnQgc3RhcnRSZW1vdmVJbmRleCkKLSAgewotICAgIHJldHVybiBjYW5SZW1vdmUoZWQsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgc3RhcnRSZW1vdmVJbmRleCwgc3RhcnRSZW1vdmVJbmRleCk7Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGNhblJlbW92ZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIGludCBzdGFydFJlbW92ZUluZGV4LCBpbnQgZW5kUmVtb3ZlSW5kZXgpCi0gIHsKLSAgICBMaXN0IGNsb25lZExpc3QgPSBjbG9uZShjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgIHJlbW92ZShjbG9uZWRMaXN0LCBzdGFydFJlbW92ZUluZGV4LCBlbmRSZW1vdmVJbmRleCk7Ci0gICAgcmV0dXJuIGlzVmFsaWQoZWQsIGNsb25lZExpc3QpOwotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5SZXBsYWNlKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW50IHN0YXJ0UmVtb3ZlSW5kZXgsIGludCBlbmRSZW1vdmVJbmRleCwgQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIExpc3QgY2xvbmVkTGlzdCA9IGNsb25lKGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCk7Ci0gICAgcmVtb3ZlKGNsb25lZExpc3QsIHN0YXJ0UmVtb3ZlSW5kZXgsIGVuZFJlbW92ZUluZGV4KTsgCi0gICAgaW5zZXJ0KGNsb25lZExpc3QsIHN0YXJ0UmVtb3ZlSW5kZXgsIGNtTm9kZSk7Ci0gICAgcmV0dXJuIGlzVmFsaWQoZWQsIGNsb25lZExpc3QpOwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLyAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpCi0gIHsKLSAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdCgpOwotICAgIHZhbGlkYXRlKGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yLCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQuaXNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUGFydGlhbGx5VmFsaWQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0KQotICB7Ci0gICAgQ01WYWxpZGF0b3IuRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQgcmVzdWx0ID0gbmV3IENNVmFsaWRhdG9yLkVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0KCk7Ci0gICAgdmFsaWRhdGUoZWQsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgc3RyaW5nQ29udGVudENvbXBhcml0b3IsIHJlc3VsdCk7Ci0gICAgaW50IGNvdW50ID0gZ2V0RWxlbWVudENvdW50KGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImVsZW1lbnRPcmlnaW5MaXN0ICIgKyByZXN1bHQuZ2V0UGFydGlhbFZhbGlkYXRpb25Db3VudCgpICsgInZzIiArIGNvdW50KTsKLSAgICByZXR1cm4gcmVzdWx0LmdldFBhcnRpYWxWYWxpZGF0aW9uQ291bnQoKSA+PSBjb3VudDsKLSAgfSAgCi0gIAotICBwdWJsaWMgaW50IGdldEVsZW1lbnRDb3VudChMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCkKLSAgewotICAgIGludCBjb3VudCA9IDA7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gY29udGVudFNwZWNpZmljYXRpb25MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgaWYgKHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yLmlzRWxlbWVudChpLm5leHQoKSkpCi0gICAgICB7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICB9ICAKLSAgICB9ICAKLSAgICByZXR1cm4gY291bnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgUmVzdWx0IHZhbGlkYXRlKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdCgpOwotICAgIHZhbGlkYXRlKGVkLCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoZWxlbWVudCwgZWQpLCBzdHJpbmdDb250ZW50Q29tcGFyaXRvciwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoTGlzdCBzdHJpbmdMaXN0LCBpbnQgc3RhcnRSZW1vdmVJbmRleCwgaW50IGVuZFJlbW92ZUluZGV4KQotICB7Ci0gICAgaWYgKHN0YXJ0UmVtb3ZlSW5kZXggIT0gLTEpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0UmVtb3ZlSW5kZXg7IGkgPD0gZW5kUmVtb3ZlSW5kZXg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgc3RyaW5nTGlzdC5yZW1vdmUoaSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5zZXJ0KExpc3Qgc3RyaW5nTGlzdCwgaW50IGluc2VydEluZGV4LCBDTU5vZGUgY21Ob2RlKQotICB7Ci0gICAgaWYgKGluc2VydEluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIHN0cmluZ0xpc3QuYWRkQWxsKGluc2VydEluZGV4LCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoY21Ob2RlKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5zZXJ0KExpc3Qgc3RyaW5nTGlzdCwgaW50IGluc2VydEluZGV4LCBMaXN0IGNtTm9kZUxpc3QpCi0gIHsKLSAgICBpZiAoaW5zZXJ0SW5kZXggIT0gLTEpCi0gICAgewotICAgICAgaW50IGluc2VydExpc3RTaXplID0gY21Ob2RlTGlzdC5zaXplKCk7Ci0gICAgICBmb3IgKGludCBpID0gaW5zZXJ0TGlzdFNpemUgLSAxOyBpID49IDA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlIGNtTm9kZSA9IChDTU5vZGUpY21Ob2RlTGlzdC5nZXQoaSk7Ci0gICAgICAgIHN0cmluZ0xpc3QuYWRkQWxsKGluc2VydEluZGV4LCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoY21Ob2RlKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZiZWUyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLQotCi0vKioKLSAqIFRoZSBDTURvY3VtZW50TWFuYWdlciBjYW4gYmUgdmlzdWFsaXplZCBhcyBhIHRhYmxlIG9mIENNRG9jdW1lbnQKLSAqIHJlZmVyZW5jZXMsIGVhY2ggd2l0aCBhIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gYSBDTURvY3VtZW50IGNhY2hlLiBUaGUKLSAqIENNRG9jdW1lbnRNYW5hZ2VyIGFsc28gcGVyZm9ybXMgdGhlIHRhc2sgb2YgbG9hZGluZyBDTURvY3VtZW50cyBwcm92aWRpbmcKLSAqIHN1cHBvcnQgZm9yIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgbG9hZGluZy4KLSAqIAotICogcHVibGljSWRUYWJsZSBDTURvY3VtZW50Q2FjaGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCBwdWJsaWNJZCB8IHJlc29sdmVkVVJJIHwgLT4gfAotICogcmVzb2x2ZWRVUkkgfCBzdGF0dXMgfCBDTURvY3VtZW50IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAobnVsbCkgfCBmaWxlOi94LmR0ZCB8IHwKLSAqIGZpbGU6L3guZHRkIHwgbG9hZGluZyB8IChudWxsKSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgaHR0cDovLi4uIHwgZmlsZToveS54c2QgfCB8Ci0gKiBmaWxlOi95LnhzZCB8IGxvYWRlZCB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRNYW5hZ2VyIHsKLQkvKioKLQkgKiBUaGlzIHByb3BlcnR5IHNwZWNpZmllcyBXSEVOIENNRG9jdW1lbnRzIGFyZSBsb2FkZWQuIFNldHRpbmcgdGhpcwotCSAqIHByb3BlcnR5IHRvIHRydWUgYWxsb3dzIHRoZSBDTURvY3VtZW50TWFuYWdlciB0byBsb2FkIENNRG9jdW1lbnRzIG9uCi0JICogZGVtYW5kLiBTZXR0aW5ncyB0aGlzIHByb3BlcnR5IGEgZmFsc2UgcHV0cyB0aGUgb251cyBvbiB0aGUgY2xpZW50IHRvCi0JICogY2FsbCBhZGRDTURvY3VtZW50UmVmZXJlbmNlKCkgdG8gZXhwbGljaXR5IHRyaWdnZXIgYSBsb2FkLiBUaGlzIGFsbG93cwotCSAqIHRoZSBjbGllbnQgdG8gY29udHJvbCBleGFjdGx5IHdoZW4gbG9hZGluZyBzaG91bGQgdGFrZSBwbGFjZS4gKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FVVE9fTE9BRCA9ICJhdXRvTG9hZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoaXMgcHJvcGVydHkgc3BlY2lmaWVzIEhPVyBDTURvY3VtZW50cyBhcmUgbG9hZGVkLiBXaGVuIHNldCB0byBmYWxzZSwKLQkgKiB0aGUgZ2V0Q01Eb2N1bWVudCgpIG1ldGhvZCB3aWxsIGxvYWQgdGhlIENNRG9jdW1lbnQgc3luY2hyb25vdXNseSBhbmQKLQkgKiByZXR1cm4gYSBDTURvY3VtZW50IG9iamVjdCB3aGVuIGxvYWRpbmcgaXMgc3VjY2Vzc2Z1bC4gV2hlbiBzZXQgdG8KLQkgKiB0cnVlLCB0aGUgZ2V0Q01Eb2N1bWVudCgpIHdpbGwgbG9hZCB0aGUgQ01Eb2N1bWVudCBhc3luY2hyb25vdXNseSBhbmQKLQkgKiB3aWxsIGltbWVkaWF0ZWx5IHJldHVybiBudWxsLiBXaGVuIGxvYWRpbmcgaXMgY29tcGxldGUsIHRoZQotCSAqIENNRG9jdW1lbnRNYW5hZ2VyIHdpbGwgaW5mb3JtIGl0cyBsaXN0ZW5lcnMgdGhhdCB0aGUgQ01Eb2N1bWVudCBoYXMKLQkgKiBiZWVuIGxvYWRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BU1lOQ19MT0FEID0gImFzeW5jTG9hZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1VTRV9DQUNIRURfUkVTT0xWRURfVVJJID0gInVzZUNhY2hlZFJlc292bGVkVVJJIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzYzOTkKLQkgKiBBbGxvd3MgYSBjbGllbnQgdG8gY29udHJvbCB3aGV0aGVyIHRoZSBkb2N1bWVudCBtYW5hZ2VyIGF0dGVtcHRzIHRvIHJlc29sdmUgYQotCSAqIENNIGRvY3VtZW50J3MgVVJJLiBXaGVuIHNldCB0byBmYWxzZSwgdGhlIENNIHN5c3RlbUlEIHdpbGwgYmUgYXNzdW1lZCB0byBwb2ludAotCSAqIHRvIGFuIGFscmVhZHkgcmVzb2x2ZWQgVVJJLiBCeSBkZWZhdWx0IHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIHRydWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUEVSRk9STV9VUklfUkVTT0xVVElPTiA9ICJwZXJmb3JtVVJJUmVzb2x1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgYSBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBlbmFibGVkKTsKLQotCS8qKgotCSAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgcHJvcGVydHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyLiBMaXN0ZW5lcnMgc2hvdWxkIGV4cGVjdCB0byByZWNlaXZlIGNhbGwgYmFja3Mgb24gYQotCSAqIHNlY29uZGFyeSB0aHJlYWQgd2hlbiBhc3luY2hyb25vdXNseSBsb2FkaW5nIGlzIHVzZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBMb29rdXAgb3IgY3JlYXRlIGEgQ01Eb2N1bWVudCAoZGVwZW5kaW5nIG9uIFBST1BFUlRZX0FVVE9fTE9BRCkuCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogQHBhcmFtIHR5cGUgLQotCSAqICAgICAgICAgICAgJ2R0ZCcsICd4c2QnLCAndGxkJywgZXRjLiBpZiBudWxsIGlzIGdpdmVuIGFzIHRoZSB0eXBlLCB0aGVuCi0JICogICAgICAgICAgICB0aGUgdHlwZSBpcyBjYWxjdWxhdGVkIGFzIGxhc3Qgc2VnbWVudCAoZS5nLiBmaWxlIGV4dGVuc2lvbikKLQkgKiAgICAgICAgICAgIG9mIHRoZSByZXNvbHZlZCBVUkkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogTG9va3VwIGEgQ01Eb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHN0YXR1cyBvZiBhIENNRG9jdW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRDTURvY3VtZW50U3RhdHVzKFN0cmluZyBwdWJsaWNJZCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgQ01Eb2N1bWVudCBhbmQgYWRkcyB0aGUgYXNzb2NpYXRlZCBDTURvY3VtZW50IHJlZmVyZW5jZQotCSAqIGluZm9ybWF0aW9uIHRvIHRoZSB0YWJsZS4gQ2FsbGluZyB0aGlzIG1ldGhvZCBhbHdheXMgdHJpZ2dlcnMgYQotCSAqIENNRG9jdW1lbnQgbG9hZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDTURvY3VtZW50UmVmZXJlbmNlKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBBZGQgYW4gZXhpc3RpbmdDTURvY3VtZW50IGFuZCB0aGUgcmVmZXJlbmNlIGluZm9ybWF0aW9uIHRvIHRoZSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgcmVzb2x2ZWRVUkksIFN0cmluZyB0eXBlLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpOwotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20gdGhlIHRhYmxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbFJlZmVyZW5jZXMoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgQ01Eb2N1bWVudENhY2hlIHRoYXQgaXMgdXNlZCB0byBzdG9yZSBsb2FkZWQgQ01Eb2N1bWVudHMgYW5kCi0JICogYXNzb2NpYXRlZCBzdGF0dXMuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoKTsKLQotCS8qKgotCSAqIEJ1aWxkcyBhIENNRG9jdW1lbnQgZ2l2ZW4gYSByZXNvdWx2ZWRVUkkuIE5vdGUgdGhhdCBubyBlbnRyaWVzIGFyZQotCSAqIGFkZGVkIHRvIHRoZSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgcmVzb2x2ZWRVUkksIFN0cmluZyB0eXBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2MDdkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZUxpc3RlbmVyOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBleHRlbmRzIENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyCi17ICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKENNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyLCBTdHJpbmcgcHJvcGVydHlOYW1lKTsKLX0gICAgICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50UmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNTdmNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRSZWZlcmVuY2UKLXsKLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpOwotICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2RjOGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLSAKLS8qKgotICogVGhlIGludGVyZmFjZSBpcyB1c2VkIHRvIGFic3RyYWN0IHRoZSB0YXNrIG9mIGNvbXB1dGluZyB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBET00KLSAqIG9yIGEgcGFydGljdWxhciBub2RlIHdpdGhpbiB0aGUgRE9NLiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyCi17Ci0gIExpc3QgZ2V0Q01Eb2N1bWVudFJlZmVyZW5jZXMoTm9kZSBub2RlLCBib29sZWFuIGRlZXApOwotICBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDMwMGU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBwZXJmb3JtaW5nIGhpZ2hlciBsZXZlbCBxdWVyaWVzIGJhc2VkIG9uCi0gKiBhIHhtbCBtb2RlbCAoRE9NKSBhbmQgb25lIG9yIG1vcmUgYXNzb2NpYXRlZCBjb250ZW50IG1vZGVscyAoQ01Eb2N1bWVudCkuCi0gKgotICogVGhlIHF1ZXJpZXMgcHJvdmlkZWQgY2FuIGJlIG9yZ2FuaXplZCBpbnRvIHRocmVlIGdyb3VwczoKLSAqCi0gKiAxKSBET00gTm9kZSB0byBDTU5vZGUgbWFwcGluZwotICogICAgICBHaXZlbiBhIGdyYW1tYXRpY2FsbHkgdmFsaWQgRE9NIE5vZGUgdGhlIGNvcnJlc3BvbmRpbmcgQ01Ob2RlIGNhbiBiZSBkZXRlcm1pbmVkLgotICogICAgICAoaS5lLiBFbGVtZW50IC0+IENNRWxlbWVudERlY2xhcmF0aW9uLCBBdHRyIC0+IENNQXR0cmlidXRlRGVjbGFyYXRpb24sIENoYXJhY3RlckRhdGEgLT4gQ01EYXRhVHlwZSkKLSAqCi0gKiAyKSBET00gZWRpdGluZyB0ZXN0cyAoIkNhbiBJIGRvIHRoaXM/IikKLSAqICAgICAgUXVlc3Rpb25zIHN1Y2ggYXMgY2FuSW5zZXJ0LCBjYW5SZW1vdmUsIGNhblJlcGxhY2UgY2FuIGFzc2lzdCBpbiB0aGUgZWRpdGluZyBvZiBhIERPTS4KLSAqCi0gKiAgICAgIFRoZSB2YWxpZGl0eUNoZWNraW5nIGFyZ3VtZW50IGRldGVybWluZXMgdGhlIHN0cmljdG5lc3Mgb2YgdGhlIHZhbGlkaXR5IHRlc3RpbmcgdGhhdCBvY2N1cnMuCi0gKgotICogICAgICAtIFZBTElESVRZX05PTkUgICAgOiBUaGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBFbGVtZW50IGlzIGlnbm9yZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgdGhlIGNvbnRlbnQgbW9kZWwgaXMgY29uc2lkZXJlZC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBtb3N0IHVzZWZ1bCBmb3IgY29kZWFzc2lzdCByZWxhdGVkIHF1ZXJpZXMuCi0gKgotICogICAgICAtIFZBTElESVRZX1NUUklDVCAgOiBUaGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBFbGVtZW50IGlzIGNvbnNpZGVyZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybnMgdHJ1ZSBvbmx5IGlmIHRoZSBvcGVyYXRpb24gcHJlc2VydmVzIGNvbnRlbnQgdmFsaWRpdHkuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIHdoZW4gRE9NIGVkaXRpbmcgbmVlZHMgdG8gYmUgY29uc3RyYWluZWQgdG8gbWFpbnRhaW4gdmFsaWRpdHkuCi0gKgotICogICAgICAtIFZBTElESVRZX1BBUlRJQUwgOiBTb21lIG9wdGltaXplZCBjb21wcm9taXNlIGJldHdlZW4gdGhlIHR3byBvcHRpb25zIGFib3ZlLgotICoKLSAqIDMpIERPTSBlZGl0aW5nIGFjdGlvbnMgKCJXaGF0IGNhbiBJIGRvIGhlcmU/IikKLSAqICAgICAgVGhlc2UgbWV0aG9kcyByZXR1cm4gTW9kZWxRdWVyeUFjdGlvbnMgdGhhdCBhcmUgcmVsZXZhbnQgYXQgc29tZSBzcGVjaWZpZWQgRE9NIE5vZGUuCi0gKiAgICAgIFRoZSBhY3Rpb25zIGluZGljYXRlIHdoYXQga2luZHMgb2YgRE9NIE5vZGUgY2FuIGJlIGluc2VydGVkIHdoZXJlIChhdCB3aGF0IGluZGV4KS4KLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RlbFF1ZXJ5Ci17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTElESVRZX05PTkUgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxJRElUWV9QQVJUSUFMID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURJVFlfU1RSSUNUID0gMjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0FMTCA9IDB4RkY7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfQVRUUklCVVRFUyA9IDB4MDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfQ0hJTERfTk9ERVMgPSAweDAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX1NFUVVFTkNFX0dST1VQUyA9IDB4MDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfVEVYVF9OT0RFUyA9IDB4MDg7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfRU5DTE9TSU5HX1JFUExBQ0VfQUNUSU9OUyA9IDB4MTA7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURJVF9NT0RFX1VOQ09OU1RSQUlORUQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFRElUX01PREVfQ09OU1RSQUlORURfTEVOSUVOVD0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCA9IDI7Ci0KLQotICB2b2lkIHNldEVkaXRNb2RlKGludCBlZGl0TW9kZSk7Ci0KLSAgaW50ICBnZXRFZGl0TW9kZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBDTURvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERPTSBOb2RlLgotICAgKiBvciBudWxsIGlmIG5vIENNRG9jdW1lbnQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLSAgICovCi0gIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBDTU5vZGUgZm9yIHRoZSBET00gTm9kZQotICAgKiBvciBudWxsIGlmIG5vIENNTm9kZSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIERPTSBOb2RlLgotICAgKi8KLSAgQ01Ob2RlIGdldENNTm9kZShOb2RlIG5vZGUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIENNQXR0cmlidXRlIGZvciB0aGUgRE9NIE5vZGUKLSAgICogb3IgbnVsbCBpZiBubyBDTU5vZGUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLSAgICovCi0gIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihBdHRyIGF0dHIpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIENNQXR0cmlidXRlIGZvciB0aGUgRE9NIE5vZGUKLSAgICogb3IgbnVsbCBpZiBubyBDTU5vZGUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLSAgICovCi0gIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCBpcyB2YWxpZAotICAgKi8KLSAgYm9vbGVhbiBpc0NvbnRlbnRWYWxpZChFbGVtZW50IGVsZW1lbnQpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBDTU5vZGUgb2YgdGhlIHBhcmVudCBlbGVtZW50J3MgY29udGVudCBtb2RlbAotICAgKiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBub2RlCi0gICAqLwotICBDTU5vZGUgZ2V0T3JpZ2luKE5vZGUgbm9kZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgQ01Ob2RlcyBvZiB0aGUgcGFyZW50IGVsZW1lbnQncyBjb250ZW50IG1vZGVsCi0gICAqIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG5vZGUKLSAgICovCi0gIENNTm9kZVtdIGdldE9yaWdpbkFycmF5KEVsZW1lbnQgZWxlbWVudCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBDTU5vZGUgJ21ldGEgZGF0YScgdGhhdCBtYXkgYmUgcG90ZW50aWFsbHkgYWRkZWQgdG8gdGhlIGVsZW1lbnQuCi0gICAqLwotICBMaXN0IGdldEF2YWlsYWJsZUNvbnRlbnQoRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zKTsKLQotICAvKioKLSAgICogQ2FuIGEgRE9NIE5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUgQ01Ob2RlICdtZXRhIGRhdGEnIGJlIGFkZGVkIHRvIHRoZSBwYXJlbnQKLSAgICovCi0gIGJvb2xlYW4gY2FuSW5zZXJ0KEVsZW1lbnQgcGFyZW50LCBDTU5vZGUgY21Ob2RlLCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKTsKLQotICAvKioKLSAgICogQ2FuIG11bHRpcGxlIERPTSBOb2RlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsaXN0IG9mIENNTm9kZSAnbWV0YSBkYXRhJyBiZSBhZGRlZCB0byB0aGUgcGFyZW50Ci0gICAqLwotICBib29sZWFuIGNhbkluc2VydChFbGVtZW50IHBhcmVudCwgTGlzdCBjbU5vZGVMaXN0LCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKTsKLQotICAvKioKLSAgICogQ2FuIHRoZSBET00gTm9kZSBiZSByZW1vdmVkCi0gICAqLwotICBib29sZWFuIGNhblJlbW92ZShOb2RlIG5vZGUsIGludCB2YWxpZGl0eUNoZWNraW5nKTsKLQotICAvKioKLSAgICogQ2FuIHRoZSBsaXN0IG9mIERPTSBOb2RlcyBiZSByZW1vdmVkCi0gICAqLwotICBib29sZWFuIGNhblJlbW92ZShMaXN0IG5vZGVMaXN0LCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiB0aGUgY2hpbGRyZW4gd2l0aGluIHRoZSBpbmRpY2F0ZWQgaW5kaWNlcyBiZSByZXBsYWNlZCB3aXRoIGEgRE9NIE5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUgQ01Ob2RlICdtZXRhIGRhdGEnCi0gICAqLwotICBib29sZWFuIGNhblJlcGxhY2UoRWxlbWVudCBwYXJlbnQsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIENNTm9kZSBjbU5vZGUsIGludCB2YWxpZGl0eUNoZWNraW5nKTsKLQotICAvKioKLSAgICogQ2FuIHRoZSBjaGlsZHJlbiB3aXRoaW4gdGhlIGluZGljYXRlZCBpbmRpY2VzIGJlIHJlcGxhY2VkIHdpdGggbXVsdGlwbGUgRE9NIE5vZGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxpc3Qgb2YgQ01Ob2RlICdtZXRhIGRhdGEnCi0gICAqLwotICBib29sZWFuIGNhblJlcGxhY2UoRWxlbWVudCBwYXJlbnQsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIExpc3QgY21Ob2RlTGlzdCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpOwotCi0gIC8qKgotICAgKgotICAgKi8KLSAgdm9pZCBnZXRJbnNlcnRBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpOwotCi0gIC8qKgotICAgKgotICAgKi8KLSAgdm9pZCBnZXRJbnNlcnRBY3Rpb25zKERvY3VtZW50IHBhcmVudCwgQ01Eb2N1bWVudCBjbURvY3VtZW50LCBpbnQgaW5kZXgsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIGxpc3Qgb2YgcmVwbGFjZSBhY3Rpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgcGFyZW50J3MgY29udGVudAotICAgKi8KLSAgdm9pZCBnZXRSZXBsYWNlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIGxpc3Qgb2YgcmVwbGFjZSBhY3Rpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgc2VsZWN0ZWQgY2hpbGRyZW4gb2YgdGhhdCBwYXJlbnQgCi0gICAqLwotICB2b2lkIGdldFJlcGxhY2VBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBzZWxlY3RlZENoaWxkcmVuLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgLyoqIAotICAgKiAgQGRlcHJlY2F0ZWQgLSB1c2UgZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcygpCi0gICAqLwotICBMaXN0IGdldERhdGFUeXBlVmFsdWVzKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSk7Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kcyByZXR1cm4gYW4gYXJyYXkgb2YgcG9zc2libGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRhdGF0eXBlIG9mIHRoZSBDTU5vZGUgKGVpdGhlciBhbiBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIG9yIGEgQ01FbGVtZW50RGVjbGFyYXRpb24pCi0gICAqLwotICBTdHJpbmdbXSBnZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSk7Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbCBpZiBhIENNRG9jdW1lbnRNYW5hZ2VyIGlzIG5vdCB1c2VkIGJ5IHRoZSBNb2RlbFF1ZXJ5Ci0gICAqLwotICBDTURvY3VtZW50TWFuYWdlciBnZXRDTURvY3VtZW50TWFuYWdlcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgdGhlIE1vZGVsUXVlcnkgZG9lc24ndCBzdXBwb3J0IHRoZSB1c2Ugb2YgZXh0ZW5zaW9ucwotICAgKi8KLSAgTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXIgZ2V0RXh0ZW5zaW9uTWFuYWdlcigpOyAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTljNGZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxRdWVyeUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNFUlQgID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFICA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0UgPSA0OwotCi0gIHB1YmxpYyBpbnQgZ2V0S2luZCgpOwotICAvKioKLSAgICogaWYgc3RhcnQgaW5kZXggPT0gLTEgdGhlbiBubyBpbnNlcnQgaXMgcG9zc2libGUKLSAgICogaWYgc3RhcnQgaW5kZXggIT0gLTEgYW5kIGVuZEluZGV4ID09IC0xIHRoZW4gYW4gaW5zZXJ0IGF0IGFueSBwb3NpdGlvbiBpcyBwb3NzaWJsZQotICAgKi8KLSAgcHVibGljIGludCBnZXRTdGFydEluZGV4KCk7Ci0gIHB1YmxpYyBpbnQgZ2V0RW5kSW5kZXgoKTsKLSAgcHVibGljIE5vZGUgZ2V0UGFyZW50KCk7Ci0gIHB1YmxpYyBDTU5vZGUgZ2V0Q01Ob2RlKCk7Ci0gIHB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoKTsKLSAgcHVibGljIHZvaWQgc2V0VXNlckRhdGEoT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3Nzc1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgTW9kZWxRdWVyeUNNUHJvdmlkZXIKLXsKLSAgcHVibGljIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKTsKLSAgcHVibGljIENNRGF0YVR5cGUgZ2V0Q01EYXRhVHlwZShUZXh0IHRleHQpOyAKLSAgcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihBdHRyIGF0dHIpOwotICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGY5MzczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxRdWVyeUNNUHJvdmlkZXIKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIENNRG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgRE9NIE5vZGUuCi0gICAqIG9yIG51bGwgaWYgbm8gQ01Eb2N1bWVudCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIERPTSBOb2RlLgotICAgKi8KLSAgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvZXh0ZW5zaW9uL01vZGVsUXVlcnlFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L2V4dGVuc2lvbi9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MTdmNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvZXh0ZW5zaW9uL01vZGVsUXVlcnlFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW9kZWxRdWVyeUV4dGVuc2lvbgoteyAgCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0ge307Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ01Ob2RlW10gRU1QVFlfQ01OT0RFX0FSUkFZID0ge307Ci0gIAotICAvKioKLSAqIEBwYXJhbSBvd25lckVsZW1lbnQgLSB0aGUgb3duZXIgZWxlbWVudAotICogQHBhcmFtIG5hbWVzcGFjZSAtIHRoZSBhY3RpdmUgbmFtZXNwYWNlCi0gKiBAcGFyYW0gbmFtZSAtIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBub2RlCi0gKiBAcmV0dXJuIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZQotICovCi1wdWJsaWMgU3RyaW5nW10gZ2V0QXR0cmlidXRlVmFsdWVzKEVsZW1lbnQgb3duZXJFbGVtZW50LCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBFTVBUWV9TVFJJTkdfQVJSQVk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRFbGVtZW50VmFsdWVzKE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gRU1QVFlfU1RSSU5HX0FSUkFZOwotICB9Ci0gIAotICAvKioKLSAqIEBwYXJhbSBwYXJlbnROb2RlCi0gKiBAcGFyYW0gbmFtZXNwYWNlCi0gKiBAcGFyYW0gbmFtZQotICogQHJldHVybiB3aGV0aGVyIGEgY2hpbGQgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gcGFyZW50Tm9kZSBpcyB2YWxpZCBnaXZlbiB0aGUgYWN0aXZlIG5hbWVzcGFjZQotICovCi1wdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVDaGlsZEVsZW1lbnQoTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAqIEBwYXJhbSBwYXJlbnRFbGVtZW50IC0gdGhlIHBhcmVudCBFbGVtZW50IHdoZW4gYXNraW5nIGZvciBjaGlsZHJlbiwgdGhlIG93bmVyIEVsZW1lbnQgd2hlbiBhc2tpbmcgZm9yIGF0dHJpYnV0ZXMgCi0gKiBAcGFyYW0gbmFtZXNwYWNlIC0gdGhlIGFjdGl2ZSBuYW1lc3BhY2UKLSAqIEBwYXJhbSBpbmNsdWRlT3B0aW9ucyAtIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTIG9yIE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUwotICogQHJldHVybiBhZGRpdGlvbmFsIHZhbGlkIENNQXR0cmlidXRlRGVjbGFyYXRpb25zIG9yIENNRWxlbWVudERlY2xhcmF0aW9ucyAKLSAqLwotcHVibGljIENNTm9kZVtdIGdldEF2YWlsYWJsZUVsZW1lbnRDb250ZW50KEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZSwgaW50IGluY2x1ZGVPcHRpb25zKSAKLSAgewotCSAgcmV0dXJuIEVNUFRZX0NNTk9ERV9BUlJBWTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvZXh0ZW5zaW9uL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9leHRlbnNpb24vTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjNDQwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9leHRlbnNpb24vTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyCi17Ci0gIExpc3QgZ2V0RGF0YVR5cGVWYWx1ZXMoRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHZvaWQgZmlsdGVyQXZhaWxhYmxlRWxlbWVudENvbnRlbnQoTGlzdCBhdmFpbGFibGVDb250ZW50LCBFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkKTsKLQotICB2b2lkIGZpbHRlckF2YWlsYWJsZUVsZW1lbnRDb250ZW50KExpc3QgYXZhaWxhYmxlQ29udGVudCwgRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9CYXNlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0Jhc2VBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MjQyZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0Jhc2VBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlQXNzb2NpYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyCi17ICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIEJhc2VBc3NvY2lhdGlvblByb3ZpZGVyKCkKLSAgewotICB9Ci0KLSAgcHVibGljIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgQ01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0gICAgc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpCi0gICAgewotICAgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbigoQXR0cilub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0gICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01EYXRhVHlwZSgoVGV4dClub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBDTURhdGFUeXBlIGdldENNRGF0YVR5cGUoVGV4dCB0ZXh0KQotICB7Ci0gICAgQ01EYXRhVHlwZSByZXN1bHQgPSBudWxsOwotICAgIE5vZGUgcGFyZW50Tm9kZSA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotICAgIGlmIChwYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsKLSAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpcGFyZW50Tm9kZSk7Ci0gICAgICByZXN1bHQgPSBlZC5nZXREYXRhVHlwZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikKLSAgewotICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbillZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTA1OTQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZVRhYmxlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50TG9hZGVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnk7Ci0gIHByb3RlY3RlZCBDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlcjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmZlcnJlZEdyYW1tYXJFbmFibGVkID0gdHJ1ZTsgIAotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudExvYWRpbmdOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZTsKLSAgcHJvdGVjdGVkIGludCBjb3VudCA9IDA7Ci0gICAgCi0gIHB1YmxpYyBDTURvY3VtZW50TG9hZGVyKERvY3VtZW50IGRvY3VtZW50LCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMoZG9jdW1lbnQsIG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDTURvY3VtZW50TG9hZGVyKERvY3VtZW50IGRvY3VtZW50LCBDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlcikKLSAgeyAgIAotICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLmNtRG9jdW1lbnRNYW5hZ2VyID0gY21Eb2N1bWVudE1hbmFnZXI7ICAJCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGxvYWRDTURvY3VtZW50cygpCi0gIHsgICAgICAgICAgCi0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS1sb2FkQ01Eb2N1bWVudHMgLS0tLS0tLS0tLS0tIik7ICAgICAgICAgIAotICAgIC8vbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgCi0gICAgYm9vbGVhbiB3YWxrRG9jdW1lbnQgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgIGNtRG9jdW1lbnRNYW5hZ2VyLnJlbW92ZUFsbFJlZmVyZW5jZXMoKTsKLSAgICAgIAotICAgIFN0cmluZ1tdIGRvY3R5cGVJbmZvID0gWE1MQXNzb2NpYXRpb25Qcm92aWRlci5nZXREb2N0eXBlSW5mbyhkb2N1bWVudCk7Ci0gICAgaWYgKGRvY3R5cGVJbmZvICE9IG51bGwpCi0gICAgewotICAgICAgLy8gbG9hZCB0aGUgZG9jdHlwZSBpZiByZXF1aXJlZAotICAgICAgd2Fsa0RvY3VtZW50ID0gaGFuZGxlR3JhbW1hcihkb2N0eXBlSW5mb1swXSwgZG9jdHlwZUluZm9bMV0sICJEVEQiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBnZXRSb290RWxlbWVudChkb2N1bWVudCk7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lc3BhY2VUYWJsZSA9IG5ldyBDTURvY3VtZW50TG9hZGluZ05hbWVzcGFjZVRhYmxlKGRvY3VtZW50KTsgICAKLSAgICAgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChlbGVtZW50KTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZVRhYmxlLmlzTmFtZXNwYWNlRW5jb3VudGVyZWQoKSkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHdhbGtEb2N1bWVudCA9IHRydWU7Ci0gICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImlzTmFtZXNwYWNlQXdhcmUiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lc3BhY2VUYWJsZSA9IG51bGw7Ci0gICAgICAgICAgd2Fsa0RvY3VtZW50ID0gaXNJbmZlcnJlZEdyYW1tYXJFbmFibGVkOwotICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJpcyBOT1QgbmFtZXNwYWNlQXdhcmUiKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9ICAKLSAgICB9IAotCi0gICAgaWYgKHdhbGtEb2N1bWVudCkKLSAgICB7Ci0gICAgICB2aXNpdE5vZGUoZG9jdW1lbnQpOyAgIAotICAgIH0gCi0KLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tIGVsYXBzZWQgdGltZSAoIiArIGNvdW50ICsgIikgPSAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVHcmFtbWFyKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgdHlwZSkKLSAgeyAgICAgICAgICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAKLSAgICBpbnQgc3RhdHVzID0gY21Eb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudFN0YXR1cyhwdWJsaWNJZCk7Ci0gICAgaWYgKHN0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX05PVF9MT0FERUQpCi0gICAgewotICAgICAgY21Eb2N1bWVudE1hbmFnZXIuYWRkQ01Eb2N1bWVudFJlZmVyZW5jZShwdWJsaWNJZCwgc3lzdGVtSWQsIHR5cGUpOwotICAgIH0gICAgICAgICAgICAgICAgIAotICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0gICAgCi0KLSAgcHVibGljIHZvaWQgaGFuZGxlRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsgIAotICAgIHZpc2l0Q2hpbGROb2RlcyhlbGVtZW50KTsKLSAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBoYW5kbGVFbGVtZW50TlMoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChlbGVtZW50KTsKLSAgICB2aXNpdENoaWxkTm9kZXMoZWxlbWVudCk7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCB2aXNpdE5vZGUoTm9kZSBub2RlKQotICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICBpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsKLSAgICAgIGNvdW50Kys7ICAgICAgIAotCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClub2RlOyAgICAKLSAgICAgIGlmIChuYW1lc3BhY2VUYWJsZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBoYW5kbGVFbGVtZW50KGVsZW1lbnQpOyAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaGFuZGxlRWxlbWVudE5TKGVsZW1lbnQpOwotICAgICAgfSAgICAgICAgICAgIAotICAgIH0KLSAgICBlbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0gICAgewotICAgICAgdmlzaXRDaGlsZE5vZGVzKG5vZGUpOwotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRDaGlsZE5vZGVzKE5vZGUgbm9kZSkKLSAgeyAgIAotCSAgZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgCi0gICAgewotCSAgICB2aXNpdE5vZGUoY2hpbGQpOwotICAgIH0KLQl9ICAgICAgICAgICAgIAotCi0KLSAgcHJvdGVjdGVkIGNsYXNzIENNRG9jdW1lbnRMb2FkaW5nTmFtZXNwYWNlVGFibGUgZXh0ZW5kcyBOYW1lc3BhY2VUYWJsZQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IG5ld05hbWVzcGFjZUxpc3Q7Ci0KLSAgICBwdWJsaWMgQ01Eb2N1bWVudExvYWRpbmdOYW1lc3BhY2VUYWJsZShEb2N1bWVudCBkb2N1bWVudCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgc3VwZXIoZG9jdW1lbnQpOyAgICAgCi0gICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgbmV3TmFtZXNwYWNlTGlzdCA9IG51bGw7Ci0gICAgICBzdXBlci5hZGRFbGVtZW50KGVsZW1lbnQpOyAgCi0gICAgICBpZiAobmV3TmFtZXNwYWNlTGlzdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuZXdOYW1lc3BhY2VMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLSAgICAgICAgICBoYW5kbGVHcmFtbWFyKGluZm8udXJpLCBpbmZvLmxvY2F0aW9uSGludCwgIlhTRCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxBZGROYW1lc3BhY2VJbmZvKFN0cmluZyBrZXksIE5hbWVzcGFjZUluZm8gaW5mbykKLSAgICB7Ci0gICAgICBzdXBlci5pbnRlcm5hbEFkZE5hbWVzcGFjZUluZm8oa2V5LCBpbmZvKTsgICAgICAgICAgIAotICAgICAgaWYgKG5ld05hbWVzcGFjZUxpc3QgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmV3TmFtZXNwYWNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIH0KLSAgICAgIG5ld05hbWVzcGFjZUxpc3QuYWRkKGluZm8pOyAgICAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLQotICAKLSAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0Um9vdEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbm9kZUxpc3RMZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEVsZW1lbnQpbm9kZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50TWFuYWdlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50TWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0YWY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudE1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Db250ZW50TW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLkdsb2JhbENNRG9jdW1lbnRDYWNoZS5HbG9iYWxDYWNoZVF1ZXJ5UmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudE1hbmFnZXJJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudE1hbmFnZXIKLXsKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGU7Ci0gIHByb3RlY3RlZCBDTURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIgY21Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyOwotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgVmVjdG9yKCk7IAotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgcHVibGljSWRUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgcHJpdmF0ZSBib29sZWFuIGdsb2JhbENNRG9jdW1lbnRDYWNoZUVuYWJsZWQgOwotCi0gICAgICAgCi0gIHB1YmxpYyBDTURvY3VtZW50TWFuYWdlckltcGwoQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSwgQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyIGNtRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlcikKLSAgewotICAgIHRoaXMuY21Eb2N1bWVudENhY2hlID0gY21Eb2N1bWVudENhY2hlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLmNtRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlciA9IGNtRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlcjsKLSAgICBzZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfQVVUT19MT0FELCB0cnVlKTsKLSAgICBzZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfVVNFX0NBQ0hFRF9SRVNPTFZFRF9VUkksIGZhbHNlKTsKLSAgICBzZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfUEVSRk9STV9VUklfUkVTT0xVVElPTiwgdHJ1ZSk7Ci0gICAgaW5pdGlhbGl6ZUdsb2JhbENNRG9jdW1lbnRDYWNoZVNldHRpbmdzKCk7Ci0gIH0gICAgICAgICAKLQotICAgICAgIAotICBwdWJsaWMgQ01Eb2N1bWVudENhY2hlIGdldENNRG9jdW1lbnRDYWNoZSgpCi0gIHsKLSAgICByZXR1cm4gY21Eb2N1bWVudENhY2hlOwotICB9Ci0KLSAKLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChwcm9wZXJ0eU5hbWUsIHZhbHVlID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIgPSAoQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZCh0aGlzLCBwcm9wZXJ0eU5hbWUpOwotICAgIH0KLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0UHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gcHJvcGVydHlUYWJsZS5nZXQocHJvcGVydHlOYW1lKTsKLSAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0LmVxdWFscygidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgICBjbURvY3VtZW50Q2FjaGUuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgY21Eb2N1bWVudENhY2hlLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAKLSAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFN0cmluZyBsb29rdXBSZXNvbHZlZFVSSShTdHJpbmcgcHVibGljSWQpCi0gIHsKLSAgICBTdHJpbmcga2V5ID0gcHVibGljSWQgIT0gbnVsbCA/IHB1YmxpY0lkIDogIiI7IC8vJE5PTi1OTFMtMSQKLSAgICByZXR1cm4gKFN0cmluZylwdWJsaWNJZFRhYmxlLmdldChrZXkpOwotICB9Ci0gICAgCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBsb29rdXBPckNyZWF0ZVJlc29sdmVkVVJJKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSBudWxsOyAgICAgICAgICAgICAgICAgIAotCi0gICAgU3RyaW5nIGtleSA9IHB1YmxpY0lkICE9IG51bGwgPyBwdWJsaWNJZCA6ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBpZiAoZ2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX1VTRV9DQUNIRURfUkVTT0xWRURfVVJJKSkKLSAgICB7Ci0gICAgICByZXNvbHZlZFVSSSA9IChTdHJpbmcpcHVibGljSWRUYWJsZS5nZXQoa2V5KTsKLSAgICB9ICAgCi0KLSAgICBpZiAocmVzb2x2ZWRVUkkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXNvbHZlZFVSSSA9IGNtRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlci5yZXNvbHZlR3JhbW1hclVSSShwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgICAgaWYgKHJlc29sdmVkVVJJID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc29sdmVkVVJJID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIHB1YmxpY0lkVGFibGUucHV0KGtleSwgcmVzb2x2ZWRVUkkpOyAgICAgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotICAgIHJldHVybiByZXNvbHZlZFVSSTsKLSAgfQotCi0KLSAgcHVibGljIGludCBnZXRDTURvY3VtZW50U3RhdHVzKFN0cmluZyBwdWJsaWNJZCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpbnQgc3RhdHVzID0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19OT1RfTE9BREVEOyAKLSAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSBsb29rdXBSZXNvbHZlZFVSSShwdWJsaWNJZCk7Ci0gICAgaWYgKHJlc29sdmVkVVJJICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHN0YXR1cyA9IGNtRG9jdW1lbnRDYWNoZS5nZXRTdGF0dXMocmVzb2x2ZWRVUkkpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9ICAgIAotICAgICAgICAgICAgICAKLQotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgU3RyaW5nIHJlc29sdmVkVVJJID0gbG9va3VwUmVzb2x2ZWRVUkkocHVibGljSWQpOwotICAgIGlmIChyZXNvbHZlZFVSSSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICByZXN1bHQgPSBjbURvY3VtZW50Q2FjaGUuZ2V0Q01Eb2N1bWVudChyZXNvbHZlZFVSSSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0gIAotCi0gIC8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyI2dldENNRG9jdW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSBudWxsOwotCi0gICAgaWYgKGdldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9BVVRPX0xPQUQpKQotICAgIHsKLSAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM2Mzk5Ci0gICAgICAKLSAgICAgIGlmIChnZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfUEVSRk9STV9VUklfUkVTT0xVVElPTikpCi0gICAgICB7Ci0gICAgICAgIHJlc29sdmVkVVJJID0gbG9va3VwT3JDcmVhdGVSZXNvbHZlZFVSSShwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXNvbHZlZFVSSSA9IHN5c3RlbUlkOwotICAgICAgfQotICAgIH0gICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc29sdmVkVVJJID0gbG9va3VwUmVzb2x2ZWRVUkkocHVibGljSWQpOwotICAgIH0gCi0KLSAgICBpZiAocmVzb2x2ZWRVUkkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgaW50IHN0YXR1cyA9IGNtRG9jdW1lbnRDYWNoZS5nZXRTdGF0dXMocmVzb2x2ZWRVUkkpOwotICAgICAgaWYgKHN0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0xPQURFRCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGNtRG9jdW1lbnQgPSBjbURvY3VtZW50Q2FjaGUuZ2V0Q01Eb2N1bWVudChyZXNvbHZlZFVSSSk7Ci0gICAgICB9ICAgCi0gICAgICBlbHNlIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19OT1RfTE9BREVEKQotICAgICAgeyAgICAgCi0gICAgICAgIGlmIChnZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfQVVUT19MT0FEKSkKLSAgICAgICAgewotICAgICAgICAgIGNtRG9jdW1lbnQgPSBsb2FkQ01Eb2N1bWVudChwdWJsaWNJZCwgcmVzb2x2ZWRVUkksIHR5cGUsIGdldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9BU1lOQ19MT0FEKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNtRG9jdW1lbnQ7ICAgCi0gIH0gCi0gIAotICBwdWJsaWMgdm9pZCBhZGRDTURvY3VtZW50UmVmZXJlbmNlKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgdHlwZSkKLSAgewotICAgIFN0cmluZyByZXNvbHZlZFVSSSA9IGxvb2t1cE9yQ3JlYXRlUmVzb2x2ZWRVUkkocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICBpZiAocmVzb2x2ZWRVUkkgIT0gbnVsbCAmJiByZXNvbHZlZFVSSS5sZW5ndGgoKSA+IDApCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGludCBzdGF0dXMgPSBjbURvY3VtZW50Q2FjaGUuZ2V0U3RhdHVzKHJlc29sdmVkVVJJKTsKLSAgICAgIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19OT1RfTE9BREVEKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgbG9hZENNRG9jdW1lbnQocHVibGljSWQsIHJlc29sdmVkVVJJLCB0eXBlLCBnZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfQVNZTkNfTE9BRCkpOwotICAgICAgfSAgICAgICAgIAotICAgIH0gCi0gIH0KLSAgICAgCi0KLSAgcHVibGljIHZvaWQgYWRkQ01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHJlc29sdmVkVVJJLCBTdHJpbmcgdHlwZSwgQ01Eb2N1bWVudCBjbURvY3VtZW50KQotICB7Ci0gICAgU3RyaW5nIGtleSA9IHB1YmxpY0lkICE9IG51bGwgPyBwdWJsaWNJZCA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljSWRUYWJsZS5wdXQoa2V5LCByZXNvbHZlZFVSSSk7Ci0gICAgY21Eb2N1bWVudENhY2hlLnB1dENNRG9jdW1lbnQocmVzb2x2ZWRVUkksIGNtRG9jdW1lbnQpOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudCBsb2FkQ01Eb2N1bWVudChmaW5hbCBTdHJpbmcgcHVibGljSWQsIGZpbmFsIFN0cmluZyByZXNvbHZlZFVSSSwgZmluYWwgU3RyaW5nIHR5cGUsIGJvb2xlYW4gYXN5bmMpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImFib3V0IHRvIGJ1aWxkIENNRG9jdW1lbnQoIiArIHB1YmxpY0lkICsgIiwgIiArIHVucmVzb2x2ZWRVUkkgKyAiID0gIiArIHJlc29sdmVkVVJJICsgIikiKTsKLSAgICBpZiAoYXN5bmMpCi0gICAgeyAgICAgCi0gICAgICBjbURvY3VtZW50Q2FjaGUuc2V0U3RhdHVzKHJlc29sdmVkVVJJLCBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0xPQURJTkcpOwotICAgICAgLy9UaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZChuZXcgQXN5bmNCdWlsZE9wZXJhdGlvbihwdWJsaWNJZCwgcmVzb2x2ZWRVUkksIHR5cGUpKTsKLSAgICAgIC8vdGhyZWFkLnN0YXJ0KCk7Ci0gICAgICBKb2Igam9iID0gbmV3IEpvYihYTUxDb3JlTWVzc2FnZXMubG9hZGluZyArIHJlc29sdmVkVVJJKQotICAgICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gKGZhbWlseSA9PSBDTURvY3VtZW50TWFuYWdlci5jbGFzcyk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgCSAgYnVpbGRDTURvY3VtZW50KHB1YmxpY0lkLCByZXNvbHZlZFVSSSwgdHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgIAkgIExvZ2dlci5sb2dFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoWE1MQ29yZU1lc3NhZ2VzLkNNRG9jdW1lbnRfbG9hZF9leGNlcHRpb24sIG5ldyBPYmplY3RbXXtyZXNvbHZlZFVSSSwgcHVibGljSWR9KSwgZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICB9Ci0gICAgICB9OwotICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgcmVzdWx0ID0gYnVpbGRDTURvY3VtZW50KHB1YmxpY0lkLCByZXNvbHZlZFVSSSwgdHlwZSk7Ci0gICAgfSAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotCi0gICAgCi0KLSAgcHVibGljIHN5bmNocm9uaXplZCBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQsIFN0cmluZyByZXNvbHZlZFVSSSwgU3RyaW5nIHR5cGUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgY21Eb2N1bWVudENhY2hlLnNldFN0YXR1cyhyZXNvbHZlZFVSSSwgQ01Eb2N1bWVudENhY2hlLlNUQVRVU19MT0FESU5HKTsKLSAgICBib29sZWFuIGRvY3VtZW50Q2FjaGVhYmxlID0gZmFsc2U7Ci0gICAgaWYoZ2xvYmFsQ01Eb2N1bWVudENhY2hlRW5hYmxlZCkgewotICAgIAlHbG9iYWxDYWNoZVF1ZXJ5UmVzcG9uc2UgcmVzcG9uc2UgPSBHbG9iYWxDTURvY3VtZW50Q2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRDTURvY3VtZW50KHJlc29sdmVkVVJJKTsKLSAgICAJQ01Eb2N1bWVudCBjYWNoZWRDTURvY3VtZW50ID0gcmVzcG9uc2UuZ2V0Q2FjaGVkQ01Eb2N1bWVudCgpOwotICAgIAlkb2N1bWVudENhY2hlYWJsZSA9IHJlc3BvbnNlLmlzRG9jdW1lbnRDYWNoZWFibGUoKTsKLSAgICAJaWYoY2FjaGVkQ01Eb2N1bWVudCAhPSBudWxsKSB7Ci0gICAgCQljbURvY3VtZW50Q2FjaGUucHV0Q01Eb2N1bWVudChyZXNvbHZlZFVSSSwgY2FjaGVkQ01Eb2N1bWVudCk7Ci0gICAgCQlyZXR1cm4gY2FjaGVkQ01Eb2N1bWVudDsKLSAgICAJfQotICAgIH0KLQotICAgIENNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsgICAgICAgICAKLSAgICBpZiAocmVzb2x2ZWRVUkkgIT0gbnVsbCAmJiByZXNvbHZlZFVSSS5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgLy8gVE9ETy4uLiBwYXNzIHRoZSBUWVBFIHRocnUgdG8gdGhlIENNRG9jdW1lbnRCdWlsZGVyCi0gICAgICByZXN1bHQgPSBDb250ZW50TW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlQ01Eb2N1bWVudChyZXNvbHZlZFVSSSwgdHlwZSk7Ci0gICAgfQotICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICB7IAotICAgICAgLy8gbG9hZCB0aGUgYW5ub3RhdGlvbiBmaWxlcyBmb3IgdGhlIGRvY3VtZW50IAotICAgICAgaWYgKHB1YmxpY0lkICE9IG51bGwpCi0gICAgICB7ICAgIAotICAgICAgICBBbm5vdGF0aW9uVXRpbGl0eS5sb2FkQW5ub3RhdGlvbnNGb3JHcmFtbWFyKHB1YmxpY0lkLCByZXN1bHQpOwotICAgICAgfQotICAgICAgaWYoZ2xvYmFsQ01Eb2N1bWVudENhY2hlRW5hYmxlZCAmJiBkb2N1bWVudENhY2hlYWJsZSkgewotICAgIAkgIEdsb2JhbENNRG9jdW1lbnRDYWNoZS5nZXRJbnN0YW5jZSgpLnB1dENNRG9jdW1lbnQocmVzb2x2ZWRVUkksIHJlc3VsdCk7Ci0gICAgICB9Ci0gICAgICBjbURvY3VtZW50Q2FjaGUucHV0Q01Eb2N1bWVudChyZXNvbHZlZFVSSSwgcmVzdWx0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNtRG9jdW1lbnRDYWNoZS5zZXRTdGF0dXMocmVzb2x2ZWRVUkksIENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfRVJST1IpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUFsbFJlZmVyZW5jZXMoKQotICB7Ci0gICAgLy8gVE9ETy4uLiBpbml0aWF0ZSBhIHRpbWVkIHJlbGVhc2Ugb2YgdGhlIGVudHJpZXMgaW4gdGhlIENNRG9jdW1lbnRDYWNoZQotICAgIHB1YmxpY0lkVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplR2xvYmFsQ01Eb2N1bWVudENhY2hlU2V0dGluZ3MoKSB7Ci0JICBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JICBpZihwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCSAgZ2xvYmFsQ01Eb2N1bWVudENhY2hlRW5hYmxlZCA9IHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTURPQ1VNRU5UX0dMT0JBTF9DQUNIRV9FTkFCTEVEKTsKLQkgIH0KLSAgfQotCi19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50UmVmZXJlbmNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0NNRG9jdW1lbnRSZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZWRhYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0NNRG9jdW1lbnRSZWZlcmVuY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50UmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50UmVmZXJlbmNlCi17ICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JZDsKLSAgcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNJZDsKLQotICBwdWJsaWMgQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICB0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5zeXN0ZW1JZCA9IHN5c3RlbUlkOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBwdWJsaWNJZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gc3lzdGVtSWQ7Ci0gIH0gICAgICAKLSAgCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuICJbIiArIHB1YmxpY0lkICsgIiwgIiArIHN5c3RlbUlkICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvR2xvYmFsQ01Eb2N1bWVudENhY2hlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvR2xvYmFsQ01Eb2N1bWVudENhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOTgxZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0dsb2JhbENNRG9jdW1lbnRDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdE1lbW9yeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQ7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEdsb2JhbENNRG9jdW1lbnRDYWNoZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgR2xvYmFsQ01Eb2N1bWVudENhY2hlIGdsb2JhbERvY3VtZW50Q2FjaGUgPSBuZXcgR2xvYmFsQ01Eb2N1bWVudENhY2hlKCk7Ci0JcHJpdmF0ZSBNYXAgc3lzdGVtQ2F0YWxvZ0VudHJpZXMgPSBnZXRTeXN0ZW1DYXRhbG9nRW50cmllcygpOwotCXByaXZhdGUgTWVtb3J5TGlzdGVuZXIgbWVtb3J5TGlzdGVuZXI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZID0gIkNNRG9jdW1lbnRHbG9iYWxDYWNoZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgR2xvYmFsQ01Eb2N1bWVudENhY2hlKCkgewotCQlMb2dnZXIudHJhY2UoQ0FURUdPUlksICJDYWNoZSBpbml0aWFsaXplZCIpOyAvLyROT04tTkxTLTEkCi0JCW1lbW9yeUxpc3RlbmVyID0gbmV3IE1lbW9yeUxpc3RlbmVyKCk7Ci0JCW1lbW9yeUxpc3RlbmVyLmNvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEdsb2JhbENNRG9jdW1lbnRDYWNoZSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGdsb2JhbERvY3VtZW50Q2FjaGU7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgR2xvYmFsQ2FjaGVRdWVyeVJlc3BvbnNlIGdldENNRG9jdW1lbnQoU3RyaW5nIGdyYW1tYXJVUkkpIHsKLQkJLy9Mb2dnZXIudHJhY2UoQ0FURUdPUlksICJRdWVyeSBmb3I6ICIgKyBncmFtbWFyVVJJKTsgLy8kTk9OLU5MUy0xJAotCQlPYmplY3Qgc3lzdGVtQ2F0YWxvZ0VudHJ5ID0gc3lzdGVtQ2F0YWxvZ0VudHJpZXMuZ2V0KGdyYW1tYXJVUkkpOwotCQlpZihzeXN0ZW1DYXRhbG9nRW50cnkgIT0gbnVsbCkgewotCQkJLy9Mb2dnZXIudHJhY2UoQ0FURUdPUlksICJEb2N1bWVudCAiICsgZ3JhbW1hclVSSSArICIgaXMgaW4gc3lzdGVtIGNhdGFsb2ciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlPYmplY3Qgb2JqZWN0ID0gKChTb2Z0UmVmZXJlbmNlKXN5c3RlbUNhdGFsb2dFbnRyeSkuZ2V0KCk7Ci0JCQlpZihvYmplY3QgIT0gbnVsbCkgewotCQkJCS8vTG9nZ2VyLnRyYWNlKENBVEVHT1JZLCAiRG9jdW1lbnQgIiArIGdyYW1tYXJVUkkgKyAiaXMgaW4gY2FjaGUsIHJldHVybmluZyBjYWNoZWQgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gbmV3IEdsb2JhbENhY2hlUXVlcnlSZXNwb25zZSgoQ01Eb2N1bWVudClvYmplY3QsIHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvL0xvZ2dlci50cmFjZShDQVRFR09SWSwgIkRvY3VtZW50ICIgKyBncmFtbWFyVVJJICsgIiBpcyBub3QgaW4gY2FjaGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmV0dXJuIG5ldyBHbG9iYWxDYWNoZVF1ZXJ5UmVzcG9uc2UobnVsbCwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJLy9Mb2dnZXIudHJhY2UoQ0FURUdPUlksICJEb2N1bWVudCAiICsgZ3JhbW1hclVSSSArICIgaXMgbm90IGluIHN5c3RlbSBjYXRhbG9nLCBub3QgY2FjaGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gbmV3IEdsb2JhbENhY2hlUXVlcnlSZXNwb25zZShudWxsLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwdXRDTURvY3VtZW50KFN0cmluZyBncmFtbWFyVVJJLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpIHsKLQkJLy9Mb2dnZXIudHJhY2UoQ0FURUdPUlksICJEb2N1bWVudDogIiArIGdyYW1tYXJVUkkgKyAiIGFkZGVkIHRvIGdsb2JhbCBjYWNoZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc3lzdGVtQ2F0YWxvZ0VudHJpZXMucHV0KGdyYW1tYXJVUkksIG5ldyBTb2Z0UmVmZXJlbmNlKGNtRG9jdW1lbnQpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIEhhc2hNYXAgZ2V0U3lzdGVtQ2F0YWxvZ0VudHJpZXMoKXsKLQkJSGFzaE1hcCBzeXN0ZW1DYXRhbG9nVVJJcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUlDYXRhbG9nIHN5c3RlbUNhdGFsb2cgPSBudWxsOwotCQlJQ2F0YWxvZyBkZWZhdWx0Q2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGRlZmF1bHRDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykgewotCQkJSU5leHRDYXRhbG9nIGNhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0JCQlJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZyA9IGNhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCWlmIChyZWZlcmVuY2VkQ2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJaWYgKFhNTENvcmVQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCXN5c3RlbUNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYoc3lzdGVtQ2F0YWxvZyAhPSBudWxsKSB7Ci0JCQlJQ2F0YWxvZ0VudHJ5W10gY2F0YWxvZ0VudHJpZXMgPSBzeXN0ZW1DYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGFsb2dFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3lzdGVtQ2F0YWxvZ1VSSXMucHV0KGNhdGFsb2dFbnRyaWVzW2ldLmdldFVSSSgpLCBuZXcgU29mdFJlZmVyZW5jZShudWxsKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN5c3RlbUNhdGFsb2dVUklzOwotCX0KLQkKLQlwdWJsaWMgY2xhc3MgR2xvYmFsQ2FjaGVRdWVyeVJlc3BvbnNlIHsKLQkJCi0JCXByaXZhdGUgQ01Eb2N1bWVudCBjYWNoZWREb2N1bWVudDsKLQkJcHJpdmF0ZSBib29sZWFuIGRvY3VtZW50Q2FjaGVhYmxlOwotCQkKLQkJcHVibGljIEdsb2JhbENhY2hlUXVlcnlSZXNwb25zZShDTURvY3VtZW50IGNhY2hlZENNRG9jdW1lbnQsIGJvb2xlYW4gZG9jdW1lbnRDYWNoZWFibGUpIHsKLQkJCXRoaXMuY2FjaGVkRG9jdW1lbnQgPSBjYWNoZWRDTURvY3VtZW50OwotCQkJdGhpcy5kb2N1bWVudENhY2hlYWJsZSA9IGRvY3VtZW50Q2FjaGVhYmxlOwotCQl9Ci0JCQotCQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDYWNoZWRDTURvY3VtZW50KCkgewotCQkJcmV0dXJuIGNhY2hlZERvY3VtZW50OwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc0RvY3VtZW50Q2FjaGVhYmxlKCkgewotCQkJcmV0dXJuIGRvY3VtZW50Q2FjaGVhYmxlOwotCQl9Ci0JCQotCX0KLQotCXByaXZhdGUgY2xhc3MgTWVtb3J5TGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdE1lbW9yeUxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTWVtb3J5RXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCU9iamVjdCB0b3BpYyA9IGV2ZW50LmdldFByb3BlcnR5KEV2ZW50Q29uc3RhbnRzLkVWRU5UX1RPUElDKTsKLQkJCWlmKFNFVl9TRVJJT1VTLmVxdWFscyh0b3BpYykgfHwgU0VWX0NSSVRJQ0FMLmVxdWFscyh0b3BpYykpIHsKLQkJCQlMb2dnZXIudHJhY2UoQ0FURUdPUlksICJTZXJpb3VzIHNldmVyaXR5IGxvdyBtZW1vcnkgZXZlbnQgcmVjZWl2ZWQsIGZsdXNoaW5nIGdsb2JhbCBDTURvY3VtZW50IGNhY2hlLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJc3lzdGVtQ2F0YWxvZ0VudHJpZXMgPSBnZXRTeXN0ZW1DYXRhbG9nRW50cmllcygpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWU3MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0luZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5tb2RlbHF1ZXJ5aW1wbC5JbmZlcnJlZEdyYW1tYXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyIGV4dGVuZHMgQ01Eb2N1bWVudExvYWRlcgoteyAgICAgCi0gIHByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uOwotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudCBpbmZlcnJlZENNRG9jdW1lbnQ7Ci0gIHByb3RlY3RlZCBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5IGluZmVycmVkR3JhbW1hckZhY3Rvcnk7Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgY3JlYXRlZENNRG9jdW1lbnRUYWJsZTsKLQotICBwdWJsaWMgSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyKERvY3VtZW50IGRvY3VtZW50LCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMoZG9jdW1lbnQsIG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXIoRG9jdW1lbnQgZG9jdW1lbnQsIENNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBzdXBlcihkb2N1bWVudCwgY21Eb2N1bWVudE1hbmFnZXIpOwotICAgIGNyZWF0ZWRDTURvY3VtZW50VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7ICAgICAgICAgICAgIAotICAgIGluZmVycmVkR3JhbW1hckZhY3RvcnkgPSBuZXcgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeSgpOwotICB9ICAgICAKLQotICAgICAKLSAgcHVibGljIHZvaWQgbG9hZENNRG9jdW1lbnRzKCkKLSAgeyAgIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tbG9hZENNRG9jdW1lbnRzIC0tLS0tLS0tLS0tLSIpOyAgICAgICAgICAKLSAgICBpZiAoaW5mZXJyZWRHcmFtbWFyRmFjdG9yeSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBzdXBlci5sb2FkQ01Eb2N1bWVudHMoKTsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCItLS0gZWxhcHNlZCB0aW1lICgiICsgY291bnQgKyAiKSA9ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSk7Ci0gICAgICAvL2luZmVycmVkR3JhbW1hckZhY3RvcnkuZGVidWdQcmludChjcmVhdGVkQ01Eb2N1bWVudFRhYmxlLnZhbHVlcygpKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgeyAKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uID0gaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICAKLSAgICBpZiAoaW5mZXJyZWRDTURvY3VtZW50ID09IG51bGwpCi0gICAgeyAgICAgCi0gICAgICBTdHJpbmcgY2FjaGVLZXkgPSAiaW5mZXJyZWQtZG9jdW1lbnQiOyAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgaW5mZXJyZWRDTURvY3VtZW50ID0gaW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5jcmVhdGVDTURvY3VtZW50KCIiKTsgICAvLyROT04tTkxTLTEkCi0gICAgICBjbURvY3VtZW50TWFuYWdlci5hZGRDTURvY3VtZW50KCIiLCAiIiwgY2FjaGVLZXksICJEVEQiLCBpbmZlcnJlZENNRG9jdW1lbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgY3JlYXRlZENNRG9jdW1lbnRUYWJsZS5wdXQoY2FjaGVLZXksIGluZmVycmVkQ01Eb2N1bWVudCk7Ci0gICAgfSAKLQotICAgIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uKGluZmVycmVkQ01Eb2N1bWVudCwgZWxlbWVudCwgZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgIAotICAgIGlmIChwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgaW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5jcmVhdGVDTUNvbnRlbnQoaW5mZXJyZWRDTURvY3VtZW50LCBwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uLCBpbmZlcnJlZENNRG9jdW1lbnQsIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24sIGZhbHNlLCBudWxsKTsKLSAgICB9ICAgICAKLSAgICAgICAKLQotICAgIHZpc2l0Q2hpbGROb2RlcyhlbGVtZW50KTsgICAKLSAgICAgICAgICAgCi0gICAgLy8gcmVzZXQgdGhlICdjdXJyZW50JyBzdGF0ZSB0byBpbml0YWwgdmFsdWVzCi0gICAgaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IHBhcmVudEluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb247Ci0gIH0KLSAgCi0KLSAgcHVibGljIHZvaWQgaGFuZGxlRWxlbWVudE5TKEVsZW1lbnQgZWxlbWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudCBwYXJlbnRJbmZlcnJlZENNRG9jdW1lbnQgPSBpbmZlcnJlZENNRG9jdW1lbnQ7Ci0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb247Ci0gICAgICAgIAotICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IG51bGw7Ci0KLSAgICAvLyBieSBhZGRpbmcgdGhlIGVsZW1lbnQgdG8gdGhlIG5hbWVzcGFjZVRhYmxlLCBoYW5kbGVHcmFtbWFyKCkgd2lsbCBnZXQgY2FsbGVkIGZvciBhbnkgc2NoZW1hIHJlZmVyZW5jZXMKLSAgICBpZiAoZWxlbWVudC5nZXRQYXJlbnROb2RlKCkgIT0gZG9jdW1lbnQpCi0gICAgewotICAgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChlbGVtZW50KTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICBTdHJpbmcgdXJpID0gbmFtZXNwYWNlVGFibGUuZ2V0VVJJRm9yUHJlZml4KHByZWZpeCk7Ci0KLSAgICBpZiAodXJpID09IG51bGwgJiYgZWxlbWVudC5nZXRQYXJlbnROb2RlKCkgPT0gZG9jdW1lbnQpCi0gICAgewotICAgICAgLy8gd2hlbiB0aGlzIGlzIHRoZSByb290IGVsZW1lbnQKLSAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIGFuIGltcGxpZWQgIm5vIG5hbWVzcGFjZSBzY2hlbWEgbG9jYXRpb24iCi0gICAgICB1cmkgPSAib21taXR0ZWQtbmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotICAgICAgbmFtZXNwYWNlVGFibGUuYWRkTmFtZXNwYWNlSW5mbyhwcmVmaXgsIHVyaSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgfSAgCi0KLSAgICAvLyBoZXJlJ3Mgd2hlcmUgd2UgdXBkYXRlIHRoZSBpbmZlcnJlZCBncmFtbWFyIGlmIHJlcXVpcmVkCi0gICAgLy8gCi0gICAgYm9vbGVhbiBjcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbiA9IHRydWU7Ci0gICAgICAgICAgCi0gICAgYm9vbGVhbiBpc0xvY2FsID0gKHVyaSA9PSBudWxsICYmIHByZWZpeCA9PSBudWxsKTsgICAgICAgICAKLSAgICBpZiAoaXNMb2NhbCkKLSAgICB7ICAgICAgICAgIAotICAgICAgaWYgKHBhcmVudEluZmVycmVkQ01Eb2N1bWVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyB0aGlzIGlzIGEgbG9jYWwgZWxlbWVudC4uLiBhbmQgdGhlIHBhcmVudCBpcyBub3QgaW5mZXJyZWQgKGUuZykgaXQgaGFzIGEga25vd24gZ3JhbW1hcgotICAgICAgICAvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhbiBlbGVtZW50IGRlY2xhcmF0aW9uIGZvciB0aGlzIGVsZW1lbnQKLSAgICAgICAgY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24gPSBmYWxzZTsgCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdXJpID0gIm9tbWl0dGVkLW5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChjcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7ICAgICAgICAgICAgCi0gICAgICBpZiAoaXNMb2NhbCkKLSAgICAgIHsKLSAgICAgICAgaW5mZXJyZWRDTURvY3VtZW50ID0gcGFyZW50SW5mZXJyZWRDTURvY3VtZW50OwotICAgICAgICBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uID0gaW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5jcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbihpbmZlcnJlZENNRG9jdW1lbnQsIGVsZW1lbnQsIHRydWUpOyAgICAgICAKLSAgICAgIH0gICAgICAgICAgCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gY3JlYXRlQ01Eb2N1bWVudCA9IGZhbHNlOwotCi0gICAgICAgIFN0cmluZyBjYWNoZUtleSA9ICJpbmZlcnJlZC1kb2N1bWVudCIgKyB1cmk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IChDTURvY3VtZW50KWNyZWF0ZWRDTURvY3VtZW50VGFibGUuZ2V0KGNhY2hlS2V5KTsKLQotICAgICAgICBpZiAoaW5mZXJyZWRDTURvY3VtZW50ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIGFuIGluZmVycmVkIGRvY3VtZW50IGZvciB0aGlzIHVyaSB5ZXQuLi4gbGV0J3Mgc2VlIG9mIHdlIG5lZWQgb25lCi0gICAgICAgICAgaW50IHN0YXR1cyA9IGNtRG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnRTdGF0dXModXJpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgaWYgKHN0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX05PVF9MT0FERUQgfHwgc3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfRVJST1IpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gdGhlIGNhY2hlIGRvZXMgbm90IGNvbnRhaW4gYSAncHJvcGVyJyBDTURvY3VtZW50IGZvciB0aGlzIHVyaQotICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBjcmVhdGUgYW4gaW5mZXJyZWQgb25lCi0gICAgICAgICAgICBjcmVhdGVDTURvY3VtZW50ID0gdHJ1ZTsKLSAgICAgICAgICB9IAotICAgICAgICB9IAotICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoY3JlYXRlQ01Eb2N1bWVudCkKLSAgICAgICAgeyAgICAgICAgICAgCi0gICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImVuY291bnRlcmVkIGVsZW1lbnQgeyIgKyBlbGVtZW50LmdldE5vZGVOYW1lKCkgKyAifSAuLi4gY3JlYXRpbmcgaW5mZXJyZWQgQ01Eb2N1bWVudCBmb3IgIiArIHVyaSk7Ci0gICAgICAgICAgaW5mZXJyZWRDTURvY3VtZW50ID0gaW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5jcmVhdGVDTURvY3VtZW50KHVyaSk7Ci0gICAgICAgICAgY21Eb2N1bWVudE1hbmFnZXIuYWRkQ01Eb2N1bWVudCh1cmksICIiLCBjYWNoZUtleSwgIlhTRCIsIGluZmVycmVkQ01Eb2N1bWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgIGNyZWF0ZWRDTURvY3VtZW50VGFibGUucHV0KGNhY2hlS2V5LCBpbmZlcnJlZENNRG9jdW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZmVycmVkQ01Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24oaW5mZXJyZWRDTURvY3VtZW50LCBlbGVtZW50LCBmYWxzZSk7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLQotICAgICAgaWYgKHBhcmVudEluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5jcmVhdGVDTUNvbnRlbnQocGFyZW50SW5mZXJyZWRDTURvY3VtZW50LCBwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uLCBpbmZlcnJlZENNRG9jdW1lbnQsIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24sIGlzTG9jYWwsIHVyaSk7Ci0gICAgICB9IAotICAgIH0gICAgICAgICAgICAgICAKLSAgICAgICAgICAKLSAgICB2aXNpdENoaWxkTm9kZXMoZWxlbWVudCk7Ci0gICAgICAKLSAgICAvLyByZXNldCB0aGUgJ2N1cnJlbnQnIHN0YXRlIHRvIGluaXRhbCB2YWx1ZXMKLSAgICBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uID0gcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICBpbmZlcnJlZENNRG9jdW1lbnQgPSBwYXJlbnRJbmZlcnJlZENNRG9jdW1lbnQ7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUFjdGlvbkhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlBY3Rpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2YTBkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUFjdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsLkNNVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFjdGlvbkhlbHBlcgotewotICBwcm90ZWN0ZWQgTW9kZWxRdWVyeUltcGwgbW9kZWxRdWVyeTsKLQotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEFjdGlvbiBpbXBsZW1lbnRzIE1vZGVsUXVlcnlBY3Rpb24KLSAgewotICAgIHB1YmxpYyBpbnQga2luZDsKLSAgICBwdWJsaWMgaW50IHN0YXJ0SW5kZXg7Ci0gICAgcHVibGljIGludCBlbmRJbmRleDsKLSAgICBwdWJsaWMgTm9kZSBwYXJlbnQ7Ci0gICAgcHVibGljIENNTm9kZSBjbU5vZGU7Ci0gICAgcHVibGljIE9iamVjdCB1c2VyRGF0YTsKLQotICAgIHB1YmxpYyBBY3Rpb24oaW50IGtpbmQsIE5vZGUgcGFyZW50LCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgIHRoaXMuY21Ob2RlID0gY21Ob2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBBY3Rpb24oaW50IGtpbmQsIE5vZGUgcGFyZW50LCBDTU5vZGUgY21Ob2RlLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KQotICAgIHsKLSAgICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgIHRoaXMuY21Ob2RlID0gY21Ob2RlOwotICAgICAgdGhpcy5zdGFydEluZGV4ID0gc3RhcnRJbmRleDsKLSAgICAgIHRoaXMuZW5kSW5kZXggPSBlbmRJbmRleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEtpbmQoKQotICAgIHsKLSAgICAgIHJldHVybiBraW5kOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0U3RhcnRJbmRleCgpCi0gICAgewotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRFbmRJbmRleCgpCi0gICAgewotICAgICAgcmV0dXJuIGVuZEluZGV4OwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldFBhcmVudCgpCi0gICAgewotICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ01Ob2RlIGdldENNTm9kZSgpCi0gICAgewotICAgICAgcmV0dXJuIGNtTm9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJEYXRhKCkKLSAgICB7Ci0gICAgICByZXR1cm4gdXNlckRhdGE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlckRhdGEoT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICB1c2VyRGF0YSA9IG9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkKLSAgICB7Ci0gICAgfQotICB9Ci0KLQotICBwdWJsaWMgTW9kZWxRdWVyeUFjdGlvbkhlbHBlcihNb2RlbFF1ZXJ5SW1wbCBtb2RlbFF1ZXJ5KQotICB7Ci0gICAgdGhpcy5tb2RlbFF1ZXJ5ID0gbW9kZWxRdWVyeTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgZ2V0QWxsQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgfQotCi0KLSAgLy8gaW5zZXJ0IGFjdGlvbnMKLSAgLy8KLSAgcHVibGljIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgaWYgKChpbmNsdWRlT3B0aW9ucyAmIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKSAhPSAwKQotICAgIHsKLSAgICAgIGdldEluc2VydEF0dHJpYnV0ZUFjdGlvbnMocGFyZW50LCBlZCwgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gICAgfQotICAgIGluY2x1ZGVPcHRpb25zICY9IH5Nb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUzsKLSAgICBpZiAoKGluY2x1ZGVPcHRpb25zICYgTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgZ2V0SW5zZXJ0Q2hpbGROb2RlQWN0aW9uc0F0SW5kZXgocGFyZW50LCBlZCwgaW5kZXgsIGluY2x1ZGVPcHRpb25zLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ2V0SW5zZXJ0Q2hpbGROb2RlQWN0aW9ucyhwYXJlbnQsIGVkLCBpbmNsdWRlT3B0aW9ucywgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotCi0gIHByb3RlY3RlZCB2b2lkIGdldEluc2VydEF0dHJpYnV0ZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgLy8gZ2V0IGFjdGlvbnMgZm9yIGVhY2ggaW5zZXJ0YWJsZSBhdHRyaWJ1dGUKLSAgICAvLwotICAgIExpc3QgYXZhaWxhYmxlQXR0cmlidXRlTGlzdCA9IG1vZGVsUXVlcnkuZ2V0QXZhaWxhYmxlQ29udGVudChwYXJlbnQsIGVkLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhdmFpbGFibGVBdHRyaWJ1dGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKWkubmV4dCgpOwotICAgICAgaWYgKG1vZGVsUXVlcnkuY2FuSW5zZXJ0KHBhcmVudCwgZWQsIGFkLCAwLCB2YWxpZGl0eUNoZWNraW5nKSkKLSAgICAgIHsKLSAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQsIHBhcmVudCwgYWQpOwotICAgICAgICBhY3Rpb25MaXN0LmFkZChhY3Rpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgZ2V0SW5zZXJ0Q2hpbGROb2RlQWN0aW9uc0F0SW5kZXgoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5kZXgsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gZ2V0IGFjdGlvbnMgZm9yIGVhY2ggaW5zZXJ0YWJsZSBhdHRyaWJ1dGUKLSAgICAvLwotICAgIGludCBzaXplID0gcGFyZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKTsKLSAgICBpZiAoaW5kZXggPD0gc2l6ZSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IG1vZGVsUXVlcnkuZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KHBhcmVudCwgZWQpOyAKLSAgICAgIExpc3QgYXZhaWxhYmxlQ2hpbGROb2RlTGlzdCA9IG1vZGVsUXVlcnkuZ2V0QXZhaWxhYmxlQ29udGVudChwYXJlbnQsIGVkLCBpbmNsdWRlT3B0aW9ucyk7Ci0KLSAgICAgIGJvb2xlYW4gaXNTaW1wbGVDaG9pY2UgPSBpc1NpbXBsZUNob2ljZUdyb3VwQ29udGVudE1vZGVsKGVkKTsKLSAgICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhdmFpbGFibGVDaGlsZE5vZGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBjbU5vZGUgPSAoQ01Ob2RlKWkubmV4dCgpOyAgICAgIAotICAgICAgICBpZiAoaXNTaW1wbGVDaG9pY2UgfHwgbW9kZWxRdWVyeS5jYW5JbnNlcnQocGFyZW50LCBlZCwgY21Ob2RlLCBpbmRleCwgdmFsaWRpdHlDaGVja2luZywgY29udGVudFNwZWNpZmljYXRpb25MaXN0KSkKLSAgICAgICAgewotICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJULCBwYXJlbnQsIGNtTm9kZSwgaW5kZXgsIGluZGV4KTsKLSAgICAgICAgICBhY3Rpb25MaXN0LmFkZChhY3Rpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICAgICAgICAgICAgICAgICAKLSAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTaW1wbGVDaG9pY2VHcm91cENvbnRlbnRNb2RlbChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgeyAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIENNTm9kZSBjbU5vZGUgPSBlZC5nZXRDb250ZW50KCk7Ci0gICAgaWYgKGNtTm9kZSAhPSBudWxsICYmIGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5HUk9VUCkKLSAgICB7Ci0gICAgICBDTUdyb3VwIGNtR3JvdXAgPSAoQ01Hcm91cCljbU5vZGU7Ci0gICAgICBpZiAoY21Hcm91cC5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuQ0hPSUNFICYmIGNtR3JvdXAuZ2V0TWF4T2NjdXIoKSA9PSAtMSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIENNTm9kZUxpc3QgbGlzdCA9IGNtR3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBpID0gbGlzdC5nZXRMZW5ndGgoKSAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGxpc3QuaXRlbShpKS5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIGdldEluc2VydENoaWxkTm9kZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBpbnQgc2l6ZSA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCk7Ci0gICAgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSBtb2RlbFF1ZXJ5LmdldFZhbGlkYXRvcigpLmNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChwYXJlbnQsIGVkKTsKLSAgICBMaXN0IGF2YWlsYWJsZUNoaWxkTm9kZUxpc3QgPSBtb2RlbFF1ZXJ5LmdldEF2YWlsYWJsZUNvbnRlbnQocGFyZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMpOwotCi0gICAgYm9vbGVhbiBpc1NpbXBsZUNob2ljZSA9IGlzU2ltcGxlQ2hvaWNlR3JvdXBDb250ZW50TW9kZWwoZWQpOwotCi0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGF2YWlsYWJsZUNoaWxkTm9kZUxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ01Ob2RlIGNtTm9kZSA9IChDTU5vZGUpaXRlcmF0b3IubmV4dCgpOwotICAgICAgZm9yIChpbnQgaSA9IHNpemU7IGkgPj0gMDsgaS0tKQotICAgICAgewotICAgICAgICBpZiAoaXNTaW1wbGVDaG9pY2UgfHwgbW9kZWxRdWVyeS5jYW5JbnNlcnQocGFyZW50LCBlZCwgY21Ob2RlLCBpLCB2YWxpZGl0eUNoZWNraW5nLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpKQotICAgICAgICB7Ci0gICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQsIHBhcmVudCwgY21Ob2RlLCBpLCBpKTsKLSAgICAgICAgICBhY3Rpb25MaXN0LmFkZChhY3Rpb24pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhEb2N1bWVudCBwYXJlbnQsIENNRG9jdW1lbnQgY21Eb2N1bWVudCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICAvLyBnZXQgdGhlIHJvb3QgZWxlbWVudCBhbmQgZG9jdHlwZSBpbmRleCAoaWYgYW55KQotICAgIC8vCi0gICAgaW50IGRvY3R5cGVJbmRleCA9IC0xOwotICAgIERvY3VtZW50VHlwZSBkb2N0eXBlID0gbnVsbDsKLSAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gbnVsbDsKLSAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgY2hpbGROb2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLSAgICAgIGlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgcm9vdEVsZW1lbnQgPSAoRWxlbWVudCljaGlsZE5vZGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpCi0gICAgICB7Ci0gICAgICAgIGRvY3R5cGUgPSAoRG9jdW1lbnRUeXBlKWNoaWxkTm9kZTsKLSAgICAgICAgZG9jdHlwZUluZGV4ID0gaTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBtYWtlIHN1cmUgdGhhdCByb290IGVsZW1lbnRzIGFyZSBvbmx5IGFkZGVkIGFmdGVyIHRoZSBkb2N0eXBlIChpZiBhbnkpCi0gICAgaWYgKHJvb3RFbGVtZW50ID09IG51bGwgJiYgaW5kZXggPiBkb2N0eXBlSW5kZXgpCi0gICAgewotICAgICAgQ01OYW1lZE5vZGVNYXAgbWFwID0gY21Eb2N1bWVudC5nZXRFbGVtZW50cygpOwotICAgICAgaW50IG1hcExlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBjbU5vZGUgPSBtYXAuaXRlbShpKTsKLQotICAgICAgICBib29sZWFuIGNhbkFkZCA9IHRydWU7Ci0gICAgICAgIGlmICh2YWxpZGl0eUNoZWNraW5nID09IE1vZGVsUXVlcnkuVkFMSURJVFlfU1RSSUNUKQotICAgICAgICB7Ci0gICAgICAgICAgY2FuQWRkID0gZG9jdHlwZSA9PSBudWxsIHx8IGRvY3R5cGUuZ2V0TmFtZSgpLmVxdWFscyhjbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2FuQWRkKQotICAgICAgICB7Ci0gICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQsIHBhcmVudCwgY21Ob2RlLCBpbmRleCwgaW5kZXgpOwotICAgICAgICAgIGFjdGlvbkxpc3QuYWRkKGFjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0KLSAgcHVibGljIHZvaWQgZ2V0SW5zZXJ0Q2hpbGROb2RlQWN0aW9uVGFibGUoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgdmFsaWRpdHlDaGVja2luZywgSGFzaHRhYmxlIGFjdGlvblRhYmxlKQotICB7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGdldFJlcGxhY2VBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgQ01WYWxpZGF0b3IuTWF0Y2hNb2RlbE5vZGUgbWF0Y2hNb2RlbE5vZGUgPSBtb2RlbFF1ZXJ5LmdldFZhbGlkYXRvcigpLmdldE1hdGNoTW9kZWwoZWQsIHBhcmVudCk7Ci0gICAgaWYgKG1hdGNoTW9kZWxOb2RlICE9IG51bGwpCi0gICAgewotICAgICAgTWF0Y2hNb2RlbFZpc2l0b3IgdmlzaXRvciA9IG5ldyBNYXRjaE1vZGVsVmlzaXRvcihwYXJlbnQsIGFjdGlvbkxpc3QpOwotICAgICAgdmlzaXRvci52aXNpdE1hdGNoTW9kZWxOb2RlKG1hdGNoTW9kZWxOb2RlKTsKLSAgICB9ICAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldFJlcGxhY2VBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBzZWxlY3RlZENoaWxkcmVuLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBpbnRbXSByYW5nZSA9IGdldFJhbmdlKHBhcmVudCwgc2VsZWN0ZWRDaGlsZHJlbik7Ci0gICAgaWYgKHJhbmdlICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChpc0NvbnRpZ3VvdXMocGFyZW50LCByYW5nZSwgc2VsZWN0ZWRDaGlsZHJlbikpCi0gICAgICB7Ci0gICAgICAgIExpc3QgdGVtcExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGdldFJlcGxhY2VBY3Rpb25zKHBhcmVudCwgZWQsIGluY2x1ZGVPcHRpb25zLCB2YWxpZGl0eUNoZWNraW5nLCB0ZW1wTGlzdCk7Ci0gICAgICAgIGlmICgoaW5jbHVkZU9wdGlvbnMgJiBNb2RlbFF1ZXJ5LklOQ0xVREVfRU5DTE9TSU5HX1JFUExBQ0VfQUNUSU9OUykgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlbW92ZUFjdGlvbnNOb3RDb250YWluaW5nUmFuZ2UodGVtcExpc3QsIHJhbmdlWzBdLCByYW5nZVsxXSk7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVtb3ZlQWN0aW9uc05vdE1hdGNoaW5nUmFuZ2UodGVtcExpc3QsIHJhbmdlWzBdLCByYW5nZVsxXSk7ICAgIAotICAgICAgICB9Ci0gICAgICAgIGFjdGlvbkxpc3QuYWRkQWxsKHRlbXBMaXN0KTsKLSAgICAgIH0KLSAgICB9ICAgCi0gICAgCi0gICAgaWYgKHNlbGVjdGVkQ2hpbGRyZW4uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgTm9kZSBub2RlID0gKE5vZGUpc2VsZWN0ZWRDaGlsZHJlbi5nZXQoMCk7Ci0gICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsgICAgICAgCi0gICAgICAgIENNTm9kZSBjaGlsZEVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihjaGlsZEVsZW1lbnQpOwotICAgICAgICBpZiAoY2hpbGRFZCAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgCi0KLSAgICAgICAgICBDTU5vZGUgY2hpbGRPcmlnaW49IG1vZGVsUXVlcnkuZ2V0T3JpZ2luKGNoaWxkRWxlbWVudCk7Ci0KLSAgICAgICAgICBDTU5vZGVMaXN0IGNtTm9kZUxpc3QgPSBjaGlsZE9yaWdpbiAhPSBudWxsID8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ01Ob2RlTGlzdCljaGlsZE9yaWdpbi5nZXRQcm9wZXJ0eSgiU3Vic3RpdHV0aW9uR3JvdXAiKSA6IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDTU5vZGVMaXN0KWNoaWxkRWQuZ2V0UHJvcGVydHkoIlN1YnN0aXR1dGlvbkdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgIGlmIChjbU5vZGVMaXN0ICE9IG51bGwgJiYgY21Ob2RlTGlzdC5nZXRMZW5ndGgoKSA+IDEpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGludCByZXBsYWNlSW5kZXggPSBnZXRJbmRleChwYXJlbnQsIGNoaWxkRWxlbWVudCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2hpbGRFZE5hbWUgPSBjaGlsZEVkLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNtTm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICAgICAgIHsgICAgICAgICAKLSAgICAgICAgICAgICAgQ01Ob2RlIHN1YnN0aXR1dGlvbiA9IGNtTm9kZUxpc3QuaXRlbShpKTsKLSAgICAgICAgICAgICAgaWYgKCFzdWJzdGl0dXRpb24uZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoY2hpbGRFZE5hbWUpICYmICFCb29sZWFuLlRSVUUuZXF1YWxzKHN1YnN0aXR1dGlvbi5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKE1vZGVsUXVlcnlBY3Rpb24uUkVQTEFDRSwgcGFyZW50LCBjbU5vZGVMaXN0Lml0ZW0oaSksIHJlcGxhY2VJbmRleCwgcmVwbGFjZUluZGV4KTsKLSAgICAgICAgICAgICAgICBhY3Rpb25MaXN0LmFkZChhY3Rpb24pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAgCi0gICAgfQotICB9ICAgICAKLSAgICAgICAgICAgCi0gIAotICAvLyByZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdGVkIG5vZGVzIGFyZSBjb250aWd1b3VzCi0gIC8vICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb250aWd1b3VzKEVsZW1lbnQgcGFyZW50LCBpbnRbXSByYW5nZSwgTGlzdCBzZWxlY3RlZE5vZGVMaXN0KQotICB7ICAgICAgICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkvLyBpc3N1ZTogbm9kZUxpc3RMZW5ndGggd2FzIG5ldmVyIHJlYWQsIGJ1dCBpbiB0aGVvcnksIAotCS8vIG5vZGVsTGlzdC5nZXRMZW5ndGgoKSBtaWdodCBjYXVzZSBzb21lIGNsZWFyaW5nIG9mIGNhY2hlZCAKLQkvLyBkYXRhLCBvciBzb21ldGhpbmcsIHNvIGxlYXZpbmcgaW4gYSBwb3RlbnRpYWwgbWVhbmluZ2xlc3MgY2FsbCwgZm9yIG5vdy4KLSAgICAvL2ludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCW5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSByYW5nZVswXTsgaSA8IHJhbmdlWzFdOyBpKyspCi0gICAgeyAgICAgICAKLSAgICAgIE5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7ICAgIAotICAgICAgaWYgKCFpc1doaXRlc3BhY2VOb2RlKG5vZGUpICYmICFzZWxlY3RlZE5vZGVMaXN0LmNvbnRhaW5zKG5vZGUpKQotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfSAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAKLSAKLSAgcHJvdGVjdGVkIGludFtdIGdldFJhbmdlKEVsZW1lbnQgcGFyZW50LCBMaXN0IGxpc3QpCi0gIHsKLSAgICBpbnRbXSByZXN1bHQgPSBudWxsOwotICAgIGludCBmaXJzdCA9IC0xOwotICAgIGludCBsYXN0ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKQotICAgIHsgICAgICAgCi0gICAgICBOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOyAgICAKLSAgICAgIGlmIChsaXN0LmNvbnRhaW5zKG5vZGUpKQotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgZmlyc3QgPSAoZmlyc3QgPT0gLTEpID8gaSA6IE1hdGgubWluKGZpcnN0LCBpKTsgICAgICAgIAotICAgICAgICBsYXN0ID0gTWF0aC5tYXgobGFzdCwgaSk7Ci0gICAgICB9ICAgIAotICAgIH0KLSAgIAotICAgIGlmIChmaXJzdCAhPSAtMSAmJiBsYXN0IT0gLTEpCi0gICAgeyAgICAgICAgICAgICAKLSAgICAgIHJlc3VsdCA9IG5ldyBpbnRbMl07Ci0gICAgICByZXN1bHRbMF0gPSBmaXJzdDsKLSAgICAgIHJlc3VsdFsxXSA9IGxhc3Q7Ci0gICAgfSAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1doaXRlc3BhY2VOb2RlKE5vZGUgbm9kZSkKLSAgewotICAgIHJldHVybiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYKLSAgICAgICAgICAgbm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMDsKLSAgfSAKLQotCi0gIHByb3RlY3RlZCBpbnQgZ2V0SW5kZXgoTm9kZSBwYXJlbnROb2RlLCBOb2RlIGNoaWxkKQotICB7Ci0gICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgaW5kZXggPSAtMTsKLSAgICBpbnQgc2l6ZSA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChub2RlTGlzdC5pdGVtKGkpID09IGNoaWxkKQotICAgICAgewotICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaW5kZXg7Ci0gIH0gICAgICAgICAgICAgICAgICAgIAotCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBY3Rpb25Db250YWluaW5nUmFuZ2UoTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24sIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpCi0gIHsKLSAgICBpbnQgYWN0aW9uU3RhcnRJbmRleCA9IGFjdGlvbi5nZXRTdGFydEluZGV4KCk7Ci0gICAgaW50IGFjdGlvbkVuZEluZGV4ID0gYWN0aW9uLmdldEVuZEluZGV4KCk7Ci0KLSAgICByZXR1cm4gKGFjdGlvblN0YXJ0SW5kZXggPD0gc3RhcnRJbmRleCAmJgotICAgICAgICAgICAgYWN0aW9uRW5kSW5kZXggPj0gZW5kSW5kZXgpOwotICB9IAotICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FjdGlvbk1hdGNoaW5nUmFuZ2UoTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24sIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpCi0gIHsKLSAgICBpbnQgYWN0aW9uU3RhcnRJbmRleCA9IGFjdGlvbi5nZXRTdGFydEluZGV4KCk7Ci0gICAgaW50IGFjdGlvbkVuZEluZGV4ID0gYWN0aW9uLmdldEVuZEluZGV4KCk7Ci0gICAgcmV0dXJuIChhY3Rpb25TdGFydEluZGV4ID09IHN0YXJ0SW5kZXggJiYgICAgICAgIAotICAgICAgICAgICAgYWN0aW9uRW5kSW5kZXggPT0gZW5kSW5kZXgpOwotICB9IAotICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBY3Rpb25zTm90Q29udGFpbmluZ1JhbmdlKExpc3QgYWN0aW9uTGlzdCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKLSAgewotICAgIGZvciAoaW50IGkgPSBhY3Rpb25MaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIE1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uID0gKE1vZGVsUXVlcnlBY3Rpb24pYWN0aW9uTGlzdC5nZXQoaSk7Ci0gICAgICBpZiAoIWlzQWN0aW9uQ29udGFpbmluZ1JhbmdlKGFjdGlvbiwgc3RhcnRJbmRleCwgZW5kSW5kZXgpKQotICAgICAgewotICAgICAgICBhY3Rpb25MaXN0LnJlbW92ZShpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUFjdGlvbnNOb3RNYXRjaGluZ1JhbmdlKExpc3QgYWN0aW9uTGlzdCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKLSAgewotICAgIGZvciAoaW50IGkgPSBhY3Rpb25MaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIE1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uID0gKE1vZGVsUXVlcnlBY3Rpb24pYWN0aW9uTGlzdC5nZXQoaSk7Ci0gICAgICBpZiAoIWlzQWN0aW9uTWF0Y2hpbmdSYW5nZShhY3Rpb24sIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSkKLSAgICAgIHsKLSAgICAgICAgYWN0aW9uTGlzdC5yZW1vdmUoaSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hdGNoTW9kZWxWaXNpdG9yCi0gIHsKLSAgICBpbnQgaW5kZW50OwotICAgIGludCBlbGVtZW50SW5kZXg7Ci0gICAgTm9kZSBwYXJlbnQ7Ci0gICAgTGlzdCBhY3Rpb25MaXN0OwotCi0gICAgcHVibGljIE1hdGNoTW9kZWxWaXNpdG9yKE5vZGUgcGFyZW50LCBMaXN0IGFjdGlvbkxpc3QpCi0gICAgewotICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICB0aGlzLmFjdGlvbkxpc3QgPSBhY3Rpb25MaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW5kZXhPZk5leHRFbGVtZW50KGludCBzdGFydCkKLSAgICB7Ci0gICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBpbnQgbGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICBpbnQgcmVzdWx0ID0gbGVuZ3RoOwotICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0gICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0TWF0Y2hNb2RlbE5vZGUoQ01WYWxpZGF0b3IuTWF0Y2hNb2RlbE5vZGUgbWF0Y2hNb2RlbE5vZGUpCi0gICAgewotICAgICAgaW50IHN0YXJ0SW5kZXggPSBpbmRleE9mTmV4dEVsZW1lbnQoZWxlbWVudEluZGV4KTsKLQotICAgICAgLy9TdHJpbmcgY21Ob2RlTmFtZSA9IG1hdGNoTW9kZWxOb2RlLmNtTm9kZSAhPSBudWxsID8gbWF0Y2hNb2RlbE5vZGUuY21Ob2RlLmdldE5vZGVOYW1lKCkgOiAibnVsbCI7Ci0gICAgICAvL3ByaW50SW5kZW50ZWQoaW5kZW50LCAiK01hdGNoTW9kZWxOb2RlIDogIiArIGNtTm9kZU5hbWUgKyAgIiAiICsgc3RhcnRJbmRleCk7Ci0KLSAgICAgIGluZGVudCArPSAyOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hdGNoTW9kZWxOb2RlLmNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDTVZhbGlkYXRvci5NYXRjaE1vZGVsTm9kZSBjaGlsZCA9IChDTVZhbGlkYXRvci5NYXRjaE1vZGVsTm9kZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIHZpc2l0TWF0Y2hNb2RlbE5vZGUoY2hpbGQpOwotICAgICAgfQotICAgICAgaW5kZW50IC09IDI7Ci0KLSAgICAgIGlmIChtYXRjaE1vZGVsTm9kZS5jbU5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IG5vZGVUeXBlID0gbWF0Y2hNb2RlbE5vZGUuY21Ob2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgICAgIGlmIChub2RlVHlwZSA9PSBDTU5vZGUuR1JPVVApCi0gICAgICAgIHsKLSAgICAgICAgICBDTUdyb3VwIGdyb3VwID0gKENNR3JvdXApbWF0Y2hNb2RlbE5vZGUuY21Ob2RlOwotICAgICAgICAgIGlmIChncm91cC5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuQ0hPSUNFKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkZFJlcGxhY2VBY3Rpb25zKG1hdGNoTW9kZWxOb2RlLCBncm91cCwgc3RhcnRJbmRleCwgZWxlbWVudEluZGV4IC0gMSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5vZGVUeXBlID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudEluZGV4ID0gc3RhcnRJbmRleCArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgLy9wcmludEluZGVudGVkKGluZGVudCwgIi1NYXRjaE1vZGVsTm9kZSA6ICIgKyBjbU5vZGVOYW1lICsgICIgIiArIChlbGVtZW50SW5kZXggLSAxKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVwbGFjZUFjdGlvbnMoQ01WYWxpZGF0b3IuTWF0Y2hNb2RlbE5vZGUgbWF0Y2hNb2RlbE5vZGUsIENNR3JvdXAgZ3JvdXAsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpCi0gICAgewotICAgICAgQ01Ob2RlIGV4Y2x1ZGVDTU5vZGUgPSBudWxsOwotICAgICAgaWYgKG1hdGNoTW9kZWxOb2RlLmNoaWxkcmVuLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIENNVmFsaWRhdG9yLk1hdGNoTW9kZWxOb2RlIGNoaWxkID0gKENNVmFsaWRhdG9yLk1hdGNoTW9kZWxOb2RlKW1hdGNoTW9kZWxOb2RlLmNoaWxkcmVuLmdldCgwKTsKLSAgICAgICAgZXhjbHVkZUNNTm9kZSA9IGNoaWxkLmNtTm9kZTsKLSAgICAgIH0KLQotICAgICAgQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGdyb3VwLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlIGFsdGVybmF0aXZlID0gbm9kZUxpc3QuaXRlbShpKTsKLSAgICAgICAgaWYgKGFsdGVybmF0aXZlICE9IGV4Y2x1ZGVDTU5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbihNb2RlbFF1ZXJ5QWN0aW9uLlJFUExBQ0UsIHBhcmVudCwgYWx0ZXJuYXRpdmUsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKLSAgICAgICAgICBhY3Rpb25MaXN0LmFkZChhY3Rpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy9wdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRJbmRlbnRlZChpbnQgaW5kZW50LCBTdHJpbmcgc3RyaW5nKQotICAvL3sKLSAgLy8gIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCi0gIC8vICB7Ci0gIC8vICAgIFN5c3RlbS5vdXQucHJpbnQoIiAiKTsKLSAgLy8gIH0KLSAgLy8gIFN5c3RlbS5vdXQucHJpbnRsbihzdHJpbmcpOwotICAvL30KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNjQ4NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5tb2RlbHF1ZXJ5aW1wbC5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsLkNNRGF0YVR5cGVWYWx1ZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuRE9NVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZVRhYmxlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBsYXJnZSBwb3J0aW9uIG9mIHRoZSBNb2RlbFF1ZXJ5IGludGVyZmFjZXMuCi0gKiBTb21lIHdvcmsgaXMgZGVsZWdhdGVkIHRvIHRoZSBET01IZWxwZXIsIENNRG9jdW1lbnRNYW5hZ2VyLCBhbmQgRE9NVmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUltcGwgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5Ci17Ci0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcjsKLSAgcHJvdGVjdGVkIE1vZGVsUXVlcnlBY3Rpb25IZWxwZXIgbW9kZWxRdWVyeUFjdGlvbkhlbHBlcjsKLSAgcHJvdGVjdGVkIERPTVZhbGlkYXRvciB2YWxpZGF0b3I7ICAgCi0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGwgZXh0ZW5zaW9uTWFuYWdlcjsgICAKLSAgcHJvdGVjdGVkIENNRGF0YVR5cGVWYWx1ZUhlbHBlciB2YWx1ZUhlbHBlcjsKLSAgcHJvdGVjdGVkIGludCBlZGl0TW9kZSA9IEVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1Q7Ci0KLSAgcHVibGljIE1vZGVsUXVlcnlJbXBsKE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5tb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciA9IG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotICAgIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXIgPSBjcmVhdGVNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyKCk7Ci0gICAgdmFsaWRhdG9yID0gbmV3IERPTVZhbGlkYXRvcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBleHRlbnNpb25NYW5hZ2VyID0gbmV3IE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VySW1wbCgpOwotICAgIHZhbHVlSGVscGVyID0gbmV3IENNRGF0YVR5cGVWYWx1ZUhlbHBlcigpOwotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBpbnQgZ2V0RWRpdE1vZGUoKQotICB7Ci0gICAgcmV0dXJuIGVkaXRNb2RlOwotICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBzZXRFZGl0TW9kZShpbnQgZWRpdE1vZGUpCi0gIHsKLSAgICB0aGlzLmVkaXRNb2RlID1lZGl0TW9kZTsKLSAgfQotCi0KLSAgLy8gZmFjdG9yeSBtZXRob2RzCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyIGNyZWF0ZU1vZGVsUXVlcnlBY3Rpb25IZWxwZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyKHRoaXMpOwotICB9IAotCi0gIHB1YmxpYyBET01WYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLSAgewotICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gIH0KLQotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0gIH0KLQotICBwdWJsaWMgQ01Ob2RlIGdldENNTm9kZShOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0Q01Ob2RlKG5vZGUpOwotICB9Ci0KLSAgcHVibGljIENNRGF0YVR5cGUgZ2V0Q01EYXRhVHlwZShUZXh0IHRleHQpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0Q01EYXRhVHlwZSh0ZXh0KTsKLSAgfQotCi0gIHB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oQXR0ciBhdHRyKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0gIH0KLQotICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICB9Ci0gICAKLSAgcHVibGljIENNRG9jdW1lbnRNYW5hZ2VyIGdldENNRG9jdW1lbnRNYW5hZ2VyKCkKLSAgewotICAgIENNRG9jdW1lbnRNYW5hZ2VyIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgWE1MQXNzb2NpYXRpb25Qcm92aWRlcikKLSAgICB7ICAgICAgICAgICAgIAotICAgICAgWE1MQXNzb2NpYXRpb25Qcm92aWRlciB4bWxBc3NvY2lhdGlvblByb3ZpZGVyID0gKFhNTEFzc29jaWF0aW9uUHJvdmlkZXIpbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci0gICAgICByZXN1bHQgPSB4bWxBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgICAgCi0KLSAgLyoqCi0gICAqIEBkZXByZWN0ZWQgLSB1c2UgMyBhcmcgdmVyc2lvbiBiZWxvdwotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0Q01Eb2N1bWVudExpc3QoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdXJpKQotICB7ICAgICAgICAKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldENNRG9jdW1lbnRMaXN0KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgWE1MQXNzb2NpYXRpb25Qcm92aWRlcikKLSAgICB7ICAgICAgICAgICAgICAKLSAgICAgIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIgeG1sQXNzb2NpYXRpb25Qcm92aWRlciA9IChYTUxBc3NvY2lhdGlvblByb3ZpZGVyKW1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotICAgICAKLSAgICAgIC8vIHRvZG8uLi4gcmV2aXN0Li4uIGhhbmRsZSBlYWNoICMjdGhpbmcgZXhwbGljaXRseQotICAgICAgLy8gICAgICAgICAgCi0gICAgICBpZiAodXJpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHVyaSA9ICIjI2FueSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0gICAgICAgICAgICAgICAKLQotICAgICAgaWYgKHVyaS5lcXVhbHMoIiMjdGFyZ2V0TmFtZXNwYWNlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpZWQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICByZXN1bHQuYWRkKGNtRG9jdW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh1cmkuZXF1YWxzKCIjI2FueSIpIHx8IHVyaS5lcXVhbHMoIiMjb3RoZXIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgZXhjbHVkZWRVUkkgPSBudWxsOwotICAgICAgICBpZiAodXJpLmVxdWFscygiIyNvdGhlciIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCllZC5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZXhjbHVkZWRVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkIGNvbnNpZGVyIGFsbCBvZiB0aGUgc2NoZW1hIHJlbGF0ZWQgdG8gdGhpcyBkb2N1bWVudAotICAgICAgICAvLwotICAgICAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnRMaW5lYWdlKGVsZW1lbnQpOwotICAgICAgICBMaXN0IGxpc3QgPSBuYW1lc3BhY2VUYWJsZS5nZXROYW1lc3BhY2VJbmZvTGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKWkubmV4dCgpOwotICAgICAgICAgIGlmIChpbmZvLnVyaSAhPSBudWxsICYmICFpbmZvLnVyaS5lcXVhbHMoZXhjbHVkZWRVUkkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENNRG9jdW1lbnQgZG9jdW1lbnQgPSB4bWxBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRG9jdW1lbnQoaW5mby51cmksIGluZm8ubG9jYXRpb25IaW50LCAiWFNEIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQuYWRkKGRvY3VtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgIAotICAgICAgICBDTURvY3VtZW50IGRvY3VtZW50ID0geG1sQXNzb2NpYXRpb25Qcm92aWRlci5nZXRDTURvY3VtZW50KGVsZW1lbnQsIHVyaSk7Ci0gICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFkZChkb2N1bWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgCi0KLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgWE1MQXNzb2NpYXRpb25Qcm92aWRlcikKLSAgICB7ICAgICAgICAgICAgIAotICAgICAgWE1MQXNzb2NpYXRpb25Qcm92aWRlciB4bWxBc3NvY2lhdGlvblByb3ZpZGVyID0gKFhNTEFzc29jaWF0aW9uUHJvdmlkZXIpbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci0gICAgICByZXN1bHQgPSB4bWxBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRG9jdW1lbnQoZWxlbWVudCwgdXJpKTsKLSAgICB9Ci0gICAgLy9Db250ZW50TW9kZWxNYW5hZ2VyLnByaW50bG4oIk1vZGVsUXVlcnlJbXBsLmdldENNRG9jdW1lbnQoIiArIGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSArICIsICIgKyB1cmkgKyAiKSA9ICIgKyByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRlbnRWYWxpZChFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIHJldHVybiBpc0NvbnRlbnRWYWxpZChlZCwgZWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRlbnRWYWxpZChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7ICAgIAotICAgIGlmIChlZCAhPSBudWxsKQotICAgIHsgCi0gICAgICAvLyBmaXJzdCBjaGVjayB0byBzZWUgaWYgYWxsIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50Ci0gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgQ01OYW1lZE5vZGVNYXAgbWFwID0gZWQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgaW50IG1hcExlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKW1hcC5pdGVtKGkpOwotICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhZCwgZWxlbWVudCwgbnVsbCk7Ci0gICAgICAgIGlmIChhZC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpCi0gICAgICAgIHsgICAgICAgICAgICAgICAKLSAgICAgICAgICAgQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZU5hbWUpOwotICAgICAgICAgICBpZiAoYXR0ciA9PSBudWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBub3cgY2hlY2sgdG8gc2VlIG9mIHRoZSBjaGlsZHJlbiB2YWxpZGF0ZSBwcm9wZXJseQotICAgICAgLy8KLSAgICAgIGlmIChyZXN1bHQpIAotICAgICAgewotICAgICAgICBDTU5vZGVbXSBvcmlnaW5BcnJheSA9IGdldE9yaWdpbkFycmF5KGVsZW1lbnQpOwotICAgICAgICByZXN1bHQgPSBvcmlnaW5BcnJheSAhPSBudWxsICYmIG9yaWdpbkFycmF5Lmxlbmd0aCA9PSBlbGVtZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIENNTm9kZSBnZXRPcmlnaW4oTm9kZSBub2RlKQotICB7Ci0gICAgQ01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0gICAgLy8gdG9kby4uLiBtYWtlIHN1cmUgcGFyZW50IGlzIHJpZ2h0Ci0gICAgLy8KLSAgICBOb2RlIHBhcmVudE5vZGUgPSBnZXRQYXJlbnRPck93bmVyTm9kZShub2RlKTsKLSAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7Ci0gICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudClwYXJlbnROb2RlOwotICAgICAgQ01Ob2RlW10gYXJyYXkgPSBnZXRPcmlnaW5BcnJheShwYXJlbnRFbGVtZW50KTsKLSAgICAgIGlmIChhcnJheSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnQgaW5kZXggPSBnZXRJbmRleE9mTm9kZShwYXJlbnRFbGVtZW50LmdldENoaWxkTm9kZXMoKSwgbm9kZSk7Ci0gICAgICAgIGlmIChpbmRleCA8IGFycmF5Lmxlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGFycmF5W2luZGV4XTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIENNTm9kZVtdIGdldE9yaWdpbkFycmF5KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgcmV0dXJuIChlZCAhPSBudWxsKSA/IGdldFZhbGlkYXRvcigpLmdldE9yaWdpbkFycmF5KGVkLCBlbGVtZW50KSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEluZGV4T2ZOb2RlKE5vZGVMaXN0IG5vZGVMaXN0LCBOb2RlIG5vZGUpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gLTE7Ci0gICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgaWYgKG5vZGVMaXN0Lml0ZW0oaSkgPT0gbm9kZSkKLSAgICAgICB7Ci0gICAgICAgICByZXN1bHQgPSBpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIENNTm9kZSAnbWV0YSBkYXRhJyB0aGF0IG1heSBiZSBwb3RlbnRpYWxseSBhZGRlZCB0byB0aGUgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbnRlbnQoRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zKQotICB7Ci0gICAgQXZhaWxhYmxlQ29udGVudENNVmlzaXRvciB2aXNpdG9yID0gbmV3IEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IoZWxlbWVudCwgZWQpOwotICAgIExpc3QgbGlzdCA9IHZpc2l0b3IuY29tcHV0ZUF2YWlsYWJsZUNvbnRlbnQoaW5jbHVkZU9wdGlvbnMpOwotICAgIGlmIChleHRlbnNpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICBleHRlbnNpb25NYW5hZ2VyLmZpbHRlckF2YWlsYWJsZUVsZW1lbnRDb250ZW50KGxpc3QsIGVsZW1lbnQsIGVkLCBpbmNsdWRlT3B0aW9ucyk7Ci0gICAgfSAgCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0gIAotCi0KLSAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0KEVsZW1lbnQgcGFyZW50LCBDTU5vZGUgY21Ob2RlLCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50KTsKLSAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBjYW5JbnNlcnQocGFyZW50LCBlZCwgY21Ob2RlLCBpbmRleCwgdmFsaWRpdHlDaGVja2luZyk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBib29sZWFuIGNhbkluc2VydChFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIENNTm9kZSBjbU5vZGUsIGludCBpbmRleCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsKLSAgICByZXR1cm4gY2FuSW5zZXJ0KHBhcmVudCwgZWQsIGNtTm9kZSwgaW5kZXgsIHZhbGlkaXR5Q2hlY2tpbmcsIG51bGwpOwotICB9ICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuSW5zZXJ0KEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgQ01Ob2RlIGNtTm9kZSwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZywgT2JqZWN0IHJldXNlYWJsZURhdGEpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgc3dpdGNoIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICB7Ci0gICAgICBjYXNlIENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04gOgotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShjbU5vZGUsIHBhcmVudCwgbnVsbCk7Ci0gICAgICAgIHJlc3VsdCA9IHBhcmVudC5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZU5hbWUpID09IG51bGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0gICAgICBjYXNlIENNTm9kZS5HUk9VUCA6Ci0gICAgICB7Ci0gICAgICAgIGlmICh2YWxpZGl0eUNoZWNraW5nID09IFZBTElESVRZX1NUUklDVCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAvLyBjcmVhdGUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSBudWxsOwotICAgICAgICAgIGlmIChyZXVzZWFibGVEYXRhICE9IG51bGwpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IChMaXN0KXJldXNlYWJsZURhdGE7Ci0gICAgICAgICAgfSAgICAKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IGdldFZhbGlkYXRvcigpLmNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChwYXJlbnQsIGVkKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVzdWx0ID0gZ2V0VmFsaWRhdG9yKCkuY2FuSW5zZXJ0KGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIGluZGV4LCBjbU5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDTU5vZGUuREFUQV9UWVBFIDoKLSAgICAgIHsKLSAgICAgICAgaW50IGNvbnRlbnRUeXBlID0gZWQuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgcmVzdWx0ID0gKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8Ci0gICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgfHwKLSAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkFOWSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdCA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNhbkluc2VydChFbGVtZW50IHBhcmVudCwgTGlzdCBjbU5vZGVMaXN0LCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7Ci0gICAgLy8gdG9kbwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoTm9kZSBub2RlLCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsgICAgICAKLSAgICBpZiAodmFsaWRpdHlDaGVja2luZyA9PSBWQUxJRElUWV9TVFJJQ1QpCi0gICAgewotICAgICAgaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotICAgICAgc3dpdGNoIChub2RlVHlwZSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFOgotICAgICAgICB7Ci0gICAgICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oKEF0dHIpbm9kZSk7Ci0gICAgICAgICAgaWYgKGFkICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gKGFkLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIHBhcmVudE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICBpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KXBhcmVudE5vZGU7Ci0gICAgICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudEVsZW1lbnQpOwotICAgICAgICAgICAgaWYgKGVkICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KHBhcmVudEVsZW1lbnQsIGVkKTsKLSAgICAgICAgICAgICAgaW50IGluZGV4ID0gZ2V0SW5kZXhPZk5vZGUocGFyZW50RWxlbWVudC5nZXRDaGlsZE5vZGVzKCksIG5vZGUpOwotICAgICAgICAgICAgICByZXN1bHQgPSBnZXRWYWxpZGF0b3IoKS5jYW5SZW1vdmUoZWQsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoTGlzdCBub2RlTGlzdCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLSAgICBpZiAodmFsaWRpdHlDaGVja2luZyA9PSBWQUxJRElUWV9TVFJJQ1QpCi0gICAgewotICAgICAgRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gbnVsbDsKLSAgICAgIExpc3QgY2hpbGRMaXN0ID0gbnVsbDsKLQotICAgICAgZm9yIChJdGVyYXRvciBpID0gbm9kZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpaS5uZXh0KCk7Ci0KLSAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudEVsZW1lbnQgPSBnZXRQYXJlbnRPck93bmVyRWxlbWVudChub2RlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnRFbGVtZW50ICE9IGdldFBhcmVudE9yT3duZXJFbGVtZW50KG5vZGUpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBwYXJlbnQgYXJlIHRoZSBzYW1lCi0gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyZW50RWxlbWVudCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLSAgICAgICAgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWNhblJlbW92ZShub2RlLCB2YWxpZGl0eUNoZWNraW5nKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2hpbGRMaXN0ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRMaXN0ID0gbm9kZUxpc3RUb0xpc3QocGFyZW50RWxlbWVudC5nZXRDaGlsZE5vZGVzKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjaGlsZExpc3QucmVtb3ZlKG5vZGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZXN1bHQgJiYgY2hpbGRMaXN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50RWxlbWVudCk7Ci0gICAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IGdldFZhbGlkYXRvcigpLmNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChjaGlsZExpc3QsIGVkKTsKLSAgICAgICAgICByZXN1bHQgPSBnZXRWYWxpZGF0b3IoKS5pc1ZhbGlkKGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNhblJlcGxhY2UoRWxlbWVudCBwYXJlbnQsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIENNTm9kZSBjbU5vZGUsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5SZXBsYWNlKEVsZW1lbnQgcGFyZW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBMaXN0IGNtTm9kZUxpc3QsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gICAgIAotICAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyBleHBlcmltZW50YWwuLi4gdXNlIGF0IHlvdXIgb3duIHJpc2sKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGNhbldyYXAoRWxlbWVudCBjaGlsZEVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHdyYXBFbGVtZW50LCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsgIAotICAgIE5vZGUgcGFyZW50Tm9kZSA9IGNoaWxkRWxlbWVudC5nZXRQYXJlbnROb2RlKCk7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgeyAgICAgICAgICAgCi0gICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudClwYXJlbnROb2RlOyAgICAgIAotICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnRFbGVtZW50KTsKLSAgICAgIGlmIChwYXJlbnRFZCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmICh2YWxpZGl0eUNoZWNraW5nID09IFZBTElESVRZX1NUUklDVCkKLSAgICAgICAgewotICAgICAgICAgIGludCBpbmRleCA9IGdldEluZGV4T2ZOb2RlKHBhcmVudEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLCBjaGlsZEVsZW1lbnQpOwotCi0gICAgICAgICAgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSBnZXRWYWxpZGF0b3IoKS5jcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QocGFyZW50RWxlbWVudCwgcGFyZW50RWQpOwotICAgICAgICAgIExpc3Qgc3ViTGlzdCA9IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdC5zdWJMaXN0KGluZGV4LCBpbmRleCArIDEpOwotICAgICAgICAgIHJlc3VsdCA9IGdldFZhbGlkYXRvcigpLmNhblJlcGxhY2UocGFyZW50RWQsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW5kZXgsIGluZGV4LCB3cmFwRWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBnZXRWYWxpZGF0b3IoKS5pc1ZhbGlkKHdyYXBFbGVtZW50LCBzdWJMaXN0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0gICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldEluc2VydEFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5kZXgsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXIuZ2V0SW5zZXJ0QWN0aW9ucyhwYXJlbnQsIGVkLCBpbmRleCwgaW5jbHVkZU9wdGlvbnMsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhEb2N1bWVudCBwYXJlbnQsIENNRG9jdW1lbnQgY21Eb2N1bWVudCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBtb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmdldEluc2VydEFjdGlvbnMocGFyZW50LCBjbURvY3VtZW50LCBpbmRleCwgaW5jbHVkZU9wdGlvbnMsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0UmVwbGFjZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBtb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmdldFJlcGxhY2VBY3Rpb25zKHBhcmVudCwgZWQsIGluY2x1ZGVPcHRpb25zLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgfSAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIGdldFJlcGxhY2VBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBzZWxlY3RlZENoaWxkcmVuLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBtb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmdldFJlcGxhY2VBY3Rpb25zKHBhcmVudCwgZWQsIHNlbGVjdGVkQ2hpbGRyZW4sIGluY2x1ZGVPcHRpb25zLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldEluc2VydENoaWxkTm9kZUFjdGlvblRhYmxlKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIEhhc2h0YWJsZSBhY3Rpb25UYWJsZSkKLSAgewotICAgIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXIuZ2V0SW5zZXJ0Q2hpbGROb2RlQWN0aW9uVGFibGUocGFyZW50LCBlZCwgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uVGFibGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0QWN0aW9uVGFibGUoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nLCBIYXNodGFibGUgYWN0aW9uVGFibGUpCi0gIHsKLSAgICAvL21vZGVsUXVlcnlBY3Rpb25IZWxwZXIuZ2V0QWxsQWN0aW9ucyhwYXJlbnQsIGVkLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgfQotCi0KLSAgLy8gc29tZSBoZWxwZXIgbWV0aG9kcwotICAvLwotICBwcm90ZWN0ZWQgTm9kZSBnZXRQYXJlbnRPck93bmVyTm9kZShOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSA/Ci0gICAgICAgICAgICgoQXR0cilub2RlKS5nZXRPd25lckVsZW1lbnQoKSA6Ci0gICAgICAgICAgIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0UGFyZW50T3JPd25lckVsZW1lbnQoTm9kZSBub2RlKQotICB7Ci0gICAgTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnRPck93bmVyTm9kZShub2RlKTsKLSAgICByZXR1cm4gKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSA/IChFbGVtZW50KXBhcmVudCA6IG51bGw7Ci0gIH0KLSAgICAgICAgICAgICAgIAotCi0gIHByb3RlY3RlZCBMaXN0IG5vZGVMaXN0VG9MaXN0KE5vZGVMaXN0IG5vZGVMaXN0KQotICB7Ci0gICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHYuYWRkKG5vZGVMaXN0Lml0ZW0oaSkpOwotICAgIH0KLSAgICByZXR1cm4gdjsKLSAgfSAgIAotICAgCi0gIC8qKgotICBwcm90ZWN0ZWQgTGlzdCBnZXRDTU5vZGVMaXN0KE5vZGVMaXN0IG5vZGVMaXN0KQotICB7Ci0gICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3Ioc2l6ZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgdi5hZGQoZ2V0Q01Ob2RlKG5vZGVMaXN0Lml0ZW0oaSkpOwotICAgIH0KLSAgICByZXR1cm4gdjsKLSAgfQotICAqLyAgCi0KLSAgcHVibGljIGNsYXNzIEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IgZXh0ZW5kcyBDTVZpc2l0b3IKLSAgewotICAgIHB1YmxpYyBIYXNodGFibGUgY2hpbGROb2RlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcHVibGljIEhhc2h0YWJsZSBhdHRyaWJ1dGVUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBwdWJsaWMgRWxlbWVudCByb290RWxlbWVudDsKLSAgICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdEVsZW1lbnREZWNsYXJhdGlvbjsgCi0gICAgcHVibGljIGJvb2xlYW4gaXNSb290VmlzaXRlZDsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlU2VxdWVuY2VHcm91cHM7Ci0KLSAgICBwdWJsaWMgQXZhaWxhYmxlQ29udGVudENNVmlzaXRvcihFbGVtZW50IHJvb3RFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiByb290RWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0aGlzLnJvb3RFbGVtZW50ID0gcm9vdEVsZW1lbnQ7Ci0gICAgICB0aGlzLnJvb3RFbGVtZW50RGVjbGFyYXRpb24gPSByb290RWxlbWVudERlY2xhcmF0aW9uOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5KENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgU3RyaW5nIGtleSA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpY21Ob2RlLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotICAgICAgICB7ICAgCi0gICAgICAgICAga2V5ID0gIlsiICsgbmFtZXNwYWNlVVJJICsgIl0iICsga2V5OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVG9UYWJsZShIYXNodGFibGUgdGFibGUsIENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgU3RyaW5nIG5vZGVOYW1lID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICBpZiAobm9kZU5hbWUgIT0gbnVsbCAmJiBub2RlTmFtZS5sZW5ndGgoKSA+IDApCi0gICAgICB7ICAKLSAgICAgICAgdGFibGUucHV0KGdldEtleShjbU5vZGUpLCBjbU5vZGUpOwotICAgICAgfSAgCi0gICAgfQotCi0gICAgcHVibGljIExpc3QgY29tcHV0ZUF2YWlsYWJsZUNvbnRlbnQoaW50IGluY2x1ZGVPcHRpb25zKQotICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7ICAKLQotICAgICAgaW50IGNvbnRlbnRUeXBlID0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbi5nZXRDb250ZW50VHlwZSgpOwotICAgICAgaW5jbHVkZVNlcXVlbmNlR3JvdXBzID0gKChpbmNsdWRlT3B0aW9ucyAmIElOQ0xVREVfU0VRVUVOQ0VfR1JPVVBTKSAhPSAwKTsKLSAgICAgIHZpc2l0Q01Ob2RlKHJvb3RFbGVtZW50RGVjbGFyYXRpb24pOwotICAgICAgCi0gICAgICBpZiAoKGluY2x1ZGVPcHRpb25zICYgSU5DTFVERV9BVFRSSUJVVEVTKSAhPSAwKQotICAgICAgewotICAgICAgICB2LmFkZEFsbChhdHRyaWJ1dGVUYWJsZS52YWx1ZXMoKSk7Ci0gICAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gbmlsbGFibGVBdHRyaWJ1dGUgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbilyb290RWxlbWVudERlY2xhcmF0aW9uLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvbmlsbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAobmlsbGFibGVBdHRyaWJ1dGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHYuYWRkKG5pbGxhYmxlQXR0cmlidXRlKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0KLSAgICAgIGlmICgoaW5jbHVkZU9wdGlvbnMgJiBJTkNMVURFX0NISUxEX05PREVTKSAhPSAwKQotICAgICAgeyAgICAgIAotICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgfHwKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICB2LmFkZEFsbChjaGlsZE5vZGVUYWJsZS52YWx1ZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKQotICAgICAgICB7ICAgICAgCi0gICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gIChDTURvY3VtZW50KXJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7ICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB2LmFkZChpLm5leHQoKSk7Ci0gICAgICAgICAgICB9IAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHY7Ci0gICAgfSAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUFueUVsZW1lbnQoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gICAgeyAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHVyaSA9IGFueUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IGdldENNRG9jdW1lbnRMaXN0KHJvb3RFbGVtZW50LCByb290RWxlbWVudERlY2xhcmF0aW9uLCB1cmkpOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIENNRG9jdW1lbnQgY21kb2N1bWVudCA9IChDTURvY3VtZW50KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgaWYgKGNtZG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgQ01OYW1lZE5vZGVNYXAgbWFwID0gY21kb2N1bWVudC5nZXRFbGVtZW50cygpOwotICAgICAgICAgIGludCBzaXplID0gbWFwLmdldExlbmd0aCgpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgQ01Ob2RlIGVkID0gbWFwLml0ZW0oaSk7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGRUb1RhYmxlKGNoaWxkTm9kZVRhYmxlLGVkKTsKLSAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgICB7Ci0gICAgICBzdXBlci52aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oYWQpOwotICAgICAgYXR0cmlidXRlVGFibGUucHV0KGFkLmdldE5vZGVOYW1lKCksIGFkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICAgIHsKLSAgICAgIGlmIChlZCA9PSByb290RWxlbWVudERlY2xhcmF0aW9uICYmICFpc1Jvb3RWaXNpdGVkKQotICAgICAgewotICAgICAgICBpc1Jvb3RWaXNpdGVkID0gdHJ1ZTsKLSAgICAgICAgc3VwZXIudmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihlZCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoIUJvb2xlYW4uVFJVRS5lcXVhbHMoZWQuZ2V0UHJvcGVydHkoIkFic3RyYWN0IikpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBhZGRUb1RhYmxlKGNoaWxkTm9kZVRhYmxlLGVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIENNTm9kZUxpc3Qgc3Vic3RpdHV0aW9uR3JvdXAgPSAoQ01Ob2RlTGlzdCllZC5nZXRQcm9wZXJ0eSgiU3Vic3RpdHV0aW9uR3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoc3Vic3RpdHV0aW9uR3JvdXAgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZVN1YnN0aXR1dGlvbkdyb3VwKHN1YnN0aXR1dGlvbkdyb3VwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTdWJzdGl0dXRpb25Hcm91cChDTU5vZGVMaXN0IHN1YnN0aXR1dGlvbkdyb3VwKQotICAgIHsKLSAgICAgIGludCBzdWJzdGl0dXRpb25Hcm91cExlbmd0aCA9IHN1YnN0aXR1dGlvbkdyb3VwLmdldExlbmd0aCgpOwotICAgICAgaWYgKHN1YnN0aXR1dGlvbkdyb3VwTGVuZ3RoID4gMSkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJzdGl0dXRpb25Hcm91cExlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ01Ob2RlIGVkID0gc3Vic3RpdHV0aW9uR3JvdXAuaXRlbShpKTsKLSAgICAgICAgICBpZiAoIUJvb2xlYW4uVFJVRS5lcXVhbHMoZWQuZ2V0UHJvcGVydHkoIkFic3RyYWN0IikpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgYWRkVG9UYWJsZShjaGlsZE5vZGVUYWJsZSxlZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZ3JvdXApCi0gICAgewotICAgICAgaWYgKGluY2x1ZGVTZXF1ZW5jZUdyb3VwcykKLSAgICAgIHsKLSAgICAgICAgaWYgKGdyb3VwLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5TRVFVRU5DRSAmJgotICAgICAgICAgICAgZ3JvdXAuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID4gMSAmJgotICAgICAgICAgICAgaW5jbHVkZXNSZXF1aXJlZENvbnRlbnQoZ3JvdXApKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGNoaWxkTm9kZVRhYmxlLnB1dChncm91cCwgZ3JvdXApOwotICAgICAgICB9Ci0gICAgICB9ICAKLSAgICAgIHN1cGVyLnZpc2l0Q01Hcm91cChncm91cCk7Ci0gICAgfSAgIAotCi0gICAgcHVibGljIGJvb2xlYW4gaW5jbHVkZXNSZXF1aXJlZENvbnRlbnQoQ01Hcm91cCBncm91cCkKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSBnZXRWYWxpZGF0b3IoKS5jcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoZ3JvdXApOwotICAgICAgcmV0dXJuIGxpc3Quc2l6ZSgpID4gMTsKLSAgICB9Ci0gIH0gICAgCi0KLSAKLSAgLyoqCi0gICAqIEBkZXByZWN0ZWQgLSB1c2UgZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXREYXRhVHlwZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBBcnJheXMuYXNMaXN0KGdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoZWxlbWVudCwgY21Ob2RlKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZHMgcmV0dXJuIGFuIGFycmF5IG9mIHBvc3NpYmxlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBkYXRhdHlwZSBvZiB0aGUgQ01Ob2RlIChlaXRoZXIgYW4gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBvciBhIENNRWxlbWVudERlY2xhcmF0aW9uKQotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoY21Ob2RlICE9IG51bGwpCi0gICAgeyAgICAgICAKLSAgICAgIENNRGF0YVR5cGUgZGF0YVR5cGUgPSBudWxsOwotICAgICAgaWYgKGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pCi0gICAgICB7Ci0gICAgICAgIGRhdGFUeXBlID0gKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKWNtTm9kZSkuZ2V0QXR0clR5cGUoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgICAgewotICAgICAgICBkYXRhVHlwZSA9ICgoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Ob2RlKS5nZXREYXRhVHlwZSgpOwotICAgICAgfSAgICAgICAgIAotICAgICAKLSAgICAgIFN0cmluZ1tdIGVudW1lcmF0ZWRWYWx1ZXMgPSBkYXRhVHlwZSAhPSBudWxsID8gZGF0YVR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpIDogbnVsbDsgICAgICAKLSAgICAgIGlmIChlbnVtZXJhdGVkVmFsdWVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bWVyYXRlZFZhbHVlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGVudW1lcmF0ZWRWYWx1ZXNbaV0pOwotICAgICAgICB9IAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBhZGRWYWx1ZXNGb3JYU0lUeXBlKGVsZW1lbnQsIGNtTm9kZSwgbGlzdCk7Ci0gICAgCi0gICAgaWYgKGV4dGVuc2lvbk1hbmFnZXIgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGxpc3QuYWRkQWxsKGV4dGVuc2lvbk1hbmFnZXIuZ2V0RGF0YVR5cGVWYWx1ZXMoZWxlbWVudCwgY21Ob2RlKSk7Ci0gICAgfSAgICAgICAgICAKLSAgICAKLSAgICAvLyBSZW1vdmUgZHVwbGljYXRlcwotICAgIExpc3QgZHVwbGljYXRlRnJlZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotICAgIAlpZihkdXBsaWNhdGVGcmVlTGlzdC5pbmRleE9mKG5leHQpID09IC0xKSB7Ci0gICAgCQlkdXBsaWNhdGVGcmVlTGlzdC5hZGQobmV4dCk7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIChTdHJpbmdbXSkgZHVwbGljYXRlRnJlZUxpc3QudG9BcnJheShuZXcgU3RyaW5nW2R1cGxpY2F0ZUZyZWVMaXN0LnNpemUoKV0pOwotICB9ICAgIAotCi0gICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZXNGb3JYU0lUeXBlKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSwgTGlzdCBsaXN0KQotICB7ICAgICAgICAgICAgICAgCi0gICAgaWYgKGNtTm9kZSAhPSBudWxsICYmIGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pY21Ob2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKHZhbHVlSGVscGVyLmlzWFNJVHlwZShhZCkpCi0gICAgICB7ICAgICAgICAgICAgIAotICAgICAgICBOYW1lc3BhY2VUYWJsZSB0YWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIHRhYmxlLmFkZEVsZW1lbnRMaW5lYWdlKGVsZW1lbnQpOwotICAgICAgICBsaXN0LmFkZEFsbCh2YWx1ZUhlbHBlci5nZXRRdWFsaWZpZWRYU0lUeXBlcyhhZCwgdGFibGUpKTsgICAgIAotICAgICAgfQotICAgIH0KLSAgfQotICAgIAotCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlciBnZXRFeHRlbnNpb25NYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiBleHRlbnNpb25NYW5hZ2VyOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1NpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1MjQyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUNNUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBCYXNlQXNzb2NpYXRpb25Qcm92aWRlcgotewotICBwcm90ZWN0ZWQgTW9kZWxRdWVyeUNNUHJvdmlkZXIgbW9kZWxRdWVyeUNNUHJvdmlkZXI7Ci0gICAgICAgICAgCi0gIHB1YmxpYyBTaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyKE1vZGVsUXVlcnlDTVByb3ZpZGVyIG1vZGVsUXVlcnlDTVByb3ZpZGVyKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMubW9kZWxRdWVyeUNNUHJvdmlkZXIgPSBtb2RlbFF1ZXJ5Q01Qcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSkKLSAgewotICAgIHJldHVybiBtb2RlbFF1ZXJ5Q01Qcm92aWRlci5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChub2RlKTsKLSAgfQotICAKLSAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZWxlbWVudCk7Ci0gICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICB7ICAgICAgICAKLSAgICAgIHJlc3VsdCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbiljbURvY3VtZW50LmdldEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSk7ICAgIAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvWE1MQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1hNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkzNzM5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvWE1MQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZVRhYmxlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYTUxBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgQmFzZUFzc29jaWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBDTURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIKLXsgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZTsgCi0gIHByb3RlY3RlZCBDTURvY3VtZW50TWFuYWdlckltcGwgZG9jdW1lbnRNYW5hZ2VyOwotCi0gIHB1YmxpYyBYTUxBc3NvY2lhdGlvblByb3ZpZGVyKENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGUpCi0gIHsKLSAgICB0aGlzLmNtRG9jdW1lbnRDYWNoZSA9IGNtRG9jdW1lbnRDYWNoZTsgCi0gICAgZG9jdW1lbnRNYW5hZ2VyID0gbmV3IENNRG9jdW1lbnRNYW5hZ2VySW1wbChjbURvY3VtZW50Q2FjaGUsIHRoaXMpOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIENNRG9jdW1lbnRNYW5hZ2VyIGdldENNRG9jdW1lbnRNYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiBkb2N1bWVudE1hbmFnZXI7Ci0gIH0KLSAKLSAgICAgIAotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldERvY3R5cGVJbmZvKERvY3VtZW50IGRvY3VtZW50KQotICB7ICAgCi0gICAgU3RyaW5nW10gcmVzdWx0ID0gbnVsbDsKLSAgICBEb2N1bWVudFR5cGUgZG9jdHlwZSA9IGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQotICAgIC8vIGRlZmVjdCAyMDY4MzMgLi4uIGhlcmUgd2UgdGVzdCBmb3IgRFREcyB0aGF0IGFyZSBkZWNsYXJlZCBpbmxpbmUKLSAgICAvLyBzaW5jZSB3ZSBjdXJyZW50bHkgaGF2ZSBubyB3YXkgb2YgbWFraW5nIHVzZSBvZiBpbmxpbmUgRFREcyB3ZSBpbmdvcmUgdGhlbQotICAgIC8vIHNvIHRoYXQgdGhlIGltcGxpY3QgRFREIChpZiBhbnkpIGNhbiBiZSB1c2VkCi0gICAgaWYgKGRvY3R5cGUgIT0gbnVsbCAmJiAoZG9jdHlwZS5nZXRQdWJsaWNJZCgpICE9IG51bGwgfHwgZG9jdHlwZS5nZXRTeXN0ZW1JZCgpICE9IG51bGwpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICByZXN1bHRbMF0gPSBkb2N0eXBlLmdldFB1YmxpY0lkKCk7Ci0gICAgICByZXN1bHRbMV0gPSBkb2N0eXBlLmdldFN5c3RlbUlkKCk7Ci0gICAgfSAgIAotICAgIGVsc2UgaWYgKGdldEltcGxpY3REb2N0eXBlKGRvY3VtZW50KSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldEltcGxpY3REb2N0eXBlKGRvY3VtZW50KTsKLSAgICB9ICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgIAotCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBnZXRJbXBsaWN0RG9jdHlwZShEb2N1bWVudCBkb2N1bWVudCkKLSAgeyAKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBudWxsOwotICAgIC8qCi0gICAgRE9NRXh0ZW5zaW9uIGRvbUV4dGVuc2lvbiA9IERPTUV4dGVuc2lvblByb3ZpZGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRET01FeHRlbnNpb24oZG9jdW1lbnQpOwotICAgIGlmIChkb21FeHRlbnNpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBkb21FeHRlbnNpb24uZ2V0SW1wbGljaXREb2N0eXBlKCk7Ci0gICAgfSovCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSkKLSAgeyAgICAgICAgCi0gICAgcmV0dXJuIGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KG5vZGUsIHRydWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlLCBib29sZWFuIGdldERvY3VtZW50RnJvbUNNTm9kZSkKLSAgeyAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgPyAoRG9jdW1lbnQpbm9kZSA6IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgCi0gICAgICBTdHJpbmdbXSBkb2N0eXBlSW5mbyA9IGdldERvY3R5cGVJbmZvKGRvY3VtZW50KTsKLQotICAgICAgaWYgKGRvY3R5cGVJbmZvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldENNRG9jdW1lbnQoZG9jdHlwZUluZm9bMF0sIGRvY3R5cGVJbmZvWzFdLCAiRFREIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIC8vIGRlZmVjdCAyMTEyMzYgLi4uIGluIHNvbWUgY2FzZXMgY2FsbGluZyB0aGlzIG1ldGhvZCBjYW4gcmVzdWx0IGluIGEgY3ljbGUKLSAgICAgIC8vIHdlIHVzZSB0aGUgZ2V0RG9jdW1lbnRGcm9tQ01Ob2RlIGFzIGEgZmxhZyB0byBhdm9pZCB0aGlzIAotICAgICAgLy8gVE9ETy4uLiBzZWUgaWYgdGhlcmUgaXMgYSB3YXkgdG8gcmUtb3JnYW5pemUgdG8gYXZvaWQgdGhlIG5lZWQgZm9yIHRoaXMgZmxhZwotICAgICAgZWxzZSBpZiAoZ2V0RG9jdW1lbnRGcm9tQ01Ob2RlKQotICAgICAgewotICAgICAgICBDTU5vZGUgY21Ob2RlID0gZ2V0Q01Ob2RlKG5vZGUpOwotICAgICAgICBpZiAoY21Ob2RlICE9IG51bGwpICAgICAgIAotICAgICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgIC8vIHRvZG8uLi4gYWRkIGEgZ2V0Q01Eb2N1bWVudCgpIG1ldGhvZHMgdG8gQ01Ob2RlCi0gICAgICAgICAgLy8gZm9yIG5vdyB1c2UgdGhlIGdldFByb3BlcnR5IGludGVyZmFjZQotICAgICAgICAgIHJlc3VsdCA9IChDTURvY3VtZW50KWNtTm9kZS5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiBsb2NhdGluZyBDTURvY3VtZW50IGZvciAiICsgbm9kZSwgZSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAKLQotICAgICAgCi0gIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdXJpKQotICB7Ci0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50TGluZWFnZShlbGVtZW50KTsKLSAgICBOYW1lc3BhY2VJbmZvIG5hbWVzcGFjZUluZm8gPSBuYW1lc3BhY2VUYWJsZS5nZXROYW1lc3BhY2VJbmZvRm9yVVJJKHVyaSk7Ci0gICAgaWYgKG5hbWVzcGFjZUluZm8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBnZXRDTURvY3VtZW50KG5hbWVzcGFjZUluZm8udXJpLCBuYW1lc3BhY2VJbmZvLmxvY2F0aW9uSGludCwgIlhTRCIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAKLSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgdHlwZSkKLSAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAvL1N0cmluZyByZXNvbHZlZEdyYW1tYXJVUkkgPSByZXNvbHZlR3JhbW1hclVSSShkb2N1bWVudCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICByZXR1cm4gZG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnQocHVibGljSWQsIHN5c3RlbUlkLCB0eXBlKTsgIAotICB9Ci0KLSAgLy9wdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgLy97ICAgICAgICAgICAgICAgICAgIAotICAvLyAgLy9TdHJpbmcgcmVzb2x2ZWRHcmFtbWFyVVJJID0gcmVzb2x2ZUdyYW1tYXJVUkkoZG9jdW1lbnQsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gIC8vICByZXR1cm4gZG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnQocHVibGljSWQsIHN5c3RlbUlkKTsgIAotICAvL30KLSAgIAotICBwdWJsaWMgU3RyaW5nIHJlc29sdmVHcmFtbWFyVVJJKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgcmV0dXJuIHJlc29sdmVHcmFtbWFyVVJJKG51bGwsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgc3BlY2lhbGl6ZWQgaW4gb3JkZXIgdG8gaW1wbGVtZW50IHNwZWNpYWxpemVkIHVyaSByZXNvbHV0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVHcmFtbWFyVVJJKERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgewotICAgIHJldHVybiBzeXN0ZW1JZDsKLSAgfQotICAKLQotICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KQotICB7IAotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7IAotICAgIERvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgU3RyaW5nW10gZG9jdHlwZUluZm8gPSBnZXREb2N0eXBlSW5mbyhkb2N1bWVudCk7Ci0gICAgaWYgKGRvY3R5cGVJbmZvICE9IG51bGwpCi0gICAgeyAgIAotICAgICAgLy8gd2UgaGF2ZSBkZXRlY3RlZCBkb2N0eXBlIGluZm9ybWF0aW9uIHNvIHdlIGFzc3VtZSB0aGF0IHdlIGNhbiBsb2NhdGUgdGhlIENNRWxlbWVudERlY2xhcmF0aW9uIAotICAgICAgLy8gaW4gdGhlIENNRG9jdW1lbnQncyB0YWJsZSBvZiBnbG9iYWwgZWxlbWVudHMgCi0gICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChlbGVtZW50LCBmYWxzZSk7Ci0KLSAgICAgIC8vIFRPRE8uLi4gY29uc2lkZXIgcmVwbGFjaW5nIGFib3ZlIHdpdGggCi0gICAgICAvLyBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBnZXRDTURvY3VtZW50KGRvY3VtZW50LCBkb2N0eXBlSW5mb1swXSwgZG9jdHlwZUluZm9bMV0pOwotCi0gICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbiljbURvY3VtZW50LmdldEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSk7ICAgIAotICAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gdGhpcyBpcyBhIGhhY2sgdG8gZ2V0IG91ciB4c2wgY29kZSBhc3Npc3Qgd29ya2luZy4uLiB3ZSBtaWdodCB3YW50IHRvIGhhbmRsZSBzaW1pbGFyCi0gICAgICAgIC8vIGdyYW1tYXIgYmVoYXZpb3VyIHZpYSBzb21lIGVzdGFibGlzaGVkIG1vZGVsIHF1ZXJ5IHNldHRpbmcgCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiBnZXRJbXBsaWN0RG9jdHlwZShkb2N1bWVudCkgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgIAotICAgICAgICAgIE5vZGUgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KXBhcmVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgICBlbHNlCi0gICAgeyAgCi0gICAgICAvLyBoZXJlIHdlIHVzZSBhIG5hbWVzcGFjZVRhYmxlIHRvIGNvbnNpZGVyIGlmIHRoZSByb290IGVsZW1lbnQgaGFzIGFueSBuYW1lc3BhY2UgaW5mb3JtYXRpb24KLSAgICAgIC8vCi0gICAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICBMaXN0IGxpc3QgPSBOYW1lc3BhY2VUYWJsZS5nZXRFbGVtZW50TGluZWFnZShlbGVtZW50KTsKLSAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSAoRWxlbWVudClsaXN0LmdldCgwKTsKLSAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQocm9vdEVsZW1lbnQpOwotICAgICAgICAgCi0gICAgICBpZiAobmFtZXNwYWNlVGFibGUuaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCgpKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIHdlIGFzc3VtZSB0aGF0IHRoaXMgaXMgYW4gWE1MU2NoZW1hIHN0eWxlIG5hbWVzcGFjZSBhd2FyZSBkb2N1bWVudAotICAgICAgICByZXN1bHQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50LCBsaXN0LCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7IAotICAgICAgICAvLyB3ZSBhc3N1bWUgdGhhdCB0aGlzIGlzIGFuIGluZmVycmVkIENNRG9jdW1lbnQgZm9yIGEgRFREIHN0eWxlICduYW1lc3BhY2VsZXNzJyBkb2N1bWVudAotICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBnZXRDTURvY3VtZW50KCIiLCAiIiwgIkRURCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0oZWxlbWVudC5nZXROb2RlTmFtZSgpKTsgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0gICAgIAotCi0gIHByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IHRhcmdldEVsZW1lbnQsIExpc3QgbGlzdCwgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUpCi0gIHsgICAgICAgICAKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBjdXJyZW50RUQgPSBudWxsOwotICAgIHRyeQotICAgIHsgICAgCi0gICAgICBpbnQgbGlzdFNpemUgPSBsaXN0LnNpemUoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFNpemU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpbGlzdC5nZXQoaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBlbGVtZW50LmdldE5vZGVOYW1lKCk7Ci0gICAgICAgIFN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShub2RlTmFtZSk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KG5vZGVOYW1lKTsKLSAKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotIAotICAgICAgICAvLyBzZWUgaWYgdGhlIGVsZW1lbnQgaXMgYSBsb2NhbCBvZiB0aGUgY3VycmVudEVECi0gICAgICAgIC8vICAgICAgICAgICAgIAotICAgICAgICBpZiAoY3VycmVudEVEICE9IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWN1cnJlbnRFRC5nZXRMb2NhbEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKHVucHJlZml4ZWROYW1lKTsKLSAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGVkID09IG51bGwpIAotICAgICAgICB7ICAgICAgICAgICAgICAgCi0gICAgICAgICAgTmFtZXNwYWNlSW5mbyBuYW1lc3BhY2VJbmZvID0gbmFtZXNwYWNlVGFibGUuZ2V0TmFtZXNwYWNlSW5mb0ZvclByZWZpeChwcmVmaXgpOyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBpZiAobmFtZXNwYWNlSW5mbyAhPSBudWxsKSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBnZXRDTURvY3VtZW50KG5hbWVzcGFjZUluZm8udXJpLCBuYW1lc3BhY2VJbmZvLmxvY2F0aW9uSGludCwgIlhTRCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Eb2N1bWVudC5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbSh1bnByZWZpeGVkTmFtZSk7ICAgCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBjdXJyZW50RUQgPSBlZDsgICAgIAotCi0gICAgICAgIC8vIGhhbmRsZSBYU0lUeXBlICAgICAKLSAgICAgICAgaWYgKGN1cnJlbnRFRCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZGVyaXZlZEVEID0gZ2V0RGVyaXZlZENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQsIGN1cnJlbnRFRCwgbmFtZXNwYWNlVGFibGUpOwotICAgICAgICAgIGlmIChkZXJpdmVkRUQgIT0gbnVsbCkKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjdXJyZW50RUQgPSBkZXJpdmVkRUQ7Ci0gICAgICAgICAgfSAgICAKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgeyAKLSAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiBsb2NhdGluZyBlbGVtZW50IGRlY2xhcmF0aW9uIGZvciAiICsgdGFyZ2V0RWxlbWVudCwgZSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9IAotICAKLSAgICByZXR1cm4gY3VycmVudEVEOwotICB9ICAKLSAgICAgIAotCi0gIHByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXREZXJpdmVkQ01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBTdHJpbmcgeHNpUHJlZml4ID0gbmFtZXNwYWNlVGFibGUuZ2V0UHJlZml4Rm9yVVJJKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKHhzaVByZWZpeCAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyB4c2lUeXBlVmFsdWUgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZSh4c2lQcmVmaXggKyAiOnR5cGUiKSA/IGVsZW1lbnQuZ2V0QXR0cmlidXRlKHhzaVByZWZpeCArICI6dHlwZSIpIDogbnVsbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBpZiAoeHNpVHlwZVZhbHVlICE9IG51bGwgJiYgeHNpVHlwZVZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgIHsgIAotICAgICAgICBTdHJpbmcgdHlwZVByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgoeHNpVHlwZVZhbHVlKTsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKHhzaVR5cGVWYWx1ZSk7Ci0gICAgICAgIFN0cmluZyB0eXBlVVJJID0gbmFtZXNwYWNlVGFibGUuZ2V0VVJJRm9yUHJlZml4KHR5cGVQcmVmaXgpOwotICAgICAgICBTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWUgPSB0eXBlTmFtZTsKLSAgICAgICAgaWYgKHR5cGVVUkkgIT0gbnVsbCAmJiB0eXBlVVJJLmxlbmd0aCgpID4gMCkgCi0gICAgICAgIHsKLSAgICAgICAgICB1cmlRdWFsaWZpZWRUeXBlTmFtZSA9ICJbIiArICB0eXBlVVJJICsgIl0iICsgdHlwZU5hbWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbillZC5nZXRQcm9wZXJ0eSgiRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbj0iICsgdXJpUXVhbGlmaWVkVHlwZU5hbWUpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAKLQotCi0gIHB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oQXR0ciBhdHRyKQotICB7Ci0gICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgICAgaWYgKGVkICE9IG51bGwpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKWVkLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0ci5nZXROYW1lKCkpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgLy8gdHJ5IHRvIGdldCB0aGUgdW5wcmVmaXhlZCBuYW1lICAgICAgICAgICAgIAotICAgICAgICAgIFN0cmluZyBuYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICByZXN1bHQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbillZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKG5hbWUpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIHRvZG8uLi4gcGVyaGFwcyB0aGlzIGlzIGEgZ2xvYmFsbHkgZGVmaW5lZCBhdHRyaWJ1dGUuLi4gCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgICAgICAgIAotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBDTURvY3VtZW50UmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIG5vZGUgb3Igc3VidHJlZQotICAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBMaXN0IGdldENNRG9jdW1lbnRSZWZlcmVuY2VzKE5vZGUgbm9kZSwgYm9vbGVhbiBkZWVwKQotICB7IAotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOyAgCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgPyAoRG9jdW1lbnQpbm9kZSA6IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgIERvY3VtZW50VHlwZSBkb2N0eXBlID0gZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotICAgIC8vIGRlZmVjdCAyMDY4MzMgLi4uIGhlcmUgd2UgdGVzdCBmb3IgRFREcyB0aGF0IGFyZSBkZWNsYXJlZCBpbmxpbmUKLSAgICAvLyBzaW5jZSB3ZSBjdXJyZW50bHkgaGF2ZSBubyB3YXkgb2YgbWFraW5nIHVzZSBvZiBpbmxpbmUgRFREcyB3ZSBpbmdvcmUgdGhlbQotICAgIC8vIHNvIHRoYXQgdGhlIGltcGxpY3QgRFREIChpZiBhbnkpIGNhbiBiZSB1c2VkCi0gICAgaWYgKGRvY3R5cGUgIT0gbnVsbCAmJiAoZG9jdHlwZS5nZXRQdWJsaWNJZCgpICE9IG51bGwgfHwgZG9jdHlwZS5nZXRTeXN0ZW1JZCgpICE9IG51bGwpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmcgdXJpID0gcmVzb2x2ZUdyYW1tYXJVUkkoZG9jdW1lbnQsIGRvY3R5cGUuZ2V0UHVibGljSWQoKSwgZG9jdHlwZS5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgIHJlc3VsdC5hZGQobmV3IENNRG9jdW1lbnRSZWZlcmVuY2VJbXBsKGRvY3R5cGUuZ2V0UHVibGljSWQoKSwgdXJpKSk7Ci0gICAgfSAgIAotICAgIGVsc2UgaWYgKGdldEltcGxpY3REb2N0eXBlKGRvY3VtZW50KSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgIFN0cmluZ1tdIGltcGxpY2l0RG9jdHlwZSA9IGdldEltcGxpY3REb2N0eXBlKGRvY3VtZW50KTsKLSAgICAgIFN0cmluZyB1cmkgPSByZXNvbHZlR3JhbW1hclVSSShkb2N1bWVudCwgaW1wbGljaXREb2N0eXBlWzBdLCBpbXBsaWNpdERvY3R5cGVbMV0pOwotICAgICAgcmVzdWx0LmFkZChuZXcgQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwoaW1wbGljaXREb2N0eXBlWzBdLCB1cmkpKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZWxzZQotICAgIHsgICAKLSAgICAgIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKGRvY3VtZW50KTsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0JCSAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KChFbGVtZW50KW5vZGUpOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChkZWVwKQotICAgICAgewotICAgICAgICBhZGRDaGlsZEVsZW1lbnRzVG9OYW1lc3BhY2VUYWJsZShub2RlLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICB9Ci0JICAgIExpc3QgbGlzdCA9IG5hbWVzcGFjZVRhYmxlLmdldE5hbWVzcGFjZUluZm9MaXN0KCk7Ci0JCSAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIAotICAgICAgewotCQkJICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7ICAgIAotICAgICAgICBTdHJpbmcgdXJpID0gcmVzb2x2ZUdyYW1tYXJVUkkoZG9jdW1lbnQsIGluZm8udXJpLCBpbmZvLmxvY2F0aW9uSGludCk7Ci0gICAgICAgIHJlc3VsdC5hZGQobmV3IENNRG9jdW1lbnRSZWZlcmVuY2VJbXBsKGluZm8udXJpLCB1cmkpKTsKLQkJICB9CQotICAgIH0gCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZENoaWxkRWxlbWVudHNUb05hbWVzcGFjZVRhYmxlKE5vZGUgbm9kZSwgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUpCi0gIHsKLSAgICBOb2RlTGlzdCBub2RlTGlzdCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCSAgaWYgKG5vZGVMaXN0ICE9IG51bGwpIAotICAgIHsKLQkJICBpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspIAotICAgICAgewotCQkJICBOb2RlIGNoaWxkTm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0gICAgICAgIGlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgeyAgIAotICAgICAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoKEVsZW1lbnQpY2hpbGROb2RlKTsKLSAgICAgICAgICBhZGRDaGlsZEVsZW1lbnRzVG9OYW1lc3BhY2VUYWJsZShjaGlsZE5vZGUsIG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgICAgfQotCQkgIH0KLQkgIH0KLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURlc2NyaXB0aW9uQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01EZXNjcmlwdGlvbkJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgyYWIxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURlc2NyaXB0aW9uQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDTURlc2NyaXB0aW9uQnVpbGRlciBleHRlbmRzIENNVmlzaXRvcgotewotICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHNiOwotICBwcm90ZWN0ZWQgQ01Ob2RlIHJvb3Q7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzUm9vdFZpc2l0ZWQ7Ci0gIHB1YmxpYyBTdHJpbmcgYnVpbGREZXNjcmlwdGlvbihDTU5vZGUgbm9kZSkKLSAgewotICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHJvb3QgPSBub2RlOwotICAgIGlzUm9vdFZpc2l0ZWQgPSBmYWxzZTsKLSAgICB2aXNpdENNTm9kZShub2RlKTsKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfSAgICAgICAKLQotICBwdWJsaWMgdm9pZCB2aXNpdENNQW55RWxlbWVudChDTUFueUVsZW1lbnQgYW55RWxlbWVudCkKLSAgewotICAgIHNiLmFwcGVuZCgibmFtZXNwYWNlOnVyaT1cIiIgKyBhbnlFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTURhdGFUeXBlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgICBzYi5hcHBlbmQoIiNQQ0RBVEEiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTURvY3VtZW50KENNRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBDTU5hbWVkTm9kZU1hcCBtYXAgPSBkb2N1bWVudC5nZXRFbGVtZW50cygpOwotICAgIGludCBzaXplID0gbWFwLmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHZpc2l0Q01Ob2RlKG1hcC5pdGVtKGkpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNR3JvdXAoQ01Hcm91cCBncm91cCkKLSAgewotICAgIGludCBvcCA9IGdyb3VwLmdldE9wZXJhdG9yKCk7Ci0gICAgaWYgKG9wID09IENNR3JvdXAuQUxMKQotICAgIHsKLSAgICAgIHNiLmFwcGVuZCgiYWxsIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBzYi5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgU3RyaW5nIHNlcGFyYXRvciA9ICIsICI7IC8vJE5PTi1OTFMtMSQKLQotICAgIGlmIChvcCA9PSBDTUdyb3VwLkNIT0lDRSkKLSAgICB7Ci0gICAgICBzZXBhcmF0b3IgPSAiIHwgIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgIAotICAgIENNTm9kZUxpc3Qgbm9kZUxpc3QgPSBncm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICB2aXNpdENNTm9kZShub2RlTGlzdC5pdGVtKGkpKTsKLSAgICAgIGlmIChpIDwgc2l6ZSAtIDEpCi0gICAgICB7Ci0gICAgICAgIHNiLmFwcGVuZChzZXBhcmF0b3IpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBzYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotICAgIGFkZE9jY3VyZW5jZVN5bWJvbChncm91cCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7Ci0gICAgaWYgKGVkID09IHJvb3QgJiYgIWlzUm9vdFZpc2l0ZWQpCi0gICAgewotICAgICAgaXNSb290VmlzaXRlZCA9IHRydWU7Ci0gICAgICBDTUNvbnRlbnQgY29udGVudCA9IGVkLmdldENvbnRlbnQoKTsKLSAgICAgIGlmIChjb250ZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChjb250ZW50LmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkdST1VQKQotICAgICAgICB7Ci0gICAgICAgICAgc2IuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB2aXNpdENNTm9kZShjb250ZW50KTsKLSAgICAgICAgICBzYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01Ob2RlKGNvbnRlbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzYi5hcHBlbmQoZWQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICBhZGRPY2N1cmVuY2VTeW1ib2woZWQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZE9jY3VyZW5jZVN5bWJvbChDTUNvbnRlbnQgY29udGVudCkKLSAgewotICAgIGludCBtaW4gPSBjb250ZW50LmdldE1pbk9jY3VyKCk7Ci0gICAgaW50IG1heCA9IGNvbnRlbnQuZ2V0TWF4T2NjdXIoKTsKLSAgICBpZiAobWluID09IDApCi0gICAgewotICAgICAgaWYgKG1heCA+IDEgfHwgbWF4ID09IC0xKQotICAgICAgewotICAgICAgICBzYi5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzYi5hcHBlbmQoIj8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChtYXggPiAxIHx8IG1heCA9PSAtMSkKLSAgICB7Ci0gICAgICBzYi5hcHBlbmQoIisiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01Eb2N1bWVudENhY2hlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURvY3VtZW50Q2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwZmY1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURvY3VtZW50Q2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIENNRG9jdW1lbnRDYWNoZQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX05PVF9MT0FERUQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTE9BRElORyAgICA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19MT0FERUQgICAgID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0VSUk9SICAgICAgPSA0OwotCi0gIHByb3RlY3RlZCBjbGFzcyBFbnRyeQotICB7Ci0gICAgcHVibGljIFN0cmluZyB1cmk7Ci0gICAgcHVibGljIGludCBzdGF0dXMgPSBTVEFUVVNfTk9UX0xPQURFRDsKLSAgICBwdWJsaWMgZmxvYXQgcHJvZ3Jlc3M7Ci0gICAgcHVibGljIENNRG9jdW1lbnQgY21Eb2N1bWVudDsKLQotICAgIHB1YmxpYyBFbnRyeShTdHJpbmcgdXJpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0aGlzLnVyaSA9IHVyaTsgICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW50cnkoU3RyaW5nIHVyaSwgaW50IHN0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0aGlzLnVyaSA9IHVyaTsKLSAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOyAgICAgIAotICAgICAgdGhpcy5jbURvY3VtZW50ID0gY21Eb2N1bWVudDsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGhhc2h0YWJsZTsKLSAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0KLSAgLyoqCi0gICAqIHRlbXBvcmFyaWx5IHB1YmxpYyB1bnRpbCBjYWNoaW5nIHByb2JsZW0gaXMgc29sdmVkCi0gICAqLwotICBwdWJsaWMgQ01Eb2N1bWVudENhY2hlKCkKLSAgewotICAgIGhhc2h0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihDTURvY3VtZW50Q2FjaGVMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICB9ICAgCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KFN0cmluZyBncmFtbWFyVVJJKQotICB7Ci0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIGlmIChncmFtbWFyVVJJICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSloYXNodGFibGUuZ2V0KGdyYW1tYXJVUkkpOwotICAgICAgaWYgKGVudHJ5ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGVudHJ5LmNtRG9jdW1lbnQ7Ci0gICAgICB9ICAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgaW50IGdldFN0YXR1cyhTdHJpbmcgZ3JhbW1hclVSSSkKLSAgewotICAgIGludCByZXN1bHQgPSBTVEFUVVNfTk9UX0xPQURFRDsKLSAgICBpZiAoZ3JhbW1hclVSSSAhPSBudWxsKQotICAgIHsgIAotICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpaGFzaHRhYmxlLmdldChncmFtbWFyVVJJKTsKLSAgICAgIGlmIChlbnRyeSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBlbnRyeS5zdGF0dXM7Ci0gICAgICB9ICAgICAgCi0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHJvdGVjdGVkIEVudHJ5IGxvb2t1cE9yQ3JlYXRlKFN0cmluZyBncmFtbWFyVVJJKQotICB7Ci0gICAgRW50cnkgZW50cnkgPSAoRW50cnkpaGFzaHRhYmxlLmdldChncmFtbWFyVVJJKTsKLSAgICBpZiAoZW50cnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbnRyeSA9IG5ldyBFbnRyeShncmFtbWFyVVJJKTsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaGFzaHRhYmxlLnB1dChncmFtbWFyVVJJLCBlbnRyeSk7Ci0gICAgfQotICAgIHJldHVybiBlbnRyeTsKLSAgfQotCi0gICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHZvaWQgcHV0Q01Eb2N1bWVudChTdHJpbmcgZ3JhbW1hclVSSSwgQ01Eb2N1bWVudCBjbURvY3VtZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKGdyYW1tYXJVUkkgIT0gbnVsbCAmJiBjbURvY3VtZW50ICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgRW50cnkgZW50cnkgPSBsb29rdXBPckNyZWF0ZShncmFtbWFyVVJJKTsKLSAgICAgIGludCBvbGRTdGF0dXMgPSBlbnRyeS5zdGF0dXM7Ci0gICAgICBlbnRyeS5zdGF0dXMgPSBTVEFUVVNfTE9BREVEOwotICAgICAgZW50cnkuY21Eb2N1bWVudCA9IGNtRG9jdW1lbnQ7ICAKLSAgICAgIG5vdGlmeUNhY2hlVXBkYXRlZChncmFtbWFyVVJJLCBvbGRTdGF0dXMsIGVudHJ5LnN0YXR1cywgZW50cnkuY21Eb2N1bWVudCk7ICAKLSAgICB9Ci0gIH0KLSAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBncmFtbWFyVVJJLCBpbnQgc3RhdHVzKQotICB7Ci0gICAgaWYgKGdyYW1tYXJVUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbnRyeSBlbnRyeSA9IGxvb2t1cE9yQ3JlYXRlKGdyYW1tYXJVUkkpOwotICAgICAgaW50IG9sZFN0YXR1cyA9IGVudHJ5LnN0YXR1czsKLSAgICAgIGVudHJ5LnN0YXR1cyA9IHN0YXR1czsKLSAgICAgIG5vdGlmeUNhY2hlVXBkYXRlZChncmFtbWFyVVJJLCBvbGRTdGF0dXMsIGVudHJ5LnN0YXR1cywgZW50cnkuY21Eb2N1bWVudCk7ICAgCi0gICAgfQotICB9Ci0gICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkKLSAgewotICAgIGhhc2h0YWJsZS5jbGVhcigpOwotICAgIG5vdGlmeUNhY2hlQ2xlYXJlZCgpOwotICB9ICAKLQotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIG5vdGlmeUNhY2hlVXBkYXRlZChTdHJpbmcgdXJpLCBpbnQgb2xkU3RhdHVzLCBpbnQgbmV3U3RhdHVzLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpCi0gIHsgICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgbGlzdC5hZGRBbGwobGlzdGVuZXJMaXN0KTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIgbGlzdGVuZXIgPSAoQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICBsaXN0ZW5lci5jYWNoZVVwZGF0ZWQodGhpcywgdXJpLCBvbGRTdGF0dXMsIG5ld1N0YXR1cywgY21Eb2N1bWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlDYWNoZUNsZWFyZWQoKQotICB7ICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgbGlzdC5hZGRBbGwobGlzdGVuZXJMaXN0KTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIgbGlzdGVuZXIgPSAoQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICBsaXN0ZW5lci5jYWNoZUNsZWFyZWQodGhpcyk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRDTURvY3VtZW50cygpCi0gIHsKLSAgCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgIAkKLSAgCWZvciAoSXRlcmF0b3IgaSA9IGhhc2h0YWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAJewotICAJCUVudHJ5IGVudHJ5ID0gKEVudHJ5KWkubmV4dCgpOwotICAJCWxpc3QuYWRkKGVudHJ5LmNtRG9jdW1lbnQpOwotICAJfQotICAJcmV0dXJuIGxpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRG9jdW1lbnRDYWNoZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURvY3VtZW50Q2FjaGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY2ZGNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRG9jdW1lbnRDYWNoZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0KLS8qKgotICogdG9kby4uLiBhZGQgbW9yZSBpbnRlcmZhY2UgbWV0aG9kcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyCi17Ci0gIC8qKiBUZWxscyB0aGUgY2xpZW50IHRoYXQgdGhlIGNhY2hlIGhhcyBiZWVuIGNsZWFyZWQuCi0gICAqICBUaGlzIGdpdmVzIGNsaWVudHMgYW4gb3Bwb3J0dW5pdHkgdG8gZmx1c2ggYW55IHN0YXRlIHRoYXQgZGVwZW5kcyBvbiB0aGUgQ01Eb2N1bWVudAotICAgKiAgc2luY2UgdGhpcyBDTURvY3VtZW50IHdpbGwgYmUgcmVjb21wdXRlZCBvbiBhIHN1YnNlcXVlbnQgJ2xvb2t1cCcgcmVxdWVzdAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FjaGVDbGVhcmVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSk7IAotCi0gIC8qKiAKLSAgICogIFRlbGxzIHRoZSBjbGllbnQgdGhhdCB0aGUgY2FjaGUgaGFzIGJlZW4gdXBkYXRlZC4gIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FjaGVVcGRhdGVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01WaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YmI5ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgQ01WaXNpdG9yCi17Ci0gIHByb3RlY3RlZCBpbnQgaW5kZW50ID0gMDsKLSAgcHJvdGVjdGVkIFN0YWNrIHZpc2l0ZWRDTUdyb3VwU3RhY2sgPSBuZXcgU3RhY2soKTsKLQotICBwdWJsaWMgdm9pZCB2aXNpdENNTm9kZShDTU5vZGUgbm9kZSkKLSAgewotICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgewotICAgICAgLy9Db250ZW50TW9kZWxNYW5hZ2VyLnByaW50bG5JbmRlbnRlZCgidmlzaXRDTU5vZGUgOiAiICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIiAiICsgbm9kZSk7Ci0gICAgICBpbmRlbnQgKz0gMjsKLSAgICAgIGludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLSAgICAgIHN3aXRjaCAobm9kZVR5cGUpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgQ01Ob2RlLkFOWV9FTEVNRU5UIDoKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01BbnlFbGVtZW50KChDTUFueUVsZW1lbnQpbm9kZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OIDoKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbigoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbilub2RlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENNTm9kZS5EQVRBX1RZUEUgOgotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTURhdGFUeXBlKChDTURhdGFUeXBlKW5vZGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ01Ob2RlLkRPQ1VNRU5UIDoKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01Eb2N1bWVudCgoQ01Eb2N1bWVudClub2RlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oKENNRWxlbWVudERlY2xhcmF0aW9uKW5vZGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ01Ob2RlLkdST1VQIDoKLSAgICAgICAgewotICAgICAgICAgIENNR3JvdXAgZ3JvdXAgPSAoQ01Hcm91cClub2RlOwotICAgICAgICAgIAotICAgICAgICAgIC8vIFRoaXMgaXMgdG8gcHJldmVudCByZWN1cnNpb24uCi0gICAgICAgICAgaWYgKHZpc2l0ZWRDTUdyb3VwU3RhY2suY29udGFpbnMoZ3JvdXApKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICAvLyBQdXNoIHRoZSBjdXJyZW50IGdyb3VwIHRvIGNoZWNrIGxhdGVyIHRvIGF2b2lkIHBvdGVudGlhbCByZWN1cnNpb24KLSAgICAgICAgICB2aXNpdGVkQ01Hcm91cFN0YWNrLnB1c2goZ3JvdXApOwotICAgICAgICAgIAotICAgICAgICAgIHZpc2l0Q01Hcm91cChncm91cCk7Ci0KLSAgICAgICAgICAvLyBQb3AgdGhlIGN1cnJlbnQgZ3JvdXAKLSAgICAgICAgICB2aXNpdGVkQ01Hcm91cFN0YWNrLnBvcCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRlbnQgLT0gMjsKLSAgICB9Ci0gIH0KLSAgICAgIAotICBwdWJsaWMgdm9pZCB2aXNpdENNQW55RWxlbWVudChDTUFueUVsZW1lbnQgYW55RWxlbWVudCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01EYXRhVHlwZShDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNRG9jdW1lbnQoQ01Eb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIENNTmFtZWROb2RlTWFwIG1hcCA9IGRvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0gICAgaW50IHNpemUgPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgdmlzaXRDTU5vZGUobWFwLml0ZW0oaSkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKQotICB7Ci0gICAgQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGdyb3VwLmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgc2l6ZSA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHZpc2l0Q01Ob2RlKG5vZGVMaXN0Lml0ZW0oaSkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsKLSAgICBDTU5hbWVkTm9kZU1hcCBub2RlTWFwID0gZWQuZ2V0QXR0cmlidXRlcygpOwotICAgIGludCBzaXplID0gbm9kZU1hcC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICB2aXNpdENNTm9kZShub2RlTWFwLml0ZW0oaSkpOwotICAgIH0KLQotICAgIHZpc2l0Q01Ob2RlKGVkLmdldENvbnRlbnQoKSk7Ci0KLSAgICB2aXNpdENNRGF0YVR5cGUoZWQuZ2V0RGF0YVR5cGUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NvbnRlbnRCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9Db250ZW50QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQwMmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NvbnRlbnRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi0gICAgICAgICAgICAgICAgICAgCi0vKioKLSAqIFRoaXMgY2xhc3MgbGV0cyB5b3UgdHJhdmVyc2UgYSAnQ00nIG1vZGVsIHByb3ZpZGluZyBjYWxsYmFja3MgdG8gYnVpbGQgY29udGVudC4KLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRCdWlsZGVyIGV4dGVuZHMgQ01WaXNpdG9yCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxEX0FMTF9DT05URU5UID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfT05MWV9SRVFVSVJFRF9DT05URU5UID0gMjsKLSAgcHJvdGVjdGVkIGludCBidWlsZFBvbGljeSA9IEJVSUxEX0FMTF9DT05URU5UOwotCi0gIHByb3RlY3RlZCBib29sZWFuIGFsd2F5c1Zpc2l0OwotICBwcm90ZWN0ZWQgVmVjdG9yIHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgcHVibGljIENvbnRlbnRCdWlsZGVyKCkKLSAgewotICB9Ci0gICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHNldEJ1aWxkUG9saWN5KGludCBidWlsZFBvbGljeSkKLSAgewotICAgIHRoaXMuYnVpbGRQb2xpY3kgPSBidWlsZFBvbGljeTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0QnVpbGRQb2xpY3koKQotICB7Ci0gICAgcmV0dXJuIGJ1aWxkUG9saWN5OwotICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW55RWxlbWVudE5vZGUoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVsZW1lbnROb2RlU3RhcnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgICAgICAKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVsZW1lbnROb2RlRW5kKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUZXh0Tm9kZShDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlTm9kZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSkKLSAgewotICB9IAotIAotICBwdWJsaWMgdm9pZCB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7Ci0gICAgaW50IGZvcmNlZE1pbiA9IChidWlsZFBvbGljeSA9PSBCVUlMRF9BTExfQ09OVEVOVCB8fCBhbHdheXNWaXNpdCkgPyAxIDogMDsKLSAgICBpbnQgbWluID0gTWF0aC5tYXgoZWQuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0KLSAgICBpZiAobWluID4gMCAmJiAhdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5jb250YWlucyhlZCkpCi0gICAgewotICAgICAgdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5hZGQoZWQpOwotICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbWluOyBpKyspCi0gICAgICB7ICAgICAgIAotICAgICAgICBjcmVhdGVFbGVtZW50Tm9kZVN0YXJ0KGVkKTsgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBpbnN0ZWFkIG9mIGNhbGxpbmcgc3VwZXIudmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgICAgIC8vIHdlIGR1cGxpY2F0ZSB0aGUgY29kZSB3aXRoIHNvbWUgbWlub3IgbW9kaWZpY2F0aW9ucwotICAgICAgICBDTU5hbWVkTm9kZU1hcCBub2RlTWFwID0gZWQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBpbnQgc2l6ZSA9IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTU5vZGUobm9kZU1hcC5pdGVtKGopKTsKLSAgICAgICAgfQotCi0gICAgICAgIENNQ29udGVudCBjb250ZW50ID0gZWQuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTU5vZGUoY29udGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWQuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEpCi0gICAgICAgIHsKLSAgICAgICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gZWQuZ2V0RGF0YVR5cGUoKTsKLSAgICAgICAgICBpZiAoZGF0YVR5cGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2aXNpdENNRGF0YVR5cGUoZGF0YVR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBlbmQgZHVwbGljYXRpb24KLSAgICAgICAgY3JlYXRlRWxlbWVudE5vZGVFbmQoZWQpOyAgCi0gICAgICB9Ci0gICAgICBpbnQgc2l6ZSA9IHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3Quc2l6ZSgpOwotICAgICAgdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5yZW1vdmUoc2l6ZSAtIDEpOwotICAgIH0KLSAgfQotICAgIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01EYXRhVHlwZShDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7Ci0gICAgY3JlYXRlVGV4dE5vZGUoZGF0YVR5cGUpOyAgIAotICB9Ci0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNR3JvdXAoQ01Hcm91cCBlKQotICB7IAotICAgIGludCBmb3JjZWRNaW4gPSAoYnVpbGRQb2xpY3kgPT0gQlVJTERfQUxMX0NPTlRFTlQgfHwgYWx3YXlzVmlzaXQpID8gMSA6IDA7Ci0gICAgaW50IG1pbiA9IE1hdGgubWF4KGUuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0KLSAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtaW47IGkrKykKLSAgICB7ICAgCi0gICAgICBpZiAoZS5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuQ0hPSUNFKQotICAgICAgewotICAgICAgICAvLyBhZGQgb25seSAxIGVsZW1lbnQgZnJvbSB0aGUgZ3JvdXAKLSAgICAgICAgLy8gdG9kby4uLiBwZXJoYXBzIGFkZCBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgZmlyc3Qgb25lICAgICAgICAKLSAgICAgICAgQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTU5vZGUobm9kZUxpc3QuaXRlbSgwKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLy8gU0VRVUVOQ0UsIEFMTAotICAgICAgewotICAgICAgICAvLyB2aXNpdCBhbGwgb2YgdGhlIGNvbnRlbnQKLSAgICAgICAgc3VwZXIudmlzaXRDTUdyb3VwKGUpOwotICAgICAgfQotICAgIH0KLSAgfSAKLQotICBwdWJsaWMgdm9pZCB2aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgewotICAgIGlmIChhbHdheXNWaXNpdCB8fAotICAgICAgICBidWlsZFBvbGljeSA9PSBCVUlMRF9BTExfQ09OVEVOVCB8fAotICAgICAgICBhZC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpCi0gICAgewotICAgICAgY3JlYXRlQXR0cmlidXRlTm9kZShhZCk7ICAgICAgCi0gICAgfQotICB9ICAgICAgICAgICAgICAgICAgICAgCi0gIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICB7ICAKLSAgICBpbnQgZm9yY2VkTWluID0gKGJ1aWxkUG9saWN5ID09IEJVSUxEX0FMTF9DT05URU5UIHx8IGFsd2F5c1Zpc2l0KSA/IDEgOiAwOwotICAgIGFsd2F5c1Zpc2l0ID0gZmFsc2U7IAotICAgIGludCBtaW4gPSBNYXRoLm1heChhbnlFbGVtZW50LmdldE1pbk9jY3VyKCksIGZvcmNlZE1pbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtaW47IGkrKykKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGNyZWF0ZUFueUVsZW1lbnROb2RlKGFueUVsZW1lbnQpOwotICAgIH0KLSAgfSAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Db250ZW50QnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NQ29udGVudEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyMzU3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Db250ZW50QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIERPTUNvbnRlbnRCdWlsZGVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxEX09QVElPTkFMX0FUVFJJQlVURVMgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9PUFRJT05BTF9FTEVNRU5UUyA9IDE8PDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxEX0ZJUlNUX0NIT0lDRSA9IDE8PDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxEX1RFWFRfTk9ERVMgPSAxPDwzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9GSVJTVF9TVUJTVElUVVRJT04gPSAxPDw0OwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgCi0gICAgQlVJTERfT05MWV9SRVFVSVJFRF9DT05URU5UID0KLSAgICAgIEJVSUxEX0ZJUlNUX0NIT0lDRQotICAgICAgfCBCVUlMRF9URVhUX05PREVTOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCAKLSAgICBCVUlMRF9BTExfQ09OVEVOVCA9IAotICAgICAgQlVJTERfT1BUSU9OQUxfQVRUUklCVVRFUyAKLSAgICAgIHwgQlVJTERfT1BUSU9OQUxfRUxFTUVOVFMgCi0gICAgICB8IEJVSUxEX0ZJUlNUX0NIT0lDRQotICAgICAgfCBCVUlMRF9URVhUX05PREVTOwotICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0JVSUxEX0JMQU5LX1RFWFRfTk9ERVMgPSAiYnVpbGRCbGFua1RleHROb2RlcyI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHB1YmxpYyB2b2lkIHNldEJ1aWxkUG9saWN5KGludCBidWlsZFBvbGljeSk7Ci0gIHB1YmxpYyBpbnQgIGdldEJ1aWxkUG9saWN5KCk7Ci0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCB2YWx1ZSk7Ci0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0gIHB1YmxpYyBMaXN0IGdldFJlc3VsdCgpOwotICBwdWJsaWMgdm9pZCBidWlsZChOb2RlIHBhcmVudCwgQ01Ob2RlIGNoaWxkKTsKLSAgcHVibGljIHZvaWQgY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KENNRG9jdW1lbnQgY21Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdENNRWxlbWVudERlY2xhcmF0aW9uKSB0aHJvd3MgRXhjZXB0aW9uOwotICBwdWJsaWMgdm9pZCBjcmVhdGVEZWZhdWx0Um9vdENvbnRlbnQoQ01Eb2N1bWVudCBjbURvY3VtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiByb290Q01FbGVtZW50RGVjbGFyYXRpb24sIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpIHRocm93cyBFeGNlcHRpb247Ci0gIHB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRDb250ZW50KE5vZGUgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgdGhyb3dzIEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTUNvbnRlbnRCdWlsZGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NQ29udGVudEJ1aWxkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MGY2ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NQ29udGVudEJ1aWxkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbnRlbnRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsLkNNRGF0YVR5cGVWYWx1ZUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiB0b2RvLi4uIGNvbW1vbiB1cCB0aGlzIGNvZGUgd2l0aCAnQ29udGVudEJ1aWxkZXInCi0gKi8KLXB1YmxpYyBjbGFzcyBET01Db250ZW50QnVpbGRlckltcGwgZXh0ZW5kcyBDTVZpc2l0b3IgaW1wbGVtZW50cyBET01Db250ZW50QnVpbGRlciB7Ci0JcHJvdGVjdGVkIGludCBidWlsZFBvbGljeSA9IEJVSUxEX0FMTF9DT05URU5UOwotCXByb3RlY3RlZCBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0JcHJvdGVjdGVkIExpc3QgcmVzdWx0TGlzdDsKLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JcHJvdGVjdGVkIE5vZGUgY3VycmVudFBhcmVudDsKLQlwcm90ZWN0ZWQgTm9kZSB0b3BQYXJlbnQ7Ci0JcHJvdGVjdGVkIFZlY3RvciB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0ID0gbmV3IFZlY3RvcigpOwotCXByb3RlY3RlZCBib29sZWFuIGF0dGFjaE5vZGVzVG9QYXJlbnQgPSB0cnVlOwotCXByb3RlY3RlZCBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZTsKLQotCXByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0OwotCXByb3RlY3RlZCBFbGVtZW50IHJvb3RFbGVtZW50OyAvLyB0aGlzIGlzIHVzZWQgb25seSB0ZXBvcmFyaWx5IHZpYQotCQkJCQkJCQkJLy8gY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50Ci0JcHJvdGVjdGVkIEV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQgZXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydDsKLQotCXB1YmxpYyBib29sZWFuIHN1cHJlc3NDcmVhdGlvbk9mRG9jdHlwZUFuZFhNTERlY2xhcmF0aW9uOwotCi0JcHJvdGVjdGVkIENNRGF0YVR5cGVWYWx1ZUhlbHBlciB2YWx1ZUhlbHBlciA9IG5ldyBDTURhdGFUeXBlVmFsdWVIZWxwZXIoKTsKLQotCXByb3RlY3RlZCBpbnQgbnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMgPSAxOwotCXByb3RlY3RlZCBTdGFjayBjbUdyb3VwU3RhY2sgPSBuZXcgU3RhY2soKTsKLQlwcm90ZWN0ZWQgaW50IGRlcHRoTGltaXQgPSAtMTsKLQotCXByb3RlY3RlZCBpbnQgZG9tTGV2ZWw7Ci0JcHJpdmF0ZSBpbnQgb3JpZ2luYWxCdWlsZFBvbGljeTsKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIEV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQgewotCQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydChFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0IGV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQpIHsKLQkJdGhpcy5leHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0ID0gZXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydDsKLQl9Ci0KLQlwdWJsaWMgRE9NQ29udGVudEJ1aWxkZXJJbXBsKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJbmFtZXNwYWNlVGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZG9jdW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1aWxkUG9saWN5KGludCBidWlsZFBvbGljeSkgewotCQl0aGlzLmJ1aWxkUG9saWN5ID0gYnVpbGRQb2xpY3k7Ci0JfQotCi0JcHVibGljIGludCBnZXRCdWlsZFBvbGljeSgpIHsKLQkJcmV0dXJuIGJ1aWxkUG9saWN5OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkQWxsQ29udGVudChpbnQgcG9saWN5KSB7Ci0JCXJldHVybiAocG9saWN5ICYgQlVJTERfQUxMX0NPTlRFTlQpID09IEJVSUxEX0FMTF9DT05URU5UOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkT3B0aW9uYWxFbGVtZW50cyhpbnQgcG9saWN5KSB7Ci0JCXJldHVybiAocG9saWN5ICYgQlVJTERfT1BUSU9OQUxfRUxFTUVOVFMpID09IEJVSUxEX09QVElPTkFMX0VMRU1FTlRTOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkT3B0aW9uYWxBdHRyaWJ1dGVzKGludCBwb2xpY3kpIHsKLQkJcmV0dXJuIChwb2xpY3kgJiBCVUlMRF9PUFRJT05BTF9BVFRSSUJVVEVTKSA9PSBCVUlMRF9PUFRJT05BTF9BVFRSSUJVVEVTOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRmlyc3RDaG9pY2UoaW50IHBvbGljeSkgewotCQlyZXR1cm4gKHBvbGljeSAmIEJVSUxEX0ZJUlNUX0NIT0lDRSkgPT0gQlVJTERfRklSU1RfQ0hPSUNFOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkVGV4dE5vZGVzKGludCBwb2xpY3kpIHsKLQkJcmV0dXJuIChwb2xpY3kgJiBCVUlMRF9URVhUX05PREVTKSA9PSBCVUlMRF9URVhUX05PREVTOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRmlyc3RTdWJzdGl0dXRpb24oaW50IHBvbGljeSkgewotCQlyZXR1cm4gKHBvbGljeSAmIEJVSUxEX0ZJUlNUX1NVQlNUSVRVVElPTikgPT0gQlVJTERfRklSU1RfU1VCU1RJVFVUSU9OOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHJlc3VsdExpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXByb3BlcnR5VGFibGUucHV0KHByb3BlcnR5TmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gcHJvcGVydHlUYWJsZS5nZXQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBidWlsZChOb2RlIHBhcmVudCwgQ01Ob2RlIGNoaWxkKSB7Ci0JCXJlc3VsdExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCXRvcFBhcmVudCA9IHBhcmVudDsKLQkJY3VycmVudFBhcmVudCA9IHBhcmVudDsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCW5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnRMaW5lYWdlKChFbGVtZW50KSBwYXJlbnQpOwotCQl9Ci0JCWF0dGFjaE5vZGVzVG9QYXJlbnQgPSBmYWxzZTsKLQkJYWx3YXlzVmlzaXQgPSB0cnVlOwotCQl2aXNpdENNTm9kZShjaGlsZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KENNRG9jdW1lbnQgY21Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdENNRWxlbWVudERlY2xhcmF0aW9uLCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5uYW1lc3BhY2VJbmZvTGlzdCA9IG5hbWVzcGFjZUluZm9MaXN0OwotCQljcmVhdGVEZWZhdWx0Um9vdENvbnRlbnQoY21Eb2N1bWVudCwgcm9vdENNRWxlbWVudERlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVEZWZhdWx0Um9vdENvbnRlbnQoQ01Eb2N1bWVudCBjbURvY3VtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiByb290Q01FbGVtZW50RGVjbGFyYXRpb24pIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgZ3JhbW1hckZpbGVOYW1lID0gY21Eb2N1bWVudC5nZXROb2RlTmFtZSgpOwotCQlpZiAoIXN1cHJlc3NDcmVhdGlvbk9mRG9jdHlwZUFuZFhNTERlY2xhcmF0aW9uKSB7Ci0JCQkvLyBUT0RPIGNzLi4uIGludmVzdGlnYXRlIHRvIHNlZSBpZiB0aGlzIGNvZGUgcGF0aCBpcyBldmVyIHVzZWQsCi0JCQkvLyBkb2Vzbid0IHNlZW0gdG8gYmUKLQkJCS8vIGZvciBub3cgSSdtIHNldHRpbmcgdGhlIGVuY29kaW5nIHRvIFVURi04IGp1c3QgaW5jYXNlIHRoaXMgY29kZQotCQkJLy8gcGF0aCBpcyB1c2VkIHNvbWV3aGVyZQotCQkJLy8KLQkJCVN0cmluZyBwaVZhbHVlID0gInZlcnNpb249XCIxLjBcIiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBlbmNvZGluZyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJCXBpVmFsdWUgKz0gIiBlbmNvZGluZz1cIiIgKyBlbmNvZGluZyArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAgICAgIAotCQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpID0gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ4bWwiLCBwaVZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQocGkpOwotCi0JCQkvLyBpZiB3ZSBoYXZlIGEgJ2R0ZCcgdGhlbiBhZGQgYSBET0NUWVBFIHRhZwotCQkJLy8KLQkJCWlmIChncmFtbWFyRmlsZU5hbWUgIT0gbnVsbCAmJiBncmFtbWFyRmlsZU5hbWUuZW5kc1dpdGgoImR0ZCIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJRE9NSW1wbGVtZW50YXRpb24gZG9tSW1wbCA9IGRvY3VtZW50LmdldEltcGxlbWVudGF0aW9uKCk7Ci0JCQkJRG9jdW1lbnRUeXBlIGRvY3VtZW50VHlwZSA9IGRvbUltcGwuY3JlYXRlRG9jdW1lbnRUeXBlKHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbi5nZXRFbGVtZW50TmFtZSgpLCBncmFtbWFyRmlsZU5hbWUsIGdyYW1tYXJGaWxlTmFtZSk7Ci0JCQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnRUeXBlKTsKLQkJCX0KLQkJfQotCi0JCS8vIGlmIHdlIGhhdmUgYSBzY2hlbWEgYWRkIGFuIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUKLQkJLy8KLQkJaWYgKGdyYW1tYXJGaWxlTmFtZSAhPSBudWxsICYmIGdyYW1tYXJGaWxlTmFtZS5lbmRzV2l0aCgieHNkIikgJiYgbmFtZXNwYWNlSW5mb0xpc3QgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlET01OYW1lc3BhY2VJbmZvTWFuYWdlciBtYW5hZ2VyID0gbmV3IERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbi5nZXROb2RlTmFtZSgpOwotCQkJaWYgKG5hbWVzcGFjZUluZm9MaXN0LnNpemUoKSA+IDApIHsKLQkJCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgbmFtZXNwYWNlSW5mb0xpc3QuZ2V0KDApOwotCQkJCWlmIChpbmZvLnByZWZpeCAhPSBudWxsICYmIGluZm8ucHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCQluYW1lID0gaW5mby5wcmVmaXggKyAiOiIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJcm9vdEVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbiwgbmFtZSwgZG9jdW1lbnQpOwotCQkJbWFuYWdlci5hZGROYW1lc3BhY2VJbmZvKHJvb3RFbGVtZW50LCBuYW1lc3BhY2VJbmZvTGlzdCwgdHJ1ZSk7Ci0JCX0KLQkJY3JlYXRlRGVmYXVsdENvbnRlbnQoZG9jdW1lbnQsIHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRGVmYXVsdENvbnRlbnQoTm9kZSBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JCWN1cnJlbnRQYXJlbnQgPSBwYXJlbnQ7Ci0JCWFsd2F5c1Zpc2l0ID0gdHJ1ZTsKLQkJb3JpZ2luYWxCdWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5OwotCQl2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKGVkKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVOYW1lKENNTm9kZSBjbU5vZGUsIE5vZGUgcGFyZW50KSB7Ci0JCVN0cmluZyBwcmVmaXggPSBudWxsOwotCQlyZXR1cm4gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGNtTm9kZSwgcGFyZW50LCBwcmVmaXgsIG5hbWVzcGFjZVRhYmxlKTsKLQl9Ci0KLQkvLyBvdmVyaWRlIHRoZSBmb2xsb3dpbmcgJ2NyZWF0ZScgbWV0aG9kcyB0byBjb250cm9sIGhvdyBub2RlcyBhcmUgY3JlYXRlZAotCS8vCi0JcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgU3RyaW5nIG5hbWUsIE5vZGUgcGFyZW50KSB7Ci0JCXJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBBdHRyIGNyZWF0ZUF0dHJpYnV0ZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0Tm9kZShDTURhdGFUeXBlIGRhdGFUeXBlLCBTdHJpbmcgdmFsdWUsIE5vZGUgcGFyZW50KSB7Ci0JCXJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHVzaFBhcmVudChFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHsKLQkgIGRvbUxldmVsKys7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUG9wUGFyZW50KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHsKLSAgICAgIGRvbUxldmVsLS07Ci0JfQotCi0JLy8gVGhlIHJhbmdlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5OS4KLQlwdWJsaWMgdm9pZCBzZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cyhpbnQgaSkgewotCQludW1PZlJlcGVhdGFibGVFbGVtZW50cyA9IGk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cygpIHsKLQkJcmV0dXJuIG51bU9mUmVwZWF0YWJsZUVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHsKLQkJaW50IGZvcmNlZE1pbiA9IChidWlsZE9wdGlvbmFsRWxlbWVudHMoYnVpbGRQb2xpY3kpIHx8IGFsd2F5c1Zpc2l0KSA/IDEgOiAwOwotCQlpbnQgbWluID0gTWF0aC5tYXgoZWQuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsKLQotCQkvLyBDb3JyZWN0IHRoZSBtaW4gdmFsdWUgaWYgdGhlIGVsZW1lbnQgaXMgY29udGFpbmVkIGluCi0JCS8vIGEgZ3JvdXAuCi0JCWlmICghY21Hcm91cFN0YWNrLmlzRW1wdHkoKSkgewotCQkJQ01Hcm91cCBncm91cCA9IChDTUdyb3VwKSBjbUdyb3VwU3RhY2sucGVlaygpOwotCQkJaW50IGdtaW4gPSBncm91cC5nZXRNaW5PY2N1cigpOwotCQkJaWYgKGdtaW4gPT0gMCkKLQkJCQlpZiAoYnVpbGRPcHRpb25hbEVsZW1lbnRzKGJ1aWxkUG9saWN5KSkgeyAKLQkJCQkJLyogZG8gbm90aGluZzogbWluID0gbWluICovCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltaW4gPSBtaW4gKiBnbWluOyAvLyBtaW4gPSAwCi0JCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWluID0gbWluICogZ21pbjsKLQkJCX0KLQkJfQotCi0JCWludCBtYXggPSBNYXRoLm1pbihlZC5nZXRNYXhPY2N1cigpLCBnZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cygpKTsKLQkJaWYgKG1heCA8IG1pbikKLQkJCW1heCA9IG1pbjsKLQotCQlhbHdheXNWaXNpdCA9IGZhbHNlOwotCi0JCS8vIE5vdGUgLSBlZCBtYXkgbm90IGJlIGFic3RyYWN0IGJ1dCBoYXMgc3Vic3RpdHV0aW9uR3JvdXBzCi0JCS8vIGludm9sdmVkLgotCQlpZiAoYnVpbGRGaXJzdFN1YnN0aXR1dGlvbihidWlsZFBvbGljeSkgfHwgaXNBYnN0cmFjdChlZCkpIC8vIGxlYXZlCi0JCQkJCQkJCQkJCQkJCQkJCS8vIHRoaXMKLQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGJhY2t3YXJkCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGNvbXBhdGliaWxpdHkKLQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yIG5vdwotCQl7Ci0JCQkvLyBOb3RlIC0gVG8gY2hhbmdlIHNvIHRoYXQgaWYgZWQgaXMgb3B0aW9uYWwsIHdlIGRvIG5vdAotCQkJLy8gZ2VuZXJhdGUgYW55dGhpbmcgaGVyZS4KLQkJCWVkID0gZ2V0U3Vic3RpdHV0aW9uKGVkKTsKLQotCQkJLy8gTm90ZSAtIHRoZSByZXR1cm5lZCBlZCBtYXkgYmUgYW4gYWJzdHJhY3QgZWxlbWVudCBpbgotCQkJLy8gd2hpY2ggY2FzZSB0aGUgeG1sIHdpbGwgYmUgaW52YWxpZC4KLQkJfQotCi0JCWlmIChtaW4gPiAwICYmICF2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LmNvbnRhaW5zKGVkKSkgewotCQkJdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5hZGQoZWQpOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbWF4OyBpKyspIHsKLQkJCQkvLyBjcmVhdGUgYW4gRWxlbWVudCBmb3IgZWFjaAotCQkJCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKHJvb3RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudCA9IHJvb3RFbGVtZW50OwotCQkJCQlyb290RWxlbWVudCA9IG51bGw7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllbGVtZW50ID0gY3JlYXRlRWxlbWVudChlZCwgY29tcHV0ZU5hbWUoZWQsIGN1cnJlbnRQYXJlbnQpLCBjdXJyZW50UGFyZW50KTsKLQkJCQl9Ci0KLQkJCQkvLyB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIEdyYW1tYXJFbGVtZW50Ci0JCQkJTm9kZSBvbGRQYXJlbnQgPSBjdXJyZW50UGFyZW50OwotCQkJCWN1cnJlbnRQYXJlbnQgPSBlbGVtZW50OwotCQkJCWhhbmRsZVB1c2hQYXJlbnQoZWxlbWVudCwgZWQpOwotCi0JCQkJbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChlbGVtZW50KTsKLQotCQkJCWJvb2xlYW4gb2xkQXR0YWNoTm9kZXNUb1BhcmVudCA9IGF0dGFjaE5vZGVzVG9QYXJlbnQ7Ci0JCQkJYXR0YWNoTm9kZXNUb1BhcmVudCA9IHRydWU7Ci0KLQkJCQkvLyBpbnN0ZWFkIG9mIGNhbGxpbmcgc3VwZXIudmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbigpCi0JCQkJLy8gd2UgZHVwbGljYXRlIHRoZSBjb2RlIHdpdGggc29tZSBtaW5vciBtb2RpZmljYXRpb25zCi0JCQkJQ01OYW1lZE5vZGVNYXAgbm9kZU1hcCA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlpbnQgc2l6ZSA9IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLQkJCQkJdmlzaXRDTU5vZGUobm9kZU1hcC5pdGVtKGopKTsKLQkJCQl9Ci0KLQkJCQlDTUNvbnRlbnQgY29udGVudCA9IGVkLmdldENvbnRlbnQoKTsKLQkJCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCXZpc2l0Q01Ob2RlKGNvbnRlbnQpOwotCQkJCX0KLQotCQkJCWlmIChlZC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSkgewotCQkJCQlDTURhdGFUeXBlIGRhdGFUeXBlID0gZWQuZ2V0RGF0YVR5cGUoKTsKLQkJCQkJaWYgKGRhdGFUeXBlICE9IG51bGwpIHsKLQkJCQkJCXZpc2l0Q01EYXRhVHlwZShkYXRhVHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZW5kIGR1cGxpY2F0aW9uCi0JCQkJYXR0YWNoTm9kZXNUb1BhcmVudCA9IG9sZEF0dGFjaE5vZGVzVG9QYXJlbnQ7Ci0JCQkJaGFuZGxlUG9wUGFyZW50KGVsZW1lbnQsIGVkKTsKLQkJCQljdXJyZW50UGFyZW50ID0gb2xkUGFyZW50OwotCQkJCWxpbmtOb2RlKGVsZW1lbnQpOwotCQkJfQotCQkJaW50IHNpemUgPSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnNpemUoKTsKLQkJCXZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QucmVtb3ZlKHNpemUgLSAxKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdmlzaXRDTURhdGFUeXBlKENNRGF0YVR5cGUgZGF0YVR5cGUpIHsKLQkJVGV4dCB0ZXh0ID0gbnVsbDsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQotCQkvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKLQkJLy8gUHJldmlvdXMgY29kZSB1c2VzIGEgcHJvcGVydHkgdmFsdWUgYnV0IG5ldyBvbmUgdXNlcwotCQkvLyBidWlsZFBvbGljeS4KLQkJaWYgKGdldFByb3BlcnR5KFBST1BFUlRZX0JVSUxEX0JMQU5LX1RFWFRfTk9ERVMpICE9IG51bGwgJiYgZ2V0UHJvcGVydHkoUFJPUEVSVFlfQlVJTERfQkxBTktfVEVYVF9OT0RFUykuZXF1YWxzKCJ0cnVlIikpIC8vJE5PTi1OTFMtMSQKLQkJCWJ1aWxkUG9saWN5ID0gYnVpbGRQb2xpY3kgXiBCVUlMRF9URVhUX05PREVTOwotCi0JCWlmIChidWlsZFRleHROb2RlcyhidWlsZFBvbGljeSkpIHsKLQkJCXZhbHVlID0gdmFsdWVIZWxwZXIuZ2V0VmFsdWUoZGF0YVR5cGUpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlpZiAoY3VycmVudFBhcmVudCAhPSBudWxsICYmIGN1cnJlbnRQYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQl2YWx1ZSA9IGN1cnJlbnRQYXJlbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZhbHVlID0gInBjZGF0YSI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGV4dCA9IGNyZWF0ZVRleHROb2RlKGRhdGFUeXBlLCB2YWx1ZSwgY3VycmVudFBhcmVudCk7Ci0JCWxpbmtOb2RlKHRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01Ob2RlKENNTm9kZSBub2RlKSB7Ci0JCWlmIChkZXB0aExpbWl0ICE9IC0xKSB7Ci0JCQlpZiAoZG9tTGV2ZWwgPiBkZXB0aExpbWl0KSB7Ci0JCQkJYnVpbGRQb2xpY3kgPSBidWlsZFBvbGljeSAmPSB+QlVJTERfT1BUSU9OQUxfRUxFTUVOVFM7Ci0JCQl9IGVsc2UgewotCQkJCWJ1aWxkUG9saWN5ID0gb3JpZ2luYWxCdWlsZFBvbGljeTsKLQkJCX0KLQkJfQotCQlzdXBlci52aXNpdENNTm9kZShub2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdENNR3JvdXAoQ01Hcm91cCBlKSB7Ci0JCWNtR3JvdXBTdGFjay5wdXNoKGUpOwotCi0JCWludCBmb3JjZWRNaW4gPSAoYnVpbGRPcHRpb25hbEVsZW1lbnRzKGJ1aWxkUG9saWN5KSB8fCBhbHdheXNWaXNpdCkgPyAxIDogMDsKLQkJaW50IG1pbiA9IE1hdGgubWF4KGUuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsKLQotCQlpbnQgbWF4ID0gMDsKLQkJaWYgKGUuZ2V0TWF4T2NjdXIoKSA9PSAtMSkgLy8gdW5ib3VuZGVkCi0JCQltYXggPSBnZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cygpOwotCQllbHNlCi0JCQltYXggPSBNYXRoLm1pbihlLmdldE1heE9jY3VyKCksIGdldE51bU9mUmVwZWF0YWJsZUVsZW1lbnRzKCkpOwotCi0JCWlmIChtYXggPCBtaW4pCi0JCQltYXggPSBtaW47Ci0KLQkJYWx3YXlzVmlzaXQgPSBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMTsgaSA8PSBtYXg7IGkrKykgewotCQkJaWYgKGUuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLkNIT0lDRSAmJiBidWlsZEZpcnN0Q2hvaWNlKGJ1aWxkUG9saWN5KSkgewotCQkJCUNNTm9kZSBoaW50Tm9kZSA9IG51bGw7Ci0KLQkJCQkvLyB0b2RvLi4uIHRoZSBDTUdyb3VwIHNob3VsZCBzcGVjaWZ5IHRoZSBoaW50Li4uIGJ1dCBpdCBzZWVtcwotCQkJCS8vIGFzIHRob3VnaAotCQkJCS8vIHRoZSBZYW1hdG8gZ3V5cyBhcmUgbWFraW5nIHRoZSBDTUVsZW1lbnQgc3BlY2lmeSB0aGUgaGludC4KLQkJCQkvLyBJIGRvIGl0IHRoYXQgd2F5IGZvciBub3cgdW50aWwuLi4gd2Ugc2hvdWxkIGZpeCB0aGlzIHBvc3QKLQkJCQkvLyBHQQotCQkJCS8vICAgIAotCQkJCWludCBsaXN0U2l6ZSA9IHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3Quc2l6ZSgpOwotCQkJCWlmIChsaXN0U2l6ZSA+IDApIHsKLQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QuZ2V0KGxpc3RTaXplIC0gMSk7Ci0JCQkJCU9iamVjdCBjb250ZW50SGludCA9IGVkLmdldFByb3BlcnR5KCJjb250ZW50SGludCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChjb250ZW50SGludCBpbnN0YW5jZW9mIENNTm9kZSkgewotCQkJCQkJaGludE5vZGUgPSAoQ01Ob2RlKSBjb250ZW50SGludDsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNlZSBpZiB0aGlzIGhpbnQgY29ycmVzcG9uZHMgdG8gYSB2YWxpZCBjaG9pY2UKLQkJCQkvLwotCQkJCUNNTm9kZSBjbU5vZGUgPSBudWxsOwotCi0JCQkJaWYgKGhpbnROb2RlICE9IG51bGwpIHsKLQkJCQkJQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQlpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBub2RlTGlzdExlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAoaGludE5vZGUgPT0gbm9kZUxpc3QuaXRlbShqKSkgewotCQkJCQkJCWNtTm9kZSA9IGhpbnROb2RlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gaWYgbm8gY21Ob2RlIGhhcyBiZWVuIGRldGVybWluZWQgZnJvbSB0aGUgaGludCwganVzdCB1c2UKLQkJCQkvLyB0aGUgZmlyc3QgY2hvaWNlCi0JCQkJLy8KLQkJCQlpZiAoY21Ob2RlID09IG51bGwpIHsKLQkJCQkJQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQlpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQljbU5vZGUgPSBub2RlTGlzdC5pdGVtKDApOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGNtTm9kZSAhPSBudWxsKSB7Ci0JCQkJCS8vIEJ1ZyAzMzAyNjAKLQkJCQkJLy8gUHJvYmxlbSAtIEFkZCBjaGlsZCBlbGVtZW50IGFsc28gYWRkcyBvcHRpb25hbCBncmFuZC1jaGlsZCBlbGVtZW50cwotCQkJCQkvLyBUaGlzIGFzc3VtZXMgJ2UnIGlzIGEgbW9kZWwgZ3JvdXAgY2hvaWNlLCBjYXNlIDEuIEhvd2V2ZXIgJ2UnIGNvdWxkIGJlIGEgbW9kZWwgZ3JvdXAgZGVmaW5pdGlvbiwgY2FzZSAyLCB3aGVyZSB0aGUKLQkJCQkJLy8gZmlyc3QgY2hpbGQgaXMgYSBtb2RlbCBncm91cC4gSW4gdGhlIGZpcnN0IGNhc2UgKGNob2ljZSksIHRoZSBmaXJzdCBjaGlsZCBpcyBhbgotCQkJCQkvLyBlbGVtZW50LiBVcG9uIHZpc2l0aW5nIHRoZSBlbGVtZW50ICh2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKSwgdGhlIG1pbk9jY3VycyBvZiB0aGUKLQkJCQkJLy8gY2hvaWNlIGlzIEFMU08gY29uc2lkZXJlZC4gSWYgaXRzIG1pbk9jY3VycyBpcyAwLCB0aGVuIHRoZSBmaXJzdCBlbGVtZW50IGlzIG5vdCBhZGRlZCBhcyBhIGNoaWxkLgotCQkJCQkvLyBIb3dldmVyLCBpbiB0aGUgc2Vjb25kIGNhc2UgKG1vZGVsIGdyb3VwIGRlZmluaXRpb24pLCB0aGUgZmlyc3QgY2hpbGQgaXMgYSBjaG9pY2UsIGJ1dCB0aGUgbXVsdGlwbGljaXR5IGlzIFsxLDFdLAotCQkJCQkvLyBtZWFuaW5nLCBpdCBpcyByZXF1aXJlZC4gU28gdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlbiBhZGRlZCBhcyBjaGlsZCwgZXZlbiB0aG91Z2gKLQkJCQkJLy8gdGhlIG1vZGVsIGdyb3VwIGRlZmluaXRpb24gcmVmZXJlbmNlIGlzIG9wdGlvbmFsLiAobWluT2NjdXJzIGlzIG5vdCBjaGVja2VkIGluIHRoaXMgbWV0aG9kLCB2aXNpdENNR3JvdXApCi0JCQkJCS8vIFZpc2l0IHRoZSBub2RlIG9ubHkgaWYgaXQgaXMgbm90IGEgR1JPVVAgKG1vZGVsIGdyb3VwKS4gSWYgaXQgaXMgYW4gZWxlbWVudCwgdGhlbiB2aXNpdCBpdC4KLQkJCQkJaWYgKCEoY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkdST1VQICYmIG1pbiA+IDApKSB7Ci0JCQkJCQl2aXNpdENNTm9kZShjbU5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZS5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuQUxMIC8vIEFMTAotCQkJCQkJfHwgZS5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuU0VRVUVOQ0UpIC8vIFNFUVVFTkNFCi0JCQl7Ci0JCQkJLy8gdmlzaXQgYWxsIG9mIHRoZSBjb250ZW50Ci0JCQkJc3VwZXIudmlzaXRDTUdyb3VwKGUpOwotCQkJfQotCQl9Ci0KLQkJY21Hcm91cFN0YWNrLnBvcCgpOwotCX0KLQotCXN0YXRpYyBpbnQgY291bnQgPSAwOwotCi0JcHVibGljIHZvaWQgdmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpIHsKLQkJaWYgKGFsd2F5c1Zpc2l0IHx8IGJ1aWxkT3B0aW9uYWxBdHRyaWJ1dGVzKGJ1aWxkUG9saWN5KSB8fCBhZC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCWFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0JCQlTdHJpbmcgbmFtZSA9IGNvbXB1dGVOYW1lKGFkLCBjdXJyZW50UGFyZW50KTsKLQkJCVN0cmluZyB2YWx1ZSA9IHZhbHVlSGVscGVyLmdldFZhbHVlKGFkLCBuYW1lc3BhY2VUYWJsZSk7Ci0JCQlBdHRyIGF0dHIgPSBjcmVhdGVBdHRyaWJ1dGUoYWQsIG5hbWUsIGN1cnJlbnRQYXJlbnQpOwotCQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxpbmtOb2RlKGF0dHIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBYnN0cmFjdChDTU5vZGUgZWQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCU9iamVjdCB2YWx1ZSA9IGVkLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSAodmFsdWUgPT0gQm9vbGVhbi5UUlVFKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRTdWJzdGl0dXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gZWQ7Ci0JCUNNTm9kZUxpc3QgbCA9IChDTU5vZGVMaXN0KSBlZC5nZXRQcm9wZXJ0eSgiU3Vic3RpdHV0aW9uR3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUNNTm9kZSBjYW5kaWRhdGUgPSBsLml0ZW0oaSk7Ci0JCQkJaWYgKCFpc0Fic3RyYWN0KGNhbmRpZGF0ZSkgJiYgKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIENNRWxlbWVudERlY2xhcmF0aW9uKSkgewotCQkJCQlyZXN1bHQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNhbmRpZGF0ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldFBhcmVudENNRWxlbWVudERlY2xhcmF0aW9uKCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG51bGw7Ci0JCWludCBsaXN0U2l6ZSA9IHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3Quc2l6ZSgpOwotCQlpZiAobGlzdFNpemUgPiAwKSB7Ci0JCQllZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5nZXQobGlzdFNpemUgLSAxKTsKLQkJfQotCQlyZXR1cm4gZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRDTUFueUVsZW1lbnQoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpIHsKLQkJLy8gaW5nbm9yZSBidWlsZFBvbGljeSBmb3IgQU5ZIGVsZW1lbnRzLi4uIG9ubHkgY3JlYXRlIGVsZW1lbnRzIGlmCi0JCS8vIGFic29sdXRlbHkgbmVlZGVkCi0JCS8vCi0JCWludCBmb3JjZWRNaW4gPSBhbHdheXNWaXNpdCA/IDEgOiAwOwotCQlpbnQgbWluID0gTWF0aC5tYXgoYW55RWxlbWVudC5nZXRNaW5PY2N1cigpLCBmb3JjZWRNaW4pOwotCQlhbHdheXNWaXNpdCA9IGZhbHNlOwotCi0JCVN0cmluZyB1cmkgPSBhbnlFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotCQlTdHJpbmcgdGFyZ2V0TlNQcm9wZXJ0eSA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIjsgLy8kTk9OLU5MUy0xJAotCQlDTURvY3VtZW50IHBhcmVudENNRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCkgYW55RWxlbWVudC5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbnVsbDsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInBhcmVudENNRG9jdW1lbnQgPSAiICsgcGFyZW50Q01Eb2N1bWVudCk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBhcmVudENNRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKHVyaSA9PSBudWxsIHx8IHVyaS5zdGFydHNXaXRoKCIjIyIpIHx8IHVyaS5lcXVhbHMocGFyZW50Q01Eb2N1bWVudC5nZXRQcm9wZXJ0eSh0YXJnZXROU1Byb3BlcnR5KSkpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQllZCA9IGdldFN1aXRhYmxlRWxlbWVudChnZXRQYXJlbnRDTUVsZW1lbnREZWNsYXJhdGlvbigpLCBwYXJlbnRDTURvY3VtZW50KTsKLQkJCX0KLQkJfQotCi0KLQkJaWYgKGVkID09IG51bGwgJiYgZXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCAhPSBudWxsICYmIHVyaSAhPSBudWxsICYmICF1cmkuc3RhcnRzV2l0aCgiIyMiKSAmJiBjdXJyZW50UGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlDTURvY3VtZW50IGV4dGVybmFsQ01Eb2N1bWVudCA9IGV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQuZ2V0Q01Eb2N1bWVudCgoRWxlbWVudCkgY3VycmVudFBhcmVudCwgdXJpKTsKLQkJCWlmIChleHRlcm5hbENNRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWVkID0gZ2V0U3VpdGFibGVFbGVtZW50KG51bGwsIGV4dGVybmFsQ01Eb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMTsgaSA8PSBtaW47IGkrKykgewotCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQl2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKGVkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkFOWS1FTEVNRU5UIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlsaW5rTm9kZShlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRTdWl0YWJsZUVsZW1lbnQoQ01OYW1lZE5vZGVNYXAgbmFtZU5vZGVNYXApIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLQkJaW50IHNpemUgPSBuYW1lTm9kZU1hcC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNhbmRpZGF0ZSA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgbmFtZU5vZGVNYXAuaXRlbShpKTsKLQkJCWlmICghdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5jb250YWlucyhjYW5kaWRhdGUpKSB7Ci0JCQkJcmVzdWx0ID0gY2FuZGlkYXRlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldFN1aXRhYmxlRWxlbWVudChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGdldFN1aXRhYmxlRWxlbWVudChlZC5nZXRMb2NhbEVsZW1lbnRzKCkpOwotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIGNtRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZ2V0U3VpdGFibGVFbGVtZW50KGNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIHZvaWQgbGlua05vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChhdHRhY2hOb2Rlc1RvUGFyZW50ICYmIGN1cnJlbnRQYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJKChFbGVtZW50KSBjdXJyZW50UGFyZW50KS5zZXRBdHRyaWJ1dGVOb2RlKChBdHRyKSBub2RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWN1cnJlbnRQYXJlbnQuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocmVzdWx0TGlzdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHRMaXN0LmFkZChub2RlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0UG9wdWxhdGVEb2N1bWVudEZyb21HcmFtbWFyRmlsZShEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgU3RyaW5nIHJvb3RFbGVtZW50TmFtZSwgYm9vbGVhbiBoYWNrKSB7Ci0JCXRyeSB7Ci0JCQlDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBDb250ZW50TW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlQ01Eb2N1bWVudChncmFtbWFyRmlsZU5hbWUsIG51bGwpOwotCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudE1hcCA9IGNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRNYXAuZ2V0TmFtZWRJdGVtKHJvb3RFbGVtZW50TmFtZSk7Ci0KLQkJCURPTUNvbnRlbnRCdWlsZGVySW1wbCBjb250ZW50QnVpbGRlciA9IG5ldyBET01Db250ZW50QnVpbGRlckltcGwoZG9jdW1lbnQpOwotCQkJY29udGVudEJ1aWxkZXIuc3VwcmVzc0NyZWF0aW9uT2ZEb2N0eXBlQW5kWE1MRGVjbGFyYXRpb24gPSBoYWNrOwotCQkJY29udGVudEJ1aWxkZXIuY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KGNtRG9jdW1lbnQsIGVsZW1lbnQpOwotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJRE9NV3JpdGVyIHdyaXRlciA9IG5ldyBET01Xcml0ZXIoKTsKLQkJCWlmIChoYWNrKSB7Ci0JCQkJd3JpdGVyLnByaW50KGRvY3VtZW50LCBncmFtbWFyRmlsZU5hbWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJd3JpdGVyLnByaW50KGRvY3VtZW50KTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsRWxlbWVudERlcHRoTGltaXQoaW50IGRlcHRoKSB7Ci0JCWRlcHRoTGltaXQgPSBkZXB0aDsKLQl9Ci0JCi0KLQkvLyB0ZXN0Ci0JLy8KLQkvKgotCSAqIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdbXSkgeyBpZiAoYXJnLmxlbmd0aCA+PSAyKSB7IHRyeSB7Ci0JICogQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyQ01Eb2N1bWVudEJ1aWxkZXJXaXRoQ2xhc3NOYW1lKCJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZmltcGwuQ01Eb2N1bWVudEJ1aWxkZXJJbXBsIik7Ci0JICogCi0JICogU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSA9IGFyZ1swXTsgU3RyaW5nIHJvb3RFbGVtZW50TmFtZSA9IGFyZ1sxXTsKLQkgKiAKLQkgKiBEb2N1bWVudCBkb2N1bWVudCA9Ci0JICogKERvY3VtZW50KUNsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGwiKS5uZXdJbnN0YW5jZSgpOwotCSAqIHRlc3RQb3B1bGF0ZURvY3VtZW50RnJvbUdyYW1tYXJGaWxlKGRvY3VtZW50LCBncmFtbWFyRmlsZU5hbWUsCi0JICogcm9vdEVsZW1lbnROYW1lLCB0cnVlKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkgKiBTeXN0ZW0ub3V0LnByaW50bG4oIkRPTUNvbnRlbnRCdWlsZGVySW1wbCBlcnJvciIpOyBlLnByaW50U3RhY2tUcmFjZSgpOyB9IH0KLQkgKiBlbHNlIHsgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEKLQkgKiBvcmcuZWNsaXBzZS53c3QueG1sLnV0aWwuRE9NQ29udGVudEJ1aWxkaW5nQ01WaXNpdG9yIGdyYW1tYXJGaWxlTmFtZQotCSAqIHJvb3RFbGVtZW50TmFtZSIpOyB9IH0KLQkgKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTU5hbWVzcGFjZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NTmFtZXNwYWNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OWQ0NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NTmFtZXNwYWNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgRE9NTmFtZXNwYWNlSGVscGVyCi17ICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVUklGb3JQcmVmaXgoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJlZml4KQotICB7ICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkgIFN0cmluZyBuc0F0dHJOYW1lID0gbnVsbDsKLQkgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSAKLSAgICB7Ci0JCSAgbnNBdHRyTmFtZSA9ICJ4bWxuczoiICsgcHJlZml4OyAvLyROT04tTkxTLTEkCi0JICB9Ci0JICBlbHNlIAotICAgIHsKLQkJICBuc0F0dHJOYW1lID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotCSAgfQotICAgICAgICAgICAgCi0gICAgLy8gYXNzdW1lIHRoZSBub2RlIGlzIHF1YWxpZmllZC4uLiBsb29rIHVwIHRoZSBVUkkgYmFzZSBvbiB0aGUgcHJlZml4Ci0gICAgLy8KLQkgIGZvciAoTm9kZSBub2RlID0gZWxlbWVudDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIAotICAgIHsKLQkgICAJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCB0aGVFbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsKLQkJICAgIEF0dHIgYXR0ciA9IHRoZUVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuc0F0dHJOYW1lKTsKLQkJICAgIGlmIChhdHRyICE9IG51bGwpIAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gYXR0ci5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAgICAgIAotICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBzb21lIGluZm8gZnJvbSBhbiAnaW1wbGljaXQnIG5hbWVzcGFjZQotICAgIC8vCi0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgTmFtZXNwYWNlVGFibGUgdGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgcmVzdWx0ID0gdGFibGUuZ2V0VVJJRm9yUHJlZml4KHByZWZpeCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShOb2RlIG5vZGUpCi0gIHsgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsgICAgICAgICAgICAgICAKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KW5vZGU7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICAgIHJlc3VsdCA9IGdldFVSSUZvclByZWZpeChlbGVtZW50LCBwcmVmaXgpOwotICAgIH0KLSAgICBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICB7ICAgICAgCi0gICAgICBBdHRyIGF0dHIgPSAoQXR0cilub2RlOwotICAgICAgU3RyaW5nIHByZWZpeCA9IGF0dHIuZ2V0UHJlZml4KCk7Ci0gICAgICByZXN1bHQgPSBnZXRVUklGb3JQcmVmaXgoYXR0ci5nZXRPd25lckVsZW1lbnQoKSwgcHJlZml4KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgICAgICAgICAgCi0KLSAgLy8gdG9kby4uLiB0aGlzIGlzIGFuIHVnbHkgaGFjay4uLiBuZWVkcyB0byBiZSBmaXhlZAotICAvLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlUHJlZml4KENNTm9kZSBjbU5vZGUsIE5vZGUgcGFyZW50Tm9kZSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGZvciAoTm9kZSBub2RlID0gcGFyZW50Tm9kZTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpCi0gICAgewotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0UHJlZml4KG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgIAotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbnByZWZpeGVkTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgIH0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU5hbWUoQ01Ob2RlIGNtTm9kZSwgTm9kZSBwYXJlbnQsIFN0cmluZyBwcmVmaXgpCi0gIHsgICAgIAotICAgIHJldHVybiBjb21wdXRlTmFtZShjbU5vZGUsIHBhcmVudCwgcHJlZml4LCBudWxsKTsKLSAgfSAgIAotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU5hbWUoQ01Ob2RlIGNtTm9kZSwgTm9kZSBwYXJlbnQsIFN0cmluZyBwcmVmaXgsIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotCi0gICAgLy8gaWYgdGhlIGNtTm9kZSBoYXMgYSBoYXJkIGNvZGVkIHByZWZpeCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKLSAgICAvLwotICAgIGlmIChnZXRQcmVmaXgocmVzdWx0KSA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHF1YWxpZmljYXRpb24gPSAoU3RyaW5nKWNtTm9kZS5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25zUHJlZml4UXVhbGlmaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAvLyBzZWUgaWYgd2UgbmVlZCBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgIC8vCi0gICAgICBpZiAocXVhbGlmaWNhdGlvbiAhPSBudWxsICYmIHF1YWxpZmljYXRpb24uZXF1YWxzKCJxdWFsaWZpZWQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgeyAgICAgICAgICAgIAotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpICAgICAgICAgICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgIC8vIHRvZG8uLi4gYWRkIGdldENNRG9jdW1lbnQoKSBtZXRob2QgdG8gQ01Ob2RlCi0gICAgICAgICAgLy8gZm9yIG5vdyB1c2UgdGhpcyBnZXRQcm9wZXJ0eSgpIGhhY2sKLSAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCljbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpICAgICAgICAgIAotICAgICAgICAgIHsgICAgIAotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpCi0gICAgICAgICAgICB7ICAgCi0gICAgICAgICAgICAgIC8vIHVzZSB0aGUgTmFtZXNwYWNlVGFibGUgdG8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBwcmVmaXggZm9yIHRoaXMgbmFtZXNwYWNlIHVyaQotICAgICAgICAgICAgICAvLyAgICAgIAotICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVGFibGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgPyAoRG9jdW1lbnQpcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShkb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudExpbmVhZ2UoKEVsZW1lbnQpcGFyZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZXNwYWNlVGFibGUuZ2V0UHJlZml4Rm9yVVJJKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gcHJlZml4ICsgIjoiICsgcmVzdWx0OyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0gICAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotICAKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFVSSVF1YWxpZmllZE5hbWVDb21wb25lbnRzKFN0cmluZyB1cmlRdWFsaWZpZWROYW1lKQotICB7Ci0gICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1syXTsKLSAgICBpbnQgZmlyc3RJbmRleCA9IHVyaVF1YWxpZmllZE5hbWUuaW5kZXhPZigiWyIpOyAvLyROT04tTkxTLTEkCi0gICAgaW50IGxhc3RJbmRleCA9IHVyaVF1YWxpZmllZE5hbWUuaW5kZXhPZigiXSIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGZpcnN0SW5kZXggIT0gLTEgJiYgbGFzdEluZGV4ID4gZmlyc3RJbmRleCkKLSAgICB7Ci0gICAgICByZXN1bHRbMF0gPSB1cmlRdWFsaWZpZWROYW1lLnN1YnN0cmluZyhmaXJzdEluZGV4ICsgMSwgbGFzdEluZGV4KTsKLSAgICAgIHJlc3VsdFsxXSA9IHVyaVF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGxhc3RJbmRleCArIDEpOwotICAgIH0gIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHRbMV0gPSB1cmlRdWFsaWZpZWROYW1lOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VJbmZvTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3ZWZiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VJbmZvTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyICAgICAgICAgIAotICoKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNJX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIoKQotICB7Ci0gIH0gICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUluZm9MaXN0KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIE5hbWVzcGFjZUluZm9SZWFkZXIgcmVhZGVyID0gbmV3IE5hbWVzcGFjZUluZm9SZWFkZXIoKTsKLSAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZUluZm9MaXN0KGVsZW1lbnQpOwotICB9ICAgICAgICAgICAgCi0gICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlTmFtZXNwYWNlSW5mbyhFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgIAotICAgIE5hbWVzcGFjZUluZm9SZW1vdmVyIHJlbW92ZXIgPSBuZXcgTmFtZXNwYWNlSW5mb1JlbW92ZXIoKTsKLSAgICByZW1vdmVyLnJlbW92ZU5hbWVzcGFjZUluZm8oZWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VJbmZvKEVsZW1lbnQgZWxlbWVudCwgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCwgYm9vbGVhbiBuZWVkc1hTSSkKLSAgeyAgCi0gICAgLy8gZmlyc3Qgd2UgY3JlYXRlIGFuIHhtbG5zIGF0dHJpYnV0ZSBmb3IgZWFjaCBuYW1lc3BhY2UKLSAgICAvLyAgICAgICAgICAgICAgICAgICAKLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb25WYWx1ZSA9ICIiOyAgICAgIC8vJE5PTi1OTFMtMSQKLQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IChOYW1lc3BhY2VJbmZvKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIG5zSW5mby5ub3JtYWxpemUoKTsKLSAgICAgICAgICAgICAgIAotICAgICAgaWYgKG5zSW5mby51cmkgIT0gbnVsbCkgCi0gICAgICB7ICAgICAgICAgICAgCi0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IG5zSW5mby5wcmVmaXggIT0gbnVsbCA/ICJ4bWxuczoiICsgbnNJbmZvLnByZWZpeCA6ICJ4bWxucyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBdHRyIG5hbWVzcGFjZUF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoYXR0ck5hbWUpOyAgCi0gICAgICAgIG5hbWVzcGFjZUF0dHIuc2V0VmFsdWUobnNJbmZvLnVyaSk7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShuYW1lc3BhY2VBdHRyKTsgICAKLQotICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2UgdXNlIHRoZSBhdHRyaWJ1dGUgInhzaTpzY2hlbWFMb2NhdGlvbiIKLSAgICAgICAgLy8gaGVyZSB3ZSBidWlsZCB1cCBpdHMgdmFsdWUKLSAgICAgICAgLy8KLSAgICAgICAgaWYgKG5zSW5mby5sb2NhdGlvbkhpbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNjaGVtYUxvY2F0aW9uVmFsdWUgKz0gbnNJbmZvLnVyaTsKLSAgICAgICAgICBzY2hlbWFMb2NhdGlvblZhbHVlICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHNjaGVtYUxvY2F0aW9uVmFsdWUgKz0gbnNJbmZvLmxvY2F0aW9uSGludDsKLSAgICAgICAgICBzY2hlbWFMb2NhdGlvblZhbHVlICs9ICIgIjsgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICB9ICAgCi0KLSAgICAgICAgaWYgKG5zSW5mby51cmkuZXF1YWxzKFhTSV9VUkkpKQotICAgICAgICB7Ci0gICAgICAgICAgbmVlZHNYU0kgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfSAgICAgCi0gICAgICBlbHNlIGlmIChuc0luZm8ubG9jYXRpb25IaW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIGluIHRoaXMgY2FzZSB3ZSB1c2UgdGhlIGF0dHJpYnV0ZSAieHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iCi0gICAgICAgIC8vCi0gICAgICAgIEF0dHIgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZSgieHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iKTsgICAvLyROT04tTkxTLTEkCi0gICAgICAgIGF0dHIuc2V0VmFsdWUobnNJbmZvLmxvY2F0aW9uSGludCk7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLSAgICAgIH0gCi0gICAgfSAKLQotICAgIGlmIChuZWVkc1hTSSkKLSAgICB7Ci0gICAgICAvLyB3ZSBhZGQgYW4geG1sbnM6eHNpIGF0dHJpYnV0ZSB0byBkZWZpbmUgJ3hzaTpzY2hlbWFMb2NhdGlvbicgYXR0cmlidXRlCi0gICAgICAvLyAgIAotICAgICAgQXR0ciBhdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKCJ4bWxuczp4c2kiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgYXR0ci5zZXRWYWx1ZShYU0lfVVJJKTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLSAgICB9Ci0KLSAgICBpZiAoc2NoZW1hTG9jYXRpb25WYWx1ZS5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgLy8gY3JlYXRlIHRoZSAieHNpOnNjaGVtYUxvY2F0aW9uIiBhdHRyaWJ1dGUKLSAgICAgIC8vCi0gICAgICBBdHRyIGF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoInhzaTpzY2hlbWFMb2NhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBhdHRyLnNldFZhbHVlKHNjaGVtYUxvY2F0aW9uVmFsdWUpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9IAotICAgICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTmFtZXNwYWNlSW5mb1JlYWRlciBleHRlbmRzIE5hbWVzcGFjZUF0dHJpYnV0ZVZpc2l0b3IKLSAgeyAgCi0gICAgcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdChFbGVtZW50IGVsZW1lbnQpCi0gICAgewotICAgICAgdmlzaXRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgcmV0dXJuIG5hbWVzcGFjZUluZm9MaXN0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTSU5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb25BdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gY3JlYXRlTmFtZXNwYWNlSW5mbygpOwotICAgICAgaW5mby5sb2NhdGlvbkhpbnQgPSB2YWx1ZTsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKQotICAgIHsgICAgICAgICAgIAotICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gY3JlYXRlTmFtZXNwYWNlSW5mbygpOwotICAgICAgaW5mby51cmkgPSB1cmk7Ci0gICAgICBpbmZvLnByZWZpeCA9IHByZWZpeDsgICAgICAKLSAgICAgIHN1cGVyLnZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKGF0dHIsIHByZWZpeCwgdXJpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uVmFsdWVQYWlyKFN0cmluZyB1cmksIFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gICAgeyAgICAKLSAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IGdldE5hbWVzcGFjZUluZm9Gb3JVUkkodXJpKTsgICAgICAgICAgICAKLSAgICAgIGlmIChpbmZvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGluZm8ubG9jYXRpb25IaW50ID0gbG9jYXRpb25IaW50OwotICAgICAgfSAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaW5mbyA9IGNyZWF0ZU5hbWVzcGFjZUluZm8oKTsKLSAgICAgICAgaW5mby51cmkgPSB1cmk7Ci0gICAgICAgIGluZm8ubG9jYXRpb25IaW50ID0gbG9jYXRpb25IaW50OwotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHJvdGVjdGVkIE5hbWVzcGFjZUluZm8gZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSShTdHJpbmcgdXJpKQotICAgIHsgICAgCi0gICAgICBOYW1lc3BhY2VJbmZvIHJlc3VsdCA9IG51bGw7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLSAgICAgICAgaWYgKGluZm8udXJpICE9IG51bGwgJiYgaW5mby51cmkuZXF1YWxzKHVyaSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBpbmZvOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgIAotCi0gICAgcHJvdGVjdGVkIE5hbWVzcGFjZUluZm8gY3JlYXRlTmFtZXNwYWNlSW5mbygpCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICAgIG5hbWVzcGFjZUluZm9MaXN0LmFkZChpbmZvKTsKLSAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLSAgfQotICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTmFtZXNwYWNlSW5mb1JlbW92ZXIgZXh0ZW5kcyBOYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yCi0gIHsgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgYXR0cmlidXRlc1RvUmVtb3ZlID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTmFtZXNwYWNlSW5mbyhFbGVtZW50IGVsZW1lbnQpCi0gICAgeyAgCi0gICAgICB2aXNpdEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICByZW1vdmVBdHRyaWJ1dGVzKCk7Ci0gICAgfSAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0lOb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgIGF0dHJpYnV0ZXNUb1JlbW92ZS5hZGQoYXR0cik7Ci0gICAgfSAgICAgICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgbmFtZXNwYWNlUHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJKQotICAgIHsgICAKLSAgICAgIGF0dHJpYnV0ZXNUb1JlbW92ZS5hZGQoYXR0cik7Ci0gICAgICBzdXBlci52aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShhdHRyLCBuYW1lc3BhY2VQcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNJU2NoZW1hTG9jYXRpb25BdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgYXR0cmlidXRlc1RvUmVtb3ZlLmFkZChhdHRyKTsKLSAgICB9ICAgCi0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGVzKCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhdHRyaWJ1dGVzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpaS5uZXh0KCk7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgCi0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01WaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01WaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDJmN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vLyB0b2RvLi4gbW92ZSB0aGlzIGNsYXNzIHRvIGFub3RoZXIgcGFja2FnZSAocGVyaGFwcyB4bWx1dGlsaXR5KQotLy8KLXB1YmxpYyBjbGFzcyBET01WaXNpdG9yCi17ICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Tm9kZShOb2RlIG5vZGUpCi0gIHsKLSAgICBzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICB7Ci0gICAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgotICAgICAgewotICAgICAgICB2aXNpdEF0dHIoKEF0dHIpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0Q0RBVEFTZWN0aW9uKChDREFUQVNlY3Rpb24pbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0Q29tbWVudCgoQ29tbWVudClub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0RG9jdW1lbnQoKERvY3VtZW50KW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotICAgICAgewotICAgICAgICB2aXNpdERvY3VtZW50VHlwZSgoRG9jdW1lbnRUeXBlKW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotICAgICAgewotICAgICAgICB2aXNpdEVsZW1lbnQoKEVsZW1lbnQpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0UHJvY2Vzc2luZ0luc3RydWN0aW9uKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0VGV4dCgoVGV4dClub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgCi0gIH0gICAgCi0gICAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RG9jdW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgCi0gICAgdmlzaXRDaGlsZE5vZGVzSGVscGVyKGRvY3VtZW50KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RG9jdW1lbnRUeXBlKERvY3VtZW50VHlwZSBkb2N0eXBlKQotICB7ICAgICAgICAgCi0KLSAgfSAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgeyAgICAgICAgCi0gICAgdmlzaXRBdHRyaWJ1dGVzSGVscGVyKGVsZW1lbnQpOwotICAgIHZpc2l0Q2hpbGROb2Rlc0hlbHBlcihlbGVtZW50KTsKLSAgfSAKLSAKLQotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHIoQXR0ciBhdHRyKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRUZXh0KFRleHQgdGV4dCkKLSAgeyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0Q0RBVEFTZWN0aW9uKENEQVRBU2VjdGlvbiBjZGF0YVNlY3Rpb24pCi0gIHsgICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdENvbW1lbnQoQ29tbWVudCBjb21tZW50KQotICB7ICAgICAgICAgICAgICAgICAgIAotICB9ICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKQotICB7ICAgIAotICB9Ci0gCi0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRDaGlsZE5vZGVzSGVscGVyKE5vZGUgbm9kZSkKLSAgewotICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIHZpc2l0Tm9kZShjaGlsZHJlbi5pdGVtKGkpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEF0dHJpYnV0ZXNIZWxwZXIoTm9kZSBub2RlKQotICB7Ci0gICAgTmFtZWROb2RlTWFwIG1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLmdldExlbmd0aCgpOyBpKysgKQotICAgIHsKLSAgICAgIHZpc2l0Tm9kZShtYXAuaXRlbShpKSk7Ci0gICAgfQotICB9ICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Xcml0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDEwZDUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5UZXh0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGEgaGFja2VkIHVwIGRvbSB3cml0ZXIgc3RvbGVuIGZyb20gYSBYZXJjZXMgc2FtcGxlLgotICogSSdkIGxpa2UgdG8gdXNlIGFuIGV4aXNpdG5nICdnZW5lcmljIERPTScgd3JpdGVyCi0gKiBJZiBhbnlvbmUgY2FuIGZpbmQgc3VjaCBhIHRoaW5nIHRoZW4gcGxlYXNlIGdvIGFoZWFkIGFuZCBqdW5rIHRoaXMuCi0gKgotICogQHZlcnNpb24KLSAqLwotcHVibGljIGNsYXNzIERPTVdyaXRlcgotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBmb3JtYXR0aW5nRW5hYmxlZCA9IHRydWU7Ci0gICBwcm90ZWN0ZWQgYm9vbGVhbiBvdXRwdXREb2N0eXBlRW5hYmxlZCA9IHRydWU7Ci0gICBwcm90ZWN0ZWQgUHJpbnRXcml0ZXIgb3V0OwotICAgcHJvdGVjdGVkIGludCBpbmRlbnQgPSAwOyAgCi0KLSAgIHB1YmxpYyBET01Xcml0ZXIoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgewotICAgICB0aGlzKFN5c3RlbS5vdXQpOwotICAgfQotCi0gICBwdWJsaWMgRE9NV3JpdGVyKE91dHB1dFN0cmVhbSBvdXRwdXRTdGVhbSkKLSAgIHsKLSAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKG91dHB1dFN0ZWFtKTsKLSAgIH0KLQotICAgcHVibGljIERPTVdyaXRlcihXcml0ZXIgd3JpdGVyKQotICAgewotICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKLSAgIH0KLQotICAgcHVibGljIHZvaWQgc2V0Rm9ybWF0dGluZ0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQotICAgewotICAgICBmb3JtYXR0aW5nRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICB9Ci0KLSAgIHB1YmxpYyBib29sZWFuIGdldEZvcm1hdHRpbmdFbmFibGVkKCkKLSAgIHsKLSAgICAgcmV0dXJuIGZvcm1hdHRpbmdFbmFibGVkOwotICAgfQotCi0gICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREb2N0eXBlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpCi0gICB7Ci0gICAgIG91dHB1dERvY3R5cGVFbmFibGVkID0gZW5hYmxlZDsKLSAgIH0KLQotICAgcHVibGljIGNsYXNzIFhNTFZpc2l0b3IKLSAgIHsKLSAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzID0gZmFsc2U7Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXROb2RlKE5vZGUgbm9kZSkKLSAgICAgewotICAgICAgIHN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKQotICAgICAgIHsKLSAgICAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0QXR0cigoQXR0cilub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRDREFUQVNlY3Rpb24oKENEQVRBU2VjdGlvbilub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRDb21tZW50KChDb21tZW50KW5vZGUpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXREb2N1bWVudCgoRG9jdW1lbnQpbm9kZSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0RG9jdW1lbnRUeXBlKChEb2N1bWVudFR5cGUpbm9kZSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0RWxlbWVudCgoRWxlbWVudClub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRUZXh0KChUZXh0KW5vZGUpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdERvY3VtZW50KERvY3VtZW50IGRvY3VtZW50KQotICAgICB7Ci0gICAgICAgdmlzaXRDaGlsZE5vZGVzSGVscGVyKGRvY3VtZW50KTsKLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0RG9jdW1lbnRUeXBlKERvY3VtZW50VHlwZSBkb2N0eXBlKQotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBpZiAob3V0cHV0RG9jdHlwZUVuYWJsZWQpCi0gICAgICAgewotICAgICAgICAgU3RyaW5nIGRhdGEgPSBnZXREb2N1bWVudFR5cGVEYXRhKGRvY3R5cGUpOwotICAgICAgICAgcHJpbnQoIjwhRE9DVFlQRSAiICsgZGF0YSArICI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgIH0KLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgaWYgKCFkb1Nob3coZWxlbWVudCkpCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgICBib29sZWFuIHBhcmVudEVsZW1lbnRIYXNDaGlsZE5vZGVzID0gY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzOwotICAgICAgIGN1cnJlbnRFbGVtZW50SGFzQ2hpbGRFbGVtZW50cyA9IGhhc0NoaWxkRWxlbWVudHMoZWxlbWVudCk7Ci0KLSAgICAgICBwcmludEluZGVudCgpOwotICAgICAgIHByaW50KCI8Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChlbGVtZW50LmdldE5vZGVOYW1lKCkpOwotICAgICAgIHZpc2l0QXR0cmlidXRlc0hlbHBlcihlbGVtZW50KTsKLQotICAgICAgIGJvb2xlYW4gaGFzQ2hpbGROb2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID4gMDsgICAgICAgICAgICAgICAgCi0gICAgICAgYm9vbGVhbiBpc1Jvb3RFbGVtZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREU7Ci0gICAgICAgaWYgKGhhc0NoaWxkTm9kZXMgfHwgaXNSb290RWxlbWVudCkKLSAgICAgICB7Ci0gICAgICAgICBpZiAoY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzKQotICAgICAgICAgewotICAgICAgICAgICBwcmludGxuKCI+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgcHJpbnQoIj4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgfQotICAgICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICAgICB2aXNpdENoaWxkTm9kZXNIZWxwZXIoZWxlbWVudCk7Ci0gICAgICAgICBpbmRlbnQgLT0gMjsKLQotICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50SGFzQ2hpbGRFbGVtZW50cyB8fCBpc1Jvb3RFbGVtZW50KQotICAgICAgICAgewotICAgICAgICAgICBwcmludEluZGVudCgpOwotICAgICAgICAgfQotICAgICAgICAgcHJpbnQoIjwvIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgIHByaW50KGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgICBwcmludGxuKCI+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICB9Ci0gICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIHByaW50bG4oIi8+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICB9Ci0KLSAgICAgICBjdXJyZW50RWxlbWVudEhhc0NoaWxkRWxlbWVudHMgPSBwYXJlbnRFbGVtZW50SGFzQ2hpbGROb2RlczsKLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cihBdHRyIGF0dHIpCi0gICAgIHsKLSAgICAgICBwcmludCgiICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgcHJpbnQoYXR0ci5nZXROb2RlTmFtZSgpKTsKLSAgICAgICBwcmludCgiPVwiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChjcmVhdGVQcmludGFibGVDaGFyYWN0ZXJEYXRhKGF0dHIuZ2V0VmFsdWUoKSkpOwotICAgICAgIHByaW50KCJcIiIpOyAvLyROT04tTkxTLTEkCi0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdFRleHQoVGV4dCB0ZXh0KQotICAgICB7Ci0gICAgICAgaWYgKGN1cnJlbnRFbGVtZW50SGFzQ2hpbGRFbGVtZW50cykKLSAgICAgICB7Ci0gICAgICAgICBwcmludEluZGVudCgpOwotICAgICAgICAgcHJpbnQoY3JlYXRlUHJpbnRhYmxlQ2hhcmFjdGVyRGF0YSh0ZXh0LmdldE5vZGVWYWx1ZSgpKSk7Ci0gICAgICAgICBwcmludGxuKCk7Ci0gICAgICAgfQotICAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgICBwcmludChjcmVhdGVQcmludGFibGVDaGFyYWN0ZXJEYXRhKHRleHQuZ2V0Tm9kZVZhbHVlKCkpKTsKLSAgICAgICB9Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdENEQVRBU2VjdGlvbihDREFUQVNlY3Rpb24gY2RhdGFTZWN0aW9uKQotICAgICB7Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdENvbW1lbnQoQ29tbWVudCBjb21tZW50KQotICAgICB7Ci0gICAgICAgcHJpbnRJbmRlbnQoKTsKLSAgICAgICBwcmludCgiPCEtLSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgcHJpbnQoY29tbWVudC5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICAgcHJpbnRsbigiLS0+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0UHJvY2Vzc2luZ0luc3RydWN0aW9uKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSkKLSAgICAgewotICAgICAgIHByaW50SW5kZW50KCk7Ci0gICAgICAgcHJpbnQoIjw/Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChwaS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICBwcmludCgiICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgcHJpbnQocGkuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgIHByaW50bG4oIj8+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgfQotICAgICAgICAgICAgIAotCi0gICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkRWxlbWVudHMoTm9kZSBub2RlKQotICAgICB7Ci0gICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICB7Ci0gICAgICAgICBpZiAoY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgewotICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2hpbGROb2Rlc0hlbHBlcihOb2RlIG5vZGUpCi0gICAgIHsKLSAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICB7Ci0gICAgICAgICB2aXNpdE5vZGUoY2hpbGRyZW4uaXRlbShpKSk7Ci0gICAgICAgfQotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVzSGVscGVyKE5vZGUgbm9kZSkKLSAgICAgewotICAgICAgIE5hbWVkTm9kZU1hcCBtYXAgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcC5nZXRMZW5ndGgoKTsgaSsrICkKLSAgICAgICB7Ci0gICAgICAgICB2aXNpdE5vZGUobWFwLml0ZW0oaSkpOwotICAgICAgIH0KLSAgICAgfQotICAgfQotCi0gIC8qKiBhbiB1Z2x5IGhhY2sgdW50aWwgSSByZXN0cnVjdCB0aGlzIGNvZGUgYSBsaXR0bGUKLSAgICogIAotICAgKi8gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBkb1Nob3coRWxlbWVudCBlbGVtZW50KSAgICAKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvKiogY29udmVydHMgRE9NIHRleHQgdmFsdWVzIHRvICdwcmludGFibGUnIHZhbHVlcyAKLSAgICogIC0gY29udmVydHMgJyYnIHRvICcmYW1wOycKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlUHJpbnRhYmxlQ2hhcmFjdGVyRGF0YShTdHJpbmcgc3RyaW5nKQotICB7ICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICBpbnQgaW5kZXggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgd2hpbGUgKHRydWUpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGludCBhbXBlcnNhbmRJbmRleCA9IHN0cmluZy5pbmRleE9mKCImIiwgaW5kZXgpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoYW1wZXJzYW5kSW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCArPSBzdHJpbmcuc3Vic3RyaW5nKGluZGV4LCBhbXBlcnNhbmRJbmRleCk7Ci0gICAgICAgIHJlc3VsdCArPSAiJmFtcDsiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGluZGV4ID0gYW1wZXJzYW5kSW5kZXggKyAxOyAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAKLSAgICByZXN1bHQgKz0gc3RyaW5nLnN1YnN0cmluZyhpbmRleCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqIFByaW50cyB0aGUgc3BlY2lmaWVkIG5vZGUsIHJlY3Vyc2l2ZWx5LiAqLwotICBwdWJsaWMgdm9pZCBwcmludChOb2RlIG5vZGUpCi0gIHsKLSAgICAvLyBpcyB0aGVyZSBhbnl0aGluZyB0byBkbz8KLSAgICBpZiAobm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFhNTFZpc2l0b3IgdmlzaXRvciA9IG5ldyBYTUxWaXNpdG9yKCk7Ci0gICAgICB2aXNpdG9yLnZpc2l0Tm9kZShub2RlKTsKLSAgICB9Ci0gICAgb3V0LmZsdXNoKCk7Ci0gIH0KLQotICAvKiogYSB0ZW1wb3JhcnkgaGFjayB0byB3b3JrYXJvdW5kIG91ciBpbmFiaWxpdHkgdG8gY3JlYXRlIGEgRG9jdW1lbnRUeXBlIHRhZyovCi0gIHB1YmxpYyB2b2lkIHByaW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZ3JhbW1hclVSTCkKLSAgewotICAgIFN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0gICAgaWYgKGdyYW1tYXJVUkwuZW5kc1dpdGgoImR0ZCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgaW50IGxhc3RTbGFzaEluZGV4ID0gTWF0aC5tYXgoZ3JhbW1hclVSTC5sYXN0SW5kZXhPZigiLyIpLCBncmFtbWFyVVJMLmxhc3RJbmRleE9mKCJcXCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBpZiAobGFzdFNsYXNoSW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHN5c3RlbUlkID0gZ3JhbW1hclVSTC5zdWJzdHJpbmcobGFzdFNsYXNoSW5kZXggKyAxKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcHJpbnQoZG9jdW1lbnQsICJVVEYtOCIsIGdyYW1tYXJVUkwsIG51bGwsIHN5c3RlbUlkKTsgLy8kTk9OLU5MUy0xJAotCi0gIH0KLQotICAvKiogYSB0ZW1wb3JhcnkgaGFjayB0byB3b3JrYXJvdW5kIG91ciBpbmFiaWxpdHkgdG8gY3JlYXRlIGEgRG9jdW1lbnRUeXBlIHRhZyovCi0gIHB1YmxpYyB2b2lkIHByaW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBncmFtbWFyRmlsZU5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0JcHVibGljSWQgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3MocHVibGljSWQpOwotCXN5c3RlbUlkID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKHN5c3RlbUlkKTsKLSAgICBvdXQucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIiArICIgZW5jb2Rpbmc9XCIiICsgZW5jb2RpbmcgKyAiXCI/PiIpOyAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgaWYgKGdyYW1tYXJGaWxlTmFtZS5lbmRzV2l0aCgiLmR0ZCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgU3RyaW5nIGRvY1R5cGVMaW5lID0gIjwhRE9DVFlQRSAiICsgZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Tm9kZU5hbWUoKSArICIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBpZiAocHVibGljSWQgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIGRvY1R5cGVMaW5lICs9ICJQVUJMSUMgXCIiICsgcHVibGljSWQgKyAiXCIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGlmIChzeXN0ZW1JZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZG9jVHlwZUxpbmUgKz0gIlwiIiArIHN5c3RlbUlkICsgIlwiICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICAgIGRvY1R5cGVMaW5lICs9ICI+IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBvdXQucHJpbnRsbihkb2NUeXBlTGluZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzeXN0ZW1JZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBkb2NUeXBlTGluZSArPSAiU1lTVEVNIFwiIiArIHN5c3RlbUlkICsgIlwiID4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgb3V0LnByaW50bG4oZG9jVHlwZUxpbmUpOwotICAgICAgfQotICAgIH0KLSAgICBwcmludChkb2N1bWVudCk7Ci0gIH0gIAotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERvY3VtZW50VHlwZURhdGEoRG9jdW1lbnRUeXBlIGRvY3R5cGUpCi0gIHsKLSAgICBTdHJpbmcgZGF0YSA9IGRvY3R5cGUuZ2V0TmFtZSgpOwotICAgIGlmIChkb2N0eXBlLmdldFB1YmxpY0lkKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkYXRhICs9ICIgUFVCTElDIFwiIiArIGRvY3R5cGUuZ2V0UHVibGljSWQoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgU3RyaW5nIHN5c3RlbUlkID0gZG9jdHlwZS5nZXRTeXN0ZW1JZCgpOwotICAgICAgaWYgKHN5c3RlbUlkID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHN5c3RlbUlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGRhdGEgKz0gIiBcIiIgKyBzeXN0ZW1JZCArICJcIiI7ICAgICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkYXRhICs9ICIgU1lTVEVNIFwiIiArIGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICByZXR1cm4gZGF0YTsKLSAgfSAgICAgCi0KLSAgcHVibGljIHZvaWQgcHJpbnRsbigpCi0gIHsKLSAgICBpZiAoZm9ybWF0dGluZ0VuYWJsZWQpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludGxuKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICBpZiAoZm9ybWF0dGluZ0VuYWJsZWQpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oc3RyaW5nKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludChzdHJpbmcpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50SW5kZW50KCkKLSAgeyAgICAgICAgICAgICAKLSAgICBpZiAoZm9ybWF0dGluZ0VuYWJsZWQpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50KCIgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAgCi0KLSAgcHVibGljIHZvaWQgcHJpbnQoU3RyaW5nIHN0cmluZykKLSAgewotICAgIG91dC5wcmludChzdHJpbmcpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0luZmVycmVkR3JhbW1hckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0luZmVycmVkR3JhbW1hckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRhM2M0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9JbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8vIHRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gYnVpbGQgYSBncmFtbWFyIGRvY3VtZW50IGdpdmVuIGEgbG9jYWwgZmlsZSBuYW1lCi0vLwotcHVibGljIGludGVyZmFjZSBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5Ci17ICAgCi0gIHB1YmxpYyBDTURvY3VtZW50IGNyZWF0ZUNNRG9jdW1lbnQoU3RyaW5nIHVyaSk7IAotICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24oQ01Eb2N1bWVudCBjbURvY3VtZW50LCBFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gaXNMb2NhbCk7Ci0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNNQ29udGVudChDTURvY3VtZW50IHBhcmVudENNRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBDTURvY3VtZW50IGNoaWxkQ01Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gY2hpbGRFZCwgYm9vbGVhbiBpc0xvY2FsLCBTdHJpbmcgdXJpKTsKLSAgcHVibGljIHZvaWQgZGVidWdQcmludChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pOyAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZUF0dHJpYnV0ZVZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZUF0dHJpYnV0ZVZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThkMTkzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBidWcgMTk4ODA3IC0gYXR0cmlidXRlIG9yZGVyIGRlcGVuZGFuY3kuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NDSEVNQV9JTlNUQU5DRV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgeHNpUHJlZml4ID0gInhzaSI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgdm9pZCB2aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyBuYW1lc3BhY2VQcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsgICAKLSAgICBpZiAobmFtZXNwYWNlVVJJLmVxdWFscyhYTUxfU0NIRU1BX0lOU1RBTkNFX1VSSSkpCi0gICAgewotICAgICAgeHNpUHJlZml4ID0gbmFtZXNwYWNlUHJlZml4OwotICAgIH0KLSAgfSAKLQotICBwdWJsaWMgdm9pZCB2aXNpdFhTSU5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb25BdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0WFNJU2NoZW1hTG9jYXRpb25BdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlKTsgICAgICAgICAgCi0gICAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgU3RyaW5nIG5zVVJJID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotICAgICAgU3RyaW5nIGxvY2F0aW9uSGludCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsgICAgICAgICAgICAKLSAgICAgIGlmIChuc1VSSSAhPSBudWxsICYmIGxvY2F0aW9uSGludCAhPSBudWxsKQotICAgICAgeyAgICAKLSAgICAgICAgdmlzaXRYU0lTY2hlbWFMb2NhdGlvblZhbHVlUGFpcihuc1VSSSwgbG9jYXRpb25IaW50KTsgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfSAgIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0WFNJU2NoZW1hTG9jYXRpb25WYWx1ZVBhaXIoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIE5hbWVkTm9kZU1hcCBtYXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICBpbnQgbWFwTGVuZ3RoID0gbWFwLmdldExlbmd0aCgpOwotICAgIAotICAgIC8vIEZpcnN0IHJldHJpZXZlIGFsbCB0aGUgbmFtZXNwYWNlcyBzbyB0aGF0IHRoZXkgYXJlIGxvYWRlZCBiZWZvcmUKLSAgICAvLyBkb2luZyBhbnkgc3BlY2lhbCBwcmVmaXggaGFuZGxpbmcuICBUaGlzIGFsbG93cyB0aGUgYXR0cmlidXRlcyB0byBiZQotICAgIC8vIGRlZmluZWQgaW4gYW55IG9yZGVyLCBidXQgdGhlIG5hbWVzcGFjZXMgaGF2ZSB0byBiZSByZXRyaWV2ZWQgZmlyc3QuCi0gICAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBMZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBBdHRyIGF0dHIgPSAoQXR0ciltYXAuaXRlbShpKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgIFN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyLmdldE5hbWUoKSk7Ci0gICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgdW5wcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoInhtbG5zIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKGF0dHIsIHVucHJlZml4ZWROYW1lLCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh1bnByZWZpeGVkTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAodW5wcmVmaXhlZE5hbWUuZXF1YWxzKCJ4bWxucyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShhdHRyLCAiIiwgYXR0ci5nZXRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9ICAgICAgCi0KLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcExlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIEF0dHIgYXR0ciA9IChBdHRyKW1hcC5pdGVtKGkpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgoYXR0ci5nZXROYW1lKCkpOwotICAgICAgU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiB1bnByZWZpeGVkTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgIAlpZiAocHJlZml4LmVxdWFscyh4c2lQcmVmaXgpICYmIHVucHJlZml4ZWROYW1lLmVxdWFscygic2NoZW1hTG9jYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0lTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShhdHRyLCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHByZWZpeC5lcXVhbHMoeHNpUHJlZml4KSAmJiB1bnByZWZpeGVkTmFtZS5lcXVhbHMoIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0lOb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKGF0dHIsIGF0dHIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZUluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhZjkxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUluZm8KLXsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIFN0cmluZyB1cmk7Ci0gIHB1YmxpYyBTdHJpbmcgcHJlZml4OwotICBwdWJsaWMgU3RyaW5nIGxvY2F0aW9uSGludDsKLSAgcHVibGljIGJvb2xlYW4gaXNQcmVmaXhSZXF1aXJlZDsgCi0gIHByb3RlY3RlZCBIYXNodGFibGUgaGFzaHRhYmxlOwotCi0gIHB1YmxpYyBOYW1lc3BhY2VJbmZvKCkKLSAgewotICB9Ci0KLSAgcHVibGljIE5hbWVzcGFjZUluZm8oU3RyaW5nIHVyaSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMudXJpID0gdXJpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0gICAgdGhpcy5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnQ7Ci0gIH0gICAKLQotICBwdWJsaWMgTmFtZXNwYWNlSW5mbyhOYW1lc3BhY2VJbmZvIHRoYXQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMudXJpID0gdGhhdC51cmk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLnByZWZpeCA9IHRoYXQucHJlZml4OwotICAgIHRoaXMubG9jYXRpb25IaW50ID0gdGhhdC5sb2NhdGlvbkhpbnQ7Ci0gICAgLy8gdG9kby4uLiBzZWUgaWYgd2UgbmVlZCB0byBjbG9uZSB0aGUgaGFzdGFibGUgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBub3JtYWxpemUoKQotICB7Ci0gICAgdXJpID0gZ2V0Tm9ybWFsaXplZFZhbHVlKHVyaSk7Ci0gICAgcHJlZml4ICA9IGdldE5vcm1hbGl6ZWRWYWx1ZShwcmVmaXgpOwotICAgIGxvY2F0aW9uSGludD0gZ2V0Tm9ybWFsaXplZFZhbHVlKGxvY2F0aW9uSGludCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vcm1hbGl6ZWRWYWx1ZShTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIChzdHJpbmcgIT0gbnVsbCAmJiBzdHJpbmcudHJpbSgpLmxlbmd0aCgpID09IDApID8gbnVsbCA6IHN0cmluZzsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmIChoYXNodGFibGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBoYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgfQotICAgIGhhc2h0YWJsZS5wdXQocHJvcGVydHksIHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgcmV0dXJuIChoYXNodGFibGUgIT0gbnVsbCkgPyBoYXNodGFibGUuZ2V0KHByb3BlcnR5KSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgY2xvbmVOYW1lc3BhY2VJbmZvTGlzdChMaXN0IG9sZExpc3QpCi0gIHsgIAotICAgIExpc3QgbmV3TGlzdCA9IG5ldyBWZWN0b3Iob2xkTGlzdC5zaXplKCkpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG9sZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLSAgICAgIG5ld0xpc3QuYWRkKG5ldyBOYW1lc3BhY2VJbmZvKG9sZEluZm8pKTsKLSAgICB9ICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIG5ld0xpc3Q7Ci0gIH0KLX0gICAgICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZVRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWQxMTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZVRhYmxlIGV4dGVuZHMgTmFtZXNwYWNlQXR0cmlidXRlVmlzaXRvcgoteyAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIEhhc2h0YWJsZSBoYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqIEBwYXJhbSBkb2N1bWVudCAtIG5vIGxvbmdlciB1c2VkCi0gKi8KLXB1YmxpYyBOYW1lc3BhY2VUYWJsZShEb2N1bWVudCBkb2N1bWVudCkKLSAgeyAgICAgICAgIAotCSAgdGhpcygpOwotICAgIC8vRE9NRXh0ZW5zaW9uIGRvbUV4dGVuc2lvbiA9IERPTUV4dGVuc2lvblByb3ZpZGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRET01FeHRlbnNpb24oZG9jdW1lbnQpOwotICAgIC8vaWYgKGRvbUV4dGVuc2lvbiAhPSBudWxsKQotICAgIC8veyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gIGFkZE5hbWVzcGFjZUluZm9MaXN0KGRvbUV4dGVuc2lvbi5nZXRJbXBsaWN0TmFtZXNwYWNlSW5mb0xpc3QoKSwgdHJ1ZSk7Ci0gICAgLy8gfQotICB9ICAgCi0KLSAgcHJpdmF0ZSBOYW1lc3BhY2VUYWJsZSgpCi0gIHsgICAgICAgCi0JICBzdXBlcigpOwotICB9ICAKLQotICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZUVuY291bnRlcmVkKCkKLSAgewotICAgIHJldHVybiBoYXNodGFibGUudmFsdWVzKCkuc2l6ZSgpID4gMDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4Rm9yVVJJKFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIE5hbWVzcGFjZUluZm8gZW50cnkgPSBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKHVyaSwgdHJ1ZSk7Ci0gICAgaWYgKGVudHJ5ICE9IG51bGwpIAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGVudHJ5LnByZWZpeDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgICAgIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJRm9yUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gIHsgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IGdldE5hbWVzcGFjZUluZm9Gb3JQcmVmaXgocHJlZml4KTsKLSAgICBpZiAoaW5mbyAhPSBudWxsKSAKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpbmZvLnVyaTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0KLSAgICAgICAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXRjaGluZ1N0cmluZyhTdHJpbmcgYSwgU3RyaW5nIGIpCi0gIHsKLSAgICByZXR1cm4gKChhID09IG51bGwgJiYgYiA9PSBudWxsKSB8fCAoYSAhPSBudWxsICYmIGIgIT0gbnVsbCAmJiBhLmVxdWFscyhiKSkpOwotICB9Ci0gICAKLQotICBwdWJsaWMgTmFtZXNwYWNlSW5mbyBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKHVyaSwgZmFsc2UpOwotICB9Ci0KLQotICBwdWJsaWMgTmFtZXNwYWNlSW5mbyBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKFN0cmluZyB1cmksIGJvb2xlYW4gdGVzdEltcGxpZWQpCi0gIHsKLSAgICBOYW1lc3BhY2VJbmZvIHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gaGFzaHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICBOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IChOYW1lc3BhY2VJbmZvKWkubmV4dCgpOyAKLSAgICAgIGlmIChpc01hdGNoaW5nU3RyaW5nKG5zSW5mby51cmksIHVyaSkpCi0gICAgICB7ICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gbnNJbmZvOwotICAgICAgICBpZiAodGVzdEltcGxpZWQgJiYgbnNJbmZvLmdldFByb3BlcnR5KCJpc0ltcGxpZWQiKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjb250aW51ZQotICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0KLQotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbkhpbnRGb3JVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgeyAgICAgIAotICAgLy8gTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGhhc2h0YWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgTmFtZXNwYWNlSW5mbyBuc0luZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsgCi0gICAgICBpZiAoaXNNYXRjaGluZ1N0cmluZyhuc0luZm8udXJpLCB1cmkpKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIG5zSW5mby5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICAgCi0KLSAgcHVibGljIE5hbWVzcGFjZUluZm8gZ2V0TmFtZXNwYWNlSW5mb0ZvclByZWZpeChTdHJpbmcgcHJlZml4KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcmVmaXggPSBwcmVmaXggIT0gbnVsbCA/IHByZWZpeCA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgcmV0dXJuIChOYW1lc3BhY2VJbmZvKWhhc2h0YWJsZS5nZXQocHJlZml4KTsKLSAgfSAgIAotCi0KLSAgcHVibGljIHZvaWQgdmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgbmFtZXNwYWNlUHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTmFtZXNwYWNlSW5mbyBuc0luZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOyAgICAgIAotICAgIG5zSW5mby5wcmVmaXggPSBuYW1lc3BhY2VQcmVmaXg7Ci0gICAgbnNJbmZvLnVyaSA9IG5hbWVzcGFjZVVSSTsgICAgICAKLSAgIAotICAgIE5hbWVzcGFjZUluZm8gbWF0Y2hpbmdOYW1lc3BhY2VJbmZvID0gZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSShuYW1lc3BhY2VVUkkpOwotICAgIGlmIChtYXRjaGluZ05hbWVzcGFjZUluZm8gIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBuc0luZm8ubG9jYXRpb25IaW50ID0gbWF0Y2hpbmdOYW1lc3BhY2VJbmZvLmxvY2F0aW9uSGludDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbyhuYW1lc3BhY2VQcmVmaXgsIG5zSW5mbyk7Ci0KLSAgICBzdXBlci52aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShhdHRyLCBuYW1lc3BhY2VQcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gIH0gCi0gICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uVmFsdWVQYWlyKFN0cmluZyB1cmksIFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gIHsKLSAgICBzZXRMb2NhdGlvbkhpbnRGb3JVUkkodXJpLCBsb2NhdGlvbkhpbnQpOwotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlSW5mbyhOYW1lc3BhY2VJbmZvIGluZm8pCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcga2V5ICA9IChpbmZvLnByZWZpeCAhPSBudWxsKSA/IGluZm8ucHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLSAgICBpbnRlcm5hbEFkZE5hbWVzcGFjZUluZm8oa2V5LCBpbmZvKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbyhTdHJpbmcga2V5LCBOYW1lc3BhY2VJbmZvIGluZm8pCi0gIHsKLSAgICBoYXNodGFibGUucHV0KGtleSwgaW5mbyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QsIGJvb2xlYW4gaXNJbXBsaWVkKQotICB7ICAgICAgIAotICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLSAgICAgICAgTmFtZXNwYWNlSW5mbyBjbG9uZSA9IG5ldyBOYW1lc3BhY2VJbmZvKGluZm8pOyAgICAKLSAgICAgICAgaWYgKGlzSW1wbGllZCkKLSAgICAgICAgewotICAgICAgICAgIGNsb25lLnNldFByb3BlcnR5KCJpc0ltcGxpZWQiLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgICBhZGROYW1lc3BhY2VJbmZvKGNsb25lKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QpCi0gIHsgIAotICAgIGFkZE5hbWVzcGFjZUluZm9MaXN0KGxpc3QsIGZhbHNlKTsgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRYU0lOb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgewotICAgIGFkZE5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24obG9jYXRpb25IaW50KTsKLSAgfSAKLQotICBwdWJsaWMgdm9pZCBhZGROb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uKFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gIHsKLSAgICBOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7ICAgICAgCi0gICAgbnNJbmZvLnByZWZpeCA9IG51bGw7Ci0gICAgbnNJbmZvLnVyaSA9ICIiOyAgICAgICAvLyROT04tTkxTLTEkCi0gICAgbnNJbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludDsgIAotICAgIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbygiIiwgbnNJbmZvKTsgLy8kTk9OLU5MUy0xJAotICB9IAotCi0gIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZUluZm8oU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgewotICAgIE5hbWVzcGFjZUluZm8gbnNJbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsgICAgICAKLSAgICBuc0luZm8ucHJlZml4ID0gcHJlZml4OwotICAgIG5zSW5mby51cmkgPSB1cmk7ICAgICAgCi0gICAgbnNJbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludDsgIAotICAgIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbyhwcmVmaXggIT0gbnVsbCA/IHByZWZpeCA6ICIiLCBuc0luZm8pOyAvLyROT04tTkxTLTEkCi0gIH0gCi0KLSAgcHVibGljIHZvaWQgYWRkRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAKLSAgICB2aXNpdEVsZW1lbnQoZWxlbWVudCk7ICAKLSAgfSAgICAgIAotICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnRMaW5lYWdlKEVsZW1lbnQgdGFyZ2V0RWxlbWVudCkKLSAgewotICAgIExpc3QgbGlzdCA9IE5hbWVzcGFjZVRhYmxlLmdldEVsZW1lbnRMaW5lYWdlKHRhcmdldEVsZW1lbnQpOyAgICAgICAgICAgICAgICAgCi0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KWkubmV4dCgpOwotICAgICAgYWRkRWxlbWVudChlbGVtZW50KTsKLSAgICB9ICAgICAgICAgICAgCi0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0RWxlbWVudExpbmVhZ2UoRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgICAgIAotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgICAgICAKLSAgICBmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQ7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICByZXN1bHQuYWRkKDAsIG5vZGUpOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAKLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXROYW1lc3BhY2VJbmZvQ29sbGVjdGlvbigpCi0gIHsgICAgICAgICAgICAgIAotICAgIHJldHVybiBoYXNodGFibGUudmFsdWVzKCk7Ci0gIH0gCi0KLSAgcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBsaXN0LmFkZEFsbChoYXNodGFibGUudmFsdWVzKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci19IApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWVtZk1vZGVsU3luY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VtZjJ4bWwvRU1GMkRPTVNTRUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwY2VlMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWVtZk1vZGVsU3luY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VtZjJ4bWwvRU1GMkRPTVNTRUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbWYyeG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTUFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkVNRjJET01SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgRU1GMkRPTVNTRUFkYXB0ZXIgZXh0ZW5kcyBFTUYyRE9NQWRhcHRlckltcGwgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIgewotCQotCXByaXZhdGUgQ2xhc3MgcmVzb3VyY2VDbGFzczsKLQlwdWJsaWMgRU1GMkRPTVNTRUFkYXB0ZXIoTm9kZSBub2RlLCBFTUYyRE9NUmVuZGVyZXIgcmVuZGVyZXIsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQlzdXBlcihub2RlLCByZW5kZXJlciwgdHJhbnNsYXRvcik7Ci0JfQotCi0JcHVibGljIEVNRjJET01TU0VBZGFwdGVyKE5vdGlmaWVyIG9iamVjdCwgTm9kZSBub2RlLCBFTUYyRE9NUmVuZGVyZXIgcmVuZGVyZXIsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQlzdXBlcihvYmplY3QsIG5vZGUsIHJlbmRlcmVyLCB0cmFuc2xhdG9yKTsKLQl9Ci0KLQlwdWJsaWMgRU1GMkRPTVNTRUFkYXB0ZXIoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlLCBEb2N1bWVudCBkb2N1bWVudCwgRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJc3VwZXIocmVzb3VyY2UsIGRvY3VtZW50LCByZW5kZXJlciwgdHJhbnNsYXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjYWxjSW5kZW50U3RyaW5nKE5vZGUgbm9kZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCAiTm9kZSBtdXN0IGJlIGNvbm5lY3RlZCBpbnRvIHRoZSB0cmVlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCVN0cmluZyBpbmRlbnRTdHJpbmcgPSBnZXROZXdsaW5lU3RyaW5nKG5vZGUpOwotCi0JCS8vIEZpbmQgaW5kZW50YXRpb24gc3RyaW5nIGZvciB0aGlzIG5vZGUgYmFzZWQgb24gaXRzIHNpYmxpbmcgb3IKLQkJLy8gcGFyZW50Ci0JCU5vZGUgcHJldmlvdXNTaWJsaW5nID0gRE9NVXRpbGl0aWVzLmdldFByZXZpb3VzTm9kZVNpYmxpbmcobm9kZSk7Ci0JCWlmIChwcmV2aW91c1NpYmxpbmcgIT0gbnVsbCkgewotCQkJaW5kZW50U3RyaW5nID0gcHJpbUdldEluZGVudFN0cmluZyhwcmV2aW91c1NpYmxpbmcpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIHBhcmVudEluZGVudFN0cmluZyA9IHByaW1HZXRJbmRlbnRTdHJpbmcocGFyZW50KTsKLQkJCWluZGVudFN0cmluZyA9IHBhcmVudEluZGVudFN0cmluZyArIERPTVV0aWxpdGllcy5JTkRFTlRfU1RSSU5HOwotCQl9Ci0JCXJldHVybiBpbmRlbnRTdHJpbmc7Ci0JfQotCi0JLyoKLQkgKiBQcmludHMgb3V0IGEgRE9NIG5vdGlmaWNhdGlvbiBmb3IgZGVidWdnaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlYnVnRE9NTm90aWZ5KElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJaWYgKGZEZWJ1ZykgewotCQkJU3RyaW5nIG5vdGlmVHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5BREQgOgotCQkJCQlub3RpZlR5cGUgPSAiQUREIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuUkVNT1ZFIDoKLQkJCQkJbm90aWZUeXBlID0gIlJFTU9WRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkNIQU5HRSA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJDSEFOR0UiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQgOgotCQkJCQlub3RpZlR5cGUgPSAiQ09OVEVOVF9DSEFOR0VEIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgOgotCQkJCQlub3RpZlR5cGUgPSAiU1RSVUNUVVJFX0NIQU5HRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiRE9NIENoYW5nZTogIiArIG5vdGlmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJcdG5vdGlmaWVyICAgICAgOiAiICsgbm90aWZpZXIpOyAvLyROT04tTkxTLTEkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiXHRjaGFuZ2VkRmVhdHVyZTogIiArIGNoYW5nZWRGZWF0dXJlKTsgLy8kTk9OLU5MUy0xJAotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIlx0b2xkVmFsdWUgICAgICA6ICIgKyBvbGRWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJcdG5ld1ZhbHVlICAgICAgOiAiICsgbmV3VmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNhYmxlVW5kb01hbmFnZW1lbnRJZk5lY2Vzc2FyeSgpIHsKLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0WE1MTW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKQotCQkJbW9kZWwuZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlVW5kb01hbmFnZW1lbnQoKSB7Ci0JCUlET01Nb2RlbCBtb2RlbCA9IGdldFhNTE1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCW1vZGVsLmVuYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROZXdsaW5lU3RyaW5nKE5vZGUgbm9kZSkgewotCQkvKgotCQkgKiBXZSBzaG91bGQgYWx3YXlzIGhhdmUgSURPTU5vZGUsIGFuZCBJU3RydWN0dXJlZERvY3VtZW50LCBhbmQKLQkJICogY29uc3F1ZW50bHkgYSB2YWxpZCAicHJlZmVycmVkIiBsaW5lIGRlbGltaXRlciwgYnV0IGp1c3QgdG8gYmUKLQkJICogc2FmZSwgd2UnbGwgYXNzaWduIHNvbWV0aGluZyBieSBkZWZhdWx0LgotCQkgKi8KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQgPSB4bWxOb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBET01VdGlsaXRpZXMuTkVXTElORV9TVFJJTkc7Ci0JfQotCi0JcHJvdGVjdGVkIElET01Nb2RlbCBnZXRYTUxNb2RlbCgpIHsKLQkJaWYgKGdldE5vZGUoKSAhPSBudWxsKQotCQkJcmV0dXJuICgoSURPTU5vZGUpIGdldE5vZGUoKSkuZ2V0TW9kZWwoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElET01Ob2RlIGdldFhNTE5vZGUoKSB7Ci0JCXJldHVybiAoSURPTU5vZGUpIGdldE5vZGUoKTsKLQl9Ci0KLQkvKgotCSAqIERvIG5vdGhpbmcgZm9yIFNTRSwgd2Ugd2lsbCB0b2xlcmF0ZSBhbnl0aGluZyB0aGV5IGFkZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24oRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBleCkgewotCQkvLyBEbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiBEbyBub3RoaW5nIGZvciBTU0UsIHdlIHdpbGwgdG9sZXJhdGUgYW55dGhpbmcgdGhleSBhZGQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVJbnZhbGlkTXVsdGlOb2RlcyhTdHJpbmcgbm9kZU5hbWUpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluZGVudChOb2RlIG5vZGUsIFRyYW5zbGF0b3IgbWFwKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobm9kZS5nZXRQYXJlbnROb2RlKCksICJOb2RlIG11c3QgYmUgY29ubmVjdGVkIGludG8gdGhlIHRyZWUiKTsgLy8kTk9OLU5MUy0xJAotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCi0JCVN0cmluZyBpbmRlbnRTdHJpbmcgPSBjYWxjSW5kZW50U3RyaW5nKG5vZGUpOwotCi0JCS8vIEluZGVudCBiZWZvcmUgdGhlIHN0YXJ0IHRhZwotCQlpbmRlbnRTdGFydFRhZyhpbmRlbnRTdHJpbmcsIG5vZGUsIG1hcCk7Ci0KLQkJLy8gSW5kZW50IGJlZm9yZSB0aGUgZW5kIHRhZwotCQlpbmRlbnRFbmRUYWcoaW5kZW50U3RyaW5nLCBub2RlLCBtYXApOwotCX0KLQotCS8qKgotCSAqIEluZGVudCBiZWZvcmUgdGhlIGVuZCB0YWcgb2YgdGhlIDxub2RlPnBhc3NlZCBpbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbmRlbnRFbmRUYWcoU3RyaW5nIGluZGVudFN0cmluZywgTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlpZiAoIW1hcC5zaG91bGRJbmRlbnRFbmRUYWcobm9kZSkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBkb21QYXRoID0gbWFwLmdldERPTVBhdGgoKTsKLQotCQlpZiAoKCFtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSAmJiAhbWFwLmlzRE9NVGV4dFZhbHVlKCkpIHx8IChtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSAmJiBkb21QYXRoLmxlbmd0aCgpICE9IDApICYmIG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoZG9tUGF0aCkpIHsKLQkJCVRleHQgbmV3V1MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZShnZXROZXdsaW5lU3RyaW5nKG5vZGUpICsgaW5kZW50U3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkJRE9NVXRpbGl0aWVzLmluc2VydEJlZm9yZU5vZGUobm9kZSwgbmV3V1MsIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5kZW50IGJlZm9yZSB0aGUgc3RhcnQgdGFnIG9mIHRoZSA8bm9kZT5wYXNzZWQgaW4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5kZW50U3RhcnRUYWcoU3RyaW5nIGluZGVudFN0cmluZywgTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlUZXh0IG5ld1dTID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoZ2V0TmV3bGluZVN0cmluZyhub2RlKSArIGluZGVudFN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLQkJRE9NVXRpbGl0aWVzLmluc2VydEFmdGVyTm9kZShwYXJlbnQsIG5ld1dTLCBET01VdGlsaXRpZXMuZ2V0UHJldmlvdXNOb2RlU2libGluZyhub2RlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbXB0eVRhZyhFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gKChJRE9NRWxlbWVudCkgcGFyZW50KS5pc0VtcHR5VGFnKCk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgRE9NIG5vZGUgY2hhbmdlcy4gSXQgYXR0ZW1wdHMgdG8gdXBkYXRlCi0JICogTU9GIG9iamVjdCBiYXNlZCBvbiB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQotCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCi0JCWRlYnVnRE9NTm90aWZ5KG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCi0JCWlmIChub3RpZmllciAhPSBnZXROb2RlKCkgJiYgZXZlbnRUeXBlICE9IElOb2RlTm90aWZpZXIuQ0hBTkdFKSB7Ci0JCQkvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZSBub3RpZmljYXRpb24gd2FzIHNlbnQgZnJvbSBhCi0JCQkvLyBzdWIgbm9kZS4gVXNlIHRoZSBub3RpZmllcnMgbmFtZSB0byBkZXRlcm1pbmUgd2hpY2gKLQkJCS8vIE1PRiBmZWF0dXJlIHRvIHVwZGF0ZS4gTm90ZSB0aGF0IGlzIGlzIGFzc3VtZWQgdGhhdCBpZgotCQkJLy8gdGhlIGV2ZW50VHlwZSBpcyBDSEFOR0UgdGhlbiBpdCBhdHRyaWJ1dGUgb24gYSBwYXRoIG5vZGUKLQkJCS8vIGNoYW5naW5nLiBUaGlzIHdhcyBwdXQgaW4gZm9yIHRoZSBFR0wgZ3JvdXAuCi0JCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEIHx8IGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5DSEFOR0UpIHsKLQkJCQkJRWxlbWVudCBub3RpZnlpbmdOb2RlID0gKEVsZW1lbnQpIG5vdGlmaWVyOwotCQkJCQlUcmFuc2xhdG9yIG1hcCA9IGZpbmRUcmFuc2xhdG9yKG5vdGlmeWluZ05vZGUuZ2V0Tm9kZU5hbWUoKSwgZmFsc2UpOwotCQkJCQlpZiAobWFwICE9IG51bGwpCi0JCQkJCQl1cGRhdGVNT0ZGZWF0dXJlKG1hcCwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIFVwZGF0ZSBldmVyeXRoaW5nIG9uIFNUUlVDVFVSRV9DSEFOR0Ugb3IgQ09OVEVOVF9DSEFOR0UuCi0JCQkvLyBPdGhlciBldmVudCB0eXBlcyBvY2N1ciB0b28gb2Z0ZW4uCi0JCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEKSB7Ci0JCQkJdXBkYXRlTU9GKCk7Ci0JCQl9Ci0JCQkvLyBVcGRhdGUganVzdCB0aGUgYXR0cmlidXRlIHRoYXQgY2hhbmdlZC4KLQkJCWVsc2UgaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJCVRyYW5zbGF0b3IgbWFwID0gZmluZFRyYW5zbGF0b3IoY2hhbmdlZEZlYXR1cmUudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCQkJaWYgKG1hcCAhPSBudWxsKQotCQkJCQl1cGRhdGVNT0ZGZWF0dXJlKG1hcCwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJZW5hYmxlVW5kb01hbmFnZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVVcGRhdGVET01GZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCXN1cGVyLnByZVVwZGF0ZURPTUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQlkaXNhYmxlVW5kb01hbmFnZW1lbnRJZk5lY2Vzc2FyeSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1BZGRET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQkoKElET01Ob2RlKSBhTm9kZSkuYWRkQWRhcHRlcigoRU1GMkRPTVNTRUFkYXB0ZXIpIGFuQWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltQ3JlYXRlQWRhcHRlcihFT2JqZWN0IG1vZk9iamVjdCwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCQlFbGVtZW50IG5ld05vZGUgPSBjcmVhdGVOZXdOb2RlKG1vZk9iamVjdCwgY2hpbGRNYXApOwotCQlyZXR1cm4gbmV3IEVNRjJET01TU0VBZGFwdGVyKG1vZk9iamVjdCwgbmV3Tm9kZSwgZlJlbmRlcmVyLCBjaGlsZE1hcCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltQ3JlYXRlQWRhcHRlcihOb2RlIG5vZGUsIFRyYW5zbGF0b3IgY2hpbGRNYXApIHsKLQkJcmV0dXJuIG5ldyBFTUYyRE9NU1NFQWRhcHRlcihub2RlLCBmUmVuZGVyZXIsIGNoaWxkTWFwKTsKLQl9Ci0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm9kZSBub2RlLCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7Ci0KLQkJLy9Bc3NlcnQuaXNOb3ROdWxsKGNoaWxkTWFwLmdldENoaWxkQWRhcHRlckNsYXNzKCkpOwotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCi0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKG5vZGUsY2hpbGRNYXApOwotCi0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyLmlzTU9GUHJveHkoKSB8fCBhZGFwdGVyLmdldFRhcmdldCgpID09IG51bGwpIHsKLQkJCQlyZW1vdmVET01BZGFwdGVyKG5vZGUsIGFkYXB0ZXIpOwotCQkJCWlmIChhZGFwdGVyLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQkJYWRhcHRlci5nZXRUYXJnZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQkJfQotCQkJCWFkYXB0ZXIgPSBudWxsOwotCQkJfQotCQl9Ci0JCWlmIChhZGFwdGVyID09IG51bGwpIHsKLQkJCWFkYXB0ZXIgPSBwcmltQ3JlYXRlQWRhcHRlcihub2RlLCBjaGlsZE1hcCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGFkZERPTUFkYXB0ZXIoTm9kZSBjaGlsZE5vZGUpIHsKLQotCQkvLyBPbmx5IGFkZCB0aGUgYWRhcHRlciBpZiB0aGlzIGlzIGFuIGNoaWxkIG5vZGUgdGhhdCB3aWxsIG5vdCBiZQotCQkvLyBhZGFwdGVkLiBGb3IgaW5zdGFuY2UgYSBzdWJ0cmVlIHRoYXQgbWFwcyB0byBhIE1PRiBhdHRyaWJ1dGUKLQkJLy8gc2V0dGluZy4KLQkJaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFTUYyRE9NQWRhcHRlciBhdHRyQWRhcHRlciA9IHByaW1HZXRFeGlzdGluZ0FkYXB0ZXIoY2hpbGROb2RlKTsKLQotCQkJaWYgKGF0dHJBZGFwdGVyID09IG51bGwgfHwgYXR0ckFkYXB0ZXIuZ2V0Tm9kZSgpICE9IGdldE5vZGUoKSkgewotCQkJCS8vIElmIHRoZSBub2RlIGlzIGFkYXB0ZWQsIGJ1dCBub3QgYnkgdGhpcyBhZGFwdGVyIHRoZW4gcmVtb3ZlCi0JCQkJLy8gaXQuIFRoaXMgaGFwcGVucyB0byBub24tb2JqZWN0IGNoaWxkcmVuIHdoZW4gdGhlIHBhcmVudCB0YWcKLQkJCQkvLyBuYW1lIGlzIGNoYW5nZWQuCi0JCQkJcmVtb3ZlRE9NQWRhcHRlcihjaGlsZE5vZGUsIGF0dHJBZGFwdGVyKTsKLQotCQkJCWlmIChmRGVidWcpIHsKLQkJCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRDSElMRDogQWRkaW5nIERPTSBhZGFwdGVyOiAiICsgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRcdHRvOiAiICsgY2hpbGROb2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlwcmltQWRkRE9NQWRhcHRlcihjaGlsZE5vZGUsIHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKE5vZGUgYU5vZGUsIFRyYW5zbGF0b3IgY2hpbGRNYXApIHsKLQkJSU5vZGVOb3RpZmllciBzc2VOb2RlID0gKElOb2RlTm90aWZpZXIpIGFOb2RlOwotCQlDb2xsZWN0aW9uIGFkYXB0ZXJzID0gc3NlTm9kZS5nZXRBZGFwdGVycygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvLyBGaXJzdCBDaGVjayBpZiBpdCdzIGFuIEVNRjJET01BZGFwdGVyCi0JCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZShFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKSkgewotCQkJCS8vIENhc3QgdG8gRU1GMkRPTUFkYXB0ZXIKLQkJCQlFTUYyRE9NU1NFQWRhcHRlciBlMkRBZGFwdGVyID0gKEVNRjJET01TU0VBZGFwdGVyKSBhZGFwdGVyOwotCQkJCU9iamVjdCBhZGFwdGVyVGFyZ2V0ID0gZTJEQWRhcHRlci5nZXRUYXJnZXQoKTsKLQkJCQkvL1RyYW5zbGF0b3IgYWRhcHRlclRyYW5zbGF0b3IgPSBlMkRBZGFwdGVyLmZUcmFuc2xhdG9yOwotCQkJCQotCQkJCS8vSGFuZGxlIHRoZSBjYXNlcyB3aGVyZSBlaXRoZXIgYWRhcHRlcidzIHRhcmdldCBpcyBudWxsIAotCQkJCWlmICgoZ2V0VGFyZ2V0KCkgPT0gbnVsbCkgfHwgKGFkYXB0ZXJUYXJnZXQgPT0gbnVsbCkpCi0JCQkJCWlmIChyZXNvdXJjZUNsYXNzICE9IG51bGwgJiYgcmVzb3VyY2VDbGFzcy5lcXVhbHMoZTJEQWRhcHRlci5nZXRSZXNvdXJjZUNsYXNzKCkpKQotCQkJCQkJcmV0dXJuIGUyREFkYXB0ZXI7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQotCQkJCQotCQkJCS8vIENoZWNrIGlmIHRhcmdldCBpcyBhbiBFTUYgcmVzb3VyY2UKLQkJCQlpZiAoZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJCQkvKgotCQkJCQkgKiBOb3cgY2hlY2sgaWYgaXQncyB0aGUgcmlnaHQgb25lIChNdWx0aXBsZSByZXNvdXJjZXMKLQkJCQkJICogY291bGQgYmUgYXR0YWNoZWQpCi0JCQkJCSAqLwotCQkJCQlpZiAoYWRhcHRlclRhcmdldCAhPSBudWxsICYmIGFkYXB0ZXJUYXJnZXQgPT0gZ2V0VGFyZ2V0KCkpIHsKLQkJCQkJCXJldHVybiBlMkRBZGFwdGVyOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBDaGVjayBpZiB0YXJnZXRzIGFyZSBFT2JqZWN0cyB3aXRoIHRoZSBzYW1lIHJlc291cmNlcwotCQkJCQlFT2JqZWN0IG15VGFyZ2V0ID0gKEVPYmplY3QpIGdldFRhcmdldCgpOwotCQkJCQkvKgotCQkJCQkgKiBOb3cgY2hlY2sgaWYgaXQncyB0aGUgcmlnaHQgb25lIChNdWx0aXBsZSByZXNvdXJjZXMgY291bGQKLQkJCQkJICogYmUgYXR0YWNoZWQpCi0JCQkJCSAqLwotCQkJCQlpZiAoYWRhcHRlclRhcmdldCAhPSBudWxsICYmICgoRU9iamVjdClhZGFwdGVyVGFyZ2V0KS5lUmVzb3VyY2UoKSA9PSBteVRhcmdldC5lUmVzb3VyY2UoKSkgewotCQkJCQkJcmV0dXJuIGUyREFkYXB0ZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGFkYXB0ZXJUYXJnZXQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCWlmICgoKEVPYmplY3QpIGUyREFkYXB0ZXIuZ2V0VGFyZ2V0KCkpLmVSZXNvdXJjZSgpID09IG51bGwgJiYgZTJEQWRhcHRlci5mVHJhbnNsYXRvciA9PSBjaGlsZE1hcCkgewotCQkJCQkJcmV0dXJuIGUyREFkYXB0ZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKE5vZGUgYU5vZGUpIHsKLQkJSU5vZGVOb3RpZmllciBzc2VOb2RlID0gKElOb2RlTm90aWZpZXIpIGFOb2RlOwotCQlDb2xsZWN0aW9uIGFkYXB0ZXJzID0gc3NlTm9kZS5nZXRBZGFwdGVycygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvLyBGaXJzdCBDaGVjayBpZiBpdCdzIGFuIEVNRjJET01BZGFwdGVyCi0JCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZShFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKSkgewotCQkJCS8vIENhc3QgdG8gRU1GMkRPTUFkYXB0ZXIKLQkJCQlFTUYyRE9NU1NFQWRhcHRlciBlMkRBZGFwdGVyID0gKEVNRjJET01TU0VBZGFwdGVyKSBhZGFwdGVyOwotCQkJCU9iamVjdCBhZGFwdGVyVGFyZ2V0ID0gZTJEQWRhcHRlci5nZXRUYXJnZXQoKTsKLQkJCQkKLQkJCQkvL0hhbmRsZSB0aGUgY2FzZXMgd2hlcmUgZWl0aGVyIGFkYXB0ZXIncyB0YXJnZXQgaXMgbnVsbCAKLQkJCQlpZiAoKGdldFRhcmdldCgpID09IG51bGwpIHx8IChhZGFwdGVyVGFyZ2V0ID09IG51bGwpKQotCQkJCQlpZiAocmVzb3VyY2VDbGFzcyAhPSBudWxsICYmIHJlc291cmNlQ2xhc3MuZXF1YWxzKGUyREFkYXB0ZXIuZ2V0UmVzb3VyY2VDbGFzcygpKSkKLQkJCQkJCXJldHVybiBlMkRBZGFwdGVyOwotCQkJCQllbHNlCi0JCQkJCQljb250aW51ZTsKLQkJCQkKLQkJCQkKLQkJCQkvLyBDaGVjayBpZiB0YXJnZXQgaXMgYW4gRU1GIHJlc291cmNlCi0JCQkJaWYgKGdldFRhcmdldCgpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQkJLyoKLQkJCQkJICogTm93IGNoZWNrIGlmIGl0J3MgdGhlIHJpZ2h0IG9uZSAoTXVsdGlwbGUgcmVzb3VyY2VzCi0JCQkJCSAqIGNvdWxkIGJlIGF0dGFjaGVkKQotCQkJCQkgKi8KLQkJCQkJaWYgKGFkYXB0ZXJUYXJnZXQgIT0gbnVsbCAmJiBhZGFwdGVyVGFyZ2V0ID09IGdldFRhcmdldCgpKSB7Ci0JCQkJCQlyZXR1cm4gZTJEQWRhcHRlcjsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gQ2hlY2sgaWYgdGFyZ2V0cyBhcmUgRU9iamVjdHMgd2l0aCB0aGUgc2FtZSByZXNvdXJjZXMKLQkJCQkJRU9iamVjdCBteVRhcmdldCA9IChFT2JqZWN0KSBnZXRUYXJnZXQoKTsKLQkJCQkJLyoKLQkJCQkJICogTm93IGNoZWNrIGlmIGl0J3MgdGhlIHJpZ2h0IG9uZSAoTXVsdGlwbGUgcmVzb3VyY2VzIGNvdWxkCi0JCQkJCSAqIGJlIGF0dGFjaGVkKQotCQkJCQkgKi8KLQkJCQkJaWYgKGFkYXB0ZXJUYXJnZXQgIT0gbnVsbCAmJiAoKEVPYmplY3QpYWRhcHRlclRhcmdldCkuZVJlc291cmNlKCkgPT0gbXlUYXJnZXQuZVJlc291cmNlKCkpIHsKLQkJCQkJCXJldHVybiBlMkRBZGFwdGVyOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChhZGFwdGVyVGFyZ2V0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQlpZiAoKChFT2JqZWN0KSBlMkRBZGFwdGVyLmdldFRhcmdldCgpKS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gZTJEQWRhcHRlcjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByaW1HZXRJbmRlbnRTdHJpbmcoTm9kZSBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZmxhdE1vZGVsID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWludCBub2RlU3RhcnRPZmYgPSAoKElET01Ob2RlKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCi0JCWludCBzdGFydE9mZiA9IE1hdGgubWF4KDAsIG5vZGVTdGFydE9mZiAtIDEwMCk7Ci0JCWludCBlbmRPZmYgPSBub2RlU3RhcnRPZmY7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyB0ZXh0ID0gZmxhdE1vZGVsLmdldChzdGFydE9mZiwgZW5kT2ZmIC0gc3RhcnRPZmYpOwotCi0JCQlpbnQgaW54ID0gdGV4dC5sZW5ndGgoKSAtIDE7Ci0JCQlpZiAoaW54ID49IDApIHsKLQkJCQlmb3IgKDsgaW54ID49IDA7IGlueC0tKSB7Ci0JCQkJCWNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpbngpOwotCQkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkgJiYgY2ggIT0gJ1xuJyAmJiBjaCAhPSAnXHInKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlpbngrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKGlueCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQkoKElET01Ob2RlKSBhTm9kZSkucmVtb3ZlQWRhcHRlcigoSU5vZGVBZGFwdGVyKSBhbkFkYXB0ZXIpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgcmVvcmRlckRPTUNoaWxkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBjaGlsZE5vZGUsIE5vZGUgaW5zZXJ0QmVmb3JlTm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJc3VwZXIucmVvcmRlckRPTUNoaWxkKHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgaW5zZXJ0QmVmb3JlTm9kZSwgbWFwKTsKLQkJLy8gU2luY2UgcmVvcmRlcmluZyBkZWxldGVzIGFsbCB0aGUgd2hpdGVzcGFjZSBiZWZvcmUgdGhlIG5vZGUsIHdlCi0JCS8vIG11c3QgaW5kZW50IC4KLQkJaWYgKGluc2VydEJlZm9yZU5vZGUgIT0gbnVsbCAmJiBpbnNlcnRCZWZvcmVOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlpbmRlbnRTdGFydFRhZyhjYWxjSW5kZW50U3RyaW5nKGluc2VydEJlZm9yZU5vZGUpLCBpbnNlcnRCZWZvcmVOb2RlLCBtYXApOwotCQllbHNlCi0JCQlpbmRlbnRTdGFydFRhZyhjYWxjSW5kZW50U3RyaW5nKGNoaWxkTm9kZSksIGNoaWxkTm9kZSwgbWFwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbXB0eVRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJKChJRE9NRWxlbWVudCkgZWxlbWVudCkuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRE9NKCkgewotCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJZGlzYWJsZVVuZG9NYW5hZ2VtZW50SWZOZWNlc3NhcnkoKTsKLQkJCXByaW1VcGRhdGVET00oKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWVuYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0UmVzb3VyY2VDbGFzcygpIHsKLQkJcmV0dXJuIHJlc291cmNlQ2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENoaWxkVHJhbnNsYXRvcnMoKSB7Ci0JCWlmIChmUmVuZGVyZXIgIT0gbnVsbCAmJiBmUmVuZGVyZXIuZ2V0UmVzb3VyY2UoKSAhPSBudWxsKQotCQkJcmVzb3VyY2VDbGFzcyA9IGZSZW5kZXJlci5nZXRSZXNvdXJjZSgpLmdldENsYXNzKCk7Ci0JCXN1cGVyLmluaXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDI4OWQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVtZjJ4bWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbExpZmVjeWNsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgRU1GMkRPTVNTRVJlbmRlcmVyIGV4dGVuZHMgRU1GMkRPTVJlbmRlcmVyIGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lciwgSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIE9iamVjdCBhYm91dFRvQ2hhbmdlTm9kZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0JhdGNoQ2hhbmdlcyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzU2F2aW5nID0gZmFsc2U7Ci0KLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyOwotCQotCXByaXZhdGUgQ2xhc3MgcmVzb3VyY2VDbGFzczsKLQkKLQlwcml2YXRlIGJvb2xlYW4gcmV2ZXJ0aW5nID0gZmFsc2U7Ci0KLQkvKiogVGhlIFhNTCBET00gbW9kZWwgKi8KLQlwcm90ZWN0ZWQgSURPTU1vZGVsIHhtbE1vZGVsOwotCi0JLyoqIFVzZWQgaW50ZXJuYWxseTsgdGhlIHVuaXF1ZSBpZCBmb3IgdGhlIHhtbCBtb2RlbCAqLwotCXByb3RlY3RlZCBTdHJpbmcgeG1sTW9kZWxJZDsKLQotCXByb3RlY3RlZCBib29sZWFuIHhtbE1vZGVsUmV2ZXJ0ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBFTUYyRE9NU1NFUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yUmVhZCgpIHsKLQkJaWYgKCFyZXNvdXJjZS5pc05ldygpKSB7Ci0JCQlTdHJpbmcgaWQgPSBnZXRNb2RlbE1hbmFnZXJJZCgpOwotCQkJZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoaWQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yV3JpdGUoKSB7Ci0JCW1vZGVsQWNjZXNzRm9yV3JpdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZWUgYmF0Y2hNb2RlbEVuZAotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgYmF0Y2hNb2RlRW5kKCkgewotCQlnZXRYTUxNb2RlbCgpLmNoYW5nZWRNb2RlbCgpOwotCQlzZXRSb290Tm9kZUFkYXB0ZXJOb3RpZmljYXRpb25FbmFibGVkKHRydWUpOwotCQlpc0JhdGNoQ2hhbmdlcyA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGJhdGNoTW9kZVN0YXJ0IGFuZCBiYXRjaE1vZGVFbmQgaXMgYSBwYWlyIHRoYXQgY29udHJvbHMgbm90aWZpY2F0aW9ucywKLQkgKiBhbmQgdHJlYWQgYWNjZXNzLiBUaGV5IHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIGluIGEgdHJ5L2ZpbmFsbHkgYmxvY2suCi0JICogCi0JICogc2V0QmF0Y2hNb2RlbCBiZWdpbnMgdGhlIHByb2Nlc3Npbmcgd2hlcmUgbm90aWZpY2F0aW9ucyBhcmUgbm90IHNlbnQKLQkgKiBvdXQgb24gZWFjaCBjaGFuZ2UsIGJ1dCBzYXZlZCB1cCB1bnRpbCB0aGUgZW5kQmF0Y2hNb2RlIGNhbGxlZC4KLQkgKiAKLQkgKiBUaGlzIHBhaXIgb2YgY2FsbHMgY2FuIGFsc28sIGluZGlyZWN0bHksICJsb2NrIiB0aGUgRE9NIE1vZGVsIHRvIGFjY2VzcwotCSAqIGZyb20gb25seSBvbmUgdGhyZWFkLCBzbyBpdCBzaG91bGQgbm90IGJlIGxvY2tlZCBmb3IgbG9uZyBwZXJpb2RzIG9mCi0JICogdGltZS4gVGhhdCdzIGFsc28gd2h5IGl0IGlzIGltcG9ydGFudCB0byBoYXZlIHRoZSBlbmRCYXRjaE1vZGUgaW4gYQotCSAqIGZpbmFsbHkgYmxvY2sgdG8gYmUgc3VyZSBpdCBpcyBhbHdheXMgY2FsbGVkLCBvciB0aGUgRE9NIHdpbGwgYmUgbGVmdAotCSAqIGluIGEgbG9ja2VkLCB1bnVzYWJsZSwgc3RhdGUgYW5kIG9ubHkgc2hvcnRseSBhd2F5IGZyb20gc2V2ZXJlcmUKLQkgKiBwcm9ncmFtIGVycm9yLgotCSAqIAotCSAqIDxwcmU+PGNvZGU+Ci0JICogRXhhbXBsZQotCSAqIDwvY29kZT4KLQkgKiAgCi0JICogIHRyeSB7IAotCSAqICAJCWJhdGNoTW9kZWxTdGFydCgpOwotCSAqICAJCS4uLmRvIGEgc29tZSB3b3JrIC4uLgotCSAqICAJCX0KLQkgKiAgCWZpbmFsbHkgewotCSAqICAJCWVuZEJhdGNoTW9kZSgpOwotCSAqICAJCX0KLQkgKiAgCi0JICogIAotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyB2b2lkIGJhdGNoTW9kZVN0YXJ0KCkgewotCQlpc0JhdGNoQ2hhbmdlcyA9IHRydWU7Ci0JCWdldFhNTE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCXNldFJvb3ROb2RlQWRhcHRlck5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVN5bmNocm9uaXphdGlvblN0YW1wKCkgewotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJCXhtbE1vZGVsLnJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoZmlsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgRG9jdW1lbnQgZ2l2ZW4KLQkgKiAKLQkgKiBAYVJlc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50KCkgewotCQlUcmFuc2xhdG9yUmVzb3VyY2UgcmVzID0gZ2V0UmVzb3VyY2UoKTsKLQkJcmVzLnNldERlZmF1bHRzKCk7Ci0JCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlc291cmNlKTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBET01VdGlsaXRpZXMuY3JlYXRlSGVhZGVySW5wdXRTdHJlYW0ocmVzLmdldERvY3R5cGUoKSwgcmVzLmdldFB1YmxpY0lkKCksIHJlcy5nZXRTeXN0ZW1JZCgpKTsKLQkJaWYgKGlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCUxpc3QgZm9sZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0JCQkJd2hpbGUgKG51bGwgIT0gY29udGFpbmVyICYmICFjb250YWluZXIuZXhpc3RzKCkgJiYgY29udGFpbmVyIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQlmb2xkZXJzLmFkZChjb250YWluZXIpOwotCQkJCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJCUlGb2xkZXIgZm9sZGVyID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZvbGRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJZm9sZGVyID0gKElGb2xkZXIpIGZvbGRlcnMuZ2V0KGkpOwotCQkJCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJCX0KLQkJCQlmaWxlLmNyZWF0ZShpcywgdHJ1ZSwgbnVsbCk7Ci0JCQkJZmlsZS5zZXRMb2NhbCh0cnVlLCAxLCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobnVsbCAhPSBpcykgewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWluaXRpYWxpemVYTUxNb2RlbChmaWxlLCByZXNvdXJjZS5nZXRXcml0ZUNvdW50KCkgIT0gMCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIklXQUUwMDE3RSBVbmV4cGVjdGVkIElPIGV4Y2VwdGlvbiBvY2N1cnJlZCBjcmVhdGluZyB4bWwgZG9jdW1lbnQiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVET01UcmVlSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChuZWVkc1RvQ3JlYXRlRE9NKQotCQkJY3JlYXRlRE9NVHJlZSgpOwotCX0KLQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBjcmVhdGVSb290RE9NQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFTUYyRE9NU1NFQWRhcHRlcihnZXRSZXNvdXJjZSgpLCBkb2N1bWVudCwgdGhpcywgZ2V0UmVzb3VyY2UoKS5nZXRSb290VHJhbnNsYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZVJlZ2lzdGVyQXNNb2RlbExpZmVjeWNsZUxpc3RlbmVyKCkgewotCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCXhtbE1vZGVsLnJlbW92ZU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVSZWdpc3RlckFzTW9kZWxTdGF0ZUxpc3RlbmVyKCkgewotCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCXhtbE1vZGVsLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVyZWdpc3RlckZyb21YTUxNb2RlbCgpIHsKLQkJCi0JCWRlUmVnaXN0ZXJBc01vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQlkZVJlZ2lzdGVyQXNNb2RlbExpZmVjeWNsZUxpc3RlbmVyKCk7Ci0JCS8vIFRoaXMgdHJ5L2NhdGNoIGJsb2NrIGlzIGEgaGFjayB0byBmaXggZGVmZWN0IDIwNDExNC4gVGhpcyBvY2N1cnMKLQkJLy8gYmVjYXVzZQotCQkvLyB0aGUgbW9kZWwgbWFuYWdlciBwbHVnaW4gaXMgc2h1dCBkb3duIGFuZCB1bmxvYWRlZCBiZWZvcmUgdGhlIGoyZWUKLQkJLy8gcGx1Z2luLgotCQkvLyBDYWxsaW5nIGdldE1vZGVsTWFuYWdlcigpIGNhbiByZXN1bHQgaW4gYSBjbGFzcyBjYXN0IGV4Y2VwdGlvbiB0aGF0Ci0JCS8vIHNob3VsZAotCQkvLyBiZSBpZ25vcmVkLgotCQkvLyBNb2RlbE1hbmFnZXIgbWdyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWdldE1vZGVsTWFuYWdlcigpOwotCQl9Ci0JCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCWludCB3cml0ZUNvdW50ID0gcmVzb3VyY2UuZ2V0V3JpdGVDb3VudCgpOwotCQkJaW50IHJlYWRDb3VudCA9IHJlc291cmNlLmdldFJlYWRDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3cml0ZUNvdW50OyBpKyspCi0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgcmVhZENvdW50OyBpaSsrKQotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKHJlc291cmNlLmVBZGFwdGVycygpLCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJYWRhcHRlci5yZW1vdmVBZGFwdGVycyhhZGFwdGVyLmdldE5vZGUoKSk7Ci0JCX0KLQkJeG1sTW9kZWwgPSBudWxsOwotCQl4bWxNb2RlbElkID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1NhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJdHJ5IHsKLQkJCWlzU2F2aW5nID0gdHJ1ZTsKLQkJCWlmIChudWxsICE9IG91dHB1dFN0cmVhbSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNob3VsZCBub3QgdXNlIGFuIE91dHB1dFN0cmVhbSBmb3Igc2F2aW5nIik7fSAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVET01UcmVlSWZOZWNlc3NhcnkoKTsKLQkJCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSAoKFByb2plY3RSZXNvdXJjZVNldCkgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSkuZ2V0U3luY2hyb25pemVyKCk7Ci0JCQlJRmlsZSBhRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQkJdHJ5IHsKLQkJCQlzeW5jaHJvbml6ZXIucHJlU2F2ZShhRmlsZSwgcmVzb3VyY2UpOwotCQkJCXhtbE1vZGVsLnNhdmUoYUZpbGUpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlzeW5jaHJvbml6ZXIucmVtb3ZlRnJvbVJlY2VudGx5U2F2ZWRMaXN0KGFGaWxlKTsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCWNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlzU2F2aW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRU1GMkRPTUFkYXB0ZXIgZ2V0RXhpc3RpbmdET01BZGFwdGVyKE5vZGUgbm9kZSkgewotCQkvL0lET01Ob2RlIHhOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkvL3JldHVybiAoRU1GMkRPTVNTRUFkYXB0ZXIpIHhOb2RlLmdldEFkYXB0ZXJGb3IoRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0KLQkJSU5vZGVOb3RpZmllciBzc2VOb2RlID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0JCUNvbGxlY3Rpb24gYWRhcHRlcnMgPSBzc2VOb2RlLmdldEFkYXB0ZXJzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhZGFwdGVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vIEZpcnN0IENoZWNrIGlmIGl0J3MgYW4gRU1GMkRPTUFkYXB0ZXIKLQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpKSB7Ci0JCQkJLy8gQ2FzdCB0byBFTUYyRE9NU1NFQWRhcHRlcgotCQkJCUVNRjJET01TU0VBZGFwdGVyIGUyREFkYXB0ZXIgPSAoRU1GMkRPTVNTRUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQkJLy9IYW5kbGUgdGhlIGNhc2VzIHdoZXJlIGVpdGhlciBhZGFwdGVyJ3MgdGFyZ2V0IGlzIG51bGwgCi0JCQkJLy9Vc2UgdGhlIHJlc291cmNlQ2xhc3MgdG8gbWFrZSBzdXJlIHRoZSByZXNvdXJjZSB0eXBlIGlzIGlkZW50aWNhbAotCQkJCWlmIChnZXRSZXNvdXJjZSgpID09IG51bGwgfHwgZTJEQWRhcHRlci5nZXRUYXJnZXQoKSA9PSBudWxsKQotCQkJCQlpZihyZXNvdXJjZUNsYXNzLmVxdWFscyhlMkRBZGFwdGVyLmdldFJlc291cmNlQ2xhc3MoKSkpCi0JCQkJCQlyZXR1cm4gZTJEQWRhcHRlcjsKLQkJCQkJZWxzZQotCQkJCQkJY29udGludWU7Ci0JCQkJCi0JCQkJLy8gRmlyc3QgY2hlY2sgaWYgdGFyZ2V0cyBhcmUgcmVzb3VyY2VzCi0JCQkJaWYgKGUyREFkYXB0ZXIuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJCQkvKgotCQkJCQkgKiBOb3cgY2hlY2sgaWYgaXQncyB0aGUgcmlnaHQgb25lIChNdWx0aXBsZSByZXNvdXJjZXMKLQkJCQkJICogY291bGQgYmUgYXR0YWNoZWQpCi0JCQkJCSAqLwotCQkJCQlpZiAoZTJEQWRhcHRlci5nZXRUYXJnZXQoKSA9PSBnZXRSZXNvdXJjZSgpKSB7Ci0JCQkJCQlyZXR1cm4gZTJEQWRhcHRlcjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIENoZWNrIGlmIHRhcmdldHMgYXJlIEVPYmplY3RzIHdpdGggdGhlIHNhbWUgcmVzb3VyY2VzCi0JCQkJCVRyYW5zbGF0b3JSZXNvdXJjZSBteVRhcmdldCA9IGdldFJlc291cmNlKCk7Ci0JCQkJCUVPYmplY3QgYWRhcHRlclRhcmdldCA9IChFT2JqZWN0KSBlMkRBZGFwdGVyLmdldFRhcmdldCgpOwotCQkJCQkvKgotCQkJCQkgKiBOb3cgY2hlY2sgaWYgaXQncyB0aGUgcmlnaHQgb25lIChNdWx0aXBsZSByZXNvdXJjZXMgY291bGQKLQkJCQkJICogYmUgYXR0YWNoZWQpCi0JCQkJCSAqLwotCQkJCQlpZiAoYWRhcHRlclRhcmdldC5lUmVzb3VyY2UoKSA9PSBteVRhcmdldCB8fCBhZGFwdGVyVGFyZ2V0LmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBlMkRBZGFwdGVyOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCQotCX0KLQotCXByb3RlY3RlZCBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJaWYgKG1vZGVsTWFuYWdlciA9PSBudWxsKQotCQkJbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gaWQgdXNlZCB0byBrZXkgdGhlIFhNTCByZXNvdXJjZSBpbiB0aGUgWE1MIE1vZGVsTWFuYWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZGVsTWFuYWdlcklkKCkgewotCQlpZiAoeG1sTW9kZWxJZCA9PSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShnZXRSZXNvdXJjZSgpKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbElkID0gZ2V0TW9kZWxNYW5hZ2VyKCkuY2FsY3VsYXRlSWQoZmlsZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl4bWxNb2RlbElkID0gcmVzb3VyY2UuZ2V0VVJJKCkgKyBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4geG1sTW9kZWxJZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiByZXNvdXJjZSA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBET00gbW9kZWwgZm9yIHRoaXMgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIElET01Nb2RlbCBnZXRYTUxNb2RlbCgpIHsKLQkJcmV0dXJuIHhtbE1vZGVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WE1MTW9kZWxJZCgpIHsKLQkJcmV0dXJuIHhtbE1vZGVsSWQ7Ci0JfQkKLQkKLQlwcml2YXRlIElET01Nb2RlbCBpbml0aWFsaXplWE1MTW9kZWwoSUZpbGUgZmlsZSwgYm9vbGVhbiBmb3JXcml0ZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkKLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKGZpbGUgPT0gbnVsbCkgPyAibnVsbCIgOiBmaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCQlTdHJpbmcgaWQgPSBtYW5hZ2VyLmNhbGN1bGF0ZUlkKGZpbGUpOwkJCQotCQkJaWYgKGZvcldyaXRlKSB7Ci0JCQkJSURPTU1vZGVsIG1vZCA9IChJRE9NTW9kZWwpbWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChpZCk7Ci0JCQkJaWYgKG1vZCA9PSBudWxsKQotCQkJCQlzZXRYTUxNb2RlbCgoSURPTU1vZGVsKSBtYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChmaWxlKSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXNldFhNTE1vZGVsKG1vZCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSURPTU1vZGVsIG1vZCA9IChJRE9NTW9kZWwpbWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChpZCk7Ci0JCQkJaWYgKG1vZCA9PSBudWxsKQotCQkJCQlzZXRYTUxNb2RlbCgoSURPTU1vZGVsKSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlKSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXNldFhNTE1vZGVsKG1vZCk7Ci0JCQkJfQotCQkJfQotCQkJc2V0WE1MTW9kZWxJZChnZXRYTUxNb2RlbCgpLmdldElkKCkpOwotCQkJbmVlZHNUb0NyZWF0ZURPTSA9IGZhbHNlOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgaWQgPSBnZXRYTUxNb2RlbCgpLmdldElkKCk7Ci0JCXN5bmNSZWZlcmVuY2VDb3VudHMoaWQsIGZvcldyaXRlKTsKLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQlkb2N1bWVudCA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCXJldHVybiB4bWxNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0JhdGNoTW9kZSgpIHsKLQkJcmV0dXJuIGlzQmF0Y2hDaGFuZ2VzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0JCXJldHVybiAoZ2V0WE1MTW9kZWwoKSAhPSBudWxsICYmIGdldFhNTE1vZGVsKCkuaXNEaXJ0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJCi0JCWlmKCB4bWxNb2RlbCA9PSBudWxsKSB7IC8vcmVzb3VyY2UgY291bGQgYmUgaW4gcHJvY2VzcyBvZiBiZWluZyB1bmxvYWRlZCAtIGNoZWNrIHdpdGggbW9kZWwgbWFuYWdlcgotCQkJU3RyaW5nIGlkID0gZ2V0TW9kZWxNYW5hZ2VySWQoKTsKLQkJCXJldHVybiBnZXRNb2RlbE1hbmFnZXIoKS5pc1NoYXJlZChpZCk7Ci0JCX0KLQkJaWYgKGdldFJlc291cmNlU2V0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHhtbE1vZGVsLmlzU2hhcmVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWRGb3JXcml0ZSgpIHsKLQkJaWYgKGdldFJlc291cmNlU2V0KCkgPT0gbnVsbCB8fCB4bWxNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4geG1sTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERvY3VtZW50KElucHV0U3RyZWFtIGluLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKG51bGwgIT0gaW4pIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNob3VsZCBub3QgdXNlIGFuIElucHV0U3RyZWFtIGZvciBsb2FkaW5nIik7fSAvLyROT04tTkxTLTEkCi0JCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlc291cmNlKTsKLQkJaW5pdGlhbGl6ZVhNTE1vZGVsKGZpbGUsIChyZXNvdXJjZS5nZXRXcml0ZUNvdW50KCkgIT0gMCkpOwotCQljYWNoZVN5bmNocm9uaXphdGlvblN0YW1wKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWFuYWdlc0RPTUFkYXB0ZXJzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpICE9IG51bGwpCi0JCQlhYm91dFRvQ2hhbmdlTm9kZSA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXByaXZhdGUgdm9pZCBtb2RlbEFjY2Vzc0ZvcldyaXRlKCkgewotCQlTdHJpbmcgaWQgPSBnZXRNb2RlbE1hbmFnZXJJZCgpOwotCQlnZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChpZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKGlzQmF0Y2hDaGFuZ2VzKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJaWYgKHJldmVydGluZyAmJiBhYm91dFRvQ2hhbmdlTm9kZSAhPSBudWxsICYmIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpICE9IG51bGwKLQkJCQkJJiYgbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBhYm91dFRvQ2hhbmdlTm9kZSkgewotCQkJCVN0cmluZyBpZCA9IGdldE1vZGVsTWFuYWdlcklkKCk7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCB0ZW1wTW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXRlbXBNb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGlkKTsKLQkJCQkJeG1sTW9kZWxSZXZlcnRlZCA9IHRydWU7Ci0JCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmICh0ZW1wTW9kZWwgIT0gbnVsbCAmJiAodGVtcE1vZGVsLmdldFJlZmVyZW5jZUNvdW50Rm9yRWRpdCgpID4gMCkpIHsKLQkJCQkJCXRlbXBNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQkJfQotCQkJCQlyZXZlcnRpbmcgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlhYm91dFRvQ2hhbmdlTm9kZSA9IG51bGw7Ci0JCX0KLQl9IAotCQotCXB1YmxpYyB2b2lkIG1vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgYm9vbGVhbiBpc0RpcnR5KSB7Ci0JCWlmICghaXNEaXJ0eSAmJiByZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsgLy8gVGhlIFhNTE1vZGVsIHdhcyBzYXZlZAotCQkJcmVzb3VyY2Uuc2V0TW9kaWZpZWQoZmFsc2UpOwotCQkJbG9uZyBzdGFtcCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChyZXNvdXJjZSk7Ci0JCQlXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5zZXRTeW5ocm9uaXphdGlvblN0YW1wKHJlc291cmNlLCBzdGFtcCk7Ci0JCQlJUHJvamVjdCBwcm9qID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0UHJvamVjdChyZXNvdXJjZSk7Ci0JCQlSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgKChQcm9qZWN0UmVzb3VyY2VTZXQpIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZVNldChwcm9qKSkuZ2V0U3luY2hyb25pemVyKCk7Ci0JCQlJRmlsZSBhRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQkJc3luY2hyb25pemVyLnByZVNhdmUoYUZpbGUsIHJlc291cmNlKTsKLQkJfQotCQlpZiAoaXNEaXJ0eSkKLQkJCXJlc291cmNlLnNldE1vZGlmaWVkKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQkvLyBEbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGp1c3QgcHJpb3IgdG8gYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBSZXNvdXJjZVNldC4KLQkgKiBFbnN1cmUgdGhhdCBhbGwgcmVmZXJlbmNlIGNvdW50cyB0byB0aGUgWE1MTW9kZWwgYXJlIHJlbW92ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcHJlRGVsZXRlKCkgewotCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkKLQkJCWRlcmVnaXN0ZXJGcm9tWE1MTW9kZWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmVVbmxvYWQoKSB7Ci0JCWRlcmVnaXN0ZXJGcm9tWE1MTW9kZWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9jZXNzUG9zdE1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfUkVWRVJUKQotCQkJcmV2ZXJ0aW5nID0gZmFsc2U7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9jZXNzUHJlTW9kZWxFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRUeXBlKCkgPT0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9SRVZFUlQpCi0JCQlyZXZlcnRpbmcgPSB0cnVlOwotCQkJCi0JCWlmICghaXNTYXZpbmcpIHsKLQkJCWlmIChldmVudC5nZXRUeXBlKCkgPT0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCkgewotCQkJCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSAoKFByb2plY3RSZXNvdXJjZVNldCkgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSkuZ2V0U3luY2hyb25pemVyKCk7Ci0JCQkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlc291cmNlKTsKLQkJCQlzeW5jaHJvbml6ZXIucHJlU2F2ZShhRmlsZSwgcmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCQotCX0KLQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJBc01vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoKSB7Ci0JCXRoaXMueG1sTW9kZWwuYWRkTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzcvMjAwMSAxMDo0OTo1MwotCSAqIEFNKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQXNNb2RlbFN0YXRlTGlzdGVuZXIoKSB7Ci0JCXRoaXMueG1sTW9kZWwuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVdyaXRlKCkgewotCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURPTUFkYXB0ZXIoTm9kZSBhTm9kZSwgRU1GMkRPTUFkYXB0ZXIgYW5BZGFwdGVyKSB7Ci0JCSgoSURPTU5vZGUpIGFOb2RlKS5yZW1vdmVBZGFwdGVyKChFTUYyRE9NU1NFQWRhcHRlcikgYW5BZGFwdGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi54bWwuRU1GMkRPTVJlbmRlcmVyI3JlcGxhY2VEb2N1bWVudFR5cGUoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZURvY3VtZW50VHlwZShTdHJpbmcgZG9jVHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlEb2N1bWVudFR5cGVJbXBsIGRvY1R5cGUgPSAoRG9jdW1lbnRUeXBlSW1wbCkgZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotCQlpZiAoZG9jVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAocHVibGljSWQgPT0gbnVsbCAmJiBzeXN0ZW1JZCA9PSBudWxsKQotCQkJZG9jdW1lbnQucmVtb3ZlQ2hpbGQoZG9jVHlwZSk7Ci0JCWVsc2UgewotCQkJZG9jVHlwZS5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCQlkb2NUeXBlLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBiYXRjaE1vZGVTdGFydCBhbmQgQmF0Y2hNb2RlRW5kIGluc3RlYWQgZXZlbiBpZiB5b3UgZG8KLQkgKiAgICAgICAgICAgICBub3QgdXNlIGJhdGNoTW9kZWxTdGFydC9FbmQsIHlvdSBzdGlsbCBuZWVkIHRvIHVzZSB0aGUKLQkgKiAgICAgICAgICAgICB0cnkvZmluYWxseSBwYXR0ZXJuIGRvY3VtZW50ZWQgdGhlcmUuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzZXRCYXRjaE1vZGUoYm9vbGVhbiBpc0JhdGNoKSB7Ci0KLQkJLy8gVGhpcyBpcyBzb21lIGV4dHJhIHByb2Nlc3NpbmcgZm9yIGNsaWVudHMgdG8ga25vdyB0aGV5IG1heSBiZSB1c2luZwotCQkvLyBpbmNvcnJlY3RseQotCQlpZiAoaXNCYXRjaCkgewotCQkJaWYgKGlzQmF0Y2hDaGFuZ2VzKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgInNldEJhdGNoIHdhcyBzZXQgdG8gdHJ1ZSB3aGVuIGl0IHdhcyBhbHJlYWR5IHRydWUuIFRoaXMgY2FuIGJlIGFuIGluZGljYXRpb24gb2YgaW52YWxpZCBjYWxsaW5nIG9yZGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0KLQkJaWYgKGlzQmF0Y2gpIHsKLQkJCWJhdGNoTW9kZVN0YXJ0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQliYXRjaE1vZGVFbmQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRSb290Tm9kZUFkYXB0ZXJOb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gYikgewotCQlFT2JqZWN0IHJvb3QgPSByZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7Ci0JCWlmIChyb290ICE9IG51bGwpIHsKLQkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIocm9vdCwgRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGIpOwotCQkJCWlmIChiKQotCQkJCQlhZGFwdGVyLnVwZGF0ZURPTSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBET00gbW9kZWwgZm9yIHRoaXMgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0WE1MTW9kZWwoSURPTU1vZGVsIHhtbE1vZGVsKSB7Ci0JCWRlUmVnaXN0ZXJBc01vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQlkZVJlZ2lzdGVyQXNNb2RlbExpZmVjeWNsZUxpc3RlbmVyKCk7Ci0JCXRoaXMueG1sTW9kZWwgPSB4bWxNb2RlbDsKLQkJcmVnaXN0ZXJBc01vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQlyZWdpc3RlckFzTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFhNTE1vZGVsSWQoU3RyaW5nIGlkKSB7Ci0JCXhtbE1vZGVsSWQgPSBpZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1JlZmVyZW5jZUNvdW50cyhTdHJpbmcgaWQsIGJvb2xlYW4gZm9yV3JpdGUpIHsKLQkJaW50IGVkaXRJbmRleCA9IDAsIHJlYWRJbmRleCA9IDA7Ci0JCWlmIChmb3JXcml0ZSkKLQkJCWVkaXRJbmRleCsrOwotCQllbHNlCi0JCQlyZWFkSW5kZXgrKzsKLQkJaW50IHdyaXRlQ291bnQgPSByZXNvdXJjZS5nZXRXcml0ZUNvdW50KCk7Ci0JCWludCByZWFkQ291bnQgPSByZXNvdXJjZS5nZXRSZWFkQ291bnQoKTsKLQkJZm9yIChpbnQgaSA9IHdyaXRlQ291bnQ7IGkgPiBlZGl0SW5kZXg7IGktLSkKLQkJCW1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChpZCk7Ci0JCWZvciAoaW50IGkgPSByZWFkQ291bnQ7IGkgPiByZWFkSW5kZXg7IGktLSkKLQkJCW1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChpZCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlU3RyZWFtc0ZvcklPKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gd2FzUmV2ZXJ0ZWQoKSB7Ci0JCXJldHVybiB4bWxNb2RlbFJldmVydGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlKFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSkgewotCQlzdXBlci5zZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJcmVzb3VyY2VDbGFzcyA9IHJlc291cmNlLmdldENsYXNzKCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzUmV2ZXJ0aW5nKCkgewotCQlyZXR1cm4gdGhpcy5yZXZlcnRpbmc7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VSZW5kZXJlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VSZW5kZXJlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3OTEyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbWYyeG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIEVNRjJET01TU0VSZW5kZXJlckZhY3RvcnkgZXh0ZW5kcyBSZW5kZXJlckZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEVNRjJET01TU0VSZW5kZXJlckZhY3RvcnkoKTsKLQotCXB1YmxpYyBFTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5KCkgewotCQkvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JfQotCi0KLQlwdWJsaWMgUmVuZGVyZXIgY3JlYXRlUmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgRU1GMkRPTVNTRVJlbmRlcmVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL0NvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxZGNkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yICB7Ci0KLQlwcm90ZWN0ZWQgSGFzaE1hcCBkZWNsYXJhdGlvbnM7Ci0KLQlwcm90ZWN0ZWQgSGFzaE1hcCByZWZlcmVuY2VzOwotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIG5hbWVzcGFjZXM7Ci0KLQlwdWJsaWMgQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFhNTFNlYXJjaFBhdHRlcm4gZ2V0RGVjbGFyYXRpb25QYXR0ZXJuKFF1YWxpZmllZE5hbWUgY29tcG9uZW50TmFtZSkgewotCQlyZXR1cm4gKFhNTFNlYXJjaFBhdHRlcm4pIGdldERlY2xhcmF0aW9ucygpLmdldChjb21wb25lbnROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldERlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGRlY2xhcmF0aW9ucyA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplRGVjbGFyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGRlY2xhcmF0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldFJlZmVyZW5jZXMoKSB7Ci0JCWlmIChyZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWluaXRpYWxpemVSZWZlcmVuY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIFhNTFNlYXJjaFBhdHRlcm5bXSBnZXRSZWZlcmVuY2VzUGF0dGVybnMoUXVhbGlmaWVkTmFtZSBjb21wb25lbnROYW1lKSB7Ci0JCUxpc3QgcmVmZXJlbmNlcyA9IChMaXN0KSBnZXRSZWZlcmVuY2VzKCkuZ2V0KGNvbXBvbmVudE5hbWUpOwotCQlpZiAocmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKFhNTFNlYXJjaFBhdHRlcm5bXSkgcmVmZXJlbmNlcwotCQkJCQkudG9BcnJheShuZXcgWE1MU2VhcmNoUGF0dGVybltyZWZlcmVuY2VzLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBuZXcgWE1MU2VhcmNoUGF0dGVyblswXTsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoUXVhbGlmaWVkTmFtZSBjb21wb25lbnROYW1lKXsKLQkJcmV0dXJuIGdldFJlZmVyZW5jZXNQYXR0ZXJucyhjb21wb25lbnROYW1lKS5sZW5ndGggPiAwIHx8Ci0JCQlnZXREZWNsYXJhdGlvblBhdHRlcm4oY29tcG9uZW50TmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkTmFtZXNwYWNlcygpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZURlY2xhcmF0aW9ucygpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZVJlZmVyZW5jZXMoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVTdXBwb3J0ZWROYW1lc3BhY2VzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvVGFyZ2V0TmFtZXNwYWNlUmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1RhcmdldE5hbWVzcGFjZVJlZmVyZW5jZVBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyMWI3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvVGFyZ2V0TmFtZXNwYWNlUmVmZXJlbmNlUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLQotcHVibGljIGNsYXNzIFRhcmdldE5hbWVzcGFjZVJlZmVyZW5jZVBhdHRlcm4gZXh0ZW5kcyBTZWFyY2hQYXR0ZXJuIHsKLQkKLQlTdHJpbmcgbmFtZXNwYWNlVVJJOwotCQotCXB1YmxpYyBUYXJnZXROYW1lc3BhY2VSZWZlcmVuY2VQYXR0ZXJuKGludCBtYXRjaFJ1bGUsIFN0cmluZyBuYW1lc3BhY2V1cmkpIHsKLQkJc3VwZXIobWF0Y2hSdWxlKTsKLQkJbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNldXJpOwotCX0KLQkKLQlwdWJsaWMgVGFyZ2V0TmFtZXNwYWNlUmVmZXJlbmNlUGF0dGVybihTdHJpbmcgbmFtZXNwYWNldXJpKSB7Ci0JCXN1cGVyKCk7Ci0JCW5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZXVyaTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmNDc1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotCi1wdWJsaWMgY2xhc3MgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuIGV4dGVuZHMgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybiB7Ci0KLQlwdWJsaWMgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSwgaW50IG1hdGNoUnVsZSkgewotCQlzdXBlcihudWxsLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSwgbWF0Y2hSdWxlKTsKLQkJCi0JfQotCi0JcHVibGljIFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpIHsKLQkJc3VwZXIoZmlsZSwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSkgewotCQlzdXBlcihudWxsLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0JfQotCi0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY4YThhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLQotcHVibGljIGNsYXNzIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4gZXh0ZW5kcyBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuewotCi0JcHVibGljIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4oSUZpbGUgZmlsZSwgUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZVFOYW1lLCBpbnQgbWF0Y2hSdWxlKSB7Ci0JCXN1cGVyKGZpbGUsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lLCBtYXRjaFJ1bGUpOwotCQkKLQl9Ci0KLQlwdWJsaWMgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpIHsKLQkJc3VwZXIoZmlsZSwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUpOwotCQkKLQl9Ci0JCi0JcHVibGljIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4oUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZVFOYW1lKSB7Ci0JCXN1cGVyKG51bGwsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lKTsKLQkJCi0JfQotCQotCQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZjMwNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLkNvbXBvbmVudFNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLS8qKgotICogWE1MIGNvbXBvbmVudCBzZWFyY2ggcGF0dGVybiBpcyBhIGNvbXBvc2l0ZSBwYXR0ZXJuIHRoYXQgY29tYmluZXMgWE1MIGVsZW1lbnQgcGF0dGVybi4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuIGV4dGVuZHMgQ29tcG9uZW50U2VhcmNoUGF0dGVybiB7Ci0JCi0JLyoqCi0JICogQ29udGFpbmluZyBlbGVtZW50IHBhdHRlcm5zCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlYTUxTZWFyY2hQYXR0ZXJuW10gY2hpbGRyZW4gPSBuZXcgWE1MU2VhcmNoUGF0dGVyblswXTsKLQkKLQkvKioKLQkgKiBBIG1hcCBvZiBYTUxTZWFyY2hQYXR0ZXJuW10gYnkge0BsaW5rIFNlYXJjaFBhcnRpY2lwYW50IHNlYXJjaCBwYXJ0aWNpcGFudH0uCi0JICovCi0JcHJvdGVjdGVkIE1hcCBjaGlsZFBhdHRlcm5zQnlQYXJ0aWNpcGFudCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHVibGljIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4oSUZpbGUgZmlsZSwgUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZVFOYW1lLCBpbnQgbWF0Y2hSdWxlKSB7Ci0JCXN1cGVyKGZpbGUsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lLCBtYXRjaFJ1bGUpOwotCQkKLQl9Ci0KLQotCXB1YmxpYyBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSkgewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0JCQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldENoaWxkcmVuKFNlYXJjaFBhcnRpY2lwYW50KX0gaW5zdGVhZC4KLQkgKi8KLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybltdIGdldENoaWxkcmVuKCl7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjYWRkQ2hpbGRyZW4oU2VhcmNoUGFydGljaXBhbnQsIFhNTFNlYXJjaFBhdHRlcm5bXSl9IGluc3RlYWQuCi0gICAgICovCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oWE1MU2VhcmNoUGF0dGVybltdIHBhdHRlcm5zKXsKLQkJY2hpbGRyZW4gPSBwYXR0ZXJuczsKLQkJCi0JfQotCQotCS8qKgotCSAqIFByb3ZpZGVzIHRoZSBjaGlsZCBwYXR0ZXJucyBjb250cmlidXRlZCBieSB0aGUgZ2l2ZW4gc2VhcmNoIHBhcnRpY2lwYW50LiAKLQkgKiBAcGFyYW0gc2VhcmNoUGFydGljaXBhbnQgdGhlIHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2ggcGFydGljaXBhbnR9IHRoYXQgY29udHJpYnV0ZWQgdGhlIHBhdHRlcm5zLgotICAgICAqIEBzZWUgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybiNhZGRDaGlsZHJlbihTZWFyY2hQYXJ0aWNpcGFudCwgWE1MU2VhcmNoUGF0dGVybltdKSBhZGRDaGlsZHJlbgotCSAqIEByZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUge0BsaW5rIFhNTFNlYXJjaFBhdHRlcm4gcGF0dGVybnN9IGNvbnRyaWJ1dGVkIGJ5IHRoZSB7QGxpbmsgU2VhcmNoUGFydGljaXBhbnQgc2VhcmNoIHBhcnRpY2lwYW50fS4KLQkgKi8KLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybltdIGdldENoaWxkcmVuKFNlYXJjaFBhcnRpY2lwYW50IHNlYXJjaFBhcnRpY2lwYW50KXsKLQkgIFhNTFNlYXJjaFBhdHRlcm5bXSBjaGlsZFBhdHRlcm5zID0gZ2V0Q2hpbGRyZW4oKTsKLQkgIGlmIChzZWFyY2hQYXJ0aWNpcGFudCAhPSBudWxsKXsKLQkgICAgY2hpbGRQYXR0ZXJucyA9IChYTUxTZWFyY2hQYXR0ZXJuW10pY2hpbGRQYXR0ZXJuc0J5UGFydGljaXBhbnQuZ2V0KHNlYXJjaFBhcnRpY2lwYW50KTsKLQkgICAgaWYgKGNoaWxkUGF0dGVybnMgPT0gbnVsbCl7Ci0JICAgICAgY2hpbGRQYXR0ZXJucyA9IGdldENoaWxkcmVuKCk7Ci0JICAgIH0KLQkgIH0KLQkgIHJldHVybiBjaGlsZFBhdHRlcm5zOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjaGlsZCBwYXR0ZXJucyBjb250cmlidXRlZCBieSB0aGUgZ2l2ZW4gc2VhcmNoIHBhcnRpY2lwYW50LgotCSAqIEBwYXJhbSBzZWFyY2hQYXJ0aWNpcGFudCB0aGUge0BsaW5rIFNlYXJjaFBhcnRpY2lwYW50IHNlYXJjaCBwYXJ0aWNpcGFudH0gdGhhdCBpcyBjb250cmlidXRpbmcgdGhlIGNoaWxkIHNlYXJjaCBwYXR0ZXJucy4KLQkgKiBAcGFyYW0gY2hpbGRQYXR0ZXJucyB0aGUgY2hpbGQgcGF0dGVybnMgY29udHJpYnV0ZWQgYnkgdGhlIHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2ggcGFydGljaXBhbnR9LgotCSAqIEBzZWUgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybiNnZXRDaGlsZHJlbihTZWFyY2hQYXJ0aWNpcGFudCkgZ2V0Q2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZHJlbihTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2hQYXJ0aWNpcGFudCwgWE1MU2VhcmNoUGF0dGVybltdIGNoaWxkUGF0dGVybnMpewotCSAgaWYgKHNlYXJjaFBhcnRpY2lwYW50ICE9IG51bGwgJiYgY2hpbGRQYXR0ZXJucyAhPSBudWxsKSB7Ci0JICAgIGNoaWxkUGF0dGVybnNCeVBhcnRpY2lwYW50LnB1dChzZWFyY2hQYXJ0aWNpcGFudCwgY2hpbGRQYXR0ZXJucyk7Ci0JICB9Ci0JICBlbHNlIHsKLQkgICAgY2hpbGRyZW4gPSBjaGlsZFBhdHRlcm5zOwotCSAgfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTFNlYXJjaFBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MDlmNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTFNlYXJjaFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuRmlsZVJlZmVyZW5jZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5TZWFyY2hEb2N1bWVudFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uQ29tcG9uZW50U2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uRmlsZVJlZmVyZW5jZVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5Db250ZW50VHlwZVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guaW1wbC5JWE1MU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guaW1wbC5YTUxTZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nLlBhdHRlcm5NYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmcuWE1MU2VhcmNoUGF0dGVybk1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5xdWlja3NjYW4uWE1MUXVpY2tTY2FuOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MU2VhcmNoUGFydGljaXBhbnQgZXh0ZW5kcyBTZWFyY2hQYXJ0aWNpcGFudCB7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnUGVyZiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoL3BlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIFhNTFNlYXJjaFBhcnRpY2lwYW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCQotCS8qCi0gcHVibGljICBib29sZWFuIGluaXRpYWxpemUoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTdHJpbmdbXSBjb250ZW50VHlwZXMpewotCQkKLQkgICAgc3VwZXIuaW5pdGlhbGl6ZShwYXR0ZXJuLCBjb250ZW50VHlwZXMpOwotCQl0aGlzLnN1cHBvcnRlZENvbnRlbnRUeXBlcyA9IGNvbnRlbnRUeXBlczsKLQkJCi0JCWlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ki8KLQotCQotCi0JcHVibGljIFNlYXJjaERvY3VtZW50IGNyZWF0ZVNlYXJjaERvY3VtZW50KFN0cmluZyBkb2N1bWVudFBhdGgpIHsKLQotCQlyZXR1cm4gbmV3IFhNTFNlYXJjaERvY3VtZW50KGRvY3VtZW50UGF0aCwgdGhpcyk7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIlhNTCBzZWFyY2ggcGFydGljaXBhbnQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQotCXByaXZhdGUgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQsCi0JCQlTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBNYXAgc2VhcmNoT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLSAgICAgICAgLy8gVE9ETy4uLiB1dGlsaXplIHNlYXJjaCBvcHRpb25zICh0aGF0IHNob3VsZCBnZXQgcGFzc2VkIGRvd24gdmlhIHRoZSBTZWFyY2hFbmdpbmUpCi0gICAgICAgIC8vIHRvIHNwZWNpZnkgaWYgYWNjdXJhdGUgc291cmNlIGNvb3JkaW5hdGVzIGFyZSByZXEnZCBpZiBub3QsIHNpbXBseSB1c2UgdGhlIFNBWCByZXN1bHRzCi0gICAgICAgIC8vCi0gICAgICAgIGlmIChwYXR0ZXJuLmdldE1hdGNoUnVsZSgpID09IFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIKQotICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgIElGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChkb2N1bWVudC5nZXRQYXRoKCkpKTsKLSAgICAgICAgICAvLyBUT0RPLi4gZG9uJ3QgYXNzdW1lIHRoZSBjYXRlZ29yeSBpcyBDT01QT05FTlRfREVDTC4uLiBoYW5kbGUgYW55IGFyYml0YXJ0eSBjYXRlZ29yeQotICAgICAgICAgIEVudHJ5W10gZW50cmllcyA9IGRvY3VtZW50LmdldEVudHJpZXMoSVhNTFNlYXJjaENvbnN0YW50cy5DT01QT05FTlRfREVDTCwgbnVsbCwgMCk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8uLiBkb24ndCBhc3N1bWUgdGhpcyBpcyBqdXN0IGEgY29tcG9uZW50IGRlY2xhcmF0aW9uIGVudHJ5ICAgICAgICAgICAgCi0gICAgICAgICAgICBDb21wb25lbnREZWNsYXJhdGlvbkVudHJ5IGVudHJ5ID0gKENvbXBvbmVudERlY2xhcmF0aW9uRW50cnkpZW50cmllc1tpXTsKLSAgICAgICAgICAgIFNlYXJjaE1hdGNoIHNlYXJjaE1hdGNoID0gbmV3IFNlYXJjaE1hdGNoKG51bGwsIDAsIDAsIGZpbGUpOwotICAgICAgICAgICAgc2VhcmNoTWF0Y2gubWFwLnB1dCgibmFtZSIsIGVudHJ5LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNlYXJjaE1hdGNoLm1hcC5wdXQoIm1ldGFOYW1lIiwgZW50cnkuZ2V0TWV0YU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXF1ZXN0b3IuYWNjZXB0U2VhcmNoTWF0Y2goc2VhcmNoTWF0Y2gpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgeyAgaWYgKGRvY3VtZW50LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCQlJRE9NRWxlbWVudCBjb250ZXh0Tm9kZSA9IChJRE9NRWxlbWVudCkgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKQotCQkJCQkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQlET01WaXNpdG9yIHZpc2l0b3IgPSBuZXcgRE9NVmlzaXRvcihkb2N1bWVudC5nZXRQYXRoKCksIHBhdHRlcm4sCi0JCQkJCXJlcXVlc3Rvcik7Ci0JCQl2aXNpdG9yLnZpc2l0KGNvbnRleHROb2RlKTsKLQkJfQotICAgICAgICB9Ci0JfQotCQotCXByaXZhdGUgUGF0dGVybk1hdGNoZXIgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoUGF0dGVybk1hdGNoZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXJUeXBlKSAmJgotCQkJCShhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBYTUxTZWFyY2hQYXR0ZXJuIHx8Ci0JCQkJYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybikgKSB7Ci0JCQlyZXR1cm4gbmV3IFhNTFNlYXJjaFBhdHRlcm5NYXRjaGVyKHRoaXMpOwotCQl9IAotCQlyZXR1cm4gbnVsbDsgCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBET01WaXNpdG9yIHsKLQotCQlTdHJpbmcgcGF0aDsKLQkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuOwotCQlTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yOwotCQlQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyOwotCi0JCQotCQlwcm90ZWN0ZWQgRE9NVmlzaXRvcihTdHJpbmcgcGF0aCwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLAotCQkJCVNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnBhdGggPSBwYXRoOwotCQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQkJCQotCQkJbWF0Y2hlciA9IChQYXR0ZXJuTWF0Y2hlcilwYXR0ZXJuLmdldEFkYXB0ZXIoUGF0dGVybk1hdGNoZXIuY2xhc3MpOwotCQkJaWYobWF0Y2hlciA9PSBudWxsKXsKLQkJCQltYXRjaGVyID0gZ2V0QWRhcHRlcihwYXR0ZXJuLCBQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCQl9Ci0JCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdChOb2RlIG5vZGUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQltYXRjaCgoRWxlbWVudClub2RlKTsKLQkJCQlOb2RlTGlzdCBub2RlTGlzdCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlOb2RlIGFOb2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLQkJCQkJdmlzaXQoYU5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBtYXRjaChFbGVtZW50IG5vZGUpIHsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbigKLQkJCQkJbmV3IFBhdGgocGF0aCkpOwotCQkJaWYobWF0Y2hlciAhPSBudWxsKXsKLQkJCQltYXRjaGVyLmxvY2F0ZU1hdGNoZXMocGF0dGVybiwgZmlsZSwgbm9kZSwgcmVxdWVzdG9yKTsKLQkJCX0KLQotCQkJCi0JCX0KLQotCX0KLQotCXB1YmxpYyBTZWFyY2hTY29wZSBzZWxlY3REb2N1bWVudExvY2F0aW9ucyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaFNjb3BlIHNjb3BlLCBNYXAgc2VhcmNoT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8qCi0JCSAqIGdhdGUgIzE6IHJlZHVjZSB0aGUgc2NvcGUgdG8gdGhlIGZpbGVzIHdpdGggdGhlIGNvbnRlbnQgdHlwZSB0aGF0Ci0JCSAqIGNvdWxkIGJlIHNlYXJjaGVkIHVzaW5nIHRoaXMgcGFydGljaXBhbnQKLQkJICovIAotCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBnZXRTdXBwb3J0ZWRDb250ZW50VHlwZXMoKTsJCi0JCWlmKGNvbnRlbnRUeXBlcyAhPSBudWxsICYmIGNvbnRlbnRUeXBlcy5sZW5ndGggPiAwKXsKLQkJCXNjb3BlID0gbmV3IENvbnRlbnRUeXBlU2VhcmNoU2NvcGUoc2NvcGUsIGNvbnRlbnRUeXBlcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnNlbGVjdERvY3VtZW50TG9jYXRpb25zKHBhdHRlcm4sIHNjb3BlLCBzZWFyY2hPcHRpb25zLCBtb25pdG9yKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IENvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yIGdldFNlYXJjaENvbnRyaWJ1dG9yKCk7Ci0KLQotCXB1YmxpYyB2b2lkIGJlZ2luU2VhcmNoaW5nKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpIHsKLQkJCi0JCXN1cGVyLmJlZ2luU2VhcmNoaW5nKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpOwotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKXsKLQkJCVhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybiBjb21wb25lbnRQYXR0ZXJuID0gKFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybilwYXR0ZXJuOwotCQkJWE1MU2VhcmNoUGF0dGVybiBjaGlsZFBhdHRlcm4gPSBnZXRTZWFyY2hDb250cmlidXRvcigpLmdldERlY2xhcmF0aW9uUGF0dGVybihjb21wb25lbnRQYXR0ZXJuLmdldE1ldGFOYW1lKCkpOwotCQkJaWYoY2hpbGRQYXR0ZXJuICE9IG51bGwpewotCQkJCQljaGlsZFBhdHRlcm4uc2V0U2VhcmNoTmFtZShjb21wb25lbnRQYXR0ZXJuLmdldE5hbWUoKS5nZXRMb2NhbE5hbWUoKSk7Ci0JCQkJCWNoaWxkUGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UoY29tcG9uZW50UGF0dGVybi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCSAgICAgCQkJY29tcG9uZW50UGF0dGVybi5hZGRDaGlsZHJlbih0aGlzLCBuZXcgWE1MU2VhcmNoUGF0dGVybltde2NoaWxkUGF0dGVybn0pOwotCQkJfQotCQkJCi0JCX0KLQkJZWxzZSBpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybil7Ci0JCQlYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuIGNvbXBvbmVudFBhdHRlcm4gPSAoWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybilwYXR0ZXJuOwotCQkJWE1MU2VhcmNoUGF0dGVybltdIGNoaWxkUGF0dGVybnMgPSBnZXRTZWFyY2hDb250cmlidXRvcigpLmdldFJlZmVyZW5jZXNQYXR0ZXJucyhjb21wb25lbnRQYXR0ZXJuLmdldE1ldGFOYW1lKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZFBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJWE1MU2VhcmNoUGF0dGVybiBjaGlsZFBhdHRlcm4gPSBjaGlsZFBhdHRlcm5zW2ldOwotCQkJCWNoaWxkUGF0dGVybi5zZXRTZWFyY2hOYW1lKGNvbXBvbmVudFBhdHRlcm4uZ2V0TmFtZSgpLmdldExvY2FsTmFtZSgpKTsKLQkJCQljaGlsZFBhdHRlcm4uc2V0U2VhcmNoTmFtZXNwYWNlKGNvbXBvbmVudFBhdHRlcm4uZ2V0TmFtZSgpLmdldE5hbWVzcGFjZSgpKTsJCQkJCi0JCQl9Ci0JCQljb21wb25lbnRQYXR0ZXJuLmFkZENoaWxkcmVuKHRoaXMsIGNoaWxkUGF0dGVybnMpOwotCQkJCi0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogVGhlIGludGVuZCBvZiB0aGlzIG1ldGhvZCBpcyB0byBsaW1pdCB0aGUgc2VhcmNoIHRvIHRoZSBmaWxlcyB0aGF0IGhhdmUgY29udGVudCAKLQkgKiB3aGljaCBjYW4gYmUgc2VhcmNoZWQgZm9yIHRoZSBnaXZlbiBwYXR0ZXJuLiBJdCBpcyBjYWxsZWQgZnJvbSAKLQkgKiB7QGxpbmsgI3NlbGVjdERvY3VtZW50TG9jYXRpb25zKFNlYXJjaFBhdHRlcm4sIFNlYXJjaFNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yKX0KLQkgKiAKLQkgKiBAcGFyYW0gcGF0dGVybiB0aGUgc2VhcmNoIHBhdHRlcm4gdGhhdCBpcyBzZWFyY2hlZCBmb3IKLQkgKiBAcmV0dXJuIGNvbnRlbnQgdHlwZSdzIHVuaXF1ZSBpZGVudGlmaWVycyB0aGF0IGNvdWxkIGJlIHNlYXJjaGVkIGZvciB0aGUgZ2l2ZW4gcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ29udGVudFR5cGVzKCk7Ci0KLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZVNlYXJjaERvY3VtZW50KFNlYXJjaERvY3VtZW50IGRvY3VtZW50LCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pCi0JewotCQlQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyID0gKFBhdHRlcm5NYXRjaGVyKXBhdHRlcm4uZ2V0QWRhcHRlcihQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCWlmKG1hdGNoZXIgPT0gbnVsbCl7Ci0JCQltYXRjaGVyID0gZ2V0QWRhcHRlcihwYXR0ZXJuLCBQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCX0KLQkJWE1MUXVpY2tTY2FuLnBvcHVsYXRlU2VhcmNoRG9jdW1lbnQoZG9jdW1lbnQsIG1hdGNoZXIsIHBhdHRlcm4pOwkJCi0JfQotCi0JcHVibGljIHZvaWQgbG9jYXRlTWF0Y2hlcyhTZWFyY2hEb2N1bWVudFNldCBkb2N1bWVudFNldCwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkKLQkJLy8gVE9ETzogdXNlIHRoZSBmaWxlIHJlZmVyZW5jZSBlbnRyaWVzIGluIHRoZSBkb2N1bWVudHMgdG8gcmVkdWNlIHRoZSBzY29wZSB0byB0aGUgcmVmZXJlbmNlZCBmaWxlcyBvbmx5Ci0JCS8vIFNlYXJjaERvY3VtZW50W10gZG9jdW1lbnRzID0gZG9jdW1lbnRTZXQuZ2V0U2VhcmNoRG9jdW1lbnRzKGlkKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBzZWFyY2ggcGF0dGVybiBpcyBxdWFsaWZpZWQgYnkgYSBmaWxlIGxvY2F0aW9uCi0gICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB3ZSBjYW4gdXNlIGZpbGUgc2NvcGluZyBydWxlcyB0byBwcnVuZSB0aGUgbWF0Y2hlcwotICAgICAgICBJRmlsZSB0YXJnZXRGaWxlID0gbnVsbDsKLSAgICAgICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBDb21wb25lbnRTZWFyY2hQYXR0ZXJuKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U2VhcmNoUGF0dGVybiBjb21wb25lbnRTZWFyY2hQYXR0ZXJuID0gKENvbXBvbmVudFNlYXJjaFBhdHRlcm4pcGF0dGVybjsKLSAgICAgICAgICB0YXJnZXRGaWxlID0gY29tcG9uZW50U2VhcmNoUGF0dGVybi5nZXRGaWxlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0JCQotICAgICAgICAKLQkJLy8gaGVyZSB3ZSBzaG91bGQgaGF2ZSBpbiBzY29wZSBvbmx5IHJlZmVyZW5jZWQgZmlsZXMKLQkJSUZpbGVbXSBmaWxlcyA9IHNjb3BlLmVuY2xvc2luZ0ZpbGVzKCk7ICAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKLQkJewotCQkJSUZpbGUgZmlsZSA9IGZpbGVzW2ldOwotCQkJU3RyaW5nIHBhdGggPSBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCVNlYXJjaERvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRTZXQuZ2V0U2VhcmNoRG9jdW1lbnQocGF0aCwgaWQpOyAKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJeyAgICAgICAgICAgICAgCi0JCQlFbnRyeVtdIGVudHJpZXMgPSBkb2N1bWVudC5nZXRFbnRyaWVzKGdldFNlYXJjaEVudHJ5Q2F0ZWdvcnkocGF0dGVybiksIG51bGwsIDApOyAgICAgICAgICAgCi0JCQlpZiAoKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCA+IDApIHx8IChzZWFyY2hPcHRpb25zICE9IG51bGwgJiYgc2VhcmNoT3B0aW9ucy5nZXQoInNlYXJjaERpcnR5Q29udGVudCIpICE9IG51bGwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL2ZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgIC8vICBFbnRyeSBlbnRyeSA9IGVudHJpZXNbal07Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImVudHJ5ICIgKyBlbnRyeS5nZXRDYXRlZ29yeSgpICsgIiAiICsgZW50cnkuZ2V0S2V5KCkgKyAiICIgKyBlbnRyeS5nZXRDbGFzcygpLmdldE5hbWUoKSk7ICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy99ICAKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGJvb2xlYW4gaXNJblNjb3BlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgaWYgKHRhcmdldEZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlzSW5TY29wZSA9IGlzTGlua2VkKGRvY3VtZW50U2V0LCAiZmlsZTovLy8iICsgcGF0aCwgImZpbGU6Ly8vIiArIHRhcmdldEZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAvL2lmIChwYXRoLmVuZHNXaXRoKCJDYW5jZWxTZWxlY3Rpb24ud3NkbCIpICAmJiBwYXRoLmluZGV4T2YoImNsb25lMSIpICE9IC0xKQotICAgICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgICAvLyAgZmlsZVJlZmVyZW5jZVRhYmxlLmRlYnVnKHF1YWxpZmllZFBhdGgsIDAsIDUpOwotICAgICAgICAgICAgICAgICAgLy99ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiAoaXNJblNjb3BlKQotICAgICAgICAgICAgICB7IAotCQkJICAgIHRoaXMubG9jYXRlTWF0Y2hlcyhwYXR0ZXJuLCBkb2N1bWVudCwgcmVxdWVzdG9yLCBzZWFyY2hPcHRpb25zLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICB9Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlpZiAoZGVidWdQZXJmKQotCQl7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIGdldERlc2NyaXB0aW9uKCkKLQkJCQkJCQkrICI6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICJtcyBmb3IgbG9jYXRlTWF0Y2hlcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCQotCX0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMaW5rZWQoU2VhcmNoRG9jdW1lbnRTZXQgc2V0LCBTdHJpbmcgc291cmNlLCBTdHJpbmcgdGFyZ2V0KQotICAgIHsKLSAgICAgIHJldHVybiBpc0xpbmtlZChzZXQsIHNvdXJjZSwgdGFyZ2V0LCBuZXcgSGFzaE1hcCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGlua2VkKFNlYXJjaERvY3VtZW50U2V0IHNldCwgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCwgSGFzaE1hcCB2aXNpdGVkKQotICAgIHsKLSAgICAgIGlmIChzb3VyY2UuZXF1YWxzKHRhcmdldCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgCi0gICAgICBTdHJpbmcgZmlsZVByb3RvY29sID0gImZpbGU6Ly8vIjsgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgCi0gICAgICAvLyBGaXggZm9yIGJ1ZyAyMDQxNzQgLSBCZWdpbgotICAgICAgaWYodGFyZ2V0LmNoYXJBdChmaWxlUHJvdG9jb2wubGVuZ3RoKCkpID09ICcvJykgIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgICB0YXJnZXQgPSBmaWxlUHJvdG9jb2wgKyB0YXJnZXQuc3Vic3RyaW5nKGZpbGVQcm90b2NvbC5sZW5ndGgoKSArIDEpOwotICAgICAgfQotICAgICAgLy8gRml4IGZvciBidWcgMjA0MTc0IC0gRW5kCi0gICAgICAgICAgICAKLSAgICAgIGlmIChzb3VyY2Uuc3RhcnRzV2l0aChmaWxlUHJvdG9jb2wpKQotICAgICAgeyAgICAKLSAgICAgICAgCi0gICAgICBTZWFyY2hEb2N1bWVudCBkb2N1bWVudCA9IHNldC5fdGVtcEdldFNlYXJjaERvY3VtZXRuKHNvdXJjZS5zdWJzdHJpbmcoZmlsZVByb3RvY29sLmxlbmd0aCgpKSk7ICAgICAgCi0gICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBVUklSZXNvbHZlciB1cmlSZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7ICAgICAgICAKLSAgICAgICAgRW50cnlbXSBlbnRyaWVzID0gZG9jdW1lbnQuZ2V0RW50cmllcyhJWE1MU2VhcmNoQ29uc3RhbnRzLlJFRiwgbnVsbCwgMCk7Ci0gICAgICAgIFN0cmluZ1tdIHJlc29sdmVFbnRyeSA9IG5ldyBTdHJpbmdbZW50cmllcy5sZW5ndGhdOyAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgIEVudHJ5IGVudHJ5ID0gZW50cmllc1tqXTsKLSAgICAgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBGaWxlUmVmZXJlbmNlRW50cnkpCi0gICAgICAgICAgewotICAgICAgICAgICAgRmlsZVJlZmVyZW5jZUVudHJ5IGZpbGVSZWZlcmVuY2VFbnRyeSA9IChGaWxlUmVmZXJlbmNlRW50cnkpZW50cnk7Ci0gICAgICAgICAgICAvLyBUT0RPLi4gcmVjb3JkIGFuIHV0aWxpemUgdGhlIHB1YmxpYyBpZCBmcm9tIHRoZSBmaWxlUmVmZXJlbmNlRW50cnkKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBpZiAoZmlsZVJlZmVyZW5jZUVudHJ5LmdldFJlbGF0aXZlRmlsZVBhdGgoKSAhPSBudWxsKQotICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZFVSSSA9IHVyaVJlc29sdmVyLnJlc29sdmUoc291cmNlLCBudWxsLCBmaWxlUmVmZXJlbmNlRW50cnkuZ2V0UmVsYXRpdmVGaWxlUGF0aCgpKTsKLSAgICAgICAgICAgICAgcmVzb2x2ZUVudHJ5W2pdID0gcmVzb2x2ZWRVUkk7Ci0gICAgICAgICAgICAgIGlmIChyZXNvbHZlZFVSSS5lcXVhbHModGFyZ2V0KSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICB9ICAgICAgICAgICAgIAotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIG5vdyBzZWUgaWYgdGhlcmUncyBhbiBpbmRpcmVjdCBsaW5rIGZyb20gdGhlIHNvdXJjZSB0byB0aGUgdGFyZ2V0Ci0gICAgICAgIC8vIHdlIGtlZXAgdHJhY2sgb2YgdGhlIG5vZGVzIHdlJ3ZlIGFscmVhZHkgdmlzaXRlZCB0byBhdm9pZCBjeWNsZXMKLSAgICAgICAgaWYgKHZpc2l0ZWQuZ2V0KHNvdXJjZSkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0ZWQucHV0KHNvdXJjZSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkVVJJID0gcmVzb2x2ZUVudHJ5W2pdOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkVVJJICE9IG51bGwgJiYgaXNMaW5rZWQoc2V0LCByZXNvbHZlRW50cnlbal0sIHRhcmdldCwgdmlzaXRlZCkpICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAKLSAgICAgICAgICB9ICAgIAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgfSAgICAgICAgICAgIAotICAgICAgfSAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAKLSAgICAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZWFyY2hFbnRyeUNhdGVnb3J5KFNlYXJjaFBhdHRlcm4gcGF0dGVybil7Ci0JCWlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4pewotCQkJcmV0dXJuIElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX0RFQ0w7Ci0JCX0KLQkJZWxzZSBpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybil7Ci0JCQlyZXR1cm4gSVhNTFNlYXJjaENvbnN0YW50cy5DT01QT05FTlRfUkVGOwotCQl9Ci0JCWVsc2UgaWYocGF0dGVybiBpbnN0YW5jZW9mIEZpbGVSZWZlcmVuY2VQYXR0ZXJuKXsKLQkJICAgcmV0dXJuIElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX1JFRjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MU2VhcmNoUGF0dGVybi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTFNlYXJjaFBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiNThlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MU2VhcmNoUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci0KLXB1YmxpYyBjbGFzcyBYTUxTZWFyY2hQYXR0ZXJuIGV4dGVuZHMgU2VhcmNoUGF0dGVybnsKLQkKLQlwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZXNwYWNlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VhcmNoTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VhcmNoTmFtZXNwYWNlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBwYXJlbnROYW1lID0gbnVsbDsKLSAgICBwcml2YXRlIGludCBkZXB0aCA9IC0xOwotCi0gICAgcHVibGljIFhNTFNlYXJjaFBhdHRlcm4oU3RyaW5nIGVsZW1lbnROYW1lc3BhY2UsIFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZSxTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgCXRoaXMoZWxlbWVudE5hbWVzcGFjZSwgcGFyZW50RWxlbWVudE5hbWUsIGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVOYW1lLCAtMSk7Ci0gICAgfQotCQotCXB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuKFN0cmluZyBlbGVtZW50TmFtZXNwYWNlLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgdGhpcyhlbGVtZW50TmFtZXNwYWNlLCBudWxsLCBlbGVtZW50TmFtZSwgYXR0cmlidXRlTmFtZSwgLTEpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgWE1MU2VhcmNoUGF0dGVybihTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgaW50IGRlcHRoKSB7Ci0gICAgCXRoaXMoZWxlbWVudE5hbWVzcGFjZSwgbnVsbCwgZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIGRlcHRoKTsgICAgICAgCi0gICAgfQotICAgICAgICAgICAKLSAgICBwcml2YXRlIFhNTFNlYXJjaFBhdHRlcm4oU3RyaW5nIGVsZW1lbnROYW1lc3BhY2UsIFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgaW50IGRlcHRoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7Ci0gICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLSAgICAgICAgdGhpcy5wYXJlbnROYW1lID0gcGFyZW50RWxlbWVudE5hbWU7Ci0gICAgICAgIHRoaXMuZWxlbWVudE5hbWVzcGFjZSA9IGVsZW1lbnROYW1lc3BhY2U7Ci0gICAgICAgIHRoaXMuZGVwdGggPSBkZXB0aDsKLSAgICB9Ci0gICAgCi0JcHVibGljIFhNTFNlYXJjaFBhdHRlcm4oKXsKLQkJCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnROYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZWFyY2hOYW1lKCkgewotCQlyZXR1cm4gc2VhcmNoTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlYXJjaE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHNlYXJjaE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWFyY2hOYW1lKFN0cmluZyBzZWFyY2hOYW1lKSB7Ci0JCXRoaXMuc2VhcmNoTmFtZSA9IHNlYXJjaE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VhcmNoTmFtZXNwYWNlKFN0cmluZyBzZWFyY2hOYW1lc3BhY2UpIHsKLQkJdGhpcy5zZWFyY2hOYW1lc3BhY2UgPSBzZWFyY2hOYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQl0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnROYW1lKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQl0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWVzcGFjZShTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSkgewotCQl0aGlzLmVsZW1lbnROYW1lc3BhY2UgPSBlbGVtZW50TmFtZXNwYWNlOwotCX0KLQotICBwdWJsaWMgaW50IGdldERlcHRoKCkKLSAgewotICAgIHJldHVybiBkZXB0aDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlcHRoKGludCBkZXB0aCkKLSAgewotICAgIHRoaXMuZGVwdGggPSBkZXB0aDsKLSAgfQotCi1wdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKSB7Ci0JcmV0dXJuIHBhcmVudE5hbWU7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFBhcmVudE5hbWUoU3RyaW5nIHBhcmVudE5hbWUpIHsKLQl0aGlzLnBhcmVudE5hbWUgPSBwYXJlbnROYW1lOwotfQotCQotCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvSVhNTFNlYXJjaENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvSVhNTFNlYXJjaENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTYwZDgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL0lYTUxTZWFyY2hDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTFNlYXJjaENvbnN0YW50cwotewotCQlTdHJpbmcgUkVGPSAib3V0TGluayI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENPTVBPTkVOVF9ERUNMID0gImNvbXBvbmVudERlY2wiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBDT01QT05FTlRfUkVGID0gImNvbXBvbmVudERlY2wiOyAvLyROT04tTkxTLTEkCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhZTIyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guaW1wbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCQotCS8qKgotCSAqIEJpbmQgdGhlIGdpdmVuIG1lc3NhZ2UncyBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZyB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbWFuaXB1bGF0ZWQKLQkgKiBAcmV0dXJuIHRoZSBtYW5pcHVsYXRlZCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBiaW5kKG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBCaW5kIHRoZSBnaXZlbiBtZXNzYWdlJ3Mgc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIG1hbmlwdWxhdGVkCi0JICogQHBhcmFtIGJpbmRpbmcgdGhlIG9iamVjdCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlCi0JICogQHJldHVybiB0aGUgbWFuaXB1bGF0ZWQgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGJpbmRpbmcpIHsKLQkJcmV0dXJuIGJpbmQobWVzc2FnZSwgbmV3IE9iamVjdFtdIHtiaW5kaW5nfSk7Ci0JfQotCi0JLyoqCi0JICogQmluZCB0aGUgZ2l2ZW4gbWVzc2FnZSdzIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBtYW5pcHVsYXRlZAotCSAqIEBwYXJhbSBiaW5kaW5nMSBBbiBvYmplY3QgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZQotCSAqIEBwYXJhbSBiaW5kaW5nMiBBIHNlY29uZCBvYmplY3QgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZQotCSAqIEByZXR1cm4gdGhlIG1hbmlwdWxhdGVkIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBiaW5kaW5nMSwgT2JqZWN0IGJpbmRpbmcyKSB7Ci0JCXJldHVybiBiaW5kKG1lc3NhZ2UsIG5ldyBPYmplY3RbXSB7YmluZGluZzEsIGJpbmRpbmcyfSk7Ci0JfQotCi0JLyoqCi0JICogQmluZCB0aGUgZ2l2ZW4gbWVzc2FnZSdzIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBtYW5pcHVsYXRlZAotCSAqIEBwYXJhbSBiaW5kaW5ncyBBbiBhcnJheSBvZiBvYmplY3RzIHRvIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UKLQkgKiBAcmV0dXJuIHRoZSBtYW5pcHVsYXRlZCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBtZXNzYWdlLCBPYmplY3RbXSBiaW5kaW5ncykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgYmluZGluZ3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvWE1MU2VhcmNoRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL1hNTFNlYXJjaERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MDhhZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvWE1MU2VhcmNoRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MU2VhcmNoUGFydGljaXBhbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYTUxTZWFyY2hEb2N1bWVudCBleHRlbmRzIFNlYXJjaERvY3VtZW50IHsKLQkKLQlJRE9NTW9kZWwgbW9kZWw7Ci0JTWFwIGVudHJpZXMgPSBuZXcgSGFzaE1hcCgpOyAvLyBjYXRlZ29yeSAtPiBzZXQgKGVudHJ5KQkKLQotCXB1YmxpYyBYTUxTZWFyY2hEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoLCBYTUxTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkgewotCQlzdXBlcihkb2N1bWVudFBhdGgsIHBhcnRpY2lwYW50KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsKCkgewotCQlpZihtb2RlbCA9PSBudWxsKXsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGluZyBET00gZm9yICIgKyBnZXRQYXRoKCkpOwotCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGdldFBhdGgoKSkpOwotCQkJaWYoZmlsZSAhPSBudWxsKXsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IChJRE9NTW9kZWwpU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgRW50cnlbXSBnZXRFbnRyaWVzKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIGtleSwgaW50IG1hdGNoUnVsZSkKLQl7Ci0JCS8vIFRPRE8gdXNlIG1hdGNoUnVsZQotCQlTZXQgcmVzdWx0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmKGNhdGVnb3J5ICE9IG51bGwpewotCQkJU2V0IHZhbHVlcyA9IChTZXQpZW50cmllcy5nZXQoY2F0ZWdvcnkpOwotCQkJaWYodmFsdWVzID09IG51bGwpewotCQkJCXJldHVybiBuZXcgRW50cnlbMF07Ci0JCQl9Ci0JCQlpZihrZXkgPT0gbnVsbCB8fCAiIi5lcXVhbHMoa2V5KSB8fCAiKiIuZXF1YWxzKGtleSkpeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkvLyBlbnRyaWVzIHdpdGggYW55IGtleSBpbiB0aGUgZ2l2ZW4gY2F0ZWdvcnkKLQkJCQlyZXN1bHRzLmFkZEFsbCh2YWx1ZXMpOwotCQkJfQotCQkJZWxzZXsKLQkJCQkvLyBlbnRyaWVzIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhlIGdpdmVuIGNhdGVnb3J5Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJCQl7Ci0JCQkJCUVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYoa2V5LmVxdWFscyhlbnRyeS5nZXRLZXkoKSkpewotCQkJCQkJcmVzdWx0cy5hZGQoZW50cnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQkJcmV0dXJuIChFbnRyeVtdKSByZXN1bHRzLnRvQXJyYXkobmV3IEVudHJ5W3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0RW50cnkoRW50cnkgZW50cnkpCi0JewotCQlpZihlbnRyeS5nZXRDYXRlZ29yeSgpICE9IG51bGwpewotCQkJU2V0IHZhbHVlcyA9IChTZXQpZW50cmllcy5nZXQoZW50cnkuZ2V0Q2F0ZWdvcnkoKSk7Ci0JCQlpZih2YWx1ZXMgPT0gbnVsbCl7Ci0JCQkJZW50cmllcy5wdXQoZW50cnkuZ2V0Q2F0ZWdvcnkoKSwgdmFsdWVzPW5ldyBIYXNoU2V0KCkpOwotCQkJfQotCQkJdmFsdWVzLmFkZChlbnRyeSk7Ci0JCX0KLQkJCi0JfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgeyAgICAgCi0gICAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBtb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsgICAgICAgIAotICAgICAgfSAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYWVhOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9QYXR0ZXJuTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1BhdHRlcm5NYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNTE4ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1BhdHRlcm5NYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIG1hdGNoaW5nIGltcGxlbWVudGF0aW9uLiAgCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgb2YgdGhlIFBhdHRlcm5NYXRjaGVzIHNob3VsZCBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzcGVjaWZpYyBwYXR0ZXJuIG1hdGNoaW5nLgotICogPC9wPgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG9mIHRoZSBQYXR0ZXJuTWF0Y2hlcyBzaG91bGQgYmUgc2V0IGFzIGFkYXB0ZXJzIGZvciB0aGUgcGF0dGVybnMgdGhhdCB0aGV5IG1hdGNoLgotICogPC9wPgotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQjc2VsZWN0RG9jdW1lbnRMb2NhdGlvbnMoKX0gd2lsbCBjYWxsIAotICogeyBAbGluayBQYXR0ZXJuTWF0Y2hlciNtYXRjaGVzKCkgfSBvbiB0aGUgYWRhcHRlciBvbiBwYXR0ZXJuIG1hdGNoZXIuCi0gKiAKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50I2xvY2F0ZU1hdGNoZXMoKX0gd2lsbCBjYWxsIAotICogeyBAbGluayBQYXR0ZXJuTWF0Y2hlciNsb2NhdGVNYXRjaGVzKCkgfSBvbiB0aGUgYWRhcHRlciBvbiBwYXR0ZXJuIG1hdGNoZXIuCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGF0dGVybk1hdGNoZXIgewotCQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgZGl2ZSBhY3R1YWwgbWF0Y2ggbG9jYXRpb24gdG8gdGhlIHJlcXVlc3RvciBpZiB0aGVyZSBhcmUgbWF0Y2hlcwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvY2F0ZU1hdGNoZXMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJRmlsZSBmaWxlLCBFbGVtZW50IGVsZW1lbnQsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgb25seSBhbnN3ZXJzIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgZWxlbWVudCwgaXQgZG9lcyBub3QgZ2l2ZSBhY3R1YWwgbWF0Y2ggbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBtYXRjaGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgT2JqZWN0IGVsZW1lbnQpOwotICAgIAotICAgIHByb3RlY3RlZCBTZWFyY2hNYXRjaCBjcmVhdGVTZWFyY2hNYXRjaChJRmlsZSBmaWxlLCBBdHRyIGF0dHJpYnV0ZU5vZGUpCi0gICAgewotICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgaWYoYXR0cmlidXRlTm9kZSBpbnN0YW5jZW9mIElET01BdHRyKXsKLSAgICAgICAgICAgIElET01BdHRyIGRvbUF0dHIgPSAoSURPTUF0dHIpYXR0cmlidXRlTm9kZTsKLSAgICAgICAgICAgIHN0YXJ0ID0gZG9tQXR0ci5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0gICAgICAgICAgICBsZW5ndGggPSBkb21BdHRyLmdldFZhbHVlUmVnaW9uVGV4dCgpLmxlbmd0aCgpOwotICAgICAgICB9Ci0gICAgICAgIFNlYXJjaE1hdGNoIG1hdGNoID0gbmV3IFNlYXJjaE1hdGNoKGF0dHJpYnV0ZU5vZGUsIHN0YXJ0LCBsZW5ndGgsIGZpbGUpOwotICAgICAgICByZXR1cm4gbWF0Y2g7Ci0gICAgfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE1hdGNoKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUZpbGUgZmlsZSwgQXR0ciBhdHRyaWJ1dGVOb2RlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJhZGRNYXRjaCAiICsgcGF0dGVybiArICIgIiArIGF0dHJpYnV0ZU5vZGUuZ2V0TmFtZSgpICsgIj0iICsgYXR0cmlidXRlTm9kZS5nZXRWYWx1ZSgpKTsKLQkJaWYgKGF0dHJpYnV0ZU5vZGUgIT0gbnVsbCkgewotCQkJCVNlYXJjaE1hdGNoIG1hdGNoID0gY3JlYXRlU2VhcmNoTWF0Y2goZmlsZSwgYXR0cmlidXRlTm9kZSk7ICAgICAgICAgICAgICAgIAotCQkJCWlmKHJlcXVlc3RvciAhPSBudWxsKXsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlcXVlc3Rvci5hY2NlcHRTZWFyY2hNYXRjaChtYXRjaCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy9kbyBub3RoaW5nCi0JCQkJCX0KLQkJCQl9Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1NBWFNlYXJjaEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9TQVhTZWFyY2hFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWM0YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1NBWFNlYXJjaEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi1wdWJsaWMgY2xhc3MgU0FYU2VhcmNoRWxlbWVudHsKLQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7Ci0JU3RyaW5nIGVsZW1lbnROYW1lOwotCVN0cmluZyBlbGVtZW50TmFtZXNwYWNlOwotCU1hcCBuYW1lc3BhY2VNYXAgPSBuZXcgSGFzaE1hcCgpOyAvLyBNYXAgb2Ygc3RyaW5nIHByZWZpeCBrZXlzIGFuZCBuYW1lc3BhY2UKLQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgcGFyZW50TmFtZTsKLSAgICBpbnQgZGVwdGggPSAtMTsKLQkKLQlwdWJsaWMgU0FYU2VhcmNoRWxlbWVudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50TmFtZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gZWxlbWVudE5hbWVzcGFjZTsKLQl9Ci0JcHVibGljIE1hcCBnZXROYW1lc3BhY2VNYXAoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VNYXA7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQl0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZXNwYWNlKFN0cmluZyBlbGVtZW50TmFtZXNwYWNlKSB7Ci0JCXRoaXMuZWxlbWVudE5hbWVzcGFjZSA9IGVsZW1lbnROYW1lc3BhY2U7Ci0JfQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZU1hcChNYXAgbmFtZXNwYWNlTWFwKSB7Ci0JCXRoaXMubmFtZXNwYWNlTWFwID0gbmFtZXNwYWNlTWFwOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotCQl0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0gIHB1YmxpYyBpbnQgZ2V0RGVwdGgoKQotICB7Ci0gICAgcmV0dXJuIGRlcHRoOwotICB9Ci0gIHB1YmxpYyB2b2lkIHNldERlcHRoKGludCBkZXB0aCkKLSAgewotICAgIHRoaXMuZGVwdGggPSBkZXB0aDsKLSAgfQotcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKCkgewotCXJldHVybiBwYXJlbnROYW1lOwotfQotcHVibGljIHZvaWQgc2V0UGFyZW50TmFtZShTdHJpbmcgcGFyZW50TmFtZSkgewotCXRoaXMucGFyZW50TmFtZSA9IHBhcmVudE5hbWU7Ci19Ci0JCi0JCi0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1hNTFNlYXJjaFBhdHRlcm5NYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvbWF0Y2hpbmcvWE1MU2VhcmNoUGF0dGVybk1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4ZTM1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvbWF0Y2hpbmcvWE1MU2VhcmNoUGF0dGVybk1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxTZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlciBleHRlbmRzIFBhdHRlcm5NYXRjaGVyewotCQotICAgLyoqCi0gICAgKiBUaGUgYWN0aXZlIHNlYXJjaCBwYXJ0aWNpcGFudC4KLSAgICAqLwotICAgIHByaXZhdGUgU2VhcmNoUGFydGljaXBhbnQgc2VhcmNoUGFydGljaXBhbnQ7Ci0gIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBwYXR0ZXJuIG1hdGNoZXIgZ2l2ZW4gYSBzZWFyY2ggcGFydGljaXBhbnQuCi0gICAgICogQHBhcmFtIHNlYXJjaFBhcnRpY2lwYW50IHRoZSBhY3RpdmUge0BsaW5rIFNlYXJjaFBhcnRpY2lwYW50IHNlYXJjaCBwYXJ0aWNpcGFudH0uCi0gICAgICovCi0gICAgcHVibGljIFhNTFNlYXJjaFBhdHRlcm5NYXRjaGVyKFNlYXJjaFBhcnRpY2lwYW50IHNlYXJjaFBhcnRpY2lwYW50KQotICAgIHsKLSAgICAgIHRoaXMuc2VhcmNoUGFydGljaXBhbnQgPSBzZWFyY2hQYXJ0aWNpcGFudDsKLSAgICB9Ci0gICAgCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlTmFtZXNwYWNlRm9yUHJlZml4KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHByZWZpeCkKLQl7Ci0JICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkgIGZvciAoTm9kZSBub2RlID0gZWxlbWVudDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpCi0JICB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCXsKLQkJICBFbGVtZW50IGUgPSAoRWxlbWVudClub2RlOwotCQkgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApID8gKCJ4bWxuczoiICsgcHJlZml4KSA6ICJ4bWxucyI7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICByZXN1bHQgPSBlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA/IGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIDogbnVsbDsKLQkJICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCgpID4gMCkKLQkJICB7Ci0JCQkgYnJlYWs7ICAKLQkJICB9CSAgCi0JCX0JCi0JICB9CSAgCi0JICByZXR1cm4gcmVzdWx0OwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWE1MU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBFbGVtZW50IGRvbUVsZW1lbnQpIHsKLQkKLQkJCXBhdHRlcm4uc2V0RWxlbWVudE5hbWUoZG9tRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0JCQlwYXR0ZXJuLnNldEVsZW1lbnROYW1lc3BhY2UoZG9tRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAvLyBUT0RPIChjcykgc2V0IHRoZSBkZXB0aCBhdHRyaWJ1dGUgb24gdGhlIHBhdHRlcm4KLSAgICAgICAgICAgIC8vCi0JCQlTdHJpbmcgYWN0dWFsVmFsdWUgPSBkb21FbGVtZW50Lmhhc0F0dHJpYnV0ZShwYXR0ZXJuLmdldEF0dHJpYnV0ZU5hbWUoKSkgPyBkb21FbGVtZW50LmdldEF0dHJpYnV0ZShwYXR0ZXJuLmdldEF0dHJpYnV0ZU5hbWUoKSkgOiBudWxsOwotCQkJIGlmKGFjdHVhbFZhbHVlICE9IG51bGwgJiYgYWN0dWFsVmFsdWUubGVuZ3RoKCkgPiAwKXsKLQkJCQkJaW50IG4gPSBhY3R1YWxWYWx1ZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYobiA+IDApewotCQkJCQkJU3RyaW5nIHByZWZpeCA9IGFjdHVhbFZhbHVlLnN1YnN0cmluZygwLCBuKTsKLQkJCQkJCXBhdHRlcm4uc2V0U2VhcmNoTmFtZShhY3R1YWxWYWx1ZS5zdWJzdHJpbmcobisxKSk7ICAgICAgCi0JCQkJCQkKLQkJCQkJCVN0cmluZyBuYW1lc3BhY2UgPSBjb21wdXRlTmFtZXNwYWNlRm9yUHJlZml4KGRvbUVsZW1lbnQsIHByZWZpeCk7Ci0JCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQkJCQkKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXBhdHRlcm4uc2V0U2VhcmNoTmFtZShhY3R1YWxWYWx1ZSk7Ci0JCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWVzcGFjZShkb21FbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkgICAgfQotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYTUxTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNBWFNlYXJjaEVsZW1lbnQgc2F4RWxlbWVudCkgewotCQkKLQkJcGF0dGVybi5zZXRFbGVtZW50TmFtZShzYXhFbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOwotCQlwYXR0ZXJuLnNldEVsZW1lbnROYW1lc3BhY2Uoc2F4RWxlbWVudC5nZXRFbGVtZW50TmFtZXNwYWNlKCkpOwotICAgICAgICBwYXR0ZXJuLnNldERlcHRoKHNheEVsZW1lbnQuZ2V0RGVwdGgoKSk7Ci0gICAgICAgIHBhdHRlcm4uc2V0UGFyZW50TmFtZShzYXhFbGVtZW50LmdldFBhcmVudE5hbWUoKSk7Ci0JCVN0cmluZyBhY3R1YWxWYWx1ZSA9IHNheEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpLmdldFZhbHVlKHBhdHRlcm4uZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJIGlmKGFjdHVhbFZhbHVlICE9IG51bGwpewotCQkJCWludCBuID0gYWN0dWFsVmFsdWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYobiA+IDApewotCQkJCQlTdHJpbmcgcHJlZml4ID0gYWN0dWFsVmFsdWUuc3Vic3RyaW5nKDAsIG4pOwotCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWUoYWN0dWFsVmFsdWUuc3Vic3RyaW5nKG4rMSkpOwotCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWVzcGFjZSgoU3RyaW5nKXNheEVsZW1lbnQuZ2V0TmFtZXNwYWNlTWFwKCkuZ2V0KHByZWZpeCkpOwotCQkJCQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lKGFjdHVhbFZhbHVlKTsKLQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2Uoc2F4RWxlbWVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCQkJfQotCQkgICAgfQotCQotCX0KLQkKLQlYTUxTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm47Ci0JCi0JcHVibGljIFhNTFNlYXJjaFBhdHRlcm5NYXRjaGVyKCkgewotCQlzdXBlcigpOwotCQkKLQl9Ci0KLQkKLQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgZGl2ZSBhY3R1YWwgbWF0Y2ggbG9jYXRpb24gdG8gdGhlIHJlcXVlc3RvciBpZiB0aGVyZSBhcmUgbWF0Y2hlcwotCSAqLwotCQotCXB1YmxpYyB2b2lkIGxvY2F0ZU1hdGNoZXMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJRmlsZSBmaWxlLCBFbGVtZW50IGVsZW1lbnQsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQkJaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4pewotCQkJWE1MU2VhcmNoUGF0dGVybltdIGNoaWxkUGF0dGVybnMgPSAoKFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4pcGF0dGVybikuZ2V0Q2hpbGRyZW4oc2VhcmNoUGFydGljaXBhbnQpOwotCQkJaWYgKGNoaWxkUGF0dGVybnMgPT0gbnVsbCl7Ci0JCQkgIHJldHVybjsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRQYXR0ZXJucy5sZW5ndGg7IGkrKykgewotCQkJCVBhdHRlcm5NYXRjaGVyIG1hdGNoZXIgPSAoUGF0dGVybk1hdGNoZXIpY2hpbGRQYXR0ZXJuc1tpXS5nZXRBZGFwdGVyKFBhdHRlcm5NYXRjaGVyLmNsYXNzKTsKLQkJCQlpZihtYXRjaGVyID09IG51bGwpewotCQkJCQltYXRjaGVyID0gdGhpczsKLQkJCQl9Ci0JCQkJaWYobWF0Y2hlciAhPSBudWxsKXsKLQkJCQkJbWF0Y2hlci5sb2NhdGVNYXRjaGVzKGNoaWxkUGF0dGVybnNbaV0sIGZpbGUsIGVsZW1lbnQsIHJlcXVlc3Rvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTFNlYXJjaFBhdHRlcm4pewotCQkJaWYobWF0Y2hlcyhwYXR0ZXJuLCBlbGVtZW50KSl7Ci0JCQkJQXR0ciBhdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoKChYTUxTZWFyY2hQYXR0ZXJuKXBhdHRlcm4pLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQkJYWRkTWF0Y2gocGF0dGVybiwgZmlsZSwgYXR0cmlidXRlLCByZXF1ZXN0b3IpOwotCQkJfQotCQkKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBvbmx5IGFuc3dlcnMgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyBlbGVtZW50LCBpdCBkb2VzIG5vdCBnaXZlIGFjdHVhbCBtYXRjaCBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBPYmplY3QgZWxlbWVudCl7Ci0JCWlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXsKLQkJCVhNTFNlYXJjaFBhdHRlcm5bXSBjaGlsZFBhdHRlcm5zID0gKChYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXBhdHRlcm4pLmdldENoaWxkcmVuKHNlYXJjaFBhcnRpY2lwYW50KTsKLSAgICAgICAgICAgIGlmIChjaGlsZFBhdHRlcm5zID09IG51bGwpewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkUGF0dGVybnMubGVuZ3RoOyBpKyspIHsKLQkJCQlQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyID0gKFBhdHRlcm5NYXRjaGVyKWNoaWxkUGF0dGVybnNbaV0uZ2V0QWRhcHRlcihQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCQkJaWYobWF0Y2hlciA9PSBudWxsKXsKLQkJCQkJbWF0Y2hlciA9IHRoaXM7Ci0JCQkJfQotCQkJCWlmKG1hdGNoZXIgIT0gbnVsbCl7Ci0JCQkJCWlmKG1hdGNoZXIubWF0Y2hlcyhjaGlsZFBhdHRlcm5zW2ldLCBlbGVtZW50KSl7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQotCQllbHNlIGlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxTZWFyY2hQYXR0ZXJuKXsKLQkJCQotCQkJWE1MU2VhcmNoUGF0dGVybiBwb3NzaWJsZU1hdGNoID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4oKTsKLQkJCXBvc3NpYmxlTWF0Y2guc2V0QXR0cmlidXRlTmFtZSgoKFhNTFNlYXJjaFBhdHRlcm4pcGF0dGVybikuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KXsKLQkJCQlpbml0aWFsaXplKHBvc3NpYmxlTWF0Y2gsIChFbGVtZW50KWVsZW1lbnQpOwotCQkJfQotCQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgU0FYU2VhcmNoRWxlbWVudCl7Ci0JCQkJaW5pdGlhbGl6ZShwb3NzaWJsZU1hdGNoLCAoU0FYU2VhcmNoRWxlbWVudCllbGVtZW50KTsKLQkJCX0KLQkJCXNlYXJjaFBhdHRlcm4gPSAoWE1MU2VhcmNoUGF0dGVybilwYXR0ZXJuOwotCQkJcmV0dXJuIG1hdGNoZXNQYXR0ZXJuKHBvc3NpYmxlTWF0Y2gpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlc1BhdHRlcm4oU2VhcmNoUGF0dGVybiBwYXR0ZXJuKSB7Ci0JCWlmKHNlYXJjaFBhdHRlcm4gIT0gbnVsbCAmJiBwYXR0ZXJuIGluc3RhbmNlb2YgWE1MU2VhcmNoUGF0dGVybil7Ci0JCQlYTUxTZWFyY2hQYXR0ZXJuIGRlY29kZWRQYXR0ZXJuID0gKFhNTFNlYXJjaFBhdHRlcm4pcGF0dGVybjsKLSAgICAgICAgICAgIGlmKHNlYXJjaFBhdHRlcm4uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoZGVjb2RlZFBhdHRlcm4uZ2V0RWxlbWVudE5hbWUoKSkgJiYgICAgICAgICAgICAgICAgICAgIAotCQkJCQlzZWFyY2hQYXR0ZXJuLmdldEVsZW1lbnROYW1lc3BhY2UoKS5lcXVhbHMoZGVjb2RlZFBhdHRlcm4uZ2V0RWxlbWVudE5hbWVzcGFjZSgpKSl7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKHNlYXJjaFBhdHRlcm4uZ2V0UGFyZW50TmFtZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICBkZWNvZGVkUGF0dGVybi5nZXRQYXJlbnROYW1lKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICFzZWFyY2hQYXR0ZXJuLmdldFBhcmVudE5hbWUoKS5lcXVhbHMoZGVjb2RlZFBhdHRlcm4uZ2V0UGFyZW50TmFtZSgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAKLSAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICBpZihzZWFyY2hQYXR0ZXJuLmdldFNlYXJjaE5hbWUoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICgiKiIuZXF1YWxzKHNlYXJjaFBhdHRlcm4uZ2V0U2VhcmNoTmFtZSgpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgIGVsc2UgaWYoc2VhcmNoUGF0dGVybi5nZXRTZWFyY2hOYW1lc3BhY2UoKSA9PSBudWxsKXsKLQkJCQkJcmV0dXJuIHNlYXJjaFBhdHRlcm4uZ2V0U2VhcmNoTmFtZSgpLmVxdWFscyhkZWNvZGVkUGF0dGVybi5nZXRTZWFyY2hOYW1lKCkpOwotCQkJCX0KLQkJCQllbHNlewotCQkJCQlyZXR1cm4gc2VhcmNoUGF0dGVybi5nZXRTZWFyY2hOYW1lKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldFNlYXJjaE5hbWUoKSkgJiYKLQkJCQkJc2VhcmNoUGF0dGVybi5nZXRTZWFyY2hOYW1lc3BhY2UoKS5lcXVhbHMoZGVjb2RlZFBhdHRlcm4uZ2V0U2VhcmNoTmFtZXNwYWNlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLSAgICAKLSAgICBwcm90ZWN0ZWQgU2VhcmNoTWF0Y2ggY3JlYXRlU2VhcmNoTWF0Y2goSUZpbGUgZmlsZSwgQXR0ciBhdHRyaWJ1dGVOb2RlKQotICAgIHsKLSAgICAgIFNlYXJjaE1hdGNoIG1hdGNoID0gc3VwZXIuY3JlYXRlU2VhcmNoTWF0Y2goZmlsZSwgYXR0cmlidXRlTm9kZSk7Ci0gICAgICAvLyB0b2RvLi4uIHJlbW92ZSB0aGlzIHVnbHkgaGFjayEhCi0gICAgICBpZiAoIm5hbWUiLmVxdWFscyhhdHRyaWJ1dGVOb2RlLmdldE5hbWUoKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gbmV3IFF1YWxpZmllZE5hbWUoInRvZG8tY29tcHV0ZS10YXJnZXROYW1lc3BhY2UiLCBhdHRyaWJ1dGVOb2RlLmdldFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1hdGNoLm1hcC5wdXQoIm5hbWUiLCBxdWFsaWZpZWROYW1lKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgLy9FbGVtZW50IGVsZW1lbnQgPSBhdHRyaWJ1dGVOb2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIC8vaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiKSkKLSAgICAgIC8veyAgICAgICAgCi0gICAgICAvL30gIAotICAgICAgcmV0dXJuIG1hdGNoOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL3F1aWNrc2Nhbi9YTUxRdWlja1NjYW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGExNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL3F1aWNrc2Nhbi9YTUxRdWlja1NjYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5xdWlja3NjYW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmcuUGF0dGVybk1hdGNoZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxRdWlja1NjYW4KLXsKLSAgICAvKgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgZnVsbEZpbGVQYXRoKQotCXsKLQkJWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlcigpOwotCQlwYXJzZUZpbGUoZnVsbEZpbGVQYXRoLCBoYW5kbGVyKTsKLQkJcmV0dXJuIGhhbmRsZXIuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JfSovCi0JCi0JLyoKLQkgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IG1hdGNoZXMgZW5jb3VudGVyZWQgYmFzZWQgb24gdGhlIGNyaXRlcmlhCi0JICogcHJvdmlkZWQuCi0JICoKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzTWF0Y2goU3RyaW5nIGZ1bGxGaWxlUGF0aCwgUGF0dGVybk1hdGNoZXIgbWF0Y2hlciwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuKQotCXsKLQkJWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlcihtYXRjaGVyLCBwYXR0ZXJuKTsKLQkJcGFyc2VGaWxlKGZ1bGxGaWxlUGF0aCwgaGFuZGxlcik7Ci0JCXJldHVybiBoYW5kbGVyLmhhc01hdGNoKCk7Ci0JfSovCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHBvcHVsYXRlU2VhcmNoRG9jdW1lbnQoU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQsIFBhdHRlcm5NYXRjaGVyIG1hdGNoZXIsIFNlYXJjaFBhdHRlcm4gcGF0dGVybikKLQl7Ci0JCVhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIoZG9jdW1lbnQsIG1hdGNoZXIsIHBhdHRlcm4pOwotCQlwYXJzZUZpbGUoZG9jdW1lbnQuZ2V0UGF0aCgpLCBoYW5kbGVyKTsKLQkJcmV0dXJuIGhhbmRsZXIuaGFzTWF0Y2goKTsKLQl9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBYTUxSZWFkZXIgcmVhZGVyOwotICAgIHByaXZhdGUgc3RhdGljIFhNTFJlYWRlciBnZXRPckNyZWF0ZVJlYWRlcigpCi0gICAgewotICAgICAgIGlmIChyZWFkZXIgPT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgICB0cnkKLSAgICAgICAgIHsKLSAgICAgICAgICBTQVhQYXJzZXIgcGFyc2VyID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NBWFBhcnNlcigpOwotICAgICAgICAgIHJlYWRlciA9IHBhcnNlci5nZXRYTUxSZWFkZXIoKTsgIAotICAgICAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgcmVhZGVyLnNldEVycm9ySGFuZGxlcihuZXcgSW50ZXJuYWxFcnJvckhhbmRsZXIoKSk7ICAgICAgICAgIAotICAgICAgICAgfQotICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgeyAgICAgICAgICAgCi0gICAgICAgICB9Ci0gICAgICAgfSAKLSAgICAgICByZXR1cm4gcmVhZGVyOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgY2xhc3MgSW50ZXJuYWxFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsgICAgICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgeyAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIAotCXByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHBhcnNlRmlsZShTdHJpbmcgZnVsbEZpbGVQYXRoLAotCQkJWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIgaGFuZGxlcikKLQl7Ci0JCUZpbGVJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeQotCQl7ICAgICAgICAgICAgCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoZnVsbEZpbGVQYXRoKSk7Ci0JCQlYTUxSZWFkZXIgcmVhZGVyID0gZ2V0T3JDcmVhdGVSZWFkZXIoKTsKLSAgICAgICAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJwYXJzZUZpbGUiICsgcmVhZGVyICsgIiAoIiArICBmdWxsRmlsZVBhdGggKyAiKSIpOwkJCQotCQkJcmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dFN0cmVhbSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJLy8gc2tpcCB0aGUgZmlsZQotCQl9IAotCQlmaW5hbGx5ewotCQkJaWYoaW5wdXRTdHJlYW0gIT0gbnVsbCl7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGNhbiBub3QgZG8gbXVjaCAKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkODdjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvcXVpY2tzY2FuL1hNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gucXVpY2tzY2FuOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkNvbXBvbmVudERlY2xhcmF0aW9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5Db21wb25lbnRSZWZlcmVuY2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkZpbGVSZWZlcmVuY2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGwuSVhNTFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nLlBhdHRlcm5NYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmcuU0FYU2VhcmNoRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBTQVggY29udGVudCBoYW5kbGVyLCBpdCBzaG91bGQgYmUgcmVjeWNsZWQgYmVmb3JlIHNjYW5uaW5nIGEgZmlsZSBmb3IgdGhlIG5ldyBTZWFyY2hQYXR0ZXJuLgotICoKLSAqLwotcHVibGljIGNsYXNzIFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLXsKLQlwcml2YXRlIE1hcCBuYW1lc3BhY2VNYXAgPSBuZXcgSGFzaE1hcCgpOyAvLyBNYXAgb2Ygc3RyaW5nIHByZWZpeCBrZXlzIGFuZCBuYW1lc3BhY2UKLQlwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgU2VhcmNoUGF0dGVybiBwYXR0ZXJuOwotCXByaXZhdGUgU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQ7ICAvLyB3ZSdsbCBhZGQgdXNlZnVsIGVudHJpZXMgaW4gdGhlIHNlYXJjaCBkb2N1bWVudCBhcyB3ZSBwYXJzaW5nCi0JcHJpdmF0ZSBTQVhTZWFyY2hFbGVtZW50IHNlYXJjaEVsZW1lbnQgPSBuZXcgU0FYU2VhcmNoRWxlbWVudCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdGFjayBjdXJyZW50UGF0aCA9IG5ldyBTdGFjaygpOwotCXByaXZhdGUgUGF0dGVybk1hdGNoZXIgbWF0Y2hlcjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX05BTUVTUEFDRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI7IC8vJE5PTi1OTFMtMSQKLQotCQotCXB1YmxpYyBYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlcihQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQkJdGhpcy5tYXRjaGVyID0gbWF0Y2hlcjsKLQl9Ci0JCi0JcHVibGljIFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyKFNlYXJjaERvY3VtZW50IGRvY3VtZW50LCBQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQkJdGhpcy5tYXRjaGVyID0gbWF0Y2hlcjsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQkKLQlwdWJsaWMgWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwKLQkJCUF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotCXsJCi0JCS8vIFNlYXJjaCBmb3IgdGFyZ2V0TmFtZXNwYWNlIGlmIHdlIGhhdmVuJ3QgZW5jb3VudGVyZWQgaXQgeWV0LgotCQlpZiAodGFyZ2V0TmFtZXNwYWNlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJaW50IG5BdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJpYnV0ZXM7IGkrKykKLQkJCXsKLQkJCQlpZiAoInRhcmdldE5hbWVzcGFjZSIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkpKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQl0YXJnZXROYW1lc3BhY2UgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGNvbGxlY3QgbGluayBpbmZvCi0gICAgCi0gICAgLy8gVE9ETyBUaGlzIGNvZGUgc2hvdWxkIGJlIHJlZmFjdG9yZWQgdG8gZGVsZWdhdGUgdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi0gICAgLy8gZGV0ZWN0IGxpbmtzIGJldHdlZW4gZmlsZXMgdG8gdGhlIHNlYXJjaCBwcm92aWRlcnMvY29udHJpYnV0b3JzLgotICAgIC8vIFRoZSBjdXJyZW50IGNvZGUgb25seSBoYW5kbGVzIHRoZSBYU0QgYW5kIFdTREwgY2FzZXMuIAotICAgIAotCQlpZigiaW1wb3J0Ii5lcXVhbHMobG9jYWxOYW1lKSAmJiBuYW1lc3BhY2VNYXRjaGVzKHVyaSkpeyAvLyROT04tTkxTLTEkCi0JCQlGaWxlUmVmZXJlbmNlRW50cnkgZG9jdW1lbnRFbnRyeSA9IG5ldyBGaWxlUmVmZXJlbmNlRW50cnkoKTsKLQkJCWRvY3VtZW50RW50cnkuc2V0Q2F0ZWdvcnkoSVhNTFNlYXJjaENvbnN0YW50cy5SRUYpOwotCQkJZG9jdW1lbnRFbnRyeS5zZXRLZXkoImltcG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmFtZXNwYWNlID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZXNwYWNlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoZ2V0TG9jYXRpb25BdHRyaWJ1dGVOYW1lKHVyaSkpOyAvLyROT04tTkxTLTEkCi0JCQlkb2N1bWVudEVudHJ5LnNldFB1YmxpY0lkZW50aWZpZXIobmFtZXNwYWNlKTsKLQkJCWRvY3VtZW50RW50cnkuc2V0UmVsYXRpdmVGaWxlUGF0aChsb2NhdGlvbik7ICAgICAgICAgICAgCi0JCQlkb2N1bWVudC5wdXRFbnRyeShkb2N1bWVudEVudHJ5KTsKLQkJfQotCQlpZigoInJlZGVmaW5lIi5lcXVhbHMobG9jYWxOYW1lKXx8ICJpbmNsdWRlIi5lcXVhbHMobG9jYWxOYW1lKSkgJiYgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbmFtZXNwYWNlTWF0Y2hlcyh1cmkpKXsKLQkJCUZpbGVSZWZlcmVuY2VFbnRyeSBkb2N1bWVudEVudHJ5ID0gbmV3IEZpbGVSZWZlcmVuY2VFbnRyeSgpOwotCQkJZG9jdW1lbnRFbnRyeS5zZXRDYXRlZ29yeShJWE1MU2VhcmNoQ29uc3RhbnRzLlJFRik7Ci0JCQlkb2N1bWVudEVudHJ5LnNldEtleSgiaW5jbHVkZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbG9jYXRpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGdldExvY2F0aW9uQXR0cmlidXRlTmFtZSh1cmkpKTsgLy8kTk9OLU5MUy0xJAotCQkJZG9jdW1lbnRFbnRyeS5zZXRQdWJsaWNJZGVudGlmaWVyKHVyaSk7Ci0JCQlkb2N1bWVudEVudHJ5LnNldFJlbGF0aXZlRmlsZVBhdGgobG9jYXRpb24pOwotCQkJZG9jdW1lbnQucHV0RW50cnkoZG9jdW1lbnRFbnRyeSk7Ci0JCX0KLQkJCi0JCQotICAgICAgICAvLyBpc3N1ZSAoY3MpIHlvdSBtYXkgd2FudCB0byB0cnkgcGVyZiBtZWFzdXJlbWVudHMgdG8gY29tcGF0ZSByZXVzaW5nIHRoZSBzYW1lCi0gICAgICAgIC8vIGluc3RhbmNlIG9mIGEgU0FYU2VhcmNoRWxlbWVudCBpbnN0ZWFkIG9mIG5ld2luZyBvbmUgZWFjaCB0aW1lIAotCQkvL1hNTFNlYXJjaFBhdHRlcm4uU0FYU2VhcmNoRWxlbWVudCBzZWFyY2hFbGVtZW50ID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4uU0FYU2VhcmNoRWxlbWVudCgpOwotCQlzZWFyY2hFbGVtZW50LnNldEVsZW1lbnROYW1lKGxvY2FsTmFtZSk7Ci0JCXNlYXJjaEVsZW1lbnQuc2V0RWxlbWVudE5hbWVzcGFjZSh1cmkpOwotCQlzZWFyY2hFbGVtZW50LnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCXNlYXJjaEVsZW1lbnQuc2V0TmFtZXNwYWNlTWFwKG5hbWVzcGFjZU1hcCk7Ci0JCXNlYXJjaEVsZW1lbnQuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0JCWlmIChjdXJyZW50UGF0aC5zaXplKCkgPiAwKQotCQl7Ci0JCSAgU3RyaW5nIHBhcmVudE5hbWUgPSAoU3RyaW5nKWN1cnJlbnRQYXRoLnBlZWsoKTsKLQkJICBzZWFyY2hFbGVtZW50LnNldFBhcmVudE5hbWUocGFyZW50TmFtZSk7Ci0JCX0JCQkKLQkKLQotCQlpZihtYXRjaGVyICE9IG51bGwpewotCQkJaWYobWF0Y2hlci5tYXRjaGVzKHBhdHRlcm4sIHNlYXJjaEVsZW1lbnQpKXsKLQkJCQloYXNNYXRjaCA9IHRydWU7Ci0JCQkJaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4pewotCQkJCQlDb21wb25lbnRSZWZlcmVuY2VFbnRyeSBkb2N1bWVudEVudHJ5ID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZUVudHJ5KCk7Ci0JCQkJCWRvY3VtZW50RW50cnkuc2V0Q2F0ZWdvcnkoSVhNTFNlYXJjaENvbnN0YW50cy5DT01QT05FTlRfUkVGKTsKLQkJCQkJUXVhbGlmaWVkTmFtZSBuYW1lID0gbmV3IFF1YWxpZmllZE5hbWUodXJpLCBsb2NhbE5hbWUpOwotCQkJCQlkb2N1bWVudEVudHJ5LnNldEtleShuYW1lLnRvU3RyaW5nKCkpOwotCQkJCQlkb2N1bWVudEVudHJ5LnNldE5hbWUobmFtZSk7Ci0JCQkJCWRvY3VtZW50LnB1dEVudHJ5KGRvY3VtZW50RW50cnkpOwotCQkJCX0KLQkJCQllbHNlIGlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4pewotCQkJCQlDb21wb25lbnREZWNsYXJhdGlvbkVudHJ5IGRvY3VtZW50RW50cnkgPSBuZXcgQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeSgpOwotCQkJCQlkb2N1bWVudEVudHJ5LnNldENhdGVnb3J5KElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX0RFQ0wpOwotICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZWROYW1lIG5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZSh0YXJnZXROYW1lc3BhY2UsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKHVyaSwgbG9jYWxOYW1lKTsgICAgICAgICAgICAgICAgICAgIAotCQkJCQlkb2N1bWVudEVudHJ5LnNldEtleShuYW1lLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudEVudHJ5LnNldE5hbWUobmFtZSk7Ci0JCQkJCWRvY3VtZW50RW50cnkuc2V0TWV0YU5hbWUobWV0YU5hbWUpOwotCQkJCQlkb2N1bWVudC5wdXRFbnRyeShkb2N1bWVudEVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY3VycmVudFBhdGgucHVzaChsb2NhbE5hbWUpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25BdHRyaWJ1dGVOYW1lKFN0cmluZyB1cmkpCi0gIHsKLSAgICBpZiAoWE1MU0NIRU1BX05BTUVTUEFDRS5lcXVhbHModXJpKSkKLSAgICB7Ci0gICAgICByZXR1cm4gInNjaGVtYUxvY2F0aW9uIjsKLSAgICB9Ci0gICAgCi0gICAgZWxzZSBpZiAoV1NETF9OQU1FU1BBQ0UuZXF1YWxzKHVyaSkpCi0gICAgewotICAgICAgcmV0dXJuICJsb2NhdGlvbiI7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBuYW1lc3BhY2VNYXRjaGVzKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gWE1MU0NIRU1BX05BTUVTUEFDRS5lcXVhbHModXJpKSB8fAotICAgICAgICAgIFdTRExfTkFNRVNQQUNFLmVxdWFscyh1cmkpOwotICB9Ci0JCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0JewotCQljdXJyZW50UGF0aC5wb3AoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsYmFjayBmb3IgU0FYIHBhcnNlcgotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRQcmVmaXhNYXBwaW5nKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0JewotCQlpZiAoYXJnMCAhPSBudWxsICYmIGFyZzAubGVuZ3RoKCkgPiAwKQotCQl7Ci0JCQl0aGlzLm5hbWVzcGFjZU1hcC5wdXQoYXJnMCwgYXJnMSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotCQl0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNNYXRjaCgpIHsKLQkJcmV0dXJuIGhhc01hdGNoOwotCX0KLQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0Fubm90YXRpb25Nc2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0Fubm90YXRpb25Nc2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJhNjVkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9Bbm5vdGF0aW9uTXNnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbk1zZyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPQk1MRU1fSUQgPSAiUHJvYmxlbUlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExFTkdUSCA9ICJMZW5ndGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVRUUlZBTFVFVEVYVCA9ICJBdHRyaWJ1dGVWYWx1ZVRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVRUUlZBTFVFTk8gPSAiQXR0cmlidXRlVmFsdWVObyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBVFRSTk8gPSAiQXR0ck5vIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgaW50IHByb2JsZW1JZDsKLQlwcml2YXRlIE9iamVjdCBhdHRyaWJ1dGVWYWx1ZVRleHQ7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoOwotCQotCXB1YmxpYyBBbm5vdGF0aW9uTXNnKGludCBwcm9ibGVtSWQsIE9iamVjdCBhdHRyaWJ1dGVWYWx1ZVRleHQsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcm9ibGVtSWQgPSBwcm9ibGVtSWQ7Ci0JCXRoaXMuYXR0cmlidXRlVmFsdWVUZXh0ID0gYXR0cmlidXRlVmFsdWVUZXh0OwotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0JcHVibGljIGludCBnZXRQcm9ibGVtSWQoKSB7Ci0JCXJldHVybiBwcm9ibGVtSWQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGVWYWx1ZVRleHQoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVWYWx1ZVRleHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKXsKLQkJcmV0dXJuIGxlbmd0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9NYXJrdXBWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL01hcmt1cFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmQxOWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL01hcmt1cFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTG9jYWxpemVkTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBCYXNpYyBYTUwgc3ludGF4IGNoZWNraW5nIHN0ZXAuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrdXBWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfRVJST1JfTElNSVQgPSAyNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJUSUFMID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1RBTCA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgRFFVT1RFID0gIlwiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIFNRVU9URSA9ICInIjsgLy8kTk9OLU5MUy0xJAotCQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZlJvb3RDb250ZW50VHlwZSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIElSZXBvcnRlciBmUmVwb3J0ZXIgPSBudWxsOwotICAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTk1TRyA9IEFubm90YXRpb25Nc2cuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIHZvaWQgZ2V0QW5ub3RhdGlvbk1zZyhJUmVwb3J0ZXIgcmVwb3J0ZXIsIGludCBwcm9ibGVtSWQsIExvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSwgT2JqZWN0IGF0dHJpYnV0ZVZhbHVlVGV4dCwgaW50IGxlbil7Ci0JCUFubm90YXRpb25Nc2cgYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uTXNnKHByb2JsZW1JZCwgYXR0cmlidXRlVmFsdWVUZXh0LGxlbik7Ci0JCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKEFOTk9UQVRJT05NU0csIGFubm90YXRpb24pOwotCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCX0KLQkKLQkJCi0JcHJpdmF0ZSB2b2lkIGFkZEF0dHJpYnV0ZUVycm9yKFN0cmluZyBtZXNzYWdlVGV4dCwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlVGV4dCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBpbnQgcHJvYmxlbUlkLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIGludCBtZXNzYWdlU2V2ZXJpdHkpIHsKLQotCQlpZiAoc2RSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBsaW5lTm8gPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UobWVzc2FnZVNldmVyaXR5LCBtZXNzYWdlVGV4dCk7Ci0JCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQkJCi0KLQkJZ2V0QW5ub3RhdGlvbk1zZyhyZXBvcnRlciwgcHJvYmxlbUlkLCBtZXNzYWdlLCBhdHRyaWJ1dGVWYWx1ZVRleHQsbGVuZ3RoKTsKLQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQXR0cmlidXRlc0luRW5kVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpbnQgZXJyb3JDb3VudCA9IDA7Ci0JCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IChpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpKSAmJiAoZXJyb3JDb3VudCA8IEVMRU1FTlRfRVJST1JfTElNSVQpICYmICFzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpKTsKLQkJCWlmICgodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHx8ICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSkgewotCQkJCWlmIChzdGFydCA+IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh0ZXh0UmVnaW9uKSkgewotCQkJCQlzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh0ZXh0UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZW5kID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCh0ZXh0UmVnaW9uKTsKLQkJCQllcnJvckNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJLy8gY3JlYXRlIG9uZSBlcnJvciBmb3IgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIGVuZCB0YWcKLQkJaWYgKGVycm9yQ291bnQgPiAwKSB7Ci0JCQkvLyBQb3NpdGlvbiBwID0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBYTUxDb3JlTWVzc2FnZXMuRW5kX3RhZ19oYXNfYXR0cmlidXRlczsKLQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGdldFBsdWdpblByZWZlcmVuY2UoKS5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTkRfVEFHX1dJVEhfQVRUUklCVVRFUyksIG1lc3NhZ2VUZXh0KTsKLQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGVuZCAtIHN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGdldExpbmVOdW1iZXIoc3RhcnQpKTsKLQotCQkJZ2V0QW5ub3RhdGlvbk1zZyhyZXBvcnRlciwgUHJvYmxlbUlEc1hNTC5BdHRyc0luRW5kVGFnLCBtZXNzYWdlLCBudWxsLGVuZC1zdGFydCk7Ci0JCQkKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2xvc2luZ0JyYWNrZXQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCWJvb2xlYW4gY2xvc2VkID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyAoaSA8IHJlZ2lvbnMuc2l6ZSgpKSAmJiAhc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmICgoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSkgewotCQkJCWNsb3NlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFjbG9zZWQpIHsKLQotCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gWE1MQ29yZU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNjsKLQotCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgbGVuZ3RoID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCk7Ci0JCQlpbnQgbGluZU5vID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0KLQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGdldFBsdWdpblByZWZlcmVuY2UoKS5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX0NMT1NJTkdfQlJBQ0tFVCkgLCBtZXNzYWdlVGV4dCk7Ci0JCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQkJCWdldEFubm90YXRpb25Nc2cocmVwb3J0ZXIsIFByb2JsZW1JRHNYTUwuTWlzc2luZ0Nsb3NpbmdCcmFja2V0LCBtZXNzYWdlLCBudWxsLGxlbmd0aCk7Ci0KLQkJCQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRW1wdHlUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG5hdmlnYXRlIHRvIG5hbWUKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucy5zaXplKCkgPT0gMikgewotCQkJLy8gbWlzc2luZyBuYW1lIHJlZ2lvbgotCQkJaWYgKChyZWdpb25zLmdldCgwKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pICYmIChyZWdpb25zLmdldCgxKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSkgewotCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTENvcmVNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzM7Ci0JCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQlpbnQgbGluZU5vID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0KLQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShnZXRQbHVnaW5QcmVmZXJlbmNlKCkuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUlTU0lOR19UQUdfTkFNRSkgLCBtZXNzYWdlVGV4dCk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQotCQkJCWdldEFubm90YXRpb25Nc2cocmVwb3J0ZXIsIFByb2JsZW1JRHNYTUwuRW1wdHlUYWcsIG1lc3NhZ2UsIG51bGwsbGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGdldExpbmVOdW1iZXIoaW50IHN0YXJ0KSB7Ci0JCWludCBsaW5lTm8gPSAtMTsKLQkJdHJ5IHsKLQkJCWxpbmVObyA9IGdldERvY3VtZW50KCkuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KSArIDE7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIGxpbmVObzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tGb3JBdHRyaWJ1dGVWYWx1ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGNoZWNrIGZvciBhdHRyaWJ1dGVzIHdpdGhvdXQgYSB2YWx1ZQotCQkvLyB0cmFjayB0aGUgYXR0cmlidXRlL2VxdWFscy92YWx1ZSBzZXF1ZW5jZSB1c2luZyBhIHN0YXRlIG9mIDAsIDEgLDIKLQkJLy8gcmVwcmVzZW50aW5nIHRoZSBuYW1lLCA9LCBhbmQgdmFsdWUsIHJlc3BlY3RpdmVseQotCQlpbnQgYXR0clN0YXRlID0gMDsKLQkJSVRleHRSZWdpb25MaXN0IHRleHRSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJLy8gUmVjb25jaWxlQW5ub3RhdGlvbktleSBrZXkgPSBjcmVhdGVLZXkoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLAotCQkvLyBnZXRTY29wZSgpKTsKLQotCQlpbnQgZXJyb3JDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyAoaSA8IHRleHRSZWdpb25zLnNpemUoKSkgJiYgKGVycm9yQ291bnQgPCBFTEVNRU5UX0VSUk9SX0xJTUlUKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKCh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHx8IGlzVGFnQ2xvc2VUZXh0UmVnaW9uKHRleHRSZWdpb24pKSB7Ci0JCQkJLy8gZGFuZ2xpbmcgbmFtZSBhbmQgJz0nCi0JCQkJaWYgKChhdHRyU3RhdGUgPT0gMikgJiYgKGkgPj0gMikpIHsKLQkJCQkJLy8gY3JlYXRlIGFubm90YXRpb24KLQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpIC0gMik7Ci0JCQkJCWlmICghKG5hbWVSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7c3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQobmFtZVJlZ2lvbil9OwotCQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gTkxTLmJpbmQoWE1MQ29yZU1lc3NhZ2VzLkF0dHJpYnV0ZV9faXNfbWlzc2luZ19hX3ZhbHVlLCBhcmdzKTsKLQotCQkJCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pOwotCQkJCQkJaW50IGVuZCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCWludCBsaW5lTm8gPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLQkJCQkJCWludCB0ZXh0TGVuZ3RoID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQobmFtZVJlZ2lvbikudHJpbSgpLmxlbmd0aCgpOwotCi0JCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShnZXRQbHVnaW5QcmVmZXJlbmNlKCkuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX0hBU19OT19WQUxVRSkgLCBtZXNzYWdlVGV4dCk7Ci0JCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCQltZXNzYWdlLnNldExlbmd0aCh0ZXh0TGVuZ3RoKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0KLQkJCQkJCS8vIHF1aWNrIGZpeCBpbmZvCi0JCQkJCQlJVGV4dFJlZ2lvbiBlcXVhbHNSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoaSAtIDIgKyAxKTsKLQkJCQkJCWludCBpbnNlcnRPZmZzZXQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChlcXVhbHNSZWdpb24pIC0gZW5kOwotCQkJCQkJT2JqZWN0W10gYWRkaXRpb25hbEZpeEluZm8gPSB7c3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQobmFtZVJlZ2lvbiksIG5ldyBJbnRlZ2VyKGluc2VydE9mZnNldCl9OwotCi0JCQkJCQlnZXRBbm5vdGF0aW9uTXNnKHJlcG9ydGVyLCBQcm9ibGVtSURzWE1MLk1pc3NpbmdBdHRyVmFsdWUsIG1lc3NhZ2UsIGFkZGl0aW9uYWxGaXhJbmZvLHRleHRMZW5ndGgpOwotCQkJCQkJZXJyb3JDb3VudCsrOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIG5hbWUgYnV0IG5vICc9JyAoWE1MIG9ubHkpCi0JCQkJZWxzZSBpZiAoKGF0dHJTdGF0ZSA9PSAxKSAmJiAoaSA+PSAxKSkgewotCQkJCQkvLyBjcmVhdGUgYW5ub3RhdGlvbgotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1JlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpIC0gMSk7Ci0JCQkJCWlmICghKHByZXZpb3VzUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKSB7Ci0JCQkJCQlPYmplY3RbXSBhcmdzID0ge3N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHByZXZpb3VzUmVnaW9uKX07Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBOTFMuYmluZChYTUxDb3JlTWVzc2FnZXMuQXR0cmlidXRlX19oYXNfbm9fdmFsdWUsIGFyZ3MpOwotCQkJCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHByZXZpb3VzUmVnaW9uKTsKLQkJCQkJCWludCB0ZXh0TGVuZ3RoID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocHJldmlvdXNSZWdpb24pLnRyaW0oKS5sZW5ndGgoKTsKLQkJCQkJCWludCBsaW5lTm8gPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLQotCQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZ2V0UGx1Z2luUHJlZmVyZW5jZSgpLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9IQVNfTk9fVkFMVUUpLCBtZXNzYWdlVGV4dCk7Ci0JCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCQltZXNzYWdlLnNldExlbmd0aCh0ZXh0TGVuZ3RoKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0KLQkJCQkJCWdldEFubm90YXRpb25Nc2cocmVwb3J0ZXIsIFByb2JsZW1JRHNYTUwuTm9BdHRyVmFsdWUsIG1lc3NhZ2UsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHByZXZpb3VzUmVnaW9uKSx0ZXh0TGVuZ3RoKTsKLQkJCQkKLQotCQkJCQkJZXJyb3JDb3VudCsrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWF0dHJTdGF0ZSA9IDE7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCWF0dHJTdGF0ZSA9IDI7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJYXR0clN0YXRlID0gMDsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yU3BhY2VCZWZvcmVOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgc2RSZWdpb25UZXh0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCWlmIChzZFJlZ2lvblRleHQuc3RhcnRzV2l0aCgiICIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldiA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJCS8vIHRoaXMgaXMgcG9zc2libHkgdGhlIGNhc2Ugb2YgIjwgdGFnIgotCQkJCWlmICgocHJldi5nZXRSZWdpb25zKCkuc2l6ZSgpID09IDEpICYmIGlzU3RhcnRUYWcocHJldikpIHsKLQkJCQkJLy8gYWRkIHRoZSBlcnJvciBmb3IgcHJlY2VkaW5nIHNwYWNlIGluIHRhZyBuYW1lCi0JCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTENvcmVNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzI7Ci0JCQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkvLyBmaW5kIGxlbmd0aCBvZiB3aGl0ZXNwYWNlCi0JCQkJCWludCBsZW5ndGggPSBzZFJlZ2lvblRleHQudHJpbSgpLmVxdWFscygiIikgPyBzZFJlZ2lvblRleHQubGVuZ3RoKCkgOiBzZFJlZ2lvblRleHQuaW5kZXhPZihzZFJlZ2lvblRleHQudHJpbSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGdldFBsdWdpblByZWZlcmVuY2UoKS5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5XSElURVNQQUNFX0JFRk9SRV9UQUdOQU1FKSAsIG1lc3NhZ2VUZXh0KTsKLQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCQltZXNzYWdlLnNldExpbmVObyhnZXRMaW5lTnVtYmVyKHN0YXJ0KSk7Ci0JCQkJCWdldEFubm90YXRpb25Nc2cocmVwb3J0ZXIsIFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlVGFnTmFtZSwgbWVzc2FnZSwgbnVsbCxsZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja05vTmFtZXNwYWNlSW5QSShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbmF2aWdhdGUgdG8gbmFtZQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlpbnQgZXJyb3JDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyAoaSA8IHJlZ2lvbnMuc2l6ZSgpKSAmJiAoZXJyb3JDb3VudCA8IEVMRU1FTlRfRVJST1JfTElNSVQpICYmICFzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCk7IGkrKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJU3RyaW5nIHBpVGV4dCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCWludCBpbmRleCA9IHBpVGV4dC5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gWE1MQ29yZU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNDsKLQkJCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpICsgaW5kZXg7Ci0JCQkJCWludCBsZW5ndGggPSBwaVRleHQudHJpbSgpLmxlbmd0aCgpIC0gaW5kZXg7Ci0KLQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZ2V0UGx1Z2luUHJlZmVyZW5jZSgpLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLk5BTUVTUEFDRV9JTl9QSV9UQVJHRVQpICwgbWVzc2FnZVRleHQpOwotCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGdldExpbmVOdW1iZXIoc3RhcnQpKTsKLQotCQkJCQkKLQkJCQkJZ2V0QW5ub3RhdGlvbk1zZyhyZXBvcnRlciwgUHJvYmxlbUlEc1hNTC5OYW1lc3BhY2VJblBJLCBtZXNzYWdlLCBudWxsLGxlbmd0aCk7Ci0KLQkJCQkJZXJyb3JDb3VudCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1F1b3Rlc0ZvckF0dHJpYnV0ZVZhbHVlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCVN0cmluZyBhdHRyVmFsdWVUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGVycm9yQ291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgKGkgPCByZWdpb25zLnNpemUoKSkgJiYgKGVycm9yQ291bnQgPCBFTEVNRU5UX0VSUk9SX0xJTUlUKTsgaSsrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlhdHRyVmFsdWVUZXh0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocik7Ci0JCQkvLyBhdHRyaWJ1dGUgdmFsdWUgaW5jbHVkZXMgcXVvdGVzIGluIHRoZSBzdHJpbmcKLQkJCS8vIHNwbGl0IHVwIGF0dHJpYnV0ZSB2YWx1ZSBvbiBxdW90ZXMKLQkJCS8qCi0JCQkgKiBXT1JLQVJPVU5EIHRpbGwKLQkJCSAqIGh0dHA6Ly9kZXYuaWN1LXByb2plY3Qub3JnL2NnaS1iaW4vaWN1LWJ1Z3MvaW5jb21pbmc/ZmluZGlkPTUyMDcKLQkJCSAqIGlzIGZpeGVkLiAoQWxzbyBzZWUgQlVHMTQzNjI4KQotCQkJICovCi0KLQkJCWphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWVUZXh0LCAiXCInIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLQkJCS8vIGdldCB0aGUgcGllY2VzIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkJCVN0cmluZyBvbmUgPSAiIiwgdHdvID0gIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKHNpemUgPiAwKSB7Ci0JCQkJb25lID0gc3QubmV4dFRva2VuKCk7Ci0JCQl9Ci0JCQlpZiAoc2l6ZSA+IDEpIHsKLQkJCQl0d28gPSBzdC5uZXh0VG9rZW4oKTsKLQkJCX0KLQkJCWlmIChzaXplID4gMikgewotCQkJCS8vIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHBhcnNpbmcuLi4KLQkJCQkvLyBhcyBpbiB3ZSBjYW4ndCBoYXZlIGFuIGF0dHJpYnV0ZSB2YWx1ZSBsaWtlOiA8ZWxlbWVudAotCQkJCS8vIGF0dHI9ImEiYiJjIi8+Ci0JCQkJLy8gYW5kIDxlbGVtZW50IGF0dHI9J2EiYiJjJyAvPiBpcyBsZWdhbAotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0KLQkJCWlmIChzaXplID09IDEpIHsKLQkJCQlpZiAob25lLmVxdWFscyhEUVVPVEUpIHx8IG9uZS5lcXVhbHMoU1FVT1RFKSkgewotCQkJCQkvLyBtaXNzaW5nIGNsb3NpbmcgcXVvdGUKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBYTUxDb3JlTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF8wOwotCQkJCQlhZGRBdHRyaWJ1dGVFcnJvcihtZXNzYWdlLCBhdHRyVmFsdWVUZXh0LCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQociksIGF0dHJWYWx1ZVRleHQudHJpbSgpLmxlbmd0aCgpLCBQcm9ibGVtSURzWE1MLlVuY2xhc3NpZmllZCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlciwgZ2V0UGx1Z2luUHJlZmVyZW5jZSgpLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLk1JU1NJTkdfQ0xPU0lOR19RVU9URSkpOwotCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBtaXNzaW5nIGJvdGgKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBYTUxDb3JlTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF8xOwotCQkJCQlhZGRBdHRyaWJ1dGVFcnJvcihtZXNzYWdlLCBhdHRyVmFsdWVUZXh0LCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQociksIGF0dHJWYWx1ZVRleHQudHJpbSgpLmxlbmd0aCgpLCBQcm9ibGVtSURzWE1MLkF0dHJWYWx1ZU5vdFF1b3RlZCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlciwgZ2V0UGx1Z2luUHJlZmVyZW5jZSgpLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLk1JU1NJTkdfQ0xPU0lOR19RVU9URSkpOwotCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoc2l6ZSA9PSAyKSB7Ci0JCQkJaWYgKChvbmUuZXF1YWxzKFNRVU9URSkgJiYgIXR3by5lcXVhbHMoU1FVT1RFKSkgfHwgKG9uZS5lcXVhbHMoRFFVT1RFKSAmJiAhdHdvLmVxdWFscyhEUVVPVEUpKSkgewotCQkJCQkvLyBtaXNzaW5nIGNsb3NpbmcgcXVvdGUKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBYTUxDb3JlTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF8wOwotCQkJCQlhZGRBdHRyaWJ1dGVFcnJvcihtZXNzYWdlLCBhdHRyVmFsdWVUZXh0LCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQociksIGF0dHJWYWx1ZVRleHQudHJpbSgpLmxlbmd0aCgpLCBQcm9ibGVtSURzWE1MLlVuY2xhc3NpZmllZCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlciwgZ2V0UGx1Z2luUHJlZmVyZW5jZSgpLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLk1JU1NJTkdfQ0xPU0lOR19RVU9URSkpOwotCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGVuZCBvZiByZWdpb24gZm9yIGxvb3AKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tTdGFydEVuZFRhZ1BhaXJzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmIChzZFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgc3RhcnQvZW5kIHRhZyBwYWlycwotCQlJRE9NTm9kZSB4bWxOb2RlID0gZ2V0WE1MTm9kZShzZFJlZ2lvbik7Ci0KLQkJaWYgKHhtbE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBzZWxmQ2xvc2VkID0gZmFsc2U7Ci0JCVN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQotCQkvKioKLQkJICogRm9yIHRhZ3MgdGhhdCBhcmVuJ3QgbWVhbnQgdG8gYmUgRU1QVFksIG1ha2Ugc3VyZSBpdCdzIGVtcHR5IG9yIGhhcyBhbiBlbmQgdGFnCi0JCSAqLwotCQlpZiAoeG1sTm9kZS5pc0NvbnRhaW5lcigpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IHhtbE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZW5kUmVnaW9uID09IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uID0geG1sTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChzdGFydFJlZ2lvbiAhPSBudWxsICYmICFzdGFydFJlZ2lvbi5pc0RlbGV0ZWQoKSAmJiBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTi5lcXVhbHMoc3RhcnRSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkpKSB7Ci0JCQkJCS8vIGFuYWx5emUgdGhlIHRhZyAoY2hlY2sgc2VsZiBjbG9zaW5nKQotCQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCQkJCWludCBzdGFydCA9IHNkUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCWludCBsZW5ndGggPSBzZFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCQkJdGFnTmFtZSA9IHNkUmVnaW9uLmdldFRleHQocik7Ci0JCQkJCQkJc3RhcnQgPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyKTsKLQkJCQkJCQlsZW5ndGggPSByLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCQkJCXNlbGZDbG9zZWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0KLQotCQkJCQlpZiAoIXNlbGZDbG9zZWQgJiYgKHRhZ05hbWUgIT0gbnVsbCkpIHsKLQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7dGFnTmFtZX07Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBOTFMuYmluZChYTUxDb3JlTWVzc2FnZXMuTWlzc2luZ19lbmRfdGFnXywgYXJncyk7Ci0KLQkJCQkJCWludCBsaW5lTnVtYmVyID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0KLQkJCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGdldFBsdWdpblByZWZlcmVuY2UoKS5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX0VORF9UQUcpICwgbWVzc2FnZVRleHQpOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVOdW1iZXIpOwotCQkJCQkJT2JqZWN0W10gYWRkaXRpb25hbEZpeEluZm8gPSBnZXRTdGFydEVuZEZpeEluZm8oeG1sTm9kZSwgdGFnTmFtZSwgcik7Ci0JCi0JCQkJCQlnZXRBbm5vdGF0aW9uTXNnKHJlcG9ydGVyLCBQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcsIG1lc3NhZ2UsIGFkZGl0aW9uYWxGaXhJbmZvLGxlbmd0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uID0geG1sTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChzdGFydFJlZ2lvbiA9PSBudWxsIHx8IHN0YXJ0UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQkJCS8vIGFuYWx5emUgdGhlIHRhZyAoY2hlY2sgc2VsZiBjbG9zaW5nKQotCQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGVuZFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQkJCQlpbnQgc3RhcnQgPSBzZFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpbnQgbGVuZ3RoID0gc2RSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQkJCXRhZ05hbWUgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCQkJCXN0YXJ0ID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocik7Ci0JCQkJCQkJbGVuZ3RoID0gci5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3RbXSBhcmdzID0ge3RhZ05hbWV9OwotCQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gTkxTLmJpbmQoWE1MQ29yZU1lc3NhZ2VzLk1pc3Npbmdfc3RhcnRfdGFnXywgYXJncyk7Ci0KLQkJCQkJCWludCBsaW5lTnVtYmVyID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0KLQkJCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGdldFBsdWdpblByZWZlcmVuY2UoKS5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX1NUQVJUX1RBRyksIG1lc3NhZ2VUZXh0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTnVtYmVyKTsKLQkJCQkJCU9iamVjdFtdIGFkZGl0aW9uYWxGaXhJbmZvID0gZ2V0U3RhcnRFbmRGaXhJbmZvKHhtbE5vZGUsIHRhZ05hbWUsIHIpOwotCQkJCQkJCQkJCQkJCi0JCQkJCQlnZXRBbm5vdGF0aW9uTXNnKHJlcG9ydGVyLCBQcm9ibGVtSURzWE1MLk1pc3NpbmdTdGFydFRhZywgbWVzc2FnZSwgYWRkaXRpb25hbEZpeEluZm8sbGVuZ3RoKTsKLQkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJLyoKLQkJICogQ2hlY2sgZm9yIGFuIGVuZCB0YWcgdGhhdCBoYXMgbm8gc3RhcnQgdGFnCi0JCSAqLwotCQllbHNlIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRSZWdpb24gPSB4bWxOb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoc3RhcnRSZWdpb24gPT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0geG1sTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoIWVuZFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJCQkvLyBnZXQgbmFtZQotCQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGVuZFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQkJCXRhZ05hbWUgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKCFzZWxmQ2xvc2VkICYmICh0YWdOYW1lICE9IG51bGwpKSB7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBYTUxDb3JlTWVzc2FnZXMuSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllc19lcnJvcjsKLQotCQkJCQkJaW50IHN0YXJ0ID0gc2RSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJCWludCBsaW5lTnVtYmVyID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0KLQkJCQkJCS8vIFNFVkVSSVRZX1NUUlVDVFVSRSA9PSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZCi0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgoc2RSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVOdW1iZXIpOwotCi0JCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRTdGFydEVuZEZpeEluZm8oSURPTU5vZGUgeG1sTm9kZSwgU3RyaW5nIHRhZ05hbWUsIElUZXh0UmVnaW9uIHIpIHsKLQkJLy8gcXVpY2sgZml4IGluZm8KLQkJU3RyaW5nIHRhZ0Nsb3NlID0gIi8+IjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgdGFnQ2xvc2VPZmZzZXQgPSB4bWxOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmICgociAhPSBudWxsKSAmJiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSkgewotCQkJdGFnQ2xvc2UgPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJCXRhZ0Nsb3NlT2Zmc2V0LS07Ci0JCX0KLQkJSURPTU5vZGUgZmlyc3RDaGlsZCA9IChJRE9NTm9kZSkgeG1sTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlICgoZmlyc3RDaGlsZCAhPSBudWxsKSAmJiAoZmlyc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSkgewotCQkJZmlyc3RDaGlsZCA9IChJRE9NTm9kZSkgZmlyc3RDaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCWludCBlbmRPZmZzZXQgPSB4bWxOb2RlLmdldEVuZE9mZnNldCgpOyAKLQkJaW50IGZpcnN0Q2hpbGRTdGFydE9mZnNldCA9IGZpcnN0Q2hpbGQgPT0gbnVsbCA/IGVuZE9mZnNldCA6IGZpcnN0Q2hpbGQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJT2JqZWN0W10gYWRkaXRpb25hbEZpeEluZm8gPSB7dGFnTmFtZSwgdGFnQ2xvc2UsIG5ldyBJbnRlZ2VyKHRhZ0Nsb3NlT2Zmc2V0KSwgbmV3IEludGVnZXIoeG1sTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpKSwgLy8gc3RhcnRUYWdFbmRPZmZzZXQKLQkJCQkJbmV3IEludGVnZXIoZmlyc3RDaGlsZFN0YXJ0T2Zmc2V0KSwgLy8gZmlyc3RDaGlsZFN0YXJ0T2Zmc2V0Ci0JCQkJCW5ldyBJbnRlZ2VyKGVuZE9mZnNldCl9OyAvLyBlbmRPZmZzZXQKLQkJcmV0dXJuIGFkZGl0aW9uYWxGaXhJbmZvOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1N0YXJ0aW5nU3BhY2VGb3JQSShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCWlmICgocHJldiAhPSBudWxsKSAmJiBwcmV2LmdldFN0YXJ0T2Zmc2V0KCkgPT0gMCkgewotCQkJaWYgKHByZXYuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBYTUxDb3JlTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF81OwotCQkJCWludCBzdGFydCA9IHByZXYuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgbGVuZ3RoID0gcHJldi5nZXRMZW5ndGgoKTsKLQotCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGdldFBsdWdpblByZWZlcmVuY2UoKS5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5XSElURVNQQUNFX0FUX1NUQVJUKSAsIG1lc3NhZ2VUZXh0KTsKLQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCQltZXNzYWdlLnNldExpbmVObyhnZXRMaW5lTnVtYmVyKHN0YXJ0KSk7Ci0KLQkJCQotCQkJCWdldEFubm90YXRpb25Nc2cocmVwb3J0ZXIsIFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlUEksIG1lc3NhZ2UsIG51bGwsbGVuZ3RoKTsKLQkJCQkKLQkJCQkvLyBQb3NpdGlvbiBwID0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBsZW5ndGgpOwotCQkJCS8vCQkJCQotCQkJCS8vIFJlY29uY2lsZUFubm90YXRpb25LZXkga2V5ID0KLQkJCQkvLyBjcmVhdGVLZXkoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBnZXRTY29wZSgpKTsKLQkJCQkvLyBUZW1wb3JhcnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBuZXcgVGVtcG9yYXJ5QW5ub3RhdGlvbihwLAotCQkJCS8vIFNFVkVSSVRZX1NZTlRBWF9FUlJPUiwgbWVzc2FnZSwga2V5LAotCQkJCS8vIFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlUEkpOwotCQkJCS8vIHJlc3VsdHMuYWRkKGFubm90YXRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIFBBUlRJQUw7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBnZXRYTUxOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQotCQlpZiAoc2RSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIHhNb2RlbCA9IG51bGw7Ci0JCUlET01Ob2RlIHhtbE5vZGUgPSBudWxsOwotCQkvLyBnZXQvcmVsZWFzZSBtb2RlbHMgc2hvdWxkIGFsd2F5cyBiZSBpbiBhIHRyeS9maW5hbGx5IGJsb2NrCi0JCXRyeSB7Ci0JCQl4TW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJLy8geE1vZGVsIGlzIHNvbWV0aW1lIG51bGwsIHdoZW4gY2xvc2luZyBlZGl0b3IsIGZvciBleGFtcGxlCi0JCQlpZiAoeE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxOb2RlID0gKElET01Ob2RlKSB4TW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmICh4TW9kZWwgIT0gbnVsbCkgewotCQkJCXhNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4geG1sTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgYSBYTUwgImVuZCB0YWciCi0JICogc2luY2UgdGhleSdyZSBub3QgYWxsb3dlZCB0byBoYXZlIGF0dHJpYnV0ZSBJVGV4dFJlZ2lvbnMKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5kVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmICgoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHx8IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgYW4gWE1MIFByb2Nlc3NpbmcKLQkgKiBJbnN0cnVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNQSShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU47Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGEgWE1MICJzdGFydCB0YWciCi0JICogc2luY2UgdGhleSBuZWVkIHRvIGJlIGNoZWNrZWQgZm9yIHByb3BlciBYTUwgYXR0cmlidXRlIHJlZ2lvbiBzZXF1ZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzU3RhcnRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgfHwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTjsKLQl9Ci0KLQkvLyBCZWNhdXNlIHdlIGNoZWNrIHRoZSAicHJvcGVyIiBjbG9zaW5nIHNlcGFyYXRlbHkgZnJvbSBhdHRyaWJ1dGUKLQkvLyBzZXF1ZW5jaW5nLCB3ZSBuZWVkIHRvIGtub3cgd2hhdCdzCi0JLy8gYW4gYXBwcm9wcmlhdGUgY2xvc2UuCi0JcHJpdmF0ZSBib29sZWFuIGlzVGFnQ2xvc2VUZXh0UmVnaW9uKElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8ICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgWE1MIENvbnRlbnQKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MQ29udGVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQ7Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoaXNTdGFydFRhZyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkvLyBjaGVjayBmb3IgYXR0cmlidXRlcyB3aXRob3V0IGEgdmFsdWUKLQkJCWNoZWNrRm9yQXR0cmlidXRlVmFsdWUoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkvLyBjaGVjayBpZiBzdGFydGVkIHRhZyBpcyBlbmRlZAotCQkJY2hlY2tTdGFydEVuZFRhZ1BhaXJzKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgZW1wdHkgdGFnIDw+Ci0JCQljaGVja0VtcHR5VGFnKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgdGhhdCBlYWNoIGF0dHJpYnV0ZSBoYXMgcXVvdGVzCi0JCQljaGVja1F1b3Rlc0ZvckF0dHJpYnV0ZVZhbHVlcyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJCS8vIGNoZWNrIHRoYXQgdGhlIGNsb3NpbmcgJz4nIGlzIHRoZXJlCi0JCQljaGVja0Nsb3NpbmdCcmFja2V0KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGlzRW5kVGFnKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCS8vIGNoZWNrIGlmIGVuZGluZyB0YWcgd2FzIHN0YXJ0ZWQKLQkJCWNoZWNrU3RhcnRFbmRUYWdQYWlycyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJCS8vIGNoZWNrIGZvciBhdHRyaWJ1dGVzIGluIGFuIGVuZCB0YWcKLQkJCWNoZWNrQXR0cmlidXRlc0luRW5kVGFnKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgdGhhdCB0aGUgY2xvc2luZyAnPicgaXMgdGhlcmUKLQkJCWNoZWNrQ2xvc2luZ0JyYWNrZXQoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXNQSShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkvLyBjaGVjayB2YWxpZGl0eSBvZiBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi0JCQljaGVja1N0YXJ0aW5nU3BhY2VGb3JQSShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJCWNoZWNrTm9OYW1lc3BhY2VJblBJKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGlzWE1MQ29udGVudChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQljaGVja0ZvclNwYWNlQmVmb3JlTmFtZShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJfQotCQllbHNlIGlmIChpc1hNTERvY3R5cGVEZWNsYXJhdGlvbihzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQljaGVja0RvY3VtZW50VHlwZVJlZmVyZW5jZXMoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRG9jdW1lbnRUeXBlUmVmZXJlbmNlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxEb2N0eXBlRGVjbGFyYXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgfHwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOICYmIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIHVyaXMgPSBoZWxwZXIuZ2V0VVJJcygpOwotCQlJV29ya3NwYWNlUm9vdCB3c1Jvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlpZiAodXJpcy5sZW5ndGggPiAwKSB7Ci0JCQlJRmlsZSBjdXJyZW50RmlsZSA9IG51bGw7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJpcy5sZW5ndGggJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCk7IGkrKykgewotCQkJCS8vIG1pZ2h0IGJlIGNhbGxlZCB3aXRoIGp1c3QgcHJvamVjdCBwYXRoPwotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aCh1cmlzW2ldKTsKLQkJCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJY3VycmVudEZpbGUgPSB3c1Jvb3QuZ2V0RmlsZShwYXRoKTsKLQkJCQkJaWYgKHNob3VsZFZhbGlkYXRlKGN1cnJlbnRGaWxlLCB0cnVlKSkgewotCQkJCQkJdmFsaWRhdGVWMUZpbGUoY3VycmVudEZpbGUsIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICh1cmlzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCXZhbGlkYXRlVjFQcm9qZWN0KGhlbHBlciwgcmVwb3J0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlCi0JCQl2YWxpZGF0ZVYxUHJvamVjdChoZWxwZXIsIHJlcG9ydGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFZhbGlkYXRlKElSZXNvdXJjZVByb3h5IHByb3h5KSB7Ci0JCWlmKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJU3RyaW5nIG5hbWUgPSBwcm94eS5nZXROYW1lKCk7Ci0JCQlpZihuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuZW5kc1dpdGgoIi54bWwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNob3VsZFZhbGlkYXRlKHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLCBmYWxzZSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2UgZmlsZSwgYm9vbGVhbiBjaGVja0V4dGVuc2lvbikgewotCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpIHx8IGZpbGUuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY2hlY2tFeHRlbnNpb24pIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCAmJiAieG1sIi5lbmRzV2l0aChleHRlbnNpb24udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9ICgoSUZpbGUpIGZpbGUpLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJcmV0dXJuIGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsICYmIGNvbnRlbnRUeXBlLmlzS2luZE9mKGdldFhNTENvbnRlbnRUeXBlKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVWMVByb2plY3QoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgZmluYWwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIGlmIHVyaXNbXSBsZW5ndGggMCAtPiB2YWxpZGF0ZSgpIGdldHMgY2FsbGVkIGZvciBlYWNoIHByb2plY3QKLQkJaWYgKGhlbHBlciBpbnN0YW5jZW9mIElXb3JrYmVuY2hDb250ZXh0KSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKChJV29ya2JlbmNoQ29udGV4dCkgaGVscGVyKS5nZXRQcm9qZWN0KCk7Ci0JCQlJUmVzb3VyY2VQcm94eVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VQcm94eVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJaWYgKHNob3VsZFZhbGlkYXRlKHByb3h5KSkgewotCQkJCQkJdmFsaWRhdGVWMUZpbGUoKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKSwgcmVwb3J0ZXIpOwotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX07Ci0JCQl0cnkgewotCQkJCS8vIGNvbGxlY3QgYWxsIGpzcCBmaWxlcyBmb3IgdGhlIHByb2plY3QKLQkJCQlwcm9qZWN0LmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBAcGFyYW0gY3VycmVudEZpbGUKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVWMUZpbGUoSUZpbGUgY3VycmVudEZpbGUsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIGN1cnJlbnRGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSkpOwotCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhNYXJrdXBWYWxpZGF0b3IudGhpcywgbWVzc2FnZSk7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGN1cnJlbnRGaWxlKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlkb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCWNvbm5lY3QoZG9jdW1lbnQpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdmFsaWRhdGlvblJlZ2lvbiA9IGRvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJd2hpbGUgKHZhbGlkYXRpb25SZWdpb24gIT0gbnVsbCkgewotCQkJCQl2YWxpZGF0ZSh2YWxpZGF0aW9uUmVnaW9uLCByZXBvcnRlcik7Ci0JCQkJCXZhbGlkYXRpb25SZWdpb24gPSB2YWxpZGF0aW9uUmVnaW9uLmdldE5leHQoKTsKLQkJCQl9Ci0JCQkJZGlzY29ubmVjdChkb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRYTUxDb250ZW50VHlwZSgpIHsKLQkJaWYgKGZSb290Q29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJZlJvb3RDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZlJvb3RDb250ZW50VHlwZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvciN2YWxpZGF0ZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0JCVZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKLQkJZlJlcG9ydGVyID0gcmVzdWx0LmdldFJlcG9ydGVyKG1vbml0b3IpOwotCi0JCXZhbGlkYXRlVjFGaWxlKChJRmlsZSkgcmVzb3VyY2UsIGZSZXBvcnRlcik7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgSVJlcG9ydGVyIHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSkgewotCQl2YWxpZGF0ZShyZXNvdXJjZSxraW5kLHN0YXRlLG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlyZXR1cm4gZlJlcG9ydGVyOwotCX0KLQlwcml2YXRlIFByZWZlcmVuY2VzIGdldFBsdWdpblByZWZlcmVuY2UoKXsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmIChnZXREb2N1bWVudCgpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIShnZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHJlbW92ZSBvbGQgbWVzc2FnZXMKLQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHJlZ2lvbnMgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudCkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKSwgZGlydHlSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCXZhbGlkYXRlKHJlZ2lvbnNbaV0sIHJlcG9ydGVyKTsKLQkJfQotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vUHJvYmxlbUlEc1hNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vUHJvYmxlbUlEc1hNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjM0ZTc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1Byb2JsZW1JRHNYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFByb2JsZW1JRHNYTUwgewotCWludCBBdHRyc0luRW5kVGFnID0gMzsKLQlpbnQgQXR0clZhbHVlTm90UXVvdGVkID0gMTM7Ci0JaW50IEVtcHR5VGFnID0gMTsKLQlpbnQgSW52YWxpZEF0dHJWYWx1ZSA9IDExOwotCWludCBNaXNzaW5nQXR0clZhbHVlID0gNDsKLQlpbnQgTWlzc2luZ0Nsb3NpbmdCcmFja2V0ID0gMTQ7Ci0JaW50IE1pc3NpbmdFbmRUYWcgPSAyOwotCWludCBNaXNzaW5nUmVxdWlyZWRBdHRyID0gMTI7Ci0JaW50IE1pc3NpbmdTdGFydFRhZyA9IDE1OwotCWludCBOYW1lc3BhY2VJblBJID0gODsKLQlpbnQgTm9BdHRyVmFsdWUgPSA1OwotCWludCBTcGFjZXNCZWZvcmVQSSA9IDc7Ci0JaW50IFNwYWNlc0JlZm9yZVRhZ05hbWUgPSA2OwotCWludCBVbmNsYXNzaWZpZWQgPSAwOwotCWludCBVbmtub3duQXR0ciA9IDEwOwotCWludCBVbmtub3duRWxlbWVudCA9IDk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0b3JIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRvckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NhZTA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRvckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgdGhlIFhNTCB2YWxpZGF0b3IuCi0gKiAKLSAqIEBhdXRob3IgQ3JhaWcgU2FsdGVyLCBJQk0KLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvckhlbHBlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgTGlzdCBuYW1lc3BhY2VVUklMaXN0ID0gbmV3IFZlY3RvcigpOwotICBwdWJsaWMgYm9vbGVhbiBpc0dyYW1tYXJFbmNvdW50ZXJlZCA9IGZhbHNlOyAgICAKLSAgcHVibGljIGJvb2xlYW4gaXNEVERFbmNvdW50ZXJlZCA9IGZhbHNlOwotICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZUVuY291bnRlcmVkID0gZmFsc2U7Ci0gIHB1YmxpYyBTdHJpbmcgc2NoZW1hTG9jYXRpb25TdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgaW50IG51bURUREVsZW1lbnRzID0gMDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdG9ySGVscGVyKCkKLSAgewotICB9Ci0gCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gWE1MIFJlYWRlci4KLSAgICogCi0gICAqIEByZXR1cm4gQW4gWE1MIFJlYWRlciBpZiBvbmUgY2FuIGJlIGNyZWF0ZWQgb3IgbnVsbC4KLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBYTUxSZWFkZXIgY3JlYXRlWE1MUmVhZGVyKFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24KLSAgeyAgICAgCi0gICAgWE1MUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgCi0gICAgcmVhZGVyID0gbmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKCk7ICAgICAKLSAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2NvbnRpbnVlLWFmdGVyLWZhdGFsLWVycm9yIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvbm9udmFsaWRhdGluZy9sb2FkLWV4dGVybmFsLWR0ZCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgTXlDb250ZW50SGFuZGxlcih1cmkpKTsKLSAgICByZWFkZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBJbnRlcm5hbEVycm9ySGFuZGxlcigpKTsgCi0KLSAgICBMZXhpY2FsSGFuZGxlciBsZXhpY2FsSGFuZGxlciA9IG5ldyBMZXhpY2FsSGFuZGxlcigpCi0gICAgeyAgICAgIAotICAgICAgcHVibGljIHZvaWQgc3RhcnREVEQgKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgICAgIHsKLSAgICAgICAgaXNHcmFtbWFyRW5jb3VudGVyZWQgPSB0cnVlOyAgIAotICAgICAgICBpc0RUREVuY291bnRlcmVkID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgZW5kRFREKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBzdGFydEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBlbmRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgc3RhcnRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgZW5kQ0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0gCi0gICAgICBwdWJsaWMgdm9pZCBjb21tZW50IChjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgfQotICAgIH07Ci0gICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCBsZXhpY2FsSGFuZGxlcik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICByZXR1cm4gcmVhZGVyOwotICB9ICAKLQotICAvKioKLSAgICogQW4gZXJyb3IgaGFuZGxlciB0byBzdXBwcmVzcyBlcnJvciBhbmQgd2FybmluZyBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHByaXZhdGUgY2xhc3MgSW50ZXJuYWxFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLSAgewotCXB1YmxpYyBJbnRlcm5hbEVycm9ySGFuZGxlcigpCi0JewotCSAgc3VwZXIoKTsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgIH0KLSAgfQotCi0gCi0gIC8qKgotICAgKiBGaWd1cmVzIG91dCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIGZvciB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gdXJpUmVzb2x2ZXIgQSBoZWxwZXIgdG8gcmVzb2x2ZSBsb2NhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb21wdXRlVmFsaWRhdGlvbkluZm9ybWF0aW9uKFN0cmluZyB1cmksIFJlYWRlciBjaGFyYWN0ZXJTdHJlYW0sIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IGNyZWF0ZVhNTFJlYWRlcih1cmkpOyAgCi0gICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSh1cmkpOwotICAgICAgaW5wdXRTb3VyY2Uuc2V0Q2hhcmFjdGVyU3RyZWFtKGNoYXJhY3RlclN0cmVhbSk7Ci0gICAgICByZWFkZXIucGFyc2UoaW5wdXRTb3VyY2UpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgeyAgICAgCi0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICB9Ci0gIH0KLSAgCi0gCi0KLSAgLyoqCi0gICAqIEhhbmRsZSB0aGUgY29udGVudCB3aGlsZSBwYXJzaW5nIHRoZSBmaWxlLgotICAgKi8KLSAgY2xhc3MgTXlDb250ZW50SGFuZGxlciBleHRlbmRzIG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIKLSAgeyAgICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBib29sZWFuIGlzUm9vdEVsZW1lbnQgPSB0cnVlOwotICAgIFN0cmluZyBiYXNlVVJJOwotICAgIAotICAgIE15Q29udGVudEhhbmRsZXIoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICB0aGlzLmJhc2VVUkkgPSB1cmk7ICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjd2FybmluZyhvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgfQotICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICB9ICAgIAotICAgICAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFVucHJlZml4ZWROYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4ZWROYW1lKFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDAgPyBwcmVmaXggKyAiOiIgKyBsb2NhbE5hbWUgOiBsb2NhbE5hbWU7ICAgICAgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcmF3TmFtZSwgQXR0cmlidXRlcyBhdHRzKQotICAgIHsgICAgICAKLSAgICAgIC8vU3RyaW5nIGV4cGxpY2l0TG9jYXRpb24gPSBudWxsOwotICAgICAgaWYgKGlzUm9vdEVsZW1lbnQpCi0gICAgICB7ICAKLSAgICAgICAgCi0gICAgICAgIGlzUm9vdEVsZW1lbnQgPSBmYWxzZTsgIAotICAgICAgICBpbnQgbkF0dHMgPSBhdHRzLmdldExlbmd0aCgpOyAgICAKLSAgICAgICAgU3RyaW5nIHNjaGVtYUluc3RhbmNlUHJlZml4ID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9MDsgaSA8IG5BdHRzOyBpKyspCi0gICAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cy5nZXRRTmFtZShpKTsgICAgICAgCi0gICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJ4bWxucyIpIHx8IGF0dHJpYnV0ZU5hbWUuc3RhcnRzV2l0aCgieG1sbnM6IikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCA9IHRydWU7ICAgIAotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cy5nZXRWYWx1ZShpKTsgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cudzMub3JnLyIpICYmIHZhbHVlLmVuZHNXaXRoKCIvWE1MU2NoZW1hLWluc3RhbmNlIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzY2hlbWFJbnN0YW5jZVByZWZpeCA9IGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJ4bWxucyIpID8gIiIgOiBnZXRVbnByZWZpeGVkTmFtZShhdHRyaWJ1dGVOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIH0gICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KHJhd05hbWUpOwotICAgICAgICBTdHJpbmcgcm9vdEVsZW1lbnROYW1lc3BhY2VEZWNsYXJhdGlvbk5hbWUgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyAieG1sbnM6IiArIHByZWZpeCA6ICJ4bWxucyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBTdHJpbmcgcm9vdEVsZW1lbnROYW1lc3BhY2UgPSByb290RWxlbWVudE5hbWVzcGFjZURlY2xhcmF0aW9uTmFtZSAhPSBudWxsID8gYXR0cy5nZXRWYWx1ZShyb290RWxlbWVudE5hbWVzcGFjZURlY2xhcmF0aW9uTmFtZSkgOiBudWxsOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotICAgICAgICAKLSAgICAgICAgLy8gZmlyc3Qgd2UgdXNlIGFueSAneHNpOnNjaGVtYUxvY2F0aW9uJyBvciAneHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24nIGF0dHJpYnV0ZQotICAgICAgICAvLyB0byBkZXRlcm1pbmUgYSBsb2NhdGlvbgotICAgICAgICBpZiAoc2NoZW1hSW5zdGFuY2VQcmVmaXggIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGxvY2F0aW9uID0gYXR0cy5nZXRWYWx1ZShnZXRQcmVmaXhlZE5hbWUoc2NoZW1hSW5zdGFuY2VQcmVmaXgsICJub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgeyAgICAgICAgICAgIAotICAgICAgICAJU3RyaW5nIHNjaGVtYUxvYyA9IGF0dHMuZ2V0VmFsdWUoZ2V0UHJlZml4ZWROYW1lKHNjaGVtYUluc3RhbmNlUHJlZml4LCAic2NoZW1hTG9jYXRpb24iKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBsb2NhdGlvbiA9IGdldFNjaGVtYUxvY2F0aW9uRm9yTmFtZXNwYWNlKHNjaGVtYUxvYywgcm9vdEVsZW1lbnROYW1lc3BhY2UpOwotICAgICAgICAgIH0gIAotICAgICAgICB9ICAKLSAgICAgICAgaWYgKHJvb3RFbGVtZW50TmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByb290RWxlbWVudE5hbWVzcGFjZSA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBsb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlVVJJLCByb290RWxlbWVudE5hbWVzcGFjZSwgbG9jYXRpb24pOyAgICAKLSAgICAgICAgbG9jYXRpb24gPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmVQaHlzaWNhbExvY2F0aW9uKGJhc2VVUkksIHJvb3RFbGVtZW50TmFtZXNwYWNlLCBsb2NhdGlvbik7Ci0gICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgbG9jYXRpb24gPSBVUklIZWxwZXIuYWRkSW1wbGllZEZpbGVQcm90b2NvbChsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHNjaGVtYUxvY2F0aW9uU3RyaW5nID0gbG9jYXRpb247Ci0gICAgICAgIAotICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICAgICAgICAgIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIGlzR3JhbW1hckVuY291bnRlcmVkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAJLy8gRG8gbm90aGluZy4KLSAgICAgICAgICB9Ci0gICAgICAgICAgZmluYWxseQotICAgICAgICAgIHsKLSAgICAgICAgCWlmKGlzICE9IG51bGwpCi0gICAgICAgIAl7Ci0gICAgICAgIAkgIHRyeQotICAgICAgICAJICB7Ci0gICAgICAgIAkgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgCSAgfQotICAgICAgICAJICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgCSAgewotICAgICAgICAJCS8vIERvIG5vdGhpbmcuCi0gICAgICAgIAkgIH0KLSAgICAgICAgCX0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0gICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciNlbGVtZW50RGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVsZW1lbnREZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgbW9kZWwpIAotICAgIHsKLSAgICAgIG51bURUREVsZW1lbnRzKys7Ci0gICAgfQotICAgIAotICAgIC8vIFRoZSB4c2lTY2hlbWFMb2NhdGlvblZhbHVlIGlzIGEgbGlzdCBvZiBuYW1lc3BhY2UvbG9jYXRpb24gcGFpcnMgdGhhdCBhcmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgCi0gICAgLy8gdGhpcyBtZXRob2Qgd2Fsa3MgdGhlIGxpc3Qgb2YgcGFpcnMgbG9va2luZyBmb3IgdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UgYW5kIHJldHVybnMgdGhlIGFzc29jaWF0ZWQKLSAgICAvLyBsb2NhdGlvbi4KLSAgICAvLyAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb25Gb3JOYW1lc3BhY2UoU3RyaW5nIHhzaVNjaGVtYUxvY2F0aW9uVmFsdWUsIFN0cmluZyBuYW1lc3BhY2UpCi0gICAgeyAgICAgIAotICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAoeHNpU2NoZW1hTG9jYXRpb25WYWx1ZSAhPSBudWxsICYmIG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgewotICAgICAgICAKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih4c2lTY2hlbWFMb2NhdGlvblZhbHVlKTsKLSAgICAgICAgd2hpbGUoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYoc3QubmV4dFRva2VuKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3QubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgICAgICAKLSAgfSAgIAotICAgICAgIAotICAKLSAgLyoqCi0gICAqIFJlcGxhY2UgYWxsIGluc3RhbmNlcyBpbiB0aGUgc3RyaW5nIG9mIHRoZSBvbGQgcGF0dGVybiB3aXRoIHRoZSBuZXcgcGF0dGVybi4KLSAgICogCi0gICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJucyBpbi4KLSAgICogQHBhcmFtIG9sZFBhdHRlcm4gVGhlIG9sZCBwYXR0ZXJuIHRvIHJlcGxhY2UuCi0gICAqIEBwYXJhbSBuZXdQYXR0ZXJuIFRoZSBwYXR0ZXJuIHVzZWQgZm9yIHJlcGxhY2VtZW50LgotICAgKiBAcmV0dXJuIFRoZSBtb2RpZmllZCBzdHJpbmcgd2l0aCBhbGwgb2NjdXJyYW5jZXMgb2Ygb2xkUGF0dGVybiByZXBsYWNlZCBieSBuZXcgUGF0dGVybi4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHN0cmluZywgU3RyaW5nIG9sZFBhdHRlcm4sIFN0cmluZyBuZXdQYXR0ZXJuKQotICB7ICAgICAKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHdoaWxlIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBpbmRleCA9IHN0cmluZy5pbmRleE9mKG9sZFBhdHRlcm4sIGluZGV4KTsKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCkgKyBuZXdQYXR0ZXJuICsgc3RyaW5nLnN1YnN0cmluZyhpbmRleCArIG9sZFBhdHRlcm4ubGVuZ3RoKCkpOwotICAgICAgICBpbmRleCA9IGluZGV4ICsgb2xkUGF0dGVybi5sZW5ndGgoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0cmluZzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWM1ZTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTE5lc3RlZFZhbGlkYXRvckNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0OwotCi0KLS8qKgotICogWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBpcyB1c2VkIHRvIHN0b3JlIHN0YXRlIGRhdGEgbmVlZGVkIGR1cmluZyBhbiBYTUwKLSAqIHZhbGlkYXRpb24gc2Vzc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIFhNTE5lc3RlZFZhbGlkYXRvckNvbnRleHQgZXh0ZW5kcyBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0Ci17Ci0gIC8qKgotICAgKiBBIHNldCBvZiBpbmFjY2Vzc2libGUgbG9jYXRpb25zIFVSSXMgKFN0cmluZykuCi0gICAqLwotICBwcml2YXRlIEhhc2hTZXQgaW5hY2Nlc3NpYmxlTG9jYXRpb25VUklzID0gbmV3IEhhc2hTZXQoKTsKLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiBhIGxvY2F0aW9uIFVSSSB3YXMgbWFya2VkIGFzIGluYWNjZXNzaWJsZS4KLSAgICogCi0gICAqIEBwYXJhbSBsb2NhdGlvblVSSQotICAgKiAgICAgICAgICB0aGUgbG9jYXRpb24gVVJJIHRvIHRlc3QuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBhIGxvY2F0aW9uIFVSSSB3YXMgbWFya2VkIGFzIGluYWNjZXNzaWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVUklNYXJrZWRJbmFjY2Vzc2libGUoU3RyaW5nIGxvY2F0aW9uVVJJKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uVVJJICE9IG51bGwgJiYgaW5hY2Nlc3NpYmxlTG9jYXRpb25VUklzLmNvbnRhaW5zKGxvY2F0aW9uVVJJKTsKLSAgfQotCi0gIC8qKgotICAgKiBNYXJrcyB0aGUgZ2l2ZW4gbG9jYXRpb24gVVJJIGFzIGluYWNjZXNzaWJsZS4KLSAgICogCi0gICAqIEBwYXJhbSBsb2NhdGlvblVSSQotICAgKiAgICAgICAgICB0aGUgbG9jYXRpb24gVVJJIHRvIG1hcmsgYXMgaW5hY2Nlc3NpYmxlLiBNdXN0IG5vdCBiZSBudWxsLgotICAgKi8KLSAgcHVibGljIHZvaWQgbWFya1VSSUluYWNjZXNzaWJsZShTdHJpbmcgbG9jYXRpb25VUkkpCi0gIHsKLSAgICBpZiAobG9jYXRpb25VUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbmFjY2Vzc2libGVMb2NhdGlvblVSSXMuYWRkKGxvY2F0aW9uVVJJKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDQ1MTU1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTcwMDUgLSBTb21lIHN0YXRpYyBjb25zdGFudHMgbm90IG1hZGUgZmluYWwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLS8qKgotICogQW4gWE1MIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBhbGxvd3Mgc2V0dGluZyBzcGVjaWZpYyBjb25maWd1cmF0aW9uCi0gKiBpbmZvcm1hdGlvbiBmb3IgYSBXVFAgWE1MIHZhbGlkYXRpb24gcnVuLiBBbnkgZmVhdHVyZXMgYW5kIHByb3BlcnRpZXMKLSAqIHNldCBvbiB0aGlzIGNvbmZpZ3VyYXRpb24gc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIHRob3NlIGZyb20KLSAqIHBhcnNlcnMgc3VjaCBhcyBYZXJjZXMuIChUaGlzIG9iamVjdCBkb2VzIG5vdCBieSBkZWZhdWx0IHdyYXAgZmVhdHVyZXMKLSAqIGFuZCBwcm9wZXJ0aWVzIGZyb20gc3BlY2lmaWMgcGFyc2Vycy4pCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiAKLXsKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOX05PX0dSQU1NQVIgPSAiV0FSTl9OT19HUkFNTUFSIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRJQ0FURV9OT19HUkFNTUFSID0gIklORElDQVRFX05PX0dSQU1NQVIiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9YSU5DTFVERSA9ICJVU0VfWElOQ0xVREUiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyA9ICJIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMiOyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBib29sZWFuIHdhcm5fbm9fZ3JhbW1hcl92YWx1ZSA9IGZhbHNlOwotICBwcml2YXRlIGludCBpbmRpY2F0ZV9ub19ncmFtbWFyX3ZhbHVlID0gMTsKLSAgcHJpdmF0ZSBib29sZWFuIHVzZV94aW5jbHVkZSA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gaG9ub3VyX2FsbF9zY2hlbWFfbG9jYXRpb25zX3ZhbHVlID0gZmFsc2U7Ci0gIAotICAvKioKLSAgICogU2V0IGEgZmVhdHVyZSBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gZmVhdHVyZQotICAgKiAJCVRoZSBmZWF0dXJlIHRvIHNldC4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIAkJVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGZlYXR1cmUuCi0gICAqIEB0aHJvd3MgCi0gICAqIAkJQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgZmVhdHVyZSBpcyBub3QgcmVjb2duaXplZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGJvb2xlYW4gdmFsdWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotCWlmKFdBUk5fTk9fR1JBTU1BUi5lcXVhbHMoZmVhdHVyZSkpCi0JICB3YXJuX25vX2dyYW1tYXJfdmFsdWUgPSB2YWx1ZTsKLSAgICBlbHNlIGlmKFVTRV9YSU5DTFVERS5lcXVhbHMoZmVhdHVyZSkpCi0gICAgICB1c2VfeGluY2x1ZGUgPSB2YWx1ZTsKLSAgICBlbHNlIGlmKEhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUy5lcXVhbHMoZmVhdHVyZSkpCi0gICAgICBob25vdXJfYWxsX3NjaGVtYV9sb2NhdGlvbnNfdmFsdWUgPSB2YWx1ZTsKLQllbHNlCi0JICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGZWF0dXJlIG5vdCByZWNvZ25pemVkLiIpOyAvLyROT04tTkxTLTEkCi0JCi0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgYSBmZWF0dXJlIG9mIHRoaXMgY29uZmlndXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmZWF0dXJlCi0gICAqIAkJVGhlIGZlYXR1cmUgdG8gc2V0LgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogCQlUaGUgdmFsdWUgdG8gc2V0IGZvciB0aGUgZmVhdHVyZS4KLSAgICogQHRocm93cyAKLSAgICogCQlBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQlpZihJTkRJQ0FURV9OT19HUkFNTUFSLmVxdWFscyhmZWF0dXJlKSkKLQkgIGluZGljYXRlX25vX2dyYW1tYXJfdmFsdWUgPSB2YWx1ZTsKLQllbHNlCi0JICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGZWF0dXJlIG5vdCByZWNvZ25pemVkLiIpOyAvLyROT04tTkxTLTEkCi0JCi0gIH0KLSAgCi0gIAotICAvKioKLSAgICogR2V0IHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBmZWF0dXJlLiBJZiB0aGUgZmVhdHVyZSBpcyBub3QgZGVmaW5lZAotICAgKiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmZWF0dXJlCi0gICAqIAkJVGhlIGZlYXR1cmUgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSB2YWx1ZS4KLSAgICogQHJldHVybgotICAgKiAJCVRoZSBmZWF0dXJlJ3MgdmFsdWUsIHRydWUgb3IgZmFsc2UuCi0gICAqIEB0aHJvd3MgCi0gICAqIAkJQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgZmVhdHVyZSBpcyBub3QgcmVjb2duaXplZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHRocm93cyBFeGNlcHRpb24KLSAgewotCWlmKFdBUk5fTk9fR1JBTU1BUi5lcXVhbHMoZmVhdHVyZSkpCi0JICByZXR1cm4gd2Fybl9ub19ncmFtbWFyX3ZhbHVlOwotCWVsc2UgaWYoVVNFX1hJTkNMVURFLmVxdWFscyhmZWF0dXJlKSkKLSAgICAgIHJldHVybiB1c2VfeGluY2x1ZGU7Ci0gICAgaWYoSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TLmVxdWFscyhmZWF0dXJlKSkKLSAgICAgIHJldHVybiBob25vdXJfYWxsX3NjaGVtYV9sb2NhdGlvbnNfdmFsdWU7Ci0JCQkKLQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGZWF0dXJlIG5vdCByZWNvZ25pemVkLiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBmZWF0dXJlLiBJZiB0aGUgZmVhdHVyZSBpcyBub3QgZGVmaW5lZAotICAgKiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmZWF0dXJlCi0gICAqIAkJVGhlIGZlYXR1cmUgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSB2YWx1ZS4KLSAgICogQHJldHVybgotICAgKiAJCVRoZSBmZWF0dXJlJ3MgdmFsdWUsIHRydWUgb3IgZmFsc2UuCi0gICAqIEB0aHJvd3MgCi0gICAqIAkJQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgZmVhdHVyZSBpcyBub3QgcmVjb2duaXplZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0SW50RmVhdHVyZShTdHJpbmcgZmVhdHVyZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0JaWYoSU5ESUNBVEVfTk9fR1JBTU1BUi5lcXVhbHMoZmVhdHVyZSkpCi0JICByZXR1cm4gaW5kaWNhdGVfbm9fZ3JhbW1hcl92YWx1ZTsKLQkKLQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGZWF0dXJlIG5vdCByZWNvZ25pemVkLiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvbkluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTNlYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBbMjA1OTg5XSAtIFt2YWxpZGF0aW9uXSB2YWxpZGF0ZSBYTUwgYWZ0ZXIgWEluY2x1ZGUgcmVzb2x1dGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbi5FcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyOwotCi0KLS8qKgotICogQSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIG9iamVjdCBzcGVjaWZpYyB0byBYTUwgdmFsaWRhdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIFhNTFZhbGlkYXRpb25JbmZvIGV4dGVuZHMgVmFsaWRhdGlvbkluZm8gaW1wbGVtZW50cyBYTUxWYWxpZGF0aW9uUmVwb3J0Ci17Ci0gIHByb3RlY3RlZCBib29sZWFuIGdyYW1tYXJFbmNvdW50ZXJlZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBkdGRFbmNvdW50ZXJlZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBuYW1lc3BhY2VFbmNvdW50ZXJlZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgaW50IGVsZW1lbnREZWNsQ291bnQgPSAwOwotICBwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRFcnJvcktleTsKLSAgcHJvdGVjdGVkIE9iamVjdCBtZXNzYWdlQXJndW1lbnRzW10gPSBudWxsOwotICBwcm90ZWN0ZWQgWE1MTG9jYXRvciBsb2NhdG9yID0gbnVsbDsKLSAgcHJvdGVjdGVkIEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIgZXJyb3JDdXN0b21pemF0aW9uTWFuYWdlciA9IG51bGw7Ci0gIAotICAvKioKLSAgICogQSBzdGFjayBvZiBzdGFydCB0YWcgbG9jYXRpb25zLCB1c2VkIHRvIG1vdmUgZXJyb3JzCi0gICAqIHJlcG9ydGVkIGF0IHRoZSBjbG9zZSB0YWcgdG8gYmUgcmVwb3J0ZWQgYXQgdGhlIHN0YXJ0IHRhZy4KLSAgICovCi0gIHByb3RlY3RlZCBTdGFjayBzdGFydEVsZW1lbnRMb2NhdGlvbnMgPSBuZXcgU3RhY2soKTsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGlzIHJlcG9ydCBkZXNjcmliZXMuCi0gICAqLwotICBwdWJsaWMgWE1MVmFsaWRhdGlvbkluZm8oU3RyaW5nIHVyaSkKLSAgewotICAgIHN1cGVyKHVyaSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzR3JhbW1hckVuY291bnRlcmVkKCkKLSAgewotICAgIHJldHVybiBncmFtbWFyRW5jb3VudGVyZWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgd2hldGhlciBhIGdyYW1tYXIgaGFzIGJlZW4gZW5jb3VudGVyZWQgb3Igbm90LgotICAgKiAKLSAgICogQHBhcmFtIGdyYW1tYXJFbmNvdW50ZXJlZCBTZXQgdHJ1ZSBpZiBhIGdyYW1tYXIgaGFzIGJlZW4gZW5jb3VudGVyZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEdyYW1tYXJFbmNvdW50ZXJlZChib29sZWFuIGdyYW1tYXJFbmNvdW50ZXJlZCkKLSAgewotICAgIHRoaXMuZ3JhbW1hckVuY291bnRlcmVkID0gZ3JhbW1hckVuY291bnRlcmVkOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0RURFdpdGhvdXRFbGVtZW50RGVjbGFyYXRpb25FbmNvdW50ZXJlZCgpCi0gIHsKLSAgICByZXR1cm4gZHRkRW5jb3VudGVyZWQgJiYgZWxlbWVudERlY2xDb3VudCA9PSAwOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHdoZXRoZXIgYSBEVEQgd2l0aG91dCBhbiBlbGVtZW50IGRlY2xhcmF0aW9uIHdhcyBlbmNvdW50ZXJlZC4KLSAgICogCi0gICAqIEBwYXJhbSBkdGRXaXRob3V0RWxlbWVudERlY2xhcmF0aW9uRW5jb3VudGVyZWQgU2V0IHRydWUgaWYgYSBEVEQgd2l0aG91dCBhbgotICAgKiAgICAgICAgIGVsZW1lbnQgZGVjbGFyYXRpb24gd2FzIGVuY291bnRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREVERFbmNvdW50ZXJlZChib29sZWFuIGR0ZEVuY291bnRlcmVkKQotICB7Ci0gICAgdGhpcy5kdGRFbmNvdW50ZXJlZCA9IGR0ZEVuY291bnRlcmVkOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZUVuY291bnRlcmVkKCkKLSAgewotICAgIHJldHVybiBuYW1lc3BhY2VFbmNvdW50ZXJlZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB3aGV0aGVyIGEgbmFtZXNwYWNlIHdhcyBlbmNvdW50ZXJlZC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VFbmNvdW50ZXJlZCBTZXQgdHJ1ZSBpZiBhIG5hbWVzcGFjZSB3YXMgZW5jb3VudGVyZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUVuY291bnRlcmVkKGJvb2xlYW4gbmFtZXNwYWNlRW5jb3VudGVyZWQpCi0gIHsKLSAgICB0aGlzLm5hbWVzcGFjZUVuY291bnRlcmVkID0gbmFtZXNwYWNlRW5jb3VudGVyZWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBJbmNyZWFzZSB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBjb3VudCBmb3IgRFREIGVsZW1lbnRzIGJ5IG9uZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluY3JlYXNlRWxlbWVudERlY2xhcmF0aW9uQ291bnQoKQotICB7Ci0gICAgdGhpcy5lbGVtZW50RGVjbENvdW50Kys7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIG51bWJlciBvZiBEVEQgZWxlbWVudHMgZW5jb3VudGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBEVEQgZWxlbWVudHMgZW5jb3VudGVyZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50RGVjbGFyYXRpb25Db3VudChpbnQgY291bnQpCi0gIHsKLSAgCWVsZW1lbnREZWNsQ291bnQgPSBjb3VudDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgWE1MIGxvY2F0b3IgaWYgb25lIGhhcyBiZWVuIHNwZWNpZmllZC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFhNTCBsb2NhdG9yIGlmIG9uZSBoYXMgYmVlbiBzcGVjaWZpZWQgb3IgbnVsbC4KLSAgICovCi0gIHB1YmxpYyBYTUxMb2NhdG9yIGdldFhNTExvY2F0b3IoKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0b3I7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIFhNTExvY2F0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbG9jYXRvciBUaGUgWE1MTG9jYXRvciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRYTUxMb2NhdG9yKFhNTExvY2F0b3IgbG9jYXRvcikKLSAgewotICAgIHRoaXMubG9jYXRvciA9IGxvY2F0b3I7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgZXJyb3Iga2V5LgotICAgKiAKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjdXJyZW50RXJyb3JLZXkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRFcnJvcktleSgpCi0gIHsKLSAgICByZXR1cm4gY3VycmVudEVycm9yS2V5OwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBjdXJyZW50IGVycm9yIGtleS4KLSAgICogCi0gICAqIEBwYXJhbSBjdXJyZW50RXJyb3JLZXkgVGhlIGN1cnJlbnRFcnJvcktleSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50RXJyb3JLZXkoU3RyaW5nIGN1cnJlbnRFcnJvcktleSkKLSAgewotICAgIHRoaXMuY3VycmVudEVycm9yS2V5ID0gY3VycmVudEVycm9yS2V5OwotICB9Ci0KLXB1YmxpYyBPYmplY3RbXSBnZXRNZXNzYWdlQXJndW1lbnRzKCkgewotCXJldHVybiBtZXNzYWdlQXJndW1lbnRzOwotfQotCi0KLXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VBcmd1bWVudHMoT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykgewotCXRoaXMubWVzc2FnZUFyZ3VtZW50cyA9IG1lc3NhZ2VBcmd1bWVudHM7Ci19Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgc3RhcnQgZWxlbWVudHMgbG9jYXRpb25zLgotICAgKiAKLSAgICogQHJldHVybiAKLSAgICogCQlBIHN0YWNrIGNvbnRhaW5pbmcgdGhlIHN0YXJ0IGVsZW1lbnQgbG9jYXRpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0YWNrIGdldFN0YXJ0RWxlbWVudExvY2F0aW9ucygpCi0gIHsKLSAgICByZXR1cm4gc3RhcnRFbGVtZW50TG9jYXRpb25zOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBlcnJvciBjdXN0b21pemF0aW9uIG1hbmFnZXIgZm9yIHRoaXMgdmFsaWRhdGlvbiBydW4uCi0gICAqIAotICAgKiBAcmV0dXJuCi0gICAqIAlUaGUgZXJyb3IgY3VzdG9taXphdGlvbiBtYW5hZ2VyIGZvciB0aGlzIHZhbGlkYXRpb24gcnVuLgotICAgKi8KLSAgcHJvdGVjdGVkIEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIgZ2V0RXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcigpCi0gIHsKLQkgIGlmKGVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIgPT0gbnVsbCkKLQkgIHsKLQkJICBlcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyID0gbmV3IEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIoKTsKLQkgIH0KLQkgIHJldHVybiBlcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyOwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbn0gaW5zdGVhZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVXNlWEluY2x1ZGUoKSB7Ci0JICByZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVNFX1hJTkNMVURFKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZDA4ZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgVmFsaWRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgWE1MVmFsaWRhdGlvbk1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24ueG1sdmFsaWRhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST0JMRU1TX1ZBTElEQVRJTkdfVU5LTk9XTl9IT1NUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9CTEVNU19WQUxJREFUSU5HX0ZJTEVfTk9UX0ZPVU5EOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9CTEVNU19DT05ORUNUSU9OX1JFRlVTRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1dBUk5fTk9fR1JBTU1BUjsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUxWYWxpZGF0aW9uTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgWE1MVmFsaWRhdGlvbk1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25SZXBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25SZXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0ZjFmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uUmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW9uIGEgdmFsaWRhdGlvbiByZXBvcnQgZm9yIFhNTCB2YWxpZGF0aW9uLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MVmFsaWRhdGlvblJlcG9ydCBleHRlbmRzIFZhbGlkYXRpb25SZXBvcnQKLXsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBncmFtbWFyIHdhcyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgYSBncmFtbWFyIHdhcyBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNHcmFtbWFyRW5jb3VudGVyZWQoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBuYW1lc3BhY2Ugd2FzIGVuY291bnRlcmVkLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIGEgbmFtZXNwYWNlIHdhcyBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBhIERURCB3aXRob3V0IGVsZW1lbnQgZGVjbGFyYXRpb25zIHdhcyBlbmNvdW50ZXJlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBhIERURCB3aXRob3V0IGVsZW1lbnQgZGVjbGFyYXRpb25zIHdhcyBlbmNvdW50ZXJlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRFREV2l0aG91dEVsZW1lbnREZWNsYXJhdGlvbkVuY291bnRlcmVkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTI2OGQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gWzIwNTk4OV0gLSBbdmFsaWRhdGlvbl0gdmFsaWRhdGUgWE1MIGFmdGVyIFhJbmNsdWRlIHJlc29sdXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRXJyb3JSZXBvcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLm1zZy5YTUxNZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuWEluY2x1ZGVBd2FyZVBhcnNlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxMb2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkxvY2FsaXplZE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkxhenlVUkxJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGVyZm9ybXMgdmFsaWRhdGlvbiB1c2luZyBhIHhlcmNlcyBzYXggcGFyc2VyLiAgCi0gKiBIZXJlJ3MgYSBxdWljayBvdmVydmlldyBvZiB0aGUgZGV0YWlscyA6IAotICogICAtIGFuIEVycm9ySGFuZGxlciBpcyB1c2VkIHRvIGNvbGxlY3QgZXJyb3JzIGludG8gYSBsaXN0IChzbyB0aGV5IG1heSBiZSBkaXNwbGF5ZWQgYnkgdGhlIFVJKQotICogICAtIGFuIEVudGl0eVJlc29sdmVyIGlzIHVzZWQgYWxvbmcgd2l0aCB0aGUgeGVyY2VzICJleHRlcm5hbC1zY2hlbWFMb2NhdGlvbiIgcHJvcGVydHkgdG8gaW1wbGVtZW50IFhNTCBDYXRhbG9nIHN1cHBvcnQKLSAqLwotcHVibGljIGNsYXNzIFhNTFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIgPSBudWxsOwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGluZ29yZWRFcnJvcktleVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICBwcm90ZWN0ZWQgU2V0IGFkanVzdExvY2F0aW9uRXJyb3JLZXlTZXQgPSBuZXcgVHJlZVNldCgpOwotCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRV9BTFdBWVMgPSAiSUdOT1JFX0FMV0FZUyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdOT1JFX0lGX0RURF9XSVRIT1VUX0VMRU1FTlRfREVDTCA9ICJJR05PUkVfSUZfRFREX1dJVEhPVVRfRUxFTUVOVF9ERUNMIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVNQVRVUkVfRU9GID0gIlByZW1hdHVyZUVPRiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9FTEVNRU5UX1RZUEVfTVVTVF9NQVRDSF9ET0NUWVBFREVDTCA9ICJSb290RWxlbWVudFR5cGVNdXN0TWF0Y2hEb2N0eXBlZGVjbCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0VMRU1FTlRfTk9UX0RFQ0xBUkVEID0gIk1TR19FTEVNRU5UX05PVF9ERUNMQVJFRCI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIC8vIFdUUCBYTUwgdmFsaWRhdG9yIHNwZWNpZmljIGtleS4KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fR1JBTU1BUl9GT1VORCA9ICJOT19HUkFNTUFSX0ZPVU5EIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTk9UX0ZPVU5EX0tFWSA9ICJGSUxFX05PVF9GT1VORCI7IC8vJE5PTi1OTFMtMSQKLSAgIAotICBwcml2YXRlIE1hcmt1cFZhbGlkYXRvciB2YWwgPSBuZXcgTWFya3VwVmFsaWRhdG9yKCk7Ci0gIAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OTVNHID0gQW5ub3RhdGlvbk1zZy5jbGFzcy5nZXROYW1lKCk7Ci0gCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBYTUxWYWxpZGF0b3IoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAvLyBIZXJlIHdlIGFkZCBzb21lIGVycm9yIGtleXMgdGhhdCB3ZSBuZWVkIHRvIGZpbHRlciBvdXQgd2hlbiB3ZSdyZSB2YWxpZGF0aW9uIAotICAgIC8vIGFnYWluc3QgYSBEVEQgd2l0aG91dCBhbnkgZWxlbWVudCBkZWNsYXJhdGlvbnMuICAgICAgIAotICAgIGluZ29yZWRFcnJvcktleVRhYmxlLnB1dChQUkVNQVRVUkVfRU9GLCBJR05PUkVfQUxXQVlTKTsKLSAgICBpbmdvcmVkRXJyb3JLZXlUYWJsZS5wdXQoUk9PVF9FTEVNRU5UX1RZUEVfTVVTVF9NQVRDSF9ET0NUWVBFREVDTCwgSUdOT1JFX0lGX0RURF9XSVRIT1VUX0VMRU1FTlRfREVDTCk7Ci0gICAgaW5nb3JlZEVycm9yS2V5VGFibGUucHV0KE1TR19FTEVNRU5UX05PVF9ERUNMQVJFRCwgSUdOT1JFX0lGX0RURF9XSVRIT1VUX0VMRU1FTlRfREVDTCk7Ci0gICAgCi0gICAgLy8gSGVyZSB3ZSBhZGQgc29tZSBlcnJvciBrZXlzIHRoYXQgd2UgbmVlZCB0byBhZGp1c3QgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvci4KLSAgICAvLyBUaGUgbG9jYXRpb24gaW5mb3JtYXRpb24gd2lsbCBiZSBhZGp1c3RlZCB0byBwbGFjZSB0aGUgbWVzc2FnZSBvbiB0aGUgbGluZSBvZiB0aGUgc3RhcnRpbmcKLSAgICAvLyBlbGVtZW50IGluc3RlYWQgb2Ygb24gdGhlIGxpbmUgb2YgdGhlIGNsb3NpbmcgZWxlbWVudC4KLSAgICBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0LmFkZCgiTVNHX0NPTlRFTlRfSU5WQUxJRCIpOyAvLyROT04tTkxTLTEkCi0gICAgYWRqdXN0TG9jYXRpb25FcnJvcktleVNldC5hZGQoIk1TR19DT05URU5UX0lOQ09NUExFVEUiKTsgLy8kTk9OLU5MUy0xJAotICAgIGFkanVzdExvY2F0aW9uRXJyb3JLZXlTZXQuYWRkKCJjdmMtY29tcGxleC10eXBlLjIuNC5iIik7IC8vJE5PTi1OTFMtMSQKLSAgICBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0LmFkZCgiY3ZjLWNvbXBsZXgtdHlwZS4yLjMiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgVVJJIFJlc29sdmVyIHRvIHVzZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmlSZXNvbHZlciBUaGUgVVJJIFJlc29sdmVyIHRvIHVzZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyIHVyaVJlc29sdmVyKQotICB7Ci0gICAgdGhpcy51cmlSZXNvbHZlciA9IHVyaVJlc29sdmVyOwotICAgIC8vZW50aXR5UmVzb2x2ZXIgPSBuZXcgTXlFbnRpdHlSZXNvbHZlcih1cmlSZXNvbHZlcik7Ci0gIH0KLQotIAotICAvKioKLSAgICogQ3JlYXRlIGFuIFhNTCBSZWFkZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIFhNTCByZWFkZXIgb3IgbnVsbCBpZiB1bnN1Y2Nlc3NmdWwuCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgWE1MUmVhZGVyIGNyZWF0ZVhNTFJlYWRlcihmaW5hbCBYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvLCBYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcikgdGhyb3dzIEV4Y2VwdGlvbgotICB7ICAgICAKLSAgICBYTUxSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAvLyBtb3ZlIHRvIFhlcmNlcy0yLi4uIGFkZCB0aGUgY29udGV4dENsYXNzTG9hZGVyIHN0dWZmCi0gICAgQ2xhc3NMb2FkZXIgcHJldkNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgTXlTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBNeVN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbih2YWxpbmZvKTsKLSAgICAgIHJlYWRlciA9IG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcihjb25maWd1cmF0aW9uKQotICAgICAgewotICAgIAlwcml2YXRlIFhNTExvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0gICAgCQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5BYnN0cmFjdFNBWFBhcnNlciNzdGFydERvY3VtZW50KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxMb2NhdG9yLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuTmFtZXNwYWNlQ29udGV4dCwgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnMpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxMb2NhdG9yIHRoZUxvY2F0b3IsIGphdmEubGFuZy5TdHJpbmcgZW5jb2RpbmcsIE5hbWVzcGFjZUNvbnRleHQgbnNjb250ZXh0LCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuQXVnbWVudGF0aW9ucyBhdWdzKSAKLSAgICAgICAgewotICAgICAgICAgIGxvY2F0b3IgPSB0aGVMb2NhdG9yOwotICAgICAgICAgIHZhbGluZm8uc2V0WE1MTG9jYXRvcih0aGVMb2NhdG9yKTsKLSAgICAgICAgICBzdXBlci5zdGFydERvY3VtZW50KHRoZUxvY2F0b3IsIGVuY29kaW5nLCBuc2NvbnRleHQsIGF1Z3MpOyAKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkFic3RyYWN0U0FYUGFyc2VyI3N0YXJ0RWxlbWVudChvcmcuYXBhY2hlLnhlcmNlcy54bmkuUU5hbWUsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxBdHRyaWJ1dGVzLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuQXVnbWVudGF0aW9ucykKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChRTmFtZSBhcmcwLCBYTUxBdHRyaWJ1dGVzIGFyZzEsIEF1Z21lbnRhdGlvbnMgYXJnMikgdGhyb3dzIFhOSUV4Y2VwdGlvbiAKLSAgICAgICAgewotICAgICAgICAgIHZhbGluZm8uZ2V0U3RhcnRFbGVtZW50TG9jYXRpb25zKCkucHVzaChuZXcgTG9jYXRpb25Db29yZGluYXRlKGxvY2F0b3IuZ2V0TGluZU51bWJlcigpLCBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKSk7Ci0JCSAgc3VwZXIuc3RhcnRFbGVtZW50KGFyZzAsIGFyZzEsIGFyZzIpOwotCQl9Ci0gICAgICAgIAotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5BYnN0cmFjdFNBWFBhcnNlciNlbmRFbGVtZW50KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5RTmFtZSwgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnMpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFFOYW1lIGFyZzAsIEF1Z21lbnRhdGlvbnMgYXJnMSkgdGhyb3dzIFhOSUV4Y2VwdGlvbiB7Ci0JCQlzdXBlci5lbmRFbGVtZW50KGFyZzAsIGFyZzEpOwotCQkJdmFsaW5mby5nZXRTdGFydEVsZW1lbnRMb2NhdGlvbnMoKS5wb3AoKTsKLQkJfQotICAgICAgfTsKLQotICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9jb250aW51ZS1hZnRlci1mYXRhbC1lcnJvciIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLCB2YWxpbmZvLmlzTmFtZXNwYWNlRW5jb3VudGVyZWQoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIHZhbGluZm8uaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCgpKTsgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLCB2YWxpbmZvLmlzR3JhbW1hckVuY291bnRlcmVkKCkpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIsIHZhbGluZm8uaXNHcmFtbWFyRW5jb3VudGVyZWQoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgRGVmYXVsdEhhbmRsZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgIHZhbGluZm8uZ2V0RXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcigpLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsTmFtZSk7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgIHZhbGluZm8uZ2V0RXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcigpLmVuZEVsZW1lbnQodXJpLCBsb2NhbE5hbWUpOwotICAgICAgICB9Ci0gICAgICB9KTsgICAgICAKLSAgICAgIAotICAgICAgLy8gTUggbWFrZSBzdXJlIHZhbGlkYXRpb24gd29ya3MgZXZlbiB3aGVuIGEgY3VzdG9tZXIgZW50aXR5UmVzb2x2ZXIgaXMgbm90ZSBzZXQgKGkuZS4gdmlhIHNldFVSSVJlc29sdmVyKCkpCi0gICAgICBpZiAoZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICByZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9wcm9wZXJ0aWVzL2ludGVybmFsL2VudGl0eS1yZXNvbHZlciIsIGVudGl0eVJlc29sdmVyKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfSAgCi0gICAgICByZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2RlY2xhcmF0aW9uLWhhbmRsZXIiLCBuZXcgTXlEZWNsSGFuZGxlcigpKTsgICAgICAvLyROT04tTkxTLTEkCi0gICAgfSAKLSAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICB7IAotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHByZXZDbGFzc0xvYWRlcik7Ci0gICAgfQotICAgIHJldHVybiByZWFkZXI7Ci0gIH0gIAotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZmlsZSBsb2NhdGVkIGF0IHRoZSBnaXZlbiBVUkkuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhbiBYTUwgdmFsaWRhdGlvbiByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgWE1MVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRlKHVyaSwgbnVsbCwgbmV3IFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uKCkpOyAgCi0gIH0KLQotICBmaW5hbCBTdHJpbmcgY3JlYXRlU3RyaW5nRm9ySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLSAgICAvLyBIZXJlIHdlIGFyZSByZWFkaW5nIHRoZSBmaWxlIGFuZCBzdG9yaW5nIHRvIGEgc3RyaW5nYnVmZmVyLgotICAgIFN0cmluZ0J1ZmZlciBmaWxlU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlucHV0UmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlucHV0UmVhZGVyKTsKLSAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzEwMjRdOwotICAgICAgaW50IG51bWJlclJlYWQgPSByZWFkZXIucmVhZChjaGFycyk7Ci0gICAgICB3aGlsZSAobnVtYmVyUmVhZCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgZmlsZVN0cmluZy5hcHBlbmQoY2hhcnMsIDAsIG51bWJlclJlYWQpOwotICAgICAgICBudW1iZXJSZWFkID0gcmVhZGVyLnJlYWQoY2hhcnMpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy9UT0RPOiBsb2cgZXJyb3IgbWVzc2FnZQotICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gZmlsZVN0cmluZy50b1N0cmluZygpOwotICB9Ci0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgaW5wdXRTdHJlYW0KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIHRoZSBpbnB1dFN0cmVhbSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZQotICAgKiBAcmV0dXJuIFJldHVybnMgYW4gWE1MIHZhbGlkYXRpb24gcmVwb3J0LgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLQlyZXR1cm4gdmFsaWRhdGUodXJpLCBpbnB1dFN0cmVhbSwgbmV3IFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uKCkpOwotICB9Ci0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgaW5wdXRTdHJlYW0KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgCi0gICAqIAkJVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGlucHV0c3RyZWFtCi0gICAqIAkJVGhlIGlucHV0U3RyZWFtIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlCi0gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0gICAqIAkJQSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHZhbGlkYXRpb24gc2Vzc2lvbi4KLSAgICogQHJldHVybiAKLSAgICogCQlSZXR1cm5zIGFuIFhNTCB2YWxpZGF0aW9uIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyBYTUxWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRlKHVyaSwgaW5wdXRTdHJlYW0sIGNvbmZpZ3VyYXRpb24sIG51bGwpOyAgCi0gIH0KLSAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBpbnB1dFN0cmVhbQotICAgKiAKLSAgICogQHBhcmFtIHVyaSAKLSAgICogICAgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGlucHV0c3RyZWFtCi0gICAqICAgIFRoZSBpbnB1dFN0cmVhbSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZQotICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotICAgKiAgICBBIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgdmFsaWRhdGlvbiBzZXNzaW9uLgotICAgKiBAcGFyYW0gcmVzdWx0Ci0gICAqICAgIFRoZSB2YWxpZGF0aW9uIHJlc3VsdAotICAgKiBAcmV0dXJuIAotICAgKiAgICBSZXR1cm5zIGFuIFhNTCB2YWxpZGF0aW9uIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyBYTUxWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCkKLSAgewotCSAgcmV0dXJuIHZhbGlkYXRlKHVyaSwgaW5wdXRTdHJlYW0sIGNvbmZpZ3VyYXRpb24sIG51bGwsIG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGlucHV0U3RyZWFtCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIAotICAgKiAgICBUaGUgVVJJIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gaW5wdXRzdHJlYW0KLSAgICogICAgVGhlIGlucHV0U3RyZWFtIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlCi0gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0gICAqICAgIEEgY29uZmlndXJhdGlvbiBmb3IgdGhpcyB2YWxpZGF0aW9uIHNlc3Npb24uCi0gICAqIEBwYXJhbSByZXN1bHQKLSAgICogICAgVGhlIHZhbGlkYXRpb24gcmVzdWx0Ci0gICAqIEBwYXJhbSBjb250ZXh0Ci0gICAqICAgIFRoZSB2YWxpZGF0aW9uIGNvbnRleHQgICAKLSAgICogQHJldHVybiAKLSAgICogICAgUmV0dXJucyBhbiBYTUwgdmFsaWRhdGlvbiByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgWE1MVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgVmFsaWRhdGlvblJlc3VsdCByZXN1bHQsIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkKLSAgewotICAgIFN0cmluZyBncmFtbWFyRmlsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgUmVhZGVyIHJlYWRlcjEgPSBudWxsOyAvLyBVc2VkIGZvciB0aGUgcHJlcGFyc2UuCi0gICAgUmVhZGVyIHJlYWRlcjIgPSBudWxsOyAvLyBVc2VkIGZvciB2YWxpZGF0aW9uIHBhcnNlLgotICAgIAotICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotICAgIHsgIAotICAgICAgU3RyaW5nIHN0cmluZyA9IGNyZWF0ZVN0cmluZ0ZvcklucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICAgIHJlYWRlcjEgPSBuZXcgU3RyaW5nUmVhZGVyKHN0cmluZyk7Ci0gICAgICByZWFkZXIyID0gbmV3IFN0cmluZ1JlYWRlcihzdHJpbmcpOwotICAgIH0gCi0gICAgICAgIAotICAgIFhNTFZhbGlkYXRpb25JbmZvIHZhbGluZm8gPSBuZXcgWE1MVmFsaWRhdGlvbkluZm8odXJpKTsKLSAgICBNeUVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyID0gbmV3IE15RW50aXR5UmVzb2x2ZXIodXJpUmVzb2x2ZXIsIGNvbnRleHQpOyAKLSAgICBWYWxpZGF0b3JIZWxwZXIgaGVscGVyID0gbmV3IFZhbGlkYXRvckhlbHBlcigpOyAKLSAgICB0cnkKLSAgICB7ICAKLSAgICAgICAgaGVscGVyLmNvbXB1dGVWYWxpZGF0aW9uSW5mb3JtYXRpb24odXJpLCByZWFkZXIxLCB1cmlSZXNvbHZlcik7Ci0gICAgICAgIHZhbGluZm8uc2V0RFRERW5jb3VudGVyZWQoaGVscGVyLmlzRFRERW5jb3VudGVyZWQpOwotICAgICAgICB2YWxpbmZvLnNldEVsZW1lbnREZWNsYXJhdGlvbkNvdW50KGhlbHBlci5udW1EVERFbGVtZW50cyk7Ci0gICAgICAgIHZhbGluZm8uc2V0TmFtZXNwYWNlRW5jb3VudGVyZWQoaGVscGVyLmlzTmFtZXNwYWNlRW5jb3VudGVyZWQpOwotICAgICAgICB2YWxpbmZvLnNldEdyYW1tYXJFbmNvdW50ZXJlZChoZWxwZXIuaXNHcmFtbWFyRW5jb3VudGVyZWQpOwotICAgICAgICAKLSAgICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IGNyZWF0ZVhNTFJlYWRlcih2YWxpbmZvLCBlbnRpdHlSZXNvbHZlcik7Ci0gICAgICAgIC8vIFNldCB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24KLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0RmVhdHVyZShYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2hvbm91ci1hbGwtc2NoZW1hTG9jYXRpb25zIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5nZXRGZWF0dXJlKFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLlVTRV9YSU5DTFVERSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3hpbmNsdWRlIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgICAgICAKLSAgICAgICAgfQotICAgICAgICBYTUxFcnJvckhhbmRsZXIgZXJyb3JoYW5kbGVyID0gbmV3IFhNTEVycm9ySGFuZGxlcih2YWxpbmZvKTsKLSAgICAgICAgcmVhZGVyLnNldEVycm9ySGFuZGxlcihlcnJvcmhhbmRsZXIpOwotICAgICAgICAKLSAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UodXJpKTsKLSAgICAgICAgaW5wdXRTb3VyY2Uuc2V0Q2hhcmFjdGVyU3RyZWFtKHJlYWRlcjIpOwotICAgICAgICByZWFkZXIucGFyc2UoaW5wdXRTb3VyY2UpOyAgIAotICAgICAgICBpZihjb25maWd1cmF0aW9uLmdldEludEZlYXR1cmUoWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uSU5ESUNBVEVfTk9fR1JBTU1BUikgPiAwICYmIAotICAgICAgICAJCXZhbGluZm8uaXNWYWxpZCgpICYmICFoZWxwZXIuaXNHcmFtbWFyRW5jb3VudGVyZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZihjb25maWd1cmF0aW9uLmdldEludEZlYXR1cmUoWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uSU5ESUNBVEVfTk9fR1JBTU1BUikgPT0gMSkKLSAgICAgICAgICAgIHZhbGluZm8uYWRkV2FybmluZyhYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1dBUk5fTk9fR1JBTU1BUiwgMSwgMCwgdXJpLCBOT19HUkFNTUFSX0ZPVU5ELCBudWxsKTsKLSAgICAgICAgICBlbHNlIC8vIDIKLSAgICAgICAgICAgICAgdmFsaW5mby5hZGRFcnJvcihYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1dBUk5fTk9fR1JBTU1BUiwgMSwgMCwgdXJpLCBOT19HUkFNTUFSX0ZPVU5ELCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWxwZXIuaXNEVERFbmNvdW50ZXJlZCkKLSAgICAgICAgICBncmFtbWFyRmlsZSA9IGVudGl0eVJlc29sdmVyLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBncmFtbWFyRmlsZSA9IGhlbHBlci5zY2hlbWFMb2NhdGlvblN0cmluZzsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIHNheFBhcnNlRXhjZXB0aW9uKQotICAgIHsKLSAgICAgIC8vIFRoZXNlIGVycm9ycyBhcmUgY2F1Z2h0IGJ5IHRoZSBlcnJvciBoYW5kbGVyLgotICAgICAgLy9hZGRWYWxpZGF0aW9uTWVzc2FnZSh2YWxpbmZvLCBzYXhQYXJzZUV4Y2VwdGlvbik7Ci0gICAgfSAgICAgICAgICAgICAgICAgCi0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjZXB0aW9uKQotICAgIHsKLSAgICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKHZhbGluZm8sIGlvRXhjZXB0aW9uKTsKLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7ICAKLSAgICAJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24pOwotICAgIH0KLQotICAgIC8vIE5vdyBzZXQgdXAgdGhlIGRlcGVuZGVuY2llcwotICAgIC8vIFdyYXAgd2l0aCB0cnkgY2F0Y2ggc28gdGhhdCBpZiBzb21ldGhpbmcgd3JvbmcgaGFwcGVucywgdmFsaWRhdGlvbiBjYW4KLSAgICAvLyBzdGlsbCBwcm9jZWVkIGFzIGJlZm9yZQotICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0V29ya3NwYWNlRmlsZUZyb21Mb2NhdGlvbihncmFtbWFyRmlsZSk7Ci0gICAgICAgIEFycmF5TGlzdCByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICAgIHJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotICAgICAgICByZXN1bHQuc2V0RGVwZW5kc09uKChJUmVzb3VyY2UgW10pcmVzb3VyY2VzLnRvQXJyYXkobmV3IElSZXNvdXJjZSBbMF0pKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NQVJLVVBfVkFMSURBVElPTikpewotCSAgICBJUmVwb3J0ZXIgcmVwb3J0ZXIgPSBleGVjdXRlTWFya3VwVmFsaWRhdG9yKHVyaSk7Ci0JICAgIGlmIChyZXBvcnRlciAhPSBudWxsKXsKLQkJICAgIExpc3QgbXNnTGlzdCA9IHJlcG9ydGVyLmdldE1lc3NhZ2VzKCk7Ci0JCSAgICBmb3IgKGludCBpID0gMDtpIDwgbXNnTGlzdC5zaXplKCk7aSsrKXsKLQkJICAgIAlMb2NhbGl6ZWRNZXNzYWdlIG1zZyA9IChMb2NhbGl6ZWRNZXNzYWdlKW1zZ0xpc3QuZ2V0KGkpOwotCQkgICAgCWlmIChtc2cuZ2V0U2V2ZXJpdHkoKSA9PSAyKQotCQkgICAgCQl2YWxpbmZvLmFkZEVycm9yKG1zZy5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG1zZy5nZXRMaW5lTnVtYmVyKCksIG1zZy5nZXRPZmZzZXQoKSx2YWxpbmZvLmdldEZpbGVVUkkoKSwibnVsbCIsZ2V0TXNnQXJndW1lbnRzKG1zZykgKTsgLy8kTk9OLU5MUy0xJAotCQkgICAgCWVsc2UgaWYgKG1zZy5nZXRTZXZlcml0eSgpID09IDEpCi0JCSAgICAJCXZhbGluZm8uYWRkV2FybmluZyhtc2cuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBtc2cuZ2V0TGluZU51bWJlcigpLCBtc2cuZ2V0T2Zmc2V0KCksdmFsaW5mby5nZXRGaWxlVVJJKCksIm51bGwiLCBnZXRNc2dBcmd1bWVudHMobXNnKSk7IC8vJE5PTi1OTFMtMSQKLQkJICAgIH0KLQkgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdmFsaW5mbzsKLSAgICAgICAKLSAgfQotCi0gIHByaXZhdGUgT2JqZWN0W10gZ2V0TXNnQXJndW1lbnRzKExvY2FsaXplZE1lc3NhZ2UgbXNnKXsKLQkgIE9iamVjdCBvYmogPSBtc2cuZ2V0QXR0cmlidXRlKEFOTk9UQVRJT05NU0cpOwotCSAgcmV0dXJuIG5ldyBPYmplY3RbXXtvYmp9OwotICB9Ci0gCi0KLQlwcml2YXRlIElSZXBvcnRlciBleGVjdXRlTWFya3VwVmFsaWRhdG9yKFN0cmluZyB1cmkpewotCQlQYXRoIHBhdGggPSBuZXcgUGF0aCh1cmkpOwotCQlTdHJpbmcgZmlsZVByb3RvY29sID0gImZpbGU6Ly8iOyAvLyROT04tTkxTLTEkCi0JCWludCBpbmRleCA9IHVyaS5pbmRleE9mKGZpbGVQcm90b2NvbCk7Ci0JCQotCQlJRmlsZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChpbmRleCA9PSAwKXsKLQkJCVN0cmluZyB0cmFuc2Zvcm1lZFVyaSA9IHVyaS5zdWJzdHJpbmcoZmlsZVByb3RvY29sLmxlbmd0aCgpKTsKLQkJCVBhdGggdHJhbnNmb3JtZWRQYXRoID0gbmV3IFBhdGgodHJhbnNmb3JtZWRVcmkpOwotCQkJcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbih0cmFuc2Zvcm1lZFBhdGgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQkKLQkJfQotCQlJUmVwb3J0ZXIgcmVwb3J0ZXIgPSBudWxsOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCl7Ci0JCSAgICByZXBvcnRlciA9IHZhbC52YWxpZGF0ZShyZXNvdXJjZSwgMCwgbmV3IFZhbE9wZXJhdGlvbigpLmdldFN0YXRlKCkpIDsKLQkJfQotCQlyZXR1cm4gcmVwb3J0ZXI7Ci0JfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvIG9iamVjdCB0byBhZGQgdGhlIGVycm9yIHRvLgotICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdGhhdCBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKFhNTFZhbGlkYXRpb25JbmZvIHZhbGluZm8sIElPRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgeyAKLSAgICBTdHJpbmcgdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBleGNlcHRpb24uZ2V0TWVzc2FnZSgpOwotCVRocm93YWJsZSBjYXVzZSA9IGV4Y2VwdGlvbi5nZXRDYXVzZSgpICE9IG51bGwgPyBleGNlcHRpb24uZ2V0Q2F1c2UoKSA6IGV4Y2VwdGlvbjsKLQl3aGlsZSh2YWxpZGF0aW9uTWVzc2FnZVN0ciA9PSBudWxsICYmIGNhdXNlICE9IG51bGwpewotCQlTdHJpbmcgbG9jYWxpemVkTWVzc2FnZSA9IGNhdXNlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkgICAgY2F1c2UgPSBjYXVzZS5nZXRDYXVzZSgpOwotCSAgICBpZihjYXVzZSA9PSBudWxsICYmIGxvY2FsaXplZE1lc3NhZ2UgIT0gbnVsbCApCi0JICAgIHsKLQkgICAgICB2YWxpZGF0aW9uTWVzc2FnZVN0ciA9IGxvY2FsaXplZE1lc3NhZ2U7Ci0JICAgIH0KLQl9Ci0JCi0JaWYgKHZhbGlkYXRpb25NZXNzYWdlU3RyICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGNhdXNlIGluc3RhbmNlb2YgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKQotICAgICAgewotICAgICAgICB2YWxpZGF0aW9uTWVzc2FnZVN0ciA9IE5MUy5iaW5kKFhNTFZhbGlkYXRpb25NZXNzYWdlcy5fVUlfUFJPQkxFTVNfVkFMSURBVElOR19GSUxFX05PVF9GT1VORCwgbmV3IE9iamVjdCBbXSB7IHZhbGlkYXRpb25NZXNzYWdlU3RyIH0pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY2F1c2UgaW5zdGFuY2VvZiBVbmtub3duSG9zdEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAJdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBOTFMuYmluZChYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1VJX1BST0JMRU1TX1ZBTElEQVRJTkdfVU5LTk9XTl9IT1NULCBuZXcgT2JqZWN0IFtdIHsgdmFsaWRhdGlvbk1lc3NhZ2VTdHIgfSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKGNhdXNlIGluc3RhbmNlb2YgQ29ubmVjdEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAJdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1VJX1BST0JMRU1TX0NPTk5FQ1RJT05fUkVGVVNFRDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2VTdHIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYTUxMb2NhdG9yIGxvY2F0b3IgPSB2YWxpbmZvLmdldFhNTExvY2F0b3IoKTsKLSAgICAgIHZhbGluZm8uYWRkV2FybmluZyh2YWxpZGF0aW9uTWVzc2FnZVN0ciwgbG9jYXRvciAhPSBudWxsID8gbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgOiAxLCBsb2NhdG9yICE9IG51bGwgPyBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpIDogMCwgdmFsaW5mby5nZXRGaWxlVVJJKCksIEZJTEVfTk9UX0ZPVU5EX0tFWSwgbnVsbCk7Ci0gICAgfQotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvKioKLSAgICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gb2JqZWN0IHRvIGFkZCB0aGUgZXJyb3IgdG8uCi0gICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbywgU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKQotICB7IAotICAgIGlmIChleGNlcHRpb24uZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0gICAgeyAKLSAgICAgIHZhbGluZm8uYWRkRXJyb3IoZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSwgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpLCBleGNlcHRpb24uZ2V0U3lzdGVtSWQoKSk7Ci0gICAgfQotICB9Ci0KLSAgCi0gIC8qKgotICAgKiBBIGN1c3RvbSBlbnRpdHkgcmVzb2x2ZXIgdGhhdCB1c2VzIHRoZSBVUkkgcmVzb2x2ZXIgc3BlY2lmaWVkIHRvIHJlc29sdmUgZW50aXRpZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgTXlFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyIAotICB7Ci0gICAgcHJpdmF0ZSBVUklSZXNvbHZlciB1cmlSZXNvbHZlcjsKLSAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlZERURExvY2F0aW9uOwotICAgIHByaXZhdGUgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0OwotICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaVJlc29sdmVyIFRoZSBVUkkgcmVzb2x2ZXIgdG8gdXNlIHdpdGggdGhpcyBlbnRpdHkgcmVzb2x2ZXIuCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIFhNTCB2YWxpZGF0b3IgY29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXlFbnRpdHlSZXNvbHZlcihVUklSZXNvbHZlciB1cmlSZXNvbHZlciwgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgIHRoaXMudXJpUmVzb2x2ZXIgPSB1cmlSZXNvbHZlcjsKLSAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgICAqLwotICAgIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciByaWQpIHRocm93cyBYTklFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYTUxJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IF9pbnRlcm5hbFJlc29sdmVFbnRpdHkodXJpUmVzb2x2ZXIsIHJpZCwgY29udGV4dCk7Ci0gICAgICAgIGlmIChpbnB1dFNvdXJjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb2x2ZWREVERMb2NhdGlvbiA9IGlucHV0U291cmNlLmdldFN5c3RlbUlkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlucHV0U291cmNlOwotICAgIH0KLSAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiByZXNvbHZlZERURExvY2F0aW9uOwotICAgIH0KLSAgfQotICAKLSAgLy8gY3MgOiBJJ3ZlIHJlZmFjdG9yZWQgdGhlIGNvbW1vbiBTQVggYmFzZWQgcmVzb2x1dGlvbiBjb2RlIGludG8gdGhpcyBtZXRob2QgZm9yIHVzZSBieSBvdGhlciB2YWxpZGF0b3JzIAotICAvLyAoaS5lLiBYTUwgU2NoZW1hLCBXU0RMIGV0YykuICAgVGhlIG90aGVyIGFwcHJvYWNoIGlzIG1haW50YWluIGEgY29weSBmb3IgZWFjaCB2YWxpZGF0b3IgdGhhdCBoYXMKLSAgLy8gaWRlbnRpY2FsIGNvZGUuICBJbiBhbnkgY2FzZSB3ZSBzaG91bGQgc3RyaXZlIHRvIGVuc3VyZSB0aGF0IHRoZSB2YWxpZGF0b3JzIHBlcmZvcm0gcmVzb2x1dGlvbiBjb25zaXN0ZW50bHkuIAotICBwdWJsaWMgc3RhdGljIFhNTElucHV0U291cmNlIF9pbnRlcm5hbFJlc29sdmVFbnRpdHkoVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIsIFhNTFJlc291cmNlSWRlbnRpZmllciByaWQpIHRocm93cyAgSU9FeGNlcHRpb24KLSAgewotICAgIHJldHVybiBfaW50ZXJuYWxSZXNvbHZlRW50aXR5KHVyaVJlc29sdmVyLCByaWQsIG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFhNTElucHV0U291cmNlIF9pbnRlcm5hbFJlc29sdmVFbnRpdHkoVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIsIFhNTFJlc291cmNlSWRlbnRpZmllciByaWQsIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzICBJT0V4Y2VwdGlvbgotICB7Ci0gICAgWE1MSW5wdXRTb3VyY2UgaXMgPSBudWxsOwotICAgIAotICAgIGlmICh1cmlSZXNvbHZlciAhPSBudWxsKQotICAgIHsgICAgICAgICAKLSAgICAgIFN0cmluZyBpZCA9IHJpZC5nZXRQdWJsaWNJZCgpOwotICAgICAgaWYoaWQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWQgPSByaWQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoaWQgIT0gbnVsbCB8fCByaWQuZ2V0TGl0ZXJhbFN5c3RlbUlkKCkgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBsb2NhdGlvbiA9IHVyaVJlc29sdmVyLnJlc29sdmUocmlkLmdldEJhc2VTeXN0ZW1JZCgpLCBpZCwgcmlkLmdldExpdGVyYWxTeXN0ZW1JZCgpKTsKLSAgICAgIH0gIAotICAgICAgCi0gICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIHBoeXNpY2FsID0gdXJpUmVzb2x2ZXIucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24ocmlkLmdldEJhc2VTeXN0ZW1JZCgpLCBpZCwgbG9jYXRpb24pOwotCi0gICAgICAgIC8vIGlmIHBoeXNpY2FsIGlzIGFscmVhZHkgYSBrbm93biBiYWQgdXJpLCBqdXN0IGdvIGFoZWFkIGFuZCB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBYTUxOZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dCB4bWxDb250ZXh0ID0gKChYTUxOZXN0ZWRWYWxpZGF0b3JDb250ZXh0KWNvbnRleHQpOwotCi0gICAgICAgICAgaWYgKHhtbENvbnRleHQuaXNVUklNYXJrZWRJbmFjY2Vzc2libGUocGh5c2ljYWwpKQotICAgICAgICAgIHsKLSAgICAgICAgCSB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHBoeXNpY2FsKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlzID0gbmV3IFhNTElucHV0U291cmNlKHJpZC5nZXRQdWJsaWNJZCgpLCBsb2NhdGlvbiwgbG9jYXRpb24pOwotICAgICAgICAKLSAgICAgICAgLy8gVGhpcyBibG9jayBjaGVja3MgdGhhdCB0aGUgZmlsZSBleGlzdHMuIElmIGl0IGRvZXNuJ3Qgd2UgbmVlZCB0byB0aHJvdwotICAgICAgICAvLyBhbiBleGNlcHRpb24gc28gWGVyY2VzIHdpbGwgcmVwb3J0IGFuIGVycm9yLiBub3RlOiBUaGlzIG1heSBub3QgYmUKLSAgICAgICAgLy8gbmVjZXNzYXJ5IHdpdGggYWxsIHZlcnNpb25zIG9mIFhlcmNlcyBidXQgaGFzIHNwZWNpZmljYWxseSBiZWVuIAotICAgICAgICAvLyBleHBlcmllbmNlZCB3aXRoIHRoZSB2ZXJzaW9uIGluY2x1ZGVkIGluIElCTSdzIDEuNC4yIEpESy4KLSAgICAgICAgSW5wdXRTdHJlYW0gaXNUZW1wID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpc1RlbXAgPSBuZXcgVVJMKHBoeXNpY2FsKS5vcGVuU3RyZWFtKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBwaHlzaWNhbCB3YXMgYSBiYWQgdXJsLCBzbyBjYWNoZSBpdCBzbyB3ZSBrbm93IG5leHQgdGltZQotICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYTUxOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IHhtbENvbnRleHQgPSAoKFhNTE5lc3RlZFZhbGlkYXRvckNvbnRleHQpY29udGV4dCk7Ci0gICAgICAgICAgICB4bWxDb250ZXh0Lm1hcmtVUklJbmFjY2Vzc2libGUocGh5c2ljYWwpOwotICAgICAgICAgIH0KLSAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlmKGlzVGVtcCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzVGVtcC5jbG9zZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpcy5zZXRCeXRlU3RyZWFtKG5ldyBMYXp5VVJMSW5wdXRTdHJlYW0ocGh5c2ljYWwpKTsgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGlzOyAgICAKLSAgfSAgICAgIAotICAKLSAgLyoqCi0gICAqIEFuIGVycm9yIGhhbmRsZXIgdG8gY2F0Y2ggZXJyb3JzIGVuY291bnRlcmVkIHdoaWxlIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBYTUxFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLSAgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgRVJST1IgPSAwOwotICAgIHByaXZhdGUgZmluYWwgaW50IFdBUk5JTkcgPSAxOwotICAgIHByaXZhdGUgWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsaW5mbyBUaGUgWE1MIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgdGhhdCB3aWxsIGhvbGQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAgICovCi0gICAgcHVibGljIFhNTEVycm9ySGFuZGxlcihYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKQotICAgIHsKLSAgICAgIHRoaXMudmFsaW5mbyA9IHZhbGluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uLCBpbnQgc2V2ZXJpdHkpCi0gICAgewotICAgICAgaWYoZXhjZXB0aW9uLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgCQotICAgIAlpbnQgbGluZU51bWJlciA9IGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgCWludCBjb2x1bW5OdW1iZXIgPSBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCk7Ci0gICAgCQotICAgIAkvLyBGb3IgdGhlIGZvbGxvd2luZyB0aHJlZSBlcnJvcnMgdGhlIGxpbmUgbnVtYmVyIHdpbGwgYmUgbW9kaWZpZWQgdG8gdXNlIHRoYXQgb2YgdGhlIHN0YXJ0Ci0gICAgCS8vIHRhZyBpbnN0ZWFkIG9mIHRoZSBlbmQgdGFnLiBVbmxlc3MgaXRzIGEgc2VsZiBlbmRpbmcgdGFnIGFuZCBpbiB0aGF0IGNhc2UgdGhlIHN0YXJ0RWxlbWVudExvY2F0aW9ucyB3aWxsIGJlIGVtcHR5Ci0gICAgCVN0cmluZyBjdXJyZW50RXJyb3JLZXkgPSB2YWxpbmZvLmN1cnJlbnRFcnJvcktleTsKLSAgICAJaWYgKGN1cnJlbnRFcnJvcktleSAhPSBudWxsICYmIGFkanVzdExvY2F0aW9uRXJyb3JLZXlTZXQuY29udGFpbnMoY3VycmVudEVycm9yS2V5KSAmJiB2YWxpbmZvLmdldFN0YXJ0RWxlbWVudExvY2F0aW9ucygpLnNpemUoKSA+IDApICAKLSAgICAJewotICAgIAkgIExvY2F0aW9uQ29vcmRpbmF0ZSBhZGp1c3RlZENvb3JkaW5hdGVzID0gKExvY2F0aW9uQ29vcmRpbmF0ZSl2YWxpbmZvLmdldFN0YXJ0RWxlbWVudExvY2F0aW9ucygpLnBlZWsoKTsKLSAgICAJICBsaW5lTnVtYmVyID0gYWRqdXN0ZWRDb29yZGluYXRlcy5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgCSAgY29sdW1uTnVtYmVyID0gYWRqdXN0ZWRDb29yZGluYXRlcy5nZXRDb2x1bW5OdW1uZXIoKTsKLSAgICAJfQotICAgIAkKLSAgICAgICAgaWYoc2V2ZXJpdHkgPT0gV0FSTklORykKLSAgICAgICAgewotICAgICAgICAgIHZhbGluZm8uYWRkV2FybmluZyhleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIsIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpbmZvLmFkZEVycm9yKGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlciwgZXhjZXB0aW9uLmdldFN5c3RlbUlkKCksIHZhbGluZm8uZ2V0Q3VycmVudEVycm9yS2V5KCksIHZhbGluZm8uZ2V0TWVzc2FnZUFyZ3VtZW50cygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIEVSUk9SKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKGV4Y2VwdGlvbiwgRVJST1IpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoZXhjZXB0aW9uLCBXQVJOSU5HKTsKLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKiAKLSAgICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNvdW50IHRoZSBlbGVtZW50RGVjbHMgdGhhdCBhcmUgZW5jb3VudGVyZWQgaW4gYSBEVEQuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgTXlEZWNsSGFuZGxlciBpbXBsZW1lbnRzIERlY2xIYW5kbGVyIAotICB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbGluZm8gVGhlIFhNTFZhbGlkYXRpb25JbmZvIG9iamVjdCB0aGF0IHdpbGwgY291bnQgdGhlIGRlY2xhcmF0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXlEZWNsSGFuZGxlcigpCi0gICAgewotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjYXR0cmlidXRlRGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZURlY2woU3RyaW5nIGVOYW1lLCBTdHJpbmcgYU5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWVEZWZhdWx0LCBTdHJpbmcgdmFsdWUpIAotICAgIHsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjZWxlbWVudERlY2woamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZGVsKSAKLSAgICB7Ci0gICAgICAvL3ZhbGluZm8uaW5jcmVhc2VFbGVtZW50RGVjbGFyYXRpb25Db3VudCgpOwotICAgIH0KLSAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2V4dGVybmFsRW50aXR5RGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4dGVybmFsRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIAotICAgIHsKLSAgICB9ICAgICAgCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjaW50ZXJuYWxFbnRpdHlEZWNsKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW50ZXJuYWxFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIAotICAgIHsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQSBYSW5jbHVkZUF3YXJlUGFyc2VyQ29uZmlndXJhdGlvbiB0aGF0IGNyZWF0ZXMgYW4gZXJyb3IgcmVwb3J0ZXIgd2hpY2ggY2FuIGlnbm9yZQotICAgKiBEVEQgZXJyb3IgbWVzc2FnZXMgZm9yIERURCdzIHdpdGggbm8gZWxlbWVudHMgZGVmaW5lZC4KLSAgICovCi0KLSAgcHJvdGVjdGVkIGNsYXNzIE15U3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uIGV4dGVuZHMgWEluY2x1ZGVBd2FyZVBhcnNlckNvbmZpZ3VyYXRpb24KLSAgewotICAJWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbyA9IG51bGw7Ci0gICAgTGlzdCByZXBvcnRlZEV4Y2VwdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7IAotICAJCi0gIAkvKioKLSAgCSAqIENvbnN0cnVjdG9yLgotICAJICogCi0gIAkgKiBAcGFyYW0gdmFsaW5mbyBUaGUgWE1MVmFsaWRhdGlvbkluZm8gb2JqZWN0IHRvIHVzZS4KLSAgCSAqLwotICAJcHVibGljIE15U3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uKFhNTFZhbGlkYXRpb25JbmZvIHZhbGluZm8pCi0gIAl7Ci0gIAkgIHRoaXMudmFsaW5mbyA9IHZhbGluZm87Ci0gIAkgIAotICAJICBYTUxFcnJvclJlcG9ydGVyIGVycm9yUmVwb3J0ZXIgPSBjcmVhdGVFcnJvclJlcG9ydGVyKCk7Ci0gICAgICBpZiAoZXJyb3JSZXBvcnRlci5nZXRNZXNzYWdlRm9ybWF0dGVyKFhNTE1lc3NhZ2VGb3JtYXR0ZXIuWE1MX0RPTUFJTikgPT0gbnVsbCkgewotICAgICAgICAgIFhNTE1lc3NhZ2VGb3JtYXR0ZXIgeG1mdCA9IG5ldyBYTUxNZXNzYWdlRm9ybWF0dGVyKCk7Ci0gICAgICAgICAgZXJyb3JSZXBvcnRlci5wdXRNZXNzYWdlRm9ybWF0dGVyKFhNTE1lc3NhZ2VGb3JtYXR0ZXIuWE1MX0RPTUFJTiwgeG1mdCk7Ci0gICAgICAgICAgZXJyb3JSZXBvcnRlci5wdXRNZXNzYWdlRm9ybWF0dGVyKFhNTE1lc3NhZ2VGb3JtYXR0ZXIuWE1MTlNfRE9NQUlOLCB4bWZ0KTsKLSAgICAgIH0gIAkgIAotICAgICAgZkVycm9yUmVwb3J0ZXIgPSBlcnJvclJlcG9ydGVyOwotCSAgc2V0UHJvcGVydHkoRVJST1JfUkVQT1JURVIsIGVycm9yUmVwb3J0ZXIpOwotCSAgZkNvbW1vbkNvbXBvbmVudHMucmVtb3ZlKGZFcnJvclJlcG9ydGVyKTsKLQkgIGZDb21tb25Db21wb25lbnRzLmFkZChmRXJyb3JSZXBvcnRlcik7Ci0gIAl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkRURENvbmZpZ3VyYXRpb24jY3JlYXRlRXJyb3JSZXBvcnRlcigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhNTEVycm9yUmVwb3J0ZXIgY3JlYXRlRXJyb3JSZXBvcnRlcigpIAotICAgIHsKLSAgICAJcmV0dXJuIG5ldyBYTUxFcnJvclJlcG9ydGVyKCkKLQkJewotICAgIAkJLyogKG5vbi1KYXZhZG9jKQotICAgIAkJICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVycm9yUmVwb3J0ZXIjcmVwb3J0RXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdLCBzaG9ydCkKLSAgICAJCSAqLwotICAgIAkJcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIGtleSwgT2JqZWN0W10gYXJndW1lbnRzLCBzaG9ydCBzZXZlcml0eSkgdGhyb3dzIFhOSUV4Y2VwdGlvbiAKLSAgICAJICAgIHsgICAgICAgICAgICAgICAgICAgIAotCQkgICAgICBib29sZWFuIHJlcG9ydEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgdmFsaW5mby5zZXRDdXJyZW50RXJyb3JLZXkoa2V5KTsgIAotCQkJICB2YWxpbmZvLnNldE1lc3NhZ2VBcmd1bWVudHMoYXJndW1lbnRzKTsKLQkJICAgICAgU3RyaW5nIGlnbm9yZUNvbmRpdGlvbiA9IChTdHJpbmcpaW5nb3JlZEVycm9yS2V5VGFibGUuZ2V0KGtleSk7Ci0JCSAgICAgIGlmIChpZ25vcmVDb25kaXRpb24gIT0gbnVsbCkKLQkJICAgICAgewotCQkgICAgICAgIGlmIChpZ25vcmVDb25kaXRpb24uZXF1YWxzKFhNTFZhbGlkYXRvci5JR05PUkVfSUZfRFREX1dJVEhPVVRfRUxFTUVOVF9ERUNMKSkKLQkJICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAKLQkJICAgICAgICAgIGJvb2xlYW4gaXNEVERXaXRob3V0RWxlbWVudERlY2xhcmF0aW9uRW5jb3VudGVyZWQgPSB2YWxpbmZvLmlzRFREV2l0aG91dEVsZW1lbnREZWNsYXJhdGlvbkVuY291bnRlcmVkKCk7IAotCQkgICAgICAgICAgcmVwb3J0RXJyb3IgPSAhaXNEVERXaXRob3V0RWxlbWVudERlY2xhcmF0aW9uRW5jb3VudGVyZWQ7ICAKLQkJICAgICAgICB9Ci0JCSAgICAgICAgZWxzZSAKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICByZXBvcnRFcnJvciA9IGZhbHNlOwotCQkgICAgICAgIH0KLQkJICAgICAgfQotCQkgICAgICBpZiAoInNjaGVtYV9yZWZlcmVuY2UuNCIuZXF1YWxzKGtleSkgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdCBsb2NhdGlvbiA9IGFyZ3VtZW50c1swXTsgIAotICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgICAgaWYocmVwb3J0ZWRFeGNlcHRpb25zLmNvbnRhaW5zKGxvY2F0aW9uKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0RXJyb3IgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWRFeGNlcHRpb25zLmFkZChsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9ICAgICAgICAgIAotCQkgICAgICBpZiAocmVwb3J0RXJyb3IpCi0JCSAgICAgIHsKLQkJICAgICAgICBzdXBlci5yZXBvcnRFcnJvcihkb21haW4sIGtleSwgYXJndW1lbnRzLCBzZXZlcml0eSk7Ci0JCSAgICAgICAgdmFsaW5mby5nZXRFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyKCkuY29uc2lkZXJSZXBvcnRlZEVycm9yKHZhbGluZm8sIGtleSwgYXJndW1lbnRzKTsKLQkJICAgICAgfQotCQkgICAgfQotCQl9OwotICAgIH0KLSAgfQotICAKLSAgLyoqIAotICAgKiBBIGxpbmUgYW5kIGNvbHVtbiBudW1iZXIgY29vcmRpbmF0ZS4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBMb2NhdGlvbkNvb3JkaW5hdGUKLSAgewkKLQlwcml2YXRlIGludCBsaW5lTm8gPSAtMTsKLSAgICBwcml2YXRlIGludCBjb2x1bW5ObyA9IC0xOwotICAgIAotICAgIHB1YmxpYyBMb2NhdGlvbkNvb3JkaW5hdGUoaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIpCi0gICAgewotICAgICAgdGhpcy5saW5lTm8gPSBsaW5lTnVtYmVyOwotICAgICAgdGhpcy5jb2x1bW5ObyA9IGNvbHVtbk51bWJlcjsKLSAgICB9Ci0gICAgCQotICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0gICAgeyAKLSAgICAgIHJldHVybiB0aGlzLmxpbmVObzsKLSAgICB9Ci0gICAgCQotICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtbmVyKCkKLSAgICB7IAotICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTm87Ci0gICAgfSAKLSAgfQotICAKLSAgcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRXb3Jrc3BhY2VGaWxlRnJvbUxvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAvLyBUbyBjYW5vbmljYWxpemUgdGhlIEVNRiBVUkkKLSAgICBJUGF0aCBjYW5vbmljYWxGb3JtID0gbmV3IFBhdGgobG9jYXRpb24pOwotICAgIC8vIE5lZWQgdG8gY29udmVydCB0byBhYnNvbHV0ZSBsb2NhdGlvbi4uLgotICAgIElQYXRoIHBhdGhMb2NhdGlvbiA9IG5ldyBQYXRoKFVSSUhlbHBlci5yZW1vdmVQcm90b2NvbChjYW5vbmljYWxGb3JtLnRvU3RyaW5nKCkpKTsKLSAgICAvLyAuLi50byBmaW5kIHRoZSByZXNvdXJjZSBmaWxlIHRoYXQgaXMgaW4gdGhlIHdvcmtzcGFjZQotICAgIElSZXNvdXJjZSByZXNvdXJjZUZpbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoTG9jYXRpb24pOwotICAgIC8vIElmIHRoZSByZXNvdXJjZSBpcyByZXNvbHZlZCB0byBhIGZpbGUgZnJvbSBodHRwLCBvciBhIGZpbGUgb3V0c2lkZQotICAgIC8vIHRoZSB3b3Jrc3BhY2UsIHRoZW4gd2Ugd2lsbCBqdXN0IGlnbm9yZSBpdC4KLSAgICByZXR1cm4gcmVzb3VyY2VGaWxlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0Fic3RyYWN0TmVzdGVkVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0Fic3RyYWN0TmVzdGVkVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxODNmNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9BYnN0cmFjdE5lc3RlZFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5Bbm5vdGF0aW9uTXNnOwotCi0vKioKLSAqIEFuIGFic3RyYWN0IHZhbGlkYXRvciB0aGF0IGFzc2lzdHMgdmFsaWRhdG9ycyBpbiBydW5uaW5nIGFuZCBjb250cmlidXRpbmcKLSAqIG5lc3RlZCBtZXNzYWdlcyBpbiB0aGUgdmFsaWRhdGlvbiByZXN1bHRzLiAKLSAqICpub3RlOiBTdWJjbGFzc2VzIGRvIG5vdCBuZWVkIHRvIGNvbnRyaWJ1dGUgbmVzdGVkIG1lc3NhZ2VzIGluIG9yZGVyIHRvCi0gKiBiZW5lZml0IGZyb20gdGhlIHVzZSBvZiB0aGlzIGNsYXNzLiBUaGlzIGNsYXNzIHRha2VzIGNhcmUgb2YgaXRlcmF0aW5nCi0gKiB0aHJvdWdoIHJlc3VsdHMgZm9yIHZhbGlkYXRvcnMgdGhhdCB1c2UgdGhlIHN0YW5kYXJkIGNvbnRleHQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5lc3RlZFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvckpvYiAKLXsKLSAgLy8gTG9jYWxseSB1c2VkLCBub24tVUkgc3RyaW5ncy4KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfRklMRV9FUlJPUl9PUEVOID0gInJlZmVyZW5jZWRGaWxlRXJyb3IoIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFRF9GSUxFX0VSUk9SX0NMT1NFID0gIikiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MX05PX1NMQVNIID0gImZpbGU6IjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOi8vLyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VUX0ZJTEUgPSAiZ2V0RmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VUX1BST0pFQ1RfRklMRVMgPSAiZ2V0QWxsRmlsZXMiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEdFVF9JTlBVVFNUUkVBTSA9ICJpbnB1dFN0cmVhbSI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIC8vIEludGVybmFsIHN0cmluZ3MuIFRoZXNlIHN0cmluZ3MgYXJlIGNvbW1vbiBhZGRpdGlvbiBpbmZvcm1hdGlvbiB0eXBlcy4KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUgPSAiY29sdW1uTnVtYmVyIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUVVJR0dMRV9TRUxFQ1RJT05fU1RSQVRFR1lfQVRUUklCVVRFID0gInNxdWlnZ2xlU2VsZWN0aW9uU3RyYXRlZ3kiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNRVUlHR0xFX05BTUVfT1JfVkFMVUVfQVRUUklCVVRFID0gInNxdWlnZ2xlTmFtZU9yVmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIHZhbGlkYXRpb24gdXNpbmcgdmVyc2lvbiAyIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKLQkgIFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsgIAotCSAgSVJlcG9ydGVyIHJlcG9ydGVyID0gcmVzdWx0LmdldFJlcG9ydGVyKG1vbml0b3IpOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpZmlsZSA9IChJRmlsZSlyZXNvdXJjZTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJewotCQkgIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgbmVzdGVkY29udGV4dCA9IGdldE5lc3RlZENvbnRleHQoc3RhdGUsIGZhbHNlKTsKLQkgICAgICBib29sZWFuIHRlYXJkb3duUmVxdWlyZWQgPSBmYWxzZTsKLQkgICAgICBpZiAobmVzdGVkY29udGV4dCA9PSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIC8vIHZhbGlkYXRpb25zdGFydCB3YXMgbm90IGNhbGxlZCwgc28gbWFudWFsbHkgc2V0dXAgYW5kIHRlYXIgZG93bgotCSAgICAgICAgbmVzdGVkY29udGV4dCA9IGdldE5lc3RlZENvbnRleHQoc3RhdGUsIHRydWUpOwotCSAgICAgICAgc2V0dXBWYWxpZGF0aW9uKG5lc3RlZGNvbnRleHQpOwotCSAgICAgICAgdGVhcmRvd25SZXF1aXJlZCA9IHRydWU7Ci0JICAgICAgfQotCi0JCSAgdmFsaWRhdGUoZmlsZSwgbnVsbCwgcmVzdWx0LCByZXBvcnRlciwgbmVzdGVkY29udGV4dCk7Ci0KLQkgICAgICBpZiAodGVhcmRvd25SZXF1aXJlZCkKLQkgICAgICAgIHRlYXJkb3duVmFsaWRhdGlvbihuZXN0ZWRjb250ZXh0KTsKLQkJfQotCSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gCi0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYiN2YWxpZGF0ZUluSm9iKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gCi0gIHsKLQlOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IG5lc3RlZGNvbnRleHQgPSBuZXcgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCgpOwotCXNldHVwVmFsaWRhdGlvbihuZXN0ZWRjb250ZXh0KTsKLQlTdHJpbmdbXSBmaWxlVVJJcyA9IGNvbnRleHQuZ2V0VVJJcygpOwotCWlmIChmaWxlVVJJcyAhPSBudWxsICYmIGZpbGVVUklzLmxlbmd0aCA+IDApIAotCXsKLQkgIGludCBudW1GaWxlcyA9IGZpbGVVUklzLmxlbmd0aDsKLQkgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRmlsZXMgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCk7IGkrKykgCi0JICB7Ci0JICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGVVUklzW2ldOwotCSAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkKLQkgICAgeyAgICAgICAgICAKLQkgICAgICBPYmplY3QgW11wYXJtcyA9IHtmaWxlTmFtZX07Ci0KLQkgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBjb250ZXh0LmxvYWRNb2RlbChHRVRfRklMRSwgcGFybXMpOwotCSAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgc2hvdWxkVmFsaWRhdGUoZmlsZSkpIAotCSAgICAgIHsgCi0JICAgIAkvLyBUaGUgaGVscGVyIG1heSBub3QgaGF2ZSBhIGZpbGUgc3RvcmVkIGluIGl0IGJ1dCBtYXkgaGF2ZSBhbiBJbnB1dFN0cmVhbSBpZiBiZWluZwotCSAgICAJLy8gY2FsbGVkIGZyb20gYSBzb3VyY2Ugb3RoZXIgdGhhbiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgc3VjaCBhcyBhbiBlZGl0b3IuCi0JICAgICAgICBpZiAoY29udGV4dC5sb2FkTW9kZWwoR0VUX0lOUFVUU1RSRUFNKSBpbnN0YW5jZW9mIElucHV0U3RyZWFtKQotCSAgICAgICAgewotCSAgICAgICAgICB2YWxpZGF0ZShmaWxlLCAoSW5wdXRTdHJlYW0pY29udGV4dC5sb2FkTW9kZWwoR0VUX0lOUFVUU1RSRUFNKSwgbnVsbCwgcmVwb3J0ZXIsIG5lc3RlZGNvbnRleHQpOyAvL2RvIHdlIG5lZWQgdGhlIGZpbGVOYW1lPyAgd2hhdCBpcyBpbnQgcnVsZUdyb3VwPwotCSAgICAgICAgfQotCSAgICAgICAgZWxzZQotCSAgICAgICAgewotCSAgICAJICB2YWxpZGF0ZShmaWxlLCBudWxsLCBudWxsLCByZXBvcnRlciwgbmVzdGVkY29udGV4dCk7Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci0JfQotCS8vIFRPRE86IElzIHRoaXMgbmVlZGVkPyBTaG91bGRuJ3QgdGhlIGZyYW1ld29yayBwYXNzIHRoZSBjb21wbGV0ZSBsaXN0PyAKLQkvLyBTaG91bGQgSSBrbm93IHRoYXQgSSdtIHZhbGlkYXRpbmcgYSBwcm9qZWN0IGFzIG9wcG9zZWQgdG8gZmlsZXM/Ci0JZWxzZSAKLSAgICB7Ci0gICAgICBPYmplY3QgW11wYXJtcyA9IHtnZXRWYWxpZGF0b3JJRCgpfTsKLSAgICAgIENvbGxlY3Rpb24gZmlsZXMgPSAoQ29sbGVjdGlvbikgY29udGV4dC5sb2FkTW9kZWwoR0VUX1BST0pFQ1RfRklMRVMsIHBhcm1zKTsKLSAgICAgIC8vIGZpbGVzIGNhbiBiZSBudWxsIGlmIHRoZXkncmUgb3V0c2lkZSBvZiB0aGUgd29ya3NwYWNlCi0gICAgICBpZiAoZmlsZXMgIT0gbnVsbCkgewotCSAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBmaWxlcy5pdGVyYXRvcigpOwotCSAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgCi0JICAgICAgewotCSAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgaXRlci5uZXh0KCk7Ci0JICAgICAgICBpZihzaG91bGRWYWxpZGF0ZShmaWxlKSkKLQkgICAgICAgIHsKLQkJICAgICAgdmFsaWRhdGUoZmlsZSwgbnVsbCwgbnVsbCwgcmVwb3J0ZXIsIG5lc3RlZGNvbnRleHQpOwotCSAgICAgICAgfQotCSAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0JCi0JdGVhcmRvd25WYWxpZGF0aW9uKG5lc3RlZGNvbnRleHQpOwotCWlmKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpCi0JICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQcm92aWRlcyB0aGUgaWQgb2YgdGhpcyB2YWxpZGF0b3IuIFRoZSBJRCBpcyB1c2VkIGJ5IHRoZSB2YWxpZGF0aW9uCi0gICAqIGZyYW1ld29yay4gSXQgdXN1YWxseSBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzCi0gICAqIGltcGxlbWVudGluZyB0aGUgSVZhbGlkYXRvciBpbnRlcmZhY2UuCi0gICAqIAotICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIElEIG9mIHRoaXMgdmFsaWRhdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0b3JJRCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBlcmZvcm0gc2V0IHVwIGJlZm9yZSB2YWxpZGF0aW9uIHJ1bnMuIFN1YmNsYXNzZXMgbWF5IGltcGxlbWVudCB0aGlzCi0gICAqIG1ldGhvZCB0byBwZXJmb3JtIHZhbGlkYXRpb24gc3BlY2lmaWMgc2V0IHVwLgotICAgKiAKLSAgICogQHBhcmFtIGNvbnRleHQKLSAgICogCQlUaGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0dXBWYWxpZGF0aW9uKE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkKLSAgewotCS8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICB9Ci0gIAotICAvKioKLSAgICogUGVyZm9ybSB0ZWFyIGRvd24gYWZ0ZXIgdmFsaWRhdGlvbiBydW5zLiBTdWJjbGFzc2VzIG1heSBpbXBsZW1lbnQgdGhpcwotICAgKiBtZXRob2QgdG8gcGVyZm9ybSB2YWxpZGF0aW9uIHNwZWNpZmljIHRlYXIgZG93bi4KLSAgICogCi0gICAqIEBwYXJhbSBjb250ZXh0Ci0gICAqIAkJVGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHRlYXJkb3duVmFsaWRhdGlvbihOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpCi0gIHsKLQkvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYiNnZXRTY2hlZHVsaW5nUnVsZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGFyZzApIAotICB7Ci0JLy8gVE9ETyByZXZpZXcgd2hldGhlciByZXR1cm5pbmcgYSBudWxsIHJ1bGUgaXMgY29ycmVjdC4gR2FyeSBoYWQgYSBzdWdnZXN0aW9uIGluIHRoZSBidWcgcmVwb3J0LgotCXJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciNjbGVhbnVwKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgYXJnMCkgCi0gIHsKLSAgICAvLyBObyBjbGVhbnVwIHRvIHBlcmZvcm0uIFN1YmNsYXNzZXMgYXJlIGZyZWUgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciN2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiAKLSAgeyAgCi0JdmFsaWRhdGVJbkpvYihjb250ZXh0LCByZXBvcnRlcik7Ci0gIH0KLQkKLQkKLSAgLyoqCi0gICAqIERldGVybWluZSBpZiBhIGdpdmVuIGZpbGUgc2hvdWxkIGJlIHZhbGlkYXRlZC4gCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0aGF0IG1heSBiZSB2YWxpZGF0ZWQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZSBzaG91bGQgYmUgdmFsaWRhdGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlKElGaWxlIGZpbGUpIAotICB7Ci0JSVJlc291cmNlIHJlc291cmNlID0gZmlsZTsKLQlkbyAKLQl7Ci0JICBpZiAocmVzb3VyY2UuaXNEZXJpdmVkKCkgfHwgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpIHx8IAotCQkgICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSB8fCByZXNvdXJjZS5nZXROYW1lKCkuY2hhckF0KDApID09ICcuJykgCi0JICB7Ci0JCXJldHVybiBmYWxzZTsKLQkgIH0KLQkgIHJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JfXdoaWxlICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLlBST0pFQ1QpID09IDApOwotCQotCXJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGdpdmVuIGZpbGUgYW5kIHVzZSB0aGUgcmVwb3J0ZXIgZm9yIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJmb3JtIHRoZSB2YWxpZGF0aW9uIGxvZ2ljIGJ1dCByYXRoZXIgZGVsZWdhdGVzCi0gICAqIHRvIHRoZSB2YWxpZGF0ZSBtZXRob2QgaW4gc3ViY2xhc3NlcyB0byB2YWxpZGF0ZS4gVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUKLSAgICogZm9yIHJlcG9ydGluZyB0aGUgbWVzc2FnZXMgdGhhdCByZXN1bHQgZnJvbSB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUgCi0gICAqIAkJQW4gSUZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBpbnB1dHN0cmVhbSAKLSAgICogCQlBbiBJbnB1dFN0cmVhbSB0aGF0IHJlcHJlc2VudHMgdGhlIGZpbGUuIFRoZSBJbnB1dFN0cmVhbSBtYXkgYmUgbnVsbAotICAgKiAJCWluIHdoaWNoIGNhc2UgdGhlIGZpbGVzIHNob3VsZCBiZSB2YWxpZGF0ZWQgZnJvbSB0aGUgSUZpbGUuCi0gICAqIEBwYXJhbSByZXN1bHQgLSBUaGUgdmFsaWRhdGlvbiByZXN1bHQKLSAgICogQHBhcmFtIHJlcG9ydGVyIAotICAgKiAJCVRoZSByZXBvcnRlciB3aXRoIHdoaWNoIHRvIHJlcG9ydCB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiAJCVRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqLwotICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoSUZpbGUgZmlsZSwgSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0sIFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0LCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkKLSAgeyAgCi0JTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzc2FnZSk7Ci0gICAgCi0JU3RyaW5nIGxvY2F0aW9uU3RyaW5nID0gbnVsbDsJCQotCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQlsb2NhdGlvblN0cmluZyA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCX0KLQlpZiAobG9jYXRpb25TdHJpbmcgPT0gbnVsbCAmJiBmaWxlLmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkgewotCQlsb2NhdGlvblN0cmluZyA9IGZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotCX0KLQlpZiAobG9jYXRpb25TdHJpbmcgPT0gbnVsbCkgewotCQlsb2NhdGlvblN0cmluZyA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCX0KLQlTdHJpbmcgdXJpID0gY3JlYXRlVVJJRm9yRmlsZVBhdGgobG9jYXRpb25TdHJpbmcpOwotCi0JY2xlYXJNYXJrZXJzKGZpbGUsIHRoaXMsIHJlcG9ydGVyKTsKLQkKLQlWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IG51bGw7Ci0JaWYgKHJlc3VsdCA9PSBudWxsKQotCSAgdmFscmVwb3J0ID0gdmFsaWRhdGUodXJpLCBpbnB1dHN0cmVhbSwgY29udGV4dCk7Ci0JZWxzZQotCSAgdmFscmVwb3J0ID0gdmFsaWRhdGUodXJpLCBpbnB1dHN0cmVhbSwgY29udGV4dCwgcmVzdWx0KTsKLQkKLQljcmVhdGVNYXJrZXJzKGZpbGUsIHZhbHJlcG9ydC5nZXRWYWxpZGF0aW9uTWVzc2FnZXMoKSwgcmVwb3J0ZXIpOwotCSAgICAgICAgCi0JdHJ5Ci0JewotCSAgZmlsZS5zZXRTZXNzaW9uUHJvcGVydHkoVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1JfTUVTU0FHRV9NQVBfUVVBTElGSUVEX05BTUUsIHZhbHJlcG9ydC5nZXROZXN0ZWRNZXNzYWdlcygpKTsKLQl9Ci0JY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKQotCXsKLQkgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIHNldCBuZXN0ZWQgbWVzc2FnZXMgcHJvcGVydHkuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0gIH0KLQkKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBmaWxlIGFuZCB1c2UgdGhlIHJlcG9ydGVyIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogQ2xpZW50cyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB3aXRoIHRoZWlyIHNwZWNpZmljIHZhbGlkYXRpb24gbG9naWMuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqIAkJVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGlucHV0c3RyZWFtIAotICAgKiAJCUFuIElucHV0U3RyZWFtIHRoYXQgcmVwcmVzZW50cyB0aGUgZmlsZS4gVGhlIElucHV0U3RyZWFtIG1heSBiZSBudWxsCi0gICAqIAkJaW4gd2hpY2ggY2FzZSB0aGUgZmlsZXMgc2hvdWxkIGJlIHZhbGlkYXRlZCBmcm9tIHRoZSBJRmlsZS4KLSAgICogQHBhcmFtIGNvbnRleHQKLSAgICogCQlUaGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB2YWxpZGF0aW9uLgotICAgKiBAcmV0dXJuCi0gICAqIAkJQSB2YWxpZGF0aW9uIHJlcG9ydCBzdW1tYXJpemluZyB0aGUgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpOwotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBmaWxlIGFuZCB1c2UgdGhlIHJlcG9ydGVyIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogQ2xpZW50cyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2l0aCB0aGVpciBzcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljLgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm93IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYWJzdHJhY3QgdmVyc2lvbi4KLSAgICogRGVzaWduIGRlY2lzaW9uIHRvIG5vdCBtYWtlIHRoaXMgYWJzdHJhY3QuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqIEBwYXJhbSBpbnB1dHN0cmVhbQotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiBAcGFyYW0gcmVzdWx0Ci0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQsIFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRlKHVyaSwgaW5wdXRzdHJlYW0sIGNvbnRleHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgdGhlIG1hcmtlcnMgb24gdGhlIGdpdmVuIElGaWxlIGZvciBhIHNwZWNpZmllZAotICAgKiB2YWxpZGF0b3IuCi0gICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHN1YmNsYXNzZXMuCi0gICAqIAotICAgKiBAcGFyYW0gaUZpbGUKLSAgICogCQlUaGUgSUZpbGUgZnJvbSB3aGljaCB0byBjbGVhciB0aGUgbWFya2Vycy4KLSAgICogQHBhcmFtIHZhbGlkYXRvcgotICAgKiAJCVRoZSB2YWxpZGF0b3IgZm9yIHdoaWNoIHRvIHJlbW92ZSB0aGUgbWFya2Vycy4KLSAgICogQHBhcmFtIHJlcG9ydGVyCi0gICAqIAkJVGhlIHJlcG9ydGVyIHRoYXQgY2FuIHJlbW92ZSB0aGUgbWFya2Vycy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjbGVhck1hcmtlcnMoSUZpbGUgaUZpbGUsIElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gIHsKLQlpZiAoZmlsZUlzQWNjZXNzaWJsZShpRmlsZSkpCi0JewotCSAgcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yLCBpRmlsZSk7Ci0JfQotICB9Ci0JICAKLSAgLyoqCi0gICAqIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBpcyBhY2Nlc3NpYmxlIGFuZCBtYXkgYmUgdXNlZCBmb3IgdmFsaWRhdGlvbi4gQSBmaWxlIGlzIAotICAgKiBhdmFpbGFibGUgaWYgCi0gICAqIDEuIEl0IGlzIG5vdCBudWxsLgotICAgKiAyLiBJdCBleGlzdHMuIAotICAgKiAzLiBUaGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBmaWxlIGlzIGFjY2Vzc2libGUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZSAKLSAgICogCQlUaGUgZmlsZSB0byBjaGVjayB0byBlbnN1cmUgaXQgaXMgYWNjZXNzaWJsZS4KLSAgICogQHJldHVybiAKLSAgICogCQlUcnVlIGlmIHRoZSBmaWxlIGlzIGFjY2Vzc2libGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBmaWxlSXNBY2Nlc3NpYmxlKElGaWxlIGZpbGUpCi0gIHsKLSAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpCi0JewotCSAgcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLSAgfQotCSAgCi0gIC8qKgotICAgKiBGb3JtYXQgYSBmaWxlIG5hbWUgaW50byBhIGNvcnJlY3QgVVJJLiAKLSAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3Igc3ViY2xhc3Nlcy4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlbmFtZSAKLSAgICogCQlUaGUgZmlsZSBuYW1lIHRvIGZvcm1hdC4KLSAgICogQHJldHVybiAKLSAgICogCQkKLSAgICogVGhlIGZvcm1hdHRlZCBVUkkuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBjcmVhdGVVUklGb3JGaWxlUGF0aChTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLQlpZighZmlsZW5hbWUuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MX05PX1NMQVNIKSkKLQl7Ci0JICB3aGlsZShmaWxlbmFtZS5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkgIHsKLQkgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMSk7Ci0JICB9Ci0JICBmaWxlbmFtZSA9IEZJTEVfUFJPVE9DT0wgKyBmaWxlbmFtZTsKLQl9Ci0JcmV0dXJuIGZpbGVuYW1lOwotICB9Ci0JICAKLSAgLyoqCi0gICAqIENyZWF0ZSBtYXJrZXJzIGZvciB0aGUgdmFsaWF0aW9uIG1lc3NhZ2VzIGdlbmVyYXRlZCBmcm9tIHRoZSB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGlGaWxlCi0gICAqICAgICAgICAgIFRoZSByZXNvdXJjZSB0byBjcmVhdGUgdGhlIG1hcmtlcnMgb24uCi0gICAqIEBwYXJhbSB2YWxtZXNzYWdlcwotICAgKiAgICAgICAgICBUaGUgYXJyYXkgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZU1hcmtlcnMoSUZpbGUgaUZpbGUsIFZhbGlkYXRpb25NZXNzYWdlW10gdmFsbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikKLSAgewotICAgIGlmICghZmlsZUlzQWNjZXNzaWJsZShpRmlsZSkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgbnVtbWVzc2FnZXMgPSB2YWxtZXNzYWdlcy5sZW5ndGg7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1tZXNzYWdlczsgaSsrKQotICAgIHsKLSAgICAgIFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlID0gdmFsbWVzc2FnZXNbaV07Ci0gICAgICBTdHJpbmcgdXJpID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0VXJpKCk7Ci0KLSAgICAgIExvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZTsKLSAgICAgIGlmICh2YWxpZGF0aW9uTWVzc2FnZS5nZXRTZXZlcml0eSgpID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9MT1cpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIAotICAgICAgICAJCXZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2UoKSwgaUZpbGUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAKLSAgICAgICAgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIHZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2UoKSwgaUZpbGUpOwotICAgICAgfQotICAgICAgCi0gICAgICBtZXNzYWdlLnNldExpbmVObyh2YWxpZGF0aW9uTWVzc2FnZS5nZXRMaW5lTnVtYmVyKCkpOwotICAgICAgYWRkSW5mb1RvTWVzc2FnZSh2YWxpZGF0aW9uTWVzc2FnZSwgbWVzc2FnZSk7Ci0gICAgICBPYmplY3RbXSBvYmpsaXN0ID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TWVzc2FnZUFyZ3VtZW50cygpOwotICAgICAgaWYgKG9iamxpc3QgIT0gbnVsbCAmJiBvYmpsaXN0Lmxlbmd0aCA9PTEgKXsKLSAgICAJICBPYmplY3Qgb2JqID0gb2JqbGlzdFswXTsKLSAgICAJICBpZiAob2JqIGluc3RhbmNlb2YgQW5ub3RhdGlvbk1zZyl7Ci0JICAgIAkgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoQW5ub3RhdGlvbk1zZy5QUk9CTUxFTV9JRCwgbmV3IEludGVnZXIoKChBbm5vdGF0aW9uTXNnKW9iaikuZ2V0UHJvYmxlbUlkKCkpKTsKLQkgICAgCSBtZXNzYWdlLnNldEF0dHJpYnV0ZShBbm5vdGF0aW9uTXNnLkxFTkdUSCwgbmV3IEludGVnZXIoKChBbm5vdGF0aW9uTXNnKW9iaikuZ2V0TGVuZ3RoKCkpKTsKLQkgICAgCSAgT2JqZWN0IG9iajEgPSAoKEFubm90YXRpb25Nc2cpb2JqKS5nZXRBdHRyaWJ1dGVWYWx1ZVRleHQoKTsKLQkgICAgCSAgaWYgKG9iajEgaW5zdGFuY2VvZiBTdHJpbmcpewotCSAgICAJCSAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoQW5ub3RhdGlvbk1zZy5BVFRSVkFMVUVURVhULCBvYmoxKTsKLQkgICAgCSAgfQotCSAgICAJICBlbHNlIGlmICggb2JqMSBpbnN0YW5jZW9mIE9iamVjdFtdKXsKLQkgICAgCQkgIE9iamVjdFtdIG9iakFycmF5ID0gKE9iamVjdFtdKW9iajE7Ci0JICAgIAkJICBtZXNzYWdlLnNldEF0dHJpYnV0ZShBbm5vdGF0aW9uTXNnLkFUVFJWQUxVRU5PLCBuZXcgSW50ZWdlcihvYmpBcnJheS5sZW5ndGgpKTsKLQkgICAgCQkgIGZvciAoaW50IGo9MDsgaiA8b2JqQXJyYXkubGVuZ3RoO2orKyl7Ci0JICAgIAkJCSAgT2JqZWN0IG9iajIgPSBvYmpBcnJheVtqXTsKLQkgICAgCQkJICBTdHJpbmcgYXR0ck5hbWUgPSBBbm5vdGF0aW9uTXNnLkFUVFJOTyArIGo7Ci0JICAgIAkJCSAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIG9iajIpOwotCSAgICAJCSAgfQotCSAgICAJCSAgCi0JICAgIAkgIH0KLSAgICAJICB9Ci0gICAgICB9Ci0gICAgICBMaXN0IG5lc3RlZGVycm9ycyA9IHZhbGlkYXRpb25NZXNzYWdlLmdldE5lc3RlZE1lc3NhZ2VzKCk7Ci0gICAgICBpZiAobmVzdGVkZXJyb3JzICE9IG51bGwgJiYgIW5lc3RlZGVycm9ycy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2Uuc2V0R3JvdXBOYW1lKFJFRkVSRU5DRURfRklMRV9FUlJPUl9PUEVOICsgdXJpICsgUkVGRVJFTkNFRF9GSUxFX0VSUk9SX0NMT1NFKTsKLSAgICAgIH0KLQotICAgICAgcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkgICAgICAKLSAgICB9Ci0gIH0KLQkgIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgYWxsb3dzIHRoZSBhZGRpdGlvbiBvZiBpbmZvcm1hdGlvbiB0byB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0gICAqIEBwYXJhbSB2YWxpZGF0aW9ubWVzc2FnZQotICAgKiAJCVRoZSBWYWxpZGF0aW9uTWVzc2FnZSB0byByZXRyaWV2ZSB0aGUgaW5mb3JtYXRpb24gZnJvbS4KLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogCQlUaGUgSU1lc3NhZ2UgdG8gYWRkIHRoZSBpbmZvcm1hdGlvbiB0by4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZEluZm9Ub01lc3NhZ2UgKFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25tZXNzYWdlLCBJTWVzc2FnZSBtZXNzYWdlKQotICB7IAotCS8vIFRoaXMgbWV0aG9kIG1heSBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG5lc3RlZCB2YWxpZGF0aW9uIGNvbnRleHQuCi0gICAqIAotICAgKiBAcGFyYW0gc3RhdGUKLSAgICogICAgICAgICAgdGhlIHZhbGlkYXRpb24gc3RhdGUuCi0gICAqIEBwYXJhbSBjcmVhdGUKLSAgICogICAgICAgICAgd2hlbiB0cnVlLCBhIG5ldyBjb250ZXh0IHdpbGwgYmUgY3JlYXRlZCBpZiBvbmUgaXMgbm90IGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIG5lc3RlZCB2YWxpZGF0aW9uIGNvbnRleHQuCi0gICAqLwotICBwcm90ZWN0ZWQgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBnZXROZXN0ZWRDb250ZXh0KFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgYm9vbGVhbiBjcmVhdGUpCi0gIHsKLSAgICBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQgPSBudWxsOwotICAgIGlmIChjcmVhdGUpCi0gICAgewotICAgICAgY29udGV4dCA9IG5ldyBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0KCk7Ci0gICAgfQotICAgIHJldHVybiBjb250ZXh0OwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbG9jYWxpemVkIG1lc3NhZ2UgaXMgYSBzcGVjaWFsaXplZCB0eXBlIG9mIElNZXNzYWdlIHRoYXQgYWxsb3dzIHNldHRpbmcKLSAgICogYW5kIHVzaW5nIGEgbG9jYWxpemVkIG1lc3NhZ2Ugc3RyaW5nIGZvciBhIG1lc3NhZ2UuCi0gICAqLwotICBjbGFzcyBMb2NhbGl6ZWRNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSAKLSAgewotICAgIHByaXZhdGUgU3RyaW5nIF9tZXNzYWdlID0gbnVsbDsKLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0KSAKLQl7Ci0JICB0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIElSZXNvdXJjZSB0YXJnZXRPYmplY3QpIAotCXsKLQkgIHRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCAoT2JqZWN0KSB0YXJnZXRPYmplY3QpOwotCX0KLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBPYmplY3QgdGFyZ2V0T2JqZWN0KSAKLQl7Ci0JICBzdXBlcihudWxsLCBzZXZlcml0eSwgbnVsbCk7Ci0JICBzZXRMb2NhbGl6ZWRNZXNzYWdlKG1lc3NhZ2VUZXh0KTsKLQkgIHNldFRhcmdldE9iamVjdCh0YXJnZXRPYmplY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2FsaXplZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIAotCXsKLQkgIF9tZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSAKLQl7Ci0JICByZXR1cm4gX21lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgCi0JewotCSAgcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoQ2xhc3NMb2FkZXIgY2wpIAotCXsKLQkgIHJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsKSAKLQl7Ci0JICByZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCwgQ2xhc3NMb2FkZXIgY2wpIAotCXsKLQkgIHJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0hlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0OTdhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgdmFsaWRhdGlvbiBpbiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKiAKLSAqIEBhdXRob3IgRXJuZXN0IE1haCAoZXJuZXN0QGNhLmlibS5jb20pCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxwZXIgZXh0ZW5kcyBXb3JrYmVuY2hDb250ZXh0Ci17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9QUk9KRUNUX0ZJTEVTID0gImdldEFsbEZpbGVzIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfRklMRSA9ICJnZXRGaWxlIjsgLy8kTk9OLU5MUy0xJAotICAvL2R3IHByaXZhdGUgc3RhdGljIGZpbmFsIElDb250YWluZXJbXSBOT19DT05UQUlORVJTID0gbmV3IElDb250YWluZXJbMF07Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUFSS0VSID0gIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByb2JsZW1tYXJrZXIiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUFSS0VSX09XTkVSID0gIm93bmVyIjsgICAvLyROT04tTkxTLTEkCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIEhlbHBlcigpCi0gIHsKLSAgICBzdXBlcigpOwotCi0gICAgLy8gdGhlIGZvbGxvd2luZyB3aWxsIHJlZ2lzdGVyIHRoZSBoZWxwZXIncyBzeW1ib2xpYyBtZXRob2RzCi0gICAgQ2xhc3MgW10gYXJncyA9IG5ldyBDbGFzc1sxXSA7Ci0gICAgYXJnc1swXSA9IFN0cmluZy5jbGFzcyA7ICAvLyBhIHN0cmluZyBhcmd1bWVudCBkZW5vdGluZyBhIHNwZWNpZmljIEpTUC4KLSAgICAKLSAgICByZWdpc3Rlck1vZGVsKEdFVF9GSUxFLCAiZ2V0RmlsZSIsIGFyZ3MpOy8vJE5PTi1OTFMtMSQKLSAgICByZWdpc3Rlck1vZGVsKEdFVF9QUk9KRUNUX0ZJTEVTLCAiZ2V0RmlsZXMiLCBhcmdzKTsvLyROT04tTkxTLTEkCi0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBJRmlsZSBmb3IgdGhlIGdpdmVuIGZpbGVuYW1lLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHJldHJpZXZlLgotICAgKiBAcmV0dXJuIEFuIElGaWxlIHJlcHJlc2VudGluZyB0aGUgZmlsZSBzcGVjaWZpZWQgb3IgbnVsbCBpZiBpdCBjYW4ndCBiZSByZXNvbHZlZC4KLSAgICovCi0gIHB1YmxpYyBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlbmFtZSkKLSAgewotICAgIC8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmlsZSBuYW1lID0gIiArIGZpbGVuYW1lKTsKLSAgICBJUmVzb3VyY2UgcmVzID0gZ2V0UHJvamVjdCgpLmZpbmRNZW1iZXIoZmlsZW5hbWUsIHRydWUpOyAvLyB0cnVlIG1lYW5zIGluY2x1ZGUgcGhhbnRvbSByZXNvdXJjZXMKLSAgICBpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIAotICAgIHsKLSAgICAgIHJldHVybiAoSUZpbGUpIHJlczsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbGxlY3Rpb24gb2YgZmlsZXMgZnJvbSB0aGUgcHJvamVjdCB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlCi0gICAqIHZhbGlkYXRvciB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLgotICAgKiAKLSAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGNsYXNzLgotICAgKiBAcmV0dXJuIFRoZSBjb2xsZWN0aW9uIG9mIGZpbGVzIHJlbGV2YW50IGZvciB0aGUgdmFsaWRhdG9yIGNsYXNzIHNwZWNpZmllZC4KLSAgICovCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldEZpbGVzKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpCi0gIHsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotICAgIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZ2V0RmlsZXMoZmlsZXMsIHByb2plY3QsIHZhbGlkYXRvckNsYXNzTmFtZSk7Ci0gICAgcmV0dXJuIGZpbGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY29sbGVjdGlvbiBvZiBmaWxlcyBmcm9tIHRoZSBwcm9qZWN0IHRoYXQgYXJlIHJlbGV2YW50IGZvciB0aGUKLSAgICogdmFsaWRhdG9yIHdpdGggdGhlIGdpdmVuIGNsYXNzIG5hbWUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZXMgVGhlIGZpbGVzIHJlbGV2YW50IGZvciB0aGUgY2xhc3MgbmFtZS4KLSAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZSB0byBsb29rIGZvciBmaWxlcyBpbi4KLSAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGNsYXNzLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZ2V0RmlsZXMoQ29sbGVjdGlvbiBmaWxlcywgSUNvbnRhaW5lciByZXNvdXJjZSwgU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIElSZXNvdXJjZSBbXSByZXNvdXJjZUFycmF5ID0gcmVzb3VyY2UubWVtYmVycyhmYWxzZSk7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8cmVzb3VyY2VBcnJheS5sZW5ndGg7IGkrKykKLSAgICAgIHsgICAgICAgCi0gICAgICAgIGlmIChWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc0FwcGxpY2FibGVUbyh2YWxpZGF0b3JDbGFzc05hbWUsIHJlc291cmNlQXJyYXlbaV0pKSAKLSAgICAgICAgewotICAgICAgICAgIGlmIChyZXNvdXJjZUFycmF5W2ldIGluc3RhbmNlb2YgSUZpbGUpIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVzLmFkZChyZXNvdXJjZUFycmF5W2ldKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc291cmNlQXJyYXlbaV0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpCi0gICAgICAgICBnZXRGaWxlcyhmaWxlcywoSUNvbnRhaW5lcilyZXNvdXJjZUFycmF5W2ldLCB2YWxpZGF0b3JDbGFzc05hbWUpIDsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICB9Ci0KLSAgCi0vKioKLSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UsIHdpdGhvdXQgdGhlIHByb2plY3Qtc3BlY2lmaWMgaW5mb3JtYXRpb24gCi0gKiBpbiBmcm9udC4KLSAqCi0gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IFZhbGlkYXRpb25PcGVyYXRpb24gdG8gY2FsY3VsYXRlIHRoZSBub24tZW52aXJvbm1lbnQgCi0gKiBzcGVjaWZpYyBuYW1lcyBvZiB0aGUgZmlsZXMuIE9ubHkgdGhlIElXb3JrYmVuY2hDb250ZXh0IGltcGxlbWVudGF0aW9uIGtub3dzIGhvdyAKLSAqIG11Y2ggaW5mb3JtYXRpb24gdG8gc3RyaXAgb2ZmIG9mIHRoZSBJUmVzb3VyY2UgbmFtZS4gRm9yIGV4YW1wbGUsIGlmIHRoZXJlIGlzCi0gKiBhbiBFSkIgUHJvamVjdCBuYW1lZCAiTXlFSkJQcm9qZWN0IiwgYW5kIGl0IHVzZXMgdGhlIGRlZmF1bHQgbmFtZXMgZm9yIHRoZSAKLSAqIHNvdXJjZSBhbmQgb3V0cHV0IGZvbGRlcnMsICJzb3VyY2UiIGFuZCAiZWpiTW9kdWxlIiwgcmVzcGVjdGl2ZWx5LCB0aGVuIHRoZQotICogY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBFSkIgSGVscGVyIGtub3dzIGhvdyBtdWNoIG9mIHRoYXQgc3RydWN0dXJlIGlzIAotICogZWNsaXBzZS1zcGVjaWZpYy4gCi0gKgotICogU2luY2UgdGhlICJzb3VyY2UiIGZvbGRlciBjb250YWlucyBKYXZhIHNvdXJjZSBmaWxlcywgYSBwb3J0YWJsZSBuYW1lIHdvdWxkCi0gKiBiZSB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MsIHdpdGhvdXQgdGhlIGVjbGlwc2Utc3BlY2lmaWMKLSAqIHByb2plY3QgYW5kIGZvbGRlciBuYW1lcyBpbiBmcm9udCBvZiB0aGUgZmlsZSBuYW1lLiBUaGUgRUpCSGVscGVyIGtub3dzIHRoYXQgCi0gKiBldmVyeXRoaW5nIHVwIHRvIHRoZSAic291cmNlIiBmb2xkZXIsIGZvciBleGFtcGxlLCBjYW4gYmUgcmVtb3ZlZCwgYmVjYXVzZSwgCi0gKiBhY2NvcmRpbmcgdG8gdGhlIGRlZmluaXRpb24gb2YgdGhlIEVKQiBQcm9qZWN0LCBldmVyeXRoaW5nIGNvbnRhaW5lZAotICogaW4gdGhlIHNvdXJjZSBmb2xkZXIgaXMgamF2YSBzb3VyY2UgY29kZS4gU28gaWYgdGhlcmUgaXMgYW4gSVJlc291cmNlIGluIGFuCi0gKiBFSkIgUHJvamVjdCBuYW1lZCAiL015RUpCUHJvamVjdC9zb3VyY2UvY29tL2libS9teWNsYXNzZXMvTXlKYXZhRmlsZS5qYXZhIiwKLSAqIHRoaXMgbWV0aG9kIHdvdWxkIG1ha2UgdGhpcyBuYW1lIHBvcnRhYmxlIGJ5IHN0cmlwcGluZyBvZmYgdGhlCi0gKiAiL015RUpCUHJvamVjdC9zb3VyY2UiLCBhbmQgcmV0dXJuaW5nICJjb20vaWJtL215Y2xhc3Nlcy9NeUphdmFGaWxlLmphdmEiLgotICoKLSAqIFRoZSBvdXRwdXQgb2YgdGhpcyBtZXRob2QgaXMgdXNlZCBieSB0aGUgVmFsaWRhdGlvbk9wZXJhdGlvbiwgd2hlbiBpdAotICogaXMgY2FsY3VsYXRpbmcgdGhlIGxpc3Qgb2YgYWRkZWQvY2hhbmdlZC9kZWxldGVkIGZpbGUgbmFtZXMgZm9yIGluY3JlbWVudGFsCi0gKiB2YWxpZGF0aW9uLiBJZiBnZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlKSByZXR1cm5zIG51bGwsIHRoYXQgbWVhbnMKLSAqIHRoYXQgdGhlIElXb3JrYmVuY2hDb250ZXh0J3MgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGF0IHBhcnRpY3VsYXIKLSAqIHR5cGUgb2YgcmVzb3VyY2UsIGFuZCB0aGUgcmVzb3VyY2Ugc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgYXJyYXkgb2YKLSAqIElGaWxlRGVsdGEgb2JqZWN0cyBpbiB0aGUgSVZhbGlkYXRvcidzICJ2YWxpZGF0ZSIgbWV0aG9kLiAKLSAqIAotICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZSB0byBnZXQgdGhlIG5hbWUgZnJvbS4KLSAqIEByZXR1cm4gVGhlIHBvcnRhYmxlIG5hbWUgb2YgdGhlIHJlc291cmNlLgotICovCi1wdWJsaWMgU3RyaW5nIGdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UgcmVzb3VyY2UpCi0gIHsKLSAgICAvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldCBwb3J0YWJsZW5hbWUgZm9yICIgKyByZXNvdXJjZSk7Ci0gICAgcmV0dXJuIHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpOwotICB9Ci0KLS8qKgotICogV2hlbiBhbiBJVmFsaWRhdG9yIGFzc29jaWF0ZXMgYSB0YXJnZXQgb2JqZWN0IHdpdGggYW4gSU1lc3NhZ2UsCi0gKiB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgZXZlbnR1YWxseSByZXNvbHZlcyB0aGF0IHRhcmdldCBvYmplY3QKLSAqIHdpdGggYW4gSVJlc291cmNlLiBTb21ldGltZXMgbW9yZSB0aGFuIG9uZSB0YXJnZXQgb2JqZWN0IHJlc29sdmVzCi0gKiB0byB0aGUgc2FtZSBJUmVzb3VyY2UgKHVzdWFsbHkgdGhlIElQcm9qZWN0LCB3aGljaCBpcyB0aGUgZGVmYXVsdAotICogSVJlc291cmNlIHdoZW4gYW4gSUZpbGUgY2Fubm90IGJlIGZvdW5kKS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkLAotICogYnkgdGhlIFdvcmtiZW5jaFJlcG9ydGVyLCBzbyB0aGF0IHRoZSBXb3JrYmVuY2hSZXBvcnRlciBjYW4gCi0gKiBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBJTWVzc2FnZXMgd2hpY2ggYXJlIG9uIHRoZSBzYW1lIElSZXNvdXJjZSwgCi0gKiBidXQgcmVmZXIgdG8gZGlmZmVyZW50IHRhcmdldCBvYmplY3RzLiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIAotICogcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KSBtZXRob2QsIHNvIHRoYXQgd2hlbiBvbmUKLSAqIHRhcmdldCBvYmplY3QgcmVtb3ZlcyBhbGwgb2YgaXRzIG1lc3NhZ2VzLCB0aGF0IGl0IGRvZXNuJ3QgcmVtb3ZlCi0gKiBhbm90aGVyIHRhcmdldCBvYmplY3QncyBtZXNzYWdlcy4KLSAqCi0gKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgb25seSBpZiBvYmplY3QgaXMgbnVsbC4gT3RoZXJ3aXNlLCBhbgotICogaWQgd2hpY2ggY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IGEgcGFydGljdWxhciBvYmplY3QgbXVzdCBiZSByZXR1cm5lZC4KLSAqIFRoZSBpZCBuZWVkcyB0byBiZSB1bmlxdWUgb25seSB3aXRoaW4gb25lIHBhcnRpY3VsYXIgSVZhbGlkYXRvci4KLSAqIAotICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBuYW1lLgotICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgb2JqZWN0IG9yIG51bGwgaWYgdGhlIG9iamVjdCBpcyBudWxsLgotICovCi1wdWJsaWMgU3RyaW5nIGdldFRhcmdldE9iamVjdE5hbWUoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIGlmIChvYmplY3QgPT0gbnVsbCkgCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0IHRhcmdldG5hbWUgZm9yICIgKyBvYmplY3QpOwotICAgIHJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIERlbGV0ZSB0aGUgbWFya2VycyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgZnJvbSB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgotICAgKiAKLSAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZSB0byBkZWxldGUgdGhlIG1hcmtlcnMgZnJvbS4KLSAgICogQHBhcmFtIG1hcmtlclR5cGUgVGhlIHR5cGUgb2YgbWFya2VycyB0byBkZWxldGUgZnJvbSB0aGUgcmVzb3VyY2UuCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgd2hpY2ggdGhlIG1hcmtlcnMgbXVzdCBoYXZlIHRvIGJlIGRlbGV0ZWQuCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBjb3JyZXNwb25kaW5nIHRvIGF0dHJpYnV0ZU5hbWUgd2hpY2ggdGhlIG1hcmtlcnMgbXVzdCBoYXZlIHRvIGJlIGRlbGV0ZWQuCi0gICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbWFya2VyVHlwZSwgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGZpbmFsIE9iamVjdCBhdHRyaWJ1dGVWYWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgeyAgICAgICAgICAKLSAgICBmaW5hbCBJTWFya2VyW10gdjQwME1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotICAgIGZpbmFsIElNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMobWFya2VyVHlwZSwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLSAgICBJV29ya3NwYWNlUnVubmFibGUgb3AgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgCi0gICAgIHsKLSAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIAotICAgICAgIHsgICAgCi0gICAgICAgICAvLyB0aGlzIGZpeGVzIGRlZmVjdCAxOTM0MDYKLSAgICAgICAgIC8vIGhlcmUgd2UgcmVtb3ZlIG1hcmtlcnMgdGhhdCBtYXkgaGF2ZSBiZWVuIGFkZGVkIGJ5IHRoZSB2NDAwIGNvZGUKLSAgICAgICAgIC8vIGhvcGVmdWxseSB0aGUgJy5tYXJrZXJzJyBtZXRhZGF0YSBmaWxlcyB3aWxsIGJlIHJlbW92ZWQgZm9yIHRoZSBWNSBpbnN0YWxsCi0gICAgICAgICAvLyBhbmQgdGhpcyBrbHVkZ2Ugd2lsbCBub3QgYmUgbmVlZGVkIHRoZXJlCi0gICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHY0MDBNYXJrZXJzLmxlbmd0aDsgaSsrKQotICAgICAgICAgewotICAgICAgICAgICBJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07ICAgICAgICAgICAKLSAgICAgICAgICAgbWFya2VyLmRlbGV0ZSgpOyAgICAgICAgICAgCi0gICAgICAgICB9Ci0gICAgCi0gICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIAotICAgICAgICAgewotICAgICAgICAgICBJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0gICAgICAgICAgIAotICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgdmFsdWUuZXF1YWxzKGF0dHJpYnV0ZVZhbHVlKSkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBtYXJrZXIuZGVsZXRlKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH07Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihvcCwgbnVsbCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeyB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHNldmVyaXR5IGZvciB0aGUgZ2l2ZW4gc2V2ZXJpdHkuCi0gICAqIAotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IHRvIGNvbnZlcnQgdG8gdmFsaWRhdGlvbiBmcmFtZXdvcmsgc2V2ZXJpdHkuCi0gICAqIEByZXR1cm4gVGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHNldmVyaXR5IGZvciB0aGUgZ2l2ZW4gc2V2ZXJpdHkuCi0gICAqLwotICBzdGF0aWMgcHVibGljIGludCBnZXRWYWxpZGF0aW9uRnJhbWV3b3JrU2V2ZXJpdHkoaW50IHNldmVyaXR5KQotICB7Ci0gICAgc3dpdGNoIChzZXZlcml0eSkKLSAgICB7Ci0gICAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfRVJST1I6Ci0gICAgICAgIHJldHVybiBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotICAgICAgY2FzZSBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc6Ci0gICAgICAgIHJldHVybiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0gICAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfSU5GTzoKLSAgICAgICAgcmV0dXJuIElNZXNzYWdlLkxPV19TRVZFUklUWTsKLSAgICB9Ci0gICAgcmV0dXJuIElNZXNzYWdlLkxPV19TRVZFUklUWTsgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0xhenlVUkxJbnB1dFN0cmVhbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9MYXp5VVJMSW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmZDIwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0xhenlVUkxJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGFsbG93cyBJbnB1dFN0cmVhbXMgdG8gYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWQgdG8geGVyY2VzIHdpdGhvdXQKLSAqIGFjdHVhbGx5IG9wZW5pbmcgZmlsZSBoYW5kbGVzIG9yIG5ldHdvcmsgY29ubmVjdGlvbnMgdW50aWwgaXQgaXMgYWJzb2x1dGVseQotICogbmVjY2Vzc2FyeS4KLSAqLwotcHVibGljIGNsYXNzIExhenlVUkxJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtCi17ICAKLS8vICBwcml2YXRlIHN0YXRpYyBpbnQgZGVidWdUb3RhbE9wZW5TdHJlYW1Db3VudCA9IDA7IAotICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW5uZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBlcnJvcjsKLSAgYm9vbGVhbiBoYXNNYXJrczsKLSAgYm9vbGVhbiBwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuOwotCi0gIHB1YmxpYyBMYXp5VVJMSW5wdXRTdHJlYW0oU3RyaW5nIHVybCkKLSAgewotICAgIHRoaXMudXJsID0gdXJsOwotCWlubmVyID0gbnVsbDsKLQlwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuID0gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoaW5uZXIgPT0gbnVsbCAmJiAhZXJyb3IpCi0gICAgewotLy8gICAgICBkZWJ1Z1RvdGFsT3BlblN0cmVhbUNvdW50Kys7Ci0gICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaW5uZXIgPSBuZXcgVVJMKHVybCkub3BlblN0cmVhbSgpOwotCQlwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuID0gZmFsc2U7Ci0JCWhhc01hcmtzID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5IAotICAgICAgewotICAgICAgICBpZiAoaW5uZXIgPT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZVN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbm5lciAhPSBudWxsICYmICFwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSB7Ci0JCQlpbm5lci5jbG9zZSgpOwotCQkJcHJldGVuZEZpbGVJc1N0aWxsT3BlbiA9IHRydWU7Ci0JCX0KLSAgCX0KLQotICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAwOwotCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gaW5uZXIuYXZhaWxhYmxlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHsKLQkJLy8gU3RvcCBiZWhhdmluZyBhcyBpZiB0aGUgc3RyZWFtIHdlcmUgc3RpbGwgb3Blbi4KLQkJcHJldGVuZEZpbGVJc1N0aWxsT3BlbiA9IGZhbHNlOwotCX0gZWxzZSB7Ci0JCWlmIChpbm5lciAhPSBudWxsKSB7Ci0vLwkJCWRlYnVnVG90YWxPcGVuU3RyZWFtQ291bnQtLTsKLQkJCWlubmVyLmNsb3NlKCk7Ci0JCX0KLQl9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkbGltaXQpCi0gIHsKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuOwotCWhhc01hcmtzID0gdHJ1ZTsKLQl0cnkgewotCQljcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKTsKLQkJaW5uZXIubWFyayhyZWFkbGltaXQpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKQotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiBmYWxzZTsKLQl0cnkgewotCQljcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKTsKLQkJaWYgKGlubmVyID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGlubmVyLm1hcmtTdXBwb3J0ZWQoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuIC0xOwotCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQlpbnQgYnl0ZXNSZWFkID0gaW5uZXIucmVhZCgpOwotCWlmIChieXRlc1JlYWQgPT0gLTEgJiYgIWhhc01hcmtzKSBjbG9zZVN0cmVhbSgpOwotCXJldHVybiBieXRlc1JlYWQ7Ci0gIH0KLQotCi0JcHVibGljIGludCByZWFkKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuIC0xOwotCQljcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKTsKLQkJaWYgKGlubmVyID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgYnl0ZXNSZWFkID0gaW5uZXIucmVhZChiKTsKLQkJaWYgKGJ5dGVzUmVhZCA9PSAtMSAmJiAhaGFzTWFya3MpIGNsb3NlU3RyZWFtKCk7Ci0JCXJldHVybiBieXRlc1JlYWQ7Ci0JfQotCi0gIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsgICAgCi0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAtMTsKLQljcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKTsKLQlpZiAoaW5uZXIgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gbm90IGF2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JaW50IGJ5dGVzUmVhZCA9IGlubmVyLnJlYWQoYiwgb2ZmLCBsZW4pOwotCWlmIChieXRlc1JlYWQgPT0gLTEgJiYgIWhhc01hcmtzKSBjbG9zZVN0cmVhbSgpOwotCXJldHVybiBieXRlc1JlYWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybjsKLQljcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKTsKLQlpZiAoaW5uZXIgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gbm90IGF2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JaW5uZXIucmVzZXQoKTsKLSAgfQotCi0gIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgeyAgIAotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm4gMDsKLQljcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKTsKLQlpZiAoaW5uZXIgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gbm90IGF2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGlubmVyLnNraXAobik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvTmVzdGVkVmFsaWRhdG9yQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9OZXN0ZWRWYWxpZGF0b3JDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjcxMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9OZXN0ZWRWYWxpZGF0b3JDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotCi0vKioKLSAqIEEgY29udGV4dCBjbGFzcyBmb3IgdmFsaWRhdG9ycyB0byBiZSBhYmxlIHRvIGRldGVybWluZSB0aGUgY29udGV4dCBvZgotICogZ2l2ZW4gdmFsaWRhdGlvbiBzZXNzaW9uLiBDdXJyZW50bHkgdGhpcyBjbGFzcyBpcyBvbmx5IHVzZWQgdG8gaWRlbnRpZnkKLSAqIHRoZSB1bmlxdWUgY29udGV4dC4KLSAqLwotcHVibGljIGNsYXNzIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgCi17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZjVlMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI5NzAwNSAtIFNvbWUgc3RhdGljIGNvbnN0YW50cyBub3QgbWFkZSBmaW5hbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uTWVzc2FnZXM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBoYW5kbGVzIG1lc3NhZ2VzIGZyb20gYSB2YWxpZGF0b3IuIFRoaXMgY2xhc3MgY2FuIGhhbmRsZQotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW5mbyBpbXBsZW1lbnRzIFZhbGlkYXRpb25SZXBvcnQKLXsKLSAgcHJpdmF0ZSBib29sZWFuIFdSQVBQRVJfRVJST1JfU1VQUE9SVF9FTkFCTEVEID0gdHJ1ZTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgIFNFVl9FUlJPUiA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVl9XQVJOSU5HID0gMTsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRpbmdfZmlsZV91cmkgPSBudWxsOwotICBwcml2YXRlIFVSTCB2YWxpZGF0aW5nX2ZpbGVfdXJsID0gbnVsbDsKLSAgcHJpdmF0ZSBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLSAgcHJpdmF0ZSBMaXN0IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIEhhc2hNYXAgbmVzdGVkTWVzc2FnZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogICAgICAgICAgICBUaGUgVVJJIG9mIHRoZSBmaWxlIGZvciB0aGUgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uSW5mbyhTdHJpbmcgdXJpKQotICB7Ci0gICAgaWYodXJpICE9IG51bGwpCi0gICAgewotICAgICAgdGhpcy52YWxpZGF0aW5nX2ZpbGVfdXJpID0gdXJpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHRoaXMudmFsaWRhdGluZ19maWxlX3VybCA9IG5ldyBVUkwodXJpKTsKLSAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdGluZ19maWxlX3VyaTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSkKLSAgewotICAgIGFkZEVycm9yKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpLCBudWxsLCBudWxsKTsKLSAgfSAgCi0gIAotICAvKioKLSAgICogCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIG1lc3NhZ2VBcmd1bWVudHMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSwgU3RyaW5nIGtleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgeyAgICAKLSAgICBpZihhZGRNZXNzYWdlKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpLCBTRVZfRVJST1IsIGtleSwgbWVzc2FnZUFyZ3VtZW50cykpCi0gICAgewotICAgICAgdmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgd2FybmluZyBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHN0cmluZyBtZXNzYWdlIG9mIHRoZSB3YXJuaW5nLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSB3YXJuaW5nLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgd2FybmluZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgYWRkV2FybmluZyhtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgbnVsbCwgbnVsbCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIFN0cmluZyBrZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsgICAgCi0gICAgYWRkTWVzc2FnZShtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgU0VWX1dBUk5JTkcsIGtleSwgbWVzc2FnZUFyZ3VtZW50cyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgYSBtZXNzYWdlIHRvIHRoZSBsaXN0LiBSZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQgdG8gdGhlIGxpc3QuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBYZXJjZXMgZXJyb3Iga2V5IGZvciB0aGlzIGVycm9yCi0gICAqIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGVycm9yCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbWVzc2FnZSB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIGludCBzZXZlcml0eSwgU3RyaW5nIGtleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgewotICAgIGJvb2xlYW4gc3VjY2Vzc2Z1bGx5QWRkZWQgPSBmYWxzZTsKLSAgICAvLyBJZiB0aGUgbWVzc2FnZSBpZiBudWxsIHRoZXJlIGlzIG5vdGhpbmcgdG8gYWRkLgotICAgIGlmKG1lc3NhZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gc3VjY2Vzc2Z1bGx5QWRkZWQ7Ci0gICAgfQotICAgIFN0cmluZyBlcnJvclVSSSA9IG5vcm1hbGl6ZSh1cmkpOwotICAgIFVSTCBlcnJvclVSTCA9IG51bGw7Ci0gICAgaWYgKGVycm9yVVJJICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGVycm9yVVJMID0gbmV3IFVSTChlcnJvclVSSSk7Ci0gICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIC8vZXJyb3JVUkkgPSBub3JtYWxpemVVUkkoZXJyb3JVUkkpOwotICAgIH0KLSAgICAvL2Jvb2xlYW4gZG9EaWFsb2cgPSB0cnVlOwotICAgIGlmIChlcnJvclVSTCAhPSBudWxsKQotICAgIHsKLSAgICAgIHN1Y2Nlc3NmdWxseUFkZGVkID0gdHJ1ZTsKLSAgICAgIC8vIEFkZCB0byB0aGUgYXBwcm9wcmlhdGUgbGlzdCBpZiBuZXN0ZWQgZXJyb3Igc3VwcG9ydCBpcyBvZmYgb3IKLSAgICAgIC8vIHRoaXMgbWVzc2FnZSBpcyBmb3IgdGhlIGN1cnJlbnQgZmlsZS4KLSAgICAgIGlmICghV1JBUFBFUl9FUlJPUl9TVVBQT1JUX0VOQUJMRUQgfHwgdmFsaWRhdGluZ19maWxlX3VybC5zYW1lRmlsZShlcnJvclVSTCkpCi0gICAgICB7Ci0KLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgdmFsbWVzID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlKG1lc3NhZ2UsIGxpbmUsCi0gICAgICAgICAgICBjb2x1bW4sIHZhbGlkYXRpbmdfZmlsZV91cmksIGtleSwgbWVzc2FnZUFyZ3VtZW50cyk7Ci0gICAgICAgIGlmIChzZXZlcml0eSA9PSBTRVZfRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxtZXMuc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX05PUk1BTCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2V2ZXJpdHkgPT0gU0VWX1dBUk5JTkcpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxtZXMuc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZXMuYWRkKHZhbG1lcyk7Ci0gICAgICB9Ci0gICAgICAvLyBJZiBuZXN0ZWQgZXJyb3Igc3VwcG9ydCBpcyBlbmFibGVkIGNyZWF0ZSBhIG5lc3RlZCBlcnJvci4KLSAgICAgIGVsc2UgaWYgKFdSQVBQRVJfRVJST1JfU1VQUE9SVF9FTkFCTEVEKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmVzdGVkdXJpID0gZXJyb3JVUkwudG9FeHRlcm5hbEZvcm0oKTsKLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgbmVzdGVkbWVzcyA9IG5ldyBWYWxpZGF0aW9uTWVzc2FnZShtZXNzYWdlLCBsaW5lLAotICAgICAgICAgICAgY29sdW1uLCBuZXN0ZWR1cmksIGtleSwgbWVzc2FnZUFyZ3VtZW50cyk7Ci0gICAgICAgIGlmKHNldmVyaXR5ID09IFNFVl9XQVJOSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgbmVzdGVkbWVzcy5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXN0ZWRtZXNzLnNldFNldmVyaXR5KFZhbGlkYXRpb25NZXNzYWdlLlNFVl9OT1JNQUwpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgY29udGFpbmVyID0gKFZhbGlkYXRpb25NZXNzYWdlKSBuZXN0ZWRNZXNzYWdlcy5nZXQobmVzdGVkdXJpKTsKLSAgICAgICAgaWYoY29udGFpbmVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250YWluZXIgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UoTkxTLmJpbmQoWE1MVmFsaWRhdGlvbk1lc3NhZ2VzLl9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFLCBuZXcgT2JqZWN0IFtdIHsgbmVzdGVkdXJpIH0pLCAxLCAwLCBuZXN0ZWR1cmkpOwotICAgICAgIAotICAgICAgICAgIC8vIEluaXRpYWxseSBzZXQgdGhlIG5lc3RlZCBlcnJvciB0byBhIHdhcm5pbmcuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNoYW5nZWQKLSAgICAgICAgICAvLyB0byBhbiBlcnJvciBpZiBhIG5lc3RlZCBtZXNzYWdlIGhhcyBhIHNldmVyaXR5IG9mIGVycm9yLgotICAgICAgICAgIGNvbnRhaW5lci5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKTsKLSAgICAgICAgICBuZXN0ZWRNZXNzYWdlcy5wdXQobmVzdGVkdXJpLCBjb250YWluZXIpOwotICAgICAgICAgIG1lc3NhZ2VzLmFkZChjb250YWluZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRhaW5lci5hZGROZXN0ZWRNZXNzYWdlKG5lc3RlZG1lc3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3VjY2Vzc2Z1bGx5QWRkZWQ7Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgICogQWRkIGEgbmVzdGVkIG1lc3NhZ2UgdG8gdGhlIHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgc3RyaW5nIG1lc3NhZ2Ugb2YgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZE5lc3RlZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpLCBpbnQgc2V2ZXJpdHkpCi0vLyAgewotLy8gICAgVmFsaWRhdGlvbk1lc3NhZ2UgbmVzdGVkbWVzcyA9IG5ldyBWYWxpZGF0aW9uTWVzc2FnZShtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSk7Ci0vLyAgICBpZihzZXZlcml0eSA9PSBTRVZfV0FSTklORykKLS8vICAgIHsKLS8vICAgICAgbmVzdGVkbWVzcy5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKTsKLS8vICAgIH0KLS8vICAgIGVsc2UKLS8vICAgIHsKLS8vICAgICAgbmVzdGVkbWVzcy5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTk9STUFMKTsKLS8vICAgIH0KLS8vICAgIFZhbGlkYXRpb25NZXNzYWdlIGNvbnRhaW5lciA9IChWYWxpZGF0aW9uTWVzc2FnZSluZXN0ZWRNZXNzYWdlcy5nZXQodXJpKTsKLS8vICAgIGlmKGNvbnRhaW5lciA9PSBudWxsKQotLy8gICAgewotLy8gICAgICBjb250YWluZXIgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UoWE1MQ29yZVZhbGlkYXRpb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UsIHVyaSksIDEsIDAsIHZhbGlkYXRpbmdfZmlsZV91cmkpOwotLy8gICAgICAvLyBJbml0aWFsbHkgc2V0IHRoZSBuZXN0ZWQgZXJyb3IgdG8gYSB3YXJuaW5nLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjaGFuZ2VkCi0vLyAgICAgIC8vIHRvIGFuIGVycm9yIGlmIGEgbmVzdGVkIG1lc3NhZ2UgaGFzIGEgc2V2ZXJpdHkgb2YgZXJyb3IuCi0vLyAgICAgIGNvbnRhaW5lci5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKTsKLS8vICAgICAgbmVzdGVkTWVzc2FnZXMucHV0KHVyaSwgY29udGFpbmVyKTsKLS8vICAgICAgbWVzc2FnZXMuYWRkKGNvbnRhaW5lcik7Ci0vLyAgICB9Ci0vLyAgICBjb250YWluZXIuYWRkTmVzdGVkTWVzc2FnZShuZXN0ZWRtZXNzKTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0I2dldFZhbGlkYXRpb25NZXNzYWdlcygpCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSBnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIChWYWxpZGF0aW9uTWVzc2FnZVtdKW1lc3NhZ2VzLnRvQXJyYXkobmV3IFZhbGlkYXRpb25NZXNzYWdlW21lc3NhZ2VzLnNpemUoKV0pOwotICB9Ci0KLSAgcHVibGljIEhhc2hNYXAgZ2V0TmVzdGVkTWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIG5lc3RlZE1lc3NhZ2VzOwotICB9Ci0gIAotICAvKioKLSAgICogUHV0IHRoZSBVUkkgaW4gYSBzdGFuZGFyZCBmb3JtYXQuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgdG8gcHV0IGludG8gYSBzdGFuZGFyZCBmb3JtYXQuCi0gICAqIEByZXR1cm4gVGhlIHN0YW5kYXJkIGZvcm1hdCBvZiB0aGUgVVJJLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyB1cmkpCi0gIHsKLS8vICAgIGlmKHVyaS5zdGFydHNXaXRoKCJwbGF0Zm9ybToiKSkKLS8vICAgIHsKLS8vICAgICAgdHJ5Ci0vLyAgICAgIHsKLS8vICAgICAgICB1cmkgPSBQbGF0Zm9ybS5yZXNvbHZlKG5ldyBVUkwodXJpKSkudG9TdHJpbmcoKTsKLS8vICAgICAgfQotLy8gICAgICBjYXRjaChFeGNlcHRpb24gZSkKLS8vICAgICAgewotLy8gICAgICB9Ci0vLyAgICB9Ci0gICAgdXJpID0gdXJpLnJlcGxhY2VBbGwoIiUyMCIsIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgdXJpID0gdXJpLnJlcGxhY2VBbGwoIiU1RSIsICJeIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHVyaSA9IHVyaS5yZXBsYWNlKCdcXCcsJy8nKTsKLSAgICAKLSAgICByZXR1cm4gdXJpOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjY2MmMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTcwMDUgLSBTb21lIHN0YXRpYyBjb25zdGFudHMgbm90IG1hZGUgZmluYWwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIEEgY2xhc3MgZm9yIGhvbGRpbmcgdmFsaWRhdGlvbiBtZXNzYWdlIGluZm9ybWF0aW9uLiBIb2xkcyB0aGUgbWVzc2FnZSBhbmQgdGhlCi0gKiBtZXNzYWdlIGxvY2F0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbk1lc3NhZ2UKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lIEVSUk9SX01FU1NBR0VfTUFQX1FVQUxJRklFRF9OQU1FID0gbmV3IFF1YWxpZmllZE5hbWUoIm9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbiIsICJlcnJvck1lc3NhZ2VNYXAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gIHByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZTsKLSAgcHJvdGVjdGVkIGludCBsaW5lTnVtYmVyOwotICBwcm90ZWN0ZWQgaW50IGNvbHVtbk51bWJlcjsKLSAgcHJvdGVjdGVkIFN0cmluZyB1cmk7Ci0gIHByb3RlY3RlZCBMaXN0IG5lc3RlZEVycm9yczsKLSAgcHJvdGVjdGVkIFN0cmluZyBrZXk7Ci0gIHByb3RlY3RlZCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzOwotICBwcm90ZWN0ZWQgaW50IHN0YXJ0T2Zmc2V0OwotICBwcm90ZWN0ZWQgaW50IHNldmVyaXR5ID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVZfSElHSCA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVl9OT1JNQUwgPSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVl9MT1cgPSBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgZm9yIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBsaW5lTnVtYmVyIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gY29sdW1uTnVtYmVyIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyKQotICB7Ci0gICAgdGhpcyhtZXNzYWdlLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIsIG51bGwpOwotICB9Ci0KLSAgLyoqIAotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gbGluZU51bWJlciBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgdGhlIGZpbGUgdGhlIG1lc3NhZ2UgaXMgZm9yLgotICAgKi8KLSAgIHB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIsIFN0cmluZyB1cmkpCi0gIHsKLSAgICAgdGhpcyhtZXNzYWdlLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIsIHVyaSwgbnVsbCwgbnVsbCk7Ci0gIH0KLSAgIAotICAgLyoqIAotICAgICogQ29uc3RydWN0b3IuCi0gICAgKiAKLSAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgICogQHBhcmFtIGxpbmVOdW1iZXIgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAgKiBAcGFyYW0gY29sdW1uTnVtYmVyIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgdGhlIGZpbGUgdGhlIG1lc3NhZ2UgaXMgZm9yLgotICAgICogQHBhcmFtIGtleSBhIHVuaXF1ZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBlcnJvcgotICAgICogQHBhcmFtIG1lc3NhZ2VBcmd1bWVudHMgdGhlIGFyZ3VtZW50cyBYZXJjZXMgdXNlcyB0byBjcmVhdGUgdGhlIG1lc3NhZ2UKLSAgICAqLwotICAgIHB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIsIFN0cmluZyB1cmksIFN0cmluZyBrZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gICB7Ci0gICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgIHRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0gICAgIHRoaXMuY29sdW1uTnVtYmVyID0gY29sdW1uTnVtYmVyOwotICAgICB0aGlzLnVyaSA9IHVyaTsKLSAgICAgdGhpcy5rZXkgPSBrZXk7Ci0JIHRoaXMubWVzc2FnZUFyZ3VtZW50cyA9IG1lc3NhZ2VBcmd1bWVudHM7Ci0gICAgIHRoaXMuc3RhcnRPZmZzZXQgPSAwOyAgICAKLSAgIH0KLSAgIAotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1lc3NhZ2UgZm9yIHRoaXMgdmFsaWF0aW9uIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlIGZvciB0aGlzIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbHVtbiBsb2NhdGlvbi4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGNvbHVtbiBudW1iZXIuCi0gICAqLwotICBwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpCi0gIHsKLSAgICByZXR1cm4gY29sdW1uTnVtYmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbGluZSBsb2NhdGlvbi4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpbmUgbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkKLSAgewotICAgIHJldHVybiBsaW5lTnVtYmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdXJpIGZvciB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgdXJpIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVyaSgpCi0gIHsKLSAgICByZXR1cm4gdXJpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIGEgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZSB0byB0aGlzIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0aW9uTWVzc2FnZSBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlIHRvIGFkZCBhcyBhIG5lc3RlZCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTmVzdGVkTWVzc2FnZShWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSkKLSAgewotICAgIGlmIChuZXN0ZWRFcnJvcnMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuZXN0ZWRFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotICAgIG5lc3RlZEVycm9ycy5hZGQodmFsaWRhdGlvbk1lc3NhZ2UpOwotICAgIGludCB2YWxpZGFpdG9ubWVzc2FnZVNldmVyaXR5ID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKTsKLSAgICBpZih2YWxpZGFpdG9ubWVzc2FnZVNldmVyaXR5ID09IFNFVl9OT1JNQUwgfHwgdmFsaWRhaXRvbm1lc3NhZ2VTZXZlcml0eSA9PSBTRVZfSElHSCkKLSAgICB7Ci0gICAgICBzZXRTZXZlcml0eShTRVZfTk9STUFMKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBsaXN0IG9mIG5lc3RlZCB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbGlzdCBvZiBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldE5lc3RlZE1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiBuZXN0ZWRFcnJvcnMgIT0gbnVsbCA/IG5lc3RlZEVycm9ycyA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHNldmVyaXR5IG9mIHRoZSBkZWZlY3QuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBzZXZlcml0eSBvZiB0aGUgZGVmZWN0LgotICAgKi8KLSAgcHVibGljIGludCBnZXRTZXZlcml0eSgpCi0gIHsKLSAgCXJldHVybiBzZXZlcml0eTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gc2V2IFRoZSBzZXZlcml0eSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShpbnQgc2V2KQotICB7Ci0gIAlzZXZlcml0eSA9IHNldjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IG9mZnNldCkKLSAgewotICAgIHRoaXMuc3RhcnRPZmZzZXQgPSBvZmZzZXQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGtleS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgewotICAgIHJldHVybiBrZXk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRNZXNzYWdlQXJndW1lbnRzKCkKLSAgewotCSAgcmV0dXJuIHRoaXMubWVzc2FnZUFyZ3VtZW50czsKLSAgfQotICAKLQotICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25SZXBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvblJlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmIxNTcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvblJlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIGEgdmFsaWRhdGlvbiByZXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uUmVwb3J0Ci17Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgZm9yIHRoZSBmaWxlIHRoZSByZXBvcnQgcmVmZXJzIHRvLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgVVJJIGZvciB0aGUgZmlsZSB0aGUgcmVwb3J0IHJlZmVycyB0by4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVVSSSgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGUgZmlsZSBpcyB2YWxpZC4gVGhlIGZpbGUgbWF5IGhhdmUgd2FybmluZ3MgYXNzb2NpYXRlZCB3aXRoIGl0LgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmaWxlIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZVtdIGdldFZhbGlkYXRpb25NZXNzYWdlcygpOwotICAKLSAgcHVibGljIEhhc2hNYXAgZ2V0TmVzdGVkTWVzc2FnZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0NvbW1hbmRMaW5lTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvQ29tbWFuZExpbmVMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzOGYzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvQ29tbWFuZExpbmVMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUubG9nZ2luZzsKLQotLyoqCi0gKiBBIGxvZ2dlciB0aGF0IHdpbGwgcHJpbnQgbG9nIGluZm8gdG8gU3lzdGVtLm91dC4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZExpbmVMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyCi17Ci0gIHB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbihlcnJvcik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIHdhcm5pbmcsIFRocm93YWJsZSBleGNlcHRpb24pCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4od2FybmluZyk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi50b1N0cmluZygpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0VjbGlwc2VMb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9FY2xpcHNlTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3M2NmMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0VjbGlwc2VMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci0KLQotLyoqCi0gKiBBIGxvZ2dlciB0aGF0IHdpbGwgbG9nIHRvIHRoZSBsb2cgZmlsZSBpbiB0aGUgZWNsaXBzZSBtZXRhZGF0YSBkaXJlY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTG9nZ2VyIGltcGxlbWVudHMgSUxvZ2dlcgotewotICAKLSAgcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIGVycm9yLCBUaHJvd2FibGUgZXhjZXB0aW9uKQotICB7Ci0gICAgWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuRVJST1IsIGVycm9yLCBleGNlcHRpb24pKTsKLSAgfQotIAotICBwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyB3YXJuaW5nLCBUaHJvd2FibGUgZXhjZXB0aW9uKQotICB7Ci0gICAgWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5XQVJOSU5HLCB3YXJuaW5nLCBleGNlcHRpb24pKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0lMb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9JTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MWE0MTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0lMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBzdGFuZGFyZCBsb2dnZXIuIEFsbG93cyBmb3IgbG9nZ2luZyBlcnJvcnMgYW5kIHdhcm5pbmdzLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxvZ2dlcgotewotICAvKioKLSAgICogTG9nIGFuIGVycm9yIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIG1lc3NhZ2UgdG8gbG9nLgotICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIGVycm9yLCBUaHJvd2FibGUgZXhjZXB0aW9uKTsKLQotICAvKioKLSAgICogTG9nIGEgd2FybmluZyBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIHdhcm5pbmcgVGhlIHdhcm5pbmcgbWVzc2FnZSB0byBsb2cuCi0gICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyB3YXJuaW5nLCBUaHJvd2FibGUgZXhjZXB0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9Mb2dnZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvTG9nZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTU0OWUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9Mb2dnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUubG9nZ2luZzsKLQotLyoqCi0gKiBUaGUgbG9nZ2VyIGZhY3RvcnkgYWxsb3dzIGZvciBzaW1wbGUgdXNlIG9mIHdoYXRldmVyIGxvZ2dpbmcgbWVjaGFuaXNtIGlzIGluCi0gKiBwbGFjZS4gVGhlIHRvb2wgY2FuIHNwZWNpZnkgYSBjdXN0b20gbG9nZ2luZyBjbGFzcyBhbmQgY2FuIHJlcXVlc3QgdGhlCi0gKiBsb2dnZXIgZnJvbSB0aGlzIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKiAKLSAqIEBkZXByZWNhdGVkIC0gbm90IHVzZWQgaW4gV1RQIG9yIGJ5IGFueSBhZG9wdGVycyBhcyBvZiA5LzEyLzIwMDcKLSAqLwotcHVibGljIGNsYXNzIExvZ2dlckZhY3RvcnkKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgSUxvZ2dlciAgICAgIGxvZ2dlciAgICAgICAgICAgID0gbnVsbDsKLSAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgIGNsYXNzbG9hZGVyICAgICAgID0gbnVsbDsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nICAgICAgIGxvZ2dlckNsYXNzICAgICAgID0gbnVsbDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbW1hbmRsaW5lbG9nZ2VyID0gIm9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmxvZ2dpbmcuQ29tbWFuZExpbmVMb2dnZXIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlY2xpcHNlbG9nZ2VyICAgICA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5sb2dnaW5nLkVjbGlwc2VMb2dnZXIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyAgICAgICBkZWZhdWx0bG9nZ2VyICAgICA9IGNvbW1hbmRsaW5lbG9nZ2VyOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgbG9nZ2VyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBsb2dnZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElMb2dnZXIgZ2V0TG9nZ2VySW5zdGFuY2UoKQotICB7Ci0gICAgaWYobG9nZ2VyID09IG51bGwpCi0gICAgewotICAgICAgaWYobG9nZ2VyQ2xhc3MgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYoY2xhc3Nsb2FkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzIGxjID0gY2xhc3Nsb2FkZXIubG9hZENsYXNzKGxvZ2dlckNsYXNzKTsKLSAgICAgICAgICAgIGxvZ2dlciA9IChJTG9nZ2VyKSBsYy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihsb2dnZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzIGxjID0gTG9nZ2VyRmFjdG9yeS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhsb2dnZXJDbGFzcyk7Ci0gICAgICAgICAgICBsb2dnZXIgPSAoSUxvZ2dlcikgbGMubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmKGxvZ2dlciA9PSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIENsYXNzIGxjID0gTG9nZ2VyRmFjdG9yeS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhkZWZhdWx0bG9nZ2VyKTsKLSAgICAgICAgICBsb2dnZXIgPSAoSUxvZ2dlcikgbGMubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbG9nZ2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIFNwZWNpZnkgdGhlIGxvZ2dlciBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkLgotICAgKiAKLSAgICogQHBhcmFtIGNsYXNzbmFtZQotICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBsb2dnZXIgY2xhc3MuCi0gICAqIEBwYXJhbSBsb2dnZXJjbGFzc2xvYWRlcgotICAgKiAgICAgICAgICAgIFRoZSBjbGFzc2xvYWRlciB0byB1c2UgdG8gbG9hZCB0aGUgbG9nZ2VyLiBJZiBudWxsLCB0aGUgZGVmYXVsdAotICAgKiAgICAgICAgICAgIGNsYXNzbG9hZGVyIHdpbGwgYmUgdXNlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzcGVjaWZ5TG9nZ2VyKFN0cmluZyBjbGFzc25hbWUsIENsYXNzTG9hZGVyIGxvZ2dlcmNsYXNzbG9hZGVyKQotICB7Ci0gICAgbG9nZ2VyQ2xhc3MgPSBjbGFzc25hbWU7Ci0gICAgY2xhc3Nsb2FkZXIgPSBsb2dnZXJjbGFzc2xvYWRlcjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGRlZmF1bHQgbG9nZ2VyIHRvIHRoZSBlY2xpcHNlIGxvZ2dlci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB1c2VFY2xpcHNlTG9nZ2VyKCkKLSAgewotICAgIGRlZmF1bHRsb2dnZXIgPSBlY2xpcHNlbG9nZ2VyOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL0Vycm9yQ3VzdG9taXphdGlvblBsdWdpblJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL0Vycm9yQ3VzdG9taXphdGlvblBsdWdpblJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTY0ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9FcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbi5FcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgdGhlIHBsdWctaW4gbWFuaWZlc3RzIGFuZCByZWdpc3RlcnMgZWFjaCBleHRlbnNpb24KLSAqIGVycm9yIGN1c3RvbWl6ZXIgd2l0aCB0aGUgRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlciB7Ci0JCi0JICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiZXJyb3JDdXN0b21pemVyIjsgLy8kTk9OLU5MUy0xJAotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGFnTmFtZSA9IEVYVEVOU0lPTl9QT0lOVF9JRDsKLQotCSAgLyoqCi0JICAgKiBSZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGZvciB0aGUgZXJyb3JjdXN0b21pemVyIGV4dGVuc2lvbi4KLQkgICAqLwotCSAgcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkKLQkgIHsKLQkgICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkgICAgSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLQkgICAgewotCSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkgICAgICB7Ci0JICAgICAgICByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogcmVhZEVsZW1lbnQoKSAtIHBhcnNlIGFuZCBkZWFsIHdpdGggYW4gZXh0ZW5zaW9uIGxpa2U6Ci0JICAgKgotCSAgICogPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmVycm9yQ3VzdG9taXplciIKLQkgICAqICAgICAgICAgICAgaWQ9InNwZWNpZmljRXJyb3JDdXN0b21pemVyIgotCSAgICogICAgICAgICAgICBuYW1lPSJTcGVjaWZpYyBFcnJvciBDdXN0b21pemVyIj4KLQkgICAqICAgPGVycm9yQ3VzdG9taXplcgotCSAgICogICAJCQluYW1lc3BhY2U9Imh0dHA6Ly9zcGVjaWZpY25hbWVzcGFjZSIKLQkgICAqICAgCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5NeVNwZWNpZmljRXJyb3JDdXN0b21pemVyLz4KLQkgICAqIDwvZXh0ZW5zaW9uPgotCSAgICovCi0JICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQkgIHsKLQkgICAgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyh0YWdOYW1lKSkKLQkgICAgewotCSAgICAgIFN0cmluZyBlcnJvckN1c3RvbWl6ZXJDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FU1BBQ0UpOwotCi0JICAgICAgaWYgKGVycm9yQ3VzdG9taXplckNsYXNzICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgdHJ5Ci0JICAgICAgICB7Ci0JICAgICAgICAgIEJ1bmRsZSBwbHVnaW5CdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSk7Ci0JICAgICAgICAgIEVycm9yTWVzc2FnZUN1c3RvbWl6ZXJEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBFcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUocGx1Z2luQnVuZGxlLCBlcnJvckN1c3RvbWl6ZXJDbGFzcyk7Ci0JICAgICAgICAgIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuYWRkRXJyb3JNZXNzYWdlQ3VzdG9taXplcihuYW1lc3BhY2UsIGRlbGVnYXRlKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgICAgICAgIHsKLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWFlODc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uUmVwb3J0OwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9WQUxJREFUT1JfQ09OVEVYVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudmFsaWRhdG9yQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIGludCBpbmRpY2F0ZU5vR3JhbW1hciA9IDA7Ci0gIAotICAvKioKLSAgICogU2V0IGFueSBwcmVmZXJlbmNlcyBmb3IgWE1MIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3Ijc2V0dXBWYWxpZGF0aW9uKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldHVwVmFsaWRhdGlvbihOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIAotICB7Ci0Jc3VwZXIuc2V0dXBWYWxpZGF0aW9uKGNvbnRleHQpOwotCWluZGljYXRlTm9HcmFtbWFyID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRJQ0FURV9OT19HUkFNTUFSKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEuaW8uSW5wdXRTdHJlYW0sIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdGUodXJpLCBpbnB1dHN0cmVhbSwgY29udGV4dCwgbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dHN0cmVhbSwgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0LCBWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCkKLSAgewotICAgIFhNTFZhbGlkYXRvciB2YWxpZGF0b3IgPSBYTUxWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQotICAgIFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBQcmVmZXJlbmNlcyBwbHVnaW5QcmVmZXJlbmNlcyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldEZlYXR1cmUoWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uSU5ESUNBVEVfTk9fR1JBTU1BUiwgaW5kaWNhdGVOb0dyYW1tYXIpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXRGZWF0dXJlKFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLlVTRV9YSU5DTFVERSwgcGx1Z2luUHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVTRV9YSU5DTFVERSkpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXRGZWF0dXJlKFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLkhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUywgcGx1Z2luUHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUykpOwotICAgIH0KLSAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBUT0RPOiBVbmFibGUgdG8gc2V0IHRoZSBwcmVmZXJlbmNlLiBMb2cgdGhpcyBwcm9ibGVtLgotICAgIH0KLSAgICAKLSAgICBYTUxWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZSh1cmksIGlucHV0c3RyZWFtLCBjb25maWd1cmF0aW9uLCByZXN1bHQsIGNvbnRleHQpOwotICAgICAgICAgICAgICAKLSAgICByZXR1cm4gdmFscmVwb3J0OwotICB9Ci0JICAKLSAgLyoqCi0gICAqIFN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIG1lc3NhZ2UgcGFyYW1ldGVycy4gRm9yIFhNTCB2YWxpZGF0aW9uIHRoZXJlCi0gICAqIGFyZSB0aHJlZSBhZGRpdGlvbmFsIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB0byBzdG9yZToKLSAgICogcGFyYW1bMF0gPSB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXJyb3IKLSAgICogcGFyYW1bMV0gPSB0aGUgJ3NxdWlnZ2xlIHNlbGVjdGlvbiBzdHJhdGVneScgZm9yIHdoaWNoIERPTSBwYXJ0IHRvIHNxdWlnZ2xlCi0gICAqIHBhcmFtWzJdID0gdGhlIG5hbWUgb3IgdmFsdWUgb2Ygd2hhdCBpcyB0byBiZSBzcXVpZ2dsZWQKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciNhZGRJbmZvVG9NZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRJbmZvVG9NZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlLCBJTWVzc2FnZSBtZXNzYWdlKQotICB7IAotCVN0cmluZyBrZXkgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRLZXkoKTsKLQlpZihrZXkgIT0gbnVsbCkKLQl7Ci0gICAgICBYTUxNZXNzYWdlSW5mb0hlbHBlciBtZXNzYWdlSW5mb0hlbHBlciA9IG5ldyBYTUxNZXNzYWdlSW5mb0hlbHBlcigpOwotICAgICAgU3RyaW5nW10gbWVzc2FnZUluZm8gPSBtZXNzYWdlSW5mb0hlbHBlci5jcmVhdGVNZXNzYWdlSW5mbyhrZXksIHZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2VBcmd1bWVudHMoKSk7Ci0gICAgICAKLSAgICAgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKENPTFVNTl9OVU1CRVJfQVRUUklCVVRFLCBuZXcgSW50ZWdlcih2YWxpZGF0aW9uTWVzc2FnZS5nZXRDb2x1bW5OdW1iZXIoKSkpOwotICAgICAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSwgbWVzc2FnZUluZm9bMF0pOwotICAgICAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfTkFNRV9PUl9WQUxVRV9BVFRSSUJVVEUsIG1lc3NhZ2VJbmZvWzFdKTsKLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG5lc3RlZCB2YWxpZGF0aW9uIGNvbnRleHQuCi0gICAqIAotICAgKiBAcGFyYW0gc3RhdGUKLSAgICogICAgICAgICAgdGhlIHZhbGlkYXRpb24gc3RhdGUuCi0gICAqIEBwYXJhbSBjcmVhdGUKLSAgICogICAgICAgICAgd2hlbiB0cnVlLCBhIG5ldyBjb250ZXh0IHdpbGwgYmUgY3JlYXRlZCBpZiBvbmUgaXMgbm90IGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIG5lc3RlZCB2YWxpZGF0aW9uIGNvbnRleHQuCi0gICAqLwotICBwcm90ZWN0ZWQgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBnZXROZXN0ZWRDb250ZXh0KFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgYm9vbGVhbiBjcmVhdGUpCi0gIHsKLSAgICBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQgPSBudWxsOwotICAgIE9iamVjdCBvID0gc3RhdGUuZ2V0KFhNTF9WQUxJREFUT1JfQ09OVEVYVCk7Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBYTUxOZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgICAgY29udGV4dCA9IChYTUxOZXN0ZWRWYWxpZGF0b3JDb250ZXh0KW87Ci0gICAgZWxzZSBpZiAoY3JlYXRlKQotICAgIHsKLSAgICAgIGNvbnRleHQgPSBuZXcgWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dCgpOwotICAgIH0KLSAgICByZXR1cm4gY29udGV4dDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmFsaWRhdGlvblN0YXJ0aW5nKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICB7Ci0gICAgaWYgKHByb2plY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQgPSBnZXROZXN0ZWRDb250ZXh0KHN0YXRlLCBmYWxzZSk7Ci0gICAgICBpZiAoY29udGV4dCA9PSBudWxsKQotICAgICAgewotICAgICAgICBjb250ZXh0ID0gZ2V0TmVzdGVkQ29udGV4dChzdGF0ZSwgdHJ1ZSk7Ci0gICAgICAgIHNldHVwVmFsaWRhdGlvbihjb250ZXh0KTsKLSAgICAgICAgc3RhdGUucHV0KFhNTF9WQUxJREFUT1JfQ09OVEVYVCwgY29udGV4dCk7Ci0gICAgICB9Ci0gICAgICBzdXBlci52YWxpZGF0aW9uU3RhcnRpbmcocHJvamVjdCwgc3RhdGUsIG1vbml0b3IpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmFsaWRhdGlvbkZpbmlzaGluZyhJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgewotICAgIGlmIChwcm9qZWN0ICE9IG51bGwpCi0gICAgewotICAgICAgc3VwZXIudmFsaWRhdGlvbkZpbmlzaGluZyhwcm9qZWN0LCBzdGF0ZSwgbW9uaXRvcik7Ci0gICAgICBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQgPSBnZXROZXN0ZWRDb250ZXh0KHN0YXRlLCBmYWxzZSk7Ci0gICAgICBpZiAoY29udGV4dCAhPSBudWxsKQotICAgICAgewotICAgICAgICB0ZWFyZG93blZhbGlkYXRpb24oY29udGV4dCk7Ci0gICAgICAgIHN0YXRlLnB1dChYTUxfVkFMSURBVE9SX0NPTlRFWFQsIG51bGwpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YTUxNZXNzYWdlSW5mb0hlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YTUxNZXNzYWdlSW5mb0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmU3NTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi0vKioKLSAqIFRoZSBtZXNzYWdlIGluZm8gaGVscGVyIGRldGVybWluZXMgdGhlIHNlbGVjdGlvbiBzdHJhdGVneSBmb3IgZWxlbWVudHMKLSAqIGluIGEgU1NFIGVkaXRvci4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNZXNzYWdlSW5mb0hlbHBlcgotewotICBwdWJsaWMgWE1MTWVzc2FnZUluZm9IZWxwZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiAgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgc2hvdWxkIGJlIHVuZGVybGluZWQgd2l0aCB0aGUgcmVkICJzcXVpZ2dsZXMiCi0gICAqICB1c2luZyB0aGUgZXJyb3JLZXksIGFuZCB0aGUgbWVzc2FnZUFyZ3VtZW50cy4KLSAgICogIDxicj5Qb3NpdGlvbiAwIG9mIHRoZSBhcnJheSByZXR1cm5lZCBjb250YWlucyB0aGUgc2VsZWN0aW9uIFN0cmF0ZWd5LCBvciB3aGF0IERPTSBFbGVtZW50IHRvIHVuZGVybGluZS4gIAotICAgKiAgRm9yIGV4YW1wbGUgIkFUVFJJQlVURV9OQU1FIiAgCi0gICAqICA8YnI+UG9zaXRpb24gMSBjb250YWlucyB0aGUgbmFtZSBvciB2YWx1ZSB0byBzcXVpZ2dsZS4KLSAgICogIDxwPkZvciBleGFtcGxlLCBpZiB3ZSB3YW50ZWQgdG8gc3F1aWdnbGUgdGhlIGF0dHJpYnV0ZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBuYW1lCi0gICAqICBmb28gdGhpcyBtZXRob2Qgd291bGQgcmV0dXJuIHsiQVRUUklCVVRFX05BTUUiLCAiZm9vIn0KLSAgICogIDwvcD4KLSAgICogIEBwYXJhbSBlcnJvcktleSAKLSAgICogIAkJVGhlIGVycm9yIGtleSBnaXZlbiBieSB0aGUgWGVyY2VzIHBhcnNlci4KLSAgICogIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIAotICAgKiAgCQlUaGUgYXJndW1lbnRzIHVzZWQgYnkgWGVyY2VzIHRvICJmaWxsIGluIHRoZSBibGFua3MiIG9mIHRoZWlyIG1lc3NhZ2VzLgotICAgKiAgQHJldHVybiAKLSAgICogIAkJQW4gYXJyYXkgY29udGFpbmluZyB0aGUgc3F1aWdnbGUgaW5mb3JtYXRpb24uCi0gICAqICBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yCi0gICAqICAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBjcmVhdGVNZXNzYWdlSW5mbyhTdHJpbmcgZXJyb3JLZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsgCi0gICAgU3RyaW5nIHNlbGVjdGlvblN0cmF0ZWd5ID0gbnVsbDsKLSAgICBTdHJpbmcgbmFtZU9yVmFsdWUgPSBudWxsOwotICAgIAotICAgIGlmKGVycm9yS2V5ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4yLjQuYSIpIHx8IGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4yLjQuZCIpIHx8IGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4yLjQuYiIpIHx8IGVycm9yS2V5LmVxdWFscygiTVNHX0NPTlRFTlRfSU5WQUxJRCIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLSAgICAgICAgfCBlcnJvcktleS5lcXVhbHMoIk1TR19DT05URU5UX0lOQ09NUExFVEUiKSB8fCBlcnJvcktleS5lcXVhbHMoIk1TR19SRVFVSVJFRF9BVFRSSUJVVEVfTk9UX1NQRUNJRklFRCIpIHx8IGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS40IikgfHwgZXJyb3JLZXkuZXF1YWxzKCJFbGVtZW50UHJlZml4VW5ib3VuZCIpICAgKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gIlNUQVJUX1RBRyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLXR5cGUuMy4xLjMiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBzZWxlY3Rpb25TdHJhdGVneSA9ICJURVhUIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjIuMyIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIkZJUlNUX05PTl9XSElURVNQQUNFX1RFWFQiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy10eXBlLjMuMS4xIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiQUxMX0FUVFJJQlVURVMiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMy4yLjIiKSB8fCBlcnJvcktleS5lcXVhbHMoIk1TR19BVFRSSUJVVEVfTk9UX0RFQ0xBUkVEIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgewotICAgICAgICBzZWxlY3Rpb25TdHJhdGVneSA9ICJBVFRSSUJVVEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkgICAgLy9pbiB0aGlzIGNhc2Ugd2UgbmVlZCBuYW1lT3JWYWx1ZSB0byBiZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHVuZGVybGluZQotCSAgICBuYW1lT3JWYWx1ZSA9IChTdHJpbmcpbWVzc2FnZUFyZ3VtZW50c1sxXTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWF0dHJpYnV0ZS4zIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfQVRUUklCVVRFX1ZBTFVFX05PVF9JTl9MSVNUIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjMuMSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgewkKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiQVRUUklCVVRFX1ZBTFVFIjsgICAvLyROT04tTkxTLTEkCi0JCS8vaW4gdGhpcyBjYXNlIHdlIG5lZWQgbmFtZU9yVmFsdWUgdG8gYmUgdGhlIG5hbWUgb2YgdGhlIEF0dHJpYnV0ZQotICAgIAlpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtYXR0cmlidXRlLjMiKSB8fCBlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMy4xIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIAl7IAotICAgIAkgIG5hbWVPclZhbHVlID0gKFN0cmluZyltZXNzYWdlQXJndW1lbnRzWzFdOwotICAgIAl9Ci0gICAgCWVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiTVNHX0FUVFJJQlVURV9WQUxVRV9OT1RfSU5fTElTVCIpKSAvLyROT04tTkxTLTEkCi0gICAgCXsJCi0gICAgCSAgbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMF07Ci0gICAgCX0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWVsdC40LjIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewkKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3k9IlZBTFVFX09GX0FUVFJJQlVURV9XSVRIX0dJVkVOX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCQkvL2luIHRoaXMgY2FzZSB3ZSBuZWVkIG5hbWVPclZhbHVlIHRvIGJlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHdlIHdhbnQgdG8gdW5lcmxpbmUKLSAgICAJbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMV07CQotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJFbnRpdHlOb3REZWNsYXJlZCIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7ICAJCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5PSJURVhUX0VOVElUWV9SRUZFUkVOQ0UiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG5hbWVPclZhbHVlID0gKFN0cmluZyltZXNzYWdlQXJndW1lbnRzWzBdOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJFbGVtZW50VW50ZXJtaW5hdGVkIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiRU5USVJFX0VMRU1FTlQiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIkVUYWdVbnRlcm1pbmF0ZWQiKSB8fCBlcnJvcktleS5lcXVhbHMoIkVUYWdSZXF1aXJlZCIpKSAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotICAgICAgewotICAgICAgICBzZWxlY3Rpb25TdHJhdGVneSA9ICJFTkRfVEFHIjsgICAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIFN0cmluZyBtZXNzYWdlSW5mb1tdID0gbmV3IFN0cmluZ1syXTsKLSAgICBtZXNzYWdlSW5mb1swXSA9IHNlbGVjdGlvblN0cmF0ZWd5ICE9IG51bGw/IHNlbGVjdGlvblN0cmF0ZWd5OiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIG1lc3NhZ2VJbmZvWzFdID0gbmFtZU9yVmFsdWU7Ci0gICAgcmV0dXJuIG1lc3NhZ2VJbmZvOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hNTFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YTUxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4MTA1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hNTFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci0KLS8qKgotICogQW4gWE1MIHZhbGlkYXRvciBzcGVjaWZpYyB0byBFY2xpcHNlLiBUaGlzIHZhbGlkYXRvciB3aWxsIHdyYXAgdGhlIGludGVybmFsCi0gKiBYTUwgdmFsaWRhdG9yIGFuZCBwcm92aWRlIGF1dG9tYXRpYyBVUkkgcmVzb2x1dGlvbiBzdXBwb3J0LiBUaGlzIGNsYXNzIGFsc28KLSAqIHJlYWRzIGZyb20gdGhlIHBsdWctaW4gcmVnaXN0cnkgYW5kIHJlZ2lzdGVycyBhbGwgZXJyb3IgY3VzdG9taXplcnMgd2l0aCB0aGUKLSAqIHJlZ2lzdHJ5LgotICovCi1wdWJsaWMgY2xhc3MgWE1MVmFsaWRhdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgc3RhdGljIFhNTFZhbGlkYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIFhNTCB2YWxpZGF0b3IuIFRoZSB2YWxpZGF0b3IKLSAgICogY2FuIGJlIHJldXNlZCBhbmQgY2Fubm90IGJlIGN1c3RvbWl6ZWQgc28gdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIGluc3RhbmNlIG9mIGl0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBYTUwgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBYTUxWYWxpZGF0b3IgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBYTUxWYWxpZGF0b3IoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gQ3JlYXRlIHRoZSBYTUwgdmFsaWRhdG9yLCBzZXQgdGhlIFVSSSByZXNvbHZlciBhbmQKLSAgICogZ2V0IHRoZSBleHRlbnNpb24gZXJyb3IgY3VzdG9taXplcnMgZnJvbSB0aGUgcmVnaXN0cnkuCi0gICAqLwotICBwcm90ZWN0ZWQgWE1MVmFsaWRhdG9yKCkKLSAgewotICAgIHNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkpOwotICAgIG5ldyBFcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRWxlbWVudEluZm9ybWF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRWxlbWVudEluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OWM5OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0VsZW1lbnRJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgc2ltcGxlIGNsYXNzIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IGFuIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEluZm9ybWF0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbG9jYWxOYW1lOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZTsKLSAgcHJvdGVjdGVkIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHVyaQotICAgKiAJCVRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBlbGVtZW50LgotICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAqIAkJVGhlIGxvY2FsIG5hbWUgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgRWxlbWVudEluZm9ybWF0aW9uKFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IHVyaTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbmFtZXNwYWNlIG9mIHRoaXMgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgbmFtZXNwYWNlIG9mIHRoaXMgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLSAgewotCXJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxvY2FsIG5hbWUgb2YgdGhpcyBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybgotICAgKiAJCVRoZSBsb2NhbCBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxuYW1lKCkKLSAgewotCXJldHVybiBsb2NhbE5hbWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50LiBUaGUgbGlzdCBjb250YWlucwotICAgKiBFbGVtZW50SW5mb3JtYXRpb24gb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgbGlzdCBvZiBjaGlsZHJlbiBvZiB0aGlzIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpCi0gIHsKLQlyZXR1cm4gY2hpbGRyZW47Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1YWNjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgdHJhY2tzIHRoZSBjb250ZXh0IG9mIHRoZSBwYXJzZWQgZG9jdW1lbnQgdG8gaGVscCBpZGVudGlmeSBlcnJvcgotICogY29uZGl0aW9ucwotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcgotewotICBwcm90ZWN0ZWQgU3RhY2sgZWxlbWVudEluZm9ybWF0aW9uU3RhY2sgPSBuZXcgU3RhY2soKTsKLSAgcHJvdGVjdGVkIEVycm9yTWVzc2FnZUluZm9ybWF0aW9uIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBzdGFydCBlbGVtZW50IG1ldGhvZCBvZiB0aGUgWE1MIHZhbGlkYXRvcidzCi0gICAqIGNvbnRlbnQgaGFuZGxlci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogCQlUaGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50LgotICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAqIAkJVGhlIGxvY2FsIG5hbWUgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgeyAKLSAgICBFbGVtZW50SW5mb3JtYXRpb24gZWxlbWVudEluZm9ybWF0aW9uID0gbmV3IEVsZW1lbnRJbmZvcm1hdGlvbih1cmksIGxvY2FsTmFtZSk7Ci0gICAgaWYgKGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrLnNpemUoKSA+IDApCi0gICAgewotICAgICAgRWxlbWVudEluZm9ybWF0aW9uIHBhcmVudCA9IChFbGVtZW50SW5mb3JtYXRpb24pIGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrLnBlZWsoKTsKLSAgICAgIHBhcmVudC5jaGlsZHJlbi5hZGQoZWxlbWVudEluZm9ybWF0aW9uKTsKLSAgICB9Ci0gICAgZWxlbWVudEluZm9ybWF0aW9uU3RhY2sucHVzaChlbGVtZW50SW5mb3JtYXRpb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIGVuZCBlbGVtZW50IG1ldGhvZCBvZiB0aGUgWE1MIHZhbGlkYXRvcidzCi0gICAqIGNvbnRlbnQgaGFuZGxlci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogCQlUaGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50LgotICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAqIAkJVGhlIGxvY2FsIG5hbWUgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsgICAKLSAgICBpZiAoZWxlbWVudEluZm9ybWF0aW9uU3RhY2suc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBFbGVtZW50SW5mb3JtYXRpb24gZWxlbWVudEluZm9ybWF0aW9uID0gKEVsZW1lbnRJbmZvcm1hdGlvbillbGVtZW50SW5mb3JtYXRpb25TdGFjay5wb3AoKTsKLSAgICAgIGlmIChtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbiAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIElFcnJvck1lc3NhZ2VDdXN0b21pemVyW10gY3VzdG9taXplcnMgPSBFcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEN1c3RvbWl6ZXJzKGVsZW1lbnRJbmZvcm1hdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGludCBudW1DdXN0b21pemVycyA9IGN1c3RvbWl6ZXJzLmxlbmd0aDsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bUN1c3RvbWl6ZXJzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGN1c3RvbWl6ZXJzW2ldLmN1c3RvbWl6ZU1lc3NhZ2UoZWxlbWVudEluZm9ybWF0aW9uLCBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbi5rZXksIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLmFyZ3VtZW50cyk7Ci0gICAgICAgICAgaWYobWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgCW1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLm1lc3NhZ2Uuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgCWJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENvbnNpZGVyIHRoZSByZXBvcnRlZCBlcnJvciBmb3IgY3VzdG9taXphdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxJbmZvCi0gICAqIAkJVGhlIGN1cnJlbnQgVmFsaWRhdGlvbkluZm8gb2JqZWN0IGNvbnRhaW5pbmcgdmFsaWRhdGlvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIGtleQotICAgKiAJCVRoZSBrZXkgcmVsYXRlZCB0byB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGFyZ3VtZW50cwotICAgKiAJCUFueSBtZXNzYWdlIGFyZ3VtZW50cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbnNpZGVyUmVwb3J0ZWRFcnJvcihWYWxpZGF0aW9uSW5mbyB2YWxJbmZvLCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmd1bWVudHMpCi0gIHsKLSAgICBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbiA9IG51bGw7Ci0gICAgVmFsaWRhdGlvbk1lc3NhZ2VbXSBtZXNzYWdlcyA9IHZhbEluZm8uZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCk7Ci0gICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA+IDApCi0gICAgeyAgCi0gICAgICBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbiA9IG5ldyBFcnJvck1lc3NhZ2VJbmZvcm1hdGlvbigpOwotICAgICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24ua2V5ID0ga2V5OwotICAgICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24uYXJndW1lbnRzID0gYXJndW1lbnRzOwotICAgICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24ubWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdOyAKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBIHNpbXBsZSBjbGFzcyB0byBob2xkIGVycm9yIG1lc3NhZ2UgaW5mb3JtYXRpb24uCi0gICAqLwotICBwdWJsaWMgY2xhc3MgRXJyb3JNZXNzYWdlSW5mb3JtYXRpb24KLSAgewotCXB1YmxpYyBTdHJpbmcga2V5ID0gbnVsbDsKLQlwdWJsaWMgT2JqZWN0W10gYXJndW1lbnRzID0gbnVsbDsKLQlwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOTQ4NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGUgZXJyb3IgY3VzdG9taXphdGlvbiByZWdzaXRyeSBtYW5hZ2VzIGFsbCByZWdpc3RlcmVkCi0gKiBJRXJyb3JNZXNzYWdlQ3VzdG9taXplcnMgYnkgbmFtZXNwYWNlLgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkgCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOwotICBwcm90ZWN0ZWQgTWFwIGN1c3RvbWl6ZXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgCi0gIC8qKgotICAgKiBSZXN0cmljdGVkIGNvbnN0cnVjdG9yIGluIGtlZXBpbmcgd2l0aCB0aGUgc2luZ2xldG9uIHBhdHRlcm4uCi0gICAqLwotICBwcm90ZWN0ZWQgRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkoKQotICB7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotCWlmKHJlZ2lzdHJ5ID09IG51bGwpCi0JewotCSAgcmVnaXN0cnkgPSBuZXcgRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkoKTsKLQl9Ci0JcmV0dXJuIHJlZ2lzdHJ5OwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIGEgY3VzdG9taXplciB0byB0aGUgcmVnaXN0cnkuIAotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgKiAJCVRoZSBuYW1lc3BhY2UgdGhlIGN1c3RvbWl6ZXIgd2lsbCBhY3Qgb24uCi0gICAqIEBwYXJhbSBjdXN0b21pemVyCi0gICAqIAkJVGhlIGVycm9yIGN1c3RvbWl6ZXIgdG8gcmVnaXN0ZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvck1lc3NhZ2VDdXN0b21pemVyKFN0cmluZyBuYW1lc3BhY2UsIElFcnJvck1lc3NhZ2VDdXN0b21pemVyIGN1c3RvbWl6ZXIpCi0gIHsKLQkvLyBUbyByZWdpc3RlciBhIGN1c3RvbWl6ZXIgZm9yIHRoZSBubyBuYW1lc3BhY2UgdXNlIGFuIGVtcHR5IHN0cmluZy4KLQlpZihuYW1lc3BhY2UgPT0gbnVsbCkKLQl7Ci0JICBuYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlMaXN0IGN1c3RvbWl6ZXJzRm9yTlMgPSAoTGlzdCljdXN0b21pemVycy5nZXQobmFtZXNwYWNlKTsKLQlpZihjdXN0b21pemVyc0Zvck5TID09IG51bGwpCi0JewotCSAgY3VzdG9taXplcnNGb3JOUyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgIGN1c3RvbWl6ZXJzLnB1dChuYW1lc3BhY2UsIGN1c3RvbWl6ZXJzRm9yTlMpOwotCX0KLQlpZihjdXN0b21pemVyICE9IG51bGwpCi0JewotCSAgY3VzdG9taXplcnNGb3JOUy5hZGQoY3VzdG9taXplcik7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBlcnJvciBjdXN0b21pemVycyBmb3IgYSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlCi0gICAqIAkJVGhlIG5hbWVzcGFjZSBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIGN1c3RvbWl6ZXJzLgotICAgKiBAcmV0dXJuCi0gICAqIAkJQW4gYXJyYXkgb2YgY3VzdG9taXplcnMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBuYW1lc3BhY2UuCi0gICAqLwotICBwdWJsaWMgSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXJbXSBnZXRDdXN0b21pemVycyhTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0JaWYobmFtZXNwYWNlID09IG51bGwpCi0JewotCSAgbmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JTGlzdCBjdXN0b21pemVyc0Zvck5TID0gKExpc3QpY3VzdG9taXplcnMuZ2V0KG5hbWVzcGFjZSk7Ci0JaWYoY3VzdG9taXplcnNGb3JOUyA9PSBudWxsKQotCXsKLQkgIGN1c3RvbWl6ZXJzRm9yTlMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCXJldHVybiAoSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXJbXSljdXN0b21pemVyc0Zvck5TLnRvQXJyYXkobmV3IElFcnJvck1lc3NhZ2VDdXN0b21pemVyW2N1c3RvbWl6ZXJzRm9yTlMuc2l6ZSgpXSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxNDdjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBBbiBlcnJvciBtZXNzYWdlIGN1c3RvbWl6ZXIgZGVsZWdhdGUgaXMgdXNlZCB0byBhbGxvdyBmb3IKLSAqIGxhenkgbG9hZGluZyBvZiBlcnJvciBjdXN0b21pemVycy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUgaW1wbGVtZW50cyBJRXJyb3JNZXNzYWdlQ3VzdG9taXplcgotewotICBwcm90ZWN0ZWQgQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NuYW1lID0gbnVsbDsKLSAgcHJvdGVjdGVkIElFcnJvck1lc3NhZ2VDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBudWxsOwotICAKLSAgcHVibGljIEVycm9yTWVzc2FnZUN1c3RvbWl6ZXJEZWxlZ2F0ZShCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NuYW1lKQotICB7Ci0JdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JdGhpcy5jbGFzc25hbWUgPSBjbGFzc25hbWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uLklFcnJvck1lc3NhZ2VDdXN0b21pemVyI2N1c3RvbWl6ZU1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uLkVsZW1lbnRJbmZvcm1hdGlvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBjdXN0b21pemVNZXNzYWdlKEVsZW1lbnRJbmZvcm1hdGlvbiBlbGVtZW50SW5mbywgU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBhcmd1bWVudHMpIAotICB7Ci0JaWYoY3VzdG9taXplciA9PSBudWxsKQotCXsKLQkgIGxvYWRDdXN0b21pemVyKCk7Ci0JfQotCWlmKGN1c3RvbWl6ZXIgPT0gbnVsbCkKLQl7Ci0JICByZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIGN1c3RvbWl6ZXIuY3VzdG9taXplTWVzc2FnZShlbGVtZW50SW5mbywgZXJyb3JLZXksIGFyZ3VtZW50cyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBMb2FkIHRoZSBjdXN0b21pemVyIGNsYXNzLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgbG9hZEN1c3RvbWl6ZXIoKQotICB7Ci0JdHJ5Ci0JewotCSAgQ2xhc3MgY3VzdG9taXplckNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc25hbWUpOwotCSAgY3VzdG9taXplciA9IChJRXJyb3JNZXNzYWdlQ3VzdG9taXplciljdXN0b21pemVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQl9Ci0JY2F0Y2goRXhjZXB0aW9uIGUpCi0JewotCSAgWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotCQkJICBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgCi0JCQkJCSAgICAgWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIAotCQkJCQkgICAgIElTdGF0dXMuT0ssIAotCQkJCQkgICAgICJUaGUgWE1MIHZhbGlkYXRvciBlcnJvciBjdXN0b21pemVyIHdhcyB1bmFibGUgdG8gbG9hZCBjbGFzcyAiICsgY2xhc3NuYW1lLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0gIH0KLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0lFcnJvck1lc3NhZ2VDdXN0b21pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2ZDFlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uOwotCi0vKioKLSAqIEFuIGVycm9yIG1lc3NhZ2UgY3VzdG9taXplciB3aWxsIGJlIGNhbGxlZCBieSB0aGUgWE1MIHZhbGlkYXRvciB0byBjdXN0b21pemUKLSAqIFhNTCB2YWxpZGF0aW9uIGVycm9ycyBmb3IgYSBnaXZlbiBuYW1lc3BhY2UuIFRoZSBjdXN0b21pemVyIGNhbiBiZSB1c2VkIHRvIAotICogY3JlYXRlIGNsZWFyZXIgZXJyb3JzIGZvciBzcGVjaWZpYyBhcHBsaWNhdGlvbiBkb21haW5zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFcnJvck1lc3NhZ2VDdXN0b21pemVyIAotewotICAvKioKLSAgICogUmV0dXJuIGEgY3VzdG9taXplZCBlcnJvciBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4gTnVsbCBzaG91bGQgYmUgcmV0dXJuZWQKLSAgICogaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIG5vdCBiZSBjdXN0b21pemVkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnRJbmZvcm1hdGlvbgotICAgKiAJCVRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gY3VzdG9taXplIHRoZSBlcnJvci4KLSAgICogQHBhcmFtIGVycm9yS2V5Ci0gICAqIAkJVGhlIGtleSBmb3IgdGhlIGVycm9yIGZvciB3aGljaCB0byByZXBsYWNlIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gYXJndW1lbnRzCi0gICAqIAkJQXJndW1lbnRzIHJlbGF0ZWQgdGhlIHRoZSBlcnJvciBtZXNzYWdlLgotICAgKiBAcmV0dXJuCi0gICAqIAkJQSBjdXN0b21pemVkIGVycm9yIG1lc3NhZ2Ugb3IgbnVsbCBpZiB0aGlzIGN1c3RvbWl6ZXIgd2lsbCBub3QgY3VzdG9taXplIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBjdXN0b21pemVNZXNzYWdlKEVsZW1lbnRJbmZvcm1hdGlvbiBlbGVtZW50SW5mbywgU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBhcmd1bWVudHMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24veG1sdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24veG1sdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjEwNjVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbHZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLSBDb25zdGFudHMgZm9yIHN0cmluZ3MgIAotCi0hIFVzYWdlOgotISAgIHswfSByZXBsYWNlZCB3aXRoIHRoZSBob3N0IG5hbWUKLSEKLV9VSV9QUk9CTEVNU19WQUxJREFUSU5HX1VOS05PV05fSE9TVCAgICAgICAgICAgICA9IFRoZSBmaWxlIGNhbm5vdCBiZSB2YWxpZGF0ZWQgYXMgdGhlIGhvc3QgInswfSIgaXMgY3VycmVudGx5IHVucmVhY2hhYmxlLgotCi0hIFVzYWdlOgotISAgIHswfSByZXBsYWNlZCB3aXRoIHRoZSBmaWxlIG5hbWUKLSEKLV9VSV9QUk9CTEVNU19WQUxJREFUSU5HX0ZJTEVfTk9UX0ZPVU5EICAgICAgICAgICA9IFRoZSBmaWxlIGNhbm5vdCBiZSB2YWxpZGF0ZWQgYXMgdGhlIFhNTCBkZWZpbml0aW9uICJ7MH0iIHRoYXQgaXMgc3BlY2lmaWVkIGFzIGRlc2NyaWJpbmcgdGhlIHN5bnRheCBvZiB0aGUgZmlsZSBjYW5ub3QgYmUgbG9jYXRlZC4KLQotX1VJX1BST0JMRU1TX0NPTk5FQ1RJT05fUkVGVVNFRCAgICAgICAgICAgICAgICAgID0gVGhlIGZpbGUgY2Fubm90IGJlIHZhbGlkYXRlZCBhcyB0aGVyZSB3YXMgYSBjb25uZWN0aW9uIHByb2JsZW0uCi0KLSEKLSEgUmVmZXJlbmNlZCBGaWxlIERpYWxvZyBSZWxhdGVkIE1lc3NhZ2UKLSEKLV9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFICAgICAgICAgICAgICAgICAgICAgICA9IFJlZmVyZW5jZWQgZmlsZSBjb250YWlucyBlcnJvcnMgKHswfSkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmlnaHQgY2xpY2sgb24gdGhlIG1lc3NhZ2UgaW4gdGhlIFByb2JsZW1zIFZpZXcgYW5kIHNlbGVjdCAiU2hvdyBEZXRhaWxzLi4uIgotCi0jIFdhcm5pbmcgd2hlbiBubyBncmFtbWFyIGlzIGxvY2F0ZWQuCi1fV0FSTl9OT19HUkFNTUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBObyBncmFtbWFyIGNvbnN0cmFpbnRzIChEVEQgb3IgWE1MIHNjaGVtYSkgZGV0ZWN0ZWQgZm9yIHRoZSBkb2N1bWVudC4KLSAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMWMyOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1ub3RlYm9vay5qcGFnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9EZWJ1Z0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0RlYnVnQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2YjgwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0RlYnVnQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotCi1wdWJsaWMgY2xhc3MgRGVidWdBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBEZWJ1Z0FkYXB0ZXJGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBEZWJ1Z0FkYXB0ZXJGYWN0b3J5KCkgewotCQl0aGlzKElEZWJ1Z0FkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yICBmb3IgRGVidWdBZGFwdGVyRmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZkFkYXB0ZXJLZXkKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqLwotCXByaXZhdGUgRGVidWdBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIGFkZENvbnRyaWJ1dGVkRmFjdG9yaWVzKElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQkvL25vbmUgZXhwZWN0ZWQKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IERlYnVnQWRhcHRlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJRXZlcnlOb2RlRGVidWdBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IEV2ZXJ5Tm9kZURlYnVnQWRhcHRlci5nZXRJbnN0YW5jZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSUFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0KLQkJcmV0dXJuIElEZWJ1Z0FkYXB0ZXIuY2xhc3MgPT0gdHlwZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5I3NldENvbnRyaWJ1dGVkRmFjdG9yaWVzKGphdmEudXRpbC5BcnJheUxpc3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJpYnV0ZWRGYWN0b3JpZXMoQXJyYXlMaXN0IGxpc3QpIHsKLQkJLy8gbm9uZSBleHBlY3RlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvRXZlcnlOb2RlRGVidWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0V2ZXJ5Tm9kZURlYnVnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWE3MThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvRXZlcnlOb2RlRGVidWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuQWJvdXRUb0JlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0KLS8qKgotICogUHVyZWx5IGZvciB1c2UgaW4gZGVidWdnaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmVyeU5vZGVEZWJ1Z0FkYXB0ZXIgaW1wbGVtZW50cyBJRGVidWdBZGFwdGVyIHsKLQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRGVidWcucHJpbnRsbigiSWRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZDogIiArIGV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJJZG9jdW1lbnRDaGFuZ2VkOiAiICsgZXZlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0Jc3RhdGljIGNsYXNzIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxBYm91dFRvQmVDaGFuZ2VkOiAiICsgbW9kZWwpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsQ2hhbmdlZDogIiArIG1vZGVsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZDogIiArIG1vZGVsKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsUmVzb3VyY2VEZWxldGVkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxSZXNvdXJjZURlbGV0ZWQ6ICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlTW92ZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWwsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxSZXNvdXJjZU1vdmVkOiAiICsgIm9sZE1vZGVsOiAiICsgb2xkTW9kZWwgKyAibmV3TW9kZWw6ICIgKyBuZXdNb2RlbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZDogIiArICJzdHJ1Y3R1cmVkTW9kZWw6ICIgKyBzdHJ1Y3R1cmVkTW9kZWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJtb2RlbFJlaW5pdGlhbGl6ZWQ6ICIgKyAic3RydWN0dXJlZE1vZGVsOiAiICsgc3RydWN0dXJlZE1vZGVsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJfQotCi0JfQotCi0Jc3RhdGljIGNsYXNzIEludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZSBpbXBsZW1lbnRzIElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5BYm91dFRvQmVDaGFuZ2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoQWJvdXRUb0JlQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkOiAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0Jc3RhdGljIGNsYXNzIEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIjbmV3TW9kZWwob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5OZXdEb2N1bWVudENvbnRlbnRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCURlYnVnLnByaW50bG4oInN0cnVjdHVyZWREb2N1bWVudENoYW5nZWQgLSBuZXdNb2RlbDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25vQ2hhbmdlKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTm9DaGFuZ2VFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCURlYnVnLnByaW50bG4oInN0cnVjdHVyZWREb2N1bWVudENoYW5nZWQgLSBub0NoYW5nZTogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25vZGVzUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCURlYnVnLnByaW50bG4oInN0cnVjdHVyZWREb2N1bWVudENoYW5nZWQgLSBub2Rlc1JlcGxhY2VkOiAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIjcmVnaW9uQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gcmVnaW9uQ2hhbmdlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI3JlZ2lvbnNSZXBsYWNlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gcmVnaW9uc1JlcGxhY2VkOiAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXZlcnlOb2RlRGVidWdBZGFwdGVyIHNpbmdsZXRvbkluc3RhbmNlOwotCi0JcHVibGljIHN0YXRpYyBFdmVyeU5vZGVEZWJ1Z0FkYXB0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChzaW5nbGV0b25JbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzaW5nbGV0b25JbnN0YW5jZSA9IG5ldyBFdmVyeU5vZGVEZWJ1Z0FkYXB0ZXIoKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uSW5zdGFuY2U7Ci0JfQotCi0JSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyIGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXI7Ci0JSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyOwotCUludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZSBmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlOwotCUludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0JSVN0cnVjdHVyZWRNb2RlbCBmTW9kZWw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRXZlcnlOb2RlRGVidWdBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCQlmSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyID0gbmV3IEludGVybmFsRG9jdW1lbnRMaXN0ZW5lcigpOwotCQlmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlID0gbmV3IEludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZSgpOwotCQlmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKCk7Ci0JCWZJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgRXZlcnlOb2RlRGVidWdBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXRoaXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IElEZWJ1Z0FkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyLAotCSAqICAgICAgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlzZXRNb2RlbCgoKElET01Ob2RlKSBub3RpZmllcikuZ2V0TW9kZWwoKSk7Ci0JCX0KLQkJRGVidWcucHJpbnRsbigibm90aWZpZXI6ICIgKyBub3RpZmllciArICIgIiArIElOb2RlTm90aWZpZXIuRVZFTlRfVFlQRV9TVFJJTkdTW2V2ZW50VHlwZV0gKyAiIGNoYW5nZWRGZWF0dXJlOiAiICsgY2hhbmdlZEZlYXR1cmUgKyAiIG9sZFZhbHVlOiAiICsgb2xkVmFsdWUgKyAiIG5ld1ZhbHVlOiAiICsgbmV3VmFsdWUgKyAiIHBvczogIiArIHBvcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JRGVidWdBZGFwdGVyI3NldERvY3VtZW50KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWlmIChmTW9kZWwgPT0gc3RydWN0dXJlZE1vZGVsKQotCQkJcmV0dXJuOwotCi0JCWlmIChmTW9kZWwgIT0gbnVsbCkgewotCQkJZk1vZGVsLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIpOwotCQkJLy8KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZk1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UpOwotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJZk1vZGVsID0gc3RydWN0dXJlZE1vZGVsOwotCQlpZiAoZk1vZGVsICE9IG51bGwpIHsKLQotCQkJZk1vZGVsLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcihmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIpOwotCQkJLy8KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZk1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50TGlzdGVuZXIoZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UpOwotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9JRGVidWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0lEZWJ1Z0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjNTcxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0lEZWJ1Z0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSURlYnVnQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk4YzliYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxYzBhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBKZXNwZXIgU3RlZW4gTW9lbGxlciAtIEFkZGVkIFhNTCBDYXRhbG9ncyAxLjEgc3VwcG9ydAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFhNTCBDb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29yZU1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX2NoYXJhY3Rlcl9sdF9mb19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9jaGFyYWN0ZXJfZ3RfZm9fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfY2hhcmFjdGVyX2FtcF9mb19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9jaGFyYWN0ZXJfX2ZfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfZW50cnlfa2V5X25vdF9zZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19lbnRyeV91cmlfbm90X3NldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXRhbG9nX3Jld3JpdGVfc3RhcnRTdHJpbmdfbm90X3NldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXRhbG9nX3Jld3JpdGVfcHJlZml4X25vdF9zZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19zdWZmaXhfc3RyaW5nX25vdF9zZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19zdWZmaXhfdXJpX25vdF9zZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19kZWxlZ2F0ZV9wcmVmaXhfbm90X3NldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXRhbG9nX2RlbGVnYXRlX2NhdGFsb2dfbm90X3NldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXRhbG9nX25leHRfY2F0YWxvZ19sb2NhdGlvbl91cmlfbm90X3NldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXRhbG9nX3Jlc29sdXRpb25fbnVsbF9jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfcmVzb2x1dGlvbl9tYWxmb3JtZWRfdXJsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfcmVzb2x1dGlvbl9pb19leGNlcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ01Eb2N1bWVudF9sb2FkX2V4Y2VwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmRfdGFnX2hhc19hdHRyaWJ1dGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9faXNfbWlzc2luZ19hX3ZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9faGFzX25vX3ZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfZW5kX3RhZ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19zdGFydF90YWdfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRpY2F0ZV9ub19ncmFtbWFyX3NwZWNpZmllZF9zZXZlcml0aWVzX2Vycm9yOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNTENvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgWE1MQ29yZU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMTQ4YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci0KLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFhNTENvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgWE1MQ29yZVBsdWdpbiBwbHVnaW47Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9DQVRBTE9HX0lEID0gInVzZXJfY2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NBVEFMT0dfSUQgPSAiZGVmYXVsdF9jYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9DQVRBTE9HX0lEID0gInN5c3RlbV9jYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgQ2F0YWxvZ1NldCBjYXRhbG9nU2V0ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0Q2F0YWxvZ0ZpbGVTdGF0ZUxvY2F0aW9uOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUxDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSBkaXJlY3RseQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBYTUxDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBsdWdpblN0YXRlTG9jYXRpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IGdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoZmlsZU5hbWUpLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBmaWxlX3Byb3RvY29sID0gImZpbGU6IjsgLy8kTk9OLU5MUy0xJAotCQlpZiAobG9jYXRpb24gIT0gbnVsbCAmJiAhbG9jYXRpb24uc3RhcnRzV2l0aChmaWxlX3Byb3RvY29sKSkgewotCQkJbG9jYXRpb24gPSBmaWxlX3Byb3RvY29sICsgbG9jYXRpb247Ci0JCX0KLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZyBnZXREZWZhdWx0WE1MQ2F0YWxvZygpIHsKLQkJaWYgKGNhdGFsb2dTZXQgPT0gbnVsbCkgewotCQkJY2F0YWxvZ1NldCA9IG5ldyBDYXRhbG9nU2V0KCk7Ci0KLQkJCWRlZmF1bHRDYXRhbG9nRmlsZVN0YXRlTG9jYXRpb24gPSBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKENhdGFsb2cuREVGQVVMVF9DQVRBTE9HX0ZJTEUpOwotCi0JCQljYXRhbG9nU2V0LnB1dENhdGFsb2dQZXJzaXN0ZW5jZUxvY2F0aW9uKERFRkFVTFRfQ0FUQUxPR19JRCwgZGVmYXVsdENhdGFsb2dGaWxlU3RhdGVMb2NhdGlvbik7Ci0JCQljYXRhbG9nU2V0LnB1dENhdGFsb2dQZXJzaXN0ZW5jZUxvY2F0aW9uKFNZU1RFTV9DQVRBTE9HX0lELCBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKENhdGFsb2cuU1lTVEVNX0NBVEFMT0dfRklMRSkpOwotCQkJY2F0YWxvZ1NldC5wdXRDYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbihVU0VSX0NBVEFMT0dfSUQsIGdldFBsdWdpblN0YXRlTG9jYXRpb24oQ2F0YWxvZy5VU0VSX0NBVEFMT0dfRklMRSkpOwotCQl9Ci0JCXJldHVybiBjYXRhbG9nU2V0Lmxvb2t1cE9yQ3JlYXRlQ2F0YWxvZyhERUZBVUxUX0NBVEFMT0dfSUQsIGRlZmF1bHRDYXRhbG9nRmlsZVN0YXRlTG9jYXRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmMWZiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgSmVzcGVyIFN0ZWVuIE1vZWxsZXIgLSBBZGRlZCBYTUwgQ2F0YWxvZ3MgMS4xIHN1cHBvcnQKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSW52YWxpZF9jaGFyYWN0ZXJfbHRfZm9fRVJST1JfPUludmFsaWQgY2hhcmFjdGVyICgnPCcpIGZvdW5kCi1JbnZhbGlkX2NoYXJhY3Rlcl9ndF9mb19FUlJPUl89SW52YWxpZCBjaGFyYWN0ZXIgKCc+JykgZm91bmQKLUludmFsaWRfY2hhcmFjdGVyX2FtcF9mb19FUlJPUl89SW52YWxpZCBjaGFyYWN0ZXIgKCcmJykgZm91bmQKLUludmFsaWRfY2hhcmFjdGVyX19mX0VYQ189SW52YWxpZCBjaGFyYWN0ZXIgKCdcIicpIGZvdW5kCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGNvbnRlbnRtb2RlbCBzdHJpbmdzCi1sb2FkaW5nPWxvYWRpbmcgCi0jIGNhdGFsb2cgc3RyaW5ncwotQ2F0YWxvZ19lbnRyeV9rZXlfbm90X3NldD1DYXRhbG9nIGVudHJ5IGtleSBpcyBub3Qgc2V0Ci1DYXRhbG9nX2VudHJ5X3VyaV9ub3Rfc2V0PUNhdGFsb2cgZW50cnkgVVJJIGlzIG5vdCBzZXQKLUNhdGFsb2dfcmV3cml0ZV9zdGFydFN0cmluZ19ub3Rfc2V0PUNhdGFsb2cgcmV3cml0ZSBzdGFydCBzdHJpbmcgaXMgbm90IHNldAotQ2F0YWxvZ19yZXdyaXRlX3ByZWZpeF9ub3Rfc2V0PUNhdGFsb2cgcmV3cml0ZSBwcmVmaXggaXMgbm90IHNldAotQ2F0YWxvZ19zdWZmaXhfc3RyaW5nX25vdF9zZXQ9Q2F0YWxvZyBzdWZmaXggc3RyaW5nIGlzIG5vdCBzZXQKLUNhdGFsb2dfc3VmZml4X3VyaV9ub3Rfc2V0PUNhdGFsb2cgc3VmZml4IFVSSSBpcyBub3Qgc2V0Ci1DYXRhbG9nX2RlbGVnYXRlX3ByZWZpeF9ub3Rfc2V0PUNhdGFsb2cgZGVsZWdhdGUgcHJlZml4IGlzIG5vdCBzZXQKLUNhdGFsb2dfZGVsZWdhdGVfY2F0YWxvZ19ub3Rfc2V0PUNhdGFsb2cgZGVsZWdhdGUgVVJJIGlzIG5vdCBzZXQKLUNhdGFsb2dfbmV4dF9jYXRhbG9nX2xvY2F0aW9uX3VyaV9ub3Rfc2V0PU5leHQgY2F0YWxvZyBsb2NhdGlvbiBVUkkgaXMgbm90IHNldAotQ2F0YWxvZ19yZXNvbHV0aW9uX251bGxfY2F0YWxvZz1DYXRhbG9nIHJlc29sdXRpb24gYXR0ZW1wdGVkIHdpdGggbnVsbCBjYXRhbG9nOyBpZ25vcmVkCi1DYXRhbG9nX3Jlc29sdXRpb25fbWFsZm9ybWVkX3VybD1NYWxmb3JtZWQgVVJMIGV4Y2VwdGlvbiB0cnlpbmcgdG8gcmVzb2x2ZQotQ2F0YWxvZ19yZXNvbHV0aW9uX2lvX2V4Y2VwdGlvbj1JL08gZXhjZXB0aW9uIHRyeWluZyB0byByZXNvbHZlCi1DTURvY3VtZW50X2xvYWRfZXhjZXB0aW9uPUFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgZG9jdW1lbnQgezB9IHdpdGggcHVibGljSWQgezF9Ci1FbmRfdGFnX2hhc19hdHRyaWJ1dGVzPUVuZCB0YWcgaGFzIGF0dHJpYnV0ZXMKLUF0dHJpYnV0ZV9faXNfbWlzc2luZ19hX3ZhbHVlPUF0dHJpYnV0ZSBcInswfVwiIGlzIG1pc3NpbmcgYSB2YWx1ZQotQXR0cmlidXRlX19oYXNfbm9fdmFsdWU9QXR0cmlidXRlIFwiezB9XCIgIGhhcyBubyB2YWx1ZQotTWlzc2luZ19zdGFydF90YWdfPU1pc3Npbmcgc3RhcnQgdGFnIFwiezB9XCIKLU1pc3NpbmdfZW5kX3RhZ189TWlzc2luZyBlbmQgdGFnIFwiezB9XCIKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMD1NaXNzaW5nIGNsb3NpbmcgcXVvdGUKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMT1NaXNzaW5nIHF1b3RlcyBmb3IgYXR0cmlidXRlIHZhbHVlCi1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzI9QSB0YWduYW1lIGNhbm5vdCBzdGFydCB3aXRoIGEgc3BhY2UKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMz1FbXB0eSB0YWdzIGFyZSBub3QgYWxsb3dlZAotUmVjb25jaWxlU3RlcEZvck1hcmt1cF80PU5hbWVzcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIGEgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbiB0YXJnZXQKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNT1TcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGJlZm9yZSBhIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24KLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNj1UYWcgbWlzc2luZyBjbG9zaW5nIGJyYWNrZXQgJz4nCi1JbmRpY2F0ZV9ub19ncmFtbWFyX3NwZWNpZmllZF9zZXZlcml0aWVzX2Vycm9yPUVycm9yQ01Eb2N1bWVudF9sb2FkX2V4Y2VwdGlvbj1BbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIGRvY3VtZW50IHswfSB3aXRoIHB1YmxpY0lkIHsxfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DbGVhbnVwUHJvY2Vzc29yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTRhZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLlN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuVGV4dEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZvcm1hdHRlci5YTUxGb3JtYXR0ZXJGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KLQotcHVibGljIGNsYXNzIENsZWFudXBQcm9jZXNzb3JYTUwgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JCi0JcHVibGljIHZvaWQgY2xlYW51cE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCAmJiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRklYX1hNTF9ERUNMQVJBVElPTikpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9ICgoRE9NTW9kZWxJbXBsKSBzdHJ1Y3R1cmVkTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQlpZiAoIWZpeEV4aXN0aW5nWG1sRGVjbChkb2N1bWVudCkpIHsKLQkJCQlTdHJpbmcgZW5jb2RpbmcgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCQkJCU5vZGUgeG1sID0gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ4bWwiLCAidmVyc2lvbj1cIjEuMFwiICIgKyAiZW5jb2Rpbmc9XCIiICsgZW5jb2RpbmcgKyJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJZG9jdW1lbnQuaW5zZXJ0QmVmb3JlKHhtbCwgZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJCX0KLQkJfQotCQlzdXBlci5jbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGUgbm9kZSBhbiBYTUwgZGVjbGFyYXRpb24KLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBpcyBhbiBYTUwgZGVjbGFyYXRpb247IG90aGVyd2lzZSwgZmFsc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MRGVjbChJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFICYmICJ4bWwiLmVxdWFsc0lnbm9yZUNhc2UoKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUpLmdldFRhcmdldCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmaXhFeGlzdGluZ1htbERlY2woSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgKChUZXh0SW1wbCkgbm9kZSkuaXNXaGl0ZXNwYWNlKCkpCi0JCQlub2RlID0gKElET01Ob2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCWlmIChpc1hNTERlY2wobm9kZSkpIHsKLQkJCWRvY3VtZW50Lmluc2VydEJlZm9yZShub2RlLCBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSkgewotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBOb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbml0IENsZWFudXBQcmVmZXJlbmNlcwotCQljbGVhbnVwSGFuZGxlci5zZXRDbGVhbnVwUHJlZmVyZW5jZXMoZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkpOwotCi0JCXJldHVybiBjbGVhbnVwSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkNsZWFudXBQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydFJlcXVpcmVkQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0TWlzc2luZ1RhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldFF1b3RlQXR0clZhbHVlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEZvcm1hdFNvdXJjZShwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29udmVydEVPTENvZGVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0RU9MQ29kZShwcmVmZXJlbmNlcy5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkNsZWFudXBQcmVmZXJlbmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZ2V0Rm9ybWF0UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gbmV3IFhNTEZvcm1hdHRlckZvcm1hdFByb2Nlc3NvcigpOwotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2xlYW51cFByZWZlcmVuY2VzKCkgewotCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0VsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiYWE1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKEludGFsaW9uKSAtIENsZWFudXAgUmVwZWF0ZWQgQ29uZGl0aW9uYWwgY2hlY2sgaW4gaXNYTUxUeXBlIG1ldGhvZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlciBleHRlbmRzIE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URSA9ICdcIic7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfUVVPVEVTID0gIlwiXCIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfVEFHX0NMT1NFID0gIi8+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9UQUdfT1BFTiA9ICI8LyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFID0gJ1wnJzsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9RVU9URVMgPSAiJyciOyAvLyROT04tTkxTLTEkCi0KLQkvKiogTm9uLU5MUyBzdHJpbmdzICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVEFHX09QRU4gPSAiPCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0xPU0UgPSAiPiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0JCU5vZGUgbmV3Tm9kZSA9IGNsZWFudXBDaGlsZHJlbihub2RlKTsKLQkJSURPTU5vZGUgcmVuYW1lZE5vZGUgPSBuZXdOb2RlIGluc3RhbmNlb2YgSURPTU5vZGUgPyAoSURPTU5vZGUpIG5ld05vZGUgOiBudWxsOwotCi0JCS8vIGNhbGwgcXVvdGVBdHRyVmFsdWUoKSBmaXJzdCBzbyBpdCB3aWxsIGNsb3NlIGFueSB1bmNsb3NlZCBhdHRyCi0JCS8vIHF1b3RlQXR0clZhbHVlKCkgd2lsbCByZXR1cm4gdGhlIG5ldyBzdGFydCB0YWcgaWYgdGhlcmUgaXMgYQotCQkvLyBzdHJ1Y3R1cmUgY2hhbmdlCi0JCXJlbmFtZWROb2RlID0gcXVvdGVBdHRyVmFsdWUocmVuYW1lZE5vZGUpOwotCi0JCS8vIGluc2VydCB0YWcgY2xvc2UgaWYgbWlzc2luZwotCQkvLyBpZiBub2RlIGlzIG5vdCBjb21tZW50IHRhZwotCQkvLyBhbmQgbm90IGltcGxpY2l0IHRhZwotCQlpZiAoIWlzQ29tbWVudFRhZyhyZW5hbWVkTm9kZSkgJiYgIWlzSW1wbGljaXRUYWcocmVuYW1lZE5vZGUpKSB7Ci0JCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gcmVuYW1lZE5vZGUuZ2V0TW9kZWwoKTsKLQotCQkJLy8gc2F2ZSBzdGFydCBvZmZzZXQgYmVmb3JlIGluc2VydFRhZ0Nsb3NlKCkKLQkJCS8vIG9yIGVsc2UgcmVuYW1lZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSB3aWxsIGJlIHplcm8gaWYKLQkJCS8vIHJlbmFtZWROb2RlIHJlcGxhY2VkIGJ5IGluc2VydFRhZ0Nsb3NlKCkKLQkJCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gcmVuYW1lZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJLy8gZm9yIHN0YXJ0IHRhZwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHJlbmFtZWROb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpbnNlcnRUYWdDbG9zZShzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJLy8gdXBkYXRlIHJlbmFtZWROb2RlIGFuZCBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhZnRlcgotCQkJLy8gaW5zZXJ0VGFnQ2xvc2UoKQotCQkJcmVuYW1lZE5vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOwotCQkJc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQkvLyBmb3IgZW5kIHRhZwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJaW5zZXJ0VGFnQ2xvc2Uoc3RydWN0dXJlZE1vZGVsLCBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQl9Ci0KLQkJLy8gY2FsbCBpbnNlcnRNaXNzaW5nVGFncygpIG5leHQsIGl0IHdpbGwgZ2VuZXJhdGUgaW1wbGljaXQgdGFncyBpZgotCQkvLyB0aGVyZSBhcmUgYW55Ci0JCS8vIGluc2VydE1pc3NpbmdUYWdzKCkgd2lsbCByZXR1cm4gdGhlIG5ldyBtaXNzaW5nIHN0YXJ0IHRhZyBpZiBvbmUgaXMKLQkJLy8gbWlzc2luZwotCQlyZW5hbWVkTm9kZSA9IGluc2VydE1pc3NpbmdUYWdzKHJlbmFtZWROb2RlKTsKLQotCQlyZW5hbWVkTm9kZSA9IGNvbXByZXNzRW1wdHlFbGVtZW50VGFnKHJlbmFtZWROb2RlKTsKLQotCQlyZW5hbWVkTm9kZSA9IGluc2VydFJlcXVpcmVkQXR0cnMocmVuYW1lZE5vZGUpOwotCi0JCXJldHVybiByZW5hbWVkTm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBjbGVhbnVwQ2hpbGRyZW4oTm9kZSBub2RlKSB7Ci0JCU5vZGUgcGFyZW50Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCS8vIGdldCBjbGVhbnVwIGhhbmRsZXIKLQkJCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZ2V0Q2xlYW51cEhhbmRsZXIoY2hpbGROb2RlKTsKLQotCQkJCS8vIGNsZWFudXAgZWFjaCBjaGlsZAotCQkJCWNoaWxkTm9kZSA9IGNsZWFudXBIYW5kbGVyLmNsZWFudXAoY2hpbGROb2RlKTsKLQotCQkJCS8vIGdldCBuZXcgcGFyZW50IG5vZGUKLQkJCQlwYXJlbnROb2RlID0gY2hpbGROb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCS8vIGdldCBuZXh0IGNoaWxkIG5vZGUKLQkJCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwYXJlbnROb2RlOwotCX0KLQotCXByaXZhdGUgSURPTU5vZGUgY29tcHJlc3NFbXB0eUVsZW1lbnRUYWcoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIGNvbXByZXNzRW1wdHlFbGVtZW50VGFncyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldENvbXByZXNzRW1wdHlFbGVtZW50VGFncygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Tm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCWlmIChjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MgJiYgc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICYmIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQkvLyBmb3JtYXQgY2hpbGRyZW4gYW5kIGVuZCB0YWcgaWYgbm90IGVtcHR5IGVsZW1lbnQgdGFnCi0JCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5ld05vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWlmIChjaGlsZE5vZGVzID09IG51bGwgfHwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSA9PSAwIHx8IChjaGlsZE5vZGVzLmdldExlbmd0aCgpID09IDEgJiYgKGNoaWxkTm9kZXMuaXRlbSgwKSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiAoKGNoaWxkTm9kZXMuaXRlbSgwKSkuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApKSkgewotCQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbmV3Tm9kZS5nZXRNb2RlbCgpOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5ld05vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJaW50IG9mZnNldCA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpbnQgbGVuZ3RoID0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpOwotCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0KLQkJCQkJb2Zmc2V0ID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSArIGxhc3RSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCAwLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgZ2V0Q2xlYW51cEhhbmRsZXIoTm9kZSBub2RlKSB7Ci0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gbnVsbDsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBvcmcudzNjLmRvbS5Ob2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIG9yZy53M2MuZG9tLk5vZGUuVEVYVF9OT0RFIDogewotCQkJCWNsZWFudXBIYW5kbGVyID0gbmV3IE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdCA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBOb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGluaXQgQ2xlYW51cFByZWZlcmVuY2VzCi0JCWNsZWFudXBIYW5kbGVyLnNldENsZWFudXBQcmVmZXJlbmNlcyhnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKSk7Ci0KLQkJcmV0dXJuIGNsZWFudXBIYW5kbGVyOwotCX0KLQotCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCXJldHVybiBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KChEb2N1bWVudCkgbm9kZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSZXF1aXJlZEF0dHJzKE5vZGUgbm9kZSkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBnZXRNb2RlbFF1ZXJ5KG5vZGUpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCQlDTU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCQkJCUl0ZXJhdG9yIGl0ID0gYXR0ck1hcC5pdGVyYXRvcigpOwotCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlhdHRyID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGl0Lm5leHQoKTsKLQkJCQkJaWYgKGF0dHIuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKGF0dHIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElET01Ob2RlIGluc2VydEVuZFRhZyhJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybiBub2RlOyAvLyBkbyBub3RoaW5nCi0KLQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0KLQkJaWYgKGlzRW1wdHlFbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobGFzdFJlZ2lvbiksIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCksIEVNUFRZX1RBR19DTE9TRSk7Ci0KLQkJCWlmIChyZWdpb25zLnNpemUoKSA+IDEpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb25CZWZvcmVUYWdDbG9zZSA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSAtIDEpOwotCi0JCQkJLy8gaW5zZXJ0IGEgc3BhY2Ugc2VwYXJhdG9yIGJlZm9yZSB0YWcgY2xvc2UgaWYgdGhlIHByZXZpb3VzCi0JCQkJLy8gcmVnaW9uIGRvZXMgbm90IGhhdmUgZXh0cmEgc3BhY2VzCi0JCQkJaWYgKHJlZ2lvbkJlZm9yZVRhZ0Nsb3NlLmdldFRleHRMZW5ndGgoKSA9PSByZWdpb25CZWZvcmVUYWdDbG9zZS5nZXRMZW5ndGgoKSkKLQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobGFzdFJlZ2lvbiksIDAsICIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJU3RyaW5nIGVuZFRhZyA9IEVORF9UQUdfT1BFTi5jb25jYXQodGFnTmFtZSkuY29uY2F0KFRBR19DTE9TRSk7Ci0KLQkJCUlET01Ob2RlIGxhc3RDaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCWludCBlbmRUYWdTdGFydE9mZnNldCA9IDA7Ci0JCQlpZiAobGFzdENoaWxkICE9IG51bGwpCi0JCQkJLy8gaWYgdGhpcyBub2RlIGhhcyBjaGlsZHJlbiwgaW5zZXJ0IHRoZSBlbmQgdGFnIGFmdGVyIHRoZQotCQkJCS8vIGxhc3QgY2hpbGQKLQkJCQllbmRUYWdTdGFydE9mZnNldCA9IGxhc3RDaGlsZC5nZXRFbmRPZmZzZXQoKTsKLQkJCWVsc2UKLQkJCQkvLyBpZiB0aGlzIG5vZGUgZG9lcyBub3QgaGFzIGNoaWxkcmVuLCBpbnNlcnQgdGhlIGVuZCB0YWcKLQkJCQkvLyBhZnRlciB0aGUgc3RhcnQgdGFnCi0JCQkJZW5kVGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVuZFRhZ1N0YXJ0T2Zmc2V0LCAwLCBlbmRUYWcpOwotCQl9Ci0KLQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7IC8vIHNhdmUKLQkJLy8gbmV3Ci0JCS8vIG5vZGUKLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIElET01Ob2RlIGluc2VydE1pc3NpbmdUYWdzKElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldEluc2VydE1pc3NpbmdUYWdzKCk7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCi0JCWlmIChpbnNlcnRNaXNzaW5nVGFncykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJLy8gaW1wbGljaXQgc3RhcnQgdGFnOyBnZW5lcmF0ZSB0YWcgZm9yIGl0Ci0JCQkJbmV3Tm9kZSA9IGluc2VydFN0YXJ0VGFnKG5vZGUpOwotCQkJCXN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Tm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3Qgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25SZWdpb25zID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25SZWdpb25zICE9IG51bGwgJiYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucy5nZXQoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25SZWdpb25zLnNpemUoKSAtIDEpKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQkJLy8gc3RhcnQgdGFnIG1pc3NpbmcKLQkJCQkJaWYgKGlzU3RhcnRUYWdSZXF1aXJlZChuZXdOb2RlKSkKLQkJCQkJCW5ld05vZGUgPSBpbnNlcnRTdGFydFRhZyhuZXdOb2RlKTsKLQkJCQl9IGVsc2UgaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIGVuZCB0YWcgbWlzc2luZwotCQkJCQlpZiAoaXNFbmRUYWdSZXF1aXJlZChuZXdOb2RlKSkKLQkJCQkJCW5ld05vZGUgPSBpbnNlcnRFbmRUYWcobmV3Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBpbnNlcnRSZXF1aXJlZEF0dHJzKElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBpbnNlcnRSZXF1aXJlZEF0dHJzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0SW5zZXJ0UmVxdWlyZWRBdHRycygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAoaW5zZXJ0UmVxdWlyZWRBdHRycykgewotCQkJTGlzdCByZXF1aXJlZEF0dHJzID0gZ2V0UmVxdWlyZWRBdHRycyhuZXdOb2RlKTsKLQkJCWlmIChyZXF1aXJlZEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQlOYW1lZE5vZGVNYXAgY3VycmVudEF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJTGlzdCBpbnNlcnRBdHRycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoY3VycmVudEF0dHJzLmdldExlbmd0aCgpID09IDApCi0JCQkJCWluc2VydEF0dHJzLmFkZEFsbChyZXF1aXJlZEF0dHJzKTsKLQkJCQllbHNlIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZEF0dHJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyTmFtZSA9ICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgcmVxdWlyZWRBdHRycy5nZXQoaSkpLmdldEF0dHJOYW1lKCk7Ci0JCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQkJU3RyaW5nIGN1cnJlbnRBdHRyTmFtZSA9IGN1cnJlbnRBdHRycy5pdGVtKGopLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQkJaWYgKHJlcXVpcmVkQXR0ck5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShjdXJyZW50QXR0ck5hbWUpID09IDApIHsKLQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIWZvdW5kKQotCQkJCQkJCWluc2VydEF0dHJzLmFkZChyZXF1aXJlZEF0dHJzLmdldChpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGluc2VydEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaW50IGluZGV4ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJCWluZGV4LS07Ci0JCQkJCQlsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXggLSAxKTsKLQkJCQkJfSBlbHNlIGlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkJCWluZGV4ID0gaW5kZXggLSAyOwotCQkJCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCQkJCX0KLQkJCQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZvciAoaW50IGkgPSBpbnNlcnRBdHRycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5zZXJ0QXR0cnMuZ2V0KGkpOwotCQkJCQkJCVN0cmluZyByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgPSBhdHRyRGVjbC5nZXRBdHRyTmFtZSgpOwotCQkJCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBhdHRyRGVjbC5nZXREZWZhdWx0VmFsdWUoKTsKLQkJCQkJCQlpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpCi0JCQkJCQkJCWRlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIG5hbWVBbmREZWZhdWx0VmFsdWUgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoaSA9PSAwICYmIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCkgPiBsYXN0UmVnaW9uLmdldFRleHRMZW5ndGgoKSkKLQkJCQkJCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSArPSByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgKyAiPVwiIiArIGRlZmF1bHRWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQoaW5kZXgsIG5hbWVBbmREZWZhdWx0VmFsdWUpKTsKLQkJCQkJCQkvLyBCVUczMzgxOiBNdWx0aVRleHRFZGl0IGFwcGxpZXMgYWxsIGNoaWxkCi0JCQkJCQkJLy8gVGV4dEVkaXQncyBiYXNpbmcgb24gb2Zmc2V0cwotCQkJCQkJCS8vICAgICAgICAgIGluIHRoZSBkb2N1bWVudCBiZWZvcmUgdGhlIGZpcnN0IFRleHRFZGl0LCBub3QKLQkJCQkJCQkvLyBhZnRlciBlYWNoCi0JCQkJCQkJLy8gICAgICAgICAgY2hpbGQgVGV4dEVkaXQuIFRoZXJlZm9yZSwgZG8gbm90IG5lZWQgdG8KLQkJCQkJCQkvLyBhZHZhbmNlIHRoZSBpbmRleC4KLQkJCQkJCQkvL2luZGV4ICs9IG5hbWVBbmREZWZhdWx0VmFsdWUubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCQltdWx0aVRleHRFZGl0LmFwcGx5KG5ld05vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBpbnNlcnRTdGFydFRhZyhJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCi0JCWlmIChpc0NvbW1lbnRUYWcobm9kZSkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQlTdHJpbmcgc3RhcnRUYWcgPSBTVEFSVF9UQUdfT1BFTi5jb25jYXQodGFnTmFtZSkuY29uY2F0KFRBR19DTE9TRSk7Ci0JCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCi0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBzdGFydFRhZ1N0YXJ0T2Zmc2V0LCAwLCBzdGFydFRhZyk7Ci0JCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCS8vIG5ldwotCQkvLyBub2RlCi0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc2VydFRhZ0Nsb3NlKElET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCBmbGF0bm9kZVJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlpZiAoZmxhdG5vZGVSZWdpb25zICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gZmxhdG5vZGVSZWdpb25zLmdldChmbGF0bm9kZVJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IGxhc3RSZWdpb24uZ2V0VHlwZSgpOwotCQkJCQlpZiAoKHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSAmJiAocmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJCQkJLy8gaW5zZXJ0ICI+IiBhZnRlciBsYXN0UmVnaW9uIG9mIGZsYXROb2RlCi0JCQkJCQkvLyBhcyBpbiAiPGE8L2E+IiBpZiBmbGF0Tm9kZSBpcyBmb3Igc3RhcnQgdGFnLCBvciBpbgotCQkJCQkJLy8gIjxhPjwvYSIgaWYgZmxhdE5vZGUgaXMgZm9yIGVuZCB0YWcKLQkJCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQobGFzdFJlZ2lvbiksIDAsICI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZW5hbWVkTm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50VGFnKE5vZGUgcmVuYW1lZE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKHJlbmFtZWROb2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQpIHsKLQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHJlbmFtZWROb2RlOwotCQkJcmVzdWx0ID0gZWxlbWVudC5pc0NvbW1lbnRUYWcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJLy8gdW5kZWZpbmVkIHRhZywgcmV0dXJuIGRlZmF1bHQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkKLQkJCS8vIHVuZGVmaW5lZCB0YWcsIHJldHVybiBkZWZhdWx0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQkvLyB1bmRlZmluZWQgdGFnLCByZXR1cm4gZGVmYXVsdAotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmRUYWdSZXF1aXJlZChJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBub2RlLmlzQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQSB0YWcgaXMgaW1wbGljaXQgaWYgaXQgaGFzIG5vdCBjb3JyZXNwb25kaW5nIHJlZ2lvbiBpbiBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVuYW1lZE5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW1wbGljaXRUYWcoSURPTU5vZGUgcmVuYW1lZE5vZGUpIHsKLQkJcmV0dXJuIHJlbmFtZWROb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZW5kIHRhZ3Mgb2YgSFRNTCBFTVBUWSBjb250ZW50IHR5cGUsIHN1Y2ggYXMgSU1HLCBhbmQgSFRNTAotCSAqIHVuZGVmaW5lZCB0YWdzIGFyZSBwYXJzZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBzdGFydCB0YWdzLiBTbyBpbnNlcnRpbmcKLQkgKiB0aGUgbWlzc2luZyBzdGFydCB0YWcgaXMgdXNlbGVzcyBhbmQgZXZlbiBoYXJtZnVsLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1N0YXJ0VGFnUmVxdWlyZWQoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbm9kZS5pc0NvbnRhaW5lcigpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1hNTFR5cGUoSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldERvY3VtZW50KCk7Ci0KLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGRvY3VtZW50LmlzWE1MVHlwZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElET01Ob2RlIHF1b3RlQXR0clZhbHVlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0JCS8vWE1MRWxlbWVudCBlbGVtZW50ID0gKFhNTEVsZW1lbnQpIG5vZGU7Ci0JCWlmIChpc0NvbW1lbnRUYWcobm9kZSkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCWJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0UXVvdGVBdHRyVmFsdWVzKCk7Ci0KLQkJaWYgKHF1b3RlQXR0clZhbHVlcykgewotCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBuZXdOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCQlpbnQgYXR0cmlidXRlc0xlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCQkJSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBub2RlLmdldE1vZGVsKCkuZ2V0R2VuZXJhdG9yKCk7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNMZW5ndGg7IGkrKykgewotCQkJCQlhdHRyaWJ1dGVzID0gbmV3Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCWF0dHJpYnV0ZXNMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJCQlJRE9NQXR0ciBlYWNoQXR0ciA9IChJRE9NQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCQkvL0lUZXh0UmVnaW9uIG9sZEF0dHJWYWx1ZVJlZ2lvbiA9Ci0JCQkJCS8vIGVhY2hBdHRyLmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJCVN0cmluZyBvbGRBdHRyVmFsdWUgPSBlYWNoQXR0ci5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQkJaWYgKG9sZEF0dHJWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJCQkJaWYgKGlzWE1MVHlwZShzdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQkJCQkJU3RyaW5nIG5ld0F0dHJWYWx1ZSA9ICJcIiIgKyBlYWNoQXR0ci5nZXROYW1lUmVnaW9uVGV4dCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCQlpZiAoZWFjaEF0dHIuZ2V0RXF1YWxSZWdpb24oKSAhPSBudWxsKQotCQkJCQkJCQkvLyBlcXVhbCByZWdpb24gZXhpc3RzCi0JCQkJCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVhY2hBdHRyLmdldEVuZE9mZnNldCgpLCAwLCBuZXdBdHRyVmFsdWUpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJLy8gbm8gZXF1YWwgcmVnaW9uCi0JCQkJCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVhY2hBdHRyLmdldE5hbWVSZWdpb25UZXh0RW5kT2Zmc2V0KCksIDAsICI9Ii5jb25jYXQobmV3QXR0clZhbHVlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOyAvLyBzYXZlCi0JCQkJCQkJLy8gbmV3Ci0JCQkJCQkJLy8gbm9kZQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy9TdHJpbmcgb2xkQXR0clZhbHVlID0gb2xkQXR0clZhbHVlUmVnaW9uLmdldFRleHQoKTsKLQkJCQkJCWNoYXIgcXVvdGUgPSBTdHJpbmdVdGlscy5pc1F1b3RlZChvbGRBdHRyVmFsdWUpID8gb2xkQXR0clZhbHVlLmNoYXJBdCgwKSA6IERPVUJMRV9RVU9URTsKLQkJCQkJCVN0cmluZyBuZXdBdHRyVmFsdWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoZWFjaEF0dHIsIHF1b3RlKTsKLQotCQkJCQkJLy8gVGhlcmUgaXMgYSBwcm9ibGVtIGluCi0JCQkJCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShJVGV4dFJlZ2lvbikKLQkJCQkJCS8vIHdoZW4gdGhlIHJlZ2lvbiBpcyBpbnN0YW5jZW9mIENvbnRleHRSZWdpb24uCi0JCQkJCQkvLyBXb3JrYXJvdW5kIGZvciBub3cuLi4KLQkJCQkJCWlmIChvbGRBdHRyVmFsdWUubGVuZ3RoKCkgPT0gMSkgewotCQkJCQkJCWNoYXIgZmlyc3RDaGFyID0gb2xkQXR0clZhbHVlLmNoYXJBdCgwKTsKLQkJCQkJCQlpZiAoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URSkKLQkJCQkJCQkJbmV3QXR0clZhbHVlID0gU0lOR0xFX1FVT1RFUzsKLQkJCQkJCQllbHNlIGlmIChmaXJzdENoYXIgPT0gRE9VQkxFX1FVT1RFKQotCQkJCQkJCQluZXdBdHRyVmFsdWUgPSBET1VCTEVfUVVPVEVTOwotCQkJCQkJfQotCi0JCQkJCQlpZiAobmV3QXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQlpZiAobmV3QXR0clZhbHVlLmNvbXBhcmVUbyhvbGRBdHRyVmFsdWUpICE9IDApIHsKLQkJCQkJCQkJaW50IGF0dHJWYWx1ZVN0YXJ0T2Zmc2V0ID0gZWFjaEF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCQkJCQlpbnQgYXR0clZhbHVlTGVuZ3RoID0gb2xkQXR0clZhbHVlLmxlbmd0aCgpOwotCQkJCQkJCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJCQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgYXR0clZhbHVlU3RhcnRPZmZzZXQsIGF0dHJWYWx1ZUxlbmd0aCwgbmV3QXR0clZhbHVlKTsKLQkJCQkJCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7IC8vIHNhdmUKLQkJCQkJCQkJLy8gbmV3Ci0JCQkJCQkJCS8vIG5vZGUKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvTm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvTm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YzIwOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBOb2RlQ2xlYW51cEhhbmRsZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIHsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBmQ2xlYW51cFByZWZlcmVuY2VzID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCi0JcHVibGljIE5vZGUgY2xlYW51cChOb2RlIG5vZGUpIHsKLQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkNsZWFudXBQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydFJlcXVpcmVkQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0TWlzc2luZ1RhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldFF1b3RlQXR0clZhbHVlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEZvcm1hdFNvdXJjZShwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29udmVydEVPTENvZGVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0RU9MQ29kZShwcmVmZXJlbmNlcy5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkNsZWFudXBQcmVmZXJlbmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xlYW51cFByZWZlcmVuY2VzKElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcykgewotCi0JCWZDbGVhbnVwUHJlZmVyZW5jZXMgPSBjbGVhbnVwUHJlZmVyZW5jZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1hNTENsZWFudXBQcmVmZXJlbmNlc0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9YTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3M2M0ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1hNTENsZWFudXBQcmVmZXJlbmNlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklYTUxQcmVmZXJlbmNlTmFtZXM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgcmVuYW1lZCB0byBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzCi0gKiAKLSAqIFRPRE8gd2lsbCBkZWxldGUgaW4gQzUKLSAqLwotcHVibGljIGNsYXNzIFhNTENsZWFudXBQcmVmZXJlbmNlc0ltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgWE1MQ2xlYW51cFByZWZlcmVuY2VzSW1wbCBmSW5zdGFuY2U7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBYTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsIGdldEluc3RhbmNlKCkgewotCi0JCS8vIGFkZGVkIGZvciBvbmUgbWV0aG9kIGluIENsZWFudXBEaWFsb2cgLi4uIG1heSBiZSBiZXR0ZXIgd2F5Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IFhNTENsZWFudXBQcmVmZXJlbmNlc0ltcGwoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgaW50IGZBdHRyTmFtZUNhc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZDb252ZXJ0RU9MQ29kZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZkVPTENvZGU7Ci0JcHJpdmF0ZSBib29sZWFuIGZGb3JtYXRTb3VyY2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbnNlcnRNaXNzaW5nVGFnczsKLQkvLyBwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZSA9IG51bGw7Ci0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBmUHJlZmVyZW5jZXMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmUXVvdGVBdHRyVmFsdWVzOwotCXByaXZhdGUgaW50IGZUYWdOYW1lQ2FzZTsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0ck5hbWVDYXNlKCkgewotCi0JCXJldHVybiBmQXR0ck5hbWVDYXNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldENvbnZlcnRFT0xDb2RlcygpIHsKLQotCQlyZXR1cm4gZkNvbnZlcnRFT0xDb2RlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVPTENvZGUoKSB7Ci0KLQkJcmV0dXJuIGZFT0xDb2RlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEZvcm1hdFNvdXJjZSgpIHsKLQotCQlyZXR1cm4gZkZvcm1hdFNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJbnNlcnRNaXNzaW5nVGFncygpIHsKLQotCQlyZXR1cm4gZkluc2VydE1pc3NpbmdUYWdzOwotCX0KLQotCXB1YmxpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQotCQlpZiAoZlByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZQcmVmZXJlbmNlcyA9IFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcmVmZXJlbmNlczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRRdW90ZUF0dHJWYWx1ZXMoKSB7Ci0KLQkJcmV0dXJuIGZRdW90ZUF0dHJWYWx1ZXM7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWdOYW1lQ2FzZSgpIHsKLQotCQlyZXR1cm4gZlRhZ05hbWVDYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJOYW1lQ2FzZShpbnQgYXR0ck5hbWVDYXNlKSB7Ci0KLQkJZkF0dHJOYW1lQ2FzZSA9IGF0dHJOYW1lQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0RU9MQ29kZXMoYm9vbGVhbiBjb252ZXJ0RU9MQ29kZXMpIHsKLQotCQlmQ29udmVydEVPTENvZGVzID0gY29udmVydEVPTENvZGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVPTENvZGUoU3RyaW5nIEVPTENvZGUpIHsKLQotCQlmRU9MQ29kZSA9IEVPTENvZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9ybWF0U291cmNlKGJvb2xlYW4gZm9ybWF0U291cmNlKSB7Ci0KLQkJZkZvcm1hdFNvdXJjZSA9IGZvcm1hdFNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRNaXNzaW5nVGFncyhib29sZWFuIGluc2VydE1pc3NpbmdUYWdzKSB7Ci0KLQkJZkluc2VydE1pc3NpbmdUYWdzID0gaW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZXMoUHJlZmVyZW5jZXMgcHJlZnMpIHsKLQotCQlmUHJlZmVyZW5jZXMgPSBwcmVmczsKLQkJdXBkYXRlT3B0aW9ucygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFF1b3RlQXR0clZhbHVlcyhib29sZWFuIHF1b3RlQXR0clZhbHVlcykgewotCi0JCWZRdW90ZUF0dHJWYWx1ZXMgPSBxdW90ZUF0dHJWYWx1ZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFnTmFtZUNhc2UoaW50IHRhZ05hbWVDYXNlKSB7Ci0KLQkJZlRhZ05hbWVDYXNlID0gdGFnTmFtZUNhc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT3B0aW9ucygpIHsKLQotCQlQcmVmZXJlbmNlcyBwID0gZ2V0UHJlZmVyZW5jZXMoKTsKLQkJZlRhZ05hbWVDYXNlID0gcC5nZXRJbnQoSVhNTFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX1RBR19OQU1FX0NBU0UpOwotCQlmQXR0ck5hbWVDYXNlID0gcC5nZXRJbnQoSVhNTFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFKTsKLQkJZkluc2VydE1pc3NpbmdUYWdzID0gcC5nZXRCb29sZWFuKElYTUxQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUyk7Ci0JCWZRdW90ZUF0dHJWYWx1ZXMgPSBwLmdldEJvb2xlYW4oSVhNTFByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUyk7Ci0JCWZGb3JtYXRTb3VyY2UgPSBwLmdldEJvb2xlYW4oSVhNTFByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFKTsKLQkJZkNvbnZlcnRFT0xDb2RlcyA9IHAuZ2V0Qm9vbGVhbihJWE1MUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTKTsKLQkJZkVPTENvZGUgPSBwLmdldFN0cmluZyhJWE1MUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvQ29tbWVudEVsZW1lbnRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L0NvbW1lbnRFbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZhZjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvQ29tbWVudEVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlRhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRBZGFwdGVyIGltcGxlbWVudHMgVGFnQWRhcHRlciB7Ci0JcHJpdmF0ZSBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gZkNvbmZpZ3VyYXRpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkVuZFRhZzsKLQlwcml2YXRlIENvbW1lbnRFbGVtZW50SGFuZGxlciBmSGFuZGxlcjsKLQotCXB1YmxpYyBDb21tZW50RWxlbWVudEFkYXB0ZXIoYm9vbGVhbiBpc0VuZFRhZywgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGhhbmRsZXIpIHsKLQkJZkVuZFRhZyA9IGlzRW5kVGFnOwotCQlmSGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVDb21tZW50Q2xvc2UoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQuaXNKU1BUYWcoKSkgPyAiLS0lPiIgOiAiLS0+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVDb21tZW50T3BlbihJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoZWxlbWVudC5pc0pTUFRhZygpKSA/ICI8JS0tIiA6ICI8IS0tIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJpdmF0ZSBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGZDb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSBmSGFuZGxlci5nZW5lcmF0ZUVuZFRhZ0NvbnRlbnQoZWxlbWVudCk7Ci0JCWlmIChjb250ZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJYnVmZmVyLmFwcGVuZChnZW5lcmF0ZUNvbW1lbnRPcGVuKGVsZW1lbnQpKTsKLQkJYnVmZmVyLmFwcGVuZChjb250ZW50KTsKLQkJYnVmZmVyLmFwcGVuZChnZW5lcmF0ZUNvbW1lbnRDbG9zZShlbGVtZW50KSk7Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlcklEKCkgewotCQlyZXR1cm4gZ2V0Q29uZmlndXJhdGlvbigpLmdldEhhbmRsZXJJRCgpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KG5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgY29udGVudCA9IGZIYW5kbGVyLmdlbmVyYXRlU3RhcnRUYWdDb250ZW50KGVsZW1lbnQpOwotCQlpZiAoY29udGVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50T3BlbihlbGVtZW50KSk7Ci0JCWJ1ZmZlci5hcHBlbmQoY29udGVudCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50Q2xvc2UoZWxlbWVudCkpOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDb21tZW50RWxlbWVudEFkYXB0ZXIuY2xhc3MgfHwgdHlwZSA9PSBUYWdBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuICghZkhhbmRsZXIuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZFRhZygpIHsKLQkJcmV0dXJuIGZFbmRUYWc7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlmQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZThlNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1lbnRFbGVtZW50SGFuZGxlciB7Ci0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHByZWZpeCBvZiB0aGUgY29tbWVudCBjb250ZW50IG1hdGNoZXMKLQkgKiB0aGUgc3RyaW5nIHNwZWNpZmllZCBpbiAmbHQ7c3RhcnRzd2l0aCBwcmVmaXg9IiIvJmd0OyBpbiBwbHVnaW4KLQkgKiBleHRlbnNpb24uIENvbW1lbnQgY29udGVudCBpcyBwYXJzZWQgYW5kIG5ldyBET00gZWxlbWVudCBpcyBjcmVhdGVkIGluCi0JICogdGhpcyBtZXRob2QuIEltcGxlbWVudG9yIGhhcyB0byBkbyBmb2xsb3dpbmc6Ci0JICogPGxpPkZvciBzdGFydCB0YWcgOgotCSAqIDx1bD4KLQkgKiA8bGk+cGFyc2UgY29tbWVudCBjb250ZW50IGFuZCBjcmVhdGUgbmV3IGVsZW1lbnQgaW5zdGFuY2UuPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvbGk+Ci0JICogPGxpPkZvciBlbmQgdGFnIDoKLQkgKiA8dWw+Ci0JICogPGxpPnBhcnNlIGNvbW1lbnQgY29udGVudCBhbmQgY3JlYXRlIG5ldyBlbGVtZW50IGluc3RhbmNlLjwvbGk+Ci0JICogPGxpPm1ha2UgaXNFbmRUYWcgZmxhZyB0cnVlLjwvbGk+Ci0JICogPGxpPlBhcnNlciBmcmFtZXdvcmsgc2VhcmNoZXMgbWFjaGVkIHN0YXJ0IHRhZyBlbGVtZW50IGluc3RhbmNlIGFmdGVyCi0JICogdGhpcyBjcmVhdGVFbGVtZW50IGNhbGwsIGFuZCBuZXcgaW5zdGFuY2UgaXMganVzdCB0aHJvd24gYXdheS48L2xpPgotCSAqIDwvdWw+Ci0JICogPC9saT4KLQkgKiA8bGk+Rm9yIGVtcHR5IHRhZyA6Ci0JICogPHVsPgotCSAqIDxsaT5wYXJzZSBjb21tZW50IGNvbnRlbnQgYW5kIGNyZWF0ZSBuZXcgZWxlbWVudCBpbnN0YW5jZS48L2xpPgotCSAqIDxsaT5tYWtlIGlzRW5kVGFnIGZsYWcgdHJ1ZS48L2xpPgotCSAqIDwvdWw+Ci0JICogPC9saT4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHBhcmVudCBET00gZG9jdW1lbnQKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgY29tbWVudCBjb250ZW50LiBjb21tZW50IHByZWZpeCAoJmx0OyEtLSBvciAmbHQ7JS0tKSwgc3VmZml4Ci0JICogICAgICAgICAgICAoLS0mZ3Q7IG9yIC0tJSZndDspLCBhbmQgc3Vycm91bmRpbmcgc3BhY2VzIGFyZSB0cmltbWVkLgotCSAqIEBwYXJhbSBpc0pTUFRhZwotCSAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgY29tbWVudCBpcyBKU1Agc3R5bGUgY29tbWVudC4gVGhpcyBpbmZvcm1hdGlvbgotCSAqICAgICAgICAgICAgbWF5IGJlIHJlcXVpcmVkIGJ5IGhhbmRsZXIgd2hlbiB0aGUgaGFuZGxlciBhY2NlcHRzIGJvdGggWE1MCi0JICogICAgICAgICAgICBzdHlsZSBhbmQgSlNQIHN0eWxlIGNvbW1lbnQgKG5hbWVseSwKLQkgKiAgICAgICAgICAgIGNvbW1lbnR0eXBlPSZxdW90O2JvdGgmcXVvdDsgaW4gcGx1Z2luLnhtbCkuCi0JICogQHJldHVybiBjb21tZW50IGVsZW1lbnQgaW5zdGFuY2UgaWYgdGhlIGNvbW1lbnQgY29udGVudCBpcyByaWdodGx5Ci0JICogICAgICAgICBwYXJzZWQuIGlmIHBhcnNlIGZhaWxlZCwgcmV0dXJucyBudWxsLgotCSAqLwotCUVsZW1lbnQgY3JlYXRlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHRoZSBzb3VyY2UgdGV4dCBvZiB0aGUgZW5kIHRhZyBmb3IgdGhlIHBhc3NlZAotCSAqIGVsZW1lbnQuIERvIG5vdCBnZW5lcmF0ZSBjb21tZW50IHByZWZpeCAoJmx0OyEtLSBvciAmbHQ7JS0tKSBhbmQgc3VmZml4Ci0JICogKC0tJmd0OyBvciAtLSUmZ3Q7KS4gWE1MR2VuZXJhdG9yIHVzZXMgdGhpcyBtZXRob2QgdG8gZ2VuZXJhdGUgWE1ML0hUTUwKLQkgKiBzb3VyY2UgZm9yIGEgY29tbWVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgY29tbWVudCBlbGVtZW50Ci0JICogQHJldHVybiBnZW5lcmF0ZWQgdGFnIHN0cmluZwotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUVuZFRhZ0NvbnRlbnQoSURPTUVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgdGhlIHNvdXJjZSB0ZXh0IG9mIHRoZSBzdGFydCB0YWcgZm9yIHRoZSBwYXNzZWQKLQkgKiBlbGVtZW50LiBEbyBub3QgZ2VuZXJhdGUgY29tbWVudCBwcmVmaXggKCZsdDshLS0gb3IgJmx0OyUtLSkgYW5kIHN1ZmZpeAotCSAqICgtLSZndDsgb3IgLS0lJmd0OykuIFhNTEdlbmVyYXRvciB1c2VzIHRoaXMgbWV0aG9kIHRvIGdlbmVyYXRlIFhNTC9IVE1MCi0JICogc291cmNlIGZvciBhIGNvbW1lbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGNvbW1lbnQgZWxlbWVudAotCSAqIEByZXR1cm4gZ2VuZXJhdGVkIHRhZyBzdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVTdGFydFRhZ0NvbnRlbnQoSURPTUVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4gd2hldGhlciB0aGUgZWxlbWVudCBpcyBjb21tZW50IGVsZW1lbnQgb3Igbm90Ci0JICovCi0JYm9vbGVhbiBpc0NvbW1lbnRFbGVtZW50KElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuIHdoZXRoZXIgdGhpcyBlbGVtZW50IGNhbiBoYXZlIGNoaWxkcmVuIG9yIG5vdAotCSAqLwotCWJvb2xlYW4gaXNFbXB0eSgpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQkvLwlTdHJpbmcgZ2V0RWxlbWVudFByZWZpeCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0Jhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2ltcGwvQmFzaWNDb21tZW50RWxlbWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmNjIyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2ltcGwvQmFzaWNDb21tZW50RWxlbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQudXRpbC5Db21tZW50RWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LnV0aWwuVGFnU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLQotLyoqCi0gKi8KLWNsYXNzIEJhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyIGltcGxlbWVudHMgQ29tbWVudEVsZW1lbnRIYW5kbGVyIHsKLQotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnROYW1lOwotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5OwotCi0JcHVibGljIEJhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyKFN0cmluZyBlbGVtZW50TmFtZSwgYm9vbGVhbiBpc0VtcHR5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLQkJdGhpcy5pc0VtcHR5ID0gaXNFbXB0eTsKLQl9Ci0KLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCVN0cmluZyBzdHIgPSBkYXRhLnRyaW0oKTsKLQkJQ29tbWVudEVsZW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQ29tbWVudEVsZW1lbnRGYWN0b3J5KGRvY3VtZW50LCBpc0pTUFRhZywgdGhpcyk7Ci0JCWlmIChzdHIuY2hhckF0KDApID09ICcvJykgeyAvLyBlbmQgdGFnCi0JCQlUYWdTY2FubmVyIHNjYW5uZXIgPSBuZXcgVGFnU2Nhbm5lcihzdHIsIDEpOyAvLyBza2lwICcvJwotCQkJU3RyaW5nIG5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCQlpZiAobmFtZS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlKG5hbWUsIENvbW1lbnRFbGVtZW50RmFjdG9yeS5JU19FTkQpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBzdGFydCB0YWcKLQkJCVRhZ1NjYW5uZXIgc2Nhbm5lciA9IG5ldyBUYWdTY2FubmVyKHN0ciwgMCk7Ci0JCQlTdHJpbmcgbmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50TmFtZSkpIHsKLQkJCQllbGVtZW50ID0gZmFjdG9yeS5jcmVhdGUobmFtZSwgKGlzRW1wdHkpID8gQ29tbWVudEVsZW1lbnRGYWN0b3J5LklTX0VNUFRZIDogQ29tbWVudEVsZW1lbnRGYWN0b3J5LklTX1NUQVJUKTsKLQkJCQkvLyBzZXQgYXR0cmlidXRlcwotCQkJCVN0cmluZyBhdHRyTmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJCQl3aGlsZSAoYXR0ck5hbWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgYXR0clZhbHVlID0gc2Nhbm5lci5uZXh0VmFsdWUoKTsKLQkJCQkJQXR0ciBhdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGF0dHJOYW1lKTsKLQkJCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKQotCQkJCQkJCSgoSURPTUF0dHIpIGF0dHIpLnNldFZhbHVlU291cmNlKGF0dHJWYWx1ZSk7Ci0JCQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQkJCX0KLQkJCQkJYXR0ck5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUVuZFRhZ0NvbnRlbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoaXNFbXB0eSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBlbGVtZW50LmdldE1vZGVsKCkuZ2V0R2VuZXJhdG9yKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJYnVmZmVyLmFwcGVuZCgiIC8iKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdGFnTmFtZSA9IGdlbmVyYXRvci5nZW5lcmF0ZVRhZ05hbWUoZWxlbWVudCk7Ci0JCWlmICh0YWdOYW1lICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBlbGVtZW50LmdldE1vZGVsKCkuZ2V0R2VuZXJhdG9yKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQlTdHJpbmcgdGFnTmFtZSA9IGdlbmVyYXRvci5nZW5lcmF0ZVRhZ05hbWUoZWxlbWVudCk7Ci0JCWlmICh0YWdOYW1lICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCX0KLQotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IGdlbmVyYXRvci5nZW5lcmF0ZUF0dHJOYW1lKGF0dHIpOwotCQkJaWYgKGF0dHJOYW1lICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJOYW1lKTsKLQkJCX0KLQkJCVN0cmluZyBhdHRyVmFsdWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoYXR0cik7Ci0JCQlpZiAoYXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQkvLyBhdHRyIG5hbWUgb25seSBmb3IgSFRNTCBib29sZWFuIGFuZCBKU1AKLQkJCQlidWZmZXIuYXBwZW5kKCc9Jyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChhdHRyVmFsdWUpOwotCQkJfQotCQl9Ci0KLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnRFbGVtZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5nZXRUYWdOYW1lKCkuZXF1YWxzKGVsZW1lbnROYW1lKSkgPyB0cnVlIDogZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIGlzRW1wdHk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0NvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0NvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGQ5MDBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIE1hcCBmQXR0cmlidXRlcyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZDdXN0b207Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGZFbXB0eTsKLQlwcml2YXRlIENvbW1lbnRFbGVtZW50SGFuZGxlciBmSGFuZGxlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZklEID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZkpTUENvbW1lbnQ7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmUHJlZml4ID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlhNTENvbW1lbnQ7Ci0KLQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJZkVsZW1lbnQgPSBlbGVtZW50OwotCQlmQ3VzdG9tID0gImhhbmRsZXItY3VzdG9tIi5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbGxBdHRyaWJ1dGVzKGVsZW1lbnQpOwotCi0JCWZYTUxDb21tZW50ID0gZkpTUENvbW1lbnQgPSBmYWxzZTsKLQkJU3RyaW5nIGNvbW1lbnRUeXBlID0gZ2V0UHJvcGVydHkoImNvbW1lbnR0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCJ4bWwiLmVxdWFsc0lnbm9yZUNhc2UoY29tbWVudFR5cGUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZYTUxDb21tZW50ID0gdHJ1ZTsKLQkJfSBlbHNlIGlmICgianNwIi5lcXVhbHNJZ25vcmVDYXNlKGNvbW1lbnRUeXBlKSkgeyAvLyROT04tTkxTLTEkCi0JCQlmSlNQQ29tbWVudCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoImJvdGgiLmVxdWFsc0lnbm9yZUNhc2UoY29tbWVudFR5cGUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZYTUxDb21tZW50ID0gZkpTUENvbW1lbnQgPSB0cnVlOwotCQl9Ci0JCVN0cmluZyBlbXB0eSA9IGdldFByb3BlcnR5KCJpc2VtcHR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJZkVtcHR5ID0gQm9vbGVhbi52YWx1ZU9mKGVtcHR5KS5ib29sZWFuVmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdEpTUENvbW1lbnQoKSB7Ci0JCXJldHVybiBmSlNQQ29tbWVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRYTUxDb21tZW50KCkgewotCQlyZXR1cm4gZlhNTENvbW1lbnQ7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgZ2V0SGFuZGxlcigpLmNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQsIGRhdGEsIGlzSlNQVGFnKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJQ29tbWVudEVsZW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAoQ29tbWVudEVsZW1lbnRBZGFwdGVyKSBlbGVtZW50LmdldEFkYXB0ZXJGb3IoQ29tbWVudEVsZW1lbnRBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLnNldENvbmZpZ3VyYXRpb24odGhpcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxBdHRyaWJ1dGVzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChmQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlmQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0gZWxzZSB7Ci0JCQlmQXR0cmlidXRlcy5jbGVhcigpOwotCQl9Ci0JCVN0cmluZ1tdIG5hbWVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpOwotCQlpZiAobmFtZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBsZW5ndGggPSBuYW1lcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gbmFtZXNbaV07Ci0JCQlmQXR0cmlidXRlcy5wdXQobmFtZS50b0xvd2VyQ2FzZSgpLCBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGdldEhhbmRsZXIoKSB7Ci0JCWlmIChmSGFuZGxlciA9PSBudWxsKSB7Ci0JCQlpZiAoZkVsZW1lbnQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChpc0N1c3RvbSgpKSB7Ci0JCQkJCQlmSGFuZGxlciA9IChDb21tZW50RWxlbWVudEhhbmRsZXIpIGZFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZyBlbGVtZW50TmFtZSA9IGdldFByb3BlcnR5KCJlbGVtZW50bmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoZWxlbWVudE5hbWUgIT0gbnVsbCkgewotCQkJCQkJCWZIYW5kbGVyID0gbmV3IEJhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyKGVsZW1lbnROYW1lLCBmRW1wdHkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vCQkJCQkoKEFic3RyYWN0Q29tbWVudEVsZW1lbnRIYW5kbGVyKWZIYW5kbGVyKS5zZXRFbGVtZW50UHJlZml4KGZFbGVtZW50LmdldEF0dHJpYnV0ZSgicHJlZml4IikpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGNhdGNoIGFuZCBsb2cgKGFuZCBpZ25vcmUpIEFOWSBleGNlcHRpb24gY3JlYXRlZAotCQkJCQkvLyBieSBleGVjdXRhYmxlIGV4dGVuc2lvbi4KLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJZkhhbmRsZXIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJZkhhbmRsZXIgPSBuZXcgQ29tbWVudEVsZW1lbnRIYW5kbGVyKCkgewotCQkJCQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZykgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRW5kVGFnQ29udGVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVTdGFydFRhZ0NvbnRlbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotLy8gcmVtb3ZlZCBpbiBSQzIsIHJvIHJlbW92ZWQgInVudXNlZCIgZXJyb3Ivd2FybmluZwotLy8JCQkJCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFByZWZpeCgpIHsKLS8vCQkJCQkJcmV0dXJuIG51bGw7Ci0vLwkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIGlzQ29tbWVudEVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZIYW5kbGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlcklEKCkgewotCQlpZiAoZklEID09IG51bGwpIHsKLQkJCWZJRCA9IGdldFByb3BlcnR5KCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZklEID09IG51bGwpIHsKLQkJCQlpZiAoaXNDdXN0b20oKSkgewotCQkJCQlmSUQgPSBnZXRQcm9wZXJ0eSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlidWYuYXBwZW5kKGZFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpKTsKLQkJCQkJYnVmLmFwcGVuZCgnLicpOwotCQkJCQlidWYuYXBwZW5kKGdldFByb3BlcnR5KCJlbGVtZW50bmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmSUQgPSBidWYudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZJRDsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQcmVmaXgoKSB7Ci0JCWlmIChmUHJlZml4ID09IG51bGwpIHsKLQkJCWlmIChmRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKGlzQ3VzdG9tKCkpIHsgLy8gY3VzdG9tCi0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHByZWZpeGVzID0gZkVsZW1lbnQuZ2V0Q2hpbGRyZW4oInN0YXJ0d2l0aCIpOyAvLyROT04tTkxTLTEkCQotCQkJCQlpZiAocHJlZml4ZXMgIT0gbnVsbCkgewotCQkJCQkJTGlzdCBwcmVmaXhWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KHByZWZpeGVzLmxlbmd0aCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJU3RyaW5nIHByZWZpeCA9IHByZWZpeGVzW2ldLmdldEF0dHJpYnV0ZSgicHJlZml4Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAocHJlZml4ICE9IG51bGwpIHsKLQkJCQkJCQkJcHJlZml4VmFsdWVzLmFkZChwcmVmaXgpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJtaXNjb25maWd1cmVkIGNvbW1lbnQgZWxlbWVudCBpbiIgKyBmRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSwgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3RhcnR3aXRoIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJfQotCQkJCQkJCQljYXRjaCAoSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCS8vIHN0YWxlIGJ1bmRsZT8KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICghcHJlZml4VmFsdWVzLmlzRW1wdHkoKSkgewotCQkJCQkJCWZQcmVmaXggPSAoU3RyaW5nW10pIHByZWZpeFZhbHVlcy50b0FycmF5KG5ldyBTdHJpbmdbcHJlZml4VmFsdWVzLnNpemUoKV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsgLy8gYmFzaWMKLQkJCQkJU3RyaW5nIG5hbWUgPSBnZXRQcm9wZXJ0eSgiZWxlbWVudG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoaXNFbXB0eSgpKSB7Ci0JCQkJCQkJZlByZWZpeCA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCQkJZlByZWZpeFswXSA9IG5hbWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWZQcmVmaXggPSBuZXcgU3RyaW5nWzJdOwotCQkJCQkJCWZQcmVmaXhbMF0gPSBuYW1lOwotCQkJCQkJCWZQcmVmaXhbMV0gPSAnLycgKyBuYW1lOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChmUHJlZml4ID09IG51bGwpIHsKLQkJCWZQcmVmaXggPSBuZXcgU3RyaW5nWzBdOwotCQl9Ci0JCXJldHVybiBmUHJlZml4OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChmQXR0cmlidXRlcyAhPSBudWxsKSA/IChTdHJpbmcpIGZBdHRyaWJ1dGVzLmdldChuYW1lKSA6IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3VzdG9tKCkgewotCQlyZXR1cm4gZkN1c3RvbTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIGZFbXB0eTsKLQl9Ci0KLQl2b2lkIHNldHVwQ29tbWVudEVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQllbGVtZW50LnNldENvbW1lbnRUYWcodHJ1ZSk7Ci0JCUNvbW1lbnRFbGVtZW50QWRhcHRlciBhZGFwdGVyID0gbmV3IENvbW1lbnRFbGVtZW50QWRhcHRlcihmYWxzZSwgZkhhbmRsZXIpOwotCQlhZGFwdGVyLnNldENvbmZpZ3VyYXRpb24odGhpcyk7Ci0JCWVsZW1lbnQuYWRkQWRhcHRlcihhZGFwdGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2ltcGwvQ29tbWVudEVsZW1lbnRSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0NvbW1lbnRFbGVtZW50UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkMWY2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2ltcGwvQ29tbWVudEVsZW1lbnRSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnRFbGVtZW50UmVnaXN0cnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tbWVudEVsZW1lbnRSZWdpc3RyeSBmSW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ29tbWVudEVsZW1lbnRSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ29tbWVudEVsZW1lbnRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImNvbW1lbnRFbGVtZW50SGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbltdIGZDb25maWd1cmF0aW9ucyA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENvbW1lbnRFbGVtZW50UmVnaXN0cnkuCi0JICovCi0JcHJpdmF0ZSBDb21tZW50RWxlbWVudFJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb25bXSBnZXRDb25maWd1cmF0aW9ucygpIHsKLQkJaWYgKGZDb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZDb25maWd1cmF0aW9ucyA9IG5ldyBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb25bZWxlbWVudHMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZDb25maWd1cmF0aW9uc1tpXSA9IG5ldyBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24oZWxlbWVudHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmQ29uZmlndXJhdGlvbnMgPT0gbnVsbCkgewotCQkJCWZDb25maWd1cmF0aW9ucyA9IG5ldyBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb25bMF07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZDb25maWd1cmF0aW9uczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXR1cENvbW1lbnRFbGVtZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25zW10gPSBnZXRDb25maWd1cmF0aW9ucygpOwotCQlpbnQgbGVuZ3RoID0gY29uZmlndXJhdGlvbnMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gY29uZiA9IGNvbmZpZ3VyYXRpb25zW2ldOwotCQkJYm9vbGVhbiBpc0pTUCA9IGVsZW1lbnQuaXNKU1BUYWcoKTsKLQkJCWlmIChpc0pTUCAmJiBjb25mLmFjY2VwdEpTUENvbW1lbnQoKSB8fCAhaXNKU1AgJiYgY29uZi5hY2NlcHRYTUxDb21tZW50KCkpIHsKLQkJCQlDb21tZW50RWxlbWVudEhhbmRsZXIgaGFuZGxlciA9IGNvbmYuZ2V0SGFuZGxlcigpOwotCQkJCWlmIChoYW5kbGVyLmlzQ29tbWVudEVsZW1lbnQoZWxlbWVudCkpIHsKLQkJCQkJY29uZi5zZXR1cENvbW1lbnRFbGVtZW50KGVsZW1lbnQpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvdXRpbC9Db21tZW50RWxlbWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvdXRpbC9Db21tZW50RWxlbWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFjMjdiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L3V0aWwvQ29tbWVudEVsZW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJU19FTVBUWSA9IDQ4NjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVNfRU5EID0gMTgwODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTX1NUQVJUID0gMjgwMTE7Ci0KLQlwcml2YXRlIERvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIENvbW1lbnRFbGVtZW50SGFuZGxlciBmSGFuZGxlcjsKLQlwcml2YXRlIGJvb2xlYW4gZkpTUFRhZzsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb21tZW50RWxlbWVudEZhY3RvcnkuCi0JICovCi0JcHJpdmF0ZSBDb21tZW50RWxlbWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvbW1lbnRFbGVtZW50RmFjdG9yeShEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiBpc0pTUFRhZywgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGhhbmRsZXIpIHsKLQkJdGhpcygpOwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZkpTUFRhZyA9IGlzSlNQVGFnOwotCQlmSGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlKFN0cmluZyBuYW1lLCBpbnQgbm9kZVR5cGUpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgZkRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxlbWVudC5zZXRDb21tZW50VGFnKHRydWUpOwotCQlpZiAobm9kZVR5cGUgPT0gSVNfRU1QVFkpIHsKLQkJCWVsZW1lbnQuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0JCX0KLQkJZWxlbWVudC5zZXRKU1BUYWcoZkpTUFRhZyk7Ci0KLQkJQ29tbWVudEVsZW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgQ29tbWVudEVsZW1lbnRBZGFwdGVyKChub2RlVHlwZSA9PSBJU19FTkQpLCBmSGFuZGxlcik7Ci0JCWVsZW1lbnQuYWRkQWRhcHRlcihhZGFwdGVyKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L3V0aWwvVGFnU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL1RhZ1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwZDQwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L3V0aWwvVGFnU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQudXRpbDsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgVGFnU2Nhbm5lciB7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRXF1YWwoY2hhciBjKSB7Ci0JCXJldHVybiAoYyA9PSAnPScpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNRdW90ZShjaGFyIGMpIHsKLQkJcmV0dXJuIChjID09ICciJyB8fCBjID09ICdcJycpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTcGFjZShjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYyk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBtZW1PZmZzZXQgPSAwOwotCXByaXZhdGUgaW50IG9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBib29sZWFuIG9uZUxpbmUgPSBmYWxzZTsKLQotCXByaXZhdGUgU3RyaW5nIHRhZyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgVGFnU2Nhbm5lcihTdHJpbmcgdGFnLCBpbnQgb2Zmc2V0KSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy50YWcgPSB0YWc7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQl0aGlzLm1lbU9mZnNldCA9IC0xOwotCQlpZiAodGFnICE9IG51bGwpCi0JCQl0aGlzLmxlbmd0aCA9IHRhZy5sZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgVGFnU2Nhbm5lcihTdHJpbmcgdGFnLCBpbnQgb2Zmc2V0LCBib29sZWFuIG9uZUxpbmUpIHsKLQkJdGhpcyh0YWcsIG9mZnNldCk7Ci0KLQkJdGhpcy5vbmVMaW5lID0gb25lTGluZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5leHRPZmZzZXQoKSB7Ci0JCWludCBpOwotCQljaGFyIGM7Ci0JCWZvciAoaSA9IG9mZnNldDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQljID0gdGFnLmNoYXJBdChpKTsKLQkJCWlmIChpc0VuZChjKSkKLQkJCQlicmVhazsKLQkJCWlmIChpc1F1b3RlKGMpKSB7Ci0JCQkJaSsrOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKCFpc1NwYWNlKGMpICYmICFpc0VxdWFsKGMpKQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gdGhpcy5tZW1PZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzRW5kKGNoYXIgYykgewotCQlyZXR1cm4gKHRoaXMub25lTGluZSAmJiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmV3TGluZSgpIHsKLQkJaWYgKG9uZUxpbmUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNoYXIgYzsKLQkJZm9yIChpbnQgaSA9IG1lbU9mZnNldCAtIDE7IDAgPD0gaTsgaS0tKSB7Ci0JCQljID0gdGFnLmNoYXJBdChpKTsKLQkJCWlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKCFpc1NwYWNlKGMpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBjaGFyIG5leHRDaGFyKCkgewotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmIChpc0VuZChjKSkKLQkJCQlicmVhazsKLQkJCWlmICghaXNTcGFjZShjKSkKLQkJCQlyZXR1cm4gYzsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIG5leHROYW1lKCkgewotCQlpZiAodGhpcy50YWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5sZW5ndGgpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAobmV4dENoYXIoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IG5hbWVPZmZzZXQgPSB0aGlzLm9mZnNldDsKLQkJZm9yICg7IHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGg7IHRoaXMub2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IHRoaXMudGFnLmNoYXJBdCh0aGlzLm9mZnNldCk7Ci0JCQlpZiAoaXNFbmQoYykgfHwgaXNTcGFjZShjKSkKLQkJCQlicmVhazsKLQkJCWlmIChpc0VxdWFsKGMpICYmIHRoaXMub2Zmc2V0ID4gbmFtZU9mZnNldCkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAodGhpcy5vZmZzZXQgPT0gbmFtZU9mZnNldCkKLQkJCXJldHVybiBudWxsOwotCi0JCXRoaXMubWVtT2Zmc2V0ID0gbmFtZU9mZnNldDsKLQkJcmV0dXJuIHRoaXMudGFnLnN1YnN0cmluZyhuYW1lT2Zmc2V0LCB0aGlzLm9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBuZXh0VmFsdWUoKSB7Ci0JCWlmICh0aGlzLnRhZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm9mZnNldCA+PSB0aGlzLmxlbmd0aCkKLQkJCXJldHVybiBudWxsOwotCi0JCWNoYXIgc2VwZXJhdG9yID0gbmV4dENoYXIoKTsKLQkJaWYgKCFpc0VxdWFsKHNlcGVyYXRvcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdGhpcy5vZmZzZXQrKzsgLy8gc2tpcCAnPScKLQkJY2hhciBxdW90ZSA9IG5leHRDaGFyKCk7Ci0JCWlmIChxdW90ZSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChpc1F1b3RlKHF1b3RlKSkKLQkJCXRoaXMub2Zmc2V0Kys7Ci0JCWVsc2UKLQkJCXF1b3RlID0gMDsKLQotCQlpbnQgdmFsdWVPZmZzZXQgPSB0aGlzLm9mZnNldDsKLQkJZm9yICg7IHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGg7IHRoaXMub2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IHRoaXMudGFnLmNoYXJBdCh0aGlzLm9mZnNldCk7Ci0JCQlpZiAoaXNFbmQoYykpIHsKLQkJCQlxdW90ZSA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocXVvdGUgPT0gMCkgewotCQkJCWlmIChpc1NwYWNlKGMpKQotCQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGMgPT0gcXVvdGUpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWludCB2YWx1ZUVuZCA9IHRoaXMub2Zmc2V0OwotCQlpZiAocXVvdGUgIT0gMCAmJiB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoKQotCQkJdGhpcy5vZmZzZXQrKzsKLQkJaWYgKHZhbHVlRW5kID09IHZhbHVlT2Zmc2V0KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdGhpcy5tZW1PZmZzZXQgPSB2YWx1ZU9mZnNldDsKLQkJcmV0dXJuIHRoaXMudGFnLnN1YnN0cmluZyh2YWx1ZU9mZnNldCwgdmFsdWVFbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiY2JlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHJvdGVjdGVkIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRvOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZkhlYWRlclBhcnNlZDsKLQotCXByb3RlY3RlZCBSZWFkZXIgZlJlYWRlcjsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcGFyYW0gcmVhc29uCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lLCBTdHJpbmcgcmVhc29uKSB7Ci0JCWNyZWF0ZUVuY29kaW5nTWVtZW50byhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgZW5zdXJlSW5wdXRTZXQoKSB7Ci0JCWlmIChmUmVhZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlucHV0IG11c3QgYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIHJldHVybiBudWxsLCBpZiBpbnZhbGlkIGNoYXJzZXQgbmFtZSAoaW4gd2hpY2ggY2FzZQotCSAqICJhcHByb3ByaWF0ZURlZmF1bHQiIHNob3VsZCBiZSB1c2VkLCBpZiBhIG5hbWUgaXMgcmVhbGx5IG5lZWQgZm9yIHNvbWUKLQkgKiAic2F2ZSBhbnl3YXkiIGNhc2VzKS4KLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyAxLiBDaGVjayBleHBsaWNpdCBtYXBwaW5nIG92ZXJyaWRlcyBmcm9tCi0JCS8vIHByb3BlcnR5IGZpbGUgLS0gaXRzIGhlcmUgd2UgcGljayB1cCAicnVsZXMiIGZvciBjYXNlcwotCQkvLyB0aGF0IGFyZSBub3QgZXZlbiBpbiBKYXZhCi0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyAyLiBVc2UgdGhlICJjYW5vbmljYWwiIG5hbWUgZnJvbSBKUkUgbWFwcGluZ3MKLQkJLy8gTm90ZTogc2VlIENoYXJzZXQgSmF2YURvYywgdGhlIG5hbWUgeW91IGdldCBvbmUKLQkJLy8gd2l0aCBjYW4gYmUgYWxpYXMsCi0JCS8vIHRoZSBuYW1lIHlvdSBnZXQgYmFjayBpcyAic3RhbmRhcmQiIG5hbWUuCi0JCUNoYXJzZXQgamF2YUNoYXJzZXQgPSBudWxsOwotCQl0cnkgewotCQkJamF2YUNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCS8vIGdpdmUgcHJpb3JpdHkgdG8gamF2YSBjb25vbmljYWwgbmFtZSwgaWYgcHJlc2VudAotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gamF2YUNoYXJzZXQubmFtZSgpOwotCQkJLy8gYnV0IHN0aWxsIGFsbG93IG92ZXJyaWRlcwotCQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCS8vIHRvIGVuc3VyZSBjb25zaXN0IG92ZXJhbGwgcnVsZXMgdXNlZCwgd2UnbGwgbWFyayBhcwotCS8vIGZpbmFsLAotCS8vIGFuZCByZXF1aXJlIHN1YmNsYXNzZXMgdG8gcHJvdmlkZSBjZXJ0YWluIHBpZWNlcyBvZgotCS8vIHRoZQotCS8vIGltcGxlbWVudGF0aW9uCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuCi0JCQkvLyBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcKLQkJCS8vIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUKLQkJCS8vIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMKLQkJCS8vIG5vdCBwcmVzZW50LgotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWhhbmRsZVNwZWNEZWZhdWx0KCk7Ci0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJLy8gc2FmdHkgbmV0Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IE51bGxNZW1lbnRvKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0byByZXR1cm4gYSBkZWZhdWx0IGVuY29kaW5nIC0tIGFzIHNwZWNpZmllZCBieSBhbiBpbmR1c3RyeQotCSAqIGNvbnRlbnQgdHlwZSBzcGVjIC0tIHdoZW4gbm90IHByZXNlbnQgaW4gdGhlIHN0cmVhbSwgZm9yIGV4YW1wbGUsIFhNTAotCSAqIHNwZWNpZmllcyBVVEYtOCwgSlNQIHNwZWNpZmllcyBJU08tODg1OS0xLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuCi0JICogbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoICJzcGVjIGRlZmF1bHQiLgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRTcGVjRGVmYXVsdEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmVzZXRBbGwoKTsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBlbmMgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmMgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuYyk7Ci0JCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy9jcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdOYW1lLAotCQkJLy8gRW5jb2RpbmdNZW1lbnRvLlVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGVuY29kaW5nTmFtZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmNvZGluZ05hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXZlcnkgc3ViY2xhc3MgbXVzdCBwcm92aWRlIGEgd2F5IHRvIHBhcnNlIHRoZSBpbnB1dC4gVGhpcyBtZXRob2QgaGFzCi0JICogc2V2ZXJhbCBjcml0aWNhbCByZXNwb25zaWJpbGl0aWVzOgotCSAqIDxsaT5zZXQgdGhlIGZFbmNvZGluZ01lbWVudG8gZmllbGQgYXBwcm9wcmlhdGVseSwgYWNjb3JkaW5nIHRvIHRoZQotCSAqIHJlc3VsdHMgb2YgdGhlIHBhcnNlIG9mIGZSZWFkZXIuPC9saT4KLQkgKiA8bGk+c2V0IGZIYXJkZXJQYXJzZWQgdG8gdHJ1ZSwgdG8gYXZvaWQgd2FzdGVkIHJlLXBhcnNpbmcuPC9saT4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSBuZXcgQnl0ZVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyCi0JCQkvLyBzdXBwb3J0cyBtYXJraW5nCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNTBiM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gImFkYXB0ZXIiIGNsYXNzLCBzaW1wbHkgdG8gZ2V0IGluIGlucHV0IHN0cmVhbSB0byBhY3QgbGlrZSBhCi0gKiByZWFkZXIuIFdlIGNvdWxkIG5vdCB1c2UgSW5wdXRTdHJlYW1SZWFkZXIgZGlyZWN0bHkgYmVjYXVzZSBpdHMgaW50ZXJuYWwKLSAqIGJ1ZmZlcnMgYXJlIG5vdCBjb250cm9sbGFibGUsIGFuZCBpdCBzb21ldGltZXMgcHVsbHMgdG9vIG11Y2ggb3V0IG9mIGlucHV0Ci0gKiBzdHJlYW0gKGV2ZW4gd2hlbiBpdCB3YXNuJ3QgbmVlZGVkIGZvciBvdXIgcHVycG9zZXMpLgotICogCi0gKiBUaGUgdXNlIG9mIHRoaXMgY2xhc3MgaXMgaGlnaGx5IHNwZWNpYWxpemVkIGFuZCBieSBub3QgbWVhbnMgbWVhbnQgdG8gYmUKLSAqIGdlbmVyYWwgcHVycG9zZS4gSXRzIHVzZSBpcyByZXN0cmljdGVkIHRvIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBpbnB1dAotICogc3RyZWFtIGNhbiBiZSByZWdhcmRlZCBhcyBhc2NpaSBqdXN0IGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB3aGF0IHRoZSByZWFsCi0gKiBlbmNvZGluZyBzaG91bGQgYmUuCi0gKi8KLQotcHVibGljIGNsYXNzIEJ5dGVSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IENvZGVkSU8uTUFYX0JVRl9TSVpFOwotCi0JcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOwotCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKLQotCXByb3RlY3RlZCBCeXRlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRoaXMoaW5wdXRTdHJlYW0sIERFRkFVTFRfQlVGRkVSX1NJWkUpOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBzaXplKSB7Ci0JCWZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZCdWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZklucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZJbnB1dFN0cmVhbS5tYXJrKHJlYWRBaGVhZExpbWl0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYjAgPSBmSW5wdXRTdHJlYW0ucmVhZCgpOwotCQlyZXR1cm4gKGIwICYgMHgwMEZGKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjaFtdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobGVuZ3RoID4gZkJ1ZmZlci5sZW5ndGgpIHsKLQkJCWxlbmd0aCA9IGZCdWZmZXIubGVuZ3RoOwotCQl9Ci0KLQkJaW50IGNvdW50ID0gZklucHV0U3RyZWFtLnJlYWQoZkJ1ZmZlciwgMCwgbGVuZ3RoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWludCBiMCA9IGZCdWZmZXJbaV07Ci0JCQkvLyB0aGUgMHgwMEZGIGlzIHRvICJsb3NlIiB0aGUgbmVnYXRpdmUgYml0cyBmaWxsZWQgaW4gdGhlIGJ5dGUgdG8KLQkJCS8vIGludCBjb252ZXJzaW9uCi0JCQkvLyAoYW5kIHdoaWNoIHdvdWxkIGJlIHRoZXJlIGlmIGNhc3QgZGlyZWN0bHkgZnJvbSBieXRlIHRvIGNoYXIpLgotCQkJY2hhciBjMCA9IChjaGFyKSAoYjAgJiAweDAwRkYpOwotCQkJY2hbb2Zmc2V0ICsgaV0gPSBjMDsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZJbnB1dFN0cmVhbS5yZXNldCgpOwotCX0KLQotCXB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZklucHV0U3RyZWFtLnNraXAobik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTU2ZTcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudERlc2NyaWJlckZvclhNTCBpbXBsZW1lbnRzIElUZXh0Q29udGVudERlc2NyaWJlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZVtdIFNVUFBPUlRFRF9PUFRJT05TID0ge0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFR9OwotCS8qKgotCSAqIDxjb2RlPnJlc3RyaWN0ZWRNb2RlPC9jb2RlPiBpcyB1c2VkIGp1c3QgZm9yIHRlc3RpbmcvZXhwZXJpbWVudHMuCi0JICogCi0JICogSWYgaW4gcmVzdHJpY3RlZE1vZGUsIG91ciAiY3VzdG9tIiBjb250ZW50VHlwZSBpcyBzZWVuIGFzIHZhbGlkIG9ubHkgaW4KLQkgKiBjYXNlcyB0aGF0IHRoZSBwbGF0Zm9ybSdzIHN0YW5kYXJkIG9uZSBkb2VzIG5vdCBjb3Zlci4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIHJlc3RyaWN0ZWRNb2RlID0gdHJ1ZTsKLQlwcml2YXRlIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQkJCXJldHVybiBuZXcgWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLklucHV0U3RyZWFtLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBmb3IgdGhpcyBzcGVjaWFsIGNhc2UsIGFsd2F5cyBhc3N1bWUgaW52YWxpZCwgdW5sZXNzCi0JCS8vIG91ciBzcGVjaWFsIGNpcmN1bXN0YW5jZXMgYXJlIG1ldC4KLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOVkFMSUQ7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCS8vIHB1cmVseSByZXF1ZXN0IGZvciB2YWxpZHR5Ci0JCQlyZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShyZXN1bHQsIGNvbnRlbnRzKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMocmVzdWx0LCBjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXIjZGVzY3JpYmUoamF2YS5pby5SZWFkZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uKQotCSAqLwotCXB1YmxpYyBpbnQgZGVzY3JpYmUoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBmb3IgdGhpcyBzcGVjaWFsIGNhc2UsIGFsd2F5cyBhc3N1bWUgaW52YWxpZCwgdW5sZXNzCi0JCS8vIG91ciBzcGVjaWFsIGNpcmN1bXN0YW5jZXMgYXJlIG1ldC4KLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOVkFMSUQ7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCS8vIHB1cmVseSByZXF1ZXN0IGZvciB2YWxpZHR5Ci0JCQlyZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShyZXN1bHQsIGNvbnRlbnRzKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMocmVzdWx0LCBjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlciNnZXRTdXBwb3J0ZWRPcHRpb25zKCkKLQkgKi8KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZVtdIGdldFN1cHBvcnRlZE9wdGlvbnMoKSB7Ci0KLQkJcmV0dXJuIFNVUFBPUlRFRF9PUFRJT05TOwotCX0KLQotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoaW50IHJlc3VsdCwgSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXR1cm5SZXN1bHQgPSByZXN1bHQ7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWNvbnRlbnRzLnJlc2V0KCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJcmV0dXJuUmVzdWx0ID0gaGFuZGxlQ2FsY3VsYXRpb25zKHJlc3VsdCwgZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuUmVzdWx0OwotCX0KLQotCXByaXZhdGUgaW50IGRldGVybWluZVZhbGlkaXR5KGludCByZXN1bHQsIElucHV0U3RyZWFtIGNvbnRlbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmV0dXJuUmVzdWx0ID0gcmVzdWx0OwotCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQljb250ZW50cy5yZXNldCgpOwotCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQlyZXR1cm5SZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShkZXRlY3RvciwgcmV0dXJuUmVzdWx0KTsKLQkJcmV0dXJuIHJldHVyblJlc3VsdDsKLQl9Ci0JcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lVmFsaWRpdHkoaW50IHJlc3VsdCwgUmVhZGVyIGNvbnRlbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmV0dXJuUmVzdWx0ID0gcmVzdWx0OwotCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQljb250ZW50cy5yZXNldCgpOwotCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQlyZXR1cm5SZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShkZXRlY3RvciwgcmV0dXJuUmVzdWx0KTsKLQkJcmV0dXJuIHJldHVyblJlc3VsdDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoaW50IHJlc3VsdCwgUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmV0dXJuUmVzdWx0ID0gcmVzdWx0OwotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJcmV0dXJuUmVzdWx0ID0gaGFuZGxlQ2FsY3VsYXRpb25zKHJlc3VsdCwgZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuUmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIE9iamVjdCBkZXRlY3RlZENoYXJzZXQsIE9iamVjdCBqYXZhQ2hhcnNldCkgewotCQkvLyBzaW5jZSBlcXVhbCwgd2UgZG9uJ3QgbmVlZCB0byBhZGQsIGJ1dCBpZiBvdXIgZGV0ZWN0ZWQgdmVyc2lvbiBpcwotCQkvLyBkaWZmZXJlbnQgdGhhbgotCQkvLyBqYXZhQ2hhcnNldCwgdGhlbiB3ZSBzaG91bGQgYWRkIGl0LiBUaGlzIHdpbGwgaGFwcGVuLCBmb3IgZXhhbXBsZSwKLQkJLy8gaWYgdGhlcmUncwotCQkvLyBkaWZmZXJlbmNlcyBpbiBjYXNlLCBvciBkaWZmZXJlbmNlcyBkdWUgdG8gb3ZlcnJpZGUgcHJvcGVydGllcwotCQlpZiAoZGV0ZWN0ZWRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCS8vIGlmICghZGV0ZWN0ZWRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCS8vIGRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULAotCQkJLy8gZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJCS8vIH0KLQotCQkJLy8gT25jZSB3ZSBkZXRlY3RlZCBhIGNoYXJzZXQsIHdlIHNob3VsZCBzZXQgdGhlIHByb3BlcnR5IGV2ZW4KLQkJCS8vIHRob3VnaCBpdCdzIHRoZSBzYW1lIGFzIGphdmFDaGFyc2V0Ci0JCQkvLyBiZWNhdXNlIHRoZXJlIGFyZSBjbGllbnRzIHRoYXQgcmVseSBvbiB0aGlzIHByb3BlcnR5IHRvCi0JCQkvLyBkZXRlcm1pbmUgaWYgdGhlIGNoYXJzZXQgaXMgYWN0dWFsbHkgZGV0ZWN0ZWQgaW4gZmlsZSBvciBub3QuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNSZWxldmVudChJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIGludCBoYW5kbGVDYWxjdWxhdGlvbnMoaW50IHJlc3VsdCwgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmV0dXJuUmVzdWx0ID0gcmVzdWx0OwotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gKChYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpIGRldGVjdG9yKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCS8vIFRPRE86IEkgbmVlZCB0byB2ZXJpZnkgdG8gc2VlIGlmIHRoaXMgQk9NIHdvcmsgaXMgYWx3YXlzIGRvbmUKLQkJCS8vIGJ5IHRleHQgdHlwZS4KLQkJCU9iamVjdCBkZXRlY3RlZEJ5dGVPcmRlck1hcmsgPSBlbmNvZGluZ01lbWVudG8uZ2V0VW5pY29kZUJPTSgpOwotCQkJaWYgKGRldGVjdGVkQnl0ZU9yZGVyTWFyayAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IGV4aXN0aW5nQnl0ZU9yZGVyTWFyayA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKTsKLQkJCQkvLyBub3Qgc3VyZSB3aHkgd291bGQgZXZlciBiZSBkaWZmZXJlbnQsIHNvIGlmIGlzIGRpZmZlcmVudCwKLQkJCQkvLyBtYXkKLQkJCQkvLyBuZWVkIHRvICJwdXNoIiB1cCBpbnRvIGJhc2UuCi0JCQkJaWYgKCFkZXRlY3RlZEJ5dGVPcmRlck1hcmsuZXF1YWxzKGV4aXN0aW5nQnl0ZU9yZGVyTWFyaykpCi0JCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBkZXRlY3RlZEJ5dGVPcmRlck1hcmspOwotCQkJfQotCi0KLQkJCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSkgewotCQkJCS8vIG5vdGU6IGFmdGVyIHNldHRpbmcgaGVyZSwgaXRzIHRoZSBtZXJlIHByZXNlbmNlIG9mCi0JCQkJLy8gSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQKLQkJCQkvLyBpbiB0aGUgcmVzb3VyY2UncyBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZQotCQkJCS8vIGlmIGludmFsaWQgaW4gdGhvc2UgY2FzZXMsIHRoZSAiZGV0ZWN0ZWQiIHByb3BlcnR5IGNvbnRhaW5zCi0JCQkJLy8gYW4gImFwcHJvcHJpYXRlIGRlZmF1bHQiIHRvIHVzZS4KLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgZW5jb2RpbmdNZW1lbnRvLmdldEludmFsaWRFbmNvZGluZygpKTsKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgZW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpKTsKLQkJCX0KLQotCQkJT2JqZWN0IGRldGVjdGVkQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCQlPYmplY3QgamF2YUNoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0KLQkJCS8vIHdlIGFsd2F5cyBpbmNsdWRlIGRldGVjdGVkLCBpZiBpdHMgZGlmZmVyZW50IHRoYW4gamF2YQotCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0KLQkJCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IGV4aXN0aW5nQ2hhcnNldCA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCk7Ci0JCQkJaWYgKGphdmFDaGFyc2V0LmVxdWFscyhleGlzdGluZ0NoYXJzZXQpKSB7Ci0JCQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gd2UgbWF5IG5lZWQgdG8gYWRkIHdoYXQgd2UgZm91bmQsIGJ1dCBvbmx5IG5lZWQgdG8gYWRkCi0JCQkJCS8vIGlmIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0Ci0JCQkJCU9iamVjdCBkZWZhdWx0Q2hhcnNldCA9IGRldGVjdG9yLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQkJaWYgKGRlZmF1bHRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQkJCWlmICghZGVmYXVsdENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gYXNzdW1pbmcgaWYgdGhlcmUgaXMgbm8gc3BlYyBkZWZhdWx0LCB3ZSBhbHdheXMKLQkJCQkJCS8vIG5lZWQgdG8gYWRkLgotCQkJCQkJLy8gVE9ETzogdGhpcyBpcyBwcm9iYWJseSBhIGRlYWQgYnJhbmNoIGluIGN1cnJlbnQKLQkJCQkJCS8vIGNvZGUsIHNob3VsZCByZS1leGFtaW5lIGZvciByZW1vdmFsLgotCQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm5SZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShkZXRlY3RvciwgcmV0dXJuUmVzdWx0KTsKLQkJcmV0dXJuIHJldHVyblJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGludCBkZXRlcm1pbmVWYWxpZGl0eShJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IsIGludCByZXR1cm5SZXN1bHQpIHsKLQkJLy8gd2UgYWx3YXlzIGV4cGVjdCBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IsIGJ1dCBqdXN0IHRvIG1ha2Ugc2FmZQotCQkvLyBjYXN0LgotCQlpZiAoZGV0ZWN0b3IgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpIHsKLQkJCVhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciB4bWxSZXNvdXJjZURldGVjdG9yID0gKFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3I7Ci0JCQlpZiAoeG1sUmVzb3VyY2VEZXRlY3Rvci5pc0RlY2xEZXRlY3RlZCgpKSB7Ci0JCQkJaWYgKHJlc3RyaWN0ZWRNb2RlKSB7Ci0JCQkJCS8vIGlmIHRoZXJlIGlzIG5vIGluaXRpYWwgd2hpdGVzcGFjZSwgdGhlbiBwbGF0Zm9ybSdzCi0JCQkJCS8vIGRlZmF1bHQgb25lIHdpbGwgZG8uCi0JCQkJCWlmICh4bWxSZXNvdXJjZURldGVjdG9yLmhhc0luaXRpYWxXaGl0ZVNwYWNlKCkpIHsKLQkJCQkJCXJldHVyblJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm5SZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5WQUxJRDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldHVyblJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1NDJhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nUGFyc2VyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRW5jb2RpbmdQYXJzZXJDb25zdGFudHMgewotCi0JZmluYWwgU3RyaW5nIEVPRiA9ICJFT0YiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIEludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWUgPSAiSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSA9ICJJbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBNQVhfQ0hBUlNfUkVBQ0hFRCA9ICJNQVhfQ0hBUlNfUkVBQ0hFRCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgU3RyaW5nVmFsdWUgPSAic3RydmFsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBVbkRlbGltaXRlZFN0cmluZ1ZhbHVlID0gIlVuRGVsaW1pdGVkU3RyaW5nVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIFN0cmluZyBVVEYxNkJFID0gIlVURjE2QkUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIFN0cmluZyBVVEYxNkxFID0gIlVURjE2TEUiOyAvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgVVRGODNCeXRlQk9NID0gIlVURjgzQnl0ZUJPTSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTRiOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1wdWJsaWMgY2xhc3MgSGVhZFBhcnNlclRva2VuIHsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQlwcml2YXRlIFN0cmluZyBmVHlwZTsKLQotCXByb3RlY3RlZCBIZWFkUGFyc2VyVG9rZW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEhlYWRQYXJzZXJUb2tlbihTdHJpbmcgdHlwZSwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQl0aGlzKCk7Ci0JCWZUeXBlID0gdHlwZTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0ID0gdGV4dDsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGZUZXh0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAoInRleHQ6ICIgKyBmVGV4dCArICIgb2Zmc2V0OiAiICsgZlN0YXJ0ICsgIiB0eXBlOiAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkYmFlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLS8qCi0gKiAKLSAqIEEgbm9uLXJlc2l6YWJsZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIGJlaGF2aW9yIG9mIGphdmEudXRpbC5TdGFjaywgYnV0Ci0gKiBkaXJlY3RseSBmb3IgdGhlIDxjb2RlPiBpbnRlZ2VyIDwvY29kZT4gcHJpbWl0aXZlLgotICovCi1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnRTdGFjayB7Ci0JcHJpdmF0ZSBpbnRbXSBsaXN0ID0gbnVsbDsKLQotCXByaXZhdGUgaW50IHNpemUgPSAwOwotCi0JcHVibGljIEludFN0YWNrKCkgewotCQl0aGlzKDEwMCk7Ci0JfQotCi0JcHVibGljIEludFN0YWNrKGludCBtYXhkZXB0aCkgewotCQlzdXBlcigpOwotCQlsaXN0ID0gbmV3IGludFttYXhkZXB0aF07Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0KGludCBzbG90KSB7Ci0JCXJldHVybiBsaXN0W3Nsb3RdOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0JCQlsaXN0W2ldID0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBlZWsoKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gbGlzdFtzaXplIC0gMV07Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwb3AoKSB7Ci0JCWludCB2YWx1ZSA9IHBlZWsoKTsKLQkJbGlzdFtzaXplIC0gMV0gPSAtMTsKLQkJc2l6ZS0tOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlIC0KLQkgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gYmUgcHVzaGVkIG9udG8gdGhpcyBzdGFjay4KLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5uZXdWYWx1ZTwvY29kZT4gYXJndW1lbnQuCi0JICovCi0JcHVibGljIGludCBwdXNoKGludCBuZXdWYWx1ZSkgewotCQlpZiAoc2l6ZSA9PSBsaXN0Lmxlbmd0aCkgewotCQkJdGhyb3cgbmV3IFN0YWNrT3ZlcmZsb3dFcnJvcigpOwotCQl9Ci0JCWxpc3Rbc2l6ZSsrXSA9IG5ld1ZhbHVlOwotCQlyZXR1cm4gbmV3VmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjoiICtzaXplICsgIiBbIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlzLmFwcGVuZChsaXN0W2ldKTsKLQkJCWlmKGkgPCBzaXplIC0gMSkgewotCQkJCXMuYXBwZW5kKCIsICIpOwotCQkJfQotCQl9Ci0JCXMuYXBwZW5kKCJdIik7Ci0JCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2Y3NDYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGFuIEVuY29kaW5nTWVtZW50byAoaXRzIHN1cGVyIGNsYXNzKSwKLSAqIHdoZW4gdGhlcmUgaXMgbm90IGluIGZhY3QgQU5ZIGVuY29kaW5nIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZSwgd2hlbiBhCi0gKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgY3JlYXRlZCBkaXJlY3RseSBmcm9tIGEgU3RyaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsTWVtZW50byBleHRlbmRzIEVuY29kaW5nTWVtZW50byB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBOdWxsTWVtZW50bygpIHsKLQkJc3VwZXIoKTsKLQkJU3RyaW5nIGRlZmF1bHRDaGFyc2V0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKG51bGwpOwotCQlzZXRKYXZhQ2hhcnNldE5hbWUoZGVmYXVsdENoYXJzZXQpOwotCQlzZXRBcHByb3ByaWF0ZURlZmF1bHQoZGVmYXVsdENoYXJzZXQpOwotCQlzZXREZXRlY3RlZENoYXJzZXROYW1lKG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxEZWNsRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MRGVjbERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYzM1NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxEZWNsRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTcwMDYgLSBTdHJpbmcgQ29tcGFyaXNvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgWE1MRGVjbERldGVjdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVRl9TSVpFID0gMTAyNCAqIDg7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9NQVJLX1NJWkUgPSAxMDI0ICogODsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCXByaXZhdGUgYm9vbGVhbiBmSXNYTUw7Ci0JcHJvdGVjdGVkIFJlYWRlciBmUmVhZGVyOwotCS8vcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJpdmF0ZSBYTUxIZWFkVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSBmYWxzZTsKLQkJaWYgKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTS5lcXVhbHModG9rZW5UeXBlKSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCS8vZlVuaWNvZGUgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRS5lcXVhbHModG9rZW5UeXBlKSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCS8vZlVuaWNvZGUgPSAiVVRGLTE2QkUiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRS5lcXVhbHModG9rZW5UeXBlKSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCS8vZlVuaWNvZGUgPSAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW07Ci0JfQotCi0JZmluYWwgcHJpdmF0ZSB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vcHJpdmF0ZSBTdHJpbmcgZlVuaWNvZGU7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRva2VuaXplci4KLQkgKi8KLQlwcml2YXRlIFhNTEhlYWRUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IFhNTEhlYWRUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzWE1MLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWE1MKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCX0KLQkJcmV0dXJuIGZJc1hNTDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVhNTEhlYWRUb2tlbml6ZXIgdG9rZW5pemVyID0gZ2V0VG9rZW5pemVyKCk7Ci0JCXRva2VuaXplci5yZXNldChmUmVhZGVyKTsKLQkJSGVhZFBhcnNlclRva2VuIHRva2VuID0gbnVsbDsKLQkJU3RyaW5nIHRva2VuVHlwZSA9IG51bGw7Ci0JCWRvIHsKLQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJZlJlYWRlci5yZXNldCgpOwotCQkJCS8vIHRoaXMgaXMgKG9idmlvdXNseSkgbm90IGFsd2F5cyB0cnVlLgotCQkJCS8vIFRPRE86IG5lZWQgdG8gZml4IHNvIHdlICJyZW1lbWJlciIgb3JpZ2luYWwgaUZpbGUgb3IKLQkJCQkvLyBpbnB1dHN0cmVhbSwgYW5kCi0JCQkJLy8gY3JlYXRlIGFwcHJvcHJpYXRlIElucHV0U3RyZWFtUmVhZGVyLgotCQkJCS8vIEknbSBub3Qgc3VyZSB3aGF0IHRvIGRvIGZvciB0aGUgc2V0KHJlYWRlcikgY2FzZSAuLi4gaWYgaXRzCi0JCQkJLy8gZXZlbiByZWxldmVudC4KLQkJCQkvLyBwbHVzLCBlbnN1cmUgYWdhaW5zdCBpbmZpbml0ZSBsb29wcyEKLQkJCQlmSXNYTUwgPSB0cnVlOwotCQkJCS8vZlJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmUmVhZGVyLCBmVW5pY29kZSk7Ci0JCQkJLy8gcGFyc2VJbnB1dCgpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZy5lcXVhbHModG9rZW5UeXBlKSkgewotCQkJCQlmSXNYTUwgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7Ci0JCWZSZWFkZXIgPSBudWxsOwotCQlmSGVhZGVyUGFyc2VkID0gZmFsc2U7Ci0JCWZJc1hNTCA9IGZhbHNlOwotCQkvL2ZVbmljb2RlID0gbnVsbDsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJRmlsZSBpRmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXNldEFsbCgpOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGlGaWxlLmdldENvbnRlbnRzKHRydWUpOwotCQlJbnB1dFN0cmVhbSByZXNldHRhYmxlU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIE1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhNQVhfTUFSS19TSVpFKTsKLQkJc2V0KHJlc2V0dGFibGVTdHJlYW0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKE1BWF9NQVJLX1NJWkUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSBrbm93IEJ5dGVSZWFkZXIgc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90ZTogdGhpcyBpcyBub3QgcGFydCBvZiBpbnRlcmZhY2UgdG8gaGVscCBhdm9pZCBjb25mdXNpb24gLi4uIGl0Ci0JICogZXhwZWN0ZWQgdGhpcyBSZWFkZXIgaXMgYSB3ZWxsIGZvcm1lZCBjaGFyYWN0ZXIgcmVhZGVyIC4uLiB0aGF0IGlzLCBpdHMKLQkgKiBhbGwgcmVhZHkgYmVlbiBkZXRlcm1pbmVkIHRvIG5vdCBiZSBhIHVuaWNvZGUgbWFya2VkIGlucHV0IHN0cmVhbS4gQW5kLAotCSAqIGl0cyBhc3N1bWVkIHRvIGJlIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uLCBhdCBwb3NpdGlvbiB6ZXJvLCByZWFkeSB0bwotCSAqIHJlYWQgZmlyc3QgY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSByZWFkZXI7Ci0JCWlmICghZlJlYWRlci5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCWZSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZlJlYWRlcik7Ci0JCX0KLQotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKE1BWF9NQVJLX1NJWkUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NibGUsIHNpbmNlIHdlIGp1c3QgY2hlY2tlZCBpZiBtYXJrYWJsZQotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxIZWFkVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZmI0MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxIZWFkVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUxICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuNC4yIG9uIDcvMjgvMDggOToyOSBBTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXg8L2E+IDEuNC4yCi0gKiBvbiA3LzI4LzA4IDk6MjkgQU0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+RDovd29ya3NwYWNlcy93dHAzMDEvd29ya3NwYWNlL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyLmpGbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIFhNTEhlYWRUb2tlbml6ZXIgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSA4MTkyOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUlOSVRJQUwgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEUV9TVFJJTkcgPSA2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUV9TVFJJTkcgPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9YTUxEZWNsID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA0OwotCi0gIC8qKgotICAgKiBaWl9MRVhTVEFURVtsXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiBaWl9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICogbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9MRVhTVEFURVtdID0geyAKLSAgICAgMCwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsIDYKLSAgfTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0NNQVBfUEFDS0VEID0gCi0gICAgIlwxXDExXDEwXDBcMVw2XDFcMTBcMlwwXDFcN1wyMlwwXDFcNlwxXDBcMVwzMyIrCi0gICAgIlwyXDBcMVwzNVwxXDBcMVwzNFwyNFwwXDFcMTNcMVwxMlwxXDMyXDFcMTRcM1wwIisKLSAgICAiXDFcMjdcMVwzMFwxXDIxXDFcMFwxXDMxXDFcMFwxXDI0XDJcMFwxXDE3XDFcMTYiKwotICAgICJcMVwyNlwxXDI1XDJcMFwxXDIyXDFcMjNcMlwwXDFcMjBcMVwwXDFcMTVcMTJcMCIrCi0gICAgIlwxXDI3XDFcMzBcMVwyMVwxXDBcMVwzMVwxXDBcMVwyNFwyXDBcMVwxN1wxXDE2IisKLSAgICAiXDFcMjZcMVwyNVwyXDBcMVwyMlwxXDIzXDJcMFwxXDIwXDFcMFwxXDE1XDEwMlwwIisKLSAgICAiXDFcNFwzXDBcMVw1XDE3XDBcMVwzXDE2XDBcMVwxXDIwXDBcMVwzXDE2XDAiKwotICAgICJcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgW10gWlpfQ01BUCA9IHp6VW5wYWNrQ01hcChaWl9DTUFQX1BBQ0tFRCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIERGQSBzdGF0ZXMgdG8gYWN0aW9uIHN3aXRjaCBsYWJlbHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQUNUSU9OID0genpVbnBhY2tBY3Rpb24oKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQUNUSU9OX1BBQ0tFRF8wID0KLSAgICAiXDdcMFwxM1wxXDJcMlwxXDFcMVwyXDFcM1wxXDRcMVw1IisKLSAgICAiXDFcNlwxXDFcMVw1XDFcN1wxXDFcMVw1XDFcMTBcMVwxIisKLSAgICAiXDFcMTFcMVwxMlwxXDEzXDEyXDBcMVwxNFw1XDBcMVwyXDFcMyIrCi0gICAgIlwxXDRcMVw2XDJcMFwxXDE1XDFcN1wyXDBcMVwxMFwxXDExIisKLSAgICAiXDFcMTZcM1wwXDFcMTRcNFwwXDFcMlwxXDE1XDE0XDBcMVwxNyIrCi0gICAgIlw1XDBcMVwxN1w2XDBcMVwyMFwzXDBcMVwyMFwyXDBcMVwyMSIrCi0gICAgIlwxXDBcMVwyMVwxXDAiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0FjdGlvbigpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFsxMTFdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQWN0aW9uKFpaX0FDVElPTl9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBY3Rpb24oU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1VOS05PV05fRVJST1IgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTk9fTUFUQ0ggPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfUFVTSEJBQ0tfMkJJRyA9IDI7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgenpSZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB6ekJ1ZmZlcltdID0gbmV3IGNoYXJbWlpfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TWFya2VkUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpDdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB6ekVuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotLy8gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0vLyAgcHJpdmF0ZSBpbnQgeXljb2x1bW47Ci0KLSAgLyoqIAotICAgKiB6ekF0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRCT0wgPSB0cnVlOwotCi0gIC8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4genpFT0ZEb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0KLQotCXB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotICAgICAgICAgICAgICAgIC8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgICAgICAgICAgICAgICB6elJlYWRlciA9IGluOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAgICAgICAgICAgICAgIHp6U3RhdGUgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gICAgICAgICAgICAgICAgLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgICAgICAgICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoenpCdWZmZXIsIChjaGFyKTApOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICB6ek1hcmtlZFBvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotLy8gICAgICAgICAgICAgICAgenpQdXNoYmFja1BvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6ekN1cnJlbnRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgenpTdGFydFJlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICAgICAgICAgICAgICogZnJvbSBpbnB1dAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6RW5kUmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vICAgICAgICAgICAgICAgIHl5bGluZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICB5eWNoYXIgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgICAgICAgICAgICAgICAgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gICAgICAgICAgICAgICAgICovCi0vLyAgICAgICAgICAgICAgICB5eWNvbHVtbiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZwotICAgICAgICAgICAgICAgICAqIG9mIGEgbGluZQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6QXRCT0wgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAgICAgICAgICAgICAgIHp6QXRFT0YgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIC8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAgICAgICAgICAgICAgIHp6RU9GRG9uZSA9IGZhbHNlOwotCi0KLSAgICAgICAgICAgICAgICBmU3RhdGVTdGFjay5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0gIAl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLQl9CQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMuenpSZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB6elVucGFja0NNYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTUwKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZWZpbGxzIHRoZSBpbnB1dCBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGlmZiB0aGVyZSB3YXMgbmV3IGlucHV0LgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpSZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh6elN0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIHp6U3RhcnRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpFbmRSZWFkLXp6U3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHp6RW5kUmVhZC09IHp6U3RhcnRSZWFkOwotICAgICAgenpDdXJyZW50UG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ek1hcmtlZFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpTdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoenpDdXJyZW50UG9zID49IHp6QnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbenpDdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB6ekJ1ZmZlci5sZW5ndGgpOwotICAgICAgenpCdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB6elJlYWRlci5yZWFkKHp6QnVmZmVyLCB6ekVuZFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLmxlbmd0aC16ekVuZFJlYWQpOwotCi0gICAgaWYgKG51bVJlYWQgPiAwKSB7Ci0gICAgICB6ekVuZFJlYWQrPSBudW1SZWFkOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyB1bmxpa2VseSBidXQgbm90IGltcG9zc2libGU6IHJlYWQgMCBjaGFyYWN0ZXJzLCBidXQgbm90IGF0IGVuZCBvZiBzdHJlYW0gICAgCi0gICAgaWYgKG51bVJlYWQgPT0gMCkgewotICAgICAgaW50IGMgPSB6elJlYWRlci5yZWFkKCk7Ci0gICAgICBpZiAoYyA9PSAtMSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHp6QnVmZmVyW3p6RW5kUmVhZCsrXSA9IChjaGFyKSBjOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9ICAgICAKLSAgICB9Ci0KLQkvLyBudW1SZWFkIDwgMAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB6ekF0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQotICAgIGlmICh6elJlYWRlciAhPSBudWxsKQotICAgICAgenpSZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKiBEb2VzIG5vdCBjbG9zZSB0aGUgb2xkIHJlYWRlci4KLSAgICoKLSAgICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIAotICAgKiA8Yj5jYW5ub3Q8L2I+IGJlIHJldXNlZCAoaW50ZXJuYWwgYnVmZmVyIGlzIGRpc2NhcmRlZCBhbmQgbG9zdCkuCi0gICAqIExleGljYWwgc3RhdGUgaXMgc2V0IHRvIDx0dD5aWl9JTklUSUFMPC90dD4uCi0gICAqCi0gICAqIEBwYXJhbSByZWFkZXIgICB0aGUgbmV3IGlucHV0IHN0cmVhbSAKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0gICAgenpSZWFkZXIgPSByZWFkZXI7Ci0gICAgenpBdEJPTCAgPSB0cnVlOwotICAgIHp6QXRFT0YgID0gZmFsc2U7Ci0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQgPSAwOwotICAgIHp6Q3VycmVudFBvcyA9IHp6TWFya2VkUG9zID0gMDsKLSAgICB5eWNoYXIgPSAwOwotICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB6ekxleGljYWxTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBwdWJsaWMgZmluYWwgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggenpCdWZmZXIsIHp6U3RhcnRSZWFkLCB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZCApOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDx0dD5wb3M8L3R0PiBmcm9tIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0LiAKLSAgICogCi0gICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLSAgICoKLSAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gCi0gICAqICAgICAgICAgICAgQSB2YWx1ZSBmcm9tIDAgdG8geXlsZW5ndGgoKS0xLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0gICAqLwotICBwdWJsaWMgZmluYWwgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0gICAgcmV0dXJuIHp6QnVmZmVyW3p6U3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBJbiBhIHdlbGxmb3JtZWQgc2Nhbm5lciAobm8gb3Igb25seSBjb3JyZWN0IHVzYWdlIG9mIAotICAgKiB5eXB1c2hiYWNrKGludCkgYW5kIGEgbWF0Y2gtYWxsIGZhbGxiYWNrIHJ1bGUpIHRoaXMgbWV0aG9kIAotICAgKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggdGhpbmdzIHRoYXQgIkNhbid0IFBvc3NpYmx5IEhhcHBlbiIuCi0gICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZwotICAgKiAoZS5nLiBhIEpGbGV4IGJ1ZyBwcm9kdWNpbmcgYSBmYXVsdHkgc2Nhbm5lciBldGMuKS4KLSAgICoKLSAgICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICogaW4gZXJyb3IgZmFsbGJhY2sgcnVsZXMuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgenpTY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1taWl9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHVibGljIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSAgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB6elNjYW5FcnJvcihaWl9QVVNIQkFDS18yQklHKTsKLQotICAgIHp6TWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgenpEb0VPRigpIHsKLSAgICBpZiAoIXp6RU9GRG9uZSkgewotICAgICAgenpFT0ZEb25lID0gdHJ1ZTsKLSAgICAJaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB6eklucHV0OwotICAgIGludCB6ekFjdGlvbjsKLQotICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgaW50IHp6Q3VycmVudFBvc0w7Ci0gICAgaW50IHp6TWFya2VkUG9zTDsKLSAgICBpbnQgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICBjaGFyIFtdIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgIGNoYXIgW10genpDTWFwTCA9IFpaX0NNQVA7Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgeXljaGFyKz0genpNYXJrZWRQb3NMLXp6U3RhcnRSZWFkOwotCi0gICAgICBpZiAoenpNYXJrZWRQb3NMID4genpTdGFydFJlYWQpIHsKLSAgICAgICAgc3dpdGNoICh6ekJ1ZmZlckxbenpNYXJrZWRQb3NMLTFdKSB7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgY2FzZSAnXHUwMDBCJzoKLSAgICAgICAgY2FzZSAnXHUwMDBDJzoKLSAgICAgICAgY2FzZSAnXHUwMDg1JzoKLSAgICAgICAgY2FzZSAnXHUyMDI4JzoKLSAgICAgICAgY2FzZSAnXHUyMDI5JzoKLSAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOiAKLSAgICAgICAgICBpZiAoenpNYXJrZWRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6QXRCT0wgPSB6ekJ1ZmZlckxbenpNYXJrZWRQb3NMXSAhPSAnXG4nOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpCi0gICAgICAgICAgICB6ekF0Qk9MID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgICAgICAgICB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIGlmIChlb2YpIAotICAgICAgICAgICAgICB6ekF0Qk9MID0gZmFsc2U7Ci0gICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICB6ekF0Qk9MID0genpCdWZmZXJMW3p6TWFya2VkUG9zTF0gIT0gJ1xuJzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgenpBdEJPTCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB6ekFjdGlvbiA9IC0xOwotCi0gICAgICB6ekN1cnJlbnRQb3NMID0genpDdXJyZW50UG9zID0genpTdGFydFJlYWQgPSB6ek1hcmtlZFBvc0w7Ci0gIAotICAgICAgaWYgKHp6QXRCT0wpCi0gICAgICAgIHp6U3RhdGUgPSBaWl9MRVhTVEFURVt6ekxleGljYWxTdGF0ZSsxXTsKLSAgICAgIGVsc2UKLSAgICAgICAgenpTdGF0ZSA9IFpaX0xFWFNUQVRFW3p6TGV4aWNhbFN0YXRlXTsKLQotCi0gICAgICB6ekZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIGlmICh6ekN1cnJlbnRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICBlbHNlIGlmICh6ekF0RU9GKSB7Ci0gICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLSAgICAgICAgICAgIHp6Q3VycmVudFBvcyAgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgenpNYXJrZWRQb3MgICA9IHp6TWFya2VkUG9zTDsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgenpDdXJyZW50UG9zTCAgPSB6ekN1cnJlbnRQb3M7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgICA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpCdWZmZXJMICAgICAgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgICAgID0genpFbmRSZWFkOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgenpJbnB1dCA9IHp6Q01hcExbenpJbnB1dF07Ci0KLSAgICAgICAgICBib29sZWFuIHp6SXNGaW5hbCA9IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4genpOb0xvb2tBaGVhZCA9IGZhbHNlOwotCi0gICAgICAgICAgenpGb3JOZXh0OiB7IHN3aXRjaCAoenpTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAxODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDogenpTdGF0ZSA9IDM2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDM3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6elN0YXRlID0gMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMzc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6elN0YXRlID0gMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHp6U3RhdGUgPSA0MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSA0NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQ1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gNDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSA1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDU2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDU6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6elN0YXRlID0gMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMzc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6elN0YXRlID0gMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA2NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDQxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDQxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNjY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gNjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQ3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDQ4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gNDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSA3MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSA1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDcxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDUyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAxODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSA1MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDczOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAxODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDU3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDU4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDU4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDc0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMzc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6elN0YXRlID0gMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gNjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA3NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSA3NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSA3MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDc3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDc4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB6elN0YXRlID0gODA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDczOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gNzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA4MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6U3RhdGUgPSA4MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSA3ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDgzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDg0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDgwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gODU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gODY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA4ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA4NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDg5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDkwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDg2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gOTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gOTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gOTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA5NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSA5MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDk1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDk2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDkyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gOTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gOTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA5NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA4NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSA5NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA5OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gOTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6elN0YXRlID0gMTAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDk2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDEwMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTA0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTA1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHp6U3RhdGUgPSAxMDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDEwNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDk2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMTAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDEwODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTA5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAxMDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTA5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBldmVyIHJlYWNoZWQsIHRoZXJlIGlzIGEgc2VyaW91cyBidWcgaW4gSkZsZXgKLSAgICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gfQotCi0gICAgICAgICAgaWYgKCB6eklzRmluYWwgKSB7Ci0gICAgICAgICAgICB6ekFjdGlvbiA9IHp6U3RhdGU7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgaWYgKCB6ek5vTG9va0FoZWFkICkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb24KLSAgICAgIHp6TWFya2VkUG9zID0genpNYXJrZWRQb3NMOwotCi0gICAgICBzd2l0Y2ggKHp6QWN0aW9uIDwgMCA/IHp6QWN0aW9uIDogWlpfQUNUSU9OW3p6QWN0aW9uXSkgewotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDE5OiBicmVhazsKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjE6IGJyZWFrOwotICAgICAgICBjYXNlIDc6IAotICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjI6IGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFO30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjM6IGJyZWFrOwotICAgICAgICBjYXNlIDE6IAotICAgICAgICAgIHsgaWYoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjU6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICAgIHsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjY6IGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDQ6IAotICAgICAgICAgIHsgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogCi0gICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI5OiBicmVhazsKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMxOiBicmVhazsKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzI6IGJyZWFrOwotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzM6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xWZXJzaW9uOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzNDogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh6eklucHV0ID09IFlZRU9GICYmIHp6U3RhcnRSZWFkID09IHp6Q3VycmVudFBvcykgewotICAgICAgICAgICAgenpBdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB6ekRvRU9GKCk7Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2YyM2Y4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotcHVibGljIGludGVyZmFjZSBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzIGV4dGVuZHMgRW5jb2RpbmdQYXJzZXJDb25zdGFudHMgewotCi0JZmluYWwgU3RyaW5nIFhNTERlY2xFbmQgPSAiWE1MRGVjbEVuZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgWE1MRGVjbFN0YXJ0ID0gIlhNTERlY2xTdGFydCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgWE1MRGVsRW5jb2RpbmcgPSAiWE1MRGVsRW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFhNTERlY2xWZXJzaW9uID0gIlhNTERlY2xWZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTA3OWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTcwMDYgLSBTdHJpbmcgQ29tcGFyaXNvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi1wdWJsaWMgY2xhc3MgWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCXByaXZhdGUgWE1MSGVhZFRva2VuaXplciBmVG9rZW5pemVyOwotCXByaXZhdGUgYm9vbGVhbiBmRGVjbERldGVjdGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbml0aWFsV2hpdGVTcGFjZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbShTdHJpbmcgdG9rZW5UeXBlKSB7Ci0JCWJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gZmFsc2U7Ci0JCWlmIChFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00uZXF1YWxzKHRva2VuVHlwZSkpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUuZXF1YWxzKHRva2VuVHlwZSkgfHwgRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRS5lcXVhbHModG9rZW5UeXBlKSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQkJYnl0ZVtdIGJvbSA9IChFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFLmVxdWFscyh0b2tlblR5cGUpKSA/IElDb250ZW50RGVzY3JpcHRpb24uQk9NX1VURl8xNkJFIDogSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzE2TEU7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldFVuaWNvZGVTdHJlYW0odHJ1ZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldFVuaWNvZGVCT00oYm9tKTsKLQkJfQotCQlyZXR1cm4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJLy8gYnkgZGVmYXVsdCwgVVRGLTggYXMgcGVyIFhNTCBzcGVjCi0JCWZpbmFsIFN0cmluZyBlbmMgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlbmM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0b2tlbml6ZXIuCi0JICovCi0JcHJpdmF0ZSBYTUxIZWFkVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJLy8gVE9ETzogbmVlZCB0byB3b3JrIG9uICdyZXNldCcgaW4gdG9rZW5pemVyLCBzbyBuZXcgaW5zdGFuY2UgaXNuJ3QKLQkJLy8gYWx3YXlzIG5lZWRlZAotCQkvLyBpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCWZUb2tlbml6ZXIgPSBuZXcgWE1MSGVhZFRva2VuaXplcigpOwotCQkvLyB9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xlZ2FsU3RyaW5nKFN0cmluZyB2YWx1ZVRva2VuVHlwZSkgewotCQlpZiAodmFsdWVUb2tlblR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZQotCQkJcmV0dXJuIHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVhNTEhlYWRUb2tlbml6ZXIgdG9rZW5pemVyID0gZ2V0VG9rZW5pemVyKCk7Ci0JCXRva2VuaXplci5yZXNldChmUmVhZGVyKTsKLQkJSGVhZFBhcnNlclRva2VuIHRva2VuID0gbnVsbDsKLQkJU3RyaW5nIHRva2VuVHlwZSA9IG51bGw7Ci0JCWRvIHsKLQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCi0JCQkvLyBoYW5kbGUgeG1sIGNvbnRlbnQgdHlwZSBkZXRlY3Rpb24KLQkJCWlmICh0b2tlblR5cGUgPT0gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQpIHsKLQkJCQlmRGVjbERldGVjdGVkID0gdHJ1ZTsKLQkJCQlTdHJpbmcgZGVjbFRleHQgPSB0b2tlbi5nZXRUZXh0KCk7Ci0JCQkJaWYgKGRlY2xUZXh0LnN0YXJ0c1dpdGgoIjw/IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlmSW5pdGlhbFdoaXRlU3BhY2UgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZJbml0aWFsV2hpdGVTcGFjZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBoYW5kbGUgZW5jb2RpbmcgZGV0ZWN0aW9uCi0JCQlpZiAoY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKHRva2VuVHlwZSkpIHsKLQkJCQkvLyBzaWRlIGVmZmVjdCBvZiBjYW5IYW5kbGUgaXMgdG8gY3JlYXRlIGFwcHJvcHJpYXRlIG1lbWVudG8KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICh0b2tlblR5cGUgPT0gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZykgewotCQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJdG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQkJCQl0b2tlblR5cGUgPSB0b2tlbi5nZXRUeXBlKCk7Ci0JCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh0b2tlblR5cGUpKSB7Ci0JCQkJCQkJU3RyaW5nIGVuYyA9IHRva2VuLmdldFRleHQoKTsKLQkJCQkJCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uRk9VTkRfRU5DT0RJTkdfSU5fQ09OVEVOVCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVjbERldGVjdGVkKCkgewotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXRyeSB7Ci0JCQkJcGFyc2VJbnB1dCgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlmRGVjbERldGVjdGVkID0gZmFsc2U7Ci0JCQl9Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbgotCQkJLy8gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nCi0JCQkvLyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJfQotCQkvLyBmRGVjbERldGVjdGVkIGlzIHNldCBhcyBwYXJ0IG9mIHBhcnNpbmcuCi0JCXJldHVybiBmRGVjbERldGVjdGVkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0luaXRpYWxXaGl0ZVNwYWNlKCkgewotCQlyZXR1cm4gZkluaXRpYWxXaGl0ZVNwYWNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc2V0QWxsKCkgewotCSAgICBzdXBlci5yZXNldEFsbCgpOwotCQlmRGVjbERldGVjdGVkID0gZmFsc2U7Ci0JCWZJbml0aWFsV2hpdGVTcGFjZSA9IGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQXR0ckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQXR0ckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwYWYzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0F0dHJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICAKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI5Njk5OSAtIEluZWZmaWNpZW50IHVzZSBvZiBuZXcgU3RyaW5nKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklYTUxDaGFyRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBBdHRySW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQXR0ckltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIElET01BdHRyIHsKLQotCXByaXZhdGUgSVRleHRSZWdpb24gZXF1YWxSZWdpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBjaGFyW10gZk5hbWUgPSBudWxsOwotCXByaXZhdGUgSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBFbGVtZW50SW1wbCBvd25lckVsZW1lbnQgPSBudWxsOwotCXByaXZhdGUgSVRleHRSZWdpb24gZlZhbHVlUmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIGNoYXJbXSBmVmFsdWVTb3VyY2UgPSBudWxsOwotCXByaXZhdGUgY2hhcltdIGZOYW1lc3BhY2VVUkkgPSBudWxsOwotCi0JLyoqCi0JICogQXR0ckltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQXR0ckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQXR0ckltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgQXR0ckltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgQXR0ckltcGwoQXR0ckltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmZOYW1lID0gdGhhdC5mTmFtZTsKLQkJCVN0cmluZyB2YWx1ZVNvdXJjZSA9IHRoYXQuZ2V0VmFsdWVTb3VyY2UoKTsKLQkJCWlmICh2YWx1ZVNvdXJjZSAhPSBudWxsKQotCQkJCXRoaXMuZlZhbHVlU291cmNlID0gdmFsdWVTb3VyY2UudG9DaGFyQXJyYXkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUF0dHJJbXBsIGNsb25lZCA9IG5ldyBBdHRySW1wbCh0aGlzKTsKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGdldE93bmVyRWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZWxlbWVudC5nZXREZWNsYXJhdGlvbigpOwotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudChnZXRPd25lckVsZW1lbnQoKSwgZWxlbWVudERlY2wsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiAmJiBuYW1lLmVxdWFscyhjbW5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJaW50IG9mZnNldCA9IHRoaXMub3duZXJFbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmICh0aGlzLmZWYWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKG9mZnNldCArIHRoaXMuZlZhbHVlUmVnaW9uLmdldEVuZCgpKTsKLQkJfQotCQlpZiAodGhpcy5lcXVhbFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKG9mZnNldCArIHRoaXMuZXF1YWxSZWdpb24uZ2V0RW5kKCkpOwotCQl9Ci0JCWlmICh0aGlzLm5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLm5hbWVSZWdpb24uZ2V0RW5kKCkpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEVxdWFsUmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5lcXVhbFJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLQkJaWYgKHRoaXMuZk5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YodGhpcy5mTmFtZSwgJzonKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKHRoaXMuZk5hbWUpOwotCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmZOYW1lLCBpbmRleCArIDEsIHRoaXMuZk5hbWUubGVuZ3RoIC0gaW5kZXggLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHRoaXMuZk5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCXJldHVybiBuZXcgU3RyaW5nKHRoaXMuZk5hbWUpOwotCX0KLQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVSZWdpb247Ci0JfQotCi0JcHVibGljIGludCBnZXROYW1lUmVnaW9uRW5kT2Zmc2V0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQkvLyBhc3N1bWluZyB0aGUgZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zCi0JCS8vIGF0dHJpYnV0ZXMKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQodGhpcy5uYW1lUmVnaW9uKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE5hbWVSZWdpb25TdGFydE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQodGhpcy5uYW1lUmVnaW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVSZWdpb25UZXh0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBhc3N1bWluZyB0aGUgZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zCi0JCS8vIGF0dHJpYnV0ZXMKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBmbGF0Tm9kZS5nZXRUZXh0KHRoaXMubmFtZVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIGludCBnZXROYW1lUmVnaW9uVGV4dEVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldCh0aGlzLm5hbWVSZWdpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotCQlTdHJpbmcgbnNBdHRyTmFtZSA9IG51bGw7Ci0JCVN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXgoKTsKLQkJaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApIHsKLQkJCWlmIChwcmVmaXguZXF1YWxzKElYTUxOYW1lc3BhY2UuWE1MTlMpKSB7Ci0JCQkJLy8gZml4ZWQgVVJJCi0JCQkJcmV0dXJuIElYTUxOYW1lc3BhY2UuWE1MTlNfVVJJOwotCQkJfQotCQkJZWxzZSBpZiAocHJlZml4LmVxdWFscyhJWE1MTmFtZXNwYWNlLlhNTCkpIHsKLQkJCQkvLyBmaXhlZCBVUkkKLQkJCQlyZXR1cm4gSVhNTE5hbWVzcGFjZS5YTUxfVVJJOwotCQkJfQotCi0JCQluc0F0dHJOYW1lID0gSVhNTE5hbWVzcGFjZS5YTUxOU19QUkVGSVggKyBwcmVmaXg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJCWlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5lcXVhbHMoSVhNTE5hbWVzcGFjZS5YTUxOUykpIHsKLQkJCQkvLyBmaXhlZCBVUkkKLQkJCQlyZXR1cm4gSVhNTE5hbWVzcGFjZS5YTUxOU19VUkk7Ci0JCQl9Ci0JCQkvLyBkb2VzIG5vdCBpbmhlcml0IG5hbWVzcGFjZSBmcm9tIG93bmVyIGVsZW1lbnQKLQkJCS8vIGlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsKSByZXR1cm4KLQkJCS8vIHRoaXMub3duZXJFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotCQkJaWYgKHRoaXMuZk5hbWVzcGFjZVVSSSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIG5ldyBTdHJpbmcodGhpcy5mTmFtZXNwYWNlVVJJKTsKLQkJfQotCi0JCWZvciAoTm9kZSBub2RlID0gdGhpcy5vd25lckVsZW1lbnQ7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQlicmVhazsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG5zQXR0ck5hbWUpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCQl9Ci0KLQkJaWYgKHRoaXMuZk5hbWVzcGFjZVVSSSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgU3RyaW5nKHRoaXMuZk5hbWVzcGFjZVVSSSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQVRUUklCVVRFX05PREU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgewotCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRPd25lckVsZW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0T3duZXJFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5vd25lckVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCWlmICh0aGlzLmZOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGluZGV4ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKHRoaXMuZk5hbWUsICc6Jyk7Ci0JCWlmIChpbmRleCA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGV4Y2x1ZGUgSlNQIHRhZyBpbiBuYW1lCi0JCWlmICh0aGlzLmZOYW1lWzBdID09ICc8JykKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmZOYW1lLCAwLCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3BlY2lmaWVkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFNwZWNpZmllZCgpIHsKLQkJLy8gaWYgdGhlcmUgaXMgbm8gdW5kZXJseWluZyBkb2N1bWVudCByZWdpb24sIAotCQkvLyB0aGVuIHRoaXMgYXR0cmlidXRlcyB2YWx1ZSBoYXMgbm90IHJlYWxseSBiZSBzcGVjaWZpZWQKLQkJLy8geWV0IGluIHRoZSBkb2N1bWVudCwgYW5kIGFueSByZXR1cm5lZCB2YWx1ZXMsIHN1Y2ggYXMgCi0JCS8vIGFuIGVtcHR5IHN0cmluZyBvciBhIGRlZmF1bHQgdmFsdWUgYXJlIGJlaW5nIHN1cHBsaWVkCi0JCS8vIGFzIHBlciBzcGVjLCBub3QgcGVyIHdoYXQncyBpbiB0aGUgdXNlcnMgZG9jdW1lbnQuCi0JCXJldHVybiB0aGlzLmZWYWx1ZVJlZ2lvbiAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0T2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJaW50IG9mZnNldCA9IHRoaXMub3duZXJFbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmICh0aGlzLm5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLm5hbWVSZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCX0KLQkJaWYgKHRoaXMuZXF1YWxSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLmVxdWFsUmVnaW9uLmdldFN0YXJ0KCkpOwotCQl9Ci0JCWlmICh0aGlzLmZWYWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKG9mZnNldCArIHRoaXMuZlZhbHVlUmVnaW9uLmdldFN0YXJ0KCkpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZShnZXRWYWx1ZVNvdXJjZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHZhbHVlIGZvciB0aGUgc291cmNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQlpZiAoc291cmNlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gc291cmNlOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWludCByZWYgPSBzb3VyY2UuaW5kZXhPZignJicpOwotCQl3aGlsZSAocmVmID49IDApIHsKLQkJCWludCBlbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIHJlZiArIDEpOwotCQkJaWYgKGVuZCA+IHJlZiArIDEpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcocmVmICsgMSwgZW5kKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBnZXRDaGFyVmFsdWUobmFtZSk7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpOwotCQkJCQlpZiAocmVmID4gb2Zmc2V0KQotCQkJCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCwgcmVmKSk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQodmFsdWUpOwotCQkJCQlvZmZzZXQgPSBlbmQgKyAxOwotCQkJCQlyZWYgPSBlbmQ7Ci0JCQkJfQotCQkJfQotCQkJcmVmID0gc291cmNlLmluZGV4T2YoJyYnLCByZWYgKyAxKTsKLQkJfQotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gc291cmNlOwotCQlpZiAobGVuZ3RoID4gb2Zmc2V0KQotCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFZhbHVlUmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5mVmFsdWVSZWdpb247Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHdoYXQgc2hvdWxkIGJlaGF2aW9yIGJlIGlmIHRoaXMudmFsdWUgPT0gbnVsbD8gSXQncyBhbiAiZXJyb3IiCi0JICogdG8gYmUgaW4gdGhhdCBzdGF0ZSwgYnV0IHNlZW1zIHRvIG9jY3VyIHJlbGF0aXZlbHkgZWFzaWx5IC4uLiBwcm9iYWJseQotCSAqIGR1ZSB0byB0aHJlYWRpbmcgYnVncyAuLi4gYnV0IHRoaXMganVzdCBzaG93cyBpdHMgbmVlZHMgdG8gYmUgc3BlYydkLgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyB0aGUgdmFsdWVSZWdpb24gLS0gc2hvdWxkIG1ha2Ugc21hcnRlcj8KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJLy8gZW5zdXJlIHdlIG5ldmVyIHBhc3MgbnVsbCB0byBnZXRTdGFydE9mZnNldC4KLQkJaWYgKHRoaXMuZlZhbHVlUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodGhpcy5mVmFsdWVSZWdpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVSZWdpb25UZXh0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBhc3N1bWluZyB0aGUgZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zCi0JCS8vIGF0dHJpYnV0ZXMKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLmZWYWx1ZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBmbGF0Tm9kZS5nZXRUZXh0KHRoaXMuZlZhbHVlUmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlU291cmNlKCkgewotCQlpZiAodGhpcy5mVmFsdWVTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKHRoaXMuZlZhbHVlU291cmNlKTsKLQkJLy8gRFc6IDQvMTYvMjAwMyBkdWUgdG8gY2hhbmdlIGluIHN0cnVjdHVyZWREb2N1bWVudCAuLi4gd2UgbmVlZCBhCi0JCS8vIGZsYXRub2RlIHRvCi0JCS8vIGdldCBhdCByZWdpb24gdmFsdWVzLiBGb3Igbm93IEknbGwgYXNzdW1lIHRoaXMgaXMgYWx3YXlzIHRoZSBmaXJzdAotCQkvLyBmbGF0bm9kZSAuLiBtYXkgbmVlZCB0byBtYWtlIHNtYXJ0ZXIgbGF0ZXIgKGUuZy4gdG8gc2VhcmNoIGZvcgotCQkvLyB0aGUgZmxhdG5vZGUgdGhhdCB0aGlzLnZhbHVlUmVnaW9uIGJlbG9uZ3MgdG8uCi0JCS8vIERXOiA0LzMwLzIwMDMgRm9yIHNvbWUgcmVhc29uLCB0aGlzIG1ldGhvZCBpcyBnZXR0aW5nIGNhbGxlZCBhIGxvdAotCQkvLyBOb3Qgc3VyZSBpZiBpdHMgYSB0aHJlYWRpbmcgcHJvYmxlbSwgb3IgYSBmdW5kYW1lbnRhbCBlcnJvcgotCQkvLyBlbHNld2hlcmUuCi0JCS8vIEl0IG5lZWRzIG1vcmUgaW52ZXN0aWdhdGlvbiwgYnV0IGluIHRoZSB1c2UgY2FzZXMgSSd2ZSBzZWVuLAotCQkvLyBkb2Vzbid0Ci0JCS8vIHNlZW0gdG8gaHVydCB0byBzaW1wbHkgcmV0dXJuIG51bGwgaW4gdGhvc2UgY2FzZXMuIEkgc2F3IHRoaXMgbnVsbAotCQkvLyBjYXNlLAotCQkvLyB3aGVuIHRyeWluZyBnbyBmb3JtYXQgYW4gWE1MIGZpbGUuCi0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vYXR0cmlidXRlIHZhbHVlcyB3aWxsIGFsd2F5cyBiZSBpbiB0aGUgc3RhcnQgcmVnaW9uCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb3duZXJSZWdpb24gPSB0aGlzLm93bmVyRWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAob3duZXJSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5mVmFsdWVSZWdpb24gIT0gbnVsbCkKLQkJCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShvd25lclJlZ2lvbiwgdGhpcy5mVmFsdWVSZWdpb24pOwotCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFZhbHVlU291cmNlKEVsZW1lbnRJbXBsIG93bmVyRWxlbWVudCkgewotCQlpZiAodGhpcy5mVmFsdWVTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKHRoaXMuZlZhbHVlU291cmNlKTsKLQkJLy8gRFc6IDQvMTYvMjAwMyBkdWUgdG8gY2hhbmdlIGluIHN0cnVjdHVyZWREb2N1bWVudCAuLi4gd2UgbmVlZCBhCi0JCS8vIGZsYXRub2RlIHRvCi0JCS8vIGdldCBhdCByZWdpb24gdmFsdWVzLiBGb3Igbm93IEknbGwgYXNzdW1lIHRoaXMgaXMgYWx3YXlzIHRoZSBmaXJzdAotCQkvLyBmbGF0bm9kZSAuLiBtYXkgbmVlZCB0byBtYWtlIHNtYXJ0ZXIgbGF0ZXIgKGUuZy4gdG8gc2VhcmNoIGZvcgotCQkvLyB0aGUgZmxhdG5vZGUgdGhhdCB0aGlzLnZhbHVlUmVnaW9uIGJlbG9uZ3MgdG8uCi0JCWlmICh0aGlzLmZWYWx1ZVJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0QXR0clZhbHVlKG93bmVyRWxlbWVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgdGhpcy5mVmFsdWVSZWdpb24pOwotCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFZhbHVlU291cmNlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiB2YWx1ZTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCWludCBhbXAgPSB2YWx1ZS5pbmRleE9mKCcmJyk7Ci0JCXdoaWxlIChhbXAgPj0gMCkgewotCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgNCk7Ci0JCQlpZiAoYW1wID4gb2Zmc2V0KQotCQkJCWJ1ZmZlci5hcHBlbmQodmFsdWUuc3Vic3RyaW5nKG9mZnNldCwgYW1wKSk7Ci0JCQlidWZmZXIuYXBwZW5kKElYTUxDaGFyRW50aXR5LkFNUF9SRUYpOwotCQkJb2Zmc2V0ID0gYW1wICsgMTsKLQkJCWFtcCA9IHZhbHVlLmluZGV4T2YoJyYnLCBvZmZzZXQpOwotCQl9Ci0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybiB2YWx1ZTsKLQkJaWYgKGxlbmd0aCA+IG9mZnNldCkKLQkJCWJ1ZmZlci5hcHBlbmQodmFsdWUuc3Vic3RyaW5nKG9mZnNldCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgQXR0ciBoYXMgSlNQIGluIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTmVzdGVkVmFsdWUoKSB7Ci0JCWlmICh0aGlzLmZWYWx1ZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoISh0aGlzLmZWYWx1ZVJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSB0aGlzLmZWYWx1ZVJlZ2lvbikuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiB8fCBpc05lc3RlZExhbmd1YWdlT3BlbmluZyhyZWdpb25UeXBlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgQXR0ciBoYXMgb25seSBuYW1lIGJ1dCBub3QgZXF1YWwgc2lnbiBub3IgdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOYW1lT25seSgpIHsKLQkJcmV0dXJuICh0aGlzLm5hbWVSZWdpb24gIT0gbnVsbCAmJiB0aGlzLmVxdWFsUmVnaW9uID09IG51bGwgJiYgdGhpcy5mVmFsdWVSZWdpb24gPT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzUHJlZml4KCkgewotCQlpZiAodGhpcy5mTmFtZSA9PSBudWxsIHx8IHRoaXMuZk5hbWUubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBDaGFyT3BlcmF0aW9uLmluZGV4T2YodGhpcy5mTmFtZSwgJzonKSA+IDAgJiYgdGhpcy5mTmFtZVswXSAhPSAnPCc7Ci0JfQotCQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlnbm9yZUNhc2UoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5vd25lckVsZW1lbnQuaWdub3JlQ2FzZSgpKSB7Ci0JCQkJcmV0dXJuICFoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50Lmlnbm9yZUNhc2UoKSkgewotCQkJCS8vIGV2ZW4gaW4gY2FzZSBpbnNlbnNpdGl2ZSBkb2N1bWVudCwgaWYgaGF2aW5nIHByZWZpeCwgaXQncwotCQkJCS8vIGNhc2Ugc2Vuc2l0aXZlCi0JCQkJcmV0dXJuICFoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWxBdHRyKCkgewotCQlpZiAoaGFzUHJlZml4KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdGhpcy5vd25lckVsZW1lbnQuaXNHbG9iYWxUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1hNTEF0dHIoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoIXRoaXMub3duZXJFbGVtZW50LmlzWE1MVGFnKCkpIHsKLQkJCQlyZXR1cm4gaGFzUHJlZml4KCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiAhZG9jdW1lbnQuaXNYTUxUeXBlKCkpIHsKLQkJCQkvLyBldmVuIGluIG5vbi1YTUwgZG9jdW1lbnQsIGlmIGhhdmluZyBwcmVmaXgsIGl0J3MgWE1MIHRhZwotCQkJCXJldHVybiBoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBtYXRjaE5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAodGhpcy5mTmFtZSA9PSBudWxsKTsKLQkJaWYgKHRoaXMuZk5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuZk5hbWUsIG5hbWUudG9DaGFyQXJyYXkoKSwgaWdub3JlQ2FzZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaE5hbWUoY2hhcltdIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAodGhpcy5mTmFtZSA9PSBudWxsKTsKLQkJaWYgKHRoaXMuZk5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuZk5hbWUsIG5hbWUsIGlnbm9yZUNhc2UoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBub3RpZnlWYWx1ZUNoYW5nZWQgbWV0aG9kCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TmFtZUNoYW5nZWQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSB0aGlzLm93bmVyRWxlbWVudC5nZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRE9NTW9kZWxJbXBsIG1vZGVsID0gKERPTU1vZGVsSW1wbCkgZG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLm5hbWVDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIG5vdGlmeVZhbHVlQ2hhbmdlZCBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlWYWx1ZUNoYW5nZWQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSB0aGlzLm93bmVyRWxlbWVudC5nZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRE9NTW9kZWxJbXBsIG1vZGVsID0gKERPTU1vZGVsSW1wbCkgZG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLnZhbHVlQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVSZWdpb25zIG1ldGhvZAotCSAqLwotCXZvaWQgcmVtb3ZlUmVnaW9ucygpIHsKLQkJdGhpcy5uYW1lUmVnaW9uID0gbnVsbDsKLQkJdGhpcy5mVmFsdWVSZWdpb24gPSBudWxsOwotCQl0aGlzLmVxdWFsUmVnaW9uID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlc2V0UmVnaW9ucygpIHsKLQkJdGhpcy5mVmFsdWVTb3VyY2UgPSBnZXRWYWx1ZVNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCXJlbW92ZVJlZ2lvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlc2V0UmVnaW9ucyhFbGVtZW50SW1wbCBvd25lckVsZW1lbnQpIHsKLQkJdGhpcy5mVmFsdWVTb3VyY2UgPSBnZXRWYWx1ZVNvdXJjZShvd25lckVsZW1lbnQpLnRvQ2hhckFycmF5KCk7Ci0JCXJlbW92ZVJlZ2lvbnMoKTsKLQl9Ci0KLQl2b2lkIHNldEVxdWFsUmVnaW9uKElUZXh0UmVnaW9uIGVxdWFsUmVnaW9uKSB7Ci0JCXRoaXMuZXF1YWxSZWdpb24gPSBlcXVhbFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBzZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgIT0gbnVsbCkgewotCQkJdmFsdWUgPSBnZXRWYWx1ZSgpOwotCQkJc3RhcnRPZmZzZXQgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQkJdGhpcy5vd25lckVsZW1lbnQubm90aWZ5KFJFTU9WRSwgdGhpcywgdmFsdWUsIG51bGwsIHN0YXJ0T2Zmc2V0KTsKLQkJfQotCQl0aGlzLmZOYW1lID0gQ2hhcmFjdGVyU3RyaW5nUG9vbC5nZXRDaGFyU3RyaW5nKG5hbWUpOwotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgIT0gbnVsbCkgewotCQkJdGhpcy5vd25lckVsZW1lbnQubm90aWZ5KEFERCwgdGhpcywgbnVsbCwgdmFsdWUsIHN0YXJ0T2Zmc2V0KTsKLQkJfQotCX0KLQotCXZvaWQgc2V0TmFtZVJlZ2lvbihJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uKSB7Ci0JCXRoaXMubmFtZVJlZ2lvbiA9IG5hbWVSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJaWYgKG5hbWVzcGFjZVVSSSA9PSBudWxsKQotCQkJdGhpcy5mTmFtZXNwYWNlVVJJID0gbnVsbDsKLQkJZWxzZQotCQkJdGhpcy5mTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJLnRvQ2hhckFycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogc2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldFZhbHVlKG5vZGVWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogc2V0T3duZXJFbGVtZW50IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckVsZW1lbnQoRWxlbWVudCBvd25lckVsZW1lbnQpIHsKLQkJdGhpcy5vd25lckVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG93bmVyRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsICYmICF0aGlzLm93bmVyRWxlbWVudC5pc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQkJaW50IHByZWZpeExlbmd0aCA9IChwcmVmaXggIT0gbnVsbCA/IHByZWZpeC5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmcgbG9jYWxOYW1lID0gZ2V0TG9jYWxOYW1lKCk7Ci0JCWlmIChwcmVmaXhMZW5ndGggPT0gMCkgewotCQkJc2V0TmFtZShsb2NhbE5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChsb2NhbE5hbWUgPT0gbnVsbCkKLQkJCWxvY2FsTmFtZSA9IE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJaW50IGxvY2FsTGVuZ3RoID0gbG9jYWxOYW1lLmxlbmd0aCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwcmVmaXhMZW5ndGggKyAxICsgbG9jYWxMZW5ndGgpOwotCQlidWZmZXIuYXBwZW5kKHByZWZpeCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJzonKTsKLQkJYnVmZmVyLmFwcGVuZChsb2NhbE5hbWUpOwotCQlzZXROYW1lKGJ1ZmZlci50b1N0cmluZygpKTsKLQotCQlub3RpZnlOYW1lQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIHNldFZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkvLyBSZW1lbWJlcjogYXMgd2UgYWNjb3VudCBmb3IgImZsb2F0ZXJzIiBpbgotCQkvLyBmdXR1cmUsIHJlbWVtYmVyIHRoYXQgc29tZSBhcmUgY3JlYXRlZAotCQkvLyBpbiB0aGUgbmF0dXJhbCBwcm9jZXNzIG9mIGltcGxlbWVudGluZwotCQkvLyBET00gYXBpcy4KLQkJLy8gdGhpcyAic2VsZiBub3RpZmljYXRpb24iIG9mIGFib3V0L2NoYW5nZWQsCi0JCS8vIGlzIGFkZGVkIGZvciB0aGlzIGNhc2UsIGJlY2F1c2UgaXQga25vd24gdG8KLQkJLy8gYmUgY2FsbGVkIGZyb20gcHJvcGVydGllcyBwYWdlcy4gU2hvdWxkIGJlIGEKLQkJLy8gYWRkZWQgdG8gYWxsIERPTSBNb2RpZml5aW5nIEFQSXMgZXZlbnR1YWxseS4KLQkJdHJ5IHsKLQkJCWdldE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQlzZXRWYWx1ZVNvdXJjZShnZXRWYWx1ZVNvdXJjZSh2YWx1ZSkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZ2V0TW9kZWwoKS5jaGFuZ2VkTW9kZWwoKTsKLQkJfQotCX0KLQotCXZvaWQgc2V0VmFsdWVSZWdpb24oSVRleHRSZWdpb24gdmFsdWVSZWdpb24pIHsKLQkJdGhpcy5mVmFsdWVSZWdpb24gPSB2YWx1ZVJlZ2lvbjsKLQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpCi0JCQl0aGlzLmZWYWx1ZVNvdXJjZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgIT0gbnVsbCAmJiAhdGhpcy5vd25lckVsZW1lbnQuaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0JCXRoaXMuZlZhbHVlU291cmNlID0gKHNvdXJjZSAhPSBudWxsKSA/IHNvdXJjZS50b0NoYXJBcnJheSgpIDogbnVsbDsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZExhbmd1YWdlT3BlbmluZyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ0RBVEFTZWN0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DREFUQVNlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhM2FkNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DREFUQVNlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICAKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI5Njk5OSAtIEluZWZmaWNpZW50IHVzZSBvZiBuZXcgU3RyaW5nKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLS8qKgotICogQ0RBVEFTZWN0aW9uSW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQ0RBVEFTZWN0aW9uSW1wbCBleHRlbmRzIFRleHRJbXBsIGltcGxlbWVudHMgQ0RBVEFTZWN0aW9uIHsKLQotCS8qKgotCSAqIENEQVRBU2VjdGlvbkltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ0RBVEFTZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDREFUQVNlY3Rpb25JbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIENEQVRBU2VjdGlvbkltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgQ0RBVEFTZWN0aW9uSW1wbChDREFUQVNlY3Rpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDREFUQVNlY3Rpb25JbXBsIGNsb25lZCA9IG5ldyBDREFUQVNlY3Rpb25JbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBpbnN0ZWFkIG9mIHN1cGVyKFRleHRJbXBsKS5nZXREYXRhKCksIGNhbGwgZ2V0Q2hhcmFjdGVyRGF0YSgpCi0JCWNoYXJbXSBkYXRhID0gZ2V0Q2hhcmFjdGVyRGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgc2RhdGEgPSBnZXREYXRhKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJCWlmIChzZGF0YSAhPSBudWxsKQotCQkJCXJldHVybiBzZGF0YTsKLQkJCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGF0YShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb24gY29udGVudFJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjb250ZW50UmVnaW9uID09IG51bGwpIHsgLy8gZmlyc3QgY29udGVudAotCQkJCWNvbnRlbnRSZWdpb24gPSByZWdpb247Ci0JCQl9IGVsc2UgeyAvLyBtdWx0aXBsZSBjb250ZW50cwotCQkJCWlmIChidWZmZXIgPT0gbnVsbCkgewotCQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGZsYXROb2RlLmdldFRleHQoY29udGVudFJlZ2lvbikpOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYnVmZmVyICE9IG51bGwpCi0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCWlmIChjb250ZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dChjb250ZW50UmVnaW9uKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjY2RhdGEtc2VjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDREFUQV9TRUNUSU9OX05PREU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NNTm9kZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ01Ob2RlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTUzM2FiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ01Ob2RlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDTU5vZGVVdGlsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihBdHRyIGF0dHIpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChBdHRySW1wbCkgYXR0cikuZ2V0RGVjbGFyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChFbGVtZW50SW1wbCkgZWxlbWVudCkuZ2V0RGVjbGFyYXRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NoYXJPcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ2hhck9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQ2YmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ2hhck9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7DQotDQotY2xhc3MgQ2hhck9wZXJhdGlvbiB7DQotDQotCXByaXZhdGUgQ2hhck9wZXJhdGlvbigpIHsNCi0JfQ0KLQ0KLQlzdGF0aWMgaW50IGluZGV4T2YoY2hhcltdIGFycmF5LCBjaGFyIGMpIHsNCi0JCXJldHVybiBpbmRleE9mKGFycmF5LCBjLCAwKTsNCi0JfQ0KLQ0KLQlzdGF0aWMgaW50IGluZGV4T2YoY2hhcltdIGFycmF5LCBjaGFyIGMsIGludCBzdGFydCkgew0KLQkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAoYXJyYXlbaV0gPT0gYykNCi0JCQkJcmV0dXJuIGk7DQotCQl9DQotCQlyZXR1cm4gLTE7DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIG5vdGU6IFRoaXMgbWV0aG9kIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbg0KLQkgKiANCi0JICogQW5zd2VycyB0cnVlIGlmIHRoZSB0d28gYXJyYXlzIGFyZSBpZGVudGljYWwgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlciwgb3RoZXJ3aXNlIGZhbHNlLg0KLQkgKiBUaGUgZXF1YWxpdHkgaXMgY2FzZSBzZW5zaXRpdmUuDQotCSAqIDxicj4NCi0JICogPGJyPg0KLQkgKiBGb3IgZXhhbXBsZToNCi0JICogPG9sPg0KLQkgKiA8bGk+PHByZT4NCi0JICogICAgZmlyc3QgPSBudWxsDQotCSAqICAgIHNlY29uZCA9IG51bGwNCi0JICogICAgcmVzdWx0ID0+IHRydWUNCi0JICogPC9wcmU+DQotCSAqIDwvbGk+DQotCSAqIDxsaT48cHJlPg0KLQkgKiAgICBmaXJzdCA9IHsgfQ0KLQkgKiAgICBzZWNvbmQgPSBudWxsDQotCSAqICAgIHJlc3VsdCA9PiBmYWxzZQ0KLQkgKiA8L3ByZT4NCi0JICogPC9saT4NCi0JICogPGxpPjxwcmU+DQotCSAqICAgIGZpcnN0ID0geyAnYScgfQ0KLQkgKiAgICBzZWNvbmQgPSB7ICdhJyB9DQotCSAqICAgIHJlc3VsdCA9PiB0cnVlDQotCSAqIDwvcHJlPg0KLQkgKiA8L2xpPg0KLQkgKiA8bGk+PHByZT4NCi0JICogICAgZmlyc3QgPSB7ICdhJyB9DQotCSAqICAgIHNlY29uZCA9IHsgJ0EnIH0NCi0JICogICAgcmVzdWx0ID0+IGZhbHNlDQotCSAqIDwvcHJlPg0KLQkgKiA8L2xpPg0KLQkgKiA8L29sPg0KLQkgKiBAcGFyYW0gZmlyc3QgdGhlIGZpcnN0IGFycmF5DQotCSAqIEBwYXJhbSBzZWNvbmQgdGhlIHNlY29uZCBhcnJheQ0KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR3byBhcnJheXMgYXJlIGlkZW50aWNhbCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLCBvdGhlcndpc2UgZmFsc2UNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoY2hhcltdIGZpcnN0LCBjaGFyW10gc2Vjb25kLCBib29sZWFuIGlnbm9yZUNhc2UpIHsNCi0JCWlmIChmaXJzdCA9PSBzZWNvbmQpDQotCQkJcmV0dXJuIHRydWU7DQotCQlpZiAoZmlyc3QgPT0gbnVsbCB8fCBzZWNvbmQgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlpZiAoZmlyc3QubGVuZ3RoICE9IHNlY29uZC5sZW5ndGgpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkJZm9yIChpbnQgaSA9IGZpcnN0Lmxlbmd0aDsgLS1pID49IDA7KSB7DQotCQkJaWYgKGlnbm9yZUNhc2UpIHsNCi0JCQkJaWYgKENoYXJhY3Rlci50b1VwcGVyQ2FzZShmaXJzdFtpXSkgIT0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHNlY29uZFtpXSkpIHsNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJaWYgKGZpcnN0W2ldICE9IHNlY29uZFtpXSkgew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DaGFyYWN0ZXJEYXRhSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DaGFyYWN0ZXJEYXRhSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWI5MzFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ2hhcmFjdGVyRGF0YUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTY5OTkgLSBJbmVmZmljaWVudCB1c2Ugb2YgbmV3IFN0cmluZygpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ2hhcmFjdGVyRGF0YTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIENoYXJhY3RlckRhdGFJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaGFyYWN0ZXJEYXRhSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgQ2hhcmFjdGVyRGF0YSB7Ci0KLQlwcml2YXRlIGNoYXJbXSBkYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIENoYXJhY3RlckRhdGFJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIENoYXJhY3RlckRhdGFJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENoYXJhY3RlckRhdGFJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIENoYXJhY3RlckRhdGFJbXBsCi0JICovCi0JcHJvdGVjdGVkIENoYXJhY3RlckRhdGFJbXBsKENoYXJhY3RlckRhdGFJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5kYXRhID0gdGhhdC5nZXREYXRhKCkudG9DaGFyQXJyYXkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFwcGVuZERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZERhdGEoU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChhcmcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRhdGEgPSBhcmc7Ci0JCWVsc2UKLQkJCWRhdGEgKz0gYXJnOwotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIGRlbGV0ZURhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCWlmIChjb3VudCA8IDAgfHwgb2Zmc2V0IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCi0JCVN0cmluZyBkYXRhID0gZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0ID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9Ci0JCWlmIChvZmZzZXQgPT0gMCkgewotCQkJaWYgKGNvdW50ID4gbGVuZ3RoKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJCX0KLQkJCWlmIChjb3VudCA9PSBsZW5ndGgpCi0JCQkJZGF0YSA9IE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJCWVsc2UKLQkJCQlkYXRhID0gZGF0YS5zdWJzdHJpbmcoY291bnQpOwotCQl9IGVsc2UgewotCQkJaW50IGVuZCA9IG9mZnNldCArIGNvdW50OwotCQkJaWYgKGVuZCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCQl9Ci0JCQlpZiAoZW5kID09IGxlbmd0aCkKLQkJCQlkYXRhID0gZGF0YS5zdWJzdHJpbmcoMCwgb2Zmc2V0KTsKLQkJCWVsc2UKLQkJCQlkYXRhID0gZGF0YS5zdWJzdHJpbmcoMCwgb2Zmc2V0KSArIGRhdGEuc3Vic3RyaW5nKGVuZCk7Ci0JCX0KLQkJc2V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgY2hhcltdIGdldENoYXJhY3RlckRhdGEoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGE7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJY2hhcltdIGNkYXRhID0gZ2V0Q2hhcmFjdGVyRGF0YSgpOwotCQlpZiAoY2RhdGEgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKGNkYXRhKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCVN0cmluZyBkYXRhID0gZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBkYXRhLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldERhdGEoKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnREYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBhcmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnREYXRhKGludCBvZmZzZXQsIFN0cmluZyBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoYXJnID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlpZiAob2Zmc2V0IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCi0JCVN0cmluZyBkYXRhID0gZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQlpZiAob2Zmc2V0ID4gMCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCQl9Ci0JCQlkYXRhID0gYXJnOwotCQl9IGVsc2UgaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQlkYXRhID0gYXJnICsgZGF0YTsKLQkJfSBlbHNlIHsKLQkJCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQkJaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCQl9Ci0JCQlpZiAob2Zmc2V0ID09IGxlbmd0aCkKLQkJCQlkYXRhICs9IGFyZzsKLQkJCWVsc2UKLQkJCQlkYXRhID0gZGF0YS5zdWJzdHJpbmcoMCwgb2Zmc2V0KSArIGFyZyArIGRhdGEuc3Vic3RyaW5nKG9mZnNldCk7Ci0JCX0KLQkJc2V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBpc0pTUENvbnRlbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1BDb250ZW50KCkgewotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCXJldHVybiBlbGVtZW50LmlzSlNQQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogcmVwbGFjZURhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gYXJnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZURhdGEoaW50IG9mZnNldCwgaW50IGNvdW50LCBTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlpZiAoYXJnID09IG51bGwpIHsKLQkJCWRlbGV0ZURhdGEob2Zmc2V0LCBjb3VudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNvdW50ID09IDApIHsKLQkJCWluc2VydERhdGEob2Zmc2V0LCBhcmcpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChvZmZzZXQgPCAwIHx8IGNvdW50IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCi0JCVN0cmluZyBkYXRhID0gZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9IGVsc2UgaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJCWlmIChjb3VudCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCQl9Ci0JCQlpZiAoY291bnQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBhcmc7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGFyZyArIGRhdGEuc3Vic3RyaW5nKGNvdW50KTsKLQkJfSBlbHNlIHsKLQkJCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQkJaW50IGVuZCA9IG9mZnNldCArIGNvdW50OwotCQkJaWYgKGVuZCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCQl9Ci0JCQlpZiAoZW5kID09IGxlbmd0aCkKLQkJCQlkYXRhID0gZGF0YS5zdWJzdHJpbmcoMCwgb2Zmc2V0KSArIGFyZzsKLQkJCWVsc2UKLQkJCQlkYXRhID0gZGF0YS5zdWJzdHJpbmcoMCwgb2Zmc2V0KSArIGFyZyArIGRhdGEuc3Vic3RyaW5nKGVuZCk7Ci0JCX0KLQkJc2V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJdGhpcy5kYXRhID0gZ2V0RGF0YSgpLnRvQ2hhckFycmF5KCk7Ci0JCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJdGhpcy5kYXRhID0gKGRhdGEgIT0gbnVsbCA/IGRhdGEudG9DaGFyQXJyYXkoKSA6IG51bGwpOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIHNldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZVZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyBub2RlVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXREYXRhKG5vZGVWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMuZGF0YSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogc3Vic3RyaW5nRGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gY291bnQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgc3Vic3RyaW5nRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCWlmIChvZmZzZXQgPCAwIHx8IGNvdW50IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCi0JCVN0cmluZyBkYXRhID0gZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0ID09IDAgJiYgY291bnQgPT0gbGVuZ3RoKQotCQkJcmV0dXJuIGRhdGE7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQkJaW50IGVuZCA9IG9mZnNldCArIGNvdW50OwotCQlpZiAoZW5kID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9Ci0JCXJldHVybiBkYXRhLnN1YnN0cmluZyhvZmZzZXQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogdG9TdHJpbmcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChnZXROb2RlTmFtZSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlidWZmZXIuYXBwZW5kKGdldERhdGEoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnQCcpOwotCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DaGFyYWN0ZXJTdHJpbmdQb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NoYXJhY3RlclN0cmluZ1Bvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkYjM4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NoYXJhY3RlclN0cmluZ1Bvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci0KLS8qKgotICogT3JnYW5pemVzIGEgcG9vbCBvZiBmcmVxdWVudGx5IHVzZWQgU3RyaW5ncyBhcyBjaGFyYWN0ZXIgYXJyYXlzLgotICogCi0gKi8KLWZpbmFsIGNsYXNzIENoYXJhY3RlclN0cmluZ1Bvb2wgewotCi0Jc3RhdGljIHByaXZhdGUgTGlua2VkSGFzaE1hcCBmUG9vbCA9IG5ldyBMaW1pdGVkSGFzaE1hcCgpOwotCi0Jc3RhdGljIHByaXZhdGUgY2xhc3MgTGltaXRlZEhhc2hNYXAgZXh0ZW5kcyBMaW5rZWRIYXNoTWFwIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVggPSA1MDA7Ci0KLQkJcHVibGljIExpbWl0ZWRIYXNoTWFwKCkgewotCQkJc3VwZXIoTUFYIC8gMTAsIC43NWYsIHRydWUpOwotCQl9Ci0JCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUVsZGVzdEVudHJ5KGphdmEudXRpbC5NYXAuRW50cnkgZWxkZXN0KSB7Ci0JCQlyZXR1cm4gc2l6ZSgpID4gTUFYOwotCQl9Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgY2xhc3MgQ2hhckFycmF5IHsKLQkJY2hhcltdIGZBcnJheTsKLQkJLyoqCi0JCSAqIEFuc3dlcnMgYSBoYXNoY29kZSBmb3IgdGhlIGFycmF5LiBBbGdvcml0aG0gZnJvbSBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uCi0JCSAqCi0JCSAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgZm9yIHdoaWNoIGEgaGFzaGNvZGUgaXMgcmVxdWlyZWQKLQkJICogQHJldHVybiB0aGUgaGFzaGNvZGUKLQkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhcnJheSBpcyBudWxsCi0JCSAqLwotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaW50IGxlbmd0aCA9IGZBcnJheS5sZW5ndGg7Ci0JCQlpbnQgaGFzaCA9IGxlbmd0aCA9PSAwID8gMzEgOiBmQXJyYXlbMF07Ci0JCQlpZiAobGVuZ3RoIDwgOCkgewotCQkJCWZvciAoaW50IGkgPSBsZW5ndGg7IC0taSA+IDA7KQotCQkJCQloYXNoID0gKGhhc2ggKiAzMSkgKyBmQXJyYXlbaV07Ci0JCQl9IGVsc2UgewotCQkJCS8vIDggY2hhcmFjdGVycyBpcyBlbm91Z2ggdG8gY29tcHV0ZSBhIGRlY2VudCBoYXNoIGNvZGUsIGRvbid0IHdhc3RlIHRpbWUgZXhhbWluaW5nIGV2ZXJ5IGNoYXJhY3RlcgotCQkJCWZvciAoaW50IGkgPSBsZW5ndGggLSAxLCBsYXN0ID0gaSA+IDE2ID8gaSAtIDE2IDogMDsgaSA+IGxhc3Q7IGkgLT0gMikKLQkJCQkJaGFzaCA9IChoYXNoICogMzEpICsgZkFycmF5W2ldOwotCQkJfQotCQkJcmV0dXJuIGhhc2ggJiAweDdGRkZGRkZGOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICh0aGlzID09IG9iaikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIENoYXJBcnJheSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJQ2hhckFycmF5IG90aGVyID0gKENoYXJBcnJheSkgb2JqOwotCQkJaWYgKGZBcnJheS5sZW5ndGggIT0gb3RoZXIuZkFycmF5Lmxlbmd0aCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmQXJyYXlbaV0gIT0gb3RoZXIuZkFycmF5W2ldKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ2hhcmFjdGVyU3RyaW5nUG9vbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXJyYXkgZm9yIDxjb2RlPnN0cmluZzwvY29kZT4uIElmCi0JICogdGhlIGNoYXJhY3RlciBhcnJheSBpcyBhbHJlYWR5IGluIHRoZSBwb29sIGZvciBjaGFyYWN0ZXIgYXJyYXlzLAotCSAqIHRoZSBhcnJheSBpcyByZXVzZWQuCi0JICogCi0JICogQHBhcmFtIHN0cmluZyB0aGUgc3RyaW5nIHRvIHJldHJpZXZlIHRoZSBjaGFyYWN0ZXIgYXJyYXkgZm9yCi0JICogQHJldHVybiBhIHBvb2xlZCBpbnN0YW5jZSBvZiB0aGUgY2hhcmFjdGVyIGFycmF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0Q2hhclN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCUNoYXJBcnJheSBhcnJheSA9IG5ldyBDaGFyQXJyYXkoKTsKLQkJYXJyYXkuZkFycmF5ID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0KLQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoZlBvb2wpIHsKLQkJCW9iaiA9IGZQb29sLmdldChhcnJheSk7Ci0JCQlpZiAob2JqID09IG51bGwpIHsKLQkJCQlvYmogPSBhcnJheTsKLQkJCQlmUG9vbC5wdXQob2JqLCBvYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiAoKENoYXJBcnJheSkgb2JqKS5mQXJyYXk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvbW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvbW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhODE3ZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db21tZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTY5OTkgLSBJbmVmZmljaWVudCB1c2Ugb2YgbmV3IFN0cmluZygpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBDb21tZW50SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEltcGwgZXh0ZW5kcyBDaGFyYWN0ZXJEYXRhSW1wbCBpbXBsZW1lbnRzIENvbW1lbnQgewotCi0JcHJpdmF0ZSBib29sZWFuIGlzSlNQVGFnID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21tZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBDb21tZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21tZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBDb21tZW50SW1wbAotCSAqLwotCXByb3RlY3RlZCBDb21tZW50SW1wbChDb21tZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMuaXNKU1BUYWcgPSB0aGF0LmlzSlNQVGFnOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDb21tZW50SW1wbCBjbG9uZWQgPSBuZXcgQ29tbWVudEltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldERhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWNoYXJbXSBkYXRhID0gZ2V0Q2hhcmFjdGVyRGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgc2RhdGEgPSBnZXREYXRhKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJCWlmIChzZGF0YSAhPSBudWxsKQotCQkJCXJldHVybiBzZGF0YTsKLQkJCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGF0YShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb24gY29udGVudFJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFIHx8IGlzTmVzdGVkQ29tbWVudE9wZW5DbG9zZShyZWdpb25UeXBlKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNvbnRlbnRSZWdpb24gPT0gbnVsbCkgeyAvLyBmaXJzdCBjb250ZW50Ci0JCQkJY29udGVudFJlZ2lvbiA9IHJlZ2lvbjsKLQkJCX0KLQkJCWVsc2UgeyAvLyBtdWx0aXBsZSBjb250ZW50cwotCQkJCWlmIChidWZmZXIgPT0gbnVsbCkgewotCQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGZsYXROb2RlLmdldFRleHQoY29udGVudFJlZ2lvbikpOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYnVmZmVyICE9IG51bGwpCi0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCWlmIChjb250ZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dChjb250ZW50UmVnaW9uKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjY29tbWVudCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDT01NRU5UX05PREU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UgfHwgaXNOZXN0ZWRDb21tZW50Q2xvc2UocmVnaW9uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZQotCSAqIEBwYXJhbSByZWdpb25UeXBlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29tbWVudENsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKiBAcGFyYW0gcmVnaW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRPcGVuQ2xvc2UoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCi0JcHVibGljIGJvb2xlYW4gaXNKU1BUYWcoKSB7Ci0JCXJldHVybiB0aGlzLmlzSlNQVGFnOwotCX0KLQotCS8qKgotCSAqIHNldEpTUFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gaXNKU1BUYWcKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKU1BUYWcoYm9vbGVhbiBpc0pTUFRhZykgewotCQlpZiAoaXNKU1BUYWcgPT0gdGhpcy5pc0pTUFRhZykKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGlzSlNQVGFnKSB7Ci0JCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCB8fCAhZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGhpcy5pc0pTUFRhZyA9IGlzSlNQVGFnOwotCi0JCWlmIChnZXRDb250YWluZXJEb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCS8vIGFscmVhZHkgaW4gdGhlIHRyZWUsIHVwZGF0ZSBJU3RydWN0dXJlZERvY3VtZW50Ci0JCQlzZXREYXRhKGdldERhdGEoKSk7IC8vIGNhbGxzIG5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTA3YmZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqICAgICANCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi0NCi1jbGFzcyBET01NZXNzYWdlcyBleHRlbmRzIE5MUyB7DQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRE9NTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQotDQotCXN0YXRpYyB7DQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBET01NZXNzYWdlcy5jbGFzcyk7DQotCX0NCi0NCi0JcHJpdmF0ZSBET01NZXNzYWdlcygpIHsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET01TVFJJTkdfU0laRV9FUlI7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5ERVhfU0laRV9FUlI7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVVNFX0FUVFJJQlVURV9FUlI7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfQUNDRVNTX0VSUjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9DSEFSQUNURVJfRVJSOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX01PRElGSUNBVElPTl9FUlI7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfU1RBVEVfRVJSOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOQU1FU1BBQ0VfRVJSOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT19EQVRBX0FMTE9XRURfRVJSOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PVF9GT1VORF9FUlI7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PVF9TVVBQT1JURURfRVJSOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTWU5UQVhfRVJSOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX01JU01BVENIX0VSUjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9FUlI7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdST05HX0RPQ1VNRU5UX0VSUjsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGVhYzI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLURPTVNUUklOR19TSVpFX0VSUj1ET01TdHJpbmcgU2l6ZSBFcnJvcg0KLUhJRVJBUkNIWV9SRVFVRVNUX0VSUj1JbnZhbGlkIEhpZXJhcmNoeSBSZXF1ZXN0DQotSU5ERVhfU0laRV9FUlI9SW5jb3JyZWN0IEluZGV4IEVycm9yDQotSU5VU0VfQVRUUklCVVRFX0VSUj1BdHRyaWJ1dGUgTm9kZSBJbiBVc2UgRXJyb3INCi1JTlZBTElEX0FDQ0VTU19FUlI9SW52YWxpZCBBY2Nlc3MgRXJyb3INCi1JTlZBTElEX0NIQVJBQ1RFUl9FUlI9SW52YWxpZCBDaGFyYWNlciBFcnJvcg0KLUlOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUj1JbnZhbGlkIE1vZGlmaWNhdGlvbiBFcnJvcg0KLUlOVkFMSURfU1RBVEVfRVJSPUludmFsaWQgU3RhdGUgRXJyb3INCi1OQU1FU1BBQ0VfRVJSPU5hbWVzcGFjZSBFcnJvcg0KLU5PX0RBVEFfQUxMT1dFRF9FUlI9Tm8gRGF0YSBBbGxvd2VkDQotTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSPU5vIE1vZGlmaWNhdGlvbiBBbGxvd2VkDQotTk9UX0ZPVU5EX0VSUj1Ob3QgRm91bmQNCi1OT1RfU1VQUE9SVEVEX0VSUj1Ob3QgU3VwcG9ydGVkDQotU1lOVEFYX0VSUj1TeW50YXggRXJyb3INCi1UWVBFX01JU01BVENIX0VSUj1UeXBlIE1pc21hdGNoIEVycm9yDQotVkFMSURBVElPTl9FUlI9VmFsaWRhdGlvbiBFcnJvcg0KLVdST05HX0RPQ1VNRU5UX0VSUj1Xcm9uZyBEb2N1bWVudA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTU1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWViODdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogWE1MTW9kZWxJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBET01Nb2RlbEltcGwgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciwgSURPTU1vZGVsLCBET01JbXBsZW1lbnRhdGlvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRSQUNFX1BBUlNFUl9NQU5BR0VNRU5UX0VYQ0VQVElPTiA9ICJwYXJzZXJNYW5hZ2VtZW50IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgT2JqZWN0IGFjdGl2ZSA9IG51bGw7Ci0JcHJpdmF0ZSBEb2N1bWVudEltcGwgZG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBudWxsOwotCXByaXZhdGUgWE1MTW9kZWxOb3RpZmllciBub3RpZmllciA9IG51bGw7Ci0JcHJpdmF0ZSBYTUxNb2RlbFBhcnNlciBwYXJzZXIgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiByZWZyZXNoID0gZmFsc2U7Ci0JcHJpdmF0ZSBYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBYTUxNb2RlbEltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRE9NTW9kZWxJbXBsKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgaW50ZXJuYWxDcmVhdGVEb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBjbGllbnRzIHRvIGRlY2xhcmUgdGhhdCB0aGV5IGFyZSBhYm91dCB0byBtYWtlIGEKLQkgKiAibGFyZ2UiIGNoYW5nZSB0byB0aGUgbW9kZWwuIFRoaXMgY2hhbmdlIG1pZ2h0IGJlIGluIHRlcm1zIG9mIGNvbnRlbnQKLQkgKiBvciBpdCBtaWdodCBiZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZWwgaWQgb3IgYmFzZSBsb2NhdGlvbi4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIG5vdGlmaWNhdGlvbiB0byBsaXN0bmVycyBpcwotCSAqIHNlbnQgb25seSBvbmNlLgotCSAqIAotCSAqIE5vdGUgdGhhdCB0aGUgY2xpZW50IHdobyBpcyBtYWtpbmcgdGhlc2UgY2hhbmdlcyBoYXMgdGhlIHJlc3BvbnNpYmlsaXR5Ci0JICogdG8gcmVzdG9yZSB0aGUgbW9kZWxzIHN0YXRlIG9uY2UgZmluaXNoZWQgd2l0aCB0aGUgY2hhbmdlcy4gU2VlCi0JICogZ2V0TWVtZW50byBhbmQgcmVzdG9yZVN0YXRlLgotCSAqIAotCSAqIFRoZSBtZXRob2QgaXNNb2RlbFN0YXRlQ2hhbmdpbmcgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGV0ZXJtaW5lIGlmCi0JICogdGhlIG1vZGVsIGlzIGFscmVhZHkgaW4gYSBjaGFuZ2Ugc2VxdWVuY2UuCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb0NoYW5nZU1vZGVsKCkgewotCQlzdXBlci5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJLy8gdGVjaG5pY2FsbHksIG5vIG5lZWQgdG8gY2FsbCBiZWdpbkNoYW5naW5nIHNvIG9mdGVuLAotCQkvLyBzaW5jZSBhYm91dFRvQ2hhbmdlTW9kZWwgY2FuIGJlIG5lc3RlZC4KLQkJLy8gYnV0IHdpbGwgbGVhdmUgYXMgaXMgZm9yIHRoaXMgcmVsZWFzZS4KLQkJLy8gc2VlIG1vZGVsQ2hhbmdlZCwgYW5kIGJlIHN1cmUgc3RheXMgY29vcmRpbmF0ZWQgdGhlcmUuCi0JCWdldE1vZGVsTm90aWZpZXIoKS5iZWdpbkNoYW5naW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWJvdXRUb1JlaW5pdGlhbGl6ZU1vZGVsKCkgewotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gZ2V0TW9kZWxOb3RpZmllcigpOwotCQlub3RpZmllci5jYW5jZWxQZW5kaW5nKCk7Ci0JCXN1cGVyLmFib3V0VG9SZWluaXRpYWxpemVNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIGF0dHJSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhdHRyUmVwbGFjZWQoRWxlbWVudCBlbGVtZW50LCBBdHRyIG5ld0F0dHIsIEF0dHIgb2xkQXR0cikgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0QWN0aXZlUGFyc2VyKCkgPT0gbnVsbCkgewotCQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRNb2RlbFVwZGF0ZXIoKTsKLQkJCXNldEFjdGl2ZSh1cGRhdGVyKTsKLQkJCXVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCQkJdXBkYXRlci5yZXBsYWNlQXR0cihlbGVtZW50LCBuZXdBdHRyLCBvbGRBdHRyKTsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJfQotCQlnZXRNb2RlbE5vdGlmaWVyKCkuYXR0clJlcGxhY2VkKGVsZW1lbnQsIG5ld0F0dHIsIG9sZEF0dHIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBhIGNsaWVudCBjb250cm9sbGVkIHdheSBvZiBub3RpZnlpbmcgYWxsIE1vZGVsRXZlbnQKLQkgKiBsaXN0bmVycyB0aGF0IHRoZSBtb2RlbCBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1ldGhvZCBpcyBhIG1hdGNoZWQgcGFpcgotCSAqIHRvIGFib3V0VG9DaGFuZ2VNb2RlbCwgYW5kIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFib3V0VG9DaGFuZ2VNb2RlbCAuLi4KLQkgKiBvciBzb21lIGxpc3RlbmVycyBjb3VsZCBiZSBsZWZ0IHdhaXRpbmcgaW5kZWZpbml0ZWx5IGZvciB0aGUgY2hhbmdlZAotCSAqIGV2ZW50LiBTbywgaXRzIHN1Z2dlc3RlZCB0aGF0IGNoYW5nZWRNb2RlbCBhbHdheXMgYmUgaW4gYSBmaW5hbGx5Ci0JICogY2xhdXNlLiBMaWtld2lzZSwgYSBjbGllbnQgc2hvdWxkIG5ldmVyIGNhbGwgY2hhbmdlZE1vZGVsIHdpdGhvdXQKLQkgKiBjYWxsaW5nIGFib3V0VG9DaGFuZ2VNb2RlbCBmaXJzdC4KLQkgKiAKLQkgKiBJbiB0aGUgY2FzZSBvZiBlbWJlZGRlZCBjYWxscywgdGhlIG5vdGlmaWNhdGlvbiBpcyBqdXN0IHNlbnQgb25jZS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGFuZ2VkTW9kZWwoKSB7Ci0JCS8vIE5PVEU6IHRoZSBvcmRlciBvZiAnY2hhbmdlZE1vZGVsJyBhbmQgJ2VuZENoYW5naW5nJyBpcyBzaWduaWZpY2FudC4KLQkJLy8gQnkgY2FsbGluZyBjaGFuZ2VkTW9kZWwgZmlyc3QsIHRoaXMgYmFzaWNhbGx5IGRlY3JlbWVudHMgdGhlCi0JCS8vICJpc0NoYW5naW5nIiBjb3VudGVyCi0JCS8vIGluIHN1cGVyIGNsYXNzIGFuZCB3aGVuIHplcm8gYWxsIGxpc3RlbmVycyB0byBtb2RlbCBzdGF0ZSBldmVudHMKLQkJLy8gd2lsbCBiZSBub3RpZmllZAotCQkvLyB0aGF0IHRoZSBtb2RlbCBoYXMgYmVlbiBjaGFuZ2VkLiAnZW5kQ2hhbmdpbmcnIHdpbGwgbm90aWZ5IGFsbAotCQkvLyBkZWZlcnJlZCBhZGFwdGVycy4KLQkJLy8gU28sIHRoZSBzaWduaWZpY2FuY2Ugb2Ygb3JkZXIgaXMgdGhhdCBhZGFwdGVycyAoYW5kIG1ldGhvZHMgdGhleQotCQkvLyBjYWxsKQotCQkvLyBjYW4gY291bnQgb24gdGhlIHN0YXRlIG9mIG1vZGVsICJpc0NoYW5naW5nIiB0byBiZSBhY2N1cmF0ZS4KLQkJLy8gQnV0LCByZW1lbWJlciwgdGhhdCB0aGlzIG1lYW5zIHRoZSAibW9kZWxDaGFuZ2VkIiBldmVudCBjYW4gYmUKLQkJLy8gcmVjZWl2ZWQgYmVmb3JlIGFsbAotCQkvLyBhZGFwdGVycyBoYXZlIGZpbmlzaGVkIHRoZWlyIHByb2Nlc3NpbmcuCi0JCS8vIE5PVEUgTk9URTogVGhlIGFib3ZlIG5vdGUgaXMgb2Jzb2xldGUgaW4gZmFjdCAodGhvdWdoIHN0aWxsIHN0YXRlcwotCQkvLyBpc3N1ZSBjb3JyZWN0bHkpLgotCQkvLyBEdWUgdG8gcG9wdWxhciBkZW1hbmQsIHRoZSBvcmRlciBvZiB0aGVzZSBjYWxscyB3ZXJlIHJldmVyc2VkIGFuZAotCQkvLyBiZWhhdmlvcgotCQkvLyBjaGFuZ2VkIG9uIDA3LzIyLzIwMDQuCi0JCS8vIAotCQkvLyBzZWUgYWxzbwotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDMwMgotCQkvLyBmb3IgbW90aXZhdGlvbiBmb3IgdGhpcyAnb24gdmVyZ2Ugb2YnIGNhbGwuCi0JCS8vIHRoaXMgY291bGQgYmUgaW1wcm92ZWQgaW4gZnV0dXJlIGlmIG5vdGlmaWVyIGFsc28gdXNlZCBjb3VudGluZwotCQkvLyBmbGFnIHRvIGF2b2lkIG5lc3RlZCBjYWxscy4gSWYvd2hlbiBjaGFuZ2VkIGJlIHN1cmUgdG8gY2hlY2sgaWYKLQkJLy8gYWJvdXRUb0NoYW5nZU1vZGVsIG5lZWRzIGFueSBjaGFuZ2VzIHRvby4KLQkJaWYgKGlzTW9kZWxDaGFuZ2VTdGF0ZU9uVmVyZ2VPZkVuZGluZygpKSB7Ci0JCQkvLyBlbmQgbG9jayBiZWZvcmUgbm90aWNpYXRpb24gbG9vcCwgc2luY2UgZGlyZWN0bHkgb3IgaW5kaXJlY3RseQotCQkJLy8gd2UgbWF5IGJlICJjYWxsZWQgZnJvbSBmb3JpZWduIGNvZGUiIGR1cmluZyBub3RpZmljYXRpb24uCi0JCQllbmRMb2NrKCk7Ci0JCQkvLyB3ZSBudWxsIG91dCBoZXJlIHRvIGF2b2lkIHNwdXJpb3VzIndhcm5pbmciIG1lc3NhZ2Ugd2hpbGUgZGVidWcKLQkJCS8vIHRyYWNpbmcgaXMgZW5hYmxlZAotCQkJZkxvY2tPYmplY3QgPSBudWxsOwotCQkJLy8gdGhlIG5vdGlmaWVyIGlzIHdoYXQgY29udHJvbHMgYWRhcGVyIG5vdGlmaWNhdGlvbiwgd2hpY2gKLQkJCS8vIHNob3VsZCBiZSBzZW50IG91dCBiZWZvcmUgdGhlICdtb2RlbENoYW5nZWQnIGV2ZW50LgotCQkJZ2V0TW9kZWxOb3RpZmllcigpLmVuZENoYW5naW5nKCk7Ci0JCX0KLQkJLy8gY2hhbmdlZE1vZGVsIGhhbmRsZXMgJ25lc3RpbmcnLCBzbyBvbmx5IG9uZSBldmVudCBzZW50IG91dAotCQkvLyB3aGVuIG11bGl0cGxlIGNhbGxzIHRvICdhYm91dFRvQ2hhbmdlL0NoYW5nZWQnLgotCQlzdXBlci5jaGFuZ2VkTW9kZWwoKTsKLQkJaGFuZGxlUmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIGNoaWxkUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGlsZFJlcGxhY2VkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCkgewotCQlpZiAocGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0QWN0aXZlUGFyc2VyKCkgPT0gbnVsbCkgewotCQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRNb2RlbFVwZGF0ZXIoKTsKLQkJCXNldEFjdGl2ZSh1cGRhdGVyKTsKLQkJCXVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCQkJdXBkYXRlci5yZXBsYWNlQ2hpbGQocGFyZW50Tm9kZSwgbmV3Q2hpbGQsIG9sZENoaWxkKTsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJfQotCQlnZXRNb2RlbE5vdGlmaWVyKCkuY2hpbGRSZXBsYWNlZChwYXJlbnROb2RlLCBuZXdDaGlsZCwgb2xkQ2hpbGQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gWE1MIDxjb2RlPkRvY3VtZW50PC9jb2RlPiBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlCi0JICogd2l0aCBpdHMgZG9jdW1lbnQgZWxlbWVudC4gSFRNTC1vbmx5IERPTSBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IG5lZWQgdG8KLQkgKiBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIG5hbWVzcGFjZVVSSVRoZQotCSAqICAgICAgICAgICAgbmFtZXNwYWNlIFVSSSBvZiB0aGUgZG9jdW1lbnQgZWxlbWVudCB0byBjcmVhdGUuCi0JICogQHBhcmFtIHF1YWxpZmllZE5hbWVUaGUKLQkgKiAgICAgICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBkb2N1bWVudCBlbGVtZW50IHRvIGJlIGNyZWF0ZWQuCi0JICogQHBhcmFtIGRvY3R5cGVUaGUKLQkgKiAgICAgICAgICAgIHR5cGUgb2YgZG9jdW1lbnQgdG8gYmUgY3JlYXRlZCBvciA8Y29kZT5udWxsPC9jb2RlPi4gV2hlbgotCSAqICAgICAgICAgICAgPGNvZGU+ZG9jdHlwZTwvY29kZT4gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LCBpdHMKLQkgKiAgICAgICAgICAgIDxjb2RlPk5vZGUub3duZXJEb2N1bWVudDwvY29kZT4gYXR0cmlidXRlIGlzIHNldCB0byB0aGUKLQkgKiAgICAgICAgICAgIGRvY3VtZW50IGJlaW5nIGNyZWF0ZWQuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Eb2N1bWVudDwvY29kZT4gb2JqZWN0LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9DSEFSQUNURVJfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQKLQkgKiAgICAgICAgICAgICAgICBuYW1lIGNvbnRhaW5zIGFuIGlsbGVnYWwgY2hhcmFjdGVyLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTkFNRVNQQUNFX0VSUjogUmFpc2VkIGlmIHRoZSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPgotCSAqICAgICAgICAgICAgICAgIGlzIG1hbGZvcm1lZCwgaWYgdGhlIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IGhhcyBhCi0JICogICAgICAgICAgICAgICAgcHJlZml4IGFuZCB0aGUgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBpcwotCSAqICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBvciBpZiB0aGUKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBoYXMgYSBwcmVmaXggdGhhdCBpcyAieG1sIgotCSAqICAgICAgICAgICAgICAgIGFuZCB0aGUgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBpcyBkaWZmZXJlbnQgZnJvbSAiCi0JICogICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiAuPGJyPgotCSAqICAgICAgICAgICAgICAgIFdST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRvY3R5cGU8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgZG9jdW1lbnQgb3Igd2FzCi0JICogICAgICAgICAgICAgICAgY3JlYXRlZCBmcm9tIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLgotCSAqIEBzZWUgRE9NIExldmVsIDIKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUsIERvY3VtZW50VHlwZSBkb2N0eXBlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbXB0eSA8Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+IG5vZGUuIEVudGl0eSBkZWNsYXJhdGlvbnMKLQkgKiBhbmQgbm90YXRpb25zIGFyZSBub3QgbWFkZSBhdmFpbGFibGUuIEVudGl0eSByZWZlcmVuY2UgZXhwYW5zaW9ucyBhbmQKLQkgKiBkZWZhdWx0IGF0dHJpYnV0ZSBhZGRpdGlvbnMgZG8gbm90IG9jY3VyLiBJdCBpcyBleHBlY3RlZCB0aGF0IGEgZnV0dXJlCi0JICogdmVyc2lvbiBvZiB0aGUgRE9NIHdpbGwgcHJvdmlkZSBhIHdheSBmb3IgcG9wdWxhdGluZyBhCi0JICogPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPi48YnI+Ci0JICogSFRNTC1vbmx5IERPTSBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lVGhlCi0JICogICAgICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZG9jdW1lbnQgdHlwZSB0byBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBwdWJsaWNJZFRoZQotCSAqICAgICAgICAgICAgZXh0ZXJuYWwgc3Vic2V0IHB1YmxpYyBpZGVudGlmaWVyLgotCSAqIEBwYXJhbSBzeXN0ZW1JZFRoZQotCSAqICAgICAgICAgICAgZXh0ZXJuYWwgc3Vic2V0IHN5c3RlbSBpZGVudGlmaWVyLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPiBub2RlIHdpdGgKLQkgKiAgICAgICAgIDxjb2RlPk5vZGUub3duZXJEb2N1bWVudDwvY29kZT4gc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9DSEFSQUNURVJfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQKLQkgKiAgICAgICAgICAgICAgICBuYW1lIGNvbnRhaW5zIGFuIGlsbGVnYWwgY2hhcmFjdGVyLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTkFNRVNQQUNFX0VSUjogUmFpc2VkIGlmIHRoZSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPgotCSAqICAgICAgICAgICAgICAgIGlzIG1hbGZvcm1lZC4KLQkgKiBAc2VlIERPTSBMZXZlbCAyCi0JICovCi0JcHVibGljIERvY3VtZW50VHlwZSBjcmVhdGVEb2N1bWVudFR5cGUoU3RyaW5nIHF1YWxpZmllZE5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnRUeXBlSW1wbCBkb2N1bWVudFR5cGUgPSBuZXcgRG9jdW1lbnRUeXBlSW1wbCgpOwotCQlkb2N1bWVudFR5cGUuc2V0TmFtZShxdWFsaWZpZWROYW1lKTsKLQkJZG9jdW1lbnRUeXBlLnNldFB1YmxpY0lkKHB1YmxpY0lkKTsKLQkJZG9jdW1lbnRUeXBlLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLQkJcmV0dXJuIGRvY3VtZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb2N1bWVudFR5cGVDaGFuZ2VkKCkgewotCQlpZiAodGhpcy5yZWZyZXNoKQotCQkJcmV0dXJuOwotCQkvLyB1bmxpa2UgJ3Jlc2ZyZXNoJywgJ3JlaW5pdGlhbGl6ZScgZmluaXNoZXMgbG9vcAotCQkvLyBhbmQgZmx1c2hlcyByZW1haW5pbmcgbm90aWZpY2F0aW9uIHF1ZSBiZWZvcmUKLQkJLy8gYWN0dWFsbHkgcmVpbml0aWFsaXppbmcuCi0JCS8vIElTU1VFOiBzaG91bGQgcmVpbml0IGJlIHVzZWQgaW5zdGVhZCBvZiBoYW5kbGVyZWZyZXNoPwotCQkvLyB0aGlzLnNldFJlaW5pdGlhbGl6ZU5lZWRlZCh0cnVlKTsKLQkJaWYgKHRoaXMuYWN0aXZlICE9IG51bGwgfHwgZ2V0TW9kZWxOb3RpZmllcigpLmlzQ2hhbmdpbmcoKSkKLQkJCXJldHVybjsgLy8gZGVmZXIKLQkJaGFuZGxlUmVmcmVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVkaXRhYmxlQ2hhbmdlZChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJZ2V0TW9kZWxOb3RpZmllcigpLmVkaXRhYmxlQ2hhbmdlZChub2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZFRhZ0NoYW5nZWQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRBY3RpdmVQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldE1vZGVsVXBkYXRlcigpOwotCQkJc2V0QWN0aXZlKHVwZGF0ZXIpOwotCQkJdXBkYXRlci5pbml0aWFsaXplKCk7Ci0JCQl1cGRhdGVyLmNoYW5nZUVuZFRhZyhlbGVtZW50KTsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJfQotCQlnZXRNb2RlbE5vdGlmaWVyKCkuZW5kVGFnQ2hhbmdlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFhNTE1vZGVsUGFyc2VyIGdldEFjdGl2ZVBhcnNlcigpIHsKLQkJaWYgKHRoaXMucGFyc2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMucGFyc2VyICE9IHRoaXMuYWN0aXZlKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0aGlzLnBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFhNTE1vZGVsVXBkYXRlciBnZXRBY3RpdmVVcGRhdGVyKCkgewotCQlpZiAodGhpcy51cGRhdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMudXBkYXRlciAhPSB0aGlzLmFjdGl2ZSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdGhpcy51cGRhdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKERvY3VtZW50LmNsYXNzLmVxdWFscyhhZGFwdGVyKSkKLQkJCXJldHVybiBnZXREb2N1bWVudCgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIFhNTERvY3VtZW50Ci0JICovCi0JcHVibGljIElET01Eb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElTb3VyY2VHZW5lcmF0b3IgZ2V0R2VuZXJhdG9yKCkgewotCQlpZiAodGhpcy5nZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5nZW5lcmF0b3IgPSBYTUxHZW5lcmF0b3JJbXBsLmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIEluZGV4ZWRSZWdpb24gZ2V0SW5kZXhlZFJlZ2lvbihpbnQgb2Zmc2V0KSB7Ci0JCWlmICh0aGlzLmRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gc2VhcmNoIGluIGRvY3VtZW50IGNoaWxkcmVuCi0JCUlET01Ob2RlIHBhcmVudCA9IG51bGw7Ci0JCWludCBsZW5ndGggPSB0aGlzLmRvY3VtZW50LmdldEVuZE9mZnNldCgpOwotCQlpZiAob2Zmc2V0ICogMiA8IGxlbmd0aCkgewotCQkJLy8gc2VhcmNoIGZyb20gdGhlIGZpcnN0Ci0JCQlJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgdGhpcy5kb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCWlmIChjaGlsZC5nZXRFbmRPZmZzZXQoKSA8PSBvZmZzZXQpIHsKLQkJCQkJY2hpbGQgPSAoSURPTU5vZGUpIGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoY2hpbGQuZ2V0U3RhcnRPZmZzZXQoKSA+IG9mZnNldCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpID4gb2Zmc2V0KQotCQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJCX0KLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgPD0gb2Zmc2V0KQotCQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJCX0KLQkJCQkvLyBkaWcgbW9yZQotCQkJCXBhcmVudCA9IGNoaWxkOwotCQkJCWNoaWxkID0gKElET01Ob2RlKSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2VhcmNoIGZyb20gdGhlIGxhc3QKLQkJCUlET01Ob2RlIGNoaWxkID0gKElET01Ob2RlKSB0aGlzLmRvY3VtZW50LmdldExhc3RDaGlsZCgpOwotCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0U3RhcnRPZmZzZXQoKSA+IG9mZnNldCkgewotCQkJCQljaGlsZCA9IChJRE9NTm9kZSkgY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoY2hpbGQuZ2V0RW5kT2Zmc2V0KCkgPD0gb2Zmc2V0KSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gY2hpbGQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCkgPiBvZmZzZXQpCi0JCQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQkJfQotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gY2hpbGQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSA8PSBvZmZzZXQpCi0JCQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQkJfQotCQkJCS8vIGRpZyBtb3JlCi0JCQkJcGFyZW50ID0gY2hpbGQ7Ci0JCQkJY2hpbGQgPSAoSURPTU5vZGUpIHBhcmVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBYTUxNb2RlbE5vdGlmaWVyIGdldE1vZGVsTm90aWZpZXIoKSB7Ci0JCWlmICh0aGlzLm5vdGlmaWVyID09IG51bGwpIHsKLQkJCXRoaXMubm90aWZpZXIgPSBuZXcgWE1MTW9kZWxOb3RpZmllckltcGwoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5ub3RpZmllcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFhNTE1vZGVsUGFyc2VyIGdldE1vZGVsUGFyc2VyKCkgewotCQlpZiAodGhpcy5wYXJzZXIgPT0gbnVsbCkgewotCQkJdGhpcy5wYXJzZXIgPSBjcmVhdGVNb2RlbFBhcnNlcigpOwotCQl9Ci0JCXJldHVybiB0aGlzLnBhcnNlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MTW9kZWxQYXJzZXIgY3JlYXRlTW9kZWxQYXJzZXIoKSB7Ci0JCXJldHVybiBuZXcgWE1MTW9kZWxQYXJzZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBYTUxNb2RlbFVwZGF0ZXIgZ2V0TW9kZWxVcGRhdGVyKCkgewotCQlpZiAodGhpcy51cGRhdGVyID09IG51bGwpIHsKLQkJCXRoaXMudXBkYXRlciA9IGNyZWF0ZU1vZGVsVXBkYXRlcigpOwotCQl9Ci0JCXJldHVybiB0aGlzLnVwZGF0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTE1vZGVsVXBkYXRlciBjcmVhdGVNb2RlbFVwZGF0ZXIoKSB7Ci0JCXJldHVybiBuZXcgWE1MTW9kZWxVcGRhdGVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVSZWZyZXNoKCkgewotCQlpZiAoIXRoaXMucmVmcmVzaCkKLQkJCXJldHVybjsKLQkJWE1MTW9kZWxOb3RpZmllciBub3RpZmllciA9IGdldE1vZGVsTm90aWZpZXIoKTsKLQkJYm9vbGVhbiBpc0NoYW5naW5nID0gbm90aWZpZXIuaXNDaGFuZ2luZygpOwotCQlpZiAoIWlzQ2hhbmdpbmcpCi0JCQlub3RpZmllci5iZWdpbkNoYW5naW5nKHRydWUpOwotCQlYTUxNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRNb2RlbFBhcnNlcigpOwotCQlzZXRBY3RpdmUocGFyc2VyKTsKLQkJdGhpcy5kb2N1bWVudC5yZW1vdmVDaGlsZE5vZGVzKCk7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uTGlzdCgpLCBudWxsKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCWlmICghaXNDaGFuZ2luZykKLQkJCQlub3RpZmllci5lbmRDaGFuZ2luZygpOwotCQkJdGhpcy5yZWZyZXNoID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGlmIHRoZSBET00gaW1wbGVtZW50YXRpb24gaW1wbGVtZW50cyBhIHNwZWNpZmljIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmVUaGUKLQkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdCAoY2FzZS1pbnNlbnNpdGl2ZSkuIFRoZSB2YWx1ZXMKLQkgKiAgICAgICAgICAgIHVzZWQgYnkgRE9NIGZlYXR1cmVzIGFyZSBkZWZpbmVkIHRocm91Z2hvdXQgdGhlIERPTSBMZXZlbCAyCi0JICogICAgICAgICAgICBzcGVjaWZpY2F0aW9ucyBhbmQgbGlzdGVkIGluIHRoZSBzZWN0aW9uLiBUaGUgbmFtZSBtdXN0IGJlCi0JICogICAgICAgICAgICBhbiBYTUwgbmFtZS4gVG8gYXZvaWQgcG9zc2libGUgY29uZmxpY3RzLCBhcyBhIGNvbnZlbnRpb24sCi0JICogICAgICAgICAgICBuYW1lcyByZWZlcnJpbmcgdG8gZmVhdHVyZXMgZGVmaW5lZCBvdXRzaWRlIHRoZSBET00KLQkgKiAgICAgICAgICAgIHNwZWNpZmljYXRpb24gc2hvdWxkIGJlIG1hZGUgdW5pcXVlIGJ5IHJldmVyc2luZyB0aGUgbmFtZSBvZgotCSAqICAgICAgICAgICAgdGhlIEludGVybmV0IGRvbWFpbiBuYW1lIG9mIHRoZSBwZXJzb24gKG9yIHRoZSBvcmdhbml6YXRpb24KLQkgKiAgICAgICAgICAgIHRoYXQgdGhlIHBlcnNvbiBiZWxvbmdzIHRvKSB3aG8gZGVmaW5lcyB0aGUgZmVhdHVyZSwKLQkgKiAgICAgICAgICAgIGNvbXBvbmVudCBieSBjb21wb25lbnQsIGFuZCB1c2luZyB0aGlzIGFzIGEgcHJlZml4LiBGb3IKLQkgKiAgICAgICAgICAgIGluc3RhbmNlLCB0aGUgVzNDIFNWRyBXb3JraW5nIEdyb3VwIGRlZmluZXMgdGhlIGZlYXR1cmUKLQkgKiAgICAgICAgICAgICJvcmcudzNjLmRvbS5zdmciLgotCSAqIEBwYXJhbSB2ZXJzaW9uVGhpcwotCSAqICAgICAgICAgICAgaXMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBmZWF0dXJlIHRvIHRlc3QuIEluIExldmVsIDIsCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIGNhbiBiZSBlaXRoZXIgIjIuMCIgb3IgIjEuMCIuIElmIHRoZSB2ZXJzaW9uIGlzCi0JICogICAgICAgICAgICBub3Qgc3BlY2lmaWVkLCBzdXBwb3J0aW5nIGFueSB2ZXJzaW9uIG9mIHRoZSBmZWF0dXJlIGNhdXNlcwotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCB0byByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmVhdHVyZSBpcyBpbXBsZW1lbnRlZCBpbiB0aGUKLQkgKiAgICAgICAgIHNwZWNpZmllZCB2ZXJzaW9uLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh2ZXJzaW9uICE9IG51bGwpIHsKLQkJCWlmICghdmVyc2lvbi5lcXVhbHMoIjEuMCIpICYmICF2ZXJzaW9uLmVxdWFscygiMi4wIikpIHsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZlYXR1cmUuZXF1YWxzSWdub3JlQ2FzZSgiQ29yZSIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZmVhdHVyZS5lcXVhbHNJZ25vcmVDYXNlKCJYTUwiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZURvY3VtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgaW50ZXJuYWxDcmVhdGVEb2N1bWVudCgpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gbmV3IERvY3VtZW50SW1wbCgpOwotCQlkb2N1bWVudC5zZXRNb2RlbCh0aGlzKTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCWJvb2xlYW4gaXNSZXBhcnNpbmcoKSB7Ci0JCXJldHVybiAoYWN0aXZlICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIG5hbWVDaGFuZ2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbmFtZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRBY3RpdmVQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldE1vZGVsVXBkYXRlcigpOwotCQkJc2V0QWN0aXZlKHVwZGF0ZXIpOwotCQkJdXBkYXRlci5pbml0aWFsaXplKCk7Ci0JCQl1cGRhdGVyLmNoYW5nZU5hbWUobm9kZSk7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCX0KLQkJLy8gbm90aWZpY2F0aW9uIGlzIGFscmVhZHkgc2VudAotCX0KLQotCS8qKgotCSAqIG5ld01vZGVsIG1ldGhvZAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGZvciB0aGUgY2FzZQotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsICYmIGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gc3RydWN0dXJlZERvY3VtZW50KQotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0KLQkJaW50ZXJuYWxTZXROZXdEb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFNldE5ld0RvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKChmbGF0Tm9kZXMgPT0gbnVsbCkgfHwgKGZsYXROb2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh0aGlzLmRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGJlaW5nIGNvbnN0cnVjdGVkCi0JCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0QWN0aXZlVXBkYXRlcigpOwotCQlpZiAodXBkYXRlciAhPSBudWxsKSB7IC8vIGJlaW5nIHVwZGF0ZWQKLQkJCXRyeSB7Ci0JCQkJdXBkYXRlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhmbGF0Tm9kZXMsIG51bGwpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJCXRoaXMucmVmcmVzaCA9IHRydWU7Ci0JCQkJaGFuZGxlUmVmcmVzaCgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJfQotCQkJLy8gLy8gZm9yIG5ldyBtb2RlbCwgd2UgbWlnaHQgbmVlZCB0bwotCQkJLy8gLy8gcmUtaW5pdCwgZS5nLiBpZiBzb21lb25lIGNhbGxzIHNldFRleHQKLQkJCS8vIC8vIG9uIGFuIGV4aXN0aW5nIG1vZGVsCi0JCQkvLyBjaGVja0ZvclJlaW5pdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWJvb2xlYW4gaXNDaGFuZ2luZyA9IG5vdGlmaWVyLmlzQ2hhbmdpbmcoKTsKLQkJLy8gY2FsbCBldmVuIGlmIGNoYW5naW5nIHRvIG5vdGlmeSBkb2luZyBuZXcgbW9kZWwKLQkJZ2V0TW9kZWxOb3RpZmllcigpLmJlZ2luQ2hhbmdpbmcodHJ1ZSk7Ci0JCVhNTE1vZGVsUGFyc2VyIHBhcnNlciA9IGdldE1vZGVsUGFyc2VyKCk7Ci0JCXNldEFjdGl2ZShwYXJzZXIpOwotCQl0aGlzLmRvY3VtZW50LnJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhmbGF0Tm9kZXMsIG51bGwpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJLy8gbWVhbmluZ2xlc3MgdG8gcmVmcmVzaCwgYmVjYXVzZSB0aGUgcmVzdWx0IG1pZ2h0IGJlIHRoZSBzYW1lCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQlpZiAoIWlzQ2hhbmdpbmcpIHsKLQkJCQlnZXRNb2RlbE5vdGlmaWVyKCkuZW5kQ2hhbmdpbmcoKTsKLQkJCX0KLQkJCS8vIGlnbm9yZSByZWZyZXNoCi0JCQl0aGlzLnJlZnJlc2ggPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRBY3RpdmVVcGRhdGVyKCk7Ci0JCWlmICh1cGRhdGVyICE9IG51bGwpIHsgLy8gYmVpbmcgdXBkYXRlZAotCQkJLy8gY2xlYW51cCB1cGRhdGVyIHN0YWZmcwotCQkJdHJ5IHsKLQkJCQl1cGRhdGVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG51bGwsIG51bGwpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJCXRoaXMucmVmcmVzaCA9IHRydWU7Ci0JCQkJaGFuZGxlUmVmcmVzaCgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJfQotCQkJLy8gSSBndWVzcyBubyBjaGFuYWdlIG1lYW5zIHRoZSBtb2RlbCBjb3VsZCBub3QgbmVlZCByZS1pbml0Ci0JCQkvLyBjaGVja0ZvclJlaW5pdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbm9kZXNSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gZXZlbnQuZ2V0T2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gZXZlbnQuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldEFjdGl2ZVVwZGF0ZXIoKTsKLQkJaWYgKHVwZGF0ZXIgIT0gbnVsbCkgeyAvLyBiZWluZyB1cGRhdGVkCi0JCQl0cnkgewotCQkJCXVwZGF0ZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJaWYgKGV4LmdldENsYXNzKCkuZXF1YWxzKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24uY2xhc3MpKSB7Ci0JCQkJCUxvZ2dlci50cmFjZUV4Y2VwdGlvbihUUkFDRV9QQVJTRVJfTUFOQUdFTUVOVF9FWENFUFRJT04sIGV4KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJCX0KLQkJCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCX0KLQkJCS8vIGNoZWNrRm9yUmVpbml0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJWE1MTW9kZWxOb3RpZmllciBub3RpZmllciA9IGdldE1vZGVsTm90aWZpZXIoKTsKLQkJYm9vbGVhbiBpc0NoYW5naW5nID0gbm90aWZpZXIuaXNDaGFuZ2luZygpOwotCQlpZiAoIWlzQ2hhbmdpbmcpCi0JCQlub3RpZmllci5iZWdpbkNoYW5naW5nKCk7Ci0JCVhNTE1vZGVsUGFyc2VyIHBhcnNlciA9IGdldE1vZGVsUGFyc2VyKCk7Ci0JCXNldEFjdGl2ZShwYXJzZXIpOwotCQl0cnkgewotCQkJcGFyc2VyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCWlmICghaXNDaGFuZ2luZykgewotCQkJCW5vdGlmaWVyLmVuZENoYW5naW5nKCk7Ci0JCQkJaGFuZGxlUmVmcmVzaCgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiByZWdpb25DaGFuZ2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBldmVudC5nZXRSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldEFjdGl2ZVVwZGF0ZXIoKTsKLQkJaWYgKHVwZGF0ZXIgIT0gbnVsbCkgeyAvLyBiZWluZyB1cGRhdGVkCi0JCQl0cnkgewotCQkJCXVwZGF0ZXIuY2hhbmdlUmVnaW9uKGV2ZW50LCBmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCX0KLQkJCS8vIGNoZWNrRm9yUmVpbml0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJWE1MTW9kZWxOb3RpZmllciBub3RpZmllciA9IGdldE1vZGVsTm90aWZpZXIoKTsKLQkJYm9vbGVhbiBpc0NoYW5naW5nID0gbm90aWZpZXIuaXNDaGFuZ2luZygpOwotCQlpZiAoIWlzQ2hhbmdpbmcpCi0JCQlub3RpZmllci5iZWdpbkNoYW5naW5nKCk7Ci0JCVhNTE1vZGVsUGFyc2VyIHBhcnNlciA9IGdldE1vZGVsUGFyc2VyKCk7Ci0JCXNldEFjdGl2ZShwYXJzZXIpOwotCQl0cnkgewotCQkJcGFyc2VyLmNoYW5nZVJlZ2lvbihldmVudCwgZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJaGFuZGxlUmVmcmVzaCgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKSB7Ci0JCQkJbm90aWZpZXIuZW5kQ2hhbmdpbmcoKTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiByZWdpb25zUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucyA9IGV2ZW50LmdldE9sZFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMgPSBldmVudC5nZXROZXdSZWdpb25zKCk7Ci0JCWlmIChvbGRSZWdpb25zID09IG51bGwgJiYgbmV3UmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldEFjdGl2ZVVwZGF0ZXIoKTsKLQkJaWYgKHVwZGF0ZXIgIT0gbnVsbCkgeyAvLyBiZWluZyB1cGRhdGVkCi0JCQl0cnkgewotCQkJCXVwZGF0ZXIucmVwbGFjZVJlZ2lvbnMoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJCXRoaXMucmVmcmVzaCA9IHRydWU7Ci0JCQkJaGFuZGxlUmVmcmVzaCgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJfQotCQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQkJCXJldHVybjsKLQkJfQotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gZ2V0TW9kZWxOb3RpZmllcigpOwotCQlib29sZWFuIGlzQ2hhbmdpbmcgPSBub3RpZmllci5pc0NoYW5naW5nKCk7Ci0JCWlmICghaXNDaGFuZ2luZykKLQkJCW5vdGlmaWVyLmJlZ2luQ2hhbmdpbmcoKTsKLQkJWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0TW9kZWxQYXJzZXIoKTsKLQkJc2V0QWN0aXZlKHBhcnNlcik7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucmVwbGFjZVJlZ2lvbnMoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCWlmICghaXNDaGFuZ2luZykgewotCQkJCW5vdGlmaWVyLmVuZENoYW5naW5nKCk7Ci0JCQkJaGFuZGxlUmVmcmVzaCgpOwotCQkJfQotCQl9Ci0JCS8vIGNoZWNrRm9yUmVpbml0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21FZGl0KCkgewotCQlpZiAoIWlzU2hhcmVkKCkpIHsKLQkJCS8vIHRoaXMuZG9jdW1lbnQucmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCQkvLyB0aGlzLmRvY3VtZW50LnJlbGVhc2VEb2N1bWVudFR5cGUoKTsKLQkJfQotCQlzdXBlci5yZWxlYXNlRnJvbUVkaXQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JCWlmICghaXNTaGFyZWQoKSkgewotCQkJLy8gdGhpcy5kb2N1bWVudC5yZWxlYXNlU3R5bGVTaGVldHMoKTsKLQkJCS8vIHRoaXMuZG9jdW1lbnQucmVsZWFzZURvY3VtZW50VHlwZSgpOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmUoT2JqZWN0IGFjdGl2ZSkgewotCQl0aGlzLmFjdGl2ZSA9IGFjdGl2ZTsKLQkJLy8gc2lkZSBlZmZlY3QKLQkJLy8gd2hlbiBldmVyIGJlY29tZXMgYWN0aXZlLCBiZXN1cmUgdGFnTmFtZUNhY2hlIGlzIGNsZWFyZWQKLQkJLy8gKGFuZCBub3QgdXNlZCkKLQkJaWYgKGFjdGl2ZSA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudC5hY3RpdmF0ZVRhZ05hbWVDYWNoZSh0cnVlKTsKLQkJfQotCQllbHNlIHsKLQkJCWRvY3VtZW50LmFjdGl2YXRlVGFnTmFtZUNhY2hlKGZhbHNlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdG9yKElTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yKSB7Ci0JCXRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsTm90aWZpZXIoWE1MTW9kZWxOb3RpZmllciBub3RpZmllcikgewotCQl0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxQYXJzZXIoWE1MTW9kZWxQYXJzZXIgcGFyc2VyKSB7Ci0JCXRoaXMucGFyc2VyID0gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsVXBkYXRlcihYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlcikgewotCQl0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyOwotCX0KLQotCS8qKgotCSAqIHNldFN0cnVjdHVyZWREb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkU3RydWN0dXJlZERvY3VtZW50ID0gc3VwZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50KQotCQkJcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvCi0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkKLQkJCW9sZFN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLnNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWludGVybmFsU2V0TmV3RG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFRhZ0NoYW5nZWQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRBY3RpdmVQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldE1vZGVsVXBkYXRlcigpOwotCQkJc2V0QWN0aXZlKHVwZGF0ZXIpOwotCQkJdXBkYXRlci5pbml0aWFsaXplKCk7Ci0JCQl1cGRhdGVyLmNoYW5nZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCWdldE1vZGVsTm90aWZpZXIoKS5zdGFydFRhZ0NoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogdmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0QWN0aXZlUGFyc2VyKCkgPT0gbnVsbCkgewotCQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRNb2RlbFVwZGF0ZXIoKTsKLQkJCXNldEFjdGl2ZSh1cGRhdGVyKTsKLQkJCXVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCQkJdXBkYXRlci5jaGFuZ2VWYWx1ZShub2RlKTsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJfQotCQlnZXRNb2RlbE5vdGlmaWVyKCkudmFsdWVDaGFuZ2VkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSAzLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZyYWdtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZyYWdtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU4ODJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRGcmFnbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBEb2N1bWVudEZyYWdtZW50SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRGcmFnbWVudEltcGwgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIGltcGxlbWVudHMgRG9jdW1lbnRGcmFnbWVudCB7Ci0KLQkvKioKLQkgKiBEb2N1bWVudEZyYWdtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudEZyYWdtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2N1bWVudEZyYWdtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50SW1wbAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudEZyYWdtZW50SW1wbChEb2N1bWVudEZyYWdtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRG9jdW1lbnRGcmFnbWVudEltcGwgY2xvbmVkID0gbmV3IERvY3VtZW50RnJhZ21lbnRJbXBsKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCQkKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjZG9jdW1lbnQtZnJhZ21lbnQiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRE9DVU1FTlRfRlJBR01FTlRfTk9ERTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4MmZmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk2OTk5IC0gSW5lZmZpY2llbnQgdXNlIG9mIG5ldyBTdHJpbmcoKQotICogICAgIERhdmlkIENhcnZlciAoSW50YWxpbykgLSBidWcgMjczMDA0IC0gYWRkIGNoZWNrIGZvciB2YWxpZCB4bWwgY2hhcmFjdGVycyBpbiBjcmVhdGVBdHRyaWJ1dGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi0vLyBmb3Igb3JnLmFwYWNoZS54ZXJjZXMgMy4yLjEKLS8vIGltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlscy5YTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzOwotLy8gRE1XIG1vZGlmaWVkIGZvciBYTUw0SiA0LjAuMQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuZG9tLlRyZWVXYWxrZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGwuQ29tbWVudEVsZW1lbnRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTENoYXJFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vdGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5yYW5nZXMuRG9jdW1lbnRSYW5nZTsKLWltcG9ydCBvcmcudzNjLmRvbS5yYW5nZXMuUmFuZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLkRvY3VtZW50VHJhdmVyc2FsOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLlRyZWVXYWxrZXI7Ci0KLQotLyoqCi0gKiBEb2N1bWVudEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50SW1wbCBleHRlbmRzIE5vZGVDb250YWluZXIgaW1wbGVtZW50cyBJRE9NRG9jdW1lbnQsIERvY3VtZW50UmFuZ2UsIERvY3VtZW50VHJhdmVyc2FsIHsKLQotCXByaXZhdGUgc3RhdGljIGludCBtYXhEb2NUeXBlU2VhcmNoID0gNTAwOwotCXByaXZhdGUgc3RhdGljIGludCBub01heFNlYXJjaCA9IC0xOwotCS8qKgotCSAqIEludGVybmFsLXVzZSBvbmx5IGNsYXNzLiBUaGlzIGNsYXNzIHdhcyBhZGRlZCB0byBiZXR0ZXIgYWJsZSB0byBoYW5kbGUKLQkgKiByZXBldGV0aXZlIHJlcXVlc3QgZm9yIGdldEVsZW1lbnRzQnlUYWdOYW1lLiBUaGUgY2FjaGUgaXMgY2xlYXJlZCB3aGVuCi0JICogZXZlciB0aGUgZG9jdW1lbnQgY2hhbmdlcyBhdCBhbGwsIHNvIHN0aWxsIG5vdCByZWFsIGVmZmljaWVudCwKLQkgKi8KLQljbGFzcyBUYWdOYW1lQ2FjaGUgewotCi0JCXByaXZhdGUgYm9vbGVhbiBhY3RpdmUgPSB0cnVlOwotCi0JCXByaXZhdGUgTWFwIGNhY2hlOwotCi0JCXB1YmxpYyBUYWdOYW1lQ2FjaGUoKSB7Ci0JCQlzdXBlcigpOwotCQkJY2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBiCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhY3RpdmF0ZShib29sZWFuIGIpIHsKLQkJCWFjdGl2ZSA9IGI7Ci0JCQlpZiAoIWIpCi0JCQkJY2xlYXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEl0ZW0oU3RyaW5nIHRhZ25hbWUsIE5vZGVMaXN0SW1wbCBub2RlbGlzdCkgewotCQkJaWYgKHRhZ25hbWUgPT0gbnVsbCB8fCBub2RlbGlzdCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWNhY2hlLnB1dCh0YWduYW1lLCBub2RlbGlzdCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCWNhY2hlLmNsZWFyKCk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZUxpc3RJbXBsIGdldEl0ZW0oU3RyaW5nIHRhZ05hbWUpIHsKLQkJCU5vZGVMaXN0SW1wbCByZXN1bHQgPSBudWxsOwotCQkJaWYgKGFjdGl2ZSkgewotCQkJCXJlc3VsdCA9IChOb2RlTGlzdEltcGwpIGNhY2hlLmdldCh0YWdOYW1lKTsKLQkJCQkvLyBpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnRzQnlUYWduYW1lIGZyb20gY2FjaGU6ICIgKwotCQkJCS8vIHRhZ05hbWUpOwotCQkJCS8vIH0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgTGltaXRlZENhY2hlIGV4dGVuZHMgTGlua2VkSGFzaE1hcCB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NJWkUgPSAxMDsKLQkJcHVibGljIExpbWl0ZWRDYWNoZSgpIHsKLQkJCXN1cGVyKDAsIDAuNzVmLCB0cnVlKTsKLQkJfQotCi0JCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUVsZGVzdEVudHJ5KGphdmEudXRpbC5NYXAuRW50cnkgZW50cnkpIHsKLQkJCXJldHVybiBzaXplKCkgPiBNQVhfU0laRTsKLQkJfQotCX0KLQotCS8vIHRoaXMgaXMgYSBjb25zdGFudCBqdXN0IHRvIGdpdmUgY29tcGlsZS10aW1lIGNvbnRyb2wgb3ZlcgotCS8vIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgY2FjaGUuIElmLCBpbiBmdXR1cmUsIGl0cyBmb3VuZCB0aGF0Ci0JLy8gdGhlcmUgYXJlIG5vIChvciBmZXcpICJkdXBsaWNhdGUgcmVxdWVzdHMiIC4uLiB0aGVuIHRoaXMgY2FjaGUKLQkvLyBpcyBub3QgbmVlZGVkLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNldGFnbmFtZWNhY2hlID0gdHJ1ZTsKLQotCS8vIHByaXZhdGUgRG9jdW1lbnRUeXBlQWRhcHRlciBkb2N1bWVudFR5cGVBZGFwdGVyID0gbnVsbDsKLQotCXByaXZhdGUgRE9NTW9kZWxJbXBsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIFRhZ05hbWVDYWNoZSB0YWdOYW1lQ2FjaGU7Ci0KLQlwcml2YXRlIE1hcCBmQ01DYWNoZTsKLQkvKioKLQkgKiBEb2N1bWVudEltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCQlpZiAodXNldGFnbmFtZWNhY2hlKSB7Ci0JCQl0YWdOYW1lQ2FjaGUgPSBuZXcgVGFnTmFtZUNhY2hlKCk7Ci0JCX0KLQkJZkNNQ2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IExpbWl0ZWRDYWNoZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2N1bWVudEltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgRG9jdW1lbnRJbXBsCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50SW1wbChEb2N1bWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQkJaWYgKHVzZXRhZ25hbWVjYWNoZSkgewotCQkJdGFnTmFtZUNhY2hlID0gbmV3IFRhZ05hbWVDYWNoZSgpOwotCQl9Ci0JCWZDTUNhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBMaW1pdGVkQ2FjaGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGIKLQkgKi8KLQl2b2lkIGFjdGl2YXRlVGFnTmFtZUNhY2hlKGJvb2xlYW4gYikgewotCQl0YWdOYW1lQ2FjaGUuYWN0aXZhdGUoYik7Ci0JfQotCi0JLyoqCi0JICogPHA+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/Ci0JICogCi0JICogVE9ETzogTmVlZHMgdG8gbm90aWZ5IFVzZXJEYXRhSGFuZGxlcnMgZm9yIHRoZSBub2RlIGlmIGFueQotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBub2RlIHRvIG1vdmUgaW50byB0aGlzIGRvY3VtZW50LgotCSAqIEByZXR1cm4gVGhlIGFkb3B0ZWQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvcGVyYXRpb24KLQkgKiAgICAgICAgIGZhaWxzLCBzdWNoIGFzIHdoZW4gdGhlIHNvdXJjZSBub2RlIGNvbWVzIGZyb20gYSBkaWZmZXJlbnQKLQkgKiAgICAgICAgIGltcGxlbWVudGF0aW9uLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9UX1NVUFBPUlRFRF9FUlI6IFJhaXNlZCBpZiB0aGUgc291cmNlIG5vZGUgaXMgb2YgdHlwZQotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkRPQ1VNRU5UPC9jb2RlPiw8Y29kZT5ET0NVTUVOVF9UWVBFPC9jb2RlPi4KLQkgKiAgICAgICAgICAgICAgICA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgd2hlbiB0aGUgc291cmNlIG5vZGUKLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seS4KLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLk5vZGUgYWRvcHROb2RlKG9yZy53M2MuZG9tLk5vZGUgc291cmNlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1RhZ05hbWVWYWxpZGl0eShTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAoIWlzVmFsaWROYW1lKHRhZ05hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0NIQVJBQ1RFUl9FUlIsIGNyZWF0ZURPTUV4Y2VwdGlvbk1lc3NhZ2UoRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiwgdGFnTmFtZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlEb2N1bWVudEltcGwgY2xvbmVkID0gbmV3IERvY3VtZW50SW1wbCh0aGlzKTsKLQkJaWYgKGRlZXApCi0JCQljbG9uZWQuaW1wb3J0Q2hpbGROb2Rlcyh0aGlzLCB0cnVlKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVBdHRyaWJ1dGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQXR0ciBjcmVhdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQljaGVja1RhZ05hbWVWYWxpZGl0eShuYW1lKTsKLQkJQXR0ckltcGwgYXR0ciA9IG5ldyBBdHRySW1wbCgpOwotCQlhdHRyLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWF0dHIuc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEF0dHIgY3JlYXRlQXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQljaGVja1RhZ05hbWVWYWxpZGl0eShuYW1lKTsKLQkJQXR0ckltcGwgYXR0ciA9IG5ldyBBdHRySW1wbCgpOwotCQlhdHRyLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWF0dHIuc2V0TmFtZShuYW1lKTsKLQkJYXR0ci5zZXROYW1lc3BhY2VVUkkodXJpKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQ0RBVEFTZWN0aW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ0RBVEFTZWN0aW9uIGNyZWF0ZUNEQVRBU2VjdGlvbihTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIGFsbG93IENEQVRBIHNlY3Rpb24KLQkJLy8gaWYgKCFpc1hNTFR5cGUoKSkgewotCQkvLyB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgbmV3Ci0JCS8vIFN0cmluZygpKTsKLQkJLy8gfQotCQlDREFUQVNlY3Rpb25JbXBsIGNkYXRhID0gbmV3IENEQVRBU2VjdGlvbkltcGwoKTsKLQkJY2RhdGEuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWNkYXRhLnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiBjZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVDb21tZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQ29tbWVudAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENvbW1lbnQgY3JlYXRlQ29tbWVudChTdHJpbmcgZGF0YSkgewotCQlDb21tZW50SW1wbCBjb21tZW50ID0gbmV3IENvbW1lbnRJbXBsKCk7Ci0JCWNvbW1lbnQuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWNvbW1lbnQuc2V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIGJvb2xlYW4gaXNKU1BUYWcpIHRocm93cyBET01FeGNlcHRpb24gewotCQlFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmICghaXNKU1BUeXBlKCkgJiYgaXNKU1BUYWcpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgRE9NTWVzc2FnZXMuSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSKTsKLQkJfQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBjcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotCQllbGVtZW50LnNldEpTUFRhZyhpc0pTUFRhZyk7Ci0JCUNvbW1lbnRFbGVtZW50UmVnaXN0cnkgcmVnaXN0cnkgPSBDb21tZW50RWxlbWVudFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCWlmIChyZWdpc3RyeS5zZXR1cENvbW1lbnRFbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlyZXN1bHQgPSBlbGVtZW50OwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9DSEFSQUNURVJfRVJSLCBET01NZXNzYWdlcy5JTlZBTElEX0NIQVJBQ1RFUl9FUlIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRG9jdHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIERvY3VtZW50VHlwZSBjcmVhdGVEb2N0eXBlKFN0cmluZyBuYW1lKSB7Ci0JCURvY3VtZW50VHlwZUltcGwgZG9jVHlwZSA9IG5ldyBEb2N1bWVudFR5cGVJbXBsKCk7Ci0JCWRvY1R5cGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJZG9jVHlwZS5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gZG9jVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVEb2N1bWVudEZyYWdtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSB7Ci0JCURvY3VtZW50RnJhZ21lbnRJbXBsIGZyYWdtZW50ID0gbmV3IERvY3VtZW50RnJhZ21lbnRJbXBsKCk7Ci0JCWZyYWdtZW50LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXJldHVybiBmcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVFbGVtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgdGFnTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWNoZWNrVGFnTmFtZVZhbGlkaXR5KHRhZ05hbWUpOwotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBuZXcgRWxlbWVudEltcGwoKTsKLQkJZWxlbWVudC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQllbGVtZW50LnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnROUyhTdHJpbmcgdXJpLCBTdHJpbmcgdGFnTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZE5hbWUodGFnTmFtZSkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiwgRE9NTWVzc2FnZXMuSU5WQUxJRF9DSEFSQUNURVJfRVJSKTsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCWVsZW1lbnQuc2V0TmFtZXNwYWNlVVJJKHVyaSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUVudGl0eSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVudGl0eQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEVudGl0eSBjcmVhdGVFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJRW50aXR5SW1wbCBlbnRpdHkgPSBuZXcgRW50aXR5SW1wbCgpOwotCQllbnRpdHkuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJZW50aXR5LnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRW50aXR5UmVmZXJlbmNlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRW50aXR5UmVmZXJlbmNlIGNyZWF0ZUVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNYTUxUeXBlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCBET01NZXNzYWdlcy5OT1RfU1VQUE9SVEVEX0VSUik7Ci0JCX0KLQotCQlFbnRpdHlSZWZlcmVuY2VJbXBsIHJlZiA9IG5ldyBFbnRpdHlSZWZlcmVuY2VJbXBsKCk7Ci0JCXJlZi5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlyZWYuc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgTm9kZUl0ZXJhdG9yIGNyZWF0ZU5vZGVJdGVyYXRvcihOb2RlIHJvb3QsIGludCB3aGF0VG9TaG93LCBOb2RlRmlsdGVyIGZpbHRlciwgYm9vbGVhbiBlbnRpdHlSZWZlcmVuY2VFeHBhbnNpb24pIHsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJvb3QgPSB0aGlzOwotCQlyZXR1cm4gbmV3IE5vZGVJdGVyYXRvckltcGwocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVOb3RhdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vdGF0aW9uCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgTm90YXRpb24gY3JlYXRlTm90YXRpb24oU3RyaW5nIG5hbWUpIHsKLQkJTm90YXRpb25JbXBsIG5vdGF0aW9uID0gbmV3IE5vdGF0aW9uSW1wbCgpOwotCQlub3RhdGlvbi5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlub3RhdGlvbi5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gbm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpIHRocm93cyBET01FeGNlcHRpb24gewotCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gbmV3IFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwoKTsKLQkJcGkuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJcGkuc2V0VGFyZ2V0KHRhcmdldCk7Ci0JCWlmIChkYXRhICE9IG51bGwpCi0JCQlwaS5zZXREYXRhKGRhdGEpOwotCQlyZXR1cm4gcGk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFJhbmdlIGNyZWF0ZVJhbmdlKCkgewotCQlyZXR1cm4gbmV3IFJhbmdlSW1wbCgpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZVRleHROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uVGV4dAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFRleHQgY3JlYXRlVGV4dE5vZGUoU3RyaW5nIGRhdGEpIHsKLQkJVGV4dEltcGwgdGV4dCA9IG5ldyBUZXh0SW1wbCgpOwotCQl0ZXh0LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXRleHQuc2V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRyZWUgd2FsawotCSAqLwotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnczYy5kb20udHJhdmVyc2FsLkRvY3VtZW50VHJhdmVyc2FsI2NyZWF0ZVRyZWVXYWxrZXIob3JnLnczYy5kb20uTm9kZSwKLQkgKiAgICAgIGludCwgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXIsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFRyZWVXYWxrZXIgY3JlYXRlVHJlZVdhbGtlcihOb2RlIHJvb3QsIGludCB3aGF0VG9TaG93LCBOb2RlRmlsdGVyIGZpbHRlciwgYm9vbGVhbiBlbnRpdHlSZWZlcmVuY2VFeHBhbnNpb24pIHsKLQkJaWYgKHJvb3QgPT0gbnVsbCkgewotCQkJU3RyaW5nIG1zZyA9IERPTU1lc3NhZ2VzLk5PVF9TVVBQT1JURURfRVJSICsgIiAtIFByb2dyYW0gRXJyb3I6IHJvb3Qgbm9kZSBjYW4gbm90IGJlIG51bGwgZm9yIFRyZWVXYWxrZXIiOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsIG1zZyk7Ci0JCX0KLQkJLy8gSVNTVUU6IHdlIGp1c3QgdXNlIFhlcmNlcyBpbXBsZW1lbnRhdGlvbiBmb3Igbm93LCBidXQgbG9uZ2VyIHRlcm0sCi0JCS8vIHdlIHNob3VsZCBtYWtlIGEKLQkJLy8gdGhyZWFkL2pvYiBzYWZlIHZlcnNpb24gKGFzIHdlbGwgYXMgbm90IHJlbHkgb24gWGVyY2VzICJpbXBsIgotCQkvLyBjbGFzcy4KLQkJcmV0dXJuIG5ldyBUcmVlV2Fsa2VySW1wbChyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGVudGl0eVJlZmVyZW5jZUV4cGFuc2lvbik7Ci0KLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50VHlwZSBmaW5kRG9jdHlwZShOb2RlIG5vZGUpIHsKLQkJCi0JCWludCBjb3VudFNlYXJjaCA9IDA7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjb3VudFNlYXJjaCsrID4gbWF4RG9jVHlwZVNlYXJjaCkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gRE9DVU1FTlRfVFlQRV9OT0RFICYmIGNoaWxkIGluc3RhbmNlb2YgRG9jdW1lbnRUeXBlKSB7Ci0JCQkJcmV0dXJuIChEb2N1bWVudFR5cGUpIGNoaWxkOwotCQkJfQotCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBFTEVNRU5UX05PREUgJiYgKChJRE9NRWxlbWVudCkgY2hpbGQpLmlzQ29tbWVudFRhZygpKSB7Ci0JCQkJLy8gc2VhcmNoIERPQ1RZUEUgaW5zaWRlIG9mIGdlbmVyaWMgY29tbWVudCBlbGVtZW50Ci0JCQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBmaW5kRG9jdHlwZShjaGlsZCk7Ci0JCQkJaWYgKGRvY1R5cGUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZG9jVHlwZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnQgZmluZERvY3VtZW50RWxlbWVudChTdHJpbmcgZG9jTmFtZSwgTm9kZSBub2RlLCBOb2RlW10gZmlyc3RGb3VuZCwgaW50IG1heCkgewotCQlpbnQgY291bnRTZWFyY2ggPSAwOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkKLQkJCS8qIAotCQkJICogbWF4RG9jVHlwZVNlYXJjaCBsaW1pdHMgYWRkZWQgdmlhIGJ1ZyAxNTE5MjkKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTE5MjkKLQkJCSAqIGJ1dCwgaW4gb3RoZXIgY29udGV4dHMsIAotCQkJICogaWYgbm9NYXhTZWFyY2ggaXMgc3BlY2lmaWVkLCB0aGVuIGRvIG5vdCAiYnJlYWsgb3V0IiBvZiBsb25nIHNlYXJjaGVzIAotCQkJICogKi8KLQkJCWlmIChtYXggIT0gbm9NYXhTZWFyY2ggJiYgY291bnRTZWFyY2grKyA+IG1heCkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgY2hpbGQ7Ci0JCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJCUVsZW1lbnQgZG9jRWxlbWVudCA9IGZpbmREb2N1bWVudEVsZW1lbnQoZG9jTmFtZSwgZWxlbWVudCwgZmlyc3RGb3VuZCwgbWF4KTsKLQkJCQlpZiAoZG9jRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkb2NFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYWRkZWQgJ2Vsc2UgY29udGludWUnIHRvIGJldHRlciBoYW5kbGUgY2FzZXMgd2hlcmUKLQkJCQkJLy8gdGhlcmUgaXMgIm1vcmUgdGhhbiBvbmUgcm9vdCIgZWxlbWVudAotCQkJCQkvLyBlc3BlY2lhbGx5IGNvbXBsaWNhdGVkIGJ5IENvbW1lbnRFbGVtZW50cywgd2hpY2ggYXJlCi0JCQkJCS8vIHNvbWV0aW1lcyB0cmVhdGVkIGFzIGVsZW1lbnRzLCBidXQgc2hvdWxkCi0JCQkJCS8vIGJlIHRyZWF0ZWQgYXMgY29tbWVudHMgaW4gdGhpcyBjb250ZXh0LgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBub3RlOiB0aGUgIm5hbWUiIHdvbid0IG1hdGNoIGluIHRoZSBldmVudCBvZiBhIGpzcCB0YWcgLi4uIGJ1dAotCQkJLy8gaW5jYXNlCi0JCQkvLyB0aGUgbmFtZSBpcyBudWxsLCB3ZSBkbyBub3Qgd2FudCB0aGUganNwIGVsZW1lbnQgcmV0dXJuZWQgYXMKLQkJCS8vIGRvY3VtZW50RWxlbWVudAotCQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChkb2NOYW1lID09IG51bGwpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkvLyB1c2UgbG9jYWwgbmFtZSBmb3IgbmFtZXNwYWNlCi0JCQlTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQkJCWlmIChsb2NhbE5hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChpc1hNTFR5cGUoKSkgewotCQkJCWlmIChsb2NhbE5hbWUuZXF1YWxzKGRvY05hbWUpKQotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChsb2NhbE5hbWUuZXF1YWxzSWdub3JlQ2FzZShkb2NOYW1lKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCQlpZiAoZmlyc3RGb3VuZFswXSA9PSBudWxsKQotCQkJCWZpcnN0Rm91bmRbMF0gPSBlbGVtZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldENoYXJWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2hhclZhbHVlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChuYW1lLmNoYXJBdCgwKSA9PSAnIycpIHsgLy8gY2hhcmFjdGVyIHJlZmVyZW5jZQotCQkJaWYgKGxlbmd0aCA9PSAxKQotCQkJCXJldHVybiBudWxsOwotCQkJaW50IHJhZGl4ID0gMTA7Ci0JCQlTdHJpbmcgcyA9IG51bGw7Ci0JCQkvLyBub3cgYWxsb3cgaGV4YWRlY2ltYWwgYWxzbyBmb3Igbm9uIFhNTCBkb2N1bWVudAotCQkJaWYgKG5hbWUuY2hhckF0KDEpID09ICd4JykgeyAvLyBoZXhhZGVjaW1hbAotCQkJCXJhZGl4ID0gMTY7Ci0JCQkJcyA9IG5hbWUuc3Vic3RyaW5nKDIpOwotCQkJfQotCQkJZWxzZSB7IC8vIGRlY2ltYWwKLQkJCQlzID0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQl9Ci0JCQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChzLmNoYXJBdCgwKSA9PSAnLScpCi0JCQkJcmV0dXJuIG51bGw7IC8vIG5vIG1pbnVzIGFjY2VwdGVkCi0JCQljaGFyIGMgPSAwOwotCQkJdHJ5IHsKLQkJCQljID0gKGNoYXIpIEludGVnZXIucGFyc2VJbnQocywgcmFkaXgpOwotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJfQotCQkJaWYgKGMgPT0gMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihjKTsKLQkJfQotCi0JCS8vIGltcGxpY2l0IGNoYXJhY3RlciBlbnRpdGllcyBmb3IgWE1MCi0JCWlmIChuYW1lLmVxdWFscyhJWE1MQ2hhckVudGl0eS5MVF9OQU1FKSkKLQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5MVF9WQUxVRTsKLQkJaWYgKG5hbWUuZXF1YWxzKElYTUxDaGFyRW50aXR5LkdUX05BTUUpKQotCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LkdUX1ZBTFVFOwotCQlpZiAobmFtZS5lcXVhbHMoSVhNTENoYXJFbnRpdHkuQU1QX05BTUUpKQotCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LkFNUF9WQUxVRTsKLQkJaWYgKG5hbWUuZXF1YWxzKElYTUxDaGFyRW50aXR5LlFVT1RfTkFNRSkpCi0JCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuUVVPVF9WQUxVRTsKLQkJaWYgKGlzWE1MVHlwZSgpKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoSVhNTENoYXJFbnRpdHkuQVBPU19OQU1FKSkKLQkJCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuQVBPU19WQUxVRTsKLQkJfQotCi0JCUNNRG9jdW1lbnQgY20gPSBnZXRDTURvY3VtZW50KCk7Ci0JCWlmIChjbSAhPSBudWxsKSB7Ci0JCQlDTU5hbWVkTm9kZU1hcCBtYXAgPSBjbS5nZXRFbnRpdGllcygpOwotCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJQ01FbnRpdHlEZWNsYXJhdGlvbiBkZWNsID0gKENNRW50aXR5RGVjbGFyYXRpb24pIG1hcC5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdmFsdWUgPSBkZWNsLmdldFZhbHVlKCk7Ci0JCQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCWludCB2YWx1ZUxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotCQkJCQlpZiAodmFsdWVMZW5ndGggPiAxICYmIHZhbHVlLmNoYXJBdCgwKSA9PSAnJicgJiYgdmFsdWUuY2hhckF0KDEpID09ICcjJyAmJiB2YWx1ZS5jaGFyQXQodmFsdWVMZW5ndGggLSAxKSA9PSAnOycpIHsKLQkJCQkJCS8vIGNoYXJhY3RlciByZWZlcmVuY2UKLQkJCQkJCXJldHVybiBnZXRDaGFyVmFsdWUodmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlTGVuZ3RoIC0gMSkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiB2YWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkgewotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHRoaXMpOwotCQlpZiAobW9kZWxRdWVyeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5LmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIGdldERvY3R5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGUKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRUeXBlIGdldERvY3R5cGUoKSB7Ci0JCXJldHVybiBmaW5kRG9jdHlwZSh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREb2N1bWVudEVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQgRnJvbSBET00gMiBTcGVjOiBkb2N1bWVudEVsZW1lbnQgb2YgdHlwZQotCSAqICAgICAgICAgRWxlbWVudCBbcC42Ml0gLCByZWFkb25seSBUaGlzIGlzIGEgY29udmVuaWVuY2UgW3AuMTE5XQotCSAqICAgICAgICAgYXR0cmlidXRlIHRoYXQgYWxsb3dzIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIGNoaWxkIG5vZGUgdGhhdCBpcwotCSAqICAgICAgICAgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQuIEZvciBIVE1MIGRvY3VtZW50cywgdGhpcyBpcwotCSAqICAgICAgICAgdGhlIGVsZW1lbnQgd2l0aCB0aGUgdGFnTmFtZSAiSFRNTCIuIE5vdGU6IHdlIGRpZmZlciBmcm9tIHRoaXMKLQkgKiAgICAgICAgIGRlZmluaXRpb24gYSBsaXR0bGUgaW4gdGhhdCB3ZSBkb24ndCBuZWNlc3NhcmlseSB0YWtlIHRoZSBmaXJzdAotCSAqICAgICAgICAgY2hpbGQgYnV0IGFsc28gbG9vayB0byBtYXRjaCB0aGUgbmFtZS4gSW4gYSB3ZWxsIGZvcm1lZAotCSAqICAgICAgICAgZG9jdW1lbnQsIG9mIGNvdXJzZSwgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZSwgYnV0IG5vdAotCSAqICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgaW4gYW4gaWxsLWZvcm1lZCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBnZXREb2N1bWVudEVsZW1lbnQoKSB7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBnZXREb2N1bWVudFR5cGUoKTsKLQkJaWYgKGRvY1R5cGUgIT0gbnVsbCkgewotCQkJbmFtZSA9IGRvY1R5cGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJRWxlbWVudCBmaXJzdFtdID0gbmV3IEVsZW1lbnRbMV07Ci0JCUVsZW1lbnQgZG9jRWxlbWVudCA9IGZpbmREb2N1bWVudEVsZW1lbnQobmFtZSwgdGhpcywgZmlyc3QsIG5vTWF4U2VhcmNoKTsKLQkJaWYgKGRvY0VsZW1lbnQgPT0gbnVsbCkgewotCQkJZG9jRWxlbWVudCA9IGZpcnN0WzBdOwotCQl9Ci0KLQkJcmV0dXJuIGRvY0VsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZSBnZXREb2N1bWVudFR5cGUoKSB7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIGdldERvY3R5cGUoKTsKLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RG9jdW1lbnRUeXBlKCk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50VHlwZUlkKCkgewotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGdldERvY3VtZW50VHlwZSgpOwotCQlpZiAoZG9jVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBpZCA9IGRvY1R5cGUuZ2V0UHVibGljSWQoKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlpZCA9IGRvY1R5cGUuZ2V0U3lzdGVtSWQoKTsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnRCeUlkKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlSXRlcmF0b3IgaXQgPSBjcmVhdGVOb2RlSXRlcmF0b3IodGhpcywgTm9kZUZpbHRlci5TSE9XX0FMTCwgbnVsbCwgZmFsc2UpOwotCQlpZiAoaXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCJpZCIpICYmIGlkLmVxdWFscyhlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKSkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCU5vZGVMaXN0SW1wbCBlbGVtZW50cyA9IG51bGw7Ci0KLQkJaWYgKHVzZXRhZ25hbWVjYWNoZSkgewotCQkJZWxlbWVudHMgPSB0YWdOYW1lQ2FjaGUuZ2V0SXRlbSh0YWdOYW1lKTsKLQkJfQotCi0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQllbGVtZW50cyA9IGludGVybmFsR2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7Ci0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlOb2RlSXRlcmF0b3IgaXQgPSBjcmVhdGVOb2RlSXRlcmF0b3IodGhpcywgTm9kZUZpbHRlci5TSE9XX0FMTCwgbnVsbCwgZmFsc2UpOwotCQlpZiAoaXQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVMaXN0SW1wbCBlbGVtZW50cyA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlpZiAodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID09IDEgJiYgdXJpLmNoYXJBdCgwKSA9PSAnKicpIHsKLQkJCXVyaSA9IG51bGw7IC8vIGRvIG5vdCBjYXJlCi0JCX0KLQkJaWYgKHRhZ05hbWUubGVuZ3RoKCkgPT0gMSAmJiB0YWdOYW1lLmNoYXJBdCgwKSA9PSAnKicpIHsKLQkJCXRhZ05hbWUgPSBudWxsOyAvLyBkbyBub3QgY2FyZQotCQl9Ci0KLQkJZm9yIChOb2RlIG5vZGUgPSBpdC5uZXh0Tm9kZSgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBpdC5uZXh0Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JCQkJaWYgKGxvY2FsTmFtZSA9PSBudWxsIHx8ICFsb2NhbE5hbWUuZXF1YWxzKHRhZ05hbWUpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuc1VSSSA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQkJaWYgKG5zVVJJID09IG51bGwgfHwgIW5zVVJJLmVxdWFscyh1cmkpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFwcGVuZE5vZGUoZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHRoZSBlbmNvZGluZwotCSAqIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB1bnNwZWNpZmllZC4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBET01JbXBsZW1lbnRhdGlvbiBnZXRJbXBsZW1lbnRhdGlvbigpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIG90aGVyIG5vZGVzIHdpbGwgYmUgcmVmZXJyaW5nIHRvIHRoaXMgb25lIHRvIGdldCB0aGUgb3duaW5nIG1vZGVsCi0JICovCi0JcHVibGljIElET01Nb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2RvY3VtZW50IjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIERPQ1VNRU5UX05PREU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHdoZXRoZXIgdGhpcwotCSAqIGRvY3VtZW50IGlzIHN0YW5kYWxvbmUuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFN0YW5kYWxvbmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcgd2hldGhlciBlcnJvcnMgY2hlY2tpbmcgaXMgZW5mb3JjZWQgb3Igbm90LgotCSAqIFdoZW4gc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgdG8gbm90Ci0JICogdGVzdCBldmVyeSBwb3NzaWJsZSBlcnJvciBjYXNlIG5vcm1hbGx5IGRlZmluZWQgb24gRE9NIG9wZXJhdGlvbnMsIGFuZAotCSAqIG5vdCByYWlzZSBhbnkgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPi4gSW4gY2FzZSBvZiBlcnJvciwgdGhlCi0JICogYmVoYXZpb3IgaXMgdW5kZWZpbmVkLiBUaGlzIGF0dHJpYnV0ZSBpcyA8Y29kZT50cnVlPC9jb2RlPiBieQotCSAqIGRlZmF1bHRzLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRTdHJpY3RFcnJvckNoZWNraW5nKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHRoZSB2ZXJzaW9uCi0JICogbnVtYmVyIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB1bnNwZWNpZmllZC4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmVDYXNlKCkgewotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChhZGFwdGVyLmdldFRhZ05hbWVDYXNlKCkgIT0gRG9jdW1lbnRUeXBlQWRhcHRlci5TVFJJQ1RfQ0FTRSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW1wb3J0Q2hpbGROb2RlcyhOb2RlIHBhcmVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlyZW1vdmVDaGlsZE5vZGVzKCk7Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlOb2RlIGltcG9ydGVkID0gaW1wb3J0Tm9kZShjaGlsZCwgZGVlcCk7Ci0JCQlpZiAoaW1wb3J0ZWQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWFwcGVuZENoaWxkKGltcG9ydGVkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBOb2RlIGltcG9ydE5vZGUoTm9kZSBub2RlLCBib29sZWFuIGRlZXApIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGVJbXBsIGltcG9ydGVkID0gKE5vZGVJbXBsKSBub2RlLmNsb25lTm9kZShkZWVwKTsKLQkJaWYgKGltcG9ydGVkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy9zdWNjZXNzZnVsIGltcG9ydCwgbm90aWZ5IFVzZXJEYXRhSGFuZGxlcnMgaWYgYW55Ci0JCU5vZGVJbXBsIG5vZGVUb05vdGlmeT0oTm9kZUltcGwpIG5vZGU7Ci0JCW5vZGVUb05vdGlmeS5ub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0lNUE9SVEVELCBudWxsKTsKLQkJaW1wb3J0ZWQuc2V0T3duZXJEb2N1bWVudCh0aGlzLCBkZWVwKTsKLQkJcmV0dXJuIGltcG9ydGVkOwotCX0KLQotCXByaXZhdGUgTm9kZUxpc3RJbXBsIGludGVybmFsR2V0RWxlbWVudHNCeVRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXRFbGVtZW50c0J5VGFnbmFtZTogIiArIHRhZ05hbWUpOwotCQlOb2RlSXRlcmF0b3IgaXQgPSBjcmVhdGVOb2RlSXRlcmF0b3IodGhpcywgTm9kZUZpbHRlci5TSE9XX0FMTCwgbnVsbCwgZmFsc2UpOwotCQlpZiAoaXQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVMaXN0SW1wbCBlbGVtZW50cyA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlpZiAodGFnTmFtZS5sZW5ndGgoKSA9PSAxICYmIHRhZ05hbWUuY2hhckF0KDApID09ICcqJykgewotCQkJdGFnTmFtZSA9IG51bGw7IC8vIGRvIG5vdCBjYXJlCi0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IGl0Lm5leHROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGl0Lm5leHROb2RlKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJaWYgKCFlbGVtZW50Lm1hdGNoVGFnTmFtZSh0YWdOYW1lKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbGVtZW50cy5hcHBlbmROb2RlKG5vZGUpOwotCQl9Ci0JCWlmICh1c2V0YWduYW1lY2FjaGUpIHsKLQkJCXRhZ05hbWVDYWNoZS5hZGRJdGVtKHRhZ05hbWUsIGVsZW1lbnRzKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1BEb2N1bWVudCgpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFscyhKU1BUYWcuSlNQX1JPT1QpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQVHlwZSgpIHsKLQkJaWYgKHRoaXMubW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gdGhpcy5tb2RlbC5nZXRNb2RlbEhhbmRsZXIoKTsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGlkID0gaGFuZGxlci5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpOwotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gSVNTVUU6IC0tIGF2b2lkIHRoaXMgaGFyZGNvZGVkIHN0cmluZwotCQlyZXR1cm4gaWQuZXF1YWxzKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gLy8gRE1XOiBtb2RpZmllZCBmb3IgWE1MNEogNC4wLjEKLQkJLy8gaWYgKFhNTENoYXIuaXNWYWxpZE5hbWUobmFtZSkpIHJldHVybiB0cnVlOwotCQlpZiAoTmFtZVZhbGlkYXRvci5pc1ZhbGlkKG5hbWUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCS8vIHNwZWNpYWwgZm9yIGludmFsaWQgZGVjbGFyYXRpb24KLQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMSAmJiBuYW1lLmNoYXJBdCgwKSA9PSAnIScpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJLy8gc3BlY2lhbCBmb3IgSlNQIHRhZyBpbiB0YWcgbmFtZQotCQlpZiAobmFtZS5zdGFydHNXaXRoKEpTUFRhZy5UQUdfT1BFTikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWE1MVHlwZSgpIHsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIGdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGFkYXB0ZXIuaXNYTUxUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcmVsZWFzZURvY3VtZW50VHlwZSgpIHsKLQkvLyBpZiAodGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyID09IG51bGwpCi0JLy8gcmV0dXJuOwotCS8vIHRoaXMuZG9jdW1lbnRUeXBlQWRhcHRlci5yZWxlYXNlKCk7Ci0JLy8gdGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyID0gbnVsbDsKLQkvLyB9Ci0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHRoZSBlbmNvZGluZwotCSAqIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB1bnNwZWNpZmllZC4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoamF2YS5sYW5nLlN0cmluZyBlbmNvZGluZykgewotCX0KLQotCS8qKgotCSAqIHNldE1vZGVsIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgWE1MTW9kZWwKLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsKElET01Nb2RlbCBtb2RlbCkgewotCQl0aGlzLm1vZGVsID0gKERPTU1vZGVsSW1wbCkgbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgYW4gZWxlbWVudCdzIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byByZXRyaWV2ZSB0aGUgYXR0cmlidXRlIG1hcCBvZgotCSAqIEByZXR1cm4gYSA8Y29kZT5DTU5hbWVkTm9kZU1hcDwvY29kZT4gb2YgYXR0cmlidXRlcyBpZiB0aGUgZGVjbGFyYXRpb24gZXhpc3RzOyBudWxsIG90aGVyd2lzZS4KLQkgKi8KLQlDTU5hbWVkTm9kZU1hcCBnZXRDTUF0dHJpYnV0ZXMoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNTmFtZWROb2RlTWFwIG1hcCA9IChDTU5hbWVkTm9kZU1hcCkgZkNNQ2FjaGUuZ2V0KGVsZW1lbnQpOwotCQlpZiAobWFwID09IG51bGwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHRoaXMpLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJCW1hcCA9IGRlY2wuZ2V0QXR0cmlidXRlcygpOwotCQkJCWZDTUNhY2hlLnB1dChlbGVtZW50LCBtYXApOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHdoZXRoZXIgdGhpcwotCSAqIGRvY3VtZW50IGlzIHN0YW5kYWxvbmUuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYWxvbmUoYm9vbGVhbiBzdGFuZGFsb25lKSB7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIHdoZXRoZXIgZXJyb3JzIGNoZWNraW5nIGlzIGVuZm9yY2VkIG9yIG5vdC4KLQkgKiBXaGVuIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIG5vdAotCSAqIHRlc3QgZXZlcnkgcG9zc2libGUgZXJyb3IgY2FzZSBub3JtYWxseSBkZWZpbmVkIG9uIERPTSBvcGVyYXRpb25zLCBhbmQKLQkgKiBub3QgcmFpc2UgYW55IDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4uIEluIGNhc2Ugb2YgZXJyb3IsIHRoZQotCSAqIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4gVGhpcyBhdHRyaWJ1dGUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gYnkKLQkgKiBkZWZhdWx0cy4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyaWN0RXJyb3JDaGVja2luZyhib29sZWFuIHN0cmljdEVycm9yQ2hlY2tpbmcpIHsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIFhNTCBkZWNsYXJhdGlvbiwgdGhlIHZlcnNpb24KLQkgKiBudW1iZXIgb2YgdGhpcyBkb2N1bWVudC4gVGhpcyBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHVuc3BlY2lmaWVkLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGphdmEubGFuZy5TdHJpbmcgdmVyc2lvbikgewotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElucHV0RW5jb2RpbmcoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFhtbFN0YW5kYWxvbmUoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhtbFN0YW5kYWxvbmUoYm9vbGVhbiB4bWxTdGFuZGFsb25lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYbWxWZXJzaW9uKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRYbWxWZXJzaW9uKFN0cmluZyB4bWxWZXJzaW9uKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREb2N1bWVudFVSSSgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRVUkkoU3RyaW5nIGRvY3VtZW50VVJJKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyBET01Db25maWd1cmF0aW9uIGdldERvbUNvbmZpZygpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgbm9ybWFsaXplRG9jdW1lbnQoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyBOb2RlIHJlbmFtZU5vZGUoTm9kZSBuLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxNjcwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRUeXBlQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0Jc3RhdGljIGZpbmFsIGludCBMT1dFUl9DQVNFID0gMjsKLQlzdGF0aWMgZmluYWwgaW50IFNUUklDVF9DQVNFID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IFVQUEVSX0NBU0UgPSAxOwotCi0JLyoqCi0JICovCi0JaW50IGdldEF0dHJOYW1lQ2FzZSgpOwotCi0JLyoqCi0JICovCi0JRG9jdW1lbnRUeXBlIGdldERvY3VtZW50VHlwZSgpOwotCi0JLyoqCi0JICovCi0JaW50IGdldFRhZ05hbWVDYXNlKCk7Ci0KLQkvKioKLQkgKi8KLQlib29sZWFuIGhhc0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBpc1hNTFR5cGUoKTsKLQotCS8qKgotCSAqLwotCXZvaWQgcmVsZWFzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVBZGFwdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWMzZTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFR5cGVBZGFwdGVySW1wbCBpbXBsZW1lbnRzIERvY3VtZW50VHlwZUFkYXB0ZXIgewotCi0JcHJpdmF0ZSBJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgRG9jdW1lbnRUeXBlIGRvY3VtZW50VHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRUeXBlQWRhcHRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZUFkYXB0ZXJJbXBsKElET01Eb2N1bWVudCBkb2N1bWVudCkgewotCQl0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLmRvY3VtZW50VHlwZSA9IGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ck5hbWVDYXNlKCkgewotCQlyZXR1cm4gU1RSSUNUX0NBU0U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElET01Eb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIERvY3VtZW50VHlwZSBnZXREb2N1bWVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhZ05hbWVDYXNlKCkgewotCQlyZXR1cm4gU1RSSUNUX0NBU0U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRmVhdHVyZShTdHJpbmcgZmVhdHVyZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNYTUxUeXBlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKGV2ZW50VHlwZSAhPSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEKQotCQkJcmV0dXJuOwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCB8fCAhKG5vdGlmaWVyIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSkKLQkJCXJldHVybjsKLQkJdGhpcy5kb2N1bWVudFR5cGUgPSAoKElET01Eb2N1bWVudCkgbm90aWZpZXIpLmdldERvY3R5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlEb2N1bWVudFR5cGVDaGFuZ2VkKCkgewotCQlpZiAodGhpcy5kb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NTW9kZWwgbW9kZWwgPSB0aGlzLmRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkoKERPTU1vZGVsSW1wbCkgbW9kZWwpLmRvY3VtZW50VHlwZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRUeXBlKERvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUpIHsKLQkJdGhpcy5kb2N1bWVudFR5cGUgPSBkb2N1bWVudFR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmODZiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk2OTk5IC0gSW5lZmZpY2llbnQgdXNlIG9mIG5ldyBTdHJpbmcoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotCi0vKioKLSAqIERvY3VtZW50VHlwZSBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRUeXBlSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgSURPTURvY3VtZW50VHlwZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxTdWJzZXQgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQotCS8qKgotCSAqIERvY3VtZW50VHlwZUltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2N1bWVudFR5cGVJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIERvY3VtZW50VHlwZUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRUeXBlSW1wbChEb2N1bWVudFR5cGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lID0gdGhhdC5uYW1lOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlEb2N1bWVudFR5cGVJbXBsIGNsb25lZCA9IG5ldyBEb2N1bWVudFR5cGVJbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbnRpdGllcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcAotCSAqLwotCXB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJuYWxTdWJzZXQoKSB7Ci0JCXJldHVybiB0aGlzLmludGVybmFsU3Vic2V0OwotCX0KLQotCS8qKgotCSAqIGdldE5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAodGhpcy5uYW1lID09IG51bGwpCi0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRE9DVU1FTlRfVFlQRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIGdldE5vdGF0aW9ucyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcAotCSAqLwotCXB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0Tm90YXRpb25zKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQdWJsaWNJZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotCQlyZXR1cm4gdGhpcy5wdWJsaWNJZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTeXN0ZW1JZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gdGhpcy5zeXN0ZW1JZDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOyAvLyB3aWxsIGJlIGdlbmVyYXRlZAotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0TGFzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlyZXR1cm4gKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTl9DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcm5hbFN1YnNldChTdHJpbmcgaW50ZXJuYWxTdWJzZXQpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQl0aGlzLmludGVybmFsU3Vic2V0ID0gaW50ZXJuYWxTdWJzZXQ7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRQdWJsaWNJZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQl0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7Ci0KLQkJbm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJdGhpcy5zeXN0ZW1JZCA9IHN5c3RlbUlkOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0TmFtZSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlidWZmZXIuYXBwZW5kKGdldFB1YmxpY0lkKCkpOwotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRTeXN0ZW1JZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCdAJyk7Ci0JCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YWE3YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAKLSAqICAgICBWYWxlbnRpbiBCYWNpdSAtIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzk1NTIKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTY5OTkgLSBJbmVmZmljaWVudCB1c2Ugb2YgbmV3IFN0cmluZygpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTE5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotCi0KLS8qKgotICogRWxlbWVudEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJbXBsIGV4dGVuZHMgTm9kZUNvbnRhaW5lciBpbXBsZW1lbnRzIElET01FbGVtZW50IHsKLQotCXByaXZhdGUgY2xhc3MgQXR0cmlidXRlcyBpbXBsZW1lbnRzIE5hbWVkTm9kZU1hcCB7Ci0JCUF0dHJpYnV0ZXMoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlpZiAoYXR0ck5vZGVzID09IG51bGwpCi0JCQkJcmV0dXJuIDA7Ci0JCQlyZXR1cm4gYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5hbWVkSXRlbU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGF0dHJOb2Rlcy5pdGVtKGluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIHJlbW92ZU5hbWVkSXRlbShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gcmVtb3ZlQXR0cmlidXRlTm9kZShuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIHJlbW92ZU5hbWVkSXRlbU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJCXJldHVybiByZW1vdmVBdHRyaWJ1dGVOb2RlTlModXJpLCBuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIHNldE5hbWVkSXRlbShOb2RlIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gc2V0QXR0cmlidXRlTm9kZSgoQXR0ckltcGwpIGFyZyk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW1OUyhOb2RlIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gc2V0QXR0cmlidXRlTm9kZU5TKChBdHRySW1wbCkgYXJnKTsKLQkJfQotCX0KLQotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFhNTE5TX1BSRUZJWCA9IElYTUxOYW1lc3BhY2UuWE1MTlNfUFJFRklYLnRvQ2hhckFycmF5KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBGTEFHX0NPTU1FTlQgPSAweDE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBGTEFHX0VNUFRZID0gMHgyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRkxBR19KU1AgPSAweDQ7Ci0JCi0JcHJpdmF0ZSBieXRlIGZUYWdGbGFncyA9IDA7Ci0JCi0JTm9kZUxpc3RJbXBsIGF0dHJOb2RlcyA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBjaGFyW10gZlRhZ05hbWUgPSBudWxsOwotCi0JcHJpdmF0ZSBjaGFyW10gZk5hbWVzcGFjZVVSSSA9IG51bGw7Ci0KLQkvKioKLQkgKiBFbGVtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbGVtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBFbGVtZW50SW1wbAotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50SW1wbChFbGVtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMuZlRhZ05hbWUgPSB0aGF0LmZUYWdOYW1lOwotCQkJdGhpcy5mVGFnRmxhZ3MgPSB0aGF0LmZUYWdGbGFnczsKLQotCQkJLy8gY2xvbmUgYXR0cmlidXRlcwotCQkJdGhhdC5jbG9uZUF0dHJpYnV0ZXModGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhZGRFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVuZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZyhFbGVtZW50IGVuZFRhZykgewotCQlpZiAoZW5kVGFnID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChoYXNFbmRUYWcoKSkKLQkJCXJldHVybjsKLQkJRWxlbWVudEltcGwgZW5kID0gKEVsZW1lbnRJbXBsKSBlbmRUYWc7Ci0KLQkJLy8gbW92ZSB0aGUgZW5kIGZsYXQgbm9kZSBmcm9tIHRoZSBlbmQgdGFnCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbmQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbmQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQlzZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqIGFwcGVuZEF0dGlidXRlTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXB1YmxpYyBBdHRyIGFwcGVuZEF0dHJpYnV0ZU5vZGUoQXR0ciBuZXdBdHRyKSB7Ci0JCWlmIChuZXdBdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgbmV3QXR0cjsKLQkJaWYgKGF0dHIuZ2V0T3duZXJFbGVtZW50KCkgIT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQl0aGlzLmF0dHJOb2RlcyA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJdGhpcy5hdHRyTm9kZXMuYXBwZW5kTm9kZShhdHRyKTsKLQkJYXR0ci5zZXRPd25lckVsZW1lbnQodGhpcyk7Ci0KLQkJbm90aWZ5QXR0clJlcGxhY2VkKGF0dHIsIG51bGwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBjbG9uZUF0dHJpYnV0ZXMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5ld093bmVyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xvbmVBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3T3duZXIpIHsKLQkJaWYgKG5ld093bmVyID09IG51bGwgfHwgbmV3T3duZXIgPT0gdGhpcykKLQkJCXJldHVybjsKLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdPd25lcjsKLQkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGVzKCk7Ci0KLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCUF0dHIgY2xvbmVkID0gKEF0dHIpIG5vZGUuY2xvbmVOb2RlKGZhbHNlKTsKLQkJCWlmIChjbG9uZWQgIT0gbnVsbCkKLQkJCQllbGVtZW50LmFwcGVuZEF0dHJpYnV0ZU5vZGUoY2xvbmVkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRWxlbWVudEltcGwgY2xvbmVkID0gbmV3IEVsZW1lbnRJbXBsKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCQkKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJLy8gSW4gdGhlIGFic2VuY2Ugb2YgdGhlIGF0dHJpYnV0ZSwgZ2V0IHRoZSBkZWZhdWx0IHZhbHVlCi0JCWlmIChhdHRyID09IG51bGwpIHsKLQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBnZXREZWZhdWx0VmFsdWUobmFtZSk7Ci0JCQlyZXR1cm4gKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSA/IGRlZmF1bHRWYWx1ZSA6IE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJfQotCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYXR0cmlidXRlIDxjb2RlPm5hbWU8L2NvZGU+LiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZwotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRWYWx1ZShTdHJpbmcgbmFtZSkgewotCQlDTU5hbWVkTm9kZU1hcCBtYXAgPSAoKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRDTUF0dHJpYnV0ZXModGhpcyk7Ci0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJQ01Ob2RlIGF0dHJpYnV0ZSA9IG1hcC5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQlpZiAoYXR0cmlidXRlIGluc3RhbmNlb2YgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikKLQkJCQlyZXR1cm4gKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyaWJ1dGUpLmdldEF0dHJUeXBlKCkuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEF0dHIgZ2V0QXR0cmlidXRlTm9kZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGludmFsaWQgcGFyYW1ldGVyCi0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIG5vIGF0dHJpYnV0ZQotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJY2hhcltdIG5hbWVDaGFycyA9IG5hbWUudG9DaGFyQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoYXR0ci5tYXRjaE5hbWUobmFtZUNoYXJzKSkKLQkJCQlyZXR1cm4gYXR0cjsgLy8gZm91bmQKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBhdHRyaWJ1dGUKLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGF0dHIuZ2V0TG9jYWxOYW1lKCk7Ci0JCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgIWxvY2FsTmFtZS5lcXVhbHMobmFtZSkpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbnNVUkkgPSBhdHRyLmdldE5hbWVzcGFjZVVSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJaWYgKG5zVVJJICE9IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG5zVVJJID09IG51bGwgfHwgIW5zVVJJLmVxdWFscyh1cmkpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gZm91bmQKLQkJCXJldHVybiBhdHRyOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JCS8vIEluIHRoZSBhYnNlbmNlIG9mIHRoZSBhdHRyaWJ1dGUsIGdldCB0aGUgZGVmYXVsdCB2YWx1ZQotCQlpZiAoYXR0ciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gZ2V0RGVmYXVsdFZhbHVlKG5hbWUpOwotCQkJcmV0dXJuIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCX0KLQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTmFtZWROb2RlTWFwCi0JICovCi0JcHVibGljIE5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbGVtZW50c0J5VGFnTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVJdGVyYXRvciBpdCA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcih0aGlzLCBOb2RlRmlsdGVyLlNIT1dfQUxMLCBudWxsLCBmYWxzZSk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUxpc3RJbXBsIGVsZW1lbnRzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCWlmICh0YWdOYW1lLmxlbmd0aCgpID09IDEgJiYgdGFnTmFtZS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl0YWdOYW1lID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCi0JCWl0Lm5leHROb2RlKCk7IC8vIHNraXAgdGhlIGZpcnN0IG5vZGUgc2luY2UgaXQgaXMgdGhlIHJvb3QgZnJvbSBjcmVhdGVOb2RlSXRlcmF0b3IKLQkJZm9yIChOb2RlIG5vZGUgPSBpdC5uZXh0Tm9kZSgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBpdC5uZXh0Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwpIHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCWlmICghZWxlbWVudC5tYXRjaFRhZ05hbWUodGFnTmFtZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxlbWVudHMuYXBwZW5kTm9kZShub2RlKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUl0ZXJhdG9yIGl0ID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKHRoaXMsIE5vZGVGaWx0ZXIuU0hPV19BTEwsIG51bGwsIGZhbHNlKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQlOb2RlTGlzdEltcGwgZWxlbWVudHMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA9PSAxICYmIHVyaS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl1cmkgPSBudWxsOyAvLyBkbyBub3QgY2FyZQotCQl9Ci0JCWlmICh0YWdOYW1lLmxlbmd0aCgpID09IDEgJiYgdGFnTmFtZS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl0YWdOYW1lID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCi0JCWl0Lm5leHROb2RlKCk7IC8vIHNraXAgdGhlIGZpcnN0IG5vZGUgc2luY2UgaXQgaXMgdGhlIHJvb3QgZnJvbSBjcmVhdGVOb2RlSXRlcmF0b3IKLQkJZm9yIChOb2RlIG5vZGUgPSBpdC5uZXh0Tm9kZSgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBpdC5uZXh0Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JCQkJaWYgKGxvY2FsTmFtZSA9PSBudWxsIHx8ICFsb2NhbE5hbWUuZXF1YWxzKHRhZ05hbWUpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuc1VSSSA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQkJaWYgKG5zVVJJID09IG51bGwgfHwgIW5zVVJJLmVxdWFscyh1cmkpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFwcGVuZE5vZGUoZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW5kT2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW5kU3RhcnRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZFN0YXJ0T2Zmc2V0KCkgewotCQlpZiAodGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kVGFnTmFtZSgpIHsKLQkJaWYgKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZEVuZFRhZyhyZWdpb25UeXBlKSkgewotCQkJCXJldHVybiB0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZEVuZFRhZyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCWlmICh0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLQkJaWYgKHRoaXMuZlRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YodGhpcy5mVGFnTmFtZSwgJzonKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKHRoaXMuZlRhZ05hbWUpOwotCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmZUYWdOYW1lLCBpbmRleCArIDEsIHRoaXMuZlRhZ05hbWUubGVuZ3RoIC0gaW5kZXggLSAxKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJU3RyaW5nIG5zQXR0ck5hbWUgPSBudWxsOwotCQlTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KCk7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQluc0F0dHJOYW1lID0gSVhNTE5hbWVzcGFjZS5YTUxOU19QUkVGSVggKyBwcmVmaXg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluc0F0dHJOYW1lID0gSVhNTE5hbWVzcGFjZS5YTUxOUzsKLQkJfQotCi0JCWZvciAoTm9kZSBub2RlID0gdGhpczsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRUxFTUVOVF9OT0RFKQotCQkJCWJyZWFrOwotCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUobnNBdHRyTmFtZSk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJCXJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0JCX0KLQotCQlpZiAodGhpcy5mTmFtZXNwYWNlVVJJID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBTdHJpbmcodGhpcy5mTmFtZXNwYWNlVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0VGFnTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBFTEVNRU5UX05PREU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCWlmICh0aGlzLmZUYWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGluZGV4ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKHRoaXMuZlRhZ05hbWUsICc6Jyk7Ci0JCWlmIChpbmRleCA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGV4Y2x1ZGUgSlNQIHRhZyBpbiBuYW1lCi0JCWlmICh0aGlzLmZUYWdOYW1lWzBdID09ICc8JykKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmZUYWdOYW1lLCAwLCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRFbmRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0RW5kT2Zmc2V0KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldEVuZCgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTdGFydE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCWlmIChnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwgJiYgdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiAhaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCX0KLQotCS8qKgotCSAqIGdldFRhZ05hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWdOYW1lKCkgewotCQlpZiAodGhpcy5mVGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoZlRhZ05hbWUpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKGdldEF0dHJpYnV0ZU5vZGUobmFtZSkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChnZXRBdHRyaWJ1dGVOb2RlTlModXJpLCBuYW1lKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gKHRoaXMuYXR0ck5vZGVzICE9IG51bGwgJiYgdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKTsKLQl9Ci0KLQkvKioKLQkgKiBoYXNFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRW5kVGFnKCkgewotCQlyZXR1cm4gKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc1ByZWZpeCgpIHsKLQkJaWYgKHRoaXMuZlRhZ05hbWUgPT0gbnVsbCB8fCB0aGlzLmZUYWdOYW1lLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5pbmRleE9mKHRoaXMuZlRhZ05hbWUsICc6JykgPiAwICYmIHRoaXMuZlRhZ05hbWVbMF0gIT0gJzwnOwotCX0KLQotCS8qKgotCSAqIGhhc1N0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1N0YXJ0VGFnKCkgewotCQlyZXR1cm4gKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlnbm9yZUNhc2UoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaWdub3JlQ2FzZSgpKSB7Ci0JCQkvLyBldmVuIGluIGNhc2UgaW5zZW5zaXRpdmUgZG9jdW1lbnQsIGlmIGhhdmluZyBwcmVmaXgsIGl0J3MgY2FzZQotCQkJLy8gc2Vuc2l0aXZlIHRhZwotCQkJcmV0dXJuICFoYXNQcmVmaXgoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEF0dHIgaW5zZXJ0QXR0cmlidXRlTm9kZShBdHRyIG5ld0F0dHIsIGludCBpbmRleCkgewotCQlpZiAobmV3QXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIG5ld0F0dHI7Ci0JCWlmIChhdHRyLmdldE93bmVyRWxlbWVudCgpICE9IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXRoaXMuYXR0ck5vZGVzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQl0aGlzLmF0dHJOb2Rlcy5pbnNlcnROb2RlKGF0dHIsIGluZGV4KTsKLQkJYXR0ci5zZXRPd25lckVsZW1lbnQodGhpcyk7Ci0KLQkJbm90aWZ5QXR0clJlcGxhY2VkKGF0dHIsIG51bGwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRCZWZvcmUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIHJlZkNoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgaW5zZXJ0QmVmb3JlKE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBzaG91bGQgdGhyb3cgRE9NRXhjZXB0aW9uIGluc3RlYWQgb2YgcmV0dXJuIG51bGw/Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghaXNDb250YWluZXIoKSkgeyAvLyBuZXZlciBiZSBjb250YWluZXIKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgRE9NTWVzc2FnZXMuSElFUkFSQ0hZX1JFUVVFU1RfRVJSKTsKLQkJfQotCQlpZiAobmV3Q2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBURVhUX05PREUgJiYgbmV3Q2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBDREFUQV9TRUNUSU9OX05PREUpIHsKLQkJCWlmIChpc0pTUENvbnRhaW5lcigpIHx8IGlzQ0RBVEFDb250YWluZXIoKSkgeyAvLyBhY2NlcHRzIG9ubHkKLQkJCQkvLyBUZXh0Ci0JCQkJLy8gY2hpbGQKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5ISUVSQVJDSFlfUkVRVUVTVF9FUlIsIERPTU1lc3NhZ2VzLkhJRVJBUkNIWV9SRVFVRVNUX0VSUik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmluc2VydEJlZm9yZShuZXdDaGlsZCwgcmVmQ2hpbGQpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ0RBVEFDb250YWluZXIoKSB7Ci0JCS8vIHVzZSBCbG9ja01ha2VyIGluc3RlYWQgb2YgQ01FbGVtZW50RGVjbGFyYXRpb24KLQkJLy8gYmVjYXVzZSA8c3R5bGU+IGFuZCA8c2NyaXB0PiBpbiBYSFRNTCBpcyBub3QgQ0RBVEEgY29udGVudCB0eXBlCi0JCUlET01Nb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBlcnJvcgotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwgfHwgZlRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy8gZXJvcgotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpOwotCQlpZiAocGFyc2VyID09IG51bGwgfHwgIShwYXJzZXIgaW5zdGFuY2VvZiBYTUxTb3VyY2VQYXJzZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKCgoWE1MU291cmNlUGFyc2VyKSBwYXJzZXIpLmdldEJsb2NrTWFya2VyKG5ldyBTdHJpbmcodGhpcy5mVGFnTmFtZSkpICE9IG51bGwpOwotCQkvKgotCQkgKiBDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RGVjbGFyYXRpb24oKTsgaWYgKGRlY2wgPT0gbnVsbCkKLQkJICogcmV0dXJuIGZhbHNlOyBpZiAoZGVjbCBpbnN0YW5jZW9mIENNTm9kZVdyYXBwZXIpIHsgZGVjbCA9Ci0JCSAqIChDTUVsZW1lbnREZWNsYXJhdGlvbikoKENNTm9kZVdyYXBwZXIpZGVjbCkuZ2V0T3JpZ2luTm9kZSgpOyBpZgotCQkgKiAoZGVjbCA9PSBudWxsKSByZXR1cm4gZmFsc2U7IH0gaWYgKGRlY2wgaW5zdGFuY2VvZgotCQkgKiBUTERFbGVtZW50RGVjbGFyYXRpb24pIHsgU3RyaW5nIGNvbnRlbnQgPQotCQkgKiAoKFRMREVsZW1lbnREZWNsYXJhdGlvbilkZWNsKS5nZXRCb2R5Y29udGVudCgpOyBpZiAoY29udGVudCA9PQotCQkgKiBudWxsKSByZXR1cm4gZmFsc2U7IHJldHVybgotCQkgKiBjb250ZW50LmVxdWFscyhKU1AxMVRMRE5hbWVzLkNPTlRFTlRfVEFHREVQRU5ERU5UKTsgfSBpZgotCQkgKiAoIWlzR2xvYmFsVGFnKCkpIHJldHVybiBmYWxzZTsgcmV0dXJuIChkZWNsLmdldENvbnRlbnRUeXBlKCkgPT0KLQkJICogQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEEpOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCWlmIChpc0VtcHR5VGFnKCkgfHwgIWlzQ29udGFpbmVyKCkpIHsKLQkJCWZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJfQotCQllbHNlIHsKLQkJCWZsYXROb2RlID0gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIG11c3QgYmUgZ2VuZXJhdGVkCi0JCX0KLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKSB7Ci0JCQlyZXR1cm4gKGlzTmVzdGVkQ2xvc2VkQ29tbWVudChyZWdpb25UeXBlKSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpOwotCQl9Ci0JCWlmIChpc0pTUFRhZygpKSB7Ci0JCQlyZXR1cm4gaXNOZXN0ZWRDbG9zZWQocmVnaW9uVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENsb3NlZChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ2xvc2VkQ29tbWVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ29tbWVudFRhZygpIHsKLQkJcmV0dXJuIChmVGFnRmxhZ3MgJiBGTEFHX0NPTU1FTlQpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogaXNDb250YWluZXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCWlmIChpc0NvbW1lbnRUYWcoKSkgewotCQkJQ29tbWVudEVsZW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAoQ29tbWVudEVsZW1lbnRBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKENvbW1lbnRFbGVtZW50QWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChhZGFwdGVyLmlzQ29udGFpbmVyKCkpOwotCQkJfQotCQkJcmV0dXJuIChnZXREZWNsYXJhdGlvbigpID09IG51bGwpOwotCQl9Ci0JCWlmIChpc0pTUFRhZygpKSB7Ci0JCQkvLyBleGNsdWRlIEpTUCBkaXJlY3RpdmUKLQkJCXJldHVybiAobWF0Y2hUYWdOYW1lKEpTUFRhZy5KU1BfU0NSSVBUTEVUKSB8fCBtYXRjaFRhZ05hbWUoSlNQVGFnLkpTUF9ERUNMQVJBVElPTikgfHwgbWF0Y2hUYWdOYW1lKEpTUFRhZy5KU1BfRVhQUkVTU0lPTikpOwotCQl9Ci0JCWlmICghaXNYTUxUYWcoKSkgeyAvLyBub24tWE1MIHRhZwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOyAvLyB1bmRlZmluZWQgdGFnCi0JCQlyZXR1cm4gKGRlY2wuZ2V0Q29udGVudFR5cGUoKSAhPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogaXNFbXB0eVRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5VGFnKCkgewotCQlpZiAoaXNKU1BUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWlzWE1MVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoZlRhZ0ZsYWdzICYgRkxBR19FTVBUWSkgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZFRhZygpIHsKLQkJcmV0dXJuIChoYXNFbmRUYWcoKSAmJiAhaGFzU3RhcnRUYWcoKSAmJiAhaGFzQ2hpbGROb2RlcygpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbFRhZygpIHsKLQkJcmV0dXJuICFoYXNQcmVmaXgoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0VGFnKCkgewotCQlpZiAoaGFzU3RhcnRUYWcoKSB8fCBoYXNFbmRUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gbWFrZSBzdXJlIHRoaXMgaXMgaW4gdGhlIGRvY3VtZW50IHRyZWUKLQkJLy8gYmVjYXVzZSBpZiBub3QgaW4gdGhlIGRvY3VtZW50IHRyZWUsIG5vIHRhZ3MgYXJlIGdlbmVyYXRlZCB5ZXQKLQkJcmV0dXJuIChnZXRDb250YWluZXJEb2N1bWVudCgpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQQ29udGFpbmVyKCkgewotCQlyZXR1cm4gKGlzSlNQVGFnKCkgJiYgIWlzQ29tbWVudFRhZygpICYmIGlzQ29udGFpbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIGlzSlNQVGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzSlNQVGFnKCkgewotCQlyZXR1cm4gKGZUYWdGbGFncyAmIEZMQUdfSlNQKSAhPSAwOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhcnRUYWdDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKSB7Ci0JCQlyZXR1cm4gKGlzTmVzdGVkQ2xvc2VkQ29tbWVudChyZWdpb25UeXBlKSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpOwotCQl9Ci0JCWlmIChpc0pTUFRhZygpKSB7Ci0JCQlpZiAoaXNDb250YWluZXIoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsgLy8gc3RhcnQgdGFnIGFsd2F5cyBoYXMgYSBzaW5nbGUgcmVnaW9uCi0JCQlyZXR1cm4gaXNDbG9zZWROZXN0ZWREaXJlY3RpdmUocmVnaW9uVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nsb3NlZE5lc3RlZERpcmVjdGl2ZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzWE1MVGFnKCkgewotCQlpZiAoaXNKU1BUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsICYmICFkb2N1bWVudC5pc1hNTFR5cGUoKSkgewotCQkJLy8gZXZlbiBpbiBub24tWE1MIGRvY3VtZW50LCBpZiBoYXZpbmcgcHJlZml4LCBpdCdzIFhNTCB0YWcKLQkJCXJldHVybiBoYXNQcmVmaXgoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaEVuZFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKGlzSlNQVGFnKCkgJiYgIWlzQ29tbWVudFRhZygpKSB7Ci0JCQlyZXR1cm4gKGltcGwuaXNKU1BUYWcoKSAmJiAhaW1wbC5pc0NvbW1lbnRUYWcoKSk7Ci0JCX0KLQkJcmV0dXJuIG1hdGNoVGFnTmFtZShlbGVtZW50LmdldFRhZ05hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogbWF0Y2hUYWdOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gKHRoaXMuZlRhZ05hbWUgPT0gbnVsbCk7Ci0JCWlmICh0aGlzLmZUYWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLmZUYWdOYW1lLmxlbmd0aCAhPSB0YWdOYW1lLmxlbmd0aCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgc3RyaW5nTmFtZSA9IG5ldyBTdHJpbmcodGhpcy5mVGFnTmFtZSk7Ci0JCWlmICghaWdub3JlQ2FzZSgpKQotCQkJcmV0dXJuIHN0cmluZ05hbWUuZXF1YWxzKHRhZ05hbWUpOwotCQlyZXR1cm4gc3RyaW5nTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vdGlmeUF0dHJSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5QXR0clJlcGxhY2VkKEF0dHIgbmV3QXR0ciwgQXR0ciBvbGRBdHRyKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuYXR0clJlcGxhY2VkKHRoaXMsIG5ld0F0dHIsIG9sZEF0dHIpOwotCX0KLQotCS8qKgotCSAqIG5vdGlmeVZhbHVlQ2hhbmdlZCBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlFbmRUYWdDaGFuZ2VkKCkgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRE9NTW9kZWxJbXBsIG1vZGVsID0gKERPTU1vZGVsSW1wbCkgZG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLmVuZFRhZ0NoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5U3RhcnRUYWdDaGFuZ2VkKCkgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRE9NTW9kZWxJbXBsIG1vZGVsID0gKERPTU1vZGVsSW1wbCkgZG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLnN0YXJ0VGFnQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcmVmZXJFbXB0eVRhZygpIHsKLQkJaWYgKGhhc0NoaWxkTm9kZXMoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzSlNQVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFpc1hNTFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RGVjbGFyYXRpb24oKTsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChkZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUF0dHJpYnV0ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZUF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQXR0cmlidXRlTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gb2xkQXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXB1YmxpYyBBdHRyIHJlbW92ZUF0dHJpYnV0ZU5vZGUoQXR0ciBvbGRBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG9sZEF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpIHsgLy8gbm8gYXR0cmlidXRlCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLCBET01NZXNzYWdlcy5OT1RfRk9VTkRfRVJSKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyICE9IG9sZEF0dHIpCi0JCQkJY29udGludWU7Ci0KLQkJCS8vIGZvdW5kCi0JCQl0aGlzLmF0dHJOb2Rlcy5yZW1vdmVOb2RlKGkpOwotCQkJYXR0ci5zZXRPd25lckVsZW1lbnQobnVsbCk7Ci0KLQkJCW5vdGlmeUF0dHJSZXBsYWNlZChudWxsLCBhdHRyKTsKLQkJCXJldHVybiBhdHRyOwotCQl9Ci0KLQkJLy8gbm90IGZvdW5kCi0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsIERPTU1lc3NhZ2VzLk5PVF9GT1VORF9FUlIpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUF0dHJpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQXR0ciByZW1vdmVBdHRyaWJ1dGVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gYXR0cmlidXRlCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFhdHRyLm1hdGNoTmFtZShuYW1lKSkKLQkJCQljb250aW51ZTsKLQotCQkJLy8gZm91bmQKLQkJCXRoaXMuYXR0ck5vZGVzLnJlbW92ZU5vZGUoaSk7Ci0JCQlhdHRyLnNldE93bmVyRWxlbWVudChudWxsKTsKLQotCQkJbm90aWZ5QXR0clJlcGxhY2VkKG51bGwsIGF0dHIpOwotCQkJcmV0dXJuIGF0dHI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEF0dHIgcmVtb3ZlQXR0cmlidXRlTm9kZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gYXR0cmlidXRlCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGF0dHIuZ2V0TG9jYWxOYW1lKCk7Ci0JCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgIWxvY2FsTmFtZS5lcXVhbHMobmFtZSkpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbnNVUkkgPSBhdHRyLmdldE5hbWVzcGFjZVVSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJaWYgKG5zVVJJICE9IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG5zVVJJID09IG51bGwgfHwgIW5zVVJJLmVxdWFscyh1cmkpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gZm91bmQKLQkJCXRoaXMuYXR0ck5vZGVzLnJlbW92ZU5vZGUoaSk7Ci0JCQlhdHRyLnNldE93bmVyRWxlbWVudChudWxsKTsKLQotCQkJbm90aWZ5QXR0clJlcGxhY2VkKG51bGwsIGF0dHIpOwotCQkJcmV0dXJuIGF0dHI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZW1vdmVBdHRyaWJ1dGVOb2RlTlModXJpLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVBdHRyaWJ1dGVzIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZXMoKSB7Ci0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwotCQkJCW5vdGlmeUF0dHJSZXBsYWNlZChudWxsLCBhdHRyKTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuYXR0ck5vZGVzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnQgcmVtb3ZlRW5kVGFnKCkgewotCQlpZiAoIWhhc0VuZFRhZygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGVMaXN0SW1wbCBhdHRyTm9kZXMgPSB0aGlzLmF0dHJOb2RlczsKLQkJdGhpcy5hdHRyTm9kZXMgPSBudWxsOyAvLyBub3QgdG8gY29weSBhdHRyaWJ1dGVzCi0JCUVsZW1lbnRJbXBsIGVuZCA9IChFbGVtZW50SW1wbCkgY2xvbmVOb2RlKGZhbHNlKTsKLQkJdGhpcy5hdHRyTm9kZXMgPSBhdHRyTm9kZXM7Ci0JCWlmIChlbmQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIG1vdmUgdGhlIGVuZCBmbGF0IG5vZGUgdG8gdGhlIGVuZCB0YWcKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlzZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCWVuZC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlyZXR1cm4gZW5kOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVN0YXJ0VGFnKCkgewotCQlyZW1vdmVBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLgotCSAqLwotCXZvaWQgcmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQlpZiAodGhpcy5hdHRyTm9kZXMgIT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJYXR0ci5yZXNldFJlZ2lvbnMoKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLnJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOyAvLyBmb3IgY2hpbGRyZW4KLQotCQl0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogc2V0QXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7IC8vIGNoYW5nZSB2YWx1ZQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbmV3IGF0dHJpYnV0ZQotCQlEb2N1bWVudCBkb2MgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYXR0ciA9IGRvYy5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCQlhcHBlbmRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCX0KLQotCS8qKgotCSAqIHNldEF0dHJpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlKEF0dHIgbmV3QXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdBdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm90aGluZyB0byBkbwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgbmV3QXR0cjsKLQkJRWxlbWVudCBvd25lciA9IGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChvd25lciAhPSBudWxsKSB7Ci0JCQlpZiAob3duZXIgPT0gdGhpcykKLQkJCQlyZXR1cm4gbnVsbDsgLy8gbm90aGluZyB0byBkbwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5VU0VfQVRUUklCVVRFX0VSUiwgRE9NTWVzc2FnZXMuSU5VU0VfQVRUUklCVVRFX0VSUik7Ci0JCX0KLQotCQlBdHRyIG9sZEF0dHIgPSByZW1vdmVBdHRyaWJ1dGVOb2RlKG5ld0F0dHIuZ2V0TmFtZSgpKTsKLQkJYXBwZW5kQXR0cmlidXRlTm9kZShhdHRyKTsKLQkJcmV0dXJuIG9sZEF0dHI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEF0dHIgc2V0QXR0cmlidXRlTm9kZU5TKEF0dHIgbmV3QXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdBdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm90aGluZyB0byBkbwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgbmV3QXR0cjsKLQkJRWxlbWVudCBvd25lciA9IGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChvd25lciAhPSBudWxsKSB7Ci0JCQlpZiAob3duZXIgPT0gdGhpcykKLQkJCQlyZXR1cm4gbnVsbDsgLy8gbm90aGluZyB0byBkbwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5VU0VfQVRUUklCVVRFX0VSUiwgRE9NTWVzc2FnZXMuSU5VU0VfQVRUUklCVVRFX0VSUik7Ci0JCX0KLQotCQlTdHJpbmcgbmFtZSA9IG5ld0F0dHIuZ2V0TG9jYWxOYW1lKCk7Ci0JCVN0cmluZyB1cmkgPSBuZXdBdHRyLmdldE5hbWVzcGFjZVVSSSgpOwotCQlBdHRyIG9sZEF0dHIgPSByZW1vdmVBdHRyaWJ1dGVOb2RlTlModXJpLCBuYW1lKTsKLQkJYXBwZW5kQXR0cmlidXRlTm9kZShhdHRyKTsKLQkJcmV0dXJuIG9sZEF0dHI7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHdlIHNob3VsZCBjaGVjayBmb3IgYW5kIHRocm93IE5BTUVTUEFDRV9FUlIsIGFjY29yZGluZyB0byBzcGVjLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHF1YWxpZmllZE5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5NTUyCi0JCS8vIGZpeCBwcm92aWRlZCBieSBWYWxlbnRpbiBCYWNpdQotCQlpbnQgaW5kZXggPSBxdWFsaWZpZWROYW1lLmluZGV4T2YoJzonKTsKLQkJU3RyaW5nIGxvY2FsTmFtZSA9IGluZGV4ICE9IC0xID8gcXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKSA6IHF1YWxpZmllZE5hbWU7Ci0KLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSwgbG9jYWxOYW1lKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7IC8vIGNoYW5nZSB2YWx1ZQotCQl9Ci0JCWVsc2UgewotCi0JCQkvLyBuZXcgYXR0cmlidXRlCi0JCQlEb2N1bWVudCBkb2MgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCQlhdHRyID0gZG9jLmNyZWF0ZUF0dHJpYnV0ZU5TKHVyaSwgcXVhbGlmaWVkTmFtZSk7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsKLQkJCQkJYXBwZW5kQXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21tZW50VGFnKGJvb2xlYW4gaXNDb21tZW50VGFnKSB7Ci0JCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJaWYgKGlzQ29tbWVudFRhZykKLQkJCWZUYWdGbGFncyB8PSBGTEFHX0NPTU1FTlQ7Ci0JCWVsc2UKLQkJCWZUYWdGbGFncyAmPSB+RkxBR19DT01NRU5UOwotCX0KLQotCS8qKgotCSAqIHNldEVtcHR5VGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBpc0VtcHR5VGFnCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW1wdHlUYWcoYm9vbGVhbiBpc0VtcHR5VGFnKSB7Ci0JCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJaWYgKGlzRW1wdHlUYWcpCi0JCQlmVGFnRmxhZ3MgfD0gRkxBR19FTVBUWTsKLQkJZWxzZQotCQkJZlRhZ0ZsYWdzICY9IH5GTEFHX0VNUFRZOwotCX0KLQotCS8qKgotCSAqIHNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKi8KLQl2b2lkIHNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZmxhdE5vZGU7Ci0KLQkJTm9kZUNvbnRhaW5lciBwYXJlbnQgPSAoTm9kZUNvbnRhaW5lcikgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5zeW5jQ2hpbGRFZGl0YWJsZVN0YXRlKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0SlNQVGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBpc0pTUFRhZwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpTUFRhZyhib29sZWFuIGlzSlNQVGFnKSB7Ci0JCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBOb2RlSW1wbC5FTVBUWV9TVFJJTkcpOwotCQl9Ci0KLQkJaWYgKGlzSlNQVGFnKQotCQkJZlRhZ0ZsYWdzIHw9IEZMQUdfSlNQOwotCQllbHNlCi0JCQlmVGFnRmxhZ3MgJj0gfkZMQUdfSlNQOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCWlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCkKLQkJCXRoaXMuZk5hbWVzcGFjZVVSSSA9IG51bGw7Ci0JCWVsc2UKLQkJCXRoaXMuZk5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSS50b0NoYXJBcnJheSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE93bmVyRG9jdW1lbnQoRG9jdW1lbnQgb3duZXJEb2N1bWVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCXN1cGVyLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCwgZGVlcCk7Ci0KLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWF0dHIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJSURPTU5vZGUgcGFyZW50ID0gKElET01Ob2RlKSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIE5vZGVJbXBsLkVNUFRZX1NUUklORyk7Ci0JCX0KLQotCQlpbnQgcHJlZml4TGVuZ3RoID0gKHByZWZpeCAhPSBudWxsID8gcHJlZml4Lmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZyBsb2NhbE5hbWUgPSBnZXRMb2NhbE5hbWUoKTsKLQkJaWYgKHByZWZpeExlbmd0aCA9PSAwKSB7Ci0JCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgbG9jYWxOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCQkvLyBpbnZhbGlkIGxvY2FsIG5hbWUKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlzZXRUYWdOYW1lKGxvY2FsTmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgbG9jYWxMZW5ndGggPSAobG9jYWxOYW1lICE9IG51bGwgPyBsb2NhbE5hbWUubGVuZ3RoKCkgOiAwKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHByZWZpeExlbmd0aCArIDEgKyBsb2NhbExlbmd0aCk7Ci0JCQlidWZmZXIuYXBwZW5kKHByZWZpeCk7Ci0JCQlidWZmZXIuYXBwZW5kKCc6Jyk7Ci0JCQlpZiAobG9jYWxOYW1lICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChsb2NhbE5hbWUpOwotCQkJc2V0VGFnTmFtZShidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlib29sZWFuIGNoYW5nZUVuZFRhZyA9IGhhc0VuZFRhZygpOwotCQlub3RpZnlTdGFydFRhZ0NoYW5nZWQoKTsKLQkJaWYgKGNoYW5nZUVuZFRhZykKLQkJCW5vdGlmeUVuZFRhZ0NoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKi8KLQl2b2lkIHNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUYWdOYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFnTmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQl0aGlzLmZUYWdOYW1lID0gQ2hhcmFjdGVyU3RyaW5nUG9vbC5nZXRDaGFyU3RyaW5nKHRhZ05hbWUpOwotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyB0YWdOYW1lID0gZ2V0VGFnTmFtZSgpOwotCQlpZiAoaGFzU3RhcnRUYWcoKSkKLQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCWlmIChpc0VtcHR5VGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKCcvJyk7Ci0JCWlmIChoYXNFbmRUYWcoKSkgewotCQkJYnVmZmVyLmFwcGVuZCgnLycpOwotCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJfQotCQlpZiAoYnVmZmVyLmxlbmd0aCgpID09IDApCi0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnQCcpOwotCQkJYnVmZmVyLmFwcGVuZChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi50b1N0cmluZygpKTsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJ0AnKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNJZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIGJvb2xlYW4gaXNJZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5vZGUoQXR0ciBpZEF0dHIsIGJvb2xlYW4gaXNJZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZTM5Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbnRpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI5Njk5OSAtIEluZWZmaWNpZW50IHVzZSBvZiBuZXcgU3RyaW5nKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotLyoqCi0gKiBFbnRpdHlJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBFbnRpdHkgewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgbm90YXRpb25OYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCi0JLyoqCi0JICogRW50aXR5SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEVudGl0eUltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgRW50aXR5SW1wbAotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlJbXBsKEVudGl0eUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLm5hbWUgPSB0aGF0Lm5hbWU7Ci0JCQl0aGlzLnB1YmxpY0lkID0gdGhhdC5wdWJsaWNJZDsKLQkJCXRoaXMuc3lzdGVtSWQgPSB0aGF0LnN5c3RlbUlkOwotCQkJdGhpcy5ub3RhdGlvbk5hbWUgPSB0aGF0Lm5vdGF0aW9uTmFtZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRW50aXR5SW1wbCBjbG9uZWQgPSBuZXcgRW50aXR5SW1wbCh0aGlzKTsKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSB0ZXh0IGRlY2xhcmF0aW9uLCB0aGUgZW5jb2RpbmcKLQkgKiBvZiB0aGlzIGVudGl0eSwgd2hlbiBpdCBpcyBhbiBleHRlcm5hbCBwYXJzZWQgZW50aXR5LiBUaGlzIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRU5USVRZX05PREU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm90YXRpb25OYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5ub3RhdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSB0ZXh0IGRlY2xhcmF0aW9uLCB0aGUgdmVyc2lvbgotCSAqIG51bWJlciBvZiB0aGlzIGVudGl0eSwgd2hlbiBpdCBpcyBhbiBleHRlcm5hbCBwYXJzZWQgZW50aXR5LiBUaGlzIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIHRleHQgZGVjbGFyYXRpb24sIHRoZSBlbmNvZGluZwotCSAqIG9mIHRoaXMgZW50aXR5LCB3aGVuIGl0IGlzIGFuIGV4dGVybmFsIHBhcnNlZCBlbnRpdHkuIFRoaXMgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nKGphdmEubGFuZy5TdHJpbmcgZW5jb2RpbmcpIHsKLQl9Ci0KLQkvKioKLQkgKiBzZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIHNldE5vdGF0aW9uTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm90YXRpb25OYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90YXRpb25OYW1lKFN0cmluZyBub3RhdGlvbk5hbWUpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQl0aGlzLm5vdGF0aW9uTmFtZSA9IG5vdGF0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRQdWJsaWNJZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQl0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICogc2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJdGhpcy5zeXN0ZW1JZCA9IHN5c3RlbUlkOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgdGV4dCBkZWNsYXJhdGlvbiwgdGhlIHZlcnNpb24KLQkgKiBudW1iZXIgb2YgdGhpcyBlbnRpdHksIHdoZW4gaXQgaXMgYW4gZXh0ZXJuYWwgcGFyc2VkIGVudGl0eS4gVGhpcyBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24pIHsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElucHV0RW5jb2RpbmcoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRYbWxFbmNvZGluZygpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sVmVyc2lvbigpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbnRpdHlSZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZWRiMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbnRpdHlSZWZlcmVuY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk2OTk5IC0gSW5lZmZpY2llbnQgdXNlIG9mIG5ldyBTdHJpbmcoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLS8qKgotICogRW50aXR5UmVmZXJlbmNlIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlSZWZlcmVuY2VJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBFbnRpdHlSZWZlcmVuY2UgewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBFbnRpdHlSZWZlcmVuY2VJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEVudGl0eVJlZmVyZW5jZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRW50aXR5UmVmZXJlbmNlSW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBFbnRpdHlSZWZlcmVuY2VJbXBsCi0JICovCi0JcHJvdGVjdGVkIEVudGl0eVJlZmVyZW5jZUltcGwoRW50aXR5UmVmZXJlbmNlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZSA9IHRoYXQubmFtZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRW50aXR5UmVmZXJlbmNlSW1wbCBjbG9uZWQgPSBuZXcgRW50aXR5UmVmZXJlbmNlSW1wbCh0aGlzKTsKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRU5USVRZX1JFRkVSRU5DRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIHNldE5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0ludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzYTA3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0ludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIFRocm93biBhbiBpbnZhbGlkIGNoYXJhY3RlciBpcyBzcGVjaWZpZWQgaW4gOiBYTUxOb2RlI3NldFNvdXJjZShTdHJpbmcpCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIERlZmF1bHQgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIGNoYXIgaW52YWxpZENoYXIgPSAwOwotCXByaXZhdGUgaW50IG9mZnNldCA9IC0xOwotCi0JLyoqCi0JICovCi0JcHVibGljIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24oU3RyaW5nIHMsIGNoYXIgYykgewotCQlzdXBlcihzKTsKLQkJdGhpcy5pbnZhbGlkQ2hhciA9IGM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24oU3RyaW5nIHMsIGNoYXIgYywgaW50IG9mZnNldCkgewotCQlzdXBlcihzKTsKLQkJdGhpcy5pbnZhbGlkQ2hhciA9IGM7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBjaGFyIGdldEludmFsaWRDaGFyKCkgewotCQlyZXR1cm4gdGhpcy5pbnZhbGlkQ2hhcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHRoaXMub2Zmc2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQVGFnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjJkZTQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiBKU1BUYWcgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQVGFnIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfQ0xPU0UgPSAiLS0lPiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9PUEVOID0gIjwlLS0iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0xBUkFUSU9OX1RPS0VOID0gIiEiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElWRV9UT0tFTiA9ICJAIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX1RPS0VOID0gIj0iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTiA9ICJqc3A6ZGVjbGFyYXRpb24iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkUgPSAianNwOmRpcmVjdGl2ZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VYUFJFU1NJT04gPSAianNwOmV4cHJlc3Npb24iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ST09UID0gImpzcDpyb290IjsvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9TQ1JJUFRMRVQgPSAianNwOnNjcmlwdGxldCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NMT1NFID0gIiU+IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfT1BFTiA9ICI8JSI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Nb2RlbFBhcnNlckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTW9kZWxQYXJzZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MTkwN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Nb2RlbFBhcnNlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUGFyc2VyQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5CZUltcGxpY2l0VGFnKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5CZUltcGxpY2l0VGFnKEVsZW1lbnQgZWxlbWVudCwgTm9kZSBjaGlsZCk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Db250YWluKEVsZW1lbnQgZWxlbWVudCwgTm9kZSBjaGlsZCk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVDb21tZW50RWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpOwotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlSW1wbGljaXRFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbmRSb290TmFtZShTdHJpbmcgdGFnTmFtZSk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KTsKLQotCWJvb2xlYW4gaXNFbmRUYWdPbWlzc2libGUoRWxlbWVudCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZjZkNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk2OTk5IC0gSW5lZmZpY2llbnQgdXNlIG9mIG5ldyBTdHJpbmcoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogTm9kZUNvbnRhaW5lciBjbGFzcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUNvbnRhaW5lciBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgTm9kZSwgTm9kZUxpc3QgewotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDaGlsZE5vZGVzQ2FjaGUgaW1wbGVtZW50cyBOb2RlTGlzdCB7Ci0JCXByaXZhdGUgTm9kZSBjdXJDaGlsZCA9IG51bGw7Ci0JCXByaXZhdGUgaW50IGN1ckluZGV4ID0gLTE7Ci0JCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkJQ2hpbGROb2Rlc0NhY2hlKCkgewotCQkJaW5pdGlhbGl6ZUNhY2hlKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCS8vIGF0b21pYwotCQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDYWNoZSgpIHsKLQkJCS8vIG5vdGUgd2UgdXNlIHRoZSBvdXR0ZXIgb2JqZWN0cyBsb2Nrb2JqZWN0Ci0JCQkvLyAoc2luY2Ugd2UgYXJlIHVzaW5nIHRoZWlyICJjaGlsZHJlbiIuCi0JCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCQlmb3IgKE5vZGUgY2hpbGQgPSBmaXJzdENoaWxkOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJdGhpcy5sZW5ndGgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQkJaWYgKHRoaXMubGVuZ3RoID09IDApCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWlmIChpbmRleCA8IDApCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWlmIChpbmRleCA+PSB0aGlzLmxlbmd0aCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCQlpZiAodGhpcy5jdXJJbmRleCA8IDApIHsgLy8gZmlyc3QgdGltZQotCQkJCQlpZiAoaW5kZXggKiAyID49IHRoaXMubGVuZ3RoKSB7IC8vIHNlYXJjaCBmcm9tIHRoZSBsYXN0Ci0JCQkJCQl0aGlzLmN1ckluZGV4ID0gdGhpcy5sZW5ndGggLSAxOwotCQkJCQkJdGhpcy5jdXJDaGlsZCA9IGxhc3RDaGlsZDsKLQkJCQkJfSBlbHNlIHsgLy8gc2VhcmNoIGZyb20gdGhlIGZpcnN0Ci0JCQkJCQl0aGlzLmN1ckluZGV4ID0gMDsKLQkJCQkJCXRoaXMuY3VyQ2hpbGQgPSBmaXJzdENoaWxkOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGluZGV4ID09IHRoaXMuY3VySW5kZXgpCi0JCQkJCXJldHVybiB0aGlzLmN1ckNoaWxkOwotCi0JCQkJaWYgKGluZGV4ID4gdGhpcy5jdXJJbmRleCkgewotCQkJCQl3aGlsZSAoaW5kZXggPiB0aGlzLmN1ckluZGV4KSB7Ci0JCQkJCQl0aGlzLmN1ckluZGV4Kys7Ci0JCQkJCQl0aGlzLmN1ckNoaWxkID0gdGhpcy5jdXJDaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsgLy8gaW5kZXggPCB0aGlzLmN1ckluZGV4Ci0JCQkJCXdoaWxlIChpbmRleCA8IHRoaXMuY3VySW5kZXgpIHsKLQkJCQkJCXRoaXMuY3VySW5kZXgtLTsKLQkJCQkJCXRoaXMuY3VyQ2hpbGQgPSB0aGlzLmN1ckNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRoaXMuY3VyQ2hpbGQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE5vZGVMaXN0IGNoaWxkTm9kZXNDYWNoZSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkNoaWxkRWRpdGFibGUgPSB0cnVlOwotCU5vZGVJbXBsIGZpcnN0Q2hpbGQgPSBudWxsOwotCU5vZGVJbXBsIGxhc3RDaGlsZCA9IG51bGw7Ci0KLQlPYmplY3QgbG9ja09iamVjdCA9IG5ldyBieXRlWzBdOwotCi0JLyoqCi0JICogTm9kZUNvbnRhaW5lciBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBOb2RlQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vZGVDb250YWluZXIgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgTm9kZUNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBOb2RlQ29udGFpbmVyKE5vZGVDb250YWluZXIgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBhcHBlbmRDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBhcHBlbmRDaGlsZChOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGluc2VydEJlZm9yZShuZXdDaGlsZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogY2xvbmVDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsb25lQ2hpbGROb2RlcyhOb2RlIG5ld1BhcmVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCWlmIChuZXdQYXJlbnQgPT0gbnVsbCB8fCBuZXdQYXJlbnQgPT0gdGhpcykKLQkJCXJldHVybjsKLQkJaWYgKCEobmV3UGFyZW50IGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikpCi0JCQlyZXR1cm47Ci0KLQkJTm9kZUNvbnRhaW5lciBjb250YWluZXIgPSAoTm9kZUNvbnRhaW5lcikgbmV3UGFyZW50OwotCQljb250YWluZXIucmVtb3ZlQ2hpbGROb2RlcygpOwotCi0JCWZvciAoTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlOb2RlIGNsb25lZCA9IGNoaWxkLmNsb25lTm9kZShkZWVwKTsKLQkJCWlmIChjbG9uZWQgIT0gbnVsbCkKLQkJCQljb250YWluZXIuYXBwZW5kQ2hpbGQoY2xvbmVkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldENoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBnZXRGaXJzdENoaWxkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmZpcnN0Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGFzdENoaWxkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldExhc3RDaGlsZCgpIHsKLQkJcmV0dXJuIHRoaXMubGFzdENoaWxkOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpZiAodGhpcy5maXJzdENoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQlpZiAodGhpcy5jaGlsZE5vZGVzQ2FjaGUgPT0gbnVsbCkKLQkJCQl0aGlzLmNoaWxkTm9kZXNDYWNoZSA9IG5ldyBDaGlsZE5vZGVzQ2FjaGUoKTsKLQkJCXJldHVybiB0aGlzLmNoaWxkTm9kZXNDYWNoZS5nZXRMZW5ndGgoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHNvdXJjZSA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZSk7Ci0JCX0KLQotCQlmb3IgKE5vZGVJbXBsIGNoaWxkID0gZmlyc3RDaGlsZDsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSAoTm9kZUltcGwpIGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBjaGlsZC5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZSk7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dCgpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlKTsKLQkJfQotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBoYXNDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkTm9kZXMoKSB7Ci0JCXJldHVybiAodGhpcy5maXJzdENoaWxkICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEJlZm9yZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gcmVmQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBpbnNlcnRCZWZvcmUoTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIG5vdGhpbmcgdG8gZG8KLQkJaWYgKHJlZkNoaWxkICE9IG51bGwgJiYgcmVmQ2hpbGQuZ2V0UGFyZW50Tm9kZSgpICE9IHRoaXMpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsIERPTU1lc3NhZ2VzLk5PVF9GT1VORF9FUlIpOwotCQl9Ci0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCQlpZiAobmV3Q2hpbGQgPT0gcmVmQ2hpbGQpCi0JCQlyZXR1cm4gbmV3Q2hpbGQ7IC8vIG5vdGhpbmcgdG8gZG8KLQkJLy9uZXcgY2hpbGQgY2FuIG5vdCBiZSBhIHBhcmVudCBvZiB0aGlzLCB3b3VsZCBjYXVzZSBjeWNsZQotCQlpZihpc1BhcmVudChuZXdDaGlsZCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgRE9NTWVzc2FnZXMuSElFUkFSQ0hZX1JFUVVFU1RfRVJSKTsKLQkJfQotCi0JCWlmIChuZXdDaGlsZC5nZXROb2RlVHlwZSgpID09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHsKLQkJCS8vIGluc2VydCBjaGlsZCBub2RlcyBpbnN0ZWFkCi0JCQlmb3IgKE5vZGUgY2hpbGQgPSBuZXdDaGlsZC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gbmV3Q2hpbGQuZ2V0Rmlyc3RDaGlsZCgpKSB7Ci0JCQkJbmV3Q2hpbGQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCWluc2VydEJlZm9yZShjaGlsZCwgcmVmQ2hpbGQpOwotCQkJfQotCQkJcmV0dXJuIG5ld0NoaWxkOwotCQl9Ci0JCS8vIHN5bmNocm9uaXplZCBpbiBjYXNlIGFub3RoZXIgdGhyZWFkIGlzIGdldHRpbmcgaXRlbSwgb3IgbGVuZ3RoCi0JCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJdGhpcy5jaGlsZE5vZGVzQ2FjaGUgPSBudWxsOyAvLyBpbnZhbGlkYXRlIGNoaWxkIG5vZGVzIGNhY2hlCi0JCX0KLQotCQlOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgbmV3Q2hpbGQ7Ci0JCU5vZGVJbXBsIG5leHQgPSAoTm9kZUltcGwpIHJlZkNoaWxkOwotCQlOb2RlSW1wbCBwcmV2ID0gbnVsbDsKLQkJTm9kZSBvbGRQYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChvbGRQYXJlbnQgIT0gbnVsbCkKLQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCWlmIChuZXh0ID09IG51bGwpIHsKLQkJCXByZXYgPSB0aGlzLmxhc3RDaGlsZDsKLQkJCXRoaXMubGFzdENoaWxkID0gY2hpbGQ7Ci0JCX0gZWxzZSB7Ci0JCQlwcmV2ID0gKE5vZGVJbXBsKSBuZXh0LmdldFByZXZpb3VzU2libGluZygpOwotCQkJbmV4dC5zZXRQcmV2aW91c1NpYmxpbmcoY2hpbGQpOwotCQl9Ci0JCWlmIChwcmV2ID09IG51bGwpCi0JCQl0aGlzLmZpcnN0Q2hpbGQgPSBjaGlsZDsKLQkJZWxzZQotCQkJcHJldi5zZXROZXh0U2libGluZyhjaGlsZCk7Ci0JCWNoaWxkLnNldFByZXZpb3VzU2libGluZyhwcmV2KTsKLQkJY2hpbGQuc2V0TmV4dFNpYmxpbmcobmV4dCk7Ci0JCWNoaWxkLnNldFBhcmVudE5vZGUodGhpcyk7Ci0JCS8vIG1ha2Ugc3VyZSBoYXZpbmcgdGhlIHNhbWUgb3duZXIgZG9jdW1lbnQKLQkJaWYgKGNoaWxkLmdldE93bmVyRG9jdW1lbnQoKSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0Tm9kZVR5cGUoKSA9PSBET0NVTUVOVF9OT0RFKSB7Ci0JCQkJY2hpbGQuc2V0T3duZXJEb2N1bWVudCgoRG9jdW1lbnQpIHRoaXMpOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZC5zZXRPd25lckRvY3VtZW50KGdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlub3RpZnlDaGlsZFJlcGxhY2VkKGNoaWxkLCBudWxsKTsKLQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDaGlsZEVkaXRhYmxlKCkgewotCQlpZiAoIWZDaGlsZEVkaXRhYmxlKSB7Ci0JCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBnZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuaXNSZXBhcnNpbmcoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmQ2hpbGRFZGl0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBpc0NvbnRhaW5lciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmICh0aGlzLmZpcnN0Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCWlmICh0aGlzLmNoaWxkTm9kZXNDYWNoZSA9PSBudWxsKQotCQkJCXRoaXMuY2hpbGROb2Rlc0NhY2hlID0gbmV3IENoaWxkTm9kZXNDYWNoZSgpOwotCQkJcmV0dXJuIHRoaXMuY2hpbGROb2Rlc0NhY2hlLml0ZW0oaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5Q2hpbGRSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlDaGlsZFJlcGxhY2VkKE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJc3luY0NoaWxkRWRpdGFibGVTdGF0ZShuZXdDaGlsZCk7Ci0KLQkJRE9NTW9kZWxJbXBsIG1vZGVsID0gKERPTU1vZGVsSW1wbCkgZG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLmNoaWxkUmVwbGFjZWQodGhpcywgbmV3Q2hpbGQsIG9sZENoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSByZW1vdmVDaGlsZChOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG9sZENoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9sZENoaWxkLmdldFBhcmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLCBET01NZXNzYWdlcy5OT1RfRk9VTkRfRVJSKTsKLQkJfQotCi0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCS8vIHN5bmNocm9uaXplZCBpbiBjYXNlIGFub3RoZXIgdGhyZWFkIGlzIGdldHRpbmcgaXRlbSwgb3IgbGVuZ3RoCi0JCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJdGhpcy5jaGlsZE5vZGVzQ2FjaGUgPSBudWxsOyAvLyBpbnZhbGlkYXRlIGNoaWxkIG5vZGVzIGNhY2hlCi0JCX0KLQotCQlOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgb2xkQ2hpbGQ7Ci0JCU5vZGVJbXBsIHByZXYgPSAoTm9kZUltcGwpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCi0JCWNoaWxkLnNldEVkaXRhYmxlKHRydWUsIHRydWUpOyAvLyBjbGVhciBSZWFkT25seSBmbGFncwotCi0JCWlmIChwcmV2ID09IG51bGwpCi0JCQl0aGlzLmZpcnN0Q2hpbGQgPSBuZXh0OwotCQllbHNlCi0JCQlwcmV2LnNldE5leHRTaWJsaW5nKG5leHQpOwotCQlpZiAobmV4dCA9PSBudWxsKQotCQkJdGhpcy5sYXN0Q2hpbGQgPSBwcmV2OwotCQllbHNlCi0JCQluZXh0LnNldFByZXZpb3VzU2libGluZyhwcmV2KTsKLQkJY2hpbGQuc2V0UHJldmlvdXNTaWJsaW5nKG51bGwpOwotCQljaGlsZC5zZXROZXh0U2libGluZyhudWxsKTsKLQkJY2hpbGQuc2V0UGFyZW50Tm9kZShudWxsKTsKLQotCQlub3RpZnlDaGlsZFJlcGxhY2VkKG51bGwsIGNoaWxkKTsKLQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGROb2RlcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZE5vZGVzKCkgewotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlOb2RlIG5leHRDaGlsZCA9IG51bGw7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBuZXh0Q2hpbGQpIHsKLQkJCW5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlyZW1vdmVDaGlsZChjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudAotCSAqIEBwYXJhbSBmaXJzdENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGxhc3RDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IHJlbW92ZUNoaWxkTm9kZXMoTm9kZSBmaXJzdENoaWxkLCBOb2RlIGxhc3RDaGlsZCkgewotCQlpZiAoIWhhc0NoaWxkTm9kZXMoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCWlmIChnZXROb2RlVHlwZSgpID09IERPQ1VNRU5UX05PREUpCi0JCQlkb2N1bWVudCA9IChEb2N1bWVudCkgdGhpczsKLQkJZWxzZQotCQkJZG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCURvY3VtZW50RnJhZ21lbnQgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Ci0JCWlmIChmcmFnbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKGZpcnN0Q2hpbGQgPT0gbnVsbCkKLQkJCWZpcnN0Q2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChsYXN0Q2hpbGQgPT0gbnVsbCkKLQkJCWxhc3RDaGlsZCA9IGdldExhc3RDaGlsZCgpOwotCQlOb2RlIG5leHRDaGlsZCA9IG51bGw7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGZpcnN0Q2hpbGQ7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gbmV4dENoaWxkKSB7Ci0JCQluZXh0Q2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJcmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJaWYgKGNoaWxkID09IGxhc3RDaGlsZCkKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBmcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVwbGFjZUNoaWxkKE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpCi0JCQlpbnNlcnRCZWZvcmUobmV3Q2hpbGQsIG9sZENoaWxkKTsKLQkJcmV0dXJuIHJlbW92ZUNoaWxkKG9sZENoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJaWYgKGZDaGlsZEVkaXRhYmxlID09IGVkaXRhYmxlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlSZWFkT25seUNvbnRyb2xsZXIgcm9jID0gUmVhZE9ubHlDb250cm9sbGVyLmdldEluc3RhbmNlKCk7Ci0JCU5vZGUgbm9kZTsKLQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQlmb3IgKG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCXJvYy51bmxvY2tOb2RlKChJRE9NTm9kZSkgbm9kZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCXJvYy5sb2NrTm9kZSgoSURPTU5vZGUpIG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJZkNoaWxkRWRpdGFibGUgPSBlZGl0YWJsZTsKLQkJbm90aWZ5RWRpdGFibGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0NoaWxkRWRpdGFibGVTdGF0ZShOb2RlIGNoaWxkKSB7Ci0JCVJlYWRPbmx5Q29udHJvbGxlciByb2MgPSBSZWFkT25seUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKGZDaGlsZEVkaXRhYmxlKSB7Ci0JCQlyb2MudW5sb2NrTm9kZSgoTm9kZUltcGwpIGNoaWxkKTsKLQkJfSBlbHNlIHsKLQkJCXJvYy5sb2NrTm9kZSgoTm9kZUltcGwpIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPkNoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIDxjb2RlPk5vZGU8L2NvZGU+IGlzIGEgcGFyZW50IG9mIDxjb2RlPnRoaXM8L2NvZGU+IG5vZGU8L3A+Ci0JICogCi0JICogQHBhcmFtIHBvc3NpYmxlUGFyZW50IHRoZSBwb3NzaWJsZSBwYXJlbnQgPGNvZGU+Tm9kZTwvY29kZT4gb2YgPGNvZGU+dGhpczwvY29kZT4gbm9kZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+cG9zc2libGVQYXJlbnQ8L2NvZGU+IGlzIHRoZSBwYXJlbnQgb2YgPGNvZGU+dGhpczwvY29kZT4sCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNQYXJlbnQoTm9kZSBwb3NzaWJsZVBhcmVudCkgewotCQlOb2RlIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZShwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgIT0gcG9zc2libGVQYXJlbnQpIHsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50ID09IHBvc3NpYmxlUGFyZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4ZGViOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTUxMjcgLSBpbXBsZW1lbnQgaXNTYW1lTm9kZSBhbmQgY29tcGFyZURvY3VtZW50UG9zaXRpb24gbWV0aG9kcy4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXQgVGVzdHMgY292ZXJlZCBpbiB3c3QueHNsIFhQYXRoIDIuMCB0ZXN0cy4KLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI5Njk5OSAtIEluZWZmaWNpZW50IHVzZSBvZiBuZXcgU3RyaW5nKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0Tm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5UeXBlSW5mbzsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLS8qKgotICogTm9kZUltcGwgY2xhc3MKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVJbXBsIGV4dGVuZHMgQWJzdHJhY3ROb3RpZmllciBpbXBsZW1lbnRzIE5vZGUsIElET01Ob2RlIHsKLQkvLyBkZWZpbmUgb25lIGVtcHR5IG5vZGVsaXN0LCBmb3IgcmVwZWF0ZWQgdXNlCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTm9kZUxpc3QgRU1QVFlfTk9ERV9MSVNUID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCS8vIERvY3VtZW50UG9zaXRpb24KLQkvL3ByaXZhdGUgZmluYWwgc3RhdGljIHNob3J0ICAgICAgRE9DVU1FTlRfUE9TSVRJT05fRElTQ09OTkVDVEVEID0gMHgwMTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBzaG9ydCAgICAgIERPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORyAgICA9IDB4MDI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgc2hvcnQgICAgICBET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcgICAgPSAweDA0OwotICAgIC8vcHJpdmF0ZSBmaW5hbCBzdGF0aWMgc2hvcnQgICAgICBET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUyAgICAgPSAweDA4OwotCS8vcHJpdmF0ZSBmaW5hbCBzdGF0aWMgc2hvcnQgICAgICBET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkgPSAweDEwOwotCXByaXZhdGUgZmluYWwgc3RhdGljIHNob3J0ICAgICAgRE9DVU1FTlRfUE9TSVRJT05fSU1QTEVNRU5UQVRJT05fU1BFQ0lGSUMgPSAweDIwOwotCi0KLQlwcml2YXRlIGJvb2xlYW4gZkRhdGFFZGl0YWJsZSA9IHRydWU7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQlwcml2YXRlIE5vZGVJbXBsIG5leHRTaWJsaW5nID0gbnVsbDsKLQotCXByaXZhdGUgRG9jdW1lbnRJbXBsIG93bmVyRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgTm9kZUltcGwgcGFyZW50Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlSW1wbCBwcmV2aW91c1NpYmxpbmcgPSBudWxsOwotCS8vIGRlZmluZSBvbmUgZW1wdHkgU3RyaW5nIGNvbnN0YW50IGZvciByZXBlYXRlZCB1c2UKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOwotCQotCS8qKgotCSAqIE5vZGVJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vZGVJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIE5vZGVJbXBsCi0JICovCi0JcHJvdGVjdGVkIE5vZGVJbXBsKE5vZGVJbXBsIHRoYXQpIHsKLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5vd25lckRvY3VtZW50ID0gdGhhdC5vd25lckRvY3VtZW50OwotCQl9Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgRE9NTWVzc2FnZXMuSElFUkFSQ0hZX1JFUVVFU1RfRVJSKTsKLQl9Ci0KLQkvKioKLQkgKiBjb250YWlucyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiAob2Zmc2V0ID49IGdldFN0YXJ0T2Zmc2V0KCkgJiYgb2Zmc2V0IDwgZ2V0RW5kT2Zmc2V0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVET01FeGNlcHRpb25NZXNzYWdlKHNob3J0IHMsIFN0cmluZyB0YWdOYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyBUT0RPOiBTaG91bGQgbG9jYWxpemUgdGhlc2UgbWVzc2FnZXMsIGFuZCBwcm92aWRlIC91IGVzY2FwZWQKLQkJLy8gdmVyc2lvbiBvZiB0YWdOYW1lCi0JCXJlc3VsdCA9IGxvb2t1cE1lc3NhZ2UocykgKyAiICIgKyB0YWdOYW1lOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcAotCSAqLwotCXB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDaGFyVmFsdWUoU3RyaW5nIG5hbWUpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZG9jdW1lbnQuZ2V0Q2hhclZhbHVlKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIGdldENoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQkvLyBBcyBwZXIgRE9NIHNwZWMsIGNvcnJlY3QgYmVoYXZpb3IgZm9yIGdldENoaWxkTm9kZXMgaXMgdG8gcmV0dXJuIGEKLQkJLy8gemVybyBsZW5ndGggTm9kZUxpc3QsIG5vdCBudWxsLCB3aGVuIHRoZXJlIGFyZSBubyBjaGlsZHJlbi4KLQkJLy8gV2UnbGwgdXNlIGEgY29tbW9uIGluc3RhbmNlIG9mIGFuIGVtcHR5IG5vZGUgbGlzdCwganVzdCB0byBwcmV2ZW50Ci0JCS8vIGNyZWF0aW5nIGEgdHJpdmFsIG9iamVjdCBtYW55IG1hbnkgdGltZXMuCi0KLQkJcmV0dXJuIEVNUFRZX05PREVfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb21tb25BbmNlc3RvciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldENvbW1vbkFuY2VzdG9yKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChOb2RlIG5hID0gbm9kZTsgbmEgIT0gbnVsbDsgbmEgPSBuYS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWZvciAoTm9kZSB0YSA9IHRoaXM7IHRhICE9IG51bGw7IHRhID0gdGEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHRhID09IG5hKQotCQkJCQlyZXR1cm4gdGE7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICogZ2V0Q29udGFpbmVyRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRDb250YWluZXJEb2N1bWVudCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBudWxsOwotCQlmb3IgKE5vZGUgbm9kZSA9IHRoaXM7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IHBhcmVudCkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQlyZXR1cm4gKERvY3VtZW50KSBub2RlOwotCQkJfQotCQkJLyogQnJlYWsgb3V0IG9mIGEgYmFkIGhpZXJhcmNoeSAqLwotCQkJaWYgKChwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgPT0gbm9kZSkKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJTm9kZSBub2RlID0gdGhpczsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJCX0KLQotCQkJTm9kZSBsYXN0ID0gbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCWlmIChsYXN0ICE9IG51bGwpIHsgLy8gZGlnIGludG8gdGhlIGxhc3QKLQkJCQlub2RlID0gbGFzdDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAobGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCXJldHVybiBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCi0JCQlOb2RlIHByZXYgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHByZXYgIT0gbnVsbCkgeyAvLyBtb3ZlIHRvIHRoZSBwcmV2aW91cwotCQkJCW5vZGUgPSBwcmV2OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJbm9kZSA9IG51bGw7Ci0JCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCQkJCXJldHVybiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJCQl9Ci0JCQkJTm9kZSBwYXJlbnRQcmV2ID0gcGFyZW50LmdldFByZXZpb3VzU2libGluZygpOwotCQkJCWlmIChwYXJlbnRQcmV2ICE9IG51bGwpIHsgLy8gbW92ZSB0byB0aGUgcHJldmlvdXMKLQkJCQkJbm9kZSA9IHBhcmVudFByZXY7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCUlET01Nb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlGYWN0b3J5UmVnaXN0cnkgcmVnID0gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCQlpZiAocmVnICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlZzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRGaXJzdENoaWxkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGhpcy5mbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsgLy8gZXJyb3IKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQgPT0gdGhpcykKLQkJCQlyZXR1cm4gaW5kZXg7Ci0JCQlpbmRleCsrOwotCQl9Ci0JCXJldHVybiAtMTsgLy8gZXJyb3IKLQl9Ci0KLQkvKioKLQkgKiBnZXRMYXN0Q2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0aGlzLmZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FuIGp1c3QgcmVmZXIgdG8gdGhlIG93bmluZyBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBJRE9NTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCWlmICh0aGlzLm93bmVyRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogYWxsIGJ1dCBhdHRyIHJldHVybiBudWxsCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROZXh0U2libGluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXROZXh0U2libGluZygpIHsKLQkJcmV0dXJuIHRoaXMubmV4dFNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZUF0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCU5vZGUgZ2V0Tm9kZUF0KGludCBvZmZzZXQpIHsKLQkJSURPTU5vZGUgcGFyZW50ID0gdGhpczsKLQkJSURPTU5vZGUgY2hpbGQgPSAoSURPTU5vZGUpIGdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXRFbmRPZmZzZXQoKSA8PSBvZmZzZXQpIHsKLQkJCQljaGlsZCA9IChJRE9NTm9kZSkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjaGlsZC5nZXRTdGFydE9mZnNldCgpID4gb2Zmc2V0KSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBjaGlsZC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCkgPiBvZmZzZXQpCi0JCQkJCXJldHVybiBjaGlsZDsKLQkJCX0KLQotCQkJLy8gZGlnIG1vcmUKLQkJCXBhcmVudCA9IGNoaWxkOwotCQkJY2hpbGQgPSAoSURPTU5vZGUpIHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRPd25lckRvY3VtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQYXJlbnROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldFByZXZpb3VzU2libGluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRQcmV2aW91c1NpYmxpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnByZXZpb3VzU2libGluZzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCXJldHVybiB0aGlzLmZsYXROb2RlLmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTdGFydE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlOb2RlSW1wbCBwcmV2ID0gKE5vZGVJbXBsKSBnZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJaWYgKHByZXYgIT0gbnVsbCkKLQkJCXJldHVybiBwcmV2LmdldEVuZE9mZnNldCgpOwotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQlpZiAoZWxlbWVudC5oYXNTdGFydFRhZygpKQotCQkJCXJldHVybiBlbGVtZW50LmdldFN0YXJ0RW5kT2Zmc2V0KCk7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQl9Ci0JCS8vIGZpbmFsIGZhbGxiYWNrIHRvIGxvb2sgaW50byBmaXJzdCBjaGlsZAotCQlOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjaGlsZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGNoaWxkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQkJcmV0dXJuIGNoaWxkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQljaGlsZCA9IChOb2RlSW1wbCkgY2hpbGQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBub2RlIChpbmRpcmVjdGx5KSBrbm93cyBpdHMgc3RydWN0dXJlZERvY3VtZW50Ci0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlyZXR1cm4gZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZmxhdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogYWxsIGJ1dCBhdHRyIHJldHVybiBudWxsCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFZhbHVlUmVnaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlU291cmNlKCkgewotCQlyZXR1cm4gZ2V0Tm9kZVZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGhhc0NoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGhhc1Byb3BlcnRpZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGluc2VydEJlZm9yZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gcmVmQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBpbnNlcnRCZWZvcmUoTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgRE9NTWVzc2FnZXMuSElFUkFSQ0hZX1JFUVVFU1RfRVJSKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkRWRpdGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogaXNDb250YWluZXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RhdGFFZGl0YWJsZSgpIHsKLQkJaWYgKCFmRGF0YUVkaXRhYmxlKSB7Ci0JCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBnZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuaXNSZXBhcnNpbmcoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmRGF0YUVkaXRhYmxlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQlpZiAodGhpcy5vd25lckRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCURPTUltcGxlbWVudGF0aW9uIGltcGwgPSB0aGlzLm93bmVyRG9jdW1lbnQuZ2V0SW1wbGVtZW50YXRpb24oKTsKLQkJaWYgKGltcGwgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGltcGwuaGFzRmVhdHVyZShmZWF0dXJlLCB2ZXJzaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBsb29rdXBNZXNzYWdlKHNob3J0IHMpIHsKLQkJLy8gVE9ETzogbWFrZSBsb2NhbGl6ZWQgdmVyc2lvbgotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJc3dpdGNoIChzKSB7Ci0JCQljYXNlIERPTUV4Y2VwdGlvbi5ET01TVFJJTkdfU0laRV9FUlIgOgotCQkJCXJlc3VsdCA9IERPTU1lc3NhZ2VzLkRPTVNUUklOR19TSVpFX0VSUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiA6Ci0JCQkJcmVzdWx0ID0gRE9NTWVzc2FnZXMuSElFUkFSQ0hZX1JFUVVFU1RfRVJSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIgOgotCQkJCXJlc3VsdCA9IERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBET01FeGNlcHRpb24uSU5VU0VfQVRUUklCVVRFX0VSUiA6Ci0JCQkJcmVzdWx0ID0gRE9NTWVzc2FnZXMuSU5VU0VfQVRUUklCVVRFX0VSUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiA6Ci0JCQkJcmVzdWx0ID0gRE9NTWVzc2FnZXMuSU5WQUxJRF9BQ0NFU1NfRVJSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBET01FeGNlcHRpb24uSU5WQUxJRF9DSEFSQUNURVJfRVJSIDoKLQkJCQlyZXN1bHQgPSBET01NZXNzYWdlcy5JTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIgOgotCQkJCXJlc3VsdCA9IERPTU1lc3NhZ2VzLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgRE9NRXhjZXB0aW9uLklOVkFMSURfU1RBVEVfRVJSIDoKLQkJCQlyZXN1bHQgPSBET01NZXNzYWdlcy5JTlZBTElEX1NUQVRFX0VSUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgRE9NRXhjZXB0aW9uLk5BTUVTUEFDRV9FUlIgOgotCQkJCXJlc3VsdCA9IERPTU1lc3NhZ2VzLk5BTUVTUEFDRV9FUlI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERPTUV4Y2VwdGlvbi5OT19EQVRBX0FMTE9XRURfRVJSIDoKLQkJCQlyZXN1bHQgPSBET01NZXNzYWdlcy5OT19EQVRBX0FMTE9XRURfRVJSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSIDoKLQkJCQlyZXN1bHQgPSBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSIDoKLQkJCQlyZXN1bHQgPSBET01NZXNzYWdlcy5OT1RfRk9VTkRfRVJSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIgOgotCQkJCXJlc3VsdCA9IERPTU1lc3NhZ2VzLk5PVF9TVVBQT1JURURfRVJSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBET01FeGNlcHRpb24uU1lOVEFYX0VSUiA6Ci0JCQkJcmVzdWx0ID0gRE9NTWVzc2FnZXMuU1lOVEFYX0VSUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTc6Ly8gRE9NRXhjZXB0aW9uLlRZUEVfTUlTTUFUQ0hfRVJSIDoKLQkJCQlyZXN1bHQgPSBET01NZXNzYWdlcy5UWVBFX01JU01BVENIX0VSUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTY6Ly8gRE9NRXhjZXB0aW9uLlZBTElEQVRJT05fRVJSIDoKLQkJCQlyZXN1bHQgPSBET01NZXNzYWdlcy5WQUxJREFUSU9OX0VSUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgRE9NRXhjZXB0aW9uLldST05HX0RPQ1VNRU5UX0VSUiA6Ci0JCQkJcmVzdWx0ID0gRE9NTWVzc2FnZXMuV1JPTkdfRE9DVU1FTlRfRVJSOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmVzdWx0ID0gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogbm9ybWFsaXplIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpIHsKLQkJVGV4dEltcGwgcHJldlRleHQgPSBudWxsOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBURVhUX05PREUgOiB7Ci0JCQkJCWlmIChwcmV2VGV4dCA9PSBudWxsKSB7Ci0JCQkJCQlwcmV2VGV4dCA9IChUZXh0SW1wbCkgY2hpbGQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgY2hpbGQ7Ci0JCQkJCXJlbW92ZUNoaWxkKHRleHQpOwotCQkJCQlwcmV2VGV4dC5hcHBlbmRUZXh0KHRleHQpOwotCQkJCQljaGlsZCA9IHByZXZUZXh0OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBFTEVNRU5UX05PREUgOiB7Ci0JCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBjaGlsZDsKLQkJCQkJZWxlbWVudC5ub3JtYWxpemUoKTsKLQkJCQkJcHJldlRleHQgPSBudWxsOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXByZXZUZXh0ID0gbnVsbDsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlFZGl0YWJsZUNoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuZWRpdGFibGVDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIG5vdGlmeVZhbHVlQ2hhbmdlZCBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlWYWx1ZUNoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXN5bmNEYXRhRWRpdGFibGVTdGF0ZSgpOwotCi0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC52YWx1ZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsIERPTU1lc3NhZ2VzLk5PVF9GT1VORF9FUlIpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUNoaWxkTm9kZXMgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGROb2RlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudAotCSAqIEBwYXJhbSBmaXJzdENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGxhc3RDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IHJlbW92ZUNoaWxkTm9kZXMoTm9kZSBmaXJzdENoaWxkLCBOb2RlIGxhc3RDaGlsZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVwbGFjZUNoaWxkKE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5ISUVSQVJDSFlfUkVRVUVTVF9FUlIsIERPTU1lc3NhZ2VzLkhJRVJBUkNIWV9SRVFVRVNUX0VSUik7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIGNoaWxkcmVuIHZhbHVlcyBmcm9tIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uCi0JICovCi0Jdm9pZCByZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCWZvciAoTm9kZUltcGwgY2hpbGQgPSAoTm9kZUltcGwpIGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSAoTm9kZUltcGwpIGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWNoaWxkLnJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQl9Ci0JCXRoaXMuZmxhdE5vZGUgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoaWxkRWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSkgewotCQkvLyBub3AKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhRWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSkgewotCQlpZiAoZkRhdGFFZGl0YWJsZSA9PSBlZGl0YWJsZSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUmVhZE9ubHlDb250cm9sbGVyIHJvYyA9IFJlYWRPbmx5Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpOwotCQlpZiAoZWRpdGFibGUpIHsKLQkJCXJvYy51bmxvY2tEYXRhKHRoaXMpOwotCQl9Ci0JCWVsc2UgewotCQkJcm9jLmxvY2tEYXRhKHRoaXMpOwotCQl9Ci0KLQkJZkRhdGFFZGl0YWJsZSA9IGVkaXRhYmxlOwotCi0JCW5vdGlmeUVkaXRhYmxlQ2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUsIGJvb2xlYW4gZGVlcCkgewotCQlpZiAoZGVlcCkgewotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCW5vZGUuc2V0RWRpdGFibGUoZWRpdGFibGUsIGRlZXApOwotCQkJCW5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCQlzZXRDaGlsZEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJc2V0RGF0YUVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROZXh0U2libGluZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmV4dFNpYmxpbmcKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROZXh0U2libGluZyhOb2RlIG5leHRTaWJsaW5nKSB7Ci0JCXRoaXMubmV4dFNpYmxpbmcgPSAoTm9kZUltcGwpIG5leHRTaWJsaW5nOwotCX0KLQotCS8qKgotCSAqIHNldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZVZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyBub2RlVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIHNldE93bmVyRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG93bmVyRG9jdW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJEb2N1bWVudChEb2N1bWVudCBvd25lckRvY3VtZW50KSB7Ci0JCXRoaXMub3duZXJEb2N1bWVudCA9IChEb2N1bWVudEltcGwpIG93bmVyRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJEb2N1bWVudChEb2N1bWVudCBvd25lckRvY3VtZW50LCBib29sZWFuIGRlZXApIHsKLQkJdGhpcy5vd25lckRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgb3duZXJEb2N1bWVudDsKLQotCQlpZiAoZGVlcCkgewotCQkJZm9yIChOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IChOb2RlSW1wbCkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWNoaWxkLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCwgZGVlcCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXRQYXJlbnROb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGFyZW50Tm9kZShOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5wYXJlbnROb2RlID0gKE5vZGVJbXBsKSBwYXJlbnROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBzZXRQcmV2aW91c1NpYmxpbmcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHByZXZpb3VzU2libGluZwotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFByZXZpb3VzU2libGluZyhOb2RlIHByZXZpb3VzU2libGluZykgewotCQl0aGlzLnByZXZpb3VzU2libGluZyA9IChOb2RlSW1wbCkgcHJldmlvdXNTaWJsaW5nOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB0aHJvd3MgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbiB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXRoaXMuZmxhdE5vZGUgPSBmbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCXNldE5vZGVWYWx1ZShzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNEYXRhRWRpdGFibGVTdGF0ZSgpIHsKLQkJUmVhZE9ubHlDb250cm9sbGVyIHJvYyA9IFJlYWRPbmx5Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpOwotCQlpZiAoZkRhdGFFZGl0YWJsZSkgewotCQkJcm9jLnVubG9ja0RhdGEodGhpcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyb2MubG9ja0RhdGEodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgc3RhcnQgPSBnZXRTdGFydE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPj0gMCkgewotCQkJaW50IGVuZCA9IGdldEVuZE9mZnNldCgpOwotCQkJaWYgKGVuZCA+PSAwKSB7Ci0JCQkJcmVzdWx0ID0gZW5kIC0gc3RhcnQ7Ci0JCQkJaWYgKHJlc3VsdCA8IC0xKSB7Ci0JCQkJCXJlc3VsdCA9IC0xOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUjY29tcGFyZURvY3VtZW50UG9zaXRpb24ob3JnLnczYy5kb20uTm9kZSkKLQkgKi8KLQlwdWJsaWMgc2hvcnQgY29tcGFyZURvY3VtZW50UG9zaXRpb24oTm9kZSBvdGhlcikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghKG90aGVyIGluc3RhbmNlb2YgSURPTU5vZGUpKQotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsIERPTU1lc3NhZ2VzLk5PVF9TVVBQT1JURURfRVJSKTsKLQotCQlpbnQgbm9kZVN0YXJ0ID0gdGhpcy5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgb3RoZXJTdGFydCA9ICgoSURPTU5vZGUpIG90aGVyKS5nZXRTdGFydE9mZnNldCgpOwotCi0JCWlmIChvdGhlclN0YXJ0ID4gbm9kZVN0YXJ0KSB7Ci0JCQlyZXR1cm4gRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HOwotCQl9Ci0JCWVsc2UgaWYgKG90aGVyU3RhcnQgPCBub2RlU3RhcnQpIHsKLQkJCXJldHVybiBET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkc7Ci0JCX0KLQkJcmV0dXJuIERPQ1VNRU5UX1BPU0lUSU9OX0lNUExFTUVOVEFUSU9OX1NQRUNJRklDOwotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRDb250ZW50KCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLnczYy5kb20uTm9kZSNpc0VxdWFsTm9kZShvcmcudzNjLmRvbS5Ob2RlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXF1YWxOb2RlKE5vZGUgYXJnKSB7Ci0JCXJldHVybiB0aGlzLmVxdWFscyhhcmcpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUjaXNTYW1lTm9kZShvcmcudzNjLmRvbS5Ob2RlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2FtZU5vZGUoTm9kZSBvdGhlcikgewotCQlyZXR1cm4gdGhpcyA9PSBvdGhlcjsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9va3VwTmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvb2t1cFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dENvbnRlbnQoU3RyaW5nIHRleHRDb250ZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgVHlwZUluZm8gZ2V0U2NoZW1hVHlwZUluZm8oKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZCgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgb2JqZWN0IGZvciBhIG5vZGUgYXNzb2NpYXRlZCB0byBhIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IFRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QuCi0JICogQHJldHVybiBvYmplY3QgVGhlIG9iamVjdCBmb3IgdGhpcyBub2RlLCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBwYXNzZWQKLQkgKiBvciBudWxsIGlmIHRoZXJlIHdhcyBub25lIHNldC4KLQkgKgotCSAqIEBzaW5jZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoU3RyaW5nIGtleSkgewotCQkKLQkJaWYgKGtleT09bnVsbCkgcmV0dXJuIG51bGw7Ci0JCU1hcCB1c2VyRGF0YVRhYmxlID0gVXNlckRhdGEuZ2V0SW5zdGFuY2UoKS5nZXRVc2VyRGF0YVRhYmxlKHRoaXMpOwotCQlpZiAodXNlckRhdGFUYWJsZSE9bnVsbCkgewotCQkJVXNlckRhdGFBbmRIYW5kbGVyIHVzZXJEYXRhQW5kSGFuZGxlciA9IChVc2VyRGF0YUFuZEhhbmRsZXIpIHVzZXJEYXRhVGFibGUuZ2V0KGtleSk7Ci0JCQlpZiAodXNlckRhdGFBbmRIYW5kbGVyIT1udWxsKSB7Ci0JCQkJcmV0dXJuIHVzZXJEYXRhQW5kSGFuZGxlci5nZXREYXRhKCk7Ci0JCQl9IAotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBkYXRhIGFuZCBoYW5kbGVyIGZvciBhIGtleQotCSAqIAotCSAqIEBwYXJhbSBrZXkgVGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdC4KLQkgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgZm9yIHRoaXMgbm9kZSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgcGFzc2VkLgotCSAqIE51bGwgcGFzc2VkIHJlbW92ZXMgdGhlIGV4aXN0aW5nIGFzc29jaWF0aW9uIHRvIHRoZSBrZXkuCi0JICogQHBhcmFtIGhhbmRsZXIgVXNlckRhdGFIYW5kbGVyIGZvciB0aGUgdXNlcmRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5Ci0JICogQHJldHVybiBPYmplY3QgVGhlIHByZXZpb3VzIHVzZXJkYXRhIG9iamVjdCBpZiBzZXQsIG51bGwgaWYgaXQgd2FzIG5vbmUuICAKLQkgKiAKLQkgKiBAc2luY2UgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHNldFVzZXJEYXRhKFN0cmluZyBrZXksIE9iamVjdCBkYXRhLCBVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikgewotCi0JCVVzZXJEYXRhQW5kSGFuZGxlciBwcmV2aW91c0RhdGFBbmRIYW5kbGVyPW51bGw7Ci0JCQotCQkvL3JldHVybiBpbW1lZGlhdGVseSBmb3IgbnVsbCBrZXlzCi0JCWlmIChrZXkgPT1udWxsKSByZXR1cm4gbnVsbDsKLQkJTWFwIHVzZXJEYXRhVGFibGUgPSBVc2VyRGF0YS5nZXRJbnN0YW5jZSgpLmdldFVzZXJEYXRhVGFibGUodGhpcyk7Ci0JCS8vcmVtb3ZlIGFzc29jaWF0aW9uIGZvciB0aGUga2V5IGlmIGRhdGEgaXMgbnVsbAotCQlpZiAoZGF0YT09bnVsbCkgewotCQkJaWYgKHVzZXJEYXRhVGFibGU9PW51bGwpIHJldHVybiBudWxsOwotCQkJCi0JCQkvL3NlZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHZhbHVlIHNldAotCQkJcHJldmlvdXNEYXRhQW5kSGFuZGxlciA9IChVc2VyRGF0YUFuZEhhbmRsZXIpIHVzZXJEYXRhVGFibGUuZ2V0KGtleSk7Ci0JCQlpZiAocHJldmlvdXNEYXRhQW5kSGFuZGxlciE9bnVsbCkgewotCQkJCXVzZXJEYXRhVGFibGUucmVtb3ZlKGtleSk7Ci0JCQkJcmV0dXJuIHByZXZpb3VzRGF0YUFuZEhhbmRsZXIuZ2V0RGF0YSgpOwotCQkJfQotCQkJLy90aGVyZSBpcyBubyBwcmV2aW91cyB2YWx1ZSBmb3VuZAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8vaWYgZGF0YSBwYXNzZWQgaXMgbm90IG51bGwKLQkJLy90aGUgZmlyc3QgZGF0YSBpbiB0aGUgaGFzaHRhYmxlCi0JCWlmICh1c2VyRGF0YVRhYmxlPT1udWxsKSB7Ci0JCQl1c2VyRGF0YVRhYmxlPW5ldyBIYXNodGFibGUoKTsKLQkJCVVzZXJEYXRhQW5kSGFuZGxlciB1c2VyRGF0YUFuZEhhbmRsZXI9bmV3IFVzZXJEYXRhQW5kSGFuZGxlcihkYXRhLGhhbmRsZXIpOwotCQkJdXNlckRhdGFUYWJsZS5wdXQoa2V5LHVzZXJEYXRhQW5kSGFuZGxlcik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJCS8vdGhlcmUgaXMgYWxyZWFkeSBkYXRhIGluIHRoZSBoYXNodGFibGUKLQkJfSBlbHNlIHsKLQkJCVVzZXJEYXRhQW5kSGFuZGxlciB1c2VyRGF0YUFuZEhhbmRsZXI9bmV3IFVzZXJEYXRhQW5kSGFuZGxlcihkYXRhLGhhbmRsZXIpOwotCQkJcHJldmlvdXNEYXRhQW5kSGFuZGxlcj0oVXNlckRhdGFBbmRIYW5kbGVyKSB1c2VyRGF0YVRhYmxlLnB1dChrZXksdXNlckRhdGFBbmRIYW5kbGVyKTsKLQkJCQotCQkJLy9pZiB3ZSByZXBsYWNlIGEgdmFsdWUKLQkJCWlmIChwcmV2aW91c0RhdGFBbmRIYW5kbGVyIT1udWxsKQotCQkJCXJldHVybiBwcmV2aW91c0RhdGFBbmRIYW5kbGVyLmdldERhdGEoKTsKLQkJCWVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBVc2VyRGF0YUhhbmRsZXJzIG9mIHRoZSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlVc2VyRGF0YUhhbmRsZXJzKHNob3J0IG9wZXJhdGlvbiwgTm9kZSBkZXN0aW5hdGlvbikgewotCQkKLQkJaWYgKG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfQURPUFRFRCAKLQkJCQkmIG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVECi0JCQkJJiBvcGVyYXRpb24hPVVzZXJEYXRhSGFuZGxlci5OT0RFX0RFTEVURUQKLQkJCQkmIG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfSU1QT1JURUQKLQkJCQkmIG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfUkVOQU1FRCkKLQkJCXJldHVybjsgCi0JCU1hcCB1c2VyRGF0YVRhYmxlID0gVXNlckRhdGEuZ2V0SW5zdGFuY2UoKS5nZXRVc2VyRGF0YVRhYmxlKHRoaXMpOwkKLQkJaWYgKHVzZXJEYXRhVGFibGUhPW51bGwpIHsKLQkJCUl0ZXJhdG9yIGVudHJpZXMgPXVzZXJEYXRhVGFibGUuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGVudHJpZXMuaGFzTmV4dCgpKSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgZW50cmllcy5uZXh0KCk7Ci0JCQkJU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCk7IC8vc2hvdWxkIGFsd2F5cyBiZSBhIHN0cmluZwotCQkJCVVzZXJEYXRhQW5kSGFuZGxlciBkYXRhQW5kSGFuZGxlciA9IChVc2VyRGF0YUFuZEhhbmRsZXIpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaWYgKGRhdGFBbmRIYW5kbGVyIT1udWxsKSB7Ci0JCQkJCVVzZXJEYXRhSGFuZGxlciBkYXRhSGFuZGxlcj1kYXRhQW5kSGFuZGxlci5nZXRIYW5kbGVyKCk7Ci0JCQkJCWlmIChkYXRhSGFuZGxlciE9bnVsbCkgewotCQkJCQkJZGF0YUhhbmRsZXIuaGFuZGxlKG9wZXJhdGlvbiwga2V5LCBkYXRhQW5kSGFuZGxlci5nZXREYXRhKCksIHRoaXMsIGRlc3RpbmF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBDbGFzcyBmb3IgdXNlciBkYXRhIGFuZCBVc2VyRGF0YUhhbmRsZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFVzZXJEYXRhQW5kSGFuZGxlciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLQkJLyoqCi0JCSAqIEdlbmVyYXRlZCBTZXJpYWwgSUQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ4NjA1MjEyMzczMTU0NDQ4NDFMOwotCQkvKioKLQkJICogR2VuZXJhdGVkIHNlcmlhbGl6YXRpb24gdmVyc2lvbgotCQkgKi8KLQkJCi0JCXByaXZhdGUgT2JqZWN0IGRhdGE7Ci0JCXByaXZhdGUgVXNlckRhdGFIYW5kbGVyIGhhbmRsZXI7Ci0JCQotCQlwdWJsaWMgVXNlckRhdGFBbmRIYW5kbGVyKE9iamVjdCBkYXRhLCBVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikKLQkJewotCQkJdGhpcy5kYXRhPWRhdGE7Ci0JCQl0aGlzLmhhbmRsZXI9aGFuZGxlcjsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0RGF0YSgpIHsKLQkJCXJldHVybiBkYXRhOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RGF0YShPYmplY3QgZGF0YSkgewotCQkJdGhpcy5kYXRhID0gZGF0YTsKLQkJfQotCi0JCXB1YmxpYyBVc2VyRGF0YUhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKLQkJCXJldHVybiBoYW5kbGVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SGFuZGxlcihVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikgewotCQkJdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUl0ZXJhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSXRlcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YTI3OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSXRlcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLQotLyoqCi0gKiBOb2RlSXRlcmF0b3JJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlSXRlcmF0b3JJbXBsIGltcGxlbWVudHMgTm9kZUl0ZXJhdG9yIHsKLQlwcml2YXRlIE5vZGVGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQlwcml2YXRlIE5vZGUgbmV4dE5vZGUgPSBudWxsOwotCi0JcHJpdmF0ZSBOb2RlIHJvb3ROb2RlID0gbnVsbDsKLQlwcml2YXRlIGludCB3aGF0VG9TaG93ID0gTm9kZUZpbHRlci5TSE9XX0FMTDsKLQotCS8qKgotCSAqIE5vZGVJdGVyYXRvckltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gcm9vdE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlOb2RlSXRlcmF0b3JJbXBsKE5vZGUgcm9vdE5vZGUsIGludCB3aGF0VG9TaG93LCBOb2RlRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7Ci0JCXRoaXMubmV4dE5vZGUgPSByb290Tm9kZTsKLQkJdGhpcy53aGF0VG9TaG93ID0gd2hhdFRvU2hvdzsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFjY2VwdE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmICh0aGlzLndoYXRUb1Nob3cgIT0gTm9kZUZpbHRlci5TSE9XX0FMTCkgewotCQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCXN3aXRjaCAodGhpcy53aGF0VG9TaG93KSB7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfQVRUUklCVVRFIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuQVRUUklCVVRFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX1RFWFQgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0NEQVRBX1NFQ1RJT04gOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0VOVElUWSA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVOVElUWV9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19DT01NRU5UIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuQ09NTUVOVF9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19ET0NVTUVOVCA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX1RZUEUgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX0ZSQUdNRU5UIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfTk9UQVRJT04gOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5OT1RBVElPTl9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmICh0aGlzLmZpbHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKHRoaXMuZmlsdGVyLmFjY2VwdE5vZGUobm9kZSkgPT0gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRhY2hlcyB0aGUgPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBmcm9tIHRoZSBzZXQgd2hpY2ggaXQgaXRlcmF0ZWQKLQkgKiBvdmVyLCByZWxlYXNpbmcgYW55IGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIGFuZCBwbGFjaW5nIHRoZSBpdGVyYXRvciBpbgotCSAqIHRoZSBJTlZBTElEIHN0YXRlLiBBZnRlciA8Y29kZT5kZXRhY2g8L2NvZGU+IGhhcyBiZWVuIGludm9rZWQsIGNhbGxzCi0JICogdG8gPGNvZGU+bmV4dE5vZGU8L2NvZGU+IG9yIDxjb2RlPnByZXZpb3VzTm9kZTwvY29kZT4gd2lsbCByYWlzZQotCSAqIHRoZSBleGNlcHRpb24gSU5WQUxJRF9TVEFURV9FUlIuCi0JICovCi0JcHVibGljIHZvaWQgZGV0YWNoKCkgewotCQl0aGlzLnJvb3ROb2RlID0gbnVsbDsKLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhpcyBmbGFnIGRldGVybWluZXMgd2hldGhlciB0aGUgY2hpbGRyZW4gb2YgZW50aXR5Ci0JICogcmVmZXJlbmNlIG5vZGVzIGFyZSB2aXNpYmxlIHRvIHRoZSBpdGVyYXRvci4gSWYgZmFsc2UsIHRoZXkgYW5kIHRoZWlyCi0JICogZGVzY2VuZGFudHMgd2lsbCBiZSByZWplY3RlZC4gTm90ZSB0aGF0IHRoaXMgcmVqZWN0aW9uIHRha2VzIHByZWNlZGVuY2UKLQkgKiBvdmVyIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGFuZCB0aGUgZmlsdGVyLiBBbHNvIG5vdGUgdGhhdCB0aGlzIGlzCi0JICogY3VycmVudGx5IHRoZSBvbmx5IHNpdHVhdGlvbiB3aGVyZSA8Y29kZT5Ob2RlSXRlcmF0b3JzPC9jb2RlPiBtYXkKLQkgKiByZWplY3QgYSBjb21wbGV0ZSBzdWJ0cmVlIHJhdGhlciB0aGFuIHNraXBwaW5nIGluZGl2aWR1YWwgbm9kZXMuIDxicj4KLQkgKiA8YnI+Ci0JICogVG8gcHJvZHVjZSBhIHZpZXcgb2YgdGhlIGRvY3VtZW50IHRoYXQgaGFzIGVudGl0eSByZWZlcmVuY2VzIGV4cGFuZGVkCi0JICogYW5kIGRvZXMgbm90IGV4cG9zZSB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGl0c2VsZiwgdXNlIHRoZQotCSAqIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzIHRvIGhpZGUgdGhlIGVudGl0eSByZWZlcmVuY2Ugbm9kZSBhbmQKLQkgKiBzZXQgPGNvZGU+ZXhwYW5kRW50aXR5UmVmZXJlbmNlczwvY29kZT4gdG8gdHJ1ZSB3aGVuIGNyZWF0aW5nIHRoZQotCSAqIGl0ZXJhdG9yLiBUbyBwcm9kdWNlIGEgdmlldyBvZiB0aGUgZG9jdW1lbnQgdGhhdCBoYXMgZW50aXR5IHJlZmVyZW5jZQotCSAqIG5vZGVzIGJ1dCBubyBlbnRpdHkgZXhwYW5zaW9uLCB1c2UgdGhlIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzCi0JICogdG8gc2hvdyB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGFuZCBzZXQKLQkgKiA8Y29kZT5leHBhbmRFbnRpdHlSZWZlcmVuY2VzPC9jb2RlPiB0byBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKCkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gdXNlZCB0byBzY3JlZW4gbm9kZXMuCi0JICovCi0JcHVibGljIE5vZGVGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBOb2RlIGdldE5leHROb2RlKCkgewotCQlpZiAodGhpcy5uZXh0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgb2xkTmV4dCA9IHRoaXMubmV4dE5vZGU7Ci0JCU5vZGUgY2hpbGQgPSB0aGlzLm5leHROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCXRoaXMubmV4dE5vZGUgPSBjaGlsZDsKLQkJCXJldHVybiBvbGROZXh0OwotCQl9Ci0JCWZvciAoTm9kZSBub2RlID0gdGhpcy5uZXh0Tm9kZTsgbm9kZSAhPSBudWxsICYmIG5vZGUgIT0gdGhpcy5yb290Tm9kZTsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5uZXh0Tm9kZSA9IG5leHQ7Ci0JCQkJcmV0dXJuIG9sZE5leHQ7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCXJldHVybiBvbGROZXh0OwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgTm9kZSBnZXRQcmV2aW91c05vZGUoKSB7Ci0JCWlmICh0aGlzLm5leHROb2RlID09IHRoaXMucm9vdE5vZGUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBwcmV2ID0gbnVsbDsKLQkJaWYgKHRoaXMubmV4dE5vZGUgPT0gbnVsbCkgewotCQkJcHJldiA9IHRoaXMucm9vdE5vZGU7IC8vIG5ldmVyIG51bGwKLQkJfSBlbHNlIHsKLQkJCXByZXYgPSB0aGlzLm5leHROb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCXRoaXMubmV4dE5vZGUgPSB0aGlzLm5leHROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlyZXR1cm4gdGhpcy5uZXh0Tm9kZTsKLQkJCX0KLQkJfQotCQlOb2RlIGxhc3QgPSBwcmV2LmdldExhc3RDaGlsZCgpOwotCQl3aGlsZSAobGFzdCAhPSBudWxsKSB7Ci0JCQlwcmV2ID0gbGFzdDsKLQkJCWxhc3QgPSBwcmV2LmdldExhc3RDaGlsZCgpOwotCQl9Ci0JCXRoaXMubmV4dE5vZGUgPSBwcmV2OwotCQlyZXR1cm4gdGhpcy5uZXh0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcm9vdCBub2RlIG9mIHRoZSA8Y29kZT5Ob2RlSXRlcmF0b3I8L2NvZGU+LCBhcyBzcGVjaWZpZWQgd2hlbiBpdAotCSAqIHdhcyBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBOb2RlIGdldFJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGRldGVybWluZXMgd2hpY2ggbm9kZSB0eXBlcyBhcmUgcHJlc2VudGVkIHZpYSB0aGUKLQkgKiBpdGVyYXRvci4gVGhlIGF2YWlsYWJsZSBzZXQgb2YgY29uc3RhbnRzIGlzIGRlZmluZWQgaW4gdGhlCi0JICogPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gaW50ZXJmYWNlLiBOb2RlcyBub3QgYWNjZXB0ZWQgYnkKLQkgKiA8Y29kZT53aGF0VG9TaG93PC9jb2RlPiB3aWxsIGJlIHNraXBwZWQsIGJ1dCB0aGVpciBjaGlsZHJlbiBtYXkgc3RpbGwKLQkgKiBiZSBjb25zaWRlcmVkLiBOb3RlIHRoYXQgdGhpcyBza2lwIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZmlsdGVyLCBpZgotCSAqIGFueS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFdoYXRUb1Nob3coKSB7Ci0JCXJldHVybiB0aGlzLndoYXRUb1Nob3c7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV4dCBub2RlIGluIHRoZSBzZXQgYW5kIGFkdmFuY2VzIHRoZSBwb3NpdGlvbiBvZiB0aGUKLQkgKiBpdGVyYXRvciBpbiB0aGUgc2V0LiBBZnRlciBhIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT4gaXMgY3JlYXRlZCwKLQkgKiB0aGUgZmlyc3QgY2FsbCB0byA8Y29kZT5uZXh0Tm9kZSgpPC9jb2RlPiByZXR1cm5zIHRoZSBmaXJzdCBub2RlIGluCi0JICogdGhlIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXh0IDxjb2RlPk5vZGU8L2NvZGU+IGluIHRoZSBzZXQgYmVpbmcgaXRlcmF0ZWQgb3Zlciwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBtb3JlIG1lbWJlcnMgaW4gdGhhdCBzZXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlcgotCSAqICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5kZXRhY2g8L2NvZGU+IG1ldGhvZCB3YXMgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBuZXh0Tm9kZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlmb3IgKE5vZGUgbm9kZSA9IGdldE5leHROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGdldE5leHROb2RlKCkpIHsKLQkJCWlmIChhY2NlcHROb2RlKG5vZGUpKQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZXZpb3VzIG5vZGUgaW4gdGhlIHNldCBhbmQgbW92ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotCSAqIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT4gYmFja3dhcmRzIGluIHRoZSBzZXQuCi0JICogCi0JICogQHJldHVybiBUaGUgcHJldmlvdXMgPGNvZGU+Tm9kZTwvY29kZT4gaW4gdGhlIHNldCBiZWluZyBpdGVyYXRlZAotCSAqICAgICAgICAgb3Zlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbgotCSAqICAgICAgICAgdGhhdCBzZXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlcgotCSAqICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5kZXRhY2g8L2NvZGU+IG1ldGhvZCB3YXMgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBwcmV2aW91c05vZGUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJZm9yIChOb2RlIG5vZGUgPSBnZXRQcmV2aW91c05vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gZ2V0UHJldmlvdXNOb2RlKCkpIHsKLQkJCWlmIChhY2NlcHROb2RlKG5vZGUpKQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjIwZjMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBBbiBhcnJheS1iYWNrZWQgTm9kZUxpc3QsIHVzZWQgdG8ga2VlcCB0aGUgYXJyYXkgc2l6ZSBkb3duCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlTGlzdEltcGwgaW1wbGVtZW50cyBOb2RlTGlzdCB7Ci0KLQlwcml2YXRlIE9iamVjdCBmTG9ja09iamVjdCA9IG5ldyBieXRlWzBdOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBncm93dGhDb25zdGFudCA9IDI7Ci0JcHJpdmF0ZSBOb2RlW10gZk5vZGVzID0gbnVsbDsKLQlwcml2YXRlIGludCBmTm9kZUNvdW50ID0gMDsKLQotCS8qKgotCSAqIE5vZGVMaXN0SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBOb2RlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGVMaXN0SW1wbChOb2RlTGlzdEltcGwgbGlzdCkgewotCQlzdXBlcigpOwotCQlmTm9kZUNvdW50ID0gbGlzdC5mTm9kZUNvdW50OwotCQlmTm9kZXMgPSBsaXN0LmZOb2RlczsKLQl9Ci0KLQkvKioKLQkgKiBhcHBlbmROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgYXBwZW5kTm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlzeW5jaHJvbml6ZWQgKGZMb2NrT2JqZWN0KSB7Ci0JCQllbnN1cmVDYXBhY2l0eShmTm9kZUNvdW50ICsgMSk7Ci0JCQlmTm9kZXNbZk5vZGVDb3VudCsrXSA9IG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogR3JvdyB0aGUgbm9kZSBhcnJheSB0byBhdCBsZWFzdCB0aGUgZ2l2ZW4gc2l6ZSB3aGlsZSBrZWVwaW5nIHRoZQotCSAqIGNvbnRlbnRzIHRoZSBzYW1lCi0JICogCi0JICogQHBhcmFtIG5lZWRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBlbnN1cmVDYXBhY2l0eShpbnQgbmVlZGVkKSB7Ci0JCWlmIChmTm9kZXMgPT0gbnVsbCkgewotCQkJLy8gZmlyc3QgdGltZQotCQkJZk5vZGVzID0gbmV3IE5vZGVbbmVlZGVkXTsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgb2xkTGVuZ3RoID0gZk5vZGVzLmxlbmd0aDsKLQkJaWYgKG9sZExlbmd0aCA8IG5lZWRlZCkgewotCQkJTm9kZVtdIG9sZE5vZGVzID0gZk5vZGVzOwotCQkJTm9kZVtdIG5ld05vZGVzID0gbmV3IE5vZGVbbmVlZGVkICsgZ3Jvd3RoQ29uc3RhbnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGROb2RlcywgMCwgbmV3Tm9kZXMsIDAsIGZOb2RlQ291bnQpOwotCQkJZk5vZGVzID0gbmV3Tm9kZXM7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlTGlzdCNnZXRMZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZk5vZGVDb3VudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIE5vZGVbXSBnZXROb2RlcygpIHsKLQkJcmV0dXJuIGZOb2RlczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBpbnNlcnROb2RlKE5vZGUgbm9kZSwgaW50IGluZGV4KSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJc3luY2hyb25pemVkIChmTG9ja09iamVjdCkgewotCQkJaWYgKGZOb2RlcyA9PSBudWxsKSB7Ci0JCQkJLy8gZmlyc3QgdGltZSwgaWdub3JlIGluZGV4Ci0JCQkJZk5vZGVzID0gbmV3IE5vZGVbMV07Ci0JCQkJZk5vZGVzW2ZOb2RlQ291bnQrK10gPSBub2RlOwotCQkJCXJldHVybiBub2RlOwotCQkJfQotCi0JCQkvLyBncmFjZWZ1bGx5IGhhbmRsZSBvdXQgb2YgYm91bmRzCi0JCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gZk5vZGVDb3VudCArIDEpCi0JCQkJcmV0dXJuIGFwcGVuZE5vZGUobm9kZSk7Ci0KLQkJCS8qCi0JCQkgKiBHcm93IGEgbmV3IE5vZGUgYXJyYXksIGNvcHlpbmcgdGhlIG9sZCBjb250ZW50cyBhcm91bmQgdGhlIG5ldwotCQkJICogTm9kZQotCQkJICovCi0JCQlOb2RlW10gbmV3Tm9kZXMgPSBuZXcgTm9kZVtmTm9kZUNvdW50ICsgZ3Jvd3RoQ29uc3RhbnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShmTm9kZXMsIDAsIG5ld05vZGVzLCAwLCBpbmRleCk7Ci0JCQluZXdOb2Rlc1tpbmRleF0gPSBub2RlOwotCQkJU3lzdGVtLmFycmF5Y29weShmTm9kZXMsIGluZGV4LCBuZXdOb2RlcywgaW5kZXggKyAxLCBmTm9kZUNvdW50IC0gaW5kZXgpOwotCQkJZk5vZGVzID0gbmV3Tm9kZXM7Ci0JCQlmTm9kZUNvdW50Kys7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLnczYy5kb20uTm9kZUxpc3QjaXRlbShpbnQpCi0JICovCi0JcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBmTm9kZUNvdW50KQotCQkJcmV0dXJuIG51bGw7IC8vIGludmFsaWQgcGFyYW1ldGVyCi0JCXJldHVybiBmTm9kZXNbaW5kZXhdOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSByZW1vdmVOb2RlKGludCBpbmRleCkgewotCQlpZiAodGhpcy5mTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBub2RlCi0KLQkJc3luY2hyb25pemVkIChmTG9ja09iamVjdCkgewotCQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBmTm9kZUNvdW50KQotCQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCi0JCQlOb2RlIHJlbW92ZWQgPSBmTm9kZXNbaW5kZXhdOwotCQkJTm9kZVtdIG5ld05vZGVzID0gbmV3IE5vZGVbZk5vZGVDb3VudCAtIDFdOwotCQkJLy8gY29weSBhcm91bmQgbm9kZSBiZWluZyByZW1vdmVkCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGZOb2RlcywgMCwgbmV3Tm9kZXMsIDAsIGluZGV4KTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZk5vZGVzLCBpbmRleCArIDEsIG5ld05vZGVzLCBpbmRleCwgZk5vZGVDb3VudCAtIGluZGV4IC0gMSk7Ci0JCQlmTm9kZXMgPSBuZXdOb2RlczsKLQkJCWZOb2RlQ291bnQtLTsKLQkJCXJldHVybiByZW1vdmVkOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob3RhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm90YXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NmVlYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob3RhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk2OTk5IC0gSW5lZmZpY2llbnQgdXNlIG9mIG5ldyBTdHJpbmcoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob3RhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLS8qKgotICogTm90YXRpb25JbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RhdGlvbkltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIE5vdGF0aW9uIHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBOb3RhdGlvbkltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgTm90YXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdGF0aW9uSW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBOb3RhdGlvbkltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgTm90YXRpb25JbXBsKE5vdGF0aW9uSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZSA9IHRoYXQubmFtZTsKLQkJCXRoaXMucHVibGljSWQgPSB0aGF0LnB1YmxpY0lkOwotCQkJdGhpcy5zeXN0ZW1JZCA9IHRoYXQuc3lzdGVtSWQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCU5vdGF0aW9uSW1wbCBjbG9uZWQgPSBuZXcgTm90YXRpb25JbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlpZiAodGhpcy5uYW1lID09IG51bGwpCi0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBOT1RBVElPTl9OT0RFOwotCX0KLQotCS8qKgotCSAqIGdldFB1YmxpY0lkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqIGdldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiB0aGlzLnN5c3RlbUlkOwotCX0KLQotCS8qKgotCSAqIHNldE5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogc2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0JCXRoaXMucHVibGljSWQgPSBwdWJsaWNJZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRTeXN0ZW1JZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gc3lzdGVtSWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgc3lzdGVtSWQpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQkJdGhpcy5zeXN0ZW1JZCA9IHN5c3RlbUlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGViNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI5Njk5OSAtIEluZWZmaWNpZW50IHVzZSBvZiBuZXcgU3RyaW5nKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLS8qKgotICogUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHsKLQlwcml2YXRlIFN0cmluZyBkYXRhID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIHRhcmdldCA9IG51bGw7Ci0KLQkvKioKLQkgKiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwoUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMudGFyZ2V0ID0gdGhhdC50YXJnZXQ7Ci0JCQl0aGlzLmRhdGEgPSB0aGF0LmdldERhdGEoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBjbG9uZWQgPSBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCh0aGlzKTsKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7Ci0JCWlmICh0aGlzLmRhdGEgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmRhdGE7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCi0JCUlUZXh0UmVnaW9uIHRhcmdldFJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGRhdGFSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbiBjbG9zZVJlZ2lvbiA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pCi0JCQkJY29udGludWU7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkgewotCQkJCWNsb3NlUmVnaW9uID0gcmVnaW9uOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHRhcmdldFJlZ2lvbiA9PSBudWxsKQotCQkJCQl0YXJnZXRSZWdpb24gPSByZWdpb247Ci0JCQkJZWxzZSBpZiAoZGF0YVJlZ2lvbiA9PSBudWxsKQotCQkJCQlkYXRhUmVnaW9uID0gcmVnaW9uOwotCQkJfQotCQl9Ci0JCWlmIChkYXRhUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQlpbnQgb2Zmc2V0ID0gZGF0YVJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgZW5kID0gZmxhdE5vZGUuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChjbG9zZVJlZ2lvbiAhPSBudWxsKQotCQkJZW5kID0gY2xvc2VSZWdpb24uZ2V0U3RhcnQoKTsKLQkJU3RyaW5nIHNvdXJjZSA9IGZsYXROb2RlLmdldFRleHQoKTsKLQkJcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUYXJnZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldERhdGEoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUYXJnZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7Ci0JCWlmICh0aGlzLnRhcmdldCA9PSBudWxsKQotCQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHdpbGwgYmUgZ2VuZXJhdGVkCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCXRoaXMuZGF0YSA9IGdldERhdGEoKTsKLQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCX0KLQotCS8qKgotCSAqIHNldERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQl0aGlzLmRhdGEgPSBkYXRhOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIHNldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZVZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyBub2RlVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXREYXRhKG5vZGVWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMuZGF0YSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogc2V0VGFyZ2V0IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXQoU3RyaW5nIHRhcmdldCkgewotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldFRhcmdldCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlidWZmZXIuYXBwZW5kKGdldERhdGEoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmFuZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JhbmdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDMwZTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmFuZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLnJhbmdlcy5SYW5nZTsKLWltcG9ydCBvcmcudzNjLmRvbS5yYW5nZXMuUmFuZ2VFeGNlcHRpb247Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBSYW5nZUltcGwgaW1wbGVtZW50cyBSYW5nZSB7Ci0JcHJpdmF0ZSBOb2RlIGVuZENvbnRhaW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZW5kT2Zmc2V0ID0gMDsKLQotCXByaXZhdGUgTm9kZSBzdGFydENvbnRhaW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQgPSAwOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFJhbmdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgUmFuZ2VJbXBsKFJhbmdlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5zdGFydENvbnRhaW5lciA9IHRoYXQuc3RhcnRDb250YWluZXI7Ci0JCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gdGhhdC5zdGFydE9mZnNldDsKLQkJCXRoaXMuZW5kQ29udGFpbmVyID0gdGhhdC5lbmRDb250YWluZXI7Ci0JCQl0aGlzLmVuZE9mZnNldCA9IHRoYXQuZW5kT2Zmc2V0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogRHVwbGljYXRlcyB0aGUgY29udGVudHMgb2YgYSBSYW5nZQotCSAqIAotCSAqIEByZXR1cm4gQSBEb2N1bWVudEZyYWdtZW50IHRoYXQgY29udGFpbnMgY29udGVudCBlcXVpdmFsZW50IHRvIHRoaXMKLQkgKiAgICAgICAgIFJhbmdlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgYSBEb2N1bWVudFR5cGUgbm9kZQotCSAqICAgICAgICAgICAgICAgIHdvdWxkIGJlIGV4dHJhY3RlZCBpbnRvIHRoZSBuZXcgRG9jdW1lbnRGcmFnbWVudC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IGNsb25lQ29udGVudHMoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBQcm9kdWNlcyBhIG5ldyBSYW5nZSB3aG9zZSBib3VuZGFyeS1wb2ludHMgYXJlIGVxdWFsIHRvIHRoZQotCSAqIGJvdW5kYXJ5LXBvaW50cyBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQHJldHVybiBUaGUgZHVwbGljYXRlZCBSYW5nZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBSYW5nZSBjbG9uZVJhbmdlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUmFuZ2VJbXBsKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENvbGxhcHNlIGEgUmFuZ2Ugb250byBvbmUgb2YgaXRzIGJvdW5kYXJ5LXBvaW50cwotCSAqIAotCSAqIEBwYXJhbSB0b1N0YXJ0SWYKLQkgKiAgICAgICAgICAgIFRSVUUsIGNvbGxhcHNlcyB0aGUgUmFuZ2Ugb250byBpdHMgc3RhcnQ7IGlmIEZBTFNFLAotCSAqICAgICAgICAgICAgY29sbGFwc2VzIGl0IG9udG8gaXRzIGVuZC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbGxhcHNlKGJvb2xlYW4gdG9TdGFydCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICh0b1N0YXJ0KSB7Ci0JCQl0aGlzLmVuZENvbnRhaW5lciA9IHRoaXMuc3RhcnRDb250YWluZXI7Ci0JCQl0aGlzLmVuZE9mZnNldCA9IHRoaXMuc3RhcnRPZmZzZXQ7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnN0YXJ0Q29udGFpbmVyID0gdGhpcy5lbmRDb250YWluZXI7Ci0JCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gdGhpcy5lbmRPZmZzZXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wYXJlIHRoZSBib3VuZGFyeS1wb2ludHMgb2YgdHdvIFJhbmdlcyBpbiBhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBob3dBCi0JICogICAgICAgICAgICBjb2RlIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBjb21wYXJpc29uLCBhcyBkZWZpbmVkIGFib3ZlLgotCSAqIEBwYXJhbSBzb3VyY2VSYW5nZVRoZQotCSAqICAgICAgICAgICAgPGNvZGU+UmFuZ2U8L2NvZGU+IG9uIHdoaWNoIHRoaXMgY3VycmVudAotCSAqICAgICAgICAgICAgPGNvZGU+UmFuZ2U8L2NvZGU+IGlzIGNvbXBhcmVkIHRvLgotCSAqIEByZXR1cm4gLTEsIDAgb3IgMSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY29ycmVzcG9uZGluZwotCSAqICAgICAgICAgYm91bmRhcnktcG9pbnQgb2YgdGhlIFJhbmdlIGlzIHJlc3BlY3RpdmVseSBiZWZvcmUsIGVxdWFsIHRvLAotCSAqICAgICAgICAgb3IgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgYm91bmRhcnktcG9pbnQgb2YKLQkgKiAgICAgICAgIDxjb2RlPnNvdXJjZVJhbmdlPC9jb2RlPi4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFdST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIHRoZSB0d28gUmFuZ2VzIGFyZSBub3QgaW4KLQkgKiAgICAgICAgICAgICAgICB0aGUgc2FtZSBEb2N1bWVudCBvciBEb2N1bWVudEZyYWdtZW50LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHNob3J0IGNvbXBhcmVCb3VuZGFyeVBvaW50cyhzaG9ydCBob3csIFJhbmdlIHNvdXJjZVJhbmdlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHNvdXJjZVJhbmdlID09IG51bGwpCi0JCQlyZXR1cm4gKHNob3J0KSAwOyAvLyBlcnJvcgotCi0JCU5vZGUgY29udGFpbmVyMSA9IG51bGw7Ci0JCWludCBvZmZzZXQxID0gMDsKLQkJTm9kZSBjb250YWluZXIyID0gbnVsbDsKLQkJaW50IG9mZnNldDIgPSAwOwotCi0JCXN3aXRjaCAoaG93KSB7Ci0JCQljYXNlIFNUQVJUX1RPX1NUQVJUIDoKLQkJCQljb250YWluZXIxID0gdGhpcy5zdGFydENvbnRhaW5lcjsKLQkJCQlvZmZzZXQxID0gdGhpcy5zdGFydE9mZnNldDsKLQkJCQljb250YWluZXIyID0gc291cmNlUmFuZ2UuZ2V0U3RhcnRDb250YWluZXIoKTsKLQkJCQlvZmZzZXQyID0gc291cmNlUmFuZ2UuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBUlRfVE9fRU5EIDoKLQkJCQljb250YWluZXIxID0gdGhpcy5zdGFydENvbnRhaW5lcjsKLQkJCQlvZmZzZXQxID0gdGhpcy5zdGFydE9mZnNldDsKLQkJCQljb250YWluZXIyID0gc291cmNlUmFuZ2UuZ2V0RW5kQ29udGFpbmVyKCk7Ci0JCQkJb2Zmc2V0MiA9IHNvdXJjZVJhbmdlLmdldEVuZE9mZnNldCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFTkRfVE9fRU5EIDoKLQkJCQljb250YWluZXIxID0gdGhpcy5lbmRDb250YWluZXI7Ci0JCQkJb2Zmc2V0MSA9IHRoaXMuZW5kT2Zmc2V0OwotCQkJCWNvbnRhaW5lcjIgPSBzb3VyY2VSYW5nZS5nZXRFbmRDb250YWluZXIoKTsKLQkJCQlvZmZzZXQyID0gc291cmNlUmFuZ2UuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVORF9UT19TVEFSVCA6Ci0JCQkJY29udGFpbmVyMSA9IHRoaXMuZW5kQ29udGFpbmVyOwotCQkJCW9mZnNldDEgPSB0aGlzLmVuZE9mZnNldDsKLQkJCQljb250YWluZXIyID0gc291cmNlUmFuZ2UuZ2V0U3RhcnRDb250YWluZXIoKTsKLQkJCQlvZmZzZXQyID0gc291cmNlUmFuZ2UuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiAoc2hvcnQpIDA7IC8vIGVycm9yCi0JCX0KLQotCQlyZXR1cm4gY29tcGFyZVBvaW50cyhjb250YWluZXIxLCBvZmZzZXQxLCBjb250YWluZXIyLCBvZmZzZXQyKTsKLQl9Ci0KLQkvKgotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBjb21wYXJlUG9pbnRzKE5vZGUgY29udGFpbmVyMSwgaW50IG9mZnNldDEsIE5vZGUgY29udGFpbmVyMiwgaW50IG9mZnNldDIpIHsKLQkJaWYgKGNvbnRhaW5lcjEgPT0gbnVsbCB8fCBjb250YWluZXIyID09IG51bGwpCi0JCQlyZXR1cm4gKHNob3J0KSAwOyAvLyBlcnJvcgotCi0JCWlmIChjb250YWluZXIxID09IGNvbnRhaW5lcjIpIHsKLQkJCWlmIChvZmZzZXQxID4gb2Zmc2V0MikKLQkJCQlyZXR1cm4gKHNob3J0KSAxOwotCQkJaWYgKG9mZnNldDEgPCBvZmZzZXQyKQotCQkJCXJldHVybiAoc2hvcnQpIC0xOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQkvLyBnZXQgbm9kZSBvZmZzZXRzCi0JCUlET01Ob2RlIG5vZGUxID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5lcjEuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlOb2RlIGNoaWxkID0gY29udGFpbmVyMS5nZXRGaXJzdENoaWxkKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldDE7IGkrKykgewotCQkJCU5vZGUgbmV4dCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKG5leHQgPT0gbnVsbCkKLQkJCQkJYnJlYWs7Ci0JCQkJY2hpbGQgPSBuZXh0OwotCQkJfQotCQkJbm9kZTEgPSAoSURPTU5vZGUpIGNoaWxkOwotCQkJb2Zmc2V0MSA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlub2RlMSA9IChJRE9NTm9kZSkgY29udGFpbmVyMTsKLQkJfQotCQlpbnQgbm9kZU9mZnNldDEgPSBub2RlMS5nZXRTdGFydE9mZnNldCgpOwotCQlJRE9NTm9kZSBub2RlMiA9IG51bGw7Ci0JCWlmIChjb250YWluZXIyLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJTm9kZSBjaGlsZCA9IGNvbnRhaW5lcjIuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXQyOyBpKyspIHsKLQkJCQlOb2RlIG5leHQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWlmIChuZXh0ID09IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJCWNoaWxkID0gbmV4dDsKLQkJCX0KLQkJCW5vZGUyID0gKElET01Ob2RlKSBjaGlsZDsKLQkJCW9mZnNldDIgPSAwOwotCQl9IGVsc2UgewotCQkJbm9kZTIgPSAoSURPTU5vZGUpIGNvbnRhaW5lcjI7Ci0JCX0KLQkJaW50IG5vZGVPZmZzZXQyID0gbm9kZTIuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlpZiAobm9kZU9mZnNldDEgPiBub2RlT2Zmc2V0MikKLQkJCXJldHVybiAoc2hvcnQpIDE7Ci0JCWlmIChub2RlT2Zmc2V0MSA8IG5vZGVPZmZzZXQyKQotCQkJcmV0dXJuIChzaG9ydCkgLTE7Ci0JCWlmIChvZmZzZXQxID4gb2Zmc2V0MikKLQkJCXJldHVybiAoc2hvcnQpIDE7Ci0JCWlmIChvZmZzZXQxIDwgb2Zmc2V0MikKLQkJCXJldHVybiAoc2hvcnQpIC0xOwotCQlyZXR1cm4gKHNob3J0KSAwOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGNvbnRlbnRzIG9mIGEgUmFuZ2UgZnJvbSB0aGUgY29udGFpbmluZyBkb2N1bWVudCBvcgotCSAqIGRvY3VtZW50IGZyYWdtZW50IHdpdGhvdXQgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZW1vdmVkIGNvbnRlbnQuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiBhbnkgcG9ydGlvbiBvZgotCSAqICAgICAgICAgICAgICAgIHRoZSBjb250ZW50IG9mIHRoZSBSYW5nZSBpcyByZWFkLW9ubHkgb3IgYW55IG9mIHRoZQotCSAqICAgICAgICAgICAgICAgIG5vZGVzIHRoYXQgY29udGFpbiBhbnkgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIFJhbmdlIGFyZQotCSAqICAgICAgICAgICAgICAgIHJlYWQtb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRlbnRzKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgUmFuZ2UgaXMgbm8gbG9uZ2VyIGluIHVzZSBhbmQgdGhhdCB0aGUKLQkgKiBpbXBsZW1lbnRhdGlvbiBtYXkgcmVsaW5xdWlzaCBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJhbmdlLgotCSAqIFN1YnNlcXVlbnQgY2FsbHMgdG8gYW55IG1ldGhvZHMgb3IgYXR0cmlidXRlIGdldHRlcnMgb24gdGhpcyBSYW5nZSB3aWxsCi0JICogcmVzdWx0IGluIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBiZWluZyB0aHJvd24gd2l0aCBhbiBlcnJvciBjb2RlCi0JICogb2YgPGNvZGU+SU5WQUxJRF9TVEFURV9FUlI8L2NvZGU+LgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgZGV0YWNoKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRoaXMuc3RhcnRDb250YWluZXIgPSBudWxsOwotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gMDsKLQkJdGhpcy5lbmRDb250YWluZXIgPSBudWxsOwotCQl0aGlzLmVuZE9mZnNldCA9IDA7Ci0JfQotCi0JLyoqCi0JICogTW92ZXMgdGhlIGNvbnRlbnRzIG9mIGEgUmFuZ2UgZnJvbSB0aGUgY29udGFpbmluZyBkb2N1bWVudCBvciBkb2N1bWVudAotCSAqIGZyYWdtZW50IHRvIGEgbmV3IERvY3VtZW50RnJhZ21lbnQuCi0JICogCi0JICogQHJldHVybiBBIERvY3VtZW50RnJhZ21lbnQgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIGNvbnRlbnRzLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgYW55IHBvcnRpb24gb2YKLQkgKiAgICAgICAgICAgICAgICB0aGUgY29udGVudCBvZiB0aGUgUmFuZ2UgaXMgcmVhZC1vbmx5IG9yIGFueSBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICBub2RlcyB3aGljaCBjb250YWluIGFueSBvZiB0aGUgY29udGVudCBvZiB0aGUgUmFuZ2UgYXJlCi0JICogICAgICAgICAgICAgICAgcmVhZC1vbmx5LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgYSBEb2N1bWVudFR5cGUgbm9kZQotCSAqICAgICAgICAgICAgICAgIHdvdWxkIGJlIGV4dHJhY3RlZCBpbnRvIHRoZSBuZXcgRG9jdW1lbnRGcmFnbWVudC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IGV4dHJhY3RDb250ZW50cygpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRSVUUgaWYgdGhlIFJhbmdlIGlzIGNvbGxhcHNlZAotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29sbGFwc2VkKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLnN0YXJ0Q29udGFpbmVyID09IHRoaXMuZW5kQ29udGFpbmVyICYmIHRoaXMuc3RhcnRPZmZzZXQgPT0gdGhpcy5lbmRPZmZzZXQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWVwZXN0IGNvbW1vbiBhbmNlc3RvciBjb250YWluZXIgb2YgdGhlIFJhbmdlJ3MgdHdvCi0JICogYm91bmRhcnktcG9pbnRzLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Q29tbW9uQW5jZXN0b3JDb250YWluZXIoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuc3RhcnRDb250YWluZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChOb2RlSW1wbCkgdGhpcy5zdGFydENvbnRhaW5lcikuZ2V0Q29tbW9uQW5jZXN0b3IodGhpcy5lbmRDb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIE5vZGUgd2l0aGluIHdoaWNoIHRoZSBSYW5nZSBlbmRzCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRFbmRDb250YWluZXIoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZW5kQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIE9mZnNldCB3aXRoaW4gdGhlIGVuZGluZyBub2RlIG9mIHRoZSBSYW5nZS4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmVuZE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlIHdpdGhpbiB3aGljaCB0aGUgUmFuZ2UgYmVnaW5zCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRTdGFydENvbnRhaW5lcigpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5zdGFydENvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBPZmZzZXQgd2l0aGluIHRoZSBzdGFydGluZyBub2RlIG9mIHRoZSBSYW5nZS4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuc3RhcnRPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0cyBhIG5vZGUgaW50byB0aGUgRG9jdW1lbnQgb3IgRG9jdW1lbnRGcmFnbWVudCBhdCB0aGUgc3RhcnQgb2YKLQkgKiB0aGUgUmFuZ2UuIElmIHRoZSBjb250YWluZXIgaXMgYSBUZXh0IG5vZGUsIHRoaXMgd2lsbCBiZSBzcGxpdCBhdCB0aGUKLQkgKiBzdGFydCBvZiB0aGUgUmFuZ2UgKGFzIGlmIHRoZSBUZXh0IG5vZGUncyBzcGxpdFRleHQgbWV0aG9kIHdhcwotCSAqIHBlcmZvcm1lZCBhdCB0aGUgaW5zZXJ0aW9uIHBvaW50KSBhbmQgdGhlIGluc2VydGlvbiB3aWxsIG9jY3VyIGJldHdlZW4KLQkgKiB0aGUgdHdvIHJlc3VsdGluZyBUZXh0IG5vZGVzLiBBZGphY2VudCBUZXh0IG5vZGVzIHdpbGwgbm90IGJlCi0JICogYXV0b21hdGljYWxseSBtZXJnZWQuIElmIHRoZSBub2RlIHRvIGJlIGluc2VydGVkIGlzIGEgRG9jdW1lbnRGcmFnbWVudAotCSAqIG5vZGUsIHRoZSBjaGlsZHJlbiB3aWxsIGJlIGluc2VydGVkIHJhdGhlciB0aGFuIHRoZSBEb2N1bWVudEZyYWdtZW50Ci0JICogbm9kZSBpdHNlbGYuCi0JICogCi0JICogQHBhcmFtIG5ld05vZGVUaGUKLQkgKiAgICAgICAgICAgIG5vZGUgdG8gaW5zZXJ0IGF0IHRoZSBzdGFydCBvZiB0aGUgUmFuZ2UKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIGFuIGFuY2VzdG9yCi0JICogICAgICAgICAgICAgICAgY29udGFpbmVyIG9mIHRoZSBzdGFydCBvZiB0aGUgUmFuZ2UgaXMgcmVhZC1vbmx5LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgPGNvZGU+bmV3Tm9kZTwvY29kZT4gYW5kCi0JICogICAgICAgICAgICAgICAgdGhlIGNvbnRhaW5lciBvZiB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlIHdlcmUgbm90IGNyZWF0ZWQKLQkgKiAgICAgICAgICAgICAgICBmcm9tIHRoZSBzYW1lIGRvY3VtZW50LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhlIGNvbnRhaW5lciBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgUmFuZ2UgaXMgb2YgYSB0eXBlIHRoYXQgZG9lcyBub3QgYWxsb3cKLQkgKiAgICAgICAgICAgICAgICBjaGlsZHJlbiBvZiB0aGUgdHlwZSBvZiA8Y29kZT5uZXdOb2RlPC9jb2RlPiBvciBpZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPm5ld05vZGU8L2NvZGU+IGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBjb250YWluZXIuCi0JICogICAgICAgICAgICAgICAgPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5uZXdOb2RlPC9jb2RlPgotCSAqICAgICAgICAgICAgICAgIGlzIGFuIEF0dHIsIEVudGl0eSwgTm90YXRpb24sIG9yIERvY3VtZW50IG5vZGUuCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0Tm9kZShOb2RlIG5ld05vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBhIG5vZGUgYW5kIGl0cyBjb250ZW50cwotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlVGhlCi0JICogICAgICAgICAgICBub2RlIHRvIHNlbGVjdC4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgYW4gYW5jZXN0b3Igb2YKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhbiBFbnRpdHksIE5vdGF0aW9uIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlIG5vZGUgb3IgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYQotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50LCBEb2N1bWVudEZyYWdtZW50LCBBdHRyLCBFbnRpdHksIG9yIE5vdGF0aW9uCi0JICogICAgICAgICAgICAgICAgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdE5vZGUoTm9kZSByZWZOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gcmVmTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gKChOb2RlSW1wbCkgcmVmTm9kZSkuZ2V0SW5kZXgoKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJc2V0U3RhcnQocGFyZW50LCBpbmRleCk7Ci0JCXNldEVuZChwYXJlbnQsIGluZGV4ICsgMSk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IHRoZSBjb250ZW50cyB3aXRoaW4gYSBub2RlCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVOb2RlCi0JICogICAgICAgICAgICB0byBzZWxlY3QgZnJvbQotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqICAgICAgICAgICAgICAgIG9yIGFuIGFuY2VzdG9yIG9mIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGFuIEVudGl0eSwKLQkgKiAgICAgICAgICAgICAgICBOb3RhdGlvbiBvciBEb2N1bWVudFR5cGUgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdE5vZGVDb250ZW50cyhOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHJlZk5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIHJlZk5vZGU7Ci0JCQlzZXRTdGFydChyZWZOb2RlLCAwKTsKLQkJCXNldEVuZChyZWZOb2RlLCB0ZXh0LmdldExlbmd0aCgpKTsKLQkJfSBlbHNlIHsKLQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSByZWZOb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCWludCBsZW5ndGggPSAoY2hpbGROb2RlcyAhPSBudWxsID8gY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSA6IDApOwotCQkJc2V0U3RhcnQocmVmTm9kZSwgMCk7Ci0JCQlzZXRFbmQocmVmTm9kZSwgbGVuZ3RoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyB0aGUgZW5kIG9mIGEgUmFuZ2UuCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVUaGUKLQkgKiAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IHZhbHVlLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlCi0JICogICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gb2Zmc2V0VGhlCi0JICogICAgICAgICAgICA8Y29kZT5lbmRPZmZzZXQ8L2NvZGU+IHZhbHVlLgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqICAgICAgICAgICAgICAgIG9yIGFuIGFuY2VzdG9yIG9mIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGFuIEVudGl0eSwKLQkgKiAgICAgICAgICAgICAgICBOb3RhdGlvbiwgb3IgRG9jdW1lbnRUeXBlIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIDxjb2RlPm9mZnNldDwvY29kZT4gaXMKLQkgKiAgICAgICAgICAgICAgICBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjaGlsZCB1bml0cyBpbgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+LiBDaGlsZCB1bml0cyBhcmUgMTYtYml0IHVuaXRzIGlmCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYSB0eXBlIG9mIENoYXJhY3RlckRhdGEgbm9kZQotCSAqICAgICAgICAgICAgICAgIChlLmcuLCBhIFRleHQgb3IgQ29tbWVudCBub2RlKSBvciBhCi0JICogICAgICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIG5vZGUuIENoaWxkIHVuaXRzIGFyZSBOb2RlcyBpbiBhbGwKLQkgKiAgICAgICAgICAgICAgICBvdGhlciBjYXNlcy4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZChOb2RlIHJlZk5vZGUsIGludCBvZmZzZXQpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJdGhpcy5lbmRDb250YWluZXIgPSByZWZOb2RlOwotCQl0aGlzLmVuZE9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlbmQgb2YgYSBSYW5nZSB0byBiZSBhZnRlciBhIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVJhbmdlCi0JICogICAgICAgICAgICBlbmRzIGFmdGVyIDxjb2RlPnJlZk5vZGU8L2NvZGU+LgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiB0aGUgcm9vdCBjb250YWluZXIgb2YKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBub3QgYW4gQXR0ciwgRG9jdW1lbnQgb3IKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IG5vZGUgb3IgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYQotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50LCBEb2N1bWVudEZyYWdtZW50LCBBdHRyLCBFbnRpdHksIG9yIE5vdGF0aW9uCi0JICogICAgICAgICAgICAgICAgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZEFmdGVyKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IHJlZk5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9ICgoTm9kZUltcGwpIHJlZk5vZGUpLmdldEluZGV4KCk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCXNldEVuZChwYXJlbnQsIGluZGV4ICsgMSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZW5kIHBvc2l0aW9uIHRvIGJlIGJlZm9yZSBhIG5vZGUuCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVSYW5nZQotCSAqICAgICAgICAgICAgZW5kcyBiZWZvcmUgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgdGhlIHJvb3QgY29udGFpbmVyIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgbm90IGFuIEF0dHIsIERvY3VtZW50LCBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgbm9kZSBvciBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnQsIERvY3VtZW50RnJhZ21lbnQsIEF0dHIsIEVudGl0eSwgb3IgTm90YXRpb24KLQkgKiAgICAgICAgICAgICAgICBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kQmVmb3JlKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IHJlZk5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9ICgoTm9kZUltcGwpIHJlZk5vZGUpLmdldEluZGV4KCk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCXNldEVuZChwYXJlbnQsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVRoZQotCSAqICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gdmFsdWUuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUKLQkgKiAgICAgICAgICAgIGRpZmZlcmVudCBmcm9tIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBvZmZzZXRUaGUKLQkgKiAgICAgICAgICAgIDxjb2RlPnN0YXJ0T2Zmc2V0PC9jb2RlPiB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBvciBhbiBhbmNlc3RvciBvZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhbiBFbnRpdHksCi0JICogICAgICAgICAgICAgICAgTm90YXRpb24sIG9yIERvY3VtZW50VHlwZSBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzCi0JICogICAgICAgICAgICAgICAgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgY2hpbGQgdW5pdHMgaW4KLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPi4gQ2hpbGQgdW5pdHMgYXJlIDE2LWJpdCB1bml0cyBpZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEgdHlwZSBvZiBDaGFyYWN0ZXJEYXRhIG5vZGUKLQkgKiAgICAgICAgICAgICAgICAoZS5nLiwgYSBUZXh0IG9yIENvbW1lbnQgbm9kZSkgb3IgYQotCSAqICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBub2RlLiBDaGlsZCB1bml0cyBhcmUgTm9kZXMgaW4gYWxsCi0JICogICAgICAgICAgICAgICAgb3RoZXIgY2FzZXMuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChOb2RlIHJlZk5vZGUsIGludCBvZmZzZXQpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJdGhpcy5zdGFydENvbnRhaW5lciA9IHJlZk5vZGU7Ci0JCXRoaXMuc3RhcnRPZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhcnQgcG9zaXRpb24gdG8gYmUgYWZ0ZXIgYSBub2RlCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVSYW5nZQotCSAqICAgICAgICAgICAgc3RhcnRzIGFmdGVyIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIHRoZSByb290IGNvbnRhaW5lciBvZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIG5vdCBhbiBBdHRyLCBEb2N1bWVudCwgb3IKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IG5vZGUgb3IgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYQotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50LCBEb2N1bWVudEZyYWdtZW50LCBBdHRyLCBFbnRpdHksIG9yIE5vdGF0aW9uCi0JICogICAgICAgICAgICAgICAgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0QWZ0ZXIoTm9kZSByZWZOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gcmVmTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gKChOb2RlSW1wbCkgcmVmTm9kZSkuZ2V0SW5kZXgoKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJc2V0U3RhcnQocGFyZW50LCBpbmRleCArIDEpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXJ0IHBvc2l0aW9uIHRvIGJlIGJlZm9yZSBhIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVJhbmdlCi0JICogICAgICAgICAgICBzdGFydHMgYmVmb3JlIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIHRoZSByb290IGNvbnRhaW5lciBvZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIG5vdCBhbiBBdHRyLCBEb2N1bWVudCwgb3IKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IG5vZGUgb3IgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYQotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50LCBEb2N1bWVudEZyYWdtZW50LCBBdHRyLCBFbnRpdHksIG9yIE5vdGF0aW9uCi0JICogICAgICAgICAgICAgICAgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0QmVmb3JlKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IHJlZk5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9ICgoTm9kZUltcGwpIHJlZk5vZGUpLmdldEluZGV4KCk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCXNldFN0YXJ0KHBhcmVudCwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJlcGFyZW50cyB0aGUgY29udGVudHMgb2YgdGhlIFJhbmdlIHRvIHRoZSBnaXZlbiBub2RlIGFuZCBpbnNlcnRzIHRoZQotCSAqIG5vZGUgYXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQHBhcmFtIG5ld1BhcmVudFRoZQotCSAqICAgICAgICAgICAgbm9kZSB0byBzdXJyb3VuZCB0aGUgY29udGVudHMgd2l0aC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIGFuIGFuY2VzdG9yCi0JICogICAgICAgICAgICAgICAgY29udGFpbmVyIG9mIGVpdGhlciBib3VuZGFyeS1wb2ludCBvZiB0aGUgUmFuZ2UgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkLW9ubHkuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiA8Y29kZT4gbmV3UGFyZW50PC9jb2RlPgotCSAqICAgICAgICAgICAgICAgIGFuZCB0aGUgY29udGFpbmVyIG9mIHRoZSBzdGFydCBvZiB0aGUgUmFuZ2Ugd2VyZSBub3QKLQkgKiAgICAgICAgICAgICAgICBjcmVhdGVkIGZyb20gdGhlIHNhbWUgZG9jdW1lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiB0aGUgY29udGFpbmVyIG9mIHRoZQotCSAqICAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBSYW5nZSBpcyBvZiBhIHR5cGUgdGhhdCBkb2VzIG5vdCBhbGxvdwotCSAqICAgICAgICAgICAgICAgIGNoaWxkcmVuIG9mIHRoZSB0eXBlIG9mIDxjb2RlPm5ld1BhcmVudDwvY29kZT4gb3IgaWYKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5uZXdQYXJlbnQ8L2NvZGU+IGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBjb250YWluZXIKLQkgKiAgICAgICAgICAgICAgICBvciBpZiA8Y29kZT5ub2RlPC9jb2RlPiB3b3VsZCBlbmQgdXAgd2l0aCBhIGNoaWxkIG5vZGUKLQkgKiAgICAgICAgICAgICAgICBvZiBhIHR5cGUgbm90IGFsbG93ZWQgYnkgdGhlIHR5cGUgb2YgPGNvZGU+bm9kZTwvY29kZT4uCi0JICogICAgICAgICAgICAgICAgPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBCQURfQk9VTkRBUllQT0lOVFNfRVJSOiBSYWlzZWQgaWYgdGhlIFJhbmdlIHBhcnRpYWxseQotCSAqICAgICAgICAgICAgICAgIHNlbGVjdHMgYSBub24tdGV4dCBub2RlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+IG5vZGU8L2NvZGU+IGlzCi0JICogICAgICAgICAgICAgICAgYW4gQXR0ciwgRW50aXR5LCBEb2N1bWVudFR5cGUsIE5vdGF0aW9uLCBEb2N1bWVudCwgb3IKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IG5vZGUuCi0JICovCi0JcHVibGljIHZvaWQgc3Vycm91bmRDb250ZW50cyhOb2RlIG5ld1BhcmVudCkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SZWFkT25seUNvbnRyb2xsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVhZE9ubHlDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YzIzNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SZWFkT25seUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1jbGFzcyBSZWFkT25seUNvbnRyb2xsZXIgewotCi0JY2xhc3MgU3BhbiB7Ci0JCWludCBsZW5ndGg7Ci0JCWludCBvZmZzZXQ7Ci0KLQkJU3BhbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUmVhZE9ubHlDb250cm9sbGVyIGZJbnN0YW5jZTsKLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgUmVhZE9ubHlDb250cm9sbGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBSZWFkT25seUNvbnRyb2xsZXIoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIHZvaWQgbG9jayhJU3RydWN0dXJlZERvY3VtZW50IGRvYywgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBjYW5JbnNlcnRCZWZvcmUsIGJvb2xlYW4gY2FuSW5zZXJ0QWZ0ZXIpIHsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGRvYyBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KWRvYykubWFrZVJlYWRPbmx5KG9mZnNldCwgbGVuZ3RoLCBjYW5JbnNlcnRCZWZvcmUsIGNhbkluc2VydEFmdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWRvYy5tYWtlUmVhZE9ubHkob2Zmc2V0LCBsZW5ndGgpOwotCQl9Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgdm9pZCBsb2NrKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSwgYm9vbGVhbiBjYW5JbnNlcnRCZWZvcmUsIGJvb2xlYW4gY2FuSW5zZXJ0QWZ0ZXIpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRQYXJlbnREb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZG9jIGluc3RhbmNlb2YgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpZG9jKS5tYWtlUmVhZE9ubHkobm9kZS5nZXRTdGFydCgpLCBub2RlLmdldExlbmd0aCgpLCBjYW5JbnNlcnRCZWZvcmUsIGNhbkluc2VydEFmdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWRvYy5tYWtlUmVhZE9ubHkobm9kZS5nZXRTdGFydCgpLCBub2RlLmdldExlbmd0aCgpKTsKLQkJfQotCX0KLQotCXN0YXRpYyBwcml2YXRlIHZvaWQgdW5sb2NrKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBub2RlLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWRvYy5jbGVhclJlYWRPbmx5KG5vZGUuZ2V0U3RhcnQoKSwgbm9kZS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBSZWFkT25seUNvbnRyb2xsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBTcGFuIGdldERhdGFTcGFuKElET01Ob2RlIG5vZGUpIHsKLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCXJldHVybiBnZXREYXRhU3BhbkZvckVsZW1lbnQoKElET01FbGVtZW50KSBub2RlKTsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCXJldHVybiBnZXREYXRhU3BhbkZvclRleHQoKElET01UZXh0KSBub2RlKTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBuZXcgU3BhbigwLCAtMSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNwYW4gZ2V0RGF0YVNwYW5Gb3JFbGVtZW50KElET01FbGVtZW50IG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChkb2NSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTcGFuKDAsIC0xKTsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZG9jUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTcGFuKDAsIC0xKTsKLQkJfQotCi0JCVN0cmluZyBzdGFydFR5cGU7Ci0JCVN0cmluZyBlbmRUeXBlOwotCQlpZiAobm9kZS5pc0NvbW1lbnRUYWcoKSkgewotCQkJc3RhcnRUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOOwotCQkJZW5kVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0U7Ci0JCX0gZWxzZSB7Ci0JCQlzdGFydFR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRTsKLQkJCWVuZFR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0U7Ci0JCX0KLQotCQlpbnQgc3RhcnRPZmZzZXQgPSAtMTsKLQkJaW50IGVuZE9mZnNldCA9IC0xOwotCQlJVGV4dFJlZ2lvbiBwcmV2UmVnaW9uID0gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gc3RhcnRUeXBlKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSByZWdpb24uZ2V0RW5kKCk7Ci0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gZW5kVHlwZSAmJiBwcmV2UmVnaW9uICE9IG51bGwpIHsKLQkJCQllbmRPZmZzZXQgPSBwcmV2UmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCX0KLQkJCXByZXZSZWdpb24gPSByZWdpb247Ci0JCX0KLQotCQlpZiAoMCA8PSBzdGFydE9mZnNldCAmJiAwIDw9IGVuZE9mZnNldCkgewotCQkJcmV0dXJuIG5ldyBTcGFuKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFNwYW4oMCwgLTEpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTcGFuIGdldERhdGFTcGFuRm9yVGV4dChJRE9NVGV4dCBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChkb2NSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTcGFuKDAsIC0xKTsKLQkJfQotCQlyZXR1cm4gbmV3IFNwYW4oMCwgZG9jUmVnaW9uLmdldExlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZyb20gcGFyZW50J3Mgc2V0Q2hpbGRFZGl0YWJsZSgpCi0JICogCi0JICogY2FzZSAxOjxwYXJlbnQ+PG5vZGUgYXR0cj0idmFsdWUiLz4gPG5vZGUyPjwvcGFyZW50PgotCSAqIHgjIyMjIyMjIyMjIyMjIyMjIyMjI3ggY2FzZSAyOjxwYXJlbnQ+PG5vZGUgYXR0cj0idmFsdWUiPiA8Y2hpbGQ+Ci0JICogPC9jaGlsZD4gPC9ub2RlPiA8L3BhcmVudD4geCMjIyMjIyMjIyMjIyMjIyMjIyM/ID8jIyMjIyMjeCAoPyA6Ci0JICogZWRpdGFibGUgaWYgbm9kZS5pc0VkaXRhYmxlKCkgPT0gdHJ1ZSkKLQkgKi8KLQl2b2lkIGxvY2tCb3RoKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQkJYm9vbGVhbiBjYW5JbnNlcnQgPSBmYWxzZTsKLQotCQkvLyBlbmQgbm9kZSAoZWxlbWVudCkKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJZmxhdE5vZGUgPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQljYW5JbnNlcnQgPSBub2RlLmlzQ2hpbGRFZGl0YWJsZSgpOwotCQkJCWxvY2soZmxhdE5vZGUsIGNhbkluc2VydCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JCS8vIHN0YXJ0IG5vZGUKLQkJZmxhdE5vZGUgPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlsb2NrKGZsYXROb2RlLCBmYWxzZSwgY2FuSW5zZXJ0KTsKLQkJfQotCX0KLQotCXZvaWQgbG9ja0RhdGEoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTcGFuIHNwYW4gPSBnZXREYXRhU3Bhbihub2RlKTsKLQkJaWYgKDAgPD0gc3Bhbi5sZW5ndGgpIHsKLQkJCWxvY2sobm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyBzcGFuLm9mZnNldCwgc3Bhbi5sZW5ndGgsIGZhbHNlLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBsb2NrIGl0c2VsZiBhbmQgYWxsIGRlc2NlbmRhbnRzCi0JICovCi0Jdm9pZCBsb2NrRGVlcChJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBub2RlLmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCi0JCWJvb2xlYW4gY2FuSW5zZXJ0ID0gdHJ1ZTsKLQkJSURPTU5vZGUgcGFyZW50ID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCWNhbkluc2VydCA9IGZhbHNlOwotCQl9Ci0JCWxvY2sobm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgb2Zmc2V0LCBsZW5ndGgsIGNhbkluc2VydCwgY2FuSW5zZXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZyb20gcGFyZW50J3Mgc2V0Q2hpbGRFZGl0YWJsZSgpCi0JICogCi0JICogY2FzZSAxOjxwYXJlbnQ+PG5vZGUgYXR0cj0idmFsdWUiLz4gPG5vZGUyPjwvcGFyZW50PiB4IyMjIyMjeCB4IyN4Ci0JICogY2FzZSAyOjxwYXJlbnQ+PG5vZGUgYXR0cj0idmFsdWUiPiA8Y2hpbGQ+PC9jaGlsZD4gPC9ub2RlPiA8L3BhcmVudD4KLQkgKiB4IyMjIyMjeCB4Iz8gPyMjIyMjIyN4ICg/IDogZWRpdGFibGUgaWYgbm9kZS5pc0VkaXRhYmxlKCkgPT0gdHJ1ZSkKLQkgKi8KLQl2b2lkIGxvY2tOb2RlKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghbm9kZS5pc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQlsb2NrQm90aChub2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JCWJvb2xlYW4gY2FuSW5zZXJ0ID0gZmFsc2U7Ci0KLQkJLy8gZW5kIG5vZGUgKGVsZW1lbnQpCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWZsYXROb2RlID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJY2FuSW5zZXJ0ID0gbm9kZS5pc0NoaWxkRWRpdGFibGUoKTsKLQkJCQlsb2NrKGZsYXROb2RlLCBjYW5JbnNlcnQsIGZhbHNlKTsKLQkJCX0KLQkJfQotCQkvLyBzdGFydCBub2RlCi0JCWZsYXROb2RlID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJU3BhbiBzcGFuID0gZ2V0RGF0YVNwYW4obm9kZSk7Ci0JCQlpZiAoMCA8PSBzcGFuLmxlbmd0aCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZmxhdE5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJCQlpbnQgb2Zmc2V0LCBsZW5ndGg7Ci0JCQkJb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJCQlsZW5ndGggPSBzcGFuLm9mZnNldDsKLQkJCQlsb2NrKHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJb2Zmc2V0ID0gb2Zmc2V0ICsgc3Bhbi5vZmZzZXQgKyBzcGFuLmxlbmd0aDsKLQkJCQlsZW5ndGggPSBmbGF0Tm9kZS5nZXRFbmQoKSAtIG9mZnNldDsKLQkJCQlsb2NrKHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIGZhbHNlLCBjYW5JbnNlcnQpOwotCQkJfSBlbHNlIHsKLQkJCQlsb2NrKGZsYXROb2RlLCBmYWxzZSwgY2FuSW5zZXJ0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1bmxvY2soSVN0cnVjdHVyZWREb2N1bWVudCBkb2MsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZG9jLmNsZWFyUmVhZE9ubHkob2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCXZvaWQgdW5sb2NrQm90aChJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JCS8vIHN0YXJ0IG5vZGUKLQkJZmxhdE5vZGUgPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQl1bmxvY2soZmxhdE5vZGUpOwotCQl9Ci0JCS8vIGVuZCBub2RlCi0JCWZsYXROb2RlID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCXVubG9jayhmbGF0Tm9kZSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHVubG9ja0RhdGEoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTcGFuIHNwYW4gPSBnZXREYXRhU3Bhbihub2RlKTsKLQkJaWYgKDAgPD0gc3Bhbi5sZW5ndGgpIHsKLQkJCXVubG9jayhub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIHNwYW4ub2Zmc2V0LCBzcGFuLmxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHVubG9ja0RlZXAoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gbm9kZS5nZXRFbmRPZmZzZXQoKSAtIG9mZnNldDsKLQotCQl1bmxvY2sobm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgb2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCXZvaWQgdW5sb2NrTm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JCS8vIGVuZCBub2RlCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWZsYXROb2RlID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJdW5sb2NrKGZsYXROb2RlKTsKLQkJCX0KLQkJfQotCi0JCS8vIHN0YXJ0IG5vZGUKLQkJZmxhdE5vZGUgPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5pc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQkJdW5sb2NrKGZsYXROb2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3BhbiBzcGFuID0gZ2V0RGF0YVNwYW4obm9kZSk7Ci0JCQkJaWYgKHNwYW4ubGVuZ3RoIDw9IDApIHsKLQkJCQkJdW5sb2NrKGZsYXROb2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZsYXROb2RlLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCQkJCWludCBvZmZzZXQsIGxlbmd0aDsKLQkJCQkJb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJCQkJbGVuZ3RoID0gc3Bhbi5vZmZzZXQgLSBvZmZzZXQ7Ci0JCQkJCXVubG9jayhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJb2Zmc2V0ID0gc3Bhbi5vZmZzZXQgKyBzcGFuLmxlbmd0aDsKLQkJCQkJbGVuZ3RoID0gZmxhdE5vZGUuZ2V0RW5kKCkgLSBzcGFuLm9mZnNldDsKLQkJCQkJdW5sb2NrKHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU291cmNlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1NvdXJjZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDUxMjIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU291cmNlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklYTUxDaGFyRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZVZhbGlkYXRvciB7Ci0KLQlwcml2YXRlIE5vZGVJbXBsIG5vZGUgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIFNvdXJjZVZhbGlkYXRvcihOb2RlIG5vZGUpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQl0aGlzLm5vZGUgPSAoTm9kZUltcGwpIG5vZGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMubm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0KLQkJLy8gc2V0dXAgY29udmVyc2lvbiBjb25kaXRpb25zCi0JCWJvb2xlYW4gYWNjZXB0VGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0Q2xvc2UgPSBmYWxzZTsKLQkJYm9vbGVhbiBhY2NlcHRRdW90ZSA9IGZhbHNlOwotCQlib29sZWFuIGFjY2VwdEFtcGVyc2FuZCA9IGZhbHNlOwotCQlib29sZWFuIGFjY2VwdEVudGl0eVJlZiA9IHRydWU7Ci0JCWJvb2xlYW4gYWNjZXB0SlNQRW5kID0gdHJ1ZTsKLQkJU3RyaW5nIGVuZFRhZ05hbWUgPSBudWxsOwotCQlpZiAodGhpcy5ub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gKElET01Eb2N1bWVudCkgdGhpcy5ub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmlzSlNQVHlwZSgpKQotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCQlpZiAoYWNjZXB0VGFnKSB7Ci0JCQkJQXR0ciBhdHRyID0gKEF0dHIpIHRoaXMubm9kZTsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5pc0pTUFRhZygpKQotCQkJCQlhY2NlcHRUYWcgPSBmYWxzZTsKLQkJCX0KLQkJCS8vIGlmIHRoZSBzb3VyY2UgZG9lcyBub3QgaW5jbHVkZSBzaW5nbGUgcXVvdGUsCi0JCQkvLyBkb3VibGUgcXVvdGUgaXMgdmFsaWQKLQkJCWFjY2VwdFF1b3RlID0gKHNvdXJjZS5pbmRleE9mKCdcJycpIDwgMCk7Ci0JCX0gZWxzZSBpZiAodGhpcy5ub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMubm9kZTsKLQkJCWlmICh0ZXh0LmlzSlNQQ29udGVudCgpKSB7Ci0JCQkJaW50IGluZGV4ID0gc291cmNlLmluZGV4T2YoSlNQVGFnLlRBR19DTE9TRSk7Ci0JCQkJaWYgKGluZGV4IDwgMCkKLQkJCQkJcmV0dXJuIHNvdXJjZTsKLQkJCQlhY2NlcHRUYWcgPSB0cnVlOwotCQkJCWFjY2VwdENsb3NlID0gdHJ1ZTsKLQkJCQlhY2NlcHRRdW90ZSA9IHRydWU7Ci0JCQkJYWNjZXB0QW1wZXJzYW5kID0gdHJ1ZTsKLQkJCQlhY2NlcHRKU1BFbmQgPSBmYWxzZTsKLQkJCX0gZWxzZSBpZiAodGV4dC5pc0NEQVRBQ29udGVudCgpKSB7Ci0JCQkJZW5kVGFnTmFtZSA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJCQlhY2NlcHRDbG9zZSA9IHRydWU7Ci0JCQkJYWNjZXB0UXVvdGUgPSB0cnVlOwotCQkJCWFjY2VwdEFtcGVyc2FuZCA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQkJaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCWRvY3VtZW50ID0gKElET01Eb2N1bWVudCkgdGhpcy5ub2RlOwotCQkJfSBlbHNlIHsKLQkJCQlkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIHRoaXMubm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQl9Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5pc0pTUFR5cGUoKSkKLQkJCQlhY2NlcHRUYWcgPSB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWludCBjb3BpZWRMZW5ndGggPSAwOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVmID0gbnVsbDsKLQkJCWNoYXIgYyA9IHNvdXJjZS5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICc8JyA6Ci0JCQkJCWlmIChhY2NlcHRUYWcpIHsKLQkJCQkJCWlmIChlbmRUYWdOYW1lICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoIW1hdGNoRW5kVGFnKHNvdXJjZSwgaSArIDEsIGVuZFRhZ05hbWUpKQotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW50IHNraXAgPSBza2lwVGFnKHNvdXJjZSwgaSArIDEpOwotCQkJCQkJCWlmIChza2lwID49IDApIHsKLQkJCQkJCQkJaSArPSBza2lwOwotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBpbnZhbGlkIEpTUCB0YWcKLQkJCQkJfQotCQkJCQlyZWYgPSBJWE1MQ2hhckVudGl0eS5MVF9SRUY7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJz4nIDoKLQkJCQkJaWYgKGFjY2VwdENsb3NlKQotCQkJCQkJY29udGludWU7Ci0JCQkJCXJlZiA9IElYTUxDaGFyRW50aXR5LkdUX1JFRjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnJicgOgotCQkJCQlpZiAoYWNjZXB0QW1wZXJzYW5kKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChhY2NlcHRFbnRpdHlSZWYpIHsKLQkJCQkJCWludCBza2lwID0gc2tpcEVudGl0eVJlZihzb3VyY2UsIGkgKyAxKTsKLQkJCQkJCWlmIChza2lwID49IDApIHsKLQkJCQkJCQlpICs9IHNraXA7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmVmID0gSVhNTENoYXJFbnRpdHkuQU1QX1JFRjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnIicgOgotCQkJCQlpZiAoYWNjZXB0UXVvdGUpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJcmVmID0gSVhNTENoYXJFbnRpdHkuUVVPVF9SRUY7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyUnIDoKLQkJCQkJaWYgKGFjY2VwdEpTUEVuZCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAoc291cmNlLmNoYXJBdChpICsgMSkgIT0gJz4nKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWkrKzsKLQkJCQkJcmVmID0gSVhNTENoYXJFbnRpdHkuR1RfUkVGOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChyZWYgIT0gbnVsbCkgewotCQkJCWlmIChidWZmZXIgPT0gbnVsbCkgewotCQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDgpOwotCQkJCX0KLQkJCQlpZiAoaSA+IGNvcGllZExlbmd0aCkgewotCQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZS5zdWJzdHJpbmcoY29waWVkTGVuZ3RoLCBpKSk7Ci0JCQkJfQotCQkJCWJ1ZmZlci5hcHBlbmQocmVmKTsKLQkJCQljb3BpZWRMZW5ndGggPSBpICsgMTsgLy8gc2tpcCB0aGlzIGNoYXJhY3RlcgotCQkJfQotCQl9Ci0KLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlpZiAoY29waWVkTGVuZ3RoIDwgbGVuZ3RoKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKGNvcGllZExlbmd0aCwgbGVuZ3RoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gbWF0Y2hFbmRUYWcoU3RyaW5nIHNvdXJjZSwgaW50IG9mZnNldCwgU3RyaW5nIGVuZFRhZ05hbWUpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IGVuZFRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IGxlbmd0aCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHNvdXJjZS5jaGFyQXQob2Zmc2V0KSAhPSAnLycpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCW9mZnNldCsrOwotCQlpbnQgZW5kID0gb2Zmc2V0ICsgZW5kVGFnTmFtZS5sZW5ndGgoKTsKLQkJaWYgKGVuZCA+IGxlbmd0aCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGVuZFRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCwgZW5kKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgc2tpcEVudGl0eVJlZihTdHJpbmcgc291cmNlLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IHNvdXJjZS5sZW5ndGgoKSkKLQkJCXJldHVybiAtMTsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgdGhpcy5ub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7IC8vIGVycm9yCi0KLQkJaW50IGVuZCA9IHNvdXJjZS5pbmRleE9mKCc7Jywgb2Zmc2V0KTsKLQkJaWYgKGVuZCA8IDAgfHwgZW5kID09IG9mZnNldCkKLQkJCXJldHVybiAtMTsKLQkJU3RyaW5nIG5hbWUgPSBzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCwgZW5kKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBkb2N1bWVudC5nZXRDaGFyVmFsdWUobmFtZSkgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJcmV0dXJuIChlbmQgKyAxIC0gb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBza2lwVGFnKFN0cmluZyBzb3VyY2UsIGludCBvZmZzZXQpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gc291cmNlLmxlbmd0aCgpKQotCQkJcmV0dXJuIC0xOwotCi0JCWludCBlbmQgPSBvZmZzZXQ7Ci0JCWlmIChzb3VyY2UuY2hhckF0KG9mZnNldCkgPT0gJyUnKSB7Ci0JCQkvLyBKU1AgdGFnCi0JCQlpbnQgZm91bmQgPSBzb3VyY2UuaW5kZXhPZihKU1BUYWcuVEFHX0NMT1NFLCBvZmZzZXQgKyAxKTsKLQkJCWlmIChmb3VuZCA8IDApCi0JCQkJcmV0dXJuIC0xOyAvLyBpbnZhbGlkIEpTUCB0YWcKLQkJCWVuZCA9IGZvdW5kICsgMjsKLQkJfSBlbHNlIHsKLQkJCS8vIG5vcm1hbCB0YWcKLQkJCWludCBmb3VuZCA9IHNvdXJjZS5sYXN0SW5kZXhPZignPicpOwotCQkJaWYgKGZvdW5kIDwgb2Zmc2V0KQotCQkJCXJldHVybiAtMTsgLy8gaW52YWxpZCB0YWcKLQkJCWVuZCA9IGZvdW5kICsgMTsKLQkJfQotCQlyZXR1cm4gKGVuZCAtIG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24gewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRoaXMubm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBlcnJvcgotCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0KLQotCQkvLyBzZXR1cCB2YWxpZGF0aW9uIGNvbmRpdGlvbnMKLQkJYm9vbGVhbiBhY2NlcHRUYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBhY2NlcHRDbG9zZSA9IGZhbHNlOwotCQlib29sZWFuIGFjY2VwdFF1b3RlID0gdHJ1ZTsKLQkJYm9vbGVhbiBhY2NlcHRFbnRpdHlSZWYgPSB0cnVlOwotCQlTdHJpbmcgZW5kVGFnTmFtZSA9IG51bGw7Ci0JCWlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJCWlmIChhY2NlcHRUYWcpIHsKLQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgdGhpcy5ub2RlOwotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQkJCWFjY2VwdFRhZyA9IGZhbHNlOwotCQkJfQotCQkJLy8gaWYgdGhlIHNvdXJjZSBkb2VzIG5vdCBpbmNsdWRlIHNpbmdsZSBxdW90ZSwKLQkJCS8vIGRvdWJsZSBxdW90ZSBpcyB2YWxpZAotCQkJYWNjZXB0UXVvdGUgPSAoc291cmNlLmluZGV4T2YoJ1wnJykgPCAwKTsKLQkJfSBlbHNlIGlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5ub2RlOwotCQkJaWYgKHRleHQuaXNKU1BDb250ZW50KCkpIHsKLQkJCQlpbnQgaW5kZXggPSBzb3VyY2UuaW5kZXhPZihKU1BUYWcuVEFHX0NMT1NFKTsKLQkJCQlpZiAoaW5kZXggPCAwKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQltZXNzYWdlID0gWE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfY2hhcmFjdGVyX2d0X2ZvX0VSUk9SXzsKLQkJCQl0aHJvdyBuZXcgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbihtZXNzYWdlLCAnPicsIGluZGV4ICsgMSk7Ci0JCQl9IGVsc2UgaWYgKHRleHQuaXNDREFUQUNvbnRlbnQoKSkgewotCQkJCWVuZFRhZ05hbWUgPSB0ZXh0LmdldFBhcmVudE5vZGUoKS5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChlbmRUYWdOYW1lID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsgLy8gZXJyb3IKLQkJCQlhY2NlcHRUYWcgPSB0cnVlOwotCQkJCWFjY2VwdENsb3NlID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZihoYXNOZXN0ZWRSZWdpb24odGV4dCkpIHsKLQkJCQkvL3RoZXJlIGFyZSBjYXNlcyAoc3VjaCBhcyB3aXRoIEVMKSB0aGF0IHRoZSB0ZXh0IGlzIHRvIGNvbXBsaWNhdGVkCi0JCQkJLy8JdG8gYmUgdmVyaWZpZWQgYnkgdGhpcyB2YWxpZGF0b3IKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCQlpZiAodGhpcy5ub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSB0aGlzLm5vZGU7Ci0JCQl9IGVsc2UgewotCQkJCWRvY3VtZW50ID0gKElET01Eb2N1bWVudCkgdGhpcy5ub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmlzSlNQVHlwZSgpKQotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCX0KLQotCQljaGFyIGMgPSAwOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQljID0gc291cmNlLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJzwnIDoKLQkJCQkJaWYgKGFjY2VwdFRhZykgewotCQkJCQkJaWYgKGVuZFRhZ05hbWUgIT0gbnVsbCkgewotCQkJCQkJCWlmICghbWF0Y2hFbmRUYWcoc291cmNlLCBpICsgMSwgZW5kVGFnTmFtZSkpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpbnQgc2tpcCA9IHNraXBUYWcoc291cmNlLCBpICsgMSk7Ci0JCQkJCQkJaWYgKHNraXAgPj0gMCkgewotCQkJCQkJCQlpICs9IHNraXA7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGludmFsaWQgdGFnCi0JCQkJCX0KLQkJCQkJbWVzc2FnZSA9IFhNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2NoYXJhY3Rlcl9sdF9mb19FUlJPUl87Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJz4nIDoKLQkJCQkJaWYgKGFjY2VwdENsb3NlKQotCQkJCQkJY29udGludWU7Ci0JCQkJCW1lc3NhZ2UgPSBYTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9jaGFyYWN0ZXJfZ3RfZm9fRVJST1JfOwotCQkJCQlicmVhazsKLQkJCQljYXNlICcmJyA6Ci0JCQkJCWlmIChhY2NlcHRFbnRpdHlSZWYpIHsKLQkJCQkJCWlmIChlbmRUYWdOYW1lICE9IG51bGwpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlpbnQgc2tpcCA9IHNraXBFbnRpdHlSZWYoc291cmNlLCBpICsgMSk7Ci0JCQkJCQlpZiAoc2tpcCA+PSAwKSB7Ci0JCQkJCQkJaSArPSBza2lwOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJLy8gaW52YWxpZCBlbnRpdHkgcmVmZXJlbmNlCi0JCQkJCX0KLQkJCQkJbWVzc2FnZSA9IFhNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2NoYXJhY3Rlcl9hbXBfZm9fRVJST1JfOwotCQkJCQlicmVhazsKLQkJCQljYXNlICciJyA6Ci0JCQkJCWlmIChhY2NlcHRRdW90ZSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQltZXNzYWdlID0gWE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfY2hhcmFjdGVyX19mX0VYQ187Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKG1lc3NhZ2UsIGMsIGkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFRydWUgaWYgdGhlIHRleHQgaGFzIG5lc3RlZCByZWdpb25zLCBtZWFuaW5nIGNvbnRhaW5lciBpcyBwcm9iYWJseSB0b28KLQkgKiBjb21wbGljYXRlZCAobGlrZSBFTCByZWdpb25zKSB0byB2YWxpZGF0ZSB3aXRoIHRoaXMgdmFsaWRhdG9yLgotCSAqCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc05lc3RlZFJlZ2lvbihUZXh0SW1wbCB0ZXh0KSB7Ci0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VyclJlZ2lvbiA9IHRleHQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0UmVnaW9uID0gdGV4dC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJd2hpbGUoY3VyclJlZ2lvbiAhPSBudWxsICYmICFkb25lKSB7Ci0JCQkKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY3VyclJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7ICsraSkgewotCQkJCUlUZXh0UmVnaW9uIGNvbnRhaW5lciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCWlmICgoY29udGFpbmVyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zMiA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIGNvbnRhaW5lcikuZ2V0UmVnaW9ucygpOwotCQkJCQlpZiAocmVnaW9uczIgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWRvbmUgPSBjdXJyUmVnaW9uID09IGxhc3RSZWdpb247Ci0JCQljdXJyUmVnaW9uID0gY3VyclJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3YzhmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgb25seSBmb3IgZGVidWcgcHVycG9zZS4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIgewotCVN0cmluZyBFT0wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgaW50IG9mZnNldCA9IDA7Ci0JV3JpdGVyIHRlc3RXcml0ZXIgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIoV3JpdGVyIHdyaXRlcikgewotCQlzdXBlcigpOwotCQl0ZXN0V3JpdGVyID0gd3JpdGVyOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0NoaWxkTm9kZXMoTm9kZSBub2RlKSB7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWNoZWNrTm9kZShjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja01vZGVsKElET01Nb2RlbCBtb2RlbCkgewotCQljaGVja0NoaWxkTm9kZXMobW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTm9kZShOb2RlIG5vZGUpIHsKLQkJY2hlY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKChOb2RlSW1wbCkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGVja0NoaWxkTm9kZXMobm9kZSk7Ci0JCQljaGVja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigoKEVsZW1lbnRJbXBsKSBub2RlKS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBuID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYyA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGMgPT0gbnVsbCkgewotCQkJCQlyZXBvcnRFcnJvcigibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQljaGVja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChzdGFydCA8IHRoaXMub2Zmc2V0KQotCQkJcmVwb3J0RXJyb3IoIm92ZXJ3cmFwIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHN0YXJ0ID4gdGhpcy5vZmZzZXQpCi0JCQlyZXBvcnRFcnJvcigiZ2FwIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGVuZCA9IGZsYXROb2RlLmdldEVuZCgpOwotCQl0aGlzLm9mZnNldCA9IGVuZDsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAocCA9PSBudWxsKSB7Ci0JCQkJcmVwb3J0RXJyb3IoIm51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCWludCBzID0gcC5nZXRTdGFydCgpOwotCQkJaW50IGUgPSBwLmdldEVuZCgpOwotCQkJaWYgKHMgPiBzdGFydCB8fCBlIDwgZW5kKQotCQkJCXJlcG9ydEVycm9yKCJvdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHMgPT0gc3RhcnQgJiYgZSA9PSBlbmQpCi0JCQkJcmVwb3J0V2FybmluZygidmFpbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVwb3J0RXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3RyaW5nIG1zZyA9ICJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyIDogZXJyb3IgOiAiICsgbWVzc2FnZTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGVzdFdyaXRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRlc3RXcml0ZXIud3JpdGUobXNnICsgRU9MKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVwb3J0V2FybmluZyhTdHJpbmcgbWVzc2FnZSkgewotCQlTdHJpbmcgbXNnID0gIlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIgOiB3YXJuaW5nIDogIiArIG1lc3NhZ2U7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRlc3RXcml0ZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl0ZXN0V3JpdGVyLndyaXRlKG1zZyArIEVPTCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NTIxMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTY5OTkgLSBJbmVmZmljaWVudCB1c2Ugb2YgbmV3IFN0cmluZygpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0KLQlwcml2YXRlIFZlY3RvciBmbGF0Tm9kZXMgPSBuZXcgVmVjdG9yKDIpOwotCi0JLyoqCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRkUmVnaW9uKElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBhcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpZiAoY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCkgPiAwKSB7Ci0JCQkJdGhpcy5mbGF0Tm9kZXMuYWRkQWxsKGNvbnRhaW5lci5mbGF0Tm9kZXMpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5mbGF0Tm9kZXMuYWRkRWxlbWVudChmbGF0Tm9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RGVlcGVzdFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0ID0gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAobGFzdCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBsYXN0LmdldEVuZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCWlmICh0aGlzLmZsYXROb2Rlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoMCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dCgpIHsKLQkJcmV0dXJuIGdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlpbnQgc2l6ZSA9IHRoaXMuZmxhdE5vZGVzLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdChzaXplIC0gMSk7Ci0JfQotCi0JLyoqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gKGdldEVuZCgpIC0gZ2V0U3RhcnQoKSk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TmV4dCgpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE51bWJlck9mUmVnaW9ucygpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb25Db250YWluZXIgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRQYXJlbnREb2N1bWVudCgpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2aW91cygpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbkxpc3QgZ2V0UmVnaW9ucygpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZpcnN0ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZpcnN0LmdldFN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3QgPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmlyc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZmlyc3QuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmZsYXROb2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqLwotCWludCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpIHsKLQkJcmV0dXJuIHRoaXMuZmxhdE5vZGVzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWludCBzaXplID0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KGkpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZ2V0RW5kKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0VGV4dEVuZCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBsZW5ndGggaXMgZXF1YWwgdG8gbGVuZ3RoIGlmIHRoZXJlIGlzIG5vIHdoaXRlIHNwYWNlIGF0IHRoZQotCSAqIGVuZCBvZiBhIHJlZ2lvbi4gT3RoZXJ3aXNlIGl0IGlzIHNtYWxsZXIgdGhhbiBsZW5ndGguCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gKGdldFRleHRFbmQoKSAtIGdldFN0YXJ0KCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuICJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCWludCBzaXplID0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpOwotCQlpZiAoaW5kZXggPiBzaXplKQotCQkJcmV0dXJuOwotCQlpZiAoaW5kZXggPT0gc2l6ZSkgewotCQkJYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmZsYXROb2Rlcy5pbnNlcnRFbGVtZW50QXQoZmxhdE5vZGUsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZGVkKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZmxhdE5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JCXRoaXMuZmxhdE5vZGVzLnJlbW92ZUVsZW1lbnRBdChpbmRleCk7Ci0JCXJldHVybiBmbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IHNpemUgPSB0aGlzLmZsYXROb2Rlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdChpKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQl0aGlzLmZsYXROb2Rlcy5yZW1vdmVFbGVtZW50QXQoaSk7Ci0JCQkJcmV0dXJuIGZsYXROb2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgaW50IGluZGV4KSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbmRleCk7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JCXRoaXMuZmxhdE5vZGVzLnNldEVsZW1lbnRBdChmbGF0Tm9kZSwgaW5kZXgpOwotCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmRlZChib29sZWFuIGhhc0VuZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbmV3TGVuZ3RoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05leHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdQcmV2aW91cykgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbnMoSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucykgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBuZXdTdGFydCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJ3snKTsKLQkJaW50IGNvdW50ID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKQotCQkJCWJ1ZmZlci5hcHBlbmQoJywnKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKCJudWxsIik7Ly8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCWJ1ZmZlci5hcHBlbmQoZmxhdE5vZGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnfScpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXRub2RlLCBTdHJpbmcgY2hhbmdlcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7Ci0JCS8vIGlmIHNvbWVvbmUgImdldHMiIHRoZXNlIHRlbXAgcmVnaW9ucyBieQotCQkvLyBhY2NpZGVudCwgd2UnbGwgYWx3YXlzIHJldHVybiAiZGVsZXRlZCIuCi0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZChib29sZWFuIGRlbGV0ZWQpIHsKLQkJLy8gZG8gbm90aGluZwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBmZWNiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JLyoqCi0JICogRGVmYXVsdCA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbiBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCkgewotCQlzdXBlcigiSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtYW5hZ2VtZW50IGZhaWxlZC4iKTsvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzEyMjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTY5OTkgLSBJbmVmZmljaWVudCB1c2Ugb2YgbmV3IFN0cmluZygpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1jbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQotCXByaXZhdGUgaW50IG9mZnNldCA9IDA7Ci0KLQkvKioKLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCS8qKgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KGludCBvZmZzZXQsIGludCBsZW5ndGgsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JCXRoaXMuZmxhdE5vZGUgPSBmbGF0Tm9kZTsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMub2Zmc2V0IC09IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWdpb24oSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RGVlcGVzdFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJaW50IGZsYXROb2RlT2Zmc2V0ID0gMDsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCWZsYXROb2RlT2Zmc2V0ID0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlyZXR1cm4gZmxhdE5vZGVPZmZzZXQgKyB0aGlzLm9mZnNldCArIHRoaXMubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoKSB7Ci0JCXJldHVybiBnZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChTdHJpbmcgY29udGV4dCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRMYXN0UmVnaW9uKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TmV4dCgpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE51bWJlck9mUmVnaW9ucygpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlpbnQgZ2V0T2Zmc2V0KCkgewotCQlpbnQgZmxhdE5vZGVPZmZzZXQgPSAwOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJZmxhdE5vZGVPZmZzZXQgPSB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCXJldHVybiBmbGF0Tm9kZU9mZnNldCArIHRoaXMub2Zmc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbkNvbnRhaW5lciBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFBhcmVudERvY3VtZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQkJLy8gdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIKLQkJLy8gYmUgY2FsbGVkIik7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UHJldmlvdXMoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJaW50IGZsYXROb2RlT2Zmc2V0ID0gMDsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCWZsYXROb2RlT2Zmc2V0ID0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlyZXR1cm4gZmxhdE5vZGVPZmZzZXQgKyB0aGlzLm9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiogCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiB0aGlzLmZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCVN0cmluZyB0ZXh0ID0gdGhpcy5mbGF0Tm9kZS5nZXRUZXh0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQlpbnQgZW5kID0gdGhpcy5vZmZzZXQgKyB0aGlzLmxlbmd0aDsKLQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKHRoaXMub2Zmc2V0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZ2V0RW5kKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0VGV4dEVuZCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBsZW5ndGggaXMgZXF1YWwgdG8gbGVuZ3RoIGlmIHRoZXJlIGlzIG5vIHdoaXRlIHNwYWNlIGF0IHRoZQotCSAqIGVuZCBvZiBhIHJlZ2lvbi4gT3RoZXJ3aXNlIGl0IGlzIHNtYWxsZXIgdGhhbiBsZW5ndGguCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gIlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKCkgewotCQkvLyBJJ2xsIGFzc3VtZSBuZXZlciByZWFsbHkgbmVlZGVkIGhlcmUKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmRlZCgpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiBvbGRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIG5ld1JlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZChib29sZWFuIGRlbGV0ZWQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmRlZChib29sZWFuIGhhc0VuZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGhhZCB0byBtYWtlIHB1YmxpYywgZHVlIHRvIEFQSSB0cmFuc2l0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5leHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMub2Zmc2V0IC09IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdQcmV2aW91cykgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbnMoSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucykgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBuZXdTdGFydCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMub2Zmc2V0ICs9IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJdGhpcy5mbGF0Tm9kZSA9IGZsYXROb2RlOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5vZmZzZXQgLT0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCdbJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0U3RhcnQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJywnKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRFbmQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJ10nKTsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmZsYXROb2RlLnRvU3RyaW5nKCkpOwotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKCJudWxsIik7Ly8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdG5vZGUsIFN0cmluZyBjaGFuZ2VzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGEzNzhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIFByb3ZpZGVzIGNvbnZlbmllbnQgZnVuY3Rpb25zIHRvIGhhbmRsZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuZAotICogSVRleHRSZWdpb24uCi0gKi8KLWNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwgewotCi0JLyoqCi0JICogRXh0cmFjdHMgY29udGVudHMgZW5jbG9zZWQgd2l0aCBxdW90ZXMuIFF1b3RlcyBtYXkgYmUgZG91YmxlIG9yIHNpbmdsZS4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldEF0dHJWYWx1ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB2YWx1ZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCWNoYXIgZmlyc3RDaGFyID0gdmFsdWUuY2hhckF0KDApOwotCQlpZiAoZmlyc3RDaGFyID09ICciJyB8fCBmaXJzdENoYXIgPT0gJ1wnJykgewotCQkJaWYgKGxlbmd0aCA9PSAxKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKHZhbHVlLmNoYXJBdChsZW5ndGggLSAxKSA9PSBmaXJzdENoYXIpCi0JCQkJbGVuZ3RoLS07Ci0JCQlyZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDEsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEV4dHJhY3RzIHRoZSBuYW1lIHdpdGhvdXQgaGVhZGluZyAnJicgYW5kIHRhaWxpbmcgJzsnLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0RW50aXR5UmVmTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyByZWYgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCWludCBsZW5ndGggPSByZWYubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybiByZWY7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpZiAocmVmLmNoYXJBdCgwKSA9PSAnJicpCi0JCQlvZmZzZXQgPSAxOwotCQlpZiAocmVmLmNoYXJBdChsZW5ndGggLSAxKSA9PSAnOycpCi0JCQlsZW5ndGgtLTsKLQkJaWYgKG9mZnNldCA+PSBsZW5ndGgpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHJlZi5zdWJzdHJpbmcob2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IHJlZ2lvbi4KLQkgKi8KLQlzdGF0aWMgSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZihmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlmbGF0Tm9kZSA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpZmxhdE5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGZpcnN0IHJlZ2lvbi4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldEZpcnN0UmVnaW9uVHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCWZsYXROb2RlID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSlmbGF0Tm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQlyZXR1cm4gcmVnaW9uLmdldFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGUpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCWZsYXROb2RlID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCXJldHVybiBmbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXN0IHJlZ2lvbi4KLQkgKi8KLQlzdGF0aWMgSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCWZsYXROb2RlID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSlmbGF0Tm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCByZWdpb24uCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRMYXN0UmVnaW9uVHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCWZsYXROb2RlID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSlmbGF0Tm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCXJldHVybiByZWdpb24uZ2V0VHlwZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCWZsYXROb2RlID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCWZsYXROb2RlID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCXJldHVybiBmbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGZsYXROb2RlOwotCX0KLQotCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UYWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RhZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ5ZmY3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RhZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ0FkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0JU3RyaW5nIGdldEVuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqLwotCVN0cmluZyBnZXRTdGFydFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNFbmRUYWcoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkMzIwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTY5OTkgLSBJbmVmZmljaWVudCB1c2Ugb2YgbmV3IFN0cmluZygpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0vKioKLSAqIFRleHRJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0SW1wbCBleHRlbmRzIENoYXJhY3RlckRhdGFJbXBsIGltcGxlbWVudHMgSURPTVRleHQgewotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBTdHJpbmdQYWlyIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZkZpcnN0ID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgZlNlY29uZCA9IG51bGw7Ci0KLQkJU3RyaW5nUGFpcihTdHJpbmcgZmlyc3QsIFN0cmluZyBzZWNvbmQpIHsKLQkJCXRoaXMuZkZpcnN0ID0gZmlyc3Q7Ci0JCQl0aGlzLmZTZWNvbmQgPSBzZWNvbmQ7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0Rmlyc3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mRmlyc3Q7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0U2Vjb25kKCkgewotCQkJcmV0dXJuIHRoaXMuZlNlY29uZDsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZTb3VyY2UgPSBudWxsOwotCi0JLyoqCi0JICogVGV4dEltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGV4dEltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgVGV4dEltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dEltcGwoVGV4dEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmZTb3VyY2UgPSB0aGF0LmdldFNvdXJjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kRGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gYXJnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kRGF0YShTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGFyZyA9PSBudWxsIHx8IGFyZy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJU3RyaW5nIG5ld1NvdXJjZSA9IGdldFNvdXJjZShhcmcpOwotCQlpZiAobmV3U291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJc2V0VGV4dFNvdXJjZShzb3VyY2UgKyBuZXdTb3VyY2UpOwotCQllbHNlCi0JCQlzZXRUZXh0U291cmNlKG5ld1NvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQlyZXR1cm4gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigpOwotCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyKTsKLQkJfQotCi0JCXJldHVybiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kVGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uVGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZFRleHQoVGV4dCBuZXdUZXh0KSB7Ci0JCWlmIChuZXdUZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSBuZXdUZXh0OwotCQlTdHJpbmcgbmV3U291cmNlID0gdGV4dC5nZXRTb3VyY2UoKTsKLQkJaWYgKG5ld1NvdXJjZSA9PSBudWxsIHx8IG5ld1NvdXJjZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCXNldFRleHRTb3VyY2Uoc291cmNlICsgbmV3U291cmNlKTsKLQkJZWxzZQotCQkJc2V0VGV4dFNvdXJjZShuZXdTb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJVGV4dEltcGwgY2xvbmVkID0gbmV3IFRleHRJbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBkZWxldGVEYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb3VudAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQkJaWYgKGNvdW50IDwgMCB8fCBvZmZzZXQgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQkJU3RyaW5nUGFpciBwYWlyID0gc3Vic3RyaW5nU291cmNlRXhjbHVkZWQoc291cmNlLCBvZmZzZXQsIGNvdW50KTsKLQkJaWYgKHBhaXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc291cmNlID0gbnVsbDsKLQkJU3RyaW5nIGZpcnN0ID0gcGFpci5nZXRGaXJzdCgpOwotCQlpZiAoZmlyc3QgIT0gbnVsbCkKLQkJCXNvdXJjZSA9IGZpcnN0OwotCQlTdHJpbmcgc2Vjb25kID0gcGFpci5nZXRTZWNvbmQoKTsKLQkJaWYgKHNlY29uZCAhPSBudWxsKSB7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJc291cmNlICs9IHNlY29uZDsKLQkJCWVsc2UKLQkJCQlzb3VyY2UgPSBzZWNvbmQ7Ci0JCX0KLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJc291cmNlID0gTm9kZUltcGwuRU1QVFlfU1RSSU5HOyAvLyBkZWxldGUgYWxsCi0JCXNldFRleHRTb3VyY2Uoc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodGhpcy5mU291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0RGF0YSh0aGlzLmZTb3VyY2UpOwotCQlTdHJpbmcgZGF0YSA9IHN1cGVyLmdldERhdGEoKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCXJldHVybiBkYXRhOwotCQlyZXR1cm4gZ2V0RGF0YShnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGF0YShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBsZW5ndGggPSBjb250YWluZXIuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAobGVuZ3RoIDwgMTYpCi0JCQkJbGVuZ3RoID0gMTY7IC8vIGRlZmF1bHQKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCk7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKGNvbnRlbnQpOwotCQkJCWlmIChkYXRhID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCQl9Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQoKTsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0Rmlyc3RSZWdpb24oZmxhdE5vZGUpOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgewotCQkJCVN0cmluZyBuYW1lID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRFbnRpdHlSZWZOYW1lKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHZhbHVlID0gZG9jdW1lbnQuZ2V0Q2hhclZhbHVlKG5hbWUpOwotCQkJCQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIHZhbHVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGRhdGEgZm9yIHRoZSBzb3VyY2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREYXRhKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaW50IHJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJyk7Ci0JCXdoaWxlIChyZWYgPj0gMCkgewotCQkJaW50IGVuZCA9IHNvdXJjZS5pbmRleE9mKCc7JywgcmVmICsgMSk7Ci0JCQlpZiAoZW5kID4gcmVmICsgMSkgewotCQkJCVN0cmluZyBuYW1lID0gc291cmNlLnN1YnN0cmluZyhyZWYgKyAxLCBlbmQpOwotCQkJCVN0cmluZyB2YWx1ZSA9IGdldENoYXJWYWx1ZShuYW1lKTsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCk7Ci0JCQkJCWlmIChyZWYgPiBvZmZzZXQpCi0JCQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCByZWYpKTsKLQkJCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZSk7Ci0JCQkJCW9mZnNldCA9IGVuZCArIDE7Ci0JCQkJCXJlZiA9IGVuZDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZWYgPSBzb3VyY2UuaW5kZXhPZignJicsIHJlZiArIDEpOwotCQl9Ci0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybiBzb3VyY2U7Ci0JCWlmIChsZW5ndGggPiBvZmZzZXQpCi0JCQlidWZmZXIuYXBwZW5kKHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0KSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCX0KLQotCS8qKgotCSAqIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjdGV4dCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBURVhUX05PREU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7Ci0JCWlmICh0aGlzLmZTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmZTb3VyY2U7Ci0JCVN0cmluZyBkYXRhID0gc3VwZXIuZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKGRhdGEpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCXJldHVybiBzb3VyY2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc291cmNlIGZvciB0aGUgZGF0YQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNvdXJjZShTdHJpbmcgZGF0YSkgewotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlET01Nb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbW9kZWwuZ2V0R2VuZXJhdG9yKCk7Ci0JCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQlyZXR1cm4gZ2VuZXJhdG9yLmdlbmVyYXRlVGV4dERhdGEodGhpcywgZGF0YSk7Ci0JfQotCi0JLyoqCi0JICovCi0JU3RyaW5nIGdldFRleHRTb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmZTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaGFzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKGFza2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoZmxhdE5vZGUgPT0gYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IGFza2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnREYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBhcmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnREYXRhKGludCBvZmZzZXQsIFN0cmluZyBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoYXJnID09IG51bGwgfHwgYXJnLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0JCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChvZmZzZXQgPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJCX0KLQkJCXNvdXJjZSA9IGdldFNvdXJjZShhcmcpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCXNldFRleHRTb3VyY2Uoc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZ1BhaXIgcGFpciA9IHN1YnN0cmluZ1NvdXJjZUV4Y2x1ZGVkKHNvdXJjZSwgb2Zmc2V0LCAwKTsKLQkJaWYgKHBhaXIgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc291cmNlLmxlbmd0aCgpICsgYXJnLmxlbmd0aCgpKTsKLQkJU3RyaW5nIGZpcnN0ID0gcGFpci5nZXRGaXJzdCgpOwotCQlpZiAoZmlyc3QgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZmlyc3QpOwotCQlzb3VyY2UgPSBnZXRTb3VyY2UoYXJnKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQlTdHJpbmcgc2Vjb25kID0gcGFpci5nZXRTZWNvbmQoKTsKLQkJaWYgKHNlY29uZCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzZWNvbmQpOwotCQlzZXRUZXh0U291cmNlKGJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAobmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQlpZiAoZmxhdE5vZGUgPT0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKTsKLQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lcik7Ci0JCQlyZXR1cm4gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQljb250YWluZXIuaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCXJldHVybiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRUZXh0IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5UZXh0Ci0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0VGV4dChUZXh0IG5ld1RleHQsIGludCBvZmZzZXQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmV3VGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSBuZXdUZXh0OwotCQlTdHJpbmcgbmV3U291cmNlID0gdGV4dC5nZXRTb3VyY2UoKTsKLQkJaWYgKG5ld1NvdXJjZSA9PSBudWxsIHx8IG5ld1NvdXJjZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAob2Zmc2V0IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAob2Zmc2V0ID4gMCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCQl9Ci0JCQlzZXRUZXh0U291cmNlKG5ld1NvdXJjZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdQYWlyIHBhaXIgPSBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChzb3VyY2UsIG9mZnNldCwgMCk7Ci0JCWlmIChwYWlyID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZS5sZW5ndGgoKSArIG5ld1NvdXJjZS5sZW5ndGgoKSk7Ci0JCVN0cmluZyBmaXJzdCA9IHBhaXIuZ2V0Rmlyc3QoKTsKLQkJaWYgKGZpcnN0ICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGZpcnN0KTsKLQkJYnVmZmVyLmFwcGVuZChuZXdTb3VyY2UpOwotCQlTdHJpbmcgc2Vjb25kID0gcGFpci5nZXRTZWNvbmQoKTsKLQkJaWYgKHNlY29uZCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzZWNvbmQpOwotCQlzZXRUZXh0U291cmNlKGJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBpc0NEQVRBQ29udGVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NEQVRBQ29udGVudCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlyZXR1cm4gZWxlbWVudC5pc0NEQVRBQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnZhbGlkKCkgewotCQlyZXR1cm4gaXNJbnZhbGlkKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnZhbGlkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGlzSW52YWxpZChjb250ZW50KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJcmV0dXJuIGlzSW52YWxpZChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCX0KLQotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0Rmlyc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCAmJiBpc05vdE5lc3RlZENvbnRlbnQocmVnaW9uVHlwZSkgJiYgcmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFICYmIHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UgJiYgcmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgJiYgcmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdE5lc3RlZENvbnRlbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNTaGFyaW5nU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2hhcmVkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChmbGF0Tm9kZSA9PSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZTsKLQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudCA9PSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gc2hhcmVkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHRleHQgbm9kZSBjb250YWlucyA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDQvUkVDLXhtbC1pbmZvc2V0LTIwMDQwMjA0I2luZm9pdGVtLmNoYXJhY3Rlcic+Ci0JICogZWxlbWVudCBjb250ZW50IHdoaXRlc3BhY2U8L2E+LCBvZnRlbiBhYnVzaXZlbHkgY2FsbGVkICJpZ25vcmFibGUKLQkgKiB3aGl0ZXNwYWNlIi4gVGhlIHRleHQgbm9kZSBpcyBkZXRlcm1pbmVkIHRvIGNvbnRhaW4gd2hpdGVzcGFjZSBpbgotCSAqIGVsZW1lbnQgY29udGVudCBkdXJpbmcgdGhlIGxvYWQgb2YgdGhlIGRvY3VtZW50IG9yIGlmIHZhbGlkYXRpb24gb2NjdXJzCi0JICogd2hpbGUgdXNpbmcgPGNvZGU+RG9jdW1lbnQubm9ybWFsaXplRG9jdW1lbnQoKTwvY29kZT4uCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkgewotCQlyZXR1cm4gaXNXaGl0ZXNwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKCkgewotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGRhdGEuY2hhckF0KGkpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCS8vIHJlbW92ZWQgd2l0aCBwcm94eQotCQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJaWYgKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpID09IDEpIHsKLQkJCQkJCS8vIGdldCBiYWNrIHRvIHNpbmdsZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigwKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQkvLyByZW1vdmVkIHdpdGggcHJveHkKLQkJCQkJCWNvbnRhaW5lci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCQlpZiAoY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCkgPT0gMSkgewotCQkJCQkJCS8vIGdldCBiYWNrIHRvIHNpbmdsZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oMCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JfQotCi0JLyoqCi0JICogcmVwbGFjZURhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gYXJnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZURhdGEoaW50IG9mZnNldCwgaW50IGNvdW50LCBTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQkJaWYgKGFyZyA9PSBudWxsIHx8IGFyZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlkZWxldGVEYXRhKG9mZnNldCwgY291bnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlpbnNlcnREYXRhKG9mZnNldCwgYXJnKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCi0JCVN0cmluZ1BhaXIgcGFpciA9IHN1YnN0cmluZ1NvdXJjZUV4Y2x1ZGVkKHNvdXJjZSwgb2Zmc2V0LCBjb3VudCk7Ci0JCWlmIChwYWlyID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZS5sZW5ndGgoKSArIGFyZy5sZW5ndGgoKSk7Ci0JCVN0cmluZyBmaXJzdCA9IHBhaXIuZ2V0Rmlyc3QoKTsKLQkJaWYgKGZpcnN0ICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGZpcnN0KTsKLQkJc291cmNlID0gZ2V0U291cmNlKGFyZyk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlKTsKLQkJU3RyaW5nIHNlY29uZCA9IHBhaXIuZ2V0U2Vjb25kKCk7Ci0JCWlmIChzZWNvbmQgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoc2Vjb25kKTsKLQkJc2V0VGV4dFNvdXJjZShidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQkvLyBwcm94eSBtdXN0IG5vdCBiZSBuZXN0ZWQKLQkJCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCX0KLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJaWYgKGNvbnRlbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCWNvbnRhaW5lci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJfQotCi0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCQkJLy8gcHJveHkgbXVzdCBub3QgYmUgbmVzdGVkCi0JCQkJCQkJY29udGFpbmVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5sZW5ndGgoKSA+IDApCi0JCQl0aGlzLmZTb3VyY2UgPSBzb3VyY2U7Ci0JCXN1cGVyLnJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCX0KLQotCS8qKgotCSAqIGdldERhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJdGhpcy5mU291cmNlID0gbnVsbDsKLQkJc3VwZXIuc2V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24gewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCVNvdXJjZVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU291cmNlVmFsaWRhdG9yKHRoaXMpOwotCQlpZiAodmFsaWRhdG9yLnZhbGlkYXRlU291cmNlKHNvdXJjZSkpCi0JCQlzZXRUZXh0U291cmNlKHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMuZlNvdXJjZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJdGhpcy5mU291cmNlID0gc291cmNlOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlU291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlTb3VyY2VWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNvdXJjZVZhbGlkYXRvcih0aGlzKTsKLQkJc2V0VGV4dFNvdXJjZSh2YWxpZGF0b3IuY29udmVydFNvdXJjZShzb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBzcGxpdFRleHQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5UZXh0Ci0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFRleHQgc3BsaXRUZXh0KGludCBvZmZzZXQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCQlpZiAob2Zmc2V0IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gZ2V0TGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IG51bGw7Ci0JCWlmIChvZmZzZXQgPCBsZW5ndGgpIHsKLQkJCWludCBjb3VudCA9IGxlbmd0aCAtIG9mZnNldDsKLQkJCXNvdXJjZSA9IHN1YnN0cmluZ1NvdXJjZShvZmZzZXQsIGNvdW50KTsKLQkJCWRlbGV0ZURhdGEob2Zmc2V0LCBjb3VudCk7Ci0JCX0KLQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobnVsbCk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCXRleHQuc2V0VGV4dFNvdXJjZShzb3VyY2UpOwotCi0JCU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHRleHQsIGdldE5leHRTaWJsaW5nKCkpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqLwotCVRleHQgc3BsaXRUZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAobmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCB8fCAhKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWZvciAoOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7Ci0JCQlpZiAoY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbmRleCkgPT0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaW5kZXggPj0gY291bnQpIHsKLQkJCS8vIHRoaXMgaXMgdGhlIGNhc2UgbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBhIG5ldwotCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJLy8gc2VhcmNoIGdhcCBieSBvZmZzZXQKLQkJCWludCBvZmZzZXQgPSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW5kZXgpOwotCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJCWlmIChjb250ZW50LmdldFN0YXJ0KCkgPj0gb2Zmc2V0KQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChpbmRleCA+PSBjb3VudCkKLQkJCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJfQotCQlpZiAoaW5kZXggPT0gMCkKLQkJCXJldHVybiB0aGlzOyAvLyBub3RoaW5nIHRvIGRvCi0KLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJVGV4dEltcGwgbmV4dFRleHQgPSAoVGV4dEltcGwpIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG51bGwpOwotCQlpZiAobmV4dFRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCWZvciAoOyBpbmRleCA8IGNvdW50OyBjb3VudC0tKSB7Ci0JCQluZXh0VGV4dC5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbmRleCkpOwotCQl9Ci0KLQkJLy8gbm9ybWFsaXplIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJaWYgKGluZGV4ID09IDEpIHsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKDApKTsKLQkJfQotCi0JCXBhcmVudC5pbnNlcnRCZWZvcmUobmV4dFRleHQsIGdldE5leHRTaWJsaW5nKCkpOwotCQlyZXR1cm4gbmV4dFRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0cnVucyBkYXRhIGZvciB0aGUgcmFuZ2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBzdWJzdHJpbmdEYXRhKFN0cmluZyBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBzdXJlIG9mZnNldCBhbmQgY291bnQgYXJlIG5vbi1uZWdhdGl2ZQotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQkJaW50IGxlbmd0aCA9IGRhdGEubGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQkJaW50IGVuZCA9IG9mZnNldCArIGNvdW50OwotCQlpZiAoZW5kID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9Ci0JCXJldHVybiBkYXRhLnN1YnN0cmluZyhvZmZzZXQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzb3VyY2UgZm9yIHRoZSByYW5nZSBzcGVjaWZpZWQgYnk6IG9mZnNldDogZGF0YSBvZmZzZXQgY291bnQ6Ci0JICogZGF0YSBjb3VudAotCSAqLwotCXByaXZhdGUgU3RyaW5nIHN1YnN0cmluZ1NvdXJjZShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBzdXJlIG9mZnNldCBhbmQgY291bnQgYXJlIG5vbi1uZWdhdGl2ZQotCQlpZiAodGhpcy5mU291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gc3Vic3RyaW5nU291cmNlKHRoaXMuZlNvdXJjZSwgb2Zmc2V0LCBjb3VudCk7Ci0KLQkJU3RyaW5nIGRhdGEgPSBzdXBlci5nZXREYXRhKCk7Ci0JCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCWRhdGEgPSBzdWJzdHJpbmdEYXRhKGRhdGEsIG9mZnNldCwgY291bnQpOwotCQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZShkYXRhKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc291cmNlOwotCQl9Ci0KLQkJcmV0dXJuIHN1YnN0cmluZ1NvdXJjZShnZXRTb3VyY2UoKSwgb2Zmc2V0LCBjb3VudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzb3VyY2UgZm9yIHRoZSByYW5nZSBzcGVjaWZpZWQgYnk6IG9mZnNldDogZGF0YSBvZmZzZXQgY291bnQ6Ci0JICogZGF0YSBjb3VudAotCSAqLwotCXByaXZhdGUgU3RyaW5nIHN1YnN0cmluZ1NvdXJjZShTdHJpbmcgc291cmNlLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBzdXJlIG9mZnNldCBhbmQgY291bnQgYXJlIG5vbi1uZWdhdGl2ZQotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQotCQkvLyBmaW5kIGNoYXJhY3RlciByZWZlcmVuY2UKLQkJaW50IHJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJyk7Ci0JCXdoaWxlIChyZWYgPj0gMCkgewotCQkJaWYgKHJlZiA+PSBlbmQpCi0JCQkJYnJlYWs7Ci0JCQlpbnQgcmVmRW5kID0gc291cmNlLmluZGV4T2YoJzsnLCByZWYgKyAxKTsKLQkJCWlmIChyZWZFbmQgPiByZWYgKyAxKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBzb3VyY2Uuc3Vic3RyaW5nKHJlZiArIDEsIHJlZkVuZCk7Ci0JCQkJaWYgKGdldENoYXJWYWx1ZShuYW1lKSAhPSBudWxsKSB7Ci0JCQkJCS8vIGZvdW5kLCBzaGlmdCBmb3Igc291cmNlIG9mZnNldHMKLQkJCQkJaW50IHJlZkNvdW50ID0gcmVmRW5kIC0gcmVmOwotCQkJCQlpZiAocmVmIDwgb2Zmc2V0KQotCQkJCQkJb2Zmc2V0ICs9IHJlZkNvdW50OwotCQkJCQlpZiAocmVmIDwgZW5kKQotCQkJCQkJZW5kICs9IHJlZkNvdW50OwotCQkJCQlyZWYgPSByZWZFbmQ7Ci0JCQkJfQotCQkJfQotCQkJcmVmID0gc291cmNlLmluZGV4T2YoJyYnLCByZWYgKyAxKTsKLQkJfQotCi0JCWlmIChvZmZzZXQgPiBsZW5ndGggfHwgZW5kID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9Ci0KLQkJcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc291cmNlcyBiZWZvcmUgYW5kIGFmdGVyIHRoZSByYW5nZSBzcGVjaWZpZWQgYnk6IG9mZnNldDogZGF0YQotCSAqIG9mZnNldCBjb3VudDogZGF0YSBjb3VudAotCSAqLwotCXByaXZhdGUgU3RyaW5nUGFpciBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChTdHJpbmcgc291cmNlLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBzdXJlIG9mZnNldCBhbmQgY291bnQgYXJlIG5vbi1uZWdhdGl2ZQotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCWlmIChvZmZzZXQgPT0gMCAmJiBjb3VudCA9PSAwKQotCQkJCXJldHVybiBuZXcgU3RyaW5nUGFpcihudWxsLCBudWxsKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpbnQgZW5kID0gb2Zmc2V0ICsgY291bnQ7Ci0KLQkJLy8gZmluZCBjaGFyYWN0ZXIgcmVmZXJlbmNlCi0JCWludCByZWYgPSBzb3VyY2UuaW5kZXhPZignJicpOwotCQl3aGlsZSAocmVmID49IDApIHsKLQkJCWlmIChyZWYgPj0gZW5kKQotCQkJCWJyZWFrOwotCQkJaW50IHJlZkVuZCA9IHNvdXJjZS5pbmRleE9mKCc7JywgcmVmICsgMSk7Ci0JCQlpZiAocmVmRW5kID4gcmVmICsgMSkgewotCQkJCVN0cmluZyBuYW1lID0gc291cmNlLnN1YnN0cmluZyhyZWYgKyAxLCByZWZFbmQpOwotCQkJCWlmIChnZXRDaGFyVmFsdWUobmFtZSkgIT0gbnVsbCkgewotCQkJCQkvLyBmb3VuZCwgc2hpZnQgZm9yIHNvdXJjZSBvZmZzZXRzCi0JCQkJCWludCByZWZDb3VudCA9IHJlZkVuZCAtIHJlZjsKLQkJCQkJaWYgKHJlZiA8IG9mZnNldCkKLQkJCQkJCW9mZnNldCArPSByZWZDb3VudDsKLQkJCQkJaWYgKHJlZiA8IGVuZCkKLQkJCQkJCWVuZCArPSByZWZDb3VudDsKLQkJCQkJcmVmID0gcmVmRW5kOwotCQkJCX0KLQkJCX0KLQkJCXJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJywgcmVmICsgMSk7Ci0JCX0KLQotCQlpZiAob2Zmc2V0ID4gbGVuZ3RoIHx8IGVuZCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCi0JCVN0cmluZyBmaXJzdCA9IChvZmZzZXQgPiAwID8gc291cmNlLnN1YnN0cmluZygwLCBvZmZzZXQpIDogbnVsbCk7Ci0JCVN0cmluZyBzZWNvbmQgPSAoZW5kIDwgbGVuZ3RoID8gc291cmNlLnN1YnN0cmluZyhlbmQsIGxlbmd0aCkgOiBudWxsKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmdQYWlyKGZpcnN0LCBzZWNvbmQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2hvbGVUZXh0KCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBJbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0gICAgLyoqCi0JICogUmVwbGFjZXMgdGhlIHRleHQgb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgYWxsIGxvZ2ljYWxseS1hZGphY2VudCB0ZXh0Ci0JICogbm9kZXMgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHQuIEFsbCBsb2dpY2FsbHktYWRqYWNlbnQgdGV4dCBub2RlcyBhcmUKLQkgKiByZW1vdmVkIGluY2x1ZGluZyB0aGUgY3VycmVudCBub2RlIHVubGVzcyBpdCB3YXMgdGhlIHJlY2lwaWVudCBvZiB0aGUKLQkgKiByZXBsYWNlbWVudCB0ZXh0LiA8YnI+Ci0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbm9kZSB3aGljaCByZWNlaXZlZCB0aGUgcmVwbGFjZW1lbnQgdGV4dC4gVGhlCi0JICogcmV0dXJuZWQgbm9kZSBpczoKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPm51bGw8L2NvZGU+LCB3aGVuIHRoZSByZXBsYWNlbWVudCB0ZXh0IGlzIHRoZSBlbXB0eQotCSAqIHN0cmluZzsgPC9saT4KLQkgKiA8bGk+dGhlIGN1cnJlbnQgbm9kZSwgZXhjZXB0IHdoZW4gdGhlIGN1cnJlbnQgbm9kZSBpcyByZWFkLW9ubHk7IDwvbGk+Ci0JICogPGxpPiBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIG9mIHRoZSBzYW1lIHR5cGUgKAotCSAqIDxjb2RlPlRleHQ8L2NvZGU+IG9yIDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4pIGFzIHRoZSBjdXJyZW50Ci0JICogbm9kZSBpbnNlcnRlZCBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIHJlcGxhY2VtZW50LiA8L2xpPgotCSAqIDwvdWw+Ci0JICogPGJyPgotCSAqIEZvciBpbnN0YW5jZSwgaW4gdGhlIGFib3ZlIGV4YW1wbGUgY2FsbGluZwotCSAqIDxjb2RlPnJlcGxhY2VXaG9sZVRleHQ8L2NvZGU+IG9uIHRoZSA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIHRoYXQKLQkgKiBjb250YWlucyAiYmFyIiB3aXRoICJ5byIgaW4gYXJndW1lbnQgcmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nOiA8YnI+Ci0JICogV2hlcmUgdGhlIG5vZGVzIHRvIGJlIHJlbW92ZWQgYXJlIHJlYWQtb25seSBkZXNjZW5kYW50cyBvZiBhbgotCSAqIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4sIHRoZSA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+Ci0JICogbXVzdCBiZSByZW1vdmVkIGluc3RlYWQgb2YgdGhlIHJlYWQtb25seSBub2Rlcy4gSWYgYW55Ci0JICogPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiB0byBiZSByZW1vdmVkIGhhcyBkZXNjZW5kYW50cyB0aGF0IGFyZQotCSAqIG5vdCA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+LCA8Y29kZT5UZXh0PC9jb2RlPiwgb3IKLQkgKiA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+IG5vZGVzLCB0aGUgPGNvZGU+cmVwbGFjZVdob2xlVGV4dDwvY29kZT4KLQkgKiBtZXRob2QgbXVzdCBmYWlsIGJlZm9yZSBwZXJmb3JtaW5nIGFueSBtb2RpZmljYXRpb24gb2YgdGhlIGRvY3VtZW50LAotCSAqIHJhaXNpbmcgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IHdpdGggdGhlIGNvZGUKLQkgKiA8Y29kZT5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI8L2NvZGU+LiA8YnI+Ci0JICogRm9yIGluc3RhbmNlLCBpbiB0aGUgZXhhbXBsZSBiZWxvdyBjYWxsaW5nCi0JICogPGNvZGU+cmVwbGFjZVdob2xlVGV4dDwvY29kZT4gb24gdGhlIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgdGhhdAotCSAqIGNvbnRhaW5zICJiYXIiIGZhaWxzLCBiZWNhdXNlIHRoZSA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IG5vZGUKLQkgKiAiZW50IiBjb250YWlucyBhbiA8Y29kZT5FbGVtZW50PC9jb2RlPiBub2RlIHdoaWNoIGNhbm5vdCBiZSByZW1vdmVkLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogICAgICAgICAgICBUaGUgY29udGVudCBvZiB0aGUgcmVwbGFjaW5nIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUuCi0JICogQHJldHVybiBUaGUgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZAotCSAqICAgICAgICAgY29udGVudC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIG9uZSBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5UZXh0PC9jb2RlPiBub2RlcyBiZWluZyByZXBsYWNlZCBpcyByZWFkb25seS4KLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0gICAgcHVibGljIFRleHQgcmVwbGFjZVdob2xlVGV4dChTdHJpbmcgY29udGVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Vc2VyRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Vc2VyRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTVmZjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVXNlckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIENvbGxlY3RzIHVzZXIgZGF0YSBhc3NvY2lhdGVkIHRvIGEgTm9kZS4KLSAqIAotICovCi1maW5hbCBjbGFzcyBVc2VyRGF0YSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBVc2VyRGF0YSBmSW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBNYXBwaW5nIG9mIGEgTm9kZSB0byBpdHMgVXNlciBEYXRhIHRhYmxlIChyZXByZXNlbnRlZCBieSBhIE1hcCkKLQkgKi8KLQlwcml2YXRlIE1hcCBmRGF0YTsKLQotCXByaXZhdGUgVXNlckRhdGEoKSB7Ci0JCWZEYXRhID0gbmV3IFdlYWtIYXNoTWFwKDApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFVzZXJEYXRhIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpCi0JCQlmSW5zdGFuY2UgPSBuZXcgVXNlckRhdGEoKTsKLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHVzZXIgZGF0YSB0YWJsZSBhc3NvY2lhdGVkIHdpdGggPGNvZGU+bm9kZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKLQkgKiBAcmV0dXJuIHRoZSB1c2VyIGRhdGEgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSA8Y29kZT5ub2RlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgTWFwIGdldFVzZXJEYXRhVGFibGUoTm9kZSBub2RlKSB7Ci0JCWlmIChmRGF0YS5jb250YWluc0tleShub2RlKSkKLQkJCXJldHVybiAoTWFwKSBmRGF0YS5nZXQobm9kZSk7Ci0JCU1hcCB0YWJsZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZEYXRhLnB1dChub2RlLCB0YWJsZSk7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTEdlbmVyYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MR2VuZXJhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M3ZWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MR2VuZXJhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGwuQ29tbWVudEVsZW1lbnRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MQ2hhckVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTEdlbmVyYXRvckltcGwgaW1wbGVtZW50cyBJU291cmNlR2VuZXJhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfQ0xPU0UgPSAiXV0+IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX09QRU4gPSAiPCFbQ0RBVEFbIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfQ0xPU0UgPSAiLS0+IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfT1BFTiA9ICI8IS0tIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfT1BFTiA9ICI8IURPQ1RZUEUiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfQ0xPU0UgPSAiIC8+IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9PUEVOID0gIjwvIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBYTUxHZW5lcmF0b3JJbXBsIGluc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQ0xPU0UgPSAiPz4iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfT1BFTiA9ICI8PyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfSUQgPSAiUFVCTElDIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9QUkVGSVggPSAic3NpIjsvLyROT04tTkxTLTEkCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0ZFQVRVUkUgPSAiU1NJIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9UT0tFTiA9ICIjIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9JRCA9ICJTWVNURU0iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NMT1NFID0gIj4iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIElTb3VyY2VHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgWE1MR2VuZXJhdG9ySW1wbCgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JLy9wcml2YXRlIGJvb2xlYW4gaXNDb21tZW50VGFnKFhNTEVsZW1lbnQgZWxlbWVudCkgewotCS8vCWlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkvLwlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKWVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCS8vCWlmIChkb2N1bWVudCA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JLy8JRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRUeXBlQWRhcHRlcigpOwotCS8vCWlmIChhZGFwdGVyID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkvLwlpZiAoIWFkYXB0ZXIuaGFzRmVhdHVyZShTU0lfRkVBVFVSRSkpIHJldHVybiBmYWxzZTsKLQkvLwlTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLQkvLwlyZXR1cm4gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5lcXVhbHMoU1NJX1BSRUZJWCkpOwotCS8vfQotCS8qKgotCSAqIEhlbHBlciB0byBtb2RpZnkgdGhlIHRhZyBuYW1lIGluIHN1Yi1jbGFzc2VzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRUYWdOYW1lKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCB0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCSgoRWxlbWVudEltcGwpIGVsZW1lbnQpLnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogWE1MTW9kZWxHZW5lcmF0b3IgY29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIFhNTEdlbmVyYXRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUF0dHJOYW1lKEF0dHIgYXR0cikgewotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlpZiAoYXR0ck5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoYXR0ck5hbWUuc3RhcnRzV2l0aChKU1BUYWcuVEFHX09QRU4pKSB7Ci0JCQlpZiAoIWF0dHJOYW1lLmVuZHNXaXRoKEpTUFRhZy5UQUdfQ0xPU0UpKSB7Ci0JCQkJLy8gY2xvc2UgSlNQCi0JCQkJcmV0dXJuIChhdHRyTmFtZSArIEpTUFRhZy5UQUdfQ0xPU0UpOwotCQkJfQotCQl9Ci0JCWlmICgoKElET01BdHRyKSBhdHRyKS5pc0dsb2JhbEF0dHIoKSAmJiBDTU5vZGVVdGlsLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpICE9IG51bGwpIHsKLQkJCXN3aXRjaCAoZ2V0QXR0ck5hbWVDYXNlKGF0dHIpKSB7Ci0JCQkJY2FzZSBEb2N1bWVudFR5cGVBZGFwdGVyLlVQUEVSX0NBU0UgOgotCQkJCQlhdHRyTmFtZSA9IGF0dHJOYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFIDoKLQkJCQkJYXR0ck5hbWUgPSBhdHRyTmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJLy8gQVNJU19DQVNFCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyTmFtZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKEF0dHIgYXR0cikgewotCQlyZXR1cm4gZ2VuZXJhdGVBdHRyVmFsdWUoYXR0ciwgKGNoYXIpIDApOyAvLyBubyBxdW90ZSBwcmVmZXJlbmNlCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUF0dHJWYWx1ZShBdHRyIGF0dHIsIGNoYXIgcXVvdGUpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlTb3VyY2VWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNvdXJjZVZhbGlkYXRvcihhdHRyKTsKLQkJU3RyaW5nIHZhbHVlID0gdmFsaWRhdG9yLmNvbnZlcnRTb3VyY2UoKChJRE9NTm9kZSkgYXR0cikuZ2V0VmFsdWVTb3VyY2UoKSk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5zdGFydHNXaXRoKEpTUFRhZy5UQUdfT1BFTikpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoaXNCb29sZWFuQXR0cihhdHRyKSkgewotCQkJCWlmICgoKEF0dHJJbXBsKSBhdHRyKS5pc1hNTEF0dHIoKSkgewotCQkJCQkvLyBnZW5lcmF0ZSB0aGUgbmFtZSBhcyB2YWx1ZQotCQkJCQl2YWx1ZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIG5vdCB0byBnZW5lcmF0ZSAnPScgYW5kIHZhbHVlIGZvciBIVE1MIGJvb2xlYW4KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBnZW5lcmF0ZUF0dHJWYWx1ZSh2YWx1ZSwgcXVvdGUpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoU3RyaW5nIHZhbHVlLCBjaGFyIHF1b3RlKSB7Ci0JCS8vIGFzc3VtZSB0aGUgdmFsaWQgaXMgYWxyZWFkeSB2YWxpZGF0ZWQgbm90IHRvIGluY2x1ZGUgYm90aCBxdW90ZXMKLQkJaWYgKHF1b3RlID09ICciJykgewotCQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJiAodmFsdWUuaW5kZXhPZignIicpID49IDApKQotCQkJCXF1b3RlID0gJ1wnJzsgLy8gZm9yY2UKLQkJfSBlbHNlIGlmIChxdW90ZSA9PSAnXCcnKSB7Ci0JCQlpZiAoKHZhbHVlICE9IG51bGwpICYmICh2YWx1ZS5pbmRleE9mKCdcJycpID49IDApKQotCQkJCXF1b3RlID0gJyInOyAvLyBmb3JjZQotCQl9IGVsc2UgeyAvLyBubyBwcmVmZXJlbmNlCi0JCQlpZiAoKHZhbHVlICE9IG51bGwpICYmICh2YWx1ZS5pbmRleE9mKCciJykgPCAwKSkKLQkJCQlxdW90ZSA9ICciJzsKLQkJCWVsc2UKLQkJCQlxdW90ZSA9ICdcJyc7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gKHZhbHVlID09IG51bGwgPyAwIDogdmFsdWUubGVuZ3RoKCkpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyAyKTsKLQkJYnVmZmVyLmFwcGVuZChxdW90ZSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZSk7Ci0JCWJ1ZmZlci5hcHBlbmQocXVvdGUpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVDREFUQVNlY3Rpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDREFUQVNlY3Rpb24oQ0RBVEFTZWN0aW9uIGNkYXRhKSB7Ci0JCWlmIChjZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGRhdGEgPSBjZGF0YS5nZXREYXRhKCk7Ci0JCWludCBsZW5ndGggPSAoZGF0YSAhPSBudWxsID8gZGF0YS5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyAxNik7Ci0JCWJ1ZmZlci5hcHBlbmQoQ0RBVEFfT1BFTik7Ci0JCWlmIChkYXRhICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGRhdGEpOwotCQlidWZmZXIuYXBwZW5kKENEQVRBX0NMT1NFKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQ2hpbGQoTm9kZSBwYXJlbnROb2RlKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFwYXJlbnROb2RlLmhhc0NoaWxkTm9kZXMoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IHBhcmVudE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCVN0cmluZyBjaGlsZFNvdXJjZSA9IGdlbmVyYXRlU291cmNlKGNoaWxkKTsKLQkJCWlmIChjaGlsZFNvdXJjZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQoY2hpbGRTb3VyY2UpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQ2xvc2VUYWcoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQkJCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQkJCQlyZXR1cm4gSlNQVGFnLkNPTU1FTlRfQ0xPU0U7Ci0JCQkJCXJldHVybiBDT01NRU5UX0NMT1NFOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpKQotCQkJCQlyZXR1cm4gSlNQVGFnLlRBR19DTE9TRTsKLQkJCQlpZiAoZWxlbWVudC5pc0VtcHR5VGFnKCkpCi0JCQkJCXJldHVybiBFTVBUWV9DTE9TRTsKLQkJCQlyZXR1cm4gVEFHX0NMT1NFOwotCQkJfQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQlDb21tZW50SW1wbCBjb21tZW50ID0gKENvbW1lbnRJbXBsKSBub2RlOwotCQkJCWlmIChjb21tZW50LmlzSlNQVGFnKCkpCi0JCQkJCXJldHVybiBKU1BUYWcuQ09NTUVOVF9DTE9TRTsKLQkJCQlyZXR1cm4gQ09NTUVOVF9DTE9TRTsKLQkJCX0KLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotCQkJCXJldHVybiBUQUdfQ0xPU0U7Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQlyZXR1cm4gUElfQ0xPU0U7Ci0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLQkJCQlyZXR1cm4gQ0RBVEFfQ0xPU0U7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlQ29tbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQ29tbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDb21tZW50KENvbW1lbnQgY29tbWVudCkgewotCQlpZiAoY29tbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGRhdGEgPSBjb21tZW50LmdldERhdGEoKTsKLQkJaW50IGxlbmd0aCA9IChkYXRhICE9IG51bGwgPyBkYXRhLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDgpOwotCQlDb21tZW50SW1wbCBpbXBsID0gKENvbW1lbnRJbXBsKSBjb21tZW50OwotCQlpZiAoIWltcGwuaXNKU1BUYWcoKSkKLQkJCWJ1ZmZlci5hcHBlbmQoQ09NTUVOVF9PUEVOKTsKLQkJZWxzZQotCQkJYnVmZmVyLmFwcGVuZChKU1BUYWcuQ09NTUVOVF9PUEVOKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCWlmICghaW1wbC5pc0pTUFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZChDT01NRU5UX0NMT1NFKTsKLQkJZWxzZQotCQkJYnVmZmVyLmFwcGVuZChKU1BUYWcuQ09NTUVOVF9DTE9TRSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZURvY3R5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRvY1R5cGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVEb2N0eXBlKERvY3VtZW50VHlwZSBkb2NUeXBlKSB7Ci0JCWlmIChkb2NUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgbmFtZSA9IGRvY1R5cGUuZ2V0TmFtZSgpOwotCQlpbnQgbGVuZ3RoID0gKG5hbWUgIT0gbnVsbCA/IG5hbWUubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgMTYpOwotCQlidWZmZXIuYXBwZW5kKERPQ1RZUEVfT1BFTik7Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCURvY3VtZW50VHlwZUltcGwgZHQgPSAoRG9jdW1lbnRUeXBlSW1wbCkgZG9jVHlwZTsKLQkJU3RyaW5nIHB1YmxpY0lEID0gZHQuZ2V0UHVibGljSWQoKTsKLQkJU3RyaW5nIHN5c3RlbUlEID0gZHQuZ2V0U3lzdGVtSWQoKTsKLQkJaWYgKHB1YmxpY0lEICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCWJ1ZmZlci5hcHBlbmQoUFVCTElDX0lEKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJyInKTsKLQkJCWJ1ZmZlci5hcHBlbmQocHVibGljSUQpOwotCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJaWYgKHN5c3RlbUlEICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJCWJ1ZmZlci5hcHBlbmQoc3lzdGVtSUQpOwotCQkJCWJ1ZmZlci5hcHBlbmQoJyInKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChzeXN0ZW1JRCAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJCWJ1ZmZlci5hcHBlbmQoU1lTVEVNX0lEKTsKLQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJCWJ1ZmZlci5hcHBlbmQoc3lzdGVtSUQpOwotCQkJCWJ1ZmZlci5hcHBlbmQoJyInKTsKLQkJCX0KLQkJfQotCQlidWZmZXIuYXBwZW5kKCc+Jyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVsZW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGlmIGVtcHR5IHRhZyBpcyBwcmVmZXJyYWJsZSwgZ2VuZXJhdGUgYXMgZW1wdHkgdGFnCi0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCWlmIChpbXBsLnByZWZlckVtcHR5VGFnKCkpCi0JCQlpbXBsLnNldEVtcHR5VGFnKHRydWUpOwotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBzdGFydFRhZyA9IGdlbmVyYXRlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCWlmIChzdGFydFRhZyAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzdGFydFRhZyk7Ci0JCVN0cmluZyBjaGlsZCA9IGdlbmVyYXRlQ2hpbGQoZWxlbWVudCk7Ci0JCWlmIChjaGlsZCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChjaGlsZCk7Ci0JCVN0cmluZyBlbmRUYWcgPSBnZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJaWYgKGVuZFRhZyAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChlbmRUYWcpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQotCQkvLyBmaXJzdCBjaGVjayBpZiB0YWcgYWRhcHRlciBleGlzdHMKLQkJVGFnQWRhcHRlciBhZGFwdGVyID0gKFRhZ0FkYXB0ZXIpIGltcGwuZ2V0RXhpc3RpbmdBZGFwdGVyKFRhZ0FkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZW5kVGFnID0gYWRhcHRlci5nZXRFbmRUYWcoaW1wbCk7Ci0JCQlpZiAoZW5kVGFnICE9IG51bGwpCi0JCQkJcmV0dXJuIGVuZFRhZzsKLQkJfQotCi0JCWlmIChpbXBsLmlzRW1wdHlUYWcoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWltcGwuaXNDb250YWluZXIoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoaW1wbC5pc0pTUFRhZygpKQotCQkJcmV0dXJuIEpTUFRhZy5UQUdfQ0xPU0U7Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0ZVRhZ05hbWUoZWxlbWVudCk7Ci0JCWludCBsZW5ndGggPSAodGFnTmFtZSAhPSBudWxsID8gdGFnTmFtZS5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA0KTsKLQkJYnVmZmVyLmFwcGVuZChFTkRfT1BFTik7Ci0JCWlmICh0YWdOYW1lICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQlidWZmZXIuYXBwZW5kKCc+Jyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVudGl0eVJlZiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZW50aXR5UmVmCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRW50aXR5UmVmKEVudGl0eVJlZmVyZW5jZSBlbnRpdHlSZWYpIHsKLQkJaWYgKGVudGl0eVJlZiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIG5hbWUgPSBlbnRpdHlSZWYuZ2V0Tm9kZU5hbWUoKTsKLQkJaW50IGxlbmd0aCA9IChuYW1lICE9IG51bGwgPyBuYW1lLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDQpOwotCQlidWZmZXIuYXBwZW5kKCcmJyk7Ci0JCWlmIChuYW1lICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKG5hbWUpOwotCQlidWZmZXIuYXBwZW5kKCc7Jyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVBJIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwaQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVBJKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSkgewotCQlpZiAocGkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB0YXJnZXQgPSBwaS5nZXRUYXJnZXQoKTsKLQkJU3RyaW5nIGRhdGEgPSBwaS5nZXREYXRhKCk7Ci0JCWludCBsZW5ndGggPSAodGFyZ2V0ICE9IG51bGwgPyB0YXJnZXQubGVuZ3RoKCkgOiAwKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWxlbmd0aCArPSBkYXRhLmxlbmd0aCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA4KTsKLQkJYnVmZmVyLmFwcGVuZChQSV9PUEVOKTsKLQkJaWYgKHRhcmdldCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZCh0YXJnZXQpOwotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCWlmIChkYXRhICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGRhdGEpOwotCQlidWZmZXIuYXBwZW5kKFBJX0NMT1NFKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlU291cmNlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVNvdXJjZShOb2RlIG5vZGUpIHsKLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZUVsZW1lbnQoKEVsZW1lbnQpIG5vZGUpOwotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlVGV4dCgoVGV4dCkgbm9kZSk7Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVDb21tZW50KChDb21tZW50KSBub2RlKTsKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZURvY3R5cGUoKERvY3VtZW50VHlwZSkgbm9kZSk7Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVQSSgoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlKTsKLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZUNEQVRBU2VjdGlvbigoQ0RBVEFTZWN0aW9uKSBub2RlKTsKLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZUVudGl0eVJlZigoRW50aXR5UmVmZXJlbmNlKSBub2RlKTsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIERPQ1VNRU5UCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGdlbmVyYXRlQ2hpbGQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVTdGFydFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgRWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVTdGFydFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0KLQkJaWYgKGltcGwuaXNKU1BUYWcoKSkgewotCQkJLy8gY2hlY2sgaWYgSlNQIGNvbnRlbnQgdHlwZSBhbmQgSlNQIERvY3VtZW50Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmlzSlNQVHlwZSgpKSB7Ci0JCQkJaWYgKGRvY3VtZW50LmlzSlNQRG9jdW1lbnQoKSAmJiAhaW1wbC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJaW1wbC5zZXRKU1BUYWcoZmFsc2UpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW1wbC5zZXRKU1BUYWcoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWlmIChpbXBsLmlzQ29tbWVudFRhZygpICYmIGltcGwuZ2V0RXhpc3RpbmdBZGFwdGVyKFRhZ0FkYXB0ZXIuY2xhc3MpID09IG51bGwpIHsKLQkJCUNvbW1lbnRFbGVtZW50UmVnaXN0cnkgcmVnaXN0cnkgPSBDb21tZW50RWxlbWVudFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCQlyZWdpc3RyeS5zZXR1cENvbW1lbnRFbGVtZW50KGltcGwpOwotCQl9Ci0KLQkJLy8gZmlyc3QgY2hlY2sgaWYgdGFnIGFkYXB0ZXIgZXhpc3RzCi0JCVRhZ0FkYXB0ZXIgYWRhcHRlciA9IChUYWdBZGFwdGVyKSBpbXBsLmdldEV4aXN0aW5nQWRhcHRlcihUYWdBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIHN0YXJ0VGFnID0gYWRhcHRlci5nZXRTdGFydFRhZyhpbXBsKTsKLQkJCWlmIChzdGFydFRhZyAhPSBudWxsKQotCQkJCXJldHVybiBzdGFydFRhZzsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJaWYgKGltcGwuaXNDb21tZW50VGFnKCkpIHsKLQkJCWlmIChpbXBsLmlzSlNQVGFnKCkpCi0JCQkJYnVmZmVyLmFwcGVuZChKU1BUYWcuQ09NTUVOVF9PUEVOKTsKLQkJCWVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKENPTU1FTlRfT1BFTik7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IGdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJfSBlbHNlIGlmIChpbXBsLmlzSlNQVGFnKCkpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoSlNQVGFnLlRBR19PUEVOKTsKLQkJCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQkJaWYgKGltcGwuaXNDb250YWluZXIoKSkKLQkJCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7IC8vIEpTUCBjb250YWluZXIKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJzwnKTsKLQkJCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQl9Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IGxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBnZW5lcmF0ZUF0dHJOYW1lKGF0dHIpOwotCQkJaWYgKGF0dHJOYW1lICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChhdHRyTmFtZSk7Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gZ2VuZXJhdGVBdHRyVmFsdWUoYXR0cik7Ci0JCQlpZiAoYXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQkvLyBhdHRyIG5hbWUgb25seSBmb3IgSFRNTCBib29sZWFuIGFuZCBKU1AKLQkJCQlidWZmZXIuYXBwZW5kKCc9Jyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChhdHRyVmFsdWUpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGNsb3NlVGFnID0gZ2VuZXJhdGVDbG9zZVRhZyhlbGVtZW50KTsKLQkJaWYgKGNsb3NlVGFnICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGNsb3NlVGFnKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVRhZ05hbWUoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSURPTUVsZW1lbnQgeGUgPSAoSURPTUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHhlLmlzSlNQVGFnKCkpIHsKLQkJCWlmICh0YWdOYW1lLmVxdWFscyhKU1BUYWcuSlNQX0VYUFJFU1NJT04pKQotCQkJCXJldHVybiBKU1BUYWcuRVhQUkVTU0lPTl9UT0tFTjsKLQkJCWlmICh0YWdOYW1lLmVxdWFscyhKU1BUYWcuSlNQX0RFQ0xBUkFUSU9OKSkKLQkJCQlyZXR1cm4gSlNQVGFnLkRFQ0xBUkFUSU9OX1RPS0VOOwotCQkJaWYgKHRhZ05hbWUuZXF1YWxzKEpTUFRhZy5KU1BfRElSRUNUSVZFKSkKLQkJCQlyZXR1cm4gSlNQVGFnLkRJUkVDVElWRV9UT0tFTjsKLQkJCWlmICh0YWdOYW1lLnN0YXJ0c1dpdGgoSlNQVGFnLkpTUF9ESVJFQ1RJVkUpKSB7Ci0JCQkJaW50IG9mZnNldCA9IEpTUFRhZy5KU1BfRElSRUNUSVZFLmxlbmd0aCgpICsgMTsgLy8gYWZ0ZXIgJy4nCi0JCQkJcmV0dXJuIChKU1BUYWcuRElSRUNUSVZFX1RPS0VOICsgdGFnTmFtZS5zdWJzdHJpbmcob2Zmc2V0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gKHhlLmlzQ29tbWVudFRhZygpKSA/IHRhZ05hbWUgOiBudWxsOwotCQl9IGVsc2UgaWYgKHRhZ05hbWUuc3RhcnRzV2l0aChKU1BUYWcuVEFHX09QRU4pKSB7Ci0JCQlpZiAoIXRhZ05hbWUuZW5kc1dpdGgoSlNQVGFnLlRBR19DTE9TRSkpIHsKLQkJCQkvLyBjbG9zZSBKU1AKLQkJCQlyZXR1cm4gKHRhZ05hbWUgKyBKU1BUYWcuVEFHX0NMT1NFKTsKLQkJCX0KLQkJfSBlbHNlIGlmICh4ZS5pc0NvbW1lbnRUYWcoKSkgewotCQkJU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0JCQlpZiAocHJlZml4LmVxdWFscyhTU0lfUFJFRklYKSkgewotCQkJCXJldHVybiAoU1NJX1RPS0VOICsgZWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIXhlLmlzSlNQVGFnKCkgJiYgeGUuaXNHbG9iYWxUYWcoKSAmJiAvLyBnbG9iYWwgdGFnCi0JCQkJCQlDTU5vZGVVdGlsLmdldEVsZW1lbnREZWNsYXJhdGlvbih4ZSkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuZXdOYW1lID0gdGFnTmFtZTsKLQkJCQlzd2l0Y2ggKGdldFRhZ05hbWVDYXNlKHhlKSkgewotCQkJCQljYXNlIERvY3VtZW50VHlwZUFkYXB0ZXIuVVBQRVJfQ0FTRSA6Ci0JCQkJCQluZXdOYW1lID0gdGFnTmFtZS50b1VwcGVyQ2FzZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFIDoKLQkJCQkJCW5ld05hbWUgPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKG5ld05hbWUgIT0gdGFnTmFtZSkgewotCQkJCQl0YWdOYW1lID0gbmV3TmFtZTsKLQkJCQkJc2V0VGFnTmFtZShlbGVtZW50LCB0YWdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhZ05hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVUZXh0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5UZXh0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVRleHQoVGV4dCB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVGV4dEltcGwgaW1wbCA9IChUZXh0SW1wbCkgdGV4dDsKLQkJU3RyaW5nIHNvdXJjZSA9IGltcGwuZ2V0VGV4dFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gc291cmNlOwotCQlyZXR1cm4gZ2VuZXJhdGVUZXh0RGF0YSh0ZXh0LCBpbXBsLmdldERhdGEoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVRleHREYXRhKFRleHQgdGV4dCwgU3RyaW5nIGRhdGEpIHsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVRleHRJbXBsIGltcGwgPSAoVGV4dEltcGwpIHRleHQ7Ci0JCWlmIChpbXBsLmlzSlNQQ29udGVudCgpIHx8IGltcGwuaXNDREFUQUNvbnRlbnQoKSkgewotCQkJcmV0dXJuIG5ldyBTb3VyY2VWYWxpZGF0b3IoaW1wbCkuY29udmVydFNvdXJjZShkYXRhKTsKLQkJfQotCQlTdHJpbmcgc291cmNlID0gZGF0YTsKLQotCQkvLyBjb252ZXJ0IHNwZWNpYWwgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgZW50aXRpZXMKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBnZXRDaGFyTmFtZShkYXRhLmNoYXJBdChpKSk7Ci0JCQlpZiAobmFtZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgOCk7Ci0JCQlpZiAoaSA+IG9mZnNldCkKLQkJCQlidWZmZXIuYXBwZW5kKGRhdGEuc3Vic3RyaW5nKG9mZnNldCwgaSkpOwotCQkJYnVmZmVyLmFwcGVuZCgnJicpOwotCQkJYnVmZmVyLmFwcGVuZChuYW1lKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJzsnKTsKLQkJCW9mZnNldCA9IGkgKyAxOwotCQl9Ci0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJaWYgKGxlbmd0aCA+IG9mZnNldCkKLQkJCQlidWZmZXIuYXBwZW5kKGRhdGEuc3Vic3RyaW5nKG9mZnNldCkpOwotCQkJc291cmNlID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGludCBnZXRBdHRyTmFtZUNhc2UoQXR0ciBhdHRyKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGF0dHIuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBEb2N1bWVudFR5cGVBZGFwdGVyLlNUUklDVF9DQVNFOwotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBEb2N1bWVudFR5cGVBZGFwdGVyLlNUUklDVF9DQVNFOwotCQlyZXR1cm4gYWRhcHRlci5nZXRBdHRyTmFtZUNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDaGFyTmFtZShjaGFyIGMpIHsKLQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICc8JyA6Ci0JCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LkxUX05BTUU7Ci0JCQljYXNlICc+JyA6Ci0JCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LkdUX05BTUU7Ci0JCQljYXNlICcmJyA6Ci0JCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LkFNUF9OQU1FOwotCQkJY2FzZSAnIicgOgotCQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5RVU9UX05BTUU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VGFnTmFtZUNhc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBEb2N1bWVudFR5cGVBZGFwdGVyLlNUUklDVF9DQVNFOwotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBEb2N1bWVudFR5cGVBZGFwdGVyLlNUUklDVF9DQVNFOwotCQlyZXR1cm4gYWRhcHRlci5nZXRUYWdOYW1lQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0Jvb2xlYW5BdHRyKEF0dHIgYXR0cikgewotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGRlY2wgPSBDTU5vZGVVdGlsLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDTURhdGFUeXBlIHR5cGUgPSBkZWNsLmdldEF0dHJUeXBlKCk7Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyB2YWx1ZXNbXSA9IHR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQlpZiAodmFsdWVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAodmFsdWVzLmxlbmd0aCA9PSAxICYmIHZhbHVlc1swXS5lcXVhbHMoZGVjbC5nZXRBdHRyTmFtZSgpKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNzk5ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiBYTUxNb2RlbENvbnRleHQgY2xhc3MKLSAqLwotY2xhc3MgWE1MTW9kZWxDb250ZXh0IHsKLQlwcml2YXRlIE5vZGUgbmV4dE5vZGUgPSBudWxsOwotCXByaXZhdGUgTm9kZSBwYXJlbnROb2RlID0gbnVsbDsKLQotCS8vCXByaXZhdGUgWE1MTW9kZWxJbXBsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE5vZGUgcm9vdE5vZGUgPSBudWxsOwotCi0JLyoqCi0JICogWE1MTW9kZWxDb250ZXh0IGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHJvb3ROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JWE1MTW9kZWxDb250ZXh0KE5vZGUgcm9vdE5vZGUpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogZmluZEVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUVsZW1lbnQgZmluZEVuZFRhZyhTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZvciAoTm9kZSBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWJyZWFrOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQlpZiAoZWxlbWVudC5tYXRjaFRhZ05hbWUodGFnTmFtZSkpCi0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJCS8vIGlmIGFuY2VzdG9yIGVsZW1lbnQgaGFzIGVuZCB0YWcgc3RvcCBzZWFyY2gKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChlbGVtZW50LmdldE5leHRTaWJsaW5nKCkgIT0gbnVsbCkKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCVRleHQgZmluZE5leHRUZXh0KCkgewotCQlOb2RlIG5vZGUgPSB0aGlzLm5leHROb2RlOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSAhPSB0aGlzLm5leHROb2RlICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5vZGU7Ci0JCQkJLy8gc2tpcCBlbXB0eSB0ZXh0Ci0JCQkJaWYgKHRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHRleHQ7Ci0JCQl9Ci0JCQlOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCW5vZGUgPSBjaGlsZDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCQlOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCQlub2RlID0gbmV4dDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBmaW5kUHJldmlvdXNUZXh0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uVGV4dAotCSAqLwotCVRleHQgZmluZFByZXZpb3VzVGV4dCgpIHsKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpCi0JCQlub2RlID0gdGhpcy5uZXh0Tm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJZWxzZQotCQkJbm9kZSA9IHRoaXMucGFyZW50Tm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChUZXh0KSBub2RlOwotCX0KLQotCS8qKgotCSAqIGZpbmRTdGFydFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUVsZW1lbnQgZmluZFN0YXJ0VGFnKFN0cmluZyB0YWdOYW1lLCBTdHJpbmcgcm9vdE5hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGNoZWNrIHByZXZpb3VzIGZvciBlbXB0eSBjb250ZW50IGVsZW1lbnQKLQkJTm9kZSBwcmV2ID0gbnVsbDsKLQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCXByZXYgPSB0aGlzLm5leHROb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQllbHNlIGlmICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkKLQkJCXByZXYgPSB0aGlzLnBhcmVudE5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwcmV2OwotCQkJaWYgKCFlbGVtZW50Lmhhc0VuZFRhZygpICYmICFlbGVtZW50LmlzRW1wdHlUYWcoKSAmJiBlbGVtZW50Lm1hdGNoVGFnTmFtZSh0YWdOYW1lKSkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJfQotCi0JCWZvciAoTm9kZSBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQlpZiAoZWxlbWVudC5tYXRjaFRhZ05hbWUodGFnTmFtZSkpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQlpZiAocm9vdE5hbWUgIT0gbnVsbCAmJiBlbGVtZW50Lm1hdGNoVGFnTmFtZShyb290TmFtZSkpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROZXh0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlOb2RlIGdldE5leHROb2RlKCkgewotCQlyZXR1cm4gdGhpcy5uZXh0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQYXJlbnROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRSb290Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlOb2RlIGdldFJvb3ROb2RlKCkgewotCQlyZXR1cm4gdGhpcy5yb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRMYXN0IG1ldGhvZAotCSAqLwotCXZvaWQgc2V0TGFzdCgpIHsKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIHByZXYgPSB0aGlzLm5leHROb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHByZXYgPT0gbnVsbCB8fCBwcmV2LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJcmV0dXJuOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcHJldjsKLQkJCWlmIChlbGVtZW50Lmhhc0VuZFRhZygpIHx8ICFlbGVtZW50LmlzQ29udGFpbmVyKCkgfHwgZWxlbWVudC5pc0VtcHR5VGFnKCkpCi0JCQkJcmV0dXJuOwotCQkJc2V0UGFyZW50Tm9kZShwcmV2KTsKLQkJfQotCi0JCS8vIGZpbmQgbGFzdCBvcGVuIHBhcmVudAotCQlOb2RlIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKLQkJTm9kZSBsYXN0ID0gcGFyZW50LmdldExhc3RDaGlsZCgpOwotCQl3aGlsZSAobGFzdCAhPSBudWxsKSB7Ci0JCQlpZiAobGFzdC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWJyZWFrOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbGFzdDsKLQkJCWlmIChlbGVtZW50Lmhhc0VuZFRhZygpIHx8ICFlbGVtZW50LmlzQ29udGFpbmVyKCkgfHwgZWxlbWVudC5pc0VtcHR5VGFnKCkpCi0JCQkJYnJlYWs7Ci0JCQlwYXJlbnQgPSBlbGVtZW50OwotCQkJbGFzdCA9IHBhcmVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJfQotCQlpZiAocGFyZW50ICE9IHRoaXMucGFyZW50Tm9kZSkKLQkJCXNldFBhcmVudE5vZGUocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROZXh0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmV4dE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIHNldE5leHROb2RlKE5vZGUgbmV4dE5vZGUpIHsKLQkJdGhpcy5uZXh0Tm9kZSA9IG5leHROb2RlOwotCQlpZiAobmV4dE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy5wYXJlbnROb2RlID0gbmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCX0KLQotCS8qKgotCSAqIHNldFBhcmVudE5vZGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIHNldFBhcmVudE5vZGUoTm9kZSBwYXJlbnROb2RlKSB7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7Ci0JCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxOb3RpZmllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhM2UyNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiAKLSAqIFhNTE1vZGVsTm90aWZpZXIgbWFuYWdlcyB0aGUgbm90aWZpY2F0aW9uIHByb2Nlc3MuIENsaWVudHMgc2hvdWxkIG5vdCB1c2UKLSAqIGV4dGVuZCBvciByZWZlcmVuY2UuCi0gKiAKLSAqIElTU1VFOiBzaG91bGQgYmUgaW50ZXJuYWxpemVkLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgWE1MTW9kZWxOb3RpZmllciB7Ci0KLQkvKioKLQkgKiBhdHRyUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0Jdm9pZCBhdHRyUmVwbGFjZWQoRWxlbWVudCBlbGVtZW50LCBBdHRyIG5ld0F0dHIsIEF0dHIgb2xkQXR0cik7Ci0KLQkvKioKLQkgKiBTaWduYWwgdGhhdCBjaGFuZ2luZyBpcyBzdGFydGluZy4KLQkgKiAKLQkgKi8KLQl2b2lkIGJlZ2luQ2hhbmdpbmcoKTsKLQotCS8qKgotCSAqIFNpZ25hbCB0aGF0IGNoYW5naW5nIGlzIHN0YXJ0aW5nIHdpdGggYSBicmFuZCBuZXcgbW9kZWwuCi0JICogCi0JICovCi0Jdm9pZCBiZWdpbkNoYW5naW5nKGJvb2xlYW4gbmV3TW9kZWwpOwotCi0JLyoqCi0JICogQ2FuY2VsIHBlbmRpbmcgbm90aWZpY2F0aW9ucy4gVGhpcyBpcyBjYWxsZWQgaW4gdGhlIGNvbnRleHQgb2YKLQkgKiAicmVpbml0aWFsaXphdGlvbiIgc28gaXMgYXNzdW1lZCBBTEwgbm90aWZpY2F0aW9ucyBjYW4gYmUgc2FmZWx5Ci0JICogY2FuY2VsZWQsIGFzc3VtaW5nIHRoYXQgb25jZSBmYWN0b3JpZXMgYW5kIGFkYXB0ZXJzIGFyZSByZS1pbml0aWFsaXplZAotCSAqIHRoZXkgd2lsbCBiZSByZS1ub3RpZmllZCBhcyB0ZXh0IGlzIHNldCBpbiBtb2RlbCwgaWYgc3RpbGwgYXBwcm9wcmlhdGUuCi0JICovCi0Jdm9pZCBjYW5jZWxQZW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBjaGlsZFJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCBjaGlsZFJlcGxhY2VkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCk7Ci0KLQkvKioKLQkgKiBFZGl0YWJsZSBzdGF0ZSBjaGFuZ2VkIGZvciBub2RlLgotCSAqIAotCSAqLwotCXZvaWQgZWRpdGFibGVDaGFuZ2VkKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBTaWduYWwgY2hhbmdpbmcgaXMgZmluaXNoZWQuCi0JICogCi0JICovCi0Jdm9pZCBlbmRDaGFuZ2luZygpOwotCi0JLyoqCi0JICogU2lnbmFsIGVuZCB0YWcgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIAotCSAqLwotCXZvaWQgZW5kVGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogVXNlZCB0byByZWZsZWN0IHN0YXRlIG9mIG1vZGVsLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBtb2RlbCBoYWQgY2hhbmdlZC4KLQkgKiAKLQkgKi8KLQlib29sZWFuIGhhc0NoYW5nZWQoKTsKLQotCS8qKgotCSAqIFVzZWQgdG8gcmVmbGVjdCBzdGF0ZSBvZiBwYXJzaW5nIHByb2Nlc3MuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIG1vZGVsIGlzIGN1cnJlbnRseSBjaGFuZ2luZy4KLQkgKi8KLQlib29sZWFuIGlzQ2hhbmdpbmcoKTsKLQotCS8qKgotCSAqIHNpZ25hbCBwcm9wZXJ0eSBjaGFuZ2VkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQl2b2lkIHByb3BlcnR5Q2hhbmdlZChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogc2lnbmFsIHN0YXJ0IHRhZyBjaGFuZ2VkCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQl2b2lkIHN0YXJ0VGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogc2lnbmFsIHN0cnVjdHVyZWQgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXZvaWQgc3RydWN0dXJlQ2hhbmdlZChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogdmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCB2YWx1ZUNoYW5nZWQoTm9kZSBub2RlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWY4OWEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxOb3RpZmllckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxNb2RlbE5vdGlmaWVySW1wbCBpbXBsZW1lbnRzIFhNTE1vZGVsTm90aWZpZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm90aWZ5RXZlbnQgewotCQlPYmplY3QgY2hhbmdlZEZlYXR1cmU7Ci0JCWJvb2xlYW4gZGlzY2FyZGVkOwotCQlPYmplY3QgbmV3VmFsdWU7Ci0JCS8vIG5vdGU6IGRvbid0IGluaXRpYWxpemUgaW5zdGFuY2UgdmFyaWFibGVzLCBzaW5jZQotCQkvLyB0aGF0IGNhdXNlcyBkb3VibGUgYXNzaWdubWVudHMsIGFuZCBsb3RzIG9mIHRoZXNlIGFyZSBjcmVhdGVkLgotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyOwotCQlPYmplY3Qgb2xkVmFsdWU7Ci0JCWludCBwb3M7Ci0JCVN0cmluZyByZWFzb247Ci0JCWludCB0eXBlOwotCQlpbnQgaW5kZXg7Ci0KLQkJTm90aWZ5RXZlbnQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IHR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJCXRoaXMubm90aWZpZXIgPSBub3RpZmllcjsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLmNoYW5nZWRGZWF0dXJlID0gY2hhbmdlZEZlYXR1cmU7Ci0JCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCQl0aGlzLnBvcyA9IHBvczsKLQkJCXRoaXMucmVhc29uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBRERFRF9USEVOX1JFTU9WRUQgPSAiRGlzY2FyZDogQWRkZWQgdGhlbiByZW1vdmVkIHJ1bGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBmT3B0aW1pemVEZWZlcnJlZCA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBmT3B0aW1pemVEZWZlcnJlZEFjY29yZGluZ1RvUGFyZW50QWRkZWQgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZk9wdGltaXplRGVmZXJyZWRBY2NvcmRpbmdUb1BhcmVudFJlbW92ZWQgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQVJFTlRfSVNfQURERUQgPSAiRGlzYXJkZWQ6IFBhcmVudCBoYXMganVzdCBiZWVuIGFkZGVkIjsgLy8kTk9OLU5MUy0xJAotCS8qIHN0YXJ0OiBmb3IgZGVidWdnaW5nIG9ubHkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSRU5UX0lTX1JFTU9WRURfVE9PID0gIkRpc2NhcmQ6IFBhcmVudCB3YXMgcmVtb3ZlZCB0b28iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkVOVF9JU19SRVBBUkVOVEVEID0gIk5vdCBEaXNjYXJkOiBQYXJlbnQgd2FzIHJlbW92ZWQgc28gdGhpcyBpbXBsaWVzIHJlcGFyZW50aW5nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgTm9kZSBjaGFuZ2VkUm9vdCA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hhbmdpbmcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZG9pbmdOZXdNb2RlbCA9IGZhbHNlOwotCXByaXZhdGUgTGlzdCBmRXZlbnRzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZmx1c2hpbmcgPSBmYWxzZTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBYTUxNb2RlbE5vdGlmaWVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhdHRyUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHVibGljIHZvaWQgYXR0clJlcGxhY2VkKEVsZW1lbnQgZWxlbWVudCwgQXR0ciBuZXdBdHRyLCBBdHRyIG9sZEF0dHIpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQXR0ciBhdHRyID0gbnVsbDsKLQkJU3RyaW5nIG9sZFZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gbnVsbDsKLQkJaWYgKG9sZEF0dHIgIT0gbnVsbCkgewotCQkJYXR0ciA9IG9sZEF0dHI7Ci0JCQlvbGRWYWx1ZSA9IG9sZEF0dHIuZ2V0VmFsdWUoKTsKLQkJfQotCQlpZiAobmV3QXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyID0gbmV3QXR0cjsKLQkJCW5ld1ZhbHVlID0gbmV3QXR0ci5nZXRWYWx1ZSgpOwotCQl9Ci0JCUlET01Ob2RlIG5vdGlmaWVyID0gKElET01Ob2RlKSBlbGVtZW50OwotCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgYXR0ciwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBvZmZzZXQpOwotCQlwcm9wZXJ0eUNoYW5nZWQobm90aWZpZXIpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luQ2hhbmdpbmcoKSB7Ci0JCXRoaXMuY2hhbmdpbmcgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luQ2hhbmdpbmcoYm9vbGVhbiBuZXdNb2RlbCkgewotCQliZWdpbkNoYW5naW5nKCk7Ci0JCXRoaXMuZG9pbmdOZXdNb2RlbCA9IG5ld01vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIGNhbmNlbFBlbmRpbmcoKSB7Ci0JCS8vIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBzaXplIG9mIHRoaXMgYXJyYXksIHNpbmNlCi0JCS8vIHRoZSBhcnJheSBtYXkgYmUgYmVpbmcgcHJvY2Vzc2VkLCBpbiB0aGUgZGVmZXJyZWQgbm90aWZpY2F0aW9uCi0JCS8vIGxvb3AsIGJ1dCB3ZSBjYW4gc2lnbmFsIHRoYXQgYWxsCi0JCS8vIHNob3VsZCBiZSBkaXNjYXJkZWQsIHNvIGFueSByZW1haW5pbmcgb25lcyB3aWxsIGJlIGlnbm9yZWQuCi0JCWlmICh0aGlzLmZFdmVudHMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmRXZlbnRzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSAoTm90aWZ5RXZlbnQpIGZFdmVudHMuZ2V0KGkpOwotCQkJCWV2ZW50LmRpc2NhcmRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gdGhpcyBjYW5jZWwgaXMgcHJlc3VtYWJseSBiZWluZyBjYWxsZWQgYXMgYSBmdW5jdGlvbiBvZgotCQkvLyAicmVpbml0aWFpbGl6YXRpb24iIHNvIHdlIGNhbiBpZ25vcmUgY2hhbmdlcyB0byB0aGUKLQkJLy8gb2xkIHJvb3QsIGFuZCBjaGFuZ2VzIHRvIHRoZSBuZXcgb25lIHdpbGwgYmUgdHJpZ2dlcmVkIGR1cmluZwotCQkvLyByZWluaXRpYWxpemF0aW9uLgotCQljaGFuZ2VkUm9vdCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogY2hpbGRSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIGNoaWxkUmVwbGFjZWQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Ob2RlIG5vdGlmaWVyID0gKElET01Ob2RlKSBwYXJlbnROb2RlOwotCQlpbnQgdHlwZSA9IElOb2RlTm90aWZpZXIuQ0hBTkdFOwotCQlpZiAobmV3Q2hpbGQgPT0gbnVsbCkKLQkJCXR5cGUgPSBJTm9kZU5vdGlmaWVyLlJFTU9WRTsKLQkJZWxzZSBpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXR5cGUgPSBJTm9kZU5vdGlmaWVyLkFERDsKLQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCW5vdGlmeShub3RpZmllciwgdHlwZSwgb2xkQ2hpbGQsIG9sZENoaWxkLCBuZXdDaGlsZCwgb2Zmc2V0KTsKLQkJc3RydWN0dXJlQ2hhbmdlZChub3RpZmllcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZWRpdGFibGVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NTm9kZSBub3RpZmllciA9IChJRE9NTm9kZSkgbm9kZTsKLQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCW5vdGlmeShub3RpZmllciwgSU5vZGVOb3RpZmllci5DSEFOR0UsIG51bGwsIG51bGwsIG51bGwsIG9mZnNldCk7Ci0JCXByb3BlcnR5Q2hhbmdlZChub3RpZmllcik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZW5kQ2hhbmdpbmcoKSB7Ci0JCXRoaXMuZG9pbmdOZXdNb2RlbCA9IGZhbHNlOwotCQlpZiAoIXRoaXMuY2hhbmdpbmcpCi0JCQlyZXR1cm47IC8vIGF2b2lkIG5lc3RpbmcgY2FsbHMKLQkJbm90aWZ5RGVmZXJyZWQoKTsKLQkJaWYgKHRoaXMuY2hhbmdlZFJvb3QgIT0gbnVsbCkgewotCQkJbm90aWZ5U3RydWN0dXJlQ2hhbmdlZCh0aGlzLmNoYW5nZWRSb290KTsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQkJU3RyaW5nIHAgPSB0aGlzLmNoYW5nZWRSb290LmdldE5vZGVOYW1lKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJEZWZlcnJlZCBTVFJVQ1RVUkVfQ0hBTkdFRDogIiArIHApOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLmNoYW5nZWRSb290ID0gbnVsbDsKLQkJfQotCQl0aGlzLmNoYW5naW5nID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZW5kVGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU5vZGUgbm90aWZpZXIgPSAoSURPTU5vZGUpIGVsZW1lbnQ7Ci0JCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQlub3RpZnkobm90aWZpZXIsIElOb2RlTm90aWZpZXIuQ0hBTkdFLCBudWxsLCBudWxsLCBudWxsLCBvZmZzZXQpOwotCQlwcm9wZXJ0eUNoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hhbmdlZCgpIHsKLQkJcmV0dXJuICh0aGlzLmZFdmVudHMgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDaGFuZ2luZygpIHsKLQkJcmV0dXJuIHRoaXMuY2hhbmdpbmc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeShJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5jaGFuZ2luZyAmJiAhdGhpcy5mbHVzaGluZykgewotCQkJLy8gZGVmZXIgbm90aWZpY2F0aW9uCi0JCQlpZiAodGhpcy5mRXZlbnRzID09IG51bGwpCi0JCQkJdGhpcy5mRXZlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gd2UgZG8gbm90IGRlZmVyIGFueXRoaW5nIGlmIHdlIGFyZSBkb2luZyBhIG5ldyBNb2RlbCwKLQkJCS8vIGV4Y2VwdCBmb3IgdGhlIGRvY3VtZW50IGV2ZW50LCBzaW5jZSBhbGwgb3RoZXJzIGFyZQotCQkJLy8gdHJpdmlhbCBhbmQgbm90IG5lZWRlZCBhdCB0aGF0IGluaXRpYWwgcG9pbnQuCi0JCQkvLyBCdXQgZXZlbiBmb3IgdGhhdCBvbmUgZG9jdW1lbnQgZXZlbnQsIGluIHRoZSBuZXcgbW9kZWwgY2FzZSwKLQkJCS8vIGl0IGlzIHN0aWxsIGltcG9ydGFudCB0byBkZWZlciBpdC4KLQkJCWlmICgoIWRvaW5nTmV3TW9kZWwpIHx8ICgoKE5vZGUpIG5vdGlmaWVyKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCQl0aGlzLmZFdmVudHMuYWRkKG5ldyBOb3RpZnlFdmVudChub3RpZmllciwgZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJLy8gSXRzIGltcG9ydGFudCB0byAia2VlcCBnb2luZyIgaWYgZXhjZXB0aW9uIG9jY3Vycywgc2luY2UgdGhpcwotCQkJLy8gbm90aWZpY2F0aW9uCi0JCQkvLyBjb21lcyBpbiBiZXR3ZWVuICJhYm91dCB0byBjaGFuZ2UiIGFuZCAiY2hhbmdlZCIgZXZlbnRzLiBXZSBkbwotCQkJLy8gbG9nLCBob3dldmVyLAotCQkJLy8gc2luY2Ugd291bGQgaW5kaWNhdGUgYSBwcm9ncmFtIGVycm9yLgotCQkJbm90aWZpZXIubm90aWZ5KGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkEgc3RydWN0dXJlZCBtb2RlbCBjbGllbnQgdGhyZXcgZm9sbG93aW5nIGV4Y2VwdGlvbiBkdXJpbmcgYWRhcHRlciBub3RpZmljYXRpb24gKCIgKyBJTm9kZU5vdGlmaWVyLkVWRU5UX1RZUEVfU1RSSU5HU1tldmVudFR5cGVdICsgIiApIiwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeURlZmVycmVkKCkgewotCQlpZiAodGhpcy5mRXZlbnRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmZsdXNoaW5nKQotCQkJcmV0dXJuOwotCQl0aGlzLmZsdXNoaW5nID0gdHJ1ZTsgLy8gZm9yY2Ugbm90aWZpY2F0aW9uCi0JCWludCBjb3VudCA9IHRoaXMuZkV2ZW50cy5zaXplKCk7Ci0JCQotCQlpZiAoIWRvaW5nTmV3TW9kZWwgJiYgZk9wdGltaXplRGVmZXJyZWQpIHsKLQkJCU1hcCBub3RpZnlFdmVudHMgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSAoTm90aWZ5RXZlbnQpIHRoaXMuZkV2ZW50cy5nZXQoaSk7Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJCWV2ZW50LmluZGV4ID0gaTsKLQkJCQlpZihldmVudC50eXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFKSB7Ci0JCQkJCWFkZFRvTWFwKGV2ZW50Lm9sZFZhbHVlLCBldmVudCwgbm90aWZ5RXZlbnRzKTsKLQkJCQl9Ci0JCQkJaWYoZXZlbnQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCkgewotCQkJCQlhZGRUb01hcChldmVudC5uZXdWYWx1ZSwgZXZlbnQsIG5vdGlmeUV2ZW50cyk7Ci0JCQkJfQotCQkJfQotCQkJSXRlcmF0b3IgaXQgPSBub3RpZnlFdmVudHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlOb3RpZnlFdmVudFtdIGVzID0gKE5vdGlmeUV2ZW50W10pIGl0Lm5leHQoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVzLmxlbmd0aCAtIDE7IGkrKykgewotCQkJCQlOb3RpZnlFdmVudCBldmVudCA9IGVzW2ldOwotCQkJCQlpZihlc1tpXS5kaXNjYXJkZWQpIGNvbnRpbnVlOwotCQkJCQlOb3RpZnlFdmVudCBuZXh0ID0gZXNbaSArIDFdOwotCQkJCQlpZihlc1tpXS50eXBlID09IElOb2RlTm90aWZpZXIuQUREICYmIG5leHQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgewotCQkJCQkJLy8gQWRkZWQgdGhlbiByZW1vdmVkIGxhdGVyLCBkaXNjYXJkIGJvdGgKLQkJCQkJCWV2ZW50LmRpc2NhcmRlZCA9IHRydWU7Ci0JCQkJCQluZXh0LmRpc2NhcmRlZCA9IHRydWU7Ci0JCQkJCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJCQkJCWV2ZW50LnJlYXNvbiA9IGV2ZW50LnJlYXNvbiArIEFEREVEX1RIRU5fUkVNT1ZFRCArICIoc2VlICIgKyBuZXh0LmluZGV4ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQluZXh0LnJlYXNvbiA9IG5leHQucmVhc29uICsgQURERURfVEhFTl9SRU1PVkVEICsgIihzZWUgIiArIGV2ZW50LmluZGV4ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCU5vdGlmeUV2ZW50IGV2ZW50ID0gKE5vdGlmeUV2ZW50KSB0aGlzLmZFdmVudHMuZ2V0KGkpOwotCQkJCWlmIChldmVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQlpZihldmVudC5kaXNjYXJkZWQpIGNvbnRpbnVlOwotCQkJCWlmIChldmVudC5ub3RpZmllciAhPSBudWxsICYmIGZPcHRpbWl6ZURlZmVycmVkQWNjb3JkaW5nVG9QYXJlbnRBZGRlZCkgewotCQkJCQlpZiAoZXZlbnQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCkgewotCQkJCQkJTm90aWZ5RXZlbnRbXSBlcyA9IChOb3RpZnlFdmVudFtdKW5vdGlmeUV2ZW50cy5nZXQoZXZlbnQubm90aWZpZXIpOwotCQkJCQkJaWYoZXMgIT0gbnVsbCkgZm9yIChpbnQgcCA9IDA7IHAgPCBlcy5sZW5ndGggJiYgZXNbcF0uaW5kZXggPCBldmVudC5pbmRleDsgcCsrKSB7Ci0JCQkJCQkJTm90aWZ5RXZlbnQgcHJldiA9IGVzW3BdOwotCQkJCQkJCWlmIChwcmV2LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUgJiYgcHJldi5vbGRWYWx1ZSA9PSBldmVudC5ub3RpZmllcikgewotCQkJCQkJCQkvLyBwYXJlbnQgaXMgcmVwYXJlbnRlZCwgZG8gbm90IGRpc2NhcmQKLQkJCQkJCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQkJCQkJCWV2ZW50LnJlYXNvbiA9IGV2ZW50LnJlYXNvbiArIFBBUkVOVF9JU19SRVBBUkVOVEVEICsgIihzZWUgIiArIHByZXYuaW5kZXggKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0gZWxzZSBpZiAocHJldi50eXBlID09IElOb2RlTm90aWZpZXIuQUREICYmIHByZXYubmV3VmFsdWUgPT0gZXZlbnQubm90aWZpZXIpIHsKLQkJCQkJCQkJLy8gcGFyZW50IGhhcyBiZWVuIGFkZGVkLCBkaXNjYXJkIHRoaXMKLQkJCQkJCQkJZXZlbnQuZGlzY2FyZGVkID0gdHJ1ZTsKLQkJCQkJCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQkJCQkJCWV2ZW50LnJlYXNvbiA9IGV2ZW50LnJlYXNvbiArIFBBUkVOVF9JU19BRERFRCArICIoc2VlICIgKyBwcmV2LmluZGV4ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9CQkJCQkJCQotCQkJCQl9CQkJCQkJCi0JCQkJfQotCQkJCWlmKGV2ZW50LmRpc2NhcmRlZCkgY29udGludWU7Ci0JCQkJaWYgKGV2ZW50Lm5vdGlmaWVyICE9IG51bGwgJiYgZk9wdGltaXplRGVmZXJyZWRBY2NvcmRpbmdUb1BhcmVudFJlbW92ZWQpIHsKLQkJCQkJaWYgKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCQkJCU5vdGlmeUV2ZW50W10gZXMgPSAoTm90aWZ5RXZlbnRbXSlub3RpZnlFdmVudHMuZ2V0KGV2ZW50Lm5vdGlmaWVyKTsKLQkJCQkJCWlmKGVzICE9IG51bGwpIGZvciAoaW50IG4gPSAwOyBuIDwgZXMubGVuZ3RoOyBuKyspIHsKLQkJCQkJCQlOb3RpZnlFdmVudCBuZXh0ID0gZXNbbl07Ci0JCQkJCQkJaWYobmV4dC5pbmRleCA+IGV2ZW50LmluZGV4ICYmIG5leHQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgewotCQkJCQkJCQlpZiAobmV4dC5vbGRWYWx1ZSA9PSBldmVudC5ub3RpZmllcikgewotCQkJCQkJCQkJLy8gcGFyZW50IHdpbGwgYmUgcmVtb3ZlZCwgZGlzY2FyZCB0aGlzCi0JCQkJCQkJCQlldmVudC5kaXNjYXJkZWQgPSB0cnVlOwotCQkJCQkJCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQkJCQkJCQlldmVudC5yZWFzb24gPSBldmVudC5yZWFzb24gKyBQQVJFTlRfSVNfUkVNT1ZFRF9UT08gKyAiKHNlZSAiICsgbmV4dC5pbmRleCArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQkJCQkJCQotCQkJCX0KLQkJCQlpZihldmVudC5kaXNjYXJkZWQpIGNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSAoTm90aWZ5RXZlbnQpIHRoaXMuZkV2ZW50cy5nZXQoaSk7Ci0JCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCWlmKGV2ZW50LmRpc2NhcmRlZCkgY29udGludWU7Ci0JCQlub3RpZnkoZXZlbnQubm90aWZpZXIsIGV2ZW50LnR5cGUsIGV2ZW50LmNoYW5nZWRGZWF0dXJlLCBldmVudC5vbGRWYWx1ZSwgZXZlbnQubmV3VmFsdWUsIGV2ZW50LnBvcyk7Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCWZvciAoaW50IGwgPSAwOyBsIDwgY291bnQ7IGwrKykgewotCQkJCU5vdGlmeUV2ZW50IGV2ZW50ID0gKE5vdGlmeUV2ZW50KSB0aGlzLmZFdmVudHMuZ2V0KGwpOwotCQkJCU9iamVjdCBvID0gbnVsbDsKLQkJCQlTdHJpbmcgdCA9IG51bGw7Ci0JCQkJaWYgKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQpIHsKLQkJCQkJbyA9IGV2ZW50Lm5ld1ZhbHVlOwotCQkJCQl0ID0gIiArICI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCQkJbyA9IGV2ZW50Lm9sZFZhbHVlOwotCQkJCQl0ID0gIiAtICI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCVN0cmluZyBwID0gKChOb2RlKSBldmVudC5ub3RpZmllcikuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJU3RyaW5nIGMgPSAoKE5vZGUpIG8pLmdldE5vZGVOYW1lKCk7Ci0JCQkJCVN0cmluZyBkID0gKGV2ZW50LmRpc2NhcmRlZCA/ICIhICIgOiAiICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihkICsgcCArIHQgKyBjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhpcy5mbHVzaGluZyA9IGZhbHNlOwotCQl0aGlzLmZFdmVudHMgPSBudWxsOwotCX0KLQotCXZvaWQgYWRkVG9NYXAoT2JqZWN0IG8sIE5vdGlmeUV2ZW50IGV2ZW50LCBNYXAgbWFwKSB7Ci0JCWlmKG8gPT0gbnVsbCkgcmV0dXJuOwotCQlPYmplY3QgeCA9IG1hcC5nZXQobyk7Ci0JCWlmKHggPT0gbnVsbCkgewotCQkJbWFwLnB1dChvLCBuZXcgTm90aWZ5RXZlbnRbXXtldmVudH0pOwotCQl9IGVsc2UgewotCQkJTm90aWZ5RXZlbnRbXSBlcyA9IChOb3RpZnlFdmVudFtdKXg7Ci0JCQlOb3RpZnlFdmVudFtdIGVzMiA9IG5ldyBOb3RpZnlFdmVudFtlcy5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZXMsIDAsIGVzMiwgMCwgZXMubGVuZ3RoKTsKLQkJCWVzMltlcy5sZW5ndGhdID0gZXZlbnQ7Ci0JCQltYXAucHV0KG8sIGVzMik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5U3RydWN0dXJlQ2hhbmdlZChOb2RlIHJvb3QpIHsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSByb290OwotCQl0cnkgewotCQkJLy8gSXRzIGltcG9ydGFudCB0byAia2VlcCBnb2luZyIgaWYgZXhjZXB0aW9uIG9jY3Vycywgc2luY2UgdGhpcwotCQkJLy8gbm90aWZpY2F0aW9uCi0JCQkvLyBjb21lcyBpbiBiZXR3ZWVuICJhYm91dCB0byBjaGFuZ2UiIGFuZCAiY2hhbmdlZCIgZXZlbnRzLiBXZSBkbwotCQkJLy8gbG9nLCBob3dldmVyLAotCQkJLy8gc2luY2Ugd291bGQgaW5kaWNhdGUgYSBwcm9ncmFtIGVycm9yLgotCQkJbm90aWZpZXIubm90aWZ5KElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQsIG51bGwsIG51bGwsIG51bGwsIC0xKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkEgc3RydWN0dXJlZCBtb2RlbCBjbGllbnQgdGhyZXcgZm9sbG93aW5nIGV4Y2VwdGlvbiBkdXJpbmcgYWRhcHRlciBub3RpZmljYXRpb24gKCIgKyBJTm9kZU5vdGlmaWVyLkVWRU5UX1RZUEVfU1RSSU5HU1tJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEXSArICIgKSIsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE5vZGUgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldENvbW1vblJvb3RJZk5lZWRlZChOb2RlIG5vZGUpIHsKLQkJLy8gZGVmZXIgbm90aWZpY2F0aW9uCi0JCWlmICh0aGlzLmNoYW5nZWRSb290ID09IG51bGwpIHsKLQkJCXRoaXMuY2hhbmdlZFJvb3QgPSBub2RlOwotCQl9IGVsc2UgewotCQkJLy8gdGlueSBvcHRpbWl6YXRpb246IGlmIHByZXZpb3VzIGNvbW1vbkFuY2VzdG9yIChjaGFuZ2VkUm9vdCkgaXMKLQkJCS8vIGFscmVhZHkgJ2RvY3VtZW50JywKLQkJCS8vIG9yIGlmIGFscmVhZHkgZXF1YWwgdG8gdGhpcyAnbm9kZScsCi0JCQkvLyB0aGVuIG5vIG5lZWQgdG8gcmUtY2FsY3VsYXRlCi0JCQlpZiAoY2hhbmdlZFJvb3QuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUgJiYgY2hhbmdlZFJvb3QgIT0gbm9kZSkgewotCQkJCU5vZGUgY29tbW9uID0gKChOb2RlSW1wbCkgdGhpcy5jaGFuZ2VkUm9vdCkuZ2V0Q29tbW9uQW5jZXN0b3Iobm9kZSk7Ci0JCQkJaWYgKGNvbW1vbiAhPSBudWxsKQotCQkJCQl0aGlzLmNoYW5nZWRSb290ID0gY29tbW9uOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5jaGFuZ2VkUm9vdCA9IG5vZGU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydFRhZ0NoYW5nZWQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Ob2RlIG5vdGlmaWVyID0gKElET01Ob2RlKSBlbGVtZW50OwotCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgbnVsbCwgbnVsbCwgbnVsbCwgb2Zmc2V0KTsKLQkJcHJvcGVydHlDaGFuZ2VkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHN0cnVjdHVyZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc0NoYW5naW5nKCkpIHsKLQkJCXNldENvbW1vblJvb3RJZk5lZWRlZChub2RlKTsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQkJU3RyaW5nIHAgPSB0aGlzLmNoYW5nZWRSb290LmdldE5vZGVOYW1lKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXF1ZXN0ZWQgU1RSVUNUVVJFX0NIQU5HRUQ6ICIgKyBwKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQlTdHJpbmcgcCA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RSVUNUVVJFX0NIQU5HRUQ6ICIgKyBwKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW5vdGlmeVN0cnVjdHVyZUNoYW5nZWQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogdmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NTm9kZSBub3RpZmllciA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJQXR0ciBhdHRyID0gKEF0dHIpIG5vZGU7Ci0JCQlub3RpZmllciA9IChJRE9NTm9kZSkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJCS8vIFRPRE9fZG13OiBleHBlcmltZW50YWw6IGNoYW5nZWQgMDYvMjkvMjAwNCB0byBzZW5kICJzdHJ1Y3R1dXJlCi0JCQkvLyBjaGFuZ2VkIiBldmVuIGZvciBhdHRyaWJ1dGUgdmFsdWUgY2hhbmdlcwotCQkJLy8gdGhlcmUgYXJlIHByb3MgYW5kIGNvbnMgdG8gY29uc2lkZXJpbmcgYXR0cmlidXRlIHZhbHVlCi0JCQkvLyAic3RydWN0dXJlIGNoYW5nZWQiLiBXaWxsIChyZSljb25zaWRlcgotCQkJLy8gc2V0Q29tbW9uUm9vdElmTmVlZGVkKG5vdGlmaWVyKTsKLQkJCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCVN0cmluZyB2YWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgYXR0ciwgbnVsbCwgdmFsdWUsIG9mZnNldCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3RlOiB3ZSBkbyBub3Qgc2VuZCBzdHJ1Y3R1cmVkIGNoYW5nZWQgZXZlbnQgZm9yIGNvbnRlbnQKLQkJCS8vIGNoYW5nZWQKLQkJCW5vdGlmaWVyID0gKElET01Ob2RlKSBub2RlOwotCQkJU3RyaW5nIHZhbHVlID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgbnVsbCwgbnVsbCwgdmFsdWUsIG9mZnNldCk7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJSURPTU5vZGUgcGFyZW50ID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJbm90aWZ5KHBhcmVudCwgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQsIG5vZGUsIG51bGwsIHZhbHVlLCBvZmZzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwcm9wZXJ0eUNoYW5nZWQobm90aWZpZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY4OTNiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGwuQ29tbWVudEVsZW1lbnRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIFhNTE1vZGVsUGFyc2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNb2RlbFBhcnNlciB7Ci0JcHJpdmF0ZSBYTUxNb2RlbENvbnRleHQgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBET01Nb2RlbEltcGwgbW9kZWwgPSBudWxsOwotCXByaXZhdGUgVGV4dEltcGwgbGFzdFRleHROb2RlID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBYTUxNb2RlbFBhcnNlcihET01Nb2RlbEltcGwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuQmVJbXBsaWNpdFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJTW9kZWxQYXJzZXJBZGFwdGVyIGFkYXB0ZXIgPSBnZXRQYXJzZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLmNhbkJlSW1wbGljaXRUYWcoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkJlSW1wbGljaXRUYWcoRWxlbWVudCBlbGVtZW50LCBOb2RlIGNoaWxkKSB7Ci0JCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5jYW5CZUltcGxpY2l0VGFnKGVsZW1lbnQsIGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuQ29udGFpbihFbGVtZW50IGVsZW1lbnQsIE5vZGUgY2hpbGQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlFbGVtZW50SW1wbCBpbXBsID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCQlpZiAoaW1wbC5pc0VuZFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBpbnZhbGlkIChmbG9hdGluZykgZW5kIHRhZwotCQlpZiAoIWltcGwuaXNDb250YWluZXIoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpIHsKLQkJCWlmIChpbXBsLmlzSlNQQ29udGFpbmVyKCkgfHwgaW1wbC5pc0NEQVRBQ29udGFpbmVyKCkpIHsKLQkJCQkvLyBhY2NlcHRzIG9ubHkgVGV4dCBjaGlsZAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuY2FuQ29udGFpbihlbGVtZW50LCBjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZUF0dHJFcXVhbChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotCQkJCS8vIGp1c3Qgbm90aWZ5IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBzZXR0aW5nIGRhdGEKLQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwpIG5vZGU7Ci0JCQkJcGkubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gYWN0dWFsbHksIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VBdHRyTmFtZSBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlQXR0ck5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbm9kZSA9IHJvb3QuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHsKLQkJCQkvLyBqdXN0IG5vdGlmeSB0aGUgY2hhbmdlIGluc3RlYWQgb2Ygc2V0dGluZyBkYXRhCi0JCQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKSBub2RlOwotCQkJCXBpLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoYXR0ci5nZXROYW1lUmVnaW9uKCkgIT0gcmVnaW9uKQotCQkJCWNvbnRpbnVlOwotCi0JCQlTdHJpbmcgbmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCWF0dHIuc2V0TmFtZShuYW1lKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlQXR0clZhbHVlIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyVmFsdWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbm9kZSA9IHJvb3QuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHsKLQkJCQkvLyBqdXN0IG5vdGlmeSB0aGUgY2hhbmdlIGluc3RlYWQgb2Ygc2V0dGluZyBkYXRhCi0JCQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKSBub2RlOwotCQkJCXBpLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoYXR0ci5nZXRWYWx1ZVJlZ2lvbigpICE9IHJlZ2lvbikKLQkJCQljb250aW51ZTsKLQkJCS8vIGp1c3Qgbm90aWZ5IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBzZXR0aW5nIHZhbHVlCi0JCQlhdHRyLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VEYXRhIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VEYXRhKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47Ci0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSBub2RlOwotCQkJCWlmICh0ZXh0LmlzU2hhcmluZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSkpIHsKLQkJCQkJLy8gaGFzIGNvbnNlY3V0aXZlIHRleHQgc2hhcmluZyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5vZGUpOwotCQkJCWNsZWFudXBUZXh0KCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCWJyZWFrOwotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQkvLyBjb21tZW50IHRhZwotCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJcmV0dXJuOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8ganVzdCBub3RpZnkgdGhlIGNoYW5nZSBpbnN0ZWFkIG9mIHNldHRpbmcgZGF0YQotCQlOb2RlSW1wbCBpbXBsID0gKE5vZGVJbXBsKSBub2RlOwotCQlpbXBsLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VFbmRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMsIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zKSB7Ci0JCWludCBvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGUgbm9kZSA9IHJvb3QuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIGNoYW5nZSBpcyBvbmx5IGZvciBjbG9zZSB0YWcKLQkJaWYgKG5ld1JlZ2lvbnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZSA9IG5ld1JlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQkvLyBvdGhlciByZWdpb24gaGFzIGNoYW5nZWQKLQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAob2xkUmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gb2xkUmVnaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKQotCQkJCQljb250aW51ZTsKLQotCQkJCS8vIG90aGVyIHJlZ2lvbiBoYXMgY2hhbmdlZAotCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hhbmdlIGZvciBjbG9zZSB0YWcgaGFzIG5vIGltcGFjdAotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogY2hhbmdlUmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXZvaWQgY2hhbmdlUmVnaW9uKFJlZ2lvbkNoYW5nZWRFdmVudCBjaGFuZ2UsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCB8fCByZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0aGlzLmNvbnRleHQgPSBuZXcgWE1MTW9kZWxDb250ZXh0KHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JCQotCQkvL2RldGVybWluZSBpZiBjaGFuZ2Ugd2FzIHdoaXRlc3BhY2Ugb25seSBjaGFuZ2UKLQkJYm9vbGVhbiBpc1doaXRlc3BhY2VDaGFuZ2UgPSBmYWxzZTsKLQkJaWYoY2hhbmdlLmdldFRleHQoKSAhPSBudWxsICYmIGNoYW5nZS5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpc1doaXRlc3BhY2VDaGFuZ2UgPSBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYW5nZS5nZXRUZXh0KCkuY2hhckF0KDApKTsKLQkJfSBlbHNlIGlmKGNoYW5nZS5nZXREZWxldGVkVGV4dCgpICE9IG51bGwgJiYgY2hhbmdlLmdldERlbGV0ZWRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpc1doaXRlc3BhY2VDaGFuZ2UgPSBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYW5nZS5nZXREZWxldGVkVGV4dCgpLmNoYXJBdCgwKSk7Ci0JCX0KLQotCQkvLyBvcHRpbWl6ZSB0eXBpY2FsIGNhc2VzCi0JCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgfHwgaXNOZXN0ZWRDb250ZW50KHJlZ2lvblR5cGUpKSB7Ci0JCQljaGFuZ2VEYXRhKGZsYXROb2RlLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQlpZiAoaXNXaGl0ZXNwYWNlQ2hhbmdlICYmIChjaGFuZ2UuZ2V0T2Zmc2V0KCkgPj0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRUZXh0RW5kKCkpKSB7Ci0JCQkJLy8gY2hhbmdlIGlzIGVudGlyZWx5IGluIHdoaXRlLXNwYWNlCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2hhbmdlQXR0ck5hbWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlpZiAoaXNXaGl0ZXNwYWNlQ2hhbmdlICYmIChjaGFuZ2UuZ2V0T2Zmc2V0KCkgPj0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRUZXh0RW5kKCkpKSB7Ci0JCQkJLy8gY2hhbmdlIGlzIGVudGlyZWx5IGluIHdoaXRlLXNwYWNlCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2hhbmdlQXR0clZhbHVlKGZsYXROb2RlLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCWlmIChpc1doaXRlc3BhY2VDaGFuZ2UgJiYgKGNoYW5nZS5nZXRPZmZzZXQoKSA+PSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFRleHRFbmQoKSkpIHsKLQkJCQkvLyBjaGFuZ2UgaXMgZW50aXJlbHkgaW4gd2hpdGUtc3BhY2UKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljaGFuZ2VBdHRyRXF1YWwoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFRhZ05hbWUocmVnaW9uVHlwZSkpIHsKLQkJCWlmIChpc1doaXRlc3BhY2VDaGFuZ2UgJiYgKGNoYW5nZS5nZXRPZmZzZXQoKSA+PSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFRleHRFbmQoKSkpIHsKLQkJCQkvLyBjaGFuZ2UgaXMgZW50aXJlbHkgaW4gd2hpdGUtc3BhY2UKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljaGFuZ2VUYWdOYW1lKGZsYXROb2RlLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJfQotCX0KLQotCi0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlU3RhcnRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMsIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zKSB7Ci0JCWludCBvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGUgbm9kZSA9IHJvb3QuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCi0JCS8vIGNoZWNrIGlmIGNoYW5nZXMgYXJlIG9ubHkgZm9yIGF0dHJpYnV0ZXMgYW5kIGNsb3NlIHRhZwotCQlib29sZWFuIHRhZ05hbWVVbmNoYW5nZWQgPSBmYWxzZTsKLQkJaWYgKG5ld1JlZ2lvbnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZSA9IG5ld1JlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQkJCS8vIGNoYW5nZSBmcm9tIGVtcHR5IHRhZyBtYXkgaGF2ZSBpbXBhY3Qgb24gc3RydWN0dXJlCi0JCQkJCWlmICghZWxlbWVudC5pc0VtcHR5VGFnKCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFRhZ05hbWUocmVnaW9uVHlwZSkpIHsKLQkJCQkJU3RyaW5nIG9sZFRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQkJU3RyaW5nIG5ld1RhZ05hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJCWlmIChvbGRUYWdOYW1lICE9IG51bGwgJiYgbmV3VGFnTmFtZSAhPSBudWxsICYmIG9sZFRhZ05hbWUuZXF1YWxzKG5ld1RhZ05hbWUpKSB7Ci0JCQkJCQkvLyB0aGUgdGFnIG5hbWUgaXMgdW5jaGFuZ2VkCi0JCQkJCQl0YWdOYW1lVW5jaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gb3RoZXIgcmVnaW9uIGhhcyBjaGFuZ2VkCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJaWYgKG9sZFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZSA9IG9sZFJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQkJCS8vIGNoYW5nZSBmcm9tIGVtcHR5IHRhZyBtYXkgaGF2ZSBpbXBhY3Qgb24gc3RydWN0dXJlCi0JCQkJCWlmICghZWxlbWVudC5pc0VtcHR5VGFnKCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFRhZ05hbWUocmVnaW9uVHlwZSkpIHsKLQkJCQkJLy8gaWYgbmV3IHRhZyBuYW1lIGlzIHVuY2hhbmdlZCwgaXQncyBPSwotCQkJCQlpZiAodGFnTmFtZVVuY2hhbmdlZCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCS8vIG90aGVyIHJlZ2lvbiBoYXMgY2hhbmdlZAotCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gdXBkYXRlIGF0dHJpYnV0ZXMKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJLy8gZmlyc3QgcmVtb3ZlIGF0dHJpYnV0ZXMKLQkJaW50IHJlZ2lvbkluZGV4ID0gMDsKLQkJaW50IGF0dHJJbmRleCA9IDA7Ci0JCUF0dHJJbXBsIGF0dHIgPSBudWxsOwotCQl3aGlsZSAoYXR0ckluZGV4IDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKSkgewotCQkJYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGF0dHJJbmRleCk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKSB7IC8vIGVycm9yCi0JCQkJYXR0ckluZGV4Kys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gYXR0ci5nZXROYW1lUmVnaW9uKCk7Ci0JCQlpZiAobmFtZVJlZ2lvbiA9PSBudWxsKSB7IC8vIGVycm9yCi0JCQkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IHJlZ2lvbkluZGV4OyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCWlmIChyZWdpb24gPT0gbmFtZVJlZ2lvbikgewotCQkJCQlyZWdpb25JbmRleCA9IGkgKyAxOyAvLyBuZXh0IHJlZ2lvbgotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmb3VuZCkgewotCQkJCWF0dHJJbmRleCsrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJfQotCQl9Ci0KLQkJLy8gaW5zZXJ0IG9yIHVwZGF0ZSBhdHRyaWJ1dGVzCi0JCWF0dHJJbmRleCA9IDA7IC8vIHJlc2V0IHRvIGZpcnN0Ci0JCUF0dHJJbXBsIG5ld0F0dHIgPSBudWxsOwotCQlJVGV4dFJlZ2lvbiBvbGRWYWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWlmIChuZXdBdHRyICE9IG51bGwpIHsKLQkJCQkJLy8gaW5zZXJ0IGRlZmVycmVkIG5ldyBhdHRyaWJ1dGUKLQkJCQkJZWxlbWVudC5pbnNlcnRBdHRyaWJ1dGVOb2RlKG5ld0F0dHIsIGF0dHJJbmRleCsrKTsKLQkJCQkJbmV3QXR0ciA9IG51bGw7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGF0dHIgIT0gbnVsbCAmJiBvbGRWYWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCS8vIG5vdGlmeSBleGlzdGluZyBhdHRyaWJ1dGUgdmFsdWUgcmVtb3ZhbAotCQkJCQlhdHRyLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJCX0KLQotCQkJCW9sZFZhbHVlUmVnaW9uID0gbnVsbDsKLQkJCQlhdHRyID0gKEF0dHJJbXBsKSBhdHRyaWJ1dGVzLml0ZW0oYXR0ckluZGV4KTsKLQkJCQlpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIuZ2V0TmFtZVJlZ2lvbigpID09IHJlZ2lvbikgewotCQkJCQkvLyBleGlzdGluZyBhdHRyaWJ1dGUKLQkJCQkJYXR0ckluZGV4Kys7Ci0JCQkJCS8vIGNsZWFyIG90aGVyIHJlZ2lvbnMKLQkJCQkJb2xkVmFsdWVSZWdpb24gPSBhdHRyLmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24obnVsbCk7Ci0JCQkJCWF0dHIuc2V0VmFsdWVSZWdpb24obnVsbCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlTdHJpbmcgbmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCQkJYXR0ciA9IChBdHRySW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUF0dHJpYnV0ZShuYW1lKTsKLQkJCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQkJCWF0dHIuc2V0TmFtZVJlZ2lvbihyZWdpb24pOwotCQkJCQkvLyBkZWZlciBpbnNlcnRpb24gb2YgbmV3IGF0dHJpYnV0ZQotCQkJCQluZXdBdHRyID0gYXR0cjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldEVxdWFsUmVnaW9uKHJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldFZhbHVlUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWlmIChhdHRyICE9IG5ld0F0dHIgJiYgb2xkVmFsdWVSZWdpb24gIT0gcmVnaW9uKSB7Ci0JCQkJCQkvLyBub3RpZnkgZXhpc3RpbmcgYXR0cmlidXRlIHZhbHVlIGNoYW5nZWQKLQkJCQkJCWF0dHIubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQkJCX0KLQkJCQkJb2xkVmFsdWVSZWdpb24gPSBudWxsOwotCQkJCQlhdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmV3QXR0ciAhPSBudWxsKSB7Ci0JCQkvLyBpbnNlcnQgZGVmZXJyZWQgbmV3IGF0dHJpYnV0ZQotCQkJZWxlbWVudC5hcHBlbmRBdHRyaWJ1dGVOb2RlKG5ld0F0dHIpOwotCQl9Ci0JCWVsc2UgaWYgKGF0dHIgIT0gbnVsbCAmJiBvbGRWYWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBub3RpZnkgZXhpc3RpbmcgYXR0cmlidXRlIHZhbHVlIHJlbW92YWwKLQkJCWF0dHIubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJc2V0dXBDb250ZXh0KGZsYXROb2RlKTsKLQotCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkvLyBtYWtlIHN1cmUgdGhlIHBhcmVudCBpcyBzZXQgdG8gZGVlcGVzdCBsZXZlbAotCQkvLyB3aGVuIGVuZCB0YWcgaGFzIGJlZW4gcmVtb3ZlZAotCQl0aGlzLmNvbnRleHQuc2V0TGFzdCgpOwotCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCi0JCWNsZWFudXBUZXh0KCk7Ci0JCWNsZWFudXBFbmRUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlVGFnTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJU3RyaW5nIG5ld1RhZ05hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCWlmIChuZXdUYWdOYW1lID09IG51bGwgfHwgIWVsZW1lbnQubWF0Y2hUYWdOYW1lKG5ld1RhZ05hbWUpKSB7Ci0JCQkvLyB0aGUgdGFnIG5hbWUgaXMgY2hhbmdlZAotCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHRoZSB0YWcgbmFtZSBpcyB1bmNoYW5nZWQKLQkJLy8gdGhpcyBoYXBwZW5zIHdoZW4gdHlwaW5nIHNwYWNlcyBhZnRlciB0aGUgdGFnIG5hbWUKLQkJLy8gZG8gbm90aGluZywgYnV0Li4uCi0JCS8vIGlmIGl0J3Mgbm90IGEgY2hhbmdlIGluIHRoZSBlbmQgdGFnIG9mIGFuIGVsZW1lbnQgd2l0aCB0aGUgc3RhcnQKLQkJLy8gdGFnLAotCQkvLyBhbmQgY2FzZSBoYXMgYmVlbiBjaGFuZ2VkLCBzZXQgdG8gZWxlbWVudCBhbmQgbm90aWZ5Ci0JCWlmICghZWxlbWVudC5oYXNTdGFydFRhZygpIHx8IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0Rmlyc3RSZWdpb25UeXBlKGZsYXROb2RlKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQlpZiAodGFnTmFtZSA9PSBudWxsIHx8ICF0YWdOYW1lLmVxdWFscyhuZXdUYWdOYW1lKSkgewotCQkJCWVsZW1lbnQuc2V0VGFnTmFtZShuZXdUYWdOYW1lKTsKLQkJCQllbGVtZW50Lm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xlYW51cENvbnRleHQgbWV0aG9kCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBFbmRUYWcoKSB7Ci0JCU5vZGUgcGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJTm9kZSBuZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJd2hpbGUgKG5leHQgIT0gbnVsbCkgewotCQkJCWlmIChuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCQkJaWYgKGVsZW1lbnQuaXNFbmRUYWcoKSkgewotCQkJCQkJLy8gZmxvYXRpbmcgZW5kIHRhZwotCQkJCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQkJCVN0cmluZyByb290TmFtZSA9IGdldEZpbmRSb290TmFtZSh0YWdOYW1lKTsKLQkJCQkJCUVsZW1lbnRJbXBsIHN0YXJ0ID0gKEVsZW1lbnRJbXBsKSB0aGlzLmNvbnRleHQuZmluZFN0YXJ0VGFnKHRhZ05hbWUsIHJvb3ROYW1lKTsKLQkJCQkJCWlmIChzdGFydCAhPSBudWxsKSB7Ci0JCQkJCQkJaW5zZXJ0RW5kVGFnKHN0YXJ0KTsKLQkJCQkJCQkvLyBtb3ZlIHRoZSBlbmQgdGFnIGZyb20gJ2VsZW1lbnQnIHRvICdzdGFydCcKLQkJCQkJCQlzdGFydC5hZGRFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCQkJcmVtb3ZlTm9kZShlbGVtZW50KTsKLQkJCQkJCQlwYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJCW5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCU5vZGUgZmlyc3QgPSBuZXh0LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAoZmlyc3QgIT0gbnVsbCkgewotCQkJCQlwYXJlbnQgPSBuZXh0OwotCQkJCQluZXh0ID0gZmlyc3Q7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQlpZiAoIWVsZW1lbnQuaGFzRW5kVGFnKCkgJiYgZWxlbWVudC5oYXNTdGFydFRhZygpICYmIGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQkJCUVsZW1lbnRJbXBsIGVuZCA9IChFbGVtZW50SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRFbmRUYWcodGFnTmFtZSk7Ci0JCQkJCWlmIChlbmQgIT0gbnVsbCkgewotCQkJCQkJLy8gbW92ZSB0aGUgZW5kIHRhZyBmcm9tICdlbmQnIHRvICdlbGVtZW50JwotCQkJCQkJZWxlbWVudC5hZGRFbmRUYWcoZW5kKTsKLQkJCQkJCXJlbW92ZUVuZFRhZyhlbmQpOwotCQkJCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocGFyZW50KTsgLy8gcmVzZXQgY29udGV4dAotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCW5leHQgPSBwYXJlbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocGFyZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhbnVwVGV4dCgpIHsKLQkJaWYgKGxhc3RUZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCQlsYXN0VGV4dE5vZGUubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQlsYXN0VGV4dE5vZGUgPSBudWxsOwotCQl9Ci0JCU5vZGUgcGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJTm9kZSBwcmV2ID0gKG5leHQgPT0gbnVsbCA/IHBhcmVudC5nZXRMYXN0Q2hpbGQoKSA6IG5leHQuZ2V0UHJldmlvdXNTaWJsaW5nKCkpOwotCi0JCVRleHRJbXBsIG5leHRUZXh0ID0gbnVsbDsKLQkJVGV4dEltcGwgcHJldlRleHQgPSBudWxsOwotCQlpZiAobmV4dCAhPSBudWxsICYmIG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJbmV4dFRleHQgPSAoVGV4dEltcGwpIG5leHQ7Ci0JCX0KLQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCXByZXZUZXh0ID0gKFRleHRJbXBsKSBwcmV2OwotCQl9Ci0JCWlmIChuZXh0VGV4dCA9PSBudWxsICYmIHByZXZUZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChuZXh0VGV4dCAhPSBudWxsICYmIHByZXZUZXh0ICE9IG51bGwpIHsKLQkJCS8vIGNvbnNlY3V0aXZlIFRleHQgbm9kZXMgY3JlYXRlZCBieSBzZXR1cENvbnRleHQoKSwKLQkJCS8vIGNvbmNhdCB0aGVtCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV4dFRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCQlwcmV2VGV4dC5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJTm9kZSBuZXdOZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5leHQpOwotCQkJbmV4dCA9IG51bGw7Ci0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCX0KLQotCQlUZXh0SW1wbCBjaGlsZFRleHQgPSAocHJldlRleHQgIT0gbnVsbCA/IHByZXZUZXh0IDogbmV4dFRleHQpOwotCQlpZiAoY2hpbGRUZXh0LmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCAmJiBjaGlsZFRleHQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCkgewotCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgcGFyZW50RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJCWlmICghcGFyZW50RWxlbWVudC5oYXNTdGFydFRhZygpICYmICFwYXJlbnRFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCWlmIChjaGlsZFRleHQuaXNXaGl0ZXNwYWNlKCkgfHwgY2hpbGRUZXh0LmlzSW52YWxpZCgpKSB7Ci0JCQkJCQkvLyBpbXBsaWNpdCBwYXJlbnQgaXMgbm90IHJlcXVpcmVkCi0JCQkJCQlOb2RlIG5ld1BhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAobmV3UGFyZW50ICE9IG51bGwpIHsKLQkJCQkJCQlOb2RlIG5ld05leHQgPSBwYXJlbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQluZXdQYXJlbnQucmVtb3ZlQ2hpbGQocGFyZW50KTsKLQkJCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGRUZXh0KTsKLQkJCQkJCQluZXdQYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkVGV4dCwgbmV3TmV4dCk7Ci0JCQkJCQkJaWYgKGNoaWxkVGV4dCA9PSBuZXh0KSB7Ci0JCQkJCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShjaGlsZFRleHQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChuZXdOZXh0ICE9IG51bGwpIHsKLQkJCQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobmV3UGFyZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gdHJ5IGFnYWluCi0JCQkJCQkJY2xlYW51cFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcm91dGluZSBjcmVhdGUgYW4gRWxlbWVudCBmcm9tIGNvbW1lbnQgZGF0YSBmb3IgY29tbWVudCBzdHlsZQotCSAqIGVsZW1lbnRzLCBzdWNoIGFzIFNTSSBhbmQgTUVUQURBVEEKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVDb21tZW50RWxlbWVudChTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZykgewotCQlTdHJpbmcgdHJpbW1lZERhdGEgPSBkYXRhLnRyaW0oKTsKLQkJQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uW10gY29uZmlncyA9IENvbW1lbnRFbGVtZW50UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKGludCBpQ29uZmlnID0gMDsgaUNvbmZpZyA8IGNvbmZpZ3MubGVuZ3RoOyBpQ29uZmlnKyspIHsKLQkJCUNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdzW2lDb25maWddOwotCQkJaWYgKChpc0pTUFRhZyAmJiAhY29uZmlnLmFjY2VwdEpTUENvbW1lbnQoKSkgfHwgKCFpc0pTUFRhZyAmJiAhY29uZmlnLmFjY2VwdFhNTENvbW1lbnQoKSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZ1tdIHByZWZpeGVzID0gY29uZmlnLmdldFByZWZpeCgpOwotCQkJZm9yIChpbnQgaVByZWZpeCA9IDA7IGlQcmVmaXggPCBwcmVmaXhlcy5sZW5ndGg7IGlQcmVmaXgrKykgewotCQkJCWlmICh0cmltbWVkRGF0YS5zdGFydHNXaXRoKHByZWZpeGVzW2lQcmVmaXhdKSkgewotCQkJCQlyZXR1cm4gY29uZmlnLmNyZWF0ZUVsZW1lbnQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLCBkYXRhLCBpc0pTUFRhZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5jcmVhdGVDb21tZW50RWxlbWVudCh0aGlzLm1vZGVsLmdldERvY3VtZW50KCksIGRhdGEsIGlzSlNQVGFnKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJvdXRpbmUgY3JlYXRlIGFuIGltcGxpY2l0IEVsZW1lbnQgZm9yIGdpdmVuIHBhcmVudCBhbmQgY2hpbGQsCi0JICogc3VjaCBhcyBIVE1MLCBCT0RZLCBIRUFELCBhbmQgVEJPRFkgZm9yIEhUTUwgZG9jdW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlSW1wbGljaXRFbGVtZW50KE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKSB7Ci0JCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5jcmVhdGVJbXBsaWNpdEVsZW1lbnQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLCBwYXJlbnQsIGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGVtb3RlTm9kZXMoTm9kZSByb290LCBOb2RlIG5ld1BhcmVudCwgTm9kZSBvbGRQYXJlbnQsIE5vZGUgbmV4dCkgewotCQlpZiAobmV3UGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm47Ci0JCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQotCQkvLyBmaW5kIG5leHQKLQkJd2hpbGUgKG5leHQgPT0gbnVsbCkgewotCQkJaWYgKG9sZFBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybjsKLQkJCUVsZW1lbnRJbXBsIG9sZEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG9sZFBhcmVudDsKLQkJCWlmIChvbGRFbGVtZW50Lmhhc0VuZFRhZygpKQotCQkJCXJldHVybjsKLQkJCW9sZFBhcmVudCA9IG9sZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKG9sZFBhcmVudCA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJCW5leHQgPSBvbGRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQotCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJCWlmIChuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBuZXh0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCQlpZiAoIW5leHRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkJTm9kZSBuZXh0Q2hpbGQgPSBuZXh0RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCWlmIChuZXh0Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJLy8gZGVtb3RlIGNoaWxkcmVuCi0JCQkJCQluZXh0ID0gbmV4dENoaWxkOwotCQkJCQkJb2xkUGFyZW50ID0gbmV4dEVsZW1lbnQ7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmIChuZXh0RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQkJaWYgKG5leHRFbGVtZW50Lm1hdGNoRW5kVGFnKG5ld0VsZW1lbnQpKSB7Ci0JCQkJCQkJLy8gc3RvcCBhdCB0aGUgbWF0Y2hlZCBpbnZhbGlkIGVuZCB0YWcKLQkJCQkJCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQobmV4dEVsZW1lbnQpOwotCQkJCQkJCW5ld0VsZW1lbnQuYWRkRW5kVGFnKG5leHRFbGVtZW50KTsKLQotCQkJCQkJCWlmIChuZXdFbGVtZW50ID09IHJvb3QpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQlOb2RlIHAgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCQkvLyBjaGVjayBpZiByZWFjaGVkIHRvIHRvcAotCQkJCQkJCWlmIChwID09IG51bGwgfHwgcCA9PSBvbGRQYXJlbnQgfHwgcC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcDsKLQkJCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHJlbW92ZSBpbXBsaWNpdCBlbGVtZW50Ci0JCQkJCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChuZXh0RWxlbWVudCk7Ci0JCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFkb25lKSB7Ci0JCQkJaWYgKCFjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCWlmIChuZXdFbGVtZW50ID09IHJvb3QpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCU5vZGUgcCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkvLyBjaGVjayBpZiByZWFjaGVkIHRvIHRvcAotCQkJCQlpZiAocCA9PSBudWxsIHx8IHAgPT0gb2xkUGFyZW50IHx8IHAuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCXJldHVybjsKLQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCWluc2VydE5vZGUobmV3RWxlbWVudCwgY2hpbGQsIG51bGwpOwotCQkJCU5vZGUgY2hpbGRQYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKGNoaWxkUGFyZW50ICE9IG5ld0VsZW1lbnQpIHsKLQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgY2hpbGRQYXJlbnQ7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBmaW5kIG5leHQgcGFyZW50IGFuZCBzaWJsaW5nCi0JCQl3aGlsZSAobmV4dCA9PSBudWxsKSB7Ci0JCQkJaWYgKG9sZFBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQlyZXR1cm47Ci0JCQkJRWxlbWVudEltcGwgb2xkRWxlbWVudCA9IChFbGVtZW50SW1wbCkgb2xkUGFyZW50OwotCi0JCQkJLy8gZHVnIHBhcmVudCBtdXN0IG5vdCBoYXZlIGNoaWxkcmVuIGF0IHRoaXMgcG9pbnQKLQkJCQlpZiAoIW9sZEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpICYmICFvbGRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkJb2xkUGFyZW50ID0gb2xkRWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJCQkJbmV4dCA9IG9sZEVsZW1lbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlmIChvbGRFbGVtZW50Lmhhc0VuZFRhZygpKQotCQkJCQlyZXR1cm47Ci0JCQkJb2xkUGFyZW50ID0gb2xkRWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKG9sZFBhcmVudCA9PSBudWxsKQotCQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQkJbmV4dCA9IG9sZEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgTW9kZWxQYXJzZXJBZGFwdGVyIGdldFBhcnNlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoTW9kZWxQYXJzZXJBZGFwdGVyKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuZ2V0QWRhcHRlckZvcihNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmRSb290TmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RmluZFJvb3ROYW1lKHRhZ05hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJRE9NTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLm1vZGVsOwotCX0KLQotCS8qKgotCSAqIGluc2VydENEQVRBU2VjdGlvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0Q0RBVEFTZWN0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ0RBVEFTZWN0aW9uSW1wbCBjZGF0YSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljZGF0YSA9IChDREFUQVNlY3Rpb25JbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlQ0RBVEFTZWN0aW9uKG51bGwpOwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJfQotCQlpZiAoY2RhdGEgPT0gbnVsbCkgeyAvLyBDREFUQSBzZWN0aW9uIG1pZ2h0IG5vdCBiZSBzdXBwb3J0ZWQKLQkJCWluc2VydEludmFsaWREZWNsKGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgZGVjbAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY2RhdGEuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZShjZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0Q29tbWVudCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0Q29tbWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZ0J1ZmZlciBkYXRhID0gbnVsbDsKLQkJYm9vbGVhbiBpc0pTUFRhZyA9IGZhbHNlOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoaXNOZXN0ZWRDb21tZW50T3BlbihyZWdpb25UeXBlKSkgewotCQkJCWlzSlNQVGFnID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUIHx8IGlzTmVzdGVkQ29tbWVudFRleHQocmVnaW9uVHlwZSkpIHsKLQkJCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQkJCWRhdGEgPSBuZXcgU3RyaW5nQnVmZmVyKGZsYXROb2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkYXRhLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbikpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNyZWF0ZUNvbW1lbnRFbGVtZW50KGRhdGEudG9TdHJpbmcoKSwgaXNKU1BUYWcpOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmICghaXNFbmRUYWcoZWxlbWVudCkpIHsKLQkJCQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJCWluc2VydFN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gZW5kIHRhZwotCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQotCQkJCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQkJU3RyaW5nIHJvb3ROYW1lID0gZ2V0RmluZFJvb3ROYW1lKHRhZ05hbWUpOwotCQkJCUVsZW1lbnRJbXBsIHN0YXJ0ID0gKEVsZW1lbnRJbXBsKSB0aGlzLmNvbnRleHQuZmluZFN0YXJ0VGFnKHRhZ05hbWUsIHJvb3ROYW1lKTsKLQkJCQlpZiAoc3RhcnQgIT0gbnVsbCkgeyAvLyBzdGFydCB0YWcgZm91bmQKLQkJCQkJaW5zZXJ0RW5kVGFnKHN0YXJ0KTsKLQkJCQkJc3RhcnQuYWRkRW5kVGFnKGVsZW1lbnQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gaW52YWxpZCBlbmQgdGFnCi0JCQkJaW5zZXJ0Tm9kZShlbGVtZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlDb21tZW50SW1wbCBjb21tZW50ID0gKENvbW1lbnRJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlQ29tbWVudChudWxsKTsKLQkJaWYgKGNvbW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzSlNQVGFnKQotCQkJY29tbWVudC5zZXRKU1BUYWcodHJ1ZSk7Ci0JCWNvbW1lbnQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZShjb21tZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnREZWNsIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnREZWNsKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJYm9vbGVhbiBpc0RvY1R5cGUgPSBmYWxzZTsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCQlTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJaXNEb2NUeXBlID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9OQU1FKSB7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQkJbmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpIHsKLQkJCQlpZiAocHVibGljSWQgPT0gbnVsbCkKLQkJCQkJcHVibGljSWQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpIHsKLQkJCQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkKLQkJCQkJc3lzdGVtSWQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCS8vIGludmFsaWQgZGVjbGFyYXRpb24KLQkJaWYgKCFpc0RvY1R5cGUpIHsKLQkJCWluc2VydEludmFsaWREZWNsKGZsYXROb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCURvY3VtZW50VHlwZUltcGwgZG9jVHlwZSA9IChEb2N1bWVudFR5cGVJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlRG9jdHlwZShuYW1lKTsKLQkJaWYgKGRvY1R5cGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHB1YmxpY0lkICE9IG51bGwpCi0JCQlkb2NUeXBlLnNldFB1YmxpY0lkKHB1YmxpY0lkKTsKLQkJaWYgKHN5c3RlbUlkICE9IG51bGwpCi0JCQlkb2NUeXBlLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLQkJZG9jVHlwZS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKGRvY1R5cGUpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEVuZFRhZyBtZXRob2QgY2FuIGJlIHVzZWQgYnkgc3ViY2xhc3NlcywgYnV0IG5vdCBvdmVycmlkZWQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRFbmRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJTm9kZSBuZXdQYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKG5ld1BhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmICghKChFbGVtZW50SW1wbCkgZWxlbWVudCkuaXNDb250YWluZXIoKSkgewotCQkJLy8ganVzdCB1cGRhdGUgY29udGV4dAotCQkJTm9kZSBlbGVtZW50TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChlbGVtZW50TmV4dCAhPSBudWxsKQotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbGVtZW50TmV4dCk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobmV3UGFyZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHByb21vdGUgY2hpbGRyZW4KLQkJTm9kZSBuZXdOZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQlOb2RlIG9sZFBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBvbGROZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCXByb21vdGVOb2RlcyhlbGVtZW50LCBuZXdQYXJlbnQsIG5ld05leHQsIG9sZFBhcmVudCwgb2xkTmV4dCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJLy8gcmUtY2hlY2sgdGhlIG5leHQgc2libGluZwotCQluZXdOZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQlpZiAobmV3TmV4dCAhPSBudWxsKQotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQllbHNlCi0JCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShuZXdQYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0RW5kVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFRhZ05hbWUocmVnaW9uVHlwZSkpIHsKLQkJCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJCQl0YWdOYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkgeyAvLyBpbnZhbGlkIGVuZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgcm9vdE5hbWUgPSBnZXRGaW5kUm9vdE5hbWUodGFnTmFtZSk7Ci0JCUVsZW1lbnRJbXBsIHN0YXJ0ID0gKEVsZW1lbnRJbXBsKSB0aGlzLmNvbnRleHQuZmluZFN0YXJ0VGFnKHRhZ05hbWUsIHJvb3ROYW1lKTsKLQkJaWYgKHN0YXJ0ICE9IG51bGwpIHsgLy8gc3RhcnQgdGFnIGZvdW5kCi0JCQlpbnNlcnRFbmRUYWcoc3RhcnQpOwotCQkJc3RhcnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGludmFsaWQgZW5kIHRhZwotCQlFbGVtZW50SW1wbCBlbmQgPSBudWxsOwotCQl0cnkgewotCQkJZW5kID0gKEVsZW1lbnRJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJaWYgKGVuZCA9PSBudWxsKSB7IC8vIGludmFsaWQgZW5kIHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCQllbmQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZShlbmQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEVudGl0eVJlZiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0RW50aXR5UmVmKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHsKLQkJCQlpZiAobmFtZSA9PSBudWxsKQotCQkJCQluYW1lID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRFbnRpdHlSZWZOYW1lKGZsYXROb2RlLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5hbWUgPT0gbnVsbCkgeyAvLyBpbnZhbGlkIGVudGl0eQotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBJU1NVRTogYXZvaWQgdGhpcyBjYXN0Ci0JCVN0cmluZyB2YWx1ZSA9ICgoRG9jdW1lbnRJbXBsKXRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0Q2hhclZhbHVlKG5hbWUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgeyAvLyBjaGFyYWN0ZXIgZW50aXR5Ci0JCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLmNvbnRleHQuZmluZFByZXZpb3VzVGV4dCgpOwotCQkJaWYgKHRleHQgIT0gbnVsbCkgeyAvLyBleGlzdGluZyB0ZXh0IGZvdW5kCi0JCQkJLy8gZG8gbm90IGFwcGVuZCBkYXRhCi0JCQkJdGV4dC5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCS8vIEFkamFjZW50IHRleHQgbm9kZXMsIHdoZXJlIGNoYW5nZXMgd2VyZSBxdWV1ZWQKLQkJCQlpZiAobGFzdFRleHROb2RlICE9IG51bGwgJiYgbGFzdFRleHROb2RlICE9IHRleHQpCi0JCQkJCWxhc3RUZXh0Tm9kZS5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCQlsYXN0VGV4dE5vZGUgPSB0ZXh0OwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gbmV3IHRleHQKLQkJCXRleHQgPSAoVGV4dEltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZShudWxsKTsKLQkJCWlmICh0ZXh0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJdGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJaW5zZXJ0Tm9kZSh0ZXh0KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGdlbmVyYWwgZW50aXR5IHJlZmVyZW5jZQotCQlFbnRpdHlSZWZlcmVuY2VJbXBsIHJlZiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWYgPSAoRW50aXR5UmVmZXJlbmNlSW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUVudGl0eVJlZmVyZW5jZShuYW1lKTsKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJaWYgKHJlZiA9PSBudWxsKSB7IC8vIGVudGl0eSByZWZlcmVuY2UgbWlnaHQgbm90IGJlIHN1cHBvcnRlZAotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCi0JCXJlZi5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKHJlZik7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0SW52YWxpZERlY2wgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydEludmFsaWREZWNsKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgiISIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgeyAvLyBpbnZhbGlkIHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCQllbGVtZW50LnNldEVtcHR5VGFnKHRydWUpOwotCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRKU1BUYWcgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydE5lc3RlZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQkJQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCUxpc3QgYXR0ck5vZGVzID0gbnVsbDsKLQkJYm9vbGVhbiBpc0Nsb3NlVGFnID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChpc05lc3RlZFRhZ09wZW4ocmVnaW9uVHlwZSkgfHwgaXNOZXN0ZWRUYWdOYW1lKHJlZ2lvblR5cGUpKSB7Ci0JCQkJdGFnTmFtZSA9IGNvbXB1dGVOZXN0ZWRUYWcocmVnaW9uVHlwZSwgdGFnTmFtZSwgZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChpc05lc3RlZFRhZ0Nsb3NlKHJlZ2lvblR5cGUpKSB7Ci0JCQkJaXNDbG9zZVRhZyA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCWF0dHIgPSAoQXR0ckltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldE5hbWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCQkJYXR0ck5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlhdHRyTm9kZXMuYWRkKGF0dHIpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24ocmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0VmFsdWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJYXR0ciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkgewotCQkJaWYgKGlzQ2xvc2VUYWcpIHsKLQkJCQkvLyBjbG9zZSBKU1AgdGFnCi0JCQkJTm9kZSBwYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBzdGFydCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJCQlpZiAoc3RhcnQuaXNKU1BDb250YWluZXIoKSkgewotCQkJCQkJaW5zZXJ0RW5kVGFnKHN0YXJ0KTsKLQkJCQkJCXN0YXJ0LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpbnZhbGlkIEpTUCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJfQotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7IC8vIGludmFsaWQgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChhdHRyTm9kZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyTm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQllbGVtZW50LmFwcGVuZEF0dHJpYnV0ZU5vZGUoKEF0dHIpIGF0dHJOb2Rlcy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JCWVsZW1lbnQuc2V0SlNQVGFnKHRydWUpOwotCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0U3RhcnRUYWcoZWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdDbG9zZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnT3BlbihTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZU5lc3RlZFRhZyhTdHJpbmcgcmVnaW9uVHlwZSwgU3RyaW5nIHRhZ05hbWUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIHRhZ05hbWU7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0Tm9kZShOb2RlIG5vZGUpIHsKLQkJaWYobm9kZSAhPSBudWxsICYmIHRoaXMuY29udGV4dCAhPSBudWxsKSB7Ci0JCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZihwYXJlbnQgIT0gbnVsbCkgewotCQkJCU5vZGUgbmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJCS8vIFJlc2V0IHBhcmVudHMgd2hpY2ggYXJlIGNsb3NlZCBjb250YWluZXIgZWxlbWVudHM7IHNob3VsZCBub3QgYmUgcGFyZW50cwotCQkJCWlmKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCVN0cmluZyB0eXBlID0gKChFbGVtZW50SW1wbClwYXJlbnQpLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKTsKLQkJCQkJaWYoKChFbGVtZW50SW1wbClwYXJlbnQpLmlzQ29udGFpbmVyKCkgJiYgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkJCW5leHQgPSBwYXJlbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQl3aGlsZSAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgIWFkYXB0ZXIuY2FuQ29udGFpbiggKEVsZW1lbnQpIHBhcmVudCwgbm9kZSkgJiYgYWRhcHRlci5pc0VuZFRhZ09taXNzaWJsZSgoRWxlbWVudCkgcGFyZW50KSkgewotCQkJCQkJCQluZXh0ID0gcGFyZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkKLQkJCQlpbnNlcnROb2RlKHBhcmVudCwgbm9kZSwgbmV4dCk7Ci0JCQkJbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShub2RlLmdldFBhcmVudE5vZGUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydE5vZGUoTm9kZSBwYXJlbnQsIE5vZGUgbm9kZSwgTm9kZSBuZXh0KSB7Ci0JCXdoaWxlIChuZXh0ICE9IG51bGwgJiYgbmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBuZXh0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCWlmIChuZXh0RWxlbWVudC5oYXNTdGFydFRhZygpKQotCQkJCWJyZWFrOwotCQkJaWYgKCFjYW5CZUltcGxpY2l0VGFnKG5leHRFbGVtZW50LCBub2RlKSkKLQkJCQlicmVhazsKLQkJCXBhcmVudCA9IG5leHRFbGVtZW50OwotCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCQlFbGVtZW50IGltcGxpY2l0RWxlbWVudCA9IGNyZWF0ZUltcGxpY2l0RWxlbWVudChwYXJlbnQsIG5vZGUpOwotCQlpZiAoaW1wbGljaXRFbGVtZW50ICE9IG51bGwpCi0JCQlub2RlID0gaW1wbGljaXRFbGVtZW50OwotCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydFBJIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRQSShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0YXJnZXQgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQkJdGFyZ2V0ID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQl9Ci0KLQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgbnVsbCk7Ci0JCWlmIChwaSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlwaS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKHBpKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRTdGFydFRhZyBtZXRob2QgY2FuIGJlIHVzZWQgYnkgc3ViY2xhc3NlcywgYnV0IG5vdCBvdmVycmlkZGVuLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0U3RhcnRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpbnNlcnROb2RlKGVsZW1lbnQpOwotCi0JCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCWlmIChuZXdFbGVtZW50LmlzRW1wdHlUYWcoKSB8fCAhbmV3RWxlbWVudC5pc0NvbnRhaW5lcigpKQotCQkJcmV0dXJuOwotCi0JCS8vIElnbm9yZSBjb250YWluZXIgdGFncyB0aGF0IGhhdmUgYmVlbiBjbG9zZWQKLQkJU3RyaW5nIHR5cGUgPSBuZXdFbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKTsKLQkJaWYobmV3RWxlbWVudC5pc0NvbnRhaW5lcigpICYmIHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKQotCQkJcmV0dXJuOwotCi0JCS8vIGRlbW90ZSBzaWJsaW5ncwotCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBuZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCWRlbW90ZU5vZGVzKGVsZW1lbnQsIGVsZW1lbnQsIHBhcmVudCwgbmV4dCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJTm9kZSBmaXJzdENoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChmaXJzdENoaWxkICE9IG51bGwpCi0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZmlyc3RDaGlsZCk7Ci0JCWVsc2UKLQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydFN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRTdGFydFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQkJYm9vbGVhbiBpc0VtcHR5VGFnID0gZmFsc2U7Ci0JCUF0dHJJbXBsIGF0dHIgPSBudWxsOwotCQlMaXN0IGF0dHJOb2RlcyA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkgewotCQkJCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQkJCXRhZ05hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCWlzRW1wdHlUYWcgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCQlhdHRyID0gKEF0dHJJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXROYW1lUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWlmIChhdHRyTm9kZXMgPT0gbnVsbCkKLQkJCQkJCWF0dHJOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJYXR0ck5vZGVzLmFkZChhdHRyKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldEVxdWFsUmVnaW9uKHJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldFZhbHVlUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWF0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICh0YWdOYW1lID09IG51bGwpIHsgLy8gaW52YWxpZCBzdGFydCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJCS8vIHR5cGljYWxseSBpbnZhbGlkIG5hbWUKLQkJfQotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7IC8vIGludmFsaWQgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChhdHRyTm9kZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyTm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQllbGVtZW50LmFwcGVuZEF0dHJpYnV0ZU5vZGUoKEF0dHIpIGF0dHJOb2Rlcy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JCWlmIChpc0VtcHR5VGFnKQotCQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydFN0YXJ0VGFnKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0Rmlyc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJYm9vbGVhbiBpc1RleHROb2RlID0gZmFsc2U7Ci0JCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQlpbnNlcnRTdGFydFRhZyhmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCWluc2VydEVuZFRhZyhmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4gfHwgaXNOZXN0ZWRDb21tZW50T3BlbihyZWdpb25UeXBlKSkgewotCQkJaW5zZXJ0Q29tbWVudChmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHsKLQkJCWluc2VydEVudGl0eVJlZihmbGF0Tm9kZSk7Ci0JCQlpc1RleHROb2RlID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pIHsKLQkJCWluc2VydERlY2woZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikgewotCQkJaW5zZXJ0UEkoZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTikgewotCQkJaW5zZXJ0Q0RBVEFTZWN0aW9uKGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChpc05lc3RlZFRhZyhyZWdpb25UeXBlKSkgewotCQkJaW5zZXJ0TmVzdGVkVGFnKGZsYXROb2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOwotCQkJaXNUZXh0Tm9kZSA9IHRydWU7Ci0JCX0KLQotCQkvLyBDaGFuZ2VzIHRvIHRleHQgcmVnaW9ucyBhcmUgcXVldWVkIHVwLCBhbmQgb25jZSB0aGUgdmFsdWUgaXMgZG9uZSBjaGFuZ2luZyBhIG5vdGlmaWNhdGlvbiBpcyBzZW50Ci0JCWlmICghaXNUZXh0Tm9kZSAmJiBsYXN0VGV4dE5vZGUgIT0gbnVsbCkgewotCQkJbGFzdFRleHROb2RlLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJbGFzdFRleHROb2RlID0gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50VGV4dChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50T3BlbihTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnTmFtZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29udGVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGluc2VydFRleHQgbWV0aG9kIENhbiBiZSBjYWxsZWQgZnJvbSBzdWJjbGFzc2VzLCBub3QgdG8gYmUgb3ZlcnJpZGVkIG9yCi0JICogcmUtaW1wbGVtZW50ZWQuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0VGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMuY29udGV4dC5maW5kUHJldmlvdXNUZXh0KCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsgLy8gZXhpc3RpbmcgdGV4dCBmb3VuZAotCQkJdGV4dC5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJLy8gQWRqYWNlbnQgdGV4dCBub2Rlcywgd2hlcmUgY2hhbmdlcyB3ZXJlIHF1ZXVlZAotCQkJaWYgKGxhc3RUZXh0Tm9kZSAhPSBudWxsICYmIGxhc3RUZXh0Tm9kZSAhPSB0ZXh0KQotCQkJCWxhc3RUZXh0Tm9kZS5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCWxhc3RUZXh0Tm9kZSA9IHRleHQ7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBuZXcgdGV4dAotCQl0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUobnVsbCk7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZSh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5pc0VuZFRhZyhlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudC5pc0VuZFRhZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9tb3RlTm9kZXMoTm9kZSByb290LCBOb2RlIG5ld1BhcmVudCwgTm9kZSBuZXdOZXh0LCBOb2RlIG9sZFBhcmVudCwgTm9kZSBuZXh0KSB7Ci0JCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSBudWxsOwotCQlpZiAobmV3UGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQkJfQotCi0JCU5vZGUgcm9vdFBhcmVudCA9IHJvb3QuZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZSAob2xkUGFyZW50ICE9IHJvb3RQYXJlbnQpIHsKLQkJCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJCQlib29sZWFuIGVuZFRhZyA9IGZhbHNlOwotCQkJCWlmIChuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudEltcGwgbmV4dEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5leHQ7Ci0JCQkJCWlmICghbmV4dEVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCQkJTm9kZSBuZXh0Q2hpbGQgPSBuZXh0RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCQlpZiAobmV4dENoaWxkICE9IG51bGwpIHsKLQkJCQkJCQkvLyBwcm9tb3RlIGNoaWxkcmVuCi0JCQkJCQkJbmV4dCA9IG5leHRDaGlsZDsKLQkJCQkJCQlvbGRQYXJlbnQgPSBuZXh0RWxlbWVudDsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKG5leHRFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCQkJaWYgKG5leHRFbGVtZW50Lm1hdGNoRW5kVGFnKG5ld0VsZW1lbnQpKSB7Ci0JCQkJCQkJCWVuZFRhZyA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gcmVtb3ZlIGltcGxpY2l0IGVsZW1lbnQKLQkJCQkJCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQobmV4dEVsZW1lbnQpOwotCQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCFkb25lKSB7Ci0JCQkJCWlmICghZW5kVGFnICYmIG5ld0VsZW1lbnQgIT0gbnVsbCAmJiAhY2FuQ29udGFpbihuZXdFbGVtZW50LCBuZXh0KSkgewotCQkJCQkJbmV3UGFyZW50ID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAobmV3UGFyZW50ID09IG51bGwpCi0JCQkJCQkJcmV0dXJuOyAvLyBlcnJvcgotCQkJCQkJTm9kZSBlbGVtZW50TmV4dCA9IG5ld0VsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCS8vIHByb21vdGUgc2libGluZ3MKLQkJCQkJCXByb21vdGVOb2RlcyhuZXdFbGVtZW50LCBuZXdQYXJlbnQsIGVsZW1lbnROZXh0LCBuZXdFbGVtZW50LCBuZXdOZXh0KTsKLQkJCQkJCW5ld05leHQgPSBuZXdFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQlpZiAobmV3UGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQluZXdFbGVtZW50ID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCWluc2VydE5vZGUobmV3UGFyZW50LCBjaGlsZCwgbmV3TmV4dCk7Ci0JCQkJCU5vZGUgY2hpbGRQYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChjaGlsZFBhcmVudCAhPSBuZXdQYXJlbnQpIHsKLQkJCQkJCW5ld1BhcmVudCA9IGNoaWxkUGFyZW50OwotCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJbmV3TmV4dCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChvbGRQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm47Ci0JCQlFbGVtZW50SW1wbCBvbGRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvbGRQYXJlbnQ7Ci0JCQlvbGRQYXJlbnQgPSBvbGRFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQluZXh0ID0gb2xkRWxlbWVudC5nZXROZXh0U2libGluZygpOwotCi0JCQlpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCUVsZW1lbnQgZW5kID0gbnVsbDsKLQkJCQlpZiAoIW9sZEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpICYmICFvbGRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKG9sZEVsZW1lbnQpOwotCQkJCQllbmQgPSBvbGRFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZW5kID0gb2xkRWxlbWVudC5yZW1vdmVFbmRUYWcoKTsKLQkJCQl9Ci0JCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCWluc2VydE5vZGUobmV3UGFyZW50LCBlbmQsIG5ld05leHQpOwotCQkJCQlOb2RlIGVuZFBhcmVudCA9IGVuZC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChlbmRQYXJlbnQgIT0gbmV3UGFyZW50KSB7Ci0JCQkJCQluZXdQYXJlbnQgPSBlbmRQYXJlbnQ7Ci0JCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQluZXdOZXh0ID0gZW5kLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5jb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmICghKChFbGVtZW50SW1wbCkgZWxlbWVudCkuaXNDb250YWluZXIoKSkgewotCQkJLy8ganVzdCB1cGRhdGUgY29udGV4dAotCQkJTm9kZSBlbGVtZW50TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChlbGVtZW50TmV4dCAhPSBudWxsKQotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbGVtZW50TmV4dCk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocGFyZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGRlbW90ZSBzaWJsaW5ncwotCQlOb2RlIG5leHQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCS8vIGZpbmQgbmV3IHBhcmVudAotCQlmb3IgKE5vZGUgbGFzdCA9IG5ld0VsZW1lbnQuZ2V0TGFzdENoaWxkKCk7IGxhc3QgIT0gbnVsbDsgbGFzdCA9IGxhc3QuZ2V0TGFzdENoaWxkKCkpIHsKLQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50SW1wbCBsYXN0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbGFzdDsKLQkJCWlmIChsYXN0RWxlbWVudC5oYXNFbmRUYWcoKSB8fCBsYXN0RWxlbWVudC5pc0VtcHR5VGFnKCkgfHwgIWxhc3RFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQkJYnJlYWs7Ci0JCQluZXdFbGVtZW50ID0gbGFzdEVsZW1lbnQ7Ci0JCX0KLQkJTm9kZSBsYXN0Q2hpbGQgPSBuZXdFbGVtZW50LmdldExhc3RDaGlsZCgpOwotCQlkZW1vdGVOb2RlcyhlbGVtZW50LCBuZXdFbGVtZW50LCBwYXJlbnQsIG5leHQpOwotCi0JCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCU5vZGUgbmV3TmV4dCA9IG51bGw7Ci0JCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCkKLQkJCW5ld05leHQgPSBsYXN0Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJZWxzZQotCQkJbmV3TmV4dCA9IG5ld0VsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAobmV3TmV4dCAhPSBudWxsKQotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQllbHNlCi0JCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShuZXdFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBub2RlIGlmIGl0IGlzIG5vIGxvbmdlciByZXF1aXJlZCBpbXBsaWNpdCB0YWcgd2l0aAotCSAqIHJlbWFpbmluZyBjaGlsZCBub2RlcyBwcm9tb3RlZC4KLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgcmVtb3ZlSW1wbGljaXRFbGVtZW50KE5vZGUgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlpZiAoIWVsZW1lbnQuaXNJbXBsaWNpdFRhZygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChjYW5CZUltcGxpY2l0VGFnKGVsZW1lbnQpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBlbGVtZW50UGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChlbGVtZW50UGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJTm9kZSBmaXJzdENoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCU5vZGUgY2hpbGQgPSBmaXJzdENoaWxkOwotCQlOb2RlIGVsZW1lbnROZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJTm9kZSBuZXh0Q2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJZWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQllbGVtZW50UGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgZWxlbWVudE5leHQpOwotCQkJY2hpbGQgPSBuZXh0Q2hpbGQ7Ci0JCX0KLQotCQkvLyByZXNldCBjb250ZXh0Ci0JCWlmICh0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpID09IGVsZW1lbnQpIHsKLQkJCU5vZGUgb2xkTmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShvbGROZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChlbGVtZW50TmV4dCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbGVtZW50TmV4dCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShlbGVtZW50UGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5jb250ZXh0LmdldE5leHROb2RlKCkgPT0gZWxlbWVudCkgewotCQkJaWYgKGZpcnN0Q2hpbGQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShmaXJzdENoaWxkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChlbGVtZW50TmV4dCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbGVtZW50TmV4dCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShlbGVtZW50UGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZW1vdmVOb2RlKGVsZW1lbnQpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJTm9kZSBwcmV2ID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQotCQkvLyB1cGRhdGUgY29udGV4dAotCQlOb2RlIG9sZFBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChub2RlID09IG9sZFBhcmVudCkgewotCQkJaWYgKG5leHQgIT0gbnVsbCkKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocGFyZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCU5vZGUgb2xkTmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5vZGUgPT0gb2xkTmV4dCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCX0KLQkJfQotCi0JCXBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKLQotCQlpZiAocmVtb3ZlSW1wbGljaXRFbGVtZW50KHBhcmVudCkgIT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBkZW1vdGUgc2libGluZwotCQlpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcHJldjsKLQkJCWlmICghbmV3RWxlbWVudC5oYXNFbmRUYWcoKSAmJiAhbmV3RWxlbWVudC5pc0VtcHR5VGFnKCkgJiYgbmV3RWxlbWVudC5pc0NvbnRhaW5lcigpKSB7Ci0JCQkJLy8gZmluZCBuZXcgcGFyZW50Ci0JCQkJZm9yIChOb2RlIGxhc3QgPSBuZXdFbGVtZW50LmdldExhc3RDaGlsZCgpOyBsYXN0ICE9IG51bGw7IGxhc3QgPSBsYXN0LmdldExhc3RDaGlsZCgpKSB7Ci0JCQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQlicmVhazsKLQkJCQkJRWxlbWVudEltcGwgbGFzdEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGxhc3Q7Ci0JCQkJCWlmIChsYXN0RWxlbWVudC5oYXNFbmRUYWcoKSB8fCBsYXN0RWxlbWVudC5pc0VtcHR5VGFnKCkgfHwgIWxhc3RFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQkJCQlicmVhazsKLQkJCQkJbmV3RWxlbWVudCA9IGxhc3RFbGVtZW50OwotCQkJCX0KLQkJCQlOb2RlIGxhc3RDaGlsZCA9IG5ld0VsZW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCQkJZGVtb3RlTm9kZXMocHJldiwgbmV3RWxlbWVudCwgcGFyZW50LCBuZXh0KTsKLQotCQkJCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCQkJTm9kZSBuZXdOZXh0ID0gbnVsbDsKLQkJCQlpZiAobGFzdENoaWxkICE9IG51bGwpCi0JCQkJCW5ld05leHQgPSBsYXN0Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQllbHNlCi0JCQkJCW5ld05leHQgPSBuZXdFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAobmV3TmV4dCAhPSBudWxsKQotCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCQkJZWxzZQotCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShuZXdFbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZVN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVN0YXJ0VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5jb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZm9yIGltcGxpY2l0IHRhZwotCQlFbGVtZW50SW1wbCBvbGRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCQlpZiAoY2FuQmVJbXBsaWNpdFRhZyhvbGRFbGVtZW50KSkgewotCQkJTm9kZSBuZXdQYXJlbnQgPSBudWxsOwotCQkJTm9kZSBwcmV2ID0gb2xkRWxlbWVudC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgcHJldkVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHByZXY7Ci0JCQkJaWYgKCFwcmV2RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQlpZiAocHJldkVsZW1lbnQuaGFzU3RhcnRUYWcoKSB8fCBwcmV2RWxlbWVudC5tYXRjaFRhZ05hbWUob2xkRWxlbWVudC5nZXRUYWdOYW1lKCkpKSB7Ci0JCQkJCQluZXdQYXJlbnQgPSBwcmV2RWxlbWVudDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXdQYXJlbnQgPT0gbnVsbCkgewotCQkJCS8vIHRoaXMgZWxlbWVudCBzaG91bGQgc3RheSBhcyBpbXBsaWNpdCB0YWcKLQkJCQkvLyBqdXN0IHJlbW92ZSBhbGwgYXR0cmlidXRlcwotCQkJCW9sZEVsZW1lbnQucmVtb3ZlU3RhcnRUYWcoKTsKLQotCQkJCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCQkJTm9kZSBjaGlsZCA9IG9sZEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShjaGlsZCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG9sZEVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUob2xkRWxlbWVudCk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyBmb3IgY29tbWVudCB0YWcKLQkJaWYgKG9sZEVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlvbGRFbGVtZW50LnJlbW92ZVN0YXJ0VGFnKCk7Ci0KLQkJLy8gcHJvbW90ZSBjaGlsZHJlbgotCQlOb2RlIGVsZW1lbnRQYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJTm9kZSBwYXJlbnQgPSBlbGVtZW50UGFyZW50OwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgZmlyc3QgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJTm9kZSBmaXJzdEVsZW1lbnQgPSBudWxsOyAvLyBmb3IgdGhlIGNhc2UgZmlyc3QgaXMgcmVtb3ZlZCBhcyBlbmQKLQkJLy8gdGFnCi0JCWlmIChmaXJzdCAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIG5ldyBwYXJlbnQgZm9yIGNoaWxkcmVuCi0JCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gbnVsbDsKLQkJCWZvciAoTm9kZSBsYXN0ID0gZWxlbWVudC5nZXRQcmV2aW91c1NpYmxpbmcoKTsgbGFzdCAhPSBudWxsOyBsYXN0ID0gbGFzdC5nZXRMYXN0Q2hpbGQoKSkgewotCQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWJyZWFrOwotCQkJCUVsZW1lbnRJbXBsIGxhc3RFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJCWlmIChsYXN0RWxlbWVudC5oYXNFbmRUYWcoKSB8fCBsYXN0RWxlbWVudC5pc0VtcHR5VGFnKCkgfHwgIWxhc3RFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQkJCWJyZWFrOwotCQkJCW5ld0VsZW1lbnQgPSBsYXN0RWxlbWVudDsKLQkJCX0KLQkJCU5vZGUgbmV4dCA9IGZpcnN0OwotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFuZXdFbGVtZW50Lmhhc0VuZFRhZygpICYmIG5ld0VsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUVsZW1lbnRJbXBsIG5leHRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJCQkJaWYgKCFuZXh0RWxlbWVudC5oYXNTdGFydFRhZygpICYmIG5leHRFbGVtZW50Lmhhc0VuZFRhZygpICYmIG5leHRFbGVtZW50Lm1hdGNoRW5kVGFnKG5ld0VsZW1lbnQpKSB7Ci0JCQkJCQkJLy8gc3RvcCBhdCB0aGUgbWF0Y2hlZCBpbnZhbGlkIGVuZCB0YWcKLQkJCQkJCQlOb2RlIGVsZW1lbnRDaGlsZCA9IG5leHRFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJCQl3aGlsZSAoZWxlbWVudENoaWxkICE9IG51bGwpIHsKLQkJCQkJCQkJTm9kZSBuZXh0Q2hpbGQgPSBlbGVtZW50Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQkJbmV4dEVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudENoaWxkKTsKLQkJCQkJCQkJbmV3RWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50Q2hpbGQpOwotCQkJCQkJCQllbGVtZW50Q2hpbGQgPSBuZXh0Q2hpbGQ7Ci0JCQkJCQkJfQotCi0JCQkJCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJZWxlbWVudC5yZW1vdmVDaGlsZChuZXh0RWxlbWVudCk7Ci0JCQkJCQkJbmV3RWxlbWVudC5hZGRFbmRUYWcobmV4dEVsZW1lbnQpOwotCQkJCQkJCWlmIChuZXh0RWxlbWVudCA9PSBmaXJzdCkKLQkJCQkJCQkJZmlyc3RFbGVtZW50ID0gbmV3RWxlbWVudDsKLQotCQkJCQkJCU5vZGUgbmV3UGFyZW50ID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBwYXJlbnQpCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gbnVsbCB8fCBuZXdQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCQkJYnJlYWs7IC8vIGVycm9yCi0JCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghY2FuQ29udGFpbihuZXdFbGVtZW50LCBuZXh0KSkgewotCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gcGFyZW50KQotCQkJCQkJCWJyZWFrOwotCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJCWJyZWFrOyAvLyBlcnJvcgotCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCWVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQluZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJbmV3RWxlbWVudCA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQl9Ci0JCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQkJaWYgKG5ld0VsZW1lbnQgPT0gbnVsbCB8fCBjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCU5vZGUgY2hpbGQgPSBuZXh0OwotCQkJCQluZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQllbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgZWxlbWVudCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXBhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCi0JCQkJLy8gcHJvbW90ZSBzaWJsaW5ncwotCQkJCU5vZGUgbmV3TmV4dCA9IG5ld0VsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlOb2RlIGNoaWxkID0gZWxlbWVudDsKLQkJCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQlOb2RlIG5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCW5ld0VsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXdOZXh0KTsKLQkJCQkJY2hpbGQgPSBuZXh0Q2hpbGQ7Ci0JCQkJfQotCi0JCQkJLy8gbGVhdmUgdGhlIG9sZCBlbmQgdGFnIHdoZXJlIGl0IGlzCi0JCQkJaWYgKG5ld0VsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJRWxlbWVudCBlbmQgPSBuZXdFbGVtZW50LnJlbW92ZUVuZFRhZygpOwotCQkJCQlpZiAoZW5kICE9IG51bGwpIHsKLQkJCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoZW5kLCBuZXdOZXh0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIW5ld0VsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCQkvLyBpbXBsaWNpdCBlbGVtZW50Ci0JCQkJCWlmICghbmV3RWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChuZXdFbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQluZXdFbGVtZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlOb2RlIG5ld05leHQgPSBlbGVtZW50OwotCQlOb2RlIHN0YXJ0RWxlbWVudCA9IG51bGw7IC8vIGZvciB0aGUgY2FzZSBlbGVtZW50IGlzIHJlbW92ZWQgYXMgZW5kCi0JCS8vIHRhZwotCQlpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJLy8gZmluZCBuZXcgcGFyZW50IGZvciBpbnZhbGlkIGVuZCB0YWcgYW5kIHNpYmxpbmdzCi0JCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gbnVsbDsKLQkJCWZvciAoTm9kZSBsYXN0ID0gZWxlbWVudC5nZXRQcmV2aW91c1NpYmxpbmcoKTsgbGFzdCAhPSBudWxsOyBsYXN0ID0gbGFzdC5nZXRMYXN0Q2hpbGQoKSkgewotCQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWJyZWFrOwotCQkJCUVsZW1lbnRJbXBsIGxhc3RFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJCWlmIChsYXN0RWxlbWVudC5oYXNFbmRUYWcoKSB8fCBsYXN0RWxlbWVudC5pc0VtcHR5VGFnKCkgfHwgIWxhc3RFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQkJCWJyZWFrOwotCQkJCW5ld0VsZW1lbnQgPSBsYXN0RWxlbWVudDsKLQkJCX0KLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkvLyBkZW1vdGUgaW52YWxpZCBlbmQgdGFnIGFuZCBzaWJsaW5nCi0JCQkJTm9kZSBuZXh0ID0gZWxlbWVudDsKLQkJCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCWlmICghbmV3RWxlbWVudC5oYXNFbmRUYWcoKSAmJiBuZXdFbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgbmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlFbGVtZW50SW1wbCBuZXh0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCQkJCWlmICghbmV4dEVsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiBuZXh0RWxlbWVudC5oYXNFbmRUYWcoKSAmJiBuZXh0RWxlbWVudC5tYXRjaEVuZFRhZyhuZXdFbGVtZW50KSkgewotCQkJCQkJCS8vIHN0b3AgYXQgdGhlIG1hdGNoZWQgaW52YWxpZCBlbmQgdGFnCi0JCQkJCQkJTm9kZSBlbGVtZW50Q2hpbGQgPSBuZXh0RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCQkJd2hpbGUgKGVsZW1lbnRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJCQkJCU5vZGUgbmV4dENoaWxkID0gZWxlbWVudENoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJCW5leHRFbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnRDaGlsZCk7Ci0JCQkJCQkJCW5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudENoaWxkKTsKLQkJCQkJCQkJZWxlbWVudENoaWxkID0gbmV4dENoaWxkOwotCQkJCQkJCX0KLQotCQkJCQkJCW5leHQgPSBuZXh0RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChuZXh0RWxlbWVudCk7Ci0JCQkJCQkJbmV3RWxlbWVudC5hZGRFbmRUYWcobmV4dEVsZW1lbnQpOwotCQkJCQkJCWlmIChuZXh0RWxlbWVudCA9PSBuZXdOZXh0KQotCQkJCQkJCQlzdGFydEVsZW1lbnQgPSBuZXdFbGVtZW50OwotCi0JCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCQlpZiAobmV3UGFyZW50ID09IHBhcmVudCkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJCQlicmVhazsgLy8gZXJyb3IKLQkJCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCQlOb2RlIG5ld1BhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBwYXJlbnQpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQkJYnJlYWs7IC8vIGVycm9yCi0JCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlOb2RlIGNoaWxkID0gbmV4dDsKLQkJCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJaWYgKGNoaWxkID09IG9sZEVsZW1lbnQpIHsKLQkJCQkJCWlmICghb2xkRWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJCQkJCS8vIGNsb25lIChyZS1jcmVhdGUpIGVuZCB0YWcKLQkJCQkJCQlFbGVtZW50IGVuZCA9IG9sZEVsZW1lbnQucmVtb3ZlRW5kVGFnKCk7Ci0JCQkJCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJCWNoaWxkID0gZW5kOwotCQkJCQkJCQluZXdOZXh0ID0gZW5kOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQluZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIW9sZEVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCQkJLy8gY2xvbmUgKHJlLWNyZWF0ZSkgZW5kIHRhZwotCQkJCQlFbGVtZW50IGVuZCA9IG9sZEVsZW1lbnQucmVtb3ZlRW5kVGFnKCk7Ci0JCQkJCWlmIChlbmQgIT0gbnVsbCkgewotCQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShlbmQsIG9sZEVsZW1lbnQpOwotCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKG9sZEVsZW1lbnQpOwotCQkJCQkJbmV3TmV4dCA9IGVuZDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCW5ld05leHQgPSBvbGRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQlwYXJlbnQucmVtb3ZlQ2hpbGQob2xkRWxlbWVudCk7Ci0JCX0KLQotCQkvLyB1cGRhdGUgY29udGV4dAotCQlOb2RlIG9sZFBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCU5vZGUgb2xkTmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQlpZiAoZWxlbWVudCA9PSBvbGRQYXJlbnQpIHsKLQkJCWlmIChvbGROZXh0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUob2xkTmV4dCk7IC8vIHJlc2V0IGZvciBuZXcgcGFyZW50Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdOZXh0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgPT0gb2xkTmV4dCkgewotCQkJaWYgKGZpcnN0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUoZmlyc3RFbGVtZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZpcnN0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZmlyc3QpOwotCQkJfQotCQkJZWxzZSBpZiAoc3RhcnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShzdGFydEVsZW1lbnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQkJfQotCQl9Ci0KLQkJcmVtb3ZlSW1wbGljaXRFbGVtZW50KGVsZW1lbnRQYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCU5vZGVJbXBsIG5leHQgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5leHQuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJcmVtb3ZlTm9kZShuZXh0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCQkJLy8gdGhpcyBpcyB0aGUgY2FzZSBmb3IgZW1wdHkgVGV4dAotCQkJCQkvLyByZW1vdmUgYW5kIGNvbnRpbnVlCi0JCQkJCXJlbW92ZU5vZGUobmV4dCk7Ci0JCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5leHQ7Ci0JCQkJYm9vbGVhbiBpc1NoYXJlZCA9IHRleHQuaXNTaGFyaW5nU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJaWYgKGlzU2hhcmVkKSB7Ci0JCQkJCS8vIG1ha2Ugc3VyZSB0aGVyZSBpcyBuZXh0IFRleHQgbm9kZSBzaGFyaW5nIHRoaXMKLQkJCQkJVGV4dEltcGwgbmV4dFRleHQgPSAoVGV4dEltcGwpIHRoaXMuY29udGV4dC5maW5kTmV4dFRleHQoKTsKLQkJCQkJaWYgKG5leHRUZXh0ID09IG51bGwgfHwgIW5leHRUZXh0Lmhhc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkJCQlpc1NoYXJlZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCW9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRleHQucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWlmICh0ZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpIHsKLQkJCQkJLy8gdGhpcyBpcyB0aGUgY2FzZSBwYXJ0aWFsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMKLQkJCQkJLy8gcmVtb3ZlZAotCQkJCQlyZW1vdmVOb2RlKHRleHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm90aWZ5IHRoZSBjaGFuZ2UKLQkJCQkJdGV4dC5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCQl9Ci0JCQkJLy8gaWYgc2hhcmVkLCBjb250aW51ZSB0byByZW1vdmUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCS8vIGZyb20gdGhlbQotCQkJCWlmIChpc1NoYXJlZCkKLQkJCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJaWYgKGVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGZsYXROb2RlICE9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudC5oYXNFbmRUYWcoKSB8fCBlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJCQlyZW1vdmVTdGFydFRhZyhlbGVtZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlbW92ZU5vZGUoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTm9kZSBjaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShjaGlsZCk7Ci0JCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKCFlbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCS8vIGltcGxpY2l0IGVsZW1lbnQKLQkJCQkJcmVtb3ZlTm9kZShlbGVtZW50KTsKLQkJCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCXJlbW92ZU5vZGUoZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVuZCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlpZiAoZW5kLmhhc0VuZFRhZygpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZW5kLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoIWVuZC5oYXNTdGFydFRhZygpICYmICFlbmQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGVuZCk7Ci0JCQkJcmVtb3ZlTm9kZShlbmQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZW5kLnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCQlyZW1vdmVFbmRUYWcoZW5kKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCW5leHQgPSAoTm9kZUltcGwpIGVuZC5nZXROZXh0U2libGluZygpOwotCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXBhcmVudCA9IGVuZC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocGFyZW50KTsKLQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVwbGFjZVJlZ2lvbnMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5ld1JlZ2lvbnMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IKLQkgKiBAcGFyYW0gb2xkUmVnaW9ucwotCSAqICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvcgotCSAqLwotCXZvaWQgcmVwbGFjZVJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMsIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuY29udGV4dCA9IG5ldyBYTUxNb2RlbENvbnRleHQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpKTsKLQotCQkvLyBvcHRpbWl6ZSB0eXBpY2FsIGNhc2VzCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJY2hhbmdlU3RhcnRUYWcoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQljaGFuZ2VFbmRUYWcoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIG1ldGhvZAotCSAqIAotCSAqLwotCXZvaWQgcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykgewotCQlpZiAodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuY29udGV4dCA9IG5ldyBYTUxNb2RlbENvbnRleHQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpKTsKLQotCQlpbnQgbmV3Q291bnQgPSAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsID8gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSA6IDApOwotCQlpbnQgb2xkQ291bnQgPSAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsID8gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSA6IDApOwotCi0JCWlmIChvbGRDb3VudCA+IDApIHsKLQkJCXNldHVwQ29udGV4dChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCkpOwotCQkJLy8gTm9kZSBzdGFydFBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkQ291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oaSk7Ci0JCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UmVnaW9uKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChuZXdDb3VudCA9PSAwKQotCQkJCXJldHVybjsKLQkJCXNldHVwQ29udGV4dChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCkpOwotCQl9Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgcGFyZW50IGlzIHNldCB0byBkZWVwZXN0IGxldmVsCi0JCS8vIHdoZW4gZW5kIHRhZyBoYXMgYmVlbiByZW1vdmVkCi0JCXRoaXMuY29udGV4dC5zZXRMYXN0KCk7Ci0KLQkJaWYgKG5ld0NvdW50ID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdDb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbShpKTsKLQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJY2xlYW51cFRleHQoKTsKLQkJY2xlYW51cEVuZFRhZygpOwotCX0KLQotCS8qKgotCSAqIHNldHVwQ29udGV4dCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBDb250ZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAob2Zmc2V0ID09IDApIHsKLQkJCS8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgZG9jdW1lbnQKLQkJCU5vZGUgY2hpbGQgPSByb290LmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShjaGlsZCk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocm9vdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBtaWdodCBiZSBhdCB0aGUgZW5kIG9mIGRvY3VtZW50Ci0JCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShyb290KTsKLQkJCXRoaXMuY29udGV4dC5zZXRMYXN0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2Zmc2V0ID09IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbm9kZTsKLQkJCVRleHQgbmV4dFRleHQgPSB0ZXh0LnNwbGl0VGV4dChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkvLyBub3RpZnkgdGhlIGNoYW5nZQotCQkJdGV4dC5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCWlmIChuZXh0VGV4dCA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0VGV4dCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAob2Zmc2V0ID49ICgoTm9kZUltcGwpIGNoaWxkKS5nZXRFbmRPZmZzZXQoKSkKLQkJCQljb250aW51ZTsKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShjaGlsZCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobm9kZSk7Ci0JCXRoaXMuY29udGV4dC5zZXRMYXN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTE1vZGVsQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxVcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTJiMjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI5Njk5OSAtIEluZWZmaWNpZW50IHVzZSBvZiBuZXcgU3RyaW5nKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogWE1MTW9kZWxVcGRhdGVyIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNb2RlbFVwZGF0ZXIgewotCXByaXZhdGUgaW50IGRpZmYgPSAwOwotCXByaXZhdGUgaW50IGdhcExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBpbnQgZ2FwT2Zmc2V0ID0gMDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIElTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbnVsbDsKLQlwcml2YXRlIERPTU1vZGVsSW1wbCBtb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlSW1wbCBuZXh0Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlSW1wbCBwYXJlbnROb2RlID0gbnVsbDsKLQotCXByb3RlY3RlZCBYTUxNb2RlbFVwZGF0ZXIoRE9NTW9kZWxJbXBsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJCXRoaXMuZ2VuZXJhdG9yID0gbW9kZWwuZ2V0R2VuZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VBdHRyVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGF0dHJOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZUF0dHJOYW1lKEF0dHIgYXR0ck5vZGUpIHsKLQkJaWYgKGF0dHJOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0ck5vZGU7Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCWNoYW5nZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgZW5kID0gb2Zmc2V0OwotCi0JCVN0cmluZyBuYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQluYW1lID0gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gYXR0ci5nZXROYW1lUmVnaW9uKCk7Ci0JCWlmIChuYW1lUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCXN0YXJ0ICs9IG5hbWVSZWdpb24uZ2V0U3RhcnQoKTsKLQkJLy8gdXNlIGdldFRleHRFbmQoKSBiZWNhdXNlIGdldEVuZCgpIG1heSBpbmNsdWRlIHRoZSB0YWlsaW5nIHNwYWNlcwotCQllbmQgKz0gbmFtZVJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0KLQkJcmVwbGFjZVNvdXJjZShuYW1lLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VBdHRyVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGF0dHJOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZUF0dHJWYWx1ZShBdHRyIGF0dHJOb2RlKSB7Ci0JCWlmIChhdHRyTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIGF0dHJOb2RlOwotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQljaGFuZ2VTdGFydFRhZyhlbGVtZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvZmZzZXQgPSBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IG9mZnNldDsKLQkJaW50IGVuZCA9IG9mZnNldDsKLQotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGF0dHIuZ2V0VmFsdWVSZWdpb24oKTsKLQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCWNoYXIgcXVvdGUgPSAwOyAvLyBubyBxdW90ZSBwcmVmZXJlbmNlCi0JCQkvLyBEVzogNC8xNi8yMDAzIGR1ZSB0byBjaGFuZ2UgaW4gc3RydWN0dXJlZERvY3VtZW50IC4uLiB3ZSBuZWVkIGEKLQkJCS8vIGZsYXRub2RlIHRvCi0JCQkvLyBnZXQgYXQgcmVnaW9uIHZhbHVlcy4gRm9yIG5vdyBJJ2xsIGFzc3VtZSB0aGlzIGlzIGFsd2F5cyB0aGUKLQkJCS8vIGZpcnN0Ci0JCQkvLyBmbGF0bm9kZSAuLiBtYXkgbmVlZCB0byBtYWtlIHNtYXJ0ZXIgbGF0ZXIgKGUuZy4gdG8gc2VhcmNoIGZvcgotCQkJLy8gdGhlIGZsYXRub2RlIHRoYXQgdGhpcy52YWx1ZVJlZ2lvbiBiZWxvbmdzIHRvLgotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCVN0cmluZyBvbGRWYWx1ZSA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQodmFsdWVSZWdpb24pOwotCQkJaWYgKG9sZFZhbHVlICE9IG51bGwgJiYgb2xkVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJY2hhciBmaXJzdENoYXIgPSBvbGRWYWx1ZS5jaGFyQXQoMCk7Ci0JCQkJaWYgKGZpcnN0Q2hhciA9PSAnIicgfHwgZmlyc3RDaGFyID09ICdcJycpIHsKLQkJCQkJcXVvdGUgPSBmaXJzdENoYXI7Ci0JCQkJfQotCQkJfQotCi0JCQlJVGV4dFJlZ2lvbiBzdGFydFJlZ2lvbiA9IHZhbHVlUmVnaW9uOwotCi0JCQl2YWx1ZSA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGF0dHIsIHF1b3RlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJdmFsdWUgPSBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCQkJLy8gcmVtb3ZlIGVxdWFsIHRvbwotCQkJCUlUZXh0UmVnaW9uIGVxdWFsUmVnaW9uID0gYXR0ci5nZXRFcXVhbFJlZ2lvbigpOwotCQkJCWlmIChlcXVhbFJlZ2lvbiAhPSBudWxsKQotCQkJCQlzdGFydFJlZ2lvbiA9IGVxdWFsUmVnaW9uOwotCQkJfQotCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbih2YWx1ZVJlZ2lvbik7IC8vIHJlc2V0IHZhbHVlCi0KLQkJCXN0YXJ0ICs9IHN0YXJ0UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkvLyB1c2UgZ2V0VGV4dEVuZCgpIGJlY2F1c2UgZ2V0RW5kKCkgbWF5IGluY2x1ZGUgdGhlIHRhaWxpbmcKLQkJCS8vIHNwYWNlcwotCQkJZW5kICs9IHZhbHVlUmVnaW9uLmdldFRleHRFbmQoKTsKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIGVxdWFsUmVnaW9uID0gYXR0ci5nZXRFcXVhbFJlZ2lvbigpOwotCi0JCQl2YWx1ZSA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGF0dHIpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlpZiAoZXF1YWxSZWdpb24gPT0gbnVsbCkKLQkJCQkJcmV0dXJuOyAvLyBub3RobmcgdG8gZG8KLQkJCQl2YWx1ZSA9IE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJCQkvLyByZW1vdmUgZXF1YWwKLQkJCQlzdGFydCArPSBlcXVhbFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCWVuZCArPSBlcXVhbFJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZXF1YWxSZWdpb24gIT0gbnVsbCkgewotCQkJCQkvLyB1c2UgZ2V0VGV4dEVuZCgpIGJlY2F1c2UgZ2V0RW5kKCkgbWF5IGluY2x1ZGUgdGhlCi0JCQkJCS8vIHRhaWxpbmcgc3BhY2VzCi0JCQkJCXN0YXJ0ICs9IGVxdWFsUmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBhdHRyLmdldE5hbWVSZWdpb24oKTsKLQkJCQkJaWYgKG5hbWVSZWdpb24gPT0gbnVsbCkKLQkJCQkJCXJldHVybjsgLy8gbXVzdCBuZXZlciBoYXBwZW4KLQkJCQkJLy8gdXNlIGdldFRleHRFbmQoKSBiZWNhdXNlIGdldEVuZCgpIG1heSBpbmNsdWRlIHRoZQotCQkJCQkvLyB0YWlsaW5nIHNwYWNlcwotCQkJCQlzdGFydCArPSBuYW1lUmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCQkJdmFsdWUgPSAnPScgKyB2YWx1ZTsKLQkJCQl9Ci0JCQkJZW5kID0gc3RhcnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXBsYWNlU291cmNlKHZhbHVlLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIGNoYW5nZUVuZFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHNvdXJjZSA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQotCQlFbGVtZW50SW1wbCBpbXBsID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCQlpbnQgb2Zmc2V0ID0gaW1wbC5nZXRFbmRTdGFydE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0JCWludCBlbmQgPSBvZmZzZXQ7Ci0JCWlmIChpbXBsLmhhc0VuZFRhZygpKSB7Ci0JCQllbmQgPSBpbXBsLmdldEVuZE9mZnNldCgpOwotCQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBpbXBsLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaW1wbC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKSk7Ci0JCX0KLQotCQlyZXBsYWNlU291cmNlKHNvdXJjZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXZvaWQgY2hhbmdlTmFtZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gc3VwcG9ydCBjaGFuZ2luZyBuYW1lIG9mIGF0dHJpYnV0ZSBmb3Igc2V0UHJlZml4KCkKLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQljaGFuZ2VBdHRyTmFtZSgoQXR0cikgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybjsKLQl9Ci0KLQl2b2lkIGNoYW5nZVJlZ2lvbihSZWdpb25DaGFuZ2VkRXZlbnQgY2hhbmdlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKGNoYW5nZS5nZXRPZmZzZXQoKSA+PSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFRleHRFbmQoKSkgewotCQkJLy8gY2hhbmdlIGlzIGVudGlyZWx5IGluIHdoaXRlLXNwYWNlCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCk7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCi0JCXJlbW92ZUdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZShmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQWZ0ZXIoZmxhdE5vZGUuZ2V0RW5kKCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYSBmYWxsYmFjayBtZXRob2QgdG8gcmVnZW5lcmF0ZSB0aGUgc3RhcnQgdGFnLgotCSAqLwotCXZvaWQgY2hhbmdlU3RhcnRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0KLQkJaWYgKCFpbXBsLmhhc1N0YXJ0VGFnKCkgJiYgIWltcGwuaGFzRW5kVGFnKCkpIHsKLQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MKLQkJCU5vZGUgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlyZXBsYWNlQ2hpbGQocGFyZW50LCBlbGVtZW50LCBlbGVtZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBlbHNlIGVycm9yCi0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTdGFydFRhZyhlbGVtZW50KTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJaW50IG9mZnNldCA9IGltcGwuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgZW5kID0gb2Zmc2V0OwotCQlpZiAoaW1wbC5oYXNTdGFydFRhZygpKSB7Ci0JCQllbmQgPSBpbXBsLmdldFN0YXJ0RW5kT2Zmc2V0KCk7Ci0JCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGltcGwuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlpbXBsLnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCkpOwotCi0JCXJlcGxhY2VTb3VyY2Uoc291cmNlLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWludCBvbGRPZmZzZXQgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJaW50IG9sZEVuZCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJYm9vbGVhbiBpc0VuZFRhZyA9IGZhbHNlOwotCi0JCS8vIGZpbmQgb3duZXIgbm9kZQotCQlOb2RlSW1wbCBvd25lck5vZGUgPSBudWxsOwotCQl3aGlsZSAodGhpcy5wYXJlbnROb2RlICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSB0aGlzLm5leHROb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaW50IG5leHRPZmZzZXQgPSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCWlmIChuZXh0T2Zmc2V0ID09IG9sZE9mZnNldCkgeyAvLyBmb3VuZAotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmICh0aGlzLm5leHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMubmV4dE5vZGU7Ci0JCQkJCQlpZiAodGV4dC5oYXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlpbnQgbmV4dEVuZCA9IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0JCQkJCQlpZiAobmV4dE9mZnNldCA8IG9sZEVuZCAmJiBuZXh0RW5kID4gb2xkT2Zmc2V0KSB7Ci0JCQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCU5vZGUgY2hpbGQgPSB0aGlzLm5leHROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQl0aGlzLnBhcmVudE5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSBjaGlsZDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQl0aGlzLnBhcmVudE5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQl0aGlzLm5leHROb2RlID0gbnVsbDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5uZXh0Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAodGhpcy5wYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0aGlzLnBhcmVudE5vZGU7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQkJaXNFbmRUYWcgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaW50IGVuZE9mZnNldCA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpZiAoZW5kT2Zmc2V0ID09IG9sZE9mZnNldCkgeyAvLyBmb3VuZAotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQkJaXNFbmRUYWcgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJdGhpcy5wYXJlbnROb2RlID0gKE5vZGVJbXBsKSB0aGlzLnBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmIChvd25lck5vZGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBvd25lck5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvd25lck5vZGU7Ci0JCQlpZiAoaXNFbmRUYWcpIHsKLQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCXVwZGF0ZUF0dHJSZWdpb25zKGVsZW1lbnQsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG93bmVyTm9kZTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJaW50IG5ld09mZnNldCA9IG9sZE9mZnNldDsKLQkJCQlpbnQgbmV3RW5kID0gb2xkRW5kOwotCQkJCWlmIChvbGRPZmZzZXQgPT0gdGhpcy5nYXBPZmZzZXQpIHsKLQkJCQkJbmV3T2Zmc2V0ICs9IHRoaXMuZGlmZjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5ld0VuZCA9IHRoaXMuZ2FwT2Zmc2V0OwotCQkJCX0KLQkJCQlpbnQgbmV3TGVuZ3RoID0gbmV3RW5kIC0gbmV3T2Zmc2V0OwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG5ld09mZnNldCwgbmV3TGVuZ3RoLCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCQlpZiAob2xkRW5kID4gbmV3RW5kKSB7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQkJaW50IG9mZnNldCA9IHByb3h5LmdldE9mZnNldCgpOwotCQkJCWludCBlbmQgPSBvZmZzZXQgKyBwcm94eS5nZXRMZW5ndGgoKTsKLQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgewotCQkJCQlpZiAob2Zmc2V0ID09IG9sZE9mZnNldCAmJiBlbmQgPT0gb2xkRW5kKSB7Ci0JCQkJCQl0ZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKGVuZCA+IG9sZEVuZCkgewotCQkJCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQkJCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCXByb3h5LnNldE9mZnNldChvbGRFbmQpOwotCQkJCQkJCXByb3h5LnNldExlbmd0aChlbmQgLSBvbGRFbmQpOwotCQkJCQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocHJveHkpOwotCQkJCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lcik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJCQkJCWlmIChlbmQgPCBvbGRFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAob2Zmc2V0ID49IHRoaXMuZ2FwT2Zmc2V0KSB7Ci0JCQkJCXByb3h5LnNldE9mZnNldChvZmZzZXQgKyB0aGlzLmRpZmYpOwotCQkJCQllbmQgKz0gdGhpcy5kaWZmOwotCQkJCX0KLQkJCQlpZiAoZW5kIDwgb2xkRW5kKSB7IC8vIHRvIGJlIHNoYXJlZAotCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0ZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQkJaWYgKGNvbnRlbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlpbnQgbmV3T2Zmc2V0ID0gb2xkT2Zmc2V0OwotCQkJCQkJaW50IG5ld0VuZCA9IG9sZEVuZDsKLQkJCQkJCWlmIChvbGRPZmZzZXQgPT0gdGhpcy5nYXBPZmZzZXQpIHsKLQkJCQkJCQluZXdPZmZzZXQgKz0gdGhpcy5kaWZmOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbmV3RW5kID0gdGhpcy5nYXBPZmZzZXQ7Ci0JCQkJCQl9Ci0JCQkJCQlpbnQgbmV3TGVuZ3RoID0gbmV3RW5kIC0gbmV3T2Zmc2V0OwotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkobmV3T2Zmc2V0LCBuZXdMZW5ndGgsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCi0JCQkJCQlpZiAob2xkRW5kID4gbmV3RW5kKSB7IC8vIHRvIGJlIHNoYXJlZAotCQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQkJaW50IG9mZnNldCA9IHByb3h5LmdldE9mZnNldCgpOwotCQkJCQkJaW50IGVuZCA9IG9mZnNldCArIHByb3h5LmdldExlbmd0aCgpOwotCQkJCQkJaWYgKGVuZCA8PSBvbGRPZmZzZXQpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgewotCQkJCQkJCWlmIChvZmZzZXQgPT0gb2xkT2Zmc2V0ICYmIGVuZCA9PSBvbGRFbmQpIHsKLQkJCQkJCQkJY29udGFpbmVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWlmIChlbmQgPiBvbGRFbmQpIHsKLQkJCQkJCQkJCWNvbnRhaW5lci5pbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJCQkJCXByb3h5LnNldE9mZnNldChvbGRFbmQpOwotCQkJCQkJCQkJcHJveHkuc2V0TGVuZ3RoKGVuZCAtIG9sZEVuZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0ZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCQlpZiAob2Zmc2V0ID49IHRoaXMuZ2FwT2Zmc2V0KSB7Ci0JCQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9mZnNldCArIHRoaXMuZGlmZik7Ci0JCQkJCQkJZW5kICs9IHRoaXMuZGlmZjsKLQkJCQkJCX0KLQkJCQkJCWlmIChlbmQgPCBvbGRFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvd25lck5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlVGV4dERhdGEoVGV4dCB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlU291cmNlKHRleHQpOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0KLQkJVGV4dEltcGwgaW1wbCA9IChUZXh0SW1wbCkgdGV4dDsKLQkJaW50IHN0YXJ0ID0gaW1wbC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gaW1wbC5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IG9mZnNldCA9IHN0YXJ0OwotCi0JCS8vIG1ha2Ugc3VyZSBwcmV2aW91cyB0YWcgaXMgY2xvc2VkCi0JCU5vZGUgcHJldiA9IHRleHQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVUYWcgPSBnZXRDbG9zZVRhZygoSURPTU5vZGUpIHByZXYpOwotCQkJaWYgKHByZVRhZyAhPSBudWxsICYmIHByZVRhZy5sZW5ndGgoKSA+IDApIHsKLQkJCQlvZmZzZXQgKz0gcHJlVGFnLmxlbmd0aCgpOwotCQkJCXNvdXJjZSA9IHByZVRhZyArIHNvdXJjZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCU5vZGUgcGFyZW50ID0gdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJU3RyaW5nIHByZVRhZyA9IGdldFN0YXJ0Q2xvc2VUYWcoZWxlbWVudCk7Ci0JCQkJaWYgKHByZVRhZyAhPSBudWxsICYmIHByZVRhZy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJb2Zmc2V0ICs9IHByZVRhZy5sZW5ndGgoKTsKLQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJYnVmZmVyLmFwcGVuZChwcmVUYWcpOwotCQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZSk7Ci0JCQkJCWlmICh0ZXh0LmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCAmJiAhZWxlbWVudC5oYXNFbmRUYWcoKSAmJiAoZWxlbWVudC5pc0pTUENvbnRhaW5lcigpIHx8IGVsZW1lbnQuaXNDREFUQUNvbnRhaW5lcigpKSkgewotCQkJCQkJLy8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgZW5kIHRhZwotCQkJCQkJU3RyaW5nIHBvc3RUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCWlmIChwb3N0VGFnICE9IG51bGwpIHsKLQkJCQkJCQlpbnQgcG9zdExlbmd0aCA9IHBvc3RUYWcubGVuZ3RoKCk7Ci0JCQkJCQkJaWYgKHBvc3RMZW5ndGggPiAwKSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQocG9zdFRhZyk7Ci0JCQkJCQkJCWludCBwb3N0T2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KHBvc3RPZmZzZXQsIHBvc3RMZW5ndGgpOwotCQkJCQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNvdXJjZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gaW1wbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQlpZiAobGVuZ3RoID4gMCkKLQkJCW5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCWltcGwuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIGNoYW5nZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCBjaGFuZ2VWYWx1ZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCWlmIChub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJY2hhbmdlVGV4dERhdGEoKFRleHQpIG5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQljaGFuZ2VBdHRyVmFsdWUoKEF0dHIpIG5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJY2hhbmdlU3RhcnRUYWcoKEVsZW1lbnQpIG5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlU291cmNlKG5vZGUpOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0KLQkJTm9kZUltcGwgaW1wbCA9IChOb2RlSW1wbCkgbm9kZTsKLQkJaW50IHN0YXJ0ID0gaW1wbC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gaW1wbC5nZXRFbmRPZmZzZXQoKTsKLQotCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGltcGwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQlpZiAobGVuZ3RoID4gMCkKLQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KHN0YXJ0LCBsZW5ndGgpOwotCQlpbXBsLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEF0dHJWYWx1ZUNsb3NlKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0TGFzdFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCB8fCByZWdpb24uZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHZhbHVlID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGNoZWNrIG9wZW4gSlNQIHRhZwotCQlib29sZWFuIGNsb3NlSlNQVGFnID0gZmFsc2U7Ci0JCWludCBvZmZzZXQgPSB2YWx1ZS5pbmRleE9mKEpTUFRhZy5UQUdfT1BFTik7Ci0JCXdoaWxlIChvZmZzZXQgPj0gMCkgewotCQkJb2Zmc2V0ID0gdmFsdWUuaW5kZXhPZihKU1BUYWcuVEFHX0NMT1NFLCBvZmZzZXQgKyAyKTsKLQkJCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQkJY2xvc2VKU1BUYWcgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJb2Zmc2V0ID0gdmFsdWUuaW5kZXhPZihKU1BUYWcuVEFHX09QRU4sIG9mZnNldCArIDIpOwotCQl9Ci0KLQkJLy8gY2hlY2sgcXVvdGUKLQkJYm9vbGVhbiBjbG9zZVF1b3RlID0gZmFsc2U7Ci0JCWNoYXIgZmlyc3RDaGFyID0gdmFsdWUuY2hhckF0KDApOwotCQlpZiAoZmlyc3RDaGFyID09ICciJyB8fCBmaXJzdENoYXIgPT0gJ1wnJykgewotCQkJaWYgKGNsb3NlSlNQVGFnIHx8IGxlbmd0aCA9PSAxIHx8IHZhbHVlLmNoYXJBdChsZW5ndGggLSAxKSAhPSBmaXJzdENoYXIpIHsKLQkJCQljbG9zZVF1b3RlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmICghY2xvc2VKU1BUYWcgJiYgIWNsb3NlUXVvdGUpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoY2xvc2VKU1BUYWcpCi0JCQlidWZmZXIuYXBwZW5kKEpTUFRhZy5UQUdfQ0xPU0UpOwotCQlpZiAoY2xvc2VRdW90ZSkKLQkJCWJ1ZmZlci5hcHBlbmQoZmlyc3RDaGFyKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdhdGhlciBjbG9zZSB0YWdzIHJlY3Vyc2l2ZWx5LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENsb3NlVGFnKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBub2RlLmlzQ2xvc2VkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVDbG9zZVRhZyhub2RlKTsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCWlmIChlbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkvLyBlbmQgdGFnIGlzIG5vdCBjbG9zZWQKLQkJCXJldHVybiB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQl9Ci0KLQkJLy8gbm8gZW5kIHRhZwotCQlpbnQgb2Zmc2V0ID0gZWxlbWVudC5nZXRFbmRPZmZzZXQoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlJRE9NTm9kZSBsYXN0Q2hpbGQgPSAoSURPTU5vZGUpIGVsZW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChsYXN0Q2hpbGQgPT0gbnVsbCkgewotCQkJaWYgKCFlbGVtZW50LmlzU3RhcnRUYWdDbG9zZWQoKSkgewotCQkJCWlmIChlbGVtZW50LnByZWZlckVtcHR5VGFnKCkpCi0JCQkJCWVsZW1lbnQuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0JCQkJU3RyaW5nIGNsb3NlVGFnID0gZ2V0U3RhcnRDbG9zZVRhZyhlbGVtZW50KTsKLQkJCQlpZiAoY2xvc2VUYWcgIT0gbnVsbCkgewotCQkJCQlpbnQgbGVuZ3RoID0gY2xvc2VUYWcubGVuZ3RoKCk7Ci0JCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKGNsb3NlVGFnKTsKLQkJCQkJCW9mZnNldCArPSBsZW5ndGg7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgY2xvc2VUYWcgPSBnZXRDbG9zZVRhZyhsYXN0Q2hpbGQpOwotCQkJaWYgKGNsb3NlVGFnICE9IG51bGwpIHsKLQkJCQlpbnQgbGVuZ3RoID0gY2xvc2VUYWcubGVuZ3RoKCk7Ci0JCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZChjbG9zZVRhZyk7Ci0JCQkJCW9mZnNldCArPSBsZW5ndGg7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGVuZFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQlpZiAoZW5kVGFnICE9IG51bGwpIHsKLQkJCWludCBsZW5ndGggPSBlbmRUYWcubGVuZ3RoKCk7Ci0JCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoZW5kVGFnKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhcnRDbG9zZVRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5pc1N0YXJ0VGFnQ2xvc2VkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgYXR0clZhbHVlQ2xvc2UgPSBnZXRBdHRyVmFsdWVDbG9zZShlbGVtZW50KTsKLQkJaWYgKGF0dHJWYWx1ZUNsb3NlICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGF0dHJWYWx1ZUNsb3NlKTsKLQkJU3RyaW5nIGNsb3NlVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVDbG9zZVRhZyhlbGVtZW50KTsKLQkJaWYgKGNsb3NlVGFnICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGNsb3NlVGFnKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJdGhpcy5nYXBPZmZzZXQgPSAwOwotCQl0aGlzLmdhcExlbmd0aCA9IDA7Ci0JCXRoaXMuZGlmZiA9IDA7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IG51bGw7Ci0JCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcihpbnQgZW5kT2Zmc2V0KSB7Ci0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGNvbnRlbnQuZ2V0U3RhcnQoKSA8IGVuZE9mZnNldCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25CZWZvcmUoaW50IHN0YXJ0T2Zmc2V0KSB7Ci0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGNvbnRlbnQuZ2V0U3RhcnQoKSA+PSBzdGFydE9mZnNldCkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWludCBuZXdPZmZzZXQgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJaW50IG5ld0VuZCA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJYm9vbGVhbiBpc0VuZFRhZyA9IGZhbHNlOwotCi0JCS8vIGZpbmQgb3duZXIgbm9kZQotCQlOb2RlSW1wbCBvd25lck5vZGUgPSBudWxsOwotCQl3aGlsZSAodGhpcy5wYXJlbnROb2RlICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSB0aGlzLm5leHROb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IG5leHRPZmZzZXQgPSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCWlmIChuZXh0T2Zmc2V0ID09IG5ld09mZnNldCkgeyAvLyBmb3VuZAotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmICh0aGlzLm5leHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCWludCBuZXh0RW5kID0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJCQkJCWlmIChuZXh0T2Zmc2V0IDwgbmV3RW5kICYmIG5leHRFbmQgPiBuZXdPZmZzZXQpIHsKLQkJCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBjaGlsZCA9IHRoaXMubmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIGNoaWxkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0aGlzLm5leHROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzLnBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMucGFyZW50Tm9kZTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWludCBlbmRPZmZzZXQgPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaWYgKGVuZE9mZnNldCA9PSBuZXdPZmZzZXQpIHsgLy8gZm91bmQKLQkJCQkJCW93bmVyTm9kZSA9IHRoaXMucGFyZW50Tm9kZTsKLQkJCQkJCWlzRW5kVGFnID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0aGlzLnBhcmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXRoaXMucGFyZW50Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5wYXJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlpZiAob3duZXJOb2RlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCi0JCXNob3J0IG5vZGVUeXBlID0gb3duZXJOb2RlLmdldE5vZGVUeXBlKCk7Ci0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgb3duZXJOb2RlOwotCQkJaWYgKGlzRW5kVGFnKSB7Ci0JCQkJZWxlbWVudC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQl1cGRhdGVBdHRyUmVnaW9ucyhlbGVtZW50LCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSBvd25lck5vZGU7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJaW50IG9sZE9mZnNldCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJaW50IG9sZEVuZCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJCWlmIChvbGRPZmZzZXQgPT0gbmV3T2Zmc2V0ICYmIG9sZEVuZCA9PSBuZXdFbmQpIHsKLQkJCQl0ZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQlpZiAob2xkRW5kID4gbmV3RW5kKSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQkJCWlmIChvbGRPZmZzZXQgPT0gbmV3T2Zmc2V0KSB7Ci0JCQkJCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBuZXdQcm94eSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSgpOwotCQkJCQkJbmV3UHJveHkuc2V0T2Zmc2V0KG9sZE9mZnNldCk7Ci0JCQkJCQluZXdQcm94eS5zZXRMZW5ndGgobmV3RW5kIC0gb2xkT2Zmc2V0KTsKLQkJCQkJCW5ld1Byb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdQcm94eSk7Ci0JCQkJCX0KLQkJCQkJcHJveHkuc2V0T2Zmc2V0KG5ld0VuZCk7Ci0JCQkJCXByb3h5LnNldExlbmd0aChvbGRFbmQgLSBuZXdFbmQpOwotCQkJCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHByb3h5KTsKLQkJCQkJdGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCQkJCWlmIChvbGRFbmQgPCBuZXdFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0ZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJCWludCBvZmZzZXQgPSBjb250ZW50LmdldFN0YXJ0KCk7Ci0JCQkJCWludCBlbmQgPSBjb250ZW50LmdldEVuZCgpOwotCQkJCQlpZiAoZW5kIDw9IG5ld09mZnNldCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAob2Zmc2V0ID09IG5ld09mZnNldCAmJiBlbmQgPT0gbmV3RW5kKSB7Ci0JCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCQlpZiAoZW5kID4gbmV3RW5kKSB7Ci0JCQkJCQkJaWYgKG9mZnNldCA9PSBuZXdPZmZzZXQpIHsKLQkJCQkJCQkJY29udGFpbmVyLmluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgbmV3UHJveHkgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoKTsKLQkJCQkJCQkJbmV3UHJveHkuc2V0T2Zmc2V0KG9mZnNldCk7Ci0JCQkJCQkJCW5ld1Byb3h5LnNldExlbmd0aChuZXdFbmQgLSBvZmZzZXQpOwotCQkJCQkJCQluZXdQcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQkJY29udGFpbmVyLmluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdQcm94eSwgaSk7Ci0JCQkJCQkJfQotCQkJCQkJCXByb3h5LnNldE9mZnNldChuZXdFbmQpOwotCQkJCQkJCXByb3h5LnNldExlbmd0aChlbmQgLSBuZXdFbmQpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCWlmIChlbmQgPT0gbmV3RW5kKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAob2xkRW5kIDwgbmV3RW5kKSB7IC8vIHRvIGJlIHNoYXJlZAotCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0ZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJb3duZXJOb2RlLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJaWYgKGNvdW50ID4gMSkKLQkJCQkJCWNvbnRhaW5lci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlpZiAoY291bnQgPiAxKQotCQkJCQkJCWNvbnRhaW5lci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCWlmICh0aGlzLnBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpbnQgZ2FwRW5kID0gdGhpcy5nYXBPZmZzZXQgKyB0aGlzLmdhcExlbmd0aDsKLQkJaW50IG9sZE9mZnNldCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgb2xkRW5kID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQlpZiAob2xkT2Zmc2V0ID49IHRoaXMuZ2FwT2Zmc2V0ICYmIG9sZEVuZCA8PSBnYXBFbmQpCi0JCQlyZXR1cm47IC8vIGRvIG5vdGhpbmcKLQkJaW50IG9sZExlbmd0aCA9IG9sZEVuZCAtIG9sZE9mZnNldDsKLQkJaWYgKG9sZE9mZnNldCA+PSBnYXBFbmQpCi0JCQlvbGRPZmZzZXQgKz0gdGhpcy5kaWZmOwotCi0JCS8vIGZpbmQgb3duZXIgbm9kZQotCQlOb2RlSW1wbCBvd25lck5vZGUgPSBudWxsOwotCQlFbGVtZW50SW1wbCBvd25lckVuZFRhZyA9IG51bGw7Ci0JCVRleHRJbXBsIG93bmVyVGV4dCA9IG51bGw7Ci0JCXdoaWxlICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkgewotCQkJCWlmICh0aGlzLm5leHROb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLm5leHROb2RlOwotCQkJCQlpZiAodGV4dC5oYXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCW93bmVyVGV4dCA9IHRleHQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCU5vZGUgY2hpbGQgPSB0aGlzLm5leHROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQl0aGlzLnBhcmVudE5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSBjaGlsZDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQl0aGlzLnBhcmVudE5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQl0aGlzLm5leHROb2RlID0gbnVsbDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5uZXh0Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAodGhpcy5wYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0aGlzLnBhcmVudE5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCW93bmVyTm9kZSA9IHRoaXMucGFyZW50Tm9kZTsKLQkJCQkJb3duZXJFbmRUYWcgPSBlbGVtZW50OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJdGhpcy5wYXJlbnROb2RlID0gKE5vZGVJbXBsKSB0aGlzLnBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmIChvd25lck5vZGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0KLQkJaWYgKG93bmVyVGV4dCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gb3duZXJUZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9sZE9mZnNldCwgb2xkTGVuZ3RoKTsKLQkJCQlvd25lclRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZTsKLQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWludCBvZmZzZXQgPSBwcm94eS5nZXRPZmZzZXQoKTsKLQkJCQlpbnQgZW5kID0gb2Zmc2V0ICsgcHJveHkuZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKG9mZnNldCA+PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQlwcm94eS5zZXRPZmZzZXQob2Zmc2V0ICsgdGhpcy5kaWZmKTsKLQkJCQl9Ci0JCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJCWlmIChlbmQgPCBvbGRFbmQgJiYgKGVuZCA8IHRoaXMuZ2FwT2Zmc2V0IHx8IG9sZEVuZCA+IGdhcEVuZCkpIHsgLy8gaGFzCi0JCQkJCS8vIHNoYXJlZAotCQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJCWlmIChjb250ZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2xkT2Zmc2V0LCBvbGRMZW5ndGgpOwotCQkJCQkJY29udGFpbmVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJCWludCBvZmZzZXQgPSBwcm94eS5nZXRPZmZzZXQoKTsKLQkJCQkJCQlpbnQgZW5kID0gb2Zmc2V0ICsgcHJveHkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkJaWYgKG9mZnNldCA+PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQkJCQlwcm94eS5zZXRPZmZzZXQob2Zmc2V0ICsgdGhpcy5kaWZmKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJCQkJCWlmIChlbmQgPCBvbGRFbmQgJiYgKGVuZCA8IHRoaXMuZ2FwT2Zmc2V0IHx8IG9sZEVuZCA+IGdhcEVuZCkpIHsgLy8gaGFzCi0JCQkJCQkJCS8vIHNoYXJlZAotCQkJCQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvbGRPZmZzZXQsIG9sZExlbmd0aCk7Ci0JCQlpZiAob3duZXJFbmRUYWcgIT0gbnVsbCkgewotCQkJCW93bmVyRW5kVGFnLnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJb3duZXJOb2RlLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVwbGFjZUF0dHIgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG93bmVyRWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQl2b2lkIHJlcGxhY2VBdHRyKEVsZW1lbnQgb3duZXJFbGVtZW50LCBBdHRyIG5ld0F0dHIsIEF0dHIgb2xkQXR0cikgewotCQlpZiAob3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG93bmVyRWxlbWVudDsKLQkJaWYgKCFlbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCWNoYW5nZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQljaGFuZ2VTdGFydFRhZyhlbGVtZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvZmZzZXQgPSBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IG9mZnNldDsKLQkJaW50IGVuZCA9IG9mZnNldDsKLQotCQlib29sZWFuIGluc2VydFNwYWNlID0gZmFsc2U7Ci0JCVN0cmluZyBhdHRyVmFsdWVDbG9zZSA9IG51bGw7Ci0JCWlmIChvbGRBdHRyICE9IG51bGwpIHsKLQkJCUF0dHJJbXBsIGltcGwgPSAoQXR0ckltcGwpIG9sZEF0dHI7Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gaW1wbC5nZXROYW1lUmVnaW9uKCk7Ci0JCQlpZiAobmFtZVJlZ2lvbiA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gbXVzdCBuZXZlciBoYXBwZW4KLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBpbXBsLmdldFZhbHVlUmVnaW9uKCk7Ci0JCQlpZiAobGFzdFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJZW5kICs9IGxhc3RSZWdpb24uZ2V0RW5kKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsYXN0UmVnaW9uID0gaW1wbC5nZXRFcXVhbFJlZ2lvbigpOwotCQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJZW5kICs9IGxhc3RSZWdpb24uZ2V0RW5kKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllbmQgKz0gbmFtZVJlZ2lvbi5nZXRFbmQoKTsKLQkJCQkJbGFzdFJlZ2lvbiA9IG5hbWVSZWdpb247Ci0JCQkJfQotCQkJfQotCQkJLy8gY2hlY2sgdGhlcmUgYXJlIGV4dHJhIHNwYWNlIGJlZm9yZSB0aGUgbGFzdCBhdHRyaWJ1dGUKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChyZWdpb25zID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCQkJSVRleHRSZWdpb24gcHJldlJlZ2lvbiA9IG51bGw7Ci0JCQlJVGV4dFJlZ2lvbiBuZXh0UmVnaW9uID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCWlmIChyZWdpb24gPT0gbmFtZVJlZ2lvbikgewotCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCXByZXZSZWdpb24gPSByZWdpb25zLmdldChpIC0gMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHJlZ2lvbiA9PSBsYXN0UmVnaW9uKSB7Ci0JCQkJCWlmIChpICsgMSA8IHJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJCQluZXh0UmVnaW9uID0gcmVnaW9ucy5nZXQoaSArIDEpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWJvb2xlYW4gaXNMYXN0QXR0ciA9IGZhbHNlOwotCQkJaWYgKG5leHRSZWdpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyByZWdpb25UeXBlID0gbmV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFIHx8IGlzTmVzdGVkVGFnQ2xvc2UocmVnaW9uVHlwZSkpIHsKLQkJCQkJaXNMYXN0QXR0ciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGlzTGFzdEF0dHIgJiYgcHJldlJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJc3RhcnQgKz0gcHJldlJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGFydCArPSBuYW1lUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQl9Ci0KLQkJCS8vIGltcGwucmVzZXRSZWdpb25zKG93bmVyRWxlbWVudCk7Ci0JCQlpbXBsLnJlc2V0UmVnaW9ucyhlbGVtZW50KTsKLQkJfQotCQllbHNlIHsgLy8gYXBwZW5kIGF0dHJpYnV0ZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gbXVzdCBuZXZlciBoYXBwZW4KLQotCQkJYXR0clZhbHVlQ2xvc2UgPSBnZXRBdHRyVmFsdWVDbG9zZShlbGVtZW50KTsKLQkJCWlmIChhdHRyVmFsdWVDbG9zZSAhPSBudWxsICYmIGF0dHJWYWx1ZUNsb3NlLmxlbmd0aCgpID4gMCkgewotCQkJCWluc2VydFNwYWNlID0gdHJ1ZTsKLQkJCQlzdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCWVuZCA9IHN0YXJ0OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCQkJCWludCBhdHRyU3RhcnQgPSAwOwotCQkJCWZvciAoaW50IGkgPSByZWdpb25zLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSB8fCBpc05lc3RlZFRhZ0Nsb3NlKHJlZ2lvblR5cGUpKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWludCByZWdpb25FbmQgPSByZWdpb24uZ2V0RW5kKCk7Ci0JCQkJCWlmIChyZWdpb25FbmQgPT0gcmVnaW9uLmdldFRleHRFbmQoKSkKLQkJCQkJCWluc2VydFNwYWNlID0gdHJ1ZTsKLQkJCQkJYXR0clN0YXJ0ID0gcmVnaW9uRW5kOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGF0dHJTdGFydCA9PSAwKQotCQkJCQlyZXR1cm47IC8vIG5vdCBmb3VuZCwgbXVzdCBuZXZlciBoYXBwZW4KLQkJCQlzdGFydCArPSBhdHRyU3RhcnQ7Ci0JCQkJZW5kID0gc3RhcnQ7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gbnVsbDsKLQkJaWYgKG5ld0F0dHIgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSAyOwotCQkJaWYgKGF0dHJWYWx1ZUNsb3NlICE9IG51bGwpCi0JCQkJc2l6ZSArPSBhdHRyVmFsdWVDbG9zZS5sZW5ndGgoKTsKLQkJCVN0cmluZyBuYW1lID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVBdHRyTmFtZShuZXdBdHRyKTsKLQkJCWlmIChuYW1lICE9IG51bGwpCi0JCQkJc2l6ZSArPSBuYW1lLmxlbmd0aCgpOwotCQkJU3RyaW5nIHZhbHVlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUobmV3QXR0cik7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQlzaXplICs9IHZhbHVlLmxlbmd0aCgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc2l6ZSk7Ci0JCQlpZiAoYXR0clZhbHVlQ2xvc2UgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJWYWx1ZUNsb3NlKTsKLQkJCWlmIChpbnNlcnRTcGFjZSkKLQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWUpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCc9Jyk7Ci0JCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZSk7Ci0JCQl9Ci0JCQlzb3VyY2UgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJlcGxhY2VTb3VyY2Uoc291cmNlLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZ0Nsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogcmVwbGFjZUNoaWxkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCByZXBsYWNlQ2hpbGQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsICYmIG9sZENoaWxkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBzdGFydCA9IDA7Ci0JCWludCBlbmQgPSAwOwotCQlTdHJpbmcgcHJlVGFnID0gbnVsbDsKLQkJU3RyaW5nIHBvc3RUYWcgPSBudWxsOwotCQlFbGVtZW50SW1wbCBwb3N0RWxlbWVudCA9IG51bGw7Ci0JCWlmIChvbGRDaGlsZCAhPSBudWxsKSB7Ci0JCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSBvbGRDaGlsZDsKLQkJCXN0YXJ0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJZW5kID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChvbGRDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJfQotCQkJbm9kZS5yZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsgLy8gcmVzZXQgdmFsdWVzIGZyb20KLQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJfQotCQllbHNlIHsKLQkJCU5vZGVJbXBsIHByZXYgPSAoTm9kZUltcGwpIG5ld0NoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJCXN0YXJ0ID0gcHJldi5nZXRFbmRPZmZzZXQoKTsKLQkJCQllbmQgPSBzdGFydDsKLQkJCQlwcmVUYWcgPSBnZXRDbG9zZVRhZyhwcmV2KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGZpcnN0IGNoaWxkCi0JCQkJTm9kZUltcGwgbmV4dCA9IChOb2RlSW1wbCkgbmV3Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCXN0YXJ0ID0gbmV4dC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQllbmQgPSBzdGFydDsKLQkJCQkJaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJcHJlVGFnID0gZ2V0U3RhcnRDbG9zZVRhZygoSURPTUVsZW1lbnQpIHBhcmVudE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBuZXdseSBoYXZpbmcgYSBjaGlsZAotCQkJCQlpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnROb2RlOwotCQkJCQkJaWYgKGVsZW1lbnQuaXNFbXB0eVRhZygpKSB7IC8vIGVtcHR5IHRhZyBmb3JtYXQKLQkJCQkJCQkvLyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzdGFydCBhbmQgdGhlIGVuZCB0YWdzCi0JCQkJCQkJZW5kID0gZWxlbWVudC5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCQlzdGFydCA9IGVuZCAtIDI7IC8vIGZvciAiLz4iCi0JCQkJCQkJZWxlbWVudC5zZXRFbXB0eVRhZyhmYWxzZSk7Ci0JCQkJCQkJcHJlVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVDbG9zZVRhZyhlbGVtZW50KTsKLQkJCQkJCQlwb3N0VGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCQkJcG9zdEVsZW1lbnQgPSBlbGVtZW50OwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoIWVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCQkJCXN0YXJ0ID0gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJCWVuZCA9IHN0YXJ0OwotCQkJCQkJCS8vIGludmFsaWQgZW5kIHRhZyBvciBpbXBsaWNpdCB0YWcKLQkJCQkJCQkvLyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzdGFydCB0YWcKLQkJCQkJCQlwcmVUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJCQkJCWlmIChwcmVUYWcgIT0gbnVsbCkgewotCQkJCQkJCQlpbnQgbGVuZ3RoID0gcHJlVGFnLmxlbmd0aCgpOwotCQkJCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShzdGFydCwgbGVuZ3RoKTsKLQkJCQkJCQkJCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghZWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQkJCQkvLyBpbXBsaWNpdCB0YWcKLQkJCQkJCQkJLy8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgZW5kIHRhZ3MKLQkJCQkJCQkJcG9zdFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQkJCQlwb3N0RWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJc3RhcnQgPSBlbGVtZW50LmdldFN0YXJ0RW5kT2Zmc2V0KCk7Ci0JCQkJCQkJZW5kID0gc3RhcnQ7Ci0JCQkJCQkJcHJlVGFnID0gZ2V0U3RhcnRDbG9zZVRhZyhlbGVtZW50KTsKLQkJCQkJCQlpZiAocHJlVGFnICE9IG51bGwgJiYgcHJlVGFnLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQlpZiAoIWVsZW1lbnQuaGFzRW5kVGFnKCkgJiYgKGVsZW1lbnQuaXNKU1BDb250YWluZXIoKSB8fCBlbGVtZW50LmlzQ0RBVEFDb250YWluZXIoKSkpIHsKLQkJCQkJCQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGVuZCB0YWcKLQkJCQkJCQkJCXBvc3RUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCQkJCXBvc3RFbGVtZW50ID0gZWxlbWVudDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBlbHNlIG1pZ2h0IERPQ1VNRU5UX05PREUsIHN0YXJ0IGFuZCBlbmQgYXJlIDAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gbnVsbDsKLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgb2Zmc2V0ID0gc3RhcnQ7Ci0JCQlpZiAocHJlVGFnICE9IG51bGwpIHsKLQkJCQlpbnQgbGVuZ3RoID0gcHJlVGFnLmxlbmd0aCgpOwotCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCW9mZnNldCArPSBsZW5ndGg7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQocHJlVGFnKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIG5ld0NoaWxkOwotCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQkJaWYgKGVsZW1lbnQucHJlZmVyRW1wdHlUYWcoKSkKLQkJCQkJCWVsZW1lbnQuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCQlTdHJpbmcgc3RhcnRUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCkgewotCQkJCQkJaW50IGxlbmd0aCA9IHN0YXJ0VGFnLmxlbmd0aCgpOwotCQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKHN0YXJ0VGFnKTsKLQkJCQkJCQlmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBjb250ZW50ID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTb3VyY2Uobm9kZSk7Ci0JCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCQljb250ZW50ID0gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQkJCQlpbnQgbGVuZ3RoID0gY29udGVudC5sZW5ndGgoKTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKGNvbnRlbnQpOwotCQkJCQkJZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2Zmc2V0LCBsZW5ndGgpOwotCQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJfQotCQkJCQlub2RlLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJfQotCi0JCQkJTm9kZUltcGwgY2hpbGQgPSAoTm9kZUltcGwpIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCW5vZGUgPSBjaGlsZDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJCQkJU3RyaW5nIGVuZFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQlpZiAoZW5kVGFnICE9IG51bGwpIHsKLQkJCQkJCWludCBsZW5ndGggPSBlbmRUYWcubGVuZ3RoKCk7Ci0JCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoZW5kVGFnKTsKLQkJCQkJCQlmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJfQotCi0JCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlpZiAobm9kZSA9PSBuZXdDaGlsZCkgewotCQkJCQkJbm9kZSA9IG51bGw7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJCW5vZGUgPSBuZXh0OwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQlub2RlID0gKE5vZGVJbXBsKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJCQkJU3RyaW5nIGVuZFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQlpZiAoZW5kVGFnICE9IG51bGwpIHsKLQkJCQkJCWludCBsZW5ndGggPSBlbmRUYWcubGVuZ3RoKCk7Ci0JCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoZW5kVGFnKTsKLQkJCQkJCQlmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocG9zdFRhZyAhPSBudWxsKSB7Ci0JCQkJaW50IGxlbmd0aCA9IHBvc3RUYWcubGVuZ3RoKCk7Ci0JCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZChwb3N0VGFnKTsKLQkJCQkJaWYgKHBvc3RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2Zmc2V0LCBsZW5ndGgpOwotCQkJCQkJcG9zdEVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXNvdXJjZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJaWYgKHN0YXJ0ID09IGVuZCAmJiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBubyB0aGluZyBjaGFuZ2VkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlyZXBsYWNlU291cmNlKHNvdXJjZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0Jdm9pZCByZXBsYWNlUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJLy8gZnV0dXJlX1RPRE86IG9wdGltaXplCi0KLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpOwotCQl0aGlzLnBhcmVudE5vZGUgPSByb290OwotCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSByb290LmdldEZpcnN0Q2hpbGQoKTsKLQotCQlyZW1vdmVHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25CZWZvcmUoZmxhdE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkFmdGVyKGZsYXROb2RlLmdldEVuZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwcyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLnJlcGxhY2VUZXh0KCkgYW5kIHNldHMgY29udGV4dHVhbAotCSAqIGluZm9ybWF0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCByZXBsYWNlU291cmNlKFN0cmluZyBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCkgewotCQlpbnQgaW5zZXJ0ZWQgPSAwOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCWVsc2UKLQkJCWluc2VydGVkID0gc291cmNlLmxlbmd0aCgpOwotCQlpbnQgcmVtb3ZlZCA9IGVuZCAtIHN0YXJ0OwotCQlpZiAoaW5zZXJ0ZWQgPT0gMCAmJiByZW1vdmVkID09IDApCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5nYXBPZmZzZXQgPSBzdGFydDsKLQkJdGhpcy5nYXBMZW5ndGggPSByZW1vdmVkOwotCQl0aGlzLmRpZmYgPSBpbnNlcnRlZCAtIHJlbW92ZWQ7Ci0JCS8vIE5vdGU6IGR1ZSB0byBidWcKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM2MTkKLQkJLy8gZm9yIG5vdyBhc3N1bWUgImlnbm9yZSByZWFkb25seSIgcmVnaW9uIGlzIG9rIC0tIGFzc3VtZSBET00gaXRzZWxmCi0JCS8vIGNoZWNrcyBpZgotCQkvLyBvayB0byBpbnNlcnQgb3Igbm90LiBJbiByZWFsaXR5LCB3ZSBtYXkgaGF2ZSB0byBtYWtlIG9yICJjb250YWlucyIKLQkJLy8gbWV0aG9kIG1vcmUKLQkJLy8gYmV0dGVyLiBPciwgd2UgbWF5IGhhdmUgdG8gInBlcmN1bGF0ZSB1cCIgdGhlIHBhcmFtZXRlciBmb3IgY2xpZW50cwotCQkvLyB0byB0ZWxsIHVzIHByb2dyYW1hdGljYWxseQotCQkvLyB0aGF0IGl0cyBvayB0byBpbnNlcnQvZm9ybWF0IGluIGEgcmVhZC1vbmx5IHJlZ2lvbi4KLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcy5tb2RlbCwgdGhpcy5nYXBPZmZzZXQsIHRoaXMuZ2FwTGVuZ3RoLCBzb3VyY2UsIHRydWUpOwotCX0KLQotCXZvaWQgcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykgewotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCk7Ci0KLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJdGhpcy5wYXJlbnROb2RlID0gcm9vdDsKLQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCi0JCQlFbnVtZXJhdGlvbiBlID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5lbGVtZW50cygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZW1vdmVHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJdGhpcy5wYXJlbnROb2RlID0gcm9vdDsKLQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQkJRW51bWVyYXRpb24gZSA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZWxlbWVudHMoKTsKLQkJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZShmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCWxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBmbGF0Tm9kZTsKLQkJCX0KLQkJCWlmIChsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcihsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZSh0aGlzLmdhcE9mZnNldCk7Ci0JCQkJLy8gbWFrZSBzdXJlIHRvIHJlc3RvcmUgYWxsIGJhY2t1cGVkIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcih0aGlzLmdhcE9mZnNldCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSByb290OwotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZSh0aGlzLmdhcE9mZnNldCk7Ci0JCQkvLyBtYWtlIHN1cmUgdG8gcmVzdG9yZSBhbGwgYmFja3VwZWQgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQWZ0ZXIodGhpcy5nYXBPZmZzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUF0dHJSZWdpb25zKEVsZW1lbnQgZWxlbWVudCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCi0JCS8vIHVwZGF0ZSBhdHRyaWJ1dGVzCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbSgrK2luZGV4KTsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0TmFtZVJlZ2lvbihyZWdpb24pOwotCQkJCQkvLyByZXNldCBvdGhlciByZWdpb25zCi0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24obnVsbCk7Ci0JCQkJCWF0dHIuc2V0VmFsdWVSZWdpb24obnVsbCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCWlmIChhdHRyICE9IG51bGwpCi0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24ocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihyZWdpb24pOwotCQkJCQlhdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL1hNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL1hNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5N2Y2NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9YTUxEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3I7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGFuZCBwYXJzZXMgZmlyc3Qgb2YgWE1MIGZpbGUgdG8gZ2V0IGVuY29kaW5nLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgewotCi0JLyoqCi0JICogWE1MTG9hZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc2V0KG5ldyBEb2N1bWVudFJlYWRlcihkb2N1bWVudCwgMCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMxNmIzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL1hNTERvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGFuIFhNTCBmaWxlIGFuZCBjcmVhdGVzIGFuIFhNTCBTdHJ1Y3R1cmVkIE1vZGVsLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxEb2N1bWVudExvYWRlciBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRMb2FkZXIgewotCi0JcHVibGljIFhNTERvY3VtZW50TG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCWlmIChmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID09IG51bGwpIHsKLQkJCWZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPSBuZXcgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKTsKLQkJfQotCQlyZXR1cm4gZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcjsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxTb3VyY2VQYXJzZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZGVsaW1pdGVyID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCk7Ci0JCWlmIChkZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWRlbGltaXRlciA9IHN1cGVyLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoZmlsZSk7Ci0JCXJldHVybiBkZWxpbWl0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQkvLyBieSBkZWZhdWx0LCBVVEYtOCBhcyBwZXIgWE1MIHNwZWMKLQkJZmluYWwgU3RyaW5nIGVuYyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUVuY29kZWREb2N1bWVudCBuZXdFbmNvZGVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRQYXJzZXIoKSk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5zZXRSZVBhcnNlcihuZXcgWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFhNTERvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWZhdWx0WE1MUGFydGl0aW9uRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWZhdWx0WE1MUGFydGl0aW9uRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZWNhODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVmYXVsdFhNTFBhcnRpdGlvbkZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk3MDA2IC0gU3RyaW5nIENvbXBhcmlzb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkRlbGV0ZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5JbnNlcnRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIERlZmF1bHRYTUxQYXJ0aXRpb25Gb3JtYXR0ZXIgewotCS8qKgotCSAqIEp1c3QgYSBzbWFsbCBjb250YWluZXIgY2xhc3MgdGhhdCBob2xkcyBhIERPTU5vZGUgJiBkb2N1bWVudFJlZ2lvbiB0aGF0Ci0JICogc2hvdWxkIHJlcHJlc2VudCBlYWNoIG90aGVyLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBET01SZWdpb24gewotCQlwdWJsaWMgSURPTU5vZGUgZG9tTm9kZTsKLQkJcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb247Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFBSRVNFUlZFID0gInByZXNlcnZlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIENPTExBUFNFID0gImNvbGxhcHNlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFJFUExBQ0UgPSAicmVwbGFjZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBQUkVTRVJWRV9RVU9URUQgPSAiXCJwcmVzZXJ2ZVwiIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFhNTF9TUEFDRSA9ICJ4bWw6c3BhY2UiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWFNMX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFhTTF9BVFRSSUJVVEUgPSAiYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBYU0xfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBTUEFDRSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFBST1BFUlRZX1dISVRFU1BBQ0VfRkFDRVQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC5jbS5wcm9wZXJ0aWVzL3doaXRlc3BhY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFhNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBmUHJlZmVyZW5jZXMgPSBudWxsOwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yOwotCi0JcHJpdmF0ZSBpbnQgcmVwbGFjZVNwYWNlcyhUZXh0RWRpdCB0ZXh0RWRpdCwgaW50IHNwYWNlU3RhcnRPZmZzZXQsIGludCBhdmFpbGFibGVMaW5lV2lkdGgsIFN0cmluZyB3aGl0ZXNwYWNlUnVuKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcih3aGl0ZXNwYWNlUnVuKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IGJ1ZmYubGVuZ3RoKCk7IGkrKykgewotCQkJYnVmZi5zZXRDaGFyQXQoaSwgJyAnKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyByZXBsYWNlbWVudFN0cmluZyA9IGJ1ZmYudG9TdHJpbmcoKTsKLQkJaWYgKCFyZXBsYWNlbWVudFN0cmluZy5lcXVhbHMod2hpdGVzcGFjZVJ1bikpIHsKLQkJCVJlcGxhY2VFZGl0IHJlcGxhY2VFZGl0ID0gbmV3IFJlcGxhY2VFZGl0KHNwYWNlU3RhcnRPZmZzZXQsIHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCksIHJlcGxhY2VtZW50U3RyaW5nKTsKLQkJCXRleHRFZGl0LmFkZENoaWxkKHJlcGxhY2VFZGl0KTsKLQkJfQotCQlyZXR1cm4gYXZhaWxhYmxlTGluZVdpZHRoOwotCX0KLQkKLQlwcml2YXRlIGludCBjb2xsYXBzZVNwYWNlcyhUZXh0RWRpdCB0ZXh0RWRpdCwgaW50IHNwYWNlU3RhcnRPZmZzZXQsIGludCBhdmFpbGFibGVMaW5lV2lkdGgsIFN0cmluZyB3aGl0ZXNwYWNlUnVuKSB7Ci0JCS8vIHByZWZlciB0byB1c2UgdXNlIGV4aXN0aW5nIHdoaXRlc3BhY2UKLQkJaW50IGV4aXN0aW5nV2hpdGVzcGFjZU9mZnNldCA9IHdoaXRlc3BhY2VSdW4uaW5kZXhPZignICcpOwotCQlpZiAoZXhpc3RpbmdXaGl0ZXNwYWNlT2Zmc2V0ID4gLTEpIHsKLQkJCS8vIGRlbGV0ZSB3aGl0ZXNwYWNlcyBiZWZvcmUgYW5kIGFmdGVyIGV4aXN0aW5nIHdoaXRlc3BhY2UKLQkJCWlmIChleGlzdGluZ1doaXRlc3BhY2VPZmZzZXQgPiAwKSB7Ci0JCQkJRGVsZXRlRWRpdCBkZWxldGVFZGl0ID0gbmV3IERlbGV0ZUVkaXQoc3BhY2VTdGFydE9mZnNldCwgZXhpc3RpbmdXaGl0ZXNwYWNlT2Zmc2V0KTsKLQkJCQl0ZXh0RWRpdC5hZGRDaGlsZChkZWxldGVFZGl0KTsKLQkJCX0KLQkJCWlmIChleGlzdGluZ1doaXRlc3BhY2VPZmZzZXQgPCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpIC0gMSkgewotCQkJCWludCBuZXh0T2Zmc2V0ID0gZXhpc3RpbmdXaGl0ZXNwYWNlT2Zmc2V0ICsgMTsKLQkJCQlEZWxldGVFZGl0IGRlbGV0ZUVkaXQgPSBuZXcgRGVsZXRlRWRpdChzcGFjZVN0YXJ0T2Zmc2V0ICsgbmV4dE9mZnNldCwgd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSAtIG5leHRPZmZzZXQpOwotCQkJCXRleHRFZGl0LmFkZENoaWxkKGRlbGV0ZUVkaXQpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gZGVsZXRlIGFsbCB3aGl0ZXNwYWNlIGFuZCBpbnNlcnQgbmV3IG9uZQotCQkJLy8gY29sbGFwc2Ugd2hpdGVzcGFjZSBieSBkZWxldGluZyB3aGl0ZXNwYWNlCi0JCQlEZWxldGVFZGl0IGRlbGV0ZUVkaXQgPSBuZXcgRGVsZXRlRWRpdChzcGFjZVN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpKTsKLQkJCXRleHRFZGl0LmFkZENoaWxkKGRlbGV0ZUVkaXQpOwotCQkJLy8gdGhlbiBpbnNlcnQgb25lIHNwYWNlCi0JCQlJbnNlcnRFZGl0IGluc2VydEVkaXQgPSBuZXcgSW5zZXJ0RWRpdChzcGFjZVN0YXJ0T2Zmc2V0LCBTUEFDRSk7Ci0JCQl0ZXh0RWRpdC5hZGRDaGlsZChpbnNlcnRFZGl0KTsKLQkJfQotCQkvLyByZW1lbWJlciB0byBhY2NvdW50IGZvciBzcGFjZSBhZGRlZAotCQktLWF2YWlsYWJsZUxpbmVXaWR0aDsKLQkJcmV0dXJuIGF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgY29sbGFwc2VBbmRJbmRlbnQoVGV4dEVkaXQgdGV4dEVkaXQsIGludCBzcGFjZVN0YXJ0T2Zmc2V0LCBpbnQgYXZhaWxhYmxlTGluZVdpZHRoLCBpbnQgaW5kZW50TGV2ZWwsIFN0cmluZyB3aGl0ZXNwYWNlUnVuLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24pIHsKLQkJLy8gTmVlZCB0byBrZWVwIGJsYW5rIGxpbmVzLCBidXQgc3RpbGwgY29sbGFwc2UgdGhlIHdoaXRlc3BhY2UKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXJzID0gbnVsbDsKLQkJaWYgKCFnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRDbGVhckFsbEJsYW5rTGluZXMoKSkgewotCQkJbGluZURlbGltaXRlcnMgPSBleHRyYWN0TGluZURlbGltaXRlcnMod2hpdGVzcGFjZVJ1biwgY3VycmVudFJlZ2lvbik7Ci0JCQlTdHJpbmcgZm9ybWF0dGVkTGluZSA9IGxpbmVEZWxpbWl0ZXJzICsgZ2V0SW5kZW50U3RyaW5nKGluZGVudExldmVsKTsKLQkJCWlmKGxpbmVEZWxpbWl0ZXJzLmxlbmd0aCgpID4gMCAmJiAhZm9ybWF0dGVkTGluZS5lcXVhbHMod2hpdGVzcGFjZVJ1bikpIHsKLQkJCQl0ZXh0RWRpdC5hZGRDaGlsZChuZXcgUmVwbGFjZUVkaXQoc3BhY2VTdGFydE9mZnNldCwgd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSwgZm9ybWF0dGVkTGluZSkpOwotCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldE1heExpbmVXaWR0aCgpIC0gaW5kZW50TGV2ZWw7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxpbmVEZWxpbWl0ZXJzID09IG51bGwgfHwgbGluZURlbGltaXRlcnMubGVuZ3RoKCkgPT0gMCkgewotCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gY29sbGFwc2VTcGFjZXModGV4dEVkaXQsIHNwYWNlU3RhcnRPZmZzZXQsIGF2YWlsYWJsZUxpbmVXaWR0aCwgd2hpdGVzcGFjZVJ1bik7Ci0JCX0KLQkJcmV0dXJuIGF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVsZXRlVHJhaWxpbmdTcGFjZXMoVGV4dEVkaXQgdGV4dEVkaXQsIElUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbikgewotCQlpbnQgdGV4dEVuZCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRFbmQoKTsKLQkJaW50IHRleHRFbmRPZmZzZXQgPSBjdXJyZW50RG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHRleHRFbmQ7Ci0JCWludCBkaWZmZXJlbmNlID0gY3VycmVudFRleHRSZWdpb24uZ2V0RW5kKCkgLSB0ZXh0RW5kOwotCQlEZWxldGVFZGl0IGRlbGV0ZUVkaXQgPSBuZXcgRGVsZXRlRWRpdCh0ZXh0RW5kT2Zmc2V0LCBkaWZmZXJlbmNlKTsKLQkJdGV4dEVkaXQuYWRkQ2hpbGQoZGVsZXRlRWRpdCk7Ci0JfQotCi0JcHVibGljIFRleHRFZGl0IGZvcm1hdChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gZm9ybWF0KGRvY3VtZW50LCBzdGFydCwgbGVuZ3RoLCBuZXcgWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkpOwotCX0KLQotCXB1YmxpYyBUZXh0RWRpdCBmb3JtYXQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgsIFhNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcykgewotCQlUZXh0RWRpdCBlZGl0ID0gbnVsbDsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWVkaXQgPSBmb3JtYXQobW9kZWwsIHN0YXJ0LCBsZW5ndGgsIHByZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdDsKLQl9Ci0KLQlwdWJsaWMgVGV4dEVkaXQgZm9ybWF0KElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gZm9ybWF0KG1vZGVsLCBzdGFydCwgbGVuZ3RoLCBuZXcgWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkpOwotCX0KLQotCXB1YmxpYyBUZXh0RWRpdCBmb3JtYXQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKLQkJc2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKHByZWZlcmVuY2VzKTsKLQotCQlUZXh0RWRpdCBlZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkvLyBnZXQgaW5pdGlhbCBkb2N1bWVudCByZWdpb24KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gZG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQlpZiAoY3VycmVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpbnQgc3RhcnRPZmZzZXQgPSBjdXJyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCS8vIGdldCBpbml0aWFsIGRvbSBub2RlCi0JCQlJbmRleGVkUmVnaW9uIGN1cnJlbnRJbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE9mZnNldCk7Ci0JCQlpZiAoY3VycmVudEluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCS8vIHNldCB1cCBkb21SZWdpb24gd2hpY2ggd2lsbCBjb250YWluIGN1cnJlbnQgcmVnaW9uIHRvIGJlCi0JCQkJLy8gZm9ybWF0dGVkCi0JCQkJSURPTU5vZGUgY3VycmVudERPTU5vZGUgPSAoSURPTU5vZGUpIGN1cnJlbnRJbmRleGVkUmVnaW9uOwotCQkJCURPTVJlZ2lvbiBkb21SZWdpb24gPSBuZXcgRE9NUmVnaW9uKCk7Ci0JCQkJZG9tUmVnaW9uLmRvY3VtZW50UmVnaW9uID0gY3VycmVudFJlZ2lvbjsKLQkJCQlkb21SZWdpb24uZG9tTm9kZSA9IGN1cnJlbnRET01Ob2RlOwotCQkJCQotCQkJCVhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBwYXJlbnRDb25zdHJhaW50cyA9IGdldFJlZ2lvbkNvbnN0cmFpbnRzKGN1cnJlbnRET01Ob2RlKTsKLQkJCQkKLQkJCQkvKiBpZiB0aGUgd2hpdGVzcGFjZSBzdHJhdGVneSBpcyBkZWNsYXJlZCBhcyBkZWZhdWx0LCBnZXQgaXQgZnJvbSB0aGUgcHJlZmVyZW5jZXMgKi8KLQkJCQlpZihYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuREVGQVVMVC5lcXVhbHMocGFyZW50Q29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpKQotCQkJCQlwYXJlbnRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3kocHJlZmVyZW5jZXMuZ2V0RWxlbWVudFdoaXRlc3BhY2VTdHJhdGVneSgpKTsKLQkJCQkKLQkJCQkvLyBUT0RPOiBpbml0aWFsaXplIGluZGVudExldmVsCi0JCQkJLy8gaW5pdGlhbGl6ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJCWludCBsaW5lV2lkdGggPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRNYXhMaW5lV2lkdGgoKTsKLQkJCQl0cnkgewotCQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoc3RhcnRPZmZzZXQpOwotCQkJCQlsaW5lV2lkdGggPSBsaW5lV2lkdGggLSAoc3RhcnRPZmZzZXQgLSBsaW5lSW5mby5nZXRPZmZzZXQoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGxpbmVXaWR0aCk7Ci0KLQkJCQkvLyBmb3JtYXQgYWxsIHNpYmxpbmdzIChhbmQgdGhlaXIgY2hpbGRyZW4pIGFzIGxvbmcgdGhleQotCQkJCS8vIG92ZXJsYXAgd2l0aCBzdGFydC9sZW5ndGgKLQkJCQlQb3NpdGlvbiBmb3JtYXRSYW5nZSA9IG5ldyBQb3NpdGlvbihzdGFydCwgbGVuZ3RoKTsKLQkJCQlmb3JtYXRTaWJsaW5ncyhlZGl0LCBkb21SZWdpb24sIHBhcmVudENvbnN0cmFpbnRzLCBmb3JtYXRSYW5nZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXQ7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB0aGUgZm9ybWF0dGluZyBjb25zdHJhaW50cyBmb3IgYSBzcGVjaWZpZWQgbm9kZSBiYXNlZCBvbgotCSAqIGl0cyBhbmNlc3RvcnMnIGZvcm1hdHRpbmcuIEluIHBhcnRpY3VsYXIsIGlmIGFueSBhbmNlc3RvciBub2RlIGVpdGhlcgotCSAqIGV4cGxpY2l0bHkgZGVmaW5lcyB3aGl0ZXNwYWNlIHByZXNlcnZhdGlvbiBvciBpZ25vcmFuY2UsIHRoYXQKLQkgKiB3aGl0ZXNwYWNlIHN0cmF0ZWd5IHNob3VsZCBiZSB1c2VkIGZvciA8Y29kZT5jdXJyZW50Tm9kZTwvY29kZT4gYW5kIAotCSAqIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMuCi0JICogCi0JICogQHBhcmFtIGN1cnJlbnROb2RlIHRoZSBub2RlIHRvIGludmVzdGlnYXRlIHRoZSBhbmNlc3RyeSBvZiB0byBkZXRlcm1pbmUKLQkgKiBmb3JtYXR0aW5nIGNvbnN0cmFpbnRzCi0JICogCi0JICogQHJldHVybiBmb3JtYXR0aW5nIGNvbnN0cmFpbnRzIGRlZmluZWQgYnkgYW4gYW5jZXN0b3IKLQkgKi8KLQlwcml2YXRlIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBnZXRSZWdpb25Db25zdHJhaW50cyhJRE9NTm9kZSBjdXJyZW50Tm9kZSkgewotCQlJRE9NTm9kZSBpdGVyYXRvciA9IGN1cnJlbnROb2RlOwotCQlYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcmVzdWx0ID0gbmV3IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cygpOwotCQlET01SZWdpb24gcmVnaW9uID0gbmV3IERPTVJlZ2lvbigpOwotCQlYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMgPSBuZXcgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzKCk7Ci0JCWJvb2xlYW4gcGFyZW50ID0gdHJ1ZTsKLQkJCi0JCS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYW5jZXN0cnkgdG8gZmluZCBpZiBhbnkgZXhwbGljaXQgd2hpdGVzcGFjZSBzdHJhdGVneSBoYXMKLQkJICogYmVlbiBkZWZpbmVkCi0JCSAqLwotCQl3aGlsZShpdGVyYXRvciAhPSBudWxsICYmIGl0ZXJhdG9yLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlpdGVyYXRvciA9IChJRE9NTm9kZSkgaXRlcmF0b3IuZ2V0UGFyZW50Tm9kZSgpOwotCQkJcmVnaW9uLmRvbU5vZGUgPSBpdGVyYXRvcjsKLQkJCXJlZ2lvbi5kb2N1bWVudFJlZ2lvbiA9IGl0ZXJhdG9yLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkKLQkJCXVwZGF0ZUZvcm1hdHRpbmdDb25zdHJhaW50cyhudWxsLCBudWxsLCByZXN1bHQsIHJlZ2lvbik7Ci0JCQkKLQkJCS8qIElmIHRoaXMgaXMgdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlLCBrZWVwIHRoZSBjb25zdHJhaW50cwotCQkJICogaW4gY2FzZSBubyBvdGhlciBjb25zdHJhaW50cyBhcmUgaWRlbnRpZmllZAotCQkJICovCi0JCQlpZihwYXJlbnQpIHsKLQkJCQlwYXJlbnRDb25zdHJhaW50cy5jb3B5Q29uc3RyYWludHMocmVzdWx0KTsKLQkJCQlwYXJlbnQgPSBmYWxzZTsKLQkJCX0KLQkJCQotCQkJLyogQSBwYXJlbnQgd2hvIGhhcyBkZWZpbmVkIGEgc3BlY2lmaWMgd2hpdGVzcGFjZSBzdHJhdGVneSB3YXMgZm91bmQgKi8KLQkJCWlmKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5QUkVTRVJWRS5lcXVhbHMocmVzdWx0LmdldFdoaXRlc3BhY2VTdHJhdGVneSgpKSB8fCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuREVGQVVMVC5lcXVhbHMocmVzdWx0LmdldFdoaXRlc3BhY2VTdHJhdGVneSgpKSkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXR1cm4gcGFyZW50Q29uc3RyYWludHM7Ci0JfQotLy8JcHJpdmF0ZSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgZ2V0UmVnaW9uQ29uc3RyYWludHMoSURPTU5vZGUgY3VycmVudE5vZGUpIHsKLS8vCQlJRE9NTm9kZSBpdGVyYXRvciA9IChJRE9NTm9kZSkgY3VycmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotLy8JCVhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyByZXN1bHQgPSBuZXcgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzKCk7Ci0vLwkJRE9NUmVnaW9uIHJlZ2lvbiA9IG5ldyBET01SZWdpb24oKTsKLS8vCQkKLS8vCQkvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGFuY2VzdHJ5IHRvIGZpbmQgaWYgYW55IGV4cGxpY2l0IHdoaXRlc3BhY2Ugc3RyYXRlZ3kgaGFzCi0vLwkJICogYmVlbiBkZWZpbmVkCi0vLwkJICovCi0vLwkJd2hpbGUoaXRlcmF0b3IgIT0gbnVsbCAmJiBpdGVyYXRvci5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCi0vLwkJCXJlZ2lvbi5kb21Ob2RlID0gaXRlcmF0b3I7Ci0vLwkJCXJlZ2lvbi5kb2N1bWVudFJlZ2lvbiA9IGl0ZXJhdG9yLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0vLwkJCQotLy8JCQl1cGRhdGVGb3JtYXR0aW5nQ29uc3RyYWludHMobnVsbCwgbnVsbCwgcmVzdWx0LCByZWdpb24pOwotLy8JCQkKLS8vCQkJLyogQSBwYXJlbnQgd2hvIGhhcyBkZWZpbmVkIGEgc3BlY2lmaWMgd2hpdGVzcGFjZSBzdHJhdGVneSB3YXMgZm91bmQgKi8KLS8vCQkJaWYoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFID09IHJlc3VsdC5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKSB8fCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuREVGQVVMVCA9PSByZXN1bHQuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpCi0vLwkJCQlyZXR1cm4gcmVzdWx0OwotLy8JCQkKLS8vCQkJaXRlcmF0b3IgPSAoSURPTU5vZGUpIGl0ZXJhdG9yLmdldFBhcmVudE5vZGUoKTsKLS8vCQl9Ci0vLwkJCi0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0JCi0JLyoqCi0JICogRm9ybWF0cyB0aGUgZ2l2ZW4geG1sIGNvbnRlbnQgcmVnaW9uCi0JICogCi0JICogQHBhcmFtIHRleHRFZGl0Ci0JICogQHBhcmFtIGZvcm1hdFJhbmdlCi0JICogQHBhcmFtIHBhcmVudENvbnN0cmFpbnRzCi0JICogQHBhcmFtIGN1cnJlbnRET01SZWdpb24KLQkgKiBAcGFyYW0gcHJldmlvdXNSZWdpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgZm9ybWF0Q29udGVudChUZXh0RWRpdCB0ZXh0RWRpdCwgUG9zaXRpb24gZm9ybWF0UmFuZ2UsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBwYXJlbnRDb25zdHJhaW50cywgRE9NUmVnaW9uIGN1cnJlbnRET01SZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gY3VycmVudERPTVJlZ2lvbi5kb2N1bWVudFJlZ2lvbjsKLQkJU3RyaW5nIGZ1bGxUZXh0ID0gY3VycmVudERPTVJlZ2lvbi5kb21Ob2RlLmdldFNvdXJjZSgpOwotCi0JCS8vIGNoZWNrIGlmIGluIHByZXNlcnZlIHNwYWNlIG1vZGUsIGlmIHNvLCBkb24ndCB0b3VjaCBhbnl0aGluZyBidXQKLQkJLy8gbWFrZSBzdXJlIHRvIHVwZGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQlTdHJpbmcgd2hpdGVzcGFjZU1vZGUgPSBwYXJlbnRDb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKTsKLQkJaWYgKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5QUkVTRVJWRS5lcXVhbHMod2hpdGVzcGFjZU1vZGUpKSB7Ci0JCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gcGFyZW50Q29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCk7Ci0JCQlhdmFpbGFibGVMaW5lV2lkdGggPSB1cGRhdGVMaW5lV2lkdGhXaXRoTGFzdExpbmUoZnVsbFRleHQsIGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0KLQkJCS8vIHVwZGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aCBpbiBjb25zdHJhaW50cwotCQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JCQkvLyBBIHRleHQgbm9kZSBjYW4gY29udGFpbiBtdWx0aXBsZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbnMgLSBzeW5jIHRoZSBkb2N1bWVudFJlZ2lvbgotCQkJLy8gd2l0aCB0aGUgbGFzdCByZWdpb24gb2YgdGhlIG5vZGUgc2luY2UgdGhlIHRleHQgZnJvbSBhbGwgcmVnaW9ucyB3YXMgZm9ybWF0dGVkCi0JCQljdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uID0gY3VycmVudERPTVJlZ2lvbi5kb21Ob2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGlmIGNvbnRlbnQgaXMganVzdCB3aGl0ZXNwYWNlIGFuZCB0aGVyZSdzIHNvbWV0aGluZyBhZnRlciBpdAotCQkvLyBqdXN0IHNraXAgb3ZlciB0aGlzIHJlZ2lvbiBiZWNhdXNlIHJlZ2lvbiB3aWxsIHRha2UgY2FyZSBvZiBpdAotCQlib29sZWFuIGlzQWxsV2hpdGVzcGFjZSA9ICgoSURPTVRleHQpIGN1cnJlbnRET01SZWdpb24uZG9tTm9kZSkuaXNFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0RG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQlpZiAoaXNBbGxXaGl0ZXNwYWNlKSB7Ci0JCQlwYXJlbnRDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoZlByZWZlcmVuY2VzLmdldE1heExpbmVXaWR0aCgpKTsKLQkJCW5leHREb2N1bWVudFJlZ2lvbiA9IGN1cnJlbnRSZWdpb24uZ2V0TmV4dCgpOwotCQkJaWYgKG5leHREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHNwZWNpYWwgaGFuZGxpbmcgaWYgdGV4dCBmb2xsb3dzIGFuIGVudGl0eSBvciBjZGF0YSByZWdpb24KLQkJaWYgKCFYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuQ09MTEFQU0UuZXF1YWxzKHdoaXRlc3BhY2VNb2RlKSAmJiBwcmV2aW91c1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJldmlvdVJlZ2lvblR5cGUgPSBwcmV2aW91c1JlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRS5lcXVhbHMocHJldmlvdVJlZ2lvblR5cGUpIHx8IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQuZXF1YWxzKHByZXZpb3VSZWdpb25UeXBlKSkKLQkJCQl3aGl0ZXNwYWNlTW9kZSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5DT0xMQVBTRTsKLQkJfQotCQkvLyBhbHNvLCBzcGVjaWFsIGhhbmRsaW5nIGlmIHRleHQgaXMgYmVmb3JlIGFuIGVudGl0eSBvciBjZGF0YSByZWdpb24KLQkJaWYgKCFYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuQ09MTEFQU0UuZXF1YWxzKHdoaXRlc3BhY2VNb2RlKSkgewotCQkJLy8gZ2V0IG5leHQgZG9jdW1lbnQgcmVnaW9uIGlmIGRvbnQgYWxyZWFkeSBoYXZlIGl0Ci0JCQlpZiAobmV4dERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQkJbmV4dERvY3VtZW50UmVnaW9uID0gY3VycmVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCQlpZiAobmV4dERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmV4dFJlZ2lvblR5cGUgPSBuZXh0RG9jdW1lbnRSZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFLmVxdWFscyhuZXh0UmVnaW9uVHlwZSkgfHwgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVC5lcXVhbHMobmV4dFJlZ2lvblR5cGUpKQotCQkJCQl3aGl0ZXNwYWNlTW9kZSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5DT0xMQVBTRTsKLQkJCX0KLQkJfQotCQlmb3JtYXRUZXh0SW5Db250ZW50KHRleHRFZGl0LCBwYXJlbnRDb25zdHJhaW50cywgY3VycmVudFJlZ2lvbiwgZnVsbFRleHQsIHdoaXRlc3BhY2VNb2RlKTsKLQkJLy8gQSB0ZXh0IG5vZGUgY2FuIGNvbnRhaW4gbXVsdGlwbGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zIC0gc3luYyB0aGUgZG9jdW1lbnRSZWdpb24KLQkJLy8gd2l0aCB0aGUgbGFzdCByZWdpb24gb2YgdGhlIG5vZGUgc2luY2UgdGhlIHRleHQgZnJvbSBhbGwgcmVnaW9ucyB3YXMgZm9ybWF0dGVkCi0JCWN1cnJlbnRET01SZWdpb24uZG9jdW1lbnRSZWdpb24gPSBjdXJyZW50RE9NUmVnaW9uLmRvbU5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmb3JtYXRFbXB0eVN0YXJ0VGFnV2l0aE5vQXR0cihUZXh0RWRpdCB0ZXh0RWRpdCwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c0RvY3VtZW50UmVnaW9uLCBpbnQgYXZhaWxhYmxlTGluZVdpZHRoLCBTdHJpbmcgaW5kZW50U3RyYXRlZ3ksIFN0cmluZyB3aGl0ZXNwYWNlU3RyYXRlZ3ksIElUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uKSB7Ci0JCS8vIGdldCBwcmVmZXJlbmNlIGlmIHRoZXJlIHNob3VsZCBiZSBhIHNwYWNlIG9yIG5vdCBiZXR3ZWVuIHRhZwotCQkvLyBuYW1lIGFuZCBlbXB0eSB0YWcgY2xvc2UKLQkJLy8gPHRhZ05hbWUgLz4KLQkJYm9vbGVhbiBvbmVTcGFjZUluVGFnTmFtZSA9IGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldFNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZygpOwotCi0JCS8vIGNhbGN1bGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQlpbnQgdGFnTmFtZUxpbmVXaWR0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSArIDM7Ci0JCWlmIChvbmVTcGFjZUluVGFnTmFtZSkgewotCQkJLy8gYWRkIG9uZSBtb3JlIHRvIGFjY291bnQgZm9yIHNwYWNlIGJlZm9yZSBlbXB0eSB0YWcgY2xvc2UKLQkJCSsrdGFnTmFtZUxpbmVXaWR0aDsKLQkJfQotCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gdGFnTmFtZUxpbmVXaWR0aDsKLQotCQlpZiAoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOTElORS5lcXVhbHMoaW5kZW50U3RyYXRlZ3kpKSB7Ci0JCQkvLyBpZiB3YXMgaW5saW5pbmcsIG5lZWQgdG8gY2hlY2sgaWYgb3V0IG9mIGF2YWlsYWJsZSBsaW5lCi0JCQkvLyB3aWR0aAotCQkJaWYgKGF2YWlsYWJsZUxpbmVXaWR0aCA8IDApIHsKLQkJCQkvLyBuZWVkIHRvIGluZGVudCBpZiBwb3NzaWJsZQotCQkJCWludCBsaW5lV2lkdGggPSBpbmRlbnRJZlBvc3NpYmxlKHRleHRFZGl0LCBjb25zdHJhaW50cywgY3VycmVudERvY3VtZW50UmVnaW9uLCBwcmV2aW91c0RvY3VtZW50UmVnaW9uLCB3aGl0ZXNwYWNlU3RyYXRlZ3ksIGluZGVudFN0cmF0ZWd5LCB0cnVlKTsKLQkJCQkvLyB1cGRhdGUgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJCQlpZiAobGluZVdpZHRoID4gMCkKLQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gbGluZVdpZHRoIC0gdGFnTmFtZUxpbmVXaWR0aDsKLQkJCQllbHNlCi0JCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSB0YWdOYW1lTGluZVdpZHRoOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbm8gbmVlZCB0byBpbmRlbnQKLQkJCQkvLyBqdXN0IG1ha2Ugc3VyZSB0byBkZWxldGUgcHJldmlvdXMgd2hpdGVzcGFjZSBpZgotCQkJCS8vIG5lZWRlZAotCQkJCWlmICgoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVC5lcXVhbHMocHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRUeXBlKCkpKSAmJiAocHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBjb2xsYXBzZVNwYWNlcyh0ZXh0RWRpdCwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBhdmFpbGFibGVMaW5lV2lkdGgsIHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0RnVsbFRleHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZGVsZXRlIGFueSB0cmFpbCBzcGFjZXMgYWZ0ZXIgdGFnIG5hbWUKLQkJaW50IHRleHRMZW5ndGggPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCWludCByZWdpb25MZW5ndGggPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQotCQlib29sZWFuIHRoZXJlQXJlU3BhY2VzID0gdGV4dExlbmd0aCA8IHJlZ2lvbkxlbmd0aDsKLQkJaWYgKCFvbmVTcGFjZUluVGFnTmFtZSAmJiB0aGVyZUFyZVNwYWNlcykgewotCQkJZGVsZXRlVHJhaWxpbmdTcGFjZXModGV4dEVkaXQsIGN1cnJlbnRUZXh0UmVnaW9uLCBjdXJyZW50RG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYob25lU3BhY2VJblRhZ05hbWUpIHsKLQkJCWluc2VydFNwYWNlQW5kQ29sbGFwc2UodGV4dEVkaXQsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgYXZhaWxhYmxlTGluZVdpZHRoLCBjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCX0KLQkJY29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyBhbiBlbmQgdGFnCi0JICogCi0JICogQHBhcmFtIHRleHRFZGl0Ci0JICogQHBhcmFtIGN1cnJlbnRSZWdpb24KLQkgKiBAcGFyYW0gdGV4dFJlZ2lvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZm9ybWF0RW5kVGFnKFRleHRFZGl0IHRleHRFZGl0LCBQb3NpdGlvbiBmb3JtYXRSYW5nZSwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzLCBET01SZWdpb24gY3VycmVudERPTVJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c0RvY3VtZW50UmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudERvY3VtZW50UmVnaW9uID0gY3VycmVudERPTVJlZ2lvbi5kb2N1bWVudFJlZ2lvbjsKLQotCQlTdHJpbmcgd2hpdGVzcGFjZVN0cmF0ZWd5ID0gY29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCk7Ci0JCVN0cmluZyBpbmRlbnRTdHJhdGVneSA9IGNvbnN0cmFpbnRzLmdldEluZGVudFN0cmF0ZWd5KCk7Ci0KLQkJLy8gZG8gbm90IGZvcm1hdCBzcGFjZSBiZWZvcmUgc3RhcnQgdGFnIGlmIHByZXNlcnZpbmcgc3BhY2VzCi0JCWlmICh3aGl0ZXNwYWNlU3RyYXRlZ3kgIT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFKSB7Ci0JCQkvLyBmb3JtYXQgbGlrZSBpbmRlbnQgc3RyYXRlZ3kgc2F5cwotCQkJaWYgKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkRFTlQuZXF1YWxzKGluZGVudFN0cmF0ZWd5KSB8fCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuTkVXX0xJTkUuZXF1YWxzKGluZGVudFN0cmF0ZWd5KSkgewotCQkJCWludCBhdmFpbGFibGVMaW5lV2lkdGggPSBpbmRlbnRJZlBvc3NpYmxlKHRleHRFZGl0LCBjb25zdHJhaW50cywgY3VycmVudERvY3VtZW50UmVnaW9uLCBwcmV2aW91c0RvY3VtZW50UmVnaW9uLCB3aGl0ZXNwYWNlU3RyYXRlZ3ksIGluZGVudFN0cmF0ZWd5LCBmYWxzZSk7Ci0JCQkJY29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JCQl9Ci0JCQllbHNlIGlmICggWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOTElORS5lcXVhbHMoaW5kZW50U3RyYXRlZ3kpKXsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXRQYXJlbnREb2N1bWVudCgpOwotCQkJCWludCBjdXJyZW50TGluZSA9IGRvYy5nZXRMaW5lT2ZPZmZzZXQoY3VycmVudERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCWludCBwcmV2TGluZSA9IGRvYy5nZXRMaW5lT2ZPZmZzZXQocHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlpZiAoIGN1cnJlbnRMaW5lICE9IHByZXZMaW5lKXsKLQkJCQkJaW50IGF2YWlsYWJsZUxpbmVXaWR0aCA9IGluZGVudElmUG9zc2libGUodGV4dEVkaXQsIGNvbnN0cmFpbnRzLCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIHByZXZpb3VzRG9jdW1lbnRSZWdpb24sIHdoaXRlc3BhY2VTdHJhdGVneSwgaW5kZW50U3RyYXRlZ3ksIGZhbHNlKTsKLQkJCQkJY29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGZvcm1hdCB0aGUgZW5kIHRhZyBpdHNlbGYKLQkJZm9ybWF0V2l0aGluRW5kVGFnKHRleHRFZGl0LCBjb25zdHJhaW50cywgY3VycmVudERvY3VtZW50UmVnaW9uLCBwcmV2aW91c0RvY3VtZW50UmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIHRoZSBnaXZlbiByZWdpb24gKGFuZCBhbGwgaXRzIGNoaWxkcmVuKSBjb250YWluZWQgaW4gZG9tUmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0Ci0JICogICAgICAgICAgICBlZGl0cyByZXF1aXJlZCB0byBmb3JtYXQKLQkgKiBAcGFyYW0gZm9ybWF0UmFuZ2UKLQkgKiAgICAgICAgICAgIGRvY3VtZW50IHJhbmdlIHRvIGZvcm1hdCAob25seSBmb3JtYXQgY29udGVudCB3aXRoaW4gdGhpcwotCSAqICAgICAgICAgICAgcmFuZ2UpCi0JICogQHBhcmFtIHBhcmVudENvbnN0cmFpbnRzCi0JICogQHBhcmFtIGRvbVJlZ2lvbgotCSAqICAgICAgICAgICAgYXNzdW1lcyBkb20gbm9kZSAmIHJlZ2lvbiBhcmUgbm90IG51bGwKLQkgKiBAcGFyYW0gcHJldmlvdXNSZWdpb24KLQkgKiAgICAgICAgICAgIGNvdWxkIGJlIG51bGwKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxhc3QgcmVnaW9uIGZvcm1hdHRlZAotCSAqLwotCXByaXZhdGUgRE9NUmVnaW9uIGZvcm1hdFJlZ2lvbihUZXh0RWRpdCBlZGl0LCBQb3NpdGlvbiBmb3JtYXRSYW5nZSwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHBhcmVudENvbnN0cmFpbnRzLCBET01SZWdpb24gZG9tUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzUmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGRvbVJlZ2lvbi5kb2N1bWVudFJlZ2lvbjsKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBjdXJyZW50UmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLmVxdWFscyhyZWdpb25UeXBlKSkgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IGN1cnJlbnRSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKTsKLQkJCVN0cmluZyB0ZXh0UmVnaW9uVHlwZSA9IHRleHRSZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOLmVxdWFscyh0ZXh0UmVnaW9uVHlwZSkpIHsKLQkJCQlkb21SZWdpb24gPSBmb3JtYXRTdGFydFRhZyhlZGl0LCBmb3JtYXRSYW5nZSwgcGFyZW50Q29uc3RyYWludHMsIGRvbVJlZ2lvbiwgcHJldmlvdXNSZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOLmVxdWFscyh0ZXh0UmVnaW9uVHlwZSkpIHsKLQkJCQlmb3JtYXRFbmRUYWcoZWRpdCwgZm9ybWF0UmFuZ2UsIHBhcmVudENvbnN0cmFpbnRzLCBkb21SZWdpb24sIHByZXZpb3VzUmVnaW9uKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5ULmVxdWFscyhyZWdpb25UeXBlKSB8fCBkb21SZWdpb24uZG9tTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlmb3JtYXRDb250ZW50KGVkaXQsIGZvcm1hdFJhbmdlLCBwYXJlbnRDb25zdHJhaW50cywgZG9tUmVnaW9uLCBwcmV2aW91c1JlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhULmVxdWFscyhyZWdpb25UeXBlKSkgewotCQkJZm9ybWF0Q29tbWVudChlZGl0LCBmb3JtYXRSYW5nZSwgcGFyZW50Q29uc3RyYWludHMsIGRvbVJlZ2lvbiwgcHJldmlvdXNSZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gdW5rbm93biwgc28ganVzdCBsZWF2ZSBhbG9uZSBmb3Igbm93IGJ1dCBtYWtlIHN1cmUgdG8gdXBkYXRlCi0JCQkvLyBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJU3RyaW5nIGZ1bGxUZXh0ID0gY3VycmVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQkJaW50IHdpZHRoID0gdXBkYXRlTGluZVdpZHRoV2l0aExhc3RMaW5lKGZ1bGxUZXh0LCBwYXJlbnRDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSk7Ci0JCQlwYXJlbnRDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgod2lkdGgpOwotCQl9Ci0JCXJldHVybiBkb21SZWdpb247Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyB0aGUgZG9tUmVnaW9uIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuIGFuZCBzaWJsaW5ncwotCSAqIAotCSAqIEBwYXJhbSBlZGl0Ci0JICogQHBhcmFtIGRvbVJlZ2lvbgotCSAqIEBwYXJhbSBwYXJlbnRDb25zdHJhaW50cwotCSAqIEBwYXJhbSBmb3JtYXRSYW5nZQotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRTaWJsaW5ncyhUZXh0RWRpdCBlZGl0LCBET01SZWdpb24gZG9tUmVnaW9uLCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMsIFBvc2l0aW9uIGZvcm1hdFJhbmdlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNSZWdpb24gPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBkb21SZWdpb24uZG9jdW1lbnRSZWdpb247Ci0JCUlET01Ob2RlIGN1cnJlbnRET01Ob2RlID0gZG9tUmVnaW9uLmRvbU5vZGU7Ci0JCXdoaWxlIChjdXJyZW50RE9NTm9kZSAhPSBudWxsICYmIGN1cnJlbnRSZWdpb24gIT0gbnVsbCAmJiBmb3JtYXRSYW5nZS5vdmVybGFwc1dpdGgoY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50UmVnaW9uLmdldExlbmd0aCgpKSAmJiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsIHx8ICFmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkpIHsKLQkJCWRvbVJlZ2lvbi5kb2N1bWVudFJlZ2lvbiA9IGN1cnJlbnRSZWdpb247Ci0JCQlkb21SZWdpb24uZG9tTm9kZSA9IGN1cnJlbnRET01Ob2RlOwotCi0JCQkvLyBuZWVkIHRvIG1ha2Ugc3VyZSBjdXJyZW50IGRvY3VtZW50IHJlZ2lvbiBhbmQgY3VycmVudAotCQkJLy8gZG9tIG5vZGUgbWF0Y2ggdXAKLQkJCWlmIChjdXJyZW50RE9NTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmVxdWFscyhjdXJyZW50UmVnaW9uKSkgewotCQkJCS8vIGZvcm1hdCB0aGlzIGRvY3VtZW50IHJlZ2lvbi9ub2RlLCBmb3JtYXRSZWdpb24gd2lsbAotCQkJCS8vIHJldHVybiB0aGUgbGFzdCBub2RlL3JlZ2lvbiBmb3JtYXR0ZWQKLQkJCQlkb21SZWdpb24gPSBmb3JtYXRSZWdpb24oZWRpdCwgZm9ybWF0UmFuZ2UsIHBhcmVudENvbnN0cmFpbnRzLCBkb21SZWdpb24sIHByZXZpb3VzUmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIFRPRE86IG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvIGlmIHRoZXkgZG9uJ3QKLQkJCQkvLyBtYXRjaCB1cAotCQkJfQotCQkJcHJldmlvdXNSZWdpb24gPSBkb21SZWdpb24uZG9jdW1lbnRSZWdpb247Ci0JCQkvLyBnZXQgdGhlIG5leHQgc2libGluZyBpbmZvcm1hdGlvbgotCQkJaWYgKGRvbVJlZ2lvbi5kb21Ob2RlICE9IG51bGwpCi0JCQkJY3VycmVudERPTU5vZGUgPSAoSURPTU5vZGUpIGRvbVJlZ2lvbi5kb21Ob2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQllbHNlCi0JCQkJY3VycmVudERPTU5vZGUgPSBudWxsOwotCQkJY3VycmVudFJlZ2lvbiA9IHByZXZpb3VzUmVnaW9uLmdldE5leHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgYSBzdGFydCB0YWcKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dEVkaXQKLQkgKiBAcGFyYW0gY3VycmVudFJlZ2lvbgotCSAqIEBwYXJhbSB0ZXh0UmVnaW9ucwotCSAqLwotCXByaXZhdGUgRE9NUmVnaW9uIGZvcm1hdFN0YXJ0VGFnKFRleHRFZGl0IHRleHRFZGl0LCBQb3NpdGlvbiBmb3JtYXRSYW5nZSwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHBhcmVudENvbnN0cmFpbnRzLCBET01SZWdpb24gY3VycmVudERPTVJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c0RvY3VtZW50UmVnaW9uKSB7Ci0JCS8vIGRldGVybWluZSBwcm9wZXIgaW5kZW50IGJ5IHJlZmVycmluZyB0byBwYXJlbnQgY29uc3RyYWludHMsCi0JCS8vIHByZXZpb3VzIG5vZGUsIGFuZCBjdXJyZW50IG5vZGUKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24gPSBjdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uOwotCQlJRE9NTm9kZSBjdXJyZW50RE9NTm9kZSA9IGN1cnJlbnRET01SZWdpb24uZG9tTm9kZTsKLQotCQkvLyBjcmVhdGUgYSBjb25zdHJhaW50IGZvciB0aGlzIHRhZwotCQlYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgdGhpc0NvbnN0cmFpbnRzID0gbmV3IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cygpOwotCQlYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgY2hpbGRyZW5Db25zdHJhaW50cyA9IG5ldyBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMoKTsKLQkJdXBkYXRlRm9ybWF0dGluZ0NvbnN0cmFpbnRzKHBhcmVudENvbnN0cmFpbnRzLCB0aGlzQ29uc3RyYWludHMsIGNoaWxkcmVuQ29uc3RyYWludHMsIGN1cnJlbnRET01SZWdpb24pOwotCi0JCWlmKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ERUZBVUxULmVxdWFscyhjaGlsZHJlbkNvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpKSkKLQkJCWNoaWxkcmVuQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KChuZXcgWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkpLmdldEVsZW1lbnRXaGl0ZXNwYWNlU3RyYXRlZ3koKSk7Ci0JCQkKLQkJU3RyaW5nIHdoaXRlc3BhY2VTdHJhdGVneSA9IHRoaXNDb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKTsKLQkJU3RyaW5nIGluZGVudFN0cmF0ZWd5ID0gdGhpc0NvbnN0cmFpbnRzLmdldEluZGVudFN0cmF0ZWd5KCk7Ci0JCWludCBhdmFpbGFibGVMaW5lV2lkdGggPSB0aGlzQ29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCk7Ci0KLQkJLy8gZm9ybWF0IHNwYWNlIGJlZm9yZSBzdGFydCB0YWcKLQkJLy8gZG8gbm90IGZvcm1hdCBzcGFjZSBiZWZvcmUgc3RhcnQgdGFnIGlmIHByZXNlcnZpbmcgc3BhY2VzCi0JCWlmICghWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFLmVxdWFscyh3aGl0ZXNwYWNlU3RyYXRlZ3kpKSB7Ci0JCQkvLyBmb3JtYXQgbGlrZSBpbmRlbnQgc3RyYXRlZ3kgc2F5cwotCQkJaWYgKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkRFTlQuZXF1YWxzKGluZGVudFN0cmF0ZWd5KSB8fCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuTkVXX0xJTkUuZXF1YWxzKGluZGVudFN0cmF0ZWd5KSkgewotCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGluZGVudElmUG9zc2libGUodGV4dEVkaXQsIHRoaXNDb25zdHJhaW50cywgY3VycmVudERvY3VtZW50UmVnaW9uLCBwcmV2aW91c0RvY3VtZW50UmVnaW9uLCB3aGl0ZXNwYWNlU3RyYXRlZ3ksIGluZGVudFN0cmF0ZWd5LCB0cnVlKTsKLQkJCQlpZiAoYXZhaWxhYmxlTGluZVdpZHRoID4gMCkKLQkJCQkJdGhpc0NvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCQkJfQotCQl9Ci0JCS8vIGZvcm1hdCB0aGUgc3RhcnQgdGFnIGl0c2VsZgotCQlib29sZWFuIHRhZ0VuZGVkID0gZm9ybWF0V2l0aGluVGFnKHRleHRFZGl0LCB0aGlzQ29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbik7Ci0KLQkJLy8gZm9ybWF0IGNoaWxkcmVuCi0JCWlmICghdGFnRW5kZWQpIHsKLQkJCS8vIHVwZGF0ZSBjaGlsZENvbnN0cmFpbnRzIHdpdGggdGhpc0NvbnN0cmFpbnQncyBpbmRlbnRMZXZlbCAmCi0JCQkvLyBhdmFpbGFibGVMaW5lV2lkdGgKLQkJCWNoaWxkcmVuQ29uc3RyYWludHMuc2V0SW5kZW50TGV2ZWwodGhpc0NvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCkpOwotCQkJY2hpbGRyZW5Db25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgodGhpc0NvbnN0cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpKTsKLQotCQkJcHJldmlvdXNEb2N1bWVudFJlZ2lvbiA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbjsKLQkJCUlET01Ob2RlIGNoaWxkRE9NTm9kZSA9IChJRE9NTm9kZSkgY3VycmVudERPTU5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0UmVnaW9uID0gY3VycmVudERvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJCWJvb2xlYW4gcGFzc2VkRm9ybWF0UmFuZ2UgPSBmYWxzZTsKLQkJCS8vIGFzIGxvbmcgYXMgdGhlcmUgaXMgb25lIGNoaWxkCi0JCQlpZiAoY2hpbGRET01Ob2RlICE9IG51bGwgJiYgbmV4dFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJd2hpbGUgKGNoaWxkRE9NTm9kZSAhPSBudWxsICYmIG5leHRSZWdpb24gIT0gbnVsbCAmJiAhcGFzc2VkRm9ybWF0UmFuZ2UgJiYgKGZQcm9ncmVzc01vbml0b3IgPT0gbnVsbCB8fCAhZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpKSB7Ci0JCQkJCURPTVJlZ2lvbiBjaGlsZERPTVJlZ2lvbiA9IG5ldyBET01SZWdpb24oKTsKLQkJCQkJY2hpbGRET01SZWdpb24uZG9jdW1lbnRSZWdpb24gPSBuZXh0UmVnaW9uOwotCQkJCQljaGlsZERPTVJlZ2lvbi5kb21Ob2RlID0gY2hpbGRET01Ob2RlOwotCQkJCQlpZiAobmV4dFJlZ2lvbi5lcXVhbHMoY2hpbGRET01Ob2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpKSB7Ci0JCQkJCQkvLyBmb3JtYXQgY2hpbGRyZW4uIHBhc3MgaW4gY2hpbGQgY29uc3RyYWludHMKLQkJCQkJCWNoaWxkRE9NUmVnaW9uID0gZm9ybWF0UmVnaW9uKHRleHRFZGl0LCBmb3JtYXRSYW5nZSwgY2hpbGRyZW5Db25zdHJhaW50cywgY2hpbGRET01SZWdpb24sIHByZXZpb3VzRG9jdW1lbnRSZWdpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gVE9ETzogd2hhdCBoYXBwZW5zIGlmIHRoZXkgZG9udCBtYXRjaCB1cD8KLQkJCQkJfQotCi0JCQkJCS8vIHVwZGF0ZSBjaGlsZERPTVJlZ2lvbiB3aXRoIG5leHQgZG9tL3JlZ2lvbiBub2RlCi0JCQkJCWlmIChjaGlsZERPTVJlZ2lvbi5kb21Ob2RlICE9IG51bGwpIHsKLQkJCQkJCWNoaWxkRE9NTm9kZSA9IChJRE9NTm9kZSkgY2hpbGRET01SZWdpb24uZG9tTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY2hpbGRET01Ob2RlID0gbnVsbDsKLQkJCQkJfQotCQkJCQlwcmV2aW91c0RvY3VtZW50UmVnaW9uID0gY2hpbGRET01SZWdpb24uZG9jdW1lbnRSZWdpb247Ci0JCQkJCW5leHRSZWdpb24gPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJCQkJaWYgKG5leHRSZWdpb24gIT0gbnVsbCkKLQkJCQkJCXBhc3NlZEZvcm1hdFJhbmdlID0gIWZvcm1hdFJhbmdlLm92ZXJsYXBzV2l0aChuZXh0UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5leHRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHRoZXJlIHdlcmUgbm8gY2hpbGRyZW4sIHNvIGtlZXAgZW5kIHRhZyBpbmxpbmVkCi0JCQkJY2hpbGRyZW5Db25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkNPTExBUFNFKTsKLQkJCQljaGlsZHJlbkNvbnN0cmFpbnRzLnNldEluZGVudFN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkxJTkUpOwotCQkJfQotCi0JCQlpZiAoIXBhc3NlZEZvcm1hdFJhbmdlKSB7Ci0JCQkJLy8gdXBkYXRlIHRoZSBkb20gcmVnaW9uIHdpdGggdGhlIGxhc3QgZm9ybWF0dGVkIHJlZ2lvbi9kb20KLQkJCQkvLyBub2RlIHNob3VsZCBiZSBlbmQgdGFnIGFuZCB0aGlzIHRhZydzIERPTU5vZGUKLQkJCQljdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uID0gbmV4dFJlZ2lvbjsKLQkJCQljdXJyZW50RE9NUmVnaW9uLmRvbU5vZGUgPSBjdXJyZW50RE9NTm9kZTsKLQotCQkJCS8vIGVuZCB0YWcncyBpbmRlbnQgbGV2ZWwgc2hvdWxkIGJlIHNhbWUgYXMgc3RhcnQgdGFnJ3MKLQkJCQljaGlsZHJlbkNvbnN0cmFpbnRzLnNldEluZGVudExldmVsKHRoaXNDb25zdHJhaW50cy5nZXRJbmRlbnRMZXZlbCgpKTsKLQkJCQkvLyBmb3JtYXQgZW5kIHRhZwotCQkJCWJvb2xlYW4gZm9ybWF0RW5kVGFnID0gZmFsc2U7Ci0JCQkJaWYgKG5leHRSZWdpb24gIT0gbnVsbCAmJiBjdXJyZW50RE9NTm9kZSAhPSBudWxsKSB7Ci0JCQkJCUlUZXh0UmVnaW9uTGlzdCBycyA9IG5leHRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJCQlpZiAocnMuc2l6ZSgpID4gMSkgewotCQkJCQkJSVRleHRSZWdpb24gciA9IHJzLmdldCgwKTsKLQkJCQkJCWlmIChyICE9IG51bGwgJiYgRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOLmVxdWFscyhyLmdldFR5cGUoKSkpIHsKLQkJCQkJCQlyID0gcnMuZ2V0KDEpOwotCQkJCQkJCWlmIChyICE9IG51bGwgJiYgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUuZXF1YWxzKHIuZ2V0VHlwZSgpKSkgewotCQkJCQkJCQlTdHJpbmcgdGFnTmFtZSA9IG5leHRSZWdpb24uZ2V0VGV4dChyKTsKLQkJCQkJCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCAmJiB0YWdOYW1lLmVxdWFscyhjdXJyZW50RE9NTm9kZS5nZXROb2RlTmFtZSgpKSkKLQkJCQkJCQkJCWZvcm1hdEVuZFRhZyA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGZvcm1hdEVuZFRhZykKLQkJCQkJZm9ybWF0RW5kVGFnKHRleHRFZGl0LCBmb3JtYXRSYW5nZSwgY2hpbGRyZW5Db25zdHJhaW50cywgY3VycmVudERPTVJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbik7Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG1pc3NpbmcgZW5kIHRhZyBzbyByZXR1cm4gbGFzdCBmb3JtYXR0ZWQgZG9jdW1lbnQKLQkJCQkJLy8gcmVnaW9uCi0JCQkJCWN1cnJlbnRET01SZWdpb24uZG9jdW1lbnRSZWdpb24gPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHBhc3NlZCBmb3JtYXQgcmFuZ2UgYmVmb3JlIGNvdWxkIGZpbmlzaCwgc28gdXBkYXRlIGRvbQotCQkJCS8vIHJlZ2lvbiB0byBsYXN0IGtub3duIGZvcm1hdHRlZCByZWdpb24KLQkJCQljdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uID0gbmV4dFJlZ2lvbjsKLQkJCQljdXJyZW50RE9NUmVnaW9uLmRvbU5vZGUgPSBjaGlsZERPTU5vZGU7Ci0JCQl9Ci0KLQkJCS8vIHVwZGF0ZSBwYXJlbnQgY29uc3RyYWludCBzaW5jZSB0aGlzIGlzIHdoYXQgaXMgcGFzc2VkIGJhY2sKLQkJCXBhcmVudENvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChjaGlsZHJlbkNvbnN0cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHVwZGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKHRoaXNDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIGN1cnJlbnRET01SZWdpb247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdFN0YXJ0VGFnV2l0aE5vQXR0cihUZXh0RWRpdCB0ZXh0RWRpdCwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c0RvY3VtZW50UmVnaW9uLCBpbnQgYXZhaWxhYmxlTGluZVdpZHRoLCBTdHJpbmcgaW5kZW50U3RyYXRlZ3ksIFN0cmluZyB3aGl0ZXNwYWNlU3RyYXRlZ3ksIElUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uKSB7Ci0JCS8vIGNhbGN1bGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQlpbnQgdGFnTmFtZUxpbmVXaWR0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSArIDI7Ci0JCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSB0YWdOYW1lTGluZVdpZHRoOwotCi0JCWlmIChYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSU5MSU5FLmVxdWFscyhpbmRlbnRTdHJhdGVneSkpIHsKLQkJCS8vIGlmIHdhcyBpbmxpbmluZywgbmVlZCB0byBjaGVjayBpZiBvdXQgb2YgYXZhaWxhYmxlIGxpbmUKLQkJCS8vIHdpZHRoCi0JCQlpZiAoYXZhaWxhYmxlTGluZVdpZHRoIDwgMCkgewotCQkJCS8vIG5lZWQgdG8gaW5kZW50IGlmIHBvc3NpYmxlCi0JCQkJaW50IGxpbmVXaWR0aCA9IGluZGVudElmUG9zc2libGUodGV4dEVkaXQsIGNvbnN0cmFpbnRzLCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIHByZXZpb3VzRG9jdW1lbnRSZWdpb24sIHdoaXRlc3BhY2VTdHJhdGVneSwgaW5kZW50U3RyYXRlZ3ksIHRydWUpOwotCQkJCS8vIHVwZGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJCWlmIChsaW5lV2lkdGggPiAwKQotCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBsaW5lV2lkdGggLSB0YWdOYW1lTGluZVdpZHRoOwotCQkJCWVsc2UKLQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IHRhZ05hbWVMaW5lV2lkdGg7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBubyBuZWVkIHRvIGluZGVudAotCQkJCS8vIGp1c3QgbWFrZSBzdXJlIHRvIGRlbGV0ZSBwcmV2aW91cyB3aGl0ZXNwYWNlIGlmCi0JCQkJLy8gbmVlZGVkCi0JCQkJaWYgKHByZXZpb3VzRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVC5lcXVhbHMocHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJCQlTdHJpbmcgcHJldmlvdXNEb2N1bWVudFJlZ2lvblRleHQgPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCQkJCQlpZiAocHJldmlvdXNEb2N1bWVudFJlZ2lvblRleHQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBjb2xsYXBzZVNwYWNlcyh0ZXh0RWRpdCwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBhdmFpbGFibGVMaW5lV2lkdGgsIHByZXZpb3VzRG9jdW1lbnRSZWdpb25UZXh0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGRlbGV0ZSBhbnkgdHJhaWwgc3BhY2VzIGFmdGVyIHRhZyBuYW1lCi0JCWlmIChjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgPCBjdXJyZW50VGV4dFJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJZGVsZXRlVHJhaWxpbmdTcGFjZXModGV4dEVkaXQsIGN1cnJlbnRUZXh0UmVnaW9uLCBjdXJyZW50RG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JCWNvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdCB0aGUgdGV4dCBpbiB4bWwgY29udGVudAotCSAqIAotCSAqIEBwYXJhbSB0ZXh0RWRpdAotCSAqIEBwYXJhbSBwYXJlbnRDb25zdHJhaW50cwotCSAqIEBwYXJhbSBjdXJyZW50UmVnaW9uCi0JICogQHBhcmFtIGZ1bGxUZXh0Ci0JICogQHBhcmFtIHdoaXRlc3BhY2VNb2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdFRleHRJbkNvbnRlbnQoVGV4dEVkaXQgdGV4dEVkaXQsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBwYXJlbnRDb25zdHJhaW50cywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uLCBTdHJpbmcgZnVsbFRleHQsIFN0cmluZyB3aGl0ZXNwYWNlTW9kZSkgewotCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gcGFyZW50Q29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCk7Ci0KLQkJLy8gZGV0ZXJtaW5lIGluZGVudGF0aW9uCi0JCWJvb2xlYW4gZm9yY2VJbml0aWFsSW5kZW50ID0gZmFsc2U7Ci0JCWludCBpbmRlbnRMZXZlbCA9IHBhcmVudENvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCkgKyAxOwotCQlTdHJpbmcgaW5kZW50TW9kZSA9IHBhcmVudENvbnN0cmFpbnRzLmdldEluZGVudFN0cmF0ZWd5KCk7Ci0JCWlmIChYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSU5ERU5ULmVxdWFscyhpbmRlbnRNb2RlKSkgewotCQkJZm9yY2VJbml0aWFsSW5kZW50ID0gdHJ1ZTsKLQkJfQotCQlpZiAoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLk5FV19MSU5FLmVxdWFscyhpbmRlbnRNb2RlKSkgewotCQkJaW5kZW50TGV2ZWwgPSBwYXJlbnRDb25zdHJhaW50cy5nZXRJbmRlbnRMZXZlbCgpOwotCQkJZm9yY2VJbml0aWFsSW5kZW50ID0gdHJ1ZTsKLQkJfQotCi0JCWludCBmdWxsVGV4dE9mZnNldCA9IDA7Ci0JCWNoYXJbXSBmdWxsVGV4dEFycmF5ID0gZnVsbFRleHQudG9DaGFyQXJyYXkoKTsKLQkJd2hpbGUgKGZ1bGxUZXh0T2Zmc2V0IDwgZnVsbFRleHRBcnJheS5sZW5ndGgpIHsKLQkJCS8vIGdhdGhlciBhbGwgd2hpdGVzcGFjZXMKLQkJCVN0cmluZyB3aGl0ZXNwYWNlUnVuID0gZ2V0Q2hhcmFjdGVyUnVuKGZ1bGxUZXh0QXJyYXksIGZ1bGxUZXh0T2Zmc2V0LCB0cnVlKTsKLQkJCWlmICh3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpID4gMCkgewotCQkJCS8vIG9mZnNldCB3aGVyZSB3aGl0ZXNwYWNlIHN0YXJ0cwotCQkJCWludCB3aGl0ZXNwYWNlU3RhcnQgPSBmdWxsVGV4dE9mZnNldDsKLQkJCQkvLyB1cGRhdGUgY3VycmVudCBvZmZzZXQgaW4gZnVsbFRleHQKLQkJCQlmdWxsVGV4dE9mZnNldCArPSB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpOwotCi0JCQkJLy8gZ2F0aGVyIGZvbGxvd2luZyB3b3JkCi0JCQkJU3RyaW5nIGNoYXJhY3RlclJ1biA9IGdldENoYXJhY3RlclJ1bihmdWxsVGV4dEFycmF5LCBmdWxsVGV4dE9mZnNldCwgZmFsc2UpOwotCQkJCWludCBjaGFyYWN0ZXJSdW5MZW5ndGggPSBjaGFyYWN0ZXJSdW4ubGVuZ3RoKCk7Ci0JCQkJaWYgKGNoYXJhY3RlclJ1bkxlbmd0aCA+IDApIHsKLQkJCQkJLy8gaW5kZW50IGlmIHdvcmQgaXMgdG9vIGxvbmcgb3IgZm9yY2luZyBpbml0aWFsCi0JCQkJCS8vIGluZGVudAotCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCQkvLyBvZmZzZXQgd2hlcmUgaW5kZW50L2NvbGxhcHNlIHdpbGwgaGFwcGVuCi0JCQkJCWludCBzdGFydE9mZnNldCA9IGN1cnJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHdoaXRlc3BhY2VTdGFydDsKLQkJCQkJaWYgKGZvcmNlSW5pdGlhbEluZGVudCB8fCAoYXZhaWxhYmxlTGluZVdpZHRoIDw9IDApKSB7Ci0JCQkJCQkvLyBpbmRlbnQgaWYgbm90IGFscmVhZHkgaW5kZW50ZWQKLQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGluZGVudElmTm90QWxyZWFkeUluZGVudGVkKHRleHRFZGl0LCBjdXJyZW50UmVnaW9uLCBpbmRlbnRMZXZlbCwgc3RhcnRPZmZzZXQsIHdoaXRlc3BhY2VSdW4pOwotCQkJCQkJLy8gcmVtZW1iZXIgdG8gc3VidHJhY3Qgd29yZCBsZW5ndGgKLQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSBjaGFyYWN0ZXJSdW5MZW5ndGg7Ci0JCQkJCQlmb3JjZUluaXRpYWxJbmRlbnQgPSBmYWxzZTsgLy8gaW5pdGlhbCBpbmRlbnQgZG9uZQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8ganVzdCBjb2xsYXBzZSBzcGFjZXMsIGJ1dCBhZGp1c3QgZm9yIGFueSBpbmRlbnRpbmcgdGhhdCBtYXkgcmVzdWx0IGZyb20gcHJlc2VydmluZyBsaW5lIGRlbGltaXRlcnMKLQkJCQkJCWlmICh3aGl0ZXNwYWNlU3RhcnQgPT0gMCAmJiBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFQU5EVFJJTS5lcXVhbHMod2hpdGVzcGFjZU1vZGUpKSB7Ci0JCQkJCQkJLy8gaWYgaWdub3JlLCB0cmltCi0JCQkJCQkJRGVsZXRlRWRpdCBkZWxldGVUcmFpbGluZyA9IG5ldyBEZWxldGVFZGl0KHN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpKTsKLQkJCQkJCQl0ZXh0RWRpdC5hZGRDaGlsZChkZWxldGVUcmFpbGluZyk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5SRVBMQUNFLmVxdWFscyh3aGl0ZXNwYWNlTW9kZSkpCi0JCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gcmVwbGFjZVNwYWNlcyh0ZXh0RWRpdCwgc3RhcnRPZmZzZXQsIGF2YWlsYWJsZUxpbmVXaWR0aCwgd2hpdGVzcGFjZVJ1bik7Ci0JCQkJCQllbHNlCi0JCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gY29sbGFwc2VBbmRJbmRlbnQodGV4dEVkaXQsIHN0YXJ0T2Zmc2V0LCBhdmFpbGFibGVMaW5lV2lkdGgsIGluZGVudExldmVsLCB3aGl0ZXNwYWNlUnVuLCBjdXJyZW50UmVnaW9uKTsKLQkJCQkJfQotCi0JCQkJCWZ1bGxUZXh0T2Zmc2V0ICs9IGNoYXJhY3RlclJ1bkxlbmd0aDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGhhbmRsZSB0cmFpbGluZyB3aGl0ZXNwYWNlCi0JCQkJCWludCB3aGl0ZXNwYWNlT2Zmc2V0ID0gY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgd2hpdGVzcGFjZVN0YXJ0OwotCQkJCQlpZiAoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlJFUExBQ0UuZXF1YWxzKHdoaXRlc3BhY2VNb2RlKSkKLQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IHJlcGxhY2VTcGFjZXModGV4dEVkaXQsIHdoaXRlc3BhY2VPZmZzZXQsIGF2YWlsYWJsZUxpbmVXaWR0aCwgd2hpdGVzcGFjZVJ1bik7Ci0JCQkJCWVsc2UgaWYgKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkVBTkRUUklNLmVxdWFscyh3aGl0ZXNwYWNlTW9kZSkpIHsKLQkJCQkJCS8vIGFsd2F5cyB0cmltCi0JCQkJCQlEZWxldGVFZGl0IGRlbGV0ZVRyYWlsaW5nID0gbmV3IERlbGV0ZUVkaXQod2hpdGVzcGFjZU9mZnNldCwgd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSk7Ci0JCQkJCQl0ZXh0RWRpdC5hZGRDaGlsZChkZWxldGVUcmFpbGluZyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRDbGVhckFsbEJsYW5rTGluZXMoKSkgewotCQkJCQkJaWYgKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkUuZXF1YWxzKHdoaXRlc3BhY2VNb2RlKSkgewotCQkJCQkJCS8vIGlmIGlnbm9yZSwgdHJpbQotCQkJCQkJCURlbGV0ZUVkaXQgZGVsZXRlVHJhaWxpbmcgPSBuZXcgRGVsZXRlRWRpdCh3aGl0ZXNwYWNlT2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpKTsKLQkJCQkJCQl0ZXh0RWRpdC5hZGRDaGlsZChkZWxldGVUcmFpbGluZyk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBpZiBjb2xsYXBzZSwgbGVhdmUgYSBzcGFjZS4gYnV0IHdoYXQgaWYgZW5kIHVwCi0JCQkJCQkJLy8gd2FudGluZyB0byBhZGQgaW5kZW50PyB0aGVuIG5lZWQgdG8gZGVsZXRlIHNwYWNlCi0JCQkJCQkJLy8gYWRkZWQgYW5kIGFkZCBpbmRlbnQgaW5zdGVhZAotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbGxhcHNlU3BhY2VzKHRleHRFZGl0LCB3aGl0ZXNwYWNlT2Zmc2V0LCBhdmFpbGFibGVMaW5lV2lkdGgsIHdoaXRlc3BhY2VSdW4pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZ2F0aGVyIHdvcmQKLQkJCQlTdHJpbmcgY2hhcmFjdGVyUnVuID0gZ2V0Q2hhcmFjdGVyUnVuKGZ1bGxUZXh0QXJyYXksIGZ1bGxUZXh0T2Zmc2V0LCBmYWxzZSk7Ci0JCQkJaW50IGNoYXJhY3RlclJ1bkxlbmd0aCA9IGNoYXJhY3RlclJ1bi5sZW5ndGgoKTsKLQkJCQlpZiAoY2hhcmFjdGVyUnVuTGVuZ3RoID4gMCkgewotCQkJCQkvLyBpbmRlbnQgaWYgd29yZCBpcyB0b28gbG9uZyBvciBmb3JjaW5nIGluaXRpYWwKLQkJCQkJLy8gaW5kZW50Ci0JCQkJCS8vIFsyNDMwOTFdIC0gY2hhcmFjdGVyUnVuTGVuZ3RoIHNob3VsZCBvbmx5IGJlIHN1YnRyYWN0ZWQgb25jZSBvciB0ZXh0IGZvcm1hdHRpbmcgd3JhcHMgcHJlbWF0dXJlbHkKLQkJCQkJLy8gYXZhaWxhYmxlTGluZVdpZHRoID0gYXZhaWxhYmxlTGluZVdpZHRoIC0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCQlpZiAoKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkUuZXF1YWxzKHdoaXRlc3BhY2VNb2RlKSB8fCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFQU5EVFJJTS5lcXVhbHMod2hpdGVzcGFjZU1vZGUpKSAmJiAoZm9yY2VJbml0aWFsSW5kZW50IHx8IChhdmFpbGFibGVMaW5lV2lkdGggPD0gMCkpKSB7Ci0JCQkJCQkvLyBpbmRlbnQgaWYgbm90IGFscmVhZHkgaW5kZW50ZWQKLQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGluZGVudElmTm90QWxyZWFkeUluZGVudGVkKHRleHRFZGl0LCBjdXJyZW50UmVnaW9uLCBpbmRlbnRMZXZlbCwgY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCB3aGl0ZXNwYWNlUnVuKTsKLQkJCQkJCS8vIHJlbWVtYmVyIHRvIHN1YnRyYWN0IHdvcmQgbGVuZ3RoCi0JCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCQkJZm9yY2VJbml0aWFsSW5kZW50ID0gZmFsc2U7IC8vIGluaXRpYWwgaW5kZW50IGRvbmUKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGp1c3QgY29sbGFwc2Ugc3BhY2VzCi0JCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCQl9Ci0KLQkJCQkJZnVsbFRleHRPZmZzZXQgKz0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyB1cGRhdGUgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdFdpdGhpbkVuZFRhZyhUZXh0RWRpdCB0ZXh0RWRpdCwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c0RvY3VtZW50UmVnaW9uKSB7Ci0JCVN0cmluZyBpbmRlbnRTdHJhdGVneSA9IGNvbnN0cmFpbnRzLmdldEluZGVudFN0cmF0ZWd5KCk7Ci0JCVN0cmluZyB3aGl0ZXNwYWNlU3RyYXRlZ3kgPSBjb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKTsKLQkJaW50IGF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbnN0cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpOwotCQlJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMgPSBjdXJyZW50RG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpbnQgY3VycmVudE51bWJlck9mUmVnaW9ucyA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKTsKLQkJaW50IGN1cnJlbnRUZXh0UmVnaW9uSW5kZXggPSAxOwotCi0JCUlUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGN1cnJlbnRUZXh0UmVnaW9uSW5kZXgpOwotCQlTdHJpbmcgY3VycmVudFR5cGUgPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCS8vIHRhZyBuYW1lIHNob3VsZCBhbHdheXMgYmUgdGhlIGZpcnN0IHRleHQgcmVnaW9uCi0JCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRS5lcXVhbHMoY3VycmVudFR5cGUpICYmIGN1cnJlbnRUZXh0UmVnaW9uSW5kZXggPCBjdXJyZW50TnVtYmVyT2ZSZWdpb25zIC0gMSkgewotCQkJSVRleHRSZWdpb24gbmV4dFRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoY3VycmVudFRleHRSZWdpb25JbmRleCArIDEpOwotCQkJLy8gQnVnIDIyMTI3OSAtIFNvbWUgbm9uIHdlbGwtZm9ybWVkIGRvY3VtZW50cyB3aWxsIG5vdCBjb250cmlidXRlIGEgbmV4dCByZWdpb24KLQkJCWlmIChuZXh0VGV4dFJlZ2lvbiAhPSBudWxsICYmIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRS5lcXVhbHMobmV4dFRleHRSZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCS8vIGNhbGN1bGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJCWludCB0YWdOYW1lTGluZVdpZHRoID0gY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMzsKLQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gdGFnTmFtZUxpbmVXaWR0aDsKLQotCQkJCWlmIChYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSU5MSU5FLmVxdWFscyhpbmRlbnRTdHJhdGVneSkpIHsKLQkJCQkJLy8gaWYgd2FzIGlubGluaW5nLCBuZWVkIHRvIGNoZWNrIGlmIG91dCBvZiBhdmFpbGFibGUgbGluZQotCQkJCQkvLyB3aWR0aCAtIFdoaXRlc3BhY2UgbWF5IGhhdmUgYmVlbiBjb3JyZWN0ZWQgaW4gdGhlIHRleHQgY29udGVudAotCQkJCQlpZiAoYXZhaWxhYmxlTGluZVdpZHRoIDwgMCAmJiBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFLmVxdWFscyh3aGl0ZXNwYWNlU3RyYXRlZ3kpKSB7Ci0JCQkJCQkvLyBuZWVkIHRvIGRlaW5kZW50IGlmIHBvc3NpYmxlCi0JCQkJCQlpbnQgbGluZVdpZHRoID0gaW5kZW50SWZQb3NzaWJsZSh0ZXh0RWRpdCwgY29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBpbmRlbnRTdHJhdGVneSwgZmFsc2UpOwotCQkJCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkJCQlpZiAobGluZVdpZHRoID4gMCkKLQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBsaW5lV2lkdGggLSB0YWdOYW1lTGluZVdpZHRoOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gbm8gbmVlZCB0byBpbmRlbnQKLQkJCQkJCS8vIGp1c3QgbWFrZSBzdXJlIHRvIGRlbGV0ZSBwcmV2aW91cyB3aGl0ZXNwYWNlIGlmCi0JCQkJCQkvLyBuZWVkZWQKLQkJCQkJCWlmIChwcmV2aW91c0RvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVC5lcXVhbHMocHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJCQkJCVN0cmluZyBwcmV2aW91c0RvY3VtZW50UmVnaW9uVGV4dCA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJCQkJCQkJaWYgKHByZXZpb3VzRG9jdW1lbnRSZWdpb25UZXh0LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBjb2xsYXBzZVNwYWNlcyh0ZXh0RWRpdCwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBhdmFpbGFibGVMaW5lV2lkdGgsIHByZXZpb3VzRG9jdW1lbnRSZWdpb25UZXh0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBkZWxldGUgYW55IHRyYWlsIHNwYWNlcyBhZnRlciB0YWcgbmFtZQotCQkJCWlmIChjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgPCBjdXJyZW50VGV4dFJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCQlkZWxldGVUcmFpbGluZ1NwYWNlcyh0ZXh0RWRpdCwgY3VycmVudFRleHRSZWdpb24sIGN1cnJlbnREb2N1bWVudFJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gZW5kIHRhZyBoYXMgdW5leHBlY3RlZCBzdHVmZiwgc28ganVzdCBsZWF2ZSBpdCBhbG9uZQotCQl9Ci0JCWNvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIGNvbnRlbnRzIHdpdGhpbiBhIHRhZyBsaWtlIHRhZyBuYW1lIGFuZCBhdHRyaWJ1dGVzCi0JICogCi0JICogQHBhcmFtIHRleHRFZGl0Ci0JICogQHBhcmFtIGN1cnJlbnREb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSB0ZXh0UmVnaW9ucwotCSAqICAgICAgICAgICAgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JICogQHJldHVybiB0cnVlIGlmIHRhZyB3YXMgZW5kZWQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmb3JtYXRXaXRoaW5UYWcoVGV4dEVkaXQgdGV4dEVkaXQsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBjb25zdHJhaW50cywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNEb2N1bWVudFJlZ2lvbikgewotCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gY29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCk7Ci0JCVN0cmluZyBpbmRlbnRTdHJhdGVneSA9IGNvbnN0cmFpbnRzLmdldEluZGVudFN0cmF0ZWd5KCk7Ci0JCVN0cmluZyB3aGl0ZXNwYWNlU3RyYXRlZ3kgPSBjb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKTsKLQkJaW50IGluZGVudExldmVsID0gY29uc3RyYWludHMuZ2V0SW5kZW50TGV2ZWwoKTsKLQkJSVRleHRSZWdpb25MaXN0IHRleHRSZWdpb25zID0gY3VycmVudERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJaW50IGN1cnJlbnRUZXh0UmVnaW9uSW5kZXggPSAxOwotCi0JCUlUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGN1cnJlbnRUZXh0UmVnaW9uSW5kZXgpOwotCQlTdHJpbmcgY3VycmVudFR5cGUgPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCS8vIHRhZyBuYW1lIHNob3VsZCBhbHdheXMgYmUgdGhlIGZpcnN0IHRleHQgcmVnaW9uCi0JCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRS5lcXVhbHMoY3VycmVudFR5cGUpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuZXh0VGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChjdXJyZW50VGV4dFJlZ2lvbkluZGV4ICsgMSk7Ci0JCQlTdHJpbmcgbmV4dFR5cGUgPSAobmV4dFRleHRSZWdpb24gIT0gbnVsbCkgPyBuZXh0VGV4dFJlZ2lvbi5nZXRUeXBlKCkgOiBudWxsOwotCQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRS5lcXVhbHMobmV4dFR5cGUpKSB7Ci0JCQkJLy8gYWxyZWFkeSBhdCB0YWcgY2xvc2UKLQkJCQlmb3JtYXRTdGFydFRhZ1dpdGhOb0F0dHIodGV4dEVkaXQsIGNvbnN0cmFpbnRzLCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIHByZXZpb3VzRG9jdW1lbnRSZWdpb24sIGF2YWlsYWJsZUxpbmVXaWR0aCwgaW5kZW50U3RyYXRlZ3ksIHdoaXRlc3BhY2VTdHJhdGVneSwgY3VycmVudFRleHRSZWdpb24pOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRS5lcXVhbHMobmV4dFR5cGUpKSB7Ci0JCQkJLy8gYWxyZWFkeSBhdCBlbXB0eSB0YWcgY2xvc2UKLQkJCQlmb3JtYXRFbXB0eVN0YXJ0VGFnV2l0aE5vQXR0cih0ZXh0RWRpdCwgY29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgYXZhaWxhYmxlTGluZVdpZHRoLCBpbmRlbnRTdHJhdGVneSwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSArIDIpOwotCQkJCWJvb2xlYW4gYWxpZ25GaW5hbEJyYWNrZXQgPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRBbGlnbkZpbmFsQnJhY2tldCgpOwotCQkJCWJvb2xlYW4gb25lU3BhY2VJblRhZ05hbWUgPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRTcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWcoKTsKLQkJCQlib29sZWFuIGluZGVudE11bHRpcGxlQXR0cmlidXRlID0gZ2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkuZ2V0SW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzKCk7Ci0JCQkJLy8gaW5kaWNhdGVzIGlmIHRhZyBzcGFubmVkIG1vcmUgdGhhbiBvbmUgbGluZQotCQkJCWJvb2xlYW4gc3Bhbk1vcmVUaGFuMUxpbmUgPSBmYWxzZTsKLQkJCQkvLyBpbmRpY2F0ZXMgaWYgYWxsIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGluZGVudGVkCi0JCQkJYm9vbGVhbiBpbmRlbnRBbGxBdHRyaWJ1dGVzID0gZmFsc2U7Ci0JCQkJaWYgKGluZGVudE11bHRpcGxlQXR0cmlidXRlKSB7Ci0JCQkJCWludCBhdHRyaWJ1dGVzQ291bnQgPSAwOwotCQkJCQlpbnQgaSA9IDI7Ci0JCQkJCXdoaWxlIChpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpICYmIGF0dHJpYnV0ZXNDb3VudCA8IDIpIHsKLQkJCQkJCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKHRleHRSZWdpb25zLmdldChpKS5nZXRUeXBlKCkpKQotCQkJCQkJCSsrYXR0cmlidXRlc0NvdW50OwotCQkJCQl9Ci0JCQkJCWluZGVudEFsbEF0dHJpYnV0ZXMgPSAoYXR0cmlidXRlc0NvdW50ID4gMSk7Ci0JCQkJfQotCi0JCQkJd2hpbGUgKChjdXJyZW50VGV4dFJlZ2lvbkluZGV4ICsgMSkgPCB0ZXh0UmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJbmV4dFRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoY3VycmVudFRleHRSZWdpb25JbmRleCArIDEpOwotCQkJCQluZXh0VHlwZSA9IG5leHRUZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRS5lcXVhbHMobmV4dFR5cGUpKSB7Ci0JCQkJCQlib29sZWFuIGluZGVudEF0dHJpYnV0ZSA9IGluZGVudEFsbEF0dHJpYnV0ZXM7Ci0JCQkJCQlpZiAoIWluZGVudEF0dHJpYnV0ZSkKLQkJCQkJCQlpbmRlbnRBdHRyaWJ1dGUgPSBzaG91bGRJbmRlbnRCZWZvcmVBdHRyaWJ1dGUoY29uc3RyYWludHMsIHRleHRSZWdpb25zLCBhdmFpbGFibGVMaW5lV2lkdGgsIGN1cnJlbnRUZXh0UmVnaW9uSW5kZXgsIGN1cnJlbnRUZXh0UmVnaW9uLCBuZXh0VGV4dFJlZ2lvbik7Ci0JCQkJCQlpZiAoaW5kZW50QXR0cmlidXRlKSB7Ci0JCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQodGV4dEVkaXQsIGluZGVudExldmVsICsgMSwgY3VycmVudERvY3VtZW50UmVnaW9uLCBjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCQkJCQkJc3Bhbk1vcmVUaGFuMUxpbmUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gb3RoZXJ3aXNlLCBpbnNlcnRTcGFjZUFuZENvbGxhcHNlCi0JCQkJCQkJaW5zZXJ0U3BhY2VBbmRDb2xsYXBzZSh0ZXh0RWRpdCwgY3VycmVudERvY3VtZW50UmVnaW9uLCBhdmFpbGFibGVMaW5lV2lkdGgsIGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCQkJCQkvLyB1cGRhdGUgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSArIDEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRS5lcXVhbHMobmV4dFR5cGUpKSB7Ci0JCQkJCQkvLyBpZiBuZWVkIHRvIGFsaWduIGJyYWNrZXQgb24gbmV4dCBsaW5lLCBpbmRlbnQKLQkJCQkJCWlmIChhbGlnbkZpbmFsQnJhY2tldCAmJiBzcGFuTW9yZVRoYW4xTGluZSkgewotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGluZGVudElmTm90QWxyZWFkeUluZGVudGVkKHRleHRFZGl0LCBpbmRlbnRMZXZlbCwgY3VycmVudERvY3VtZW50UmVnaW9uLCBjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCQkJCQkJLS1hdmFpbGFibGVMaW5lV2lkdGg7IC8vIGZvciB0YWcgY2xvc2UgaXRzZWxmCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBvdGhlcndpc2UsIGp1c3QgZGVsZXRlIHNwYWNlIGJlZm9yZSB0YWcgY2xvc2UKLQkJCQkJCQlpZiAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpIDwgY3VycmVudFRleHRSZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJCQkJZGVsZXRlVHJhaWxpbmdTcGFjZXModGV4dEVkaXQsIGN1cnJlbnRUZXh0UmVnaW9uLCBjdXJyZW50RG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSArIDEpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIHVwZGF0ZSBsaW5lIHdpZHRoCi0JCQkJCQljb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlTGluZVdpZHRoKTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UuZXF1YWxzKG5leHRUeXBlKSkgewotCQkJCQkJaW50IHRleHRMZW5ndGggPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQlpbnQgcmVnaW9uTGVuZ3RoID0gY3VycmVudFRleHRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJCQkJCWJvb2xlYW4gdGhlcmVBcmVTcGFjZXMgPSB0ZXh0TGVuZ3RoIDwgcmVnaW9uTGVuZ3RoOwotCQkJCQkJaWYgKCFvbmVTcGFjZUluVGFnTmFtZSAmJiB0aGVyZUFyZVNwYWNlcykgewotCQkJCQkJCS8vIGRlbGV0ZSBhbnkgdHJhaWwgc3BhY2VzIGFmdGVyIHRhZyBuYW1lCi0JCQkJCQkJZGVsZXRlVHJhaWxpbmdTcGFjZXModGV4dEVkaXQsIGN1cnJlbnRUZXh0UmVnaW9uLCBjdXJyZW50RG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMik7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBpbnNlcnQgYSBzcGFjZSBhbmQgY29sbGFwc2UgT05MWSBJRiBpdCdzIHNwZWNpZmllZAotCQkJCQkJZWxzZSBpZiAob25lU3BhY2VJblRhZ05hbWUpIHsKLQkJCQkJCQlpbnNlcnRTcGFjZUFuZENvbGxhcHNlKHRleHRFZGl0LCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGF2YWlsYWJsZUxpbmVXaWR0aCwgY3VycmVudFRleHRSZWdpb24pOwotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMyk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyB1cGRhdGUgbGluZSB3aWR0aAotCQkJCQkJY29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKGN1cnJlbnRUeXBlKSAmJiBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUy5lcXVhbHMobmV4dFR5cGUpKSB7Ci0JCQkJCQkJaWYgKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSA8IGN1cnJlbnRUZXh0UmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJCQkJCWRlbGV0ZVRyYWlsaW5nU3BhY2VzKHRleHRFZGl0LCBjdXJyZW50VGV4dFJlZ2lvbiwgY3VycmVudERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSB3aWR0aAotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUy5lcXVhbHMoY3VycmVudFR5cGUpICYmIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKG5leHRUeXBlKSkgewotCQkJCQkJCWlmIChjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgPCBjdXJyZW50VGV4dFJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCQkJCQlkZWxldGVUcmFpbGluZ1NwYWNlcyh0ZXh0RWRpdCwgY3VycmVudFRleHRSZWdpb24sIGN1cnJlbnREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIHVwZGF0ZSBhdmFpbGFibGUgd2lkdGgKLQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gb3RoZXJ3aXNlLCBpbnNlcnRTcGFjZUFuZENvbGxhcHNlCi0JCQkJCQkJaW5zZXJ0U3BhY2VBbmRDb2xsYXBzZSh0ZXh0RWRpdCwgY3VycmVudERvY3VtZW50UmVnaW9uLCBhdmFpbGFibGVMaW5lV2lkdGgsIGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCQkJCQkvLyB1cGRhdGUgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSArIDEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWN1cnJlbnRUZXh0UmVnaW9uID0gbmV4dFRleHRSZWdpb247Ci0JCQkJCWN1cnJlbnRUeXBlID0gbmV4dFR5cGU7Ci0JCQkJCSsrY3VycmVudFRleHRSZWdpb25JbmRleDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gdXBkYXRlIGxpbmUgd2lkdGgKLQkJY29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogRm9ybWF0IGFuIFhNTCBjb21tZW50IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRDb21tZW50KFRleHRFZGl0IHRleHRFZGl0LCBQb3NpdGlvbiBmb3JtYXRSYW5nZSwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHBhcmVudENvbnN0cmFpbnRzLCBET01SZWdpb24gY3VycmVudERPTVJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c1JlZ2lvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBjdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uOwotCQlpbnQgbGluZVdpZHRoID0gcGFyZW50Q29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkgLSBjdXJyZW50UmVnaW9uLmdldEZ1bGxUZXh0KCkubGVuZ3RoKCk7Ci0JCS8vIERvbid0IGZvcm1hdCBpZiB3ZSdyZSBub3QgZXhjZWVkaW5nIHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCwgb3IgaWYgdGhlIHdoaXRlc3BhY2UKLQkJLy8gc3RyYXRlZ3kgaXMgdG8gcHJlc2VydmUgd2hpdGVzcGFjZSAtIEJ1dCB1cGRhdGUgbGluZSB3aWR0aC4KLQkJaWYoY3VycmVudFJlZ2lvbiA9PSBudWxsIHx8CVhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5QUkVTRVJWRS5lcXVhbHMocGFyZW50Q29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpIHx8ICFmUHJlZmVyZW5jZXMuZ2V0Rm9ybWF0Q29tbWVudFRleHQoKSkgewotCQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGxpbmVXaWR0aCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJdGVyYXRvciBpdCA9IGN1cnJlbnRSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIHByZXZpb3VzID0gbnVsbDsKLQkJaWYgKHByZXZpb3VzUmVnaW9uID09IG51bGwpCi0JCQlwcmV2aW91c1JlZ2lvbiA9IGN1cnJlbnRSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJLy8gSXRlcmF0ZSBvdmVyIGVhY2ggdGV4dCByZWdpb24gb2YgdGhlIGNvbW1lbnQKLQkJTm9kZSBwYXJlbnQgPSBjdXJyZW50RE9NUmVnaW9uLmRvbU5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHQgPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyB0eXBlID0gdGV4dC5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4pIHsKLQkJCQlpbnQgaW5kZW50TGV2ZWwgPSAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSA/IDAgOiAxOwotCQkJCWludCB3aWR0aCA9IGZvcm1hdENvbW1lbnRTdGFydCh0ZXh0RWRpdCwgcGFyZW50Q29uc3RyYWludHMsIGluZGVudExldmVsLCBjdXJyZW50UmVnaW9uLCBwcmV2aW91c1JlZ2lvbiwgdGV4dCk7Ci0JCQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKHdpZHRoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKSB7Ci0JCQkJaW50IGluZGVudExldmVsID0gKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgPyAtMSA6IHBhcmVudENvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCk7Ci0JCQkJZm9ybWF0Q29tbWVudENvbnRlbnQodGV4dEVkaXQsIHBhcmVudENvbnN0cmFpbnRzLCBpbmRlbnRMZXZlbCwgY3VycmVudFJlZ2lvbiwgcHJldmlvdXMsIHRleHQpOwotCQkJfQotCQkJcHJldmlvdXMgPSB0ZXh0OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdENvbW1lbnRDb250ZW50KFRleHRFZGl0IHRleHRFZGl0LCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMsIGludCBpbmRlbnRMZXZlbCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBwcmV2aW91cywgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBsaW5lV2lkdGggPSBwYXJlbnRDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSAtIGN1cnJlbnRSZWdpb24uZ2V0RnVsbFRleHQocHJldmlvdXMpLmxlbmd0aCgpOwotCQkvLyBJZiB0aGVyZSdzIG1vcmUgdGV4dCB0aGFuIGxpbmUgd2lkdGggYXZhaWxhYmxlLCBmb3JtYXQKLQkJU3RyaW5nIHRleHQgPSBjdXJyZW50UmVnaW9uLmdldEZ1bGxUZXh0KHJlZ2lvbik7Ci0JCWNvbXByZXNzQ29udGVudCh0ZXh0RWRpdCwgY3VycmVudFJlZ2lvbiwgY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pLCBpbmRlbnRMZXZlbCArIDEsIGxpbmVXaWR0aCwgdGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXByZXNzQ29udGVudChUZXh0RWRpdCB0ZXh0RWRpdCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIGludCBzdGFydE9mZnNldCwgaW50IGluZGVudExldmVsLCBpbnQgbGluZVdpZHRoLCBTdHJpbmcgdGV4dCkgewotCQlpbnQgbGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKLQkJaW50IHN0YXJ0ID0gMCwgZW5kID0gMDsKLQkJY2hhciBjID0gMDsKLQkJaW50IHJlc3VsdExlbmd0aCA9IDA7Ci0JCWJvb2xlYW4gam9pbkxpbmVzID0gZlByZWZlcmVuY2VzLmdldEpvaW5Db21tZW50TGluZXMoKTsKLQkJYm9vbGVhbiBvbk93bkxpbmUgPSBmYWxzZTsKLQotCQlTdHJpbmcgaW5kZW50ID0gZ2V0SW5kZW50U3RyaW5nKGluZGVudExldmVsICsgMSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJYyA9IHRleHQuY2hhckF0KGkpOwotCQkJLy8gQ29tcHJlc3Mgd2hpdGVzcGFjZSB1bmxlc3MgaXRzIGEgbGluZSBkZWxpbWl0ZXIgYW5kIGZvcm1hdHRpbmcgZG9lcyBub3QgcGVybWl0IGpvaW5pbmcgbGluZXMKLQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0JCQkJaWYgKChjICE9ICdccicgJiYgYyE9ICdcbicpIHx8IGpvaW5MaW5lcykgewotCQkJCQkvLyBKdXN0IGNhbWUgb2ZmIG9mIGEgd29yZAotCQkJCQlpZiAoc3RhcnQgPT0gZW5kKSB7Ci0JCQkJCQlzdGFydCA9IGVuZCA9IGk7Ci0JCQkJCX0KLQkJCQkJZW5kKys7Ci0JCQkJCXJlc3VsdExlbmd0aCsrOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gY29ycmVjdCB0aGUgaW5kZW50IG9mIHRoaXMgbGluZQotCQkJCQlsaW5lV2lkdGggPSBmUHJlZmVyZW5jZXMuZ2V0TWF4TGluZVdpZHRoKCk7Ci0JCQkJCXJlc3VsdExlbmd0aCA9IDA7Ci0JCQkJCW9uT3duTGluZSA9IHRydWU7Ci0KLQkJCQkJLy8gQ29tcHJlc3MgYW55IHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBsaW5lIGRlbGltaXRlcgotCQkJCQlpZiAoc3RhcnQgIT0gZW5kKSB7Ci0JCQkJCQlpbnQgcmVwbGFjZUxlbmd0aCA9IGVuZCAtIHN0YXJ0OwotCQkJCQkJdGV4dEVkaXQuYWRkQ2hpbGQobmV3IFJlcGxhY2VFZGl0KHN0YXJ0ICsgc3RhcnRPZmZzZXQsIHJlcGxhY2VMZW5ndGgsIEVNUFRZKSk7Ci0JCQkJCQlzdGFydCA9IGVuZCA9IGk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBUcmFuc2l0aW9uZWQgdG8gYSBuZXcgd29yZAotCQkJCWlmIChzdGFydCAhPSBlbmQpIHsKLQkJCQkJaW50IHJlcGxhY2VMZW5ndGggPSBlbmQgLSBzdGFydDsKLQkJCQkJaWYgKG9uT3duTGluZSkgewotCQkJCQkJLy8gSWYgY29udGVudCBpcyBvbiBpdHMgb3duIGxpbmUsIHJlcGxhY2UgbGVhZGluZyB3aGl0ZXNwYWNlIHdpdGggcHJvcGVyIGluZGVudAotCQkJCQkJdGV4dEVkaXQuYWRkQ2hpbGQobmV3IFJlcGxhY2VFZGl0KHN0YXJ0ICsgc3RhcnRPZmZzZXQsIHJlcGxhY2VMZW5ndGgsIGluZGVudCkpOwotCQkJCQkJcmVzdWx0TGVuZ3RoIC09IChyZXBsYWNlTGVuZ3RoIC0gaW5kZW50Lmxlbmd0aCgpKTsKLQkJCQkJCW9uT3duTGluZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKCEocmVwbGFjZUxlbmd0aCA9PSAxICYmIHRleHQuY2hhckF0KHN0YXJ0KSA9PSAnICcpKSB7Ci0JCQkJCQl0ZXh0RWRpdC5hZGRDaGlsZChuZXcgUmVwbGFjZUVkaXQoc3RhcnQgKyBzdGFydE9mZnNldCwgcmVwbGFjZUxlbmd0aCwgU1BBQ0UpKTsKLQkJCQkJCXJlc3VsdExlbmd0aCAtPSAocmVwbGFjZUxlbmd0aCAtIDEpOwotCQkJCQl9Ci0JCQkJCXN0YXJ0ID0gZW5kID0gaTsKLQkJCQkJLy8gTWFrZSBzdXJlIHRoZSB3b3JkIHN0YXJ0cyBvbiBhIG5ldyBsaW5lCi0JCQkJCWlmIChyZXN1bHRMZW5ndGggPiBsaW5lV2lkdGgpIHsKLQkJCQkJCWxpbmVXaWR0aCA9IGZQcmVmZXJlbmNlcy5nZXRNYXhMaW5lV2lkdGgoKTsKLQkJCQkJCXJlc3VsdExlbmd0aCA9IDA7Ci0JCQkJCQl0ZXh0RWRpdC5hZGRDaGlsZChuZXcgSW5zZXJ0RWRpdChzdGFydCArIHN0YXJ0T2Zmc2V0LCBnZXRMaW5lRGVsaW1pdGVyKHJlZ2lvbikgKyBpbmRlbnQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBXb3JkIGlzIGltbWVkaWF0ZWx5IGFmdGVyIGxpbmUgZGVsaW1pdGVycywgaW5kZW50IGFwcHJvcHJpYXRlbHkKLQkJCQlpZiAob25Pd25MaW5lKSB7Ci0JCQkJCXRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KGkgKyBzdGFydE9mZnNldCwgaW5kZW50KSk7Ci0JCQkJCW9uT3duTGluZSA9IGZhbHNlOwotCQkJCX0KLQkJCQlyZXN1bHRMZW5ndGgrKzsKLQkJCX0KLQkJfQotCi0JCS8vIENsZWFuIHVwIGFueSBkYW5nbGluZyB3aGl0ZXNwYWNlCi0JCWludCByZXBsYWNlTGVuZ3RoID0gZW5kIC0gc3RhcnQ7Ci0JCWluZGVudCA9IGdldEluZGVudFN0cmluZyhpbmRlbnRMZXZlbCk7Ci0JCWlmIChyZXBsYWNlTGVuZ3RoID09IDApIHsgLy8gTm8gdHJhaWxpbmcgd2hpdGVzcGFjZQotCQkJdGV4dEVkaXQuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQobGVuZ3RoICsgc3RhcnRPZmZzZXQsIChvbk93bkxpbmUpID8gaW5kZW50IDogU1BBQ0UpKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyB3aGl0ZXNwYWNlID0gdGV4dC5zdWJzdHJpbmcoc3RhcnQpOwotCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gKG9uT3duTGluZSkgPyBpbmRlbnQgOiBTUEFDRTsKLQkJCWlmICghd2hpdGVzcGFjZS5lcXVhbHMocmVwbGFjZW1lbnQpKSB7Ci0JCQkJdGV4dEVkaXQuYWRkQ2hpbGQobmV3IFJlcGxhY2VFZGl0KHN0YXJ0ICsgc3RhcnRPZmZzZXQsIHJlcGxhY2VMZW5ndGgsIHJlcGxhY2VtZW50KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBmb3JtYXRDb21tZW50U3RhcnQoVGV4dEVkaXQgdGV4dEVkaXQsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBwYXJlbnRDb25zdHJhaW50cywgaW50IGluZGVudExldmVsLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNSZWdpb24sIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgbGluZVdpZHRoID0gcGFyZW50Q29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCk7Ci0JCWlmIChwcmV2aW91c1JlZ2lvbiE9bnVsbCYmKERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQuZXF1YWxzKHByZXZpb3VzUmVnaW9uLmdldFR5cGUoKSkpKSB7Ci0JCQlTdHJpbmcgcHJldmlvdXNUZXh0ID0gcHJldmlvdXNSZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJCVN0cmluZyB0cmFpbGluZ1doaXRlc3BhY2UgPSBnZXRUcmFpbGluZ1doaXRlc3BhY2UocHJldmlvdXNUZXh0KTsKLQkJCVN0cmluZyBkZWxpbWl0ZXJzID0gZXh0cmFjdExpbmVEZWxpbWl0ZXJzKHRyYWlsaW5nV2hpdGVzcGFjZSwgcHJldmlvdXNSZWdpb24pOwotCQkJaWYgKGRlbGltaXRlcnMgIT0gbnVsbCAmJiBkZWxpbWl0ZXJzLmxlbmd0aCgpID4gMCl7Ly8gJiYgcHJldmlvdXNUZXh0Lmxlbmd0aCgpID09IHRyYWlsaW5nV2hpdGVzcGFjZS5sZW5ndGgoKSkgewotCQkJCS8vIEZvcm1hdCB0aGUgY29tbWVudCBpZiBpdCdzIG9uIGEgbmV3IGxpbmUKLQkJCQlpbnQgb2Zmc2V0ID0gcHJldmlvdXNSZWdpb24uZ2V0RW5kKCkgLSB0cmFpbGluZ1doaXRlc3BhY2UubGVuZ3RoKCk7Ci0JCQkJbGluZVdpZHRoID0gaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQodGV4dEVkaXQsIGN1cnJlbnRSZWdpb24sIHBhcmVudENvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCkgKyBpbmRlbnRMZXZlbCwgb2Zmc2V0LCB0cmFpbGluZ1doaXRlc3BhY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5lV2lkdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBlaXRoZXIgYSBTdHJpbmcgb2Ygd2hpdGVzcGFjZSBvciBjaGFyYWN0ZXJzIGRlcGVuZGluZyBvbgotCSAqIGZvcldoaXRlc3BhY2UKLQkgKiAKLQkgKiBAcGFyYW0gZnVsbFRleHRBcnJheQotCSAqICAgICAgICAgICAgdGhlIHRleHQgYXJyYXkgdG8gbG9vayBpbgotCSAqIEBwYXJhbSB0ZXh0T2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0IHRvIHN0YXJ0IHNlYXJjaGluZwotCSAqIEBwYXJhbSBmb3JXaGl0ZXNwYWNlCi0JICogICAgICAgICAgICB0cnVlIGlmIHNob3VsZCByZXR1cm4gd2hpdGVzcGFjZXMsIGZhbHNlIG90aGVyd2lzZQotCSAqIEByZXR1cm4gYSBTdHJpbmcgb2YgZWl0aGVyIGFsbCB3aGl0ZXNwYWNlIG9yIGFsbCBjaGFyYWN0ZXJzLiBOZXZlcgotCSAqICAgICAgICAgcmV0dXJucyBudWxsCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2hhcmFjdGVyUnVuKGNoYXJbXSBmdWxsVGV4dEFycmF5LCBpbnQgdGV4dE9mZnNldCwgYm9vbGVhbiBmb3JXaGl0ZXNwYWNlKSB7Ci0JCVN0cmluZ0J1ZmZlciBjaGFyYWN0ZXJSdW4gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gbm9uQ2hhcmFjdGVyRm91bmQgPSBmYWxzZTsKLQkJd2hpbGUgKHRleHRPZmZzZXQgPCBmdWxsVGV4dEFycmF5Lmxlbmd0aCAmJiAhbm9uQ2hhcmFjdGVyRm91bmQpIHsKLQkJCWNoYXIgYyA9IGZ1bGxUZXh0QXJyYXlbdGV4dE9mZnNldF07Ci0JCQlib29sZWFuIGlzV2hpdGVzcGFjZSA9IENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYyk7Ci0JCQlpZiAoKGZvcldoaXRlc3BhY2UgJiYgaXNXaGl0ZXNwYWNlKSB8fCAoIWZvcldoaXRlc3BhY2UgJiYgIWlzV2hpdGVzcGFjZSkpCi0JCQkJY2hhcmFjdGVyUnVuLmFwcGVuZChjKTsKLQkJCWVsc2UKLQkJCQlub25DaGFyYWN0ZXJGb3VuZCA9IHRydWU7Ci0JCQkrK3RleHRPZmZzZXQ7Ci0JCX0KLQkJcmV0dXJuIGNoYXJhY3RlclJ1bi50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUcmFpbGluZ1doaXRlc3BhY2UoU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIHdoaXRlc3BhY2VSdW4gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBpbmRleCA9IHRleHQubGVuZ3RoKCkgLSAxOwotCQl3aGlsZShpbmRleCA+PSAwKSB7Ci0JCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpbmRleC0tKTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKQotCQkJCXdoaXRlc3BhY2VSdW4uaW5zZXJ0KDAsIGMpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiB3aGl0ZXNwYWNlUnVuLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKGludCBpbmRlbnRMZXZlbCkgewotCQlTdHJpbmdCdWZmZXIgaW5kZW50U3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgaW5kZW50ID0gZ2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkuZ2V0T25lSW5kZW50KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50TGV2ZWw7ICsraSkgewotCQkJaW5kZW50U3RyaW5nLmFwcGVuZChpbmRlbnQpOwotCQl9Ci0JCXJldHVybiBpbmRlbnRTdHJpbmcudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzIGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZQcmVmZXJlbmNlcyA9PSBudWxsKQotCQkJZlByZWZlcmVuY2VzID0gbmV3IFhNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gZlByZWZlcmVuY2VzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZvcm1hdHRpbmdQcmVmZXJlbmNlcyhYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKLQkJZlByZWZlcmVuY2VzID0gcHJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogSW5kZW50IGlmIHdoaXRlc3BhY2VSdW4gZG9lcyBub3QgYWxyZWFkeSBjb250YWluIGFuIGluZGVudAotCSAqIAotCSAqIEBwYXJhbSB0ZXh0RWRpdAotCSAqIEBwYXJhbSBpbmRlbnRMZXZlbAotCSAqIEBwYXJhbSBpbmRlbnRTdGFydE9mZnNldAotCSAqIEBwYXJhbSBtYXhBdmFpbGFibGVMaW5lV2lkdGgKLQkgKiBAcGFyYW0gd2hpdGVzcGFjZVJ1bgotCSAqIEByZXR1cm4gbmV3IGF2YWlsYWJsZSBsaW5lIHdpZHRoIHVwIHRvIHdoZXJlIGluZGVudGVkCi0JICovCi0JcHJpdmF0ZSBpbnQgaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQoVGV4dEVkaXQgdGV4dEVkaXQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbiwgaW50IGluZGVudExldmVsLCBpbnQgaW5kZW50U3RhcnRPZmZzZXQsIFN0cmluZyB3aGl0ZXNwYWNlUnVuKSB7Ci0JCWludCBtYXhBdmFpbGFibGVMaW5lV2lkdGggPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRNYXhMaW5lV2lkdGgoKTsKLQotCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoOwotCQlTdHJpbmcgaW5kZW50U3RyaW5nID0gZ2V0SW5kZW50U3RyaW5nKGluZGVudExldmVsKTsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBnZXRMaW5lRGVsaW1pdGVyKGN1cnJlbnRSZWdpb24pOwotCQlTdHJpbmcgbmV3TGluZUFuZEluZGVudCA9IGxpbmVEZWxpbWl0ZXIgKyBpbmRlbnRTdHJpbmc7Ci0JCQotCQlUZXh0RWRpdCBpbmRlbnRhdGlvbiA9IG51bGw7Ci0JCQotCQkvLyBpZiBub3QgYWxyZWFkeSBjb3JyZWN0bHkgaW5kZW50ZWQKLQkJaWYgKCFuZXdMaW5lQW5kSW5kZW50LmVxdWFscyh3aGl0ZXNwYWNlUnVuKSkgewotCQkJaWYgKGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKSB7Ci0JCQkJaWYgKHdoaXRlc3BhY2VSdW4gIT0gbnVsbCkgewotCQkJCQkvLyByZXBsYWNlIGV4aXN0aW5nIHdoaXRlc3BhY2UgcnVuCi0JCQkJCWluZGVudGF0aW9uID0gbmV3IFJlcGxhY2VFZGl0KGluZGVudFN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpLCBuZXdMaW5lQW5kSW5kZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGp1c3QgaW5zZXJ0IGNvcnJlY3QgaW5kZW50Ci0JCQkJCWluZGVudGF0aW9uID0gbmV3IEluc2VydEVkaXQoaW5kZW50U3RhcnRPZmZzZXQsIG5ld0xpbmVBbmRJbmRlbnQpOwotCQkJCX0KLQkJCX0KLQkJCS8vIEtlZXAgdGhlIGVtcHR5IGxpbmVzCi0JCQllbHNlIHsKLQkJCQkvLyBqdXN0IGluc2VydCBjb3JyZWN0IGluZGVudAotCQkJCWlmKHdoaXRlc3BhY2VSdW4gPT0gbnVsbCkKLQkJCQkJaW5kZW50YXRpb24gPSBuZXcgSW5zZXJ0RWRpdChpbmRlbnRTdGFydE9mZnNldCwgbmV3TGluZUFuZEluZGVudCk7Ci0JCQkJLy8gTmVlZCB0byBwcmVzZXJ2ZSB0aGUgbnVtYmVyIG9mIGVtcHR5IGxpbmVzLCBidXQgc3RpbGwgaW5kZW50IG9uIHRoZSBjdXJyZW50IGxpbmUgcHJvcGVybHkKLQkJCQllbHNlIHsKLQkJCQkJU3RyaW5nIGV4aXN0aW5nRGVsaW1pdGVycyA9IGV4dHJhY3RMaW5lRGVsaW1pdGVycyh3aGl0ZXNwYWNlUnVuLCBjdXJyZW50UmVnaW9uKTsKLQkJCQkJaWYoZXhpc3RpbmdEZWxpbWl0ZXJzICE9IG51bGwgJiYgZXhpc3RpbmdEZWxpbWl0ZXJzLmxlbmd0aCgpID4gMCkgewotCQkJCQkJU3RyaW5nIGZvcm1hdHRlZCA9IGV4aXN0aW5nRGVsaW1pdGVycyArIGluZGVudFN0cmluZzsKLQkJCQkJCS8vIERvbid0IHBlcmZvcm0gYSByZXBsYWNlIGlmIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIGlzIHRoZSBzYW1lIGFzIHRoZSBleGlzdGluZyB3aGl0ZXNwYWNlUnVuCi0JCQkJCQlpZighZm9ybWF0dGVkLmVxdWFscyh3aGl0ZXNwYWNlUnVuKSkKLQkJCQkJCQlpbmRlbnRhdGlvbiA9IG5ldyBSZXBsYWNlRWRpdChpbmRlbnRTdGFydE9mZnNldCwgd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSwgZm9ybWF0dGVkKTsKLQkJCQkJfQotCQkJCQkvLyBObyBibGFuayBsaW5lcyB0byBwcmVzZXJ2ZSAtIGNvcnJlY3QgdGhlIGluZGVudAotCQkJCQllbHNlCi0JCQkJCQlpbmRlbnRhdGlvbiA9IG5ldyBSZXBsYWNlRWRpdChpbmRlbnRTdGFydE9mZnNldCwgd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSwgbmV3TGluZUFuZEluZGVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZihpbmRlbnRhdGlvbiAhPSBudWxsKQotCQkJdGV4dEVkaXQuYWRkQ2hpbGQoaW5kZW50YXRpb24pOwotCQkvLyB1cGRhdGUgbGluZSB3aWR0aAotCQlhdmFpbGFibGVMaW5lV2lkdGggPSBtYXhBdmFpbGFibGVMaW5lV2lkdGggLSBpbmRlbnRTdHJpbmcubGVuZ3RoKCk7Ci0JCXJldHVybiBhdmFpbGFibGVMaW5lV2lkdGg7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQoVGV4dEVkaXQgdGV4dEVkaXQsIGludCBpbmRlbnRMZXZlbCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uKSB7Ci0JCS8vIGluZGVudCBpZiBub3QgYWxyZWFkeSBpbmRlbnRlZAotCQlpbnQgdGV4dExlbmd0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJaW50IHJlZ2lvbkxlbmd0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldExlbmd0aCgpOwotCQlpbnQgaW5kZW50U3RhcnRPZmZzZXQgPSBjdXJyZW50RG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCVN0cmluZyBmdWxsVGV4dCA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dChjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCVN0cmluZyB3aGl0ZXNwYWNlUnVuID0gZnVsbFRleHQuc3Vic3RyaW5nKHRleHRMZW5ndGgsIHJlZ2lvbkxlbmd0aCk7Ci0KLQkJLy8gdXBkYXRlIGxpbmUgd2lkdGgKLQkJaW50IGF2YWlsYWJsZUxpbmVXaWR0aCA9IGluZGVudElmTm90QWxyZWFkeUluZGVudGVkKHRleHRFZGl0LCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGluZGVudExldmVsLCBpbmRlbnRTdGFydE9mZnNldCwgd2hpdGVzcGFjZVJ1bik7Ci0JCXJldHVybiBhdmFpbGFibGVMaW5lV2lkdGg7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgaW5kZW50SWZQb3NzaWJsZShUZXh0RWRpdCB0ZXh0RWRpdCwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHRoaXNDb25zdHJhaW50cywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgU3RyaW5nIHdoaXRlc3BhY2VTdHJhdGVneSwgU3RyaW5nIGluZGVudFN0cmF0ZWd5LCBib29sZWFuIGFkZEluZGVudCkgewotCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gLTE7Ci0JCS8vIGlmIHRoZXJlIGlzIG5vIHByZXZpb3VzIGRvY3VtZW50IHJlZ2lvbiwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmRlbnQKLQkJLy8gYmVjYXVzZSB3ZSdyZSBhdCBiZWdpbm5pbmcgb2YgZG9jdW1lbnQKLQkJaWYgKHByZXZpb3VzRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBhdmFpbGFibGVMaW5lV2lkdGg7Ci0KLQkJLy8gb25seSBpbmRlbnQgaWYgaWdub3Jpbmcgd2hpdGVzcGFjZSBvciBpZiBjb2xsYXBzaW5nIGFuZAotCQkvLyB0aGVyZSB3YXMgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBiZWZvcmUgdGhpcyByZWdpb24KLQkJYm9vbGVhbiBjYW5JbmRlbnQgPSBmYWxzZTsKLQkJU3RyaW5nIHByZXZpb3VzUmVnaW9uRnVsbFRleHQgPSBudWxsOwotCQlTdHJpbmcgcHJldmlvdXNSZWdpb25UeXBlID0gbnVsbDsKLQotCQlpZiAoKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkUuZXF1YWxzKHdoaXRlc3BhY2VTdHJhdGVneSkpIHx8IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkVBTkRUUklNLmVxdWFscyh3aGl0ZXNwYWNlU3RyYXRlZ3kpKSB7Ci0JCQkvLyBpZiBpZ25vcmluZywgbmVlZCB0byBjaGVjayBpZiBwcmV2aW91cyByZWdpb24gd2FzIGNkYXRhCi0JCQlwcmV2aW91c1JlZ2lvblR5cGUgPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhULmVxdWFscyhwcmV2aW91c1JlZ2lvblR5cGUpKQotCQkJCWNhbkluZGVudCA9IGZhbHNlOwotCQkJZWxzZQotCQkJCWNhbkluZGVudCA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkNPTExBUFNFLmVxdWFscyh3aGl0ZXNwYWNlU3RyYXRlZ3kpKSB7Ci0JCQkvLyBpZiBjb2xsYXBzaW5nLCBuZWVkIHRvIGNoZWNrIGlmIHByZXZpb3VzIHJlZ2lvbiBlbmRlZCBpbiBhCi0JCQkvLyB3aGl0ZXNwYWNlCi0JCQlwcmV2aW91c1JlZ2lvblR5cGUgPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5ULmVxdWFscyhwcmV2aW91c1JlZ2lvblR5cGUpKSB7Ci0JCQkJcHJldmlvdXNSZWdpb25GdWxsVGV4dCA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJCQlpbnQgbGVuZ3RoID0gcHJldmlvdXNSZWdpb25GdWxsVGV4dC5sZW5ndGgoKTsKLQkJCQlpZiAobGVuZ3RoID4gMSkKLQkJCQkJY2FuSW5kZW50ID0gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShwcmV2aW91c1JlZ2lvbkZ1bGxUZXh0LmNoYXJBdChsZW5ndGggLSAxKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNhbkluZGVudCkgewotCQkJaW50IGluZGVudFN0YXJ0T2Zmc2V0ID0gY3VycmVudERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlTdHJpbmcgd2hpdGVzcGFjZVJ1biA9IG51bGw7Ci0KLQkJCS8vIGdldCBwcmV2aW91cyByZWdpb24gdHlwZSBpZiBpdCB3YXMgbm90IHByZXZpb3VzbHkgcmV0cmlldmVkCi0JCQlpZiAocHJldmlvdXNSZWdpb25UeXBlID09IG51bGwpCi0JCQkJcHJldmlvdXNSZWdpb25UeXBlID0gcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRUeXBlKCk7Ci0KLQkJCS8vIGdldCBwcmV2aW91cyByZWdpb24ncyB0ZXh0IGlmIGl0IHdhcyBub3QgcHJldmlvdXNseSByZXRyaWV2ZWQKLQkJCWlmIChwcmV2aW91c1JlZ2lvbkZ1bGxUZXh0ID09IG51bGwgJiYgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVC5lcXVhbHMocHJldmlvdXNSZWdpb25UeXBlKSkKLQkJCQlwcmV2aW91c1JlZ2lvbkZ1bGxUZXh0ID0gcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCi0JCQkvLyBpZiBwcmV2aW91cyByZWdpb24gd2FzIG9ubHkgd2hpdGVzcGFjZSwgdGhpcyBtYXkKLQkJCS8vIGFscmVhZHkgYmUgaW5kZW50ZWQsIHNvIG5lZWQgdG8gbWFrZSBzdXJlCi0JCQlpZiAoKHByZXZpb3VzUmVnaW9uRnVsbFRleHQgIT0gbnVsbCkgJiYgKHByZXZpb3VzUmVnaW9uRnVsbFRleHQudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJaW5kZW50U3RhcnRPZmZzZXQgPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJd2hpdGVzcGFjZVJ1biA9IHByZXZpb3VzUmVnaW9uRnVsbFRleHQ7Ci0JCQl9Ci0JCQlpZiAoKHByZXZpb3VzUmVnaW9uRnVsbFRleHQgIT0gbnVsbCkgJiYgKHdoaXRlc3BhY2VSdW4gPT0gbnVsbCkgJiYgIWdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKSB7Ci0JCQkJd2hpdGVzcGFjZVJ1biA9IGdldFRyYWlsaW5nV2hpdGVzcGFjZShwcmV2aW91c1JlZ2lvbkZ1bGxUZXh0KTsKLQkJCQlpbmRlbnRTdGFydE9mZnNldCA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpOwotCQkJfQotCi0JCQlpbnQgaW5kZW50TGV2ZWwgPSB0aGlzQ29uc3RyYWludHMuZ2V0SW5kZW50TGV2ZWwoKTsKLQkJCWlmIChhZGRJbmRlbnQgJiYgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVC5lcXVhbHMoaW5kZW50U3RyYXRlZ3kpKSB7Ci0JCQkJKytpbmRlbnRMZXZlbDsKLQkJCQl0aGlzQ29uc3RyYWludHMuc2V0SW5kZW50TGV2ZWwoaW5kZW50TGV2ZWwpOwotCQkJfQotCi0JCQkvLyBpbmRlbnQgaWYgbm90IGFscmVhZHkgaW5kZW50ZWQKLQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGluZGVudElmTm90QWxyZWFkeUluZGVudGVkKHRleHRFZGl0LCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGluZGVudExldmVsLCBpbmRlbnRTdGFydE9mZnNldCwgd2hpdGVzcGFjZVJ1bik7Ci0JCX0KLQkJcmV0dXJuIGF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvdyBleGFjdGx5IG9uZSB3aGl0ZXNwYWNlIGluIGN1cnJlbnRUZXh0UmVnaW9uLiBJZiB0aGVyZSBhcmUgbW9yZSwKLQkgKiBjb2xsYXBzZSB0byBvbmUuIElmIHRoZXJlIGFyZSBub25lLCBpbnNlcnQgb25lLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0RWRpdAotCSAqIEBwYXJhbSBjdXJyZW50RG9jdW1lbnRSZWdpb24KLQkgKiBAcGFyYW0gYXZhaWxhYmxlTGluZVdpZHRoCi0JICogQHBhcmFtIGN1cnJlbnRUZXh0UmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydFNwYWNlQW5kQ29sbGFwc2UoVGV4dEVkaXQgdGV4dEVkaXQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudERvY3VtZW50UmVnaW9uLCBpbnQgYXZhaWxhYmxlTGluZVdpZHRoLCBJVGV4dFJlZ2lvbiBjdXJyZW50VGV4dFJlZ2lvbikgewotCQlpbnQgdGV4dExlbmd0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJaW50IHJlZ2lvbkxlbmd0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldExlbmd0aCgpOwotCQlib29sZWFuIHRoZXJlQXJlU3BhY2VzID0gdGV4dExlbmd0aCA8IHJlZ2lvbkxlbmd0aDsKLQkJaW50IHNwYWNlc1N0YXJ0T2Zmc2V0ID0gY3VycmVudERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGN1cnJlbnRUZXh0UmVnaW9uKSArIHRleHRMZW5ndGg7Ci0KLQkJaWYgKHRoZXJlQXJlU3BhY2VzKSB7Ci0JCQlTdHJpbmcgZnVsbFRhZ05hbWUgPSBjdXJyZW50RG9jdW1lbnRSZWdpb24uZ2V0RnVsbFRleHQoY3VycmVudFRleHRSZWdpb24pOwotCQkJU3RyaW5nIHdoaXRlc3BhY2VSdW4gPSBmdWxsVGFnTmFtZS5zdWJzdHJpbmcodGV4dExlbmd0aCwgcmVnaW9uTGVuZ3RoKTsKLQkJCWNvbGxhcHNlU3BhY2VzKHRleHRFZGl0LCBzcGFjZXNTdGFydE9mZnNldCwgYXZhaWxhYmxlTGluZVdpZHRoLCB3aGl0ZXNwYWNlUnVuKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGluc2VydCBhIHNwYWNlCi0JCQlJbnNlcnRFZGl0IGluc2VydEVkaXQgPSBuZXcgSW5zZXJ0RWRpdChzcGFjZXNTdGFydE9mZnNldCwgU1BBQ0UpOwotCQkJdGV4dEVkaXQuYWRkQ2hpbGQoaW5zZXJ0RWRpdCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkSW5kZW50QmVmb3JlQXR0cmlidXRlKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBjb25zdHJhaW50cywgSVRleHRSZWdpb25MaXN0IHRleHRSZWdpb25zLCBpbnQgYXZhaWxhYmxlTGluZVdpZHRoLCBpbnQgY3VycmVudFRleHRSZWdpb25JbmRleCwgSVRleHRSZWdpb24gY3VycmVudFRleHRSZWdpb24sIElUZXh0UmVnaW9uIG5leHRUZXh0UmVnaW9uKSB7Ci0JCWJvb2xlYW4gaW5kZW50QXR0cmlidXRlID0gZmFsc2U7Ci0KLQkJLy8gbG9vayBhaGVhZCB0byBzZWUgaWYgZ29pbmcgdG8gaGl0IG1heCBsaW5lIHdpZHRoCi0JCS8vIHNvbWV0aGluZyBhdHRyTmFtZQotCQlpbnQgY3VycmVudFdpZHRoID0gY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgbmV4dFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMTsKLQkJaWYgKGN1cnJlbnRXaWR0aCA+IGF2YWlsYWJsZUxpbmVXaWR0aCkKLQkJCWluZGVudEF0dHJpYnV0ZSA9IHRydWU7Ci0JCWVsc2UgewotCQkJaWYgKChjdXJyZW50VGV4dFJlZ2lvbkluZGV4ICsgMikgPCB0ZXh0UmVnaW9ucy5zaXplKCkpIHsKLQkJCQkvLyBzdGlsbCBva2F5LCBzbyB0cnkgbmV4dCByZWdpb24KLQkJCQkvLyBzb21ldGhpbmcgYXR0ck5hbWU9Ci0JCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChjdXJyZW50VGV4dFJlZ2lvbkluZGV4ICsgMik7Ci0JCQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTLmVxdWFscyh0ZXh0UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJKytjdXJyZW50V2lkdGg7Ci0JCQkJCWlmIChjdXJyZW50V2lkdGggPiBhdmFpbGFibGVMaW5lV2lkdGgpCi0JCQkJCQlpbmRlbnRBdHRyaWJ1dGUgPSB0cnVlOwotCQkJCQllbHNlIHsKLQkJCQkJCWlmICgoY3VycmVudFRleHRSZWdpb25JbmRleCArIDMpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJCQkJLy8gc3RpbGwgb2theSwgc28gdHJ5IG5leHQgcmVnaW9uCi0JCQkJCQkJLy8gc29tZXRoaW5nIGF0dHJOYW1lPWF0dHJWYWx1ZQotCQkJCQkJCXRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoY3VycmVudFRleHRSZWdpb25JbmRleCArIDMpOwotCQkJCQkJCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFLmVxdWFscyh0ZXh0UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCQkJY3VycmVudFdpZHRoID0gK3RleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJCQlpZiAoY3VycmVudFdpZHRoID4gYXZhaWxhYmxlTGluZVdpZHRoKQotCQkJCQkJCQkJaW5kZW50QXR0cmlidXRlID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGVudEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgcHJvdmlkZWQgaW5mb3JtYXRpb24gKHBhcmVudENvbnN0cmFpbnRzICYgY3VycmVudERPTVJlZ2lvbiksCi0JICogdXBkYXRlIHRoZSBmb3JtYXR0aW5nIGNvbnN0cmFpbnRzIChmb3IgdGhpcyAmIGNoaWxkKQotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb25zdHJhaW50cwotCSAqICAgICAgICAgICAgY2FuIGJlIG51bGwKLQkgKiBAcGFyYW0gdGhpc0NvbnN0cmFpbnRzCi0JICogICAgICAgICAgICBjYW4gYmUgbnVsbAotCSAqIEBwYXJhbSBjaGlsZENvbnN0cmFpbnRzCi0JICogICAgICAgICAgICBjYW4gYmUgbnVsbAotCSAqIEBwYXJhbSBjdXJyZW50RE9NUmVnaW9uCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUZvcm1hdHRpbmdDb25zdHJhaW50cyhYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyB0aGlzQ29uc3RyYWludHMsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBjaGlsZENvbnN0cmFpbnRzLCBET01SZWdpb24gY3VycmVudERPTVJlZ2lvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBjdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uOwotCQlJRE9NTm9kZSBjdXJyZW50Tm9kZSA9IGN1cnJlbnRET01SZWdpb24uZG9tTm9kZTsKLQotCQkvLyBkZWZhdWx0IHRvIHdoYXRldmVyIHBhcmVudCdzIGNvbnN0cmFpbnQgc2FpZCB0byBkbwotCQlpZiAocGFyZW50Q29uc3RyYWludHMgIT0gbnVsbCkgewotCQkJaWYgKHRoaXNDb25zdHJhaW50cyAhPSBudWxsKSB7Ci0JCQkJdGhpc0NvbnN0cmFpbnRzLmNvcHlDb25zdHJhaW50cyhwYXJlbnRDb25zdHJhaW50cyk7Ci0JCQl9Ci0JCQlpZiAoY2hpbGRDb25zdHJhaW50cyAhPSBudWxsKSB7Ci0JCQkJY2hpbGRDb25zdHJhaW50cy5jb3B5Q29uc3RyYWludHMocGFyZW50Q29uc3RyYWludHMpOwotCQkJCS8vIGlmIHdoaXRlc3BhY2Ugc3RyYXRlZ3kgd2FzIG9ubHkgYSBoaW50LCBudWxsIGl0IG91dCBzbwotCQkJCS8vIGRlZmF1bHRzIGFyZSB0YWtlbiBpbnN0ZWFkCi0JCQkJaWYgKHBhcmVudENvbnN0cmFpbnRzLmlzV2hpdGVzcGFjZVN0cmF0ZWd5QUhpbnQoKSkKLQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3kobnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXQgdXAgY29uc3RyYWludHMgZm9yIGRpcmVjdCBjaGlsZHJlbiBvZiBkb2N1bWVudCByb290Ci0JCU5vZGUgcGFyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudE5vZGUgIT0gbnVsbCAmJiBwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlpZiAodGhpc0NvbnN0cmFpbnRzICE9IG51bGwpIHsKLQkJCQl0aGlzQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkUpOwotCQkJCXRoaXNDb25zdHJhaW50cy5zZXRJbmRlbnRTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuTkVXX0xJTkUpOwotCQkJCXRoaXNDb25zdHJhaW50cy5zZXRJbmRlbnRMZXZlbCgwKTsKLQkJCX0KLQkJCWlmIChjaGlsZENvbnN0cmFpbnRzICE9IG51bGwpIHsKLQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShudWxsKTsKLQkJCQljaGlsZENvbnN0cmFpbnRzLnNldEluZGVudFN0cmF0ZWd5KG51bGwpOwotCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SW5kZW50TGV2ZWwoMCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBvdGhlciBjb25kaXRpb25zIHRvIGNoZWNrIHdoZW4gc2V0dGluZyB1cCBjaGlsZCBjb25zdHJhaW50cwotCQlpZiAoY2hpbGRDb25zdHJhaW50cyAhPSBudWxsKSB7Ci0JCQlYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKTsKLQotCQkJLy8gaWYgd2UncmUgYXQgZG9jdW1lbnQgcm9vdCwgY2hpbGQgdGFncyBzaG91bGQgYWx3YXlzIGp1c3Qgc3RhcnQKLQkJCS8vIG9uIGEgbmV3IGxpbmUgYW5kIGhhdmUgYW4gaW5kZW50IGxldmVsIG9mIDAKLQkJCWlmIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkUpOwotCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SW5kZW50U3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLk5FV19MSU5FKTsKLQkJCQljaGlsZENvbnN0cmFpbnRzLnNldEluZGVudExldmVsKDApOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gQlVHMTA4MDc0ICYgQlVHODQ2ODggLSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGluIHhzbDp0ZXh0ICYKLQkJCQkvLyB4c2w6YXR0cmlidXRlCi0JCQkJU3RyaW5nIG5vZGVOYW1lc3BhY2VVUkkgPSBjdXJyZW50Tm9kZS5nZXROYW1lc3BhY2VVUkkoKTsKLQkJCQlpZiAoWFNMX05BTUVTUEFDRS5lcXVhbHMobm9kZU5hbWVzcGFjZVVSSSkpIHsKLQkJCQkJU3RyaW5nIG5vZGVOYW1lID0gKChFbGVtZW50KSBjdXJyZW50Tm9kZSkuZ2V0TG9jYWxOYW1lKCk7Ci0JCQkJCWlmIChYU0xfQVRUUklCVVRFLmVxdWFscyhub2RlTmFtZSkgfHwgWFNMX1RFWFQuZXF1YWxzKG5vZGVOYW1lKSkgewotCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gc2VhcmNoIHdpdGhpbiBjdXJyZW50IHRhZyBmb3IgeG1sOnNwYWNlIGF0dHJpYnV0ZQotCQkJCQlJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMgPSBjdXJyZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCQkJaW50IGkgPSAwOwotCQkJCQlib29sZWFuIHhtbFNwYWNlRm91bmQgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiBwcmVzZXJ2ZUZvdW5kID0gZmFsc2U7Ci0JCQkJCXdoaWxlIChpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpICYmICF4bWxTcGFjZUZvdW5kKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRS5lcXVhbHModGV4dFJlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJCQkJU3RyaW5nIHJlZ2lvblRleHQgPSBjdXJyZW50UmVnaW9uLmdldFRleHQodGV4dFJlZ2lvbik7Ci0JCQkJCQkJaWYgKFhNTF9TUEFDRS5lcXVhbHMocmVnaW9uVGV4dCkpIHsKLQkJCQkJCQkJaWYgKChpICsgMSkgPCB0ZXh0UmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJCQkJCSsraTsKLQkJCQkJCQkJCXRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoaSk7Ci0JCQkJCQkJCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMuZXF1YWxzKHRleHRSZWdpb24uZ2V0VHlwZSgpKSAmJiAoKGkgKyAxKSA8IHRleHRSZWdpb25zLnNpemUoKSkpIHsKLQkJCQkJCQkJCQkrK2k7Ci0JCQkJCQkJCQkJdGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpKTsKLQkJCQkJCQkJCQlyZWdpb25UZXh0ID0gY3VycmVudFJlZ2lvbi5nZXRUZXh0KHRleHRSZWdpb24pOwotCQkJCQkJCQkJCWlmIChQUkVTRVJWRS5lcXVhbHMocmVnaW9uVGV4dCkgfHwgUFJFU0VSVkVfUVVPVEVELmVxdWFscyhyZWdpb25UZXh0KSkgewotCQkJCQkJCQkJCQlwcmVzZXJ2ZUZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJeG1sU3BhY2VGb3VuZCA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJKytpOwotCQkJCQl9Ci0JCQkJCWlmICh4bWxTcGFjZUZvdW5kKSB7Ci0JCQkJCQlpZiAocHJlc2VydmVGb3VuZCkgewotCQkJCQkJCS8vIHByZXNlcnZlIHdhcyBmb3VuZCBzbyBzZXQgdGhlIHN0cmF0ZWd5Ci0JCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIHhtbDpzcGFjZSB3YXMgZm91bmQgYnV0IGl0IHdhcyBub3QgY29sbGFwc2UsIHNvCi0JCQkJCQkJLy8gdXNlIGRlZmF1bHQgd2hpdGVzcGFjZSBzdHJhdGVneQotCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ERUZBVUxUKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGhvdyB0byBoYW5kZSBub2RlcyB0aGF0IGhhdmUgbm9ud2hpdGVzcGFjZSB0ZXh0Ci0JCQkJCQkvLyBjb250ZW50Ci0JCQkJCQlOb2RlTGlzdCBub2RlTGlzdCA9IGN1cnJlbnROb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJCWludCBsZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQlib29sZWFuIHRleHROb2RlRm91bmQgPSBmYWxzZTsKLQkJCQkJCS8vIEJVRzIxNDUxNiAtIElmIHRoZSBwYXJlbnQgY29uc3RyYWludCBpcyB0byBwcmVzZXJ2ZSB3aGl0ZXNwYWNlLCBjaGlsZCBjb25zdHJhaW50cyBzaG91bGQKLQkJCQkJCS8vIHN0aWxsIHJlZmxlY3QgdGhlIHBhcmVudCBjb25zdHJhaW50cwotCQkJCQkJd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmICF0ZXh0Tm9kZUZvdW5kICYmIHBhcmVudENvbnN0cmFpbnRzICE9IG51bGwgJiYgIVhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5QUkVTRVJWRS5lcXVhbHMocGFyZW50Q29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpKSB7Ci0JCQkJCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlTGlzdC5pdGVtKGluZGV4KTsKLQkJCQkJCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCQkJdGV4dE5vZGVGb3VuZCA9ICEoKElET01UZXh0KSBjaGlsZE5vZGUpLmlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCSsraW5kZXg7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodGV4dE5vZGVGb3VuZCkgewotCQkJCQkJCWlmIChsZW5ndGggPiAxKSB7Ci0JCQkJCQkJCS8vIG1vcmUgaW4gaGVyZSB0aGFuIGp1c3QgdGV4dCwgc28gY29uc2lkZXIKLQkJCQkJCQkJLy8gdGhpcyBtaXhlZCBjb250ZW50Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KHByZWZlcmVuY2VzLmdldE1peGVkV2hpdGVzcGFjZVN0cmF0ZWd5KCkpOwotCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldEluZGVudFN0cmF0ZWd5KHByZWZlcmVuY2VzLmdldE1peGVkSW5kZW50U3RyYXRlZ3koKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQkvLyB0aGVyZSdzIG9ubHkgdGV4dAotCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShwcmVmZXJlbmNlcy5nZXRUZXh0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpOwotCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldEluZGVudFN0cmF0ZWd5KHByZWZlcmVuY2VzLmdldFRleHRJbmRlbnRTdHJhdGVneSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRJc1doaXRlc3BhY2VTdHJhdGVneUFIaW50KHRydWUpOwotCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SXNJbmRlbnRTdHJhdGVneUFIaW50KHRydWUpOwotCQkJCQkJfQotCi0JCQkJCQkvLyB0cnkgcmVmZXJyaW5nIHRvIGNvbnRlbnQgbW9kZWwgZm9yIGluZm9ybWF0aW9uIG9uCi0JCQkJCQkvLyB3aGl0ZXNwYWNlICYgaW5kZW50IHN0cmF0ZWd5Ci0JCQkJCQlNb2RlbFF1ZXJ5QWRhcHRlciBhZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSAoKElET01Eb2N1bWVudCkgY3VycmVudE5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q01Ob2RlKGN1cnJlbnROb2RlKTsKLQkJCQkJCWlmIChlbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJCQkJCS8vIGZvbGxvdyB3aGl0ZXNwYWNlIHN0cmF0ZWd5IHByZWZlcmVuY2UgZm9yCi0JCQkJCQkJLy8gcGNkYXRhIGNvbnRlbnQKLQkJCQkJCQlpbnQgY29udGVudFR5cGUgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJCQkKLQkJCQkJCQlTdHJpbmcgZmFjZXRWYWx1ZSA9IG51bGw7Ci0JCQkJCQkJaWYoZWxlbWVudERlY2xhcmF0aW9uLmdldERhdGFUeXBlKCkgIT0gbnVsbCkKLQkJCQkJCQkJZmFjZXRWYWx1ZSA9IChTdHJpbmcpIGVsZW1lbnREZWNsYXJhdGlvbi5nZXREYXRhVHlwZSgpLmdldFByb3BlcnR5KFBST1BFUlRZX1dISVRFU1BBQ0VfRkFDRVQpOwotCQkJCQkJCWlmKGZhY2V0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQlpZihQUkVTRVJWRS5lcXVhbHMoZmFjZXRWYWx1ZSkpCi0JCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUpOwotCQkJCQkJCQkvLyBGb3IgWFNEIHR5cGVzLCAiY29sbGFwc2UiIGNvcnJlc3BvbmRzIHRvIHRoZSBJR05PUkVBTkRUUklNIHN0cmF0ZWd5Ci0JCQkJCQkJCWVsc2UgaWYoQ09MTEFQU0UuZXF1YWxzKGZhY2V0VmFsdWUpKQotCQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRUFORFRSSU0pOwotCQkJCQkJCQllbHNlIGlmKFJFUExBQ0UuZXF1YWxzKGZhY2V0VmFsdWUpKQotCQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlJFUExBQ0UpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgJiYgcGFyZW50Q29uc3RyYWludHMgIT0gbnVsbCAmJiAhWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFLmVxdWFscyhwYXJlbnRDb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKSkpIHsKLQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3kocHJlZmVyZW5jZXMuZ2V0UENEYXRhV2hpdGVzcGFjZVN0cmF0ZWd5KCkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UICYmIHBhcmVudENvbnN0cmFpbnRzICE9IG51bGwgJiYgIVhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5QUkVTRVJWRS5lcXVhbHMocGFyZW50Q29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpKSB7Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkUpOwotCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldEluZGVudFN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkRFTlQpOwotCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldElzV2hpdGVzcGFjZVN0cmF0ZWd5QUhpbnQodHJ1ZSk7Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SXNJbmRlbnRTdHJhdGVneUFIaW50KHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJLy8gbG9vayBmb3IgeG1sOnNwYWNlIGluIGNvbnRlbnQgbW9kZWwKLQkJCQkJCQkJQ01OYW1lZE5vZGVNYXAgY21BdHRyaWJ1dGVzID0gZWxlbWVudERlY2xhcmF0aW9uLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkJCQkJCQkvLyBOb3QgbmVlZGVkIC0gd2UncmUgbG9va2luZyBmb3IgeG1sOnNwYWNlCi0JCQkJCQkJCS8vQ01OYW1lZE5vZGVNYXBJbXBsIGFsbEF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKGNtQXR0cmlidXRlcyk7Ci0JCQkJCQkJCS8vTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoY3VycmVudE5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KChFbGVtZW50KSBjdXJyZW50Tm9kZSwgZWxlbWVudERlY2xhcmF0aW9uLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQkJCQkJCS8vZm9yIChpbnQgayA9IDA7IGsgPCBub2Rlcy5zaXplKCk7IGsrKykgewotCQkJCQkJCQkvLwlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCQkJCQkvLwlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQkJCQkvLwkJYWxsQXR0cmlidXRlcy5wdXQoY21ub2RlKTsKLQkJCQkJCQkJLy8JfQotCQkJCQkJCQkvL30KLQkJCQkJCQkJLy9jbUF0dHJpYnV0ZXMgPSBhbGxBdHRyaWJ1dGVzOwotCi0JCQkJCQkJCS8vIENoZWNrIGltcGxpZWQgdmFsdWVzIGZyb20gdGhlIERURCB3YXkuCi0JCQkJCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlRGVjbGFyYXRpb24gPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21BdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShYTUxfU1BBQ0UpOwotCQkJCQkJCQlpZiAoYXR0cmlidXRlRGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJCQkJCQkJLy8gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBmb3VuZCwgY2hlY2sKLQkJCQkJCQkJCS8vIGl0Ci0JCQkJCQkJCQkvLyBvdXQuCi0KLQkJCQkJCQkJCS8vQlVHMjE0NTE2LzE5NjU0NCAtIEZpeGVkIE5QRSB0aGF0IHdhcyBjYXVzZWQgYnkgYW4gYXR0ciBoYXZpbmcKLQkJCQkJCQkJCS8vIGEgbnVsbCBhdHRyIHR5cGUKLQkJCQkJCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBudWxsOwotCQkJCQkJCQkJQ01EYXRhVHlwZSBhdHRyVHlwZSA9IGF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldEF0dHJUeXBlKCk7Ci0JCQkJCQkJCQlpZiAoYXR0clR5cGUgIT0gbnVsbCkgewotCQkJCQkJCQkJCWlmICgoYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9OT05FKSAmJiBhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWUoKSAhPSBudWxsKQotCQkJCQkJCQkJCQlkZWZhdWx0VmFsdWUgPSBhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWUoKTsKLQkJCQkJCQkJCQllbHNlIGlmICgoYXR0clR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpICE9IG51bGwpICYmIChhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkubGVuZ3RoID4gMCkpIHsKLQkJCQkJCQkJCQkJZGVmYXVsdFZhbHVlID0gYXR0clR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpWzBdOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQotCQkJCQkJCQkJLy8geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgbWVhbnMgcHJlc2VydmUKLQkJCQkJCQkJCS8vIHNwYWNlLAotCQkJCQkJCQkJLy8gZXZlcnl0aGluZyBlbHNlIG1lYW5zIGJhY2sgdG8KLQkJCQkJCQkJCS8vIGRlZmF1bHQuCi0JCQkJCQkJCQlpZiAoUFJFU0VSVkUuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpCi0JCQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFKTsKLQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuREVGQVVMVCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gSWYgdGhlIG5vZGUgaGFzIG5vIGF0dHJpYnV0ZXMsIGluaGVyaXQgdGhlIHBhcmVudHMgd2hpdGVzcGFjZSBzdHJhdGVneQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCWlmIChwYXJlbnRDb25zdHJhaW50cyAhPSBudWxsKQotCQkJCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KHBhcmVudENvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpKTsKLQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShudWxsKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIHNldCBkZWZhdWx0IHZhbHVlcyBhY2NvcmRpbmcgdG8gcHJlZmVyZW5jZXMKLQkJCWlmIChjaGlsZENvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpID09IG51bGwpIHsKLQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShwcmVmZXJlbmNlcy5nZXRFbGVtZW50V2hpdGVzcGFjZVN0cmF0ZWd5KCkpOwotCQkJfQotCQkJaWYgKGNoaWxkQ29uc3RyYWludHMuZ2V0SW5kZW50U3RyYXRlZ3koKSA9PSBudWxsKSB7Ci0JCQkJY2hpbGRDb25zdHJhaW50cy5zZXRJbmRlbnRTdHJhdGVneShwcmVmZXJlbmNlcy5nZXRFbGVtZW50SW5kZW50U3RyYXRlZ3koKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSBjdXJyZW50IGF2YWlsYWJsZSBsaW5lIHdpZHRoIGdpdmVuIGZ1bGxUZXh0LgotCSAqIAotCSAqIEBwYXJhbSBmdWxsVGV4dAotCSAqIEBwYXJhbSBhdmFpbGFibGVMaW5lV2lkdGgKLQkgKiBAcGFyYW0gbWF4QXZhaWxhYmxlTGluZVdpZHRoCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IHVwZGF0ZUxpbmVXaWR0aFdpdGhMYXN0TGluZShTdHJpbmcgZnVsbFRleHQsIGludCBhdmFpbGFibGVMaW5lV2lkdGgpIHsKLQkJaW50IG1heEF2YWlsYWJsZUxpbmVXaWR0aCA9IGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldE1heExpbmVXaWR0aCgpOwotCQlpbnQgbGluZVdpZHRoID0gYXZhaWxhYmxlTGluZVdpZHRoOwotCQlpZiAoZnVsbFRleHQgIT0gbnVsbCkgewotCQkJaW50IHRleHRMZW5ndGggPSBmdWxsVGV4dC5sZW5ndGgoKTsKLQkJCS8vIHVwZGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJLy8gZmluZCBsYXN0IG5ld2xpbmUKLQkJCWludCBsYXN0TEZPZmZzZXQgPSBmdWxsVGV4dC5sYXN0SW5kZXhPZignXG4nKTsKLQkJCWludCBsYXN0Q1JPZmZzZXQgPSBmdWxsVGV4dC5sYXN0SW5kZXhPZignXHInKTsKLQkJCS8vIGFsbCB0ZXh0IHdhcyBvbiAxIGxpbmUKLQkJCWlmIChsYXN0TEZPZmZzZXQgPT0gLTEgJiYgbGFzdENST2Zmc2V0ID09IC0xKSB7Ci0JCQkJLy8ganVzdCBzdWJ0cmFjdCB0ZXh0IGxlbmd0aCBmcm9tIGN1cnJlbnQKLQkJCQkvLyBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJCWxpbmVXaWR0aCAtPSBmdWxsVGV4dC5sZW5ndGgoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGNhbGN1bGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aCBvZiBsYXN0IGxpbmUKLQkJCQlpbnQgbGFzdE5ld0xpbmUgPSBNYXRoLm1heChsYXN0TEZPZmZzZXQsIGxhc3RDUk9mZnNldCk7Ci0JCQkJbGluZVdpZHRoID0gbWF4QXZhaWxhYmxlTGluZVdpZHRoIC0gKHRleHRMZW5ndGggLSBsYXN0TmV3TGluZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpbmVXaWR0aDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IGN1cnJlbnRSZWdpb24uZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJaW50IGxpbmUgPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KGN1cnJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJdHJ5IHsKLQkJCWlmIChsaW5lID4gMCkgewotCQkJCWxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcihsaW5lIC0gMSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJLy8gQlVHMTE1NzE2OiBpZiBjYW5ub3QgZ2V0IGxpbmUgZGVsaW1pdGVyIGZyb20gY3VycmVudCBsaW5lLCBqdXN0Ci0JCS8vIHVzZSBkZWZhdWx0IGxpbmUgZGVsaW1pdGVyCi0JCWlmIChsaW5lRGVsaW1pdGVyID09IG51bGwpCi0JCQlsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJcmV0dXJuIGxpbmVEZWxpbWl0ZXI7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGV4dHJhY3RMaW5lRGVsaW1pdGVycyhTdHJpbmcgYmFzZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uKSB7Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZ2V0TGluZURlbGltaXRlcihjdXJyZW50UmVnaW9uKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCBiYXNlLmxlbmd0aCgpOykgewotCQkJaW5kZXggPSBiYXNlLmluZGV4T2YobGluZURlbGltaXRlciwgaW5kZXgpOwotCQkJaWYoaW5kZXgrKyA+PSAwKQotCQkJCXNiLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKLQkJCWVsc2UKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQl2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1hNTEZvcm1hdHRlckZvcm1hdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGVyRm9ybWF0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMmVlN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGVyRm9ybWF0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciB0aGUgbmV3IHhtbCBmb3JtYXR0ZXIgc28gdGhhdCBpdCBjYW4gYmUgc3RpbGwKLSAqIGNvbnNpZGVyZWQgYW4gSVN0cnV0dXJlZEZvcm1hdFByb2Nlc3NvcgotICovCi1wdWJsaWMgY2xhc3MgWE1MRm9ybWF0dGVyRm9ybWF0UHJvY2Vzc29yIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgewotCXByaXZhdGUgRGVmYXVsdFhNTFBhcnRpdGlvbkZvcm1hdHRlciBmRm9ybWF0dGVyID0gbnVsbDsKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvcm1hdE1vZGVsKG1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdEZpbGUoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCS8vIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgZWRpdC4gV2lsbCBzYXZlIG1vZGVsIGlmIG1vZGVsCi0JCQkvLyBjaGFuZ2VkLgotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0KLQkJCS8vIGZvcm1hdAotCQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsKTsKLQotCQkJLy8gc2F2ZSBtb2RlbCBpZiBuZWVkZWQKLQkJCWlmICghc3RydWN0dXJlZE1vZGVsLmlzU2hhcmVkRm9yRWRpdCgpICYmIHN0cnVjdHVyZWRNb2RlbC5pc1NhdmVOZWVkZWQoKSkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgbnVsbCk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgbGVuZ3RoID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCi0JCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlpZihmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpCi0JCQlmUHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygiIiwgMik7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIGFjdGl2ZVJld3JpdGVTZXNzaW9uID0gKChJRG9jdW1lbnRFeHRlbnNpb240KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLmdldEFjdGl2ZVJld3JpdGVTZXNzaW9uKCk7Ci0JCWJvb2xlYW4gc3RhcnRlZFJld3JpdGVTZXNzaW9uID0gZmFsc2U7Ci0JCWlmIChhY3RpdmVSZXdyaXRlU2Vzc2lvbiA9PSBudWxsKSB7Ci0JCQlhY3RpdmVSZXdyaXRlU2Vzc2lvbiA9ICgoSURvY3VtZW50RXh0ZW5zaW9uNCkgc3RydWN0dXJlZERvY3VtZW50KS5zdGFydFJld3JpdGVTZXNzaW9uKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCk7Ci0JCQlzdGFydGVkUmV3cml0ZVNlc3Npb24gPSB0cnVlOwotCQl9Ci0JCWdldEZvcm1hdHRlcigpLnNldFByb2dyZXNzTW9uaXRvcihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCQkJcmV0dXJuIGZQcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCVRleHRFZGl0IGVkaXQgPSBnZXRGb3JtYXR0ZXIoKS5mb3JtYXQoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQkJaWYoZlByb2dyZXNzTW9uaXRvciAhPSBudWxsKQotCQkJZlByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7Ci0JCQotCQl0cnkgewotCQkJc3RydWN0dXJlZE1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJZWRpdC5hcHBseShzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJaWYoZlByb2dyZXNzTW9uaXRvciAhPSBudWxsKQotCQkJCWZQcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHN0YXJ0ZWRSZXdyaXRlU2Vzc2lvbiAmJiBhY3RpdmVSZXdyaXRlU2Vzc2lvbiAhPSBudWxsKSB7Ci0JCQkJKChJRG9jdW1lbnRFeHRlbnNpb240KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnN0b3BSZXdyaXRlU2Vzc2lvbihhY3RpdmVSZXdyaXRlU2Vzc2lvbik7Ci0JCQl9Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQlpZihmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpCi0JCQkJZlByb2dyZXNzTW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXROb2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJRE9NTm9kZSBkb21Ob2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJZm9ybWF0TW9kZWwoZG9tTm9kZS5nZXRNb2RlbCgpLCBkb21Ob2RlLmdldFN0YXJ0T2Zmc2V0KCksIGRvbU5vZGUuZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmUHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0KLQlwcml2YXRlIERlZmF1bHRYTUxQYXJ0aXRpb25Gb3JtYXR0ZXIgZ2V0Rm9ybWF0dGVyKCkgewotCQlpZiAoZkZvcm1hdHRlciA9PSBudWxsKSB7Ci0JCQlmRm9ybWF0dGVyID0gbmV3IERlZmF1bHRYTUxQYXJ0aXRpb25Gb3JtYXR0ZXIoKTsKLQkJfQotCQlyZXR1cm4gZkZvcm1hdHRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1hNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMmE1M2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotcHVibGljIGNsYXNzIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFU0VSVkUgPSAiUFJFU0VSVkUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MTEFQU0UgPSAiQ09MTEFQU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUdOT1JFID0gIklHTk9SRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJR05PUkVBTkRUUklNID0gIklHTk9SRUFORFRSSU0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVCA9ICJERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFUExBQ0UgPSAiUkVQTEFDRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTkRFTlQgPSAiSU5ERU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FV19MSU5FID0gIk5FV19MSU5FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOTElORSA9ICJJTkxJTkUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGludCBmQXZhaWxhYmxlTGluZVdpZHRoID0gMDsKLQlwcml2YXRlIGludCBmSW5kZW50TGV2ZWwgPSAwOwotCXByaXZhdGUgU3RyaW5nIGZJbmRlbnRTdHJhdGVneTsKLQlwcml2YXRlIFN0cmluZyBmV2hpdGVzcGFjZVN0cmF0ZWd5OwotCXByaXZhdGUgYm9vbGVhbiBmSXNJbmRlbnRTdHJhdGVneUFIaW50ID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc1doaXRlc3BhY2VTdHJhdGVneUFIaW50ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgdmFsdWVzIGluIHRoaXMgZm9ybWF0dGluZyBjb25zdHJhaW50IHdpdGggdmFsdWVzIGZyb20KLQkgKiBjb25zdHJhaW50cwotCSAqIAotCSAqIEBwYXJhbSBjb25zdHJhaW50cwotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5Q29uc3RyYWludHMoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzKSB7Ci0JCXNldEF2YWlsYWJsZUxpbmVXaWR0aChjb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSk7Ci0JCXNldEluZGVudExldmVsKGNvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCkpOwotCQlzZXRJbmRlbnRTdHJhdGVneShjb25zdHJhaW50cy5nZXRJbmRlbnRTdHJhdGVneSgpKTsKLQkJc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KGNvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF2YWlsYWJsZUxpbmVXaWR0aCgpIHsKLQkJcmV0dXJuIGZBdmFpbGFibGVMaW5lV2lkdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlTGluZVdpZHRoKGludCBsaW5lV2lkdGgpIHsKLQkJZkF2YWlsYWJsZUxpbmVXaWR0aCA9IGxpbmVXaWR0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEluZGVudExldmVsKCkgewotCQlyZXR1cm4gZkluZGVudExldmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluZGVudExldmVsKGludCBpbmRlbnRMZXZlbCkgewotCQlmSW5kZW50TGV2ZWwgPSBpbmRlbnRMZXZlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZGVudFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZkluZGVudFN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluZGVudFN0cmF0ZWd5KFN0cmluZyBpbmRlbnRTdHJhdGVneSkgewotCQlmSW5kZW50U3RyYXRlZ3kgPSBpbmRlbnRTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdoaXRlc3BhY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGZXaGl0ZXNwYWNlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KFN0cmluZyB3aGl0ZXNwYWNlU3RyYXRlZ3kpIHsKLQkJZldoaXRlc3BhY2VTdHJhdGVneSA9IHdoaXRlc3BhY2VTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0luZGVudFN0cmF0ZWd5QUhpbnQoKSB7Ci0JCXJldHVybiBmSXNJbmRlbnRTdHJhdGVneUFIaW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElzSW5kZW50U3RyYXRlZ3lBSGludChib29sZWFuIGlzSW5kZW50U3RyYXRlZ3lBSGludCkgewotCQlmSXNJbmRlbnRTdHJhdGVneUFIaW50ID0gaXNJbmRlbnRTdHJhdGVneUFIaW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzV2hpdGVzcGFjZVN0cmF0ZWd5QUhpbnQoKSB7Ci0JCXJldHVybiBmSXNXaGl0ZXNwYWNlU3RyYXRlZ3lBSGludDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc1doaXRlc3BhY2VTdHJhdGVneUFIaW50KGJvb2xlYW4gaXNXaGl0ZXNwYWNlU3RyYXRlZ3lBSGludCkgewotCQlmSXNXaGl0ZXNwYWNlU3RyYXRlZ3lBSGludCA9IGlzV2hpdGVzcGFjZVN0cmF0ZWd5QUhpbnQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1hNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzFiNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotCi1wdWJsaWMgY2xhc3MgWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUkVTRVJWRSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5QUkVTRVJWRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xMQVBTRSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5DT0xMQVBTRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJR05PUkUgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5ERU5UID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBORVdfTElORSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ORVdfTElORTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTkxJTkUgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSU5MSU5FOwotCi0JcHJpdmF0ZSBpbnQgZk1heExpbmVXaWR0aCA9IDcyOwotCXByaXZhdGUgYm9vbGVhbiBmQWxpZ25GaW5hbEJyYWNrZXQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZlNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZyA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbmRlbnRNdWx0aXBsZUF0dHJpYnV0ZXMgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkZvcm1hdENvbW1lbnRUZXh0ID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gZkpvaW5Db21tZW50TGluZXMgPSBmYWxzZTsKLQotCXByaXZhdGUgU3RyaW5nIGZQQ0RhdGFXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRleHRJbmRlbnRTdHJhdGVneSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkxJTkU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRleHRXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuQ09MTEFQU0U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkVsZW1lbnRJbmRlbnRTdHJhdGVneSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkRFTlQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZkVsZW1lbnRXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFOwotCXByaXZhdGUgU3RyaW5nIGZNaXhlZEluZGVudFN0cmF0ZWd5ID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVDsKLQlwcml2YXRlIFN0cmluZyBmTWl4ZWRXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFOwotCXByaXZhdGUgU3RyaW5nIGZPbmVJbmRlbnQgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBib29sZWFuIGZDbGVhckFsbEJsYW5rTGluZXMgPSBmYWxzZTsKLQotCXB1YmxpYyBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCXNldEZvcm1hdENvbW1lbnRUZXh0KHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfQ09NTUVOVF9URVhUKSk7Ci0JCQlzZXRKb2luQ29tbWVudExpbmVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfQ09NTUVOVF9KT0lOX0xJTkVTKSk7Ci0KLQkJCXNldE1heExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQlzZXRJbmRlbnRNdWx0aXBsZUF0dHJpYnV0ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCQlzZXRBbGlnbkZpbmFsQnJhY2tldChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQpKTsKLQkJCXNldFNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0VfQkVGT1JFX0VNUFRZX0NMT1NFX1RBRykpOwotCQkJCi0JCQlib29sZWFuIHByZXNlcnZlcGNkYXRhID0gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBSRVNFUlZFX0NEQVRBQ09OVEVOVCk7Ci0JCQlpZiAocHJlc2VydmVwY2RhdGEpCi0JCQkJZlBDRGF0YVdoaXRlc3BhY2VTdHJhdGVneSA9IFhNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcy5QUkVTRVJWRTsKLQkJCWVsc2UKLQkJCQlmUENEYXRhV2hpdGVzcGFjZVN0cmF0ZWd5ID0gWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzLkNPTExBUFNFOwotCi0JCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQl9Ci0JCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJfQotCQkJc2V0T25lSW5kZW50KGluZGVudC50b1N0cmluZygpKTsKLQkJCXNldENsZWFyQWxsQmxhbmtMaW5lcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldE1heExpbmVXaWR0aCgpIHsKLQkJcmV0dXJuIGZNYXhMaW5lV2lkdGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Rm9ybWF0Q29tbWVudFRleHQoKSB7Ci0JCXJldHVybiBmRm9ybWF0Q29tbWVudFRleHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QWxpZ25GaW5hbEJyYWNrZXQoKSB7Ci0JCXJldHVybiBmQWxpZ25GaW5hbEJyYWNrZXQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0U3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnKCkgewotCQlyZXR1cm4gZlNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZkluZGVudE11bHRpcGxlQXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBDRGF0YVdoaXRlc3BhY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGZQQ0RhdGFXaGl0ZXNwYWNlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0SW5kZW50U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBmVGV4dEluZGVudFN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFdoaXRlc3BhY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGZUZXh0V2hpdGVzcGFjZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudEluZGVudFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZkVsZW1lbnRJbmRlbnRTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRXaGl0ZXNwYWNlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBmRWxlbWVudFdoaXRlc3BhY2VTdHJhdGVneTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0Sm9pbkNvbW1lbnRMaW5lcygpIHsKLQkJcmV0dXJuIGZKb2luQ29tbWVudExpbmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEpvaW5Db21tZW50TGluZXMoYm9vbGVhbiBqb2luQ29tbWVudExpbmVzKSB7Ci0JCWZKb2luQ29tbWVudExpbmVzID0gam9pbkNvbW1lbnRMaW5lczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXRDb21tZW50VGV4dChib29sZWFuIGZvcm1hdENvbW1lbnRUZXh0KSB7Ci0JCWZGb3JtYXRDb21tZW50VGV4dCA9IGZvcm1hdENvbW1lbnRUZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZyhib29sZWFuIHNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZykgewotCQlmU3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnID0gc3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluZGVudE11bHRpcGxlQXR0cmlidXRlcyhib29sZWFuIGluZGVudE11bHRpcGxlQXR0cmlidXRlcykgewotCQlmSW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzID0gaW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBDRGF0YVdoaXRlc3BhY2VTdHJhdGVneShTdHJpbmcgZGF0YVdoaXRlc3BhY2VTdHJhdGVneSkgewotCQlmUENEYXRhV2hpdGVzcGFjZVN0cmF0ZWd5ID0gZGF0YVdoaXRlc3BhY2VTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGlnbkZpbmFsQnJhY2tldChib29sZWFuIGFsaWduRmluYWxCcmFja2V0KSB7Ci0JCWZBbGlnbkZpbmFsQnJhY2tldCA9IGFsaWduRmluYWxCcmFja2V0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWl4ZWRJbmRlbnRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGZNaXhlZEluZGVudFN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1peGVkSW5kZW50U3RyYXRlZ3koU3RyaW5nIG1peGVkSW5kZW50U3RyYXRlZ3kpIHsKLQkJZk1peGVkSW5kZW50U3RyYXRlZ3kgPSBtaXhlZEluZGVudFN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWl4ZWRXaGl0ZXNwYWNlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBmTWl4ZWRXaGl0ZXNwYWNlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWl4ZWRXaGl0ZXNwYWNlU3RyYXRlZ3koU3RyaW5nIG1peGVkV2hpdGVzcGFjZVN0cmF0ZWd5KSB7Ci0JCWZNaXhlZFdoaXRlc3BhY2VTdHJhdGVneSA9IG1peGVkV2hpdGVzcGFjZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0T25lSW5kZW50KCkgewotCQlyZXR1cm4gZk9uZUluZGVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXhMaW5lV2lkdGgoaW50IG1heExpbmVXaWR0aCkgewotCQlmTWF4TGluZVdpZHRoID0gbWF4TGluZVdpZHRoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9uZUluZGVudChTdHJpbmcgb25lSW5kZW50KSB7Ci0JCWZPbmVJbmRlbnQgPSBvbmVJbmRlbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkgewotCQlyZXR1cm4gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGVhckFsbEJsYW5rTGluZXMoYm9vbGVhbiBjbGVhckFsbEJsYW5rTGluZXMpIHsKLQkJZkNsZWFyQWxsQmxhbmtMaW5lcyA9IGNsZWFyQWxsQmxhbmtMaW5lczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmZjFhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTDsKLQotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRYTUwgaW1wbGVtZW50cyBFbWJlZGRlZFR5cGVIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIExpc3Qgc3VwcG9ydGVkTWltZVR5cGVzOwotCXB1YmxpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9FbWJlZGRlZFhNTCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY29udGVudHR5cGUuRW1iZWRkZWRYTUwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW1iZWRkZWRYTUwuCi0JICovCi0JcHVibGljIEVtYmVkZGVkWE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBFbWJlZGRlZENvbnRlbnRUeXBlI2dldEFkYXB0ZXJGYWN0b3JpZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTCgpKTsKLQkJLy8gZmFjdG9yaWVzLmFkZEFsbChQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3JpZXModGhpcykpOwotCQlyZXR1cm4gZmFjdG9yaWVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRW1iZWRkZWRDb250ZW50VHlwZSNnZXRGYW1pbHlJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGYW1pbHlJZCgpIHsKLQkJcmV0dXJuIE1vZGVsSGFuZGxlckZvclhNTC5Bc3NvY2lhdGVkQ29udGVudFR5cGVJRDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKSB7Ci0JCWlmIChzdXBwb3J0ZWRNaW1lVHlwZXMgPT0gbnVsbCkgewotCQkJc3VwcG9ydGVkTWltZVR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc3VwcG9ydGVkTWltZVR5cGVzLmFkZCgiYXBwbGljYXRpb24veG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcy5hZGQoInRleHQveG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3VwcG9ydGVkTWltZVR5cGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCS8vVE9ETzogaW5pdGlhbGl6ZQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYXJzZXIoUmVnaW9uUGFyc2VyIHBhcnNlcikgewotCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUgZm9yICJwdXJlIiBYTUwKLQkJLy8gY29tcGFyZSB3aXRoIFhIVE1MCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRW1iZWRkZWRYTUwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gdW5kbyBhbnl0aGluZyB3ZSBkaWQgaW4gaW5pdGlhbGl6ZQotCi0JfQotCi0JcHVibGljIHZvaWQgdW5pbml0aWFsaXplUGFyc2VyKFJlZ2lvblBhcnNlciBwYXJzZXIpIHsKLQkJLy8gbmVlZCB0byB1bmRvIGFueXRoaW5nIHdlIGRpZCBpbiBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZ2V0U3VwcG9ydGVkTWltZVR5cGVzKCkuY29udGFpbnMobWltZVR5cGUpOwotCQlpZighY2FuSGFuZGxlKSB7Ci0JCQljYW5IYW5kbGUgPSBtaW1lVHlwZS5lbmRzV2l0aCgiK3htbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGNhbkhhbmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGJkZjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuWE1MRG9jdW1lbnRMb2FkZXI7Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBnZW5lcmljIFhNTCBtb2RlbCBoYW5kbGluZy4gSXQgaXMgYWxzbyBtYXJrZWQgYXMgdGhlIGRlZmF1bHQKLSAqIGNvbnRlbnQgdHlwZSBoYW5kbGVyLiBUaGVyZSBzaG91bGQgYmUgb25seSBvbmUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gKiBkZWZhdWx0LgotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxIYW5kbGVyRm9yWE1MIGV4dGVuZHMgQWJzdHJhY3RNb2RlbEhhbmRsZXIgaW1wbGVtZW50cyBJTW9kZWxIYW5kbGVyIHsKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXN0YXRpYyBTdHJpbmcgQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQgPSAib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvclhNTCgpIHsKLQkJc3VwZXIoKTsJCi0JCXNldElkKE1vZGVsSGFuZGxlcklEKTsKLQkJc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgWE1MRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCXJldHVybiBuZXcgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsTG9hZGVyIGdldE1vZGVsTG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IFhNTE1vZGVsTG9hZGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9YTUxNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvWE1MTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmOTIyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9YTUxNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkRlYnVnQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuWE1MRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm9wYWdhdGUuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYW4gWE1MIGZpbGUgYW5kIGNyZWF0ZXMgYW4gWE1MIFN0cnVjdHVyZWQgTW9kZWwuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNb2RlbExvYWRlciBleHRlbmRzIEFic3RyYWN0TW9kZWxMb2FkZXIgewotCi0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUl9FTkNPRElORyA9ICJlbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFhNTExvYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJZmFjdG9yeSA9IG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJLy8gRG9lcyBYTUwgbmVlZCBwcm9wYWdhdGluZyBhZGFwdGVyPyBPciBqdXN0IEpTUD8KLQkJZmFjdG9yeSA9IG5ldyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCWlmIChkb2N1bWVudExvYWRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBuZXcgWE1MRG9jdW1lbnRMb2FkZXIoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsTG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFhNTE1vZGVsTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgRE9NTW9kZWxJbXBsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCXN1cGVyLnByZUxvYWRBZGFwdChzdHJ1Y3R1cmVkTW9kZWwpOwotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgbW9kZWwgaW4gdGhlIGFkYXB0ZXIsIHRoaXMgd2lsbCBhZGFwdCBpdCB0bwotCQkvLyBmaXJzdCBub2RlLiBBZnRlciB0aGF0IHRoZSBQcm9wYWdhdGluZ0FkYXRlciBzcHJlYWRzIG92ZXIgdGhlCi0JCS8vIGNoaWxkcmVuIGJlaW5nCi0JCS8vIGNyZWF0ZWQuIEVhY2ggdGltZSB0aGF0IGhhcHBlbmRzLCBhIHNpZGUgZWZmZWN0IGlzIHRvCi0JCS8vIGFsc28gInNwcmVhZCIgc3ByZWNpZmljIHJlZ2lzdGVyZWQgYWRhcHRlcnMsCi0JCS8vIHRoZXkgdHdvIGNhbiBwcm9waWdhdGUgaXMgbmVlZGVkLgotCQkoKElOb2RlTm90aWZpZXIpIGRvbU1vZGVsLmdldERvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQotCQlpZiAoRGVidWcuZGVidWdOb3RpZmljYXRpb25BbmRFdmVudHMpIHsKLQkJCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvbU1vZGVsLmdldERvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXcgRGVidWdBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDVhOWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTCBleHRlbmRzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCB7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTC4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUwoKSB7Ci0JCXN1cGVyKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlRG9jdW1lbnRNYW5hZ2VyKENNRG9jdW1lbnRNYW5hZ2VyIG1ncikgewotCQlzdXBlci5jb25maWd1cmVEb2N1bWVudE1hbmFnZXIobWdyKTsKLQkJbWdyLnNldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9BU1lOQ19MT0FELCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgImZvcmNlcyIgYSBuZXcgb25lIHRvIGFsd2F5cyBiZSBjcmVhdGVkL3JldHVybmVkLCAKLQkgKiBub3QgImNhY2hlZCIgb24gdGhlIG5vZGUuIFRoYXQgc2VlbXMgaW5jb3JyZWN0LiAKLQkgKiBTaW1wbHkgdXNpbmcgc2hvdWxkUmVnaXN0ZXJGYWxzZSBzaG91bGQgd29yaywgZXhjZXB0LCAKLQkgKiB0aGVyZSBtaWdodCBoYXZlIGJlZW4gb25lIHRoZXJlIHRoYXQgc29tZW9uZSBlbHNlIGFscmVhZHkgCi0JICogZXhwbGljaXRseSBwdXQgdGhlcmUsIHNvIHRoaXMgaXMgb25seSB3YXkgSSBrbm93IHRvIAotCSAqIG92ZXJyaWRlIHRoYXQuIEVzcGVjaWFsbHkgY29tcGxpY2F0ZWQgaGVyZSBzaW5jZSBhIG51bWJlcgotCSAqIG9mIGFkYXB0ZXJzIGFyZSBmb3IgTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG9iamVjdCkgewotCQlyZXR1cm4gYWRhcHROZXcob2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjRhZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnlBZGFwdGVySW1wbCBtb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0JSVN0cnVjdHVyZWRNb2RlbCBzdGF0ZU5vdGlmaWVyID0gbnVsbDsKLQlwcml2YXRlIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyOwotCi0JLyoqCi0JICogTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCgpIHsKLQkJdGhpcyhNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJLZXkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQljbGFzcyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIgewotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwsCi0JCSAqICAgICAgSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCQlzdGF0ZU5vdGlmaWVyLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJCXN0YXRlTm90aWZpZXIgPSBuZXdNb2RlbDsKLQkJCXVwZGF0ZVJlc29sdmVyKHN0YXRlTm90aWZpZXIpOwotCQkJc3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQl1cGRhdGVSZXNvbHZlcihzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCX0KLQotCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXV0b0xvYWRDTSgpIHsKLQkJLy8gdW50aWwgdGhlIGV4aXN0ZW5jZSBvZiBhIENNRG9jdW1lbnRSZXF1ZXN0ZXJGYWN0b3J5IHRvIGNyZWF0ZSB0aGUKLQkJLy8gbG9hZCByZXF1ZXN0cywKLQkJLy8gcmV0dXJuIHRydWUKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlRG9jdW1lbnRNYW5hZ2VyKENNRG9jdW1lbnRNYW5hZ2VyIG1ncikgewotCQkvLyB0aGlzIGRlcGVuZHMgb24gdGhlcmUgYmVpbmcgYSBDTURvY3VtZW50UmVxdWVzdGVyRmFjdG9yeSBpbnN0YWxsZWQKLQkJbWdyLnNldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9BVVRPX0xPQUQsIGF1dG9Mb2FkQ00oKSk7Ci0JfQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQotCQlyZXR1cm4gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTChnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUFkYXB0ZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0KLQkJaWYgKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnLmRpc3BsYXlJbmZvKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTC5jcmVhdGVBZGFwdGVyIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1vZGVsUXVlcnlBZGFwdGVySW1wbCA9PSBudWxsKSB7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSB0YXJnZXQ7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHhtbE5vZGUuZ2V0TW9kZWwoKTsKLQkJCQlzdGF0ZU5vdGlmaWVyID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJCXN0YXRlTm90aWZpZXIuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkpOwotCi0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBtb2RlbC5nZXRSZXNvbHZlcigpOwotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLi4uIGJhc2VMb2NhdGlvbiA6ICIgKyByZXNvbHZlci5nZXRGaWxlQmFzZUxvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvKioKLQkJCQkgKiBYTUxDYXRhbG9nSWRSZXNvbHZlciBjdXJyZW50bHkgcmVxdWlyZXMgYSBmaWxlc3lzdGVtCi0JCQkJICogbG9jYXRpb24gc3RyaW5nLiBDdXN0b21hcmlseSB0aGlzIHdpbGwgYmUgd2hhdCBpcyBpbiB0aGUKLQkJCQkgKiBkZXByZWNhdGVkIFNTRSBVUklSZXNvbHZlciBhbmQgcmVxdWlyZWQgYnkgdGhlIENvbW1vbiBVUkkKLQkJCQkgKiBSZXNvbHZlci4KLQkJCQkgKi8KLQkJCQlVUklSZXNvbHZlciBpZFJlc29sdmVyID0gbnVsbDsKLQkJCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJCQlpZFJlc29sdmVyID0gbmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKHJlc29sdmVyLmdldEZpbGVCYXNlTG9jYXRpb24oKSwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogMjAzNjQ5IC0gdGhpcyBibG9jayBtYXkgYmUgbmVjZXNzYXJ5IGR1ZSB0byBvcmRlcmluZyBvZgotCQkJCQkgKiBzZXR0aW5nIHRoZSByZXNvbHZlciBpbnRvIHRoZSBtb2RlbAotCQkJCQkgKi8KLQkJCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCQkJCVN0cmluZyBtb2RlbHNCYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkJaWYgKG1vZGVsc0Jhc2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlGaWxlIGZpbGUgPSBuZXcgUGF0aChtb2RlbHNCYXNlTG9jYXRpb24pLnRvRmlsZSgpOwotCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQliYXNlTG9jYXRpb24gPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJCQkJSVJlc291cmNlIGRlcml2ZWRSZXNvdXJjZSA9IG51bGw7Ci0JCQkJCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCQkJCQkJZGVyaXZlZFJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGJhc2VQYXRoKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCWRlcml2ZWRSZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChiYXNlUGF0aC5zZWdtZW50KDApKTsKLQkJCQkJCQlJUGF0aCBkZXJpdmVkUGF0aCA9IGRlcml2ZWRSZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCWlmIChkZXJpdmVkUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJCWJhc2VMb2NhdGlvbiA9IGRlcml2ZWRQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlVUkkgdXJpID0gZGVyaXZlZFJlc291cmNlLmdldExvY2F0aW9uVVJJKCk7Ci0JCQkJCQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCQkJCQkJYmFzZUxvY2F0aW9uID0gdXJpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZihiYXNlTG9jYXRpb24gPT0gbnVsbCkgewotCQkJCQkJCWJhc2VMb2NhdGlvbiA9IG1vZGVsc0Jhc2VMb2NhdGlvbjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZFJlc29sdmVyID0gbmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKGJhc2VMb2NhdGlvbiwgbnVsbCk7Ci0JCQkJfQotCi0JCQkJQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSA9IG5ldyBDTURvY3VtZW50Q2FjaGUoKTsKLQkJCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBuZXcgWE1MTW9kZWxRdWVyeUltcGwoY21Eb2N1bWVudENhY2hlLCBpZFJlc29sdmVyKTsKLQotCQkJCS8vIGNzIHRvZG8uLi4KLQkJCQkvLyBmb3Igbm93IHdlIGNyZWF0ZSBhIENNRG9jdW1lbnRDYWNoZSBvbiBhICdwZXIgZWRpdG9yJyBiYXNpcwotCQkJCS8vIGluIHRoZSBmdXR1cmUgd2UgbmVlZCB0byBzdXBwb3J0IGEgQ01Eb2N1bWVudENhY2hlIHRoYXQgaXMKLQkJCQkvLyBzaGFyZWQgYmV0d2VlbiBlZGl0b3JzCi0JCQkJLy8gbnNkIGNvbW1lbnQ6IG1heSBub3QgYmUgYXBwcm9wcmlhdGUgZGVwZW5kaW5nIG9uCi0JCQkJQ01Eb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyID0gbW9kZWxRdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpOwotCQkJCWlmIChkb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQljb25maWd1cmVEb2N1bWVudE1hbmFnZXIoZG9jdW1lbnRNYW5hZ2VyKTsKLQkJCQl9Ci0JCQkJbW9kZWxRdWVyeUFkYXB0ZXJJbXBsID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVySW1wbChjbURvY3VtZW50Q2FjaGUsIG1vZGVsUXVlcnksIGlkUmVzb2x2ZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQlpZiAoc3RhdGVOb3RpZmllciAhPSBudWxsKQotCQkJc3RhdGVOb3RpZmllci5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSk7Ci0JCXN0YXRlTm90aWZpZXIgPSBudWxsOwotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXJJbXBsICE9IG51bGwpCi0JCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwucmVsZWFzZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlc29sdmVyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQotCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCUlGaWxlIGJhc2VGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKSk7Ci0JCWlmIChiYXNlRmlsZSAhPSBudWxsKSB7Ci0JCQlpZiAoYmFzZUZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gYmFzZUZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsICYmIGJhc2VGaWxlLmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkgewotCQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChiYXNlTG9jYXRpb24gPT0gbnVsbCkgewotCQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQl9Ci0JCW1vZGVsUXVlcnlBZGFwdGVySW1wbC5zZXRJZFJlc29sdmVyKG5ldyBYTUxDYXRhbG9nSWRSZXNvbHZlcihiYXNlTG9jYXRpb24sIG1vZGVsLmdldFJlc29sdmVyKCkpKTsKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkgewotCQlpZiAoaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlM2U4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBhc3NvY2lhdGUgTW9kZWxRdWVyeSAoYW5kIHJlbGF0ZWQgZGF0YSkgd2l0aCBhCi0gKiBEb2N1bWVudCAob3IgSVN0cnVjdHVyZWRNb2RlbCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5VXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoRG9jdW1lbnQgbm9kZSkgewotCQlNb2RlbFF1ZXJ5QWRhcHRlciBtb2RlbFF1ZXJ5QWRhcHRlciA9IGdldE1vZGVsUXVlcnlBZGFwdGVyKG5vZGUpOwotCQlyZXR1cm4gbW9kZWxRdWVyeUFkYXB0ZXIgIT0gbnVsbCA/IG1vZGVsUXVlcnlBZGFwdGVyLmdldENNRG9jdW1lbnRDYWNoZSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSVJlc29sdmVyIGdldElkUmVzb2x2ZXIoRG9jdW1lbnQgbm9kZSkgewotCQlNb2RlbFF1ZXJ5QWRhcHRlciBtb2RlbFF1ZXJ5QWRhcHRlciA9IGdldE1vZGVsUXVlcnlBZGFwdGVyKG5vZGUpOwotCQlyZXR1cm4gbW9kZWxRdWVyeUFkYXB0ZXIgIT0gbnVsbCA/IG1vZGVsUXVlcnlBZGFwdGVyLmdldElkUmVzb2x2ZXIoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoRG9jdW1lbnQgbm9kZSkgewotCQlNb2RlbFF1ZXJ5QWRhcHRlciBtb2RlbFF1ZXJ5QWRhcHRlciA9IGdldE1vZGVsUXVlcnlBZGFwdGVyKG5vZGUpOwotCQlyZXR1cm4gbW9kZWxRdWVyeUFkYXB0ZXIgIT0gbnVsbCA/IG1vZGVsUXVlcnlBZGFwdGVyLmdldE1vZGVsUXVlcnkoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAoKCEobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKSB8fCBtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRNb2RlbFF1ZXJ5KCgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNb2RlbFF1ZXJ5QWRhcHRlciBnZXRNb2RlbFF1ZXJ5QWRhcHRlcihEb2N1bWVudCBub2RlKSB7Ci0JCU1vZGVsUXVlcnlBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0JCQlyZXN1bHQgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpIG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxDYXRhbG9nSWRSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTg1MmY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxDYXRhbG9nSWRSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLy8gVE9ETyBjcyA6IHJlbW92ZSB0aGlzIGNsYXNzIGFuZCB1dGlsaXplIHRoZSBjb21tb24gVVJJUmVzb2x2ZXIgZGlyZWN0bHkKLS8vIFdlIG5lZWQgdG8gdXBkYXRlIHNvbWUgb2YgdGhlIE1vZGVsUXVlcnkgcmVsYXRlZCBjb2RlIHRvIHBhc3MgdGhlCi0vLyAnYmFzZUxvY2F0aW9uJyB0aHJ1Ci0vLyBhbmQgdGhlbiB0aGVyZSdsbCBiZSBub2RlIG5lZWQgZm9yIHRoaXMgY2xhc3MuCi0vLyAKLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nSWRSZXNvbHZlciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXIgewotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbjsKLQotCXByb3RlY3RlZCBVUklSZXNvbHZlciB1cmlyZXNvbHZlcjsKLQotCXByaXZhdGUgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBYTUxDYXRhbG9nSWRSZXNvbHZlcihTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbikgewotCQl0aGlzKCk7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JfQotCi0JcHVibGljIFhNTENhdGFsb2dJZFJlc29sdmVyKFN0cmluZyByZXNvdXJjZUxvY2F0aW9uLCBVUklSZXNvbHZlciB1cmlyZXNvbHZlcikgewotCQl0aGlzKHJlc291cmNlTG9jYXRpb24pOwotLy8gdGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIHR3byBudWxsIGFyZ3VtZW50cy4KLS8vIElmIHNvLCBhbiBhc3NlcnQgd2lsbCBvY2N1ciBsYXRlciB3aGVuIHJlc29sdmUgaXMgY2FsbGVkLiAKLS8vIFNlZSAxMTgzNzEgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIjcmVzb2x2ZSB0aHJvd3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uCi0vLwotLy8gYnV0LCBJJ20gbm90IGVuYWJsaW5nIHRoaXMgY2hlY2sgbm93IGR1ZSB0byBsYXRlbmVzcyBpbiBjeWNsZS4gCQkKLS8vCQlpZiAocmVzb3VyY2VMb2NhdGlvbiA9PSBudWxsICYmIHVyaXJlc29sdmVyID09IG51bGwpIHsKLS8vCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYm90aCBsb2NhdGlvbiBhbmQgcmVzb2x2ZXIgY2FuIG5vdCBiZSBudWxsIik7Ci0vLwkJfQotCQl0aGlzLnVyaXJlc29sdmVyID0gdXJpcmVzb2x2ZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSByZXNvdXJjZUxvY2F0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFJlc291cmNlTG9jYXRpb24oKSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQlpZiAodXJpcmVzb2x2ZXIgIT0gbnVsbCkKLQkJCQlsb2NhdGlvbiA9IHVyaXJlc29sdmVyLmdldEZpbGVCYXNlTG9jYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIGJhc2UsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IHN5c3RlbUlkOwotCQlpZiAoYmFzZSA9PSBudWxsKSB7Ci0JCQliYXNlID0gZ2V0UmVzb3VyY2VMb2NhdGlvbigpOwotCQkJLy8gYnVnIDExNzMyMCwgZW5zdXJlIGJhc2UgVVJJIGlzICdwcm90b2NhbCcgcXVhbGlmaWVkIGJlZm9yZQotCQkJLy8gcGFzc2luZyBpdCB0aHJ1IHRvIFVSSVJlc29sdmVyCi0JCQkvLyBidWcgMTE3NDI0LCB3ZSBzaG91bGQgYmUgYWJsZSB0byBhc3N1bWUgdGhhdCB0aGUgYmFzZSBsb2NhdGlvbgotCQkJLy8gaXMgbm9uLW51bGwKLQotCQkJLyoqCi0JCQkgKiBXZSBzaG91bGRuJ3QgYXNzZXJ0IGEgZmFpbHVyZSBiZWNhdXNlIHRoZSBjYXRhbG9nIGRvZXMgbm90Ci0JCQkgKiByZXF1aXJlIGEgYmFzZSBsb2NhdGlvbiB0byBvcGVyYXRlIGFuZCBpdCB3aWxsIGJlIGNhbGxlZCBmcm9tCi0JCQkgKiBub24tZmlsZS1iYXNlZCBzY2VuYXJpb3MuCi0JCQkgKiAKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDYxNzYKLQkJCSAqLwotCQkJLy8gQXNzZXJ0LmlzTm90TnVsbChiYXNlLCAiQmFzZSBsb2NhdGlvbiBpcyBleHBlY3RlZCB0byBiZSBub24gbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCWJhc2UgPSBVUklIZWxwZXIuYWRkSW1wbGllZEZpbGVQcm90b2NvbChiYXNlKTsKLQkJCX0KLQkJfQotCQlyZXN1bHQgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVQaHlzaWNhbExvY2F0aW9uKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIGxvZ2ljYWxMb2NhdGlvbikgewotCQkvLyBUaGlzIGNsYXNzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgdG8gcGVyZm9ybSBwaHlzaWNhbCByZXNvbHV0aW9uIQotCQkvLyBJZiBpdCBkb2VzIHdlIHNob3VsZCBsb2cgaXQgYXMgYW4gZXJyb3IKLQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsICJYTUxDYXRhbG9nSURSZXNvbHZlci5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbigpIGNhbGxlZCB1bmV4cGVjdGVkbHkiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbG9naWNhbExvY2F0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZDE0YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLlhNTEFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcgotICogCi0gKiBUaGlzIGFkZGVkIGFuZC9vciBtYWRlIHB1YmxpYyBzcGVjaWZpY2FsbHkgZm9yIGV4cGVyaW1lbnRhdGlvbi4gSXQgd2lsbAotICogY2hhbmdlIGFzIHRoaXMgZnVuY3Rpb25hbGl0eSBiZWNvbWVzIEFQSS4gU2VlCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5MDg0Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgWE1MQXNzb2NpYXRpb25Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcjsKLQotCXB1YmxpYyBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcihDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIoY2FjaGUpOwotCQl0aGlzLmlkUmVzb2x2ZXIgPSBpZFJlc29sdmVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0KLQkJLy8gQ1MgOiBzcG9va3kgY29kZSBhbGVydCEKLQkJLy8gdGhpcyBsb29rIHJlYWxseSBzdHJhbmdlIGJlY2F1c2Ugd2UncmUgcGFzc2luZyBudWxsIGluIGFzIHRoZSBmaXJzdAotCQkvLyBhcmd1bWVudAotCQkvLyBob3dldmVyIHdlJ3JlIGFzc3VtaW5nIHRoZSB1c2Ugb2YgYSAnZnVkZ2VkJyBVUklSZXNvbHZlciB0aGF0IGtub3dzCi0JCS8vIHRoZQotCQkvLyBjb3JyZWN0IGJhc2VMb2NhdGlvbiBhbmQgd2lsbCBjYWxsIHRvIHRoZSBVUklSZXNvbHZlciBmcmFtZXdvcmsKLQkJLy8gcHJvcGVybHkKLQotCQkvLyBDUyA6IG5vdGUgdGhhdCB3ZSBzaG91bGQgbmV2ZXIgY2FsbCByZXNvbHZlUGh5c2ljYWwgYXQgdGhpcyBwb2ludC4KLQkJLy8gUGh5c2ljYWwgcmVzb2x1dGlvbiBzaG91bGQgb25seSBvY2N1ciB3aGVuIHdlJ3JlIGludGVyZXN0aW5nIHRvCi0JCS8vIG9wZW5pbmcgdGhlIGFjdHVhbCBzdHJlYW0uCi0JCS8vIFRoZSBDTURvY3VtZW50RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiB3b3VsZCBiZSByZXNwb25zaWJsZSBmb3IKLQkJLy8gY2FsbGluZyByZXNvbHZlUGh5c2ljYWwuCi0JCS8vIEFsbCB3ZSBuZWVkIHRvIGRvIGhlcmUgaXMgcmV0dXJuIGEgJ2xvZ2ljYWwnIFVSSQotCi0JCWlmIChpZFJlc29sdmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGlkUmVzb2x2ZXIucmVzb2x2ZShudWxsLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxNb2RlbFF1ZXJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZmEwMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLk1vZGVsUXVlcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW92YWJsZU1vZGVsUXVlcnk7Ci0KLQotcHVibGljIGNsYXNzIFhNTE1vZGVsUXVlcnlJbXBsIGV4dGVuZHMgTW9kZWxRdWVyeUltcGwgaW1wbGVtZW50cyBNb3ZhYmxlTW9kZWxRdWVyeSB7Ci0KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudENhY2hlIGZDYWNoZSA9IG51bGw7Ci0KLQlwdWJsaWMgWE1MTW9kZWxRdWVyeUltcGwoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKG5ldyBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcihjYWNoZSwgaWRSZXNvbHZlcikpOwotCQlmQ2FjaGUgPSBjYWNoZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vdmFibGVNb2RlbFF1ZXJ5I3NldElkUmVzb2x2ZXIoVVJJUmVzb2x2ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdJZFJlc29sdmVyKSB7Ci0JCW1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyID0gbmV3IFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGZDYWNoZSwgbmV3SWRSZXNvbHZlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0Jsb2NrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTRhODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLklCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBCbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBleHRlbmRzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGltcGxlbWVudHMgSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgcGFydGl0aW9uVHlwZTsKLQotCS8qKgotCSAqIEEgQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgbGlrZSBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sCi0JICogYnV0IGlzIHRoZSByZXN1bHQgb2YgYSAiYmxvY2sgc2NhbiIuCi0JICovCi0JcHVibGljIEJsb2NrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZSgpIHsKLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gbnVsbCkgewotCQkJLy8gZXZlbnR1YWxseSBjYW4gbG9vayB1cCBzdXJyb3VuZGluZ1RhZyBuYW1lCi0JCQkvLyBidXQgdGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgZW50ZW5kZWQgZm9yIGZ1dHVyZQotCQkJLy8gZXh0ZW5zaWJpbGl0eS4gVGhpcyBtYXkgY2hhbmdlLgotCQkJLy9wYXJ0aXRpb25UeXBlID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS4iICsgdGFnbmFtZTsKLQkJfQotCQlyZXR1cm4gcGFydGl0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0aXRpb25UeXBlKFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCXRoaXMucGFydGl0aW9uVHlwZSA9IHBhcnRpdGlvblR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ29udGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ29udGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGUzMzAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NvbnRleHRSZWdpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuVGV4dFJlZ2lvbkxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotcHVibGljIGNsYXNzIENvbnRleHRSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJVGV4dFJlZ2lvbkNvbnRhaW5lciB7Ci0JcHJvdGVjdGVkIGludCBsZW5ndGg7Ci0JcHJvdGVjdGVkIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBwYXJlbnQ7Ci0JcHJvdGVjdGVkIElUZXh0UmVnaW9uTGlzdCByZWdpb25zOwotCXByb3RlY3RlZCBpbnQgc3RhcnQ7Ci0JcHJvdGVjdGVkIGludCB0ZXh0TGVuZ3RoOwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLQotCXB1YmxpYyBDb250ZXh0UmVnaW9uQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCQlyZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCi0JfQotCi0JLyoqCi0JICogdGhlc2UgImRlZXAiIHBhcmVudGluZyBpcyBub3Qgbm9ybWFsLCBidXQganVzdCBpbiBjYXNlLgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBfZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0JCS8vIGdvIHVwIGVub3VnaCBwYXJlbnRzIHRvIGdldCB0byBkb2N1bWVudAotCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkvLyB3b3VsZCBiZSBhbiBlcnJvciBub3QgdG8gYmUgY29udGFpbmVyLCBidXQKLQkJCS8vIHdvbid0IGNoZWNrIGZvciBpdCBub3cKLQkJCXBhcmVudCA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIHBhcmVudCkuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuICgoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgcGFyZW50KS5nZXRQYXJlbnREb2N1bWVudCgpOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0KGludCBpKSB7Ci0KLQkJc3RhcnQgKz0gaTsKLQkJLy8gSSBlcnJvbmVvdXNseSBhZGRlZCBsZW5ndGggYW5kIHRleHRMZW5ndGgKLQkJLy8gVE9ETzogbWF5IHdhbnQgdG8gcmVuYW1lIHRoaXMgbWV0aG9kIHRvIGFkanVzdFN0YXJ0Ci0JCS8vbGVuZ3RoICs9IGk7Ci0JCS8vdGV4dExlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCXN0YXJ0ICs9IGk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCXRleHRMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCBpKSB7Ci0KLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgPD0gaSAmJiBpIDwgZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldChjb250YWluZWRSZWdpb24pIDw9IG9mZnNldCAmJiBvZmZzZXQgPCBnZXRFbmRPZmZzZXQoY29udGFpbmVkUmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBqdXN0IHRvIGVxdWF0ZSBwb3NpdGlvbnMuIGNsaWVudHMgbWF5ICh3aWxsIHByb2JhYmx5KQotCSAqIHN0aWxsIG5lZWQgdG8gbWFrZSBjYWxscyB0byBlcXVhdGUgcmVnaW9ucywgcGFyZW50LCBldGMuCi0JICovCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlzdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlsZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCXRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gc3RhcnQgKyBsZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCS8vIG91ciBzdGFydE9mZnNldCB0YWtlIGludG8gYWNjb3VudCBvdXIgcGFyZW50LCBhbmQgb3VyIHN0YXJ0Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpICsgZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldChjb250YWluZWRSZWdpb24pICsgY29udGFpbmVkUmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbigpIHsKLQkJcmV0dXJuIGdldFJlZ2lvbnMoKS5nZXQoMCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dCgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldEZ1bGxUZXh0KHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQkvLyBNdXN0IGJlIHByb3hpZWQgaGVyZSBzaW5jZSBhUmVnaW9uIHNob3VsZCBhbHdheXMgYmUgYSBjaGlsZCBvZgotCQkvLyAqdGhpcyogY29udGFpbmVyIGFuZCBpbmRleGVkIGZyb20KLQkJLy8gdGhpcyBjb250YWluZXIncyBvZmZzZXQKLQkJcmV0dXJuIHBhcmVudC5nZXRGdWxsVGV4dCgpLnN1YnN0cmluZyhzdGFydCArIGFSZWdpb24uZ2V0U3RhcnQoKSwgc3RhcnQgKyBhUmVnaW9uLmdldEVuZCgpKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbigpIHsKLQkJcmV0dXJuIGdldFJlZ2lvbnMoKS5nZXQoZ2V0UmVnaW9ucygpLnNpemUoKSAtIDEpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQotCi0JcHVibGljIGludCBnZXROdW1iZXJPZlJlZ2lvbnMoKSB7Ci0JCXJldHVybiBnZXRSZWdpb25zKCkuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFRoZSBwYXJhbWV0ZXIgb2Zmc2V0IHJlZmVycyB0byB0aGUgb3ZlcmFsbCBvZmZzZXQgaW4gdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCUlUZXh0UmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyZWdpb25zICE9IG51bGwpIHsKLQkJCWludCB0aGlzU3RhcnRPZmZzZXQgPSBnZXRTdGFydE9mZnNldCgpOwotCQkJaWYgKG9mZnNldCA8IHRoaXNTdGFydE9mZnNldCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWludCB0aGlzRW5kT2Zmc2V0ID0gZ2V0U3RhcnRPZmZzZXQoKSArIGdldExlbmd0aCgpOwotCQkJaWYgKG9mZnNldCA+IHRoaXNFbmRPZmZzZXQpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkvLyB0cmFuc2Zvcm0gdGhlIHJlcXVlc3RlZCBvZmZzZXQgdG8gdGhlICJzY2FsZSIgdGhhdAotCQkJLy8gcmVnaW9ucyBhcmUgc3RvcmVkIGluLCB3aGljaCBhcmUgYWxsIHJlbGF0aXZlIHRvIHRoZQotCQkJLy8gc3RhcnQgcG9pbnQuCi0JCQkvL2ludCB0cmFuc2Zvcm1lZE9mZnNldCA9IG9mZnNldCAtIGdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkvLwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBnZXRSZWdpb25zKCk7Ci0JCQlpbnQgbGVuZ3RoID0gcmVnaW9ucy5zaXplKCk7Ci0JCQlpbnQgbG93ID0gMDsKLQkJCWludCBoaWdoID0gbGVuZ3RoOwotCQkJaW50IG1pZCA9IDA7Ci0JCQkvLyBCaW5hcnkgc2VhcmNoIGZvciB0aGUgcmVnaW9uCi0JCQl3aGlsZSAobG93IDwgaGlnaCkgewotCQkJCW1pZCA9IGxvdyArICgoaGlnaCAtIGxvdykgPj4gMSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQobWlkKTsKLQkJCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWdpb24ocykgaW4gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjo6Z2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQ6ICIgKyByZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIG1pZHBvaW50IG9mIHNlYXJjaDoiICsgbWlkKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZXF1ZXN0ZWQgb2Zmc2V0OiAiICsgb2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiIHRyYW5zZm9ybWVkT2Zmc2V0OiAiICsKLQkJCQkJLy8gdHJhbnNmb3JtZWRPZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBzdGFydDogIiArIHJlZ2lvbi5nZXRTdGFydCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gZW5kOiAiICsgcmVnaW9uLmdldEVuZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gdHlwZTogIiArIHJlZ2lvbi5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBjbGFzczogIiArIHJlZ2lvbi5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJfQotCQkJCS8vIFJlZ2lvbiBpcyBiZWZvcmUgdGhpcyBvbmUKLQkJCQlpZiAob2Zmc2V0IDwgcmVnaW9uLmdldFN0YXJ0KCkgKyB0aGlzU3RhcnRPZmZzZXQpCi0JCQkJCWhpZ2ggPSBtaWQ7Ci0JCQkJZWxzZSBpZiAob2Zmc2V0ID4gKHJlZ2lvbi5nZXRFbmQoKSArIHRoaXNTdGFydE9mZnNldCAtIDEpKQotCQkJCQlsb3cgPSBtaWQgKyAxOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uTGlzdCBnZXRSZWdpb25zKCkgewotCQlyZXR1cm4gcmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldFN0YXJ0T2Zmc2V0KCkgKyBnZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCS8vIGl0IGlzIGFuIGVycm9yIHRvIHBhc3MgbnVsbCB0byB0aGlzIG1ldGhvZAotCQkvLyBJU1NVRTogbmVlZCBiZXR0ZXIgInNwZWMiIG9uIGVycm9yIGJlaGF2aW9yOiAKLQkJLy8gZm9yIG5vdyB3aWxsIHJldHVybiB6ZXJvIGFzIHRoaXMgd2lsbCByb3VnaGx5IAotCQkvLyB3b3JrIGZvciBzb21lIGNhc2VzIChhbmQgYXZvaWQgTlBFKS4KLQkJaWYgKGNvbnRhaW5lZFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSArIGNvbnRhaW5lZFJlZ2lvbi5nZXRTdGFydCgpOwotCX0KLQotCS8qKgotCSAqIHNhbWUgYXMgZ2V0RnVsbFRleHQgZm9yIHRoaXMgcmVnaW9uIHR5cGUgLi4uIGRvIHdlIG5lZWQgdG8gdGFrZSB3aGl0ZQotCSAqIHNwYWNlIG9mZj8KLQkgKi8KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHBhcmVudERvY3VtZW50ID0gX2dldFBhcmVudERvY3VtZW50KCk7Ci0JCQlyZXN1bHQgPSBwYXJlbnREb2N1bWVudC5nZXQoc3RhcnQsIGxlbmd0aCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2dyYW0gZXJyb3I6IHVucmVhY2hhYmxlIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQkvLyBNdXN0IGJlIHByb3hpZWQgaGVyZSBzaW5jZSBhUmVnaW9uIHNob3VsZCBhbHdheXMgYmUgYSBjaGlsZCBvZgotCQkvLyAqdGhpcyogY29udGFpbmVyIGFuZCBpbmRleGVkIGZyb20KLQkJLy8gdGhpcyBjb250YWluZXIncyBvZmZzZXQKLQkJcmV0dXJuIHBhcmVudC5nZXRUZXh0KCkuc3Vic3RyaW5nKHN0YXJ0ICsgYVJlZ2lvbi5nZXRTdGFydCgpLCBzdGFydCArIGFSZWdpb24uZ2V0VGV4dEVuZCgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBzdGFydCArIHRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkvLyBvdXIgc3RhcnRPZmZzZXQgdGFrZSBpbnRvIGFjY291bnQgb3VyIHBhcmVudCwgYW5kIG91ciBzdGFydAotCQkvLyAocGEpIDEwLzQgY2hhbmdlZCB0byBiZSBiYXNlZCBvbiB0ZXh0IGVuZAotCQkvLyAgICAgICAgICAgaXQgdXNlZCB0byByZXR1cm4gaW5jb3JyZWN0IHZhbHVlIGZvciBlbWJlZGRlZCByZWdpb24gY29udGFpbmVycwotCQkvLwotCi0JCS8vIFRPRE8gQ1JJVElDQUwgLS0gbmVlZCB0byByZS13b3JrIHRoaXMgd29yayBhcm91bmQsIHNvIGRvZXNuJ3QKLQkJLy8gZGVwZW5kIG9uIFhNTFJlZ2lvbkNvbnRleHQKLQkJLy8JCS8vIHRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciAyMjY4MjMvLy8vLy8vLy8vLwotCQkvLwkJZm9yIChpbnQgaSA9IHJlZ2lvbnMuc2l6ZSgpIC0gMTsgaSA+PSAwICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0KLQkJLy8gWE1MUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRTsgaS0tKQotCQkvLwkJCXJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5nZXQoaSk7Ci0JCS8vCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0UmVnaW9ucygpLmdldChpKTsKLQkJCQlpZiAocmVnaW9uID09IGNvbnRhaW5lZFJlZ2lvbikgewotCQkJCQlyZXN1bHQgPSBnZXRTdGFydE9mZnNldChyZWdpb24pICsgcmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgaSkgewotCQlsZW5ndGggPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcGFyZW50UmVnaW9uKSB7Ci0JCXBhcmVudCA9IHBhcmVudFJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWdpb25zKElUZXh0UmVnaW9uTGlzdCBjb250YWluZWRSZWdpb25zKSB7Ci0JCXJlZ2lvbnMgPSBjb250YWluZWRSZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBpKSB7Ci0JCXN0YXJ0ID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCXRleHRMZW5ndGggPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHN0cmluZykgewotCQl0eXBlID0gc3RyaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHNob3J0Q2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSAiQ29udGFpbmVyISEhICIgKyBzaG9ydENsYXNzTmFtZSArICItLT4gIiArIGdldFR5cGUoKSArICI6ICIgKyBnZXRTdGFydCgpICsgIi0iICsgZ2V0VGV4dEVuZCgpICsgKGdldFRleHRFbmQoKSAhPSBnZXRFbmQoKSA/ICgiLyIgKyBnZXRFbmQoKSkgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gRlVUVVJFX1RPX0RPOiBuZWVkIHRvIGltcGxlbWVudCByZWdpb24gbGV2ZWwgcGFyc2luZyBpbgotCQkvLyBJVGV4dFJlZ2lvbkNvbnRhaW5lcjo6dXBkYXRlTW9kZWwKLQkJLy8gbmV2ZXIgYmVpbmcgY2FsbGVkPwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvSW50U3RhY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0ludFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjhkNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvSW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0vKgotICogCi0gKiBBIG5vbi1yZXNpemFibGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBiZWhhdmlvciBvZiBqYXZhLnV0aWwuU3RhY2ssIGJ1dAotICogZGlyZWN0bHkgZm9yIHRoZSA8Y29kZT4gaW50ZWdlciA8L2NvZGU+IHByaW1pdGl2ZS4KLSAqLwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW50U3RhY2sgewotCXByaXZhdGUgaW50W10gbGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBzaXplID0gMDsKLQotCXB1YmxpYyBJbnRTdGFjaygpIHsKLQkJdGhpcygxMDApOwotCX0KLQotCXB1YmxpYyBJbnRTdGFjayhpbnQgbWF4ZGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJbGlzdCA9IG5ldyBpbnRbbWF4ZGVwdGhdOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7Ci0JCXJldHVybiBzaXplID09IDA7Ci0JfQotCi0JcHVibGljIGludCBnZXQoaW50IHNsb3QpIHsKLQkJcmV0dXJuIGxpc3Rbc2xvdF07Ci0JfQotCi0Jdm9pZCBpbml0aWFsaXplKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0JCQlsaXN0W2ldID0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBlZWsoKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gbGlzdFtzaXplIC0gMV07Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwb3AoKSB7Ci0JCWludCB2YWx1ZSA9IHBlZWsoKTsKLQkJbGlzdFtzaXplIC0gMV0gPSAtMTsKLQkJc2l6ZS0tOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlIC0KLQkgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gYmUgcHVzaGVkIG9udG8gdGhpcyBzdGFjay4KLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5uZXdWYWx1ZTwvY29kZT4gYXJndW1lbnQuCi0JICovCi0JcHVibGljIGludCBwdXNoKGludCBuZXdWYWx1ZSkgewotCQlpZiAoc2l6ZSA9PSBsaXN0Lmxlbmd0aCkgewotCQkJdGhyb3cgbmV3IFN0YWNrT3ZlcmZsb3dFcnJvcigpOwotCQl9Ci0JCWxpc3Rbc2l6ZSsrXSA9IG5ld1ZhbHVlOwotCQlyZXR1cm4gbmV3VmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjoiICtzaXplICsgIiBbIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlzLmFwcGVuZChsaXN0W2ldKTsKLQkJCWlmKGkgPCBzaXplIC0gMSkgewotCQkJCXMuYXBwZW5kKCIsICIpOwotCQkJfQotCQl9Ci0JCXMuYXBwZW5kKCJdIik7Ci0JCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvUmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzE1YTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1JlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLQotCi1wdWJsaWMgY2xhc3MgUmVnaW9uRmFjdG9yeSB7Ci0KLQlwdWJsaWMgUmVnaW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oSVRleHRSZWdpb25Db250YWluZXIgcGFyZW50LCBTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUb2tlbihwYXJlbnQsIGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihJVGV4dFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoLCBTdHJpbmcgbGFuZywgU3RyaW5nIHN1cnJvdW5kaW5nVGFnKSB7Ci0JCUlUZXh0UmVnaW9uIG5ld1JlZ2lvbiA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkvL25ld1JlZ2lvbi5zZXRQYXJlbnQocGFyZW50KTsKLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoLCBTdHJpbmcgbGFuZywgU3RyaW5nIHN1cnJvdW5kaW5nVGFnKSB7Ci0JCUlUZXh0UmVnaW9uIG5ld1JlZ2lvbiA9IG5ldyBDb250ZXh0UmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQlyZXR1cm4gbmV3UmVnaW9uOwotCi0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUwxME5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUwxME5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZmFhZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MMTBOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk1ICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuNCBvbiAyLzI1LzA4IDEwOjI1IEFNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsMjAwOCBJQk0gQ29ycG9yYXRpb24sIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBrYi5odWFuZyAgLSBCdWcgMjE0NDE2ICBEb3QgY2hhciBpcyBub3QgZXNjYXBlZCBpbiBYTUwxME5hbWVzLmpGbGV4Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXg8L2E+IDEuNAotICogb24gMi8yNS8wOCAxMDoyNSBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5YTUwxME5hbWVzLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTDEwTmFtZXMgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogaW5pdGlhbCBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9CVUZGRVJTSVpFID0gMjA0ODsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFlZSU5JVElBTCA9IDA7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9DTUFQX1BBQ0tFRCA9IAotICAgICJcMTJcMFwxXDNcNDJcMFwxXDJcMVwyXDFcMFwxMlwyXDFcMVw2XDBcMzJcMSIrCi0gICAgIlw0XDBcMVwxXDFcMFwzMlwxXDc0XDBcMVwyXDEwXDBcMjdcMVwxXDBcMzdcMSIrCi0gICAgIlwxXDBcNzJcMVwyXDBcMTNcMVwyXDBcMTBcMVwxXDBcNjVcMVwxXDBcMTA0XDEiKwotICAgICJcMTFcMFw0NFwxXDNcMFwyXDFcNFwwXDM2XDFcNzBcMFwxMzFcMVwyMlwwXDdcMSIrCi0gICAgIlwxNlwwXDJcMlw1NlwwXDEwNlwyXDMyXDBcMlwyXDQ0XDBcMVwxXDFcMlwzXDEiKwotICAgICJcMVwwXDFcMVwxXDBcMjRcMVwxXDBcNTRcMVwxXDBcN1wxXDNcMFwxXDEiKwotICAgICJcMVwwXDFcMVwxXDBcMVwxXDFcMFwxXDFcMVwwXDIyXDFcMTVcMFwxNFwxIisKLSAgICAiXDFcMFwxMDJcMVwxXDBcMTRcMVwxXDBcNDRcMVwxXDBcNFwyXDExXDBcNjVcMSIrCi0gICAgIlwyXDBcMlwxXDJcMFwyXDFcM1wwXDM0XDFcMlwwXDEwXDFcMlwwXDJcMSIrCi0gICAgIlw2N1wwXDQ2XDFcMlwwXDFcMVw3XDBcNDZcMVwxMlwwXDIxXDJcMVwwXDI3XDIiKwotICAgICJcMVwwXDNcMlwxXDBcMVwyXDFcMFwyXDJcMVwwXDFcMlwxM1wwXDMzXDEiKwotICAgICJcNVwwXDNcMVw1NlwwXDMyXDFcNVwwXDFcMlwxMlwxXDEwXDJcMTVcMFwxMlwyIisKLSAgICAiXDZcMFwxXDJcMTA3XDFcMlwwXDVcMVwxXDBcMTdcMVwxXDBcNFwxXDFcMCIrCi0gICAgIlwxXDFcMTdcMlwyXDFcMlwyXDFcMFw0XDJcMlwwXDEyXDJcdTAyMDdcMFwzXDIiKwotICAgICJcMVwwXDY1XDFcMlwwXDFcMlwxXDFcMjBcMlwzXDBcNFwyXDNcMFwxMlwxIisKLSAgICAiXDJcMlwyXDBcMTJcMlwyMVwwXDNcMlwxXDBcMTBcMVwyXDBcMlwxXDJcMCIrCi0gICAgIlwyNlwxXDFcMFw3XDFcMVwwXDFcMVwzXDBcNFwxXDJcMFwxXDJcMVwwIisKLSAgICAiXDdcMlwyXDBcMlwyXDJcMFwzXDJcMTFcMFwxXDJcNFwwXDJcMVwxXDAiKwotICAgICJcM1wxXDJcMlwyXDBcMTJcMlwyXDFcMjBcMFwxXDJcMlwwXDZcMVw0XDAiKwotICAgICJcMlwxXDJcMFwyNlwxXDFcMFw3XDFcMVwwXDJcMVwxXDBcMlwxXDFcMCIrCi0gICAgIlwyXDFcMlwwXDFcMlwxXDBcNVwyXDRcMFwyXDJcMlwwXDNcMlwxM1wwIisKLSAgICAiXDRcMVwxXDBcMVwxXDdcMFwxMlwyXDJcMlwzXDFcMTRcMFwzXDJcMVwwIisKLSAgICAiXDdcMVwxXDBcMVwxXDFcMFwzXDFcMVwwXDI2XDFcMVwwXDdcMVwxXDAiKwotICAgICJcMlwxXDFcMFw1XDFcMlwwXDFcMlwxXDFcMTBcMlwxXDBcM1wyXDFcMCIrCi0gICAgIlwzXDJcMjJcMFwxXDFcNVwwXDEyXDJcMjFcMFwzXDJcMVwwXDEwXDFcMlwwIisKLSAgICAiXDJcMVwyXDBcMjZcMVwxXDBcN1wxXDFcMFwyXDFcMlwwXDRcMVwyXDAiKwotICAgICJcMVwyXDFcMVw2XDJcM1wwXDJcMlwyXDBcM1wyXDEwXDBcMlwyXDRcMCIrCi0gICAgIlwyXDFcMVwwXDNcMVw0XDBcMTJcMlwyMlwwXDJcMlwxXDBcNlwxXDNcMCIrCi0gICAgIlwzXDFcMVwwXDRcMVwzXDBcMlwxXDFcMFwxXDFcMVwwXDJcMVwzXDAiKwotICAgICJcMlwxXDNcMFwzXDFcM1wwXDEwXDFcMVwwXDNcMVw0XDBcNVwyXDNcMCIrCi0gICAgIlwzXDJcMVwwXDRcMlwxMVwwXDFcMlwxN1wwXDExXDJcMjFcMFwzXDJcMVwwIisKLSAgICAiXDEwXDFcMVwwXDNcMVwxXDBcMjdcMVwxXDBcMTJcMVwxXDBcNVwxXDRcMCIrCi0gICAgIlw3XDJcMVwwXDNcMlwxXDBcNFwyXDdcMFwyXDJcMTFcMFwyXDFcNFwwIisKLSAgICAiXDEyXDJcMjJcMFwyXDJcMVwwXDEwXDFcMVwwXDNcMVwxXDBcMjdcMVwxXDAiKwotICAgICJcMTJcMVwxXDBcNVwxXDRcMFw3XDJcMVwwXDNcMlwxXDBcNFwyXDdcMCIrCi0gICAgIlwyXDJcN1wwXDFcMVwxXDBcMlwxXDRcMFwxMlwyXDIyXDBcMlwyXDFcMCIrCi0gICAgIlwxMFwxXDFcMFwzXDFcMVwwXDI3XDFcMVwwXDIwXDFcNFwwXDZcMlwyXDAiKwotICAgICJcM1wyXDFcMFw0XDJcMTFcMFwxXDJcMTBcMFwyXDFcNFwwXDEyXDJcMjIxXDAiKwotICAgICJcNTZcMVwxXDBcMVwxXDFcMlwyXDFcN1wyXDVcMFw2XDFcMVwyXDEwXDIiKwotICAgICJcMVwwXDEyXDJcNDdcMFwyXDFcMVwwXDFcMVwyXDBcMlwxXDFcMFwxXDEiKwotICAgICJcMlwwXDFcMVw2XDBcNFwxXDFcMFw3XDFcMVwwXDNcMVwxXDBcMVwxIisKLSAgICAiXDFcMFwxXDFcMlwwXDJcMVwxXDBcMlwxXDFcMFwxXDFcMVwyXDJcMSIrCi0gICAgIlw2XDJcMVwwXDJcMlwxXDFcMlwwXDVcMVwxXDBcMVwyXDFcMFw2XDIiKwotICAgICJcMlwwXDEyXDJcNzZcMFwyXDJcNlwwXDEyXDJcMTNcMFwxXDJcMVwwXDFcMiIrCi0gICAgIlwxXDBcMVwyXDRcMFwyXDJcMTBcMVwxXDBcNDFcMVw3XDBcMjRcMlwxXDAiKwotICAgICJcNlwyXDRcMFw2XDJcMVwwXDFcMlwxXDBcMjVcMlwzXDBcN1wyXDFcMCIrCi0gICAgIlwxXDJcMzQ2XDBcNDZcMVwxMlwwXDQ3XDFcMTFcMFwxXDFcMVwwXDJcMVwxXDAiKwotICAgICJcM1wxXDFcMFwxXDFcMVwwXDJcMVwxXDBcNVwxXDUxXDBcMVwxXDFcMCIrCi0gICAgIlwxXDFcMVwwXDFcMVwxM1wwXDFcMVwxXDBcMVwxXDFcMFwxXDFcM1wwIisKLSAgICAiXDJcMVwzXDBcMVwxXDVcMFwzXDFcMVwwXDFcMVwxXDBcMVwxXDFcMCIrCi0gICAgIlwxXDFcMVwwXDFcMVwzXDBcMlwxXDNcMFwyXDFcMVwwXDFcMVw1MFwwIisKLSAgICAiXDFcMVwxMVwwXDFcMVwyXDBcMVwxXDJcMFwyXDFcN1wwXDJcMVwxXDAiKwotICAgICJcMVwxXDFcMFw3XDFcNTBcMFwxXDFcNFwwXDFcMVwxMFwwXDFcMVx1MGMwNlwwIisKLSAgICAiXDIzNFwxXDRcMFwxMzJcMVw2XDBcMjZcMVwyXDBcNlwxXDJcMFw0NlwxXDJcMCIrCi0gICAgIlw2XDFcMlwwXDEwXDFcMVwwXDFcMVwxXDBcMVwxXDFcMFwxXDFcMVwwIisKLSAgICAiXDM3XDFcMlwwXDY1XDFcMVwwXDdcMVwxXDBcMVwxXDNcMFwzXDFcMVwwIisKLSAgICAiXDdcMVwzXDBcNFwxXDJcMFw2XDFcNFwwXDE1XDFcNVwwXDNcMVwxXDAiKwotICAgICJcN1wxXDMyM1wwXDE1XDJcNFwwXDFcMlwxMDRcMFwxXDFcM1wwXDJcMVwyXDAiKwotICAgICJcMVwxXDEyMVwwXDNcMVx1MGU4MlwwXDFcMlwxXDBcMVwxXDMxXDBcMTFcMVw2XDIiKwotICAgICJcMVwwXDVcMlwxM1wwXDEyNFwxXDRcMFwyXDJcMlwwXDJcMlwyXDBcMTMyXDEiKwotICAgICJcMVwwXDNcMlw2XDBcNTBcMVx1MWNkM1wwXHU1MWE2XDFcdTBjNWFcMFx1MmJhNFwxXHUyODVjXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFtdIFpaX0NNQVAgPSB6elVucGFja0NNYXAoWlpfQ01BUF9QQUNLRUQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBERkEgc3RhdGVzIHRvIGFjdGlvbiBzd2l0Y2ggbGFiZWxzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FDVElPTiA9IHp6VW5wYWNrQWN0aW9uKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FDVElPTl9QQUNLRURfMCA9Ci0gICAgIlwxXDBcMVwxXDFcMlwxXDMiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0FjdGlvbigpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0FjdGlvbihaWl9BQ1RJT05fUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQWN0aW9uKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfUk9XTUFQID0genpVbnBhY2tSb3dNYXAoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfUk9XTUFQX1BBQ0tFRF8wID0KLSAgICAiXDBcMFwwXDRcMFwxMFwwXDE0IjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tSb3dNYXAoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNF07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tSb3dNYXAoWlpfUk9XTUFQX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja1Jvd01hcChTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgaGlnaCA9IHBhY2tlZC5jaGFyQXQoaSsrKSA8PCAxNjsKLSAgICAgIHJlc3VsdFtqKytdID0gaGlnaCB8IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9UUkFOUyBbXSA9IHsKLSAgICAxLCAyLCAxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDMsIDIsIAotICAgIDIsIC0xLCAzLCAzLCAzLCAtMQotICB9OwotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9VTktOT1dOX0VSUk9SID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX05PX01BVENIID0gMTsKLS8vICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfUFVTSEJBQ0tfMkJJRyA9IDI7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKgotICAgKiBaWl9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQVRUUklCVVRFID0genpVbnBhY2tBdHRyaWJ1dGUoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQVRUUklCVVRFX1BBQ0tFRF8wID0KLSAgICAiXDFcMFwxXDExXDJcMSI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQXR0cmlidXRlKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzRdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQXR0cmlidXRlKFpaX0FUVFJJQlVURV9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBdHRyaWJ1dGUoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgenpSZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB6ekJ1ZmZlcltdID0gbmV3IGNoYXJbWlpfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAvL3ByaXZhdGUgaW50IHp6UHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6ekN1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6elN0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHp6RW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0vLyAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotLy8gIHByaXZhdGUgaW50IHl5Y29sdW1uOwotCi0gIC8qKiAKLSAgICogenpBdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0vLyAgcHJpdmF0ZSBib29sZWFuIHp6QXRCT0wgPSB0cnVlOwotCi0gIC8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRFT0Y7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotICAgICAgICBib29sZWFuIHJlc3VsdDsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFhNTDEwTmFtZXMoKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy56elJlYWRlciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkWE1MMTBOYW1lKFN0cmluZyBzdHJpbmdUb0NoZWNrKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB5eXJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihzdHJpbmdUb0NoZWNrKSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzVmFsaWRYTUwxME5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGltcG9zc2libGUgd2l0aCBzdHJpbmdzLCBidXQgaWYgb2NjdXJzLCBqdXN0IG1lYW5zCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAibm90IgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTDEwTmFtZXMoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUwxME5hbWVzKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEyMTgpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlZmlsbHMgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWZmIHRoZXJlIHdhcyBuZXcgaW5wdXQuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6elJlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHp6U3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgenpTdGFydFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLCAwLAotICAgICAgICAgICAgICAgICAgICAgICB6ekVuZFJlYWQtenpTdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgenpFbmRSZWFkLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ekN1cnJlbnRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6TWFya2VkUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICAvL3p6UHVzaGJhY2tQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6U3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHp6Q3VycmVudFBvcyA+PSB6ekJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3p6Q3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgenpCdWZmZXIubGVuZ3RoKTsKLSAgICAgIHp6QnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0genpSZWFkZXIucmVhZCh6ekJ1ZmZlciwgenpFbmRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlci5sZW5ndGgtenpFbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkIDwgMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgenpFbmRSZWFkKz0gbnVtUmVhZDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotLy8gIHByaXZhdGUgZmluYWwgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotLy8gICAgenpBdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLS8vICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLS8vCi0vLyAgICBpZiAoenpSZWFkZXIgIT0gbnVsbCkKLS8vICAgICAgenpSZWFkZXIuY2xvc2UoKTsKLS8vICB9Ci0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqIERvZXMgbm90IGNsb3NlIHRoZSBvbGQgcmVhZGVyLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PlpaX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0gICAgenpSZWFkZXIgPSByZWFkZXI7Ci0vLyAgICB6ekF0Qk9MICA9IHRydWU7Ci0gICAgenpBdEVPRiAgPSBmYWxzZTsKLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgenpDdXJyZW50UG9zID0genpNYXJrZWRQb3MgPSAwOy8venpQdXNoYmFja1BvcyA9IDA7Ci0vLyAgICB5eWxpbmUgPSB5eWNoYXIgPSB5eWNvbHVtbiA9IDA7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotLy8gIHByaXZhdGUgZmluYWwgaW50IHl5c3RhdGUoKSB7Ci0vLyAgICByZXR1cm4genpMZXhpY2FsU3RhdGU7Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0vLyAgcHJpdmF0ZSBmaW5hbCB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0vLyAgICB6ekxleGljYWxTdGF0ZSA9IG5ld1N0YXRlOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLS8vICBwcml2YXRlIGZpbmFsIFN0cmluZyB5eXRleHQoKSB7Ci0vLyAgICByZXR1cm4gbmV3IFN0cmluZyggenpCdWZmZXIsIHp6U3RhcnRSZWFkLCB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZCApOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0vLyAgcHJpdmF0ZSBmaW5hbCBjaGFyIHl5Y2hhcmF0KGludCBwb3MpIHsKLS8vICAgIHJldHVybiB6ekJ1ZmZlclt6elN0YXJ0UmVhZCtwb3NdOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotLy8gIHByaXZhdGUgZmluYWwgaW50IHl5bGVuZ3RoKCkgewotLy8gICAgcmV0dXJuIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6U2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbWlpfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0vLyAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgIHsKLS8vICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0vLyAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotLy8KLS8vICAgIHp6TWFya2VkUG9zIC09IG51bWJlcjsKLS8vICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFhNTDEwTmFtZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgenpJbnB1dDsKLSAgICBpbnQgenpBY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB6ekN1cnJlbnRQb3NMOwotICAgIGludCB6ek1hcmtlZFBvc0w7Ci0gICAgaW50IHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgY2hhciBbXSB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICBjaGFyIFtdIHp6Q01hcEwgPSBaWl9DTUFQOwotCi0gICAgaW50IFtdIHp6VHJhbnNMID0gWlpfVFJBTlM7Ci0gICAgaW50IFtdIHp6Um93TWFwTCA9IFpaX1JPV01BUDsKLSAgICBpbnQgW10genpBdHRyTCA9IFpaX0FUVFJJQlVURTsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIHp6U3RhdGUgPSB6ekxleGljYWxTdGF0ZTsKLQotCi0gICAgICB6ekZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIGlmICh6ekN1cnJlbnRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICBlbHNlIGlmICh6ekF0RU9GKSB7Ci0gICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLSAgICAgICAgICAgIHp6Q3VycmVudFBvcyAgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgenpNYXJrZWRQb3MgICA9IHp6TWFya2VkUG9zTDsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgenpDdXJyZW50UG9zTCAgPSB6ekN1cnJlbnRQb3M7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgICA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpCdWZmZXJMICAgICAgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgICAgID0genpFbmRSZWFkOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50IHp6TmV4dCA9IHp6VHJhbnNMWyB6elJvd01hcExbenpTdGF0ZV0gKyB6ekNNYXBMW3p6SW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHp6TmV4dCA9PSAtMSkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgenpTdGF0ZSA9IHp6TmV4dDsKLQotICAgICAgICAgIGludCB6ekF0dHJpYnV0ZXMgPSB6ekF0dHJMW3p6U3RhdGVdOwotICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDEpID09IDEgKSB7Ci0gICAgICAgICAgICB6ekFjdGlvbiA9IHp6U3RhdGU7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgOCkgPT0gOCApIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB6ek1hcmtlZFBvcyA9IHp6TWFya2VkUG9zTDsKLQotICAgICAgc3dpdGNoICh6ekFjdGlvbiA8IDAgPyB6ekFjdGlvbiA6IFpaX0FDVElPTlt6ekFjdGlvbl0pIHsKLSAgICAgICAgY2FzZSAxOiAKLSAgICAgICAgICB7IHJldHVybiBmYWxzZTsgLyogbWF0Y2hlZCB3aWxkICovCi0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgcmV0dXJuIHRydWU7IC8qIGV4YWN0IG5hbWUgKi8KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogCi0gICAgICAgICAgeyByZXR1cm4gZmFsc2U7IC8qIG1vcmUgdGhhbiBuYW1lICovCi0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoenpJbnB1dCA9PSBZWUVPRiAmJiB6elN0YXJ0UmVhZCA9PSB6ekN1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHp6QXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgICB7IHtyZXR1cm4gZmFsc2U7IC8qIGhpdCBlbmQgd2l0aCBubyBtYXRjaCAqL30gfQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB6elNjYW5FcnJvcihaWl9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFNvdXJjZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU291cmNlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhODc5MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVGFnUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQ2hhclNlcXVlbmNlUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LklSZWdpb25Db21wYXJpYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIFRha2VzIGlucHV0IGZyb20gdGhlIEhUTUxUb2tlbml6ZXIgYW5kIGNyZWF0ZXMgYSB0YWcgbGlzdAotICovCi0KLXB1YmxpYyBjbGFzcyBYTUxTb3VyY2VQYXJzZXIgaW1wbGVtZW50cyBSZWdpb25QYXJzZXIsIEJsb2NrVGFnUGFyc2VyLCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIsIElSZWdpb25Db21wYXJpYmxlLCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24gewotCS8vIG1hZGUgcHVibGljIHRvIGFpZCBhY2Nlc3MgZnJvbSBpbm5lciBjbGFzc2VzIGluIGhpZXJhcmNoeS4KLQkvLyBUT0RPOiBpbiBmdXR1cmUsIGZpZ3VyZSBvdXQgaG93IHRvIHNvbHZlIHdpdGhvdXQgZXhwb3NpbmcgZGF0YS4KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIGZDaGFyU2VxdWVuY2VTb3VyY2UgPSBudWxsOwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudElucHV0OwotCXByb3RlY3RlZCBpbnQgZk9mZnNldCA9IDA7Ci0JLy8gRE1XOiAyLzEyLzAzLiBSZW1vdmVkIHNvbWUgc3RhdGUgZGF0YSwgc2luY2Ugbm90IHJlYWxseSBuZWVkZWQsCi0JLy8gYW5kIHNpbmNlIGl0IGFkZGVkIGEgbG90IHRvIG92ZXJoZWFkIChzaW5jZSBzbyBtYW55IHJlZ2lvbnMgYXJlCi0JLy8gY3JlYXRlZC4KLQkvLyBwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQ3VycmVudE5vZGUgPSBudWxsOwotCS8vIHByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZOb2RlcyA9IG51bGw7Ci0JLy8gcHJvdGVjdGVkIExpc3QgZlJlZ2lvbnMgPSBudWxsOwotCS8vIHByb3RlY3RlZCBPYmplY3QgZklucHV0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTdHJpbmdJbnB1dCA9IG51bGw7Ci0JcHJvdGVjdGVkIExpc3QgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzOwotCi0JcHJvdGVjdGVkIEJsb2NrVG9rZW5pemVyIGZUb2tlbml6ZXIgPSBudWxsOwotCXByb3RlY3RlZCBsb25nIHN0YXJ0VGltZTsKLQlwcm90ZWN0ZWQgbG9uZyBzdG9wVGltZTsKLQotCS8qKgotCSAqIEhUTUxTb3VyY2VQYXJzZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MU291cmNlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIHNpbXBsZSB1dGlsaXR5IHRvIGNvdW50IG5vZGVzLiBVc2VkIG9ubHkgZm9yIGRlYnVnCi0JICogc3RhdGVtZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IF9jb3VudE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZXMpIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY291bnROb2RlID0gbm9kZXM7Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gbnVsbCkgewotCQkJcmVzdWx0Kys7Ci0JCQljb3VudE5vZGUgPSBjb3VudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWdldFRva2VuaXplcigpLmFkZEJsb2NrTWFya2VyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyKSB7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPT0gbnVsbCkKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3luY2hyb25pemVkIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5hZGQoaGFuZGxlcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpbkJsb2NrU2NhbihTdHJpbmcgbmV3VGFnTmFtZSkgewotCQlnZXRUb2tlbml6ZXIoKS5iZWdpbkJsb2NrVGFnU2NhbihuZXdUYWdOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlID0gbnVsbDsKLQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKQotCQkJbmV3Tm9kZSA9IFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbihYTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5YTUxfQkxPQ0spOwotCQllbHNlCi0JCQluZXdOb2RlID0gWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LlhNTCk7Ci0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpcmVOb2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZkN1cnJlbnROb2RlKSB7Ci0JCS8qCi0JCSAqIE5ldmVyIGxldCBhbiBFeGNlcHRpb25zIGZyb20gZm9yZWlnbiBjb2RlIGludGVyZmVyZSB3aXRoIGNvbXBsZXRpb24KLQkJICogb2YgcGFyc2luZy4gVG8gZ2V0IGFuIGV4Y2VwdGlvbiBoZXJlIGlzIGRlZmluaXRlbHkgYSBwcm9ncmFtIGVycm9yCi0JCSAqIHNvbWV3aGVyZSwgYnV0IHdlIGNhbid0IGFmZm9yZCB0byBpbnRlcnJ1cHQgdGhlIGZsb3cgb2YgY29udHJvbC4gb3IKLQkJICogYmFja3dhcmRzIHR5cGluZyBjYW4gcmVzdWx0IQotCQkgKiAKLQkJICogUHJvdGVjdCB0aGUgdXNlcidzIGRhdGEgYWJvdmUgZXZlcnl0aGluZy4KLQkJICovCi0JCU9iamVjdFtdIGhhbmRsZXJzID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMpIHsKLQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCWhhbmRsZXJzID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzLnRvQXJyYXkoKTsKLQkJfQotCQlpZiAoZkN1cnJlbnROb2RlICE9IG51bGwgJiYgaGFuZGxlcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcikgaGFuZGxlcnNbaV0pLm5vZGVQYXJzZWQoZkN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiRXJyb3Igb2NjdXJyZWQgd2hpbGUgZmlyaW5nIE5vZGUgUGFyc2VkIGV2ZW50IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQmxvY2tNYXJrZXIgZ2V0QmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpIHsKLQkJTGlzdCBtYXJrZXJzID0gZ2V0VG9rZW5pemVyKCkuZ2V0QmxvY2tNYXJrZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKSBtYXJrZXJzLmdldChpKTsKLQkJCWlmIChtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCQlpZiAobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0JCQkJCXJldHVybiBtYXJrZXI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpKQotCQkJCQlyZXR1cm4gbWFya2VyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQkJcmV0dXJuIGdldFRva2VuaXplcigpLmdldEJsb2NrTWFya2VycygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9ucygpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkbm9kZSA9IG51bGw7Ci0JCWlmIChoZWFkbm9kZSA9PSBudWxsKSB7Ci0JCQlpZiAoRGVidWcucGVyZlRlc3QpIHsKLQkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCWhlYWRub2RlID0gcGFyc2VOb2RlcygpOwotCQkJaWYgKERlYnVnLnBlcmZUZXN0KSB7Ci0JCQkJc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAtLSBjcmVhdGluZyBub2RlcyBvZiBJU3RydWN0dXJlZERvY3VtZW50IC0tICIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgVGltZSBwYXJzZSBhbmQgaW5pdCBhbGwgcmVnaW9uczogIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIChtc2VjcykiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBmb3IgIiArIGZSZWdpb25zLnNpemUoKSArICIKLQkJCQkvLyBSZWdpb25zIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgIGFuZCAiICsgX2NvdW50Tm9kZXMoaGVhZG5vZGUpICsgIiBOb2RlcyIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBoZWFkbm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0TmV4dFJlZ2lvbigpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldFRva2VuaXplcigpLmdldE5leHRUb2tlbigpOwotCQkJLy8gRE1XOiAyLzEyLzAzIFJlbW92ZWQgc3RhdGUKLQkJCS8vIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gZlJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQkvLyB9Ci0JCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0JCWNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IGlucHV0IGNvdWxkIG5vdCBiZSBwYXJzZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRUb2tlbml6ZXIoKS5nZXRPZmZzZXQoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogaW5wdXQgY291bGQgbm90IGJlIHBhcnNlZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldFRva2VuaXplcigpLmdldE9mZnNldCgpICsgIiAoIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICsgIikiLCBlKTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxsIGxpc3Qgb2Yga25vd24gcmVnaW9ucy4gVHlwaWNhbGx5IGdldE5vZGVzIHNob3VsZCBiZQotCSAqIHVzZWQgaW5zdGVhZCBvZiB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWdpb25zKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJaWYgKCFnZXRUb2tlbml6ZXIoKS5pc0VPRigpKSB7Ci0JCQloZWFkTm9kZSA9IGdldERvY3VtZW50UmVnaW9ucygpOwotCQkJLy8gdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicGFyc2luZyBoYXMgbm90IGZpbmlzaGVkIik7Ci0JCX0KLQkJLy8gZm9yIG1lbW9yeSByZWNvdmVyeSwgd2UgYXNzdW1lIGlmIHNvbWVvbmUKLQkJLy8gcmVxdWVzdHMgYWxsIHJlZ2lvbnMsIHdlIGNhbiByZXNldCBvdXIgYmlnCi0JCS8vIG1lbW9yeSBjb25zdW1pbmcgb2JqZWN0cwotCQkvLyBidXQgdGhlIG5ldyAiZ2V0UmVnaW9ucyIgbWV0aG9kIGlzIHRoZW4gbW9yZSBleHBlbnNpdmUuCi0JCS8vIEkgZG9uJ3QgdGhpbmsgaXRzIHVzZWQgbXVjaCwgdGhvdWdoLgotCQlMaXN0IGxvY2FsUmVnaW9uc0xpc3QgPSBnZXRSZWdpb25zKGhlYWROb2RlKTsKLQkJcHJpbVJlc2V0KCk7Ci0JCXJldHVybiBsb2NhbFJlZ2lvbnNMaXN0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRSZWdpb25zLgotCSAqIAotCSAqIEBwYXJhbSBoZWFkTm9kZQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSkgewotCQlMaXN0IGFsbFJlZ2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBoZWFkTm9kZTsKLQkJd2hpbGUgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucyA9IGN1cnJlbnROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZVJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhbGxSZWdpb25zLmFkZChub2RlUmVnaW9ucy5nZXQoaSkpOwotCQkJfQotCQkJY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGFsbFJlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgdGhlIGFkZC9yZW1vdmUgbWV0aG9kcyBpbnN0ZWFkCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKCkgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID09IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCX0KLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRleHQgZnJvbSB0aGUgY3VycmVudCBpbnB1dC4gVGV4dCBpcyBvbmx5IHZhbGlkIGJlZm9yZQotCSAqIGdldE5vZGVzKCkgaGFzIGJlZW4gY2FsbGVkIGFuZCBvbmx5IHdoZW4gYSByYXcgU3RyaW5nIG9yIERvY3VtZW50UmVhZGVyCi0JICogaXMgZ2l2ZW4gYXMgdGhlIGlucHV0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgIT0gbnVsbCkgewotCQkJaW50IHN0YXJ0ID0gZk9mZnNldCArIG9mZnNldDsKLQkJCWludCBlbmQgPSBzdGFydCArIGxlbmd0aDsKLQkJCXRleHQgPSBmQ2hhclNlcXVlbmNlU291cmNlLnN1YlNlcXVlbmNlKHN0YXJ0LCBlbmQpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZkRvY3VtZW50SW5wdXQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl0ZXh0ID0gZkRvY3VtZW50SW5wdXQuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZlN0cmluZ0lucHV0ID09IG51bGwgfHwgZlN0cmluZ0lucHV0Lmxlbmd0aCgpID09IDAgfHwgb2Zmc2V0ICsgbGVuZ3RoID4gZlN0cmluZ0lucHV0Lmxlbmd0aCgpIHx8IG9mZnNldCA8IDApIHsKLQkJCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG9mZnNldCBpcyBlbnRpcmVseSB2YWxpZCBkdXJpbmcgcGFyc2luZyBhcyB0aGUgcGFyc2UKLQkJCQkvLyBudW1iZXJzIGhhdmVuJ3QgYmVlbiBhZGp1c3RlZC4KLQkJCQl0ZXh0ID0gZlN0cmluZ0lucHV0LnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEJsb2NrVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBYTUxUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVhNTFNvdXJjZVBhcnNlciBuZXdJbnN0YW5jZSA9IG5ldyBYTUxTb3VyY2VQYXJzZXIoKTsKLQkJbmV3SW5zdGFuY2Uuc2V0VG9rZW5pemVyKGdldFRva2VuaXplcigpLm5ld0luc3RhbmNlKCkpOwotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyc2VOb2RlcygpIHsKLQkJLy8gcmVnaW9ucyBhcmUgaW5pdGlhbGx5IHJlcG9ydGVkIGFzIGNvbXBsZXRlIG9mZnNldHMgd2l0aGluIHRoZQotCQkvLyBzY2FubmVkIGlucHV0Ci0JCS8vIHRoZXkgYXJlIGFkanVzdGVkIGhlcmUgdG8gYmUgaW5kZXhlcyBmcm9tIHRoZSBjdXJyZW50Tm9kZSdzIHN0YXJ0Ci0JCS8vIG9mZnNldAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0KLQkJd2hpbGUgKChyZWdpb24gPSBnZXROZXh0UmVnaW9uKCkpICE9IG51bGwpIHsKLQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gdGhlc2UgdHlwZXMgKG1pZ2h0KSBkZW1hbmQgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZvciBlYWNoCi0JCQkvLyBvZiB0aGVtCi0JCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCQkvLyBtdWx0aXBsZSBibG9jayB0ZXh0cyBpbmRpY2F0ZWQgZW1iZWRkZWQgY29udGFpbmVyczsgbm8KLQkJCQkJLy8gbmV3IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm90IGNvbnRpbnVpbmcgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBlbnN1cmUgdGhhdCBhbnkgZXhpc3Rpbmcgbm9kZSBpcyBhdCBsZWFzdAotCQkJCQkJLy8gdGVybWluYXRlZAotCQkJCQkJaWYgKCFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCQkvLyBmQ3VycmVudE5vZGUuc2V0VGV4dExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtCi0JCQkJCQkJLy8gZkN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJfQotCQkJCQkJbGFzdE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCQkJfQotCQkJCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBPUEVOIG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQllbHNlIGlmICgoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pKSB7Ci0JCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJLy8gZW5zdXJlIHRoYXQgYW55IGV4aXN0aW5nIG5vZGUgaXMgYXQgbGVhc3QgdGVybWluYXRlZAotCQkJCQlpZiAoIWN1cnJlbnROb2RlLmlzRW5kZWQoKSkgewotCQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCQkvLyBmQ3VycmVudE5vZGUuc2V0VGV4dExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtCi0JCQkJCQkvLyBmQ3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCX0KLQkJCQkJbGFzdE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCQl9Ci0JCQkJZmlyZU5vZGVQYXJzZWQoY3VycmVudE5vZGUpOwotCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCWxhc3ROb2RlLnNldE5leHQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBuZWl0aGVyIG9wZW4gbm9yIGNsb3NlCi0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOyBqdXN0IGFkZCB0byB0aGVtCi0JCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVCkpIHsKLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgY2xvc2Ugb2ZmIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCS8vIGNsZWFubHkKLQkJCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJfQotCQkJLy8gdGhpcyBpcyBleHRyZW1lbHkgcmFyZSwgYnV0IHZhbGlkCi0JCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpIHsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJCS8vIHBhY2sgdGhlIGVtYmVkZGVkIGNvbnRhaW5lciB3aXRoIHRoaXMgcmVnaW9uCi0JCQkJaWYgKGxhc3RSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQlJVGV4dFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoSVRleHRSZWdpb25Db250YWluZXIpIGxhc3RSZWdpb247Ci0JCQkJCWNvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKHJlZ2lvbik7Ci0JCQkJCS8vIGNvbnRhaW5lcnMgbXVzdCBoYXZlIHBhcmVudCBzZXQgLi4uCi0JCQkJCS8vIHNldHRpbmcgZm9yIEVBQ0ggc3VicmVnaW9uIGlzIHJlZHVuZGVudCwgYnV0IG5vdCBzdXJlCi0JCQkJCS8vIHdoZXJlIGVsc2UgdG8gZG8sIHNvIHdpbGwgZG8gaGVyZSBmb3Igbm93LgotCQkJCQljb250YWluZXIuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGNvbnRhaW5lcik7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydChjb250YWluZXIuZ2V0TGVuZ3RoKCkgLSByZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQljdXJyZW50Tm9kZS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCS8vIHNraXAgb24gYSB2ZXJ5LWZpcnN0IHJlZ2lvbiBzaXR1YXRpb24gYXMgdGhlIGRlZmF1bHQKLQkJCQkvLyBiZWhhdmlvciBpcyBnb29kIGVub3VnaAotCQkJCS8vIGNvbWJpbmUgd2l0aCBwcmV2aW91cyBpZiBhbHNvIHVuZGVmaW5lZAotCQkJCWlmIChjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQkJCWN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJY3VycmVudE5vZGUuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCS8vIHByZXZpb3VzIHdhc24ndCB1bmRlZmluZWQKLQkJCQllbHNlIHsKLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlmIGFuIHVua25vd24gdHlwZSBpcyB0aGUgZmlyc3QgcmVnaW9uIGluIHRoZSBkb2N1bWVudCwKLQkJCQkvLyBlbnN1cmUgdGhhdCBhIG5vZGUgZXhpc3RzCi0JCQkJaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHsKLQkJCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZvdW5kIHJlZ2lvbiBvZiBub3Qgc3BlY2lmaWNhbGx5IGhhbmRsZWQgdHlwZSAiICsgcmVnaW9uLmdldFR5cGUoKSArICIgQCAiICsgcmVnaW9uLmdldFN0YXJ0KCkgKyAiWyIgKyByZWdpb24uZ2V0TGVuZ3RoKCkgKyAiXSIpOyAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCS8vIHRoZXNlIHJlZ2lvbnMgYWxzbyBnZXQgdGhlaXIgb3duIG5vZGUsIHNvIGNsb3NlIHRoZW0gY2xlYW5seQotCQkJLy8gTk9URTogdGhlc2UgcmVnaW9ucyBoYXZlIG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIGNyZWF0ZWQKLQkJCS8vIGZvciB0aGVtIGFib3ZlOyBpdCBtYXkKLQkJCS8vIGJlIG1vcmUgcmVhZGFibGUgaWYgdGhhdCBpcyBoYW5kbGVkIGhlcmUgYXMgd2VsbCwgYnV0IHRoZQotCQkJLy8gY3VycmVudCBsYXlvdXQKLQkJCS8vIGVuc3VyZXMgdGhhdCB0aGV5IG9wZW4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyB0aGUgc2FtZSB3YXkKLQkJCWlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSkpIHsKLQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCX0KLQkJCWlmIChoZWFkTm9kZSA9PSBudWxsICYmIGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQloZWFkTm9kZSA9IGN1cnJlbnROb2RlOwotCQkJfQotCQl9Ci0JCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCX0KLQkJLy8gZlN0cmluZ0lucHV0ID0gbnVsbDsKLQkJcHJpbVJlc2V0KCk7Ci0JCXJldHVybiBoZWFkTm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUmVzZXQoKSB7Ci0JCS8vIGZOb2RlcyA9IG51bGw7Ci0JCS8vIGZSZWdpb25zID0gbnVsbDsKLQkJLy8gZklucHV0ID0gbnVsbDsKLQkJZlN0cmluZ0lucHV0ID0gbnVsbDsKLQkJZkNoYXJTZXF1ZW5jZVNvdXJjZSA9IG51bGw7Ci0JCWZEb2N1bWVudElucHV0ID0gbnVsbDsKLQkJZk9mZnNldCA9IDA7Ci0JCS8vIGZDdXJyZW50Tm9kZSA9IG51bGw7Ci0JCS8vIERNVzogYWxzbyByZXNldCB0b2tlbml6ZXIgc28gaXQgZG9lc24ndCBob2xkIG9uCi0JCS8vIHRvIGxhcmdlIGFycmF5cwotCQlnZXRUb2tlbml6ZXIoKS5yZXNldChuZXcgY2hhclswXSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5JUmVnaW9uQ29tcGFyaWJsZSNyZWdpb25NYXRjaGVzKGludCwKLQkgKiAgICAgIGludCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJLy8gYnkgZGVmaW5pdGlvbgotCQlpZiAoc3RyaW5nVG9Db21wYXJlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGFqdXN0ZWRPZmZzZXQgPSBmT2Zmc2V0ICsgb2Zmc2V0OwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSAhPSBudWxsICYmIGZDaGFyU2VxdWVuY2VTb3VyY2UgaW5zdGFuY2VvZiBJUmVnaW9uQ29tcGFyaWJsZSkgewotCQkJcmVzdWx0ID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgZkNoYXJTZXF1ZW5jZVNvdXJjZSkucmVnaW9uTWF0Y2hlcyhhanVzdGVkT2Zmc2V0LCBsZW5ndGgsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBvbGQgZmFzaGlvbmVkIHdheXMKLQkJCVN0cmluZyB0ZXN0ID0gbnVsbDsKLQkJCWlmIChmQ2hhclNlcXVlbmNlU291cmNlICE9IG51bGwpIHsKLQkJCQl0ZXN0ID0gZkNoYXJTZXF1ZW5jZVNvdXJjZS5zdWJTZXF1ZW5jZShhanVzdGVkT2Zmc2V0LCBhanVzdGVkT2Zmc2V0ICsgbGVuZ3RoKS50b1N0cmluZygpOwotCQkJfQotCQkJZWxzZSBpZiAoZlN0cmluZ0lucHV0ICE9IG51bGwpIHsKLQkJCQl0ZXN0ID0gZlN0cmluZ0lucHV0LnN1YnN0cmluZyhhanVzdGVkT2Zmc2V0LCBhanVzdGVkT2Zmc2V0ICsgbGVuZ3RoKTsKLQkJCX0KLQkJCXJlc3VsdCA9IHN0cmluZ1RvQ29tcGFyZS5lcXVhbHModGVzdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCS8vIGJ5IGRlZmluaXRpb24KLQkJaWYgKHN0cmluZ1RvQ29tcGFyZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWludCBhanVzdGVkT2Zmc2V0ID0gZk9mZnNldCArIG9mZnNldDsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgIT0gbnVsbCAmJiBmQ2hhclNlcXVlbmNlU291cmNlIGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCXJlc3VsdCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIGZDaGFyU2VxdWVuY2VTb3VyY2UpLnJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGFqdXN0ZWRPZmZzZXQsIGxlbmd0aCwgc3RyaW5nVG9Db21wYXJlKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIG9sZCBmYXNoaW9uZWQgd2F5cwotCQkJU3RyaW5nIHRlc3QgPSBudWxsOwotCQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgIT0gbnVsbCkgewotCQkJCXRlc3QgPSBmQ2hhclNlcXVlbmNlU291cmNlLnN1YlNlcXVlbmNlKGFqdXN0ZWRPZmZzZXQsIGFqdXN0ZWRPZmZzZXQgKyBsZW5ndGgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChmU3RyaW5nSW5wdXQgIT0gbnVsbCkgewotCQkJCXRlc3QgPSBmU3RyaW5nSW5wdXQuc3Vic3RyaW5nKGFqdXN0ZWRPZmZzZXQsIGFqdXN0ZWRPZmZzZXQgKyBsZW5ndGgpOwotCQkJfQotCQkJcmVzdWx0ID0gc3RyaW5nVG9Db21wYXJlLmVxdWFsc0lnbm9yZUNhc2UodGVzdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJZ2V0VG9rZW5pemVyKCkucmVtb3ZlQmxvY2tNYXJrZXIobWFya2VyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCQlnZXRUb2tlbml6ZXIoKS5yZW1vdmVCbG9ja01hcmtlcih0YWdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaGFuZGxlcikgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN5bmNocm9uaXplZCAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMucmVtb3ZlKGhhbmRsZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSBpbnN0cmVhbSkgewotCQlwcmltUmVzZXQoKTsKLQkJLy8gZklucHV0ID0gaW5zdHJlYW07Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KGluc3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGlucHV0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgewotCQlyZXNldChyZWFkZXIsIDApOwotCX0KLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgaW5wdXQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyLCBpbnQgcG9zaXRpb24pIHsKLQkJcHJpbVJlc2V0KCk7Ci0JCWZPZmZzZXQgPSBwb3NpdGlvbjsKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQocmVhZGVyLCBwb3NpdGlvbik7Ci0JCWlmIChyZWFkZXIgaW5zdGFuY2VvZiBEb2N1bWVudFJlYWRlcikgewotCQkJSURvY3VtZW50IGRvYyA9ICgoRG9jdW1lbnRSZWFkZXIpIHJlYWRlcikuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKLQkJCQlmQ2hhclNlcXVlbmNlU291cmNlID0gKENoYXJTZXF1ZW5jZSkgZG9jOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gb2xkIGZhc2hpb25lZCBJRG9jdW1lbnQKLQkJCQlmRG9jdW1lbnRJbnB1dCA9ICgoRG9jdW1lbnRSZWFkZXIpIHJlYWRlcikuZ2V0RG9jdW1lbnQoKTsKLQkJCX0KLQotCQl9Ci0JCWVsc2UgaWYgKHJlYWRlciBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZVJlYWRlcikgewotCQkJZkNoYXJTZXF1ZW5jZVNvdXJjZSA9ICgoQ2hhclNlcXVlbmNlUmVhZGVyKSByZWFkZXIpLmdldE9yaWdpbmFsU291cmNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGlucHV0LiBVc2UgdGhpcyB2ZXJzaW9uIHRvIGFsbG93IHRleHQgdG8gYmUgcmV0cmlldmVkCi0JICogPGVtPmR1cmluZzwvZW0+IHBhcnNpbmcsIHN1Y2ggYXMgYnkgdGhlCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgc291cmNlU3RyaW5nKSB7Ci0JCXJlc2V0KG5ldyBTdHJpbmdSZWFkZXIoc291cmNlU3RyaW5nKSk7Ci0JCWZTdHJpbmdJbnB1dCA9IHNvdXJjZVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGlucHV0LiBVc2UgdGhpcyB2ZXJzaW9uIHRvIGFsbG93IHRleHQgdG8gYmUgcmV0cmlldmVkCi0JICogPGVtPmR1cmluZzwvZW0+IHBhcnNpbmcsIHN1Y2ggYXMgYnkgdGhlCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgc291cmNlU3RyaW5nLCBpbnQgcG9zaXRpb24pIHsKLQkJU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoc291cmNlU3RyaW5nKTsKLQkJcmVzZXQocmVhZGVyLCBwb3NpdGlvbik7Ci0JCWZTdHJpbmdJbnB1dCA9IHNvdXJjZVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldEhhbmRsZXJzKCkgewotCQlPYmplY3RbXSBoYW5kbGVycyA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKSB7Ci0JCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQloYW5kbGVycyA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy50b0FycmF5KCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQkoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIpIGhhbmRsZXJzW2ldKS5yZXNldE5vZGVzKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkVycm9yIG9jY3VycmVkIHdoaWxlIHJlc2V0dGluZyBoYW5kbGVycyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gTGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKExpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMpIHsKLQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VG9rZW5pemVyKEJsb2NrVG9rZW5pemVyIG5ld1Rva2VuaXplcikgewotCQkvLyBETVc6IGNoYW5nZWQgZnJvbSBwcml2YXRlIHRvIHByb3RlY3RlZCwgc28gc3ViY2xhc3MgY291bGQgdXNlIGluCi0JCS8vIGNyZWF0aW9uIG9mICduZXdJbnN0YW5jZScuCi0JCWZUb2tlbml6ZXIgPSBuZXdUb2tlbml6ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODU1MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciB7Ci0KLQlwdWJsaWMgWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZERpcnR5RW5kKGludCBlbmQpIHsKLQkJLy8gQ2F1dGlvbjogaGVyZSdzIG9uZSBwbGFjZSB3ZSBoYXZlIHRvIGNhc3QKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGVuZCk7Ci0JCS8vIGlmIG5vdCB3ZWxsIGZvcm1lZCwgZ2V0IG9uZSBwYXN0LCBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhlcmUKLQkJaWYgKChyZXN1bHQgIT0gbnVsbCkgJiYgKCFyZXN1bHQuaXNFbmRlZCgpKSkgewotCQkJaWYgKHJlc3VsdC5nZXROZXh0KCkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5nZXROZXh0KCk7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxzbywgZ2V0IG9uZSBwYXN0IGlmIGV4YWN0bHkgZXF1YWwgdG8gdGhlIGVuZCAodGhpcyB3YXMgbmVlZGVkCi0JCS8vIGFzIGEgc2ltcGxlIGZpeCB0byB3aGVuIGEgd2hvbGUgZXhhY3QgcmVnaW9uIGlzIGRlbGV0ZWQuCi0JCS8vIHRoZXJlJ3MgcHJvYmFibHkgYSBiZXR0ZXIgd2F5LgotCQlpZiAoKHJlc3VsdCAhPSBudWxsKSAmJiAoZW5kID09IHJlc3VsdC5nZXRFbmQoKSkpIHsKLQkJCWlmIChyZXN1bHQuZ2V0TmV4dCgpICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQkJfQotCQl9Ci0KLQkJLy8gMTIvNi8yMDAxIC0gU2luY2Ugd2UndmUgY2hhbmdlZCB0aGUgcGFyc2VyL3NjYW5uZXIgdG8gYWxsb3cgYSBsb25lCi0JCS8vICc8JyB3aXRob3V0Ci0JCS8vIGFsd2F5cyBpbnRlcnByZXR0aW5nIGl0IGFzIHN0YXJ0IG9mIGEgdGFnIG5hbWUsIHdlIG5lZWQgdG8gYmUgYQotCQkvLyBsaXR0bGUgZmFuY2llciwgaW4gb3JkZXIKLQkJLy8gdG8gInNraXAiIG92ZXIgYW55IHBsYWluICdvbCBjb250ZW50IGJldHdlZW4gdGhlIGxvbmUgJzwnIGFuZCBhbnkKLQkJLy8gcG90ZW50aWFsIG1lYXRpbmcKLQkJLy8gcmVnaW9ucyBwYXN0IHBsYWluICdvbCBjb250ZW50LgotCQlpZiAoaXNMb25lT3BlbkZvbGxvd2VkQnlDb250ZW50KHJlc3VsdCkgJiYgKHJlc3VsdC5nZXROZXh0KCkgIT0gbnVsbCkpIHsKLQkJCXJlc3VsdCA9IHJlc3VsdC5nZXROZXh0KCk7Ci0JCX0KLQotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCWRpcnR5RW5kID0gcmVzdWx0OwotCi0JCXJldHVybiBkaXJ0eUVuZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaW5kRGlydHlTdGFydChpbnQgc3RhcnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJLy8gaGV1cmlzdGljOiBpZiB0aGUgcG9zdGlvbiBpcyBleGFjdGx5IGVxdWFsIHRvIHRoZSBzdGFydCwgdGhlbgotCQkvLyBnbyBiYWNrIG9uZSBtb3JlLCBpZiBpdCBleGlzdHMuIFRoaXMgcHJldmVudHMgcHJvYmxlbXMgd2l0aAotCQkvLyBpbnNlcnRpb25zCi0JCS8vIG9mIHRleHQgdGhhdCBzaG91bGQgYmUgbWVyZ2VkIHdpdGggdGhlIHByZXZpb3VzIG5vZGUgaW5zdGVhZCBvZgotCQkvLyBzaW1wbHkgaHVuZwotCQkvLyBvZmYgb2YgaXQgYXMgYSBzZXBhcmF0ZSBub2RlIChleC46IFhNTCBjb250ZW50IGluc2VydGVkIHJpZ2h0Ci0JCS8vIGJlZm9yZSBhbiBvcGVuCi0JCS8vIGJyYWNrZXQgc2hvdWxkIGJlY29tZSBwYXJ0IG9mIHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUpCi0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91cyA9IHJlc3VsdC5nZXRQcmV2aW91cygpOwotCQkJaWYgKChwcmV2aW91cyAhPSBudWxsKSAmJiAoKCEocHJldmlvdXMuaXNFbmRlZCgpKSkgfHwgKHN0YXJ0ID09IHJlc3VsdC5nZXRTdGFydCgpKSkpIHsKLQkJCQlyZXN1bHQgPSBwcmV2aW91czsKLQkJCX0KLQkJCS8vIElmIHdlIGFyZSBub3cgYXQgdGhlIGVuZCBvZiBhICJ0YWcgZGVwZW5kZW50IiBjb250ZW50IGFyZWEgKG9yCi0JCQkvLyBKU1AgYXJlYSkKLQkJCS8vIHRoZW4gd2UgbmVlZCB0byBiYWNrIHVwIGFsbCB0aGUgd2F5IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhhdC4KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcG90ZW50aWFsID0gcmVzdWx0OwotCQkJd2hpbGUgKGlzUGFydE9mQmxvY2tSZWdpb24ocG90ZW50aWFsKSkgewotCQkJCXBvdGVudGlhbCA9IHBvdGVudGlhbC5nZXRQcmV2aW91cygpOwotCQkJfQotCQkJaWYgKHBvdGVudGlhbCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcG90ZW50aWFsOwotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24ocmVzdWx0KTsKLQkJCX0KLQkJfQotCQlkaXJ0eVN0YXJ0ID0gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSBydWxlIGlzLCB0aGF0IGlzIHdlIGFyZSBjb250ZW50LCBwcmVjZWRlZCBieSBsb25lIDwsIHRoZW4gd2UgbmVlZAotCSAqIHRvIGFkdmFuY2Ugb25lIG1vcmUgZm9yIGRpcnR5IGVuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvbmVPcGVuRm9sbG93ZWRCeUNvbnRlbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlTdHJpbmcgdHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91cyA9IGZsYXROb2RlLmdldFByZXZpb3VzKCk7Ci0JCQlTdHJpbmcgcHJldmlvdXNUeXBlID0gbnVsbDsKLQkJCWlmIChwcmV2aW91cyAhPSBudWxsKSB7Ci0JCQkJcHJldmlvdXNUeXBlID0gcHJldmlvdXMuZ2V0VHlwZSgpOwotCQkJfQotCQkJaWYgKHByZXZpb3VzVHlwZSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gKHByZXZpb3VzVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcnRPZkJsb2NrUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU3RyaW5nIHR5cGUgPSBmbGF0Tm9kZS5nZXRUeXBlKCk7Ci0JCXJlc3VsdCA9ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5OGRjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LlhNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIEEgc2ltcGxlIGNsYXNzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZiBTdHJ1Y3R1cmVkUmVnaW9ucy4KLSAqLwotcHVibGljIGNsYXNzIFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5IHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBKU1BfRElSRUNUSVZFID0gMTAwMzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBYTUwgPSAxMDAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFhNTF9CTE9DSyA9IDEwMDI7Ci0KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlUmVnaW9uKGludCB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2UgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgWE1MIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgWE1MX0JMT0NLIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBCbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQWJzdHJhY3RSZWdpb246OmNyZWF0ZVJlZ2lvbi4gSW52YWxpZCB0eXBlLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxZmVlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MDYgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gMTAvMjkvMTAgNTowNSBQTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuWE1MUGFyc2VyUmVnaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDEwLzI5LzEwIDU6MDUgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovQzovZGV2L3dvcmtzcGFjZXMvaW5kaWdvL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxUb2tlbml6ZXIgaW1wbGVtZW50cyBCbG9ja1Rva2VuaXplciwgRE9NUmVnaW9uQ29udGV4dCB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEID0gMjM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAyNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfQVRUUklCVVRFX05BTUUgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX1RBR19DTE9TRSA9IDExOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UgPSAyMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9FUVVBTFMgPSAxMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1RBR19OQU1FID0gMTY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUgPSAxOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFID0gMTQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSA9IDI1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX05BTUUgPSAxNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04gPSAyNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04gPSAyMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04gPSAyODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlRfRU5EID0gNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfVEVYVCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX1RBR19DTE9TRSA9IDE1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVCA9IDM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX0NPTlRFTlQgPSA3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9XUyA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX0VORCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAyOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQkxPQ0tfVEFHX1NDQU4gPSAzMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0VRVUFMUyA9IDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTiA9IDIwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMgPSAyNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VRVUFMUyA9IDE4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSSA9IDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSA9IDg7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxMVwwXDFcNVwxXDIyXDJcMFwxXDE0XDIyXDBcMVwxNFwxXDIxXDFcMTFcMVw1NSIrCi0gICAgIlwxXDE2XDFcMTdcMVwxMlwxXDEzXDFcMTZcMVwxNlwxXDE2XDFcMTZcMVwxNlwxXDciKwotICAgICJcMVw2XDFcM1wxMlwxNVwxXDEwXDFcNjFcMVwxXDFcNDVcMVwyXDFcNFwxXDE2IisKLSAgICAiXDFcMzRcMVw2MlwxXDMyXDFcMzNcMVw1MFwxXDU3XDFcMzZcMVwzNlwxXDQyXDFcMzYiKwotICAgICJcMVwzNlwxXDI3XDFcMjVcMVw0NFwxXDQzXDFcNDdcMVwzNlwxXDQwXDFcNTZcMVwzNSIrCi0gICAgIlwxXDYwXDJcMzZcMVwyM1wxXDQ2XDFcMzZcMVwzMVwxXDBcMVwyMFwxXDBcMVwxMCIrCi0gICAgIlwxXDBcMVw1MlwxXDYyXDFcNjNcMVw1M1wxXDM3XDFcNTdcMVwzNlwxXDY2XDFcNDIiKwotICAgICJcMlwzNlwxXDMwXDFcMjZcMVw0NFwxXDQzXDFcNDdcMVwzNlwxXDQwXDFcNDFcMVw1MSIrCi0gICAgIlwxXDYwXDFcMzZcMVwzNlwxXDI0XDFcNTRcMVwzNlwxXDBcMVwwXDcyXDBcMVw2NSIrCi0gICAgIlwxMFwwXDI3XDY0XDFcMFwzN1w2NFwxXDBcNzJcNjRcMlwwXDEzXDY0XDJcMFwxMFw2NCIrCi0gICAgIlwxXDBcNjVcNjRcMVwwXDEwNFw2NFwxMVwwXDQ0XDY0XDNcMFwyXDY0XDRcMFwzNlw2NCIrCi0gICAgIlw3MFwwXDEzMVw2NFwyMlwwXDdcNjRcMTZcMFwyXDY1XDU2XDBcMTA2XDY1XDMyXDBcMlw2NSIrCi0gICAgIlw0NFwwXDFcNjRcMVw2NVwzXDY0XDFcMFwxXDY0XDFcMFwyNFw2NFwxXDBcNTRcNjQiKwotICAgICJcMVwwXDdcNjRcM1wwXDFcNjRcMVwwXDFcNjRcMVwwXDFcNjRcMVwwXDFcNjQiKwotICAgICJcMVwwXDIyXDY0XDE1XDBcMTRcNjRcMVwwXDEwMlw2NFwxXDBcMTRcNjRcMVwwXDQ0XDY0IisKLSAgICAiXDFcMFw0XDY1XDExXDBcNjVcNjRcMlwwXDJcNjRcMlwwXDJcNjRcM1wwXDM0XDY0IisKLSAgICAiXDJcMFwxMFw2NFwyXDBcMlw2NFw2N1wwXDQ2XDY0XDJcMFwxXDY0XDdcMFw0Nlw2NCIrCi0gICAgIlwxMlwwXDIxXDY1XDFcMFwyN1w2NVwxXDBcM1w2NVwxXDBcMVw2NVwxXDBcMlw2NSIrCi0gICAgIlwxXDBcMVw2NVwxM1wwXDMzXDY0XDVcMFwzXDY0XDU2XDBcMzJcNjRcNVwwXDFcNjUiKwotICAgICJcMTJcNjRcMTBcNjVcMTVcMFwxMlw2NVw2XDBcMVw2NVwxMDdcNjRcMlwwXDVcNjRcMVwwIisKLSAgICAiXDE3XDY0XDFcMFw0XDY0XDFcMFwxXDY0XDE3XDY1XDJcNjRcMlw2NVwxXDBcNFw2NSIrCi0gICAgIlwyXDBcMTJcNjVcdTAyMDdcMFwzXDY1XDFcMFw2NVw2NFwyXDBcMVw2NVwxXDY0XDIwXDY1IisKLSAgICAiXDNcMFw0XDY1XDNcMFwxMlw2NFwyXDY1XDJcMFwxMlw2NVwyMVwwXDNcNjVcMVwwIisKLSAgICAiXDEwXDY0XDJcMFwyXDY0XDJcMFwyNlw2NFwxXDBcN1w2NFwxXDBcMVw2NFwzXDAiKwotICAgICJcNFw2NFwyXDBcMVw2NVwxXDBcN1w2NVwyXDBcMlw2NVwyXDBcM1w2NVwxMVwwIisKLSAgICAiXDFcNjVcNFwwXDJcNjRcMVwwXDNcNjRcMlw2NVwyXDBcMTJcNjVcMlw2NFwyMFwwIisKLSAgICAiXDFcNjVcMlwwXDZcNjRcNFwwXDJcNjRcMlwwXDI2XDY0XDFcMFw3XDY0XDFcMCIrCi0gICAgIlwyXDY0XDFcMFwyXDY0XDFcMFwyXDY0XDJcMFwxXDY1XDFcMFw1XDY1XDRcMCIrCi0gICAgIlwyXDY1XDJcMFwzXDY1XDEzXDBcNFw2NFwxXDBcMVw2NFw3XDBcMTJcNjVcMlw2NSIrCi0gICAgIlwzXDY0XDE0XDBcM1w2NVwxXDBcN1w2NFwxXDBcMVw2NFwxXDBcM1w2NFwxXDAiKwotICAgICJcMjZcNjRcMVwwXDdcNjRcMVwwXDJcNjRcMVwwXDVcNjRcMlwwXDFcNjVcMVw2NCIrCi0gICAgIlwxMFw2NVwxXDBcM1w2NVwxXDBcM1w2NVwyMlwwXDFcNjRcNVwwXDEyXDY1XDIxXDAiKwotICAgICJcM1w2NVwxXDBcMTBcNjRcMlwwXDJcNjRcMlwwXDI2XDY0XDFcMFw3XDY0XDFcMCIrCi0gICAgIlwyXDY0XDJcMFw0XDY0XDJcMFwxXDY1XDFcNjRcNlw2NVwzXDBcMlw2NVwyXDAiKwotICAgICJcM1w2NVwxMFwwXDJcNjVcNFwwXDJcNjRcMVwwXDNcNjRcNFwwXDEyXDY1XDIyXDAiKwotICAgICJcMlw2NVwxXDBcNlw2NFwzXDBcM1w2NFwxXDBcNFw2NFwzXDBcMlw2NFwxXDAiKwotICAgICJcMVw2NFwxXDBcMlw2NFwzXDBcMlw2NFwzXDBcM1w2NFwzXDBcMTBcNjRcMVwwIisKLSAgICAiXDNcNjRcNFwwXDVcNjVcM1wwXDNcNjVcMVwwXDRcNjVcMTFcMFwxXDY1XDE3XDAiKwotICAgICJcMTFcNjVcMjFcMFwzXDY1XDFcMFwxMFw2NFwxXDBcM1w2NFwxXDBcMjdcNjRcMVwwIisKLSAgICAiXDEyXDY0XDFcMFw1XDY0XDRcMFw3XDY1XDFcMFwzXDY1XDFcMFw0XDY1XDdcMCIrCi0gICAgIlwyXDY1XDExXDBcMlw2NFw0XDBcMTJcNjVcMjJcMFwyXDY1XDFcMFwxMFw2NFwxXDAiKwotICAgICJcM1w2NFwxXDBcMjdcNjRcMVwwXDEyXDY0XDFcMFw1XDY0XDRcMFw3XDY1XDFcMCIrCi0gICAgIlwzXDY1XDFcMFw0XDY1XDdcMFwyXDY1XDdcMFwxXDY0XDFcMFwyXDY0XDRcMCIrCi0gICAgIlwxMlw2NVwyMlwwXDJcNjVcMVwwXDEwXDY0XDFcMFwzXDY0XDFcMFwyN1w2NFwxXDAiKwotICAgICJcMjBcNjRcNFwwXDZcNjVcMlwwXDNcNjVcMVwwXDRcNjVcMTFcMFwxXDY1XDEwXDAiKwotICAgICJcMlw2NFw0XDBcMTJcNjVcMjIxXDBcNTZcNjRcMVwwXDFcNjRcMVw2NVwyXDY0XDdcNjUiKwotICAgICJcNVwwXDZcNjRcMVw2NVwxMFw2NVwxXDBcMTJcNjVcNDdcMFwyXDY0XDFcMFwxXDY0IisKLSAgICAiXDJcMFwyXDY0XDFcMFwxXDY0XDJcMFwxXDY0XDZcMFw0XDY0XDFcMFw3XDY0IisKLSAgICAiXDFcMFwzXDY0XDFcMFwxXDY0XDFcMFwxXDY0XDJcMFwyXDY0XDFcMFwyXDY0IisKLSAgICAiXDFcMFwxXDY0XDFcNjVcMlw2NFw2XDY1XDFcMFwyXDY1XDFcNjRcMlwwXDVcNjQiKwotICAgICJcMVwwXDFcNjVcMVwwXDZcNjVcMlwwXDEyXDY1XDc2XDBcMlw2NVw2XDBcMTJcNjUiKwotICAgICJcMTNcMFwxXDY1XDFcMFwxXDY1XDFcMFwxXDY1XDRcMFwyXDY1XDEwXDY0XDFcMCIrCi0gICAgIlw0MVw2NFw3XDBcMjRcNjVcMVwwXDZcNjVcNFwwXDZcNjVcMVwwXDFcNjVcMVwwIisKLSAgICAiXDI1XDY1XDNcMFw3XDY1XDFcMFwxXDY1XDM0NlwwXDQ2XDY0XDEyXDBcNDdcNjRcMTFcMCIrCi0gICAgIlwxXDY0XDFcMFwyXDY0XDFcMFwzXDY0XDFcMFwxXDY0XDFcMFwyXDY0XDFcMCIrCi0gICAgIlw1XDY0XDUxXDBcMVw2NFwxXDBcMVw2NFwxXDBcMVw2NFwxM1wwXDFcNjRcMVwwIisKLSAgICAiXDFcNjRcMVwwXDFcNjRcM1wwXDJcNjRcM1wwXDFcNjRcNVwwXDNcNjRcMVwwIisKLSAgICAiXDFcNjRcMVwwXDFcNjRcMVwwXDFcNjRcMVwwXDFcNjRcM1wwXDJcNjRcM1wwIisKLSAgICAiXDJcNjRcMVwwXDFcNjRcNTBcMFwxXDY0XDExXDBcMVw2NFwyXDBcMVw2NFwyXDAiKwotICAgICJcMlw2NFw3XDBcMlw2NFwxXDBcMVw2NFwxXDBcN1w2NFw1MFwwXDFcNjRcNFwwIisKLSAgICAiXDFcNjRcMTBcMFwxXDY0XHUwYzA2XDBcMjM0XDY0XDRcMFwxMzJcNjRcNlwwXDI2XDY0XDJcMCIrCi0gICAgIlw2XDY0XDJcMFw0Nlw2NFwyXDBcNlw2NFwyXDBcMTBcNjRcMVwwXDFcNjRcMVwwIisKLSAgICAiXDFcNjRcMVwwXDFcNjRcMVwwXDM3XDY0XDJcMFw2NVw2NFwxXDBcN1w2NFwxXDAiKwotICAgICJcMVw2NFwzXDBcM1w2NFwxXDBcN1w2NFwzXDBcNFw2NFwyXDBcNlw2NFw0XDAiKwotICAgICJcMTVcNjRcNVwwXDNcNjRcMVwwXDdcNjRcMzIzXDBcMTVcNjVcNFwwXDFcNjVcMTA0XDAiKwotICAgICJcMVw2NFwzXDBcMlw2NFwyXDBcMVw2NFwxMjFcMFwzXDY0XHUwZTgyXDBcMVw2NVwxXDAiKwotICAgICJcMVw2NFwzMVwwXDExXDY0XDZcNjVcMVwwXDVcNjVcMTNcMFwxMjRcNjRcNFwwXDJcNjUiKwotICAgICJcMlwwXDJcNjVcMlwwXDEzMlw2NFwxXDBcM1w2NVw2XDBcNTBcNjRcdTFjZDNcMFx1NTFhNlw2NCIrCi0gICAgIlx1MGM1YVwwXHUyYmE0XDY0XDEzNFwwXHUwODAwXDBcdTFmZmVcMFwyXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXlfcm93TWFwIFtdID0geyAKLSAgICAgICAgMCwgICAgNTUsICAgMTEwLCAgIDE2NSwgICAyMjAsICAgMjc1LCAgIDMzMCwgICAzODUsICAgNDQwLCAgIDQ5NSwgCi0gICAgICA1NTAsICAgNjA1LCAgIDY2MCwgICA3MTUsICAgNzcwLCAgIDgyNSwgICA4ODAsICAgOTM1LCAgIDk5MCwgIDEwNDUsIAotICAgICAxMTAwLCAgMTE1NSwgIDEyMTAsICAxMjY1LCAgMTMyMCwgIDEzNzUsICAxNDMwLCAgMTQ4NSwgIDE1NDAsICAxNTk1LCAKLSAgICAgMTY1MCwgIDE3MDUsICAxNzYwLCAgMTgxNSwgIDE4NzAsICAxOTI1LCAgMTk4MCwgIDE5MjUsICAxOTgwLCAgMjAzNSwgCi0gICAgIDE5MjUsICAxOTI1LCAgMTk4MCwgIDIwOTAsICAyMTQ1LCAgMjIwMCwgIDIyNTUsICAyMzEwLCAgMjM2NSwgIDI0MjAsIAotICAgICAyNDc1LCAgMTkyNSwgIDE5ODAsICAyNTMwLCAgMjU4NSwgIDI2NDAsICAxOTI1LCAgMjY5NSwgIDI2OTUsICAyNzUwLCAKLSAgICAgMjgwNSwgIDI4NjAsICAyNTMwLCAgMTkyNSwgIDI5MTUsICAyOTcwLCAgMTkyNSwgIDMwMjUsICAzMDgwLCAgMzEzNSwgCi0gICAgIDMxOTAsICAzMjQ1LCAgMzMwMCwgIDE5MjUsICAzMzU1LCAgMzQxMCwgIDM0NjUsICAzNTIwLCAgMTkyNSwgIDM1NzUsIAotICAgICAzNjMwLCAgMzY4NSwgIDM3NDAsICAzNzk1LCAgMTkyNSwgIDM4NTAsICAzOTA1LCAgMzk2MCwgIDQwMTUsICA0MDcwLCAKLSAgICAgNDEyNSwgIDQxODAsICA0MjM1LCAgNDIzNSwgIDQyOTAsICA0MzQ1LCAgNDQwMCwgIDQ0NTUsICA0NDU1LCAgNDUxMCwgCi0gICAgIDQ1NjUsICA0NjIwLCAgNDY3NSwgIDQ2NzUsICA0NzMwLCAgNDc4NSwgIDQ4NDAsICA0ODk1LCAgMTkyNSwgIDQ5NTAsIAotICAgICA0OTUwLCAgNTAwNSwgIDUwNjAsICA1MTE1LCAgNTE3MCwgIDE5MjUsICAxOTI1LCAgMTk4MCwgIDE5MjUsICAxOTI1LCAKLSAgICAgNTIyNSwgIDUyODAsICA1MzM1LCAgNTM5MCwgIDU0NDUsICA1NTAwLCAgNTU1NSwgIDU2MTAsICAxOTI1LCAgNTY2NSwgCi0gICAgIDU3MjAsICA1Nzc1LCAgMTkyNSwgIDE5MjUsICAyNjk1LCAgNTgzMCwgIDI4MDUsICAxOTI1LCAgNTg4NSwgIDI4NjAsIAotICAgICAyOTE1LCAgMzAyNSwgIDMwODAsICA1OTQwLCAgMzEzNSwgIDE5MjUsICA1OTk1LCAgMzE5MCwgIDE5MjUsICAzNTc1LCAKLSAgICAgNjA1MCwgIDM2ODUsICAxOTI1LCAgNjEwNSwgIDM3NDAsICA1MjI1LCAgNjE2MCwgIDYyMTUsICA2MjcwLCAgNDAxNSwgCi0gICAgIDE5MjUsICA2MzI1LCAgNjM4MCwgIDQyMzUsICA2NDM1LCAgNDI5MCwgIDE5MjUsICA2NDkwLCAgNjU0NSwgIDY2MDAsIAotICAgICA2NjAwLCAgNjY1NSwgIDY3MTAsICA0NDAwLCAgNDIzNSwgIDQ0NTUsICA2NzY1LCAgNDUxMCwgIDE5MjUsICA2ODIwLCAKLSAgICAgNDU2NSwgIDQ2MjAsICA0NDU1LCAgNDY3NSwgIDY4NzUsICA0NzMwLCAgMTkyNSwgIDY5MzAsICA2OTg1LCAgNzA0MCwgCi0gICAgIDcwNDAsICA3MDk1LCAgNzE1MCwgIDcyMDUsICA0OTUwLCAgNzI2MCwgIDUwMDUsICAxOTI1LCAgNzMxNSwgIDczNzAsIAotICAgICA3NDI1LCAgNzQyNSwgIDc0ODAsICA3NTM1LCAgNzU5MCwgIDc2NDUsICA3NzAwLCAgNzc1NSwgIDc4MTAsICAxOTI1LCAKLSAgICAgNzg2NSwgIDc5MjAsICAxOTI1LCAgMTkyNSwgIDE5MjUsICAyMjU1LCAgNzk3NSwgIDgwMzAsICA4MDg1LCAgODE0MCwgCi0gICAgIDgxOTUsICA4MjUwLCAgODMwNSwgIDY0OTAsICA4MzYwLCAgODM2MCwgIDY5MzAsICA4NDE1LCAgODQxNSwgIDg0NzAsIAotICAgICA3MzE1LCAgODUyNSwgIDg1MjUsICA4NTgwLCAgMTkyNSwgIDg2MzUsICA4NjkwLCAgMTkyNSwgIDg3NDUsICA4ODAwLCAKLSAgICAgODg1NSwgIDg5MTAsICA4OTY1LCAgOTAyMCwgIDkwNzUsICA5MTMwLCAgNjY1NSwgIDcwOTUsICA5MTg1LCAgNzQ4MCwgCi0gICAgIDkyNDAsICA5Mjk1LCAgOTM1MCwgIDk0MDUsICA5NDYwLCAgOTUxNSwgIDk1NzAsICA5NjI1LCAgOTY4MCwgIDk3MzUsIAotICAgICA5NzkwLCAgOTg0NSwgIDk5MDAsICA5OTU1LCAxMDAxMCwgMTAwNjUsIDEwMTIwLCAgMTkyNSwgIDE5MjUsIDEwMTc1LCAKLSAgICAxMDIzMCwgMTAyODUsIDEwMzQwLCAxMDM5NSwgIDE5MjUsICAxOTI1LCAgMTkyNSwgMTA0NTAsIDEwNTA1LCAxMDU2MCwgCi0gICAgMTA2MTUsIDEwNjcwLCAxMDcyNSwgIDE5MjUsIDEwNzgwLCAgNDg0MCwgIDUxMTUsIDEwODM1LCAxMDg5MCwgMTA5NDUsIAotICAgIDExMDAwLCAgMjI1NQotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDFcNDBcMVw0MVwxMFw0MFwxXDQyXDRcNDBcMVw0M1w0N1w0MFwxXDQ0IisKLSAgICAiXDFcNDVcNjVcNDRcMVw0NlwxXDQ3XDE2XDQ2XDFcNTBcMVw0NlwxXDUxIisKLSAgICAiXDQ0XDQ2XDFcNTJcMVw1M1w2NVw1MlwxXDQ2XDFcNDdcNVw0NlwxXDU0IisKLSAgICAiXDEyXDQ2XDFcNTFcNDVcNDZcMVw0N1wyXDQ2XDFcNTVcMVw1NlwyXDQ2IisKLSAgICAiXDFcNTdcM1w0NlwxXDU2XDVcNDZcMVw1NlwxXDYwXDFcNjFcNFw1NyIrCi0gICAgIlwxXDQ2XDEwXDU3XDFcNjJcMlw1N1wxXDQ2XDdcNTdcMVw0NlwzXDU3IisKLSAgICAiXDFcNDZcM1w1N1wxXDQ2XDFcNTdcMVw0NlwxXDQ3XDJcNDZcMVw1NSIrCi0gICAgIlwxXDYzXDZcNDZcMVw2M1w1XDQ2XDFcNjNcNDRcNDZcMVw2NFwxXDY1IisKLSAgICAiXDJcNjRcMVw2NlwxNVw2NFwxXDUxXDQ0XDY0XDFcNDZcMVw0N1wyXDQ2IisKLSAgICAiXDFcNjdcMVw1NlwyXDQ2XDFcNzBcM1w0NlwxXDU2XDVcNDZcMVw1NiIrCi0gICAgIlw2XDcwXDFcNDZcMTNcNzBcMVw0Nlw3XDcwXDFcNDZcM1w3MFwxXDQ2IisKLSAgICAiXDNcNzBcMVw0NlwxXDcwXDFcNDZcMVw0N1wyXDQ2XDFcNjdcMVw1NiIrCi0gICAgIlwyXDQ2XDFcNzBcM1w0NlwxXDU2XDVcNDZcMVw1Nlw2XDcwXDFcNDYiKwotICAgICJcMTNcNzBcMVw3MVw3XDcwXDFcNDZcM1w3MFwxXDQ2XDNcNzBcMVw0NiIrCi0gICAgIlwxXDcwXDFcNzJcMVw0N1wxXDQ2XDFcNzNcMVw3NFwxXDU2XDNcNzIiKwotICAgICJcMVw3NVwxXDcyXDFcNzZcMVw1Nlw1XDcyXDFcNTZcNDRcNzJcMVw0NiIrCi0gICAgIlwxXDQ3XDJcNDZcMVw3N1wxNVw0NlwxXDUxXDQ1XDQ2XDFcNDdcMVwxMDAiKwotICAgICJcMVwxMDFcMVw0NlwxXDU2XDJcNDZcMVwxMDJcM1w0NlwxXDU2XDVcNDYiKwotICAgICJcMVw1Nlw2XDEwMlwxXDQ2XDEzXDEwMlwxXDQ2XDdcMTAyXDFcNDZcM1wxMDIiKwotICAgICJcMVw0NlwzXDEwMlwxXDQ2XDFcMTAyXDFcNDZcMVw0N1wxXDEwMFwxXDEwMSIrCi0gICAgIlwxXDQ2XDFcNTZcMlw0NlwxXDEwMlwzXDQ2XDFcNTZcNVw0NlwxXDU2IisKLSAgICAiXDZcMTAyXDFcNDZcMTNcMTAyXDFcMTAzXDdcMTAyXDFcNDZcM1wxMDJcMVw0NiIrCi0gICAgIlwzXDEwMlwxXDQ2XDFcMTAyXDFcMTA0XDFcNDdcMVwxMDBcMVwxMDVcMVwxMDQiKwotICAgICJcMVw1NlwzXDEwNFwxXDEwNlwxXDEwNFwxXDEwN1wxXDU2XDVcMTA0XDFcNTYiKwotICAgICJcNDRcMTA0XDFcNDZcMVw0N1wzXDQ2XDFcNTZcNlw0NlwxXDU2XDVcNDYiKwotICAgICJcMVw1Nlw0NFw0NlwxXDExMFwxXDExMVwxXDExMlwxXDExM1w0XDExMFwxXDExNCIrCi0gICAgIlwxMlwxMTBcNlwxMTVcMVwxMTBcMTNcMTE1XDFcMTEwXDdcMTE1XDFcMTEwXDNcMTE1IisKLSAgICAiXDFcMTEwXDNcMTE1XDFcMTEwXDFcMTE1XDFcNDZcMVwxMTFcMVwxMTJcMVwxMTMiKwotICAgICJcMVw0NlwxXDU2XDJcNDZcMVwxMTZcM1w0NlwxXDU2XDVcNDZcMVw1NiIrCi0gICAgIlw2XDExNlwxXDQ2XDEzXDExNlwxXDQ2XDdcMTE2XDFcNDZcM1wxMTZcMVw0NiIrCi0gICAgIlwzXDExNlwxXDQ2XDFcMTE2XDFcNDZcMVwxMTFcMVwxMTJcMVwxMTNcMVw0NiIrCi0gICAgIlwxXDU2XDJcNDZcMVwxMTZcM1w0NlwxXDU2XDVcNDZcMVw1Nlw2XDExNiIrCi0gICAgIlwxXDQ2XDEzXDExNlwxXDExN1w3XDExNlwxXDQ2XDNcMTE2XDFcNDZcM1wxMTYiKwotICAgICJcMVw0NlwxXDExNlwxXDEyMFwxXDExMVwxXDExMlwxXDEyMVwxXDEyMFwxXDU2IisKLSAgICAiXDNcMTIwXDFcMTIyXDFcMTIwXDFcMTIzXDFcNTZcNVwxMjBcMVw1Nlw0NFwxMjAiKwotICAgICJcMVw0NlwxXDEyNFwxXDEyNVwyXDQ2XDFcNTZcNlw0NlwxXDU2XDVcNDYiKwotICAgICJcMVw1NlwxMFw0NlwxXDEyNlwxXDEyN1wyXDQ2XDFcMTMwXDEwXDQ2XDFcMTMwIisKLSAgICAiXDFcNDZcMVwxMjdcMVwxMjZcMTRcNDZcMVw0N1wxXDEyNVwyXDQ2XDFcNTYiKwotICAgICJcNlw0NlwxXDU2XDVcNDZcMVw1Nlw2XDQ2XDFcMTMxXDM2XDQ2XDFcNDciKwotICAgICJcMVwxMjVcMlw0NlwxXDU2XDJcNDZcMVwxMzJcM1w0NlwxXDU2XDVcNDYiKwotICAgICJcMVw1Nlw2XDEzMlwxXDEzMVwxM1wxMzJcMVw0Nlw3XDEzMlwxXDQ2XDNcMTMyIisKLSAgICAiXDFcNDZcM1wxMzJcMVw0NlwxXDEzMlwxXDQ2XDFcNDdcMVwxMjVcMlw0NiIrCi0gICAgIlwxXDU2XDZcNDZcMVw1Nlw1XDQ2XDFcNTZcNlw0NlwxXDEzMVw3XDQ2IisKLSAgICAiXDFcMTMzXDVcNDZcMVwxMzRcNlw0NlwxXDEzM1wxMFw0NlwxXDEzNVwxXDQ3IisKLSAgICAiXDFcMTI1XDFcMTM2XDFcMTM1XDFcNTZcM1wxMzVcMVwxMzdcMVwxMzVcMVwxNDAiKwotICAgICJcMVw1Nlw1XDEzNVwxXDU2XDZcMTM1XDFcMTQxXDM1XDEzNVwxXDE0MlwxXDQ3IisKLSAgICAiXDFcMTI1XDFcMTQzXDFcMTQyXDFcNTZcM1wxNDJcMVwxNDRcMVwxNDJcMVwxNDUiKwotICAgICJcMVw1Nlw1XDE0MlwxXDU2XDZcMTQyXDFcMTQ2XDM1XDE0MlwxXDE0N1wxXDQ3IisKLSAgICAiXDFcMTI1XDFcMTUwXDFcMTQ3XDFcNTZcM1wxNDdcMVwxNTFcMVwxNDdcMVwxNTIiKwotICAgICJcMVw1Nlw1XDE0N1wxXDU2XDQ0XDE0N1wxXDE1M1wxXDE1NFwxXDE1NVw2NFwxNTMiKwotICAgICJcMVwxNTZcMVw0N1wxXDEyNVwxXDE1N1wxXDE1NlwxXDU2XDNcMTU2XDFcMTYwIisKLSAgICAiXDFcMTU2XDFcMTYxXDFcNTZcNVwxNTZcMVw1Nlw0NFwxNTZcMVwxNjJcMVwxNjMiKwotICAgICJcMVwxNjRcNjRcMTYyXDFcMTY1XDFcMTY2XDY1XDE2NVwxXDQwXDFcMFwxMFw0MCIrCi0gICAgIlwxXDBcNFw0MFwxXDBcNDdcNDBcM1wwXDFcMTY3XDFcMTcwXDE0XDAiKwotICAgICJcMVwxNzFcNTJcMFwxXDE3MlwyXDBcMVwxNzNcM1wwXDFcMTcyXDVcMCIrCi0gICAgIlwxXDE3Mlw2XDE3M1wxXDBcMTNcMTczXDFcMFw3XDE3M1wxXDE3NFwzXDE3MyIrCi0gICAgIlwxXDBcM1wxNzNcMVwwXDFcMTczXDVcMFwxXDE3MlwyXDBcMVwxNzUiKwotICAgICJcM1wwXDFcMTcyXDVcMFwxXDE3Mlw2XDE3NVwxXDBcMTNcMTc1XDFcMCIrCi0gICAgIlw3XDE3NVwxXDBcM1wxNzVcMVwwXDNcMTc1XDFcMFwxXDE3NVwxMTBcMCIrCi0gICAgIlwxXDE3Nlw2NVwwXDFcMTc3XDU1XDBcMVwyMDBcNjFcMFwxXDIwMVw3MVwwIisKLSAgICAiXDFcNTZcNlwwXDFcNTZcNVwwXDFcNTZcNTJcMFwzXDU3XDRcMCIrCi0gICAgIlwxXDU3XDVcMFw2XDU3XDFcMFwxM1w1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcMlw1N1wyXDIwMlwyXDU3XDFcMFwxM1w1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcMlw1N1wxXDIwMlwxXDIwM1wyXDU3XDFcMFwxM1w1N1wxXDBcN1w1NyIrCi0gICAgIlwxXDBcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1NyIrCi0gICAgIlw1XDBcMlw1N1wyXDIwNFwyXDU3XDFcMFwxM1w1N1wxXDBcN1w1NyIrCi0gICAgIlwxXDBcM1w1N1wxXDBcNVw1N1w1XDBcMVw2M1w2XDBcMVw2MyIrCi0gICAgIlw1XDBcMVw2M1w0NlwwXDFcMjA1XDY2XDBcMVwyMDZcNzJcMFwzXDcwIisKLSAgICAiXDRcMFwxXDcwXDVcMFw2XDcwXDFcMFwxM1w3MFwxXDBcN1w3MCIrCi0gICAgIlwxXDBcM1w3MFwxXDBcNVw3MFwxXDcyXDJcMFwxXDIwN1wxXDcyIisKLSAgICAiXDFcMFwzXDcyXDFcMFwxXDcyXDJcMFw1XDcyXDFcMFw0NVw3MiIrCi0gICAgIlwxXDBcMVwyMDZcMVwyMDdcMVw3MlwxXDBcM1w3MlwxXDBcMVw3MiIrCi0gICAgIlwyXDBcNVw3MlwxXDBcNDRcNzJcMVw3NVwyXDIxMFwxXDIxMVwxXDc1IisKLSAgICAiXDFcMjEwXDNcNzVcMVwyMTJcMVw3NVwyXDIxMFw1XDc1XDFcMjEwXDQ0XDc1IisKLSAgICAiXDFcNzZcMlwyMTNcMVwyMTRcMVw3NlwxXDIxM1wzXDc2XDFcMjEzXDFcNzYiKwotICAgICJcMVwyMTJcMVwyMTNcNVw3NlwxXDIxM1w0NFw3NlwyXDBcMVwxMDBcMVwyMTUiKwotICAgICJcNzFcMFwzXDEwMlw0XDBcMVwxMDJcNVwwXDZcMTAyXDFcMFwxM1wxMDIiKwotICAgICJcMVwwXDdcMTAyXDFcMFwzXDEwMlwxXDBcNVwxMDJcMVwxMDRcMlwwIisKLSAgICAiXDFcMjE2XDFcMTA0XDFcMFwzXDEwNFwxXDBcMVwxMDRcMlwwXDVcMTA0IisKLSAgICAiXDFcMFw0NVwxMDRcMVwwXDFcMTAwXDFcMjE3XDFcMTA0XDFcMFwzXDEwNCIrCi0gICAgIlwxXDBcMVwxMDRcMlwwXDVcMTA0XDFcMFw0NFwxMDRcMVwxMDZcMlwyMjAiKwotICAgICJcMVwyMjFcMVwxMDZcMVwyMjBcM1wxMDZcMVwyMjJcMVwxMDZcMlwyMjBcNVwxMDYiKwotICAgICJcMVwyMjBcNDRcMTA2XDFcMTA3XDJcMjIzXDFcMjI0XDFcMTA3XDFcMjIzXDNcMTA3IisKLSAgICAiXDFcMjIzXDFcMTA3XDFcMjIyXDFcMjIzXDVcMTA3XDFcMjIzXDQ0XDEwN1wxXDExMCIrCi0gICAgIlwzXDBcMTdcMTEwXDZcMFwxXDExMFwxM1wwXDFcMTEwXDdcMFwxXDExMCIrCi0gICAgIlwzXDBcMVwxMTBcM1wwXDFcMTEwXDRcMFwxXDE2N1wxNVwwXDFcMTcxIisKLSAgICAiXDQ3XDBcMVwyMjVcNjRcMFwxXDExMFwzXDBcMlwxMTBcM1wxMTRcNFwxMTAiKwotICAgICJcMVwxMTRcNVwxMTBcNlwxMTVcMVwxMTBcMTNcMTE1XDFcMTEwXDdcMTE1XDFcMTEwIisKLSAgICAiXDNcMTE1XDFcMTEwXDNcMTE1XDFcMTE0XDFcMTE1XDZcMFwzXDExNVw0XDAiKwotICAgICJcMVwxMTVcNVwwXDZcMTE1XDFcMFwxM1wxMTVcMVwwXDdcMTE1XDFcMCIrCi0gICAgIlwzXDExNVwxXDBcNVwxMTVcNlwwXDNcMTE2XDRcMFwxXDExNlw1XDAiKwotICAgICJcNlwxMTZcMVwwXDEzXDExNlwxXDBcN1wxMTZcMVwwXDNcMTE2XDFcMCIrCi0gICAgIlw1XDExNlwxXDEyMFwyXDBcMVwyMjZcMVwxMjBcMVwwXDNcMTIwXDFcMCIrCi0gICAgIlwxXDEyMFwyXDBcNVwxMjBcMVwwXDQ1XDEyMFwxXDBcMVwyMjVcMVwyMjYiKwotICAgICJcMVwxMjBcMVwwXDNcMTIwXDFcMFwxXDEyMFwyXDBcNVwxMjBcMVwwIisKLSAgICAiXDQ0XDEyMFwxXDEyMlwyXDIyN1wxXDIzMFwxXDEyMlwxXDIyN1wzXDEyMlwxXDIzMSIrCi0gICAgIlwxXDEyMlwyXDIyN1w1XDEyMlwxXDIyN1w0NFwxMjJcMVwxMjNcMlwyMzJcMVwyMzMiKwotICAgICJcMVwxMjNcMVwyMzJcM1wxMjNcMVwyMzJcMVwxMjNcMVwyMzFcMVwyMzJcNVwxMjMiKwotICAgICJcMVwyMzJcNDRcMTIzXDNcMFwxXDE2N1wxNVwwXDFcMjM0XDExMFwwXDFcMjM1IisKLSAgICAiXDYwXDBcMVwyMzZcMTNcMFwxXDIzNlw0NFwwXDJcMjM3XDM2XDBcMjBcMjQwIisKLSAgICAiXDFcMjQxXDQ2XDI0MFw2XDBcM1wxMzJcNFwwXDFcMTMyXDVcMFw2XDEzMiIrCi0gICAgIlwxXDBcMTNcMTMyXDFcMFw3XDEzMlwxXDBcM1wxMzJcMVwwXDVcMTMyIisKLSAgICAiXDQ2XDBcMVwyNDJcNVwwXDFcMjQyXDcyXDBcMVwyNDNcNlwwXDFcMTM1IisKLSAgICAiXDJcMFwxXDI0NFwxXDEzNVwxXDBcM1wxMzVcMVwwXDFcMTM1XDJcMCIrCi0gICAgIlw1XDEzNVwxXDBcNDRcMTM1XDFcMTM3XDJcMjQ1XDFcMjQ2XDFcMTM3XDFcMjQ1IisKLSAgICAiXDNcMTM3XDFcMjQ3XDFcMTM3XDJcMjQ1XDVcMTM3XDFcMjQ1XDQ0XDEzN1wxXDI1MCIrCi0gICAgIlwyXDI1MVwxXDI1MlwxXDI1M1wxXDI1MVwzXDI1M1wxXDI1MVwxXDI1MFwxXDI1NCIrCi0gICAgIlwxXDI1NVwzXDI1M1wxXDI1MFwxXDI1M1wxXDI1NVw2XDI1M1wxXDI1MFwzMlwyNTMiKwotICAgICJcMlwyNTBcMVwyNTNcMVwxNDFcMlwyNDBcMVwyNTZcMVwxNDFcMVwyNDBcM1wxNDEiKwotICAgICJcMVwyNDBcMVwxNDFcMlwyNDBcM1wxNDFcMVwyNTdcMVwxNDFcMVwyNDBcNDRcMTQxIisKLSAgICAiXDFcMTQyXDJcMFwxXDI2MFwxXDE0MlwxXDBcM1wxNDJcMVwwXDFcMTQyIisKLSAgICAiXDJcMFw1XDE0MlwxXDBcNDRcMTQyXDFcMTQ0XDJcMjYxXDFcMjYyXDFcMTQ0IisKLSAgICAiXDFcMjYxXDNcMTQ0XDFcMjYzXDFcMTQ0XDJcMjYxXDVcMTQ0XDFcMjYxXDQ0XDE0NCIrCi0gICAgIlwxXDE0NVwyXDI2NFwxXDI2NVwxXDE0NVwxXDI2NFwzXDE0NVwxXDI2NFwxXDE0NSIrCi0gICAgIlwxXDI2M1wxXDI2NFw1XDE0NVwxXDI2NFw0NFwxNDVcMVwxNDZcMlwyNDBcMVwyNjYiKwotICAgICJcMVwxNDZcMVwyNDBcM1wxNDZcMVwyNDBcMVwxNDZcMlwyNDBcM1wxNDZcMVwyNjciKwotICAgICJcMVwxNDZcMVwyNDBcNDRcMTQ2XDFcMTQ3XDJcMFwxXDI3MFwxXDE0N1wxXDAiKwotICAgICJcM1wxNDdcMVwwXDFcMTQ3XDJcMFw1XDE0N1wxXDBcNDRcMTQ3XDFcMTUxIisKLSAgICAiXDJcMjcxXDFcMjcyXDFcMTUxXDFcMjcxXDNcMTUxXDFcMjczXDFcMTUxXDJcMjcxIisKLSAgICAiXDVcMTUxXDFcMjcxXDQ0XDE1MVwxXDI3NFwyXDI3NVwxXDI3NlwxXDI3N1wxXDI3NSIrCi0gICAgIlwzXDI3N1wxXDI3NVwxXDI3NFwxXDMwMFwxXDMwMVwzXDI3N1wxXDI3NFwxXDI3NyIrCi0gICAgIlwxXDMwMVw2XDI3N1wxXDI3NFwzMlwyNzdcMlwyNzRcMVwyNzdcMlwxNTNcMVwwIisKLSAgICAiXDY2XDE1M1wxXDBcMTZcMTUzXDFcMzAyXDQ1XDE1M1wxXDE1NlwyXDBcMVwzMDMiKwotICAgICJcMVwxNTZcMVwwXDNcMTU2XDFcMFwxXDE1NlwyXDBcNVwxNTZcMVwwIisKLSAgICAiXDQ0XDE1NlwxXDE2MFwyXDMwNFwxXDMwNVwxXDE2MFwxXDMwNFwzXDE2MFwxXDMwNiIrCi0gICAgIlwxXDE2MFwyXDMwNFw1XDE2MFwxXDMwNFw0NFwxNjBcMVwzMDdcMlwzMTBcMVwzMTEiKwotICAgICJcMVwzMTJcMVwzMTBcM1wzMTJcMVwzMTBcMVwzMDdcMVwzMTNcMVwzMTRcM1wzMTIiKwotICAgICJcMVwzMDdcMVwzMTJcMVwzMTRcNlwzMTJcMVwzMDdcMzJcMzEyXDJcMzA3XDFcMzEyIisKLSAgICAiXDJcMTYyXDFcMFw2NlwxNjJcMVwwXDE2XDE2MlwxXDMxNVw0NVwxNjJcN1wwIisKLSAgICAiXDFcMzE2XDIxXDBcMVwzMTdcNDJcMFwxXDE3MlwyXDBcMVw0MFwzXDAiKwotICAgICJcMVwxNzJcNVwwXDFcMTcyXDZcNDBcMVwwXDEzXDQwXDFcMFw3XDQwIisKLSAgICAiXDFcMFwzXDQwXDFcMFwzXDQwXDFcMFwxXDQwXDFcMzIwXDFcMCIrCi0gICAgIlwzXDMyMFwxXDMyMVwzXDE3M1wxXDMyMFwxXDBcMVwzMjBcMVwzMjFcMVwxNzMiKwotICAgICJcMVwzMjBcMVwwXDJcMzIwXDFcMzIxXDZcMTczXDFcMzIwXDEzXDE3M1wxXDMyMCIrCi0gICAgIlw3XDE3M1wxXDMyMFwzXDE3M1wxXDMyMlw1XDE3M1wxNVwwXDFcMzIzXDZcMCIrCi0gICAgIlwxXDMyNFw0MlwwXDFcMzIwXDFcMFwzXDMyMFwxXDMyMVwzXDE3NVwxXDMyMCIrCi0gICAgIlwxXDBcMVwzMjBcMVwzMjFcMVwxNzVcMVwzMjBcMVwwXDJcMzIwXDFcMzIxIisKLSAgICAiXDZcMTc1XDFcMzIwXDEzXDE3NVwxXDMyMFw3XDE3NVwxXDMyMFwzXDE3NVwxXDMyNSIrCi0gICAgIlw1XDE3NVwzMVwwXDFcMzE3XDM3XDBcMVwzMjZcNjZcMFwxXDMyN1w3MlwwIisKLSAgICAiXDNcNTdcNFwwXDFcNTdcNVwwXDRcNTdcMlwzMzBcMVwwXDEzXDU3IisKLSAgICAiXDFcMFw3XDU3XDFcMFwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3IisKLSAgICAiXDRcMFwxXDU3XDVcMFw0XDU3XDFcMzMwXDFcMzMxXDFcMFwxM1w1NyIrCi0gICAgIlwxXDBcN1w1N1wxXDBcM1w1N1wxXDBcNVw1N1w2XDBcM1w1NyIrCi0gICAgIlw0XDBcMVw1N1w1XDBcNlw1N1wxXDBcMTNcNTdcMVwwXDFcNTciKwotICAgICJcMVwzMzJcNVw1N1wxXDBcM1w1N1wxXDBcNVw1N1wxMVwyMTBcMVwyMTIiKwotICAgICJcNTVcMjEwXDEzXDIxM1wxXDIxMlw1M1wyMTNcMTFcMjIwXDFcMjIyXDU1XDIyMFwxM1wyMjMiKwotICAgICJcMVwyMjJcNTNcMjIzXDExXDIyN1wxXDIzMVw1NVwyMjdcMTNcMjMyXDFcMjMxXDUzXDIzMiIrCi0gICAgIlwzMlwwXDFcMzMzXDMwXDBcMVwzMzNcNDBcMFwxXDMzNFwxM1wwXDFcMzM0IisKLSAgICAiXDU0XDBcMVwzMzVcMTBcMFwxXDMzNVw1N1wwXDFcMzM2XDE0XDBcMVwzMzYiKwotICAgICJcNzJcMFwxXDMzN1w0XDBcMTFcMjQ1XDFcMjQ3XDU1XDI0NVwxXDI1MFwyXDI1MSIrCi0gICAgIlwxXDM0MFwxXDI1MFwxXDI1MVwzXDI1MFwxXDI1MVwxXDI1MFwxXDI0N1wxXDI1MSIrCi0gICAgIlw1XDI1MFwxXDI1MVw0NFwyNTBcMTNcMjUxXDFcMjQ3XDUzXDI1MVwxXDI1MFwyXDI1MSIrCi0gICAgIlwxXDM0MFwxXDI1MFwxXDI1MVwzXDI1MFwxXDI1MVwxXDI1MFwxXDM0MVwxXDI1MSIrCi0gICAgIlw1XDI1MFwxXDI1MVw0NFwyNTBcMTNcMFwxXDM0Mlw1M1wwXDEzXDI1MVwxXDM0MSIrCi0gICAgIlw1M1wyNTFcMTFcMjYxXDFcMjYzXDU1XDI2MVwxM1wyNjRcMVwyNjNcNTNcMjY0XDExXDI3MSIrCi0gICAgIlwxXDI3M1w1NVwyNzFcMVwyNzRcMlwyNzVcMVwzNDNcMVwyNzRcMVwyNzVcM1wyNzQiKwotICAgICJcMVwyNzVcMVwyNzRcMVwyNzNcMVwyNzVcNVwyNzRcMVwyNzVcNDRcMjc0XDEzXDI3NSIrCi0gICAgIlwxXDI3M1w1M1wyNzVcMVwyNzRcMlwyNzVcMVwzNDNcMVwyNzRcMVwyNzVcM1wyNzQiKwotICAgICJcMVwyNzVcMVwyNzRcMVwzNDRcMVwyNzVcNVwyNzRcMVwyNzVcNDRcMjc0XDEzXDAiKwotICAgICJcMVwzNDVcNTNcMFwxM1wyNzVcMVwzNDRcNTNcMjc1XDJcMTUzXDFcMFwyNlwxNTMiKwotICAgICJcMVwzNDZcMzVcMTUzXDExXDMwNFwxXDMwNlw1NVwzMDRcMVwzMDdcMlwzMTBcMVwzNDciKwotICAgICJcMVwzMDdcMVwzMTBcM1wzMDdcMVwzMTBcMVwzMDdcMVwzMDZcMVwzMTBcNVwzMDciKwotICAgICJcMVwzMTBcNDRcMzA3XDEzXDMxMFwxXDMwNlw1M1wzMTBcMVwzMDdcMlwzMTBcMVwzNDciKwotICAgICJcMVwzMDdcMVwzMTBcM1wzMDdcMVwzMTBcMVwzMDdcMVwzNTBcMVwzMTBcNVwzMDciKwotICAgICJcMVwzMTBcNDRcMzA3XDEzXDBcMVwzNTFcNTNcMFwxM1wzMTBcMVwzNTBcNTNcMzEwIisKLSAgICAiXDJcMTYyXDFcMFwyNlwxNjJcMVwzNTJcMzVcMTYyXDdcMFwxXDM1M1wxMTFcMCIrCi0gICAgIlwxXDM1NFwzNFwwXDFcMzIwXDFcMFwxMFwzMjBcMVwwXDRcMzIwXDFcMCIrCi0gICAgIlw0MVwzMjBcMVwwXDZcMzIwXDFcMFwzXDMyMFwxXDMyMVw0XDMyMFwxXDAiKwotICAgICJcMVwzMjBcMVwzMjFcMlwzMjBcMVwwXDJcMzIwXDFcMzIxXDM2XDMyMFwxXDM1NSIrCi0gICAgIlw1XDMyMFwxNVwwXDFcMzIzXDQzXDBcMVwzNTZcMjJcMFwxXDM1N1wxNFwwIisKLSAgICAiXDNcMzU3XDJcMFwxXDM1N1wxMFwwXDFcMzU3XDFcMFwyXDM1N1wzXDAiKwotICAgICJcMVwzNTdcMlwwXDJcMzU3XDExXDBcMVw1N1wxXDM2MFwxXDU3XDRcMCIrCi0gICAgIlwxXDU3XDVcMFw2XDU3XDFcMFwxM1w1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcNlw1N1wxXDBcMTFcNTdcMVwzNjFcMVw1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1wzNVwwXDFcMzYyXDEzXDBcMVwzNjJcNDRcMCIrCi0gICAgIlwyXDM2M1w2M1wwXDJcMzY0XDc1XDBcMVwzNjVcMTNcMFwxXDM2NVw0NFwwIisKLSAgICAiXDJcMzY2XDQxXDBcMlwzNjdcMVwwXDNcMzY3XDJcMFwxXDI1NFw0XDM2NyIrCi0gICAgIlwxXDBcMTBcMzY3XDFcMFwzMlwzNjdcMlwwXDFcMzY3XDNcMFwyXDM3MCIrCi0gICAgIlwxXDBcM1wzNzBcMlwwXDFcMzAwXDRcMzcwXDFcMFwxMFwzNzBcMVwwIisKLSAgICAiXDMyXDM3MFwyXDBcMVwzNzBcMlwxNTNcMVwwXDI3XDE1M1wxXDM3MVwzNFwxNTMiKwotICAgICJcM1wwXDJcMzcyXDFcMFwzXDM3MlwyXDBcMVwzMTNcNFwzNzJcMVwwIisKLSAgICAiXDEwXDM3MlwxXDBcMzJcMzcyXDJcMFwxXDM3MlwyXDE2MlwxXDBcMjdcMTYyIisKLSAgICAiXDFcMzczXDM0XDE2MlwzM1wwXDFcMzc0XDExNFwwXDFcMzU1XDIyXDBcMVwzNTciKwotICAgICJcMTRcMFwzXDM1N1wyXDBcMVwzNTdcMTBcMFwxXDM1N1wxXDBcMlwzNTciKwotICAgICJcM1wwXDFcMzU3XDFcMFwxXDM1NlwyXDM1N1wxMVwwXDNcNTdcNFwwIisKLSAgICAiXDFcNTdcNVwwXDZcNTdcMVwwXDdcNTdcMVwzNzVcM1w1N1wxXDAiKwotICAgICJcN1w1N1wxXDBcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDAiKwotICAgICJcMVw1N1w1XDBcNlw1N1wxXDBcNlw1N1wxXDM3Nlw0XDU3XDFcMCIrCi0gICAgIlw3XDU3XDFcMFwzXDU3XDFcMFw1XDU3XDQ2XDBcMVwzNzdcNVwwIisKLSAgICAiXDFcMzc3XDU0XDBcMVx1MDEwMFw2M1wwXDFcdTAxMDFcMTBcMFwxXHUwMTAxXDU1XDAiKwotICAgICJcMVx1MDEwMlwxMFwwXDFcdTAxMDJcNjBcMFwxXHUwMTAzXDI0XDBcMlwxNTNcMVwwIisKLSAgICAiXDMwXDE1M1wxXHUwMTA0XDMzXDE1M1wyXDE2MlwxXDBcMzBcMTYyXDFcdTAxMDVcMzNcMTYyIisKLSAgICAiXDM0XDBcMVx1MDEwNlw0MFwwXDNcNTdcNFwwXDFcNTdcNVwwXDZcNTciKwotICAgICJcMVwwXDEzXDU3XDFcMFwzXDU3XDFcdTAxMDdcM1w1N1wxXDBcM1w1NyIrCi0gICAgIlwxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDBcNlw1NyIrCi0gICAgIlwxXDBcM1w1N1wxXHUwMTA4XDdcNTdcMVwwXDNcNTdcMVx1MDEwOFwzXDU3IisKLSAgICAiXDFcMFwzXDU3XDFcMFw1XDU3XDQ3XDBcMVx1MDEwOVw2MFwwXDFcdTAxMGEiKwotICAgICJcMTRcMFwxXHUwMTBhXDU0XDBcMVx1MDEwYlw0N1wwXDJcdTAxMGNcNzJcMFwxXHUwMTBkIisKLSAgICAiXDMwXDBcMVx1MDEwZFwzXDBcMlwxNTNcMVwwXDMxXDE1M1wxXHUwMTBlXDMyXDE1MyIrCi0gICAgIlwyXDE2MlwxXDBcMzFcMTYyXDFcdTAxMGZcMzJcMTYyXDM1XDBcMVx1MDExMFwzN1wwIisKLSAgICAiXDNcNTdcNFwwXDFcNTdcNVwwXDZcNTdcMVwwXDEzXDU3XDFcMCIrCi0gICAgIlw2XDU3XDFcdTAxMTFcMVwwXDNcNTdcMVwwXDVcNTdcNVwwXDFcdTAxMTIiKwotICAgICJcM1w1N1wzXDBcMVx1MDExMlwxXDU3XDRcMFwxXHUwMTEyXDZcNTdcMVwwIisKLSAgICAiXDEzXDU3XDFcMFw3XDU3XDFcMFwzXDU3XDFcMFw1XDU3XDM3XDAiKwotICAgICJcMVx1MDExM1wxMFwwXDFcdTAxMTNcNTNcMFwxXHUwMTE0XDEzXDBcMVx1MDExNFw1MlwwIisKLSAgICAiXDFcdTAxMTVcMTNcMFwxXHUwMTE1XDE1XDBcMlwxNTNcMVwwXDMyXDE1M1wxXHUwMTE2IisKLSAgICAiXDMxXDE1M1wyXDE2MlwxXDBcMzJcMTYyXDFcdTAxMTdcMzFcMTYyXDM0XDBcMVx1MDExOCIrCi0gICAgIlw0MFwwXDNcNTdcNFwwXDFcNTdcNVwwXDVcNTdcMVx1MDExOVwxXDAiKwotICAgICJcMTNcNTdcMVwwXDdcNTdcMVwwXDNcNTdcMVwwXDVcNTdcNVwwIisKLSAgICAiXDFcdTAxMTJcNlwwXDFcdTAxMTJcNVwwXDFcdTAxMTJcNDRcMFwyXDE1M1wxXDAiKwotICAgICJcMzFcMTUzXDFcdTAxMWFcMzJcMTUzXDJcMTYyXDFcMFwzMVwxNjJcMVx1MDExYlwzMlwxNjIiKwotICAgICJcMzFcMFwxXHUwMTFjXDQzXDBcM1w1N1w0XDBcMVw1N1w1XDBcNlw1NyIrCi0gICAgIlwxXDBcNVw1N1wxXHUwMTFkXDVcNTdcMVwwXDdcNTdcMVwwXDNcNTciKwotICAgICJcMVwwXDVcNTdcMlwxNTNcMVwwXDI2XDE1M1wxXHUwMTFlXDM1XDE1M1wyXDE2MiIrCi0gICAgIlwxXDBcMjZcMTYyXDFcdTAxMWZcMzVcMTYyXDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFw2XDU3XDFcMFw3XDU3XDFcdTAxMjBcM1w1N1wxXDBcN1w1NyIrCi0gICAgIlwxXDBcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1NyIrCi0gICAgIlw1XDBcNlw1N1wxXDBcMTNcNTdcMVwwXDdcNTdcMVwwXDNcNTciKwotICAgICJcMVwwXDRcNTdcMVx1MDEyMVw2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcNlw1N1wxXDBcNVw1N1wxXHUwMTIyXDVcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDZcNTdcMVwwXDVcNTdcMVx1MDEyM1w1XDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw2XDU3XDFcMFwxM1w1N1wxXDBcM1w1N1wxXHUwMTI0XDNcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTciOwotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5dHJhbnMgW10gPSB5eV91bnBhY2soeXlfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgLy8gZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCS8vJE5PTi1OTFMtMSQKLSAgfTsKLQotICAvKioKLSAgICogWVlfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBZWV9BVFRSSUJVVEVbXSA9IHsKLSAgICAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgMSwgIDksICAxLCAgMSwgIDksICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDksICA5LCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsIAotICAgICA5LCAgMSwgIDEsICAxLCAgOSwgIDksICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDksICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAwLCAgMSwgIDAsIAotICAgICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgIDAsICAwLCAgMSwgCi0gICAgIDEsICA5LCAgMCwgIDAsICA5LCAgOSwgIDksICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICAxLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgOSwgIDAsICAxLCAgOSwgIDAsICAxLCAKLSAgICAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDAsICAwLCAgOSwgIDksICAxLCAgMSwgIDAsIAotICAgICAxLCAgMSwgIDksICA5LCAgOSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMQotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgLy9wcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgLy8gcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy8gcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGludCBmVG9rZW5Db3VudCA9IDA7Ci0gCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZwotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsKLQotCS8vIHN0YXRlIHN0YWNrIGZvciBoYW5kbGluZyBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOwotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MKLQlwcml2YXRlIGludCBmT2Zmc2V0ID0gMDsKLQkKLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2VycwotCXByaXZhdGUgTGlzdCBmQmxvY2tNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZwotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsKLQotCXByaXZhdGUgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5KCk7Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICovCi1wdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpCi0JCXJldHVybjsKLQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgewotCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLQkJCQlibG9ja3MucmVtb3ZlKCk7Ci0JCX0KLQl9Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoKSB7Ci0JcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgewotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgewotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7Ci0JcmV0dXJuIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KFN0cmluZyBuYW1lKSB7Ci0JSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7Ci0JfQotCXJldHVybiBCTE9DS19URVhUOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQlyZXR1cm4gZkJsb2NrTWFya2VyczsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQlyZXR1cm4gZk9mZnNldCArIHl5Y2hhcjsKLX0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgewotCXJldHVybiBpc0Jsb2NrTWFya2VyKGZDdXJyZW50VGFnTmFtZSk7Ci19Ci1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCWlmICghZklzQmxvY2tpbmdFbmFibGVkKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQotICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuCi0gKgotICogRXhhbXBsZTogCi0gKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7Ci0gKgl0b2tlci5zZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoZmFsc2UpOwotICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOwotICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOwotICoJdG9rZXIuZ2V0UmVnaW9ucygpOyAKLSAqCi0gKiBSZXR1cm5zOgotICoJQkxPQ0tfVEVYVDogMC00MAotICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDIKLSAqCVhNTF9UQUdfTkFNRTogNDMtNDgKLSAqCVhNTF9UQUdfQ0xPU0U6IDQ5LTQ5Ci0gKglYTUxfQ09OVEVOVDogNTAtNTcKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7Ci0JeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JZkN1cnJlbnRUYWdOYW1lID0gbmV3VGFnTmFtZTsKLX0KLS8qKgotICogTWV0aG9kIGRvU2Nhbi4KLSAqIAotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3IKLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nCi0gKiAKLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSIKLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nCi0gKiBAcGFyYW0gY29udGV4dCAtIHRoZSBjb250ZXh0IG9mIHRoZSBzY2FubmVkIHJlZ2lvbiBpZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQotICogQHJldHVybiBTdHJpbmcgLSB0aGUgY29udGV4dCBmb3VuZDogdGhlIGRlc2lyZWQgY29udGV4dCBvbiBhIG5vbi16ZXJvIGxlbmd0aCBtYXRjaCwgdGhlIGFib3J0Q29udGV4dCBvbiBpbW1lZGlhdGUgc3VjY2VzcwotICogQHRocm93cyBJT0V4Y2VwdGlvbgotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb1NjYW4oU3RyaW5nIHNlYXJjaFN0cmluZywgYm9vbGVhbiByZXF1aXJlVGFpbFNlcGFyYXRvciwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOwotCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQlpbnQgbiA9IDA7Ci0JY2hhciBsYXN0Q2hlY2tDaGFyOwotCWludCBpOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCXdoaWxlIChzdGlsbFNlYXJjaGluZykgewotCQluID0gMDsKLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4KLQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQotCQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJLy8gSWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQgb3Igd2UndmUgZXhoYXVzdGVkIHRoZSBpbnB1dCwgc3RvcCBpbW1lZGlhdGVseS4KLQkJaWYgKG4gPT0gWVlFT0YpIHsKLQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzYW1lID0gdHJ1ZTsKLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8JSU+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0JCQkvLyBDaGVjayB0aGUgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHZlcnN1cyB0aGUgbGFzdCB0YXJnZXRMZW5ndGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGJ1ZmZlcgotCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzCi0JCQkKLQkJCS8vIHNhZmV0eSBjaGVjayBmb3IgYXJyYXkgYWNjZXNzZXMgKHl5X2N1cnJlbnRQb3MgaXMgdGhlICpsYXN0KiBjaGFyYWN0ZXIgd2UgY2FuIGNoZWNrIGFnYWluc3QpCi0JCQlpZih5eV9jdXJyZW50UG9zID49IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIDw9IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgewotCQkJCQlpZihzYW1lICYmIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCXNhbWUgPSB5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09IHNlYXJjaFN0cmluZy5jaGFyQXQoaSk7Ci0JCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJc2FtZSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc2VhcmNoU3RyaW5nLmNoYXJBdChpKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gc2FmZXR5IGNoZWNrIGZhaWxlZDsgbm8gbWF0Y2ggaXMgcG9zc2libGUgcmlnaHQgbm93Ci0JCQllbHNlIHsKLQkJCQlzYW1lID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaAotCQkJCS8vICI8L3NjcmlwdFMiCi0JCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsKLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIgotCQkJCWlmKGxhc3RDaGVja0NoYXIgPT0gJz4nIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGFzdENoZWNrQ2hhcikpCi0JCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7Ci0JCS8vIFdlJ3ZlIHN0b3BwZWQgc2hvcnQgb2YgdGhlIGVuZCBvciBkZWZpbml0ZWx5IGZvdW5kIGEgbWF0Y2gKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCS8vIElmIHRoZSBzZWFyY2hTdHJpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCXl5YmVnaW4oaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci0JCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJeXlfY3VycmVudFBvcysrOwotCX0KLQl5eWJlZ2luKGV4aXRTdGF0ZSk7Ci0JLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkKLQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBBIGdlbmVyaWMgbG9va2FoZWFkLWxpa2Ugb3BlcmF0aW9uCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tTY2FuKFN0cmluZyB0YXJnZXQsIFN0cmluZyB0YXJnZXRDb250ZXh0LCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyZXR1cm4gZG9TY2FuKHRhcmdldCwgZmFsc2UsIHRhcmdldENvbnRleHQsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tUYWdTY2FuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsKLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kCi0gKgotICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpCi0gKiBtZXRob2QgaW50byBhIGZ1bGwgSVRleHRSZWdpb24gYnkgcHVsbGluZyBpbiB2YWx1ZXMgZm9yIHRoZQotICogY3VycmVudCBvZmZzZXQgd2l0aGluIHRoZSBzY2FubmluZyB0ZXh0LgotICoKLSAqIFJldHVybnMgbnVsbCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBhbmQgYXR0YWNoZXMgaW50ZXJtaXR0ZW50bHkKLSAqIGRpc2NvdmVyZWQgd2hpdGVzcGFjZSBvbnRvIHRoZSBlbmQgb2YgdXNlZnVsIHJlZ2lvbnMuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGNhY2hlcyB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQKLSAqIHNvIHRoYXQgd2hpdGVzcGFjZSBjYW4gYmUgY29sbGFwc2VkLgotICovCi1wdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLyBsb2FkIHRoZSBzdGFydGluZyBub24td2hpdGVzcGFjZSB0b2tlbiAoYXNzdW1lIHRoYXQgaXQgaXMgc28pCi0JaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsKLQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0JCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCWlmIChjb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCWVsc2UKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJc3RhcnQgPSB5eWNoYXI7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQlpZiAoeXlfYXRFT0YpIHsKLQkJCWZUb2tlbkNvdW50Kys7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbgotCWZfY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQlpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCWVsc2UKLQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JfQotCWVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQl9Ci0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JfQotCWZCdWZmZXJlZENvbnRleHQgPSBmX2NvbnRleHQ7Ci0JZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgewotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCWxlbmd0aCArPSBmQnVmZmVyZWRMZW5ndGg7Ci0JfQotCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJLy8gRU9GCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlmVG9rZW5Db3VudCsrOwotCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoKXsKLQlzdXBlcigpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7Ci0JCXRoaXMobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIDApOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsKLQlyZXNldChpbiwgMCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kICoKLSAqCi0gKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMKLSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuCi0gKgotICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUKLSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMKLSAqIGFkZGVkLiAgVGhvc2UgY29kZSBibG9ja3Mgd2VyZSB1bmRlciB0aGUgYWJvdmUgY29weXJpZ2h0LgotICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkCi0JfQotCWZPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0KLQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JeXlfcmVhZGVyID0gaW47Ci0KLQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JeXlfc3RhdGUgPSAwOwotCi0JLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCXl5X21hcmtlZFBvcyA9IDA7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCS8veXlfcHVzaGJhY2tQb3MgPSAwOwotCi0JLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JeXlfY3VycmVudFBvcyA9IDA7Ci0KLQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQl5eV9zdGFydFJlYWQgPSAwOwotCi0JLyoqIAotCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCSAqIGZyb20gaW5wdXQgCi0JICovCi0JeXlfZW5kUmVhZCA9IDA7Ci0KLQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkvL3l5bGluZSA9IDA7Ci0KLQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQl5eWNoYXIgPSAwOwotCi0JLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotCXl5X2F0RU9GID0gZmFsc2U7Ci0KLQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLQkvKiB1c2VyIHZhcnM6ICovCi0JZlRva2VuQ291bnQgPSAwOwotIAotCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQlmQnVmZmVyZWRTdGFydCA9IDE7Ci0JZkJ1ZmZlcmVkTGVuZ3RoID0gMDsKLQlmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCi0JY29udGV4dCA9IG51bGw7Ci0Jc3RhcnQgPSAwOwotCXRleHRMZW5ndGggPSAwOwotCWxlbmd0aCA9IDA7Ci19Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICovCi0JcHVibGljIEJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCkgewotCQlYTUxUb2tlbml6ZXIgbmV3SW5zdGFuY2UgPSBuZXcgWE1MVG9rZW5pemVyKCk7Ci0JCS8vIGdsb2JhbCB0YWdtYXJrZXJzIGNhbiBiZSBzaGFyZWQ7IHRoZXkgaGF2ZSBubyBzdGF0ZSBhbmQgCi0JCS8vIGFyZSBuZXZlciBkZXN0cm95ZWQgKGUuZy4gJ3JlbGVhc2UnKQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGZCbG9ja01hcmtlcnMuZ2V0KGkpOwotCQkJaWYoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkKLQkJCQluZXdJbnN0YW5jZS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7Ci0JCX0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLS8qIHVzZXIgbWV0aG9kICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuWE1MQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCS8vIFNjYW4gZm9yICctLT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcwotCS8vICAgWE1MX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoCi0JLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9YTUxfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dAotCS8vICBjb250ZXh0IGFzIHVzdWFsLgotCXJldHVybiBkb1NjYW4oIi0tPiIsIGZhbHNlLCBYTUxfQ09NTUVOVF9URVhULCBTVF9YTUxfQ09NTUVOVF9FTkQsIFNUX1hNTF9DT01NRU5UX0VORCk7Ci19Ci0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHl5X3VucGFjayhTdHJpbmcgcGFja2VkKSB7Ci0gICAgaW50IFtdIHRyYW5zID0gbmV3IGludFsxMTA1NV07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMzYzOCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHRyYW5zW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEzNzIpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICAvL3l5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLSAgICAvLyBETyBOT1QgRVhJVCB0aGUgVk0gb24gYW4gZXJyb3IKLSAgICAvLyBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShjaGFyW10gbWFya2VyVGFnTmFtZSwgaW50IG9mZnNldCwgaW50IHRhZ25hbWVMZW5ndGgpIHsKLQkJZm9yKGludCBqID0gMDsgaiA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBqKyspIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilmQmxvY2tNYXJrZXJzLmdldChqKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkubGVuZ3RoKCkgPT0gdGFnbmFtZUxlbmd0aCkgewotCQkJCWJvb2xlYW4gbWF0Y2hlc1NvRmFyID0gdHJ1ZTsKLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGFnbmFtZUxlbmd0aCAmJiBtYXRjaGVzU29GYXI7IGkrKykgewotCQkJCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpICE9IG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtYXRjaGVzU29GYXIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqCi0JICogUmV0dXJuIEFMTCBvZiB0aGUgcmVnaW9ucyBzY2FubmFibGUgd2l0aGluIHRoZSByZW1haW5pbmcgdGV4dAotCSAqIE5vdGU6IGZvciB2ZXJpZmljYXRpb24gdXNlCi0JICovCi0JcHVibGljIGZpbmFsIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCXdoaWxlKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCXRva2Vucy5hZGQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFN0YWNrT3ZlcmZsb3dFcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKyI6IGlucHV0IGNvdWxkIG5vdCBiZSB0b2tlbml6ZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRPZmZzZXQoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNpbmNlIHRoaXMgaXMgY29udmVuaWVuY2UgbWV0aG9kIGFuZCBOT1QgdGhlIHJlY29tbWVuZGVkIAotCQkJLy8gd2F5IG9mIGdldHRpbmcgdG9rZW5zLCBtYW55IGVycm9ycyBhcmUgc2ltcGx5IGhpZGRlbgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIG5vdCBoYW5kbGVkIHJldHJpZXZpbmcgcmVnaW9uczogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRva2VuczsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZHVtcChTdHJpbmcgcykgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzICsgIiAoIiArIHl5Y2hhciArICItIiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJKHl5bGVuZ3RoKCkgKyB5eWNoYXIpICsgIik6XCciICsvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1V0aWxzLmVzY2FwZSh5eXRleHQoKSkgKyAiXCciKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JLyogdXNlciBtZXRob2QgIC0gc2tlbGV0b24uc2VkICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7Ci0JCXJldHVybiB5eV9hdEVPRjsKLQl9Ci0vKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZCAqLwotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKFN0cmluZyBtYXJrZXJUYWdOYW1lKSB7Ci0JSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWJsb2Nrcy5uZXh0KCk7Ci0JCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgLy8gZG8gbm90aGluZywgdGhpcyBpcyB0aGUgZG93bnN0cmVhbSBwYXJzZXIncyBqb2IKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIHl5X3N0YXRlID0geXlfbGV4aWNhbF9zdGF0ZTsKLQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICBpbnQgeXlfbmV4dCA9IHl5dHJhbnNbIHl5X3Jvd01hcFt5eV9zdGF0ZV0gKyB5eWNtYXBbeXlfaW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHl5X25leHQgPT0gLTEpIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLSAgICAgICAgICBpbnQgeXlfYXR0cmlidXRlcyA9IFlZX0FUVFJJQlVURVt5eV9zdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID4gMCApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDgpID4gMCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgMjkxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYU0wgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMjkzOiBicmVhazsKLSAgICAgICAgY2FzZSAyODM6IAotICAgICAgICBjYXNlIDI4NTogCi0gICAgICAgIGNhc2UgMjg2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNEQVRBIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQl5eWJlZ2luKFNUX0NEQVRBX1RFWFQpOwotCXJldHVybiBYTUxfQ0RBVEFfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk0OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSAyOTU6IGJyZWFrOwotICAgICAgICBjYXNlIDI3NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDI5NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk3OiBicmVhazsKLSAgICAgICAgY2FzZSAyNjg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7Ci0gfQotICAgICAgICBjYXNlIDI5ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNOwotIH0KLSAgICAgICAgY2FzZSAyOTk6IGJyZWFrOwotICAgICAgICBjYXNlIDI2MzogCi0gICAgICAgIGNhc2UgMjczOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMwMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNoYXJSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DSEFSX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgMzAxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9DT01NRU5UKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzAyOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTU6IAotICAgICAgICBjYXNlIDIxNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMwMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGVuZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiQ0RBVEEgZW5kIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfQ0RBVEFfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMwNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfUEVfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSAzMDY6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5FbnRpdHlSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSAzMDc6IGJyZWFrOwotICAgICAgICBjYXNlIDE2MDogCi0gICAgICAgIGNhc2UgMTc0OiAKLSAgICAgICAgY2FzZSAxODI6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVDsKLSB9Ci0gICAgICAgIGNhc2UgMzA4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDg6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZW1wdHkgdGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gWE1MX0VNUFRZX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA5OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMTA6IGJyZWFrOwotICAgICAgICBjYXNlIDEzMjogCi0gICAgICAgICAgeyAKLQkJLy8gZW5kZWQgd2l0aCBub3RoaW5nIGluc2lkZQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMxMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMTI6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMDogCi0gICAgICAgICAgeyAKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX09QRU47Ci0gfQotICAgICAgICBjYXNlIDMxMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9QSSk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzE0OiBicmVhazsKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzE1OiBicmVhazsKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgIGNhc2UgMTM3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMTY6IGJyZWFrOwotICAgICAgICBjYXNlIDU2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDMxNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzE4OiBicmVhazsKLSAgICAgICAgY2FzZSA1MTogCi0gICAgICAgIGNhc2UgNTI6IAotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgICB7IAotCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQKLQlyZXR1cm4gZG9TY2FuKCI/PiIsIGZhbHNlLCBYTUxfUElfQ09OVEVOVCwgU1RfWE1MX1BJX1RBR19DTE9TRSwgU1RfWE1MX1BJX1RBR19DTE9TRSk7Ci0gfQotICAgICAgICBjYXNlIDMxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oU1RfUElfQ09OVEVOVCk7Ci0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgMzIwOiBicmVhazsKLSAgICAgICAgY2FzZSA0NjogCi0gICAgICAgIGNhc2UgNDc6IAotICAgICAgICBjYXNlIDQ4OiAKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgY2FzZSAxMzA6IAotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgIGNhc2UgMjE3OiAKLSAgICAgICAgY2FzZSAyMzk6IAotICAgICAgICBjYXNlIDI0MDogCi0gICAgICAgIGNhc2UgMjUyOiAKLSAgICAgICAgY2FzZSAyNTM6IAotICAgICAgICBjYXNlIDI2MjogCi0gICAgICAgIGNhc2UgMjcyOiAKLSAgICAgICAgY2FzZSAyODA6IAotICAgICAgICBjYXNlIDI4NDogCi0gICAgICAgIGNhc2UgMjg3OiAKLSAgICAgICAgY2FzZSAyODg6IAotICAgICAgICBjYXNlIDI4OTogCi0gICAgICAgIGNhc2UgMjkwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9QSV9XUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSAzMjI6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJMSU5FIEZFRUQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMjM6IGJyZWFrOwotICAgICAgICBjYXNlIDA6IAotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgY2FzZSAxMjI6IAotICAgICAgICBjYXNlIDEyNDogCi0gICAgICAgIGNhc2UgMjA3OiAKLSAgICAgICAgY2FzZSAyMDg6IAotICAgICAgICBjYXNlIDIzNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5YTUwgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMjU6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgY2FzZSA3MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiaW5hcHByb3ByaWF0ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzI2OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgMTA2OiAKLSAgICAgICAgY2FzZSAxMDc6IAotICAgICAgICBjYXNlIDE5MzogCi0gICAgICAgIGNhc2UgMjI5OiAKLSAgICAgICAgY2FzZSAyNDg6IAotICAgICAgICBjYXNlIDI1OTogCi0gICAgICAgIGNhc2UgMjY5OiAKLSAgICAgICAgY2FzZSAyNzc6IAotICAgICAgICBjYXNlIDI4MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzI3OiBicmVhazsKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgMTEzOiAKLSAgICAgICAgY2FzZSAxMTQ6IAotICAgICAgICBjYXNlIDIwNDogCi0gICAgICAgIGNhc2UgMjMzOiAKLSAgICAgICAgY2FzZSAyNTA6IAotICAgICAgICBjYXNlIDI2MDogCi0gICAgICAgIGNhc2UgMjcwOiAKLSAgICAgICAgY2FzZSAyNzg6IAotICAgICAgICBjYXNlIDI4MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMjg6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgIGNhc2UgODM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzI5OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgY2FzZSAzODogCi0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICBjYXNlIDQzOiAKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgIGNhc2UgNTQ6IAotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgIGNhc2UgNjQ6IAotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgY2FzZSA3NDogCi0gICAgICAgIGNhc2UgODA6IAotICAgICAgICBjYXNlIDg1OiAKLSAgICAgICAgY2FzZSA4NjogCi0gICAgICAgIGNhc2UgODc6IAotICAgICAgICBjYXNlIDg4OiAKLSAgICAgICAgY2FzZSA5MDogCi0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICBjYXNlIDkzOiAKLSAgICAgICAgY2FzZSA5ODogCi0gICAgICAgIGNhc2UgMTAzOiAKLSAgICAgICAgY2FzZSAxMTA6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFVOREVGSU5FRDsKLSB9Ci0gICAgICAgIGNhc2UgMzMwOiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkCi0JU3RyaW5nIGJsb2NrQ29udGV4dCA9IGRvQmxvY2tTY2FuKCJdXT4iLCBYTUxfQ0RBVEFfVEVYVCwgU1RfQ0RBVEFfRU5EKTsvLyROT04tTkxTLTEkCi0JaWYoYmxvY2tDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQotCQl5eWJlZ2luKFNUX0NEQVRBX0VORCk7Ci0JcmV0dXJuIGJsb2NrQ29udGV4dDsKLSB9Ci0gICAgICAgIGNhc2UgMzMxOiBicmVhazsKLSAgICAgICAgY2FzZSA2NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzMyOiBicmVhazsKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzMzOiBicmVhazsKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgIGNhc2UgNjk6IAotICAgICAgICBjYXNlIDcwOiAKLSAgICAgICAgY2FzZSAxNDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDczOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYoaXNCbG9ja01hcmtlcigpKSB7Ci0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQl9Ci0JZWxzZQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzM1OiBicmVhazsKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMzNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMzNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzM4OiBicmVhazsKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgIGNhc2UgODE6IAotICAgICAgICBjYXNlIDgyOiAKLSAgICAgICAgY2FzZSAxNTI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMzk6IGJyZWFrOwotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkZWNsYXJhdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzNDA6IGJyZWFrOwotICAgICAgICBjYXNlIDg5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHR5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDM0MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTI6IAotICAgICAgICBjYXNlIDk0OiAKLSAgICAgICAgY2FzZSA5NTogCi0gICAgICAgIGNhc2UgOTY6IAotICAgICAgICBjYXNlIDE2NjogCi0gICAgICAgIGNhc2UgMTY3OiAKLSAgICAgICAgY2FzZSAxNzA6IAotICAgICAgICBjYXNlIDE3MTogCi0gICAgICAgIGNhc2UgMjI0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0gfQotICAgICAgICBjYXNlIDM0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICBjYXNlIDk5OiAKLSAgICAgICAgY2FzZSAxMDA6IAotICAgICAgICBjYXNlIDEwMTogCi0gICAgICAgIGNhc2UgMTc4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0gfQotICAgICAgICBjYXNlIDM0MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgY2FzZSAxMDQ6IAotICAgICAgICBjYXNlIDEwNTogCi0gICAgICAgIGNhc2UgMTg2OiAKLSAgICAgICAgY2FzZSAxODc6IAotICAgICAgICBjYXNlIDE5MDogCi0gICAgICAgIGNhc2UgMTkxOiAKLSAgICAgICAgY2FzZSAyMjc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzNDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDEwODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzNDU6IGJyZWFrOwotICAgICAgICBjYXNlIDEwOTogCi0gICAgICAgIGNhc2UgMTExOiAKLSAgICAgICAgY2FzZSAxMTI6IAotICAgICAgICBjYXNlIDE5NzogCi0gICAgICAgIGNhc2UgMTk4OiAKLSAgICAgICAgY2FzZSAyMDE6IAotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgIGNhc2UgMjMxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzNDY6IGJyZWFrOwotICAgICAgICBjYXNlIDExNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDM0NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmVuZCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX0VORF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzQ4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTY6IAotICAgICAgICBjYXNlIDExNzogCi0gICAgICAgICAgeyAKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JIH0KLSAgICAgICAgY2FzZSAzNDk6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHl5X2RvX2VvZigpOwotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlRXF1YWxzUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZUVxdWFsc1JlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzZkZDQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlRXF1YWxzUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRXF1YWxzUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotCXByaXZhdGUgc2hvcnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBBdHRyaWJ1dGVFcXVhbHNSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUVxdWFsc1JlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZMZW5ndGggPSAoc2hvcnQpIGxlbmd0aDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IChzaG9ydCkgcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlTmFtZVJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVOYW1lUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYzQxNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVOYW1lUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlTmFtZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQkvLyBzcGVjaWZ5IGNvcnJlY3QgdHlwZQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQotCXB1YmxpYyBBdHRyaWJ1dGVOYW1lUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVOYW1lUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gMTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBmYWxzZTsKLQkJLy8gbm90ZTogd2UnbGwgYWx3YXlzIGhhbmRsZSBkZWxldGVzIGZyb20gdGhlc2UKLQkJLy8gcmVnaW9ucyAuLi4gaWYgaXRzIGFscmVhZHkgdGhhdCByZWdpb24sCi0JCS8vIGRlbGV0aW5nIHNvbWV0aGluZyBmcm9tIGl0IHdvbid0IGNoYW5nZSBpdHMKLQkJLy8gdHlwZS4gKHJlbWVtYmVyLCB0aGUgY2FsbGluZyBwcm9ncmFtIG5lZWRzCi0JCS8vIHRvIGluc3VyZSB3ZSBhcmUgbm90IGNhbGxlZCwgaWYgbm90IGFsbCBjb250YWluZWQKLQkJLy8gb24gb25lIHJlZ2lvbi4KLQkJaWYgKChjaGFuZ2VzID09IG51bGwpIHx8IChjaGFuZ2VzLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBkZWxldGUgY2FzZQotCQkJLy8gV2UgY2FuIG5vdCBkbyB0aGUgcXVpY2sgZGVsZXRlLCBpZgotCQkJLy8gaWYgYWxsIHRoZSB0ZXh0IGluIGEgcmVnaW9uIGlzIHRvIGJlIGRlbGV0ZWQuCi0JCQkvLyBPciwgaWYgdGhlIGRlbGV0ZSBzdGFydHMgaW4gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbi4KLQkJCS8vIEluIHRoZXNlIGNhc2VzLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkJLy8gTWlub3Igbm90ZSwgd2UgdXNlIHRleHRFbmQtc3RhcnQgc2luY2UgaXQgYWx3YXlzCi0JCQkvLyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZW5kLXN0YXJ0LiBUaGlzIG1pZ2h0Ci0JCQkvLyBjYXVzZSB1cyB0byBtaXNzIGEgZmV3IGNhc2VzIHdlIGNvdWxkIGhhdmUgaGFuZGxlZCwKLQkJCS8vIGJ1dCB3aWxsIHByZXZlbnQgdXMgZnJvbSB0cnlpbmcgdG8gaGFuZGxlIGZ1bm5pbmcgY2FzZXMKLQkJCS8vIGludm9sdmluZyB3aGl0ZXNwYWNlLgotCQkJaWYgKChmU3RhcnQgPj0gZ2V0VGV4dEVuZCgpKSB8fCAoTWF0aC5hYnMobGVuZ3RoVG9SZXBsYWNlKSA+PSBnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKSkgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgfHwgUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc0xldHRlck9yRGlnaXQodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQkvLyBUT19ET19GVVRVUkU6IGNhY2hlIHZhbHVlIG9mIGNhbkhhbmRsZUFzV2hpdGVTcGFjZSBmcm9tIGFib3ZlCi0JCQkvLyBJZiB3ZSBhcmUgaGFuZGxpbmcgYXMgd2hpdGVzcGFjZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNyZWFzZQotCQkJLy8gdGhlIHRleHQgbGVuZ3RoLCBvbmx5Ci0JCQkvLyB0aGUgdG90YWwgbGVuZ3RoIGlzIGNoYW5naW5nLgotCQkJaWYgKCFSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQl9Ci0JCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlVmFsdWVSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlVmFsdWVSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiYmJiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZVZhbHVlUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlVmFsdWVSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0JLy8gc3BlY2lmeSBjb3JyZWN0IHR5cGUKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXByaXZhdGUgaW50IGZUZXh0TGVuZ3RoOwotCi0JcHVibGljIEF0dHJpYnV0ZVZhbHVlUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHRoZSByZWdpb24gaXMgYW4gZWFzeSB0eXBlIChlLmcuIGF0dHJpYnV0ZSB2YWx1ZSksCi0JCS8vIGFuZCB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgYXJlIGFsbAotCQkvLyBhbHBoYW51bWVyaWMsIHRoZW4gbWFrZSB0aGUgY2hhbmdlIGhlcmUgbG9jYWxseS4KLQkJLy8gKFRoaXMgY2FuIG9idmlvdXNseSBiZSBtYWRlIG1vcmUgc29waGlzdGljYXRlZCBhcyB0aGUgbmVlZCBhcmlzZXMsCi0JCS8vIGJ1dCBzaG91bGQKLQkJLy8gYWx3YXlzIGZvbGxvdyB0aGlzIHBhdHRlcm4uKQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdENvbnRleHRSZWdpb246OnVwZGF0ZU1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0cmVnaW9uIHR5cGUgaXMgIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ2xsIGFsd2F5cyBoYW5kbGUgZGVsZXRlcyBmcm9tIHRoZXNlCi0JCS8vIHJlZ2lvbnMgLi4uIGlmIGl0cyBhbHJlYWR5IHRoYXQgcmVnaW9uLAotCQkvLyBkZWxldGluZyBzb21ldGhpbmcgZnJvbSBpdCB3b24ndCBjaGFuZ2UgaXRzCi0JCS8vIHR5cGUuIChyZW1lbWJlciwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBuZWVkcwotCQkvLyB0byBpbnN1cmUgd2UgYXJlIG5vdCBjYWxsZWQsIGlmIG5vdCBhbGwgY29udGFpbmVkCi0JCS8vIG9uIG9uZSByZWdpb24uCi0JCWlmICgoY2hhbmdlcyA9PSBudWxsKSB8fCAoY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVsZXRlIGNhc2UKLQkJCS8vIFdlIGNhbiBub3QgZG8gdGhlIHF1aWNrIGRlbGV0ZSwgaWYKLQkJCS8vIGlmIGFsbCB0aGUgdGV4dCBpbiBhIHJlZ2lvbiBpcyB0byBiZSBkZWxldGVkLgotCQkJLy8gT3IsIGlmIHRoZSBkZWxldGUgc3RhcnRzIGluIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24uCi0JCQkvLyBJbiB0aGVzZSBjYXNlcywgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJCS8vIE1pbm9yIG5vdGUsIHdlIHVzZSB0ZXh0RW5kLXN0YXJ0IHNpbmNlIGl0IGFsd2F5cwotCQkJLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVuZC1zdGFydC4gVGhpcyBtaWdodAotCQkJLy8gY2F1c2UgdXMgdG8gbWlzcyBhIGZldyBjYXNlcyB3ZSBjb3VsZCBoYXZlIGhhbmRsZWQsCi0JCQkvLyBidXQgd2lsbCBwcmV2ZW50IHVzIGZyb20gdHJ5aW5nIHRvIGhhbmRsZSBmdW5uaW5nIGNhc2VzCi0JCQkvLyBpbnZvbHZpbmcgd2hpdGVzcGFjZS4KLQkJCWlmICgoZlN0YXJ0ID49IGdldFRleHRFbmQoKSkgfHwgKE1hdGguYWJzKGxlbmd0aFRvUmVwbGFjZSkgPj0gZ2V0VGV4dEVuZCgpIC0gZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHx8IFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2FjaGUgdmFsdWUgb2YgY2FuSGFuZGxlQXNXaGl0ZVNwYWNlIGZyb20gYWJvdmUKLQkJCS8vIElmIHdlIGFyZSBoYW5kbGluZyBhcyB3aGl0ZXNwYWNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGluY3JlYXNlCi0JCQkvLyB0aGUgdGV4dCBsZW5ndGgsIG9ubHkKLQkJCS8vIHRoZSB0b3RhbCBsZW5ndGggaXMgY2hhbmdpbmcuCi0JCQlpZiAoIVJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJZlRleHRMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCX0KLQkJCS8vIHVwZGF0ZSBsZW5ndGggKGFuZCBlbmQpIGFmdGVyIGFib3ZlIGNoZWNrIGZvciB3aGl0ZSBzcGFjZSwKLQkJCS8vIHNpbmNlCi0JCQkvLyBpdCBsb29rcyB0byBkZXRlcm1pbmUgaWYgYXQgZW5kIG9mIHJlZ2lvbi4KLQkJCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQocGFyZW50LmdldFBhcmVudERvY3VtZW50KCksIHJlcXVlc3RlciwgcGFyZW50LCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0VtcHR5VGFnQ2xvc2VSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvRW1wdHlUYWdDbG9zZVJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzlkNjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvRW1wdHlUYWdDbG9zZVJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBFbXB0eVRhZ0Nsb3NlUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXByaXZhdGUgaW50IGZMZW5ndGggPSAyOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAyOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRTsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBFbXB0eVRhZ0Nsb3NlUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBFbXB0eVRhZ0Nsb3NlUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JCWlmIChmVGV4dExlbmd0aCAhPSB0ZXh0TGVuZ3RoKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgZm9yIHRoaXMgcmVnaW9uIHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9FbmRUYWdPcGVuUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0VuZFRhZ09wZW5SZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkNTU0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0VuZFRhZ09wZW5SZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIEVuZFRhZ09wZW5SZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOOwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAyOwotCi0KLQlwdWJsaWMgRW5kVGFnT3BlblJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRW5kVGFnT3BlblJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWlmIChmVGV4dExlbmd0aCAhPSB0ZXh0TGVuZ3RoKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgZm9yIHRoaXMgcmVnaW9uIHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBFbmRUYWdPcGVuUmVnaW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotLy8JCWZUZXh0TGVuZ3RoICs9IDE7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotLy8JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvR2VuZXJpY1RlbXBsYXRlUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0dlbmVyaWNUZW1wbGF0ZVJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjA2NGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvR2VuZXJpY1RlbXBsYXRlUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkLCBpdHMganVzdCBwcmVzZW50IHRvIHNlcnZlciBhcyBhCi0gKiBnZW5lcmljIHN0YXJ0aW5nIHBvaW50IGZvciBhZGRpbmcgbmV3IHNwZWNpZmljIHJlZ2lvbiB0eXBlcy4KLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljVGVtcGxhdGVSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0JLy8gc3BlY2lmeSBjb3JyZWN0IHR5cGUKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQotCi0JcHVibGljIEdlbmVyaWNUZW1wbGF0ZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY1RlbXBsYXRlUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQlmVGV4dExlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25Ub1N0cmluZ1V0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVG9TdHJpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNzgzZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25Ub1N0cmluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgUmVnaW9uVG9TdHJpbmdVdGlsIHsKLQlzdGF0aWMgcHVibGljIFN0cmluZyB0b1N0cmluZyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHJlZ2lvbi5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHNob3J0Q2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSBzaG9ydENsYXNzTmFtZSArICItLT4gIiArIHJlZ2lvbi5nZXRUeXBlKCkgKyAiOiAiICsgcmVnaW9uLmdldFN0YXJ0KCkgKyAiLSIgKyByZWdpb24uZ2V0VGV4dEVuZCgpICsgKHJlZ2lvbi5nZXRUZXh0RW5kKCkgIT0gcmVnaW9uLmdldEVuZCgpID8gKCIvIiArIHJlZ2lvbi5nZXRFbmQoKSkgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkvLyBOT1RFOiBpZiB0aGUgZG9jdW1lbnQgaGVsZCBieSBhbnkgcmVnaW9uIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoZQotCQkvLyByZWdpb24gb2Zmc2V0cyBoYXZlIG5vdAotCQkvLyB5ZXQgYmVlbiB1cGRhdGVkLCB0aGUgb3V0cHV0IGZyb20gdGhpcyBtZXRob2QgaW52YWxpZC4KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVXBkYXRlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25VcGRhdGVSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2QwOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25VcGRhdGVSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLQotLyoqCi0gKiAKLSAqIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIHRvIGNlbnRyYWxpemUgJ3JlZ2lvbicgdXBkYXRlLiBOb3RlOiBjYXJlIG11c3QgYmUKLSAqIHRha2VuIHRoYXQgaXMgaXMgbm90IHVzZWQgZm9yIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9yIGNvbnRhaW5lcgotICogcmVnaW9ucywgaXRzIG9ubHkgZm9yICJ0b2tlbiByZWdpb25zIgotICogIAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uVXBkYXRlUnVsZSB7Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gYWxsTGV0dGVyT3JEaWdpdChTdHJpbmcgY2hhbmdlcykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkvLyBUT19ET19GVVRVUkU6IGNoZWNrIHRoYXQgYSBKYXZhIExldHRlciBvciBEaWdpdCBpcwotCQkJLy8gdGhlIHNhbWUgdGhpbmcgYXMgYW4gWE1MIGxldHRlciBvciBkaWdpdAotCQkJaWYgKCEoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjaGFuZ2VzLmNoYXJBdChpKSkpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gYWxsV2hpdGVTcGFjZShTdHJpbmcgY2hhbmdlcykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2hhbmdlcy5jaGFyQXQoaSkpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KElUZXh0UmVnaW9uIHJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBjYW5IYW5kbGVBc0xldHRlck9yRGlnaXQocmVnaW9uLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gYSBub24td2hpdGUgc3BhY2UgYXJlYQotCQlpZiAoKHJlcXVlc3RTdGFydCA8PSAocGFyZW50LmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSkpICYmIChhbGxMZXR0ZXJPckRpZ2l0KGNoYW5nZXMpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGVBc0xldHRlck9yRGlnaXQoSVRleHRSZWdpb24gcmVnaW9uLCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBNYWtlIHN1cmUgd2UgYXJlIGluIGEgbm9uLXdoaXRlIHNwYWNlIGFyZWEKLQkJaWYgKChyZXF1ZXN0U3RhcnQgPD0gKHJlZ2lvbi5nZXRUZXh0RW5kKCkpKSAmJiAoYWxsTGV0dGVyT3JEaWdpdChjaGFuZ2VzKSkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKElUZXh0UmVnaW9uIHJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIHdlIGRvbid0IGV4cGxlY3QgYSBudWxsIHBhcmVudCwgYnV0IGp1c3QgaW4gY2FzZSEKLQkJLy8gKGluIHdoaWNoIGNhc2UsIHdlIG11c3QgYmUgZGVhbGluZyB3aXRoIHJlZ2lvbnMgdGhhdCBhcmUKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykuCi0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBjYW5IYW5kbGVBc1doaXRlU3BhY2UocmVnaW9uLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIHdlIGFyZSBpbiB0aGUgIndoaXRlIHNwYWNlIiBhcmVhIG9mIGEgcmVnaW9uLCB0aGVuCi0JCS8vIHdlIGRvbid0IHdhbnQgdG8gaGFuZGxlLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkvLyB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uIGlzIGNvbnNpZGVyIGFueXdoZXJlIHRoYXQgd291bGQKLQkJLy8gbGVhdmUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoaXMgY2hhcmFjdGVyIGFuZCB0aGUgdGV4dCBwYXJ0LgotCQkvLyBhbmQgb2YgY291cnNlLCB3ZSBjYW4gaW5zZXJ0IHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSByZWdpb24KLQkJLy8KLQkJLy8gaWYgdGhlcmUgaXMgbm8gd2hpdGVzcGFjZSBpbiB0aGlzIHJlZ2lvbiwgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIKLQkJaWYgKHJlZ2lvbi5nZXRFbmQoKSA+IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHsKLQkJCS8vIG5vIG5lZWQgdG8gYWRkIG9uZSB0byBlbmQgb2YgdGV4dCwgYXMgd2UgdXNlZCB0bywgc2luY2Ugd2UKLQkJCS8vIGNoYW5nZSBkZWZpbml0aW9uIG9mIGxlbmd0aCB0byBlcXVhdGUgdG8gb2Zmc2V0IHBsdXMgb25lLgotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTg2NgotCQkJLy8gd2F0Y2ggb3V0IGZvciB3aGl0ZXNwYWNlIGF0IGVuZCBvZiB0ZXh0Ci0JCQlpZiAocmVxdWVzdFN0YXJ0ID49IHBhcmVudC5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpIHsKLQkJCQkvLyBvaywgd2UgYXJlIGluIHRoZSB3aGl0ZXNwYWNlIHJlZ2lvbiwgc28gd2UgY2FuJ3QgaGFuZGxlLAotCQkJCS8vIHVubGVzcwotCQkJCS8vIHdlIGFyZSBqdXN0IGluc2VydGluZyB3aGl0ZXNwYWNlLgotCQkJCWlmIChhbGxXaGl0ZVNwYWNlKGNoYW5nZXMpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNhbkhhbmRsZUFzV2hpdGVTcGFjZShJVGV4dFJlZ2lvbiByZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIHdlIGFyZSBpbiB0aGUgIndoaXRlIHNwYWNlIiBhcmVhIG9mIGEgcmVnaW9uLCB0aGVuCi0JCS8vIHdlIGRvbid0IHdhbnQgdG8gaGFuZGxlLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkvLyB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uIGlzIGNvbnNpZGVyIGFueXdoZXJlIHRoYXQgd291bGQKLQkJLy8gbGVhdmUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoaXMgY2hhcmFjdGVyIGFuZCB0aGUgdGV4dCBwYXJ0LgotCQkvLyBhbmQgb2YgY291cnNlLCB3ZSBjYW4gaW5zZXJ0IHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSByZWdpb24KLQkJLy8KLQkJLy8gaWYgdGhlcmUgaXMgbm8gd2hpdGVzcGFjZSBpbiB0aGlzIHJlZ2lvbiwgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIKLQkJaWYgKHJlZ2lvbi5nZXRFbmQoKSA+IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHsKLQkJCS8vIG5vIG5lZWQgdG8gYWRkIG9uZSB0byBlbmQgb2YgdGV4dCwgYXMgd2UgdXNlZCB0bywgc2luY2Ugd2UKLQkJCS8vIGNoYW5nZSBkZWZpbml0aW9uIG9mIGxlbmd0aCB0byBlcXVhdGUgdG8gb2Zmc2V0IHBsdXMgb25lLgotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTg2NgotCQkJLy8gd2F0Y2ggb3V0IGZvciB3aGl0ZXNwYWNlIGF0IGVuZCBvZiB0ZXh0Ci0JCQlpZiAocmVxdWVzdFN0YXJ0ID49IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHsKLQkJCQkvLyBvaywgd2UgYXJlIGluIHRoZSB3aGl0ZXNwYWNlIHJlZ2lvbiwgc28gd2UgY2FuJ3QgaGFuZGxlLAotCQkJCS8vIHVubGVzcwotCQkJCS8vIHdlIGFyZSBqdXN0IGluc2VydGluZyB3aGl0ZXNwYWNlLgotCQkJCWlmIChhbGxXaGl0ZVNwYWNlKGNoYW5nZXMpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gbmVlZCBhbiBhZGp1c3QgdGV4dCBsZW5ndGggQVBJIGJlZm9yZSB0aGlzIGNhbiBiZSB1c2VkCi0Jc3RhdGljIHB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVNb2RlbChJVGV4dFJlZ2lvbiByZWdpb24sIE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgcmVnaW9uLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKHJlZ2lvbi5nZXRTdGFydCgpID49IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IHJlZ2lvbi5nZXRUZXh0RW5kKCkgLSByZWdpb24uZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UocmVnaW9uLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgfHwgUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc0xldHRlck9yRGlnaXQocmVnaW9uLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQlyZWdpb24uYWRqdXN0TGVuZ3RoKGxlbmd0aERpZmZlcmVuY2UpOwotCQkJLy8gVE9fRE9fRlVUVVJFOiBjYWNoZSB2YWx1ZSBvZiBjYW5IYW5kbGVBc1doaXRlU3BhY2UgZnJvbSBhYm92ZQotCQkJLy8gSWYgd2UgYXJlIGhhbmRsaW5nIGFzIHdoaXRlc3BhY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jcmVhc2UKLQkJCS8vIHRoZSB0ZXh0IGxlbmd0aCwgb25seQotCQkJLy8gdGhlIHRvdGFsIGxlbmd0aCBpcyBjaGFuZ2luZy4KLQkJCWlmICghUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UocmVnaW9uLCBwYXJlbnQsIGNoYW5nZXMsIHJlZ2lvbi5nZXRTdGFydCgpLCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJLy8JCQkJcmVnaW9uLmFkanVzdFRleHRMZW5ndGgobGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgcmVnaW9uLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ0Nsb3NlUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ0Nsb3NlUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyN2FlNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdDbG9zZVJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBUYWdDbG9zZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRTsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBUYWdDbG9zZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGFnQ2xvc2VSZWdpb24oaW50IHN0YXJ0KSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdOYW1lUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ05hbWVSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiNTljNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ05hbWVSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgVGFnTmFtZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRTsKLQlwcml2YXRlIHNob3J0IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXByaXZhdGUgc2hvcnQgZlRleHRMZW5ndGg7Ci0KLQotCXB1YmxpYyBUYWdOYW1lUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUYWdOYW1lUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSAoc2hvcnQpIHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSAoc2hvcnQpIGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gKHNob3J0KSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gKHNob3J0KSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdPcGVuUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ09wZW5SZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjYjg1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ09wZW5SZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgVGFnT3BlblJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTjsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZUZXh0TGVuZ3RoID0gMTsKLQotCi0JcHVibGljIFRhZ09wZW5SZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRhZ09wZW5SZWdpb24oaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQl0aGlzKHN0YXJ0LCBsZW5ndGgpOwotCQlpZiAoZlRleHRMZW5ndGggIT0gdGV4dExlbmd0aCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgVGFnT3BlblJlZ2lvbihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLS8vCQlmVGV4dExlbmd0aCArPSAxOwotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBmb3IgdGhpcyByZWdpb24gdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvV2hpdGVTcGFjZU9ubHlSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvV2hpdGVTcGFjZU9ubHlSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwYmNjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1doaXRlU3BhY2VPbmx5UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFdoaXRlU3BhY2VPbmx5UmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAwOwotCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRTsKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGg7Ci0JcHJvdGVjdGVkIGludCBmU3RhcnQ7Ci0KLQlwdWJsaWMgV2hpdGVTcGFjZU9ubHlSZWdpb24oaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgcG9zaXRpb24pIHsKLQotCQlyZXR1cm4gZlN0YXJ0IDw9IHBvc2l0aW9uICYmIHBvc2l0aW9uIDwgZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0TGVuZ3RoKHNob3J0IGkpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgY2FsbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGNhbGwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogRm9yIHRoaXMgSVRleHRSZWdpb24gdHlwZSwgdGhlIHN0YXJ0IG11c3QgaW4gdGVybXMgb2Ygd2hhdCB0aGUgcmVnaW9uCi0JICogZXhwZWN0cyAuLi4gdGhhdCBpcywgaXRzIG5vdCBkb2N1bWVudCBvZmZzZXQsIGJ1dCBzdGFydCByZWxhdGl2ZSB0bwotCSAqIHdoYXQgZXZlciBjb250YWlucyBpdC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBpZiB0aGUgcmVnaW9uIGlzIGFuIGVhc3kgdHlwZSAoZS5nLiBhdHRyaWJ1dGUgdmFsdWUpLAotCQkvLyBhbmQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIGFyZSBhbGwKLQkJLy8gYWxwaGFudW1lcmljLCB0aGVuIG1ha2UgdGhlIGNoYW5nZSBoZXJlIGxvY2FsbHkuCi0JCS8vIChUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzLAotCQkvLyBidXQgc2hvdWxkCi0JCS8vIGFsd2F5cyBmb2xsb3cgdGhpcyBwYXR0ZXJuLikKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRDb250ZXh0UmVnaW9uOjp1cGRhdGVNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdHJlZ2lvbiB0eXBlIGlzICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKGZTdGFydCA+PSBnZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IGdldFRleHRFbmQoKSAtIGdldFN0YXJ0KCkpKSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCi0JCX0KLQkJUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQotCQkJcmVzdWx0ID0gbmV3IFJlZ2lvbkNoYW5nZWRFdmVudChwYXJlbnQuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBwYXJlbnQsIHRoaXMsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTENEYXRhVGV4dFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxDRGF0YVRleHRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkYTk4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTENEYXRhVGV4dFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTENEYXRhVGV4dFJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUOwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXByaXZhdGUgaW50IGZUZXh0TGVuZ3RoOwotCi0KLQlwdWJsaWMgWE1MQ0RhdGFUZXh0UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBYTUxDRGF0YVRleHRSZWdpb24oaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dExlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkvLyBUT0RPOiBzaG91bGRuJ3QgY2RhdGEgYmUgbGlrZSBYTUwgQ29udGVudCAuLi4gbGVuZ3RoIGFuZCB0ZXh0Ci0JCS8vIGxlbmd0aAotCQkvLyBhbHdheXMgYmUgdGhlIHNhbWUsIHJlZ2FyZGxlc3Mgb2Ygd2hpdGVzcGFjZT8KLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gVE9ETzogdGhpcyBpcyBhIHByZXR0eSBsYW1lIG1ldGhvZCwgc2luY2UgWE1MIENEYXRhIHJlZ2lvbiBjYW4gaGF2ZQotCQkvLyBhIG11Y2gKLQkJLy8gYmV0dGVyIHJ1bGUgZm9yIHJlZ2lvbiB1cGRhdGUsIGJ1dCB0aGlzIGlzIHdoYXQgcHJldmlvdXMKLQkJLy8gKHVuZmFjdG9yZWQpCi0JCS8vIHZlcnNpb24gaGFkLCBzbyBJJ2xsIGNhcnJ5IGl0IG92ZXIsIG9mIG5vdy4KLQkJUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHRoZSByZWdpb24gaXMgYW4gZWFzeSB0eXBlIChlLmcuIGF0dHJpYnV0ZSB2YWx1ZSksCi0JCS8vIGFuZCB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgYXJlIGFsbAotCQkvLyBhbHBoYW51bWVyaWMsIHRoZW4gbWFrZSB0aGUgY2hhbmdlIGhlcmUgbG9jYWxseS4KLQkJLy8gKFRoaXMgY2FuIG9idmlvdXNseSBiZSBtYWRlIG1vcmUgc29waGlzdGljYXRlZCBhcyB0aGUgbmVlZCBhcmlzZXMsCi0JCS8vIGJ1dCBzaG91bGQKLQkJLy8gYWx3YXlzIGZvbGxvdyB0aGlzIHBhdHRlcm4uKQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdENvbnRleHRSZWdpb246OnVwZGF0ZU1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0cmVnaW9uIHR5cGUgaXMgIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ2xsIGFsd2F5cyBoYW5kbGUgZGVsZXRlcyBmcm9tIHRoZXNlCi0JCS8vIHJlZ2lvbnMgLi4uIGlmIGl0cyBhbHJlYWR5IHRoYXQgcmVnaW9uLAotCQkvLyBkZWxldGluZyBzb21ldGhpbmcgZnJvbSBpdCB3b24ndCBjaGFuZ2UgaXRzCi0JCS8vIHR5cGUuIChyZW1lbWJlciwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBuZWVkcwotCQkvLyB0byBpbnN1cmUgd2UgYXJlIG5vdCBjYWxsZWQsIGlmIG5vdCBhbGwgY29udGFpbmVkCi0JCS8vIG9uIG9uZSByZWdpb24uCi0JCWlmICgoY2hhbmdlcyA9PSBudWxsKSB8fCAoY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVsZXRlIGNhc2UKLQkJCS8vIFdlIGNhbiBub3QgZG8gdGhlIHF1aWNrIGRlbGV0ZSwgaWYKLQkJCS8vIGlmIGFsbCB0aGUgdGV4dCBpbiBhIHJlZ2lvbiBpcyB0byBiZSBkZWxldGVkLgotCQkJLy8gT3IsIGlmIHRoZSBkZWxldGUgc3RhcnRzIGluIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24uCi0JCQkvLyBJbiB0aGVzZSBjYXNlcywgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJCS8vIE1pbm9yIG5vdGUsIHdlIHVzZSB0ZXh0RW5kLXN0YXJ0IHNpbmNlIGl0IGFsd2F5cwotCQkJLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVuZC1zdGFydC4gVGhpcyBtaWdodAotCQkJLy8gY2F1c2UgdXMgdG8gbWlzcyBhIGZldyBjYXNlcyB3ZSBjb3VsZCBoYXZlIGhhbmRsZWQsCi0JCQkvLyBidXQgd2lsbCBwcmV2ZW50IHVzIGZyb20gdHJ5aW5nIHRvIGhhbmRsZSBmdW5uaW5nIGNhc2VzCi0JCQkvLyBpbnZvbHZpbmcgd2hpdGVzcGFjZS4KLQkJCWlmICgoZlN0YXJ0ID49IGdldFRleHRFbmQoKSkgfHwgKE1hdGguYWJzKGxlbmd0aFRvUmVwbGFjZSkgPj0gZ2V0VGV4dEVuZCgpIC0gZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHx8IFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0KLQkJfQotCQlpZiAoY2FuSGFuZGxlKSB7Ci0JCQkvLyBhdCB0aGlzIHBvaW50LCB3ZSBzdGlsbCBoYXZlIHRoZSBvbGQgcmVnaW9uLiBXZSB3b24ndCBjcmVhdGUgYQotCQkJLy8gbmV3IGluc3RhbmNlLCB3ZSdsbCBqdXN0IHVwZGF0ZSB0aGUgb25lIHdlIGhhdmUsIGJ5IGNoYW5naW5nCi0JCQkvLyBpdHMgZW5kIHBvc3Rpb24sCi0JCQkvLyBUaGUgcGFyZW50IGZsYXRub2RlLCB1cG9uIHJldHVybiwgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IgdXBkYXRpbmcgc2libGluZyByZWdpb25zLgotCQkJLy8gYW5kIGluIHR1cm4sIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXRzZWxmIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yCi0JCQkvLyB1cGRhdGluZyB0aGUgdGV4dCBzdG9yZSBhbmQgZG93biBzdHJlYW0gZmxhdG5vZGVzLgotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2UgaGFuZGxlZCBieSByZWdpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSBVdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShjaGFuZ2VzLCBsZW5ndGhUb1JlcGxhY2UpOwotCQkJLy8gTm90ZTogd2UgYWRqdXN0IGJvdGggZW5kIGFuZCB0ZXh0IGVuZCwgYmVjYXVzZSBmb3IgYW55IGNoYW5nZQotCQkJLy8gdGhhdCBpcyBpbiBvbmx5IHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHJlZ2lvbiwgd2Ugc2hvdWxkIG5vdAotCQkJLy8gZG8gYSBxdWljayBjaGFuZ2UsCi0JCQkvLyBzbyAnY2FuSGFuZGxlJyBzaG91bGQgaGF2ZSBiZWVuIGZhbHNlIGZvciB0aG9zZSBjYXNlLgotCQkJLy8gVE9fRE9fRlVUVVJFOiBjYWNoZSB2YWx1ZSBvZiBjYW5IYW5kbGVBc1doaXRlU3BhY2UgZnJvbSBhYm92ZQotCQkJLy8gSWYgd2UgYXJlIGhhbmRsaW5nIGFzIHdoaXRlc3BhY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jcmVhc2UKLQkJCS8vIHRoZSB0ZXh0IGxlbmd0aCwgb25seQotCQkJLy8gdGhlIHRvdGFsIGxlbmd0aCBpcyBjaGFuZ2luZy4KLQkJCWlmICghUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQlmVGV4dExlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJfQotCQkJZkxlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJcmVzdWx0ID0gbmV3IFJlZ2lvbkNoYW5nZWRFdmVudChwYXJlbnQuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBwYXJlbnQsIHRoaXMsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTENvbnRlbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ29udGVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTA4OGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ29udGVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgWE1MQ29udGVudFJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UOwotCS8vIGxlbmd0aCBhbmQgdGV4dExlbmd0aCBhcmUgYWx3YXlzIHRoZSBzYW1lIGZvciBjb250ZW50IHJlZ2lvbgotCS8vcHJpdmF0ZSBpbnQgZlRleHRMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBYTUxDb250ZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBYTUxDb250ZW50UmVnaW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gVE9ETzogdGhpcyBpcyBhIHByZXR0eSBsYW1lIG1ldGhvZCwgc2luY2UgWE1MIENvbnRlbnQgY2FuIGhhdmUgYQotCQkvLyBtdWNoCi0JCS8vIGJldHRlciBydWxlIGZvciByZWdpb24gdXBkYXRlLCBidXQgdGhpcyBpcyB3aGF0IHByZXZpb3VzCi0JCS8vICh1bmZhY3RvcmVkKQotCQkvLyB2ZXJzaW9uIGhhZCwgc28gSSdsbCBjYXJyeSBpdCBvdmVyLCBvZiBub3cuCi0JCVJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgcmVnaW9uIGlzIGFuIGVhc3kgdHlwZSAoZS5nLiBhdHRyaWJ1dGUgdmFsdWUpLAotCQkvLyBhbmQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIGFyZSBhbGwKLQkJLy8gYWxwaGFudW1lcmljLCB0aGVuIG1ha2UgdGhlIGNoYW5nZSBoZXJlIGxvY2FsbHkuCi0JCS8vIChUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzLAotCQkvLyBidXQgc2hvdWxkCi0JCS8vIGFsd2F5cyBmb2xsb3cgdGhpcyBwYXR0ZXJuLikKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRDb250ZXh0UmVnaW9uOjp1cGRhdGVNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdHJlZ2lvbiB0eXBlIGlzICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKGZTdGFydCA+PSBnZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IGdldFRleHRFbmQoKSAtIGdldFN0YXJ0KCkpKSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB8fCBSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdCh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCi0JCX0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2FjaGUgdmFsdWUgb2YgY2FuSGFuZGxlQXNXaGl0ZVNwYWNlIGZyb20gYWJvdmUKLQkJCS8vIElmIHdlIGFyZSBoYW5kbGluZyBhcyB3aGl0ZXNwYWNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGluY3JlYXNlCi0JCQkvLyB0aGUgdGV4dCBsZW5ndGgsIG9ubHkKLQkJCS8vIHRoZSB0b3RhbCBsZW5ndGggaXMgY2hhbmdpbmcuCi0JCQkvLyBkb24ndCBuZWVkIGZvciBjb250ZW50IHJlZ2lvbgotCQkJLy8JCQlpZiAoIVJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIGNoYW5nZXMsCi0JCQkvLyBmU3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCS8vCQkJCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQkvLwkJCX0KLQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQocGFyZW50LmdldFBhcmVudERvY3VtZW50KCksIHJlcXVlc3RlciwgcGFyZW50LCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGRmM2VhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIFhNTEhlYWRQYXJzZXJGYWN0b3J5IHsKLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCUlUZXh0UmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCS8vCQlpZiAoY29udGV4dCA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCW5ld1JlZ2lvbiA9IG5ldyBYTUxIZWFkUGFyc2VyUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIHRleHQpOwotCQkvLwkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlclJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOTE3YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkLCBpdHMganVzdCBwcmVzZW50IHRvIHNlcnZlciBhcyBhCi0gKiBnZW5lcmljIHN0YXJ0aW5nIHBvaW50IGZvciBhZGRpbmcgbmV3IHNwZWNpZmljIHJlZ2lvbiB0eXBlcy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgWE1MSGVhZFBhcnNlclJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQkvLyBzcGVjaWZ5IGNvcnJlY3QgdHlwZQotCXByaXZhdGUgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0KLQlwdWJsaWMgWE1MSGVhZFBhcnNlclJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWE1MSGVhZFBhcnNlclJlZ2lvbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcygpOwotCQlmVHlwZSA9IGNvbnRleHQ7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dExlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JCWZUZXh0ID0gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gMTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MWY0NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqIFRoaXMgcmVnaW9uIGZhY3RvcnkgaXMgdmVyeSBzcGVjaWZpYyB0byB0aGUgcGFyc2VyIG91dHB1dCwgYW5kIHRoZSBzcGVjaWZpYwotICogaW1wbGVtZW50YXRpb24gY2xhc3NlcyBmb3IgdmFyaW91cyByZWdpb25zLgotICovCi0KLXB1YmxpYyBjbGFzcyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihJVGV4dFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHBhcmVudCwgY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKElUZXh0UmVnaW9uQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCS8vIG5ld1JlZ2lvbi5zZXRQYXJlbnQocGFyZW50KTsKLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoLCBTdHJpbmcgbGFuZywgU3RyaW5nIHN1cnJvdW5kaW5nVGFnKSB7Ci0JCUlUZXh0UmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBYTUxDRGF0YVRleHRSZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgWE1MQ29udGVudFJlZ2lvbihzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgVGFnTmFtZVJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJbmV3UmVnaW9uID0gbmV3IEF0dHJpYnV0ZU5hbWVSZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJbmV3UmVnaW9uID0gbmV3IEF0dHJpYnV0ZUVxdWFsc1JlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgVGFnT3BlblJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJbmV3UmVnaW9uID0gbmV3IEVuZFRhZ09wZW5SZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBUYWdDbG9zZVJlZ2lvbihzdGFydCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBFbXB0eVRhZ0Nsb3NlUmVnaW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkgewotCQkJbmV3UmVnaW9uID0gbmV3IFdoaXRlU3BhY2VPbmx5UmVnaW9uKHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UKLQkJLy8gcmVtb3ZlZCB0aGlzIGNvbmRpdGlvbiBkdXJpbmcgdHJhbnNpdGlvbiwgYW5kIGltcGxlbWVudGVkIGluCi0JCS8vIHN1YmNsYXNzCi0JCS8vIGlmIChjb250ZXh0ID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB7Ci0JCS8vIG5ld1JlZ2lvbiA9IG5ldyBKU1BDb2RlUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQkvLyB9IGVsc2UKLQkJaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgRm9yZWlnblJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJCSgoRm9yZWlnblJlZ2lvbikgbmV3UmVnaW9uKS5zZXRTdXJyb3VuZGluZ1RhZyhzdXJyb3VuZGluZ1RhZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgQ29udGV4dFJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDUwZjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gWzIwNTk4OV0gLSBbdmFsaWRhdGlvbl0gdmFsaWRhdGUgWE1MIGFmdGVyIFhJbmNsdWRlIHJlc29sdXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgWE1MIENvcmUgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIFhNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0KLQkJLy8gZm9ybWF0dGluZyBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgsIDcyKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBmYWxzZSk7Ci0JCW5vZGUucHV0KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUiwgWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIpOwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIDEpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUywgZmFsc2UpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCwgZmFsc2UpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5QUkVTRVJWRV9DREFUQUNPTlRFTlQsIGZhbHNlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0VfQkVGT1JFX0VNUFRZX0NMT1NFX1RBRywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9DT01NRU5UX1RFWFQsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfQ09NTUVOVF9KT0lOX0xJTkVTLCB0cnVlKTsKLQkJLy8gY2xlYW51cCBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMsIGZhbHNlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRklYX1hNTF9ERUNMQVJBVElPTiwgdHJ1ZSk7Ci0KLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VULCAiVVRGLTgiKTsvLyROT04tTkxTLTEkCi0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHRoaXMgY291bGQgYmUgbWFkZSBzbWFydGVyIGJ5IGFjdHVhbGx5IGxvb2tpbmcgdXAgdGhlIGNvbnRlbnQKLQkJLy8gdHlwZSdzIHZhbGlkIGV4dGVuc2lvbnMKLQkJbm9kZS5wdXQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTiwgInhtbCIpOyAvLyROT04tTkxTLTEkCi0KLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0FSTl9OT19HUkFNTUFSLCB0cnVlKTsKLQkJLy8gMSA9IElNYXJrZXIuU0VWRVJJVFlfV0FSTklORwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklORElDQVRFX05PX0dSQU1NQVIsIDEpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VU0VfWElOQ0xVREUsIGZhbHNlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ01ET0NVTUVOVF9HTE9CQUxfQ0FDSEVfRU5BQkxFRCwgdHJ1ZSk7Ci0JCQotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NQVJLVVBfVkFMSURBVElPTiwgZmFsc2UpOwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9IQVNfTk9fVkFMVUUsIDIpOwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVORF9UQUdfV0lUSF9BVFRSSUJVVEVTLCAyKTsKLQkJbm9kZS5wdXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX1NUQVJUX1RBRywgMik7Ci0JCW5vZGUucHV0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUlTU0lOR19FTkRfVEFHLCAyKTsKLQkJbm9kZS5wdXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX1RBR19OQU1FLCAyKTsKLQkJbm9kZS5wdXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX1FVT1RFUywgMik7Ci0JCW5vZGUucHV0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUlTU0lOR19DTE9TSU5HX0JSQUNLRVQsIDIpOwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLk1JU1NJTkdfQ0xPU0lOR19RVU9URSwgMik7Ci0JCW5vZGUucHV0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTkFNRVNQQUNFX0lOX1BJX1RBUkdFVCwgMik7Ci0JCW5vZGUucHV0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0hJVEVTUEFDRV9BVF9TVEFSVCwgMik7Ci0JCW5vZGUucHV0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0hJVEVTUEFDRV9CRUZPUkVfVEFHTkFNRSwgMik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBmNTk3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBbMjA1OTg5XSAtIFt2YWxpZGF0aW9uXSB2YWxpZGF0ZSBYTUwgYWZ0ZXIgWEluY2x1ZGUgcmVzb2x1dGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0KLS8qKgotICogQ29tbW9uIHByZWZlcmVuY2Uga2V5cyB1c2VkIGJ5IFhNTCBjb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29yZVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBYTUxDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4dGVuc2lvbiB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZCBpbiB0aGUgTmV3IEZpbGUKLQkgKiBXaXphcmQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYVEVOU0lPTiA9ICJkZWZhdWx0RXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBUaGUgbWF4aW11bSB3aWR0aCBvZiBhIGxpbmUgYmVmb3JlIGEgbGluZSBzcGxpdCBpcyBuZWVkZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9XSURUSCA9ICJsaW5lV2lkdGgiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBhbGwgYmxhbmtzIGxpbmVzIHNob3VsZCBiZSBjbGVhcmVkIGR1cmluZyBmb3JtYXR0aW5nLgotCSAqIEJsYW5rIGxpbmVzIHdpbGwgYmUga2VwdCB3aGVuIGZhbHNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSX0FMTF9CTEFOS19MSU5FUyA9ICJjbGVhckFsbEJsYW5rTGluZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgI0lOREVOVEFUSU9OX0NIQVIgZm9yIDEgaW5kZW50YXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UQVRJT05fU0laRSA9ICJpbmRlbnRhdGlvblNpemUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjaGFyYWN0ZXIgdXNlZCBmb3IgaW5kZW50YXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge1RBQiwgU1BBQ0V9Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVEFUSU9OX0NIQVIgPSAiaW5kZW50YXRpb25DaGFyIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI0lOREVOVEFUSU9OX0NIQVIuIEluZGljYXRlcyB0byB1c2UKLQkgKiB0YWIgY2hhcmFjdGVyIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAc2VlICNTUEFDRQotCSAqIEBzZWUgI0lOREVOVEFUSU9OX0NIQVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUIgPSAidGFiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNJTkRFTlRBVElPTl9DSEFSLiBJbmRpY2F0ZXMgdG8gdXNlCi0JICogc3BhY2UgY2hhcmFjdGVyIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAc2VlICNUQUIKLQkgKiBAc2VlICNJTkRFTlRBVElPTl9DSEFSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAic3BhY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGFncyB3aXRoIG11bHRpcGxlIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZAotCSAqIChzcGxpdHRpbmcgZWFjaCBhdHRyIG9uIGEgbmV3IGxpbmUpLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQTElUX01VTFRJX0FUVFJTID0gInNwbGl0TXVsdGlBdHRycyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGNsZWFudXAgcHJvY2Vzc29yIHNob3VsZCBmb3JtYXQgc291cmNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9TT1VSQ0UgPSAiZm9ybWF0U291cmNlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZW1wdHkgZWxlbWVudHMgc2hvdWxkIGJlIGNvbXByZXNzZWQgZHVyaW5nCi0JICogY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MgPSAiY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gaW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX1JFUVVJUkVEX0FUVFJTID0gImluc2VydFJlcXVpcmVkQXR0cnMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnNlcnQgbWlzc2luZyB0YWdzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9NSVNTSU5HX1RBR1MgPSAiaW5zZXJ0TWlzc2luZ1RhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBxdW90ZSBhbGwgYXR0cmlidXRlIHZhbHVlcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9URV9BVFRSX1ZBTFVFUyA9ICJxdW90ZUF0dHJWYWx1ZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnNlcnQgbWlzc2luZyBYTUwgZGVjbGFyYXRpb25zIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklYX1hNTF9ERUNMQVJBVElPTiA9ICJmaXhYTUxEZWNsYXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBjb252ZXJ0IGFsbCBsaW5lIGRlbGltaXRlcnMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogQGRlcHJlY2F0ZWQgLSBubyBsb25nZXIgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRfRU9MX0NPREVTID0gImNvbnZlcnRFT0xDb2RlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBsaW5lIGRlbGltaXRlciB0byB1c2UgZHVyaW5nIGNsZWFudXAgaWYgY29udmVydGluZyBsaW5lCi0JICogZGVsaW1pdGVycy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7Q1IsIENSTEYsIExGLCBOT19UUkFOU0xBVElPTn0KLQkgKiA8L3A+Ci0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9FT0xfQ09ERSA9ICJjbGVhbnVwRU9MQ29kZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGEgd2FybmluZyBzaG91bGQgYmUgcHJvZHVjZWQgd2hlbiB2YWxpZGF0aW5nIGEKLQkgKiBmaWxlIHRoYXQgc3BlY2lmaWVzIG5vdCBncmFtbWFyLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7VFJVRSwgRkFMU0V9Ci0JICogPC9wPgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTl9OT19HUkFNTUFSID0gIndhcm5Ob0dyYW1tYXIiOy8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYSBtZXNzYWdlIHNob3VsZCBiZSBwcm9kdWNlZCB3aGVuIHZhbGlkYXRpbmcgYQotCSAqIGZpbGUgdGhhdCBzcGVjaWZpZXMgbm90IGdyYW1tYXIuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5pbnRlZ2VyPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHswLCAxLCAyfSAobm9uZSwgd2FybmluZywgZXJyb3IpCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElORElDQVRFX05PX0dSQU1NQVIgPSAiaW5kaWNhdGVOb0dyYW1tYXIiOy8vJE5PTi1OTFMtMSQKLQotIAkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgeGluY2x1ZGVzIHNob3VsZCBiZSBwcm9jZXNzZWQgYmVmb3JlCi0JICogdmFsaWRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge1RSVUUsIEZBTFNFfQotCSAqIDwvcD4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfWElOQ0xVREUgPSAieGluY2x1ZGUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBhbGwgd2hpdGVzcGFjZSBpbiB0YWdzIHdpdGggQ0RBVEEgY29udGVudCBzaG91bGQgYmUKLQkgKiBwcmVzZXJ2ZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VSVkVfQ0RBVEFDT05URU5UID0gInByZXNlcnZlQ0RBVEFDb250ZW50IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgZW5kIGJyYWNrZXRzIG9mIHN0YXJ0IHRhZ3Mgc2hvdWxkIGJlIHBsYWNlZCBvbiBhIG5ldyBsaW5lCi0JICogaWYgdGhlIHN0YXJ0IHRhZyBzcGFucyBtb3JlIHRoYW4gb25lIGxpbmUuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fRU5EX0JSQUNLRVQgPSAiYWxpZ25FbmRCcmFja2V0IjsvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIGFuIGVtcHR5IGNsb3NlIHRhZyBzaG91bGQgaGF2ZSBhIHNwYWNlIGluc2VydGVkIGJlZm9yZQotCSAqIGNsb3NpbmcuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRV9CRUZPUkVfRU1QVFlfQ0xPU0VfVEFHID0gInNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZyI7Ly8kTk9OLU5MUy0xJAotCQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhbGwgc2NoZW1hIGxvY2F0aW9ucyBmb3IgWFNEIHNob3VsZCBiZSBob25vdXJlZAotICAgICAqIGR1cmluZyBYU0QgdmFsaWRhdGlvbiBvZiBYTUwuCi0gICAgICogPHA+Ci0gICAgICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi48YnIgLz4KLSAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6IHtUUlVFLCBGQUxTRX0KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TID0gImhvbm91ckFsbFNjaGVtYUxvY2F0aW9ucyI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBjb250ZW50IG9mIGNvbW1lbnRzIHNob3VsZCBiZSBmb3JtYXR0ZWQKLSAgICAgKiA8cD4KLSAgICAgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+PGJyIC8+Ci0gICAgICogUG9zc2libGUgdmFsdWVzOiB7VFJVRSwgRkFMU0V9Ci0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9DT01NRU5UX1RFWFQgPSAiZm9ybWF0Q29tbWVudFRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGxpbmVzIG9mIGNvbW1lbnRzIHNob3VsZCBiZSBqb2luZWQgd2hlbiBmb3JtYXR0aW5nCi0gICAgICogPHA+Ci0gICAgICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9DT01NRU5UX0pPSU5fTElORVMgPSAiZm9ybWF0Q29tbWVudEpvaW5MaW5lcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgQ01Eb2N1bWVudHMgc2hvdWxkIGJlIGdsb2JhbGx5IGNhY2hlZAotICAgICAqIDxwPgotICAgICAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTURPQ1VNRU5UX0dMT0JBTF9DQUNIRV9FTkFCTEVEID0gImNtRG9jdW1lbnRHbG9iYWxDYWNoZUVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IE1hcmtVcFZhbGlkYXRvciBzaG91bGQgcnVuIGFzIHBhcnQgb2YgWE1sIFZhbGlkYXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtUUlVFLCBGQUxTRX0gCi0JICogPC9wPgotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktVUF9WQUxJREFUSU9OID0gIm1hcmt1cFZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGEgbWVzc2FnZSBzaG91bGQgYmUgcHJvZHVjZWQgd2hlbiB2YWxpZGF0aW5nIGEKLQkgKiBmaWxlIHRoYXQgc3BlY2lmaWVzIGZvbGxvd2luZyBjb25kaXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5pbnRlZ2VyPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHswLCAxLCAyfSAobm9uZSwgd2FybmluZywgZXJyb3IpCi0JICogPC9wPgotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9IQVNfTk9fVkFMVUUgPSAiYXR0cmlidXRlSGFzTm9WYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfVEFHX1dJVEhfQVRUUklCVVRFUyA9ICJlbmRUYWdXaXRoQXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURVNQQUNFX0JFRk9SRV9UQUdOQU1FID0gIndoaXRlc3BhY2VCZWZvcmVUYWdOYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfQ0xPU0lOR19CUkFDS0VUID0gIm1pc3NpbmdDbG9zaW5nQnJhY2tldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX0NMT1NJTkdfUVVPVEUgPSAibWlzc2luZ0Nsb3NpbmdRdW90ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX0VORF9UQUcgPSAibWlzc2luZ0VuZFRhZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1NUQVJUX1RBRyA9ICJtaXNzaW5nU3RhcnRUYWciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19RVU9URVMgPSAibWlzc2luZ1F1b3RlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfSU5fUElfVEFSR0VUID0gIm5hbWVzcGFjZUluUElUYXJnZXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19UQUdfTkFNRSA9ICJtaXNzaW5nVGFnTmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURVNQQUNFX0FUX1NUQVJUID0gIndoaXRlc3BhY2VBdFN0YXJ0IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm9wYWdhdGUvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNzZkNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm9wYWdhdGUvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLQotLyoqCi0gKiBUaGUgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSBpcyBwYXJ0IG9mIHRoZSAiYWRhcHQgb24gY3JlYXRlIiBtZWNoYW5pc20uIEEKLSAqIFByb3BhZ2F0aW5nQWRhcHRlciwgb25jZSBhZGRlZCB0byBhIG5vZGUsIHdpbGwgY2F1c2UgcHJvYWdhdGluZyBhZGFwdGVycyB0bwotICogYmUgY3JlYXRlZCBmb3IgYWxsIGNoaWxkIG5vZGVzLiBBIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIGEKLSAqIFByb3BhZ2F0aW5nQWRhcHRlciBmb3IgYSBub2RlIGlzIHRoYXQgaXMgaXMgYWxzbyBjcmVhdGVzIGFkYXB0ZXJzIGZvciBhbmQKLSAqIGFkYXB0cyB0aGUgTm9kZSBmb3IgYWxsIG90aGVyIHJlZ2lzdGVyZWQgJ2NyZWF0ZSBvbiBhZGFwdCcgQWRhcHRlcnMuIFRoaXMKLSAqIG90aGVyIGFkYXB0ZXJzIGFyZSByZWdpc3RlcmVkIGJ5IHJlZ2lzdGVyaW5nIHRoZWlyIGZhY3RvcmllcyB2aWEgcGx1Z2luCi0gKiBleHRlbnNpb24gcG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgUHJvcGFnYXRpbmdBZGFwdGVyIGZBZGFwdGVySW5zdGFuY2U7Ci0JcHJpdmF0ZSBMaXN0IGZDb250cmlidXRlZEZhY3RvcmllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCkgewotCQl0aGlzKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsgLy8gLAotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb250cmlidXRlZEZhY3RvcmllcyhJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJaWYgKGZDb250cmlidXRlZEZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQlmQ29udHJpYnV0ZWRGYWN0b3JpZXMuYWRkKGZhY3RvcnkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVBZGFwdGVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQkvLyBldmVyeSBub3RpZmllciBnZXQncyBvbmUgb2YgdGhlc2UKLQkJLy8gKGFuZCB0aGUgc2FtZSBpbnN0YW5jZSBvZiBpdCkKLQkJcmV0dXJuIGdldEFkYXB0ZXJJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXJJbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBQcm9wYWdhdGluZ0FkYXB0ZXIKLQkgKi8KLQlwcml2YXRlIFByb3BhZ2F0aW5nQWRhcHRlciBnZXRBZGFwdGVySW5zdGFuY2UoKSB7Ci0JCWlmIChmQWRhcHRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWZBZGFwdGVySW5zdGFuY2UgPSBuZXcgUHJvcGFnYXRpbmdBZGFwdGVySW1wbCgpOwotCQkJaWYgKGZDb250cmlidXRlZEZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmQ29udHJpYnV0ZWRGYWN0b3JpZXMuc2l6ZSgpOyBpKyspCi0JCQkJCWZBZGFwdGVySW5zdGFuY2UuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkoKFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkpIGZDb250cmlidXRlZEZhY3Rvcmllcy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmQWRhcHRlckluc3RhbmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIGdpdmUgdGhlIGFkYXB0ZXIgaW5zdGFuY2UgYSBjaGFuY2UgdG8gcmVsZWFzZSBpdHMgZmFjdG9yaWVzCi0JCWdldEFkYXB0ZXJJbnN0YW5jZSgpLnJlbGVhc2UoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRyaWJ1dGVkRmFjdG9yaWVzKEFycmF5TGlzdCBsaXN0KSB7Ci0JCWZDb250cmlidXRlZEZhY3RvcmllcyA9IGxpc3Q7Ci0KLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IGNsb25lZEluc3RhbmNlID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JCS8vIGNsb25lIHRoaXMgYWRhcHRlcnMgc3BlY2lmaWMgbGlzdCBvZiBhZGFwdGVyIGZhY3RvcmllcyB0b28KLQkJaWYgKGZDb250cmlidXRlZEZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkNvbnRyaWJ1dGVkRmFjdG9yaWVzLml0ZXJhdG9yKCk7Ci0JCQljbG9uZWRJbnN0YW5jZS5zZXRDb250cmlidXRlZEZhY3RvcmllcyhuZXcgQXJyYXlMaXN0KCkpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZXhpc3RpbmdGYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQljbG9uZWRJbnN0YW5jZS5hZGRDb250cmlidXRlZEZhY3RvcmllcyhleGlzdGluZ0ZhY3RvcnkuY29weSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2xvbmVkSW5zdGFuY2U7Ci0JfQotCi0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4MTU5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3BhZ2F0ZS9Qcm9wYWdhdGluZ0FkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBQcm9wYWdhdGluZ0FkYXB0ZXJJbXBsIGltcGxlbWVudHMgUHJvcGFnYXRpbmdBZGFwdGVyIHsKLQotCXByaXZhdGUgTGlzdCBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzID0gbnVsbDsKLQotCS8qKgotCSAqIEFic3RyYWN0UHJvcGFnYXRpbmdBZGFwdGVySW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBQcm9wYWdhdGluZ0FkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGFwdE9uQ3JlYXRlKElET01Ob2RlIG5vZGUpIHsKLQkJLy8gZ2l2ZSBlYWNoIG9mIHRoZSBmYWN0b3JpZXMgYSBjaGFuY2UgdG8gYWRhcHQgdGhlIG5vZGUsIGlmIGl0Ci0JCS8vIGNob29zZXMgdG8KLQkJaWYgKGFkYXB0T25DcmVhdGVGYWN0b3JpZXMgIT0gbnVsbCkgewotCi0KLQkJCXN5bmNocm9uaXplZCAoYWRhcHRPbkNyZWF0ZUZhY3RvcmllcykgewotCQkJCWludCBsZW5ndGggPSBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzLmdldChpKTsKLQkJCQkJZmFjdG9yeS5hZGFwdChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZWNoYW5pc20gY2FuIGJlIG1hZGUgImVhc2llciB0byB1c2UiIGxhdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlnZXRBZGFwdE9uQ3JlYXRlRmFjdG9yaWVzKCkuYWRkKGZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0T25DcmVhdGVGYWN0b3JpZXMoKSB7Ci0JCWlmIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzID09IG51bGwpCi0JCQlhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gYWRhcHRPbkNyZWF0ZUZhY3RvcmllczsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgUHJvcGFnYXRpbmdBZGFwdGVyI2luaXRpYWxpemVGb3JGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnksCi0JICogICAgICBJTm9kZU5vdGlmaWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGb3JGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgSU5vZGVOb3RpZmllciBub2RlKSB7Ci0JCS8vIElTU1VFOiB3ZSBhcmUgYSBET00gc3BlY2lmaWMgaW1wbGltZW50YXRpb24sIAotCQkvLyB3ZSBzaG91bGQgbm90IGJlLgotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJcHJvcGFnYXRlVG8oeG1sTm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW50ZXJlc3RpbmcoT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiAobmV3VmFsdWUgIT0gbnVsbCAmJiAobmV3VmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IG5ld1ZhbHVlIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgbmV3VmFsdWUgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gSXNzdWU6IFdlIG9ubHkgcHJvcGFnYXRlIHRvIEVsZW1lbnRzIC4uLgotCQkvLyBub3QgYXR0cmlidXRlcyB0b28hIFdlIHNob3VsZCBjYXJlZnVsIGNvbnNpZGVyIGRvbmluZyBhbGwgd2hlbgotCQkvLyB3aGVuIHdlIGltcHJvdmUgImFkYXB0IG9uIGNyZWF0ZSIgZGVzaWduLgotCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQUREICYmIGlzSW50ZXJlc3RpbmcobmV3VmFsdWUpKSB7Ci0JCQlwcm9wYWdhdGVUbygoSURPTU5vZGUpIG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9wYWdhdGVUbyhJRE9NTm9kZSBub2RlKSB7Ci0JCS8vIGdldCBhZGFwdGVyIHRvIGVuc3VyZSBpdHMgY3JlYXRlZAotCQlub2RlLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJYWRhcHRPbkNyZWF0ZShub2RlKTsKLQkJcHJvcGFnYXRlVG9DaGlsZHJlbihub2RlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvcGFnYXRlVG9DaGlsZHJlbihJRE9NTm9kZSBwYXJlbnQpIHsKLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlwcm9wYWdhdGVUbygoSURPTU5vZGUpIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgUHJvcGFnYXRpbmdBZGFwdGVyI3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzICE9IG51bGwpIHsKLQotCQkJc3luY2hyb25pemVkIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzKSB7Ci0JCQkJaW50IGxlbmd0aCA9IGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuZ2V0KGkpOwotCQkJCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MQ2hhckVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MQ2hhckVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZiNDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTENoYXJFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotCi0vKioKLSAqIFhNTCBOYW1lc3BhY2UgY29uc3RhbnRzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElYTUxDaGFyRW50aXR5IHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFNUF9OQU1FID0gImFtcCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQU1QX1JFRiA9ICImYW1wOyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQU1QX1ZBTFVFID0gIiYiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQT1NfTkFNRSA9ICJhcG9zIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBUE9TX1JFRiA9ICImYXBvczsiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQT1NfVkFMVUUgPSAiJyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR1RfTkFNRSA9ICJndCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR1RfUkVGID0gIiZndDsiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEdUX1ZBTFVFID0gIj4iOy8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTFRfTkFNRSA9ICJsdCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTFRfUkVGID0gIiZsdDsiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIExUX1ZBTFVFID0gIjwiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RfTkFNRSA9ICJxdW90IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBRVU9UX1JFRiA9ICImcXVvdDsiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RfVkFMVUUgPSAiXCIiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTE5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwODQ3ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0KLQotLyoqCi0gKiBYTUwgTmFtZXNwYWNlIGNvbnN0YW50cwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJWE1MTmFtZXNwYWNlIHsKLQotCVN0cmluZyBYTUxOUyA9ICJ4bWxucyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxOU19QUkVGSVggPSAieG1sbnM6IjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTE5TX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUwgPSAieG1sIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9QUkVGSVggPSAieG1sOiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfVVJJID0gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0OWQ0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogS2V5cyB0byB1c2UgZm9yIHByZWZlcmVuY2Ugc2V0dGluZ3MuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTFByZWZlcmVuY2VOYW1lcyB7Ci0JU3RyaW5nIENMRUFOVVBfQVRUUl9OQU1FX0NBU0UgPSAiY2xlYW51cEF0dHJOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDTEVBTlVQX0VPTF9DT0RFID0gImNsZWFudXBFT0xDb2RlIjsvLyROT04tTkxTLTEkCi0JLy8gY2xlYW51cCBwcmVmZXJlbmNlIG5hbWVzCi0JU3RyaW5nIENMRUFOVVBfVEFHX05BTUVfQ0FTRSA9ICJjbGVhbnVwVGFnTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09OVkVSVF9FT0xfQ09ERVMgPSAiY29udmVydEVPTENvZGVzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZPUk1BVF9TT1VSQ0UgPSAiZm9ybWF0U291cmNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElOU0VSVF9NSVNTSU5HX1RBR1MgPSAiaW5zZXJ0TWlzc2luZ1RhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCS8vIG90aGVycwotCVN0cmluZyBMQVNUX0FDVElWRV9QQUdFID0gImxhc3RBY3RpdmVQYWdlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFFVT1RFX0FUVFJfVkFMVUVTID0gInF1b3RlQXR0clZhbHVlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBub3QgdXNlZCBmb3Igbm93IC8vIGhpZ2hsaWdodGluZyB0eXBlcyBTdHJpbmcgQ09NTUVOVF9CT1JERVIgPQotCSAqICJjb21tZW50Qm9yZGVyIjsvLyROT04tTkxTLTEkIFN0cmluZyBDT01NRU5UX1RFWFQgPQotCSAqICJjb21tZW50VGV4dCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgQ0RBVEFfQk9SREVSID0KLQkgKiAiY2RhdGFCb3JkZXIiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIENEQVRBX1RFWFQgPQotCSAqICJjZGF0YVRleHQiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIFBJX0JPUkRFUiA9ICJwaUJvcmRlciI7Ly8kTk9OLU5MUy0xJAotCSAqIFN0cmluZyBQSV9DT05URU5UID0gInBpQ29udGVudCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgVEFHX0JPUkRFUiA9Ci0JICogInRhZ0JvcmRlciI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgVEFHX05BTUUgPSAidGFnTmFtZSI7Ly8kTk9OLU5MUy0xJAotCSAqIFN0cmluZyBUQUdfQVRUUklCVVRFX05BTUUgPSAidGFnQXR0cmlidXRlTmFtZSI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcKLQkgKiBUQUdfQVRUUklCVVRFX1ZBTFVFID0gInRhZ0F0dHJpYnV0ZVZhbHVlIjsvLyROT04tTkxTLTEkIFN0cmluZwotCSAqIERFQ0xfQk9SREVSID0gImRlY2xCb2RlciI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRE9DVFlQRV9OQU1FID0KLQkgKiAiZG9jdHlwZU5hbWUiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSUQgPQotCSAqICJkb2N0eXBlRXh0ZXJuYWxJZCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYgPQotCSAqICJkb2N0eXBlRXh0ZXJuYWxQdWJyZWYiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGID0KLQkgKiAiZG9jdHlwZUV4dHJlbmFsU3lzcmVmIjsvLyROT04tTkxTLTEkIFN0cmluZyBYTUxfQ09OVEVOVCA9Ci0JICogInhtbENvbnRlbnQiOy8vJE5PTi1OTFMtMSQgLy8gaGlnaGxpZ2h0aW5nIHByZWZlcmVuY2VzIFN0cmluZyBDT01NQSA9Ci0JICogIiwiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIENPTE9SID0gImNvbG9yIjsvLyROT04tTkxTLTEkIFN0cmluZyBOQU1FID0KLQkgKiAibmFtZSI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRk9SRUdST1VORCA9ICJmb3JlZ3JvdW5kIjsvLyROT04tTkxTLTEkCi0JICogU3RyaW5nIEJBQ0tHUk9VTkQgPSAiYmFja2dyb3VuZCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgQk9MRCA9Ci0JICogImJvbGQiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIElUQUxJQyA9ICJpdGFsaWMiOy8vJE5PTi1OTFMtMSQKLQkgKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTmFtZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9OYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NmJlYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9OYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTDEwTmFtZXM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBjb25zaXN0ZW50IHdheSB0byBwcmUtY2hlY2sgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBYTUwKLSAqIG5hbWUsIGJlZm9yZSwgZm9yIGV4YW1wbGUsIHRyeWluZyB0byBhY3R1YWxseSBjcmVhdGUgYW4gRWxlbWVudCB3aXRoIGl0LgotICogQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gRWxlbWVudCB3aXRoIGFuIGludmFsaWQgbmFtZSB3aWxsIHRocm93IHRoZSBhcHByb3ByaWF0ZQotICogRE9NIEV4Y2VwdGlvbiwgYnV0IG9mdGVuIGNsaWVudHMgd2FudCB0byBjaGVjayB0aGUgdmFsaWRpdGluZyBvZiBhIG5hbWUKLSAqIHN1Y2ggYXMgYmFzZWQgb24gc29tZSB1c2VyIGlucHV0LCBsb25nIGluIGFkdmFuY2Ugb2YgYWN0dWFsbHkgbWFraW5nIAotICogdGhlIERPTSBjYWxsLiBBbmQsIG5hdHVhbGx5LCB3YW50IHRvIGdpdmUgdGhlIHVzZXIgZmVlZGJhY2sgaW4gYSBtb3JlIAotICogdGltZWx5IGZhc2hpb24uCi0gKiAKLSAqIElTU1VFOiBpcyAiZW5kbnM6IiByZWFsbHkgdmFsaWQgeG1sIG5hbWU/IEkgdGhpbmsgbm90LCBidXQgdGhpcyBtZXRob2QKLSAqIChjdXJyZW50bHkpIHNheXMgaXQgaXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmFtZVZhbGlkYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBYTUwxME5hbWVzIHhtbDEwY2hhckNoZWNrZXIgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIDxjb2RlPm5hbWU8L2NvZGU+IGlzIHZhbGlkIFhNTCBuYW1lIGFjY29yZGluZyB0byBYTUwKLQkgKiAxLjAgcnVsZXMsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgbmFtZSBpcyB0aGUgc3RyaW5nIHRvIHRlc3QKLQkgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWQgbmFtZSBhY2NvcmRpbmcgdG8gWE1MIDEuMCBydWxlcywgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgbmFtZSkgewotCi0JCWlmICh4bWwxMGNoYXJDaGVja2VyID09IG51bGwpIHsKLQkJCXhtbDEwY2hhckNoZWNrZXIgPSBpbml0aXRhaWxpemVYTUwxME5hbWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHhtbDEwY2hhckNoZWNrZXIuaXNWYWxpZFhNTDEwTmFtZShuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBYTUwxME5hbWVzIGluaXRpdGFpbGl6ZVhNTDEwTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgWE1MMTBOYW1lcygoUmVhZGVyKSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3QgaW50ZW50ZWRlZCB0byBiZSBpbnN0YW50aWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBOYW1lVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNRG9jVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2NUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OWNlZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2NUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jVHlwZSB7Ci0JLyoqCi0JICogQ0hUTUwgZmlsZXMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDSFRNTF9ET0NfVFlQRSA9ICJDSFRNTCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEhUTUwgZmlsZXMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIVE1MX0RPQ19UWVBFID0gIkhUTUwiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBIVE1MNSBmaWxlcwotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUTUw1X0RPQ19UWVBFID0gIkhUTUw1IjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSlNQIDEuMSBmaWxlcyAoY3VycmVudGx5IGluY2x1ZGVzIDEuMiBlbGVtZW50cyBmb3IgYmFja3dhcmQgYmVoYXZpb3JhbCBjb21wYXRpYmlsaXR5KQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTUDExX0RPQ19UWVBFID0gIkpTUDExIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSlNQIDEuMiBmaWxlcwotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTUDEyX0RPQ19UWVBFID0gIkpTUDEyIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSlNQIDIuMCBKU1AgZmlsZXMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1AyMF9ET0NfVFlQRSA9ICJKU1AyMCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEpTUCAyLjAgVGFnIGZpbGVzCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHMjBfRE9DX1RZUEUgPSAiSlNQMjAuVEFHIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSlNQIDIuMSBKU1AgZmlsZXMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1AyMV9ET0NfVFlQRSA9ICJKU1AyMSI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFRyYWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YmFhNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFRyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0KLS8qKgotICogUG9zaXRpb24gZGVwZW5kZW50IENNRG9jdW1lbnQgdHJhY2tlci4gQSB0cmFja2VyIG1hdGNoZXMgYQotICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB3aXRoIGEgQ01Eb2N1bWVudCB0aGF0IGl0IGVuYWJsZXMgYWxsb3dpbmcgZm9yCi0gKiBwb3NpdGlvbi1kZXBlbmRlbnQgY29udGVudCBtb2RlbHMKLSAqLwotcHVibGljIGludGVyZmFjZSBDTURvY3VtZW50VHJhY2tlciB7Ci0KLQlDTURvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTc1ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Ob2RlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ01Ob2RlV3JhcHBlciBleHRlbmRzIENNTm9kZSB7Ci0JQ01Ob2RlIGdldE9yaWdpbk5vZGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2ODExZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ29udGVudE1vZGVsQWRhcHRlciBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZW50TW9kZWxBZGFwdGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBnZXRDTURvY3VtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Eb2N1bWVudAotCSAqIEBwYXJhbSBub3RpZmVyCi0JICogCi0JICogUmV0dXJucyBDTURvY3VtZW50IGFzc29jaWF0ZWQgdG8gdGhlIGFkYXB0aW5nIG5vZGUuIEZvciBleGFtcGwgOiBIVE1MCi0JICogQ01Eb2N1bWVudCBpcyBhc3NvY2lhdGVkIHRvIEhUTUwgRG9jdW1lbnQgbm9kZSwgRFREIENNRG9jdW1lbnQgaXMKLQkgKiBhc3NvY2lhdGVkIHRvIERvY3VtZW50VHlwZSBub2RlLCBEVEQvU2NoZW1hIENNRG9jdW1lbnQgaXMgYXNzb2NpYXRlZCB0bwotCSAqIEVsZW1lbnQgbm9kZSAoc29tZXRpbWUgd2l0aCBuYW1lc3BhY2UpLCBhbmQgdGFnbGliIENNRG9jdW1lbnQgaXMKLQkgKiBhc3NvY2lhdGVkIHRvIHRhZ2xpYiBkaXJlY3RpdmUgRWxlbWVudCBub2RlLgotCSAqIAotCSAqIElOb2RlTm90aWZpZXIgaXMgcGFzc2VkIGZvciBzdGF0ZWxlc3MgKHNpbmdsZXRvbikgSU5vZGVBZGFwdGVyCi0JICogaW1wbGVtZW50YXRpb24uCi0JICovCi0JQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyIG5vdGlmaWVyKTsKLQotCS8qKgotCSAqIGdldERlY2xhcmF0aW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIG5vdGlmZXIKLQkgKiAKLQkgKiBSZXR1cm5zIEVsZW1lbnREZWZpbml0aW9uIG9yIEF0dHJpYnV0ZURlZmluaXRpb24gZm9yIHRoZSBhZGFwdGluZyBub2RlLgotCSAqIAotCSAqIElOb2RlTm90aWZpZXIgaXMgcGFzc2VkIGZvciBzdGF0ZWxlc3MgKHNpbmdsZXRvbikgSU5vZGVBZGFwdGVyCi0JICogaW1wbGVtZW50YXRpb24uCi0JICovCi0JQ01Ob2RlIGdldERlY2xhcmF0aW9uKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyIG5vdGlmaWVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL051bGxDb250ZW50TW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL051bGxDb250ZW50TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyZWU2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9OdWxsQ29udGVudE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBpbnRpYWxpemUgc3BlY2lmaWMgdmFyaWFibGVzIHRoYXQgbmVlZCBhIGNvbnRlbnQKLSAqIG1vZGVsLCB1bnRpbCB0aGUgdHJ1ZSBjb250ZW50IG1vZGVsIGlzIGF2YWlsYWJsZS4gVGhpcyBwcmV2ZW50cyBoYXZpbmcgdG8KLSAqIGRvIGxvdHMgb2YgbnVsbCBjaGVja3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsQ29udGVudE1vZGVsIGltcGxlbWVudHMgQ01Eb2N1bWVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOdWxsQ01OYW1lZE5vZGVNYXAgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgTnVsbEl0ZXJhdG9yKCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQkJcHVibGljIE51bGxJdGVyYXRvcigpIHsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW4gbm90IHJlbW92ZSByZWdpb25zIHZpYSBpdGVyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0JcHVibGljIE51bGxDb250ZW50TW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gbmV3IE51bGxDTU5hbWVkTm9kZU1hcCgpOwotCX0KLQotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ01OYW1lZE5vZGVNYXAoKTsKLQl9Ci0KLQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2MzYTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzLCB3aXRoIGl0cyBmZXcgZmllbGQsIGlzIGEgY29udmllbmNlIHRvIHByb3ZpZGUgY29tcGlsZS10aW1lCi0gKiBzYWZldHkgd2hlbiByZWZlcmluZyB0byBhIGNvbnRlbnRUeXBlIElELiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkCi0gKiBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluIHBsdWdpbi54bWwgZmlsZS4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBDb250ZW50VHlwZUlkRm9yWE1MIHsKLQkvKioKLQkgKiBUaGlzIGNvbnRlbnQgdHlwZSBpcyBhY3R1YWxseSBzdXBwbGllZCBieSBiYXNlIEVjbGlwc2UuIEl0cyBnaXZlbiBoZXJlCi0JICoganVzdCBhcyBkb2N1bWVudGF0aW9uIGZvciBXVFAgYmFzZWQgY2xpZW50cy4gVHlwaWNhbGx5LCBjbGllbnRzIHNob3VsZAotCSAqIHVzZSB0aGUgdmFsdWVzL2NvbnN0YW50cyBzdXBwbGllZCBieSBiYXNlIEVjbGlwc2UuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9YTUwgPSBnZXRDb25zdGFudFN0cmluZzIoKTsKLQkvKioKLQkgKiBUaGlzIHZhbHVlIGlzIHB1YmxpYyBvbmx5IGZvciB0ZXN0aW5nIGFuZCBzcGVjaWFsIGluZnJhc3RydWN0dXJlLiBUaGUKLQkgKiBjb25zdGFudCBub3IgaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCi0JICogCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IHNldCB3aXRoIGRlZmF1bHQKLQkgKiBwcm90ZWN0ZWQgbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9TU0VYTUwgPSBnZXRDb25zdGFudFN0cmluZygpOwotCi0JLyoqCi0JICogRG9uJ3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbnRlbnRUeXBlSWRGb3JYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0Q29uc3RhbnRTdHJpbmcyKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01BdHRyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01BdHRyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTZlMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NQXR0ci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGV4dGVuc2lvbnMgdG8gY29ycmVzcG9uZGluZyBET00gaW50ZXJmYWNlIHRvIGVuYWJsZQotICogZnVuY3Rpb25zIGZvciBzb3VyY2UgZWRpdGluZyBhbmQgaW5jcmVtZW50YWwgcGFyc2luZy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NQXR0ciBleHRlbmRzIElET01Ob2RlLCBBdHRyIHsKLQotCS8qKgotCSAqIEdldCdzIHRoZSByZWdpb24gaW4gYXR0cmlidXRlIHJlcHJlc2VudGluZyB0aGUgJz0nIHNpZ24uIE1heSBvciBtYXkgbm90Ci0JICogaGF2ZSB3aGl0ZXNwYWNlIHN1cnJvdW5kaW5nIGl0LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gCi0JICogSVNTVUU6IG5lZWQgdG8gY2hhbmdlL3JlbW92ZSB0byBhdm9pZCBleHBvc2luZyAnSVRleHRSZWdpb24nCi0JICogY2hhbmdlIHRvIG9mZnNldCBwYXR0ZXJuLCBhcyBvdGhlcnMuCi0JICogCi0JICogQHJldHVybiBJVGV4dFJlZ2lvbiAtIHRoZSByZWdpb24gcmVwcmVzZW50aW5nIHRoZSBlcXVhbHMgc2lnbiwgb3IgbnVsbAotCSAqICAgICAgICAgaWYgdGhlaXIgaXMgbm8gZXF1YWxzIHNpZ24uCi0JICovCi0JSVRleHRSZWdpb24gZ2V0RXF1YWxSZWdpb24oKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZSwgaW5jbHVkaW5nCi0JICogd2hpdGVzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCAtIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgYXR0cmlidXRlIG5hbWUsCi0JICogICAgICAgICBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KLQkgKi8KLQlpbnQgZ2V0TmFtZVJlZ2lvbkVuZE9mZnNldCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBpbnQgLSB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JaW50IGdldE5hbWVSZWdpb25TdGFydE9mZnNldCgpOwotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCVN0cmluZyBnZXROYW1lUmVnaW9uVGV4dCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lLCBleGNsdWRpbmcKLQkgKiB3aGl0ZXNwYWNlLgotCSAqIAotCSAqIEByZXR1cm4gaW50IC0gcmV0dXJucyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZQotCSAqICAgICAgICAgbmFtZSwgZXhjbHVkaW5nIHdoaXRlc3BhY2UuCi0JICovCi0JaW50IGdldE5hbWVSZWdpb25UZXh0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBpbnQgLSByZXR1cm5zIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiAgICAgICAgIHZhbHVlLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGJldHRlciBzcGVjIGludGVyYWN0aW9uIHdpdGggcXVvdGUgbWFya3MKLQkgKi8KLQlpbnQgZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHJldHVybnMgdGhlIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlUmVnaW9uVGV4dCgpOwotCi0JLyoqCi0JICogQ2hlY2sgaWYgQXR0ciBoYXMgYSBuZXN0ZWQgdmFsdWUgKHN1Y2ggYXMgYSBKU1AgZXhwcmVzc2lvbikuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGNvbnRhaW5zIGEgbmVzdGVkIHZhbHVlLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JYm9vbGVhbiBoYXNOZXN0ZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogQ2hlY2sgaWYgQXR0ciBoYXMgb25seSBuYW1lIGJ1dCBub3QgZXF1YWwgc2lnbiBub3IgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGhhcyBvbmx5IG5hbWUgYnV0IG5vdCBlcXVhbCBzaWduIG5vciB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGhhc05hbWVPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYXR0cmlidXRlIGlzIGRlZmluZWQgZ2xvYmFsbHkgZm9yIGRvY3VtZW50LiBSZXR1cm5zCi0JICogZmFsc2UgaWYgYXR0cmlidXRlIGlzIHByZWNlZWRlZCBieSBhIHByZWZpeCAod2hldGhlciB2YWxpZCBuYW1lIHNwYWNlCi0JICogb3Igbm90KS4gUmV0dXJucyB0cnVlIGlmIGl0cyBvd25pbmcgZWxlbWVudCBpcyBhIGdsb2JhbCBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBnbG9iYWxseSBmb3IgZG9jdW1lbnQuIFJldHVybnMKLQkgKiAgICAgICAgIGZhbHNlIGlmIGF0dHJpYnV0ZSBpcyBwcmVjZWVkZWQgYnkgYSBwcmVmaXggKHdoZXRoZXIgdmFsaWQgbmFtZQotCSAqICAgICAgICAgc3BhY2Ugb3Igbm90KS4gUmV0dXJucyB0cnVlIGlmIGl0cyBvd25pbmcgZWxlbWVudCBpcyBhIGdsb2JhbAotCSAqICAgICAgICAgZWxlbWVudC4KLQkgKi8KLQlib29sZWFuIGlzR2xvYmFsQXR0cigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGlzIHhtbCBhdHRyCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gc3BlY2lmeSB0aGlzIG9uZSBpbiBhIG1lYW5pbmdmdWwgd2F5LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiAtIHJldHVybnMgdHJ1ZSBpZiBpcyB4bWwgYXR0cgotCSAqLwotCWJvb2xlYW4gaXNYTUxBdHRyKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Eb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDY5ZTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBlbmFibGVzIGNyZWF0aW9uIG9mIERPQ1RZUEUgZGVjbGFyYXRpb24gYW5kIHNvbWUgRE9NIExldmVsIDIKLSAqIGludGVyZmFjZXMuIE1heSBiZSByZWZlcmVuY2VkIGJ1dCBub3QgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURPTURvY3VtZW50IGV4dGVuZHMgTm9kZSwgRG9jdW1lbnQsIElET01Ob2RlIHsKLQotCS8qKgotCSAqIGNyZWF0ZSBjb21tZW50IGVsZW1lbnQuIHRhZ05hbWUgbXVzdCBiZSByZWdpc3RlcmVkIGFzIGNvbW1lbnQgZWxlbWVudAotCSAqIG5hbWUgaW4gcGx1Z2luLnhtbAotCSAqIAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lCi0JICogQHBhcmFtIGlzSlNQVGFnCi0JICogICAgICAgICAgICB0cnVlIGlmIHRoZSBlbGVtZW50IGlzIEpTUCBzdHlsZSBjb21tZW50ICgmbHQ7JS0tIC4uLgotCSAqICAgICAgICAgICAgLS0lJmd0OykKLQkgKiBAcmV0dXJuIEVsZW1lbnQgZWxlbWVudCBpbnN0YW5jZQotCSAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgdGhyb3duIGlmIHRoZSBlbGVtZW50IG5hbWUgaXMgcmVnaXN0ZXJlZCBhcyBjb21tZW50IGVsZW1lbnQKLQkgKi8KLQlFbGVtZW50IGNyZWF0ZUNvbW1lbnRFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBib29sZWFuIGlzSlNQVGFnKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIERvY3VtZW50VHlwZSBub2RlCi0JICogCi0JICogSVNTVUU6IEkgYmVsaWV2ZSB0aGlzICduYW1lJyBpcyB0aGUgb25lIHNwZWNpZmljIGluIGRvY3R5cGUgZXh0ZW5zaW9uLAotCSAqIG5lZWQgdG8gdmVyaWZ5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIC0KLQkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGRvY3R5cGUKLQkgKiBAcmV0dXJuIERvY3VtZW50VHlwZSAtIHJldHVybnMgYSBkb2N1bWVudCB0eXBlIG5vZGUuCi0JICovCi0JRG9jdW1lbnRUeXBlIGNyZWF0ZURvY3R5cGUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRG9jdW1lbnRUeXBlIElELiBVbmxpa2UgdGhlIHN0YW5kYXJkIERPTSBhcHByb2FjaCBvZgotCSAqICJnZXREb2N1bWVudFR5cGUoKS5nZXRQdWJsaWNJZCgpIiwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaWQgZXZlbiBpZgotCSAqIGltcGxpY2l0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIERvY3VtZW50VHlwZSBJRAotCSAqLwotCVN0cmluZyBnZXREb2N1bWVudFR5cGVJZCgpOwotCi0JLyoqCi0JICogTk9UIEFQSSAuLi4gbmVlZHMgdG8gYmUgcmVtb3ZlZC9jaGFuZ2VkCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gc3BlY2lmeQotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGlzIEpTUERvY3VtZW50Ci0JICogCi0JICovCi0JYm9vbGVhbiBpc0pTUERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBOT1QgQVBJIC4uLiBuZWVkcyB0byBiZSByZW1vdmVkL2NoYW5nZWQKLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBzcGVjaWZ5Ci0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzSlNQVHlwZSgpOwotCi0JLyoqCi0JICogTk9UIEFQSSAuLi4gbWF5IHJlbW92ZWQvY2hhbmdlZAotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNwZWNpZnkgLS0gY3VycmVudGx5IHVzZWQgdG8gZGVub3RlIGFuIEhUTUwgRE9NIGRvY3VtZW50Ci0JICogaXMgWEhUTUwKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNYTUxUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRG9jdW1lbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMmM2NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRG9jdW1lbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBlbmFibGVzIHNldHRpbmcgb2YgUHVibGljIGFuZCBTeXN0ZW0gSUQgZm9yIERPQ1RZUEUKLSAqIGRlY2xhcmF0aW9uLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NRG9jdW1lbnRUeXBlIGV4dGVuZHMgSURPTU5vZGUsIERvY3VtZW50VHlwZSB7Ci0KLQotCS8qKgotCSAqIFNldHMgZG9jdW1lbnQgdHlwZSdzIHB1YmxpYyBpZCwgYXMgc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcgLQotCSAqICAgICAgICAgICAgdGhlIHB1YmxpY0lkCi0JICovCi0Jdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpOwotCi0JLyoqCi0JICogU2V0cyBkb2NtZW50IHR5cGUncyBzeXN0ZW0gaWQsIGFzIHNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gU3RyaW5nIC0KLQkgKiAgICAgICAgICAgIHRoZSBzeXN0ZW1JZAotCSAqLwotCXZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIHN5c3RlbUlkKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkNzc2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGV4dGVuc2lvbnMgdG8gY29ycmVzcG9uZGluZyBET00gaW50ZXJmYWNlIHRvIGVuYWJsZQotICogZnVuY3Rpb25zIGZvciBzb3VyY2UgZWRpdGluZyBhbmQgaW5jcmVtZW50YWwgcGFyc2luZy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NRWxlbWVudCBleHRlbmRzIElET01Ob2RlLCBFbGVtZW50IHsKLQotCS8qKgotCSAqIFJldHVucyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBlbmQgdGFnLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNvcnQgb3V0IG5lZWQgZm9yIHRoaXMKLQkgKiAKLQkgKiBAcmV0dXJuIGludCAtIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGVuZCB0YWcuCi0JICovCi0JaW50IGdldEVuZFN0YXJ0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZQotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNvcnQgb3V0IG5lZWQgZm9yIHRoaXMKLQkgKiAKLQkgKiBAcmV0dXJuIGludCAtIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSBzdGFydCB0YWcuCi0JICovCi0JaW50IGdldFN0YXJ0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgaGFzIGFuIGVuZCB0YWcuCi0JICogCi0JICogSW4gb3VyIHNvdXJjZS1vcmllbnRlZCBET00sIHNvbWV0aW1lcyBFbGVtZW50cyBhcmUgImVuZGVkIiwgZXZlbgotCSAqIHdpdGhvdXQgYW4gZXhwbGljaXQgZW5kIHRhZyBpbiB0aGUgc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBoYXMgYW4gZW5kIHRhZy4KLQkgKi8KLQlib29sZWFuIGhhc0VuZFRhZygpOwotCi0JLyoqCi0JICogcmV0dXJucyB0cnVlIGlmIGhhcyBhIHN0YXJ0IHRhZy4KLQkgKiAKLQkgKiBJbiBvdXIgc291cmNlLW9yaWVudGVkIERPTSwgYSBsb25lIGVuZCB0YWcgd2lsbCBjYXVzZSBhIG5vZGUgdG8gYmUKLQkgKiBjcmVhdGVkIGluIHRoZSB0cmVlLCB1bmxpa2Ugd2VsbC1mb3JtZWQtb25seSBET01zLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBoYXMgYSBzdGFydCB0YWcuCi0JICovCi0JYm9vbGVhbiBoYXNTdGFydFRhZygpOwotCi0JLyoqCi0JICogcmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCBpcyBhIGNvbW1lbnQgZWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgYSBjb21tZW50IGVsZW1lbnQKLQkgKi8KLQlib29sZWFuIGlzQ29tbWVudFRhZygpOwotCi0JLyoqCi0JICogaXNFbXB0eVRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gLSB0cnVlIGlmIGlzIGVtcHR5IHRhZywgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBpc0VtcHR5VGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgZmxvYXRpbmcgZW5kIHRhZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgZmxvYXRpbmcgZW5kIHRhZy4KLQkgKi8KLQlib29sZWFuIGlzRW5kVGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgZm9yICJnbG9iYWwgdGFnIiAoYmFzaWNhbGx5LCB3aXRob3V0IHByZWZpeCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgZm9yICJnbG9iYWwgdGFnIiAoYmFzaWNhbGx5LCB3aXRob3V0IHByZWZpeCkKLQkgKi8KLQlib29sZWFuIGlzR2xvYmFsVGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgZm9yIG5vIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MgaW4gc291cmNlLgotCSAqIAotCSAqIFByb3ZpZGVkIGZvciBzb21lIHZlcnkgc3BlY2lhbCBjYXNlcyB3aGVuLCBmb3IgZXhhbXBsZSwgYW5kIEhUTUwgdGFnIGlzCi0JICogYXNzdW1lZCBpbiBhbiBIVE1MIGRvY3VtZW50IHRoYXQgZG9lcyBub3QgaGF2ZSBhIGxpdGVyYWwgSFRNTCB0YWcuCi0JICogCi0JICogSVNTVUU6IGNoZWNrIHdpdGggY2xpZW50cyB0byBzZWUgaWYgc3RpbGwgbmVlZGVkCi0JICogCi0JICogQHJldHVybiB0cnVlIG9yIG5vIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MgaW4gc291cmNlLgotCSAqLwotCWJvb2xlYW4gaXNJbXBsaWNpdFRhZygpOwotCi0JLyoqCi0JICogaXNKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogCi0JICogSVNTVUU6IGNoYW5nZSB0byBpc0NvbnRhaW5lckxhbmd1YWdlVGFnKFN0cmluZyB0eXBlKTsKLQkgKi8KLQlib29sZWFuIGlzSlNQVGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgc3RhcnQgdGFnIGlzIGNsb3NlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3RhcnQgdGFnIGlzIGNsb3NlZC4KLQkgKi8KLQlib29sZWFuIGlzU3RhcnRUYWdDbG9zZWQoKTsKLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiBpcyB4bWwgdGFnCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gc3BlYyB0aGlzIGJldHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgaXMgeG1sIHRhZwotCSAqLwotCWJvb2xlYW4gaXNYTUxUYWcoKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogbm90aWZ5RW5kVGFnQ2hhbmdlZAotCSAqIAotCSAqLwotCXZvaWQgbm90aWZ5RW5kVGFnQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogTk9UIENMSUVOVCBBUEkKLQkgKiAKLQkgKiBub3RpZnlTdGFydFRhZ0NoYW5nZWQKLQkgKiAKLQkgKi8KLQl2b2lkIG5vdGlmeVN0YXJ0VGFnQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogTk9UIENMSUVOVCBBUEkKLQkgKiAKLQkgKiBTaWduaWZ5IHRoYXQgdGhpcyB0YWcgaXMgYSBjb21tZW50Ci0JICogCi0JICogRm9yIHVzZSBvbmx5IGJ5IHBhcnNlcnMuCi0JICogCi0JICovCi0Jdm9pZCBzZXRDb21tZW50VGFnKGJvb2xlYW4gaXNDb21tZW50VGFnKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogU2lnbmlmeSB0aGF0IHRoaXMgdGFnIGlzIGFuIGVtcHR5IHRhZwotCSAqIAotCSAqIEZvciB1c2Ugb25seSBieSBwYXJzZXJzCi0JICovCi0Jdm9pZCBzZXRFbXB0eVRhZyhib29sZWFuIGlzRW1wdHlUYWcpOwotCi0JLyoqCi0JICogTk9UIENMSUVOVCBBUEkKLQkgKiAKLQkgKiBTaWduaWZ5IHRoYXQgdGhpcyB0YWcgaXMgYSBKU1AgdGFnCi0JICogCi0JICogRm9yIHVzZSBvbmx5IGJ5IHBhcnNlcnMKLQkgKiAKLQkgKiBJU1NVRTogSSBoYXZlIGhhZCBvbmUgbm9uLXBhcnNpbmcgY2xpZW50IHdobyBoYXMgaGFkIHRvIHVzZSB0aGlzIC4uLgotCSAqIG5lZWQgdG8gY2hlY2sKLQkgKiAKLQkgKi8KLQl2b2lkIHNldEpTUFRhZyhib29sZWFuIGlzSlNQVGFnKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0lkKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIGJvb2xlYW4gaXNJZCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOb2RlKEF0dHIgaWRBdHRyLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjJlYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURPTUVudGl0eSBleHRlbmRzIEVudGl0eSB7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElucHV0RW5jb2RpbmcoKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSAzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSAzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sVmVyc2lvbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NSW1wbGVtZW50YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNzNlMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NSW1wbGVtZW50YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotcHVibGljIGludGVyZmFjZSBJRE9NSW1wbGVtZW50YXRpb24gewotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBUaGlzIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gMy4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3BlY2lhbGl6ZWQgb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgdGhlCi0JICogc3BlY2lhbGl6ZWQgQVBJcyBvZiB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgYW5kIHZlcnNpb24sIGFzIHNwZWNpZmllZCBpbiAuCi0JICogVGhlIHNwZWNpYWxpemVkIG9iamVjdCBtYXkgYWxzbyBiZSBvYnRhaW5lZCBieSB1c2luZyBiaW5kaW5nLXNwZWNpZmljCi0JICogY2FzdGluZyBtZXRob2RzIGJ1dCBpcyBub3QgbmVjZXNzYXJpbHkgZXhwZWN0ZWQgdG8sIGFzIGRpc2N1c3NlZCBpbiAuCi0JICogVGhpcyBtZXRob2QgYWxzbyBhbGxvdyB0aGUgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBzcGVjaWFsaXplZAotCSAqIG9iamVjdHMgd2hpY2ggZG8gbm90IHN1cHBvcnQgdGhlIDxjb2RlPkRPTUltcGxlbWVudGF0aW9uPC9jb2RlPgotCSAqIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgcmVxdWVzdGVkLiBOb3RlIHRoYXQgYW55IHBsdXMgc2lnbgotCSAqICAgICAgICAgICAgIisiIHByZXBlbmRlZCB0byB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB3aWxsIGJlIGlnbm9yZWQKLQkgKiAgICAgICAgICAgIHNpbmNlIGl0IGlzIG5vdCBzaWduaWZpY2FudCBpbiB0aGUgY29udGV4dCBvZiB0aGlzIG1ldGhvZC4KLQkgKiBAcGFyYW0gdmVyc2lvbgotCSAqICAgICAgICAgICAgVGhpcyBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYW4gb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgdGhlIHNwZWNpYWxpemVkIEFQSXMgb2YgdGhlCi0JICogICAgICAgICBzcGVjaWZpZWQgZmVhdHVyZSBhbmQgdmVyc2lvbiwgaWYgYW55LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgaWYgdGhlcmUgaXMgbm8gb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgaW50ZXJmYWNlcyBhc3NvY2lhdGVkCi0JICogICAgICAgICB3aXRoIHRoYXQgZmVhdHVyZS4gSWYgdGhlIDxjb2RlPkRPTU9iamVjdDwvY29kZT4gcmV0dXJuZWQgYnkKLQkgKiAgICAgICAgIHRoaXMgbWV0aG9kIGltcGxlbWVudHMgdGhlIDxjb2RlPkRPTUltcGxlbWVudGF0aW9uPC9jb2RlPgotCSAqICAgICAgICAgaW50ZXJmYWNlLCBpdCBtdXN0IGRlbGVnYXRlIHRvIHRoZSBwcmltYXJ5IGNvcmUKLQkgKiAgICAgICAgIDxjb2RlPkRPTUltcGxlbWVudGF0aW9uPC9jb2RlPiBhbmQgbm90IHJldHVybiByZXN1bHRzCi0JICogICAgICAgICBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgcHJpbWFyeSBjb3JlCi0JICogICAgICAgICA8Y29kZT5ET01JbXBsZW1lbnRhdGlvbjwvY29kZT4gc3VjaCBhcwotCSAqICAgICAgICAgPGNvZGU+aGFzRmVhdHVyZTwvY29kZT4sIDxjb2RlPmdldEZlYXR1cmU8L2NvZGU+LCBldGMuCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Nb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmZmM3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbE5vdGlmaWVyOwotCi0vKioKLSAqIFByb3ZpZGVzIG1lYW5zIHRvIGdldCB0aGUgWE1MTW9kZWwgZm9ybSBvZiBJU3RydWN1dHJlZE1vZGVsLiBOb3QgdG8gYmUKLSAqIGltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01Nb2RlbCBleHRlbmRzIElTdHJ1Y3R1cmVkTW9kZWwgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRE9NIERvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIERPTSBEb2N1bWVudC4KLQkgKi8KLQlJRE9NRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIAotCSAqIFJldHVybnMgYW4gc291cmNlIGdlbmVyYXRvciBhcHByb3ByaWF0ZSBmb3IgdGhpcyBtb2RlbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzb3VyY2UgZ2VuZXJhdG9yCi0JICovCi0JSVNvdXJjZUdlbmVyYXRvciBnZXRHZW5lcmF0b3IoKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogUmV0dXJucyBhbiBYTUxNb2RlbE5vdGlmaWVyLiBDbGllbnRzIHNob3VsZCBub3QgdXNlLgotCSAqIAotCSAqIElTU1VFOiBzaG91bGQgYmUgImludGVybmFsaXplZCIuCi0JICogCi0JICovCi0JWE1MTW9kZWxOb3RpZmllciBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBOT1QgQ0xJRU5UIEFQSQotCSAqCi0JICogU2V0cyB0aGUgbW9kZWwgbm90aWZpZXIgQ2xpZW50cyBzaG91bGQgbm90IHVzZS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byByZXZpZXcgd2l0aCBsZWdhY3kgY2xpZW50cy4KLQkgKi8KLQl2b2lkIHNldE1vZGVsTm90aWZpZXIoWE1MTW9kZWxOb3RpZmllciBub3RpZmllcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkODg3NWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlc2NyaWJlcyB0aGUgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eSBvZiBvdXIgc291cmNlLW9yaWVudGVkCi0gKiBET00uIEZpcnN0LCBvdXIgbm9kZXMgZXh0ZW5kIHRoZSB3M2MgTm9kZSBpbnRlcmZhY2UsIEluZGV4ZWRSZWdpb24sIGFuZAotICogSU5vZGVOb3RpZmllci4gUGx1cywgaGFzIHRoZSBleHRyYSBtZXRob2RzIGNhbGxlZCBvdXQgaGVyZS4KLSAqIAotICogSVNTVUU6IHRoZSAncmVhZC1vbmx5JyBBUEkgc2hvdWxkIGJlIGJyb2tlbiBvdXQgaW4gdGhlaXIgb3duIGludGVyZmFjZQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01Ob2RlIGV4dGVuZHMgSW5kZXhlZFJlZ2lvbiwgSU5vZGVOb3RpZmllciwgTm9kZSB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYXN0IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIG9mIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byByZXNvbHZlIGdldEVuZC9nZXRMYXN0IGNvbmZ1c2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gLSByZXR1cm5zIHRoZSBsYXN0IHN0cnVjdHVyZWQKLQkgKiAgICAgICAgIGRvY3VtZW50IHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGgKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3Qgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHJlc29sdmUgZ2V0Rmlyc3QvZ2V0U3RhcnQgY29uZnVzaW9uCi0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gb2YgdGhpcyBub2RlLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxhc3Qgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHJlc29sdmUgZ2V0RW5kL2dldExhc3QgY29uZnVzaW9uLgotCSAqIAotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAtIHJldHVybnMgdGhlIGxhc3Qgc3RydWN0dXJlZAotCSAqICAgICAgICAgZG9jdW1lbnQgcmVnaW9uIGFzc29jaWF0ZWQgd2l0aAotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4gUmV0dXJucyBudWxsIGlmIG5vdCBwYXJ0Ci0JICogb2YgYW4gYWN0aXZlIG1vZGVsLgotCSAqIAotCSAqIEByZXR1cm4gSURPTU1vZGVsIC0gcmV0dXJucyB0aGUgSURPTU1vZGVsIHRoaXMgbm9kZSBpcyBwYXJ0IG9mLgotCSAqLwotCUlET01Nb2RlbCBnZXRNb2RlbCgpOwotCi0JLyoqCi0JICogR2V0J3MgdGhlIHJlZ2lvbiByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBub2RlCi0JICogCi0JICogSVNTVUU6IG9ubHkgaW1wbGVtZW50ZWQvdXNlZCBhdCBhdHRyaWJ1dGUgYW5kIERURE5vZGVzIC0tIHNob3VsZCBtb3ZlLgotCSAqIAotCSAqIEByZXR1cm4gSVRleHRSZWdpb24gLSByZXR1cm5zIHRoZSBJVGV4dFJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcwotCSAqICAgICAgICAgTm9kZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgc291cmNlIHJlcHJlc2VudGluZyB0aGlzIG5vZGUgaW4gc291cmNlIGRvY3VtZW50LgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGZpeCBpbXBsZW1lbnRhdGlvbiB0byBtYXRjaC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXRlcmFsIHNvdXJjZSByZXByZXNlbnRpbmcgdGhpcyBub2RlIGluIHNvdXJjZSBkb2N1bWVudC4KLQkgKi8KLQlTdHJpbmcgZ2V0U291cmNlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmaXJzdCBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gcmVzb2x2ZSBnZXRGaXJzdC9nZXRTdGFydCBjb25mdXNpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiBvZiB0aGlzIG5vZGUuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCB0aGF0IHVuZGVybGllcyB0aGlzIG5vZGUncyBtb2RlbC4KLQkgKiAKLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhpcyBub2RlIGlzIG5vdCBhY3RpdmVseSBwYXJ0IG9mIGEgc291cmNlIGRvY3VtZW50LiBJbgotCSAqIGNvbnRyYXN0LCBpbiB0aGUgcHVyZSBET00gd29ybGQsICJvd25pbmcgZG9jdW1lbnQiIGlzIG5vdCBudWxsIGV2ZW4KLQkgKiBhZnRlciBhIG5vZGUgaXMgZGVsZXRlZCBmcm9tIHRoZSBET00uCi0JICogCi0JICogSVNTVUU6IHdlIG5lZWQgdG8gZml4IG91ciBpbXBsZW1lbnRhdGlvbiB0byBtYXRjaCB0aGlzIHNwZWMuCi0JICogCi0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JLyoqCi0JICogR2V0J3MgdGhlIHJlZ2lvbiByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoaXMgbm9kZSBpZiBvbmx5IG9uZQotCSAqIElUZXh0UmVnaW9uLCBudWxsIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBJU1NVRTogb25seSBpbXBsZW1lbnRlZC91c2VkIGF0IGF0dHJpYnV0ZSBsZXZlbCwgbW92ZSAiZG93biIuCi0JICogCi0JICogQHJldHVybiBJVGV4dFJlZ2lvbiAtIHJldHVybnMgdGhlIElUZXh0UmVnaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0JICogICAgICAgICBOb2RlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JSVRleHRSZWdpb24gZ2V0VmFsdWVSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzb3VyY2Ugb2YgdGhpcyBub2RlLCBidXQgd2l0aAotCSAqIGNoYXJhY3RlciBlbnRpZXMgY29udmVydGVkIChlLmcuICZsdDsgaXMgY29udmVydGVkIHRvICc8JykuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gYmV0dGVyIHNwZWMgZXh0ZW50IG9mIHRoaXMgY29udmVyc2lvbiwgd2UgbWF5IG5vdCBrbm93Ci0JICogYWxsIGNoYXJhY3RlciBlbnRpdGllcy4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBmaXggaW1wbGVtZW50YXRpb24gdG8gbWF0Y2ggc3BlYy4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyAtIGdldCdzIHRoZSBzb3VyY2Ugb2YgdGhpcyBOb2RlLgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZVNvdXJjZSgpOwotCi0JLyoqCi0JICogVXNlZCB0byBrbm93IHJlYWQtb25seSBzdGF0ZSBvZiBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gV2hldGhlciBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudCBjYW4gYmUgYXBwZW5kZWQgb3IKLQkgKiAgICAgICAgIHJlbW92ZWQuCi0JICovCi0JYm9vbGVhbiBpc0NoaWxkRWRpdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0YWcgaXMgY2xvc2VkIGluIHNvdXJjZS4KLQkgKiAKLQkgKiBJbiBvdXIgc291cmNlIG9yaWVudCBET00gd2Ugc29tZXRpbWVzIGVuZCBhIE5vZGUgd2l0aG91dCBpdCBiZWluZwotCSAqIGV4cGxpY2l0bHkgY2xvc2VkIGluIHNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gLSB0cnVlIGlmIG5vZGUgaXMgY2xvc2VkCi0JICovCi0JYm9vbGVhbiBpc0Nsb3NlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbm9kZSBjYW4gY29udGFpbiBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gLSB0cnVlIGlmIHRoaXMgbm9kZSBjYW4gY29udGFpbiBjaGlsZHJlbi4KLQkgKi8KLQlib29sZWFuIGlzQ29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGtub3cgcmVhZC1vbmx5IHN0YXRlIG9mIGRhdGEuCi0JICogCi0JICovCi0JYm9vbGVhbiBpc0RhdGFFZGl0YWJsZSgpOwotCi0JLyoqCi0JICogU2V0J3MgcmVhZG9ubHkgc3RhdGUgb2YgY2hpbGRyZW4KLQkgKiAKLQkgKi8KLQl2b2lkIHNldENoaWxkRWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSk7Ci0KLQkvKioKLQkgKiBTZXQncyByZWFkb25seSBzdGF0ZSBvZiBkYXRhCi0JICogCi0JICovCi0Jdm9pZCBzZXREYXRhRWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHJlYWRvbmx5IHN0YXRlIG9mIGRhdGEKLQkgKiAKLQkgKiBmYXN0ZXIgYXBwcm9hY2ggdG8gc2V0IHJlYWQtb25seSBzdGF0ZS4KLQkgKi8KLQl2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUsIGJvb2xlYW4gZGVlcCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzcGVjaWZpZWQgcmF3IHNvdXJjZSB0byB0aGUgVGV4dCBub2RlLiBUaHJvd3MKLQkgKiBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uIHdoZW4gdGhlIHNwZWNpZmllZCByYXcgc291cmNlIGluY2x1ZGVzCi0JICogaW52YWxpZCBjaGFyYWN0ZXJzLCBzdWNoIGFzLCAnIDwnLCAnPicgYW5kICcmJy4gVmFsaWQgY2hhcmFjdGVyCi0JICogZW50aXRpZXMsIHN1Y2ggYXMsICImYW1wO2x0OyIsIGFyZSBhY2NlcHRlZC4KLQkgKi8KLQl2b2lkIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB0aHJvd3MgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldHMgdGhlIHNwZWNpZmllZCByYXcgc291cmNlIHRvIHRoZSBUZXh0IG9yIEF0dHIgbm9kZSdzIHZhbHVlLiBXaGVuCi0JICogdGhlIHNwZWNpZmllZCByYXcgc291cmNlIGluY2x1ZGVzIGludmFsaWQgY2hhcmFjdGVycywgc3VjaCBhcywgJyA8JywKLQkgKiAnPicgYW5kICcmJywgY29udmVydHMgdGhlbS4gVmFsaWQgY2hhcmFjdGVyIGVudGl0aWVzLCBzdWNoIGFzLAotCSAqICImYW1wO2x0OyIsIGFyZSBhY2NlcHRlZC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlU291cmNlKFN0cmluZyBzb3VyY2UpOwotCQotCQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgc2hvcnQgY29tcGFyZURvY3VtZW50UG9zaXRpb24oTm9kZSBvdGhlcikgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRDb250ZW50KCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YShTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkkpOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWFsTm9kZShOb2RlIGFyZyk7Ci0JCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhbWVOb2RlKE5vZGUgb3RoZXIpOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvb2t1cE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBsb29rdXBQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSk7Ci0JCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0Q29udGVudChTdHJpbmcgdGV4dENvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb247Ci0JCi0JCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01UZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01UZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjNhNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgZXh0ZW5zaW9ucyB0byBjb3JyZXNwb25kaW5nIERPTSBpbnRlcmZhY2UgdG8gZW5hYmxlCi0gKiBmdW5jdGlvbnMgZm9yIHNvdXJjZSBlZGl0aW5nIGFuZCBpbmNyZW1lbnRhbCBwYXJzaW5nLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01UZXh0IGV4dGVuZHMgSURPTU5vZGUsIFRleHQgewotCi0JLyoqCi0JICogTk9UIEFQSSAtIGNhbiBiZSBlbGltaW5hdGVkIG9yIG1vdmVkIHRvIGx0ayBsZXZlbAotCSAqIAotCSAqIEFwcGVuZHMgdGhlIGNvbnRlbnQgb2YgdGhlIHRleHQgbm9kZQotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IC0KLQkgKiAgICAgICAgICAgIHRoZSBUZXh0IHRvIGFwcGVuZC4KLQkgKi8KLQl2b2lkIGFwcGVuZFRleHQoVGV4dCB0ZXh0KTsKLQotCS8qKgotCSAqIE5PVCBBUEkgLSBjYW4gYmUgZWxpbWluYXRlZCBvciBtb3ZlZCB0byBsdGsgbGV2ZWwKLQkgKiAKLQkgKiBSZXR1cm5zIHRydWUgaWYgaXMgbm90IHZhbGlkLgotCSAqLwotCWJvb2xlYW4gaXNJbnZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgaXMgZW50aXJlbHkgd2hpdGUgc3BhY2UuCi0JICogCi0JICogVGhpcyBpcyBpbnRlbmVkIHRvIGJlIGJldHRlciBwZXJmb3JtaW5nIHRoYXQgYWxsIGNsaWVudHMgZ2V0dGluZyB0aGUKLQkgKiBzb3VyY2UsIGFuZCBjaGVja2luZyB0aGVtc2VsdmVzLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGNsYXJpZnkgaWYgaW1wbGVtZW50YXRpb24gaXMgcHVyZSB0byAid2hpdGUgc3BhY2UiIGFzCi0JICogcGVyIERPTSBzcGVjPyBIZXJlIGlzIHRoZSBET00gc3BlYzoKLQkgKiAKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0ZXh0IG5vZGUgY29udGFpbnMgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA0L1JFQy14bWwtaW5mb3NldC0yMDA0MDIwNCNpbmZvaXRlbS5jaGFyYWN0ZXInPgotCSAqIGVsZW1lbnQgY29udGVudCB3aGl0ZXNwYWNlPC9hPiwgb2Z0ZW4gYWJ1c2l2ZWx5IGNhbGxlZCAiaWdub3JhYmxlCi0JICogd2hpdGVzcGFjZSIuIFRoZSB0ZXh0IG5vZGUgaXMgZGV0ZXJtaW5lZCB0byBjb250YWluIHdoaXRlc3BhY2UgaW4KLQkgKiBlbGVtZW50IGNvbnRlbnQgZHVyaW5nIHRoZSBsb2FkIG9mIHRoZSBkb2N1bWVudCBvciBpZiB2YWxpZGF0aW9uIG9jY3VycwotCSAqIHdoaWxlIHVzaW5nIDxjb2RlPkRvY3VtZW50Lm5vcm1hbGl6ZURvY3VtZW50KCk8L2NvZGU+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+VGV4dDwvY29kZT4gbm9kZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZAotCSAqICAgICAgICAgY29udGVudC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIG9uZSBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5UZXh0PC9jb2RlPiBub2RlcyBiZWluZyByZXBsYWNlZCBpcyByZWFkb25seS4KLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFRleHQgcmVwbGFjZVdob2xlVGV4dChTdHJpbmcgY29udGVudCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JU291cmNlR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTb3VyY2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczMDQ4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTb3VyY2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiAKLSAqIElTb3VyY2VHZW5lcmF0b3IgYWxsb3dzIERPTSBtb2RlbHMgdG8gZ2VuZXJhdGUgc291cmNlIGFwcHJvcHJpYXRlIGZvciB0aGVpcgotICogcGFyYW1ldGVyLCByZWxhdGl2ZSB0byB0aGUgbW9kZWwgdGhhdCBwcm92aWRlcyB0aGUgc291cmNlIGdlbmVyYXRvci4KLSAqIAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZUdlbmVyYXRvciB7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBhdHRyaWJ1dGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0ciAtCi0JICogICAgICAgICAgICB0aGUgQXR0cgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVBdHRyTmFtZShBdHRyIGF0dHIpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVBdHRyVmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gYXR0ciAtCi0JICogICAgICAgICAgICB0aGUgQXR0cgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoQXR0ciBhdHRyKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQXR0clZhbHVlCi0JICogCi0JICogQHBhcmFtIGF0dHIgLQotCSAqICAgICAgICAgICAgdGhlIEF0dHIKLQkgKiBAcGFyYW0gY2hhciAtCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBxdW90ZSBkZXNpcmVkICgnIG9yICIpLgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoQXR0ciBhdHRyLCBjaGFyIHF1b3RlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQXR0clZhbHVlCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIHZhbHVlCi0JICogQHBhcmFtIGNoYXIgLQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgcXVvdGUgZGVzaXJlZCAoJyBvciAiKS4KLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKFN0cmluZyB2YWx1ZSwgY2hhciBxdW90ZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNEQVRBU2VjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqICAgICAgICAgICAgQ0RBVEFTZWN0aW9uCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUNEQVRBU2VjdGlvbihDREFUQVNlY3Rpb24gY2RhdGEpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqIEBwYXJhbSBOb2RlCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUNoaWxkKE5vZGUgcGFyZW50Tm9kZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNsb3NlVGFnCi0JICogCi0JICogQHBhcmFtIG5vZGUgLQotCSAqICAgICAgICAgICAgdGhlIE5vZGUKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQ2xvc2VUYWcoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQ29tbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQ29tbWVudAotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVDb21tZW50KENvbW1lbnQgY29tbWVudCk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZURvY3R5cGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGRvY1R5cGUKLQkgKiAgICAgICAgICAgIERvY3VtZW50VHlwZQotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVEb2N0eXBlKERvY3VtZW50VHlwZSBkb2NUeXBlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICBFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIGdlbmVyYXRlRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IC0KLQkgKiAgICAgICAgICAgIEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlRW5kVGFnKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVudGl0eVJlZiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZW50aXR5UmVmCi0JICogICAgICAgICAgICBFbnRpdHlSZWZlcmVuY2UKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlRW50aXR5UmVmKEVudGl0eVJlZmVyZW5jZSBlbnRpdHlSZWYpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVQSSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcGkgLQotCSAqICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVBJKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVNvdXJjZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZSAtCi0JICogICAgICAgICAgICB0aGUgTm9kZQotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVTb3VyY2UoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlU3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWcoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIEdlbmVyYXRlIHRhZyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IC0KLQkgKiAgICAgICAgICAgIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlVGFnTmFtZShFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVUZXh0IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IC0KLQkgKiAgICAgICAgICAgIHRoZSBUZXh0Ci0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVRleHQoVGV4dCB0ZXh0KTsKLQotCS8qKgotCSAqIGdlbmVyYXRlIHRleHQgZGF0YQotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IC0KLQkgKiAgICAgICAgICAgIHRoZSBUZXh0Ci0JICogQHBhcmFtIGRhdGEgLQotCSAqICAgICAgICAgICAgdGhlIGRhdGEKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlVGV4dERhdGEoVGV4dCB0ZXh0LCBTdHJpbmcgZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Db21tZW50Tm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvQ29tbWVudE5vZGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiYTkwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Db21tZW50Tm9kZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTY5OTkgLSBJbmVmZmljaWVudCB1c2Ugb2YgbmV3IFN0cmluZygpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWVudE5vZGVGb3JtYXR0ZXIgZXh0ZW5kcyBOb2RlRm9ybWF0dGVyIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ1IgPSAiXHIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIExGID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBhZGp1c3RJbmRlbnRhdGlvbnMoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBsaW5lSW5kZW50LCBTdHJpbmcgc2luZ2xlSW5kZW50KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBOb2RlRm9ybWF0dGVyLkVNUFRZX1NUUklORzsKLQotCQlpbnQgaW5kZXhPZkxpbmVEZWxpbWl0ZXIgPSBTdHJpbmdVdGlscy5pbmRleE9mTGluZURlbGltaXRlcihhU3RyaW5nKTsKLQkJcmVzdWx0ID0gYVN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXhPZkxpbmVEZWxpbWl0ZXIpOwotCQl3aGlsZSAoaW5kZXhPZkxpbmVEZWxpbWl0ZXIgIT0gLTEpIHsKLQkJCS8vIEJlZm9yZSBmaW5kIHRoZSBuZXh0IExpbmVEZWxpbWl0ZXIsIHdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUKLQkJCS8vIHNpemUgb2YgdGhlIGN1cnJlbnQgTGluZURlbGltaXRlcgotCQkJLy8gc28gd2UgY2FuIGZpZ3VyZSBvdXQgaG93IG1hbnkgYnl0ZXMgdG8gc2tpcCBiZWZvcmUgZmluZGluZyB0aGUKLQkJCS8vIG5leHQgTGluZURlbGltaXRlci4KLQkJCS8vIE90aGVyd2lzZSwgd2UgbWF5IHRyZWF0IHRoZSBMRiBpbiBDUkxGIGFzIHRoZSBuZXh0Ci0JCQkvLyBMaW5lRGVsaW1pdGVyLgotCQkJaW50IGxpbmVEZWxpbWl0ZXJTaXplID0gMTsKLQkJCWlmIChhU3RyaW5nLmxlbmd0aCgpID49IGluZGV4T2ZMaW5lRGVsaW1pdGVyICsgMiAmJiBhU3RyaW5nLnN1YnN0cmluZyhpbmRleE9mTGluZURlbGltaXRlciwgaW5kZXhPZkxpbmVEZWxpbWl0ZXIgKyAxKS5jb21wYXJlVG8oQ1IpID09IDAgJiYgYVN0cmluZy5zdWJzdHJpbmcoaW5kZXhPZkxpbmVEZWxpbWl0ZXIgKyAxLCBpbmRleE9mTGluZURlbGltaXRlciArIDIpLmNvbXBhcmVUbyhMRikgPT0gMCkKLQkJCQlsaW5lRGVsaW1pdGVyU2l6ZSA9IDI7Ci0KLQkJCWludCBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIgPSBTdHJpbmdVdGlscy5pbmRleE9mTGluZURlbGltaXRlcihhU3RyaW5nLCBpbmRleE9mTGluZURlbGltaXRlciArIGxpbmVEZWxpbWl0ZXJTaXplKTsKLQkJCWludCBpbmRleE9mTm9uYmxhbmsgPSBTdHJpbmdVdGlscy5pbmRleE9mTm9uYmxhbmsoYVN0cmluZywgaW5kZXhPZkxpbmVEZWxpbWl0ZXIpOwotCi0JCQlpZiAoaW5kZXhPZk5vbmJsYW5rICE9IC0xKSB7Ci0JCQkJaWYgKGluZGV4T2ZOZXh0TGluZURlbGltaXRlciA9PSAtMSkgewotCQkJCQkvLyBsYXN0IGxpbmU7IGNvcHkgdGlsbCB0aGUgZW5kCi0JCQkJCXJlc3VsdCArPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50ICsgYVN0cmluZy5zdWJzdHJpbmcoaW5kZXhPZk5vbmJsYW5rKTsKLQkJCQl9IGVsc2UgaWYgKGluZGV4T2ZOZXh0TGluZURlbGltaXRlciAhPSAtMSAmJiBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIgPCBpbmRleE9mTm9uYmxhbmspIHsKLQkJCQkJLy8gYmxhbmsgbGluZTsganVzdCBhZGQgYSBpbmRlbnQKLQkJCQkJcmVzdWx0ICs9IGxpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gY29weSBhbGwgdGV4dCBiZXR3ZWVuIGluZGV4T2ZOb25ibGFuayBhbmQKLQkJCQkJLy8gaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyCi0JCQkJCXJlc3VsdCArPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50ICsgYVN0cmluZy5zdWJzdHJpbmcoaW5kZXhPZk5vbmJsYW5rLCBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIpOwotCQkJCX0KLQotCQkJCWluZGV4T2ZMaW5lRGVsaW1pdGVyID0gaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyID09IC0xKSB7Ci0JCQkJCXJlc3VsdCArPSBsaW5lSW5kZW50OwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGJsYW5rIGxpbmU7IGp1c3QgYWRkIGEgaW5kZW50Ci0JCQkJCXJlc3VsdCArPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQkJCX0KLQotCQkJCWluZGV4T2ZMaW5lRGVsaW1pdGVyID0gaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCS8vIGxpbmVEZWxpbWl0ZXJGb3VuZCBtZWFucyBtdWx0aSBsaW5lIGNvbW1lbnQKLQkJCVN0cmluZyBub2RlVmFsdWUgPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJYm9vbGVhbiBsaW5lRGVsaW1pdGVyRm91bmRJbkNvbW1lbnQgPSBTdHJpbmdVdGlscy5jb250YWluc0xpbmVEZWxpbWl0ZXIobm9kZVZhbHVlKTsKLQotCQkJaWYgKGxpbmVEZWxpbWl0ZXJGb3VuZEluQ29tbWVudCkgewotCQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBiZWZvcmUgbm9kZQotCQkJCWZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZShub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQotCQkJCS8vIGFkanVzdCBpbmRlbnRhdGlvbnMgaW4gbXVsdGkgbGluZSBjb21tZW50Ci0JCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpOwotCQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCQkJU3RyaW5nIHNpbmdsZUluZGVudCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0SW5kZW50KCk7Ci0JCQkJU3RyaW5nIG5ld05vZGV2YWx1ZSA9IGFkanVzdEluZGVudGF0aW9ucyhub2RlVmFsdWUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50LCBzaW5nbGVJbmRlbnQpOwotCQkJCWlmIChub2RlVmFsdWUuY29tcGFyZVRvKG5ld05vZGV2YWx1ZSkgIT0gMCkKLQkJCQkJbm9kZS5zZXROb2RlVmFsdWUobmV3Tm9kZXZhbHVlKTsKLQkJCX0KLQotCQkJaWYgKCFub2RlSGFzU2libGluZ3Mobm9kZSkgfHwgKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgIT0gbnVsbCAmJiBub2RlLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgIVN0cmluZ1V0aWxzLmNvbnRhaW5zTGluZURlbGltaXRlcihub2RlLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVWYWx1ZSgpKSAmJiBub2RlLmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCkpIHsKLQkJCQkvLyBzaW5nbGUgY2hpbGQKLQkJCQkvLyBvciBpbmxpbmUgY29tbWVudCBhZnRlciB0ZXh0Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfSBlbHNlCi0JCQkJLy8gZm9ybWF0IGluZGVudGF0aW9uIGFmdGVyIG5vZGUKLQkJCQlmb3JtYXRJbmRlbnRhdGlvbkFmdGVyTm9kZShub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0RvY3VtZW50Tm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRG9jdW1lbnROb2RlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5N2RmMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRG9jdW1lbnROb2RlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIHhtbDpzcGFjZT0ncHJlc2VydmUnIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLQotcHVibGljIGNsYXNzIERvY3VtZW50Tm9kZUZvcm1hdHRlciBleHRlbmRzIE5vZGVGb3JtYXR0ZXIgewotCXByb3RlY3RlZCB2b2lkIGZvcm1hdENoaWxkcmVuKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCVN0cmluZyBzaW5nbGVJbmRlbnQgPSBnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldEluZGVudCgpOwotCQlTdHJpbmcgbGluZUluZGVudCA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q3VycmVudEluZGVudCgpOwotCi0JCWlmIChub2RlICE9IG51bGwgJiYgKGZQcm9ncmVzc01vbml0b3IgPT0gbnVsbCB8fCAhZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpKSB7Ci0JCQkvLyBub3JtYWxpemUgbm9kZSBmaXJzdCB0byBjb21iaW5lIGFkamFjZW50IHRleHQgbm9kZXMKLQkJCW5vZGUubm9ybWFsaXplKCk7Ci0KLQkJCUlET01Ob2RlIG5leHRDaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobmV4dENoaWxkICE9IG51bGwpIHsKLQkJCQlJRE9NTm9kZSBlYWNoQ2hpbGROb2RlID0gbmV4dENoaWxkOwotCQkJCW5leHRDaGlsZCA9IChJRE9NTm9kZSkgZWFjaENoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IGdldEZvcm1hdHRlcihlYWNoQ2hpbGROb2RlKTsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgY2hpbGRGb3JtYXRDb250cmFpbnRzID0gZm9ybWF0dGVyLmdldEZvcm1hdENvbnRyYWludHMoKTsKLQkJCQlTdHJpbmcgY2hpbGRJbmRlbnQgPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQkJCWNoaWxkRm9ybWF0Q29udHJhaW50cy5zZXRDdXJyZW50SW5kZW50KGNoaWxkSW5kZW50KTsKLQkJCQljaGlsZEZvcm1hdENvbnRyYWludHMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGZvcm1hdENvbnRyYWludHMuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkpOwotCQkJCWNoaWxkRm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KGZvcm1hdENvbnRyYWludHMuZ2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCgpKTsKLQotCQkJCS8vIGZvcm1hdCBlYWNoIGNoaWxkCi0JCQkJZm9ybWF0dGVyLmZvcm1hdChlYWNoQ2hpbGROb2RlLCBjaGlsZEZvcm1hdENvbnRyYWludHMpOwotCi0JCQkJaWYgKG5leHRDaGlsZCAhPSBudWxsICYmIG5leHRDaGlsZC5nZXRQYXJlbnROb2RlKCkgPT0gbnVsbCkKLQkJCQkJLy8gbmV4dE5vZGUgaXMgZGVsZXRlZCBkdXJpbmcgZm9ybWF0Ci0JCQkJCW5leHRDaGlsZCA9IChJRE9NTm9kZSkgZWFjaENoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJZm9ybWF0Q2hpbGRyZW4obm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRWxlbWVudE5vZGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0VsZW1lbnROb2RlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYWY1NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRWxlbWVudE5vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSB4bWw6c3BhY2U9J3ByZXNlcnZlJyBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BdHRySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgRWxlbWVudE5vZGVGb3JtYXR0ZXIgZXh0ZW5kcyBEb2N1bWVudE5vZGVGb3JtYXR0ZXIgewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGNoYXIgRE9VQkxFX1FVT1RFID0gJyInOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFUyA9ICJcIlwiIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgY2hhciBFUVVBTF9DSEFSID0gJz0nOyAvLyBlcXVhbCBzaWduJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFJFU0VSVkUgPSAicHJlc2VydmUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFJFU0VSVkVfUVVPVEVEID0gIlwicHJlc2VydmVcIiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFID0gJ1wnJzsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFhNTF9TUEFDRSA9ICJ4bWw6c3BhY2UiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjaGFyIFNQQUNFX0NIQVIgPSAnICc7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWFNMX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFhTTF9BVFRSSUJVVEUgPSAiYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBYU0xfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0RW5kVGFnKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmICghaXNFbmRUYWdNaXNzaW5nKG5vZGUpKSB7Ci0JCQkvLyBlbmQgdGFnIGV4aXN0cwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCVN0cmluZyBub2RlSW5kZW50YXRpb24gPSBnZXROb2RlSW5kZW50KG5vZGUpOwotCQkJSURPTU5vZGUgbGFzdENoaWxkID0gKElET01Ob2RlKSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsICYmIGxhc3RDaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJaWYgKGlzRW5kVGFnTWlzc2luZyhsYXN0Q2hpbGQpKSB7Ci0JCQkJCS8vIGZpbmQgZGVlcGVzdCBjaGlsZAotCQkJCQlJRE9NTm9kZSBkZWVwZXN0Q2hpbGQgPSAoSURPTU5vZGUpIGxhc3RDaGlsZC5nZXRMYXN0Q2hpbGQoKTsKLQkJCQkJd2hpbGUgKGRlZXBlc3RDaGlsZCAhPSBudWxsICYmIGRlZXBlc3RDaGlsZC5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmIGlzRW5kVGFnTWlzc2luZyhkZWVwZXN0Q2hpbGQpKSB7Ci0JCQkJCQlsYXN0Q2hpbGQgPSBkZWVwZXN0Q2hpbGQ7Ci0JCQkJCQlkZWVwZXN0Q2hpbGQgPSAoSURPTU5vZGUpIGRlZXBlc3RDaGlsZC5nZXRMYXN0Q2hpbGQoKTsKLQkJCQkJfQotCi0JCQkJCWlmIChkZWVwZXN0Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJaWYgKGRlZXBlc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQkJLy8gU3BlY2lhbCBpbmRlbnRhdGlvbiBoYW5kbGluZyBpZiBsYXN0Q2hpbGQncyBlbmQKLQkJCQkJCQkvLyB0YWcgaXMgbWlzc2luZyBhbmQgZGVlcGVzdENoaWxkIGlzIGEgdGV4dCBub2RlLgotCQkJCQkJCVN0cmluZyBub2RlVGV4dCA9IGRlZXBlc3RDaGlsZC5nZXROb2RlVmFsdWUoKTsKLQotCQkJCQkJCWlmICghbm9kZVRleHQuZW5kc1dpdGgobGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbikpIHsKLQkJCQkJCQkJbm9kZVRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgobm9kZVRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCQkJCQlub2RlVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChub2RlVGV4dCwgbm9kZUluZGVudGF0aW9uKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKGRlZXBlc3RDaGlsZCwgbm9kZVRleHQpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJLy8gaW5kZW50IGVuZCB0YWcKLQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKGxhc3RDaGlsZCwgbGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChsYXN0Q2hpbGQgPT0gbnVsbCAmJiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5zTGluZURlbGltaXRlcnMobm9kZSkpIHsKLQkJCQkvLyBCVUcxNzQyNDMgZG8gbm90IGluZGVudCBlbmQgdGFnIGlmIG5vZGUgaGFzIGVtcHR5IGNvbnRlbnQKLQkJCQkvLyAob3RoZXJ3aXNlIG5ldyB0ZXh0IG5vZGUgd291bGQgYmUgaW50cm9kdWNlZCkKLQkJCQlNb2RlbFF1ZXJ5QWRhcHRlciBhZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSAoKElET01Eb2N1bWVudCkgbm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q01Ob2RlKG5vZGUpOwotCQkJCWlmICgoZWxlbWVudERlY2xhcmF0aW9uID09IG51bGwpIHx8IChlbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGVudFR5cGUoKSAhPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkpIHsKLQkJCQkJLy8gaW5kZW50IGVuZCB0YWcKLQkJCQkJcmVwbGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKSwgMCwgbGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBmb3JtYXQgZW5kIHRhZyBuYW1lCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDMpIHsKLQkJCQlJVGV4dFJlZ2lvbiBlbmRUYWdOYW1lUmVnaW9uID0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJcmVtb3ZlUmVnaW9uU3BhY2VzKG5vZGUsIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZW5kVGFnTmFtZVJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBiZWZvcmUgbm9kZQotCQkJZm9ybWF0SW5kZW50YXRpb25CZWZvcmVOb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQkvLyBmb3JtYXQgc3RhcnQgdGFnCi0JCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQkJCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQotCQkJYm9vbGVhbiBjdXJyZW50bHlJblhtbFNwYWNlUHJlc2VydmUgPSBmb3JtYXRDb250cmFpbnRzLmdldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoKTsKLQkJCWZvcm1hdFN0YXJ0VGFnKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCQkJLy8gc2F2ZSBuZXcgbm9kZQotCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXdOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJCS8vIGZvcm1hdCBjaGlsZHJlbiBhbmQgZW5kIHRhZyBpZiBub3QgZW1wdHkgc3RhcnQgdGFnCi0JCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCQkvLyBmb3JtYXQgY2hpbGRyZW4KLQkJCQkJZm9ybWF0Q2hpbGRyZW4obmV3Tm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0KLQkJCQkJLy8gc2F2ZSBuZXcgbm9kZQotCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsKLQotCQkJCQkvLyBmb3JtYXQgZW5kIHRhZwotCQkJCQlmb3JtYXRFbmRUYWcobmV3Tm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkJfQotCQkJfQotCi0JCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoY3VycmVudGx5SW5YbWxTcGFjZVByZXNlcnZlKTsKLQkJCS8vIG9ubHkgaW5kZW50IGlmIG5vdCBhdCBsYXN0IG5vZGUKLQkJCWlmIChuZXdOb2RlICE9IG51bGwgJiYgbmV3Tm9kZS5nZXROZXh0U2libGluZygpICE9IG51bGwpCi0JCQkJLy8gZm9ybWF0IGluZGVudGF0aW9uIGFmdGVyIG5vZGUKLQkJCQlmb3JtYXRJbmRlbnRhdGlvbkFmdGVyTm9kZShuZXdOb2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGZvcm1hdHMgdGhlIHN0YXJ0IHRhZyBuYW1lLCBhbmQgZm9ybWF0cyB0aGUgYXR0cmlidXRlcyBpZgotCSAqIGF2YWlsYWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRTdGFydFRhZyhJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwgcHJlZmVyZW5jZXMgPSAoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBnZXRGb3JtYXRQcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgc2luZ2xlSW5kZW50ID0gcHJlZmVyZW5jZXMuZ2V0SW5kZW50KCk7Ci0JCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCVN0cmluZyBhdHRySW5kZW50ID0gbGluZUluZGVudCArIHNpbmdsZUluZGVudDsKLQkJYm9vbGVhbiBzcGxpdE11bHRpQXR0cnMgPSBwcmVmZXJlbmNlcy5nZXRTcGxpdE11bHRpQXR0cnMoKTsKLQkJYm9vbGVhbiBhbGlnbkVuZEJyYWNrZXQgPSBwcmVmZXJlbmNlcy5pc0FsaWduRW5kQnJhY2tldCgpOwotCQlib29sZWFuIHNhd1htbFNwYWNlID0gZmFsc2U7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkvLyBOb3RlOiBhdHRyaWJ1dGVzIHNob3VsZCBub3QgYmUgbnVsbCBldmVuIGlmIHRoZSBub2RlIGhhcyBubwotCQkvLyBhdHRyaWJ1dGVzLiBIb3dldmVyLCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpIHdpbGwgYmUgMC4gQnV0LCBjaGVjawotCQkvLyBmb3IgbnVsbCBqdXN0IGluIGNhc2UuCi0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCS8vIGNvbXB1dGUgY3VycmVudCBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJaW50IGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPSAwOwotCQkJdHJ5IHsKLQkJCQkvLyAxIGlzIGZvciAiPCIKLQkJCQlpbnQgbm9kZU5hbWVPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyAxICsgbm9kZS5nZXROb2RlTmFtZSgpLmxlbmd0aCgpOwotCQkJCWludCBsaW5lT2Zmc2V0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChub2RlTmFtZU9mZnNldCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJU3RyaW5nIHRleHQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldChsaW5lT2Zmc2V0LCBub2RlTmFtZU9mZnNldCAtIGxpbmVPZmZzZXQpOwotCQkJCWludCB1c2VkV2lkdGggPSBnZXRJbmRlbnRhdGlvbkxlbmd0aCh0ZXh0KTsKLQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gcHJlZmVyZW5jZXMuZ2V0TGluZVdpZHRoKCkgLSB1c2VkV2lkdGg7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCi0JCQlTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpOwotCQkJaW50IGF0dHJMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJaW50IGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQgPSAwOwotCQkJYm9vbGVhbiBzdGFydFRhZ1NwYW5zT3ZlcjFMaW5lID0gZmFsc2U7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ckxlbmd0aDsgaSsrKSB7Ci0JCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBhdHRyLmdldE5hbWVSZWdpb24oKTsKLQkJCQlJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbiA9IGF0dHIuZ2V0RXF1YWxSZWdpb24oKTsKLQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGF0dHIuZ2V0VmFsdWVSZWdpb24oKTsKLQotCQkJCS8vIGFwcGVuZCB1bmRlZmluZWQgcmVnaW9ucwotCQkJCVN0cmluZyB1bmRlZmluZWRSZWdpb24gPSBnZXRVbmRlZmluZWRSZWdpb25zKG5vZGUsIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQsIGF0dHIuZ2V0U3RhcnRPZmZzZXQoKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQodW5kZWZpbmVkUmVnaW9uKTsKLQkJCQlsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0ID0gYXR0ci5nZXRTdGFydE9mZnNldCgpOwotCi0JCQkJLy8gY2hlY2sgZm9yIHhtbDpzcGFjZSBhdHRyaWJ1dGUKLQkJCQlpZiAoZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKS5jb21wYXJlVG8oWE1MX1NQQUNFKSA9PSAwKSB7Ci0JCQkJCWlmICh2YWx1ZVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCQkvLyBbMTExNjc0XSBJZiBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4geWV0LCB0cmVhdCBhcwotCQkJCQkJLy8gcHJlc2VydmUsIGJ1dCBvbmx5IGFzIGhpbnQKLQkJCQkJCWZvcm1hdENvbnRyYWludHMuc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCh0cnVlKTsKLQkJCQkJCS8vIE5vdGUgd2UgZG9uJ3Qgc2V0ICdzYXdYbWxTcGFjZScsIHNvIHRoYXQgZGVmYXVsdCBvcgotCQkJCQkJLy8gZml4ZWQgRFREL1hTRCB2YWx1ZXMgbWF5IG92ZXJyaWRlLgotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBub2RlLmdldE1vZGVsKCkuZ2V0R2VuZXJhdG9yKCk7Ci0JCQkJCQlTdHJpbmcgbmV3QXR0clZhbHVlID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGF0dHIpOwotCi0JCQkJCQkvLyBUaGVyZSBpcyBhIHByb2JsZW0gaW4KLQkJCQkJCS8vIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0QXR0clZhbHVlKElUZXh0UmVnaW9uKQotCQkJCQkJLy8gd2hlbiB0aGUgcmVnaW9uIGlzIGluc3RhbmNlb2YgQ29udGV4dFJlZ2lvbi4KLQkJCQkJCS8vIFdvcmthcm91bmQgZm9yIG5vdy4KLQkJCQkJCWlmIChmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS5sZW5ndGgoKSA9PSAxKSB7Ci0JCQkJCQkJY2hhciBmaXJzdENoYXIgPSBmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS5jaGFyQXQoMCk7Ci0JCQkJCQkJaWYgKChmaXJzdENoYXIgPT0gRE9VQkxFX1FVT1RFKSB8fCAoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URSkpCi0JCQkJCQkJCW5ld0F0dHJWYWx1ZSA9IERPVUJMRV9RVU9URVM7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChuZXdBdHRyVmFsdWUuY29tcGFyZVRvKFBSRVNFUlZFX1FVT1RFRCkgPT0gMCkKLQkJCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQodHJ1ZSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KGZhbHNlKTsKLQkJCQkJCXNhd1htbFNwYWNlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChzcGxpdE11bHRpQXR0cnMgJiYgYXR0ckxlbmd0aCA+IDEpIHsKLQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyICsgYXR0ckluZGVudCk7Ci0JCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKSk7Ci0JCQkJCXN0YXJ0VGFnU3BhbnNPdmVyMUxpbmUgPSB0cnVlOwotCQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQkJCQl1bmRlZmluZWRSZWdpb24gPSBnZXRVbmRlZmluZWRSZWdpb25zKG5vZGUsIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQsIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KGVxdWFsUmVnaW9uKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCQkJCQkJbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KGVxdWFsUmVnaW9uKTsKLQotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChFUVVBTF9DSEFSKTsKLQotCQkJCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQkJCQl1bmRlZmluZWRSZWdpb24gPSBnZXRVbmRlZmluZWRSZWdpb25zKG5vZGUsIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQsIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCQkJCQkJbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKTsKLQotCQkJCQkJLy8gTm90ZTogdHJpbSgpIHNob3VsZCBub3QgYmUgbmVlZGVkIGZvcgotCQkJCQkJLy8gdmFsdWVSZWdpb24uZ2V0VGV4dCgpLiBKdXN0IGEgd29ya2Fyb3VuZCBmb3IgYQotCQkJCQkJLy8gcHJvYmxlbSBmb3VuZCBpbiB2YWx1ZVJlZ2lvbiBmb3Igbm93LgotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS50cmltKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJaW50IHRleHRMZW5ndGggPSAxICsgZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKS5sZW5ndGgoKSArIDEgKyBmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS5sZW5ndGgoKTsKLQkJCQkJCWlmIChpID09IGF0dHJMZW5ndGggLSAxKSB7Ci0JCQkJCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQkJCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJCQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKQotCQkJCQkJCQkJLy8gMyBpcyBmb3IgIiAvPiIKLQkJCQkJCQkJCXRleHRMZW5ndGggKz0gMzsKLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJLy8gMSBpcyBmb3IgIj4iCi0JCQkJCQkJCQl0ZXh0TGVuZ3RoKys7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA+PSB0ZXh0TGVuZ3RoKSB7Ci0JCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChTUEFDRV9DSEFSKTsKLQkJCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoLS07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGxpbmVEZWxpbWl0ZXIgKyBhdHRySW5kZW50KTsKLQkJCQkJCQlzdGFydFRhZ1NwYW5zT3ZlcjFMaW5lID0gdHJ1ZTsKLQkJCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gcHJlZmVyZW5jZXMuZ2V0TGluZVdpZHRoKCkgLSBhdHRySW5kZW50Lmxlbmd0aCgpOwotCQkJCQkJfQotCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikpOwotCi0JCQkJCQkvLyBhcHBlbmQgdW5kZWZpbmVkIHJlZ2lvbnMKLQkJCQkJCXVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoZXF1YWxSZWdpb24pIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0JCQkJCQlsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoZXF1YWxSZWdpb24pOwotCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKEVRVUFMX0NIQVIpOwotCi0JCQkJCQkvLyBhcHBlbmQgdW5kZWZpbmVkIHJlZ2lvbnMKLQkJCQkJCXVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0JCQkJCQlsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pOwotCi0JCQkJCQkvLyBOb3RlOiB0cmltKCkgc2hvdWxkIG5vdCBiZSBuZWVkZWQgZm9yCi0JCQkJCQkvLyB2YWx1ZVJlZ2lvbi5nZXRUZXh0KCkuIEp1c3QgYSB3b3JrYXJvdW5kIGZvciBhCi0JCQkJCQkvLyBwcm9ibGVtIGZvdW5kIGluIHZhbHVlUmVnaW9uIGZvciBub3cuCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQodmFsdWVSZWdpb24pLnRyaW0oKSk7Ci0KLQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggLT0gZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKS5sZW5ndGgoKTsKLQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgtLTsKLQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggLT0gZmxhdE5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbikudHJpbSgpLmxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPj0gMSArIGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikubGVuZ3RoKCkpIHsKLQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKFNQQUNFX0NIQVIpOwotCQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgtLTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQobGluZURlbGltaXRlciArIGF0dHJJbmRlbnQpOwotCQkJCQkJCXN0YXJ0VGFnU3BhbnNPdmVyMUxpbmUgPSB0cnVlOwotCQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRMaW5lV2lkdGgoKSAtIGF0dHJJbmRlbnQubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKSk7Ci0KLQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggLT0gZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKS5sZW5ndGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQlTdHJpbmcgdW5kZWZpbmVkUmVnaW9uID0gZ2V0VW5kZWZpbmVkUmVnaW9ucyhub2RlLCBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0LCBub2RlLmdldEVuZE9mZnNldCgpIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0KLQkJCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIDEgaXMgZm9yICI8IgotCQkJaW50IG9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIDEgKyBub2RlLmdldE5vZGVOYW1lKCkubGVuZ3RoKCk7Ci0JCQkvLyAxIGlzIGZvciAiPCIKLQkJCWludCBsZW5ndGggPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dExlbmd0aCgpIC0gMSAtIG5vZGUuZ2V0Tm9kZU5hbWUoKS5sZW5ndGgoKTsKLQotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQlJVGV4dFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCi0JCQkJaWYgKGZpcnN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pCi0JCQkJCS8vIHNraXAgZm9ybWF0dGluZyBmb3IgZW5kIHRhZ3MgaW4gdGhpcyBmb3JtYXQ6IDwvdGFnTmFtZT4KLQkJCQkJcmV0dXJuOwotCQkJCWVsc2UgewotCQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkKLQkJCQkJCWxlbmd0aCA9IGxlbmd0aCAtIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCQkJLy8gbGVhdmUgc3BhY2UgYmVmb3JlIFhNTF9FTVBUWV9UQUdfQ0xPU0U6IDx0YWdOYW1lIC8+Ci0JCQkJCQkvLyB1bmxlc3MgYWxyZWFkeSBnb2luZyB0byBtb3ZlIGVuZCBicmFja2V0Ci0JCQkJCQlpZiAoIXN0YXJ0VGFnU3BhbnNPdmVyMUxpbmUgfHwgIWFsaWduRW5kQnJhY2tldCkKLQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKFNQQUNFX0NIQVIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoc3RhcnRUYWdTcGFuc092ZXIxTGluZSAmJiBhbGlnbkVuZEJyYWNrZXQpIHsKLQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpLmFwcGVuZChsaW5lSW5kZW50KTsKLQkJCX0KLQotCQkJcmVwbGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKSk7Ci0KLQkJCS8vIEJVRzEwODA3NCAmIEJVRzg0Njg4IC0gcHJlc2VydmUgd2hpdGVzcGFjZSBpbiB4c2w6dGV4dCAmCi0JCQkvLyB4c2w6YXR0cmlidXRlCi0JCQlTdHJpbmcgbm9kZU5hbWVzcGFjZVVSSSA9IG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQlpZiAoWFNMX05BTUVTUEFDRS5lcXVhbHMobm9kZU5hbWVzcGFjZVVSSSkpIHsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSAoKEVsZW1lbnQpIG5vZGUpLmdldExvY2FsTmFtZSgpOwotCQkJCWlmIChYU0xfQVRUUklCVVRFLmVxdWFscyhub2RlTmFtZSkgfHwgWFNMX1RFWFQuZXF1YWxzKG5vZGVOYW1lKSkgewotCQkJCQlzYXdYbWxTcGFjZSA9IHRydWU7Ci0JCQkJCWZvcm1hdENvbnRyYWludHMuc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIElmIHdlIGRpZG4ndCBzZWUgYSB4bWw6c3BhY2UgYXR0cmlidXRlIGFib3ZlLCB3ZSdsbCBsb29rIGZvcgotCQkJLy8gb25lIGluIHRoZSBEVEQuCi0JCQkvLyBXZSBkbyBub3QgY2hlY2sgZm9yIGEgY29uZmxpY3QgYmV0d2VlbiBhIERURCdzICdmaXhlZCcgdmFsdWUKLQkJCS8vIGFuZCB0aGUgYXR0cmlidXRlIHZhbHVlIGZvdW5kIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCwgd2UKLQkJCS8vIGxlYXZlIHRoYXQgdG8gdGhlIHZhbGlkYXRvci4KLQkJCWlmICghc2F3WG1sU3BhY2UpIHsKLQkJCQlNb2RlbFF1ZXJ5QWRhcHRlciBhZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSAoKElET01Eb2N1bWVudCkgbm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q01Ob2RlKG5vZGUpOwotCQkJCWlmIChlbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgY29udGVudFR5cGUgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJaWYgKHByZWZlcmVuY2VzLmlzUHJlc2VydmVQQ0RBVEFDb250ZW50KCkgJiYgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKSB7Ci0JCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlDTU5hbWVkTm9kZU1hcCBjbUF0dHJpYnV0ZXMgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJLy8gQ2hlY2sgaW1wbGllZCB2YWx1ZXMgZnJvbSB0aGUgRFREIHdheS4KLQkJCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlRGVjbGFyYXRpb24gPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21BdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShYTUxfU1BBQ0UpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJCQkvLyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGZvdW5kLCBjaGVjayBpdCBvdXQuCi0JCQkJCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldEF0dHJUeXBlKCkuZ2V0SW1wbGllZFZhbHVlKCk7Ci0KLQkJCQkJCQkvLyB4bWw6c3BhY2U9InByZXNlcnZlIiBtZWFucyBwcmVzZXJ2ZSBzcGFjZSwKLQkJCQkJCQkvLyBldmVyeXRoaW5nIGVsc2UgbWVhbnMgYmFjayB0byBkZWZhdWx0LgotCQkJCQkJCWlmIChQUkVTRVJWRS5jb21wYXJlVG8oZGVmYXVsdFZhbHVlKSA9PSAwKQotCQkJCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQodHJ1ZSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbmRlZmluZWRSZWdpb25zKElET01Ob2RlIG5vZGUsIGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gTm9kZUZvcm1hdHRlci5FTVBUWV9TVFJJTkc7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCi0JCQlpZiAocmVnaW9uVHlwZS5jb21wYXJlVG8oRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQpID09IDAgJiYgcmVnaW9uU3RhcnRPZmZzZXQgPj0gc3RhcnRPZmZzZXQgJiYgcmVnaW9uU3RhcnRPZmZzZXQgPCBzdGFydE9mZnNldCArIGxlbmd0aCkKLQkJCQlyZXN1bHQgPSByZXN1bHQgKyBmbGF0Tm9kZS5nZXRGdWxsVGV4dChyZWdpb24pOwotCQl9Ci0KLQkJaWYgKHJlc3VsdC5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gU1BBQ0VfQ0hBUiArIHJlc3VsdC50cmltKCk7Ci0JCWVsc2UKLQkJCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Gb3JtYXRQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5OGRiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Gb3JtYXRQcm9jZXNzb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5BYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEZvcm1hdFByb2Nlc3NvclhNTCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZkZvcm1hdFByZWZlcmVuY2VzID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICJ4bWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuc2V0U3BsaXRNdWx0aUF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQkJCSgoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldEFsaWduRW5kQnJhY2tldChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQpKTsKLQkJCQkoKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRQcmVzZXJ2ZVBDREFUQUNvbnRlbnQocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBSRVNFUlZFX0NEQVRBQ09OVEVOVCkpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJCX0KLQkJCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJCX0KLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KGluZGVudC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmRm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGdldEZvcm1hdHRlcihOb2RlIG5vZGUpIHsKLQkJLy8gMjYyMTM1IC0gTlBFIGR1cmluZyBmb3JtYXQgb2YgZW1wdHkgZG9jdW1lbnQKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBudWxsOwotCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBFbGVtZW50Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgVGV4dE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vTW92ZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgQ29tbWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBEb2N1bWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vTW92ZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdCA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgTm9kZUZvcm1hdHRlcigpOwotCQkJfQotCQl9Ci0KLQkJLy8gaW5pdCBmb21hdHRlcgotCQlmb3JtYXR0ZXIuc2V0Rm9ybWF0UHJlZmVyZW5jZXMoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSk7Ci0JCWZvcm1hdHRlci5zZXRQcm9ncmVzc01vbml0b3IoZlByb2dyZXNzTW9uaXRvcik7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlmRm9ybWF0UHJlZmVyZW5jZXMgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L05vTW92ZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9Nb3ZlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNjhlY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9Nb3ZlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogRm9ybWF0cyBlbnRpdGllcyB3aGljaCByZWFsbHkgbmVlZCBubyBmb3JtYXR0aW5nLiBUaGV5IGFyZSBqdXN0IGxpa2UgdGV4dAotICogbm9kZXMuCi0gKi8KLWNsYXNzIE5vTW92ZUZvcm1hdHRlciBleHRlbmRzIE5vZGVGb3JtYXR0ZXIgewotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBub2RlIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRJbmRlbnRhdGlvbkFmdGVyTm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBzdGlsbCBkbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9kZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhlZDE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L05vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSB4bWw6c3BhY2U9J3ByZXNlcnZlJyBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNEQVRBU2VjdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNoYXJhY3RlckRhdGFJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Db21tZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuVGFnTmFtZVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOb2RlRm9ybWF0dGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgewotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgY2hhciBTUEFDRV9DSEFSID0gJyAnOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgY2hhciBUQUJfQ0hBUiA9ICdcdCc7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFCID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZkZvcm1hdENvbnRyYWludHMgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZGb3JtYXRQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5zTGluZURlbGltaXRlcnMoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblRleHQgPSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQkJcmVzdWx0ID0gU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVGV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdChOb2RlIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMgPSBnZXRGb3JtYXRDb250cmFpbnRzKCk7Ci0KLQkJZm9ybWF0KG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdChOb2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmIChmb3JtYXRDb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCkpCi0JCQlmb3JtYXRDb250cmFpbnRzLnNldEN1cnJlbnRJbmRlbnQoZ2V0U2libGluZ0luZGVudChub2RlKSk7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLQkJCWZvcm1hdE5vZGUoKElET01Ob2RlKSBub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRJbmRlbnRhdGlvbkFmdGVyTm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBbMTExNjc0XSBJZiBpbnNpZGUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZWxlbWVudCwgd2UgYmFpbAotCQlpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlET01Ob2RlIG5leHRTaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZ2V0TGluZURlbGltaXRlcihub2RlLCBkb2MpOwotCi0JCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgewotCQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQkJaWYgKG5leHRTaWJsaW5nICE9IG51bGwpCi0JCQkJCQlpZiAobmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCQlnZXRGb3JtYXR0ZXIobmV4dFNpYmxpbmcpLmZvcm1hdChuZXh0U2libGluZywgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkJCQllbHNlIGlmIChuZXh0U2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFKSB7Ci0JCQkJCQkJLy8gZG8gbm90aGluZwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJfQotCi0JCQkJZWxzZSBpZiAobmV4dFNpYmxpbmcgIT0gbnVsbCkKLQkJCQkJaWYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQlnZXRGb3JtYXR0ZXIobmV4dFNpYmxpbmcpLmZvcm1hdChuZXh0U2libGluZywgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkJCWVsc2UgaWYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpIHsKLQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlET01Ob2RlIGluZGVudE5vZGUgPSBnZXRQYXJlbnRJbmRlbnROb2RlKG5vZGUpOwotCQkJCQlTdHJpbmcgbGluZUluZGVudCA9IGdldE5vZGVJbmRlbnQoaW5kZW50Tm9kZSk7Ci0JCQkJCUlET01Ob2RlIGxhc3RDaGlsZCA9IGdldERlZXBlc3RDaGlsZE5vZGUobm9kZSk7Ci0JCQkJCWJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzID0gZm9ybWF0Q29udHJhaW50cy5nZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCQkJCQlpZiAobGFzdENoaWxkICE9IG51bGwpIHsKLQkJCQkJCWlmICgobGFzdENoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChsYXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpKSkgewotCQkJCQkJCS8vIHRoaXMgdGV4dCBub2RlIGFscmVhZHkgZW5kcyB3aXRoIHRoZSByZXF1ZXN0ZWQKLQkJCQkJCQkvLyBpbmRlbnRhdGlvbgotCQkJCQkJfQotCi0JCQkJCQllbHNlIGlmICgobGFzdENoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChsYXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCkgIT0gbnVsbCAmJiBsYXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlcikpKQotCQkJCQkJCWlmIChjbGVhckFsbEJsYW5rTGluZXMpIHsKLQkJCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobGFzdENoaWxkLCBsaW5lSW5kZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChsYXN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCQlpZiAobGFzdENoaWxkLmdldE5vZGVWYWx1ZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQkJLy8gcmVwbGFjZQotCQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKGxhc3RDaGlsZCwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBhcyBsb25nIGFzIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudAotCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQkJaWYgKGVuZFJlZ2lvbiAhPSBudWxsICYmIGVuZFJlZ2lvbi5nZXROZXh0KCkgIT0gbnVsbCkKLQkJCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBbMTExNjc0XSBJZiBpbnNpZGUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZWxlbWVudCwgd2UgYmFpbAotCQlpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlET01Ob2RlIHByZXZpb3VzU2libGluZyA9IChJRE9NTm9kZSkgbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUsIGRvYyk7Ci0KLQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0KLQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCWlmIChwcmV2aW91c1NpYmxpbmcgIT0gbnVsbCkKLQkJCQkJCWlmIChwcmV2aW91c1NpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCQlnZXRGb3JtYXR0ZXIocHJldmlvdXNTaWJsaW5nKS5mb3JtYXQocHJldmlvdXNTaWJsaW5nLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQkJCWVsc2UgewotCQkJCQkJCWluc2VydEJlZm9yZU5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHByZXZpb3VzU2libGluZyA9PSBudWxsIHx8IHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQkvLyAyNjE5NjggLSBmb3JtYXR0aW5nIHRhZyB3aXRob3V0IGNsb3NpbmcgYnJhY2tldDoKLQkJCQkJCS8vIDx0MT48dDEKLQkJCQkJCS8vIDI2NTY3MyAtIE51bGwgcHRyIGluIGZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZQotCQkJCQkJaW50IHByZXZFbmROb2RlT2Zmc2V0ID0gLTE7Ci0JCQkJCQlpbnQgcHJldkVuZFJlZ2lvbk9mZnNldCA9IC0xOwotCQkJCQkJaWYgKHByZXZpb3VzU2libGluZyAhPSBudWxsKSB7Ci0JCQkJCQkJcHJldkVuZE5vZGVPZmZzZXQgPSBwcmV2aW91c1NpYmxpbmcuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSBwcmV2aW91c1NpYmxpbmcuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQkJaWYgKGVuZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCXByZXZFbmRSZWdpb25PZmZzZXQgPSBlbmRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICgocHJldmlvdXNTaWJsaW5nID09IG51bGwpIHx8IChwcmV2RW5kTm9kZU9mZnNldCAhPSAtMSAmJiBwcmV2RW5kTm9kZU9mZnNldCA9PSBwcmV2RW5kUmVnaW9uT2Zmc2V0KSkgewotCQkJCQkJCWluc2VydEJlZm9yZU5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nLmdldE5vZGVWYWx1ZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShwcmV2aW91c1NpYmxpbmcsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCWlmICghcHJldmlvdXNTaWJsaW5nLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkgewotCQkJCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIpKSB7Ci0JCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUocHJldmlvdXNTaWJsaW5nLCBsaW5lSW5kZW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQlnZXRGb3JtYXR0ZXIocHJldmlvdXNTaWJsaW5nKS5mb3JtYXQocHJldmlvdXNTaWJsaW5nLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jKSB7Ci0JCWludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCXRyeSB7Ci0JCQlpZiAobGluZSA+IDApIHsKLQkJCQlsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIobGluZSAtIDEpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCS8vIEJVRzExNTcxNjogaWYgY2Fubm90IGdldCBsaW5lIGRlbGltaXRlciBmcm9tIGN1cnJlbnQgbGluZSwganVzdAotCQkvLyB1c2UgZGVmYXVsdCBsaW5lIGRlbGltaXRlcgotCQlpZiAobGluZURlbGltaXRlciA9PSBudWxsKQotCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCXJldHVybiBsaW5lRGVsaW1pdGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsIHx8ICFmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkpIHsKLQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBiZWZvcmUgbm9kZQotCQkJZm9ybWF0SW5kZW50YXRpb25CZWZvcmVOb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQkvLyBmb3JtYXQgaW5kZW50YXRpb24gYWZ0ZXIgbm9kZQotCQkJZm9ybWF0SW5kZW50YXRpb25BZnRlck5vZGUobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGNvbXB1dGUgdGhlIGNvcnJlY3QgaW5kZW50YXRpb24gYWZ0ZXIgdGhpcyBub2RlCi0JICogZGVwZW5kaW5nIG9uIHRoZSBpbmRlbnRhdGlvbnMgb2YgaXRzIHNpYmxpbmcgbm9kZXMgYW5kIHBhcmVudCBub2RlLiBOb3QKLQkgKiBuZWVkZWQgYW55bW9yZT8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRUcmFpbGluZ1RleHQoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJLy8gWzExMTY3NF0gSWYgaW5zaWRlIHhtbDpzcGFjZT0icHJlc2VydmUiIGVsZW1lbnQsIHdlIGJhaWwKLQkJaWYgKGZvcm1hdENvbnRyYWludHMuZ2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCgpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gbm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJU3RyaW5nIHBhcmVudExpbmVJbmRlbnQgPSBnZXROb2RlSW5kZW50KG5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLQkJYm9vbGVhbiBjbGVhckFsbEJsYW5rTGluZXMgPSBmb3JtYXRDb250cmFpbnRzLmdldENsZWFyQWxsQmxhbmtMaW5lcygpOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCUlET01Ob2RlIG5leHRTaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoKG5leHRTaWJsaW5nICE9IG51bGwpICYmIChuZXh0U2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSkgewotCQkJCVN0cmluZyBuZXh0U2libGluZ1RleHQgPSBuZXh0U2libGluZy5nZXROb2RlVmFsdWUoKTsKLQkJCQlpZiAobmV4dFNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKQotCQkJCQlpZiAoKG5leHRTaWJsaW5nLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKG5leHRTaWJsaW5nVGV4dC50cmltKCkubGVuZ3RoKCkgPT0gMCkpCi0JCQkJCQkvLyBkZWxldGUgc3BhY2VzIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50Ci0JCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5leHRTaWJsaW5nLCBFTVBUWV9TVFJJTkcpOwotCQkJCQllbHNlCi0JCQkJCQkvLyByZXBsYWNlIHRoZSB0ZXh0IG5vZGUgd2l0aCBwYXJlbnQgaW5kZW50YXRpb24KLQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobmV4dFNpYmxpbmcsIGxpbmVEZWxpbWl0ZXIgKyBwYXJlbnRMaW5lSW5kZW50KTsKLQkJCQllbHNlCi0JCQkJCS8vIHJlcGxhY2UgdGhlIHRleHQgbm9kZSB3aXRoIGluZGVudGF0aW9uCi0JCQkJCXJlcGxhY2VOb2RlVmFsdWUobmV4dFNpYmxpbmcsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChuZXh0U2libGluZyA9PSBudWxsKSB7Ci0JCQkJCWxpbmVJbmRlbnQgPSBwYXJlbnRMaW5lSW5kZW50OwotCi0JCQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCkpKSB7Ci0JCQkJCQkJLy8gdGhpcyB0ZXh0IG5vZGUgYWxyZWFkeSBlbmRzIHdpdGggdGhlIHJlcXVlc3RlZAotCQkJCQkJCS8vIGluZGVudGF0aW9uCi0JCQkJCQl9Ci0KLQkJCQkJCWVsc2UgaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIpKSkKLQkJCQkJCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKQotCQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZUluZGVudCk7Ci0JCQkJCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJCQkJLy8gcmVwbGFjZQotCQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJaWYgKCFub2RlLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkKLQkJCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlcikpCi0JCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZUluZGVudCk7Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCkpKSB7Ci0JCQkJCQkvLyB0aGlzIHRleHQgbm9kZSBhbHJlYWR5IGVuZHMgd2l0aCB0aGUgcmVxdWVzdGVkCi0JCQkJCQkvLyBpbmRlbnRhdGlvbgotCQkJCQl9Ci0KLQkJCQkJZWxzZSBpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlcikpKQotCQkJCQkJaWYgKGNsZWFyQWxsQmxhbmtMaW5lcykKLQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCWVsc2UKLQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZUluZGVudCk7Ci0JCQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCWlmIChub2RlLmdldE5vZGVWYWx1ZSgpLmxlbmd0aCgpID09IDApCi0JCQkJCQkJLy8gcmVwbGFjZQotCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJZWxzZQotCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCWVsc2UKLQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgZ2V0RGVlcGVzdENoaWxkTm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0JCUlET01Ob2RlIGxhc3RDaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQotCQlpZiAobGFzdENoaWxkID09IG51bGwpCi0JCQlyZXN1bHQgPSBub2RlOwotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGdldERlZXBlc3RDaGlsZE5vZGUobGFzdENoaWxkKTsKLQotCQkJaWYgKChyZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSB8fCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkgJiYgIWlzRW5kVGFnTWlzc2luZyhub2RlKSkKLQkJCQlyZXN1bHQgPSBub2RlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGdldEZvcm1hdENvbnRyYWludHMoKSB7Ci0JCWlmIChmRm9ybWF0Q29udHJhaW50cyA9PSBudWxsKSB7Ci0JCQlmRm9ybWF0Q29udHJhaW50cyA9IG5ldyBTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cygpOwotCi0JCQlmRm9ybWF0Q29udHJhaW50cy5zZXRDbGVhckFsbEJsYW5rTGluZXMoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRDbGVhckFsbEJsYW5rTGluZXMoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdENvbnRyYWludHM7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuc2V0U3BsaXRNdWx0aUF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQkJCSgoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldEFsaWduRW5kQnJhY2tldChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQpKTsKLQkJCQkoKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRQcmVzZXJ2ZVBDREFUQUNvbnRlbnQocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBSRVNFUlZFX0NEQVRBQ09OVEVOVCkpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJCX0KLQkJCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJCX0KLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KGluZGVudC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmRm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGdldEZvcm1hdHRlcihJRE9NTm9kZSBub2RlKSB7Ci0JCS8vIDI2MjEzNSAtIE5QRSBkdXJpbmcgZm9ybWF0IG9mIGVtcHR5IGRvY3VtZW50Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlzaG9ydCBub2RlVHlwZSA9ICgoTm9kZSkgbm9kZSkuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbnVsbDsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgRWxlbWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IFRleHROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBOb01vdmVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IENvbW1lbnROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBOb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgRG9jdW1lbnROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBOb01vdmVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGluaXQgZm9tYXR0ZXIKLQkJZm9ybWF0dGVyLnNldEZvcm1hdFByZWZlcmVuY2VzKGdldEZvcm1hdFByZWZlcmVuY2VzKCkpOwotCQlmb3JtYXR0ZXIuc2V0UHJvZ3Jlc3NNb25pdG9yKGZQcm9ncmVzc01vbml0b3IpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRJbmRlbnRhdGlvbkxlbmd0aChTdHJpbmcgaW5kZW50KSB7Ci0JCS8vIFRPRE8gS2l0IDogVGhlIGNhbGN1bGF0aW9uIG9mIEluZGVudGF0aW9uTGVuZ3RoIGlzIG5vdCBjb3JyZWN0Ci0JCS8vIGhlcmUuCi0JCS8vIG5vZGVJbmRlbnRhdGlvbiBtYXkgY29udGFpbiB0YWJzLiBNdWx0aXBseSBieSA0IHRlbXBvcmFyaWx5IHRvIGdldAotCQkvLyBhcHByb3guIHdpZHRoLgotCQkvLyBOZWVkIHRvIHJlLXdvcmsuCi0KLQkJaW50IGluZGVudGF0aW9uTGVuZ3RoID0gMDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoaW5kZW50LnN1YnN0cmluZyhpLCBpICsgMSkuY29tcGFyZVRvKFRBQikgPT0gMCkKLQkJCQlpbmRlbnRhdGlvbkxlbmd0aCArPSA0OwotCQkJZWxzZQotCQkJCWluZGVudGF0aW9uTGVuZ3RoKys7Ci0JCX0KLQotCQlyZXR1cm4gaW5kZW50YXRpb25MZW5ndGg7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgZmluZCB0aGUgaW5kZW50YXRpb24gZm9yIHRoaXMgbm9kZS4gSXQgd2lsbCBzZWFyY2gKLQkgKiBiYWNrd2FyZHMgc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBub2RlIHVudGlsIGEgY2hhcmFjdGVyCi0JICogb3RoZXIgdGhhbiBhIHNwYWNlIG9yIGEgdGFiIGlzIGZvdW5kLiBJZiB0aGlzIG5vZGUgaXMgbnVsbCBvciBpdCdzIGEKLQkgKiBkb2N1bWVudCBub2RlIG9yIGl0J3MgYSBmaXJzdCBsZXZlbCBub2RlIChub2RlJ3MgcGFyZW50IGlzIGEgZG9jdW1lbnQKLQkgKiBub2RlKSB0aGUgZGVmYXVsdCBlbXB0eSBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZCBhcyB0aGUgaW5kZW50YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROb2RlSW5kZW50KE5vZGUgbm9kZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gRU1QVFlfU1RSSU5HOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpICYmIChub2RlLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCUlET01Ob2RlIHNpYmxpbmdUZXh0Tm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCWlmICgoc2libGluZ1RleHROb2RlICE9IG51bGwpICYmIChzaWJsaW5nVGV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkpIHsKLQkJCQkvLyBmaW5kIHRoZSBpbmRlbnRhdGlvbgotCQkJCVN0cmluZyBzaWJsaW5nVGV4dCA9IHNpYmxpbmdUZXh0Tm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQlpbnQgc2libGluZ1RleHRMZW5ndGggPSBzaWJsaW5nVGV4dC5sZW5ndGgoKTsKLQkJCQlpZiAoKHNpYmxpbmdUZXh0ICE9IG51bGwpICYmIChzaWJsaW5nVGV4dExlbmd0aCA+IDApICYmICgoc2libGluZ1RleHQuY2hhckF0KHNpYmxpbmdUZXh0TGVuZ3RoIC0gMSkgPT0gU1BBQ0VfQ0hBUikgfHwgKHNpYmxpbmdUZXh0LmNoYXJBdChzaWJsaW5nVGV4dExlbmd0aCAtIDEpID09IFRBQl9DSEFSKSkpIHsKLQkJCQkJaW50IHNlYXJjaEluZGV4ID0gc2libGluZ1RleHRMZW5ndGggLSAxOwotCQkJCQl3aGlsZSAoKHNlYXJjaEluZGV4ID49IDApICYmICgoc2libGluZ1RleHQuY2hhckF0KHNlYXJjaEluZGV4KSA9PSBTUEFDRV9DSEFSKSB8fCAoc2libGluZ1RleHQuY2hhckF0KHNlYXJjaEluZGV4KSA9PSBUQUJfQ0hBUikpKQotCQkJCQkJc2VhcmNoSW5kZXgtLTsKLQotCQkJCQlpZiAoc2VhcmNoSW5kZXggPCBzaWJsaW5nVGV4dExlbmd0aCkKLQkJCQkJCXJlc3VsdCA9IHNpYmxpbmdUZXh0LnN1YnN0cmluZyhzZWFyY2hJbmRleCArIDEsIHNpYmxpbmdUZXh0TGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9kZU5hbWUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZS5nZXROb2RlTmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9kZVRleHQoSURPTU5vZGUgbm9kZSkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0KLQkJaWYgKChub2RlIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YUltcGwpICYmICEobm9kZSBpbnN0YW5jZW9mIENvbW1lbnRJbXBsKSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBDREFUQVNlY3Rpb25JbXBsKSAmJiAhaXNKU1BUYWcobm9kZSkpCi0JCQl0ZXh0ID0gKChDaGFyYWN0ZXJEYXRhSW1wbCkgbm9kZSkuZ2V0U291cmNlKCk7Ci0JCWVsc2UKLQkJCXRleHQgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBnZXRQYXJlbnRJbmRlbnROb2RlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTU5vZGUgcmVzdWx0ID0gbnVsbDsKLQkJSURPTU5vZGUgcGFyZW50Tm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQlyZXN1bHQgPSBwYXJlbnROb2RlOwotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHBhcmVudE5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEZpcnN0UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pCi0JCQkJcmVzdWx0ID0gcGFyZW50Tm9kZTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPSBnZXRQYXJlbnRJbmRlbnROb2RlKHBhcmVudE5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGZpbmQgdGhlIGluZGVudGF0aW9uIGZvciBhIG5vZGUgc2libGluZyB0byB0aGlzIG5vZGUuCi0JICogSXQgd2lsbCB0cnkgdG8gZmluZCBhIHNpYmxpbmcgbm9kZSBiZWZvcmUgdGhpcyBub2RlIGZpcnN0LiBJZiB0aGVyZSBpcwotCSAqIG5vIHNpYmxpbmcgbm9kZSBiZWZvcmUgdGhpcyBub2RlLCBpdCB3aWxsIHRyeSB0byBmaW5kIGEgc2libGluZyBub2RlCi0JICogYWZ0ZXIgdGhpcyBub2RlLiBJZiBzdGlsbCBub3QgZm91bmQsIHdlIHdpbGwgY2hlY2sgaWYgdGhpcyBub2RlIGlzCi0JICogYWxyZWFkeSBpbmRlbnRlZCBmcm9tIGl0cyBwYXJlbnQuIElmIHllcywgdGhpcyBub2RlJ3MgaW5kZW50YXRpb24gd2lsbAotCSAqIGJlIHVzZWQuIE90aGVyd2lzZSwgdGhlIHBhcmVudCBub2RlJ3MgaW5kZW50YXRpb24gcGx1cyBvbmUgaW5kZW50YXRpb24KLQkgKiB3aWxsIGJlIHVzZWQuIElmIHRoaXMgbm9kZSBpcyBudWxsIG9yIGl0J3MgYSBkb2N1bWVudCBub2RlIG9yIGl0J3MgYQotCSAqIGZpcnN0IGxldmVsIG5vZGUgKG5vZGUncyBwYXJlbnQgaXMgYSBkb2N1bWVudCBub2RlKSB0aGUgZGVmYXVsdCBlbXB0eQotCSAqIHN0cmluZyB3aWxsIGJlIHJldHVybmVkIGFzIHRoZSBpbmRlbnRhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNpYmxpbmdJbmRlbnQoTm9kZSBub2RlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBFTVBUWV9TVFJJTkc7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJLy8gZmluZCB0aGUgdGV4dCBub2RlIGJlZm9yZSB0aGUgcHJldmlvdXMgbm9uLXRleHQgc2libGluZwotCQkJLy8gaWYgdGhhdCdzIG5vdCBmb3VuZCwgd2Ugd2lsbCB0cnkgdGhlIHRleHQgbm9kZSBiZWZvcmUgdGhlIG5leHQKLQkJCS8vIG5vbi10ZXh0IHNpYmxpbmcKLQkJCUlET01Ob2RlIHNpYmxpbmcgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQl3aGlsZSAoKHNpYmxpbmcgIT0gbnVsbCkgJiYgKHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSB8fCBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpKSB7Ci0JCQkJaWYgKHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSAmJiBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpICE9IG51bGwgJiYgc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIFN0cmluZ1V0aWxzLmNvbnRhaW5zTGluZURlbGltaXRlcihzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVWYWx1ZSgpKSkKLQkJCQkJYnJlYWs7Ci0JCQkJc2libGluZyA9IChJRE9NTm9kZSkgc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCX0KLQkJCWlmIChzaWJsaW5nID09IG51bGwpIHsKLQkJCQlzaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJd2hpbGUgKChzaWJsaW5nICE9IG51bGwpICYmIChzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpKQotCQkJCQlzaWJsaW5nID0gKElET01Ob2RlKSBzaWJsaW5nLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgc2luZ2xlSW5kZW50ID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRJbmRlbnQoKTsKLQkJCVN0cmluZyBwYXJlbnRMaW5lSW5kZW50ID0gZ2V0Tm9kZUluZGVudChub2RlLmdldFBhcmVudE5vZGUoKSk7Ci0KLQkJCWlmIChzaWJsaW5nICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc2libGluZ0luZGVudCA9IGdldE5vZGVJbmRlbnQoc2libGluZyk7Ci0JCQkJaWYgKHNpYmxpbmdJbmRlbnQubGVuZ3RoKCkgPiAwKQotCQkJCQlyZXN1bHQgPSBzaWJsaW5nSW5kZW50OwotCQkJCWVsc2UgewotCQkJCQlTdHJpbmcgbm9kZUluZGVudCA9IGdldE5vZGVJbmRlbnQobm9kZSk7Ci0JCQkJCWlmIChub2RlSW5kZW50Lmxlbmd0aCgpID4gcGFyZW50TGluZUluZGVudC5sZW5ndGgoKSkKLQkJCQkJCS8vIHRoaXMgbm9kZSBpcyBpbmRlbnRlZCBmcm9tIGl0cyBwYXJlbnQsIGl0cwotCQkJCQkJLy8gaW5kZW50YXRpb24gd2lsbCBiZSB1c2VkCi0JCQkJCQlyZXN1bHQgPSBub2RlSW5kZW50OwotCQkJCQllbHNlCi0JCQkJCQlyZXN1bHQgPSBwYXJlbnRMaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCVN0cmluZyBub2RlSW5kZW50ID0gZ2V0Tm9kZUluZGVudChub2RlKTsKLQkJCQlpZiAobm9kZUluZGVudC5sZW5ndGgoKSA+IHBhcmVudExpbmVJbmRlbnQubGVuZ3RoKCkpCi0JCQkJCS8vIHRoaXMgbm9kZSBpcyBpbmRlbnRlZCBmcm9tIGl0cyBwYXJlbnQsIGl0cyBpbmRlbnRhdGlvbgotCQkJCQkvLyB3aWxsIGJlIHVzZWQKLQkJCQkJcmVzdWx0ID0gbm9kZUluZGVudDsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdCA9IHBhcmVudExpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydEFmdGVyTm9kZShJRE9NTm9kZSBub2RlLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCWludCBvZmZzZXQgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQkvLyAyNjE5NjggLSBmb3JtYXR0aW5nIHRhZyB3aXRob3V0IGNsb3NpbmcgYnJhY2tldDogPHQxPjx0MQotCQlpZiAobm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQlvZmZzZXQgPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRFbmRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0JCX0KLQkJcmVwbGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBzdHJpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydEJlZm9yZU5vZGUoSURPTU5vZGUgbm9kZSwgU3RyaW5nIHN0cmluZykgewotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlyZXBsYWNlKHN0cnVjdHVyZWREb2N1bWVudCwgbm9kZS5nZXRTdGFydE9mZnNldCgpLCAwLCBzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoSVN0cnVjdHVyZWRGb3JtYXR0ZXIuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5kVGFnTWlzc2luZyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAhaXNKU1BUYWcobm9kZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQlJVGV4dFJlZ2lvbiBzdGFydFRhZ05hbWVSZWdpb24gPSBudWxsOwotCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkgPiAxKQotCQkJCXN0YXJ0VGFnTmFtZVJlZ2lvbiA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlJVGV4dFJlZ2lvbiBlbmRUYWdOYW1lUmVnaW9uID0gbnVsbDsKLQkJCWlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpCi0JCQkJZW5kVGFnTmFtZVJlZ2lvbiA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCi0JCQlJVGV4dFJlZ2lvbkxpc3Qgc3RhcnRUYWdSZWdpb25zID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHN0YXJ0VGFnTmFtZVJlZ2lvbiA9PSBlbmRUYWdOYW1lUmVnaW9uICYmIHN0YXJ0VGFnTmFtZVJlZ2lvbiAhPSBudWxsICYmIChzdGFydFRhZ1JlZ2lvbnMuZ2V0KDApKS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOICYmIChzdGFydFRhZ1JlZ2lvbnMuZ2V0KHN0YXJ0VGFnUmVnaW9ucy5zaXplKCkgLSAxKS5nZXRUeXBlKCkpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkKLQkJCQkvLyBlbmQgdGFnIG1pc3NpbmcKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub2RlSGFzU2libGluZ3MoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgIT0gbnVsbCkgfHwgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlIGNoYW5nZWQuIE5vIGZvcm1hdCBzaG91bGQgYmUgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlZ2lvblNwYWNlcyhJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKChyZWdpb24gIT0gbnVsbCkgJiYgKHJlZ2lvbiBpbnN0YW5jZW9mIENvbnRleHRSZWdpb24gfHwgcmVnaW9uIGluc3RhbmNlb2YgVGFnTmFtZVJlZ2lvbikgJiYgKGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pID4gZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pKSkgewotCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCQlyZXBsYWNlKHN0cnVjdHVyZWREb2N1bWVudCwgZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pLCBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKSAtIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSwgRU1QVFlfU1RSSU5HKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmVwbGFjZSB0aGUgc3RyaW5nIGF0IG9mZnNldCBhbmQgbGVuZ3RoIHdpdGggYSBuZXcKLQkgKiBzdHJpbmcuIElmIHRoZSBzdHJpbmcgdG8gYmUgcmVwbGFjZWQgaXMgdGhlIHNhbWUgYXMgdGhlIG5ldyBzdHJpbmcsIHRoZQotCSAqIHN0cmluZyB3aWxsIG5vdCBiZSByZXBsYWNlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RydWN0dXJlZERvY3VtZW50U3RyaW5nID0gc3RydWN0dXJlZERvY3VtZW50LmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50U3RyaW5nLmNvbXBhcmVUbyhzdHJpbmcpICE9IDApCi0JCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIHN0cmluZyk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJlcGxhY2UgdGhlIG5vZGUgdmFsdWUgd2l0aCBhIG5ldyBzdHJpbmcuIElmIHRoZSBub2RlCi0JICogdmFsdWUgdG8gYmUgcmVwbGFjZWQgaXMgdGhlIHNhbWUgYXMgdGhlIG5ldyBzdHJpbmcsIHRoZSBub2RlIHZhbHVlIHdpbGwKLQkgKiBub3QgYmUgcmVwbGFjZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZU5vZGVWYWx1ZShJRE9NTm9kZSBub2RlLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpbnQgb2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gbm9kZS5nZXRFbmRPZmZzZXQoKSAtIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQl0cnkgewotCQkJU3RyaW5nIHN0cnVjdHVyZWREb2N1bWVudFN0cmluZyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFN0cmluZy5jb21wYXJlVG8oc3RyaW5nKSAhPSAwKQotCQkJCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc3RyaW5nKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFByZWZlcmVuY2VzKElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZm9ybWF0UHJlZmVyZW5jZXMpIHsKLQkJZkZvcm1hdFByZWZlcmVuY2VzID0gZm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyI3NldFByb2dyZXNzTW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNKU1BUYWcoTm9kZSBub2RlKSB7Ci0KLQkJZmluYWwgU3RyaW5nIEpTUF9DTE9TRSA9ICJKU1BfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCS8vIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9DTE9TRSA9ICJKU1BfQ09NTUVOVF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfT1BFTiA9ICJKU1BfQ09NTUVOVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfVEVYVCA9ICJKU1BfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbmFsIFN0cmluZyBKU1BfQ09OVEVOVCA9ICJKU1BfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTl9PUEVOID0gIkpTUF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9DTE9TRSA9ICJKU1BfRElSRUNUSVZFX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9OQU1FID0gIkpTUF9ESVJFQ1RJVkVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9PUEVOID0gIkpTUF9ESVJFQ1RJVkVfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OX09QRU4gPSAiSlNQX0VYUFJFU1NJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX1JPT1RfVEFHX05BTUUgPSAiSlNQX1JPT1RfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkJZmluYWwgU3RyaW5nIEpTUF9TQ1JJUFRMRVRfT1BFTiA9ICJKU1BfU0NSSVBUTEVUX09QRU4iOyAvLyROT04tTkxTLTEkCi0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCS8vIGluIHNvbWUgY2FzZXMsIHRoZSBub2RlcyBleGlzdHMsIGJ1dCBoYXNuJ3QgYmVlbiBhc3NvY2lhdGVkCi0JCQkvLyB3aXRoCi0JCQkvLyBhIGZsYXRub2RlIHlldCAodGhlIHNjcmVlbiB1cGRhdGVzIGNhbiBiZSBpbml0aWF0ZWQgb24gYQotCQkJLy8gZGlmZmVyZW50IHRocmVhZCwKLQkJCS8vIHNvIHRoZSByZXF1ZXN0IGZvciBhIGZsYXRub2RlIGNhbiBjb21lIGluIGJlZm9yZSB0aGUgbm9kZSBpcwotCQkJLy8gZnVsbHkgZm9ybWVkLgotCQkJLy8gaWYgdGhlIGZsYXRub2RlIGlzIG51bGwsIHdlJ2xsIGp1c3QgYWxsb3cgdGhlIGRlZmF1bHRzIHRvCi0JCQkvLyBhcHBseS4KLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZsYXROb2RlVHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJCQkvLyBzaG91bGQgbm90IGJlIG51bGwsIGJ1dCBqdXN0IHRvIGJlIHN1cmUKLQkJCQlpZiAoZmxhdE5vZGVUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9DT05URU5UKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0VYUFJFU1NJT05fT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9TQ1JJUFRMRVRfT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ERUNMQVJBVElPTl9PUEVOKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0RJUkVDVElWRV9DTE9TRSkpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfTkFNRSkpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9DTE9TRSkpKSB7Ci0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzAyNGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwgZXh0ZW5kcyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgewotCXByaXZhdGUgYm9vbGVhbiBmU3BsaXRNdWx0aUF0dHJzID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZQcmVzZXJ2ZVBDREFUQUNvbnRlbnQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkFsaWduRW5kQnJhY2tldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVHJ1ZSBpZiBmb3JtYXR0ZXIgc2hvdWxkIHNwbGl0IGVsZW1lbnRzIHdpdGggbXVsdGlwbGUgYXR0cmlidXRlcyBvbnRvCi0JICogbmV3IGxpbmVzLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFNwbGl0TXVsdGlBdHRycygpIHsKLQkJcmV0dXJuIGZTcGxpdE11bHRpQXR0cnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIG9yIG5vdCBmb3JtYXR0ZXIgc2hvdWxkIHNwbGl0IGVsZW1lbnRzIHdpdGggbXVsdGlwbGUKLQkgKiBhdHRyaWJ1dGVzIG9udG8gbmV3IGxpbmVzLgotCSAqIAotCSAqIEBwYXJhbSBzcGxpdE11bHRpQXR0cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGxpdE11bHRpQXR0cnMoYm9vbGVhbiBzcGxpdE11bHRpQXR0cnMpIHsKLQkJZlNwbGl0TXVsdGlBdHRycyA9IHNwbGl0TXVsdGlBdHRyczsKLQl9Ci0KLQkvKioKLQkgKiBUcnVlIGlmIHRhZ3Mgd2l0aCBQQ0RBVEEgY29udGVudCBzaG91bGQgbm90IGhhdmUgdGhlaXIgd2hpdGVzcGFjZQotCSAqIG1lc3NlZCB3aXRoIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByZXNlcnZlUENEQVRBQ29udGVudCgpIHsKLQkJcmV0dXJuIGZQcmVzZXJ2ZVBDREFUQUNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIG9yIG5vdCBmb3JtYXR0ZXIgc2hvdWxkIHByZXNlcnZlIHdoaXRlc3BhY2UgaW4gdGFncyB3aXRoCi0JICogUENEQVRBIGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHByZXNlcnZlUENEQVRBQ29udGVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlcnZlUENEQVRBQ29udGVudChib29sZWFuIHByZXNlcnZlUENEQVRBQ29udGVudCkgewotCQlmUHJlc2VydmVQQ0RBVEFDb250ZW50ID0gcHJlc2VydmVQQ0RBVEFDb250ZW50OwotCX0KLQotCS8qKgotCSAqIFRydWUgaWYgZW5kIGJyYWNrZXRzIG9mIHN0YXJ0IHRhZ3Mgc2hvdWxkIGJlIHBsYWNlZCBvbiBhIG5ldyBsaW5lIGlmCi0JICogdGhlIHN0YXJ0IHRhZyBzcGFucyBtb3JlIHRoYW4gb25lIGxpbmUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWxpZ25FbmRCcmFja2V0KCkgewotCQlyZXR1cm4gZkFsaWduRW5kQnJhY2tldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgb3Igbm90IGZvcm1hdHRlciBzaG91bGQgYWxpZ24gdGhlIGVuZCBicmFja2V0IG9mIGEgc3RhcnQKLQkgKiB0YWcgb24gYSBuZXcgbGluZSBpZiB0aGUgc3RhcnQgdGFnIHNwYW5zIG1vcmUgdGhhbiBvbmUgbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWxpZ25FbmRCcmFja2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWxpZ25FbmRCcmFja2V0KGJvb2xlYW4gYWxpZ25FbmRCcmFja2V0KSB7Ci0JCWZBbGlnbkVuZEJyYWNrZXQgPSBhbGlnbkVuZEJyYWNrZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvVGV4dE5vZGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1RleHROb2RlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3M2FiNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvVGV4dE5vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSB4bWw6c3BhY2U9J3ByZXNlcnZlJyBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFRleHROb2RlRm9ybWF0dGVyIGV4dGVuZHMgTm9kZUZvcm1hdHRlciB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIENSID0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBERUxJTUlURVJTID0gIiBcdFxuXHJcZiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRkYgPSAiXGYiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIExGID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBTUEFDRSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUIgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBjb21wcmVzc1NwYWNlcyhTdHJpbmcgc3RyaW5nLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvKgotCQkgKiBOb3RlIHRoYXQgdGhlIFN0cnVjdHVyZWRUZXh0RWRpdG9yIHN1cHBvcnRzIG1peGVkIG5ldyBsaW5lCi0JCSAqIGNoYXJhY3RlcnMgKENSLCBMRiwgQ1JMRikgaW4gb25lIGZpbGUuIFdlIGhhdmUgdG8gaGFuZGxlIHRoYXQgd2hlbgotCQkgKiB3ZSB0cnkgdG8gcHJlc2VydmUgYmxhbmsgbGluZXMuCi0JCSAqLwotCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IG51bGw7Ci0JCWJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzID0gZm9ybWF0Q29udHJhaW50cy5nZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKQotCQkJc3RyaW5nQXJyYXkgPSBTdHJpbmdVdGlscy5hc0FycmF5KHN0cmluZyk7Ci0JCWVsc2UKLQkJCXN0cmluZ0FycmF5ID0gU3RyaW5nVXRpbHMuYXNBcnJheShzdHJpbmcsIERFTElNSVRFUlMsIHRydWUpOwotCi0JCVN0cmluZ0J1ZmZlciBjb21wcmVzc2VkU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoc3RyaW5nQXJyYXkubGVuZ3RoID4gMCkgewotCQkJYm9vbGVhbiBjciA9IGZhbHNlLCBsZiA9IGZhbHNlLCBjcjIgPSBmYWxzZSwgbm9uU3BhY2UgPSB0cnVlOwotCi0JCQlpZiAoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKENSKSA9PSAwKQotCQkJCWNyID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhMRikgPT0gMCkKLQkJCQlsZiA9IHRydWU7Ci0JCQllbHNlIGlmICgoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKFNQQUNFKSAhPSAwKSAmJiAoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKFRBQikgIT0gMCkgJiYgKHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhGRikgIT0gMCkpIHsKLQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChzdHJpbmdBcnJheVswXSk7Ci0JCQkJbm9uU3BhY2UgPSB0cnVlOwotCQkJfQotCi0JCQlmb3IgKGludCBpID0gMTsgaSA8IHN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHN0cmluZ0FycmF5W2ldLmNvbXBhcmVUbyhDUikgPT0gMCkgewotCQkJCQlpZiAoY3IgJiYgbGYpIHsKLQkJCQkJCWlmIChub25TcGFjZSkgewotCQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKENSICsgTEYpOwotCQkJCQkJCW5vblNwYWNlID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChzdHJpbmdBcnJheVtpXSk7Ci0JCQkJCQljcjIgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNyKSB7Ci0JCQkJCQlpZiAobm9uU3BhY2UpIHsKLQkJCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChDUik7Ci0JCQkJCQkJbm9uU3BhY2UgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5W2ldKTsKLQkJCQkJCWNyMiA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJY3IgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oTEYpID09IDApIHsKLQkJCQkJaWYgKGNyICYmIGxmICYmIGNyMikgewotCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoc3RyaW5nQXJyYXlbaV0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGxmKSB7Ci0JCQkJCQlpZiAobm9uU3BhY2UpIHsKLQkJCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChMRik7Ci0JCQkJCQkJbm9uU3BhY2UgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5W2ldKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlsZiA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oU1BBQ0UpICE9IDApICYmIChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oVEFCKSAhPSAwKSAmJiAoc3RyaW5nQXJyYXlbaV0uY29tcGFyZVRvKEZGKSAhPSAwKSkgewotCQkJCQlpZiAoY29tcHJlc3NlZFN0cmluZy5sZW5ndGgoKSA+IDApCi0JCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChTUEFDRSk7Ci0JCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5W2ldKTsKLQotCQkJCQljciA9IGZhbHNlOwotCQkJCQlsZiA9IGZhbHNlOwotCQkJCQljcjIgPSBmYWxzZTsKLQkJCQkJbm9uU3BhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb21wcmVzc2VkU3RyaW5nLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBbMTExNjc0XSBJZiBpbnNpZGUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZWxlbWVudCwgd2UgYmFpbAotCQlpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJaW50IGxpbmVXaWR0aCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0TGluZVdpZHRoKCk7Ci0JCQlpbnQgY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbXB1dGVBdmFpbGFibGVMaW5lV2lkdGgoZG9jLCBub2RlLmdldFN0YXJ0T2Zmc2V0KCksIGxpbmVXaWR0aCk7Ci0KLQkJCVN0cmluZyBub2RlVGV4dCA9IGdldE5vZGVUZXh0KG5vZGUpOwotCQkJU3RyaW5nIGNvbXByZXNzZWRUZXh0ID0gY29tcHJlc3NTcGFjZXMobm9kZVRleHQsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQlJRE9NTm9kZSBwYXJlbnROb2RlID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJaWYgKCgoZW5vdWdoU3BhY2UocGFyZW50Tm9kZSwgY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCwgY29tcHJlc3NlZFRleHQpKSAmJiAobm9TaWJsaW5nc0FuZE5vRm9sbG93aW5nQ29tbWVudChub2RlKSkgJiYgIWZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbnNMaW5lRGVsaW1pdGVycyhwYXJlbnROb2RlKSkgfHwgbm9kZS5nZXRTdGFydE9mZnNldCgpID09IDApIHsKLQkJCQloYW5kbGVOb1JlZmxvdyhub2RlLCBkb2MsIGNvbXByZXNzZWRUZXh0LCBwYXJlbnROb2RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vdCBlbm91Z2ggc3BhY2UsIG5lZWQgdG8gcmVmbG93IHRleHQKLQkJCQlTdHJpbmcgbm9kZUluZGVudGF0aW9uID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGxpbmVXaWR0aCAtIGdldEluZGVudGF0aW9uTGVuZ3RoKG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJTGlzdCB2ZWN0b3IgPSByZWZsb3dUZXh0KGNvbXByZXNzZWRUZXh0LCBjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoKTsKLQkJCQlpbnQgdmVjdG9yU2l6ZSA9IHZlY3Rvci5zaXplKCk7Ci0JCQkJU3RyaW5nQnVmZmVyIHJlZmxvd2VkVGV4dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGdldExpbmVEZWxpbWl0ZXIoZG9jLCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCS8vIGhhbmRsZSBmaXJzdCBsaW5lIHNwZWNpYWxseSB0byBjaGVjayBmb3IgYWxsb3dXaGl0ZXNwYWNlCi0JCQkJaWYgKHZlY3RvclNpemUgPiAwKSB7Ci0JCQkJCS8vIGRldGVybWluZXMgd2hldGhlciBvciBub3QgdG8gYWxsb3cgd2hpdGVzcGFjZSBpZiB0aGVyZQotCQkJCQkvLyBpcyBhbiBlbnRpdHkgb3IgY2RhdGEgYmVmb3JlIGl0Ci0JCQkJCWJvb2xlYW4gYWxsb3dXaGl0ZXNwYWNlID0gdHJ1ZTsKLQkJCQkJLy8gWzIwNjA3Ml0gU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotCQkJCQlpZiAobm9kZVRleHQubGVuZ3RoKCkgPT0gMCB8fCAhQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShub2RlVGV4dC5jaGFyQXQoMCkpKSB7Ci0JCQkJCQlOb2RlIHByZXZpb3VzU2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nICE9IG51bGwgJiYgKHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIHx8IHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKSkKLQkJCQkJCQlhbGxvd1doaXRlc3BhY2UgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQlTdHJpbmcgdGhlU3RyaW5nID0gKFN0cmluZykgdmVjdG9yLmdldCgwKTsKLQkJCQkJaWYgKGFsbG93V2hpdGVzcGFjZSkgewotCQkJCQkJcmVmbG93ZWRUZXh0QnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCWlmICh0aGVTdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQkJCQlyZWZsb3dlZFRleHRCdWZmZXIuYXBwZW5kKG5vZGVJbmRlbnRhdGlvbikuYXBwZW5kKHRoZVN0cmluZyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZWZsb3dlZFRleHRCdWZmZXIuYXBwZW5kKHRoZVN0cmluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZG8gdGhlIHJlc3Qgb2YgdGhlIGxpbmVzCi0JCQkJZm9yIChpbnQgaSA9IDE7IGkgPCB2ZWN0b3JTaXplOyBpKyspIHsKLQkJCQkJU3RyaW5nIHRoZVN0cmluZyA9IChTdHJpbmcpIHZlY3Rvci5nZXQoaSk7Ci0JCQkJCWlmICh0aGVTdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQkJCXJlZmxvd2VkVGV4dEJ1ZmZlci5hcHBlbmQobGluZURlbGltaXRlcikuYXBwZW5kKG5vZGVJbmRlbnRhdGlvbikuYXBwZW5kKHRoZVN0cmluZyk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlZmxvd2VkVGV4dEJ1ZmZlci5hcHBlbmQobGluZURlbGltaXRlcik7Ci0JCQkJfQotCQkJCVN0cmluZyByZWZsb3dlZFRleHQgPSByZWZsb3dlZFRleHRCdWZmZXIudG9TdHJpbmcoKTsKLQkJCQlpZiAobm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwpIHsKLQkJCQkJaWYgKGlzRW5kVGFnTWlzc2luZyhwYXJlbnROb2RlKSkgewotCQkJCQkJLy8gZG9uJ3QgYWRkIGluZGVudGF0aW9uIHRvIGVuZCBpZiBwYXJlbnQgZW5kIHRhZyBpcwotCQkJCQkJLy8gbWlzc2luZwotCQkJCQl9Ci0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBhZGQgcGFyZW50J3MgaW5kZW50YXRpb24gdG8gZW5kCi0JCQkJCQlub2RlSW5kZW50YXRpb24gPSBnZXROb2RlSW5kZW50KHBhcmVudE5vZGUpOwotCQkJCQkJaWYgKCFyZWZsb3dlZFRleHQuZW5kc1dpdGgobGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbikpIHsKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoIXJlZmxvd2VkVGV4dC5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbm9kZUluZGVudGF0aW9uKSkgewotCQkJCQkJLy8gbm90IGFscmVhZHkgZW5kZWQgd2l0aCB0aGUgZXhwZWN0ZWQgaW5kZW50YXRpb24KLQkJCQkJCU5vZGUgbmV4dFNpYmxpbmcgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQlpZiAobmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkgewotCQkJCQkJCS8vIGFkZCBpbmRlbnRhdGlvbiB0byBlbmQgaWYKLQkJCQkJCQkvLyBjdXJyZW50VGV4dEVuZHNXaXRoTGluZURlbGltaXRlcgotCQkJCQkJCS8vIG9yIGZvbGxvd2VkIGJ5IG11bHRpTGluZUNvbW1lbnQKLQotCQkJCQkJCWludCBpbmRleE9mTGFzdExpbmVEZWxpbWl0ZXIgPSBTdHJpbmdVdGlscy5pbmRleE9mTGFzdExpbmVEZWxpbWl0ZXIobm9kZVRleHQpOwotCQkJCQkJCWJvb2xlYW4gY3VycmVudFRleHRFbmRzV2l0aExpbmVEZWxpbWl0ZXIgPSBpbmRleE9mTGFzdExpbmVEZWxpbWl0ZXIgIT0gLTE7Ci0JCQkJCQkJaWYgKGN1cnJlbnRUZXh0RW5kc1dpdGhMaW5lRGVsaW1pdGVyKSB7Ci0JCQkJCQkJCS8vIG5vIG1vcmUgbm9uIGJsYW5rIGNoYXJhY3RlciBhZnRlciB0aGUgbGFzdAotCQkJCQkJCQkvLyBsaW5lIGRlbGltaXRlcgotCQkJCQkJCQljdXJyZW50VGV4dEVuZHNXaXRoTGluZURlbGltaXRlciA9IFN0cmluZ1V0aWxzLmluZGV4T2ZOb25ibGFuayhub2RlVGV4dCwgaW5kZXhPZkxhc3RMaW5lRGVsaW1pdGVyKSA9PSAtMTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlTdHJpbmcgbm9kZVZhbHVlID0gbmV4dFNpYmxpbmcuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJYm9vbGVhbiBtdWx0aUxpbmVDb21tZW50ID0gU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKG5vZGVWYWx1ZSk7Ci0KLQkJCQkJCQlpZiAoY3VycmVudFRleHRFbmRzV2l0aExpbmVEZWxpbWl0ZXIgfHwgbXVsdGlMaW5lQ29tbWVudCkgewotCQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQkJcmVmbG93ZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKHJlZmxvd2VkVGV4dCwgbm9kZUluZGVudGF0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChuZXh0U2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIHx8IG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpIHsKLQkJCQkJCQlpbnQgdGV4dExlbmd0aCA9IG5vZGVUZXh0Lmxlbmd0aCgpOwotCQkJCQkJCWlmICh0ZXh0TGVuZ3RoID4gMCAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5vZGVUZXh0LmNoYXJBdCh0ZXh0TGVuZ3RoIC0gMSkpKSB7Ci0JCQkJCQkJCXJlZmxvd2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChyZWZsb3dlZFRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG5vdCBhIGNvbW1lbnQsIGp1c3QgYWRkIGFkZCBpbmRlbnRhdGlvbiB0byBlbmQKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCByZWZsb3dlZFRleHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogS2VlcHMgdGV4dCBpbmxpbmUgd2l0aCBpdHMgcGFyZW50IChubyByZWZsb3cgbmVjZXNzYXJ5KQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRvYwotCSAqIEBwYXJhbSBjb21wcmVzc2VkVGV4dAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU5vUmVmbG93KElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jLCBTdHJpbmcgY29tcHJlc3NlZFRleHQsIElET01Ob2RlIHBhcmVudE5vZGUpIHsKLQkJU3RyaW5nIG5vZGVJbmRlbnRhdGlvbjsKLQkJLy8gZW5vdWdoIHNwYWNlIGFuZCB0ZXh0IGhhcyBubyBsaW5lIGRlbGltaXRlcnMgYW5kIChub2RlIGhhcyBubwotCQkvLyBzaWJsaW5ncyBvciBmb2xsb3dlZCBieSBpbmxpbmUgY29tbWVudCkgYW5kCi0JCS8vIHBhcmVudEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbnNMaW5lRGVsaW1pdGVycwotCi0JCWlmIChpc0VuZFRhZ01pc3NpbmcocGFyZW50Tm9kZSkpIHsKLQkJCXBhcmVudE5vZGUgPSAoSURPTU5vZGUpIHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJd2hpbGUgKGlzRW5kVGFnTWlzc2luZyhwYXJlbnROb2RlKSkKLQkJCQlwYXJlbnROb2RlID0gKElET01Ob2RlKSBwYXJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJLy8gYWRkIHBhcmVudCdzIGluZGVudGF0aW9uIHRvIGVuZAotCQkJbm9kZUluZGVudGF0aW9uID0gZ2V0Tm9kZUluZGVudChwYXJlbnROb2RlKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZ2V0TGluZURlbGltaXRlcihkb2MsIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpZiAoIWNvbXByZXNzZWRUZXh0LmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pKSB7Ci0JCQkJY29tcHJlc3NlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgoY29tcHJlc3NlZFRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCWNvbXByZXNzZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKGNvbXByZXNzZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJfQotCQl9Ci0KLQkJaWYgKChwYXJlbnROb2RlICE9IG51bGwpICYmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5sZW5ndGgoKSA+IDApICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSAmJiAoKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCkgfHwgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSkpCi0JCQkvLyBkZWxldGUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSBkb2N1bWVudAotCQkJY29tcHJlc3NlZFRleHQgPSBFTVBUWV9TVFJJTkc7Ci0KLQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCBjb21wcmVzc2VkVGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG5vU2libGluZ3NBbmROb0ZvbGxvd2luZ0NvbW1lbnQoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSBuZXh0U2libGluZyA9IChJRE9NTm9kZSkgbm9kZS5nZXROZXh0U2libGluZygpOwotCQlyZXR1cm4gIW5vZGVIYXNTaWJsaW5ncyhub2RlKSB8fCAobm9MaW5lRGVsaW1pdGVyKG5vZGUpICYmIGlzQ29tbWVudChuZXh0U2libGluZykgJiYgbm9MaW5lRGVsaW1pdGVyKG5leHRTaWJsaW5nKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudChJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBub0xpbmVEZWxpbWl0ZXIoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAhU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2Ugb24gdGhlIGN1cnJlbnQgbGluZSBmb3IKLQkgKiBjb21wcmVzc2VkVGV4dCAoYW5kIGZvciBpdHMgcGFyZW50IGVuZCB0YWcpCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiBAcGFyYW0gY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aAotCSAqIEBwYXJhbSBjb21wcmVzc2VkVGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZW5vdWdoU3BhY2UoSURPTU5vZGUgcGFyZW50Tm9kZSwgaW50IGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgsIFN0cmluZyBjb21wcmVzc2VkVGV4dCkgewotCQlpbnQgcGFyZW50RW5kVGFnTGVuZ3RoID0gcGFyZW50Tm9kZS5nZXROb2RlTmFtZSgpLmxlbmd0aCgpICsgMzsKLQkJcmV0dXJuIGNvbXByZXNzZWRUZXh0Lmxlbmd0aCgpIDw9IChjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoIC0gcGFyZW50RW5kVGFnTGVuZ3RoKSAmJiAhU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKGNvbXByZXNzZWRUZXh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIHJlZmxvd1RleHQoU3RyaW5nIHRleHQsIGludCBhdmFpbGFibGVXaWR0aCkgewotCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IG51bGw7Ci0JCWJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKQotCQkJc3RyaW5nQXJyYXkgPSBTdHJpbmdVdGlscy5hc0FycmF5KHRleHQpOwotCQllbHNlCi0JCQlzdHJpbmdBcnJheSA9IFN0cmluZ1V0aWxzLmFzQXJyYXkodGV4dCwgREVMSU1JVEVSUywgdHJ1ZSk7Ci0KLQkJVmVjdG9yIG91dHB1dCA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKChzdHJpbmdBcnJheSAhPSBudWxsKSAmJiAoc3RyaW5nQXJyYXkubGVuZ3RoID4gMCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKENSKSAhPSAwKQotCQkJCWJ1ZmZlci5hcHBlbmQoc3RyaW5nQXJyYXlbMF0pOwotCQkJaW50IGJ1ZmZlckxlbmd0aCA9IHN0cmluZ0FycmF5WzBdLnRvU3RyaW5nKCkubGVuZ3RoKCk7Ci0JCQlib29sZWFuIGNyID0gc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKENSKSA9PSAwOwotCi0JCQlmb3IgKGludCBpID0gMTsgaSA8IHN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGVhY2hTdHJpbmcgPSBzdHJpbmdBcnJheVtpXTsKLQkJCQlpZiAoKGVhY2hTdHJpbmcuY29tcGFyZVRvKFNQQUNFKSAhPSAwKSAmJiAoZWFjaFN0cmluZy5jb21wYXJlVG8oVEFCKSAhPSAwKSAmJiAoZWFjaFN0cmluZy5jb21wYXJlVG8oRkYpICE9IDApKSB7Ci0JCQkJCWlmICgoYnVmZmVyTGVuZ3RoICsgMSArIGVhY2hTdHJpbmcubGVuZ3RoKCkgPiBhdmFpbGFibGVXaWR0aCkgfHwgKGVhY2hTdHJpbmcuY29tcGFyZVRvKENSKSA9PSAwKSB8fCAoZWFjaFN0cmluZy5jb21wYXJlVG8oTEYpID09IDApKSB7Ci0JCQkJCQlpZiAoKGVhY2hTdHJpbmcuY29tcGFyZVRvKExGKSA9PSAwKSAmJiBjcikgewotCQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCW91dHB1dC5hZGQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQlidWZmZXJMZW5ndGggPSAwOwotCQkJCQkJfQotCQkJCQkJY3IgPSBlYWNoU3RyaW5nLmNvbXBhcmVUbyhDUikgPT0gMDsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChidWZmZXIudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKFNQQUNFKTsKLQkJCQkJCWJ1ZmZlckxlbmd0aCsrOwotCQkJCQl9Ci0JCQkJCWlmICgoZWFjaFN0cmluZy5jb21wYXJlVG8oQ1IpICE9IDApICYmIChlYWNoU3RyaW5nLmNvbXBhcmVUbyhMRikgIT0gMCkpIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoZWFjaFN0cmluZyk7Ci0JCQkJCQlidWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGggKyBlYWNoU3RyaW5nLmxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJb3V0cHV0LmFkZChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQkJZWxzZQotCQkJb3V0cHV0LmFkZCh0ZXh0KTsKLQotCQlyZXR1cm4gb3V0cHV0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoSVN0cnVjdHVyZWREb2N1bWVudCBkb2MsIGludCBub2RlT2Zmc2V0KSB7Ci0JCWludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChub2RlT2Zmc2V0KTsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcigpOwotCQl0cnkgewotCQkJaWYgKGxpbmUgPiAwKSB7Ci0JCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKGxpbmUgLSAxKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQkvLyBCVUcxMTU3MTY6IGlmIGNhbm5vdCBnZXQgbGluZSBkZWxpbWl0ZXIgZnJvbSBjdXJyZW50IGxpbmUsIGp1c3QKLQkJLy8gdXNlIGRlZmF1bHQgbGluZSBkZWxpbWl0ZXIKLQkJaWYgKGxpbmVEZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcigpOwotCQlyZXR1cm4gbGluZURlbGltaXRlcjsKLQl9Ci0KLQlwcml2YXRlIGludCBjb21wdXRlQXZhaWxhYmxlTGluZVdpZHRoKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jLCBpbnQgbm9kZU9mZnNldCwgaW50IGxpbmVXaWR0aCkgewotCQkvLyBjb21wdXRlIGN1cnJlbnQgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJaW50IGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPSAwOwotCQl0cnkgewotCQkJaW50IGxpbmVPZmZzZXQgPSBkb2MuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQobm9kZU9mZnNldCkuZ2V0T2Zmc2V0KCk7Ci0JCQlTdHJpbmcgdGV4dCA9IGRvYy5nZXQobGluZU9mZnNldCwgbm9kZU9mZnNldCAtIGxpbmVPZmZzZXQpOwotCQkJaW50IHVzZWRXaWR0aCA9IGdldEluZGVudGF0aW9uTGVuZ3RoKHRleHQpOwotCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGxpbmVXaWR0aCAtIHVzZWRXaWR0aDsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JWE1MUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lYTUxQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzY3NTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lYTUxQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbiB0eXBlcyBmb3IgWE1MLgotICogQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQGRlcHJlY2F0ZWQgdXNlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTFBhcnRpdGlvbnMgewotCQotCVN0cmluZyBYTUxfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfQ0RBVEEgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9QSSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9QSSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFQ0wiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBwcmVmaXggdG8gYW55IHVua25vd24gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMKLQkgKiB3ZSBmaW5kLiBUaGUgcHJvY2Vzc29yIHRhcmdldCBuYW1lIGlzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UgYW5kCi0JICogYXBwZW5kZWQgdG8gdGhlIHByZWZpeCB0byBjcmVhdGUgYSB1bmlxdWUgcGFydGl0aW9uIHR5cGUuCi0JICovCi0JU3RyaW5nIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fUFJFRklYID0gIm9yZy5lY2xpcHNlLndzdC54bWwuUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTaG91bGQgbWF0Y2gKLQkgKiBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZHRkLnBhcnRpdGlvbmluZy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFRELlNUX0RURF9TVUJTRVQKLQkgKi8KLQlTdHJpbmcgRFREX1NVQlNFVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmR0ZC5pbnRlcm5hbF9zdWJzZXQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvRE9NUmVnaW9uQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9yZWdpb25zL0RPTVJlZ2lvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3M2Q4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvRE9NUmVnaW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIERPTVJlZ2lvbkNvbnRleHQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxPQ0tfVEVYVCA9ICJCTE9DS19URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERUZJTkVEID0gIlVOREVGSU5FRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFX1NQQUNFID0gIldISVRFX1NQQUNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRMSVNUX0RFQ0xfQ0xPU0UgPSAiWE1MX0FUVExJU1RfREVDTF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQgPSAiWE1MX0FUVExJU1RfREVDTF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRMSVNUX0RFQ0xfTkFNRSA9ICJYTUxfQVRUTElTVF9ERUNMX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUTElTVF9ERUNMQVJBVElPTiA9ICJYTUxfQVRUTElTVF9ERUNMQVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ0RBVEFfQ0xPU0UgPSAiWE1MX0NEQVRBX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DREFUQV9PUEVOID0gIlhNTF9DREFUQV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DREFUQV9URVhUID0gIlhNTF9DREFUQV9URVhUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DSEFSX1JFRkVSRU5DRSA9ICJYTUxfQ0hBUl9SRUZFUkVOQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTU1FTlRfQ0xPU0UgPSAiWE1MX0NPTU1FTlRfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09NTUVOVF9PUEVOID0gIlhNTF9DT01NRU5UX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTU1FTlRfVEVYVCA9ICJYTUxfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTlRFTlQgPSAiWE1MX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OX0NMT1NFID0gIlhNTF9ERUNMQVJBVElPTl9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ERUNMQVJBVElPTl9PUEVOID0gIlhNTF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04gPSAiWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UgPSAiWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDID0gIlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYgPSAiWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiA9ICJYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNID0gIlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQgPSAiWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX05BTUUgPSAiWE1MX0RPQ1RZUEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX0NMT1NFID0gIlhNTF9FTEVNRU5UX0RFQ0xfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9DT05URU5UID0gIlhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX05BTUUgPSAiWE1MX0VMRU1FTlRfREVDTF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVDTEFSQVRJT04gPSAiWE1MX0VMRU1FTlRfREVDTEFSQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VNUFRZX1RBR19DTE9TRSA9ICJYTUxfRU1QVFlfVEFHX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTkRfVEFHX09QRU4gPSAiWE1MX0VORF9UQUdfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRU5USVRZX1JFRkVSRU5DRSA9ICJYTUxfRU5USVRZX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QRV9SRUZFUkVOQ0UgPSAiWE1MX1BFX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUElfQ0xPU0UgPSAiWE1MX1BJX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QSV9DT05URU5UID0gIlhNTF9QSV9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QSV9PUEVOID0gIlhNTF9QSV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyA9ICJYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19BVFRSSUJVVEVfTkFNRSA9ICJYTUxfVEFHX0FUVFJJQlVURV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFID0gIlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQ0xPU0UgPSAiWE1MX1RBR19DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX05BTUUgPSAiWE1MX1RBR19OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19PUEVOID0gIlhNTF9UQUdfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YWQyYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLQotcHVibGljIGludGVyZmFjZSBNb2RlbFF1ZXJ5QWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudENhY2hlIGdldENNRG9jdW1lbnRDYWNoZSgpOwotCi0JcHVibGljIFVSSVJlc29sdmVyIGdldElkUmVzb2x2ZXIoKTsKLQotCXB1YmxpYyBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoKTsKLQotCXZvaWQgcmVsZWFzZSgpOwotCi0Jdm9pZCBzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld0lkUmVzb2x2ZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjhlNjcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGVsUXVlcnlBZGFwdGVyIHsKLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZTsKLQlwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcjsKLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnk7Ci0KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJJbXBsKENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGUsIE1vZGVsUXVlcnkgbW9kZWxRdWVyeSwgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcikgewotCQl0aGlzLmNtRG9jdW1lbnRDYWNoZSA9IGNtRG9jdW1lbnRDYWNoZTsKLQkJdGhpcy5tb2RlbFF1ZXJ5ID0gbW9kZWxRdWVyeTsKLQkJdGhpcy5pZFJlc29sdmVyID0gaWRSZXNvbHZlcjsKLQl9Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudENhY2hlIGdldENNRG9jdW1lbnRDYWNoZSgpIHsKLQkJcmV0dXJuIGNtRG9jdW1lbnRDYWNoZTsKLQl9Ci0KLQlwdWJsaWMgVVJJUmVzb2x2ZXIgZ2V0SWRSZXNvbHZlcigpIHsKLQkJcmV0dXJuIGlkUmVzb2x2ZXI7Ci0JfQotCi0JcHVibGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeSgpIHsKLQkJcmV0dXJuIG1vZGVsUXVlcnk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmVxdWFscyhNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZGVsUXVlcnlBZGFwdGVyI3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNb2RlbFF1ZXJ5QWRhcHRlciNzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyKQotCSAqLwotCi0JcHVibGljIHZvaWQgc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdJZFJlc29sdmVyKSB7Ci0JCWlkUmVzb2x2ZXIgPSBuZXdJZFJlc29sdmVyOwotCQlpZiAobW9kZWxRdWVyeSBpbnN0YW5jZW9mIE1vdmFibGVNb2RlbFF1ZXJ5KQotCQkJKChNb3ZhYmxlTW9kZWxRdWVyeSkgbW9kZWxRdWVyeSkuc2V0SWRSZXNvbHZlcihuZXdJZFJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NzZW1vZGVscXVlcnkvTW92YWJsZU1vZGVsUXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb3ZhYmxlTW9kZWxRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWQ3MzM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb3ZhYmxlTW9kZWxRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTW92YWJsZU1vZGVsUXVlcnkgZXh0ZW5kcyBNb2RlbFF1ZXJ5IHsKLQotCXZvaWQgc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdVUklSZXNvbHZlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Rhc2tzL1hNTEZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90YXNrcy9YTUxGaWxlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRiODE1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Rhc2tzL1hNTEZpbGVUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFhNTEZpbGVUYXNrU2Nhbm5lciBleHRlbmRzIFN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIgewotCXB1YmxpYyBYTUxGaWxlVGFza1NjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21tZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCXJldHVybiB0ZXh0UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3RleHQvWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3RleHQvWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNmJmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90ZXh0L1hNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZXh0ZW5kcyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCi0JcHVibGljIFhNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBzdXBlci5nZXRUeXBlKCk7Ci0JCS8vIG5vcm1hbGx5LCB3ZSB3YW50IHRoZSBzZWNvbmQgcmVnaW9uIGFzIHRoZSBmbGF0bm9kZSB0eXBlIC4uLiBzaW5jZQotCQkvLyB0aGUKLQkJLy8gZmlyc3Qgb25lIGlzIHVzdWFsbHkganVzdCAib3BlbiB0YWciLgotCQlpZiAoKHJlc3VsdCAhPSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSAmJiAoZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpKSB7Ci0JCQlyZXN1bHQgPSBnZXRSZWdpb25zKCkuZ2V0KDEpLmdldFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjczODY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBjb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tde0lYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxULCBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEsIElYTUxQYXJ0aXRpb25zLlhNTF9QSSwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OLCBJWE1MUGFydGl0aW9ucy5YTUxfQ09NTUVOVCwgSVhNTFBhcnRpdGlvbnMuRFREX1NVQlNFVH07Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlzdXBlci5zZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgdHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlmU3VwcG9ydGVkVHlwZXMgPSBjb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCkKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLlhNTF9DT01NRU5UOwotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpCi0JCQlyZXN1bHQgPSBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEE7Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCkgewotCQkJLyoqCi0JCQkgKiBHcmFtbWF0aWNhbGx5LCBpdCdzIGltcG9zc2libGUgdG8gZ2V0IGEgUElfQ09OVEVOVCByZWdpb24KLQkJCSAqIHdpdGhvdXQgYSBwcmVjZWRpbmcgWE1MX1RBR19OQU1FIHJlZ2lvbi4gUmVseWluZyBvbiB0aGlzLAotCQkJICogZXh0cmFjdCB0aGUgdGFyZ2V0IHByb2Nlc3NvciBuYW1lIGFuZCBjcmVhdGUgYSBwYXJ0aXRpb24gdHlwZQotCQkJICogZHluYW1pY2FsbHkuCi0JCQkgKi8KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJSVRleHRSZWdpb24gbmFtZSA9IGRvY1JlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2NSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRTdGFydCgpIC0gMSk7Ci0JCQlyZXN1bHQgPSBJWE1MUGFydGl0aW9ucy5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX1BSRUZJWCArIGRvY1JlZ2lvbi5nZXRUZXh0KG5hbWUpLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pCi0JCQlyZXN1bHQgPSBJWE1MUGFydGl0aW9ucy5YTUxfUEk7Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTikKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLlhNTF9ERUNMQVJBVElPTjsKLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVCkKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLkRURF9TVUJTRVQ7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IHN1cGVyLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShGb3JlaWduUmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQkvLyB0ZW1wIGFkZGVkIGp1c3QgdG8gZGlzLWFtYmlndWF0ZSBjYWxsIGZyb20gc3ViY2xhc3MKLQkJcmV0dXJuIHN1cGVyLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c05vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dE5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKHByZXZpb3VzTm9kZSwgbmV4dE5vZGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0JCXJldHVybiBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwgaW5zdGFuY2UgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25Gcm9tQmxvY2tlZFRleHQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0LCBTdHJpbmcgcmVzdWx0KSB7Ci0JCS8vIHdhcyBtb3ZlZCB0byBzdWJjbGFzcyBmb3IgcXVpY2sgdHJhbnNpdGlvbgotCQlTdHJpbmcgbmV3UmVzdWx0ID0gcmVzdWx0OwotCQkvLyBuc2RfVE9ETzogRGF2aWQgYW5kIEkgbmVlZCB0byBkaXNjdXNzLCBkZXNpZ24sIGFuZCBpbXBsZW1lbnQgdGhpcwotCQkvLyBmb3IgYWxsIGJsb2NrIHRhZ3MgYW5kIGNvbW1lbnRzCi0JCS8vIGFuZCBtYWtlIHN1cmUgaXMgcGFydCBvZiAiZXh0ZW5zaWJsZSIgZGVzaWduIG9mIGJsb2NrIHRhZ3MKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkvLyBmb3IgY29kZSBzYWZldHksIHdlJ2xsIGFsd2F5cyBjaGVjayBpbnN0YW5jZW9mLCBidXQgSSB0aGluawotCQkJLy8gYWx3YXlzIHRydWUuCi0JCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgRm9yZWlnblJlZ2lvbikgewotCQkJCS8vIHN1cGVyIGlzIHVzZWQgYmVsb3cgc28gd29uJ3QgYmUgYW1iaWd1b3VzCi0JCQkJbmV3UmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZSgoRm9yZWlnblJlZ2lvbikgcmVnaW9uLCBvZmZzZXQpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uIGluc3RhbmNlb2YgRm9yZWlnblJlZ2lvbikgewotCQkJCW5ld1Jlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKEZvcmVpZ25SZWdpb24pIHJlZ2lvbiwgb2Zmc2V0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1Jlc3VsdCA9IGdldFVua25vd24oKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRvUGFyc2VyU3BlY2lmaWNDaGVjayhpbnQgb2Zmc2V0LCBib29sZWFuIHBhcnRpdGlvbkZvdW5kLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXh0LCBJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0KSB7Ci0JCS8vIHRoaXMgd2FzIG1vdmVkIGRvd24gdG8gc3ViY2xhc3Mgb2YgU3RydWN0dXJlZFRleHRQYXJ0aW9uZXIKLQkJLy8gZm9yIHF1aWNrIGZpeCB0byB0cmFuc2l0aW9uIHByb2JsZW1zLiBIZWlyYXJjaHkgbmVlZHMgbG90cyBvZgotCQkvLyBjbGVhbnVwLgotCQlpZiAocHJldmlvdXNTdGFydCAhPSBudWxsICYmIHByZXZpb3VzU3RhcnQuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOICYmIG5leHQuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJSVRleHRSZWdpb24gcHJldmlvdXNOYW1lID0gcHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KHByZXZpb3VzU3RhcnQpKTsKLQkJCUlUZXh0UmVnaW9uIG5leHROYW1lID0gc2RSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KG5leHQpKTsKLQkJCWlmIChwcmV2aW91c05hbWUgIT0gbnVsbCAmJiBuZXh0TmFtZSAhPSBudWxsICYmIHByZXZpb3VzTmFtZS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgJiYgbmV4dE5hbWUuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCAwLCBnZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgc2RSZWdpb24pKTsKLQkJCQlwYXJ0aXRpb25Gb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcnRpdGlvbkZvdW5kOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZGRkYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdGlvbkNvbXBvbmVudCB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVmFsaWRhdGlvbkNvbXBvbmVudCBnZXRQcm9wYWdhdGVlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVmFsaWRhdGlvbkFkYXB0ZXIgZ2V0VmFsaWRhdG9yKCk7Ci0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRWYWxpZGF0b3IoKS52YWxpZGF0ZShub2RlKTsKLQotCQlwcm9wYWdhdGVUb0NoaWxkRWxlbWVudHMoZ2V0UHJvcGFnYXRlZSgpLCAoTm9kZSkgbm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb3BhZ2F0ZVRvQ2hpbGRFbGVtZW50cyhWYWxpZGF0aW9uQ29tcG9uZW50IHZhbGlkYXRvciwgTm9kZSBwYXJlbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDbGFzcyBjbGF6eiA9IHZhbGlkYXRvci5nZXRDbGFzcygpOwotCi0JCU5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGNoaWxkOwotCQkJCVZhbGlkYXRpb25BZGFwdGVyIHZhID0gKFZhbGlkYXRpb25BZGFwdGVyKSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoY2xhenopOwotCQkJCWlmICh2YSA9PSBudWxsKSB7Ci0JCQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIodmFsaWRhdG9yKTsKLQkJCQkJdmEgPSB2YWxpZGF0b3I7Ci0JCQkJfQotCQkJCS8vIGJ1ZyAxNDMyMTMgLSBDYW4ndCBiYXRjaCB2YWxpZGF0ZSBvcGVuIEhUTUwgZmlsZXMgd2hlbgotCQkJCS8vIGFzLXlvdS10eXBlIHZhbGlkYXRpb24gaXMgZW5hYmxlZAotCQkJCXZhLnNldFJlcG9ydGVyKHZhbGlkYXRvci5nZXRSZXBvcnRlcigpKTsKLQkJCQl2YS52YWxpZGF0ZSgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpOwotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1Byb3BhZ2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJvcGFnYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2U2NTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJvcGFnYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjAgTTUgLSBpZiBwcm9wb2dhdGVUb0NoaWxkRWxlbWVudCBpcyBuZWVkZWQsIGp1c3QgY29weQotICogICAgICAgICAgICAgbWV0aG9kIHRvIHlvdXIgb3duIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wYWdhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcm9wYWdhdGVUb0NoaWxkRWxlbWVudHMoVmFsaWRhdGlvbkNvbXBvbmVudCB2YWxpZGF0b3IsIE5vZGUgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ2xhc3MgY2xhenogPSB2YWxpZGF0b3IuZ2V0Q2xhc3MoKTsKLQotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCi0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGNoaWxkOwotCQkJVmFsaWRhdGlvbkFkYXB0ZXIgdmEgPSAoVmFsaWRhdGlvbkFkYXB0ZXIpIG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihjbGF6eik7Ci0JCQlpZiAodmEgPT0gbnVsbCkgewotCQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIodmFsaWRhdG9yKTsKLQkJCQl2YSA9IHZhbGlkYXRvcjsKLQkJCX0KLQkJCXZhLnZhbGlkYXRlKChJbmRleGVkUmVnaW9uKSBjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9wYWdhdG9yIGlzIGp1c3QgYSBwbGFjZWhvbGRlciBvZiB1dGlsaXRpZXMuIERvbid0IGluc3RhbnRpYXRlLgotCSAqLwotCXByaXZhdGUgUHJvcGFnYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRpb25Db21wb25lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQ5MjFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkNvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWxpZGF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgVmFsaWRhdGlvbkFkYXB0ZXIgewotCi0JcHJvdGVjdGVkIFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBWYWxpZGF0aW9uQ29tcG9uZW50IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25Db21wb25lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBWYWxpZGF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyBUaGlzIG1ldGhvZCB3aWxsIGJlIGltcGxlbWVudGVkIGluIHRoZSBWMi4KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyOwotCX0KLQotCVZhbGlkYXRpb25SZXBvcnRlciBnZXRSZXBvcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMucmVwb3J0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS90ZXh0L0lYTUxQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL3RleHQvSVhNTFBhcnRpdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkYTc4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL3RleHQvSVhNTFBhcnRpdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dDsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIGZvciBYTUwuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTFBhcnRpdGlvbnMgewotCQotCVN0cmluZyBYTUxfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfQ0RBVEEgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9QSSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9QSSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFQ0wiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBwcmVmaXggdG8gYW55IHVua25vd24gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMKLQkgKiB3ZSBmaW5kLiBUaGUgcHJvY2Vzc29yIHRhcmdldCBuYW1lIGlzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UgYW5kCi0JICogYXBwZW5kZWQgdG8gdGhlIHByZWZpeCB0byBjcmVhdGUgYSB1bmlxdWUgcGFydGl0aW9uIHR5cGUuCi0JICovCi0JU3RyaW5nIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fUFJFRklYID0gIm9yZy5lY2xpcHNlLndzdC54bWwuUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTaG91bGQgbWF0Y2gKLQkgKiBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZHRkLnBhcnRpdGlvbmluZy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFRELlNUX0RURF9TVUJTRVQKLQkgKi8KLQlTdHJpbmcgRFREX1NVQlNFVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmR0ZC5pbnRlcm5hbF9zdWJzZXQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxMGM0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWNvbnRlbnRtb2RlbCIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtdmFsaWRhdGlvbiIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIKLQkJcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMvaW1wbC9Db25zdGFudHMiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3BhcnNlcnMvWE1MR3JhbW1hclByZXBhcnNlciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMvdXRpbC9YTUxHcmFtbWFyUG9vbEltcGwiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9YTUxSZXNvdXJjZUlkZW50aWZpZXIiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9YTklFeGNlcHRpb24iIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9ncmFtbWFycy9YTUxHcmFtbWFyRGVzY3JpcHRpb24iIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9wYXJzZXIvWE1MRW50aXR5UmVzb2x2ZXIiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9wYXJzZXIvWE1MRXJyb3JIYW5kbGVyIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvcGFyc2VyL1hNTElucHV0U291cmNlIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvcGFyc2VyL1hNTFBhcnNlRXhjZXB0aW9uIiAvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIKLQkJcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvRGVsZWdhdGluZ1ZhbGlkYXRvciIgLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIgLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZGQ3ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTVmOGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU1NThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSNTYXQgTWFyIDI0IDAyOjE5OjEyIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MDk4NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNXZWQgTm92IDE1IDAyOjEzOjEwIEVTVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4MjNlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVfVUlfUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjYwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5YU0RDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7eC1pbnRlcm5hbDo9dHJ1ZSAKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLnhzZDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NDYzMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotamFycy5jb21waWxlLm9yZGVyID0gLgotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IHNyYy1jb250ZW50bW9kZWwvLFwKLSAgICAgICAgICAgc3JjLXZhbGlkYXRpb24vLFwKLSAgICAgICAgICAgc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiYTU1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hIFByb3BlcnRpZXMgZmlsZSBmb3IgY29tcG9uZW50OiBYTUwgU2NoZW1hIFZhbGlkYXRvcgotCi0hCi0hIFBsdWdpbgotIQotX1VJX1BMVUdJTl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBYU0QgQ29yZSBQbHVnaW4KLVhTRF9Db250ZW50X1R5cGU9WFNECi0KLV9VSV9YTUxfU0NIRU1BX1ZBTElEQVRPUiAgICAgICAgICAgICAgICAgID0gWE1MIFNjaGVtYSBWYWxpZGF0b3IKLV9VSV9YRVJDRVNfVkFMSURBVE9SX0RFTEVHQVRFICAgICAgIAkgID0gWGVyY2VzLWJhc2VkIFhNTCBTY2hlbWEgVmFsaWRhdG9yCi0KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyYzUzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlLmNvbnRlbnRUeXBlcyI+Ci0JCTxjb250ZW50LXR5cGUKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJVhTRF9Db250ZW50X1R5cGUiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWRlZmF1bHQtY2hhcnNldD0iVVRGLTgiCi0JCQlmaWxlLWV4dGVuc2lvbnM9InhzZCIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudEZhY3RvcmllcyI+Ci0JCTxmYWN0b3J5Ci0JCQl0eXBlPSJ4c2QiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwuQ01Eb2N1bWVudEZhY3RvcnlYU0QiPgotCQk8L2ZhY3Rvcnk+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBSZWdpc3RlciB0aGUgWFNEIHZhbGlkYXRvciB3aXRoIHRoZSB2YWxpZGF0aW9uIAkJLS0+Ci0JPCEtLSBmcmFtZXdvcmsuIAkJCQkJCQkJCQkgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLQotCTxleHRlbnNpb24KLQkJaWQ9InhzZFZhbGlkYXRvciIKLQkJbmFtZT0iJV9VSV9YTUxfU0NIRU1BX1ZBTElEQVRPUiIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+Ci0JCTx2YWxpZGF0b3I+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCWNhc2VTZW5zaXRpdmU9ImZhbHNlIgotCQkJCW5hbWVGaWx0ZXI9IioueHNkIj4KLQkJCTwvZmlsdGVyPgotCQkJCi0JCQk8aGVscGVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuSGVscGVyIj4KLQkJCTwvaGVscGVyPgotCQkJCi0JCQk8cnVuCi0gICAgICAgICBhc3luYz0idHJ1ZSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlhTRERlbGVnYXRpbmdWYWxpZGF0b3IiCi0gICAgICAgICBlbmFibGVkPSJ0cnVlIgotICAgICAgICAgZnVsbEJ1aWxkPSJ0cnVlIgotICAgICAgICAgaW5jcmVtZW50YWw9InRydWUiPgotCQkJPC9ydW4+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCS0tPgotCQotICAgPGV4dGVuc2lvbiBpZD0ieHNkIiBuYW1lPSIlX1VJX1hNTF9TQ0hFTUFfVkFMSURBVE9SIiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiPgotICAgICAgPHZhbGlkYXRvcgotICAgICAgICAgICAgYnVpbGQ9InRydWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5YU0REZWxlZ2F0aW5nVmFsaWRhdG9yIgotICAgICAgICAgICAgbWFudWFsPSJ0cnVlIgotICAgICAgICAgICAgc291cmNlaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWFNEIgotICAgICAgICAgICAgdmVyc2lvbj0iMiIKLSAgICAgICAgICAgIG1hcmtlcklkPSJvcmcuZWNsaXBzZS54c2QuZGlhZ25vc3RpYyI+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9InhzZCI+PC9maWxlZXh0PgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvckRlbGVnYXRlcyI+Ci0gICAgCTxkZWxlZ2F0ZQotICAgICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yIgotCQkJbmFtZT0iJV9VSV9YRVJDRVNfVkFMSURBVE9SX0RFTEVHQVRFIgotICAgICAgICAJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlhTRERlbGVnYXRpbmdWYWxpZGF0b3IiLz4KLQkgPC9leHRlbnNpb24+Ci0gCSAKLQkgPCEtLSBpbml0aWFsaXplIHhtbCBjb3JlIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBBZGQgc2NoZW1hcyB0byBYTUwgQ2F0YWxvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNhdGFsb2dDb250cmlidXRpb25zIj4KLQkJPGNhdGFsb2dDb250cmlidXRpb24gaWQ9ImRlZmF1bHQiPgotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJCXVyaT0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS54c2QvY2FjaGUvd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS54c2QiIC8+Ci0JCQk8c3lzdGVtCi0JCQkJc3lzdGVtSWQ9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIKLQkJCQl1cmk9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UueHNkL2NhY2hlL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8+CQkJCQotCQk8L2NhdGFsb2dDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTURvY3VtZW50RmFjdG9yeVhTRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTURvY3VtZW50RmFjdG9yeVhTRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWViNWQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvQ01Eb2N1bWVudEZhY3RvcnlYU0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYWNrYWdlOwotCi0vKioKLSAqICBUaGlzIGJ1aWxkZXIgaGFuZGxlcyBidWlsZGluZyAuZHRkIC8gLnhzZCBncmFtbWFyIGZpbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeVhTRCBpbXBsZW1lbnRzIENNRG9jdW1lbnRGYWN0b3J5Ci17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9GSUxFX1RZUEUgPSAiWFNEIjsKLQotICBwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnlYU0QoKSAKLSAgeyAgCi0gICAgLy8gaGVyZSB3ZSBjYWxsIGluaXQgb24gdGhlIFhTRCBhbmQgRFREIHBhY2thZ2VzIHRvIGF2b2lkIHN0cmFuZ2UgaW5pdGlhbGl6YXRpb24gYnVncwotICAgIC8vCi0gICAgWFNEUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0gICAgWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNERmFjdG9yeSgpOyAgCi0gIH0KLQotIAotICBwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgICAJCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBYU0RJbXBsLmJ1aWxkQ01Eb2N1bWVudCh1cmkpOyAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7ICAKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvQ01Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmY2E1NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENNTm9kZUltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIENNTm9kZQotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OID0gImRvY3VtZW50YXRpb24iOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX1NPVVJDRSA9ICJkb2N1bWVudGF0aW9uU291cmNlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9MQU5HVUFHRSA9ICJkb2N1bWVudGF0aW9uTGFuZ3VhZ2UiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9NT0ZfTk9USUZJRVIgPSAia2V5IjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9kZWZpbml0aW9uSW5mbyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFRklOSVRJT04gPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2RlZmluaXRpb24iOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0S2V5KCk7Ci0KLSAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIHJldHVybiBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX01PRl9OT1RJRklFUik7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvYmplY3QpCi0gIHsKLQkgIC8vbm8gcHJvcGVydHllcyBzdXBwb3J0ZWQ/IAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRENNTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RDTU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2MWE1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRENNTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBYU0RDTU1hbmFnZXIgZXh0ZW5kcyBQbHVnaW4gCi17Ci0gIHByaXZhdGUgc3RhdGljIFhTRENNTWFuYWdlciBpbnN0YW5jZTsKLSAgCi0gIHB1YmxpYyBYU0RDTU1hbmFnZXIoKSAKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgWFNEQ01NYW5hZ2VyIGdldEluc3RhbmNlKCkgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBYU0RDTU1hbmFnZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzdGFydHVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gCi0gIHsKLSAgICBYU0RUeXBlVXRpbC5pbml0aWFsaXplKCk7Ci0gICAgLy9Db250ZW50TW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0SW5mZXJyZWRHcmFtbWFyRmFjdG9yeShuZXcgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeUltcGwoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNESW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYmRjMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGJ1ZyAxNTcyNTQgLSByZWZlcmVuY2VkIEF0dHJpYnV0ZXMgYW5kIEVsZW1lbnRzCi0gKiAgICAgICAgd2VyZSBub3QgYmVpbmcgY2hlY2tlZCB0byBzZWUgaWYgdGhleSBoYWQgdGhlIGFubm90YXRpb25zIGlmCi0gKiAgICAgICAgbm9uZSB3ZXJlIGRlZmluZWQgbG9jYWxseS4gKEluaXRpYWwgZml4IG1vZGlmaWVkIC0gc2VlIGJ1ZykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTURhdGFUeXBlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01FbnRpdHlEZWNsYXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTm9kZUxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURlc2NyaXB0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsLlhTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERW51bWVyYXRpb25GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFZhcmlldHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2g7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBidWlsZCBjbW5vZGVzIGZyb20gWE1MIFNjaGVtYSBub2Rlcy4gVGhlIFhNTCBTY2hlbWEgbW9kZWwgaXMKLSAqIGZvdW5kIGluIHRoZSBvcmcuZWNsaXBzZS54c2QgcGx1Z2luLgotICogCi0gKiBUT0RPOiBnZXROYW1lc3BhY2VVUkkoKWN1cnJlbnRseSBhbHdheXMgcmV0dXJucyAnIyNhbnknLgotICovCi1wdWJsaWMgY2xhc3MgWFNESW1wbAotewotICAvKgotICAgKiBwcm9wZXJ0aWVzIGNvbW1vbiB0byBhbGwgY21ub2RlcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZGVmaW5lZCBpbgotICAgKiBDTU5vZGVJbXBsIGNsYXNzOiBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OIFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fU09VUkNFCi0gICAqIFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fTEFOR1VBR0UgUFJPUEVSVFlfTU9GX05PVElGSUVSCi0gICAqIFBST1BFUlRZX0RFRklOSVRJT05fSU5GTyBQUk9QRVJUWV9ERUZJTklUSU9OCi0gICAqIAotICAgKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzLCBYU0RJbXBsOgotICAgKiBQUk9QRVJUWV9DTURPQ1VNRU5UIFBST1BFUlRZX1VTRVNfTE9DQUxfRUxFTUVOVF9ERUNMQVJBVElPTlMKLSAgICogUFJPUEVSVFlfSVNfTkFNRV9TUEFDRV9BV0FSRSBQUk9QRVJUWV9OU19QUkVGSVhfUVVBTElGSUNBVElPTgotICAgKiBQUk9QRVJUWV9OSUxMQUJMRSBQUk9QRVJUWV9TUEVDCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9DTURPQ1VNRU5UID0gIkNNRG9jdW1lbnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9VU0VTX0xPQ0FMX0VMRU1FTlRfREVDTEFSQVRJT05TID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy91c2VzTG9jYWxFbGVtZW50RGVjbGFyYXRpb25zIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfSVNfTkFNRV9TUEFDRV9BV0FSRSA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvaXNOYW1lU3BhY2VBd2FyZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05TX1BSRUZJWF9RVUFMSUZJQ0FUSU9OID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uc1ByZWZpeFF1YWxpZmljYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OSUxMQUJMRSA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvbmlsbGFibGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TUEVDID0gInNwZWMiOwotICAvKgotICAgKiBwcm9wZXJ0aWVzIGNvbW1vbiB0byBhbGwgQ01Eb2N1bWVudCBub2RlczogUFJPUEVSVFlfVEFSR0VUX05BTUVTUEFDRV9VUkkKLSAgICogUFJPUEVSVFlfSU1QT1JURURfTkFNRVNQQUNFX0lORk8gUFJPUEVSVFlfTkFNRVNQQUNFX0lORk8KLSAgICogUFJPUEVSVFlfRUxFTUVOVF9GT1JNX0RFRkFVTFQgUFJPUEVSVFlfQU5OT1RBVElPTl9NQVAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1RBUkdFVF9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9JTVBPUlRFRF9OQU1FU1BBQ0VfSU5GTyA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvaW1wb3J0ZWROYW1lc3BhY2VJbmZvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRVNQQUNFX0lORk8gPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25hbWVzcGFjZUluZm8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9FTEVNRU5UX0ZPUk1fREVGQVVMVCA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZWxlbWVudEZvcm1EZWZhdWx0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQU5OT1RBVElPTl9NQVAgPSAiYW5ub3RhdGlvbk1hcCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0NPTVBMRVRFX05BTUVTUEFDRV9JTkZPID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9jb21wbGV0ZU5hbWVzcGFjZUluZm8iOwotICAvKgotICAgKiBwcm9wZXJ0aWVzIGNvbW1vbiB0byBhbGwgQ01FbGVtZW50RGVjbGFyYXRpb24gbm9kZXM6IFBST1BFUlRZX1hTSVRZUEVTCi0gICAqIFBST1BFUlRZX0RFUklWRURfRUxFTUVOVF9ERUNMQVJBVElPTiBQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVAKLSAgICogUFJPUEVSVFlfQUJTVFJBQ1QKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hTSVRZUEVTID0gIlhTSVR5cGVzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVSSVZFRF9FTEVNRU5UX0RFQ0xBUkFUSU9OID0gIkRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVAgPSAiU3Vic3RpdHV0aW9uR3JvdXAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVBfVkFMVUUgPSAiU3Vic3RpdHV0aW9uR3JvdXBWYWx1ZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FCU1RSQUNUID0gIkFic3RyYWN0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfV0hJVEVTUEFDRV9GQUNFVCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLmNtLnByb3BlcnRpZXMvd2hpdGVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIERlZmluaXRpb24gaW5mbyBmb3IgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZJTklUSU9OX0lORk9fR0xPQkFMID0gImdsb2JhbCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRklOSVRJT05fSU5GT19MT0NBTCA9ICJsb2NhbCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9MQU5HX0FUVFJJQlVURSA9ICJ4bWw6bGFuZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1BST1RPQ09MID0gInBsYXRmb3JtOiI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgWFNEQWRhcHRlckZhY3RvcnlJbXBsIHhzZEFkYXB0ZXJGYWN0b3J5SW1wbCA9IG5ldyBYU0RBZGFwdGVyRmFjdG9yeUltcGwoKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBYU0lEb2N1bWVudCB4c2lEb2N1bWVudCA9IG5ldyBYU0lEb2N1bWVudCgpOwotCi0gIC8qKgotICAgKiBHaXZlbiB1cmkgZm9yIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQsIHBhcnNlIHRoZSBkb2N1bWVudCBhbmQgYnVpbGQKLSAgICogY29ycmVzcG9uZGluZyBDTURvY3VtZW50IG5vZGUuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIC0KLSAgICogICAgICAgICAgdGhlIHVyaSBmb3IgYW4gWE1MIFNjaGVtYSBkb2N1bWVudAotICAgKiBAcGFyYW0gZ3JhbW1hckVycm9yQ2hlY2tpbmcgLQotICAgKiAgICAgICAgICBncmFtbWFyIGVycm9yIGNoZWNraW5nIGZsYWcKLSAgICogQHBhcmFtIGVycm9yTGlzdCAtCi0gICAqICAgICAgICAgIHRoZSByZXN1bHRpbmcgZXJyb3IgbGlzdAotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENNRG9jdW1lbnQgbm9kZS4KLSAgICogQGRlcHJlY2F0ZWQgLS0gdXNlIGJ1aWxkQ01Eb2N1bWVudChTdHJpbmcgdXJpKQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudChTdHJpbmcgdXJpLCBpbnQgZ3JhbW1hckVycm9yQ2hlY2tpbmcsIExpc3QgZXJyb3JMaXN0KQotICB7Ci0gICAgcmV0dXJuIGJ1aWxkQ01Eb2N1bWVudCh1cmkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIHVyaSBmb3IgYW4gWE1MIFNjaGVtYSBkb2N1bWVudCwgcGFyc2UgdGhlIGRvY3VtZW50IGFuZCBidWlsZAotICAgKiBjb3JyZXNwb25kaW5nIENNRG9jdW1lbnQgbm9kZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgLQotICAgKiAgICAgICAgICB0aGUgdXJpIGZvciBhbiBYTUwgU2NoZW1hIGRvY3VtZW50Ci0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgQ01Eb2N1bWVudCBub2RlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudChTdHJpbmcgdXJpKQotICB7Ci0gICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gbnVsbDsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gYnVpbGRYU0RNb2RlbCh1cmkpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNtRG9jdW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gdXJpIGZvciBhbiBYTUwgU2NoZW1hIGRvY3VtZW50LCBwYXJzZSB0aGUgZG9jdW1lbnQgYW5kIGJ1aWxkCi0gICAqIGNvcnJlc3BvbmRpbmcgQ01Eb2N1bWVudCBub2RlLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSAtCi0gICAqICAgICAgICAgIHRoZSB1cmkgZm9yIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQKLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDTURvY3VtZW50IG5vZGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFhTRFNjaGVtYSBidWlsZFhTRE1vZGVsKFN0cmluZyB1cmlTdHJpbmcpCi0gIHsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gbnVsbDsKLSAKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBpZiBYTUwgU2NoZW1hIGZvciBTY2hlbWEgaXMgcmVxdWVzdGVkLCBnZXQgaXQgdGhyb3VnaCBzY2hlbWEgbW9kZWwgCi0gICAgICBpZiAodXJpU3RyaW5nLmVuZHNXaXRoKCIyMDAxL1hNTFNjaGVtYS54c2QiKSkKLSAgICAgIHsKLSAgICAgIAl4c2RTY2hlbWEgPSBYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYShYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOwkJCQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAJCi0gICAgICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotICAgICAgICAvL3Jlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgICAgcmVzb3VyY2VTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5KCkpOwotICAgICAgICAgIAotICAgICAgICBVUkkgdXJpID0gY3JlYXRlVVJJKHVyaVN0cmluZyk7ICAgCi0gICAgICAgIAotICAgICAgICAvLyBDUyA6IGJ1ZyAxMTM1MzcgZW5zdXJlIHdlIHBlcmZvcm0gcGh5c2ljYWwgcmVzb2x1dGlvbiBiZWZvcmUgb3BlbmluZyBhIHN0cmVhbSBmb3IgdGhlIHJlc291cmNlCi0gICAgICAgIC8vCi0gICAgICAgIFN0cmluZyBwaHlzaWNhbExvY2F0aW9uID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbigiIiwgIiIsIHVyaVN0cmluZyk7ICAgICAgIAotICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkocGh5c2ljYWxMb2NhdGlvbikpOwotICAgICAgICBYU0RSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoWFNEUmVzb3VyY2VJbXBsKXJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoIioueHNkIikpOwotICAgICAgICByZXNvdXJjZS5zZXRVUkkodXJpKTsKLSAgICAgICAgcmVzb3VyY2UubG9hZChpbnB1dFN0cmVhbSwgbnVsbCk7ICAgICAgICAgCi0gICAgICAgIHhzZFNjaGVtYSA9IHJlc291cmNlLmdldFNjaGVtYSgpOyAgICAgIAotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4geHNkU2NoZW1hOwotICB9Ci0gIAotICAvLyBUT0RPIC4uLiBsb29rcyBsaWtlIHdlIGNhbiByZW1vdmUgdGhpcyBjbGFzcz8KLSAgLy8KLSAgc3RhdGljIGNsYXNzIEludGVybmFsVVJJQ29udmVydGVyIGV4dGVuZHMgVVJJQ29udmVydGVySW1wbAotICB7Ci0gICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGNyZWF0ZVVSTElucHV0U3RyZWFtKFVSSSB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmICgiaHR0cCIuZXF1YWxzKHVyaS5zY2hlbWUoKSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0aGVVUkkgPSB1cmkudG9TdHJpbmcoKTsKLSAgICAgICAgU3RyaW5nIG1hcHBlZCA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZSh0aGVVUkksIHRoZVVSSSwgdGhlVVJJKTsKLSAgICAgICAgaWYgKG1hcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdXJpID0gY3JlYXRlVVJJKG1hcHBlZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBzdXBlci5jcmVhdGVVUkxJbnB1dFN0cmVhbSh1cmkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGFwcHJvcHJpYXRlIFVSSSBiYXNlZCBvbiBhIHVyaSBzdHJpbmcuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpU3RyaW5nIC0KLSAgICogICAgICAgICAgYSB1cmkgc3RyaW5nLgotICAgKiBAcmV0dXJuIGFuIGFwcHJvcHJpYXRlIFVSSSBiYXNlZCBvbiBhIHVyaSBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoU3RyaW5nIHVyaVN0cmluZykKLSAgewotICAgIGlmIChoYXNQcm90b2NvbCh1cmlTdHJpbmcpKQotICAgICAgcmV0dXJuIFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gVVJJLmNyZWF0ZUZpbGVVUkkodXJpU3RyaW5nKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHVyaS5pbmRleE9mKCI6Iik7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggPiAyKSAvLyBhc3N1bWUgcHJvdG9jb2wgd2l0aCBiZSBsZW5ndGggMyBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUnQycgaW4gJ0M6LycgaXMgbm90IGludGVycHJldGVkIGFzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3RvY29sCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHN0cmluZyBiZWdpbnMgd2l0aCBwbGF0Zm9ybSBwcm90b2NvbC4KLSAgICogCi0gICAqIEBwYXJhbSB1cmlTdHJpbmcgLQotICAgKiAgICAgICAgICBhIHVyaSBzdHJpbmcuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBzdHJpbmcgYmVnaW5zIHdpdGggcGxhdGZvcm0gcHJvdG9jb2wuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gd2l0aFBsYXRmb3JtUHJvdG9jb2woU3RyaW5nIHVyaVN0cmluZykKLSAgewotICAgIHJldHVybiB1cmlTdHJpbmcuc3RhcnRzV2l0aChQTEFURk9STV9QUk9UT0NPTCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzICIxIi4KLSAgICogCi0gICAqIEBwYXJhbSBjb21wb25lbnQgLQotICAgKiAgICAgICAgICBhIGNvbmNyZXRlIGNvbXBvbmVudC4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRNaW5PY2N1cnMoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgaW50IG1pbk9jY3VyID0gMTsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBjb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICBpZiAoKChYU0RQYXJ0aWNsZSkgbykuaXNTZXRNaW5PY2N1cnMoKSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1pbk9jY3VyID0gKChYU0RQYXJ0aWNsZSkgbykuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtaW5PY2N1ciA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtaW5PY2N1cjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgIjEiLgotICAgKiAKLSAgICogQHBhcmFtIGNvbXBvbmVudCAtCi0gICAqICAgICAgICAgIGEgY29uY3JldGUgY29tcG9uZW50LgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldE1heE9jY3VycyhYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpbnQgbWF4T2NjdXIgPSAxOwotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGNvbXBvbmVudC5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKFhTRFBhcnRpY2xlKSBvKS5pc1NldE1heE9jY3VycygpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgbWF4T2NjdXIgPSAoKFhTRFBhcnRpY2xlKSBvKS5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1heE9jY3VyID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1heE9jY3VyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAgICogCi0gICAqIEBwYXJhbSB0eXBlIC0KLSAgICogICAgICAgICAgYSB0eXBlIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gdGhlIGVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUWVBFX05BTUVfQk9PTEVBTiA9ICJib29sZWFuIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFlQRV9WQUxVRV9UUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUWVBFX1ZBTFVFX0ZBTFNFPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlc0ZvclR5cGUoWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vIFNlZSBidWcgMjE0ODA0IC0gQ29udGVudCBhc3Npc3Qgbm90IHNob3dpbmcgdmFsaWQgdmFsdWVzIHdoZW4gaXQncyBhIGNvbXBsZXgKLSAgICAvLyB0eXBlIHdpdGggc2ltcGxlIGNvbnRlbnQKLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB0eXBlID0gKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pdHlwZSkuZ2V0U2ltcGxlVHlwZSgpOwotICAgIH0KLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsgICAgICAgICAKLSAgICAgIGlmIChUWVBFX05BTUVfQk9PTEVBTi5lcXVhbHModHlwZS5nZXROYW1lKCkpICYmIHR5cGUuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkgPT0gdHlwZS5nZXRTY2hlbWEoKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFkZChUWVBFX1ZBTFVFX1RSVUUpOwotICAgICAgICByZXN1bHQuYWRkKFRZUEVfVkFMVUVfRkFMU0UpOwotICAgICAgfSAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gU2ltcGxlIHR5cGVzIGNhbiBiZSBvbmUgb2Y6IGF0b21pYywgbGlzdCBvciB1bmlvbi4KLSAgICAgICAgaW50IHZhcmlldHlUeXBlID0gKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZSkuZ2V0VmFyaWV0eSgpLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgc3dpdGNoICh2YXJpZXR5VHlwZSkKLSAgICAgICAgewotICAgICAgICAgIGNhc2UgWFNEVmFyaWV0eS5BVE9NSUM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlID0gdHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiAhKHR5cGUuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkgPT0gYmFzZVR5cGUuZ2V0U2NoZW1hKCkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0RW51bWVyYXRlZFZhbHVlc0ZvclNpbXBsZVR5cGUoYmFzZVR5cGUsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0RW51bWVyYXRlZFZhbHVlc0ZvclNpbXBsZVR5cGUodHlwZSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBYU0RWYXJpZXR5LkxJU1Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGl0ZW1UeXBlRGVmaW5pdGlvbiA9ICgoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHR5cGUpLmdldEl0ZW1UeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBnZXRFbnVtZXJhdGVkVmFsdWVzRm9yVHlwZShpdGVtVHlwZURlZmluaXRpb24pOwotICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHZhbHVlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgCSAgaWYocmVzdWx0LmluZGV4T2YodmFsdWVzW2pdKSA9PSAtMSkgewotICAgICAgICAgICAgCQkgIHJlc3VsdC5hZGQodmFsdWVzW2pdKTsKLSAgICAgICAgICAgIAkgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBYU0RWYXJpZXR5LlVOSU9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBMaXN0IG1lbWJlclR5cGVzID0gKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZSkuZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgICAgICAgIGlmIChtZW1iZXJUeXBlcyAhPSBudWxsICYmIG1lbWJlclR5cGVzLnNpemUoKSA+IDApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpID0gbWVtYmVyVHlwZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBnZXRFbnVtZXJhdGVkVmFsdWVzRm9yVHlwZShzaW1wbGVUeXBlKTsKLSAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgCSAgaWYocmVzdWx0LmluZGV4T2YodmFsdWVzW2pdKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIAkJICByZXN1bHQuYWRkKHZhbHVlc1tqXSk7Ci0gICAgICAgICAgICAgICAgCSAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgICBTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV07Ci0gICAgcmVzdWx0LnRvQXJyYXkoYXJyYXkpOwotICAgIHJldHVybiBhcnJheTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0RW51bWVyYXRlZFZhbHVlc0ZvclNpbXBsZVR5cGUoWFNEVHlwZURlZmluaXRpb24gdHlwZSwgTGlzdCByZXN1bHQpCi0gIHsKLSAgICBMaXN0IGVudW1lcmF0aW9uRmFjZXRzID0gKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZSkuZ2V0RW51bWVyYXRpb25GYWNldHMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbnVtZXJhdGlvbkZhY2V0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgaS5uZXh0KCk7Ci0gICAgICBMaXN0IHZhbHVlcyA9IGVudW1GYWNldC5nZXRWYWx1ZSgpOwotICAgICAgZm9yIChJdGVyYXRvciBqID0gdmFsdWVzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBqLm5leHQoKTsKLSAgICAgICAgaWYgKG8gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghcmVzdWx0LmNvbnRhaW5zKG8pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQoby50b1N0cmluZygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzIGZyb20gdGhlIGdpdmVuIGFubm90YXRpb24uIFdvcmtpbmcKLSAgICogd2l0aCBkb2N1bWVudGF0aW9uIGVsZW1lbnRzIHJlcXVpcmVzIGRyb3BwaW5nIGRvd24gaW50byB0aGUgRE9NIG1vZGVsLgotICAgKiAKLSAgICogQHBhcmFtIGFubm90YXRpb24gLQotICAgKiAgICAgICAgICBhbiBYU0RBbm5vdGF0aW9uIG5vZGUuCi0gICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbnMoWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICB7Ci0gICAgQ01Ob2RlTGlzdEltcGwgZG9jdW1lbnRhdGlvbnMgPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLSAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgZG9jdW1lbnRhdGlvbnNFbGVtZW50cyA9IGFubm90YXRpb24uZ2V0VXNlckluZm9ybWF0aW9uKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkb2N1bWVudGF0aW9uc0VsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgZG9jdW1lbnRhdGlvbnMuZ2V0TGlzdCgpLmFkZChuZXcgRG9jdW1lbnRhdGlvbkltcGwoKEVsZW1lbnQpIGkubmV4dCgpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkb2N1bWVudGF0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBBZGFwdGVkIGZyb20gcHVibGljIHN0YXRpYyBMaXN0IGZpbmRUeXBlc0Rlcml2ZWRGcm9tKFhTRFNjaGVtYSBzY2hlbWEsCi0gICAqIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpIGluIGNsYXNzIFhTRFNjaGVtYVF1ZXJ5VG9vbHMgZm91bmQgaW4KLSAgICogb3JnLmVjbGlwc2UueHNkIHBsdWdpbi4KLSAgICogCi0gICAqIEZpbmQgdHlwZURlZmluaXRpb25zIHRoYXQgZGVyaXZlIGZyb20gYSBnaXZlbiB0eXBlLgotICAgKiAKLSAgICogQHBhcmFtIHR5cGUKLSAgICogICAgICAgICAgdGhlIHR5cGUgZGVyaXZlZCBmcm9tCi0gICAqIEByZXR1cm4gTGlzdCBvZiBhbnkgWFNEVHlwZURlZmluaXRpb25zIGZvdW5kCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExpc3QgZmluZFR5cGVzRGVyaXZlZEZyb20oWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIEFycmF5TGlzdCB0eXBlc0Rlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgewotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IHR5cGUuZ2V0U2NoZW1hKCk7Ci0gICAgICBTdHJpbmcgbG9jYWxOYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICBpZiAoKG51bGwgIT0gc2NoZW1hKSAmJiAobnVsbCAhPSBsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAvLyBBIGhhbmR5IGNvbnZlbmllbmNlIG1ldGhvZCBxdWlja2x5IGdldHMgYWxsCi0gICAgICAgIC8vIHR5cGVEZWZpbml0aW9ucyB3aXRoaW4gb3VyIHNjaGVtYTsgbm90ZSB0aGF0Ci0gICAgICAgIC8vIHdoZXRoZXIgb3Igbm90IHRoaXMgcmV0dXJucyB0eXBlcyBpbiBpbmNsdWRlZCwKLSAgICAgICAgLy8gaW1wb3J0ZWQsIG9yIHJlZGVmaW5lZCBzY2hlbWFzIGlzIHN1YmplY3QgdG8gY2hhbmdlCi0gICAgICAgIExpc3QgdHlwZWRlZnMgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkZWZzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVkZWYgPSAoWFNEVHlwZURlZmluaXRpb24pIGl0ZXIubmV4dCgpOwotICAgICAgICAgIGlmICh0eXBlZGVmIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFdhbGsgdGhlIGJhc2VUeXBlcyBmcm9tIHRoaXMgdHlwZWRlZiBzZWVpbmcgaWYgYW55Ci0gICAgICAgICAgICAvLyBvZiB0aGVtIG1hdGNoIHRoZSByZXF1ZXN0ZWQgb25lCi0gICAgICAgICAgICBpZiAoaXNUeXBlRGVyaXZlZEZyb20odHlwZWRlZiwgbmFtZXNwYWNlLCBsb2NhbE5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBpdCwgcmV0dXJuIHRoZSBvcmlnaW5hbCBvbmUgYW5kIGNvbnRpbnVlCi0gICAgICAgICAgICAgIHR5cGVzRGVyaXZlZEZyb20uYWRkKHR5cGVkZWYpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzRGVyaXZlZEZyb207Ci0gIH0KLQotICAvKioKLSAgICogQWRhcHRlZCBmcm9tIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1R5cGVEZXJpdmVkRnJvbShYU0RUeXBlRGVmaW5pdGlvbgotICAgKiB0eXBlZGVmLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKSBpbiBjbGFzcyBYU0RTY2hlbWFRdWVyeVRvb2xzCi0gICAqIGZvdW5kIGluIG9yZy5lY2xpcHNlLnhzZCBwbHVnaW4uCi0gICAqIAotICAgKiBSZWN1cnNpdmUgd29ya2VyIG1ldGhvZCB0byBmaW5kIHR5cGVEZWZpbml0aW9ucyB0aGF0IGRlcml2ZSBmcm9tIGEgbmFtZWQKLSAgICogdHlwZS4KLSAgICogCi0gICAqIEBzZWUgI2ZpbmRUeXBlc0Rlcml2ZWRGcm9tKFhTRFNjaGVtYSwgU3RyaW5nLCBTdHJpbmcpCi0gICAqIEBwYXJhbSB0eXBlRGVmCi0gICAqICAgICAgICAgIHRvIHNlZSBpZiBpdCdzIGRlcml2ZWQgZnJvbQotICAgKiBAcGFyYW0gbmFtZXNwYWNlCi0gICAqICAgICAgICAgIGZvciB0aGUgdHlwZSBkZXJpdmVkIGZyb20KLSAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgKiAgICAgICAgICBmb3IgdGhlIHR5cGUgZGVyaXZlZCBmcm9tCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpczsgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNUeXBlRGVyaXZlZEZyb20oWFNEVHlwZURlZmluaXRpb24gdHlwZWRlZiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIC8vIFdhbGsgdGhlIGJhc2VUeXBlcyBmcm9tIHRoaXMgdHlwZWRlZiBzZWVpbmcgaWYgYW55Ci0gICAgLy8gb2YgdGhlbSBtYXRjaCB0aGUgcmVxdWVzdGVkIG9uZQotICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlID0gdHlwZWRlZi5nZXRCYXNlVHlwZSgpOwotICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgCXsKLSAgICAgIC8vIHR5cGVkZWYgaXMgYSByb290IHR5cGUgbGlrZSB4c2Q6YW55VHlwZSwgc28gaXQgaGFzIG5vIGJhc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQXMgdGhpcyBjb252ZW5pZW5jZSBtZXRob2QgaWYgb3VyIHBhcmFtZXRlcnMgbWF0Y2gKLSAgICBpZiAoYmFzZVR5cGUuaGFzTmFtZUFuZFRhcmdldE5hbWVzcGFjZShsb2NhbE5hbWUsIG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIFhTRFR5cGVEZWZpbml0aW9uIHJvb3RUeXBlID0gdHlwZWRlZi5nZXRSb290VHlwZSgpOwotCi0gICAgaWYgKHJvb3RUeXBlID09IGJhc2VUeXBlKQotICAgIHsKLSAgICAgIC8vIElmIHdlJ3ZlIGhpdCB0aGUgcm9vdCwgd2UgYXJlbid0IGRlcml2ZWQgZnJvbSBpdAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gTmVlZCB0byBjaGVjayBpZiB0aGUgYmFzZSB0eXBlIGlzIHJlZGVmaW5lZC9jaXJjdWxhcgotICAgICAgLy8gb3RoZXJ3aXNlIHRoaXMgd2lsbCBiZSBhbiBlbmRsZXNzIHJlY3Vyc2l2ZSBjYWxsLgotICAgICAgLy8gTW92ZWQuICBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMzU0MwotICAgICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggICAgIFhTRENvbnN0YW50cy5pc09ySXNEZXJpdmVkRnJvbShiYXNlVHlwZSwgbG9jYWxOYW1lLCBuYW1lc3BhY2UpOwotICAgICAgaWYgKHJvb3RUeXBlLmlzQ2lyY3VsYXIoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICAvLyBPdGhlcndpc2UgY29udGludWUgdG8gdHJhdmVyc2UgdXB3YXJkcwotICAgICAgcmV0dXJuIGlzVHlwZURlcml2ZWRGcm9tKGJhc2VUeXBlLCBuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgY21ub2RlIG9mIHRoZSBzcGVjaWZpZWQgWE1MIFNjaGVtYSBub2RlLgotICAgKiAKLSAgICogQHBhcmFtIHRhcmdldCAtCi0gICAqICAgICAgICAgIGFuIFhNTCBTY2hlbWEgbm9kZQotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGNtbm9kZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ01Ob2RlIGdldEFkYXB0ZXIoTm90aWZpZXIgbykKLSAgewotICAgIHJldHVybiAoQ01Ob2RlKSB4c2RBZGFwdGVyRmFjdG9yeUltcGwuYWRhcHQobyk7Ci0gIH0KLQotICAvKioKLSAgICogQWRhcHRlZCBmcm9tIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBucywgYm9vbGVhbiB3aXRoQ29sb24pIGluIGNsYXNzCi0gICAqIFR5cGVzSGVscGVyIGZvdW5kIGluIG9yZy5lY2xpcHNlLndzdC54c2QuZWRpdG9yIHBsdWdpbi4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEgLQotICAgKiAgICAgICAgICB0aGUgcmVsZXZhbnQgc2NoZW1hCi0gICAqIEBwYXJhbSBucyAtCi0gICAqICAgICAgICAgIHRoZSByZWxldmFudCBuYW1lc3BhY2UKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZWZpeChYU0RTY2hlbWEgc2NoZW1hLCBTdHJpbmcgbnMpCi0gIHsKLSAgICBTdHJpbmcga2V5ID0gIiI7Ci0gICAgaWYgKChzY2hlbWEgIT0gbnVsbCkgJiYgKG5zICE9IG51bGwpKQotICAgIHsKLSAgICAgIE1hcCBtYXAgPSBzY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotICAgICAgSXRlcmF0b3IgaXRlciA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3Qga2V5T2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG1hcC5nZXQoa2V5T2JqKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKS5lcXVhbHMobnMpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGtleU9iaiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGtleSA9IGtleU9iai50b1N0cmluZygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAga2V5ID0gIiI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBrZXk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBGYWN0b3J5IGZvciB0aGUgWFNEIGFkYXB0ZXIgbW9kZWwuIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaAotICAgKiBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RBZGFwdGVyRmFjdG9yeUltcGwgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLSAgewotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KQotICAgIHsKLSAgICAgIFhTRFN3aXRjaCB4c2RTd2l0Y2ggPSBuZXcgWFNEU3dpdGNoKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEV2lsZGNhcmQoWFNEV2lsZGNhcmQgb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RXaWxkY2FyZEFkYXB0ZXIob2JqZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RBdHRyaWJ1dGVVc2UoWFNEQXR0cmlidXRlVXNlIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNEQXR0cmlidXRlVXNlQWRhcHRlcihvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIob2JqZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFhTRE1vZGVsR3JvdXBBZGFwdGVyKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RTY2hlbWEoWFNEU2NoZW1hIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNEU2NoZW1hQWRhcHRlcihvYmplY3QpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgICAgT2JqZWN0IG8gPSB4c2RTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7Ci0gICAgICBBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChBZGFwdGVyKSBvOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBUaHJlYWQuZHVtcFN0YWNrKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCkKLSAgICB7Ci0gICAgICByZXR1cm4gYWRhcHQodGFyZ2V0LCB0aGlzKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTREJhc2VBZGFwdGVyIC0tIGFuIGFic3RyYWN0IGJhc2Ugbm9kZSBpbiB0aGUgbW9kZWwuIEFsbCBvdGhlciBtb2RlbCBub2RlcwotICAgKiBhcmUgZGVyaXZlZCBmcm9tIGl0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBYU0RCYXNlQWRhcHRlciBleHRlbmRzIENNTm9kZUltcGwKLSAgewotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0SW1wbCBkb2N1bWVudGF0aW9uID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBub2RlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBlbXB0eSBzdHJpbmcgdmFsdWUuCi0gICAgICogQWxsIGRlcml2ZWQgY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlCi0gICAgICogZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgb2YgdGhlIGdpdmVuIGZhY3RvcnkgaXMgdGhlIGZhY3RvcnkgZm9yIHRoaXMgWFNEIGFkYXB0ZXIKLSAgICAgKiBtb2RlbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSAtCi0gICAgICogICAgICAgICAgYSBmYWN0b3J5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoaXMgbW9kZWwuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSB4c2RBZGFwdGVyRmFjdG9yeUltcGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9OU19QUkVGSVhfUVVBTElGSUNBVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9OSUxMQUJMRSkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9VU0VTX0xPQ0FMX0VMRU1FTlRfREVDTEFSQVRJT05TKQotICAgICAgICAgIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfRE9DVU1FTlRBVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX1NPVVJDRSkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX0xBTkdVQUdFKQotICAgICAgICAgIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTU9GX05PVElGSUVSKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT05fSU5GTykgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ERUZJTklUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0NNRE9DVU1FTlQpCi0gICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9JU19OQU1FX1NQQUNFX0FXQVJFKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1NQRUMpIHx8IHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdOaWxsYWJsZScgYXR0cmlidXRlLiBUaGlzIHJlcHJlc2VudHMgdGhlCi0gICAgICogbmlsbGFibGUgaW5mb3NldCBwcm9wZXJ0eS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuIEFsbCBkZXJpdmVkCi0gICAgICogY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdOaWxsYWJsZScgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTmlsbGFibGUoKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbWRvY3VtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgY21ub2RlLiBUaGUgZGVmYXVsdAotICAgICAqIHZhbHVlIGlzIG51bGw7IEFsbCBkZXJpdmVkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvCi0gICAgICogbm90IHdhbnQgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYW4gZW1wdHkKLSAgICAgKiBDTU5vZGVMaXN0OyBBbGwgZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3QKLSAgICAgKiB3YW50IHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIGRvY3VtZW50YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLiBSZXR1cm5zIG51bGwgaWYgdGhlCi0gICAgICogcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfQ01ET0NVTUVOVCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldENNRG9jdW1lbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfRE9DVU1FTlRBVElPTikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldERvY3VtZW50YXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfVVNFU19MT0NBTF9FTEVNRU5UX0RFQ0xBUkFUSU9OUykpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEJvb2xlYW4uVFJVRTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfSVNfTkFNRV9TUEFDRV9BV0FSRSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEJvb2xlYW4uVFJVRTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTlNfUFJFRklYX1FVQUxJRklDQVRJT04pKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTklMTEFCTEUpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBpc05pbGxhYmxlKCkgPyB4c2lEb2N1bWVudC5uaWxBdHRyaWJ1dGUgOiBudWxsOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9NT0ZfTk9USUZJRVIpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRLZXkoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfU1BFQykpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldFNwZWMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICAgICAgewotICAgICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQoKTsKLSAgICAgICAgICBpZiAoY21Eb2N1bWVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYUFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgQW5ub3RhdGlvbk1hcCBtYXAgPSAoKFhTRFNjaGVtYUFkYXB0ZXIpIGNtRG9jdW1lbnQpLmFubm90YXRpb25NYXA7Ci0gICAgICAgICAgICBpZiAobWFwICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyBzcGVjID0gZ2V0U3BlYygpOwotICAgICAgICAgICAgICBpZiAoc3BlYyAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbWFwLmdldFByb3BlcnR5KGdldFNwZWMoKSwgcHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgICAgCi0KLQotICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZvcm0gW2F0dHJpYnV0ZV0gd2hpY2ggYWZmZWN0cyB0aGUgdGFyZ2V0Ci0gICAgICogbmFtZXNwYWNlIG9mIGxvY2FsbHkgc2NvcGVkIGZlYXR1cmVzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBudWxsLiBBbGwKLSAgICAgKiBkZXJpdmVkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdCB3YW50IHRoZSBkZWZhdWx0Ci0gICAgICogdmFsdWUuIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmb3JtIFthdHRyaWJ1dGVdLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0TlNQcmVmaXhRdWFsaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZ2VuZXJhbCBYUGF0aCBleHByZXNzaW9uIGZvciB0aGUgbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgZ2VuZXJhbCBYUGF0aCBleHByZXNzaW9uIGZvciB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNwZWMoKQotICAgIHsKLSAgICAgIHJldHVybiAiLy8iICsgZ2V0Tm9kZU5hbWUoKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTRFNjaGVtYUFkYXB0ZXIgaW1wbGVtZW50cyBDTURvY3VtZW50LiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbAotICAgKiBvYmplY3QgJ1NjaGVtYScuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRFNjaGVtYUFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNRG9jdW1lbnQKLSAgewotICAgIHByb3RlY3RlZCBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICAgIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgbmFtZWROb2RlTWFwOwotICAgIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgZW50aXR5Tm9kZU1hcDsKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBhbm5vdGF0aW9uTWFwID0gbmV3IEFubm90YXRpb25NYXAoKTsKLSAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHN1YnN0aXR1dGlvbkdyb3VwVGFibGU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0geHNkU2NoZW1hIC0KLSAgICAgKiAgICAgICAgICB0aGUgc2NoZW1hIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFhTRFNjaGVtYUFkYXB0ZXIoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgICB7Ci0gICAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsZW5hbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmlsZW5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgLy8gU2VlIGJ1aWxkQ01Eb2N1bWVudCgpIGFib3ZlLgotICAgICAgcmV0dXJuIHhzZFNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkIGZvciB0aGlzIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfVEFSR0VUX05BTUVTUEFDRV9VUkkpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfSU1QT1JURURfTkFNRVNQQUNFX0lORk8pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTkFNRVNQQUNFX0lORk8pCi0gICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9FTEVNRU5UX0ZPUk1fREVGQVVMVCkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9BTk5PVEFUSU9OX01BUCkgfHwgc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYSBwcmVmaXggaXMgZ2xvYmFsbHkgcmVxdWlyZWQgZm9yIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB4c2RTY2hlbWEgLQotICAgICAqICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIHNjaGVtYSBub2RlLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIHByZWZpeCBpcyBnbG9iYWxseSByZXF1aXJlZCBmb3IgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQcmVmaXhSZXF1aXJlZChYU0RTY2hlbWEgeHNkU2NoZW1hKQotICAgIHsKLSAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIGlmICh4c2RTY2hlbWEuaXNTZXRFbGVtZW50Rm9ybURlZmF1bHQoKSkKLSAgICAgICAgcmVzdWx0ID0gISh4c2RTY2hlbWEuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkuZ2V0VmFsdWUoKSA9PSBYU0RGb3JtLlFVQUxJRklFRCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZQotICAgICAqIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1RBUkdFVF9OQU1FU1BBQ0VfVVJJKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9JTVBPUlRFRF9OQU1FU1BBQ0VfSU5GTykpCi0gICAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZ2V0SW1wb3J0ZWROYW1lc3BhY2VJbmZvKHhzZFNjaGVtYSwgbGlzdCk7Ci0gICAgICAgIHJlc3VsdCA9IGxpc3Q7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX05BTUVTUEFDRV9JTkZPKSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgICAgICBpbmZvLnVyaSA9IHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgaW5mby5wcmVmaXggPSBnZXRQcmVmaXgoeHNkU2NoZW1hLCBpbmZvLnVyaSk7Ci0gICAgICAgIGluZm8ubG9jYXRpb25IaW50ID0gbnVsbDsgLy8gbm90ZSB0aGF0IHRoaXMgbG9jYXRpb25IaW50IGluZm8gaXMgbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgcm9vdCB4c2QgZmlsZQotICAgICAgICBpbmZvLmlzUHJlZml4UmVxdWlyZWQgPSBpc1ByZWZpeFJlcXVpcmVkKHhzZFNjaGVtYSk7Ci0gICAgICAgIGxpc3QuYWRkKGluZm8pOwotICAgICAgICBnZXRJbXBvcnRlZE5hbWVzcGFjZUluZm8oeHNkU2NoZW1hLCBsaXN0KTsKLSAgICAgICAgcmVzdWx0ID0gbGlzdDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfQ09NUExFVEVfTkFNRVNQQUNFX0lORk8pKQotICAgICAgewotICAgIAkgIHJlc3VsdCA9IGdldEFsbE5hbWVzcGFjZUluZm8oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfRUxFTUVOVF9GT1JNX0RFRkFVTFQpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkuZ2V0TmFtZSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9BTk5PVEFUSU9OX01BUCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGFubm90YXRpb25NYXA7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJhbGxFbGVtZW50cyIpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRBbGxFbGVtZW50cygpOwotICAgICAgfSAgCi0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aCgiZ2V0RWxlbWVudEZvclR5cGUjIikpCi0gICAgICB7Ci0gICAgICAgIGludCBpbmRleCA9IHByb3BlcnR5TmFtZS5pbmRleE9mKCIjIik7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBwcm9wZXJ0eU5hbWUubGVuZ3RoKCkpOwotICAgICAgICAvLwotICAgICAgICAvLwotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IHhzZFNjaGVtYS5yZXNvbHZlVHlwZURlZmluaXRpb24odHlwZU5hbWUpOwotICAgICAgICBpZiAodGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIExvY2FsRWxlbWVudFZpc2l0b3IgbG9jYWxFbGVtZW50VmlzaXRvciA9IG5ldyBMb2NhbEVsZW1lbnRWaXNpdG9yKCk7Ci0gICAgICAgICAgbG9jYWxFbGVtZW50VmlzaXRvci52aXNpdFR5cGVEZWZpbml0aW9uKHRkKTsKLSAgICAgICAgICByZXN1bHQgPSBsb2NhbEVsZW1lbnRWaXNpdG9yLmdldENNTmFtZWROb2RlTWFwKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2F0aGVyIGluZm9ybWF0aW9uIG9uIG5hbWVzcGFjZXMgdXNlZCBpbiBleHRlcm5hbCByZWZlcmVuY2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0aGVYU0RTY2hlbWEgLQotICAgICAqICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIHNjaGVtYSBub2RlCi0gICAgICogQHBhcmFtIGxpc3QgLQotICAgICAqICAgICAgICAgIHRoZSBsaXN0IG9mIGltcG9ydGVkIG5hbWVzcGFjZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0SW1wb3J0ZWROYW1lc3BhY2VJbmZvKFhTRFNjaGVtYSB0aGVYU0RTY2hlbWEsIExpc3QgbGlzdCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhlWFNEU2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RJbXBvcnQgeEltcG9ydCA9IChYU0RJbXBvcnQpIGNvbnRlbnQ7Ci0gICAgICAgICAgWFNEU2NoZW1hIGltcG9ydGVkWFNEU2NoZW1hID0geEltcG9ydC5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgICAgICAgaW5mby51cmkgPSB4SW1wb3J0LmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgIGluZm8ucHJlZml4ID0gZ2V0UHJlZml4KGltcG9ydGVkWFNEU2NoZW1hLCBpbmZvLnVyaSk7Ci0gICAgICAgICAgaW5mby5sb2NhdGlvbkhpbnQgPSB4SW1wb3J0LmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgICAgICAgaWYgKGltcG9ydGVkWFNEU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5mby5pc1ByZWZpeFJlcXVpcmVkID0gaXNQcmVmaXhSZXF1aXJlZChpbXBvcnRlZFhTRFNjaGVtYSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGxpc3QuYWRkKGluZm8pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBzZXQgb2YgbmFtZWQgKHRvcC1sZXZlbCkgZWxlbWVudCBkZWNsYXJhdGlvbnMgZm9yIHRoaXMgc2NoZW1hCi0gICAgICogbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIG5hbWVkICh0b3AtbGV2ZWwpIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpCi0gICAgewotICAgICAgaWYgKG5hbWVkTm9kZU1hcCA9PSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lZE5vZGVNYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBOb3RlIHRoYXQgaWYgd2UgY2FsbCB4c2RTY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpCi0gICAgICAgIC8vIHdlIGdldCAnbW9yZScgZWxlbWVudHMgdGhhbiB3ZSByZWFsbHkgd2FudCBzaW5jZSB3ZSBhbHNvCi0gICAgICAgIC8vIGdldCAnaW1wb3J0ZWQnIGVsZW1lbnRzLiAgQmVsb3cgd2UgdGVzdCB0byBlbnN1cmUgdGhlIGVsZW1lbnRzCi0gICAgICAgIC8vIGFjdHVhbGx5IGhhdmUgdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgc2NoZW1hLgotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCA/IHRhcmdldE5hbWVzcGFjZS5lcXVhbHMoZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpIDogZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikgZ2V0QWRhcHRlcihlZCk7Ci0gICAgICAgICAgICBuYW1lZE5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KGFkYXB0ZXIuZ2V0Tm9kZU5hbWUoKSwgYWRhcHRlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmFtZWROb2RlTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJ1aWx0LWluIGVudGl0eSBkZWNsYXJhdGlvbnMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYnVpbHQtaW4gZW50aXR5IGRlY2xhcmF0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKQotICAgIHsKLSAgICAgIGlmIChlbnRpdHlOb2RlTWFwID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGVudGl0eU5vZGVNYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gICAgICAgIC8vIGFkZCB0aGUgYnVpbHQgaW4gZW50aXR5IGRlY2xhcmF0aW9ucwotICAgICAgICBlbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgiYW1wIiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJhbXAiLCAiJiIpKTsKLSAgICAgICAgZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImx0IiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJsdCIsICI8IikpOwotICAgICAgICBlbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgiZ3QiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoImd0IiwgIj4iKSk7Ci0gICAgICAgIGVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJxdW90IiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJxdW90IiwgIlwiIikpOwotICAgICAgICBlbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgiYXBvcyIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiYXBvcyIsICInIikpOwotICAgICAgfQotICAgICAgcmV0dXJuIGVudGl0eU5vZGVNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAqIChBTllfRUxFTUVOVCwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBEQVRBX1RZUEUsIERPQ1VNRU5ULAotICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gRE9DVU1FTlQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIG51bGwuICEhISBXaHkgYXJlIHdlIG5vdCBpbXBsZW1lbnRpbmcgdGhpcz8/Pz8gQHJldHVybiBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBbGxFbGVtZW50cygpCi0gICAgewotICAgICAgQ01OYW1lZE5vZGVNYXBJbXBsIG1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24paS5uZXh0KCk7Ci0gICAgICAgIG1hcC5wdXQoZWQpOyAgICAgICAgICAgCi0gICAgICAgIGFkZExvY2FsRWxlbWVudERlZmluaXRpb25zKG1hcCwgZWQpOyAgICAgICAgICAgICAgCi0gICAgICB9ICAgICAKLSAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFkZExvY2FsRWxlbWVudERlZmluaXRpb25zKENNTmFtZWROb2RlTWFwSW1wbCBtYXAsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBDTU5hbWVkTm9kZU1hcCBsb2NhbEVsZW1lbnRNYXAgPSBwYXJlbnRFbGVtZW50RGVjbGFyYXRpb24uZ2V0TG9jYWxFbGVtZW50cygpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbG9jYWxFbGVtZW50TWFwLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWkubmV4dCgpOwotICAgICAgICBpZiAobWFwLmdldE5hbWVkSXRlbShlZC5nZXROb2RlTmFtZSgpKSA9PSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICBtYXAucHV0KGVkKTsgICAgICAgIAotICAgICAgICAgIGFkZExvY2FsRWxlbWVudERlZmluaXRpb25zKG1hcCwgZWQpOwotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAgICAgICAgICAKLSAgICB9IAotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhIExpc3Qgb2YgTmFtZXNwYWNlSW5mbyBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIGdpdmVuIHNjaGVtYSAKLSAgICAgKiBhbmQgdGhlIHRhcmdldCBuYW1lc3BhY2VzIG9mIGFsbCBpdHMgcmVjdXJzaXZlbHkgaW1wb3J0ZWQvaW5jbHVkZWQgcmVmZXJlbmNlZCBzY2hlbWFzLiBBbGwgbmFtZXNwYWNlCi0gICAgICogcHJlZml4ZXMgaW4gdGhlIGxpc3QgYXJlIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlLiBQcmVmaXggY29sbGl0aW9ucyBhcmUgcmVzb2x2ZWQgYnkgY29uY2F0ZW5hdGluZwotICAgICAqIGludGVnZXIgbnVtYmVycyB0byBlYWNoIHJlcGVhdGVkIHByZWZpeCBmb3VuZCBpLmUuIHRucywgdG5zMSwgdG5zMi4uLgotICAgICAqIEFsbCBzY2hlbWEgbG9jYXRpb25zIGluIHRoZSBsaXN0IGFyZSBmb3JtYXRlZCBhcyBlbmNvZGVkIFVSSXMgcmVsYXRpdmUgdG8gdGhlIGdpdmVuIHNjaGVtYS4KLSAgICAgKiBTY2hlbWFzIHRoYXQgYXJlIGltcG9ydGVkL2luY2x1ZGVkIGJ1dCBub3QgcmVmZXJlbmNlZCB3aWxsIG5vdCBhcHBlYXIgaW4gdGhlIGxpc3QuCi0gICAgICogQHJldHVybiBMaXN0IG9mIE5hbWVzcGFjZUluZm8gb2JqZWN0cwotICAgICAqIAotICAgICAqLwotCXB1YmxpYyBMaXN0IGdldEFsbE5hbWVzcGFjZUluZm8oKSB7Ci0JCUxpc3QgbmFtZXNwYWNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByZXNvdXJjZXMgID0geHNkU2NoZW1hLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCUl0ZXJhdG9yIGkgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaS5oYXNOZXh0KCkpIHsKLQkJCVhTRFJlc291cmNlSW1wbCByZXNvdXJjZSA9IChYU0RSZXNvdXJjZUltcGwpIGkubmV4dCgpOwotCQkJaWYocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCVhTRFNjaGVtYSBzY2hlbWEgPSByZXNvdXJjZS5nZXRTY2hlbWEoKTsKLQkJCQlpZighaXNEYXRhSW5OYW1lc3BhY2VMaXN0KG5hbWVzcGFjZUxpc3QsIDAsIHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsKLQkJCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLQkJCQkJaW5mby51cmkgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJCWluZm8uaXNQcmVmaXhSZXF1aXJlZCA9IGlzUHJlZml4UmVxdWlyZWQoc2NoZW1hKTsKLQkJCQkJaW5mby5wcmVmaXggPSBnZXRQcmVmaXgoc2NoZW1hLHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCQkJCWlmKCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLmVxdWFscyhpbmZvLnVyaSkpIHsKLSAgICAJCQkJCWluZm8ucHJlZml4ID0gInhtbCI7Ci0gICAgCQkJCX0gZWxzZSBpZigiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucyIuZXF1YWxzKGluZm8udXJpKSkgewotICAgIAkJCQkJaW5mby5wcmVmaXggPSAieG1sbnMiOwotICAgIAkJCQl9IGVsc2UgewotICAgIAkJCQkJaWYoaW5mby51cmkgIT0gbnVsbCAmJiBpbmZvLnVyaSAhPSAiIikgewotCSAgICAJCQkJCWludCBuID0gMTsKLQkgICAgCSAgICAJCQlpZihpbmZvLnByZWZpeCA9PSBudWxsIHx8IGluZm8ucHJlZml4LmVxdWFscygiIikpIHsKLQkgICAgCSAgICAJCQkJaW5mby5wcmVmaXggPSAicCI7Ci0JICAgIAkgICAgCQkJfQotCSAgICAJICAgIAkJCVN0cmluZyBwcmVmaXggPSBpbmZvLnByZWZpeDsKLQkgICAgCSAgICAJCQl3aGlsZShpc0RhdGFJbk5hbWVzcGFjZUxpc3QobmFtZXNwYWNlTGlzdCwgMSwgaW5mby5wcmVmaXgpKSB7Ci0JICAgIAkgICAgCQkJCWluZm8ucHJlZml4ID0gcHJlZml4ICsgbisrOwotCSAgICAJICAgIAkJCX0KLSAgICAJCQkJCX0KLSAgICAJCQkJfQotCSAgICAJCQlVUkkgcmVsYXRpdmUgPSBVUkkuY3JlYXRlVVJJKHhzZFNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpLCB0cnVlKTsKLQkJCQkJVVJJIGFic29sdXRlID0gVVJJLmNyZWF0ZVVSSShzY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKSwgdHJ1ZSk7Ci0JCQkJCVVSSSByZXNvbHZlZFJlbGF0aXZlID0gYWJzb2x1dGUuZGVyZXNvbHZlKHJlbGF0aXZlKTsKLQkJCQkJaW5mby5sb2NhdGlvbkhpbnQgPSByZXNvbHZlZFJlbGF0aXZlLnRvU3RyaW5nKCk7Ci0JICAgIAkJCW5hbWVzcGFjZUxpc3QuYWRkKGluZm8pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZXNwYWNlTGlzdDsJCi0JfQotCi0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBmb3IgYSBnaXZlbiB2YWx1ZSBpbiBhIGxpc3Qgb2YgbmFtZXNwYWNlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlTGlzdDoJTGlzdCBvZiBOYW1lc3BhY2VJbmZvIG9iamVjdHMKLSAgICAgKiBAcGFyYW0gZGF0YToJCQkJaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIGRhdGEgaW4gdGhlIG5hbWVzcGFjZSBhcyBmb2xsb3dzOgotICAgICAqIAkJCQkJCQkJMDoJdXJpCi0gICAgICogCQkJCQkJCQkxOglwcmVmaXgKLSAgICAgKiAJCQkJCQkJCTI6CWxvY2F0aW9uSGludAotICAgICAqIEBwYXJhbSB2YWx1ZQkJCQlTdHJpbmcgY29udGFpbmluZyB0aGUgdmFsdWUgZm9yIHNlYXJjaAotICAgICAqIEByZXR1cm4JCQkJCXRydWUgaWYgdGhlIHZhbHVlIGlzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEYXRhSW5OYW1lc3BhY2VMaXN0KExpc3QgbmFtZXNwYWNlTGlzdCwgaW50IGRhdGEsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAobmFtZXNwYWNlTGlzdCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpID0gbmFtZXNwYWNlTGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBuYW1lc3BhY2VJbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJCXN3aXRjaChkYXRhKSB7Ci0JCQkJCWNhc2UgMDoJaWYgKG5hbWVzcGFjZUluZm8udXJpICE9IG51bGwgJiYgbmFtZXNwYWNlSW5mby51cmkuZXF1YWxzKHZhbHVlKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJY2FzZSAxOglpZiAobmFtZXNwYWNlSW5mby5wcmVmaXggIT0gbnVsbCAmJiBuYW1lc3BhY2VJbmZvLnByZWZpeC5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQljYXNlIDI6CWlmIChuYW1lc3BhY2VJbmZvLmxvY2F0aW9uSGludCAhPSBudWxsICYmIG5hbWVzcGFjZUluZm8ubG9jYXRpb25IaW50LmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLiBBIHJlcHJlc2VudGF0aW9uCi0gICAqIG9mIHRoZSBtb2RlbCBvYmplY3QgJ0F0dHJpYnV0ZSBVc2UnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uCi0gIHsKLSAgICAvLyBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFhNTCBTY2hlbWEgbm9kZQotICAgIHByb3RlY3RlZCBYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0cmlidXRlVXNlOwotICAgIC8vIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlCi0gICAgcHJvdGVjdGVkIENNRGF0YVR5cGUgZGF0YVR5cGUgPSBuZXcgRGF0YVR5cGVJbXBsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0geHNkQXR0cmlidXRlVXNlIC0KLSAgICAgKiAgICAgICAgICB0aGUgWE1MIFNjaGVtYSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKFhTREF0dHJpYnV0ZVVzZSB4c2RBdHRyaWJ1dGVVc2UpCi0gICAgewotICAgICAgdGhpcy54c2RBdHRyaWJ1dGVVc2UgPSB4c2RBdHRyaWJ1dGVVc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUga2V5IGZvciB0aGlzIGNtbm9kZSB3aGljaCBpcyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hCi0gICAgICogbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkQXR0cmlidXRlVXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBnZW5lcmFsIFhQYXRoIGV4cHJlc3Npb24gZm9yIHRoZSBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBnZW5lcmFsIFhQYXRoIGV4cHJlc3Npb24gZm9yIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3BlYygpCi0gICAgewotICAgICAgcmV0dXJuICIvL0AiICsgZ2V0QXR0ck5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBBVFRSSUJVVEVfREVDTEFSQVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbm9kZS4gU2ltaWxhciB0byBnZXRBdHRyTmFtZSgpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuIGdldEF0dHJOYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0RW51bUF0dHIgbWV0aG9kCi0gICAgICogCi0gICAgICogQHJldHVybiBqYXZhLnV0aWwuRW51bWVyYXRpb24KLSAgICAgKiBAZGVwcmVjYXRlZCAtLSB0byBiZSByZXBsYWNlZCBpbiBmdXR1cmUgd2l0aCBhZGRpdGlvbmFsIENNRGF0YVR5cGUKLSAgICAgKiAgICAgICAgICAgICBtZXRob2RzIChjdXJyZW50bHkgZm91bmQgb24gQ01EYXRhVHlwZUhlbHBlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKQotICAgIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgYXR0cmlidXRlLiBTaW1pbGFyIHRvIGdldE5vZGVOYW1lKCkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkQXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBkYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBvciBmaXhlZCBjb25zdHJhaW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBkZWZhdWx0IG9yIGZpeGVkIGNvbnN0cmFpbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKQotICAgIHsKLSAgICAgIHJldHVybiBkYXRhVHlwZS5nZXRJbXBsaWVkVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB1c2FnZSBjb25zdHJhaW50IGZvciB0aGlzIGF0dHJpYnV0ZS4gVGhlIHVzYWdlcyBhcmUgZGVmaW5lZAotICAgICAqIGluIENNQXR0cmlidXRlRGVjbGFyYXRpb24gY2xhc3MgKE9QVElPTkFMLCBSRVFVSVJFRCwgRklYRUQgb3IKLSAgICAgKiBQUk9ISUJJVEVEKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB1c2FnZSBjb25zdHJhaW50IGZvciB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFVzYWdlKCkKLSAgICB7Ci0gICAgICBpbnQgdXNlS2luZCA9IE9QVElPTkFMOwotICAgICAgc3dpdGNoICh4c2RBdHRyaWJ1dGVVc2UuZ2V0VXNlKCkuZ2V0VmFsdWUoKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5PUFRJT05BTCA6IHsKLSAgICAgICAgICB1c2VLaW5kID0gT1BUSU9OQUw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5QUk9ISUJJVEVEIDogewotICAgICAgICAgIHVzZUtpbmQgPSBQUk9ISUJJVEVEOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkuUkVRVUlSRUQgOiB7Ci0gICAgICAgICAgdXNlS2luZCA9IFJFUVVJUkVEOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdXNlS2luZDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmb3JtIFthdHRyaWJ1dGVdIHdoaWNoIGFmZmVjdHMgdGhlIHRhcmdldAotICAgICAqIG5hbWVzcGFjZSBvZiBsb2NhbGx5IHNjb3BlZCBmZWF0dXJlcy4gSWYgdGhlIGZvcm0gaXMgbm90IHNldCBvbiB0aGlzCi0gICAgICogYXR0cmlidXRlLCB0aGVuIHNlZSBpZiB0aGVyZSBpcyBhIGdsb2JhbGx5IGRlZmluZWQgZGVmYXVsdC4gQHJldHVybiB0aGUKLSAgICAgKiB2YWx1ZSBvZiB0aGUgZm9ybSBbYXR0cmlidXRlXS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE5TUHJlZml4UXVhbGlmaWNhdGlvbigpCi0gICAgewotICAgICAgU3RyaW5nIGZvcm0gPSBudWxsOwotICAgICAgaWYgKHhzZEF0dHJpYnV0ZVVzZS5nZXRDb250ZW50KCkgIT0geHNkQXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpCi0gICAgICB7Ci0gICAgICAJZm9ybSA9ICAicXVhbGlmaWVkIjsKLSAgICAgIH0JCi0gICAgICBlbHNlIGlmICh4c2RBdHRyaWJ1dGVVc2UuZ2V0Q29udGVudCgpLmlzU2V0Rm9ybSgpKQotICAgICAgewotICAgICAgICBmb3JtID0geHNkQXR0cmlidXRlVXNlLmdldENvbnRlbnQoKS5nZXRGb3JtKCkuZ2V0TmFtZSgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0geHNkQXR0cmlidXRlVXNlLmdldFNjaGVtYSgpOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgZm9ybSA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpLmdldE5hbWUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmb3JtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKQotICAgIHsKLSAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UgZmlyc3QKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZEF0dHJpYnV0ZVJlZiA9IHhzZEF0dHJpYnV0ZVVzZS5nZXRDb250ZW50KCk7Ci0gICAgICBpZiAoeHNkQXR0cmlidXRlUmVmICE9IG51bGwgJiYgeHNkQXR0cmlidXRlUmVmLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIGl0IGhhcyBhbm5vdGF0aW9ucwotICAgICAgICBib29sZWFuIHJlZkhhc0RvY3VtZW50YXRpb24gPSBmYWxzZTsKLSAgICAgICAgWFNEQW5ub3RhdGlvbiByZWZBbm5vdGF0aW9uID0geHNkQXR0cmlidXRlUmVmLmdldEFubm90YXRpb24oKTsKLSAgICAgICAgaWYgKHJlZkFubm90YXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIERldGVybWluZSBpZiB0aGVyZSBpcyBkb2N1bWVudGF0aW9uCi0gICAgICAgICAgaWYgKCFyZWZBbm5vdGF0aW9uLmdldFVzZXJJbmZvcm1hdGlvbigpLmlzRW1wdHkoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZWZIYXNEb2N1bWVudGF0aW9uID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlZkhhc0RvY3VtZW50YXRpb24pCi0gICAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25zKHJlZkFubm90YXRpb24pOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBPdGhlcndpc2UgcHJvY2VlZCB3aXRoIGdldHRpbmcgdGhlIGRvY3VtZW50YXRpb24gYXMgdXN1YWwKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uID0gIHhzZEF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOyAgICAgIAotICAgICAgWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0geHNkQXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbigpOwotICAgICAgCi0gICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbnMoYW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKHhzZEF0dHJpYnV0ZVVzZS5nZXRTY2hlbWEoKSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIuRGF0YVR5cGVJbXBsIEFuIGlubmVyIGNsYXNzIHRvIGhvbGQgdHlwZQotICAgICAqIGluZm9ybWF0aW9uIGZvciB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgRGF0YVR5cGVJbXBsIGltcGxlbWVudHMgQ01EYXRhVHlwZQotICAgIHsKLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgICAgewotICAgICAgICByZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZS4gU2FtZSBhcyBnZXREYXRhVHlwZU5hbWUoKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0RGF0YVR5cGVOYW1lKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICAgKiAKLSAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZC4KLSAgICAgICAqLwotICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICAgIHsKLSAgICAJICByZXR1cm4gKFBST1BFUlRZX1dISVRFU1BBQ0VfRkFDRVQuZXF1YWxzKHByb3BlcnR5TmFtZSkpOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZQotICAgICAgICogcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgICAqIAotICAgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgICAgewotICAgIAkgIGlmKFBST1BFUlRZX1dISVRFU1BBQ0VfRkFDRVQuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0JCSAgCXJldHVybiBnZXRXaGl0ZVNwYWNlRmFjZXRWYWx1ZSgpOwotICAgIAkgIHJldHVybiBudWxsOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlLiBTYW1lIGFzIGdldE5vZGVOYW1lKCkuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpCi0gICAgICB7Ci0gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNjID0geHNkQXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gc2MuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gdHlwZU5hbWUgIT0gbnVsbCA/IHR5cGVOYW1lIDogInN0cmluZyI7ICAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUga2luZCBvZiBjb25zdHJhaW50OiBub25lLCBkZWZhdWx0IG9yIGZpeGVkLiBUaGUga2luZHMgYXJlCi0gICAgICAgKiBkZWZpbmVkIGluIENNRGF0YVR5cGUgY2xhc3MgKElNUExJRURfVkFMVUVfTk9ORSwgSU1QTElFRF9WQUxVRV9GSVhFRCBvcgotICAgICAgICogSU1QTElFRF9WQUxVRV9ERUZBVUxUKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUga2luZCBvZiBjb25zdHJhaW50OiBub25lLCBkZWZhdWx0IG9yIGZpeGVkLgotICAgICAgICovCi0gICAgICBwdWJsaWMgaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKQotICAgICAgewotICAgICAgICBpbnQgcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9OT05FOwotICAgICAgICBpZiAoeHNkQXR0cmlidXRlVXNlLmlzU2V0Q29uc3RyYWludCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHhzZEF0dHJpYnV0ZVVzZS5nZXRDb25zdHJhaW50KCkuZ2V0VmFsdWUoKSA9PSBYU0RDb25zdHJhaW50LkRFRkFVTFQpCi0gICAgICAgICAgICByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQ7Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQXR0cmlidXRlVXNlLmdldENvbnN0cmFpbnQoKS5nZXRWYWx1ZSgpID09IFhTRENvbnN0cmFpbnQuRklYRUQpCi0gICAgICAgICAgICByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX0ZJWEVEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKHhzZEF0dHJpYnV0ZVVzZS5pc1NldENvbnN0cmFpbnQoKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHhzZEF0dHJpYnV0ZVVzZS5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIGVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIGVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEVudW1lcmF0ZWRWYWx1ZXNGb3JUeXBlKGdldFhTRFR5cGUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogR2VuZXJhdGUgYSB2YWxpZCB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSBiYXNlZCBvbiBpdHMgdHlwZS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiBhIHZhbGlkIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIGJhc2VkIG9uIGl0cyB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIFhTRFR5cGVVdGlsLmdldEluc3RhbmNlVmFsdWUoYXR0ci5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgICAqLwotICAgICAgcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGUoKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0geHNkQXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgICAgIHJldHVybiBhdHRyLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgfQotICAgICAgCi0gICAgICAvKioKLSAgICAgICAqIE9idGFpbnMgdGhlIHdoaXRlc3BhY2UgZmFjZXQgb2YgdGhlIFhTRCBzaW1wbGUgdHlwZS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiBUaGUgd2hpdGVzcGFjZSBmYWNldCBmb3IgdGhlIFhTRCB0eXBlLiBJZiBub25lIGlzCi0gICAgICAgKiBkZWZpbmVkLCBvciBpdCBpcyBhIGNvbXBsZXggdHlwZSwgbnVsbC4KLSAgICAgICAqLwotICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V2hpdGVTcGFjZUZhY2V0VmFsdWUoKQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXRYU0RUeXBlKCkuZ2V0U2ltcGxlVHlwZSgpOwotICAgICAgICByZXR1cm4gKGRlZiAhPSBudWxsICYmIGRlZi5nZXRFZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQoKSAhPSBudWxsKSA/IGRlZi5nZXRFZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQoKS5nZXRMZXhpY2FsVmFsdWUoKSA6IG51bGwgOwotICAgICAgfQotICAgIH0KLSAgfQotICAvKioKLSAgICogRWxlbWVudERlY2xhcmF0aW9uQmFzZUltcGwgaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbi4gVGhpcyBpcyB0aGUKLSAgICogYmFzZSBjbGFzcyBmb3IgWFNERWxlbWVudERlY2xhcmF0aW9uIGFuZCBEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbC4KLSAgICogCi0gICAqIEFic3RyYWN0IG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBhcmU6IHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0S2V5KCk7IHB1YmxpYwotICAgKiBhYnN0cmFjdCBPYmplY3QgZ2V0TlNQcmVmaXhRdWFsaWZpY2F0aW9uKCk7IHB1YmxpYyBhYnN0cmFjdAotICAgKiBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCk7IHB1YmxpYyBhYnN0cmFjdAotICAgKiBYU0RUeXBlRGVmaW5pdGlvbiBnZXRYU0RUeXBlKCk7IHB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldFhTSVR5cGVzKCk7IHB1YmxpYwotICAgKiBhYnN0cmFjdCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXREZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uKFN0cmluZwotICAgKiB1cmlRdWFsaWZpZWRUeXBlTmFtZSk7IHB1YmxpYyBhYnN0cmFjdCBDTU5vZGUgZ2V0RGVmaW5pdGlvbigpOyBwdWJsaWMKLSAgICogYWJzdHJhY3QgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCk7IHB1YmxpYyBhYnN0cmFjdCBDTU5vZGVMaXN0SW1wbAotICAgKiBnZXRTdWJzdGl0dXRpb25Hcm91cCgpOwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFbGVtZW50RGVjbGFyYXRpb25CYXNlSW1wbCBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24KLSAgewotICAgIHByb3RlY3RlZCBDTURhdGFUeXBlIGRhdGFUeXBlID0gbmV3IERhdGFUeXBlSW1wbCgpOwotICAgIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcCBuYW1lZE5vZGVNYXA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFJlc29sdmVkWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBFTEVNRU5UX0RFQ0xBUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBzYW1lIGFzIGdldEVsZW1lbnROYW1lKCkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0RWxlbWVudE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4gVGhlIHNhbWUgYXMgZ2V0Tm9kZU5hbWUoKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzdWx0ID0gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXROYW1lKCk7Ci0gICAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1hTSVRZUEVTKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFUklWRURfRUxFTUVOVF9ERUNMQVJBVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVApCi0gICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9BQlNUUkFDVCkgfHwgc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRLZXkoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGRlZmluZWQgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKQotICAgIHsKLSAgICAgIENNTmFtZWROb2RlTWFwSW1wbCBtYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFhTRFR5cGUoKTsKLSAgICAgIGdldEF0dHJpYnV0ZXMobWFwLCB0ZCk7Ci0gICAgICBhZGRYU0lUeXBlQXR0cmlidXRlKG1hcCk7Ci0gICAgICByZXR1cm4gbWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdhdGhlciB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgZGVmaW5lZCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgLQotICAgICAqICAgICAgICAgIHVzZWQgZm9yIHJldHVybmluZyB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMuCi0gICAgICogQHBhcmFtIHhzZFR5cGVEZWZpbml0aW9uIC0KLSAgICAgKiAgICAgICAgICB0aGUgdHlwZSBkZWZpbml0aW9uIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0QXR0cmlidXRlcyhDTU5hbWVkTm9kZU1hcEltcGwgbWFwLCBYU0RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBpZiAoeHNkVHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdGQgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB4c2RUeXBlRGVmaW5pdGlvbjsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY3RkLmdldEF0dHJpYnV0ZVVzZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0cmlidXRlVXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlQWRhcHRlciBhZGFwdGVyID0gKFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIpIGdldEFkYXB0ZXIoeHNkQXR0cmlidXRlVXNlKTsKLSAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuZ2V0Tm9kZU5hbWUoKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hcC5nZXRIYXNodGFibGUoKS5wdXQoYWRhcHRlci5nZXROb2RlTmFtZSgpLCBhZGFwdGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpCi0gICAgewotICAgICAgQ01Db250ZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFhTRFR5cGUoKTsKLSAgICAgIGlmICh0ZCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgRGVyaXZlZENoaWxkVmlzaXRvciBkY3YgPSBuZXcgRGVyaXZlZENoaWxkVmlzaXRvcih0ZCk7Ci0gICAgICAgIGRjdi52aXNpdFR5cGVEZWZpbml0aW9uKHRkKTsKLSAgICAgICAgQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGRjdi5nZXRDaGlsZE5vZGVMaXN0KCk7Ci0gICAgICAgIGlmIChub2RlTGlzdC5nZXRMZW5ndGgoKSA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBuZXcgQ01Hcm91cEltcGwobm9kZUxpc3QsIENNR3JvdXAuU0VRVUVOQ0UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IChDTUNvbnRlbnQpIG5vZGVMaXN0Lml0ZW0oMCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudCB0eXBlIG9mIHRoaXMgZWxlbWVudC4gVGhlIGNvbnRlbnQgdHlwZSBpcyBkZWZpbmVkIGluCi0gICAgICogQ01FbGVtZW50RGVjbGFyYXRpb24gKEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEgb3IgQ0RBVEEpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpCi0gICAgewotICAgICAgaW50IGNvbnRlbnRUeXBlID0gRU1QVFk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFhTRFR5cGUoKTsKLSAgICAgIGlmICh0ZCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSB0ZC5nZXROYW1lKCk7Ci0gICAgICAgIGlmICh0eXBlTmFtZSAhPSBudWxsICYmIHR5cGVOYW1lLmVxdWFscygiYW55VHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGVudFR5cGUgPSBBTlk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY29udGVudFR5cGUgPSBQQ0RBVEE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRkIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RDb250ZW50VHlwZUNhdGVnb3J5IGNhdGVnb3J5ID0gKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHRkKS5nZXRDb250ZW50VHlwZUNhdGVnb3J5KCk7Ci0gICAgICAgIGlmIChjYXRlZ29yeSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc3dpdGNoIChjYXRlZ29yeS5nZXRWYWx1ZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgWFNEQ29udGVudFR5cGVDYXRlZ29yeS5FTEVNRU5UX09OTFkgOgotICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IEVMRU1FTlQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYU0RDb250ZW50VHlwZUNhdGVnb3J5LkVNUFRZIDoKLSAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBFTVBUWTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkuTUlYRUQgOgotICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IE1JWEVEOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgWFNEQ29udGVudFR5cGVDYXRlZ29yeS5TSU1QTEUgOgotICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IFBDREFUQTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY29udGVudFR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpCi0gICAgewotICAgICAgQ01EYXRhVHlwZSByZXN1bHQgPSBudWxsOwotICAgICAgaW50IGNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgIGJvb2xlYW4gaGFzRGF0YVR5cGUgPSBjb250ZW50VHlwZSA9PSBQQ0RBVEEgfHwgY29udGVudFR5cGUgPT0gTUlYRUQ7Ci0gICAgICBpZiAoaGFzRGF0YVR5cGUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGRhdGFUeXBlOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiAnTWluIE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNaW5PY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1pbk9jY3VycyhnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0gICAgICogIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNYXhPY2N1cnMoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBkZWNsYXJhdGlvbiBpZiB0aGlzIGlzIGFuIGVsZW1lbnQKLSAgICAgKiByZWZlcmVuY2UuIE90aGVyd2lzZSBpdCByZXR1cm5zIGl0c2VsZi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IENNTm9kZSBnZXREZWZpbml0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBnbG9iYWwgb3IKLSAgICAgKiBsb2NhbC4gUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgYW4gZWxlbWVudCByZWZlcmVuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgZ2xvYmFsIG9yCi0gICAgICogICAgICAgICBsb2NhbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyBsb2NhbCB0byB0aGlzIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudHMgbG9jYWwgdG8gdGhpcyBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkKLSAgICB7Ci0gICAgICBpZiAobmFtZWROb2RlTWFwID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIExvY2FsRWxlbWVudFZpc2l0b3IgbG9jYWxFbGVtZW50VmlzaXRvciA9IG5ldyBMb2NhbEVsZW1lbnRWaXNpdG9yKCk7Ci0gICAgICAgIGxvY2FsRWxlbWVudFZpc2l0b3IudmlzaXRUeXBlRGVmaW5pdGlvbihnZXRYU0RUeXBlKCkpOwotICAgICAgICBuYW1lZE5vZGVNYXAgPSBsb2NhbEVsZW1lbnRWaXNpdG9yLmdldENNTmFtZWROb2RlTWFwKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmFtZWROb2RlTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZQotICAgICAqIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT05fSU5GTykpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldERlZmluaXRpb25JbmZvKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT04pKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXREZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1hTSVRZUEVTKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0WFNJVHlwZXMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKFBST1BFUlRZX0RFUklWRURfRUxFTUVOVF9ERUNMQVJBVElPTikpCi0gICAgICB7Ci0gICAgICAgIGludCBpbmRleCA9IHByb3BlcnR5TmFtZS5pbmRleE9mKCI9Iik7Ci0gICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB1cmlRdWFsaWZpZWRUeXBlTmFtZSA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgICByZXN1bHQgPSBnZXREZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uKHVyaVF1YWxpZmllZFR5cGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVApKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfU1VCU1RJVFVUSU9OX0dST1VQX1ZBTFVFKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFN1YnN0aXR1dGlvbkdyb3VwVmFsdWUoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfQUJTVFJBQ1QpKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0QWJzdHJhY3QoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdOaWxsYWJsZScgYXR0cmlidXRlLiBUaGlzIHJlcHJlc2VudHMgdGhlCi0gICAgICogbmlsbGFibGUgaW5mb3NldCBwcm9wZXJ0eS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdOaWxsYWJsZScgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTmlsbGFibGUoKQotICAgIHsKLSAgICAgIGlmIChnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc1NldE5pbGxhYmxlKCkpCi0gICAgICAgIHJldHVybiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc05pbGxhYmxlKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3Vic3RpdHV0aW9uR3JvdXAgYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIHN1YnN0aXR1dGlvbkdyb3VwIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3Vic3RpdHV0aW9uR3JvdXBWYWx1ZSgpCi0gICAgewotICAgIAlYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAJaWYoeHNkRWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwpCi0gICAgCXsKLSAgICAJCUVsZW1lbnQgZWxlbWVudCA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgCQlpZihlbGVtZW50ICE9IG51bGwpCi0gICAgCQl7Ci0gICAgCQkJaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUpKQotICAgIAkJCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSk7Ci0gICAgCQkJZWxzZSByZXR1cm4gbnVsbDsKLSAgICAJCX0KLSAgICAJfQotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgJ0Fic3RyYWN0Jy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgJ0Fic3RyYWN0Jy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQm9vbGVhbiBnZXRBYnN0cmFjdCgpCi0gICAgewotICAgICAgYm9vbGVhbiByZXN1bHQgPSBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmlzQWJzdHJhY3QoKTsKLSAgICAgIC8vIFRPRE8uLi4gaG93IGRvIHdlIGhhbmRsZSBlbGVtZW50cyB3aXRoIGFic3RyYWN0IHR5cGUncyA/Ci0gICAgICByZXR1cm4gcmVzdWx0ID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbigpCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldEFubm90YXRpb24oKTsKLSAgICAgIAotICAgICAgLy8gTmVlZCB0byBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLiAgSnVzdCBiZWNhdXNlCi0gICAgICAvLyB0aGVyZSBpcyBhbiBhbm5vdGF0aW9uIGVsZW1lbnQgZG9lc24ndCBtZWFuIHRoYXQgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudCBpcwotICAgICAgLy8gYWxzbyB0aGVyZSwgYXMgaXQgY291bGQgY29udGFpbiBqdXN0IGFwcGluZm8gZWxlbWVudHMuCi0gICAgICAKLSAgICAgIGJvb2xlYW4gaGFzRG9jdW1lbnRhdGlvbiA9IGZhbHNlOwotICAgICAgCi0gICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgCSAgaWYgKCFhbm5vdGF0aW9uLmdldFVzZXJJbmZvcm1hdGlvbigpLmlzRW1wdHkoKSkgewotICAgIAkJICBoYXNEb2N1bWVudGF0aW9uID0gdHJ1ZTsKLSAgICAJICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIFRoZSBlbGVtZW50IG1heSBub3QgaGF2ZSBhbm5vdGF0aW9uIGFuZCBpZiBpdCBpcyByZWZlcmVuY2VkCi0gICAgICAvLyBjaGVjayB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUgZm9yIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgIGlmIChoYXNEb2N1bWVudGF0aW9uID09IGZhbHNlKSB7Ci0gICAgICAgICAgaWYgKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKSB7Ci0gICAgICAgIAkgIGFubm90YXRpb24gPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbnMoYW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBYU0RUeXBlRGVmaW5pdGlvbiBnZXRYU0RUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0eXBlIG5hbWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHR5cGUgbmFtZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IExpc3QgZ2V0WFNJVHlwZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB1cmkgcXVhbGlmaWVkCi0gICAgICogdHlwZSBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmlRdWFsaWZpZWRUeXBlTmFtZSAtCi0gICAgICogICAgICAgICAgYSB1cmkgcXVhbGlmaWVkIHR5cGUgbmFtZQotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXREZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyB1cmlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkWFNJVHlwZUF0dHJpYnV0ZShDTU5hbWVkTm9kZU1hcEltcGwgbWFwKQotICAgIHsKLSAgICAgIExpc3QgbGlzdCA9IGdldFhTSVR5cGVzKCk7Ci0gICAgICBpbnQgbGlzdFNpemUgPSBsaXN0LnNpemUoKTsKLSAgICAgIGlmIChsaXN0U2l6ZSA+IDEpCi0gICAgICB7Ci0gICAgICAgIENNRGF0YVR5cGUgZGF0YVR5cGUgPSBuZXcgQ01EYXRhVHlwZUltcGwoInR5cGVOYW1lcyIsIChTdHJpbmcpIG51bGwpOwotICAgICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBhdHRyaWJ1dGUgPSBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoInR5cGUiLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMLCBkYXRhVHlwZSk7Ci0gICAgICAgIGF0dHJpYnV0ZS5zZXRDTURvY3VtZW50KHhzaURvY3VtZW50KTsKLSAgICAgICAgYXR0cmlidXRlLnNldFByZWZpeFF1YWxpZmljYXRpb24odHJ1ZSk7Ci0gICAgICAgIGF0dHJpYnV0ZS5zZXRYU0lUeXBlcyhsaXN0KTsKLQotICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNTQ0NwotICAgICAgICAvLyBGb3Igbm93LCBkb24ndCBjbG9iYmVyIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSAndHlwZScgbmFtZSBkZWZpbmVkIGluIHRoZSBncmFtbWFyCi0gICAgICAgIC8vIHdpdGggdGhlIHhzaTp0eXBlIGF0dHJpYnV0ZS4gIFRoZSBpbXBhY3Qgb2YgdGhpcyBjaGFuZ2Ugd2lsbCBiZSB0aGF0IGZvciBjb250ZW50IGFzc2lzdCwgdGhlIG5vbi14c2kKLSAgICAgICAgLy8gdHlwZSBhdHRyaWJ1dGUgd2lsbCBiZSBwcmVzZW50ZWQ7IHRoZSBnZW5lcmF0ZWQgWE1MIGZyb20gWFNEIHdpbGwgaGF2ZSB0aGlzIGF0dHJpYnV0ZSBjcmVhdGVkLCBhbmQKLSAgICAgICAgLy8gbm90IHRoZSB4c2k6dHlwZSBhdHRyaWJ1dGUuCi0gICAgICAgIEhhc2h0YWJsZSBoYXNoVGFibGUgPSBtYXAuZ2V0SGFzaHRhYmxlKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gYXR0cmlidXRlLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgIGlmICghaGFzaFRhYmxlLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgIGhhc2hUYWJsZS5wdXQobmFtZSwgYXR0cmlidXRlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbWRvY3VtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgY21ub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNtZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICB7ICAgICAgCi0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRTY2hlbWEoKTsKLSAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICBlbHNlICAKLSAgICAgICAgcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKHNjaGVtYSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciB0aGlzIGVsZW1lbnQuIFRoZSBncm91cCBjb25zaXN0cyBvZjoKLSAgICAgKiAxLiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpdHNlbGYgMi4gYW5kIGFueSBlbGVtZW50IGRlY2xhcmF0aW9uIHRoYXQgaGFzCi0gICAgICogYSB7c3Vic3RpdHV0aW9uIGdyb3VwIGFmZmlsaWF0aW9ufSBpbiB0aGUgZ3JvdXAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ01Ob2RlTGlzdEltcGwgZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKTsKLSAgICAvKgotICAgICAqIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuRGF0YVR5cGVJbXBsIEFuIGlubmVyIGNsYXNzIHRvIGhvbGQgdHlwZQotICAgICAqIGluZm9ybWF0aW9uIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIERhdGFUeXBlSW1wbCBpbXBsZW1lbnRzIENNRGF0YVR5cGUKLSAgICB7Ci0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgICAqIChBTllfRUxFTUVOVCwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBEQVRBX1RZUEUsIERPQ1VNRU5ULAotICAgICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLiBTYW1lIGFzIGdldERhdGFUeXBlTmFtZSgpLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0RGF0YVR5cGVOYW1lKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICAgKiAKLSAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZC4KLSAgICAgICAqLwotICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChQUk9QRVJUWV9XSElURVNQQUNFX0ZBQ0VULmVxdWFscyhwcm9wZXJ0eU5hbWUpKTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG5hbWUuIFJldHVybnMgbnVsbCBpZiB0aGUKLSAgICAgICAqIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAgKiAKLSAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICAgIHsKLSAgICAgICAgaWYoUFJPUEVSVFlfV0hJVEVTUEFDRV9GQUNFVC5lcXVhbHMocHJvcGVydHlOYW1lKSkKLSAgICAgICAgCXJldHVybiBnZXRXaGl0ZVNwYWNlRmFjZXRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuIFNhbWUgYXMgZ2V0Tm9kZU5hbWUoKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IG51bGw7Ci0gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ZCA9IGdldFhTRFR5cGUoKS5nZXRTaW1wbGVUeXBlKCk7Ci0gICAgICAgIGlmIChzdGQgIT0gbnVsbCkKLSAgICAgICAgICB0eXBlTmFtZSA9IHN0ZC5nZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiB0eXBlTmFtZSAhPSBudWxsID8gdHlwZU5hbWUgOiAic3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIGtpbmQgb2YgY29uc3RyYWludDogbm9uZSwgZGVmYXVsdCBvciBmaXhlZC4gVGhlIGtpbmRzIGFyZQotICAgICAgICogZGVmaW5lZCBpbiBDTURhdGFUeXBlIGNsYXNzIChJTVBMSUVEX1ZBTFVFX05PTkUsIElNUExJRURfVkFMVUVfRklYRUQgb3IKLSAgICAgICAqIElNUExJRURfVkFMVUVfREVGQVVMVCkuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIGtpbmQgb2YgY29uc3RyYWludDogbm9uZSwgZGVmYXVsdCBvciBmaXhlZC4KLSAgICAgICAqLwotICAgICAgcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkKLSAgICAgIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IElNUExJRURfVkFMVUVfTk9ORTsKLSAgICAgICAgaWYgKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmlzU2V0Q29uc3RyYWludCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldENvbnN0cmFpbnQoKS5nZXRWYWx1ZSgpID09IFhTRENvbnN0cmFpbnQuREVGQVVMVCkKLSAgICAgICAgICAgIHJlc3VsdCA9IElNUExJRURfVkFMVUVfREVGQVVMVDsKLSAgICAgICAgICBlbHNlIGlmIChnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRDb25zdHJhaW50KCkuZ2V0VmFsdWUoKSA9PSBYU0RDb25zdHJhaW50LkZJWEVEKQotICAgICAgICAgICAgcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9GSVhFRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBkZWZhdWx0IG9yIGZpeGVkIGNvbnN0cmFpbnQuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBkZWZhdWx0IG9yIGZpeGVkIGNvbnN0cmFpbnQuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW1wbGllZFZhbHVlKCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc1NldENvbnN0cmFpbnQoKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldExleGljYWxWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgZm9yIHRoZSBhdHRyaWJ1dGUgdHlwZS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgZm9yIHRoZSBhdHRyaWJ1dGUgdHlwZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXMoKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0RW51bWVyYXRlZFZhbHVlc0ZvclR5cGUoZ2V0WFNEVHlwZSgpKTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIFN0cmluZyBnZW5lcmF0ZUluc3RhbmNlVmFsdWUoKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNEVHlwZVV0aWwuZ2V0SW5zdGFuY2VWYWx1ZShnZXRYU0RUeXBlKCkpOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIGNtZG9jdW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBjbW5vZGUuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIGNtZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGNtbm9kZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcihnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRTY2hlbWEoKSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qKgotICAgICAgICogT2J0YWlucyB0aGUgd2hpdGVzcGFjZSBmYWNldCBvZiB0aGUgWFNEIHNpbXBsZSB0eXBlLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIFRoZSB3aGl0ZXNwYWNlIGZhY2V0IGZvciB0aGUgWFNEIHR5cGUuIElmIG5vbmUgaXMKLSAgICAgICAqIGRlZmluZWQsIG9yIGl0IGlzIGEgY29tcGxleCB0eXBlLCBudWxsLgotICAgICAgICovCi0gICAgICBwcml2YXRlIFN0cmluZyBnZXRXaGl0ZVNwYWNlRmFjZXRWYWx1ZSgpCi0gICAgICB7Ci0gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGRlZiA9IGdldFhTRFR5cGUoKS5nZXRTaW1wbGVUeXBlKCk7Ci0gICAgICAgIHJldHVybiAoZGVmICE9IG51bGwgJiYgZGVmLmdldEVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCgpICE9IG51bGwpID8gZGVmLmdldEVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCgpLmdldExleGljYWxWYWx1ZSgpIDogbnVsbCA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24uIEEKLSAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnRWxlbWVudCBEZWNsYXJhdGlvbicuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBFbGVtZW50RGVjbGFyYXRpb25CYXNlSW1wbAotICB7Ci0gICAgcHJvdGVjdGVkIExpc3QgZGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbnMgPSBudWxsOwotICAgIHByb3RlY3RlZCBMaXN0IHhzaVR5cGVzID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdEltcGwgc3Vic3RpdHV0aW9uR3JvdXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0geHNkRWxlbWVudERlY2xhcmF0aW9uIC0KLSAgICAgKiAgICAgICAgICB0aGUgWE1MIFNjaGVtYSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgdGhpcy54c2RFbGVtZW50RGVjbGFyYXRpb24gPSB4c2RFbGVtZW50RGVjbGFyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkRWxlbWVudERlY2xhcmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFJlc29sdmVkWFNERWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUga2V5IGZvciB0aGlzIGNtbm9kZSB3aGljaCBpcyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hCi0gICAgICogbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkRWxlbWVudERlY2xhcmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBkZWNsYXJhdGlvbiBpZiB0aGlzIGlzIGFuIGVsZW1lbnQKLSAgICAgKiByZWZlcmVuY2UuIE90aGVyd2lzZSBpdCByZXR1cm5zIGl0c2VsZi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIENNTm9kZSBnZXREZWZpbml0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0QWRhcHRlcih4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgZ2xvYmFsIG9yCi0gICAgICogbG9jYWwuIFJldHVybnMgbnVsbCBpZiB0aGlzIGlzIGFuIGVsZW1lbnQgcmVmZXJlbmNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIGdsb2JhbCBvcgotICAgICAqICAgICAgICAgbG9jYWwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWZpbml0aW9uSW5mbygpCi0gICAgewotICAgICAgaWYgKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIGVsc2UgaWYgKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0dsb2JhbCgpKQotICAgICAgICByZXR1cm4gREVGSU5JVElPTl9JTkZPX0dMT0JBTDsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIERFRklOSVRJT05fSU5GT19MT0NBTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE5TUHJlZml4UXVhbGlmaWNhdGlvbigpCi0gICAgewotICAgICAgU3RyaW5nIGZvcm0gPSBudWxsOwotICAgICAgaWYgKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgewotICAgICAgICBmb3JtID0gInF1YWxpZmllZCI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNTZXRGb3JtKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3JtID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldEZvcm0oKS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRTY2hlbWEoKTsKLSAgICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICBmb3JtID0gc2NoZW1hLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGZvcm07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYU0RUeXBlRGVmaW5pdGlvbiBnZXRYU0RUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0eXBlIG5hbWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHR5cGUgbmFtZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0WFNJVHlwZXMoKQotICAgIHsKLSAgICAgIGlmICh4c2lUeXBlcyA9PSBudWxsKQotICAgICAgewotICAgICAgICBjb21wdXRlRGVyaXZlZFR5cGVJbmZvKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4geHNpVHlwZXM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZURlcml2ZWRUeXBlSW5mbygpCi0gICAgewotICAgICAgeHNpVHlwZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBkZXJpdmVkRWxlbWVudERlY2xhcmF0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGNvbXB1dGVEZXJpdmVkVHlwZUluZm9IZWxwZXIoZ2V0WFNEVHlwZSgpLCB4c2lUeXBlcywgZGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbnMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVEZXJpdmVkVHlwZUluZm9IZWxwZXIoWFNEVHlwZURlZmluaXRpb24gdHlwZSwgTGlzdCB0eXBlTmFtZUxpc3QsIExpc3QgZWRMaXN0KQotICAgIHsKLSAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBMaXN0IGRlcml2ZWRUeXBlcyA9IGZpbmRUeXBlc0Rlcml2ZWRGcm9tKHR5cGUpOwotICAgICAgICBBcnJheUxpc3QgaW5jbHVzaXZlRGVyaXZlZFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpbmNsdXNpdmVEZXJpdmVkVHlwZXMuYWRkKHR5cGUpOwotICAgICAgICBpZiAoKGRlcml2ZWRUeXBlcyAhPSBudWxsKSAmJiAoZGVyaXZlZFR5cGVzLnNpemUoKSA+IDApKQotICAgICAgICB7Ci0gICAgICAgICAgaW5jbHVzaXZlRGVyaXZlZFR5cGVzLmFkZEFsbChkZXJpdmVkVHlwZXMpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGluY2x1c2l2ZURlcml2ZWRUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiBkZXJpdmVkVHlwZSA9IChYU0RUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGRlcml2ZWRUeXBlLmdldFNjaGVtYSgpOwotICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBkZXJpdmVkVHlwZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBuYW1lID0gdXJpICE9IG51bGwgPyAoIlsiICsgdXJpICsgIl0iICsgbmFtZSkgOiBuYW1lOwotICAgICAgICAgICAgICB0eXBlTmFtZUxpc3QuYWRkKG5hbWUpOwotICAgICAgICAgICAgICBEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IG5ldyBEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbCh0aGlzLCBkZXJpdmVkVHlwZSwgbmFtZSk7Ci0gICAgICAgICAgICAgIGVkTGlzdC5hZGQoZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB1cmkgcXVhbGlmaWVkCi0gICAgICogdHlwZSBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmlRdWFsaWZpZWRUeXBlTmFtZSAtCi0gICAgICogICAgICAgICAgYSB1cmkgcXVhbGlmaWVkIHR5cGUgbmFtZQotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXREZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyB1cmlRdWFsaWZpZWRUeXBlTmFtZSkKLSAgICB7Ci0gICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKGRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25zID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbXB1dGVEZXJpdmVkVHlwZUluZm8oKTsKLSAgICAgIH0KLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbkltcGwgZWQgPSAoRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbkltcGwpIGkubmV4dCgpOwotICAgICAgICBpZiAoKGVkICE9IG51bGwpICYmIChlZC51cmlRdWFsaWZpZWRUeXBlTmFtZSAhPSBudWxsKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChlZC51cmlRdWFsaWZpZWRUeXBlTmFtZS5lcXVhbHModXJpUXVhbGlmaWVkVHlwZU5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGVkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgdGhpcyBlbGVtZW50LiBUaGUgZ3JvdXAgY29uc2lzdHMgb2Y6Ci0gICAgICogMS4gdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXRzZWxmIDIuIGFuZCBhbnkgZWxlbWVudCBkZWNsYXJhdGlvbiB0aGF0IGhhcwotICAgICAqIGEge3N1YnN0aXR1dGlvbiBncm91cCBhZmZpbGlhdGlvbn0gaW4gdGhlIGdyb3VwCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3RJbXBsIGdldFN1YnN0aXR1dGlvbkdyb3VwKCkKLSAgICB7Ci0gICAgICBpZiAoc3Vic3RpdHV0aW9uR3JvdXAgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXAgPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLSAgICAgICAgTGlzdCBzZ3JvdXAgPSBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFN1YnN0aXR1dGlvbkdyb3VwKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNncm91cC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpLm5leHQoKTsgIAotICAgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwLmFkZChnZXRBZGFwdGVyKGVkKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBzdWJzdGl0dXRpb25Hcm91cDsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsIGV4dGVuZHMgRWxlbWVudERlY2xhcmF0aW9uQmFzZUltcGwKLSAgICogIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbCBleHRlbmRzIEVsZW1lbnREZWNsYXJhdGlvbkJhc2VJbXBsCi0gIHsKLSAgICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBvd25lcjsKLSAgICBwcm90ZWN0ZWQgWFNEVHlwZURlZmluaXRpb24geHNkVHlwZTsKLSAgICBwdWJsaWMgU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG93bmVyIC0KLSAgICAgKiBAcGFyYW0geHNkVHlwZSAtCi0gICAgICogQHBhcmFtIHVyaVF1YWxpZmllZFR5cGVOYW1lIC0KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbkltcGwoWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBvd25lciwgWFNEVHlwZURlZmluaXRpb24geHNkVHlwZSwgU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lKQotICAgIHsKLSAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKLSAgICAgIHRoaXMueHNkVHlwZSA9IHhzZFR5cGU7Ci0gICAgICB0aGlzLnVyaVF1YWxpZmllZFR5cGVOYW1lID0gdXJpUXVhbGlmaWVkVHlwZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgb3duZXIuZ2V0S2V5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgb3duZXIuZ2V0S2V5KCkpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUga2V5IGZvciB0aGlzIGNtbm9kZSB3aGljaCBpcyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hCi0gICAgICogbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICByZXR1cm4gb3duZXIuZ2V0S2V5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYU0RUeXBlRGVmaW5pdGlvbiBnZXRYU0RUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0eXBlIG5hbWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHR5cGUgbmFtZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0WFNJVHlwZXMoKQotICAgIHsKLSAgICAgIHJldHVybiBvd25lci5nZXRYU0lUeXBlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB1cmkgcXVhbGlmaWVkCi0gICAgICogdHlwZSBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmlRdWFsaWZpZWRUeXBlTmFtZSAtCi0gICAgICogICAgICAgICAgYSB1cmkgcXVhbGlmaWVkIHR5cGUgbmFtZQotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXREZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyB1cmlRdWFsaWZpZWRUeXBlTmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gb3duZXIuZ2V0RGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbih1cmlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBlbGVtZW50IGRlY2xhcmF0aW9uIGlmIHRoaXMgaXMgYW4gZWxlbWVudAotICAgICAqIHJlZmVyZW5jZS4gT3RoZXJ3aXNlIGl0IHJldHVybnMgaXRzZWxmLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlIGdldERlZmluaXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIGdsb2JhbCBvcgotICAgICAqIGxvY2FsLiBSZXR1cm5zIG51bGwgaWYgdGhpcyBpcyBhbiBlbGVtZW50IHJlZmVyZW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBnbG9iYWwgb3IKLSAgICAgKiAgICAgICAgIGxvY2FsLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmaW5pdGlvbkluZm8oKQotICAgIHsKLSAgICAgIHJldHVybiBvd25lci5nZXREZWZpbml0aW9uSW5mbygpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZvcm0gW2F0dHJpYnV0ZV0gd2hpY2ggYWZmZWN0cyB0aGUgdGFyZ2V0Ci0gICAgICogbmFtZXNwYWNlIG9mIGxvY2FsbHkgc2NvcGVkIGZlYXR1cmVzLiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybQotICAgICAqIFthdHRyaWJ1dGVdLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0TlNQcmVmaXhRdWFsaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gb3duZXIuZ2V0TlNQcmVmaXhRdWFsaWZpY2F0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciB0aGlzIGVsZW1lbnQuIFRoZSBncm91cCBjb25zaXN0cyBvZjoKLSAgICAgKiAxLiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpdHNlbGYgMi4gYW5kIGFueSBlbGVtZW50IGRlY2xhcmF0aW9uIHRoYXQgaGFzCi0gICAgICogYSB7c3Vic3RpdHV0aW9uIGdyb3VwIGFmZmlsaWF0aW9ufSBpbiB0aGUgZ3JvdXAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdEltcGwgZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKQotICAgIHsKLSAgICAgIHJldHVybiBvd25lci5nZXRTdWJzdGl0dXRpb25Hcm91cCgpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNEV2lsZGNhcmRBZGFwdGVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRFdpbGRjYXJkQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01BbnlFbGVtZW50Ci0gIHsKLSAgICBwcm90ZWN0ZWQgWFNEV2lsZGNhcmQgeHNkV2lsZGNhcmQ7Ci0KLSAgICBwdWJsaWMgWFNEV2lsZGNhcmRBZGFwdGVyKFhTRFdpbGRjYXJkIHhzZFdpbGRjYXJkKQotICAgIHsKLSAgICAgIHRoaXMueHNkV2lsZGNhcmQgPSB4c2RXaWxkY2FyZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RXaWxkY2FyZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBBTllfRUxFTUVOVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBub2RlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBlbXB0eSBzdHJpbmcgdmFsdWUuCi0gICAgICogQWxsIGRlcml2ZWQgY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlCi0gICAgICogZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiAiYW55IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpCi0gICAgewotICAgIAlpZiAoeHNkV2lsZGNhcmQuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSkpCi0gICAgCXsKLSAgICAJCXJldHVybiB4c2RXaWxkY2FyZC5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFKTsKLSAgICAJfQotICAgIAllbHNlIAotICAgIAkJcmV0dXJuICIjI2FueSI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWluIE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNaW5PY2N1cnMoeHNkV2lsZGNhcmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotICAgICAqICIxIi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1heE9jY3VyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0TWF4T2NjdXJzKHhzZFdpbGRjYXJkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbWRvY3VtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgY21ub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNtZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoeHNkV2lsZGNhcmQuZ2V0U2NoZW1hKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkKLSAgICB7Ci0gICAgICBYU0RBbm5vdGF0aW9uIGFubm90YXRpb24gPSB4c2RXaWxkY2FyZC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbnMoYW5ub3RhdGlvbik7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBYU0RNb2RlbEdyb3VwQWRhcHRlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RNb2RlbEdyb3VwQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01Hcm91cAotICB7Ci0gICAgcHJvdGVjdGVkIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cDsKLQotICAgIHB1YmxpYyBYU0RNb2RlbEdyb3VwQWRhcHRlcigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBYU0RNb2RlbEdyb3VwQWRhcHRlcihYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXApCi0gICAgewotICAgICAgdGhpcy54c2RNb2RlbEdyb3VwID0geHNkTW9kZWxHcm91cDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBHUk9VUDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RNb2RlbEdyb3VwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGdyb3VwLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKQotICAgIHsKLSAgICAgIENNTm9kZUxpc3RJbXBsIG5vZGVMaXN0ID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0gICAgICBpZiAoeHNkTW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RNb2RlbEdyb3VwLmdldFBhcnRpY2xlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBpLm5leHQoKTsKLSAgICAgICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgY29udGVudCA9IHBhcnRpY2xlLmdldENvbnRlbnQoKTsKLSAgICAgICAgICBDTU5vZGUgYWRhcHRlciA9IGdldEFkYXB0ZXIoY29udGVudCk7Ci0gICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBub2RlTGlzdC5nZXRMaXN0KCkuYWRkKGFkYXB0ZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG5vZGVMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKiBBbGwgZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUKLSAgICAgKiBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgQ01EZXNjcmlwdGlvbkJ1aWxkZXIgZGVzY3JpcHRpb25CdWlsZGVyID0gbmV3IENNRGVzY3JpcHRpb25CdWlsZGVyKCk7Ci0gICAgICByZXR1cm4gZGVzY3JpcHRpb25CdWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24odGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWluIE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNaW5PY2N1cnMoeHNkTW9kZWxHcm91cCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0gICAgICogIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNYXhPY2N1cnMoeHNkTW9kZWxHcm91cCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIG9wZXJhdG9yIG9mIHRoaXMgZ3JvdXAgLS0gQ0hPSUNFLCBTRVFVRU5DRSBvciBBTEwgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb3BlcmF0b3Igb2YgdGhpcyBncm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE9wZXJhdG9yKCkKLSAgICB7Ci0gICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgIC8vdG9kby4uLiBoYW5kbGUgQUxPTkUgY2FzZSBieSBjaGVja2lnIGlmIGNoaWxkIGNvdW50ID09IDEKLSAgICAgIGlmICh4c2RNb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoeHNkTW9kZWxHcm91cC5nZXRDb21wb3NpdG9yKCkuZ2V0VmFsdWUoKSkKLSAgICAgICAgewotICAgICAgICAgIGNhc2UgWFNEQ29tcG9zaXRvci5DSE9JQ0UgOiB7Ci0gICAgICAgICAgICByZXN1bHQgPSBDSE9JQ0U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBYU0RDb21wb3NpdG9yLlNFUVVFTkNFIDogewotICAgICAgICAgICAgcmVzdWx0ID0gU0VRVUVOQ0U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBYU0RDb21wb3NpdG9yLkFMTCA6IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFMTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbigpCi0gICAgewotICAgICAgWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0geHNkTW9kZWxHcm91cC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbnMoYW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKHhzZE1vZGVsR3JvdXAuZ2V0U2NoZW1hKCkpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01Hcm91cAotICB7Ci0gICAgcHJvdGVjdGVkIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi0gICAgcHVibGljIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLnhzZE1vZGVsR3JvdXBEZWZpbml0aW9uID0geHNkTW9kZWxHcm91cERlZmluaXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAqIChBTllfRUxFTUVOVCwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBEQVRBX1RZUEUsIERPQ1VNRU5ULAotICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gR1JPVVA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUga2V5IGZvciB0aGlzIGNtbm9kZSB3aGljaCBpcyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hCi0gICAgICogbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkTW9kZWxHcm91cERlZmluaXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZ3JvdXAuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZ3JvdXAuCi0gICAgICovCi0gICAgcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpCi0gICAgewotICAgICAgQ01Ob2RlTGlzdEltcGwgbm9kZUxpc3QgPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLSAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRNb2RlbEdyb3VwKCk7Ci0gICAgICBpZiAobW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgewotICAgICAgICBDTU5vZGUgYWRhcHRlciA9IGdldEFkYXB0ZXIobW9kZWxHcm91cCk7Ci0gICAgICAgIG5vZGVMaXN0LmFkZChhZGFwdGVyKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBub2RlTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBub2RlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBlbXB0eSBzdHJpbmcgdmFsdWUuCi0gICAgICogQWxsIGRlcml2ZWQgY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlCi0gICAgICogZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgIHsKLSAgICAgIENNRGVzY3JpcHRpb25CdWlsZGVyIGRlc2NyaXB0aW9uQnVpbGRlciA9IG5ldyBDTURlc2NyaXB0aW9uQnVpbGRlcigpOwotICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uQnVpbGRlci5idWlsZERlc2NyaXB0aW9uKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzICIxIi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0TWluT2NjdXJzKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSAgICAgKiAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNYXhPY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1heE9jY3Vycyh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIG9wZXJhdG9yIG9mIHRoaXMgZ3JvdXAgLS0gQ0hPSUNFLCBTRVFVRU5DRSBvciBBTEwgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb3BlcmF0b3Igb2YgdGhpcyBncm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE9wZXJhdG9yKCkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNEQ29tcG9zaXRvci5TRVFVRU5DRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbigpCi0gICAgewotICAgICAgWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0geHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0QW5ub3RhdGlvbigpOwotICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25zKGFubm90YXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNtZG9jdW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBjbW5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgIHsKLSAgICAgIHJldHVybiAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcih4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRTY2hlbWEoKSk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBEb2N1bWVudGF0aW9uSW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRhdGlvbi4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgICogZG9jdW1lbnRhdGlvbiBlbGVtZW50IHBhcnQgb2YgdGhlICdVc2VyIEluZm9ybWF0aW9uJyBmZWF0dXJlLiBXb3JraW5nIHdpdGgKLSAgICogdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudCByZXF1aXJlcyBkcm9wcGluZyBkb3duIGludG8gdGhlIERPTSBtb2RlbC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgRG9jdW1lbnRhdGlvbkltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50YXRpb24KLSAgewotICAgIHByb3RlY3RlZCBFbGVtZW50IGRvY3VtZW50YXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnRhdGlvbiAtCi0gICAgICogICAgICAgICAgYSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50YXRpb25JbXBsKEVsZW1lbnQgZG9jdW1lbnRhdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBlbXB0eSBzdHJpbmcgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgZmFsc2UuIFRoaXMgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBhbnkgcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIGZhbHNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgbnVsbC4gVGhpcyBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IGFueSBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgY29udGVudCA9ICIiOwotICAgICAgYm9vbGVhbiBjb250ZW50Rm91bmQgPSBmYWxzZTsKLSAgICAgIE5vZGVMaXN0IG5vZGVzID0gZG9jdW1lbnRhdGlvbi5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVGV4dCkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRlbnRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgY29udGVudCArPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY29udGVudEZvdW5kID8gY29udGVudCA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIGRvY3VtZW50YXRpb24uaGFzQXR0cmlidXRlTlMoWFNEQ29uc3RhbnRzLlhNTF9OQU1FU1BBQ0VfVVJJXzE5OTgsIFhNTF9MQU5HX0FUVFJJQlVURSkgPyBkb2N1bWVudGF0aW9uLmdldEF0dHJpYnV0ZU5TKFhTRENvbnN0YW50cy5YTUxfTkFNRVNQQUNFX1VSSV8xOTk4LCBYTUxfTEFOR19BVFRSSUJVVEUpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc291cmNlIGF0dHJpYnV0ZSB2YWx1ZSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZG9jdW1lbnRhdGlvbi5oYXNBdHRyaWJ1dGVOUyhudWxsLCBYU0RDb25zdGFudHMuU09VUkNFX0FUVFJJQlVURSkgPyBkb2N1bWVudGF0aW9uLmdldEF0dHJpYnV0ZU5TKG51bGwsIFhTRENvbnN0YW50cy5TT1VSQ0VfQVRUUklCVVRFKSA6IG51bGw7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBYU0lEb2N1bWVudCBleHRlbmRzIENNRG9jdW1lbnRJbXBsLiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaG9sZCB0aG9zZQotICAgKiBhdHRyaWJ1dGVzIHRoYXQgYXJlIGZvciBkaXJlY3QgdXNlIGluIGFueSBYTUwgZG9jdW1lbnRzLiBUaGVzZSBhdHRyaWJ1dGVzCi0gICAqIGFyZSBpbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UsIHdoaWNoIGhhcyB0aGUgbmFtZXNwYWNlIG5hbWUKLSAgICogaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UuIEF0dHJpYnV0ZXMgaW4gdGhpcyBuYW1lc3BhY2UKLSAgICogaW5jbHVkZTogeHNpOnR5cGUgeHNpOm5pbCB4c2k6c2NoZW1hTG9jYXRpb24geHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNJRG9jdW1lbnQgZXh0ZW5kcyBDTURvY3VtZW50SW1wbAotICB7Ci0gICAgcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsIG5pbEF0dHJpYnV0ZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLiBDcmVhdGVzIHRoZSAneHNpOm5pbCcKLSAgICAgKi8KLSAgICBwdWJsaWMgWFNJRG9jdW1lbnQoKQotICAgIHsKLSAgICAgIHN1cGVyKFhTRENvbnN0YW50cy5TQ0hFTUFfSU5TVEFOQ0VfVVJJXzIwMDEpOwotICAgICAgLy8gY3JlYXRlIHRoZSAnbmlsbCcgYXR0cmlidXRlCi0gICAgICBTdHJpbmdbXSB2YWx1ZXMgPSB7ImZhbHNlIiwgInRydWUifTsKLSAgICAgIG5pbEF0dHJpYnV0ZSA9IG5ldyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCgibmlsIiwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCwgbmV3IENNRGF0YVR5cGVJbXBsKCJib29sZWFuIiwgdmFsdWVzKSk7Ci0gICAgICBuaWxBdHRyaWJ1dGUuc2V0UHJlZml4UXVhbGlmaWNhdGlvbih0cnVlKTsKLSAgICAgIG5pbEF0dHJpYnV0ZS5zZXRDTURvY3VtZW50KHRoaXMpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogTm90ZSB0aGlzIFhTRCBtb2RlbCB2aXNpdG9yIGRpZmZlcnMgZnJvbSB0aGUgWFNEIG1vZGVsIHZpc2l0b3IgaW4KLSAgICogb3JnLmVjbGlwc2Uud3N0LnhzZC5lZGl0b3IgcGx1Z2luLiBJbiB2aXNpdE1vZGVsR3JvdXAgbWV0aG9kIHdlIGNhbGwKLSAgICogZ2V0UGFydGljbGVzKCkgaW5zdGVhZCBvZiBnZXRDb250ZW50cygpLiBUaGlzIGdhdGhlcnMgYWxsIG9mIHRoZSBjb250ZW50IG9mCi0gICAqIGEgZGVyaXZlZCB0eXBlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RDTVZpc2l0b3IgZXh0ZW5kcyBYU0RWaXNpdG9yCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUpCi0gICAgewotICAgICAgWFNEUGFydGljbGUgY3RkID0gdHlwZS5nZXRDb21wbGV4VHlwZSgpOwotICAgICAgaWYgKGN0ZCAhPSBudWxsKQotICAgICAgICB2aXNpdFBhcnRpY2xlKGN0ZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBpZiAobW9kZWxHcm91cC5nZXRQYXJ0aWNsZXMoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxHcm91cC5nZXRQYXJ0aWNsZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICB2aXNpdFBhcnRpY2xlKHBhcnRpY2xlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZikKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSBtb2RlbEdyb3VwRGVmLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRNb2RlbEdyb3VwKCk7Ci0gICAgICBpZiAobW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgewotICAgICAgICB2aXNpdE1vZGVsR3JvdXAobW9kZWxHcm91cCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBBIHZpc2l0b3IgY2xhc3MgdGhhdCB3YWxrcyB0aGUgeHNkIG1vZGVsIGFuZCBjb21wdXRlcyB0aGUgbGlzdCBvZiBjaGlsZHJlbgotICAgKiB0aGF0IGJlbG9uZyB0byB0aGUgaW5pdGlhbGx5IHZpc2l0ZWQgZWxlbWVudCB0eXBlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBEZXJpdmVkQ2hpbGRWaXNpdG9yIGV4dGVuZHMgWFNEQ01WaXNpdG9yCi0gIHsKLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdEltcGwgY2hpbGROb2RlTGlzdCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotICAgIHByb3RlY3RlZCBMaXN0IGJhc2VUeXBlTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBPYmplY3Qgcm9vdDsKLQotICAgIERlcml2ZWRDaGlsZFZpc2l0b3IoT2JqZWN0IHJvb3QpCi0gICAgewotICAgICAgdGhpcy5yb290ID0gcm9vdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ01Ob2RlTGlzdEltcGwgZ2V0Q2hpbGROb2RlTGlzdCgpCi0gICAgewotICAgICAgcmV0dXJuIGNoaWxkTm9kZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRXaWxkY2FyZChYU0RXaWxkY2FyZCB3aWxkY2FyZCkKLSAgICB7Ci0gICAgICBjaGlsZE5vZGVMaXN0LmdldExpc3QoKS5hZGQoZ2V0QWRhcHRlcih3aWxkY2FyZCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICAgIHsKLSAgICAgIGNoaWxkTm9kZUxpc3QuZ2V0TGlzdCgpLmFkZChnZXRBZGFwdGVyKGVsZW1lbnQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIGNoaWxkTm9kZUxpc3QuZ2V0TGlzdCgpLmFkZChnZXRBZGFwdGVyKG1vZGVsR3JvdXApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGNoaWxkTm9kZUxpc3QuZ2V0TGlzdCgpLmFkZChnZXRBZGFwdGVyKG1vZGVsR3JvdXBEZWZpbml0aW9uKSk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBBIHZpc2l0b3IgY2xhc3MgdGhhdCBnYXRoZXJzIGFsbCBvZiB0aGUgZWxlbWVudHMgd2l0aGluIGEgdHlwZSBkZWZpbml0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBMb2NhbEVsZW1lbnRWaXNpdG9yIGV4dGVuZHMgWFNEQ01WaXNpdG9yCi0gIHsKLSAgICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIG5hbWVkTm9kZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICBwcm90ZWN0ZWQgTGlzdCBiYXNlVHlwZUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikgZ2V0QWRhcHRlcihlbGVtZW50KTsKLSAgICAgIG5hbWVkTm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoYWRhcHRlci5nZXROb2RlTmFtZSgpLCBhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0Q01OYW1lZE5vZGVNYXAoKQotICAgIHsKLSAgICAgIHJldHVybiBuYW1lZE5vZGVNYXA7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRFR5cGVVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRFR5cGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjY5ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RUeXBlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gZ2VuZXJhdGUgdmFsaWQgdmFsdWVzIGZvciBidWlsdC1pbiBzaW1wbGUgdHlwZXMuCi0gKi8KLQotcHVibGljIGNsYXNzIFhTRFR5cGVVdGlsCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgTWFwIGRlZmF1bHRWYWx1ZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoKQotICB7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiYW55U2ltcGxlVHlwZSIsIG51bGwpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImFueVR5cGUiLCBudWxsKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJhbnlVUkkiLCAiaHR0cDovL3RlbXB1cmkub3JnIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiYmFzZTY0QmluYXJ5IiwgIk1BPT0iKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJib29sZWFuIiwgInRydWUiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJieXRlIiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJkYXRlIiwgIjIwMDEtMDEtMDEiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJkYXRlVGltZSIsICIyMDAxLTEyLTMxVDEyOjAwOjAwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZGVjaW1hbCIsICIwLjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJkb3VibGUiLCAiMC4wIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZHVyYXRpb24iLCAiUDFEIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiRU5USVRZIiwgImVudGl0eSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIkVOVElUSUVTIiwgImVudGl0aWVzIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZmxvYXQiLCAiMC4wIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZ0RheSIsICItLS0wMSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImdNb250aCIsICItLTAxLS0iKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJnTW9udGhEYXkiLCAiLS0wMS0wMSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImdZZWFyIiwgIjIwMDEiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJnWWVhck1vbnRoIiwgIjIwMDEtMDEiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJoZXhCaW5hcnkiLCAiMEYwMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIklEIiwgbnVsbCk7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiSURSRUYiLCBudWxsKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJJRFJFRlMiLCBudWxsKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJpbnQiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImludGVnZXIiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImxhbmd1YWdlIiwgIkVOIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgibG9uZyIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiTmFtZSIsICJOYW1lIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiTkNOYW1lIiwgIk5DTmFtZSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIm5lZ2F0aXZlSW50ZWdlciIsICItMSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIk5NVE9LRU4iLCAiTk1UT0tFTiIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIk5NVE9LRU5TIiwgIk5NVE9LRU5TIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgibm9uTmVnYXRpdmVJbnRlZ2VyIiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJub25Qb3NpdGl2ZUludGVnZXIiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIm5vcm1hbGl6ZWRTdHJpbmciLCBudWxsKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJOT1RBVElPTiIsICJOT1RBVElPTiIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInBvc2l0aXZlSW50ZWdlciIsICIxIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiUU5hbWUiLCAiUU5hbWUiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJzaG9ydCIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgic3RyaW5nIiwgbnVsbCk7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgidGltZSIsICIxMjowMDowMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInRva2VuIiwgInRva2VuIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgidW5zaWduZWRCeXRlIiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJ1bnNpZ25lZEludCIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgidW5zaWduZWRMb25nIiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJ1bnNpZ25lZFNob3J0IiwgIjAiKTsKLSAgfQotCi0KLSAgLyoKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIGlzIGJ1aWx0LWluLgotICAgKiBAcGFyYW0gdHlwZSAtIGFuIFhTRFR5cGVEZWZpbml0aW9uIG9iamVjdC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIGJ1aWx0LWluLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQnVpbHRJbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7IAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IHR5cGUuZ2V0TmFtZSgpOwotICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICBkZWZhdWx0VmFsdWUuY29udGFpbnNLZXkobmFtZSk7IAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyBhIHZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzaW1wbGUgdHlwZS4KLSAgICogQHBhcmFtIHR5cGUgLSBhIHNpbXBsZSBidWlsdC1pbiB0eXBlLgotICAgKiBAcmV0dXJuIGEgdmFsaWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHNpbXBsZSB0eXBlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5zdGFuY2VWYWx1ZShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoaXNCdWlsdEluKHR5cGUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZUlEID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKWRlZmF1bHRWYWx1ZS5nZXQobmFtZUlEKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gYmFzZXR5cGUgPSB0eXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgIGlmIChiYXNldHlwZSAhPSB0eXBlKSByZXR1cm4gZ2V0SW5zdGFuY2VWYWx1ZShiYXNldHlwZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjU4MzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5vdGF0aW9uRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIFhTRFZpc2l0b3IKLXsKLSAgcHVibGljIFhTRFZpc2l0b3IoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICBwcm90ZWN0ZWQgU3RhY2sgcGFydGljbGVTdGFjayA9IG5ldyBTdGFjaygpOwotICAKLSAgcHVibGljIHZvaWQgdmlzaXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IChYU0RUeXBlRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIGlkZW50aXR5Q29uc3RyYWludCA9IChYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24oaWRlbnRpdHlDb25zdHJhaW50KTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24obW9kZWxHcm91cCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oYXR0cmlidXRlR3JvdXApOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldE5vdGF0aW9uRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNETm90YXRpb25EZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXROb3RhdGlvbkRlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0VHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pdHlwZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil0eXBlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0VHlwZURlZmluaXRpb24oZWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbihYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIGlkZW50aXR5Q29uc3RyYWludCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWYpCi0gIHsKLSAgICBpZiAoIW1vZGVsR3JvdXBEZWYuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIGlmIChtb2RlbEdyb3VwRGVmLmdldE1vZGVsR3JvdXAoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICB2aXNpdE1vZGVsR3JvdXAobW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Tm90YXRpb25EZWNsYXJhdGlvbihYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIG5vdGF0aW9uKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlLmdldENvbnRlbnRUeXBlKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29tcGxleENvbnRlbnQgPSB0eXBlLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICBpZiAoY29tcGxleENvbnRlbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pY29tcGxleENvbnRlbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcGxleENvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRQYXJ0aWNsZSgoWFNEUGFydGljbGUpIGNvbXBsZXhDb250ZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGUoWFNEUGFydGljbGUgcGFydGljbGUpCi0gIHsKLSAgICB2aXNpdFBhcnRpY2xlQ29udGVudChwYXJ0aWNsZS5nZXRDb250ZW50KCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFBhcnRpY2xlQ29udGVudChYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50KQotICB7Ci0gICAgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWYgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHBhcnRpY2xlQ29udGVudDsKLQotICAgICAgaWYgKHBhcnRpY2xlU3RhY2suY29udGFpbnMobW9kZWxHcm91cERlZikpCi0gICAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgICAgCi0gICAgICBwYXJ0aWNsZVN0YWNrLnB1c2gobW9kZWxHcm91cERlZik7Ci0gICAgICAKLSAgICAgIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24obW9kZWxHcm91cERlZik7Ci0gICAgICAKLSAgICAgIHBhcnRpY2xlU3RhY2sucG9wKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgdmlzaXRNb2RlbEdyb3VwKChYU0RNb2RlbEdyb3VwKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbigoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsKLSAgICAgIHZpc2l0V2lsZGNhcmQoKFhTRFdpbGRjYXJkKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwKQotICB7Ci0gICAgaWYgKG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgdmlzaXRQYXJ0aWNsZShwYXJ0aWNsZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFdpbGRjYXJkKFhTRFdpbGRjYXJkIHdpbGRjYXJkKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzMDlmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLSAgICBwcm90ZWN0ZWQgWFNEU2NoZW1hTG9jYXRvckltcGwgc2NoZW1hTG9jYXRvciA9IG5ldyBYU0RTY2hlbWFMb2NhdG9ySW1wbCgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHNjaGVtYUxvY2F0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmMDE4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvcjsKLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYUxvY2F0b3JJbXBsIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBYU0RTY2hlbWFMb2NhdG9yCi17Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdG9yI2xvY2F0ZVNjaGVtYShvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgWFNEU2NoZW1hIGxvY2F0ZVNjaGVtYShYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcmF3U2NoZW1hTG9jYXRpb25VUkksIFN0cmluZyByZXNvbHZlZFNjaGVtYUxvY2F0aW9uVVJJKQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSByZXN1bHQgPSBudWxsOwotICAgICAgU3RyaW5nIGJhc2VMb2NhdGlvbiA9IHhzZFNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOyAgICAgIAotICAgICAgU3RyaW5nIHJlc29sdmVkVVJJID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbmFtZXNwYWNlVVJJLCByYXdTY2hlbWFMb2NhdGlvblVSSSk7IAotICAgICAgaWYgKHJlc29sdmVkVVJJID09IG51bGwpIAotICAgICAgewotICAgICAgICByZXNvbHZlZFVSSSA9IHJlc29sdmVkU2NoZW1hTG9jYXRpb25VUkk7ICAgICAgIAotICAgICAgfQotICAgICAgdHJ5Ci0gICAgICB7ICAgICAgICAKLSAgICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSB4c2RTY2hlbWEuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLSAgICAgICAgVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkocmVzb2x2ZWRVUkkpOwotICAgICAgICBSZXNvdXJjZSByID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7IAotICAgICAgICBYU0RSZXNvdXJjZUltcGwgcmVzb2x2ZWRSZXNvdXJjZSA9IG51bGw7Ci0gICAgICAgIGlmIChyIGluc3RhbmNlb2YgWFNEUmVzb3VyY2VJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZSA9IChYU0RSZXNvdXJjZUltcGwpcjsKLSAgICAgICAgfQotICAgICAgICBlbHNlICAgICAgICAKLSAgICAgICAgeyAgCi0gICAgICAgICAgU3RyaW5nIHBoeXNpY2FsTG9jYXRpb24gPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmVQaHlzaWNhbExvY2F0aW9uKGJhc2VMb2NhdGlvbiwgbmFtZXNwYWNlVVJJLCByZXNvbHZlZFVSSSk7ICAgICAKLSAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkocGh5c2ljYWxMb2NhdGlvbikpOwotICAgICAgICAgIHJlc29sdmVkUmVzb3VyY2UgPSAoWFNEUmVzb3VyY2VJbXBsKXJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoIioueHNkIikpOwotICAgICAgICAgIHJlc29sdmVkUmVzb3VyY2Uuc2V0VVJJKHVyaSk7Ci0gICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZS5sb2FkKGlucHV0U3RyZWFtLCBudWxsKTsgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gcmVzb2x2ZWRSZXNvdXJjZS5nZXRTY2hlbWEoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIC8vIEl0IGlzIGdlbmVyYWxseSBub3QgYW4gZXJyb3IgdG8gZmFpbCB0byByZXNvbHZlLgotICAgICAgICAvLyBJZiBhIHJlc291cmNlIGlzIGFjdHVhbGx5IGNyZWF0ZWQsIAotICAgICAgICAvLyB3aGljaCBoYXBwZW5zIG9ubHkgd2hlbiB3ZSBjYW4gY3JlYXRlIGFuIGlucHV0IHN0cmVhbSwKLSAgICAgICAgLy8gdGhlbiBpdCdzIGFuIGVycm9yIGlmIGl0J3Mgbm90IGEgZ29vZCBzY2hlbWEKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGF0cGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzOwotICAgIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNTdmOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyLCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwsIGJ1ZyAxMTQ3MDMzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLS8qKgotICogQW4gWFNEIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBhbGxvd3Mgc2V0dGluZyBzcGVjaWZpYyBjb25maWd1cmF0aW9uCi0gKiBpbmZvcm1hdGlvbiBmb3IgYSBXVFAgWFNEIHZhbGlkYXRpb24gcnVuLiBBbnkgZmVhdHVyZXMgYW5kIHByb3BlcnRpZXMKLSAqIHNldCBvbiB0aGlzIGNvbmZpZ3VyYXRpb24gc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIHRob3NlIGZyb20KLSAqIHBhcnNlcnMgc3VjaCBhcyBYZXJjZXMuIChUaGlzIG9iamVjdCBkb2VzIG5vdCBieSBkZWZhdWx0IHdyYXAgZmVhdHVyZXMKLSAqIGFuZCBwcm9wZXJ0aWVzIGZyb20gc3BlY2lmaWMgcGFyc2Vycy4pCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiAKLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TID0gIkhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgRlVMTF9TQ0hFTUFfQ09ORk9STUFOQ0UgPSAiRlVMTF9TQ0hFTUFfQ09ORk9STUFOQ0UiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgYm9vbGVhbiBob25vdXJfYWxsX3NjaGVtYV9sb2NhdGlvbnMgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIGZ1bGxTY2hlbWFDb25mb3JtYW5jZSA9IHRydWU7Ci0gIAotICAvKioKLSAgICogU2V0IGEgZmVhdHVyZSBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gZmVhdHVyZQotICAgKiAJCVRoZSBmZWF0dXJlIHRvIHNldC4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIAkJVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGZlYXR1cmUuCi0gICAqIEB0aHJvd3MgCi0gICAqIAkJQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgZmVhdHVyZSBpcyBub3QgcmVjb2duaXplZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGJvb2xlYW4gdmFsdWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotCWlmKEhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUy5lcXVhbHMoZmVhdHVyZSkpCi0JICBob25vdXJfYWxsX3NjaGVtYV9sb2NhdGlvbnMgPSB2YWx1ZTsKLQllbHNlIGlmIChGVUxMX1NDSEVNQV9DT05GT1JNQU5DRS5lcXVhbHMoZmVhdHVyZSkpCi0JCWZ1bGxTY2hlbWFDb25mb3JtYW5jZSA9IHZhbHVlOwotCWVsc2UKLQkgIHRocm93IG5ldyBFeGNlcHRpb24oIkZlYXR1cmUgbm90IHJlY29nbml6ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkKLSAgfQotICAKLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHZhbHVlIGZvciBhIGdpdmVuIGZlYXR1cmUuIElmIHRoZSBmZWF0dXJlIGlzIG5vdCBkZWZpbmVkCi0gICAqIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGZlYXR1cmUKLSAgICogCQlUaGUgZmVhdHVyZSBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIGZlYXR1cmUncyB2YWx1ZSwgdHJ1ZSBvciBmYWxzZS4KLSAgICogQHRocm93cyAKLSAgICogCQlBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0JaWYoSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TLmVxdWFscyhmZWF0dXJlKSkKLQkgIHJldHVybiBob25vdXJfYWxsX3NjaGVtYV9sb2NhdGlvbnM7Ci0JZWxzZSBpZiAoRlVMTF9TQ0hFTUFfQ09ORk9STUFOQ0UuZXF1YWxzKGZlYXR1cmUpKQotICAgICAgcmV0dXJuIGZ1bGxTY2hlbWFDb25mb3JtYW5jZTsKLQkKLQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGZWF0dXJlIG5vdCByZWNvZ25pemVkLiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNEVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0RWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2YjVlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0RWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciwgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsLCBidWcgMTE0NzAzMwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5YTUxHcmFtbWFyUHJlcGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MR3JhbW1hclBvb2xJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuWE1MR3JhbW1hckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUVycm9yOwotCi0vKioKLSAqIFRoZSBYU0RWYWxpZGF0b3Igd2lsbCB2YWxpZGF0ZSBYU0QgZmlsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIFVSSVJlc29sdmVyIHVyaXJlc29sdmVyID0gbnVsbDsKLQotICBwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRlKHVyaSwgbnVsbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICB7Ci0JcmV0dXJuIHZhbGlkYXRlKHVyaSwgbnVsbCwgbnVsbCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgWFNEIGZpbGUgc3BlY2lmaWVkIGJ5IHRoZSBVUkkuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqIAkJVGhlIFVSSSBvZiB0aGUgWFNEIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBpbnB1dFN0cmVhbSAKLSAgICogCQlBbiBpbnB1dCBzdHJlYW0gcmVwcmVzZW50aW5nIHRoZSBYU0QgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLSAgICogCQlBIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgdmFsaWRhdGlvbiBydW4uCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLSAgewotCWlmKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkKLQl7Ci0JICBjb25maWd1cmF0aW9uID0gbmV3IFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uKCk7Ci0JfQotCVZhbGlkYXRpb25JbmZvIHZhbGluZm8gPSBuZXcgVmFsaWRhdGlvbkluZm8odXJpKTsKLQlYU0RFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IFhTREVycm9ySGFuZGxlcih2YWxpbmZvKTsKLQl0cnkKLQl7Ci0JICBYTUxHcmFtbWFyUHJlcGFyc2VyIGdyYW1tYXJQcmVwYXJzZXIgPSBuZXcgWE1MR3JhbW1hclByZXBhcnNlcigpOwotCSAgZ3JhbW1hclByZXBhcnNlci5yZWdpc3RlclByZXBhcnNlcihYTUxHcmFtbWFyRGVzY3JpcHRpb24uWE1MX1NDSEVNQSxudWxsLypzY2hlbWFMb2FkZXIqLyk7Ci0JCSAgCi0JICBncmFtbWFyUHJlcGFyc2VyLnNldFByb3BlcnR5KENvbnN0YW50cy5YRVJDRVNfUFJPUEVSVFlfUFJFRklYICsgQ29uc3RhbnRzLlhNTEdSQU1NQVJfUE9PTF9QUk9QRVJUWSwgbmV3IFhNTEdyYW1tYXJQb29sSW1wbCgpKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLkNPTlRJTlVFX0FGVEVSX0ZBVEFMX0VSUk9SX0ZFQVRVUkUsIGZhbHNlKTsKLSAgICAgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLk5BTUVTUEFDRVNfRkVBVFVSRSwgdHJ1ZSk7Ci0gICAgICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5OQU1FU1BBQ0VfUFJFRklYRVNfRkVBVFVSRSwgdHJ1ZSk7Ci0JICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5WQUxJREFUSU9OX0ZFQVRVUkUsIHRydWUpOwotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuU0NIRU1BX1ZBTElEQVRJT05fRkVBVFVSRSwgdHJ1ZSk7Ci0KLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLkVYVEVSTkFMX0dFTkVSQUxfRU5USVRJRVNfRkVBVFVSRSwgdHJ1ZSk7Ci0JICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRJRVNfRkVBVFVSRSwgdHJ1ZSk7Ci0JICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5XQVJOX09OX0RVUExJQ0FURV9BVFRERUZfRkVBVFVSRSwgdHJ1ZSk7Ci0JICAgICAKLQkgIGlmKGNvbmZpZ3VyYXRpb24uZ2V0RmVhdHVyZShYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMpKQotCSAgewotCSAgICB0cnkKLQkgICAgewotCSAgICAgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgImhvbm91ci1hbGwtc2NoZW1hTG9jYXRpb25zIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICAgIHsKLQkgICAgICAvLyBjYXRjaCB0aGUgZXhjZXB0aW9uIGFuZCBpZ25vcmUKLQkgICAgfQotCSAgfQotCSAgCi0JICBpZihjb25maWd1cmF0aW9uLmdldEZlYXR1cmUoWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uRlVMTF9TQ0hFTUFfQ09ORk9STUFOQ0UpKSB7Ci0JCXRyeQotCQl7Ci0JCSAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuU0NIRU1BX0ZVTExfQ0hFQ0tJTkcsIHRydWUpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJLy8gaWdub3JlIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gc2V0IGl0IG9yIGNhbid0LgotCQl9Ci0JCQotCSAgfQotCSAgICAgIAotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKTsKLQkgIGlmICh1cmlyZXNvbHZlciAhPSBudWxsKQotCSAgewotCSAgICBYU0RFbnRpdHlSZXNvbHZlciByZXNvbHZlciA9IG5ldyBYU0RFbnRpdHlSZXNvbHZlcih1cmlyZXNvbHZlciwgdXJpKTsKLQkgICAgaWYgKHJlc29sdmVyICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBncmFtbWFyUHJlcGFyc2VyLnNldEVudGl0eVJlc29sdmVyKHJlc29sdmVyKTsKLQkgICAgfQotCSAgfQotCi0JICB0cnkKLQkgIHsKLQkgIAlYTUxJbnB1dFNvdXJjZSBpcyA9IG5ldyBYTUxJbnB1dFNvdXJjZShudWxsLCB1cmksIHVyaSwgaW5wdXRTdHJlYW0sIG51bGwpOwotCSAgICBncmFtbWFyUHJlcGFyc2VyLmdldExvYWRlcihYTUxHcmFtbWFyRGVzY3JpcHRpb24uWE1MX1NDSEVNQSk7Ci0JCWdyYW1tYXJQcmVwYXJzZXIucHJlcGFyc2VHcmFtbWFyKFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BLGlzKTsKLQkgIH0KLQkgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgIHsKLQkgICAgLy9wYXJzZXIgd2lsbCByZXR1cm4gbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBpZiB0aGUgZG9jdW1lbnQgaXMgc3RydWN0dXJhbGx5IGludmFsaWQKLQkJLy9UT0RPOiBsb2cgZXJyb3IgbWVzc2FnZQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgIH0KLQl9Ci0JY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCXsKLSAgICAgIC8vIFRPRE86IGxvZyBlcnJvci4KLQkgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotCX0KLQlyZXR1cm4gdmFsaW5mbzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIFVSSSByZXNvbHZlciB0byB1c2Ugd2l0aCBYU0QgdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSB1cmlyZXNvbHZlcgotICAgKiAgICAgICAgICBUaGUgVVJJIHJlc29sdmVyIHRvIHVzZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyIHVyaXJlc29sdmVyKQotICB7Ci0gICAgdGhpcy51cmlyZXNvbHZlciA9IHVyaXJlc29sdmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBYU0RFcnJvckhhbmRsZXIgaGFuZGxlIFhlcmNlcyBwYXJzaW5nIGVycm9ycyBhbmQgcHV0cyB0aGUgZXJyb3JzCi0gICAqIGludG8gdGhlIGdpdmVuIFZhbGlkYXRpb25JbmZvIG9iamVjdC4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBYU0RFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBYTUxFcnJvckhhbmRsZXIKLSAgewotCSAgCi0gICAgcHJpdmF0ZSBmaW5hbCBWYWxpZGF0aW9uSW5mbyB2YWxpbmZvOwotCi0gICAgcHVibGljIFhTREVycm9ySGFuZGxlcihWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKQotICAgIHsKLSAgICAgIHRoaXMudmFsaW5mbyA9IHZhbGluZm87Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXJyb3JLZXkgVGhlIFhlcmNlcyBlcnJvciBrZXkuCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRoYXQgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWxpZGF0aW9uTWVzc2FnZShTdHJpbmcgZXJyb3JLZXksIFhNTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbiwgaW50IHNldmVyaXR5KQotICAgIHsgCi0gICAgICBTdHJpbmcgc3lzdGVtSWQgPSBleGNlcHRpb24uZ2V0RXhwYW5kZWRTeXN0ZW1JZCgpOwotICAgICAgaWYgKHN5c3RlbUlkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChzZXZlcml0eSA9PSBET01FcnJvci5TRVZFUklUWV9XQVJOSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsaW5mby5hZGRXYXJuaW5nKGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRDb2x1bW5OdW1iZXIoKSwgc3lzdGVtSWQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHZhbGluZm8uYWRkRXJyb3IoZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSwgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpLCBzeXN0ZW1JZCwgZXJyb3JLZXksIG51bGwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXIjd2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIGtleSwgWE1MUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0JewotICAgIAlhZGRWYWxpZGF0aW9uTWVzc2FnZShrZXksIGV4Y2VwdGlvbiwgRE9NRXJyb3IuU0VWRVJJVFlfV0FSTklORyk7Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXIjZXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTdHJpbmcgZG9tYWluLCBTdHJpbmcga2V5LCBYTUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBYTklFeGNlcHRpb24KLSAgICB7Ci0gICAgCWFkZFZhbGlkYXRpb25NZXNzYWdlKGtleSwgZXhjZXB0aW9uLCBET01FcnJvci5TRVZFUklUWV9FUlJPUik7Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXIjZmF0YWxFcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIGtleSwgWE1MUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0JewotICAgIAlhZGRWYWxpZGF0aW9uTWVzc2FnZShrZXksIGV4Y2VwdGlvbiwgRE9NRXJyb3IuU0VWRVJJVFlfRkFUQUxfRVJST1IpOwotCX0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgWFNERW50aXR5UmVzb2x2ZXIgd3JhcHMgYW4gaWRyZXNvbHZlciB0byBwcm92aWRlIGVudGl0eSByZXNvbHV0aW9uIHRvCi0gICAqIHRoZSBYU0QgdmFsaWRhdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIFhTREVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgWE1MRW50aXR5UmVzb2x2ZXIKLSAgewotICAgIHByaXZhdGUgVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkcmVzb2x2ZXIKLSAgICAgKiAgICAgICAgICBUaGUgaWRyZXNvbHZlciB0aGlzIGVudGl0eSByZXNvbHZlciB3cmFwcy4KLSAgICAgKiBAcGFyYW0gYmFzZWxvY2F0aW9uIFRoZSBiYXNlIGxvY2F0aW9uIHRvIHJlc29sdmUgd2l0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgWFNERW50aXR5UmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXIsIFN0cmluZyBiYXNlbG9jYXRpb24pCi0gICAgewotICAgICAgdGhpcy51cmlyZXNvbHZlciA9IHVyaXJlc29sdmVyOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcikKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShYTUxSZXNvdXJjZUlkZW50aWZpZXIgcmVzb3VyY2VJZGVudGlmaWVyKSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgIFN0cmluZyBsaXRlcmFsU3lzdGVtSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0TGl0ZXJhbFN5c3RlbUlkKCk7Ci0gICAgICBpZihsaXRlcmFsU3lzdGVtSWQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAJcmVzb3VyY2VJZGVudGlmaWVyLnNldExpdGVyYWxTeXN0ZW1JZChsaXRlcmFsU3lzdGVtSWQucmVwbGFjZSgnXFwnLCcvJykpOwotICAgICAgfQotICAgICAgICAvLyBUT0RPIGNzOiBJbiByZXZpc2lvbiAxLjEgd2UgZXhwbGljaXRseSBvcGVuZWQgYSBzdHJlYW0gdG8gZW5zdXJlCi0gICAgICAgIC8vIGZpbGUgSS9PIHByb2JsZW1zIHByb2R1Y2VkIG1lc3NhZ2VzLiBJJ3ZlIHJlbW92ZSB0aGlzIGZ1ZGdlIGZvciBub3cKLSAgICAgICAgLy8gc2luY2UgSSBjYW4ndCBzZWVtIHRvIHJlcHJvZHVjZSB0aGUgcHJvYmxlbSBpdCB3YXMgaW50ZW5kZWQgdG8gZml4LgotICAgICAgICAvLyBJJ20gaG9waW5nIHRoZSBuZXdlciBYZXJjZXMgY29kZSBiYXNlIGhhcyBmaXhlZCB0aGlzIHByb2JsZW0gYW5kIHRoZSBmdWRnZSBpcyBkZWZ1bmN0LgotICAgICAgICByZXR1cm4gWE1MVmFsaWRhdG9yLl9pbnRlcm5hbFJlc29sdmVFbnRpdHkodXJpcmVzb2x2ZXIsIHJlc291cmNlSWRlbnRpZmllcik7Ci0gICAgICAKLSAgICB9Ci0gIH0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGEwMzFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIsIFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCwgYnVnIDExNDcwMzMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwuWFNEQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNEQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0TmVzdGVkVmFsaWRhdG9yCi17Ci0gIHByb3RlY3RlZCBIYXNoTWFwIHhzZENvbmZpZ3VyYXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3NldHVwVmFsaWRhdGlvbihvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFZhbGlkYXRpb24oTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSAKLSAgewotCVhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oKTsKLQlib29sZWFuIGhvbm91ckFsbFNjaGVtYUxvY2F0aW9ucyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyk7Ci0JYm9vbGVhbiBmdWxsU2NoZW1hQ29uZm9ybWFuY2UgPSBYU0RDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5GVUxMX1NDSEVNQV9DT05GT1JNQU5DRSk7Ci0JdHJ5Ci0JewotCSAgY29uZmlndXJhdGlvbi5zZXRGZWF0dXJlKFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uLkhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUywgaG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zKTsKLQkgIGNvbmZpZ3VyYXRpb24uc2V0RmVhdHVyZShYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5GVUxMX1NDSEVNQV9DT05GT1JNQU5DRSwgZnVsbFNjaGVtYUNvbmZvcm1hbmNlKTsKLQl9Ci0JY2F0Y2goRXhjZXB0aW9uIGUpCi0JewotCSAgLy8gVW5hYmxlIHRvIHNldCB0aGUgaG9ub3VyIGFsbCBzY2hlbWEgbG9jYXRpb25zIG9wdGlvbi4gRG8gbm90aGluZy4KLQl9Ci0JeHNkQ29uZmlndXJhdGlvbnMucHV0KGNvbnRleHQsIGNvbmZpZ3VyYXRpb24pOwotCQotCXN1cGVyLnNldHVwVmFsaWRhdGlvbihjb250ZXh0KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3RlYXJkb3duVmFsaWRhdGlvbihvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyZG93blZhbGlkYXRpb24oTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSAKLSAgewotCXhzZENvbmZpZ3VyYXRpb25zLnJlbW92ZShjb250ZXh0KTsKLQkKLQlzdXBlci50ZWFyZG93blZhbGlkYXRpb24oY29udGV4dCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciN2YWxpZGF0ZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmlvLklucHV0U3RyZWFtLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dHN0cmVhbSwgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KQotICB7ICAKLQlYU0RWYWxpZGF0b3IgdmFsaWRhdG9yID0gWFNEVmFsaWRhdG9yLmdldEluc3RhbmNlKCk7Ci0JCi0JWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbil4c2RDb25maWd1cmF0aW9ucy5nZXQoY29udGV4dCk7Ci0KLQlWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IG51bGw7Ci0JCi0JdmFscmVwb3J0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKHVyaSwgaW5wdXRzdHJlYW0sIGNvbmZpZ3VyYXRpb24pOwotCQkgICAgICAgIAotCXJldHVybiB2YWxyZXBvcnQ7Ci0gIH0KLQkgIAotICAvKioKLSAgICogU3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgbWVzc2FnZSBwYXJhbWV0ZXJzLiBGb3IgWFNEIHZhbGlkYXRpb24gdGhlcmUKLSAgICogYXJlIHRocmVlIGFkZGl0aW9uYWwgcGllY2VzIG9mIGluZm9ybWF0aW9uIHRvIHN0b3JlOgotICAgKiBwYXJhbVswXSA9IHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBlcnJvcgotICAgKiBwYXJhbVsxXSA9IHRoZSAnc3F1aWdnbGUgc2VsZWN0aW9uIHN0cmF0ZWd5JyBmb3Igd2hpY2ggRE9NIHBhcnQgdG8gc3F1aWdnbGUKLSAgICogcGFyYW1bMl0gPSB0aGUgbmFtZSBvciB2YWx1ZSBvZiB3aGF0IGlzIHRvIGJlIHNxdWlnZ2xlZAotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI2FkZEluZm9Ub01lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZSwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZEluZm9Ub01lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UsIElNZXNzYWdlIG1lc3NhZ2UpCi0gIHsgCi0JU3RyaW5nIGtleSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldEtleSgpOwotCWlmKGtleSAhPSBudWxsKQotCXsKLQkgIFhTRE1lc3NhZ2VJbmZvSGVscGVyIG1lc3NhZ2VJbmZvSGVscGVyID0gbmV3IFhTRE1lc3NhZ2VJbmZvSGVscGVyKCk7Ci0JICBTdHJpbmdbXSBtZXNzYWdlSW5mbyA9IG1lc3NhZ2VJbmZvSGVscGVyLmNyZWF0ZU1lc3NhZ2VJbmZvKGtleSwgdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TWVzc2FnZSgpKTsKLQotCSAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUsIG5ldyBJbnRlZ2VyKHZhbGlkYXRpb25NZXNzYWdlLmdldENvbHVtbk51bWJlcigpKSk7Ci0JICBtZXNzYWdlLnNldEF0dHJpYnV0ZShTUVVJR0dMRV9TRUxFQ1RJT05fU1RSQVRFR1lfQVRUUklCVVRFLCBtZXNzYWdlSW5mb1swXSk7Ci0JICBtZXNzYWdlLnNldEF0dHJpYnV0ZShTUVVJR0dMRV9OQU1FX09SX1ZBTFVFX0FUVFJJQlVURSwgbWVzc2FnZUluZm9bMV0pOwotCX0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI2dldFZhbGlkYXRvcklEKCkKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdG9ySUQoKQotICB7Ci0gICAgLy8gQmVjYXVzZSB0aGlzIGNsYXNzIGlzIHVzZWQgYXMgYSBkZWxlZ2F0ZSwgcmV0dXJuIHRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yCi0gICAgLy8gd2hpY2ggZGVsZWdhdGVzIHRvIHRoaXMgY2xhc3MuCi0KLSAgICByZXR1cm4gWFNERGVsZWdhdGluZ1ZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNERGVsZWdhdGluZ1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0REZWxlZ2F0aW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNjE1YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0REZWxlZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXMuRGVsZWdhdGluZ1ZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgdW5pcXVlIG5hbWUgKGNsYXNzIG5hbWUpIHdoaWNoIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yawotICogd2lsbCB1c2UgdG8gaWRlbnRpZnkgdGhlIFhTRCB2YWxpZGF0b3IuIFRoZSBhY3R1YWwgZGVsZWdhdGluZyB2YWxpZGF0b3IKLSAqIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQgYnkgdGhlIGJhc2UgY2xhc3MuIFRoZSBhY3R1YWwgdmFsaWRhdGlvbgotICogZnVuY3Rpb25hbGl0eSBpcyBwcm92aWRlZCBieSB0aGUgZGVsZWdhdGVzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGNsYXNzIGFzCi0gKiB0aGVpciB0YXJnZXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0REZWxlZ2F0aW5nVmFsaWRhdG9yIGV4dGVuZHMgRGVsZWdhdGluZ1ZhbGlkYXRvcgotewotICAvKioKLSAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBYU0REZWxlZ2F0aW5nVmFsaWRhdG9yKCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRE1lc3NhZ2VJbmZvSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRE1lc3NhZ2VJbmZvSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZTMyOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0RNZXNzYWdlSW5mb0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotCi0vKioKLSAqIFRoZSBYU0RNZXNzYWdlSW5mb0hlbHBlciBjcmVhdGVzIGEgc3RyaW5nIHdpdGggdGhlCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RNZXNzYWdlSW5mb0hlbHBlcgotewotICBwdWJsaWMgWFNETWVzc2FnZUluZm9IZWxwZXIoKQotICB7IHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gY3JlYXRlTWVzc2FnZUluZm8oU3RyaW5nIGVycm9yS2V5LCBTdHJpbmcgZXJyb3JNZXNzYWdlKQotICB7IAotICAgIC8vTm93IG1hcCB0aGUgZXJyb3Iga2V5IHRvIHdoYXQgd2Ugd291bGQgd2FudCB0byB1bmRlcmxpbmU6Ci0gICAgU3RyaW5nIG5hbWVPclZhbHVlID0gIiI7Ci0gICAgU3RyaW5nIHNlbGVjdGlvblN0cmF0ZWd5ID0gIiI7Ci0gICAgaWYoZXJyb3JLZXkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JLZXkuZXF1YWxzKCJzNHMtZWx0LWludmFsaWQtY29udGVudC4xIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJzNHMtZWx0LW11c3QtbWF0Y2guMSIpIHx8IAotICAgIAkJICBlcnJvcktleS5lcXVhbHMoInM0cy1hdHQtbXVzdC1hcHBlYXIiKSB8fCBlcnJvcktleS5lcXVhbHMoInM0cy1lbHQtaW52YWxpZC1jb250ZW50LjIiKSkgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQgIC8vJE5PTi1OTFMtMyQgIC8vJE5PTi1OTFMtNCQKLSAgICAgIHsgCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIlNUQVJUX1RBRyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiczRzLWF0dC1ub3QtYWxsb3dlZCIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7IAotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJBVFRSSUJVVEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbmFtZU9yVmFsdWUgPSBnZXRGaXJzdFN0cmluZ0JldHdlZW5TaW5nbGVRdW90ZXMoZXJyb3JNZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiczRzLWF0dC1pbnZhbGlkLXZhbHVlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsgCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIkFUVFJJQlVURV9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbmFtZU9yVmFsdWUgPSBnZXRGaXJzdFN0cmluZ0JldHdlZW5TaW5nbGVRdW90ZXMoZXJyb3JNZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiczRzLWVsdC1jaGFyYWN0ZXIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgeyAKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiVEVYVCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygic3JjLXJlc29sdmUuNC4yIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJzcmMtcmVzb2x2ZSIpKSAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotICAgICAgeyAKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiVkFMVUVfT0ZfQVRUUklCVVRFX1dJVEhfR0lWRU5fVkFMVUUiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG5hbWVPclZhbHVlID0gZ2V0Rmlyc3RTdHJpbmdCZXR3ZWVuU2luZ2xlUXVvdGVzKGVycm9yTWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIkVxUmVxdWlyZWRJbkF0dHJpYnV0ZSIpIHx8IGVycm9yS2V5LmVxdWFscygiT3BlblF1b3RlRXhwZWN0ZWQiKSB8fCAKLSAgICAJCSAgZXJyb3JLZXkuZXF1YWxzKCJMZXNzdGhhbkluQXR0VmFsdWUiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIHsKLSAgICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJBVFRSSUJVVEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbmFtZU9yVmFsdWUgPSBnZXRGaXJzdFN0cmluZ0JldHdlZW5RdW90ZXMoZXJyb3JNZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiRWxlbWVudFVudGVybWluYXRlZCIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gIkVOVElSRV9FTEVNRU5UIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJFVGFnVW50ZXJtaW5hdGVkIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJFVGFnUmVxdWlyZWQiKSkgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotICAgICAgewotICAgICAgICBzZWxlY3Rpb25TdHJhdGVneSA9ICJFTkRfVEFHIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICBTdHJpbmcgbWVzc2FnZUluZm9bXSA9IG5ldyBTdHJpbmdbMl07Ci0gICAgbWVzc2FnZUluZm9bMF0gPSBzZWxlY3Rpb25TdHJhdGVneTsKLSAgICBtZXNzYWdlSW5mb1sxXSA9IG5hbWVPclZhbHVlOwotICAgIHJldHVybiBtZXNzYWdlSW5mbzsgICAgCi0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIHZhbHVlIGJldHdlZW4gdGhlIGZpcnN0IHBhaXIgb2Ygc2luZ2xlIHF1b3RlcwotICAgKiBJdCBpcyB1c2VkIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSB0aGUgZXJyb3IgTWVzc2FnZSAoZm9yIGV4YW1wbGUKLSAgICogYW4gYXR0cmlidXRlIG5hbWUpCi0gICAqIAotICAgKiBAcGFyYW0gcwotICAgKiAJCVRoZSBzdHJpbmcgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0Rmlyc3RTdHJpbmdCZXR3ZWVuU2luZ2xlUXVvdGVzKFN0cmluZyBzKQotICB7Ci0gICAgcmV0dXJuIGdldEZpcnN0U3RyaW5nQmV0d2VlbkRlbGltaXRlcnMocywgJ1wnJyk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIHZhbHVlIGJldHdlZW4gdGhlIGZpcnN0IHBhaXIgb2YgcXVvdGVzCi0gICAqIEl0IGlzIHVzZWQgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBlcnJvciBNZXNzYWdlIChmb3IgZXhhbXBsZQotICAgKiBhbiBhdHRyaWJ1dGUgbmFtZSkKLSAgICogCi0gICAqIEBwYXJhbSBzCi0gICAqIAkJVGhlIHN0cmluZyB0byBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRGaXJzdFN0cmluZ0JldHdlZW5RdW90ZXMoU3RyaW5nIHMpCi0gIHsKLSAgICByZXR1cm4gZ2V0Rmlyc3RTdHJpbmdCZXR3ZWVuRGVsaW1pdGVycyhzLCAnXCInKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgdmFsdWUgYmV0d2VlbiB0aGUgZmlyc3Qgc3RhcnQgYW5kIGVuZCBvY2N1cnJlbmNlcyBvZiB0aGUgZ2l2ZW4gZGVsaW1pdGVyIGNoYXJhY3Rlci4KLSAgICogCi0gICAqIEBwYXJhbSBzCi0gICAqIAkJVGhlIHN0cmluZyB0byBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tLgotICAgKiBAcGFyYW0gZGVsaW1pdGVyIAotICAgKiAJCVRoZSBzdGFydCBhbmQgZW5kIGNoYXJhY3RlcgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRGaXJzdFN0cmluZ0JldHdlZW5EZWxpbWl0ZXJzKFN0cmluZyBzLCBjaGFyIGRlbGltaXRlcikKLSAgewotICAgIGludCBmaXJzdCA9IHMuaW5kZXhPZihkZWxpbWl0ZXIpOwotICAgIGludCBzZWNvbmQgPSBzLmluZGV4T2YoZGVsaW1pdGVyLCBmaXJzdCArIDEpOwotICAgIFN0cmluZyBzdHJpbmdCZXR3ZWVuRGVsaW1pdGVycyA9IG51bGw7Ci0gICAgaWYgKGZpcnN0ICE9IC0xICYmIHNlY29uZCAhPSAtMSkKLSAgICB7IAotICAgICAgc3RyaW5nQmV0d2VlbkRlbGltaXRlcnMgPSBzLnN1YnN0cmluZyhmaXJzdCArIDEsIHNlY29uZCk7Ci0gICAgfQotICAgIHJldHVybiBzdHJpbmdCZXR3ZWVuRGVsaW1pdGVyczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0RWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNEVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZTFhMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0RWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLQotCi0vKioKLSAqIEFuIFhTRCB2YWxpZGF0b3Igc3BlY2lmaWMgdG8gRWNsaXBzZS4gVGhpcyB2YWxpZGF0b3Igd2lsbCB3cmFwIHRoZSBpbnRlcm5hbAotICogWFNEIHZhbGlkYXRvciBhbiBwcm92aWRlIGF1dG9tYXRpYyBVUkkgcmVzb2x1dGlvbiBzdXBwb3J0LgotICogVXNpbmcgdGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIHVzaW5nIHRoZSBpbnRlcm5hbCBYU0QgdmFsaWRhdG9yIGFuZCByZWdpc3RlcmluZwotICogdGhlIFVSSSByZXNvbHZlciBmcm9tIHRoZSBVUkkgcmVzb2x1dGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RWYWxpZGF0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YU0RWYWxpZGF0b3IKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgWFNEVmFsaWRhdG9yIGluc3RhbmNlID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgWFNEIHZhbGlkYXRvci4gVGhlIHZhbGlkYXRvcgotICAgKiBjYW4gYmUgcmV1c2VkIGFuZCBjYW5ub3QgYmUgY3VzdG9taXplZCBzbyB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgaW5zdGFuY2Ugb2YgaXQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIFhTRCB2YWxpZGF0b3IuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFhTRFZhbGlkYXRvciBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZihpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlID0gbmV3IFhTRFZhbGlkYXRvcigpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiBDcmVhdGUgdGhlIFhTRCB2YWxpZGF0b3IgYW5kIHNldCB0aGUgVVJJIHJlc29sdmVyLgotICAgKi8KLSAgcHJvdGVjdGVkIFhTRFZhbGlkYXRvcigpCi0gIHsKLSAgICB0aGlzLnNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL1hTRENvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvWFNEQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjMwZjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvWFNEQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLlhTRENNTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFhTRENvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBYU0RDb3JlUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFhTRENvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgWFNEQ01NYW5hZ2VyLmdldEluc3RhbmNlKCkuc3RhcnR1cCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgWFNEQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODFmMjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwuWFNEQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBYU0QgQ29yZSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgWFNEQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKFhTRENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCi0JCS8vIEluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGJlc3QgY29tcGF0aWJpbGl0eSBhbmQgY29uZm9ybWFuY2UgdG8gdGhlIFhNTCBTY2hlbWEKLQkJLy8gc3BlY2lmaWNhdGlvbiBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoaXMgYmUgZGVmYXVsdGVkIHRvIHRydWUuCi0JCW5vZGUucHV0Qm9vbGVhbihYU0RDb3JlUHJlZmVyZW5jZU5hbWVzLkZVTExfU0NIRU1BX0NPTkZPUk1BTkNFLCB0cnVlKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZmYzc0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogQ29tbW9uIHByZWZlcmVuY2Uga2V5cyB1c2VkIGJ5IFhTRCBjb3JlCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RDb3JlUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIFhTRENvcmVQcmVmZXJlbmNlTmFtZXMoKSB7Ci0JCS8vIGVtcHR5IHByaXZhdGUgY29uc3RydWN0b3Igc28gdXNlcnMgY2Fubm90IGluc3RhbnRpYXRlIGNsYXNzCi0JfQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhbGwgc2NoZW1hIGxvY2F0aW9ucyBzaG91bGQgYmUgaG9ub3VyZWQKLQkgKiBkdXJpbmcgWFNEIHZhbGlkYXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtUUlVFLCBGQUxTRX0KLQkgKiA8L3A+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMgPSAiaG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTF9TQ0hFTUFfQ09ORk9STUFOQ0UgPSAiZnVsbFNjaGVtYUNvbmZvcm1hbmNlIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJiNTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXJlZmFjdG9yIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWFkdCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1hZHQteHNkIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWNvbW1vbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1hZHQteHNkLXR5cGV2aXoiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtc2VhcmNoIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDBlNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgoteHNkZWRpdG9yLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LnhzZC51aV8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiMzgyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNkLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Yzg4MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSNUdWUgSmFuIDE2IDE3OjQ4OjMwIEVTVCAyMDA3DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNzgyZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUdWUgSmFuIDE2IDE3OjA0OjEzIEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPXVzZXIKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFjZDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYNCi1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTANCi1jb21waWxlcnMucC5idWlsZD0wDQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xDQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MA0KLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wDQotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTANCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTANCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTANCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wDQotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTANCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjc5NzhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVfVUlfUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC54c2QudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi40MDQucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQucHJvcGVydGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXo7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24ubGF5b3V0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnByb3ZpZGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5pY29uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubmF2aWdhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubnNlZGl0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmhhbmRsZXJzLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnZhbGlkYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjQwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmdlZjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQ7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS54c2QuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWk7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW07YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiCi1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudXRpbDt2ZXJzaW9uPSIzLjguMSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTEyNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMtc2VhcmNoLyxcCi0gICAgICAgICAgIHNyYy1yZWZhY3Rvci8sXAotICAgICAgICAgICBzcmMtYWR0LyxcCi0gICAgICAgICAgIHNyYy1hZHQteHNkLyxcCi0gICAgICAgICAgIHNyYy1hZHQteHNkLXR5cGV2aXovLFwKLSAgICAgICAgICAgc3JjLWNvbW1vbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwKLW91dHB1dC4uID0gYmluLwotamF2YWNTb3VyY2U9MS40Ci1qYXZhY1RhcmdldD0xLjQKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk0NDQzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIKLQluYW1lPSJvcmcuZWNsaXBzZS53c3QueHNkIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4JaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9YU0RGaWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9YU0RGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwMGYxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvWFNERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvYmxhbmsuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2JsYW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzNmUyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvYmxhbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkYWU1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9jb2xsYXBzZV9hdHRyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9jb2xsYXBzZV9hdHRyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3MmJlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvY29sbGFwc2VfYXR0ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvY3Rvb2wxNi9OZXdYU0QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2N0b29sMTYvTmV3WFNELmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlZmRkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvY3Rvb2wxNi9OZXdYU0QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2RlbGV0ZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2RlbGV0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjkyMmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kZWxldGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kbGNsMTYvc2NoZW1hdmlld19jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZGxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjY3OTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kbGNsMTYvc2NoZW1hdmlld19jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZGxjbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZGxjbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NGZmMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2RsY2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2R0b29sMTYvY2FwdHVyZXNjcmVlbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZHRvb2wxNi9jYXB0dXJlc2NyZWVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3MGM5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZHRvb2wxNi9jYXB0dXJlc2NyZWVuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kdG9vbDE2L2hlbHBfY29udGVudHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2R0b29sMTYvaGVscF9jb250ZW50cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YmY2MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2R0b29sMTYvaGVscF9jb250ZW50cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZHRvb2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2R0b29sMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0ZmYxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZHRvb2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2VsY2wxNi9zY2hlbWF2aWV3X2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9lbGNsMTYvc2NoZW1hdmlld19jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZDdmMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2VsY2wxNi9zY2hlbWF2aWV3X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9lbGNsMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9lbGNsMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjMTlhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZWxjbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi9jYXB0dXJlc2NyZWVuLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L2NhcHR1cmVzY3JlZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzY4MzBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L2NhcHR1cmVzY3JlZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvaGVscF9jb250ZW50cy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi9oZWxwX2NvbnRlbnRzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3MDMwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi9oZWxwX2NvbnRlbnRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGMxOWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi96b29tbWludXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvem9vbW1pbnVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyYzkyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi96b29tbWludXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvem9vbXBsdXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvem9vbXBsdXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjZkNzU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L3pvb21wbHVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9leHBhbmRfYXR0ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXhwYW5kX2F0dHIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzI4N2U5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9leHBhbmRfYXR0ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZmlsdGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9maWx0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmU2ZjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9maWx0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREFueUF0dHJpYnV0ZWRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQW55QXR0cmlidXRlZGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ0MGEyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQW55QXR0cmlidXRlZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBbnlkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREFueWRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZGE3NTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREFueWRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4ZGY3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwUmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzFkYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwUmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cFJlZmRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXBSZWZkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWRjNThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cFJlZmRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXBkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwZGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU4MTY3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXBkaXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZVJlZmRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlUmVmZGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwYWY1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlUmVmZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZWRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMWQxOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZWRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQ29tcGxleENvbnRlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRENvbXBsZXhDb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwYzEyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQ29tcGxleENvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRENvbXBsZXhUeXBlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RDb21wbGV4VHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OGI5NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRENvbXBsZXhUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RDb21wbGV4VHlwZWRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQ29tcGxleFR5cGVkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmQxYjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RDb21wbGV4VHlwZWRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNERWxlbWVudFJlZmRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNERWxlbWVudFJlZmRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYmQzYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREVsZW1lbnRSZWZkaXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREVsZW1lbnRkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREVsZW1lbnRkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjU2ODY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RFbGVtZW50ZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjJjMmQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXBSZWYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwUmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4OTg3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXBSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwUmVmZGlzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cFJlZmRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMTdlOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwUmVmZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cGRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXBkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGRmN2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cGRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEU2ltcGxlQ29udGVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEU2ltcGxlQ29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZTgxMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRFNpbXBsZUNvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2FsbF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2FsbF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTM3ZmJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hbGxfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hbGxkaXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hbGxkaXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1NDg0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYWxsZGlzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYW5ub3RhdGlvbnNoZWFkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Fubm90YXRpb25zaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmYjY4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYW5ub3RhdGlvbnNoZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2F0dHJpYnV0ZWdyb3Vwc2hlYWRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYXR0cmlidXRlZ3JvdXBzaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwOTJmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYXR0cmlidXRlZ3JvdXBzaGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hdHRyaWJ1dGVzaGVhZGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hdHRyaWJ1dGVzaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1NDg3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYXR0cmlidXRlc2hlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvY2hvaWNlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvY2hvaWNlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZjU4M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Nob2ljZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Nob2ljZWRpc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Nob2ljZWRpc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWNjNGZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9jaG9pY2VkaXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9kaXJlY3RpdmVzaGVhZGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9kaXJlY3RpdmVzaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwMGNiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZGlyZWN0aXZlc2hlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZWxlbWVudHNoZWFkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2VsZW1lbnRzaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZmNzIwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZWxlbWVudHNoZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Vycm9yX21hcmtlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXJyb3JfbWFya2VyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlMWUyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXJyb3JfbWFya2VyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9lcnJvcl90c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Vycm9yX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMDQ4ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Vycm9yX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXh0bnNuX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXh0bnNuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNGE5NWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2V4dG5zbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2V4dG5zbmRpc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2V4dG5zbmRpc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDNjZDBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9leHRuc25kaXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9ncm91cHNoZWFkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2dyb3Vwc2hlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYTExY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2dyb3Vwc2hlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvaW5kZXguZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2luZGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmOWFjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvaW5kZXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L25vdGF0aW9uc2hlYWRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvbm90YXRpb25zaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1YzY0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvbm90YXRpb25zaGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zZXF1ZW5jZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NlcXVlbmNlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Yjg2MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NlcXVlbmNlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc2VxdWVuY2VkaXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zZXF1ZW5jZWRpc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDk3MmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zZXF1ZW5jZWRpc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NpbXBsZXR5cGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zaW1wbGV0eXBlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNzQ0MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NpbXBsZXR5cGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zaW1wbGV0eXBlZGlzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc2ltcGxldHlwZWRpc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA5NzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zaW1wbGV0eXBlZGlzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9saXN0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9saXN0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNTE4YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfbGlzdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfbGlzdGRpc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfbGlzdGRpc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODM4MjVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX2xpc3RkaXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3Jlc3RyaWN0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9yZXN0cmljdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmE5YWZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3Jlc3RyaWN0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9yZXN0cmljdGRpc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfcmVzdHJpY3RkaXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2NzY2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9yZXN0cmljdGRpc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfdW5pb25fb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3VuaW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTMxNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfdW5pb25fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3VuaW9uZGlzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF91bmlvbmRpc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTcyMDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3VuaW9uZGlzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvdHlwZXNoZWFkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3R5cGVzaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2NzU0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvdHlwZXNoZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2F0dHJpYnV0ZW92ZXJsYXkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2F0dHJpYnV0ZW92ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTMxZjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9hdHRyaWJ1dGVvdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9lcnJvcl9vdnIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2Vycm9yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWRjY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2Vycm9yX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvZXh0bnNuX292ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvZXh0bnNuX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNDQyMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2V4dG5zbl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2V4dG5zbmRpc19vdnIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2V4dG5zbmRpc19vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGViNzY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9leHRuc25kaXNfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi90ZXh0b3ZlcmxheS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvdGV4dG92ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDU1YzJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi90ZXh0b3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZmJhZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hIFByb3BlcnRpZXMgZmlsZSBmb3IgY29tcG9uZW50OiBYTVNDSCAtIFhNTCBUb29scyAtICBYTUwgU2NoZW1hIEVkaXRvcgotISBQYWNrYWdlZCBmb3IgdHJhbnNsYXRpb24gaW46ICB4bWwuemlwCi0KLSEKLSEgUGx1Z2luCi0hCi1fVUlfUExVR0lOX05BTUUgICAgICAgICAgICAgPSBYTUwgU2NoZW1hIEVkaXRvcgotX1VJX0VESVRPUl9OQU1FICAgICAgICAgICAgID0gWE1MIFNjaGVtYSBFZGl0b3IKLQotX1VJX0FDVElPTl9FWFRfR0VORVJBVEUgICAgICA9ICZHZW5lcmF0ZQotX1VJX0FDVElPTl9FWFRfR0VORVJBVEVfRERMICA9ICZEREwuLi4KLV9VSV9BQ1RJT05fRVhUX0dFTkVSQVRFX0RURCAgPSBEJlRELi4uCi1fVUlfQUNUSU9OX0VYVF9HRU5FUkFURV9KQVZBID0gJkphdmEgQmVhbnMuLi4KLQotX1VJX0FDVElPTl9FWFRfR0VORVJBVEVfWFNEID0gJkdlbmVyYXRlIFhNTCBTY2hlbWEKLV9VSV9XSVpBUkRfTkFNRV9ORVdfWFNEICAgICA9IFhNTCBTY2hlbWEKLQotX1VJX1hNTF9UT09MU19QUkVGRVJFTkNFX1BBR0UgID0gWE1MCi1fVUlfWE1MX1NDSEVNQV9QUkVGRVJFTkNFICAgICAgPSBYTUwgU2NoZW1hIEZpbGVzCi1fVUlfWE1MX1NDSEVNQV9FRElUT1JfUFJFRkVSRU5DRSA9IEVkaXRvcgotX1VJX1hNTF9TQ0hFTUFfVkFMSURBVE9SX1BSRUZFUkVOQ0UgPSBWYWxpZGF0aW9uCi0KLV9VSV9XSVpBUkRfTkVXX1hTRCAgICAgICAgICAgICA9IFhNTCBTY2hlbWEKLV9VSV9DUkVBVEVfQV9ORVdfU0NIRU1BICAgICAgICA9IENyZWF0ZSBhIG5ldyBYTUwgc2NoZW1hIGZpbGUKLQotISBOZXcgcHJvcGVydHkgdGFicwotX1VJX0xBQkVMX0dFTkVSQUwgICAgICAgICAgPSBHZW5lcmFsCi1fVUlfTEFCRUxfQVRUUklCVVRFUyAgICAgICA9IEF0dHJpYnV0ZXMKLV9VSV9MQUJFTF9ET0NVTUVOVEFUSU9OICAgID0gRG9jdW1lbnRhdGlvbgotX1VJX0xBQkVMX1RZUEVfQ09OU1RSQUlOVFMgPSBDb25zdHJhaW50cwotX1VJX0xBQkVMX0FQUExJQ0FUSU9OX0lORk8gPSBBcHBsaWNhdGlvbiBJbmZvCi1fVUlfTEFCRUxfRVhURU5TSU9OUyAgICAgICA9IEV4dGVuc2lvbnMKLV9VSV9MQUJFTF9GQUNFVFMgICAgICAgICAgID0gRmFjZXRzCi1fVUlfTEFCRUxfRU5VTUVSQVRJT05TICAgICA9IEVudW1lcmF0aW9ucwotX1VJX0xBQkVMX0FEVkFOQ0VEICAgICAgICAgPSBBZHZhbmNlZAotCi1fVUlfTEFCRUxfUkVBRF9PTkxZICAgICA9IHJlYWQtb25seQotX1VJX0xBQkVMX0tJTkQgICAgICAgICAgPSBLaW5kOgotX1VJX0xBQkVMX1ZBUklFVFkgICAgICAgPSAmVmFyaWV0eToKLQotX1VJX0xBQkVMX0FQUF9JTkZPICAgICAgPSBBcHAgSW5mbwotCi0hCi0hIFNjaGVtYSBGaWxlIFdpbmRvdwotIQotX1VJX0xBQkVMX0ZJTEVfTkFNRSAgICAgICAgICAgICAgPSBGaWxlIG5hbWU6Ci1fVUlfTEFCRUxfVkVSU0lPTiAgICAgICAgICAgICAgICA9IFZlcnNpb246Ci1fVUlfVE9PTFRJUF9WRVJTSU9OICAgICAgICAgICAgICA9IENvbnZlbmllbnQgYXR0cmlidXRlIHRvIHN0b3JlIHZlcnNpb24gbnVtYmVyCi1fVUlfTEFCRUxfTEFOR1VBR0UgICAgICAgICAgICAgICA9IExhbmd1YWdlOgotX1VJX1RPT0xUSVBfTEFOR1VBR0UgICAgICAgICAgICAgPSBSZXByZXNlbnRzIG5hdHVyYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMKLV9VSV9HUk9VUF9OQU1FU1BBQ0UgICAgICAgICAgICAgID0gTmFtZXNwYWNlCi1fVUlfTEFCRUxfU0NIRU1BX1BSRUZJWCAgICAgICAgICA9ICZQcmVmaXg6Ci1fVUlfVE9PTFRJUF9TQ0hFTUFfUFJFRklYICAgICAgICA9IFRoZSBwcmVmaXggYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG5hbWVzcGFjZS4KLV9VSV9MQUJFTF9UQVJHRVRfTkFNRV9TUEFDRSAgICAgID0gJlRhcmdldCBuYW1lc3BhY2U6Ci1fVUlfVE9PTFRJUF9UQVJHRVRfTkFNRV9TUEFDRSAgICA9IFRoZSBuYW1lc3BhY2UgZm9yIHRoaXMgc2NoZW1hLgotX1VJX0JVVFRPTl9BUFBMWSAgICAgICAgICAgICAgICAgPSBBcHBseQotX1VJX0xBQkVMX0FUVFJJQlVURV9GT1JNX0RFRkFVTFQgPSBBdHRyaWJ1dGUgZm9ybSBkZWZhdWx0OgotX1VJX1RPT0xUSVBfQVRUUklCVVRFX0ZPUk0gICAgICAgPSBJbmRpY2F0ZXMgaWYgYWxsIGF0dHJpYnV0ZXMgaW4gYSBzY2hlbWEgbXVzdCBiZSBxdWFsaWZpZWQgb3Igbm90IGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudAotX1VJX0xBQkVMX0VMRU1FTlRfRk9STV9ERUZBVUxUICAgPSBFbGVtZW50IGZvcm0gZGVmYXVsdDoKLV9VSV9UT09MVElQX0VMRU1FTlRfRk9STV9ERUZBVUxUID0gSW5kaWNhdGVzIGlmIGFsbCBlbGVtZW50cyBpbiBhIHNjaGVtYSBtdXN0IGJlIHF1YWxpZmllZCBvciBub3QgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50Ci1fVUlfTEFCRUxfQkxPQ0tfREVGQVVMVCAgICAgICAgICA9IEJsb2NrIGRlZmF1bHQ6Ci1fVUlfVE9PTFRJUF9CTE9DS19ERUZBVUxUICAgICAgICA9IENvbnRyb2wgZGVyaXZhdGlvbnMgZm9yIGV2ZXJ5IHR5cGUgYW5kIGVsZW1lbnQgaW4gdGhlIHNjaGVtYQotX1VJX0xBQkVMX0ZJTkFMX0RFRkFVTFQgICAgICAgICAgPSBGaW5hbCBkZWZhdWx0OgotX1VJX1RPT0xUSVBfRklOQUxfREVGQVVMVCAgICAgICAgPSBDb250cm9sIGRlcml2YXRpb25zIGZvciBldmVyeSB0eXBlIGFuZCBlbGVtZW50IGluIHRoZSBzY2hlbWEKLV9VSV9BQ1RJT05fREVMRVRFX0lOQ0xVREUgICAgICAgID0gRGVsZXRlCi1fVUlfQUNUSU9OX0RFTEVURV9OT0RFUyAgICAgICAgICA9IERlbGV0ZSBOb2RlcwotISBOb3RlIHRvIHRyYW5zbGF0b3JzOiBUaGUgZm9sbG93aW5nIGlzIHRoZSBhY3JvbnltIGZvciBVbmlmb3JtIFJlc291cmNlIEluZGljYXRvcgotX1VJX0xBQkVMX1VSSSAgICAgICAgICAgICAgICAgICAgPSBVUkk6Ci0KLQotX1VJX0xBQkVMX0FERCAgICAgICAgICAgICAgPSBBZGQuLi4KLV9VSV9MQUJFTF9FRElUICAgICAgICAgICAgID0gRWRpdC4uLgotX1VJX0xBQkVMX1BBVFRFUk5TICAgICAgICAgPSBQYXR0ZXJucwotX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFMgPSBUaGUgZmlsZSBuYW1lIGFscmVhZHkgZXhpc3RzOiB7MH0KLQotIQotISBBbnkgU2VjdGlvbgotIQotISBOb3RlIHRvIHRyYW5zbGF0b3JzIC0gdHJhbnNsYXRlIG9ubHkgdGhlIHdvcmQgYW5kCi1fVUlfTEFCRUxfTkFNRVNQQUNFX0FORF9QUk9DRVNTX0NPTlRFTlRTID0gbmFtZXNwYWNlIGFuZCBwcm9jZXNzQ29udGVudHMKLQotIQotISBtaW5PY2N1cnMgYW5kIG1heE9jY3VycyBzZWN0aW9uCi0hCi0hIE5vdGUgdG8gdHJhbnNsYXRvcnMgLSB0cmFuc2xhdGUgb25seSB0aGUgd29yZCBhbmQKLV9VSV9MQUJFTF9NSU5PQ0NVUlNfQU5EX01BWE9DQ1VSUyA9IG1pbk9jY3VycyBhbmQgbWF4T2NjdXJzCi0KLSEKLSEgVmFsdWUgSW5mb3JtYXRpb24gU2VjdGlvbgotIQotX1VJX0xBQkVMX1ZBTFVFX0lORk9STUFUSU9OICAgPSBWYWx1ZSBJbmZvcm1hdGlvbgotCi0hCi0hIE5vdGF0aW9uIHdpbmRvdwotIQotX1VJX05PVEFUSU9OX05BTUUgICAgICAgICAgICAgICAgPSBOYW1lOgotX1VJX05PVEFUSU9OX1BVQkxJQyAgICAgICAgICAgICAgPSBQdWJsaWM6Ci1fVUlfTk9UQVRJT05fU1lTVEVNICAgICAgICAgICAgICA9IFN5c3RlbToKLV9VSV9UT09MVElQX1BVQkxJQyAgICAgICAgICAgICAgID0gQW4gb3B0aW9uYWwgcHVibGljIGlkZW50aWZpZXIKLV9VSV9UT09MVElQX1NZU1RFTSAgICAgICAgICAgICAgID0gQW4gb3B0aW9uYWwgVVJJIHJlZmVyZW5jZQotCi0hCi0hIENvbXBsZXggVHlwZSBXaW5kb3cKLSEKLV9VSV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgID0gTmFtZToKLV9VSV9BQlNUUkFDVCAgICAgICAgICAgICAgICAgICAgID0gQWJzdHJhY3Q6Ci1fVUlfTUlYRUQgICAgICAgICAgICAgICAgICAgICAgICA9IE1peGVkOgotX1VJX0JMT0NLICAgICAgICAgICAgICAgICAgICAgICAgPSBCbG9jazoKLV9VSV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgID0gRmluYWw6Ci0KLV9VSV9DVF9UT09MVElQX01JWEVEICAgICAgICAgICAgID0gSW5kaWNhdGVzIGlmIHR5cGUgbWF5IGNvbnRhaW4gbWl4ZWQgY29udGVudAotX1VJX0NUX1RPT0xUSVBfQUJTVFJBQ1QgICAgICAgICAgPSBXaGVuIGEgY29tcGxleCB0eXBlIGlzIGRlY2xhcmVkIGFic3RyYWN0LCBpdCBjYW5ub3QgYmUgdXNlZCBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudAotX1VJX0NUX1RPT0xUSVBfRklOQUwgICAgICAgICAgICAgPSBZb3UgY2FuIHVzZSB0aGlzIHRvIHByZXZlbnQgZnVydGhlciBkZXJpdmF0aW9ucwotX1VJX0NUX1RPT0xUSVBfQkxPQ0sgICAgICAgICAgICAgPSBZb3UgY2FuIHVzZSB0aGlzIHRvIGJsb2NrIGFueSBkZXJpdmF0aW9ucwotCi0hCi0hIFNpbXBsZUNvbnRlbnQgYW5kIENvbXBsZXhDb250ZW50IFdpbmRvdwotISAKLV9VSV9MQUJFTF9ERVJJVkVEX0JZICAgICAgICAgICAgPSBEZXJpdmVkIGJ5OgotX1VJX1RPT0xUSVBfREVSSVZFRF9CWSAgICAgICAgICA9IERlcml2ZSBieSBleHRlbnNpb24gdG8gaW5oZXJpdCBmcm9tIGEgYmFzZSB0eXBlIGNvbnRlbnQgbW9kZWwgYW5kIGFkZCB0byBpdC4gRGVyaXZlIGJ5IHJlc3RyaWN0aW9uIHRvIHJlc3RyaWN0IHRoZSBjb250ZW50IG1vZGVsIG9mIGFuIGV4aXN0aW5nIHR5cGUuCi0KLSEKLSEgRWxlbWVudCAmIEVsZW1lbnQgUmVmIFdpbmRvdwotIQotX1VJX0VMRU1FTlRfTkFNRSAgICAgICAgICAgICAgICAgPSBOYW1lOgotX1VJX0NIRUNLQk9YX05JTExBQkxFICAgICAgICAgICAgPSBOaWxsYWJsZQotX1VJX0NIRUNLQk9YX0FCU1RSQUNUICAgICAgICAgICAgPSBBYnN0cmFjdAotX1VJX1NVQlNUSVRVVElPTiAgICAgICAgICAgICAgICAgPSBTdWJzdGl0dXRpb24gZ3JvdXA6Ci1fVUlfTUlOSU1VTSAgICAgICAgICAgICAgICAgICAgICA9IE1pbmltdW06Ci1fVUlfTUFYSU1VTSAgICAgICAgICAgICAgICAgICAgICA9IE1heGltdW06Ci1fVUlfUkVGRVJFTkNFX05BTUUgICAgICAgICAgICAgICA9IFJlZmVyZW5jZSBuYW1lOgotCi1fVUlfVE9PTFRJUF9FTEVNRU5UX01JTklNVU0gICAgICA9IEEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHRpbWVzIGFuIGVsZW1lbnQgY2FuIG9jY3VyLgotX1VJX1RPT0xUSVBfRUxFTUVOVF9NQVhJTVVNICAgICAgPSBBIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIG9yIHVuYm91bmRlZCBpZiB0aGVyZSBpcyBubyB1cHBlciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBlbGVtZW50IGNhbiBvY2N1ci4KLV9VSV9UT09MVElQX0VMRU1FTlRfQUJTVFJBQ1QgICAgID0gV2hlbiBhbiBlbGVtZW50IGlzIGRlY2xhcmVkIGFic3RyYWN0LCBhIG1lbWJlciBvZiBpdHMgZXF1aXZhbGVudCBjbGFzcyBtdXN0IGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQsCi1fVUlfVE9PTFRJUF9FTEVNRU5UX05JTCAgICAgICAgICA9IElmIHNlbGVjdGVkLCBhbiBhdHRyaWJ1dGUgY2FuIGJlIGluY2x1ZGVkIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBlbGVtZW50IGhhcyBhIG5pbCB2YWx1ZS4KLV9VSV9UT09MVElQX0VMRU1FTlRfU1VCU1RJVFVUSU9OID0gU2VsZWN0IHRoZSBlbGVtZW50IHRoYXQgY2FuIGJlIHN1YnN0aXR1dGVkIGJ5IHRoaXMgZWxlbWVudAotX1VJX1RPT0xUSVBfRUxFTUVOVF9GT1JNICAgICAgICAgPSBJbmRpY2F0ZXMgaWYgdGhlIGVsZW1lbnQgaXMgcXVhbGlmZWQgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50Ci1fVUlfVE9PTFRJUF9FTEVNRU5UX1ZBTFVFICAgICAgICA9IFByb3ZpZGVzIGEgZGVmYXVsdCBvciBmaXhlZCB2YWx1ZSBmb3IgdGhlIGVsZW1lbnQuCi0KLQotIQotISBBdHRyaWJ1dGUgV2luZG93Ci0hICAgIF9VSV9DT01CT19CT1ggc3RyaW5ncyBhcmUgdXNlZCBpbiBjb2RlIGdlbmVyYXRpb24uIAotISAgICBQcm9iYWJseSBkb24ndCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQKLSEKLV9VSV9DT01CT19CT1hfUkVRVUlSRUQgICAgICAgICAgID0gcmVxdWlyZWQKLV9VSV9DT01CT19CT1hfT1BUSU9OQUwgICAgICAgICAgID0gb3B0aW9uYWwKLV9VSV9DT01CT19CT1hfUFJPSElCSVRFRCAgICAgICAgID0gcHJvaGliaXRlZAotCi1fVUlfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICA9IEZpeGVkCi1fVUlfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICA9IERlZmF1bHQKLV9VSV9BVFRSSUJVVEVfTkFNRSAgICAgICAgICAgICAgID0gQXR0cmlidXRlIG5hbWU6Ci1fVUlfVVNBR0UgICAgICAgICAgICAgICAgICAgICAgICA9ICZVc2FnZToKLV9VSV9GT1JNICAgICAgICAgICAgICAgICAgICAgICAgID0gJkZvcm0gcXVhbGlmaWNhdGlvbjoKLQotX1VJX0xBQkVMX09USEVSX0FUVFJJQlVURVMgICAgICAgPSBPdGhlciBBdHRyaWJ1dGVzCi0KLV9VSV9UT09MVElQX0FUVFJJQlVURV9VU0UgICAgICAgID0gSW5kaWNhdGVzIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQsIG9wdGlvbmFsLCBvciBwcm9oaWJpdGVkCi1fVUlfVE9PTFRJUF9BVFRSSUJVVEVfVkFMVUUgICAgICA9IFByb3ZpZGVzIGRlZmF1bHQgb3IgZml4ZWQgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUuIERlZmF1bHQgdmFsdWUgb25seSB2YWxpZCBpZiBVc2FnZSB2YWx1ZSBpcyBzZXQgdG8gb3B0aW9uYWwuCi0KLV9VSV9QUk9DRVNTX0NPTlRFTlRTICAgICAgICAgICAgID0gUHJvY2VzcyBjb250ZW50czoKLQotIQotISBBbm5vdGF0aW9uIC0gRG9jICYgQXBwSW5mbyBXaW5kb3cKLSEKLV9VSV9DT01NRU5UICAgICAgICAgICAgICAgICAgICAgID0gQ29tbWVudAotX1VJX1RPT0xUSVBfQ09NTUVOVCAgICAgICAgICAgICAgPSBJbmZvcm1hdGlvbiB1c2VmdWwgdG8gdGhlIHVzZXIgb3IgYXBwbGljYXRpb24KLV9VSV9TT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgID0gU291cmNlOgotX1VJX1RPT0xUSVBfU09VUkNFICAgICAgICAgICAgICAgPSBBbiBvcHRpb25hbCBVUkkgcmVmZXJlbmNlIHRvIHN1cHBsZW1lbnQgdGhlIGxvY2FsIGluZm9ybWF0aW9uCi1fVUlfTEFOR1VBR0UgICAgICAgICAgICAgICAgICAgICA9IExhbmd1YWdlOgotX1VJX1RPT0xUSVBfTEFOR1VBR0VfQU5OT1RBVElPTiAgPSBJbmRpY2F0ZSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIGFubm90YXRpb24gaXMgZXhwcmVzc2VkCi0KLSEKLSEgR3JvdXAKLSEgCi1fVUlfQ09OVEVOVF9NT0RFTCAgICAgICAgICAgICAgID0gQ29udGVudCBtb2RlbAotX1VJX1NFUVVFTkNFICAgICAgICAgICAgICAgICAgICA9IFNlcXVlbmNlCi1fVUlfQ0hPSUNFICAgICAgICAgICAgICAgICAgICAgID0gQ2hvaWNlCi1fVUlfQUxMICAgICAgICAgICAgICAgICAgICAgICAgID0gQWxsCi0KLQotIQotISBTaW1wbGUgVHlwZSBSZWxhdGVkIEZhY2V0cyAgLSBhcHBlYXIgYXMgZW50cmllcyBpbiBhIHRhYmxlIC0gcmVzdHJpY3Rpb24gb24gc2ltcGxlIHR5cGUKLSEKLV9VSV9HUk9VUF9GQUNFVFMgICAgICAgICAgICAgICAgPSBGYWNldHMKLV9VSV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgPSBMZW5ndGgKLV9VSV9NSU5JTVVNX0xFTkdUSCAgICAgICAgICAgICAgPSBNaW5pbXVtIExlbmd0aAotX1VJX01BWElNVU1fTEVOR1RIICAgICAgICAgICAgICA9IE1heGltdW0gTGVuZ3RoCi1fVUlfTUlOSU1VTV9JTkNMVVNJVkUgICAgICAgICAgID0gTWluaW11bSBJbmNsdXNpdmUKLV9VSV9NQVhJTVVNX0lOQ0xVU0lWRSAgICAgICAgICAgPSBNYXhpbXVtIEluY2x1c2l2ZQotX1VJX01JTklNVU1fRVhDTFVTSVZFICAgICAgICAgICA9IE1pbmltdW0gRXhjbHVzaXZlCi1fVUlfTUFYSU1VTV9FWENMVVNJVkUgICAgICAgICAgID0gTWF4aW11bSBFeGNsdXNpdmUKLV9VSV9UT1RBTF9ESUdJVFMgICAgICAgICAgICAgICAgPSBUb3RhbCBEaWdpdHMKLV9VSV9GUkFDVElPTl9ESUdJVFMgICAgICAgICAgICAgPSBGcmFjdGlvbiBEaWdpdHMKLV9VSV9XSElURV9TUEFDRSAgICAgICAgICAgICAgICAgPSBXaGl0ZSBTcGFjZQotX1VJX0ZBQ0VUX05BTUUgICAgICAgICAgICAgICAgICA9IE5hbWUKLV9VSV9GQUNFVF9WQUxVRSAgICAgICAgICAgICAgICAgPSBWYWx1ZQotX1VJX0ZBQ0VUX0ZJWEVEICAgICAgICAgICAgICAgICA9IEZpeGVkCi0KLV9VSV9UT09MVElQX0xFTkdUSCAgICAgICAgICAgICAgPSBUaGUgbnVtYmVyIG9mIHVuaXRzIG9mIGxlbmd0aC4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLgotX1VJX1RPT0xUSVBfTUlOX0xFTiAgICAgICAgICAgICA9IFRoZSBtaW5pbXVtIG51bWJlciBvZiB1bml0cyBvZiBsZW5ndGguIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4KLV9VSV9UT09MVElQX01BWF9MRU4gICAgICAgICAgICAgPSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdW5pdHMgb2YgbGVuZ3RoLiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuCi1fVUlfVE9PTFRJUF9NQVhfSU5DTFVTSVZFICAgICAgID0gVGhlIHVwcGVyIGJvdW5kIG9mIHRoZSB2YWx1ZSBzcGFjZS4gVGhlIHZhbHVlIGlzIGl0c2VsZiBpbmNsdWRlZC4KLV9VSV9UT09MVElQX01BWF9FWENMVVNJVkUgICAgICAgPSBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHZhbHVlIHNwYWNlLiBUaGUgdmFsdWUgaXMgaXRzZWxmIGV4Y2x1ZGVkLgotX1VJX1RPT0xUSVBfTUlOX0lOQ0xVU0lWRSAgICAgICA9IFRoZSBsb3dlciBib3VuZCBvZiB0aGUgdmFsdWUgc3BhY2UuIFRoZSB2YWx1ZSBpcyBpdHNlbGYgaW5jbHVkZWQuCi1fVUlfVE9PTFRJUF9NSU5fRVhDTFVTSVZFICAgICAgID0gVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSB2YWx1ZSBzcGFjZS4gVGhlIHZhbHVlIGlzIGl0c2VsZiBleGNsdWRlZC4KLV9VSV9UT09MVElQX1RPVEFMX0RJR0lUUyAgICAgICAgPSBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMuIE11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLgotX1VJX1RPT0xUSVBfRlJBQ1RJT05fRElHSVRTICAgICA9IFRoZSBtYXhpbXVtIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cyBpbiB0aGUgZnJhY3Rpb25hbCBwYXJ0LiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuCi1fVUlfVE9PTFRJUF9XSElURV9TUEFDRSAgICAgICAgID0gSW5kaWNhdGVzIGlmIHdoaXRlIHNwYWNlIHNob3VsZCBiZSBwcmVzZXJ2ZWQsIHJlcGxhY2VkIG9yIGNvbGxhcHNlZC4gCi0KLV9VSV9UT09MVElQX1BBVFRFUk4gICAgICAgICAgICAgPSBDb25zdHJhaW5zIHRoZSB2YWx1ZSB0byBtYXRjaCBhIHNwZWNpZmljIHBhdHRlcm4uIFRoZSBwYXR0ZXJuIG11c3QgYmUgYSByZWd1bGFyIGV4cHJlc3Npb24uIAotX1VJX1RPT0xUSVBfRU5VTSAgICAgICAgICAgICAgICA9IENvbnN0cmFpbnMgdGhlIHZhbHVlIHRvIGEgc3BlY2lmaWVkIHNldCBvZiB2YWx1ZXMuIAotCi0hCi0hIFNpbXBsZS9Db21wbGV4IFR5cGUgU2VsZWN0aW9uIAotIQotX1VJX0xBQkVMX1RZUEVfSU5GT1JNQVRJT04gICAgICAgICAgPSBUeXBlIGluZm9ybWF0aW9uCi1fVUlfTEFCRUxfQkFTRV9UWVBFICAgICAgICAgICAgICAgICA9IEJhc2UgdHlwZQotX1VJX0xBQkVMX0JBU0VfVFlQRV9XSVRIX0NPTE9OICAgICAgPSAmQmFzZSB0eXBlOgotX1VJX0xBQkVMX1NFVF9CQVNFX1RZUEUgICAgICAgICAgICAgPSBTZXQgQmFzZSBUeXBlCi1fVUlfQUNUSU9OX1NFVF9CQVNFX1RZUEUgICAgICAgICAgICA9IFNldCBCYXNlIFR5cGUuLi4KLV9VSV9SQURJT19OT05FICAgICAgICAgICAgICAgICAgICAgID0gTm9uZQotX1VJX1JBRElPX0JVSUxUX0lOX1NJTVBMRV9UWVBFICAgICAgPSBCdWlsdC1pbiBzaW1wbGUgdHlwZQotX1VJX1JBRElPX1VTRVJfREVGSU5FRF9TSU1QTEVfVFlQRSAgPSBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUKLV9VSV9SQURJT19VU0VSX0RFRklORURfQ09NUExFWF9UWVBFID0gVXNlci1kZWZpbmVkIGNvbXBsZXggdHlwZQotX1VJX0xBQkVMX05FV19DT01QTEVYX1RZUEUgICAgICAgICAgPSBOZXcgQ29tcGxleCBUeXBlCi1fVUlfTEFCRUxfTkVXX1NJTVBMRV9UWVBFICAgICAgICAgICA9IE5ldyBTaW1wbGUgVHlwZQotX1VJX0xBQkVMX1NFVF9UWVBFCQkJCSAgICA9IFNldCBUeXBlCi1fVUlfTEFCRUxfU0VUX0VYSVNUSU5HX1RZUEUgCQk9IFNldCBFeGlzdGluZyBUeXBlLi4uCi1fVUlfTk9fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICA9ICoqbm9uZSoqCi1fVUlfTEFCRUxfQ09NUE9ORU5UUwkJCQk9IENvbXBvbmVudHM6Ci1fVUlfTEFCRUxfUVVBTElGSUVSCQkJCQk9IFF1YWxpZmllcjoKLQotX1VJX0xBQkVMX0NPTVBPTkVOVF9OQU1FCQkJICAgPSBDb21wb25lbnQgTmFtZToKLV9VSV9MQUJFTF9NQVRDSElOR19DT01QT05FTlRTCQkgICA9IE1hdGNoaW5nIENvbXBvbmVudHM6Ci1fVUlfTEFCRUxfTUFUQ0hJTkdfVFlQRVMJCSAgIAkgICA9IE1hdGNoaW5nIFR5cGVzOgotX1VJX0xBQkVMX1RZUEVfTkFNRQkJCQkJICAgPSBUeXBlIE5hbWU6Ci1fVUlfTEFCRUxfU1BFQ0lGSUVEX0ZJTEUJCQkgICA9IFNwZWNpZmllZCBGaWxlCi1fVUlfTEFCRUxfRU5DTE9TSU5HX1BST0pFQ1QJCQkgICA9IEVuY2xvc2luZyBQcm9qZWN0Ci1fVUlfTEFCRUxfV09SS1NQQUNFCQkJCQkgICA9IFdvcmtzcGFjZQotX1VJX0xBQkVMX0NVUlJFTlRfUkVTT1VSQ0UJCQkgICA9IEN1cnJlbnQgUmVzb3VyY2UKLV9VSV9MQUJFTF9TRUFSQ0hfU0NPUEUJCQkJICAgPSBTZWFyY2ggU2NvcGUKLV9VSV9MQUJFTF9OQVJST1dfU0VBUkNIX1NDT1BFX1JFU09VUkNFID0gVXNlIHJlc291cmNlIHZpZXcgdG8gbmFycm93IHNlYXJjaCBzY29wZQotX1VJX0xBQkVMX0FWQUlMQUJMRV9UWVBFUwkJCSAgID0gQXZhaWxhYmxlIFR5cGVzCi0KLQotIQotISBDb21iby1ib3ggdmFsdWUgCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogRG8gbm90IHRyYW5zbGF0ZSBmb2xsb3dpbmcgbGluZQotX1VJX0RFRkFVTFRfQU5PTllNT1VTICAgICAgICAgICAgICAgPSAqKmFub255bW91cyoqCi0KLSEKLSEgVW5pcXVlLCBLZXkgYW5kIEtleVJlZiB3aW5kb3cKLSEKLV9VSV9SRUZFUkVOQ0VfS0VZICAgICAgICAgICAgICAgICAgID0gUmVmZXJlbmNlIGtleQotX1VJX1NFTEVDVE9SICAgICAgICAgICAgICAgICAgICAgICAgPSBTZWxlY3RvcgotX1VJX0ZJRUxEUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBGaWVsZHMKLQotX1VJX1RPT0xUSVBfU0VMRUNUT1JfVEVYVCAgICAgICAgICAgPSBTcGVjaWZpZXMgYW4gWFBhdGggZXhwcmVzc2lvbiByZWxhdGl2ZSB0byBpbnN0YW5jZXMgb2YgdGhlIGN1cnJlbnQgZWxlbWVudAotX1VJX1RPT0xUSVBfRklFTERfVEVYVCAgICAgICAgICAgICAgPSBTcGVjaWZpZXMgYW4gWFBhdGggZXhwcmVzc2lvbiByZWxhdGl2ZSB0byBlYWNoIGVsZW1lbnQgc2VsZWN0ZWQgYnkgdGhlIHNlbGVjdG9yCi0KLV9VSV9BRERfQlVUVE9OICAgICAgICAgICAgICAgICAgICAgID0gQWRkPj4KLV9VSV9SRU1PVkVfQlVUVE9OICAgICAgICAgICAgICAgICAgID0gPDxSZW1vdmUKLQotIQotISBJbmNsdWRlICYgSW1wb3J0cwotIQotX1VJX0xBQkVMX1BSRUZJWCAgICAgICAgICAgICAgICA9ICZQcmVmaXg6Ci1fVUlfTEFCRUxfTkFNRVNQQUNFICAgICAgICAgICAgID0gJk5hbWVzcGFjZToKLQotX1VJX1NDSEVNQV9JTkNMVURFX0RFU0MgICAgICAgICA9IFNlbGVjdCBhIHNjaGVtYSBmaWxlIHNvIHRoYXQgdGhlIGRlZmluaXRpb25zIGluIHRoZSBzY2hlbWEgZmlsZSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBzY2hlbWEuIFRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBpbmNsdWRlZCBzY2hlbWEgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgY3VycmVudCBzY2hlbWEuCi1fVUlfTEFCRUxfU0NIRU1BX0lNUE9SVF9ERVNDICAgID0gU2VsZWN0IGEgc2NoZW1hIGZpbGUgZnJvbSBhIGRpZmZlcmVudCBuYW1lc3BhY2Ugc28gdGhhdCBpdHMgZGVmaW5pdGlvbnMgY2FuIGJlIHJlZmVyZW5jZWQgYnkgdGhlIGN1cnJlbnQgc2NoZW1hLiBZb3UgbXVzdCBhc3NvY2lhdGUgYSBwcmVmaXggd2l0aCB0aGUgbmV3IG5hbWVzcGFjZSBmb3IgdXNlIGluIHRoZSBjdXJyZW50IHNjaGVtYS4KLQotX1VJX0xBQkVMX1NDSEVNQV9MT0NBVElPTiAgICAgICAgPSAmU2NoZW1hIGxvY2F0aW9uOgotX1VJX0JVVFRPTl9TRUxFQ1QgICAgICAgICAgICAgICAgPSBTZWxlY3QKLV9VSV9GSUxFRElBTE9HX1NFTEVDVF9YTUxfU0NIRU1BID0gU2VsZWN0IFhNTCBzY2hlbWEgZmlsZQotX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9ERVNDICAgPSBTZWxlY3QgYW4gWE1MIHNjaGVtYSBmaWxlIGZyb20gdGhlIFdvcmtiZW5jaCBwcm9qZWN0cwotX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9VUkwgICAgPSBTZWxlY3QgYW4gWE1MIHNjaGVtYSBmaWxlIGZyb20gSFRUUAotCi1fVUlfTEFCRUxfTE9BRElOR19YTUxfU0NIRU1BICAgICA9IExvYWRpbmcgWE1MIFNjaGVtYQotX1VJX0xBQkVMX0ZJTklTSF9MT0FESU5HICAgICAgICAgPSBGaW5pc2ggTG9hZGluZwotX1VJX0xBQkVMX05PX0xPQ0FUSU9OX1NQRUNJRklFRCAgPSBObyBMb2NhdGlvbiBTcGVjaWZpZWQKLQotIQotISBYU0QgRWRpdG9yCi0hCi1fVUlfVEFCX1NPVVJDRSAgICAgICAgICAgICAgICAgID0gU291cmNlCi1fVUlfVEFCX0RFU0lHTiAgICAgICAgICAgICAgICAgID0gRGVzaWduCi0hICBOb3RlIHRvIHRyYW5zbGF0b3JzOiBHcmFwaCBpcyB0aGUgZ3JhcGhpYyB2aWV3IG9mIHRoZSBYTUwgc2NoZW1hCi1fVUlfVEFCX0dSQVBIICAgICAgICAgICAgICAgICAgID0gR3JhcGgKLV9VSV9NRU5VX1VORE8gICAgICAgICAgICAgICAgICAgPSAmVW5kbyBAQ3RybCtaCi1fVUlfTUVOVV9SRURPICAgICAgICAgICAgICAgICAgID0gJlJlZG8gQEN0cmwrWQotCi0hCi0hIFRhc2sgTGlzdCBSZWxhdGVkIE1lc3NhZ2UKLSEKLV9VSV9SRUZfRklMRV9FUlJPUl9ERVNDUklQVElPTiAgICAgID0gVGhlIGVycm9ycyBiZWxvdyB3ZXJlIGRldGVjdGVkIHdoZW4gdmFsaWRhdGluZyB0aGUgZmlsZSAiezB9IiB2aWEgdGhlIGZpbGUgInsxfSIuICBJbiBtb3N0IGNhc2VzIHRoZXNlIGVycm9ycyBjYW4gYmUgZGV0ZWN0ZWQgYnkgdmFsaWRhdGluZyAiezJ9IiBkaXJlY3RseS4gIEhvd2V2ZXIgaXQgaXMgcG9zc2libGUgdGhhdCBlcnJvcnMgd2lsbCBvbmx5IG9jY3VyIHdoZW4gezJ9IGlzIHZhbGlkYXRlZCBpbiB0aGUgY29udGV4dCBvZiB7M30uCi1fVUlfUkVGX0ZJTEVfRVJST1JfUFVTSF9IRUxQICAgICAgICA9IFB1c2ggdGhlIGhlbHAgYnV0dG9uIGJlbG93IHRvIHJlYWQgbW9yZS4KLV9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFICAgICAgICAgID0gUmVmZXJlbmNlZCBmaWxlIGNvbnRhaW5zIGVycm9ycyAoezB9KS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCByaWdodCBjbGljayBvbiB0aGUgbWVzc2FnZSBhbmQgc2VsZWN0ICJTaG93IERldGFpbHMuLi4iCi1fVUlfUkVGX0ZJTEVfU0hPV19ERVRBSUxTICAgICAgICAgICA9IFNob3cgRGV0YWlscy4uLgotCi0KLSEKLSEgWFNERWRpdG9yIE1lbnUgYmFyIGNvbnRyaWJ1dG9yCi0hCi1fVUlfTUVOVV9HRU5FUkFURV9KQVZBICAgICAgICAgICAgICA9IEdlbmVyYXRlICZKYXZhIEJlYW5zLi4uCi1fVUlfTUVOVV9HRU5FUkFURV9EVEQgICAgICAgICAgICAgICA9IEdlbmVyYXRlICZEVEQuLi4KLV9VSV9NRU5VX0dFTkVSQVRFX1NBTVBMRV9YTUwgICAgICAgID0gR2VuZXJhdGUgWE0mTC4uLgotX1VJX01FTlVfWFNEX0VESVRPUiAgICAgICAgICAgICAgICAgPSAmWFNECi1fVUlfTUVOVV9WQUxJREFURV9YTUwgICAgICAgICAgICAgICA9ICZWYWxpZGF0ZSBYTUwgU2NoZW1hCi1fVUlfTUVOVV9WQUxJREFURV9YTUxfVE9PTFRJUCAgICAgICA9IFZhbGlkYXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBYTUwgU2NoZW1hCi1fVUlfTUVOVV9HRU5FUkFURV9KQVZBX1RPT0xUSVAgICAgICA9IEdlbmVyYXRlIEphdmEgYmVhbnMgZm9yIHRoZSBYTUwgU2NoZW1hCi1fVUlfTUVOVV9HRU5FUkFURV9EVERfVE9PTFRJUCAgICAgICA9IEdlbmVyYXRlIGEgRFREIGZyb20gdGhlIFhNTCBTY2hlbWEKLV9VSV9NRU5VX0dFTkVSQVRFX1NBTVBMRV9YTUxfVE9PTFRJUCA9IEdlbmVyYXRlIGFuIFhNTCBmcm9tIHRoZSBYTUwgU2NoZW1hCi1fVUlfTUVOVV9SRUxPQURfREVQRU5ERU5DSUVTX1RPT0xUSVAgPSBSZWxvYWQgRGVwZW5kZW5jaWVzCi1fVUlfTUVOVV9SRUxPQURfREVQRU5ERU5DSUVTID0gJlJlbG9hZCBEZXBlbmRlbmNpZXMKLQotIQotISBQcmVmZXJlbmNlIFBhZ2UKLSEKLV9VSV9URVhUX0lOREVOVF9MQUJFTCAgICAgICAgICAgICAgICAgPSBJbmRlbnRhdGlvbgotX1VJX1RFWFRfSU5ERU5UX1NQQUNFU19MQUJFTCAgICAgICAgICA9ICZOdW1iZXIgb2Ygc3BhY2VzOiAKLV9VSV9URVhUX1hTRF9OQU1FU1BBQ0VfUFJFRklYICAgICAgICAgPSBYTUwgc2NoZW1hIGxhbmd1YWdlCi1fVUlfVEVYVF9YU0RfREVGQVVMVF9QUkVGSVggICAgICAgICAgID0gWE1MIHNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzICZwcmVmaXg6Ci1fVUlfUVVBTElGWV9YU0QgICAgICAgICAgICAgICAgICAgICAgID0gJlF1YWxpZnkgWE1MIHNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzCi1fVUlfU0VQQVJBVEVfREVTSUdOX0FORF9TT1VSQ0VfVklFVyAgID0gU2VwYXJhdGUgU291cmNlLCBEZXNpZ24gYW5kIEdyYXBoIHZpZXcKLV9VSV9DT01CSU5FRF9ERVNJR05fQU5EX1NPVVJDRV9WSUVXICAgPSBDb21iaW5lZCBTb3VyY2Ugb3IgR3JhcGggdmlldyB3aXRoIERlc2lnbiB2aWV3IAotX1VJX0xBQkVMX0VESVRPUl9MQVlPVVQgICAgICAgICAgICAgICA9IEVkaXRvciBMYXlvdXQKLV9VSV9QUkVGX0RFU0lHTl9WSUVXX0xBWU9VVCAgICAgICAgICAgPSBEZXNpZ24gVmlldyBMb2NhdGlvbgotX1VJX1BSRUZfREVTSUdOX0JPVFRPTSAgICAgICAgICAgICAgICA9IEJlbG93Ci1fVUlfUFJFRl9ERVNJR05fUklHSFQgICAgICAgICAgICAgICAgID0gUmlnaHQKLV9VSV9URVhUX1hTRF9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UgPSBEZWZhdWx0IFRhcmdldCBOYW1lc3BhY2U6Ci0KLSEKLSEgQ29udGVudCBPdXRsaW5lIFZpZXcgYWN0aW9uCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogRG8gbm90IHRyYW5zbGF0ZSB0aGUgd29yZChzKSBmb2xsb3dpbmcgIkFkZCIgb24gZWFjaCBsaW5lIGluCi0hICAgdGhpcyBzZWN0aW9uIGkuZS4gQW5ub3RhdGlvbiwgRG9jdW1lbnRhdGlvbiwgQXBwSW5mbyAgVGhlc2Ugd29yZHMgYXJlIFhNTCBTY2hlbWEga2V5d29yZHMuCi1fVUlfQUNUSU9OX0RFTEVURSAgICAgICAgICAgICAgICAgID0gRCZlbGV0ZQotX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiAgICAgICAgICA9IEFkZCAmQW5ub3RhdGlvbgotX1VJX0FDVElPTl9BRERfRE9DICAgICAgICAgICAgICAgICA9IEFkZCAmRG9jdW1lbnRhdGlvbgotX1VJX0FDVElPTl9BRERfQVBQX0lORk8gICAgICAgICAgICA9IEFkZCBBJnBwSW5mbwotX1VJX0FDVElPTl9BRERfR0xPQkFMX0VMRU1FTlQgICAgICA9IEFkZCBHbG9iJmFsIEVsZW1lbnQKLV9VSV9BQ1RJT05fQUREX0tFWSAgICAgICAgICAgICAgICAgPSBBZGQgJktleQotX1VJX0FDVElPTl9BRERfS0VZX1JFRiAgICAgICAgICAgICA9IEFkZCBLZXkgUmUmZgotX1VJX0FDVElPTl9BRERfVU5JUVVFICAgICAgICAgICAgICA9IEFkZCBVbmkmcXVlCi1fVUlfQUNUSU9OX0FERF9HUk9VUCAgICAgICAgICAgICAgID0gQWRkIEcmcm91cAotX1VJX0FERF9HUk9VUF9SRUYgICAgICAgICAgICAgICAgICA9IEFkZCBHciZvdXAgUmVmCi1fVUlfQUNUSU9OX0FERF9DT05URU5UX01PREVMICAgICAgID0gQWRkIENvbnRlbnQgJk1vZGVsCi1fVUlfQUNUSU9OX0FERF9FTEVNRU5UICAgICAgICAgICAgID0gQWRkICZFbGVtZW50Ci1fVUlfQUNUSU9OX0FERF9FTEVNRU5UX1JFRiAgICAgICAgID0gQWRkIEUmbGVtZW50IFJlZgotX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEUgICAgICAgICA9IEFkZCAmU2ltcGxlIFR5cGUKLV9VSV9BQ1RJT05fQUREX1BBVFRFUk4gICAgICAgICAgICAgPSBBZGQgJlBhdHRlcm4KLV9VSV9BQ1RJT05fQUREX0VOVU0gICAgICAgICAgICAgICAgPSBBZGQgRW4mdW1lcmF0aW9uCi1fVUlfQUNUSU9OX0FERF9FTlVNUyAgICAgICAgICAgICAgID0gQWRkIEVudSZtZXJhdGlvbnMuLi4KLV9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRSAgICAgICAgPSBBZGQgQ29tcGxleCAmVHlwZQotX1VJX0FDVElPTl9BRERfQ09NUExFWF9DT05URU5UICAgICA9IEFkZCBDb21wbGUmeCBDb250ZW50Ci1fVUlfQUNUSU9OX0FERF9TSU1QTEVfQ09OVEVOVCAgICAgID0gQWRkIFNpbXBsZSAmQ29udGVudAotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFICAgICAgICAgICA9IEFkZCBBdHRyaSZidXRlCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVAgICAgID0gQWRkIEF0dHImaWJ1dGUgR3JvdXAKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9SRUYgPSBBZGQgQSZ0dHJpYnV0ZSBHcm91cCBSZWYKLV9VSV9BQ1RJT05fQUREX0lOQ0xVREUgICAgICAgICAgICAgPSBBZGQgSW4mY2x1ZGUKLV9VSV9BQ1RJT05fQUREX0lNUE9SVCAgICAgICAgICAgICAgPSBBZGQgJkltcG9ydAotX1VJX0FDVElPTl9BRERfUkVERUZJTkUgICAgICAgICAgICA9IEFkZCBSZSZkZWZpbmUKLV9VSV9BQ1RJT05fQUREX05PVEFUSU9OICAgICAgICAgICAgPSBBZGQgJk5vdGF0aW9uCi1fVUlfQUNUSU9OX0FERF9BTllfRUxFTUVOVCAgICAgICAgID0gQWRkIEFuJnkKLV9VSV9BQ1RJT05fQUREX0FOWV9BVFRSSUJVVEUgICAgICAgPSBBZGQgJkFueSBBdHRyaWJ1dGUKLV9VSV9BQ1RJT05fQUREX0dMT0JBTF9BVFRSSUJVVEUgICAgPSBBZGQgJkdsb2JhbCBBdHRyaWJ1dGUKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9SRUZFUkVOQ0UgPSBBZGQgQXR0cmliJnV0ZSBSZWYKLV9VSV9BQ1RJT05fQUREX1JFU1RSSUNUSU9OICAgICAgICAgPSBBZGQgUmUmc3RyaWN0aW9uCi1fVUlfQUNUSU9OX0FERF9VTklPTiAgICAgICAgICAgICAgID0gQWRkIFUmbmlvbgotX1VJX0FDVElPTl9BRERfTElTVCAgICAgICAgICAgICAgICA9IEFkZCAmTGlzdAotX1VJX0FDVElPTl9ERUxFVEVfR1JPVVBfU0NPUEUgICAgICA9IEQmZWxldGUKLV9VSV9BQ1RJT05fQUREX0NIT0lDRSAgICAgICAgICAgICAgPSBBZGQgJkNob2ljZQotX1VJX0FDVElPTl9BRERfU0VRVUVOQ0UgICAgICAgICAgICA9IEFkZCBTZSZxdWVuY2UKLV9VSV9BQ1RJT05fQUREX0FMTCAgICAgICAgICAgICAgICAgPSBBZGQgJkFsbAotX1VJX0FDVElPTl9BRERfRVhURU5TSU9OICAgICAgICAgICA9IEFkZCBFJnh0ZW5zaW9uCi1fVUlfQUNUSU9OX0FERF9TRUxFQ1RPUiAgICAgICAgICAgID0gQWRkICZTZWxlY3RvcgotX1VJX0FDVElPTl9BRERfRklFTEQgICAgICAgICAgICAgICA9IEFkZCAmRmllbGQKLSEgTk9URSBUTyBUUkFOU0xBVE9SOiBUcmFuc2xhdGUgQWRkIGFuZCBOb2RlCi1fVUlfQUNUSU9OX0FERF9TQ0hFTUFfTk9ERSAgICAgICAgID0gQWRkICZTY2hlbWEgTm9kZQotISBOT1RFIFRPIFRSQU5TTEFUT1I6IFRSQU5TTEFURSBBZGQgYW5kIExvY2FsCi1fVUlfQUNUSU9OX0FERF9MT0NBTF9TSU1QTEVfVFlQRSAgID0gQWRkIExvY2FsICZTaW1wbGUgVHlwZQotX1VJX0FDVElPTl9BRERfTE9DQUxfQ09NUExFWF9UWVBFICA9IEFkZCBMb2NhbCAmQ29tcGxleCBUeXBlCi1fVUlfQUNUSU9OX0JBQ0tfVE9fU0NIRU1BX1ZJRVcgICAgID0gQmFjayBUbyBTY2hlbWEKLV9VSV9IT1ZFUl9CQUNLX1RPX1NDSEVNQV9WSUVXICAgICA9IEJhY2sgdG8gc2NoZW1hCi0KLV9VSV9BQ1RJT05fTUFLRV9BTk9OWU1PVVNfVFlQRV9HTE9CQUwgPSBNYWtlIEFub255bW91cyBUeXBlIEdsb2JhbAotX1VJX0FDVElPTl9PUEVOX1NDSEVNQSAgICAgICAgICAgICAgICA9IE9wZW4gU2NoZW1hCi0KLV9VSV9BQ1RJT05fSU5TRVJUX0JFRk9SRSAgICAgICAgICAgPSBJbnNlcnQgQmVmb3JlCi1fVUlfQUNUSU9OX0lOU0VSVF9BRlRFUiAgICAgICAgICAgID0gSW5zZXJ0IEFmdGVyCi0KLV9VSV9PVVRMSU5FX1NPUlQgICAgICAgICAgICAgICAgICAgPSBTb3J0IGFscGhhYmV0aWNhbGx5Ci1fVUlfT1VUTElORV9ET19OT1RfU09SVCAgICAgICAgICAgID0gRG8gbm90IHNvcnQgYWxwaGFiZXRpY2FsbHkKLQotX1VJX09VVExJTkVfU0hPV19DT01QTEVYX1RZUEUgICAgICA9IFNob3cgQ29tcGxleCBUeXBlcyBPbmx5Ci1fVUlfT1VUTElORV9TSE9XX1NJTVBMRV9UWVBFICAgICAgID0gU2hvdyBTaW1wbGUgVHlwZXMgT25seQotX1VJX09VVExJTkVfU0hPV19BVFRSSUJVVEVfR1JPVVAgICA9IFNob3cgQXR0cmlidXRlIEdyb3VwcyBPbmx5Ci1fVUlfT1VUTElORV9TSE9XX0dST1VQICAgICAgICAgICAgID0gU2hvdyBHcm91cHMgT25seQotX1VJX09VVExJTkVfU0hPV19HTE9CQUxfRUxFTUVOVCAgICA9IFNob3cgR2xvYmFsIEVsZW1lbnRzIE9ubHkKLV9VSV9PVVRMSU5FX1NIT1dfUkVGRVJFTkNFUyAgICAgICAgPSBTaG93IFJlZmVyZW5jZSBDb250ZW50Ci1fVUlfT1VUTElORV9TSE9XX0lOSEVSSVRFRCAgICAgICAgID0gU2hvdyBJbmhlcml0ZWQgQ29udGVudAotCi1fVUlfQUNUSU9OX1NFVF9NVUxUSVBMSUNJVFkJCSAgID0gU2V0IE11bHRpcGxpY2l0eQotCi0hCi0hIE5ldyBYTUwgU2NoZW1hIFdpemFyZAotIQotX1VJX1dJWkFSRF9DUkVBVEVfWFNEX01PREVMX1RJVExFICAgID0gQ3JlYXRlIFhNTCBTY2hlbWEKLQotISBOT1RFIFRPIFRSQU5TTEFUT1I6IERvIG5vdCB0cmFuc2xhdGUgZm9sbG93aW5nIGxpbmUKLV9VSV9DUkVBVEVYU0QgICAgICAgICAgICAgICAgICAgICAgICA9IGNyZWF0ZVhTRAotX1VJX05FV19YTUxfU0NIRU1BX1RJVExFICAgICAgICAgICAgID0gTmV3IFhNTCBTY2hlbWEKLV9VSV9DUkVBVEVfQV9ORVdfWE1MX1NDSEVNQV9ERVNDICAgICA9IENyZWF0ZSBhIG5ldyBYTUwgc2NoZW1hLgotCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogRG8gbm90IHRyYW5zbGF0ZSBmb2xsb3dpbmcgbGluZQotX1VJX05FV19YTUxfU0NIRU1BX0ZJTEVOQU1FICAgICAgICAgID0gTmV3WE1MU2NoZW1hLnhzZAotCi0hCi0hIFhTRCBGcm9tIFJEQiBTY2hlbWEgV2l6YXJkCi0hCi1fVUlfV0laQVJEX0NSRUFURV9YU0RfRlJPTV9SREJfVElUTEUgPSBDcmVhdGUgWFNEIGZyb20gUkRCIFRhYmxlCi0KLQotIQotISBSZWd1bGFyIEV4cHJlc3Npb24gV2l6YXJkCi0hCi1fVUlfUkVHRVhfV0laQVJEX0NSRUFURV9CVVRUT04gPSBDcmVhdGUgUmVndWxhciBFeHByZXNzaW9uLi4uCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQlVUVE9OID0gTGF1bmNoIHRoZSBSZWd1bGFyIEV4cHJlc3Npb24gV2l6YXJkCi1fVUlfUkVHRVhfV0laQVJEX1RJVExFID0gUmVndWxhciBFeHByZXNzaW9uIFdpemFyZAotX1VJX1JFR0VYX1dJWkFSRF9DT01QT1NJVElPTl9QQUdFX1RJVExFID0gQ29tcG9zZSBSZWd1bGFyIEV4cHJlc3Npb24KLV9VSV9SRUdFWF9XSVpBUkRfQ09NUE9TSVRJT05fUEFHRV9ERVNDUklQVElPTiA9IFRvIGFkZCBhIHRva2VuLCBzcGVjaWZ5IGl0cyBjb250ZW50cyBhbmQgb2NjdXJyZW5jZSwgdGhlbiBjbGljayBBZGQuCi1fVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfUkVHRVhfRVJST1JfUFJFRklYID0gVGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uIGlzIG5vdCB2YWxpZC4gIFJlYXNvbjogIAotX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1RPS0VOX0VSUk9SX1BSRUZJWCA9IFRoZSBjdXJyZW50IHRva2VuIGlzIG5vdCB2YWxpZC4gIFJlYXNvbjogIAotX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1JFR0VYX0VSUk9SID0gVGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uIGlzIG5vdCB2YWxpZC4KLV9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9UT0tFTl9FUlJPUiA9IFRoZSBjdXJyZW50IHRva2VuIGlzIG5vdCB2YWxpZC4KLV9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9NSU5fRVJST1JfU1VGRklYID0gSW52YWxpZCBtaW5pbXVtIHJhbmdlIHZhbHVlLiAgVGhlIHZhbHVlIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGxlc3MgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZS4KLV9VSV9SRUdFWF9XSVpBUkRfTUlTU0lOR19NSU5fRVJST1JfU1VGRklYID0gSW52YWxpZCBtaW5pbXVtIHJhbmdlIHZhbHVlLiAgQSBtaW5pbXVtIHJhbmdlIG11c3QgYmUgc3BlY2lmaWVkIGlmIGEgbWF4aW11bSByYW5nZSBpcyBzcGVjaWZpZWQuCi1fVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfTUFYX0VSUk9SX1NVRkZJWCA9IEludmFsaWQgbWF4aW11bSByYW5nZSB2YWx1ZS4gIFRoZSB2YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0gdmFsdWUuCi1fVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfUkVQRUFUX0VSUk9SX1NVRkZJWCA9IEludmFsaWQgcmVwZWF0IHZhbHVlLiAgVGhlIHZhbHVlIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLgotX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1NFTEVDVElPTl9FUlJPUiA9IE5vdGhpbmcgaXMgY3VycmVudGx5IHNlbGVjdGVkLiAgRWl0aGVyIG1ha2UgYSBzZWxlY3Rpb24gb3IgY2hvb3NlIGEgZGlmZmVyZW50IHRva2VuLiAKLV9VSV9SRUdFWF9XSVpBUkRfVE9LRU5fTEFCRUwgPSAmVG9rZW4gY29udGVudHM6Ci1fVUlfUkVHRVhfV0laQVJEX0FVVE9fRVNDQVBFX0NIRUNLQk9YX0xBQkVMID0gQXV0byAmZXNjYXBlCi1fVUlfUkVHRVhfV0laQVJEX09DQ1VSRU5DRV9MQUJFTCA9IE9jY3VycmVuY2UKLSEgSW5zdHJ1Y3Rpb25zIGZvciB0cmFuc2xhdG9yczogVGhlIGZvbGxvd2luZyBsYWJlbCBpcyB1c2VkIGluIGEgcGhyYXNlIHRvIGlkZW50aWZ5IGEgcmFuZ2Ugb2YgdmFsdWVzLgotISBGb3IgZXhhbXBsZTogIDUgdG8gMTAuCi0hIFRoZSB2YWx1ZXMgYXJlIHRleHQgZmllbGRzIHRoYXQgYXJlIGluaXRpYWxseSBibGFuayBzbyB0aGUgdXNlciBoYXMgdG8gZW50ZXIgaW4gdmFsdWVzCi0hIEZvciBleGFtcGxlOiAgIF9fX19fX18gdG8gX19fX19fX18KLV9VSV9SRUdFWF9XSVpBUkRfVE9fTEFCRUwgPSB0bwotX1VJX1JFR0VYX1dJWkFSRF9BRERfQlVUVE9OX0xBQkVMID0gJkFkZCAKLV9VSV9SRUdFWF9XSVpBUkRfQ1VSUkVOVF9SRUdFWF9MQUJFTCA9ICZDdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbjoKLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9URVJNUyA9IENvbnRlbnQgb2YgbmV3IHRva2VuCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQVVUT19FU0NBUEVfQ0hFQ0tCT1ggPSBJbnNlcnQgZXNjYXBlIGNoYXJhY3RlcnMgdG8gbWF0Y2ggbWV0YWNoYXJhY3RlciBsaXRlcmFscyAoZS5nLiBjb252ZXJ0cyBcIipcIiB0byBcIlxcKlwiKQotX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX0FERF9CVVRUT04gPSBBZGQgdGhpcyB0b2tlbiB0byB0aGUgcmVndWxhciBleHByZXNzaW9uCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQ1VSUkVOVF9SRUdFWCA9IFRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbgotX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX1JFUEVBVCA9IFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgdG9rZW4gbXVzdCBvY2N1ci4KLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9NSU4gPSBUaGUgbWluaW11bSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgdG9rZW4gY2FuIG9jY3VyLgotX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX01BWCA9IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSB0b2tlbiBjYW4gb2NjdXIuCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQ0FSRVRfTEFCRUwgPSBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIG5ldyB0b2tlbiB3aWxsIGJlIGluc2VydGVkLgotX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfVElUTEUgPSBUZXN0IFJlZ3VsYXIgRXhwcmVzc2lvbgotX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfREVTQ1JJUFRJT04gPSBUbyB0ZXN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIGVudGVyIHNhbXBsZSB0ZXh0IHRoYXQgeW91IHdpc2ggdG8gbWF0Y2guICBUaGUgc3VjY2VzcyBvZiB0aGUgbWF0Y2ggd2lsbCBiZSBpbmRpY2F0ZWQgYWJvdmUuCi1fVUlfUkVHRVhfV0laQVJEX1JFR0VYX0xBQkVMID0gUmVndWxhciBleHByZXNzaW9uOiAKLV9VSV9SRUdFWF9XSVpBUkRfU0FNUExFX1RFWFQgPSAgU2FtcGxlIHRleHQ6IAotX1VJX1JFR0VYX1dJWkFSRF9NQVRDSEVTID0gVGhlIHRleHQgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uLgotX1VJX1JFR0VYX1dJWkFSRF9ET0VTX05PVF9NQVRDSCA9IFRoZSB0ZXh0IGRvZXMgbm90IG1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCi1fVUlfUkVHRVhfV0laQVJEX1RFUk1fQU5ZX0NIQVIgPSBBbnkgY2hhcmFjdGVyCi1fVUlfUkVHRVhfV0laQVJEX1RFUk1fQUxQSEFOVU1FUklDX0NIQVIgPSBBbHBoYW51bWVyaWMgY2hhcmFjdGVyCi1fVUlfUkVHRVhfV0laQVJEX1RFUk1fV0hJVEVTUEFDRSA9IFdoaXRlc3BhY2UKLV9VSV9SRUdFWF9XSVpBUkRfVEVSTV9ESUdJVCA9IERpZ2l0Ci1fVUlfUkVHRVhfV0laQVJEX1RFUk1fVVBQRVIgPSBVcHBlciBjYXNlCi1fVUlfUkVHRVhfV0laQVJEX1RFUk1fTE9XRVIgPSBMb3dlciBjYXNlCi1fVUlfUkVHRVhfV0laQVJEX1RFUk1fU0VMRUNUSU9OID0gQ3VycmVudCBzZWxlY3Rpb24KLV9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9TSU5HTEUgPSAmSnVzdCBvbmNlCi1fVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfU1RBUiA9ICZaZXJvIG9yIG1vcmUKLV9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9QTFVTID0gJk9uZSBvciBtb3JlCi1fVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfT1BUSU9OQUwgPSBPJnB0aW9uYWwKLV9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9SRVBFQVQgPSAmUmVwZWF0Ci1fVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfUkFOR0UgPSBSYW4mZ2UKLQotIQotISBTZWxlY3QgSW5jbHVkZSBGaWxlIFdpemFyZAotX1VJX0xBQkVMX0lOQ0xVREVfVVJMX0ZJTEUgICAgPSBTZWxlY3Qgc2NoZW1hIGZyb206Ci1fVUlfUkFESU9fVVJMICAgICAgICAgICAgICAgICA9ICZIVFRQCi1fVUlfUkFESU9fRklMRSAgICAgICAgICAgICAgICA9ICZXb3JrYmVuY2ggcHJvamVjdHMKLV9VSV9XSVpBUkRfSU5DTFVERV9GSUxFX1RJVExFID0gU2VsZWN0IGEgc2NoZW1hCi1fVUlfV0laQVJEX0lOQ0xVREVfRklMRV9ERVNDICA9IFNlbGVjdCBhbm90aGVyIHNjaGVtYSBmcm9tIHdvcmtiZW5jaCBwcm9qZWN0cyBvciBmcm9tIEhUVFAuCi1fVUlfTEFCRUxfVVJMICAgICAgICAgICAgICAgICA9IFVSTDoKLV9VSV9VUkxfU1RBUlRfV0lUSCAgICAgICAgICAgID0gVGhlIFVSTCBtdXN0IHN0YXJ0IHdpdGggaHR0cDovLwotX1VJX1NQRUNJRllfVVJMICAgICAgICAgICAgICAgPSBQbGVhc2Ugc3BlY2lmeSBhIFVSTAotCi0hCi0hIEVudW1lcmF0aW9ucyBEaWFsb2cKLV9VSV9FTlVNRVJBVElPTlNfRElBTE9HX1RJVExFID0gQWRkIEVudW1lcmF0aW9ucwotX1VJX0xBQkVMX0RFTElNSVRFUl9DSEFSICAgICAgPSAmRGVsaW1pdGVyIGNoYXJhY3RlcnM6Ci1fVUlfTEFCRUxfUFJFU0VSVkVfV0hJVEVTUEFDRSA9ICZQcmVzZXJ2ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCi0KLV9VSV9BQ1RJT05fREVMRVRFX0VOVU1FUkFUSU9OID0gRGVsZXRlIEVudW1lcmF0aW9uCi0KLSEKLSEgVmFsaWRhdGUgU2NoZW1hIAotIQotX1VJX0RJQUxPR19YTUxfU0NIRU1BX0lOVkFMSURfVElUTEUgICAgICAgPSBWYWxpZGF0aW9uIEZhaWxlZAotX1VJX0RJQUxPR19YTUxfU0NIRU1BX1ZBTElEX1RJVExFICAgICAgICAgPSBWYWxpZGF0aW9uIFN1Y2NlZWRlZAotX1VJX0RJQUxPR19YTUxfU0NIRU1BX1ZBTElEX1RFWFQgICAgICAgICAgPSBUaGUgWE1MIHNjaGVtYSBmaWxlIGlzIHZhbGlkLgotX1VJX0RJQUxPR19YTUxfU0NIRU1BX1ZBTElEX1dJVEhfV0FSTklOR1MgPSBUaGUgWE1MIHNjaGVtYSBmaWxlIGlzIHZhbGlkIGhvd2V2ZXIgd2FybmluZ3MgaGF2ZSBiZWVuIGlzc3VlZC4gU2VlIHRoZSBQcm9ibGVtcyB2aWV3IGZvciB0aGUgd2FybmluZyBtZXNzYWdlcy4KLV9VSV9ESUFMT0dfWE1MX1NDSEVNQV9JTlZBTElEX1RFWFQgICAgICAgID0gVGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBub3QgdmFsaWQuIFNlZSB0aGUgUHJvYmxlbXMgdmlldyBmb3IgdGhlIGVycm9yIG1lc3NhZ2VzLgotCi0hCi0hIENvbWJvLWJveCBjaG9pY2VzIAotIQotISBOT1RFIFRPIFRSQU5TTEFUT1I6IERvIG5vdCB0cmFuc2xhdGUgZm9sbG93aW5nIDEwIGxpbmVzCi1fVUlfQ09NQk9fUVVBTElGSUVEICAgICAgICAgICAgID0gcXVhbGlmaWVkCi1fVUlfQ09NQk9fVU5RVUFMSUZJRUQgICAgICAgICAgID0gdW5xdWFsaWZpZWQKLV9VSV9DT01CT19FWFRFTlNJT04gICAgICAgICAgICAgPSBleHRlbnNpb24KLV9VSV9DT01CT19SRVNUUklDVElPTiAgICAgICAgICAgPSByZXN0cmljdGlvbgotX1VJX0NPTUJPX0FMTCAgICAgICAgICAgICAgICAgICA9IGFsbAotX1VJX0NPTUJPX1RSVUUgICAgICAgICAgICAgICAgICA9IHRydWUKLV9VSV9DT01CT19GQUxTRSAgICAgICAgICAgICAgICAgPSBmYWxzZQotX1VJX0NPTUJPX0xBWCAgICAgICAgICAgICAgICAgICA9IGxheAotX1VJX0NPTUJPX1NLSVAgICAgICAgICAgICAgICAgICA9IHNraXAKLV9VSV9DT01CT19TVFJJQ1QgICAgICAgICAgICAgICAgPSBzdHJpY3QKLQotISBHZW5lcmF0ZSBEVEQgLSBwYXNzIGFzIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBmb3Igd2l6YXJkIHBhZ2UKLV9VSV9HRU5FUkFURV9EVERfVElUTEUgICAgICAgICAgPSBHZW5lcmF0ZSBEVEQKLV9VSV9HRU5FUkFURV9EVERfREVTQ1JJUFRJT04gICAgPSBHZW5lcmF0ZSBhIERURCBmcm9tIHRoZSBzZWxlY3RlZCBYTUwgc2NoZW1hIGZpbGUuCi0KLSEgR2VuZXJhdGUgRERMIC0gcGFzcyBhcyB0aXRsZSBhbmQgZGVzY3JpcHRpb24gZm9yIHdpemFyZCBwYWdlCi1fVUlfR0VORVJBVEVfRERMX1RJVExFICAgICAgICAgID0gR2VuZXJhdGUgRERMCi1fVUlfR0VORVJBVEVfRERMX0RFU0NSSVBUSU9OICAgID0gR2VuZXJhdGUgRERMIGZyb20gdGhlIHNlbGVjdGVkIFhNTCBzY2hlbWEgZmlsZS4KLQotX1VJX1hNTF9TQ0hFTUFfVkFMSURBVE9SICAgICAgICAgICAgPSBYTUwgU2NoZW1hIFZhbGlkYXRvcgotCi0hIEdlbmVyYXRpb24gZnJvbSB0aGUgU2NoZW1hIG1vZGVsIC0gcHJlLWNvbmRpdGlvbiBjaGVjawotX1VJX0RJQUxPR19USVRMRV9HUkFNTUFSX0VSUk9SICAgICAgPSBJbnZhbGlkIEdyYW1tYXIKLV9VSV9ESUFMT0dfSU5GT19TQ0hFTUFfSU5WQUxJRCAgICAgID0gVGhlIHNjaGVtYSBmaWxlIGNvbnRhaW5zIGVycm9ycy4gT3BlbiBpdCBpbiB0aGUgWE1MIFNjaGVtYSBlZGl0b3IgYW5kIHZhbGlkYXRlIGl0IGZvciBkZXRhaWxzLgotX1VJX0RJQUxPR19USVRMRV9OT19HTE9CQUxfRUxFTUVOVFMgPSBObyBHbG9iYWwgRWxlbWVudHMKLV9VSV9ESUFMT0dfSU5GT19OT19HTE9CQUxfRUxFTUVOVFMgID0gVGhlIHNlbGVjdGVkIHNjaGVtYSBoYXMgbm8gZ2xvYmFsIGVsZW1lbnRzLiBHbG9iYWwgZWxlbWVudHMgYXJlIHJlcXVpcmVkIHRvIGdlbmVyYXRlIGFueXRoaW5nIGZyb20gYW4gWE1MIHNjaGVtYS4KLQotISBTZWN0aW9uIHRpdGxlIGZvciBvdGhlciBhdHRyaWJ1dGVzCi1fVUlfU0VDVElPTl9BRFZBTkNFRF9BVFRSSUJVVEVTICAgPSBBZHZhbmNlZAotCi0hIEZvciB1bmRvIGFjdGlvbiBtZW51cwotISBOb3RlIHRvIFRyYW5zbGF0b3JzOiBGb3IgdGhlIGZvbGxvd2luZyAiQ2hhbmdlIiBwaHJhc2VzLAotISBtYXhPY2N1cnMsIG1pbk9jY3VycywgbGFuZywgeHBhdGggYXJlIGtleXdvcmRzIHNvIHBsZWFzZQotISBkbyBubyB0cmFuc2xhdGUgdGhlbS4gIFRoZXNlIGFyZSBmb3IgdGhlIHVuZG8gYWN0aW9uIG1lbnVzLgotISBGb3IgZXhhbXBsZSwgaWYgdGhlIHVzZXIgbWFrZXMgYSBjaGFuZ2UgaW4gdGhlIG5hbWUgb2YgYW4KLSEgZWxlbWVudCwgdGhlbiB0aGUgdW5kbyBhY3Rpb24gd291bGQgYmUgVW5kbyBFbGVtZW50IE5hbWUgQ2hhbmdlCi1fVUlfTkFNRVNQQUNFX0NIQU5HRSAgICAgICAgICAgPSBOYW1lc3BhY2UgQ2hhbmdlCi1fVUlfUFJPQ0VTU0NPTlRFTlRTX0NIQU5HRSAgICAgPSBQcm9jZXNzIENvbnRlbnRzIENoYW5nZQotX1VJX01BWE9DQ1VSU19DSEFOR0UgICAgICAgICAgID0gbWF4T2NjdXJzIENoYW5nZQotX1VJX01JTk9DQ1VSU19DSEFOR0UgICAgICAgICAgID0gbWluT2NjdXJzIENoYW5nZQotX1VJX1NPVVJDRV9BVFRSSUJVVEVfQ0hBTkdFICAgID0gU291cmNlIENoYW5nZQotX1VJX0NPTU1FTlRfQ0hBTkdFICAgICAgICAgICAgID0gQ29tbWVudCBDaGFuZ2UKLV9VSV9QUkVGSVhfQ0hBTkdFICAgICAgICAgICAgICA9IFByZWZpeCBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVHUk9VUF9SRUZfQ0hBTkdFICA9IEF0dHJpYnV0ZSBHcm91cCBSZWZlcmVuY2UgQ2hhbmdlCi1fVUlfQVRUUklCVVRFR1JPVVBfTkFNRV9DSEFOR0UgPSBBdHRyaWJ1dGUgR3JvdXAgTmFtZSBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVfRklYRURfQ0hBTkdFICAgICA9IEF0dHJpYnV0ZSBGaXhlZCBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVfREVGQVVMVF9DSEFOR0UgICA9IEF0dHJpYnV0ZSBEZWZhdWx0IENoYW5nZQotX1VJX0FUVFJJQlVURV9OQU1FX0NIQU5HRSAgICAgID0gQXR0cmlidXRlIE5hbWUgQ2hhbmdlCi1fVUlfQVRUUklCVVRFX1ZBTFVFX0NIQU5HRSAgICAgPSBBdHRyaWJ1dGUgVmFsdWUgQ2hhbmdlCi1fVUlfQVRUUklCVVRFX1VTRV9DSEFOR0UgICAgICAgPSBBdHRyaWJ1dGUgVXNlIENoYW5nZQotX1VJX0FUVFJJQlVURV9GT1JNX0NIQU5HRSAgICAgID0gQXR0cmlidXRlIEZvcm0gQ2hhbmdlCi1fVUlfQ09NUExFWFRZUEVfTkFNRV9DSEFOR0UgICAgPSBDb21wbGV4IFR5cGUgTmFtZSBDaGFuZ2UKLV9VSV9DT01QTEVYVFlQRV9BQlNUUkFDVF9DSEFOR0UgPSBDb21wbGV4IFR5cGUgQWJzdHJhY3QgQ2hhbmdlCi1fVUlfQ09NUExFWFRZUEVfTUlYRURfQ0hBTkdFICAgPSBDb21wbGV4IFR5cGUgTWl4ZWQgQ2hhbmdlCi1fVUlfQ09NUExFWFRZUEVfQkxPQ0tfQ0hBTkdFICAgPSBDb21wbGV4IFR5cGUgQmxvY2sgQ2hhbmdlCi1fVUlfQ09NUExFWFRZUEVfRklOQUxfQ0hBTkdFICAgPSBDb21wbGV4IFR5cGUgRmluYWwgQ2hhbmdlCi1fVUlfRE9DVU1FTlRBVElPTl9TT1VSQ0VfQ0hBTkdFID0gRG9jdW1lbnRhdGlvbiBTb3VyY2UgQ2hhbmdlCi1fVUlfRE9DVU1FTlRBVElPTl9MQU5HX0NIQU5HRSAgID0gRG9jdW1lbnRhdGlvbiBsYW5nIENoYW5nZQotX1VJX0RPQ1VNRU5UQVRJT05fQ09NTUVOVF9DSEFOR0UgPSBEb2N1bWVudGF0aW9uIENvbW1lbnQgQ2hhbmdlCi1fVUlfRUxFTUVOVF9OQU1FX0NIQU5HRSAgICAgICAgICA9IEVsZW1lbnQgTmFtZSBDaGFuZ2UKLV9VSV9FTEVNRU5UX1ZBTFVFX0NIQU5HRSAgICAgICAgID0gRWxlbWVudCBWYWx1ZSBDaGFuZ2UKLV9VSV9FTEVNRU5UX1RZUEVfQ0hBTkdFICAgICAgICAgID0gRWxlbWVudCBUeXBlIENoYW5nZQotX1VJX0VOVU1fVkFMVUVfQ0hBTkdFICAgICAgICAgICAgPSBFbnVtIFZhbHVlIENoYW5nZQotX1VJX0ZJRUxEX1hQQVRIX0NIQU5HRSAgICAgICAgICAgPSBGaWVsZCB4cGF0aCBDaGFuZ2UKLV9VSV9HUk9VUF9SRUZfQ0hBTkdFICAgICAgICAgICAgID0gR3JvdXAgUmVmZXJlbmNlIENoYW5nZQotX1VJX0dST1VQX1NDT1BFX0NIQU5HRSAgICAgICAgICAgPSBDb250ZW50IE1vZGVsIENoYW5nZQotX1VJX0dST1VQX05BTUVfQ0hBTkdFICAgICAgICAgICAgPSBHcm91cCBOYW1lIENoYW5nZQotX1VJX0lNUE9SVF9DSEFOR0UgICAgICAgICAgICAgICAgPSBJbXBvcnQgQ2hhbmdlCi1fVUlfS0VZX05BTUVfQ0hBTkdFICAgICAgICAgICAgICA9IEtleSBOYW1lIENoYW5nZQotX1VJX0tFWVJFRl9OQU1FX0NIQU5HRSAgICAgICAgICAgPSBLZXkgUmVmZXJlbmNlIE5hbWUgQ2hhbmdlCi0hIE5vdGUgdG8gdHJhbnNsYXRvcnMKLSEgRm9yIHRoZSBmb2xsb3dpbmcgaXRlbSwgUmVmZXIgaXMgdGhlIGtleXJlZiBhdHRyaWJ1dGUgdG8gcmVmZXIgdG8gc29tZSBvdGhlciBrZXkKLV9VSV9LRVlSRUZfUkVGRVJfQ0hBTkdFICAgICAgICAgID0gS2V5IFJlZmVyZW5jZSBSZWZlciBDaGFuZ2UKLV9VSV9OT1RBVElPTl9OQU1FX0NIQU5HRSAgICAgICAgID0gTm90YXRpb24gTmFtZSBDaGFuZ2UKLV9VSV9OT1RBVElPTl9QVUJMSUNfQ0hBTkdFICAgICAgID0gTm90YXRpb24gUHVibGljIENoYW5nZQotX1VJX05PVEFUSU9OX1NZU1RFTV9DSEFOR0UgICAgICAgPSBOb3RhdGlvbiBTeXN0ZW0gQ2hhbmdlCi1fVUlfUEFUVEVSTl9WQUxVRV9DSEFOR0UgICAgICAgICA9IFBhdHRlcm4gVmFsdWUgQ2hhbmdlCi1fVUlfU0NIRU1BX1ZFUlNJT05fQ0hBTkdFICAgICAgICA9IFNjaGVtYSBWZXJzaW9uIENoYW5nZQotX1VJX1NDSEVNQV9MQU5HX0NIQU5HRSAgICAgICAgICAgPSBTY2hlbWEgbGFuZyBDaGFuZ2UKLV9VSV9TRUxFQ1RPUl9YUEFUSF9DSEFOR0UgICAgICAgID0gU2VsZWN0b3IgeHBhdGggQ2hhbmdlCi1fVUlfVFlQRV9DSEFOR0UgICAgICAgICAgICAgICAgICA9IFR5cGUgQ2hhbmdlCi1fVUlfREVSSVZFREJZX0NIQU5HRSAgICAgICAgICAgICA9IERlcml2YXRpb24gQ2hhbmdlCi1fVUlfRkFDRVRfQ0hBTkdFICAgICAgICAgICAgICAgICA9IEZhY2V0IENoYW5nZQotX1VJX1NJTVBMRVRZUEVfTkFNRV9DSEFOR0UgICAgICAgPSBTaW1wbGVUeXBlIE5hbWUgQ2hhbmdlCi1fVUlfVU5JUVVFX05BTUVfQ0hBTkdFICAgICAgICAgICA9IFVuaXF1ZSBOYW1lIENoYW5nZQotX1VJX1NDSEVNQV9BVFRSSUJVVEVGT1JNREVGQVVMVF9DSEFOR0UgPSBBdHRyaWJ1dGUgRm9ybSBEZWZhdWx0IENoYW5nZQotX1VJX1NDSEVNQV9FTEVNRU5URk9STURFRkFVTFRfQ0hBTkdFID0gRWxlbWVudCBGb3JtIERlZmF1bHQgQ2hhbmdlCi1fVUlfU0NIRU1BX0JMT0NLREVGQVVMVF9DSEFOR0UgICA9IEJsb2NrIERlZmF1bHQgQ2hhbmdlCi1fVUlfU0NIRU1BX0ZJTkFMREVGQVVMVF9DSEFOR0UgICA9IEZpbmFsIERlZmF1bHQgQ2hhbmdlCi1fVUlfRUxFTUVOVF9TVUJTVElUVVRJT05HUk9VUF9DSEFOR0UgPSBTdWJzdGl0dXRpb24gR3JvdXAgQ2hhbmdlCi1fVUlfRUxFTUVOVF9GT1JNX0NIQU5HRSAgICAgICAgICA9IEZvcm0gQ2hhbmdlCi1fVUlfRUxFTUVOVF9CTE9DS19DSEFOR0UgICAgICAgICA9IEJsb2NrIENoYW5nZQotX1VJX0VMRU1FTlRfRklOQUxfQ0hBTkdFICAgICAgICAgPSBGaW5hbCBDaGFuZ2UKLV9VSV9FTEVNRU5UX0FCU1RSQUNUX0NIQU5HRSAgICAgID0gQWJzdHJhY3QgQ2hhbmdlCi1fVUlfRUxFTUVOVF9OSUxMQUJMRV9DSEFOR0UgICAgICA9IE5pbGxhYmxlIENoYW5nZQotX1VJX1RBUkdFVE5BTUVTUEFDRV9DSEFOR0UgICAgICAgPSBUYXJnZXQgTmFtZXNwYWNlIENoYW5nZQotCi0hIFdpbmRvdyBIZWFkaW5ncyBmb3IgRmxhdCBWaWV3Ci1fVUlfUEFHRV9IRUFESU5HX0FOWUFUVFJJQlVURSA9IEFueSBBdHRyaWJ1dGUKLV9VSV9QQUdFX0hFQURJTkdfQU5ZRUxFTUVOVCAgID0gQW55IEVsZW1lbnQKLV9VSV9QQUdFX0hFQURJTkdfQVBQSU5GTyAgICAgICAgICAgID0gQXBwSW5mbwotX1VJX1BBR0VfSEVBRElOR19BVFRSSUJVVEVHUk9VUF9SRUYgPSBBdHRyaWJ1dGUgR3JvdXAgUmVmZXJlbmNlCi1fVUlfUEFHRV9IRUFESU5HX0FUVFJJQlVURUdST1VQICAgICA9IEF0dHJpYnV0ZSBHcm91cAotX1VJX1BBR0VfSEVBRElOR19BVFRSSUJVVEVfUkVGICAgICAgPSBBdHRyaWJ1dGUgUmVmZXJlbmNlCi1fVUlfUEFHRV9IRUFESU5HX0FUVFJJQlVURSAgICAgICAgICA9IEF0dHJpYnV0ZQotX1VJX1BBR0VfSEVBRElOR19DT01QTEVYVFlQRSAgICAgICAgPSBDb21wbGV4IFR5cGUKLV9VSV9QQUdFX0hFQURJTkdfRE9DVU1FTlRBVElPTiAgICAgID0gRG9jdW1lbnRhdGlvbgotX1VJX1BBR0VfSEVBRElOR19FTEVNRU5UICAgICA9IEVsZW1lbnQKLV9VSV9QQUdFX0hFQURJTkdfRUxFTUVOVF9SRUYgPSBFbGVtZW50IFJlZmVyZW5jZQotX1VJX1BBR0VfSEVBRElOR19FTlVNICAgICAgICA9IEVudW1lcmF0aW9uCi1fVUlfUEFHRV9IRUFESU5HX0ZJRUxEICAgICAgID0gRmllbGQKLV9VSV9QQUdFX0hFQURJTkdfR1JPVVBfUkVGICAgPSBHcm91cCBSZWZlcmVuY2UKLV9VSV9QQUdFX0hFQURJTkdfQ09OVEVOVE1PREVMICA9IENvbnRlbnQgTW9kZWwKLV9VSV9QQUdFX0hFQURJTkdfR1JPVVAgICAgICAgICA9IEdyb3VwCi1fVUlfUEFHRV9IRUFESU5HX0lNUE9SVCAgICAgICAgPSBJbXBvcnQKLV9VSV9QQUdFX0hFQURJTkdfSU5DTFVERSAgICAgICA9IEluY2x1ZGUKLV9VSV9QQUdFX0hFQURJTkdfS0VZUkVGICAgICAgICA9IEtleSBSZWZlcmVuY2UKLV9VSV9QQUdFX0hFQURJTkdfS0VZICAgICAgICAgICA9IEtleQotX1VJX1BBR0VfSEVBRElOR19OT1RBVElPTiAgICAgID0gTm90YXRpb24KLV9VSV9QQUdFX0hFQURJTkdfUEFUVEVSTiAgICAgICA9IFBhdHRlcm4KLV9VSV9QQUdFX0hFQURJTkdfUkVERUZJTkUgICAgICA9IFJlZGVmaW5lCi1fVUlfUEFHRV9IRUFESU5HX1NDSEVNQSAgICAgICAgPSBTY2hlbWEKLV9VSV9QQUdFX0hFQURJTkdfU0VMRUNUT1IgICAgICA9IFNlbGVjdG9yCi1fVUlfUEFHRV9IRUFESU5HX0xJU1QgICAgICAgICAgPSBMaXN0Ci1fVUlfUEFHRV9IRUFESU5HX1VOSU9OICAgICAgICAgPSBVbmlvbgotX1VJX1BBR0VfSEVBRElOR19TSU1QTEVDT05URU5UID0gU2ltcGxlIENvbnRlbnQKLV9VSV9QQUdFX0hFQURJTkdfQ09NUExFWENPTlRFTlQgPSBDb21wbGV4IENvbnRlbnQKLV9VSV9QQUdFX0hFQURJTkdfUkVTVFJJQ1RJT04gICA9IFJlc3RyaWN0aW9uCi1fVUlfUEFHRV9IRUFESU5HX0VYVEVOU0lPTiAgICAgPSBFeHRlbnNpb24KLV9VSV9QQUdFX0hFQURJTkdfU0lNUExFVFlQRSAgICA9IFNpbXBsZSBUeXBlCi1fVUlfUEFHRV9IRUFESU5HX1VOSVFVRSAgICAgICAgPSBVbmlxdWUKLV9VSV9QQUdFX0hFQURJTkdfUkVGRVJFTkNFICAgICA9IHJlZmVyZW5jZQotCi0hCi0hIEdyYXBoIHBhZ2UKLSEKLV9VSV9HUkFQSF9TSU1QTEVfVFlQRVMgICAgICAgICA9IFNpbXBsZSBUeXBlcwotX1VJX0dSQVBIX0NPTVBMRVhfVFlQRVMgICAgICAgID0gQ29tcGxleCBUeXBlcwotX1VJX0dSQVBIX0dST1VQUyAgICAgICAgICAgICAgID0gR3JvdXBzCi1fVUlfR1JBUEhfR0xPQkFMX0FUVFJJQlVURVMgICAgPSBHbG9iYWwgQXR0cmlidXRlcwotX1VJX0dSQVBIX0dMT0JBTF9FTEVNRU5UUyAgICAgID0gR2xvYmFsIEVsZW1lbnRzCi1fVUlfR1JBUEhfWFNEU0NIRU1BICAgICAgICAgICAgPSBTY2hlbWEKLV9VSV9HUkFQSF9YU0RTQ0hFTUFfTk9fTkFNRVNQQUNFID0gKG5vIHRhcmdldCBuYW1lc3BhY2Ugc3BlY2lmaWVkKQotX1VJX0dSQVBIX1hTRENPTVBMRVhUWVBFREVGSU5JVElPTiA9IFhTRCBDb21wbGV4IFR5cGUgRGVmaW5pdGlvbjoKLV9VSV9HUkFQSF9YU0RNT0RFTEdST1VQICAgICAgICA9IFhTRCBNb2RlbCBHcm91cAotX1VJX0dSQVBIX1hTRFBBUlRJQ0xFICAgICAgICAgID0gWFNEIFBhcnRpY2xlCi1fVUlfR1JBUEhfVklFV19OT1RfQVZBSUxBQkxFICAgPSBWaWV3IGlzIG5vdCBhdmFpbGFibGUgZm9yIHNlbGVjdGVkIG9iamVjdC4KLV9VSV9HUkFQSF9VTktOT1dOX09CSkVDVCAgICAgICA9IFVua25vd24gb2JqZWN0Ci0KLSEgQWRkaXRpb25hbCBDYXRlZ29yaWVzCi1fVUlfR1JBUEhfVFlQRVMgICAgICAgICAgICAgICAgPSBUeXBlcwotX1VJX0dSQVBIX0VMRU1FTlRTICAgICAgICAgICAgID0gRWxlbWVudHMKLV9VSV9HUkFQSF9BVFRSSUJVVEVTICAgICAgICAgICA9IEF0dHJpYnV0ZXMKLV9VSV9HUkFQSF9BVFRSSUJVVEVfR1JPVVBTICAgICA9IEF0dHJpYnV0ZSBHcm91cHMKLV9VSV9HUkFQSF9OT1RBVElPTlMgICAgICAgICAgICA9IE5vdGF0aW9ucwotX1VJX0dSQVBIX0lERU5USVRZX0NPTlNUUkFJTlRTID0gSWRlbnRpdHkgQ29uc3RyYWludHMKLV9VSV9HUkFQSF9BTk5PVEFUSU9OUyAgICAgICAgICA9IEFubm90YXRpb25zCi1fVUlfR1JBUEhfRElSRUNUSVZFUyAgICAgICAgICAgPSBEaXJlY3RpdmVzCi0KLSEgRm9yIFVuaW9uIE1lbWJlclR5cGVzIERpYWxvZwotX1VJX0xBQkVMX1NFTEVDVF9NRU1CRVJUWVBFUyAgID0gU2VsZWN0IGZyb20gdGhlIGF2YWlsYWJsZSB0eXBlcyBhbmQgYWRkIHRvIHRoZSBtZW1iZXJUeXBlcyBsaXN0Ci1fVUlfTEFCRUxfTUVNQkVSVFlQRVNfQ0hBTkdFICAgPSBNZW1iZXIgVHlwZXMgQ2hhbmdlCi1fVUlfTEFCRUxfTUVNQkVSVFlQRVNfVkFMVUUgICAgPSBNZW1iZXIgVHlwZXMgVmFsdWU6Ci1fVUlfTEFCRUxfTUVNQkVSVFlQRVMgICAgICAgICAgPSBNZW1iZXIgdHlwZXM6Ci0KLV9VSV9MQUJFTF9WQVJJRVRZX0NIQU5HRSAgICAgICA9IFZhcmlldHkgQ2hhbmdlCi0KLV9VSV9MQUJFTF9GSVhFRE9SREVGQVVMVF9WQUxVRSA9IEZpeGVkL0RlZmF1bHQgVmFsdWUKLQotX1VJX0xBQkVMX0lURU1fVFlQRV9DSEFOR0UgICAgID0gSXRlbSBUeXBlIENoYW5nZQotCi1fVUlfTEFCRUxfSU5DTFVERV9DSEFOR0UgICAgICAgPSBJbmNsdWRlIENoYW5nZQotCi1fVUlfTEFCRUxfSVRFTV9UWVBFICAgICAgICAgICAgPSBJdGVtIHR5cGU6Ci1fVUlfTEFCRUxfVFlQRSAgICAgICAgICAgICAgICAgPSBUeXBlCi1fVUlfTEFCRUxfTU9ERUxfR1JPVVAgICAgICAgICAgPSBNb2RlbCBHcm91cAotCi1fVUlfTEFCRUxfQUJTRU5UICAgICAgICAgICAgICAgPSBhYnNlbnQKLQotX1VJX1dBUk5JTkdfUkVTRVRfQVRUUkdSUF9SRUYgID0gUmVzZXQgYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSA8ezB9PgotX1VJX1dBUk5JTkdfUkVNT1ZFX0FUVFJHUlBfUkVGID0gUmVtb3ZlIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UgPHswfT4KLV9VSV9XQVJOSU5HX1JFU0VUX0FUVFJfUkVGICAgICA9IFJlc2V0IGF0dHJpYnV0ZSByZWZlcmVuY2UgPHswfT4KLV9VSV9XQVJOSU5HX1JFTU9WRV9BVFRSX1JFRiAgICA9IFJlbW92ZSBhdHRyaWJ1dGUgcmVmZXJlbmNlIDx7MH0+Ci0KLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIQotISBIZXJlIGlzIHRoZSBsaXN0IG9mIEVycm9yIHN0cmluZyB0aGF0IGhhdmUgbWVzc2FnZSBJRHMgLSBtYWtlIHN1cmUgdGhleSBhcmUgdW5pcXVlCi0KLSEKLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotISBUaGVzZSB0aHJlZSBlcnJvcnMgYXBwZWFyIGluIHRoZSBzZWxlY3QgaW5jbHVkZSB3aXphcmQKLSEgVGhlIG5hbWUgb2YgdGhlIGZpbGUgd2lsbCBiZSBzdWJzdGl0dXRlZCBpbgotX1VJX0RJRkZFUkVOVF9OQU1FX1NQQUNFICA9IHswfSBpcyBpbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UgCi1fVUlfU0FNRV9OQU1FX1NQQUNFICAgICAgID0gezB9IGlzIGluIHRoZSBzYW1lIG5hbWVzcGFjZQotX1VJX0lOQ09SUkVDVF9YTUxfU0NIRU1BICA9IHswfSBpcyBhbiBpbnZhbGlkIFhNTCBzY2hlbWEgZmlsZQotCi1fRVJST1JfU0NIRU1BX05PVF9FWElTVCAgICAgICAgID0gRG9lcyBub3QgZXhpc3QuCi1fRVJST1JfTEFCRUxfSU5WQUxJRF9QUkVGSVggICAgID0gSW52YWxpZCBwcmVmaXguIEEgcHJlZml4IG11c3Qgbm90IGJlIGVtcHR5IG9yIGNvbnRhaW4gYW55IHNwYWNlLgotCi0hIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHdpbGwgYmUgc3Vic3RpdHV0ZWQgaW4KLV9FUlJPUl9TQ0hFTUFfTkFNRV9USEVfU0FNRSAgPSB7MH0gaXMgdGhlIGN1cnJlbnQgc2NoZW1hLiBBIHNjaGVtYSBjYW5ub3QgaW5jbHVkZSBpdHNlbGYuIFJlc2V0IHRvIHRoZSBsYXN0IHZhbGlkIHNjaGVtYS4KLQotX0VSUk9SX1hTRF9HRU5FUkFUSU9OICAgICAgICAgICAgICAgID0gRXJyb3IgZ2VuZXJhdGluZyBYTUwgc2NoZW1hCi1fRVJST1JfTk9fQ09OVEFJTkVSICAgICAgICAgICAgICAgICAgPSBObyBmb2xkZXIgc2VsZWN0ZWQKLV9FUlJPUl9OT19GSUxFX05BTUUgICAgICAgICAgICAgICAgICA9IE5vIGZpbGUgbmFtZSBwcm92aWRlZAotX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX1hTRCAgICAgICAgID0gVGhlIGZpbGUgbmFtZSBtdXN0IGVuZCBpbiAueHNkCi0KLQotIQotISBGb3Igc2NoZW1hIHRoYXQgaGFzIHRvbyBtYW55IGVycm9ycywgYW4gZXh0ZW5kZWQgbWVzc2FnZS4gCi0hCi1fRVJST1JfRElBTE9HX1hNTF9TQ0hFTUFfSU5WQUxJRF9URVhUICA9IFRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgbm90IHZhbGlkLiAgCi1fRVJST1JfTU9SRV9FUlJPUlMgICAgICAgICAgICAgICAgICAgID0gVGhlcmUgYXJlIG1vcmUgZXJyb3JzIGluIHRoZSBzY2hlbWEgdGhhbiBhcmUgZGlzcGxheWVkIGluIHRoZSBUYXNrcyB2aWV3LiAgQ29ycmVjdCB0aGUgZmlyc3QgezB9IGVycm9ycyBhbmQgcmUtdmFsaWRhdGUgdGhlIHNjaGVtYSBmaWxlLgotCi0hIERETCBHZW5lcmF0aW9uIEZhaWxlZCBEaWFsb2cKLV9VSV9ESUFMT0dfRERMX0dFTl9GQUlMRURfVElUTEUgICAgID0gRERMIEdlbmVyYXRpb24gRmFpbGVkCi1fRVJST1JfRElBTE9HX0RETF9OT1RfR0VORVJFQVRFRCAgICA9IERETCBoYXMgbm90IGJlZW4gZ2VuZXJhdGVkCi1fVUlfRElBTE9HX0RETF9HRU5fRkFJTEVEX1JFQVNPTiAgICA9IFRoZSBzZWxlY3RlZCBzY2hlbWEgaGFzIG5vIGdsb2JhbCBlbGVtZW50cwotX1VJX0RJQUxPR19ERExfR0VOX0ZBSUxFRF9SRUFTT04yICAgPSBOb25lIG9mIHRoZSBnbG9iYWwgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSBoYXZlIGEgY29tcGxleCB0eXBlIG9yIHRoZXkgcmVmZXJlbmNlIGNvbXBsZXggdHlwZXMgdGhhdCBjYW5ub3QgYmUgZm91bmQuCi0KLV9FWENfT1BFTl9YU0QgPSBDYW5ub3Qgb3BlbiBYTUwgU2NoZW1hIGVkaXRvcgotCi1fRVJST1JfTEFCRUxfUFJFRklYX0VYSVNUUyAgICAgPSBQcmVmaXggYWxyZWFkeSBleGlzdHMKLQotX0VSUk9SX1JFTU9WRV9MT0NBTF9TSU1QTEVUWVBFICA9IFJlbW92ZSBsb2NhbCBzaW1wbGUgdHlwZSBmcm9tIGV4dGVuc2lvbgotCi1fV0FSTl9JTlZBTElEX1RBUkdFVF9OQU1FU1BBQ0UgPSBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBpcyBub3Qgd2VsbC1mb3JtZWQKLQotX0VSUk9SX1RBUkdFVF9OQU1FU1BBQ0VfQU5EX1BSRUZJWCA9IEEgdGFyZ2V0IG5hbWVzcGFjZSBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHByZWZpeAotCi0KLV9VSV9DT05UQUlOTUVOVCA9IENvbnRhaW5tZW50Ci1fVUlfSU5IRVJJVEFOQ0UgPSBJbmhlcml0YW5jZQotX1VJX1NVQlNUSVRVVElPTl9HUk9VUFMgPSBTdWJzdGl0dXRpb24gR3JvdXBzCi1fVUlfQU5PTllNT1VTID0gKiphbm9ueW1vdXMqKgotX1VJX1ZBTFVFID0gVmFsdWUKLV9VSV9BTllfRUxFTUVOVCA9IEFueSBFbGVtZW50Ci1fVUlfU09SVCA9IFNvcnQKLQotX1VJX0FDVElPTl9FRElUX05BTUVTUEFDRVMgPSBFZGl0ICZOYW1lc3BhY2VzLi4uCi0KLQotX1VJX0NyZWF0ZUNoaWxkX3RleHQgPSB7MH0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0KLV9VSV9DcmVhdGVDaGlsZF90b29sdGlwID0gQ3JlYXRlIE5ldyB7MH0gVW5kZXIgezF9IEZlYXR1cmUKLV9VSV9DcmVhdGVDaGlsZF9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBjaGlsZCBvZiB0eXBlIHswfSBmb3IgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZSBzZWxlY3RlZCB7Mn0uCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBzaWJsaW5nIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezJ9LCB1bmRlciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlaXIgcGFyZW50LgotCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSEKLSEgVXNlZCBieSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVZpZXcKLSEKLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotX1VJX0xBQkVMX1NPVVJDRV9GSUxFUyAgID0gV29ya2JlbmNoIEZpbGVzCi1fVUlfTEFCRUxfU0VMRUNURURfRklMRVMgPSBTZWxlY3RlZCBGaWxlcwotCi1fVUlfSU1QT1JUX0JVVFRPTiAgICAgICAgICA9IEltcG9ydCBGaWxlcy4uLgotX1VJX0lNUE9SVF9CVVRUT05fVE9PTF9USVAgPSBJbXBvcnQgZmlsZXMgZnJvbSBmaWxlIHN5c3RlbQotCi0KLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIQotISByZWZhY3RvcmluZwotIQotIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1yZWZhY3RvcmluZ0FjdGlvblNldC5sYWJlbD1SZWZhYyZ0b3IKLXJlZmFjdG9yaW5nQWN0aW9uU2V0LmRlc2NyaXB0aW9uPVhTRCBFZGl0b3IgcmVmYWN0b3JpbmcgYWN0aW9ucwotcmVmYWN0b3JpbmcubWVudS5sYWJlbD1SZWZhYyZ0b3IKLXJlZmFjdG9yaW5nLnJlbmFtZUFjdGlvbi5sYWJlbD1SZSZuYW1lLi4uCi1jb250ZXh0LnRleHQuZWRpdG9yLnhzZC5uYW1lPUVkaXRpbmcgWFNEIGNvbnRleHQKLWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50Lm5hbWU9JlJlbmFtZSBYU0QgZWxlbWVudAotY29tbWFuZC54c2QucmVmYWN0b3IucmVuYW1lLmVsZW1lbnQuZGVzY3JpcHRpb249UmVuYW1lIFhTRCBlbGVtZW50Ci1jb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbC5lbGVtZW50Lm5hbWU9TWFrZSBMb2NhbCBFbGVtZW50ICZHbG9iYWwKLWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsLmVsZW1lbnQuZGVzY3JpcHRpb249UHJvbW90ZXMgbG9jYWwgZWxlbWVudCB0byBnbG9iYWwgbGV2ZWwgYW5kIHJlcGxhY2VzIGl0cyByZWZlcmVuY2VzCi1jb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbC5lbGVtZW50Lm5hbWU9TWFrZSAmQW5vbnltb3VzIFR5cGUgR2xvYmFsCi1jb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbC5lbGVtZW50LmRlc2NyaXB0aW9uPVByb21vdGVzIGFub255bW91cyB0eXBlIHRvIGdsb2JhbCBsZXZlbCBhbmQgcmVwbGFjZXMgaXRzIHJlZmVyZW5jZXMKLWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZVRhcmdldE5hbWVzcGFjZS5uYW1lPVJlbmFtZSBUYXJnZXQgTmFtZXNwYWNlCi1jb21tYW5kLnhzZC5yZWZhY3Rvci5yZW5hbWVUYXJnZXROYW1lc3BhY2UuZGVzY3JpcHRpb249Q2hhbmdlcyB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgc2NoZW1hCi14c2QucmVzb3VyY2UucmVuYW1lLnBhcnRpY2lwYW50Lm5hbWU9UmVuYW1lIFhTRCBDb21wb25lbnQKLUV4dGVuc2lvbnNTY2hlbWFzRGVzY3JpcHRpb249VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZCwgdXNlIGV4dGVuc2lvbkNhdGVnb3JpZXMKLUV4dGVuc2lvbkNhdGVnb3JpZXNEZXNjcmlwdGlvbj1FeHRlbnNpb24gcG9pbnQgZm9yIGNvbnRyaWJ1dGluZyB0byB0aGUgJ2J1aWx0IGluJyBjYXRlZ29yaWVzIG9mIGV4dGVuc2lvbiBlbGVtZW50cyBmb3IgWE1MIFNjaGVtYQotWFNERWRpdG9yRXh0ZW5zaW9uQ29uZmlndXJhdGlvbj1UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkLCB1c2UgaW50ZXJuYWxFZGl0b3JDb25maWd1cmF0aW9uCi1JbnRlcm5hbEVkaXRvckNvbmZpZ3VyYXRpb249RXh0ZW5zaW9uIHBvaW50IGZvciBleHRlbmRpbmcgdGhlIFhNTCBTY2hlbWEgRWRpdG9yCi0KLSEgQ29waWVkIGZyb20gc3NlCi0yM2NvbmNhdF9FWENfPVJlc291cmNlIHswfSBkb2VzIG5vdCBleGlzdC4KLTMyY29uY2F0X0VYQ189RWRpdG9yIGNvdWxkIG5vdCBiZSBvcGVuIG9uIHswfQotQW5fZXJyb3JfaGFzX29jY3VycmVkX3doZW4xX0VSUk9SXz1BbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hlbiBpbml0aWFsaXppbmcgdGhlIGlucHV0IGZvciB0aGUgdGhlIGVkaXRvcidzIHNvdXJjZSBwYWdlLgotT3BlbkZpbGVGcm9tU291cmNlLmxhYmVsPU9wJmVuIFNlbGVjdGlvbgotT3BlbkZpbGVGcm9tU291cmNlLnRvb2x0aXA9T3BlbiBhbiBlZGl0b3Igb24gdGhlIHNlbGVjdGVkIGxpbmsKLU9wZW5GaWxlRnJvbVNvdXJjZS5pbWFnZT0KLU9wZW5GaWxlRnJvbVNvdXJjZS5kZXNjcmlwdGlvbj1PcGVuIGFuIGVkaXRvciBvbiB0aGUgc2VsZWN0ZWQgbGluawotCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0KLV9aRVJPX09SX01PUkUgPSBaZXJvIG9yIE1vcmUKLV9aRVJPX09SX09ORSAgPSBaZXJvIG9yIE9uZQotX09ORV9PUl9NT1JFICA9IE9uZSBvciBNb3JlCi0KLSMgRm9yIHRyYW5zbGF0b3JzLCBhcyBpbiBzdHJ1Y3R1cmVkIERPTSB0cmVlCi1fVUlfTEFCRUxfU1RSVUNUVVJFRCAgICAgICAgICAgPSBTdHJ1Y3R1cmVkCi0KLV9VSV9MQUJFTF9NT1ZFICAgCQkJCSAgICAgICA9IE1vdmUKLV9VSV9MQUJFTF9SRU5BTUUgCQkJCSAgICAgICA9IFJlbmFtZQotX1VJX0xBQkVMX1RBUkdFVE5BTUVTUEFDRV9DSEFOR0UgICAgICAgPSBUYXJnZXQgTmFtZXNwYWNlIENoYW5nZQotX0lORk9fUkVTRVRfQVRUUklCVVRFX0dST1VQX1JFRkVSRU5DRSAgPSBSZXNldCBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlCi1fSU5GT19SRU1PVkVfQVRUUklCVVRFX0dST1VQX1JFRkVSRU5DRSA9IFJlbW92ZSBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlCi0KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1zZWFyY2guZGVjbGFyYXRpb25zLmxhYmVsID0gRGVjbGFyYXRpb25zCi1zZWFyY2gucmVmZXJlbmNlcy5sYWJlbCA9IFJlJmZlcmVuY2VzCi0KLSEgZXh0ZW5zaW9uIHBvaW50cyAKLUV4dGVuc2lvbk5vZGVDdXN0b21pemF0aW9uc0Rlc2NyaXB0aW9uID0gRXh0ZW5zaW9uIE5vZGUgQ3VzdG9taXphdGlvbnMKLVhNTFNjaGVtYUVkaXRvck1vZGVzID0gWE1MIFNjaGVtYSBFZGl0b3IgTW9kZXMKLSMjCi1YU0RfU291cmNlX3RhcmdldF9uYW1lPVhNTCBTY2hlbWEgU291cmNlCi1YU0RfaHlwZXJsaW5rPVhNTCBTY2hlbWEgQ29udGVudAotCi0KLVhTRF9ERVNJR05fVklFV19ERVNDUklQVElPTj1YU0QgRWRpdG9yIERlc2lnbiBWaWV3Ci1YU0RfREVTSUdOX1ZJRVc9WFNEIEVkaXRvciBEZXNpZ24gVmlldwotWFNEX1NPVVJDRV9WSUVXX0RFU0NSSVBUSU9OPVhTRCBFZGl0b3IgU291cmNlIFZpZXcKLVhTRF9TT1VSQ0VfVklFVz1YU0QgRWRpdG9yIFNvdXJjZSBWaWV3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRmMjFlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotCQk8ZWRpdG9yCi0JCQluYW1lPSIlX1VJX0VESVRPUl9OQU1FIgotCQkJaWNvbj0iaWNvbnMvWFNERmlsZS5naWYiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RNdWx0aVBhZ2VFZGl0b3JDb250cmlidXRvciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5JbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5JbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciI+Ci0gICAgICAgICAgICA8Y29udGVudFR5cGVCaW5kaW5nCi0gICAgICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZSIgLz4KLQkJPC9lZGl0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KLSAgICAgICAgPGVkaXRvckNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UucnVsZXIuYWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyRG91YmxlQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlbGVjdFJ1bGVyLmxhYmVsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIi8+Ci0gICAgICAgIDwvZWRpdG9yQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuTmV3WFNEV2l6YXJkIgotCQkJbmFtZT0iJV9VSV9XSVpBUkRfTkVXX1hTRCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuTmV3WFNEV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLQkJCWljb249Imljb25zL2N0b29sMTYvTmV3WFNELmdpZiI+Ci0JCQk8ZGVzY3JpcHRpb24+JV9VSV9DUkVBVEVfQV9ORVdfU0NIRU1BPC9kZXNjcmlwdGlvbj4KLQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCQk8cGFnZQotCQkJbmFtZT0iJV9VSV9YTUxfU0NIRU1BX1BSRUZFUkVOQ0UiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmVmZXJlbmNlcy54bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhTRFByZWZlcmVuY2VQYWdlIj4KLQkJPC9wYWdlPgotICAgIDxwYWdlCi0gICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNEUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNERWRpdG9yUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNERWRpdG9yUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgbmFtZT0iJV9VSV9YTUxfU0NIRU1BX0VESVRPUl9QUkVGRVJFTkNFIj4KLSAgICA8L3BhZ2U+Ci0gICAgPHBhZ2UKLSAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RWYWxpZGF0b3JQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RWYWxpZGF0b3JQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBuYW1lPSIlX1VJX1hNTF9TQ0hFTUFfVkFMSURBVE9SX1BSRUZFUkVOQ0UiPgotICAgIDwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb24iPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJwcmVmZXJlbmNlcGFnZXMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RQcmVmZXJlbmNlUGFnZSIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZSIgLz4KLSAgIAkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YU0QiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdXBwb3J0IGhlbHAgb24gdGhlIHRhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tICAgPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uRmlsZXMiPgotCQk8YW5ub3RhdGlvbkZpbGUKLQkJbG9jYXRpb249Ii93M2Mvc2NoZW1hRm9yQ29kZUFzc2lzdC1hbm5vdGF0aW9ucy54bWwiCi0JCXB1YmxpY0lkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0JCTwvYW5ub3RhdGlvbkZpbGU+Ci0JCTwvZXh0ZW5zaW9uPgotCS0tPgotCQotCQotICAgPGV4dGVuc2lvbiAKLSAgIAkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5Q29udHJpYnV0b3IiPgotICAgICA8cHJvcGVydHlDb250cmlidXRvcgotICAgICAgICAgICBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvciIKLSAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5wcm92aWRlcnMuWFNEU2VjdGlvbkxhYmVsUHJvdmlkZXIiPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkgY2F0ZWdvcnk9IkdlbmVyYWwiLz4KLSAgIAkJIDxwcm9wZXJ0eUNhdGVnb3J5IGNhdGVnb3J5PSJEb2N1bWVudGF0aW9uIi8+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeSBjYXRlZ29yeT0iQWR2YW5jZWQiLz4KLSAgICAgPC9wcm9wZXJ0eUNvbnRyaWJ1dG9yPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gCi0gICAgCXBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eVRhYnMiPgotICAgICAgPHByb3BlcnR5VGFicyAKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yIj4KLQkJCTxwcm9wZXJ0eVRhYgotCQkJCWxhYmVsPSIlX1VJX0xBQkVMX0dFTkVSQUwiCi0JCQkJY2F0ZWdvcnk9IkdlbmVyYWwiCi0JCQkJaWQ9InByb3BlcnR5LnRhYi5nZW5lcmFsIj4KLQkJCTwvcHJvcGVydHlUYWI+Ci0JCQk8cHJvcGVydHlUYWIKLQkJCQlsYWJlbD0iJV9VSV9MQUJFTF9UWVBFX0NPTlNUUkFJTlRTIgotCQkJCWNhdGVnb3J5PSJHZW5lcmFsIgotCQkJCWFmdGVyVGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIKLQkJCQlpZD0icHJvcGVydHkudGFiLnR5cGVjb25zdHJhaW50cyI+Ci0JCQk8L3Byb3BlcnR5VGFiPgotCQkJPHByb3BlcnR5VGFiCi0JCQkJbGFiZWw9IiVfVUlfTEFCRUxfRU5VTUVSQVRJT05TIgotCQkJCWNhdGVnb3J5PSJHZW5lcmFsIgotCQkJCWFmdGVyVGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIKLQkJCQlpZD0icHJvcGVydHkudGFiLmVudW1lcmF0aW9ucyI+Ci0JCQk8L3Byb3BlcnR5VGFiPgotCQkJPHByb3BlcnR5VGFiCi0JCQkJbGFiZWw9IiVfVUlfTEFCRUxfQURWQU5DRUQiCi0JCQkJY2F0ZWdvcnk9IkFkdmFuY2VkIgotCQkJCWFmdGVyVGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIKLQkJCQlpZD0icHJvcGVydHkudGFiLmFkdmFuY2VkIj4KLQkJCTwvcHJvcGVydHlUYWI+CQkJCi0JCQk8cHJvcGVydHlUYWIKLQkJCQlsYWJlbD0iJV9VSV9MQUJFTF9ET0NVTUVOVEFUSU9OIgotCQkJCWNhdGVnb3J5PSJEb2N1bWVudGF0aW9uIgotCQkJCWFmdGVyVGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIKLQkJCQlpZD0icHJvcGVydHkudGFiLmRvY3VtZW50YXRpb24iPgotCQkJPC9wcm9wZXJ0eVRhYj4KLQkJCTxwcm9wZXJ0eVRhYgotCQkJCWxhYmVsPSIlX1VJX0xBQkVMX0VYVEVOU0lPTlMiCi0JCQkJY2F0ZWdvcnk9IkRvY3VtZW50YXRpb24iCi0JCQkJYWZ0ZXJUYWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIgotCQkJCWlkPSJwcm9wZXJ0eS50YWIuZXh0ZW5zaW9ucyI+Ci0JCQk8L3Byb3BlcnR5VGFiPgotICAgIDwvcHJvcGVydHlUYWJzPgotIDwvZXh0ZW5zaW9uPgotCi0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5U2VjdGlvbnMiPgotICAgPHByb3BlcnR5U2VjdGlvbnMgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IiPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RTY2hlbWFTZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTRFNjaGVtYVNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYSI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmFkdmFuY2VkIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNEU2NoZW1hQWR2YW5jZWRTZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTRFNjaGVtYVNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYSI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5TY2hlbWFMb2NhdGlvblNlY3Rpb24iIAotCSAJaWQ9InByb3Auc2VjdGlvbi5TY2hlbWFMb2NhdGlvblNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYUNvbXBvc2l0b3IiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNEQ29tcGxleFR5cGVTZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTRENvbXBsZXhUeXBlU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuYWR2YW5jZWQiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RDb21wbGV4VHlwZUFkdmFuY2VkU2VjdGlvbiIgIAotCSAJaWQ9InByb3Auc2VjdGlvbi5YU0RDb21wbGV4VHlwZUFkdmFuY2VkU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+CQkgCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTREVsZW1lbnREZWNsYXJhdGlvblNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNERWxlbWVudERlY2xhcmF0aW9uU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuYWR2YW5jZWQiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RFbGVtZW50RGVjbGFyYXRpb25BZHZhbmNlZFNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNERWxlbWVudERlY2xhcmF0aW9uQWR2YW5jZWRTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb24iPgotCSAgICA8L2lucHV0PiAgIAotCSA8L3Byb3BlcnR5U2VjdGlvbj4gCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uU2VjdGlvbiIKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNEQXR0cmlidXRlRGVjbGFyYXRpb25TZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25TZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNETW9kZWxHcm91cFNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNETW9kZWxHcm91cFNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXAiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNETW9kZWxHcm91cERlZmluaXRpb25TZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb24iPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNEU2ltcGxlVHlwZVNlY3Rpb24iCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTRFNpbXBsZVR5cGVTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmFkdmFuY2VkIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNEU2ltcGxlVHlwZUFkdmFuY2VkU2VjdGlvbiIgIAotCSAJaWQ9InByb3Auc2VjdGlvbi5YU0RTaW1wbGVUeXBlQWR2YW5jZWRTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLnR5cGVjb25zdHJhaW50cyIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTREZhY2V0U2VjdGlvbiIKLSAgICAgICAgZmlsdGVyPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTREZhY2V0U2VjdGlvbkZpbHRlciIKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNERmFjZXRTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudCI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmRvY3VtZW50YXRpb24iIAotCSAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuQW5ub3RhdGlvblNlY3Rpb24iIAotCSAJaWQ9InByb3Auc2VjdGlvbi5Bbm5vdGF0aW9uU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5leHRlbnNpb25zIiAKLQkgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLkV4dGVuc2lvbnNTZWN0aW9uIiAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uRXh0ZW5zaW9uc1NlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50Ij4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIgCi0JIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RBbnlFbGVtZW50Q29udGVudHNTZWN0aW9uIiAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uZ2VuZXJhbCI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLQkgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTREltcG9ydFNlY3Rpb24iIAotCSAJaWQ9InByb3Auc2VjdGlvbi5nZW5lcmFsIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLQkgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTREVudW1lcmF0aW9uRmFjZXRTZWN0aW9uIiAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uZ2VuZXJhbCI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNERW51bWVyYXRpb25GYWNldCI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgkgCi0gIDwvcHJvcGVydHlTZWN0aW9ucz4KLTwvZXh0ZW5zaW9uPgotCi0gIDwhLS0gdGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZCwgdXNlIGV4dGVuc2lvbkNhdGVnb3JpZXMgLS0+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9IkV4dGVuc2lvbnNTY2hlbWFzRGVzY3JpcHRpb24iIG5hbWU9IiVFeHRlbnNpb25zU2NoZW1hc0Rlc2NyaXB0aW9uIi8+ICAKLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0ZW5zaW9uQ2F0ZWdvcmllcyIgbmFtZT0iJUV4dGVuc2lvbkNhdGVnb3JpZXNEZXNjcmlwdGlvbiIvPgotCi0gIDwhLS0gdGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZCwgdXNlIGludGVybmFsRWRpdG9yQ29uZmlndXJhdGlvbiAtLT4gIAotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJYU0RFZGl0b3JFeHRlbnNpb25Db25maWd1cmF0aW9uIiBuYW1lPSIlWFNERWRpdG9yRXh0ZW5zaW9uQ29uZmlndXJhdGlvbiIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpbnRlcm5hbEVkaXRvckNvbmZpZ3VyYXRpb24iIG5hbWU9IiVJbnRlcm5hbEVkaXRvckNvbmZpZ3VyYXRpb24iLz4KLSAgCi0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImV4dGVuc2liaWxpdHlOb2RlQ3VzdG9taXphdGlvbnMiIG5hbWU9IiVFeHRlbnNpb25Ob2RlQ3VzdG9taXphdGlvbnNEZXNjcmlwdGlvbiIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlZGl0b3JNb2RlcyIgbmFtZT0iJVhNTFNjaGVtYUVkaXRvck1vZGVzIi8+Ci0KLQk8IS0tIGludGlhbGl6ZSB4c2QgcmVjb25jaWxlIHZhbGlkYXRvciAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0QiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0QiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCI+Ci0JCQkJPC9wYXJ0aXRpb25UeXBlPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMiPgotCQk8Y29udGV4dAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkudGV4dC5lZGl0b3IuY29udGV4dCIKLQkJCW5hbWU9IiVjb250ZXh0LnRleHQuZWRpdG9yLnhzZC5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRFZGl0b3JTY29wZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gdGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBhdWdtZW50IHRoZSBNb2RlbFF1ZXJ5IHRvIHByb3ZpZGUgc2NoZW1hIHNwZWNpZmljIGd1aWRlZCBlZGl0aW5nIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbFF1ZXJ5RXh0ZW5zaW9ucyI+Ci0JCTxtb2RlbFF1ZXJ5RXh0ZW5zaW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0LlhTRE1vZGVsUXVlcnlFeHRlbnNpb24iCi0JCQljb250ZW50VHlwZT0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZSI+Ci0JCTwvbW9kZWxRdWVyeUV4dGVuc2lvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gUmVnaXN0ZXIgdGhlIFhTRFNlYXJjaFBhcnRpY3BhbnQgYWdhaW5zdCBmb3IgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybnMgCQktLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JCi0JIDxleHRlbnNpb24gICAKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2hQYXJ0aWNpcGFudHMiPgotCQk8c2VhcmNoUGFydGljaXBhbnQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnNlYXJjaC5YU0RTZWFyY2hQYXJ0aWNpcGFudCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5YU0RTZWFyY2hQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCSAgIDxvcj4KLQkJCSAgICAgIDx3aXRoIHZhcmlhYmxlPSJwYXR0ZXJuIj4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybiIvPgkJCSAgIAotCQkJCSAgPC93aXRoPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvc2VhcmNoUGFydGljaXBhbnQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JIAotICAgIDwhLS0gUmVnaXN0ZXIgYSAncmVuYW1lJyBwYXJ0aWNpcGFudCB0aGlzIGVuYWJsZXMgdXMgdG8gcHJvdmlkZSByZWZhY3RvcmluZyBmb3IgICAgIC0tPiAKLSAgICA8IS0tIHJlbmFtZWQgWE1MIFNjaGVtYSBjb21wb25lbnRzIChlLmcuIGVsZW1lbnRzLCB0eXBlcyBldGMuKSAgICAgICAgICAgICAgICAgICAgICAtLT4gCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CSAKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5yZW5hbWVQYXJ0aWNpcGFudHMiPgotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiV4c2QucmVzb3VyY2UucmVuYW1lLnBhcnRpY2lwYW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5yZWZhY3RvcmluZy5YU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50Ij4KLQkJCQkJPC9pbnN0YW5jZW9mPgotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CSAKLSAgICA8IS0tIFJlZ2lzdGVyIGEgJ3JlbmFtZScgcGFydGljaXBhbnQgdGhpcyBlbmFibGVzIHVzIHRvIHByb3ZpZGUgcmVmYWN0b3JpbmcgZm9yICAgICAtLT4gCi0gICAgPCEtLSByZW5hbWVkIHJlc291cmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IAotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgkgCi08IS0tCi0gICAgPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucmVuYW1lUGFydGljaXBhbnRzIj4KLQkJPHJlbmFtZVBhcnRpY2lwYW50Ci0JCQluYW1lPSIleHNkLnJlc291cmNlLnJlbmFtZS5wYXJ0aWNpcGFudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLlJlc291cmNlUmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5yZWZhY3RvcmluZy5YU0RSZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPgotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQk8L2V4dGVuc2lvbj4KLQktLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBSZWdpc3RlciB0aGUgICdSZWZhY3RvcicsICdSZWZlcmVuY2VzJyBhbmQgJ0RlY2xhcmF0aW9ucycgaXRlbXMgdG8gdGhlIGRlc2lnbiB2aWV3CSAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JICAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+IAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbiAKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yaW5nLm1lbnUub2JqZWN0Q29udHJpYiIgCi0gICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlciI+ICAKLSAgICAgICAgIDwhLS0gCi0gICAgICAgICBjcyA6IGRlY2xhcmF0aW9uIHNlYXJjaCBpc24ndCBmdWxseSBpbXBsZW1lbnRlZCB5ZXQsIHJlbW92aW5nIHRoaXMgbWVudSBhY3Rpb24gZm9yIG5vdwotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuc2VhcmNoLmRlY2xhcmF0aW9ucy5hY3Rpb24iIAotICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgIHN0eWxlPSJwdWxsZG93biIKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSJzZWFyY2gtc2xvdCIKLSAgICAgICAgICAgIGxhYmVsPSIlc2VhcmNoLmRlY2xhcmF0aW9ucy5sYWJlbCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zLlhTRFNlYXJjaERlY2xhcmF0aW9uc0dyb3VwQWN0aW9uRGVsZWdhdGUiPiAKLSAgICAgICAgIDwvYWN0aW9uPiAgICAgICAgICAKLSAgICAgICAgIC0tPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuc2VhcmNoLnJlZmVyZW5jZXMuYWN0aW9uIiAKLSAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICBzdHlsZT0icHVsbGRvd24iCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0ic2VhcmNoLXNsb3QiCi0gICAgICAgICAgICBsYWJlbD0iJXNlYXJjaC5yZWZlcmVuY2VzLmxhYmVsIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnMuWFNEU2VhcmNoUmVmZXJlbmNlc0dyb3VwQWN0aW9uRGVsZWdhdGUiPiAKLSAgICAgICAgIDwvYWN0aW9uPgotICAKLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgICAgICAgIAotICAgIAotICAgICA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudC5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudCI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbC5lbGVtZW50Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsLmVsZW1lbnQuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IubWFrZUVsZW1lbnRHbG9iYWwiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC54c2QucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwuZWxlbWVudC5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbC5lbGVtZW50LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VUeXBlR2xvYmFsIj4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZVRhcmdldE5hbWVzcGFjZS5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5yZW5hbWVUYXJnZXROYW1lc3BhY2UuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IucmVuYW1lVGFyZ2V0TmFtZXNwYWNlIj4KLQkJPC9jb21tYW5kPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9yVGFyZ2V0cyI+Ci0JCTx0YXJnZXQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIgotCQkJbmFtZT0iJVhTRF9Tb3VyY2VfdGFyZ2V0X25hbWUiPgotCQk8L3RhcmdldD4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5oeXBlcmxpbmtEZXRlY3RvcnMiPgotCQk8aHlwZXJsaW5rRGV0ZWN0b3IKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RIeXBlcmxpbmtEZXRlY3RvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RIeXBlcmxpbmtEZXRlY3RvciIKLQkJCW5hbWU9IiVYU0RfaHlwZXJsaW5rIgotCQkJdGFyZ2V0SWQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiPgotCQk8L2h5cGVybGlua0RldGVjdG9yPgotICAgPC9leHRlbnNpb24+Ci0KLSA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+Ci0JPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9InRvb2xiYXI6b3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wZXJzcGVjdGl2ZS5OZXdGaWxlVG9vbEJhciI+Ci0gICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkIgotICAgICAgICAgICAgICBpY29uPSJpY29ucy9jdG9vbDE2L05ld1hTRC5naWYiCi0gICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLm5ld1hTREZpbGUiCi0gICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX05FV19YTUxfU0NIRU1BX1RJVExFIj4KLSAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im5ld1dpemFyZElkIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hTRFdpemFyZCIvPgotICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVXb3JrYmVuY2hXaW5kb3cuYWN0aXZlUGVyc3BlY3RpdmUiPgotCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucGVyc3BlY3RpdmUiLz4KLQkJCTwvd2l0aD4KLSAgICAgICAgICAgPC92aXNpYmxlV2hlbj4gICAgICAgICAKLSAgICAgICAgPC9jb21tYW5kPiAgICAgICAgCi0gICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLSAgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9InBvcHVwOnJlZmFjdG9yUG9wdXBNZW51SWQiPgotICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IucmVuYW1lLmVsZW1lbnQiCi0gICAgICAgICAgICAgIGxhYmVsPSIlcmVmYWN0b3JpbmcucmVuYW1lQWN0aW9uLmxhYmVsIj4KLSAgICAgICAgICAgPHZpc2libGVXaGVuCi0gICAgICAgICAgICAgICAgIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotICAgICAgICAgICAgICAgCTxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmVkaXRvci5hY3RpdmUuc291cmNlVmlldy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KLSAgICAgICAgPC9jb21tYW5kPgotICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLSAgICA8bWVudUNvbnRyaWJ1dGlvbgotICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yTWVudUlkIj4KLSAgICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudCIKLSAgICAgICAgICAgICAgICBsYWJlbD0iJXJlZmFjdG9yaW5nLnJlbmFtZUFjdGlvbi5sYWJlbCI+Ci0gICAgICAgICAgICAgPHZpc2libGVXaGVuCi0gICAgICAgICAgICAgICAgICAgY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0gICAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KLSAgICAgICAgPC9jb21tYW5kPgotICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLQk8bWVudUNvbnRyaWJ1dGlvbgotICAgICAgICAgIGxvY2F0aW9uVVJJPSJtZW51OnJlZmFjdG9yTWVudUlkIj4KLSAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudCIKLSAgICAgICAgICAgICBsYWJlbD0iJXJlZmFjdG9yaW5nLnJlbmFtZUFjdGlvbi5sYWJlbCI+Ci0gICAgICAgICAgPHZpc2libGVXaGVuCi0gICAgICAgICAgICAgICAgY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgPG9yPgotCSAgICAgICAgICAgICAgICA8cmVmZXJlbmNlCi0JICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5lZGl0b3IuYWN0aXZlLmRlc2lnblZpZXcuZGVmaW5pdGlvbiI+Ci0JICAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgotCSAgICAgICAgICAgICAgICA8cmVmZXJlbmNlCi0JICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5lZGl0b3IuYWN0aXZlLnNvdXJjZVZpZXcuZGVmaW5pdGlvbiI+Ci0JICAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgotICAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgPC92aXNpYmxlV2hlbj4KLSAgICAgICAgICAKLSAgICAgICAgPC9jb21tYW5kPgotICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLSAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6cmVmYWN0b3JQb3B1cE1lbnVJZCI+Ci0gICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbCIKLSAgICAgICAgICAgICAgbGFiZWw9IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbC5lbGVtZW50Lm5hbWUiPgotICAgICAgICAgICA8dmlzaWJsZVdoZW4KLSAgICAgICAgICAgICAgICAgY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICA8cmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5lZGl0b3IuYWN0aXZlLnNvdXJjZVZpZXcuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KLSAgICAgICAgPC9jb21tYW5kPgotICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLSAgICA8bWVudUNvbnRyaWJ1dGlvbgotICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yTWVudUlkIj4KLSAgICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbCIKLSAgICAgICAgICAgICAgICBsYWJlbD0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsLmVsZW1lbnQubmFtZSI+Ci0gICAgICAgICAgICAgPHZpc2libGVXaGVuCi0gICAgICAgICAgICAgICAgICAgY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0gICAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KLSAgICAgICAgPC9jb21tYW5kPgotICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLQk8bWVudUNvbnRyaWJ1dGlvbgotICAgICAgICAgIGxvY2F0aW9uVVJJPSJtZW51OnJlZmFjdG9yTWVudUlkIj4KLSAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbCIKLSAgICAgICAgICAgICBsYWJlbD0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsLmVsZW1lbnQubmFtZSI+Ci0gICAgICAgICAgPHZpc2libGVXaGVuCi0gICAgICAgICAgICAgICAgY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgPG9yPgotCSAgICAgICAgICAgICAgICA8cmVmZXJlbmNlCi0JICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5lZGl0b3IuYWN0aXZlLmRlc2lnblZpZXcuZGVmaW5pdGlvbiI+Ci0JICAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgotCSAgICAgICAgICAgICAgICA8cmVmZXJlbmNlCi0JICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5lZGl0b3IuYWN0aXZlLnNvdXJjZVZpZXcuZGVmaW5pdGlvbiI+Ci0JICAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgotICAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgPC92aXNpYmxlV2hlbj4KLSAgICAgICAgICAKLSAgICAgICAgPC9jb21tYW5kPgotICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLSAgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9InBvcHVwOnJlZmFjdG9yUG9wdXBNZW51SWQiPgotICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwiCi0gICAgICAgICAgICAgIGxhYmVsPSIlY29tbWFuZC54c2QucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwuZWxlbWVudC5uYW1lIj4KLSAgICAgICAgICAgPHZpc2libGVXaGVuCi0gICAgICAgICAgICAgICAgIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotICAgICAgICAgICAgICAgPHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmVkaXRvci5hY3RpdmUuc291cmNlVmlldy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgotICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgIDxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3JNZW51SWQiPgotICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VUeXBlR2xvYmFsIgotICAgICAgICAgICAgICAgIGxhYmVsPSIlY29tbWFuZC54c2QucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwuZWxlbWVudC5uYW1lIj4KLSAgICAgICAgICAgICA8dmlzaWJsZVdoZW4KLSAgICAgICAgICAgICAgICAgICBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLSAgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgPC9tZW51Q29udHJpYnV0aW9uPgotCTxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgbG9jYXRpb25VUkk9Im1lbnU6cmVmYWN0b3JNZW51SWQiPgotICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VUeXBlR2xvYmFsIgotICAgICAgICAgICAgIGxhYmVsPSIlY29tbWFuZC54c2QucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwuZWxlbWVudC5uYW1lIj4KLSAgICAgICAgICA8dmlzaWJsZVdoZW4KLSAgICAgICAgICAgICAgICBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICA8b3I+Ci0JICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKLQkgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmVkaXRvci5hY3RpdmUuZGVzaWduVmlldy5kZWZpbml0aW9uIj4KLQkgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+Ci0JICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKLQkgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmVkaXRvci5hY3RpdmUuc291cmNlVmlldy5kZWZpbml0aW9uIj4KLQkgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+Ci0gICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgIAotICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgPC9tZW51Q29udHJpYnV0aW9uPgotICA8L2V4dGVuc2lvbj4KLQotIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLQk8Y29tbW9uV2l6YXJkIHR5cGU9Im5ldyIgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYU0RXaXphcmQiIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS53c3QueG1sLm5ldy5tZW51R3JvdXAiPgotCQk8ZW5hYmxlbWVudD4KLQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4KLQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVXb3JrYmVuY2hXaW5kb3cuYWN0aXZlUGVyc3BlY3RpdmUiPgotCQkJICAgPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wZXJzcGVjdGl2ZSIvPgotCQkJPC93aXRoPgotCQk8L2VuYWJsZW1lbnQ+Ci0JPC9jb21tb25XaXphcmQ+Ci0gPC9leHRlbnNpb24+Ci0gPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KLSAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5oYW5kbGVycy5SZW5hbWVIYW5kbGVyIgotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50Ij4KLSAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgICA8d2l0aAotCSAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IucmVuYW1lRW5hYmxlZCI+Ci0gICAgICAgICAgICAgICAgIDwvdGVzdD4KLQkgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgIDwvd2l0aD4gICAgICAgICAgICAgCi0JCTwvZW5hYmxlZFdoZW4+Ci0gICAgICA8L2hhbmRsZXI+Ci0gICAgIDxoYW5kbGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5oYW5kbGVycy5NYWtlTG9jYWxFbGVtZW50R2xvYmFsSGFuZGxlciIKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbCI+Ci0gICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgICAgPHdpdGgKLQkgICAgICAgICAgICAgICAgICAgdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VMb2NhbEVsZW1lbnRHbG9iYWxFbmFibGVkIj4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotCSAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgPC93aXRoPiAgICAgICAgICAgICAKLQkJPC9lbmFibGVkV2hlbj4KLSAgICAgIDwvaGFuZGxlcj4KLSAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5oYW5kbGVycy5NYWtlQW5vbnltb3VzVHlwZUdvYmFsSGFuZGxlciIKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbCI+Ci0gICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgICAgPHdpdGgKLQkgICAgICAgICAgICAgICAgICAgdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsRW5hYmxlZCI+Ci0gICAgICAgICAgICAgICAgIDwvdGVzdD4KLQkgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgIDwvd2l0aD4gICAgICAgICAgICAgCi0JCTwvZW5hYmxlZFdoZW4+Ci0gICAgICA8L2hhbmRsZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0gICAgICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlbmFtZUVuYWJsZW1lbnRUZXN0ZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5yZW5hbWUuZW5hYmxlbWVudCIKLSAgICAgICAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3RvciIKLSAgICAgICAgICAgIHByb3BlcnRpZXM9InJlbmFtZUVuYWJsZWQiCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24iPgotICAgICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgICAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuTWFrZUxvY2FsRWxlbWVudEdsb2JhbEVuYWJsZW1lbnRUZXN0ZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlTG9jYWxFbGVtZW50R2xvYmFsRW5hYmxlZCIKLSAgICAgICAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3RvciIKLSAgICAgICAgICAgIHByb3BlcnRpZXM9Im1ha2VMb2NhbEVsZW1lbnRHbG9iYWxFbmFibGVkIgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uIj4KLSAgICAgIDwvcHJvcGVydHlUZXN0ZXI+Ci0gICAgICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5NYWtlQW5vbnltb3VzVHlwc0dsb2JhbEVuYWJsZW1lbnRUZXN0ZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlQW5vbnltb3VzVHlwZUdsb2JhbEVuYWJsZWQiCi0gICAgICAgICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IiCi0gICAgICAgICAgICBwcm9wZXJ0aWVzPSJtYWtlQW5vbnltb3VzVHlwZUdsb2JhbEVuYWJsZWQiCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24iPgotICAgICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMiPgotICAgICAgPGNvbnRleHQKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlWFNEX0RFU0lHTl9WSUVXX0RFU0NSSVBUSU9OIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuZWRpdG9yLmRlc2lnblZpZXciCi0gICAgICAgICAgICBuYW1lPSIlWFNEX0RFU0lHTl9WSUVXIj4KLSAgICAgIDwvY29udGV4dD4KLSAgICAgICAgICAgIDxjb250ZXh0Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJVhTRF9TT1VSQ0VfVklFV19ERVNDUklQVElPTiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmVkaXRvci5zb3VyY2VWaWV3IgotICAgICAgICAgICAgbmFtZT0iJVhTRF9TT1VSQ0VfVklFVyI+Ci0gICAgICA8L2NvbnRleHQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLSAgICAgIDxkZWZpbml0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5lZGl0b3IuYWN0aXZlLmRlc2lnblZpZXcuZGVmaW5pdGlvbiI+Ci0gICAgICAgICA8d2l0aAotICAgICAgICAgICAgICAgdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLSAgICAgICAgICAgIDxpdGVyYXRlCi0gICAgICAgICAgICAgICAgICBvcGVyYXRvcj0ib3IiPgotICAgICAgICAgICAgICAgPGVxdWFscwotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuZWRpdG9yLmRlc2lnblZpZXciPgotICAgICAgICAgICAgICAgPC9lcXVhbHM+Ci0gICAgICAgICAgICA8L2l0ZXJhdGU+Ci0gICAgICAgICA8L3dpdGg+Ci0gICAgICA8L2RlZmluaXRpb24+Ci0gICAgICA8ZGVmaW5pdGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuZWRpdG9yLmFjdGl2ZS5zb3VyY2VWaWV3LmRlZmluaXRpb24iPgotICAgICAgICAgPHdpdGgKLSAgICAgICAgICAgICAgIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0gICAgICAgICAgICA8aXRlcmF0ZQotICAgICAgICAgICAgICAgICAgb3BlcmF0b3I9Im9yIj4KLSAgICAgICAgICAgICAgIDxlcXVhbHMKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmVkaXRvci5zb3VyY2VWaWV3Ij4KLSAgICAgICAgICAgICAgIDwvZXF1YWxzPgotICAgICAgICAgICAgPC9pdGVyYXRlPgotICAgICAgICAgPC93aXRoPgotICAgICAgPC9kZWZpbml0aW9uPgotICAgPC9leHRlbnNpb24+ICAKLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L1R5cGVWaXpFZGl0b3JNb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L1R5cGVWaXpFZGl0b3JNb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0OGQxMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9UeXBlVml6RWRpdG9yTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkVkaXRvck1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5BRFRDb250ZW50T3V0bGluZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuVHlwZVZpekZpZ3VyZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlhTREVkaXRQYXJ0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFR5cGVWaXpFZGl0b3JNb2RlIGV4dGVuZHMgRWRpdG9yTW9kZQotewotICBwcml2YXRlIEVkaXRQYXJ0RmFjdG9yeSBlZGl0UGFydEZhY3Rvcnk7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkudHlwZXZpeiI7Ci0gIAotICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gIkFkdmFuY2VkIjsKLSAgfQotCi0gIHB1YmxpYyBFZGl0UGFydEZhY3RvcnkgZ2V0RWRpdFBhcnRGYWN0b3J5KCkKLSAgewotICAgIGlmIChlZGl0UGFydEZhY3RvcnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlZGl0UGFydEZhY3RvcnkgPSBuZXcgWFNERWRpdFBhcnRGYWN0b3J5KG5ldyBUeXBlVml6RmlndXJlRmFjdG9yeSgpKTsKLSAgICB9ICAKLSAgICByZXR1cm4gZWRpdFBhcnRGYWN0b3J5OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gSUQ7Ci0gIH0KLQotICBwdWJsaWMgSUNvbnRlbnRQcm92aWRlciBnZXRPdXRsaW5lUHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBBRFRDb250ZW50T3V0bGluZVByb3ZpZGVyKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvQm94RmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL0JveEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWE5MDRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvQm94RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24ubGF5b3V0cy5Db2x1bW5EYXRhOwotCi1wdWJsaWMgY2xhc3MgQm94RmlndXJlIGV4dGVuZHMgRmlndXJlCi17Ci0gIHByb3RlY3RlZCBDb2x1bW5EYXRhIGNvbHVtbkRhdGEgPSBuZXcgQ29sdW1uRGF0YSgpOyAgCi0gIHB1YmxpYyBIZWFkaW5nRmlndXJlIGhlYWRpbmdGaWd1cmU7Ci0gIHByb3RlY3RlZCBGaWd1cmUgY29udGVudFBhbmU7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkID0gZmFsc2U7Ci0KLSAgcHVibGljIEJveEZpZ3VyZSgpCi0gIHsKLSAgICBzdXBlcigpOwotIAotICAgIGJvb2xlYW4gaGlnaENvbnRyYXN0ID0gZmFsc2U7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaGlnaENvbnRyYXN0ID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0SGlnaENvbnRyYXN0KCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGlmICghaGlnaENvbnRyYXN0KQotICAgIHsKLSAgICAgIHNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgfQotICAgIAotICAgIGhlYWRpbmdGaWd1cmUgPSBuZXcgSGVhZGluZ0ZpZ3VyZSgpOyAgIAotICAgIGFkZChoZWFkaW5nRmlndXJlKTsKLQotICAgIGNvbnRlbnRQYW5lID0gbmV3IEZpZ3VyZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gICAgICB7Ci0gICAgICAgIGdyYXBoaWNzLmZpbGxSZWN0YW5nbGUoZ2V0Qm91bmRzKCkpOwotICAgICAgICBzdXBlci5wYWludChncmFwaGljcyk7Ci0gICAgICAgIGJvb2xlYW4gaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIEZpZ3VyZSBmaWd1cmUgPSAoRmlndXJlKSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAoaXNGaXJzdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgciA9IGZpZ3VyZS5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHIueCwgci55ICsgMSwgci54ICsgci53aWR0aCwgci55ICsgMSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBjb250ZW50UGFuZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOwotICAgIGFkZChjb250ZW50UGFuZSk7Ci0gICAgaGVhZGluZ0ZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOyAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGdyYXBoaWNzKQotICB7Ci0gICAgc3VwZXIucGFpbnQoZ3JhcGhpY3MpOwotICAgIC8qCi0gICAgLy8gRmlsbCBmb3IgdGhlIGhlYWRlciBzZWN0aW9uCi0gICAgLy8KLSAgICBSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpLmdldENvcHkoKTsKLSAgICBncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuZGFya0dyYXkpOwotICAgIENvbG9yIGdyYWRpZW50MSA9IENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheTsKLSAgICBpZiAoaXNTZWxlY3RlZCkKLSAgICB7Ci0gICAgICBncmFkaWVudDEgPSBDb2xvckNvbnN0YW50cy5saWdodEJsdWU7Ci0gICAgfQotICAgIENvbG9yIGdyYWRpZW50MiA9IENvbG9yQ29uc3RhbnRzLndoaXRlOwotICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihncmFkaWVudDEpOwotICAgIGdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihncmFkaWVudDIpOwotICAgIGdyYXBoaWNzLmZpbGxHcmFkaWVudChyLnggKyAxLCByLnkgKyAxLCByLndpZHRoIC0gMiwgbm9kZU5hbWVMYWJlbC5nZXRCb3VuZHMoKS5oZWlnaHQgLSAxLCB0cnVlKTsKLSAgICBub2RlTmFtZUxhYmVsLnBhaW50KGdyYXBoaWNzKTsKLSAgICAqLwotICB9Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnRQYW5lOwotICB9Ci0KLSAgcHVibGljIExhYmVsIGdldE5hbWVMYWJlbCgpCi0gIHsKLSAgICByZXR1cm4gaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpOwotICB9Ci0gIAotICBwdWJsaWMgSGVhZGluZ0ZpZ3VyZSBnZXRIZWFkaW5nRmlndXJlKCkKLSAgewotICAgIHJldHVybiBoZWFkaW5nRmlndXJlOwotICB9Ci0gIAotICBwdWJsaWMgQ29sdW1uRGF0YSBnZXRDb2x1bW5EYXRhKCkKLSAgewotICAgIHJldHVybiBjb2x1bW5EYXRhOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvQ29tcGFydG1lbnRGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvQ29tcGFydG1lbnRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxOWFkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL0NvbXBhcnRtZW50RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5EZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuU3RydWN0dXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUNvbXBhcnRtZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklTdHJ1Y3R1cmVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24ubGF5b3V0cy5Sb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5HZW5lcmljR3JvdXBGaWd1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDb21wYXJ0bWVudEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSBpbXBsZW1lbnRzIElDb21wYXJ0bWVudEZpZ3VyZQotewotICBwdWJsaWMgTGFiZWwgbm9kZU5hbWVMYWJlbDsKLSAgcHJvdGVjdGVkIEZpZ3VyZSBjb250ZW50UGFuZTsKLSAgcHJvdGVjdGVkIEZpZ3VyZSBhbm5vdGF0aW9uQXJlYTsKLSAgcHVibGljIEZpZ3VyZSByb3dGaWd1cmU7Ci0KLSAgcHVibGljIENvbXBhcnRtZW50RmlndXJlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0KLSAgICByb3dGaWd1cmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgYWRkKHJvd0ZpZ3VyZSk7Ci0KLSAgICBhbm5vdGF0aW9uQXJlYSA9IG5ldyBGaWd1cmUoKSB7Ci0gICAgICAKLSAgICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGdyYXBoaWNzKQotICAgICAgewotICAgICAgICBzdXBlci5wYWludChncmFwaGljcyk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY3MucHVzaFN0YXRlKCk7ICAKLSAgICAgICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmx1ZSk7Ci0gICAgICAgICAgZ3JhcGhpY3Muc2V0Rm9udChEZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzLnNtYWxsRm9udCk7Ci0gICAgICAgICAgTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGaWd1cmUgb2JqZWN0ID0gKEZpZ3VyZSlpLm5leHQoKTsKLSAgICAgICAgICAgIHRyYXZlcnNlKG9iamVjdCwgZ3JhcGhpY3MpOyAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY3MucG9wU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoRmlndXJlIGZpZ3VyZSwgR3JhcGhpY3MgZ3JhcGhpY3MpCi0gICAgICB7Ci0gICAgICAgIExpc3QgY2hpbGRyZW4gPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgIEZpZ3VyZSBvYmplY3QgPSAoRmlndXJlKWkubmV4dCgpOwotICAgICAgICAgIAotICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBHZW5lcmljR3JvdXBGaWd1cmUpCi0gICAgICAgICAgewotICAgICAgICAgICAgR2VuZXJpY0dyb3VwRmlndXJlIGZpZyA9IChHZW5lcmljR3JvdXBGaWd1cmUpIG9iamVjdDsKLSAgICAgICAgICAgIGlmIChmaWcuaGFzVGV4dCgpKQotICAgICAgICAgICAgICBncmFwaGljcy5kcmF3VGV4dChmaWcuZ2V0VGV4dCgpLCBmaWcuZ2V0VGV4dENvb3JkaW5hdGVzKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICB0cmF2ZXJzZShvYmplY3QsIGdyYXBoaWNzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgIH07Ci0gICAgVG9vbGJhckxheW91dCBhbm5vdGF0aW9uTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOwotICAgIGFubm90YXRpb25MYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsKLSAgICBhbm5vdGF0aW9uQXJlYS5zZXRMYXlvdXRNYW5hZ2VyKGFubm90YXRpb25MYXlvdXQpOwotCi0gICAgLy8gTmVlZCB0aGlzIHRvIHNob3cgY29udGVudCBtb2RlbCBzdHJ1Y3R1cmUgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZmlndXJlCi0gICAgcm93RmlndXJlLmFkZChhbm5vdGF0aW9uQXJlYSk7Ci0KLSAgICBjb250ZW50UGFuZSA9IG5ldyBGaWd1cmUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGdyYXBoaWNzKQotICAgICAgewotICAgICAgICBzdXBlci5wYWludChncmFwaGljcyk7Ci0gICAgICAgIGdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gaXNGaXJzdCA9IHRydWU7Ci0gICAgICAgICAgQ29sb3Igb2xkQ29sb3IgPSBncmFwaGljcy5nZXRGb3JlZ3JvdW5kQ29sb3IoKTsKLSAgICAgICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubGlnaHRHcmF5KTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGaWd1cmUgZmlndXJlID0gKEZpZ3VyZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgciA9IGZpZ3VyZS5nZXRCb3VuZHMoKTsKLS8vICAgICAgICAgICAgaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIEZpZWxkRmlndXJlKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgIFJlY3RhbmdsZSByQ2hpbGQgPSAoKEZpZWxkRmlndXJlKWZpZ3VyZSkuZ2V0TmFtZUZpZ3VyZSgpLmdldEJvdW5kcygpOwotLy8gICAgICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZShyQ2hpbGQucmlnaHQoKSwgckNoaWxkLnksIHJDaGlsZC5yaWdodCgpLCByQ2hpbGQuYm90dG9tKCkpOwotLy8gICAgICAgICAgICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuZGFya0dyYXkpOwotLy8gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNGaXJzdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotLy8gICAgICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZShyLngsIHIueSwgci54LCByLnkgKyByLmhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgICAgICAgICAgIGdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGdyYXBoaWNzLmZpbGxHcmFkaWVudChyLngsIHIueSwgci53aWR0aCwgMSwgZmFsc2UpOyAgICAKLS8vICAgICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZShyLngsIHIueSwgci54ICsgci53aWR0aCwgci55KTsKLS8vICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0xpbmUoci54LCByLnksIHIueCwgci55ICsgci5oZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob2xkQ29sb3IpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIGNvbnRlbnRQYW5lLnNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKSk7Ci0gICAgcm93RmlndXJlLmFkZChjb250ZW50UGFuZSk7Ci0KLSAgICBSb3dMYXlvdXQgcm93TGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOwotICAgIHJvd0ZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKHJvd0xheW91dCk7Ci0gICAgcm93TGF5b3V0LnNldENvbnN0cmFpbnQoYW5ub3RhdGlvbkFyZWEsICJhbm5vdGF0aW9uIik7Ci0gICAgcm93TGF5b3V0LnNldENvbnN0cmFpbnQoY29udGVudFBhbmUsICJjb250ZW50UGFuZSIpOwotICB9Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnRQYW5lOwotICB9Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0QW5ub3RhdGlvblBhbmUoKQotICB7Ci0gICAgcmV0dXJuIGFubm90YXRpb25BcmVhOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlZGl0UGFydEF0dGFjaGVkKEVkaXRQYXJ0IG93bmVyKQotICB7ICAgCi0gICAgU3RydWN0dXJlRWRpdFBhcnQgc3RydWN0dXJlRWRpdFBhcnQgPSBudWxsOwotICAgIGZvciAoRWRpdFBhcnQgcGFyZW50ID0gb3duZXIuZ2V0UGFyZW50KCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCkpCi0gICAgewotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBzdHJ1Y3R1cmVFZGl0UGFydCA9IChTdHJ1Y3R1cmVFZGl0UGFydCkgcGFyZW50OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgUm93TGF5b3V0IHJvd0xheW91dCA9IChSb3dMYXlvdXQpcm93RmlndXJlLmdldExheW91dE1hbmFnZXIoKTsKLSAgICBJU3RydWN0dXJlRmlndXJlIHR5cGVGaWd1cmUgPSBzdHJ1Y3R1cmVFZGl0UGFydC5nZXRTdHJ1Y3R1cmVGaWd1cmUoKTsgICAgCi0gICAgQXNzZXJ0LmlzVHJ1ZSh0eXBlRmlndXJlIGluc3RhbmNlb2YgU3RydWN0dXJlRmlndXJlLCAiRXhwZWN0ZWQgb2JqZWN0IG9mIHR5cGUgU3RydWN0dXJlRmlndXJlIik7ICAgIAotICAgIHJvd0xheW91dC5zZXRDb2x1bW5EYXRhKCgoU3RydWN0dXJlRmlndXJlKXR5cGVGaWd1cmUpLmdldENvbHVtbkRhdGEoKSk7ICAgICAgICAgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25GZWVkYmFjaygpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkZlZWRiYWNrKCkKLSAgewotICB9ICAgCi0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoVmlzdWFscyhPYmplY3QgbW9kZWwpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvRmllbGRGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvRmllbGRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkODdjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL0ZpZWxkRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuU3RydWN0dXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUZpZWxkRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklTdHJ1Y3R1cmVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24ubGF5b3V0cy5Sb3dMYXlvdXQ7Ci0KLXB1YmxpYyBjbGFzcyBGaWVsZEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSBpbXBsZW1lbnRzIElGaWVsZEZpZ3VyZQotewotICAvLyBUT0RPOiBwdXQgdGhpcyBjb2xvciBpcyBzb21lIGNvbW1vbiBjbGFzcwotICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIGNlbGxDb2xvciA9IG5ldyBDb2xvcihudWxsLCAyMjQsIDIzMywgMjQ2KTsKLQotLy8gRm9yIGZpeCB0byBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxOTQwCi0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBsZWZ0T3V0ZXJCb3JkZXJDb2xvciA9IG5ldyBDb2xvcihudWxsLCAyNTMsIDE5NiwgODgpOwotLy8gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgbGVmdElubmVyQm9yZGVyQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgMjUzLCAyMjYsIDE3Mik7Ci0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciByaWdodE91dGVyQm9yZGVyQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgMTUwLCAxNzksIDIyNCk7Ci0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciByaWdodElubmVyQm9yZGVyQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgNDksIDEwNiwgMTk3KTsKLSAgCi0gIC8vIEZvcm1hdHRpbmcgY29uc3RyYWludHMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QX01BUkdJTiA9IDI7IC8vIHBpeGVscwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT01fTUFSR0lOID0gVE9QX01BUkdJTiArIDE7IC8vIGV4dHJhIHBpeGVsIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb290ZXIgbGluZQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUX01BUkdJTiA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUX01BUkdJTiA9IExFRlRfTUFSR0lOOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9TSURFX1BBRERJTkcgPSA2OwotCi0gIC8vIFN0YXRlcyByZXF1aXJpbmcgZGVjb3JhdG9ycywgYW5kIHRoZWlyIGljb25zCi0gIC8vIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW1hZ2UgZXJyb3JJY29uID0gSUNPTl9FUlJPUjsKLQotICAvLyBMYWJlbHMgd2hpY2ggaGFuZGxlIHByZXNlbnRhdGlvbiBvZiBuYW1lIGFuZCB0eXBlCi0gIHB1YmxpYyBGaWd1cmUgcm93RmlndXJlOwotICBwcm90ZWN0ZWQgTGFiZWwgbmFtZUxhYmVsOwotICBwcm90ZWN0ZWQgTGFiZWwgbmFtZUFubm90YXRpb25MYWJlbDsgIC8vIGZvciBvY2N1cnJlbmNlIHRleHQsIG9yIGVycm9yIGljb25zCi0gIHByb3RlY3RlZCBMYWJlbCB0eXBlTGFiZWw7Ci0gIHByb3RlY3RlZCBMYWJlbCB0eXBlQW5ub3RhdGlvbkxhYmVsOyAgLy8gZm9yIG9jY3VycmVuY2UgdGV4dCwgb3IgZXJyb3IgaWNvbnMKLSAgcHJvdGVjdGVkIExhYmVsIHRvb2xUaXBMYWJlbDsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgRmllbGRGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOwotICAgIHJvd0ZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBSb3dMYXlvdXQgcm93TGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOwotICAgIHJvd0ZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKHJvd0xheW91dCk7Ci0KLSAgICBhZGQocm93RmlndXJlKTsKLQotICAgIG5hbWVMYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIG5hbWVMYWJlbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigzLCA1LCAzLCA1KSk7Ci0gICAgbmFtZUxhYmVsLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkxFRlQpOwotICAgIG5hbWVMYWJlbC5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgcm93RmlndXJlLmFkZChuYW1lTGFiZWwpOwotICAgIAotICAgIG5hbWVBbm5vdGF0aW9uTGFiZWwgPSBuZXcgTGFiZWwoKTsKLSAgICBuYW1lQW5ub3RhdGlvbkxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDMsIDUsIDMsIDUpKTsKLSAgICBuYW1lQW5ub3RhdGlvbkxhYmVsLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkxFRlQpOwotICAgIG5hbWVBbm5vdGF0aW9uTGFiZWwuc2V0T3BhcXVlKHRydWUpOwotICAgIHJvd0ZpZ3VyZS5hZGQobmFtZUFubm90YXRpb25MYWJlbCk7Ci0gICAgCi0gICAgdG9vbFRpcExhYmVsID0gbmV3IExhYmVsKCk7Ci0vLyAgRG9uJ3Qgc2hvdyB0b29sdGlwIGZvciBub3cuICBBbm5veWluZyB2ZXJ0aWNhbCBsaW5lIHNob3dzIHVwLiAgU2FmZSBmaXguCi0vLyAgICBuYW1lTGFiZWwuc2V0VG9vbFRpcCh0b29sVGlwTGFiZWwpOwotICAgIHR5cGVMYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIAotICAgIC8vIGNzIDogd2UgbmVlZCB0byBhZGQgc29tZSBhZGRpdGlvbmFsIHBhZGRpbmcgdG8gdGhlIHJpZ2h0Ci0gICAgLy8gc28gdGhhdCB3aGVuIHdlIGVkaXQgdGhlIGZpZWxkIHRoZXJlJ3Mgcm9vbSBmb3IgdGhlIGNvbWJvYm94J3MgYXJyb3cKLSAgICAvLyBhbmQgdGhlIHR5cGUgbmFtZSB3b24ndCBiZSBwYXJ0aWFsbHkgb2JzY3VyZWQKLSAgICAvLwotICAgIHR5cGVMYWJlbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigzLCA1LCAzLCAyMCkpOwotICAgIHR5cGVMYWJlbC5zZXRMYWJlbEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLSAgICB0eXBlTGFiZWwuc2V0T3BhcXVlKHRydWUpOwotICAgIHJvd0ZpZ3VyZS5hZGQodHlwZUxhYmVsKTsKLQotICAgIHR5cGVBbm5vdGF0aW9uTGFiZWwgPSBuZXcgTGFiZWwoKSB7Ci0gICAgICAKLSAgICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGdldFRleHQoKSA9PSBudWxsIHx8IGdldFRleHQoKS5lcXVhbHMoIiIpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBEaW1lbnNpb24oMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByZWZlcnJlZFNpemUod0hpbnQsIGhIaW50KTsKLSAgICAgIH0KLSAgICB9OwotICAgIHR5cGVBbm5vdGF0aW9uTGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMywgNSwgMywgNSkpOwotICAgIHR5cGVBbm5vdGF0aW9uTGFiZWwuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0gICAgdHlwZUFubm90YXRpb25MYWJlbC5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgcm93RmlndXJlLmFkZCh0eXBlQW5ub3RhdGlvbkxhYmVsKTsKLS8vIERvbid0IHNob3cgdG9vbHRpcCBmb3Igbm93LiAgQW5ub3lpbmcgdmVydGljYWwgbGluZSBzaG93cyB1cC4gIFNhZmUgZml4LgotLy8gICAgdHlwZUFubm90YXRpb25MYWJlbC5zZXRUb29sVGlwKHRvb2xUaXBMYWJlbCk7Ci0gICAgCi0gICAgcm93TGF5b3V0LnNldENvbnN0cmFpbnQobmFtZUxhYmVsLCAibmFtZSIpOwotICAgIHJvd0xheW91dC5zZXRDb25zdHJhaW50KG5hbWVBbm5vdGF0aW9uTGFiZWwsICJuYW1lQW5ub3RhdGlvbiIpOwotICAgIHJvd0xheW91dC5zZXRDb25zdHJhaW50KHR5cGVMYWJlbCwgInR5cGUiKTsKLSAgICByb3dMYXlvdXQuc2V0Q29uc3RyYWludCh0eXBlQW5ub3RhdGlvbkxhYmVsLCAidHlwZUFubm90YXRpb24iKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlICJuYW1lIiBzdHJpbmcgdXNlZCBieSB0aGlzIGZpZ3VyZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZUxhYmVsLmdldFRleHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpZ3VyZSByZXByZXNlbnRpbmcgdGhlIGF0dHJpYnV0ZSBuYW1lCi0gICAqLwotICBwdWJsaWMgTGFiZWwgZ2V0TmFtZUxhYmVsKCkKLSAgewotICAgIHJldHVybiBuYW1lTGFiZWw7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSAidHlwZSIgc3RyaW5nIHVzZWQgYnkgdGhpcyBmaWd1cmUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVMYWJlbC5nZXRUZXh0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmaWd1cmUgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGUncyB0eXBlCi0gICAqLwotICBwdWJsaWMgTGFiZWwgZ2V0VHlwZUxhYmVsKCkKLSAgewotICAgIHJldHVybiB0eXBlTGFiZWw7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIG5hbWUKLSAgICogICAgICAgICAgU2V0IHRoZSAibmFtZSIgc3RyaW5nIHVzZWQgYnkgdGhpcyBmaWd1cmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgbmFtZUxhYmVsLnNldFRleHQobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHR5cGUKLSAgICogICAgICAgICAgU2V0IHRoZSAidHlwZSIgc3RyaW5nIHVzZWQgYnkgdGhpcyBmaWd1cmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKQotICB7Ci0gICAgdHlwZUxhYmVsLnNldFRleHQodHlwZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVUb29sVGlwVGV4dChTdHJpbmcgdG9vbFRpcCkKLSAgewotICAgIHNldE5hbWVUb29sVGlwVGV4dCh0b29sVGlwKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVUb29sVGlwVGV4dChTdHJpbmcgdG9vbFRpcCkKLSAgewotICAgIGlmICh0b29sVGlwLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBuYW1lTGFiZWwuc2V0VG9vbFRpcCh0b29sVGlwTGFiZWwpOwotICAgICAgdG9vbFRpcExhYmVsLnNldFRleHQodG9vbFRpcCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBuYW1lTGFiZWwuc2V0VG9vbFRpcChudWxsKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVBbm5vdGF0aW9uTGFiZWwoU3RyaW5nIHRleHQpCi0gIHsKLSAgICBuYW1lQW5ub3RhdGlvbkxhYmVsLnNldFRleHQodGV4dCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lQW5ub3RhdGlvbkxhYmVsSWNvbihJbWFnZSBpY29uKQotICB7Ci0gICAgbmFtZUFubm90YXRpb25MYWJlbC5zZXRJY29uKGljb24pOwotICB9Ci0gIAotICBwdWJsaWMgTGFiZWwgZ2V0TmFtZUFubm90YXRpb25MYWJlbCgpCi0gIHsKLSAgICByZXR1cm4gbmFtZUFubm90YXRpb25MYWJlbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VHlwZUFubm90YXRpb25MYWJlbChTdHJpbmcgdGV4dCkKLSAgewotICAgIHR5cGVBbm5vdGF0aW9uTGFiZWwuc2V0VGV4dCh0ZXh0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVBbm5vdGF0aW9uTGFiZWxJY29uKEltYWdlIGljb24pCi0gIHsKLSAgICB0eXBlQW5ub3RhdGlvbkxhYmVsLnNldEljb24oaWNvbik7Ci0gIH0KLQotICBwdWJsaWMgTGFiZWwgZ2V0VHlwZUFubm90YXRpb25MYWJlbCgpCi0gIHsKLSAgICByZXR1cm4gdHlwZUFubm90YXRpb25MYWJlbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVjb21wdXRlTGF5b3V0KCkKLSAgewotICAgIFJvd0xheW91dCBsYXlvdXQgPSAoUm93TGF5b3V0KXJvd0ZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCk7Ci0gICAgaWYgKGxheW91dCAhPSBudWxsICYmIGxheW91dC5nZXRDb2x1bW5EYXRhKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsYXlvdXQuZ2V0Q29sdW1uRGF0YSgpLmNsZWFyQ29sdW1uV2lkdGhzKCk7Ci0gICAgfSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZWRpdFBhcnRBdHRhY2hlZChFZGl0UGFydCBvd25lcikKLSAgewotICAgIFN0cnVjdHVyZUVkaXRQYXJ0IHN0cnVjdHVyZUVkaXRQYXJ0ID0gbnVsbDsKLSAgICBmb3IgKEVkaXRQYXJ0IHBhcmVudCA9IG93bmVyLmdldFBhcmVudCgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpKQotICAgIHsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgc3RydWN0dXJlRWRpdFBhcnQgPSAoU3RydWN0dXJlRWRpdFBhcnQpIHBhcmVudDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIFJvd0xheW91dCByb3dMYXlvdXQgPSAoUm93TGF5b3V0KXJvd0ZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCk7Ci0gICAgSVN0cnVjdHVyZUZpZ3VyZSB0eXBlRmlndXJlID0gc3RydWN0dXJlRWRpdFBhcnQuZ2V0U3RydWN0dXJlRmlndXJlKCk7ICAgIAotICAgIEFzc2VydC5pc1RydWUodHlwZUZpZ3VyZSBpbnN0YW5jZW9mIFN0cnVjdHVyZUZpZ3VyZSwgIkV4cGVjdGVkIG9iamVjdCBvZiB0eXBlIFN0cnVjdHVyZUZpZ3VyZSIpOyAgICAKLSAgICByb3dMYXlvdXQuc2V0Q29sdW1uRGF0YSgoKFN0cnVjdHVyZUZpZ3VyZSl0eXBlRmlndXJlKS5nZXRDb2x1bW5EYXRhKCkpOyAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25GZWVkYmFjaygpCi0gIHsKLSAgICBib29sZWFuIGhpZ2hDb250cmFzdCA9IGZhbHNlOwotICAgIHRyeQotICAgIHsKLSAgICAgIGhpZ2hDb250cmFzdCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEhpZ2hDb250cmFzdCgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBpZiAoaGlnaENvbnRyYXN0KQotICAgIHsKLSAgICAgIHJvd0ZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKSk7Ci0gICAgICByb3dGaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcm93RmlndXJlLnNldEJhY2tncm91bmRDb2xvcihjZWxsQ29sb3IpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uRmVlZGJhY2soKQotICB7Ci0gICAgYm9vbGVhbiBoaWdoQ29udHJhc3QgPSBmYWxzZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBoaWdoQ29udHJhc3QgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRIaWdoQ29udHJhc3QoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgaWYgKGhpZ2hDb250cmFzdCkKLSAgICB7Ci0gICAgICByb3dGaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCkpOwotICAgICAgcm93RmlndXJlLnNldEJhY2tncm91bmRDb2xvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJvd0ZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaFZpc3VhbHMoT2JqZWN0IG1vZGVsKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGdyYXBoaWNzKQotICB7Ci0gICAgc3VwZXIucGFpbnQoZ3JhcGhpY3MpOwotICAgIGlmIChoYXNGb2N1cykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZ3JhcGhpY3MucHVzaFN0YXRlKCk7Ci0gICAgICAgIFJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCk7Ci0gICAgICAgIGdyYXBoaWNzLnNldFhPUk1vZGUodHJ1ZSk7Ci0gICAgICAgIGdyYXBoaWNzLmRyYXdGb2N1cyhyLngsIHIueSArIDEsIHIud2lkdGggLSAxLCByLmhlaWdodCAtIDIpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBncmFwaGljcy5wb3BTdGF0ZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9IZWFkaW5nRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL0hlYWRpbmdGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyNzVkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL0hlYWRpbmdGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi1wdWJsaWMgY2xhc3MgSGVhZGluZ0ZpZ3VyZSBleHRlbmRzIEZpZ3VyZQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIGhlYWRlckNvbG9yID0gbmV3IENvbG9yKG51bGwsIDIyNCwgMjMzLCAyNDYpOwotICBMYWJlbCBsYWJlbDsKLSAgQ29sb3JbXSBncmFkaWVudENvbG9yID0ge0NvbG9yQ29uc3RhbnRzLndoaXRlLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvckNvbnN0YW50cy5saWdodEdyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvckNvbnN0YW50cy5saWdodEJsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvckNvbnN0YW50cy5ncmF5fTsKLSAgYm9vbGVhbiBpc1NlbGVjdGVkID0gZmFsc2U7Ci0gIGJvb2xlYW4gaXNSZWFkT25seSA9IGZhbHNlOwotICAKLSAgcHVibGljIEhlYWRpbmdGaWd1cmUoKQotICB7Ci0gICAgbGFiZWwgPSBuZXcgTGFiZWwoKTsKLSAgICBsYWJlbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigyKSk7Ci0gICAgVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOwotICAgIHRvb2xiYXJMYXlvdXQuc2V0TWlub3JBbGlnbm1lbnQoVG9vbGJhckxheW91dC5BTElHTl9DRU5URVIpOwotICAgIHNldExheW91dE1hbmFnZXIodG9vbGJhckxheW91dCk7Ci0gICAgYWRkKGxhYmVsKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0R3JhZGllbnRDb2xvcnMoQ29sb3JbXSBjb2xvcnMpCi0gIHsKLSAgICB0aGlzLmdyYWRpZW50Q29sb3IgPSBjb2xvcnM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gaXNTZWxlY3RlZCkKLSAgewotICAgIHRoaXMuaXNTZWxlY3RlZCA9IGlzU2VsZWN0ZWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJc1JlYWRPbmx5KGJvb2xlYW4gaXNSZWFkT25seSkKLSAgewotICAgIHRoaXMuaXNSZWFkT25seSA9IGlzUmVhZE9ubHk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGdyYXBoaWNzKQotICB7Ci0gICAgc3VwZXIucGFpbnQoZ3JhcGhpY3MpOwotICAgIAotICAgIGdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEZpbGwgZm9yIHRoZSBoZWFkZXIgc2VjdGlvbgotICAgICAgLy8KLSAgICAgIFJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgICAgZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0gIAotICAgICAgQ29sb3IgZ3JhZGllbnQxID0gaXNSZWFkT25seSA/IGdyYWRpZW50Q29sb3JbMV0gOiBoZWFkZXJDb2xvcjsKLSAgICAgIGlmIChpc1NlbGVjdGVkICYmIGlzUmVhZE9ubHkpIGdyYWRpZW50MSA9IGdyYWRpZW50Q29sb3JbM107Ci0gICAgICBlbHNlIGlmIChpc1NlbGVjdGVkICYmICFpc1JlYWRPbmx5KSBncmFkaWVudDEgPSBncmFkaWVudENvbG9yWzJdOwotICAgICAgQ29sb3IgZ3JhZGllbnQyID0gZ3JhZGllbnRDb2xvclswXTsKLSAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihncmFkaWVudDEpOwotICAgICAgZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKGdyYWRpZW50Mik7Ci0gICAgICBSZWN0YW5nbGUgbGFiZWxCb3VuZHMgPSBsYWJlbC5nZXRCb3VuZHMoKTsKLSAgICAgIGdyYXBoaWNzLmZpbGxHcmFkaWVudChyLngrMSwgci55KzEsIHIud2lkdGgtMiwgbGFiZWxCb3VuZHMuaGVpZ2h0IC0gMiwgdHJ1ZSk7ICAgIAotICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmRhcmtHcmF5KTsKLSAgICAgIGxhYmVsLnBhaW50KGdyYXBoaWNzKTsgICAgCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBncmFwaGljcy5wb3BTdGF0ZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBnZXRMYWJlbCgpCi0gIHsKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9Sb3VuZGVkTGluZUJvcmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9Sb3VuZGVkTGluZUJvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U4MGYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvUm91bmRlZExpbmVCb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuSW5zZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotcHVibGljIGNsYXNzIFJvdW5kZWRMaW5lQm9yZGVyIGV4dGVuZHMgTGluZUJvcmRlcgotewotICBwcm90ZWN0ZWQgaW50IGFyY0xlbmd0aDsgICAKLSAgcHJvdGVjdGVkIGludCBsaW5lU3R5bGUgPSBHcmFwaGljcy5MSU5FX1NPTElEOwotCi0gIHB1YmxpYyBSb3VuZGVkTGluZUJvcmRlcihDb2xvciBjLCBpbnQgd2lkdGgsIGludCBhcmNMZW5ndGgpCi0gIHsKLSAgICBzdXBlcihjLCB3aWR0aCk7ICAgICAKLSAgICB0aGlzLmFyY0xlbmd0aCA9IGFyY0xlbmd0aDsKLSAgfQotCi0gIHB1YmxpYyBSb3VuZGVkTGluZUJvcmRlcihpbnQgd2lkdGgsIGludCBhcmNMZW5ndGgpCi0gIHsKLSAgICBzdXBlcih3aWR0aCk7ICAgICAKLSAgICB0aGlzLmFyY0xlbmd0aCA9IGFyY0xlbmd0aDsKLSAgfQotICAKLSAgcHVibGljIFJvdW5kZWRMaW5lQm9yZGVyKENvbG9yIGMsIGludCB3aWR0aCwgaW50IGFyY0xlbmd0aCwgaW50IGxpbmVTdHlsZSkKLSAgewotICAgIHN1cGVyKGMsIHdpZHRoKTsKLSAgICB0aGlzLmFyY0xlbmd0aCA9IGFyY0xlbmd0aDsKLSAgICB0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLSAgfQotCi0gIHB1YmxpYyBSb3VuZGVkTGluZUJvcmRlcihpbnQgd2lkdGgsIGludCBhcmNMZW5ndGgsIGludCBsaW5lU3R5bGUpCi0gIHsKLSAgICBzdXBlcih3aWR0aCk7Ci0gICAgdGhpcy5hcmNMZW5ndGggPSBhcmNMZW5ndGg7Ci0gICAgdGhpcy5saW5lU3R5bGUgPSBsaW5lU3R5bGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwYWludChJRmlndXJlIGZpZ3VyZSwgR3JhcGhpY3MgZ3JhcGhpY3MsIEluc2V0cyBpbnNldHMpCi0gIHsKLSAgICBpbnQgcmxiV2lkdGggPSBnZXRXaWR0aCgpOwotICAgIHRlbXBSZWN0LnNldEJvdW5kcyhnZXRQYWludFJlY3RhbmdsZShmaWd1cmUsIGluc2V0cykpOwotICAgIGlmIChybGJXaWR0aCUyID09IDEpCi0gICAgewotICAgICAgdGVtcFJlY3Qud2lkdGgtLTsKLSAgICAgIHRlbXBSZWN0LmhlaWdodC0tOwotICAgIH0KLSAgICB0ZW1wUmVjdC5zaHJpbmsocmxiV2lkdGgvMixybGJXaWR0aC8yKTsKLSAgICBncmFwaGljcy5zZXRMaW5lV2lkdGgocmxiV2lkdGgpOwotICAgIGdyYXBoaWNzLnNldExpbmVTdHlsZShsaW5lU3R5bGUpOwotICAgIGlmIChnZXRDb2xvcigpICE9IG51bGwpCi0gICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoZ2V0Q29sb3IoKSk7Ci0gICAgZ3JhcGhpY3MuZHJhd1JvdW5kUmVjdGFuZ2xlKHRlbXBSZWN0LCBhcmNMZW5ndGgsIGFyY0xlbmd0aCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvU3RydWN0dXJlRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL1N0cnVjdHVyZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTBmNjRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvU3RydWN0dXJlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JU3RydWN0dXJlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JU3RydWN0dXJlOwotCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVGaWd1cmUgZXh0ZW5kcyBCb3hGaWd1cmUgaW1wbGVtZW50cyBJU3RydWN0dXJlRmlndXJlCi17Ci0gIHB1YmxpYyB2b2lkIGVkaXRQYXJ0QXR0YWNoZWQoRWRpdFBhcnQgb3duZXIpCi0gIHsKLSAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUgOi0pCi0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25GZWVkYmFjaygpCi0gIHsKLSAgICBMaW5lQm9yZGVyIGJveEZpZ3VyZUxpbmVCb3JkZXIgPSAoTGluZUJvcmRlcilnZXRCb3JkZXIoKTsKLSAgICBib3hGaWd1cmVMaW5lQm9yZGVyLnNldFdpZHRoKDIpOwotICAgIC8vIFRPRE8gKGNzKSBuZWVkIHRvIGZpeCB0aGlzCi0gICAgLy9ib3hGaWd1cmVMaW5lQm9yZGVyLnNldENvbG9yKGdldENvbXBsZXhUeXBlKCkuaXNSZWFkT25seSgpID8gQ29sb3JDb25zdGFudHMuZGFya0dyYXkgOiBDb2xvckNvbnN0YW50cy5kYXJrQmx1ZSk7ICAKLSAgICBnZXRIZWFkaW5nRmlndXJlKCkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgcmVwYWludCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uRmVlZGJhY2soKQotICB7Ci0gICAgTGluZUJvcmRlciBib3hGaWd1cmVMaW5lQm9yZGVyID0gKExpbmVCb3JkZXIpZ2V0Qm9yZGVyKCk7Ci0gICAgYm94RmlndXJlTGluZUJvcmRlci5zZXRXaWR0aCgxKTsKLSAgICBnZXRIZWFkaW5nRmlndXJlKCkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgIHJlcGFpbnQoKTsKLSAgfSAgCi0gIAotICBwdWJsaWMgYm9vbGVhbiBoaXRUZXN0SGVhZGVyKFBvaW50IGxvY2F0aW9uKQotICB7Ci0gICAgSUZpZ3VyZSB0YXJnZXQgPSBnZXRIZWFkaW5nRmlndXJlKCk7Ci0gICAgUmVjdGFuZ2xlIGIgPSB0YXJnZXQuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgIHRhcmdldC50cmFuc2xhdGVUb0Fic29sdXRlKGIpOyAgCi0gICAgcmV0dXJuIGIuY29udGFpbnMobG9jYXRpb24pOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoVmlzdWFscyhPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBJU3RydWN0dXJlIHN0cnVjdHVyZSA9IChJU3RydWN0dXJlKW1vZGVsOwotICAgIGdldE5hbWVMYWJlbCgpLnNldFRleHQoc3RydWN0dXJlLmdldE5hbWUoKSk7Ci0gICAgZ2V0SGVhZGluZ0ZpZ3VyZSgpLnNldElzUmVhZE9ubHkoc3RydWN0dXJlLmlzUmVhZE9ubHkoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvVHlwZVZpekZpZ3VyZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvVHlwZVZpekZpZ3VyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyNjBmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL1R5cGVWaXpGaWd1cmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUNvbXBhcnRtZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklGaWVsZEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JU3RydWN0dXJlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuSUV4dGVuZGVkRmlndXJlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLklNb2RlbEdyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuTW9kZWxHcm91cEZpZ3VyZTsKLQotcHVibGljIGNsYXNzIFR5cGVWaXpGaWd1cmVGYWN0b3J5IGltcGxlbWVudHMgSUV4dGVuZGVkRmlndXJlRmFjdG9yeQoteyAgCi0gIHB1YmxpYyBJU3RydWN0dXJlRmlndXJlIGNyZWF0ZVN0cnVjdHVyZUZpZ3VyZShPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBTdHJ1Y3R1cmVGaWd1cmUgZmlndXJlID0gbmV3IFN0cnVjdHVyZUZpZ3VyZSgpOwotICAgIGZpZ3VyZS5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIoMSkpOyAgICAKLSAgICBUb29sYmFyTGF5b3V0IHRvb2xiYXJMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dCgpOwotICAgIHRvb2xiYXJMYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsKLSAgICBmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcih0b29sYmFyTGF5b3V0KTsKLQotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElUcmVlRWxlbWVudCkKLSAgICB7Ci0gICAgICBmaWd1cmUuZ2V0TmFtZUxhYmVsKCkuc2V0SWNvbigoKElUcmVlRWxlbWVudCltb2RlbCkuZ2V0SW1hZ2UoKSk7Ci0gICAgfSAgICAKLSAgICAvL2ZpZ3VyZS5nZXRIZWFkaW5nRmlndXJlKCkuc2V0SXNSZWFkT25seShnZXRDb21wbGV4VHlwZSgpLmlzUmVhZE9ubHkoKSk7Ci0gICAgLy8gd2Ugc2hvdWxkIG9yZ2FuaXplIElUcmVlRWxlbWVudCBhbmQgaW50ZWdyYXRlIGl0IHdpdGggdGhlIGZhY2FkZSAgICAKLSAgICByZXR1cm4gZmlndXJlOwotICB9Ci0KLSAgcHVibGljIElGaWVsZEZpZ3VyZSBjcmVhdGVGaWVsZEZpZ3VyZShPYmplY3QgbW9kZWwpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG5ldyBGaWVsZEZpZ3VyZSgpOwotICB9Ci0gIAotICBwdWJsaWMgSUNvbXBhcnRtZW50RmlndXJlIGNyZWF0ZUNvbXBhcnRtZW50RmlndXJlKE9iamVjdCBtb2RlbCkKLSAgewotICAgIENvbXBhcnRtZW50RmlndXJlIGZpZ3VyZSA9IG5ldyBDb21wYXJ0bWVudEZpZ3VyZSgpOwotICAgIGZpZ3VyZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigxKSk7Ci0gICAgVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOwotICAgIHRvb2xiYXJMYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsKLSAgICBmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcih0b29sYmFyTGF5b3V0KTsKLSAgICByZXR1cm4gZmlndXJlOwotICB9ICAKLSAgCi0gIHB1YmxpYyBJTW9kZWxHcm91cEZpZ3VyZSBjcmVhdGVNb2RlbEdyb3VwRmlndXJlKE9iamVjdCBtb2RlbCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbmV3IE1vZGVsR3JvdXBGaWd1cmUoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vbGF5b3V0cy9Db2x1bW5EYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9sYXlvdXRzL0NvbHVtbkRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlOWRhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9sYXlvdXRzL0NvbHVtbkRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5sYXlvdXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQ29sdW1uRGF0YQotewotICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gIAotICBjbGFzcyBFbnRyeQotICB7Ci0gICAgaW50IHdpZHRoID0gMDsKLSAgICBpbnQgd2VpZ2h0ID0gMTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgY2xlYXJDb2x1bW5XaWR0aHMoKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSlpLm5leHQoKTsKLSAgICAgIGVudHJ5LndpZHRoID0gMDsKLSAgICB9ICAKLSAgfSAgCi0gIAotICBwcml2YXRlIEVudHJ5IGxvb2t1cE9yQ3JlYXRlQ29sdW1uRW50cnkoU3RyaW5nIGlkZW50aWZpZXIpCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSltYXAuZ2V0KGlkZW50aWZpZXIpOwotICAgIGlmIChlbnRyeSA9PSBudWxsKQotICAgIHsKLSAgICAgIGVudHJ5ID0gbmV3IEVudHJ5KCk7Ci0gICAgICBtYXAucHV0KGlkZW50aWZpZXIsIGVudHJ5KTsKLSAgICB9ICAKLSAgIHJldHVybiBlbnRyeTsgCi0gIH0gIAotICAKLSAgdm9pZCBzdHJldGNoQ29sdW1uV2lkdGhJZk5lZWRlZChTdHJpbmcgaWRlbnRpZmllciwgaW50IHdpZHRoKQotICB7Ci0gICAgRW50cnkgZW50cnkgPSBsb29rdXBPckNyZWF0ZUNvbHVtbkVudHJ5KGlkZW50aWZpZXIpOwotICAgIGVudHJ5LndpZHRoID0gTWF0aC5tYXgoZW50cnkud2lkdGgsIHdpZHRoKTsKLSAgfQotICAKLSAgaW50IGdldENvbHVtbldpZHRoKFN0cmluZyBpZGVudGlmaWVyKQotICB7Ci0gICAgRW50cnkgZW50cnkgPSAoRW50cnkpbWFwLmdldChpZGVudGlmaWVyKTsKLSAgICBpZiAoZW50cnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZW50cnkud2lkdGg7Ci0gICAgfSAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAwOy8vaG1tIHNob3VsZCB3ZSByZXR1cm4gLTEgPwotICAgIH0gIAotICB9Ci0gIAotICBpbnQgZ2V0Q29sdW1uV2VpZ2h0KFN0cmluZyBpZGVudGlmaWVyKQotICB7Ci0gICAgRW50cnkgZW50cnkgPSAoRW50cnkpbWFwLmdldChpZGVudGlmaWVyKTsKLSAgICBpZiAoZW50cnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZW50cnkud2VpZ2h0OwotICAgIH0gIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29sdW1uV2VpZ2h0KFN0cmluZyBpZGVudGlmaWVyLCBpbnQgd2VpZ2h0KQotICB7Ci0gICAgRW50cnkgZW50cnkgPSBsb29rdXBPckNyZWF0ZUNvbHVtbkVudHJ5KGlkZW50aWZpZXIpOwotICAgIGVudHJ5LndlaWdodCA9IHdlaWdodDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2xheW91dHMvUm93TGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9sYXlvdXRzL1Jvd0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzkwNjc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2xheW91dHMvUm93TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmxheW91dHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi1wdWJsaWMgY2xhc3MgUm93TGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RMYXlvdXQKLXsKLSAgLy8gbGF5b3V0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcmVudCBjb250ZXh0Ci0gIC8vIGFueSBsYXlvdXQgbWFuYWdlciB1bmRlciB0aGUgcGFyZW50IGNvbnRleHQgaXMgY29ubmVjdGVkCi0gIC8vIGNvbHVtbiByb3dzIGFyZSBtYWludGFpbmVkIGFjY3Jvc3MgY29udGFpbmVyIGJvdW5kYXJpZXMgIAotICBwcm90ZWN0ZWQgQ29sdW1uRGF0YSBjb2x1bW5EYXRhOwotICBwcm90ZWN0ZWQgSGFzaE1hcCBmaWd1cmVUb0NvbnRzdHJhaW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgCi0gIHB1YmxpYyBSb3dMYXlvdXQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLQotICAvLyB0aGlzIG1ldGhvZCBjb21wdXRlcyB0aGUgbWluaW11bSBzaXplIHJlcXVpcmVkIHRvIGRpc3BsYXkgdGhlIGZpZ3VyZXMKLSAgLy8KLSAgcHJpdmF0ZSBEaW1lbnNpb24gY2FsY3VsYXRlQ2hpbGRyZW5TaXplKElGaWd1cmUgY29udGFpbmVyLCBMaXN0IGNoaWxkcmVuLCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBwcmVmZXJyZWQpCi0gIHsKLSAgICBEaW1lbnNpb24gY2hpbGRTaXplOwotICAgIElGaWd1cmUgY2hpbGQ7Ci0gICAgaW50IGhlaWdodCA9IDA7Ci0gICAgaW50IHdpZHRoID0gMDsKLSAgICAKLSAgICAvL0lSb3dGaWd1cmUgZmlndXJlID0gKElSb3dGaWd1cmUpY29udGFpbmVyOwotICAgIAotICAgIC8vIGZvciBlYWNoIGNlbGwgaW4gdGhlIHJvdwotICAgIC8vCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBjaGlsZCA9IChJRmlndXJlKSBjaGlsZHJlbi5nZXQoaSk7Ci0gICAgICBTdHJpbmcgY29sdW1uSWRlbmlmaWVyID0gKFN0cmluZylnZXRDb25zdHJhaW50KGNoaWxkKTsKLSAgICAgICAgICAgICAKLSAgICAgIC8vIGZpcnN0IHdlIGNvbXB1dGUgdGhlIGNoaWxkIHNpemUgd2l0aG91dCByZWdhcmQgZm9yIGNvbHVtbkRhdGEKLSAgICAgIC8vCi0gICAgICBjaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKHdIaW50LCBoSGludCk7Ly8gOiBjaGlsZC5nZXRNaW5pbXVtU2l6ZSh3SGludCwgaEhpbnQpOwotICAgICAgICAKLSAgICAgIC8vIG5vdyB0aGF0IHRoZSBjb2x1bW5EYXRhIGhhcyBiZWVuIHBvcHVsYXRlZCB3ZSBjYW4gY29uc2lkZXIgaWYgdGhlIHJvdyBuZWVkcyB0byBiZSBsYXJnZXIKLSAgICAgIC8vCi0gICAgICBpbnQgZWZmZWN0aXZlV2lkdGggPSBjaGlsZFNpemUud2lkdGg7Ci0gICAgICBpZiAoY29sdW1uSWRlbmlmaWVyICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgY29sdW1uRGF0YS5zdHJldGNoQ29sdW1uV2lkdGhJZk5lZWRlZChjb2x1bW5JZGVuaWZpZXIsIGNoaWxkU2l6ZS53aWR0aCk7Ci0gICAgICAgIGVmZmVjdGl2ZVdpZHRoID0gY29sdW1uRGF0YS5nZXRDb2x1bW5XaWR0aChjb2x1bW5JZGVuaWZpZXIpOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBoZWlnaHQgPSBNYXRoLm1heChjaGlsZFNpemUuaGVpZ2h0LCBoZWlnaHQpOwotICAgICAgd2lkdGggKz0gZWZmZWN0aXZlV2lkdGg7Ci0gICAgfSAgCi0gICAgcmV0dXJuIG5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCk7Ci0gIH0KLSAgCi0gIAotICAKLSAgcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgY29udGFpbmVyLCBpbnQgd0hpbnQsIGludCBoSGludCkKLSAgeyAgICAKLSAgICBMaXN0IGNoaWxkcmVuID0gY29udGFpbmVyLmdldENoaWxkcmVuKCk7Ci0gICAgRGltZW5zaW9uIHByZWZTaXplID0gY2FsY3VsYXRlQ2hpbGRyZW5TaXplKGNvbnRhaW5lciwgY2hpbGRyZW4sIHdIaW50LCBoSGludCwgdHJ1ZSk7Ci0gICAgcmV0dXJuIHByZWZTaXplOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbGF5b3V0KElGaWd1cmUgcGFyZW50KQotICB7Ci0gICAgLy8gbGF5b3V0IGEgdGFibGUgd2l0aCB0aGUgY29sdW1ucyBhbGlnbmVkICAgICAgCi0gICAgLy9JUm93RmlndXJlIHJvd0ZpZ3VyZSA9IChJUm93RmlndXJlKXBhcmVudDsgICAgCi0gICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOyAgIAotICAgIExpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICBSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoKTsKLSAgICByLnggPSBjbGllbnRBcmVhLng7Ci0gICAgci55ID0gY2xpZW50QXJlYS55OwotICAgIHIuaGVpZ2h0ID0gY2xpZW50QXJlYS5oZWlnaHQ7Ci0gICAgCi0gICAgaW50IGNoaWxkcmVuU2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLSAgICBSZWN0YW5nbGVbXSBib3VuZHMgPSBuZXcgUmVjdGFuZ2xlW2NoaWxkcmVuU2l6ZV07Ci0gICAgCi0gICAgLy8gZm9yIGVhY2ggY2VsbCBpbiB0aGUgcm93Ci0gICAgLy8KLSAgICBpbnQgcmVxdWlyZWRXaWR0aCA9IDA7Ci0gICAgaW50IHRvdGFsQ29sdW1uV2VpZ2h0ID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuU2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgLy9TdHJpbmcgY29sdW1uSWRlbmlmaWVyID0gZmlndXJlLmdldENvbHVtbklkZW50aWZpZXIoY2hpbGQpOyAgICAgICAgICAgICAKLSAgICAgIC8vIGZpcnN0IHdlIGNvbXB1dGUgdGhlIGNoaWxkIHNpemUgd2l0aG91dCByZWdhcmQgZm9yIGNvbHVtbkRhdGEKLSAgICAgIC8vCi0gICAgICBEaW1lbnNpb24gY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgtMSwgLTEpOwotICAgICAgCi0gICAgICBpbnQgY29sdW1uV2lkdGggPSAtMTsKLSAgICAgIC8vU3RyaW5nIGNvbHVtbklkZW50aWZpZXIgPSByb3dGaWd1cmUuZ2V0Q29sdW1uSWRlbnRpZmllcihjaGlsZCk7Ci0gICAgICBTdHJpbmcgY29sdW1uSWRlbnRpZmllciA9IChTdHJpbmcpZ2V0Q29uc3RyYWludChjaGlsZCk7Ci0gICAgICBpZiAoY29sdW1uSWRlbnRpZmllciAhPSBudWxsKQotICAgICAgewotICAgICAgICAvL2NvbHVtbkRhdGEuc3RyZXRjaENvbHVtbldpZHRoSWZOZWVkZWQoY29sdW1uSWRlbnRpZmllciwgY2hpbGRTaXplLndpZHRoKTsgICAgICAgIAotICAgICAgICBjb2x1bW5XaWR0aCA9IGNvbHVtbkRhdGEuZ2V0Q29sdW1uV2lkdGgoY29sdW1uSWRlbnRpZmllcik7Ci0gICAgICAgIHRvdGFsQ29sdW1uV2VpZ2h0ICs9IGNvbHVtbkRhdGEuZ2V0Q29sdW1uV2VpZ2h0KGNvbHVtbklkZW50aWZpZXIpOwotICAgICAgfSAgCi0gICAgICByLndpZHRoID0gTWF0aC5tYXgoY2hpbGRTaXplLndpZHRoLCBjb2x1bW5XaWR0aCk7Ci0gICAgICByZXF1aXJlZFdpZHRoICs9IHIud2lkdGg7Ci0gICAgICBib3VuZHNbaV0gPSBuZXcgUmVjdGFuZ2xlKHIpOyAgICAgIAotICAgICAgci54ICs9IHIud2lkdGg7Ci0gICAgfSAgICAgICAgICAKLSAgICBpZiAodG90YWxDb2x1bW5XZWlnaHQgPCAxKQotICAgIHsKLSAgICAgIHRvdGFsQ29sdW1uV2VpZ2h0ID0gMTsKLSAgICB9Ci0gICAgaW50IGV4dHJhV2lkdGggPSBNYXRoLm1heChjbGllbnRBcmVhLndpZHRoIC0gcmVxdWlyZWRXaWR0aCwgMCk7ICAgIAotICAgIGludCBleHRyYVdpZHRoQWxsb2NhdGVkID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuU2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgY2hpbGRyZW4uZ2V0KGkpOyAgICAgIAotICAgICAgUmVjdGFuZ2xlIGIgPSBib3VuZHNbaV07ICAgIAotICAgICAgaWYgKGV4dHJhV2lkdGggPiAwKQotICAgICAgeyAgCi0gICAgICAgIFN0cmluZyBjb2x1bW5JZGVudGlmaWVyID0gKFN0cmluZylnZXRDb25zdHJhaW50KGNoaWxkKTsKLSAgICAgICAgaWYgKGNvbHVtbklkZW50aWZpZXIgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgCi0gICAgICAgICAgaW50IHdlaWdodCA9IGNvbHVtbkRhdGEuZ2V0Q29sdW1uV2VpZ2h0KGNvbHVtbklkZW50aWZpZXIpOwotICAgICAgICAgIGZsb2F0IGZyYWN0aW9uID0gKGZsb2F0KXdlaWdodCAvIChmbG9hdCl0b3RhbENvbHVtbldlaWdodDsKLSAgICAgICAgICBpbnQgZXh0cmFXaWR0aEZvckNoaWxkID0gKGludCkoZXh0cmFXaWR0aCAqIGZyYWN0aW9uKTsKLSAgICAgICAKLSAgICAgICAgICBiLndpZHRoICs9IGV4dHJhV2lkdGhGb3JDaGlsZDsgICAgICAgIAotICAgICAgICAgIGIueCArPSBleHRyYVdpZHRoQWxsb2NhdGVkOwotICAgICAgICAgIGV4dHJhV2lkdGhBbGxvY2F0ZWQgKz0gZXh0cmFXaWR0aEZvckNoaWxkOwotICAgICAgICB9ICAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYi54ICs9IGV4dHJhV2lkdGhBbGxvY2F0ZWQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNoaWxkLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKGIpKTsgIAotICAgIH0gIAotICB9Ci0KLSAgcHVibGljIENvbHVtbkRhdGEgZ2V0Q29sdW1uRGF0YSgpCi0gIHsKLSAgICByZXR1cm4gY29sdW1uRGF0YTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvbHVtbkRhdGEoQ29sdW1uRGF0YSBjb2x1bW5EYXRhKQotICB7Ci0gICAgdGhpcy5jb2x1bW5EYXRhID0gY29sdW1uRGF0YTsKLSAgfSAgICAKLSAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0Q29uc3RyYWludChJRmlndXJlIGNoaWxkKQotICB7Ci0gICAgcmV0dXJuIGZpZ3VyZVRvQ29udHN0cmFpbnRNYXAuZ2V0KGNoaWxkKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludChJRmlndXJlIGNoaWxkLCBPYmplY3QgY29uc3RyYWludCkKLSAgewotICAgIGZpZ3VyZVRvQ29udHN0cmFpbnRNYXAucHV0KGNoaWxkLCBjb25zdHJhaW50KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpCi0gIHsKLSAgICAvL2ZpZ3VyZVRvQ29udHN0cmFpbnRNYXAuY2xlYXIoKTsKLSAgICAvL3RoaXMuY29sdW1uRGF0YS5jbGVhckNvbHVtbldpZHRocygpOwotICAgIHN1cGVyLmludmFsaWRhdGUoKTsKLSAgIAotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlRWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9DcmVhdGVFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZjNiNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9DcmVhdGVFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuQWJzdHJhY3RFZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLy8gaXNzdWUgKGNzKSBjYW4gd2UgcmVtb3ZlIHRoaXM/Ci0vLwotcHVibGljIGNsYXNzIENyZWF0ZUVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgcHJvdGVjdGVkIEVsZW1lbnQgcGFyZW50Tm9kZTsKLQotICBwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLQotICBwcm90ZWN0ZWQgT2JqZWN0IHNvdXJjZUNvbnRleHQ7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBDcmVhdGVFbGVtZW50QWN0aW9uLgotICAgKi8KLSAgcHVibGljIENyZWF0ZUVsZW1lbnRBY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIENyZWF0ZUVsZW1lbnRBY3Rpb24uCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqLwotICBwdWJsaWMgQ3JlYXRlRWxlbWVudEFjdGlvbihTdHJpbmcgdGV4dCkKLSAgewotICAgIHN1cGVyKHRleHQpOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQ3JlYXRlRWxlbWVudEFjdGlvbi4KLSAgICogQHBhcmFtIHRleHQKLSAgICogQHBhcmFtIGltYWdlCi0gICAqLwotICBwdWJsaWMgQ3JlYXRlRWxlbWVudEFjdGlvbihTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKQotICB7Ci0gICAgc3VwZXIodGV4dCwgaW1hZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0WFNEU2NoZW1hKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uUHJvdmlkZXIoSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5zZWxlY3Rpb25Qcm92aWRlciA9IHNlbGVjdGlvblByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U291cmNlQ29udGV4dChPYmplY3Qgc291cmNlQ29udGV4dCkKLSAgewotICAgIHRoaXMuc291cmNlQ29udGV4dCA9IHNvdXJjZUNvbnRleHQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXRzIHRoZSBwYXJlbnROb2RlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBFbGVtZW50Ci0gICAqLwotICBwdWJsaWMgRWxlbWVudCBnZXRQYXJlbnROb2RlKCkKLSAgewotICAgIHJldHVybiBwYXJlbnROb2RlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHBhcmVudE5vZGUuCi0gICAqIEBwYXJhbSBwYXJlbnROb2RlIFRoZSBwYXJlbnROb2RlIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UGFyZW50Tm9kZShFbGVtZW50IHBhcmVudE5vZGUpCi0gIHsKLSAgICB0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlOwotICB9Ci0KLSAgYm9vbGVhbiBpc0dsb2JhbCA9IGZhbHNlOwotICAKLSAgcHVibGljIHZvaWQgc2V0SXNHbG9iYWwoYm9vbGVhbiBpc0dsb2JhbCkKLSAgewotICAgIHRoaXMuaXNHbG9iYWwgPSBpc0dsb2JhbDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0SXNHbG9iYWwoKQotICB7Ci0gICAgcmV0dXJuIGlzR2xvYmFsOwotICB9Ci0KLSAgcHJvdGVjdGVkIE5vZGUgcmVsYXRpdmVOb2RlOwotICBwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnRUYWc7Ci0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRUYWcoU3RyaW5nIGVsZW1lbnRUYWcpCi0gIHsKLSAgICB0aGlzLmVsZW1lbnRUYWcgPSBlbGVtZW50VGFnOwotICB9Ci0gIAotICBwdWJsaWMgRG9jdW1lbnRJbXBsIGdldERvY3VtZW50KCkKLSAgewotICAgIHJldHVybiAoRG9jdW1lbnRJbXBsKSBnZXRQYXJlbnROb2RlKCkuZ2V0T3duZXJEb2N1bWVudCgpOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKFN0cmluZyBkZXNjcmlwdGlvbikKLSAgewotICAgIGdldERvY3VtZW50KCkuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBkZXNjcmlwdGlvbik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGVuZFJlY29yZGluZygpCi0gIHsKLSAgICBEb2N1bWVudEltcGwgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLSAgICAKLSAgICBkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVBbmRBZGROZXdDaGlsZEVsZW1lbnQoKQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IHBhcmVudE5vZGUuZ2V0UHJlZml4KCk7Ci0gICAgcHJlZml4ID0gKHByZWZpeCA9PSBudWxsKSA/ICIiIDogKHByZWZpeCArICI6Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIEVsZW1lbnQgY2hpbGROb2RlID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBwcmVmaXggKyBlbGVtZW50VGFnKTsKLSAgICBpZiAoZ2V0QXR0cmlidXRlcygpICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBET01BdHRyaWJ1dGUgYXR0ciA9IChET01BdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotICAgICAgICBjaGlsZE5vZGUuc2V0QXR0cmlidXRlKGF0dHIuZ2V0TmFtZSgpLCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZ2V0UmVsYXRpdmVOb2RlKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZE5vZGUsZ2V0UmVsYXRpdmVOb2RlKCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoaXNHbG9iYWwgJiYgZ2V0UmVsYXRpdmVOb2RlKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBUZXh0IHRleHROb2RlID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG5cbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaXNHbG9iYWwgJiYgZ2V0UmVsYXRpdmVOb2RlKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBUZXh0IHRleHROb2RlID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG5cbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZSh0ZXh0Tm9kZSwgZ2V0UmVsYXRpdmVOb2RlKCkpOwotICAgIH0KLQotICAgIGZvcm1hdENoaWxkKGNoaWxkTm9kZSk7Ci0gICAgCi0gICAgcmV0dXJuIGNoaWxkTm9kZTsKLSAgfSAgICAKLSAgICAKLSAgcHJvdGVjdGVkIHZvaWQgZm9ybWF0Q2hpbGQoRWxlbWVudCBjaGlsZCkKLSAgewotICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgIElET01Nb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpY2hpbGQpLmdldE1vZGVsKCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0gICAgICAgIAotCSAgICAgIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLQkJICAgIGZvcm1hdFByb2Nlc3Nvci5mb3JtYXROb2RlKGNoaWxkKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmNoYW5nZWRNb2RlbCgpOyAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLyoKLSAgICogQHNlZSBJQWN0aW9uI3J1bigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYmVnaW5SZWNvcmRpbmcoZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgZmluYWwgRWxlbWVudCBjaGlsZCA9IGNyZWF0ZUFuZEFkZE5ld0NoaWxkRWxlbWVudCgpOwotICAgIGVuZFJlY29yZGluZygpOwotCi0gICAgaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpCi0gICAgewotICAgICAgZmluYWwgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCA9IHhzZFNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KGNoaWxkKTsKLS8vICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXApKTsKLSAgICAgIAotICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pY29tcCkuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXAuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb21wLmdldENvbnRhaW5lcigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjb21wLmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGNoaWxkLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCB0cnVlKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb21wLmdldENvbnRhaW5lcigpKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXApKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXApKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXApKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHNvdXJjZUNvbnRleHQgaW5zdGFuY2VvZiBBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyKQotICAgICAgICAgIHsKLS8vICAgICAgICAgICAgQWJzdHJhY3RFZGl0UGFydFZpZXdlciB2aWV3ZXIgPSAoQWJzdHJhY3RFZGl0UGFydFZpZXdlcilzb3VyY2VDb250ZXh0OwotICAgICAgICAgIAotLy8gICAgICAgICAgICBPYmplY3Qgb2JqID0gdmlld2VyLmdldFNlbGVjdGVkRWRpdFBhcnRzKCkuZ2V0KDApOwotICAgICAgICAgICAgCi0vLyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFbGVtZW50RGVjbGFyYXRpb25FZGl0UGFydCkKLS8vICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbSA9ICgoRWxlbWVudERlY2xhcmF0aW9uRWRpdFBhcnQpb2JqKS5nZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLS8vICAgICAgICAgICAgICAgIGlmICghZWxlbS5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotLy8gICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAoKEVsZW1lbnREZWNsYXJhdGlvbkVkaXRQYXJ0KW9iaikuZG9FZGl0TmFtZSgpOwotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNb2RlbEdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KQotLy8gICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGdyb3VwID0gKChNb2RlbEdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KW9iaikuZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKTsKLS8vICAgICAgICAgICAgICAgIGlmICghZ3JvdXAuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotLy8gICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAoKE1vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpb2JqKS5kb0VkaXROYW1lKCk7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENvbXBsZXhUeXBlRGVmaW5pdGlvbkVkaXRQYXJ0KQotLy8gICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9ICgoQ29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQpb2JqKS5nZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLS8vICAgICAgICAgICAgICAgIGlmIChjdC5nZXROYW1lKCkgIT0gbnVsbCkKLS8vICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgKChDb21wbGV4VHlwZURlZmluaXRpb25FZGl0UGFydClvYmopLmRvRWRpdE5hbWUoKTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCkKLS8vICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAoKFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQpb2JqKS5kb0VkaXROYW1lKCk7Ci0vLyAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9Ci0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnRpbWVyRXhlYyg1MCxydW5uYWJsZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHJlbGF0aXZlTm9kZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgRWxlbWVudAotICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0UmVsYXRpdmVOb2RlKCkKLSAgewotICAgIHJldHVybiByZWxhdGl2ZU5vZGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcmVsYXRpdmVOb2RlLgotICAgKiBAcGFyYW0gcmVsYXRpdmVOb2RlIFRoZSByZWxhdGl2ZU5vZGUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZU5vZGUoTm9kZSByZWxhdGl2ZU5vZGUpCi0gIHsKLSAgICB0aGlzLnJlbGF0aXZlTm9kZSA9IHJlbGF0aXZlTm9kZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBkZXNjcmlwdGlvbi4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgewotICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRUZXh0KCk7Ci0gICAgfQotICAgIHJldHVybiBkZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbi4KLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikKLSAgewotICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGF0dHJpYnV0ZXM7Ci0gIC8qKgotICAgKiBHZXRzIHRoZSBuYW1lQXR0cmlidXRlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZXMoKQotICB7Ci0gICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgYXR0cmlidXRlcy4KLSAgICogQHBhcmFtIGF0dHJpYnV0ZXMgVGhlIGF0dHJpYnV0ZXMgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKExpc3QgYXR0cmlidXRlcykKLSAgewotICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvRE9NQXR0cmlidXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0RPTUF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzRmMzVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvRE9NQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotLy8gaXNzdWUgKGNzKSByZW1vdmUgdGhpcwotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBET01BdHRyaWJ1dGUKLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBET01BdHRyaWJ1dGUuCi0gICAqLwotICBwdWJsaWMgRE9NQXR0cmlidXRlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgRE9NQXR0cmlidXRlLgotICAgKi8KLSAgcHVibGljIERPTUF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lLCB2YWx1ZTsKLSAgLyoqCi0gICAqIEdldHMgdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5hbWUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG5hbWUuCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9JWFNEVG9vbGJhckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9JWFNEVG9vbGJhckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjE5OWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvSVhTRFRvb2xiYXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotcHVibGljIGludGVyZmFjZSBJWFNEVG9vbGJhckFjdGlvbiBleHRlbmRzIElBY3Rpb24KLXsKLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yUGFydChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvTW92ZVhTREF0dHJpYnV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlWFNEQXR0cmlidXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OWEyZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlWFNEQXR0cmlidXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgTW92ZVhTREF0dHJpYnV0ZUFjdGlvbiBleHRlbmRzIE1vdmVYU0RCYXNlQWN0aW9uCi17Ci0gIHByaXZhdGUgc3RhdGljIGludCBJTlNFUlRfQkVGT1JFID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IElOU0VSVF9BRlRFUiA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGludCBJTlNFUlRfRElSRUNUID0gMjsKLSAgcHJvdGVjdGVkIExpc3Qgc2VsZWN0ZWROb2RlczsKLSAgcHJvdGVjdGVkIE5vZGUgcGFyZW50Tm9kZTsKLSAgcHJvdGVjdGVkIE5vZGUgcHJldmlvdXNSZWZDaGlsZCwgbmV4dFJlZkNoaWxkOwotICBpbnQgaW5zZXJ0VHlwZTsKLQotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnRDb21wb25lbnQ7Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudDsKLSAgYm9vbGVhbiBpbnNlcnRBdEVuZCA9IHRydWU7Ci0gIAotICBwdWJsaWMgTW92ZVhTREF0dHJpYnV0ZUFjdGlvbihYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnRDb21wb25lbnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50LCBYU0RDb25jcmV0ZUNvbXBvbmVudCBuZXh0UmVmQ2hpbGRDb21wb25lbnQpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMucGFyZW50Q29tcG9uZW50ID0gcGFyZW50Q29tcG9uZW50OwotICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDsKLSAgICB0aGlzLnByZXZpb3VzUmVmQ29tcG9uZW50ID0gcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudDsKLSAgICB0aGlzLm5leHRSZWZDb21wb25lbnQgPSBuZXh0UmVmQ2hpbGRDb21wb25lbnQ7Ci0KLSAgICBpZiAocGFyZW50Q29tcG9uZW50ID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgcGFyZW50Tm9kZSA9IHBhcmVudENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgbmV4dFJlZkNoaWxkID0gbmV4dFJlZkNoaWxkQ29tcG9uZW50ICE9IG51bGwgPyBuZXh0UmVmQ2hpbGRDb21wb25lbnQuZ2V0RWxlbWVudCgpIDogbnVsbDsKLSAgICBwcmV2aW91c1JlZkNoaWxkID0gcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudCAhPSBudWxsID8gcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudC5nZXRFbGVtZW50KCkgOiBudWxsOwotCi0gICAgaWYgKG5leHRSZWZDb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAobmV4dFJlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKSA9PSBwYXJlbnRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIGluc2VydFR5cGUgPSBJTlNFUlRfQkVGT1JFOwotICAgICAgfQotICAgIH0KLSAgICBpZiAocHJldmlvdXNSZWZDb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocHJldmlvdXNSZWZDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCkgPT0gcGFyZW50Q29tcG9uZW50KQotICAgICAgewotICAgICAgICBpbnNlcnRUeXBlID0gSU5TRVJUX0FGVEVSOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobmV4dFJlZkNoaWxkQ29tcG9uZW50ID09IG51bGwgJiYgcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc2VydFR5cGUgPSBJTlNFUlRfRElSRUNUOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIE1vdmVYU0RBdHRyaWJ1dGVBY3Rpb24oWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50Q29tcG9uZW50LCBYU0RDb25jcmV0ZUNvbXBvbmVudCBzZWxlY3RlZCwgWFNEQ29uY3JldGVDb21wb25lbnQgcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudCwgWFNEQ29uY3JldGVDb21wb25lbnQgbmV4dFJlZkNoaWxkQ29tcG9uZW50LCBib29sZWFuIGluc2VydEF0RW5kKQotICB7Ci0gICAgdGhpcyhwYXJlbnRDb21wb25lbnQsIHNlbGVjdGVkLCBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50LCBuZXh0UmVmQ2hpbGRDb21wb25lbnQpOwotICAgIHRoaXMuaW5zZXJ0QXRFbmQgPSBpbnNlcnRBdEVuZDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gY2FuTW92ZSgpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAKLSAgICBpZiAobmV4dFJlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbiB8fCBwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbiB8fCBwYXJlbnRDb21wb25lbnQgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIElBY3Rpb24jcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBpZiAocGFyZW50Q29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG1vdmVVbmRlclhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBwYXJlbnRDb21wb25lbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgbW92ZVVuZGVyWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHBhcmVudENvbXBvbmVudCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgbW92ZVVuZGVyWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBwYXJlbnRHcm91cCkKLSAgewotICAgIGludCBvcmlnaW5hbEluZGV4ID0gMDsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFyZW50R3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyaWJ1dGVHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZiAoYXR0cmlidXRlR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUgPSAoKFhTREF0dHJpYnV0ZVVzZSkgYXR0cmlidXRlR3JvdXBDb250ZW50KS5nZXRDb250ZW50KCk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gc2VsZWN0ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJlbnRHcm91cC5nZXRDb250ZW50cygpLnJlbW92ZShhdHRyaWJ1dGUuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBvcmlnaW5hbEluZGV4Kys7Ci0gICAgfQotICAgIGludCBpbmRleCA9IDA7Ci0gICAgYm9vbGVhbiBhZGRlZEJhY2sgPSBmYWxzZTsKLSAgICBpZiAoaW5zZXJ0VHlwZSA9PSBJTlNFUlRfRElSRUNUKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbnRhaW5lciA9IHNlbGVjdGVkLmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoaW5zZXJ0QXRFbmQpCi0gICAgICAgICAgKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHBhcmVudENvbXBvbmVudCkuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKS5nZXRDb250ZW50cygpLmFkZChjb250YWluZXIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHBhcmVudENvbXBvbmVudCkuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKS5nZXRDb250ZW50cygpLmFkZCgwLCBjb250YWluZXIpOwotICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExpc3QgYXR0cmlidXRlR3JvdXBDb250ZW50cyA9IHBhcmVudEdyb3VwLmdldENvbnRlbnRzKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGF0dHJpYnV0ZUdyb3VwQ29udGVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0cmlidXRlR3JvdXBDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgaWYgKGF0dHJpYnV0ZUdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlID0gKChYU0RBdHRyaWJ1dGVVc2UpIGF0dHJpYnV0ZUdyb3VwQ29udGVudCkuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAoaW5zZXJ0VHlwZSA9PSBJTlNFUlRfQkVGT1JFKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBuZXh0UmVmQ29tcG9uZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBhcmVudEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGluZGV4LCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChzZWxlY3RlZCA9PSBuZXh0UmVmQ29tcG9uZW50ICYmIG9yaWdpbmFsSW5kZXggPT0gaW5kZXgpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFyZW50R3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaW5zZXJ0VHlwZSA9PSBJTlNFUlRfQUZURVIpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlID09IHByZXZpb3VzUmVmQ29tcG9uZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBhcmVudEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGluZGV4ICsgMSwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoc2VsZWN0ZWQgPT0gcHJldmlvdXNSZWZDb21wb25lbnQgJiYgb3JpZ2luYWxJbmRleCA9PSBpbmRleCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJlbnRHcm91cC5nZXRDb250ZW50cygpLmFkZChpbmRleCwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5kZXgrKzsKLSAgICB9Ci0gICAgaWYgKGF0dHJpYnV0ZUdyb3VwQ29udGVudHMuc2l6ZSgpID09IDApCi0gICAgewotICAgICAgcGFyZW50R3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIWFkZGVkQmFjaykKLSAgICB7Ci0gICAgICBwYXJlbnRHcm91cC5nZXRDb250ZW50cygpLmFkZChvcmlnaW5hbEluZGV4LCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgbW92ZVVuZGVyWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSkKLSAgewotICAgIGludCBvcmlnaW5hbEluZGV4ID0gMDsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29tcGxleFR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyaWJ1dGVHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZiAoYXR0cmlidXRlR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUgPSAoKFhTREF0dHJpYnV0ZVVzZSkgYXR0cmlidXRlR3JvdXBDb250ZW50KS5nZXRDb250ZW50KCk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gc2VsZWN0ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21wbGV4VHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpLnJlbW92ZShhdHRyaWJ1dGUuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBvcmlnaW5hbEluZGV4Kys7Ci0gICAgfQotICAgIGludCBpbmRleCA9IDA7Ci0gICAgYm9vbGVhbiBhZGRlZEJhY2sgPSBmYWxzZTsKLSAgICBMaXN0IGF0dHJpYnV0ZUdyb3VwQ29udGVudHMgPSBjb21wbGV4VHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhdHRyaWJ1dGVHcm91cENvbnRlbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJpYnV0ZUdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmIChhdHRyaWJ1dGVHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9ICgoWFNEQXR0cmlidXRlVXNlKSBhdHRyaWJ1dGVHcm91cENvbnRlbnQpLmdldENvbnRlbnQoKTsKLSAgICAgICAgaWYgKGluc2VydFR5cGUgPT0gSU5TRVJUX0FGVEVSKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBwcmV2aW91c1JlZkNvbXBvbmVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb21wbGV4VHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpLmFkZChpbmRleCArIDEsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaW5zZXJ0VHlwZSA9PSBJTlNFUlRfQkVGT1JFKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBuZXh0UmVmQ29tcG9uZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuYWRkKGluZGV4LCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRleCsrOwotICAgIH0KLSAgICBpZiAoYXR0cmlidXRlR3JvdXBDb250ZW50cy5zaXplKCkgPT0gMCkKLSAgICB7Ci0gICAgICBjb21wbGV4VHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpLmFkZChzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgIH0KLQotICAgIGlmICghYWRkZWRCYWNrKQotICAgIHsKLSAgICAgIGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuYWRkKG9yaWdpbmFsSW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlWFNEQmFzZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlWFNEQmFzZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmQ5OTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvTW92ZVhTREJhc2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLQotcHVibGljIGNsYXNzIE1vdmVYU0RCYXNlQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0KLSAgcHVibGljIE1vdmVYU0RCYXNlQWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5Nb3ZlKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvTW92ZVhTREVsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvTW92ZVhTREVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3M2ZmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01vdmVYU0RFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBNb3ZlWFNERWxlbWVudEFjdGlvbiBleHRlbmRzIE1vdmVYU0RCYXNlQWN0aW9uCi17Ci0gIHByaXZhdGUgc3RhdGljIGludCBJTlNFUlRfQkVGT1JFID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IElOU0VSVF9BRlRFUiA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGludCBJTlNFUlRfRElSRUNUID0gMjsKLSAgcHJvdGVjdGVkIExpc3Qgc2VsZWN0ZWROb2RlczsKLSAgcHJvdGVjdGVkIE5vZGUgcGFyZW50Tm9kZTsKLSAgcHJvdGVjdGVkIE5vZGUgcHJldmlvdXNSZWZDaGlsZCwgbmV4dFJlZkNoaWxkOwotICBpbnQgaW5zZXJ0VHlwZTsKLQotICBYU0RNb2RlbEdyb3VwIHBhcmVudE1vZGVsR3JvdXA7Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudDsKLSAgYm9vbGVhbiBpbnNlcnRBdEVuZCA9IHRydWU7Ci0KLSAgcHVibGljIE1vdmVYU0RFbGVtZW50QWN0aW9uKFhTRE1vZGVsR3JvdXAgcGFyZW50Q29tcG9uZW50LCBYU0RDb25jcmV0ZUNvbXBvbmVudCBzZWxlY3RlZCwgWFNEQ29uY3JldGVDb21wb25lbnQgcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudCwgWFNEQ29uY3JldGVDb21wb25lbnQgbmV4dFJlZkNoaWxkQ29tcG9uZW50KQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLnBhcmVudE1vZGVsR3JvdXAgPSBwYXJlbnRDb21wb25lbnQ7Ci0gICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkOwotICAgIHRoaXMucHJldmlvdXNSZWZDb21wb25lbnQgPSBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50OwotICAgIHRoaXMubmV4dFJlZkNvbXBvbmVudCA9IG5leHRSZWZDaGlsZENvbXBvbmVudDsKLQotICAgIGlmIChwYXJlbnRDb21wb25lbnQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBwYXJlbnROb2RlID0gcGFyZW50Q29tcG9uZW50LmdldEVsZW1lbnQoKTsKLSAgICBuZXh0UmVmQ2hpbGQgPSBuZXh0UmVmQ2hpbGRDb21wb25lbnQgIT0gbnVsbCA/IG5leHRSZWZDaGlsZENvbXBvbmVudC5nZXRFbGVtZW50KCkgOiBudWxsOwotICAgIHByZXZpb3VzUmVmQ2hpbGQgPSBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50ICE9IG51bGwgPyBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50LmdldEVsZW1lbnQoKSA6IG51bGw7Ci0KLSAgICBpZiAobmV4dFJlZkNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChuZXh0UmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpID09IHBhcmVudE1vZGVsR3JvdXApCi0gICAgICB7Ci0gICAgICAgIGluc2VydFR5cGUgPSBJTlNFUlRfQkVGT1JFOwotICAgICAgfQotICAgIH0KLSAgICBpZiAocHJldmlvdXNSZWZDb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocHJldmlvdXNSZWZDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCkgPT0gcGFyZW50TW9kZWxHcm91cCkKLSAgICAgIHsKLSAgICAgICAgaW5zZXJ0VHlwZSA9IElOU0VSVF9BRlRFUjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5leHRSZWZDaGlsZENvbXBvbmVudCA9PSBudWxsICYmIHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnNlcnRUeXBlID0gSU5TRVJUX0RJUkVDVDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgTW92ZVhTREVsZW1lbnRBY3Rpb24oWFNETW9kZWxHcm91cCBwYXJlbnRDb21wb25lbnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50LCBYU0RDb25jcmV0ZUNvbXBvbmVudCBuZXh0UmVmQ2hpbGRDb21wb25lbnQsIGJvb2xlYW4gaW5zZXJ0QXRFbmQpCi0gIHsKLSAgICB0aGlzKHBhcmVudENvbXBvbmVudCwgc2VsZWN0ZWQsIHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQsIG5leHRSZWZDaGlsZENvbXBvbmVudCk7Ci0gICAgdGhpcy5pbnNlcnRBdEVuZCA9IGluc2VydEF0RW5kOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBjYW5Nb3ZlKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgIAotICAgIGlmIChuZXh0UmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gfHwgcHJldmlvdXNSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB8fCBwYXJlbnRNb2RlbEdyb3VwID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBJQWN0aW9uI3J1bigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaW50IG9yaWdpbmFsSW5kZXggPSAwOwotICAgIGZvciAoSXRlcmF0b3IgcGFydGljbGVzID0gcGFyZW50TW9kZWxHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IHBhcnRpY2xlcy5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBwYXJ0aWNsZXMubmV4dCgpOwotICAgICAgWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlQ29udGVudCA9IHBhcnRpY2xlLmdldENvbnRlbnQoKTsKLSAgICAgIGlmIChwYXJ0aWNsZUNvbnRlbnQgPT0gc2VsZWN0ZWQpCi0gICAgICB7Ci0gICAgICAgIHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5yZW1vdmUocGFydGljbGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIG9yaWdpbmFsSW5kZXgrKzsKLSAgICB9Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBib29sZWFuIGFkZGVkQmFjayA9IGZhbHNlOwotICAgIGlmIChpbnNlcnRUeXBlID09IElOU0VSVF9ESVJFQ1QpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29udGFpbmVyID0gc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbnRhaW5lcjIgPSBjb250YWluZXIuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIGlmIChjb250YWluZXIyIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgewotICAgICAgICAgICgoWFNETW9kZWxHcm91cCkgY29udGFpbmVyMikuZ2V0Q29udGVudHMoKS5yZW1vdmUoY29udGFpbmVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5zZXJ0QXRFbmQpCi0gICAgICAgICAgcGFyZW50TW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZChjb250YWluZXIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcGFyZW50TW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZCgwLCBjb250YWluZXIpOwotICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExpc3QgcGFydGljbGVzID0gcGFyZW50TW9kZWxHcm91cC5nZXRDb250ZW50cygpOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJ0aWNsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlQ29udGVudCA9IHBhcnRpY2xlLmdldENvbnRlbnQoKTsKLSAgICAgIGlmIChpbnNlcnRUeXBlID09IElOU0VSVF9CRUZPUkUpCi0gICAgICB7Ci0gICAgICAgIGlmIChwYXJ0aWNsZUNvbnRlbnQgPT0gbmV4dFJlZkNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RlZCA9PSBuZXh0UmVmQ29tcG9uZW50ICYmIG9yaWdpbmFsSW5kZXggPT0gaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGluZGV4LCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5zZXJ0VHlwZSA9PSBJTlNFUlRfQUZURVIpCi0gICAgICB7Ci0gICAgICAgIGlmIChwYXJ0aWNsZUNvbnRlbnQgPT0gcHJldmlvdXNSZWZDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGluZGV4ICsgMSwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdGVkID09IHByZXZpb3VzUmVmQ29tcG9uZW50ICYmIG9yaWdpbmFsSW5kZXggPT0gaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGluZGV4LCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5kZXgrKzsKLSAgICB9Ci0gICAgaWYgKHBhcnRpY2xlcy5zaXplKCkgPT0gMCkKLSAgICB7Ci0gICAgICBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFhZGRlZEJhY2spCi0gICAgewotICAgICAgcGFyZW50TW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZChvcmlnaW5hbEluZGV4LCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL1hTREVkaXROYW1lc3BhY2VzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL1hTREVkaXROYW1lc3BhY2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNTczYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9YU0RFZGl0TmFtZXNwYWNlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSW5mb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuWE1MQ29tbW9uUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLm5zZWRpdC5TY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubnNlZGl0LlRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aWRnZXRzLlhTREVkaXRTY2hlbWFJbmZvRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgWFNERWRpdE5hbWVzcGFjZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0gIHByaXZhdGUgU3RyaW5nIHJlc291cmNlTG9jYXRpb247Ci0gIHByaXZhdGUgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgcHJpdmF0ZSBET01OYW1lc3BhY2VJbmZvTWFuYWdlciBuYW1lc3BhY2VJbmZvTWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotCi0gIHB1YmxpYyBYU0RFZGl0TmFtZXNwYWNlc0FjdGlvbihTdHJpbmcgbGFiZWwsIEVsZW1lbnQgZWxlbWVudCwgTm9kZSBub2RlKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRUZXh0KGxhYmVsKTsKLQotICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLyBUaGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQuLi4uCi0gICAgdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gImR1bW15IjsKLSAgfQotCi0gIHB1YmxpYyBYU0RFZGl0TmFtZXNwYWNlc0FjdGlvbihTdHJpbmcgbGFiZWwsIEVsZW1lbnQgZWxlbWVudCwgTm9kZSBub2RlLCBYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgdGhpcyhsYWJlbCwgZWxlbWVudCwgbm9kZSk7Ci0gICAgeHNkU2NoZW1hID0gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgU2hlbGwgc2hlbGwgPSBYTUxDb21tb25SZXNvdXJjZXMuZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgIH0KLSAgICAgIFhTREVkaXRTY2hlbWFJbmZvRGlhbG9nIGRpYWxvZyA9IG5ldyBYU0RFZGl0U2NoZW1hSW5mb0RpYWxvZyhzaGVsbCwgbmV3IFBhdGgocmVzb3VyY2VMb2NhdGlvbiksIHRhcmdldE5hbWVzcGFjZSk7Ci0KLSAgICAgIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTWFuYWdlci5nZXROYW1lc3BhY2VJbmZvTGlzdChlbGVtZW50KTsKLSAgICAgIExpc3Qgb2xkTmFtZXNwYWNlSW5mb0xpc3QgPSBOYW1lc3BhY2VJbmZvLmNsb25lTmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotCi0gICAgICAvLyBoZXJlIHdlIHN0b3JlIGEgY29weSBvZiB0aGUgb2xkIGluZm8gZm9yIGVhY2ggTmFtZXNwYWNlSW5mbwotICAgICAgLy8gdGhpcyBpbmZvIHdpbGwgYmUgdXNlZCBpbiBjcmVhdGVQcmVmaXhNYXBwaW5nKCkgdG8gZmlndXJlIG91dCBob3cgdG8KLSAgICAgIC8vIHVwZGF0ZSB0aGUgZG9jdW1lbnQgaW4gcmVzcG9uc2UgdG8gdGhlc2UgY2hhbmdlcwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0gICAgICAgIE5hbWVzcGFjZUluZm8gb2xkQ29weSA9IG5ldyBOYW1lc3BhY2VJbmZvKGluZm8pOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KCJvbGRDb3B5Iiwgb2xkQ29weSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQotICAgICAgZGlhbG9nLnNldE5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNTAwLCA0MDApOwotICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChYTUxDb21tb25SZXNvdXJjZXMuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9NRU5VX0VESVRfU0NIRU1BX0lORk9STUFUSU9OX1RJVExFIikpOyAvLyROT04tTkxTLTEkCi0gICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICBkaWFsb2cub3BlbigpOwotCi0gICAgICBTdHJpbmcgeHNkUHJlZml4ID0gbnVsbDsgLy8kTk9OLU5MUy0xJAotICAgICAgU3RyaW5nIG9yaWdYU0RQcmVmaXggPSB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKTsKLSAgICAgIFN0cmluZyBuZXdUTlNQcmVmaXggPSAiIjsKLQotICAgICAgaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKQotICAgICAgewotICAgICAgICBFbGVtZW50IHhzZFNjaGVtYUVsZW1lbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgICBEb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCkgeHNkU2NoZW1hRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0KLSAgICAgICAgTGlzdCBuZXdJbmZvTGlzdCA9IGRpYWxvZy5nZXROYW1lc3BhY2VJbmZvTGlzdCgpOwotCi0gICAgICAgIC8vIHNlZSBpZiB3ZSBuZWVkIHRvIHJlbmFtZSBhbnkgcHJlZml4ZXMKLSAgICAgICAgTWFwIHByZWZpeE1hcHBpbmcgPSBjcmVhdGVQcmVmaXhNYXBwaW5nKG9sZE5hbWVzcGFjZUluZm9MaXN0LCBuYW1lc3BhY2VJbmZvTGlzdCk7Ci0KLSAgICAgICAgU3RyaW5nIG9yaWdUTlNQcmVmaXggPSBudWxsOwotICAgICAgICBNYXAgb3JpZ1ByZWZpeE1hcCA9IHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9yaWdQcmVmaXhNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgIFN0cmluZyBucyA9IChTdHJpbmcpIG9yaWdQcmVmaXhNYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgaWYgKCh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCAmJiBucyA9PSBudWxsKSB8fCB0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCAmJiB0YXJnZXROYW1lc3BhY2UuZXF1YWxzKG5zKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvcmlnVE5TUHJlZml4ID0ga2V5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE1hcCBtYXAyID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdJbmZvTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIG5pID0gKE5hbWVzcGFjZUluZm8pIGl0ZXIubmV4dCgpOwotICAgICAgICAgIFN0cmluZyBwcmVmID0gbmkucHJlZml4OwotICAgICAgICAgIFN0cmluZyB1cmkgPSBuaS51cmk7Ci0gICAgICAgICAgaWYgKHByZWYgPT0gbnVsbCkKLSAgICAgICAgICAgIHByZWYgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHVyaSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKFhTRENvbnN0YW50cy5pc1NjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSh1cmkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFByZWZpeCA9IHByZWY7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICh1cmkuZXF1YWxzKGRpYWxvZy5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgbmV3VE5TUHJlZml4ID0gcHJlZjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbWFwMi5wdXQocHJlZiwgdXJpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXAyLnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0KLSAgICAgICAgICAgIGRvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9OQU1FU1BBQ0VfQ0hBTkdFIikpOwotICAgICAgICAgICAgYm9vbGVhbiB0YXJnZXROYW1lc3BhY2VDaGFuZ2VkID0gKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsICYmICF0YXJnZXROYW1lc3BhY2UuZXF1YWxzKGRpYWxvZy5nZXRUYXJnZXROYW1lc3BhY2UoKSkgfHwgdGFyZ2V0TmFtZXNwYWNlID09IG51bGwgJiYgZGlhbG9nLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpOwotICAgICAgICAgICAgYm9vbGVhbiB0bnNQcmVmaXhDaGFuZ2VkID0gIW5ld1ROU1ByZWZpeC5lcXVhbHMob3JpZ1ROU1ByZWZpeCk7Ci0gICAgICAgICAgICBib29sZWFuIHhzZFByZWZpeENoYW5nZWQgPSAoIShvcmlnWFNEUHJlZml4ID09IG51bGwgJiYgeHNkUHJlZml4LmVxdWFscygiIikpIHx8IChvcmlnWFNEUHJlZml4ICE9IG51bGwgJiYgIW9yaWdYU0RQcmVmaXguZXF1YWxzKHhzZFByZWZpeCkpKTsKLQotICAgICAgICAgICAgeHNkU2NoZW1hLnNldEluY3JlbWVudGFsVXBkYXRlKGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gRmlyc3QgaGFuZGxlIHRoZSBwcmVmaXggY2hhbmdlIGZvciB0aGUgdGFyZ2V0IG5hbWVzcGFjZQotICAgICAgICAgICAgaWYgKHRuc1ByZWZpeENoYW5nZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHByZWZpeE1hcHBpbmcucmVtb3ZlKG9yaWdUTlNQcmVmaXgpOwotICAgICAgICAgICAgICBVcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9OQU1FU1BBQ0VfSU5GT1JNQVRJT05fQ0hBTkdFLCB4c2RTY2hlbWEsIG5ld1ROU1ByZWZpeCwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgICAgICAgIHhzZFNjaGVtYS51cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFNlY29uZCwgaGFuZGxlIHRoZSB0YXJnZXQgbmFtZXNwYWNlIGNoYW5nZQotICAgICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZUNoYW5nZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIHNldCB0aGUgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZQotICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0VGFyZ2V0TmFtZXNwYWNlKGRpYWxvZy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0KLSAgICAgICAgICAgICAgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlciB0YXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyID0gbmV3IFRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIoeHNkU2NoZW1hLCB0YXJnZXROYW1lc3BhY2UsIGRpYWxvZy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIucmVzb2x2ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIE5vdyBoYW5kbGUgdGhlIG90aGVyIGNoYW5nZXMuIFByZWZpeE1hcHBpbmcgc2l6ZSBzaG91bGQgYmUKLSAgICAgICAgICAgIC8vIGdyZWF0ZXIgdGhhbiAwIGZvciBhbnkgcmVtYWluaW5nIHByZWZpeCBjaGFuZ2VzCi0KLSAgICAgICAgICAgIGlmIChwcmVmaXhNYXBwaW5nLnNpemUoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHByZWZpeE1hcHBpbmcua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9sZFByZWZpeCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdQcmVmaXggPSAoU3RyaW5nKSBwcmVmaXhNYXBwaW5nLmdldChvbGRQcmVmaXgpOwotCi0gICAgICAgICAgICAgICAgLy8gTm93IHVwZGF0ZSBhbnkgcmVmZXJlbmNlcyB0byB0aGlzIG9sZCBwcmVmaXggaW4gdGhlIHNjaGVtYQotICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBuZXcgcHJlZml4Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZykgb3JpZ1ByZWZpeE1hcC5nZXQob2xkUHJlZml4KTsKLSAgICAgICAgICAgICAgICBTY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyIHNwY2ggPSBuZXcgU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlcih4c2RTY2hlbWEsIG5ld1ByZWZpeCwgbnMgIT0gbnVsbD8gbnMgOiAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBzcGNoLnJlc29sdmUoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIucmVtb3ZlTmFtZXNwYWNlSW5mbyhlbGVtZW50KTsKLSAgICAgICAgICAgIG5hbWVzcGFjZUluZm9NYW5hZ2VyLmFkZE5hbWVzcGFjZUluZm8oZWxlbWVudCwgbmV3SW5mb0xpc3QsIGZhbHNlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVGhpcmQsIGhhbmRsZSB0aGUgc2NoZW1hIGZvciBzY2hlbWEgcHJlZml4IGNoYW5nZQotICAgICAgICAgICAgaWYgKHhzZFByZWZpeENoYW5nZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICh4c2RQcmVmaXggIT0gbnVsbCAmJiB4c2RQcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhzZFNjaGVtYS5zZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeChudWxsKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoeHNkUHJlZml4KTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIG5hbWVzcGFjZUluZm9NYW5hZ2VyLnJlbW92ZU5hbWVzcGFjZUluZm8oZWxlbWVudCk7Ci0gICAgICAgICAgICAgIG5hbWVzcGFjZUluZm9NYW5hZ2VyLmFkZE5hbWVzcGFjZUluZm8oZWxlbWVudCwgbmV3SW5mb0xpc3QsIGZhbHNlKTsKLSAgICAgICAgICAgICAgeHNkU2NoZW1hLnNldEluY3JlbWVudGFsVXBkYXRlKHRydWUpOwotCi0gICAgICAgICAgICAgIC8vIE5vdyBjaGFuZ2UgdGhlIHJlZmVyZW5jZXMgdG8gYW55IHNjaGVtYSB0eXBlcy9jb21wb25lbnRzIGllLiBzdHJpbmcgLS0+IHhzOnN0cmluZwotICAgICAgICAgICAgICBTY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyIHNwY2ggPSBuZXcgU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlcih4c2RTY2hlbWEsIHhzZFByZWZpeCk7Ci0gICAgICAgICAgICAgIHNwY2gucmVzb2x2ZSgpOwotCi0gICAgICAgICAgICAgIC8vIENoYW5nZSB0aGUgcHJlZml4IGZvciBhbGwgc2NoZW1hIGNvbXBvbmVudHMKLSAgICAgICAgICAgICAgdXBkYXRlQWxsTm9kZXMoZWxlbWVudCwgeHNkUHJlZml4KTsKLQotICAgICAgICAgICAgICBwcmVmaXhNYXBwaW5nLnJlbW92ZShvcmlnWFNEUHJlZml4ICE9IG51bGw/IG9yaWdYU0RQcmVmaXggOiAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhzZFNjaGVtYS5zZXRJbmNyZW1lbnRhbFVwZGF0ZSh0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZmluYWxseQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNjaGVtYS51cGRhdGUoKTsKLSAgICAgICAgICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgTWFwIGNyZWF0ZVByZWZpeE1hcHBpbmcoTGlzdCBvbGRMaXN0LCBMaXN0IG5ld0xpc3QpCi0gIHsKLSAgICBNYXAgbWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgSGFzaHRhYmxlIG9sZFVSSVRvUHJlZml4VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gb2xkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotICAgICAgb2xkVVJJVG9QcmVmaXhUYWJsZS5wdXQob2xkSW5mby51cmksIG9sZEluZm8pOwotICAgIH0KLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IG5ld0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE5hbWVzcGFjZUluZm8gbmV3SW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLSAgICAgIE5hbWVzcGFjZUluZm8gb2xkSW5mbyA9IChOYW1lc3BhY2VJbmZvKSBvbGRVUklUb1ByZWZpeFRhYmxlLmdldChuZXdJbmZvLnVyaSAhPSBudWxsID8gbmV3SW5mby51cmkgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgLy8gaWYgb2xkSW5mbyBpcyBub24gbnVsbCAuLi4gdGhlcmUncyBhIG1hdGNoaW5nIFVSSSBpbiB0aGUgb2xkIHNldAotICAgICAgLy8gd2UgY2FuIHVzZSBpdHMgcHJlZml4IHRvIGRldGVtaW5lIG91dCBtYXBwaW5nCi0gICAgICAvLwotICAgICAgLy8gaWYgb2xkSW5mbyBpcyBudWxsIC4uLiB3ZSB1c2UgdGhlICdvbGRDb3B5JyB3ZSBzdGFzaGVkIGF3YXkKLSAgICAgIC8vIGFzc3VtaW5nIHRoYXQgdGhlIHVzZXIgY2hhbmdlZCB0aGUgVVJJIGFuZCB0aGUgcHJlZml4Ci0gICAgICBpZiAob2xkSW5mbyA9PSBudWxsKQotICAgICAgewotICAgICAgICBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pIG5ld0luZm8uZ2V0UHJvcGVydHkoIm9sZENvcHkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotCi0gICAgICBpZiAob2xkSW5mbyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3UHJlZml4ID0gbmV3SW5mby5wcmVmaXggIT0gbnVsbCA/IG5ld0luZm8ucHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIG9sZFByZWZpeCA9IG9sZEluZm8ucHJlZml4ICE9IG51bGwgPyBvbGRJbmZvLnByZWZpeCA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICghb2xkUHJlZml4LmVxdWFscyhuZXdQcmVmaXgpKQotICAgICAgICB7Ci0gICAgICAgICAgbWFwLnB1dChvbGRQcmVmaXgsIG5ld1ByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVBbGxOb2RlcyhFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBlbGVtZW50LnNldFByZWZpeChwcmVmaXgpOwotICAgIE5vZGVMaXN0IGxpc3QgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBOb2RlIGNoaWxkID0gbGlzdC5pdGVtKGkpOwotICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZC5zZXRQcmVmaXgocHJlZml4KTsKLSAgICAgICAgICBpZiAoY2hpbGQuaGFzQ2hpbGROb2RlcygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUFsbE5vZGVzKChFbGVtZW50KSBjaGlsZCwgcHJlZml4KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvQ2F0ZWdvcnlBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9DYXRlZ29yeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q5OTVlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9DYXRlZ29yeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSU1vZGVsUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJTW9kZWxQcm94eSwgSUFjdGlvblByb3ZpZGVyLCBJQURUT2JqZWN0TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyB0ZXh0OwotICBwcm90ZWN0ZWQgSW1hZ2UgaW1hZ2U7Ci0gIHByb3RlY3RlZCBPYmplY3QgcGFyZW50OwotICBwcm90ZWN0ZWQgaW50IGdyb3VwVHlwZTsKLSAgcHJvdGVjdGVkIENvbGxlY3Rpb24gY2hpbGRyZW4sIGFsbENoaWxkcmVuOyAgLy8gY2hpbGRyZW4gZnJvbSBjdXJyZW50IHNjaGVtYSwgY2hpbGRyZW4gZnJvbSBjdXJyZW50IHNjaGVtYSBhbmQgaW5jbHVkZXMKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLQotICBwdWJsaWMgQ2F0ZWdvcnlBZGFwdGVyKFN0cmluZyBsYWJlbCwgSW1hZ2UgaW1hZ2UsIENvbGxlY3Rpb24gY2hpbGRyZW4sIFhTRFNjaGVtYSB4c2RTY2hlbWEsIGludCBncm91cFR5cGUpCi0gIHsKLSAgICB0aGlzLnRleHQgPSBsYWJlbDsKLSAgICB0aGlzLmltYWdlID0gaW1hZ2U7Ci0gICAgdGhpcy5wYXJlbnQgPSB4c2RTY2hlbWE7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gICAgdGhpcy50YXJnZXQgPSB4c2RTY2hlbWE7Ci0gICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotICAgIHRoaXMuZ3JvdXBUeXBlID0gZ3JvdXBUeXBlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQVRUUklCVVRFUyA9IDE7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVMRU1FTlRTID0gMjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVFlQRVMgPSAzOwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBHUk9VUFMgPSA1OwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBESVJFQ1RJVkVTID0gNjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTk9UQVRJT05TID0gNzsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQVRUUklCVVRFX0dST1VQUyA9IDg7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElERU5USVRZX0NPTlNUUkFJTlRTID0gOTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQU5OT1RBVElPTlMgPSAxMDsKLQotICBwdWJsaWMgWFNEU2NoZW1hIGdldFhTRFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4geHNkU2NoZW1hOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRHcm91cFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGdyb3VwVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICByZXR1cm4gaW1hZ2U7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgcmV0dXJuIHRleHQ7Ci0gIH0KLQotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgcmV0dXJuIChJVHJlZUVsZW1lbnRbXSkgY2hpbGRyZW4udG9BcnJheShuZXcgSVRyZWVFbGVtZW50WzBdKTsKLSAgfQotICAKLSAgcHVibGljIElUcmVlRWxlbWVudFtdIGdldEFsbENoaWxkcmVuKCkKLSAgewotICAgIHJldHVybiAoSVRyZWVFbGVtZW50W10pIGFsbENoaWxkcmVuLnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihDb2xsZWN0aW9uIGxpc3QpCi0gIHsKLSAgICBjaGlsZHJlbiA9IGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBbGxDaGlsZHJlbihDb2xsZWN0aW9uIGxpc3QpCi0gIHsKLSAgICBhbGxDaGlsZHJlbiA9IGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkKLSAgewotICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICB7Ci0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsgICAgCi0gICAgQ29sbGVjdGlvbiBhY3Rpb25JRHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgc3dpdGNoIChncm91cFR5cGUpCi0gICAgewotICAgICAgY2FzZSBUWVBFUyA6IHsKLSAgICAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25BY3Rpb24uSUQpOwotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWN0aW9uLklEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEVMRU1FTlRTIDogewotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTREVsZW1lbnRBY3Rpb24uSUQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgR1JPVVBTIDogewotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uLk1PREVMR1JPVVBERUZJTklUSU9OX0lEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEFUVFJJQlVURVMgOiB7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uSUQpOwotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbi5JRCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBBVFRSSUJVVEVfR1JPVVBTIDogewotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbi5JRCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBESVJFQ1RJVkVTIDogewotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbi5JTkNMVURFX0lEKTsKLSAgICAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24uSU1QT1JUX0lEKTsKLSAgICAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24uUkVERUZJTkVfSUQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgYWN0aW9uSURzLmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotICAgIHJldHVybiAoU3RyaW5nIFtdKWFjdGlvbklEcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgaWYgKGdldFRleHQoKS5lcXVhbHMocHJvcGVydHkpKQotICAgICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIHByb3BlcnR5KTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFR5cGVzKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICByZXR1cm4gKElNb2RlbClYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KHhzZFNjaGVtYSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1JlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9SZWRlZmluZUNhdGVnb3J5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2U4YzkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1JlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRFJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEUmVkZWZpbmVkQ29tcGxleFR5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RSZWRlZmluZWRNb2RlbEdyb3VwQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEUmVkZWZpbmVkU2ltcGxlVHlwZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci0KLQotcHVibGljIGNsYXNzIFJlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyIGV4dGVuZHMgQ2F0ZWdvcnlBZGFwdGVyCi17Ci0gIHByb3RlY3RlZCBYU0RSZWRlZmluZSB4c2RSZWRlZmluZTsKLSAgcHJpdmF0ZSBYU0RSZWRlZmluZUFkYXB0ZXIgeHNkUmVkZWZpbmVBZGFwdGVyOwotCi0gIHB1YmxpYyBSZWRlZmluZUNhdGVnb3J5QWRhcHRlcihTdHJpbmcgbGFiZWwsIEltYWdlIGltYWdlLCBDb2xsZWN0aW9uIGNoaWxkcmVuLCBYU0RSZWRlZmluZSB4c2RSZWRlZmluZSwgWFNEUmVkZWZpbmVBZGFwdGVyIHhzZFJlZGVmaW5lQWRhcHRlciwgaW50IGdyb3VwVHlwZSkKLSAgewotICAgIHN1cGVyKGxhYmVsLCBpbWFnZSwgY2hpbGRyZW4sIHhzZFJlZGVmaW5lLmdldFNjaGVtYSgpLCBncm91cFR5cGUpOwotICAgIHRoaXMueHNkUmVkZWZpbmUgPSB4c2RSZWRlZmluZTsKLSAgICB0aGlzLnRhcmdldCA9IHhzZFJlZGVmaW5lOwotICAgIHRoaXMueHNkUmVkZWZpbmVBZGFwdGVyID0geHNkUmVkZWZpbmVBZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIFhTRFJlZGVmaW5lIGdldFhTRFJlZGVmaW5lKCkKLSAgewotICAgIHJldHVybiB4c2RSZWRlZmluZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBDb2xsZWN0aW9uIGFjdGlvbklEcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHN3aXRjaCAoZ3JvdXBUeXBlKQotICAgIHsKLSAgICAgIGNhc2UgVFlQRVM6Ci0gICAgICB7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEUmVkZWZpbmVkQ29tcGxleFR5cGVBY3Rpb24uSUQpOwotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRFJlZGVmaW5lZFNpbXBsZVR5cGVBY3Rpb24uSUQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgR1JPVVBTOgotICAgICAgewotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRFJlZGVmaW5lZE1vZGVsR3JvdXBBY3Rpb24uSUQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQVRUUklCVVRFUzoKLSAgICAgIGNhc2UgQVRUUklCVVRFX0dST1VQUzoKLSAgICAgIHsKLSAgICAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RSZWRlZmluZWRBdHRyaWJ1dGVHcm91cEFjdGlvbi5JRCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBhY3Rpb25JRHMuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0gICAgcmV0dXJuIChTdHJpbmdbXSlhY3Rpb25JRHMudG9BcnJheShuZXcgU3RyaW5nIFswXSk7Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiAoSU1vZGVsKVhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoeHNkUmVkZWZpbmUuZ2V0U2NoZW1hKCkpOwotICB9Ci0KLQotICBwdWJsaWMgWFNEUmVkZWZpbmVBZGFwdGVyIGdldFhzZFJlZGVmaW5lQWRhcHRlcigpIHsKLQlyZXR1cm4geHNkUmVkZWZpbmVBZGFwdGVyOwotICB9Ci0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDVjZTAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERW51bWVyYXRpb25GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2g7Ci0KLXB1YmxpYyBjbGFzcyBYU0RBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotewotICBwcm90ZWN0ZWQgc3RhdGljIFhTREFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlOwotICAKLSAgcHVibGljIHN0YXRpYyBYU0RBZGFwdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBmaXJzdCB1c2UgdGhlIG9uZSBkZWZpbmVkIGJ5IHRoZSBjb25maWd1cmF0aW9uCi0gICAgICBpbnN0YW5jZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYU0RFZGl0b3JDb25maWd1cmF0aW9uKCkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLSAgICAgIC8vIGlmIHRoZXJlIGlzbid0IG9uZSwgdGhlbiB1c2UgdGhlIGRlZmF1bHQKLSAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgICAgICBpbnN0YW5jZSA9IG5ldyBYU0RBZGFwdGVyRmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KQotICB7Ci0gICAgWFNEU3dpdGNoIHhzZFN3aXRjaCA9IG5ldyBYU0RTd2l0Y2goKQotICAgIHsKLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFNjaGVtYURpcmVjdGl2ZShYU0RTY2hlbWFEaXJlY3RpdmUgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEV2lsZGNhcmQoWFNEV2lsZGNhcmQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTRFdpbGRjYXJkQWRhcHRlcigpOwotICAgICAgfQotICAgICAgCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcigpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RBdHRyaWJ1dGVVc2UoWFNEQXR0cmlidXRlVXNlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFBhcnRpY2xlKFhTRFBhcnRpY2xlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RQYXJ0aWNsZUFkYXB0ZXIoKTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICAvLyB3ZSBkb24ndCBsaWtlIGV4cG9zaW5nIHRoZSAnYW55VHlwZScgdHlwZSBhcyBhIHZpc2libGUgY29tcGxleCB0eXBlCi0gICAgICAgIC8vIHNvIHdlIGFkYXB0IGl0IGluIGEgc3BlY2lhbGl6ZWQgd2F5IHNvIHRoYXQgaXQncyB0cmVhdGVkIGFzIHNpbXBsZSB0eXBlCi0gICAgICAgIC8vIHRoYXQgd2F5IGl0IGRvZXNuJ3Qgc2hvdyB1cCBhcyBhIHJlZmVyZW5jZSBmcm9tIGEgZmllbGQKLSAgICAgICAgLy8KLSAgICAgICAgaWYgKCJhbnlUeXBlIi5lcXVhbHMob2JqZWN0LmdldE5hbWUoKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNEQW55VHlwZURlZmluaXRpb25BZGFwdGVyKCk7IAotICAgICAgICB9ICAKLSAgICAgICAgZWxzZQotICAgICAgICB7ICAgICAgICAgICAgIAotICAgICAgICAgIHJldHVybiBuZXcgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcigpOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RNb2RlbEdyb3VwQWRhcHRlcigpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RTY2hlbWEoWFNEU2NoZW1hIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RTY2hlbWFBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREVudW1lcmF0aW9uRmFjZXQoWFNERW51bWVyYXRpb25GYWNldCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWFNERW51bWVyYXRpb25GYWNldEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEUmVkZWZpbmUoWFNEUmVkZWZpbmUgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTRFJlZGVmaW5lQWRhcHRlcigpOwotICAgICAgfQotICAgIH07Ci0gICAgT2JqZWN0IG8gPSB4c2RTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7Ci0gICAgQWRhcHRlciByZXN1bHQgPSBudWxsOwotICAgIGlmIChvIGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoQWRhcHRlcikgbzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLS8vICAgICAgVGhyZWFkLmR1bXBTdGFjaygpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0KQotICB7Ci0gICAgcmV0dXJuIGFkYXB0KHRhcmdldCwgdGhpcyk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBbnlUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREFueVR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZThkYzUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREFueVR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEQW55VHlwZURlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEVHlwZURlZmluaXRpb25BZGFwdGVyCi17Ci0gIHB1YmxpYyBib29sZWFuIGlzQ29tcGxleFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotCXJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNBbm9ueW1vdXMoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCgoKFhTRENvbmNyZXRlQ29tcG9uZW50KXRhcmdldCkuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiAoSU1vZGVsKWFkYXB0ZXI7Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWQ2YjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlciBleHRlbmRzIFhTREJhc2VBdHRyaWJ1dGVBZGFwdGVyIGltcGxlbWVudHMgSUFjdGlvblByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKXRhcmdldDsKLSAgfQotIAotICBwcm90ZWN0ZWQgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKLSAgewotICAgIHJldHVybiBnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKQotICB7Ci0gICAgcmV0dXJuIGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpOwotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiAoSU1vZGVsKWFkYXB0ZXI7Ci0gIH0KLQotICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUxMDA4Ci0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsgICAgCi0gICAgaWYoIWlzR2xvYmFsKCkpCi0gICAgeyAgICAJICAgIAkKLSAgICAJTGlzdCBkZWZhdWx0QWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAJZGVmYXVsdEFjdGlvbnMgPSBBcnJheXMuYXNMaXN0KHN1cGVyLmdldEFjdGlvbnMob2JqZWN0KSk7Ci0gICAgCQotICAgIAlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAJbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX1NUQVJUX0lEICsgTWVzc2FnZXMuX1VJX0FDVElPTl9JTlNFUlRfQVRUUklCVVRFKTsKLSAgICAJbGlzdC5hZGQoQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uQkVGT1JFX1NFTEVDVEVEX0lEKTsKLSAgICAJbGlzdC5hZGQoQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uQUZURVJfU0VMRUNURURfSUQpOwotICAgIAlsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfRU5EX0lEKTsKLSAgICAJCi0gICAgCWludCBsZW4gPSBkZWZhdWx0QWN0aW9ucy5zaXplKCk7Ci0gICAgCWZvcihpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAJewotICAgIAkJaWYgKGRlZmF1bHRBY3Rpb25zLmdldChpKS5lcXVhbHMoQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uSUQpKQotICAgIAkJewotICAgIAkJICBjb250aW51ZTsKLSAgICAJCX0KLSAgICAJCWxpc3QuYWRkKGRlZmF1bHRBY3Rpb25zLmdldChpKSk7Ci0gICAgCX0KLSAgICAgIHJldHVybiAoU3RyaW5nIFtdKWxpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAJcmV0dXJuIHN1cGVyLmdldEFjdGlvbnMob2JqZWN0KTsKLSAgICB9ICAgIAotICB9ICAKLSAgCi0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICByZXR1cm4gaXNHbG9iYWwoKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZVF1YWxpZmllcigpCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIGlmICghaXNHbG9iYWwoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0R2xvYmFsWFNEQ29udGFpbmVyKGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICAgIH0KLSAgICByZXR1cm4gdGhpczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWNlYmVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREFueUF0dHJpYnV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi1wdWJsaWMgY2xhc3MgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZSwgSUFjdGlvblByb3ZpZGVyLCBJR3JhcGhFbGVtZW50LCBJQURUT2JqZWN0TGlzdGVuZXIKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBVFRSSUJVVEVfR1JPVVBfUkVGX0lDT05fSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQVRUUklCVVRFX0dST1VQX1JFRl9ESVNBQkxFRF9JQ09OX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREF0dHJpYnV0ZUdyb3VwUmVmZGlzLmdpZiIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIEFUVFJJQlVURV9HUk9VUF9JQ09OX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREF0dHJpYnV0ZUdyb3VwLmdpZiIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIEFUVFJJQlVURV9HUk9VUF9ESVNBQkxFRF9JQ09OX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREF0dHJpYnV0ZUdyb3VwZGlzLmdpZiIpOwotCSAgCi0gIHByb3RlY3RlZCBMaXN0IGZpZWxkcyA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IG90aGVyVGhpbmdzVG9MaXN0ZW5UbyA9IG51bGw7Ci0gIHByb3RlY3RlZCBib29sZWFuIHJlYWRPbmx5OwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGFuZ2VSZWFkT25seUZpZWxkID1mYWxzZTsKLSAgcHJvdGVjdGVkIEhhc2hNYXAgZGVsZXRlZFR5cGVzID0gbmV3IEhhc2hNYXAoKTsKLQotICBwdWJsaWMgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBnZXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHRhcmdldDsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotICAgIGlmICh4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uaXNBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gaXNSZWFkT25seSgpID8gQVRUUklCVVRFX0dST1VQX1JFRl9ESVNBQkxFRF9JQ09OX0lNQUdFIDogQVRUUklCVVRFX0dST1VQX1JFRl9JQ09OX0lNQUdFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIGlzUmVhZE9ubHkoKSA/IEFUVFJJQlVURV9HUk9VUF9ESVNBQkxFRF9JQ09OX0lNQUdFIDogQVRUUklCVVRFX0dST1VQX0lDT05fSU1BR0U7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5pc0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpID8geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldFFOYW1lKCkgOiB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0TmFtZSgpOwotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IE1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNFTlQgOiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHhzZEF0dHJpYnV0ZUdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHhzZEF0dHJpYnV0ZUdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgICAgCi0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgCU9iamVjdCBvID0gaXRlcmF0b3IubmV4dCgpOwotICAgIAlpZiAobyBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAJewotICAgIAkJbGlzdC5hZGQoKChYU0RBdHRyaWJ1dGVVc2UpbykuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgCX0KLSAgICAJZWxzZQotICAgIAl7Ci0gICAgCQlsaXN0LmFkZChvKTsKLSAgICAJfQotICAgIH0KLSAgICBYU0RXaWxkY2FyZCB3aWxkY2FyZCA9IHhzZEF0dHJpYnV0ZUdyb3VwLmdldEF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCgpOwotICAgIGlmICh3aWxkY2FyZCAhPSBudWxsKQotICAgIHsKLSAgICAJbGlzdC5hZGQod2lsZGNhcmQpOwotICAgIH0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiAoSVRyZWVFbGVtZW50W10pIGFkYXB0ZXJMaXN0LnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEFkZFhTREFueUF0dHJpYnV0ZUFjdGlvbi5JRCk7Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKERlbGV0ZUFjdGlvbi5JRCk7Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIE9iamVjdCBzY2hlbWEgPSBnZXRFZGl0b3JTY2hlbWEoKTsKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uID0gZ2V0WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgaWYgKGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5nZXRTY2hlbWEoKSA9PSBzY2hlbWEpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29udGFpbmVyID0gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKGNvbnRhaW5lciA9PSBzY2hlbWEgfHwgY29udGFpbmVyIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGlzdC5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICB9Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0gICAgcmV0dXJuIChTdHJpbmcgW10pbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0QWRkTmV3RmllbGRDb21tYW5kKFN0cmluZyBmaWVsZEtpbmQpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBEZWxldGVDb21tYW5kKGdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEZpZWxkcygpCi0gIHsKLSAgICBpZiAoZmllbGRzID09IG51bGwpCi0gICAgewotICAgICAgZmllbGRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgb3RoZXJUaGluZ3NUb0xpc3RlblRvID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgWFNEVmlzaXRvckZvckZpZWxkcyB2aXNpdG9yID0gbmV3IFhTRFZpc2l0b3JGb3JGaWVsZHMoKTsKLSAgICAgIHZpc2l0b3IudmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oZ2V0WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkpOwotICAgICAgcG9wdWxhdGVBZGFwdGVyTGlzdCh2aXNpdG9yLmNvbmNyZXRlQ29tcG9uZW50TGlzdCwgZmllbGRzKTsKLSAgICAgIHBvcHVsYXRlQWRhcHRlckxpc3QodmlzaXRvci50aGluZ3NXZU5lZWRUb0xpc3RlblRvLCBvdGhlclRoaW5nc1RvTGlzdGVuVG8pOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3RoZXJUaGluZ3NUb0xpc3RlblRvLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGkubmV4dCgpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBJQURUT2JqZWN0IGFkdE9iamVjdCA9IChJQURUT2JqZWN0KSBhZGFwdGVyOwotICAgICAgICAgIGFkdE9iamVjdC5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaWVsZHM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjbGVhckZpZWxkcygpCi0gIHsKLSAgICBpZiAob3RoZXJUaGluZ3NUb0xpc3RlblRvICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3RoZXJUaGluZ3NUb0xpc3RlblRvLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGkubmV4dCgpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBJQURUT2JqZWN0IGFkdE9iamVjdCA9IChJQURUT2JqZWN0KSBhZGFwdGVyOwotICAgICAgICAgIGFkdE9iamVjdC51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZmllbGRzID0gbnVsbDsKLSAgICBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSAuLi4gcmV2aWV3IHRoaXMKLSAgICByZXR1cm4gZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHRhcmdldDsKLSAgICBpZiAoeHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmlzQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldFRvcENvbnRhaW5lcigpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwRGVmID0gZ2V0WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29udGFpbmVyID0gYXR0ckdyb3VwRGVmLmdldENvbnRhaW5lcigpOwotICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBYU0RTY2hlbWEgfHwgY29udGFpbmVyIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICByZXR1cm4gdGhpczsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZ2V0R2xvYmFsWFNEQ29udGFpbmVyKGF0dHJHcm91cERlZik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpCi0gIHsKLSAgICBjbGVhckZpZWxkcygpOwotICAgIHN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGNsZWFyRmllbGRzKCk7Ci0gICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIG51bGwpOwotICB9Ci0gIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotICB7Ci0JICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotCSAgaWYgKGhhc1NldFJlYWRPbmx5RmllbGQoKSkKLQkgIHsKLQkJICBkZWxldGVkVHlwZXMucHV0KHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5nZXROYW1lKCksIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJICBjaGFuZ2VSZWFkT25seUZpZWxkID0gZmFsc2U7Ci0JCSAgcmV0dXJuIHJlYWRPbmx5OwotCSAgfQotCSAgZWxzZQotCSAgewotCQkgIGlmIChkZWxldGVkVHlwZXMhPSBudWxsICkKLQkJICB7Ci0JCQkgIEJvb2xlYW4gZGVsZXRlZCA9ICgoQm9vbGVhbilkZWxldGVkVHlwZXMuZ2V0KHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5nZXROYW1lKCkpKTsKLQkJCSAgaWYgKGRlbGV0ZWQgIT0gbnVsbCAmJiBkZWxldGVkLmJvb2xlYW5WYWx1ZSgpKQotCQkJICB7Ci0JCQkJICByZXR1cm4gdHJ1ZTsKLQkJCSAgfQotCQkJICBlbHNlCi0JCQkgIHsKLQkJCQkgIHJldHVybiBzdXBlci5pc1JlYWRPbmx5KCk7Ci0JCQkgIH0KLQkJICB9Ci0JCSAgZWxzZQotCQkgIHsKLQkJCSAgcmV0dXJuIHN1cGVyLmlzUmVhZE9ubHkoKTsKLQkJICB9Ci0JICB9Ci0gIH0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1NldFJlYWRPbmx5RmllbGQoKSB7Ci0JCXJldHVybiBjaGFuZ2VSZWFkT25seUZpZWxkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoYW5nZVJlYWRPbmx5RmllbGQoYm9vbGVhbiBzZXRSZWFkT25seUZpZWxkKSB7Ci0JCXRoaXMuY2hhbmdlUmVhZE9ubHlGaWVsZCA9IHNldFJlYWRPbmx5RmllbGQ7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRGVsZXRlZE1hcChTdHJpbmcgYWRkQ29tcG9uZW50KSB7Ci0JCWlmIChkZWxldGVkVHlwZXMuZ2V0KGFkZENvbXBvbmVudCkgIT0gbnVsbCkKLQkJewotCQkJZGVsZXRlZFR5cGVzLmNsZWFyKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVVc2VBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVVc2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODM2NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQXR0cmlidXRlVXNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQXR0cmlidXRlQWRhcHRlciBpbXBsZW1lbnRzIElBY3Rpb25Qcm92aWRlcgotewotICBwcm90ZWN0ZWQgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGdldFhTREF0dHJpYnV0ZVVzZSgpLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RBdHRyaWJ1dGVVc2UgZ2V0WFNEQXR0cmlidXRlVXNlKCkKLSAgewotICAgIHJldHVybiAoWFNEQXR0cmlidXRlVXNlKXRhcmdldDsKLSAgfQotCi0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgcmV0dXJuIGdldFRleHRGb3JBdHRyaWJ1dGVVc2UoZ2V0WFNEQXR0cmlidXRlVXNlKCksIHRydWUpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0Rm9yQXR0cmlidXRlVXNlKFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UsIGJvb2xlYW4gc2hvd1R5cGUpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IGF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCAgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgcmVzdWx0LmFwcGVuZChnZXRUZXh0Rm9yQXR0cmlidXRlKGFkLCBzaG93VHlwZSkpOwotICAgIC8qCi0gICAgaWYgKHhzZEF0dHJpYnV0ZVVzZS5pc1NldENvbnN0cmFpbnQoKSkKLSAgICB7Ci0gICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpICE9IDApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIik7Ci0gICAgICB9Ci0gICAgICByZXN1bHQuYXBwZW5kKCc8Jyk7Ci0gICAgICByZXN1bHQuYXBwZW5kKHhzZEF0dHJpYnV0ZVVzZS5nZXRDb25zdHJhaW50KCkpOwotICAgICAgcmVzdWx0LmFwcGVuZCgiPVwiIik7Ci0gICAgICByZXN1bHQuYXBwZW5kKHhzZEF0dHJpYnV0ZVVzZS5nZXRMZXhpY2FsVmFsdWUoKSk7Ci0gICAgICByZXN1bHQuYXBwZW5kKCJcIj4iKTsKLSAgICB9Ci0gICAgKi8KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lUXVhbGlmaWVyKCkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSBnZXRSZXNvbHZlZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgcmV0dXJuIGdldEdsb2JhbFhTRENvbnRhaW5lcihnZXRYU0RBdHRyaWJ1dGVVc2UoKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNEQXR0cmlidXRlVXNlKCkuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKS5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RCYXNlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQmFzZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiMjU4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RCYXNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEQmFzZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElBRFRPYmplY3QsIElUcmVlRWxlbWVudAoteyAgCi0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gIHsKLSAgICByZXR1cm4gdHlwZSA9PSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUFkYXB0ZXJMaXN0KExpc3Qgbm90aWZpZXJMaXN0LCBMaXN0IGFkYXB0ZXJMaXN0KQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbm90aWZpZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqOwotICAgICAgICBhZGFwdGVyTGlzdC5hZGQoWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChjb21wb25lbnQpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYWRhcHRlckxpc3QuYWRkKG9iaik7Ci0gICAgICB9Ci0gICAgfQotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgaWYgKCFsaXN0ZW5lckxpc3QuY29udGFpbnMobGlzdGVuZXIpKQotICAgIHsKLSAgICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpCi0gIHsKLSAgICBzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0gICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIG51bGwpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoT2JqZWN0IGNoYW5nZWRPYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIExpc3QgY2xvbmVkTGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGNsb25lZExpc3RlbmVyTGlzdC5hZGRBbGwobGlzdGVuZXJMaXN0KTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjbG9uZWRMaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIgPSAoSUFEVE9iamVjdExpc3RlbmVyKWkubmV4dCgpOwotICAgICAgbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKHRoaXMsIHByb3BlcnR5KTsKLSAgICB9ICAgICAgCi0gIH0KLSAgICAKLSAgcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIElUcmVlRWxlbWVudCBnZXRQYXJlbnQoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkKLSAgewotICAgIGlmIChnZXRDaGlsZHJlbigpICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGdldENoaWxkcmVuKCkubGVuZ3RoID4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotCi0gIC8qKgotICAgKiBJbXBsZW1lbnRzIElGaWVsZCBnZXRDb250YWluZXJUeXBlLiAgR2V0IHBhcmVudCBDb21wbGV4IFR5cGUgY29udGFpbmluZyB0aGUgZmllbGQKLSAgICogQHJldHVybiBJQ29tcGxleFR5cGUKLSAgICovCi0gIHB1YmxpYyBJQ29tcGxleFR5cGUgZ2V0Q29udGFpbmVyVHlwZSgpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgdGFyZ2V0OwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IG51bGw7Ci0gICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ID0gbnVsbDsKLSAgICBmb3IgKHBhcmVudCA9IHhzZENvbmNyZXRlQ29tcG9uZW50LmdldENvbnRhaW5lcigpOyBwYXJlbnQgIT0gbnVsbDsgKQotICAgIHsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGN0ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilwYXJlbnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcGFyZW50ID0gcGFyZW50LmdldENvbnRhaW5lcigpOwotICAgIH0KLSAgICBpZiAoY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gKElDb21wbGV4VHlwZSlYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICBpZiAod2luZG93ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBpZiAocGFnZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZWRpdG9yUGFydCA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgeHNkU2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCl0YXJnZXQpLmdldFNjaGVtYSgpOwotICAgICAgfQotICAgICAgaWYgKGVkaXRvclBhcnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbGxCYWNrQ2hlY2tJc1JlYWRPbmx5KCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIFhTRFNjaGVtYSBlZGl0b3JTY2hlbWEgPSAoWFNEU2NoZW1hKWVkaXRvclBhcnQuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpOwotICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsICYmIHhzZFNjaGVtYSA9PSBlZGl0b3JTY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbGxCYWNrQ2hlY2tJc1JlYWRPbmx5KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgIHsKLQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGZhbGxCYWNrQ2hlY2tJc1JlYWRPbmx5KCkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpdGFyZ2V0KS5nZXRFbGVtZW50KCk7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZQotICAgICAgICB8fCBlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudEltcGwpCi0gICAgewotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgT2JqZWN0IGdldEVkaXRvclNjaGVtYSgpCi0gIHsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgcmV0dXJuIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSUFEVE9iamVjdCBnZXRHbG9iYWxYU0RDb250YWluZXIoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgYyA9IGNvbXBvbmVudC5nZXRDb250YWluZXIoKTsKLSAgICAvLyBXZSB3YW50IHRoZSB0b3AgbW9zdCBzdHJ1Y3R1cmFsIGNvbXBvbmVudAotICAgIHdoaWxlIChjICE9IG51bGwgJiYgCi0gICAgICAgICAgICEoYy5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSkgJiYgCi0gICAgICAgICAgICEoYyBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgJiYKLSAgICAgICAgICAgIShjIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pICYmCi0gICAgICAgICAgICEoYyBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSAmJgotICAgICAgICAgICAhKGMgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pKQotICAgIHsKLSAgICAgIGMgPSBjLmdldENvbnRhaW5lcigpOwotICAgIH0KLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGMpOwotICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICAgIHJldHVybiAoSUFEVE9iamVjdClhZGFwdGVyOwotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YgYW4gYWJzdHJhY3QgYXR0cmlidXRlCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcG9uZW50J3MgYWJzdHJhY3QgYXR0cmlidXRlIGlzIHRydWUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RCYXNlQXR0cmlidXRlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQmFzZUF0dHJpYnV0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk4NDA3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RCYXNlQXR0cmlidXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotLy8gYSBiYXNlIGFkYXB0ZXIgZm9yIHJldXNlIGJ5IGFuIEF0dHJpYnV0ZVVzZSBhbmQgQXR0cmlidXRlRGVjbGFyYXRpb24KLS8vCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWFNEQmFzZUF0dHJpYnV0ZUFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElGaWVsZCwgSUdyYXBoRWxlbWVudAotewotICBwcm90ZWN0ZWQgYWJzdHJhY3QgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgcHJvdGVjdGVkIGFic3RyYWN0IFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldFJlc29sdmVkWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLQotICBwdWJsaWMgWFNEQmFzZUF0dHJpYnV0ZUFkYXB0ZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKCFpc0dsb2JhbCgpKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLklEKTsKLSAgICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICB9Ci0gICAgbGlzdC5hZGQoRGVsZXRlQWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgT2JqZWN0IHNjaGVtYSA9IGdldEVkaXRvclNjaGVtYSgpOwotICAgIGlmIChnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpID09IHNjaGVtYSkKLSAgICB7Ci0gICAgICBpZiAoZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRDb250YWluZXIoKSA9PSBzY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGlzdC5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICB9Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0gICAgcmV0dXJuIChTdHJpbmdbXSkgbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEtpbmQoKQotICB7Ci0gICAgcmV0dXJuIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUc7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1heE9jY3VycygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIC0zOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNaW5PY2N1cnMoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiAtMzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiByZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uID0gZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgIFN0cmluZyBuYW1lID0gcmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgcmV0dXJuIChuYW1lID09IG51bGwpID8gIiIgOiBuYW1lOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgSVR5cGUgZ2V0VHlwZSgpCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFJlc29sdmVkWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIHJldHVybiAodGQgIT0gbnVsbCkgPyAoSVR5cGUpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQodGQpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgSVR5cGUgdHlwZSA9IGdldFR5cGUoKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsgIAotICAgICAgcmV0dXJuIHR5cGUuZ2V0TmFtZSgpOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lUXVhbGlmaWVyKCkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBnZXRSZXNvbHZlZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoYXR0ci5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBhdHRyLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVNYXhPY2N1cnNDb21tYW5kKGludCBtYXhPY2N1cnMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVNaW5PY2N1cnNDb21tYW5kKGludCBtaW5PY2N1cnMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVOYW1lQ29tbWFuZChTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBuZXcgVXBkYXRlTmFtZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfTkFNRSwgZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLCBuYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZVR5cGVOYW1lQ29tbWFuZChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBxdWFpbGlmaWVyKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudCNnZXRJbWFnZSgpCi0gICAqLwotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlRGVjbGFyYXRpb24gPSBnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOyAgLy8gZG9uJ3Qgd2FudCB0aGUgcmVzb2x2ZWQgYXR0cmlidXRlCi0gICAgaWYgKHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREF0dHJpYnV0ZVJlZmRpcy5naWYiKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREF0dHJpYnV0ZVJlZi5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGlzUmVhZE9ubHkoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RBdHRyaWJ1dGVkaXMuZ2lmIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50I2dldFRleHQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIHJldHVybiBnZXRUZXh0Rm9yQXR0cmlidXRlKGdldFJlc29sdmVkWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKSwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHRGb3JBdHRyaWJ1dGUoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYWQsIGJvb2xlYW4gc2hvd1R5cGUpCi0gIHsKLSAgICBhZCA9IGFkLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICBTdHJpbmcgbmFtZSA9IGFkLmdldE5hbWUoKTsKLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZCgiICIgKyBNZXNzYWdlcy5fVUlfTEFCRUxfQUJTRU5UICsgIiAiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICB9Ci0gICAgaWYgKGFkLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCAmJiBhZC5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZCgiIDogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIC8vIHJlc3VsdC5hcHBlbmQocmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpLmdldFFOYW1lKHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uKSk7Ci0gICAgICByZXN1bHQuYXBwZW5kKGFkLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9ICAKLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQ2hpbGRVdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RDaGlsZFV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkxMTEwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RDaGlsZFV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoOwotICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIFhTRENoaWxkVXRpbGl0eQoteyAgICAgICAgICAgICAgCi0gIHN0YXRpYyBwdWJsaWMgTGlzdCBnZXRNb2RlbENoaWxkcmVuKE9iamVjdCBtb2RlbCkKLSAgewotICAgIFhTRENoaWxkVmlzaXRvciB2aXNpdG9yID0gbmV3IFhTRENoaWxkVmlzaXRvcihtb2RlbCk7Ci0gICAgdmlzaXRvci52aXNpdFhTRE9iamVjdChtb2RlbCk7Ci0gICAgcmV0dXJuIHZpc2l0b3IubGlzdDsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgTGlzdCBnZXRJbW1lZGlhdGVEZXJpdmVkVHlwZXMoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlKQotICB7Ci0gICAgQXJyYXlMaXN0IHR5cGVzRGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvLyBBIGhhbmR5IGNvbnZlbmllbmNlIG1ldGhvZCBxdWlja2x5IGdldHMgYWxsIAotICAgIC8vIHR5cGVEZWZpbml0aW9ucyB3aXRoaW4gb3VyIHNjaGVtYTsgbm90ZSB0aGF0IAotICAgIC8vIHdoZXRoZXIgb3Igbm90IHRoaXMgcmV0dXJucyB0eXBlcyBpbiBpbmNsdWRlZCwgCi0gICAgLy8gaW1wb3J0ZWQsIG9yIHJlZGVmaW5lZCBzY2hlbWFzIGlzIHN1YmplY3QgdG8gY2hhbmdlCi0gICAgTGlzdCB0eXBlZGVmcyA9IGNvbXBsZXhUeXBlLmdldFNjaGVtYSgpLmdldFR5cGVEZWZpbml0aW9ucygpOwotCi0gICAgZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWRlZnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlZGVmID0gKFhTRFR5cGVEZWZpbml0aW9uKWl0ZXIubmV4dCgpOwotICAgICAgLy8gV2FsayB0aGUgYmFzZVR5cGVzIGZyb20gdGhpcyB0eXBlZGVmIHNlZWluZyBpZiBhbnkgCi0gICAgICAvLyBvZiB0aGVtIG1hdGNoIHRoZSByZXF1ZXN0ZWQgb25lCi0gICAgICBpZiAoY29tcGxleFR5cGUuZXF1YWxzKHR5cGVkZWYuZ2V0QmFzZVR5cGUoKSkpCi0gICAgICB7Ci0gICAgICAgIC8vIFdlIGZvdW5kIGl0LCByZXR1cm4gdGhlIG9yaWdpbmFsIG9uZSBhbmQgY29udGludWUKLSAgICAgICAgdHlwZXNEZXJpdmVkRnJvbS5hZGQodHlwZWRlZik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0eXBlc0Rlcml2ZWRGcm9tOwotICB9Ci0gIC8vIFRPRE8uLi4gdXNlIHRoZSBYU0RWaXNpdG9yIGRlZmluZWQgaW4geHNkZWRpdG9yLnV0aWwgaW5zdGVhZAotICAvLyAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RDaGlsZFZpc2l0b3IgZXh0ZW5kcyBYU0RWaXNpdG9yCi0gIHsKLSAgICBPYmplY3Qgcm9vdDsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwdWJsaWMgWFNEQ2hpbGRWaXNpdG9yKE9iamVjdCByb290KQotICAgIHsKLSAgICAgIHRoaXMucm9vdCA9IHJvb3Q7Ci0gICAgfSAgICAgICAgICAgICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBpZiAoeHNkTW9kZWxHcm91cCAhPSByb290KQotICAgICAgewotICAgICAgICBsaXN0LmFkZCh4c2RNb2RlbEdyb3VwKTsgCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdXBlci52aXNpdFhTRE1vZGVsR3JvdXAoeHNkTW9kZWxHcm91cCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBpZiAoeHNkTW9kZWxHcm91cERlZmluaXRpb24gIT0gcm9vdCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoeHNkTW9kZWxHcm91cERlZmluaXRpb24pOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3VwZXIudmlzaXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbih4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uICE9IHJvb3QpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKHhzZEVsZW1lbnREZWNsYXJhdGlvbik7Ci0gICAgICAgIAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3VwZXIudmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24oeHNkRWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGlmICh4c2RDb21wbGV4VHlwZURlZmluaXRpb24gIT0gcm9vdCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgIT0gbnVsbCB8fCBnZXRNb2RlbENoaWxkcmVuKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikuc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLnZpc2l0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgfSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEV2lsZGNhcmQoWFNEV2lsZGNhcmQgeHNkV2lsZENhcmQpCi0gICAgewotICAgICAgaWYgKHhzZFdpbGRDYXJkICE9IHJvb3QpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGxpc3QuYWRkKHhzZFdpbGRDYXJkKTsgICAgICAgIAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3VwZXIudmlzaXRYU0RXaWxkY2FyZCh4c2RXaWxkQ2FyZCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICAgICAgICAgICAgICAKLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRFZpc2l0b3IKLSAgeyAKLSAgICBpbnQgaW5kZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RPYmplY3QoT2JqZWN0IG9iamVjdCkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBYU0RTd2l0Y2ggdGhlU3dpdGNoID0gbmV3IFhTRFN3aXRjaCgpCi0gICAgICB7ICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24ob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAKLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RBdHRyaWJ1dGVVc2UoWFNEQXR0cmlidXRlVXNlIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WFNEQXR0cmlidXRlVXNlKG9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WFNERWxlbWVudERlY2xhcmF0aW9uKG9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKG9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHN1cGVyLmNhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WFNETW9kZWxHcm91cChvYmplY3QpOwotICAgICAgICAgIHJldHVybiBzdXBlci5jYXNlWFNETW9kZWxHcm91cChvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEUGFydGljbGUoWFNEUGFydGljbGUgb2JqZWN0KQotICAgICAgICB7IAotICAgICAgICAgIHZpc2l0WFNEUGFydGljbGUob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAKLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RTY2hlbWEoWFNEU2NoZW1hIG9iamVjdCkKLSAgICAgICAgeyAKLSAgICAgICAgICB2aXNpdFhTRFNjaGVtYShvYmplY3QpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IAotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFdpbGRjYXJkKFhTRFdpbGRjYXJkIG9iamVjdCkKLSAgICAgICAgeyAKLSAgICAgICAgICB2aXNpdFhTRFdpbGRjYXJkKG9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gCi0gICAgICB9OwotICAgICAgdGhlU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KW9iamVjdCk7Ci0gICAgfQotICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RBdHRyaWJ1dGVVc2UoWFNEQXR0cmlidXRlVXNlIHhzZEF0dHJpYnV0ZVVzZSkKLSAgICB7ICAKLS8vICAgICAgcHJpbnRJbmRlbnRlZCgiQCIgKyB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEU2NoZW1hKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gICAgeyAgICAgICAgIAotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0geHNkU2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRYU0RPYmplY3QoaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgIH0KLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgeyAgICAgIAotICAgICAgaW5kZW50ICs9IDI7ICAgICAgICAgCi0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgaWYgKHRkID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRkID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHZpc2l0WFNET2JqZWN0KHRkKTsKLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QXR0cmlidXRlVXNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgdmlzaXRYU0RPYmplY3QoaS5uZXh0KCkpOwotICAgICAgfQotICAgICAgdmlzaXRYU0RPYmplY3QoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldENvbnRlbnQoKSk7Ci0gICAgICBpbmRlbnQgLT0gMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIGluZGVudCArPSAyOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRYU0RPYmplY3QoaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgIH0gCi0gICAgICBpbmRlbnQgLT0gMjsKLSAgICB9ICAgICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNETW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICB2aXNpdFhTRE9iamVjdCh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuZ2V0TW9kZWxHcm91cCgpKTsKLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEUGFydGljbGUoWFNEUGFydGljbGUgeHNkUGFydGljbGUpCi0gICAgewotICAgICAgaW5kZW50ICs9IDI7ICAgICAgICAgICAgICAgICAKLSAgICAgIGlmICh4c2RQYXJ0aWNsZS5nZXRDb250ZW50KCkgIT0gbnVsbCkKLSAgICAgICAgdmlzaXRYU0RPYmplY3QoeHNkUGFydGljbGUuZ2V0Q29udGVudCgpKTsKLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0gCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTRFdpbGRjYXJkKFhTRFdpbGRjYXJkIG9iamVjdCkKLSAgICB7IAotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRJbmRlbnRlZChTdHJpbmcgc3RyaW5nKQotICAgIHsgCi0gICAgICAvL1N0cmluZyBzcGFjZXMgPSAiIjsKLSAgICAgIC8vZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLSAgICAgIC8vewotICAgICAgLy8gIHNwYWNlcyArPSAiICI7Ci0gICAgICAvL30gICAgICAgICAgICAgICAKLSAgICAgCi0gICAgfQotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQ3ZTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQW55RWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RNb2RlbEdyb3VwQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0QmFzZVR5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNERWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVOYW1lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuU3BhY2VGaWxsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERGVyaXZhdGlvbk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERW51bWVyYXRpb25GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlciBleHRlbmRzIFhTRFR5cGVEZWZpbml0aW9uQWRhcHRlciBpbXBsZW1lbnRzIElDb21wbGV4VHlwZSwgSUFEVE9iamVjdExpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBMaXN0IGZpZWxkcyA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IG90aGVyVGhpbmdzVG9MaXN0ZW5UbyA9IG51bGw7Ci0gIHByb3RlY3RlZCBib29sZWFuIHJlYWRPbmx5OwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGFuZ2VSZWFkT25seUZpZWxkID1mYWxzZTsKLSAgcHJvdGVjdGVkIEhhc2hNYXAgZGVsZXRlZFR5cGVzID0gbmV3IEhhc2hNYXAoKTsKLQotICBwdWJsaWMgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdGFyZ2V0OwotICB9Ci0KLSAgcHVibGljIElUeXBlIGdldFN1cGVyVHlwZSgpCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZ2V0QmFzZVR5cGUoKTsKLQotICAgIC8vIHRlc3QgdG8gZmlsdGVyIG91dCB0aGUgJ2FueVR5cGUnIHR5cGUgLi4uIGRvbid0IHdhbnQgdG8gc2VlIHRoYXQKLSAgICAvLwotICAgIGlmICh0ZCAhPSBudWxsICYmICF0ZC5nZXROYW1lKCkuZXF1YWxzKCJhbnlUeXBlIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXR1cm4gKElUeXBlKSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KHRkKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjbGVhckZpZWxkcygpCi0gIHsKLSAgICBpZiAob3RoZXJUaGluZ3NUb0xpc3RlblRvICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3RoZXJUaGluZ3NUb0xpc3RlblRvLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGkubmV4dCgpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBJQURUT2JqZWN0IGFkdE9iamVjdCA9IChJQURUT2JqZWN0KSBhZGFwdGVyOwotICAgICAgICAgIGFkdE9iamVjdC51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZmllbGRzID0gbnVsbDsKLSAgICBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0RmllbGRzKCkKLSAgewotICAgIGlmIChmaWVsZHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgIFhTRFZpc2l0b3JGb3JGaWVsZHMgdmlzaXRvciA9IG5ldyBYU0RWaXNpdG9yRm9yRmllbGRzV2l0aFNwYWNlRmlsbGVycygpOwotICAgICAgdmlzaXRvci52aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihnZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKSk7Ci0gICAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KHZpc2l0b3IuY29uY3JldGVDb21wb25lbnRMaXN0LCBmaWVsZHMpOwotICAgICAgcG9wdWxhdGVBZGFwdGVyTGlzdCh2aXNpdG9yLnRoaW5nc1dlTmVlZFRvTGlzdGVuVG8sIG90aGVyVGhpbmdzVG9MaXN0ZW5Ubyk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvdGhlclRoaW5nc1RvTGlzdGVuVG8uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgaS5uZXh0KCk7Ci0gICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIElBRFRPYmplY3QgYWR0T2JqZWN0ID0gKElBRFRPYmplY3QpIGFkYXB0ZXI7Ci0gICAgICAgICAgYWR0T2JqZWN0LnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZpZWxkczsKLSAgfQotCi0gIGNsYXNzIFhTRFZpc2l0b3JGb3JGaWVsZHNXaXRoU3BhY2VGaWxsZXJzIGV4dGVuZHMgWFNEVmlzaXRvckZvckZpZWxkcwotICB7Ci0gICAgcHVibGljIFhTRFZpc2l0b3JGb3JGaWVsZHNXaXRoU3BhY2VGaWxsZXJzKCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0cmlidXRlVXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgbzsKLSAgICAgICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBvOwotICAgICAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGF0dHJHcm91cCk7Ci0gICAgICAgICAgaWYgKGF0dHJHcm91cC5pc0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJHcm91cCA9IGF0dHJHcm91cC5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgaWYgKGF0dHJHcm91cC5nZXRDb250ZW50cygpLnNpemUoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKG5ldyBTcGFjZUZpbGxlcigiYXR0cmlidXRlIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyR3JvdXApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXApCi0gICAgewotICAgICAgaW50IG51bU9mQ2hpbGRyZW4gPSBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuc2l6ZSgpOwotICAgICAgaWYgKG51bU9mQ2hpbGRyZW4gPT0gMCkKLSAgICAgIHsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChuZXcgU3BhY2VGaWxsZXIoImVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIHN1cGVyLnZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHJlc29sdmVkTW9kZWxHcm91cERlZiA9IG1vZGVsR3JvdXBEZWYuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgaWYgKHZpc2l0ZWRHcm91cHMuY29udGFpbnMocmVzb2x2ZWRNb2RlbEdyb3VwRGVmLmdldE1vZGVsR3JvdXAoKSkpCi0gICAgICB7Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQobmV3IFNwYWNlRmlsbGVyKCJlbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBzdXBlci52aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKG1vZGVsR3JvdXBEZWYpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldE1vZGVsR3JvdXBzKCkKLSAgewotICAgIExpc3QgZ3JvdXBzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGdyb3Vwcy5hZGRBbGwoWFNEQ2hpbGRVdGlsaXR5LmdldE1vZGVsQ2hpbGRyZW4oZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCkpKTsKLSAgICByZXR1cm4gZ3JvdXBzOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlR3JvdXBDb250ZW50KCkKLSAgewotICAgIEVMaXN0IGF0dHJDb250ZW50ID0gZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCkuZ2V0QXR0cmlidXRlQ29udGVudHMoKTsKLSAgICBMaXN0IGF0dHJVc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaXQgPSBhdHRyQ29udGVudC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyR3JvdXBDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCkgaXQubmV4dCgpOwotCi0gICAgICBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIGF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgIGxpc3QuYWRkKFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSk7Ci0gICAgICAgIGdldEF0dHJpYnV0ZVVzZXMoYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLCBhdHRyVXNlcyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGF0dHJVc2VzLmFkZChhdHRyR3JvdXBDb250ZW50KTsKLSAgICAgICAgbGlzdC5hZGQobmV3IFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcih0aGlzKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV4VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgewotICAgIGNsZWFyRmllbGRzKCk7Ci0gICAgc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTmFtZUNvbW1hbmQoU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICByZXR1cm4gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX05BTUUsIGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpLCBuZXdOYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldEFkZE5ld0ZpZWxkQ29tbWFuZChTdHJpbmcgZmllbGRLaW5kKQotICB7Ci0gICAgcmV0dXJuIG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9GSUVMRCwgZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIEFkZE5ld0ZpZWxkQ29tbWFuZCBleHRlbmRzIENvbW1hbmQKLSAgewotICAgIHByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBmaWVsZEtpbmQ7Ci0KLSAgICBBZGROZXdGaWVsZENvbW1hbmQoU3RyaW5nIGRlZmF1bHROYW1lLCBTdHJpbmcgZmllbGRLaW5kKQotICAgIHsKLSAgICAgIHRoaXMuZGVmYXVsdE5hbWUgPSBkZWZhdWx0TmFtZTsKLSAgICAgIHRoaXMuZmllbGRLaW5kID0gZmllbGRLaW5kOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgT2JqZWN0IHNjaGVtYSA9IGdldEVkaXRvclNjaGVtYSgpOwotICAgIAotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotICAgIE9iamVjdCBjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0gICAgWFNERGVyaXZhdGlvbk1ldGhvZCBkZXJpdmF0aW9uID0gY29tcGxleFR5cGUuZ2V0RGVyaXZhdGlvbk1ldGhvZCgpOwotICAgIGlmIChjb250ZW50VHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIExpc3QgZmllbGRzID0gZ2V0RmllbGRzKCk7Ci0gICAgICBib29sZWFuIGhhc1NpbXBsZUNvbnRlbnRBdHRyaWJ1dGVzID0gZmFsc2U7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmllbGRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBPYmplY3QgZmllbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIC8vIFdlIGhhdmUgYXR0cmlidXRlcywgc28gd2UgbmVlZCB0byBhZGQgdGhlIGNvbXBhcnRtZW50IGZvciBob3VzaW5nIHRoZSBhdHRyaWJ1dGVzCi0gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcikKLSAgICAgICAgewotICAgICAgICAgIGhhc1NpbXBsZUNvbnRlbnRBdHRyaWJ1dGVzID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoaGFzU2ltcGxlQ29udGVudEF0dHJpYnV0ZXMgfHwgWFNERGVyaXZhdGlvbk1ldGhvZC5FWFRFTlNJT05fTElURVJBTC5lcXVhbHMoZGVyaXZhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLklEKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFhTRERlcml2YXRpb25NZXRob2QuUkVTVFJJQ1RJT05fTElURVJBTC5lcXVhbHMoZGVyaXZhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKEFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24uSUQpOwotICAgICAgfQotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgICAgbGlzdC5hZGQoU2V0QmFzZVR5cGVBY3Rpb24uSUQpOwotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgICAgbGlzdC5hZGQoRGVsZXRlQWN0aW9uLklEKTsKLSAgICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxpc3QuYWRkKEFkZFhTREVsZW1lbnRBY3Rpb24uSUQpOwotICAgICAgbGlzdC5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5SRUZfSUQpOwotICAgICAgbGlzdC5hZGQoQWRkWFNEQW55RWxlbWVudEFjdGlvbi5JRCk7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5SRUZfSUQpOwotICAgICAgbGlzdC5hZGQoQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uLlJFRl9JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RBbnlBdHRyaWJ1dGVBY3Rpb24uSUQpOwotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgICAgbGlzdC5hZGQoQWRkWFNETW9kZWxHcm91cEFjdGlvbi5TRVFVRU5DRV9JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLkNIT0lDRV9JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLkFMTF9JRCk7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgICBsaXN0LmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgICAgbGlzdC5hZGQoU2V0QmFzZVR5cGVBY3Rpb24uSUQpOwotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIH0KLSAgICBpZiAoY29tcGxleFR5cGUuZ2V0U2NoZW1hKCkgPT0gc2NoZW1hKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbnRhaW5lciA9IGNvbXBsZXhUeXBlLmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKGNvbnRhaW5lciA9PSBzY2hlbWEgfHwgY29udGFpbmVyIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGlzdC5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICB9Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0gICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBjbGVhckZpZWxkcygpOwotICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBudWxsKTsKLSAgfQotCi0gIGNsYXNzIEJvZ3VzQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi0gIHsKLSAgICBCb2d1c0FjdGlvbihTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgIHN1cGVyLnJ1bigpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID0gZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vIEFkZCBhdHRyaWJ1dGVzCi0gICAgZm9yIChJdGVyYXRvciBpID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKCgoWFNEQXR0cmlidXRlVXNlKW9iaikuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGdldEF0dHJpYnV0ZVVzZXMoKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgb2JqLCBsaXN0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gQWRkIGVudW1lcmF0aW9ucyAgICAgCi0gICAgYm9vbGVhbiBjYW5IYXZlRW51bWVyYXRpb25zID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldENvbnRlbnRUeXBlKCkgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiAmJgkKLSAgICAJCVhTRERlcml2YXRpb25NZXRob2QuUkVTVFJJQ1RJT05fTElURVJBTC5lcXVhbHMoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldERlcml2YXRpb25NZXRob2QoKSk7Ci0gICAgaWYgKGNhbkhhdmVFbnVtZXJhdGlvbnMpCi0gICAgewotICAgIAlPYmplY3QgY29udGVudFR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotICAgIAlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkKLSAgICAJewotICAgIAkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pY29udGVudFR5cGUpLmdldEVudW1lcmF0aW9uRmFjZXRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAJCXsKLSAgICAJCQlYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1lcmF0aW9uRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldClpdGVyYXRvci5uZXh0KCk7Ci0gICAgCQkJbGlzdC5hZGQoZW51bWVyYXRpb25GYWNldCk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgWFNEV2lsZGNhcmQgYW55QXR0ciA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVXaWxkY2FyZCgpOwotICAgIGlmIChhbnlBdHRyICE9IG51bGwpCi0gICAgICBsaXN0LmFkZChhbnlBdHRyKTsKLSAgICAvLyBnZXQgaW1tZWRpYXRlIFhTRCBNb2RlbCBHcm91cCBvZiB0aGlzIGNvbXBsZXggdHlwZQotICAgIGlmICh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0Q29udGVudCgpICE9IG51bGwpCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVDb250ZW50IHhzZENvbXBsZXhUeXBlQ29udGVudCA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRDb250ZW50KCk7Ci0gICAgICBpZiAoeHNkQ29tcGxleFR5cGVDb250ZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZUNvbnRlbnQgPSAoKFhTRFBhcnRpY2xlKSB4c2RDb21wbGV4VHlwZUNvbnRlbnQpLmdldENvbnRlbnQoKTsKLSAgICAgICAgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChwYXJ0aWNsZUNvbnRlbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGdldCBpbmhlcml0ZWQgWFNEIE1vZGVsIEdyb3VwIG9mIHRoaXMgY29tcGxleCB0eXBlCi0gICAgYm9vbGVhbiBzaG93SW5oZXJpdGVkQ29udGVudCA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTaG93SW5oZXJpdGVkQ29udGVudCgpOwotICAgIGlmIChzaG93SW5oZXJpdGVkQ29udGVudCkKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgICAgaWYgKHR5cGVEZWYgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBiYXNlQ1QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB0eXBlRGVmOwotICAgICAgICBpZiAoYmFzZUNULmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwgJiYgIWJhc2VDVC5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChiYXNlQ1QuZ2V0Q29udGVudCgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQ29tcGxleFR5cGVDb250ZW50IHhzZENvbXBsZXhUeXBlQ29udGVudCA9IGJhc2VDVC5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICBpZiAoeHNkQ29tcGxleFR5cGVDb250ZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZUNvbnRlbnQgPSAoKFhTRFBhcnRpY2xlKSB4c2RDb21wbGV4VHlwZUNvbnRlbnQpLmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChwYXJ0aWNsZUNvbnRlbnQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIChJVHJlZUVsZW1lbnRbXSkgYWRhcHRlckxpc3QudG9BcnJheShuZXcgSVRyZWVFbGVtZW50WzBdKTsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBpZiAoaXNSZWFkT25seSgpKQotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQ29tcGxleFR5cGVkaXMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RDb21wbGV4VHlwZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24gPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB0YXJnZXQ7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgcmVzdWx0LmFwcGVuZCh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0TmFtZSgpID09IG51bGwgPyAibG9jYWwgdHlwZSIgOiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGVEZWZpbml0aW9uID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgIGlmIChiYXNlVHlwZURlZmluaXRpb24gIT0gbnVsbCAmJiBiYXNlVHlwZURlZmluaXRpb24gIT0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldENvbnRlbnQoKSAmJiBiYXNlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpICE9IG51bGwgJiYgIVhTRENvbnN0YW50cy5pc1VSVHlwZShiYXNlVHlwZURlZmluaXRpb24pKQotICAgIHsKLSAgICAJCi0gICAJdHJ5ewotICAgIAkJU3RyaW5nIHFOYW1lID0gYmFzZVR5cGVEZWZpbml0aW9uLmdldFFOYW1lKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbik7Ci0gICAgCQlyZXN1bHQuYXBwZW5kKCIgOiAiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkgICAgcmVzdWx0LmFwcGVuZChxTmFtZSk7Ci0gICAgCX0KLSAgICAJY2F0Y2ggKEV4Y2VwdGlvbiBlKSAgICAJCi0gICAgCXsgICAgCQkKLSAgICAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICAJfQotICAgIAotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldEF0dHJpYnV0ZVVzZXMoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiwgTGlzdCBsaXN0KQotICB7Ci0gICAgSXRlcmF0b3IgaSA9IGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLQotICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0ckdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpIGkubmV4dCgpOwotCi0gICAgICBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgZ2V0QXR0cmlidXRlVXNlcygoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBhdHRyR3JvdXBDb250ZW50LCBsaXN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChhdHRyR3JvdXBDb250ZW50KSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpCi0gIHsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdGFyZ2V0OwotICAgIHJldHVybiAhKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEgfHwKLSAgICAgICAgICAgICB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0KCkKLSAgewotICAgIHJldHVybiBnZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKS5pc0Fic3RyYWN0KCk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldENvbnRlbnRUeXBlKCkKLSAgewotICAgIHJldHVybiBnZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKS5nZXRDb250ZW50KCk7Ci0gIH0KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0gIHsKLQkgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24gPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB0YXJnZXQ7Ci0JICBpZiAoaGFzU2V0UmVhZE9ubHlGaWVsZCgpKQotCSAgewotCQkgIGRlbGV0ZWRUeXBlcy5wdXQoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkgIGNoYW5nZVJlYWRPbmx5RmllbGQgPSBmYWxzZTsKLQkJICByZXR1cm4gcmVhZE9ubHk7Ci0JICB9Ci0JICBlbHNlCi0JICB7Ci0JCSAgaWYgKGRlbGV0ZWRUeXBlcyE9IG51bGwgKQotCQkgIHsKLQkJCSAgQm9vbGVhbiBkZWxldGVkID0gKChCb29sZWFuKWRlbGV0ZWRUeXBlcy5nZXQoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSkpOwotCQkJICBpZiAoZGVsZXRlZCAhPSBudWxsICYmIGRlbGV0ZWQuYm9vbGVhblZhbHVlKCkpCi0JCQkJICByZXR1cm4gdHJ1ZTsKLQkJCSAgZWxzZSByZXR1cm4gc3VwZXIuaXNSZWFkT25seSgpOwotCQkgIH0KLQkJICBlbHNlCi0JCQkgIHJldHVybiBzdXBlci5pc1JlYWRPbmx5KCk7Ci0JICB9Ci0gIH0KLQotcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCXRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKLX0KLQotcHVibGljIGJvb2xlYW4gaGFzU2V0UmVhZE9ubHlGaWVsZCgpIHsKLQlyZXR1cm4gY2hhbmdlUmVhZE9ubHlGaWVsZDsKLX0KLQotcHVibGljIHZvaWQgc2V0Q2hhbmdlUmVhZE9ubHlGaWVsZChib29sZWFuIHNldFJlYWRPbmx5RmllbGQpIHsKLQl0aGlzLmNoYW5nZVJlYWRPbmx5RmllbGQgPSBzZXRSZWFkT25seUZpZWxkOwotfQotCi1wdWJsaWMgdm9pZCB1cGRhdGVEZWxldGVkTWFwKFN0cmluZyBhZGRDb21wb25lbnQpCi17Ci0JaWYgKGRlbGV0ZWRUeXBlcy5nZXQoYWRkQ29tcG9uZW50KSAhPSBudWxsKQotCXsKLQkJZGVsZXRlZFR5cGVzLmNsZWFyKCk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTUwMWQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5UZXh0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TZXRJbnB1dFRvR3JhcGhWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5JQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLlNldE11bHRpcGxpY2l0eUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLlNldFR5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVOYW1lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBYU0RQYXJ0aWNsZUFkYXB0ZXIgaW1wbGVtZW50cyBJRmllbGQsIElBY3Rpb25Qcm92aWRlciwgSUFubm90YXRpb25Qcm92aWRlciwgSUdyYXBoRWxlbWVudAotewotICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgdGFyZ2V0OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIFN0cmluZyBuYW1lID0gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXROYW1lKCk7Ci0gICAgcmV0dXJuIChuYW1lID09IG51bGwpID8gIiIgOiBuYW1lOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkKLSAgewotICAgIElUeXBlIHR5cGUgPSBnZXRUeXBlKCk7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIHJldHVybiB0eXBlLmdldE5hbWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lUXVhbGlmaWVyKCkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgcHVibGljIElUeXBlIGdldFR5cGUoKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgLy9pZiAodGQgIT0gbnVsbCAmJgotICAgIC8vICAgIHRkLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwgJiYgdGQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSkpIHJldHVybiBudWxsOwotICAgIHJldHVybiAodGQgIT0gbnVsbCkgPyAoSVR5cGUpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQodGQpIDogbnVsbDsKLSAgfQotIAotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHRhcmdldDsKLSAgICAKLSAgICBpZiAoIXhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIGlmIChpc1JlYWRPbmx5KCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNERWxlbWVudGRpcy5naWYiKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREVsZW1lbnQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpc1JlYWRPbmx5KCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNERWxlbWVudFJlZmRpcy5naWYiKTsKLSAgICAgIH0gICAgICAgIAotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERWxlbWVudFJlZi5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgdGFyZ2V0OwotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgIC8vU3RyaW5nIG5hbWUgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24gIT0gcmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24gPyB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UU5hbWUoKSA6IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSByZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbi5nZXROYW1lKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZChNZXNzYWdlcy5fVUlfTEFCRUxfQUJTRU5UKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKCF4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNHbG9iYWwoKSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0RWxlbWVudCgpOwotICAgICAgYm9vbGVhbiBoYXNNaW5PY2N1cnMgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTUlOT0NDVVJTX0FUVFJJQlVURSk7Ci0gICAgICBib29sZWFuIGhhc01heE9jY3VycyA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5NQVhPQ0NVUlNfQVRUUklCVVRFKTsKLQotICAgICAgaWYgKGhhc01pbk9jY3VycyB8fCBoYXNNYXhPY2N1cnMpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBbIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGhhc01pbk9jY3VycykKLSAgICAgICAgewotICAgICAgICAgIGludCBtaW4gPSAoKFhTRFBhcnRpY2xlKSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkpLmdldE1pbk9jY3VycygpOwotICAgICAgICAgIGlmIChtaW4gPT0gWFNEUGFydGljbGUuVU5CT1VOREVEKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtaW4pKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAvLyBwcmludCBkZWZhdWx0Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbWluID0gKChYU0RQYXJ0aWNsZSkgeHNkRWxlbWVudERlY2xhcmF0aW9uLmdldENvbnRhaW5lcigpKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1pbikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoYXNNYXhPY2N1cnMpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbWF4ID0gKChYU0RQYXJ0aWNsZSkgeHNkRWxlbWVudERlY2xhcmF0aW9uLmdldENvbnRhaW5lcigpKS5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKCIuLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKG1heCA9PSBYU0RQYXJ0aWNsZS5VTkJPVU5ERUQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1heCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIC8vIHByaW50IGRlZmF1bHQKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi4uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpbnQgbWF4ID0gKChYU0RQYXJ0aWNsZSkgeHNkRWxlbWVudERlY2xhcmF0aW9uLmdldENvbnRhaW5lcigpKS5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1heCkpOwotCi0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCAmJiByZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZCgiIDogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIC8vIHJlc3VsdC5hcHBlbmQocmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24uZ2V0VHlwZURlZmluaXRpb24oKS5nZXRRTmFtZSh4c2RFbGVtZW50RGVjbGFyYXRpb24pKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQocmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24uZ2V0VHlwZURlZmluaXRpb24oKS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIFN0cmluZyB0ZXh0ID0gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgU3RyaW5nIHByb2Nlc3NlZFN0cmluZyA9IFRleHRQcm9jZXNzb3IucHJvY2Vzcyh0ZXh0LCAiOiIpOwotICAgIHJldHVybiBwcm9jZXNzZWRTdHJpbmc7Ci0KLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgdGFyZ2V0OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gbnVsbDsKLSAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgdHlwZSA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0eXBlID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgewotICAgICAgICB0eXBlID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gJiYgdHlwZS5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsICYmICF0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB0eXBlOwotICAgICAgaWYgKGN0VHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzR2xvYmFsKCkpCi0gICAgICAgICAgbGlzdC5hZGQoY3RUeXBlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiAoSVRyZWVFbGVtZW50W10pIGFkYXB0ZXJMaXN0LnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0KLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRLaW5kKCkKLSAgewotICAgIHJldHVybiAiZWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQotICB7Ci0gICAgcmV0dXJuIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKQotICB7Ci0JICByZXR1cm4gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHRhcmdldCkuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKTsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQoaW50IG1heE9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoaW50IG1pbk9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU5hbWVDb21tYW5kKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuIG5ldyBVcGRhdGVOYW1lQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9OQU1FLCBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLCBuYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZVR5cGVOYW1lQ29tbWFuZChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBxdWFpbGlmaWVyKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG5ldyBEZWxldGVDb21tYW5kKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGlmICghaXNHbG9iYWwoKSkKLSAgICB7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQgKyBNZXNzYWdlcy5fVUlfQUNUSU9OX0lOU0VSVF9FTEVNRU5UKTsKLSAgICAgIGxpc3QuYWRkKEFkZFhTREVsZW1lbnRBY3Rpb24uQkVGT1JFX1NFTEVDVEVEX0lEKTsKLSAgICAgIGxpc3QuYWRkKEFkZFhTREVsZW1lbnRBY3Rpb24uQUZURVJfU0VMRUNURURfSUQpOwotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX0VORF9JRCk7Ci0gICAgfQotCi0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX1NUQVJUX0lEICsgTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfVFlQRSk7Ci0gICAgbGlzdC5hZGQoU2V0VHlwZUFjdGlvbi5TRVRfTkVXX1RZUEVfSUQpOwotICAgIGxpc3QuYWRkKFNldFR5cGVBY3Rpb24uU0VMRUNUX0VYSVNUSU5HX1RZUEVfSUQpOwotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9FTkRfSUQpOwotCi0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX1NUQVJUX0lEICsgTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfTVVMVElQTElDSVRZKTsKLSAgICBsaXN0LmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uUkVRVUlSRURfSUQpOwotICAgIGxpc3QuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5aRVJPX09SX09ORV9JRCk7Ci0gICAgbGlzdC5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLlpFUk9fT1JfTU9SRV9JRCk7Ci0gICAgbGlzdC5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLk9ORV9PUl9NT1JFX0lEKTsgICAgCi0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX0VORF9JRCk7Ci0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoRGVsZXRlQWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgT2JqZWN0IHNjaGVtYSA9IGdldEVkaXRvclNjaGVtYSgpOwotICAgIGlmIChnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRTY2hlbWEoKSA9PSBzY2hlbWEpCi0gICAgewotICAgICAgaWYgKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldENvbnRhaW5lcigpID09IHNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0LmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIH0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICByZXR1cm4gKFN0cmluZyBbXSlsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRTY2hlbWEoKSk7Ci0gICAgcmV0dXJuIChJTW9kZWwpYWRhcHRlcjsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCkKLSAgewotICAgIHJldHVybiBpc0dsb2JhbCgpOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIGlmICghaXNHbG9iYWwoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0R2xvYmFsWFNEQ29udGFpbmVyKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKQotICB7Ci0gICAgcmV0dXJuIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmlzQWJzdHJhY3QoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNERW1wdHlGaWVsZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREVtcHR5RmllbGRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOWI4ZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNERW1wdHlGaWVsZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgbm90IHVzZWQKLSAqLwotcHVibGljIGNsYXNzIFhTREVtcHR5RmllbGRBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJRmllbGQKLXsKLSAgU3RyaW5nIGtpbmQ7Ci0gIHB1YmxpYyBYU0RFbXB0eUZpZWxkQWRhcHRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRLaW5kKCkKLSAgewotICAgIHJldHVybiBraW5kOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRLaW5kKFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZVF1YWxpZmllcigpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSVR5cGUgZ2V0VHlwZSgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1pbk9jY3VycygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1heE9jY3VycygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoaW50IG1pbk9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQoaW50IG1heE9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZVR5cGVOYW1lQ29tbWFuZChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBxdWFpbGlmaWVyKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTmFtZUNvbW1hbmQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNERW51bWVyYXRpb25GYWNldEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREVudW1lcmF0aW9uRmFjZXRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZGZiZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNERW51bWVyYXRpb25GYWNldEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERW51bWVyYXRpb25GYWNldDsKLQotcHVibGljIGNsYXNzIFhTREVudW1lcmF0aW9uRmFjZXRBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJQWN0aW9uUHJvdmlkZXIsIElHcmFwaEVsZW1lbnQKLXsKLSAgcHVibGljIFhTREVudW1lcmF0aW9uRmFjZXQgZ2V0WFNERW51bWVyYXRpb25GYWNldCgpCi0gIHsKLSAgICByZXR1cm4gKFhTREVudW1lcmF0aW9uRmFjZXQpdGFyZ2V0OwotICB9Ci0gIAotICBwdWJsaWMgWFNERW51bWVyYXRpb25GYWNldEFkYXB0ZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX1NUQVJUX0lEICsgTWVzc2FnZXMuX1VJX0FDVElPTl9JTlNFUlRfRU5VTUVSQVRJT04pOwotICAgIGxpc3QuYWRkKEFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24uQkVGT1JFX1NFTEVDVEVEX0lEKTsKLSAgICBsaXN0LmFkZChBZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uLkFGVEVSX1NFTEVDVEVEX0lEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfRU5EX0lEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoRGVsZXRlQWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICByZXR1cm4gKFN0cmluZyBbXSlsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVFbnVtLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIHJldHVybiBuZXcgRGVsZXRlQ29tbWFuZChnZXRYU0RFbnVtZXJhdGlvbkZhY2V0KCkpOwotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTREVudW1lcmF0aW9uRmFjZXQoKS5nZXRTY2hlbWEoKSk7Ci0gICAgcmV0dXJuIChJTW9kZWwpYWRhcHRlcjsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldFRvcENvbnRhaW5lcigpCi0gIHsKLSAgICByZXR1cm4gZ2V0R2xvYmFsWFNEQ29udGFpbmVyKGdldFhTREVudW1lcmF0aW9uRmFjZXQoKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNERW51bWVyYXRpb25GYWNldCgpLmdldExleGljYWxWYWx1ZSgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRE1vZGVsR3JvdXBBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RNb2RlbEdyb3VwQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDRhY2VjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRE1vZGVsR3JvdXBBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREFueUVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNETW9kZWxHcm91cEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0TXVsdGlwbGljaXR5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5Nb2RlbEdyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTRE1vZGVsR3JvdXBBZGFwdGVyIGV4dGVuZHMgWFNEUGFydGljbGVBZGFwdGVyIGltcGxlbWVudHMgSUFjdGlvblByb3ZpZGVyLCBJR3JhcGhFbGVtZW50Ci17Ci0gIFhTRE1vZGVsR3JvdXAgZ2V0WFNETW9kZWxHcm91cCgpCi0gIHsKLSAgICByZXR1cm4gKFhTRE1vZGVsR3JvdXApIHRhcmdldDsKLSAgfQotCi0gIHB1YmxpYyBYU0RNb2RlbEdyb3VwQWRhcHRlcigpCi0gIHsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudCNnZXRJbWFnZSgpCi0gICAqLwotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwID0gZ2V0WFNETW9kZWxHcm91cCgpOwotICAgIGlmIChYU0RDb21wb3NpdG9yLkNIT0lDRV9MSVRFUkFMID09IHhzZE1vZGVsR3JvdXAuZ2V0Q29tcG9zaXRvcigpKQotICAgIHsKLSAgICAgIHJldHVybiBNb2RlbEdyb3VwRmlndXJlLkNIT0lDRV9JQ09OX0lNQUdFOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RDb21wb3NpdG9yLkFMTF9MSVRFUkFMID09IHhzZE1vZGVsR3JvdXAuZ2V0Q29tcG9zaXRvcigpKQotICAgIHsKLSAgICAgIHJldHVybiBNb2RlbEdyb3VwRmlndXJlLkFMTF9JQ09OX0lNQUdFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIE1vZGVsR3JvdXBGaWd1cmUuU0VRVUVOQ0VfSUNPTl9JTUFHRTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50I2dldFRleHQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9IGdldFhTRE1vZGVsR3JvdXAoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSB4c2RNb2RlbEdyb3VwLmdldENvbXBvc2l0b3IoKS5nZXROYW1lKCk7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIH0KLQotICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZE1vZGVsR3JvdXAuZ2V0RWxlbWVudCgpOwotCi0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBib29sZWFuIGhhc01pbk9jY3VycyA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgIGJvb2xlYW4gaGFzTWF4T2NjdXJzID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUpOwotCi0gICAgICBpZiAoaGFzTWluT2NjdXJzIHx8IGhhc01heE9jY3VycykKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIFsiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoaGFzTWluT2NjdXJzKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IG1pbiA9ICgoWFNEUGFydGljbGUpIHhzZE1vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCkpLmdldE1pbk9jY3VycygpOwotICAgICAgICAgIGlmIChtaW4gPT0gWFNEUGFydGljbGUuVU5CT1VOREVEKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtaW4pKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAvLyBwcmludCBkZWZhdWx0Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbWluID0gKChYU0RQYXJ0aWNsZSkgeHNkTW9kZWxHcm91cC5nZXRDb250YWluZXIoKSkuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtaW4pKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGFzTWF4T2NjdXJzKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IG1heCA9ICgoWFNEUGFydGljbGUpIHhzZE1vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCkpLmdldE1heE9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi4uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAobWF4ID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWF4KSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgLy8gcHJpbnQgZGVmYXVsdAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGludCBtYXggPSAoKFhTRFBhcnRpY2xlKSB4c2RNb2RlbEdyb3VwLmdldENvbnRhaW5lcigpKS5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1heCkpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwID0gZ2V0WFNETW9kZWxHcm91cCgpOwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICAgT2JqZWN0IG9iamVjdCA9IGkubmV4dCgpOwotICAgICAgIFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZSA9ICgoWFNEUGFydGljbGUpb2JqZWN0KS5nZXRDb250ZW50KCk7Ci0gICAgICAgaWYgKHBhcnRpY2xlIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgIHsKLSAgICAgICAgIGxpc3QuYWRkKHBhcnRpY2xlKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZSBpZiAocGFydGljbGUgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICAgICB7Ci0gICAgICAgICBsaXN0LmFkZChwYXJ0aWNsZSk7Ci0gICAgICAgfQotICAgICAgIGVsc2UgaWYgKHBhcnRpY2xlIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICB7Ci0gICAgICAgICBsaXN0LmFkZChwYXJ0aWNsZSk7Ci0gICAgICAgfQotICAgICAgIGVsc2UgaWYgKHBhcnRpY2xlIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgeyAKLSAgICAJIC8vbGlzdC5hZGQoKChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbilwYXJ0aWNsZSkuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpKTsKLSAgICAJIGxpc3QuYWRkKHBhcnRpY2xlKTsKLSAgICAgICB9Ci0gICAgfQotCi0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGxpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gKElUcmVlRWxlbWVudCBbXSkgYWRhcHRlckxpc3QudG9BcnJheShuZXcgSVRyZWVFbGVtZW50WzBdKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwIGVsZW1lbnQgPSAoWFNETW9kZWxHcm91cCkgb2JqZWN0OwotICAgIHJldHVybiBlbGVtZW50LmdldENvbnRhaW5lcigpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlciNnZXRBY3Rpb25zKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgIENvbGxlY3Rpb24gYWN0aW9uSURzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTREVsZW1lbnRBY3Rpb24uSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTREVsZW1lbnRBY3Rpb24uUkVGX0lEKTsKLSAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RBbnlFbGVtZW50QWN0aW9uLklEKTsKLSAgICAgLy8gQWRkIEVsZW1lbnQgUmVmCi0gICAgIGFjdGlvbklEcy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uU0VRVUVOQ0VfSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uQ0hPSUNFX0lEKTsKLSAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLkFMTF9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uLk1PREVMR1JPVVBERUZJTklUSU9OUkVGX0lEKTsKLS8vICAgICBhY3Rpb25JRHMuYWRkKEFkZEZpZWxkQWN0aW9uLklEKTsKLSAgICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgIC8vIEFkZCBBbnkKLQotICAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9TVEFSVF9JRCArIE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0VUX01VTFRJUExJQ0lUWSk7Ci0gICAgIGFjdGlvbklEcy5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLlJFUVVJUkVEX0lEKTsKLSAgICAgYWN0aW9uSURzLmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uWkVST19PUl9PTkVfSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5aRVJPX09SX01PUkVfSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5PTkVfT1JfTU9SRV9JRCk7ICAgIAotICAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9FTkRfSUQpOwotICAgIAotICAgICBpZiAoIShnZXRQYXJlbnQodGFyZ2V0KSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSkKLSAgICAgewotICAgICAgIGFjdGlvbklEcy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgICAgIGFjdGlvbklEcy5hZGQoRGVsZXRlQWN0aW9uLklEKTsKLSAgICAgfSAgICAKLSAgICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICAgICAgCi0gICAgIHJldHVybiAoU3RyaW5nIFtdKWFjdGlvbklEcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNYXhPY2N1cnMoKQotICB7Ci0gICAgcmV0dXJuIGdldE1heE9jY3VycyhnZXRYU0RNb2RlbEdyb3VwKCkpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNaW5PY2N1cnMoKQotICB7Ci0gICAgcmV0dXJuIGdldE1pbk9jY3VycyhnZXRYU0RNb2RlbEdyb3VwKCkpOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9IGdldFhTRE1vZGVsR3JvdXAoKTsKLSAgICByZXR1cm4gZ2V0R2xvYmFsWFNEQ29udGFpbmVyKHhzZE1vZGVsR3JvdXApOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBEZWxldGVDb21tYW5kKGdldFhTRE1vZGVsR3JvdXAoKSk7CQotICB9Ci0gIAotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZ2V0WFNETW9kZWxHcm91cCgpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmNkMTkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TZXRJbnB1dFRvR3JhcGhWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNETW9kZWxHcm91cEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLlNldE11bHRpcGxpY2l0eUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5TcGFjZUZpbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlciBleHRlbmRzIFhTRFBhcnRpY2xlQWRhcHRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmUsIElBY3Rpb25Qcm92aWRlciwgSUdyYXBoRWxlbWVudCwgSUFEVE9iamVjdExpc3RlbmVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgTU9ERUxfR1JPVVBfSUNPTiA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RHcm91cC5naWYiKTsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIE1PREVMX0dST1VQX0RJU0FCTEVEX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNER3JvdXBkaXMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBNT0RFTF9HUk9VUF9SRUZfSUNPTiA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RHcm91cFJlZi5naWYiKTsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIE1PREVMX0dST1VQX1JFRl9ESVNBQkxFRF9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREdyb3VwUmVmZGlzLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLSAgcHJvdGVjdGVkIExpc3QgZmllbGRzID0gbnVsbDsKLSAgcHJvdGVjdGVkIExpc3Qgb3RoZXJUaGluZ3NUb0xpc3RlblRvID0gbnVsbDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZE9ubHk7Ci0gIHByb3RlY3RlZCBib29sZWFuIGNoYW5nZVJlYWRPbmx5RmllbGQgPWZhbHNlOwotICBwcm90ZWN0ZWQgSGFzaE1hcCBkZWxldGVkVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICAKLSAgcHVibGljIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHRhcmdldDsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotCi0gICAgaWYgKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gTU9ERUxfR1JPVVBfUkVGX0RJU0FCTEVEX0lDT047Ci0gICAgICB9Ci0gICAgICByZXR1cm4gTU9ERUxfR1JPVVBfUkVGX0lDT047Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gTU9ERUxfR1JPVVBfRElTQUJMRURfSUNPTjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBNT0RFTF9HUk9VUF9JQ09OOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotICAgIGlmICh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuZ2V0Q29udGFpbmVyKCkgPT0gbnVsbCAmJiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXROYW1lKCkgPT1udWxsKSByZXR1cm4gIiI7ICAgLy8gUmVtb3ZlZAotICAgIFN0cmluZyByZXN1bHQgPSB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkgPyB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRRTmFtZSgpIDogeHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0TmFtZSgpOwotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IE1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNFTlQgOiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZGVmID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKXRhcmdldDsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgLy8gQnVnMjQ2MDM2IC0gbmVlZCB0byBzdG9wIHNob3dpbmcgZWxlbWVudCBjb250ZW50IGluIGEgY3ljbGUuCi0gICAgLy8gQW5kLCB3ZSBzaG91bGQgbm90IHNob3cgYW55IGVsZW1lbnQgY29udGVudCBmb3IgcmVmZXJlbmNlcyBvdGhlcndpc2UgdGhlcmUgd2lsbCBiZSB0d28KLSAgICAvLyBlbnRyaWVzIGluIHRoZSB0cmVlIHZpZXdlciBmb3IgdGhlIHNhbWUgaXRlbQotICAgIGlmICghZGVmLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAgPSAoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSB0YXJnZXQpLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRNb2RlbEdyb3VwKCk7Ci0gICAgICBpZiAoeHNkTW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgICBsaXN0LmFkZCh4c2RNb2RlbEdyb3VwKTsKLSAgICB9Ci0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiAoSVRyZWVFbGVtZW50W10pIGFkYXB0ZXJMaXN0LnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXIjZ2V0QWN0aW9ucyhqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIENvbGxlY3Rpb24gbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWZpbml0aW9uID0gZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICBib29sZWFuIGlzTW9kZWxHcm91cFJlZmVyZW5jZSA9IG1vZGVsR3JvdXBEZWZpbml0aW9uLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKTsKLSAgICBpZiAoIWlzTW9kZWxHcm91cFJlZmVyZW5jZSkKLSAgICB7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RFbGVtZW50QWN0aW9uLklEKTsKLSAgICAgIGxpc3QuYWRkKEFkZFhTREVsZW1lbnRBY3Rpb24uUkVGX0lEKTsKLSAgICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICAgIGxpc3QuYWRkKEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uU0VRVUVOQ0VfSUQpOwotICAgICAgbGlzdC5hZGQoQWRkWFNETW9kZWxHcm91cEFjdGlvbi5DSE9JQ0VfSUQpOwotICAgICAgbGlzdC5hZGQoQWRkWFNETW9kZWxHcm91cEFjdGlvbi5BTExfSUQpOwotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIH0KLSAgICAKLSAgICBsaXN0LmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgIAotICAgIGlmIChpc01vZGVsR3JvdXBSZWZlcmVuY2UpCi0gICAgewotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX1NUQVJUX0lEICsgTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfTVVMVElQTElDSVRZKTsKLSAgICAgIGxpc3QuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5SRVFVSVJFRF9JRCk7Ci0gICAgICBsaXN0LmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uWkVST19PUl9PTkVfSUQpOwotICAgICAgbGlzdC5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLlpFUk9fT1JfTU9SRV9JRCk7Ci0gICAgICBsaXN0LmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uT05FX09SX01PUkVfSUQpOyAgICAKLSAgICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9FTkRfSUQpOyAKLSAgICB9Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIE9iamVjdCBzY2hlbWEgPSBnZXRFZGl0b3JTY2hlbWEoKTsKLSAgICBpZiAobW9kZWxHcm91cERlZmluaXRpb24uZ2V0U2NoZW1hKCkgPT0gc2NoZW1hKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbnRhaW5lciA9IG1vZGVsR3JvdXBEZWZpbml0aW9uLmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKGNvbnRhaW5lciA9PSBzY2hlbWEgfHwgY29udGFpbmVyIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGlzdC5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICB9Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0KLSAgICByZXR1cm4gKFN0cmluZyBbXSlsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRBZGROZXdGaWVsZENvbW1hbmQoU3RyaW5nIGZpZWxkS2luZCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKSk7Ci0gIH0KLQotICAvLyBUT0RPIENvbW1vbiB0aGlzIHVwIHdpdGggWFNEQ29tcGxleFR5cGUncy4gIFNlZSBhbHNvIGdldEZpZWxkcyAKLSAgcHJvdGVjdGVkIHZvaWQgY2xlYXJGaWVsZHMoKQotICB7Ci0gICAgaWYgKG90aGVyVGhpbmdzVG9MaXN0ZW5UbyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG90aGVyVGhpbmdzVG9MaXN0ZW5Uby5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgSUFEVE9iamVjdCBhZHRPYmplY3QgPSAoSUFEVE9iamVjdCkgYWRhcHRlcjsKLSAgICAgICAgICBhZHRPYmplY3QudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGZpZWxkcyA9IG51bGw7Ci0gICAgb3RoZXJUaGluZ3NUb0xpc3RlblRvID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEZpZWxkcygpCi0gIHsKLSAgICBMaXN0IGZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgWFNEVmlzaXRvckZvckZpZWxkcyB2aXNpdG9yID0gbmV3IFhTRFZpc2l0b3JGb3JHcm91cEZpZWxkc1dpdGhTcGFjZUZpbGxlcnMoKTsKLSAgICB2aXNpdG9yLnZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKSk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdCh2aXNpdG9yLmNvbmNyZXRlQ29tcG9uZW50TGlzdCwgZmllbGRzKTsKLSAgICAKLSAgICAvLyBUT0RPIChjcykgY29tbW9uIGEgYmFzZSBjbGFzcyBmb3IgYSBzdHJ1Y3R1cmUgdGhpbmdlZQotICAgIC8vCi0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdCh2aXNpdG9yLnRoaW5nc1dlTmVlZFRvTGlzdGVuVG8sIG90aGVyVGhpbmdzVG9MaXN0ZW5Ubyk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gb3RoZXJUaGluZ3NUb0xpc3RlblRvLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgaS5uZXh0KCk7Ci0gICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICB7Ci0gICAgICAgIElBRFRPYmplY3QgYWR0T2JqZWN0ID0gKElBRFRPYmplY3QpIGFkYXB0ZXI7Ci0gICAgICAgIGFkdE9iamVjdC5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmllbGRzOwotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIFhTRFZpc2l0b3JGb3JHcm91cEZpZWxkc1dpdGhTcGFjZUZpbGxlcnMgZXh0ZW5kcyBYU0RWaXNpdG9yRm9yRmllbGRzCi0gIHsKLSAgICBwdWJsaWMgWFNEVmlzaXRvckZvckdyb3VwRmllbGRzV2l0aFNwYWNlRmlsbGVycygpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIGludCBudW1PZkNoaWxkcmVuID0gbW9kZWxHcm91cC5nZXRDb250ZW50cygpLnNpemUoKTsKLSAgICAgIGlmIChudW1PZkNoaWxkcmVuID09IDApCi0gICAgICB7Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQobmV3IFNwYWNlRmlsbGVyKCJlbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBzdXBlci52aXNpdE1vZGVsR3JvdXAobW9kZWxHcm91cCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZikKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiByZXNvbHZlZE1vZGVsR3JvdXBEZWYgPSBtb2RlbEdyb3VwRGVmLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICAgIGlmICh2aXNpdGVkR3JvdXBzLmNvbnRhaW5zKHJlc29sdmVkTW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCkpKQotICAgICAgewotICAgICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKG5ldyBTcGFjZUZpbGxlcigiZWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgc3VwZXIudmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihtb2RlbEdyb3VwRGVmKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRTY2hlbWEoKSk7Ci0gICAgcmV0dXJuIChJTW9kZWwpYWRhcHRlcjsKLSAgfQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgaWYgKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7IAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBjbGVhckZpZWxkcygpOwotICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBudWxsKTsKLSAgfQotICAKLSAgcHVibGljIGludCBnZXRNYXhPY2N1cnMoKQotICB7Ci0gICAgcmV0dXJuIGdldE1heE9jY3VycyhnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXJzKCkKLSAgewotICAgIHJldHVybiBnZXRNaW5PY2N1cnMoZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKSk7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZ3JvdXAgPSBnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbnRhaW5lciA9IGdyb3VwLmdldENvbnRhaW5lcigpOwotICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBYU0RTY2hlbWEgfHwgY29udGFpbmVyIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICByZXR1cm4gdGhpczsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZ2V0R2xvYmFsWFNEQ29udGFpbmVyKGdyb3VwKTsKLSAgfQotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgewotCSAgWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb24gPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHRhcmdldDsKLQkgIGlmIChoYXNTZXRSZWFkT25seUZpZWxkKCkpCi0JICB7Ci0JCSAgZGVsZXRlZFR5cGVzLnB1dCh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXROYW1lKCksIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJICBjaGFuZ2VSZWFkT25seUZpZWxkID0gZmFsc2U7Ci0JCSAgcmV0dXJuIHJlYWRPbmx5OwotCSAgfQotCSAgZWxzZQotCSAgewotCQkgIGlmIChkZWxldGVkVHlwZXMhPSBudWxsICkKLQkJICB7Ci0JCQkgIEJvb2xlYW4gZGVsZXRlZCA9ICgoQm9vbGVhbilkZWxldGVkVHlwZXMuZ2V0KHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSkpOwotCQkJICBpZiAoZGVsZXRlZCAhPSBudWxsICYmIGRlbGV0ZWQuYm9vbGVhblZhbHVlKCkpCi0JCQkJICByZXR1cm4gdHJ1ZTsKLQkJCSAgZWxzZSByZXR1cm4gc3VwZXIuaXNSZWFkT25seSgpOwotCQkgIH0KLQkJICBlbHNlCi0JCQkgIHJldHVybiBzdXBlci5pc1JlYWRPbmx5KCk7Ci0JICB9Ci0JCi0JICAKLSAgfQotCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQl0aGlzLnJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU2V0UmVhZE9ubHlGaWVsZCgpIHsKLQkJcmV0dXJuIGNoYW5nZVJlYWRPbmx5RmllbGQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlUmVhZE9ubHlGaWVsZChib29sZWFuIHNldFJlYWRPbmx5RmllbGQpIHsKLQkJdGhpcy5jaGFuZ2VSZWFkT25seUZpZWxkID0gc2V0UmVhZE9ubHlGaWVsZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVEZWxldGVkTWFwKFN0cmluZyBhZGRDb21wb25lbnQpIHsKLQkJaWYgKGRlbGV0ZWRUeXBlcy5nZXQoYWRkQ29tcG9uZW50KSAhPSBudWxsKQotCQkJZGVsZXRlZFR5cGVzLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEUGFydGljbGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RQYXJ0aWNsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2NjQ5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RQYXJ0aWNsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5JQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci0KLXB1YmxpYyBjbGFzcyBYU0RQYXJ0aWNsZUFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElBbm5vdGF0aW9uUHJvdmlkZXIKLXsKLSAgcHVibGljIFhTRFBhcnRpY2xlQWRhcHRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNYXhPY2N1cnMoKQotICB7Ci0gICAgcmV0dXJuIGdldE1heE9jY3VycygoWFNEQ29uY3JldGVDb21wb25lbnQpIHRhcmdldCk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1pbk9jY3VycygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWluT2NjdXJzKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgdGFyZ2V0KTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldE1pbk9jY3VycyhYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpbnQgbWluT2NjdXIgPSAtMjsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBjb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICBpZiAoKChYU0RQYXJ0aWNsZSkgbykuaXNTZXRNaW5PY2N1cnMoKSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1pbk9jY3VyID0gKChYU0RQYXJ0aWNsZSkgbykuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtaW5PY2N1cjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldE1heE9jY3VycyhYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpbnQgbWF4T2NjdXIgPSAtMjsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBjb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICBpZiAoKChYU0RQYXJ0aWNsZSkgbykuaXNTZXRNYXhPY2N1cnMoKSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1heE9jY3VyID0gKChYU0RQYXJ0aWNsZSkgbykuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXhPY2N1cjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUFubm90YXRpb25TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIGJ1aWxkQW5ub3RhdGlvblN0cmluZyh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUFubm90YXRpb25Ub29sVGlwU3RyaW5nKCkKLSAgewotICAgIHJldHVybiBidWlsZEFubm90YXRpb25TdHJpbmcoZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlQW5ub3RhdGlvblN0cmluZygpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUFubm90YXRpb25Ub29sVGlwU3RyaW5nKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBidWlsZEFubm90YXRpb25TdHJpbmcoYm9vbGVhbiBpc0ZvckxhYmVsKQotICB7Ci0gICAgU3RyaW5nIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgdG9vbFRpcERlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAvLyBUT0RPOiBzZXQgaW50IHZhbHVlcyBhcyBkZWZpbmVkIGNvbnN0YW50cwotICAgIC8vIC0yIG1lYW5zIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IChzbyB0aGUgZGVmYXVsdCBpcyAxKQotICAgIGludCBtaW5PY2N1cnMgPSBnZXRNaW5PY2N1cnMoKTsKLSAgICBpbnQgbWF4T2NjdXJzID0gZ2V0TWF4T2NjdXJzKCk7Ci0KLSAgICAvLyBUaGlzIGlzIGZvciB0aGUgYXR0cmlidXRlIGZpZWxkIGNhc2UsIHdoaWNoIGhhcyBubwotICAgIC8vIG9jY3VycmVuY2UgYXR0cmlidXRlcwotICAgIGlmIChtaW5PY2N1cnMgPT0gLTMgJiYgbWF4T2NjdXJzID09IC0zKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZSBpZiAobWluT2NjdXJzID09IDAgJiYgKG1heE9jY3VycyA9PSAtMiB8fCBtYXhPY2N1cnMgPT0gMSkpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSAiWzAuLjFdIjsgLy8kTk9OLU5MUy0xJAotICAgICAgdG9vbFRpcERlc2NyaXB0aW9uID0gTWVzc2FnZXMuX1VJX0xBQkVMX09QVElPTkFMOwotICAgIH0KLSAgICBlbHNlIGlmIChtaW5PY2N1cnMgPT0gMCAmJiBtYXhPY2N1cnMgPT0gLTEpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSAiWzAuLipdIjsgLy8kTk9OLU5MUy0xJAotICAgICAgdG9vbFRpcERlc2NyaXB0aW9uID0gTWVzc2FnZXMuX1VJX0xBQkVMX1pFUk9fT1JfTU9SRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKG1pbk9jY3VycyA9PSAxICYmIG1heE9jY3VycyA9PSAtMSkgfHwgKG1pbk9jY3VycyA9PSAtMiAmJiBtYXhPY2N1cnMgPT0gLTEpKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gIlsxLi4qXSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHRvb2xUaXBEZXNjcmlwdGlvbiA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9PTkVfT1JfTU9SRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKG1pbk9jY3VycyA9PSAxICYmIG1heE9jY3VycyA9PSAxKSB8fCAobWluT2NjdXJzID09IC0yICYmIG1heE9jY3VycyA9PSAxKSB8fCAobWluT2NjdXJzID09IDEgJiYgbWF4T2NjdXJzID09IC0yKSkKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9ICJbMS4uMV0iOyAvLyROT04tTkxTLTEkCi0gICAgICB0b29sVGlwRGVzY3JpcHRpb24gPSBNZXNzYWdlcy5fVUlfTEFCRUxfUkVRVUlSRUQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1pbk9jY3VycyA9PSAtMiAmJiBtYXhPY2N1cnMgPT0gLTIpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgLy8gbm9uZSBzcGVjaWZpZWQsIHNvIGRvbid0IGhhdmUgYW55IHRvb2xUaXAgZGVzY3JpcHRpb24KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChtYXhPY2N1cnMgPT0gLTIpCi0gICAgICAgIG1heE9jY3VycyA9IDE7Ci0gICAgICBTdHJpbmcgbWF4U3ltYm9sID0gbWF4T2NjdXJzID09IC0xID8gIioiIDogIiIgKyBtYXhPY2N1cnM7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgU3RyaW5nIG1pblN5bWJvbCA9IG1pbk9jY3VycyA9PSAtMiA/ICIxIiA6ICIiICsgbWluT2NjdXJzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gIlsiICsgbWluU3ltYm9sICsgIi4uIiArIG1heFN5bWJvbCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIHRvb2xUaXBEZXNjcmlwdGlvbiA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9BUlJBWTsKLSAgICB9Ci0KLSAgICBpZiAoaXNGb3JMYWJlbCkKLSAgICB7Ci0gICAgICByZXR1cm4gb2NjdXJlbmNlRGVzY3JpcHRpb247Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gdG9vbFRpcERlc2NyaXB0aW9uOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RSZWRlZmluZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFJlZGVmaW5lQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmJjNjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFJlZGVmaW5lQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIFhTRFJlZGVmaW5lQWRhcHRlciBleHRlbmRzIFhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIKLXsKLQotICBwdWJsaWMgWFNEUmVkZWZpbmVBZGFwdGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgWFNEUmVkZWZpbmUgeHNkUmVkZWZpbmUgPSAoWFNEUmVkZWZpbmUpZ2V0VGFyZ2V0KCk7Ci0KLSAgICBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGlmIChhdHRyaWJ1dGVzQ2F0ZWdvcnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IGF0dHJpYnV0ZXMgPSBnZXRDYXRlZ29yeUNoaWxkcmVuKENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTKTsKLSAgICAgIExpc3QgZ3JvdXBzID0gZ2V0Q2F0ZWdvcnlDaGlsZHJlbihDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTKTsKLSAgICAgIExpc3QgdHlwZXMgPSBnZXRDYXRlZ29yeUNoaWxkcmVuKENhdGVnb3J5QWRhcHRlci5UWVBFUyk7Ci0KLSAgICAgIGF0dHJpYnV0ZXNDYXRlZ29yeS5zZXRDaGlsZHJlbihhdHRyaWJ1dGVzKTsKLSAgICAgIGF0dHJpYnV0ZXNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihhdHRyaWJ1dGVzKTsKLSAgICAgIHR5cGVzQ2F0ZWdvcnkuc2V0Q2hpbGRyZW4odHlwZXMpOwotICAgICAgdHlwZXNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbih0eXBlcyk7Ci0gICAgICBncm91cHNDYXRlZ29yeS5zZXRDaGlsZHJlbihncm91cHMpOwotICAgICAgZ3JvdXBzQ2F0ZWdvcnkuc2V0QWxsQ2hpbGRyZW4oZ3JvdXBzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNyZWF0ZUNhdGVnb3J5QWRhcHRlcnMoeHNkUmVkZWZpbmUpOwotICAgIH0KLQotICAgIGNoaWxkcmVuLmFkZChhdHRyaWJ1dGVzQ2F0ZWdvcnkpOwotICAgIGNoaWxkcmVuLmFkZCh0eXBlc0NhdGVnb3J5KTsKLSAgICBjaGlsZHJlbi5hZGQoZ3JvdXBzQ2F0ZWdvcnkpOwotCi0gICAgcmV0dXJuIChJVHJlZUVsZW1lbnRbXSljaGlsZHJlbi50b0FycmF5KG5ldyBJVHJlZUVsZW1lbnQgWzBdKTsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldFRvcENvbnRhaW5lcigpCi0gIHsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgdHlwZXMgPSBudWxsOwotCi0gIHByb3RlY3RlZCBMaXN0IGNoaWxkcmVuLCBhbGxDaGlsZHJlbjsKLQotICBwcm90ZWN0ZWQgQ2F0ZWdvcnlBZGFwdGVyIGF0dHJpYnV0ZXNDYXRlZ29yeTsKLQotICBwcm90ZWN0ZWQgQ2F0ZWdvcnlBZGFwdGVyIHR5cGVzQ2F0ZWdvcnk7Ci0KLSAgcHJvdGVjdGVkIENhdGVnb3J5QWRhcHRlciBncm91cHNDYXRlZ29yeTsKLQotICAvKioKLSAgICogQ3JlYXRlIGFsbCB0aGUgY2F0ZWdvcnkgYWRhcHRlcnMKLSAgICogCi0gICAqIEBwYXJhbSB4c2RSZWRlZmluZSB0aGUgcGFyZW50IHJlZGVmaW5lIGNvbXBvbmVudAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNhdGVnb3J5QWRhcHRlcnMoWFNEUmVkZWZpbmUgeHNkUmVkZWZpbmUpCi0gIHsKLSAgICBMaXN0IGF0dHJpYnV0ZXMgPSBnZXRDYXRlZ29yeUNoaWxkcmVuKENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTKTsKLSAgICBMaXN0IGdyb3VwcyA9IGdldENhdGVnb3J5Q2hpbGRyZW4oQ2F0ZWdvcnlBZGFwdGVyLkdST1VQUyk7Ci0gICAgTGlzdCB0eXBlcyA9IGdldENhdGVnb3J5Q2hpbGRyZW4oQ2F0ZWdvcnlBZGFwdGVyLlRZUEVTKTsKLQotICAgIFhTREVkaXRvclBsdWdpbiB4c2RFZGl0b3JQbHVnaW4gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpOwotICAgIGF0dHJpYnV0ZXNDYXRlZ29yeSA9IG5ldyBSZWRlZmluZUNhdGVnb3J5QWRhcHRlcigKLSAgICAgIE1lc3NhZ2VzLl9VSV9HUkFQSF9SRURFRklORV9BVFRSSUJVVEVfR1JPVVBTLAotICAgICAgeHNkRWRpdG9yUGx1Z2luLmdldEljb25JbWFnZSgib2JqMTYvYXR0cmlidXRlc2hlYWRlciIpLCBhdHRyaWJ1dGVzLCB4c2RSZWRlZmluZSwgdGhpcywgQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVMpOyAvLyROT04tTkxTLTEkCi0gICAgYXR0cmlidXRlc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGF0dHJpYnV0ZXMpOwotICAgIHJlZ2lzdGVyTGlzdGVuZXIoYXR0cmlidXRlc0NhdGVnb3J5KTsKLQotICAgIHR5cGVzQ2F0ZWdvcnkgPSBuZXcgUmVkZWZpbmVDYXRlZ29yeUFkYXB0ZXIoCi0gICAgICBNZXNzYWdlcy5fVUlfR1JBUEhfUkVERUZJTkVfVFlQRVMsCi0gICAgICB4c2RFZGl0b3JQbHVnaW4uZ2V0SWNvbkltYWdlKCJvYmoxNi90eXBlc2hlYWRlciIpLCB0eXBlcywgeHNkUmVkZWZpbmUsIHRoaXMsIENhdGVnb3J5QWRhcHRlci5UWVBFUyk7IC8vJE5PTi1OTFMtMSQKLSAgICB0eXBlc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKHR5cGVzKTsKLSAgICByZWdpc3Rlckxpc3RlbmVyKHR5cGVzQ2F0ZWdvcnkpOwotCi0gICAgZ3JvdXBzQ2F0ZWdvcnkgPSBuZXcgUmVkZWZpbmVDYXRlZ29yeUFkYXB0ZXIoCi0gICAgICBNZXNzYWdlcy5fVUlfR1JBUEhfUkVERUZJTkVfR1JPVVBTLAotICAgICAgeHNkRWRpdG9yUGx1Z2luLmdldEljb25JbWFnZSgib2JqMTYvZ3JvdXBzaGVhZGVyIiksIGdyb3VwcywgeHNkUmVkZWZpbmUsIHRoaXMsIENhdGVnb3J5QWRhcHRlci5HUk9VUFMpOyAvLyROT04tTkxTLTEkCi0gICAgZ3JvdXBzQ2F0ZWdvcnkuc2V0QWxsQ2hpbGRyZW4oZ3JvdXBzKTsKLSAgICByZWdpc3Rlckxpc3RlbmVyKGdyb3Vwc0NhdGVnb3J5KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG1zZykKLSAgewotICAgIGNsYXNzIENhdGVnb3J5Tm90aWZpY2F0aW9uIGV4dGVuZHMgTm90aWZpY2F0aW9uSW1wbAotICAgIHsKLSAgICAgIHByb3RlY3RlZCBPYmplY3QgY2F0ZWdvcnk7Ci0KLSAgICAgIHB1YmxpYyBDYXRlZ29yeU5vdGlmaWNhdGlvbihPYmplY3QgY2F0ZWdvcnkpCi0gICAgICB7Ci0gICAgICAgIHN1cGVyKG1zZy5nZXRFdmVudFR5cGUoKSwgbXNnLmdldE9sZFZhbHVlKCksIG1zZy5nZXROZXdWYWx1ZSgpLCBtc2cuZ2V0UG9zaXRpb24oKSk7Ci0gICAgICAgIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjYXRlZ29yeTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG1zZy5nZXRGZWF0dXJlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGNoaWxkcmVuID09IG51bGwpCi0gICAgewotICAgICAgZ2V0Q2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBPYmplY3QgbmV3VmFsdWUgPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLSAgICBPYmplY3Qgb2xkVmFsdWUgPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQotICAgIGlmIChYU0RQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RSZWRlZmluZV9Db250ZW50cygpID09IG1zZy5nZXRGZWF0dXJlKCkpCi0gICAgewotICAgICAgaWYgKChuZXdWYWx1ZSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgfHwgb2xkVmFsdWUgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gZ2V0Q2F0ZWdvcnkoQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVMpOwotICAgICAgICBBc3NlcnQuaXNUcnVlKGFkYXB0ZXIgIT0gbnVsbCk7Ci0gICAgICAgIExpc3QgbGlzdCA9IGdldENhdGVnb3J5Q2hpbGRyZW4oQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVMpOwotICAgICAgICBhZGFwdGVyLnNldENoaWxkcmVuKGxpc3QpOwotICAgICAgICBhZGFwdGVyLnNldEFsbENoaWxkcmVuKGxpc3QpOwotICAgICAgIAotICAgICAgICBpZiAoYWRhcHRlci5nZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNEU2NoZW1hQWRhcHRlcikKLSAgICAgICAgewotICAgICAgICAJWFNEU2NoZW1hQWRhcHRlciBzY2hlbWFBZGFwdGVyID0gKFhTRFNjaGVtYUFkYXB0ZXIpYWRhcHRlci5nZXRNb2RlbCgpOwotICAgICAgICAJc2NoZW1hQWRhcHRlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0gICAgICAgIH0KLSAgICAgICAKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihhZGFwdGVyKSwgYWRhcHRlci5nZXRUZXh0KCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgobmV3VmFsdWUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gfHwgbmV3VmFsdWUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgfHwgKG9sZFZhbHVlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHx8IG9sZFZhbHVlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pKQotICAgICAgewotICAgICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5UWVBFUyk7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoYWRhcHRlciAhPSBudWxsKTsKLSAgICAgICAgTGlzdCB0eXBlcyA9IGdldENhdGVnb3J5Q2hpbGRyZW4oQ2F0ZWdvcnlBZGFwdGVyLlRZUEVTKTsKLSAgICAgICAgYWRhcHRlci5zZXRDaGlsZHJlbih0eXBlcyk7Ci0gICAgICAgIGFkYXB0ZXIuc2V0QWxsQ2hpbGRyZW4odHlwZXMpOwotICAgICAgICBpZiAoYWRhcHRlci5nZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNEU2NoZW1hQWRhcHRlcikKLSAgICAgICAgewotICAgICAgICAJWFNEU2NoZW1hQWRhcHRlciBzY2hlbWFBZGFwdGVyID0gKFhTRFNjaGVtYUFkYXB0ZXIpYWRhcHRlci5nZXRNb2RlbCgpOwotICAgICAgICAJc2NoZW1hQWRhcHRlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihhZGFwdGVyKSwgYWRhcHRlci5nZXRUZXh0KCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHx8IG9sZFZhbHVlIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gZ2V0Q2F0ZWdvcnkoQ2F0ZWdvcnlBZGFwdGVyLkdST1VQUyk7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoYWRhcHRlciAhPSBudWxsKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gZ2V0Q2F0ZWdvcnlDaGlsZHJlbihDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTKTsKLSAgICAgICAgYWRhcHRlci5zZXRDaGlsZHJlbihsaXN0KTsKLSAgICAgICAgYWRhcHRlci5zZXRBbGxDaGlsZHJlbihsaXN0KTsgCi0gICAgICAgIGlmIChhZGFwdGVyLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWFBZGFwdGVyKQotICAgICAgICB7Ci0gICAgICAgIAlYU0RTY2hlbWFBZGFwdGVyIHNjaGVtYUFkYXB0ZXIgPSAoWFNEU2NoZW1hQWRhcHRlcilhZGFwdGVyLmdldE1vZGVsKCk7Ci0gICAgICAgIAlzY2hlbWFBZGFwdGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlMaXN0ZW5lcnMobmV3IENhdGVnb3J5Tm90aWZpY2F0aW9uKGFkYXB0ZXIpLCBhZGFwdGVyLmdldFRleHQoKSk7ICAgICAgIAotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYV9Bbm5vdGF0aW9ucygpKQotICAgICAgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVDYXRlZ29yaWVzKCkKLSAgewotICAgIGdldENoaWxkcmVuKCk7Ci0gIH0KLQotICBwdWJsaWMgQ2F0ZWdvcnlBZGFwdGVyIGdldENhdGVnb3J5KGludCBjYXRlZ29yeSkKLSAgewotICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUNhdGVnb3JpZXMoKTsKLSAgICB9Ci0gICAgaW50IGxlbmd0aCA9IGNoaWxkcmVuLnNpemUoKTsKLSAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBhZGFwdGVyID0gKENhdGVnb3J5QWRhcHRlciljaGlsZHJlbi5nZXQoaW5kZXgpOwotICAgICAgaWYgKGFkYXB0ZXIuZ2V0R3JvdXBUeXBlKCkgPT0gY2F0ZWdvcnkpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWRhcHRlcjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBDb2xsZWN0aW9uIGFjdGlvbklEcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGFjdGlvbklEcy5hZGQoRGVsZXRlQWN0aW9uLklEKTsKLSAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBhY3Rpb25JRHMuYWRkKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgIGFjdGlvbklEcy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGFjdGlvbklEcy5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLQotICAgIHJldHVybiAoU3RyaW5nW10pYWN0aW9uSURzLnRvQXJyYXkobmV3IFN0cmluZyBbMF0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIG5vdGlmeUxpc3RlbmVycyhvYmplY3QsIHByb3BlcnR5KTsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RSZWRlZmluZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHJpdmF0ZSBMaXN0IGdldENhdGVnb3J5Q2hpbGRyZW4oaW50IGNhdGVnb3J5KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFhTRFJlZGVmaW5lIHJlZGVmaW5lID0gKFhTRFJlZGVmaW5lKXRhcmdldDsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHJlZGVmaW5lLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFhTRFJlZGVmaW5lQ29udGVudCByZWRlZmluZUNvbnRlbnQgPSAoWFNEUmVkZWZpbmVDb250ZW50KWl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgaWYgKHJlZGVmaW5lQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiAmJiBjYXRlZ29yeSA9PSBDYXRlZ29yeUFkYXB0ZXIuQVRUUklCVVRFUykKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQocmVkZWZpbmVDb250ZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJlZGVmaW5lQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uICYmIGNhdGVnb3J5ID09IENhdGVnb3J5QWRhcHRlci5HUk9VUFMpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKHJlZGVmaW5lQ29udGVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyZWRlZmluZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gJiYgY2F0ZWdvcnkgPT0gQ2F0ZWdvcnlBZGFwdGVyLlRZUEVTKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChyZWRlZmluZUNvbnRlbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocmVkZWZpbmVDb250ZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gJiYgY2F0ZWdvcnkgPT0gQ2F0ZWdvcnlBZGFwdGVyLlRZUEVTKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChyZWRlZmluZUNvbnRlbnQpOwotICAgICAgfQotICAgIH0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiBhZGFwdGVyTGlzdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFNjaGVtYUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFNjaGVtYUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzMGU1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTY2hlbWFBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFRhZGEgVGFrYXRvc2hpIC8gRnVqaXRzdSAtIGJ1ZyAyNDU0ODAgLSBwcm92aWRlZCBpbml0aWFsIHBhdGNoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYUFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElBY3Rpb25Qcm92aWRlciwgSU1vZGVsLCBJQURUT2JqZWN0TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIExpc3QgdHlwZXMgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCBjaGlsZHJlbiwgYWxsQ2hpbGRyZW47Ci0KLSAgcHJvdGVjdGVkIENhdGVnb3J5QWRhcHRlciBmRGlyZWN0aXZlc0NhdGVnb3J5OwotICBwcm90ZWN0ZWQgQ2F0ZWdvcnlBZGFwdGVyIGZFbGVtZW50c0NhdGVnb3J5OwotICBwcm90ZWN0ZWQgQ2F0ZWdvcnlBZGFwdGVyIGZBdHRyaWJ1dGVzQ2F0ZWdvcnk7Ci0gIHByb3RlY3RlZCBDYXRlZ29yeUFkYXB0ZXIgZlR5cGVzQ2F0ZWdvcnk7Ci0gIHByb3RlY3RlZCBDYXRlZ29yeUFkYXB0ZXIgZkdyb3Vwc0NhdGVnb3J5OwotCi0gIC8qKgotICAgKiBDcmVhdGUgYWxsIHRoZSBjYXRlZ29yeSBhZGFwdGVycwotICAgKiAKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2F0ZWdvcnlBZGFwdGVycyhYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgTGlzdCBkaXJlY3RpdmVzTGlzdCA9IGdldERpcmVjdGl2ZXMoeHNkU2NoZW1hKTsKLSAgICBMaXN0IGVsZW1lbnRzTGlzdCA9IGdldEdsb2JhbEVsZW1lbnRzKHhzZFNjaGVtYSk7Ci0gICAgTGlzdCBhdHRyaWJ1dGVzTGlzdCA9IGdldEF0dHJpYnV0ZUxpc3QoeHNkU2NoZW1hKTsKLSAgICBMaXN0IGdyb3VwcyA9IGdldEdyb3Vwcyh4c2RTY2hlbWEpOwotICAgIExpc3QgdHlwZXMgPSBnZXRDb21wbGV4VHlwZXMoeHNkU2NoZW1hKTsKLSAgICB0eXBlcy5hZGRBbGwoZ2V0U2ltcGxlVHlwZXMoeHNkU2NoZW1hKSk7Ci0KLSAgICBmRGlyZWN0aXZlc0NhdGVnb3J5ID0gbmV3IENhdGVnb3J5QWRhcHRlcihNZXNzYWdlcy5fVUlfR1JBUEhfRElSRUNUSVZFUywgWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJY29uSW1hZ2UoIm9iajE2L2RpcmVjdGl2ZXNoZWFkZXIiKSwgZGlyZWN0aXZlc0xpc3QsIHhzZFNjaGVtYSwgQ2F0ZWdvcnlBZGFwdGVyLkRJUkVDVElWRVMpOyAvLyROT04tTkxTLTEkCi0gICAgZkRpcmVjdGl2ZXNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihkaXJlY3RpdmVzTGlzdCk7Ci0gICAgcmVnaXN0ZXJMaXN0ZW5lcihmRGlyZWN0aXZlc0NhdGVnb3J5KTsKLQotICAgIGZFbGVtZW50c0NhdGVnb3J5ID0gbmV3IENhdGVnb3J5QWRhcHRlcihNZXNzYWdlcy5fVUlfR1JBUEhfRUxFTUVOVFMsIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWNvbkltYWdlKCJvYmoxNi9lbGVtZW50c2hlYWRlciIpLCBlbGVtZW50c0xpc3QsIHhzZFNjaGVtYSwgQ2F0ZWdvcnlBZGFwdGVyLkVMRU1FTlRTKTsgIC8vJE5PTi1OTFMtMSQKLSAgICBmRWxlbWVudHNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihnZXRHbG9iYWxFbGVtZW50cyh4c2RTY2hlbWEsIHRydWUpKTsKLSAgICByZWdpc3Rlckxpc3RlbmVyKGZFbGVtZW50c0NhdGVnb3J5KTsKLQotICAgIGZBdHRyaWJ1dGVzQ2F0ZWdvcnkgPSBuZXcgQ2F0ZWdvcnlBZGFwdGVyKE1lc3NhZ2VzLl9VSV9HUkFQSF9BVFRSSUJVVEVTLCBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEljb25JbWFnZSgib2JqMTYvYXR0cmlidXRlc2hlYWRlciIpLCBhdHRyaWJ1dGVzTGlzdCwgeHNkU2NoZW1hLCBDYXRlZ29yeUFkYXB0ZXIuQVRUUklCVVRFUyk7ICAgLy8kTk9OLU5MUy0xJAotICAgIGZBdHRyaWJ1dGVzQ2F0ZWdvcnkuc2V0QWxsQ2hpbGRyZW4oZ2V0QXR0cmlidXRlTGlzdCh4c2RTY2hlbWEsdHJ1ZSkpOwotICAgIHJlZ2lzdGVyTGlzdGVuZXIoZkF0dHJpYnV0ZXNDYXRlZ29yeSk7Ci0KLSAgICBmVHlwZXNDYXRlZ29yeSA9IG5ldyBDYXRlZ29yeUFkYXB0ZXIoTWVzc2FnZXMuX1VJX0dSQVBIX1RZUEVTLCBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEljb25JbWFnZSgib2JqMTYvdHlwZXNoZWFkZXIiKSwgdHlwZXMsIHhzZFNjaGVtYSwgQ2F0ZWdvcnlBZGFwdGVyLlRZUEVTKTsgIC8vJE5PTi1OTFMtMSQKLSAgICBmVHlwZXNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihnZXRUeXBlcyh4c2RTY2hlbWEsIHRydWUpKTsKLSAgICByZWdpc3Rlckxpc3RlbmVyKGZUeXBlc0NhdGVnb3J5KTsKLQotICAgIGZHcm91cHNDYXRlZ29yeSA9IG5ldyBDYXRlZ29yeUFkYXB0ZXIoTWVzc2FnZXMuX1VJX0dSQVBIX0dST1VQUywgWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJY29uSW1hZ2UoIm9iajE2L2dyb3Vwc2hlYWRlciIpLCBncm91cHMsIHhzZFNjaGVtYSwgQ2F0ZWdvcnlBZGFwdGVyLkdST1VQUyk7IC8vJE5PTi1OTFMtMSQKLSAgICBmR3JvdXBzQ2F0ZWdvcnkuc2V0QWxsQ2hpbGRyZW4oZ2V0R3JvdXBzKHhzZFNjaGVtYSx0cnVlKSk7Ci0gICAgcmVnaXN0ZXJMaXN0ZW5lcihmR3JvdXBzQ2F0ZWdvcnkpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0VHlwZXMoKQotICB7Ci0gICAgaWYgKHR5cGVzID09IG51bGwpCi0gICAgewotICAgICAgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSkgdGFyZ2V0OwotICAgICAgTGlzdCBjb25jcmV0ZUNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaS5uZXh0KCk7Ci0gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQoY29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcG9wdWxhdGVBZGFwdGVyTGlzdChjb25jcmV0ZUNvbXBvbmVudExpc3QsIHR5cGVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NhbWVOYW1lc3BhY2UoU3RyaW5nIG5zMSwgU3RyaW5nIG5zMikKLSAgewotICAgIGlmIChuczEgPT0gbnVsbCkgbnMxID0gIiI7Ci0gICAgaWYgKG5zMiA9PSBudWxsKSBuczIgPSAiIjsKLSAgICAKLSAgICBpZiAobnMxLmVxdWFscyhuczIpKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50I2dldENoaWxkcmVuKCkKLSAgICovCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gKFhTRFNjaGVtYSkgZ2V0VGFyZ2V0KCk7Ci0KLSAgICBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8vIGp1c3Qgc2V0IGNhdGVnb3J5YWRhcHRlcnMnIGNoaWxkcmVuIGlmIGNhdGVnb3J5IGFkYXB0ZXJzIGFyZQotICAgIC8vIGFscmVhZHkgY3JlYXRlZAotICAgIGlmIChmRGlyZWN0aXZlc0NhdGVnb3J5ICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBkaXJlY3RpdmVzTGlzdCA9IGdldERpcmVjdGl2ZXMoeHNkU2NoZW1hKTsKLSAgICAgIExpc3QgZWxlbWVudHNMaXN0ID0gZ2V0R2xvYmFsRWxlbWVudHMoeHNkU2NoZW1hKTsKLSAgICAgIExpc3QgYXR0cmlidXRlc0xpc3QgPSBnZXRBdHRyaWJ1dGVMaXN0KHhzZFNjaGVtYSk7Ci0gICAgICBMaXN0IGdyb3VwcyA9IGdldEdyb3Vwcyh4c2RTY2hlbWEpOwotICAgICAgTGlzdCB0eXBlcyA9IGdldENvbXBsZXhUeXBlcyh4c2RTY2hlbWEpOwotICAgICAgdHlwZXMuYWRkQWxsKGdldFNpbXBsZVR5cGVzKHhzZFNjaGVtYSkpOwotCi0gICAgICBmRGlyZWN0aXZlc0NhdGVnb3J5LnNldENoaWxkcmVuKGRpcmVjdGl2ZXNMaXN0KTsKLSAgICAgIGZEaXJlY3RpdmVzQ2F0ZWdvcnkuc2V0QWxsQ2hpbGRyZW4oZGlyZWN0aXZlc0xpc3QpOwotICAgICAgZkVsZW1lbnRzQ2F0ZWdvcnkuc2V0Q2hpbGRyZW4oZWxlbWVudHNMaXN0KTsKLSAgICAgIGZFbGVtZW50c0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGdldEdsb2JhbEVsZW1lbnRzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgICAgZkF0dHJpYnV0ZXNDYXRlZ29yeS5zZXRDaGlsZHJlbihhdHRyaWJ1dGVzTGlzdCk7Ci0gICAgICBmQXR0cmlidXRlc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGdldEF0dHJpYnV0ZUxpc3QoeHNkU2NoZW1hLCB0cnVlKSk7Ci0gICAgICBmVHlwZXNDYXRlZ29yeS5zZXRDaGlsZHJlbih0eXBlcyk7Ci0gICAgICBmVHlwZXNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihnZXRUeXBlcyh4c2RTY2hlbWEsIHRydWUpKTsKLSAgICAgIGZHcm91cHNDYXRlZ29yeS5zZXRDaGlsZHJlbihncm91cHMpOwotICAgICAgZkdyb3Vwc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGdldEdyb3Vwcyh4c2RTY2hlbWEsIHRydWUpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNyZWF0ZUNhdGVnb3J5QWRhcHRlcnMoeHNkU2NoZW1hKTsKLSAgICB9Ci0KLSAgICBjaGlsZHJlbi5hZGQoZkRpcmVjdGl2ZXNDYXRlZ29yeSk7Ci0gICAgY2hpbGRyZW4uYWRkKGZFbGVtZW50c0NhdGVnb3J5KTsKLSAgICBjaGlsZHJlbi5hZGQoZkF0dHJpYnV0ZXNDYXRlZ29yeSk7Ci0gICAgY2hpbGRyZW4uYWRkKGZUeXBlc0NhdGVnb3J5KTsKLSAgICBjaGlsZHJlbi5hZGQoZkdyb3Vwc0NhdGVnb3J5KTsKLQotICAgIHJldHVybiAoSVRyZWVFbGVtZW50W10pIGNoaWxkcmVuLnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpCi0gIHsKLSAgICBjbGFzcyBDYXRlZ29yeU5vdGlmaWNhdGlvbiBleHRlbmRzIE5vdGlmaWNhdGlvbkltcGwKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgT2JqZWN0IGNhdGVnb3J5OwotCi0gICAgICBwdWJsaWMgQ2F0ZWdvcnlOb3RpZmljYXRpb24oT2JqZWN0IGNhdGVnb3J5KQotICAgICAgewotICAgICAgICBzdXBlcihtc2cuZ2V0RXZlbnRUeXBlKCksIG1zZy5nZXRPbGRWYWx1ZSgpLCBtc2cuZ2V0TmV3VmFsdWUoKSwgbXNnLmdldFBvc2l0aW9uKCkpOwotICAgICAgICB0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKQotICAgICAgewotICAgICAgICByZXR1cm4gY2F0ZWdvcnk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBtc2cuZ2V0RmVhdHVyZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKQotICAgIHsKLSAgICAgIGdldENoaWxkcmVuKCk7Ci0gICAgfQotICAgIAotICAgIE9iamVjdCBuZXdWYWx1ZSA9IG1zZy5nZXROZXdWYWx1ZSgpOwotICAgIAotICAgIE9iamVjdCBvbGRWYWx1ZSA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotICAgIC8vIEJ1ZyAyNDU0ODAgLSBEZWxldGlvbiBvZiBJbmNsdWRlLCBJbXBvcnQgYW5kIFJlZGVmaW5lIGlzIG5vdCByZWZsZWN0ZWQgaW4gdGhlIE91dGxpbmUgdmlldwotICAgIC8vIFdlIG9ubHkgd2FudCB0byByZWZyZXNoIHRoZSBEaXJlY3RpdmVzIGZvbGRlciBmb3IgYW55IGNoYW5nZXMgdG8gWFNERGlyZWN0aXZlcy4gIFRoZSBmaXJzdCBjYXNlIGNvdmVycwotICAgIC8vIGNoYW5nZXMgdG8gb25lIGRpcmVjdGl2ZSwgd2hlcmVhcyB0aGUgbWlzc2luZyBjYXNlIGFzIHJlcG9ydGVkIGluIGJ1ZyAyNDU0ODAgY292ZXJzIGNoYW5nZXMgdG8gYSBsaXN0Ci0gICAgLy8gb2YgZGlyZWN0aXZlcy4KLSAgICBib29sZWFuIHVwZGF0ZURpcmVjdGl2ZXNDYXRlZ29yeSA9IGZhbHNlOwotICAgIGlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLSAgICB7Ci0gICAgICB1cGRhdGVEaXJlY3RpdmVzQ2F0ZWdvcnkgPSB0cnVlOwotICAgIH0KLSAgICBlbHNlIGlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pCi0gICAgewotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENvbGxlY3Rpb24pIG9sZFZhbHVlKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGlmIHdlIGZpbmQgYXQgbGVhc3Qgb25lIGRpcmVjdGl2ZSwgdGhlbiB3ZSBzaG91bGQgcmVmcmVzaCB0aGUgZm9sZGVyCi0gICAgICAgICAgdXBkYXRlRGlyZWN0aXZlc0NhdGVnb3J5ID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBYU0RJbmNsdWRlIHx8IG5ld1ZhbHVlIGluc3RhbmNlb2YgWFNESW1wb3J0IHx8IG5ld1ZhbHVlIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUgfHwKLSAgICAgICAgKG1zZy5nZXRGZWF0dXJlKCkgPT0gWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hX0NvbnRlbnRzKCkgJiYgdXBkYXRlRGlyZWN0aXZlc0NhdGVnb3J5KSB8fCAvLyBoYW5kbGUgdGhlIGNhc2UgZm9yIGRlbGV0ZSBkaXJlY3RpdmUKLSAgICAgICAgIG1zZy5nZXRGZWF0dXJlKCkgPT0gWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hX0luY29ycG9yYXRlZFZlcnNpb25zKCkpIC8vIHVwZGF0ZXMgdG8gdGhlIGltcG9ydHMvaW5jbHVkZXMKLSAgICB7Ci0gICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5ESVJFQ1RJVkVTKTsKLSAgICAgIEFzc2VydC5pc1RydWUoYWRhcHRlciAhPSBudWxsKTsKLSAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBhZGFwdGVyLmdldFhTRFNjaGVtYSgpOwotICAgICAgYWRhcHRlci5zZXRDaGlsZHJlbihnZXREaXJlY3RpdmVzKHhzZFNjaGVtYSkpOwotICAgICAgYWRhcHRlci5zZXRBbGxDaGlsZHJlbihnZXREaXJlY3RpdmVzKHhzZFNjaGVtYSkpOwotICAgICAgbm90aWZ5TGlzdGVuZXJzKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihhZGFwdGVyKSwgYWRhcHRlci5nZXRUZXh0KCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYV9FbGVtZW50RGVjbGFyYXRpb25zKCkpCi0gICAgewotICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSBnZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuRUxFTUVOVFMpOwotICAgICAgQXNzZXJ0LmlzVHJ1ZShhZGFwdGVyICE9IG51bGwpOwotICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGFkYXB0ZXIuZ2V0WFNEU2NoZW1hKCk7Ci0gICAgICBhZGFwdGVyLnNldENoaWxkcmVuKGdldEdsb2JhbEVsZW1lbnRzKHhzZFNjaGVtYSkpOwotICAgICAgYWRhcHRlci5zZXRBbGxDaGlsZHJlbihnZXRHbG9iYWxFbGVtZW50cyh4c2RTY2hlbWEsIHRydWUpKTsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyhuZXcgQ2F0ZWdvcnlOb3RpZmljYXRpb24oYWRhcHRlciksIGFkYXB0ZXIuZ2V0VGV4dCgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBYU0RQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFfQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgfHwKLSAgICAgICAgICAgICBtc2cuZ2V0RmVhdHVyZSgpID09IFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYV9BdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkpCi0gICAgewotICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSBnZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuQVRUUklCVVRFUyk7Ci0gICAgICBBc3NlcnQuaXNUcnVlKGFkYXB0ZXIgIT0gbnVsbCk7Ci0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gYWRhcHRlci5nZXRYU0RTY2hlbWEoKTsKLSAgICAgIGFkYXB0ZXIuc2V0Q2hpbGRyZW4oZ2V0QXR0cmlidXRlTGlzdCh4c2RTY2hlbWEpKTsKLSAgICAgIGFkYXB0ZXIuc2V0QWxsQ2hpbGRyZW4oZ2V0QXR0cmlidXRlTGlzdCh4c2RTY2hlbWEsIHRydWUpKTsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyhuZXcgQ2F0ZWdvcnlOb3RpZmljYXRpb24oYWRhcHRlciksIGFkYXB0ZXIuZ2V0VGV4dCgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBYU0RQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFfVHlwZURlZmluaXRpb25zKCkpCi0gICAgewotICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSBnZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuVFlQRVMpOwotICAgICAgQXNzZXJ0LmlzVHJ1ZShhZGFwdGVyICE9IG51bGwpOwotICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGFkYXB0ZXIuZ2V0WFNEU2NoZW1hKCk7Ci0gICAgICBMaXN0IHR5cGVzID0gZ2V0Q29tcGxleFR5cGVzKHhzZFNjaGVtYSk7Ci0gICAgICB0eXBlcy5hZGRBbGwoZ2V0U2ltcGxlVHlwZXMoeHNkU2NoZW1hKSk7Ci0KLSAgICAgIGFkYXB0ZXIuc2V0Q2hpbGRyZW4odHlwZXMpOwotICAgICAgYWRhcHRlci5zZXRBbGxDaGlsZHJlbihnZXRUeXBlcyh4c2RTY2hlbWEsIHRydWUpKTsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyhuZXcgQ2F0ZWdvcnlOb3RpZmljYXRpb24oYWRhcHRlciksIGFkYXB0ZXIuZ2V0VGV4dCgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBYU0RQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFfTW9kZWxHcm91cERlZmluaXRpb25zKCkpCi0gICAgewotICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSBnZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTKTsKLSAgICAgIEFzc2VydC5pc1RydWUoYWRhcHRlciAhPSBudWxsKTsKLSAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBhZGFwdGVyLmdldFhTRFNjaGVtYSgpOwotICAgICAgYWRhcHRlci5zZXRDaGlsZHJlbihnZXRHcm91cHMoeHNkU2NoZW1hKSk7Ci0gICAgICBhZGFwdGVyLnNldEFsbENoaWxkcmVuKGdldEdyb3Vwcyh4c2RTY2hlbWEsIHRydWUpKTsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyhuZXcgQ2F0ZWdvcnlOb3RpZmljYXRpb24oYWRhcHRlciksIGFkYXB0ZXIuZ2V0VGV4dCgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBYU0RQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFfQW5ub3RhdGlvbnMoKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hX1NjaGVtYUxvY2F0aW9uKCkpCi0gICAgewotICAgICAgbm90aWZ5TGlzdGVuZXJzKG1zZywgbnVsbCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIHR5cGVzID0gbnVsbDsKLSAgICBnZXRUeXBlcygpOwotCi0gICAgc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB1cGRhdGVDYXRlZ29yaWVzKCkKLSAgewotICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcwotICAgIGdldENoaWxkcmVuKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDYXRlZ29yeUFkYXB0ZXIgZ2V0Q2F0ZWdvcnkoaW50IGNhdGVnb3J5KQotICB7Ci0gICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHVwZGF0ZUNhdGVnb3JpZXMoKTsgLy8gaW5pdCBjYXRlZ29yaWVzCi0gICAgaW50IGxlbmd0aCA9IGNoaWxkcmVuLnNpemUoKTsKLSAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBhZGFwdGVyID0gKENhdGVnb3J5QWRhcHRlcikgY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgaWYgKGFkYXB0ZXIuZ2V0R3JvdXBUeXBlKCkgPT0gIGNhdGVnb3J5KQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGFkYXB0ZXI7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXREaXJlY3RpdmVzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQobyk7Ci0gICAgICB9Ci0gICAgfQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIGFkYXB0ZXJMaXN0OwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRHbG9iYWxFbGVtZW50cyhYU0RTY2hlbWEgc2NoZW1hLCBib29sZWFuIHNob3dGcm9tSW5jbHVkZXMpCi0gIHsKLSAgICBMaXN0IGVsZW1lbnRzID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaS5uZXh0KCk7Ci0gICAgICBpZiAoc2hvdWxkU2hvd0NvbXBvbmVudChlbGVtLCBzY2hlbWEsIHNob3dGcm9tSW5jbHVkZXMpKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChlbGVtKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGxpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gYWRhcHRlckxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRHbG9iYWxFbGVtZW50cyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgcmV0dXJuIGdldEdsb2JhbEVsZW1lbnRzKHNjaGVtYSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBzY2hlbWEKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0Q29tcGxleFR5cGVzKFhTRFNjaGVtYSBzY2hlbWEsIGJvb2xlYW4gc2hvd0Zyb21JbmNsdWRlcykKLSAgewotICAgIExpc3QgYWxsVHlwZXMgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGFsbFR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IChYU0RUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICBpZiAodGQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHRkOwotICAgICAgICBpZiAoc2hvdWxkU2hvd0NvbXBvbmVudChjdCwgc2NoZW1hLCBzaG93RnJvbUluY2x1ZGVzKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiBhZGFwdGVyTGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldENvbXBsZXhUeXBlcyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgcmV0dXJuIGdldENvbXBsZXhUeXBlcyhzY2hlbWEsIGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0VHlwZXMoWFNEU2NoZW1hIHNjaGVtYSwgYm9vbGVhbiBzaG93RnJvbUluY2x1ZGVzKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gZ2V0Q29tcGxleFR5cGVzKHNjaGVtYSwgc2hvd0Zyb21JbmNsdWRlcyk7Ci0gICAgbGlzdC5hZGRBbGwoZ2V0U2ltcGxlVHlwZXMoc2NoZW1hLCBzaG93RnJvbUluY2x1ZGVzKSk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZUdyb3VwTGlzdChYU0RTY2hlbWEgeHNkU2NoZW1hLCBib29sZWFuIHNob3dGcm9tSW5jbHVkZXMpCi0gIHsKLSAgICBMaXN0IGF0dHJpYnV0ZUdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICBpZiAoc2hvdWxkU2hvd0NvbXBvbmVudChhdHRyR3JvdXAsIHhzZFNjaGVtYSwgc2hvd0Zyb21JbmNsdWRlcykpCi0gICAgICB7Ci0gICAgICAgIGF0dHJpYnV0ZUdyb3VwTGlzdC5hZGQoYXR0ckdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGF0dHJpYnV0ZUdyb3VwTGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiBhZGFwdGVyTGlzdDsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlR3JvdXBMaXN0KFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlR3JvdXBMaXN0KHhzZFNjaGVtYSwgZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlTGlzdChYU0RTY2hlbWEgeHNkU2NoZW1hLCBib29sZWFuIHNob3dGcm9tSW5jbHVkZXMpCi0gIHsKLSAgICBMaXN0IGF0dHJpYnV0ZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIG87Ci0gICAgICAgIGlmIChhdHRyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYXR0ci5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghKGF0dHIuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfSU5TVEFOQ0VfVVJJXzIwMDEpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dDb21wb25lbnQoYXR0ciwgeHNkU2NoZW1hLHNob3dGcm9tSW5jbHVkZXMpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlc0xpc3QuYWRkKGF0dHIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkU2hvd0NvbXBvbmVudChhdHRyLCB4c2RTY2hlbWEsc2hvd0Zyb21JbmNsdWRlcykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGF0dHJpYnV0ZXNMaXN0LmFkZChhdHRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgYXR0cmlidXRlc0xpc3QuYWRkQWxsKGdldEF0dHJpYnV0ZUdyb3VwTGlzdCh4c2RTY2hlbWEsIHNob3dGcm9tSW5jbHVkZXMpKTsKLSAgICAKLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QoYXR0cmlidXRlc0xpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gYWRhcHRlckxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZUxpc3QoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGVMaXN0KHhzZFNjaGVtYSwgZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0U2ltcGxlVHlwZXMoWFNEU2NoZW1hIHNjaGVtYSwgYm9vbGVhbiBzaG93RnJvbUluY2x1ZGVzKQotICB7Ci0gICAgTGlzdCBhbGxUeXBlcyA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gYWxsVHlwZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmICh0ZCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdGQ7Ci0gICAgICAgIGlmIChzaG91bGRTaG93Q29tcG9uZW50KHN0LCBzY2hlbWEsIHNob3dGcm9tSW5jbHVkZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoc3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIGFkYXB0ZXJMaXN0OwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRTaW1wbGVUeXBlcyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgcmV0dXJuIGdldFNpbXBsZVR5cGVzKHNjaGVtYSwgZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0R3JvdXBzKFhTRFNjaGVtYSBzY2hlbWEsIGJvb2xlYW4gc2hvd0Zyb21JbmNsdWRlcykKLSAgewotICAgIExpc3QgZ3JvdXBzID0gc2NoZW1hLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpOwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBncm91cHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGdyb3VwID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmIChzaG91bGRTaG93Q29tcG9uZW50KGdyb3VwLCBzY2hlbWEsIHNob3dGcm9tSW5jbHVkZXMpKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChncm91cCk7Ci0gICAgICB9Ci0gICAgfQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIGFkYXB0ZXJMaXN0OwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRHcm91cHMoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHJldHVybiBnZXRHcm91cHMoc2NoZW1hLCBmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgIENvbGxlY3Rpb24gYWN0aW9uSURzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTREVsZW1lbnRBY3Rpb24uSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbi5JRCk7Ci0KLSAgICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICAgcmV0dXJuIChTdHJpbmcgW10pYWN0aW9uSURzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgbm90aWZ5TGlzdGVuZXJzKG9iamVjdCwgcHJvcGVydHkpOwotICB9Ci0gIAotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERmlsZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2hvd0NvbXBvbmVudChYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQsIFhTRFNjaGVtYSBzY2hlbWEsIGJvb2xlYW4gc2hvd0Zyb21JbmNsdWRlcykgCi0gIHsKLQkgIHJldHVybiBpc1NhbWVOYW1lc3BhY2UoY29tcG9uZW50LmdldFRhcmdldE5hbWVzcGFjZSgpLCBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpICYmIChjb21wb25lbnQuZ2V0Um9vdENvbnRhaW5lcigpID09IHNjaGVtYSB8fCBzaG93RnJvbUluY2x1ZGVzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2U4OWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgSUFjdGlvblByb3ZpZGVyLCBJR3JhcGhFbGVtZW50Ci17Ci0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RTY2hlbWFEaXJlY3RpdmUgb2JqZWN0ID0gKFhTRFNjaGVtYURpcmVjdGl2ZSkgdGFyZ2V0OwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNESW1wb3J0LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREluY2x1ZGUpCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNESW5jbHVkZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RSZWRlZmluZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICBYU0RTY2hlbWFEaXJlY3RpdmUgZGlyZWN0aXZlID0gKFhTRFNjaGVtYURpcmVjdGl2ZSkgdGFyZ2V0OwotICAgIFN0cmluZyByZXN1bHQgPSAiIjsKLQotICAgIFN0cmluZyBsb2NhdGlvbiA9IGRpcmVjdGl2ZS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgIGlmIChsb2NhdGlvbiA9PSBudWxsIHx8IGxvY2F0aW9uLmVxdWFscygiIikgKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICIoIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9OT19MT0NBVElPTl9TUEVDSUZJRUQgKyAiKSI7IAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gbG9jYXRpb247Ci0gICAgfSAgCi0KLSAgICAvLyBvbmx5IHNob3cgdGhlIG5hbWVzcGFjZSB3aGVuIHRoZSBkaXJlY3RpYXZlIGlzIGFuIGltcG9ydAotICAgIC8vIChvdGhlcndpc2UgdGhlIG5hbWVzcGFjZSBpcyBvYnZpb3VzbHkgdGhlIHNhbWUgYXMgdGhlIGNvbnRhaW5pbmcgc2NoZW1hJ3MpCi0gICAgaWYgKGRpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICB7Ci0gICAgICBYU0RJbXBvcnQgaW1wb3J0T2JqID0gKFhTREltcG9ydCkgZGlyZWN0aXZlOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGltcG9ydE9iai5nZXROYW1lc3BhY2UoKTsKLSAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQgKz0gIiAgeyIgKyBuYW1lc3BhY2UgKyAifSI7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGxpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gKElUcmVlRWxlbWVudFtdKSBhZGFwdGVyTGlzdC50b0FycmF5KG5ldyBJVHJlZUVsZW1lbnRbMF0pOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKE9wZW5Jbk5ld0VkaXRvci5JRCk7Ci0gICAgbGlzdC5hZGQoRGVsZXRlQWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICAKLSAgICByZXR1cm4gKFN0cmluZyBbXSlsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIFhTRFNjaGVtYURpcmVjdGl2ZSBvYmplY3QgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKSB0YXJnZXQ7Ci0gICAgcmV0dXJuIG5ldyBEZWxldGVDb21tYW5kKG9iamVjdCk7Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIFhTRFNjaGVtYSBvYmplY3QgPSAoKFhTRFNjaGVtYURpcmVjdGl2ZSkgdGFyZ2V0KS5nZXRTY2hlbWEoKTsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KG9iamVjdCk7Ci0gICAgcmV0dXJuIChJTW9kZWwpYWRhcHRlcjsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldFRvcENvbnRhaW5lcigpCi0gIHsKLSAgICAvLyBUaGVyZSBpcyBjdXJyZW50bHkgbm8gZHJpbGwtZG93biBkZXRhaWxzIHZpZXcgb2YgZGlyZWN0aXZlcwotICAgIC8vIFRoZSB0b3AgbGV2ZWwgY29udGFpbmVyIGlzIHRoZSBzY2hlbWEKLSAgICByZXR1cm4gZ2V0TW9kZWwoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTaW1wbGVDb250ZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEU2ltcGxlQ29udGVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2ZjZhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTaW1wbGVDb250ZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RTaW1wbGVDb250ZW50QWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgSUFjdGlvblByb3ZpZGVyLCBJR3JhcGhFbGVtZW50Ci17Ci0KLSAgcHVibGljIFhTRFNpbXBsZUNvbnRlbnRBZGFwdGVyKCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gZ2V0WFNEU2ltcGxlVHlwZUNvbnRlbnQoKQotICB7Ci0gICAgcmV0dXJuIChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbil0YXJnZXQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHJldHVybiAoU3RyaW5nIFtdKWxpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBEZWxldGVDb21tYW5kKGdldFhTRFNpbXBsZVR5cGVDb250ZW50KCkpOwotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTRFNpbXBsZVR5cGVDb250ZW50KCkuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiAoSU1vZGVsKWFkYXB0ZXI7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgYyA9IGdldFhTRFNpbXBsZVR5cGVDb250ZW50KCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgaWYgKGMgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgYzsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoY3QpOwotICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgICByZXR1cm4gKElBRFRPYmplY3QpYWRhcHRlcjsKLSAgICB9Ci0gCi0gICAgcmV0dXJuIG51bGw7IAotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgaWYgKGlzUmVhZE9ubHkoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTRFNpbXBsZUNvbnRlbnQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RTaW1wbGVDb250ZW50LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDVjMzYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TZXRJbnB1dFRvR3JhcGhWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0QmFzZVR5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFZhcmlldHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEVHlwZURlZmluaXRpb25BZGFwdGVyCi17Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZE9ubHk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY2hhbmdlUmVhZE9ubHlGaWVsZCA9ZmFsc2U7Ci0JcHJvdGVjdGVkIEhhc2hNYXAgZGVsZXRlZFR5cGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIGlmIChpc1JlYWRPbmx5KCkpCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9zaW1wbGV0eXBlZGlzX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L3NpbXBsZXR5cGVfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VGV4dCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChib29sZWFuIHNob3dUeXBlKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZURlZmluaXRpb24gPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHRhcmdldDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICByZXN1bHQuYXBwZW5kKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSA9PSBudWxsID8gTWVzc2FnZXMuX1VJX0xBQkVMX0xPQ0FMX1RZUEUgOiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpOwotCi0gICAgaWYgKHNob3dUeXBlKQotICAgIHsKLSAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGJhc2VUeXBlRGVmaW5pdGlvbiA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgICAgaWYgKGJhc2VUeXBlRGVmaW5pdGlvbiAhPSBudWxsICYmIFhTRFZhcmlldHkuQVRPTUlDX0xJVEVSQUwgPT0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0VmFyaWV0eSgpKQotICAgICAgewotICAgICAgICBpZiAoYmFzZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSAhPSBudWxsICYmICF4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRDb250ZW50cygpLmNvbnRhaW5zKGJhc2VUeXBlRGVmaW5pdGlvbikgJiYgIVhTRENvbnN0YW50cy5pc0FueVNpbXBsZVR5cGUoYmFzZVR5cGVEZWZpbml0aW9uKSkKLSAgICAgICAgewotICAgICAgICAJdHJ5IHsKLSAgICAgICAgCQlTdHJpbmcgcU5hbWUgPSBiYXNlVHlwZURlZmluaXRpb24uZ2V0UU5hbWUoeHNkU2ltcGxlVHlwZURlZmluaXRpb24pOwotICAgICAgICAJCXJlc3VsdC5hcHBlbmQoIiA6ICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChxTmFtZSk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAljYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIAl7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gaXRlbVR5cGVEZWZpbml0aW9uID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIGlmIChpdGVtVHlwZURlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpdGVtVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIDogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaXRlbVR5cGVEZWZpbml0aW9uLmdldFFOYW1lKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIExpc3QgbWVtYmVyVHlwZURlZmluaXRpb25zID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgICAgaWYgKCFtZW1iZXJUeXBlRGVmaW5pdGlvbnMuaXNFbXB0eSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBtZW1iZXJzID0gbWVtYmVyVHlwZURlZmluaXRpb25zLml0ZXJhdG9yKCk7IG1lbWJlcnMuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gbWVtYmVyVHlwZURlZmluaXRpb24gPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIG1lbWJlcnMubmV4dCgpOwotICAgICAgICAgICAgICBpZiAobWVtYmVyVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIDogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgfCAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKG1lbWJlclR5cGVEZWZpbml0aW9uLmdldFFOYW1lKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCgpID09IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChNZXNzYWdlcy5fVUlfTEFCRUxfQUJTRU5UKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV4VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdGFyZ2V0OwotICAgIGlmIChYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gaXNBbm9ueW1vdXMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoQWRkWFNERW51bWVyYXRpb25GYWNldEFjdGlvbi5JRCk7Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKFNldEJhc2VUeXBlQWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoRGVsZXRlQWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgT2JqZWN0IHNjaGVtYSA9IGdldEVkaXRvclNjaGVtYSgpOwotICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLSAgICBpZiAodHlwZURlZmluaXRpb24uZ2V0U2NoZW1hKCkgPT0gc2NoZW1hKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbnRhaW5lciA9IHR5cGVEZWZpbml0aW9uLmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKGNvbnRhaW5lciA9PSBzY2hlbWEgfHwgY29udGFpbmVyIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGlzdC5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICB9Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0gICAgCi0gICAgcmV0dXJuIChTdHJpbmcgW10pbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNBbm9ueW1vdXMoKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZURlZmluaXRpb24gPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHRhcmdldDsKLSAgICBFT2JqZWN0IGVDb250YWluZXIgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5lQ29udGFpbmVyKCk7Ci0gICAgcmV0dXJuICEoZUNvbnRhaW5lciBpbnN0YW5jZW9mIFhTRFNjaGVtYSB8fAotICAgICAgICAgICAgIGVDb250YWluZXIgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSk7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0WFNEVHlwZURlZmluaXRpb24oKSk7CQotICB9Ci0gIAotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZ2V0WFNEVHlwZURlZmluaXRpb24oKS5nZXRTY2hlbWEoKSk7Ci0gICAgcmV0dXJuIChJTW9kZWwpYWRhcHRlcjsKLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgTGlzdCBsaXN0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RW51bWVyYXRpb25GYWNldHMoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGxpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gKElUcmVlRWxlbWVudFtdKSBhZGFwdGVyTGlzdC50b0FycmF5KG5ldyBJVHJlZUVsZW1lbnRbMF0pOwotICB9Ci0gIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotICB7Ci0JICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdGFyZ2V0OwotCSAgaWYgKGhhc1NldFJlYWRPbmx5RmllbGQoKSkKLQkgIHsKLQkJICBkZWxldGVkVHlwZXMucHV0KHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkgIGNoYW5nZVJlYWRPbmx5RmllbGQgPSBmYWxzZTsKLQkJICByZXR1cm4gcmVhZE9ubHk7Ci0JICB9Ci0JICBlbHNlCi0JICB7Ci0JCSAgaWYgKGRlbGV0ZWRUeXBlcyE9IG51bGwgKQotCQkgIHsKLQkJCSAgQm9vbGVhbiBkZWxldGVkID0gKChCb29sZWFuKWRlbGV0ZWRUeXBlcy5nZXQoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKSk7Ci0JCQkgIGlmIChkZWxldGVkICE9IG51bGwgJiYgZGVsZXRlZC5ib29sZWFuVmFsdWUoKSkKLQkJCQkgIHJldHVybiB0cnVlOwotCQkJICBlbHNlIHJldHVybiBzdXBlci5pc1JlYWRPbmx5KCk7Ci0JCSAgfQotCQkgIGVsc2UKLQkJCSAgcmV0dXJuIHN1cGVyLmlzUmVhZE9ubHkoKTsKLQkgIH0KLQkKLQkgIAotICB9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0JCXRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNTZXRSZWFkT25seUZpZWxkKCkgewotCQlyZXR1cm4gY2hhbmdlUmVhZE9ubHlGaWVsZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VSZWFkT25seUZpZWxkKGJvb2xlYW4gc2V0UmVhZE9ubHlGaWVsZCkgewotCQl0aGlzLmNoYW5nZVJlYWRPbmx5RmllbGQgPSBzZXRSZWFkT25seUZpZWxkOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZURlbGV0ZWRNYXAoU3RyaW5nIGFkZENvbXBvbmVudCkgewotCQlpZiAoZGVsZXRlZFR5cGVzLmdldChhZGRDb21wb25lbnQpICE9IG51bGwpCi0JCQlkZWxldGVkVHlwZXMuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWNkNTQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElUeXBlLCBJQWN0aW9uUHJvdmlkZXIsIElHcmFwaEVsZW1lbnQKLXsKLSAgcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGVEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiAoWFNEVHlwZURlZmluaXRpb24pdGFyZ2V0OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIEVPYmplY3QgZUNvbnRhaW5lciA9IGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZUNvbnRhaW5lcigpOwotICAgIGlmIChlQ29udGFpbmVyIGluc3RhbmNlb2YgWFNEU2NoZW1hIHx8IGVDb250YWluZXIgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICB7ICAKLSAgICAgIHJldHVybiBnZXRYU0RUeXBlRGVmaW5pdGlvbigpLmdldE5hbWUoKTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBpZiAoZUNvbnRhaW5lciBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgICAgICAgWFNETmFtZWRDb21wb25lbnQgZWQgPSAoWFNETmFtZWRDb21wb25lbnQpZUNvbnRhaW5lcjsKLSAgICAgICAgIHJldHVybiAiKCIgKyBlZC5nZXROYW1lKCkgKyAiVHlwZSkiOyAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcigpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNEVHlwZURlZmluaXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgfQotCi0gIHB1YmxpYyBJVHlwZSBnZXRTdXBlclR5cGUoKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSBnZXRYU0RUeXBlRGVmaW5pdGlvbigpLmdldEJhc2VUeXBlKCk7Ci0gICAgcmV0dXJuIHRkICE9IG51bGwgPyAoSVR5cGUpWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh0ZCkgOiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTmFtZUNvbW1hbmQoU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXhUeXBlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyYjVjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5vdGF0aW9uRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RWaXNpdG9yCi17Ci0gIHB1YmxpYyBYU0RWaXNpdG9yKCkKLSAgewotICAgIGNpcmN1bGFyRGVmaW5pdGlvbkZvdW5kID0gZmFsc2U7Ci0gICAgdmlzaXRlZEdyb3VwcyA9IG5ldyBTdGFjaygpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBjaXJjdWxhckRlZmluaXRpb25Gb3VuZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLSAgcHJvdGVjdGVkIFN0YWNrIHZpc2l0ZWRHcm91cHMgPSBuZXcgU3RhY2soKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZGVudGl0eUNvbnN0cmFpbnQgPSAoWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKGlkZW50aXR5Q29uc3RyYWludCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0TW9kZWxHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKG1vZGVsR3JvdXApOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJpYnV0ZUdyb3VwKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXROb3RhdGlvbkRlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNETm90YXRpb25EZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTRE5vdGF0aW9uRGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0Tm90YXRpb25EZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cikKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVEZWZpbml0aW9uKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKXR5cGUpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pdHlwZSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRUeXBlRGVmaW5pdGlvbihlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRlbnRpdHlDb25zdHJhaW50KQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZikKLSAgewotICAgIGlmICghbW9kZWxHcm91cERlZi5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgaWYgKG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICgodmlzaXRlZEdyb3Vwcy5jb250YWlucyhtb2RlbEdyb3VwRGVmLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRNb2RlbEdyb3VwKCkpKSkKLSAgICAgICAgewotICAgICAgICAgIGNpcmN1bGFyRGVmaW5pdGlvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdmlzaXRlZEdyb3Vwcy5wdXNoKG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpKTsKLSAgICAgICAgdmlzaXRNb2RlbEdyb3VwKG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpKTsKLSAgICAgICAgdmlzaXRlZEdyb3Vwcy5wb3AoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHJlc29sdmVkR3JvdXBEZWYgPSBtb2RlbEdyb3VwRGVmLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IHJlc29sdmVkR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpOwotCi0gICAgICBpZiAoKHZpc2l0ZWRHcm91cHMuY29udGFpbnMobW9kZWxHcm91cCkpKQotICAgICAgewotICAgICAgICBjaXJjdWxhckRlZmluaXRpb25Gb3VuZCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgdmlzaXRlZEdyb3Vwcy5wdXNoKG1vZGVsR3JvdXApOwotICAgICAgaWYgKG1vZGVsR3JvdXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRNb2RlbEdyb3VwKG1vZGVsR3JvdXApOwotICAgICAgfQotICAgICAgdmlzaXRlZEdyb3Vwcy5wb3AoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXApCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpbzsKLSAgICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyVXNlLmdldENvbnRlbnQoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilvOwotICAgICAgICB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyR3JvdXAuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFJlZGVmaW5lKFhTRFJlZGVmaW5lIHJlZGVmaW5lKQotICB7Ci0JICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXROb3RhdGlvbkRlY2xhcmF0aW9uKFhTRE5vdGF0aW9uRGVjbGFyYXRpb24gbm90YXRpb24pCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q29tcGxleFR5cGVDb250ZW50KFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGNvbnRlbnQpCi0gIHsKLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZS5nZXRDb250ZW50KCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29tcGxleENvbnRlbnQgPSB0eXBlLmdldENvbnRlbnQoKTsKLSAgICAgIGlmIChjb21wbGV4Q29udGVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICB2aXNpdENvbXBsZXhUeXBlQ29udGVudCgoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pY29tcGxleENvbnRlbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcGxleENvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRQYXJ0aWNsZSgoWFNEUGFydGljbGUpIGNvbXBsZXhDb250ZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGUoWFNEUGFydGljbGUgcGFydGljbGUpCi0gIHsKLSAgICB2aXNpdFBhcnRpY2xlQ29udGVudChwYXJ0aWNsZS5nZXRDb250ZW50KCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFBhcnRpY2xlQ29udGVudChYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50KQotICB7Ci0gICAgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIHZpc2l0TW9kZWxHcm91cCgoWFNETW9kZWxHcm91cClwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICB7Ci0gICAgICB2aXNpdFdpbGRjYXJkKChYU0RXaWxkY2FyZClwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgewotICAgIGlmIChtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIHZpc2l0UGFydGljbGUocGFydGljbGUpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRXaWxkY2FyZChYU0RXaWxkY2FyZCB3aWxkY2FyZCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RWaXNpdG9yRm9yRmllbGRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RWaXNpdG9yRm9yRmllbGRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YTBmMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEVmlzaXRvckZvckZpZWxkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIFhTRFZpc2l0b3JGb3JGaWVsZHMgZXh0ZW5kcyBYU0RWaXNpdG9yCi17Ci0gIHB1YmxpYyBYU0RWaXNpdG9yRm9yRmllbGRzKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBjb25jcmV0ZUNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHB1YmxpYyBMaXN0IHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KWl0ZXIubmV4dCgpOwotICAgICAgICBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlID0gKFhTREF0dHJpYnV0ZVVzZSlhdHRyR3JvdXBDb250ZW50OwotICAgICAgICAgIAotICAgICAgICAgIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0clVzZS5nZXRDb250ZW50KCkpOwotCi0vLyAgICAgICAgICBpZiAoYXR0clVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpICE9IGF0dHJVc2UuZ2V0Q29udGVudCgpKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHJVc2UuZ2V0Q29udGVudCgpKTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoYXR0clVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLS8vICAgICAgICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChhdHRyVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotLy8gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilhdHRyR3JvdXBDb250ZW50OwotICAgICAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGF0dHJHcm91cCk7Ci0gICAgICAgICAgaWYgKGF0dHJHcm91cC5pc0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJHcm91cCA9IGF0dHJHcm91cC5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oYXR0ckdyb3VwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHR5cGUuZ2V0QXR0cmlidXRlV2lsZGNhcmQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKHR5cGUuZ2V0QXR0cmlidXRlV2lsZGNhcmQoKSk7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKHR5cGUuZ2V0QXR0cmlidXRlV2lsZGNhcmQoKSk7Ci0gICAgfQotICAgIHN1cGVyLnZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKHR5cGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlQ29udGVudChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBjb250ZW50KQotICB7Ci0gICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoY29udGVudCk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRDb21wbGV4VHlwZUNvbnRlbnQoY29udGVudCk7ICAgCi0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICB7Ci0gICAgLy8gbGlzdGVuIHRvIGRlZmluaXRpb24gaW4gY2FzZSBpdCBjaGFuZ2VzCi0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gcmVzb2x2ZWRNb2RlbEdyb3VwRGVmID0gbW9kZWxHcm91cERlZi5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgaWYgKHZpc2l0ZWRHcm91cHMuY29udGFpbnMocmVzb2x2ZWRNb2RlbEdyb3VwRGVmLmdldE1vZGVsR3JvdXAoKSkpIHJldHVybjsKLSAgIAotICAgIGlmIChtb2RlbEdyb3VwRGVmLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICAvLyBpZiBpdCdzIGEgcmVmZXJlbmNlIHdlIG5lZWQgdG8gbGlzdGVuIHRvIHRoZSByZWZlcmVuY2UgaW5jYXNlIGl0IGNoYW5nZXMKLSAgICAgIGlmICghdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5jb250YWlucyhtb2RlbEdyb3VwRGVmKSkKLSAgICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQobW9kZWxHcm91cERlZik7ICAgICAgCi0gICAgfQotICAgIHN1cGVyLnZpc2l0TW9kZWxHcm91cERlZmluaXRpb24obW9kZWxHcm91cERlZik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXApCi0gIHsKLSAgICBzdXBlci52aXNpdE1vZGVsR3JvdXAobW9kZWxHcm91cCk7Ci0gICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQobW9kZWxHcm91cCk7IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXApCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0cmlidXRlVXNlID0gKFhTREF0dHJpYnV0ZVVzZSlvOwotICAgICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoYXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJHcm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pbzsKLSAgICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoYXR0ckdyb3VwKTsKLSAgICAgICAgaWYgKGF0dHJHcm91cC5pc0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgYXR0ckdyb3VwID0gYXR0ckdyb3VwLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oYXR0ckdyb3VwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBYU0RXaWxkY2FyZCBhbnlBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVHcm91cC5nZXRBdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQoKTsKLSAgICBpZiAoYW55QXR0cmlidXRlICE9IG51bGwpCi0gICAgewotICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChhbnlBdHRyaWJ1dGUpOwotICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoYW55QXR0cmlidXRlKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGUoWFNEUGFydGljbGUgcGFydGljbGUpCi0gIHsKLSAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChwYXJ0aWNsZSk7Ci0gICAgc3VwZXIudmlzaXRQYXJ0aWNsZShwYXJ0aWNsZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0V2lsZGNhcmQoWFNEV2lsZGNhcmQgd2lsZGNhcmQpCi0gIHsKLSAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKHdpbGRjYXJkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChlbGVtZW50KTsKLSAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgICAvLyBub3csIGFkZCB0aGUgcmVmZXJlbmNlIGFzIGEgZmllbGQKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQoZWxlbWVudCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgICAvLyBub3RlLi4uIHdlIGludGVudGlvbmFsbHkgb21taXQgdGhlIGNhbGwgdG8gc3VwZXIudmlzaXRFbGVtZW50RGVjbGFyYXRpb24oKQotICAgICAgLy8gc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBkZWx2ZSBkb3duIGRlZXBlciB0aGFuIHRoZSBlbGVtZW50ICAgICAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIpCi0gIHsKLSAgICBpZiAoYXR0ci5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoYXR0cik7Ci0gICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGF0dHIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChhdHRyLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEV2lsZGNhcmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RXaWxkY2FyZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ5YzE0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RXaWxkY2FyZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RXaWxkY2FyZEFkYXB0ZXIgZXh0ZW5kcyBYU0RQYXJ0aWNsZUFkYXB0ZXIgaW1wbGVtZW50cyBJRmllbGQsIElBY3Rpb25Qcm92aWRlciwgSUdyYXBoRWxlbWVudAotewotLy8gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQU5ZRUxFTUVOVF9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREFueS5naWYiKTsgLy8kTk9OLU5MUy0xJAotLy8gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQU5ZRUxFTUVOVF9ESVNBQkxFRF9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREFueS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIFhTRFdpbGRjYXJkQWRhcHRlcigpCi0gIHsKLQotICB9Ci0gIAotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgWFNEV2lsZGNhcmQgeHNkV2lsZGNhcmQgPSAoWFNEV2lsZGNhcmQpIHRhcmdldDsKLSAgICAKLSAgICBpZiAoeHNkV2lsZGNhcmQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgewotICAgICAgaWYgKGlzUmVhZE9ubHkoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RBbnlkaXMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREFueS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGlzUmVhZE9ubHkoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RBbnlBdHRyaWJ1dGVkaXMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREFueUF0dHJpYnV0ZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICBYU0RXaWxkY2FyZCB4c2RXaWxkY2FyZCA9IChYU0RXaWxkY2FyZCkgdGFyZ2V0OwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RXaWxkY2FyZC5nZXRFbGVtZW50KCk7Ci0KLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoZWxlbWVudC5nZXROb2RlTmFtZSgpKTsKLSAgICAgIGJvb2xlYW4gaGFzTWluT2NjdXJzID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpOwotICAgICAgYm9vbGVhbiBoYXNNYXhPY2N1cnMgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSk7Ci0KLSAgICAgIGlmIChoYXNNaW5PY2N1cnMgfHwgaGFzTWF4T2NjdXJzKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIgWyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChoYXNNaW5PY2N1cnMpCi0gICAgICAgIHsKLQotICAgICAgICAgIGludCBtaW4gPSAoKFhTRFBhcnRpY2xlKSB4c2RXaWxkY2FyZC5nZXRDb250YWluZXIoKSkuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgaWYgKG1pbiA9PSBYU0RQYXJ0aWNsZS5VTkJPVU5ERUQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1pbikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIC8vIHByaW50IGRlZmF1bHQKLSAgICAgICAgewotICAgICAgICAgIGludCBtaW4gPSAoKFhTRFBhcnRpY2xlKSB4c2RXaWxkY2FyZC5nZXRDb250YWluZXIoKSkuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtaW4pKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGFzTWF4T2NjdXJzKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IG1heCA9ICgoWFNEUGFydGljbGUpIHhzZFdpbGRjYXJkLmdldENvbnRhaW5lcigpKS5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKCIuLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKG1heCA9PSBYU0RQYXJ0aWNsZS5VTkJPVU5ERUQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1heCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIC8vIHByaW50IGRlZmF1bHQKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi4uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpbnQgbWF4ID0gKChYU0RQYXJ0aWNsZSkgeHNkV2lsZGNhcmQuZ2V0Q29udGFpbmVyKCkpLmdldE1heE9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWF4KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIFhTRFdpbGRjYXJkIHhzZFdpbGRjYXJkID0gKFhTRFdpbGRjYXJkKSB0YXJnZXQ7Ci0gICAgcmV0dXJuIHhzZFdpbGRjYXJkLmdldENvbnRhaW5lcigpOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpCi0gIHsKLQkgIHJldHVybiBuZXcgRGVsZXRlQ29tbWFuZCgoWFNEV2lsZGNhcmQpIHRhcmdldCk7CQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRLaW5kKCkKLSAgewotICAgIFhTRFdpbGRjYXJkIHhzZFdpbGRjYXJkID0gKFhTRFdpbGRjYXJkKSB0YXJnZXQ7Ci0gICAgaWYgKHhzZFdpbGRjYXJkLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgIHsKLSAgICAgIHJldHVybiAiZWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgcmV0dXJuICJhdHRyaWJ1dGUiOwotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICBYU0RXaWxkY2FyZCB4c2RXaWxkY2FyZCA9IChYU0RXaWxkY2FyZCkgdGFyZ2V0OwotICAgIGlmICh4c2RXaWxkY2FyZC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICB7Ci0gICAgICByZXR1cm4gImFueSI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgcmV0dXJuICJhbnlBdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIHB1YmxpYyBJVHlwZSBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWVRdWFsaWZpZXIoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTWF4T2NjdXJzQ29tbWFuZChpbnQgbWF4T2NjdXJzKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTWluT2NjdXJzQ29tbWFuZChpbnQgbWluT2NjdXJzKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTmFtZUNvbW1hbmQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVUeXBlTmFtZUNvbW1hbmQoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgcXVhaWxpZmllcikKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBDb2xsZWN0aW9uIGFjdGlvbklEcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBhY3Rpb25JRHMuYWRkKERlbGV0ZUFjdGlvbi5JRCk7Ci0gICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgYWN0aW9uSURzLmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotICAgIHJldHVybiAoU3RyaW5nIFtdKWFjdGlvbklEcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIHJldHVybiBnZXRHbG9iYWxYU0RDb250YWluZXIoKFhTRFdpbGRjYXJkKSB0YXJnZXQpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9CYXNlRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9CYXNlRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZGY0NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvQmFzZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLk1vdmVYU0RCYXNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5CYXNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuQ29ubmVjdGFibGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNEQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5HZW5lcmljR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgQUJPVkVfSVNfQ0xPU0VSID0gMDsKLSAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgQkVMT1dfSVNfQ0xPU0VSID0gMTsKLSAgCi0gIHByb3RlY3RlZCBFZGl0UGFydFZpZXdlciB2aWV3ZXI7ICAgIAotICBwcm90ZWN0ZWQgQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0OwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FeGVjdXRlOwotICBwcm90ZWN0ZWQgR3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0OwotICAKLSAgcHJvdGVjdGVkIEdyYXBoaWNhbEVkaXRQYXJ0IGxlZnRTaWJsaW5nRWRpdFBhcnQ7Ci0gIHByb3RlY3RlZCBHcmFwaGljYWxFZGl0UGFydCByaWdodFNpYmxpbmdFZGl0UGFydDsKLSAgcHJvdGVjdGVkIFBvaW50IGxvY2F0aW9uOwotCi0gIHByb3RlY3RlZCBDb25uZWN0YWJsZUVkaXRQYXJ0IHBhcmVudEVkaXRQYXJ0OwotICBwcm90ZWN0ZWQgWFNEQ29uY3JldGVDb21wb25lbnQgcHJldmlvdXNSZWZDb21wb25lbnQgPSBudWxsLCBuZXh0UmVmQ29tcG9uZW50ID0gbnVsbCwgeHNkQ29tcG9uZW50VG9EcmFnOwotICBwcm90ZWN0ZWQgWFNEQmFzZUZpZWxkRWRpdFBhcnQgaXRlbVRvRHJhZzsKLSAgcHJvdGVjdGVkIFJlY3RhbmdsZSBvcmlnaW5hbExvY2F0aW9uOwotICBwcm90ZWN0ZWQgUG9seWxpbmUgcG9seUxpbmU7Ci0gIAotICBwcm90ZWN0ZWQgTW92ZVhTREJhc2VBY3Rpb24gYWN0aW9uOwotICBwcm90ZWN0ZWQgTGlzdCB0YXJnZXRTcGFjZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICBwcm90ZWN0ZWQgaW50IGNsb3NlclNpYmxpbmc7Ci0gIAotICBwdWJsaWMgQmFzZURyYWdBbmREcm9wQ29tbWFuZChFZGl0UGFydFZpZXdlciB2aWV3ZXIsIENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHRoaXMudmlld2VyID0gdmlld2VyOyAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0dXAoKTsKLSAKLSAgLyoqCi0gICAqIFByb3ZpZGVzIHRoZSBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmVudCBYU0QgY29tcG9uZW50LiAKLSAgICogVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHRoZSB1bmRvL3JlZG8gbWVjaGFuaXNtLiAgIAotICAgKiBAcmV0dXJuIHRoZSBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmVudCBYU0QgY29tcG9uZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IEVsZW1lbnQgZ2V0RWxlbWVudCgpOwotICAKLSAgcHVibGljIFBvaW50TGlzdCBnZXRDb25uZWN0aW9uUG9pbnRzKFJlY3RhbmdsZSBkcmFnZ2VkRmlndXJlQm91bmRzKQotICB7Ci0gICAgUG9pbnRMaXN0IHBvaW50TGlzdCA9IG51bGw7Ci0gICAgaWYgKHRhcmdldCAhPSBudWxsICYmIGl0ZW1Ub0RyYWcgIT0gbnVsbCAmJiBwYXJlbnRFZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIHBvaW50TGlzdCA9IGdldENvbm5lY3Rpb25Qb2ludHMocGFyZW50RWRpdFBhcnQsIGl0ZW1Ub0RyYWcsIGRyYWdnZWRGaWd1cmVCb3VuZHMpOwotICAgIH0KLSAgICByZXR1cm4gcG9pbnRMaXN0ICE9IG51bGwgPyBwb2ludExpc3QgOiBuZXcgUG9pbnRMaXN0KCk7Ci0gIH0KLSAgCi0gIC8vIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHRoZSBwcmV2aWV3IGNvbm5lY3Rpb24gbGluZSBmdW5jdGlvbiByZWxhdGVkIHRvIGRyYWcgYW5kIGRyb3AKLSAgLy8gICAgIAotICBwdWJsaWMgUG9pbnRMaXN0IGdldENvbm5lY3Rpb25Qb2ludHMoQ29ubmVjdGFibGVFZGl0UGFydCBwYXJlbnRFZGl0UGFydCwgQmFzZUZpZWxkRWRpdFBhcnQgY2hpbGRSZWZFZGl0UGFydCwgUmVjdGFuZ2xlIGRyYWdnZWRGaWd1cmVCb3VuZHMpCi0gIHsgICAgICAgICAgIAotICAgIFBvaW50TGlzdCBwb2ludExpc3QgPSBuZXcgUG9pbnRMaXN0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGludFtdIGRhdGEgPSBuZXcgaW50WzFdOwotICAgIFBvaW50IGEgPSBnZXRDb25uZWN0aW9uUG9pbnQocGFyZW50RWRpdFBhcnQsIGNoaWxkUmVmRWRpdFBhcnQsIGRhdGEpOwotICAgIGlmIChhICE9IG51bGwpCi0gICAgeyAgIAotICAgICAgaW50IGRyYWdnZWRGaWd1cmVCb3VuZHNZID0gZHJhZ2dlZEZpZ3VyZUJvdW5kcy55ICsgZHJhZ2dlZEZpZ3VyZUJvdW5kcy5oZWlnaHQvMjsKLQotICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KGEpOyAKLSAgICAgIAotICAgICAgaWYgKGRhdGFbMF0gPT0gMCkgLy8gaW5zZXJ0IGJldHdlZW4gMiBpdGVtcwotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGludCB4ID0gYS54ICsgNTsKLSAgICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KG5ldyBQb2ludCh4LCBhLnkpKTsKLSAgICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KG5ldyBQb2ludCh4LCBkcmFnZ2VkRmlndXJlQm91bmRzWSkpOyAgICAgICAgCi0gICAgICAgIHBvaW50TGlzdC5hZGRQb2ludChuZXcgUG9pbnQoZHJhZ2dlZEZpZ3VyZUJvdW5kcy54LCBkcmFnZ2VkRmlndXJlQm91bmRzWSkpOwotICAgICAgfQotICAgICAgZWxzZSAvLyBpbnNlcnQgYXQgZmlyc3Qgb3IgbGFzdCBwb3NpdGlvbgotICAgICAgewotICAgICAgICBwb2ludExpc3QuYWRkUG9pbnQobmV3IFBvaW50KGEueCwgZHJhZ2dlZEZpZ3VyZUJvdW5kc1kpKTsgICAKLSAgICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KG5ldyBQb2ludChkcmFnZ2VkRmlndXJlQm91bmRzLngsIGRyYWdnZWRGaWd1cmVCb3VuZHNZKSk7Ci0gICAgICB9Ci0gICAgfSAgICAgICAKLSAgICByZXR1cm4gcG9pbnRMaXN0OwotICB9Ci0KLSAgLy8gVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIHByZXZpZXcgY29ubmVjdGlvbiBsaW5lIGZ1bmN0aW9uIHJlbGF0ZWQgdG8gZHJhZyBhbmQgZHJvcAotICAvLyAgICAgCi0gIHByb3RlY3RlZCBQb2ludCBnZXRDb25uZWN0aW9uUG9pbnQoQ29ubmVjdGFibGVFZGl0UGFydCBwYXJlbnRFZGl0UGFydCwgQmFzZUZpZWxkRWRpdFBhcnQgY2hpbGRSZWZFZGl0UGFydCwgaW50W10gZGF0YSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICBQb2ludCBwb2ludCA9IG51bGw7ICAgICAKLSAgICBMaXN0IGNoaWxkTGlzdCA9IHBhcmVudEVkaXRQYXJ0LmdldENoaWxkcmVuKCk7ICAgICAgICAgCi0gICAgaWYgKHBhcmVudEVkaXRQYXJ0LmdldEZpZ3VyZSgpIGluc3RhbmNlb2YgR2VuZXJpY0dyb3VwRmlndXJlICYmIGNoaWxkTGlzdC5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIHBvaW50ID0gbmV3IFBvaW50KCk7Ci0KLSAgICAgIFJlY3RhbmdsZSByID0gZ2V0Q29ubmVjdGVkRWRpdFBhcnRDb25uZWN0aW9uQm91bmRzKHBhcmVudEVkaXRQYXJ0KTsgIAotICAgICAgcG9pbnQueCA9IHIueCArIHIud2lkdGg7Ci0gICAgICBwb2ludC55ID0gci55ICsgci5oZWlnaHQvMjsKLSAgICB9ICAgIAotICAgIHJldHVybiBwb2ludDsKLSAgfQotCi0gIHByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0Q29ubmVjdGVkRWRpdFBhcnRDb25uZWN0aW9uQm91bmRzKENvbm5lY3RhYmxlRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsKLSAgICByZXR1cm4gZ2V0Wm9vbWVkQm91bmRzKCgoR2VuZXJpY0dyb3VwRmlndXJlKWVkaXRQYXJ0LmdldEZpZ3VyZSgpKS5nZXRJY29uRmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHJlZG8oKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBpZiAoY2FuRXhlY3V0ZSkKLSAgICB7Ci0gICAgCS8vIFdyYXAgdGhlIGRyYWcgYW5kIGRyb3Agb3BlcmF0aW9uIGZvciBlYXN5IHVuZG8gYW5kIHJlZG8uCi0gICAgCWJlZ2luUmVjb3JkaW5nKHRoaXMuZ2V0RWxlbWVudCgpKTsKLQkJYWN0aW9uLnJ1bigpOwotCQllbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKQotICB7Ci0gICAgcmV0dXJuIGNhbkV4ZWN1dGU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNvbW1vblNldHVwKExpc3Qgc2libGluZ3MsIEdyYXBoaWNhbEVkaXRQYXJ0IG1vdmluZ0VkaXRQYXJ0KQotICB7Ci0gICAgY2xvc2VyU2libGluZyA9IEFCT1ZFX0lTX0NMT1NFUjsKLSAgICBpbnQgcG9pbnRlcllMb2NhdGlvbiA9IGxvY2F0aW9uLnk7Ci0gICAgaW50IGluZGV4OwotICAgIAotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHNpYmxpbmdzLnNpemUoKTsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBHcmFwaGljYWxFZGl0UGFydCBzaWJsaW5nID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoaW5kZXgpOwotICAgICAgaWYgKHNpYmxpbmcgaW5zdGFuY2VvZiBCYXNlRmllbGRFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgaW50IHNpYmxpbmdZTG9jYXRpb24gPSBnZXRab29tZWRCb3VuZHMoc2libGluZy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKSkuZ2V0Q2VudGVyKCkueTsKLQotICAgICAgICBpZiAoc2libGluZ1lMb2NhdGlvbiA+IHBvaW50ZXJZTG9jYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICByaWdodFNpYmxpbmdFZGl0UGFydCA9IHNpYmxpbmc7Ci0gICAgICAgICAgaWYgKGluZGV4ID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsZWZ0U2libGluZ0VkaXRQYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoaW5kZXggLSAxKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAobGVmdFNpYmxpbmdFZGl0UGFydCAhPSBudWxsICYmIE1hdGguYWJzKGdldFpvb21lZEJvdW5kcyhsZWZ0U2libGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpKS5nZXRDZW50ZXIoKS55IC0gcG9pbnRlcllMb2NhdGlvbikgPiBNYXRoLmFicyhzaWJsaW5nWUxvY2F0aW9uIC0gcG9pbnRlcllMb2NhdGlvbikpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2xvc2VyU2libGluZyA9IEJFTE9XX0lTX0NMT1NFUjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIGlzSGFuZGxlZCA9IGhhbmRsZUZpcnN0QW5kTGFzdERyb3BUYXJnZXRzKGluZGV4LCBzaWJsaW5ncyk7Ci0gICAgaWYgKCFpc0hhbmRsZWQpCi0gICAgICBoYW5kbGVPdGhlclRhcmdldHMoaW5kZXgpOwotCi0gICAgY2FsY3VsYXRlTGVmdEFuZFJpZ2h0WFNEQ29tcG9uZW50cygpOwotICAgIAotICAgIHhzZENvbXBvbmVudFRvRHJhZyA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgKChYU0RCYXNlQWRhcHRlcikgaXRlbVRvRHJhZy5nZXRNb2RlbCgpKS5nZXRUYXJnZXQoKTsgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNhbGN1bGF0ZUxlZnRBbmRSaWdodFhTRENvbXBvbmVudHMoKQotICB7Ci0gICAgaWYgKGxlZnRTaWJsaW5nRWRpdFBhcnQgaW5zdGFuY2VvZiBYU0RCYXNlRmllbGRFZGl0UGFydCkKLSAgICB7Ci0gICAgICBPYmplY3QgbGVmdE1vZGVsID0gKChYU0RCYXNlRmllbGRFZGl0UGFydCkgbGVmdFNpYmxpbmdFZGl0UGFydCkuZ2V0TW9kZWwoKTsKLSAgICAgIHByZXZpb3VzUmVmQ29tcG9uZW50ID0gbnVsbDsKLSAgICAgIGlmIChsZWZ0TW9kZWwgaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgWFNEQmFzZUFkYXB0ZXIgbGVmdEFkYXB0ZXIgPSAoWFNEQmFzZUFkYXB0ZXIpIGxlZnRNb2RlbDsKLSAgICAgICAgcHJldmlvdXNSZWZDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpIGxlZnRBZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChyaWdodFNpYmxpbmdFZGl0UGFydCBpbnN0YW5jZW9mIFhTREJhc2VGaWVsZEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIE9iamVjdCByaWdodE1vZGVsID0gKChYU0RCYXNlRmllbGRFZGl0UGFydCkgcmlnaHRTaWJsaW5nRWRpdFBhcnQpLmdldE1vZGVsKCk7Ci0gICAgICBuZXh0UmVmQ29tcG9uZW50ID0gbnVsbDsKLSAgICAgIGlmIChyaWdodE1vZGVsIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIFhTREJhc2VBZGFwdGVyIHJpZ2h0QWRhcHRlciA9IChYU0RCYXNlQWRhcHRlcikgcmlnaHRNb2RlbDsKLSAgICAgICAgbmV4dFJlZkNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgcmlnaHRBZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRmlyc3RBbmRMYXN0RHJvcFRhcmdldHMoaW50IGluZGV4LCBMaXN0IHNpYmxpbmdzKQotICB7Ci0gICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgeW91IGRyb3AgdG8gZmlyc3QgcG9zaXRpb24KLSAgICBpZiAoaW5kZXggPT0gMCAmJiBzaWJsaW5ncy5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIGxlZnRTaWJsaW5nRWRpdFBhcnQgPSBudWxsOwotICAgICAgcmlnaHRTaWJsaW5nRWRpdFBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHNpYmxpbmdzLmdldCgwKTsKLSAgICAgIGNsb3NlclNpYmxpbmcgPSBCRUxPV19JU19DTE9TRVI7Ci0gICAgfQotICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIHlvdSBkcm9wIHRvIGxhc3QgcG9zaXRpb24KLSAgICBlbHNlIGlmIChpbmRleCA+IDAgJiYgaW5kZXggPT0gc2libGluZ3Muc2l6ZSgpKQotICAgIHsKLSAgICAgIGxlZnRTaWJsaW5nRWRpdFBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHNpYmxpbmdzLmdldChpbmRleCAtIDEpOwotICAgICAgcmlnaHRTaWJsaW5nRWRpdFBhcnQgPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVPdGhlclRhcmdldHMoaW50IGluZGV4KQotICB7Ci0gICAgaW50IGluID0gMDsKLSAgICBDb25uZWN0YWJsZUVkaXRQYXJ0IHByZXZpb3VzTW9kZWxFZGl0UGFydCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gdGFyZ2V0U3BhY2VzTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIHByZXZpb3VzTW9kZWxFZGl0UGFydCA9IHBhcmVudEVkaXRQYXJ0OwotICAgICAgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCBzcCA9IChUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KSBvOwotICAgICAgaWYgKHNwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQ29ubmVjdGFibGVFZGl0UGFydCkKLSAgICAgICAgcGFyZW50RWRpdFBhcnQgPSAoQ29ubmVjdGFibGVFZGl0UGFydClzcC5nZXRQYXJlbnQoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcGFyZW50RWRpdFBhcnQgPSBudWxsOwotICAgICAgaW4rKzsKLSAgICAgIGlmIChpbiA+IGluZGV4KQotICAgICAgewotICAgICAgICBpZiAoY2xvc2VyU2libGluZyA9PSBBQk9WRV9JU19DTE9TRVIpCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJlbnRFZGl0UGFydCA9IHByZXZpb3VzTW9kZWxFZGl0UGFydDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9ICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgTGlzdCBjYWxjdWxhdGVGaWVsZEVkaXRQYXJ0cygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSB0YXJnZXQuZ2V0UGFyZW50KCkuZ2V0Q2hpbGRyZW4oKTsKLSAgICBMaXN0IGxpc3RPZkZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBCYXNlRmllbGRFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgbGlzdE9mRmllbGRzLmFkZChvKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3RPZkZpZWxkczsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFBvaW50TGlzdCBkcmF3TGluZXMoUG9seWxpbmUgcG9seUxpbmUpCi0gIHsKLSAgICBQb2ludExpc3QgcG9pbnRMaXN0ID0gbmV3IFBvaW50TGlzdCgpOwotCi0gICAgaWYgKGxlZnRTaWJsaW5nRWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBSZWN0YW5nbGUgbGVmdFJlY3RhbmdsZSA9IGdldFpvb21lZEJvdW5kcyhsZWZ0U2libGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLSAgICAgIGludCB4Q29vcmQgPSBsZWZ0UmVjdGFuZ2xlLng7Ci0gICAgICBpbnQgeUNvb3JkID0gbGVmdFJlY3RhbmdsZS55OwotICAgICAgaW50IGhlaWdodCA9IGxlZnRSZWN0YW5nbGUuaGVpZ2h0OwotICAgICAgaW50IHdpZHRoID0gbGVmdFJlY3RhbmdsZS53aWR0aDsKLQotICAgICAgLy8gRHJhdyBsZWZ0IGVuZCBsaW5lCi0gICAgICBhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkLCB5Q29vcmQgKyBoZWlnaHQgKyAzLCB4Q29vcmQsIHlDb29yZCArIGhlaWdodCAtIDMpOwotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0IC0gMywgeENvb3JkLCB5Q29vcmQgKyBoZWlnaHQpOwotCi0gICAgICAvLyBEcmF3IGhvcml6b250YWwgbGluZQotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0LCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgaGVpZ2h0KTsKLQotICAgICAgLy8gRHJhdyByaWdodCBlbmQgbGluZQotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQgLSAzKTsKLSAgICAgIGFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgaGVpZ2h0LCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgaGVpZ2h0ICsgMyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHJpZ2h0U2libGluZ0VkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgUmVjdGFuZ2xlIHJpZ2h0UmVjdGFuZ2xlID0gZ2V0Wm9vbWVkQm91bmRzKHJpZ2h0U2libGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLSAgICAgIGludCB4Q29vcmQgPSByaWdodFJlY3RhbmdsZS54OwotICAgICAgaW50IHlDb29yZCA9IHJpZ2h0UmVjdGFuZ2xlLnk7Ci0gICAgICBpbnQgd2lkdGggPSByaWdodFJlY3RhbmdsZS53aWR0aDsKLQotICAgICAgLy8gRHJhdyBsZWZ0IGVuZCBsaW5lCi0gICAgICBhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkLCB5Q29vcmQgKyAzLCB4Q29vcmQsIHlDb29yZCAtIDMpOwotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkIC0gMywgeENvb3JkLCB5Q29vcmQpOwotCi0gICAgICAvLyBEcmF3IGhvcml6b250YWwgbGluZQotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkKTsKLQotICAgICAgLy8gRHJhdyByaWdodCBlbmQgbGluZQotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgLSAzKTsKLSAgICAgIGFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgMyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBvaW50TGlzdDsKLSAgfQotCi0gIHByb3RlY3RlZCBQb2x5bGluZSBhZGRMaW5lVG9Qb2x5bGluZShQb2x5bGluZSBwb2x5bGluZSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKQotICB7Ci0gICAgcG9seWxpbmUuYWRkUG9pbnQobmV3IFBvaW50KHgxLCB5MSkpOwotICAgIHBvbHlsaW5lLmFkZFBvaW50KG5ldyBQb2ludCh4MiwgeTIpKTsKLQotICAgIHJldHVybiBwb2x5bGluZTsKLSAgfQotICAKLSAgcHVibGljIElGaWd1cmUgZ2V0RmVlZGJhY2tGaWd1cmUoKQotICB7Ci0gICAgRmlndXJlIHBhbmVsID0gbmV3IEZpZ3VyZSgpOwotICAgIHBhbmVsLnNldExheW91dE1hbmFnZXIobmV3IEZyZWVmb3JtTGF5b3V0KCkpOwotICAgIHBhbmVsLnNldE9wYXF1ZShmYWxzZSk7Ci0KLSAgICBQb2x5bGluZSBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBQb2x5bGluZSgpOwotICAgIGZlZWRiYWNrRmlndXJlLnNldExpbmVXaWR0aCgyKTsKLSAgICBkcmF3TGluZXMoZmVlZGJhY2tGaWd1cmUpOwotICAgIG9yaWdpbmFsTG9jYXRpb24gPSBuZXcgUmVjdGFuZ2xlKGZlZWRiYWNrRmlndXJlLmdldEJvdW5kcygpKTsKLSAgICBwYW5lbC5hZGQoZmVlZGJhY2tGaWd1cmUpOwotCi0gICAgcG9seUxpbmUgPSBuZXcgUG9seWxpbmUoKTsKLSAgICBwb2x5TGluZS5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9EQVNIRE9UKTsKLSAgICBwb2x5TGluZS5zZXRMaW5lV2lkdGgoMSk7Ci0gICAgcGFuZWwuYWRkKHBvbHlMaW5lKTsKLSAgICAKLSAgICBwYW5lbC5zZXRCb3VuZHMob3JpZ2luYWxMb2NhdGlvbik7Ci0gICAgCi0gICAgYWRkQ29ubmVjdG9yVG9QYXJlbnQocGFuZWwpOwotCi0gICAgaWYgKHBhcmVudEVkaXRQYXJ0ICE9IG51bGwgJiYgcGFyZW50RWRpdFBhcnQuZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBHZW5lcmljR3JvdXBGaWd1cmUpCi0gICAgewotICAgICAgR2VuZXJpY0dyb3VwRmlndXJlIGZpZyA9IChHZW5lcmljR3JvdXBGaWd1cmUpcGFyZW50RWRpdFBhcnQuZ2V0RmlndXJlKCk7Ci0gICAgICBSZWN0YW5nbGUgaWNvbkJvdW5kcyA9IGdldFpvb21lZEJvdW5kcyhmaWcuZ2V0SWNvbkZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLSAgICAgIFJvdW5kZWRSZWN0YW5nbGUgcm91bmRlZFJlY3RhbmdsZSA9IG5ldyBSb3VuZGVkUmVjdGFuZ2xlKCk7Ci0gICAgICByb3VuZGVkUmVjdGFuZ2xlLnNldEZpbGwoZmFsc2UpOwotICAgICAgcm91bmRlZFJlY3RhbmdsZS5zZXRPcGFxdWUodHJ1ZSk7Ci0vLyAgICAgIHJvdW5kZWRSZWN0YW5nbGUuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoaWNvbkJvdW5kcy54LCBpY29uQm91bmRzLnksIGljb25Cb3VuZHMud2lkdGggLSAxLCBpY29uQm91bmRzLmhlaWdodCAtIDEpKTsKLSAgICAgIHJvdW5kZWRSZWN0YW5nbGUuc2V0Qm91bmRzKGljb25Cb3VuZHMpOwotICAgICAgcGFuZWwuYWRkKHJvdW5kZWRSZWN0YW5nbGUpOwotICAgIH0KLSAgICByZXR1cm4gcGFuZWw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3RvclRvUGFyZW50KElGaWd1cmUgcCkKLSAgewotICAgIFJlY3RhbmdsZSByID0gb3JpZ2luYWxMb2NhdGlvbi5nZXRDb3B5KCk7Ci0gICAgUmVjdGFuZ2xlIHBCb3VuZHMgPSByLmdldENvcHkoKTsKLSAgICBQb2ludExpc3QgcG9pbnRMaXN0ID0gZ2V0Q29ubmVjdGlvblBvaW50cyhyKTsKLQotICAgIGlmIChwb2ludExpc3QgIT0gbnVsbCAmJiBwb2ludExpc3Quc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBwb2x5TGluZS5zZXRQb2ludHMocG9pbnRMaXN0KTsKLSAgICAgIFBvaW50IGZpcnN0UG9pbnQgPSBwb2ludExpc3QuZ2V0Rmlyc3RQb2ludCgpOwotICAgICAgaWYgKGZpcnN0UG9pbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcEJvdW5kcyA9IHBCb3VuZHMuZ2V0VW5pb24obmV3IFJlY3RhbmdsZShmaXJzdFBvaW50LngsIGZpcnN0UG9pbnQueSwgMSwgMSkpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChwYXJlbnRFZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChwYXJlbnRFZGl0UGFydC5nZXRGaWd1cmUoKSBpbnN0YW5jZW9mIEdlbmVyaWNHcm91cEZpZ3VyZSkKLSAgICAgIHsKLSAgICAgICAgR2VuZXJpY0dyb3VwRmlndXJlIGZpZyA9IChHZW5lcmljR3JvdXBGaWd1cmUpcGFyZW50RWRpdFBhcnQuZ2V0RmlndXJlKCk7Ci0gICAgICAgIFJlY3RhbmdsZSBpY29uQm91bmRzID0gZ2V0Wm9vbWVkQm91bmRzKGZpZy5nZXRJY29uRmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotICAgICAgICBwQm91bmRzID0gcEJvdW5kcy5nZXRVbmlvbihpY29uQm91bmRzKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwLnNldEJvdW5kcyhwQm91bmRzKTsKLSAgICBwLnZhbGlkYXRlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBQb2ludCBnZXRab29tZWRQb2ludChQb2ludCBwKQotICB7Ci0gICAgZG91YmxlIGZhY3RvciA9ICgoU2NhbGFibGVSb290RWRpdFBhcnQpdmlld2VyLmdldFJvb3RFZGl0UGFydCgpKS5nZXRab29tTWFuYWdlcigpLmdldFpvb20oKTsKLQotICAgIGludCB4ID0gKGludClNYXRoLnJvdW5kKHAueCAqIGZhY3Rvcik7Ci0gICAgaW50IHkgPSAoaW50KU1hdGgucm91bmQocC55ICogZmFjdG9yKTsKLQotICAgIHJldHVybiBuZXcgUG9pbnQoeCwgeSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Wm9vbWVkQm91bmRzKFJlY3RhbmdsZSByKQotICB7Ci0gICAgZG91YmxlIGZhY3RvciA9ICgoU2NhbGFibGVSb290RWRpdFBhcnQpdmlld2VyLmdldFJvb3RFZGl0UGFydCgpKS5nZXRab29tTWFuYWdlcigpLmdldFpvb20oKTsKLQotICAgIGludCB4ID0gKGludClNYXRoLnJvdW5kKHIueCAqIGZhY3Rvcik7Ci0gICAgaW50IHkgPSAoaW50KU1hdGgucm91bmQoci55ICogZmFjdG9yKTsKLSAgICBpbnQgd2lkdGggPSAoaW50KU1hdGgucm91bmQoci53aWR0aCAqIGZhY3Rvcik7Ci0gICAgaW50IGhlaWdodCA9IChpbnQpTWF0aC5yb3VuZChyLmhlaWdodCAqIGZhY3Rvcik7Ci0KLSAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZUtleWJvYXJkRHJhZ0FuZERyb3AoWFNEQmFzZUZpZWxkRWRpdFBhcnQgbGVmdEZpZWxkLCBYU0RCYXNlRmllbGRFZGl0UGFydCByaWdodEZpZWxkLCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgdGFyZ2V0ID0gbGVmdEZpZWxkOwotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuU09VVEgpCi0gICAgewotICAgICAgaWYgKGl0ZW1Ub0RyYWcgPT0gdGFyZ2V0KQotICAgICAgICByZXR1cm47Ci0gICAgICB0YXJnZXQgPSByaWdodEZpZWxkOwotICAgIH0KLSAgICB0aGlzLmxvY2F0aW9uID0gbnVsbDsKLSAgICBpZiAodGFyZ2V0ICE9IG51bGwpCi0gICAgICB0aGlzLmxvY2F0aW9uID0gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9YU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL1hTREF0dHJpYnV0ZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzA5ZWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL1hTREF0dHJpYnV0ZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuTW92ZVhTREF0dHJpYnV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFdpbGRjYXJkQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNvbXBsZXhUeXBlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLkF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5UYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5YU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5YU0RCYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkdlbmVyaWNHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEQXR0cmlidXRlRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQmFzZURyYWdBbmREcm9wQ29tbWFuZAotewotICBwdWJsaWMgWFNEQXR0cmlidXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0LCBHcmFwaGljYWxFZGl0UGFydCB0YXJnZXQsIFhTREJhc2VGaWVsZEVkaXRQYXJ0IGl0ZW1Ub0RyYWcsIFBvaW50IGxvY2F0aW9uKQotICB7Ci0gICAgc3VwZXIodmlld2VyLCByZXF1ZXN0KTsKLSAgICBzZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX0RSQUdfRFJPUF9BVFRSSUJVVEUpOwotICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgIHRoaXMuaXRlbVRvRHJhZyA9IGl0ZW1Ub0RyYWc7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIHNldHVwKCk7Ci0gIH0KLQotICBwdWJsaWMgWFNEQXR0cmlidXRlRHJhZ0FuZERyb3BDb21tYW5kKFhTREJhc2VGaWVsZEVkaXRQYXJ0IGl0ZW1Ub0RyYWcsIFhTREJhc2VGaWVsZEVkaXRQYXJ0IGxlZnRGaWVsZCwgWFNEQmFzZUZpZWxkRWRpdFBhcnQgcmlnaHRGaWVsZCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIHN1cGVyKGl0ZW1Ub0RyYWcuZ2V0Vmlld2VyKCksIG51bGwpOyAKLSAgICBzZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX0RSQUdfRFJPUF9BVFRSSUJVVEUpOyAKLSAgICB0aGlzLml0ZW1Ub0RyYWcgPSBpdGVtVG9EcmFnOwotICAgIGNhbkV4ZWN1dGUgPSBmYWxzZTsKLSAgICBoYW5kbGVLZXlib2FyZERyYWdBbmREcm9wKGxlZnRGaWVsZCwgcmlnaHRGaWVsZCwgZGlyZWN0aW9uKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlS2V5Ym9hcmREcmFnQW5kRHJvcChYU0RCYXNlRmllbGRFZGl0UGFydCBsZWZ0RmllbGQsIFhTREJhc2VGaWVsZEVkaXRQYXJ0IHJpZ2h0RmllbGQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICBzdXBlci5oYW5kbGVLZXlib2FyZERyYWdBbmREcm9wKGxlZnRGaWVsZCwgcmlnaHRGaWVsZCwgZGlyZWN0aW9uKTsKLSAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKQotICAgIHsKLSAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gcmlnaHRGaWVsZDsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRUb3AoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCEobGVmdEZpZWxkLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIpCi0gICAgICAgICAgICAgICAgIHx8IGxlZnRGaWVsZC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNEV2lsZGNhcmRBZGFwdGVyKQotICAgICAgewotICAgICAgICB0YXJnZXQgPSByaWdodEZpZWxkOwotICAgICAgICB0aGlzLmxvY2F0aW9uID0gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldFRvcCgpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkgcmV0dXJuOwotICAgIHNldHVwKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNldHVwKCkKLSAgewotICAgIGNhbkV4ZWN1dGUgPSBmYWxzZTsKLQotICAgIC8vIERyb3AgdGFyZ2V0IGlzIGF0dHJpYnV0ZSBncm91cCByZWYKLSAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpCi0gICAgewotICAgICAgcGFyZW50RWRpdFBhcnQgPSAoQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpIHRhcmdldDsKLSAgICAgIGlmICgoKEdlbmVyaWNHcm91cEZpZ3VyZSkgcGFyZW50RWRpdFBhcnQuZ2V0RmlndXJlKCkpLmdldEljb25GaWd1cmUoKS5nZXRCb3VuZHMoKS5jb250YWlucyhsb2NhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIHhzZENvbXBvbmVudFRvRHJhZyA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIpIGl0ZW1Ub0RyYWcuZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKCgoQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpIHBhcmVudEVkaXRQYXJ0KS5nZXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKSwgeHNkQ29tcG9uZW50VG9EcmFnLCBudWxsLCBudWxsKTsKLSAgICAgICAgY2FuRXhlY3V0ZSA9IGFjdGlvbi5jYW5Nb3ZlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEJhc2VGaWVsZEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIHRhcmdldFNwYWNlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAvLyBDYWxjdWxhdGUgdGhlIGxpc3Qgb2YgYWxsIHNpYmxpbmcgZmllbGQgZWRpdCBwYXJ0czsKLSAgICAgIExpc3QgdGFyZ2V0RWRpdFBhcnRTaWJsaW5ncyA9IGNhbGN1bGF0ZUZpZWxkRWRpdFBhcnRzKCk7Ci0gICAgICBjYWxjdWxhdGVBdHRyaWJ1dGVHcm91cExpc3QoKTsKLQotICAgICAgLy8gR2V0ICdsZWZ0JyBhbmQgJ3JpZ2h0JyBzaWJsaW5ncwotICAgICAgZG9Ecm9wKHRhcmdldEVkaXRQYXJ0U2libGluZ3MsIGl0ZW1Ub0RyYWcpOwotICAgIH0KLSAgfSAgCi0gIAotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5CYXNlRHJhZ0FuZERyb3BDb21tYW5kI2dldEVsZW1lbnQoKQotICAgKi8KLSAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0RWxlbWVudCgpCi0gIHsKLQkgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcikgaXRlbVRvRHJhZy5nZXRNb2RlbCgpOwotCSAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gdGFyZ2V0ID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKWFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0JICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpdGFyZ2V0LmVDb250YWluZXIoKTsKLQkgIHJldHVybiBwYXJlbnQuZ2V0RWxlbWVudCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9Ecm9wKExpc3Qgc2libGluZ3MsIEdyYXBoaWNhbEVkaXRQYXJ0IG1vdmluZ0VkaXRQYXJ0KQotICB7Ci0gICAgY29tbW9uU2V0dXAoc2libGluZ3MsIG1vdmluZ0VkaXRQYXJ0KTsKLQotICAgIGlmICgocHJldmlvdXNSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB8fCBwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKSAKLSAgICAgICAgJiYgKG5leHRSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB8fCBuZXh0UmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IHByZXZpb3VzUmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKGNsb3NlclNpYmxpbmcgPT0gQkVMT1dfSVNfQ0xPU0VSKQotICAgICAgewotICAgICAgICBwYXJlbnQgPSBuZXh0UmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpOwotICAgICAgfQotICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RBdHRyaWJ1dGVBY3Rpb24ocGFyZW50LCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJldmlvdXNSZWZDb21wb25lbnQgPT0gbnVsbCAmJiAobmV4dFJlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHx8IG5leHRSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gbmV4dFJlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChjbG9zZXJTaWJsaW5nID09IEFCT1ZFX0lTX0NMT1NFUikKLSAgICAgIHsKLSAgICAgICAgaWYgKGxlZnRTaWJsaW5nRWRpdFBhcnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKHBhcmVudCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50RWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKHBhcmVudEVkaXRQYXJ0LmdldFhTRENvbmNyZXRlQ29tcG9uZW50KCksIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKHBhcmVudCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHByZXZpb3VzUmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gJiYgbmV4dFJlZkNvbXBvbmVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IHByZXZpb3VzUmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKGNsb3NlclNpYmxpbmcgPT0gQUJPVkVfSVNfQ0xPU0VSKQotICAgICAgewotICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREF0dHJpYnV0ZUFjdGlvbihwYXJlbnQsIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAocmlnaHRTaWJsaW5nRWRpdFBhcnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKHBhcmVudCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RBdHRyaWJ1dGVBY3Rpb24ocGFyZW50LCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKLSAgICAgIGNhbkV4ZWN1dGUgPSBhY3Rpb24uY2FuTW92ZSgpOwotICB9Ci0KLSAgCi0gIC8vIEF0dHJpYnV0ZSBHcm91cCByZWxhdGVkIGhlbHBlciBtZXRob2QgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBjYWxjdWxhdGVBdHRyaWJ1dGVHcm91cExpc3QoKQotICB7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSB0YXJnZXQ7Ci0gICAgd2hpbGUgKGVkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29tcGxleFR5cGVFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3QgY2hpbGQgPSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEVkaXRQYXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExpc3QgY29tcGFydG1lbnRMaXN0ID0gKChDb21wYXJ0bWVudEVkaXRQYXJ0KSBjaGlsZCkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjb21wYXJ0bWVudExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0IGdyb3VwcyA9IChYU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0KSBvYmo7Ci0gICAgICAgICAgICAgICAgTGlzdCBncm91cExpc3QgPSBncm91cHMuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncm91cExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIE9iamVjdCBncm91cENoaWxkID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBDaGlsZCBpbnN0YW5jZW9mIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldFNwYWNlc0xpc3QuYWRkKGdyb3VwQ2hpbGQpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZ3JvdXBDaGlsZCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZXRBdHRyaWJ1dGVHcm91cEVkaXRQYXJ0cygoQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpIGdyb3VwQ2hpbGQpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWRpdFBhcnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8vIEF0dHJpYnV0ZSBHcm91cCByZWxhdGVkIGhlbHBlciBtZXRob2QKLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldEF0dHJpYnV0ZUdyb3VwRWRpdFBhcnRzKEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0IGF0dHJpYnV0ZUdyb3VwRWRpdFBhcnQpCi0gIHsKLSAgICBMaXN0IGdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBMaXN0IGxpc3QgPSBhdHRyaWJ1dGVHcm91cEVkaXRQYXJ0LmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG9iamVjdCA9IGkubmV4dCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldFNwYWNlc0xpc3QuYWRkKG9iamVjdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQgZ3JvdXBSZWYgPSAoQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpIG9iamVjdDsKLSAgICAgICAgTGlzdCBncm91cFJlZkNoaWxkcmVuID0gZ3JvdXBSZWYuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGdyb3VwUmVmQ2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRTcGFjZXNMaXN0LmFkZChvKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0IGFHcm91cCA9IChBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkgbzsKLSAgICAgICAgICAgIGdyb3VwTGlzdC5hZGQoYUdyb3VwKTsKLSAgICAgICAgICAgIGdyb3VwTGlzdC5hZGRBbGwoZ2V0QXR0cmlidXRlR3JvdXBFZGl0UGFydHMoYUdyb3VwKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBncm91cExpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL1hTREVsZW1lbnREcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL1hTREVsZW1lbnREcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmNDViMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9YU0RFbGVtZW50RHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5Nb3ZlWFNERWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RXaWxkY2FyZEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Db21wbGV4VHlwZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuU3RydWN0dXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLk1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLk1vZGVsR3JvdXBFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNEQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlhTREdyb3Vwc0ZvckFubm90YXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkdlbmVyaWNHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZCBleHRlbmRzIEJhc2VEcmFnQW5kRHJvcENvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIE1vZGVsR3JvdXBFZGl0UGFydCB0b3BNb3N0R3JvdXA7Ci0KLSAgcHVibGljIFhTREVsZW1lbnREcmFnQW5kRHJvcENvbW1hbmQoRWRpdFBhcnRWaWV3ZXIgdmlld2VyLCBDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsIEdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldCwgWFNEQmFzZUZpZWxkRWRpdFBhcnQgaXRlbVRvRHJhZywgUG9pbnQgbG9jYXRpb24pCi0gIHsKLSAgICBzdXBlcih2aWV3ZXIsIHJlcXVlc3QpOwotICAgIHNldExhYmVsKE1lc3NhZ2VzLl9VSV9BQ1RJT05fRFJBR19EUk9QX0VMRU1FTlQpOwotICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgIHRoaXMuaXRlbVRvRHJhZyA9IGl0ZW1Ub0RyYWc7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIHNldHVwKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RFbGVtZW50RHJhZ0FuZERyb3BDb21tYW5kKFhTREJhc2VGaWVsZEVkaXRQYXJ0IGl0ZW1Ub0RyYWcsIFhTREJhc2VGaWVsZEVkaXRQYXJ0IGxlZnRGaWVsZCwgWFNEQmFzZUZpZWxkRWRpdFBhcnQgcmlnaHRGaWVsZCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIHN1cGVyKGl0ZW1Ub0RyYWcuZ2V0Vmlld2VyKCksIG51bGwpOyAKLSAgICBzZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX0RSQUdfRFJPUF9FTEVNRU5UKTsgCi0gICAgdGhpcy5pdGVtVG9EcmFnID0gaXRlbVRvRHJhZzsKLSAgICBjYW5FeGVjdXRlID0gZmFsc2U7Ci0gICAgaGFuZGxlS2V5Ym9hcmREcmFnQW5kRHJvcChsZWZ0RmllbGQsIHJpZ2h0RmllbGQsIGRpcmVjdGlvbik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZUtleWJvYXJkRHJhZ0FuZERyb3AoWFNEQmFzZUZpZWxkRWRpdFBhcnQgbGVmdEZpZWxkLCBYU0RCYXNlRmllbGRFZGl0UGFydCByaWdodEZpZWxkLCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuaGFuZGxlS2V5Ym9hcmREcmFnQW5kRHJvcChsZWZ0RmllbGQsIHJpZ2h0RmllbGQsIGRpcmVjdGlvbik7Ci0gICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkKLSAgICB7Ci0gICAgICBpZiAodGFyZ2V0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldCA9IHJpZ2h0RmllbGQ7Ci0gICAgICAgIHRoaXMubG9jYXRpb24gPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0VG9wKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghKGxlZnRGaWVsZC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikKLSAgICAgICAgICAgICAgICAgfHwgbGVmdEZpZWxkLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZEFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldCA9IHJpZ2h0RmllbGQ7Ci0gICAgICAgIHRoaXMubG9jYXRpb24gPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0VG9wKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSByZXR1cm47Ci0gICAgc2V0dXAoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldHVwKCkKLSAgewotICAgIGNhbkV4ZWN1dGUgPSBmYWxzZTsKLQotICAgIC8vIERyb3AgdGFyZ2V0IGlzIG1vZGVsIGdyb3VwCi0gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1vZGVsR3JvdXBFZGl0UGFydCkKLSAgICB7Ci0gICAgICBwYXJlbnRFZGl0UGFydCA9IChNb2RlbEdyb3VwRWRpdFBhcnQpIHRhcmdldDsKLSAgICAgIGlmICgoKEdlbmVyaWNHcm91cEZpZ3VyZSkgcGFyZW50RWRpdFBhcnQuZ2V0RmlndXJlKCkpLmdldEljb25GaWd1cmUoKS5nZXRCb3VuZHMoKS5jb250YWlucyhsb2NhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIHhzZENvbXBvbmVudFRvRHJhZyA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgKChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKSBpdGVtVG9EcmFnLmdldE1vZGVsKCkpLmdldFRhcmdldCgpOwotICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREVsZW1lbnRBY3Rpb24oKChNb2RlbEdyb3VwRWRpdFBhcnQpIHRhcmdldCkuZ2V0WFNETW9kZWxHcm91cCgpLCB4c2RDb21wb25lbnRUb0RyYWcsIG51bGwsIG51bGwpOwotICAgICAgICBjYW5FeGVjdXRlID0gYWN0aW9uLmNhbk1vdmUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQmFzZUZpZWxkRWRpdFBhcnQpCi0gICAgewotICAgICAgdGFyZ2V0U3BhY2VzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbGlzdCBvZiBhbGwgc2libGluZyBmaWVsZCBlZGl0IHBhcnRzOwotICAgICAgTGlzdCB0YXJnZXRFZGl0UGFydFNpYmxpbmdzID0gY2FsY3VsYXRlRmllbGRFZGl0UGFydHMoKTsKLSAgICAgIGNhbGN1bGF0ZU1vZGVsR3JvdXBMaXN0KCk7Ci0KLSAgICAgIGRvRHJvcCh0YXJnZXRFZGl0UGFydFNpYmxpbmdzLCBpdGVtVG9EcmFnKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLkJhc2VEcmFnQW5kRHJvcENvbW1hbmQjZ2V0RWxlbWVudCgpCi0gICAqLwotICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRFbGVtZW50KCkKLSAgewotCSAgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpIGl0ZW1Ub0RyYWcuZ2V0TW9kZWwoKTsKLQkgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB0YXJnZXQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0JICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpdGFyZ2V0LmVDb250YWluZXIoKTsJICAKLQkgIHJldHVybiBwYXJlbnQuZ2V0RWxlbWVudCgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb0Ryb3AoTGlzdCBzaWJsaW5ncywgR3JhcGhpY2FsRWRpdFBhcnQgbW92aW5nRWRpdFBhcnQpCi0gIHsKLSAgICBjb21tb25TZXR1cChzaWJsaW5ncywgbW92aW5nRWRpdFBhcnQpOwotCi0gICAgLy8gQ2FuIGNvbW1vbiB0aGlzIGNvZGUgdXAgd2l0aCBYU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQuLi4gCi0gICAgaWYgKChwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbiB8fCBwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgICAgICAmJiAobmV4dFJlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbiB8fCBuZXh0UmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpKSAKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cCkgcHJldmlvdXNSZWZDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAocGFyZW50RWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgICAgbW9kZWxHcm91cCA9ICgoTW9kZWxHcm91cEVkaXRQYXJ0KSBwYXJlbnRFZGl0UGFydCkuZ2V0WFNETW9kZWxHcm91cCgpOwotICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RFbGVtZW50QWN0aW9uKG1vZGVsR3JvdXAsIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwcmV2aW91c1JlZkNvbXBvbmVudCA9PSBudWxsICYmIChuZXh0UmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8IG5leHRSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkpCi0gICAgewotICAgICAgaWYgKGNsb3NlclNpYmxpbmcgPT0gQUJPVkVfSVNfQ0xPU0VSKQotICAgICAgewotICAgICAgICBpZiAobGVmdFNpYmxpbmdFZGl0UGFydCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RFbGVtZW50QWN0aW9uKHRvcE1vc3RHcm91cC5nZXRYU0RNb2RlbEdyb3VwKCksIHhzZENvbXBvbmVudFRvRHJhZywgbnVsbCwgbnVsbCwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudEVkaXRQYXJ0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREVsZW1lbnRBY3Rpb24oKChNb2RlbEdyb3VwRWRpdFBhcnQpIHBhcmVudEVkaXRQYXJ0KS5nZXRYU0RNb2RlbEdyb3VwKCksIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKSBuZXh0UmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpOwotICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREVsZW1lbnRBY3Rpb24obW9kZWxHcm91cCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKChwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbiB8fCBwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKSAgCi0gICAgICAgICYmIG5leHRSZWZDb21wb25lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cClwcmV2aW91c1JlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChwYXJlbnRFZGl0UGFydCAhPSBudWxsKQotICAgICAgICBtb2RlbEdyb3VwID0gKChNb2RlbEdyb3VwRWRpdFBhcnQpIHBhcmVudEVkaXRQYXJ0KS5nZXRYU0RNb2RlbEdyb3VwKCk7Ci0gICAgICBpZiAoY2xvc2VyU2libGluZyA9PSBBQk9WRV9JU19DTE9TRVIpCi0gICAgICB7Ci0gICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNERWxlbWVudEFjdGlvbihtb2RlbEdyb3VwLCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHJpZ2h0U2libGluZ0VkaXRQYXJ0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREVsZW1lbnRBY3Rpb24odG9wTW9zdEdyb3VwLmdldFhTRE1vZGVsR3JvdXAoKSwgeHNkQ29tcG9uZW50VG9EcmFnLCBudWxsLCBudWxsLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREVsZW1lbnRBY3Rpb24obW9kZWxHcm91cCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgICBjYW5FeGVjdXRlID0gYWN0aW9uLmNhbk1vdmUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBvdmVycmlkZXMgYmFzZQotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRmlyc3RBbmRMYXN0RHJvcFRhcmdldHMoaW50IGluZGV4LCBMaXN0IHNpYmxpbmdzKQotICB7Ci0gICAgLy8gVGhpcyBib29sZWFuIGlzIHRvIGhhbmRsZSB0aGUgVG9wIGFuZCBCb3R0b20gZHJvcCB0YXJnZXRzIGZvciB3aGljaCB3ZSB3YW50IHRvIGRyb3AKLSAgICAvLyB0byB0aGUgdG9wIG1vc3QgbW9kZWwgZ3JvdXAKLSAgICAvLyBUT0RPOiBJIG5lZWQgdG8gcmVhcnJhbmdlIHRoaXMgY29kZSBiZXR0ZXIKLSAgICBib29sZWFuIGlzSGFuZGxlZCA9IGZhbHNlOwotICAgIGludCBwb2ludGVyWUxvY2F0aW9uID0gbG9jYXRpb24ueTsKLSAgICAvLyBXZSBuZWVkIHRvIGZpbmQgdGhlIHBhcmVudCBlZGl0cGFydCwgd2hpY2ggaXMgdGhlIG1vZGVsIGdyb3VwCi0gICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgeW91IGRyb3AgdG8gZmlyc3QgcG9zaXRpb24KLSAgICBpZiAoaW5kZXggPT0gMCAmJiBzaWJsaW5ncy5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIGxlZnRTaWJsaW5nRWRpdFBhcnQgPSBudWxsOwotICAgICAgcmlnaHRTaWJsaW5nRWRpdFBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHNpYmxpbmdzLmdldCgwKTsKLSAgICAgIGludCBzaWJsaW5nWUxvY2F0aW9uID0gZ2V0Wm9vbWVkQm91bmRzKHJpZ2h0U2libGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpKS5nZXRDZW50ZXIoKS55OwotICAgICAgY2xvc2VyU2libGluZyA9IEJFTE9XX0lTX0NMT1NFUjsKLSAgICAgIGlmIChNYXRoLmFicyhwb2ludGVyWUxvY2F0aW9uIC0gc2libGluZ1lMb2NhdGlvbikgPiBnZXRab29tZWRCb3VuZHMocmlnaHRTaWJsaW5nRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkpLmhlaWdodCAvIDQpCi0gICAgICB7Ci0gICAgICAgIGlzSGFuZGxlZCA9IHRydWU7Ci0gICAgICAgIHBhcmVudEVkaXRQYXJ0ID0gdG9wTW9zdEdyb3VwOwotICAgICAgICBpZiAodG9wTW9zdEdyb3VwICE9IG51bGwpCi0gICAgICAgICAgY2xvc2VyU2libGluZyA9IEFCT1ZFX0lTX0NMT1NFUjsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgeW91IGRyb3AgdG8gbGFzdCBwb3NpdGlvbgotICAgIGlmIChpbmRleCA+IDAgJiYgaW5kZXggPT0gc2libGluZ3Muc2l6ZSgpKQotICAgIHsKLSAgICAgIGxlZnRTaWJsaW5nRWRpdFBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHNpYmxpbmdzLmdldChpbmRleCAtIDEpOwotICAgICAgaW50IHNpYmxpbmdZTG9jYXRpb24gPSBnZXRab29tZWRCb3VuZHMobGVmdFNpYmxpbmdFZGl0UGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKSkuZ2V0Q2VudGVyKCkueTsKLSAgICAgIGlmIChNYXRoLmFicyhwb2ludGVyWUxvY2F0aW9uIC0gc2libGluZ1lMb2NhdGlvbikgPiBnZXRab29tZWRCb3VuZHMobGVmdFNpYmxpbmdFZGl0UGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKSkuaGVpZ2h0IC8gNCkKLSAgICAgIHsKLSAgICAgICAgaXNIYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgcGFyZW50RWRpdFBhcnQgPSB0b3BNb3N0R3JvdXA7Ci0gICAgICAgIGlmICh0b3BNb3N0R3JvdXAgIT0gbnVsbCkKLSAgICAgICAgICBjbG9zZXJTaWJsaW5nID0gQkVMT1dfSVNfQ0xPU0VSOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaXNIYW5kbGVkOwotICB9Ci0KLSAgLy8gTWV0aG9kcyBzcGVjaWZpYyB0byBlbGVtZW50IGFzIGRyYWcgc291cmNlCi0gIAotICAvLyBNb2RlbCBHcm91cCByZWxhdGVkIGhlbHBlciBtZXRob2QKLSAgcHJvdGVjdGVkIHZvaWQgY2FsY3VsYXRlTW9kZWxHcm91cExpc3QoKQotICB7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSB0YXJnZXQ7Ci0gICAgd2hpbGUgKGVkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgTW9kZWxHcm91cEVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBnZXRNb2RlbEdyb3VwRWRpdFBhcnRzKChNb2RlbEdyb3VwRWRpdFBhcnQpIGVkaXRQYXJ0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29tcGxleFR5cGVFZGl0UGFydCB8fCBlZGl0UGFydCBpbnN0YW5jZW9mIFN0cnVjdHVyZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBib29sZWFuIGZvdW5kVG9wID0gZmFsc2U7Ci0gICAgICAgIExpc3QgbGlzdCA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IGNoaWxkID0gaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29tcGFydG1lbnRFZGl0UGFydCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0IGNvbXBhcnRtZW50TGlzdCA9ICgoQ29tcGFydG1lbnRFZGl0UGFydCkgY2hpbGQpLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29tcGFydG1lbnRMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RHcm91cHNGb3JBbm5vdGF0aW9uRWRpdFBhcnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYU0RHcm91cHNGb3JBbm5vdGF0aW9uRWRpdFBhcnQgZ3JvdXBzID0gKFhTREdyb3Vwc0ZvckFubm90YXRpb25FZGl0UGFydCkgb2JqOwotICAgICAgICAgICAgICAgIExpc3QgZ3JvdXBMaXN0ID0gZ3JvdXBzLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ3JvdXBMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBPYmplY3QgZ3JvdXBDaGlsZCA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwQ2hpbGQgaW5zdGFuY2VvZiBNb2RlbEdyb3VwRWRpdFBhcnQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRUb3ApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBmb3VuZFRvcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgdG9wTW9zdEdyb3VwID0gKE1vZGVsR3JvdXBFZGl0UGFydCkgZ3JvdXBDaGlsZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBnZXRNb2RlbEdyb3VwRWRpdFBhcnRzKChNb2RlbEdyb3VwRWRpdFBhcnQpIGdyb3VwQ2hpbGQpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWRpdFBhcnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsKLSAgICB9Ci0gIH0KLQotICAvLyBNb2RlbCBHcm91cCByZWxhdGVkIGhlbHBlciBtZXRob2QKLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsR3JvdXBFZGl0UGFydHMoTW9kZWxHcm91cEVkaXRQYXJ0IG1vZGVsR3JvdXBFZGl0UGFydCkKLSAgewotICAgIExpc3QgbW9kZWxHcm91cExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgTGlzdCBsaXN0ID0gbW9kZWxHcm91cEVkaXRQYXJ0LmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG9iamVjdCA9IGkubmV4dCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldFNwYWNlc0xpc3QuYWRkKG9iamVjdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0IGdyb3VwUmVmID0gKE1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQpIG9iamVjdDsKLSAgICAgICAgTGlzdCBncm91cFJlZkNoaWxkcmVuID0gZ3JvdXBSZWYuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGdyb3VwUmVmQ2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTW9kZWxHcm91cEVkaXRQYXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdldE1vZGVsR3JvdXBFZGl0UGFydHMoKE1vZGVsR3JvdXBFZGl0UGFydCkgbyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNb2RlbEdyb3VwRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGdldE1vZGVsR3JvdXBFZGl0UGFydHMoKE1vZGVsR3JvdXBFZGl0UGFydCkgb2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1vZGVsR3JvdXBMaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YmJkMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9BdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5UYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5HZW5lcmljR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQgZXh0ZW5kcyBDb25uZWN0YWJsZUVkaXRQYXJ0Ci17Ci0JUmVmZXJlbmNlQ29ubmVjdGlvbiBmaWd1cmU7Ci0JR2VuZXJpY0dyb3VwRmlndXJlIGdyb3VwRmlndXJlOyAKLSAgcHVibGljIEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpCi0gIHsKLSAgICBpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpIGdldE1vZGVsKCk7Ci0gICAgICByZXR1cm4gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgYWRhcHRlci5nZXRUYXJnZXQoKTsKLSAgICB9Ci0vLyAgICBlbHNlIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotLy8gICAgewotLy8gICAgICByZXR1cm4gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgZ2V0TW9kZWwoKTsKLS8vICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLQotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotCWdyb3VwRmlndXJlID0gbmV3IEdlbmVyaWNHcm91cEZpZ3VyZSgpOwotICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyKSBnZXRNb2RlbCgpOwotICAgIGdyb3VwRmlndXJlLmdldEljb25GaWd1cmUoKS5pbWFnZSA9IGFkYXB0ZXIuZ2V0SW1hZ2UoKTsKLSAgICBMYWJlbCB0b29sVGlwc0xhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgdG9vbFRpcHNMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9QQUdFX0hFQURJTkdfQVRUUklCVVRFR1JPVVBfUkVGIikpOwotICAgIGdyb3VwRmlndXJlLnNldFRvb2xUaXAodG9vbFRpcHNMYWJlbCk7Ci0gICAgcmV0dXJuIGdyb3VwRmlndXJlOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpZ2V0TW9kZWwoKTsKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uID0gYWRhcHRlci5nZXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICBJdGVyYXRvciBpID0gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCi0gICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyR3JvdXBDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCkgaS5uZXh0KCk7Ci0KLSAgICAgIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGF0dHJHcm91cENvbnRlbnQpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKG5ldyBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIoKFhTREJhc2VBZGFwdGVyKVhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKChYU0RBdHRyaWJ1dGVVc2UpYXR0ckdyb3VwQ29udGVudCkuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSkpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQobmV3IFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcigoWFNEQmFzZUFkYXB0ZXIpZ2V0TW9kZWwoKSkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAobGlzdC5pc0VtcHR5KCkpCi0gICAgewotICAgICAgbGlzdC5hZGQobmV3IFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcigoWFNEQmFzZUFkYXB0ZXIpZ2V0TW9kZWwoKSkpOwotICAgIH0KLQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLQotICBwdWJsaWMgUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKEJhc2VFZGl0UGFydCBjaGlsZCkKLSAgewotICAgIFJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZSA9IG5ldyBSZWZlcmVuY2VDb25uZWN0aW9uKCk7Ci0KLSAgICBjb25uZWN0aW9uRmlndXJlLnNldFNvdXJjZUFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKCgoR2VuZXJpY0dyb3VwRmlndXJlKWdldEZpZ3VyZSgpKS5nZXRJY29uRmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5SSUdIVCwgMCwgMCkpOwotCi0gICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpCi0gICAgewotICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRUYXJnZXRBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcigoKEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KSBjaGlsZCkuZ2V0VGFyZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5MRUZULCAwLCAwKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkKLSAgICB7Ci0vLyAgICAgIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQgZWxlbSA9IChUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KSBjaGlsZDsKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoKChUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5MRUZULCAwLCAwKSk7Ci0gICAgfQotCi0gICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotICAgIGZpZ3VyZSA9IGNvbm5lY3Rpb25GaWd1cmU7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25GaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZGVyVGV4dCgpCi0gIHsKLQlTdHJpbmcgdGV4dCA9ICgoTGFiZWwpIGdyb3VwRmlndXJlLmdldFRvb2xUaXAoKSkuZ2V0VGV4dCgpOwotCXJldHVybiB0ZXh0OwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvQ2F0ZWdvcnlFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9DYXRlZ29yeUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjODAwOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9DYXRlZ29yeUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNjcm9sbFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlZpZXdwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5WaWV3cG9ydExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuQ2F0ZWdvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5IZWFkaW5nRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuUm91bmRlZExpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzLkNvbnRhaW5lckxheW91dDsKLQotcHVibGljIGNsYXNzIENhdGVnb3J5RWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeTsKLSAgcHJvdGVjdGVkIEZpZ3VyZSBvdXRlclBhbmU7Ci0gIEhlYWRpbmdGaWd1cmUgaGVhZGluZ0ZpZ3VyZTsKLSAgcHJvdGVjdGVkIFNjcm9sbFBhbmUgc2Nyb2xscGFuZTsKLSAgcHJvdGVjdGVkIGludCBtaW5pbXVtSGVpZ2h0ID0gNDAwOwotCi0gIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gKChDYXRlZ29yeUFkYXB0ZXIpIGdldE1vZGVsKCkpLmdldEdyb3VwVHlwZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIG91dGVyUGFuZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBvdXRlclBhbmUuc2V0Qm9yZGVyKG5ldyBSb3VuZGVkTGluZUJvcmRlcigxLCA2KSk7Ci0KLSAgICBjcmVhdGVIZWFkaW5nRmlndXJlKCk7Ci0KLSAgICBpbnQgbWluSGVpZ2h0ID0gU1dULkRFRkFVTFQ7Ci0gICAgc3dpdGNoIChnZXRUeXBlKCkpCi0gICAgewotICAgIGNhc2UgQ2F0ZWdvcnlBZGFwdGVyLkRJUkVDVElWRVM6Ci0gICAgewotICAgICAgbWluSGVpZ2h0ID0gODA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDYXRlZ29yeUFkYXB0ZXIuQVRUUklCVVRFUzoKLSAgICBjYXNlIENhdGVnb3J5QWRhcHRlci5HUk9VUFM6Ci0gICAgewotICAgICAgbWluSGVpZ2h0ID0gMTAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIH0KLQotICAgIGZpbmFsIGludCB0aGVNaW5IZWlnaHQgPSBtaW5IZWlnaHQ7Ci0gICAgIAotICAgIFRvb2xiYXJMYXlvdXQgb3V0ZXJMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSkKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgICAgIHsKLSAgICAgICAgRGltZW5zaW9uIGQgPSBzdXBlci5jYWxjdWxhdGVQcmVmZXJyZWRTaXplKHBhcmVudCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGQudW5pb24obmV3IERpbWVuc2lvbigyNTAsIHRoZU1pbkhlaWdodCkpOwotICAgICAgICByZXR1cm4gZDsKLSAgICAgIH0KLSAgICB9OwotICAgIG91dGVyTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgb3V0ZXJQYW5lLnNldExheW91dE1hbmFnZXIob3V0ZXJMYXlvdXQpOwotCi0gICAgUmVjdGFuZ2xlRmlndXJlIGxpbmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQpCi0gICAgICB7Ci0gICAgICAgIERpbWVuc2lvbiBkID0gc3VwZXIuZ2V0UHJlZmVycmVkU2l6ZSh3SGludCwgaEhpbnQpOwotICAgICAgICBkLndpZHRoICs9IDIwOwotICAgICAgICBkLmhlaWdodCA9IDE7Ci0gICAgICAgIHJldHVybiBkOwotICAgICAgfQotICAgIH07Ci0gICAgVG9vbGJhckxheW91dCBsaW5lTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOwotICAgIGxpbmVMYXlvdXQuc2V0VmVydGljYWwodHJ1ZSk7Ci0gICAgbGluZUxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGxpbmUuc2V0TGF5b3V0TWFuYWdlcihsaW5lTGF5b3V0KTsKLSAgICBvdXRlclBhbmUuYWRkKGxpbmUpOwotCi0gICAgc2Nyb2xscGFuZSA9IG5ldyBTY3JvbGxQYW5lKCk7Ci0gICAgc2Nyb2xscGFuZS5zZXRWZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHkoU2Nyb2xsUGFuZS5BVVRPTUFUSUMpOyAvLyBTY3JvbGxQYW5lLkFMV0FZUyk7Ci0gICAgb3V0ZXJQYW5lLmFkZChzY3JvbGxwYW5lKTsKLQotICAgIEZpZ3VyZSBwYW5lID0gbmV3IEZpZ3VyZSgpOwotICAgIHBhbmUuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoNSwgOCwgNSwgOCkpOwotICAgIENvbnRhaW5lckxheW91dCBsYXlvdXQgPSBuZXcgQ29udGFpbmVyTGF5b3V0KCk7Ci0gICAgbGF5b3V0LnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIGxheW91dC5zZXRTcGFjaW5nKDApOwotICAgIHBhbmUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCi0gICAgVmlld3BvcnQgdmlld3BvcnQgPSBuZXcgVmlld3BvcnQoKTsKLSAgICB2aWV3cG9ydC5zZXRDb250ZW50c1RyYWNrc0hlaWdodCh0cnVlKTsKLSAgICBWaWV3cG9ydExheW91dCB2aWV3cG9ydExheW91dCA9IG5ldyBWaWV3cG9ydExheW91dCgpCi0gICAgewotICAgICAgcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gICAgICB7Ci0gICAgICAgIERpbWVuc2lvbiBkID0gc3VwZXIuY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShwYXJlbnQsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAodGhlTWluSGVpZ2h0ID4gMCkKLSAgICAgICAgICBkLmhlaWdodCA9IE1hdGgubWluKGQuaGVpZ2h0LCB0aGVNaW5IZWlnaHQpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkb3VibGUgZmFjdG9yID0gZ2V0Wm9vbU1hbmFnZXIoKS5nZXRab29tKCk7Ci0gICAgICAgICAgaW50IHNjYWxlZEhlaWdodCA9IChpbnQpTWF0aC5yb3VuZCgoZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLmdldEJvdW5kcygpLmhlaWdodCAtIG1pbmltdW1IZWlnaHQpIC8gZmFjdG9yKTsgLy8gYWRqdXN0IGZvciBvdGhlciBjYXRlZ29yaWVzIGFuZCBzcGFjZXMKLSAgICAgICAgICBkLmhlaWdodCA9IE1hdGgubWF4KDI1MCwgc2NhbGVkSGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICBkLndpZHRoID0gTWF0aC5taW4oZC53aWR0aCwgMzAwKTsKLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICB9Ci0gICAgfTsKLSAgICB2aWV3cG9ydC5zZXRMYXlvdXRNYW5hZ2VyKHZpZXdwb3J0TGF5b3V0KTsKLQotICAgIHNjcm9sbHBhbmUuc2V0Vmlld3BvcnQodmlld3BvcnQpOwotICAgIHNjcm9sbHBhbmUuc2V0Q29udGVudHMocGFuZSk7Ci0KLSAgICByZXR1cm4gb3V0ZXJQYW5lOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlSGVhZGluZ0ZpZ3VyZSgpCi0gIHsKLQkgIGhlYWRpbmdGaWd1cmUgPSBuZXcgSGVhZGluZ0ZpZ3VyZSgpOwotCSAgb3V0ZXJQYW5lLmFkZChoZWFkaW5nRmlndXJlKTsKLQkgIGhlYWRpbmdGaWd1cmUuZ2V0TGFiZWwoKS5zZXRUZXh0KCgoQ2F0ZWdvcnlBZGFwdGVyKSBnZXRNb2RlbCgpKS5nZXRUZXh0KCkpOwotCSAgaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLnNldEljb24oKChDYXRlZ29yeUFkYXB0ZXIpIGdldE1vZGVsKCkpLmdldEltYWdlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQotICAgIFJvdW5kZWRMaW5lQm9yZGVyIGJvcmRlciA9IChSb3VuZGVkTGluZUJvcmRlcikgb3V0ZXJQYW5lLmdldEJvcmRlcigpOwotICAgIGJvcmRlci5zZXRXaWR0aChpc1NlbGVjdGVkID8gMiA6IDEpOwotICAgIGhlYWRpbmdGaWd1cmUuc2V0U2VsZWN0ZWQoaXNTZWxlY3RlZCk7Ci0gICAgb3V0ZXJQYW5lLnJlcGFpbnQoKTsKLQotICAgIGhlYWRpbmdGaWd1cmUuZ2V0TGFiZWwoKS5zZXRUZXh0KCgoQ2F0ZWdvcnlBZGFwdGVyKSBnZXRNb2RlbCgpKS5nZXRUZXh0KCkpOwotICB9Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIHNjcm9sbHBhbmUuZ2V0Q29udGVudHMoKTsKLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBnZXROYW1lTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIGhlYWRpbmdGaWd1cmUuZ2V0TGFiZWwoKTsKLSAgfQotCi0gIHB1YmxpYyBIZWFkaW5nRmlndXJlIGdldEhlYWRpbmdGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGhlYWRpbmdGaWd1cmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBuZXcgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCgpOwotICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICBlZGl0UGFydC5zZXRQYXJlbnQodGhpcyk7Ci0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsgCi0gICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCkKLSAgICB7Ci0gICAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBFZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5nZXROZXh0U2libGluZyhlZGl0UGFydCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmdldFByZXZTaWJsaW5nKGVkaXRQYXJ0KTsKLSAgICAgIH0gICAgICAKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2Nyb2xsVG8oKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpZWRpdFBhcnQpOwotICAgICAgfSAgCi0gICAgfSAgICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoQmFzZUVkaXRQYXJ0KWdldFBhcmVudCgpKS5kb0dldFJlbGF0aXZlRWRpdFBhcnQoZWRpdFBhcnQsIGRpcmVjdGlvbik7Ci0gICAgfSAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICAvLyBjcyA6IG9kZGx5IGFycm93aW5nIHVwIGFuZCBkb3duIHRydWUgaXRlbXMgaW4gdGhlIGxpc3QgaXMgbm90IGhhbmRsZWQgbmljZWx5Ci0gICAgLy8gYnkgdGhlIGNhbm5lZCBHRUYgR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlciBzbyB0aGlzIG5hdmlnYXRpb24gcG9saWN5IGlzIG5lZWQgdG8gZml4IHRoYXQgICAgCi0gICAgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgPSBuZXcgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IChDYXRlZ29yeUFkYXB0ZXIpIGdldE1vZGVsKCk7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChhZGFwdGVyLmdldEFsbENoaWxkcmVuKCkpKTsKLSAgICByZXR1cm4gY2hpbGRyZW47Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzY3JvbGxUbyhBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHRvcExldmVsKQotICB7Ci0gICAgUmVjdGFuZ2xlIHRvcExldmVsQm91bmRzID0gdG9wTGV2ZWwuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0gICAgUmVjdGFuZ2xlIGNhdGVnb3J5Qm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwotICAgIGludCBzY3JvbGxWYWx1ZSA9IHNjcm9sbHBhbmUuZ2V0VmVydGljYWxTY3JvbGxCYXIoKS5nZXRWYWx1ZSgpOwotICAgIGludCBsb2NhdGlvbiA9IHRvcExldmVsQm91bmRzLnkgKyBzY3JvbGxWYWx1ZSAtIGNhdGVnb3J5Qm91bmRzLnk7Ci0gICAgc2Nyb2xscGFuZS5zY3JvbGxWZXJ0aWNhbFRvKGxvY2F0aW9uIC0gY2F0ZWdvcnlCb3VuZHMuaGVpZ2h0IC8gMik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1pbmltdW1IZWlnaHQoaW50IG1pbmltdW1IZWlnaHQpCi0gIHsKLSAgICB0aGlzLm1pbmltdW1IZWlnaHQgPSBtaW5pbXVtSGVpZ2h0OwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRlclRleHQoKQotICB7Ci0JICByZXR1cm4gZ2V0TmFtZUxhYmVsKCkuZ2V0VGV4dCgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvQ29ubmVjdGFibGVFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9Db25uZWN0YWJsZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMzI5MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9Db25uZWN0YWJsZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5LZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuQ2VudGVyZWRJY29uRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuR2VuZXJpY0dyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuSUV4dGVuZGVkRmlndXJlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25uZWN0YWJsZUVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBBcnJheUxpc3QgY29ubmVjdGlvbkZpZ3VyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAotICBwdWJsaWMgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSBnZXRFeHRlbmRlZEZpZ3VyZUZhY3RvcnkoKQotICB7Ci0gICAgRWRpdFBhcnRGYWN0b3J5IGZhY3RvcnkgPSBnZXRWaWV3ZXIoKS5nZXRFZGl0UGFydEZhY3RvcnkoKTsKLSAgICBBc3NlcnQuaXNUcnVlKGZhY3RvcnkgaW5zdGFuY2VvZiBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5LCAiRWRpdFBhcnRGYWN0b3J5IG11c3QgYmUgYW4gaW5zdGFuY2VvZiBvZiBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5Iik7ICAgICAvLyROT04tTkxTLTEkCi0gICAgcmV0dXJuIChJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5KWZhY3Rvcnk7IAotICB9Ci0gIAotICBwdWJsaWMgQ29ubmVjdGFibGVFZGl0UGFydCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgR2VuZXJpY0dyb3VwRmlndXJlIGZpZ3VyZSA9IG5ldyBHZW5lcmljR3JvdXBGaWd1cmUoKTsKLSAgICByZXR1cm4gZmlndXJlOwotICB9Ci0KLSAgcHVibGljIFhTRENvbmNyZXRlQ29tcG9uZW50IGdldFhTRENvbmNyZXRlQ29tcG9uZW50KCkKLSAgewotICAgIHJldHVybiAoWFNEQ29uY3JldGVDb21wb25lbnQpKChYU0RCYXNlQWRhcHRlcilnZXRNb2RlbCgpKS5nZXRUYXJnZXQoKTsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0Q29ubmVjdGlvbkZpZ3VyZXMoKQotICB7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25GaWd1cmVzOwotICB9Ci0gIAotICBwdWJsaWMgYWJzdHJhY3QgUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKEJhc2VFZGl0UGFydCBjaGlsZCk7Ci0gIAotICBwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpCi0gIHsKLSAgICBzdXBlci5hY3RpdmF0ZSgpOwotICAgIGFjdGl2YXRlQ29ubmVjdGlvbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVDb25uZWN0aW9uKCkKLSAgewotICAgIGlmIChjb25uZWN0aW9uRmlndXJlcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBCYXNlRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIEJhc2VFZGl0UGFydCBnID0gKEJhc2VFZGl0UGFydCkgbzsKLSAgICAgICAgUmVmZXJlbmNlQ29ubmVjdGlvbiBmaWd1cmUgPSBjcmVhdGVDb25uZWN0aW9uRmlndXJlKGcpOwotICAgICAgICBjb25uZWN0aW9uRmlndXJlcy5hZGQoZmlndXJlKTsKLSAgICAgICAgZmlndXJlLnNldFBvaW50cyhmaWd1cmUuZ2V0UG9pbnRzKCkpOwotCi0gICAgICAgIGdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpLmFkZChmaWd1cmUpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gIHsKLSAgICBzdXBlci5kZWFjdGl2YXRlKCk7Ci0gICAgZGVhY3RpdmF0ZUNvbm5lY3Rpb24oKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRlYWN0aXZhdGVDb25uZWN0aW9uKCkKLSAgewotICAgIC8vIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uLCByZW1vdmUgaXQKLSAgICBSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GaWd1cmU7Ci0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmVzICE9IG51bGwgJiYgIWNvbm5lY3Rpb25GaWd1cmVzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25uZWN0aW9uRmlndXJlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUgPSAoUmVmZXJlbmNlQ29ubmVjdGlvbikgaS5uZXh0KCk7Ci0KLSAgICAgICAgaWYgKGdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpLmdldENoaWxkcmVuKCkuY29udGFpbnMoY29ubmVjdGlvbkZpZ3VyZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRMYXllcihMYXllckNvbnN0YW50cy5DT05ORUNUSU9OX0xBWUVSKS5yZW1vdmUoY29ubmVjdGlvbkZpZ3VyZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNvbm5lY3Rpb25GaWd1cmVzID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLSAgICByZWZyZXNoQ29ubmVjdGlvbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENvbm5lY3Rpb24oKQotICB7Ci0gICAgaWYgKCFpc0FjdGl2ZSgpKQotICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmVzID09IG51bGwgfHwgY29ubmVjdGlvbkZpZ3VyZXMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGFjdGl2YXRlQ29ubmVjdGlvbigpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZGVhY3RpdmF0ZUNvbm5lY3Rpb24oKTsKLSAgICAgIGFjdGl2YXRlQ29ubmVjdGlvbigpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlOwotICAgIGlmIChjb25uZWN0aW9uRmlndXJlcyAhPSBudWxsICYmICFjb25uZWN0aW9uRmlndXJlcy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gY29ubmVjdGlvbkZpZ3VyZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBjb25uZWN0aW9uRmlndXJlID0gKFJlZmVyZW5jZUNvbm5lY3Rpb24pIGkubmV4dCgpOwotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodCh0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgR2VuZXJpY0dyb3VwRmlndXJlIGZpZ3VyZSA9IChHZW5lcmljR3JvdXBGaWd1cmUpZ2V0RmlndXJlKCk7Ci0gICAgZmlndXJlLmdldEljb25GaWd1cmUoKS5zZXRNb2RlKENlbnRlcmVkSWNvbkZpZ3VyZS5TRUxFQ1RFRCk7Ci0gICAgZmlndXJlLmdldEljb25GaWd1cmUoKS5yZWZyZXNoKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotICAgIFJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZTsKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZXMgIT0gbnVsbCAmJiAhY29ubmVjdGlvbkZpZ3VyZXMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbm5lY3Rpb25GaWd1cmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZSA9IChSZWZlcmVuY2VDb25uZWN0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotICAgICAgfQotICAgIH0KLSAgICBHZW5lcmljR3JvdXBGaWd1cmUgZmlndXJlID0gKEdlbmVyaWNHcm91cEZpZ3VyZSlnZXRGaWd1cmUoKTsKLSAgICBmaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnNldE1vZGUoQ2VudGVyZWRJY29uRmlndXJlLk5PUk1BTCk7Ci0gICAgZmlndXJlLmdldEljb25GaWd1cmUoKS5yZWZyZXNoKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgR2VuZXJpY0dyb3VwRmlndXJlIGZpZ3VyZSA9IChHZW5lcmljR3JvdXBGaWd1cmUpZ2V0RmlndXJlKCk7Ci0gICAgZmlndXJlLmdldEljb25GaWd1cmUoKS5yZWZyZXNoKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3IEFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeSgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkKLSAgewotICAgIElGaWd1cmUgY2hpbGQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKTsKLSAgICBnZXRDb250ZW50UGFuZSgpLmFkZChjaGlsZCwgaW5kZXgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkKLSAgewotICAgIElGaWd1cmUgY2hpbGQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKTsKLSAgICBnZXRDb250ZW50UGFuZSgpLnJlbW92ZShjaGlsZCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiAoKEdlbmVyaWNHcm91cEZpZ3VyZSlnZXRGaWd1cmUoKSkuZ2V0Q29udGVudEZpZ3VyZSgpOwotICB9Ci0KLSAgcHVibGljIEZpZ3VyZSBnZXRUYXJnZXRGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuICgoR2VuZXJpY0dyb3VwRmlndXJlKWdldEZpZ3VyZSgpKS5nZXRUYXJnZXRGaWd1cmUoKTsKLSAgfQotICAKLSAgcHVibGljIEVkaXRQYXJ0IGRvR2V0UmVsYXRpdmVFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5XRVNUKQotICAgIHsKLSAgICAgIGlmIChnZXRQYXJlbnQoKSBpbnN0YW5jZW9mIENvbm5lY3RhYmxlRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldFBhcmVudCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSB0aGlzOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuRUFTVCkKLSAgICB7ICAgIAotICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydC5nZXRDaGlsZHJlbigpLmdldCgwKTsKLSAgICAgIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQgdGFyZ2V0ID0gbnVsbDsKLSAgICAgIGJvb2xlYW4gZm91bmRTZWxlY3RhYmxlR3JvdXAgPSBmYWxzZTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3VuZFNlbGVjdGFibGVHcm91cCA9IHRydWU7Ci0gICAgICAgICAgcmVzdWx0ID0gY2hpbGQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICB0YXJnZXQgPSAoVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkgcmVzdWx0OwotICAgICAgfQotICAgICAgaWYgKCFmb3VuZFNlbGVjdGFibGVHcm91cCAmJiB0YXJnZXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgcGFyZW50ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgIHdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIENvbXBhcnRtZW50RWRpdFBhcnQpKQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcGFyZW50LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgIEVkaXRQYXJ0IGNoaWxkID0gKEVkaXRQYXJ0KSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBCYXNlRmllbGRFZGl0UGFydCAmJiAhKGNoaWxkIGluc3RhbmNlb2YgU3BhY2VGaWxsZXJGb3JGaWVsZEVkaXRQYXJ0KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBCYXNlRmllbGRFZGl0UGFydCBmaWVsZCA9IChCYXNlRmllbGRFZGl0UGFydCkgY2hpbGQ7Ci0gICAgICAgICAgICBpZiAoZmllbGQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCkueSA8IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5ib3R0b20oKSAmJgotICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpLnkgPiB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWRpdFBhcnQ7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LklOX1RPX0ZJUlNUX0NISUxEKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChFZGl0UGFydCkgZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5nZXQoMCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9Nb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMWZmOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9Nb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuR2VuZXJpY0dyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIE1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQgZXh0ZW5kcyBDb25uZWN0YWJsZUVkaXRQYXJ0Ci17Ci0gIEdlbmVyaWNHcm91cEZpZ3VyZSBmaWd1cmU7Ci0gIAotICBwdWJsaWMgTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIGZpZ3VyZSA9IG5ldyBHZW5lcmljR3JvdXBGaWd1cmUoKTsKLSAgICByZXR1cm4gZmlndXJlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcilnZXRNb2RlbCgpOwotICAgIGZpZ3VyZS5nZXRJY29uRmlndXJlKCkuaW1hZ2UgPSBhZGFwdGVyLmdldEltYWdlKCk7Ci0KLSAgICBHZW5lcmljR3JvdXBGaWd1cmUgZ3JvdXBGaWd1cmUgPSAoR2VuZXJpY0dyb3VwRmlndXJlKWdldEZpZ3VyZSgpOwotICAgIFN0cmluZyBub2RlTmFtZSA9ICIiOwotICAgIAotICAgIC8vIFRPRE86IGNvbW1tb24gdGhpcyB1cCB3aXRoIE1vZGVsR3JvdXBFZGl0UGFydCwgWFNEUGFydGljbGVBZGFwdGVyJ3MgY29kZQotICAgIAotICAgIC8vIC0yIG1lYW5zIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IChzbyB0aGUgZGVmYXVsdCBpcyAxKQotICAgIGludCBtaW5PY2N1cnMgPSBhZGFwdGVyLmdldE1pbk9jY3VycygpOwotICAgIGludCBtYXhPY2N1cnMgPSBhZGFwdGVyLmdldE1heE9jY3VycygpOwotICAgIFN0cmluZyBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgaWYgKG1pbk9jY3VycyA9PSAtMyAmJiBtYXhPY2N1cnMgPT0gLTMpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBub2RlTmFtZTsKLSAgICAgIGdyb3VwRmlndXJlLnNldFRleHQobnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1pbk9jY3VycyA9PSAwICYmIChtYXhPY2N1cnMgPT0gLTIgfHwgbWF4T2NjdXJzID09IDEpKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gbm9kZU5hbWUgKyAiIFswLi4xXSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGdyb3VwRmlndXJlLnNldFRleHQoIjAuLjEiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKG1pbk9jY3VycyA9PSAxICYmIG1heE9jY3VycyA9PSAxKSB8fAotICAgICAgICAgICAgIChtaW5PY2N1cnMgPT0gLTIgJiYgbWF4T2NjdXJzID09IDEpIHx8Ci0gICAgICAgICAgICAgKG1pbk9jY3VycyA9PSAxICYmIG1heE9jY3VycyA9PSAtMikpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBub2RlTmFtZSArICIgWzEuLjFdIjsgLy8kTk9OLU5MUy0xJAotICAgICAgZ3JvdXBGaWd1cmUuc2V0VGV4dCgiMS4uMSIpOwotICAgIH0KLSAgICBlbHNlIGlmIChtaW5PY2N1cnMgPT0gLTIgJiYgbWF4T2NjdXJzID09IC0yKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gbm9kZU5hbWU7Ci0gICAgICBncm91cEZpZ3VyZS5zZXRUZXh0KG51bGwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKG1heE9jY3VycyA9PSAtMikgbWF4T2NjdXJzID0gMTsKLSAgICAgIFN0cmluZyBtYXhTeW1ib2wgPSBtYXhPY2N1cnMgPT0gLTEgPyAiKiIgOiAiIiArIG1heE9jY3VyczsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAKLSAgICAgIFN0cmluZyBtaW5TeW1ib2wgPSBtaW5PY2N1cnMgPT0gLTIgPyAiMSIgOiAiIiArIG1pbk9jY3VyczsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9IG5vZGVOYW1lICsgIiBbIiArIG1pblN5bWJvbCArICIuLiIgKyBtYXhTeW1ib2wgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICBncm91cEZpZ3VyZS5zZXRUZXh0KG1pblN5bWJvbCArICIuLiIgKyBtYXhTeW1ib2wpOwotICAgIH0KLQotICAgIGdyb3VwRmlndXJlLmdldEljb25GaWd1cmUoKS5zZXRUb29sVGlwVGV4dChvY2N1cmVuY2VEZXNjcmlwdGlvbik7Ci0gICAgZ3JvdXBGaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnJlcGFpbnQoKTsKLQotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpZ2V0TW9kZWwoKTsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBncm91cERlZiA9ICgoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGFkYXB0ZXIuZ2V0VGFyZ2V0KCkpOwotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHJlc29sdmVkR3JvdXBEZWYgPSBncm91cERlZi5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwID0gcmVzb2x2ZWRHcm91cERlZi5nZXRNb2RlbEdyb3VwKCk7Ci0gICAgCi0gICAgQXJyYXlMaXN0IGxpc3RPZlZpc2libGVHcm91cFJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChFZGl0UGFydCBlcCA9IGdldFBhcmVudCgpOyBlcCAhPSBudWxsOyApCi0gICAgewotICAgICAgT2JqZWN0IG9iamVjdCA9IGVwLmdldE1vZGVsKCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKQotICAgICAgewotICAgICAgICBPYmplY3QgbW9kZWwgPSAoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcilvYmplY3QpLmdldFRhcmdldCgpOwotICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGxpc3RPZlZpc2libGVHcm91cFJlZnMuYWRkKCgoWFNETW9kZWxHcm91cERlZmluaXRpb24pbW9kZWwpLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKSk7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlcCA9IGVwLmdldFBhcmVudCgpOwotICAgIH0KLSAgICAKLSAgICBib29sZWFuIGlzQ3ljbGljID0gKGxpc3RPZlZpc2libGVHcm91cFJlZnMuY29udGFpbnMocmVzb2x2ZWRHcm91cERlZikpOwotICAgIAotICAgIGlmICh4c2RNb2RlbEdyb3VwICE9IG51bGwgJiYgIWlzQ3ljbGljKQotICAgICAgbGlzdC5hZGQoWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh4c2RNb2RlbEdyb3VwKSk7Ci0gICAgCi0gICAgaWYgKGlzQ3ljbGljKQotICAgICAgbGlzdC5hZGQobmV3IFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcihudWxsKSk7Ci0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBSZWZlcmVuY2VDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoQmFzZUVkaXRQYXJ0IGNoaWxkKQotICB7Ci0gICAgUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlID0gbmV3IFJlZmVyZW5jZUNvbm5lY3Rpb24oKTsKLQotICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoKChHZW5lcmljR3JvdXBGaWd1cmUpZ2V0RmlndXJlKCkpLmdldEljb25GaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLlJJR0hULCAwLCAwKSk7Ci0gICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTW9kZWxHcm91cEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoKChNb2RlbEdyb3VwRWRpdFBhcnQpIGNoaWxkKS5nZXRUYXJnZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkxFRlQsIDAsIDApKTsKLSAgICB9Ci0gICAgZWxzZSAvLyBmb3IgdGhlIGN5Y2xpYyBncm91cCByZWZlcmVuY2VzCi0gICAgewotICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRUYXJnZXRBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcigoKEdlbmVyaWNHcm91cEZpZ3VyZSkgZ2V0RmlndXJlKCkpLmdldEljb25GaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLlJJR0hULCAwLCAwKSk7Ci0gICAgfQotICAgIAotICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KGZhbHNlKTsKLQotICAgIHJldHVybiBjb25uZWN0aW9uRmlndXJlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL01vZGVsR3JvdXBFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9Nb2RlbEdyb3VwRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1OTM5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL01vZGVsR3JvdXBFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRE1vZGVsR3JvdXBBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuR2VuZXJpY0dyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuTW9kZWxHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEdyb3VwRWRpdFBhcnQgZXh0ZW5kcyBDb25uZWN0YWJsZUVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RXh0ZW5kZWRGaWd1cmVGYWN0b3J5KCkuY3JlYXRlTW9kZWxHcm91cEZpZ3VyZShnZXRNb2RlbCgpKTsKLSAgfQotICAKLSAgcHVibGljIFhTRFBhcnRpY2xlIGdldFhTRFBhcnRpY2xlKCkKLSAgewotICAgIE9iamVjdCBvID0gZ2V0WFNETW9kZWxHcm91cCgpLmdldENvbnRhaW5lcigpOwotICAgIHJldHVybiAobyBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKSA/IChYU0RQYXJ0aWNsZSkgbyA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgWFNETW9kZWxHcm91cCBnZXRYU0RNb2RlbEdyb3VwKCkKLSAgewotICAgIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cEFkYXB0ZXIpCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cEFkYXB0ZXIgYWRhcHRlciA9IChYU0RNb2RlbEdyb3VwQWRhcHRlcikgZ2V0TW9kZWwoKTsKLSAgICAgIHJldHVybiAoWFNETW9kZWxHcm91cCkgYWRhcHRlci5nZXRUYXJnZXQoKTsKLSAgICB9Ci0vLyAgICBlbHNlIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLS8vICAgIHsKLS8vICAgICAgcmV0dXJuIChYU0RNb2RlbEdyb3VwKSBnZXRNb2RlbCgpOwotLy8gICAgfQotICAgIHJldHVybiBudWxsOwotCi0gIH0KLQotICAKLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIGJvb2xlYW4gaXNSZWFkT25seSA9IGZhbHNlOwotICAgIEdlbmVyaWNHcm91cEZpZ3VyZSBtb2RlbEdyb3VwRmlndXJlID0gKEdlbmVyaWNHcm91cEZpZ3VyZSlnZXRGaWd1cmUoKTsKLSAgICAKLSAgICBYU0RNb2RlbEdyb3VwQWRhcHRlciBhZGFwdGVyID0gKFhTRE1vZGVsR3JvdXBBZGFwdGVyKSBnZXRNb2RlbCgpOwotICAgIGlzUmVhZE9ubHkgPSBhZGFwdGVyLmlzUmVhZE9ubHkoKTsKLSAgICAKLSAgICBTdHJpbmcgbm9kZU5hbWUgPSAiIjsKLSAgICBJbWFnZSBpbWFnZTsKLSAgICBzd2l0Y2ggKGdldFhTRE1vZGVsR3JvdXAoKS5nZXRDb21wb3NpdG9yKCkuZ2V0VmFsdWUoKSkKLSAgICB7Ci0gICAgICBjYXNlIFhTRENvbXBvc2l0b3IuQUxMOgotICAgICAgewotICAgICAgICBpbWFnZSA9IGlzUmVhZE9ubHkgPyBNb2RlbEdyb3VwRmlndXJlLkFMTF9JQ09OX0RJU0FCTEVEX0lNQUdFIDpNb2RlbEdyb3VwRmlndXJlLkFMTF9JQ09OX0lNQUdFOwotICAgICAgICBtb2RlbEdyb3VwRmlndXJlLmdldEljb25GaWd1cmUoKS5pbWFnZSA9IFhTRENvbW1vblVJVXRpbHMuZ2V0VXBkYXRlZEltYWdlKChYU0RDb25jcmV0ZUNvbXBvbmVudClhZGFwdGVyLmdldFRhcmdldCgpLCBpbWFnZSwgaXNSZWFkT25seSk7Ci0gICAgICAgIG5vZGVOYW1lID0gWFNEQ29uc3RhbnRzLkFMTF9FTEVNRU5UX1RBRzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFhTRENvbXBvc2l0b3IuQ0hPSUNFOgotICAgICAgewotICAgICAgICBpbWFnZSA9IGlzUmVhZE9ubHkgPyBNb2RlbEdyb3VwRmlndXJlLkNIT0lDRV9JQ09OX0RJU0FCTEVEX0lNQUdFIDogTW9kZWxHcm91cEZpZ3VyZS5DSE9JQ0VfSUNPTl9JTUFHRTsKLSAgICAgICAgbW9kZWxHcm91cEZpZ3VyZS5nZXRJY29uRmlndXJlKCkuaW1hZ2UgPSBYU0RDb21tb25VSVV0aWxzLmdldFVwZGF0ZWRJbWFnZSgoWFNEQ29uY3JldGVDb21wb25lbnQpYWRhcHRlci5nZXRUYXJnZXQoKSwgaW1hZ2UsIGlzUmVhZE9ubHkpOyAKLSAgICAgICAgbm9kZU5hbWUgPSBYU0RDb25zdGFudHMuQ0hPSUNFX0VMRU1FTlRfVEFHOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgWFNEQ29tcG9zaXRvci5TRVFVRU5DRToKLSAgICAgIHsKLSAgICAgICAgaW1hZ2UgPSBpc1JlYWRPbmx5ID8gTW9kZWxHcm91cEZpZ3VyZS5TRVFVRU5DRV9JQ09OX0RJU0FCTEVEX0lNQUdFIDogTW9kZWxHcm91cEZpZ3VyZS5TRVFVRU5DRV9JQ09OX0lNQUdFOwotICAgICAgICBtb2RlbEdyb3VwRmlndXJlLmdldEljb25GaWd1cmUoKS5pbWFnZSA9IFhTRENvbW1vblVJVXRpbHMuZ2V0VXBkYXRlZEltYWdlKChYU0RDb25jcmV0ZUNvbXBvbmVudClhZGFwdGVyLmdldFRhcmdldCgpLCBpbWFnZSwgaXNSZWFkT25seSk7IAotICAgICAgICBub2RlTmFtZSA9IFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIAotLy8gICAgU3RyaW5nIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gYWRhcHRlci5nZXROYW1lQW5ub3RhdGlvblRvb2xUaXBTdHJpbmcoKTsKLS8vICAgIG1vZGVsR3JvdXBGaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnNldFRvb2xUaXAob2NjdXJlbmNlRGVzY3JpcHRpb24pOwotCi0gICAgLy8gVE9ETzogY29tbW1vbiB0aGlzIHVwIHdpdGggWFNEUGFydGljbGVBZGFwdGVyJ3MgY29kZQotICAgIAotICAgIC8vIC0yIG1lYW5zIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IChzbyB0aGUgZGVmYXVsdCBpcyAxKQotICAgIGludCBtaW5PY2N1cnMgPSBhZGFwdGVyLmdldE1pbk9jY3VycygpOwotICAgIGludCBtYXhPY2N1cnMgPSBhZGFwdGVyLmdldE1heE9jY3VycygpOwotICAgIFN0cmluZyBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgaWYgKG1pbk9jY3VycyA9PSAtMyAmJiBtYXhPY2N1cnMgPT0gLTMpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBub2RlTmFtZTsKLSAgICAgIG1vZGVsR3JvdXBGaWd1cmUuc2V0VGV4dChudWxsKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobWluT2NjdXJzID09IDAgJiYgKG1heE9jY3VycyA9PSAtMiB8fCBtYXhPY2N1cnMgPT0gMSkpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBub2RlTmFtZSArICIgWzAuLjFdIjsgLy8kTk9OLU5MUy0xJAotICAgICAgbW9kZWxHcm91cEZpZ3VyZS5zZXRUZXh0KCIwLi4xIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKChtaW5PY2N1cnMgPT0gMSAmJiBtYXhPY2N1cnMgPT0gMSkgfHwKLSAgICAgICAgICAgICAobWluT2NjdXJzID09IC0yICYmIG1heE9jY3VycyA9PSAxKSB8fAotICAgICAgICAgICAgIChtaW5PY2N1cnMgPT0gMSAmJiBtYXhPY2N1cnMgPT0gLTIpKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gbm9kZU5hbWUgKyAiIFsxLi4xXSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG1vZGVsR3JvdXBGaWd1cmUuc2V0VGV4dCgiMS4uMSIpOwotICAgIH0KLSAgICBlbHNlIGlmIChtaW5PY2N1cnMgPT0gLTIgJiYgbWF4T2NjdXJzID09IC0yKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gbm9kZU5hbWU7Ci0gICAgICBtb2RlbEdyb3VwRmlndXJlLnNldFRleHQobnVsbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobWF4T2NjdXJzID09IC0yKSBtYXhPY2N1cnMgPSAxOwotICAgICAgU3RyaW5nIG1heFN5bWJvbCA9IG1heE9jY3VycyA9PSAtMSA/ICIqIiA6ICIiICsgbWF4T2NjdXJzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIAotICAgICAgU3RyaW5nIG1pblN5bWJvbCA9IG1pbk9jY3VycyA9PSAtMiA/ICIxIiA6ICIiICsgbWluT2NjdXJzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gbm9kZU5hbWUgKyAiIFsiICsgbWluU3ltYm9sICsgIi4uIiArIG1heFN5bWJvbCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIG1vZGVsR3JvdXBGaWd1cmUuc2V0VGV4dChtaW5TeW1ib2wgKyAiLi4iICsgbWF4U3ltYm9sKTsKLSAgICB9Ci0KLSAgICBtb2RlbEdyb3VwRmlndXJlLmdldEljb25GaWd1cmUoKS5zZXRUb29sVGlwVGV4dChvY2N1cmVuY2VEZXNjcmlwdGlvbik7Ci0gICAgbW9kZWxHcm91cEZpZ3VyZS5nZXRJY29uRmlndXJlKCkucmVwYWludCgpOwotCi0gICAgcmVmcmVzaENvbm5lY3Rpb24oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0vLyAgICBYU0RNb2RlbEdyb3VwQWRhcHRlciBtb2RlbEdyb3VwQWRhcHRlciA9IChYU0RNb2RlbEdyb3VwQWRhcHRlcilnZXRNb2RlbCgpOwotLy8gICAgQXJyYXlMaXN0IGNoID0gbmV3IEFycmF5TGlzdCgpOwotLy8gICAgSVRyZWVFbGVtZW50IFtdIHRyZWUgPSBtb2RlbEdyb3VwQWRhcHRlci5nZXRDaGlsZHJlbigpOwotLy8gICAgaW50IGxlbmd0aCA9IHRyZWUubGVuZ3RoOwotLy8gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLS8vICAgIHsKLS8vICAgICAgY2guYWRkKHRyZWVbaV0pOwotLy8gICAgfQotCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9IGdldFhTRE1vZGVsR3JvdXAoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFBhcnRpY2xlIG5leHQgPSAoWFNEUGFydGljbGUpIGkubmV4dCgpOwotICAgICAgaWYgKG5leHQuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgbmV4dC5nZXRDb250ZW50KCk7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICAgICAgbGlzdC5hZGQobmV3IFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcigoWFNEQmFzZUFkYXB0ZXIpYWRhcHRlcikpOwotICAgICAgfQotICAgICAgaWYgKG5leHQuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGRlZiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgbmV4dC5nZXRDb250ZW50KCk7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZGVmKTsKLSAgICAgICAgbGlzdC5hZGQoYWRhcHRlcik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuZXh0LmdldFRlcm0oKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICB7Ci0gICAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKSBuZXh0LmdldFRlcm0oKTsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChtb2RlbEdyb3VwKTsKLSAgICAgICAgbGlzdC5hZGQoYWRhcHRlcik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuZXh0LmdldFRlcm0oKSBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgICAgewotICAgICAgICBYU0RXaWxkY2FyZCB3aWxkQ2FyZCA9IChYU0RXaWxkY2FyZCluZXh0LmdldFRlcm0oKTsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh3aWxkQ2FyZCk7Ci0gICAgICAgIGxpc3QuYWRkKG5ldyBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIoKFhTREJhc2VBZGFwdGVyKWFkYXB0ZXIpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobGlzdC5zaXplKCkgPT0gMCkKLSAgICAgIGxpc3QuYWRkKG5ldyBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIobnVsbCkpOwotCi0gICAgcmV0dXJuIGxpc3Q7Ci0vLyAgICByZXR1cm4gY2g7Ci0gIH0KLQotICBwdWJsaWMgUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKEJhc2VFZGl0UGFydCBjaGlsZCkKLSAgewotICAgIFJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZSA9IG5ldyBSZWZlcmVuY2VDb25uZWN0aW9uKCk7Ci0gICAgR2VuZXJpY0dyb3VwRmlndXJlIG1vZGVsR3JvdXBGaWd1cmUgPSAoR2VuZXJpY0dyb3VwRmlndXJlKWdldEZpZ3VyZSgpOwotICAKLSAgICBjb25uZWN0aW9uRmlndXJlLnNldFNvdXJjZUFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKG1vZGVsR3JvdXBGaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuUklHSFQsIDAsIDApKTsKLQotICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1vZGVsR3JvdXBFZGl0UGFydCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKCgoTW9kZWxHcm91cEVkaXRQYXJ0KSBjaGlsZCkuZ2V0VGFyZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5MRUZULCAwLCAwKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkKLSAgICB7Ci0gICAgICBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0IGVsZW0gPSAoVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkgY2hpbGQ7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKGVsZW0uZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5MRUZULCAwLCAxKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydCkKLSAgICB7Ci0gICAgICBNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0IGVsZW0gPSAoTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydCkgY2hpbGQ7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKGVsZW0uZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5MRUZULCAwLCAxKSk7Ci0gICAgfQotICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KGZhbHNlKTsKLSAgICByZXR1cm4gY29ubmVjdGlvbkZpZ3VyZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRSZWFkZXJUZXh0KCkKLSAgewotCSAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwID0gZ2V0WFNETW9kZWxHcm91cCgpOwotCSAgcmV0dXJuICB4c2RNb2RlbEdyb3VwLmdldENvbXBvc2l0b3IoKS5nZXROYW1lKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvUmVmZXJlbmNlQ29ubmVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9SZWZlcmVuY2VDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNjNkYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9SZWZlcmVuY2VDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uUm91dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZUNvbm5lY3Rpb24gZXh0ZW5kcyBQb2x5bGluZUNvbm5lY3Rpb24KLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGlnaGxpZ2h0ID0gZmFsc2U7Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb2xvciBhY3RpdmVDb25uZWN0aW9uID0gQ29sb3JDb25zdGFudHMuYmxhY2s7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgaW5hY3RpdmVDb25uZWN0aW9uID0gbmV3IENvbG9yKG51bGwsIDE5OCwgMTk1LCAxOTgpOwotCi0gIHB1YmxpYyBSZWZlcmVuY2VDb25uZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc2V0Q29ubmVjdGlvblJvdXRlcihuZXcgWFNETW9kZWxHcm91cFJvdXRlcigpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25Sb3V0ZXIoQ29ubmVjdGlvblJvdXRlciBjcikKLSAgewotICAgIGlmIChjciAhPSBudWxsICYmIGdldENvbm5lY3Rpb25Sb3V0ZXIoKSAhPSBudWxsICYmICEoZ2V0Q29ubmVjdGlvblJvdXRlcigpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cFJvdXRlcikpCi0gICAgICBzdXBlci5zZXRDb25uZWN0aW9uUm91dGVyKGNyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzSGlnaGxpZ2h0ZWQoKQotICB7Ci0gICAgcmV0dXJuIGhpZ2hsaWdodDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhpZ2hsaWdodChib29sZWFuIGhpZ2hsaWdodCkKLSAgewotICAgIHRoaXMuaGlnaGxpZ2h0ID0gaGlnaGxpZ2h0OwotICAgIAotICAgIGJvb2xlYW4gaGlnaENvbnRyYXN0ID0gZmFsc2U7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaGlnaENvbnRyYXN0ID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0SGlnaENvbnRyYXN0KCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGlmIChoaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgc2V0Rm9yZWdyb3VuZENvbG9yKGhpZ2hsaWdodCA/IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCkgOiBDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0Rm9yZWdyb3VuZENvbG9yKGhpZ2hsaWdodCA/IGFjdGl2ZUNvbm5lY3Rpb24gOiBpbmFjdGl2ZUNvbm5lY3Rpb24pOwotICAgIH0KLSAgICBzZXRPcGFxdWUoaGlnaGxpZ2h0KTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1NwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9TcGFjZUZpbGxlckZvckZpZWxkRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmNDRlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1NwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgU3BhY2VGaWxsZXJGb3JGaWVsZEVkaXRQYXJ0IGV4dGVuZHMgQmFzZUZpZWxkRWRpdFBhcnQKLXsKLSAgTGFiZWwgc3BhY2U7Ci0gIHB1YmxpYyBTcGFjZUZpbGxlckZvckZpZWxkRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBzcGFjZSA9IG5ldyBMYWJlbCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBzcGFjZS5zZXRJY29uKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvRG90LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHNwYWNlLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDMsIDAsIDMsIDApKTsKLSAgICByZXR1cm4gc3BhY2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1RhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWQxYThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuU3BhY2luZ0ZpZ3VyZTsKLQotcHVibGljIGNsYXNzIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsKLSAgcHVibGljIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIFNwYWNpbmdGaWd1cmUgZmlndXJlOwotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBmaWd1cmUgPSBuZXcgU3BhY2luZ0ZpZ3VyZSgpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RhYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9Ub3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1RvcExldmVsQ29tcG9uZW50RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwNDJmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1RvcExldmVsQ29tcG9uZW50RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRHJhZ1RyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuQWJzdHJhY3RFZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuSUF1dG9EaXJlY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuSU5hbWVkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Sb290Q29udGVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUZlZWRiYWNrSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFREaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuSUFEVFVwZGF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5TaW1wbGVEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuRmllbGRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llcy5HcmFwaE5vZGVEcmFnVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llcy5Ub3BMZXZlbENvbXBvbmVudExhYmVsQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzLlRvcExldmVsTmFtZURpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuSHlwZXJMaW5rTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24ubGF5b3V0cy5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbHMuT3Blbk9uU2VsZWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotCi1wdWJsaWMgY2xhc3MgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydCBpbXBsZW1lbnRzIElGZWVkYmFja0hhbmRsZXIsIElOYW1lZEVkaXRQYXJ0LCBJQXV0b0RpcmVjdEVkaXQKLXsKLSAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOwotICAvLyBwcm90ZWN0ZWQgTGFiZWwgYXJyb3dMYWJlbDsKLSAgcHJvdGVjdGVkIEZpZ3VyZSBsYWJlbEhvbGRlciA9IG5ldyBGaWd1cmUoKTsKLSAgcHJvdGVjdGVkIFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeTsKLSAgcHJvdGVjdGVkIEFEVERpcmVjdEVkaXRQb2xpY3kgYWR0RGlyZWN0RWRpdFBvbGljeSA9IG5ldyBBRFREaXJlY3RFZGl0UG9saWN5KCk7Ci0gIHByb3RlY3RlZCBTaW1wbGVEaXJlY3RFZGl0UG9saWN5IHNpbXBsZURpcmVjdEVkaXRQb2xpY3kgPSBuZXcgU2ltcGxlRGlyZWN0RWRpdFBvbGljeSgpOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlYWRPbmx5OwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGVkOwotICBwcml2YXRlIEZvbnQgaXRhbGljRm9udDsKLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgRmlndXJlIHR5cGVHcm91cCA9IG5ldyBGaWd1cmUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGdyYXBoaWNzKQotICAgICAgewotICAgICAgICBzdXBlci5wYWludChncmFwaGljcyk7Ci0gICAgICAgIGlmIChoYXNGb2N1cykKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotICAgICAgICAgICAgUmVjdGFuZ2xlIHIgPSBnZXRCb3VuZHMoKTsKLSAgICAgICAgICAgIGdyYXBoaWNzLnNldFhPUk1vZGUodHJ1ZSk7Ci0gICAgICAgICAgICBncmFwaGljcy5kcmF3Rm9jdXMoci54LCByLnkgKyAxLCByLndpZHRoIC0gMSwgci5oZWlnaHQgLSAyKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZmluYWxseQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotICAgIH07Ci0gICAgdHlwZUdyb3VwLnNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKSk7Ci0KLSAgICBsYWJlbEhvbGRlciA9IG5ldyBGaWd1cmUoKTsKLSAgICBGaWxsTGF5b3V0IGZpbGxMYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOwotICAgIGxhYmVsSG9sZGVyLnNldExheW91dE1hbmFnZXIoZmlsbExheW91dCk7Ci0gICAgdHlwZUdyb3VwLmFkZChsYWJlbEhvbGRlcik7Ci0KLSAgICBsYWJlbCA9IG5ldyBIeXBlckxpbmtMYWJlbCgpOwotICAgIGxhYmVsLnNldE9wYXF1ZSh0cnVlKTsKLSAgICBsYWJlbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigxLCAyLCAyLCA1KSk7Ci0gICAgaWYgKCFpc0hpZ2hDb250cmFzdCkKLSAgICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgbGFiZWxIb2xkZXIuYWRkKGxhYmVsKTsKLQotICAgIHJldHVybiB0eXBlR3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotICAgIGlmIChpdGFsaWNGb250ICE9IG51bGwpCi0gICAgewotICAgICAgaXRhbGljRm9udC5kaXNwb3NlKCk7Ci0gICAgICBpdGFsaWNGb250ID0gbnVsbDsKLSAgICB9Ci0gICAgc3VwZXIuZGVhY3RpdmF0ZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgWFNEQmFzZUFkYXB0ZXIgYWRhcHRlciA9IChYU0RCYXNlQWRhcHRlcikgZ2V0TW9kZWwoKTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGlzUmVhZE9ubHkgPSBhZGFwdGVyLmlzUmVhZE9ubHkoKTsKLSAgICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihjb21wdXRlTGFiZWxDb2xvcigpKTsKLSAgICAgIGxhYmVsLnNldFRleHQoYWRhcHRlci5nZXRUZXh0KCkpOwotICAgICAgSW1hZ2UgaW1hZ2UgPSBhZGFwdGVyLmdldEltYWdlKCk7Ci0gICAgICBpZiAoaW1hZ2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGFiZWwuc2V0SWNvbihYU0RDb21tb25VSVV0aWxzLmdldFVwZGF0ZWRJbWFnZSgoWFNEQ29uY3JldGVDb21wb25lbnQpIGFkYXB0ZXIuZ2V0VGFyZ2V0KCksIGltYWdlLCBpc1JlYWRPbmx5KSk7Ci0gICAgICB9Ci0gICAgICAvLyBhcnJvd0xhYmVsLnNldFZpc2libGUoQm9vbGVhbi5UUlVFLmVxdWFscyhhZGFwdGVyLmdldFByb3BlcnR5KGdldE1vZGVsKCksCi0gICAgICAvLyAiZHJpbGxEb3duIikpKTsKLSAgICAgIAotICAgICAgaWYgKGFkYXB0ZXIuaXNBYnN0cmFjdCgpKQotICAgICAgewotICAgICAgICBpZiAoaXRhbGljRm9udCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgRm9udCBmb250ID0gbGFiZWwuZ2V0Rm9udCgpOwotICAgICAgICAgIGl0YWxpY0ZvbnQgPSBnZXRJdGFsaWNGb250KGZvbnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGFsaWNGb250ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBsYWJlbC5zZXRGb250KGl0YWxpY0ZvbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGxhYmVsLnNldEZvbnQobGFiZWwuZ2V0UGFyZW50KCkuZ2V0Rm9udCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxhYmVsLnNldFRleHQoTWVzc2FnZXMuX1VJX0dSQVBIX1VOS05PV05fT0JKRUNUICsgZ2V0TW9kZWwoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAvLyBhcnJvd0xhYmVsLnNldFZpc2libGUoZmFsc2UpOwotICAgIH0KLQotICAgIGlmIChyZXNlbGVjdCkKLSAgICB7Ci0gICAgICBnZXRWaWV3ZXIoKS5zZWxlY3QodGhpcyk7Ci0gICAgICBzZXRSZXNlbGVjdChmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotICAKLSAgcHVibGljIEVkaXRQYXJ0IGRvR2V0UmVsYXRpdmVFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIHJldHVybiAoKEJhc2VFZGl0UGFydCl0aGlzLmdldFBhcmVudCgpKS5kb0dldFJlbGF0aXZlRWRpdFBhcnQoZWRpdFBhcnQsIGRpcmVjdGlvbik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgLy8gaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3Ci0gICAgLy8gTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpKTsKLSAgICAvLyBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSA9IG5ldyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwoKTsKLSAgICAvLyBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLAotICAgIC8vIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KTsKLQotICAgIFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCBwb2xpY3kgPSBuZXcgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgcG9saWN5KTsKLQotICAgIFNlbGVjdGlvbkVkaXRQb2xpY3kgZmVlZEJhY2tTZWxlY3Rpb25FZGl0UG9saWN5ID0gbmV3IFNlbGVjdGlvbkVkaXRQb2xpY3koKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEhvc3QoKTsKLSAgICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUZlZWRiYWNrSGFuZGxlcikKLSAgICAgICAgewotICAgICAgICAgICgoSUZlZWRiYWNrSGFuZGxlcikgZWRpdFBhcnQpLnJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0SG9zdCgpOwotICAgICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJRmVlZGJhY2tIYW5kbGVyKQotICAgICAgICB7Ci0gICAgICAgICAgKChJRmVlZGJhY2tIYW5kbGVyKSBlZGl0UGFydCkuYWRkRmVlZGJhY2soKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgZmVlZEJhY2tTZWxlY3Rpb25FZGl0UG9saWN5KTsKLQotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgYWR0RGlyZWN0RWRpdFBvbGljeSk7Ci0gIH0KLQotICBwdWJsaWMgQ29sb3IgY29tcHV0ZUxhYmVsQ29sb3IoKQotICB7Ci0gICAgQ29sb3IgY29sb3IgPSBDb2xvckNvbnN0YW50cy5ibGFjazsKLSAgICBpZiAoaXNIaWdoQ29udHJhc3QpCi0gICAgeyAKLSAgICAgIGNvbG9yID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNTZWxlY3RlZCkKLSAgICB7Ci0gICAgICBpZiAoaXNIaWdoQ29udHJhc3QpCi0gICAgICB7Ci0gICAgICAgIGNvbG9yID0gQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgCSAgaWYgKGlzUmVhZE9ubHkpCi0gICAgCSAgewotICAgIAkJICBjb2xvciA9IENvbG9yQ29uc3RhbnRzLmdyYXk7Ci0gICAgCSAgfQotICAgIAkgIGVsc2UKLSAgICAJICB7Ci0gICAgCQkgIGNvbG9yID0gQ29sb3JDb25zdGFudHMuYmxhY2s7Ci0gICAgCSAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGNvbG9yID0gQ29sb3JDb25zdGFudHMuZ3JheTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbG9yOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgaXNTZWxlY3RlZCA9IHRydWU7Ci0KLSAgICBpZiAoaXNIaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgbGFiZWxIb2xkZXIuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpc3RGb3JlZ3JvdW5kKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxhYmVsSG9sZGVyLnNldEJhY2tncm91bmRDb2xvcihGaWVsZEZpZ3VyZS5jZWxsQ29sb3IpOwotICAgIH0KLSAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoY29tcHV0ZUxhYmVsQ29sb3IoKSk7Ci0gICAgLy8gbGFiZWxIb2xkZXIuc2V0RmlsbCh0cnVlKTsKLQotICAgIGlmIChkb1Njcm9sbCkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUVkaXRQYXJ0IGNhdGVnb3J5RVAgPSAoQ2F0ZWdvcnlFZGl0UGFydCkgZ2V0UGFyZW50KCk7Ci0gICAgICBjYXRlZ29yeUVQLnNjcm9sbFRvKHRoaXMpOwotICAgICAgc2V0U2Nyb2xsKGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZG9TY3JvbGwgPSBmYWxzZTsKLQotICBwdWJsaWMgdm9pZCBzZXRTY3JvbGwoYm9vbGVhbiBkb1Njcm9sbCkKLSAgewotICAgIHRoaXMuZG9TY3JvbGwgPSBkb1Njcm9sbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotICAgIGlzU2VsZWN0ZWQgPSBmYWxzZTsKLSAgICBsYWJlbEhvbGRlci5zZXRCYWNrZ3JvdW5kQ29sb3IobnVsbCk7Ci0gICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbXB1dGVMYWJlbENvbG9yKCkpOwotICAgIC8vIGxhYmVsSG9sZGVyLnNldEZpbGwoZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgLy8gRG8gbm90IG9wZW4gb24gb3Igc2V0IGZvY3VzIG9uIGRpcmVjdCBlZGl0IHR5cGUgCi0gICAgaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX09QRU4pCi0gICAgewotCi0gICAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUdyYXBoRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoSUdyYXBoRWxlbWVudCltb2RlbCkuaXNGb2N1c0FsbG93ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0OwotICAgICAgICAgICAgUG9pbnQgcCA9IGxvY2F0aW9uUmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCi0gICAgICAgICAgICBpZiAoaGl0VGVzdChsYWJlbEhvbGRlciwgcCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBlcmZvcm1EcmlsbERvd25BY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0gICAgICAgIHsKLSAgICAgICAgICBMb2NhdGlvblJlcXVlc3QgbG9jYXRpb25SZXF1ZXN0ID0gKExvY2F0aW9uUmVxdWVzdCkgcmVxdWVzdDsKLSAgICAgICAgICBQb2ludCBwID0gbG9jYXRpb25SZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0KLSAgICAgICAgICBpZiAoaGl0VGVzdChsYWJlbEhvbGRlciwgcCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEU2NoZW1hRGlyZWN0aXZlIGRpciA9IChYU0RTY2hlbWFEaXJlY3RpdmUpKChYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKW1vZGVsKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9ICIiOwotICAgICAgICAgICAgLy8gZm9yY2UgbG9hZCBvZiBpbXBvcnRlZCBzY2hlbWEKLSAgICAgICAgICAgIGlmIChkaXIgaW5zdGFuY2VvZiBYU0RJbXBvcnRJbXBsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAoKFhTREltcG9ydEltcGwpZGlyKS5pbXBvcnRTY2hlbWEoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkaXIuZ2V0UmVzb2x2ZWRTY2hlbWEoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbiA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woZGlyLmdldFJlc29sdmVkU2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgIGlmIChzY2hlbWFMb2NhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT3Blbk9uU2VsZWN0aW9uSGVscGVyLm9wZW5YU0RFZGl0b3IoZGlyLmdldFJlc29sdmVkU2NoZW1hKCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoaXRUZXN0KElGaWd1cmUgdGFyZ2V0LCBQb2ludCBsb2NhdGlvbikKLSAgewotICAgIFJlY3RhbmdsZSBiID0gdGFyZ2V0LmdldEJvdW5kcygpLmdldENvcHkoKTsKLSAgICB0YXJnZXQudHJhbnNsYXRlVG9BYnNvbHV0ZShiKTsKLSAgICByZXR1cm4gYi5jb250YWlucyhsb2NhdGlvbik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRHJpbGxEb3duQWN0aW9uKCkKLSAgewotICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9ICgoQWJzdHJhY3RFZGl0UGFydFZpZXdlcikgZ2V0Vmlld2VyKCkpLmdldFJvb3RFZGl0UGFydCgpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFJvb3RDb250ZW50RWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gZ2V0RWRpdG9yUGFydCgpOwotLy8gICAgICAgICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSAoQWN0aW9uUmVnaXN0cnkpIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihBY3Rpb25SZWdpc3RyeS5jbGFzcyk7Ci0vLyAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihTZXRJbnB1dFRvR3JhcGhWaWV3LklEKTsKLS8vICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IChBY3Rpb25SZWdpc3RyeSkgZWRpdG9yUGFydC5nZXRBZGFwdGVyKEFjdGlvblJlZ2lzdHJ5LmNsYXNzKTsKLSAgICAgICAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZG9FZGl0TmFtZShib29sZWFuIGFkZEZyb21EZXNpZ24pCi0gIHsKLSAgICBpZiAoIWFkZEZyb21EZXNpZ24pIHJldHVybjsKLSAgICAKLS8vICAgIHJlbW92ZUZlZWRiYWNrKCk7Ci0KLSAgICBPYmplY3Qgb2JqZWN0ID0gKChYU0RCYXNlQWRhcHRlcikgZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgIHsKLSAgICAgIFBvaW50IHAgPSBsYWJlbC5nZXRMb2NhdGlvbigpOwotICAgICAgVG9wTGV2ZWxOYW1lRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBUb3BMZXZlbE5hbWVEaXJlY3RFZGl0TWFuYWdlcihUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0LnRoaXMsIG5ldyBUb3BMZXZlbENvbXBvbmVudExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydC50aGlzLCBwKSwgKFhTRE5hbWVkQ29tcG9uZW50KSBvYmplY3QpOwotICAgICAgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyIHdyYXBwZXIgPSBuZXcgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyKCk7Ci0gICAgICBhZHREaXJlY3RFZGl0UG9saWN5LnNldFVwZGF0ZUNvbW1hbmQod3JhcHBlcik7Ci0gICAgICBtYW5hZ2VyLnNob3coKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGNsYXNzIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciBleHRlbmRzIENvbW1hbmQgaW1wbGVtZW50cyBJQURUVXBkYXRlQ29tbWFuZAotICB7Ci0gICAgQ29tbWFuZCBjb21tYW5kOwotICAgIHByb3RlY3RlZCBEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0OwotICAgIAotICAgIHB1YmxpYyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIoKQotICAgIHsKLSAgICAgIHN1cGVyKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX05BTUUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3QoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkKLSAgICB7Ci0gICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICB7Ci0gICAgICBYU0RCYXNlQWRhcHRlciBhZGFwdGVyID0gKFhTREJhc2VBZGFwdGVyKWdldE1vZGVsKCk7Ci0gICAgICBPYmplY3QgbmV3VmFsdWUgPSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpOwotICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICYmICgoU3RyaW5nKW5ld1ZhbHVlKS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIFVwZGF0ZU5hbWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlTmFtZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfTkFNRSwgKFhTRE5hbWVkQ29tcG9uZW50KWFkYXB0ZXIuZ2V0VGFyZ2V0KCksIChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgfQotICAgICB9Ci0gIH0KLQotICBzdGF0aWMgYm9vbGVhbiByZXNlbGVjdCA9IGZhbHNlOwotCi0gIHB1YmxpYyB2b2lkIHNldFJlc2VsZWN0KGJvb2xlYW4gc3RhdGUpCi0gIHsKLSAgICByZXNlbGVjdCA9IHN0YXRlOwotICB9Ci0KLSAgcHVibGljIExhYmVsIGdldE5hbWVMYWJlbEZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBjdXJzb3JMb2NhdGlvbikKLSAgewotICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGludCB2YWx1ZSkKLSAgewotICAgIC8vIGlmIGl0IGlzIHNlbGVjdGVkLCB3ZSB3YW50IHRvIHNjcm9sbCB0byBpdAotICAgIGlmIChkb1Njcm9sbCkKLSAgICAgIHNldFNjcm9sbCh0cnVlKTsKLSAgICBzdXBlci5zZXRTZWxlY3RlZCh2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGb2N1cyhib29sZWFuIGIpCi0gIHsKLSAgICBzdXBlci5zZXRGb2N1cyhiKTsKLSAgICBoYXNGb2N1cyA9IGI7Ci0gICAgZ2V0RmlndXJlKCkucmVwYWludCgpOwotICB9Ci0gIAotICBwdWJsaWMgRHJhZ1RyYWNrZXIgZ2V0RHJhZ1RyYWNrZXIoUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgcmV0dXJuIG5ldyBHcmFwaE5vZGVEcmFnVHJhY2tlcih0aGlzKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZGVyVGV4dCgpCi0gIHsKLQkgIHJldHVybiBnZXROYW1lTGFiZWxGaWd1cmUoKS5nZXRUZXh0KCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNiNGRkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5TZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci0KLXB1YmxpYyBjbGFzcyBYU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0IGV4dGVuZHMgU2VjdGlvbkVkaXRQYXJ0Ci17Ci0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIElTdHJ1Y3R1cmUgc3RydWN0dXJlID0gICgoQW5ub3RhdGlvbilnZXRNb2RlbCgpKS5nZXRPd25lcigpOwotICAgIGlmIChzdHJ1Y3R1cmUgaW5zdGFuY2VvZiBJQ29tcGxleFR5cGUpCi0gICAgeyAgCi0gICAgICBjb21wbGV4VHlwZSA9IChJQ29tcGxleFR5cGUpc3RydWN0dXJlOwotICAgICAgaWYgKGNvbXBsZXhUeXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpIGNvbXBsZXhUeXBlOwotICAgICAgICByZXR1cm4gYWRhcHRlci5nZXRBdHRyaWJ1dGVHcm91cENvbnRlbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEQmFzZUZpZWxkRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEQmFzZUZpZWxkRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkYWM5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREJhc2VGaWVsZEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uSUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5BdHRyaWJ1dGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5FbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQuTGFiZWxDZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5MYWJlbEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LlJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUZpZWxkRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5GaWVsZEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzLkRyYWdBbmREcm9wRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFhTREJhc2VGaWVsZEVkaXRQYXJ0IGV4dGVuZHMgQmFzZUZpZWxkRWRpdFBhcnQKLXsKLQotICBwdWJsaWMgWFNEQmFzZUZpZWxkRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEVkaXRQYXJ0I3JlZnJlc2hWaXN1YWxzKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIElGaWVsZEZpZ3VyZSBmaWd1cmUgPSBnZXRGaWVsZEZpZ3VyZSgpOwotICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIGdldE1vZGVsKCk7Ci0gICAgCi0gICAgZmlndXJlLmdldE5hbWVMYWJlbCgpLnNldFRleHQoZmllbGQuZ2V0TmFtZSgpKTsKLSAgICBmaWd1cmUuZ2V0VHlwZUxhYmVsKCkuc2V0VGV4dChmaWVsZC5nZXRUeXBlTmFtZSgpKTsKLSAgICBmaWd1cmUucmVmcmVzaFZpc3VhbHMoZ2V0TW9kZWwoKSk7Ci0gICAgaWYgKGZpZWxkLmlzUmVhZE9ubHkoKSkKLSAgICB7Ci0gICAgICBmaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmRhcmtHcmF5KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpc0hpZ2hDb250cmFzdCkKLSAgICAgIHsKLSAgICAgICAgZmlndXJlLnNldEZvcmVncm91bmRDb2xvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0ZPUkVHUk9VTkQpKTsKLSAgICAgICAgZmlndXJlLnNldEJhY2tncm91bmRDb2xvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZmlndXJlLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7ICAgICAKLSAgICB9Ci0KLSAgICBTdHJpbmcgb2NjdXJyZW5jZURlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBJQW5ub3RhdGlvblByb3ZpZGVyKQotICAgIHsKLSAgICAgIG9jY3VycmVuY2VEZXNjcmlwdGlvbiA9ICgoSUFubm90YXRpb25Qcm92aWRlcilmaWVsZCkuZ2V0TmFtZUFubm90YXRpb25TdHJpbmcoKTsKLSAgICB9Ci0gICAgcmVmcmVzaEljb24oKTsKLSAgICBmaWd1cmUuZ2V0TmFtZUFubm90YXRpb25MYWJlbCgpLnNldFRleHQob2NjdXJyZW5jZURlc2NyaXB0aW9uKTsKLSAgICAKLSAgICBmaWd1cmUucmVjb21wdXRlTGF5b3V0KCk7Ci0KLQotICAgIGlmIChnZXRSb290KCkgIT0gbnVsbCkKLSAgICAgICgoR3JhcGhpY2FsRWRpdFBhcnQpZ2V0Um9vdCgpKS5nZXRGaWd1cmUoKS5pbnZhbGlkYXRlVHJlZSgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoSWNvbigpICAKLSAgewotICAgIElGaWVsZEZpZ3VyZSBmaWd1cmUgPSBnZXRGaWVsZEZpZ3VyZSgpOyAgIAotICAgIC8vIG91ciBtb2RlbCBpbXBsZW1lbnRzIElUcmVlRWxlbWVudAotICAgIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgSW1hZ2UgaW1hZ2UgPSAoKFhTREJhc2VBZGFwdGVyKWdldE1vZGVsKCkpLmdldEltYWdlKCk7Ci0gICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSAoKFhTREJhc2VBZGFwdGVyKWdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKTsKLSAgICAgIGZpZ3VyZS5nZXROYW1lTGFiZWwoKS5zZXRJY29uKGltYWdlKTsKLSAgICAgIAotICAgICAgaWYgKGltYWdlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXAgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpICgoWFNEQmFzZUFkYXB0ZXIpZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgIGZpZ3VyZS5nZXROYW1lTGFiZWwoKS5zZXRJY29uKFhTRENvbW1vblVJVXRpbHMuZ2V0VXBkYXRlZEltYWdlKGNvbXAsIGltYWdlLCBpc1JlYWRPbmx5KSk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZE5vdGlmeSgpCi0gIHsKLSAgICBzdXBlci5hZGROb3RpZnkoKTsKLSAgICBnZXRGaWVsZEZpZ3VyZSgpLmVkaXRQYXJ0QXR0YWNoZWQodGhpcyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5ID0gbmV3IFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpOwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpOwotICAgIGlmICghaXNGaWxlUmVhZE9ubHkoKSkKLSAgICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsIG5ldyBEcmFnQW5kRHJvcEVkaXRQb2xpY3koZ2V0Vmlld2VyKCksIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRpcmVjdEVkaXROYW1lRmllbGQoKQotICB7Ci0gICAgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLSAgICBJRmllbGRGaWd1cmUgZmllbGRGaWd1cmUgPSBnZXRGaWVsZEZpZ3VyZSgpOwotICAgIGlmICggbW9kZWwgaW5zdGFuY2VvZiBJRmllbGQpIAotICAgIHsKLSAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIG1vZGVsOwotICAgICAgaWYgKGZpZWxkLmlzUmVmZXJlbmNlKCkpCi0gICAgICB7Ci0gICAgICAgIFJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBudWxsOwotICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgbWFuYWdlciA9IG5ldyBFbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoKElGaWVsZCkgbW9kZWwsIHRoaXMsIGZpZWxkRmlndXJlLmdldE5hbWVMYWJlbCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChmaWVsZCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcikKLSAgICAgICAgewotICAgICAgICAgIG1hbmFnZXIgPSBuZXcgQXR0cmlidXRlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoKElGaWVsZCkgbW9kZWwsIHRoaXMsIGZpZWxkRmlndXJlLmdldE5hbWVMYWJlbCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUmVmZXJlbmNlVXBkYXRlQ29tbWFuZCBlbGVtZW50VXBkYXRlQ29tbWFuZCA9IG5ldyBSZWZlcmVuY2VVcGRhdGVDb21tYW5kKCk7Ci0gICAgICAgICAgZWxlbWVudFVwZGF0ZUNvbW1hbmQuc2V0RGVsZWdhdGUobWFuYWdlcik7Ci0gICAgICAgICAgYWR0RGlyZWN0RWRpdFBvbGljeS5zZXRVcGRhdGVDb21tYW5kKGVsZW1lbnRVcGRhdGVDb21tYW5kKTsKLSAgICAgICAgICBtYW5hZ2VyLnNob3coKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBMYWJlbEVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTGFiZWxFZGl0TWFuYWdlcih0aGlzLCBuZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcih0aGlzLCBudWxsKSk7Ci0gICAgICAgIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciB3cmFwcGVyID0gbmV3IE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpOwotICAgICAgICBhZHREaXJlY3RFZGl0UG9saWN5LnNldFVwZGF0ZUNvbW1hbmQod3JhcHBlcik7Ci0gICAgICAgIG1hbmFnZXIuc2hvdygpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Rm9jdXMoYm9vbGVhbiBmb2N1cykKLSAgewotICAgIHN1cGVyLnNldEZvY3VzKGZvY3VzKTsKLSAgICBoYXNGb2N1cyA9IGZvY3VzOwotICAgICgoRmllbGRGaWd1cmUpZ2V0RmlndXJlKCkpLmhhc0ZvY3VzID0gaGFzRm9jdXM7Ci0gICAgZ2V0RmlndXJlKCkucmVwYWludCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RFZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExYjc4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREVkaXRQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RNb2RlbEdyb3VwQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFNjaGVtYUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5BRFRFZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Db2x1bW5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklDb21wYXJ0bWVudEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JRmllbGRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSVN0cnVjdHVyZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuVHlwZVZpekZpZ3VyZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5TcGFjZUZpbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuSUV4dGVuZGVkRmlndXJlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLklNb2RlbEdyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0UGFydEZhY3RvcnkgZXh0ZW5kcyBBRFRFZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5Ci17Ci0gIHByb3RlY3RlZCBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5IGRlbGVnYXRlOwotICAKLSAgcHVibGljIFhTREVkaXRQYXJ0RmFjdG9yeSgpCi0gIHsKLSAgICBkZWxlZ2F0ZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYU0RFZGl0b3JDb25maWd1cmF0aW9uKCkuZ2V0RmlndXJlRmFjdG9yeSgpOwotICAgIGlmIChkZWxlZ2F0ZSA9PSBudWxsKQotICAgICAgZGVsZWdhdGUgPSBuZXcgVHlwZVZpekZpZ3VyZUZhY3RvcnkoKTsKLSAgfQotICAKLSAgcHVibGljIFhTREVkaXRQYXJ0RmFjdG9yeShJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5IGZpZ3VyZUZhY3RvcnkpCi0gIHsKLSAgICBkZWxlZ2F0ZSA9IGZpZ3VyZUZhY3Rvcnk7Ci0gIH0KLSAgCi0KLSAgcHVibGljIEVkaXRQYXJ0IGRvQ3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgRWRpdFBhcnQgY2hpbGQgPSBudWxsOwotICAgIC8vIE92ZXJyaWRlIGVkaXQgcGFydCB3aGVyZSBkZXNpcmVkCi0gICAgCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUZpZWxkKQotICAgIHsKLSAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFNwYWNlRmlsbGVyKQotICAgICAgewotICAgICAgICBjaGlsZCA9IG5ldyBTcGFjZUZpbGxlckZvckZpZWxkRWRpdFBhcnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEVkaXRQYXJ0KQotICAgICAgeyAgCi0gICAgICAgIGNoaWxkID0gbmV3IFhTREJhc2VGaWVsZEVkaXRQYXJ0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEU2NoZW1hQWRhcHRlcikKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBYU0RTY2hlbWFFZGl0UGFydCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIENhdGVnb3J5QWRhcHRlcikKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBDYXRlZ29yeUVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IFhTRFNpbXBsZVR5cGVFZGl0UGFydCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBBZGFwdGVyKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IE1vZGVsR3JvdXBFZGl0UGFydCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgewotICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFubm90YXRpb24pIG1vZGVsOwotICAgICAgU3RyaW5nIGtpbmQgPSBhbm5vdGF0aW9uLmdldENvbXBhcnRtZW50KCkuZ2V0S2luZCgpOwotICAgICAgaWYgKGtpbmQuZXF1YWxzKCJlbGVtZW50IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgY2hpbGQgPSBuZXcgWFNER3JvdXBzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChraW5kLmVxdWFscygiYXR0cmlidXRlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgY2hpbGQgPSBuZXcgWFNEQXR0cmlidXRlc0ZvckFubm90YXRpb25FZGl0UGFydCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICghKGNvbnRleHQgaW5zdGFuY2VvZiBDb2x1bW5FZGl0UGFydCkpCi0gICAgeyAgIAotICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKQotICAgICAgewotICAgICAgICBjaGlsZCA9IG5ldyBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgY2hpbGQgPSBuZXcgTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyKQotICAgICAgewotICAgICAgICBjaGlsZCA9IG5ldyBBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCgpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGEgc3BlY2lhbHppZWQgWFNEIGVkaXQgcGFydCB0byBjcmVhdGUKLSAgICAvLyB0aGVuIHdlIHNpbXBseSBjYWxsIHRoZSBzdXBlciBjbGFzcyB0byBjcmVhdGUgYSBnZW5lcmljIEFEVCBlZGl0IHBhcnQKLSAgICAvLwotICAgIGlmIChjaGlsZCA9PSBudWxsKQotICAgIHsKLSAgICAgIGNoaWxkID0gc3VwZXIuZG9DcmVhdGVFZGl0UGFydChjb250ZXh0LCBtb2RlbCk7Ci0gICAgfQotCi0gICAgLy8gaWYgYXQgdGhpcyB0aGlzIHBvaW50IHdlIGhhdmUgbm90IGNyZWF0ZWQgYW4gZWRpdCBwYXJ0IHdlIHNpbXBseQotICAgIC8vIGNyZWF0ZSBhIHBsYWNlaG9sZGVyIGVkaXQgcGFydCB0byBwcm92aWRlIHRoZSBtb3N0IHJvYnVzdCBiZWhhdmlvdXIgcG9zc2libGUKLSAgICAvLyAgICAKLSAgICBpZiAoY2hpbGQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBUT0RPIChjcykgbG9nIGFuIGVycm9yIG1lc3NhZ2UgaGVyZSwgc2luY2Ugd2Ugc2hvdWxkbid0IHJlYWxseSBnZXQgaGVyZSAKLSAgICAgIGNoaWxkID0gbmV3IFNwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydCgpOwotICAgIH0gIAotICAgIHJldHVybiBjaGlsZDsKLSAgfQotCi0gIHB1YmxpYyBJQ29tcGFydG1lbnRGaWd1cmUgY3JlYXRlQ29tcGFydG1lbnRGaWd1cmUoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZUNvbXBhcnRtZW50RmlndXJlKG1vZGVsKTsKLSAgfQotICAKLSAgcHVibGljIElTdHJ1Y3R1cmVGaWd1cmUgY3JlYXRlU3RydWN0dXJlRmlndXJlKE9iamVjdCBtb2RlbCkKLSAgewotICAgIElTdHJ1Y3R1cmVGaWd1cmUgZmlndXJlID0gZGVsZWdhdGUuY3JlYXRlU3RydWN0dXJlRmlndXJlKG1vZGVsKTsKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSAoKFhTREJhc2VBZGFwdGVyKW1vZGVsKS5nZXRUYXJnZXQoKTsKLSAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICgoWFNEQmFzZUFkYXB0ZXIpbW9kZWwpLmlzUmVhZE9ubHkoKTsKLSAgICAgIGZpZ3VyZS5nZXROYW1lTGFiZWwoKS5zZXRJY29uKFhTRENvbW1vblVJVXRpbHMuZ2V0VXBkYXRlZEltYWdlKCBjb21wLCAoKFhTREJhc2VBZGFwdGVyKW1vZGVsKS5nZXRJbWFnZSgpLCBpc1JlYWRPbmx5KSk7Ci0gICAgfQotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0gIAotCi0gIHB1YmxpYyBJRmllbGRGaWd1cmUgY3JlYXRlRmllbGRGaWd1cmUoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZUZpZWxkRmlndXJlKG1vZGVsKTsKLSAgfQotICAKLSAgcHVibGljIElNb2RlbEdyb3VwRmlndXJlIGNyZWF0ZU1vZGVsR3JvdXBGaWd1cmUoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZU1vZGVsR3JvdXBGaWd1cmUobW9kZWwpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREdyb3Vwc0ZvckFubm90YXRpb25FZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RHcm91cHNGb3JBbm5vdGF0aW9uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2NWIzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREdyb3Vwc0ZvckFubm90YXRpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5TZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNER3JvdXBzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0IGV4dGVuZHMgU2VjdGlvbkVkaXRQYXJ0Ci17Ci0gIHB1YmxpYyBYU0RHcm91cHNGb3JBbm5vdGF0aW9uRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCB4c2RNb2RlbEdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIElTdHJ1Y3R1cmUgc3RydWN0dXJlID0gICgoQW5ub3RhdGlvbilnZXRNb2RlbCgpKS5nZXRPd25lcigpOwotICAgIGlmIChzdHJ1Y3R1cmUgaW5zdGFuY2VvZiBJQ29tcGxleFR5cGUpCi0gICAgeyAgCi0gICAgICBjb21wbGV4VHlwZSA9IChJQ29tcGxleFR5cGUpc3RydWN0dXJlOwotICAgICAgaWYgKGNvbXBsZXhUeXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpIGNvbXBsZXhUeXBlOwotICAgICAgICB4c2RNb2RlbEdyb3VwTGlzdCA9IGFkYXB0ZXIuZ2V0TW9kZWxHcm91cHMoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0geHNkTW9kZWxHcm91cExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgewotICAgICAgICAgIGFkYXB0ZXJMaXN0LmFkZChYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KChYU0RNb2RlbEdyb3VwKW9iaikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgYWRhcHRlckxpc3QuYWRkKFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKW9iaikpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cnVjdHVyZSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcikKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpIHN0cnVjdHVyZTsKLSAgICAgIFhTRE1vZGVsR3JvdXAgZ3JvdXAgPSBhZGFwdGVyLmdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuZ2V0TW9kZWxHcm91cCgpOwotICAgICAgaWYgKGdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGFkYXB0ZXJMaXN0LmFkZChYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdyb3VwKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBhZGFwdGVyTGlzdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RNb2RlbEdyb3VwUm91dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTRE1vZGVsR3JvdXBSb3V0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5NTc4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTRE1vZGVsR3JvdXBSb3V0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Um91dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLy8gVE9ETyBNYW5oYXR0YW4gY29ubmVjdGlvbiByb3V0ZXIgaXMgZmluYWwKLXB1YmxpYyBjbGFzcyBYU0RNb2RlbEdyb3VwUm91dGVyIGV4dGVuZHMgQWJzdHJhY3RSb3V0ZXIKLXsKLSAgcHVibGljIFhTRE1vZGVsR3JvdXBSb3V0ZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICBwcml2YXRlIE1hcCByb3dzVXNlZCA9IG5ldyBIYXNoTWFwKCk7Ci0gIHByaXZhdGUgTWFwIGNvbHNVc2VkID0gbmV3IEhhc2hNYXAoKTsKLQotICBwcml2YXRlIE1hcCByZXNlcnZlZEluZm8gPSBuZXcgSGFzaE1hcCgpOwotCi0gIHByaXZhdGUgY2xhc3MgUmVzZXJ2ZWRJbmZvIHsKLSAgICBwdWJsaWMgTGlzdCByZXNlcnZlZFJvd3MgPSBuZXcgQXJyYXlMaXN0KDIpOwotICAgIHB1YmxpYyBMaXN0IHJlc2VydmVkQ29scyA9IG5ldyBBcnJheUxpc3QoMik7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBSYXkgIFVQICAgID0gbmV3IFJheSgwLCAtMSksCi0gICAgICAgICAgICAgIERPV04gID0gbmV3IFJheSgwLCAxKSwKLSAgICAgICAgICAgICAgTEVGVCAgPSBuZXcgUmF5KC0xLCAwKSwKLSAgICAgICAgICAgICAgUklHSFQgPSBuZXcgUmF5KDEsIDApOwotCi0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25Sb3V0ZXIjaW52YWxpZGF0ZShDb25uZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgaW52YWxpZGF0ZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICByZW1vdmVSZXNlcnZlZExpbmVzKGNvbm5lY3Rpb24pOwotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgZ2V0Q29sdW1uTmVhcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGludCByLCBpbnQgbiwgaW50IHgpIHsKLSAgICBpbnQgbWluID0gTWF0aC5taW4obiwgeCksCi0gICAgICBtYXggPSBNYXRoLm1heChuLCB4KTsKLSAgICBpZiAobWluID4gcikgewotICAgICAgbWF4ID0gbWluOwotICAgICAgbWluID0gciAtIChtaW4gLSByKTsKLSAgICB9Ci0gICAgaWYgKG1heCA8IHIpIHsKLSAgICAgIG1pbiA9IG1heDsKLSAgICAgIG1heCA9IHIgKyAociAtIG1heCk7Ci0gICAgfQotICAgIGludCBwcm94aW1pdHkgPSAwOwotICAgIGludCBkaXJlY3Rpb24gPSAtMTsKLSAgICBpZiAociAlIDIgPT0gMSkKLSAgICAgIHItLTsKLSAgICBJbnRlZ2VyIGk7Ci0gICAgd2hpbGUgKHByb3hpbWl0eSA8IHIpIHsKLSAgICAgIGkgPSBuZXcgSW50ZWdlcihyICsgcHJveGltaXR5ICogZGlyZWN0aW9uKTsKLSAgICAgIGlmICghY29sc1VzZWQuY29udGFpbnNLZXkoaSkpIHsKLSAgICAgICAgY29sc1VzZWQucHV0KGksIGkpOwotICAgICAgICByZXNlcnZlQ29sdW1uKGNvbm5lY3Rpb24sIGkpOwotICAgICAgICByZXR1cm4gaS5pbnRWYWx1ZSgpOwotICAgICAgfQotICAgICAgaW50IGogPSBpLmludFZhbHVlKCk7Ci0gICAgICBpZiAoaiA8PSBtaW4pCi0gICAgICAgIHJldHVybiBqICsgMjsKLSAgICAgIGlmIChqID49IG1heCkKLSAgICAgICAgcmV0dXJuIGogLSAyOwotICAgICAgaWYgKGRpcmVjdGlvbiA9PSAxKQotICAgICAgICBkaXJlY3Rpb24gPSAtMTsKLSAgICAgIGVsc2UgewotICAgICAgICBkaXJlY3Rpb24gPSAxOwotICAgICAgICBwcm94aW1pdHkgKz0gMjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGlyZWN0aW9uIHRoZSBwb2ludCA8aT5wPC9pPiBpcyBpbiByZWxhdGlvbiB0byB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLgotICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlIExFRlQgKC0xLDApLCBSSUdIVCAoMSwwKSwgVVAgKDAsLTEpIGFuZCBET1dOICgwLDEpLgotICAgKiAKLSAgICogQHBhcmFtIHIgdGhlIHJlY3RhbmdsZQotICAgKiBAcGFyYW0gcCB0aGUgcG9pbnQKLSAgICogQHJldHVybiB0aGUgZGlyZWN0aW9uIGZyb20gPGk+cjwvaT4gdG8gPGk+cDwvaT4KLSAgICovCi0gIHByb3RlY3RlZCBSYXkgZ2V0RGlyZWN0aW9uKFJlY3RhbmdsZSByLCBQb2ludCBwKSB7Ci0gICAgaW50IGksIGRpc3RhbmNlID0gTWF0aC5hYnMoci54IC0gcC54KTsKLSAgICBSYXkgZGlyZWN0aW9uOwotICAgIAotICAgIGRpcmVjdGlvbiA9IExFRlQ7Ci0KLSAgICBpID0gTWF0aC5hYnMoci55IC0gcC55KTsKLSAgICBpZiAoaSA8PSBkaXN0YW5jZSkgewotICAgICAgZGlzdGFuY2UgPSBpOwotICAgICAgZGlyZWN0aW9uID0gVVA7Ci0gICAgfQotCi0gICAgaSA9IE1hdGguYWJzKHIuYm90dG9tKCkgLSBwLnkpOwotICAgIGlmIChpIDw9IGRpc3RhbmNlKSB7Ci0gICAgICBkaXN0YW5jZSA9IGk7Ci0gICAgICBkaXJlY3Rpb24gPSBET1dOOwotICAgIH0KLQotICAgIGkgPSBNYXRoLmFicyhyLnJpZ2h0KCkgLSBwLngpOwotICAgIGlmIChpIDwgZGlzdGFuY2UpIHsKLSAgICAgIGRpc3RhbmNlID0gaTsKLSAgICAgIGRpcmVjdGlvbiA9IFJJR0hUOwotICAgIH0KLQotICAgIHJldHVybiBkaXJlY3Rpb247Ci0gIH0KLQotICBwcm90ZWN0ZWQgUmF5IGdldEVuZERpcmVjdGlvbihDb25uZWN0aW9uIGNvbm4pIHsKLSAgICBDb25uZWN0aW9uQW5jaG9yIGFuY2hvciA9IGNvbm4uZ2V0VGFyZ2V0QW5jaG9yKCk7Ci0gICAgUG9pbnQgcCA9IGdldEVuZFBvaW50KGNvbm4pOwotICAgIFJlY3RhbmdsZSByZWN0OwotICAgIGlmIChhbmNob3IuZ2V0T3duZXIoKSA9PSBudWxsKQotICAgICAgcmVjdCA9IG5ldyBSZWN0YW5nbGUocC54IC0gMSwgcC55IC0gMSwgMiwgMik7Ci0gICAgZWxzZSB7Ci0gICAgICByZWN0ID0gY29ubi5nZXRUYXJnZXRBbmNob3IoKS5nZXRPd25lcigpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLSAgICAgIGNvbm4uZ2V0VGFyZ2V0QW5jaG9yKCkuZ2V0T3duZXIoKS50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotICAgIH0KLSAgICByZXR1cm4gZ2V0RGlyZWN0aW9uKHJlY3QsIHApOwotICB9Ci0KLSAgcHJvdGVjdGVkIGludCBnZXRSb3dOZWFyKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgaW50IHIsIGludCBuLCBpbnQgeCkgewotICAgIGludCBtaW4gPSBNYXRoLm1pbihuLCB4KSwKLSAgICAgIG1heCA9IE1hdGgubWF4KG4sIHgpOwotICAgIGlmIChtaW4gPiByKSB7Ci0gICAgICBtYXggPSBtaW47Ci0gICAgICBtaW4gPSByIC0gKG1pbiAtIHIpOwotICAgIH0KLSAgICBpZiAobWF4IDwgcikgewotICAgICAgbWluID0gbWF4OwotICAgICAgbWF4ID0gciArIChyIC0gbWF4KTsKLSAgICB9Ci0KLSAgICBpbnQgcHJveGltaXR5ID0gMDsKLSAgICBpbnQgZGlyZWN0aW9uID0gLTE7Ci0gICAgaWYgKHIgJSAyID09IDEpCi0gICAgICByLS07Ci0gICAgSW50ZWdlciBpOwotICAgIHdoaWxlIChwcm94aW1pdHkgPCByKSB7Ci0gICAgICBpID0gbmV3IEludGVnZXIociArIHByb3hpbWl0eSAqIGRpcmVjdGlvbik7Ci0gICAgICBpZiAoIXJvd3NVc2VkLmNvbnRhaW5zS2V5KGkpKSB7Ci0gICAgICAgIHJvd3NVc2VkLnB1dChpLCBpKTsKLSAgICAgICAgcmVzZXJ2ZVJvdyhjb25uZWN0aW9uLCBpKTsKLSAgICAgICAgcmV0dXJuIGkuaW50VmFsdWUoKTsKLSAgICAgIH0KLSAgICAgIGludCBqID0gaS5pbnRWYWx1ZSgpOwotICAgICAgaWYgKGogPD0gbWluKQotICAgICAgICByZXR1cm4gaiArIDI7Ci0gICAgICBpZiAoaiA+PSBtYXgpCi0gICAgICAgIHJldHVybiBqIC0gMjsKLSAgICAgIGlmIChkaXJlY3Rpb24gPT0gMSkKLSAgICAgICAgZGlyZWN0aW9uID0gLTE7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgZGlyZWN0aW9uID0gMTsKLSAgICAgICAgcHJveGltaXR5ICs9IDI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByOwotICB9Ci0KLSAgcHJvdGVjdGVkIFJheSBnZXRTdGFydERpcmVjdGlvbihDb25uZWN0aW9uIGNvbm4pIHsKLSAgICBDb25uZWN0aW9uQW5jaG9yIGFuY2hvciA9IGNvbm4uZ2V0U291cmNlQW5jaG9yKCk7Ci0gICAgUG9pbnQgcCA9IGdldFN0YXJ0UG9pbnQoY29ubik7Ci0gICAgUmVjdGFuZ2xlIHJlY3Q7Ci0gICAgaWYgKGFuY2hvci5nZXRPd25lcigpID09IG51bGwpCi0gICAgICByZWN0ID0gbmV3IFJlY3RhbmdsZShwLnggLSAxLCBwLnkgLSAxLCAyLCAyKTsKLSAgICBlbHNlIHsKLSAgICAgIHJlY3QgPSBjb25uLmdldFNvdXJjZUFuY2hvcigpLmdldE93bmVyKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgICAgY29ubi5nZXRTb3VyY2VBbmNob3IoKS5nZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0gICAgfQotICAgIHJldHVybiBnZXREaXJlY3Rpb24ocmVjdCwgcCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUG9zaXRpb25zKFJheSBzdGFydCwgUmF5IGVuZCwgTGlzdCBwb3NpdGlvbnMsIAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhvcml6b250YWwsIENvbm5lY3Rpb24gY29ubikgewotICAgIHJlbW92ZVJlc2VydmVkTGluZXMoY29ubik7Ci0KLSAgICBpbnQgcG9zW10gPSBuZXcgaW50W3Bvc2l0aW9ucy5zaXplKCkgKyAyXTsKLSAgICBpZiAoaG9yaXpvbnRhbCkKLSAgICAgIHBvc1swXSA9IHN0YXJ0Lng7Ci0gICAgZWxzZQotICAgICAgcG9zWzBdID0gc3RhcnQueTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcG9zaXRpb25zLnNpemUoKTsgaSsrKSB7Ci0gICAgICBwb3NbaSArIDFdID0gKChJbnRlZ2VyKXBvc2l0aW9ucy5nZXQoaSkpLmludFZhbHVlKCk7Ci0gICAgfQotICAgIGlmIChob3Jpem9udGFsID09IChwb3NpdGlvbnMuc2l6ZSgpICUgMiA9PSAxKSkKLSAgICAgIHBvc1srK2ldID0gZW5kLng7Ci0gICAgZWxzZQotICAgICAgcG9zWysraV0gPSBlbmQueTsKLQotICAgIFBvaW50TGlzdCBwb2ludHMgPSBuZXcgUG9pbnRMaXN0KCk7Ci0gICAgcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChzdGFydC54LCBzdGFydC55KSk7Ci0gICAgUG9pbnQgcDsKLSAgICBpbnQgY3VycmVudCwgcHJldiwgbWluLCBtYXg7Ci0gICAgYm9vbGVhbiBhZGp1c3Q7Ci0gICAgZm9yIChpID0gMjsgaSA8IHBvcy5sZW5ndGggLSAxOyBpKyspIHsKLSAgICAgIGhvcml6b250YWwgPSAhaG9yaXpvbnRhbDsKLSAgICAgIHByZXYgPSBwb3NbaSAtIDFdOwotICAgICAgY3VycmVudCA9IHBvc1tpXTsKLQotICAgICAgYWRqdXN0ID0gKGkgIT0gcG9zLmxlbmd0aCAtIDIpOwotICAgICAgaWYgKGhvcml6b250YWwpIHsKLSAgICAgICAgaWYgKGFkanVzdCkgewotICAgICAgICAgIG1pbiA9IHBvc1tpIC0gMl07Ci0gICAgICAgICAgbWF4ID0gcG9zW2kgKyAyXTsKLSAgICAgICAgICBwb3NbaV0gPSBjdXJyZW50ID0gZ2V0Um93TmVhcihjb25uLCBjdXJyZW50LCBtaW4sIG1heCk7Ci0gICAgICAgIH0KLSAgICAgICAgcCA9IG5ldyBQb2ludChwcmV2LCBjdXJyZW50KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhZGp1c3QpIHsKLSAgICAgICAgICBtaW4gPSBwb3NbaSAtIDJdOwotICAgICAgICAgIG1heCA9IHBvc1tpICsgMl07Ci0gICAgICAgICAgcG9zW2ldID0gY3VycmVudCA9IGdldENvbHVtbk5lYXIoY29ubiwgY3VycmVudCwgbWluLCBtYXgpOwotICAgICAgICB9Ci0gICAgICAgIHAgPSBuZXcgUG9pbnQoY3VycmVudCwgcHJldik7Ci0gICAgICB9Ci0gICAgICBwb2ludHMuYWRkUG9pbnQocCk7Ci0gICAgfQotICAgIHBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoZW5kLngsIGVuZC55KSk7Ci0gICAgY29ubi5zZXRQb2ludHMocG9pbnRzKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uUm91dGVyI3JlbW92ZShDb25uZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgIHJlbW92ZVJlc2VydmVkTGluZXMoY29ubmVjdGlvbik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNlcnZlZExpbmVzKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgIFJlc2VydmVkSW5mbyBySW5mbyA9IChSZXNlcnZlZEluZm8pIHJlc2VydmVkSW5mby5nZXQoY29ubmVjdGlvbik7Ci0gICAgaWYgKHJJbmZvID09IG51bGwpIAotICAgICAgcmV0dXJuOwotICAgIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgckluZm8ucmVzZXJ2ZWRSb3dzLnNpemUoKTsgaSsrKSB7Ci0gICAgICByb3dzVXNlZC5yZW1vdmUockluZm8ucmVzZXJ2ZWRSb3dzLmdldChpKSk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgckluZm8ucmVzZXJ2ZWRDb2xzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBjb2xzVXNlZC5yZW1vdmUockluZm8ucmVzZXJ2ZWRDb2xzLmdldChpKSk7Ci0gICAgfQotICAgIHJlc2VydmVkSW5mby5yZW1vdmUoY29ubmVjdGlvbik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZXNlcnZlQ29sdW1uKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgSW50ZWdlciBjb2x1bW4pIHsKLSAgICBSZXNlcnZlZEluZm8gaW5mbyA9IChSZXNlcnZlZEluZm8pIHJlc2VydmVkSW5mby5nZXQoY29ubmVjdGlvbik7Ci0gICAgaWYgKGluZm8gPT0gbnVsbCkgewotICAgICAgaW5mbyA9IG5ldyBSZXNlcnZlZEluZm8oKTsKLSAgICAgIHJlc2VydmVkSW5mby5wdXQoY29ubmVjdGlvbiwgaW5mbyk7Ci0gICAgfQotICAgIGluZm8ucmVzZXJ2ZWRDb2xzLmFkZChjb2x1bW4pOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVzZXJ2ZVJvdyhDb25uZWN0aW9uIGNvbm5lY3Rpb24sIEludGVnZXIgcm93KSB7Ci0gICAgUmVzZXJ2ZWRJbmZvIGluZm8gPSAoUmVzZXJ2ZWRJbmZvKSByZXNlcnZlZEluZm8uZ2V0KGNvbm5lY3Rpb24pOwotICAgIGlmIChpbmZvID09IG51bGwpIHsKLSAgICAgIGluZm8gPSBuZXcgUmVzZXJ2ZWRJbmZvKCk7Ci0gICAgICByZXNlcnZlZEluZm8ucHV0KGNvbm5lY3Rpb24sIGluZm8pOwotICAgIH0KLSAgICBpbmZvLnJlc2VydmVkUm93cy5hZGQocm93KTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uUm91dGVyI3JvdXRlKENvbm5lY3Rpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCByb3V0ZShDb25uZWN0aW9uIGNvbm4pIHsKLSAgICBpZiAoKGNvbm4uZ2V0U291cmNlQW5jaG9yKCkgPT0gbnVsbCkgfHwgKGNvbm4uZ2V0VGFyZ2V0QW5jaG9yKCkgPT0gbnVsbCkpIAotICAgICAgcmV0dXJuOwotICAgIGludCBpOwotICAgIFBvaW50IHN0YXJ0UG9pbnQgPSBnZXRTdGFydFBvaW50KGNvbm4pOwotICAgIGNvbm4udHJhbnNsYXRlVG9SZWxhdGl2ZShzdGFydFBvaW50KTsKLSAgICBQb2ludCBlbmRQb2ludCA9IGdldEVuZFBvaW50KGNvbm4pOwotICAgIGNvbm4udHJhbnNsYXRlVG9SZWxhdGl2ZShlbmRQb2ludCk7Ci0KLSAgICBSYXkgc3RhcnQgPSBuZXcgUmF5KHN0YXJ0UG9pbnQpOwotICAgIFJheSBlbmQgPSBuZXcgUmF5KGVuZFBvaW50KTsKLSAgICBSYXkgYXZlcmFnZSA9IG5ldyBSYXkoc3RhcnRQb2ludC54ICsgNCwgc3RhcnRQb2ludC55KTsgLy8gc3RhcnQuZ2V0QXZlcmFnZWQoZW5kKTsKLQotICAgIFJheSBkaXJlY3Rpb24gPSBuZXcgUmF5KHN0YXJ0LCBlbmQpOwotICAgIFJheSBzdGFydE5vcm1hbCA9IGdldFN0YXJ0RGlyZWN0aW9uKGNvbm4pOwotICAgIFJheSBlbmROb3JtYWwgICA9IGdldEVuZERpcmVjdGlvbihjb25uKTsKLQotICAgIExpc3QgcG9zaXRpb25zID0gbmV3IEFycmF5TGlzdCg1KTsKLSAgICBib29sZWFuIGhvcml6b250YWwgPSBzdGFydE5vcm1hbC5pc0hvcml6b250YWwoKTsKLSAgICBpZiAoaG9yaXpvbnRhbCkgCi0gICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKHN0YXJ0LnkpKTsKLSAgICBlbHNlCi0gICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKHN0YXJ0LngpKTsKLSAgICBob3Jpem9udGFsID0gIWhvcml6b250YWw7Ci0KLSAgICBpZiAoc3RhcnROb3JtYWwuZG90UHJvZHVjdChlbmROb3JtYWwpID09IDApIHsKLSAgICAgIGlmICgoc3RhcnROb3JtYWwuZG90UHJvZHVjdChkaXJlY3Rpb24pID49IDApIAotICAgICAgICAmJiAoZW5kTm9ybWFsLmRvdFByb2R1Y3QoZGlyZWN0aW9uKSA8PSAwKSkgewotICAgICAgICAvLyAwCi0gICAgICB9IGVsc2UgewotICAgICAgICAvLyAyCi0gICAgICAgIGlmIChzdGFydE5vcm1hbC5kb3RQcm9kdWN0KGRpcmVjdGlvbikgPCAwKQotICAgICAgICAgIGkgPSBzdGFydE5vcm1hbC5zaW1pbGFyaXR5KHN0YXJ0LmdldEFkZGVkKHN0YXJ0Tm9ybWFsLmdldFNjYWxlZCgxMCkpKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKGhvcml6b250YWwpIAotICAgICAgICAgICAgaSA9IGF2ZXJhZ2UueTsKLSAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgaSA9IGF2ZXJhZ2UueDsKLSAgICAgICAgfQotICAgICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKLSAgICAgICAgaG9yaXpvbnRhbCA9ICFob3Jpem9udGFsOwotCi0gICAgICAgIGlmIChlbmROb3JtYWwuZG90UHJvZHVjdChkaXJlY3Rpb24pID4gMCkKLSAgICAgICAgICBpID0gZW5kTm9ybWFsLnNpbWlsYXJpdHkoZW5kLmdldEFkZGVkKGVuZE5vcm1hbC5nZXRTY2FsZWQoMTApKSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGlmIChob3Jpem9udGFsKSAKLSAgICAgICAgICAgIGkgPSBhdmVyYWdlLnk7Ci0gICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgIGkgPSBhdmVyYWdlLng7Ci0gICAgICAgIH0KLSAgICAgICAgcG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcihpKSk7Ci0gICAgICAgIGhvcml6b250YWwgPSAhaG9yaXpvbnRhbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKHN0YXJ0Tm9ybWFsLmRvdFByb2R1Y3QoZW5kTm9ybWFsKSA+IDApIHsKLSAgICAgICAgLy8xCi0gICAgICAgIGlmIChzdGFydE5vcm1hbC5kb3RQcm9kdWN0KGRpcmVjdGlvbikgPj0gMCkKLSAgICAgICAgICBpID0gc3RhcnROb3JtYWwuc2ltaWxhcml0eShzdGFydC5nZXRBZGRlZChzdGFydE5vcm1hbC5nZXRTY2FsZWQoMTApKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBpID0gZW5kTm9ybWFsLnNpbWlsYXJpdHkoZW5kLmdldEFkZGVkKGVuZE5vcm1hbC5nZXRTY2FsZWQoMTApKSk7Ci0gICAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoaSkpOwotICAgICAgICBob3Jpem9udGFsID0gIWhvcml6b250YWw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLzMgb3IgMQotICAgICAgICBpZiAoc3RhcnROb3JtYWwuZG90UHJvZHVjdChkaXJlY3Rpb24pIDwgMCkgewotICAgICAgICAgIGkgPSBzdGFydE5vcm1hbC5zaW1pbGFyaXR5KHN0YXJ0LmdldEFkZGVkKHN0YXJ0Tm9ybWFsLmdldFNjYWxlZCgxMCkpKTsKLSAgICAgICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKLSAgICAgICAgICBob3Jpem9udGFsID0gIWhvcml6b250YWw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaG9yaXpvbnRhbCkgCi0gICAgICAgICAgaSA9IGF2ZXJhZ2UueTsKLSAgICAgICAgZWxzZSAKLSAgICAgICAgICBpID0gYXZlcmFnZS54OwotICAgICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKLSAgICAgICAgaG9yaXpvbnRhbCA9ICFob3Jpem9udGFsOwotCi0gICAgICAgIGlmIChzdGFydE5vcm1hbC5kb3RQcm9kdWN0KGRpcmVjdGlvbikgPCAwKSB7Ci0gICAgICAgICAgaSA9IGVuZE5vcm1hbC5zaW1pbGFyaXR5KGVuZC5nZXRBZGRlZChlbmROb3JtYWwuZ2V0U2NhbGVkKDEwKSkpOwotICAgICAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoaSkpOwotICAgICAgICAgIGhvcml6b250YWwgPSAhaG9yaXpvbnRhbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoaG9yaXpvbnRhbCkgCi0gICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKGVuZC55KSk7Ci0gICAgZWxzZSAKLSAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoZW5kLngpKTsKLSAgICAKLSAgICBwcm9jZXNzUG9zaXRpb25zKHN0YXJ0LCBlbmQsIHBvc2l0aW9ucywgc3RhcnROb3JtYWwuaXNIb3Jpem9udGFsKCksIGNvbm4pOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEU2NoZW1hRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEU2NoZW1hRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2OThiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTRFNjaGVtYUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuVGV4dFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RTY2hlbWFBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLkhlYWRpbmdGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24ubGF5b3V0cy5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOwotCi0gIHByb3RlY3RlZCBGaWd1cmUgb3V0ZXIsIGNvbnRlbnRGaWd1cmU7Ci0gIHByb3RlY3RlZCBIZWFkaW5nRmlndXJlIGhlYWRpbmdGaWd1cmU7Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnRGaWd1cmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgb3V0ZXIgPSBuZXcgRmlndXJlKCk7Ci0gICAgb3V0ZXIuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKDEpKTsKLQotICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KDQpOwotICAgIG91dGVyLnNldExheW91dE1hbmFnZXIoZmlsbExheW91dCk7Ci0KLSAgICBoZWFkaW5nRmlndXJlID0gbmV3IEhlYWRpbmdGaWd1cmUoKTsKLSAgICBvdXRlci5hZGQoaGVhZGluZ0ZpZ3VyZSk7Ci0KLSAgICBSZWN0YW5nbGVGaWd1cmUgbGluZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKQotICAgIHsKLSAgICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCkKLSAgICAgIHsKLSAgICAgICAgRGltZW5zaW9uIGQgPSBzdXBlci5nZXRQcmVmZXJyZWRTaXplKHdIaW50LCBoSGludCk7Ci0gICAgICAgIGQuaGVpZ2h0ID0gMTsKLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBUb29sYmFyTGF5b3V0IGxpbmVMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgbGluZUxheW91dC5zZXRWZXJ0aWNhbCh0cnVlKTsKLSAgICBsaW5lTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgbGluZS5zZXRMYXlvdXRNYW5hZ2VyKGxpbmVMYXlvdXQpOwotICAgIG91dGVyLmFkZChsaW5lKTsKLQotICAgIGNvbnRlbnRGaWd1cmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgY29udGVudEZpZ3VyZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig0KSk7Ci0gICAgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KDQpOwotICAgIGNvbnRlbnRGaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihmaWxsTGF5b3V0KTsKLQotICAgIG91dGVyLmFkZChjb250ZW50RmlndXJlKTsKLSAgICByZXR1cm4gb3V0ZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIFhTRFNjaGVtYUFkYXB0ZXIgc2NoZW1hQWRhcHRlciA9IChYU0RTY2hlbWFBZGFwdGVyKSBnZXRNb2RlbCgpOwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotLy8gQnVnIDEwMzg3MDogdW5kbyBibGFua3Mgb3V0IHNjaGVtYSB2aWV3ICAgIAotLy8gICAgc2NoZW1hQWRhcHRlci51cGRhdGVDYXRlZ29yaWVzKCk7Ci0KLSAgICBMaXN0IHRlbXBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHRlbXBsaXN0LmFkZChzY2hlbWFBZGFwdGVyLmdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5ESVJFQ1RJVkVTKSk7Ci0gICAgSG9sZGVyIGhvbGRlciA9IG5ldyBIb2xkZXIodGVtcGxpc3QpOwotICAgIGxpc3QuYWRkKGhvbGRlcik7Ci0KLSAgICB0ZW1wbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB0ZW1wbGlzdC5hZGQoc2NoZW1hQWRhcHRlci5nZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuRUxFTUVOVFMpKTsKLSAgICB0ZW1wbGlzdC5hZGQoc2NoZW1hQWRhcHRlci5nZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuVFlQRVMpKTsKLSAgICBob2xkZXIgPSBuZXcgSG9sZGVyKHRlbXBsaXN0KTsKLSAgICBsaXN0LmFkZChob2xkZXIpOwotCi0gICAgdGVtcGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdGVtcGxpc3QuYWRkKHNjaGVtYUFkYXB0ZXIuZ2V0Q2F0ZWdvcnkoQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVMpKTsKLSAgICB0ZW1wbGlzdC5hZGQoc2NoZW1hQWRhcHRlci5nZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTKSk7Ci0gICAgaG9sZGVyID0gbmV3IEhvbGRlcih0ZW1wbGlzdCk7Ci0gICAgbGlzdC5hZGQoaG9sZGVyKTsKLQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUNoaWxkKE9iamVjdCBtb2RlbCkKLSAgewotICAgIENhdGVnb3J5Um93RWRpdFBhcnQgcmVzdWx0ID0gbmV3IENhdGVnb3J5Um93RWRpdFBhcnQoKTsKLSAgICByZXN1bHQuc2V0TW9kZWwobW9kZWwpOwotICAgIHJlc3VsdC5zZXRQYXJlbnQodGhpcyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgCi0gICAgTGluZUJvcmRlciBib3JkZXIgPSAoTGluZUJvcmRlcikgb3V0ZXIuZ2V0Qm9yZGVyKCk7Ci0gICAgYm9yZGVyLnNldFdpZHRoKGlzU2VsZWN0ZWQgPyAyIDogMSk7Ci0gICAgaGVhZGluZ0ZpZ3VyZS5zZXRTZWxlY3RlZChpc1NlbGVjdGVkKTsKLQotICAgIFhTRFNjaGVtYUFkYXB0ZXIgc2NoZW1hQWRhcHRlciA9IChYU0RTY2hlbWFBZGFwdGVyKSBnZXRNb2RlbCgpOwotICAgIEltYWdlIGltYWdlID0gc2NoZW1hQWRhcHRlci5nZXRJbWFnZSgpOwotICAgIGhlYWRpbmdGaWd1cmUuZ2V0TGFiZWwoKS5zZXRJY29uKGltYWdlKTsKLSAgICBpZiAoaW1hZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBoZWFkaW5nRmlndXJlLmdldExhYmVsKCkuc2V0SWNvbihYU0RDb21tb25VSVV0aWxzLmdldFVwZGF0ZWRJbWFnZSgoWFNEQ29uY3JldGVDb21wb25lbnQpIHNjaGVtYUFkYXB0ZXIuZ2V0VGFyZ2V0KCksIGltYWdlLCBmYWxzZSkpOwotICAgIH0KLSAgICBvdXRlci5yZXBhaW50KCk7Ci0gICAgCi0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZVZhbHVlID0gKChYU0RTY2hlbWEpICgoWFNEU2NoZW1hQWRhcHRlcikgZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCkpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIHRhcmdldE5hbWVzcGFjZVZhbHVlID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKHRhcmdldE5hbWVzcGFjZVZhbHVlKTsKLQotICAgIGlmICh0YXJnZXROYW1lc3BhY2VWYWx1ZSA9PSBudWxsIHx8IHRhcmdldE5hbWVzcGFjZVZhbHVlLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgdGFyZ2V0TmFtZXNwYWNlVmFsdWUgPSBNZXNzYWdlcy5fVUlfR1JBUEhfWFNEU0NIRU1BX05PX05BTUVTUEFDRTsKLSAgICB9Ci0gICAgaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLnNldFRleHQoTWVzc2FnZXMuX1VJX0dSQVBIX1hTRFNDSEVNQSArICIgOiAiICsgdGFyZ2V0TmFtZXNwYWNlVmFsdWUpOyAgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2F0ZWdvcnlFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSAoQ2F0ZWdvcnlBZGFwdGVyKWVkaXRQYXJ0LmdldE1vZGVsKCk7ICAgIAotICAgICAgICBzd2l0Y2ggKGFkYXB0ZXIuZ2V0R3JvdXBUeXBlKCkpCi0gICAgICAgIHsgCi0gICAgICAgICAgY2FzZSBDYXRlZ29yeUFkYXB0ZXIuRElSRUNUSVZFUzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBnZXRDYXRlZ29yeUVkaXRQYXJ0KENhdGVnb3J5QWRhcHRlci5FTEVNRU5UUyk7Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIENhdGVnb3J5QWRhcHRlci5FTEVNRU5UUzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBnZXRDYXRlZ29yeUVkaXRQYXJ0KENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgIAotICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBnZXRDYXRlZ29yeUVkaXRQYXJ0KENhdGVnb3J5QWRhcHRlci5ESVJFQ1RJVkVTKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBDYXRlZ29yeUFkYXB0ZXIuVFlQRVM6Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0Q2F0ZWdvcnlFZGl0UGFydChDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgIAotICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBnZXRDYXRlZ29yeUVkaXRQYXJ0KENhdGVnb3J5QWRhcHRlci5ESVJFQ1RJVkVTKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBicmVhazsgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTOiAgICAgIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGdldENhdGVnb3J5RWRpdFBhcnQoQ2F0ZWdvcnlBZGFwdGVyLkVMRU1FTlRTKTsKLSAgICAgICAgICAgIH0gICAgCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9ICAgCi0gICAgICAgICAgY2FzZSBDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTOiAgICAgIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGdldENhdGVnb3J5RWRpdFBhcnQoQ2F0ZWdvcnlBZGFwdGVyLlRZUEVTKTsKLSAgICAgICAgICAgIH0gICAgCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfSAKLSAgICAgIGVsc2UgaWYgKGVkaXRQYXJ0ID09IHRoaXMpCi0gICAgICB7ICAgICAgIAotICAgICAgICBpZiAoZGlyZWN0aW9uID09IEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuSU5fVE9fRklSU1RfQ0hJTEQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAoKENhdGVnb3J5Um93RWRpdFBhcnQpZ2V0Q2hpbGRyZW4oKS5nZXQoMCkpLmRvR2V0UmVsYXRpdmVFZGl0UGFydChlZGl0UGFydCwgZGlyZWN0aW9uKTsgICAgICAgIAotICAgICAgICB9ICAgICAgICAgIAotICAgICAgfSAgCi0gICAgICByZXR1cm4gcmVzdWx0OyAgICAgICAgICAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZ2V0Q2F0ZWdvcnlFZGl0UGFydChpbnQga2luZCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaiA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7ICkgICAgICAKLSAgICB7ICAgIAotICAgICAgRWRpdFBhcnQgcm93ID0gKEVkaXRQYXJ0KWoubmV4dCgpOyAgICAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJvdy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXRlZ29yeUVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgQ2F0ZWdvcnlFZGl0UGFydCBjYXRlZ29yeUVkaXRQYXJ0ID0gKENhdGVnb3J5RWRpdFBhcnQpZWRpdFBhcnQ7Ci0gICAgICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSAoQ2F0ZWdvcnlBZGFwdGVyKWNhdGVnb3J5RWRpdFBhcnQuZ2V0TW9kZWwoKTsKLSAgICAgICAgICBpZiAoYWRhcHRlci5nZXRHcm91cFR5cGUoKSA9PSBraW5kKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlZGl0UGFydDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG5ldyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwoKSk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRlclRleHQoKQotICB7Ci0JICByZXR1cm4gaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLmdldFN1YlN0cmluZ1RleHQoKTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIGNsYXNzIEhvbGRlcgotICB7Ci0gICAgTGlzdCBsaXN0OwotCi0gICAgcHVibGljIEhvbGRlcihMaXN0IGxpc3QpCi0gICAgewotICAgICAgdGhpcy5saXN0ID0gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRMaXN0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgQ2F0ZWdvcnlSb3dFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotICB7Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7Ci0gICAgcHJvdGVjdGVkIEZpZ3VyZSBjb250ZW50UGFuZTsKLQotICAgIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gICAgewotICAgICAgRmlndXJlIGNvbnRhaW5lckZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICAgIGNvbnRhaW5lckZpZ3VyZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig0LCA0LCA0LCA0KSk7Ci0gICAgICAvLyBjb250YWluZXJGaWd1cmUuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKDEpKTsKLSAgICAgIC8vIGNvbnRhaW5lckZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuZ3JlZW4pOwotCi0gICAgICBGaWxsTGF5b3V0IGZpbGxMYXlvdXQgPSBuZXcgRmlsbExheW91dCg0KTsKLSAgICAgIGZpbGxMYXlvdXQuc2V0SG9yaXpvbnRhbCh0cnVlKTsKLSAgICAgIGNvbnRhaW5lckZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKGZpbGxMYXlvdXQpOwotICAgICAgCi0gICAgICByZXR1cm4gY29udGFpbmVyRmlndXJlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICAgIHsKLSAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhdGVnb3J5RWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5PVVRfVE9fUEFSRU5UKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgICAgZWxzZSBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LklOX1RPX0ZJUlNUX0NISUxEKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIChFZGl0UGFydClnZXRDaGlsZHJlbigpLmdldCgwKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICAgIHJldHVybiAoKFhTRFNjaGVtYUVkaXRQYXJ0KWdldFBhcmVudCgpKS5kb0dldFJlbGF0aXZlRWRpdFBhcnQoZWRpdFBhcnQsIGRpcmVjdGlvbik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQjZ2V0Q29udGVudFBhbmUoKQotICAgICAqLwotICAgIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgICB7Ci0gICAgICBIb2xkZXIgaG9sZGVyID0gKEhvbGRlcikgZ2V0TW9kZWwoKTsKLSAgICAgIHJldHVybiBob2xkZXIuZ2V0TGlzdCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gICAgewotICAgICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0YWJsZSgpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTRFNpbXBsZVR5cGVFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RTaW1wbGVUeXBlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1Yjg3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTRFNpbXBsZVR5cGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hbmhhdHRhbkNvbm5lY3Rpb25Sb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNvbHVtbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFREaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklTdHJ1Y3R1cmVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuSGVhZGluZ0ZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLlJvdW5kZWRMaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuU3RydWN0dXJlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTRFNpbXBsZVR5cGVFZGl0UGFydCBleHRlbmRzIEJhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBTdHJ1Y3R1cmVGaWd1cmUgZmlndXJlOwotICBwcm90ZWN0ZWQgQURURGlyZWN0RWRpdFBvbGljeSBhZHREaXJlY3RFZGl0UG9saWN5ID0gbmV3IEFEVERpcmVjdEVkaXRQb2xpY3koKTsKLSAgCi0gIHB1YmxpYyBYU0RTaW1wbGVUeXBlRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgcHVibGljIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGdldFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgZmlndXJlID0gbmV3IFN0cnVjdHVyZUZpZ3VyZSgpOwotICAgIGZpZ3VyZS5zZXRCb3JkZXIobmV3IFJvdW5kZWRMaW5lQm9yZGVyKDEsIDEwKSk7ICAgIAotICAgIFRvb2xiYXJMYXlvdXQgdG9vbGJhckxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KCk7Ci0gICAgdG9vbGJhckxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcilnZXRNb2RlbCgpOwotICAgIFN0cmluZyBuYW1lID0gYWRhcHRlci5nZXREaXNwbGF5TmFtZSgpOwotICAgIEhlYWRpbmdGaWd1cmUgaGVhZGluZ0ZpZ3VyZSA9IGZpZ3VyZS5nZXRIZWFkaW5nRmlndXJlKCk7Ci0gICAgaGVhZGluZ0ZpZ3VyZS5zZXRJc1JlYWRPbmx5KGFkYXB0ZXIuaXNSZWFkT25seSgpKTsKLSAgICBMYWJlbCBsYWJlbCA9IGhlYWRpbmdGaWd1cmUuZ2V0TGFiZWwoKTsKLSAgICBsYWJlbC5zZXRUZXh0KG5hbWUpOwotICAgIGxhYmVsLnNldEljb24oWFNEQ29tbW9uVUlVdGlscy5nZXRVcGRhdGVkSW1hZ2UoYWRhcHRlci5nZXRYU0RUeXBlRGVmaW5pdGlvbigpLCBhZGFwdGVyLmdldEltYWdlKCksIGFkYXB0ZXIuaXNSZWFkT25seSgpKSk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgSVN0cnVjdHVyZUZpZ3VyZSBnZXRTdHJ1Y3R1cmVGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIChJU3RydWN0dXJlRmlndXJlKWdldEZpZ3VyZSgpOwotICB9Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIGdldFN0cnVjdHVyZUZpZ3VyZSgpLmdldENvbnRlbnRQYW5lKCk7Ci0gIH0KLSAgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3IEFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeSgpKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsIGFkdERpcmVjdEVkaXRQb2xpY3kpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgZ2V0U3RydWN0dXJlRmlndXJlKCkuYWRkU2VsZWN0aW9uRmVlZGJhY2soKTsKLSAgICBzdXBlci5hZGRGZWVkYmFjaygpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5yZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpOwotICAgIHN1cGVyLnJlbW92ZUZlZWRiYWNrKCk7ICAgIAotICB9Ci0KLSAgcHVibGljIFJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZShCYXNlRWRpdFBhcnQgY2hpbGQpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpCi0gIHsKLSAgICBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlID0gbnVsbDsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpZ2V0TW9kZWwoKTsKLSAgICBJVHlwZSBzdXBlclR5cGUgPSBhZGFwdGVyLmdldFN1cGVyVHlwZSgpOwotCi0gICAgaWYgKHN1cGVyVHlwZSAhPSBudWxsKQotICAgIHsgICAgICAKLSAgICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmVmZXJlbmNlVHlwZVBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClnZXRUYXJnZXRFZGl0UGFydChzdXBlclR5cGUpOwotICAgICAgCi0gICAgICBpZiAocmVmZXJlbmNlVHlwZVBhcnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZSA9IG5ldyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbih0cnVlKTsKLSAgICAgICAgLy8gZHJhdyBhIGxpbmUgb3V0IGZyb20gdGhlIHRvcCAgICAgICAgIAotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldFNvdXJjZUFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKGdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuVE9QLCAxKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUT0RPIChjcykgbmVlZCB0byBkcmF3IHRoZSB0YXJnZXQgYW5jaG9yIHRvIGxvb2sgbGlrZSBhIFVNTCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXAKLSAgICAgICAgLy8gYWRkaW5nIGEgbGFiZWwgdG8gdGhlIGNvbm5lY3Rpb24gd291bGQgaGVscCB0bwotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKHJlZmVyZW5jZVR5cGVQYXJ0LmdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuQk9UVE9NLCAwLCAwKSk7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0Q29ubmVjdGlvblJvdXRlcihuZXcgTWFuaGF0dGFuQ29ubmVjdGlvblJvdXRlcigpKTsKLSAgICAgICAgKChDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IpY29ubmVjdGlvbkZpZ3VyZS5nZXRTb3VyY2VBbmNob3IoKSkuc2V0T3RoZXIoKENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvciljb25uZWN0aW9uRmlndXJlLmdldFRhcmdldEFuY2hvcigpKTsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotCi0gICAgICB9Ci0gICAgfSAgICAKLSAgICByZXR1cm4gY29ubmVjdGlvbkZpZ3VyZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KElUeXBlIHR5cGUpCi0gIHsKLSAgICBDb2x1bW5FZGl0UGFydCBjb2x1bW5FZGl0UGFydCA9IG51bGw7Ci0gICAgZm9yIChFZGl0UGFydCBlZGl0UGFydCA9IHRoaXM7IGVkaXRQYXJ0ICE9IG51bGw7IGVkaXRQYXJ0ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCkpCi0gICAgewotICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29sdW1uRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGNvbHVtbkVkaXRQYXJ0ID0gKENvbHVtbkVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgICBicmVhazsKLSAgICAgIH0gIAotICAgIH0gICAgIAotICAgIGlmIChjb2x1bW5FZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbHVtbkVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChjaGlsZC5nZXRNb2RlbCgpID09IHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gY2hpbGQ7Ci0gICAgICAgIH0gICAgICAgICAKLSAgICAgIH0gIAotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkKLSAgeyAgCi0gICAgaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX09QRU4pCi0gICAgewotICAgICAgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLSAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KQotICAgICAgewotICAgICAgICBMb2NhdGlvblJlcXVlc3QgbG9jYXRpb25SZXF1ZXN0ID0gKExvY2F0aW9uUmVxdWVzdClyZXF1ZXN0OwotICAgICAgICBQb2ludCBwID0gbG9jYXRpb25SZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAKLSAgICAgICAgaWYgKGdldFN0cnVjdHVyZUZpZ3VyZSgpLmhpdFRlc3RIZWFkZXIocCkpCi0gICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgLy8gVE9ETzogISEhIFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBhZHQteHNkIHBhY2thZ2UKLSAgICAgICAgICAvLyAKLSAgICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpICAgICAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpbW9kZWw7Ci0gICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilhZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgIE9iamVjdCBzY2hlbWEgPSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKTsKLSAgICAgICAgICAgIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0RWRpdG9yQWN0aW9uUmVnaXN0cnkoZWRpdG9yUGFydCk7Ci0gICAgICAgICAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHNjaGVtYSA9PSBzdC5nZXRTY2hlbWEoKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElBY3Rpb24gYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgICAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgICAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRFZGl0b3JBY3Rpb25SZWdpc3RyeShJRWRpdG9yUGFydCBlZGl0b3IpCi0gIHsKLSAgICByZXR1cm4gKEFjdGlvblJlZ2lzdHJ5KSBlZGl0b3IuZ2V0QWRhcHRlcihBY3Rpb25SZWdpc3RyeS5jbGFzcyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREcmF3Q29ubmVjdGlvbigpCi0gIHsKLSAgICBpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIElUeXBlKQotICAgIHsKLSAgICAgIGlmICgoKElUeXBlKWdldE1vZGVsKCkpLmdldFN1cGVyVHlwZSgpICE9IG51bGwpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRlclRleHQoKQotICB7Ci0JICBIZWFkaW5nRmlndXJlIGhlYWRpbmdGaWd1cmUgPSBmaWd1cmUuZ2V0SGVhZGluZ0ZpZ3VyZSgpOwotCSAgcmV0dXJuIGhlYWRpbmdGaWd1cmUuZ2V0TGFiZWwoKS5nZXRUZXh0KCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9TcGFjZUZpbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9TcGFjZUZpbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGFiNzlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvU3BhY2VGaWxsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBEdW1teSBjbGFzcyB0byBhZGQgc3BhY2UgdG8gZmllbGQgbGlzdAotICoKLSAqLwotcHVibGljIGNsYXNzIFNwYWNlRmlsbGVyIGltcGxlbWVudHMgSUZpZWxkCi17Ci0gIFN0cmluZyBraW5kOwotICBwdWJsaWMgU3BhY2VGaWxsZXIoU3RyaW5nIGtpbmQpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgaWYgKGtpbmQuZXF1YWxzKCJhdHRyaWJ1dGUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREF0dHJpYnV0ZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERWxlbWVudC5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRLaW5kKCkKLSAgewotICAgIHJldHVybiBraW5kOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRLaW5kKFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIElDb21wbGV4VHlwZSBnZXRDb250YWluZXJUeXBlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZVF1YWxpZmllcigpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSVR5cGUgZ2V0VHlwZSgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1pbk9jY3VycygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1heE9jY3VycygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVNaW5PY2N1cnNDb21tYW5kKGludCBtaW5PY2N1cnMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVNYXhPY2N1cnNDb21tYW5kKGludCBtYXhPY2N1cnMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVUeXBlTmFtZUNvbW1hbmQoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgcXVhaWxpZmllcikKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU5hbWVDb21tYW5kKFN0cmluZyBuYW1lKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0KCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1RhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9UYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNlYWU1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1RhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlciBpbXBsZW1lbnRzIElBRFRPYmplY3QKLXsKLSAgcHJpdmF0ZSBYU0RCYXNlQWRhcHRlciBhZGFwdGVyOwotICAKLSAgcHVibGljIFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcihYU0RCYXNlQWRhcHRlciBhZGFwdGVyKQotICB7Ci0gICAgdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLSAgfQotCi0gIHB1YmxpYyBYU0RCYXNlQWRhcHRlciBnZXRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgIAotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL0RyYWdBbmREcm9wRWRpdFBvbGljeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9EcmFnQW5kRHJvcEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyZTNmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL0RyYWdBbmREcm9wRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQXR0cmlidXRlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5CYXNlRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuWFNEQXR0cmlidXRlRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNEQmFzZUZpZWxkRWRpdFBhcnQ7Ci0KLQotcHVibGljIGNsYXNzIERyYWdBbmREcm9wRWRpdFBvbGljeSBleHRlbmRzIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuR3JhcGhpY2FsRWRpdFBvbGljeQoteyAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0Vmlld2VyIHZpZXdlcjsKLSAgcHJvdGVjdGVkIFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeTsKLQotICBwdWJsaWMgRHJhZ0FuZERyb3BFZGl0UG9saWN5KEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KQotICB7Ci0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gICAgdGhpcy5zZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSA9IHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAKLSAgcHVibGljIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAgICAgICAgICAgIAotICAgIEJhc2VEcmFnQW5kRHJvcENvbW1hbmQgY29tbWFuZCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ2hhbmdlQm91bmRzUmVxdWVzdCkKLSAgICB7Ci0gICAgICBDaGFuZ2VCb3VuZHNSZXF1ZXN0IGNoYW5nZUJvdW5kc1JlcXVlc3QgPSAoQ2hhbmdlQm91bmRzUmVxdWVzdClyZXF1ZXN0OwotICAgICAgUG9pbnQgbG9jYXRpb24gPSBjaGFuZ2VCb3VuZHNSZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0gICAgICAKLSAgICAgIEdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldCA9IChHcmFwaGljYWxFZGl0UGFydCl2aWV3ZXIuZmluZE9iamVjdEF0KGxvY2F0aW9uKTsKLSAgICAgIGxvY2F0aW9uID0gZ2V0UG9pbnRlckxvY2F0aW9uKGNoYW5nZUJvdW5kc1JlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAoKEdyYXBoaWNhbEVkaXRQYXJ0KXZpZXdlci5nZXRSb290RWRpdFBhcnQoKSkuZ2V0RmlndXJlKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShsb2NhdGlvbik7Ci0KLSAgICAgIExpc3QgbGlzdCA9IGNoYW5nZUJvdW5kc1JlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0gICAgICAvLyBhbGxvdyBkcmFnIGFuZCBkcm9wIG9mIG9ubHkgb25lIHNlbGVjdGVkIG9iamVjdAotICAgICAgaWYgKGxpc3Quc2l6ZSgpID09IDEpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBpdGVtVG9EcmFnID0gbGlzdC5nZXQoMCk7Ci0gICAgICAgIGlmIChpdGVtVG9EcmFnIGluc3RhbmNlb2YgWFNEQmFzZUZpZWxkRWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RCYXNlRmllbGRFZGl0UGFydCBzZWxlY3RlZCA9IChYU0RCYXNlRmllbGRFZGl0UGFydCkgaXRlbVRvRHJhZzsKLSAgICAgICAgICBpZiAoc2VsZWN0ZWQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29tbWFuZCA9IG5ldyBYU0RFbGVtZW50RHJhZ0FuZERyb3BDb21tYW5kKHZpZXdlciwgKENoYW5nZUJvdW5kc1JlcXVlc3QpcmVxdWVzdCwgdGFyZ2V0LCBzZWxlY3RlZCwgbG9jYXRpb24pOwotICAgICAgICAgICAgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kuc2V0RHJhZ0FuZERyb3BDb21tYW5kKGNvbW1hbmQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChzZWxlY3RlZC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNEQmFzZUF0dHJpYnV0ZUFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29tbWFuZCA9IG5ldyBYU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQodmlld2VyLCAoQ2hhbmdlQm91bmRzUmVxdWVzdClyZXF1ZXN0LCB0YXJnZXQsIHNlbGVjdGVkLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeS5zZXREcmFnQW5kRHJvcENvbW1hbmQoY29tbWFuZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAKLSAgICByZXR1cm4gY29tbWFuZDsgICAgICAgICAgICAgCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotICBwcm90ZWN0ZWQgUG9pbnQgZ2V0UG9pbnRlckxvY2F0aW9uKFBvaW50IG9yaWdQb2ludGVyTG9jYXRpb24pCi0gIHsKLSAgICAgUG9pbnQgY29tcGVuc2F0ZWRMb2NhdGlvbiA9IG9yaWdQb2ludGVyTG9jYXRpb247Ci0gICAgIEZpZ3VyZUNhbnZhcyBmaWd1cmVDYW52YXMgPSAoRmlndXJlQ2FudmFzKSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotICAgICBpbnQgeU9mZnNldCA9IGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZlcnRpY2FsUmFuZ2VNb2RlbCgpLmdldFZhbHVlKCk7Ci0gICAgIGludCB4T2Zmc2V0ID0gZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0SG9yaXpvbnRhbFJhbmdlTW9kZWwoKS5nZXRWYWx1ZSgpOwotICAgICBjb21wZW5zYXRlZExvY2F0aW9uLnkgPSBjb21wZW5zYXRlZExvY2F0aW9uLnkgKyB5T2Zmc2V0OwotICAgICBjb21wZW5zYXRlZExvY2F0aW9uLnggPSBjb21wZW5zYXRlZExvY2F0aW9uLnggKyB4T2Zmc2V0OwotICAgICByZXR1cm4gY29tcGVuc2F0ZWRMb2NhdGlvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9HcmFwaE5vZGVEcmFnVHJhY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9HcmFwaE5vZGVEcmFnVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmIyMjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvR3JhcGhOb2RlRHJhZ1RyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRHJhZ0VkaXRQYXJ0c1RyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1wdWJsaWMgY2xhc3MgR3JhcGhOb2RlRHJhZ1RyYWNrZXIgZXh0ZW5kcyBEcmFnRWRpdFBhcnRzVHJhY2tlciAKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBFZGl0UGFydCBlZGl0UGFydDsgCi0gICAgICAgICAgIAotICBwdWJsaWMgR3JhcGhOb2RlRHJhZ1RyYWNrZXIoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsKLSAgICBzdXBlcihlZGl0UGFydCk7Ci0gICAgdGhpcy5lZGl0UGFydCA9IGVkaXRQYXJ0OwotICB9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKCkgCi0gIHsgCi0JICBSZXF1ZXN0IHJlcXVlc3QgPSBnZXRUYXJnZXRSZXF1ZXN0KCk7Ci0gICAgcmV0dXJuIGVkaXRQYXJ0LmdldENvbW1hbmQocmVxdWVzdCk7IAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtU2VsZWN0aW9uKCkKLSAgewotICAgIHBlcmZvcm1BZGRpdGlvbmFsU2VsZWN0aW9uKCk7Ci0gICAgc3VwZXIucGVyZm9ybVNlbGVjdGlvbigpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkaXRpb25hbFNlbGVjdGlvbigpCi0gIHsKLSAgICBFZGl0UGFydFZpZXdlciB2aWV3ZXIgPSBnZXRDdXJyZW50Vmlld2VyKCk7Ci0gICAgLy8gVGhpcyBjb2RlIHNlbGVjdHMgdGhlIGZpZWxkcyBpbi1iZXR3ZWVuIHRoZSBsYXN0IHNlbGVjdGVkIGZpZWxkIGFuZCB0aGUgbmV3bHkKLSAgICAvLyBzZWxlY3RlZCBmaWVsZCwgaWYgdGhlIHNoaWZ0IGtleSBpcyBoZWxkIGRvd24uICBOb3RlIHRoYXQgdGhlIHNlbGVjdGlvbiBsb2dpYwotICAgIC8vIGNhbiBiZSBpbXByb3ZlZCBzbyB0aGF0IGFscmVhZHkgc2VsZWN0ZWQgYnV0LCBhKSBpbmNvbXBhdGlibGUgZWRpdCBwYXJ0IGZpZ3VyZXMsIG9yIGIpCi0gICAgLy8gbGlrZS1lZGl0IHBhcnQgZmlndXJlcyBmcm9tIG90aGVyIHBhcmVudHMsIHNob3VsZCBiZSB1bnNlbGVjdGVkLgotICAgIGlmIChnZXRDdXJyZW50SW5wdXQoKS5pc1NoaWZ0S2V5RG93bigpKQotICAgIHsKLSAgICAgIC8vIFRoaXMgbGlzdCBjb250YWlucyB0aGUgZmllbGRzCi0gICAgICBMaXN0IGxpc3QgPSBlZGl0UGFydC5nZXRQYXJlbnQoKS5nZXRDaGlsZHJlbigpOwotICAgICAgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24KLSAgICAgIGludCBjdXJyZW50SW5kZXggPSBsaXN0LmluZGV4T2YoZWRpdFBhcnQpOwotICAgICAgLy8gTGlzdCBvZiBhbGwgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlZGl0IHBhcnRzCi0gICAgICBMaXN0IGN1cnJlbnRTZWxlY3RlZCA9IHZpZXdlci5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotICAgICAgaW50IHNpemUgPSBjdXJyZW50U2VsZWN0ZWQuc2l6ZSgpOwotICAgICAgaWYgKHNpemUgPiAwKQotICAgICAgewotICAgICAgICBPYmplY3QgbGFzdFNlbGVjdGVkID0gY3VycmVudFNlbGVjdGVkLmdldChzaXplIC0gMSk7Ci0gICAgICAgIGlmIChsYXN0U2VsZWN0ZWQgaW5zdGFuY2VvZiBCYXNlRWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBIZXJlLCB3ZSBkZXRlcm1pbmUgdGhlIHVwcGVyIGFuZCBsb3dlciBsaW1pdCBvZiB0aGUgaW5kaWNlcwotICAgICAgICAgIGludCBsb3dlckluZGV4ID0gLTEsIHVwcGVySW5kZXggPSAtMTsKLSAgICAgICAgICBpbnQgbGFzdFNlbGVjdGVkSW5kZXggPSBsaXN0LmluZGV4T2YobGFzdFNlbGVjdGVkKTsKLSAgICAgICAgICBpZiAobGFzdFNlbGVjdGVkSW5kZXggPj0gMCAmJiBsYXN0U2VsZWN0ZWRJbmRleCA8IGN1cnJlbnRJbmRleCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsb3dlckluZGV4ID0gbGFzdFNlbGVjdGVkSW5kZXg7Ci0gICAgICAgICAgICB1cHBlckluZGV4ID0gY3VycmVudEluZGV4OwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSBpZiAobGFzdFNlbGVjdGVkSW5kZXggPj0gMCAmJiBsYXN0U2VsZWN0ZWRJbmRleCA+IGN1cnJlbnRJbmRleCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsb3dlckluZGV4ID0gY3VycmVudEluZGV4OwotICAgICAgICAgICAgdXBwZXJJbmRleCA9IGxhc3RTZWxlY3RlZEluZGV4OwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobG93ZXJJbmRleCA+PSAwICYmIHVwcGVySW5kZXggPj0gMCkKLSAgICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxvd2VySW5kZXg7IGkgPCB1cHBlckluZGV4OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHZpZXdlci5hcHBlbmRTZWxlY3Rpb24oKEVkaXRQYXJ0KSBsaXN0LmdldChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19IApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjBiMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5CYXNlRHJhZ0FuZERyb3BDb21tYW5kOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsCWV4dGVuZHMgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5Ci17Ci0gIHByb3RlY3RlZCBJRmlndXJlIGZlZWRiYWNrOwotICBwcm90ZWN0ZWQgUmVjdGFuZ2xlIG9yaWdpbmFsTG9jYXRpb247Ci0gIHByb3RlY3RlZCBCYXNlRHJhZ0FuZERyb3BDb21tYW5kIGRyYWdBbmREcm9wQ29tbWFuZDsKLSAgcHJvdGVjdGVkIFBvbHlsaW5lIHBvbHlMaW5lOwotICBwcm90ZWN0ZWQgUmVjdGFuZ2xlRmlndXJlIGdob3N0U2hhcGU7Ci0KLSAgcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkKLSAgeyAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgaWYgKFJFUV9NT1ZFLmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpCi0gICAgeyAgCi0gICAgICByZXN1bHQgPSBmYWxzZTsgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzdXBlci51bmRlcnN0YW5kc1JlcXVlc3QocmVxdWVzdCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0KLSAgcHVibGljIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBudWxsOyAgCi0gIH0gICAKLQotICBwdWJsaWMgdm9pZCBzZXREcmFnQW5kRHJvcENvbW1hbmQoQmFzZURyYWdBbmREcm9wQ29tbWFuZCBkcmFnQW5kRHJvcENvbW1hbmQpCi0gIHsKLSAgICB0aGlzLmRyYWdBbmREcm9wQ29tbWFuZCA9IGRyYWdBbmREcm9wQ29tbWFuZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNob3dTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgICAKLSAgICAgIGVyYXNlQ2hhbmdlQm91bmRzRmVlZGJhY2sobnVsbCk7Ci0gICAgICBpZiAoZHJhZ0FuZERyb3BDb21tYW5kICE9IG51bGwgJiYgZHJhZ0FuZERyb3BDb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotICAgICAgICBpZiAoUkVRX01PVkUuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSB8fCBSRVFfQURELmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpIHsKLSAgICAgICAgICBpZiAoZHJhZ0FuZERyb3BDb21tYW5kICE9IG51bGwgJiYgZHJhZ0FuZERyb3BDb21tYW5kLmdldEZlZWRiYWNrRmlndXJlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZmVlZGJhY2sgPSBkcmFnQW5kRHJvcENvbW1hbmQuZ2V0RmVlZGJhY2tGaWd1cmUoKTsKLSAgICAgICAgICAgIGFkZEZlZWRiYWNrKGZlZWRiYWNrKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICB7Ci0JICBpZiAoZmVlZGJhY2sgIT0gbnVsbCkKLSAgICB7Ci0JCSAgcmVtb3ZlRmVlZGJhY2soZmVlZGJhY2spOwotCQkgIGZlZWRiYWNrID0gbnVsbDsKLQkgIH0KLQkgIGhpZGVGb2N1cygpOwotCSAgc3VwZXIuZGVhY3RpdmF0ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVyYXNlIGZlZWRiYWNrIGluZGljYXRpbmcgdGhhdCB0aGUgcmVjZWl2ZXIgb2JqZWN0IGlzIAotICAgKiBiZWluZyBkcmFnZ2VkLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBkcmFnIGlzCi0gICAqIGNvbXBsZXRlZCBvciBjYW5jZWxsZWQgb24gdGhlIHJlY2VpdmVyIG9iamVjdC4KLSAgICogQHBhcmFtIGRyYWdUcmFja2VyIG9yZy5lY2xpcHNlLmdlZi50b29scy5EcmFnVHJhY2tlciBUaGUgZHJhZyB0cmFja2VyIG9mIHRoZSB0b29sIHBlcmZvcm1pbmcgdGhlIGRyYWcuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBlcmFzZUNoYW5nZUJvdW5kc0ZlZWRiYWNrKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkgCi0gIHsKLQkgIGlmIChmZWVkYmFjayAhPSBudWxsKSAKLSAgICB7CQkgICAgICAKLQkJICByZW1vdmVGZWVkYmFjayhmZWVkYmFjayk7Ci0JICB9Ci0JICBmZWVkYmFjayA9IG51bGw7Ci0JICBvcmlnaW5hbExvY2F0aW9uID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBFcmFzZSBmZWVkYmFjayBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlY2VpdmVyIG9iamVjdCBpcyAKLSAgICogYmVpbmcgZHJhZ2dlZC4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgZHJhZyBpcwotICAgKiBjb21wbGV0ZWQgb3IgY2FuY2VsbGVkIG9uIHRoZSByZWNlaXZlciBvYmplY3QuCi0gICAqIEBwYXJhbSBkcmFnVHJhY2tlciBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRHJhZ1RyYWNrZXIgVGhlIGRyYWcgdHJhY2tlciBvZiB0aGUgdG9vbCBwZXJmb3JtaW5nIHRoZSBkcmFnLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXJhc2VTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIAotICB7Ci0gICAgaWYgKFJFUV9NT1ZFLmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkgfHwgIFJFUV9BREQuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkKLSAgICB7Ci0JCSAgZXJhc2VDaGFuZ2VCb3VuZHNGZWVkYmFjaygoQ2hhbmdlQm91bmRzUmVxdWVzdClyZXF1ZXN0KTsKLSAgICB9Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL1RvcExldmVsQ29tcG9uZW50TGFiZWxDZWxsRWRpdG9yTG9jYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9Ub3BMZXZlbENvbXBvbmVudExhYmVsQ2VsbEVkaXRvckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5NGE1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL1RvcExldmVsQ29tcG9uZW50TGFiZWxDZWxsRWRpdG9yTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQuTGFiZWxDZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLklOYW1lZEVkaXRQYXJ0OwotCi1wdWJsaWMgY2xhc3MgVG9wTGV2ZWxDb21wb25lbnRMYWJlbENlbGxFZGl0b3JMb2NhdG9yIGV4dGVuZHMgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcgotewotICBwdWJsaWMgVG9wTGV2ZWxDb21wb25lbnRMYWJlbENlbGxFZGl0b3JMb2NhdG9yKElOYW1lZEVkaXRQYXJ0IG5hbWVkRWRpdFBhcnQsIFBvaW50IGN1cnNvckxvY2F0aW9uKQotICB7Ci0gICAgc3VwZXIobmFtZWRFZGl0UGFydCwgY3Vyc29yTG9jYXRpb24pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKQotICB7Ci0gICAgVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCi0gICAgTGFiZWwgbGFiZWwgPSBuYW1lZEVkaXRQYXJ0LmdldE5hbWVMYWJlbEZpZ3VyZSgpOwotICAgIAotICAgIGlmICh0ZXh0LmdldEJvdW5kcygpLnggPD0gMCkKLSAgICB7Ci0gICAgICBzdXBlci5yZWxvY2F0ZShjZWxsZWRpdG9yKTsgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50IHNlbCA9IHRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQgcHJlZiA9IHRleHQuY29tcHV0ZVNpemUoLTEsIC0xKTsKLSAgICAgIFJlY3RhbmdsZSByZWN0ID0gbGFiZWwuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLSAgICAgIGxhYmVsLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0gICAgICB0ZXh0LnNldEJvdW5kcyhyZWN0LngsIHJlY3QueS0xLCByZWN0LndpZHRoLCBwcmVmLnkrMSk7Ci0gICAgICB0ZXh0LnNldFNlbGVjdGlvbigwKTsKLSAgICAgIHRleHQuc2V0U2VsZWN0aW9uKHNlbCk7IAotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9Ub3BMZXZlbE5hbWVEaXJlY3RFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9Ub3BMZXZlbE5hbWVEaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDkyNDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvVG9wTGV2ZWxOYW1lRGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuSU5hbWVkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgVG9wTGV2ZWxOYW1lRGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBEaXJlY3RFZGl0TWFuYWdlcgotewotICBwcm90ZWN0ZWQgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50OwotICBwcml2YXRlIElBY3Rpb25CYXJzIGFjdGlvbkJhcnM7Ci0gIHByaXZhdGUgQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXIgYWN0aW9uSGFuZGxlcjsKLSAgcHJpdmF0ZSBJQWN0aW9uIGNvcHksIGN1dCwgcGFzdGUsIHVuZG8sIHJlZG8sIGZpbmQsIHNlbGVjdEFsbCwgZGVsZXRlOwotICBwcml2YXRlIEZvbnQgc2NhbGVkRm9udDsKLQotICBwdWJsaWMgVG9wTGV2ZWxOYW1lRGlyZWN0RWRpdE1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBDZWxsRWRpdG9yTG9jYXRvciBsb2NhdG9yLCBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBzdXBlcihzb3VyY2UsIG51bGwsIGxvY2F0b3IpOwotICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oKQotICB7Ci0gICAgaWYgKGFjdGlvbkhhbmRsZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhY3Rpb25IYW5kbGVyLmRpc3Bvc2UoKTsKLSAgICAgIGFjdGlvbkhhbmRsZXIgPSBudWxsOwotICAgIH0KLSAgICBpZiAoYWN0aW9uQmFycyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3RvcmVTYXZlZEFjdGlvbnMoYWN0aW9uQmFycyk7Ci0gICAgICBhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgICAgIGFjdGlvbkJhcnMgPSBudWxsOwotICAgIH0KLQotICAgIEZvbnQgZGlzcG9zZUZvbnQgPSBzY2FsZWRGb250OwotICAgIHNjYWxlZEZvbnQgPSBudWxsOwotICAgIHN1cGVyLmJyaW5nRG93bigpOwotICAgIGlmIChkaXNwb3NlRm9udCAhPSBudWxsKQotICAgICAgZGlzcG9zZUZvbnQuZGlzcG9zZSgpOwotCi0gICAgaWYgKGdldEVkaXRQYXJ0KCkgaW5zdGFuY2VvZiBUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgIE9iamVjdCBhZGFwdGVyID0gZWRpdG9yLmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElTZWxlY3Rpb25Qcm92aWRlcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsID0gKElTZWxlY3Rpb25Qcm92aWRlcikgYWRhcHRlcjsKLSAgICAgICAgICAgIHNlbC5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9OwotICAgICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzaG93RmVlZGJhY2soKQotICB7Ci0gICAgc3VwZXIuc2hvd0ZlZWRiYWNrKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yT24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkKLSAgewotICAgIHJldHVybiBuZXcgVGV4dENlbGxFZGl0b3IoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULldSQVApOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdENlbGxFZGl0b3IoKQotICB7Ci0gICAgVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0gICAgTGFiZWwgbGFiZWwgPSAoKElOYW1lZEVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKS5nZXROYW1lTGFiZWxGaWd1cmUoKTsKLQotICAgIGlmIChsYWJlbCAhPSBudWxsKQotICAgIHsKLSAgICAgIHNjYWxlZEZvbnQgPSBsYWJlbC5nZXRGb250KCk7Ci0KLSAgICAgIENvbG9yIGNvbG9yID0gbGFiZWwuZ2V0QmFja2dyb3VuZENvbG9yKCk7Ci0gICAgICB0ZXh0LnNldEJhY2tncm91bmQoY29sb3IpOwotCi0gICAgICBTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9IGNvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICBnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUoaW5pdGlhbExhYmVsVGV4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzY2FsZWRGb250ID0gbGFiZWwuZ2V0UGFyZW50KCkuZ2V0Rm9udCgpOwotICAgICAgdGV4dC5zZXRCYWNrZ3JvdW5kKGxhYmVsLmdldFBhcmVudCgpLmdldEJhY2tncm91bmRDb2xvcigpKTsKLSAgICB9Ci0KLSAgICBGb250RGF0YSBkYXRhID0gc2NhbGVkRm9udC5nZXRGb250RGF0YSgpWzBdOwotICAgIERpbWVuc2lvbiBmb250U2l6ZSA9IG5ldyBEaW1lbnNpb24oMCwgZGF0YS5nZXRIZWlnaHQoKSk7Ci0gICAgbGFiZWwuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShmb250U2l6ZSk7Ci0gICAgZGF0YS5zZXRIZWlnaHQoZm9udFNpemUuaGVpZ2h0KTsKLSAgICBzY2FsZWRGb250ID0gbmV3IEZvbnQobnVsbCwgZGF0YSk7Ci0KLSAgICB0ZXh0LnNldEZvbnQoc2NhbGVkRm9udCk7Ci0gICAgLy8gdGV4dC5zZWxlY3RBbGwoKTsKLQotICAgIC8vIEhvb2sgdGhlIGNlbGwgZWRpdG9yJ3MgY29weS9wYXN0ZSBhY3Rpb25zIHRvIHRoZSBhY3Rpb25CYXJzIHNvIHRoYXQgdGhleQotICAgIC8vIGNhbgotICAgIC8vIGJlIGludm9rZWQgdmlhIGtleWJvYXJkIHNob3J0Y3V0cy4KLSAgICBhY3Rpb25CYXJzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLSAgICBzYXZlQ3VycmVudEFjdGlvbnMoYWN0aW9uQmFycyk7Ci0gICAgYWN0aW9uSGFuZGxlciA9IG5ldyBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlcihhY3Rpb25CYXJzKTsKLSAgICBhY3Rpb25IYW5kbGVyLmFkZENlbGxFZGl0b3IoZ2V0Q2VsbEVkaXRvcigpKTsKLSAgICBhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZXN0b3JlU2F2ZWRBY3Rpb25zKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpCi0gIHsKLSAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksIGNvcHkpOwotICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksIHBhc3RlKTsKLSAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUyNTA5Ci0gICAgLy8gRGVsZXRlIGFjdGlvbiAoa2V5KSBkb2Vzbid0IGFsd2F5cyB3b3JrLiAgVGhlIHNhdmVkIGFjdGlvbiBjb3VsZCBiZSB0aGUgCi0gICAgLy8gQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXIncyBEZWxldGVBY3Rpb25IYW5kbGVyLi4uZHVlIHRvIHRpbWluZyBpc3N1ZXMuCi0gICAgLy8gV2UnbGwgb25seSByZXN0b3JlIHRoZSBkZWxldGUgYWN0aW9uIGlmIGl0IGlzIGluZGVlZCB0aGUgb25lIGZvciB0aGUgRGVzaWduIHZpZXcuCi0gICAgLy8gV2Ugc2hvdWxkIHVwZGF0ZSB0aGUgb3RoZXIgYWN0aW9ucyB0b28sIGJ1dCBjdXJyZW50bHksIG5vbmUgYXJlIGFwcGxpY2FibGUuCi0gICAgaWYgKGRlbGV0ZSBpbnN0YW5jZW9mIEJhc2VTZWxlY3Rpb25BY3Rpb24pCi0gICAgewotICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksIGRlbGV0ZSk7Ci0gICAgfQotICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSwgc2VsZWN0QWxsKTsKLSAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwgY3V0KTsKLSAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5GSU5ELmdldElkKCksIGZpbmQpOwotICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwgdW5kbyk7Ci0gICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLCByZWRvKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzYXZlQ3VycmVudEFjdGlvbnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykKLSAgewotICAgIGNvcHkgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpOwotICAgIHBhc3RlID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSk7Ci0gICAgSUFjdGlvbiBjdXJyZW50RGVsZXRlQWN0aW9uID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTI1MDkKLSAgICAvLyBEZWxldGUgYWN0aW9uIChrZXkpIGRvZXNuJ3QgYWx3YXlzIHdvcmsuICBUaGUgc2F2ZWQgYWN0aW9uIGNvdWxkIGJlIHRoZSAKLSAgICAvLyBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlcidzIERlbGV0ZUFjdGlvbkhhbmRsZXIuLi5kdWUgdG8gdGltaW5nIGlzc3Vlcy4KLSAgICAvLyBXZSdsbCBvbmx5IHJlc3RvcmUgdGhlIGRlbGV0ZSBhY3Rpb24gaWYgaXQgaXMgaW5kZWVkIHRoZSBvbmUgZm9yIHRoZSBEZXNpZ24gdmlldy4KLSAgICAvLyBXZSBzaG91bGQgdXBkYXRlIHRoZSBvdGhlciBhY3Rpb25zIHRvbywgYnV0IGN1cnJlbnRseSwgbm9uZSBhcmUgYXBwbGljYWJsZS4KLSAgICBpZiAoY3VycmVudERlbGV0ZUFjdGlvbiBpbnN0YW5jZW9mIEJhc2VTZWxlY3Rpb25BY3Rpb24pCi0gICAgewotICAgICAgZGVsZXRlID0gY3VycmVudERlbGV0ZUFjdGlvbjsKLSAgICB9Ci0gICAgc2VsZWN0QWxsID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpKTsKLSAgICBjdXQgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSk7Ci0gICAgZmluZCA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSk7Ci0gICAgdW5kbyA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSk7Ci0gICAgcmVkbyA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSk7Ci0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0NhdGVnb3J5RmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9DYXRlZ29yeUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDEyNTM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0NhdGVnb3J5RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNjcm9sbFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlZpZXdwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5WaWV3cG9ydExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLkhlYWRpbmdGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5Sb3VuZGVkTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzLkZpbGxMYXlvdXQ7Ci0KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUZpZ3VyZSBleHRlbmRzIEZpZ3VyZQotewotICBwcm90ZWN0ZWQgU2Nyb2xsUGFuZSBzY3JvbGxwYW5lOwotICBwcm90ZWN0ZWQgRmlndXJlIG91dGVyUGFuZTsKLSAgcHVibGljIEhlYWRpbmdGaWd1cmUgaGVhZGluZ0ZpZ3VyZTsKLSAgRmlndXJlIGNvbnRlbnRQYW5lOwotCi0gIHB1YmxpYyBDYXRlZ29yeUZpZ3VyZShpbnQgdHlwZSkKLSAgewotICAgIHN1cGVyKCk7Ci0KLSAgICBvdXRlclBhbmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgb3V0ZXJQYW5lLnNldEJvcmRlcihuZXcgUm91bmRlZExpbmVCb3JkZXIoMSwgNikpOwotCi0gICAgVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgbGF5b3V0LnNldFZlcnRpY2FsKHRydWUpOwotICAgIGxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KDMpOwotICAgIGZpbGxMYXlvdXQuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0KLSAgICBGaWxsTGF5b3V0IG91dGVyTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKTsKLSAgICBvdXRlclBhbmUuc2V0TGF5b3V0TWFuYWdlcihvdXRlckxheW91dCk7Ci0KLSAgICBhZGQob3V0ZXJQYW5lKTsKLQotICAgIGhlYWRpbmdGaWd1cmUgPSBuZXcgSGVhZGluZ0ZpZ3VyZSgpOwotICAgIG91dGVyUGFuZS5hZGQoaGVhZGluZ0ZpZ3VyZSk7Ci0KLSAgICBGaWd1cmUgbGluZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBsaW5lLnNldEJvcmRlcihuZXcgTGluZUJvcmRlcigxKSk7Ci0gICAgVG9vbGJhckxheW91dCBsaW5lTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOwotICAgIGxpbmVMYXlvdXQuc2V0VmVydGljYWwodHJ1ZSk7Ci0gICAgbGluZUxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGxpbmUuc2V0TGF5b3V0TWFuYWdlcihsaW5lTGF5b3V0KTsKLSAgICBvdXRlclBhbmUuYWRkKGxpbmUpOwotCi0gICAgc2Nyb2xscGFuZSA9IG5ldyBTY3JvbGxQYW5lKCk7Ci0gICAgc2Nyb2xscGFuZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIHNjcm9sbHBhbmUuc2V0VmVydGljYWxTY3JvbGxCYXJWaXNpYmlsaXR5KFNjcm9sbFBhbmUuQVVUT01BVElDKTsKLSAgICBvdXRlclBhbmUuYWRkKHNjcm9sbHBhbmUpOwotCi0gICAgRmlndXJlIHBhbmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgcGFuZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig1LCA4LCA1LCA4KSk7Ci0gICAgVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOwotICAgIHRvb2xiYXJMYXlvdXQuc2V0U3BhY2luZygzKTsKLSAgICBwYW5lLnNldExheW91dE1hbmFnZXIodG9vbGJhckxheW91dCk7IC8vIGdvb2QKLQotICAgIFZpZXdwb3J0IHZpZXdwb3J0ID0gbmV3IFZpZXdwb3J0KCk7Ci0gICAgdmlld3BvcnQuc2V0Q29udGVudHNUcmFja3NIZWlnaHQodHJ1ZSk7Ci0gICAgVmlld3BvcnRMYXlvdXQgdmlld3BvcnRMYXlvdXQgPSBuZXcgVmlld3BvcnRMYXlvdXQoKTsKLSAgICB2aWV3cG9ydC5zZXRMYXlvdXRNYW5hZ2VyKHZpZXdwb3J0TGF5b3V0KTsKLQotICAgIHNjcm9sbHBhbmUuc2V0Vmlld3BvcnQodmlld3BvcnQpOwotICAgIHNjcm9sbHBhbmUuc2V0Q29udGVudHMocGFuZSk7Ci0gIH0KLQotICBwdWJsaWMgSGVhZGluZ0ZpZ3VyZSBnZXRIZWFkaW5nRmlndXJlKCkKLSAgewotICAgIHJldHVybiBoZWFkaW5nRmlndXJlOwotICB9Ci0KLSAgcHVibGljIFNjcm9sbFBhbmUgZ2V0U2Nyb2xsUGFuZSgpCi0gIHsKLSAgICByZXR1cm4gc2Nyb2xscGFuZTsKLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBzY3JvbGxwYW5lLmdldENvbnRlbnRzKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvQ2VudGVyZWRJY29uRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9DZW50ZXJlZEljb25GaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE3NzI4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9DZW50ZXJlZEljb25GaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlczsKLSAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5SZWZlcmVuY2VDb25uZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ2VudGVyZWRJY29uRmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZQoteyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNURUQgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT1ZFUiA9IDI7Ci0gIHB1YmxpYyBJbWFnZSBpbWFnZTsKLSAgcHJvdGVjdGVkIExhYmVsIHRvb2xUaXBMYWJlbDsKLSAgcHJvdGVjdGVkIGludCBtb2RlID0gMDsKLSAgCi0gIHB1YmxpYyBDZW50ZXJlZEljb25GaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRGaWxsKHRydWUpOyAgIAotICAgIHRvb2xUaXBMYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIHNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbig1LDUpKTsKLSAgfQotICAKLSAgcHVibGljIENlbnRlcmVkSWNvbkZpZ3VyZShJbWFnZSBpbWcpCi0gIHsKLSAgICB0aGlzKCk7Ci0gICAgdGhpcy5pbWFnZSA9IGltZzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICByZXBhaW50KCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIG91dGxpbmVTaGFwZShHcmFwaGljcyBncmFwaGljcykKLSAgewotICAgIGdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChtb2RlID09IE5PUk1BTCkKLSAgICAgIHsgLy8gVE9ETzogY29tbW9uIHVwIGFuZCBvcmdhbml6ZSBjb2xvcnMuLi4uCi0gICAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihSZWZlcmVuY2VDb25uZWN0aW9uLmluYWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChtb2RlID09IFNFTEVDVEVEKQotICAgICAgewotICAgICAgICBib29sZWFuIGhpZ2hDb250cmFzdCA9IGZhbHNlOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGhpZ2hDb250cmFzdCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEhpZ2hDb250cmFzdCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGlmIChoaWdoQ29udHJhc3QpCi0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgc3VwZXIub3V0bGluZVNoYXBlKGdyYXBoaWNzKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZmlsbFNoYXBlKEdyYXBoaWNzIGcpCi0gIHsgICAgCi0gICAgc3VwZXIuZmlsbFNoYXBlKGcpOwotICAgIGlmIChpbWFnZSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpOwotICAgICAgRGltZW5zaW9uIGltYWdlU2l6ZSA9IG5ldyBEaW1lbnNpb24oMTUsIDE1KTsKLSAgICAgIGcuZHJhd0ltYWdlKGltYWdlLCByLnggKyAoci53aWR0aCAtIGltYWdlU2l6ZS53aWR0aCkvMiwgci55ICsgKHIuaGVpZ2h0IC0gaW1hZ2VTaXplLmhlaWdodCkvMiAtIDEpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBnZXRUb29sVGlwTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIHRvb2xUaXBMYWJlbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TW9kZShpbnQgbW9kZSkKLSAgewotICAgIHRoaXMubW9kZSA9IG1vZGU7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRleHQpCi0gIHsKLSAgICBpZiAodGV4dC5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgc2V0VG9vbFRpcCh0b29sVGlwTGFiZWwpOwotICAgICAgdG9vbFRpcExhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRUb29sVGlwKG51bGwpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvR2VuZXJpY0dyb3VwRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9HZW5lcmljR3JvdXBGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxMTdjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9HZW5lcmljR3JvdXBGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24ubGF5b3V0cy5Nb2RlbEdyb3VwTGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0dyb3VwRmlndXJlIGV4dGVuZHMgRmlndXJlCi17Ci0gIHByb3RlY3RlZCBDZW50ZXJlZEljb25GaWd1cmUgY2VudGVyZWRJY29uRmlndXJlOwotICBwcm90ZWN0ZWQgRmlndXJlIGNvbnRlbnRGaWd1cmU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGV4dDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzVGV4dCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgTGFiZWwgdGV4dEZpZ3VyZTsKLSAgCi0gIHB1YmxpYyBHZW5lcmljR3JvdXBGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRMYXlvdXRNYW5hZ2VyKG5ldyBNb2RlbEdyb3VwTGF5b3V0KHRydWUpKTsKLSAgIAotICAgIGNlbnRlcmVkSWNvbkZpZ3VyZSA9IG5ldyBDZW50ZXJlZEljb25GaWd1cmUoKTsKLSAgICBjZW50ZXJlZEljb25GaWd1cmUuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDE1LCAxNSkpOwotCi0gICAgYWRkKGNlbnRlcmVkSWNvbkZpZ3VyZSk7Ci0gICAgY29udGVudEZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBjb250ZW50RmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IE1vZGVsR3JvdXBMYXlvdXQoZmFsc2UsIDApKTsKLSAgICBhZGQoY29udGVudEZpZ3VyZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpCi0gIHsKLSAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgIGhhc1RleHQgPSBmYWxzZTsKLSAgICBpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIGhhc1RleHQgPSB0cnVlOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gaGFzVGV4dDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIHJldHVybiB0ZXh0OwotICB9Ci0gIAotICBwdWJsaWMgUG9pbnQgZ2V0VGV4dENvb3JkaW5hdGVzKCkKLSAgewotICAgIFJlY3RhbmdsZSByZWN0ID0gY2VudGVyZWRJY29uRmlndXJlLmdldEJvdW5kcygpOwotICAgIHJldHVybiBuZXcgUG9pbnQocmVjdC54LCByZWN0LnkgKyAxNCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEljb25GaWd1cmUoSW1hZ2UgaW1hZ2UpCi0gIHsKLSAgICBjZW50ZXJlZEljb25GaWd1cmUuaW1hZ2UgPSBpbWFnZTsKLSAgfQotCi0gIHB1YmxpYyBDZW50ZXJlZEljb25GaWd1cmUgZ2V0VGFyZ2V0RmlndXJlKCkKLSAgewotICAgIHJldHVybiBjZW50ZXJlZEljb25GaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDZW50ZXJlZEljb25GaWd1cmUgZ2V0SWNvbkZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gY2VudGVyZWRJY29uRmlndXJlOwotICB9Ci0gIAotICBwdWJsaWMgRmlndXJlIGdldENvbnRlbnRGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnRGaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyB0ZXh0KQotICB7Ci0gICAgY2VudGVyZWRJY29uRmlndXJlLnNldFRvb2xUaXBUZXh0KHRleHQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9IeXBlckxpbmtMYWJlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvSHlwZXJMaW5rTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRlZjI5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9IeXBlckxpbmtMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLXB1YmxpYyBjbGFzcyBIeXBlckxpbmtMYWJlbCBleHRlbmRzIExhYmVsCi17Ci0gIHByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKQotICB7Ci0gICAgc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOyAgIAotICAgIGdyYXBoaWNzLnNldEZvbnQoZ2V0Rm9udCgpKTsKLSAgICAgICAgCi0gICAgLy8gVE9ETyAoY3MpIHRoaXMgbG9va3VwIHRvIGZpbmQgIiA6IiBpcyBhIGhhY2sKLSAgICAvLyB0aGF0J3Mgc3BlY2lhbGl6ZWQgZm9yIGVsZW1lbnQgYW5kIHR5cGUgbGFiZWwgdGV4dAotICAgIC8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgVG9wTGV2ZWxDb21wb25lbnQgdXNlIHR3byBsYWJlbHMgaW4gdGhpcyBjYXNlCi0gICAgLy8gICAgCi0gICAgU3RyaW5nIHN0cmluZyA9IGdldFRleHQoKTsKLSAgICBpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZigiIDoiKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgfQotICAgIC8vIGVuZCBoYWNrCi0gICAgCi0gICAgUG9pbnQgcCA9IGdldFRleHRMb2NhdGlvbigpOyAgICAgIAotICAgIERpbWVuc2lvbiB0ZXh0U2l6ZSA9ICBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoc3RyaW5nLCBnZXRGb250KCkpOwotICAgIGludCB0ZXh0V2lkdGggPSB0ZXh0U2l6ZS53aWR0aDsKLSAgICBpbnQgdGV4dEhlaWdodCA9IHRleHRTaXplLmhlaWdodDsKLSAgICBpbnQgZGVzY2VudCA9IGdyYXBoaWNzLmdldEZvbnRNZXRyaWNzKCkuZ2V0RGVzY2VudCgpOwotICAgIGludCBsaW5lWSA9IGJvdW5kcy55ICsgcC55ICsgdGV4dEhlaWdodCAtIGRlc2NlbnQgKyAxOyAgICAgIAotICAgIGludCBsaW5lWCA9IGJvdW5kcy54ICsgcC54OwotICAgIGdyYXBoaWNzLmRyYXdMaW5lKGxpbmVYLCBsaW5lWSwgbGluZVggKyB0ZXh0V2lkdGgsIGxpbmVZKTsgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0lFeHRlbmRlZEZpZ3VyZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0lFeHRlbmRlZEZpZ3VyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwN2I1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9JRXh0ZW5kZWRGaWd1cmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklGaWd1cmVGYWN0b3J5OwotCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkgZXh0ZW5kcyBJRmlndXJlRmFjdG9yeQotewotICBJTW9kZWxHcm91cEZpZ3VyZSBjcmVhdGVNb2RlbEdyb3VwRmlndXJlKE9iamVjdCBtb2RlbCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9JTW9kZWxHcm91cEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvSU1vZGVsR3JvdXBGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmZjQyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9JTW9kZWxHcm91cEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JQURURmlndXJlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbEdyb3VwRmlndXJlIGV4dGVuZHMgSUFEVEZpZ3VyZQotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvTW9kZWxHcm91cEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvTW9kZWxHcm91cEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDA5OTMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL01vZGVsR3JvdXBGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEdyb3VwRmlndXJlIGV4dGVuZHMgR2VuZXJpY0dyb3VwRmlndXJlIGltcGxlbWVudHMgSU1vZGVsR3JvdXBGaWd1cmUKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBTRVFVRU5DRV9JQ09OX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L3NlcXVlbmNlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFNFUVVFTkNFX0lDT05fRElTQUJMRURfSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvc2VxdWVuY2VkaXNfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQ0hPSUNFX0lDT05fSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvY2hvaWNlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIENIT0lDRV9JQ09OX0RJU0FCTEVEX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L2Nob2ljZWRpc19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBTExfSUNPTl9JTUFHRSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9hbGxfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQUxMX0lDT05fRElTQUJMRURfSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvYWxsZGlzX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIE1vZGVsR3JvdXBGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEljb25GaWd1cmUoSW1hZ2UgaW1hZ2UpCi0gIHsKLSAgICBjZW50ZXJlZEljb25GaWd1cmUuaW1hZ2UgPSBpbWFnZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkZlZWRiYWNrKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGVkaXRQYXJ0QXR0YWNoZWQoRWRpdFBhcnQgb3duZXIpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoVmlzdWFscyhPYmplY3QgbW9kZWwpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViICAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9TcGFjaW5nRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9TcGFjaW5nRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNmE1NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvU3BhY2luZ0ZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBTcGFjaW5nRmlndXJlIGV4dGVuZHMgTGFiZWwKLXsKLSAgcHVibGljIFNwYWNpbmdGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgc2V0SWNvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL0RvdC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBzZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigzLCAwLCAzLCAwKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9sYXlvdXRzL0NvbnRhaW5lckxheW91dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2xheW91dHMvQ29udGFpbmVyTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMDk4MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2xheW91dHMvQ29udGFpbmVyTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmxheW91dHM7Ci0gICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuU3BhY2luZ0ZpZ3VyZTsKLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBDb250YWluZXJMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdExheW91dAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzSG9yaXpvbnRhbDsKLSAgcHJvdGVjdGVkIGludCBzcGFjaW5nID0gMDsKLSAgcHJvdGVjdGVkIGludCBib3JkZXIgPSAwOyAKLQotICBwdWJsaWMgQ29udGFpbmVyTGF5b3V0KCkKLSAgeyAKLSAgICB0aGlzKHRydWUsIDApOyAKLSAgfSAgICAgICAgICAgICAKLQotICBwdWJsaWMgQ29udGFpbmVyTGF5b3V0KGJvb2xlYW4gaXNIb3Jpem9udGFsLCBpbnQgc3BhY2luZykKLSAgewotICAgIHRoaXMuaXNIb3Jpem9udGFsID0gaXNIb3Jpem9udGFsOyAgIAotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWwoYm9vbGVhbiBpc0hvcml6b250YWwpCi0gIHsKLSAgICB0aGlzLmlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbDsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgc2V0U3BhY2luZyhpbnQgc3BhY2luZykKLSAgewotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNldEJvcmRlcihpbnQgYm9yZGVyKQotICB7Ci0gICAgdGhpcy5ib3JkZXIgPSBib3JkZXI7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCBpbnQgYWxpZ25GaWd1cmUoSUZpZ3VyZSBwYXJlbnQsIElGaWd1cmUgY2hpbGQpCi0gIHsgCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBjb250YWluZXIgCi0gICAqIGdpdmVuIGFzIGlucHV0LgotICAgKiAKLSAgICogQHBhcmFtIGZpZ3VyZSAgRmlndXJlIHdob3NlIHByZWZlcnJlZCBzaXplIGlzIHJlcXVpcmVkLgotICAgKiBAcmV0dXJuICBUaGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIHBhc3NlZCBGaWd1cmUuCi0gICAqIEBzaW5jZSAyLjAKLSAgICovCi0gIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZUhlbHBlcihJRmlndXJlIHBhcmVudCkKLSAgeyAKLSAgICBEaW1lbnNpb24JcHJlZmVycmVkID0gbmV3IERpbWVuc2lvbigpOwotICAJTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICBmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICB7Ci0JCSAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWNoaWxkcmVuLmdldChpKTsgICAgICAKLSAgICAKLSAgICAgIERpbWVuc2lvbgljaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JICAKLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7Ci0JCSAgICBwcmVmZXJyZWQud2lkdGggKz0gY2hpbGRTaXplLndpZHRoOwotCQkgICAgcHJlZmVycmVkLmhlaWdodCA9IE1hdGgubWF4KHByZWZlcnJlZC5oZWlnaHQsIGNoaWxkU2l6ZS5oZWlnaHQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAgCi0gICAgICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gY2hpbGRTaXplLmhlaWdodDsKLSAgICAgICAgcHJlZmVycmVkLndpZHRoID0gTWF0aC5tYXgocHJlZmVycmVkLndpZHRoLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgfQotCSAgfSAgIAotCi0gICAgaW50IGNoaWxkcmVuU2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLSAgICBpZiAoY2hpbGRyZW5TaXplID4gMSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkgICAgCi0gICAgICB7Ci0gICAgICAgIHByZWZlcnJlZC53aWR0aCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotCQkgICAgcHJlZmVycmVkLmhlaWdodCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfSAKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByZWZlcnJlZC53aWR0aCArPSBib3JkZXIgKiAyOwotICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gYm9yZGVyICogMjsKLQkgIHByZWZlcnJlZC53aWR0aCArPSBwYXJlbnQuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKTsKLQkgIHByZWZlcnJlZC5oZWlnaHQgKz0gcGFyZW50LmdldEluc2V0cygpLmdldEhlaWdodCgpOyAgICAgICAKLSAgCi0gIAlyZXR1cm4gcHJlZmVycmVkOwotICB9Ci0KLSAgcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gIHsgICAgCi0gICAgRGltZW5zaW9uCXByZWZlcnJlZCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vIEhlcmUgd2UgZW5zdXJlIHRoYXQgYW4gdW5leHBhbmRlZCBjb250YWluZXIgaXMgZ2l2ZW4gYSBzaXplIG9mICgwLDApCi0gICAgLy8KLS8vICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJRXhwYW5kYWJsZSkKLS8vICAgIHsKLS8vICAgICAgSUV4cGFuZGFibGUgZXhwYW5kYWJsZUZpZ3VyZSA9IChJRXhwYW5kYWJsZSlwYXJlbnQ7Ci0vLyAgICAgIGlmICghZXhwYW5kYWJsZUZpZ3VyZS5pc0V4cGFuZGVkKCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBwcmVmZXJyZWQgPSBuZXcgRGltZW5zaW9uKCk7IAotLy8gICAgICB9Ci0vLyAgICB9ICAgCi0gICAgCi0gICAgaWYgKHByZWZlcnJlZCA9PSBudWxsKQotICAgIHsKLQkgICAgcHJlZmVycmVkID0gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZUhlbHBlcihwYXJlbnQpOyAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHByZWZlcnJlZDsKLSAgfQotICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCBhZGp1c3RMYXlvdXRMb2NhdGlvbihJRmlndXJlIHBhcmVudCwgRGltZW5zaW9uIGRpbWVuc2lvbikKLSAgeyAgICAgCi0gIH0gICAKLQotICBwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBwYXJlbnQpCi0gIHsgICAgICAgCi0gIAlMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0gCi0gICAgaW50IHJ4ID0gMDsKLSAgICBEaW1lbnNpb24JZGltZW5zaW9uID0gbmV3IERpbWVuc2lvbigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQkgIGZvciAoaW50IGk9MDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKQotICAgIHsKLQkJICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpY2hpbGRyZW4uZ2V0KGkpOwotCQkgIERpbWVuc2lvbgljaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgeyAgIAotICAgICAgICBkaW1lbnNpb24uaGVpZ2h0ID0gTWF0aC5tYXgoZGltZW5zaW9uLmhlaWdodCwgY2hpbGRTaXplLmhlaWdodCk7Ci0gICAgICAgIHJ4ICs9IGNoaWxkU2l6ZS53aWR0aDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZGltZW5zaW9uLndpZHRoID0gTWF0aC5tYXgoZGltZW5zaW9uLndpZHRoLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgfQotICAgIH0KLQotCSAgLy9kaW1lbnNpb24ud2lkdGggKz0gcGFyZW50LmdldEluc2V0cygpLmxlZnQ7Ci0gICAgLy9kaW1lbnNpb24uaGVpZ2h0ICs9IHBhcmVudC5nZXRJbnNldHMoKS50b3A7Ci0KLSAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgIHsKLSAgICAgIGRpbWVuc2lvbi5oZWlnaHQgKz0gYm9yZGVyKjI7Ci0gICAgCWRpbWVuc2lvbi53aWR0aCArPSBib3JkZXI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkaW1lbnNpb24ud2lkdGggKz0gYm9yZGVyKjI7Ci0gICAgCWRpbWVuc2lvbi5oZWlnaHQgKz0gYm9yZGVyOwotICAgIH0KLSAgICBhZGp1c3RMYXlvdXRMb2NhdGlvbihwYXJlbnQsIGRpbWVuc2lvbik7ICAgIAotCi0gICAgZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWNoaWxkcmVuLmdldChpKTsKLQkgICAgRGltZW5zaW9uCWNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoKTsKLSAgICAgICAgCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgeyAgIAotICAgICAgICBpbnQgeSA9IC0xOyAKLSAgICAKLSAgICAgICAgeSA9IGFsaWduRmlndXJlKHBhcmVudCwgY2hpbGQpOwotICAgIAotICAgICAgICBpZiAoeSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICB5ID0gKGRpbWVuc2lvbi5oZWlnaHQgLSBjaGlsZFNpemUuaGVpZ2h0KSAvIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBSZWN0YW5nbGUgcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZShkaW1lbnNpb24ud2lkdGgsIHksIGNoaWxkU2l6ZS53aWR0aCwgY2hpbGRTaXplLmhlaWdodCk7Ci0gICAgICAgIHJlY3RhbmdsZS50cmFuc2xhdGUocGFyZW50LmdldENsaWVudEFyZWEoKS5nZXRMb2NhdGlvbigpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgIGNoaWxkLnNldEJvdW5kcyhyZWN0YW5nbGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAgICAgIGRpbWVuc2lvbi53aWR0aCArPSBjaGlsZFNpemUud2lkdGg7IAotICAgICAgICBkaW1lbnNpb24ud2lkdGggKz0gc3BhY2luZzsgICAgICAgCi0KLSAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgU3BhY2luZ0ZpZ3VyZSkKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICBpbnQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlID0gcGFyZW50LmdldENsaWVudEFyZWEoKS53aWR0aCAtIHJ4OwotICAgICAgICAgIGRpbWVuc2lvbi53aWR0aCArPSBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2U7Ci0gICAgICAgIH0gICAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBSZWN0YW5nbGUgcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgwLCBkaW1lbnNpb24uaGVpZ2h0LCBjaGlsZFNpemUud2lkdGgsIGNoaWxkU2l6ZS5oZWlnaHQpOwotCSAgICAgIHJlY3RhbmdsZS50cmFuc2xhdGUocGFyZW50LmdldENsaWVudEFyZWEoKS5nZXRMb2NhdGlvbigpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotCi0gICAgICAgIGNoaWxkLnNldEJvdW5kcyhyZWN0YW5nbGUpOyAgCi0gICAgICAgIGRpbWVuc2lvbi5oZWlnaHQgKz0gY2hpbGRTaXplLmhlaWdodDsKLSAgICAgICAgZGltZW5zaW9uLmhlaWdodCArPSBzcGFjaW5nOwotICAgICAgfQotCSAgfQkgICAgICAKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9GaWxsTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9GaWxsTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZmU4ZTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9sYXlvdXRzL0ZpbGxMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmxheW91dHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi1wdWJsaWMgY2xhc3MgRmlsbExheW91dCBleHRlbmRzIEFic3RyYWN0TGF5b3V0Ci17Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzSG9yaXpvbnRhbCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgaW50IHNwYWNpbmcgPSAwOwotICBwdWJsaWMgRGltZW5zaW9uIG1pbjsKLQotICBwdWJsaWMgRmlsbExheW91dCgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBGaWxsTGF5b3V0KGludCBzcGFjaW5nKQotICB7Ci0gICAgdGhpcy5zcGFjaW5nID0gc3BhY2luZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWwoYm9vbGVhbiBpc0hvcml6b250YWwpCi0gIHsKLSAgICB0aGlzLmlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbDsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBwcmVmZXJyZWQgc2l6ZSBvZiB0aGUgaW5wdXQgY29udGFpbmVyLiBUaGlzIGlzCi0gICAqIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkIG9mIHRoZSBjb250YWluZXIsIGFzIGFsbCBvdGhlciBjaGlsZHJlbiBmaXQKLSAgICogaW50byB0aGlzIHNpemUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlndXJlCi0gICAqICAgICAgICAgIENvbnRhaW5lciBmaWd1cmUgZm9yIHdoaWNoIHByZWZlcnJlZCBzaXplIGlzIHJlcXVpcmVkLgotICAgKiBAcmV0dXJuIFRoZSBwcmVmZXJyZWQgc2l6ZSBvZiB0aGUgaW5wdXQgZmlndXJlLgotICAgKi8KLQotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgewotICAgIERpbWVuc2lvbiBkID0gY2FsY3VsYXRlUHJlZmVycmVkQ2xpZW50QXJlYVNpemUoZmlndXJlKTsKLSAgICBkLmV4cGFuZChmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKSwgZmlndXJlLmdldEluc2V0cygpLmdldEhlaWdodCgpKTsKLSAgICBkLnVuaW9uKGdldEJvcmRlclByZWZlcnJlZFNpemUoZmlndXJlKSk7Ci0gICAgcmV0dXJuIGQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZENsaWVudEFyZWFTaXplKElGaWd1cmUgZmlndXJlKQotICB7Ci0gICAgRGltZW5zaW9uIGQgPSBuZXcgRGltZW5zaW9uKCk7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgaS5uZXh0KCk7Ci0gICAgICBEaW1lbnNpb24gY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBkLndpZHRoICs9IGNoaWxkU2l6ZS53aWR0aDsKLSAgICAgICAgZC5oZWlnaHQgPSBNYXRoLm1heChjaGlsZFNpemUuaGVpZ2h0LCBkLmhlaWdodCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGQuaGVpZ2h0ICs9IGNoaWxkU2l6ZS5oZWlnaHQ7Ci0gICAgICAgIGQud2lkdGggPSBNYXRoLm1heChjaGlsZFNpemUud2lkdGgsIGQud2lkdGgpOwotICAgICAgfQotICAgIH0KLQotICAgIGludCBjaGlsZHJlblNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0gICAgaWYgKGNoaWxkcmVuU2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkKLSAgICAgIHsKLSAgICAgICAgZC53aWR0aCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkLmhlaWdodCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChtaW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkLndpZHRoID0gTWF0aC5tYXgoZC53aWR0aCwgbWluLndpZHRoKTsKLSAgICAgIGQuaGVpZ2h0ID0gTWF0aC5tYXgoZC5oZWlnaHQsIG1pbi5oZWlnaHQpOwotICAgIH0KLSAgICByZXR1cm4gZDsKLSAgfQotCi0gIC8qCi0gICAqIFJldHVybnMgdGhlIG1pbmltdW0gc2l6ZSByZXF1aXJlZCBieSB0aGUgaW5wdXQgY29udGFpbmVyLiBUaGlzIGlzIHRoZSBzaXplCi0gICAqIG9mIHRoZSBsYXJnZXN0IGNoaWxkIG9mIHRoZSBjb250YWluZXIsIGFzIGFsbCBvdGhlciBjaGlsZHJlbiBmaXQgaW50byB0aGlzCi0gICAqIHNpemUuCi0gICAqLwotICBwdWJsaWMgRGltZW5zaW9uIGdldE1pbmltdW1TaXplKElGaWd1cmUgZmlndXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gIHsKLSAgICBEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oKTsKLSAgICBMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0gICAgSUZpZ3VyZSBjaGlsZDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgY2hpbGQgPSAoSUZpZ3VyZSkgY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgZC51bmlvbihjaGlsZC5nZXRNaW5pbXVtU2l6ZSgpKTsKLSAgICB9Ci0gICAgZC5leHBhbmQoZmlndXJlLmdldEluc2V0cygpLmdldFdpZHRoKCksIGZpZ3VyZS5nZXRJbnNldHMoKS5nZXRIZWlnaHQoKSk7Ci0gICAgcmV0dXJuIGQ7Ci0gIH0KLQotICBwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgewotICAgIHJldHVybiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKGZpZ3VyZSwgd2lkdGgsIGhlaWdodCk7Ci0gIH0KLQotICAvKgotICAgKiBMYXlzIG91dCB0aGUgY2hpbGRyZW4gb24gdG9wIG9mIGVhY2ggb3RoZXIgd2l0aCB0aGVpciBzaXplcyBlcXVhbCB0byB0aGF0Ci0gICAqIG9mIHRoZSBhdmFpbGFibGUgcGFpbnRhYmxlIGFyZWEgb2YgdGhlIGlucHV0IGNvbnRhaW5lciBmaWd1cmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBmaWd1cmUpCi0gIHsKLSAgICBEaW1lbnNpb24gcHJlZmVycmVkU2l6ZSA9IGNhbGN1bGF0ZVByZWZlcnJlZENsaWVudEFyZWFTaXplKGZpZ3VyZSk7Ci0gICAgUmVjdGFuZ2xlIHIgPSBmaWd1cmUuZ2V0Q2xpZW50QXJlYSgpLmdldENvcHkoKTsKLSAgICBMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0KLSAgICBpbnQgbkNoaWxkcmVuID0gY2hpbGRyZW4uc2l6ZSgpOwotICAgIGludCBleHRyYUhvcml6b250YWxTcGFjZSA9IHIud2lkdGggLSBwcmVmZXJyZWRTaXplLndpZHRoOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgaS5uZXh0KCk7Ci0gICAgICBEaW1lbnNpb24gcHJlZmVycmVkQ2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBpbnQgdyA9IHByZWZlcnJlZENoaWxkU2l6ZS53aWR0aCArIChleHRyYUhvcml6b250YWxTcGFjZSAvIG5DaGlsZHJlbik7Ci0gICAgICAgIGNoaWxkLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKHIueCwgci55LCB3LCBNYXRoLm1heChwcmVmZXJyZWRTaXplLmhlaWdodCwgci5oZWlnaHQpKSk7Ci0gICAgICAgIHIueCArPSB3ICsgc3BhY2luZzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2hpbGQuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoci54LCByLnksIE1hdGgubWF4KHByZWZlcnJlZFNpemUud2lkdGgsIHIud2lkdGgpLCBwcmVmZXJyZWRDaGlsZFNpemUuaGVpZ2h0KSk7Ci0gICAgICAgIHIueSArPSBwcmVmZXJyZWRDaGlsZFNpemUuaGVpZ2h0ICsgc3BhY2luZzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9Nb2RlbEdyb3VwTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9Nb2RlbEdyb3VwTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNWEwY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2xheW91dHMvTW9kZWxHcm91cExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5Nb2RlbEdyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuU3BhY2luZ0ZpZ3VyZTsKLQotcHVibGljIGNsYXNzIE1vZGVsR3JvdXBMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdExheW91dAotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0hvcml6b250YWw7Ci0gIHByb3RlY3RlZCBpbnQgc3BhY2luZyA9IDEwOwotICBwcm90ZWN0ZWQgaW50IGJvcmRlciA9IDA7Ci0KLSAgcHVibGljIE1vZGVsR3JvdXBMYXlvdXQoKQotICB7Ci0gICAgdGhpcygwKTsKLSAgfQotCi0gIHB1YmxpYyBNb2RlbEdyb3VwTGF5b3V0KGJvb2xlYW4gaXNIb3Jpem9udGFsKQotICB7Ci0gICAgdGhpcy5pc0hvcml6b250YWwgPSBpc0hvcml6b250YWw7Ci0gIH0KLQotICBwdWJsaWMgTW9kZWxHcm91cExheW91dChib29sZWFuIGlzSG9yaXpvbnRhbCwgaW50IHNwYWNpbmcpCi0gIHsKLSAgICB0aGlzLmlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbDsKLSAgICB0aGlzLnNwYWNpbmcgPSBzcGFjaW5nOwotICB9Ci0KLSAgcHVibGljIE1vZGVsR3JvdXBMYXlvdXQoaW50IHNwYWNpbmcpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBjb250YWluZXIsIGludCB3SGludCwgaW50IGhIaW50KQotICB7Ci0gICAgRGltZW5zaW9uIHByZWZlcnJlZCA9IG5ldyBEaW1lbnNpb24oKTsKLSAgICBMaXN0IGNoaWxkcmVuID0gY29udGFpbmVyLmdldENoaWxkcmVuKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgY2hpbGRyZW4uZ2V0KGkpOwotCi0gICAgICBEaW1lbnNpb24gY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBwcmVmZXJyZWQud2lkdGggKz0gY2hpbGRTaXplLndpZHRoOwotICAgICAgICBwcmVmZXJyZWQuaGVpZ2h0ID0gTWF0aC5tYXgocHJlZmVycmVkLmhlaWdodCwgY2hpbGRTaXplLmhlaWdodCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gY2hpbGRTaXplLmhlaWdodDsKLSAgICAgICAgcHJlZmVycmVkLndpZHRoID0gTWF0aC5tYXgocHJlZmVycmVkLndpZHRoLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgfQotICAgIH0KLQotICAgIGludCBjaGlsZHJlblNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0gICAgaWYgKGNoaWxkcmVuU2l6ZSA+IDEpCi0gICAgewotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkKLSAgICAgIHsKLSAgICAgICAgcHJlZmVycmVkLndpZHRoICs9IHNwYWNpbmcgKiAoY2hpbGRyZW5TaXplIC0gMSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gc3BhY2luZyAqIChjaGlsZHJlblNpemUgLSAxKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcmVmZXJyZWQud2lkdGggKz0gYm9yZGVyICogMjsKLSAgICBwcmVmZXJyZWQuaGVpZ2h0ICs9IGJvcmRlciAqIDI7Ci0gICAgcHJlZmVycmVkLndpZHRoICs9IGNvbnRhaW5lci5nZXRJbnNldHMoKS5nZXRXaWR0aCgpOwotICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gY29udGFpbmVyLmdldEluc2V0cygpLmdldEhlaWdodCgpOwotCi0gICAgcmV0dXJuIHByZWZlcnJlZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIGNvbnRhaW5lcikKLSAgewotICAgIExpc3QgY2hpbGRyZW4gPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKLQotICAgIERpbWVuc2lvbiBkaW1lbnNpb24gPSBuZXcgRGltZW5zaW9uKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgRGltZW5zaW9uIGNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoKTsKLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7Ci0gICAgICAgIGRpbWVuc2lvbi5oZWlnaHQgPSBNYXRoLm1heChkaW1lbnNpb24uaGVpZ2h0LCBjaGlsZFNpemUuaGVpZ2h0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZGltZW5zaW9uLndpZHRoID0gTWF0aC5tYXgoZGltZW5zaW9uLndpZHRoLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgewotICAgICAgZGltZW5zaW9uLmhlaWdodCArPSBib3JkZXIgKiAyOwotICAgICAgZGltZW5zaW9uLndpZHRoICs9IGJvcmRlcjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGRpbWVuc2lvbi53aWR0aCArPSBib3JkZXIgKiAyOwotICAgICAgZGltZW5zaW9uLmhlaWdodCArPSBib3JkZXI7Ci0gICAgfQotCi0gICAgUmVjdGFuZ2xlIHIgPSBjb250YWluZXIuZ2V0Q2xpZW50QXJlYSgpOwotICAgIGRpbWVuc2lvbiA9IG5ldyBEaW1lbnNpb24oci53aWR0aCwgci5oZWlnaHQpOwotICAgIFBvaW50IHAgPSBuZXcgUG9pbnQoMCwgMCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKSBpLm5leHQoKTsKLSAgICAgIERpbWVuc2lvbiBjaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0KLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKHAueCwgMCwgY2hpbGRTaXplLndpZHRoLCBjaGlsZFNpemUuaGVpZ2h0KTsKLQotICAgICAgICAvLyBsYXN0IGNoaWxkCi0gICAgICAgIGlmICghaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZWN0YW5nbGUud2lkdGggPSBkaW1lbnNpb24ud2lkdGggLSByZWN0YW5nbGUueDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwLnggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlY3RhbmdsZS55ID0gci5oZWlnaHQgLyAyIC0gY2hpbGRTaXplLmhlaWdodCAvIDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVjdGFuZ2xlLnkgPSByLmhlaWdodCAvIDIgLSBjaGlsZFNpemUuaGVpZ2h0IC8gMjsKLSAgICAgICAgfQotCi0gICAgICAgIHJlY3RhbmdsZS50cmFuc2xhdGUoY29udGFpbmVyLmdldENsaWVudEFyZWEoKS5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgY2hpbGQuc2V0Qm91bmRzKHJlY3RhbmdsZSk7Ci0gICAgICAgIHAueCArPSBjaGlsZFNpemUud2lkdGg7Ci0gICAgICAgIHAueCArPSBzcGFjaW5nOwotCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKDAsIHAueSwgY2hpbGRTaXplLndpZHRoLCBjaGlsZFNpemUuaGVpZ2h0KTsKLQotICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBTcGFjaW5nRmlndXJlKQotICAgICAgICB7Ci0gICAgICAgICAgcmVjdGFuZ2xlLnggPSBkaW1lbnNpb24ud2lkdGggKyA2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgTW9kZWxHcm91cEZpZ3VyZSkKLSAgICAgICAgewotICAgICAgICAgIHJlY3RhbmdsZS53aWR0aCA9IGRpbWVuc2lvbi53aWR0aCAtIHJlY3RhbmdsZS54OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlY3RhbmdsZS53aWR0aCA9IGRpbWVuc2lvbi53aWR0aCAtIHJlY3RhbmdsZS54OwotICAgICAgICB9Ci0KLSAgICAgICAgcmVjdGFuZ2xlLnRyYW5zbGF0ZShjb250YWluZXIuZ2V0Q2xpZW50QXJlYSgpLmdldExvY2F0aW9uKCkpOwotICAgICAgICBjaGlsZC5zZXRCb3VuZHMocmVjdGFuZ2xlKTsKLSAgICAgICAgcC55ICs9IGNoaWxkU2l6ZS5oZWlnaHQ7Ci0gICAgICAgIHAueSArPSBzcGFjaW5nOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNwYWNpbmcoaW50IHNwYWNpbmcpCi0gIHsKLSAgICB0aGlzLnNwYWNpbmcgPSBzcGFjaW5nOwotICB9Ci0KLSAgcHJvdGVjdGVkIGludCBhbGlnbkZpZ3VyZShJRmlndXJlIHBhcmVudCwgSUZpZ3VyZSBjaGlsZCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9CdWlsdEluVHlwZXNUcmVlVmlld2VyUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvQnVpbHRJblR5cGVzVHJlZVZpZXdlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwY2VjYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9CdWlsdEluVHlwZXNUcmVlVmlld2VyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAotICogICAgIFRydW5nIGRlIElyZW5lIDx0cnVuZ2hhQGNhLmlibS5jb20+Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBjb250ZW50IGZvciBTZWxlY3RCdWlsdEluVHlwZXNGb3JGaWx0ZXJEaWFsb2cKLSAqIHJlYWRhYmlsaXR5IFdhcm5pbmc6IFNvbWUgc2ltcGxlIHRyaWNrcyB0byB0d2VhayBlZmZpY2llbmN5IGFyZSB1c2VkCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWlsdEluVHlwZXNUcmVlVmlld2VyUHJvdmlkZXIgewotCQotCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0JCi0JSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCQotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUX1BBUkVOVCA9ICJwYXJlbnQiOwotCQotCS8qKgotCSAqIEN1cnJlbnRseSB0aGVyZSBhcmUgMyBzdWJncm91cHM6IE51bWJlcnMsIERhdGEgYW5kIFRpbWUsIE90aGVyCi0JICogRm9sa3MgY2FuIGNob29zZSB0byBleHBhbmQgdG8gbW9yZSBzdWJncm91cHMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgQlVJTFRfSU5fVFlQRVNfU1VCX0dST1VQID0gMzsKLQkKLSAgICBzdGF0aWMgU3RyaW5nW10gbnVtYmVyVHlwZXMgPSAKLSAgICAJeyAiYmFzZTY0QmluYXJ5IiwgImJ5dGUiLCAiZGVjaW1hbCIsICJkb3VibGUiLCAiZmxvYXQiLCAiaGV4QmluYXJ5IiwKLSAgICAJICAiaW50IiwgImludGVnZXIiLCAibG9uZyIsICJuZWdhdGl2ZUludGVnZXIiLCAibm9uTmVnYXRpdmVJbnRlZ2VyIiwKLSAgICAJICAibm9uUG9zaXRpdmVJbnRlZ2VyIiwgInBvc2l0aXZlSW50ZWdlciIsICJzaG9ydCIsICJ1bnNpZ25lZEJ5dGUiLAotICAgIAkgICJ1bnNpZ25lZEludCIsICJ1bnNpZ25lZExvbmciLCAidW5zaWduZWRTaG9ydCJ9OwotICAgIAotICAgIHN0YXRpYyBTdHJpbmdbXSBkYXRlQW5kVGltZVR5cGVzID0KLSAgICAJeyAiZGF0ZSIsICJkYXRlVGltZSIsICJkdXJhdGlvbiIsICJnRGF5IiwKLSAgICAJICAiZ01vbnRoIiwgImdNb250aERheSIsICJnWWVhciIsICJnWWVhck1vbnRoIiwgInRpbWUifTsKLQkKLQkKLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsQnVpbHRJblR5cGVzKCkgewotICAgICAgICBMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAvL2ZvciAoaW50IGkgPSAwOyBpIDwgWFNERE9NSGVscGVyLmRhdGFUeXBlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIC8vICBpdGVtcy5hZGQoWFNERE9NSGVscGVyLmRhdGFUeXBlW2ldWzBdKTsKLSAgICAgICAgLy99Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgbWFpbkNvbnRhaW5lciA9IG5ldyBBcnJheUxpc3QoQlVJTFRfSU5fVFlQRVNfU1VCX0dST1VQKTsKLSAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBoZWFkZXIgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigiIiwgIlJvb3QiLCBudWxsKTsKLSAgICAgICAgbWFpbkNvbnRhaW5lci5hZGQoaGVhZGVyKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgbnVtYmVyc0dyb3VwID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBoZWFkZXIgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigiIiwgIk51bWJlcnMiLCBudWxsKTsKLSAgICAgICAgbnVtYmVyc0dyb3VwLmFkZChoZWFkZXIpOwotICAgICAgICBtYWluQ29udGFpbmVyLmFkZChudW1iZXJzR3JvdXApOwotICAgICAgICAKLSAgICAgICAgTGlzdCBkYXRlQW5kVGltZUdyb3VwID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBoZWFkZXIgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigiIiwgIkRhdGUgYW5kIFRpbWUiLCBudWxsKTsKLSAgICAgICAgZGF0ZUFuZFRpbWVHcm91cC5hZGQoaGVhZGVyKTsKLSAgICAgICAgbWFpbkNvbnRhaW5lci5hZGQoZGF0ZUFuZFRpbWVHcm91cCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IG90aGVyR3JvdXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGhlYWRlciA9IG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKCIiLCAiT3RoZXIiLCBudWxsKTsKLSAgICAgICAgb3RoZXJHcm91cC5hZGQoaGVhZGVyKTsKLSAgICAgICAgbWFpbkNvbnRhaW5lci5hZGQob3RoZXJHcm91cCk7Ci0KLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGl0ZW0udG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBidWlsdEluVHlwZUl0ZW0gPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihuYW1lLCBYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsIG51bGwpOwotICAgICAgICAgIAotICAgICAgICAgICAgLy8gaWYgdGhpcyBidWlsdC1JbiBUeXBlIGlzIGluIE51bWJlciBncm91cCAKLSAgICAgICAgICAgIGlmICggcGFydE9mKG5hbWUsIG51bWJlclR5cGVzKSApewotICAgICAgICAgICAgCS8vIFNldCBwYXJlbnQKLSAgICAgICAgICAgIAkvL2J1aWx0SW5UeXBlSXRlbS5hZGRBdHRyaWJ1dGVJbmZvKENPTlNUX1BBUkVOVCwgbnVtYmVyc0dyb3VwKTsKLSAgICAgICAgICAgIAkKLSAgICAgICAgICAgIAludW1iZXJzR3JvdXAuYWRkKGJ1aWx0SW5UeXBlSXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBpZiB0aGlzIGJ1aWx0LUluIFR5cGUgaXMgaW4gRGF0ZS1hbmQtVGltZSBncm91cCAKLSAgICAgICAgICAgIGVsc2UgaWYgKCBwYXJ0T2YobmFtZSwgZGF0ZUFuZFRpbWVUeXBlcykpewotICAgICAgICAgICAgCS8vYnVpbHRJblR5cGVJdGVtLmFkZEF0dHJpYnV0ZUluZm8oQ09OU1RfUEFSRU5ULCBkYXRlQW5kVGltZUdyb3VwKTsKLSAgICAgICAgICAgIAlkYXRlQW5kVGltZUdyb3VwLmFkZChidWlsdEluVHlwZUl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBwdXQgaW4gT3RoZXIgZ3JvdXAKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgCS8vYnVpbHRJblR5cGVJdGVtLmFkZEF0dHJpYnV0ZUluZm8oQ09OU1RfUEFSRU5ULCBvdGhlckdyb3VwKTsKLSAgICAgICAgICAgIAlvdGhlckdyb3VwLmFkZChidWlsdEluVHlwZUl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1haW5Db250YWluZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCl7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQkJCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQnVpbHRJblR5cGVMYWJlbFByb3ZpZGVyKCk7Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVyOwotCX0KLQkKLQlwdWJsaWMgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gY29udGVudFByb3ZpZGVyOwotCQkKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEJ1aWx0SW5UeXBlc1RyZWVDb250ZW50UHJvdmlkZXIoKTsKLQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlcjsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGVxdWl2YWxlbnQgb2YgJ2l0ZW0nIGFwcGVhcnMgaW4gJ2FycmF5JwotCSAqIEBwYXJhbSBpdGVtCi0JICogQHBhcmFtIGFycmF5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcGFydE9mKFN0cmluZyBpdGVtLCBTdHJpbmdbXSBhcnJheSl7Ci0JICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKyApewotCSAgICAJaWYgKCBpdGVtLmVxdWFscyhhcnJheVtpXSkgKXsKLQkgICAgCQlyZXR1cm4gdHJ1ZTsKLQkgICAgCX0gICAgICAgICAgICAJCQotCSAgICB9Ci0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0JCi0JY2xhc3MgQnVpbHRJblR5cGVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXJ7Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewkJCQotCQkJaWYgKCBnZXRUZXh0KGVsZW1lbnQpLmVxdWFscygiTnVtYmVycyIpICkKLQkJCQlyZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0ROdW1iZXJUeXBlcy5naWYiKTsKLQkJCWlmICggZ2V0VGV4dChlbGVtZW50KS5lcXVhbHMoIkRhdGUgYW5kIFRpbWUiKSApCi0JCQkJcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERGF0ZUFuZFRpbWVUeXBlcy5naWYiKTsKLQkJCWlmICggZ2V0VGV4dChlbGVtZW50KS5lcXVhbHMoIk90aGVyIikgKQotCQkJCXJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKTsKLQkJCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24gKXsKLQkJCQlyZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IG51bGw7Ci0JCQkKLQkJCS8qIGlmIG5vdCBub24tbGVhZiBub2RlLCB0aGUgZmlyc3QgZWxlbWVudCBoYXMgdGhlIG5hbWUgZm9yIAotCQkJICogdGhlIHdob2xlIGxpc3QgKi8KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlzdCl7Ci0JCQkJc3BlYyA9IChDb21wb25lbnRTcGVjaWZpY2F0aW9uKSAoKExpc3QpIGVsZW1lbnQpLmdldCgwKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uICl7Ci0JCQkJc3BlYyA9IChDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBlbGVtZW50OwotCQkJfQotCQkJcmV0dXJuIHNwZWMuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQotCQl9ICAKLQkJCi0JfQotCi0KLQljbGFzcyBCdWlsdEluVHlwZXNUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJTGlzdCBwYXJlbnRDb250ZW50ID0gKExpc3QpIHBhcmVudEVsZW1lbnQ7Ci0JCQkJCi0JCQkJLyoqIElnbm9yZSB0aGUgZmlyc3QgZWxlbWVudCAod2hpY2ggY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyBsaXN0Ci0JCQkJICogaWUuICdOdW1iZXJzJywgJ0RhdGUgYW5kIHRpbWUnLCAnT3RoZXInKSAqLwotCQkJCXJldHVybiBwYXJlbnRDb250ZW50LnN1Ykxpc3QoMSwgcGFyZW50Q29udGVudC5zaXplKCkpLnRvQXJyYXkoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJICAgIHJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAxKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL0lPcGVuSW5OZXdFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvSU9wZW5Jbk5ld0VkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTJjNTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvSU9wZW5Jbk5ld0VkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotcHVibGljIGludGVyZmFjZSBJT3BlbkluTmV3RWRpdG9yCi17Ci0gIHB1YmxpYyB2b2lkIG9wZW5YU0RFZGl0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3QXR0cmlidXRlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0F0dHJpYnV0ZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjAyOTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3QXR0cmlidXRlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIE5ld0F0dHJpYnV0ZURpYWxvZyBleHRlbmRzIE5ld0NvbXBvbmVudERpYWxvZyBpbXBsZW1lbnRzIElDb21wb25lbnREaWFsb2cKLXsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIHByb3RlY3RlZCBPYmplY3Qgc2V0T2JqZWN0OwotICBwcm90ZWN0ZWQgaW50IHR5cGVLaW5kOwotICBwcm90ZWN0ZWQgT2JqZWN0IHNlbGVjdGlvbjsKLQotICBwdWJsaWMgTmV3QXR0cmlidXRlRGlhbG9nKCkKLSAgewotICAgIHN1cGVyKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIE1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfQVRUUklCVVRFLCAiTmV3QXR0cmlidXRlIik7ICAgICAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgTmV3QXR0cmlidXRlRGlhbG9nKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBzdXBlcihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX0FUVFJJQlVURSwgIk5ld0F0dHJpYnV0ZSIpOyAgICAgLy8kTk9OLU5MUy0xJAotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0dXAoKSB7Ci0gICAgaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0gICAgICBMaXN0IHVzZWROYW1lcyA9IGdldFVzZWRFbGVtZW50TmFtZXMoKTsKLSAgICAgIHNldFVzZWROYW1lcyh1c2VkTmFtZXMpOwotICAgICAgc2V0RGVmYXVsdE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZSgiTmV3QXR0cmlidXRlIiwgc2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgaW50IGNyZWF0ZUFuZE9wZW4oKQotICB7Ci0gIHNldHVwKCk7Ci0gICAgaW50IHJldHVybkNvZGUgPSBzdXBlci5jcmVhdGVBbmRPcGVuKCk7Ci0gICAgaWYgKHJldHVybkNvZGUgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc2V0T2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICAgIHsgIAotICAgICAgICAvL0NvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kKGdldE5hbWUoKSwgc2NoZW1hKTsKLSAgICAgIH0gICAgICAgIAotICAgIH0gIAotICAgIHJldHVybiByZXR1cm5Db2RlOwotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnQoKQotICB7Ci0gICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gIG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKG51bGwsIGdldE5hbWUoKSwgbnVsbCk7ICAgIAotICAgIGNvbXBvbmVudFNwZWNpZmljYXRpb24uc2V0TWV0YU5hbWUoSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfTUVUQV9OQU1FKTsKLSAgICBjb21wb25lbnRTcGVjaWZpY2F0aW9uLnNldE5ldyh0cnVlKTsKLSAgICByZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0VXNlZEVsZW1lbnROYW1lcygpIHsKLSAgICBMaXN0IHVzZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsgICAgIAotICAgIGlmIChzY2hlbWEgIT0gbnVsbCApIHsKLSAgICAgIExpc3QgZWxlbWVudHNMaXN0ID0gc2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotICAgICAgSXRlcmF0b3IgZWxlbWVudHMgPSBlbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsgCi0gICAgICB3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgIHVzZWROYW1lcy5hZGQoKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgZWxlbWVudHMubmV4dCgpKS5nZXROYW1lKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdXNlZE5hbWVzOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3Q29tcG9uZW50RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0NvbXBvbmVudERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTBjNDllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3Q29tcG9uZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci0KLXB1YmxpYyBjbGFzcyBOZXdDb21wb25lbnREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgVGV4dCBuYW1lRmllbGQ7IAotICBwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLSAgcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotICBwcm90ZWN0ZWQgTGlzdCB1c2VkTmFtZXM7Ci0KLSAgcHVibGljIE5ld0NvbXBvbmVudERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVmYXVsdE5hbWUpIAotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIHNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0gICAgbmFtZSA9IGRlZmF1bHROYW1lOyAgICAgIAotICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgfQotICAKLSAgcHVibGljIE5ld0NvbXBvbmVudERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVmYXVsdE5hbWUsIExpc3QgdXNlZE5hbWVzKSAKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotICAgIG5hbWUgPSBkZWZhdWx0TmFtZTsgICAgICAKLSAgICB0aGlzLnRpdGxlID0gdGl0bGU7Ci0gICAgdGhpcy51c2VkTmFtZXMgPSB1c2VkTmFtZXM7Ci0gIH0KLQotICBwdWJsaWMgaW50IGNyZWF0ZUFuZE9wZW4oKQotICB7Ci0gICAgY3JlYXRlKCk7Ci0gICAgZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLSAgICBzZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICByZXR1cm4gb3BlbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgIAotICB7Ci0gICAgQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLSAgICBuYW1lRmllbGQuZm9yY2VGb2N1cygpOwotICAgIG5hbWVGaWVsZC5zZWxlY3RBbGwoKTsgIAotICAgIHVwZGF0ZUVycm9yTWVzc2FnZSgpOwotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLSAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUhlYWRlckNvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZENvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSAKLSAgewotICAgIENvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgCi0gICAgY3JlYXRlSGVhZGVyQ29udGVudChkaWFsb2dBcmVhKTsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZ2RGaWxsPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZEZpbGwuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZEZpbGwuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBnZEZpbGwudmVydGljYWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2RGaWxsLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkRmlsbCk7Ci0KLSAgICBMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgbmFtZUxhYmVsLnNldFRleHQoTWVzc2FnZXMuVUlfTEFCRUxfTkFNRSk7Ci0KLSAgICBuYW1lRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICBHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGdkLndpZHRoSGludCA9IDIwMDsKLSAgICBuYW1lRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgbmFtZUZpZWxkLnNldFRleHQobmFtZSk7Ci0gICAgbmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZUZpZWxkLCBYU0RFZGl0b3JDU0hlbHBJZHMuTkVXVFlQRV9OQU1FKTsKLQotICAgIGNyZWF0ZUV4dGVuZGVkQ29udGVudChkaWFsb2dBcmVhKTsKLQotICAgIC8vIGVycm9yIG1lc3NhZ2UKLSAgICBlcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0gICAgZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dCgiZXJyb3IgbWVzc2FnZSBnb2VzIGhlcmUiKTsKLSAgICBHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZDIuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZDIuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBnZDIud2lkdGhIaW50ID0gMjAwOwotICAgIGVycm9yTWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QyKTsgICAgICAgICAgCi0vLyAgICBDb2xvciBjb2xvciA9IG5ldyBDb2xvcihlcnJvck1lc3NhZ2VMYWJlbC5nZXREaXNwbGF5KCksIDIwMCwgMCwgMCk7Ci0vLyAgICBlcnJvck1lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQotICAgIHJldHVybiBkaWFsb2dBcmVhOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0gIH0gICAgICAgIAotCi0gIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZShTdHJpbmcgbmFtZSkKLSAgewotICAJaWYgKHVzZWROYW1lcyA9PSBudWxsKQotICAJCXJldHVybiBudWxsOwotICAJCi0gIAlJdGVyYXRvciBpdGVyYXRvciA9IHVzZWROYW1lcy5pdGVyYXRvcigpOwotICAJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykgaXRlcmF0b3IubmV4dCgpKSkgewotICAJCQlyZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfRVJST1JfTkFNRV9BTFJFQURZX1VTRUQ7IC8vJE5PTi1OTFMtMSQKLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkKLSAgeyAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0gICAgU3RyaW5nIG5hbWUgPSBuYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICBpZiAobmFtZS5sZW5ndGgoKSA+IDApCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKG5hbWUpOwotICAgIH0gICAKLSAgICBlbHNlCi0gICAgewotICAgICAgZXJyb3JNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9ICAKLSAgICBlcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOyAvLyROT04tTkxTLTEkCi0gICAgb2tCdXR0b24uc2V0RW5hYmxlZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIAotICB7Ci0gICAgaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0gICAgewotICAgICAgbmFtZSA9IG5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0gICAgfQotICAgIHN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRVc2VkTmFtZXMoTGlzdCB1c2VkTmFtZXMpIHsKLQkgIHRoaXMudXNlZE5hbWVzID0gdXNlZE5hbWVzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShTdHJpbmcgbmFtZSkgewotCSAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0VsZW1lbnRCdXR0b25IYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0VsZW1lbnRCdXR0b25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljODM1NzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdFbGVtZW50QnV0dG9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSU5ld0NvbXBvbmVudEhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBOZXdFbGVtZW50QnV0dG9uSGFuZGxlciBpbXBsZW1lbnRzIElOZXdDb21wb25lbnRIYW5kbGVyCi17Ci0gIHB1YmxpYyBOZXdFbGVtZW50QnV0dG9uSGFuZGxlcigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG9wZW5OZXdDb21wb25lbnREaWFsb2coKQotICB7Ci0gICAgTmV3RWxlbWVudERpYWxvZyBuZXdFbGVtZW50RGlhbG9nID0gbmV3IE5ld0VsZW1lbnREaWFsb2coKTsKLSAgICBuZXdFbGVtZW50RGlhbG9nLmNyZWF0ZUFuZE9wZW4oKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdFbGVtZW50RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0VsZW1lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwNjE5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0VsZW1lbnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIE5ld0VsZW1lbnREaWFsb2cgZXh0ZW5kcyBOZXdDb21wb25lbnREaWFsb2cgaW1wbGVtZW50cyBJQ29tcG9uZW50RGlhbG9nCi17Ci0JICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLQkgIHByb3RlY3RlZCBPYmplY3Qgc2V0T2JqZWN0OwotCSAgcHJvdGVjdGVkIGludCB0eXBlS2luZDsKLQkgIHByb3RlY3RlZCBPYmplY3Qgc2VsZWN0aW9uOwotCi0JICBwdWJsaWMgTmV3RWxlbWVudERpYWxvZygpCi0JICB7Ci0JICAgIHN1cGVyKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIE1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfRUxFTUVOVCwgIk5ld0VsZW1lbnQiKTsgICAgIC8vJE5PTi1OTFMtMSQKLQkgIH0KLQotCSAgcHVibGljIE5ld0VsZW1lbnREaWFsb2coWFNEU2NoZW1hIHNjaGVtYSkKLQkgIHsKLQkgICAgc3VwZXIoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgTWVzc2FnZXMuX1VJX0xBQkVMX05FV19FTEVNRU5ULCAiTmV3RWxlbWVudCIpOyAgICAgLy8kTk9OLU5MUy0xJAotCSAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLQkgIH0KLQkgIAotCSAgcHJpdmF0ZSB2b2lkIHNldHVwKCkgewotCQkgIGlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJICBMaXN0IHVzZWROYW1lcyA9IGdldFVzZWRFbGVtZW50TmFtZXMoKTsKLQkJCSAgc2V0VXNlZE5hbWVzKHVzZWROYW1lcyk7Ci0JCQkgIHNldERlZmF1bHROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoIk5ld0VsZW1lbnQiLCBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpKSk7Ci0JCSAgfQotCSAgfQotCSAgCi0JICBwdWJsaWMgaW50IGNyZWF0ZUFuZE9wZW4oKQotCSAgewotCQlzZXR1cCgpOwotCSAgICBpbnQgcmV0dXJuQ29kZSA9IHN1cGVyLmNyZWF0ZUFuZE9wZW4oKTsKLQkgICAgaWYgKHJldHVybkNvZGUgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzZXRPYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyKQotCSAgICAgIHsgIAotCSAgICAgICAgLy9Db21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZChnZXROYW1lKCksIHNjaGVtYSk7Ci0JICAgICAgfSAgICAgICAgCi0JICAgIH0gIAotCSAgICByZXR1cm4gcmV0dXJuQ29kZTsKLQkgIH0KLQotCSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnQoKQotCSAgewotCSAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSAgbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24obnVsbCwgZ2V0TmFtZSgpLCBudWxsKTsgICAgCi0JICAgIGNvbXBvbmVudFNwZWNpZmljYXRpb24uc2V0TWV0YU5hbWUoSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRSk7Ci0JICAgIGNvbXBvbmVudFNwZWNpZmljYXRpb24uc2V0TmV3KHRydWUpOwotCSAgICByZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLQkgIH0KLQotCSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24pCi0JICB7Ci0JICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkgIH0KLQkgIAotCSAgcHJpdmF0ZSBMaXN0IGdldFVzZWRFbGVtZW50TmFtZXMoKSB7Ci0JCSAgTGlzdCB1c2VkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CQkgIAotCQkgIGlmIChzY2hlbWEgIT0gbnVsbCApIHsKLQkJCSAgTGlzdCBlbGVtZW50c0xpc3QgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotCQkJICBJdGVyYXRvciBlbGVtZW50cyA9IGVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyAKLQkJCSAgd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJCSAgdXNlZE5hbWVzLmFkZCgoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMubmV4dCgpKS5nZXROYW1lKCkpOwotCQkJICB9Ci0JCSAgfQotCQkgIAotCQkgIHJldHVybiB1c2VkTmFtZXM7Ci0JICB9Ci0JfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdUeXBlQnV0dG9uSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdUeXBlQnV0dG9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE1YTg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3VHlwZUJ1dHRvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklOZXdDb21wb25lbnRIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgTmV3VHlwZUJ1dHRvbkhhbmRsZXIgaW1wbGVtZW50cyBJTmV3Q29tcG9uZW50SGFuZGxlcgotewotICBwdWJsaWMgTmV3VHlwZUJ1dHRvbkhhbmRsZXIoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBvcGVuTmV3Q29tcG9uZW50RGlhbG9nKCkKLSAgewotICAgIE5ld1R5cGVEaWFsb2cgbmV3VHlwZURpYWxvZyA9IG5ldyBOZXdUeXBlRGlhbG9nKCk7Ci0gICAgbmV3VHlwZURpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld1R5cGVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3VHlwZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWZlYzYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3VHlwZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBOZXdUeXBlRGlhbG9nIGV4dGVuZHMgTmV3Q29tcG9uZW50RGlhbG9nIGltcGxlbWVudHMgSUNvbXBvbmVudERpYWxvZwotewotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgU0lNUExFX1RZUEUgPSAwOwotICBwcm90ZWN0ZWQgc3RhdGljIGludCBDT01QTEVYX1RZUEUgPSAxOwotICBwcm90ZWN0ZWQgT2JqZWN0IHNldE9iamVjdDsKLSAgcHJvdGVjdGVkIGludCB0eXBlS2luZDsKLSAgcHJvdGVjdGVkIE9iamVjdCBzZWxlY3Rpb247Ci0gIHByb3RlY3RlZCBib29sZWFuIGFsbG93Q29tcGxleFR5cGUgPSB0cnVlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd0Fub255bW91c1R5cGUgPSB0cnVlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBhbm9ueW1vdXNUeXBlID0gZmFsc2U7Ci0gIHByaXZhdGUgQnV0dG9uIGNvbXBsZXhUeXBlQnV0dG9uOwotICBwcml2YXRlIEJ1dHRvbiBzaW1wbGVUeXBlQnV0dG9uOwotICBwcml2YXRlIEJ1dHRvbiBhbm9ueW1vdXNUeXBlQ2hlY2tCb3g7Ci0KLSAgcHVibGljIE5ld1R5cGVEaWFsb2coKQotICB7Ci0gICAgc3VwZXIoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgTWVzc2FnZXMuX1VJX0xBQkVMX05FV19UWVBFLCAiTmV3VHlwZSIpOyAgICAgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIE5ld1R5cGVEaWFsb2coWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHN1cGVyKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIE1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfVFlQRSwgIk5ld1R5cGUiKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldHVwKCkgewotCSAgaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCSAgTGlzdCB1c2VkTmFtZXMgPSBnZXRVc2VkVHlwZU5hbWVzKCk7Ci0JCSAgc2V0VXNlZE5hbWVzKHVzZWROYW1lcyk7Ci0JCSAgc2V0RGVmYXVsdE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZShuYW1lLCBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkpKTsKLQkgIH0KLSAgfQotICAKLSAgcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkKLSAgewotCXNldHVwKCk7Ci0gICAgaW50IHJldHVybkNvZGUgPSBzdXBlci5jcmVhdGVBbmRPcGVuKCk7Ci0gICAgaWYgKHJldHVybkNvZGUgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc2V0T2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICAgIHsgIAotICAgICAgICAvL0NvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kKGdldE5hbWUoKSwgc2NoZW1hKTsKLSAgICAgIH0gICAgICAgIAotICAgIH0gIAotICAgIHJldHVybiByZXR1cm5Db2RlOwotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnQoKQotICB7Ci0gICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICAgIGlmICggYW5vbnltb3VzVHlwZSApCi0gICAgCWNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihudWxsLCBudWxsLCBudWxsKTsKLSAgICBlbHNlCi0gICAgCWNvbXBvbmVudFNwZWNpZmljYXRpb24gPSAgbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24obnVsbCwgZ2V0TmFtZSgpLCBudWxsKTsgICAgCi0gICAgY29tcG9uZW50U3BlY2lmaWNhdGlvbi5zZXRNZXRhTmFtZSh0eXBlS2luZCA9PSBDT01QTEVYX1RZUEUgPyBJWFNEU2VhcmNoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRV9NRVRBX05BTUUgOiBJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRSk7Ci0gICAgY29tcG9uZW50U3BlY2lmaWNhdGlvbi5zZXROZXcodHJ1ZSk7Ci0gICAgLy9jb21wb25lbnRTcGVjaWZpY2F0aW9uLgotICAgIHJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24pCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVIZWFkZXJDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wbGV4VHlwZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgIGNvbXBsZXhUeXBlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0NPTVBMRVhfVFlQRSk7Ci0gICAgY29tcGxleFR5cGVCdXR0b24uc2V0RW5hYmxlZChhbGxvd0NvbXBsZXhUeXBlKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBsZXhUeXBlQnV0dG9uLCBYU0RFZGl0b3JDU0hlbHBJZHMuTkVXVFlQRV9DT01QTEVYVFlQRSk7Ci0gICAgCi0gICAgc2ltcGxlVHlwZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgIHNpbXBsZVR5cGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfU0lNUExFX1RZUEUpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2ltcGxlVHlwZUJ1dHRvbiwgWFNERWRpdG9yQ1NIZWxwSWRzLk5FV1RZUEVfU0lNUExFVFlQRSk7Ci0gICAgCi0gICAgU2VsZWN0aW9uQWRhcHRlciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgewotICAgICAgICBpZiAoZS53aWRnZXQgPT0gc2ltcGxlVHlwZUJ1dHRvbikKLSAgICAgICAgewotICAgICAgICAgIHR5cGVLaW5kID0gU0lNUExFX1RZUEU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gY29tcGxleFR5cGVCdXR0b24pCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlS2luZCA9IENPTVBMRVhfVFlQRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhbGxvd0Fub255bW91c1R5cGUgJiYgZS53aWRnZXQgPT0gYW5vbnltb3VzVHlwZUNoZWNrQm94KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGFub255bW91c1R5cGVDaGVja0JveC5nZXRTZWxlY3Rpb24oKSA9PSB0cnVlKQotICAgICAgICAgIHsKLSAgICAgICAgCSAgbmFtZUZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAJICBhbm9ueW1vdXNUeXBlID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgCSAgbmFtZUZpZWxkLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIAkgIGFub255bW91c1R5cGUgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIGlmIChhbGxvd0NvbXBsZXhUeXBlKQotICAgIHsKLSAgICAgIGNvbXBsZXhUeXBlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgIHR5cGVLaW5kID0gQ09NUExFWF9UWVBFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2ltcGxlVHlwZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICB0eXBlS2luZCA9IFNJTVBMRV9UWVBFOwotICAgIH0KLQotICAgIHNpbXBsZVR5cGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIGNvbXBsZXhUeXBlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAKLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgaWYgKGFsbG93QW5vbnltb3VzVHlwZSApCi0gICAgewotICAgICAgYW5vbnltb3VzVHlwZUNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICBhbm9ueW1vdXNUeXBlQ2hlY2tCb3guc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfQ1JFQVRFX0FOT05fVFlQRSk7Ci0gICAgfSAgICAKLQotICAgIGlmIChhbm9ueW1vdXNUeXBlQ2hlY2tCb3ggIT0gbnVsbCkKLSAgICAgIGFub255bW91c1R5cGVDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7ICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBXVFAgcmVsZWFzZS4KLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9ybWFsaXplZExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICAgIFVSTCByZXNvbHZlZFVSTCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLSAgICAgIGxvY2F0aW9uID0gcmVzb2x2ZWRVUkwuZ2V0UGF0aCgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWxsb3dDb21wbGV4VHlwZShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdGhpcy5hbGxvd0NvbXBsZXhUeXBlPSB2YWx1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWxsb3dBbm9ueW1vdXNUeXBlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLQl0aGlzLmFsbG93QW5vbnltb3VzVHlwZSA9IHZhbHVlOwotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0VXNlZFR5cGVOYW1lcygpIHsKLQkgIExpc3QgdXNlZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JICBpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJICBMaXN0IHR5cGVzTGlzdCA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKTsKLQkJICBJdGVyYXRvciB0eXBlcyA9IHR5cGVzTGlzdC5pdGVyYXRvcigpOwotCQkgIHdoaWxlICh0eXBlcy5oYXNOZXh0KCkpIHsKLQkJCSAgdXNlZE5hbWVzLmFkZCgoKFhTRFR5cGVEZWZpbml0aW9uKSB0eXBlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCSAgfQotCSAgfQotCSAgCi0JICByZXR1cm4gdXNlZE5hbWVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdEJ1aWx0SW5UeXBlc0ZvckZpbHRlcmluZ0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RCdWlsdEluVHlwZXNGb3JGaWx0ZXJpbmdEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzN2Q2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdEJ1aWx0SW5UeXBlc0ZvckZpbHRlcmluZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKiAgICAgVHJ1bmcgZGUgSXJlbmUgPHRydW5naGFAY2EuaWJtLmNvbT4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNoZWNrZWRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLS8qKgotICogVGhlIEJ1aWx0SW5UeXBlc0ZpbHRlcmluZ0RpYWxvZyBpcyBhIFNlbGVjdGlvbkRpYWxvZyB0aGF0IGFsbG93cyB0aGUgdXNlciB0bwotICogIHNlbGVjdCBhIC4uLgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0QnVpbHRJblR5cGVzRm9yRmlsdGVyaW5nRGlhbG9nIGV4dGVuZHMgQ2hlY2tlZFRyZWVTZWxlY3Rpb25EaWFsb2cgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SID0gWFNERWRpdG9yUGx1Z2luLkNVU1RPTV9MSVNUX1NFUEFSQVRPUjsKLQotCXB1YmxpYyBTZWxlY3RCdWlsdEluVHlwZXNGb3JGaWx0ZXJpbmdEaWFsb2coU2hlbGwgcGFyZW50LCAKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQlzdXBlcihwYXJlbnQsIGxhYmVsUHJvdmlkZXIsIGNvbnRlbnRQcm92aWRlcik7Ci0KLQkJaW5pdCgpOwotCX0KLQkKLQlwdWJsaWMgQ2hlY2tib3hUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKXsKLQkJcmV0dXJuIHN1cGVyLmdldFRyZWVWaWV3ZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXQoKXsKLQkJLy8gZ3JleSBzdGF0ZSBlbmFibGUKLQkJc2V0Q29udGFpbmVyTW9kZSh0cnVlKTsKLQkJCi0JCXNldFRpdGxlKE1lc3NhZ2VzLl9VSV9MQUJFTF9TRVRfQ09NTU9OX0JVSUxUX0lOX1RZUEVTKTsKLQkJc2V0TWVzc2FnZShNZXNzYWdlcy5fVUlfTEFCRUxfU0VMRUNUX1RZUEVTX0ZJTFRFUl9PVVQpOwotCQkKLQkJLy9zdXBlci5jcmVhdGUoKTsKLQkJLy9zdXBlci5nZXRUcmVlVmlld2VyKCkuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiAgIFJldHVybnMgYSBTdHJpbmcgYWN0aW5nIGFzIGxpc3Qgb2YgYnVpbHQtaW4gdHlwZXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXIKLQkgKiBpbiB0aGUgZmlsdGVyIGRpYWxvZyAod2hpdGUgc3BhY2UgYWN0cyBhcyB0aGUgaXRlbSBzZXBhcmF0b3IpLgotCSAqICAgU3VnZ2VzdCB1c2luZyBnZXRTZWxlY3RlZEJ1aWx0SW5UeXBlc0Zyb21TdHJpbmcKLQkgKiB0byBnZXQgYSBjb25jcmV0ZSBhcnJheSBvZiBzZWxlY3RlZCB0eXBlcy4KLQkgKiAgIFdlIGNhbiBvbmx5IHN0b3JlIFN0cmluZyBpbiB0aGUgcGx1Z2luIHByZWZlcmVuY2UncyBzdG9yYWdlIHNvIHdlIGhhdmUgCi0JICogdXNlIHRoaXMgbWV0aG9kIGZvciBjb252ZXJzaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZXNMaXN0SW5TdHJpbmcoT2JqZWN0W10gY2hvc2VuVHlwZXMpIHsKLQkJU3RyaW5nIHJldHVybmluZ0xpc3QgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGNob3NlblR5cGVzLmxlbmd0aDsgaSsrKXsKLQkJCWlmICggY2hvc2VuVHlwZXNbaV0gaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uKXsKLQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIGFUeXBlID0gCi0JCQkJCShDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBjaG9zZW5UeXBlc1tpXTsKLQotCQkJCXJldHVybmluZ0xpc3QgKz0gYVR5cGUuZ2V0TmFtZSgpICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SOwotCQkJfQotCQkJLyogZWxzZSBzZWxlY3RlZEJ1aWx0SW5UeXBlc1tpXSBpbnN0YW5jZW9mIExpc3QsIGllLiBhIHBhcmVudE5vZGUKLQkJCSAqIHdlIGlnbm9yZSBpdC4gKi8KLQkJfQotCQlyZXR1cm4gcmV0dXJuaW5nTGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogRmlsdGVycyBvdXQgYWxsIGJ1aWx0LUluIHR5cGUgbm90IHJlY29yZGVkIGluIHRoZSAnbGlzdFN0cmluZycgYW5kIAotCSAqIHJldHVybnMgdGhlIHJlc3VsdCBpbiBhIExpc3QKLQkgKiBXYXJuaW5nOiByZWN1cnNpdmUgbWV0aG9kCi0JICogQHBhcmFtIGxpc3RTdHJpbmcgCi0JICogQHBhcmFtIGFDb250YWluZXIgCi0JICogCQkJQ29udGFpbmluZyBhbGwgdHlwZXMKLQkgKiBAcmV0dXJuIGEgc3Vic2V0IG9mIHdoYXQgJ2FDb250YWluZXInIGhhcyBhcyBzcGVjaWZpZWQgYnkgJ2xpc3RTdHJpbmcnCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNlbGVjdGVkQnVpbHRJblR5cGVzRnJvbVN0cmluZyhTdHJpbmcgbGlzdFN0cmluZywgCi0JCQlMaXN0IGFDb250YWluZXIpIHsKLQkJTGlzdCBzZWxlY3RlZFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGlnbm9yZSB0aGUgJ2hlYWRlcicgaXRlbSBpbiB0aGUgY29udGFpbmVyLCBzdGFydGluZyBmcm9tIGkgPSAxCi0JCWZvciAoaW50IGkgPSAxOyBpIDwgYUNvbnRhaW5lci5zaXplKCk7IGkrKyl7Ci0JCQlPYmplY3QgbyA9IGFDb250YWluZXIuZ2V0KGkpOwotCQkJaWYgKCBvIGluc3RhbmNlb2YgQ29tcG9uZW50U3BlY2lmaWNhdGlvbil7Ci0JCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBhVHlwZSA9IChDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBvOwotCQkJCVN0cmluZyB0eXBlTmFtZSA9IGFUeXBlLmdldE5hbWUoKTsKLQkJCQkvLyBpZiB0eXBlTmFtZSdzIG5hbWUgYXBwZWFycyBpbiAnbGlzdFN0cmluZycKLQkJCQlpZiAoIGxpc3RTdHJpbmcuaW5kZXhPZih0eXBlTmFtZSArIENVU1RPTV9MSVNUX1NFUEFSQVRPUikgIT0gLTEpCi0JCQkJCXNlbGVjdGVkVHlwZXMuYWRkKG8pOwotCQkJfQotCQkJZWxzZSBpZiAoIG8gaW5zdGFuY2VvZiBMaXN0KXsKLQkJCQlzZWxlY3RlZFR5cGVzLmFkZEFsbCggZ2V0U2VsZWN0ZWRCdWlsdEluVHlwZXNGcm9tU3RyaW5nKGxpc3RTdHJpbmcsIChMaXN0KSBvKSApOyAKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRUeXBlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL1hTREVkaXRTY2hlbWFOUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9YU0RFZGl0U2NoZW1hTlMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlNTIwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL1hTREVkaXRTY2hlbWFOUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuRWRpdFNjaGVtYUluZm9EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQuQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0U2NoZW1hTlMgZXh0ZW5kcyBFZGl0U2NoZW1hSW5mb0RpYWxvZwotewotICBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyBlZGl0TmFtZXNwYWNlc0NvbnRyb2w7Ci0KLSAgcHVibGljIFhTREVkaXRTY2hlbWFOUyhTaGVsbCBwYXJlbnRTaGVsbCwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbikKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsLCByZXNvdXJjZUxvY2F0aW9uKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgIGVkaXROYW1lc3BhY2VzQ29udHJvbCA9IG5ldyBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyhjb21wb3NpdGUsIHJlc291cmNlTG9jYXRpb24sIFhNTFVJTWVzc2FnZXMuX1VJX05BTUVTUEFDRV9ERUNMQVJBVElPTlMpOwotCi0gICAgZWRpdE5hbWVzcGFjZXNDb250cm9sLnNldE5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICBlZGl0TmFtZXNwYWNlc0NvbnRyb2wudXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvWFNER3JhcGhWaWV3ZXJEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvWFNER3JhcGhWaWV3ZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNhZGJkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL1hTREdyYXBoVmlld2VyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlBvcHVwRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Sb290Q29udGVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuVHlwZVZpekZpZ3VyZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNERWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREdyYXBoVmlld2VyRGlhbG9nIGV4dGVuZHMgUG9wdXBEaWFsb2cKLXsKLSAgcHJvdGVjdGVkIE9iamVjdCBtb2RlbDsKLSAgcHJvdGVjdGVkIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciB2aWV3ZXI7Ci0gIHByb3RlY3RlZCBJT3BlbkluTmV3RWRpdG9yIG9wZW5Jbk5ld0VkaXRvckhlbHBlcjsKLSAgcHJpdmF0ZSBPcGVuRWRpdG9yTGlua0xpc3RlbmVyIGxpbmtMaXN0ZW5lcjsKLSAgcHJpdmF0ZSBMYWJlbCBuc0luZm9MYWJlbDsKLSAgcHJpdmF0ZSBIeXBlcmxpbmsgbGluazsKLSAgcHJpdmF0ZSBTdHJpbmcgaW5mb1RleHQ7Ci0gIHByaXZhdGUgRm9udCBpbmZvRm9udDsKLSAgcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSUQ7Ci0gIHByaXZhdGUgUHJldmlld0NvbnRyb2xMaXN0ZW5lciBtb3ZlTGlzdGVuZXI7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWF9PUklHSU4gPSAiRElBTE9HX1hfT1JJR0lOIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWV9PUklHSU4gPSAiRElBTE9HX1lfT1JJR0lOIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGJvb2xlYW4gaXNIaWdoQ29udHJhc3QgPSBmYWxzZTsKLQotICBwdWJsaWMgWFNER3JhcGhWaWV3ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZVRleHQsIFN0cmluZyBpbmZvVGV4dCwgT2JqZWN0IG1vZGVsLCBTdHJpbmcgSUQpCi0gIHsKLSAgICAvLyBJTkZPUE9QVVBfU0hFTExTVFlMRSB3b3JrcyBwcm9wZXJseSBvbiBib3RoIFdpbmRvd3MgYW5kIExpbnV4LgotICAgIHN1cGVyKHBhcmVudFNoZWxsLCBJTkZPUE9QVVBfU0hFTExTVFlMRSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRpdGxlVGV4dCwgaW5mb1RleHQpOwotICAgIHNldE1vZGVsKG1vZGVsKTsKLSAgICBsaW5rTGlzdGVuZXIgPSBuZXcgT3BlbkVkaXRvckxpbmtMaXN0ZW5lcigpOwotICAgIHRoaXMuaW5mb1RleHQgPSBpbmZvVGV4dDsKLSAgICB0aGlzLnVuaXF1ZUlEID0gSUQ7Ci0gICAgQXNzZXJ0LmlzVHJ1ZShJRCAhPSBudWxsICYmIElELmxlbmd0aCgpID4gMCk7ICAgIAotICAgIG1vdmVMaXN0ZW5lciA9IG5ldyBQcmV2aWV3Q29udHJvbExpc3RlbmVyKCk7Ci0gICAgdHJ5IAotICAgIHsKLSAgICAgIGlzSGlnaENvbnRyYXN0ID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0SGlnaENvbnRyYXN0KCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgLy8gaWdub3JlIAotICAgIH0KLSAgICBjcmVhdGUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE9wZW5FeHRlcm5hbEVkaXRvcihJT3BlbkluTmV3RWRpdG9yIGhlbHBlcikKLSAgewotICAgIHRoaXMub3BlbkluTmV3RWRpdG9ySGVscGVyID0gaGVscGVyOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBmaWxsRGlhbG9nTWVudShJTWVudU1hbmFnZXIgZGlhbG9nTWVudSkKLSAgewotICAgIHN1cGVyLmZpbGxEaWFsb2dNZW51KGRpYWxvZ01lbnUpOwotICAgIGRpYWxvZ01lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgZGlhbG9nTWVudS5hZGQobmV3IENsb3NlUG9wdXAoKSk7Ci0gICAgZGlhbG9nTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICBkaWFsb2dNZW51LmFkZChuZXcgU2V0T3BlbkluRWRpdG9yKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgdmlld2VyID0gbmV3IFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcigpOwotICAgIENvbXBvc2l0ZSBjID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLSAgICBpZiAoaXNIaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgYy5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIH0KLSAgICBjLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotICAgIFJvb3RFZGl0UGFydCByb290ID0gbmV3IFJvb3RFZGl0UGFydCgpOwotICAgIHZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0KLSAgICB2aWV3ZXIuY3JlYXRlQ29udHJvbChjKTsKLQotICAgIC8vIFRoZSBncmFwaGljYWwgdmlld2VyIHRvb2wgdGlwIHByb2Nlc3NpbmcgY3JlYXRlcyBhbiBleHRyYSBzaGVsbCB3aGljaAotICAgIC8vIGludGVyZmVyZXMgd2l0aCB0aGUgUG9wdXBEaWFsb2cncyBkZWFjdGl2YXRpb24gbG9naWMuIAotICAgIHJlbW92ZU1vdXNlTGlzdGVuZXJzKHZpZXdlci5nZXRDb250cm9sKCkpOyAgICAKLQotICAgIGlmIChpc0hpZ2hDb250cmFzdCkKLSAgICB7Ci0gICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgfQotICAgIEVkaXRQYXJ0RmFjdG9yeSBlZGl0UGFydEZhY3RvcnkgPSBuZXcgWFNERWRpdFBhcnRGYWN0b3J5KG5ldyBUeXBlVml6RmlndXJlRmFjdG9yeSgpKTsKLSAgICB2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGVkaXRQYXJ0RmFjdG9yeSk7Ci0KLSAgICBSb290Q29udGVudEVkaXRQYXJ0IHJvb3RDb250ZW50RWRpdFBhcnQgPSBuZXcgUm9vdENvbnRlbnRFZGl0UGFydCgpOwotICAgIHJvb3RDb250ZW50RWRpdFBhcnQuc2V0TW9kZWwobW9kZWwpOwotICAgIHZpZXdlci5zZXRDb250ZW50cyhyb290Q29udGVudEVkaXRQYXJ0KTsKLSAgICAKLSAgICBnZXRTaGVsbCgpLmFkZENvbnRyb2xMaXN0ZW5lcihtb3ZlTGlzdGVuZXIpOwotICAgIHJldHVybiBjOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlbW92ZU1vdXNlTGlzdGVuZXJzKENvbnRyb2wgY29udHJvbCkKLSAgewotICAgIExpc3RlbmVyW10gbGlzdGVuZXJzID0gY29udHJvbC5nZXRMaXN0ZW5lcnMoU1dULk1vdXNlRW50ZXIpOwotICAgIGNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULk1vdXNlRW50ZXIsIGxpc3RlbmVyc1swXSk7Ci0gICAgCi0gICAgbGlzdGVuZXJzID0gY29udHJvbC5nZXRMaXN0ZW5lcnMoU1dULk1vdXNlRXhpdCk7Ci0gICAgY29udHJvbC5yZW1vdmVMaXN0ZW5lcihTV1QuTW91c2VFeGl0LCBsaXN0ZW5lcnNbMF0pOyAgICAKLQotICAgIGxpc3RlbmVycyA9IGNvbnRyb2wuZ2V0TGlzdGVuZXJzKFNXVC5Nb3VzZUhvdmVyKTsKLSAgICBjb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb3VzZUhvdmVyLCBsaXN0ZW5lcnNbMF0pOyAgICAKLQotICAgIGxpc3RlbmVycyA9IGNvbnRyb2wuZ2V0TGlzdGVuZXJzKFNXVC5Nb3VzZU1vdmUpOwotICAgIGNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXJzWzBdKTsgICAgCi0KLSAgICBsaXN0ZW5lcnMgPSBjb250cm9sLmdldExpc3RlbmVycyhTV1QuTW91c2VEb3duKTsKLSAgICBjb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyc1swXSk7ICAgIAotCi0gICAgbGlzdGVuZXJzID0gY29udHJvbC5nZXRMaXN0ZW5lcnMoU1dULk1vdXNlVXApOwotICAgIGNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULk1vdXNlVXAsIGxpc3RlbmVyc1swXSk7ICAgIAotICAgIAotICAgIGxpc3RlbmVycyA9IGNvbnRyb2wuZ2V0TGlzdGVuZXJzKFNXVC5Nb3VzZURvdWJsZUNsaWNrKTsKLSAgICBjb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBsaXN0ZW5lcnNbMF0pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVJbmZvVGV4dEFyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBpbmZvQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGluZm9Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgaW5mb0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIG5zSW5mb0xhYmVsID0gbmV3IExhYmVsKGluZm9Db21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICBuc0luZm9MYWJlbC5zZXRUZXh0KGluZm9UZXh0KTsKLQotICAgIEZvbnQgZm9udCA9IG5zSW5mb0xhYmVsLmdldEZvbnQoKTsKLSAgICBGb250RGF0YVtdIGZvbnREYXRhcyA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvbnREYXRhcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBmb250RGF0YXNbaV0uc2V0SGVpZ2h0KGZvbnREYXRhc1tpXS5nZXRIZWlnaHQoKSAqIDkgLyAxMCk7Ci0gICAgfQotICAgIGluZm9Gb250ID0gbmV3IEZvbnQobnNJbmZvTGFiZWwuZ2V0RGlzcGxheSgpLCBmb250RGF0YXMpOwotICAgIG5zSW5mb0xhYmVsLnNldEZvbnQoaW5mb0ZvbnQpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBuc0luZm9MYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBuc0luZm9MYWJlbC5zZXRGb3JlZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9EQVJLX1NIQURPVykpOwotCi0gICAgbGluayA9IG5ldyBIeXBlcmxpbmsoaW5mb0NvbXBvc2l0ZSwgU1dULlJJR0hUKTsKLSAgICAvLyBSZW1vdmUgbW5lbW9uaWMgYW1wZXJzYW5kLiBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBhIHNlcGFyYXRlIHN0cmluZyBpbiB0aGUgZnV0dXJlLgotICAgIFN0cmluZyBsYWJlbCA9IE1lc3NhZ2VzLl9VSV9BQ1RJT05fT1BFTl9JTl9ORVdfRURJVE9SLnJlcGxhY2VBbGwoIiYiLCAiIik7Ci0gICAgbGluay5zZXRUZXh0KGxhYmVsKTsKLSAgICBsaW5rLnNldEZvbnQoaW5mb0ZvbnQpOwotICAgIGxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobGlua0xpc3RlbmVyKTsKLSAgICByZXR1cm4gaW5mb0NvbXBvc2l0ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldE1vZGVsKE9iamVjdCBtb2RlbCkKLSAgewotICAgIEFzc2VydC5pc1RydWUobW9kZWwgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgdGhpcy5tb2RlbCA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBtb2RlbCk7Ci0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIGNsYXNzIFNldE9wZW5JbkVkaXRvciBleHRlbmRzIEFjdGlvbgotICB7Ci0gICAgcHVibGljIFNldE9wZW5JbkVkaXRvcigpCi0gICAgewotICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9PUEVOX0lOX05FV19FRElUT1IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIGlmIChvcGVuSW5OZXdFZGl0b3JIZWxwZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBvcGVuSW5OZXdFZGl0b3JIZWxwZXIub3BlblhTREVkaXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIENsb3NlUG9wdXAgZXh0ZW5kcyBBY3Rpb24gewotICAgIHB1YmxpYyBDbG9zZVBvcHVwKCkKLSAgICB7Ci0gICAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX0NMT1NFX1NDSEVNQV9QUkVWSUVXX1BPUFVQKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIGNsb3NlKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkKLSAgewotICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncz0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLmdldFNlY3Rpb24odW5pcXVlSUQpOwotICAgIGlmIChzZXR0aW5ncyA9PSBudWxsKQotICAgICAgc2V0dGluZ3M9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKS5hZGROZXdTZWN0aW9uKHVuaXF1ZUlEKTsKLQotICAgIHJldHVybiBzZXR0aW5nczsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxMb2NhdGlvbihQb2ludCBpbml0aWFsU2l6ZSkKLSAgewotICAgIFBvaW50IHJlc3VsdCA9IHN1cGVyLmdldEluaXRpYWxMb2NhdGlvbihpbml0aWFsU2l6ZSk7Ci0KLSAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSB1bmlxdWVJRCA9PSBudWxsID8gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgOiB1bmlxdWVJRDsKLSAgICAgICAgaW50IHggPSBzZXR0aW5ncy5nZXRJbnQocHJlZml4ICsgWF9PUklHSU4pOwotICAgICAgICBpbnQgeSA9IHNldHRpbmdzLmdldEludChwcmVmaXggKyBZX09SSUdJTik7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBQb2ludCh4LCB5KTsKLSAgICAgICAgU2hlbGwgcGFyZW50ID0gZ2V0UGFyZW50U2hlbGwoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUG9pbnQgcGFyZW50TG9jYXRpb24gPSBwYXJlbnQuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICByZXN1bHQueCArPSBwYXJlbnRMb2NhdGlvbi54OwotICAgICAgICAgIHJlc3VsdC55ICs9IHBhcmVudExvY2F0aW9uLnk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNhdmVEaWFsb2dCb3VuZHMoU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKQotICAgIHsKLSAgICAgIFBvaW50IHNoZWxsTG9jYXRpb24gPSBzaGVsbC5nZXRMb2NhdGlvbigpOwotICAgICAgU2hlbGwgcGFyZW50ID0gZ2V0UGFyZW50U2hlbGwoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgUG9pbnQgcGFyZW50TG9jYXRpb24gPSBwYXJlbnQuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgc2hlbGxMb2NhdGlvbi54IC09IHBhcmVudExvY2F0aW9uLng7Ci0gICAgICAgIHNoZWxsTG9jYXRpb24ueSAtPSBwYXJlbnRMb2NhdGlvbi55OwotICAgICAgfQotICAgICAgU3RyaW5nIHByZWZpeCA9IHVuaXF1ZUlEID09IG51bGwgPyBnZXRDbGFzcygpLmdldE5hbWUoKSA6IHVuaXF1ZUlEOwotICAgICAgc2V0dGluZ3MucHV0KHByZWZpeCArIFhfT1JJR0lOLCBzaGVsbExvY2F0aW9uLngpOwotICAgICAgc2V0dGluZ3MucHV0KHByZWZpeCArIFlfT1JJR0lOLCBzaGVsbExvY2F0aW9uLnkpOwotICAgIH0KLSAgfQotCi0gIAotICBwdWJsaWMgYm9vbGVhbiBjbG9zZSgpCi0gIHsKLSAgICBpZiAoZ2V0U2hlbGwoKSA9PSBudWxsIHx8IGdldFNoZWxsKCkuaXNEaXNwb3NlZCgpKSAKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgZ2V0U2hlbGwoKS5yZW1vdmVDb250cm9sTGlzdGVuZXIobW92ZUxpc3RlbmVyKTsKLSAgICBpZiAobGluayAhPSBudWxsKQotICAgICAgbGluay5yZW1vdmVIeXBlcmxpbmtMaXN0ZW5lcihsaW5rTGlzdGVuZXIpOwotICAgIGlmIChpbmZvRm9udCAhPSBudWxsKQotICAgICAgaW5mb0ZvbnQuZGlzcG9zZSgpOwotICAgIGluZm9Gb250ID0gbnVsbDsKLSAgICByZXR1cm4gc3VwZXIuY2xvc2UoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBPcGVuRWRpdG9yTGlua0xpc3RlbmVyIGltcGxlbWVudHMgSUh5cGVybGlua0xpc3RlbmVyCi0gIHsKLQotICAgIHB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkKLSAgICB7Ci0gICAgICBuZXcgU2V0T3BlbkluRWRpdG9yKCkucnVuKCk7Ci0gICAgICBjbG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKEh5cGVybGlua0V2ZW50IGUpCi0gICAgewotICAgICAgbGluay5zZXRGb3JlZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpZ2h0Qmx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbGlua0V4aXRlZChIeXBlcmxpbmtFdmVudCBlKQotICAgIHsKLSAgICAgIGxpbmsuc2V0Rm9yZWdyb3VuZChsaW5rLmdldFBhcmVudCgpLmdldEZvcmVncm91bmQoKSk7Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgY2xhc3MgUHJldmlld0NvbnRyb2xMaXN0ZW5lciBpbXBsZW1lbnRzIENvbnRyb2xMaXN0ZW5lcgotICB7Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpCi0gICAgewotICAgICAgc2F2ZURpYWxvZ0JvdW5kcyhnZXRTaGVsbCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuMi4xMDEKLSAgICogQHBhcmFtIHhzZENvbXBvbmVudAotICAgKiBAcGFyYW0gc2NoZW1hCi0gICAqIEBwYXJhbSBlZGl0b3JOYW1lCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgb3Blbk5vblhTRFJlc291cmNlU2NoZW1hKFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCwgWFNEU2NoZW1hIHNjaGVtYSwgU3RyaW5nIGVkaXRvck5hbWUpCi0gIHsKLSAgICBvcGVuSW5saW5lU2NoZW1hKGdldEN1cnJlbnRFZGl0b3JJbnB1dCgpLCB4c2RDb21wb25lbnQsIHNjaGVtYSwgZWRpdG9yTmFtZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuSW5saW5lU2NoZW1hKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50LCBYU0RTY2hlbWEgc2NoZW1hLCBTdHJpbmcgZWRpdG9yTmFtZSkKLSAgewotICAgIE9wZW5Jbk5ld0VkaXRvci5vcGVuSW5saW5lU2NoZW1hKGVkaXRvcklucHV0LCB4c2RDb21wb25lbnQsIHNjaGVtYSwgZWRpdG9yTmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuWFNERWRpdG9yKFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCkKLSAgewotICAgIG9wZW5YU0RFZGl0b3IoZ2V0Q3VycmVudEVkaXRvcklucHV0KCksIHhzZENvbXBvbmVudC5nZXRTY2hlbWEoKSwgeHNkQ29tcG9uZW50KTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuWFNERWRpdG9yKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwgWFNEU2NoZW1hIHNjaGVtYSwgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50KQotICB7Ci0gICAgT3BlbkluTmV3RWRpdG9yLm9wZW5YU0RFZGl0b3IoZWRpdG9ySW5wdXQsIHNjaGVtYSwgeHNkQ29tcG9uZW50KTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgSUVkaXRvcklucHV0IGdldEN1cnJlbnRFZGl0b3JJbnB1dCgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gbnVsbDsKLSAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICBpZiAoZWRpdG9yUGFydCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBDb250cm9sIGdldEZvY3VzQ29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gbGluazsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvQmFzZUh5cGVybGlua0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvQmFzZUh5cGVybGlua0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDMxNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0Jhc2VIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5BYnN0cmFjdEh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgaHlwZXJsaW5rcyBkZXRlY3RvcnMuIFByb3ZpZGVzIGEgZnJhbWV3b3JrIGFuZCBjb21tb24gY29kZSBmb3IKLSAqIGh5cGVybGluayBkZXRlY3RvcnMuIFRPRE86IENhbiB3ZSBwdWxsIHRoaXMgY2xhc3MgZnVydGhlciB1cCB0aGUgaW5oZXJpdGFuY2UKLSAqIGhpZXJhcmNoeT8KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VIeXBlcmxpbmtEZXRlY3RvciBleHRlbmRzIEFic3RyYWN0SHlwZXJsaW5rRGV0ZWN0b3IKLXsKLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKi8KLSAgcHVibGljIElIeXBlcmxpbmtbXSBkZXRlY3RIeXBlcmxpbmtzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpCi0gIHsKLSAgICBpZiAocmVnaW9uID09IG51bGwgfHwgdGV4dFZpZXdlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIExpc3QgaHlwZXJsaW5rcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0gICAgSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotICAgIGludCBvZmZzZXQgPSByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0KLSAgICBJRE9NTm9kZSBub2RlID0gZ2V0Q3VycmVudE5vZGUoZG9jdW1lbnQsIG9mZnNldCk7Ci0KLSAgICAvLyBUaGlzIGNhbGwgYWxsb3dzIHVzIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGF0dHJpYnV0ZSBpcyBsaW5rYWJsZSwKLSAgICAvLyB3aXRob3V0IGluY3VycmluZyB0aGUgY29zdCBvZiBhc2tpbmcgZm9yIHRoZSB0YXJnZXQgY29tcG9uZW50LgotCi0gICAgaWYgKCFpc0xpbmthYmxlKG5vZGUpKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIElSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKG5vZGUpOwotCi0gICAgLy8gY3JlYXRlSHlwZXJsaW5rIGlzIGEgdGVtcGxhdGUgbWV0aG9kLiBEZXJpdmVkIGNsYXNzZXMsIHNob3VsZCBvdmVycmlkZS4KLQotICAgIElIeXBlcmxpbmsgaHlwZXJsaW5rID0gY3JlYXRlSHlwZXJsaW5rKGRvY3VtZW50LCBub2RlLCBoeXBlcmxpbmtSZWdpb24pOwotCi0gICAgaWYgKGh5cGVybGluayAhPSBudWxsKQotICAgIHsKLSAgICAgIGh5cGVybGlua3MuYWRkKGh5cGVybGluayk7Ci0gICAgfQotCi0gICAgaWYgKGh5cGVybGlua3Muc2l6ZSgpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcmV0dXJuIChJSHlwZXJsaW5rW10pIGh5cGVybGlua3MudG9BcnJheShuZXcgSUh5cGVybGlua1swXSk7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbm9kZSBpcyAibGlua2FibGUiIHRoYXQgaXMsIHRoZSBjb21wb25lbnQgaXQgcmVmZXJzIHRvCi0gICAqIGNhbiBiZSB0aGUgdGFyZ2V0IG9mIGEgImdvIHRvIGRlZmluaXRpb24iIG5hdmlnYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB0ZXN0LCBtdXN0IG5vdCBiZSBudWxsOwotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaXMgbGlua2FibGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0xpbmthYmxlKElET01Ob2RlIG5vZGUpCi0gIHsKLSAgICBpZiAobm9kZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQotICAgIGJvb2xlYW4gaXNMaW5rYWJsZSA9IGZhbHNlOwotCi0gICAgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0gICAgewotICAgICAgSURPTUF0dHIgYXR0ciA9IChJRE9NQXR0cikgbm9kZTsKLSAgICAgIFN0cmluZyBuYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0KLSAgICAgIC8vIGlzTGlua2FibGVBdHRyaWJ1dGUgaXMgYSB0ZW1wbGF0ZSBtZXRob2QuIERlcml2ZWQgY2xhc3NlcyBzaG91bGQKLSAgICAgIC8vIG92ZXJyaWRlLgotCi0gICAgICBpc0xpbmthYmxlID0gaXNMaW5rYWJsZUF0dHJpYnV0ZShuYW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaXNMaW5rYWJsZTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gYXR0cmlidXRlIGlzICJsaW5rYWJsZSIgdGhhdCBpcywgdGhlIGNvbXBvbmVudCBpdAotICAgKiBwb2ludHMgdG8gY2FuIGJlIHRoZSB0YXJnZXQgb2YgYSAiZ28gdG8gZGVmaW5pdGlvbiIgbmF2aWdhdGlvbi4gRGVyaXZlZAotICAgKiBjbGFzc2VzIHNob3VsZCBvdmVycmlkZS4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZS4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbGlua2FibGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzTGlua2FibGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgaHlwZXJsaW5rIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBub2RlLiBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkCi0gICAqIG92ZXJyaWRlLgotICAgKiAKLSAgICogQHBhcmFtIGRvY3VtZW50IHRoZSBzb3VyY2UgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHVuZGVyIHRoZSBjdXJzb3IuCi0gICAqIEBwYXJhbSByZWdpb24gdGhlIHRleHQgcmVnaW9uIHRvIHVzZSB0byBjcmVhdGUgdGhlIGh5cGVybGluay4KLSAgICogQHJldHVybiBhIG5ldyBJSHlwZXJsaW5rIGZvciB0aGUgbm9kZSBvciBudWxsIGlmIG9uZSBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBJSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhJRG9jdW1lbnQgZG9jdW1lbnQsIElET01Ob2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKTsKLQotICAvKioKLSAgICogTG9jYXRlcyB0aGUgYXR0cmlidXRlIG5vZGUgdW5kZXIgdGhlIGN1cnNvci4KLSAgICogCi0gICAqIEBwYXJhbSBvZmZzZXQgdGhlIGN1cnNvciBvZmZzZXQuCi0gICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBub2RlCi0gICAqIEByZXR1cm4gYW4gSURPTU5vZGUgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGUgaWYgb25lIGlzIGZvdW5kIGF0IHRoZQotICAgKiAgICAgICAgIG9mZnNldCBvciBudWxsIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCBJRE9NTm9kZSBnZXRBdHRyaWJ1dGVOb2RlKGludCBvZmZzZXQsIElET01Ob2RlIHBhcmVudCkKLSAgewotICAgIElET01BdHRyIGF0dHJOb2RlID0gbnVsbDsKLSAgICBOYW1lZE5vZGVNYXAgbWFwID0gcGFyZW50LmdldEF0dHJpYnV0ZXMoKTsKLQotICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBtYXAuZ2V0TGVuZ3RoKCk7IGluZGV4KyspCi0gICAgewotICAgICAgYXR0ck5vZGUgPSAoSURPTUF0dHIpIG1hcC5pdGVtKGluZGV4KTsKLSAgICAgIGJvb2xlYW4gbG9jYXRlZCA9IGF0dHJOb2RlLmNvbnRhaW5zKG9mZnNldCk7Ci0gICAgICBpZiAobG9jYXRlZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGF0dHJOb2RlLmhhc05hbWVPbmx5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyTm9kZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGF0dHJOb2RlID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0gICAgcmV0dXJuIGF0dHJOb2RlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG5vZGUgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgb24gaW4gdGhlIGRvY3VtZW50IG9yIG51bGwgaWYgbm8KLSAgICogbm9kZSBpcyBzZWxlY3RlZAotICAgKiAKLSAgICogQHBhcmFtIG9mZnNldCB0aGUgY3VycmVudCBjdXJzb3Igb2Zmc2V0LgotICAgKiBAcmV0dXJuIElET01Ob2RlIGVpdGhlciBlbGVtZW50LCBkb2N0eXBlLCB0ZXh0LCBhdHRyaWJ1dGUgb3IgbnVsbAotICAgKi8KLSAgcHJpdmF0ZSBJRE9NTm9kZSBnZXRDdXJyZW50Tm9kZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpCi0gIHsKLSAgICBJbmRleGVkUmVnaW9uIGlub2RlID0gbnVsbDsKLSAgICBJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLSAgICAgIGlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsKLSAgICAgIGlmIChpbm9kZSA9PSBudWxsKQotICAgICAgICBpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCAtIDEpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgaWYgKHNNb2RlbCAhPSBudWxsKQotICAgICAgICBzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0gICAgfQotCi0gICAgaWYgKGlub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgaW5vZGU7Ci0KLSAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IGdldEF0dHJpYnV0ZU5vZGUob2Zmc2V0LCBub2RlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBub2RlOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdGV4dCByZWdpb24gY29ycmVzcG9uZGluZyB0byBhbiBJRE9NTm9kZS4KLSAgICogCi0gICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIGZvciB3aGljaCB3ZSB3YW50IHRoZSB0ZXh0IHJlZ2lvbi4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHJldHVybiBhbiBJUmVnaW9uIGZvciB0aGUgbm9kZSwgb3IgbnVsbCBpZiB0aGUgbm9kZSBpcyBub3QgcmVjb2duaXplZC4KLSAgICovCi0gIHByb3RlY3RlZCBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbihJRE9NTm9kZSBub2RlKQotICB7Ci0gICAgaWYgKG5vZGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBJUmVnaW9uIGh5cGVyUmVnaW9uID0gbnVsbDsKLSAgICBzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQotICAgIHN3aXRjaCAobm9kZVR5cGUpCi0gICAgewotICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IAotICAgICAgICB7Ci0gICAgICAgICAgaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgbm9kZS5nZXRFbmRPZmZzZXQoKSAtIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogCi0gICAgICAgIHsKLSAgICAgICAgICBJRE9NQXR0ciBhdHQgPSAoSURPTUF0dHIpIG5vZGU7Ci0gIAotICAgICAgICAgIGludCByZWdPZmZzZXQgPSBhdHQuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotICAKLSAgICAgICAgICAvLyBJU1NVRTogV2UgYXJlIHVzaW5nIGEgZGVwcmVjYXRlZCBtZXRob2QgaGVyZS4gSXMgdGhlcmUKLSAgICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gZ2V0IHdoYXQgd2UgbmVlZD8KLSAgCi0gICAgICAgICAgSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBhdHQuZ2V0VmFsdWVSZWdpb24oKTsKLSAgICAgICAgICBpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcmVnTGVuZ3RoID0gdmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotICAgICAgICAgICAgU3RyaW5nIGF0dFZhbHVlID0gYXR0LmdldFZhbHVlUmVnaW9uVGV4dCgpOwotICAKLSAgICAgICAgICAgIC8vIERvIG5vdCBpbmNsdWRlIHF1b3RlcyBpbiBhdHRyaWJ1dGUgdmFsdWUgcmVnaW9uIGFuZCBvbmx5Ci0gICAgICAgICAgICAvLyB1bmRlcmxpbmUgdGhlIGFjdHVhbCB2YWx1ZSwgbm90IHRoZSBxdW90ZXMuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc1F1b3RlZChhdHRWYWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlZ0xlbmd0aCA9IHJlZ0xlbmd0aCAtIDI7Ci0gICAgICAgICAgICAgIHJlZ09mZnNldCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKHJlZ09mZnNldCwgcmVnTGVuZ3RoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotIAotICAgIHJldHVybiBoeXBlclJlZ2lvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZWxlY3Rpb25NYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9JU2VsZWN0aW9uTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWMwZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZWxlY3Rpb25NYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJU2VsZWN0aW9uTWFwcGVyCi17Ci0gIElTZWxlY3Rpb24gbWFwU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0ZWRPYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0ludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM0M2U1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuS2V5U3Ryb2tlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlByaW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmF2aWdhdGlvbkxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5SZWRlZmluZUNhdGVnb3J5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RSZWRlZmluZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5BZGRGaWVsZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VEaXJlY3RFZGl0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlc2lnblNlbGVjdEFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLklLZXlib2FyZERyYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Sb290Q29udGVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5BRFRNdWx0aVBhZ2VFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkVkaXRvck1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkVkaXRvck1vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5JQURURWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLlByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLkFEVENvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LlR5cGVWaXpFZGl0b3JNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQW55RWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RNb2RlbEdyb3VwQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RSZWRlZmluZWRBdHRyaWJ1dGVHcm91cEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRFJlZGVmaW5lZENvbXBsZXhUeXBlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEUmVkZWZpbmVkTW9kZWxHcm91cEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRFJlZGVmaW5lZFNpbXBsZVR5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkRlbGV0ZVhTRENvbmNyZXRlQ29tcG9uZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0QmFzZVR5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRNdWx0aXBsaWNpdHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRUeXBlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uYXZpZ2F0aW9uLkRlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uYXZpZ2F0aW9uLk11bHRpUGFnZUVkaXRvclRleHRTZWxlY3Rpb25OYXZpZ2F0aW9uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0LlhTRE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWxzLk9wZW5PblNlbGVjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IgZXh0ZW5kcyBBRFRNdWx0aVBhZ2VFZGl0b3IgaW1wbGVtZW50cyBJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciwgSU5hdmlnYXRpb25Mb2NhdGlvblByb3ZpZGVyCi17Ci0gIC8vIElNb2RlbCBtb2RlbDsKLSAgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWw7Ci0gIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gIFhTRE1vZGVsQWRhcHRlciBzY2hlbWFOb2RlQWRhcHRlcjsKLSAgcHJpdmF0ZSBPdXRsaW5lVHJlZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGZPdXRsaW5lTGlzdGVuZXI7Ci0gIHByaXZhdGUgU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIgZlNvdXJjZUVkaXRvclNlbGVjdGlvbkxpc3RlbmVyOwotICBwcml2YXRlIFhTRFNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25MaXN0ZW5lciBmWFNEU2VsZWN0aW9uTGlzdGVuZXI7Ci0gIHByaXZhdGUgSW50ZXJuYWxEb2N1bWVudENoYW5nZWROb3RpZmllciBpbnRlcm5hbERvY3VtZW50Q2hhbmdlZE5vdGlmaWVyID0gbmV3IEludGVybmFsRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIoKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9FRElUT1JfTU9ERV9FWFRFTlNJT05fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5lZGl0b3JNb2RlcyI7IC8vJE5PTi1OTFMtTiQgCi0gIHByaXZhdGUgWFNEUHJlZmVyZW5jZVN0b3JlTGlzdGVuZXIgeHNkUHJlZmVyZW5jZVN0b3JlTGlzdGVuZXI7Ci0gIAotICBjbGFzcyBJbnRlcm5hbERvY3VtZW50Q2hhbmdlZE5vdGlmaWVyIGltcGxlbWVudHMgSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpCi0gICAgewotICAgICAgbGlzdC5hZGQoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpCi0gICAgewotICAgICAgbGlzdC5yZW1vdmUoYWRhcHRlcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKQotICAgIHsKLSAgICAgIExpc3QgY2xvbmUgPSBuZXcgQXJyYXlMaXN0KGxpc3Quc2l6ZSgpKTsgICAgIAotICAgICAgY2xvbmUuYWRkQWxsKGxpc3QpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gY2xvbmUuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKWkubmV4dCgpOwotICAgICAgICBhZGFwdGVyLm5vdGlmeUNoYW5nZWQobm90aWZpZXIsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNldElucHV0VG9HcmFwaGljYWxWaWV3ZXIoSURvY3VtZW50IG5ld0RvY3VtZW50KQotICB7Ci0gICAgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIG9ubHkgc2V0IGlucHV0IGlmIHN0cnVjdHVyZWQgbW9kZWwgYWxyZWFkeSBleGlzdHMKLSAgICAgIC8vIChtZWFuaW5nIHNvdXJjZSBlZGl0b3IgaXMgYWxyZWFkeSBtYW5hZ2luZyB0aGUgbW9kZWwpCi0gICAgICBzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKG5ld0RvY3VtZW50KTsKLSAgICAgIGlmICgoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpICYmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKQotICAgICAgewotICAgICAgICBEb2N1bWVudCBkb2MgPSAoKElET01Nb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5nZXREb2N1bWVudCgpOwotICAgICAgICBpZiAoZG9jICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gWFNETW9kZWxBZGFwdGVyLmxvb2t1cE9yQ3JlYXRlTW9kZWxBZGFwdGVyKGRvYyk7Ci0gICAgICAgICAgaWYgKG1vZGVsQWRhcHRlciAhPSBudWxsKSAvLyBBc3NlcnQgc2hvdWxkIG5vdCBiZSBudWxsCi0gICAgICAgICAgewotICAgICAgICAgICAgbW9kZWxBZGFwdGVyLnNldFNjaGVtYSh4c2RTY2hlbWEpOwotICAgICAgICAgICAgeHNkU2NoZW1hID0gbW9kZWxBZGFwdGVyLnJlc2V0U2NoZW1hKGRvYyk7Ci0gICAgICAgICAgICBtb2RlbCA9IChJTW9kZWwpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoeHNkU2NoZW1hKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAKLSAgcHVibGljIElNb2RlbCBidWlsZE1vZGVsKCkKLSAgewotICAgIHRyeQotICAgIHsgICAgICAKLSAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgICAKLSAgICAgIC8vIElmIHRoZSBpbnB1dCBzY2hlbWEgaXMgZnJvbSB0aGUgV1NETCBFZGl0b3IsIHRoZW4gdXNlIHRoYXQgaW5saW5lIHNjaGVtYQotICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUFEVEVkaXRvcklucHV0KQotICAgICAgewotICAgICAgICB4c2RTY2hlbWEgPSAoKElBRFRFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldFNjaGVtYSgpOwotICAgICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgbW9kZWwgPSAoSU1vZGVsKSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KHhzZFNjaGVtYSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgIElEb2N1bWVudCBkb2MgPSBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICBpZiAoZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkKLSAgICAgIHsKLSAgICAgICAgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgIC8vIFRPRE86IGZvciBTdG9yYWdlRWRpdG9ySW5wdXRzLCBzaG91bGQgYmUgZm9yUmVhZAotICAgICAgICAgIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2MpOwotICAgICAgICAgIGlmIChtb2RlbCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlmIChtb2RlbCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgQXNzZXJ0LmlzTm90TnVsbChkb2N1bWVudCk7Ci0KLSAgICAgIGlmIChtb2RlbCAhPSBudWxsKQotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgICAKLSAgICAgIHhzZFNjaGVtYSA9IFhTRE1vZGVsQWRhcHRlci5sb29rdXBPckNyZWF0ZVNjaGVtYShkb2N1bWVudCk7Ci0gICAgICBtb2RlbCA9IChJTW9kZWwpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoeHNkU2NoZW1hKTsgICAgICAgICAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotCi0gICAgfQotICAgIAotLy8gICAgdHJ5Ci0vLyAgICB7Ci0vLyAgICAgIEVQYWNrYWdlLlJlZ2lzdHJ5IHJlZyA9IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFOwotLy8gICAgICBYU0RQYWNrYWdlIHhzZFBhY2thZ2UgPSAoWFNEUGFja2FnZSkgcmVnLmdldEVQYWNrYWdlKFhTRFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyAgICAgIHhzZFNjaGVtYSA9IHhzZFBhY2thZ2UuZ2V0WFNERmFjdG9yeSgpLmNyZWF0ZVhTRFNjaGVtYSgpOwotLy8gICAgICByZXNvdXJjZVNldCA9IFhTRFNjaGVtYUltcGwuY3JlYXRlUmVzb3VyY2VTZXQoKTsKLS8vICAgICAgSUZpbGUgcmVzb3VyY2VGaWxlID0gZWRpdG9ySW5wdXQuZ2V0RmlsZSgpOwotLy8gICAgICBzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChyZXNvdXJjZUZpbGUpOwotLy8gICAgICAvLyBJZiB0aGUgcmVzb3VyY2UgaXMgaW4gdGhlIHdvcmtzcGFjZS4uLi4KLS8vICAgICAgLy8gb3RoZXJ3aXNlIHRoZSB1c2VyIGlzIHRyeWluZyB0byBvcGVuIGFuIGV4dGVybmFsIGZpbGUKLS8vICAgICAgaWYgKHJlc291cmNlRmlsZSAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgU3RyaW5nIHBhdGhOYW1lID0gcmVzb3VyY2VGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLS8vICAgICAgICB4c2RSZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHBhdGhOYW1lKSwgdHJ1ZSk7Ci0vLyAgICAgICAgcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHhzZFJlc291cmNlKTsKLS8vICAgICAgICBPYmplY3Qgb2JqID0geHNkUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0vLyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKSBvYmo7Ci0vLyAgICAgICAgICB4c2RTY2hlbWEuc2V0RWxlbWVudCgoKElET01Nb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5nZXREb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpKTsKLS8vICAgICAgICAgIG1vZGVsID0gKElNb2RlbCkgWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh4c2RTY2hlbWEpOwotLy8gICAgICAgIH0KLS8vICAgICAgICAKLS8vICAgICAgICAvLyBJZiB0aGUgaW5wdXQgc2NoZW1hIGlzIGZyb20gdGhlIFdTREwgRWRpdG9yLCB0aGVuIHVzZSB0aGF0IGlubGluZSBzY2hlbWEKLS8vICAgICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBYU0RGaWxlRWRpdG9ySW5wdXQpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgeHNkU2NoZW1hID0gKChYU0RGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KS5nZXRTY2hlbWEoKTsKLS8vICAgICAgICAgIG1vZGVsID0gKElNb2RlbCkgWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh4c2RTY2hlbWEpOwotLy8gICAgICAgIH0KLS8vICAgICAgICBpZiAoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSAhPSBudWxsKQotLy8gICAgICAgICAgCi0vLyAgICAgICAgICAvLyBUT0RPIChjcykgLi4uIHdlIG5lZWQgdG8gbG9vayBpbnRvIHBlcmZvcm1hbmNlIGlzc3VlcyB3aGVuIHdlIGFkZCBlbGVtZW50cwotLy8gICAgICAgICAgLy8gc2VlbXMgdG8gYmUgdGhhdCBmb3JtYXR0aW5nIGlzIGNhdXNpZyBsb3RzIG9mIG5vdGlmaWNhdGlvbiBhbmQgdGhpbmdzIGdldCB0ZXJyaWJseSBzbG93Ci0vLyAgICAgICAgICAvLyBJJ20gc3BlY2lhbGl6aW5nIHRoZSBtZXRob2QgYmVsb3cgdG8gYWRkIGFuIGlzTW9kZWxTdGF0ZUNoYW5naW5nIGNoZWNrIHRoYXQgc2hvdWxkCi0vLyAgICAgICAgICAvLyBoZWxwIGhlcmUgLi4uIGJ1dCB3ZSBuZWVkIHRvIGludmVzdGlnYXRlIGZ1cnRoZXIKLS8vICAgICAgICAgIG5ldyBYU0RNb2RlbFJlY29uY2lsZUFkYXB0ZXIoeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5nZXRPd25lckRvY3VtZW50KCksIHhzZFNjaGVtYSkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTm90aWZ5Q2hhbmdlKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgTm9kZUltcGwpCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgTm9kZUltcGwgbm9kZUltcGwgPSAoTm9kZUltcGwpbm90aWZpZXI7Ci0vLyAgICAgICAgICAgICAgICBpZiAoIW5vZGVJbXBsLmdldE1vZGVsKCkuaXNNb2RlbFN0YXRlQ2hhbmdpbmcoKSkKLS8vICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICAgIHN1cGVyLmhhbmRsZU5vdGlmeUNoYW5nZShub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLS8vICAgICAgICAgICAgICAgICAgaW50ZXJuYWxEb2N1bWVudENoYW5nZWROb3RpZmllci5ub3RpZnlMaXN0ZW5lcnMobm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7Ci0vLyAgICAgICAgICAgICAgICB9ICAKLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgIH07Ci0vLyAgICAgICAgeHNkUmVzb3VyY2Uuc2V0TW9kaWZpZWQoZmFsc2UpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICBjYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpCi0vLyAgICB7Ci0vLyAgICB9Ci0vLyAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotLy8gICAgewotLy8gICAgfQotICAgIHJldHVybiBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotICAgIFhTRE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBudWxsOwotICAgIElET01Eb2N1bWVudCBkb2MgPSBudWxsOwotICAgIElEb2N1bWVudCBpZG9jID0gc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotICAgIGlmIChpZG9jICE9IG51bGwpCi0gICAgewotICAgICAgc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChpZG9jKTsKLSAgICAgIGlmICgoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpICYmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpICYmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGRvYyA9ICgoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZG9jICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1vZGVsQWRhcHRlciA9IChYU0RNb2RlbEFkYXB0ZXIpIGRvYy5nZXRFeGlzdGluZ0FkYXB0ZXIoWFNETW9kZWxBZGFwdGVyLmNsYXNzKTsKLSAgICAgICAgICAgICAgaWYgKG1vZGVsQWRhcHRlciAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG9jLmdldE1vZGVsKCkucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKG1vZGVsQWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKSk7Ci0gICAgICAgICAgICAgICAgZG9jLnJlbW92ZUFkYXB0ZXIobW9kZWxBZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpKTsKLSAgICAgICAgICAgICAgICBkb2MucmVtb3ZlQWRhcHRlcihtb2RlbEFkYXB0ZXIpOwotICAgICAgICAgICAgICAgIG1vZGVsQWRhcHRlci5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1vZGVsQWRhcHRlciA9IG51bGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgCi0KLQotICAgIGlmIChmT3V0bGluZVBhZ2UgIT0gbnVsbCkKLSAgICB7Ci0vLyAgICAgIGlmIChmT3V0bGluZVBhZ2UgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UgJiYgZk91dGxpbmVMaXN0ZW5lciAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgKChDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UpIGZPdXRsaW5lUGFnZSkucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihmT3V0bGluZUxpc3RlbmVyKTsKLS8vICAgICAgfQotICAgICAgaWYgKGZPdXRsaW5lTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZk91dGxpbmVQYWdlLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmT3V0bGluZUxpc3RlbmVyKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmWFNEU2VsZWN0aW9uTGlzdGVuZXIpOwotICAgIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih4c2RQcmVmZXJlbmNlU3RvcmVMaXN0ZW5lcik7Ci0gICAgeHNkUHJlZmVyZW5jZVN0b3JlTGlzdGVuZXIgPSBudWxsOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKQotICB7Ci0gICAgUm9vdENvbnRlbnRFZGl0UGFydCByb290ID0gbmV3IFJvb3RDb250ZW50RWRpdFBhcnQoKTsKLSAgICBpZiAoIShnZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUFEVEVkaXRvcklucHV0KSkKLSAgICB7Ci0gICAgICByb290LnNldE1vZGVsKG1vZGVsKTsKLSAgICB9Ci0gICAgZ3JhcGhpY2FsVmlld2VyLnNldENvbnRlbnRzKHJvb3QpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0gICAgZ3JhcGhpY2FsVmlld2VyLmdldEtleUhhbmRsZXIoKS5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkYyLCAwKSwgZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oR0VGQWN0aW9uQ29uc3RhbnRzLkRJUkVDVF9FRElUKSk7Ci0gICAgLy8gZ2V0IGVkaXQgcGFydCBmYWN0b3J5IGZyb20gZXh0ZW5zaW9uCi0gICAgRWRpdFBhcnRGYWN0b3J5IGVkaXRQYXJ0RmFjdG9yeSA9IGdldEVkaXRvck1vZGVNYW5hZ2VyKCkuZ2V0Q3VycmVudE1vZGUoKS5nZXRFZGl0UGFydEZhY3RvcnkoKTsKLSAgICBncmFwaGljYWxWaWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGVkaXRQYXJ0RmFjdG9yeSk7ICAgCi0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgdHlwZSkKLSAgewotICAgIGlmICh0eXBlID09IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKQotICAgIHsKLSAgICAgIFhTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSBuZXcgWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UodGhpcyk7Ci0gICAgICByZXR1cm4gcGFnZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpCi0gICAgewotICAgICAgcmV0dXJuIGdldFNlbGVjdGlvbk1hbmFnZXIoKTsKLSAgICB9ICAKLSAgICBlbHNlIGlmICh0eXBlID09IFhTRFNjaGVtYS5jbGFzcykKLSAgICB7Ci0gICAgICByZXR1cm4geHNkU2NoZW1hOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IElLZXlib2FyZERyYWcuY2xhc3MpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBLZXlib2FyZERyYWdJbXBsKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykKLSAgICB7Ci0gICAgICBPYmplY3QgYWRhcHRlciA9IHN1cGVyLmdldEFkYXB0ZXIodHlwZSk7Ci0gICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBJQ29udGVudE91dGxpbmVQYWdlIHBhZ2UgPSAoSUNvbnRlbnRPdXRsaW5lUGFnZSkgYWRhcHRlcjsKLSAgICAgICAgZk91dGxpbmVMaXN0ZW5lciA9IG5ldyBPdXRsaW5lVHJlZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgICAgIHBhZ2UuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZPdXRsaW5lTGlzdGVuZXIpOwotICAgICAgICAKLS8vICAgICAgICBpZiAocGFnZSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAoKENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSkgcGFnZSkuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihmT3V0bGluZUxpc3RlbmVyKTsKLS8vICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWdlOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IFhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKQotICAgIHsKLSAgICAJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAJewotICAgIAkJSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQ7Ci0gICAgCQkvLyBUT0RPIChjcykgY3VycmVudGx5IHdlIGFzc3VtZSB0aGUgc2NoZW1hIGVkaXRvciB3aWxsIG9ubHkgZXZlciBlZGl0IGEKLSAgICAJCS8vIHNpbmdsZSBzY2hlbWEKLSAgICAJCS8vLyBidXQgaWYgd2Ugd2FudCB0byBlbmFibGUgdGhlIHNjaGVtYSBlZGl0b3IgdG8gZWRpdCB3c2RsIGZpbGVzIHdlCi0gICAgCQkvLyBzaG91bGQgcGFzcyBpbgotICAgIAkJLy8gYW4gYXJyYXkgb2Ygc2NoZW1hcwotICAgIAkJLy8gaG1tLi4gcGVyaGFwcyBqdXN0IHBhc3MgaW4gYSBSZXNvdXJjZVNldAotICAgIAkJWFNEU2NoZW1hW10gc2NoZW1hcyA9IHt4c2RTY2hlbWF9OwotICAgIAkJcmV0dXJuIG5ldyBYU0RBdHRyaWJ1dGVSZWZlcmVuY2VFZGl0TWFuYWdlcihmaWxlRWRpdG9ySW5wdXQuZ2V0RmlsZSgpLCBzY2hlbWFzKTsKLSAgICAJfQotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcykKLSAgICB7Ci0gICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgIHsKLSAgICAgICAgSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQ7Ci0gICAgICAgIC8vIFRPRE8gKGNzKSBjdXJyZW50bHkgd2UgYXNzdW1lIHRoZSBzY2hlbWEgZWRpdG9yIHdpbGwgb25seSBldmVyIGVkaXQgYQotICAgICAgICAvLyBzaW5nbGUgc2NoZW1hCi0gICAgICAgIC8vLyBidXQgaWYgd2Ugd2FudCB0byBlbmFibGUgdGhlIHNjaGVtYSBlZGl0b3IgdG8gZWRpdCB3c2RsIGZpbGVzIHdlCi0gICAgICAgIC8vIHNob3VsZCBwYXNzIGluCi0gICAgICAgIC8vIGFuIGFycmF5IG9mIHNjaGVtYXMKLSAgICAgICAgLy8gaG1tLi4gcGVyaGFwcyBqdXN0IHBhc3MgaW4gYSBSZXNvdXJjZVNldAotICAgICAgICBYU0RTY2hlbWFbXSBzY2hlbWFzID0ge3hzZFNjaGVtYX07Ci0gICAgICAgIHJldHVybiBuZXcgWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCksIHNjaGVtYXMpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcykKLSAgICB7Ci0gICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgIHsKLSAgICAgICAgSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQ7Ci0gICAgICAgIC8vIFRPRE8gKGNzKSBjdXJyZW50bHkgd2UgYXNzdW1lIHRoZSBzY2hlbWEgZWRpdG9yIHdpbGwgb25seSBldmVyIGVkaXQgYQotICAgICAgICAvLyBzaW5nbGUgc2NoZW1hCi0gICAgICAgIC8vIGJ1dCBpZiB3ZSB3YW50IHRvIGVuYWJsZSB0aGUgc2NoZW1hIGVkaXRvciB0byBlZGl0IHdzZGwgZmlsZXMgd2UKLSAgICAgICAgLy8gc2hvdWxkIHBhc3MgaW4KLSAgICAgICAgLy8gYW4gYXJyYXkgb2Ygc2NoZW1hcwotICAgICAgICAvLyBobW0uLiBwZXJoYXBzIGp1c3QgcGFzcyBpbiBhIFJlc291cmNlU2V0Ci0gICAgICAgIFhTRFNjaGVtYVtdIHNjaGVtYXMgPSB7eHNkU2NoZW1hfTsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSwgc2NoZW1hcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyLmNsYXNzKQotICAgIHsKLSAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgewotICAgICAgICBJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dDsKLSAgICAgICAgLy8gVE9ETyAoY3MpIGN1cnJlbnRseSB3ZSBhc3N1bWUgdGhlIHNjaGVtYSBlZGl0b3Igd2lsbCBvbmx5IGV2ZXIgZWRpdCBhCi0gICAgICAgIC8vIHNpbmdsZSBzY2hlbWEKLSAgICAgICAgLy8gYnV0IGlmIHdlIHdhbnQgdG8gZW5hYmxlIHRoZSBzY2hlbWEgZWRpdG9yIHRvIGVkaXQgd3NkbCBmaWxlcyB3ZQotICAgICAgICAvLyBzaG91bGQgcGFzcyBpbgotICAgICAgICAvLyBhbiBhcnJheSBvZiBzY2hlbWFzCi0gICAgICAgIC8vIGhtbS4uIHBlcmhhcHMganVzdCBwYXNzIGluIGEgUmVzb3VyY2VTZXQKLSAgICAgICAgWFNEU2NoZW1hW10gc2NoZW1hcyA9IHt4c2RTY2hlbWF9OwotICAgICAgICByZXR1cm4gbmV3IFhTRENvbXBsZXhUeXBlQmFzZVR5cGVFZGl0TWFuYWdlcihmaWxlRWRpdG9ySW5wdXQuZ2V0RmlsZSgpLCBzY2hlbWFzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBYU0RTdWJzdGl0dXRpb25Hcm91cEVkaXRNYW5hZ2VyLmNsYXNzKQotICAgIHsKLSAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgewotICAgICAgICBJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dDsKLSAgICAgICAgWFNEU2NoZW1hW10gc2NoZW1hcyA9IHt4c2RTY2hlbWF9OwotICAgICAgICByZXR1cm4gbmV3IFhTRFN1YnN0aXR1dGlvbkdyb3VwRWRpdE1hbmFnZXIoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSwgc2NoZW1hcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gSVRleHRFZGl0b3IuY2xhc3MpCi0gICAgewotICAgICAgcmV0dXJuIGdldFRleHRFZGl0b3IoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBJU2VsZWN0aW9uTWFwcGVyLmNsYXNzKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgWFNEU2VsZWN0aW9uTWFwcGVyKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyLmNsYXNzKQotICAgIHsKLSAgICAgIHJldHVybiBpbnRlcm5hbERvY3VtZW50Q2hhbmdlZE5vdGlmaWVyOwotICAgIH0gIAotICAgIGVsc2UgaWYgKHR5cGUgPT0gUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5jbGFzcykKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIoKTsKLSAgICB9ICAKLSAgICByZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcih0eXBlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udHJpYnV0b3JJZCgpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRYU0RTY2hlbWEoKQotICB7Ci0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2Qgb3Blbk9uR2xvYmFsUmVmZXJlbmNlLiBUaGUgY29tcCBhcmd1bWVudCBpcyBhIHJlc29sdmVkIHhzZCBzY2hlbWEKLSAgICogb2JqZWN0IGZyb20gYW5vdGhlciBmaWxlLiBUaGlzIGlzIGNyZWF0ZWQgYW5kIGNhbGxlZCBmcm9tIGFub3RoZXIgc2NoZW1hCi0gICAqIG1vZGVsIHRvIGFsbG93IEYzIG5hdmlnYXRpb24gdG8gb3BlbiBhIG5ldyBlZGl0b3IgYW5kIGNob29zZSB0aGUgcmVmZXJlbmNlZAotICAgKiBvYmplY3Qgd2l0aGluIHRoYXQgZWRpdG9yIGNvbnRleHQKLSAgICogCi0gICAqIEBwYXJhbSBjb21wCi0gICAqLwotICBwdWJsaWMgdm9pZCBvcGVuT25HbG9iYWxSZWZlcmVuY2UoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gb3Blbk9uU2VsZWN0aW9uSGVscGVyLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShjb21wKTsKLSAgICAKLSAgICBpZiAobmFtZWRDb21wb25lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lZENvbXBvbmVudCA9IGdldFhTRFNjaGVtYSgpOwotICAgIH0KLSAgICBYU0RCYXNlQWRhcHRlciBhZGFwdGVyID0gKFhTREJhc2VBZGFwdGVyKSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KG5hbWVkQ29tcG9uZW50KTsKLSAgICBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGFkYXB0ZXIpKTsKLSAgICBJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgfQotCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBPcGVuT25TZWxlY3Rpb25IZWxwZXIgb3Blbk9uU2VsZWN0aW9uSGVscGVyOwotCi0gIHB1YmxpYyBPcGVuT25TZWxlY3Rpb25IZWxwZXIgZ2V0T3Blbk9uU2VsZWN0aW9uSGVscGVyKCkKLSAgewotICAgIHJldHVybiBvcGVuT25TZWxlY3Rpb25IZWxwZXI7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyB0aGUgcGFnZXMgb2YgdGhlIG11bHRpLXBhZ2UgZWRpdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGFnZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlUGFnZXMoKTsKLSAgICAKLS8vICAgIHNlbGVjdGlvblByb3ZpZGVyID0gZ2V0U2VsZWN0aW9uTWFuYWdlcigpOwotLy8gICAgZ2V0RWRpdG9yU2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHNlbGVjdGlvblByb3ZpZGVyKTsKLS8vICAgIAotLy8gICAgc3RydWN0dXJlZFRleHRFZGl0b3IgPSBuZXcgU3RydWN0dXJlZFRleHRFZGl0b3IoKTsKLS8vICAgIG1vZGVsID0gYnVpbGRNb2RlbCgoSUZpbGVFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0vLyAgICBjcmVhdGVHcmFwaFBhZ2UoKTsKLS8vICAgIGNyZWF0ZVNvdXJjZVBhZ2UoKTsKLQotICAgIG9wZW5PblNlbGVjdGlvbkhlbHBlciA9IG5ldyBPcGVuT25TZWxlY3Rpb25IZWxwZXIoZ2V0VGV4dEVkaXRvcigpLCBnZXRYU0RTY2hlbWEoKSk7Ci0KLSAgICBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLSAgICBmU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIoKTsKLSAgICBpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyKQotICAgIHsKLSAgICAgICgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgcHJvdmlkZXIpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlNvdXJjZUVkaXRvclNlbGVjdGlvbkxpc3RlbmVyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIpOwotICAgIH0KLSAgICBmWFNEU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgWFNEU2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0gICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmWFNEU2VsZWN0aW9uTGlzdGVuZXIpOwotICAgIAotICAgIHhzZFByZWZlcmVuY2VTdG9yZUxpc3RlbmVyID0gbmV3IFhTRFByZWZlcmVuY2VTdG9yZUxpc3RlbmVyKCk7Ci0gICAgWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHhzZFByZWZlcmVuY2VTdG9yZUxpc3RlbmVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBYU0RQcmVmZXJlbmNlU3RvcmVMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJvcGVydHkgPSBldnQuZ2V0UHJvcGVydHkoKTsKLSAgICAgIGlmIChYU0RFZGl0b3JQbHVnaW4uQ09OU1RfU0hPV19FWFRFUk5BTFMuZXF1YWxzKHByb3BlcnR5KSkKLSAgICAgIHsKLSAgICAgICAgKChHcmFwaGljYWxFZGl0UGFydCkgZ3JhcGhpY2FsVmlld2VyLmdldENvbnRlbnRzKCkpLmdldEZpZ3VyZSgpLmludmFsaWRhdGVUcmVlKCk7Ci0gICAgICAgIGdyYXBoaWNhbFZpZXdlci5nZXRDb250ZW50cygpLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgewotICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgcmV0dXJuICEoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0IHx8IGVkaXRvcklucHV0IGluc3RhbmNlb2YgRmlsZVN0b3JlRWRpdG9ySW5wdXQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLSAgICAKLSAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IGdldEFjdGlvblJlZ2lzdHJ5KCk7Ci0gICAgCi0gICAgLy8gYWRkIGFuIGlzUmVhZE9ubHkgbWV0aG9kIHRvIHRoZSBlZGl0b3JQYXJ0IGluc3RlYWQKLSAgICBpZiAoIWlzUmVhZE9ubHkoKSkKLSAgICB7Ci0gICAgQmFzZVNlbGVjdGlvbkFjdGlvbiBhY3Rpb24gPSBuZXcgQWRkRmllbGRBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICBhY3Rpb24gPSBuZXcgRGVsZXRlQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IERlc2lnblNlbGVjdEFsbCh0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgIAotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RSZWRlZmluZWRDb21wbGV4VHlwZUFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsIE1lc3NhZ2VzLl9VSV9JTUFHRV9DT01QTEVYX1RZUEUpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgIAotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RSZWRlZmluZWRTaW1wbGVUeXBlQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgTWVzc2FnZXMuX1VJX0lNQUdFX1NJTVBMRV9UWVBFKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEUmVkZWZpbmVkQXR0cmlidXRlR3JvdXBBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCBNZXNzYWdlcy5fVUlfSU1BR0VfQVRUUklCVVRFX0dST1VQKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEUmVkZWZpbmVkTW9kZWxHcm91cEFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsIE1lc3NhZ2VzLl9VSV9JTUFHRV9NT0RFTF9HUk9VUCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IFNldEJhc2VUeXBlQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREVsZW1lbnRBY3Rpb24odGhpcywgQWRkWFNERWxlbWVudEFjdGlvbi5JRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRUxFTUVOVCwgZmFsc2UpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREVsZW1lbnQuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNERWxlbWVudEFjdGlvbih0aGlzLCBBZGRYU0RFbGVtZW50QWN0aW9uLkJFRk9SRV9TRUxFQ1RFRF9JRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9CRUZPUkUsIGZhbHNlKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RFbGVtZW50LmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOyAgICAgICAKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNERWxlbWVudEFjdGlvbih0aGlzLCBBZGRYU0RFbGVtZW50QWN0aW9uLkFGVEVSX1NFTEVDVEVEX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FGVEVSLCBmYWxzZSk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNERWxlbWVudC5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsgICAgICAKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNERWxlbWVudEFjdGlvbih0aGlzLCBBZGRYU0RFbGVtZW50QWN0aW9uLlJFRl9JRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRUxFTUVOVF9SRUYsIHRydWUpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREVsZW1lbnRSZWYuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNETW9kZWxHcm91cEFjdGlvbih0aGlzLCBYU0RDb21wb3NpdG9yLlNFUVVFTkNFX0xJVEVSQUwsIEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uU0VRVUVOQ0VfSUQpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTRFNlcXVlbmNlLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24odGhpcywgWFNEQ29tcG9zaXRvci5DSE9JQ0VfTElURVJBTCwgQWRkWFNETW9kZWxHcm91cEFjdGlvbi5DSE9JQ0VfSUQpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTRENob2ljZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNETW9kZWxHcm91cEFjdGlvbih0aGlzLCBYU0RDb21wb3NpdG9yLkFMTF9MSVRFUkFMLCBBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLkFMTF9JRCk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEQWxsLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uKHRoaXMsIGZhbHNlKTsKLSAgICBhY3Rpb24uc2V0SWQoQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb24uTU9ERUxHUk9VUERFRklOSVRJT05fSUQpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREdyb3VwLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uKHRoaXMsIHRydWUpOwotICAgIGFjdGlvbi5zZXRJZChBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbi5NT0RFTEdST1VQREVGSU5JVElPTlJFRl9JRCk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihYU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9vYmoxNi9YU0RHcm91cFJlZi5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25BY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24odGhpcywgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uQkVGT1JFX1NFTEVDVEVEX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0JFRk9SRSwgZmFsc2UpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREF0dHJpYnV0ZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24odGhpcywgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uQUZURVJfU0VMRUNURURfSUQsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUZURVIsIGZhbHNlKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uKHRoaXMsIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLlJFRl9JRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX1JFRiwgdHJ1ZSk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEQXR0cmlidXRlUmVmLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IE9wZW5Jbk5ld0VkaXRvcih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbih0aGlzKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RBdHRyaWJ1dGVHcm91cC5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24odGhpcywgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uLlJFRl9JRCk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RBbnlFbGVtZW50QWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREFueS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREFueUF0dHJpYnV0ZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uKHRoaXMsIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbi5JTkNMVURFX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9JTkNMVURFKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RJbmNsdWRlLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEU2ltcGxlRW51bS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNERW51bWVyYXRpb25GYWNldEFjdGlvbih0aGlzLCBBZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uLkJFRk9SRV9TRUxFQ1RFRF9JRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9CRUZPUkUpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTRFNpbXBsZUVudW0uZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7ICAgICAgIAotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24odGhpcywgQWRkWFNERW51bWVyYXRpb25GYWNldEFjdGlvbi5BRlRFUl9TRUxFQ1RFRF9JRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9BRlRFUik7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEU2ltcGxlRW51bS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsgICAgICAgCi0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uKHRoaXMsIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbi5JTVBPUlRfSUQsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0lNUE9SVCk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNESW1wb3J0LmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbih0aGlzLCBBZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24uUkVERUZJTkVfSUQsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1JFREVGSU5FKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RSZWRlZmluZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBTZXRUeXBlQWN0aW9uIHNldE5ld0NvbXBsZXhUeXBlQWN0aW9uID0gbmV3IFNldFR5cGVBY3Rpb24oTWVzc2FnZXMuX1VJX0FDVElPTl9ORVcsIFNldFR5cGVBY3Rpb24uU0VUX05FV19UWVBFX0lELCB0aGlzKTsKLSAgICBzZXROZXdDb21wbGV4VHlwZUFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIAotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKHNldE5ld0NvbXBsZXhUeXBlQWN0aW9uKTsKLSAgICAgICAgCi0gICAgU2V0VHlwZUFjdGlvbiBzZXRFeGlzdGluZ1R5cGVBY3Rpb24gPSBuZXcgU2V0VHlwZUFjdGlvbihNZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRSwgU2V0VHlwZUFjdGlvbi5TRUxFQ1RfRVhJU1RJTkdfVFlQRV9JRCwgdGhpcyk7Ci0gICAgc2V0RXhpc3RpbmdUeXBlQWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oc2V0RXhpc3RpbmdUeXBlQWN0aW9uKTsKLQotICAgIGFkZE11bHRpcGxpY2l0eU1lbnUocmVnaXN0cnkpOwotICAgIAotICAgIFByaW50QWN0aW9uIHByaW50QWN0aW9uID0gbmV3IFByaW50QWN0aW9uKHRoaXMpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKHByaW50QWN0aW9uKTsKLSAgICAKLSAgICBCYXNlRGlyZWN0RWRpdEFjdGlvbiBkaXJlY3RFZGl0QWN0aW9uID0gbmV3IEJhc2VEaXJlY3RFZGl0QWN0aW9uKHRoaXMpOwotICAgIGRpcmVjdEVkaXRBY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihkaXJlY3RFZGl0QWN0aW9uKTsKLSAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEJhc2VTZWxlY3Rpb25BY3Rpb24gYWN0aW9uID0gbmV3IE9wZW5Jbk5ld0VkaXRvcih0aGlzKTsKLSAgICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgICAgYWN0aW9uID0gbmV3IFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbih0aGlzKTsKLSAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgICAKLSAgICAgIFByaW50QWN0aW9uIHByaW50QWN0aW9uID0gbmV3IFByaW50QWN0aW9uKHRoaXMpOwotICAgICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24ocHJpbnRBY3Rpb24pOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkTXVsdGlwbGljaXR5TWVudShBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSkKLSAgewotICAgIFNldE11bHRpcGxpY2l0eUFjdGlvbiBvbmVNdWx0aXBsaWNpdHkgPSBuZXcgU2V0TXVsdGlwbGljaXR5QWN0aW9uKHRoaXMsICIxLi4xICgiICsgTWVzc2FnZXMuX1VJX0xBQkVMX1JFUVVJUkVEICsgIikiLCBTZXRNdWx0aXBsaWNpdHlBY3Rpb24uUkVRVUlSRURfSUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBvbmVNdWx0aXBsaWNpdHkuc2V0TWF4T2NjdXJzKDEpOwotICAgIG9uZU11bHRpcGxpY2l0eS5zZXRNaW5PY2N1cnMoMSk7Ci0gICAgb25lTXVsdGlwbGljaXR5LnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24ob25lTXVsdGlwbGljaXR5KTsKLQotICAgIFNldE11bHRpcGxpY2l0eUFjdGlvbiB6ZXJvT3JNb3JlTXVsdGlwbGljaXR5ID0gbmV3IFNldE11bHRpcGxpY2l0eUFjdGlvbih0aGlzLCAiMC4uKiAoIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9aRVJPX09SX01PUkUgKyAiKSIsIFNldE11bHRpcGxpY2l0eUFjdGlvbi5aRVJPX09SX01PUkVfSUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB6ZXJvT3JNb3JlTXVsdGlwbGljaXR5LnNldE1heE9jY3VycygtMSk7Ci0gICAgemVyb09yTW9yZU11bHRpcGxpY2l0eS5zZXRNaW5PY2N1cnMoMCk7Ci0gICAgemVyb09yTW9yZU11bHRpcGxpY2l0eS5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKHplcm9Pck1vcmVNdWx0aXBsaWNpdHkpOwotICAgIAotICAgIFNldE11bHRpcGxpY2l0eUFjdGlvbiB6ZXJvT3JPbmVNdWx0aXBsaWNpdHkgPSBuZXcgU2V0TXVsdGlwbGljaXR5QWN0aW9uKHRoaXMsICIwLi4xICgiICsgTWVzc2FnZXMuX1VJX0xBQkVMX09QVElPTkFMICsgIikiLCBTZXRNdWx0aXBsaWNpdHlBY3Rpb24uWkVST19PUl9PTkVfSUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB6ZXJvT3JPbmVNdWx0aXBsaWNpdHkuc2V0TWF4T2NjdXJzKDEpOwotICAgIHplcm9Pck9uZU11bHRpcGxpY2l0eS5zZXRNaW5PY2N1cnMoMCk7Ci0gICAgemVyb09yT25lTXVsdGlwbGljaXR5LnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oemVyb09yT25lTXVsdGlwbGljaXR5KTsKLQotICAgIFNldE11bHRpcGxpY2l0eUFjdGlvbiBvbmVPck1vcmVNdWx0aXBsaWNpdHkgPSBuZXcgU2V0TXVsdGlwbGljaXR5QWN0aW9uKHRoaXMsICIxLi4qICgiICsgTWVzc2FnZXMuX1VJX0xBQkVMX09ORV9PUl9NT1JFICsgIikiLCBTZXRNdWx0aXBsaWNpdHlBY3Rpb24uT05FX09SX01PUkVfSUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBvbmVPck1vcmVNdWx0aXBsaWNpdHkuc2V0TWF4T2NjdXJzKC0xKTsKLSAgICBvbmVPck1vcmVNdWx0aXBsaWNpdHkuc2V0TWluT2NjdXJzKDEpOwotICAgIG9uZU9yTW9yZU11bHRpcGxpY2l0eS5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKG9uZU9yTW9yZU11bHRpcGxpY2l0eSk7Ci0gICAgCi0gIH0KLQotICAvKioKLSAgICogTGlzdGVuZXIgb24gU1NFJ3Mgb3V0bGluZSBwYWdlJ3Mgc2VsZWN0aW9ucyB0aGF0IGNvbnZlcnRzIERPTSBzZWxlY3Rpb25zCi0gICAqIGludG8geHNkIHNlbGVjdGlvbnMgYW5kIG5vdGlmaWVzIFhTRCBzZWxlY3Rpb24gbWFuYWdlcgotICAgKi8KLSAgY2xhc3MgT3V0bGluZVRyZWVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElEb3VibGVDbGlja0xpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgT3V0bGluZVRyZWVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpCi0gICAgewotICAgIH0KLQotICAgIHByaXZhdGUgSVNlbGVjdGlvbiBnZXRYU0RTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gICAgewotICAgICAgSVNlbGVjdGlvbiBzZWwgPSBudWxsOwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgIE9iamVjdCBvID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG8gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG8pOwotICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICB9Ci0gICAgICByZXR1cm4gc2VsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgRE9NIG5vZGUgYmFzZWQgb24gb2JqZWN0ICh4c2Qgbm9kZSkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGdldE9iamVjdEZvck90aGVyTW9kZWwoT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSBudWxsOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpCi0gICAgICB7Ci0gICAgICAgIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBub2RlID0gKChYU0RDb21wb25lbnQpIG9iamVjdCkuZ2V0RWxlbWVudCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVkZWZpbmVDYXRlZ29yeUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIG5vZGUgPSAoKFJlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyKSBvYmplY3QpLmdldFhTRFJlZGVmaW5lKCkuZ2V0RWxlbWVudCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyKQotICAgICAgewotICAgICAgICBub2RlID0gKChDYXRlZ29yeUFkYXB0ZXIpIG9iamVjdCkuZ2V0WFNEU2NoZW1hKCkuZ2V0RWxlbWVudCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKFhTREJhc2VBZGFwdGVyKSBvYmplY3QpLmdldFRhcmdldCgpIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBub2RlID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgKChYU0RCYXNlQWRhcHRlcikgb2JqZWN0KS5nZXRUYXJnZXQoKSkuZ2V0RWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyB0aGUgdGV4dCBlZGl0b3IgY2FuIG9ubHkgYWNjZXB0IHNlZCBub2RlcyEKLSAgICAgIC8vCi0gICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpKQotICAgICAgewotICAgICAgICBub2RlID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBub2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFNlbGVjdGlvbiBpbiBvdXRsaW5lIHRyZWUgY2hhbmdlZCBzbyBzZXQgb3V0bGluZSB0cmVlJ3Mgc2VsZWN0aW9uIGludG8KLSAgICAgICAqIGVkaXRvcidzIHNlbGVjdGlvbiBhbmQgc2F5IGl0IGNhbWUgZnJvbSBvdXRsaW5lIHRyZWUKLSAgICAgICAqLwotICAgICAgaWYgKGdldFNlbGVjdGlvbk1hbmFnZXIoKSAhPSBudWxsICYmIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRFbmFibGVOb3RpZnkoKSkKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRYU0RTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZk91dGxpbmVQYWdlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0VGV4dEVkaXRvcigpICE9IG51bGwgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgc3RhcnQgPSAtMTsKLSAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgICBPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgaWYgKG8gIT0gbnVsbCkKLSAgICAgICAgICAgIG8gPSBnZXRPYmplY3RGb3JPdGhlck1vZGVsKG8pOwotICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbykuZ2V0U3RhcnRPZmZzZXQoKTsKLSAgICAgICAgICAgIGxlbmd0aCA9ICgoSW5kZXhlZFJlZ2lvbikgbykuZ2V0RW5kT2Zmc2V0KCkgLSBzdGFydDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHN0YXJ0ID4gLTEpCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2V0VGV4dEVkaXRvcigpLnNlbGVjdEFuZFJldmVhbChzdGFydCwgbGVuZ3RoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogU2VsZWN0aW9uIGluIG91dGxpbmUgdHJlZSBjaGFuZ2VkIHNvIHNldCBvdXRsaW5lIHRyZWUncyBzZWxlY3Rpb24gaW50bwotICAgICAgICogZWRpdG9yJ3Mgc2VsZWN0aW9uIGFuZCBzYXkgaXQgY2FtZSBmcm9tIG91dGxpbmUgdHJlZQotICAgICAgICovCi0gICAgICBpZiAoZ2V0U2VsZWN0aW9uTWFuYWdlcigpICE9IG51bGwgJiYgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmdldEVuYWJsZU5vdGlmeSgpKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFhTRFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmT3V0bGluZVBhZ2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotIAotICAvKioKLSAgICogTGlzdGVuZXIgb24gU1NFJ3Mgc291cmNlIGVkaXRvcidzIHNlbGVjdGlvbnMgdGhhdCBjb252ZXJ0cyBET00gc2VsZWN0aW9ucwotICAgKiBpbnRvIHhzZCBzZWxlY3Rpb25zIGFuZCBub3RpZmllcyBYU0Qgc2VsZWN0aW9uIG1hbmFnZXIKLSAgICovCi0gIHByaXZhdGUgY2xhc3MgU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIHsKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIFhTRCBub2RlIGJhc2VkIG9uIG9iamVjdCAoRE9NIG5vZGUpCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBnZXRYU0ROb2RlKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgLy8gZ2V0IHRoZSBlbGVtZW50IG5vZGUKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLSAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50ID0gKChBdHRyKSBub2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtb2RlbDsgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBPYmplY3QgbyA9IGVsZW1lbnQ7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSBnZXRYU0RTY2hlbWEoKS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KGVsZW1lbnQpOwotICAgICAgICBpZiAobW9kZWxPYmplY3QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG8gPSBtb2RlbE9iamVjdDsKLSAgICAgICAgICBvID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCgoTm90aWZpZXIpIG1vZGVsT2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgaWYgKGdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRFbmFibGVOb3RpZnkoKSAmJiBnZXRBY3RpdmVQYWdlKCkgPT0gMSkKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdCB4c2RTZWxlY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBkb21Ob2RlID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBPYmplY3QgeHNkTm9kZSA9IGdldFhTRE5vZGUoZG9tTm9kZSk7Ci0gICAgICAgICAgICBpZiAoeHNkTm9kZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4c2RTZWxlY3Rpb25zLmFkZCh4c2ROb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh4c2ROb2RlIGluc3RhbmNlb2YgWFNEUmVkZWZpbmVBZGFwdGVyKQotICAgICAgICAgICAgCXJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCF4c2RTZWxlY3Rpb25zLmlzRW1wdHkoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHhzZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHhzZFNlbGVjdGlvbnMpOwotICAgICAgICAgICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbih4c2RTZWxlY3Rpb24sIGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIExpc3RlbmVyIG9uIFhTRCdzIHNlbGVjdGlvbiBtYW5hZ2VyJ3Mgc2VsZWN0aW9ucyB0aGF0IGNvbnZlcnRzIFhTRAotICAgKiBzZWxlY3Rpb25zIGludG8gRE9NIHNlbGVjdGlvbnMgYW5kIG5vdGlmaWVzIFNTRSdzIHNlbGVjdGlvbiBwcm92aWRlcgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBYU0RTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIHsKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIERPTSBub2RlIGJhc2VkIG9uIG9iamVjdCAoeHNkIG5vZGUpCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBnZXRPYmplY3RGb3JPdGhlck1vZGVsKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKQotICAgICAgewotICAgICAgICBub2RlID0gKE5vZGUpIG9iamVjdDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9ICgoWFNEQ29tcG9uZW50KSBvYmplY3QpLmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyKQotICAgICAgewotICAgICAgICBSZWRlZmluZUNhdGVnb3J5QWRhcHRlciBjYXRlZ29yeSA9IChSZWRlZmluZUNhdGVnb3J5QWRhcHRlcilvYmplY3Q7Ci0gICAgICAgIG5vZGUgPSBjYXRlZ29yeS5nZXRYU0RSZWRlZmluZSgpLmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5QWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9ICgoQ2F0ZWdvcnlBZGFwdGVyKSBvYmplY3QpLmdldFhTRFNjaGVtYSgpLmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgICAgewotICAgICAgICBpZiAoKChYU0RCYXNlQWRhcHRlcikgb2JqZWN0KS5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpICgoWFNEQmFzZUFkYXB0ZXIpIG9iamVjdCkuZ2V0VGFyZ2V0KCkpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgewotICAgICAgICAvLyBUaGlzIGNhc2Ugd2FzIGFkZGVkIHRvIG1ha2UgdGhlIEYzL2h5cGVybGluayBuYXZpZ2F0aW9uIHdvcmsgd2hlbiBhbgotICAgICAgICAvLyBpbmxpbmUgc2NoZW1hIGZyb20gYSBXU0RMIGRvY3VtZW50IGlzIG9wZW5lZCBpbiB0aGUgc2NoZW1hIGVkaXRvci4KLSAgICAgICAgLy8gVGhlIHN0cmluZyBpcyBleHBlY3RlZCB0byBiZSBhIFVSSSBmcmFnbWVudCB1c2VkIHRvIGlkZW50aWZ5IGFuIFhTRAotICAgICAgICAvLyBjb21wb25lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGVuY2xvc2luZyBXU0RMIHJlc291cmNlLgotCi0gICAgICAgIFN0cmluZyB1cmlGcmFnbWVudCA9IChTdHJpbmcpIG9iamVjdDsKLSAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSB4c2RTY2hlbWEuZVJlc291cmNlKCk7Ci0gICAgICAgIEVPYmplY3QgbW9kZWxPYmplY3QgPSByZXNvdXJjZS5nZXRFT2JqZWN0KHVyaUZyYWdtZW50KTsKLQotICAgICAgICBpZiAobW9kZWxPYmplY3QgIT0gbnVsbCAmJiBtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIFhTRENvbXBvbmVudCBjb21wb25lbnQgPSAoWFNEQ29tcG9uZW50KSBtb2RlbE9iamVjdDsKLSAgICAgICAgICBub2RlID0gY29tcG9uZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICAvLyB0aGUgdGV4dCBlZGl0b3IgY2FuIG9ubHkgYWNjZXB0IHNlZCBub2RlcyEKLSAgICAgIC8vCi0gICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpKQotICAgICAgewotICAgICAgICBub2RlID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBub2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgIHsKLQkJLy8gZG8gbm90IGZpcmUgc2VsZWN0aW9uIGluIHNvdXJjZSBlZGl0b3IgaWYgdGhlIGN1cnJlbnQgYWN0aXZlIHBhZ2UgaXMgdGhlIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIChzb3VyY2UpCi0JCS8vIFdlIG9ubHkgd2FudCB0byBtYWtlIHNvdXJjZSBzZWxlY3Rpb25zIGlmIHRoZSBhY3RpdmUgcGFnZSBpcyBlaXRoZXIgdGhlIG91dGxpbmUgb3IgcHJvcGVydGllcyAoYSBtb2RpZnkKLQkJLy8gaGFzIGJlZW4gZG9uZSB2aWEgdGhlIG91dGxpbmUgb3IgcHJvcGVydGllcyBhbmQgbm90IHRoZSBzb3VyY2UgdmlldykuICBXZSBkb24ndCB3YW50IHRvIGJlIHNlbGVjdGluZwotCQkvLyBhbmQgdW5zZWxlY3RpbmcgdGhpbmdzIGluIHRoZSBzb3VyY2Ugd2hlbiBlZGl0aW5nIGluIHRoZSBzb3VyY2UhIQotICAgIAlib29sZWFuIG1ha2VTZWxlY3Rpb24gPSB0cnVlOwotCQlpZiAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UuZ2V0QWN0aXZlUGFydCgpIGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIHsKLQkJCQlpZiAoZ2V0QWN0aXZlRWRpdG9yKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcikgewotCQkJCQltYWtlU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgCQotICAgICAgLy8gZG8gbm90IGZpcmUgc2VsZWN0aW9uIGluIHNvdXJjZSBlZGl0b3IgaWYgc2VsZWN0aW9uIGV2ZW50IGNhbWUKLSAgICAgIC8vIGZyb20gc291cmNlIGVkaXRvcgotICAgICAgaWYgKGV2ZW50LmdldFNvdXJjZSgpICE9IGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpICYmIG1ha2VTZWxlY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgIExpc3Qgb3RoZXJNb2RlbE9iamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBPYmplY3Qgb3RoZXJNb2RlbE9iamVjdCA9IGdldE9iamVjdEZvck90aGVyTW9kZWwobW9kZWxPYmplY3QpOwotICAgICAgICAgICAgaWYgKG90aGVyTW9kZWxPYmplY3QgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb3RoZXJNb2RlbE9iamVjdExpc3QuYWRkKG90aGVyTW9kZWxPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIW90aGVyTW9kZWxPYmplY3RMaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBoZXJlJ3MgYW4gdWdseSBoYWNrLi4uIGlmIHdlIGFsbG93IHRleHQgc2VsZWN0aW9ucyB0byBmaXJlIGR1cmluZwotICAgICAgICAgICAgLy8gU2V0SW5wdXRUb0dyYXBoVmlldyBhY3Rpb24gd2Ugc2NyZXcgdXAgdGhlIG5hdmlnYXRpb24gaGlzdG9yeSEKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgCi0gICAgICAgICAgICAvL1RPRE8gKGNzKSAuLi4gd2UgbmVlZCB0byBwcmV2ZW50IHRoZSBzb3VyY2UgZWRpdG9yIGZyb20gbWVzc2luZyB1cCB0aGUgbmF2aWdhdGlvbiBoaXN0b3J5Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKGdldEFjdGl2ZVBhZ2UoKSA9PSBTT1VSQ0VfUEFHRV9JTkRFWCkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5vZGVTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvdGhlck1vZGVsT2JqZWN0TGlzdCk7Ci0gICAgICAgICAgICAgIGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihub2RlU2VsZWN0aW9uKTsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkb1NldFNlbGVjdGlvbigpCi0gICAgewotICAgICAgSVNlbGVjdGlvbiBpU2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKGlTZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGZpcnN0RWxlbWVudCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbilpU2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgT2JqZWN0IG90aGVyTW9kZWxPYmplY3QgPSBnZXRPYmplY3RGb3JPdGhlck1vZGVsKGZpcnN0RWxlbWVudCk7Ci0gICAgICAgIGlmIChvdGhlck1vZGVsT2JqZWN0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5vZGVTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvdGhlck1vZGVsT2JqZWN0KTsKLSAgICAgICAgICBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5zZXRTZWxlY3Rpb24obm9kZVNlbGVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8vIEJ1ZyAxNDU1OTAuICBXb3JrYXJvdW5kIHRvIHVwZGF0ZSBzb3VyY2UgcG9zaXRpb24gd2hlbiBmbGlwcGluZyB0byB0aGUgc291cmNlIHBhZ2UuCi0gIC8vIFVuZm9ydHVuYXRlbHksIHRoaXMgd2lsbCBzdGlsbCBhZGQgYW4gZW50cnkgdG8gdGhlIG5hdmlnYXRpb24gaGlzdG9yeSwgYnV0IHRoaXMKLSAgLy8gYmVoYXZpb3VyIGlzIGFuIGltcHJvdmVtZW50IHRoYW4gd2l0aG91dCB0aGlzIGNoYW5nZQotICBib29sZWFuIGRvVXBkYXRlU291cmNlTG9jYXRpb24gPSBmYWxzZTsKLSAgcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KQotICB7Ci0gICAgc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotICAgIGRvVXBkYXRlU291cmNlTG9jYXRpb24gPSBuZXdQYWdlSW5kZXggPT0gU09VUkNFX1BBR0VfSU5ERVg7Ci0gICAgaWYgKGRvVXBkYXRlU291cmNlTG9jYXRpb24gJiYgZlhTRFNlbGVjdGlvbkxpc3RlbmVyICE9IG51bGwpCi0gICAgICBmWFNEU2VsZWN0aW9uTGlzdGVuZXIuZG9TZXRTZWxlY3Rpb24oKTsKLQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BJZCkKLSAgewotICAgIHN3aXRjaCAocHJvcElkKQotICAgIHsKLSAgICAgIC8vIHdoZW4gcmVmYWN0b3IgcmVuYW1lIHdoaWxlIGZpbGUgaXMgb3BlbiBpbiBlZGl0b3IsIG5lZWQgdG8gcmVzZXQKLSAgICAgIC8vIGVkaXRvciBjb250ZW50cyB0byByZWZsZWN0IG5ldyBkb2N1bWVudAotICAgICAgY2FzZSBJRWRpdG9yUGFydC5QUk9QX0lOUFVUOgotICAgICAgewotICAgICAgICBpZiAoc291cmNlID09IHN0cnVjdHVyZWRUZXh0RWRpdG9yICYmIHhzZFNjaGVtYSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIERvY3VtZW50IHNjaGVtYURvY3VtZW50ID0geHNkU2NoZW1hLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgIERvY3VtZW50IGRvbU1vZGVsRG9jdW1lbnQgPSAoKElET01Nb2RlbClzdHJ1Y3R1cmVkTW9kZWwpLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgIC8vIGlmIGRvbSBkb2N1bWVudHMgYXJlIG5vdCB0aGUgc2FtZSwgdGhleSBuZWVkIHRvIGJlIHJlc2V0Ci0gICAgICAgICAgICAgIGlmIChzY2hlbWFEb2N1bWVudCAhPSBkb21Nb2RlbERvY3VtZW50KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFNETW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHNjaGVtYURvY3VtZW50IGluc3RhbmNlb2YgSURPTURvY3VtZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhpcyBtb2RlbCBhZGFwdGVyIGZvciBjbGVhbnVwIGxhdGVyCi0gICAgICAgICAgICAgICAgICBtb2RlbEFkYXB0ZXIgPSAoWFNETW9kZWxBZGFwdGVyKSAoKElET01Eb2N1bWVudClzY2hlbWFEb2N1bWVudCkuZ2V0RXhpc3RpbmdBZGFwdGVyKFhTRE1vZGVsQWRhcHRlci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBtdWx0aXBhZ2UgZWRpdG9yIHdpdGggbmV3IGVkaXRvciBpbnB1dAotICAgICAgICAgICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICAgICAgc2V0SW5wdXQoZWRpdG9ySW5wdXQpOwotICAgICAgICAgICAgICAgIHNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkubWFya1NhdmVMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdyBkbyB0aGUgY2xlYW4gdXAgbW9kZWwgYWRhcHRlcgotICAgICAgICAgICAgICAgIGlmIChtb2RlbEFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBtb2RlbEFkYXB0ZXIuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgIG1vZGVsQWRhcHRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0gICAgICAgICAgICAgIHN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnByb3BlcnR5Q2hhbmdlZChzb3VyY2UsIHByb3BJZCk7Ci0gIH0KLQotICBwdWJsaWMgSU5hdmlnYXRpb25Mb2NhdGlvbiBjcmVhdGVFbXB0eU5hdmlnYXRpb25Mb2NhdGlvbigpCi0gIHsKLSAgICBpZiAoZ2V0QWN0aXZlUGFnZSgpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBEZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uKHRoaXMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBNdWx0aVBhZ2VFZGl0b3JUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uKGdldFRleHRFZGl0b3IoKSwgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBJTmF2aWdhdGlvbkxvY2F0aW9uIGNyZWF0ZU5hdmlnYXRpb25Mb2NhdGlvbigpCi0gIHsKLSAgICBpZiAoZ2V0QWN0aXZlUGFnZSgpID09IERFU0lHTl9QQUdFX0lOREVYKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBSb290RWRpdFBhcnQgcm9vdEVkaXRQYXJ0ID0gZ3JhcGhpY2FsVmlld2VyLmdldFJvb3RFZGl0UGFydCgpOwotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IHJvb3RFZGl0UGFydC5nZXRDb250ZW50cygpOwotICAgICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBSb290Q29udGVudEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgUm9vdENvbnRlbnRFZGl0UGFydCByb290Q29udGVudEVkaXRQYXJ0ID0gKFJvb3RDb250ZW50RWRpdFBhcnQpZWRpdFBhcnQ7Ci0gICAgICAgICAgT2JqZWN0IGlucHV0ID0gcm9vdENvbnRlbnRFZGl0UGFydC5nZXRJbnB1dCgpOyAgICAgIAotICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpKChBZGFwdGVyKWlucHV0KS5nZXRUYXJnZXQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyID0gKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpb2JqZWN0OwotICAgICAgICAgICAgICBpZiAocHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuZ2V0TmF2aWdhdGlvbkxvY2F0aW9uKHRoaXMsIGNvbmNyZXRlQ29tcG9uZW50LCByb290Q29udGVudEVkaXRQYXJ0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uKHRoaXMsIGNvbmNyZXRlQ29tcG9uZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBNdWx0aVBhZ2VFZGl0b3JUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uKGdldFRleHRFZGl0b3IoKSwgdHJ1ZSk7Ci0gICAgfQotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgZWRpdG9yTW9kZUNoYW5nZWQoRWRpdG9yTW9kZSBuZXdFZGl0b3JNb2RlKQotICB7Ci0gICAgLy9pZiAoaXNJbml0aWFsaXppbmcpCi0gICAgLy8gIHJldHVybjsKLSAgICAKLSAgICBFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5ID0gbmV3RWRpdG9yTW9kZS5nZXRFZGl0UGFydEZhY3RvcnkoKTsKLSAgICBpZiAoZWRpdFBhcnRGYWN0b3J5ICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBncmFwaGljYWxWaWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGVkaXRQYXJ0RmFjdG9yeSk7Ci0gICAgICBpZiAoZ3JhcGhpY2FsVmlld2VyIGluc3RhbmNlb2YgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcikKLSAgICAgIHsgIAotICAgICAgICBEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyKWdyYXBoaWNhbFZpZXdlcjsgIAotICAgICAgICBJQURUT2JqZWN0IGlucHV0ID0gdmlld2VyLmdldElucHV0KCk7Ci0gICAgICAgIHZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICAgICAgLy92aWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCkucmVmcmVzaCgpOwotICAgICAgIC8vIHZpZXdlci5nZXRSb290RWRpdFBhcnQoKS5nZXRDb250ZW50cygpLnJlZnJlc2goKTsKLSAgICAgICAgdmlld2VyLnNldElucHV0KGlucHV0KTsKLSAgICAgICAgCi0gICAgICAgIGZsb2F0aW5nVG9vbGJhci5zZXRFZGl0UGFydEZhY3RvcnkoZWRpdFBhcnRGYWN0b3J5KTsKLSAgICAgICAgZmxvYXRpbmdUb29sYmFyLnNldE1vZGVsKGdldE1vZGVsKCkpOwotICAgICAgICBmbG9hdGluZ1Rvb2xiYXIucmVmcmVzaCghKGlucHV0IGluc3RhbmNlb2YgSU1vZGVsKSk7Ci0gICAgICAgIAotICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBncmFwaGljYWxWaWV3ZXIuZ2V0Q29udHJvbCgpOwotICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkKLSAgICAgICAgewotICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQgPSAoKENvbXBvc2l0ZSljb250cm9sKS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICBwYXJlbnQubGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3RWRpdG9yTW9kZS5nZXRPdXRsaW5lUHJvdmlkZXIoKTsKLSAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBBRFRDb250ZW50T3V0bGluZVBhZ2Ugb3V0bGluZSA9IChBRFRDb250ZW50T3V0bGluZVBhZ2UpZ2V0Q29udGVudE91dGxpbmVQYWdlKCk7Ci0gICAgICBpZiAob3V0bGluZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBvdXRsaW5lLmdldFRyZWVWaWV3ZXIoKTsKLSAgICAgICAgaWYgKHRyZWVWaWV3ZXIgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgIAotICAgICAgICAgIG91dGxpbmUuZ2V0VHJlZVZpZXdlcigpLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgb3V0bGluZS5nZXRUcmVlVmlld2VyKCkucmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgICB9ICAKLSAgICB9ICAKLSAgfSAgCi0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FRElUT1JfTU9ERV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmRlZmF1bHRFZGl0b3JNb2RlSWQiOyAvLyROT04tTkxTLTEkCi0gIC8vcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6aW5nID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBFZGl0b3JNb2RlTWFuYWdlciBjcmVhdGVFZGl0b3JNb2RlTWFuYWdlcigpCi0gIHsKLSAgICBmaW5hbCBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgPSAoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcilnZXRBZGFwdGVyKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgIEVkaXRvck1vZGVNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgRWRpdG9yTW9kZU1hbmFnZXIoWFNEX0VESVRPUl9NT0RFX0VYVEVOU0lPTl9JRCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBpbml0KCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgPT0gbnVsbCB8fCAKLSAgICAgICAgICAgIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuaXNFZGl0b3JNb2RlQXBwbGljYWJsZShUeXBlVml6RWRpdG9yTW9kZS5JRCkpCi0gICAgICAgIHsgIAotICAgICAgICAgIGFkZE1vZGUobmV3IFR5cGVWaXpFZGl0b3JNb2RlKCkpOwotICAgICAgICB9ICAKLSAgICAgICAgc3VwZXIuaW5pdCgpOyAgICAgICAgICAgICAgICAKLSAgICAgIH0gICAgICAgCi0gICAgICAKLSAgICAgIHByb3RlY3RlZCBFZGl0b3JNb2RlIGdldERlZmF1bHRNb2RlKCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGRlZmF1bHRNb2RlSWQgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKERFRkFVTFRfRURJVE9SX01PREVfSUQpOwotICAgICAgICBpZiAoZGVmYXVsdE1vZGVJZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgRWRpdG9yTW9kZSBlZGl0b3JNb2RlID0gZ2V0RWRpdG9yTW9kZShkZWZhdWx0TW9kZUlkKTsKLSAgICAgICAgICBpZiAoZWRpdG9yTW9kZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlZGl0b3JNb2RlOwotICAgICAgICAgIH0gIAotICAgICAgICB9ICAgICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZWZhdWx0TW9kZSgpOwotICAgICAgfQotICAgIH07Ci0gICAgbWFuYWdlci5zZXRQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpOwotICAgIHJldHVybiBtYW5hZ2VyOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzdG9yZUN1cnJlbnRNb2RlUHJlZmVyZW5jZShTdHJpbmcgaWQpCi0gIHsKLSAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoREVGQVVMVF9FRElUT1JfTU9ERV9JRCwgaWQpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gIHsKLSAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKCgoWFNEU2NoZW1hKWdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKSkpOwotICAgIHN1cGVyLmRvU2F2ZShtb25pdG9yKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjZG9TYXZlQXMoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZG9TYXZlQXMoKQotICB7Ci0gICAgLy8gV2hlbiBwZXJmb3JtaW5nIGEgc2F2ZSBhcywgdGhlIGRvY3VtZW50IGNoYW5nZXMuICAgT3VyIG1vZGVsIHN0YXRlIGxpc3RlbmVycyBzaG91bGQgbGlzdGVuCi0gICAgLy8gdG8gdGhlIG5ldyBkb2N1bWVudC4KLSAgICAKLSAgICAvLyBGaXJzdCBnZXQgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAgICBJRG9jdW1lbnQgY3VycmVudERvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLSAgICBYU0RNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gbnVsbDsKLSAgICBJRE9NRG9jdW1lbnQgZG9jID0gbnVsbDsKLSAgICBpZiAoY3VycmVudERvY3VtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGN1cnJlbnREb2N1bWVudCk7Ci0gICAgICBpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgJiYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBhc3NvY2lhdGVkIElET01Eb2N1bWVudCBtb2RlbAotICAgICAgICAgICAgZG9jID0gKChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIC8vIGFuZCBub3cgZ2V0IG91ciBhZGFwdGVyIHRoYXQgbGlzdGVucyB0byBET00gY2hhbmdlcwotICAgICAgICAgICAgaWYgKGRvYyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtb2RlbEFkYXB0ZXIgPSAoWFNETW9kZWxBZGFwdGVyKSBkb2MuZ2V0RXhpc3RpbmdBZGFwdGVyKFhTRE1vZGVsQWRhcHRlci5jbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIHN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgIC8vIHBlcmZvcm0gc2F2ZSBhcwotICAgIHN0cnVjdHVyZWRUZXh0RWRpdG9yLmRvU2F2ZUFzKCk7Ci0gICAgLy8gaWYgc2F2ZUFzIGNhbmNlbGxlZCB0aGVuIGRvbid0IHNldElucHV0IGJlY2F1c2UgdGhlIGlucHV0IGhhc24ndCBjaGFuZ2UKLSAgICAvLyBTZWUgQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yJ3MgcGVyZm9ybVNhdmVBcwotICAgIGlmIChlZGl0b3JJbnB1dCAhPSBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKQotICAgIHsKLSAgICAgIHNldElucHV0KHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotICAgICAgc2V0UGFydE5hbWUoc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKS5nZXROYW1lKCkpOwotICAgIAotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkubWFya1NhdmVMb2NhdGlvbigpOwotICAgCi0gICAgICAvLyBOb3cgZG8gdGhlIGNsZWFuIHVwIG9uIHRoZSBvbGQgZG9jdW1lbnQKLSAgICAgIGlmIChtb2RlbEFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gY2xlYXIgb3V0IG1vZGVsIGFkYXB0ZXIKLSAgICAgICAgbW9kZWxBZGFwdGVyLmNsZWFyKCk7Ci0gICAgICAgIG1vZGVsQWRhcHRlciA9IG51bGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3RFZGl0b3JPcGVuVGFza3MoKSAKLSAgewotCQkvLyBCdWcgMjA0ODY4OiBkbyB0aGUgc2VsZWN0aW9uIGFmdGVyIHRoZSBlZGl0b3IgcGFydCBpcyBjcmVhdGVkLCBzbyB0aGF0IAotCQkvLyBBYnN0cmFjdFRleHRFZGl0b3IubWFya0luTmF2aWdhdGlvbkhpc3RvcnkoKSB3b24ndCBjYXVzZSB0aGUgY3JlYXRpb24gCi0gICAgICAgIC8vIG9mIGl0cyBvd24gZWRpdG9yIHBhcnQuCi0JCS8vIFNlbGVjdCB0aGUgc2NoZW1hIHRvIHNob3cgdGhlIHByb3BlcnRpZXMKLQkJZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXRNb2RlbCgpKSk7Ci0gIH0KLX0gIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9LZXlib2FyZERyYWdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvS2V5Ym9hcmREcmFnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGZjOGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9LZXlib2FyZERyYWdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uSUtleWJvYXJkRHJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLktleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5CYXNlRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuWFNEQXR0cmlidXRlRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNEQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi1wdWJsaWMgY2xhc3MgS2V5Ym9hcmREcmFnSW1wbCBpbXBsZW1lbnRzIElLZXlib2FyZERyYWcKLXsKLSAgcHVibGljIHZvaWQgcGVyZm9ybUtleWJvYXJkRHJhZyhHcmFwaGljYWxFZGl0UGFydCBtb3ZpbmdFbGVtZW50LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSBwb2xpY3kgPSAoS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSkgbW92aW5nRWxlbWVudC5nZXRFZGl0UG9saWN5KEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuS0VZKTsKLQotICAgIEVkaXRQYXJ0IHJpZ2h0RWxlbWVudCA9IHBvbGljeS5nZXRSZWxhdGl2ZUVkaXRQYXJ0KG1vdmluZ0VsZW1lbnQsIGRpcmVjdGlvbik7Ci0gICAgcG9saWN5ID0gKEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kpIHJpZ2h0RWxlbWVudC5nZXRFZGl0UG9saWN5KEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuS0VZKTsKLSAgICBFZGl0UGFydCBsZWZ0RWxlbWVudCA9IChwb2xpY3kgIT0gbnVsbCkgPyBwb2xpY3kuZ2V0UmVsYXRpdmVFZGl0UGFydChyaWdodEVsZW1lbnQsIGRpcmVjdGlvbikgOiBudWxsOwotCi0gICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIGV4dGVuZGVycwotICAgIGlmICghKG1vdmluZ0VsZW1lbnQgaW5zdGFuY2VvZiBYU0RCYXNlRmllbGRFZGl0UGFydCkpIHJldHVybjsKLSAgICAKLSAgICBYU0RCYXNlRmllbGRFZGl0UGFydCBtb3ZpbmdGaWVsZCA9IChYU0RCYXNlRmllbGRFZGl0UGFydCkgbW92aW5nRWxlbWVudDsKLSAgICBYU0RCYXNlRmllbGRFZGl0UGFydCBsZWZ0RmllbGQgPSAoWFNEQmFzZUZpZWxkRWRpdFBhcnQpIGxlZnRFbGVtZW50OwotICAgIFhTREJhc2VGaWVsZEVkaXRQYXJ0IHJpZ2h0RmllbGQgPSAoWFNEQmFzZUZpZWxkRWRpdFBhcnQpIHJpZ2h0RWxlbWVudDsKLSAgICAKLSAgICBPYmplY3QgbW92aW5nT2JqZWN0ID0gbW92aW5nRmllbGQuZ2V0TW9kZWwoKTsKLSAgICAKLSAgICBCYXNlRHJhZ0FuZERyb3BDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIGlmIChtb3ZpbmdPYmplY3QgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIHx8IG1vdmluZ09iamVjdCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZChtb3ZpbmdGaWVsZCwgbGVmdEZpZWxkLCByaWdodEZpZWxkLCBkaXJlY3Rpb24pOwotICAgIH0KLSAgICBlbHNlIGlmIChtb3ZpbmdPYmplY3QgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIpCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBYU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQobW92aW5nRmllbGQsIGxlZnRGaWVsZCwgcmlnaHRGaWVsZCwgZGlyZWN0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBjb21tYW5kLmNhbkV4ZWN1dGUoKSkKLSAgICB7Ci0gICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgIC8vIFRoaXMgaXMgdG8gcmVzZWxlY3QgdGhlIG1vdmVkIGl0ZW0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsICYmIGVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcykgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IChJU2VsZWN0aW9uUHJvdmlkZXIpIGVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vdmluZ0VsZW1lbnQuZ2V0TW9kZWwoKSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotCi0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMjc0NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxM2Y3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyLCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwsIGJ1ZyAxMTQ3MDMzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMKLXsKLSAgc3RhdGljIAotICB7Ci0gICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcygib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IubWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBNZXNzYWdlcygpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9CQVNFX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFUklWRURfQlk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0lOSEVSSVRfRlJPTTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfSU5IRVJJVF9CWTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRE9DVU1FTlRBVElPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQVBQX0lORk87Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NFVF9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9OQU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9LSU5EOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9NSU5PQ0NVUlM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX01BWE9DQ1VSUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTk9fVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfUEFHRV9IRUFESU5HX1JFRkVSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfUkVBRF9PTkxZOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9DT01QT05FTlRTOwotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9UWVBFUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX1JFREVGSU5FX1RZUEVTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfRUxFTUVOVFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9BVFRSSUJVVEVTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfQVRUUklCVVRFX0dST1VQUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX1JFREVGSU5FX0FUVFJJQlVURV9HUk9VUFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9OT1RBVElPTlM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9JREVOVElUWV9DT05TVFJBSU5UUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX0FOTk9UQVRJT05TOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfRElSRUNUSVZFUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX0dST1VQUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX1JFREVGSU5FX0dST1VQUzsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT19MT0NBVElPTl9TUEVDSUZJRUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OT19UWVBFX0RFRklORUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX05BTUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BQlNFTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0ZJRUxEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1NFVF9NVUxUSVBMSUNJVFk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9PUFRJT05BTDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1pFUk9fT1JfTU9SRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX09ORV9PUl9NT1JFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUkVRVUlSRUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BUlJBWTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9TRVRfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0xPQ0FMX1RZUEU7Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfVU5LTk9XTl9PQkpFQ1Q7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9YU0RTQ0hFTUE7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9YU0RTQ0hFTUFfTk9fTkFNRVNQQUNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VUX0NPTU1PTl9CVUlMVF9JTl9UWVBFUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFTEVDVF9UWVBFU19GSUxURVJfT1VUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkVXX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9WQUxVRV9ORVdfVFlQRTsgIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09NUExFWF9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0lNUExFX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ORVdfRUxFTUVOVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05FV19BVFRSSUJVVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1hTRF9FRElUT1I7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TT1VSQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQkVGT1JFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FGVEVSOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9FTEVNRU5UOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0lOU0VSVF9FTEVNRU5UOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9FTEVNRU5UX1JFRjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ORVc7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQlJPV1NFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1VQREFURV9FTEVNRU5UX1JFRkVSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfQVRUUklCVVRFX1JFRkVSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RBUkdFVF9OQU1FU1BBQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT19OQU1FU1BBQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OQU1FX1NFQVJDSF9GSUxURVJfVEVYVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VMRU1FTlRTX0NPTE9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUklCVVRFU19DT0xPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FUVFJJQlVURVNfUFJPQ0VTU0NPTlRFTlRTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUklCVVRFU19OQU1FU1BBQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TRVRfRUxFTUVOVF9SRUZFUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TRVRfQVRUUklCVVRFX1JFRkVSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1JFREVGSU5FX0NPTVBPTkVOVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RZUEVTX0NPTE9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VUX1RZUEU7Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RFWFRfSU5ERU5UX0xBQkVMOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVEVYVF9JTkRFTlRfU1BBQ0VTX0xBQkVMOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RFWFRfWFNEX05BTUVTUEFDRV9QUkVGSVg7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9URVhUX1hTRF9ERUZBVUxUX1BSRUZJWDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1FVQUxJRllfWFNEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVEVYVF9YU0RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVkFMSURBVElOR19GSUxFUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZVTExfQ09ORk9STUFOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9URVhUX0hPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUzsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9MQUJFTF9JTlZBTElEX1BSRUZJWDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfSU5DTFVERTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfSU1QT1JUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9SRURFRklORTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVRUUklCVVRFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0lOU0VSVF9BVFRSSUJVVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9SRUY7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fRFJBR19EUk9QX0VMRU1FTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fRFJBR19EUk9QX0FUVFJJQlVURTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9SRURFRklORV9DT01QTEVYX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fUkVERUZJTkVfU0lNUExFX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fUkVERUZJTkVfQVRUUklCVVRFX0dST1VQOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1JFREVGSU5FX01PREVMX0dST1VQOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1JFTkFNRTsgIAotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lNQUdFX0NPTVBMRVhfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lNQUdFX1NJTVBMRV9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSU1BR0VfTU9ERUxfR1JPVVA7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JTUFHRV9BVFRSSUJVVEVfR1JPVVA7Ci0KLSAgLy8gVE9ETzogVE8gUkVNT1ZFCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTEVNRU5URk9STURFRkFVTFQ7Ci0gIC8vIFRPRE86IFRPIFJFTU9WRQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUklCVVRFRk9STURFRkFVTFQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DUkVBVEVfQU5PTl9UWVBFOyAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YTUxfVEVYVF9FRElUT1JfUFJFRlNfTElOSzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hNTF9WQUxJREFUT1JfUFJFRlNfTElOSzsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9URVhUX0VOQUJMRV9BVVRPX0lNUE9SVF9DTEVBTlVQOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVEVYVF9FTkFCTEVfQVVUT19PUEVOX1NDSEVNQV9ESUFMT0c7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9SRURFRklORV9TQ0hFTUE7Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NPTUJPX05FVzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NPTUJPX0JST1dTRTsKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfSU5WQUxJRF9OQU1FOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NWVkMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvclhNTDsKLQotCi0vKioKLSAqIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvcgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGZvciBtdWx0aSBwYWdlIGVkaXRvcidzIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yLgotICoKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0b3JYTUwgewotCi0JcHJpdmF0ZSBJQWN0aW9uQmFycyBmQmFyczsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbGxzOgotCSAqIDx1bD4KLQkgKiAgPGxpPjxjb2RlPmNvbnRyaWJ1dGVUb01lbnU8L2NvZGU+IHdpdGggPGNvZGU+YmFyczwvY29kZT4nIG1lbnUgbWFuYWdlcjwvbGk+Ci0JICogIDxsaT48Y29kZT5jb250cmlidXRlVG9Ub29sQmFyPC9jb2RlPiB3aXRoIDxjb2RlPmJhcnM8L2NvZGU+JyB0b29sIGJhcgotCSAqICAgIG1hbmFnZXI8L2xpPgotCSAqICA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvU3RhdHVzTGluZTwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicgc3RhdHVzIGxpbmUKLQkgKiAgICBtYW5hZ2VyPC9saT4KLQkgKiA8L3VsPgotCSAqIFRoZSBnaXZlbiBhY3Rpb24gYmFycyBhcmUgYWxzbyByZW1lbWJlcmVkIGFuZCBtYWRlIGFjY2Vzc2libGUgdmlhIAotCSAqIDxjb2RlPmdldEFjdGlvbkJhcnM8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBiYXJzIHRoZSBhY3Rpb24gYmFycwotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycykgewotCQlmQmFycyA9IGJhcnM7Ci0JCWNvbnRyaWJ1dGVUb01lbnUoYmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQkJY29udHJpYnV0ZVRvVG9vbEJhcihiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCQljb250cmlidXRlVG9TdGF0dXNMaW5lKGJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIGNvbnRyaWJ1dG9yJ3MgYWN0aW9uIGJhcnMuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBhY3Rpb24gYmFycwotCSAqLwotCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgewotCQlyZXR1cm4gZkJhcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmFjNjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YU0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTDsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBlZGl0aW5nIFhTRCBjb250ZW50IHR5cGUKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTRCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCB7Ci0JcHJvdGVjdGVkIE1hcCBnZXRIeXBlcmxpbmtEZXRlY3RvclRhcmdldHMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJTWFwIHRhcmdldHMgPSBzdXBlci5nZXRIeXBlcmxpbmtEZXRlY3RvclRhcmdldHMoc291cmNlVmlld2VyKTsKLQkJdGFyZ2V0cy5wdXQoIm9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiLCBudWxsKTsgIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHRhcmdldHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0Y2FiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRERpcmVjdGl2ZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy5OZXdBdHRyaWJ1dGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyIGV4dGVuZHMgWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGltcGxlbWVudHMgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIKLXsKLSAgcHVibGljIFhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgc3VwZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0QnJvd3NlRGlhbG9nKCkKLSAgewotICAgIFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZSBkaWFsb2dEZWxlZ2F0ZSA9IAotICAgICAgbmV3IFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZShYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUuQVRUUklCVVRFX01FVEFfTkFNRSwgY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgIHJldHVybiBkaWFsb2dEZWxlZ2F0ZTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldE5ld0RpYWxvZygpCi0gIHsKLSAgICBpZiAoc2NoZW1hcy5sZW5ndGggPiAwKSB7Ci0gICAgICByZXR1cm4gbmV3IE5ld0F0dHJpYnV0ZURpYWxvZyhzY2hlbWFzWzBdKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByZXR1cm4gbmV3IE5ld0F0dHJpYnV0ZURpYWxvZygpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShPYmplY3QgcmVmZXJlbmNpbmdPYmplY3QsIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmVmZXJlbmNlZENvbXBvbmVudCkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGNvbmNyZXRlQ29tcG9uZW50ID0gbnVsbDsKLSAgICBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgIHsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKXJlZmVyZW5jaW5nT2JqZWN0OwotICAgICAgaWYgKGFkYXB0ZXIuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pYWRhcHRlci5nZXRUYXJnZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgfQotICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgICAgaWYgKHJlZmVyZW5jZWRDb21wb25lbnQuaXNOZXcoKSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlRGVjID0gbnVsbDsKLSAgICAgICAgICBpZiAocmVmZXJlbmNlZENvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRSkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUsIGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgICAgYXR0cmlidXRlRGVjID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChhdHRyaWJ1dGVEZWMgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9BVFRSSUJVVEVfUkVGRVJFTkNFLCBjb25jcmV0ZUNvbXBvbmVudCwgYXR0cmlidXRlRGVjKTsKLSAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgfSAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0TmFtZSgpLCByZWZlcmVuY2VkQ29tcG9uZW50LmdldFF1YWxpZmllcigpLCByZWZlcmVuY2VkQ29tcG9uZW50LmdldEZpbGUoKSk7Ci0gICAgICAgICAgY29tbWFuZC5zZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9BVFRSSUJVVEVfUkVGRVJFTkNFKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyYWE3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlNldEJhc2VUeXBlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlNldEJhc2VUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTRENvbXBsZXhUeXBlQmFzZVR5cGVFZGl0TWFuYWdlciBleHRlbmRzIFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcgotewotICBwdWJsaWMgWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgc3VwZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBnZXRRdWlja1BpY2tzKCkKLSAgewotICAgIHJldHVybiBzdXBlci5nZXRRdWlja1BpY2tzKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldEJyb3dzZURpYWxvZygpCi0gIHsKLSAgICBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUgZGlhbG9nRGVsZWdhdGUgPSBuZXcgWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlKFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZS5UWVBFX01FVEFfTkFNRSwgY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgIHJldHVybiBkaWFsb2dEZWxlZ2F0ZTsKLSAgfQotCi0gIC8vIFRPRE8gY29tbW9uIHRoaXMgdXAKLSAgcHVibGljIHZvaWQgbW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKE9iamVjdCByZWZlcmVuY2luZ09iamVjdCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnQpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IG51bGw7Ci0gICAgaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICB7Ci0gICAgICBBZGFwdGVyIGFkcGF0ZXIgPSAoQWRhcHRlcilyZWZlcmVuY2luZ09iamVjdDsKLSAgICAgIGlmIChhZHBhdGVyLmdldFRhcmdldCgpIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KWFkcGF0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpIHJlZmVyZW5jaW5nT2JqZWN0OwotICAgIH0KLSAgICAKLSAgICBpZiAoY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5pc05ldygpKQotICAgICAgeyAgCi0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuQ09NUExFWF9UWVBFX01FVEFfTkFNRSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFLCBjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgY29tbWFuZC5zZXROYW1lVG9BZGQoY29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgICAgdGQgPSBjb21tYW5kLmdldENyZWF0ZWRDb21wbGV4VHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRSwgY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIHRkID0gY29tbWFuZC5nZXRDcmVhdGVkU2ltcGxlVHlwZSgpOwotICAgICAgICB9ICAKLSAgICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgU2V0QmFzZVR5cGVDb21tYW5kKGNvbmNyZXRlQ29tcG9uZW50LCB0ZCk7Ci0gICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIucmVtb3ZlVW51c2VkWFNESW1wb3J0cyhjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICB9ICAKLSAgICAgIGVsc2UKLSAgICAgIHsgIAotICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgU2V0QmFzZVR5cGVBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIGNvbXBvbmVudC5nZXROYW1lKCksIGNvbXBvbmVudC5nZXRRdWFsaWZpZXIoKSwgY29tcG9uZW50LmdldEZpbGUoKSk7Ci0gICAgICAgIGNvbW1hbmQuc2V0TGFiZWwoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfQkFTRV9UWVBFKTsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5pc05ldygpKQotICAgICAgeyAgCi0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuU0lNUExFX1RZUEVfTUVUQV9OQU1FKQotICAgICAgICB7ICAKLSAgICAgICAgICBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEUsIGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICBjb21tYW5kLnNldE5hbWVUb0FkZChjb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgICB0ZCA9IGNvbW1hbmQuZ2V0Q3JlYXRlZFNpbXBsZVR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBTZXRCYXNlVHlwZUNvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIHRkKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgIH0gIAotICAgICAgZWxzZQotICAgICAgeyAgCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBTZXRCYXNlVHlwZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZChjb25jcmV0ZUNvbXBvbmVudCwgY29tcG9uZW50LmdldE5hbWUoKSwgY29tcG9uZW50LmdldFF1YWxpZmllcigpLCBjb21wb25lbnQuZ2V0RmlsZSgpKTsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckNTSGVscElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckNTSGVscElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzJlMTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFZGl0b3JDU0hlbHBJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogCi0gKiBDb250ZXh0IFNlbnNpdGl2ZSBIZWxwIElEcwotICoKLSAqLwotcHVibGljIGNsYXNzIFhTREVkaXRvckNTSGVscElkcwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1dJWkFSRF9QQUdFID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDAxMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1RPS0VOX0NPTlRFTlRTID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDAyMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX0pVU1RfT05DRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAwMzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9aRVJPX09SX01PUkUgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMDQwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfT05FX09SX01PUkUgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMDUwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfT1BUSU9OQUwgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMDYwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfUkVQRUFUX1JBRElPID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDA3MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1JBTkdFX1JBRElPID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDA4MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1JFUEVBVF9GSUVMRCA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAwOTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9SQU5HRV9NSU5JTVVNX0ZJRUxEID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDEwMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1JBTkdFX01BWElNVU1fRklFTEQgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMTEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfQUREX0JVVFRPTiA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAxMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9DVVJSRU5UX1ZBTFVFID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDEzMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9URVNUX1BBR0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMjAwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfU0FNUExFX1RFWFQgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMjEwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNRV9ORVdfTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAzMDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5BTUVfVVBEQVRFX1JFRkVSRU5DRVMgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMzEwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV1RZUEVfQ09NUExFWFRZUEUgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMDEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXVFlQRV9TSU1QTEVUWVBFID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDAyMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV1RZUEVfTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAwMzAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUVFlQRV9OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDA1MCI7IC8vIHRoZXNlIDMgYXJlIGluIGNvbW1vbi51aQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUWVBFX1RZUEVTID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDA2MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRZUEVfU0VBUkNIU0NPUEVTID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDA3MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRU5VTUVSQVRJT05TX19OT19OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDA5MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9FTlVNRVJBVElPTlNfX0RFTElNSVRFUl9DSEFSUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAxMDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRU5VTUVSQVRJT05TX19QUkVTRVJWRV9MRUFEX0FORF9UUkFJTF9XSElURVNQQUNFUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAxMTAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fRVhURU5TSU9OX0NBVEVHT1JJRVMgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMTMwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fQVZBSUxBQkxFX0NPTVBPTkVOVFNfVE9fQUREID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDE0MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9FWFRFTlNJT05TX0NPTVBPTkVOVFNfX0FERCA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAxNTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRVhURU5TSU9OU19DT01QT05FTlRTX19ERUxFVEUgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMTYwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fRURJVCA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAxNzAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0NBVEVHT1JZX19OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDE5MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9DQVRFR09SWV9fU0NIRU1BID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDIwMCI7IC8vIGNhbid0IGludm9rZSBoZWxwLCB0aGlzIGlzIGEgQ0xhYmVsLCBub3QgdGV4dCBGaWVsZAotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NBVEFMT0dfRU5UUklFU19fRU5UUklFU19UUkVFTElTVCA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAyMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ0FUQUxPR19FTlRSSUVTX19ERVRBSUxTID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDIzMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fUVVBTElGWV9YTUxTQ0hFTUFfTEFOR1VBR0VfQ09OU1RSVUNUUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZjAwMTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fWE1MX1NDSEVNQV9MQU5HVUFHRV9DT05TVFJVQ1RTX1BSRUZJWCA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZjAwMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fREVGQVVMVF9UQVJHRVROQU1FU1BBQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdWYwMDMwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX0hPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZjAwNDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fSU1QT1JUX0NMRUFOVVAgPSBQTFVHSU5fTkFNRSArICIueHNkdWYwMDUwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UQVRJT05fVEFCX19OT19MQUJFTCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAwMTAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19UQUJfX0VYVEVOU0lPTlMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMDMwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19UQUJfX0FERCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAwNDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05TX1RBQl9fREVMRVRFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDA1MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTlNfVEFCX19FWFRFTlNJT05TX0RFVEFJTFMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMDYwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUUkFJTlRTX1RBQl9fTUlOSU1VTV9MRU5HVEggPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMDgwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlOVFNfVEFCX19NQVhJTVVNX0xFTkdUSCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAwOTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVFJBSU5UU19UQUJfX0NPTExBUFNFX1dISVRFU1BBQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTAwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlOVFNfVEFCX19FTlVNRVJBVElPTlMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlOVFNfVEFCX19QQVRURVJOUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAxMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVFJBSU5UU19UQUJfX05PX0xBQkVMID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDEzMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fU0NIRU1BX19QUkVGSVggPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMjAwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX1NDSEVNQV9fVEFSR0VUTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDIxMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19TQ0hFTUFfX0FEVkFOQ0VEID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDIyMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRFZBTkNFX1RBQl9fU0NIRU1BX0VMRU1FTlRfRk9STV9ERUZBVUxUID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDQ1MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEVkFOQ0VfVEFCX19TQ0hFTUFfQVRUUklCVVRFX0ZPUk1fREVGQVVMVCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDA0NjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRFZBTkNFX1RBQl9fU0NIRU1BX0JMT0NLX0RFRkFVTFQgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDcwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURWQU5DRV9UQUJfX1NDSEVNQV9GSU5BTF9ERUZBVUxUID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDQ4MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fRUxFTUVOVF9fTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAyMzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fRUxFTUVOVF9fVFlQRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAyNDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fRUxFTUVOVF9fUkVGRVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDI1MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19FTEVNRU5UX19NSU5fT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE4MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19FTEVNRU5UX19NQVhfT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE5MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQ09NUExFWF9UWVBFX19OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDI2MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19DT01QTEVYX1RZUEVfX0lOSEVSSVRfRlJPTSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAyNzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQ09NUExFWF9UWVBFX19JTkhFUklUX0JZID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDI4MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fU0lNUExFX1RZUEVfX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMjkwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX1NJTVBMRV9UWVBFX19WQVJJRVRZID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDMwMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19TSU1QTEVfVFlQRV9fQkFTRV9UWVBFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDMxMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQVRUUklCVVRFX19OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDMyMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BVFRSSUJVVEVfX1RZUEUgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMzMwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BVFRSSUJVVEVHUk9VUF9fTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAzNDAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX01PREVMR1JPVVBfREVGSU5JVElPTl9fTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAzNTAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0lOQ0xVREVfUkVERUZJTkVfX1NDSEVNQUxPQ0FUSU9OID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDM2MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fSU1QT1JUX19TQ0hFTUFMT0NBVElPTiA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAzNzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fSU1QT1JUX19OQU1FU1BBQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMzgwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0lNUE9SVF9fUFJFRklYID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDM5MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQU5ZRUxFTUVOVF9fTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDQwMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BTllFTEVNRU5UX19QUk9DRVNTQ09OVEVOVFMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0FOWUVMRU1FTlRfX01JTl9PQ0NVUkVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTgwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0FOWUVMRU1FTlRfX01BWF9PQ0NVUkVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTkwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BTllBVFRSSUJVVEVfX05BTUVTUEFDRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDA0MDAiOyAgLy8gdGhlc2UgNCBhcmUgbm90IHVzZWQsIHNhbWUgYXMgYW55ZWxlbWVudCBhYm92ZQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQU5ZQVRUUklCVVRFX19QUk9DRVNTQ09OVEVOVFMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0FOWUFUVFJJQlVURV9fTUlOX09DQ1VSRU5DRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAxODAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQU5ZQVRUUklCVVRFX19NQVhfT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE5MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fS0lORCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDA0MjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fTUlOX09DQ1VSRU5DRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAxODAiOyAvL2Nhbid0IGludm9rZSBoZWxwCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19NT0RFTEdST1VQX19NQVhfT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE5MCI7IC8vIGNhbid0IGludm9rZSBoZWxwCi0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9SRUZTX19SRUYgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDMwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BVFRSSUJVVEVHUk9VUF9SRUZTX19SRUYgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDQwIjsKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllNTgwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuSVhTRFRvb2xiYXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLklFeHRlbmRlZEZpZ3VyZUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0b3JDb25maWd1cmF0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVESVRPUkNPTkZJR1VSQVRJT05FWFRFTlNJT05JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLlhTREVkaXRvckV4dGVuc2lvbkNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMRURJVE9SQ09ORklHVVJBVElPTl9FWFRFTlNJT05JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsRWRpdG9yQ29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSRkFDVE9SWSA9ICJhZGFwdGVyRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTEJBUkFDVElPTiA9ICJ0b29sYmFyQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUdVUkVGQUNUT1JZID0gImZpZ3VyZUZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRQQVJURkFDVE9SWSA9ICJlZGl0UGFydEZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLSAgTGlzdCBkZWZpbmVkRXh0ZW5zaW9uc0xpc3QgPSBudWxsOwotCi0gIHB1YmxpYyBYU0RFZGl0b3JDb25maWd1cmF0aW9uKCkKLSAgewotCi0gIH0KLQotICBwdWJsaWMgWFNEQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGRlZmluZWRFeHRlbnNpb25zTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlYWRYU0RDb25maWd1cmF0aW9uUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgaWYgKCFkZWZpbmVkRXh0ZW5zaW9uc0xpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybiAoKFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMpIGRlZmluZWRFeHRlbnNpb25zTGlzdC5nZXQoMCkpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGRlZmluZWRFeHRlbnNpb25zTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlYWRYU0RDb25maWd1cmF0aW9uUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgaWYgKCFkZWZpbmVkRXh0ZW5zaW9uc0xpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybiAoKFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMpIGRlZmluZWRFeHRlbnNpb25zTGlzdC5nZXQoMCkpLmdldEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5IGdldEZpZ3VyZUZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGRlZmluZWRFeHRlbnNpb25zTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlYWRYU0RDb25maWd1cmF0aW9uUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgaWYgKCFkZWZpbmVkRXh0ZW5zaW9uc0xpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybiAoKFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMpIGRlZmluZWRFeHRlbnNpb25zTGlzdC5nZXQoMCkpLmdldEZpZ3VyZUZhY3RvcnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRUb29sYmFyQWN0aW9ucygpCi0gIHsKLSAgICBpZiAoZGVmaW5lZEV4dGVuc2lvbnNMaXN0ID09IG51bGwpCi0gICAgewotICAgICAgcmVhZFhTRENvbmZpZ3VyYXRpb25SZWdpc3RyeSgpOwotICAgIH0KLSAgICBpZiAoIWRlZmluZWRFeHRlbnNpb25zTGlzdC5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmV0dXJuICgoWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcykgZGVmaW5lZEV4dGVuc2lvbnNMaXN0LmdldCgwKSkuZ2V0QWN0aW9uTGlzdCgpOwotICAgIH0KLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotCi0gIHByb3RlY3RlZCBPYmplY3QgbG9hZENsYXNzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgY2xhc3NTdHJpbmcpCi0gIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpLmxvYWRDbGFzcyhjbGFzc1N0cmluZyk7Ci0gICAgICBPYmplY3QgaW5zdGFuY2UgPSB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotCi0gICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWFkWFNEQ29uZmlndXJhdGlvblJlZ2lzdHJ5KCkKLSAgewotICAgIGRlZmluZWRFeHRlbnNpb25zTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB1cGRhdGVMaXN0KElOVEVSTkFMRURJVE9SQ09ORklHVVJBVElPTl9FWFRFTlNJT05JRCk7Ci0gICAgdXBkYXRlTGlzdChYU0RFRElUT1JDT05GSUdVUkFUSU9ORVhURU5TSU9OSUQpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdXBkYXRlTGlzdChTdHJpbmcgSUQpCi0gIHsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB4c2RFZGl0b3JFeHRlbnNpb25MaXN0ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoSUQpOwotICAgIGJvb2xlYW4gZGVmaW5lZEV4dGVuc2lvbnNFeGlzdCA9ICh4c2RFZGl0b3JFeHRlbnNpb25MaXN0ICE9IG51bGwgJiYgeHNkRWRpdG9yRXh0ZW5zaW9uTGlzdC5sZW5ndGggPiAwKTsKLSAgICAKLSAgICBpZiAoZGVmaW5lZEV4dGVuc2lvbnNFeGlzdCkKLSAgICB7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgeHNkRWRpdG9yRXh0ZW5zaW9uTGlzdC5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMoKTsKLSAgICAgICAgZGVmaW5lZEV4dGVuc2lvbnNMaXN0LmFkZChwcm9wZXJ0aWVzKTsKLSAgCi0gICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0geHNkRWRpdG9yRXh0ZW5zaW9uTGlzdFtpXTsKLSAgICAgICAgU3RyaW5nIGFkYXB0ZXJGYWN0b3J5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBREFQVEVSRkFDVE9SWSk7Ci0gICAgICAgIGlmIChhZGFwdGVyRmFjdG9yeUNsYXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbG9hZENsYXNzKGVsZW1lbnQsIGFkYXB0ZXJGYWN0b3J5Q2xhc3MpOwotICAgICAgICAgIFhTREFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQWRhcHRlckZhY3RvcnkpCi0gICAgICAgICAgewotICAgICAgICAgICAgYWRhcHRlckZhY3RvcnkgPSAoWFNEQWRhcHRlckZhY3RvcnkpIG9iamVjdDsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAKLSAgICAgICAgU3RyaW5nIGZpZ3VyZUZhY3RvcnlDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEZJR1VSRUZBQ1RPUlkpOwotICAgICAgICBpZiAoZmlndXJlRmFjdG9yeUNsYXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbG9hZENsYXNzKGVsZW1lbnQsIGZpZ3VyZUZhY3RvcnlDbGFzcyk7Ci0gICAgICAgICAgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSBmaWd1cmVGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmaWd1cmVGYWN0b3J5ID0gKElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkpIG9iamVjdDsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0RmlndXJlRmFjdG9yeUxpc3QoZmlndXJlRmFjdG9yeSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gIAotICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0b29sYmFyQWN0aW9ucyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVE9PTEJBUkFDVElPTik7Ci0gICAgICAgIExpc3QgYWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKHRvb2xiYXJBY3Rpb25zICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRvb2xiYXJBY3Rpb25zLmxlbmd0aDsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBhY3Rpb25FbGVtZW50ID0gdG9vbGJhckFjdGlvbnNbal07Ci0gICAgICAgICAgICBTdHJpbmcgYWN0aW9uQ2xhc3MgPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShDTEFTU05BTUUpOwotICAgICAgICAgICAgSVhTRFRvb2xiYXJBY3Rpb24gYWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChhY3Rpb25DbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbG9hZENsYXNzKGFjdGlvbkVsZW1lbnQsIGFjdGlvbkNsYXNzKTsKLSAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElYU0RUb29sYmFyQWN0aW9uKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uID0gKElYU0RUb29sYmFyQWN0aW9uKSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm9wZXJ0aWVzLnNldEFjdGlvbkxpc3QoYWN0aW9uTGlzdCk7Ci0gIAotICAgICAgICBTdHJpbmcgZWRpdFBhcnRGYWN0b3J5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShFRElUUEFSVEZBQ1RPUlkpOwotICAgICAgICBpZiAoZWRpdFBhcnRGYWN0b3J5Q2xhc3MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBsb2FkQ2xhc3MoZWxlbWVudCwgZWRpdFBhcnRGYWN0b3J5Q2xhc3MpOwotICAgICAgICAgIEVkaXRQYXJ0RmFjdG9yeSBlZGl0UGFydEZhY3RvcnkgPSBudWxsOwotICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydEZhY3RvcnkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRpdFBhcnRGYWN0b3J5ID0gKEVkaXRQYXJ0RmFjdG9yeSkgb2JqZWN0OwotICAgICAgICAgICAgcHJvcGVydGllcy5zZXRFZGl0UGFydEZhY3RvcnlMaXN0KGVkaXRQYXJ0RmFjdG9yeSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckNvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxYmM3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogQ29udGV4dCBoZWxwIGlkIGNvbnN0YW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBYU0RFZGl0b3JDb250ZXh0SWRzIAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsIjsKLQotICAvKiBDT05URVhUX0lEcyBOZXcgWFNEIFdpemFyZCB1c2VzIHRoZSBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIGZyb20gb3JnLmVjbGlwc2UudWkuZGlhbG9ncyAqLwotIAotICAvKiBDT05URVhUX0lEcyBmb3IgWFNERWRpdG9yIGZvbGxvdyB0aGUgeHNkZXh4eCBjb250ZXh0IElEcyAqLwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTAwMTAgZm9yIFhTRCBFZGl0b3IgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfREVTSUdOX1ZJRVcgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDAxMCI7Ci0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIEZpbGUgTmFtZSBUZXh0IEVkaXQgKG5vdCBlZGl0YWJsZSkgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDAyMCBmb3IgVmVyc2lvbiBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfVkVSU0lPTiAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDAyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAwMzAgZm9yIExhbmd1YWdlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9MQU5HVUFHRSAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMDMwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDA0MCBmb3IgTmFtZXNwYWNlIEdyb3VwICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX05BTUVTUEFDRV9HUk9VUCAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAwNDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMDUwIGZvciBQcmVmaXggVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX1BSRUZJWCAgICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAwNTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMDYwIGZvciBUYXJnZXQgbmFtZXNwYWNlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9UQVJHRVRfTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMDYwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDA3MCBmb3IgQXBwbHkgUHVzaCBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfQVBQTFkgICAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDA3MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAwODAgZm9yIEF0dHJpYnV0ZSBmb3JtIGRlZmF1bHQgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX0FUVFJJQlVURSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAwODAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMDkwIGZvciBFbGVtZW50IGZvcm0gZGVmYXVsdCBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfRUxFTUVOVCAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDA5MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAxMDAgZm9yIEJsb2NrIGRlZmF1bHQgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX0JMT0NLICAgICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAxMDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMTEwIGZvciBGaW5hbCBEZWZhdWx0IENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9GSU5BTCAgICAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMTEwIjsKLQotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDIwMCBmb3IgQW5ub3RhdGlvbnMgQ29tbWVudCBHcm91cCAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIERvY3VtZW50YXRpb24gRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBBcHAgSW5mbyBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOTk9UQVRJT05fQ09NTUVOVF9HUk9VUCA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDIwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAyMTAgZm9yIEFubm90YXRpb25zIENvbW1lbnQgR3JvdXAgLSBvbmx5IHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBEb2N1bWVudGF0aW9uIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gQXBwIEluZm8gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTk5PVEFUSU9OX0NPTU1FTlQgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAyMTAiOwotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDMwMCBmb3IgRG9jdW1lbnRhdGlvbiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0RPQ1VNRU5UQVRJT05fREVTSUdOX1ZJRVcgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDMwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAzMTAgZm9yIFNvdXJjZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9ET0NVTUVOVEFUSU9OX1NPVVJDRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAzMTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMzIwIGZvciBMYW5ndWFnZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9ET0NVTUVOVEFUSU9OX0xBTkdVQUdFICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAzMjAiOwotICAvKiBDT05URVhUX0lEIENvbW1lbnQgR3JvdXAgaXMgZnJvbSBBbm5vdGF0aW9ucyBXaW5kb3cgeHNkZTAyMDAgKi8KLSAgLyogQ09OVEVYVF9JRCBDb21tZW50IE11bHRpLWxpbmUgRWRpdCBpcyBmcm9tIEFubm90YXRpb25zIFdpbmRvdyB4c2QwMjEwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDQwMCBmb3IgQXBwIEluZm8gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BUFBfSU5GT19ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDQwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA0MTAgZm9yIEFwcCBJbmZvIFNvdXJjZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BUFBfSU5GT19TT1VSQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkZTA0MTAiOwotICAvKiBDT05URVhUX0lEIENvbW1lbnQgR3JvdXAgaXMgZnJvbSBBbm5vdGF0aW9ucyBXaW5kb3cgeHNkZTAyMDAgKi8KLSAgLyogQ09OVEVYVF9JRCBDb21tZW50IE11bHRpLWxpbmUgRWRpdCBpcyBmcm9tIEFubm90YXRpb25zIFdpbmRvdyB4c2QwMjEwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDUwMCBmb3IgQ29tcGxleCBUeXBlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQ09NUExFWF9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDUwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA1MTAgZm9yIE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQ09NUExFWF9OQU1FICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDUxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA1MjAgZm9yIEFic3RyYWN0IENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0NPTVBMRVhfQUJTVFJBQ1QgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA1MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNTMwIGZvciBNaXhlZCBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9DT01QTEVYX01JWEVEICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNTMwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDU0MCBmb3IgQmxvY2sgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQ09NUExFWF9CTE9DSyAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDU0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA1NTAgZm9yIEZpbmFsIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0NPTVBMRVhfRklOQUwgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA1NTAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTA2MDAgZm9yIFNpbXBsZSBUeXBlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0lNUExFX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNjAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDYxMCBmb3IgTmFtZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TSU1QTEVfTkFNRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA2MTAiOwotCi0gIC8qIENPTlRFWFRfSUQgZm9yIEdsb2JhbCBFbGVtZW50IGFuZCBFbGVtZW50IERlc2lnbiBWaWV3cyBhcmUgdGhlIHNhbWUgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDcwMCBmb3IgRWxlbWVudCBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzEwIGZvciBFbGVtZW50IE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9OQU1FICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3MTAiOwotICAvKiBDT05URVhUX0lEIFR5cGUgSW5mb3JtYXRpb24gR3JvdXAgaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkwMCAqLwotICAvKiBDT05URVhUX0lEIEJ1aWx0LWluIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTIwICovCi0gIC8qIENPTlRFWFRfSUQgVXNlci1kZWZpbmVkIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTMwICovCi0gIC8qIENPTlRFWFRfSUQgVXNlci1kZWZpbmVkIGNvbXBsZXggdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDk0MCAqLwotICAvKiBDT05URVhUX0lEIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5NTAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDcyMCBmb3IgQWJzdHJhY3QgQ2hlY2sgQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9BQlNUUkFDVCAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzMwIGZvciBOaWxsYWJsZSBDaGVjayBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX05JTExBQkxFICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDczMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3NDAgZm9yIFZhbHVlIEdyb3VwICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9WQUxVRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3NDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzUwIGZvciBGaXhlZCBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX0ZJWEVEICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDc1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3NjAgZm9yIERlZmF1bHQgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9ERUZBVUxUICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3NjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzcwIGZvciBWYWx1ZSBHcm91cCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfVkFMVUVfR1JPVVAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNzcwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDc4MCBmb3IgTWluaW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX01JTklNVU0gICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDc4MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3OTAgZm9yIE1heGltdW0gVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9NQVhJTVVNICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3OTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwODAwIGZvciBCbG9jayBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX0JMT0NLICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDgwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA4MTAgZm9yIEZpbmFsIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfRklOQUwgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwODEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDgyMCBmb3IgU3Vic3RpdHV0aW9uIEdyb3VwIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfU1VCU1RJVFVUSU9OID0gUExVR0lOX05BTUUgKyAiLnhzZGUwODIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDgzMCBmb3IgRm9ybSBRdWFsaWZpY2F0aW9uIENvbWJvIEJveCAqLyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9GT1JNICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA4MzAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTA5MDAgZm9yIFR5cGUgSGVscGVyIEdyb3VwIC0gb25seSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEVsZW1lbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgQXR0cmlidXRlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gU2ltcGxlIENvbnRlbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBSZXN0cmljdGlvbiBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIExpc3QgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlvbiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1RZUEVfSEVMUEVSX0dST1VQICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwOTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDkxMCBmb3IgTm9uZSBSYWRpbyBCdXR0b24gLSBvbmx5IHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFJlc3RyaWN0aW9uIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gTGlzdCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaW9uIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfTk9ORSAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA5MTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTIwIGZvciBCdWlsdC1pbiBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gLSBvbmx5IHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgRWxlbWVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBBdHRyaWJ1dGUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFJlc3RyaWN0aW9uIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gTGlzdCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaW9uIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfQlVJTFRfSU4gPSBQTFVHSU5fTkFNRSArICIueHNkZTA5MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTMwIGZvciBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIC0gb25seSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEVsZW1lbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgQXR0cmlidXRlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gU2ltcGxlIENvbnRlbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBSZXN0cmljdGlvbiBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIExpc3QgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlvbiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1RZUEVfSEVMUEVSX1VTRVJfREVGSU5FRF9TSU1QTEUgPSBQTFVHSU5fTkFNRSArICIueHNkZTA5MzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTQwIGZvciBVc2VyLWRlZmluZWQgY29tcGxleCB0eXBlIFJhZGlvIEJ1dHRvbiAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBFbGVtZW50IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfVVNFUl9ERUZJTkVEX0NPTVBMRVggPSBQTFVHSU5fTkFNRSArICIueHNkZTA5NDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTUwIGZvciBUeXBlIGluZm9ybWF0aW9uIENvbWJvIEJveCAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBFbGVtZW50IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEF0dHJpYnV0ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFNpbXBsZSBDb250ZW50IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gUmVzdHJpY3Rpb24gRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBMaXN0IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfVFlQRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDk1MCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTAwMCBmb3IgQXR0cmlidXRlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMDAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTAxMCBmb3IgQXR0cmlidXRlIE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX05BTUUgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMDEwIjsKLSAgLyogQ09OVEVYVF9JRCBUeXBlIEluZm9ybWF0aW9uIEdyb3VwIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBCdWlsdC1pbiBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkyMCAqLwotICAvKiBDT05URVhUX0lEIFVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkzMCAqLwotICAvKiBDT05URVhUX0lEIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5NTAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTAyMCBmb3IgVmFsdWUgR3JvdXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfVkFMVUVfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEwMjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMDMwIGZvciBGaXhlZCBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfRklYRUQgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEwMzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMDQwIGZvciBEZWZhdWx0IFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9ERUZBVUxUICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTA0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEwNTAgZm9yIFZhbHVlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9WQUxVRSAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTA1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEwNjAgZm9yIFVzYWdlIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9VU0FHRSAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTA2MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEwNzAgZm9yIEZvcm0gcXVhbGlmaWNhaXRvbiBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfRk9STSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEwNzAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTExMDAgZm9yIEVsZW1lbnQgUmVmIFdpbmRvdyBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfUkVGX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTExMCBmb3IgUmVmZXJlbmNlIE5hbWUgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9SRUZfUkVGRVJFTkNFICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTExMTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMTIwIGZvciBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfUkVGX01JTklNVU0gICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMTIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTEzMCBmb3IgTWF4aW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX1JFRl9NQVhJTVVNICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTEzMCI7Ci0gIAotICAvKiBDT05URVhUX0lEIHhzZGUxMjAwIGZvciBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLyAKLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBDb21wbGV4IENvbnRlbnQgRGVzaWduIFZpZXcgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NJTVBMRV9DT05URU5UX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMjAwIjsKLSAgLyogQ09OVEVYVF9JRCBCYXNlIFR5cGUgR3JvdXAgaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkwMCAqLwotICAvKiBDT05URVhUX0lEIE5vbmUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MTAgKi8KLSAgLyogQ09OVEVYVF9JRCBCdWlsdC1pbiBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkyMCAqLwotICAvKiBDT05URVhUX0lEIFVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkzMCAqLwotICAvKiBDT05URVhUX0lEIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5NTAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTIxMCBmb3IgRGVyaXZlZCBieSBDb21ibyBCb3ggLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gU2ltcGxlIENvbnRlbnQgRGVzaWduIFZpZXcgKi8gCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gQ29tcGxleCBDb250ZW50IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0lNUExFX0NPTlRFTlRfREVSSVZFRCA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTIxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTMwMCBmb3IgUmVzdHJpY3Rpb24gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9SRVNUUklDVElPTl9ERVNJR05fVklFVyAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEzMDAiOwotICAvKiBDT05URVhUX0lEIEJhc2UgVHlwZSBHcm91cCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTAwICovCi0gIC8qIENPTlRFWFRfSUQgTm9uZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkxMCAqLwotICAvKiBDT05URVhUX0lEIEJ1aWx0LWluIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTIwICovCi0gIC8qIENPTlRFWFRfSUQgVXNlci1kZWZpbmVkIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTMwICovCi0gIC8qIENPTlRFWFRfSUQgVHlwZSBpbmZvcm1hdGlvbiBDb21ibyBCb3ggaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDk1MCAqLwotICAvKiBDT05URVhUX0lEIHhzZGUxMzEwIGZvciBGYWNldHMgR3JvdXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9SRVNUUklDVElPTl9GQUNFVFNfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEzMTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMzIwIGZvciBGYWNldHMgVGFibGUgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9SRVNUUklDVElPTl9GQUNFVFMgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEzMjAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTE0MDAgZm9yIExpc3QgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9MSVNUX0RFU0lHTl9WSUVXICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTQwMCI7Ci0gIC8qIENPTlRFWFRfSUQgQmFzZSBUeXBlIEdyb3VwIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBOb25lIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTEwICovCi0gIC8qIENPTlRFWFRfSUQgQnVpbHQtaW4gc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MzAgKi8KLSAgLyogQ09OVEVYVF9JRCBUeXBlIGluZm9ybWF0aW9uIENvbWJvIEJveCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTUwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTUwMCBmb3IgQXR0cmlidXRlIEdyb3VwIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX0dST1VQX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxNTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTUxMCBmb3IgTmFtZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfR1JPVVBfTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTUxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCBmb3IgR2xvYmFsIEF0dHJpYnV0ZSBhbmQgQXR0cmlidXRlIERlc2lnbiBWaWV3cyBhcmUgdGhlIHNhbWUgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTYwMCBmb3IgQXR0cmlidXRlIEdyb3VwIFJlZmVyZW5jZSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9HUk9VUF9SRUZfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTE2MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxNjEwIGZvciBSZWZlcmVuY2UgTmFtZSBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfR1JPVVBfUkVGX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkZTE2MTAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTE3MDAgZm9yIEF0dHJpYnV0ZSBSZWZlcmVuY2UgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfUkVGX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxNzAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTcxMCBmb3IgUmVmZXJlbmNlIE5hbWUgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX1JFRl9OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZGUxNzEwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUxODAwIGZvciBQYXR0ZXJuIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfUEFUVEVSTl9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTgwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTE4MTAgZm9yIFZhbHVlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1BBVFRFUk5fVkFMVUUgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTgxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTE4MjAgZm9yIENyZWF0ZSBSZWd1bGFyIEV4cHJlc3Npb24gUHVzaCBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9QQVRURVJOX1JFR1VMQVIgPSBQTFVHSU5fTkFNRSArICIueHNkZTE4MjAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTE5MDAgZm9yIEVudW0gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTlVNX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxOTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTkxMCBmb3IgVmFsdWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRU5VTV9WQUxVRSAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTkxMCI7Ci0gIAotICAvKiBDT05URVhUX0lEIHhzZGUyMDAwIGZvciBJbmNsdWRlIERlc2lnbiBQYWdlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfSU5DTFVERV9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjAwMCI7Ci0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIFNjaGVtYSBMb2NhdGlvbiBUZXh0IEVkaXQgKG5vdCBlZGl0YWJsZSkgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3QgUHVzaCBCdXR0b24gaXMgZnJvbSBJbmNsdWRlIEhlbHBlciB4c2RlMjEwMCAqLyAKLSAgCi0gIC8qIENPTlRFWFRfSUQgeHNkZTIxMDAgZm9yIEluY2x1ZGUgSGVscGVyIFNlbGVjdCBQdXNoIEJ1dHRvbiAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBJbmNsdWRlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gSW1wb3J0IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfSU5DTFVERV9IRUxQRVJfU0VMRUNUID0gUExVR0lOX05BTUUgKyAiLnhzZGUyMTAwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyMjAwIGZvciBJbXBvcnQgRGVzaWduIFBhZ2UgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9JTVBPUlRfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTIyMDAiOwotICAvKiBubyBDT05URVhUX0lEIGZvciBTY2hlbWEgTG9jYXRpb24gVGV4dCBFZGl0IChub3QgZWRpdGFibGUpICovCi0gIC8qIENPTlRFWFRfSUQgU2VsZWN0IFB1c2ggQnV0dG9uIGlzIGZyb20gSW5jbHVkZSBIZWxwZXIgeHNkZTIxMDAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMjIxMCBmb3IgUHJlZml4IFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0lNUE9SVF9QUkVGSVggICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjIxMCI7Ci0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIE5hbWVzcGFjZSBUZXh0IEVkaXQgKG5vdCBlZGl0YWJsZSkgKi8KLQotICAvKiBDT05URVhUX0lEIHhzZGUyMzAwIGZvciBSZWRlZmluZSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1JFREVGSU5FX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUyMzAwIjsKLSAgLyogbm8gQ09OVEVYVF9JRCBmb3IgU2NoZW1hIExvY2F0aW9uIFRleHQgRWRpdCAobm90IGVkaXRhYmxlKSAqLwotICAvKiBDT05URVhUX0lEIFNlbGVjdCBQdXNoIEJ1dHRvbiBpcyBmcm9tIEluY2x1ZGUgSGVscGVyIHhzZGUyMTAwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMjQwMCBmb3IgR3JvdXAgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjQwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI0MTAgZm9yIE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfTkFNRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI0MTAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI1MDAgZm9yIEdyb3VwIFNjb3BlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfREVTSUdOX1ZJRVcgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjUwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI1MTAgZm9yIENvbnRlbnQgbW9kZWwgR3JvdXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9TQ09QRV9DT05URU5UX0dST1VQID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNTEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjUyMCBmb3IgU2VxdWVuY2UgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfU0VRVUVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNTMwIGZvciBDaG9pY2UgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfQ0hPSUNFICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1MzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNTQwIGZvciBBbGwgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfQUxMICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1NDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNTUwIGZvciBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1NDT1BFX01JTklNVU0gID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNTUwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjU2MCBmb3IgTWF4aW11bSBUZXh0IEVkaXQqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1NDT1BFX01BWElNVU0gID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNTYwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyNjAwIGZvciBHcm91cCBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9SRUZfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTI2MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNjEwIGZvciBSZWZlcmVuY2UgbmFtZSBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9SRUZfUkVGRVJFTkNFICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI2MTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNjIwIGZvciBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1JFRl9NSU5JTVVNICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjYyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI2MzAgZm9yIE1heGltdW0gVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfUkVGX01BWElNVU0gICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNjMwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyNzAwIGZvciBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9VTklRVUVfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTI3MDAiOwotICAvKiBDT05URVhUX0lEIE5hbWUgVGV4dCBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3RvciBHcm91cCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODEwICovCi0gIC8qIENPTlRFWFRfSUQgU2VsZWN0b3IgTXVsaXQtbGluZSBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBGaWVsZHMgR3JvdXAgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgzMCAqLwotICAvKiBDT05URVhUX0lEIFNvdXJjZSBUZXh0IEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg0MCAqLwotICAvKiBDT05URVhUX0lEIEFkZCBQdXNoIEJ1dHRvbiBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODUwICovCi0gIC8qIENPTlRFWFRfSUQgUmVtb3ZlIFB1c2ggQnV0dG9uIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NjAgKi8KLSAgLyogQ09OVEVYVF9JRCBUYXJnZXQgTGlzdCBCb3ggaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg3MCAqLwotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjgwMCBmb3IgVW5pcXVlIEJhc2UgTmFtZSBUZXh0IEVkaXQgLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyODEwIGZvciBTZWxlY3RvciBHcm91cCAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgUmVmIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVU5JUVVFX0JBU0VfU0VMRUNUT1JfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4MTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyODIwIGZvciBTZWxlY3RvciBNdWx0aS1saW5lIEVkaXQgLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX1NFTEVDVE9SICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyODIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjgzMCBmb3IgRmllbGRzIEdyb3VwIC0gdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaXF1ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9VTklRVUVfQkFTRV9GSUVMRFNfR1JPVVAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjgzMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI4NDAgZm9yIFNvdXJjZSBUZXh0IEVkaXQgLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX1NPVVJDRSAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyODQwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjg1MCBmb3IgQWRkIFB1c2ggQnV0dG9uIC0gdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaXF1ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9VTklRVUVfQkFTRV9BREQgICAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjg1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI4NjAgZm9yIFJlbW92ZSBQdXNoIEJ1dHRvbiAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgUmVmIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVU5JUVVFX0JBU0VfUkVNT1ZFICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4NjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyODcwIGZvciBUYXJnZXQgTGlzdCBCb3ggLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX1RBUkdFVCAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyODcwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyOTAwIGZvciBLZXkgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9LRVlfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTI5MDAiOwotICAvKiBDT05URVhUX0lEIE5hbWUgVGV4dCBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3RvciBHcm91cCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODEwICovCi0gIC8qIENPTlRFWFRfSUQgU2VsZWN0b3IgTXVsaXQtbGluZSBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBGaWVsZHMgR3JvdXAgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgzMCAqLwotICAvKiBDT05URVhUX0lEIFNvdXJjZSBUZXh0IEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg0MCAqLwotICAvKiBDT05URVhUX0lEIEFkZCBQdXNoIEJ1dHRvbiBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODUwICovCi0gIC8qIENPTlRFWFRfSUQgUmVtb3ZlIFB1c2ggQnV0dG9uIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NjAgKi8KLSAgLyogQ09OVEVYVF9JRCBUYXJnZXQgTGlzdCBCb3ggaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg3MCAqLwotICAvKiBDT05URVhUX0lEIHhzZGUyOTAwIGZvciBLZXkgRGVzaWduIFZpZXcgKi8KLSAgCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI5NTAgZm9yIEtleSBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9LRVlfUkVGX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUyOTUwIjsKLSAgLyogQ09OVEVYVF9JRCBOYW1lIFRleHQgRWRpdCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODAwICovCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI5NjAgZm9yIFJlZmVyZW5jZSBLZXkgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfS0VZX1JFRl9SRUZFUkVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkZTI5NjAiOwotICAvKiBDT05URVhUX0lEIFNlbGVjdG9yIEdyb3VwIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MTAgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3RvciBNdWxpdC1saW5lIEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgyMCAqLwotICAvKiBDT05URVhUX0lEIEZpZWxkcyBHcm91cCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODMwICovCi0gIC8qIENPTlRFWFRfSUQgU291cmNlIFRleHQgRWRpdCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODQwICovCi0gIC8qIENPTlRFWFRfSUQgQWRkIFB1c2ggQnV0dG9uIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NTAgKi8KLSAgLyogQ09OVEVYVF9JRCBSZW1vdmUgUHVzaCBCdXR0b24gaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg2MCAqLwotICAvKiBDT05URVhUX0lEIFRhcmdldCBMaXN0IEJveCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODcwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMzAwMCBmb3IgQW55IEVsZW1lbnQgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTllfRUxFTUVOVF9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMDAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMzAxMCBmb3IgTmFtZXNwYWNlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9FTEVNRU5UX05BTUVTUEFDRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzAxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTMwMjAgZm9yIFByb2Nlc3MgQ29udGVudHMgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQU5ZX0VMRU1FTlRfUFJPQ0VTUyAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMDIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMzAzMCBmb3IgTWluaW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTllfRUxFTUVOVF9NSU5JTVVNICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTMwMzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUzMDQwIGZvciBNYXhpbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9FTEVNRU5UX01BWElNVU0gICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzA0MCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMzEwMCBmb3IgQW55IEF0dHJpYnV0ZSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9BVFRSSUJVVEVfVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzEwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTMxMTAgZm9yIE5hbWVzcGFjZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTllfQVRUUklCVVRFX05BTUVTUEFDRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzExMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTMxMjAgZm9yIFByb2Nlc3MgQ29udGVudHMgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQU5ZX0FUVFJJQlVURV9QUk9DRVNTICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTMxMjAiOwotCi0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIFVuaW9uIERlc2lnbiBWaWV3IC0gdXNlcyBhIGdlbmVyaWMgaW50ZXJmYWNlICovCi0gIC8qIENPTlRFWFRfSUQgVHlwZSBJbmZvcm1hdGlvbiBHcm91cCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTAwICovCi0gIC8qIENPTlRFWFRfSUQgQnVpbHQtaW4gc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MzAgKi8KLSAgLyogQ09OVEVYVF9JRCBUeXBlIGluZm9ybWF0aW9uIENvbWJvIEJveCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTUwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMzIwMCBmb3IgTm90YXRpb24gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9OT1RBVElPTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMjAwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGU0MDAwIGZvciBTb3VyY2UgVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NPVVJDRV9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGU0MDAwIjsKLQotICAvKiBDT05URVhUX0lEcyBmb3IgUmVndWxhciBFeHByZXNzaW9uIFdpemFyZCBmb2xsb3cgdGhlIHhzZHJ4eHggY29udGV4dCBJRHMgKi8KLSAgCi0gIC8qIENPTlRFWFRfSUQgeHNkcjAwMTAgZm9yIENvbXBvc2UgUmVndWxhciBFeHByZXNzaW9uIFBhZ2UgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9QQUdFICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwMTAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDE1IGZvciBUb2tlbiBDb250ZW50cyBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9UT0tFTiA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDAxNSI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwMjAgZm9yIE9jY3VycmVjZSBHcm91cCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX09DQ1VSUkVOQ0VfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwMjAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDMwIGZvciBKdXN0IG9uY2UgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fSlVTVF9PTkNFICAgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMDMwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDA0MCBmb3IgWmVybyBvciBtb3JlIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX1pFUk9fT1JfTU9SRSA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDA0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwNTAgZm9yIE9uZSBvciBtb3JlIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX09ORV9PUl9NT1JFICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDA1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwNjAgZm9yIE9wdGlvbmFsIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX09QVElPTkFMICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDA2MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwNzAgZm9yIFJlcGVhdCBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9SRVBFQVQgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwNzAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDgwIGZvciBSYW5nZSBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9SQU5HRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwODAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDkwIGZvciBSZXBlYXQgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fUkVQRUFUX1RFWFQgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMDkwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDEwMCBmb3IgUmFuZ2UgTWluaW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9SQU5HRV9NSU4gICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAxMDAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMTEwIGZvciBSYW5nZSBNYXhpbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX1JBTkdFX01BWCAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDExMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAxMjAgZm9yIEFkZCBQdXNoIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX0FERCAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDEyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAxMzAgZm9yIEN1cnJlbnQgUmVndWxhciBFeHByZXNzaW9uIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX0NVUlJFTlQgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDEzMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RyMDIwMCBmb3IgVGVzdCBSZWd1bGFyIEV4cHJlc3Npb24gUGFnZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX1RFU1RfUEFHRSAgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMjAwIjsKLSAgLyogbm8gQ09OVEVYVF9JRCBmb3IgUmVndWxhciBFeHByZXNzaW9uIFRleHQgRWRpdCAobm90IGVkaXRhYmxlKSAqLwotICAvKiBDT05URVhUX0lEIHhzZHIwMjEwIGZvciBTYW1wbGUgVGV4dCBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9URVNUX1NBTVBMRSA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDIxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRHMgZm9yIFByZWZlcmVuY2VzIFBhZ2UgZm9sbG93cyB0aGUgeHNkcHh4eCBjb250ZXh0IElEcyAqLwotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RwMDAxMCBmb3IgWE1MIFNjaGVtYSBQcmVmZXJlbmNlcyBQYWdlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFBfUFJFRkVSRU5DRV9QQUdFID0gUExVR0lOX05BTUUgKyAiLnhzZHAwMDEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RwMDAyMCBmb3IgWE1MIFNjaGVtYSBFZGl0b3IgUHJlZmVyZW5jZXMgUGFnZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RQX0VESVRPUl9QUkVGRVJFTkNFX1BBR0UgPSBQTFVHSU5fTkFNRSArICIueHNkcDAwMjAiOwotICAvKiBDT05URVhUX0lEIHhzZHAwMDMwIGZvciBYTUwgU2NoZW1hIFZhbGlkYXRvciBQcmVmZXJlbmNlcyBQYWdlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFBfVkFMSURBVE9SX1BSRUZFUkVOQ0VfUEFHRSA9IFBMVUdJTl9OQU1FICsgIi54c2RwMDAzMCI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3MTM5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5JRXh0ZW5kZWRGaWd1cmVGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcwotewotICBYU0RBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLSAgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSBmaWd1cmVGYWN0b3J5OwotICBFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5OwotICBMaXN0IGFjdGlvbkxpc3Q7Ci0KLSAgcHVibGljIFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMoKQotICB7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGlvbkxpc3QoTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgdGhpcy5hY3Rpb25MaXN0ID0gYWN0aW9uTGlzdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXJGYWN0b3J5KFhTREFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KQotICB7Ci0gICAgdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdFBhcnRGYWN0b3J5TGlzdChFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5KQotICB7Ci0gICAgdGhpcy5lZGl0UGFydEZhY3RvcnkgPSBlZGl0UGFydEZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGaWd1cmVGYWN0b3J5TGlzdChJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5IGZpZ3VyZUZhY3RvcnkpCi0gIHsKLSAgICB0aGlzLmZpZ3VyZUZhY3RvcnkgPSBmaWd1cmVGYWN0b3J5OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QWN0aW9uTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gYWN0aW9uTGlzdDsKLSAgfQotCi0gIHB1YmxpYyBYU0RBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgRWRpdFBhcnRGYWN0b3J5IGdldEVkaXRQYXJ0RmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gZWRpdFBhcnRGYWN0b3J5OwotICB9Ci0KLSAgcHVibGljIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkgZ2V0RmlndXJlRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gZmlndXJlRmFjdG9yeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvclBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTBiNDE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFZGl0b3JQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLlByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgWFNERWRpdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIjsgIC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfWFNEX0RFRkFVTFRfUFJFRklYX1RFWFQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbHNjaGVtYS54c2REZWZhdWx0UHJlZml4VGV4dCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfUFJFRkVSRURfQlVJTFRfSU5fVFlQRVMgPSAib3JnLmVjbGlwc2Uud3N0LnhtbHNjaGVtYS5wcmVmZXJlZEJ1aWx0SW5UeXBlcyI7ICAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9MSVNUX1NFUEFSQVRPUiA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19TQ0hFTUFTX0VYVEVOU0lPTklEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuZXh0ZW5zaW9uQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFUFJFQ0FURURfRVhURU5TSU9OU19TQ0hFTUFTX0VYVEVOU0lPTklEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuRXh0ZW5zaW9uc1NjaGVtYXNEZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy5leGFtcGxlLm9yZyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWFNEX0NPTlRFTlRfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIjsgLy8kTk9OLU5MUy0xJAotICAKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgWFNERWRpdG9yUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotICBwcml2YXRlIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgcmVnaXN0cnk7ICAKLSAgcHJpdmF0ZSBOb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5IG5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnk7Ci0gIHByaXZhdGUgWFNERWRpdG9yQ29uZmlndXJhdGlvbiB4c2RFZGl0b3JDb25maWd1cmF0aW9uID0gbnVsbDsKLSAgcHJpdmF0ZSBzdGF0aWMgQnVuZGxlIGJ1bmRsZTsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUX1VTRV9TSU1QTEVfRURJVF9NT0RFID0gUExVR0lOX0lEICsgIi51c2VTaW1wbGVFZGl0TW9kZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfU0hPV19JTkhFUklURURfQ09OVEVOVCA9IFBMVUdJTl9JRCArICIuc2hvd0luaGVyaXRlZENvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlkgPSAib3JnLmVjbGlwc2Uud3N0LnhtbHNjaGVtYS54c2RRdWFsaWZ5IjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2Uud3N0LnhtbHNjaGVtYS5kZWZhdWx0VGFyZ2V0bmFtZXNwYWNlVGV4dCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfU0hPV19FWFRFUk5BTFMgPSBQTFVHSU5fSUQgKyAiLnNob3dFeHRlcm5hbHMiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUX1hTRF9JTVBPUlRfQ0xFQU5VUCA9IFBMVUdJTl9JRCArICIuYXV0b0ltcG9ydENsZWFudXAiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUX1hTRF9BVVRPX09QRU5fU0NIRU1BX0xPQ0FUSU9OX0RJQUxPRyA9IFBMVUdJTl9JRCArICIuYXV0b09wZW5TY2hlbWFMb2NhdGlvbkRpYWxvZyI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUEFHRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlZmF1bHRQYWdlIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVTSUdOX1BBR0UgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ25QYWdlIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgU09VUkNFX1BBR0UgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zb3VyY2VQYWdlIjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgWFNERWRpdG9yUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlidW5kbGUgPSBjb250ZXh0LmdldEJ1bmRsZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBYU0RFZGl0b3JQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBvKQotICB7Ci0gICAgICByZXR1cm4gZ2V0UmVzb3VyY2VTdHJpbmcoa2V5LCBuZXcgT2JqZWN0W10geyBvfSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBvYmplY3RzKQotICB7Ci0gICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgb2JqZWN0cyk7Ci0gIH0KLQkKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0gIHsKLSAgICAgIHJldHVybiBnZXRSZXNvdXJjZVN0cmluZyhrZXksIG5ldyBPYmplY3RbXSB7IG8xLCBvMn0pOwotICB9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJLy8gcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpblJlc291cmNlcyIpOwotICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGdldEJ1bmRsZSgpKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBnZXRCYXNlVVJMKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaW1hZ2VTdHJpbmcgPSBnZXRCYXNlVVJMID8gImljb25zLyIgKyBuYW1lIDogbmFtZTsgLy8kTk9OLU5MUy0xJAotCi0JCQlVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIGltYWdlU3RyaW5nKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJY29uKFN0cmluZyBuYW1lKQotCXsKLQkgIHRyeSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGdldEltYWdlUmVnaXN0cnkoKTsKLQotCQlpZiAoaW1hZ2VSZWdpc3RyeS5nZXQobmFtZSkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KG5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJVVJMIGluc3RhbGxVUkwgPSBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGltYWdlU3RyaW5nID0gImljb25zLyIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0KLQkJCVVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgaW1hZ2VTdHJpbmcpOwotCQkJaW1hZ2VSZWdpc3RyeS5wdXQobmFtZSwgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpKTsKLQkJCXJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChuYW1lKTsKLQkJfQotCi0JICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gbnVsbDsKLQkgIH0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBYU0RFZGl0b3JQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhTRFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCX0KLQotICAvKioKLSAgICogVGhpcyBnZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgYW5kIGRvZXMgb25lIHN1YnN0aXR1dGlvbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChQbGF0Zm9ybS5nZXRSZXNvdXJjZUJ1bmRsZShnZXRCdW5kbGUoKSkuZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMX0pOwotICB9Ci0gIAotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0WFNESW1hZ2UoU3RyaW5nIGljb25OYW1lKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0SW1hZ2UoaWNvbk5hbWUpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaWNvbk5hbWUpIHsKLQkJSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCi0JCWlmIChpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlUmVnaXN0cnkucHV0KGljb25OYW1lLCBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoZ2V0Q2xhc3MoKSwgaWNvbk5hbWUpKTsKLQkJCXJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFVSTCBnZXRCYXNlVVJMKCkgewotCQlyZXR1cm4gYnVuZGxlLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SWNvbkltYWdlKFN0cmluZyBvYmplY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShuZXcgVVJMKGdldEJhc2VVUkwoKSArICJpY29ucy8iICsgb2JqZWN0ICsgIi5naWYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd0luaGVyaXRlZENvbnRlbnQoKQotICB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oQ09OU1RfU0hPV19JTkhFUklURURfQ09OVEVOVCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkKLSAgewotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfU0hPV19JTkhFUklURURfQ09OVEVOVCwgZmFsc2UpOwotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfWFNEX0RFRkFVTFRfUFJFRklYX1RFWFQsICJ4c2QiKTsgLy8kTk9OLU5MUy0xJAotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlksIGZhbHNlKTsKLSAgICBzdG9yZS5zZXREZWZhdWx0KERFRkFVTFRfUEFHRSwgREVTSUdOX1BBR0UpOwotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFLCBERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfU0hPV19FWFRFUk5BTFMsIGZhbHNlKTsKLSAgICBzdG9yZS5zZXREZWZhdWx0KENPTlNUX1hTRF9JTVBPUlRfQ0xFQU5VUCwgZmFsc2UpOwotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfWFNEX0FVVE9fT1BFTl9TQ0hFTUFfTE9DQVRJT05fRElBTE9HLCB0cnVlKTsKLSAgICAKLSAgICAvL0V2ZW4gdGhlIGxhc3QgaXRlbSBpbiB0aGUgbGlzdCBtdXN0IGNvbnRhaW4gYSB0cmFpbGluZyBMaXN0IHNlcGFyYXRvcgotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfUFJFRkVSRURfQlVJTFRfSU5fVFlQRVMsICAgICAJCQotICAgIAkJImJvb2xlYW4iKyBDVVNUT01fTElTVF9TRVBBUkFUT1IgKyAvLyROT04tTkxTLTEkCi0gICAgCQkiZGF0ZSIgKyBDVVNUT01fTElTVF9TRVBBUkFUT1IgKyAvLyROT04tTkxTLTEkCi0gICAgCQkiZGF0ZVRpbWUiICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SICsgLy8kTk9OLU5MUy0xJAotICAgIAkJImRvdWJsZSIgKyBDVVNUT01fTElTVF9TRVBBUkFUT1IgKyAvLyROT04tTkxTLTEkCi0gICAgCQkiZmxvYXQiICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SICsgLy8kTk9OLU5MUy0xJAotICAgIAkJImhleEJpbmFyeSIgKyBDVVNUT01fTElTVF9TRVBBUkFUT1IgKyAvLyROT04tTkxTLTEkCi0gICAgCQkiaW50IiArIENVU1RPTV9MSVNUX1NFUEFSQVRPUiArIC8vJE5PTi1OTFMtMSQKLSAgICAJCSJzdHJpbmciICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SICsgLy8kTk9OLU5MUy0xJAotICAgIAkJInRpbWUiICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpCi0gIHsKLSAgICBpZiAocmVnaXN0cnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWdpc3RyeSA9IG5ldyBFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KEVYVEVOU0lPTlNfU0NIRU1BU19FWFRFTlNJT05JRCk7Ci0gICAgICByZWdpc3RyeS5fX2ludGVybmFsU2V0RGVwcmVjYXRlZEV4dGVuc2lvbklkKERFUFJFQ0FURURfRVhURU5TSU9OU19TQ0hFTUFTX0VYVEVOU0lPTklEKTsKLSAgICAgIHJlZ2lzdHJ5LnNldFByZWZTdG9yZShYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkgKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlZ2lzdHJ5OwotICB9Ci0KLSAKLSAgcHVibGljIFhTREVkaXRvckNvbmZpZ3VyYXRpb24gZ2V0WFNERWRpdG9yQ29uZmlndXJhdGlvbigpCi0gIHsKLSAgICBpZiAoeHNkRWRpdG9yQ29uZmlndXJhdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIHhzZEVkaXRvckNvbmZpZ3VyYXRpb24gPSBuZXcgWFNERWRpdG9yQ29uZmlndXJhdGlvbigpOwotICAgIH0KLSAgICByZXR1cm4geHNkRWRpdG9yQ29uZmlndXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHhtbCBzY2hlbWEgZGVmYXVsdCBuYW1lc3BhY2UgcHJlZml4Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFhNTFNjaGVtYVByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKENPTlNUX1hTRF9ERUZBVUxUX1BSRUZJWF9URVhUKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dFeHRlcm5hbHMoKQotICB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oQ09OU1RfU0hPV19FWFRFUk5BTFMpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTaG93RXh0ZXJuYWxzKGJvb2xlYW4gZG9TaG93KQotICB7Ci0gICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoQ09OU1RfU0hPV19FWFRFUk5BTFMsIGRvU2hvdyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFJlbW92ZUltcG9ydFNldHRpbmcoKQotICB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oQ09OU1RfWFNEX0lNUE9SVF9DTEVBTlVQKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2dTZXR0aW5nKCkKLSAgewotICAgIHJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKENPTlNUX1hTRF9BVVRPX09QRU5fU0NIRU1BX0xPQ0FUSU9OX0RJQUxPRyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHhtbCBzY2hlbWEgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFhNTFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKENPTlNUX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgaWYgKCF0YXJnZXROYW1lc3BhY2UuZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICB0YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2UgKyAiLyI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHhtbCBzY2hlbWEgbGFuZ3VhZ2UgcXVhbGlmaWNhdGlvbgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNRdWFsaWZ5WE1MU2NoZW1hTGFuZ3VhZ2UoKSB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICByZXR1cm4gZ2V0UGx1Z2luKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U291cmNlUGFnZUFzRGVmYXVsdCgpCi0gIHsKLSAgICBnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShERUZBVUxUX1BBR0UsIFNPVVJDRV9QQUdFKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlc2lnblBhZ2VBc0RlZmF1bHQoKQotICB7Ci0gICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoREVGQVVMVF9QQUdFLCBERVNJR05fUEFHRSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0RGVmYXVsdFBhZ2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgc3RyaW5nIGNvbnN0YW50IHRoYXQgaXMgdGhlIGRlZmF1bHQgcGFnZQotICAgKiAgICAgICAgIHRoZSBlZGl0b3Igc2hvdWxkIHR1cm4gdG8gd2hlbiBmaXJzdCBvcGVuZWQuIENoYW5nZXMgdG8gdGhlCi0gICAqICAgICAgICAgbGFzdCB2aXNpYmxlIHBhZ2Ugd2hlbiB0aGUgZWRpdG9yIHdhcyBjbG9zZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhZ2UoKSB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhERUZBVUxUX1BBR0UpOwotICB9Ci0KLSAgcHVibGljIE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkgZ2V0Tm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSgpCi0gIHsKLSAgICBpZiAobm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSA9PSBudWxsKQotICAgIHsgIAotICAgICAgbm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSA9IG5ldyBOb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCJmb28iKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0NVU1RPTUlaQVRJT05fUFJPVklERVJfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlclBsdWdpbklkIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9DVVNUT01JWkFUSU9OX1BST1ZJREVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5wcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyQ2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHJpdmF0ZSBzdGF0aWMgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyOwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXJJbml0aWFsaXplZCA9IGZhbHNlOwotICAKLSAgcHVibGljIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgZ2V0UHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcigpCi0gIHsKLSAgICBpZiAoIXByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXJJbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVySW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgICAgU3RyaW5nIHBsdWdpbk5hbWUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoUFJPRFVDVF9DVVNUT01JWkFUSU9OX1BST1ZJREVSX1BMVUdJTl9JRCk7Ci0gICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFBST0RVQ1RfQ1VTVE9NSVpBVElPTl9QUk9WSURFUl9DTEFTU19OQU1FKTsKLSAgICAgIGlmIChwbHVnaW5OYW1lICE9IG51bGwgJiYgcGx1Z2luTmFtZS5sZW5ndGgoKSA+IDAgJiYKLSAgICAgICAgICBjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luTmFtZSk7Ci0gICAgICAgICAgQ2xhc3MgY2xhenogPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IChQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKWNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gICAgICAgICAgCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICAgIHJldHVybiBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyOwotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDAzYWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNERWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlRWxlbWVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLk5ld0VsZW1lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgaW1wbGVtZW50cyBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcgoteyAgCi0gIHByb3RlY3RlZCBJRmlsZSBjdXJyZW50RmlsZTsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYVtdIHNjaGVtYXM7Ci0gIAotICBwdWJsaWMgWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgdGhpcy5jdXJyZW50RmlsZSA9IGN1cnJlbnRGaWxlOwotICAgIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZFRvSGlzdG9yeShDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSBpbXBsZW1lbnQgbWUhICAgIAotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0QnJvd3NlRGlhbG9nKCkKLSAgewotICAgIC8vWFNEU2V0RXhpc3RpbmdUeXBlRGlhbG9nIGRpYWxvZyA9IG5ldyBYU0RTZXRFeGlzdGluZ1R5cGVEaWFsb2coY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgIC8vcmV0dXJuIGRpYWxvZzsKLSAgICBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUgZGlhbG9nRGVsZWdhdGUgPSAKLSAgICAJbmV3IFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZShYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUuRUxFTUVOVF9NRVRBX05BTUUsIGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgICByZXR1cm4gZGlhbG9nRGVsZWdhdGU7Ci0gIH0KLQotICBwdWJsaWMgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZ2V0Q29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcigpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGdldEhpc3RvcnkoKQotICB7Ci0gICAgLy8gVE9ETyAoY3MpIGltcGxlbWVudCB0aGlzIHByb3Blcmx5IC0gc2hvdWxkIHRoaXMgaGlzdG9yeSBiZSBnbG9iYWwgb3IgbG9jYWwgdG8gZWFjaCBlZGl0b3I/Ci0gICAgLy8gVGhpcyBpcyBzb21ldGhpbmcgd2Ugc2hvdWxkIHBsYXkgYXJvdW5kIHdpdGggb3Vyc2VsdmVzIHRvIHNlZSB3aGF0IGZlZWxzIHJpZ2h0LgotICAgIC8vCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmVzdWx0W10gPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldE5ld0RpYWxvZygpCi0gIHsKLQkgIGlmIChzY2hlbWFzLmxlbmd0aCA+IDApIHsKLQkJICByZXR1cm4gbmV3IE5ld0VsZW1lbnREaWFsb2coc2NoZW1hc1swXSk7Ci0JICB9Ci0JICBlbHNlIHsKLQkJICByZXR1cm4gbmV3IE5ld0VsZW1lbnREaWFsb2coKTsKLQkgIH0KLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gZ2V0UXVpY2tQaWNrcygpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgaW1wbGVtZW50IHRoaXMgcHJvcGVybHkgLSB3ZSBzaG91bGQgYmUgcHJvdmlkaW5nIGEgbGlzdCBvZiB0aGUgCi0gICAgLy8gbW9zdCAnY29tbW9uJyBidWlsdCBpbiBzY2hlbWEgdHlwZXMgaGVyZQotICAgIC8vIEkgYmVsaWV2ZSBUcnVuZyB3aWxsIGJlIHdvcmtpbmcgb24gYSBwZXJmZXJlbmNlIHBhZ2UgdG8gZ2l2ZSB1cyB0aGlzIGxpc3QKLSAgICAvLyBmb3Igbm93IGxldCdzIGhhcmQgY29kZSBzb21lIHZhbHVlcwotICAgIC8vCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmVzdWx0W10gPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLS8vVE9ETyBub3QgY2hhbmdlZCB5ZXQKLSAgcHVibGljIHZvaWQgbW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKE9iamVjdCByZWZlcmVuY2luZ09iamVjdCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnQpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gY29uY3JldGVDb21wb25lbnQgPSBudWxsOwotICAgIGlmIChyZWZlcmVuY2luZ09iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgewotICAgICAgQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgICBpZiAoYWRhcHRlci5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSByZWZlcmVuY2luZ09iamVjdDsKLSAgICB9Ci0gICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgICBpZiAoY29tcG9uZW50LmlzTmV3KCkpCi0gICAgICAgIHsgIAotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjID0gbnVsbDsKLSAgICAgICAgICBpZiAoY29tcG9uZW50LmdldE1ldGFOYW1lKCkgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRSkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIEFkZFhTREVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRUxFTUVOVCwgY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgICAgY29tbWFuZC5zZXROYW1lVG9BZGQoY29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIGVsZW1lbnREZWMgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChlbGVtZW50RGVjICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX0VMRU1FTlRfUkVGRVJFTkNFLCBjb25jcmV0ZUNvbXBvbmVudCwgZWxlbWVudERlYyk7Ci0gICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIucmVtb3ZlVW51c2VkWFNESW1wb3J0cyhjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgIH0gIAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlRWxlbWVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kKGNvbmNyZXRlQ29tcG9uZW50LCBjb21wb25lbnQuZ2V0TmFtZSgpLCBjb21wb25lbnQuZ2V0UXVhbGlmaWVyKCksIGNvbXBvbmVudC5nZXRGaWxlKCkpOwotICAgICAgICAgIGNvbW1hbmQuc2V0TGFiZWwoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0UpOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREZpbGVFZGl0b3JJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREZpbGVFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmYyODNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RGaWxlRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5JQURURWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREZpbGVFZGl0b3JJbnB1dCBleHRlbmRzIEZpbGVFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElBRFRFZGl0b3JJbnB1dAotewotICBwcml2YXRlIElGaWxlIGZpbGU7Ci0gIHByaXZhdGUgWFNEU2NoZW1hIHNjaGVtYTsKLSAgcHJpdmF0ZSBTdHJpbmcgZWRpdG9yTmFtZTsKLQotICBwdWJsaWMgWFNERmlsZUVkaXRvcklucHV0KElGaWxlIGZpbGUsIFhTRFNjaGVtYSBzY2hlbWEpIHsKLSAgICBzdXBlcihmaWxlKTsKLSAgICBpZiAoZmlsZSA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gICAgZWRpdG9yTmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotICB9Ci0KLSAgcHVibGljIElGaWxlIGdldEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGU7Ci0gIH0KLQotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGVkaXRvck5hbWUgPSBuYW1lOwotICB9Ci0gCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICBpZiAoZWRpdG9yTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBlZGl0b3JOYW1lOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZSgpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkKLSAgewotICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbnMgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICBpZiAobnMgIT0gbnVsbCAmJiBucy5sZW5ndGgoKSA+IDApCi0gICAgICAgIHJldHVybiBNZXNzYWdlcy5fVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRSArIG5zOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gTWVzc2FnZXMuX1VJX0xBQkVMX05PX05BTUVTUEFDRTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldFRvb2xUaXBUZXh0KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiN2Y0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNESHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTW9sbGVyIC0gYWRkZWQgc3VwcG9ydCBmb3IgbG9va3VwcyBvdXQgb2Ygd29ya3NwYWNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0vKioKLSAqIFhTREh5cGVybGluayBrbm93cyBob3cgdG8gb3BlbiBsaW5rcyBmcm9tIFhTRCBmaWxlcy4KLSAqIAotICogQHNlZSBYU0RIeXBlcmxpbmtEZXRlY3RvcgotICovCi1wdWJsaWMgY2xhc3MgWFNESHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluawotewotICBwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLSAgcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBmQ29tcG9uZW50OwotCi0gIHB1YmxpYyBYU0RIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGZSZWdpb24gPSByZWdpb247Ci0gICAgZkNvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgfQotCi0gIHB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpCi0gIHsKLSAgICByZXR1cm4gZlJlZ2lvbjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkKLSAgewotICAgIHJldHVybiBOTFMuYmluZChNZXNzYWdlcy5fVUlfSFlQRVJMSU5LX1RFWFQsIGZDb21wb25lbnQuZ2V0RWxlbWVudCgpLmdldExvY2FsTmFtZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG9wZW4oKQotICB7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IGZDb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0KLSAgICBpZiAoc2NoZW1hID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotCi0JSUZpbGUgc2NoZW1hRmlsZSA9IG51bGw7Ci0gICAgVVJJIHNjaGVtYVVyaSA9IG51bGw7Ci0gICAgCi0JaWYgKFVSSUhlbHBlci5pc1BsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChzY2hlbWFMb2NhdGlvbikpCi0JewotICAgICAgSVBhdGggc2NoZW1hUGF0aCA9IG5ldyBQYXRoKFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woc2NoZW1hTG9jYXRpb24pKTsKLSAgICAgIHNjaGVtYUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoc2NoZW1hUGF0aCk7Ci0gICAgICBpZiAoISBzY2hlbWFGaWxlLmV4aXN0cygpKQotICAgICAgewotICAgIAlyZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCWVsc2UKLQl7Ci0JCXRyeSB7Ci0JCQlzY2hlbWFVcmkgPSBuZXcgVVJJKHNjaGVtYUxvY2F0aW9uKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikge30KLQl9Ci0JCi0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgCi0gICAgICB3b3JrYmVuY2hQYWdlLmdldE5hdmlnYXRpb25IaXN0b3J5KCkubWFya0xvY2F0aW9uKGVkaXRvclBhcnQpOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgIAlpZiAoc2NoZW1hRmlsZSAhPSBudWxsKQotICAgIAl7Ci0gICAgCQllZGl0b3JQYXJ0ID0gSURFLm9wZW5FZGl0b3Iod29ya2JlbmNoUGFnZSwgc2NoZW1hRmlsZSwgdHJ1ZSk7Ci0gICAgCX0KLSAgICAJZWxzZSBpZiAoc2NoZW1hVXJpICE9IG51bGwgJiYgImZpbGUiLmVxdWFscyhzY2hlbWFVcmkuZ2V0U2NoZW1lKCkpKSAvLyROT04tTkxTLTEkCi0gICAgCXsKLSAgICAJCWVkaXRvclBhcnQgPSBJREUub3BlbkVkaXRvcih3b3JrYmVuY2hQYWdlLCBzY2hlbWFVcmksIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUpOwkKLSAgICAJfQotICAgIAllbHNlCi0gICAgCXsKLSAgICAJICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBBRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dChzY2hlbWFMb2NhdGlvbik7Ci0gICAgCSAgICBlZGl0b3JQYXJ0ID0gSURFLm9wZW5FZGl0b3Iod29ya2JlbmNoUGFnZSwgaW5wdXQsIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUpOwotCQl9Ci0gICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICAoKEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKSBlZGl0b3JQYXJ0KS5vcGVuT25HbG9iYWxSZWZlcmVuY2UoZkNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHBpZS5nZXRNZXNzYWdlKCksIHBpZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNESHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTI3ZjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0LlhTRE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLQotLyoqCi0gKiBEZXRlY3RzIGh5cGVybGlua3MgZm9yIFhTRCBmaWxlcy4gVXNlZCBieSB0aGUgWFNEIHRleHQgZWRpdG9yIHRvIHByb3ZpZGUgYQotICogIkdvIHRvIGRlY2xhcmF0aW9uIiBmdW5jdGlvbmFsaXR5IHNpbWlsYXIgd2l0aCB0aGUgb25lIHByb3ZpZGVkIGJ5IHRoZSBKYXZhCi0gKiBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RIeXBlcmxpbmtEZXRlY3RvciBleHRlbmRzIEJhc2VIeXBlcmxpbmtEZXRlY3RvcgotewotICAvKioKLSAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSBpcyAibGlua2FibGUiIHRoYXQgaXMsIHRoZSBjb21wb25lbnQgaXQKLSAgICogcG9pbnRzIHRvIGNhbiBiZSB0aGUgdGFyZ2V0IG9mIGEgImdvIHRvIGRlZmluaXRpb24iIG5hdmlnYXRpb24uIERlcml2ZWQKLSAgICogY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGxpbmthYmxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xpbmthYmxlQXR0cmlidXRlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgYm9vbGVhbiBpc0xpbmthYmxlID0gbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSB8fAotICAgICAgbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFRkVSX0FUVFJJQlVURSkgfHwgCi0gICAgICBuYW1lLmVxdWFscyhYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSkgfHwgCi0gICAgICBuYW1lLmVxdWFscyhYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUpIHx8IAotICAgICAgbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQUxPQ0FUSU9OX0FUVFJJQlVURSkgfHwgCi0gICAgICBuYW1lLmVxdWFscyhYU0RDb25zdGFudHMuU1VCU1RJVFVUSU9OR1JPVVBfQVRUUklCVVRFKSB8fAotICAgICAgbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSkgfHwKLSAgICAgIG5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpCi0gICAgICA7Ci0KLSAgICByZXR1cm4gaXNMaW5rYWJsZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgaHlwZXJsaW5rIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBub2RlLiBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkCi0gICAqIG92ZXJyaWRlLgotICAgKiAKLSAgICogQHBhcmFtIGRvY3VtZW50IHRoZSBzb3VyY2UgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHVuZGVyIHRoZSBjdXJzb3IuCi0gICAqIEBwYXJhbSByZWdpb24gdGhlIHRleHQgcmVnaW9uIHRvIHVzZSB0byBjcmVhdGUgdGhlIGh5cGVybGluay4KLSAgICogQHJldHVybiBhIG5ldyBJSHlwZXJsaW5rIGZvciB0aGUgbm9kZSBvciBudWxsIGlmIG9uZSBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBJSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhJRG9jdW1lbnQgZG9jdW1lbnQsIElET01Ob2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGdldFhTRFNjaGVtYShkb2N1bWVudCk7Ci0KLSAgICBpZiAoeHNkU2NoZW1hID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZ2V0VGFyZ2V0WFNEQ29tcG9uZW50KHhzZFNjaGVtYSwgbm9kZSk7Ci0KLSAgICBpZiAodGFyZ2V0Q29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgSVJlZ2lvbiBub2RlUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKG5vZGUpOwotCi0gICAgICByZXR1cm4gbmV3IFhTREh5cGVybGluayhub2RlUmVnaW9uLCB0YXJnZXRDb21wb25lbnQpOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSBYU0QgY29tcG9uZW50IGZvciB0aGUgZ2l2ZW4gbm9kZS4KLSAgICogCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEgY2Fubm90IGJlIG51bGwKLSAgICogQHBhcmFtIG5vZGUgY2Fubm90IGJlIG51bGwKLSAgICogQHJldHVybiBYU0RDb25jcmV0ZUNvbXBvbmVudAotICAgKi8KLSAgcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRUYXJnZXRYU0RDb21wb25lbnQoWFNEU2NoZW1hIHhzZFNjaGVtYSwgSURPTU5vZGUgbm9kZSkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCA9IHhzZFNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotCi0gICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBudWxsOwotICAgIAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgQXR0cikKLSAgICB7Ci0gICAgICBBdHRyIGF0dHJpYnV0ZSA9IChBdHRyKW5vZGU7Ci0gICAgICBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlICE9IG51bGwgPyBhdHRyaWJ1dGUuZ2V0TmFtZSgpOiBudWxsOwotICAgIH0KLSAgICAKLSAgICBYU0RIeXBlcmxpbmtUYXJnZXRMb2NhdG9yIHhzZEh5cGVybGlua1RhcmdldExvY2F0b3IgPSBuZXcgWFNESHlwZXJsaW5rVGFyZ2V0TG9jYXRvcigpOwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IHhzZEh5cGVybGlua1RhcmdldExvY2F0b3IubG9jYXRlKHhzZENvbXBvbmVudCwgYXR0cmlidXRlTmFtZSk7IAotICAgIAotICAgIHJldHVybiBjb21wb25lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgeHNkIHNjaGVtYSBmcm9tIGRvY3VtZW50Ci0gICAqIAotICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICogQHJldHVybiBYU0RTY2hlbWEgb3IgbnVsbCBvZiBvbmUgZG9lcyBub3QgZXhpc3QgeWV0IGZvciBkb2N1bWVudAotICAgKi8KLSAgcHJpdmF0ZSBYU0RTY2hlbWEgZ2V0WFNEU2NoZW1hKElEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBudWxsOwotICAgIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLSAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKQotICAgICAgICB7Ci0gICAgICAgICAgSURPTURvY3VtZW50IGRvbURvYyA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICBpZiAoZG9tRG9jICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNETW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IChYU0RNb2RlbEFkYXB0ZXIpIGRvbURvYy5nZXRFeGlzdGluZ0FkYXB0ZXIoWFNETW9kZWxBZGFwdGVyLmNsYXNzKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBJU1NVRTogRGlkbid0IHdhbnQgdG8gZ28gdGhyb3VnaCBpbml0aWFsaXppbmcgc2NoZW1hIGlmIGl0IGRvZXMKLSAgICAgICAgICAgICAqIG5vdCBhbHJlYWR5IGV4aXN0LCBzbyBqdXN0IGF0dGVtcHRlZCB0byBnZXQgZXhpc3RpbmcgYWRhcHRlci4gSWYKLSAgICAgICAgICAgICAqIGRvZXNuJ3QgZXhpc3QsIGp1c3QgZG9uJ3QgYm90aGVyIHdvcmtpbmcuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChtb2RlbEFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgc2NoZW1hID0gbW9kZWxBZGFwdGVyLmdldFNjaGVtYSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBtb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNjaGVtYTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREh5cGVybGlua1RhcmdldExvY2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmtUYXJnZXRMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGFlYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREh5cGVybGlua1RhcmdldExvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoOwotCi0vKioKLSAqIEEgY3VzdG9tIFhTRFN3aXRjaCB1c2VkIHRvIGxvY2F0ZSB0aGUgInJlZmVyZW5jZWQiIGNvbXBvbmVudC4gVXNlZCBieSB0aGUKLSAqIGh5cGVybGluay9GMyBuYXZpZ2F0aW9uIG1lY2hhbmlzbS4gTWFkZSBhIHNlcGFyYXRlIGNsYXNzIGJlY2F1c2UgaXQgaXMgdXNlZAotICogZnJvbSB0aGUgV1NETCBlZGl0b3IgYXMgd2VsbC4KLSAqLwotcHVibGljIGNsYXNzIFhTREh5cGVybGlua1RhcmdldExvY2F0b3IgZXh0ZW5kcyBYU0RTd2l0Y2gKLXsKLSAgLyoqCi0gICAqIEhvbGRzIHRoZSBhdHRyaWJ1dGUgbmFtZSBpZiB0aGUgY3Vyc29yL21vdXNlIGlzIG92ZXIgYW4gYXR0cmlidXRlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlTmFtZTsKLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFN3aXRjaCNjYXNlWFNEQXR0cmlidXRlRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlRGVjbGFyYXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgaWYgKGF0dHJpYnV0ZURlY2xhcmF0aW9uLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBhdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBhdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpOwotCi0gICAgICAvLyBBdm9pZCBuYXZpZ2F0aW5nIHRvIGJ1aWx0IGluIGRhdGEgdHlwZXMuCi0KLSAgICAgIGlmIChpc0Zyb21TY2hlbWFGb3JTY2hlbWEodGFyZ2V0KSkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoI2Nhc2VYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24ob3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgdGFyZ2V0ID0gbnVsbDsKLQotICAgIGlmIChhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uaXNBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGFyZ2V0OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2gjY2FzZVhTREVsZW1lbnREZWNsYXJhdGlvbihvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgaWYgKGVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHRhcmdldCA9IGVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgdHlwZURlZmluaXRpb24gPSBudWxsOwotCi0gICAgICBpZiAoZWxlbWVudERlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHlwZURlZmluaXRpb24gPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgIH0KLQotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgc3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiA9IGVsZW1lbnREZWNsYXJhdGlvbi5nZXRTdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uKCk7Ci0KLSAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiAhPSBudWxsICYmIHN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlcmUgYXJlIDIgdGhpbmdzIHdlIGNhbiBuYXZpZ2F0ZSB0bzogaWYgdGhlIGN1cnNvciBpcyBhbnl3aGVyZSBvbgotICAgICAgICAvLyB0aGUKLSAgICAgICAgLy8gc3Vic3RpdHV0aW9uIGF0dHJpYnV0ZSB0aGVuIGp1bXAgdG8gdGhhdCwgb3RoZXJ3aXNlIGp1c3QgZ28gdG8gdGhlCi0gICAgICAgIC8vIGJhc2UgdHlwZS4KLQotICAgICAgICBpZiAoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURS5lcXVhbHMoYXR0cmlidXRlTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXQgPSBzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRhcmdldCA9IHR5cGVEZWZpbml0aW9uOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRhcmdldCA9IHR5cGVEZWZpbml0aW9uICE9IG51bGwgPyB0eXBlRGVmaW5pdGlvbiA6IHN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb247Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc0Zyb21TY2hlbWFGb3JTY2hlbWEodGFyZ2V0KSkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdGFyZ2V0OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2gjY2FzZVhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24ob3JnLmVjbGlwc2UueHNkLlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRDb25zdHJhaW50RGVmaW5pdGlvbikKLSAgewotICAgIE9iamVjdCB0YXJnZXQgPSBudWxsOwotCi0gICAgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiByZWZlcmVuY2VkS2V5ID0gaWRDb25zdHJhaW50RGVmaW5pdGlvbi5nZXRSZWZlcmVuY2VkS2V5KCk7Ci0KLSAgICBpZiAocmVmZXJlbmNlZEtleSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRhcmdldCA9IHJlZmVyZW5jZWRLZXk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoI2Nhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHRhcmdldCA9IG51bGw7Ci0KLSAgICBpZiAobW9kZWxHcm91cERlZmluaXRpb24uaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHRhcmdldCA9IG1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGFyZ2V0OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2gjY2FzZVhTRFNjaGVtYURpcmVjdGl2ZShvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEU2NoZW1hRGlyZWN0aXZlKFhTRFNjaGVtYURpcmVjdGl2ZSBkaXJlY3RpdmUpCi0gIHsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gZGlyZWN0aXZlLmdldFJlc29sdmVkU2NoZW1hKCk7Ci0KLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgLy8gU2ltcGxlIHR5cGVzIGNhbiBiZSBvbmUgb2Y6IGF0b21pYywgbGlzdCBvciB1bmlvbi4KLQotICAgIFhTRFZhcmlldHkgdmFyaWV0eSA9IHR5cGVEZWZpbml0aW9uLmdldFZhcmlldHkoKTsKLSAgICBpbnQgdmFyaWV0eVR5cGUgPSB2YXJpZXR5LmdldFZhbHVlKCk7Ci0KLSAgICBzd2l0Y2ggKHZhcmlldHlUeXBlKQotICAgIHsKLSAgICAgIGNhc2UgWFNEVmFyaWV0eS5BVE9NSUM6Ci0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXQgPSB0eXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWFNEVmFyaWV0eS5MSVNUOgotICAgICAgICB7Ci0gICAgICAgICAgdGFyZ2V0ID0gdHlwZURlZmluaXRpb24uZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhTRFZhcmlldHkuVU5JT046Ci0gICAgICAgIHsKLSAgICAgICAgICBMaXN0IG1lbWJlclR5cGVzID0gdHlwZURlZmluaXRpb24uZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgICAgaWYgKG1lbWJlclR5cGVzICE9IG51bGwgJiYgbWVtYmVyVHlwZXMuc2l6ZSgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJU1NVRTogV2hhdCBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSB0eXBlPwotICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBhIGNhc2UgZm9yIG11bHRpcGxlIGh5cGVybGlua3MgYXQgdGhlIHNhbWUKLSAgICAgICAgICAgIC8vIGxvY2F0aW9uLgotICAgICAgICAgICAgdGFyZ2V0ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBtZW1iZXJUeXBlcy5nZXQoMCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIEF2b2lkIG5hdmlnYXRpbmcgdG8gYnVpbHQgaW4gZGF0YSB0eXBlcy4KLQotICAgIGlmIChpc0Zyb21TY2hlbWFGb3JTY2hlbWEodGFyZ2V0KSkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBudWxsOwotICAgIH0KLQotICAgIHJldHVybiB0YXJnZXQ7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFN3aXRjaCNjYXNlWFNEVHlwZURlZmluaXRpb24ob3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEVHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUgPSB0eXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZSgpOwotCi0gICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgdGFyZ2V0ID0gYmFzZVR5cGU7Ci0gICAgfQotCi0gICAgLy8gQXZvaWQgbmF2aWdhdGluZyB0byBidWlsdCBpbiBkYXRhIHR5cGVzLgotCi0gICAgaWYgKGlzRnJvbVNjaGVtYUZvclNjaGVtYSh0YXJnZXQpKQotICAgIHsKLSAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlY3RzIGlmIGEgZ2l2ZW4gc2NoZW1hIGNvbXBvbmVudCBpcyBmcm9tIHRoZSBzY2hlbWEgZm9yIHNjaGVtYSAoYnVpbHQgaW4KLSAgICogZGF0YSB0eXBlcykuIFVzZWQgdG8gYXZvaWQgbmF2aWdhdGluZyB0byB0aGlzIHR5cGUgb2YgY29tcG9uZW50cyBhcyB0aGV5Ci0gICAqIGRvbid0IGhhdmUgYW4gYWNjZXNzaWJsZSBwaHlzaWNhbCBsb2NhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCB0byBjaGVjay4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21wb25lbnQgaXMgZnJvbSB0aGUgc2NoZW1hIGZvciBzY2hlbWEgbmFtZXNwYWNlLAotICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRnJvbVNjaGVtYUZvclNjaGVtYShYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBjb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0KLSAgICBpZiAoc2NoZW1hICE9IG51bGwgJiYgc2NoZW1hLmVxdWFscyhzY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkpKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBMb2NhdGVzIHRoZSB0YXJnZXQgY29tcG9uZW50IC0gZm9yIGV4YW1wbGUgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gcG9pbnRlZAotICAgKiB0byBieSBhbiBlbGVtZW50IHJlZmVyZW5jZSwgZXRjLgotICAgKiAKLSAgICogQHBhcmFtIGNvbXBvbmVudCB0aGUgY3VycmVudCBjb21wb25lbnQuCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZSBpZiB0aGUgY3Vyc29yL21vdXNlIGlzIG92ZXIgYW4KLSAgICogICAgICAgIGF0dHJpYnV0ZS4gVGhpcyBpcyB1c2VkIHRvIHByb3ZpZGUgZmluZSBncmFpbmVkIG5hdmlnYXRpb24gZm9yCi0gICAqICAgICAgICBjb21wb25lbnRzIHdpdGggbW9yZSB0aGFuIG9uZSAiYWN0aXZlIiBhdHRyaWJ1dGUuCi0gICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgWFNEIGNvbmNyZXRlIGNvbXBvbmVudCBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuCi0gICAqLwotICBwdWJsaWMgWFNEQ29uY3JldGVDb21wb25lbnQgbG9jYXRlKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwotCi0gICAgcmV0dXJuIChYU0RDb25jcmV0ZUNvbXBvbmVudCkgZG9Td2l0Y2goY29tcG9uZW50KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRE11bHRpUGFnZUVkaXRvckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNETXVsdGlQYWdlRWRpdG9yQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ2MmFmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNETXVsdGlQYWdlRWRpdG9yQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuWm9vbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuWm9vbUluUmV0YXJnZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuWm9vbU91dFJldGFyZ2V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZXRhcmdldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLklYU0RUb29sYmFyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQ2FwdHVyZVNjcmVlbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBpbnN0YWxsYXRpb24vZGVpbnN0YWxsYXRpb24gb2YgZ2xvYmFsIGFjdGlvbnMgZm9yIG11bHRpLXBhZ2UKLSAqIGVkaXRvcnMuIFJlc3BvbnNpYmxlIGZvciB0aGUgcmVkaXJlY3Rpb24gb2YgZ2xvYmFsIGFjdGlvbnMgdG8gdGhlIGFjdGl2ZQotICogZWRpdG9yLiBNdWx0aS1wYWdlIGNvbnRyaWJ1dG9yIHJlcGxhY2VzIHRoZSBjb250cmlidXRvcnMgZm9yIHRoZSBpbmRpdmlkdWFsCi0gKiBlZGl0b3JzIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIFhTRE11bHRpUGFnZUVkaXRvckNvbnRyaWJ1dG9yIGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3JQYXJ0OwotICBwcml2YXRlIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvcjsKLSAgcHJvdGVjdGVkIElUZXh0RWRpdG9yIHRleHRFZGl0b3I7Ci0gIHByb3RlY3RlZCBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Igc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCBmUGFydExpc3RlbmVycz0gbmV3IEFycmF5TGlzdCgpOwotICBab29tSW5SZXRhcmdldEFjdGlvbiB6b29tSW5SZXRhcmdldEFjdGlvbjsKLSAgWm9vbU91dFJldGFyZ2V0QWN0aW9uIHpvb21PdXRSZXRhcmdldEFjdGlvbjsKLSAgQWN0aW9uIGNhcHR1cmVTY3JlZW5BY3Rpb247Ci0gIFpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0gem9vbUNvbWJvQ29udHJpYnV0aW9uSXRlbTsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBtdWx0aS1wYWdlIGNvbnRyaWJ1dG9yLgotICAgKi8KLSAgcHVibGljIFhTRE11bHRpUGFnZUVkaXRvckNvbnRyaWJ1dG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBuZXcgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yKCk7Ci0gICAgem9vbUluUmV0YXJnZXRBY3Rpb24gPSBuZXcgWm9vbUluUmV0YXJnZXRBY3Rpb24oKTsKLSAgICB6b29tSW5SZXRhcmdldEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZXRvb2wxNi96b29tcGx1cy5naWYiKSk7Ci0gICAgem9vbU91dFJldGFyZ2V0QWN0aW9uID0gbmV3IFpvb21PdXRSZXRhcmdldEFjdGlvbigpOwotICAgIHpvb21PdXRSZXRhcmdldEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZXRvb2wxNi96b29tbWludXMuZ2lmIikpOwotICAgIGNhcHR1cmVTY3JlZW5BY3Rpb24gPSBuZXcgQ2FwdHVyZVNjcmVlbkFjdGlvbigpOwotICAgIGZQYXJ0TGlzdGVuZXJzLmFkZCh6b29tSW5SZXRhcmdldEFjdGlvbik7Ci0gICAgZlBhcnRMaXN0ZW5lcnMuYWRkKHpvb21PdXRSZXRhcmdldEFjdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYWN0aW9uIHJlZ2lzdGVkIHdpdGggdGhlIGdpdmVuIHRleHQgZWRpdG9yLgotICAgKiAKLSAgICogQHJldHVybiBJQWN0aW9uIG9yIG51bGwgaWYgZWRpdG9yIGlzIG51bGwuCi0gICAqLwotICBwcm90ZWN0ZWQgSUFjdGlvbiBnZXRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBTdHJpbmcgYWN0aW9uSUQpCi0gIHsKLSAgICByZXR1cm4gKGVkaXRvciA9PSBudWxsID8gbnVsbCA6IGVkaXRvci5nZXRBY3Rpb24oYWN0aW9uSUQpKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YURvYykgTWV0aG9kIGRlY2xhcmVkIGluCi0gICAqIEFic3RyYWN0TXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuCi0gICAqLwotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgcGFydCkKLSAgewotICAgIGlmIChhY3RpdmVFZGl0b3JQYXJ0ID09IHBhcnQpCi0gICAgICByZXR1cm47Ci0KLSAgICBhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsKLQotICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0gICAgYm9vbGVhbiBpc1NvdXJjZSA9IGZhbHNlOwotICAgIAotICAgIGlmIChhY3RpdmVFZGl0b3JQYXJ0ICE9IG51bGwgJiYgYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotICAgIHsKLSAgICAgIGlzU291cmNlID0gdHJ1ZTsKLSAgICAgIHpvb21JblJldGFyZ2V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgem9vbU91dFJldGFyZ2V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgY2FwdHVyZVNjcmVlbkFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIGFjdGl2YXRlU291cmNlUGFnZShhY3RpdmVFZGl0b3JQYXJ0LCB0cnVlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGFjdGl2YXRlU291cmNlUGFnZSh4c2RFZGl0b3IsIGZhbHNlKTsKLSAgICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICB7Ci0gICAgICAgIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgcGFydDsKLSAgICAgIH0KLSAgICAgIGlmICh4c2RFZGl0b3IgIT0gbnVsbCkKLSAgICAgIHsgICAgCSAgCi0gICAgICAgIC8vIGNzOiBoZXJlJ3Mgd2UgZW5zdXJlIHRoZSBVTkRPIGFuZCBSRURPIGFjdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIAotICAgICAgICAvLyB0aGUgZGVzaWduIHZpZXcgaXMgYWN0aXZlCi0gICAgICAgIElXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0geHNkRWRpdG9yLmdldFNpdGUoKTsKLSAgICAgICAgaWYgKHNpdGUgaW5zdGFuY2VvZiBJRWRpdG9yU2l0ZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0geHNkRWRpdG9yLmdldFRleHRFZGl0b3IoKTsKLSAgICAgICAgICBJQWN0aW9uQmFycyBzaXRlQWN0aW9uQmFycyA9ICgoSUVkaXRvclNpdGUpIHNpdGUpLmdldEFjdGlvbkJhcnMoKTsKLSAgICAgICAgICBzaXRlQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8sIGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPKSk7Ci0gICAgICAgICAgc2l0ZUFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SRURPLCBnZXRBY3Rpb24odGV4dEVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETykpOwotICAgICAgICAgIHNpdGVBY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsgICAgCQkJCQkKLSAgICAgICAgfQotCQkJCi0gICAgICAgIE9iamVjdCBhZGFwdGVyID0geHNkRWRpdG9yLmdldEFkYXB0ZXIoQWN0aW9uUmVnaXN0cnkuY2xhc3MpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGlvblJlZ2lzdHJ5KQotICAgICAgICB7Ci0gICAgICAgICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSAoQWN0aW9uUmVnaXN0cnkpIGFkYXB0ZXI7Ci0gICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksIHJlZ2lzdHJ5LmdldEFjdGlvbihEZWxldGVBY3Rpb24uSUQpKTsKLSAgICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoR0VGQWN0aW9uQ29uc3RhbnRzLlpPT01fSU4sIHJlZ2lzdHJ5LmdldEFjdGlvbihHRUZBY3Rpb25Db25zdGFudHMuWk9PTV9JTikpOwotICAgICAgICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihHRUZBY3Rpb25Db25zdGFudHMuWk9PTV9PVVQsIHJlZ2lzdHJ5LmdldEFjdGlvbihHRUZBY3Rpb25Db25zdGFudHMuWk9PTV9PVVQpKTsKLSAgICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QUklOVC5nZXRJZCgpLCByZWdpc3RyeS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5QUklOVC5nZXRJZCgpKSk7Ci0gICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLCByZWdpc3RyeS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmdldElkKCkpKTsKLSAgICAgICAgICB6b29tSW5SZXRhcmdldEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIHpvb21PdXRSZXRhcmdldEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIGNhcHR1cmVTY3JlZW5BY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLSAgICAgIC8vIHVwZGF0ZSBtZW51IGJhciBhbmQgdG9vbCBiYXIKLSAgICAgIGFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotICAgIH0KLSAgICAKLSAgICBpZiAoem9vbUNvbWJvQ29udHJpYnV0aW9uSXRlbSAhPSBudWxsKQotICAgIHsKLSAgICAgIHpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0uc2V0VmlzaWJsZSghaXNTb3VyY2UpOwotICAgICAgem9vbUNvbWJvQ29udHJpYnV0aW9uSXRlbS51cGRhdGUoKTsKLSAgICAgIC8vIEJ1ZyAyNTQ3NzIgLSBwYXJlbnQgY29udHJpYnV0aW9uIG1hbmFnZXIgc2hvdWxkIG5vdCBiZSBudWxsLiAgV2UgYWRkZWQgdGhpcyBpdGVtIGFscmVhZHkuCi0gICAgICAvLyBGb3JjZSB0aGUgVG9vbEJhck1hbmFnZXIgdG8gdXBkYXRlL3JlZHJhdyB0aGUgaXRlbXMKLSAgICAgIHpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0uZ2V0UGFyZW50KCkudXBkYXRlKHRydWUpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVTb3VyY2VQYWdlKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvciwgYm9vbGVhbiBzdGF0ZSkKLSAgewotICAgIGlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsICYmIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKQotICAgIHsKLSAgICAgIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotICAgICAgKChJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKS5zZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKHN0YXRlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkKLSAgewotICAgIElFZGl0b3JQYXJ0IGFjdGl2ZU5lc3RlZEVkaXRvciA9IG51bGw7Ci0gICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBNdWx0aVBhZ2VFZGl0b3JQYXJ0KQotICAgIHsKLSAgICAgIGFjdGl2ZU5lc3RlZEVkaXRvciA9IHBhcnQ7Ci0gICAgfQotICAgIHNldEFjdGl2ZVBhZ2UoYWN0aXZlTmVzdGVkRWRpdG9yKTsKLSAgICAKLSAgICBpZiAocGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgIHsKLSAgICAgIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgcGFydDsKLQotICAgICAgdGV4dEVkaXRvciA9IHhzZEVkaXRvci5nZXRUZXh0RWRpdG9yKCk7Ci0gICAgICBpZiAodGV4dEVkaXRvciAhPSBudWxsKQotICAgICAgeyAgICAgIAotLy8gICAgICAgIHVwZGF0ZUFjdGlvbnMoKTsgIAotICAgICAgICBnZXRBY3Rpb25CYXJzKCkudXBkYXRlQWN0aW9uQmFycygpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBMaXN0IGxpc3QgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WFNERWRpdG9yQ29uZmlndXJhdGlvbigpLmdldFRvb2xiYXJBY3Rpb25zKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgICgoSVhTRFRvb2xiYXJBY3Rpb24paS5uZXh0KCkpLnNldEVkaXRvclBhcnQoYWN0aXZlTmVzdGVkRWRpdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikKLSAgewotICAgIElNZW51TWFuYWdlciBtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLl9VSV9NRU5VX1hTRF9FRElUT1IpOwotICAgIG1hbmFnZXIucHJlcGVuZFRvR3JvdXAoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIG1lbnUpOwotCi0gICAgLy8gQWRkIGV4dGVuc2lvbiBtZW51IGFjdGlvbnMKLSAgICBMaXN0IGxpc3QgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WFNERWRpdG9yQ29uZmlndXJhdGlvbigpLmdldFRvb2xiYXJBY3Rpb25zKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIG1lbnUuYWRkKChJWFNEVG9vbGJhckFjdGlvbilpLm5leHQoKSk7Ci0gICAgfQotCi0gICAgbWVudS5hZGQoem9vbUluUmV0YXJnZXRBY3Rpb24pOwotICAgIG1lbnUuYWRkKHpvb21PdXRSZXRhcmdldEFjdGlvbik7Ci0gICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotICAgIG1lbnUuYWRkKGNhcHR1cmVTY3JlZW5BY3Rpb24pOwotCi0gICAgbWVudS51cGRhdGVBbGwodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciBtYW5hZ2VyKQotICB7Ci0gICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAvLyBBZGQgZXh0ZW5zaW9uIHRvb2xiYXIgYWN0aW9ucwotICAgIExpc3QgbGlzdCA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYU0RFZGl0b3JDb25maWd1cmF0aW9uKCkuZ2V0VG9vbGJhckFjdGlvbnMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgbWFuYWdlci5hZGQoKElYU0RUb29sYmFyQWN0aW9uKWkubmV4dCgpKTsKLSAgICB9Ci0KLSAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgIFN0cmluZ1tdIHpvb21TdHJpbmdzID0gbmV3IFN0cmluZ1tdIHsgWm9vbU1hbmFnZXIuRklUX0FMTCwgWm9vbU1hbmFnZXIuRklUX0hFSUdIVCwgWm9vbU1hbmFnZXIuRklUX1dJRFRIIH07Ci0gICAgem9vbUNvbWJvQ29udHJpYnV0aW9uSXRlbSA9IG5ldyBab29tQ29tYm9Db250cmlidXRpb25JdGVtKGdldFBhZ2UoKSwgem9vbVN0cmluZ3MpOwotICAgIG1hbmFnZXIuYWRkKHpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0pOwotICAgIG1hbmFnZXIuYWRkKGNhcHR1cmVTY3JlZW5BY3Rpb24pOwotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBiYXJzLCBJV29ya2JlbmNoUGFnZSBwYWdlKQotICB7Ci0gICAgSXRlcmF0b3IgZSA9IGZQYXJ0TGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGUuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIHBhZ2UuYWRkUGFydExpc3RlbmVyKChSZXRhcmdldEFjdGlvbikgZS5uZXh0KCkpOwotICAgIH0KLSAgICAKLSAgICBpbml0U291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IoYmFycyk7Ci0gICAgCi0gICAgc3VwZXIuaW5pdChiYXJzLCBwYWdlKTsKLSAgfQotCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBpbml0U291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotICAgIGlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKQotICAgICAgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IuaW5pdChhY3Rpb25CYXJzLCBnZXRQYWdlKCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGZQYXJ0TGlzdGVuZXJzID0gbnVsbDsKLSAgICBpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCkKLSAgICAgIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFNlbGVjdGlvbk1hcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFNlbGVjdGlvbk1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTI3NTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RTZWxlY3Rpb25NYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNEU2VsZWN0aW9uTWFwcGVyIGltcGxlbWVudHMgSVNlbGVjdGlvbk1hcHBlcgotewotICBwdWJsaWMgSVNlbGVjdGlvbiBtYXBTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsgIAotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKCgoQWRhcHRlcilvKS5nZXRUYXJnZXQoKSk7Ci0gICAgICAgIH0gIAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChvKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxpc3QpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFN1YnN0aXR1dGlvbkdyb3VwRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmMjUwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNERWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTRFN1YnN0aXR1dGlvbkdyb3VwRWRpdE1hbmFnZXIgZXh0ZW5kcyBYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIKLXsKLQotICBwdWJsaWMgWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlcihJRmlsZSBjdXJyZW50RmlsZSwgWFNEU2NoZW1hW10gc2NoZW1hcykKLSAgewotICAgIHN1cGVyKGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShPYmplY3QgcmVmZXJlbmNpbmdPYmplY3QsIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50KQotICB7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGNvbmNyZXRlQ29tcG9uZW50ID0gbnVsbDsKLSAgICBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgIHsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKXJlZmVyZW5jaW5nT2JqZWN0OwotICAgICAgaWYgKGFkYXB0ZXIuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilhZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChyZWZlcmVuY2luZ09iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgfQotICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgICAgaWYgKGNvbXBvbmVudC5pc05ldygpKQotICAgICAgICB7ICAKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlYyA9IG51bGw7Ci0gICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuRUxFTUVOVF9NRVRBX05BTUUpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBBZGRYU0RFbGVtZW50Q29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VMRU1FTlQsIGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgICAgICBlbGVtZW50RGVjID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWxlbWVudERlYyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoY29uY3JldGVDb21wb25lbnQuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuU1VCU1RJVFVUSU9OR1JPVVBfQVRUUklCVVRFLCBlbGVtZW50RGVjLmdldFFOYW1lKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfU1VCU1RJVFVUSU9OX0dST1VQKTsKLSAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIH0gIAotICAgICAgICB9ICAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChjb25jcmV0ZUNvbXBvbmVudC5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUsICgoWFNERWxlbWVudERlY2xhcmF0aW9uKWNvbXBvbmVudC5nZXRPYmplY3QoKSkuZ2V0UU5hbWUoY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9TVUJTVElUVVRJT05fR1JPVVApOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIFhTRERpcmVjdGl2ZXNNYW5hZ2VyLnJlbW92ZVVudXNlZFhTREltcG9ydHMoY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM1OTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBFdWdlbmUgT3N0cm91a2hvdiwgZXVnZW5lQGdlbnVpdGVjLmNvbSAtIFsyMDMyOTFdIFhTRCBFZGl0b3IgU291cmNlIFN0YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgdXBkYXRlZCBpbiBPdXRsaW5lL0dyYXBoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlVXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFBhcnRpY2xlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudGV4dC5YU0RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgZXh0ZW5kcyBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBpbXBsZW1lbnRzIElBRFRPYmplY3RMaXN0ZW5lcgotewotICBYU0RCYXNlQWRhcHRlciBvbGRTZWxlY3Rpb247Ci0gIFhTRE1vZGVsQWRhcHRlciB4c2RNb2RlbEFkYXB0ZXI7Ci0gIHB1YmxpYyBYU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZShJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKQotICB7Ci0gICAgc3VwZXIodGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcik7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCi0gICAgICBPYmplY3Qgc2VsZWN0ZWQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgICAgewotICAgICAgICBYU0RCYXNlQWRhcHRlciBhZGFwdGVyID0gKFhTREJhc2VBZGFwdGVyKXNlbGVjdGVkOwotICAgICAgICBpZiAob2xkU2VsZWN0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBvbGRTZWxlY3Rpb24udW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgIGlmIChvbGRTZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikoKFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpb2xkU2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgICAgIGlmIChlbGVtLmdldENvbnRhaW5lcigpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcCA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZWxlbS5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgICAgIGlmIChhZGFwIGluc3RhbmNlb2YgWFNEUGFydGljbGVBZGFwdGVyKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFNEUGFydGljbGVBZGFwdGVyIHBhcnRpY2xlQWRhcHRlciA9IChYU0RQYXJ0aWNsZUFkYXB0ZXIpYWRhcDsKLSAgICAgICAgICAgICAgICBwYXJ0aWNsZUFkYXB0ZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWxlbS5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIHJlc29sdmVkRWxlbWVudEFkYXB0ZXIgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcilYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGVsZW0uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgICAgICAgICAgIHJlc29sdmVkRWxlbWVudEFkYXB0ZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbSA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pKChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKWFkYXB0ZXIpLmdldFRhcmdldCgpOwotICAgICAgICAgIEFkYXB0ZXIgYWRhcCA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZWxlbS5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgaWYgKGFkYXAgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZUFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEUGFydGljbGVBZGFwdGVyIHBhcnRpY2xlQWRhcHRlciA9IChYU0RQYXJ0aWNsZUFkYXB0ZXIpYWRhcDsKLSAgICAgICAgICAgIHBhcnRpY2xlQWRhcHRlci5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWxlbS5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgcmVzb2x2ZWRFbGVtZW50QWRhcHRlciA9IChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKVhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZWxlbS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICAgICAgICAgIHJlc29sdmVkRWxlbWVudEFkYXB0ZXIucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyIGF0dHJpYnV0ZVVzZSA9IChYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKSBhZGFwdGVyOwotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSB4c2RBdHRyVXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgYXR0cmlidXRlVXNlLmdldFRhcmdldCgpOwotICAgICAgICAgIGFkYXB0ZXIgPSAoWFNEQmFzZUFkYXB0ZXIpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoeHNkQXR0clVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICBhZGFwdGVyLnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG9sZFNlbGVjdGlvbiA9IGFkYXB0ZXI7Ci0gICAgICAgIE9iamVjdCBtb2RlbCA9IGFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0KLSAgICAgICAgaWYgKHhzZE1vZGVsQWRhcHRlciAhPSBudWxsICYmIHhzZE1vZGVsQWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgeHNkTW9kZWxBZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpLnJlbW92ZUxpc3RlbmVyKGludGVybmFsTm9kZUFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KWFkYXB0ZXIuZ2V0VGFyZ2V0KCkpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgIHhzZE1vZGVsQWRhcHRlciA9IFhTRE1vZGVsQWRhcHRlci5sb29rdXBPckNyZWF0ZU1vZGVsQWRhcHRlcihlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHhzZE1vZGVsQWRhcHRlciAhPSBudWxsICYmIHhzZE1vZGVsQWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgeHNkTW9kZWxBZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpLmFkZExpc3RlbmVyKGludGVybmFsTm9kZUFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vZGVsKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHN1cGVyLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgc2VsZWN0aW9uKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGlmIChnZXRDdXJyZW50VGFiKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmICh4c2RNb2RlbEFkYXB0ZXIgIT0gbnVsbCAmJiB4c2RNb2RlbEFkYXB0ZXIuZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB4c2RNb2RlbEFkYXB0ZXIuZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCkucmVtb3ZlTGlzdGVuZXIoaW50ZXJuYWxOb2RlQWRhcHRlcik7Ci0gICAgICB4c2RNb2RlbEFkYXB0ZXIgPSBudWxsOwotICAgIH0KLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGludGVybmFsTm9kZUFkYXB0ZXIgPSBuZXcgSW50ZXJuYWxOb2RlQWRhcHRlcigpOwotICBjbGFzcyBJbnRlcm5hbE5vZGVBZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyCi0gIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpCi0gICAgewotICAgICAgcmVmcmVzaCgpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTFlMTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlVHlwZVJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZVR5cGVSZWZlcmVuY2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLk5ld1R5cGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFCdWlsZGluZ1Rvb2xzOwotCi1wdWJsaWMgY2xhc3MgWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyIGltcGxlbWVudHMgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIsIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMgoteyAgCi0gIHByb3RlY3RlZCBJRmlsZSBjdXJyZW50RmlsZTsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYVtdIHNjaGVtYXM7Ci0gIHByaXZhdGUgc3RhdGljIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmVzdWx0W107Ci0gIHByaXZhdGUgSUFEVE9iamVjdCByZWZlcmVuY2VyOwotICAKLSAgcHVibGljIFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcihJRmlsZSBjdXJyZW50RmlsZSwgWFNEU2NoZW1hW10gc2NoZW1hcykKLSAgewotICAgIHRoaXMuY3VycmVudEZpbGUgPSBjdXJyZW50RmlsZTsKLSAgICB0aGlzLnNjaGVtYXMgPSBzY2hlbWFzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRUb0hpc3RvcnkoQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnQpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgaW1wbGVtZW50IG1lISAgICAKLSAgfQotICAKLSAgcHVibGljIElBRFRPYmplY3QgZ2V0UmVmZXJlbmNlcigpCi0gIHsKLSAgICByZXR1cm4gcmVmZXJlbmNlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlcihJQURUT2JqZWN0IHJlZmVyZW5jZXIpCi0gIHsKLSAgICB0aGlzLnJlZmVyZW5jZXIgPSByZWZlcmVuY2VyOwotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0QnJvd3NlRGlhbG9nKCkKLSAgewotICAgIC8vWFNEU2V0RXhpc3RpbmdUeXBlRGlhbG9nIGRpYWxvZyA9IG5ldyBYU0RTZXRFeGlzdGluZ1R5cGVEaWFsb2coY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgIC8vcmV0dXJuIGRpYWxvZzsKLSAgICBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUgZGlhbG9nRGVsZWdhdGUgPSBuZXcgWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlKFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZS5UWVBFX01FVEFfTkFNRSwgY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgIHJldHVybiBkaWFsb2dEZWxlZ2F0ZTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBnZXRDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gZ2V0SGlzdG9yeSgpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgaW1wbGVtZW50IHRoaXMgcHJvcGVybHkgLSBzaG91bGQgdGhpcyBoaXN0b3J5IGJlIGdsb2JhbCBvciBsb2NhbCB0byBlYWNoIGVkaXRvcj8KLSAgICAvLyBUaGlzIGlzIHNvbWV0aGluZyB3ZSBzaG91bGQgcGxheSBhcm91bmQgd2l0aCBvdXJzZWx2ZXMgdG8gc2VlIHdoYXQgZmVlbHMgcmlnaHQuCi0gICAgLy8KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXN1bHRbXSA9IG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0TmV3RGlhbG9nKCkKLSAgewotICAgIE5ld1R5cGVEaWFsb2cgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoc2NoZW1hcy5sZW5ndGggPiAwKSAKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgTmV3VHlwZURpYWxvZyhzY2hlbWFzWzBdKTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgTmV3VHlwZURpYWxvZygpOwotICAgIH0KLSAgICBpZiAocmVmZXJlbmNlciBpbnN0YW5jZW9mIElGaWVsZCkKLSAgICB7Ci0gICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKXJlZmVyZW5jZXI7Ci0gICAgICBpZiAoWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRy5lcXVhbHMoZmllbGQuZ2V0S2luZCgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFsbG93Q29tcGxleFR5cGUoZmFsc2UpOwotICAgICAgfQotICAgICAgU3RyaW5nIGZpZWxkTmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKLSAgICAgIGlmIChmaWVsZE5hbWUgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBmaWVsZE5hbWUgPSBmaWVsZE5hbWUudHJpbSgpOwotICAgICAgICBpZiAoZmllbGROYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgcmVzdWx0LnNldERlZmF1bHROYW1lKE5MUy5iaW5kKE1lc3NhZ2VzLl9VSV9WQUxVRV9ORVdfVFlQRSwgZmllbGROYW1lKSk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGdldFF1aWNrUGlja3MoKQotICB7Ci0gICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgIC8vIFRPRE8gKGNzKSBpbXBsZW1lbnQgdGhpcyBwcm9wZXJseSAtIHdlIHNob3VsZCBiZSBwcm92aWRpbmcgYSBsaXN0IG9mIHRoZSAKLSAgICAvLyBtb3N0ICdjb21tb24nIGJ1aWx0IGluIHNjaGVtYSB0eXBlcyBoZXJlCi0gICAgLy8gSSBiZWxpZXZlIFRydW5nIHdpbGwgYmUgd29ya2luZyBvbiBhIHBlcmZlcmVuY2UgcGFnZSB0byBnaXZlIHVzIHRoaXMgbGlzdAotICAgIC8vIGZvciBub3cgbGV0J3MgaGFyZCBjb2RlIHNvbWUgdmFsdWVzCi0gICAgLy8KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQobmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAiYm9vbGVhbiIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QuYWRkKG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgImRhdGUiLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJkYXRlVGltZSIsIG51bGwpKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJkb3VibGUiLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJmbG9hdCIsIG51bGwpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJoZXhCaW5hcnkiLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJpbnQiLCBudWxsKSk7ICAgICAvLyROT04tTkxTLTEkCi0gICAgbGlzdC5hZGQobmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAic3RyaW5nIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0gICAgbGlzdC5hZGQobmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAidGltZSIsIG51bGwpKTsgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICByZXN1bHQgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLQotICBwdWJsaWMgdm9pZCBtb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoT2JqZWN0IHJlZmVyZW5jaW5nT2JqZWN0LCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudCkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gbnVsbDsKLSAgICBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgIHsKLSAgICAgIEFkYXB0ZXIgYWRwYXRlciA9IChBZGFwdGVyKXJlZmVyZW5jaW5nT2JqZWN0OwotICAgICAgaWYgKGFkcGF0ZXIuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpYWRwYXRlci5nZXRUYXJnZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgfQotICAgIAotICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChjb21wb25lbnQuaXNOZXcoKSkKLSAgICAgIHsgIAotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IG51bGw7Ci0gICAgICAgIGlmIChjb21wb25lbnQuZ2V0TmFtZSgpID09IG51bGwgLy8gVGhpcyBtZWFucyB3ZSBzZXQgdG8gYW5vbnltb3VzIHR5cGUKLSAgICAgICAgCQkmJiBjb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBjb25jcmV0ZUNvbXBvbmVudDsKLSAgICAgICAgICAvLyBUT0RPIChjcykgd2Ugc2hvdWxkIHVzZSBhY3Rpb25zIGhlcmUgc28gdGhhdCBVTkRPL1JFRE8gY2FuIHdvcmsgbmljZWx5Ci0gICAgICAgICAgLy8gd2l0aCB0aGUgcHJvcGVyIHVuZG8gZGVzY3JpcHRpb25zCi0gICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuQ09NUExFWF9UWVBFX01FVEFfTkFNRSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSBmYWN0b3J5LmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAgICAgICAgICAgIAotCSAgCSAgICAgIGVsZW1lbnREZWNsYXJhdGlvbi5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbihjb21wbGV4VHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgIAkgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUgPSBmYWN0b3J5LmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIAkgIHNpbXBsZVR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKAotICAgICAgICAJICAgIGVsZW1lbnREZWNsYXJhdGlvbi5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAic3RyaW5nIikgKTsgLy8kTk9OLU5MUy0xJAotICAJICAJICAgIGVsZW1lbnREZWNsYXJhdGlvbi5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLSAgICAgICAgICB9Ci0JCSAgICAgIGVsZW1lbnREZWNsYXJhdGlvbi5nZXRFbGVtZW50KCkucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIik7IC8vVE9ETyB1c2UgZXh0ZXJuYWwgbGl0ZXJhbCBzdHJpbmcKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb21wb25lbnQuZ2V0TWV0YU5hbWUoKSA9PSBJWFNEU2VhcmNoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRV9NRVRBX05BTUUpCi0gICAgICAgIHsgIAotICAgICAgICAgIEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRSwgY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIHRkID0gY29tbWFuZC5nZXRDcmVhdGVkQ29tcGxleFR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEUsIGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICBjb21tYW5kLnNldE5hbWVUb0FkZChjb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgICB0ZCA9IGNvbW1hbmQuZ2V0Q3JlYXRlZFNpbXBsZVR5cGUoKTsKLSAgICAgICAgfSAgCi0gICAgICAgIGlmICh0ZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZVR5cGVSZWZlcmVuY2VDb21tYW5kKGNvbmNyZXRlQ29tcG9uZW50LCB0ZCk7Ci0gICAgICAgICAgY29tbWFuZC5zZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9UWVBFKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgIH0gIAotICAgICAgZWxzZQotICAgICAgeyAgCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVUeXBlUmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIGNvbXBvbmVudC5nZXROYW1lKCksIGNvbXBvbmVudC5nZXRRdWFsaWZpZXIoKSwgY29tcG9uZW50LmdldEZpbGUoKSk7Ci0gICAgICAgIGNvbW1hbmQuc2V0TGFiZWwoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfVFlQRSk7Ci0gICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgfSAgCi0gICAgfSAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9Eb3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0RvdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMGJiMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0RvdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR2VuZXJhdGVEdGQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0dlbmVyYXRlRHRkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1OGMxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR2VuZXJhdGVEdGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0dlbmVyYXRlSmF2YS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR2VuZXJhdGVKYXZhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3NWM2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR2VuZXJhdGVKYXZhLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9HcmFwaFZpZXdFbGVtZW50UmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9HcmFwaFZpZXdFbGVtZW50UmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzNWRhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR3JhcGhWaWV3RWxlbWVudFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvTmV3WFNELnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9OZXdYU0QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzRjYWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9OZXdYU0QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1JlZ2V4V2l6YXJkQXJyb3cuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1JlZ2V4V2l6YXJkQXJyb3cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDU1MGEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9SZWdleFdpemFyZEFycm93LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9UcmlhbmdsZVRvb2xCYXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1RyaWFuZ2xlVG9vbEJhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzdlYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1RyaWFuZ2xlVG9vbEJhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvVmFsaWRhdGVYU0QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1ZhbGlkYXRlWFNELmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzNDdhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvVmFsaWRhdGVYU0QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREFsbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3NGU4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbm5vdGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQW5ub3RhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjEwOGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbm5vdGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQW55LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzlmOTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREFueUF0dHJpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQW55QXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4MGNjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQW55QXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBcHBJbmZvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBcHBJbmZvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhMDAxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQXBwSW5mby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQ0OWQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREF0dHJpYnV0ZUdyb3VwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVHcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODQ2MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREF0dHJpYnV0ZUdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODlmYThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQXR0cmlidXRlUmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzY1YWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRENob2ljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliYTgyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RDb21wbGV4Q29udGVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ29tcGxleENvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWM2OGRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RDb21wbGV4Q29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRENvbXBsZXhUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3Zjg1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRERhdGVBbmRUaW1lVHlwZXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRERhdGVBbmRUaW1lVHlwZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0REYXRlQW5kVGltZVR5cGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0REb2MuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRERvYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDlhMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRERvYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERWxlbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDVmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREVsZW1lbnRSZWYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREVsZW1lbnRSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDlhY2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RFbGVtZW50UmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RFeHRlbnNpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREV4dGVuc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZmI4MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREV4dGVuc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERmllbGQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREZpZWxkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4ZTQzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERmllbGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTAwZjFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHbG9iYWxBdHRyaWJ1dGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDQ5ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNER2xvYmFsRWxlbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNER2xvYmFsRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDVmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdsb2JhbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdyb3VwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NWVmNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHcm91cFJlZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNER3JvdXBSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGE3ZmIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNESW1wb3J0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RJbXBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQ0Y2U1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RJbXBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREluY2x1ZGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREluY2x1ZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjZjNTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RJbmNsdWRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RLZXkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREtleS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDMyYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREtleS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNES2V5UmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RLZXlSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTU4MjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RLZXlSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRE5vdGF0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0ROb3RhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOWRmOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRE5vdGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0ROdW1iZXJUeXBlcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNETnVtYmVyVHlwZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTM0MjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0ROdW1iZXJUeXBlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEUmVkZWZpbmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFJlZGVmaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5NjRjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEUmVkZWZpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNlbGVjdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTZWxlY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOTlhNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNlbGVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTZXF1ZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmYzZjk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlQ29udGVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlQ29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZjM4ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZUNvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZUVudW0uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZUVudW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQ3OTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVFbnVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVMaXN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVMaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA4ZTc4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlTGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlUGF0dGVybi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlUGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTNjZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVJlc3RyaWN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVSZXN0cmljdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YmMxMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVJlc3RyaWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVUeXBlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMzNjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlVHlwZUZvckVkaXRQYXJ0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVUeXBlRm9yRWRpdFBhcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWVmZWIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVUeXBlRm9yRWRpdFBhcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVVuaW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVVbmlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MmFkYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVVuaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RVbmlxdWUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFVuaXF1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOGE2NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFVuaXF1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYXBwaW5mb19icm93c2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2FwcGluZm9fYnJvd3NlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmOWJhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYXBwaW5mb19icm93c2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2FwcGluZm9fY2F0ZWdvcnkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2FwcGluZm9fY2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTY2NWQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9hcHBpbmZvX2NhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9iYWNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkMWEyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYmFjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9icm93c2VidXR0b24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RhZTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9icm93c2VidXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2Vycm9yX3N0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvZXJyb3Jfc3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjNjA2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvZXJyb3Jfc3Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9mb3J3YXJkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9mb3J3YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiNjk5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvZ2VuZXJhdGVfeG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9nZW5lcmF0ZV94bWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmUzNjM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9nZW5lcmF0ZV94bWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3F1aWNrYXNzaXN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9xdWlja2Fzc2lzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YWUyYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3F1aWNrYXNzaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9yZWd4X3dpei5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvcmVneF93aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjE0NzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9yZWd4X3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvcmVsb2FkZ3JhbW1hci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvcmVsb2FkZ3JhbW1hci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MDVkYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3JlbG9hZGdyYW1tYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3NvcnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3NvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzY1ZGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9zb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy94bWxjYXRhbG9nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMveG1sY2F0YWxvZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjE0NDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy94bWxjYXRhbG9nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjkwNzcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotVUlfTEFCRUxfQkFTRV9UWVBFID0gQmFzZSBUeXBlOgotVUlfTEFCRUxfREVSSVZFRF9CWSA9IERlcml2ZWQgQnk6Ci0KLVVJX0xBQkVMX0lOSEVSSVRfRlJPTSA9IEluaGVyaXQgJkZyb206Ci1VSV9MQUJFTF9JTkhFUklUX0JZID0gSW5oZXJpdCAmQnk6Ci0KLVVJX0xBQkVMX0RPQ1VNRU5UQVRJT04gPSBEb2N1bWVudGF0aW9uCi1VSV9MQUJFTF9BUFBfSU5GTyA9IEFwcCBJbmZvCi0KLVVJX0xBQkVMX1NFVF9UWVBFID0gU2V0IFR5cGUKLVVJX0xBQkVMX1RZUEUgPSAmVHlwZToKLQotVUlfTEFCRUxfTkFNRSA9ICZOYW1lOgotCi1VSV9MQUJFTF9LSU5EID0gS2luZDoKLQotVUlfTEFCRUxfTUlOT0NDVVJTID0gJk1pbmltdW0gT2NjdXJyZW5jZToKLVVJX0xBQkVMX01BWE9DQ1VSUyA9IE1hJnhpbXVtIE9jY3VycmVuY2U6Ci0KLVVJX1BBR0VfSEVBRElOR19SRUZFUkVOQ0UgPSBSZWZlcmVuY2UKLVVJX0xBQkVMX1JFQURfT05MWSA9IHJlYWQtb25seQotCi1VSV9OT19UWVBFID0gTm8gVHlwZQotCi1VSV9MQUJFTF9DT01QT05FTlRTCQkJCT0gQ29tcG9uZW50czoKLQotISBBZGRpdGlvbmFsIENhdGVnb3JpZXMKLV9VSV9HUkFQSF9UWVBFUyAgICAgICAgICAgICAgICA9IFR5cGVzCi1fVUlfR1JBUEhfRUxFTUVOVFMgICAgICAgICAgICAgPSBFbGVtZW50cwotX1VJX0dSQVBIX0FUVFJJQlVURVMgICAgICAgICAgID0gQXR0cmlidXRlcwotX1VJX0dSQVBIX0FUVFJJQlVURV9HUk9VUFMgICAgID0gQXR0cmlidXRlIEdyb3VwcwotX1VJX0dSQVBIX05PVEFUSU9OUyAgICAgICAgICAgID0gTm90YXRpb25zCi1fVUlfR1JBUEhfSURFTlRJVFlfQ09OU1RSQUlOVFMgPSBJZGVudGl0eSBDb25zdHJhaW50cwotX1VJX0dSQVBIX0FOTk9UQVRJT05TICAgICAgICAgID0gQW5ub3RhdGlvbnMKLV9VSV9HUkFQSF9ESVJFQ1RJVkVTICAgICAgICAgICA9IERpcmVjdGl2ZXMKLV9VSV9HUkFQSF9HUk9VUFMgICAgICAgICAgICAgICA9IEdyb3VwcwotX1VJX0dSQVBIX1JFREVGSU5FX1NDSEVNQSAgICAgID0gUmVkZWZpbmUgU2NoZW1hCi1fVUlfR1JBUEhfUkVERUZJTkVfVFlQRVMgICAgICAgPSBUeXBlcwotX1VJX0dSQVBIX1JFREVGSU5FX0FUVFJJQlVURV9HUk9VUFMgID0gQXR0cmlidXRlIEdyb3VwcwotX1VJX0dSQVBIX1JFREVGSU5FX0dST1VQUyAgICAgID0gR3JvdXBzCi0KLV9VSV9MQUJFTF9OT19MT0NBVElPTl9TUEVDSUZJRUQgID0gTm8gTG9jYXRpb24gU3BlY2lmaWVkCi1fVUlfQUNUSU9OX1NFVF9NVUxUSVBMSUNJVFkJCSA9IFNldCAmTXVsdGlwbGljaXR5Ci1fVUlfTEFCRUxfQUJTRU5UICAgICAgICAgICAgICAgPSBhYnNlbnQKLV9VSV9HUkFQSF9VTktOT1dOX09CSkVDVCAgICAgICA9IFVua25vd24gb2JqZWN0Ci1fVUlfR1JBUEhfWFNEU0NIRU1BX05PX05BTUVTUEFDRSA9IChubyB0YXJnZXQgbmFtZXNwYWNlIHNwZWNpZmllZCkKLV9VSV9HUkFQSF9YU0RTQ0hFTUEgICAgICAgICAgICA9IFNjaGVtYQotX1VJX01FTlVfWFNEX0VESVRPUiAgICAgICAgICAgICAgICAgPSAmWFNECi1fVUlfTEFCRUxfU0VUX1RZUEUJCQkJICAgID0gU2V0IFR5cGUKLQotIQotISBQcmVmZXJlbmNlIFBhZ2UKLSEKLV9VSV9URVhUX0lOREVOVF9MQUJFTCAgICAgICAgICAgICAgICAgPSBJbmRlbnRhdGlvbgotX1VJX1RFWFRfSU5ERU5UX1NQQUNFU19MQUJFTCAgICAgICAgICA9ICZOdW1iZXIgb2Ygc3BhY2VzOiAKLV9VSV9URVhUX1hTRF9OQU1FU1BBQ0VfUFJFRklYICAgICAgICAgPSBDcmVhdGluZyBmaWxlcwotX1VJX1hNTF9URVhUX0VESVRPUl9QUkVGU19MSU5LCQkgID0gWE1MIFNjaGVtYSBlZGl0aW5nIHByZWZlcmVuY2VzLiBOb3RlIHRoYXQgc29tZSBwcmVmZXJlbmNlcyBtYXkgYmUgc2V0IG9uIHRoZSBYTUwgPGE+ezB9PC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi1fVUlfWE1MX1ZBTElEQVRPUl9QUkVGU19MSU5LCQkgID0gTm90ZSB0aGF0IHNvbWUgcHJlZmVyZW5jZXMgbWF5IGJlIHNldCBvbiB0aGUgWE1MIDxhPnswfTwvYT4gcHJlZmVyZW5jZSBwYWdlLgotX1VJX1RFWFRfWFNEX0RFRkFVTFRfUFJFRklYICAgICAgICAgICA9IFhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyAmcHJlZml4OgotX1VJX1FVQUxJRllfWFNEICAgICAgICAgICAgICAgICAgICAgICA9ICZRdWFsaWZ5IFhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cwotX1VJX1RFWFRfWFNEX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSA9IERlZmF1bHQgJnRhcmdldCBuYW1lc3BhY2U6Ci1fVUlfVkFMSURBVElOR19GSUxFUyAgICAgICAgICAgICAgICAgID0gVmFsaWRhdGluZyBmaWxlcwotX1VJX1RFWFRfSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TICA9IEhvbm91ciBhbGwgc2NoZW1hIGxvY2F0aW9ucwotX1VJX0ZVTExfQ09ORk9STUFOQ0UgICAgICAgICAgICAgICAgICA9ICZDaGVjayBmdWxsIFhNTCBTY2hlbWEgY29uZm9ybWFuY2UKLV9VSV9URVhUX0VOQUJMRV9BVVRPX0lNUE9SVF9DTEVBTlVQICAgPSAmQXV0b21hdGljYWxseSByZW1vdmUgdW51c2VkIFhTRCBpbXBvcnRzIGFuZCBYTUwgTmFtZXNwYWNlIGVudHJpZXMKLV9VSV9URVhUX0VOQUJMRV9BVVRPX09QRU5fU0NIRU1BX0RJQUxPRyA9ICZQcm9tcHQgZm9yIHNjaGVtYSBsb2NhdGlvbiB3aGVuIGFkZGluZyBhIGRpcmVjdGl2ZQotCi1fRVJST1JfTEFCRUxfSU5WQUxJRF9QUkVGSVggICAgID0gSVdBWDEwMDRFIEludmFsaWQgcHJlZml4LiBBIHByZWZpeCBtdXN0IG5vdCBiZSBlbXB0eSBvciBjb250YWluIGFueSBzcGFjZS4KLQotX1VJX05PX1RZUEVfREVGSU5FRD0obm8gdHlwZSBkZWZpbmVkKQotX1VJX0FDVElPTl9VUERBVEVfTkFNRT1VcGRhdGUgTmFtZQotX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0U9VXBkYXRlIEVsZW1lbnQgcmVmZXJlbmNlCi1fVUlfQUNUSU9OX1VQREFURV9BVFRSSUJVVEVfUkVGRVJFTkNFPVVwZGF0ZSBBdHRyaWJ1dGUgcmVmZXJlbmNlCi1fVUlfQUNUSU9OX0FERF9GSUVMRD1BZGQgRmllbGQKLV9VSV9BQ1RJT05fQUREX0VMRU1FTlQ9QWRkICZFbGVtZW50Ci1fVUlfQUNUSU9OX0lOU0VSVF9FTEVNRU5UPUkmbnNlcnQgRWxlbWVudAotX1VJX0FDVElPTl9CRUZPUkU9JkJlZm9yZQotX1VJX0FDVElPTl9BRlRFUj0mQWZ0ZXIKLV9VSV9BQ1RJT05fQUREX0lOQ0xVREU9QWRkIEluJmNsdWRlCi1fVUlfQUNUSU9OX0FERF9JTVBPUlQ9QWRkIEkmbXBvcnQKLV9VSV9BQ1RJT05fQUREX1JFREVGSU5FPUFkZCAmUmVkZWZpbmUKLV9VSV9BQ1RJT05fQUREX0VMRU1FTlRfUkVGPUFkZCBFJmxlbWVudCBSZWYKLV9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRT1BZGQgJkNvbXBsZXggVHlwZQotX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEU9QWRkICZTaW1wbGUgVHlwZQotX1VJX0FDVElPTl9TRVRfVFlQRT1TZXQgJlR5cGUKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURT1BZGQgJkF0dHJpYnV0ZQotX1VJX0FDVElPTl9JTlNFUlRfQVRUUklCVVRFPUkmbnNlcnQgQXR0cmlidXRlCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfUkVGPUFkZCBBdHRyaWJ1dGUgJlJlZgotX1VJX0FDVElPTl9ORVc9Jk5ldy4uLgotX1VJX0FDVElPTl9CUk9XU0U9JkJyb3dzZS4uLgotX1VJX0FDVElPTl9EUkFHX0RST1BfRUxFTUVOVD1SZW9yZGVyIEVsZW1lbnRzCi1fVUlfQUNUSU9OX0RSQUdfRFJPUF9BVFRSSUJVVEU9UmVvcmRlciBBdHRyaWJ1dGVzCi1fVUlfQUNUSU9OX1JFREVGSU5FX0NPTVBMRVhfVFlQRT1SZWRlZmluZSAmQ29tcGxleCBUeXBlCi1fVUlfQUNUSU9OX1JFREVGSU5FX1NJTVBMRV9UWVBFPVJlZGVmaW5lICZTaW1wbGUgVHlwZQotX1VJX0FDVElPTl9SRURFRklORV9BVFRSSUJVVEVfR1JPVVA9UmVkZWZpbmUgJkF0dHJpYnV0ZSBHcm91cAotX1VJX0FDVElPTl9SRURFRklORV9NT0RFTF9HUk9VUD1SZWRlZmluZSAmTW9kZWwgR3JvdXAKLV9VSV9BQ1RJT05fUkVOQU1FPVJlbmFtZQotCi1fVUlfTEFCRUxfT1BUSU9OQUw9T3B0aW9uYWwKLV9VSV9MQUJFTF9aRVJPX09SX01PUkU9WmVybyBvciBtb3JlCi1fVUlfTEFCRUxfT05FX09SX01PUkU9T25lIG9yIG1vcmUKLV9VSV9MQUJFTF9MT0NBTF9UWVBFPWxvY2FsIHR5cGUKLV9VSV9MQUJFTF9SRVFVSVJFRD1SZXF1aXJlZAotX1VJX0xBQkVMX0FSUkFZPWFycmF5Ci0KLV9VSV9MQUJFTF9TRVRfQ09NTU9OX0JVSUxUX0lOX1RZUEVTPVNldCBjb21tb24gQnVpbHQtSW4gdHlwZXMKLV9VSV9MQUJFTF9TRUxFQ1RfVFlQRVNfRklMVEVSX09VVD1TZWxlY3QgdGhlIHR5cGVzIHRoYXQgeW91IGRvIG5vdCB3YW50IHRvIGZpbHRlciBvdXQ6IAotX1VJX0xBQkVMX05BTUVfU0VBUkNIX0ZJTFRFUl9URVhUPU5hbWUgKD8gPSBhbnkgY2hhcmFjdGVyLCAqID0gYW55IHN0cmluZyk6Ci1fVUlfTEFCRUxfU0VUX0VMRU1FTlRfUkVGRVJFTkNFPVNldCBlbGVtZW50IHJlZmVyZW5jZQotX1VJX0xBQkVMX1NFVF9BVFRSSUJVVEVfUkVGRVJFTkNFPVNldCBhdHRyaWJ1dGUgcmVmZXJlbmNlCi1fVUlfTEFCRUxfUkVERUZJTkVfQ09NUE9ORU5UPVJlZGVmaW5lIGNvbXBvbmVudAotCi1fVUlfTEFCRUxfTkVXX1RZUEU9TmV3IFR5cGUKLV9VSV9WQUxVRV9ORVdfVFlQRT17MH1UeXBlCi1fVUlfTEFCRUxfTkVXX0VMRU1FTlQ9TmV3IEVsZW1lbnQKLV9VSV9MQUJFTF9ORVdfQVRUUklCVVRFPU5ldyBBdHRyaWJ1dGUKLV9VSV9MQUJFTF9DT01QTEVYX1RZUEU9JkNvbXBsZXggVHlwZQotX1VJX0xBQkVMX1RBUkdFVF9OQU1FU1BBQ0U9VGFyZ2V0IE5hbWVzcGFjZTogCi1fVUlfTEFCRUxfTk9fTkFNRVNQQUNFPU5vIE5hbWVzcGFjZQotX1VJX0xBQkVMX0VMRU1FTlRTX0NPTE9OPUVsZW1lbnRzOgotX1VJX0xBQkVMX0FUVFJJQlVURVNfQ09MT049QXR0cmlidXRlczoKLV9VSV9MQUJFTF9TSU1QTEVfVFlQRT0mU2ltcGxlIFR5cGUKLV9VSV9MQUJFTF9UWVBFU19DT0xPTj1UeXBlczoKLQotX1VJX0xBQkVMX1NPVVJDRT1Tb3VyY2UKLQotX1VJX0xBQkVMX0VMRU1FTlRGT1JNREVGQVVMVD1QcmVmaXggcXVhbGlmaWNhdGlvbiBvZiBsb2NhbCBlbGVtZW50czoKLV9VSV9MQUJFTF9BVFRSSUJVVEVGT1JNREVGQVVMVD1QcmVmaXggcXVhbGlmaWNhdGlvbiBvZiBhdHRyaWJ1dGVzOgotX1VJX0xBQkVMX0NSRUFURV9BTk9OX1RZUEU9Q3JlYXRlIGFzIGxvY2FsICZhbm9ueW1vdXMgdHlwZQotCi1fVUlfTEFCRUxfQVRUUklCVVRFU19QUk9DRVNTQ09OVEVOVFM9UHJvY2VzcyBDb250ZW50czoKLV9VSV9MQUJFTF9BVFRSSUJVVEVTX05BTUVTUEFDRT1OYW1lc3BhY2U6Ci0KLV9VSV9JTUFHRV9DT01QTEVYX1RZUEU9aWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmCi1fVUlfSU1BR0VfU0lNUExFX1RZUEU9aWNvbnMvWFNEU2ltcGxlVHlwZS5naWYKLV9VSV9JTUFHRV9NT0RFTF9HUk9VUD1pY29ucy9YU0RHcm91cC5naWYKLV9VSV9JTUFHRV9BVFRSSUJVVEVfR1JPVVA9aWNvbnMvWFNEQXR0cmlidXRlR3JvdXAuZ2lmCi0KLV9VSV9DT01CT19ORVc9TmV3Li4uCi1fVUlfQ09NQk9fQlJPV1NFPUJyb3dzZS4uLgotCi1fVUlfRVJST1JfSU5WQUxJRF9OQU1FPUludmFsaWQgbmFtZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvSVhTRFR5cGVzRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL0lYU0RUeXBlc0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTNjNjJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvSVhTRFR5cGVzRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoOwotCi1wdWJsaWMgaW50ZXJmYWNlIElYU0RUeXBlc0ZpbHRlciB7CQotCS8qKgotCSAqIEdpdmUgbWUgYW4gT2JqZWN0IG8sIGlmIEkga25vdyBpdCBhbmQgaXQgc2hvdWxkIGJlIGZpbHRlcmVkIG91dCwgSSB3aWxsIAotCSAqIHJldHVybiB0cnVlLiBPdGhlcndpc2UgSSdsbCByZXR1cm4gZmFsc2UsIGV2ZW4gaWYgSSBkb24ndCBrbm93IHRoZSBvYmplY3QgCi0JICogQHBhcmFtIG8KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkRmlsdGVyT3V0KE9iamVjdCBvKTsKLQkKLQlwdWJsaWMgdm9pZCB0dXJuT24oKTsKLQlwdWJsaWMgdm9pZCB0dXJuT2ZmKCk7Ci0JcHVibGljIGJvb2xlYW4gaXNPbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RBdHRyaWJ1dGVTZWFyY2hMaXN0UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEQXR0cmlidXRlU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NGZhMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RBdHRyaWJ1dGVTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RBdHRyaWJ1dGVTZWFyY2hMaXN0UHJvdmlkZXIgZXh0ZW5kcyBYU0RTZWFyY2hMaXN0UHJvdmlkZXIKLXsKLQotICBwdWJsaWMgWFNEQXR0cmlidXRlU2VhcmNoTGlzdFByb3ZpZGVyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgc3VwZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVDb21wb25lbnRMaXN0KElDb21wb25lbnRMaXN0IGxpc3QsIFNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKQotICB7Ci0gICAgLy8gbm93IHdlIHRyYXZlcnNlIHRoZSB0eXBlcyBhbHJlYWR5IGRlZmluZWQgd2l0aGluIHRoZSB2aXNpYmxlIHNjaGVtYXMKLSAgICAvLyB3ZSBkbyB0aGlzIGluIGFkZGl0aW9uIHRvIHRoZSBjb21wb25lbnQgc2VhcmNoIHNpbmNlIHRoaXMgc2hvdWxkIGV4ZWN1dGUKLSAgICAvLyB2ZXJ5IHF1aWNrbHkgYW5kIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSB0aGUgdXNlciB3YW50cyB0byBzZWxlY3QgYSB0aW1lIHRoYXQncyAKLSAgICAvLyBhbHJlYWR5IGltcG9ydGVkL2luY2x1ZGVkCi0gICAgLy8gVE9ETyAoY3MpIGVuc3VyZSB3ZSBkb24ndCBhZGQgZHVwbGljYXRlcyB3aGVuIHdlIHByb2NlZWQgdG8gdXNlIHRoZSBzZWFyY2ggbGlzdAotICAgIC8vCi0gICAgTGlzdCB2aXNpdGVkU2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IHNjaGVtYXNbaV07Ci0gICAgICBDb21wb25lbnRDb2xsZWN0aW5nWFNEVmlzaXRvciB2aXNpdG9yID0gbmV3IENvbXBvbmVudENvbGxlY3RpbmdYU0RWaXNpdG9yKGxpc3QsIElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRSk7Ci0gICAgICB2aXNpdG9yLnZpc2l0U2NoZW1hKHNjaGVtYSwgdHJ1ZSk7Ci0gICAgICB2aXNpdGVkU2NoZW1hcy5hZGRBbGwodmlzaXRvci5nZXRWaXNpdGVkU2NoZW1hcygpKTsKLSAgICB9Ci0gICAgLy8gZmluYWxseSB3ZSBjYWxsIHRoZSBzZWFyY2ggQVBJJ3MgdG8gZG8gYSBwb3RlbnRpYWxseSBzbG93IHNlYXJjaAotICAgIGlmIChzY29wZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHBvcHVsYXRlQ29tcG9uZW50TGlzdFVzaW5nU2VhcmNoKGxpc3QsIHNjb3BlLCBwbSwgY3JlYXRlRmlsZU1hcCh2aXNpdGVkU2NoZW1hcykpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbXBvbmVudExpc3RVc2luZ1NlYXJjaChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSwgSGFzaE1hcCBmaWxlcykKLSAgewotICAgIFNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgSW50ZXJuYWxTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEludGVybmFsU2VhcmNoUmVxdWVzdG9yKGxpc3QsIGZpbGVzKTsKLSAgICBmaW5kTWF0Y2hlcyhzZWFyY2hFbmdpbmUsIHJlcXVlc3Rvciwgc2NvcGUsIElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRSk7Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTRENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWNkMzI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNEQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcgotewotICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSBpZiB0aGlzIHByb3ZpZGVyIGlzIHVzZWQgaW4gYSBtdWx0aSBsYW5ndWFnZSBjb250ZXh0Ci0gICAgLy8gd2UnbGwgbmVlZCB0byBwcm92aWRlIHNvbWUgbG9naWMgaGVyZQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2UgU0lNUExFX1RZUEVfSU1BR0UgPSAgWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZSBDT01QTEVYX1RZUEVfSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRENvbXBsZXhUeXBlLmdpZiIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZSBFTEVNRU5UX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50LmdpZiIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZSBBVFRSSUJVVEVfSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREF0dHJpYnV0ZS5naWYiKTsKLSAgLy9wcml2YXRlIGZpbmFsIHN0YXRpYyBJbWFnZSBCVUlMVF9JTl9UWVBFKUlNQUdFID0gCi0gICAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVyKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgQ29tcG9uZW50U3BlY2lmaWNhdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKENvbXBvbmVudFNwZWNpZmljYXRpb24pY29tcG9uZW50KS5nZXRRdWFsaWZpZXIoKTsKLSAgICB9ICAKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKFhTRE5hbWVkQ29tcG9uZW50KWNvbXBvbmVudCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7IAotICAgIH0gIAotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFNlYXJjaE1hdGNoKQotICAgIHsKLSAgICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IGdldFF1YWxpZmllZE5hbWVGb3JTZWFyY2hNYXRjaCgoU2VhcmNoTWF0Y2gpY29tcG9uZW50KTsKLSAgICAgIGlmIChxdWFsaWZpZWROYW1lICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gcXVhbGlmaWVkTmFtZS5nZXROYW1lc3BhY2UoKTsKLSAgICAgIH0gICAgCi0gICAgfSAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgLy8gVE9ETy4uLiB0aGlzIHdpbGwgYmUgbXVjaCBlYXNpZXIgd2l0aCBIaXJvc2hpJ3MgcHJvcG9zZWQgU2VhcmNoTWF0Y2ggY2hhbmdlcwotICAvLwotICBwcml2YXRlIFF1YWxpZmllZE5hbWUgZ2V0UXVhbGlmaWVkTmFtZUZvclNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoIG1hdGNoKQotICB7Ci0gICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gbnVsbDsKLSAgICBPYmplY3QgbyA9IG1hdGNoLm1hcC5nZXQoIm5hbWUiKTsKLSAgICBpZiAobyAhPSBudWxsICYmIG8gaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lKQotICAgIHsgIAotICAgICAgcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKW87Ci0gICAgfSAgICAgIAotICAgIHJldHVybiBxdWFsaWZpZWROYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgQ29tcG9uZW50U3BlY2lmaWNhdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKENvbXBvbmVudFNwZWNpZmljYXRpb24pY29tcG9uZW50KS5nZXROYW1lKCk7Ci0gICAgfSAgCi0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gKChYU0ROYW1lZENvbXBvbmVudCljb21wb25lbnQpLmdldE5hbWUoKTsgCi0gICAgfSAgCi0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgU2VhcmNoTWF0Y2gpCi0gICAgewotICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gZ2V0UXVhbGlmaWVkTmFtZUZvclNlYXJjaE1hdGNoKChTZWFyY2hNYXRjaCljb21wb25lbnQpOwotICAgICAgaWYgKHF1YWxpZmllZE5hbWUgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSBxdWFsaWZpZWROYW1lLmdldExvY2FsTmFtZSgpOwotICAgICAgfSAgICAKLSAgICB9ICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBJRmlsZSBnZXRGaWxlKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBJRmlsZSByZXN1bHQgPSBudWxsOwotICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoQ29tcG9uZW50U3BlY2lmaWNhdGlvbiljb21wb25lbnQpLmdldEZpbGUoKTsKLSAgICB9ICAKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBTZWFyY2hNYXRjaCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKFNlYXJjaE1hdGNoKWNvbXBvbmVudCkuZ2V0RmlsZSgpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KWNvbXBvbmVudDsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKTsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETyAoY3MpIHJldmlzaXQgYW5kIHRlc3QgbW9yZQotICAgICAgICAvLwotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBzY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIHBsYXRmb3JtUmVzb3VyY2UgPSAicGxhdGZvcm06L3Jlc291cmNlIjsKLSAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgbG9jYXRpb24uc3RhcnRzV2l0aChwbGF0Zm9ybVJlc291cmNlKSkKLSAgICAgICAgewotICAgICAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uLnN1YnN0cmluZyhwbGF0Zm9ybVJlc291cmNlLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgcmVzdWx0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSAiIjsKLSAgICBTdHJpbmcgbmFtZSA9IGdldE5hbWUoZWxlbWVudCk7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgKz0gbmFtZTsKLSAgICAgIC8qCi0gICAgICBTdHJpbmcgcXVhbGlmaWVyID0gZ2V0UXVhbGlmaWVyKGVsZW1lbnQpOwotICAgICAgaWYgKHF1YWxpZmllciAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgKz0gIiAtICIgKyBxdWFsaWZpZXI7Ci0gICAgICB9ICAKLSAgICAgIElGaWxlIGZpbGUgPSBnZXRGaWxlKGVsZW1lbnQpOwotICAgICAgaWYgKGZpbGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgICgiICsgZmlsZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIikiOwotICAgICAgfSovIAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotICAKLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBJbWFnZSByZXN1bHQgPSBudWxsOyAKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgU2VhcmNoTWF0Y2gpCi0gICAgewotICAgICAgU2VhcmNoTWF0Y2ggc2VhcmNoTWF0Y2ggPSAoU2VhcmNoTWF0Y2gpY29tcG9uZW50OwotICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpc2VhcmNoTWF0Y2gubWFwLmdldCgibWV0YU5hbWUiKTsKLSAgICAgIGlmICggcXVhbGlmaWVkTmFtZSAhPSBudWxsICl7Ci0gICAgCSAgaWYgKCBxdWFsaWZpZWROYW1lLmVxdWFscyhJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRSkpCi0gICAgCQkgIHJlc3VsdCA9IFNJTVBMRV9UWVBFX0lNQUdFOwotICAgIAkgIGVsc2UgaWYgKCBxdWFsaWZpZWROYW1lLmVxdWFscyhJWFNEU2VhcmNoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRV9NRVRBX05BTUUpKQotICAgIAkJICByZXN1bHQgPSBDT01QTEVYX1RZUEVfSU1BR0U7Ci0gICAgCSAgZWxzZSBpZiAoIHF1YWxpZmllZE5hbWUuZXF1YWxzKElYU0RTZWFyY2hDb25zdGFudHMuRUxFTUVOVF9NRVRBX05BTUUpKQotICAgIAkJICByZXN1bHQgPSBFTEVNRU5UX0lNQUdFOwotICAgIAkgIGVsc2UgaWYgKCBxdWFsaWZpZWROYW1lLmVxdWFscyhJWFNEU2VhcmNoQ29uc3RhbnRzLkFUVFJJQlVURV9NRVRBX05BTUUpKQotICAgIAkgICAgcmVzdWx0ID0gQVRUUklCVVRFX0lNQUdFOwotICAgICAgfQotICAgIH0gICAgICAKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICByZXN1bHQgPSBDT01QTEVYX1RZUEVfSU1BR0U7ICAgICAgCi0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICByZXN1bHQgPSBTSU1QTEVfVFlQRV9JTUFHRTsKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICByZXN1bHQgPSBFTEVNRU5UX0lNQUdFOwotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgcmVzdWx0ID0gQVRUUklCVVRFX0lNQUdFOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0RmlsZUljb24oT2JqZWN0IGNvbXBvbmVudCkgewotCXJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREZpbGUuZ2lmIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNERWxlbWVudHNTZWFyY2hMaXN0UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNERWxlbWVudHNTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0MDQyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTREVsZW1lbnRzU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFbGVtZW50c1NlYXJjaExpc3RQcm92aWRlciBleHRlbmRzIFhTRFNlYXJjaExpc3RQcm92aWRlcgotewotICBwdWJsaWMgWFNERWxlbWVudHNTZWFyY2hMaXN0UHJvdmlkZXIoSUZpbGUgY3VycmVudEZpbGUsIFhTRFNjaGVtYVtdIHNjaGVtYXMpCi0gIHsKLSAgICBzdXBlcihjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUNvbXBvbmVudExpc3QoSUNvbXBvbmVudExpc3QgbGlzdCwgU2VhcmNoU2NvcGUgc2NvcGUsIElQcm9ncmVzc01vbml0b3IgcG0pCi0gIHsKLSAgICAvLyBub3cgd2UgdHJhdmVyc2UgdGhlIHR5cGVzIGFscmVhZHkgZGVmaW5lZCB3aXRoaW4gdGhlIHZpc2libGUgc2NoZW1hcwotICAgIC8vIHdlIGRvIHRoaXMgaW4gYWRkaXRpb24gdG8gdGhlIGNvbXBvbmVudCBzZWFyY2ggc2luY2UgdGhpcyBzaG91bGQgZXhlY3V0ZQotICAgIC8vIHZlcnkgcXVpY2tseSBhbmQgdGhlcmUncyBhIGdvb2QgY2hhbmNlIHRoZSB1c2VyIHdhbnRzIHRvIHNlbGVjdCBhIHRpbWUgdGhhdCdzIAotICAgIC8vIGFscmVhZHkgaW1wb3J0ZWQvaW5jbHVkZWQKLSAgICAvLyBUT0RPIChjcykgZW5zdXJlIHdlIGRvbid0IGFkZCBkdXBsaWNhdGVzIHdoZW4gd2UgcHJvY2VlZCB0byB1c2UgdGhlIHNlYXJjaCBsaXN0Ci0gICAgLy8KLSAgICBMaXN0IHZpc2l0ZWRTY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gc2NoZW1hc1tpXTsKLSAgICAgIENvbXBvbmVudENvbGxlY3RpbmdYU0RWaXNpdG9yIHZpc2l0b3IgPSBuZXcgQ29tcG9uZW50Q29sbGVjdGluZ1hTRFZpc2l0b3IobGlzdCwgSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRSk7Ci0gICAgICB2aXNpdG9yLnZpc2l0U2NoZW1hKHNjaGVtYSwgdHJ1ZSk7Ci0gICAgICB2aXNpdGVkU2NoZW1hcy5hZGRBbGwodmlzaXRvci5nZXRWaXNpdGVkU2NoZW1hcygpKTsKLSAgICB9Ci0gICAgLy8gZmluYWxseSB3ZSBjYWxsIHRoZSBzZWFyY2ggQVBJJ3MgdG8gZG8gYSBwb3RlbnRpYWxseSBzbG93IHNlYXJjaAotICAgIGlmIChzY29wZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHBvcHVsYXRlQ29tcG9uZW50TGlzdFVzaW5nU2VhcmNoKGxpc3QsIHNjb3BlLCBwbSwgY3JlYXRlRmlsZU1hcCh2aXNpdGVkU2NoZW1hcykpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbXBvbmVudExpc3RVc2luZ1NlYXJjaChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSwgSGFzaE1hcCBmaWxlcykKLSAgewotICAgIFNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgSW50ZXJuYWxTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEludGVybmFsU2VhcmNoUmVxdWVzdG9yKGxpc3QsIGZpbGVzKTsKLSAgICBmaW5kTWF0Y2hlcyhzZWFyY2hFbmdpbmUsIHJlcXVlc3Rvciwgc2NvcGUsIElYU0RTZWFyY2hDb25zdGFudHMuRUxFTUVOVF9NRVRBX05BTUUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2MmRhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlIGltcGxlbWVudHMgSUNvbXBvbmVudERpYWxvZwotewotICBwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgVFlQRV9NRVRBX05BTUUgPSBuZXcgUXVhbGlmaWVkTmFtZShYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIEVMRU1FTlRfTUVUQV9OQU1FID0gbmV3IFF1YWxpZmllZE5hbWUoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAiZWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBBVFRSSUJVVEVfTUVUQV9OQU1FID0gbmV3IFF1YWxpZmllZE5hbWUoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAiYXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLSAgLy8gcHJvdGVjdGVkIE9iamVjdCBzZXRPYmplY3Q7Ci0gIHByb3RlY3RlZCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNlbGVjdGlvbjsKLSAgcHJvdGVjdGVkIElGaWxlIGN1cnJlbnRGaWxlOwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hW10gc2NoZW1hczsKLSAgcHJvdGVjdGVkIFF1YWxpZmllZE5hbWUgbWV0YU5hbWU7Ci0gIHByb3RlY3RlZCBib29sZWFuIHNob3dDb21wbGV4VHlwZXMgPSB0cnVlOwotCi0gIHB1YmxpYyBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUoUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSwgSUZpbGUgY3VycmVudEZpbGUsIFhTRFNjaGVtYVtdIHNjaGVtYXMpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMubWV0YU5hbWUgPSBtZXRhTmFtZTsKLSAgICB0aGlzLmN1cnJlbnRGaWxlID0gY3VycmVudEZpbGU7Ci0gICAgdGhpcy5zY2hlbWFzID0gc2NoZW1hczsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNlbGVjdGVkQ29tcG9uZW50KCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbikKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIgICAKLSAgfQotICAKLSAgLyoqIAotICAgKiBXaGV0aGVyIHRvIHNob3cgY29tcGxleCB0eXBlcyBpbiB0aGUgRGlhbG9nJ3MgTGlzdCwgaGFzIG5vIGVmZmVjdCBpZiB0aGUKLSAgICogZGlhbG9nIHBvcHVsYXRlcyBsaXN0IG9mIGVsZW1lbnRzIGluc3RlYWQgb2YgdHlwZQotICAgKiBAcGFyYW0gdmFsdWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNob3dDb21wbGV4VHlwZXMoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHNob3dDb21wbGV4VHlwZXMgPSB2YWx1ZTsKLSAgfQotICAKLSAgcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkKLSAgewotICAgIFNoZWxsIHNoZWxsID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotICAgIGludCByZXR1cm5WYWx1ZSA9IFdpbmRvdy5DQU5DRUw7Ci0gICAgU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyBkaWFsb2cgPSBudWxsOwotICAgIAotICAgIC8vIFRPRE8gKGNzKSBsb3QncyBvZiBjb2RlIGlzIGNvbW1vbiB0byBib3RoIHRoZXNlIGJsb2Nrcy4gIENhbiB3ZSByZS1vcmcgaXQgYSBiaXQKLSAgICAvLyBzbyBpdCdzIGVhc2llciB0byBzZWUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBob3cgd2UgY29uZmlnIGZvciBhbiBlbGVtZW50IHZzIHR5cGU/Ci0gICAgaWYgKCBtZXRhTmFtZSA9PSBFTEVNRU5UX01FVEFfTkFNRSkKLSAgICB7Ci0gICAgCVhTRENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZGVzY3JpcHRpb25Qcm92aWRlciA9IG5ldyBYU0RDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyKCk7Ci0gICAgCWZpbmFsIFhTREVsZW1lbnRzU2VhcmNoTGlzdFByb3ZpZGVyIHNlYXJjaExpc3RQcm92aWRlciA9IG5ldyBYU0RFbGVtZW50c1NlYXJjaExpc3RQcm92aWRlcihjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gICAgCUNvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24oKTsKLSAgICAJCi0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RGVzY3JpcHRpb25Qcm92aWRlcihkZXNjcmlwdGlvblByb3ZpZGVyKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRTZWFyY2hMaXN0UHJvdmlkZXIoc2VhcmNoTGlzdFByb3ZpZGVyKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRGaWx0ZXJMYWJlbFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX05BTUVfU0VBUkNIX0ZJTFRFUl9URVhUKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRMaXN0TGFiZWxUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9FTEVNRU5UU19DT0xPTik7Ci0vLyAgICAgICAgY29uZmlndXJhdGlvbi5zZXROZXdDb21wb25lbnRIYW5kbGVyKG5ldyBOZXdFbGVtZW50QnV0dG9uSGFuZGxlcigpKTsKLSAgICAgICAgLy9UT0RPIGV4dGVybmFsaXplIHN0cmluZwotICAgICAgICBkaWFsb2cgPSBuZXcgU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyhzaGVsbCwgTWVzc2FnZXMuX1VJX0xBQkVMX1NFVF9FTEVNRU5UX1JFRkVSRU5DRSwgY29uZmlndXJhdGlvbik7ICAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAoIG1ldGFOYW1lID09IEFUVFJJQlVURV9NRVRBX05BTUUpCi0gICAgewotICAgICAgWFNEQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBkZXNjcmlwdGlvblByb3ZpZGVyID0gbmV3IFhTRENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIoKTsKLSAgICAgIGZpbmFsIFhTREF0dHJpYnV0ZVNlYXJjaExpc3RQcm92aWRlciBzZWFyY2hMaXN0UHJvdmlkZXIgPSBuZXcgWFNEQXR0cmlidXRlU2VhcmNoTGlzdFByb3ZpZGVyKGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgICAgIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgIAotICAgICAgICBjb25maWd1cmF0aW9uLnNldERlc2NyaXB0aW9uUHJvdmlkZXIoZGVzY3JpcHRpb25Qcm92aWRlcik7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0U2VhcmNoTGlzdFByb3ZpZGVyKHNlYXJjaExpc3RQcm92aWRlcik7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RmlsdGVyTGFiZWxUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FX1NFQVJDSF9GSUxURVJfVEVYVCk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0TGlzdExhYmVsVGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUklCVVRFU19DT0xPTik7Ci0gICAgICAgIGRpYWxvZyA9IG5ldyBTY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nKHNoZWxsLCBNZXNzYWdlcy5fVUlfTEFCRUxfU0VUX0FUVFJJQlVURV9SRUZFUkVOQ0UsIGNvbmZpZ3VyYXRpb24pOyAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKG1ldGFOYW1lID09IFRZUEVfTUVUQV9OQU1FKQotICAgIHsKLSAgICAgIFhTRENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZGVzY3JpcHRpb25Qcm92aWRlciA9IG5ldyBYU0RDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyKCk7Ci0gICAgICBmaW5hbCBYU0RUeXBlc1NlYXJjaExpc3RQcm92aWRlciBzZWFyY2hMaXN0UHJvdmlkZXIgPSBuZXcgWFNEVHlwZXNTZWFyY2hMaXN0UHJvdmlkZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgICAgaWYgKCFzaG93Q29tcGxleFR5cGVzKQotICAgICAgICBzZWFyY2hMaXN0UHJvdmlkZXIuc2hvd0NvbXBsZXhUeXBlcyhmYWxzZSk7Ci0gICAgIAotICAgICAgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbigpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXREZXNjcmlwdGlvblByb3ZpZGVyKGRlc2NyaXB0aW9uUHJvdmlkZXIpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXRTZWFyY2hMaXN0UHJvdmlkZXIoc2VhcmNoTGlzdFByb3ZpZGVyKTsKLS8vICAgICAgY29uZmlndXJhdGlvbi5zZXROZXdDb21wb25lbnRIYW5kbGVyKG5ldyBOZXdUeXBlQnV0dG9uSGFuZGxlcigpKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RmlsdGVyTGFiZWxUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FX1NFQVJDSF9GSUxURVJfVEVYVCk7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldExpc3RMYWJlbFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX1RZUEVTX0NPTE9OKTsKLSAgICAgIGRpYWxvZyA9IG5ldyBTY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nKHNoZWxsLCBNZXNzYWdlcy5fVUlfTEFCRUxfU0VUX1RZUEUsIGNvbmZpZ3VyYXRpb24pOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkaWFsb2cuc2V0Q3VycmVudFJlc291cmNlKGN1cnJlbnRGaWxlKTsgICAgICAKLSAgICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgIHJldHVyblZhbHVlID0gZGlhbG9nLm9wZW4oKTsKLSAgICAgIGlmIChyZXR1cm5WYWx1ZSA9PSBXaW5kb3cuT0spCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gIH0KLQotLy8gIHByaXZhdGUgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkKLS8vICB7Ci0vLyAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0vLyAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLS8vICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotLy8gICAgcmV0dXJuIGVkaXRvclBhcnQ7Ci0vLyAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RTZWFyY2hMaXN0UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTNmOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RTZWFyY2hMaXN0UHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWFbXSBzY2hlbWFzOwotICBwcm90ZWN0ZWQgSUZpbGUgY3VycmVudEZpbGU7Ci0gIC8vIFRPRE8gKGNzKSByZW1vdmUgdGhlc2UgYW5kIHVzZSBwcm9wZXIgc2VhcmNoIHNjb3BlcyEKLSAgLy8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DTE9TSU5HX1BST0pFQ1RfU0NPUEUgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJUkVfV09SS1NQQUNFX1NDT1BFID0gMTsKLQotICBwdWJsaWMgWFNEU2VhcmNoTGlzdFByb3ZpZGVyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgdGhpcy5zY2hlbWFzID0gc2NoZW1hczsKLSAgICB0aGlzLmN1cnJlbnRGaWxlID0gY3VycmVudEZpbGU7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVByb2plY3RbXSByZWZzID0gY3VycmVudEZpbGUuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotICAgICAgICAgICAgCi0gICAgICBmb3IgKGludCBpPTA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRlcCAiICsgcmVmc1tpXS5nZXROYW1lKCkpOwotICAgICAgfSAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0gCi0gICAgCi0gIH0KLSAgIAotICAKLSAgY2xhc3MgQ29tcG9uZW50Q29sbGVjdGluZ1hTRFZpc2l0b3IKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IHZpc2l0ZWRTY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIElDb21wb25lbnRMaXN0IGxpc3Q7Ci0gICAgUXVhbGlmaWVkTmFtZSBzZWFyY2hLaW5kOwotICAgIAotICAgIENvbXBvbmVudENvbGxlY3RpbmdYU0RWaXNpdG9yKElDb21wb25lbnRMaXN0IGxpc3QsIFF1YWxpZmllZE5hbWUgc2VhcmNoS2luZCkKLSAgICB7Ci0gICAgICB0aGlzLmxpc3QgPSBsaXN0OwotICAgICAgdGhpcy5zZWFyY2hLaW5kID0gc2VhcmNoS2luZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFNjaGVtYShmaW5hbCBYU0RTY2hlbWEgc2NoZW1hLCBib29sZWFuIHZpc2l0SW1wb3J0ZWRTY2hlbWEpCi0gICAgewotICAgICAgdmlzaXRlZFNjaGVtYXMuYWRkKHNjaGVtYSk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGNvbnRlbnRzID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgY29udGVudHMuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICAgIHsKLSAgICAgICAgICBmaW5hbCBYU0RTY2hlbWFEaXJlY3RpdmUgc2NoZW1hRGlyZWN0aXZlID0gKFhTRFNjaGVtYURpcmVjdGl2ZSkgY29udGVudDsKLSAgICAgICAgICBYU0RTY2hlbWEgZXh0U2NoZW1hID0gc2NoZW1hRGlyZWN0aXZlLmdldFJlc29sdmVkU2NoZW1hKCk7Ci0gICAgICAgICAgaWYgKGV4dFNjaGVtYSA9PSBudWxsICYmIHNjaGVtYURpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTREltcG9ydCAmJiB2aXNpdEltcG9ydGVkU2NoZW1hKSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGb3JjZSB0aGUgaW1wb3J0IGRlY2xhcmF0aW9uIHRvIHJlc29sdmUuIFRoZSB3b3JrIG11c3QgYmUgZG9uZSBpbiB0aGUgVUkgdGhyZWFkCi0gICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXJlIGFyZSBVSSBjb21wb25lbnRzIGxpc3RlbmluZyB0byBjaGFuZ2VzIGluIHRoZSBzY2hlbWEgY29udGVudC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgVUlKb2IgbG9hZEltcG9ydEpvYiA9IG5ldyBVSUpvYihYU0RFZGl0b3JQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9MQUJFTF9MT0FESU5HX1hNTF9TQ0hFTUEiKSkgLy8kTk9OLU5MUy0xJCAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIAotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHNjaGVtYSBtb2RlbCB3aWxsIGxvYWQgdGhlIGltcG9ydCB3aGVuIHRyeWluZyB0byByZXNvbHZlIGFueSBjb21wb25lbnQgCi0gICAgICAgICAgICAgICAgLy8gaW4gdGhlIGltcG9ydGVkIHNjaGVtYSdzIG5hbWVzcGFjZS4KLQotICAgICAgICAgICAgICAgIFhTREltcG9ydCB4c2RJbXBvcnQgPSAoWFNESW1wb3J0KXNjaGVtYURpcmVjdGl2ZTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW1wb3J0TmFtZXNwYWNlID0geHNkSW1wb3J0LmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgIHNjaGVtYS5yZXNvbHZlQXR0cmlidXRlRGVjbGFyYXRpb24oaW1wb3J0TmFtZXNwYWNlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGxvYWRJbXBvcnRKb2Iuc2V0U3lzdGVtKHRydWUpOwotICAgICAgICAgICAgbG9hZEltcG9ydEpvYi5zY2hlZHVsZSgpOwotICAgICAgICAgICAgdHJ5IAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsb2FkSW1wb3J0Sm9iLmpvaW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbyBhYm91dCBpdC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4dFNjaGVtYSA9IHNjaGVtYURpcmVjdGl2ZS5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoZXh0U2NoZW1hICE9IG51bGwgJiYgIXZpc2l0ZWRTY2hlbWFzLmNvbnRhaW5zKGV4dFNjaGVtYSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHNjaGVtYURpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTREltcG9ydCAmJiB2aXNpdEltcG9ydGVkU2NoZW1hKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB2aXNpdFNjaGVtYShleHRTY2hlbWEsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYURpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTREluY2x1ZGUgfHwgc2NoZW1hRGlyZWN0aXZlIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJdmlzaXRTY2hlbWEoZXh0U2NoZW1hLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gJiYgc2VhcmNoS2luZCA9PSBJWFNEU2VhcmNoQ29uc3RhbnRzLkVMRU1FTlRfTUVUQV9OQU1FKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoY29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uICYmIHNlYXJjaEtpbmQgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfTUVUQV9OQU1FKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoY29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uICYmIHNlYXJjaEtpbmQgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5TSU1QTEVfVFlQRV9NRVRBX05BTUUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2Ugb25seSB3YW50IHRvIHNob3cgc2ltcGxlIHR5cGVzCi0gICAgICAgICAgbGlzdC5hZGQoY29udGVudCk7ICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uICYmIHNlYXJjaEtpbmQgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5UWVBFX01FVEFfTkFNRSkKLSAgICAgICAgeyAgICAgCi0gICAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gc2hvdyBhbGwgdHlwZXMKLSAgICAgICAgICBsaXN0LmFkZChjb250ZW50KTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0VmlzaXRlZFNjaGVtYXMoKQotICAgIHsKLSAgICAgIHJldHVybiB2aXNpdGVkU2NoZW1hczsKLSAgICB9Ci0gIH0KLSAgIAotICAKLSAgY2xhc3MgSW50ZXJuYWxTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hSZXF1ZXN0b3IKLSAgewotICAgIElDb21wb25lbnRMaXN0IGNvbXBvbmVudExpc3Q7Ci0gICAgSGFzaE1hcCBmaWxlczsKLQotICAgIEludGVybmFsU2VhcmNoUmVxdWVzdG9yKElDb21wb25lbnRMaXN0IGNvbXBvbmVudExpc3QsIEhhc2hNYXAgZmlsZXMpCi0gICAgewotICAgICAgdGhpcy5jb21wb25lbnRMaXN0ID0gY29tcG9uZW50TGlzdDsKLSAgICAgIHRoaXMuZmlsZXMgPSBmaWxlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAvLyB3ZSBmaWx0ZXIgb3V0IHRoZSBtYXRjaGVzIGZyb20gdGhlIGN1cnJlbnQgZmlsZSBzaW5jZSB3ZSBhc3N1bWUgdGhlCi0gICAgICAvLyBpbmZvIGRlcml2ZWQgZnJvbSBvdXIgc2NoZW1hIG1vZGVscyBpcyBtb3JlIHVwZGF0ZSB0byBkYXRlCi0gICAgICAvLyAoaW4gdGhlIGV2ZW50IHRoYXQgd2UgaGF2ZW4ndCBzYXZlZCBvdXIgbGF0ZXN0IG1vZGlmaWNhdGlvbnMpCi0gICAgICAvLwotICAgICAgaWYgKGZpbGVzLmdldChtYXRjaC5nZXRGaWxlKCkpID09IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgLy8gVE9ETy4uLiB0aGlzIHVnbHkgcXVhbGlmaWVkIG5hbWUgc3Rhc2hpbmcgd2lsbCBnbyBhd2F5IHNvb24KLSAgICAgICAgLy8KLSAgICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IG8gPSBtYXRjaC5tYXAuZ2V0KCJuYW1lIik7Ci0gICAgICAgIGlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpCi0gICAgICAgIHsgIAotICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSlvOwotICAgICAgICB9IAotICAgICAgICBpZiAocXVhbGlmaWVkTmFtZSAhPSBudWxsICYmIHF1YWxpZmllZE5hbWUuZ2V0TG9jYWxOYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgY29tcG9uZW50TGlzdC5hZGQobWF0Y2gpOwotICAgICAgICB9Ci0gICAgICB9ICAKLSAgICB9Ci0gIH0gIAotCi0gIHByb3RlY3RlZCB2b2lkIGZpbmRNYXRjaGVzKFNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIFNlYXJjaFNjb3BlIHNjb3BlLCBRdWFsaWZpZWROYW1lIG1ldGFOYW1lKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuIHBhdHRlcm4gPSBuZXcgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKG5ldyBRdWFsaWZpZWROYW1lKCIqIiwgIioiKSwgbWV0YU5hbWUsIFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIKTsKLSAgICAgIC8vIFRPRE8gKGNzKSByZXZpc3QgdGhpcy4uLiB3ZSBzaG91bGRuJ3QgYmUgbmVlZGluZyB0byBoYXJkLWNvZGUgcGFydGlwYW50IGlkJ3MKLSAgICAgIC8vIEFsbCB3ZSdyZSByZWFsbHkgZG9pbmcgaGVyZSBpcyB0cnlpbmcgdG8gYXZvaWQgZmluZGluZyBtYXRjaGVzIGluCi0gICAgICAvLyB3c2RsJ3Mgc2luY2Ugd2UgZG9uJ3QgIGV2ZXIgd2FudCB0byBpbXBvcnQvaW5jbHVkZSBhIHdzZGwgZnJvbSBhIHNjaGVtYSEgCi0gICAgICAvLyBNYXliZSB3ZSBzaG91bGQganVzdCBzY29wZSBvdXQgYW55IGZpbGUgdHlwZXMgdGhhdCBhcmVuJ3QgeHNkJ3MgdXNpbmcgYSAKLSAgICAgIC8vIGN1c3RvbSBTZWFyY2hTY29wZT8KLSAgICAgIC8vCi0gICAgICBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNwYW50ID0gU2VhcmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZWFyY2hQYXJ0aWNpcGFudCgib3JnLmVjbGlwc2Uud3N0LnhzZC5zZWFyY2guWFNEU2VhcmNoUGFydGljaXBhbnQiKTsKLSAgICAgIEFzc2VydC5pc05vdE51bGwocGFydGljcGFudCk7Ci0gICAgICBTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9IHtwYXJ0aWNwYW50fTsKLSAgICAgIHNlYXJjaEVuZ2luZS5zZWFyY2gocGF0dGVybiwgcmVxdWVzdG9yLCBwYXJ0aWNpcGFudHMsIHNjb3BlLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotICAKLSAgCi0gIHByb3RlY3RlZCBIYXNoTWFwIGNyZWF0ZUZpbGVNYXAoTGlzdCB2aXNpdGVkU2NoZW1hcykKLSAgewotICAgIEhhc2hNYXAgZmlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gdmlzaXRlZFNjaGVtYXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgdGhlU2NoZW1hID0gKFhTRFNjaGVtYSlpLm5leHQoKTsKLSAgICAgIFN0cmluZyBsb2NhdGlvbiA9IHRoZVNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOyAgICAgICAKLSAgICAgIElGaWxlIGZpbGUgPSBjb21wdXRlRmlsZShsb2NhdGlvbik7Ci0gICAgICBpZiAoZmlsZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmaWxlTWFwLnB1dChmaWxlLCBCb29sZWFuLlRSVUUpOwotICAgICAgfSAgICAgICAKLSAgICB9ICAgCi0gICAgcmV0dXJuIGZpbGVNYXA7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSUZpbGUgY29tcHV0ZUZpbGUoU3RyaW5nIGJhc2VMb2NhdGlvbikKLSAgewotICAgIElGaWxlIGZpbGUgPSBudWxsOwotICAgIGlmIChiYXNlTG9jYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZmlsZVNjaGVtZSA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIFN0cmluZyBwbGF0Zm9ybVJlc291cmNlU2NoZW1lID0gInBsYXRmb3JtOi9yZXNvdXJjZSI7Ci0gICAgICBpZiAoYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgoZmlsZVNjaGVtZSkpCi0gICAgICB7Ci0gICAgICAgIGJhc2VMb2NhdGlvbiA9IGJhc2VMb2NhdGlvbi5zdWJzdHJpbmcoZmlsZVNjaGVtZS5sZW5ndGgoKSk7Ci0gICAgICAgIGJhc2VMb2NhdGlvbiA9IHJlbW92ZUxlYWRpbmcoYmFzZUxvY2F0aW9uLCAiLyIpOwotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLSAgICAgICAgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgocGxhdGZvcm1SZXNvdXJjZVNjaGVtZSkpCi0gICAgICB7Ci0gICAgICAgIGJhc2VMb2NhdGlvbiA9IGJhc2VMb2NhdGlvbi5zdWJzdHJpbmcocGxhdGZvcm1SZXNvdXJjZVNjaGVtZS5sZW5ndGgoKSk7Ci0gICAgICAgIGJhc2VMb2NhdGlvbiA9IHJlbW92ZUxlYWRpbmcoYmFzZUxvY2F0aW9uLCAiLyIpOwotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLSAgICAgICAgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgIH0gICAgCi0gICAgfQotICAgIHJldHVybiBmaWxlOyAgICAKLSAgfSAgCi0gIAotICBwcml2YXRlIFN0cmluZyByZW1vdmVMZWFkaW5nKFN0cmluZyBwYXRoLCBTdHJpbmcgcGF0dGVybikKLSAgewotICAgIHdoaWxlIChwYXRoLnN0YXJ0c1dpdGgocGF0dGVybikpCi0gICAgewotICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKHBhdHRlcm4ubGVuZ3RoKCkpOwotICAgIH0gIAotICAgIHJldHVybiBwYXRoOwotICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RUeXBlc1NlYXJjaExpc3RQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RUeXBlc1NlYXJjaExpc3RQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDgwZmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEVHlwZXNTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotcHVibGljIGNsYXNzIFhTRFR5cGVzU2VhcmNoTGlzdFByb3ZpZGVyIGV4dGVuZHMgWFNEU2VhcmNoTGlzdFByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBJWFNEVHlwZXNGaWx0ZXIgYnVpbHRJbkZpbHRlcjsKLSAgLyoqCi0gICAqIERldGVybWluZXMgaWYgd2Ugc2hvdWxkIHVzZSB0aGUgZmlsdGVyIFRoaXMgdXMgdXNlZCB0byB0dXJuIHRoZSBmaWx0ZXIgb24KLSAgICogYW5kIG9mZgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydEZpbHRlciA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBzaG93Q29tcGxleFR5cGVzID0gdHJ1ZTsKLQotICBwdWJsaWMgWFNEVHlwZXNTZWFyY2hMaXN0UHJvdmlkZXIoSUZpbGUgY3VycmVudEZpbGUsIFhTRFNjaGVtYVtdIHNjaGVtYXMpCi0gIHsKLSAgICBzdXBlcihjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUNvbXBvbmVudExpc3QoSUNvbXBvbmVudExpc3QgbGlzdCwgU2VhcmNoU2NvcGUgc2NvcGUsIElQcm9ncmVzc01vbml0b3IgcG0pCi0gIHsKLSAgICAvLyBmaXJzdCB3ZSBhZGQgdGhlICdidWlsdCBpbicgdHlwZXMKLSAgICAvLwotICAgIFhTRFNjaGVtYSBzY2hlbWFGb3JTY2hlbWEgPSBYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYShYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYUZvclNjaGVtYS5nZXRTaW1wbGVUeXBlSWRNYXAoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgaWYgKGJ1aWx0SW5GaWx0ZXIgPT0gbnVsbCB8fCAhYnVpbHRJbkZpbHRlci5zaG91bGRGaWx0ZXJPdXQodGQpKQotICAgICAgewotICAgICAgICBsaXN0LmFkZCh0ZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIG5vdyB3ZSB0cmF2ZXJzZSB0aGUgdHlwZXMgYWxyZWFkeSBkZWZpbmVkIHdpdGhpbiB0aGUgdmlzaWJsZSBzY2hlbWFzCi0gICAgLy8gd2UgZG8gdGhpcyBpbiBhZGRpdGlvbiB0byB0aGUgY29tcG9uZW50IHNlYXJjaCBzaW5jZSB0aGlzIHNob3VsZCBleGVjdXRlCi0gICAgLy8gdmVyeSBxdWlja2x5IGFuZCB0aGVyZSdzIGEgZ29vZCBjaGFuY2UgdGhlIHVzZXIgd2FudHMgdG8gc2VsZWN0IGEgdGltZQotICAgIC8vIHRoYXQncwotICAgIC8vIGFscmVhZHkgaW1wb3J0ZWQvaW5jbHVkZWQKLSAgICAvLyBUT0RPIChjcykgZW5zdXJlIHdlIGRvbid0IGFkZCBkdXBsaWNhdGVzIHdoZW4gd2UgcHJvY2VlZCB0byB1c2UgdGhlCi0gICAgLy8gc2VhcmNoIGxpc3QKLSAgICAvLwotICAgIExpc3QgdmlzaXRlZFNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBzY2hlbWFzW2ldOwotICAgICAgUXVhbGlmaWVkTmFtZSBraW5kID0gc2hvd0NvbXBsZXhUeXBlcyA/IElYU0RTZWFyY2hDb25zdGFudHMuVFlQRV9NRVRBX05BTUUgOiBJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRTsKLSAgICAgIENvbXBvbmVudENvbGxlY3RpbmdYU0RWaXNpdG9yIHZpc2l0b3IgPSBuZXcgQ29tcG9uZW50Q29sbGVjdGluZ1hTRFZpc2l0b3IobGlzdCwga2luZCk7Ci0gICAgICB2aXNpdG9yLnZpc2l0U2NoZW1hKHNjaGVtYSwgdHJ1ZSk7Ci0gICAgICB2aXNpdGVkU2NoZW1hcy5hZGRBbGwodmlzaXRvci5nZXRWaXNpdGVkU2NoZW1hcygpKTsKLSAgICB9Ci0gICAgLy8gZmluYWxseSB3ZSBjYWxsIHRoZSBzZWFyY2ggQVBJJ3MgdG8gZG8gYSBwb3RlbnRpYWxseSBzbG93IHNlYXJjaAotICAgIC8vICAgCi0gICAgaWYgKHNjb3BlICE9IG51bGwpCi0gICAgewotICAgICAgcG9wdWxhdGVDb21wb25lbnRMaXN0VXNpbmdTZWFyY2gobGlzdCwgc2NvcGUsIHBtLCBjcmVhdGVGaWxlTWFwKHZpc2l0ZWRTY2hlbWFzKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdFVzaW5nU2VhcmNoKElDb21wb25lbnRMaXN0IGxpc3QsIFNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtLCBIYXNoTWFwIGZpbGVzKQotICB7Ci0gICAgU2VhcmNoRW5naW5lIHNlYXJjaEVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTsKLSAgICBJbnRlcm5hbFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSW50ZXJuYWxTZWFyY2hSZXF1ZXN0b3IobGlzdCwgZmlsZXMpOwotICAgIGlmIChzaG93Q29tcGxleFR5cGVzKQotICAgIHsKLSAgICAgIGZpbmRNYXRjaGVzKHNlYXJjaEVuZ2luZSwgcmVxdWVzdG9yLCBzY29wZSwgSVhTRFNlYXJjaENvbnN0YW50cy5DT01QTEVYX1RZUEVfTUVUQV9OQU1FKTsKLSAgICB9Ci0gICAgZmluZE1hdGNoZXMoc2VhcmNoRW5naW5lLCByZXF1ZXN0b3IsIHNjb3BlLCBJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIF9wb3B1bGF0ZUNvbXBvbmVudExpc3RRdWljayhJQ29tcG9uZW50TGlzdCBsaXN0LCBJUHJvZ3Jlc3NNb25pdG9yIHBtKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0dXJuQnVpbHRJbkZpbHRlck9uKGJvb2xlYW4gb3B0aW9uKQotICB7Ci0gICAgc3VwcG9ydEZpbHRlciA9IG9wdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEJ1aWx0SW5GaWx0ZXIoSVhTRFR5cGVzRmlsdGVyIGZpbHRlcikKLSAgewotICAgIHRoaXMuYnVpbHRJbkZpbHRlciA9IGZpbHRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNob3dDb21wbGV4VHlwZXMoYm9vbGVhbiBzaG93KQotICB7Ci0gICAgc2hvd0NvbXBsZXhUeXBlcyA9IHNob3c7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25hdmlnYXRpb24vRGVzaWduVmlld05hdmlnYXRpb25Mb2NhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbmF2aWdhdGlvbi9EZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjU2YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbmF2aWdhdGlvbi9EZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubmF2aWdhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmF2aWdhdGlvbkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLk5hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBleGlzdHMgdG8gc3VwcG9ydCBuYXZpZ2F0aW9uIGluIGEgY29udGV4dCB3aGVyZSB0aGVyZSBpcyBubyB0ZXh0IAotICogZWRpdG9yIHBhZ2UuICBJbiB0aGVzZSBjYXNlcyB3ZSBjYW4ndCByZWx5IG9uIHRoZSBUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9ucwotICogc28gd2UgdGhpcyBjbGFzcyB3aGljaCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGgganVzdCB0aGUgZGVzaWduIHZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uIGV4dGVuZHMgTmF2aWdhdGlvbkxvY2F0aW9uCi17Ci0gIHByb3RlY3RlZCBQYXRoIHBhdGg7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfVEFHID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgRGVzaWduVmlld05hdmlnYXRpb25Mb2NhdGlvbihJRWRpdG9yUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgdGhpcy5wYXRoID0gbmV3IFBhdGgoKTsKLSAgfQotICAKLSAgcHVibGljIERlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb24oSUVkaXRvclBhcnQgcGFydCwgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgc3VwZXIocGFydCk7ICAgCi0gICAgdGhpcy5wYXRoID0gUGF0aC5jb21wdXRlUGF0aChjb21wb25lbnQpOyAgCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBtZXJnZUludG8oSU5hdmlnYXRpb25Mb2NhdGlvbiBjdXJyZW50TG9jYXRpb24pCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmIChjdXJyZW50TG9jYXRpb24gaW5zdGFuY2VvZiBEZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uKQotICAgIHsKLSAgICAgIERlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb24gbG9jID0gKERlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb24pIGN1cnJlbnRMb2NhdGlvbjsKLSAgICAgIHJlc3VsdCA9IGxvYy5wYXRoLnRvU3RyaW5nKCkuZXF1YWxzKHBhdGgudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZXN0b3JlTG9jYXRpb24oKQotICB7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGdldEVkaXRvclBhcnQoKS5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgT2JqZWN0IHZpZXdlciA9IGdldEVkaXRvclBhcnQoKS5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcyk7Ci0gICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpCi0gICAgewotICAgICAgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXIgPSAoRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcikgdmlld2VyOwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gUGF0aC5jb21wdXRlQ29tcG9uZW50KHNjaGVtYSwgcGF0aCk7Ci0gICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoY29tcG9uZW50KTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY2FsVmlld2VyLnNldElucHV0KChJQURUT2JqZWN0KWFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwYXRoLnNlZ21lbnRzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChzY2hlbWEpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljYWxWaWV3ZXIuc2V0SW5wdXQoKElBRFRPYmplY3QpYWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykKLSAgewotICAgIFN0cmluZyBzdHJpbmcgPSBtZW1lbnRvLmdldFN0cmluZyhQQVRIX1RBRyk7Ci0gICAgcGF0aCA9IFBhdGguY3JlYXRlUGF0aChzdHJpbmcpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pCi0gIHsKLSAgICBtZW1lbnRvLnB1dFN0cmluZyhQQVRIX1RBRywgcGF0aC50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVwZGF0ZSgpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgbm90IHN1cmUgd2hhdCBuZWVkcyB0byBiZSBkb25lIGhlcmUKLSAgfQotICBzdGF0aWMgY2xhc3MgUGF0aFNlZ21lbnQKLSAgewotICAgIGZpbmFsIHN0YXRpYyBpbnQgRUxFTUVOVCA9IDE7Ci0gICAgZmluYWwgc3RhdGljIGludCBUWVBFID0gMjsKLSAgICBmaW5hbCBzdGF0aWMgaW50IE1PREVMX0dST1VQID0gMzsKLSAgICBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURV9HUk9VUCA9IDQ7Ci0gICAgZmluYWwgc3RhdGljIGludCBSRURFRklORSA9IDU7Ci0gICAgaW50IGtpbmQ7Ci0gICAgU3RyaW5nIG5hbWU7Ci0KLSAgICBQYXRoU2VnbWVudCgpCi0gICAgewotICAgIH0KLQotICAgIFBhdGhTZWdtZW50KGludCBraW5kLCBTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICB0aGlzLmtpbmQgPSBraW5kOwotICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0gIH0KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBQYXRoCi0gIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVERUZJTkVfVE9LRU4gPSAicmVkZWZpbmUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX0dST1VQX1RPS0VOID0gIm1vZGVsR3JvdXAiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9HUk9VUF9UT0tFTiA9ICJhdHRyaWJ1dGVHcm91cCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9UT0tFTiA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RPS0VOID0gImVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBMaXN0IHNlZ21lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHVibGljIHN0YXRpYyBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wdXRlQ29tcG9uZW50KFhTRFNjaGVtYSBzY2hlbWEsIFBhdGggcGF0aCkKLSAgICB7Ci0gICAgICBQYXRoUmVzb2x2aW5nWFNEVmlzaXRvciB2aXNpdG9yID0gbmV3IFBhdGhSZXNvbHZpbmdYU0RWaXNpdG9yKHBhdGgpOwotICAgICAgdmlzaXRvci52aXNpdFNjaGVtYShzY2hlbWEpOwotICAgICAgaWYgKHZpc2l0b3IuaXNEb25lKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB2aXNpdG9yLnJlc3VsdDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHN0YXRpYyBQYXRoIGNyZWF0ZVBhdGgoU3RyaW5nIHBhdGhTdHJpbmcpCi0gICAgewotICAgICAgUGF0aCBwYXRoID0gbmV3IFBhdGgoKTsKLSAgICAgIFBhdGhTZWdtZW50IHNlZ21lbnQgPSBudWxsOwotICAgICAgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGhTdHJpbmcsICIvIik7IHN0Lmhhc01vcmVUb2tlbnMoKTspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgICBpbnQga2luZCA9IC0xOwotICAgICAgICBpZiAodG9rZW4uc3RhcnRzV2l0aChFTEVNRU5UX1RPS0VOKSkKLSAgICAgICAgewotICAgICAgICAgIGtpbmQgPSBQYXRoU2VnbWVudC5FTEVNRU5UOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRva2VuLnN0YXJ0c1dpdGgoVFlQRV9UT0tFTikpCi0gICAgICAgIHsKLSAgICAgICAgICBraW5kID0gUGF0aFNlZ21lbnQuVFlQRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0b2tlbi5zdGFydHNXaXRoKEFUVFJJQlVURV9HUk9VUF9UT0tFTikpCi0gICAgICAgIHsKLSAgICAgICAgCWtpbmQgPSBQYXRoU2VnbWVudC5BVFRSSUJVVEVfR1JPVVA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aChNT0RFTF9HUk9VUF9UT0tFTikpCi0gICAgICAgIHsKLSAgICAgICAgCWtpbmQgPSBQYXRoU2VnbWVudC5NT0RFTF9HUk9VUDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0b2tlbi5zdGFydHNXaXRoKFJFREVGSU5FX1RPS0VOKSkKLSAgICAgICAgewotICAgICAgICAJa2luZCA9IFBhdGhTZWdtZW50LlJFREVGSU5FOwotICAgICAgICB9Ci0gICAgICAgIGlmIChraW5kICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgc2VnbWVudCA9IG5ldyBQYXRoU2VnbWVudCgpOwotICAgICAgICAgIHNlZ21lbnQua2luZCA9IGtpbmQ7Ci0gICAgICAgICAgcGF0aC5zZWdtZW50cy5hZGQoc2VnbWVudCk7Ci0gICAgICAgICAgU3RyaW5nIG5hbWVQYXR0ZXJuID0gIltAbmFtZT0nIjsKLSAgICAgICAgICBpbnQgc3RhcnRJbmRleCA9IHRva2VuLmluZGV4T2YobmFtZVBhdHRlcm4pOwotICAgICAgICAgIGlmIChzdGFydEluZGV4ICE9IC0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN0YXJ0SW5kZXggKz0gbmFtZVBhdHRlcm4ubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpbnQgZW5kSW5kZXggPSB0b2tlbi5pbmRleE9mKCInXSIpOwotICAgICAgICAgICAgaWYgKGVuZEluZGV4ICE9IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZWdtZW50Lm5hbWUgPSB0b2tlbi5zdWJzdHJpbmcoc3RhcnRJbmRleCwgZW5kSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHBhdGg7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQYXRoIGNvbXB1dGVQYXRoKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aCgpOwotICAgICAgZm9yIChFT2JqZWN0IGMgPSBjb21wb25lbnQ7IGMgIT0gbnVsbDsgYyA9IGMuZUNvbnRhaW5lcigpKQotICAgICAgewotICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgUGF0aFNlZ21lbnQgc2VnbWVudCA9IGNvbXB1dGVQYXRoU2VnbWVudCgoWFNEQ29uY3JldGVDb21wb25lbnQpIGMpOwotICAgICAgICAgIGlmIChzZWdtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGF0aC5zZWdtZW50cy5hZGQoMCwgc2VnbWVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgUGF0aFNlZ21lbnQgY29tcHV0ZVBhdGhTZWdtZW50KFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgCVBhdGhTZWdtZW50IHBhdGhTZWdtZW50ID0gbnVsbDsKLSAgICAJaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAJewotICAgIAkJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGNvbXBvbmVudDsKLSAgICAJCXBhdGhTZWdtZW50ID0gbmV3IFBhdGhTZWdtZW50KFBhdGhTZWdtZW50LkVMRU1FTlQsIGVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7Ci0gICAgCX0KLSAgICAJZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgCXsKLSAgICAJCVhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gKFhTRFR5cGVEZWZpbml0aW9uKSBjb21wb25lbnQ7Ci0gICAgCQlwYXRoU2VnbWVudCA9IG5ldyBQYXRoU2VnbWVudChQYXRoU2VnbWVudC5UWVBFLCB0eXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpOwotICAgIAl9Ci0gICAgCWVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIAl7Ci0gICAgCQlYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmaW5pdGlvbiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgY29tcG9uZW50OwotICAgIAkJcGF0aFNlZ21lbnQgPSBuZXcgUGF0aFNlZ21lbnQoUGF0aFNlZ21lbnQuTU9ERUxfR1JPVVAsIG1vZGVsR3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSk7Ci0gICAgCX0KLSAgICAJZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgIAl7Ci0gICAgCQlYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgY29tcG9uZW50OwotICAgIAkJcGF0aFNlZ21lbnQgPSBuZXcgUGF0aFNlZ21lbnQoUGF0aFNlZ21lbnQuQVRUUklCVVRFX0dST1VQLCBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKS5nZXROYW1lKCkpOwotICAgIAl9Ci0gICAgCWVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgIAl7Ci0gICAgCQlYU0RSZWRlZmluZSByZWRlZmluZSA9IChYU0RSZWRlZmluZSkgY29tcG9uZW50OwotICAgIAkJcGF0aFNlZ21lbnQgPSBuZXcgUGF0aFNlZ21lbnQoUGF0aFNlZ21lbnQuUkVERUZJTkUsIHJlZGVmaW5lLmdldFNjaGVtYUxvY2F0aW9uKCkpOwotICAgIAl9Ci0gICAgCXJldHVybiBwYXRoU2VnbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNlZ21lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUGF0aFNlZ21lbnQgc2VnbWVudCA9IChQYXRoU2VnbWVudCkgaS5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBraW5kID0gIiI7Ci0gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgIGtpbmQgPSBFTEVNRU5UX1RPS0VOOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNlZ21lbnQua2luZCA9PSBQYXRoU2VnbWVudC5UWVBFKQotICAgICAgICB7Ci0gICAgICAgICAga2luZCA9IFRZUEVfVE9LRU47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50Lk1PREVMX0dST1VQKQotICAgICAgICB7Ci0gICAgICAgIAlraW5kID0gTU9ERUxfR1JPVVBfVE9LRU47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50LkFUVFJJQlVURV9HUk9VUCkKLSAgICAgICAgewotICAgICAgICAJa2luZCA9IEFUVFJJQlVURV9HUk9VUF9UT0tFTjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuUkVERUZJTkUpCi0gICAgICAgIHsKLSAgICAgICAgCWtpbmQgPSBSRURFRklORV9UT0tFTjsKLSAgICAgICAgfQotICAgICAgICBiLmFwcGVuZChraW5kKTsKLSAgICAgICAgaWYgKHNlZ21lbnQubmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYi5hcHBlbmQoIltAbmFtZT0nIiArIHNlZ21lbnQubmFtZSArICInXSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGIuYXBwZW5kKCIvIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotICAKLSAgc3RhdGljIGNsYXNzIFBhdGhSZXNvbHZpbmdYU0RWaXNpdG9yIGV4dGVuZHMgWFNEVmlzaXRvcgotICB7Ci0gICAgUGF0aCBwYXRoOwotICAgIGludCBpbmRleCA9IC0xOwotICAgIFBhdGhTZWdtZW50IHNlZ21lbnQ7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgcmVzdWx0ID0gbnVsbDsKLQotICAgIFBhdGhSZXNvbHZpbmdYU0RWaXNpdG9yKFBhdGggcGF0aCkKLSAgICB7Ci0gICAgICB0aGlzLnBhdGggPSBwYXRoOwotICAgICAgaW5jcmVtZW50U2VnbWVudCgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNEb25lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW5kZXggPj0gcGF0aC5zZWdtZW50cy5zaXplKCk7Ci0gICAgfQotCi0gICAgdm9pZCBpbmNyZW1lbnRTZWdtZW50KCkKLSAgICB7Ci0gICAgICBpbmRleCsrOwotICAgICAgaWYgKGluZGV4IDwgcGF0aC5zZWdtZW50cy5zaXplKCkpCi0gICAgICB7Ci0gICAgICAgIHNlZ21lbnQgPSAoUGF0aFNlZ21lbnQpIHBhdGguc2VnbWVudHMuZ2V0KGluZGV4KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2VnbWVudCA9IG51bGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgICB7Ci0gICAgICBpZiAoc2VnbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50LkVMRU1FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gc2NoZW1hLnJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24oc2VnbWVudC5uYW1lKTsKLSAgICAgICAgICBpZiAoZWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50LlRZUEUpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IHNjaGVtYS5yZXNvbHZlVHlwZURlZmluaXRpb24oc2VnbWVudC5uYW1lKTsKLSAgICAgICAgICBpZiAodHlwZURlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2aXNpdFR5cGVEZWZpbml0aW9uKHR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50Lk1PREVMX0dST1VQKQotICAgICAgICB7Ci0gICAgICAgIAlYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmaW5pdGlvbiA9IHNjaGVtYS5yZXNvbHZlTW9kZWxHcm91cERlZmluaXRpb24oc2VnbWVudC5uYW1lKTsKLSAgICAgICAgCWlmIChtb2RlbEdyb3VwRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgICAJewotICAgICAgICAJCXZpc2l0TW9kZWxHcm91cERlZmluaXRpb24obW9kZWxHcm91cERlZmluaXRpb24pOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNlZ21lbnQua2luZCA9PSBQYXRoU2VnbWVudC5BVFRSSUJVVEVfR1JPVVApCi0gICAgICAgIHsKLSAgICAgICAgCVhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSBzY2hlbWEucmVzb2x2ZUF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihzZWdtZW50Lm5hbWUpOwotICAgICAgICAJaWYgKGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgICAJewotICAgICAgICAJCXZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbik7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50LlJFREVGSU5FKQotICAgICAgICB7Ci0gICAgICAgIAlJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIAl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICAJewotICAgICAgICAJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIAkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgICAgICAJCXsgICAgICAgIAkJCQotICAgICAgICAJCQlYU0RSZWRlZmluZSByZWRlZmluZSA9IChYU0RSZWRlZmluZSlvYmplY3Q7Ci0gICAgICAgIAkJCXZpc2l0UmVkZWZpbmUocmVkZWZpbmUpOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKHNlZ21lbnQua2luZCA9PSBQYXRoU2VnbWVudC5FTEVNRU5UICYmIGlzTWF0Y2goc2VnbWVudC5uYW1lLCBuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgaW5jcmVtZW50U2VnbWVudCgpOwotICAgICAgICAgIGlmICghaXNEb25lKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3VwZXIudmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuVFlQRSAmJiBpc01hdGNoKHNlZ21lbnQubmFtZSwgbmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSB0eXBlOwotICAgICAgICAgIGluY3JlbWVudFNlZ21lbnQoKTsKLSAgICAgICAgICBpZiAoIWlzRG9uZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyLnZpc2l0VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cCkKLSAgICB7Ci0gICAgCWlmIChzZWdtZW50ICE9IG51bGwpCi0gICAgCXsKLSAgICAJCVN0cmluZyBuYW1lID0gbW9kZWxHcm91cC5nZXROYW1lKCk7Ci0gICAgCQlpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50Lk1PREVMX0dST1VQICYmIGlzTWF0Y2goc2VnbWVudC5uYW1lLCBuYW1lKSkKLSAgICAJCXsKLSAgICAJCQlyZXN1bHQgPSBtb2RlbEdyb3VwOwotICAgIAkJCWluY3JlbWVudFNlZ21lbnQoKTsKLSAgICAJCQlpZiAoIWlzRG9uZSgpKQotICAgIAkJCXsKLSAgICAJCQkJc3VwZXIudmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihtb2RlbEdyb3VwKTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXApCi0gICAgewotICAgIAlpZiAoc2VnbWVudCAhPSBudWxsKQotICAgIAl7Ci0gICAgCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZUdyb3VwLmdldE5hbWUoKTsKLSAgICAJCWlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuQVRUUklCVVRFX0dST1VQICYmIGlzTWF0Y2goc2VnbWVudC5uYW1lLCBuYW1lKSkKLSAgICAJCXsKLSAgICAJCQlyZXN1bHQgPSBhdHRyaWJ1dGVHcm91cDsKLSAgICAJCQlpbmNyZW1lbnRTZWdtZW50KCk7Ci0gICAgCQkJaWYgKCFpc0RvbmUoKSkKLSAgICAJCQl7Ci0gICAgCQkJCXN1cGVyLnZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJpYnV0ZUdyb3VwKTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRSZWRlZmluZShYU0RSZWRlZmluZSByZWRlZmluZSkKLSAgICB7Ci0gICAgCWlmIChzZWdtZW50ICE9IG51bGwpCi0gICAgCXsKLSAgICAJCVN0cmluZyBuYW1lID0gcmVkZWZpbmUuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAJCWlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuUkVERUZJTkUgJiYgaXNNYXRjaChzZWdtZW50Lm5hbWUsIG5hbWUpKQotICAgIAkJewotICAgIAkJCXJlc3VsdCA9IHJlZGVmaW5lOwotICAgIAkJCWluY3JlbWVudFNlZ21lbnQoKTsKLSAgICAJCQlpZiAoIWlzRG9uZSgpKQotICAgIAkJCXsKLSAgICAJCQkJdmlzaXRTY2hlbWEocmVkZWZpbmUuZ2V0U2NoZW1hKCkpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfQotICAgIAkKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXRjaChTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikKLSAgICB7Ci0gICAgICByZXR1cm4gbmFtZTEgIT0gbnVsbCA/IG5hbWUxLmVxdWFscyhuYW1lMikgOiBuYW1lMSA9PSBuYW1lMjsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uYXZpZ2F0aW9uL011bHRpUGFnZUVkaXRvclRleHRTZWxlY3Rpb25OYXZpZ2F0aW9uTG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25hdmlnYXRpb24vTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY2NTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25hdmlnYXRpb24vTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubmF2aWdhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uOwotCi0vKioKLSAqIFRoZSBwbGF0Zm9ybSdzIG5hdmlnYXRpb24gaGlzdG9yeSBwbHVtYmluZyBkb2Vzbid0IGxpa2UgbXVsdGlwYWdlIHRleHQKLSAqIGVkaXRvcnMgdmVyeSBtdWNoIGFuZCB0ZW5kcyB0byBpZ25vcmUgdGV4dCBsb2NhdGlvbnMuICBUbyBmaXggdGhpcwotICogcHJvYmxlbSB3ZSBuZWVkIHRvIG92ZXJyaWRlIHRoZSBnZXRFZGl0UGFydCgpIG1ldGhvZCBvZiB0aGUgc3VwZXIgY2xhc3MKLSAqIGluIG9yZGVyIHRvIHJldHVybiB0aGUgYWN0dWFsIFRleHRFZGl0b3Igb2Ygb3VyIG11bHRpLXBhZ2UgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aVBhZ2VFZGl0b3JUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uIGV4dGVuZHMgVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbgotewotICBwdWJsaWMgTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbihJVGV4dEVkaXRvciBwYXJ0LCBib29sZWFuIGluaXRpYWxpemUpCi0gIHsKLSAgICBzdXBlcihwYXJ0LCBpbml0aWFsaXplKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCkKLSAgewotICAgIElFZGl0b3JQYXJ0IHBhcnQgPSBzdXBlci5nZXRFZGl0b3JQYXJ0KCk7Ci0gICAgaWYgKHBhcnQgIT0gbnVsbCkKLSAgICAgIHJldHVybiAoSVRleHRFZGl0b3IpIHBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgLy8gSVNTVUU6IGhvdyB0byBnZXQgdGl0bGU/Ci0gICAgLy8gSUVkaXRvclBhcnQgcGFydCA9IGdldEVkaXRvclBhcnQoKTsKLSAgICAvLyBpZiAocGFydCBpbnN0YW5jZW9mIFdTRExUZXh0RWRpdG9yKSB7Ci0gICAgLy8gcmV0dXJuICgoV1NETFRleHRFZGl0b3IpIHBhcnQpLmdldFdTRExFZGl0b3IoKS5nZXRUaXRsZSgpOwotICAgIC8vIH0KLSAgICAvLyBlbHNlIHsKLSAgICAvLyByZXR1cm4gc3VwZXIuZ2V0VGV4dCgpOwotICAgIC8vIH0KLSAgICByZXR1cm4gc3VwZXIuZ2V0VGV4dCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbnNlZGl0L1NjaGVtYVByZWZpeENoYW5nZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlNzRhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlcgotewotICBTdHJpbmcgbmV3UHJlZml4OwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBTdHJpbmcgbmFtZXNwYWNlOwotCi0gIHB1YmxpYyBTY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuZXdQcmVmaXgpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLm5ld1ByZWZpeD0gbmV3UHJlZml4OwotICAgIG5hbWVzcGFjZSA9IFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMTsgCi0gIH0KLQotICBwdWJsaWMgU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlcihYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgbmV3UHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gICAgdGhpcy5uZXdQcmVmaXg9IG5ld1ByZWZpeDsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVzb2x2ZSgpCi0gIHsKLSAgICBYU0RTY2hlbWFQcmVmaXhSZW5hbWVyIHhzZFNjaGVtYVByZWZpeFJlbmFtZXIgPSBuZXcgWFNEU2NoZW1hUHJlZml4UmVuYW1lcigpOwotICAgIHhzZFNjaGVtYVByZWZpeFJlbmFtZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmV3UU5hbWUoWFNEVHlwZURlZmluaXRpb24gY29tcCwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgbmV3WFNEUHJlZml4KQotICB7Ci0gICAgU3RyaW5nIHFOYW1lID0gbnVsbDsKLSAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBxTmFtZSA9IG5ld1hTRFByZWZpeDsKLSAgICAgIGlmIChxTmFtZSAhPSBudWxsICYmIHFOYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgcU5hbWUgKz0gIjoiICsgdmFsdWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHFOYW1lID0gdmFsdWU7IAotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcU5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHFOYW1lOwotICB9Ci0KLSAgCi0gIGNsYXNzIFhTRFNjaGVtYVByZWZpeFJlbmFtZXIgZXh0ZW5kcyBYU0RWaXNpdG9yCi0gIHsKLSAgICBwdWJsaWMgWFNEU2NoZW1hUHJlZml4UmVuYW1lcigpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gICAgewotICAgICAgc3VwZXIudmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gZWxlbWVudC5nZXRUeXBlKCk7Ci0gICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbnMgPSB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsKLSAgICAgICAgaWYgKG5zLmVxdWFscyhuYW1lc3BhY2UpKSAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSBlbGVtZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgICBpZiAoZG9tRWxlbWVudCAhPSBudWxsICYmIGRvbUVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBdHRyIHR5cGVBdHRyID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBpZiAodHlwZUF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWxlbWVudC5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgZ2V0TmV3UU5hbWUodHlwZSwgdHlwZS5nZXROYW1lKCksIG5ld1ByZWZpeCkpOyAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUpCi0gICAgewotICAgICAgc3VwZXIudmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlID0gc2ltcGxlVHlwZS5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgIAotICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBucyA9IGJhc2VUeXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsKLSAgICAgICAgaWYgKG5zLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERE9NSGVscGVyIGRvbUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgICAgICBFbGVtZW50IGRlcml2ZWRCeSA9IGRvbUhlbHBlci5nZXREZXJpdmVkQnlFbGVtZW50KHNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICBpZiAoZGVyaXZlZEJ5ICE9IG51bGwgJiYgZGVyaXZlZEJ5IGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgQXR0ciB0eXBlQXR0ciA9IGRlcml2ZWRCeS5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBpZiAodHlwZUF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZGVyaXZlZEJ5LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUsIGdldE5ld1FOYW1lKGJhc2VUeXBlLCBiYXNlVHlwZS5nZXROYW1lKCksIG5ld1ByZWZpeCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBpdGVtVHlwZSA9IHNpbXBsZVR5cGUuZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoaXRlbVR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5zID0gaXRlbVR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGlmIChucyA9PSBudWxsKSBucyA9ICIiOwotICAgICAgICBpZiAobnMuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RET01IZWxwZXIgZG9tSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgICAgIE5vZGUgbGlzdE5vZGUgPSBkb21IZWxwZXIuZ2V0Q2hpbGROb2RlKHNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRyk7Ci0gICAgICAgICAgaWYgKGxpc3ROb2RlICE9IG51bGwgJiYgbGlzdE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoRWxlbWVudClsaXN0Tm9kZTsgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobGlzdEVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQXR0ciB0eXBlQXR0ciA9IGxpc3RFbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgIGlmICh0eXBlQXR0ciAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdEVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUsIGdldE5ld1FOYW1lKGl0ZW1UeXBlLCBpdGVtVHlwZS5nZXROYW1lKCksIG5ld1ByZWZpeCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIExpc3QgbWVtYmVyVHlwZXMgPSBzaW1wbGVUeXBlLmdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpOwotICAgICAgaWYgKG1lbWJlclR5cGVzLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIFhTRERPTUhlbHBlciBkb21IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICAgIE5vZGUgdW5pb25Ob2RlID0gZG9tSGVscGVyLmdldENoaWxkTm9kZShzaW1wbGVUeXBlLmdldEVsZW1lbnQoKSwgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgaWYgKHVuaW9uTm9kZSAhPSBudWxsICYmIHVuaW9uTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IHVuaW9uRWxlbWVudCA9IChFbGVtZW50KXVuaW9uTm9kZTsgICAgICAgICAgCi0gICAgICAgICAgaWYgKHVuaW9uRWxlbWVudCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWVtYmVyVHlwZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24paS5uZXh0KCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBucyA9IHN0LmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsKLSAgICAgICAgICAgICAgaWYgKG5zLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGdldE5ld1FOYW1lKHN0LCBzdC5nZXROYW1lKCksIG5ld1ByZWZpeCkpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc3QuZ2V0UU5hbWUoeHNkU2NoZW1hKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuaW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSwgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyKQotICAgIHsKLSAgICAgIHN1cGVyLnZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gYXR0ci5nZXRUeXBlKCk7Ci0gICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbnMgPSB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsKLSAgICAgICAgaWYgKG5zLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBkb21FbGVtZW50ID0gYXR0ci5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgaWYgKGRvbUVsZW1lbnQgIT0gbnVsbCAmJiBkb21FbGVtZW50IGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgQXR0ciB0eXBlQXR0ciA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpOwotICAgICAgICAgICAgaWYgKHR5cGVBdHRyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGF0dHIuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIGdldE5ld1FOYW1lKHR5cGUsIHR5cGUuZ2V0TmFtZSgpLCBuZXdQcmVmaXgpKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbnNlZGl0L1RhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2YzlkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotCi1wdWJsaWMgY2xhc3MgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcgotewotICBTdHJpbmcgbmV3TlM7Ci0gIFN0cmluZyBvbGROUzsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLQotICBwdWJsaWMgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcihYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgb2xkTlMsIFN0cmluZyBuZXdOUykKLSAgewotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICAgIHRoaXMub2xkTlM9IG9sZE5TOwotICAgIHRoaXMubmV3TlM9IG5ld05TOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZXNvbHZlKCkKLSAgewotICAgIEVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyIGVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyID0gbmV3IEVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyKCk7Ci0gICAgZWxlbWVudFJlZmVyZW5jZVJlbmFtZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICBBdHRyaWJ1dGVSZWZlcmVuY2VSZW5hbWVyIGF0dHJpYnV0ZVJlZmVyZW5jZVJlbmFtZXIgPSBuZXcgQXR0cmlidXRlUmVmZXJlbmNlUmVuYW1lcigpOwotICAgIGF0dHJpYnV0ZVJlZmVyZW5jZVJlbmFtZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgfQotCi0gIGNsYXNzIEVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyIGV4dGVuZHMgWFNEVmlzaXRvcgotICB7Ci0gICAgcHVibGljIEVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyKCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgICB7Ci0gICAgICBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIGlmIChlbGVtZW50LmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICB7Ci0gICAgICAJaWYgKGVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgCXsKLSAgICAgIAkgIGlmIChlbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKG9sZE5TKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBzZXQgdGhlIHJlc29sdmVkIGVsZW1lbnQncyBkZWNsYXJhdGlvbiB0byBuZXcgbnMKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgZGVmZWN0IDIzNzUxOCAtIHRhcmdldCBuYW1lc3BhY2UgcmVuYW1lIGNyZWF0ZXMgYSBuZXcgbmFtZXNwYWNlCi0gICAgICAgICAgICBlbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuc2V0VGFyZ2V0TmFtZXNwYWNlKG5ld05TKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAlpZiAob2xkTlMgPT0gbnVsbCB8fCAob2xkTlMgIT0gbnVsbCAmJiBvbGROUy5lcXVhbHMoIiIpKSkKLSAgICAgICAgCXsKLQkJCQkJCWVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5zZXRUYXJnZXROYW1lc3BhY2UobmV3TlMpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBTaW1pbGFyIHRvIGRlZmVjdCAyMzc1MTggYnV0IGZvciBhdHRyaWJ1dGVzCi0gIGNsYXNzIEF0dHJpYnV0ZVJlZmVyZW5jZVJlbmFtZXIgZXh0ZW5kcyBYU0RWaXNpdG9yCi0gIHsKLSAgICBwdWJsaWMgQXR0cmlidXRlUmVmZXJlbmNlUmVuYW1lcigpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gICAgewotICAgICAgc3VwZXIudmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgICBpZiAodHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpIGF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IGF0dHJVc2UuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoYXR0ckRlY2wgIT0gbnVsbCAmJiBhdHRyRGVjbC5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB7Ci0JCQkJCQkJaWYgKGF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotCQkJCQkJCXsKLSAgICAgICAgICAgICAgICBpZiAoYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhvbGROUykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLnNldFRhcmdldE5hbWVzcGFjZShuZXdOUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotCQkJCQkJCQlpZiAob2xkTlMgPT0gbnVsbCB8fCAob2xkTlMgIT0gbnVsbCAmJiBvbGROUy5lcXVhbHMoIiIpKSkKLQkJCQkJCQkJewotCQkJCQkJCQkJYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLnNldFRhcmdldE5hbWVzcGFjZShuZXdOUyk7Ci0JCQkJCQkJCX0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwKQotICAgIHsKLSAgICAgIHN1cGVyLnZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJpYnV0ZUdyb3VwKTsKLSAgICAgIEVMaXN0IGxpc3QgPSBhdHRyaWJ1dGVHcm91cC5nZXRBdHRyaWJ1dGVVc2VzKCk7Ci0gICAgICBpZiAobGlzdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBhdHRyVXNlLmdldENvbnRlbnQoKTsKLQotICAgICAgICAgIGlmIChhdHRyRGVjbCAhPSBudWxsICYmIGF0dHJEZWNsLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICB7Ci0JCQkJCQlpZiAoYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpCi0JCQkJCQl7Ci0gICAgICAgICAgICAgIGlmIChhdHRyRGVjbC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKG9sZE5TKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5zZXRUYXJnZXROYW1lc3BhY2UobmV3TlMpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0JCQkJCQkJaWYgKG9sZE5TID09IG51bGwgfHwgKG9sZE5TICE9IG51bGwgJiYgb2xkTlMuZXF1YWxzKCIiKSkpCi0JCQkJCQkJewotCQkJCQkJCQlhdHRyRGVjbC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuc2V0VGFyZ2V0TmFtZXNwYWNlKG5ld05TKTsKLQkJCQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvWFNEVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbnNlZGl0L1hTRFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1NTExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvWFNEVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETm90YXRpb25EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi1wdWJsaWMgY2xhc3MgWFNEVmlzaXRvcgotewotICBwdWJsaWMgWFNEVmlzaXRvcigpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdFR5cGVEZWZpbml0aW9uKHR5cGUpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRlbnRpdHlDb25zdHJhaW50ID0gKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbihpZGVudGl0eUNvbnN0cmFpbnQpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihtb2RlbEdyb3VwKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyaWJ1dGVHcm91cCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0Tm90YXRpb25EZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRE5vdGF0aW9uRGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0ROb3RhdGlvbkRlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdE5vdGF0aW9uRGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbil0eXBlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbigoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXR5cGUpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRUeXBlRGVmaW5pdGlvbihlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRlbnRpdHlDb25zdHJhaW50KQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZikKLSAgewotICAgIGlmICghbW9kZWxHcm91cERlZi5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgaWYgKG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwRGVmLmdldE1vZGVsR3JvdXAoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXApCi0gIHsKLSAgICBpZiAoYXR0cmlidXRlR3JvdXAuZ2V0QXR0cmlidXRlVXNlcygpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlR3JvdXAuZ2V0QXR0cmlidXRlVXNlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlID0gKFhTREF0dHJpYnV0ZVVzZSlpdGVyLm5leHQoKTsKLSAgICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyVXNlLmdldENvbnRlbnQoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE5vdGF0aW9uRGVjbGFyYXRpb24oWFNETm90YXRpb25EZWNsYXJhdGlvbiBub3RhdGlvbikKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29tcGxleENvbnRlbnQgPSB0eXBlLmdldENvbnRlbnQoKTsKLSAgICBpZiAoY29tcGxleENvbnRlbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoY29tcGxleENvbnRlbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pY29tcGxleENvbnRlbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcGxleENvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRQYXJ0aWNsZSgoWFNEUGFydGljbGUpIGNvbXBsZXhDb250ZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0ckdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpaXRlci5uZXh0KCk7Ci0gICAgICAgIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJVc2UgPSAoWFNEQXR0cmlidXRlVXNlKWF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyVXNlLmdldENvbnRlbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pYXR0ckdyb3VwQ29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGUoWFNEUGFydGljbGUgcGFydGljbGUpCi0gIHsKLSAgICB2aXNpdFBhcnRpY2xlQ29udGVudChwYXJ0aWNsZS5nZXRDb250ZW50KCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFBhcnRpY2xlQ29udGVudChYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50KQotICB7Ci0gICAgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIHZpc2l0TW9kZWxHcm91cCgoWFNETW9kZWxHcm91cClwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICB7Ci0gICAgICB2aXNpdFdpbGRjYXJkKChYU0RXaWxkY2FyZClwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgewotICAgIGlmIChtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIHZpc2l0UGFydGljbGUocGFydGljbGUpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRXaWxkY2FyZChYU0RXaWxkY2FyZCB3aWxkY2FyZCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNERWRpdG9yUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2ZmZlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlTGlua0FyZWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0b3JQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FRElUT1JfUFJFRkVSRU5DRV9QQUdFX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotICBwcml2YXRlIEJ1dHRvbiByZW1vdmVVbnVzZWRJbXBvcnRzOwotCi0gIHByaXZhdGUgQnV0dG9uIGF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2c7Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLSAgICBJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHBhcmVudCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RQX0VESVRPUl9QUkVGRVJFTkNFX1BBR0UpOwotCi0gICAgbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5XUkFQIHwgU1dULk1VTFRJLCBYTUxfRURJVE9SX1BSRUZFUkVOQ0VfUEFHRV9JRCwgTWVzc2FnZXMuX1VJX1hNTF9URVhUX0VESVRPUl9QUkVGU19MSU5LLAotICAgICAgKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKWdldENvbnRhaW5lcigpLCBudWxsKS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0gICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LnN3dERlZmF1bHRzKCkuY3JlYXRlKCkpOwotCi0gICAgY3JlYXRlQ29udGVudHNGb3JJbXBvcnRDbGVhbnVwKGNvbXBvc2l0ZSk7Ci0KLSAgICBzZXRTaXplKGNvbXBvc2l0ZSk7Ci0gICAgbG9hZFByZWZlcmVuY2VzKCk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGdldFJlbW92ZUltcG9ydFNldHRpbmcoKQotICB7Ci0gICAgcmV0dXJuIHJlbW92ZVVudXNlZEltcG9ydHMuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZ2V0QXV0b21hdGljYWxseU9wZW5TY2hlbWFMb2NhdGlvbkRpYWxvZ1NldHRpbmcoKQotICB7Ci0gICAgcmV0dXJuIGF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2cuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkKLSAgewotICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICByZW1vdmVVbnVzZWRJbXBvcnRzLnNldFNlbGVjdGlvbihzdG9yZS5nZXRCb29sZWFuKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfSU1QT1JUX0NMRUFOVVApKTsKLSAgICBhdXRvbWF0aWNhbGx5T3BlblNjaGVtYUxvY2F0aW9uRGlhbG9nLnNldFNlbGVjdGlvbihzdG9yZS5nZXRCb29sZWFuKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfQVVUT19PUEVOX1NDSEVNQV9MT0NBVElPTl9ESUFMT0cpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpCi0gIHsKLSAgICBJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VTdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgIHJlbW92ZVVudXNlZEltcG9ydHMuc2V0U2VsZWN0aW9uKHByZWZlcmVuY2VTdG9yZS5nZXREZWZhdWx0Qm9vbGVhbihYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0lNUE9SVF9DTEVBTlVQKSk7Ci0gICAgYXV0b21hdGljYWxseU9wZW5TY2hlbWFMb2NhdGlvbkRpYWxvZy5zZXRTZWxlY3Rpb24ocHJlZmVyZW5jZVN0b3JlLmdldERlZmF1bHRCb29sZWFuKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfQVVUT19PUEVOX1NDSEVNQV9MT0NBVElPTl9ESUFMT0cpKTsKLSAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkKLSAgewotICAgIHNhdmVWYWx1ZXNGb3JJbXBvcnRzQ2xlYW51cCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNhdmVWYWx1ZXNGb3JJbXBvcnRzQ2xlYW51cCgpCi0gIHsKLSAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLSAgICBzdG9yZS5zZXRWYWx1ZShYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0lNUE9SVF9DTEVBTlVQLCBnZXRSZW1vdmVJbXBvcnRTZXR0aW5nKCkpOwotICAgIHN0b3JlLnNldFZhbHVlKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfQVVUT19PUEVOX1NDSEVNQV9MT0NBVElPTl9ESUFMT0csIGdldEF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2dTZXR0aW5nKCkpOwotICB9Ci0KLSAgLyoqIAotICAgKiBUaGUgaW5kZW50IGlzIHN0b3JlZCBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhc3NvY2lhdGVkIHdpdGggdGhlIFhNTCBTY2hlbWEgTW9kZWwKLSAgICovCi0gIHB1YmxpYyBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpCi0gIHsKLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9ySW1wb3J0Q2xlYW51cChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgR3JvdXAgdW51c2VkSW1wb3J0R3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDEpOwotICAgIHVudXNlZEltcG9ydEdyb3VwLnNldFRleHQoTWVzc2FnZXMuX1VJX0dSQVBIX0RJUkVDVElWRVMpOwotCi0gICAgLy9HcmlkRGF0YQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCi0gICAgaWYgKHJlbW92ZVVudXNlZEltcG9ydHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZW1vdmVVbnVzZWRJbXBvcnRzID0gbmV3IEJ1dHRvbih1bnVzZWRJbXBvcnRHcm91cCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotICAgICAgcmVtb3ZlVW51c2VkSW1wb3J0cy5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9URVhUX0VOQUJMRV9BVVRPX0lNUE9SVF9DTEVBTlVQKTsKLSAgICAgIHJlbW92ZVVudXNlZEltcG9ydHMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZW1vdmVVbnVzZWRJbXBvcnRzLCBYU0RFZGl0b3JDU0hlbHBJZHMuWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX0lNUE9SVF9DTEVBTlVQKTsKLQotICAgICAgYXV0b21hdGljYWxseU9wZW5TY2hlbWFMb2NhdGlvbkRpYWxvZyA9IG5ldyBCdXR0b24odW51c2VkSW1wb3J0R3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLSAgICAgIGF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2cuc2V0VGV4dChNZXNzYWdlcy5fVUlfVEVYVF9FTkFCTEVfQVVUT19PUEVOX1NDSEVNQV9ESUFMT0cpOwotICAgICAgYXV0b21hdGljYWxseU9wZW5TY2hlbWFMb2NhdGlvbkRpYWxvZy5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5jb3B5RGF0YShkYXRhKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkKLSAgewotICAgIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7IC8vIG1vZGVsCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQotICAgIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzg0MTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotRGF2aWQgQ2FydmVyLCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwsIGJ1ZyAxMTQ3MDMzICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotCi1wdWJsaWMgY2xhc3MgWFNEUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgTGlzdGVuZXIgCi17Ci0gIFRleHQgaW5kZW50VGV4dEZpZWxkOwotICBTdHJpbmcgaW5kZW50U3RyaW5nOwotICBUZXh0IHNjaGVtYU5zUHJlZml4RmllbGQ7Ci0gIFRleHQgZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQ7Ci0gIEJ1dHRvbiBxdWFsaWZ5WFNETGFuZ3VhZ2U7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzIG9uIGRlbWFuZC4KLSAgICogICBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IGZvciB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKHBhcmVudCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RQX1BSRUZFUkVOQ0VfUEFHRSk7Ci0KLSAgICBHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7ICAgCi0gICAgZ3JvdXAuc2V0VGV4dChNZXNzYWdlcy5fVUlfVEVYVF9YU0RfTkFNRVNQQUNFX1BSRUZJWCk7Ci0KLSAgICBxdWFsaWZ5WFNETGFuZ3VhZ2UgPSBWaWV3VXRpbGl0eS5jcmVhdGVDaGVja0JveChncm91cCwgTWVzc2FnZXMuX1VJX1FVQUxJRllfWFNEKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHF1YWxpZnlYU0RMYW5ndWFnZSwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5YTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fUVVBTElGWV9YTUxTQ0hFTUFfTEFOR1VBR0VfQ09OU1RSVUNUUyk7IAotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGdyb3VwLCAiICIpOwotCi0gICAgY3JlYXRlTGFiZWwoZ3JvdXAsIE1lc3NhZ2VzLl9VSV9URVhUX1hTRF9ERUZBVUxUX1BSRUZJWCk7Ci0gICAgc2NoZW1hTnNQcmVmaXhGaWVsZCA9IGNyZWF0ZVRleHRGaWVsZChncm91cCk7Ci0gICAgc2NoZW1hTnNQcmVmaXhGaWVsZC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotICAgICAgewotICAgICAgICBzZXRWYWxpZCh0cnVlKTsKLSAgICAgIH0gICAgICAKLSAgICB9KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNjaGVtYU5zUHJlZml4RmllbGQsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX1hNTF9TQ0hFTUFfTEFOR1VBR0VfQ09OU1RSVUNUU19QUkVGSVgpOyAKLSAgICAKLSAgICBjcmVhdGVMYWJlbChncm91cCwgTWVzc2FnZXMuX1VJX1RFWFRfWFNEX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQgPSBjcmVhdGVUZXh0RmllbGQoZ3JvdXApOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX0RFRkFVTFRfVEFSR0VUTkFNRVNQQUNFKTsgCi0gICAgCi0gICAgCi0gICAgaW5pdGlhbGl6ZVZhbHVlcygpOwotCi0gICAgYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0KLSAgICByZXR1cm4gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgfQotCi0gIHByaXZhdGUgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIAotICB7Ci0gICAgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIHJldHVybiBncm91cDsKLSAgfQotCi0gIHByaXZhdGUgVGV4dCBjcmVhdGVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICByZXR1cm4gdGV4dDsKLSAgfQotCi0gIHByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIAotICB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0gICAgbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLSAgICAKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0gIAotICAvKioKLSAgICogRG9lcyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIAotICB7Ci0gICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0gICAgY2hlY2tWYWx1ZXMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEbyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgT0sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqICBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSAKLSAgewotICAgIGlmIChjaGVja1ZhbHVlcygpKQotICAgIHsKLSAgICAgIHN0b3JlVmFsdWVzKCk7ICAgIAotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpCi0gIHsKLSAgICBpZiAoY2hlY2tWYWx1ZXMoKSkKLSAgICB7Ci0gICAgICBzdG9yZVZhbHVlcygpOyAgICAKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSGFuZGxlcyBldmVudHMgZ2VuZXJhdGVkIGJ5IGNvbnRyb2xzIG9uIHRoaXMgcGFnZS4KLSAgICogICBAcGFyYW0gZSAgdGhlIGV2ZW50IHRvIGhhbmRsZQotICAgKi8KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkKLSAgeyAKLSAgfQotCi0gIC8qKiAKLSAgICogVGhlIGluZGVudCBpcyBzdG9yZWQgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBYTUwgU2NoZW1hIE1vZGVsCi0gICAqLwotICBwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKQotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHVzaW5nIGRlZmF1bHQgdmFsdWVzCi0gICAqIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpIAotICB7Ci0gICAgc2NoZW1hTnNQcmVmaXhGaWVsZC5zZXRUZXh0KGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRTdHJpbmcoWFNERWRpdG9yUGx1Z2luLkNPTlNUX1hTRF9ERUZBVUxUX1BSRUZJWF9URVhUKSk7Ci0gICAgcXVhbGlmeVhTRExhbmd1YWdlLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlkpKTsKLSAgICBkZWZhdWx0VGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRUZXh0KGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhYU0RFZGl0b3JQbHVnaW4uQ09OU1RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKSk7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSAKLSAgewotICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICBzY2hlbWFOc1ByZWZpeEZpZWxkLnNldFRleHQoc3RvcmUuZ2V0U3RyaW5nKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCkpOwotICAgIHF1YWxpZnlYU0RMYW5ndWFnZS5zZXRTZWxlY3Rpb24oc3RvcmUuZ2V0Qm9vbGVhbihYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlkpKTsKLSAgICBkZWZhdWx0VGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRUZXh0KHN0b3JlLmdldFN0cmluZyhYU0RFZGl0b3JQbHVnaW4uQ09OU1RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKSk7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSAKLSAgewotICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotICAgIHN0b3JlLnNldFZhbHVlKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCwgZ2V0WE1MU2NoZW1hUHJlZml4KCkpOwotICAgIHN0b3JlLnNldFZhbHVlKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfTEFOR1VBR0VfUVVBTElGWSwgZ2V0UXVhbGlmeSgpKTsKLSAgICBzdG9yZS5zZXRWYWx1ZShYU0RFZGl0b3JQbHVnaW4uQ09OU1RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFLCBnZXRYTUxTY2hlbWFUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAKLSAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFhNTFNjaGVtYVByZWZpeCgpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gc2NoZW1hTnNQcmVmaXhGaWVsZC5nZXRUZXh0KCk7Ci0gICAgaWYgKHByZWZpeCA9PSBudWxsIHx8IHByZWZpeC5lcXVhbHMoIiIpKSAKLSAgICB7Ci0gICAgICByZXR1cm4gInhzZCI7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXg7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRRdWFsaWZ5KCkKLSAgewotICAgIHJldHVybiBxdWFsaWZ5WFNETGFuZ3VhZ2UuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHhtbCBzY2hlbWEgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFhNTFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpCi0gIHsKLSAgCVN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBkZWZhdWx0VGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRUZXh0KCk7Ci0gICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsIHx8IHRhcmdldE5hbWVzcGFjZS5lcXVhbHMoIiIpKSAKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLkRFRkFVTFRfVEFSR0VUX05BTUVTUEFDRTsKLSAgICB9Ci0gICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gY2hlY2tWYWx1ZXMoKQotICB7Ci0vLyBLQ1BvcnQgVE9ETyAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gVmFsaWRhdGVIZWxwZXIuY2hlY2tYTUxOYW1lKHNjaGVtYU5zUHJlZml4RmllbGQuZ2V0VGV4dCgpKTsKLQkgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0KLSAgICBpZiAoZXJyb3JNZXNzYWdlID09IG51bGwgfHwgZXJyb3JNZXNzYWdlLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgc2V0VmFsaWQodHJ1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5fRVJST1JfTEFCRUxfSU5WQUxJRF9QUkVGSVgpOwotICAgICAgc2V0VmFsaWQoZmFsc2UpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEVmFsaWRhdG9yUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRFZhbGlkYXRvclByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2FlMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEVmFsaWRhdG9yUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5HcmlkRGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZUxpbmtBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5YU0RDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNvbnRleHRJZHM7Ci0KLQotcHVibGljIGNsYXNzIFhTRFZhbGlkYXRvclByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZQotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1ZBTElEQVRPUl9QUkVGRVJFTkNFX1BBR0VfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwudmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICBwcml2YXRlIEJ1dHRvbiBmdWxsU2NoZW1hQ29uZm9ybWFuY2UgPSBudWxsOwotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0gICAgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCi0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHBhcmVudCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RQX1ZBTElEQVRPUl9QUkVGRVJFTkNFX1BBR0UpOwotCi0gICAgbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5XUkFQIHwgU1dULk1VTFRJLCBYTUxfVkFMSURBVE9SX1BSRUZFUkVOQ0VfUEFHRV9JRCwgTWVzc2FnZXMuX1VJX1hNTF9WQUxJREFUT1JfUFJFRlNfTElOSywKLSAgICAgIChJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcilnZXRDb250YWluZXIoKSwgbnVsbCkuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmhpbnQoMTUwLCBTV1QuREVGQVVMVCkuY3JlYXRlKCkpOwotICAgIG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5zd3REZWZhdWx0cygpLmNyZWF0ZSgpKTsKLQotICAgIGNyZWF0ZUNvbnRlbnRzRm9yVmFsaWRhdGluZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0KLSAgICBzZXRTaXplKGNvbXBvc2l0ZSk7Ci0gICAgbG9hZFByZWZlcmVuY2VzKCk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yVmFsaWRhdGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBHcm91cCB2YWxpZGF0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDEpOwotICAgIHZhbGlkYXRpbmdHcm91cC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9WQUxJREFUSU5HX0ZJTEVTKTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCi0gICAgaWYgKGZ1bGxTY2hlbWFDb25mb3JtYW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGZ1bGxTY2hlbWFDb25mb3JtYW5jZSA9IG5ldyBCdXR0b24odmFsaWRhdGluZ0dyb3VwLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7Ci0gICAgICBmdWxsU2NoZW1hQ29uZm9ybWFuY2Uuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuY29weURhdGEoZGF0YSkpOwotICAgICAgZnVsbFNjaGVtYUNvbmZvcm1hbmNlLnNldFRleHQoTWVzc2FnZXMuX1VJX0ZVTExfQ09ORk9STUFOQ0UpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpCi0gIHsKLSAgICBmdWxsU2NoZW1hQ29uZm9ybWFuY2Uuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihYU0RDb3JlUHJlZmVyZW5jZU5hbWVzLkZVTExfU0NIRU1BX0NPTkZPUk1BTkNFKSk7Ci0gICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkKLSAgewotICAgIGluaXRpYWxpemVWYWx1ZXNGb3JWYWxpZGF0aW5nR3JvdXAoKTsKLSAgICBzdXBlci5pbml0aWFsaXplVmFsdWVzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yVmFsaWRhdGluZ0dyb3VwKCkKLSAgewotICAgIGZ1bGxTY2hlbWFDb25mb3JtYW5jZS5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5GVUxMX1NDSEVNQV9DT05GT1JNQU5DRSkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKQotICB7Ci0gICAgcmV0dXJuIFhTRENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvclZhbGlkYXRpbmdHcm91cCgpCi0gIHsKLSAgICBpZiAoZnVsbFNjaGVtYUNvbmZvcm1hbmNlICE9IG51bGwpCi0gICAgewotICAgICAgYm9vbGVhbiBmdWxsU2NoZW1hQ29uZm9ybWFuY2VTZWxlY3RlZCA9IGZ1bGxTY2hlbWFDb25mb3JtYW5jZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYU0RDb3JlUHJlZmVyZW5jZU5hbWVzLkZVTExfU0NIRU1BX0NPTkZPUk1BTkNFLCBmdWxsU2NoZW1hQ29uZm9ybWFuY2VTZWxlY3RlZCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKQotICB7Ci0gICAgc3RvcmVWYWx1ZXNGb3JWYWxpZGF0aW5nR3JvdXAoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpCi0gIHsKLSAgICBYU0RDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCi0gICAgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC90ZXh0L1hTRE1vZGVsQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdGV4dC9YU0RNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IyNTBhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC90ZXh0L1hTRE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE1vbGxlciAtIGJyb2FkZXIgcmVjb2duaXRpb24gb2YgVVJJcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5Nb2RlbFJlY29uY2lsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RNb2RlbEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIKLXsKLSAgcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLSAgcHJpdmF0ZSBNb2RlbFJlY29uY2lsZUFkYXB0ZXIgbW9kZWxSZWNvbmNpbGVBZGFwdGVyOwotCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkKLSAgewotICAgIHJldHVybiBzY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjbGVhcigpCi0gIHsKLQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJRG9jdW1lbnQgZG9jID0gc2NoZW1hLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpIHsKLQkJCUlET01Eb2N1bWVudCBkb21Eb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpZG9jOwotCQkJZG9tRG9jdW1lbnQuZ2V0TW9kZWwoKS5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCkpOwotCQkJZG9tRG9jdW1lbnQucmVtb3ZlQWRhcHRlcihnZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKSk7Ci0JCQlkb21Eb2N1bWVudC5yZW1vdmVBZGFwdGVyKHRoaXMpOwkJCi0JCX0KLQkgICAgc2NoZW1hID0gbnVsbDsKLQl9Ci0gICAgcmVzb3VyY2VTZXQgPSBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlID09IFhTRE1vZGVsQWRhcHRlci5jbGFzczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykKLSAgewotICB9Ci0gIAotICBwdWJsaWMgTW9kZWxSZWNvbmNpbGVBZGFwdGVyIGdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxSZWNvbmNpbGVBZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBjcmVhdGVTY2hlbWEoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsgICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gKGNzKSBub3RlIHRoYXQgd2UgYWx3YXlzIHdhbnQgdG8gZW5zdXJlIHRoYXQgYSAKLSAgICAgIC8vIHNjaGVtYSBtb2RlbCBvYmplY3QgZ2V0J3MgcmV0dXJuZWQKLSAgICAgIHNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOwotICAgICAgcmVzb3VyY2VTZXQgPSBYU0RTY2hlbWFJbXBsLmNyZWF0ZVJlc291cmNlU2V0KCk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkoKSk7ICAgICAgICAgICAgICAgIAotCi0gICAgICBJRE9NTm9kZSBkb21Ob2RlID0gKElET01Ob2RlKWRvY3VtZW50OwotICAgICAgU3RyaW5nIGJhc2VMb2NhdGlvbiA9IGRvbU5vZGUuZ2V0TW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKTsgICAgICAgICAgIAotCi0gICAgICAvLyBUT0RPLi4uIGdvdHRhIHBlc3RlciBTU0UgZm9sa3MgdG8gcHJvdmlkZSAndXNlZnVsJyBiYXNlTG9jYXRpb25zCi0gICAgICAvLyAKLSAgICAgIFVSSSB1cmkgPSBnZXRVUkkoYmFzZUxvY2F0aW9uKTsKLQotICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgWFNEUmVzb3VyY2VJbXBsKCk7Ci0gICAgICByZXNvdXJjZS5zZXRVUkkodXJpKTsKLSAgICAgIHNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOyAKLSAgICAgIHJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHNjaGVtYSk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOyAgICAgCi0KLSAgICAgIHNjaGVtYS5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0gICAgICBmaW5hbCBFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgLy8gRm9yY2UgdGhlIGxvYWRpbmcgb2YgdGhlICJtZXRhIiBzY2hlbWEgZm9yIHNjaGVtYSBpbnN0YW5jZSBpbnN0YW5jZS4KLSAgICAgICAgLy8KLSAgICAgICAgU3RyaW5nIHNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKHNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSk7ICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICAgIAotICAgICAgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHNldEVsZW1lbnRPcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBVc2UgdGhlIGFuaW1hdGVkIGZsYXZvdXIgYXMgd2UgZG9uJ3Qga25vdyBiZWZvcmVoYW5kIGhvdyBtYW55IHRpY2tzIHdlIG5lZWQuCi0gICAgICAgICAgLy8gVGhlIHRhc2sgbmFtZSB3aWxsIGJlIGRpc3BsYXllZCBieSB0aGUgY29kZSBpbiBYU0RSZXNvdXJjZUltcGwuCi0gICAgICAgICAgCi0gICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBNYXAgbG9hZE9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpOwotICAgICAgICAgIGxvYWRPcHRpb25zLnB1dChYU0RSZXNvdXJjZUltcGwuWFNEX1BST0dSRVNTX01PTklUT1IsIG1vbml0b3IpOwotICAgICAgICAgIAotICAgICAgICAgIHNjaGVtYS5zZXRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgICAgIAotICAgICAgICAgIGxvYWRPcHRpb25zLnJlbW92ZShYU0RSZXNvdXJjZUltcGwuWFNEX1BST0dSRVNTX01PTklUT1IpOwotICAgICAgICB9Ci0gICAgICB9OwotCi0gICAgICBJUHJvZ3Jlc3NTZXJ2aWNlIHByb2dyZXNzU2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcHJvZ3Jlc3NTZXJ2aWNlLmJ1c3lDdXJzb3JXaGlsZShzZXRFbGVtZW50T3BlcmF0aW9uKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0gICAgICAgCi0gICAgICAgIAotICAgICAgLy8gYXR0YWNoIGFuIGFkYXB0ZXIgdG8ga2VlcCB0aGUgWFNEIG1vZGVsIGFuZCBET00gaW4gc3luYwotICAgICAgLy8KLSAgICAgIG1vZGVsUmVjb25jaWxlQWRhcHRlciA9IG5ldyBYU0RNb2RlbFJlY29uY2lsZUFkYXB0ZXIoZG9jdW1lbnQsIHNjaGVtYSk7Ci0gICAgICBkb21Ob2RlLmdldE1vZGVsKCkuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKG1vZGVsUmVjb25jaWxlQWRhcHRlcik7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgewotICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiBzY2hlbWE7ICAgIAotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBYU0RTY2hlbWEgY3JlYXRlU2NoZW1hKEVsZW1lbnQgZWxlbWVudCkKLSAgeyAgICAgCi0gICAgcmV0dXJuIGNyZWF0ZVNjaGVtYShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gIH0KLQotICBwdWJsaWMgWFNEU2NoZW1hIHJlc2V0U2NoZW1hKERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgLy8gVGhlIGRvY3VtZW50IGhhcyBjaGFuZ2VkIHNvIHRoZSBzY2hlbWEgc2hvdWxkIGJlIHVwZGF0ZWQgYXMgd2VsbC4KLSAgICB0cnkKLSAgICB7Ci0gICAgICBJRE9NTm9kZSBkb21Ob2RlID0gKElET01Ob2RlKWRvY3VtZW50OwotICAgICAgc2NoZW1hLnNldERvY3VtZW50KGRvY3VtZW50KTsKLSAgICAgIHNjaGVtYS5zZXRFbGVtZW50KGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpKTsKLQotICAgICAgcmVzb3VyY2VTZXQgPSBzY2hlbWEuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLSAgICAgIAotICAgICAgU3RyaW5nIGJhc2VMb2NhdGlvbiA9IGRvbU5vZGUuZ2V0TW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKTsgICAgICAgICAgIAotICAgICAgVVJJIHVyaSA9IGdldFVSSShiYXNlTG9jYXRpb24pOwotICAgICAgc2NoZW1hLmVSZXNvdXJjZSgpLnNldFVSSSh1cmkpOwotCi0gICAgICBtb2RlbFJlY29uY2lsZUFkYXB0ZXIgPSBuZXcgWFNETW9kZWxSZWNvbmNpbGVBZGFwdGVyKGRvY3VtZW50LCBzY2hlbWEpOwotICAgICAgZG9tTm9kZS5nZXRNb2RlbCgpLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcihtb2RlbFJlY29uY2lsZUFkYXB0ZXIpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHNjaGVtYTsKLSAgfSAgCi0KLSAgcHVibGljIHN0YXRpYyBYU0RNb2RlbEFkYXB0ZXIgbG9va3VwT3JDcmVhdGVNb2RlbEFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBYU0RNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0gICAgaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikKLSAgICB7Ci0gICAgICBJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpZG9jdW1lbnQ7Ci0gICAgICBhZGFwdGVyID0gKFhTRE1vZGVsQWRhcHRlcilub3RpZmllci5nZXRBZGFwdGVyRm9yKFhTRE1vZGVsQWRhcHRlci5jbGFzcyk7Ci0gICAgICBpZiAoYWRhcHRlciA9PSBudWxsKQotICAgICAgewotICAgICAgICBhZGFwdGVyID0gbmV3IFhTRE1vZGVsQWRhcHRlcigpOwotICAgICAgICBub3RpZmllci5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotICAgICAgfSAKLSAgICB9ICAgCi0gICAgcmV0dXJuIGFkYXB0ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgWFNEU2NoZW1hIGxvb2t1cE9yQ3JlYXRlU2NoZW1hKGZpbmFsIERvY3VtZW50IGRvY3VtZW50KQotICB7ICAgIAotICAgIFhTRFNjaGVtYSByZXN1bHQgPSBudWxsOyAgICAKLSAgICBYU0RNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGxvb2t1cE9yQ3JlYXRlTW9kZWxBZGFwdGVyKGRvY3VtZW50KTsgICAgICAKLSAgICBpZiAoYWRhcHRlci5nZXRTY2hlbWEoKSA9PSBudWxsKQotICAgIHsgIAotICAgICAgCi0gICAgICBhZGFwdGVyLmNyZWF0ZVNjaGVtYShkb2N1bWVudCk7IAotICAgIH0gICAKLSAgICByZXN1bHQgPSBhZGFwdGVyLmdldFNjaGVtYSgpOyAgICAKLSAgICByZXR1cm4gcmVzdWx0OyAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSBVUkkgZ2V0VVJJKFN0cmluZyBiYXNlTG9jYXRpb24pCi0gIHsKLSAgICBVUkkgdXJpID0gbnVsbDsKLSAgICBpZiAoYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGJhc2VMb2NhdGlvbik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGJhc2VMb2NhdGlvbi5pbmRleE9mKCc6JykgPiAxKQotICAgIHsKLSAgICAgIC8vIExvb2tzIGxpa2UgYW4gVVJMCi0gICAgICB1cmkgPSBVUkkuY3JlYXRlVVJJKGJhc2VMb2NhdGlvbik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBTdXBwb3NlZGx5IGEgZmlsZSwgdGhlbgotICAgICAgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkoYmFzZUxvY2F0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxEZWxheWVkUmVjb25jaWxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdGV4dC9YU0RNb2RlbERlbGF5ZWRSZWNvbmNpbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYjdiNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdGV4dC9YU0RNb2RlbERlbGF5ZWRSZWNvbmNpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudGV4dDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5JbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogUHJvdmlkZXMgIGRlbGF5ZWQgcmVjb25jaWxpYXRpb24gYmV0d2VlbiB0aGUgU1NFIERPTSBhbmQgdGhlIFhTRCBFTUYgbW9kZWwuIAotICogQ2hhbmdlcyBpbiB0aGUgRE9NIGFyZSBxdWV1ZWQgYW5kIHByb2Nlc3NlZCBieSBhIFVJIGpvYi4gV2hlbiBhIG5ldyByZXF1ZXN0IAotICogY29tZXMgaW4sIHRoZSBjdXJyZW50IHJ1biBpcyBjYW5jZWxsZWQsIHRoZSBuZXcgcmVxdWVzdCBpcyBhZGRlZCB0byB0aGUgcXVldWUsIAotICogdGhlbiB0aGUgam9iIGlzIHJlLXNjaGVkdWxlZC4KLSAqLwotcHVibGljIGNsYXNzIFhTRE1vZGVsRGVsYXllZFJlY29uY2lsZXIKLXsKLSAgLyoqCi0gICAqIFRoZSBtb2RlbCByZWNvbmNpbGVyIGpvYi4KLSAgICovCi0gIHByaXZhdGUgUmVjb25jaWxlckpvYiByZWNvbmNpbGVySm9iOwotCi0gIC8qKgotICAgKiBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgdXBkYXRpbmcgdGhlIEVNRiBtb2RlbC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUxBWSA9IDMwMDsKLQotICAvKioKLSAgICogVGhlIGVsZW1lbnRzIHRvIHJlY29uY2lsZS4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBlbGVtZW50c1RvUmVjb25jaWxlID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIC8qKgotICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBkZWxheWVkIHJlY29uY2lsZXIgc2hvdWxkIGtpY2sgaW4uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxheShYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgYm9vbGVhbiBzaG91bGREZWxheSA9IGZhbHNlOwotCi0gICAgLy8gVGhlIGRlbGF5ZWQgcmVjb25jaWxlciBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiB0aGUgZWRpdG9yIGlzIGluIGdyYXBoaWNhbCBlZGl0aW5nIG1vZGUuCi0KLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFBhZ2UgIT0gbnVsbCA/IHdvcmtiZW5jaFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCkgOiBudWxsOwotICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwgJiYgZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgIHsKLSAgICAgIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcillZGl0b3JQYXJ0OwotICAgICAgc2hvdWxkRGVsYXkgPSB4c2RFZGl0b3IuaXNTb3VyY2VQYWdlQWN0aXZlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNob3VsZERlbGF5OwotICB9Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZXMgdGhlIFhTRCBFTUYgY29tcG9uZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIERPTSBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGNoYW5nZWQgZWxlbWVudC4KLSAgICogQHBhcmFtIHNjaGVtYSB0aGUgY29udGFpbmluZyBzY2hlbWEuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50IGVsZW1lbnQsIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBzeW5jaHJvbml6ZWQgKGVsZW1lbnRzVG9SZWNvbmNpbGUpCi0gICAgewotICAgICAgLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBzaG91bGQgYmUgc21hbGwgc28gYSBsaW5lYXIgc2VhcmNoIHNob3VsZCBiZSBmaW5lLgotCi0gICAgICBpZiAoIWVsZW1lbnRzVG9SZWNvbmNpbGUuY29udGFpbnMoZWxlbWVudCkpCi0gICAgICB7Ci0gICAgICAgIGVsZW1lbnRzVG9SZWNvbmNpbGUuYWRkKGVsZW1lbnQpOwotICAgICAgfQotCi0gICAgICBpZiAocmVjb25jaWxlckpvYiA9PSBudWxsKQotICAgICAgewotICAgICAgICByZWNvbmNpbGVySm9iID0gbmV3IFJlY29uY2lsZXJKb2Ioc2NoZW1hKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmVjb25jaWxlckpvYi5zY2hlZHVsZShERUxBWSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEEgVUkgam9iIHVzZWQgdG8gcmVjb25jaWxlIHRoZSBYU0QgRU1GIG1vZGVsIHdpdGggdGhlIGFzc29jaWF0ZWQgU1NFIERPTS4KLSAgICovCi0gIGNsYXNzIFJlY29uY2lsZXJKb2IgZXh0ZW5kcyBVSUpvYgotICB7Ci0gICAgLyoqCi0gICAgICogVGhlIHRhcmdldCBzY2hlbWEuCi0gICAgICovCi0gICAgcHJpdmF0ZSBYU0RTY2hlbWEgc2NoZW1hOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyBhbGxvd2VkIHRvIHdha2UgdXAgYW5kIGRvIG5vdGhpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9JTkFDVElWRV9DT1VOVCA9IDEwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGpvYiB3aWxsIHRlcm1pbmF0ZSBvbmNlIHRoaXMgY291bnRlciByZWFjaGVzIE1BWF9JTkFDVElWRV9DT1VOVC4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgdGltZXNBd2FrZUFuZElkbGUgPSAwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyB0aGUgcmVjb25jaWxlciBqb2IgYW5kIGNvbmZpZ3VyZXMgc29tZSBvZiBpdHMgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVjb25jaWxlckpvYihYU0RTY2hlbWEgc2NoZW1hKQotICAgIHsKLSAgICAgIHN1cGVyKCJSZWNvbmNpbGluZyB0aGUgWFNEIEVNRiBtb2RlbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICBzZXRTeXN0ZW0odHJ1ZSk7Ci0gICAgICBzZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0gICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICB7Ci0gICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLSAgICAgIH0KLQotICAgICAgRWxlbWVudFtdIGVsZW1lbnRzID0gbnVsbDsKLSAgICAgIAotICAgICAgc3luY2hyb25pemVkIChlbGVtZW50c1RvUmVjb25jaWxlKQotICAgICAgewotICAgICAgICBpZiAoIWVsZW1lbnRzVG9SZWNvbmNpbGUuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudHMgPSBuZXcgRWxlbWVudFtlbGVtZW50c1RvUmVjb25jaWxlLnNpemUoKV07Ci0gICAgICAgICAgZWxlbWVudHNUb1JlY29uY2lsZS50b0FycmF5KGVsZW1lbnRzKTsKLSAgICAgICAgICBlbGVtZW50c1RvUmVjb25jaWxlLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHNob3VsZFRlcm1pbmF0ZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlY29uY2lsZXJKb2IgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZWNvbmNpbGUoZWxlbWVudHMpOwotCi0gICAgICBzY2hlZHVsZShERUxBWSk7Ci0KLSAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWNvbmNpbGUoRWxlbWVudFtdIG1vZGlmaWVkRWxlbWVudHMpCi0gICAgewotICAgICAgaWYgKG1vZGlmaWVkRWxlbWVudHMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1vZGlmaWVkRWxlbWVudHMubGVuZ3RoOyBpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBtb2RpZmllZEVsZW1lbnQgPSBtb2RpZmllZEVsZW1lbnRzW2luZGV4XTsKLQotICAgICAgICAgIHJlY29uY2lsZShtb2RpZmllZEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlY29uY2lsZShFbGVtZW50IG1vZGlmaWVkRWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAobW9kaWZpZWRFbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gc2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQobW9kaWZpZWRFbGVtZW50KTsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnQuZWxlbWVudENoYW5nZWQobW9kaWZpZWRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFRlcm1pbmF0ZSgpCi0gICAgewotICAgICAgcmV0dXJuIHRpbWVzQXdha2VBbmRJZGxlKysgPT0gTUFYX0lOQUNUSVZFX0NPVU5UOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxRdWVyeUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdGV4dC9YU0RNb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTFhYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdGV4dC9YU0RNb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uLk1vZGVsUXVlcnlFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotcHVibGljIGNsYXNzIFhTRE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5kcyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uCi17Ci0gIHB1YmxpYyBYU0RNb2RlbFF1ZXJ5RXh0ZW5zaW9uKCkKLSAgewotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEF0dHJpYnV0ZVZhbHVlcyhFbGVtZW50IGUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZyBjdXJyZW50RWxlbWVudE5hbWUgPSBlLmdldExvY2FsTmFtZSgpOwotICAgIE5vZGUgcGFyZW50Tm9kZSA9IGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgIFN0cmluZyBwYXJlbnROYW1lID0gcGFyZW50Tm9kZSAhPSBudWxsID8gcGFyZW50Tm9kZS5nZXRMb2NhbE5hbWUoKSA6ICIiOwotICAgIGlmIChjaGVja05hbWUobmFtZSwgInR5cGUiKSkKLSAgICB7Ci0gICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImF0dHJpYnV0ZSIpKQotICAgICAgewotICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QyKCk7Ci0gICAgICAgIGxpc3QuYWRkQWxsKGdldFR5cGVzSGVscGVyKGUpLmdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImVsZW1lbnQiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0MigpOwotICAgICAgICBsaXN0LmFkZEFsbChnZXRUeXBlc0hlbHBlcihlKS5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KCkpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgIm1pbk9jY3VycyIpKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKCIwIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAiaXRlbVR5cGUiKSkKLSAgICB7Ci0gICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImxpc3QiKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoZWNrTmFtZShwYXJlbnROYW1lLCAic2ltcGxlVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY2hlY2tOYW1lKG5hbWUsICJtZW1iZXJUeXBlcyIpKQotICAgIHsKLSAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAidW5pb24iKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoZWNrTmFtZShwYXJlbnROYW1lLCAic2ltcGxlVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY2hlY2tOYW1lKG5hbWUsICJiYXNlIikpCi0gICAgewotICAgICAgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJyZXN0cmljdGlvbiIpKQotICAgICAgewotICAgICAgICBpZiAoY2hlY2tOYW1lKHBhcmVudE5hbWUsICJzaW1wbGVUeXBlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgICAgICAgICBsaXN0LmFkZEFsbChnZXRUeXBlc0hlbHBlcihlKS5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGVja05hbWUocGFyZW50TmFtZSwgInNpbXBsZUNvbnRlbnQiKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QgPSBnZXRUeXBlc0hlbHBlcihlKS5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgICAgIGxpc3QuYWRkQWxsKGdldFR5cGVzSGVscGVyKGUpLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGVja05hbWUocGFyZW50TmFtZSwgImNvbXBsZXhDb250ZW50IikpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgICAgICAgICBsaXN0LmFkZEFsbChnZXRUeXBlc0hlbHBlcihlKS5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJleHRlbnNpb24iKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoZWNrTmFtZShwYXJlbnROYW1lLCAic2ltcGxlQ29udGVudCIpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShwYXJlbnROYW1lLCAiY29tcGxleENvbnRlbnQiKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QgPSBnZXRUeXBlc0hlbHBlcihlKS5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgICAgIGxpc3QuYWRkQWxsKGdldFR5cGVzSGVscGVyKGUpLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgInJlZiIpKQotICAgIHsKLSAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiZWxlbWVudCIpKQotICAgICAgewotICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0R2xvYmFsRWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJhdHRyaWJ1dGUiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEdsb2JhbEF0dHJpYnV0ZXMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJhdHRyaWJ1dGVHcm91cCIpKQotICAgICAgewotICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0R2xvYmFsQXR0cmlidXRlR3JvdXBzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiZ3JvdXAiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldE1vZGVsR3JvdXBzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAic3Vic3RpdHV0aW9uR3JvdXAiKSkKLSAgICB7Ci0gICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImVsZW1lbnQiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEdsb2JhbEVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVDaGlsZEVsZW1lbnQoTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIGlmIChYU0RDb25zdGFudHMuQVBQSU5GT19FTEVNRU5UX1RBRy5lcXVhbHMocGFyZW50Tm9kZS5nZXROb2RlTmFtZSgpKSAmJgotICAgICAgICBYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgLy8gd2UgYXNzdW1lIHRoYXQgb3RoZXIgbm9kZXMgZG9uJ3Qgd2FudCBzY2hlbWEgbm9kZXMgYXMgZXh0ZW5zaW9uIGVsZW1lbnRzCi0gICAgLy8gVE9ETy4uLiBjczogd2UgcmVhbGx5IG5lZWQgdG8gZGVmaW5lIGN1c3RpbWl6YXRpb25zIGZvciBmaWx0ZXJpbmcgYmFzZWQgb24gcGFyZW50L2NoaWxkCi0gICAgLy8gbmFtZXNwYWNlIHBhaXJzIHRvIGFjY3VyYXRlbHkgaGFuZGxlIHRoaXMgICAgCi0gICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lc3BhY2VVUkkgPSBwYXJlbnROb2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIGlmICghWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyhwYXJlbnRFbGVtZW50TmFtZXNwYWNlVVJJKSAmJgotICAgICAgICBYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgIHJldHVybiBmYWxzZTsgICAKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgeyAgCi0gICAgICBOb2RlRmlsdGVyIGZpbHRlciA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXROb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCkuZ2V0Tm9kZUZpbHRlcihuYW1lc3BhY2UpOwotICAgICAgaWYgKGZpbHRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm4gZmlsdGVyLmlzQXBwbGljYWJsZUNvbnRleHQocGFyZW50Tm9kZSwgTm9kZS5FTEVNRU5UX05PREUsIG5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgICB9ICAgICAKLSAgICB9Ci0gICAgIAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBsb29rdXBPckNyZWF0ZVNjaGVtYShEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHJldHVybiBYU0RNb2RlbEFkYXB0ZXIubG9va3VwT3JDcmVhdGVTY2hlbWEoZG9jdW1lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIGxvb2t1cE9yQ3JlYXRlU2NoZW1hRm9yRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gbG9va3VwT3JDcmVhdGVTY2hlbWEoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFR5cGVzSGVscGVyIGdldFR5cGVzSGVscGVyKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBsb29rdXBPckNyZWF0ZVNjaGVtYShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgcmV0dXJuIG5ldyBUeXBlc0hlbHBlcihzY2hlbWEpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tOYW1lKFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB0b2tlbikKLSAgewotICAgIGlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUudHJpbSgpLmVxdWFscyh0b2tlbikpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxSZWNvbmNpbGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC90ZXh0L1hTRE1vZGVsUmVjb25jaWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGIwNjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxSZWNvbmNpbGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBFdWdlbmUgT3N0cm91a2hvdiwgZXVnZW5lQGdlbnVpdGVjLmNvbSAtIFsyMDMyOTFdIFhTRCBFZGl0b3IgU291cmNlIFN0YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgdXBkYXRlZCBpbiBPdXRsaW5lL0dyYXBoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLk1vZGVsUmVjb25jaWxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWFNETW9kZWxSZWNvbmNpbGVBZGFwdGVyIGV4dGVuZHMgTW9kZWxSZWNvbmNpbGVBZGFwdGVyCi17Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICBwcm90ZWN0ZWQgWFNETW9kZWxEZWxheWVkUmVjb25jaWxlciBkZWxheWVkUmVjb25jaWxlcjsKLSAgCi0gIHB1YmxpYyBYU0RNb2RlbFJlY29uY2lsZUFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQsIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBzdXBlcihkb2N1bWVudCk7Ci0gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gICAgdGhpcy5kZWxheWVkUmVjb25jaWxlciA9IG5ldyBYU0RNb2RlbERlbGF5ZWRSZWNvbmNpbGVyKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZU5vZGVDaGFuZ2VkKE5vZGUgbm9kZSkKLSAgewotICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBub2RlIGlzIGluIHRoZSBYU0QgU2NoZW1hIG5hbWVzcGFjZS4gV2UgZG9uJ3QgbmVlZCB0byAKLSAgICAvLyByZWNvbmNpbGUgdGhlIG1vZGVsIGZvciBvdGhlciBub2RlcyBsaWtlIHRleHQgb3Igbm9kZXMgaW4gb3RoZXIgbmFtZXNwYWNlcwotICAgIC8vIGxpa2UgdGhlIG9uZXMgbm9ybWFsbHkgb2NjdXJyaW5nIGluIGFubm90YXRpb25zLgotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICghc2hvdWxkUmVjb25jaWxlTW9kZWxGb3Iobm9kZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0KLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgeyAgCi0JCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQlpZiAoZGVsYXllZFJlY29uY2lsZXIuc2hvdWxkRGVsYXkoc2NoZW1hKSkKLQkJewotCQkJZGVsYXllZFJlY29uY2lsZXIuZWxlbWVudENoYW5nZWQoZWxlbWVudCwgc2NoZW1hKTsKLQkJfQotCQllbHNlCi0JCXsKLQkgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gc2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQobm9kZSk7Ci0JCQljb25jcmV0ZUNvbXBvbmVudC5lbGVtZW50Q2hhbmdlZChlbGVtZW50KTsKLQkJfQotCX0KLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpCi0gICAgewotICAgICAgLy8gVGhlIGRvY3VtZW50IGNoYW5nZWQgc28gd2UgbWF5IG5lZWQgdG8gZml4IHVwIHRoZSAKLSAgICAgIC8vIGRlZmluaXRpb24ncyByb290IGVsZW1lbnQKLSAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gKERvY3VtZW50KW5vZGU7ICAgIAotICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICBpZiAoc2NoZW1hRWxlbWVudCAhPSBudWxsICYmIHNjaGVtYUVsZW1lbnQgIT0gc2NoZW1hLmdldEVsZW1lbnQoKSkKLSAgICAgIHsgICAKLSAgICAgICAgLy8gaGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYSBuZXcgJ3NjaGVtYScgZWxlbWVudCB3YXMgYWRkZWQKLSAgICAgICAgLy8oZS5nLiB0aGUgZmlsZSB3YXMgdG90YWxseSBibGFuayBhbmQgdGhlbiB3ZSB0eXBlIGluIHRoZSByb290IGVsZW1lbnQpICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgaWYgKHNjaGVtYUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRUxFTUVOVF9UQUcpKSAgICAgICAgIAotICAgICAgICB7ICAKLSAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIFNldHRpbmcgbmV3IHNjaGVtYSIpOwotICAgICAgICAgIHNjaGVtYS5zZXRFbGVtZW50KHNjaGVtYUVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgCi0gICAgICBlbHNlIGlmIChzY2hlbWFFbGVtZW50ICE9IG51bGwpCi0gICAgICB7ICAgICAgIAotICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGRlZmluaXRpb24gZWxlbWVudCdzIGNvbnRlbnQgaGFzIGNoYW5nZWQKLSAgICAgICAgLy8gVE9ETyAoY3MpIGRvIHdlIHJlYWxseSBuZWVkIHRvIGhhbmRsZSB0aGlzIGNhc2U/Ci0gICAgICAgIHNjaGVtYS5lbGVtZW50Q2hhbmdlZChzY2hlbWFFbGVtZW50KTsKLSAgICAgIH0gICAgICAKLSAgICAgIGVsc2UgaWYgKHNjaGVtYUVsZW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgdGhlcmUncyBubyByb290IGVsZW1lbnQgY2xlYXIgb3V0IHRoZSBzY2hlbWEKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDMyOTEKLSAgICAgICAgLy8gQWRkIHRyeS1jYXRjaCB0byB3b3JrLWFyb3VuZCBwcm9ibGVtIGF0IAotICAgICAgICAvLyBYU0RDb25jcmV0ZUNvbXBvbmVudEltcGwuZm9yY2VOaWNlUmVtb3ZlQ2hpbGQoWFNEQ29uY3JldGVDb21wb25lbnRJbXBsLmphdmE6MTY5NikKLSAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBzdGF0ZW1lbnRzIGJlbG93IGRvbid0IGdldCBydW4KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBzY2hlbWEuZ2V0Q29udGVudHMoKS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gd29ya2Fyb3VuZAotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyAoY3MpIEknbSBub3Qgc3VyZSB3aHkgdGhlIGFib3ZlIGlzbid0IGVub3VnaAotICAgICAgICAvLyB0byBjbGVhciBvdXQgYWxsIG9mIHRoZSBjb21wb25lbnQgbGlzdHMKLSAgICAgICAgLy8gZm9yIG5vdyBJJ3ZlIGp1c3QgYWRkZWQgYSBmZXcgbW9yZSBsaW5lcyB0byBkbyBhZGRpdGlvbmFsIGNsZWFyaW5nCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFNlZSBjb21tZW50IGFib3ZlIGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzMjkxCi0gICAgICAgIHRyeSB7IHNjaGVtYS5nZXRJbmNvcnBvcmF0ZWRWZXJzaW9ucygpLmNsZWFyKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IH0KLSAgICAgICAgdHJ5IHsgc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5jbGVhcigpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgdHJ5IHsgc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLmNsZWFyKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICB0cnkgeyBzY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkuY2xlYXIoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIHRyeSB7IHNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKS5jbGVhcigpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgdHJ5IHsgc2NoZW1hLmdldEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKS5jbGVhcigpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30gICAgIAotICAgICAgICB0cnkgeyBzY2hlbWEuc2V0VGFyZ2V0TmFtZXNwYWNlKG51bGwpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgdHJ5IHsgc2NoZW1hLnJlc2V0KCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCi0gICAgICAgIHNjaGVtYS5zZXRFbGVtZW50KG51bGwpOwotICAgICAgfSAgICAgIAotICAgIH0gCi0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIGlmIGEgY2hhbmdlIHRvIHRoZSBnaXZlbiBub2RlIHNob3VsZCB0cmlnZ2VyIGEgbW9kZWwgdXBkYXRlLgotICAgKiAKLSAgICogQHBhcmFtIGNoYW5nZWROb2RlCi0gICAqICAgICAgICAgIHRoZSBET00gbm9kZSB0byB0ZXN0LgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYW5nZSB0byB0aGUgZ2l2ZW4gbm9kZSBzaG91bGQgdHJpZ2dlciBhIG1vZGVsIHVwZGF0ZS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3VsZFJlY29uY2lsZU1vZGVsRm9yKE5vZGUgY2hhbmdlZE5vZGUpCi0gIHsKLSAgICAvLyBObyBuZWVkIHRvIHJlY29uY2lsZSBpZiB0aGUgbm9kZSBpcyBpbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UgYXMgaXQgaXMgdGhlCi0gICAgLy8gY2FzZSBmb3Igbm9kZXMgZGVlcGx5IG5lc3RlZCBpbiBhcHBpbmZvIG9yIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0KLSAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzMjkxCi0gICAgaWYgKGNoYW5nZWROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgU3RyaW5nIG5vZGVOYW1lc3BhY2UgPSBjaGFuZ2VkTm9kZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICBTdHJpbmcgc2NoZW1hTmFtZXNwYWNlID0gc2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpOwotICAgIC8vIElmIHRoZSBkb2N1bWVudCBub2RlIGNoYW5nZXMsIHRoZW4gdGhlIG5vZGVOYW1lc3BhY2UgaXMgbnVsbAotICAgIC8vIHNvIHdlIGRvIHdhbnQgdG8gcmVjb25jaWxlLiAgVGhpcyBjaGFuZ2UgaXMgbmVlZGVkIGZvcgotICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDg4NDIgYW5kCi0gICAgLy8gcmVhZCBvbmx5IGZpbGUgc3VwcG9ydC4KLSAgICBpZiAoIXNjaGVtYU5hbWVzcGFjZS5lcXVhbHMobm9kZU5hbWVzcGFjZSkgJiYgbm9kZU5hbWVzcGFjZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBXaGVuIGEgY2hpbGQgbm9kZSBpcyBhZGRlZCB0byBhbiBhcHBpbmZvIG9yIGRvY3VtZW50YXRpb24gZWxlbWVudAotICAgIC8vIE5vIG5lZWQgdG8gcmVjb25jaWxlIGlmIHRoZSBub2RlIGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBhcHBpbmZvIG9yIGRvY3VtZW50YXRpb24KLSAgICAvLyBlbGVtZW50cy4KLQotICAgIE5vZGUgcGFyZW50Tm9kZSA9IGNoYW5nZWROb2RlLmdldFBhcmVudE5vZGUoKTsKLQotICAgIGlmIChwYXJlbnROb2RlICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIG5vZGVOYW1lID0gY2hhbmdlZE5vZGUuZ2V0TG9jYWxOYW1lKCk7Ci0KLSAgICAgIGlmIChYU0RDb25zdGFudHMuQVBQSU5GT19FTEVNRU5UX1RBRy5lcXVhbHMobm9kZU5hbWUpIHx8IFhTRENvbnN0YW50cy5ET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHLmVxdWFscyhub2RlTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkKLSAgewotICAgIGlmICghaXNEaXJ0eSkKLSAgICB7Ci0gICAgICAvLyBUT0RPIG5lZWQgYSB3YXkgdG8gdGVsbCB0aGUgdmlld3MgdG8gc3RvcCByZWZyZXNoaW5nICh0ZW1wb3JhcmlseSkKLSAgICAgIC8vCi0gICAgICAvKgotICAgICAgc2NoZW1hLnJlc2V0KCk7Ci0gICAgICAKLSAgICAgIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlIHJlZmVyZW5jZXMgZG9uJ3QgZ2V0IGZpeGVkIHVwIHdoZW4gYW4gaW1wb3J0IGlzIHJlbW92ZWQKLSAgICAgIC8vIGV2ZW4gaWYgd2UgY2FsbCBzY2hlbWEucmVzZXQoKSBleHBsaWN0bHkuICBUbyB3b3JrIGFyb3VuZCB0aGlzICB3ZSBpdGVyYXRlIHRocnUKLSAgICAgIC8vIHRoZSB0eXBlIHJlZmVyZW5jZXMgYW5kIHJlY29tcHV0ZSB0aGVtIGluY2FzZSBhIHNjaGVtYSBkaWQgaW5mYWN0IGNoYW5nZQotICAgICAgLy8KLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsgIAotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbkltcGwpaS5uZXh0KCk7Ci0gICAgICAgIC8vZWQuZWxlbWVudEF0dHJpYnV0ZXNDaGFuZ2VkKGVkLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZWQuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgdGQgPSBlZC5yZXNvbHZlVHlwZURlZmluaXRpb24odGQuZ2V0U2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHRkLmdldE5hbWUoKSk7ICAgICAgICAKLSAgICAgICAgZWQuc2V0VHlwZURlZmluaXRpb24odGQpOwotICAgICAgfSovICAKLSAgICB9Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvRG9jdW1lbnRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL0RvY3VtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzEzM2M1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvRG9jdW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1hYnN0cmFjdCBjbGFzcyBEb2N1bWVudEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIKLXsKLSAgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0KLSAgcHVibGljIERvY3VtZW50QWRhcHRlcihEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLSAgICAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotICAgIGFkYXB0Q2hpbGRFbGVtZW50cyhkb2N1bWVudCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRhcHRDaGlsZEVsZW1lbnRzKE5vZGUgcGFyZW50Tm9kZSkKLSAgewotICAgIGZvciAoTm9kZSBjaGlsZCA9IHBhcmVudE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0gICAgewotICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIGFkYXB0KChFbGVtZW50KSBjaGlsZCk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRhcHQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKCgoSU5vZGVOb3RpZmllcikgZWxlbWVudCkuZ2V0RXhpc3RpbmdBZGFwdGVyKHRoaXMpID09IG51bGwpCi0gICAgewotICAgICAgKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotICAgICAgYWRhcHRDaGlsZEVsZW1lbnRzKGVsZW1lbnQpOyAgCi0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlID09IHRoaXM7Ci0gIH0KLQotICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KTsKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL01vZGVsUmVjb25jaWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9Nb2RlbFJlY29uY2lsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY4NTY3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL01vZGVsUmVjb25jaWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZGVsUmVjb25jaWxlQWRhcHRlciBleHRlbmRzIERvY3VtZW50QWRhcHRlciBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxpbmdOb3RpZnlDaGFuZ2VkID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gIHB1YmxpYyBNb2RlbFJlY29uY2lsZUFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBzdXBlcihkb2N1bWVudCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb2RlQWRhcHRlciBsaXN0ZW5lcikKLSAgewotICAgIGlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLSAgICB7Ci0gICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vZGVBZGFwdGVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0gIAotICAKLSAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGxpc3RlbmVycyk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElOb2RlQWRhcHRlciBhZGFwdGVyID0gKElOb2RlQWRhcHRlcilpLm5leHQoKTsKLSAgICAgIGFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmllciwgZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpOwotICAgIH0gIAotICB9Ci0gICAgICAKLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkKLSAgewotICAgIGlmICghaGFuZGxpbmdOb3RpZnlDaGFuZ2VkKQotICAgIHsKLSAgICAgIGhhbmRsaW5nTm90aWZ5Q2hhbmdlZCA9IHRydWU7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaGFuZGxlTm90aWZ5Q2hhbmdlKG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotICAgICAgICBub3RpZnlMaXN0ZW5lcnMobm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0vLyAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKGUpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBoYW5kbGluZ05vdGlmeUNoYW5nZWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZU5vZGVDaGFuZ2VkKE5vZGUgbm9kZSkKLSAgeyAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaGFuZGxlTm90aWZ5Q2hhbmdlKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KQotICB7Ci0gICAgTm9kZSBub2RlID0gKE5vZGUpbm90aWZpZXI7Ci0gICAgc3dpdGNoIChldmVudFR5cGUpCi0gICAgewotICAgICAgY2FzZSBJTm9kZU5vdGlmaWVyLkFERDoKLSAgICAgIHsKLSAgICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KW5ld1ZhbHVlOwotICAgICAgICAgIGFkYXB0KGVsZW1lbnQpOwotICAgICAgICB9ICAKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIElOb2RlTm90aWZpZXIuUkVNT1ZFOgotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgSU5vZGVOb3RpZmllci5DSEFOR0U6Ci0gICAgICBjYXNlIElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQ6Ci0gICAgICB7IAotICAgICAgICBoYW5kbGVOb2RlQ2hhbmdlZChub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAKLSAgICAgIGNhc2UgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQ6Ci0gICAgICB7Ci0gICAgICAgIC8vIElmIHRoZSBvbmx5IHRoaW5nIGNoYW5nZWQgd2FzIHRoZSBjb250ZW50IG9mIGEgdGV4dCBub2RlCi0gICAgICAgIC8vIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byByZWNvbmNpbGUuCi0gICAgICAgIAotICAgICAgICBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIFRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaGFuZGxlTm9kZUNoYW5nZWQobm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgICAgICAgICAgICAKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9TZWxlY3Rpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMwNzg0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VsZWN0aW9uQWRhcHRlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlcgotewotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgZXZlbnRTb3VyY2U7Ci0KLSAgcHVibGljIHZvaWQgc2V0RXZlbnRTb3VyY2UoSVNlbGVjdGlvblByb3ZpZGVyIGV2ZW50U291cmNlKQotICB7Ci0gICAgdGhpcy5ldmVudFNvdXJjZSA9IGV2ZW50U291cmNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIAotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0aW9uOwotICB9ICAgIAotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBzcGVjaWFsaXplZCB0byByZXR1cm4gdGhlIGNvcnJlY3Qgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlICdvdGhlcicgbW9kZWwKLSAgICovCi0gIGFic3RyYWN0IHByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChPYmplY3Qgb2JqZWN0KTsKLQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBtb2RlbFNlbGVjdGlvbikgIAotICB7IAotICAgIExpc3Qgb3RoZXJNb2RlbE9iamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKG1vZGVsU2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbiltb2RlbFNlbGVjdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gaS5uZXh0KCk7IAotICAgICAgICBPYmplY3Qgb3RoZXJNb2RlbE9iamVjdCA9IGdldE9iamVjdEZvck90aGVyTW9kZWwobW9kZWxPYmplY3QpOyAgICAgICAKLSAgICAgICAgaWYgKG90aGVyTW9kZWxPYmplY3QgIT0gbnVsbCkKLSAgICAgICAgeyAKLSAgICAgICAgICBvdGhlck1vZGVsT2JqZWN0TGlzdC5hZGQob3RoZXJNb2RlbE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgCi0gICAgU3RydWN0dXJlZFNlbGVjdGlvbiBub2RlU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob3RoZXJNb2RlbE9iamVjdExpc3QpOwotICAgIHNlbGVjdGlvbiA9IG5vZGVTZWxlY3Rpb247Ci0gICAgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChldmVudFNvdXJjZSAhPSBudWxsID8gZXZlbnRTb3VyY2UgOiB0aGlzLCBub2RlU2VsZWN0aW9uKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1R5cGVzSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1R5cGVzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzZmOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9UeXBlc0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlc0hlbHBlcgotewotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBWZWN0b3IgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICBwdWJsaWMgVHlwZXNIZWxwZXIoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpCi0gIHsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgY29udGVudHMgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNESW1wb3J0SW1wbCBhbkltcG9ydCA9IChYU0RJbXBvcnRJbXBsKSBjb250ZW50OwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhbkltcG9ydC5nZXRTY2hlbWFMb2NhdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGFuSW1wb3J0LmltcG9ydFNjaGVtYSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvLyBUT0RPIFRoaXMgbWV0aG9kIGFuZCBpdCdzIHZlcnkgc2ltaWxhciBnZXRCdWlsdEluVHlwZU5hbWVzTGlzdDIgc2hvdWxkIAotICAvLyBiZSByZXZpZXdlZCBhbmQgY29tYmluZWQgaWYgcG9zc2libGUuIEJvdGggc2VlbSB0byBiZSB1c2VkIGZyb20gCi0gIC8vIFhTRE1vZGVsUXVlcnlFeHRlbnNpb24gZm9yIGNvbnRlbnQgYXNzaXN0IHB1cnBvc2VzLgotICAKLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCkKLSAgewotICAgIExpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBwcmVmaXggPSB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKTsKLSAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hIHNjaGVtYUZvclNjaGVtYSA9IFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYUZvclNjaGVtYS5nZXRTaW1wbGVUeXBlSWRNYXAoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IChYU0RUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7ICAKLSAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gdGQuZ2V0TmFtZSgpOyAKLSAgICAgICAgICBTdHJpbmcgcHJlZml4ZWROYW1lID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOyAKLSAgICAgICAgICBpdGVtcy5hZGQocHJlZml4ZWROYW1lKTsgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIC8vIGlzc3VlIChjcykgZG8gd2Ugc3RpbGwgbmVlZCB0aGlzPyAgaXQgY2FuIGxpa2VseSBiZSByZW1vdmUgbm93Ci0gIC8vIHdhcyB1c2VkIGZvciBjb250ZW50IGFzc2lzdCBidXQgSSBkb24ndCB0aGluayB3ZSByZWFsbHkgbmVlZCBpdAotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QyKCkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IHByZWZpeGVzID0gZ2V0UHJlZml4ZXNGb3JOYW1lc3BhY2UoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpKTsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWFGb3JTY2hlbWEgPSBYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYShYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gc2NoZW1hRm9yU2NoZW1hLmdldFNpbXBsZVR5cGVJZE1hcCgpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOyAgCi0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSB0ZC5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBwcmVmaXhlcy5zaXplKCkgPiAwID8gKFN0cmluZylwcmVmaXhlcy5nZXQoMCkgOiBudWxsOwotICAgICAgICBTdHJpbmcgcHJlZml4ZWROYW1lID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOyAKLSAgICAgICAgcmVzdWx0LmFkZChwcmVmaXhlZE5hbWUpOyAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGl0ZW1zLmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKHR5cGVEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCB0eXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLQkJCSAgICBpdGVtcy5hZGRBbGwoZ2V0UHJlZml4ZWROYW1lcyh0eXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgdHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKSk7ICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGl0ZW1zID0gKFZlY3Rvcikgc29ydExpc3QoaXRlbXMpOwotICAgIH0KLSAgICByZXR1cm4gaXRlbXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyU2ltcGxlVHlwZXMoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGl0ZW1zLmFkZCh0eXBlRGVmaW5pdGlvbik7Ci0gICAgICAgICAgLy9pdGVtcy5hZGQodHlwZURlZmluaXRpb24uZ2V0UU5hbWUoeHNkU2NoZW1hKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIFdlIG5lZWQgdG8gYWRkIHRoZSBhbnlUeXBlCi0vLyAgICAgIGl0ZW1zLmFkZChnZXRQcmVmaXgoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpLCB0cnVlKSArICJhbnlUeXBlIik7Ci0gICAgICAKLSAgICAgIC8vICAgICAgaXRlbXMgPSBhZGRFeHRlcm5hbEltcG9ydGVkVXNlclNpbXBsZVR5cGVzKGl0ZW1zKTsKLSAgICAgIC8vaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBucywgYm9vbGVhbiB3aXRoQ29sb24pCi0gIHsKLSAgICBTdHJpbmcga2V5ID0gIiI7Ci0KLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgTWFwIG1hcCA9IHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICBJdGVyYXRvciBpdGVyID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBrZXlPYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbWFwLmdldChrZXlPYmopOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpLmVxdWFscyhucykpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoa2V5T2JqICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAga2V5ID0ga2V5T2JqLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBrZXkgPSAiIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICgha2V5LmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIGlmICh3aXRoQ29sb24pCi0gICAgICAgIHsKLSAgICAgICAgICBrZXkgPSBrZXkgKyAiOiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGtleTsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRHbG9iYWxFbGVtZW50cygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudERlY2xhcmF0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyAgICAgIGl0ZW1zID0gYWRkRXh0ZXJuYWxJbXBvcnRlZEdsb2JhbEVsZW1lbnRzKGl0ZW1zKTsKLSAgICAgIGl0ZW1zID0gKFZlY3Rvcikgc29ydExpc3QoaXRlbXMpOwotICAgIH0KLSAgICByZXR1cm4gaXRlbXM7Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0R2xvYmFsQXR0cmlidXRlcygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpID0geHNkU2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZURlY2xhcmF0aW9uID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCB8fCAoYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCAmJiAhYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfSU5TVEFOQ0VfVVJJXzIwMDEpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyAgICAgIGl0ZW1zID0gYWRkRXh0ZXJuYWxJbXBvcnRlZEF0dHJpYnV0ZXMoaXRlbXMpOwotICAgICAgaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRHbG9iYWxBdHRyaWJ1dGVHcm91cHMoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIGlmICh4c2RTY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5nZXRRTmFtZSh4c2RTY2hlbWEpOwotICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXRlbXMuYWRkKG5hbWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gICAgICBpdGVtcyA9IGFkZEV4dGVybmFsSW1wb3J0ZWRBdHRyaWJ1dGVHcm91cHMoaXRlbXMpOwotICAgICAgaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRNb2RlbEdyb3VwcygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpID0geHNkU2NoZW1hLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWZpbml0aW9uID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyAgICAgIGl0ZW1zID0gYWRkRXh0ZXJuYWxJbXBvcnRlZEdyb3VwcyhpdGVtcyk7Ci0gICAgICBpdGVtcyA9IChWZWN0b3IpIHNvcnRMaXN0KGl0ZW1zKTsKLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW1zOwotICB9Ci0KLSAgLy8gaXNzdWUgKGNzKSBzc2VtcyBsaWtlIGEgcmF0aGVyIGdvb2Z5IHV0aWwgbWV0aG9kPwotICBwdWJsaWMgc3RhdGljIGphdmEudXRpbC5MaXN0IHNvcnRMaXN0KGphdmEudXRpbC5MaXN0IHR5cGVzKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNvcnQodHlwZXMpOyAvLyBwZXJmb3JtYW5jZT8gIG4qbG9nKG4pCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0vLyAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiU29ydCBmYWlsZWQiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci0KLSAgLy8gaXNzdWUgKGNzKSBkbyB3ZSBzdGlsbCBuZWVkIHRoaXM/Ci0gIHB1YmxpYyB2b2lkIHVwZGF0ZU1hcEFmdGVyRGVsZXRlKFhTREltcG9ydCBkZWxldGVkTm9kZSkKLSAgewotICAgIFN0cmluZyBucyA9IGRlbGV0ZWROb2RlLmdldE5hbWVzcGFjZSgpOwotICAgIGlmIChucyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXgobnMsIGZhbHNlKTsKLSAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gcHJlZml4LnRyaW0oKTsKLSAgICAgIH0KLSAgICAgIFN0cmluZyB4bWxuc0F0dHIgPSAocHJlZml4ID09ICIiKSA/ICJ4bWxucyIgOiAieG1sbnM6IiArIHByZWZpeDsKLQotICAgICAgaWYgKHByZWZpeCA9PSAiIikKLSAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgICAgewotICAgICAgICBNYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgICAgbWFwLnJlbW92ZShwcmVmaXgpOwotICAgICAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgICBzY2hlbWFFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSh4bWxuc0F0dHIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFByZWZpeGVkTmFtZXMoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gIiI7ICAgIAkJCQotICAgIH0KLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwgJiYgbG9jYWxOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBwcmVmaXhlcyA9IGdldFByZWZpeGVzRm9yTmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwcmVmaXhlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgCVN0cmluZyBwcmVmaXggPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgCWlmIChwcmVmaXggPT0gbnVsbCkgcHJlZml4ID0gIiI7Ci0gICAgICAgIFN0cmluZyBwcmVmaXhlZE5hbWUgPSBwcmVmaXgubGVuZ3RoKCkgPiAwID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOwotICAgICAgICBsaXN0LmFkZChwcmVmaXhlZE5hbWUpOyAgICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgaWYgKHByZWZpeGVzLnNpemUoKSA9PSAwKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChsb2NhbE5hbWUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0UHJlZml4ZXNGb3JOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBNYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgIE9iamVjdCB2YWx1ZSA9IG1hcC5nZXQocHJlZml4KTsKLSAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAgbGlzdC5hZGQocHJlZml4KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvVmlld1V0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvVmlld1V0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1YWMzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1ZpZXdVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLy8gaXNzdWUgKGNzKSBjYW4gd2UgZ2V0IHJpZCBvZiB0aGlzIGNsYXNzPwotLy8gSSd2ZSBzdHJpcHBlZCBpdCBkb3duIGEgd2hvbGUgbG90Li4uIGJ1dCBpdCdkIGJlIGdyZWF0IHRvIGdldCByaWQgb2YgaXQKLS8vCi1wdWJsaWMgY2xhc3MgVmlld1V0aWxpdHkKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgRm9udCBmb250OwotCi0gIHByaXZhdGUgc3RhdGljIEZvbnQgZ2V0Rm9udCgpCi0gIHsKLSAgICBpZiAoZm9udCA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgIAotICAgICAgZm9udCA9IG5ldyBGb250KERpc3BsYXkuZ2V0Q3VycmVudCgpLCAibXMgc2FucyBzZXJpZiIsIDgsIFNXVC5OT1JNQUwpOyAgCi0gICAgfQotICAgIHJldHVybiBmb250OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBvc2l0ZShDb21wb3NpdGUgY29tcCkKLSAgewotICAgIC8vIGRlcHJlY2F0ZWQuICBSZW1vdmUgbGF0ZXIKLSAgfQotICBwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgIGNvbXBvc2l0ZS5zZXRGb250KGdldEZvbnQoKSk7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMsIGJvb2xlYW4gaG9yaXpvbnRhbEZpbGwpCi0gIHsKLSAgICBpZiAoIWhvcml6b250YWxGaWxsKQotICAgIHsKLSAgICAgIGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIG51bUNvbHVtbnMpOwotICAgIH0KLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgY29tcG9zaXRlLnNldEZvbnQoZ2V0Rm9udCgpKTsKLQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUhvcml6b250YWxGaWxsZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IGhvcml6b250YWxTcGFuKSAKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBjcmVhdGluZyBsYWJlbHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSAKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0JcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIHRleHQpCi0JewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIHN0eWxlKTsKLS8vCQlzZXRDb2xvcihsYWJlbCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotICAKLSAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IGFsaWdubWVudCkKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gYWxpZ25tZW50OwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0KLSAKLQotCi0gIC8qKgotICAgKiBDcmVhdGUgcmFkaW8gYnV0dG9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0gICAgYnV0dG9uLnNldFRleHQobGFiZWwpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBtZXRob2QgZm9yIGNyZWF0aW5nIGNoZWNrIGJveAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSAKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICBidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ib0JveChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNvbWJvQm94KHBhcmVudCwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZUNvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gaXNSZWFkT25seSkKLSAgewotICAgIGludCBzdHlsZSA9IGlzUmVhZE9ubHkgPT0gdHJ1ZSA/IFNXVC5SRUFEX09OTFkgOiBTV1QuRFJPUF9ET1dOOwotCi0gICAgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBzdHlsZSk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIGNvbWJvOwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCkKLSAgewotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgLyoqCi0gICAqIDxjb2RlPmNyZWF0ZVdyYXBwZWRNdWx0aVRleHRGaWVsZDwvY29kZT4gY3JlYXRlcyBhIHdyYXBwZWQgbXVsdGl0ZXh0IGZpZWxkCi0gICAqCi0gICAqIEBwYXJhbSBwYXJlbnQgYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHZhbHVlCi0gICAqIEBwYXJhbSB3aWR0aCBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlCi0gICAqIEBwYXJhbSBudW1MaW5lcyBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIHJlcHJlc2VudGluZyBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBoZWlnaHQKLSAgICogQHBhcmFtIHZlcnRpY2FsRmlsbCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0gICAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiB2YWx1ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVdyYXBwZWRNdWx0aVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBudW1MaW5lcywgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGlmICh2ZXJ0aWNhbEZpbGwpCi0gICAgewotICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICB9ICAgICAgCi0gICAgZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLSAgICBGb250RGF0YVtdIGZvbnREYXRhID0gZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0gICAgLy8gaGFjayBmb3Igbm93IHdoZXJlIG9uIFdpbmRvd3MsIG9ubHkgMSBmb250ZGF0YSBleGlzdHMKLSAgICBkYXRhLmhlaWdodEhpbnQgPSBudW1MaW5lcyAqIGZvbnREYXRhWzBdLmdldEhlaWdodCgpOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZU11bHRpVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBpZiAodmVydGljYWxGaWxsKQotICAgIHsKLSAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgfSAgICAgIAotICAgIGRhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0gICAgZGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiB0ZXh0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRERPTUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RET01IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4Yzg0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRERPTUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vLyBpc3N1ZSAoY3MpIHJlbW92ZSB0aGlzIGNsYXNzISEKLXB1YmxpYyBjbGFzcyBYU0RET01IZWxwZXIKLXsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWE1MU2NoZW1hVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFhTRERPTUhlbHBlci4KLSAgICovCi0gIHB1YmxpYyBYU0RET01IZWxwZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGdldENoaWxkTm9kZShFbGVtZW50IHBhcmVudCwgU3RyaW5nIGNoaWxkTmFtZSkKLSAgewotLyogICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhYTUxTY2hlbWFVUkksIGNoaWxkTmFtZSk7Ci0gICAgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkKLSAgICAgIHJldHVybiBub2RlTGlzdC5pdGVtKDApOwotICAgIHJldHVybiBudWxsOwotKi8KLSAgICBOb2RlTGlzdCBsaXN0ID0gbnVsbDsKLSAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgfQotCi0gICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBQZXJmb3JtYW5jZSBpc3N1ZSBwZXJoYXBzPwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChsaXN0Lml0ZW0oaSkgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGxpc3QuaXRlbShpKS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoY2hpbGROYW1lKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5pdGVtKGkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0KLQotCi0gIHB1YmxpYyB2b2lkIGNoYW5nZURlcml2ZWRCeVR5cGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZGVyaXZlZEJ5VHlwZSwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBEb2N1bWVudCBkb2MgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQotICAgIFN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotICAgIHByZWZpeCA9IHByZWZpeCA9PSBudWxsID8gIiIgOiBwcmVmaXggKyAiOiI7Ci0KLSAgICBFbGVtZW50IGRlcml2ZWRCeUVsZW1lbnQgPSBnZXREZXJpdmVkQnlFbGVtZW50KGVsZW1lbnQpOwotICAgIAotICAgIGlmIChkZXJpdmVkQnlFbGVtZW50ICE9IG51bGwgJiYgZGVyaXZlZEJ5RWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoZGVyaXZlZEJ5VHlwZSkpCi0gICAgewotICAgIAlyZXR1cm47IC8vIGl0J3MgYWxyZWFkeSB0aGUgZGVyaXZlZCBieSB0eXBlCi0gICAgfQotICAgIEVsZW1lbnQgbmV3Tm9kZTsKLSAgCWlmIChkZXJpdmVkQnlUeXBlLmVxdWFscygicmVzdHJpY3Rpb24iKSkKLSAgCXsKLSAgICAJbmV3Tm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMoWFNERE9NSGVscGVyLlhNTFNjaGVtYVVSSSwgcHJlZml4ICsgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAJbmV3Tm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMoWFNERE9NSGVscGVyLlhNTFNjaGVtYVVSSSwgcHJlZml4ICsgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRyk7Ci0gICAgfQotCQotICAgIG5ld05vZGUuc2V0QXR0cmlidXRlKCJiYXNlIiwgdHlwZSk7Ci0KLSAgICBpZiAoZGVyaXZlZEJ5RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChkZXJpdmVkQnlFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBOb2RlTGlzdCBub2RlcyA9IGRlcml2ZWRCeUVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAvLyB1c2UgY2xvbmVzIHNvIHdlIGRvbid0IGhhdmUgYSByZWZyZXNoIHByb2JsZW0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsgICAgICAgCi0gICAgICAgICAgbmV3Tm9kZS5hcHBlbmRDaGlsZChub2RlLmNsb25lTm9kZSh0cnVlKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQkgIGVsZW1lbnQucmVwbGFjZUNoaWxkKG5ld05vZGUsIGRlcml2ZWRCeUVsZW1lbnQpOwotICAgIH0KLSAgICBlbHNlIAotCXsKLQkJRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudCkgZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7CQkJCS8vIGdldCBiYWNrIHRvIGNvbXBsZXhUeXBlCi0gICAgICAgIE5vZGVMaXN0IG5vZGVzID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJQXJyYXlMaXN0IG5vZGVTYXZlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIHNhdmUgY2hpbGRyZW4uIChub2RlcyB0dXJucyBvdXQgdG8gYmUgdGhlIHNhbWUgb2JqZWN0IGFzIHBhcmVudDsKLQkJLy8gZGVsZXRpbmcgdGhlbSBmcm9tIHBhcmVudCB3aWxsIGRlbGV0ZSB0aGVtIGZyb20gbm9kZXMuKQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCQkJCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOyAgICAgIAotCQkgIG5vZGVTYXZlTGlzdC5hZGQobm9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgY2hpbGRyZW4gc28gd2UgY2FuIHN1cnJvdW5kIHRoZW0gYnkgY29tcGxleENvbnRlbnQKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlU2F2ZUxpc3Quc2l6ZSgpOyBpKyspCQkJCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgbm9kZVNhdmVMaXN0LmdldChpKTsgICAgICAKLSAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0gICAgICAgIH0KLQkJCi0JCS8vIGJ1aWxkIGEgY29tcGxleENvbnRlbnQgZWxlbWVudAotCQlFbGVtZW50IGNvbXBsZXhDb250ZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhYU0RET01IZWxwZXIuWE1MU2NoZW1hVVJJLCBwcmVmaXggKyBYU0RDb25zdGFudHMuQ09NUExFWENPTlRFTlRfRUxFTUVOVF9UQUcpOwotCQlwYXJlbnQuYXBwZW5kQ2hpbGQoY29tcGxleENvbnRlbnQpOwkJCQkJLy8gaW5zZXJ0IGludG8gY29tcGxleFR5cGUKLQkJY29tcGxleENvbnRlbnQuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7CQkJCS8vIGluc2VydCBkZXJpdmF0aW9uIHR5cGUKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlU2F2ZUxpc3Quc2l6ZSgpOyBpKyspCQkJLy8gaW5zZXJ0IGNoaWxkcmVuIHByZXZpb3VzbHkgb2YgY29tcGxleFR5cGUKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBub2RlU2F2ZUxpc3QuZ2V0KGkpOyAgICAgICAKLSAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgfQotCQkKLQkJcGFyZW50LmFwcGVuZENoaWxkKGNvbXBsZXhDb250ZW50KTsKLQkJZm9ybWF0Q2hpbGQoY29tcGxleENvbnRlbnQpOwotICAgIH0KLSAgfQotCi0gIAotICAvKioKLSAgICogR2V0IHRoZSBkZXJpdmVkIGJ5IG5vZGUgZ2l2ZW4gdGhlIGNvbXBsZXhDb250ZW50IG9yIHNpbXBsZUNvbnRlbnQgbm9kZQotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RGVyaXZlZEJ5RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOb2RlIHJlc3RyaWN0aW9uQ2hpbGQgPSBnZXRDaGlsZE5vZGUoZWxlbWVudCwgInJlc3RyaWN0aW9uIik7Ci0gICAgTm9kZSBleHRlbnNpb25DaGlsZCA9IGdldENoaWxkTm9kZShlbGVtZW50LCAiZXh0ZW5zaW9uIik7Ci0gICAgaWYgKHJlc3RyaWN0aW9uQ2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocmVzdHJpY3Rpb25DaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoRWxlbWVudClyZXN0cmljdGlvbkNoaWxkOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoZXh0ZW5zaW9uQ2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZXh0ZW5zaW9uQ2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gKEVsZW1lbnQpZXh0ZW5zaW9uQ2hpbGQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAKLSAgcHVibGljIEVsZW1lbnQgZ2V0RGVyaXZlZEJ5RWxlbWVudEZyb21TaW1wbGVUeXBlKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIE5vZGUgYXRvbWljID0gZ2V0Q2hpbGROb2RlKGVsZW1lbnQsICJyZXN0cmljdGlvbiIpOwotICAgIE5vZGUgbGlzdCA9IGdldENoaWxkTm9kZShlbGVtZW50LCAibGlzdCIpOwotICAgIE5vZGUgdW5pb24gPSBnZXRDaGlsZE5vZGUoZWxlbWVudCwgInVuaW9uIik7Ci0gICAgaWYgKGF0b21pYyBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JICB7Ci0JICAgIHJldHVybiAoRWxlbWVudClhdG9taWM7Ci0JICB9Ci0gICAgaWYgKGxpc3QgaW5zdGFuY2VvZiBFbGVtZW50KQotCSAgewotCSAgICByZXR1cm4gKEVsZW1lbnQpbGlzdDsKLQkgIH0KLSAgICBpZiAodW5pb24gaW5zdGFuY2VvZiBFbGVtZW50KQotCSAgewotCSAgICByZXR1cm4gKEVsZW1lbnQpdW5pb247Ci0JICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBkZXJpdmVkIGJ5IG5vZGUgZ2l2ZW4gdGhlIENvbXBsZXhUeXBlIG5vZGUKLSAgICogUmV0dXJucyB0aGUgZmlyc3Qgb25lLCBpZiBzYXksIHRoZSBJTlZBTElEIHNjaGVtYSBoYXMgbW9yZSB0aGFuIG9uZQotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RGVyaXZlZEJ5RWxlbWVudEZyb21Db21wbGV4VHlwZShFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOb2RlTGlzdCBubCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBqID0gMDsKLSAgICBmb3IgKGogPSAwOyBqIDwgbmwuZ2V0TGVuZ3RoKCk7IGorKykKLSAgICB7Ci0gICAgICBOb2RlIGFOb2RlID0gbmwuaXRlbShqKTsKLSAgICAgIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOyAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGFOb2RlLCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgRWxlbWVudCBkZXJpdmVkQnlOb2RlID0gZ2V0RGVyaXZlZEJ5RWxlbWVudCgoRWxlbWVudClubC5pdGVtKGopKTsKLSAgICByZXR1cm4gZGVyaXZlZEJ5Tm9kZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbnRlbnQgbW9kZWwgZ2l2ZW4gdGhlIENvbXBsZXhUeXBlIG5vZGUKLSAgICogUmV0dXJucyB0aGUgZmlyc3Qgb25lLCBpZiBzYXksIHRoZSBJTlZBTElEIHNjaGVtYSBoYXMgbW9yZSB0aGFuIG9uZQotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0Q29udGVudE1vZGVsRnJvbVBhcmVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOb2RlTGlzdCBubCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBqID0gMDsKLSAgICBib29sZWFuIG1vZGVsRXhpc3RzID0gZmFsc2U7Ci0gICAgaW50IGxlbmd0aCA9IG5sLmdldExlbmd0aCgpOwotICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7IGorKykKLSAgICB7Ci0gICAgICBOb2RlIGFOb2RlID0gbmwuaXRlbShqKTsKLSAgICAgIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7IAotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLkNIT0lDRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBtb2RlbEV4aXN0cyA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgbW9kZWxFeGlzdHMgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFtb2RlbEV4aXN0cykKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBFbGVtZW50IGRlcml2ZWRCeU5vZGUgPSAoRWxlbWVudClubC5pdGVtKGopOwotICAgIHJldHVybiBkZXJpdmVkQnlOb2RlOwotICB9Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2hhbmdlQ29udGVudE1vZGVsKEVsZW1lbnQgY29tcGxleFR5cGVFbGVtZW50LCBTdHJpbmcgY29udGVudE1vZGVsLCBFbGVtZW50IHNlcXVlbmNlQ2hvaWNlT3JBbGxFbGVtZW50KQotICB7Ci0gICAgRG9jdW1lbnQgZG9jID0gY29tcGxleFR5cGVFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQotICAgIFN0cmluZyBwcmVmaXggPSBjb21wbGV4VHlwZUVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgcHJlZml4ID0gcHJlZml4ID09IG51bGwgPyAiIiA6IHByZWZpeCArICI6IjsKLSAgICAKLSAgICBFbGVtZW50IGNvbnRlbnRNb2RlbEVsZW1lbnQgPSBnZXRDb250ZW50TW9kZWxGcm9tUGFyZW50KGNvbXBsZXhUeXBlRWxlbWVudCk7Ci0KLSAgICBpZiAoY29udGVudE1vZGVsRWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoY29udGVudE1vZGVsKSkKLSAgICB7Ci0gICAgICByZXR1cm47IC8vIGl0J3MgYWxyZWFkeSB0aGUgY29udGVudCBtb2RlbCAKLSAgICB9Ci0gICAgRWxlbWVudCBuZXdOb2RlOwotICAgIG5ld05vZGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TKFhTRERPTUhlbHBlci5YTUxTY2hlbWFVUkksIHByZWZpeCArIGNvbnRlbnRNb2RlbCk7Ci0KLSAgICBpZiAoY29udGVudE1vZGVsRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpCi0gICAgeyAgICAgICAgCi0gICAgICBOb2RlTGlzdCBub2RlcyA9IGNvbnRlbnRNb2RlbEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgLy8gdXNlIGNsb25lcyBzbyB3ZSBkb24ndCBoYXZlIGEgcmVmcmVzaCBwcm9ibGVtCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChub2RlLmdldExvY2FsTmFtZSgpLmVxdWFscyhYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRykpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCEoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGNvbnRlbnRNb2RlbEVsZW1lbnQsIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGNvbnRlbnRNb2RlbEVsZW1lbnQsIFhTRENvbnN0YW50cy5DSE9JQ0VfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjb250ZW50TW9kZWxFbGVtZW50LCBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCBmYWxzZSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobm9kZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKSB8fAotICAgICAgICAgICAgICAgICAgICBub2RlLmdldExvY2FsTmFtZSgpLmVxdWFscyhYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgICAgIGlmIChzZXF1ZW5jZUNob2ljZU9yQWxsRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHNlcXVlbmNlQ2hvaWNlT3JBbGxFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKG5vZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY29tcGxleFR5cGVFbGVtZW50LnJlcGxhY2VDaGlsZChuZXdOb2RlLCBjb250ZW50TW9kZWxFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNsb25lRWxlbWVudChFbGVtZW50IHBhcmVudCwgRWxlbWVudCBzb3VyY2VOb2RlKQotICB7Ci0gICAgRG9jdW1lbnQgZG9jID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBTdHJpbmcgcHJlZml4ID0gcGFyZW50LmdldFByZWZpeCgpOwotICAgIHByZWZpeCA9IHByZWZpeCA9PSBudWxsID8gIiIgOiBwcmVmaXggKyAiOiI7Ci0gICAgCi0gICAgRWxlbWVudCBuZXdOb2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhYU0RET01IZWxwZXIuWE1MU2NoZW1hVVJJLCBwcmVmaXggKyBzb3VyY2VOb2RlLmdldExvY2FsTmFtZSgpKTsKLQotICAgIGlmIChzb3VyY2VOb2RlLmhhc0NoaWxkTm9kZXMoKSkKLSAgICB7ICAgICAgICAKLSAgICAgIE5vZGVMaXN0IG5vZGVzID0gc291cmNlTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAvLyB1c2UgY2xvbmVzIHNvIHdlIGRvbid0IGhhdmUgYSByZWZyZXNoIHByb2JsZW0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLSAgICAgICAgbmV3Tm9kZS5hcHBlbmRDaGlsZChub2RlLmNsb25lTm9kZSh0cnVlKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXdOb2RlOwotLy8gICAgcGFyZW50LnJlcGxhY2VDaGlsZChuZXdOb2RlLCBzb3VyY2VOb2RlKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNPbmx5V2hpdGVzcGFjZShOb2RlIG5vZGUpCi0gIHsKLSAgICBOb2RlTGlzdCBsaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IGxlbmd0aCA9IGxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgYm9vbGVhbiBoYXNPbmx5V2hpdGVzcGFjZSA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIGNoaWxkID0gbGlzdC5pdGVtKGkpOwotICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0gICAgICB7Ci0gICAgICAgIGhhc09ubHlXaGl0ZXNwYWNlID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBjaGlsZC5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgU3RyaW5nIHRyaW1tZWRWYWx1ZSA9IHZhbHVlLnRyaW0oKTsKLSAgICAgICAgaWYgKHRyaW1tZWRWYWx1ZS5sZW5ndGgoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaGFzT25seVdoaXRlc3BhY2UgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICAgIAotICAgIHJldHVybiBoYXNPbmx5V2hpdGVzcGFjZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShOb2RlIG5vZGUpCi0gIHsKLSAgICBOb2RlIHBhcmVudE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAKLSAgICBOb2RlIG5leHRFbGVtZW50ID0gZ2V0TmV4dEVsZW1lbnROb2RlKG5vZGUpOwotICAgIE5vZGUgcHJldmlvdXNFbGVtZW50ID0gZ2V0UHJldmlvdXNFbGVtZW50Tm9kZShub2RlKTsKLQotICAgIE5vZGUgbmV4dFNpYmxpbmcgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgaWYgKG5leHRTaWJsaW5nIGluc3RhbmNlb2YgVGV4dCkKLSAgICB7Ci0gICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5leHRTaWJsaW5nKTsKLSAgICB9Ci0KLSAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsKQotICAgIHsKLQkJICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwotICAgIH0KLQotICAgIGlmIChuZXh0RWxlbWVudCAhPSBudWxsKQotICAgIHsKLQkJCWZvcm1hdENoaWxkKG5leHRFbGVtZW50KTsKLSAgICB9Ci0KLQkJaWYgKHByZXZpb3VzRWxlbWVudCAhPSBudWxsKQotCQl7Ci0JCQlmb3JtYXRDaGlsZChwcmV2aW91c0VsZW1lbnQpOwotCQl9Ci0gIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmb3JtYXRDaGlsZChOb2RlIGNoaWxkKQotCXsKLSAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICBJRE9NTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKWNoaWxkKS5nZXRNb2RlbCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotICAgICAgICAKLQkgICAgICBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0JCSAgICBmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShjaGlsZCk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5jaGFuZ2VkTW9kZWwoKTsgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotCi0gIHByaXZhdGUgc3RhdGljIE5vZGUgZ2V0TmV4dEVsZW1lbnROb2RlKE5vZGUgbm9kZSkKLSAgewotICAgIE5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAKLSAgICB3aGlsZSAoIShuZXh0IGluc3RhbmNlb2YgRWxlbWVudCkgJiYgbmV4dCAhPSBudWxsKQotICAgIHsKLSAgICAgIG5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0gICAgfQotICAgIGlmIChuZXh0IGluc3RhbmNlb2YgVGV4dCkKLSAgICB7Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gbmV4dDsKLSAgfQotCi0JcHJpdmF0ZSBzdGF0aWMgTm9kZSBnZXRQcmV2aW91c0VsZW1lbnROb2RlKE5vZGUgbm9kZSkKLQl7Ci0JCU5vZGUgcHJldmlvdXMgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotICAgIAotCQl3aGlsZSAoIShwcmV2aW91cyBpbnN0YW5jZW9mIEVsZW1lbnQpICYmIHByZXZpb3VzICE9IG51bGwpCi0JCXsKLQkJCXByZXZpb3VzID0gcHJldmlvdXMuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCX0KLSAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBUZXh0KQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gcHJldmlvdXM7Ci0JfQotCi0gCi0KLSAgLy8gaXNzdWUgKGNzKSB3aGF0J3MgdGhpcyBtZXRob2Qgc3VwcG9zZWQgdG8gZG8/Ci0gIC8vIGJpenphcmUgbmFtZQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5wdXRFcXVhbHMoT2JqZWN0IGlucHV0LCBTdHJpbmcgdGFnbmFtZSwgYm9vbGVhbiBpc1JlZikKLSAgewotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGlucHV0OwotICAgICAgaWYgKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQotICAgICAgewotICAgICAgICBib29sZWFuIHJlZlByZXNlbnQgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgicmVmIik7Ci0KLSAgICAgICAgcmV0dXJuIHJlZlByZXNlbnQgPT0gaXNSZWY7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzZDkxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLSAgICBwcm90ZWN0ZWQgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwgc2NoZW1hTG9jYXRvciA9IG5ldyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbCgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyLmNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHNjaGVtYUxvY2F0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDk4NWI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdG9yOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXIKLXsKLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVTY2hlbWFMb2NhdGlvbihYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgc2NoZW1hTG9jYXRpb25VUkkpCi0gICAgewotICAgICAgU3RyaW5nIGJhc2VMb2NhdGlvbiA9IHhzZFNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOyAgICAgIAotICAgICAgU3RyaW5nIHJlc3VsdCA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlTG9jYXRpb24sIG5hbWVzcGFjZVVSSSwgc2NoZW1hTG9jYXRpb25VUkkpOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAJcmVzdWx0ID0gbmFtZXNwYWNlVVJJOwotICAgICAgfQotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAJcmVzdWx0ID0gIiI7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGF0cGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzOwotICAgIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbHMvT3Blbk9uU2VsZWN0aW9uSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlscy9PcGVuT25TZWxlY3Rpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUxYWE3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlscy9PcGVuT25TZWxlY3Rpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5JbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8vIGlzc3VlIChjcykgY2FuIHdlIHJlbW92ZSB0aGlzPwotLy8KLXB1YmxpYyBjbGFzcyBPcGVuT25TZWxlY3Rpb25IZWxwZXIKLXsKLSAgCi0gIHByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dEVkaXRvciB0ZXh0RWRpdG9yOwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLQotIAotICBwdWJsaWMgT3Blbk9uU2VsZWN0aW9uSGVscGVyKFN0cnVjdHVyZWRUZXh0RWRpdG9yIHRleHRFZGl0b3IsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgCXRoaXMudGV4dEVkaXRvciA9IHRleHRFZGl0b3I7Ci0gIAl0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotICAKLQotICBib29sZWFuIGxhc3RSZXN1bHQ7Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlblhTREVkaXRvcihYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAKLSAgICBPcGVuSW5OZXdFZGl0b3Iub3BlblhTREVkaXRvcihlZGl0b3JJbnB1dCwgc2NoZW1hLCBzY2hlbWEpOyAgICAKLSAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlblhTREVkaXRvcihTdHJpbmcgc2NoZW1hTG9jYXRpb24pCi0gIHsKLSAgICBJUGF0aCBzY2hlbWFQYXRoID0gbmV3IFBhdGgoc2NoZW1hTG9jYXRpb24pOwotCQlmaW5hbCBJRmlsZSBzY2hlbWFGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHNjaGVtYVBhdGgpOwotCQotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLQkJewotCQkJLyoqCi0JCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBydW4oKQotCQkJewotCQkJCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCWlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXRyeQotCQkJCQl7Ci0JCQkJCSAgd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoc2NoZW1hRmlsZSksIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBpbml0RXgpCi0JCQkJCXsKLQkJCQkJICBpbml0RXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpCi0JCQkJCXsKLQkJCQkJICBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfSAgICAgICAgICAKLQkJCX0KLQkJfSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHJldmVhbE9iamVjdChmaW5hbCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50LmdldFJvb3RDb250YWluZXIoKS5lcXVhbHMoeHNkU2NoZW1hKSkKLSAgICB7Ci0gICAgICBOb2RlIGVsZW1lbnQgPSBjb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKQotICAgICAgewotICAgICAgICBJbmRleGVkUmVnaW9uIGluZGV4Tm9kZSA9IChJbmRleGVkUmVnaW9uKSBlbGVtZW50OwotICAgICAgICB0ZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKS5zZXRSYW5nZUluZGljYXRpb24oaW5kZXhOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4Tm9kZS5nZXRFbmRPZmZzZXQoKSAtIGluZGV4Tm9kZS5nZXRTdGFydE9mZnNldCgpLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsYXN0UmVzdWx0ID0gZmFsc2U7Ci0gICAgICBpZiAoY29tcG9uZW50LmdldFNjaGVtYSgpICE9IG51bGwpCi0gICAgICB7Ci0JCQkJU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChjb21wb25lbnQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgIElQYXRoIHNjaGVtYVBhdGggPSBuZXcgUGF0aChzY2hlbWFMb2NhdGlvbik7Ci0JCQkJZmluYWwgSUZpbGUgc2NoZW1hRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShzY2hlbWFQYXRoKTsKLSAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCSAgICAgICAgICovCi0JICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotCSAgICAgICAgewotCQkgICAgICAgIGZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkgICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLQkJICAgICAgICB7Ci0JCQkJCQkJdHJ5Ci0JCQkJCQkJewotCQkJCQkJCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoc2NoZW1hRmlsZSksIFhTREVkaXRvclBsdWdpbi5QTFVHSU5fSUQpOwotCQkJCQkJCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQkoKEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKWVkaXRvclBhcnQpLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShjb21wb25lbnQpOwotCQkJCQkJCQkJbGFzdFJlc3VsdCA9IHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGluaXRFeCkKLQkJCQkJCQl7Ci0JCQkJCQkJfQotCQkJCQkJfSAgICAgICAgICAKLQkJCQkJfQotCQkJCX0pOwotICAgICAgfQotICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgWFNETmFtZWRDb21wb25lbnQgb3Blbk9uR2xvYmFsUmVmZXJlbmNlKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXApCi0gIHsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0geHNkU2NoZW1hOwotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgIHsKLSAgICAgIG5hbWUgPSAoKFhTRE5hbWVkQ29tcG9uZW50KSBjb21wKS5nZXROYW1lKCk7Ci0gICAgfQotICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgewotICAgICAgLy8gRm9yIEFub255bW91cyB0eXBlcywganVzdCBzaG93IHRoZSBlbGVtZW50Ci0gICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKSBjb21wOwotICAgICAgICBjb21wID0gdHlwZS5nZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIG5hbWUgPSAoKFhTRE5hbWVkQ29tcG9uZW50KSBjb21wKS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKHNjaGVtYSA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBMaXN0IG9iamVjdHMgPSBudWxsOyAgICAKLSAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBvYmplY3RzID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG9iamVjdHMgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgb2JqZWN0cyA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG9iamVjdHMgPSBzY2hlbWEuZ2V0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG9iamVjdHMgPSBzY2hlbWEuZ2V0TW9kZWxHcm91cERlZmluaXRpb25zKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBvYmplY3RzID0gc2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotICAgIH0KLQotICAgIGlmIChvYmplY3RzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcCA9IChYU0ROYW1lZENvbXBvbmVudCkgaXRlci5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAobmFtZWRDb21wLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXZlYWxPYmplY3QobmFtZWRDb21wKTsKLSAgICAgICAgICByZXR1cm4gbmFtZWRDb21wOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBvcGVuT25TZWxlY3Rpb24oKQotICB7Ci0gICAgTGlzdCBzZWxlY3RlZE5vZGVzID0gbnVsbDsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgIHNlbGVjdGVkTm9kZXMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpOwotICAgIH0KLQotICAgIGlmIChzZWxlY3RlZE5vZGVzICE9IG51bGwgJiYgIXNlbGVjdGVkTm9kZXMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNlbGVjdGVkTm9kZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXAgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudCgoTm9kZSlvYmopOwotICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IG9iamVjdFRvUmV2ZWFsID0gbnVsbDsKLQotICAgICAgICAgIGlmICh4c2RDb21wIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHhzZENvbXA7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudERlY2wuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBlbGVtZW50RGVjbC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0eXBlRGVmID0gbnVsbDsKLSAgICAgICAgICAgICAgaWYgKGVsZW1lbnREZWNsLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR5cGVEZWYgPSBlbGVtZW50RGVjbC5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBzdWJHcm91cEFmZmlsaWF0aW9uID0gZWxlbWVudERlY2wuZ2V0U3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbigpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKHR5cGVEZWYgIT0gbnVsbCAmJiBzdWJHcm91cEFmZmlsaWF0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIDIgdGhpbmdzIHdlIGNhbiBuYXZpZ2F0ZSB0bywgaWYgdGhlIGN1cnNvciBpcyBhbnl3aGVyZSBvbiB0aGUgc3Vic3RpdHV0aW9uIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgIC8vIHRoZW4ganVtcCB0byB0aGF0LCBvdGhlcndpc2UganVzdCBnbyB0byB0aGUgdHlwZURlZi4KLSAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQXR0ciAmJiAoKEF0dHIpb2JqKS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBzdWJHcm91cEFmZmlsaWF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHJldmVhbCB0aGUgdHlwZSBub3cuICBPbiBzdWNjZXNzLCB0aGVuIHdlIHJldHVybiB0cnVlLgotICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgZmFpbCwgc2V0IHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgYXMgdGhlIG9iamVjdCB0byByZXZlYWwgYXMgYSBiYWNrdXAgcGxhbi4KLSAgICAgICAgICAgICAgICAgIGlmIChyZXZlYWxPYmplY3QodHlwZURlZikpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IHN1Ykdyb3VwQWZmaWxpYXRpb247Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG9uZSBvciBtb3JlIG9mIHRoZXNlIGlzIG51bGwuICBJZiB0aGUgdHlwZURlZiBpcyBub24tbnVsbCwgdXNlIGl0LiAgT3RoZXJ3aXNlCi0gICAgICAgICAgICAgICAgLy8gdHJ5IGFuZCB1c2UgdGhlIHN1YnN0aXR1dGlvbiBncm91cAotICAgICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gdHlwZURlZiAhPSBudWxsID8gdHlwZURlZiA6IHN1Ykdyb3VwQWZmaWxpYXRpb247Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGVsZW1lbnREZWNsID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSB4c2RDb21wOwotICAgICAgICAgICAgaWYgKGVsZW1lbnREZWNsLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBlbGVtZW50RGVjbC5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHhzZENvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgeHNkQ29tcDsKLSAgICAgICAgICAgIGlmIChhdHRyRGVjbC5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYXR0ckRlY2wuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IGF0dHJEZWNsLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwRGVmID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgeHNkQ29tcDsKLSAgICAgICAgICAgIGlmIChhdHRyR3JvdXBEZWYuaXNBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBhdHRyR3JvdXBEZWYuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZENvbnN0cmFpbnREZWYgPSAoWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbikgeHNkQ29tcDsKLSAgICAgICAgICAgIGlmIChpZENvbnN0cmFpbnREZWYuZ2V0UmVmZXJlbmNlZEtleSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gaWRDb25zdHJhaW50RGVmLmdldFJlZmVyZW5jZWRLZXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHhzZENvbXA7Ci0gICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IHR5cGVEZWYuZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0VG9SZXZlYWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gaWYgaXRlbVR5cGUgYXR0cmlidXRlIGlzIG5vdCBzZXQsIHRoZW4gY2hlY2sgZm9yIG1lbWJlclR5cGUKLSAgICAgICAgICAgICAgTGlzdCBtZW1iZXJUeXBlcyA9IHR5cGVEZWYuZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgICAgICAgIGlmIChtZW1iZXJUeXBlcyAhPSBudWxsICYmIG1lbWJlclR5cGVzLnNpemUoKSA+IDApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCltZW1iZXJUeXBlcy5nZXQoMCk7Ci0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh4c2RDb21wIGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IChYU0RUeXBlRGVmaW5pdGlvbikgeHNkQ29tcDsKLSAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gdHlwZURlZi5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh4c2RDb21wIGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgICAgICAgIHsKLSAgICAgICAgICAJWFNEU2NoZW1hRGlyZWN0aXZlIGRpcmVjdGl2ZSA9IChYU0RTY2hlbWFEaXJlY3RpdmUpIHhzZENvbXA7Ci0vLwkJCQkJCVN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woZGlyZWN0aXZlLmdldFJlc29sdmVkU2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0vLwkJCQkJCW9wZW5YU0RFZGl0b3Ioc2NoZW1hTG9jYXRpb24pOwotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IGRpcmVjdGl2ZS5nZXRSZXNvbHZlZFNjaGVtYSgpOwkJCQkJCSAgICAgICAgICAJICAgICAgICAgIAkKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBub3cgcmV2ZWFsIHRoZSBvYmplY3QgaWYgdGhpcyBpc24ndCBudWxsCi0gICAgICAgICAgaWYgKG9iamVjdFRvUmV2ZWFsICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJldmVhbE9iamVjdChvYmplY3RUb1JldmVhbCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTBjY2U4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBwZXJmb3JtcyB0aGUgYXMteW91LXR5cGUgdmFsaWRhdGlvbiBmb3Igc2NoZW1hIGZpbGVzCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRCBleHRlbmRzIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSWQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZCI7Ci0KLSAgcHJpdmF0ZSBWYWxpZGF0b3IgX3ZhbGlkYXRvcjsKLSAgCi0gIHB1YmxpYyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWFNEKCkgeyAKLSAgfQotICAKLSAgcHJpdmF0ZSBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCl7Ci0JICBpZiAoX3ZhbGlkYXRvciA9PSBudWxsKV92YWxpZGF0b3IgPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3IoSWQpOwotCSAgcmV0dXJuIF92YWxpZGF0b3I7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJVmFsaWRhdG9yIGdldERlbGVnYXRlVmFsaWRhdG9yKCkgewotCSAgVmFsaWRhdG9yIHYgPSBnZXRWYWxpZGF0b3IoKTsKLQkgIGlmICh2ID09IG51bGwpcmV0dXJuIG51bGw7Ci0JICByZXR1cm4gdi5hc0lWYWxpZGF0b3IoKTsKLSAgfQotICAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlbGVnYXRlVmFsaWRhdG9yRW5hYmxlZChJRmlsZSBmaWxlKSB7Ci0JCVZhbGlkYXRvciB2ID0gZ2V0VmFsaWRhdG9yKCk7Ci0JCWlmICh2ID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQlpZiAoIXYuc2hvdWxkVmFsaWRhdGUoZmlsZSwgZmFsc2UsIGZhbHNlKSlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB2LmlzQnVpbGRWYWxpZGF0aW9uKCkgfHwgdi5pc01hbnVhbFZhbGlkYXRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1lcmF0aW9uc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtZXJhdGlvbnNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmMTlmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1lcmF0aW9uc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotCi0KLS8qKgotICogRGlhbG9nIHRvIGhlbHAgZGVmaW5lIGEgbGlzdCBvZiBlbnVtZXJhdGlvbnMKLSAqIGZvciBhIGpvaW4uIFRoaXMgbWlnaHQgYmUgcmVwbGFjZWQgb25jZSB3ZSBrbm93IGhvdyB0bwotICogaW5pdGlhdGUgYSBkcmFnIHRyYWNrZXIKLSAqLwotCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRpb25zRGlhbG9nIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cKLXsKLSAgcHVibGljIEVudW1lcmF0aW9uc0RpYWxvZyhTaGVsbCBzaGVsbCkKLSAgewotICAgIHN1cGVyKHNoZWxsKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0VOVU1FUkFUSU9OU19ESUFMT0dfVElUTEUiKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkKLSAgewotICAgIGlmIChidXR0b25JZCA9PSBXaW5kb3cuT0spCi0gICAgewotICAgICAgdGV4dCA9IHRleHRGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICBkZWxpbWl0ZXIgPSBkZWxpbWl0ZXJGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICBpc1ByZXNlcnZlID0gcHJlc2VydmVXaGl0ZXNwYWNlLmdldFNlbGVjdGlvbigpOwotICAgIH0KLSAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIHRleHQsIGRlbGltaXRlcjsKLSAgcHJpdmF0ZSBib29sZWFuIGlzUHJlc2VydmU7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsgcmV0dXJuIHRleHQ7IH0KLSAgcHVibGljIFN0cmluZyBnZXREZWxpbWl0ZXIoKSB7IHJldHVybiBkZWxpbWl0ZXI7IH0KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVzZXJ2ZVdoaXRlc3BhY2UoKSB7IHJldHVybiBpc1ByZXNlcnZlOyB9Ci0KLSAgcHJpdmF0ZSBUZXh0IHRleHRGaWVsZDsKLSAgcHJpdmF0ZSBCdXR0b24gcHJlc2VydmVXaGl0ZXNwYWNlOwotICBwcml2YXRlIENvbWJvIGRlbGltaXRlckZpZWxkOwotICAvLwotICAvLyBDcmVhdGUgdGhlIGNvbnRyb2xzCi0gIC8vCi0gIHB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbnRyb2xbXSB0YWJPcmRlciA9IG5ldyBDb250cm9sWzNdOwotICAJaW50IHRhYkluZGV4ID0gMDsKLSAgICBDb21wb3NpdGUgY2xpZW50ID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCljbGllbnQuZ2V0TGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsgCi0KLSAgICB0ZXh0RmllbGQgPSBWaWV3VXRpbGl0eS5jcmVhdGVXcmFwcGVkTXVsdGlUZXh0RmllbGQoY2xpZW50LCA0MDAsIDIwLCB0cnVlKTsKLSAgICBHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgdGV4dEZpZWxkLmdldExheW91dERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgdGFiT3JkZXJbdGFiSW5kZXgrK10gPSB0ZXh0RmllbGQ7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0ZXh0RmllbGQsIFhTREVkaXRvckNTSGVscElkcy5BRERfRU5VTUVSQVRJT05TX19OT19OQU1FKTsKLQotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNsaWVudCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0RFTElNSVRFUl9DSEFSIikpOwotICAgIGRlbGltaXRlckZpZWxkID0gVmlld1V0aWxpdHkuY3JlYXRlQ29tYm9Cb3goY2xpZW50LCBmYWxzZSk7Ci0gICAgZ2QgPSAoR3JpZERhdGEpIGRlbGltaXRlckZpZWxkLmdldExheW91dERhdGEoKTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLSAgICBnZC53aWR0aEhpbnQgPSAzMDsKLSAgICB0YWJPcmRlclt0YWJJbmRleCsrXSA9IGRlbGltaXRlckZpZWxkOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGVsaW1pdGVyRmllbGQsIFhTREVkaXRvckNTSGVscElkcy5BRERfRU5VTUVSQVRJT05TX19ERUxJTUlURVJfQ0hBUlMpOwotCi0gICAgLy8gYWRkIGRlZmF1bHQgZGVsaW1pdGVycwotICAgIGRlbGltaXRlckZpZWxkLmFkZCgiOiIpOwotICAgIGRlbGltaXRlckZpZWxkLmFkZCgiLCIpOwotICAgIGRlbGltaXRlckZpZWxkLmFkZCgiICIpOwotICAgIC8vIHNldCB0aGUgY3VycmVudCBvbmUgdG8gYmUgJywnCi0gICAgZGVsaW1pdGVyRmllbGQuc2V0VGV4dCgiLCIpOwotCi0gICAgcHJlc2VydmVXaGl0ZXNwYWNlID0gVmlld1V0aWxpdHkuY3JlYXRlQ2hlY2tCb3goY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfUFJFU0VSVkVfV0hJVEVTUEFDRSIpKTsKLSAgICBnZCA9IChHcmlkRGF0YSkgcHJlc2VydmVXaGl0ZXNwYWNlLmdldExheW91dERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgdGFiT3JkZXJbdGFiSW5kZXgrK10gPSBwcmVzZXJ2ZVdoaXRlc3BhY2U7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcmVzZXJ2ZVdoaXRlc3BhY2UsIFhTREVkaXRvckNTSGVscElkcy5BRERfRU5VTUVSQVRJT05TX19QUkVTRVJWRV9MRUFEX0FORF9UUkFJTF9XSElURVNQQUNFUyk7Ci0gICAgCi0gICAgY2xpZW50LnNldFRhYkxpc3QodGFiT3JkZXIpOwotCi0gICAgcmV0dXJuIGNsaWVudDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9UeXBlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9UeXBlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTI5ZmVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpZGdldHMvVHlwZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgVHlwZVNlY3Rpb24KLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBUeXBlU2VjdGlvbi4KLSAgICogQHBhcmFtIHBhcmVudAotICAgKi8KLSAgcHVibGljIFR5cGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCBCdXR0b24gIHNpbXBsZVR5cGU7Ci0gIHByb3RlY3RlZCBCdXR0b24gIHVzZXJTaW1wbGVUeXBlOwotICBwcm90ZWN0ZWQgQnV0dG9uICB1c2VyQ29tcGxleFR5cGU7Ci0gIHByb3RlY3RlZCBCdXR0b24gIG5vbmVSYWRpbzsKLSAgcHJvdGVjdGVkIENvbWJvICAgdHlwZUxpc3Q7Ci0gIHByb3RlY3RlZCBDb21ibyAgIGRlcml2ZWRCeUNvbWJvOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93VXNlckNvbXBsZXhUeXBlID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1VzZXJTaW1wbGVUeXBlICA9IHRydWU7Ci0gIHByb3RlY3RlZCBib29sZWFuIHNob3dOb25lICAgICAgICAgICAgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0Rlcml2ZWRCeSAgICAgICA9IGZhbHNlOwotICBwcm90ZWN0ZWQgU3RyaW5nICBkZXJpdmVkQnlDaG9pY2VzW10gID0geyAicmVzdHJpY3Rpb24iLCAiZXh0ZW5zaW9uIiB9OwotICBwdWJsaWMgZmluYWwgaW50ICBOT05FICAgICAgICAgICAgICAgID0gMTsKLSAgcHVibGljIGZpbmFsIGludCAgQlVJTFRfSU4gICAgICAgICAgICA9IDI7Ci0gIHB1YmxpYyBmaW5hbCBpbnQgIFNJTVBMRSAgICAgICAgICAgICAgPSAzOwotICBwdWJsaWMgZmluYWwgaW50ICBDT01QTEVYICAgICAgICAgICAgID0gNDsKLQotICBTdHJpbmcgICAgICAgICAgICBzZWN0aW9uVGl0bGUgICAgICAgID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1RZUEVfSU5GT1JNQVRJT04iKTsKLSAgU3RyaW5nICAgICAgICAgICAgY3VycmVudE9iamVjdFV1aWQgICA9ICIiOwotCi0gIC8qCi0gICAqIEBzZWUgRmxhdFBhZ2VTZWN0aW9uI2NyZWF0ZUNsaWVudChDb21wb3NpdGUsIFdpZGdldEZhY3RvcnkpCi0gICAqLwotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNsaWVudChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgIGdsLnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgY2xpZW50LnNldExheW91dChnbCk7Ci0KLSAgICBpZiAoc2hvd05vbmUpCi0gICAgewotICAgICAgbm9uZVJhZGlvID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fTk9ORSIpKTsKLSAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChub25lUmFkaW8sIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9UWVBFX0hFTFBFUl9OT05FKTsKLSAgICB9Ci0KLSAgICBzaW1wbGVUeXBlID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fQlVJTFRfSU5fU0lNUExFX1RZUEUiKSk7Ci0gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKHNpbXBsZVR5cGUsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9UWVBFX0hFTFBFUl9CVUlMVF9JTik7Ci0KLSAgICBpZiAoc2hvd1VzZXJTaW1wbGVUeXBlKQotICAgIHsKLSAgICAgIHVzZXJTaW1wbGVUeXBlID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fVVNFUl9ERUZJTkVEX1NJTVBMRV9UWVBFIikpOwotICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKHVzZXJTaW1wbGVUeXBlLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfVFlQRV9IRUxQRVJfVVNFUl9ERUZJTkVEX1NJTVBMRSk7Ci0gICAgfQotCi0gICAgaWYgKHNob3dVc2VyQ29tcGxleFR5cGUpCi0gICAgewotICAgICAgdXNlckNvbXBsZXhUeXBlID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fVVNFUl9ERUZJTkVEX0NPTVBMRVhfVFlQRSIpKTsKLSAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh1c2VyQ29tcGxleFR5cGUsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9UWVBFX0hFTFBFUl9VU0VSX0RFRklORURfQ09NUExFWCk7Ci0gICAgfQotCi0gICAgLy8JICB0eXBlTGlzdCA9IHV0aWxpdHkuY3JlYXRlQ29tYm9Cb3goY2xpZW50KTsKLSAgICAvLwkgIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh0eXBlTGlzdCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX1RZUEVfSEVMUEVSX1RZUEUpOwotICAgIC8vICAgIHV0aWxpdHkuY3JlYXRlSGVhZGluZ0xhYmVsKGNsaWVudCwgIlR5cGUiLG51bGwpOwotCi0gICAgaWYgKHNob3dEZXJpdmVkQnkpCi0gICAgewotICAgICAgQ29tcG9zaXRlIGRlcml2ZWRCeUNvbXBvc2l0ZSA9IFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShjbGllbnQsIDIpOwotICAgICAgVmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoZGVyaXZlZEJ5Q29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfREVSSVZFRF9CWSIpKTsKLSAgICAgIGRlcml2ZWRCeUNvbWJvID0gVmlld1V0aWxpdHkuY3JlYXRlQ29tYm9Cb3goZGVyaXZlZEJ5Q29tcG9zaXRlKTsKLSAgICAgIHBvcHVsYXRlRGVyaXZlZEJ5Q29tYm8oKTsKLSAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkZXJpdmVkQnlDb21ibywgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX1NJTVBMRV9DT05URU5UX0RFUklWRUQpOwotICAgICAgZGVyaXZlZEJ5Q29tYm8uc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfREVSSVZFRF9CWSIpKTsKLSAgICB9Ci0gICAgLy8gU2V0IHRoZSBkZWZhdWx0IHNlbGVjdGlvbgotICAgIGlmIChzaG93Tm9uZSkKLSAgICB7Ci0gICAgICAvLwkJbm9uZVJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgIC8vCQl0eXBlTGlzdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNpbXBsZVR5cGUuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIH0KLSAgICByZXR1cm4gY2xpZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SXNEZXJpdmVkQnkoYm9vbGVhbiBkZXJpdmUpCi0gIHsKLSAgICBpZiAoZGVyaXZlKQotICAgIHsKLSAgICAgIHNlY3Rpb25UaXRsZSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9CQVNFX1RZUEUiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNlY3Rpb25UaXRsZSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9UWVBFX0lORk9STUFUSU9OIik7Ci0gICAgfQotICAgIC8vCXNldEhlYWRlclRleHQoc2VjdGlvblRpdGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdG8gdHJ1ZSBpZiBjYWxsZWQgYnkgQ29tcGxleCBUeXBlICYgU2ltcGxlIFR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNob3dEZXJpdmVkQnkoYm9vbGVhbiBkZXJpdmUpCi0gIHsKLSAgICBzaG93RGVyaXZlZEJ5ID0gZGVyaXZlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGRlcml2ZWRCeUZpZWxkCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEJ1dHRvbgotICAgKi8KLSAgcHVibGljIENvbWJvIGdldERlcml2ZWRCeUNvbWJvKCkKLSAgewotICAgIHJldHVybiBkZXJpdmVkQnlDb21ibzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBub25lUmFkaW8uCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEJ1dHRvbgotICAgKi8KLSAgcHVibGljIEJ1dHRvbiBnZXROb25lUmFkaW8oKQotICB7Ci0gICAgcmV0dXJuIG5vbmVSYWRpbzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzaW1wbGVUeXBlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBCdXR0b24KLSAgICovCi0gIHB1YmxpYyBCdXR0b24gZ2V0U2ltcGxlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gc2ltcGxlVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB1c2VyQ29tcGxleFR5cGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEJ1dHRvbgotICAgKi8KLSAgcHVibGljIEJ1dHRvbiBnZXRVc2VyQ29tcGxleFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHVzZXJDb21wbGV4VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB1c2VyU2ltcGxlVHlwZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgQnV0dG9uCi0gICAqLwotICBwdWJsaWMgQnV0dG9uIGdldFVzZXJTaW1wbGVUeXBlKCkKLSAgewotICAgIHJldHVybiB1c2VyU2ltcGxlVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB0eXBlTGlzdC4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgQ0NvbWJvCi0gICAqLwotICBwdWJsaWMgQ29tYm8gZ2V0VHlwZUxpc3QoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFBvcHVsYXRlIGNvbWJvIGJveCB3aXRoIGJ1aWx0LWluIHNpbXBsZSB0eXBlcwotICAgKi8KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVCdWlsdEluVHlwZShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgZ2V0VHlwZUxpc3QoKS5yZW1vdmVBbGwoKTsKLSAgICBMaXN0IGl0ZW1zID0gZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIGdldFR5cGVMaXN0KCkuYWRkKGl0ZW1zLmdldChpKS50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgIHJldHVybiBoZWxwZXIuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQb3B1bGF0ZSBjb21ibyBib3ggd2l0aCB1c2VyIGRlZmluZWQgY29tcGxleCB0eXBlcwotICAgKi8KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVVc2VyQ29tcGxleFR5cGUoWFNEU2NoZW1hIHhzZFNjaGVtYSwgYm9vbGVhbiBzaG93QW5vbnltb3VzKQotICB7Ci0gICAgZ2V0VHlwZUxpc3QoKS5yZW1vdmVBbGwoKTsKLSAgICBpZiAoc2hvd0Fub255bW91cykKLSAgICB7Ci0gICAgICBnZXRUeXBlTGlzdCgpLmFkZChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQU5PTllNT1VTIikpOwotICAgIH0KLQotICAgIExpc3QgaXRlbXMgPSBnZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIGdldFR5cGVMaXN0KCkuYWRkKGl0ZW1zLmdldChpKS50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICByZXR1cm4gaGVscGVyLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVVc2VyU2ltcGxlVHlwZShYU0RTY2hlbWEgeHNkU2NoZW1hLCBib29sZWFuIHNob3dBbm9ueW1vdXMpCi0gIHsKLSAgICBnZXRUeXBlTGlzdCgpLnJlbW92ZUFsbCgpOwotICAgIGlmIChzaG93QW5vbnltb3VzKQotICAgIHsKLSAgICAgIGdldFR5cGVMaXN0KCkuYWRkKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BTk9OWU1PVVMiKSk7Ci0gICAgfQotICAgIExpc3QgaXRlbXMgPSBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgZ2V0VHlwZUxpc3QoKS5hZGQoaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQb3B1bGF0ZSBjb21ibyBib3ggd2l0aCB1c2VyIGRlZmluZWQgc2ltcGxlIHR5cGVzCi0gICAqLwotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZVVzZXJTaW1wbGVUeXBlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBnZXRUeXBlTGlzdCgpLnJlbW92ZUFsbCgpOwotICAgIExpc3QgaXRlbXMgPSBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgZ2V0VHlwZUxpc3QoKS5hZGQoaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdChYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgcmV0dXJuIGhlbHBlci5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5zLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgU3RyaW5nIGtleSA9IGhlbHBlci5nZXRQcmVmaXgobnMsIHRydWUpOwotICAgIHJldHVybiBrZXk7Ci0gIH0KLQotICAvKioKLSAgICogUG9wdWxhdGUgY29tYm8gYm94IHdpdGggZGVyaXZlZCBieSBjaG9pY2VzCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURlcml2ZWRCeUNvbWJvKCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVyaXZlZEJ5Q2hvaWNlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBnZXREZXJpdmVkQnlDb21ibygpLmFkZChkZXJpdmVkQnlDaG9pY2VzW2ldKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgc2hvd1VzZXJDb21wbGV4VHlwZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd1VzZXJDb21wbGV4VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gc2hvd1VzZXJDb21wbGV4VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzaG93VXNlclNpbXBsZVR5cGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dVc2VyU2ltcGxlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gc2hvd1VzZXJTaW1wbGVUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHNob3dOb25lLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93Tm9uZSgpCi0gIHsKLSAgICByZXR1cm4gc2hvd05vbmU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc2hvd1VzZXJDb21wbGV4VHlwZS4KLSAgICogQHBhcmFtIHNob3dVc2VyQ29tcGxleFR5cGUgVGhlIHNob3dVc2VyQ29tcGxleFR5cGUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93VXNlckNvbXBsZXhUeXBlKGJvb2xlYW4gc2hvd1VzZXJDb21wbGV4VHlwZSkKLSAgewotICAgIHRoaXMuc2hvd1VzZXJDb21wbGV4VHlwZSA9IHNob3dVc2VyQ29tcGxleFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc2hvd1VzZXJTaW1wbGVUeXBlLgotICAgKiBAcGFyYW0gc2hvd1VzZXJTaW1wbGVUeXBlIFRoZSBzaG93VXNlclNpbXBsZVR5cGUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93VXNlclNpbXBsZVR5cGUoYm9vbGVhbiBzaG93VXNlclNpbXBsZVR5cGUpCi0gIHsKLSAgICB0aGlzLnNob3dVc2VyU2ltcGxlVHlwZSA9IHNob3dVc2VyU2ltcGxlVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzaG93Tm9uZQotICAgKiBAcGFyYW0gc2hvd1VzZXJTaW1wbGVUeXBlIFRoZSBzaG93Tm9uZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNob3dOb25lKGJvb2xlYW4gc2hvd05vbmUpCi0gIHsKLSAgICB0aGlzLnNob3dOb25lID0gc2hvd05vbmU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpZGdldHMvWFNERWRpdFNjaGVtYUluZm9EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpZGdldHMvWFNERWRpdFNjaGVtYUluZm9EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkMDE2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL1hTREVkaXRTY2hlbWFJbmZvRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCSAgIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRTY2hlbWFJbmZvRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0LkNvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0U2NoZW1hSW5mb0RpYWxvZyBleHRlbmRzIEVkaXRTY2hlbWFJbmZvRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCVN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0JQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZyBlZGl0TmFtZXNwYWNlc0NvbnRyb2w7Ci0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAtIFRoZXNlIGhhdmUgYmVlbiBtb3ZlZCB0byB0aGUgQWR2YW5jZWQgUHJvcGVydGllcyBUYWIgCi0gICAqLwotICBDb21ibyBlbGVtZW50Rm9ybUNvbWJvLCBhdHRyaWJ1dGVGb3JtQ29tYm87Ci0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAKLSAgICovCi0gIFN0cmluZyBlbGVtZW50Rm9ybVF1YWxpZmllZCA9ICIiLCBhdHRyaWJ1dGVGb3JtUXVhbGlmaWVkID0gIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAKLQlwdWJsaWMgWFNERWRpdFNjaGVtYUluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElQYXRoIHJlc291cmNlTG9jYXRpb24sIFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIHJlc291cmNlTG9jYXRpb24pOwotCQl0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0JCi0JLy8gdGhpcyBpcyBjb3B5IG9mIC4uLi4KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBfX2ludGVybmFsQ3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0gICAgICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQkKLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBfX2ludGVybmFsQ3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wgPSBuZXcgQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZyhkaWFsb2dBcmVhLCByZXNvdXJjZUxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0JCXsJCi0JCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0JCX0KLQkJZWRpdE5hbWVzcGFjZXNDb250cm9sLnNldE5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJZWRpdE5hbWVzcGFjZXNDb250cm9sLnVwZGF0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCk7Ci0KLSAgICBhcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIGVkaXROYW1lc3BhY2VzQ29udHJvbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQl9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJc0VsZW1lbnRRdWFsaWZpZWQoU3RyaW5nIHN0YXRlKQotICB7Ci0gICAgZWxlbWVudEZvcm1Db21iby5zZXRUZXh0KHN0YXRlKTsKLSAgICBlbGVtZW50Rm9ybVF1YWxpZmllZCA9IHN0YXRlOwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJc0F0dHJpYnV0ZVF1YWxpZmllZChTdHJpbmcgc3RhdGUpCi0gIHsKLSAgICBhdHRyaWJ1dGVGb3JtQ29tYm8uc2V0VGV4dChzdGF0ZSk7Ci0gICAgYXR0cmlidXRlRm9ybVF1YWxpZmllZCA9IHN0YXRlOwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRGb3JtUXVhbGlmaWVkKCkKLSAgewotICAgIHJldHVybiBlbGVtZW50Rm9ybVF1YWxpZmllZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVGb3JtUXVhbGlmaWVkKCkKLSAgewotICAgIHJldHVybiBhdHRyaWJ1dGVGb3JtUXVhbGlmaWVkOwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gYXR0cmlidXRlRm9ybUNvbWJvKQotICAgIHsKLSAgICAgIGF0dHJpYnV0ZUZvcm1RdWFsaWZpZWQgPSBhdHRyaWJ1dGVGb3JtQ29tYm8uZ2V0VGV4dCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBlbGVtZW50Rm9ybUNvbWJvKQotICAgIHsKLSAgICAgIGVsZW1lbnRGb3JtUXVhbGlmaWVkID0gZWxlbWVudEZvcm1Db21iby5nZXRUZXh0KCk7Ci0gICAgfQotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYU0RXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WFNEV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2QyOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYU0RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIE5ld1hTRFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCXByaXZhdGUgWFNETmV3RmlsZVBhZ2UgbmV3RmlsZVBhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotCXB1YmxpYyBOZXdYU0RXaXphcmQoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQl0aGlzLndvcmtiZW5jaCA9IGFXb3JrYmVuY2g7Ci0KLQkJdGhpcy5zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvTmV3WFNELnBuZyIpKTsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfV0laQVJEX0NSRUFURV9YU0RfTU9ERUxfVElUTEUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCW5ld0ZpbGVQYWdlID0gbmV3IFhTRE5ld0ZpbGVQYWdlKHNlbGVjdGlvbik7Ci0JCWFkZFBhZ2UobmV3RmlsZVBhZ2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUlGaWxlIGZpbGUgPSBuZXdGaWxlUGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJLy8KLQkJLy8gR2V0IHRoZSB4c2Qgc2NoZW1hIG5hbWUgZnJvbSB0aGUgZnVsbCBwYXRoIG5hbWUKLQkJLy8gZS5nLiBmOi9iMmIvcG8ueHNkID0+IHNjaGVtYSBuYW1lID0gcG8KLQkJLy8KLQkJSVBhdGggaVBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotCQkvLyBTdHJpbmcgc2NoZW1hTmFtZSA9IGlQYXRoLmxhc3RTZWdtZW50KCk7Ci0JCVN0cmluZyBzY2hlbWFOYW1lID0gaVBhdGgubGFzdFNlZ21lbnQoKTsKLQkJU3RyaW5nIHNjaGVtYVByZWZpeCA9ICJ0bnMiOwotCQlTdHJpbmcgcHJlZml4Rm9yU2NoZW1hTmFtZXNwYWNlID0gIiI7Ci0JCVN0cmluZyBzY2hlbWFOYW1lc3BhY2VBdHRyaWJ1dGUgPSAieG1sbnMiOwotCQlpZiAoWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmlzUXVhbGlmeVhNTFNjaGVtYUxhbmd1YWdlKCkpIHsKLQkJCS8vIEFkZGVkIHRoaXMgaWYgY2hlY2sgYmVmb3JlIGRpc2FsbG93aW5nIGJsYW5rIHByZWZpeGVzIGluIHRoZQotCQkJLy8gcHJlZmVyZW5jZXMuLi4KLQkJCS8vIENhbiB0YWtlIHRoaXMgb3V0LiBTZWUgYWxzbyBYU0RFZGl0b3IKLQkJCWlmIChYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WE1MU2NoZW1hUHJlZml4KCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCXByZWZpeEZvclNjaGVtYU5hbWVzcGFjZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYTUxTY2hlbWFQcmVmaXgoKSArICI6IjsKLQkJCQlzY2hlbWFOYW1lc3BhY2VBdHRyaWJ1dGUgKz0gIjoiICsgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhNTFNjaGVtYVByZWZpeCgpOwotCQkJfQotCQl9Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBjaGFyU2V0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCQlpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpIHsKLQkJCWNoYXJTZXQgPSAiVVRGLTgiOwotCQl9Ci0KLQkJU3RyaW5nIG5ld0NvbnRlbnRzID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIgKyBjaGFyU2V0ICsgIlwiPz5cbiI7Ci0KLQkJU3RyaW5nIGRlZmF1bHRUYXJnZXRVUkkgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WE1MU2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCk7Ci0JCW5ld0NvbnRlbnRzICs9ICI8IiArIHByZWZpeEZvclNjaGVtYU5hbWVzcGFjZSArICJzY2hlbWEgIiArIHNjaGVtYU5hbWVzcGFjZUF0dHJpYnV0ZSArICI9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIHRhcmdldE5hbWVzcGFjZT1cIiIgKyBkZWZhdWx0VGFyZ2V0VVJJICsgc2NoZW1hTmFtZSArICJcIiB4bWxuczoiICsgc2NoZW1hUHJlZml4ICsgIj1cIiIgKyBkZWZhdWx0VGFyZ2V0VVJJICsgc2NoZW1hTmFtZSArICJcIiBlbGVtZW50Rm9ybURlZmF1bHQ9XCJxdWFsaWZpZWRcIj5cbjwvIiArIHByZWZpeEZvclNjaGVtYU5hbWVzcGFjZSArICJzY2hlbWE+IjsKLQotCQl0cnkgewotCQkJYnl0ZVtdIGJ5dGVzID0gbmV3Q29udGVudHMuZ2V0Qnl0ZXMoY2hhclNldCk7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0KLQkJCWZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoIkVycm9yIHdyaXRpbmcKLQkJCS8vIGRlZmF1bHQgY29udGVudDpcbiIgKyBuZXdDb250ZW50cyk7Ci0JCQkvLyBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoZSk7Ci0JCX0KLQotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXZlYWxTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsZSkpOwotCQl9Ci0KLQkJb3BlbkVkaXRvcihmaWxlKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmV2ZWFsU2VsZWN0aW9uKGZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2gyOwotCQkJaWYgKHdvcmtiZW5jaCA9PSBudWxsKQotCQkJewotCQkJICB3b3JrYmVuY2gyID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJICB3b3JrYmVuY2gyID0gd29ya2JlbmNoOwotCQkJfQotCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2gyLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJZmluYWwgSVdvcmtiZW5jaFBhcnQgZm9jdXNQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQlpZiAoZm9jdXNQYXJ0IGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkgewotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldCkgZm9jdXNQYXJ0KS5zZWxlY3RSZXZlYWwoc2VsZWN0aW9uKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBpRmlsZSkgewotCQlpZiAoaUZpbGUgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2gyOwotCQkJaWYgKHdvcmtiZW5jaCA9PSBudWxsKQotCQkJewotCQkJICB3b3JrYmVuY2gyID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJICB3b3JrYmVuY2gyID0gd29ya2JlbmNoOwotCQkJfQotCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2gyLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBlZGl0b3JJZCA9IG51bGw7Ci0JCQkJCQlJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihpRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSwgaUZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJCQllZGl0b3JJZCA9IGVkaXRvci5nZXRJZCgpOwotCQkJCQkJfQotCQkJCQkJd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoaUZpbGUpLCBlZGl0b3JJZCk7Ci0JCQkJCQkKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXgpIHsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhDb21wb3NpdGlvblBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhDb21wb3NpdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExNzEyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4Q29tcG9zaXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gQmFzZWQgb24gdmVyc2lvbiAxLjEyIG9mIG9yaWdpbmFsIHhzZGVkaXRvcgotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhdHRlcm5GYWNldDsKLQotCi0KLS8qCi0tb3RoZXIgcmVnZXggZmVhdHVyZXMgKGVnIGNhc2Ugc2Vuc2l0aXZpdHksIF4gb3IgJCwgfCwgZXRjIGV0YykKLS1zbWFydGVyIG1vZGVsCi0tYmV0dGVyIGtleWJvYXJkIG5hdmlnYXRpb24KLS11cGRhdGUgbGlzdCBvZiB0b2tlbnMgCi0qLwotCi1wdWJsaWMgY2xhc3MgUmVnZXhDb21wb3NpdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQotICAvKiBUaGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBvdXIgcGF0dGVybi4gKi8KLSAgcHJpdmF0ZSBTdHlsZWRUZXh0IHZhbHVlOyAKLQotICAvKiBUaGUgU3R5bGVSYW5nZSB1c2VkIHRvIGNvbG9yIGNvZGUgdGhlIGN1cnJlbnQgcGFyc2UgZXJyb3IuICovCi0gIHByaXZhdGUgU3R5bGVSYW5nZSBjdXJyZW50RXJyb3I7Ci0KLSAgLyogVGhlIHJlZ2V4IHRlcm1zIHdlIGNhbiBmb3JtIHRva2VucyBmcm9tLiAqLwotICBwcml2YXRlIENvbWJvIHRlcm1zOwotCi0gIC8qIFRoZSBjaGVja2JveCBmb3IgYWN0aXZhdGluZyBhdXRvLWVzY2FwZSBtb2RlLiAqLyAgCi0gIHByaXZhdGUgQnV0dG9uIGVzY2FwZUNoZWNrYm94OwotICAKLSAgLyogT24vb2ZmIHN0YXR1cyBvZiBhdXRvLWVzY2FwZSBtb2RlLiAqLyAKLSAgcHJpdmF0ZSBib29sZWFuIGF1dG9Fc2NhcGVTdGF0dXM7Ci0KLSAgLyogVGhlIEFkZCBUb2tlbiBidXR0b24uICovCi0gIHByaXZhdGUgQnV0dG9uIGFkZDsKLQotCi0gIC8vIFRoZSBmb2xsb3dpbmcgY29udHJvbHMgYXJlIHVzZWQgaW4gdGhlIG9jY3VycmVuY2Ugc2VsZWN0aW9uIGdyb3VwCi0KLSAgcHJpdmF0ZSBUZXh0IHJlcGVhdFZhbHVlOwotCi0gIHByaXZhdGUgVGV4dCByYW5nZU1pblZhbHVlOwotICBwcml2YXRlIFRleHQgcmFuZ2VNYXhWYWx1ZTsKLSAgcHJpdmF0ZSBMYWJlbCByYW5nZVRvTGFiZWw7ICAKLQotICBwcml2YXRlIEJ1dHRvbiBzaW5nbGVSYWRpbzsKLSAgcHJpdmF0ZSBCdXR0b24gc3RhclJhZGlvOwotICBwcml2YXRlIEJ1dHRvbiBwbHVzUmFkaW87Ci0gIHByaXZhdGUgQnV0dG9uIG9wdGlvbmFsUmFkaW87IAotICBwcml2YXRlIEJ1dHRvbiByZXBlYXRSYWRpbzsKLSAgcHJpdmF0ZSBCdXR0b24gcmFuZ2VSYWRpbzsKLQotICAKLSAgLy8gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgdXNlZCBhcyBwYXJ0IG9mIHRoZSBtb2RlbC4gCi0KLSAgLyogT3VyIHBhdHRlcm4uICovCi0gIHByaXZhdGUgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm47Ci0KLSAgLyogTW9kZWwgdXNlZCB0byBzdG9yZSB0aGUgY3VycmVudCB0b2tlbi4gKi8KLSAgcHJpdmF0ZSBSZWdleE5vZGUgbm9kZTsgICAgCi0KLSAgLyogVGhlIGZsYWdzIHBhc3NlZCB0byB0aGUgbmV3IFJlZ3VsYXJFeHByZXNzaW9uIG9iamVjdC4gIERlZmF1bHQgdmFsdWUgaW5jbHVkZXM6Ci0gICAgICBYID0gWE1MU2NoZW1hIG1vZGUgICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcmVnZXhGbGFncyA9ICJYIjsKLSAgICAgIAotCi0gIC8qIElzIHRoZSBjdXJyZW50IHJlZ2V4IHRva2VuIHZhbGlkPyAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFRva2VuOwotCi0gIC8qIFRoZSBsYWJlbCB1c2VkIHRvIGluZGljYXRlIHRoZSB2YWx1ZSdzIGNhcmV0IHBvc2l0aW9uIHdoZW4gaXQgbG9vc2VzIGZvY3VzLiAqLwotICBwcml2YXRlIExhYmVsIGNhcmV0TGFiZWw7Ci0KLSAgLyogVGhlIHBpeGVsIG9mZnNldHMgbmVlZGVkIHRvIGFsaWduIHRoZSBsYWJlbCBpY29uIHdpdGggdGhlIGNhcmV0IGxvY2F0aW9uLgotICAgICBUaGVzZSBhcmUgZGVwZW5kZW50IG9uIHRoZSBpY29uIHVzZWQuICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQVJFVF9MQUJFTF9YX09GRlNFVCA9IC0zOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FSRVRfTEFCRUxfWV9PRkZTRVQgPSAxOTsKLQotICAKLSAgLyogRW51bWVyYXRlZCBjb25zdGFudHMgZm9yIHNwZWNpZnlpbmcgdGhlIHR5cGUgb2YgYW4gZXJyb3IgbWVzc2FnZS4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTiA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVJTRSA9IDI7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX0VSUk9SX01FU1NBR0VfVFlQRVMgPSAzOwotICAKLSAgLyogVGhlIGN1cnJlbnQgZXJyb3IgbWVzc2FnZSBmb3IgZWFjaCB0eXBlIG9mIGVycm9yLiAgQSB2YWx1ZSBvZiBudWxsIGluZGljYXRlcyBubyBtZXNzYWdlLiAKLSAgICAgVGhlIGFycmF5IGlzIGluZGV4ZWQgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBjb25zdGFudHMuCi0gICovCi0gIHByaXZhdGUgU3RyaW5nW10gY3VycmVudEVycm9yTWVzc2FnZXM7Ci0KLQotICBwdWJsaWMgUmVnZXhDb21wb3NpdGlvblBhZ2UoWFNEUGF0dGVybkZhY2V0IHBhdHRlcm4pCi0gIHsKLSAgICBzdXBlcihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0NPTVBPU0lUSU9OX1BBR0VfVElUTEUiKSk7Ci0gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQotICAgIHNldFRpdGxlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfQ09NUE9TSVRJT05fUEFHRV9USVRMRSIpKTsKLSAgICBzZXREZXNjcmlwdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0NPTVBPU0lUSU9OX1BBR0VfREVTQ1JJUFRJT04iKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBTZXQgdXAgb3VyIG1vZGVsIGFuZCB2YWxpZGF0b3IKLSAgICBub2RlID0gbmV3IFJlZ2V4Tm9kZSgpOwotICAgICAgICAKLSAgICBpc1ZhbGlkVG9rZW4gPSB0cnVlOwotCi0gICAgY3VycmVudEVycm9yTWVzc2FnZXMgPSBuZXcgU3RyaW5nW05VTV9FUlJPUl9NRVNTQUdFX1RZUEVTXTsKLQotICAgIC8vIFRoZSBtYWluIGNvbXBvc2l0ZQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9XSVpBUkRfUEFHRSk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCi0gICAgLy8gVGhlIGNvbXBvc2l0ZSBmb3IgdGhlIHRva2VuIGNvbWJvIGJveCwgbGFiZWwsIGFuZCBhdXRvLWVzY2FwZSBjaGVja2JveAotICAgIENvbXBvc2l0ZSB0b2tlbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgdG9rZW5Db21wb3NpdGVMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIHRva2VuQ29tcG9zaXRlTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIHRva2VuQ29tcG9zaXRlTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICB0b2tlbkNvbXBvc2l0ZS5zZXRMYXlvdXQodG9rZW5Db21wb3NpdGVMYXlvdXQpOwotCi0KLSAgICBuZXcgTGFiZWwodG9rZW5Db21wb3NpdGUsIFNXVC5MRUZUKS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVE9LRU5fTEFCRUwiKSk7Ci0gICAgCi0gICAgdGVybXMgPSBuZXcgQ29tYm8odG9rZW5Db21wb3NpdGUsIFNXVC5EUk9QX0RPV04pOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGVybXMsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9UT0tFTl9DT05URU5UUyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSZWdleE5vZGUuZ2V0TnVtUmVnZXhUZXJtcygpOyBpKyspCi0gICAgewotICAgICAgdGVybXMuYWRkKFJlZ2V4Tm9kZS5nZXRSZWdleFRlcm1UZXh0KGkpKTsKLSAgICB9Ci0gICAgdGVybXMuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgbmV3IENvbWJvTGlzdGVuZXIoKSk7Ci0gICAgdGVybXMuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX1RFUk1TIikpOwotCi0gICAgZXNjYXBlQ2hlY2tib3ggPSBuZXcgQnV0dG9uKHRva2VuQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotICAgIGVzY2FwZUNoZWNrYm94LnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9BVVRPX0VTQ0FQRV9DSEVDS0JPWF9MQUJFTCIpKTsKLSAgICBlc2NhcGVDaGVja2JveC5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQVVUT19FU0NBUEVfQ0hFQ0tCT1giKSk7IAotICAgIGVzY2FwZUNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBDaGVja2JveExpc3RlbmVyKCkpOwotICAgIGF1dG9Fc2NhcGVTdGF0dXMgPSBmYWxzZTsKLQotCi0gICAgLy8gU2V0IHVwIHRoZSBjb21wb3NpdGVzIHBlcnRhaW5pbmcgdG8gdGhlIHNlbGVjdGlvbiBvZiBvY2N1cnJlbmNlIHF1YW50aWZpZXJzCi0KLSAgICBHcm91cCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfT0NDVVJFTkNFX0xBQkVMIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAob2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9XSVpBUkRfUEFHRSk7Ci0gICAgR3JpZExheW91dCBzZWxlY3Rpb25BcmVhTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBzZWxlY3Rpb25BcmVhTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLnNldExheW91dChzZWxlY3Rpb25BcmVhTGF5b3V0KTsKLQotICAgIG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgLy8gTGlzdGVuZXIgdXNlZCBmb3IgYWxsIG9mIHRoZSB0ZXh0IGZpZWxkcwotICAgIFRleHRMaXN0ZW5lciB0ZXh0TGlzdGVuZXIgPSBuZXcgVGV4dExpc3RlbmVyKCk7Ci0gICAgCi0KLSAgICAvLyBBZGQgdGhlIHJhZGlvIGJ1dHRvbnMKLSAgICBSYWRpb1NlbGVjdExpc3RlbmVyIHJhZGlvU2VsZWN0TGlzdGVuZXIgPSBuZXcgUmFkaW9TZWxlY3RMaXN0ZW5lcigpOwotCi0gICAgc2luZ2xlUmFkaW8gPSBhZGRPY2N1cmVuY2VSYWRpb0J1dHRvbihSZWdleE5vZGUuU0lOR0xFLCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzaW5nbGVSYWRpbywgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX0pVU1RfT05DRSk7Ci0gICAgVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGxlcihvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgMSk7Ci0KLSAgICBzdGFyUmFkaW8gPSBhZGRPY2N1cmVuY2VSYWRpb0J1dHRvbihSZWdleE5vZGUuU1RBUiwgb2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIHJhZGlvU2VsZWN0TGlzdGVuZXIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc3RhclJhZGlvLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfWkVST19PUl9NT1JFKTsKLSAgICBWaWV3VXRpbGl0eS5jcmVhdGVIb3Jpem9udGFsRmlsbGVyKG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCAxKTsKLQotICAgIHBsdXNSYWRpbyA9IGFkZE9jY3VyZW5jZVJhZGlvQnV0dG9uKFJlZ2V4Tm9kZS5QTFVTLCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwbHVzUmFkaW8sIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9PTkVfT1JfTU9SRSk7Ci0gICAgVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGxlcihvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgMSk7Ci0KLSAgICBvcHRpb25hbFJhZGlvID0gYWRkT2NjdXJlbmNlUmFkaW9CdXR0b24oUmVnZXhOb2RlLk9QVElPTkFMLCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChvcHRpb25hbFJhZGlvLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfT1BUSU9OQUwpOwotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsZXIob2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIDEpOwotCi0gICAgcmVwZWF0UmFkaW8gPSBhZGRPY2N1cmVuY2VSYWRpb0J1dHRvbihSZWdleE5vZGUuUkVQRUFULCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZXBlYXRSYWRpbywgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1JFUEVBVF9SQURJTyk7Ci0gICAgCi0gICAgcmVwZWF0VmFsdWUgPSBuZXcgVGV4dChvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIHJlcGVhdFZhbHVlLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRleHRMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZXBlYXRWYWx1ZSwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1JFUEVBVF9GSUVMRCk7Ci0gICAgcmVwZWF0VmFsdWUuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX1JFUEVBVCIpKTsKLSAgICByZXBlYXRWYWx1ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SRVBFQVQsIGZhbHNlKTsKLSAgICAKLSAgICByYW5nZVJhZGlvID0gYWRkT2NjdXJlbmNlUmFkaW9CdXR0b24oUmVnZXhOb2RlLlJBTkdFLCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyYW5nZVJhZGlvLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfUkFOR0VfUkFESU8pOwotCi0gICAgLy8gQWRkIHRleHQgZmllbGRzIGFuZCBsYWJlbHMgZm9yIHNwZWNpZnlpbmcgdGhlIHJhbmdlICAgIAotICAgIENvbXBvc2l0ZSByYW5nZVdpZGdldHMgPSBuZXcgQ29tcG9zaXRlKG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICByYW5nZVdpZGdldHMuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIHJhbmdlV2lkZ2V0cy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAKLSAgICByYW5nZU1pblZhbHVlID0gbmV3IFRleHQocmFuZ2VXaWRnZXRzLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgcmFuZ2VNaW5WYWx1ZS5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0ZXh0TGlzdGVuZXIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmFuZ2VNaW5WYWx1ZSwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1JBTkdFX01JTklNVU1fRklFTEQpOwotICAgIHJhbmdlTWluVmFsdWUuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX01JTiIpKTsKLSAgICByYW5nZU1pblZhbHVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIAotICAgIHJhbmdlVG9MYWJlbCA9IG5ldyBMYWJlbChyYW5nZVdpZGdldHMsIFNXVC5OT05FKTsKLSAgICByYW5nZVRvTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RPX0xBQkVMIikpOwotICAgIAotICAgIHJhbmdlTWF4VmFsdWUgPSBuZXcgVGV4dChyYW5nZVdpZGdldHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICByYW5nZU1heFZhbHVlLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRleHRMaXN0ZW5lcik7Ci0gICAgcmFuZ2VNYXhWYWx1ZS5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfTUFYIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmFuZ2VNYXhWYWx1ZSwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1JBTkdFX01BWElNVU1fRklFTEQpOwotICAgIHJhbmdlTWF4VmFsdWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SQU5HRSwgZmFsc2UpOwotICAgIAotICAgIHNpbmdsZVJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAKLSAgICAvLyBUaGUgYWRkIGJ1dHRvbgotICAgIGFkZCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBCdXR0b25TZWxlY3RMaXN0ZW5lcigpKTsKLSAgICBhZGQuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0FERF9CVVRUT05fTEFCRUwiKSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChhZGQsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9BRERfQlVUVE9OKTsKLSAgICBhZGQuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX0FERF9CVVRUT04iKSk7Ci0KLSAgICAKLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgIAotICAgIC8vIE91ciBtYWluIHRleHQgYm94Ci0KLSAgICBMYWJlbCB2YWx1ZUxhYmVsPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0gICAgdmFsdWVMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfQ1VSUkVOVF9SRUdFWF9MQUJFTCIpKTsKLSAgICAKLSAgICB2YWx1ZSA9IG5ldyBTdHlsZWRUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIHZhbHVlLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRleHRMaXN0ZW5lcik7Ci0gICAgdmFsdWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGV4dExpc3RlbmVyKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHZhbHVlLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfQ1VSUkVOVF9WQUxVRSk7Ci0gICAgdmFsdWUuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX0NVUlJFTlRfUkVHRVgiKSk7Ci0gICAgdmFsdWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICB2YWx1ZS5zZXRGb2N1cygpOwotCi0gICAgLy8gU3R5bGVSYW5nZSB1c2VkIGZvciBoaWdobGlnaHRpbmcgcGFyc2UgZXJyb3JzCi0gICAgY3VycmVudEVycm9yID0gbmV3IFN0eWxlUmFuZ2UoKTsKLSAgICBjdXJyZW50RXJyb3IubGVuZ3RoID0gMTsKLSAgICBjdXJyZW50RXJyb3IuZm9yZWdyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0KLSAgICAvLyBUaGUgY2FyZXQgbGFiZWwKLSAgICBjYXJldExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotICAgIGNhcmV0TGFiZWwuc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9SZWdleFdpemFyZEFycm93LmdpZiIpKTsKLSAgICBjYXJldExhYmVsLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9DQVJFVF9MQUJFTCIpKTsKLSAgICBzZXRTaG93Q2FyZXRMYWJlbCh0cnVlKTsKLQotICAgIHZhbHVlLmFkZEZvY3VzTGlzdGVuZXIobmV3IFRleHRGb2N1c0xpc3RlbmVyKCkpOwotCi0gICAgdGVybXMuc2VsZWN0KDApOwotCi0KLSAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKQotICB7Ci0gICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQotICAgIHZhbHVlLnNldFRleHQocGF0dGVybi5nZXRMZXhpY2FsVmFsdWUoKSk7Ci0gICAgdmFsdWUuc2V0Q2FyZXRPZmZzZXQodmFsdWUuZ2V0Q2hhckNvdW50KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2aXNpYmxlIHN0YXR1cyBvZiBjYXJldExhYmVsIHRvIHN0YXR1cy4gIElmIHN0YXR1cyBpcyB0cnVlLCB0aGVuIHdlIGFsc28gdXBkYXRlIHRoZSBwb3NpdGlvbgotICAgKiBvZiBjYXJldExhYmVsIGluIG9uZSBvZiB0d28gd2F5cy4gIElmIHRoZXJlIGlzIG5vIGFjdGl2ZSBzZWxlY3Rpb24gaW4gdmFsdWUsIHdlIHNldCBjYXJldExhYmVsJ3MKLSAgICogcG9zaXRpb24gdG8gY29ycmVzcG9uZCB3aXRoIHRoZSBwb3NpdGlvbiBvZiB0aGUgYWN0dWFsIGNhcmV0LiAgQWx0ZXJuYXRpdmVseSwgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIHNlbGVjdGlvbgotICAgKiBpbiB2YWx1ZSwgd2Ugc2V0IGNhcmV0TGFiZWwncyBwb3NpdGlvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAqCi0gICAqIEBwYXJhbSBUaGUgbmV3IHZpc2liaWxpdHkgc3RhdHVzIG9mIGNhcmV0TGFiZWwuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc2V0U2hvd0NhcmV0TGFiZWwoYm9vbGVhbiBzdGF0dXMpCi0gIHsKLSAgICBpZiAoc3RhdHVzKQotICAgIHsKLSAgCi0gICAgICBpbnQgb2Zmc2V0OwotICAgICAgCi0gICAgICBpZiAodmFsdWUuZ2V0U2VsZWN0aW9uVGV4dCgpLmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIG9mZnNldCA9IHZhbHVlLmdldENhcmV0T2Zmc2V0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG9mZnNldCA9IHZhbHVlLmdldFNlbGVjdGlvbigpLng7Ci0gICAgICB9Ci0gIAotICAgICAgUG9pbnQgcCA9IHZhbHVlLmdldExvY2F0aW9uQXRPZmZzZXQob2Zmc2V0KTsKLSAgICAgIAotICAgICAgcC54ICs9IHZhbHVlLmdldExvY2F0aW9uKCkueDsKLSAgICAgIHAueSA9IHZhbHVlLmdldExvY2F0aW9uKCkueTsKLSAgICAgIAotICAgICAgLy8gUGxhY2UgdGhlIGxhYmVsIHVuZGVyIHZhbHVlLCBhbmQgbWFrZSBzdXJlIGl0IGlzIGFsaWduZWQgd2l0aCB0aGUgY2FyZXQuCi0gICAgICAvLyBUaGUgb2Zmc2V0cyBhcmUgZGVwZW5kZW50IG9uIHRoZSBpY29uIHVzZWQuCi0gICAgICBwLnggKz0gQ0FSRVRfTEFCRUxfWF9PRkZTRVQ7Ci0gICAgICBwLnkgKz0gQ0FSRVRfTEFCRUxfWV9PRkZTRVQ7Ci0gIAotICAgICAgaWYgKGRlYnVnKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBPSU5UOiAiICsgcCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FyZXRMYWJlbC5zZXRMb2NhdGlvbihwKTsKLSAgICAgIGNhcmV0TGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNhcmV0TGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogQWRkcyBhIG5ldyByYWRpbyBidXR0b24gdG8gQ29tcG9zaXRlIGMgd2l0aCBTZWxlY3Rpb25MaXN0ZW5lciBsLiAgVGhlIHRleHQgb2YgdGhlIGJ1dHRvbiBpcyB0aGUgU3RyaW5nIGFzc29jaWF0ZWQgd2l0aAotICAgKiBxdWFudGlmaWVyLgotICAgKgotICAgKiBAcGFyYW0gcXVhbnRpZmllciBUaGUgZGVzaXJlZCBxdWFudGlmaWVyLCBhcyBlbnVtZXJhdGVkIGluIFJlZ2V4Tm9kZS4KLSAgICogQHBhcmFtIGMgVGhlIENvbXBvc2l0ZSB0byBhZGQgdGhlIGJ1dHRvbnMgdG8gKG5vcm1hbGx5IG9jY3VycmVuY2VSYWRpb0J1dHRvbnMpLgotICAgKiBAcGFyYW0gbCBUaGUgU2VsZWN0aW9uTGlzdGVuZXIgKG5vcm1hbGx5IHJhZGlvU2VsZWN0aW9uTGlzdGVuZXIpLgotICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGJ1dHRvbi4KLSAgICovCi0gIHByaXZhdGUgQnV0dG9uIGFkZE9jY3VyZW5jZVJhZGlvQnV0dG9uKGludCBxdWFudGlmaWVyLCBDb21wb3NpdGUgYywgU2VsZWN0aW9uTGlzdGVuZXIgbCkKLSAgewotICAgIEJ1dHRvbiByZXN1bHQgPSBuZXcgQnV0dG9uKGMsIFNXVC5SQURJTyk7Ci0gICAgcmVzdWx0LnNldFRleHQoUmVnZXhOb2RlLmdldFF1YW50aWZpZXJUZXh0KHF1YW50aWZpZXIpKTsKLSAgICByZXN1bHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB0aGUgcmVnZXggaW4gdmFsdWUuICBJZiB0aGUgcmVnZXggaXMgdmFsaWQsIGNsZWFycyB0aGUgV2l6YXJkJ3MgZXJyb3IgbWVzc2FnZS4gIElmIGl0J3Mgbm90IHZhbGlkLAotICAgKiAgc2V0cyB0aGUgV2l6YXJkJ3MgZXJyb3IgbWVzc2FnZSBhY2NvcmRpbmdseS4KLSAgICoKLSAgICogQHJldHVybiBXaGV0aGVyIHRoZSByZWdleCBpcyB2YWxpZC4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVJlZ2V4KCkKLSAgewotCi0gICAgYm9vbGVhbiBpc1ZhbGlkOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFdlIHZhbGlkYXRlIHRoZSByZWdleCBieSBjaGVja2luZyB3aGV0aGVyIHdlIGdldCBhIFBhcnNlRXhjZXB0aW9uLgotICAgICAgLy8gQnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoYXQgaXQncyB2YWxpZCB1bmxlc3Mgd2UgZGV0ZXJtaW5lIG90aGVyd2lzZS4KLSAgICAgIGlzVmFsaWQgPSB0cnVlOwotICAgICAgZGlzcGxheVJlZ2V4RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgdmFsdWUuc2V0U3R5bGVSYW5nZShudWxsKTsKLQotICAgICAgUGF0dGVybi5jb21waWxlKHZhbHVlLmdldFRleHQoKSk7Ci0gICAgfQotICAgIGNhdGNoIChQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIHBlKQotICAgIHsKLSAgICAgIGlzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGRpc3BsYXlSZWdleEVycm9yTWVzc2FnZShwZS5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAvLyBBbiBvZmYtYnktb25lIGJ1ZyBpbiB0aGUgeGVyY2VzIHJlZ2V4IHBhcnNlciB3aWxsIHNvbWV0aW1lcyByZXR1cm4gYSBsb2NhdGlvbiBmb3IgdGhlIHBhcnNlRXJyb3IgdGhhdAotICAgICAgLy8gIGlzIG9mZiB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGVuIHdlIHdhbnQgdG8gaGlnaGxpZ2h0IHRoZSBsYXN0IGNoYXJhY3Rlci4KLSAgICAgIGlmIChwZS5nZXRJbmRleCgpID49IHZhbHVlLmdldFRleHQoKS5sZW5ndGgoKSkKLSAgICAgIHsKLSAgICAgICAgY3VycmVudEVycm9yLnN0YXJ0ID0gdmFsdWUuZ2V0VGV4dCgpLmxlbmd0aCgpIC0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY3VycmVudEVycm9yLnN0YXJ0ID0gcGUuZ2V0SW5kZXgoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRlYnVnKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcnNlIEVycm9yIGxvY2F0aW9uOiAiICsgcGUuZ2V0SW5kZXgoKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY3VycmVudEVycm9yLnN0YXJ0OiAiICsgY3VycmVudEVycm9yLnN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotCi0gICAgICB2YWx1ZS5zZXRTdHlsZVJhbmdlKGN1cnJlbnRFcnJvcik7Ci0KLSAgICB9Ci0KLSAgICAvLyBBbm90aGVyIGJ1ZyBpbiB0aGUgeGVyY2VzIHBhcnNlciB3aWxsIHNvbWV0aW1lcyB0aHJvdyBhIFJ1bnRpbWVFeGNlcHRpb24gaW5zdGVhZCBvZiBhIFBhcnNlRXhjZXB0aW9uLgotICAgIC8vICBXaGVuIHdlIGdldCBhIFJ1bnRpbWVFeGNlcHRpb24sIHdlIGFyZW4ndCBwcm92aWRlZCB3aXRoIHRoZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdlIG5lZWQgdG8gaGlnaGxpZ2h0Ci0gICAgLy8gIHRoZSBwYXJzZSBlcnJvci4gIFNvLCB3ZSBtZXJlbHkgcmVwb3J0IHRoYXQgdGhlcmUgaXMgYW4gZXJyb3IuCi0gICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpCi0gICAgewotICAgICAgZGlzcGxheVJlZ2V4RXJyb3JNZXNzYWdlKCIiKTsKLSAgICAgIHZhbHVlLnNldFN0eWxlUmFuZ2UobnVsbCk7Ci0gICAgICBpc1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHNldFBhZ2VDb21wbGV0ZShpc1ZhbGlkKTsgICAgCi0gICAgcmV0dXJuIGlzVmFsaWQ7Ci0gIH0KLQotICAKLSAgLyoqCi0gICAqIE1hbmFnZXMgdGhlIGRpc3BsYXkgb2YgZXJyb3IgbWVzc2FnZXMuCi0gICAqIFNldHMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHR5cGUgdG8gZXJyb3JNZXNzYWdlLiAgSWYgZXJyb3JNZXNzYWdlICE9IG51bGwsIHRoZW4gd2Ugc2V0IHRoZSBXaXphcmQncyBlcnJvciBtZXNzYWdlCi0gICAqIHRvIGVycm9yTWVzc2FnZS4gIElmIGVycm9yTWVzc2FnZSA9PSBudWxsLCB0aGVuIHdlIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIHBlbmRpbmcgbWVzc2FnZSBvZiBhbm90aGVyIHR5cGUuCi0gICAqIElmIHdlIGRvLCB0aGVuIGl0IGlzIGRpc3BsYXllZCBhcyB0aGUgV2l6YXJkJ3MgZXJyb3IgbWVzc2FnZS4gIElmIHdlIGRvbid0LCB0aGVuIHRoZSBXaXphcmQncyBlcnJvciBtZXNzYWdlIGZpZWxkCi0gICAqIGlzIGNsZWFyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgVGhlIHRleHQgb2YgdGhlIG5ldyBlcnJvciBtZXNzYWdlLiAgQSB2YWx1ZSBvZiBudWxsIGluZGljYXRlcyB0aGF0IHRoZSBlcnJvciBtZXNzYWdlIHNob3VsZAotICAgKiAgYmUgY2xlYXJlZC4KLSAgICogQHBhcmFtIHR5cGUgVGhlIGVycm9yIHR5cGUsIG9uZSBvZiBQQVJTRSwgVE9LRU4sIG9yIFNFTEVDVElPTi4KLSAgICovIAotICBwcml2YXRlIHZvaWQgZGlzcGxheUVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlLCBpbnQgdHlwZSkKLSAgewotICAgIFN0cmluZyBtZXNzYWdlVG9EaXNwbGF5ID0gbnVsbDsKLQotCi0gICAgY3VycmVudEVycm9yTWVzc2FnZXNbdHlwZV0gPSBlcnJvck1lc3NhZ2U7Ci0KLSAgICBtZXNzYWdlVG9EaXNwbGF5ID0gZXJyb3JNZXNzYWdlOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fRVJST1JfTUVTU0FHRV9UWVBFUzsgaSsrKQotICAgIHsKLSAgICAgIGlmIChtZXNzYWdlVG9EaXNwbGF5ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgbWVzc2FnZVRvRGlzcGxheSA9IGN1cnJlbnRFcnJvck1lc3NhZ2VzW2ldOwotICAgIH0KLQotICAgIHNldEVycm9yTWVzc2FnZShtZXNzYWdlVG9EaXNwbGF5KTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFNldHMgdGhlIFdpemFyZCdzIGVycm9yIG1lc3NhZ2UgdG8gbWVzc2FnZSwgcHJlY2VkZWQgYnkgYSBzdGFuZGFyZCBwcmVmaXguCi0gICAqCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBuZXcgZXJyb3IgbWVzc2FnZSAob3IgbnVsbCB0byBjbGVhciBpdCkuCi0gICAqLwotICBwcml2YXRlIHZvaWQgZGlzcGxheVJlZ2V4RXJyb3JNZXNzYWdlIChTdHJpbmcgZXJyb3JNZXNzYWdlKQotICB7Ci0gICAgaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGRpc3BsYXlFcnJvck1lc3NhZ2UobnVsbCwgUEFSU0UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIAlpZiAoZXJyb3JNZXNzYWdlLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyB3aGVuIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlLgotICAgIAl7Ci0gICAgICAgIGRpc3BsYXlFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1JFR0VYX0VSUk9SIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJTRSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRpc3BsYXlFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlLCBQQVJTRSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogVXBkYXRlcyB0aGUgdG9rZW4gc3RhdHVzLiAgU2V0cyBpc1ZhbGlkVG9rZW4gdG8gc3RhdHVzICYmIHRoZSBzdGF0dXMgb2YgdGhlIG90aGVyIGVycm9yIHR5cGUuCi0gICAqIElmIHN0YXR1cyBpcyB0cnVlLCB3ZSBjbGVhciB0aGUgd2l6YXJkJ3MgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyB0eXBlOyBpZiBpdCBpcyBmYWxzZSwgd2Ugc2V0IGl0IHRvIGVycm9yTWVzc2FnZS4KLSAgICoKLSAgICogQHBhcmFtIHN0YXR1cyBUaGUgbmV3IGlzVmFsaWRUb2tlbiB2YWx1ZS4KLSAgICogQHBhcmFtIGVycm9yTWVzc2FnZSBUaGUgbmV3IGVycm9yIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBlcnJvciAoZWl0aGVyIFRPS0VOIG9yIFNFTEVDVElPTikuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc2V0VG9rZW5TdGF0dXMgKGJvb2xlYW4gc3RhdHVzLCBTdHJpbmcgZXJyb3JNZXNzYWdlLCBpbnQgdHlwZSkKLSAgewotICAgIGJvb2xlYW4gb3RoZXJUeXBlU3RhdHVzID0gICAgICh0eXBlID09IFRPS0VOKSA/IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFcnJvck1lc3NhZ2VzW1NFTEVDVElPTl0gPT0gbnVsbCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVycm9yTWVzc2FnZXNbVE9LRU5dID09IG51bGw7Ci0gICAgCi0gICAgaXNWYWxpZFRva2VuID0gc3RhdHVzICYmIG90aGVyVHlwZVN0YXR1czsKLSAgICBhZGQuc2V0RW5hYmxlZChpc1ZhbGlkVG9rZW4pOwotCi0gICAgaWYgKHN0YXR1cykKLSAgICB7Ci0gICAgICBkaXNwbGF5RXJyb3JNZXNzYWdlKG51bGwsIHR5cGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIAlpZiAoZXJyb3JNZXNzYWdlICE9IG51bGwgJiYgZXJyb3JNZXNzYWdlLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyB3aGVuIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlLgotICAgIAl7Ci0gICAgICAgIGRpc3BsYXlFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1RPS0VOX0VSUk9SIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZGlzcGxheUVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UsIHR5cGUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIAotICAvKioKLSAgICogVXBkYXRlcyB0aGUgdG9rZW4gc3RhdHVzLiAgU2V0cyBpc1ZhbGlkVG9rZW4gdG8gc3RhdHVzICYmIHRoZSBzdGF0dXMgb2YgdGhlIG90aGVyIGVycm9yIHR5cGUuCi0gICAqIEFsc28gY2xlYXJzIHRoZSB3aXphcmQncyBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHR5cGUuCi0gICAqIFVzdWFsbHkgdXNlZCB0byBzZXQgaXNWYWxpZFRva2VuIHRvIHRydWUuCi0gICAqCi0gICAqIEBwYXJhbSBzdGF0dXMgVGhlIG5ldyBpc1ZhbGlkVG9rZW4gdmFsdWUuCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBlcnJvciAoZWl0aGVyIFRPS0VOIG9yIFNFTEVDVElPTikuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc2V0VG9rZW5TdGF0dXMoYm9vbGVhbiBzdGF0dXMsIGludCB0eXBlKQotICB7Ci0gICAgc2V0VG9rZW5TdGF0dXMoc3RhdHVzLCBudWxsLCB0eXBlKTsKLSAgfQotCi0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgdGhlIHRleHQgZmllbGRzIGFuZCBsYWJlbHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcXVhbnRpZmllci4KLSAgICogSWYgc3RhdHVzIGlzIHRydWUsIHRoZW4gZmllbGRzIGFuZCBsYWJlbHMgYXNzb2NpYXRlZCB3aXRoIG90aGVyIHF1YW50aWZpZXJzIGFyZSBkaXNhYmxlZC4KLSAgICogQHBhcmFtIHF1YW50aWZpZXIgVGhlIHF1YW50aWZpZXIgd2hvc2UgZWxlbWVudHMnIGVuYWJsZWQgc3RhdHVzIHdlIHdpc2ggdG8gY2hhbmdlCi0gICAqICAgKGFzIGVudW1lcmF0ZWQgaW4gUmVnZXhOb2RlKS4KLSAgICogQHBhcmFtIHN0YXR1cyBUaGUgbmV3IHN0YXR1cyBvZiB0aGUgZWxlbWVudHMuICBJZiB0cnVlLCB0aGVuIGFsbCBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGggb3RoZXIgYnV0dG9ucwotICAgKiAgICAgICAgICAgICAgIGFyZSBkaXNhYmxlZC4KLSAgICovICAgIAotICBwcml2YXRlIHZvaWQgc2V0RW5hYmxlZFN0YXR1cyhpbnQgcXVhbnRpZmllciwgYm9vbGVhbiBzdGF0dXMpCi0gIHsKLSAgICBzd2l0Y2ggKHF1YW50aWZpZXIpCi0gICAgewotICAgIAotICAgIGNhc2UgUmVnZXhOb2RlLlJFUEVBVDoKLSAgICAgIHJlcGVhdFZhbHVlLnNldEVuYWJsZWQoc3RhdHVzKTsKLSAgICAgIGlmIChzdGF0dXMpCi0gICAgICB7Ci0gICAgICAgIHJhbmdlTWluVmFsdWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHJhbmdlTWF4VmFsdWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHJhbmdlVG9MYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSZWdleE5vZGUuUkFOR0U6Ci0gICAgICByYW5nZU1pblZhbHVlLnNldEVuYWJsZWQoc3RhdHVzKTsKLSAgICAgIHJhbmdlTWF4VmFsdWUuc2V0RW5hYmxlZChzdGF0dXMpOwotICAgICAgcmFuZ2VUb0xhYmVsLnNldEVuYWJsZWQoc3RhdHVzKTsKLSAgICAgIGlmIChzdGF0dXMpCi0gICAgICB7Ci0gICAgICAgIHJlcGVhdFZhbHVlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiBpbiB2YWx1ZS4gIElmIHRoZXJlIGlzIG5vdCwgd2Ugc2V0IHRoZSBXaXphcmQncyBlcnJvciBtZXNzYWdlIGFjY29yZGluZ2x5LgotICAgKiBJZiB0aGVyZSBpcywgd2UgdXBkYXRlIHRoZSBjb250ZW50cyBvZiBub2RlLiAgSWYgIkN1cnJlbnQgU2VsZWN0aW9uIiBpcyBub3QgdGhlIGN1cnJlbnQgdG9rZW4sIHRoZW4KLSAgICogd2UgY2xlYXIgdGhlIFNlbGVjdGlvbiBlcnJvciBtZXNzYWdlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUN1cnJlbnRTZWxlY3Rpb25TdGF0dXMoKQotICB7Ci0gICAgaWYgKHRlcm1zLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gUmVnZXhOb2RlLlNFTEVDVElPTikKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gdmFsdWUuZ2V0U2VsZWN0aW9uVGV4dCgpOwotICAgICAgaWYgKHNlbGVjdGlvbi5lcXVhbHMoIiIpKQotICAgICAgewotICAgICAgICBzZXRUb2tlblN0YXR1cyhmYWxzZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1NFTEVDVElPTl9FUlJPUiIpLCBTRUxFQ1RJT04pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzZXRUb2tlblN0YXR1cyh0cnVlLCBTRUxFQ1RJT04pOwotICAgICAgICBub2RlLnNldENvbnRlbnRzKHNlbGVjdGlvbik7Ci0gICAgICAgIG5vZGUuc2V0SGFzUGFyZW5zKHRydWUpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0VG9rZW5TdGF0dXModHJ1ZSwgU0VMRUNUSU9OKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVXBkYXRlcyB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgdGhlIGF1dG8tZXNjYXBlIGNoZWNrYm94LiAgSWYgc3RhdHVzIGlzIHRydWUsIHdlIGVuYWJsZSB0aGUgY2hlY2tib3gsIGFuZAotICAgKiBzZXQgaXRzIHNlbGVjdGlvbiBzdGF0dXMgYW5kIG5vZGUncyBhdXRvLWVzY2FwZSBzdGF0dXMgdG8gdGhlIHZhbHVlIG9mIGF1dG9Fc2NhcGVTdGF0dXMuICBJZiBzdGF0dXMgaXMKLSAgICogZmFsc2UsIHRoZW4gd2UgZGlzYWJsZSBhbmQgZGVzZWxlY3QgdGhlIGNoZWNrYm94LCBhbmQgc2V0IG5vZGUncyBzdGF0dXMgdG8gZmFsc2UuCi0gICAqCi0gICAqIEBwYXJhbSBzdGF0dXMgVGhlIG5ldyBlbmFibGVkIHN0YXR1cy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBzZXRFc2NhcGVDaGVja2JveEVuYWJsZWRTdGF0dXMoYm9vbGVhbiBzdGF0dXMpCi0gIHsKLSAgICBpZiAoc3RhdHVzKQotICAgIHsKLSAgICAgIGVzY2FwZUNoZWNrYm94LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICBlc2NhcGVDaGVja2JveC5zZXRTZWxlY3Rpb24oYXV0b0VzY2FwZVN0YXR1cyk7Ci0gICAgICBub2RlLnNldEF1dG9Fc2NhcGVTdGF0dXMoYXV0b0VzY2FwZVN0YXR1cyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlc2NhcGVDaGVja2JveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIGVzY2FwZUNoZWNrYm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICBub2RlLnNldEF1dG9Fc2NhcGVTdGF0dXMoZmFsc2UpOwotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcmVnZXggZmxhZ3MuCi0gICAqLwotICBTdHJpbmcgZ2V0RmxhZ3MoKQotICB7Ci0gICAgcmV0dXJuIHJlZ2V4RmxhZ3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBYU0RQYXR0ZXJuIG1vZGVsLgotICAgKi8KLSAgWFNEUGF0dGVybkZhY2V0IGdldFBhdHRlcm4oKQotICB7Ci0gICAgcmV0dXJuIHBhdHRlcm47Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnNpc3Rpbmcgb2YgdGhlIHZhbHVlcyBvZiBtaW4sIG1heCwgYW5kIHJlcGVhdCBzdG9yZWQgaW4gbm9kZS4KLSAgICogVXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCi0gICAqLyAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEFsbEZpZWxkVmFsdWVzKCkKLSAgewotICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotICAgICAgcmVzdWx0ICs9ICJNaW46ICIgKyBub2RlLmdldE1pbigpICsgIlxuIjsKLSAgICAgIHJlc3VsdCArPSAiTWF4OiAiICsgbm9kZS5nZXRNYXgoKSArICJcbiI7Ci0gICAgICByZXN1bHQgKz0gIlJlcGVhdDogIiArIG5vZGUuZ2V0UmVwZWF0KCkgKyAiXG4iOwotICAgICAgcmVzdWx0ICs9ICJcbiI7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotCi0gIC8qIExpc3RlbmVyIGZvciB0aGUgYWRkIGJ1dHRvbi4gKi8KLSAgY2xhc3MgQnV0dG9uU2VsZWN0TGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgIH0KLQotICAgIC8vIFByZWNvbmRpdGlvbjogaXNWYWxpZFRva2VuID09IHRydWUgIAotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgaWYgKCFpc1ZhbGlkVG9rZW4pIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvLyBXaGV0aGVyIHRoZXJlIGlzIGFueXRoaW5nIHNlbGVjdGVkIGluIHZhbHVlLgotICAgICAgYm9vbGVhbiBpc0FjdGl2ZVNlbGVjdGlvbiA9IHZhbHVlLmdldFNlbGVjdGlvbkNvdW50KCkgIT0gMDsKLSAgICAgIAotICAgICAgdmFsdWUuaW5zZXJ0KG5vZGUudG9TdHJpbmcoKSk7Ci0KLSAgICAgIGlmICh0ZXJtcy5nZXRTZWxlY3Rpb25JbmRleCgpID09IFJlZ2V4Tm9kZS5TRUxFQ1RJT04pCi0gICAgICB7Ci0gICAgICAgIHVwZGF0ZUN1cnJlbnRTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgbm90aGluZyBpcyBzZWxlY3RlZCwgdGhlbiB3ZSBuZWVkIHRvIGFkdmFuY2UgdGhlIGNhcmV0IGxvY2F0aW9uLgotICAgICAgaWYgKCFpc0FjdGl2ZVNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgdmFsdWUuc2V0Q2FyZXRPZmZzZXQodmFsdWUuZ2V0Q2FyZXRPZmZzZXQoKSArIG5vZGUudG9TdHJpbmcoKS5sZW5ndGgoKSk7Ci0gICAgICB9Ci0KLSAgICAgIHZhbHVlLnNldEZvY3VzKCk7Ci0KLSAgICB9Ci0KLSAgfQotIAotCi0gIC8qIExpc3RlbmVyIGZvciB0aGUgdGVybXMgY29tYm8gYm94LiAqLwotICBjbGFzcyBDb21ib0xpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpCi0gICAgewotICAgICAgCi0gICAgICB1cGRhdGVDdXJyZW50U2VsZWN0aW9uU3RhdHVzKCk7Ci0KLSAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyB0eXBlZCBpbiBhIHRva2VuCi0gICAgICBpZiAodGVybXMuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgc2V0RXNjYXBlQ2hlY2tib3hFbmFibGVkU3RhdHVzKHRydWUpOwotICAgICAgICBub2RlLnNldENvbnRlbnRzKHRlcm1zLmdldFRleHQoKSk7Ci0gICAgICAgIG5vZGUuc2V0SGFzUGFyZW5zKHRydWUpOwotICAgICAgICAKLQotICAgICAgICBpZiAoZGVidWcpCi0gICAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGVybXMuZ2V0VGV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0ZXJtcy5nZXRTZWxlY3Rpb25JbmRleCgpID09IFJlZ2V4Tm9kZS5TRUxFQ1RJT04pCi0gICAgICB7Ci0gICAgICAgIHNldEVzY2FwZUNoZWNrYm94RW5hYmxlZFN0YXR1cyhmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG5vZGUuc2V0Q29udGVudHMoUmVnZXhOb2RlLmdldFJlZ2V4VGVybVZhbHVlKHRlcm1zLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLSAgICAgICAgbm9kZS5zZXRIYXNQYXJlbnMoZmFsc2UpOwotICAgICAgICBzZXRFc2NhcGVDaGVja2JveEVuYWJsZWRTdGF0dXMoZmFsc2UpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogTGlzdGVuZXIgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyBjYXJldExhYmVsLiAqLwotICBjbGFzcyBUZXh0Rm9jdXNMaXN0ZW5lciBpbXBsZW1lbnRzIEZvY3VzTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkKLSAgICB7Ci0gICAgICBzZXRTaG93Q2FyZXRMYWJlbChmYWxzZSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpCi0gICAgewotICAgICAgc2V0U2hvd0NhcmV0TGFiZWwodHJ1ZSk7Ci0gICAgfQotICB9Ci0KLQotCi0gIC8qIExpc3RlbmVyIGZvciB0aGUgdGV4dCBmaWVsZHMuICovCi0gIGNsYXNzIFRleHRMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkKLSAgICB7Ci0KLSAgICAgIGlmIChkZWJ1ZykKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnNpZGUgVGV4dExpc3RlbmVyIGhhbmRsZXIiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0QWxsRmllbGRWYWx1ZXMoKSk7Ci0gICAgICB9Ci0KLQotICAgICAgaWYgKCAoZS53aWRnZXQgPT0gdmFsdWUpICYmIChlLnR5cGUgPT0gU1dULk1vZGlmeSkgKQotICAgICAgewotICAgICAgICBwYXR0ZXJuLnNldExleGljYWxWYWx1ZSh2YWx1ZS5nZXRUZXh0KCkpOwotICAgICAgICB2YWxpZGF0ZVJlZ2V4KCk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHZhbHVlICYmIGUudHlwZSA9PSBTV1QuU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBpZiAodGVybXMuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSBSZWdleE5vZGUuU0VMRUNUSU9OKQotICAgICAgICB7Ci0gICAgICAgICAgdXBkYXRlQ3VycmVudFNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHJhbmdlTWluVmFsdWUpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IG5vZGUuc2V0TWluKHJhbmdlTWluVmFsdWUuZ2V0VGV4dCgpKTsKLQotICAgICAgICBpZiAoaXNWYWxpZCkKLSAgICAgICAgewotICAgICAgICAgIHNldFRva2VuU3RhdHVzKHRydWUsIG51bGwsIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRUb2tlblN0YXR1cyhmYWxzZSwgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9NSU5fRVJST1JfU1VGRklYIiksIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSByYW5nZU1heFZhbHVlKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBub2RlLnNldE1heChyYW5nZU1heFZhbHVlLmdldFRleHQoKSk7Ci0KLSAgICAgICAgaWYgKG5vZGUuZ2V0TWluKCkgPT0gUmVnZXhOb2RlLkVNUFRZKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0VG9rZW5TdGF0dXMoZmFsc2UsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfTUlTU0lOR19NSU5fRVJST1JfU1VGRklYIiksIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc1ZhbGlkKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0VG9rZW5TdGF0dXModHJ1ZSwgbnVsbCwgVE9LRU4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHNldFRva2VuU3RhdHVzKGZhbHNlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfTUFYX0VSUk9SX1NVRkZJWCIpLCBUT0tFTik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZSAgLy8gKGUud2lkZ2V0ID09IHJlcGVhdFZhbHVlKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBub2RlLnNldFJlcGVhdChyZXBlYXRWYWx1ZS5nZXRUZXh0KCkpOwotICAgICAgICBpZiAoaXNWYWxpZCkKLSAgICAgICAgewotICAgICAgICAgIHNldFRva2VuU3RhdHVzKHRydWUsIG51bGwsIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRUb2tlblN0YXR1cyhmYWxzZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1JFUEVBVF9FUlJPUl9TVUZGSVgiKSwgVE9LRU4pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogTGlzdGVuZXIgZm9yIHRoZSBhdXRvLWVzY2FwZSBjaGVja2JveC4gKi8KLSAgY2xhc3MgQ2hlY2tib3hMaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBib29sZWFuIG5ld1N0YXR1cyA9ICFhdXRvRXNjYXBlU3RhdHVzOwotICAgICAgbm9kZS5zZXRBdXRvRXNjYXBlU3RhdHVzKG5ld1N0YXR1cyk7Ci0gICAgICBhdXRvRXNjYXBlU3RhdHVzID0gbmV3U3RhdHVzOwotICAgICAgCi0gICAgICBpZiAoZGVidWcpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXV0b0VzY2FwZSBTdGF0dXM6ICIgKyBub2RlLmdldEF1dG9Fc2NhcGVTdGF0dXMoKSk7ICAvLyROT04tTkxTLTEkIAotICAgICAgfQotICAgIH0KLQotICB9Ci0KLQotICAvKiBMaXN0ZW5lciBmb3IgdGhlIHJhZGlvIGJ1dHRvbnMuICovCi0gIGNsYXNzIFJhZGlvU2VsZWN0TGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgaWYgKGRlYnVnKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0QWxsRmllbGRWYWx1ZXMoKSk7Ci0gICAgICB9Ci0KLQotICAgICAgaW50IGN1cnJlbnRRdWFudGlmaWVyID0gZ2V0UXVhbnRpZmllcihlKTsKLQotICAgICAgbm9kZS5zZXRRdWFudGlmaWVyKGN1cnJlbnRRdWFudGlmaWVyKTsKLQotICAgICAgc3dpdGNoIChjdXJyZW50UXVhbnRpZmllcikKLSAgICAgIHsKLSAgICAgIGNhc2UgUmVnZXhOb2RlLlNJTkdMRTogICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGNhc2UgUmVnZXhOb2RlLlNUQVI6Ci0gICAgICBjYXNlIFJlZ2V4Tm9kZS5QTFVTOgotICAgICAgY2FzZSBSZWdleE5vZGUuT1BUSU9OQUw6Ci0gICAgICAgIHNldEVuYWJsZWRTdGF0dXMoUmVnZXhOb2RlLlJFUEVBVCwgZmFsc2UpOwotICAgICAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SQU5HRSwgZmFsc2UpOwotICAgICAgICBzZXRUb2tlblN0YXR1cyh0cnVlLCBUT0tFTik7Ci0gICAgICAgIGJyZWFrOyAKLQotICAgICAgY2FzZSBSZWdleE5vZGUuUkVQRUFUOgotICAgICAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SRVBFQVQsIHRydWUpOwotICAgICAgICBzZXRUb2tlblN0YXR1cyhub2RlLmhhc1ZhbGlkUmVwZWF0KCksIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9SRVBFQVRfRVJST1JfU1VGRklYIiksIFRPS0VOKTsKLSAgICAgICAgcmVwZWF0VmFsdWUuc2V0Rm9jdXMoKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUmVnZXhOb2RlLlJBTkdFOgotICAgICAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SQU5HRSwgdHJ1ZSk7Ci0gICAgICAgIFN0cmluZyBlcnJvciA9IChub2RlLmhhc1ZhbGlkTWluKCkpID8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX01BWF9FUlJPUl9TVUZGSVgiKSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9NSU5fRVJST1JfU1VGRklYIik7Ci0KLSAgICAgICAgc2V0VG9rZW5TdGF0dXMoIG5vZGUuaGFzVmFsaWRNaW4oKSAmJiBub2RlLmhhc1ZhbGlkTWF4KCksIGVycm9yLCBUT0tFTik7Ci0gICAgICAgIHJhbmdlTWluVmFsdWUuc2V0Rm9jdXMoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UXVhbnRpZmllcihTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLQotICAgICAgaWYgKGUud2lkZ2V0ID09IHNpbmdsZVJhZGlvKQotICAgICAgewotICAgICAgICByZXR1cm4gUmVnZXhOb2RlLlNJTkdMRTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gc3RhclJhZGlvKQotICAgICAgewotICAgICAgICByZXR1cm4gUmVnZXhOb2RlLlNUQVI7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHBsdXNSYWRpbykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFJlZ2V4Tm9kZS5QTFVTOwotICAgICAgfQotICAgICAgCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBvcHRpb25hbFJhZGlvKQotICAgICAgewotICAgICAgICByZXR1cm4gUmVnZXhOb2RlLk9QVElPTkFMOwotICAgICAgfQotICAgICAgCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSByZXBlYXRSYWRpbykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFJlZ2V4Tm9kZS5SRVBFQVQ7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHJhbmdlUmFkaW8pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBSZWdleE5vZGUuUkFOR0U7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGVsc2UgLy8gY2FuJ3QgZ2V0IGhlcmUKLSAgICAgIHsgCi0gICAgICAgIHJldHVybiBSZWdleE5vZGUuRU1QVFk7Ci0gICAgICB9Ci0gICAgfSAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gdmFsdWUuZ2V0VGV4dCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4Tm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9SZWdleE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiYmViYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi0KLWNsYXNzIFJlZ2V4Tm9kZQotewotICBwcml2YXRlIFN0cmluZyBjb250ZW50czsKLSAgcHJpdmF0ZSBpbnQgbWluOwotICBwcml2YXRlIGludCBtYXg7Ci0gIHByaXZhdGUgaW50IHJlcGVhdDsKLSAgcHJpdmF0ZSBpbnQgcXVhbnRpZmllcjsKLSAgcHJpdmF0ZSBib29sZWFuIGhhc1BhcmVuczsKLSAgcHJpdmF0ZSBib29sZWFuIGF1dG9Fc2NhcGVTdGF0dXM7Ci0KLSAgCi0gIC8qIFF1YW50aWZpZXJzLiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU5HTEUgPSAwOyAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUiA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMVVMgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05BTCA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUEVBVCA9IDQ7IAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQU5HRSA9IDU7Ci0KLSAgLyogUmVnZXggcXVhbnRpZmllcnMuICBGaXJzdCBjb2x1bW4gaXMgdGhlIG9uLXNjcmVlbiB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uLCBzZWNvbmQgY29sdW1uIGlzIHRoZSAKLSAgIG9uLXNjcmVlbiByZWdleCByZXByZXNlbnRhdGlvbi4gIFRoZSB0d28gYXJlIGNvbmNhdGVuYXRlZCB0b2dldGhlciB0byBmb3JtIHRoZSBvbi1zY3JlZW4KLSAgIHJlcHJlc2VudGF0aW9uLgotICAgSW5kZXhpbmcgb2YgdGhpcyBhcnJheSBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHZhbHVlcyBvZiB0aGUgcXVhbnRpZmllciBjb25zdGFudHMgYWJvdmUuCi0gICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdW10gcmVnZXhRdWFudGlmaWVycyA9Ci0gIHsgCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfU0lOR0xFIiksICAgIiIgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfU1RBUiIpLCAgICAgIioiIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfUExVUyIpLCAgICAgIisiIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfT1BUSU9OQUwiKSwgIj8iIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfUkVQRUFUIiksICAgIiIgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfUkFOR0UiKSwgICAgIiIgIH0sCi0gIH07Ci0KLQotICAvKiBSZWdleCB0b2tlbnMuICBGaXJzdCBjb2x1bW4gaXMgdGhlIG9uLXNjcmVlbiByZXByZXNlbnRhdGlvbiwgc2Vjb25kIGNvbHVtbiBpcyB0aGUgcmVnZXggcmVwcmVzZW50YXRpb24uIAotICAgICBNb3JlIHRva2VucyBjYW4gYmUgYWRkZWQsIGJ1dCBpdCBpcyBhc3N1bWVkIHRoYXQgIkN1cnJlbnQgU2VsZWN0aW9uIiBpcyB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBhcnJheS4KLSAgICAgSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHRoZW4gdGhlIHZhbHVlIG9mIHRoZSBTRUxFQ1RJT04gY29uc3RhbnQgYmVsb3cgd2lsbCBuZWVkIHRvIGJlIGNoYW5nZWQgCi0gICAgIGFjY29yZGluZ2x5LgotICAgICBBbHNvIG5vdGUgdGhhdCBiZWNhdXNlIHRoZXNlIGFyZSBqYXZhIFN0cmluZ3MsIGJhY2tzbGFzaGVzIG11c3QgYmUgZXNjYXBlZCAodGhpcyBpcyBvbmx5IHJlbGV2YW50IHRvIHRoZQotICAgICBzZWNvbmQgY29sdW1uIG9mIHRoZSBhcnJheSkuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXVtdIHJlZ2V4VGVybXMgPQotICB7IAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVJNX0FOWV9DSEFSIiksICAgIi4iICAgICB9LAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVJNX0FMUEhBTlVNRVJJQ19DSEFSIiksICAgIlxcdyIgICAgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fV0hJVEVTUEFDRSIpLCAiXFxzIiAgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fRElHSVQiKSwgICAgICAiXFxkIiAgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fVVBQRVIiKSwgICAgICAiW0EtWl0iIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fTE9XRVIiKSwgICAgICAiW2Etel0iIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fU0VMRUNUSU9OIiksICAiIiAgICAgIH0sCi0gIH07Ci0KLSAgLyogVG9rZW4gZW51bWVyYXRlZCBjb25zdGFudHMuICovCi0KLSAgLy8gU0VMRUNUSU9OIG11c3QgY29ycmVzcG9uZCB0byB0aGUgaW5kZXggaW4gcmVnZXhUZXJtcyBvZiAiQ3VycmVudCBTZWxlY3Rpb24iLiAgVGhpcyBpcyBhc3N1bWVkIHRvIGJlCi0gIC8vICB0aGUgbGFzdCBlbGVtZW50LgotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT04gPSByZWdleFRlcm1zLmxlbmd0aCAtIDE7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFkgPSAtMTsKLQotICAvKiAKLSAgVGhlIG1ldGFjaGFyYWN0ZXJzIHJlY29nbml6ZWQgYnkgWE1MIFNjaGVtYS4KLSAgTm90ZSB0aGF0IHRoZSBkb3VibGUgYmFja3NsYXNoICgiXFwiKSBhY3R1YWxseSByZXByZXNlbnRzIGFuIGVzY2FwZWQgc2luZ2xlIGJhY2tzbGFzaCBjaGFyYWN0ZXIgKCJcIikuCi0gICovIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbWV0YWNoYXJhY3RlcnMgPSAiLlxcPyore30oKVtdIjsKLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlZ2V4VGVybVRleHQoaW50IGkpCi0gIHsKLSAgICBpZiAoaSA9PSBTRUxFQ1RJT04pCi0gICAgewotICAgICAgcmV0dXJuIHJlZ2V4VGVybXNbaV1bMF07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gcmVnZXhUZXJtc1tpXVswXSArICIgKCAiICsgcmVnZXhUZXJtc1tpXVsxXSArICIgKSI7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVnZXhUZXJtVmFsdWUoaW50IGkpCi0gIHsKLSAgICBpZiAoaSA9PSBTRUxFQ1RJT04pIC8vIHNob3VsZG4ndCBoYXBwZW4KLSAgICB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gcmVnZXhUZXJtc1tpXVsxXTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBnZXROdW1SZWdleFRlcm1zKCkKLSAgewotICAgIHJldHVybiByZWdleFRlcm1zLmxlbmd0aDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFF1YW50aWZpZXJUZXh0KGludCBpKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IHJlZ2V4UXVhbnRpZmllcnNbaV1bMF07Ci0gICAgCi0gICAgaWYgKCFyZWdleFF1YW50aWZpZXJzW2ldWzFdLmVxdWFscygiIikpCi0gICAgewotICAgICAgcmVzdWx0ICs9ICIgKCAiOwotICAgICAgcmVzdWx0ICs9IHJlZ2V4UXVhbnRpZmllcnNbaV1bMV07Ci0gICAgICByZXN1bHQgKz0gIiApIjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFJlZ2V4Tm9kZSgpCi0gIHsKLSAgICB0aGlzLmNvbnRlbnRzID0gIiI7Ci0gICAgdGhpcy5xdWFudGlmaWVyID0gU0lOR0xFOwotICAgIHRoaXMubWluID0gRU1QVFk7Ci0gICAgdGhpcy5tYXggPSBFTVBUWTsKLSAgICB0aGlzLnJlcGVhdCA9IEVNUFRZOwotICAgIHRoaXMuaGFzUGFyZW5zID0gZmFsc2U7Ci0KLSAgfQotCi0gIAotICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRzKCkKLSAgewotICAgIHJldHVybiBjb250ZW50czsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29udGVudHMoU3RyaW5nIGNvbnRlbnRzKQotICB7Ci0gICAgdGhpcy5jb250ZW50cyA9IGNvbnRlbnRzOwotICB9Ci0KLQotICBwdWJsaWMgaW50IGdldFF1YW50aWZpZXIoKQotICB7Ci0gICAgcmV0dXJuIHF1YW50aWZpZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRRdWFudGlmaWVyKGludCBxdWFudGlmaWVyKQotICB7Ci0gICAgdGhpcy5xdWFudGlmaWVyID0gcXVhbnRpZmllcjsKLSAgfQotCi0KLSAgcHVibGljIGludCBnZXRNaW4oKQotICB7Ci0gICAgcmV0dXJuIG1pbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1pbihpbnQgbWluKQotICB7Ci0gICAgdGhpcy5taW4gPSBtaW47Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGlzLm1pbiB0byB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBtaW4gaWZmIG1pbiBpcyBhIHZhbGlkIHZhbHVlIChpLmUuIGdyZWF0ZXIgdGhhbiAwKS4KLSAgICogU2V0cyB0aGlzLm1pbiB0byBFTVBUWSBpZiBpdCBpcyBub3QuCi0gICAqCi0gICAqIEBwYXJhbSBtaW4gVGhlIG5ldyBtaW4gdmFsdWUKLSAgICogQHJldHVybnMgV2hldGhlciBtaW4gd2FzIGEgdmFsaWQgdmFsdWUKLSAgICovICAKLSAgcHVibGljIGJvb2xlYW4gc2V0TWluKFN0cmluZyBtaW4pCi0gIHsKLSAgICB0aGlzLm1pbiA9IGNvbnZlcnRUb0ludChtaW4pOwotCi0gICAgLy8gbWluID4gbWF4IGlzIGFuIGludmFsaWQgY2FzZSwgdW5sZXNzIG1heCBpcyBFTVBUWSAoc2luY2UgRU1QVFkgPT0gLTEpLgotICAgIGlmICggKHRoaXMubWF4ICE9IEVNUFRZKSAmJiAodGhpcy5taW4gPiB0aGlzLm1heCkgKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuICh0aGlzLm1pbiA+PSAwKTsKLSAgfQotCi0gIAotICBwdWJsaWMgaW50IGdldE1heCgpCi0gIHsKLSAgICByZXR1cm4gbWF4OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNYXgoaW50IG1heCkKLSAgewotICAgIHRoaXMubWF4ID0gbWF4OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhpcy5tYXggdG8gdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgbWF4IGlmZiBtYXggaXMgYSB2YWxpZCB2YWx1ZSAoaS5lLiBncmVhdGVyIHRoYW4gMCkuCi0gICAqIFNldHMgdGhpcy5tYXggdG8gRU1QVFkgaWYgaXQgaXMgbm90LgotICAgKgotICAgKiBAcGFyYW0gbWF4IFRoZSBuZXcgbWF4IHZhbHVlCi0gICAqIEByZXR1cm5zIFdoZXRoZXIgbWF4IHdhcyBhIHZhbGlkIHZhbHVlLCBvciAod2hldGhlciBtYXggPT0gdGhlIGVtcHR5IHN0cmluZyAmJiBtaW4gaGFzIGEgdmFsaWQgdmFsdWUpCi0gICAqLyAKLSAgcHVibGljIGJvb2xlYW4gc2V0TWF4KFN0cmluZyBtYXgpCi0gIHsKLSAgICB0aGlzLm1heCA9IGNvbnZlcnRUb0ludChtYXgpOwotCi0gICAgLy8gVGhlIGVtcHR5IHN0cmluZyBpcyBhIHZhbGlkIG1heCB2YWx1ZSBpZmYgbWluIGhhcyBhIHZhbGlkIHZhbHVlLgotICAgIC8vIFRoaXMgaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQge24sfSBtZWFucyAiYXQgbGVhc3QgbiB0aW1lcyIgaW4gcmVnZXggcGFybGFuY2UuCi0gICAgaWYgKG1heC5lcXVhbHMoIiIpICYmIHRoaXMubWluICE9IEVNUFRZKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBlbHNlIGlmICh0aGlzLm1heCA8IHRoaXMubWluKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAodGhpcy5tYXggPj0gMCk7Ci0gICAgfQotICB9Ci0KLQotIAotICBwdWJsaWMgaW50IGdldFJlcGVhdCgpCi0gIHsKLSAgICByZXR1cm4gcmVwZWF0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVwZWF0KGludCByZXBlYXQpCi0gIHsKLSAgICB0aGlzLnJlcGVhdCA9IHJlcGVhdDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoaXMucmVwZWF0IHRvIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHJlcGVhdCBpZmYgcmVwZWF0IGlzIGEgdmFsaWQgdmFsdWUgKGkuZS4gZ3JlYXRlciB0aGFuIDApLgotICAgKiBTZXRzIHRoaXMucmVwZWF0IHRvIEVNUFRZIGlmIGl0IGlzIG5vdC4KLSAgICoKLSAgICogQHBhcmFtIHJlcGVhdCBUaGUgbmV3IHJlcGVhdCB2YWx1ZQotICAgKiBAcmV0dXJucyBXaGV0aGVyIHJlcGVhdCB3YXMgYSB2YWxpZCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0UmVwZWF0KFN0cmluZyByZXBlYXQpCi0gIHsKLSAgICB0aGlzLnJlcGVhdCA9IGNvbnZlcnRUb0ludChyZXBlYXQpOwotICAgIHJldHVybiAodGhpcy5yZXBlYXQgPj0gMCk7Ci0gIH0KLQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2Ygcy4gIElmIHMgaXMgbGVzcyB0aGFuIHplcm8sIG9yIGlmIHMgaXMgbm90IGFuIGludAotICAgKiAoaS5lLiBpZiBJbnRlZ2VyLnBhcnNlSW50IHdvdWxkIHRocm93IGEgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKSwgdGhlbiByZXR1cm5zIEVNUFRZLgotICAgKgotICAgKiBAcGFyYW0gcyBUaGUgU3RyaW5nIHRvIGNvbnZlcnQuCi0gICAqIEByZXR1cm5zIFRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHMuCi0gICAqLwotICBwcml2YXRlIGludCBjb252ZXJ0VG9JbnQoU3RyaW5nIHMpCi0gIHsKLSAgICBpbnQgcmVzdWx0OwotICAgIHRyeQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEludGVnZXIucGFyc2VJbnQocyk7Ci0gICAgICBpZiAocmVzdWx0IDwgMCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gRU1QVFk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBFTVBUWTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRIYXNQYXJlbnMoKQotICB7Ci0gICAgcmV0dXJuIGhhc1BhcmVuczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhhc1BhcmVucyhib29sZWFuIHN0YXR1cykKLSAgewotICAgIHRoaXMuaGFzUGFyZW5zID0gc3RhdHVzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0QXV0b0VzY2FwZVN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gYXV0b0VzY2FwZVN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEF1dG9Fc2NhcGVTdGF0dXMoYm9vbGVhbiBzdGF0dXMpCi0gIHsKLSAgICB0aGlzLmF1dG9Fc2NhcGVTdGF0dXMgPSBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBlc2NhcGVkIHZlcnNpb24gb2Ygcy4gIEluIG90aGVyIHdvcmRzLCBlYWNoIG9jY3VycmVuY2Ugb2YgYSBtZXRhY2hhcmFjdGVyICggLlw/Kit7fSgpW10gKQotICAgKiBpcyByZXBsYWNlZCBieSB0aGF0IGNoYXJhY3RlciBwcmVjZWRlZCBieSBhIGJhY2tzbGFzaC4KLSAgICoKLSAgICogQHBhcmFtIHMgVGhlIFN0cmluZyB0byBlc2NhcGUuCi0gICAqIEByZXR1cm5zIEFuIGVzY2FwZWQgdmVyc2lvbiBvZiBzLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgYWRkRXNjYXBlQ2hhcmFjdGVycyhTdHJpbmcgcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgY3VycmVudENoYXIgPSBzLmNoYXJBdChpKTsKLQotICAgICAgaWYgKGlzTWV0YWNoYXIoY3VycmVudENoYXIpKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKCJcXCIpOyAvLyBOb3RlIHRoYXQgdGhpcyBpcyBhbiBlc2NhcGVkIGJhY2tzbGFzaCwgbm90IGEgZG91YmxlIGJhY2tzbGFzaC4KLSAgICAgIH0KLSAgICAgIHJlc3VsdC5hcHBlbmQoY3VycmVudENoYXIpOwotCi0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIGMgaXMgYSBtZXRhY2hhcmFjdGVyIGFzIGRlZmluZWQgaW4gdGhlIHN0YXRpYyB2YXJpYWJsZSBtZXRhY2hhcmFjdGVycy4KLSAgICoKLSAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICogQHJldHVybnMgV2hldGhlciBjIGlzIGEgbWV0YWNoYXJhY3Rlci4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc01ldGFjaGFyKGNoYXIgYykKLSAgewotICAgIHJldHVybiBtZXRhY2hhcmFjdGVycy5pbmRleE9mKGMpICE9IC0xOwotICB9Ci0gIAotCi0gIHB1YmxpYyBib29sZWFuIGhhc1ZhbGlkTWluKCkKLSAgewotICAgIHJldHVybiAobWluICE9IEVNUFRZKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhhc1ZhbGlkTWF4KCkKLSAgewotICAgIHJldHVybihtYXggIT0gRU1QVFkpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGFzVmFsaWRSZXBlYXQoKQotICB7Ci0gICAgcmV0dXJuKHJlcGVhdCAhPSBFTVBUWSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSAiIjsKLSAgICAKLSAgICBpZiAoaGFzUGFyZW5zKQotICAgIHsKLSAgICAgIHJlc3VsdCArPSAiKCI7Ci0gICAgfQotICAgIAotICAgIGlmIChhdXRvRXNjYXBlU3RhdHVzKQotICAgIHsKLSAgICAgICByZXN1bHQgKz0gYWRkRXNjYXBlQ2hhcmFjdGVycyhjb250ZW50cyk7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgcmVzdWx0ICs9IGNvbnRlbnRzOwotICAgIH0KLQotCi0gICAgaWYgKGhhc1BhcmVucykKLSAgICB7Ci0gICAgICByZXN1bHQgKz0gIikiOwotICAgIH0KLSAgICAKLSAgICBzd2l0Y2ggKHF1YW50aWZpZXIpCi0gICAgewotICAgICAgY2FzZSBTVEFSOgotICAgICAgICByZXN1bHQgKz0gIioiOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBQTFVTOgotICAgICAgICByZXN1bHQgKz0gIisiOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBPUFRJT05BTDoKLSAgICAgICAgcmVzdWx0ICs9ICI/IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgUkVQRUFUOgotICAgICAgICByZXN1bHQgKz0gInsiICsgcmVwZWF0ICsgIn0iOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgcmVzdWx0ICs9ICJ7IiArIG1pbiArICIsIjsKLSAgICAgICAgaWYgKG1heCA9PSBFTVBUWSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCArPSAiIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgKz0gbWF4OwotICAgICAgICB9ICAgICAgIAotICAgICAgICByZXN1bHQgKz0gIn0iOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgLy8gU0lOR0xFIGlzIGEgZmFsbCB0aHJvdWdoICAgICAgICAgICAKLQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4VGVzdGluZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhUZXN0aW5nUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODhjNmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhUZXN0aW5nUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIEJhc2VkIG9uIHZlcnNpb24gMS42IG9mIG9yaWdpbmFsIHhzZGVkaXRvcgotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5UZXh0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci0KLQotcHVibGljIGNsYXNzIFJlZ2V4VGVzdGluZ1BhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi17Ci0gIC8qIFZhbGlkYXRvciBmcm9tIHhlcmNlcyBwYWNrYWdlLiAqLwotLy8gIHByaXZhdGUgUmVndWxhckV4cHJlc3Npb24gdmFsaWRhdG9yOwotICAKLSAgLyogRGlzcGxheXMgdGhlIHN0YXR1cyBvZiB0aGUgbWF0Y2guICovCi0gIHByaXZhdGUgTGFiZWwgbWF0Y2hMYWJlbDsKLQotCi0gIC8qIFRoZSByZWdleC4gKi8KLSAgcHJpdmF0ZSBUZXh0IHZhbHVlOwotICAKLSAgLyogVGhlIHN0cmluZyB0aGUgdXNlciBpcyB0cnlpbmcgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgcmVnZXguICovCi0gIHByaXZhdGUgU3R5bGVkVGV4dCB0ZXN0U3RyaW5nOwotCi0gIHB1YmxpYyBSZWdleFRlc3RpbmdQYWdlKCkKLSAgewotICAgIHN1cGVyKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVEVTVElOR19QQUdFX1RJVExFIikpOwotCi0gICAgc2V0VGl0bGUoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfVElUTEUiKSk7Ci0gICAgc2V0RGVzY3JpcHRpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfREVTQ1JJUFRJT04iKSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1RFU1RfUEFHRSk7Ci0KLSAgICBtYXRjaExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotICAgIG1hdGNoTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFU1RJTkdfUEFHRV9ERVNDUklQVElPTiIpKTsKLSAgICBGb250RGF0YVtdIGZvbnREYXRhID0gbWF0Y2hMYWJlbC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLSAgICBHcmlkRGF0YSBkYXRhRiA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGFGLndpZHRoSGludCA9IDQwMDsKLSAgICBkYXRhRi5oZWlnaHRIaW50ID0gNiAqIGZvbnREYXRhWzBdLmdldEhlaWdodCgpOwotICAgIG1hdGNoTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhRik7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGNvbnRyb2xzID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGNvbnRyb2xzTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBjb250cm9sc0xheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBjb250cm9scy5zZXRMYXlvdXQoY29udHJvbHNMYXlvdXQpOwotICAgIGNvbnRyb2xzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgbmV3IExhYmVsKGNvbnRyb2xzLCBTV1QuTEVGVCkuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1JFR0VYX0xBQkVMIikpOwotICAgIHZhbHVlID0gbmV3IFRleHQoY29udHJvbHMsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICB2YWx1ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCi0gICAgbmV3IExhYmVsKGNvbnRyb2xzLCBTV1QuTEVGVCkuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1NBTVBMRV9URVhUIikpOwotICAgIHRlc3RTdHJpbmcgPSBuZXcgU3R5bGVkVGV4dChjb250cm9scywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGVzdFN0cmluZywgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1NBTVBMRV9URVhUKTsKLSAgICB0ZXN0U3RyaW5nLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIG5ldyBUZXN0U3RyaW5nTGlzdGVuZXIoKSk7Ci0gICAgdGVzdFN0cmluZy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAKLSAgICBjb250cm9scy5wYWNrKCk7Ci0gICAgCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHQyBnYyA9IG5ldyBHQyhzZXBhcmF0b3IpOwotICAgIFBvaW50IHBvaW50U2l6ZSA9IGdjLnN0cmluZ0V4dGVudChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFU1RJTkdfUEFHRV9ERVNDUklQVElPTiIpKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLndpZHRoSGludCA9IHBvaW50U2l6ZS54IC8gMiArIGdjLmdldEFkdmFuY2VXaWR0aCgnTScpKjExOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QpOwotICAgIAotICAgIGNvbXBvc2l0ZS5wYWNrKCk7Ci0KLSAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gIH0KLQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFBhdHRlcm5WYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gKCAoUmVnZXhDb21wb3NpdGlvblBhZ2UpZ2V0UHJldmlvdXNQYWdlKCkgKS5nZXRQYXR0ZXJuKCkuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRGbGFncygpCi0gIHsKLSAgICByZXR1cm4gKCAoUmVnZXhDb21wb3NpdGlvblBhZ2UpZ2V0UHJldmlvdXNQYWdlKCkgKS5nZXRGbGFncygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpCi0gIHsKLSAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCi0gICAgZ2V0RmxhZ3MoKTsKLSAgICB2YWx1ZS5zZXRUZXh0KFRleHRQcm9jZXNzb3IucHJvY2VzcyhnZXRQYXR0ZXJuVmFsdWUoKSkpOwotICAgIHVwZGF0ZU1hdGNoU3RhdHVzKCk7Ci0gICAgdGVzdFN0cmluZy5zZXRGb2N1cygpOwotICB9Ci0KLSAgY2xhc3MgVGVzdFN0cmluZ0xpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpCi0gICAgewotICAgICAgdXBkYXRlTWF0Y2hTdGF0dXMoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlTWF0Y2hTdGF0dXMoKQotICB7Ci0gICAgaWYgKFBhdHRlcm4ubWF0Y2hlcyhnZXRQYXR0ZXJuVmFsdWUoKSwgdGVzdFN0cmluZy5nZXRUZXh0KCkpKQotICAgIHsKLS8vICAgICAgbWF0Y2hMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfTUFUQ0hFUyIpKTsKLSAgICAgIHNldE1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9NQVRDSEVTIiksIDEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0TWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0RPRVNfTk9UX01BVENIIiksIDIpOwotLy8gICAgICBtYXRjaExhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9ET0VTX05PVF9NQVRDSCIpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0MWY2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGF0dGVybkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREZhY3RvcnlJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBSZWdleFdpemFyZCBleHRlbmRzIFdpemFyZCAKLXsKLSAgcHJpdmF0ZSBSZWdleENvbXBvc2l0aW9uUGFnZSBjb21wb3NpdGlvblBhZ2U7Ci0gIHByaXZhdGUgUmVnZXhUZXN0aW5nUGFnZSB0ZXN0aW5nUGFnZTsKLQotICAvKiBUaGUgb3JpZ2luYWwsIHVuY2hhbmdlZCBwYXR0ZXJuLiAqLyAgCi0gIHByaXZhdGUgWFNEUGF0dGVybkZhY2V0IG9yaWdpbmFsUGF0dGVybjsKLSAgCi0gIC8qIEEgY29weSBvZiB0aGUgb3JpZ2luYWwgcGF0dGVybiB0aGF0IGlzIHBhc3NlZCBpbnRvIHRoZSB3aXphcmQuICovCi0gIHByaXZhdGUgWFNEUGF0dGVybkZhY2V0IG1vZGlmaWVkUGF0dGVybjsKLQotICBTdHJpbmcgcGF0dGVybjsKLQotICBwdWJsaWMgUmVnZXhXaXphcmQoU3RyaW5nIGV4cHIpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNldFdpbmRvd1RpdGxlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVElUTEUiKSk7Ci0gICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL3JlZ3hfd2l6LnBuZyIpKTsKLQotICAgIFhTREZhY3RvcnlJbXBsIGZhY3RvcnkgPSBuZXcgWFNERmFjdG9yeUltcGwoKTsKLSAgICBtb2RpZmllZFBhdHRlcm4gPSBmYWN0b3J5LmNyZWF0ZVhTRFBhdHRlcm5GYWNldCgpOwotICAgIG1vZGlmaWVkUGF0dGVybi5zZXRMZXhpY2FsVmFsdWUoZXhwcik7Ci0KLSAgICBvcmlnaW5hbFBhdHRlcm4gPSBmYWN0b3J5LmNyZWF0ZVhTRFBhdHRlcm5GYWNldCgpOwotICAgIG9yaWdpbmFsUGF0dGVybi5zZXRMZXhpY2FsVmFsdWUoZXhwcik7Ci0KLSAgICBjb21wb3NpdGlvblBhZ2UgPSBuZXcgUmVnZXhDb21wb3NpdGlvblBhZ2UobW9kaWZpZWRQYXR0ZXJuKTsKLSAgICBhZGRQYWdlKGNvbXBvc2l0aW9uUGFnZSk7Ci0KLSAgICB0ZXN0aW5nUGFnZSA9IG5ldyBSZWdleFRlc3RpbmdQYWdlKCk7Ci0gICAgYWRkUGFnZSh0ZXN0aW5nUGFnZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm4oKQotICB7Ci0gICAgcmV0dXJuIHBhdHRlcm47Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpCi0gIHsKLSAgICByZXR1cm4gKGNvbXBvc2l0aW9uUGFnZS5nZXRWYWx1ZSgpLmxlbmd0aCgpID4gMCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkKLSAgewotICAgIHBhdHRlcm4gPSBtb2RpZmllZFBhdHRlcm4uZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNETG9jYXRpb25DaG9pY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRExvY2F0aW9uQ2hvaWNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzA5ZjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNETG9jYXRpb25DaG9pY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLQotCi1wdWJsaWMgY2xhc3MgWFNETG9jYXRpb25DaG9pY2VQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSAKLXsKLSAgcHJvdGVjdGVkIEJ1dHRvbiByYWRpb0J1dHRvbjE7Ci0gIHByb3RlY3RlZCBCdXR0b24gcmFkaW9CdXR0b24yOwotICAgIAotICBwdWJsaWMgWFNETG9jYXRpb25DaG9pY2VQYWdlKCkKLSAgewotICAgIHN1cGVyKCJYU0RMb2NhdGlvbkNob2ljZVBhZ2UiKTsKLQotICAgIHRoaXMuc2V0VGl0bGUoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1dJWkFSRF9JTkNMVURFX0ZJTEVfVElUTEUiKSk7Ci0gICAgdGhpcy5zZXREZXNjcmlwdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfV0laQVJEX0lOQ0xVREVfRklMRV9ERVNDIikpOwotICB9Ci0gICAgCi0gIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBiYXNlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBiYXNlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgIAotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGJhc2UsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9JTkNMVURFX1VSTF9GSUxFIikpOwotICAgIENvbXBvc2l0ZSByYWRpb0J1dHRvbnNHcm91cCA9IFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShiYXNlLCAxLCB0cnVlKTsKLQotICAgIHJhZGlvQnV0dG9uMSA9IFZpZXdVdGlsaXR5LmNyZWF0ZVJhZGlvQnV0dG9uKHJhZGlvQnV0dG9uc0dyb3VwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fRklMRSIpKTsKLSAgICAgIAotICAgIHJhZGlvQnV0dG9uMiA9IFZpZXdVdGlsaXR5LmNyZWF0ZVJhZGlvQnV0dG9uKHJhZGlvQnV0dG9uc0dyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SQURJT19VUkwiKSk7Ci0KLSAgICByYWRpb0J1dHRvbjEuc2V0U2VsZWN0aW9uKHRydWUpOwotCi0gICAgc2V0Q29udHJvbChiYXNlKTsKLSAgfQotCi0gIC8vIGFjdGlvbnMgb24gZmluaXNoCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1VSTCgpCi0gIHsKLSAgICByZXR1cm4gcmFkaW9CdXR0b24yLmdldFNlbGVjdGlvbigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRE5ld0ZpbGVQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRE5ld0ZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzFlMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9YU0ROZXdGaWxlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzOwotIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgWFNETmV3RmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlCi17Ci0gIHB1YmxpYyBYU0ROZXdGaWxlUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIAotICB7Ci0gICAgc3VwZXIoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NSRUFURVhTRCIpLCBzZWxlY3Rpb24pOwotICAgIHNldFRpdGxlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9ORVdfWE1MX1NDSEVNQV9USVRMRSIpKTsKLSAgICBzZXREZXNjcmlwdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQ1JFQVRFX0FfTkVXX1hNTF9TQ0hFTUFfREVTQyIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICAvLyBpbmhlcml0IGRlZmF1bHQgY29udGFpbmVyIGFuZCBuYW1lIHNwZWNpZmljYXRpb24gd2lkZ2V0cwotICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQotICAgIHRoaXMuc2V0RmlsZU5hbWUoY29tcHV0ZURlZmF1bHRGaWxlTmFtZSgpKTsKLQotICAgIHNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKQotICB7Ci0gICAgUGF0aCBuZXdOYW1lID0gbmV3IFBhdGgoZ2V0RmlsZU5hbWUoKSk7Ci0gICAgU3RyaW5nIGZ1bGxGaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0gICAgU3RyaW5nIGV4dGVuc2lvbiA9IG5ld05hbWUuZ2V0RmlsZUV4dGVuc2lvbigpOwotICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCB8fCAhZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInhzZCIpKSAKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX1hTRCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgZm9yIGZpbGUgc2hvdWxkIGJlIGNhc2UgaW5zZW5zaXRpdmUKLSAgICBTdHJpbmcgc2FtZU5hbWUgPSBleGlzdHNGaWxlQW55Q2FzZShmdWxsRmlsZU5hbWUpOwotICAgIGlmIChzYW1lTmFtZSAhPSBudWxsKSAKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFMiLCBzYW1lTmFtZSkpOyAvLyROT04tTkxTLTEkCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlUGFnZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBkZWZhdWx0TmFtZSA9ICJOZXdYTUxTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgZGVmYXVsdEZpbGVFeHRlbnNpb24gPSAiLnhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMgPSB7ICIqLnhzZCJ9OyAvLyROT04tTkxTLTEkCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlRGVmYXVsdEZpbGVOYW1lKCkKLSAgewotICAgIGludCBjb3VudCA9IDA7Ci0gICAgU3RyaW5nIGZpbGVOYW1lID0gZGVmYXVsdE5hbWUgKyBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLSAgICBJUGF0aCBjb250YWluZXJGdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0gICAgaWYgKGNvbnRhaW5lckZ1bGxQYXRoICE9IG51bGwpCi0gICAgewotICAgICAgd2hpbGUgKHRydWUpCi0gICAgICB7Ci0gICAgICAgIElQYXRoIHBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotICAgICAgICBpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMocGF0aCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgIGZpbGVOYW1lID0gZGVmYXVsdE5hbWUgKyBjb3VudCArIGRlZmF1bHRGaWxlRXh0ZW5zaW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaWxlTmFtZTsKLSAgfQotCi0gIC8vIHJldHVybnMgdHJ1ZSBpZiBmaWxlIG9mIHNwZWNpZmllZCBuYW1lIGV4aXN0cyBpbiBhbnkgY2FzZSBmb3Igc2VsZWN0ZWQgY29udGFpbmVyCi0gIHByb3RlY3RlZCBTdHJpbmcgZXhpc3RzRmlsZUFueUNhc2UoU3RyaW5nIGZpbGVOYW1lKQotICB7Ci0gICAgaWYgKCAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSAmJiAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5pc0VtcHR5KCkgPT0gZmFsc2UpCi0gICAgICAgICYmIChmaWxlTmFtZS5jb21wYXJlVG8oIiIpICE9IDApKQotICAgIHsKLSAgICAgIC8vbG9vayB0aHJvdWdoIGFsbCByZXNvdXJjZXMgYXQgdGhlIHNwZWNpZmllZCBjb250YWluZXIgLSBjb21wYXJlIGluIHVwcGVyIGNhc2UKLSAgICAgIElSZXNvdXJjZSBwYXJlbnQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSk7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLSAgICAgIHsKLSAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcGFyZW50OwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIElSZXNvdXJjZVtdIG1lbWJlcnMgPSBjb250YWluZXIubWVtYmVycygpOwotICAgICAgICAgIFN0cmluZyBlbnRlcmVkRmlsZVVwcGVyID0gZmlsZU5hbWUudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bWVtYmVycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VVcHBlck5hbWUgPSBtZW1iZXJzW2ldLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlVXBwZXJOYW1lLmVxdWFscyhlbnRlcmVkRmlsZVVwcGVyKSkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyc1tpXS5nZXROYW1lKCk7ICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjMWJlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFBhcnNlcjsKLQotCi0vKioKLSAqIEV4dGVuZCB0aGUgYmFzZSB3aXphcmQgdG8gc2VsZWN0IGEgZmlsZSBmcm9tIHRoZSBwcm9qZWN0IG9yIG91dHNpZGUgdGhlIHdvcmtiZW5jaAotICogYW5kIGFkZCBlcnJvciBoYW5kbGluZwotICovCi1wdWJsaWMgY2xhc3MgWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkCi17Ci0gIGJvb2xlYW4gaXNJbmNsdWRlOwotICBYU0RTY2hlbWEgbWFpblNjaGVtYTsKLSAgWFNEU2NoZW1hIGV4dGVybmFsU2NoZW1hOwotCi0gIFhTRExvY2F0aW9uQ2hvaWNlUGFnZSBjaG9pY2VQYWdlOwotICBYU0RTZWxlY3RTaW5nbGVGaWxlUGFnZSBmaWxlUGFnZTsKLSAgWFNEVVJMUGFnZSB1cmxQYWdlOwotCi0gIElGaWxlIHJlc3VsdEZpbGU7Ci0gIFN0cmluZyByZXN1bHRVUkw7Ci0gIFN0cmluZyBuYW1lc3BhY2UgPSAiIjsKLQotICBwdWJsaWMgWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQoWFNEU2NoZW1hIG1haW5TY2hlbWEsIGJvb2xlYW4gaXNJbmNsdWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3ZXJGaWx0ZXIgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRXaW5kb3dUaXRsZSh0aXRsZSk7Ci0gICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL05ld1hTRC5wbmciKSk7Ci0KLSAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQotICAgIC8vIENob2ljZSBQYWdlCi0gICAgY2hvaWNlUGFnZSA9IG5ldyBYU0RMb2NhdGlvbkNob2ljZVBhZ2UoKTsKLQotICAgIC8vIFNlbGVjdCBGaWxlIFBhZ2UKLSAgICBmaWxlUGFnZSA9IG5ldyBYU0RTZWxlY3RTaW5nbGVGaWxlUGFnZShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCAgc2VsZWN0aW9uLCB0cnVlKTsKLSAgICBmaWxlUGFnZS5zZXRUaXRsZSh0aXRsZSk7Ci0gICAgZmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oZGVzYyk7Ci0gICAgZmlsZVBhZ2UuYWRkRmlsdGVyKGZpbHRlcik7Ci0KLSAgICAvLyBVUkwgUGFnZQotICAgIHVybFBhZ2UgPSBuZXcgWFNEVVJMUGFnZSgpOwotICAgIHVybFBhZ2Uuc2V0VGl0bGUodGl0bGUpOwotICAgIHVybFBhZ2Uuc2V0RGVzY3JpcHRpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9VUkwiKSk7Ci0gICAgCi0gICAgdGhpcy5tYWluU2NoZW1hID0gbWFpblNjaGVtYTsKLSAgICB0aGlzLmlzSW5jbHVkZSA9IGlzSW5jbHVkZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKQotICB7IAotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkUGFnZXMoKQotICB7Ci0gICAgYWRkUGFnZShjaG9pY2VQYWdlKTsKLSAgICBhZGRQYWdlKGZpbGVQYWdlKTsKLSAgICBhZGRQYWdlKHVybFBhZ2UpOwotICB9Ci0KLSAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIGN1cnJlbnRQYWdlKQotICB7Ci0gICAgV2l6YXJkUGFnZSBuZXh0UGFnZSA9IG51bGw7Ci0KLSAgICBpZiAoY3VycmVudFBhZ2UgPT0gY2hvaWNlUGFnZSkKLSAgICB7Ci0gICAgICBpZiAoY2hvaWNlUGFnZS5pc1VSTCgpKSAKLSAgICAgIHsKLSAgICAgICAgbmV4dFBhZ2UgPSB1cmxQYWdlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBuZXh0UGFnZSA9IGZpbGVQYWdlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV4dFBhZ2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKQotICB7Ci0gICAgaWYgKCFjaG9pY2VQYWdlLmlzVVJMKCkpCi0gICAgewotICAgICAgcmV0dXJuIGZpbGVQYWdlLmlzUGFnZUNvbXBsZXRlKCk7IAotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICB7IAotICAgIGlmIChjaG9pY2VQYWdlLmlzVVJMKCkpCi0gICAgewotICAgICAgdHJ5IAotICAgICAgewotICAgICAgICBnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIHVybFBhZ2UuZ2V0UnVubmFibGUoKSk7Ci0gICAgICAgIHJlc3VsdFVSTCA9IHVybFBhZ2UuZ2V0VVJMKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgCi0gICAgICByZXN1bHRGaWxlID0gZmlsZVBhZ2UuZ2V0RmlsZSgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIE1PRiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBleHRlcm5hbCBmaWxlCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGdldEV4dGVybmFsU2NoZW1hKCkKLSAgewotICAgIHJldHVybiBleHRlcm5hbFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyBJRmlsZSBnZXRSZXN1bHRGaWxlKCkKLSAgewotICAgIHJldHVybiByZXN1bHRGaWxlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVUkwoKQotICB7Ci0gICAgcmV0dXJuIHJlc3VsdFVSTDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICB7Ci0gIAlyZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIE1PRiBtb2RlbCBmb3IgdGhlIGltcG9ydGVkIGZpbGUKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZG9Mb2FkRXh0ZXJuYWxNb2RlbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB4c2RNb2RlbEZpbGUsIFN0cmluZyB4c2RGaWxlTmFtZSkKLSAgeyAKLSAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICBTdHJpbmcgY3VycmVudE5hbWVTcGFjZSA9IG1haW5TY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBtb25pdG9yLmJlZ2luVGFzaygiTG9hZGluZyBYTUwgU2NoZW1hIiwgMTAwKTsKLSAgICBtb25pdG9yLndvcmtlZCg1MCk7Ci0KLSAgICBYU0RQYXJzZXIgcGFyc2VyID0gbmV3IFhTRFBhcnNlcigpOwotICAgIHBhcnNlci5wYXJzZSh4c2RNb2RlbEZpbGUpOwotCi0gICAgZXh0ZXJuYWxTY2hlbWEgPSBwYXJzZXIuZ2V0U2NoZW1hKCk7Ci0gICAgaWYgKGV4dGVybmFsU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGV4dE5hbWVzcGFjZSA9IGV4dGVybmFsU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgbmFtZXNwYWNlID0gZXh0TmFtZXNwYWNlOwotICAgICAKLSAgICAgIGlmIChleHRlcm5hbFNjaGVtYS5nZXREaWFnbm9zdGljcygpICE9IG51bGwgJiYKLSAgICAgICAgICBleHRlcm5hbFNjaGVtYS5nZXREaWFnbm9zdGljcygpLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9JTkNPUlJFQ1RfWE1MX1NDSEVNQSIsIHhzZEZpbGVOYW1lKTsKLSAgICAgIH0gIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoaXNJbmNsdWRlKSAKLSAgICAgICAgeyAgCi0gICAgICAgICAgLy8gQ2hlY2sgdGhlIG5hbWVzcGFjZSB0byBtYWtlIHN1cmUgdGhleSBhcmUgdGhlIHNhbWUgYXMgY3VycmVudCBmaWxlCi0gICAgICAgICAgaWYgKGV4dE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TmFtZVNwYWNlICE9IG51bGwgJiYgIWV4dE5hbWVzcGFjZS5lcXVhbHMoY3VycmVudE5hbWVTcGFjZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9ESUZGRVJFTlRfTkFNRV9TUEFDRSIsIHhzZEZpbGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAKLSAgICAgICAgICAvLyBDaGVjayB0aGUgbmFtZXNwYWNlIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBmaWxlCi0gICAgICAgICAgaWYgKGV4dE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TmFtZVNwYWNlICE9IG51bGwgJiYgZXh0TmFtZXNwYWNlLmVxdWFscyhjdXJyZW50TmFtZVNwYWNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJX1NBTUVfTkFNRV9TUEFDRSIsIHhzZEZpbGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9JTkNPUlJFQ1RfWE1MX1NDSEVNQSIsIHhzZEZpbGVOYW1lKTsKLSAgICB9Ci0KLSAgICBtb25pdG9yLnN1YlRhc2soIkZpbmlzaCBMb2FkaW5nIik7Ci0gICAgbW9uaXRvci53b3JrZWQoODApOwotCi0gICAgcmV0dXJuIGVycm9yTWVzc2FnZTsKLSAgfQotCi0gCi0gIC8qKgotICAgKiBVUkwgcGFnZQotICAgKi8KLSAgY2xhc3MgWFNEVVJMUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UKLSAgeyAKLSAgICBUZXh0IHVybEZpZWxkOwotICAgIFN0cmluZyBzYXZlU3RyaW5nOwotCi0gICAgcHVibGljIFhTRFVSTFBhZ2UoKQotICAgIHsKLSAgICAgIHN1cGVyKCJVUkxQYWdlIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIENvbXBvc2l0ZSBjbGllbnQgPSBWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUocGFyZW50LDIpOwotICAgICAgVmlld1V0aWxpdHkuc2V0Q29tcG9zaXRlKGNsaWVudCk7Ci0KLSAgICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNsaWVudCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1VSTCIpKTsKLSAgICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNsaWVudCwgIiIpOwotCi0gICAgICB1cmxGaWVsZCA9IFZpZXdVdGlsaXR5LmNyZWF0ZVRleHRGaWVsZChjbGllbnQsIDUwKTsKLSAgICAgIHNhdmVTdHJpbmcgPSAiaHR0cDovLyI7Ci0gICAgICB1cmxGaWVsZC5zZXRUZXh0KHNhdmVTdHJpbmcpOwotCi0gICAgICBzZXRDb250cm9sKGNsaWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRVUkwoKQotICAgIHsKLSAgICAgIHJldHVybiB1cmxGaWVsZC5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG9wZW5FeHRlcm5hbFNjaGVtYShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgewotICAgICAgU3RyaW5nIHRleHQgPSB1cmxGaWVsZC5nZXRUZXh0KCk7Ci0vLyAgICAgIGlmICh0ZXh0LmVxdWFscyhzYXZlU3RyaW5nKSkgCi0vLyAgICAgIHsKLS8vICAgICAgICByZXR1cm4gZmFsc2U7Ci0vLyAgICAgIH0KLS8vICAgICAgc2F2ZVN0cmluZyA9IHRleHQ7Ci0KLSAgICAgIGlmICh0ZXh0LmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfU1BFQ0lGWV9VUkwiKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCAhdGV4dC5zdGFydHNXaXRoKCJodHRwOi8vIikgKQotICAgICAgewotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1VSTF9TVEFSVF9XSVRIIikpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBkb0xvYWRFeHRlcm5hbE1vZGVsKG1vbml0b3IsIHRleHQsIHRleHQpOwotICAgICAgaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7IAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgZ2V0UnVubmFibGUoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgICAKLSAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgIGlmIChtb25pdG9yID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvcj0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIiIsIDYpOwotICAgICAgICAKLSAgICAgICAgICBib29sZWFuIG9rID0gb3BlbkV4dGVybmFsU2NoZW1hKG1vbml0b3IpOwotCi0gICAgICAgICAgaWYgKCFvaykgCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKG5ldyBqYXZhLmxhbmcuRXJyb3IoKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNlbGVjdCBYTUwgU2NoZW1hIEZpbGUKLSAgICovCi0gIGNsYXNzIFhTRFNlbGVjdFNpbmdsZUZpbGVQYWdlIGV4dGVuZHMgU2VsZWN0U2luZ2xlRmlsZVBhZ2UKLSAgewotICAgIHB1YmxpYyBYU0RTZWxlY3RTaW5nbGVGaWxlUGFnZShJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkKLSAgICB7ICAgICAgICAgIAotICAgICAgc3VwZXIod29ya2JlbmNoLHNlbGVjdGlvbixpc0ZpbGVNYW5kYXRvcnkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBvcGVuRXh0ZXJuYWxTY2hlbWEoKQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgZnVsbHktcXVhbGlmaWVkIGZpbGUgbmFtZQotICAgICAgSUZpbGUgaUZpbGUgPSBnZXRGaWxlKCk7Ci0gICAgICBpZiAoaUZpbGUgPT0gbnVsbCkgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0gICAgICBTdHJpbmcgeHNkTW9kZWxGaWxlID0gaUZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotICAgICAgU3RyaW5nIHhzZEZpbGVOYW1lID0gaUZpbGUuZ2V0TmFtZSgpOwotICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IGRvTG9hZEV4dGVybmFsTW9kZWwobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgeHNkTW9kZWxGaWxlLCB4c2RGaWxlTmFtZSk7Ci0KLSAgICAgIGlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkKLSAgICB7ICAKLSAgICAgIGlmIChjaG9pY2VQYWdlLmlzVVJMKCkpIAotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHN1cGVyLmlzUGFnZUNvbXBsZXRlKCkpIAotICAgICAgewotICAgICAgICByZXR1cm4gb3BlbkV4dGVybmFsU2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc3VwZXIuaXNQYWdlQ29tcGxldGUoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQWRkRmllbGRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQWRkRmllbGRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQxMTI0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0FkZEZpZWxkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQmFzZUNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIEFkZEZpZWxkQWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbgoteyAgIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBZGRGaWVsZEFjdGlvbiI7ICAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgQWRkRmllbGRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldElkKElEKTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0ZJRUxEKTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaWYgKGdldFNlbGVjdGVkT2JqZWN0cygpLnNpemUoKSA+IDApCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBnZXRTZWxlY3RlZE9iamVjdHMoKS5nZXQoMCk7Ci0gICAgICBJQ29tcGxleFR5cGUgdHlwZSA9IG51bGw7Ci0gICAgICAKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgSUNvbXBsZXhUeXBlKQotICAgICAgeyAgCi0gICAgICAgIHR5cGUgPSAoSUNvbXBsZXhUeXBlKW87IAotICAgICAgfQotICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIElGaWVsZCkKLSAgICAgIHsKLSAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClvOwotICAgICAgICB0eXBlID0gZmllbGQuZ2V0Q29udGFpbmVyVHlwZSgpOwotICAgICAgfQotICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gdHlwZS5nZXRBZGROZXdGaWVsZENvbW1hbmQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCgoKEJhc2VDb21tYW5kKWNvbW1hbmQpLmdldEFkZGVkQ29tcG9uZW50KCkpOwotICAgICAgICAgIHNlbGVjdEFkZGVkQ29tcG9uZW50KGFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAvL1RPRE8gLi4uIHBvcCB1cCBhIGNvbW1hbmQgbm90IGltcGxlbWVudGVkIG1lc3NhZ2UKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb0VkaXQoT2JqZWN0IG9iaiwgSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIGlmIChvYmogaW5zdGFuY2VvZiBCYXNlRmllbGRFZGl0UGFydCkKLSAgICB7Ci0gICAgICBCYXNlRmllbGRFZGl0UGFydCBlZGl0UGFydCA9IChCYXNlRmllbGRFZGl0UGFydClvYmo7Ci0gICAgICBlZGl0UGFydC5kb0VkaXROYW1lKCEocGFydCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0Jhc2VEaXJlY3RFZGl0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0Jhc2VEaXJlY3RFZGl0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMTQxYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9CYXNlRGlyZWN0RWRpdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5EaXJlY3RFZGl0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5BYnN0cmFjdEVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEJhc2VEaXJlY3RFZGl0QWN0aW9uIGV4dGVuZHMgRGlyZWN0RWRpdEFjdGlvbiB7Ci0JcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcjsKLQkKLQkvKioKLQkgKiBTYW1lIGFzIHtAbGluayAjRGlyZWN0RWRpdEFjdGlvbihJV29ya2JlbmNoUGFydCl9LgotCSAqIEBwYXJhbSBlZGl0b3IgdGhlIGVkaXRvcgotCSAqLwotCXB1YmxpYyBCYXNlRGlyZWN0RWRpdEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJc3VwZXIoKElXb3JrYmVuY2hQYXJ0KWVkaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIERpcmVjdEVkaXRBY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJ0LgotCSAqIEBwYXJhbSBwYXJ0IHRoZSB3b3JrYmVuY2ggcGFydAotCSAqLwotCXB1YmxpYyBCYXNlRGlyZWN0RWRpdEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXN1cGVyKHBhcnQpOwotCX0KLQkKLQkgIC8qIChub24tSmF2YWRvYykKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuU2VsZWN0aW9uQWN0aW9uI2dldFNlbGVjdGlvbigpCi0JICAgKi8KLQkgIHByb3RlY3RlZCBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0JICB7Ci0JICAgIC8vIGFsd2F5cyBnZXQgc2VsZWN0aW9uIGZyb20gc2VsZWN0aW9uIHByb3ZpZGVyIGZpcnN0Ci0JCSAgaWYgKHByb3ZpZGVyIT1udWxsKSB7Ci0JCQkgIE9iamVjdCBzZWxlY3Rpb24gPSBwcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCSAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkgIE9iamVjdCBvYmplY3QgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpIHsKLQkJCQkJICAvLyBXZSBuZWVkIHRvIHJldHVybiBhbiBFZGl0UGFydCBhcyB0aGUgc2VsZWN0aW9uLgotCQkJCQkgIElFZGl0b3JQYXJ0IGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQkgIE9iamVjdCBncmFwaGljYWxWaWV3ZXIgPSBlZGl0b3IuZ2V0QWRhcHRlcihHcmFwaGljYWxWaWV3ZXIuY2xhc3MpOwotCQkJCQkgIGlmIChncmFwaGljYWxWaWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyKSB7Ci0JCQkJCQkgIEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIgdmlld2VyID0gKEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIpIGdyYXBoaWNhbFZpZXdlcjsKLQkJCQkJCSAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQob2JqZWN0KTsKLQkJCQkJCSAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRQYXJ0KTsKLQkJCQkJICB9Ci0JCQkJICB9Ci0JCQkgIH0KLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIHN1cGVyLmdldFNlbGVjdGlvbigpOwotCSAgfQotCQotCSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpIHsKLQkJICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCSAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKSB7Ci0JCQkgIHJldHVybiAgISgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuaXNSZWFkT25seSgpOwotCQkgIH0KLQkJICAKLQkJICByZXR1cm4gdHJ1ZTsKLQkgIH0KLQkgIAotCSAgLyogKG5vbi1KYXZhZG9jKQotCSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5TZWxlY3Rpb25BY3Rpb24jc2V0U2VsZWN0aW9uUHJvdmlkZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIpCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblByb3ZpZGVyKElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikKLQkgIHsKLQkgICAgc3VwZXIuc2V0U2VsZWN0aW9uUHJvdmlkZXIocHJvdmlkZXIpOwotCSAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0Jhc2VTZWxlY3Rpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQmFzZVNlbGVjdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTJlYTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQmFzZVNlbGVjdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuQWJzdHJhY3RFZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlU2VsZWN0aW9uQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJNRU5VX1NUQVJUX0lEID0gIlNVQk1FTlVfU1RBUlRfSUQ6ICI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCTUVOVV9FTkRfSUQgPSAiU1VCTUVOVV9FTkRfSUQ6ICI7IC8vJE5PTi1OTFMtMSQKLQotICBwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBkb0RpcmVjdEVkaXQgPSB0cnVlOwotICAKLSAgcHVibGljIEJhc2VTZWxlY3Rpb25BY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuU2VsZWN0aW9uQWN0aW9uI2dldFNlbGVjdGlvbigpCi0gICAqLwotICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgLy8gYWx3YXlzIGdldCBzZWxlY3Rpb24gZnJvbSBzZWxlY3Rpb24gcHJvdmlkZXIgZmlyc3QKLSAgICBpZiAocHJvdmlkZXIhPW51bGwpCi0gICAgICByZXR1cm4gcHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCi0gICAgcmV0dXJuIHN1cGVyLmdldFNlbGVjdGlvbigpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5TZWxlY3Rpb25BY3Rpb24jc2V0U2VsZWN0aW9uUHJvdmlkZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Qcm92aWRlcihJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpCi0gIHsKLSAgICBzdXBlci5zZXRTZWxlY3Rpb25Qcm92aWRlcihwcm92aWRlcik7Ci0gICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uI2NhbGN1bGF0ZUVuYWJsZWQoKQotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpCi0gIHsKLSAgICBpZiAoZ2V0U2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgSUNvbXBsZXhUeXBlKQotICAgICAgewotICAgICAgICByZXR1cm4gISgoSUNvbXBsZXhUeXBlKW8pLmlzUmVhZE9ubHkoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAhKChJRmllbGQpbykuaXNSZWFkT25seSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIElHcmFwaEVsZW1lbnQpCi0gICAgICB7Ci0gICAgCXJldHVybiAhKChJR3JhcGhFbGVtZW50KW8pLmlzUmVhZE9ubHkoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNlbGVjdEFkZGVkQ29tcG9uZW50KGZpbmFsIEFkYXB0ZXIgYWRhcHRlcikKLSAgewotICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGFkYXB0ZXIpKTsKLSAgICAgICAgICBpZiAoZG9EaXJlY3RFZGl0KQotICAgICAgICAgICAgYWN0aXZhdGVEaXJlY3RFZGl0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZURpcmVjdEVkaXQoKQotICB7Ci0gICAgaWYgKGdldFdvcmtiZW5jaFBhcnQoKSBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydCBvd25pbmdFZGl0b3IgPSAoSUVkaXRvclBhcnQpZ2V0V29ya2JlbmNoUGFydCgpOwotICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHBhcnQgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IG93bmluZ0VkaXRvci5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcyk7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyKQotICAgICAgICB7Ci0gICAgICAgICAgQWJzdHJhY3RFZGl0UGFydFZpZXdlciB2aWV3ZXIgPSAoQWJzdHJhY3RFZGl0UGFydFZpZXdlcilvYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IG9iaiA9IHZpZXdlci5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLSAgICAgICAgICBkb0VkaXQob2JqLCBwYXJ0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAKLSAgICAgIH0KLSAgICB9ICAgICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZG9FZGl0KE9iamVjdCBvYmosIElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9DYXB0dXJlU2NyZWVuQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0NhcHR1cmVTY3JlZW5BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkMDQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0NhcHR1cmVTY3JlZW5BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU1dUR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuTGF5ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzLkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQ2FwdHVyZVNjcmVlbkFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBMQVNUX1NDUkVFTl9DQVBUVVJFX1BBVEggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBMQVNUX1NDUkVFTl9DQVBUVVJFX0ZJTEVfTkFNRSA9IE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fREVGQVVMVF9GSUxFX05BTUU7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBMQVNUX1NDUkVFTl9DQVBUVVJFX0ZJTEVfRVhURU5TSU9OID0gIi5qcGciOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIENhcHR1cmVTY3JlZW5BY3Rpb24oKQotICB7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQ0FQVFVSRV9TQ1JFRU5fQUNUSU9OX1RFWFQpOwotICAgIHNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9DQVBUVVJFX1NDUkVFTl9BQ1RJT05fVE9PTFRJUFRFWFQpOwotICAgIHNldEltYWdlRGVzY3JpcHRvcihYU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9ldG9vbDE2L2NhcHR1cmVzY3JlZW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZHRvb2wxNi9jYXB0dXJlc2NyZWVuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHNldEFjY2VsZXJhdG9yKFNXVC5DVFJMIHwgU1dULlNISUZUIHwgJ1gnKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIEltYWdlRXhwb3J0ZXIgaW1hZ2VFeHBvcnRlciA9IG5ldyBJbWFnZUV4cG9ydGVyKCk7Ci0gICAgaW1hZ2VFeHBvcnRlci5zYXZlKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpLCAoR3JhcGhpY2FsVmlld2VyKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcykpOwotICB9Ci0KLSAgcHVibGljIGNsYXNzIEltYWdlRXhwb3J0ZXIKLSAgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0ZPUk1BVFMgPSAiKi5qcGVnOyouamZpZjsqLmpwZzsqLmpwZTsqLnBuZzsqLmJtcDsqLmljbyI7IC8vJE5PTi1OTFMtMSQKLSAgCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1NFUEFSQVRPUiA9ICJmaWxlLnNlcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCSAgcHVibGljIGJvb2xlYW4gc2F2ZShJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBHcmFwaGljYWxWaWV3ZXIgdmlld2VyLCBTdHJpbmcgc2F2ZUZpbGVQYXRoLCBpbnQgZm9ybWF0KQotICAgIHsKLSAgICAgIEFzc2VydC5pc05vdE51bGwoZWRpdG9yUGFydCwgIm51bGwgZWRpdG9yUGFydCBwYXNzZWQgdG8gSW1hZ2VFeHBvcnRlci5zYXZlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIEFzc2VydC5pc05vdE51bGwodmlld2VyLCAibnVsbCB2aWV3ZXIgcGFzc2VkIHRvIEltYWdlRXhwb3J0ZXIuc2F2ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBBc3NlcnQuaXNOb3ROdWxsKHNhdmVGaWxlUGF0aCwgIm51bGwgc2F2ZUZpbGVQYXRoIHBhc3NlZCB0byBJbWFnZUV4cG9ydGVyLnNhdmUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBpZiAoZm9ybWF0ICE9IFNXVC5JTUFHRV9CTVAgJiYgZm9ybWF0ICE9IFNXVC5JTUFHRV9KUEVHICYmIGZvcm1hdCAhPSBTV1QuSU1BR0VfSUNPICYmIGZvcm1hdCAhPSBTV1QuSU1BR0VfUE5HKQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fRk9STUFUX05PVF9TVVBQT1JURUQpOwotCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgc2F2ZUVkaXRvckNvbnRlbnRzQXNJbWFnZShlZGl0b3JQYXJ0LCB2aWV3ZXIsIHNhdmVGaWxlUGF0aCwgZm9ybWF0KTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgICB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGVkaXRvclBhcnQuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fRVJST1JfVElUTEUsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fRVJST1JfREVTQ1JJUFRJT04pOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNhdmUoSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgR3JhcGhpY2FsVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICBBc3NlcnQuaXNOb3ROdWxsKGVkaXRvclBhcnQsICJudWxsIGVkaXRvclBhcnQgcGFzc2VkIHRvIEltYWdlRXhwb3J0ZXIuc2F2ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBBc3NlcnQuaXNOb3ROdWxsKHZpZXdlciwgIm51bGwgdmlld2VyIHBhc3NlZCB0byBJbWFnZUV4cG9ydGVyLnNhdmUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBTdHJpbmcgc2F2ZUZpbGVQYXRoID0gZ2V0U2F2ZUZpbGVQYXRoKGVkaXRvclBhcnQsIHZpZXdlcik7Ci0gICAgICBpZiAoc2F2ZUZpbGVQYXRoID09IG51bGwpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoc2F2ZUZpbGVQYXRoKTsKLSAgICAgIGlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNGaWxlKCkpCi0gICAgICB7Ci0gICAgICAgIGlmICghTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBNZXNzYWdlcy5fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX09WRVJXUklURV9DT05GSVJNQVRJT05fUVVFU1RJT04sIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fT1ZFUldSSVRFX0NPTkZJUk1BVElPTi5yZXBsYWNlKCJ7MH0iLCBzYXZlRmlsZVBhdGgpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGludCBmb3JtYXQgPSAtMTsKLSAgICAgIFN0cmluZyBzYXZlRmlsZVBhdGhMb3dlckNhc2UgPSBzYXZlRmlsZVBhdGgudG9Mb3dlckNhc2UoKTsgCi0gICAgICBpZiAoc2F2ZUZpbGVQYXRoTG93ZXJDYXNlLmVuZHNXaXRoKCIuanBlZyIpIHx8IHNhdmVGaWxlUGF0aExvd2VyQ2FzZS5lbmRzV2l0aCgiLmpwZyIpIHx8IHNhdmVGaWxlUGF0aExvd2VyQ2FzZS5lbmRzV2l0aCgiLmpwZSIpIHx8IHNhdmVGaWxlUGF0aExvd2VyQ2FzZS5lbmRzV2l0aCgiLmpmaWYiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotICAgIAlmb3JtYXQgPSBTV1QuSU1BR0VfSlBFRzsKLSAgICAgIGVsc2UgaWYgKHNhdmVGaWxlUGF0aExvd2VyQ2FzZS5lbmRzV2l0aCgiLmJtcCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIGZvcm1hdCA9IFNXVC5JTUFHRV9CTVA7Ci0gICAgICBlbHNlIGlmIChzYXZlRmlsZVBhdGhMb3dlckNhc2UuZW5kc1dpdGgoIi5pY28iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICBmb3JtYXQgPSBTV1QuSU1BR0VfSUNPOwotICAgICAgZWxzZSBpZiAoc2F2ZUZpbGVQYXRoTG93ZXJDYXNlLmVuZHNXaXRoKCIucG5nIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZm9ybWF0ID0gU1dULklNQUdFX1BORzsKLSAgICAgIGVsc2UgaWYgKHNhdmVGaWxlUGF0aExvd2VyQ2FzZS5lbmRzV2l0aCgiLmdpZiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIGZvcm1hdCA9IFNXVC5JTUFHRV9HSUY7Ci0KLSAgICAgIGlmKGZvcm1hdCAhPSAtMSkgewotICAgIAkgIHJldHVybiBzYXZlKGVkaXRvclBhcnQsIHZpZXdlciwgc2F2ZUZpbGVQYXRoLCBmb3JtYXQpOwotICAgICAgfSBlbHNlIHsKLSAgICAJICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTYXZlRmlsZVBhdGgoSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgR3JhcGhpY2FsVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICBTdHJpbmcgZmlsZVBhdGg7Ci0KLSAgICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGVkaXRvclBhcnQuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIFNXVC5TQVZFKTsKLQotICAgICAgU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucyA9IG5ldyBTdHJpbmdbXSB7RklMRV9GT1JNQVRTfTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBmaWxlRGlhbG9nLnNldEZpbGVOYW1lKG9idGFpbk5leHRGaWxlTmFtZSgpKTsKLSAgICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLSAgICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZ1tdIHtGSUxFX0ZPUk1BVFN9KTsKLSAgICAgIGZpbGVEaWFsb2cuc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0ZJTEVfU0FWRV9ESUFMT0dfVElUTEUpOwotICAgICAgCi0gICAgICBmaWxlUGF0aCA9IGZpbGVEaWFsb2cub3BlbigpOwotCi0gICAgICBpZiAoZmlsZVBhdGggIT0gbnVsbCkKLSAgICAgIHsKLQkgICAgICBMQVNUX1NDUkVFTl9DQVBUVVJFX1BBVEggPSBmaWxlRGlhbG9nLmdldEZpbHRlclBhdGgoKTsKLQkgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlRGlhbG9nLmdldEZpbGVOYW1lKCk7Ci0JICAgICAgaWYgKGZpbGVOYW1lLmluZGV4T2YoJy4nKSA+IDApIHsKLQkJICAgICAgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX05BTUUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUuaW5kZXhPZignLicpKTsKLQkJICAgICAgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX0VYVEVOU0lPTiA9IGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5pbmRleE9mKCcuJykpOwotCSAgICAgIH0KLQkgICAgICBlbHNlCi0JICAgICAgewotCQkgICAgICBMQVNUX1NDUkVFTl9DQVBUVVJFX0ZJTEVfTkFNRSA9IGZpbGVOYW1lOwotCQkgICAgICBMQVNUX1NDUkVFTl9DQVBUVVJFX0ZJTEVfRVhURU5TSU9OID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmlsZVBhdGg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmVFZGl0b3JDb250ZW50c0FzSW1hZ2UoSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgR3JhcGhpY2FsVmlld2VyIHZpZXdlciwgU3RyaW5nIHNhdmVGaWxlUGF0aCwgaW50IGZvcm1hdCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogMS4gRmlyc3QgZ2V0IHRoZSBmaWd1cmUgd2hvc2UgdmlzdWFscyB3ZSB3YW50IHRvIHNhdmUgYXMgaW1hZ2UuIFNvIHdlCi0gICAgICAgKiB3b3VsZCBsaWtlIHRvIHNhdmUgdGhlIHJvb3RlZGl0cGFydCB3aGljaCBhY3R1YWxseSBob3N0cyBhbGwgdGhlCi0gICAgICAgKiBwcmludGFibGUgbGF5ZXJzLgotICAgICAgICogCi0gICAgICAgKiBOT1RFOiBTY2FsYWJsZVJvb3RFZGl0UGFydCBtYW5hZ2VzIGxheWVycyBhbmQgaXMgcmVnaXN0ZXJlZAotICAgICAgICogZ3JhcGhpY2Fsdmlld2VyJ3MgZWRpdHBhcnRyZWdpc3RyeSB3aXRoIHRoZSBrZXkgTGF5ZXJNYW5hZ2VyLklEIC4uLgotICAgICAgICogd2VsbCB0aGF0IGlzIGJlY2F1c2UgU2NhbGFibGVSb290RWRpdFBhcnQgbWFuYWdlcyBhbGwgbGF5ZXJzIHRoYXQgYXJlCi0gICAgICAgKiBob3N0ZWQgb24gYSBGaWd1cmVDYW52YXMuIE1hbnkgbGF5ZXJzIGV4aXN0IGZvciBkb2luZyBkaWZmZXJlbnQgdGhpbmdzCi0gICAgICAgKi8KLSAgICAgIFNjYWxhYmxlUm9vdEVkaXRQYXJ0IHJvb3RFZGl0UGFydCA9IChTY2FsYWJsZVJvb3RFZGl0UGFydCkgdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoTGF5ZXJNYW5hZ2VyLklEKTsKLSAgICAgIElGaWd1cmUgcm9vdEZpZ3VyZSA9ICgoTGF5ZXJNYW5hZ2VyKSByb290RWRpdFBhcnQpLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOy8vIHJvb3RFZGl0UGFydC5nZXRGaWd1cmUoKTsKLSAgICAKLSAgICAgIFJlY3RhbmdsZSByb290RmlndXJlQm91bmRzID0gbmV3IFJlY3RhbmdsZShuZXcgUG9pbnQoMCwwKSxyb290RmlndXJlLmdldFByZWZlcnJlZFNpemUoKSk7Ci0gICAgICBMaXN0IHJvb3RFZGl0UGFydENoaWxkcmVuID0gcm9vdEVkaXRQYXJ0LmdldENoaWxkcmVuKCk7Ci0gICAgICBJdGVyYXRvciByb290RWRpdFBhcnRDaGlsZHJlbkl0ZXJhdG9yID0gcm9vdEVkaXRQYXJ0Q2hpbGRyZW4uaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlKHJvb3RFZGl0UGFydENoaWxkcmVuSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgCSAgT2JqZWN0IG9iamVjdCA9IHJvb3RFZGl0UGFydENoaWxkcmVuSXRlcmF0b3IubmV4dCgpOwotICAgIAkgIGlmKG9iamVjdCBpbnN0YW5jZW9mIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHsKLSAgICAJCSAgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBjaGlsZEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClvYmplY3Q7Ci0gICAgCQkgIExpc3QgZ3JhbmRDaGlsZHJlbiA9IGNoaWxkQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydC5nZXRDaGlsZHJlbigpOwotICAgIAkJICBJdGVyYXRvciBncmFuZENoaWxkcmVuSXRlcmF0b3IgPSBncmFuZENoaWxkcmVuLml0ZXJhdG9yKCk7Ci0gICAgCQkgIHdoaWxlKGdyYW5kQ2hpbGRyZW5JdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAJCQkgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ3JhbmRDaGlsZEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClncmFuZENoaWxkcmVuSXRlcmF0b3IubmV4dCgpOwotICAgIAkJCSAgSUZpZ3VyZSBmaWd1cmUgPSBncmFuZENoaWxkQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydC5nZXRGaWd1cmUoKTsKLSAgICAJCQkgIExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciA9IGZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCk7Ci0gICAgCQkJICBpZihsYXlvdXRNYW5hZ2VyIGluc3RhbmNlb2YgRmlsbExheW91dCkgewotICAgIAkJCQkgIHJvb3RGaWd1cmVCb3VuZHMgPSByb290RmlndXJlLmdldEJvdW5kcygpOwotICAgIAkJCSAgfQotICAgIAkJICB9Ci0gICAgCSAgfQotICAgICAgfQotCi0gICAgICAvKgotICAgICAgICogMi4gTm93IHdlIHdhbnQgdG8gZ2V0IHRoZSBHQyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRyb2wgb24gd2hpY2ggYWxsCi0gICAgICAgKiBmaWd1cmVzIGFyZSBwYWludGVkIGJ5IFNXVEdyYXBoaWNzLiBGb3IgdGhhdCBmaXJzdCBnZXQgdGhlIFNXVCBDb250cm9sCi0gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHZpZXdlciBvbiB3aGljaCB0aGUgcm9vdGVkaXRwYXJ0IGlzIHNldCBhcyBjb250ZW50cwotICAgICAgICovCi0gICAgICBDb250cm9sIGZpZ3VyZUNhbnZhcyA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0gICAgICBHQyBmaWd1cmVDYW52YXNHQyA9IG5ldyBHQyhmaWd1cmVDYW52YXMpOwotCi0gICAgICAvKgotICAgICAgICogMy4gQ3JlYXRlIGEgbmV3IEdyYXBoaWNzIGZvciBhbiBJbWFnZSBvbnRvIHdoaWNoIHdlIHdhbnQgdG8gcGFpbnQKLSAgICAgICAqIHJvb3RGaWd1cmUKLSAgICAgICAqLwotICAgICAgSW1hZ2UgaW1nID0gbmV3IEltYWdlKG51bGwsIHJvb3RGaWd1cmVCb3VuZHMud2lkdGgsIHJvb3RGaWd1cmVCb3VuZHMuaGVpZ2h0KTsKLSAgICAgIEdDIGltYWdlR0MgPSBuZXcgR0MoaW1nKTsKLSAgICAgIGltYWdlR0Muc2V0QmFja2dyb3VuZChmaWd1cmVDYW52YXNHQy5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgaW1hZ2VHQy5zZXRGb3JlZ3JvdW5kKGZpZ3VyZUNhbnZhc0dDLmdldEZvcmVncm91bmQoKSk7Ci0gICAgICBpbWFnZUdDLnNldEZvbnQoZmlndXJlQ2FudmFzR0MuZ2V0Rm9udCgpKTsKLSAgICAgIGltYWdlR0Muc2V0TGluZVN0eWxlKGZpZ3VyZUNhbnZhc0dDLmdldExpbmVTdHlsZSgpKTsKLSAgICAgIGltYWdlR0Muc2V0TGluZVdpZHRoKGZpZ3VyZUNhbnZhc0dDLmdldExpbmVXaWR0aCgpKTsKLSAgICAgIGltYWdlR0Muc2V0WE9STW9kZShmaWd1cmVDYW52YXNHQy5nZXRYT1JNb2RlKCkpOwotICAgICAgR3JhcGhpY3MgaW1nR3JhcGhpY3MgPSBuZXcgU1dUR3JhcGhpY3MoaW1hZ2VHQyk7Ci0KLSAgICAgIC8qIDQuIERyYXcgcm9vdEZpZ3VyZSBvbnRvIGltYWdlLiBBZnRlciB0aGF0IGltYWdlIHdpbGwgYmUgcmVhZHkgZm9yIHNhdmUgKi8KLSAgICAgIHJvb3RGaWd1cmUucGFpbnQoaW1nR3JhcGhpY3MpOwotCi0gICAgICAvKiA1LiBTYXZlIGltYWdlICovCi0gICAgICBJbWFnZURhdGFbXSBpbWdEYXRhID0gbmV3IEltYWdlRGF0YVsxXTsKLSAgICAgIGltZ0RhdGFbMF0gPSBpbWcuZ2V0SW1hZ2VEYXRhKCk7Ci0KLSAgICAgIEltYWdlTG9hZGVyIGltZ0xvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotICAgICAgaW1nTG9hZGVyLmRhdGEgPSBpbWdEYXRhOwotICAgICAgaW1nTG9hZGVyLnNhdmUoc2F2ZUZpbGVQYXRoLCBmb3JtYXQpOwotCi0gICAgICAvKiByZWxlYXNlIE9TIHJlc291cmNlcyAqLwotICAgICAgZmlndXJlQ2FudmFzR0MuZGlzcG9zZSgpOwotICAgICAgaW1hZ2VHQy5kaXNwb3NlKCk7Ci0gICAgICBpbWcuZGlzcG9zZSgpOwotCi0gICAgfQotCi0gICAgU3RyaW5nIG9idGFpbk5leHRGaWxlTmFtZSgpCi0gICAgewotCi0gICAgICBpbnQgYXV4ID0gTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX05BTUUubGVuZ3RoKCkgLSAxOwotICAgICAgd2hpbGUgKENoYXJhY3Rlci5pc0RpZ2l0KExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9OQU1FLmNoYXJBdChhdXgpKSkKLSAgICAgIHsKLSAgICAgICAgYXV4LS07Ci0gICAgICB9Ci0KLSAgICAgIFN0cmluZyBub25OdW1lcmF0ZWRmaWxlTmFtZSA9IExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9OQU1FLnN1YnN0cmluZygwLCBhdXggKyAxKTsKLSAgICAgIFN0cmluZyBmaWxlUGF0aCA9IExBU1RfU0NSRUVOX0NBUFRVUkVfUEFUSCArIFN5c3RlbS5nZXRQcm9wZXJ0eShGSUxFX1NFUEFSQVRPUikgKyBub25OdW1lcmF0ZWRmaWxlTmFtZSArIExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9FWFRFTlNJT047IC8vJE5PTi1OTFMtMSQKLQotICAgICAgaW50IGNvdW50ZXIgPSAxOwotICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOwotICAgICAgd2hpbGUgKGZpbGUuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIGZpbGVQYXRoID0gTEFTVF9TQ1JFRU5fQ0FQVFVSRV9QQVRIICsgU3lzdGVtLmdldFByb3BlcnR5KEZJTEVfU0VQQVJBVE9SKSArIG5vbk51bWVyYXRlZGZpbGVOYW1lICsgY291bnRlcisrICsgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX0VYVEVOU0lPTjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gZmlsZVBhdGg7Ci0gICAgfQotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTYzNGMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIERlbGV0ZUFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24KLXsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuRGVsZXRlQWN0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIERlbGV0ZUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURSk7Ci0gICAgc2V0SWQoSUQpOwotICAgIHNldEltYWdlRGVzY3JpcHRvcihYU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9kZWxldGVfb2JqLmdpZiIpICk7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWxlY3Rpb24gPSBpLm5leHQoKTsKLSAgICAgIENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgICBib29sZWFuIGRvU2V0SW5wdXQgPSBmYWxzZTsKLSAgICAgIGJvb2xlYW4gZG9TZXRNb2RlbEFzSW5wdXQgPSBmYWxzZTsKLSAgICAgIElBRFRPYmplY3QgdG9wTGV2ZWxDb250YWluZXIgPSBudWxsOwotICAgICAgSU1vZGVsIG1vZGVsID0gbnVsbDsKLSAgICAgIAotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElHcmFwaEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIElHcmFwaEVsZW1lbnQgeHNkT2JqID0gKElHcmFwaEVsZW1lbnQpc2VsZWN0aW9uOwotIAotICAgICAgICBpZiAoeHNkT2JqIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RCYXNlQWRhcHRlciBiYXNlQWRhcHRlciA9IChYU0RCYXNlQWRhcHRlcil4c2RPYmo7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gRG8gbm90IGRlbGV0ZSBzZWxlY3RlZCBpdGVtIGlmIGl0IGlzIHJlYWQtb25seSwgb3IgaWYgdGhlIGl0ZW0gc2VsZWN0ZWQKLSAgICAgICAgICAvLyBpcyBudWxsIGFuZCB0aGUgcmVhZCBvbmx5IGNoZWNrIGNhbm5vdCBiZSBjb21wbGV0ZWQKLSAgICAgICAgICBpZiAoYmFzZUFkYXB0ZXIgPT0gbnVsbCB8fCBiYXNlQWRhcHRlci5pc1JlYWRPbmx5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIHRvcExldmVsQ29udGFpbmVyID0geHNkT2JqLmdldFRvcENvbnRhaW5lcigpOwotICAgICAgICAgIGlmICh0b3BMZXZlbENvbnRhaW5lciA9PSBzZWxlY3Rpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgZG9TZXRJbnB1dCA9IHRydWU7Ci0gICAgICAgICAgICBkb1NldE1vZGVsQXNJbnB1dCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbW1hbmQgPSB4c2RPYmouZ2V0RGVsZXRlQ29tbWFuZCgpOwotICAgICAgICAgIG1vZGVsID0geHNkT2JqLmdldE1vZGVsKCk7ICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICBpZiAod29ya2JlbmNoICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwgJiYgd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgaWYgKGVkaXRvclBhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgT2JqZWN0IHZpZXdlciA9IGVkaXRvclBhcnQuZ2V0QWRhcHRlcihHcmFwaGljYWxWaWV3ZXIuY2xhc3MpOwotICAgICAgICAgICAgICBpZiAodmlld2VyIGluc3RhbmNlb2YgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcikKLSAgICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICBPYmplY3QgaW5wdXQgPSAoKERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpdmlld2VyKS5nZXRJbnB1dCgpOwotICAgICAgICAgICAgICAgIGlmIChpbnB1dCAhPSBzZWxlY3Rpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gQnVnIDg2MjE4IDogRG9uJ3Qgc3dpdGNoIHRvIHRvcCBsZXZlbCB2aWV3IGlmIHRoZSBvYmplY3Qgd2UncmUgZGVsZXRpbmcKLSAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCB0aGUgaW5wdXQgdG8gdGhlIHZpZXdlcgotICAgICAgICAgICAgICAgICAgZG9TZXRJbnB1dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgaWYgKGRvU2V0SW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobW9kZWwgIT0gbnVsbCAmJiBkb1NldE1vZGVsQXNJbnB1dCkKLSAgICAgICAgICAgIHByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb2RlbCkpOyAgIAotICAgICAgICAgIGVsc2UgaWYgKHRvcExldmVsQ29udGFpbmVyICE9IG51bGwgJiYgIWRvU2V0TW9kZWxBc0lucHV0KQotICAgICAgICAgICAgcHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRvcExldmVsQ29udGFpbmVyKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gIAotICAgIH0KLSAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9EZXNpZ25TZWxlY3RBbGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvRGVzaWduU2VsZWN0QWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZGE2YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9EZXNpZ25TZWxlY3RBbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQ29tbW9uTXVsdGlQYWdlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuQ2F0ZWdvcnlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNEU2NoZW1hRWRpdFBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBEZXNpZ25TZWxlY3RBbGwgZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uCi17Ci0gIHByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLSAgcHJpdmF0ZSBMaXN0IHNlbGVjdGVkOwotCi0gIHB1YmxpYyBEZXNpZ25TZWxlY3RBbGwoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldElkKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpKTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0VMRUNUX0FMTCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgc3VwZXIucnVuKCk7Ci0KLSAgICBJV29ya2JlbmNoUGFydCBwYXJ0ID0gZ2V0V29ya2JlbmNoUGFydCgpOwotICAgIHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgQ29tbW9uTXVsdGlQYWdlRWRpdG9yKQotICAgIHsKLSAgICAgIGdyYXBoaWNhbFZpZXdlciA9IChHcmFwaGljYWxWaWV3ZXIpICgoQ29tbW9uTXVsdGlQYWdlRWRpdG9yKSBwYXJ0KS5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcyk7Ci0gICAgICBpZiAoZ3JhcGhpY2FsVmlld2VyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ3JhcGhpY2FsVmlld2VyLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIGRvU2VsZWN0Q2hpbGRyZW4oZWRpdFBhcnQpOwotCi0gICAgICAgIGdyYXBoaWNhbFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWQpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZG9TZWxlY3RDaGlsZHJlbihFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIExpc3QgbGlzdCA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFFZGl0UGFydCkgJiYgIShvIGluc3RhbmNlb2YgQ2F0ZWdvcnlFZGl0UGFydCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3RlZC5hZGQobyk7Ci0gICAgICAgIH0KLSAgICAgICAgZG9TZWxlY3RDaGlsZHJlbigoR3JhcGhpY2FsRWRpdFBhcnQpIG8pOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9TZXRJbnB1dFRvR3JhcGhWaWV3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL1NldElucHV0VG9HcmFwaFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmOTMwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL1NldElucHV0VG9HcmFwaFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlJvb3RDb250ZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgU2V0SW5wdXRUb0dyYXBoVmlldyBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiU2V0QXNGb2N1cyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0gIHByb3RlY3RlZCBPYmplY3QgaW5wdXQ7Ci0KLSAgcHVibGljIFNldElucHV0VG9HcmFwaFZpZXcoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHRoaXMocGFydCwgbnVsbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZXRJbnB1dFRvR3JhcGhWaWV3KElXb3JrYmVuY2hQYXJ0IHBhcnQsIE9iamVjdCBpbnB1dCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICBzZXRJZChJRCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9BU19GT0NVUyk7Ci0gICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkKLSAgICB7Ci0gICAgICBlZGl0b3JQYXJ0ID0gKElFZGl0b3JQYXJ0KXBhcnQ7Ci0gICAgfSAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgeyAgICAKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gaW5wdXQ7ICAgCi0gICAgaWYgKHNlbGVjdGlvbiA9PSBudWxsKQotICAgIHsgIAotICAgICAgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotICAgIH0gIAotICAgIE9iamVjdCBhZGFwdGVyID0gZ2V0V29ya2JlbmNoUGFydCgpLmdldEFkYXB0ZXIoR3JhcGhpY2FsVmlld2VyLmNsYXNzKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgIHsKLSAgICAgIElBRFRPYmplY3Qgb2JqID0gKElBRFRPYmplY3QpIHNlbGVjdGlvbjsKLSAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcikKLSAgICAgIHsKLSAgICAgICAgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXIgPSAoRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcikgYWRhcHRlcjsgIAotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdyYXBoaWNhbFZpZXdlci5nZXRJbnB1dEVkaXRQYXJ0KCk7Ci0gICAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFJvb3RDb250ZW50RWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljYWxWaWV3ZXIuc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24ob2JqKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9TaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZDIzMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9TaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLQotLyoqCi0gKiBTaG93IHRoZSBwcm9wZXJ0aWVzIHZpZXcgaW4gdGhlIGN1cnJlbnQgcGVyc3BlY3RpdmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19WSUVXX0lEID0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiOyAvLyROT04tTkxTLTEkCi0JCi0gIHByb3RlY3RlZCBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGVuYWJsZWRJbWFnZSwgZGlzYWJsZWRJbWFnZTsKLQotCXB1YmxpYyBTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotCQlzdXBlcihwYXJ0KTsKLQkJc2V0SWQoSUQpOwotCQlzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0hPV19QUk9QRVJUSUVTKTsKLQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLSAgICBzZXRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZWxjbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYiKSApOyAvLyROT04tTkxTLTEkCi0JICBzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihYU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9kbGNsMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZiIpICk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZ2V0V29ya2JlbmNoUGFydCgpLmdldFNpdGUoKS5nZXRQYWdlKCkuc2hvd1ZpZXcoUFJPUEVSVElFU19WSUVXX0lEKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkKLSAgICB7Ci0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9BRFRGbG9hdGluZ1Rvb2xiYXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9BRFRGbG9hdGluZ1Rvb2xiYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyN2NhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vQURURmxvYXRpbmdUb29sYmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuR3JhcGhpY2FsVmlld2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkFEVEZsb2F0aW5nVG9vbGJhckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBBRFRGbG9hdGluZ1Rvb2xiYXIgZXh0ZW5kcyBHcmFwaGljYWxWaWV3ZXJJbXBsCi17Ci0gIHByb3RlY3RlZCBJTW9kZWwgbW9kZWw7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzRHJpbGxlZERvd247Ci0gIHByb3RlY3RlZCBBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydCBlZGl0UGFydDsKLQotICBwdWJsaWMgQURURmxvYXRpbmdUb29sYmFyKElNb2RlbCBtb2RlbCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKElNb2RlbCBtb2RlbCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICBlZGl0UGFydCA9IChBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydClnZXRFZGl0UGFydEZhY3RvcnkoKS5jcmVhdGVFZGl0UGFydChudWxsLCBuZXcgQURURmxvYXRpbmdUb29sYmFyTW9kZWwobW9kZWwpKTsKLSAgICBpZiAoZWRpdFBhcnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlZGl0UGFydCA9IG5ldyBBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydChtb2RlbCk7Ci0gICAgfQotICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICBzZXRDb250ZW50cyhlZGl0UGFydCk7Ci0gIH0KLQotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gIHsKLSAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBjYW52YXMuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgc2V0Q29udHJvbChjYW52YXMpOwotICAgIHJldHVybiBnZXRDb250cm9sKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKGJvb2xlYW4gaXNEcmlsbGVkRG93bikKLSAgewotICAgIHRoaXMuaXNEcmlsbGVkRG93biA9IGlzRHJpbGxlZERvd247Ci0gICAgaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLSAgICAJZWRpdFBhcnQuc2V0SXNEcmlsbGVkRG93bihpc0RyaWxsZWREb3duKTsKLSAgICB9Ci0gICAgRWRpdFBhcnQgY29udGVudHMgPSBnZXRDb250ZW50cygpOwotICAgIGlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0gICAgCWNvbnRlbnRzLnJlZnJlc2goKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBjbGFzcyBBRFRGbG9hdGluZ1Rvb2xiYXJNb2RlbAotICB7Ci0gICAgSU1vZGVsIG1vZGVsOwotICAgIHB1YmxpYyBBRFRGbG9hdGluZ1Rvb2xiYXJNb2RlbChJTW9kZWwgbW9kZWwpCi0gICAgewotICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vQmFzZUdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9CYXNlR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM0ZTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9CYXNlR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLQotLyoqCi0gKiBUaGlzIGtleSBoYW5kbGVyIGlzIGRlc2lnbmVkIHRvIGJlIHJlLXVzZWQgYnkgYm90aCB0aGUgV1NETCBhbmQgWFNEIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgQmFzZUdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXIgZXh0ZW5kcyBHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyCi17Ci0gIHB1YmxpYyBCYXNlR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlcihHcmFwaGljYWxWaWV3ZXIgdmlld2VyKQotICB7Ci0gICAgc3VwZXIodmlld2VyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpbnQgZGlyZWN0aW9uID0gLTE7Ci0gICAgYm9vbGVhbiBpc0FsdERvd24gPSAoZXZlbnQuc3RhdGVNYXNrICYgU1dULkFMVCkgIT0gMDsKLSAgICBib29sZWFuIGlzQ3RybERvd24gPSAoZXZlbnQuc3RhdGVNYXNrICYgU1dULkNUUkwpICE9IDA7Ci0gICAgc3dpdGNoIChldmVudC5rZXlDb2RlKQotICAgIHsKLSAgICAgIGNhc2UgU1dULkFSUk9XX0xFRlQgOiB7Ci0gICAgICAgIGRpcmVjdGlvbiA9IFBvc2l0aW9uQ29uc3RhbnRzLldFU1Q7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBTV1QuQVJST1dfUklHSFQgOiB7Ci0gICAgICAgIGRpcmVjdGlvbiA9IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1Q7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBTV1QuQVJST1dfVVAgOiB7Ci0gICAgICAgIGRpcmVjdGlvbiA9IGlzQWx0RG93biA/IEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuT1VUX1RPX1BBUkVOVCA6IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgU1dULkFSUk9XX0RPV04gOiB7Ci0gICAgCSBkaXJlY3Rpb24gPSBpc0FsdERvd24gPyBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LklOX1RPX0ZJUlNUX0NISUxEIDogUG9zaXRpb25Db25zdGFudHMuU09VVEg7ICAgICAgIAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGRpcmVjdGlvbiAhPSAtMSkKLSAgICB7Ci0gICAgICBHcmFwaGljYWxFZGl0UGFydCBmb2N1c0VkaXRQYXJ0ID0gZ2V0Rm9jdXNFZGl0UGFydCgpOwotICAgICAgS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSBwb2xpY3kgPSAoS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSlmb2N1c0VkaXRQYXJ0LmdldEVkaXRQb2xpY3koS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5LRVkpOwotICAgICAgCi0gICAgICBpZiAocG9saWN5ICE9IG51bGwpICAgICAgICAgIAotICAgICAgewotICAgICAgICBFZGl0UGFydCB0YXJnZXQgPSBwb2xpY3kuZ2V0UmVsYXRpdmVFZGl0UGFydChmb2N1c0VkaXRQYXJ0LCBkaXJlY3Rpb24pOwotICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgCWlmKGlzQ3RybERvd24pIHsKLQotICAgICAgICAJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAJCQkgT2JqZWN0IGtleWJvYXJkRHJhZyA9IGVkaXRvci5nZXRBZGFwdGVyKElLZXlib2FyZERyYWcuY2xhc3MpOwotICAgICAgICAJCQkgaWYgKGtleWJvYXJkRHJhZyBpbnN0YW5jZW9mIElLZXlib2FyZERyYWcpIHsKLSAgICAgICAgCQkJCSAoKElLZXlib2FyZERyYWcpIGtleWJvYXJkRHJhZykucGVyZm9ybUtleWJvYXJkRHJhZyhmb2N1c0VkaXRQYXJ0LCBkaXJlY3Rpb24pOwotICAgICAgICAJCQkJIHJldHVybiB0cnVlOwotICAgICAgICAJCSB9Ci0gICAgICAgIAl9Ci0gICAgICAgIAllbHNlIHsKLSAgICAgICAgICAgICAgICBuYXZpZ2F0ZVRvKHRhcmdldCwgZXZlbnQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAJfQotICAgICAgICB9ICAgICAgICAgIAotICAgICAgfSAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpCi0gICAgewotICAgICAgY2FzZSBTV1QuUEFHRV9ET1dOIDoKLSAgICAgIHsgIAotICAgICAgICBpZiAoc2Nyb2xsUGFnZShldmVudCwgUG9zaXRpb25Db25zdGFudHMuU09VVEgpKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSAgCi0gICAgICBjYXNlIFNXVC5QQUdFX1VQIDoKLSAgICAgIHsgIAotICAgICAgICBpZiAoc2Nyb2xsUGFnZShldmVudCwgUG9zaXRpb25Db25zdGFudHMuTk9SVEgpKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgY2FzZSBTV1QuRjMgOgotICAgICAgY2FzZSBTV1QuQ1IgOgotICAgICAgewotICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSAoQWN0aW9uUmVnaXN0cnkpIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihBY3Rpb25SZWdpc3RyeS5jbGFzcyk7Ci0gICAgICAgIGlmIChyZWdpc3RyeSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSUFjdGlvbiBhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKgotICAgICAgY2FzZSBTV1QuRjUgOgotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydCBwYXJ0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIGlmIChwYXJ0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBFZGl0b3JNb2RlTWFuYWdlciBtYW5hZ2VyID0gKEVkaXRvck1vZGVNYW5hZ2VyKXBhcnQuZ2V0QWRhcHRlcihFZGl0b3JNb2RlTWFuYWdlci5jbGFzcyk7Ci0gICAgICAgICAgRWRpdG9yTW9kZVtdIG1vZGVzID0gbWFuYWdlci5nZXRNb2RlcygpOwotICAgICAgICAgIEVkaXRvck1vZGUgbW9kZSA9IG1hbmFnZXIuZ2V0Q3VycmVudE1vZGUoKTsKLSAgICAgICAgICBMaXN0IGxpc3QgPSBBcnJheXMuYXNMaXN0KG1vZGVzKTsKLSAgICAgICAgICBpbnQgaW5kZXggPSBsaXN0LmluZGV4T2YobW9kZSk7Ci0gICAgICAgICAgaW50IG5leHRJbmRleCA9IGluZGV4ICsgMTsKLSAgICAgICAgICBpZiAobmV4dEluZGV4IDwgbW9kZXMubGVuZ3RoKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1vZGUgPSAoRWRpdG9yTW9kZSlsaXN0LmdldChuZXh0SW5kZXgpOwotICAgICAgICAgIH0gIAotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtb2RlID0gKEVkaXRvck1vZGUpbGlzdC5nZXQoMCk7ICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICAgIGlmIChtb2RlICE9IG1hbmFnZXIuZ2V0Q3VycmVudE1vZGUoKSkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIG1hbmFnZXIuc2V0Q3VycmVudE1vZGUobW9kZSk7Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0gIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0qLyAgICAgIAotICAgIH0KLSAgICByZXR1cm4gc3VwZXIua2V5UHJlc3NlZChldmVudCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gc2Nyb2xsUGFnZShLZXlFdmVudCBldmVudCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIGlmICghKGdldFZpZXdlcigpLmdldENvbnRyb2woKSBpbnN0YW5jZW9mIEZpZ3VyZUNhbnZhcykpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgRmlndXJlQ2FudmFzIGZpZ0NhbnZhcyA9IChGaWd1cmVDYW52YXMpIGdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLSAgICBQb2ludCBsb2MgPSBmaWdDYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRWaWV3TG9jYXRpb24oKTsKLSAgICBSZWN0YW5nbGUgYXJlYSA9IGZpZ0NhbnZhcy5nZXRWaWV3cG9ydCgpLmdldENsaWVudEFyZWEoUmVjdGFuZ2xlLlNJTkdMRVRPTikuc2NhbGUoLjgpOwotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgewotICAgICAgZmlnQ2FudmFzLnNjcm9sbFRvWShsb2MueSAtIGFyZWEuaGVpZ2h0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZpZ0NhbnZhcy5zY3JvbGxUb1kobG9jLnkgKyBhcmVhLmhlaWdodCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0Rlc2lnblZpZXdDb250ZXh0TWVudVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzZTQ0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5Db250ZXh0TWVudVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5FZGl0b3JNb2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5JWFNEUmVmYWN0b3JDb25zdGFudHM7Ci0KLQotcHVibGljIGNsYXNzIERlc2lnblZpZXdDb250ZXh0TWVudVByb3ZpZGVyIGV4dGVuZHMgQ29udGV4dE1lbnVQcm92aWRlcgotewotICBJRWRpdG9yUGFydCBlZGl0b3I7ICAKLSAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgR3JhcGhDb250ZXh0TWVudVByb3ZpZGVyLgotICAgKiAKLSAgICogQHBhcmFtIHNlbGVjdGlvblByb3ZpZGVyCi0gICAqIEBwYXJhbSBlZGl0b3IKLSAgICovCi0gIHB1YmxpYyBEZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlcihJRWRpdG9yUGFydCBlZGl0b3IsIEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKQotICB7Ci0gICAgc3VwZXIodmlld2VyKTsKLSAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjsKLSAgICB0aGlzLnNlbGVjdGlvblByb3ZpZGVyID0gc2VsZWN0aW9uUHJvdmlkZXI7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuQ29udGV4dE1lbnVQcm92aWRlciNidWlsZENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIsCi0gICAqICAgICAgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyKQotICAgKi8KLSAgcHVibGljIHZvaWQgYnVpbGRDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkKLSAgewotICAgIElNZW51TWFuYWdlciBjdXJyZW50TWVudSA9IG1lbnU7Ci0gICAgCi0gICAgRWRpdG9yTW9kZU1hbmFnZXIgbWFuYWdlciA9IChFZGl0b3JNb2RlTWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihFZGl0b3JNb2RlTWFuYWdlci5jbGFzcyk7Ci0gICAgQ29udGV4dE1lbnVQYXJ0aWNpcGFudCBjb250ZXh0TWVudVBhcnRpY2lwYW50ID0gbWFuYWdlciAhPSBudWxsID8gbWFuYWdlci5nZXRDdXJyZW50TW9kZSgpLmdldENvbnRleHRNZW51UGFydGljaXBhbnQoKSA6IG51bGw7Ci0gICAgCi0gICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotICAgIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0RWRpdG9yQWN0aW9uUmVnaXN0cnkoKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotICAgIAotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAKLSAgICAgIC8vIENvbnZlcnQgZWRpdHBhcnRzIHRvIG1vZGVsIG9iamVjdHMgYXMgc2VsZWN0aW9ucyAKLSAgICAgIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBzZWxlY3RlZE9iamVjdCA9ICgoRWRpdFBhcnQpc2VsZWN0ZWRPYmplY3QpLmdldE1vZGVsKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElBY3Rpb25Qcm92aWRlcikKLSAgICAgIHsKLSAgICAgICAgSUFjdGlvblByb3ZpZGVyIGFjdGlvblByb3ZpZGVyID0gKElBY3Rpb25Qcm92aWRlcikgc2VsZWN0ZWRPYmplY3Q7Ci0KLSAgICAgICAgU3RyaW5nW10gYWN0aW9ucyA9IGFjdGlvblByb3ZpZGVyLmdldEFjdGlvbnMobnVsbCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBpZCA9IGFjdGlvbnNbaV07Ci0gICAgICAgICAgaWYgKGNvbnRleHRNZW51UGFydGljaXBhbnQgPT0gbnVsbCB8fCBjb250ZXh0TWVudVBhcnRpY2lwYW50LmlzQXBwbGljYWJsZShzZWxlY3RlZE9iamVjdCwgaWQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpZC5zdGFydHNXaXRoKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9TVEFSVF9JRCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gaWQuc3Vic3RyaW5nKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9TVEFSVF9JRC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgIElNZW51TWFuYWdlciBzdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKHRleHQpOwotICAgICAgICAgICAgICBjdXJyZW50TWVudS5hZGQoc3ViTWVudSk7Ci0gICAgICAgICAgICAgIGN1cnJlbnRNZW51ID0gc3ViTWVudTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGlkLnN0YXJ0c1dpdGgoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX0VORF9JRCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGN1cnJlbnRNZW51ID0gZ2V0UGFyZW50TWVudShtZW51LCBjdXJyZW50TWVudSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpZC5lcXVhbHMoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjdXJyZW50TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSUFjdGlvbiBhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oaWQpOwotICAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgYWN0aW9uLmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgIGN1cnJlbnRNZW51LmFkZChhY3Rpb24pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7ICAgICAgIAotICAgICAgICBJTWVudU1hbmFnZXIgc3ViTWVudSA9IG5ldyBNZW51TWFuYWdlcihNZXNzYWdlcy5fVUlfUkVGQUNUT1JfQ09OVEVYVF9NRU5VLCBJWFNEUmVmYWN0b3JDb25zdGFudHMuUkVGQUNUT1JfQ09OVEVYVF9NRU5VX0lEKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZW51LmFkZChzdWJNZW51KTsKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsgICAgICAgCi0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoInNlYXJjaC1zbG90IikpOyAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCJlbmREZXNpZ25NZW51LXNsb3QiKSk7ICAvLyAkTk9OLU5MUy0xJAotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgfQotICAgIH0gICAgCi0gICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJTWVudU1hbmFnZXIgZ2V0UGFyZW50TWVudShJTWVudU1hbmFnZXIgcm9vdCwgSU1lbnVNYW5hZ2VyIGNoaWxkKSB7Ci0gICAgSU1lbnVNYW5hZ2VyIHBhcmVudCA9IG51bGw7Ci0gICAgCi0gICAgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBraWRzID0gcm9vdC5nZXRJdGVtcygpOwotICAgIGludCBpbmRleCA9IDA7Ci0gICAgd2hpbGUgKGluZGV4IDwga2lkcy5sZW5ndGggJiYgcGFyZW50ID09IG51bGwpIHsKLSAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBraWRzW2luZGV4XTsKLSAgICAgIGlmIChpdGVtLmVxdWFscyhjaGlsZCkpIHsKLSAgICAgICAgcGFyZW50ID0gcm9vdDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIElNZW51TWFuYWdlcikgewotICAgICAgICAgIHBhcmVudCA9IGdldFBhcmVudE1lbnUoKElNZW51TWFuYWdlcikgaXRlbSwgY2hpbGQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRleCsrOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGdldEVkaXRvckFjdGlvblJlZ2lzdHJ5KCkKLSAgewotICAgIHJldHVybiAoQWN0aW9uUmVnaXN0cnkpIGVkaXRvci5nZXRBZGFwdGVyKEFjdGlvblJlZ2lzdHJ5LmNsYXNzKTsKLSAgfQotICBwcm90ZWN0ZWQgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjazsKLQotICBwcm90ZWN0ZWQgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpCi0gIHsKLSAgICBpZiAoY29tbWFuZFN0YWNrID09IG51bGwpCi0gICAgICBjb21tYW5kU3RhY2sgPSBnZXRWaWV3ZXIoKS5nZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCk7Ci0gICAgcmV0dXJuIGNvbW1hbmRTdGFjazsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0Rlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MTQxNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0Rlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOYXZpZ2F0aW9uSGlzdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlJlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEUmVkZWZpbmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuSUhvbGRlckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuUm9vdENvbnRlbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlN0cnVjdHVyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklNb2RlbFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5Db21tb25TZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLkFEVENvbnRlbnRPdXRsaW5lUGFnZTsKLQotcHVibGljIGNsYXNzIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIgZXh0ZW5kcyBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBBRFRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciA9IG5ldyBBRFRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKTsKLSAgcHJvdGVjdGVkIElucHV0Q2hhbmdlTWFuYWdlciBpbnB1dENoYW5nZU1hbmFnZXIgPSBuZXcgSW5wdXRDaGFuZ2VNYW5hZ2VyKCk7Ci0gIHByaXZhdGUgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLQotICBwdWJsaWMgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcihJRWRpdG9yUGFydCBlZGl0b3IsIENvbW1vblNlbGVjdGlvbk1hbmFnZXIgbWFuYWdlcikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yOwotICAgIHNldENvbnRleHRNZW51KG5ldyBEZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlcihlZGl0b3IsIHRoaXMsIHRoaXMpKTsKLSAgICBlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoIm9yZy5lY2xpcHNlLndzdC54c2QudWkucG9wdXAuZ3JhcGgiLCBnZXRDb250ZXh0TWVudSgpLCBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyBtYWtlIHRoZSBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyIGxpc3RlbiB0byBncmFwaCB2aWV3IHNlbGVjdGlvbiBjaGFuZ2VzCi0gICAgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIpOyAgICAKLSAgICBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihtYW5hZ2VyKTsKLSAgICBtYW5hZ2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsgIAotICAgIAotICAgIHNldEtleUhhbmRsZXIobmV3IEJhc2VHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyKHRoaXMpKTsgICAgCi0gIH0KLSAgCi0gIAotICAvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBzb21ldGhpbmcgY2hhbmdlcyBpbiB0aGUgc2VsZWN0aW9uIG1hbmFnZXIKLSAgLy8gKGUuZy4gYSBzZWxlY3Rpb24gb2NjdXJlZCBmcm9tIGFub3RoZXIgdmlldykKLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBudWxsOwotICAgIElTZWxlY3Rpb24gZXZlbnRTZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoZXZlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAJc2VsZWN0ZWRPYmplY3QgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50U2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsgCi0gICAgfSAgICAKLSAgICAvLyBUT0RPIChjcykgSXQgc2VlbXMgbGlrZSB0aGVyZSdzIHdheSBtb3JlIHNlbGVjdGlvbiBnb2luZyBvbiB0aGFuIHRoZXJlCi0gICAgLy8gc2hvdWxkCi0gICAgLy8gYmUhISBUaGVyZSdzIGF0IGxlYXN0IDIgc2VsZWN0aW9ucyBnZXR0aW5nIGZpcmVkIHdoZW4gc29tZXRoaW5nIGlzCi0gICAgLy8gc2VsZWN0ZWQgaW4gdGhlCi0gICAgLy8gb3V0bGluZSB2aWV3LiBBcmUgd2UgbGlzdGVuaW5nIHRvIHRvbyBtYW55IHRoaW5ncz8KLSAgICAvLwotICAgIC8vIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFEVENvbnRlbnRPdXRsaW5lUGFnZSkKLSAgICBpZiAoc2VsZWN0ZWRPYmplY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgaWYgKGV2ZW50LmdldFNvdXJjZSgpICE9IGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIpCi0gICAgewotICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSVN0cnVjdHVyZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkgJiYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQURUQ29udGVudE91dGxpbmVQYWdlKSkgfHwKLSAgICAgICAgICAgICghKGdldElucHV0KCkgaW5zdGFuY2VvZiBJTW9kZWwpKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJR3JhcGhFbGVtZW50KSAmJiAoKElHcmFwaEVsZW1lbnQpc2VsZWN0ZWRPYmplY3QpLmlzRm9jdXNBbGxvd2VkKCkpIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyKSkgICAgICAgICAgICAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24oKElTdHJ1Y3R1cmUpc2VsZWN0ZWRPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJR3JhcGhFbGVtZW50KQotICAgICAgewotICAgICAgICBpZiAoKChJR3JhcGhFbGVtZW50KXNlbGVjdGVkT2JqZWN0KS5pc0ZvY3VzQWxsb3dlZCgpICYmICgoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBRFRDb250ZW50T3V0bGluZVBhZ2UpKSkKLSAgICAgICAgewotICAgICAgICAgIHNldElucHV0QW5kTWFya0xvY2F0aW9uKChJQURUT2JqZWN0KXNlbGVjdGVkT2JqZWN0KTsgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCEoKElHcmFwaEVsZW1lbnQpc2VsZWN0ZWRPYmplY3QpLmlzRm9jdXNBbGxvd2VkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBXZSBlbmNvdW50ZXJlZCBhbiBvYmplY3QgdGhhdCBpcyBub3QgYSB2YWxpZCBpbnB1dCB0byB0aGUgZ3JhcGggdmlld2VyCi0gICAgICAgICAgLy8gTm93IGZpbmQgdGhlIHRvcCBjb250YWluZXIgdGhhdCBjYW4gYmUgYSB2YWxpZCBpbnB1dAotICAgICAgICAgIElBRFRPYmplY3Qgb2JqID0gKChJR3JhcGhFbGVtZW50KXNlbGVjdGVkT2JqZWN0KS5nZXRUb3BDb250YWluZXIoKTsKLSAgICAgICAgICBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBRFRDb250ZW50T3V0bGluZVBhZ2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBpZiB0aGUgc2VsZWN0aW9uIGlzIG9yaWdpbmF0ZWQgZnJvbSB0aGUgb3V0bGluZSwgd2Ugc2hvdWxkIAotICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBpbnB1dHMKLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCAmJiBnZXRJbnB1dCgpICE9IG9iaikgIC8vIERvbid0IGNoYW5nZSBpbnB1dHMgaWYgdGhlIG9iaiBpcyBhbHJlYWR5IHRoZSBpbnB1dAotICAgICAgICAgICAgICBzZXRJbnB1dEFuZE1hcmtMb2NhdGlvbihvYmopOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIENvbW1vblNlbGVjdGlvbk1hbmFnZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBpZiB0aGUgc2VsZWN0aW9uIGlzIG9yaWdpbmF0ZWQgZnJvbSBzb21lIGFjdGlvbiwgaWUuIGFkZGluZwotICAgICAgICAgICAgLy8gYSBuZXcgZWxlbWVudCwgd2Ugc2hvdWxkIGNoYW5nZSB0aGUgaW5wdXQgb25seSBpZiB0aGUgY3VycmVudCBpbnB1dCBpcyB0aGUgbW9kZWwKLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaW5wdXRzIHdpbGwgY2hhbmdlIHVuZXhwZWN0ZWRseSEhCi0gICAgICAgICAgICBpZiAoZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZXRJbnB1dCAob2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgaWYgdGhlIHNlbGVjdGlvbiBpcyBvcmlnaW5hdGVkIGZyb20gdGhlIHNvdXJjZSB2aWV3ZXIKLSAgICAgICAgICAgIC8vIHdlIHNob3VsZCBjaGFuZ2UgdGhlIGlucHV0IHJlZ2FyZGxlc3MuICBUZXN0IGlzIGZvciBtdWx0aXBsZSBsZXZlbHMKLSAgICAgICAgICAgIC8vIG9mIGFub255bW91cyB0eXBlcwotICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgICAgICBzZXRJbnB1dCAob2JqKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCAmJiBnZXRJbnB1dCgpIGluc3RhbmNlb2YgSU1vZGVsKQotICAgICAgICAgICAgICBzZXRJbnB1dEFuZE1hcmtMb2NhdGlvbihvYmopOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJRmllbGQpIAotICAgICAgICB7Ci0gICAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClzZWxlY3RlZE9iamVjdDsKLSAgICAgICAgICBpZiAoICghZmllbGQuaXNHbG9iYWwoKSAmJiBnZXRJbnB1dCgpIGluc3RhbmNlb2YgSU1vZGVsKSB8fAotICAgICAgICAgICAgICAgKCFmaWVsZC5pc0dsb2JhbCgpICYmICEoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBDb21tb25TZWxlY3Rpb25NYW5hZ2VyKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgSUFEVE9iamVjdCBvYmogPSAoKElHcmFwaEVsZW1lbnQpc2VsZWN0ZWRPYmplY3QpLmdldFRvcENvbnRhaW5lcigpOwotICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgICAgICBzZXRJbnB1dEFuZE1hcmtMb2NhdGlvbihvYmopOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChmaWVsZC5pc0dsb2JhbCgpICYmICEoZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyICkKLSAgICAgICAgICAgICAgc2V0SW5wdXQoZmllbGQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBzZXRJbnB1dEFuZE1hcmtMb2NhdGlvbihmaWVsZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElGaWVsZCkKLSAgICAgIHsKLSAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClzZWxlY3RlZE9iamVjdDsKLSAgICAgICAgaWYgKCAoZmllbGQuaXNHbG9iYWwoKSAmJiAoZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkgJiYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQURUQ29udGVudE91dGxpbmVQYWdlKSkgfHwKLSAgICAgICAgICAgICggKGZpZWxkLmlzR2xvYmFsKCkgJiYgIShnZXRJbnB1dCgpIGluc3RhbmNlb2YgSU1vZGVsKSkpKQotICAgICAgICB7ICAKLSAgICAgICAgICBzZXRJbnB1dEFuZE1hcmtMb2NhdGlvbihmaWVsZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSU1vZGVsUHJveHkpCi0gICAgICB7Ci0gICAgICAgIElNb2RlbFByb3h5IGFkYXB0ZXIgPSAoSU1vZGVsUHJveHkpc2VsZWN0ZWRPYmplY3Q7ICAgICAgICAKLSAgICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgUmVkZWZpbmVDYXRlZ29yeUFkYXB0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgCVJlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyIHNlbGVjdGlvbkFkYXB0ZXIgPSAoUmVkZWZpbmVDYXRlZ29yeUFkYXB0ZXIpc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgIAlYU0RSZWRlZmluZUFkYXB0ZXIgc2VsZWN0aW9uUGFyZW50QWRhcHRlciA9IHNlbGVjdGlvbkFkYXB0ZXIuZ2V0WHNkUmVkZWZpbmVBZGFwdGVyKCk7IAotICAgICAgICAJc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24oc2VsZWN0aW9uUGFyZW50QWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZ2V0SW5wdXQoKSAhPSBhZGFwdGVyLmdldE1vZGVsKCkpCi0gICAgICAgICAgIHNldElucHV0KGFkYXB0ZXIuZ2V0TW9kZWwoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElNb2RlbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGdldElucHV0KCkgIT0gc2VsZWN0ZWRPYmplY3QpCi0gICAgICAgICAgc2V0SW5wdXQoKElNb2RlbClzZWxlY3RlZE9iamVjdCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnQoZ2V0Um9vdEVkaXRQYXJ0KCksIHNlbGVjdGVkT2JqZWN0KTsKLSAgICAgIGlmIChlZGl0UGFydCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdFBhcnQpKTsKLSAgICAgICAgc2V0Rm9jdXMoZWRpdFBhcnQpOwotICAgICAgfQotICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFdlIG5lZWQgdG8gY29udmVydCBmcm9tIGVkaXQgcGFydCBzZWxlY3Rpb25zIHRvIG1vZGVsIG9iamVjdCBzZWxlY3Rpb25zCi0gICAqLwotICBjbGFzcyBBRFRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCi0gICAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBpLm5leHQoKTsKLSAgICAgICAgbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cnVjdHVyZWRTZWxlY3Rpb24gY29udmVydFNlbGVjdGlvbkZyb21FZGl0UGFydFRvTW9kZWwoSVNlbGVjdGlvbiBlZGl0UGFydFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBMaXN0IHNlbGVjdGVkTW9kZWxPYmplY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgaWYgKGVkaXRQYXJ0U2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGVkaXRQYXJ0U2VsZWN0aW9uKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICAgICAgT2JqZWN0IG1vZGVsID0gbnVsbDsKLSAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRWRpdFBhcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIG9iajsKLSAgICAgICAgICAgIG1vZGVsID0gZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG1vZGVsICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0ZWRNb2RlbE9iamVjdExpc3QuYWRkKG1vZGVsKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZE1vZGVsT2JqZWN0TGlzdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICAgIHsKLSAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIElTZWxlY3Rpb24gbmV3U2VsZWN0aW9uID0gY29udmVydFNlbGVjdGlvbkZyb21FZGl0UGFydFRvTW9kZWwoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgdGhpcy5zZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247Ci0gICAgICBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgbmV3RXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIG5ld1NlbGVjdGlvbik7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMobmV3RXZlbnQpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGdldEVkaXRQYXJ0KEVkaXRQYXJ0IHBhcmVudCwgT2JqZWN0IG9iamVjdCkKLSAgewotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcGFyZW50LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgIGlmIChlZGl0UGFydC5nZXRNb2RlbCgpID09IG9iamVjdCAmJiAhKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUhvbGRlckVkaXRQYXJ0KSAmJiAhKGVkaXRQYXJ0IGluc3RhbmNlb2YgUm9vdENvbnRlbnRFZGl0UGFydCkpCi0gICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gZWRpdFBhcnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gICAgICAgICAgICAgCi0gIAotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICB7IAotICAgICAgZm9yIChJdGVyYXRvciBpID0gcGFyZW50LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRFZGl0UGFydCgoRWRpdFBhcnQpaS5uZXh0KCksIG9iamVjdCk7Ci0gICAgICAgIGlmIChlZGl0UGFydCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRmlyc3QgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgc2VsZWN0aW9uCi0gICAgICAgICAgSVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24gdGhlbiB3ZSB3aWxsIHRyeSB0byBzZWxlY3QgCi0gICAgICAgICAgLy8gdGhlIHRhcmdldCBlZGl0IHBhcnQgdGhhdCBpcyBvbmUgb2YgaXRzIGNoaWxkcmVuCi0gICAgICAgICAgLy8gVGhpcyBpcyBoYW5keSB3aGVuIHlvdSBhZGQgYW4gZWxlbWVudCB0byBhIHN0cnVjdHVyZWQgZWRpdCBwYXJ0Ci0gICAgICAgICAgLy8gdGhlbiB5b3Ugd2FudCB0byBzZWxlY3QgdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgYW5kIHB1dCBpdCBpbgotICAgICAgICAgIC8vIGRpcmVjdCBlZGl0IG1vZGUKLSAgICAgICAgICBpZiAoY3VycmVudFNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50U2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRWRpdFBhcnQgdGFyZ2V0U3RydWN0dXJlRWRpdFBhcnQgPSAoRWRpdFBhcnQpKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKWN1cnJlbnRTZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICBpZiAodGFyZ2V0U3RydWN0dXJlRWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICh0YXJnZXRTdHJ1Y3R1cmVFZGl0UGFydCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTdHJ1Y3R1cmVFZGl0UGFydCBpbnN0YW5jZW9mIFN0cnVjdHVyZUVkaXRQYXJ0KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIHRhcmdldFN0cnVjdHVyZUVkaXRQYXJ0ID0gdGFyZ2V0U3RydWN0dXJlRWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIEVkaXRQYXJ0IHBvdGVudGlhbEVkaXRQYXJ0VG9TZWxlY3QgPSBlZGl0UGFydDsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIHdoaWxlIChwb3RlbnRpYWxFZGl0UGFydFRvU2VsZWN0ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocG90ZW50aWFsRWRpdFBhcnRUb1NlbGVjdCBpbnN0YW5jZW9mIFN0cnVjdHVyZUVkaXRQYXJ0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwb3RlbnRpYWxFZGl0UGFydFRvU2VsZWN0ID0gcG90ZW50aWFsRWRpdFBhcnRUb1NlbGVjdC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy8gSWYgd2UgZm91bmQgYSBwb3RlbnRpYWwgZWRpdCBwYXJ0IHRvIHNlbGVjdCB0aGVuIHJldHVybiBpdAotICAgICAgICAgICAgICAvLyBPUiwgaWYgdGhlcmUgaXMgbm8gdGFyZ2V0IGZvdW5kLCB0aGVuIHdlIHNob3VsZCBqdXN0IHJldHVybgotICAgICAgICAgICAgICAvLyB0aGUgZWRpdCBwYXJ0IHdlIGZvdW5kCi0gICAgICAgICAgICAgIGlmIChwb3RlbnRpYWxFZGl0UGFydFRvU2VsZWN0ID09IHRhcmdldFN0cnVjdHVyZUVkaXRQYXJ0IHx8IHBvdGVudGlhbEVkaXRQYXJ0VG9TZWxlY3QgPT0gbnVsbCB8fCB0YXJnZXRTdHJ1Y3R1cmVFZGl0UGFydCA9PSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZWRpdFBhcnQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSAvLyBPdGhlcndpc2UganVzdCBmaW5kIHRoZSBmaXJzdCBvbmUgYW5kIHJldHVybgotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGVkaXRQYXJ0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgCi0gICAgfQotICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dEFuZE1hcmtMb2NhdGlvbihJQURUT2JqZWN0IG9iamVjdCkKLSAgewotICAgIElBRFRPYmplY3Qgb2xkSW5wdXQgPSBnZXRJbnB1dCgpOwotICAgIElOYXZpZ2F0aW9uSGlzdG9yeSBuYXZpZ2F0aW9uSGlzdG9yeSA9IG51bGw7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIGlmKHdvcmtiZW5jaCAhPSBudWxsKQotICAgIHsKLSAgICAJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXb3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgCWlmKGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgIAl7Ci0gICAgCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gYWN0aXZlV29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAJCWlmKGFjdGl2ZVBhZ2UgIT0gbnVsbCkKLSAgICAJCXsKLSAgICAJCQluYXZpZ2F0aW9uSGlzdG9yeSA9IGFjdGl2ZVBhZ2UuZ2V0TmF2aWdhdGlvbkhpc3RvcnkoKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLQotICAgIHNldElucHV0KG9iamVjdCk7Ci0KLSAgICBpZiAoZWRpdG9yUGFydCAhPSBudWxsICYmIG9sZElucHV0ICE9IG9iamVjdCkKLSAgICB7Ci0gICAgICBuYXZpZ2F0aW9uSGlzdG9yeS5tYXJrTG9jYXRpb24oZWRpdG9yUGFydCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJQURUT2JqZWN0IG9iamVjdCkKLSAgewotICAgIFJvb3RDb250ZW50RWRpdFBhcnQgcm9vdENvbnRlbnRFZGl0UGFydCA9IChSb290Q29udGVudEVkaXRQYXJ0KWdldFJvb3RFZGl0UGFydCgpLmdldENvbnRlbnRzKCk7Ci0gICAgcm9vdENvbnRlbnRFZGl0UGFydC5zZXRNb2RlbChvYmplY3QpOwotICAgIHJvb3RDb250ZW50RWRpdFBhcnQucmVmcmVzaCgpOwotCi0gICAgaWYgKG9iamVjdCAhPSBudWxsKQotICAgIHsgIAotICAgICAgaW5wdXRDaGFuZ2VNYW5hZ2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpKTsKLSAgICB9Ci0gICAgLy8gU2VsZWN0IHRoZSBlZGl0cGFydCB3aGVuIGl0IGlzIHNldCBhcyBpbnB1dAotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnQocm9vdENvbnRlbnRFZGl0UGFydCwgb2JqZWN0KTsKLSAgICBpZiAoZWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgIHNlbGVjdChlZGl0UGFydCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldElucHV0KCkKLSAgewotICAgIFJvb3RDb250ZW50RWRpdFBhcnQgcm9vdENvbnRlbnRFZGl0UGFydCA9IChSb290Q29udGVudEVkaXRQYXJ0KWdldFJvb3RFZGl0UGFydCgpLmdldENvbnRlbnRzKCk7ICAgIAotICAgIHJldHVybiAoSUFEVE9iamVjdClyb290Q29udGVudEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBnZXRJbnB1dEVkaXRQYXJ0KCkKLSAgewotICAgIHJldHVybiBnZXRSb290RWRpdFBhcnQoKS5nZXRDb250ZW50cygpOyAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkSW5wdXRDaGFuZ2RMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgaW5wdXRDaGFuZ2VNYW5hZ2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUlucHV0Q2hhbmdkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGlucHV0Q2hhbmdlTWFuYWdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOyAgICAKLSAgfSAgCi0gIAotICAKLSAgcHJpdmF0ZSBjbGFzcyBJbnB1dENoYW5nZU1hbmFnZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIKLSAgewotICAgIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICAgIGlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLSAgICAgIHsgIAotICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICAgIH0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gICAgeyAgIAotICAgICAgLy8gbm8gb25lIHNob3VsZCBiZSBjYWxsaW5nIHRoaXMgbWV0aG9kICAgICAKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOyAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgICB7IAotICAgICAgbm90aWZ5TGlzdGVuZXJzKHNlbGVjdGlvbik7Ci0gICAgfQotCi0gICAgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChsaXN0ZW5lcnMpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKLSAgICAgIH0gIAotICAgIH0gICAgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRGVzaWduVmlld2VyR3JhcGhpY0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzRlMGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgaW50ZXJmYWNlIERlc2lnblZpZXdlckdyYXBoaWNDb25zdGFudHMKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NBTEVEX0hBTkRMRV9MQVlFUiA9ICJTY2FsZWQgSGFuZGxlIExheWVyIjsgLy8kTk9OLU5MUy0xJCAgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIEZvbnQgIHNtYWxsRm9udCA9IG5ldyBGb250KERpc3BsYXkuZ2V0Q3VycmVudCgpLCAiVGFob21hIiwgNiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRmxhdENDb21iby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0ZsYXRDQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1OTM2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRmxhdENDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlR5cGVkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIFRoZSBDQ29tYm8gY2xhc3MgcmVwcmVzZW50cyBhIHNlbGVjdGFibGUgdXNlciBpbnRlcmZhY2Ugb2JqZWN0Ci0gKiB0aGF0IGNvbWJpbmVzIGEgdGV4dCBmaWVsZCBhbmQgYSBsaXN0IGFuZCBpc3N1ZXMgbm90aWZpY2F0aW9uCi0gKiB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQgZnJvbSB0aGUgbGlzdC4KLSAqIDxwPgotICogTm90ZSB0aGF0IGFsdGhvdWdoIHRoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LAotICogaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBhZGQgY2hpbGRyZW4gdG8gaXQsIG9yIHNldCBhIGxheW91dCBvbiBpdC4KLSAqIDwvcD4KLSAqIDxkbD4KLSAqIDxkdD48Yj5TdHlsZXM6PC9iPgotICogPGRkPkJPUkRFUiwgUkVBRF9PTkxZLCBGTEFUPC9kZD4KLSAqIDxkdD48Yj5FdmVudHM6PC9iPgotICogPGRkPlNlbGVjdGlvbjwvZGQ+Ci0gKiA8L2RsPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmxhdENDb21ibyBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLSAgVGV4dCB0ZXh0OwotICBMaXN0IGxpc3Q7Ci0gIGludCB2aXNpYmxlSXRlbUNvdW50ID0gNTsKLSAgU2hlbGwgcG9wdXA7Ci0gIExhYmVsIGFycm93OwotICBib29sZWFuIGhhc0ZvY3VzOwotICBMaXN0ZW5lciBsaXN0ZW5lciwgZmlsdGVyOwotICBDb2xvciBmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kOwotICBGb250IGZvbnQ7Ci0gIAotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZ2l2ZW4gaXRzIHBhcmVudAotICogYW5kIGEgc3R5bGUgdmFsdWUgZGVzY3JpYmluZyBpdHMgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuCi0gKiA8cD4KLSAqIFRoZSBzdHlsZSB2YWx1ZSBpcyBlaXRoZXIgb25lIG9mIHRoZSBzdHlsZSBjb25zdGFudHMgZGVmaW5lZCBpbgotICogY2xhc3MgPGNvZGU+U1dUPC9jb2RlPiB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIGluc3RhbmNlcyBvZiB0aGlzCi0gKiBjbGFzcywgb3IgbXVzdCBiZSBidWlsdCBieSA8ZW0+Yml0d2lzZSBPUjwvZW0+J2luZyB0b2dldGhlciAKLSAqICh0aGF0IGlzLCB1c2luZyB0aGUgPGNvZGU+aW50PC9jb2RlPiAifCIgb3BlcmF0b3IpIHR3byBvciBtb3JlCi0gKiBvZiB0aG9zZSA8Y29kZT5TV1Q8L2NvZGU+IHN0eWxlIGNvbnN0YW50cy4gVGhlIGNsYXNzIGRlc2NyaXB0aW9uCi0gKiBsaXN0cyB0aGUgc3R5bGUgY29uc3RhbnRzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGNsYXNzLgotICogU3R5bGUgYml0cyBhcmUgYWxzbyBpbmhlcml0ZWQgZnJvbSBzdXBlcmNsYXNzZXMuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHBhcmVudCBhIHdpZGdldCB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCi0gKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIG9mIHdpZGdldCB0byBjb25zdHJ1Y3QKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHBhcmVudDwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgU1dUI0JPUkRFUgotICogQHNlZSBTV1QjUkVBRF9PTkxZCi0gKiBAc2VlIFNXVCNGTEFUCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNnZXRTdHlsZSgpCi0gKi8KLXB1YmxpYyBGbGF0Q0NvbWJvIChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgc3VwZXIgKHBhcmVudCwgc3R5bGUgPSBjaGVja1N0eWxlIChzdHlsZSkpOwotICAKLSAgaW50IHRleHRTdHlsZSA9IFNXVC5TSU5HTEU7Ci0gIGlmICgoc3R5bGUgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKSB0ZXh0U3R5bGUgfD0gU1dULlJFQURfT05MWTsKLSAgaWYgKChzdHlsZSAmIFNXVC5GTEFUKSAhPSAwKSB0ZXh0U3R5bGUgfD0gU1dULkZMQVQ7Ci0gIHRleHQgPSBuZXcgVGV4dCAodGhpcywgdGV4dFN0eWxlKTsKLSAgYXJyb3cgPSBuZXcgTGFiZWwodGhpcywgU1dULkZMQVQpOwotICBhcnJvdy5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1RyaWFuZ2xlVG9vbEJhci5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotICBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0gICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0gICAgICBpZiAocG9wdXAgPT0gZXZlbnQud2lkZ2V0KSB7Ci0gICAgICAgIHBvcHVwRXZlbnQgKGV2ZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKHRleHQgPT0gZXZlbnQud2lkZ2V0KSB7Ci0gICAgICAgIHRleHRFdmVudCAoZXZlbnQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAobGlzdCA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgICAgbGlzdEV2ZW50IChldmVudCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChhcnJvdyA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgICAgYXJyb3dFdmVudCAoZXZlbnQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAoRmxhdENDb21iby50aGlzID09IGV2ZW50LndpZGdldCkgewotICAgICAgICBjb21ib0V2ZW50IChldmVudCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChnZXRTaGVsbCAoKSA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgICAgaGFuZGxlRm9jdXMgKFNXVC5Gb2N1c091dCk7Ci0gICAgICB9Ci0gICAgfQotICB9OwotICBmaWx0ZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgIFNoZWxsIHNoZWxsID0gKChDb250cm9sKWV2ZW50LndpZGdldCkuZ2V0U2hlbGwgKCk7Ci0gICAgICBpZiAoc2hlbGwgPT0gRmxhdENDb21iby50aGlzLmdldFNoZWxsICgpKSB7Ci0gICAgICAgIGhhbmRsZUZvY3VzIChTV1QuRm9jdXNPdXQpOwotICAgICAgfQotICAgIH0KLSAgfTsKLSAgCi0gIGludCBbXSBjb21ib0V2ZW50cyA9IHtTV1QuRGlzcG9zZSwgU1dULk1vdmUsIFNXVC5SZXNpemV9OwotICBmb3IgKGludCBpPTA7IGk8Y29tYm9FdmVudHMubGVuZ3RoOyBpKyspIHRoaXMuYWRkTGlzdGVuZXIgKGNvbWJvRXZlbnRzIFtpXSwgbGlzdGVuZXIpOwotICAKLSAgaW50IFtdIHRleHRFdmVudHMgPSB7U1dULktleURvd24sIFNXVC5LZXlVcCwgU1dULk1lbnVEZXRlY3QsIFNXVC5Nb2RpZnksIFNXVC5Nb3VzZURvd24sIFNXVC5Nb3VzZVVwLCBTV1QuVHJhdmVyc2UsIFNXVC5Gb2N1c0lufTsKLSAgZm9yIChpbnQgaT0wOyBpPHRleHRFdmVudHMubGVuZ3RoOyBpKyspIHRleHQuYWRkTGlzdGVuZXIgKHRleHRFdmVudHMgW2ldLCBsaXN0ZW5lcik7Ci0gIAotICBpbnQgW10gYXJyb3dFdmVudHMgPSB7U1dULk1vdXNlRG93biwgU1dULlNlbGVjdGlvbiwgU1dULkZvY3VzSW59OwotICBmb3IgKGludCBpPTA7IGk8YXJyb3dFdmVudHMubGVuZ3RoOyBpKyspIGFycm93LmFkZExpc3RlbmVyIChhcnJvd0V2ZW50cyBbaV0sIGxpc3RlbmVyKTsKLSAgCi0gIGNyZWF0ZVBvcHVwKG51bGwsIC0xKTsKLSAgaW5pdEFjY2Vzc2libGUoKTsKLX0KLXN0YXRpYyBpbnQgY2hlY2tTdHlsZSAoaW50IHN0eWxlKSB7Ci0gIGludCBtYXNrID0gU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgfCBTV1QuRkxBVCB8IFNXVC5MRUZUX1RPX1JJR0hUIHwgU1dULlJJR0hUX1RPX0xFRlQ7Ci0gIHJldHVybiBzdHlsZSAmIG1hc2s7Ci19Ci0vKioKLSAqIEFkZHMgdGhlIGFyZ3VtZW50IHRvIHRoZSBlbmQgb2YgdGhlIHJlY2VpdmVyJ3MgbGlzdC4KLSAqCi0gKiBAcGFyYW0gc3RyaW5nIHRoZSBuZXcgaXRlbQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHN0cmluZyBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgI2FkZChTdHJpbmcsaW50KQotICovCi1wdWJsaWMgdm9pZCBhZGQgKFN0cmluZyBzdHJpbmcpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgaWYgKHN0cmluZyA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAgbGlzdC5hZGQgKHN0cmluZyk7Ci19Ci0vKioKLSAqIEFkZHMgdGhlIGFyZ3VtZW50IHRvIHRoZSByZWNlaXZlcidzIGxpc3QgYXQgdGhlIGdpdmVuCi0gKiB6ZXJvLXJlbGF0aXZlIGluZGV4LgotICogPHA+Ci0gKiBOb3RlOiBUbyBhZGQgYW4gaXRlbSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LCB1c2UgdGhlCi0gKiByZXN1bHQgb2YgY2FsbGluZyA8Y29kZT5nZXRJdGVtQ291bnQoKTwvY29kZT4gYXMgdGhlCi0gKiBpbmRleCBvciB1c2UgPGNvZGU+YWRkKFN0cmluZyk8L2NvZGU+LgotICogPC9wPgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIG5ldyBpdGVtCi0gKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IGZvciB0aGUgaXRlbQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHN0cmluZyBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX1JBTkdFIC0gaWYgdGhlIGluZGV4IGlzIG5vdCBiZXR3ZWVuIDAgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgKGluY2x1c2l2ZSk8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSAjYWRkKFN0cmluZykKLSAqLwotcHVibGljIHZvaWQgYWRkIChTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXgpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgaWYgKHN0cmluZyA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAgbGlzdC5hZGQgKHN0cmluZywgaW5kZXgpOwotfQotLyoqCi0gKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwKLSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHJlY2VpdmVyJ3MgdGV4dCBpcyBtb2RpZmllZCwgYnkgc2VuZGluZwotICogaXQgb25lIG9mIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSA8Y29kZT5Nb2RpZnlMaXN0ZW5lcjwvY29kZT4KLSAqIGludGVyZmFjZS4KLSAqCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSBNb2RpZnlMaXN0ZW5lcgotICogQHNlZSAjcmVtb3ZlTW9kaWZ5TGlzdGVuZXIKLSAqLwotcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIgKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gIGNoZWNrV2lkZ2V0KCk7Ci0gIGlmIChsaXN0ZW5lciA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAgVHlwZWRMaXN0ZW5lciB0eXBlZExpc3RlbmVyID0gbmV3IFR5cGVkTGlzdGVuZXIgKGxpc3RlbmVyKTsKLSAgYWRkTGlzdGVuZXIgKFNXVC5Nb2RpZnksIHR5cGVkTGlzdGVuZXIpOwotfQotLyoqCi0gKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwKLSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHJlY2VpdmVyJ3Mgc2VsZWN0aW9uIGNoYW5nZXMsIGJ5IHNlbmRpbmcKLSAqIGl0IG9uZSBvZiB0aGUgbWVzc2FnZXMgZGVmaW5lZCBpbiB0aGUgPGNvZGU+U2VsZWN0aW9uTGlzdGVuZXI8L2NvZGU+Ci0gKiBpbnRlcmZhY2UuCi0gKiA8cD4KLSAqIDxjb2RlPndpZGdldFNlbGVjdGVkPC9jb2RlPiBpcyBjYWxsZWQgd2hlbiB0aGUgY29tYm8ncyBsaXN0IHNlbGVjdGlvbiBjaGFuZ2VzLgotICogPGNvZGU+d2lkZ2V0RGVmYXVsdFNlbGVjdGVkPC9jb2RlPiBpcyB0eXBpY2FsbHkgY2FsbGVkIHdoZW4gRU5URVIgaXMgcHJlc3NlZCB0aGUgY29tYm8ncyB0ZXh0IGFyZWEuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgU2VsZWN0aW9uTGlzdGVuZXIKLSAqIEBzZWUgI3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQKLSAqLwotcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgaWYgKGxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICBUeXBlZExpc3RlbmVyIHR5cGVkTGlzdGVuZXIgPSBuZXcgVHlwZWRMaXN0ZW5lciAobGlzdGVuZXIpOwotICBhZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbix0eXBlZExpc3RlbmVyKTsKLSAgYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLHR5cGVkTGlzdGVuZXIpOwotfQotdm9pZCBhcnJvd0V2ZW50IChFdmVudCBldmVudCkgewotICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLSAgICBjYXNlIFNXVC5Gb2N1c0luOiB7Ci0gICAgICBoYW5kbGVGb2N1cyAoU1dULkZvY3VzSW4pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULlNlbGVjdGlvbjogewotICAgICAgZHJvcERvd24gKCFpc0Ryb3BwZWQgKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULk1vdXNlRG93bjogewotICAgICAgZHJvcERvd24gKCFpc0Ryb3BwZWQgKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0vKioKLSAqIFNldHMgdGhlIHNlbGVjdGlvbiBpbiB0aGUgcmVjZWl2ZXIncyB0ZXh0IGZpZWxkIHRvIGFuIGVtcHR5Ci0gKiBzZWxlY3Rpb24gc3RhcnRpbmcganVzdCBiZWZvcmUgdGhlIGZpcnN0IGNoYXJhY3Rlci4gSWYgdGhlCi0gKiB0ZXh0IGZpZWxkIGlzIGVkaXRhYmxlLCB0aGlzIGhhcyB0aGUgZWZmZWN0IG9mIHBsYWNpbmcgdGhlCi0gKiBpLWJlYW0gYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0LgotICogPHA+Ci0gKiBOb3RlOiBUbyBjbGVhciB0aGUgc2VsZWN0ZWQgaXRlbXMgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdCwgCi0gKiB1c2UgPGNvZGU+ZGVzZWxlY3RBbGwoKTwvY29kZT4uCi0gKiA8L3A+Ci0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlICNkZXNlbGVjdEFsbAotICovCi1wdWJsaWMgdm9pZCBjbGVhclNlbGVjdGlvbiAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICB0ZXh0LmNsZWFyU2VsZWN0aW9uICgpOwotICBsaXN0LmRlc2VsZWN0QWxsICgpOwotfQotdm9pZCBjb21ib0V2ZW50IChFdmVudCBldmVudCkgewotICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLSAgICBjYXNlIFNXVC5EaXNwb3NlOgotICAgICAgaWYgKHBvcHVwICE9IG51bGwgJiYgIXBvcHVwLmlzRGlzcG9zZWQgKCkpIHsKLSAgICAgICAgbGlzdC5yZW1vdmVMaXN0ZW5lciAoU1dULkRpc3Bvc2UsIGxpc3RlbmVyKTsKLSAgICAgICAgcG9wdXAuZGlzcG9zZSAoKTsKLSAgICAgIH0KLSAgICAgIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwgKCk7Ci0gICAgICBzaGVsbC5yZW1vdmVMaXN0ZW5lciAoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLSAgICAgIERpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkgKCk7Ci0gICAgICBkaXNwbGF5LnJlbW92ZUZpbHRlciAoU1dULkZvY3VzSW4sIGZpbHRlcik7Ci0gICAgICBwb3B1cCA9IG51bGw7ICAKLSAgICAgIHRleHQgPSBudWxsOyAgCi0gICAgICBsaXN0ID0gbnVsbDsgIAotICAgICAgYXJyb3cgPSBudWxsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTV1QuTW92ZToKLSAgICAgIGRyb3BEb3duIChmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNXVC5SZXNpemU6Ci0gICAgICBpbnRlcm5hbExheW91dCAoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotcHVibGljIFBvaW50IGNvbXB1dGVTaXplIChpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICBpbnQgd2lkdGggPSAwLCBoZWlnaHQgPSAwOwotICBTdHJpbmdbXSBpdGVtcyA9IGxpc3QuZ2V0SXRlbXMgKCk7Ci0gIGludCB0ZXh0V2lkdGggPSAwOwotICBHQyBnYyA9IG5ldyBHQyAodGV4dCk7Ci0gIGludCBzcGFjZXIgPSBnYy5zdHJpbmdFeHRlbnQgKCIgIikueDsgLy8kTk9OLU5MUy0xJAotICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGV4dFdpZHRoID0gTWF0aC5tYXggKGdjLnN0cmluZ0V4dGVudCAoaXRlbXNbaV0pLngsIHRleHRXaWR0aCk7Ci0gIH0KLSAgZ2MuZGlzcG9zZSgpOwotICBQb2ludCB0ZXh0U2l6ZSA9IHRleHQuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7Ci0gIC8vIFBvaW50IGFycm93U2l6ZSA9IGFycm93LmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGNoYW5nZWQpOwotICBQb2ludCBhcnJvd1NpemUgPSBuZXcgUG9pbnQoMTYsIDE2KTsKLSAgUG9pbnQgbGlzdFNpemUgPSBsaXN0LmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGNoYW5nZWQpOwotICBpbnQgYm9yZGVyV2lkdGggPSBnZXRCb3JkZXJXaWR0aCAoKTsKLSAgCi0gIGhlaWdodCA9IE1hdGgubWF4ICh0ZXh0U2l6ZS55LCBhcnJvd1NpemUueSk7Ci0gIHdpZHRoID0gTWF0aC5tYXggKHRleHRXaWR0aCArIDIqc3BhY2VyICsgYXJyb3dTaXplLnggKyAyKmJvcmRlcldpZHRoLCBsaXN0U2l6ZS54KTsKLSAgaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUKSB3aWR0aCA9IHdIaW50OwotICBpZiAoaEhpbnQgIT0gU1dULkRFRkFVTFQpIGhlaWdodCA9IGhIaW50OwotICByZXR1cm4gbmV3IFBvaW50ICh3aWR0aCArIDIqYm9yZGVyV2lkdGgsIGhlaWdodCArIDIqYm9yZGVyV2lkdGgpOwotfQotdm9pZCBjcmVhdGVQb3B1cChTdHJpbmdbXSBpdGVtcywgaW50IHNlbGVjdGlvbkluZGV4KSB7ICAgIAotICAgIC8vIGNyZWF0ZSBzaGVsbCBhbmQgbGlzdAotICAgIHBvcHVwID0gbmV3IFNoZWxsIChnZXRTaGVsbCAoKSwgU1dULk5PX1RSSU0gfCBTV1QuT05fVE9QKTsKLSAgICBpbnQgc3R5bGUgPSBnZXRTdHlsZSAoKTsKLSAgICBpbnQgbGlzdFN0eWxlID0gU1dULlNJTkdMRSB8IFNXVC5WX1NDUk9MTDsKLSAgICBpZiAoKHN0eWxlICYgU1dULkZMQVQpICE9IDApIGxpc3RTdHlsZSB8PSBTV1QuRkxBVDsKLSAgICBpZiAoKHN0eWxlICYgU1dULlJJR0hUX1RPX0xFRlQpICE9IDApIGxpc3RTdHlsZSB8PSBTV1QuUklHSFRfVE9fTEVGVDsKLSAgICBpZiAoKHN0eWxlICYgU1dULkxFRlRfVE9fUklHSFQpICE9IDApIGxpc3RTdHlsZSB8PSBTV1QuTEVGVF9UT19SSUdIVDsKLSAgICBsaXN0ID0gbmV3IExpc3QgKHBvcHVwLCBsaXN0U3R5bGUpOwotICAgIGlmIChmb250ICE9IG51bGwpIGxpc3Quc2V0Rm9udCAoZm9udCk7Ci0gICAgaWYgKGZvcmVncm91bmQgIT0gbnVsbCkgbGlzdC5zZXRGb3JlZ3JvdW5kIChmb3JlZ3JvdW5kKTsKLSAgICBpZiAoYmFja2dyb3VuZCAhPSBudWxsKSBsaXN0LnNldEJhY2tncm91bmQgKGJhY2tncm91bmQpOwotICAgIAotICAgIGludCBbXSBwb3B1cEV2ZW50cyA9IHtTV1QuQ2xvc2UsIFNXVC5QYWludCwgU1dULkRlYWN0aXZhdGV9OwotICAgIGZvciAoaW50IGk9MDsgaTxwb3B1cEV2ZW50cy5sZW5ndGg7IGkrKykgcG9wdXAuYWRkTGlzdGVuZXIgKHBvcHVwRXZlbnRzIFtpXSwgbGlzdGVuZXIpOwotICAgIGludCBbXSBsaXN0RXZlbnRzID0ge1NXVC5Nb3VzZVVwLCBTV1QuU2VsZWN0aW9uLCBTV1QuVHJhdmVyc2UsIFNXVC5LZXlEb3duLCBTV1QuS2V5VXAsIFNXVC5Gb2N1c0luLCBTV1QuRGlzcG9zZX07Ci0gICAgZm9yIChpbnQgaT0wOyBpPGxpc3RFdmVudHMubGVuZ3RoOyBpKyspIGxpc3QuYWRkTGlzdGVuZXIgKGxpc3RFdmVudHMgW2ldLCBsaXN0ZW5lcik7Ci0gICAgCi0gICAgaWYgKGl0ZW1zICE9IG51bGwpIGxpc3Quc2V0SXRlbXMgKGl0ZW1zKTsKLSAgICBpZiAoc2VsZWN0aW9uSW5kZXggIT0gLTEpIGxpc3Quc2V0U2VsZWN0aW9uIChzZWxlY3Rpb25JbmRleCk7Ci19Ci0vKioKLSAqIERlc2VsZWN0cyB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gemVyby1yZWxhdGl2ZSBpbmRleCBpbiB0aGUgcmVjZWl2ZXIncyAKLSAqIGxpc3QuICBJZiB0aGUgaXRlbSBhdCB0aGUgaW5kZXggd2FzIGFscmVhZHkgZGVzZWxlY3RlZCwgaXQgcmVtYWlucwotICogZGVzZWxlY3RlZC4gSW5kaWNlcyB0aGF0IGFyZSBvdXQgb2YgcmFuZ2UgYXJlIGlnbm9yZWQuCi0gKgotICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBkZXNlbGVjdAotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIGRlc2VsZWN0IChpbnQgaW5kZXgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIGxpc3QuZGVzZWxlY3QgKGluZGV4KTsKLX0KLS8qKgotICogRGVzZWxlY3RzIGFsbCBzZWxlY3RlZCBpdGVtcyBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0LgotICogPHA+Ci0gKiBOb3RlOiBUbyBjbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQsCi0gKiB1c2UgPGNvZGU+Y2xlYXJTZWxlY3Rpb24oKTwvY29kZT4uCi0gKiA8L3A+Ci0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlICNjbGVhclNlbGVjdGlvbgotICovCi1wdWJsaWMgdm9pZCBkZXNlbGVjdEFsbCAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICBsaXN0LmRlc2VsZWN0QWxsICgpOwotfQotdm9pZCBkcm9wRG93biAoYm9vbGVhbiBkcm9wKSB7Ci0gIGlmIChkcm9wID09IGlzRHJvcHBlZCAoKSkgcmV0dXJuOwotICBpZiAoIWRyb3ApIHsKLSAgICBwb3B1cC5zZXRWaXNpYmxlIChmYWxzZSk7Ci0gICAgaWYgKCFpc0Rpc3Bvc2VkICgpJiYgYXJyb3cuaXNGb2N1c0NvbnRyb2woKSkgewotICAgICAgdGV4dC5zZXRGb2N1cygpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoZ2V0U2hlbGwoKSAhPSBwb3B1cC5nZXRQYXJlbnQgKCkpIHsKLSAgICBTdHJpbmdbXSBpdGVtcyA9IGxpc3QuZ2V0SXRlbXMgKCk7Ci0gICAgaW50IHNlbGVjdGlvbkluZGV4ID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLSAgICBsaXN0LnJlbW92ZUxpc3RlbmVyIChTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotICAgIHBvcHVwLmRpc3Bvc2UoKTsKLSAgICBwb3B1cCA9IG51bGw7Ci0gICAgbGlzdCA9IG51bGw7Ci0gICAgY3JlYXRlUG9wdXAgKGl0ZW1zLCBzZWxlY3Rpb25JbmRleCk7Ci0gIH0KLSAgCi0gIFBvaW50IHNpemUgPSBnZXRTaXplICgpOwotICBpbnQgaXRlbUNvdW50ID0gbGlzdC5nZXRJdGVtQ291bnQgKCk7Ci0gIGl0ZW1Db3VudCA9IChpdGVtQ291bnQgPT0gMCkgPyB2aXNpYmxlSXRlbUNvdW50IDogTWF0aC5taW4odmlzaWJsZUl0ZW1Db3VudCwgaXRlbUNvdW50KTsKLSAgaW50IGl0ZW1IZWlnaHQgPSBsaXN0LmdldEl0ZW1IZWlnaHQgKCkgKiBpdGVtQ291bnQ7Ci0gIFBvaW50IGxpc3RTaXplID0gbGlzdC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIGl0ZW1IZWlnaHQsIGZhbHNlKTsKLSAgbGlzdC5zZXRCb3VuZHMgKDEsIDEsIE1hdGgubWF4IChzaXplLnggLSAyLCBsaXN0U2l6ZS54KSwgbGlzdFNpemUueSk7Ci0gIAotICBpbnQgaW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotICBpZiAoaW5kZXggIT0gLTEpIGxpc3Quc2V0VG9wSW5kZXggKGluZGV4KTsKLSAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSAoKTsKLSAgUmVjdGFuZ2xlIGxpc3RSZWN0ID0gbGlzdC5nZXRCb3VuZHMgKCk7Ci0gIFJlY3RhbmdsZSBwYXJlbnRSZWN0ID0gZGlzcGxheS5tYXAgKGdldFBhcmVudCAoKSwgbnVsbCwgZ2V0Qm91bmRzICgpKTsKLSAgUG9pbnQgY29tYm9TaXplID0gZ2V0U2l6ZSAoKTsKLSAgUmVjdGFuZ2xlIGRpc3BsYXlSZWN0ID0gZ2V0TW9uaXRvciAoKS5nZXRDbGllbnRBcmVhICgpOwotICBpbnQgd2lkdGggPSBNYXRoLm1heCAoY29tYm9TaXplLngsIGxpc3RSZWN0LndpZHRoICsgMik7Ci0gIGludCBoZWlnaHQgPSBsaXN0UmVjdC5oZWlnaHQgKyAyOwotICBpbnQgeCA9IHBhcmVudFJlY3QueDsKLSAgaW50IHkgPSBwYXJlbnRSZWN0LnkgKyBjb21ib1NpemUueTsKLSAgaWYgKHkgKyBoZWlnaHQgPiBkaXNwbGF5UmVjdC55ICsgZGlzcGxheVJlY3QuaGVpZ2h0KSB5ID0gcGFyZW50UmVjdC55IC0gaGVpZ2h0OwotICBpZiAoeCArIHdpZHRoID4gZGlzcGxheVJlY3QueCArIGRpc3BsYXlSZWN0LndpZHRoKSB4ID0gZGlzcGxheVJlY3QueCArIGRpc3BsYXlSZWN0LndpZHRoIC0gbGlzdFJlY3Qud2lkdGg7Ci0gIHBvcHVwLnNldEJvdW5kcyAoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0gIHBvcHVwLnNldFZpc2libGUgKHRydWUpOwotICBsaXN0LnNldEZvY3VzICgpOwotfQotLyoKLSAqIFJldHVybiB0aGUgbG93ZXJjYXNlIG9mIHRoZSBmaXJzdCBub24tJyYnIGNoYXJhY3RlciBmb2xsb3dpbmcKLSAqIGFuICcmJyBjaGFyYWN0ZXIgaW4gdGhlIGdpdmVuIHN0cmluZy4gSWYgdGhlcmUgYXJlIG5vICcmJwotICogY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nLCByZXR1cm4gJ1wwJy4KLSAqLwotY2hhciBfZmluZE1uZW1vbmljIChTdHJpbmcgc3RyaW5nKSB7Ci0gIGlmIChzdHJpbmcgPT0gbnVsbCkgcmV0dXJuICdcMCc7Ci0gIGludCBpbmRleCA9IDA7Ci0gIGludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoICgpOwotICBkbyB7Ci0gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIHN0cmluZy5jaGFyQXQgKGluZGV4KSAhPSAnJicpIGluZGV4Kys7Ci0gICAgaWYgKCsraW5kZXggPj0gbGVuZ3RoKSByZXR1cm4gJ1wwJzsKLSAgICBpZiAoc3RyaW5nLmNoYXJBdCAoaW5kZXgpICE9ICcmJykgcmV0dXJuIENoYXJhY3Rlci50b0xvd2VyQ2FzZSAoc3RyaW5nLmNoYXJBdCAoaW5kZXgpKTsKLSAgICBpbmRleCsrOwotICB9IHdoaWxlIChpbmRleCA8IGxlbmd0aCk7Ci0gIHJldHVybiAnXDAnOwotfQotLyogCi0gKiBSZXR1cm4gdGhlIExhYmVsIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0aGUgcmVjZWl2ZXIgaW4gdGhlIHotb3JkZXIsIAotICogb3IgbnVsbCBpZiBub25lLiAKLSAqLwotTGFiZWwgZ2V0QXNzb2NpYXRlZExhYmVsICgpIHsKLSAgQ29udHJvbFtdIHNpYmxpbmdzID0gZ2V0UGFyZW50ICgpLmdldENoaWxkcmVuICgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgaWYgKHNpYmxpbmdzIFtpXSA9PSB0aGlzKSB7Ci0gICAgICBpZiAoaSA+IDAgJiYgc2libGluZ3MgW2ktMV0gaW5zdGFuY2VvZiBMYWJlbCkgewotICAgICAgICByZXR1cm4gKExhYmVsKSBzaWJsaW5ncyBbaS0xXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgQ29udHJvbCBbXSBnZXRDaGlsZHJlbiAoKSB7Ci0gIHJldHVybiBzdXBlci5nZXRDaGlsZHJlbigpOwotfQotLyoqCi0gKiBHZXRzIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLSAqCi0gKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSByZWNlaXZlciBpcyBlZGl0YWJsZQotICogCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBib29sZWFuIGdldEVkaXRhYmxlICgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIHJldHVybiB0ZXh0LmdldEVkaXRhYmxlKCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGl0ZW0gYXQgdGhlIGdpdmVuLCB6ZXJvLXJlbGF0aXZlIGluZGV4IGluIHRoZQotICogcmVjZWl2ZXIncyBsaXN0LiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBvdXQKLSAqIG9mIHJhbmdlLgotICoKLSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0dXJuCi0gKiBAcmV0dXJuIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBpbmRleAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX1JBTkdFIC0gaWYgdGhlIGluZGV4IGlzIG5vdCBiZXR3ZWVuIDAgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgbWludXMgMSAoaW5jbHVzaXZlKTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFN0cmluZyBnZXRJdGVtIChpbnQgaW5kZXgpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgcmV0dXJuIGxpc3QuZ2V0SXRlbSAoaW5kZXgpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgY29udGFpbmVkIGluIHRoZSByZWNlaXZlcidzIGxpc3QuCi0gKgotICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zCi0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGludCBnZXRJdGVtQ291bnQgKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIGxpc3QuZ2V0SXRlbUNvdW50ICgpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgd2hpY2ggd291bGQgYmUgdXNlZCB0bwotICogZGlzcGxheSA8ZW0+b25lPC9lbT4gb2YgdGhlIGl0ZW1zIGluIHRoZSByZWNlaXZlcidzIGxpc3QuCi0gKgotICogQHJldHVybiB0aGUgaGVpZ2h0IG9mIG9uZSBpdGVtCi0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGludCBnZXRJdGVtSGVpZ2h0ICgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIHJldHVybiBsaXN0LmdldEl0ZW1IZWlnaHQgKCk7Ci19Ci0vKioKLSAqIFJldHVybnMgYW4gYXJyYXkgb2YgPGNvZGU+U3RyaW5nPC9jb2RlPnMgd2hpY2ggYXJlIHRoZSBpdGVtcwotICogaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdC4gCi0gKiA8cD4KLSAqIE5vdGU6IFRoaXMgaXMgbm90IHRoZSBhY3R1YWwgc3RydWN0dXJlIHVzZWQgYnkgdGhlIHJlY2VpdmVyCi0gKiB0byBtYWludGFpbiBpdHMgbGlzdCBvZiBpdGVtcywgc28gbW9kaWZ5aW5nIHRoZSBhcnJheSB3aWxsCi0gKiBub3QgYWZmZWN0IHRoZSByZWNlaXZlci4gCi0gKiA8L3A+Ci0gKgotICogQHJldHVybiB0aGUgaXRlbXMgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdAotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBTdHJpbmcgW10gZ2V0SXRlbXMgKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIGxpc3QuZ2V0SXRlbXMgKCk7Ci19Ci1wdWJsaWMgTWVudSBnZXRNZW51KCkgewotICByZXR1cm4gdGV4dC5nZXRNZW51KCk7Ci19Ci0vKioKLSAqIFJldHVybnMgYSA8Y29kZT5Qb2ludDwvY29kZT4gd2hvc2UgeCBjb29yZGluYXRlIGlzIHRoZSBzdGFydAotICogb2YgdGhlIHNlbGVjdGlvbiBpbiB0aGUgcmVjZWl2ZXIncyB0ZXh0IGZpZWxkLCBhbmQgd2hvc2UgeQotICogY29vcmRpbmF0ZSBpcyB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24uIFRoZSByZXR1cm5lZCB2YWx1ZXMKLSAqIGFyZSB6ZXJvLXJlbGF0aXZlLiBBbiAiZW1wdHkiIHNlbGVjdGlvbiBhcyBpbmRpY2F0ZWQgYnkKLSAqIHRoZSB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBoYXZpbmcgdGhlIHNhbWUgdmFsdWUuCi0gKgotICogQHJldHVybiBhIHBvaW50IHJlcHJlc2VudGluZyB0aGUgc2VsZWN0aW9uIHN0YXJ0IGFuZCBlbmQKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uICgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIHJldHVybiB0ZXh0LmdldFNlbGVjdGlvbiAoKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgemVyby1yZWxhdGl2ZSBpbmRleCBvZiB0aGUgaXRlbSB3aGljaCBpcyBjdXJyZW50bHkKLSAqIHNlbGVjdGVkIGluIHRoZSByZWNlaXZlcidzIGxpc3QsIG9yIC0xIGlmIG5vIGl0ZW0gaXMgc2VsZWN0ZWQuCi0gKgotICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldFNlbGVjdGlvbkluZGV4ICgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIHJldHVybiBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotfQotcHVibGljIGludCBnZXRTdHlsZSAoKSB7Ci0gIGludCBzdHlsZSA9IHN1cGVyLmdldFN0eWxlICgpOwotICBzdHlsZSAmPSB+U1dULlJFQURfT05MWTsKLSAgaWYgKCF0ZXh0LmdldEVkaXRhYmxlKCkpIHN0eWxlIHw9IFNXVC5SRUFEX09OTFk7IAotICByZXR1cm4gc3R5bGU7Ci19Ci0vKioKLSAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZQotICogcmVjZWl2ZXIncyB0ZXh0IGZpZWxkLgotICoKLSAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgdGV4dAotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICByZXR1cm4gdGV4dC5nZXRUZXh0ICgpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHJlY2VpdmVycydzIHRleHQgZmllbGQuCi0gKgotICogQHJldHVybiB0aGUgdGV4dCBoZWlnaHQKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldFRleHRIZWlnaHQgKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIHRleHQuZ2V0TGluZUhlaWdodCAoKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHRoZSByZWNlaXZlcidzCi0gKiB0ZXh0IGZpZWxkIGlzIGNhcGFibGUgb2YgaG9sZGluZy4gSWYgdGhpcyBoYXMgbm90IGJlZW4gY2hhbmdlZAotICogYnkgPGNvZGU+c2V0VGV4dExpbWl0KCk8L2NvZGU+LCBpdCB3aWxsIGJlIHRoZSBjb25zdGFudAotICogPGNvZGU+Q29tYm8uTElNSVQ8L2NvZGU+LgotICogCi0gKiBAcmV0dXJuIHRoZSB0ZXh0IGxpbWl0Ci0gKiAKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0VGV4dExpbWl0ICgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIHJldHVybiB0ZXh0LmdldFRleHRMaW1pdCAoKTsKLX0KLS8qKgotICogR2V0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgYXJlIHZpc2libGUgaW4gdGhlIGRyb3AKLSAqIGRvd24gcG9ydGlvbiBvZiB0aGUgcmVjZWl2ZXIncyBsaXN0LgotICoKLSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGFyZSB2aXNpYmxlCi0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50IGdldFZpc2libGVJdGVtQ291bnQgKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIHZpc2libGVJdGVtQ291bnQ7Ci19Ci12b2lkIGhhbmRsZUZvY3VzIChpbnQgdHlwZSkgewotICBpZiAoaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFNXVC5Gb2N1c0luOiB7Ci0gICAgICBpZiAoaGFzRm9jdXMpIHJldHVybjsKLSAgICAgIGlmIChnZXRFZGl0YWJsZSAoKSkgdGV4dC5zZWxlY3RBbGwgKCk7Ci0gICAgICBoYXNGb2N1cyA9IHRydWU7Ci0gICAgICBTaGVsbCBzaGVsbCA9IGdldFNoZWxsICgpOwotICAgICAgc2hlbGwucmVtb3ZlTGlzdGVuZXIgKFNXVC5EZWFjdGl2YXRlLCBsaXN0ZW5lcik7Ci0gICAgICBzaGVsbC5hZGRMaXN0ZW5lciAoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLSAgICAgIERpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkgKCk7Ci0gICAgICBkaXNwbGF5LnJlbW92ZUZpbHRlciAoU1dULkZvY3VzSW4sIGZpbHRlcik7Ci0gICAgICBkaXNwbGF5LmFkZEZpbHRlciAoU1dULkZvY3VzSW4sIGZpbHRlcik7Ci0gICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuRm9jdXNJbiwgZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuRm9jdXNPdXQ6IHsKLSAgICAgIGlmICghaGFzRm9jdXMpIHJldHVybjsKLSAgICAgIENvbnRyb2wgZm9jdXNDb250cm9sID0gZ2V0RGlzcGxheSAoKS5nZXRGb2N1c0NvbnRyb2wgKCk7Ci0gICAgICBpZiAoZm9jdXNDb250cm9sID09IGFycm93IHx8IGZvY3VzQ29udHJvbCA9PSBsaXN0IHx8IGZvY3VzQ29udHJvbCA9PSB0ZXh0KSByZXR1cm47Ci0gICAgICBoYXNGb2N1cyA9IGZhbHNlOwotICAgICAgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCAoKTsKLSAgICAgIHNoZWxsLnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBsaXN0ZW5lcik7Ci0gICAgICBEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5ICgpOwotICAgICAgZGlzcGxheS5yZW1vdmVGaWx0ZXIgKFNXVC5Gb2N1c0luLCBmaWx0ZXIpOwotICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULkZvY3VzT3V0LCBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotLyoqCi0gKiBTZWFyY2hlcyB0aGUgcmVjZWl2ZXIncyBsaXN0IHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBpdGVtCi0gKiAoaW5kZXggMCkgdW50aWwgYW4gaXRlbSBpcyBmb3VuZCB0aGF0IGlzIGVxdWFsIHRvIHRoZSAKLSAqIGFyZ3VtZW50LCBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhhdCBpdGVtLiBJZiBubyBpdGVtCi0gKiBpcyBmb3VuZCwgcmV0dXJucyAtMS4KLSAqCi0gKiBAcGFyYW0gc3RyaW5nIHRoZSBzZWFyY2ggaXRlbQotICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGludCBpbmRleE9mIChTdHJpbmcgc3RyaW5nKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICByZXR1cm4gbGlzdC5pbmRleE9mIChzdHJpbmcpOwotfQotLyoqCi0gKiBTZWFyY2hlcyB0aGUgcmVjZWl2ZXIncyBsaXN0IHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiwgCi0gKiB6ZXJvLXJlbGF0aXZlIGluZGV4IHVudGlsIGFuIGl0ZW0gaXMgZm91bmQgdGhhdCBpcyBlcXVhbAotICogdG8gdGhlIGFyZ3VtZW50LCBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhhdCBpdGVtLiBJZgotICogbm8gaXRlbSBpcyBmb3VuZCBvciB0aGUgc3RhcnRpbmcgaW5kZXggaXMgb3V0IG9mIHJhbmdlLAotICogcmV0dXJucyAtMS4KLSAqCi0gKiBAcGFyYW0gc3RyaW5nIHRoZSBzZWFyY2ggaXRlbQotICogQHBhcmFtIHN0YXJ0IHRoZSB6ZXJvLXJlbGF0aXZlIGluZGV4IGF0IHdoaWNoIHRvIGJlZ2luIHRoZSBzZWFyY2gKLSAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBpdGVtCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgaW5kZXhPZiAoU3RyaW5nIHN0cmluZywgaW50IHN0YXJ0KSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICByZXR1cm4gbGlzdC5pbmRleE9mIChzdHJpbmcsIHN0YXJ0KTsKLX0KLQotdm9pZCBpbml0QWNjZXNzaWJsZSgpIHsKLSAgQWNjZXNzaWJsZUFkYXB0ZXIgYWNjZXNzaWJsZUFkYXB0ZXIgPSBuZXcgQWNjZXNzaWJsZUFkYXB0ZXIgKCkgewotICAgIHB1YmxpYyB2b2lkIGdldE5hbWUgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgICBMYWJlbCBsYWJlbCA9IGdldEFzc29jaWF0ZWRMYWJlbCAoKTsKLSAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7Ci0gICAgICAgIG5hbWUgPSBzdHJpcE1uZW1vbmljIChsYWJlbC5nZXRUZXh0KCkpOwotICAgICAgfQotICAgICAgZS5yZXN1bHQgPSBuYW1lOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBnZXRLZXlib2FyZFNob3J0Y3V0KEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICBTdHJpbmcgc2hvcnRjdXQgPSBudWxsOwotICAgICAgTGFiZWwgbGFiZWwgPSBnZXRBc3NvY2lhdGVkTGFiZWwgKCk7Ci0gICAgICBpZiAobGFiZWwgIT0gbnVsbCkgewotICAgICAgICBTdHJpbmcgdGV4dCA9IGxhYmVsLmdldFRleHQgKCk7Ci0gICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICBjaGFyIG1uZW1vbmljID0gX2ZpbmRNbmVtb25pYyAodGV4dCk7Ci0gICAgICAgICAgaWYgKG1uZW1vbmljICE9ICdcMCcpIHsKLSAgICAgICAgICAgIHNob3J0Y3V0ID0gIkFsdCsiK21uZW1vbmljOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlLnJlc3VsdCA9IHNob3J0Y3V0OwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBnZXRIZWxwIChBY2Nlc3NpYmxlRXZlbnQgZSkgewotICAgICAgZS5yZXN1bHQgPSBnZXRUb29sVGlwVGV4dCAoKTsKLSAgICB9Ci0gIH07Ci0gIGdldEFjY2Vzc2libGUgKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyIChhY2Nlc3NpYmxlQWRhcHRlcik7Ci0gIHRleHQuZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIgKGFjY2Vzc2libGVBZGFwdGVyKTsKLSAgbGlzdC5nZXRBY2Nlc3NpYmxlICgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lciAoYWNjZXNzaWJsZUFkYXB0ZXIpOwotICAKLSAgYXJyb3cuZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLSAgICBwdWJsaWMgdm9pZCBnZXROYW1lIChBY2Nlc3NpYmxlRXZlbnQgZSkgewotICAgICAgZS5yZXN1bHQgPSBpc0Ryb3BwZWQgKCkgPyBTV1QuZ2V0TWVzc2FnZSAoIlNXVF9DbG9zZSIpIDogU1dULmdldE1lc3NhZ2UgKCJTV1RfT3BlbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgZ2V0S2V5Ym9hcmRTaG9ydGN1dCAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgIGUucmVzdWx0ID0gIkFsdCtEb3duIEFycm93IjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBnZXRIZWxwIChBY2Nlc3NpYmxlRXZlbnQgZSkgewotICAgICAgZS5yZXN1bHQgPSBnZXRUb29sVGlwVGV4dCAoKTsKLSAgICB9Ci0gIH0pOwotCi0gIGdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyIChuZXcgQWNjZXNzaWJsZVRleHRBZGFwdGVyKCkgewotICAgIHB1YmxpYyB2b2lkIGdldENhcmV0T2Zmc2V0IChBY2Nlc3NpYmxlVGV4dEV2ZW50IGUpIHsKLSAgICAgIGUub2Zmc2V0ID0gdGV4dC5nZXRDYXJldFBvc2l0aW9uICgpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBnZXRTZWxlY3Rpb25SYW5nZShBY2Nlc3NpYmxlVGV4dEV2ZW50IGUpIHsKLSAgICAgIFBvaW50IHNlbCA9IHRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBlLm9mZnNldCA9IHNlbC54OwotICAgICAgZS5sZW5ndGggPSBzZWwueSAtIHNlbC54OwotICAgIH0KLSAgfSk7Ci0gIAotICBnZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLSAgICBwdWJsaWMgdm9pZCBnZXRDaGlsZEF0UG9pbnQgKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgUG9pbnQgdGVzdFBvaW50ID0gdG9Db250cm9sIChlLngsIGUueSk7Ci0gICAgICBpZiAoZ2V0Qm91bmRzICgpLmNvbnRhaW5zICh0ZXN0UG9pbnQpKSB7Ci0gICAgICAgIGUuY2hpbGRJRCA9IEFDQy5DSElMRElEX1NFTEY7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGdldExvY2F0aW9uIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgIFJlY3RhbmdsZSBsb2NhdGlvbiA9IGdldEJvdW5kcyAoKTsKLSAgICAgIFBvaW50IHB0ID0gdG9EaXNwbGF5IChsb2NhdGlvbi54LCBsb2NhdGlvbi55KTsKLSAgICAgIGUueCA9IHB0Lng7Ci0gICAgICBlLnkgPSBwdC55OwotICAgICAgZS53aWR0aCA9IGxvY2F0aW9uLndpZHRoOwotICAgICAgZS5oZWlnaHQgPSBsb2NhdGlvbi5oZWlnaHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGdldENoaWxkQ291bnQgKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgZS5kZXRhaWwgPSAwOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBnZXRSb2xlIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgIGUuZGV0YWlsID0gQUNDLlJPTEVfQ09NQk9CT1g7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGdldFN0YXRlIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgIGUuZGV0YWlsID0gQUNDLlNUQVRFX05PUk1BTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZXRWYWx1ZSAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICBlLnJlc3VsdCA9IGdldFRleHQgKCk7Ci0gICAgfQotICB9KTsKLQotICB0ZXh0LmdldEFjY2Vzc2libGUgKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlciAoKSB7Ci0gICAgcHVibGljIHZvaWQgZ2V0Um9sZSAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICBlLmRldGFpbCA9IHRleHQuZ2V0RWRpdGFibGUgKCkgPyBBQ0MuUk9MRV9URVhUIDogQUNDLlJPTEVfTEFCRUw7Ci0gICAgfQotICB9KTsKLQotICBhcnJvdy5nZXRBY2Nlc3NpYmxlICgpLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgcHVibGljIHZvaWQgZ2V0RGVmYXVsdEFjdGlvbiAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICBlLnJlc3VsdCA9IGlzRHJvcHBlZCAoKSA/IFNXVC5nZXRNZXNzYWdlICgiU1dUX0Nsb3NlIikgOiBTV1QuZ2V0TWVzc2FnZSAoIlNXVF9PcGVuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgfSk7Ci19Ci1ib29sZWFuIGlzRHJvcHBlZCAoKSB7Ci0gIHJldHVybiBwb3B1cC5nZXRWaXNpYmxlICgpOwotfQotcHVibGljIGJvb2xlYW4gaXNGb2N1c0NvbnRyb2wgKCkgewotICBjaGVja1dpZGdldCgpOwotICBpZiAodGV4dC5pc0ZvY3VzQ29udHJvbCAoKSB8fCBhcnJvdy5pc0ZvY3VzQ29udHJvbCAoKSB8fCBsaXN0LmlzRm9jdXNDb250cm9sICgpIHx8IHBvcHVwLmlzRm9jdXNDb250cm9sICgpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gCi0gIHJldHVybiBzdXBlci5pc0ZvY3VzQ29udHJvbCAoKTsKLX0KLXZvaWQgaW50ZXJuYWxMYXlvdXQgKGJvb2xlYW4gY2hhbmdlZCkgewotICBpZiAoaXNEcm9wcGVkICgpKSBkcm9wRG93biAoZmFsc2UpOwotICBSZWN0YW5nbGUgcmVjdCA9IGdldENsaWVudEFyZWEgKCk7Ci0gIGludCB3aWR0aCA9IHJlY3Qud2lkdGg7Ci0gIGludCBoZWlnaHQgPSByZWN0LmhlaWdodDsKLSAgLy8gUG9pbnQgYXJyb3dTaXplID0gYXJyb3cuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBoZWlnaHQsIGNoYW5nZWQpOwotICAvLyB0ZXh0LnNldEJvdW5kcyAoMCwgMCwgd2lkdGggLSBhcnJvd1NpemUueCwgaGVpZ2h0KTsKLSAgdGV4dC5zZXRCb3VuZHMgKDAsIDAsIHdpZHRoIC0gMTYsIGhlaWdodCk7Ci0gIC8vIGFycm93LnNldEJvdW5kcyAod2lkdGggLSBhcnJvd1NpemUueCwgMCwgYXJyb3dTaXplLngsIGFycm93U2l6ZS55KTsKLSAgYXJyb3cuc2V0Qm91bmRzICh3aWR0aCAtIDE2LCAwLCAxNiwgMTYpOwotfQotdm9pZCBsaXN0RXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgIGNhc2UgU1dULkRpc3Bvc2U6Ci0gICAgICBpZiAoZ2V0U2hlbGwgKCkgIT0gcG9wdXAuZ2V0UGFyZW50ICgpKSB7Ci0gICAgICAgIFN0cmluZ1tdIGl0ZW1zID0gbGlzdC5nZXRJdGVtcyAoKTsKLSAgICAgICAgaW50IHNlbGVjdGlvbkluZGV4ID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLSAgICAgICAgcG9wdXAgPSBudWxsOwotICAgICAgICBsaXN0ID0gbnVsbDsKLSAgICAgICAgY3JlYXRlUG9wdXAgKGl0ZW1zLCBzZWxlY3Rpb25JbmRleCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNXVC5Gb2N1c0luOiB7Ci0gICAgICBoYW5kbGVGb2N1cyAoU1dULkZvY3VzSW4pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULk1vdXNlVXA6IHsKLSAgICAgIGlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotICAgICAgZHJvcERvd24gKGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5TZWxlY3Rpb246IHsKLSAgICAgIGludCBpbmRleCA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0gICAgICBpZiAoaW5kZXggPT0gLTEpIHJldHVybjsKLSAgICAgIHRleHQuc2V0VGV4dCAobGlzdC5nZXRJdGVtIChpbmRleCkpOwotICAgICAgdGV4dC5zZWxlY3RBbGwgKCk7Ci0gICAgICBsaXN0LnNldFNlbGVjdGlvbiAoaW5kZXgpOwotICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgIGUuZG9pdCA9IGV2ZW50LmRvaXQ7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5TZWxlY3Rpb24sIGUpOwotICAgICAgZXZlbnQuZG9pdCA9IGUuZG9pdDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5UcmF2ZXJzZTogewotICAgICAgc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLSAgICAgICAgY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0gICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTOgotICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9BUlJPV19ORVhUOgotICAgICAgICAgIGV2ZW50LmRvaXQgPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgZS5kZXRhaWwgPSBldmVudC5kZXRhaWw7Ci0gICAgICBlLmRvaXQgPSBldmVudC5kb2l0OwotICAgICAgZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0gICAgICBlLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuVHJhdmVyc2UsIGUpOwotICAgICAgZXZlbnQuZG9pdCA9IGUuZG9pdDsKLSAgICAgIGV2ZW50LmRldGFpbCA9IGUuZGV0YWlsOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULktleVVwOiB7ICAgCi0gICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgZS50aW1lID0gZXZlbnQudGltZTsKLSAgICAgIGUuY2hhcmFjdGVyID0gZXZlbnQuY2hhcmFjdGVyOwotICAgICAgZS5rZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKLSAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuS2V5VXAsIGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULktleURvd246IHsKLSAgICAgIGlmIChldmVudC5jaGFyYWN0ZXIgPT0gU1dULkVTQykgeyAKLSAgICAgICAgLy8gRXNjYXBlIGtleSBjYW5jZWxzIHBvcHVwIGxpc3QKLSAgICAgICAgZHJvcERvd24gKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGlmICgoZXZlbnQuc3RhdGVNYXNrICYgU1dULkFMVCkgIT0gMCAmJiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfVVAgfHwgZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfRE9XTikpIHsKLSAgICAgICAgZHJvcERvd24gKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGlmIChldmVudC5jaGFyYWN0ZXIgPT0gU1dULkNSKSB7Ci0gICAgICAgIC8vIEVudGVyIGNhdXNlcyBkZWZhdWx0IHNlbGVjdGlvbgotICAgICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgZSk7Ci0gICAgICB9Ci0gICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSB3aWRnZXQgbWF5IGhhdmUgYmVlbiBkaXNwb3NlZC4KLSAgICAgIC8vIElmIHNvLCBkbyBub3QgY29udGludWUuCi0gICAgICBpZiAoaXNEaXNwb3NlZCAoKSkgYnJlYWs7Ci0gICAgICBFdmVudCBlID0gbmV3IEV2ZW50KCk7Ci0gICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0gICAgICBlLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotICAgICAgZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMoU1dULktleURvd24sIGUpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBwb3B1cEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgIGNhc2UgU1dULlBhaW50OgotICAgICAgLy8gZHJhdyBibGFjayByZWN0YW5nbGUgYXJvdW5kIGxpc3QKLSAgICAgIFJlY3RhbmdsZSBsaXN0UmVjdCA9IGxpc3QuZ2V0Qm91bmRzKCk7Ci0gICAgICBDb2xvciBibGFjayA9IGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spOwotICAgICAgZXZlbnQuZ2Muc2V0Rm9yZWdyb3VuZChibGFjayk7Ci0gICAgICBldmVudC5nYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIGxpc3RSZWN0LndpZHRoICsgMSwgbGlzdFJlY3QuaGVpZ2h0ICsgMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNXVC5DbG9zZToKLSAgICAgIGV2ZW50LmRvaXQgPSBmYWxzZTsKLSAgICAgIGRyb3BEb3duIChmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNXVC5EZWFjdGl2YXRlOgotICAgICAgZHJvcERvd24gKGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci1wdWJsaWMgdm9pZCByZWRyYXcgKCkgewotICBzdXBlci5yZWRyYXcoKTsKLSAgdGV4dC5yZWRyYXcoKTsKLSAgYXJyb3cucmVkcmF3KCk7Ci0gIGlmIChwb3B1cC5pc1Zpc2libGUoKSkgbGlzdC5yZWRyYXcoKTsKLX0KLXB1YmxpYyB2b2lkIHJlZHJhdyAoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gYWxsKSB7Ci0gIHN1cGVyLnJlZHJhdyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB0cnVlKTsKLX0KLQotLyoqCi0gKiBSZW1vdmVzIHRoZSBpdGVtIGZyb20gdGhlIHJlY2VpdmVyJ3MgbGlzdCBhdCB0aGUgZ2l2ZW4KLSAqIHplcm8tcmVsYXRpdmUgaW5kZXguCi0gKgotICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBmb3IgdGhlIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9SQU5HRSAtIGlmIHRoZSBpbmRleCBpcyBub3QgYmV0d2VlbiAwIGFuZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IG1pbnVzIDEgKGluY2x1c2l2ZSk8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHJlbW92ZSAoaW50IGluZGV4KSB7Ci0gIGNoZWNrV2lkZ2V0KCk7Ci0gIGxpc3QucmVtb3ZlIChpbmRleCk7Ci19Ci0vKioKLSAqIFJlbW92ZXMgdGhlIGl0ZW1zIGZyb20gdGhlIHJlY2VpdmVyJ3MgbGlzdCB3aGljaCBhcmUKLSAqIGJldHdlZW4gdGhlIGdpdmVuIHplcm8tcmVsYXRpdmUgc3RhcnQgYW5kIGVuZCAKLSAqIGluZGljZXMgKGluY2x1c2l2ZSkuCi0gKgotICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UKLSAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZiB0aGUgcmFuZ2UKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9SQU5HRSAtIGlmIGVpdGhlciB0aGUgc3RhcnQgb3IgZW5kIGFyZSBub3QgYmV0d2VlbiAwIGFuZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IG1pbnVzIDEgKGluY2x1c2l2ZSk8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHJlbW92ZSAoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gIGNoZWNrV2lkZ2V0KCk7Ci0gIGxpc3QucmVtb3ZlIChzdGFydCwgZW5kKTsKLX0KLS8qKgotICogU2VhcmNoZXMgdGhlIHJlY2VpdmVyJ3MgbGlzdCBzdGFydGluZyBhdCB0aGUgZmlyc3QgaXRlbQotICogdW50aWwgYW4gaXRlbSBpcyBmb3VuZCB0aGF0IGlzIGVxdWFsIHRvIHRoZSBhcmd1bWVudCwgCi0gKiBhbmQgcmVtb3ZlcyB0aGF0IGl0ZW0gZnJvbSB0aGUgbGlzdC4KLSAqCi0gKiBAcGFyYW0gc3RyaW5nIHRoZSBpdGVtIHRvIHJlbW92ZQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHN0cmluZyBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHN0cmluZyBpcyBub3QgZm91bmQgaW4gdGhlIGxpc3Q8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHJlbW92ZSAoU3RyaW5nIHN0cmluZykgewotICBjaGVja1dpZGdldCgpOwotICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICBsaXN0LnJlbW92ZSAoc3RyaW5nKTsKLX0KLS8qKgotICogUmVtb3ZlcyBhbGwgb2YgdGhlIGl0ZW1zIGZyb20gdGhlIHJlY2VpdmVyJ3MgbGlzdCBhbmQgY2xlYXIgdGhlCi0gKiBjb250ZW50cyBvZiByZWNlaXZlcidzIHRleHQgZmllbGQuCi0gKiA8cD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHJlbW92ZUFsbCAoKSB7Ci0gIGNoZWNrV2lkZ2V0KCk7Ci0gIHRleHQuc2V0VGV4dCAoIiIpOyAvLyROT04tTkxTLTEkCi0gIGxpc3QucmVtb3ZlQWxsICgpOwotfQotLyoqCi0gKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbAotICogYmUgbm90aWZpZWQgd2hlbiB0aGUgcmVjZWl2ZXIncyB0ZXh0IGlzIG1vZGlmaWVkLgotICoKLSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSBNb2RpZnlMaXN0ZW5lcgotICogQHNlZSAjYWRkTW9kaWZ5TGlzdGVuZXIKLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIgKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gIGNoZWNrV2lkZ2V0KCk7Ci0gIGlmIChsaXN0ZW5lciA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAgcmVtb3ZlTGlzdGVuZXIoU1dULk1vZGlmeSwgbGlzdGVuZXIpOyAKLX0KLS8qKgotICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwKLSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHJlY2VpdmVyJ3Mgc2VsZWN0aW9uIGNoYW5nZXMuCi0gKgotICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlIFNlbGVjdGlvbkxpc3RlbmVyCi0gKiBAc2VlICNhZGRTZWxlY3Rpb25MaXN0ZW5lcgotICovCi1wdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lciAoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgaWYgKGxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICByZW1vdmVMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0gIHJlbW92ZUxpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLGxpc3RlbmVyKTsgIAotfQotLyoqCi0gKiBTZWxlY3RzIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiB6ZXJvLXJlbGF0aXZlIGluZGV4IGluIHRoZSByZWNlaXZlcidzIAotICogbGlzdC4gIElmIHRoZSBpdGVtIGF0IHRoZSBpbmRleCB3YXMgYWxyZWFkeSBzZWxlY3RlZCwgaXQgcmVtYWlucwotICogc2VsZWN0ZWQuIEluZGljZXMgdGhhdCBhcmUgb3V0IG9mIHJhbmdlIGFyZSBpZ25vcmVkLgotICoKLSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gc2VsZWN0Ci0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2VsZWN0IChpbnQgaW5kZXgpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgbGlzdC5kZXNlbGVjdEFsbCAoKTsKLSAgICB0ZXh0LnNldFRleHQgKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIHJldHVybjsKLSAgfQotICBpZiAoMCA8PSBpbmRleCAmJiBpbmRleCA8IGxpc3QuZ2V0SXRlbUNvdW50KCkpIHsKLSAgICBpZiAoaW5kZXggIT0gZ2V0U2VsZWN0aW9uSW5kZXgoKSkgewotICAgICAgdGV4dC5zZXRUZXh0IChsaXN0LmdldEl0ZW0gKGluZGV4KSk7Ci0gICAgICB0ZXh0LnNlbGVjdEFsbCAoKTsKLSAgICAgIGxpc3Quc2VsZWN0IChpbmRleCk7Ci0gICAgICBsaXN0LnNob3dTZWxlY3Rpb24gKCk7Ci0gICAgfQotICB9Ci19Ci1wdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kIChDb2xvciBjb2xvcikgewotICBzdXBlci5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLSAgYmFja2dyb3VuZCA9IGNvbG9yOwotICBpZiAodGV4dCAhPSBudWxsKSB0ZXh0LnNldEJhY2tncm91bmQoY29sb3IpOwotICBpZiAobGlzdCAhPSBudWxsKSBsaXN0LnNldEJhY2tncm91bmQoY29sb3IpOwotICBpZiAoYXJyb3cgIT0gbnVsbCkgYXJyb3cuc2V0QmFja2dyb3VuZChjb2xvcik7Ci19Ci0vKioKLSAqIFNldHMgdGhlIGVkaXRhYmxlIHN0YXRlLgotICoKLSAqIEBwYXJhbSBlZGl0YWJsZSB0aGUgbmV3IGVkaXRhYmxlIHN0YXRlCi0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgdm9pZCBzZXRFZGl0YWJsZSAoYm9vbGVhbiBlZGl0YWJsZSkgewotICBjaGVja1dpZGdldCAoKTsKLSAgdGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRFbmFibGVkIChib29sZWFuIGVuYWJsZWQpIHsKLSAgc3VwZXIuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgaWYgKHBvcHVwICE9IG51bGwpIHBvcHVwLnNldFZpc2libGUgKGZhbHNlKTsKLSAgaWYgKHRleHQgIT0gbnVsbCkgdGV4dC5zZXRFbmFibGVkKGVuYWJsZWQpOwotICBpZiAoYXJyb3cgIT0gbnVsbCkgYXJyb3cuc2V0RW5hYmxlZChlbmFibGVkKTsKLX0KLXB1YmxpYyBib29sZWFuIHNldEZvY3VzICgpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgcmV0dXJuIHRleHQuc2V0Rm9jdXMgKCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRGb250IChGb250IGZvbnQpIHsKLSAgc3VwZXIuc2V0Rm9udCAoZm9udCk7Ci0gIHRoaXMuZm9udCA9IGZvbnQ7Ci0gIHRleHQuc2V0Rm9udCAoZm9udCk7Ci0gIGxpc3Quc2V0Rm9udCAoZm9udCk7Ci0gIGludGVybmFsTGF5b3V0ICh0cnVlKTsKLX0KLXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmQgKENvbG9yIGNvbG9yKSB7Ci0gIHN1cGVyLnNldEZvcmVncm91bmQoY29sb3IpOwotICBmb3JlZ3JvdW5kID0gY29sb3I7Ci0gIGlmICh0ZXh0ICE9IG51bGwpIHRleHQuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0gIGlmIChsaXN0ICE9IG51bGwpIGxpc3Quc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0gIGlmIChhcnJvdyAhPSBudWxsKSBhcnJvdy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLX0KLS8qKgotICogU2V0cyB0aGUgdGV4dCBvZiB0aGUgaXRlbSBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0IGF0IHRoZSBnaXZlbgotICogemVyby1yZWxhdGl2ZSBpbmRleCB0byB0aGUgc3RyaW5nIGFyZ3VtZW50LiBUaGlzIGlzIGVxdWl2YWxlbnQKLSAqIHRvIDxjb2RlPnJlbW92ZTwvY29kZT4naW5nIHRoZSBvbGQgaXRlbSBhdCB0aGUgaW5kZXgsIGFuZCB0aGVuCi0gKiA8Y29kZT5hZGQ8L2NvZGU+J2luZyB0aGUgbmV3IGl0ZW0gYXQgdGhhdCBpbmRleC4KLSAqCi0gKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IGZvciB0aGUgaXRlbQotICogQHBhcmFtIHN0cmluZyB0aGUgbmV3IHRleHQgZm9yIHRoZSBpdGVtCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0UgLSBpZiB0aGUgaW5kZXggaXMgbm90IGJldHdlZW4gMCBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCBtaW51cyAxIChpbmNsdXNpdmUpPC9saT4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHN0cmluZyBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRJdGVtIChpbnQgaW5kZXgsIFN0cmluZyBzdHJpbmcpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgbGlzdC5zZXRJdGVtIChpbmRleCwgc3RyaW5nKTsKLX0KLS8qKgotICogU2V0cyB0aGUgcmVjZWl2ZXIncyBsaXN0IHRvIGJlIHRoZSBnaXZlbiBhcnJheSBvZiBpdGVtcy4KLSAqCi0gKiBAcGFyYW0gaXRlbXMgdGhlIGFycmF5IG9mIGl0ZW1zCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgaXRlbXMgYXJyYXkgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIGFuIGl0ZW0gaW4gdGhlIGl0ZW1zIGFycmF5IGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldEl0ZW1zIChTdHJpbmcgW10gaXRlbXMpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIGxpc3Quc2V0SXRlbXMgKGl0ZW1zKTsKLSAgaWYgKCF0ZXh0LmdldEVkaXRhYmxlICgpKSB0ZXh0LnNldFRleHQgKCIiKTsgLy8kTk9OLU5MUy0xJAotfQotLyoqCi0gKiBTZXRzIHRoZSBsYXlvdXQgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlciB0byBiZQotICogdGhlIGFyZ3VtZW50IHdoaWNoIG1heSBiZSBudWxsLgotICogPHA+Ci0gKiBOb3RlOiBObyBMYXlvdXQgY2FuIGJlIHNldCBvbiB0aGlzIENvbnRyb2wgYmVjYXVzZSBpdCBhbHJlYWR5Ci0gKiBtYW5hZ2VzIHRoZSBzaXplIGFuZCBwb3NpdGlvbiBvZiBpdHMgY2hpbGRyZW4uCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIGxheW91dCB0aGUgcmVjZWl2ZXIncyBuZXcgbGF5b3V0IG9yIG51bGwKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRMYXlvdXQgKExheW91dCBsYXlvdXQpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIHJldHVybjsKLX0KLXB1YmxpYyB2b2lkIHNldE1lbnUoTWVudSBtZW51KSB7Ci0gIHRleHQuc2V0TWVudShtZW51KTsKLX0KLS8qKgotICogU2V0cyB0aGUgc2VsZWN0aW9uIGluIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQgdG8gdGhlCi0gKiByYW5nZSBzcGVjaWZpZWQgYnkgdGhlIGFyZ3VtZW50IHdob3NlIHggY29vcmRpbmF0ZSBpcyB0aGUKLSAqIHN0YXJ0IG9mIHRoZSBzZWxlY3Rpb24gYW5kIHdob3NlIHkgY29vcmRpbmF0ZSBpcyB0aGUgZW5kCi0gKiBvZiB0aGUgc2VsZWN0aW9uLiAKLSAqCi0gKiBAcGFyYW0gc2VsZWN0aW9uIGEgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBuZXcgc2VsZWN0aW9uIHN0YXJ0IGFuZCBlbmQKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwb2ludCBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24gKFBvaW50IHNlbGVjdGlvbikgewotICBjaGVja1dpZGdldCgpOwotICBpZiAoc2VsZWN0aW9uID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICB0ZXh0LnNldFNlbGVjdGlvbiAoc2VsZWN0aW9uLngsIHNlbGVjdGlvbi55KTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgcmVjZWl2ZXIncyB0ZXh0IGZpZWxkIHRvIHRoZQotICogZ2l2ZW4gc3RyaW5nLgotICogPHA+Ci0gKiBOb3RlOiBUaGUgdGV4dCBmaWVsZCBpbiBhIDxjb2RlPkNvbWJvPC9jb2RlPiBpcyB0eXBpY2FsbHkKLSAqIG9ubHkgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIGEgc2luZ2xlIGxpbmUgb2YgdGV4dC4gVGh1cywKLSAqIHNldHRpbmcgdGhlIHRleHQgdG8gYSBzdHJpbmcgY29udGFpbmluZyBsaW5lIGJyZWFrcyBvcgotICogb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzIHdpbGwgcHJvYmFibHkgY2F1c2UgaXQgdG8gCi0gKiBkaXNwbGF5IGluY29ycmVjdGx5LgotICogPC9wPgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIG5ldyB0ZXh0Ci0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldFRleHQgKFN0cmluZyBzdHJpbmcpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgaWYgKHN0cmluZyA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAgaW50IGluZGV4ID0gbGlzdC5pbmRleE9mIChzdHJpbmcpOwotICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICBsaXN0LmRlc2VsZWN0QWxsICgpOwotICAgIHRleHQuc2V0VGV4dCAoc3RyaW5nKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgdGV4dC5zZXRUZXh0IChzdHJpbmcpOwotICB0ZXh0LnNlbGVjdEFsbCAoKTsKLSAgbGlzdC5zZXRTZWxlY3Rpb24gKGluZGV4KTsKLSAgbGlzdC5zaG93U2VsZWN0aW9uICgpOwotfQotLyoqCi0gKiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdGhlIHJlY2VpdmVyJ3MKLSAqIHRleHQgZmllbGQgaXMgY2FwYWJsZSBvZiBob2xkaW5nIHRvIGJlIHRoZSBhcmd1bWVudC4KLSAqCi0gKiBAcGFyYW0gbGltaXQgbmV3IHRleHQgbGltaXQKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfQ0FOTk9UX0JFX1pFUk8gLSBpZiB0aGUgbGltaXQgaXMgemVybzwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0VGV4dExpbWl0IChpbnQgbGltaXQpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgdGV4dC5zZXRUZXh0TGltaXQgKGxpbWl0KTsKLX0KLQotcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQgKFN0cmluZyBzdHJpbmcpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgc3VwZXIuc2V0VG9vbFRpcFRleHQoc3RyaW5nKTsKLSAgYXJyb3cuc2V0VG9vbFRpcFRleHQgKHN0cmluZyk7Ci0gIHRleHQuc2V0VG9vbFRpcFRleHQgKHN0cmluZyk7ICAgCi19Ci0KLXB1YmxpYyB2b2lkIHNldFZpc2libGUgKGJvb2xlYW4gdmlzaWJsZSkgewotICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotICBpZiAoIXZpc2libGUpIHBvcHVwLnNldFZpc2libGUoZmFsc2UpOwotfQotLyoqCi0gKiBTZXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCBhcmUgdmlzaWJsZSBpbiB0aGUgZHJvcAotICogZG93biBwb3J0aW9uIG9mIHRoZSByZWNlaXZlcidzIGxpc3QuCi0gKgotICogQHBhcmFtIGNvdW50IHRoZSBuZXcgbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIHZpc2libGUKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyB2b2lkIHNldFZpc2libGVJdGVtQ291bnQgKGludCBjb3VudCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgaWYgKGNvdW50IDwgMCkgcmV0dXJuOwotICB2aXNpYmxlSXRlbUNvdW50ID0gY291bnQ7Ci19Ci1TdHJpbmcgc3RyaXBNbmVtb25pYyAoU3RyaW5nIHN0cmluZykgewotICBpbnQgaW5kZXggPSAwOwotICBpbnQgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCAoKTsKLSAgZG8gewotICAgIHdoaWxlICgoaW5kZXggPCBsZW5ndGgpICYmIChzdHJpbmcuY2hhckF0IChpbmRleCkgIT0gJyYnKSkgaW5kZXgrKzsKLSAgICBpZiAoKytpbmRleCA+PSBsZW5ndGgpIHJldHVybiBzdHJpbmc7Ci0gICAgaWYgKHN0cmluZy5jaGFyQXQgKGluZGV4KSAhPSAnJicpIHsKLSAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4LTEpICsgc3RyaW5nLnN1YnN0cmluZyhpbmRleCwgbGVuZ3RoKTsKLSAgICB9Ci0gICAgaW5kZXgrKzsKLSAgfSB3aGlsZSAoaW5kZXggPCBsZW5ndGgpOwotICByZXR1cm4gc3RyaW5nOwotfQotdm9pZCB0ZXh0RXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgIGNhc2UgU1dULkZvY3VzSW46IHsKLSAgICAgIGhhbmRsZUZvY3VzIChTV1QuRm9jdXNJbik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuS2V5RG93bjogewotICAgICAgaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLSAgICAgICAgZHJvcERvd24gKGZhbHNlKTsKLSAgICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgICAgZS50aW1lID0gZXZlbnQudGltZTsKLSAgICAgICAgZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIGUpOwotICAgICAgfQotICAgICAgLy9BdCB0aGlzIHBvaW50IHRoZSB3aWRnZXQgbWF5IGhhdmUgYmVlbiBkaXNwb3NlZC4KLSAgICAgIC8vIElmIHNvLCBkbyBub3QgY29udGludWUuCi0gICAgICBpZiAoaXNEaXNwb3NlZCAoKSkgYnJlYWs7Ci0gICAgICAKLSAgICAgIGlmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19VUCB8fCBldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19ET1dOKSB7Ci0gICAgICAgIGV2ZW50LmRvaXQgPSBmYWxzZTsKLSAgICAgICAgaWYgKChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQUxUKSAhPSAwKSB7Ci0gICAgICAgICAgYm9vbGVhbiBkcm9wcGVkID0gaXNEcm9wcGVkICgpOwotICAgICAgICAgIHRleHQuc2VsZWN0QWxsICgpOwotICAgICAgICAgIGlmICghZHJvcHBlZCkgc2V0Rm9jdXMgKCk7Ci0gICAgICAgICAgZHJvcERvd24gKCFkcm9wcGVkKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBvbGRJbmRleCA9IGdldFNlbGVjdGlvbkluZGV4ICgpOwotICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfVVApIHsKLSAgICAgICAgICBzZWxlY3QgKE1hdGgubWF4IChvbGRJbmRleCAtIDEsIDApKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzZWxlY3QgKE1hdGgubWluIChvbGRJbmRleCArIDEsIGdldEl0ZW1Db3VudCAoKSAtIDEpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2xkSW5kZXggIT0gZ2V0U2VsZWN0aW9uSW5kZXggKCkpIHsKLSAgICAgICAgICBFdmVudCBlID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgICAgZS50aW1lID0gZXZlbnQudGltZTsKLSAgICAgICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5TZWxlY3Rpb24sIGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vQXQgdGhpcyBwb2ludCB0aGUgd2lkZ2V0IG1heSBoYXZlIGJlZW4gZGlzcG9zZWQuCi0gICAgICAgIC8vIElmIHNvLCBkbyBub3QgY29udGludWUuCi0gICAgICAgIGlmIChpc0Rpc3Bvc2VkICgpKSBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gRnVydGhlciB3b3JrIDogTmVlZCB0byBhZGQgc3VwcG9ydCBmb3IgaW5jcmVtZW50YWwgc2VhcmNoIGluIAotICAgICAgLy8gcG9wIHVwIGxpc3QgYXMgY2hhcmFjdGVycyB0eXBlZCBpbiB0ZXh0IHdpZGdldAotICAgICAgICAgICAgCi0gICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgZS50aW1lID0gZXZlbnQudGltZTsKLSAgICAgIGUuY2hhcmFjdGVyID0gZXZlbnQuY2hhcmFjdGVyOwotICAgICAgZS5rZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKLSAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuS2V5RG93biwgZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuS2V5VXA6IHsKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0gICAgICBlLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotICAgICAgZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5LZXlVcCwgZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuTWVudURldGVjdDogewotICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5NZW51RGV0ZWN0LCBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5Nb2RpZnk6IHsKLSAgICAgIGxpc3QuZGVzZWxlY3RBbGwgKCk7Ci0gICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgZS50aW1lID0gZXZlbnQudGltZTsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULk1vZGlmeSwgZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuTW91c2VEb3duOiB7Ci0gICAgICBpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHJldHVybjsKLSAgICAgIGlmICh0ZXh0LmdldEVkaXRhYmxlICgpKSByZXR1cm47Ci0gICAgICBib29sZWFuIGRyb3BwZWQgPSBpc0Ryb3BwZWQgKCk7Ci0gICAgICB0ZXh0LnNlbGVjdEFsbCAoKTsKLSAgICAgIGlmICghZHJvcHBlZCkgc2V0Rm9jdXMgKCk7Ci0gICAgICBkcm9wRG93biAoIWRyb3BwZWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULk1vdXNlVXA6IHsKLSAgICAgIGlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotICAgICAgaWYgKHRleHQuZ2V0RWRpdGFibGUgKCkpIHJldHVybjsKLSAgICAgIHRleHQuc2VsZWN0QWxsICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULlRyYXZlcnNlOiB7ICAgIAotICAgICAgc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLSAgICAgICAgY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9BUlJPV19QUkVWSU9VUzoKLSAgICAgICAgY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVDoKLSAgICAgICAgICAvLyBUaGUgZW50ZXIgY2F1c2VzIGRlZmF1bHQgc2VsZWN0aW9uIGFuZAotICAgICAgICAgIC8vIHRoZSBhcnJvdyBrZXlzIGFyZSB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGxpc3QgY29udGVudHMgc28KLSAgICAgICAgICAvLyBkbyBub3QgdXNlIHRoZW0gZm9yIHRyYXZlcnNhbC4KLSAgICAgICAgICBldmVudC5kb2l0ID0gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgZS5kZXRhaWwgPSBldmVudC5kZXRhaWw7Ci0gICAgICBlLmRvaXQgPSBldmVudC5kb2l0OwotICAgICAgZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0gICAgICBlLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuVHJhdmVyc2UsIGUpOwotICAgICAgZXZlbnQuZG9pdCA9IGUuZG9pdDsKLSAgICAgIGV2ZW50LmRldGFpbCA9IGUuZGV0YWlsOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vSUFubm90YXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0lBbm5vdGF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2ZDQzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vSUFubm90YXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbjsKLQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvblByb3ZpZGVyCi17Ci0gIFN0cmluZyBnZXROYW1lQW5ub3RhdGlvblN0cmluZygpOwotICBTdHJpbmcgZ2V0TmFtZUFubm90YXRpb25Ub29sVGlwU3RyaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vSUtleWJvYXJkRHJhZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0lLZXlib2FyZERyYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwNjkyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vSUtleWJvYXJkRHJhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLQotcHVibGljIGludGVyZmFjZSBJS2V5Ym9hcmREcmFnIHsKLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1LZXlib2FyZERyYWcgKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgaW50IGRpcmVjdGlvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JbWFnZU92ZXJsYXlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vSW1hZ2VPdmVybGF5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjJhNjc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JbWFnZU92ZXJsYXlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBJbWFnZU92ZXJsYXlEZXNjcmlwdG9yIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yCi17Ci0gIHByb3RlY3RlZCBJbWFnZSBiYXNlSW1hZ2U7Ci0gIHByb3RlY3RlZCBJbWFnZSBleHRlbnNpb25PdmVybGF5LCBkaXNhYmxlZEV4dGVuc2lvbk92ZXJsYXk7Ci0gIHByb3RlY3RlZCBQb2ludCBpbWFnZVNpemU7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHk7Ci0gIAotICBwdWJsaWMgSW1hZ2VPdmVybGF5RGVzY3JpcHRvcihJbWFnZSBiYXNlSW1hZ2UsIGJvb2xlYW4gaXNSZWFkT25seSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5iYXNlSW1hZ2UgPSBiYXNlSW1hZ2U7Ci0gICAgdGhpcy5pc1JlYWRPbmx5ID0gaXNSZWFkT25seTsKLSAgICBpbWFnZVNpemUgPSBuZXcgUG9pbnQoYmFzZUltYWdlLmdldEJvdW5kcygpLndpZHRoLCBiYXNlSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0KTsKLSAgICBleHRlbnNpb25PdmVybGF5ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm92cjE2L2V4dG5zbl9vdnIuZ2lmIik7ICAvLyROT04tTkxTLTEkIAotICAgIGRpc2FibGVkRXh0ZW5zaW9uT3ZlcmxheSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvdnIxNi9leHRuc25kaXNfb3ZyLmdpZiIpOyAgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVJbWFnZSgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkcmF3Q29tcG9zaXRlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICB7Ci0gICAgZHJhd0ltYWdlKGJhc2VJbWFnZS5nZXRJbWFnZURhdGEoKSwgMCwgMCk7Ci0gICAgSW1hZ2VEYXRhIGV4dGVuc2lvbkltYWdlRGF0YTsKLSAgICBpZiAoaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBleHRlbnNpb25JbWFnZURhdGEgPSBkaXNhYmxlZEV4dGVuc2lvbk92ZXJsYXkuZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBleHRlbnNpb25JbWFnZURhdGEgPSBleHRlbnNpb25PdmVybGF5LmdldEltYWdlRGF0YSgpOwotICAgIH0KLSAgICBkcmF3SW1hZ2UgKGV4dGVuc2lvbkltYWdlRGF0YSwgaW1hZ2VTaXplLnggLSBleHRlbnNpb25JbWFnZURhdGEud2lkdGgsIDApOyAgLy8gVG9wIFJpZ2h0IGNvcm5lcgotICB9Ci0KLSAgcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKQotICB7Ci0gICAgcmV0dXJuIGltYWdlU2l6ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvQURUQ29tYm9Cb3hDZWxsRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9BRFRDb21ib0JveENlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3YzdhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9BRFRDb21ib0JveENlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQ7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UeXBlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotCi0vKgotICogVGhpcyB3cmFwcyB0aGUgQ29tYm9Cb3hDZWxsRWRpdG9yLgotICogV2UgbmVlZCB0byBhcHBseSBhbmQgZGVhY3RpdmF0ZSB0aGUgY29tYm8gb24gYSBzaW5nbGUgY2xpY2sgKG5vdCBvbiBhIGRvdWJsZSBjbGljayBsaWtlCi0gKiB0aGUgQ29tYm9Cb3hDZWxsRWRpdG9yKS4KLSAqLwotcHVibGljIGNsYXNzIEFEVENvbWJvQm94Q2VsbEVkaXRvciBleHRlbmRzIENvbWJvQm94Q2VsbEVkaXRvcgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgYWR0RGVmYXVsdFN0eWxlID0gU1dULk5PTkU7Ci0KLSAgLyoqCi0gICAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgY2VsbC4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBjb250aW51ZUFwcGx5OwotICBwcml2YXRlIGJvb2xlYW4gaXNUcmF2ZXJzaW5nID0gZmFsc2U7Ci0gIHByaXZhdGUgT2JqZWN0IHNlbGVjdGVkVmFsdWU7Ci0gIHByaXZhdGUgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci0gIAotICAvLyBUaGlzIHByZXZlbnRzIHRoZSBjZWxsIGVkaXRvciBmcm9tIGJlaW5nIGRlYWN0aXZhdGVkIHdoaWxlIGhhbmRsaW5nIHRoZSBOZXcgb3IgQnJvd3NlIHNlbGVjdGlvbi4KLSAgcHJpdmF0ZSBib29sZWFuIGlzSGFuZGxpbmdTZWxlY3Rpb24gPSBmYWxzZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBjZWxsIGVkaXRvciB3aXRoIGEgY29tYm8gY29udGFpbmluZyB0aGUgZ2l2ZW4gbGlzdCBvZiBjaG9pY2VzCi0gICAqIGFuZCBwYXJlbnRlZCB1bmRlciB0aGUgZ2l2ZW4gY29udHJvbC4gVGhlIGNlbGwgZWRpdG9yIHZhbHVlIGlzIHRoZQotICAgKiB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtLiBJbml0aWFsbHksIHRoZSBjZWxsIGVkaXRvciBoYXMgbm8KLSAgICogY2VsbCB2YWxpZGF0b3IgYW5kIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IGlzIHNlbGVjdGVkLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudAotICAgKiAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICogQHBhcmFtIGl0ZW1zCi0gICAqICAgICAgICAgIHRoZSBsaXN0IG9mIHN0cmluZ3MgZm9yIHRoZSBjb21ibyBib3gKLSAgICovCi0gIHB1YmxpYyBBRFRDb21ib0JveENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gaXRlbXMsIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyKQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBpdGVtcywgYWR0RGVmYXVsdFN0eWxlIHwgU1dULlJFQURfT05MWSk7Ci0gICAgc2V0SXRlbXMoaXRlbXMpOwotICAgIGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyID0gZWRpdE1hbmFnZXI7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVtb3ZlTGlzdGVuZXJzKENDb21ibyBjb21ib0JveCwgaW50IGV2ZW50KQotICB7Ci0gICAgTGlzdGVuZXIgW10gbGlzdGVuZXJzID0gY29tYm9Cb3guZ2V0TGlzdGVuZXJzKGV2ZW50KTsKLSAgICBpbnQgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIExpc3RlbmVyIGwgPSBsaXN0ZW5lcnNbaV07Ci0gICAgICBpZiAobCBpbnN0YW5jZW9mIFR5cGVkTGlzdGVuZXIpCi0gICAgICB7Ci0gICAgICAgIFR5cGVkTGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IChUeXBlZExpc3RlbmVyKWw7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSB0eXBlZExpc3RlbmVyLmdldEV2ZW50TGlzdGVuZXIoKS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXJlIGFyZSBvdGhlciB0eXBlZCBsaXN0ZW5lcnMgYWRkZWQgdG8gdGhlIENDb21iby4KLSAgICAgICAgLy8gQ3VycmVudGx5IHRoZXJlIGFyZSBub25lLCBidXQgYXMgYW4gZXh0cmEgY2hlY2ssIEkgd2FudCB0byBlbnN1cmUgCi0gICAgICAgIC8vIEknbSByZW1vdmluZyB0aGUgb25lcyBhZGRlZCBmcm9tIHRoZSBpbmhlcml0ZWQgY2xhc3MuCi0gICAgICAgIC8vIEkndmUgdGVzdGVkIHRoaXMgYW5kIEkga25vdyBpdCByZW1vdmVzIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIC8vIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yJDIKLSAgICAgICAgLy8gb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3IkNAotICAgICAgICAvLyB3aGljaCBhcmUgaW5kZWVkIHRoZSBvbmVzIEknbSBjdXN0b21pemluZwotICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmNvbnRhaW5zKCJvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvciIpKQotICAgICAgICB7Ci0gICAgICAgICAgY29tYm9Cb3gucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBDZWxsRWRpdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ0NvbWJvIGNvbWJvQm94ID0gKENDb21ibylzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0KLSAgICBjb21ib0JveC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgLy8gTmVlZCB0byByZW1vdmUgdGhlIGxpc3RlbmVycyBhZGRlZCBmcm9tIENvbWJvQm94Q2VsbEVkaXRvcgotICAgIHJlbW92ZUxpc3RlbmVycyhjb21ib0JveCwgU1dULlNlbGVjdGlvbik7Ci0gICAgcmVtb3ZlTGlzdGVuZXJzKGNvbWJvQm94LCBTV1QuRGVmYXVsdFNlbGVjdGlvbik7Ci0gICAgcmVtb3ZlTGlzdGVuZXJzKGNvbWJvQm94LCBTV1QuRm9jdXNJbik7Ci0gICAgcmVtb3ZlTGlzdGVuZXJzKGNvbWJvQm94LCBTV1QuRm9jdXNPdXQpOwotICAgIAotICAgIC8vIE5vdyBhZGQgb3VyIGN1c3RvbSBsaXN0ZW5lcnMKLSAgICBjb21ib0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICAvLyBXYW50IHRoZSBzYW1lIGJlaGF2aW91ciBzaW5jZSBoaXR0aW5nIHJldHVybiBvbiBCcm93c2Ugb3IgTmV3IHNob3VsZCBsYXVuY2ggdGhlIGRpYWxvZ3MsCi0gICAgICAgIC8vIGFuZCBub3QgaW1tZWRpYXRlbHkgYXBwbHkgdGhlIHZhbHVlCi0vLyAgICAgIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCk7Ci0gICAgICAgIHdpZGdldFNlbGVjdGVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIGNvbnRpbnVlQXBwbHkgPSB0cnVlOwotICAgICAgICBDQ29tYm8gY29tYm9Cb3ggPSBnZXRDQ29tYm8oKTsKLSAgICAgICAgaXNIYW5kbGluZ1NlbGVjdGlvbiA9IHRydWU7Ci0gICAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQgc2VsZWN0aW9uID0gY29tYm9Cb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICBpZiAoaXNUcmF2ZXJzaW5nKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzVHJhdmVyc2luZyA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFN0cmluZ1tdIGl0ZW1zID0gZ2V0SXRlbXMoKTsKLSAgICAgICAgICBTdHJpbmcgc3RyaW5nU2VsZWN0aW9uID0gaXRlbXNbc2VsZWN0aW9uXTsKLQotICAgICAgICAgIGlmIChzdHJpbmdTZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9DT01CT19CUk9XU0UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRpbnVlQXBwbHkgPSB0cnVlOwotICAgICAgICAgICAgbmV3VmFsdWUgPSBpbnZva2VEaWFsb2coY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChzdHJpbmdTZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9DT01CT19ORVcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRpbnVlQXBwbHkgPSB0cnVlOwotICAgICAgICAgICAgbmV3VmFsdWUgPSBpbnZva2VEaWFsb2coY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuZ2V0TmV3RGlhbG9nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICBpc0hhbmRsaW5nU2VsZWN0aW9uID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGludWVBcHBseSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGNvbWJvQm94LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNlbGVjdGVkVmFsdWUgPSBjb21ib0JveC5nZXRJdGVtKGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlbGVjdGVkVmFsdWUgPSBuZXdWYWx1ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBhcHBseUVkaXRvclZhbHVlQW5kRGVhY3RpdmF0ZSgpOwotICAgICAgICAgIGZvY3VzTG9zdCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBjb21ib0JveC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKQotICAgICAgewotICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0FSUk9XX05FWFQgfHwgZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTKQotICAgICAgICB7Ci0gICAgICAgICAgaXNUcmF2ZXJzaW5nID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotCi0gICAgY29tYm9Cb3guYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKQotICAgICAgewotICAgICAgICBpZiAoIWlzSGFuZGxpbmdTZWxlY3Rpb24pCi0gICAgICAgICAgQURUQ29tYm9Cb3hDZWxsRWRpdG9yLnRoaXMuZm9jdXNMb3N0KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgcmV0dXJuIGNvbWJvQm94OwotICB9Ci0KLSAgcHJpdmF0ZSBPYmplY3QgaW52b2tlRGlhbG9nKElDb21wb25lbnREaWFsb2cgZGlhbG9nKQotICB7Ci0gICAgT2JqZWN0IG5ld1ZhbHVlID0gbnVsbDsKLQotICAgIGlmIChkaWFsb2cgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvL2RpYWxvZy5zZXRJbml0aWFsQ29tcG9uZW50KHNldE9iamVjdCk7Ci0gICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgIHsKLSAgICAgIG5ld1ZhbHVlID0gZGlhbG9nLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb250aW51ZUFwcGx5ID0gZmFsc2U7Ci0gICAgICBmb2N1c0xvc3QoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3VmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIHNlbGVjdGVkVmFsdWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ0NvbWJvIGdldENDb21ibygpCi0gIHsKLSAgICByZXR1cm4gKENDb21ibylnZXRDb250cm9sKCk7Ci0gIH0KLSAgCi0vLy8vLy8vLy8gQ29tYm9Cb3ggY2VsbCBlZGl0b3IgIAotCi0gIHZvaWQgYXBwbHlFZGl0b3JWYWx1ZUFuZERlYWN0aXZhdGUoKQotICB7Ci0gICAgLy8gbXVzdCBzZXQgdGhlIHNlbGVjdGlvbiBiZWZvcmUgZ2V0dGluZyB2YWx1ZQotICAgIENDb21ibyBjb21ib0JveCA9IGdldENDb21ibygpOwotICAgIFN0cmluZ1tdIGl0ZW1zID0gZ2V0SXRlbXMoKTsKLQotICAgIGludCBzZWxlY3Rpb24gPSBjb21ib0JveC5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIE9iamVjdCBuZXdWYWx1ZSA9IGRvR2V0VmFsdWUoKTsKLSAgICBtYXJrRGlydHkoKTsKLSAgICBib29sZWFuIGlzVmFsaWQgPSBpc0NvcnJlY3QobmV3VmFsdWUpOwotICAgIHNldFZhbHVlVmFsaWQoaXNWYWxpZCk7Ci0KLSAgICBpZiAoIWlzVmFsaWQpCi0gICAgewotICAgICAgLy8gT25seSBmb3JtYXQgaWYgdGhlICdpbmRleCcgaXMgdmFsaWQKLSAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAwICYmIHNlbGVjdGlvbiA+PSAwICYmIHNlbGVjdGlvbiA8IGl0ZW1zLmxlbmd0aCkKLSAgICAgIHsKLSAgICAgICAgLy8gdHJ5IHRvIGluc2VydCB0aGUgY3VycmVudCB2YWx1ZSBpbnRvIHRoZSBlcnJvciBtZXNzYWdlLgotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0RXJyb3JNZXNzYWdlKCksIG5ldyBPYmplY3RbXSB7IGl0ZW1zW3NlbGVjdGlvbl0gfSkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBTaW5jZSB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgaW5kZXgsIGFzc3VtZSB3ZSdyZSB1c2luZyBhbgotICAgICAgICAvLyAnZWRpdCcKLSAgICAgICAgLy8gY29tYm8gc28gZm9ybWF0IHVzaW5nIGl0cyB0ZXh0IHZhbHVlCi0gICAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRFcnJvck1lc3NhZ2UoKSwgbmV3IE9iamVjdFtdIHsgY29tYm9Cb3guZ2V0VGV4dCgpIH0pKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmaXJlQXBwbHlFZGl0b3JWYWx1ZSgpOwotICAgIGRlYWN0aXZhdGUoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvQXR0cmlidXRlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0F0dHJpYnV0ZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNWUyNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvQXR0cmlidXRlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RBdHRyaWJ1dGVSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIKLXsKLSAgcHVibGljIEF0dHJpYnV0ZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyKElGaWVsZCBwYXJhbWV0ZXIsIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBMYWJlbCBsYWJlbCkKLSAgewotICAgIHN1cGVyKHBhcmFtZXRlciwgc291cmNlLCBsYWJlbCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKQotICB7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgcmVzdWx0ID0gbnVsbDsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBpZiAoZWRpdG9yICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQwZjIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0NvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyLy8gaW1wbGVtZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUKLXsKLSAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOwotCi0gIHB1YmxpYyBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgTGFiZWwgbGFiZWwpCi0gIHsKLSAgICBzdXBlcihzb3VyY2UsIENvbWJvQm94Q2VsbEVkaXRvci5jbGFzcywgbmV3IEludGVybmFsQ2VsbEVkaXRvckxvY2F0b3IobGFiZWwpKTsKLSAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpCi0gIHsKLSAgICBTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9IGxhYmVsLmdldFRleHQoKTsKLQotICAgIENDb21ibyBjb21ibyA9IChDQ29tYm8pIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0gICAgY29tYm8uc2V0Rm9udChsYWJlbC5nZXRGb250KCkpOwotICAgIGNvbWJvLnNldEZvcmVncm91bmQobGFiZWwuZ2V0Rm9yZWdyb3VuZENvbG9yKCkpOwotICAgIGNvbWJvLnNldEJhY2tncm91bmQobGFiZWwuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotICAgIGNvbWJvLnNldFZpc2libGVJdGVtQ291bnQoMjApOwotCi0gICAgLyoKLSAgICAgKiBjb21iby5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsgLy8gaG9vayBrZXkgcHJlc3NlZCAtIHNlZSBQUgotICAgICAqIDE0MjAxIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQga2V5RXZlbnQpIHsgaWYgKGtleUV2ZW50LmNoYXJhY3RlciA9PQotICAgICAqICd6JykgeyBnZXRDZWxsRWRpdG9yKCkuYXBwbHlFZGl0b3JWYWx1ZSgpOyB9IH0gfSk7Ci0gICAgICovCi0gICAgSUNlbGxFZGl0b3JMaXN0ZW5lciBjZWxsRWRpdG9yTGlzdGVuZXIgPSBuZXcgSUNlbGxFZGl0b3JMaXN0ZW5lcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgY2FuY2VsRWRpdG9yKCkKLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgYXBwbHlFZGl0b3JWYWx1ZSgpCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIGVkaXRvclZhbHVlQ2hhbmdlZChib29sZWFuIG9sZCwgYm9vbGVhbiBuZXdTdGF0ZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9OwotICAgIGdldENlbGxFZGl0b3IoKS5hZGRMaXN0ZW5lcihjZWxsRWRpdG9yTGlzdGVuZXIpOwotCi0gICAgU3RyaW5nW10gaXRlbSA9IGNvbWJvLmdldEl0ZW1zKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpdGVtW2ldLmVxdWFscyhpbml0aWFsTGFiZWxUZXh0KSkKLSAgICAgIHsKLSAgICAgICAgZ2V0Q2VsbEVkaXRvcigpLnNldFZhbHVlKG5ldyBJbnRlZ2VyKGkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gaGFjay4uLiBmb3Igc29tZSByZWFzb24gdGhlIENvbWJvQm94Q2VsbEVkaXRvciBkb2VzJ3QgZmlyZSBhbgotICAvLyBlZGl0b3JWYWx1ZUNoYW5nZWQgdG8gc2V0IHRoZSBkaXJ0eSBmbGFnCi0gIC8vIHVubGVzcyB3ZSBvdmVyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiB0cnVlLCB0aGUgbWFuYWdlciBpcyBub3Qgbm90aWZpZWQKLSAgLy8gb2YgY2hhbmdlcyBtYWRlIGluIHRoZSBjZWxsIGVkaXRvcgotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RpcnR5KCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIENlbGxFZGl0b3IgY3JlYXRlQ2VsbEVkaXRvck9uKENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gIHsKLSAgICBib29sZWFuIGlzTGFiZWxUZXh0SW5MaXN0ID0gZmFsc2U7Ci0gICAgTGlzdCBsaXN0ID0gY29tcHV0ZUNvbWJvQ29udGVudCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgIGlmIChzdHJpbmcuZXF1YWxzKGxhYmVsLmdldFRleHQoKSkpCi0gICAgICB7Ci0gICAgICAgIGlzTGFiZWxUZXh0SW5MaXN0ID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFpc0xhYmVsVGV4dEluTGlzdCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZChsYWJlbC5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIExpc3Qgc29ydGVkTGlzdCA9IGNvbXB1dGVTb3J0ZWRMaXN0KGxpc3QpOwotICAgIFN0cmluZ1tdIHN0cmluZ0FycmF5ID0gbmV3IFN0cmluZ1tzb3J0ZWRMaXN0LnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdBcnJheS5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBzdHJpbmdBcnJheVtpXSA9IChTdHJpbmcpIHNvcnRlZExpc3QuZ2V0KGkpOwotICAgIH0KLSAgICByZXR1cm4gY3JlYXRlQ2VsbEVkaXRvcihjb21wb3NpdGUsIHN0cmluZ0FycmF5KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIENlbGxFZGl0b3IgY3JlYXRlQ2VsbEVkaXRvcihDb21wb3NpdGUgY29tcG9zaXRlLCBTdHJpbmdbXSBzdHJpbmdBcnJheSkKLSAgewotICAgIHJldHVybiBuZXcgQ29tYm9Cb3hDZWxsRWRpdG9yKGNvbXBvc2l0ZSwgc3RyaW5nQXJyYXkpOyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGNvbXB1dGVTb3J0ZWRMaXN0KExpc3QgbGlzdCkKLSAgewotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IExpc3QgY29tcHV0ZUNvbWJvQ29udGVudCgpOwotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHBlcmZvcm1Nb2RpZnkoT2JqZWN0IHZhbHVlKTsKLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVybmFsQ2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvcgotICB7Ci0gICAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOwotCi0gICAgcHVibGljIEludGVybmFsQ2VsbEVkaXRvckxvY2F0b3IoTGFiZWwgbGFiZWwpCi0gICAgewotICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikKLSAgICB7Ci0gICAgICBDQ29tYm8gY29tYm8gPSAoQ0NvbWJvKSBjZWxsZWRpdG9yLmdldENvbnRyb2woKTsKLQotICAgICAgLy8gVE9ETzogV2UncmUgcHVsbGluZyBhIGZhc3Qgb25lIGhlcmUuLi4uLiBUaGlzIGlzIGFzc3VtaW5nIHdlJ3JlIHVzaW5nIGEKLSAgICAgIC8vIENDb21ibyBhcyBvdXIgd2lkZ2V0Ci0gICAgICAvLyBPdXIgZXZlbnR1YWwgJ0NvbWJvJyBtYXkgbm90IGV2ZW4gdXNlIENDb21ibyBzbyB0aGlzIHdpbGwgbW9zdCBsaWtlbHkKLSAgICAgIC8vIGdldCByZXBsYWNlZC4KLSAgICAgIC8vIGludCBkcm9wRG93bkJ1dHRvblNpemVYID0gMTY7Ci0KLSAgICAgIFJlY3RhbmdsZSBsYWJlbFBhcmVudEJvdW5kcyA9IGxhYmVsLmdldEJvdW5kcygpLmdldENvcHkoKTsKLSAgICAgIGxhYmVsLnRyYW5zbGF0ZVRvQWJzb2x1dGUobGFiZWxQYXJlbnRCb3VuZHMpOwotCi0gICAgICBpbnQgeCA9IGxhYmVsUGFyZW50Qm91bmRzLng7Ci0gICAgICBpbnQgeSA9IGxhYmVsUGFyZW50Qm91bmRzLnk7Ci0gICAgICBpbnQgd2lkdGhLID0gbGFiZWxQYXJlbnRCb3VuZHMud2lkdGg7Ci0gICAgICBpbnQgaGVpZ2h0ID0gbGFiZWxQYXJlbnRCb3VuZHMuaGVpZ2h0OwotICAgICAgY29tYm8uc2V0Qm91bmRzKHgsIHkgKyAxLCB3aWR0aEssIGhlaWdodCAtIDIpOwotICAgIH0KLSAgfQotCi0gIC8vIGltcGxlbWVudHMgRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlCi0gIC8vIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtRWRpdChDZWxsRWRpdG9yIGNlbGxFZGl0b3IpCi0gIHsKLSAgICBBRFRDb21ib0JveENlbGxFZGl0b3IgY29tYm9DZWxsRWRpdG9yID0gKEFEVENvbWJvQm94Q2VsbEVkaXRvcikgY2VsbEVkaXRvcjsKLSAgICBDQ29tYm8gY29tYm8gPSAoQ0NvbWJvKSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotICAgIGludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIE9iamVjdCB2YWx1ZSA9IGNvbWJvLmdldEl0ZW0oaW5kZXgpOwotICAgICAgaWYgKGNvbWJvQ2VsbEVkaXRvci5nZXRTZWxlY3RlZFZhbHVlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdmFsdWUgPSBjb21ib0NlbGxFZGl0b3IuZ2V0U2VsZWN0ZWRWYWx1ZSgpOwotICAgICAgfQotCi0gICAgICBwZXJmb3JtTW9kaWZ5KHZhbHVlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyB0eXBlZFZhbHVlID0gY29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKGNvbWJvLmluZGV4T2YodHlwZWRWYWx1ZSkgIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHBlcmZvcm1Nb2RpZnkodHlwZWRWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjbG9zZU1hdGNoID0gZ2V0Q2xvc2VNYXRjaCh0eXBlZFZhbHVlLCBjb21iby5nZXRJdGVtcygpKTsKLSAgICAgICAgaWYgKGNsb3NlTWF0Y2ggIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHBlcmZvcm1Nb2RpZnkoY2xvc2VNYXRjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYmVlcCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbG9zZU1hdGNoKFN0cmluZyB2YWx1ZSwgU3RyaW5nW10gaXRlbXMpCi0gIHsKLSAgICBpbnQgbWF0Y2hJbmRleCA9IC0xOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgaXRlbSA9IGl0ZW1zW2ldOwotICAgICAgU3RyaW5nIGEgPSBnZXRMb2NhbE5hbWUodmFsdWUpOwotICAgICAgU3RyaW5nIGIgPSBnZXRMb2NhbE5hbWUoaXRlbSk7Ci0gICAgICBpZiAoYS5lcXVhbHNJZ25vcmVDYXNlKGIpKQotICAgICAgewotICAgICAgICBtYXRjaEluZGV4ID0gaTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXRjaEluZGV4ICE9IC0xID8gaXRlbXNbbWF0Y2hJbmRleF0gOiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhbE5hbWUoU3RyaW5nIHN0cmluZykKLSAgewotICAgIGludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICByZXR1cm4gKGluZGV4ICE9IC0xKSA/IHN0cmluZy5zdWJzdHJpbmcoaW5kZXggKyAxKSA6IHN0cmluZzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvRWxlbWVudFJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9FbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxMTdhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9FbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBFbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcgotewotICBwdWJsaWMgRWxlbWVudFJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyKElGaWVsZCBwYXJhbWV0ZXIsIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBMYWJlbCBsYWJlbCkKLSAgewotICAgIHN1cGVyKHBhcmFtZXRlciwgc291cmNlLCBsYWJlbCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpCi0gIHsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZXN1bHQgPSBudWxsOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgIGlmIChlZGl0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9MYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9MYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMzRmOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvTGFiZWxDZWxsRWRpdG9yTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuSU5hbWVkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUZpZWxkRmlndXJlOwotCi1wdWJsaWMgY2xhc3MgTGFiZWxDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yCi17Ci0gIHByb3RlY3RlZCBJTmFtZWRFZGl0UGFydCBuYW1lZEVkaXRQYXJ0OwotICBwcm90ZWN0ZWQgUG9pbnQgY3Vyc29yTG9jYXRpb247Ci0KLSAgcHVibGljIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoSU5hbWVkRWRpdFBhcnQgbmFtZWRFZGl0UGFydCwgUG9pbnQgY3Vyc29yTG9jYXRpb24pCi0gIHsKLSAgICB0aGlzLm5hbWVkRWRpdFBhcnQgPSBuYW1lZEVkaXRQYXJ0OwotICAgIHRoaXMuY3Vyc29yTG9jYXRpb24gPSBjdXJzb3JMb2NhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikKLSAgewotICAgIFRleHQgdGV4dCA9IChUZXh0KSBjZWxsZWRpdG9yLmdldENvbnRyb2woKTsKLQotICAgIExhYmVsIGxhYmVsID0gbmFtZWRFZGl0UGFydC5nZXROYW1lTGFiZWxGaWd1cmUoKTsKLSAgICBpZiAodGV4dC5nZXRCb3VuZHMoKS54IDw9IDApCi0gICAgewotICAgICAgaW50IHdpZHRoVG9SZW1vdmUgPSAwOwotICAgICAgLy8gSEFDSyAKLSAgICAgIGlmIChuYW1lZEVkaXRQYXJ0IGluc3RhbmNlb2YgQmFzZUZpZWxkRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIEJhc2VGaWVsZEVkaXRQYXJ0IGZpZWxkID0gKEJhc2VGaWVsZEVkaXRQYXJ0KW5hbWVkRWRpdFBhcnQ7Ci0gICAgICAgIElGaWVsZEZpZ3VyZSBmaWVsZEZpZ3VyZSA9IGZpZWxkLmdldEZpZWxkRmlndXJlKCk7ICAgICAKLSAgICAgICAgd2lkdGhUb1JlbW92ZSA9IGZpZWxkRmlndXJlLmdldFR5cGVMYWJlbCgpLmdldEJvdW5kcygpLndpZHRoOyAgICAgICAKLSAgICAgICAgLy9UT0RPOiAhISBwZXJoYXBzIHRoZSBJRmllbGRGaWd1cmUgc2hvdWxkIGp1c3QgaGF2ZSBhIG1ldGhvZCB0byBjb21wdXRlIHRoaXM/Ci0gICAgICAgIC8vTGFiZWwgdHlwZUFubm90YXRpb25MYWJlbCA9ICgoRmllbGRGaWd1cmUpIGZpZWxkLmdldEZpZ3VyZSgpKS5nZXRUeXBlQW5ub3RhdGlvbkxhYmVsKCk7Ci0gICAgICAgIC8vTGFiZWwgbmFtZUFubm90YXRpb25MYWJlbCA9ICgoRmllbGRGaWd1cmUpIGZpZWxkLmdldEZpZ3VyZSgpKS5nZXROYW1lQW5ub3RhdGlvbkxhYmVsKCk7Ci0gICAgICAgIC8vd2lkdGhUb1JlbW92ZSA9IHR5cGVMYWJlbC5nZXRCb3VuZHMoKS53aWR0aCArIHR5cGVBbm5vdGF0aW9uTGFiZWwuZ2V0Qm91bmRzKCkud2lkdGggKyBuYW1lQW5ub3RhdGlvbkxhYmVsLmdldEJvdW5kcygpLndpZHRoOwotICAgICAgfQotICAgICAKLSAgICAgIFJlY3RhbmdsZSBib3VuZGluZ1JlY3QgPSBsYWJlbC5nZXRUZXh0Qm91bmRzKCk7Ci0KLSAgICAgIC8vIFJlZHVjZSB0aGUgd2lkdGggYnkgdGhlIGFtb3VudCB3ZSBzaGlmdGVkIGFsb25nIHRoZSB4LWF4aXMKLSAgICAgIGludCBkZWx0YSA9IE1hdGguYWJzKGJvdW5kaW5nUmVjdC54IC0gbGFiZWwuZ2V0UGFyZW50KCkuZ2V0Qm91bmRzKCkueCk7Ci0KLSAgICAgIGxhYmVsLmdldFBhcmVudCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUoYm91bmRpbmdSZWN0KTsKLSAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUgdHJpbSA9IHRleHQuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0gICAgICBib3VuZGluZ1JlY3QudHJhbnNsYXRlKHRyaW0ueCwgdHJpbS55KTsKLSAgICAgIGJvdW5kaW5nUmVjdC5oZWlnaHQgPSBib3VuZGluZ1JlY3QuaGVpZ2h0IC0gdHJpbS55OwotCi0gICAgICBib3VuZGluZ1JlY3Qud2lkdGggPSBsYWJlbC5nZXRQYXJlbnQoKS5nZXRCb3VuZHMoKS53aWR0aCAtIGRlbHRhIC0gd2lkdGhUb1JlbW92ZTsKLSAgICAgIHRleHQuc2V0Qm91bmRzKGJvdW5kaW5nUmVjdC54LCBib3VuZGluZ1JlY3QueSwgYm91bmRpbmdSZWN0LndpZHRoLCBib3VuZGluZ1JlY3QuaGVpZ2h0KTsKLQotICAgICAgLy8gVHJhbnNsYXRlIHBvaW50Ci0gICAgICBpZiAoY3Vyc29yTG9jYXRpb24gIT0gbnVsbCkgewotICAgIAkgIFBvaW50IHRyYW5zbGF0ZWRQb2ludCA9IG5ldyBQb2ludChjdXJzb3JMb2NhdGlvbi54IC0gYm91bmRpbmdSZWN0LngsIGN1cnNvckxvY2F0aW9uLnkgLSBib3VuZGluZ1JlY3QueSk7Ci0KLSAgICAJICAvLyBDYWxjdWxhdGUgdGV4dCBvZmZzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgdHJhbnNsYXRlZCBwb2ludAotICAgIAkgIHRleHQuc2V0U2VsZWN0aW9uKDAsIDApOwotICAgIAkgIGludCB4Q2FyZXQgPSB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS54OwotICAgIAkgIGludCBvZmZzZXQgPSB0ZXh0LmdldENhcmV0UG9zaXRpb24oKTsKLSAgICAJICB3aGlsZSAoeENhcmV0IDwgdHJhbnNsYXRlZFBvaW50LngpCi0gICAgCSAgewotICAgIAkJICB0ZXh0LnNldFNlbGVjdGlvbihvZmZzZXQgKyAxLCBvZmZzZXQgKyAxKTsKLSAgICAJCSAgeENhcmV0ID0gdGV4dC5nZXRDYXJldExvY2F0aW9uKCkueDsKLSAgICAJCSAgaW50IG5ld09mZnNldCA9IHRleHQuZ2V0Q2FyZXRQb3NpdGlvbigpOwotICAgIAkJICBpZiAobmV3T2Zmc2V0ID09IG9mZnNldCkKLSAgICAJCSAgewotICAgIAkJCSAgYnJlYWs7Ci0gICAgCQkgIH0KLSAgICAJCSAgb2Zmc2V0Kys7Ci0gICAgCSAgfQotICAgIAkgIHRleHQuc2V0U2VsZWN0aW9uKG9mZnNldCwgb2Zmc2V0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0xhYmVsRWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0xhYmVsRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg0MzQxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9MYWJlbEVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuSU5hbWVkRWRpdFBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBMYWJlbEVkaXRNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIgewotCi0JcHJpdmF0ZSBJQWN0aW9uQmFycyBhY3Rpb25CYXJzOwotCXByaXZhdGUgQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXIgYWN0aW9uSGFuZGxlcjsKLQlwcml2YXRlIElBY3Rpb24gY29weSwgY3V0LCBwYXN0ZSwgdW5kbywgcmVkbywgZmluZCwgc2VsZWN0QWxsLCBkZWxldGU7Ci0JcHJpdmF0ZSBGb250IHNjYWxlZEZvbnQ7Ci0KLQlwdWJsaWMgTGFiZWxFZGl0TWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IpIHsKLQkJc3VwZXIoc291cmNlLCBudWxsLCBsb2NhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bigpIHsKLQkJaWYgKGFjdGlvbkhhbmRsZXIgIT0gbnVsbCkgewotCQkJYWN0aW9uSGFuZGxlci5kaXNwb3NlKCk7Ci0JCQlhY3Rpb25IYW5kbGVyID0gbnVsbDsKLQkJfQotCQlpZiAoYWN0aW9uQmFycyAhPSBudWxsKSB7Ci0JCQlyZXN0b3JlU2F2ZWRBY3Rpb25zKGFjdGlvbkJhcnMpOwotCQkJYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCQlhY3Rpb25CYXJzID0gbnVsbDsKLQkJfQotCi0JCUZvbnQgZGlzcG9zZUZvbnQgPSBzY2FsZWRGb250OwotCQlzY2FsZWRGb250ID0gbnVsbDsKLQkJc3VwZXIuYnJpbmdEb3duKCk7Ci0JCWlmIChkaXNwb3NlRm9udCAhPSBudWxsKQotCQkJZGlzcG9zZUZvbnQuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzaG93RmVlZGJhY2soKSB7Ci0vLyAgICBzdXBlci5zaG93RmVlZGJhY2soKTsKLQkJZ2V0RWRpdFBhcnQoKS5zaG93U291cmNlRmVlZGJhY2soZ2V0RGlyZWN0RWRpdFJlcXVlc3QoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENlbGxFZGl0b3IgY3JlYXRlQ2VsbEVkaXRvck9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJcmV0dXJuIG5ldyBUZXh0Q2VsbEVkaXRvcihjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuV1JBUCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENlbGxFZGl0b3IoKSB7Ci0JCVRleHQgdGV4dCA9IChUZXh0KWdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCUxhYmVsIGxhYmVsID0gKChJTmFtZWRFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkuZ2V0TmFtZUxhYmVsRmlndXJlKCk7Ci0gICAgCi0JCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQlzY2FsZWRGb250ID0gbGFiZWwuZ2V0Rm9udCgpOwotCQkJCi0JCQlDb2xvciBjb2xvciA9IGxhYmVsLmdldEJhY2tncm91bmRDb2xvcigpOwotCQkJdGV4dC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJCQotCQkJU3RyaW5nIGluaXRpYWxMYWJlbFRleHQgPSBsYWJlbC5nZXRUZXh0KCk7Ci0JCQlnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUoaW5pdGlhbExhYmVsVGV4dCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzY2FsZWRGb250ID0gbGFiZWwuZ2V0UGFyZW50KCkuZ2V0Rm9udCgpOwotCQkJdGV4dC5zZXRCYWNrZ3JvdW5kKGxhYmVsLmdldFBhcmVudCgpLmdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJfQotCQkKLQkJRm9udERhdGEgZGF0YSA9IHNjYWxlZEZvbnQuZ2V0Rm9udERhdGEoKVswXTsKLQkJRGltZW5zaW9uIGZvbnRTaXplID0gbmV3IERpbWVuc2lvbigwLCBkYXRhLmdldEhlaWdodCgpKTsKLQkJbGFiZWwuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShmb250U2l6ZSk7Ci0JCWRhdGEuc2V0SGVpZ2h0KGZvbnRTaXplLmhlaWdodCk7Ci0JCXNjYWxlZEZvbnQgPSBuZXcgRm9udChudWxsLCBkYXRhKTsKLQkJCi0JCXRleHQuc2V0Rm9udChzY2FsZWRGb250KTsKLS8vCQl0ZXh0LnNlbGVjdEFsbCgpOwotCi0JCS8vIEhvb2sgdGhlIGNlbGwgZWRpdG9yJ3MgY29weS9wYXN0ZSBhY3Rpb25zIHRvIHRoZSBhY3Rpb25CYXJzIHNvIHRoYXQgdGhleSBjYW4KLQkJLy8gYmUgaW52b2tlZCB2aWEga2V5Ym9hcmQgc2hvcnRjdXRzLgotCQlhY3Rpb25CYXJzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkKLQkJCQkuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJc2F2ZUN1cnJlbnRBY3Rpb25zKGFjdGlvbkJhcnMpOwotCQlhY3Rpb25IYW5kbGVyID0gbmV3IENlbGxFZGl0b3JBY3Rpb25IYW5kbGVyKGFjdGlvbkJhcnMpOwotCQlhY3Rpb25IYW5kbGVyLmFkZENlbGxFZGl0b3IoZ2V0Q2VsbEVkaXRvcigpKTsKLQkJYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVTYXZlZEFjdGlvbnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycyl7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwgY29weSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksIHBhc3RlKTsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjUwOQotCQkvLyBEZWxldGUgYWN0aW9uIChrZXkpIGRvZXNuJ3QgYWx3YXlzIHdvcmsuICBUaGUgc2F2ZWQgYWN0aW9uIGNvdWxkIGJlIHRoZSAKLQkJLy8gQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXIncyBEZWxldGVBY3Rpb25IYW5kbGVyLi4uZHVlIHRvIHRpbWluZyBpc3N1ZXMuCi0JCS8vIFdlJ2xsIG9ubHkgcmVzdG9yZSB0aGUgZGVsZXRlIGFjdGlvbiBpZiBpdCBpcyBpbmRlZWQgdGhlIG9uZSBmb3IgdGhlIERlc2lnbiB2aWV3LgotCQkvLyBXZSBzaG91bGQgdXBkYXRlIHRoZSBvdGhlciBhY3Rpb25zIHRvbywgYnV0IGN1cnJlbnRseSwgbm9uZSBhcmUgYXBwbGljYWJsZS4KLQkJaWYgKGRlbGV0ZSBpbnN0YW5jZW9mIEJhc2VTZWxlY3Rpb25BY3Rpb24pCi0JCXsKLSAgICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLCBkZWxldGUpOwotCQl9Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSwgc2VsZWN0QWxsKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksIGN1dCk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSwgZmluZCk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwgdW5kbyk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSwgcmVkbyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVDdXJyZW50QWN0aW9ucyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWNvcHkgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpOwotCQlwYXN0ZSA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCkpOwotICAgIElBY3Rpb24gY3VycmVudERlbGV0ZUFjdGlvbiA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpKTsKLSAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUyNTA5Ci0gICAgLy8gRGVsZXRlIGFjdGlvbiAoa2V5KSBkb2Vzbid0IGFsd2F5cyB3b3JrLiAgVGhlIHNhdmVkIGFjdGlvbiBjb3VsZCBiZSB0aGUgCi0gICAgLy8gQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXIncyBEZWxldGVBY3Rpb25IYW5kbGVyLi4uZHVlIHRvIHRpbWluZyBpc3N1ZXMuCi0gICAgLy8gV2UnbGwgb25seSByZXN0b3JlIHRoZSBkZWxldGUgYWN0aW9uIGlmIGl0IGlzIGluZGVlZCB0aGUgb25lIGZvciB0aGUgRGVzaWduIHZpZXcuCi0gICAgLy8gV2Ugc2hvdWxkIHVwZGF0ZSB0aGUgb3RoZXIgYWN0aW9ucyB0b28sIGJ1dCBjdXJyZW50bHksIG5vbmUgYXJlIGFwcGxpY2FibGUuCi0gICAgaWYgKGN1cnJlbnREZWxldGVBY3Rpb24gaW5zdGFuY2VvZiBCYXNlU2VsZWN0aW9uQWN0aW9uKQotICAgIHsKLSAgICAgIGRlbGV0ZSA9IGN1cnJlbnREZWxldGVBY3Rpb247Ci0gICAgfQotCQlzZWxlY3RBbGwgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmdldElkKCkpOwotCQljdXQgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSk7Ci0JCWZpbmQgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5GSU5ELmdldElkKCkpOwotCQl1bmRvID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpKTsKLQkJcmVkbyA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L1JlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZWQ5MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIKLXsKLSAgcHJvdGVjdGVkIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQ7Ci0gIHByb3RlY3RlZCBJRmllbGQgc2V0T2JqZWN0OwotCi0gIHB1YmxpYyBSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcihJRmllbGQgcGFyYW1ldGVyLCBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgTGFiZWwgbGFiZWwpCi0gIHsKLSAgICBzdXBlcihzb3VyY2UsIGxhYmVsKTsKLSAgICBlZGl0UGFydCA9IHNvdXJjZTsKLSAgICBzZXRPYmplY3QgPSBwYXJhbWV0ZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yT24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkKLSAgewotICAgIHJldHVybiBzdXBlci5jcmVhdGVDZWxsRWRpdG9yT24oY29tcG9zaXRlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGNvbXB1dGVDb21ib0NvbnRlbnQoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKTsKLSAgICBpZiAoZWRpdE1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAgbGlzdC5hZGQoTWVzc2FnZXMuX1VJX0NPTUJPX0JST1dTRSk7Ci0gICAgICAgbGlzdC5hZGQoTWVzc2FnZXMuX1VJX0NPTUJPX05FVyk7Ci0gICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHF1aWNrUGlja3MgPSBlZGl0TWFuYWdlci5nZXRRdWlja1BpY2tzKCk7Ci0gICAgICAgaWYgKHF1aWNrUGlja3MgIT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBxdWlja1BpY2tzLmxlbmd0aDsgaSsrKQotICAgICAgICAgewotICAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBxdWlja1BpY2tzW2ldOwotICAgICAgICAgICBsaXN0LmFkZChjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICB9ICAKLSAgICAgICB9Ci0gICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGhpc3RvcnkgPSBlZGl0TWFuYWdlci5nZXRIaXN0b3J5KCk7Ci0gICAgICAgaWYgKGhpc3RvcnkgIT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBoaXN0b3J5Lmxlbmd0aDsgaSsrKQotICAgICAgICAgewotICAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBoaXN0b3J5W2ldOwotICAgICAgICAgICBsaXN0LmFkZChjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICB9ICAKLSAgICAgICB9Ci0gICAgfSAKLSAgICByZXR1cm4gbGlzdDsgCi0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBnZXRDb21wb25lbnRTcGVjaWZpY2F0aW9uRm9yVmFsdWUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpOwotICAgIGlmIChlZGl0TWFuYWdlciAhPSBudWxsKQotICAgIHsgIAotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHF1aWNrUGlja3MgPSBlZGl0TWFuYWdlci5nZXRRdWlja1BpY2tzKCk7Ci0gICAgICBpZiAocXVpY2tQaWNrcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBxdWlja1BpY2tzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLSAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBoaXN0b3J5ID0gZWRpdE1hbmFnZXIuZ2V0SGlzdG9yeSgpOwotICAgICAgaWYgKGhpc3RvcnkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgaGlzdG9yeS5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IGhpc3RvcnlbaV07Ci0gICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSkpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcGVyZm9ybU1vZGlmeShPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBlZGl0TWFuYWdlciA9IGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCk7Ci0gICAgaWYgKGVkaXRNYW5hZ2VyID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICAvLyBvdXIgY3J1ZGUgY29tYm8gYm94IGNhbiBvbmx5IHdvcmsgd2l0aCAnU3RyaW5nJyBvYmplY3RzCi0gICAgLy8gaWYgd2UgZ2V0IGEgU3RyaW5nIGJhY2sgd2UgbmVlZCB0byBkbyBzb21lIGNsZXZlciBtYXBwaW5nIHRvIGdldCB0aGUgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiAKLSAgICAvLyAgICAKLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgewotICAgICAgdmFsdWUgPSBnZXRDb21wb25lbnRTcGVjaWZpY2F0aW9uRm9yVmFsdWUoKFN0cmluZyl2YWx1ZSk7ICAgICAKLSAgICB9ICAKLSAgICAvLyB3ZSBhc3N1bWUgdGhlIHNlbGVjdGVkIHZhbHVlIGlzIGFsd2F5cyBvZiB0aGUgZm9ybSBvZiBhIENvbXBvbmVudFNwZWNpZmljYXRpb24KLSAgICAvLyAKLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uKSAgICAgIAotICAgIHsKLSAgICAgIC8vIHdlIG5lZWQgdG8gcGVyZm9ybSBhbiBhc3luY0V4ZWMgaGVyZSBzaW5jZSB0aGUgJ2hvc3QnIGVkaXRwYXJ0IG1heSBiZQotICAgICAgLy8gcmVtb3ZlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHBlcmZvcm1pbmcgdGhlIGFjdGlvbiAgICAgICAgICAgCi0gICAgICBEZWxheWVkU2V0UmVmZXJlbmNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgRGVsYXllZFNldFJlZmVyZW5jZVJ1bm5hYmxlKGVkaXRNYW5hZ2VyLCBzZXRPYmplY3QsIChDb21wb25lbnRTcGVjaWZpY2F0aW9uKXZhbHVlKTsKLSAgICAgIC8vcnVubmFibGUucnVuKCk7Ci0gICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGNvbXB1dGVTb3J0ZWRMaXN0KExpc3QgbGlzdCkKLSAgewotICAgIC8vIHJldHVybiBUeXBlc0hlbHBlci5zb3J0TGlzdChsaXN0KTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIENlbGxFZGl0b3IgY3JlYXRlQ2VsbEVkaXRvcihDb21wb3NpdGUgY29tcG9zaXRlLCBTdHJpbmdbXSBzdHJpbmdBcnJheSkKLSAgewotICAgIEFEVENvbWJvQm94Q2VsbEVkaXRvciBjZWxsRWRpdG9yID0gbmV3IEFEVENvbWJvQm94Q2VsbEVkaXRvcihjb21wb3NpdGUsIHN0cmluZ0FycmF5LCBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpKTsKLSAgICAvLygoQURUQ29tYm9Cb3hDZWxsRWRpdG9yKSBjZWxsRWRpdG9yKS5zZXRPYmplY3RUb01vZGlmeShzZXRPYmplY3QpOwotICAgIHJldHVybiBjZWxsRWRpdG9yOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCk7Ci0gIAotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkKLSAgewotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICByZXR1cm4gZWRpdG9yUGFydDsKLSAgfSAgICAKLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBEZWxheWVkU2V0UmVmZXJlbmNlUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZQotICB7Ci0gICAgcHJvdGVjdGVkIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotICAgIHByb3RlY3RlZCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIG5ld1ZhbHVlOwotICAgIHByb3RlY3RlZCBJRmllbGQgZmllbGQ7Ci0KLSAgICBwdWJsaWMgRGVsYXllZFNldFJlZmVyZW5jZVJ1bm5hYmxlKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLAotICAgICAgICBJRmllbGQgc2V0T2JqZWN0LCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNlbGVjdGVkVmFsdWUpCi0gICAgewotICAgICAgdGhpcy5jb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciA9IGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotICAgICAgbmV3VmFsdWUgPSBzZWxlY3RlZFZhbHVlOwotICAgICAgZmllbGQgPSBzZXRPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoZmllbGQsIG5ld1ZhbHVlKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9UeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlYmFlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9UeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFR5cGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIFJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyIC8vQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlcgotewotICBwdWJsaWMgVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyKElGaWVsZCBwYXJhbWV0ZXIsIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBMYWJlbCBsYWJlbCkKLSAgewotICAgIHN1cGVyKHBhcmFtZXRlciwgc291cmNlLCBsYWJlbCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKQotICB7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgcmVzdWx0ID0gbnVsbDsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBpZiAoZWRpdG9yICE9IG51bGwpCi0gICAgewotICAgICAgICByZXN1bHQgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMikKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMiBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMilyZXN1bHQ7Ci0gICAgICAgICAgbWFuYWdlci5zZXRSZWZlcmVuY2VyKHNldE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0FEVEVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9BRFRFZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0MjYwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0FEVEVkaXRQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkFEVEZsb2F0aW5nVG9vbGJhci5BRFRGbG9hdGluZ1Rvb2xiYXJNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFic3RyYWN0TW9kZWxDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQ29tcGFydG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Gb2N1c1R5cGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Sb290SG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JU3RydWN0dXJlOwotCi1wdWJsaWMgY2xhc3MgQURURWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5Ci17Ci0gIHB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBFZGl0UGFydCBjaGlsZCA9IGRvQ3JlYXRlRWRpdFBhcnQoY29udGV4dCwgbW9kZWwpOwotICAgIGNoZWNrQ2hpbGQoY2hpbGQsIG1vZGVsKTsKLSAgICByZXR1cm4gY2hpbGQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBFZGl0UGFydCBkb0NyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkKLSAgewotICAgIEVkaXRQYXJ0IGNoaWxkID0gbnVsbDsKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBDb21wYXJ0bWVudCkKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBDb21wYXJ0bWVudEVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgUm9vdEhvbGRlcikKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBSb290SG9sZGVyRWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBBRFRGbG9hdGluZ1Rvb2xiYXJNb2RlbCkKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydCgoKEFEVEZsb2F0aW5nVG9vbGJhck1vZGVsKW1vZGVsKS5nZXRNb2RlbCgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbikKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBDb2x1bW5FZGl0UGFydCgpOwotICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgRm9jdXNUeXBlQ29sdW1uKQotICAgICAgewotICAgICAgICBDb2x1bW5FZGl0UGFydCBjb2x1bW5FZGl0UGFydCA9IChDb2x1bW5FZGl0UGFydCljaGlsZDsKLSAgICAgICAgY29sdW1uRWRpdFBhcnQuc2V0U3BhY2luZyg2MCk7Ci0gICAgICAgIGNvbHVtbkVkaXRQYXJ0LnNldE1pbm9yQWxpZ25tZW50KFRvb2xiYXJMYXlvdXQuQUxJR05fQ0VOVEVSKTsKLSAgICAgIH0gIAotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElDb21wbGV4VHlwZSkKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBDb21wbGV4VHlwZUVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSVN0cnVjdHVyZSkKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBTdHJ1Y3R1cmVFZGl0UGFydCgpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUZpZWxkKQotICAgIHsKLSAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQ29tcGFydG1lbnRFZGl0UGFydCkKLSAgICAgIHsgIAotICAgICAgICBjaGlsZCA9IG5ldyBGaWVsZEVkaXRQYXJ0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNoaWxkID0gbmV3IFRvcExldmVsRmllbGRFZGl0UGFydCgpOwotICAgICAgfSAgCi0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSU1vZGVsKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IFJvb3RDb250ZW50RWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNoaWxkOyAgIAotICB9Ci0KLSAgLyoqCi0gICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGFuZCBub3QgY2hlY2sgZm9yIG51bGwKLSAgICogCi0gICAqIEBwYXJhbSBjaGlsZAotICAgKiBAcGFyYW0gbW9kZWwKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNoZWNrQ2hpbGQoRWRpdFBhcnQgY2hpbGQsIE9iamVjdCBtb2RlbCkKLSAgewotICAgIGlmIChjaGlsZCA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIFRocmVhZC5kdW1wU3RhY2soKTsKLSAgICB9Ci0gICAgQXNzZXJ0LmlzTm90TnVsbChjaGlsZCk7Ci0gICAgY2hpbGQuc2V0TW9kZWwobW9kZWwpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0FEVEZsb2F0aW5nVG9vbGJhckVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0FEVEZsb2F0aW5nVG9vbGJhckVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YjhiZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9BRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlTW90aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkNlbnRlcmVkSWNvbkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBwcm90ZWN0ZWQgSU1vZGVsIG1vZGVsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RyaWxsZWREb3duOwotICBwcm90ZWN0ZWQgQURUVG9vbGJhckJ1dHRvbiBiYWNrVG9TY2hlbWE7Ci0gIAotICBwdWJsaWMgQURURmxvYXRpbmdUb29sYmFyRWRpdFBhcnQoSU1vZGVsIG1vZGVsKQotICB7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIEZpZ3VyZSBmaWd1cmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgVG9vbGJhckxheW91dCB0YiA9IG5ldyBUb29sYmFyTGF5b3V0KHRydWUpOwotICAgIHRiLnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOwotICAgIHRiLnNldFNwYWNpbmcoMyk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIodGIpOwotICAgIAotICAgIGJhY2tUb1NjaGVtYSA9IG5ldyBBRFRUb29sYmFyQnV0dG9uKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJlbGNsMTYvc2NoZW1hdmlld19jby5naWYiKSk7Ci0gICAgYmFja1RvU2NoZW1hLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9IT1ZFUl9CQUNLX1RPX1NDSEVNQSk7Ci0gICAgYmFja1RvU2NoZW1hLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgYmFja1RvU2NoZW1hLnNldEZvY3VzVHJhdmVyc2FibGUodHJ1ZSk7ICAgIAotICAgIGZpZ3VyZS5hZGQoYmFja1RvU2NoZW1hKTsKLSAgICBmaWd1cmUuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoMCwwLDI0LDI0KSk7ICAgIAotICAgIGFkZFRvVG9vbGJhcihmaWd1cmUpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZFRvVG9vbGJhcihJRmlndXJlIGZpZ3VyZSkKLSAgewotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJc0RyaWxsZWREb3duKGJvb2xlYW4gaXNEcmlsbGVkRG93bikKLSAgewotICAgIHRoaXMuaXNEcmlsbGVkRG93biA9IGlzRHJpbGxlZERvd247Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgYmFja1RvU2NoZW1hLmlzRW5hYmxlZCA9IGlzRHJpbGxlZERvd247Ci0gICAgaWYgKGlzRHJpbGxlZERvd24pCi0gICAgewotICAgICAgYmFja1RvU2NoZW1hLmltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oImVsY2wxNi9zY2hlbWF2aWV3X2NvLmdpZiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYmFja1RvU2NoZW1hLmltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oImRsY2wxNi9zY2hlbWF2aWV3X2NvLmdpZiIpOwotICAgIH0KLSAgICBiYWNrVG9TY2hlbWEucmVmcmVzaCgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb0FjdGlvbihNb3VzZUV2ZW50IG1lKQotICB7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IGdldEFjdGlvbkVkaXRvclBhcnQoKTsKLSAKLSAgICBpZiAoYmFja1RvU2NoZW1hLmdldEJvdW5kcygpLmNvbnRhaW5zKG1lLmdldExvY2F0aW9uKCkpKQotICAgIHsKLSAgICAgIFNldElucHV0VG9HcmFwaFZpZXcgYWN0aW9uID0gbmV3IFNldElucHV0VG9HcmFwaFZpZXcoZWRpdG9yUGFydCwgbW9kZWwpOwotICAgICAgYWN0aW9uLnJ1bigpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZG9BY3Rpb24ob3JnLmVjbGlwc2UuZHJhdzJkLktleUV2ZW50IGtlKQotICB7Ci0JICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gZ2V0QWN0aW9uRWRpdG9yUGFydCgpOyAKLQkgIFNldElucHV0VG9HcmFwaFZpZXcgYWN0aW9uID0gbmV3IFNldElucHV0VG9HcmFwaFZpZXcoZWRpdG9yUGFydCwgbW9kZWwpOwotCSAgYWN0aW9uLnJ1bigpOyAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSBJRWRpdG9yUGFydCBnZXRBY3Rpb25FZGl0b3JQYXJ0KCkKLSAgewotCSAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCSAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkgIHJldHVybiBlZGl0b3JQYXJ0OwotICB9Ci0gIAotICAKLSAgcHJvdGVjdGVkIGNsYXNzIEFEVFRvb2xiYXJCdXR0b24gZXh0ZW5kcyBDZW50ZXJlZEljb25GaWd1cmUKLSAgewotICAgIHByb3RlY3RlZCBNb3VzZUxpc3RlbmVyIG1vdXNlTGlzdGVuZXI7Ci0gICAgcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRyYXcyZC5LZXlMaXN0ZW5lciBrZXlMaXN0ZW5lcjsgICAgCi0gICAgcHJvdGVjdGVkIEZvY3VzTGlzdGVuZXIgZm9jdXNMaXN0ZW5lcjsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQ7Ci0gICAgCi0gICAgcHVibGljIEFEVFRvb2xiYXJCdXR0b24oSW1hZ2UgaW1nKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgICB0aGlzLmltYWdlID0gaW1nOwotCi0gICAgICBtb3VzZUxpc3RlbmVyID0gbmV3IE1vdXNlTGlzdGVuZXIuU3R1YigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VFdmVudCBtZSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0VuYWJsZWQpCi0gICAgICAgICAgewotICAgICAgICAJICBhZGRGZWVkYmFjaygpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQob3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlRXZlbnQgbWUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNFbmFibGVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgICAgICAgICBkb0FjdGlvbihtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9OwotICAgICAgYWRkTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLSAgICAgIGFkZE1vdXNlTW90aW9uTGlzdGVuZXIobmV3IE1vdXNlTW90aW9uTGlzdGVuZXIuU3R1YigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKE1vdXNlRXZlbnQgbWUpCi0gICAgICAgIHsKLSAgICAgICAgICByZW1vdmVGZWVkYmFjaygpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgIAotICAgICAga2V5TGlzdGVuZXIgPSBuZXcgS2V5TGlzdGVuZXIuU3R1YigpCi0gICAgICB7Ci0gICAgCSAgcHVibGljIHZvaWQga2V5UHJlc3NlZChvcmcuZWNsaXBzZS5kcmF3MmQuS2V5RXZlbnQga2UpCi0gICAgCSAgewotICAgIAkJICBib29sZWFuIGlzVmFsaWRLZXkgPSAoa2Uua2V5Y29kZSA9PSBLZXlFdmVudC5WS19TUEFDRSk7Ci0gICAgCQkgIGlzVmFsaWRLZXkgPSBpc1ZhbGlkS2V5IHx8IChrZS5jaGFyYWN0ZXIgPT0gU1dULkNSIHx8IGtlLmNoYXJhY3RlciA9PSBTV1QuTEYpOwotICAgIAkJICBpZiAoaXNFbmFibGVkICYmIGlzVmFsaWRLZXkpCi0gICAgCQkgIHsKLSAgICAJCQkgIGFkZEZlZWRiYWNrKCk7Ci0gICAgCQkgIH0KLSAgICAJICB9Ci0KLSAgICAJICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChvcmcuZWNsaXBzZS5kcmF3MmQuS2V5RXZlbnQga2UpCi0gICAgCSAgewotICAgIAkJICBib29sZWFuIGlzVmFsaWRLZXkgPSAoa2Uua2V5Y29kZSA9PSBLZXlFdmVudC5WS19TUEFDRSk7Ci0gICAgCQkgIGlzVmFsaWRLZXkgPSBpc1ZhbGlkS2V5IHx8IChrZS5jaGFyYWN0ZXIgPT0gU1dULkNSIHx8IGtlLmNoYXJhY3RlciA9PSBTV1QuTEYpOwotICAgIAkJICBpZiAoaXNFbmFibGVkICYmIGlzVmFsaWRLZXkpCi0gICAgCQkgIHsKLSAgICAJCQkgIHJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgCQkJICBkb0FjdGlvbihrZSk7Ci0gICAgCQkgIH0gICAgICAgICAgICAKLSAgICAJICB9Ci0gICAgICB9OwotICAgICAgYWRkS2V5TGlzdGVuZXIoa2V5TGlzdGVuZXIpOyAgICAKLSAgICAgIAotICAgICAgZm9jdXNMaXN0ZW5lciA9IG5ldyBGb2N1c0xpc3RlbmVyKCl7Ci0KLQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBmZSkgewotCQkJc2V0TW9kZShDZW50ZXJlZEljb25GaWd1cmUuSE9WRVIpOwotCQkJcmVmcmVzaCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZmUpIHsKLQkJCXNldE1vZGUoQ2VudGVyZWRJY29uRmlndXJlLk5PUk1BTCk7Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQl9OwotCQotCWFkZEZvY3VzTGlzdGVuZXIoZm9jdXNMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICAgIHsKLSAgICAgIHNldE1vZGUoQ2VudGVyZWRJY29uRmlndXJlLlNFTEVDVEVEKTsKLSAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gICAgewotICAgICAgc2V0TW9kZShDZW50ZXJlZEljb25GaWd1cmUuTk9STUFMKTsKLSAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldEJvdW5kcygpCi0gICAgewotICAgICAgUmVjdGFuZ2xlIHIgPSBzdXBlci5nZXRCb3VuZHMoKTsKLSAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUoci54LCByLnksIHJlY3Qud2lkdGggKyA4LCByZWN0LmhlaWdodCArIDgpOwotICAgIH0KLQotICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZShpbnQgaGludCwgaW50IGhpbnQyKQotICAgIHsKLSAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotICAgICAgcmV0dXJuIG5ldyBEaW1lbnNpb24ocmVjdC53aWR0aCArIDgsIHJlY3QuaGVpZ2h0ICsgOCk7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFja1RvU2NoZW1hRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFja1RvU2NoZW1hRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5ZWQ2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0JhY2tUb1NjaGVtYUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklGZWVkYmFja0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFREaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5BRFRNdWx0aVBhZ2VFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5DZW50ZXJlZEljb25GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQmFja1RvU2NoZW1hRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQgaW1wbGVtZW50cyBJRmVlZGJhY2tIYW5kbGVyCi17Ci0gIHByb3RlY3RlZCBNdWx0aVBhZ2VFZGl0b3JQYXJ0IG11bHRpcGFnZUVkaXRvcjsKLSAgcHJvdGVjdGVkIEFEVERpcmVjdEVkaXRQb2xpY3kgYWR0RGlyZWN0RWRpdFBvbGljeSA9IG5ldyBBRFREaXJlY3RFZGl0UG9saWN5KCk7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZDsKLSAgcHJvdGVjdGVkIENlbnRlcmVkSWNvbkZpZ3VyZSBiYWNrVG9TY2hlbWE7Ci0gIHByb3RlY3RlZCBNb3VzZUxpc3RlbmVyIG1vdXNlTGlzdGVuZXI7Ci0KLSAgcHVibGljIEJhY2tUb1NjaGVtYUVkaXRQYXJ0KEFEVE11bHRpUGFnZUVkaXRvciBtdWx0aXBhZ2VFZGl0b3IpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMubXVsdGlwYWdlRWRpdG9yID0gbXVsdGlwYWdlRWRpdG9yOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIGJhY2tUb1NjaGVtYSA9IG5ldyBDZW50ZXJlZEljb25GaWd1cmUoKTsKLSAgICBiYWNrVG9TY2hlbWEuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICBiYWNrVG9TY2hlbWEuaW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigiZWxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmIik7Ci0gICAgLy8gVE9ETywgbG9vayBhdCB3aHkgdGhlIGVkaXRwb2xpY3kgZG9lc24ndCB3b3JrCi0gICAgbW91c2VMaXN0ZW5lciA9IG5ldyBNb3VzZUxpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrZWQob3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlRXZlbnQgbWUpCi0gICAgICB7Ci0KLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKG9yZy5lY2xpcHNlLmRyYXcyZC5Nb3VzZUV2ZW50IG1lKQotICAgICAgewotICAgICAgICBpZiAoaXNFbmFibGVkKQotICAgICAgICB7Ci0gICAgICAgICAgYWRkRmVlZGJhY2soKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBtb3VzZVJlbGVhc2VkKG9yZy5lY2xpcHNlLmRyYXcyZC5Nb3VzZUV2ZW50IG1lKQotICAgICAgewotICAgICAgICBpZiAoaXNFbmFibGVkKQotICAgICAgICB7Ci0gICAgICAgICAgcmVtb3ZlRmVlZGJhY2soKTsKLSAgICAgICAgICBTZXRJbnB1dFRvR3JhcGhWaWV3IGFjdGlvbiA9IG5ldyBTZXRJbnB1dFRvR3JhcGhWaWV3KG11bHRpcGFnZUVkaXRvciwgZ2V0TW9kZWwoKSk7Ci0gICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBiYWNrVG9TY2hlbWEuYWRkTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLSAgICByZXR1cm4gYmFja1RvU2NoZW1hOwotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkKLSAgewotICAgIHRoaXMuaXNFbmFibGVkID0gaXNFbmFibGVkOwotICAgIHJlZnJlc2hWaXN1YWxzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBhZHREaXJlY3RFZGl0UG9saWN5KTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUIHx8IHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX09QRU4pCi0gICAgewotICAgICAgU2V0SW5wdXRUb0dyYXBoVmlldyBhY3Rpb24gPSBuZXcgU2V0SW5wdXRUb0dyYXBoVmlldyhtdWx0aXBhZ2VFZGl0b3IsIGdldE1vZGVsKCkpOwotICAgICAgYWN0aW9uLnJ1bigpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgQ2VudGVyZWRJY29uRmlndXJlIGZpZ3VyZSA9IChDZW50ZXJlZEljb25GaWd1cmUpIGdldEZpZ3VyZSgpOwotICAgIGlmIChpc0VuYWJsZWQpCi0gICAgewotICAgICAgYmFja1RvU2NoZW1hLmltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oImVsY2wxNi9zY2hlbWF2aWV3X2NvLmdpZiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYmFja1RvU2NoZW1hLmltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oImRsY2wxNi9zY2hlbWF2aWV3X2NvLmdpZiIpOwotICAgIH0KLSAgICBmaWd1cmUucmVmcmVzaCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgQ2VudGVyZWRJY29uRmlndXJlIGZpZ3VyZSA9IChDZW50ZXJlZEljb25GaWd1cmUpIGdldEZpZ3VyZSgpOwotICAgIGZpZ3VyZS5zZXRNb2RlKENlbnRlcmVkSWNvbkZpZ3VyZS5TRUxFQ1RFRCk7Ci0gICAgZmlndXJlLnJlZnJlc2goKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotICAgIENlbnRlcmVkSWNvbkZpZ3VyZSBmaWd1cmUgPSAoQ2VudGVyZWRJY29uRmlndXJlKSBnZXRGaWd1cmUoKTsKLSAgICBmaWd1cmUuc2V0TW9kZShDZW50ZXJlZEljb25GaWd1cmUuTk9STUFMKTsKLSAgICBmaWd1cmUucmVmcmVzaCgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotICAgIGJhY2tUb1NjaGVtYS5yZW1vdmVNb3VzZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYXNlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3ZTYzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLlNjYWxhYmxlUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuWm9vbUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuWm9vbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLkZpbGVTdG9yZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUZlZWRiYWNrSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLktleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUZpZ3VyZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkNvbW1vbk11bHRpUGFnZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBpbXBsZW1lbnRzIElBY3Rpb25Qcm92aWRlciwgSUFEVE9iamVjdExpc3RlbmVyLCBJRmVlZGJhY2tIYW5kbGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfQUNUSU9OX0FSUkFZID0ge307Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0ZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzRm9jdXMgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzSGlnaENvbnRyYXN0ID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0SGlnaENvbnRyYXN0KCk7Ci0gIHByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgYWNjZXNzaWJsZVBhcnQ7Ci0gIAotICBwdWJsaWMgSUZpZ3VyZUZhY3RvcnkgZ2V0RmlndXJlRmFjdG9yeSgpCi0gIHsKLSAgICBFZGl0UGFydEZhY3RvcnkgZmFjdG9yeSA9IGdldFZpZXdlcigpLmdldEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgIEFzc2VydC5pc1RydWUoZmFjdG9yeSBpbnN0YW5jZW9mIElGaWd1cmVGYWN0b3J5LCAiRWRpdFBhcnRGYWN0b3J5IG11c3QgYmUgYW4gaW5zdGFuY2VvZiBvZiBJRmlndXJlRmFjdG9yeSIpOyAgICAgLy8kTk9OLU5MUy0xJAotICAgIHJldHVybiAoSUZpZ3VyZUZhY3RvcnkpZmFjdG9yeTsgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElBY3Rpb25Qcm92aWRlcikKLSAgICB7Ci0gICAgICByZXR1cm4gKChJQWN0aW9uUHJvdmlkZXIpbW9kZWwpLmdldEFjdGlvbnMob2JqZWN0KTsKLSAgICB9ICAKLSAgICByZXR1cm4gRU1QVFlfQUNUSU9OX0FSUkFZOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25zVG9MaXN0KExpc3QgbGlzdCwgSUFjdGlvbltdIGFjdGlvbnMpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgbGlzdC5hZGQoYWN0aW9uc1tpXSk7Ci0gICAgfSAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmFjdGl2YXRlKCk7Ci0gICAgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgIHsKLSAgICAgIElBRFRPYmplY3Qgb2JqZWN0ID0gKElBRFRPYmplY3QpbW9kZWw7Ci0gICAgICBvYmplY3QucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGdldFpvb21NYW5hZ2VyKCkgIT0gbnVsbCkKLSAgICAgIGdldFpvb21NYW5hZ2VyKCkuYWRkWm9vbUxpc3RlbmVyKHpvb21MaXN0ZW5lcik7Ci0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgIHsKLSAgICAgIElBRFRPYmplY3Qgb2JqZWN0ID0gKElBRFRPYmplY3QpbW9kZWw7Ci0gICAgICBvYmplY3QudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgIH0gICAKLSAgICAKLSAgICBpZiAoZ2V0Wm9vbU1hbmFnZXIoKSAhPSBudWxsKQotICAgICAgZ2V0Wm9vbU1hbmFnZXIoKS5yZW1vdmVab29tTGlzdGVuZXIoem9vbUxpc3RlbmVyKTsgICAgCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBzdXBlci5kZWFjdGl2YXRlKCk7Ci0gICAgfSAgCi0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIHJlZnJlc2goKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAKLSAgICBib29sZWFuIGRvVXBkYXRlRGVzaWduID0gZG9VcGRhdGVEZXNpZ24oKTsKLSAgICBpZiAoZG9VcGRhdGVEZXNpZ24pCi0gICAgewotICAgICAgc3VwZXIucmVmcmVzaCgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotICAgIGlzU2VsZWN0ZWQgPSB0cnVlOwotICAgIHJlZnJlc2hWaXN1YWxzKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBpc1NlbGVjdGVkID0gZmFsc2U7Ci0gICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotICAKLSAgcHVibGljIFpvb21NYW5hZ2VyIGdldFpvb21NYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiAoKFNjYWxhYmxlUm9vdEVkaXRQYXJ0KWdldFJvb3QoKSkuZ2V0Wm9vbU1hbmFnZXIoKTsKLSAgfQotICAKLSAgcHVibGljIFJlY3RhbmdsZSBnZXRab29tZWRCb3VuZHMoUmVjdGFuZ2xlIHIpCi0gIHsKLSAgICBkb3VibGUgZmFjdG9yID0gZ2V0Wm9vbU1hbmFnZXIoKS5nZXRab29tKCk7Ci0gICAgaW50IHggPSAoaW50KU1hdGgucm91bmQoci54ICogZmFjdG9yKTsKLSAgICBpbnQgeSA9IChpbnQpTWF0aC5yb3VuZChyLnkgKiBmYWN0b3IpOwotICAgIGludCB3aWR0aCA9IChpbnQpTWF0aC5yb3VuZChyLndpZHRoICogZmFjdG9yKTsKLSAgICBpbnQgaGVpZ2h0ID0gKGludClNYXRoLnJvdW5kKHIuaGVpZ2h0ICogZmFjdG9yKTsKLQotICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICB9Ci0gIAotICBwcml2YXRlIFpvb21MaXN0ZW5lciB6b29tTGlzdGVuZXIgPSBuZXcgWm9vbUxpc3RlbmVyKCkKLSAgewotICAgIHB1YmxpYyB2b2lkIHpvb21DaGFuZ2VkKGRvdWJsZSB6b29tKQotICAgIHsKLSAgICAgIGhhbmRsZVpvb21DaGFuZ2VkKCk7Ci0gICAgfQotICB9OwotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVpvb21DaGFuZ2VkKCkKLSAgewotICAgIHJlZnJlc2hWaXN1YWxzKCk7Ci0gIH0KLQotICBwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yUGFydCgpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgaWYgKHdvcmtiZW5jaCAhPSBudWxsKQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAod29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0vLyAgICBBc3NlcnQuaXNOb3ROdWxsKGVkaXRvclBhcnQpOwotICAgIHJldHVybiBlZGl0b3JQYXJ0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5LRVksIG5ldyBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5KCkKLSAgICB7ICAgICAgCi0gICAgICBwdWJsaWMgRWRpdFBhcnQgZ2V0UmVsYXRpdmVFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgaW50IGRpcmVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGRvR2V0UmVsYXRpdmVFZGl0UGFydChlZGl0UGFydCwgZGlyZWN0aW9uKTsgIAotICAgICAgfSAgICAgICAgICAgCi0gICAgfSk7ICAgICAgICAKLSAgfQotICAKLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBkb0dldFJlbGF0aXZlRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQsIGludCBkaXJlY3Rpb24pCi0gIHsgICAKLSAgICByZXR1cm4gbnVsbDsgICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGaWxlUmVhZE9ubHkoKQotICB7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIGlmICh3b3JrYmVuY2ggIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgIGlmIChlZGl0b3IgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgIGlmICghKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCB8fCBlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIEZpbGVTdG9yZUVkaXRvcklucHV0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLy8gRm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTgyODEKLSAgLy8gRG9uJ3Qgd2FudCB0byByZWZyZXNoIHRoZSBkZXNpZ24gd2hlbiBjaGFuZ2VzIGFyZSBtYWRlIGluIHRoZSBzb3VyY2Ugdmlldy4KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZG9VcGRhdGVEZXNpZ24oKQotICB7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIGlmICh3b3JrYmVuY2ggIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICBpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIENvbW1vbk11bHRpUGFnZUVkaXRvcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDb21tb25NdWx0aVBhZ2VFZGl0b3IgZWRpdG9yID0gKENvbW1vbk11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgICAgIEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoR3JhcGhpY2FsVmlld2VyKWVkaXRvci5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcyk7Ci0gICAgICAgICAgICAvLyBOZWVkIHRvIGVuc3VyZSB0aGlzIGlzIHRoZSBzYW1lIGVkaXRvciB3ZSBhcmUgd29ya2luZyB3aXRoIHNpbmNlIHRoZSBhY3RpdmUgZWRpdG9yIG1heSBub3QgYmUgCi0gICAgICAgICAgICAvLyB0aGUgY3VycmVudCwgZWcuIGF0IHN0YXJ0dXAsIHRoZXJlIGNhbiBiZSBhbm90aGVyIFhTRCBFZGl0b3Igb3BlbiBvbiB0aGUgc291cmNlIHBhZ2UsIHNvIHdlIGNvdWxkIGVuZAotICAgICAgICAgICAgLy8gdXAgbm90IHBvcHVsYXRpbmcgdGhlIGRlc2lnbiB2aWV3IGluaXRhbGx5Ci0gICAgICAgICAgICBpZiAoZ2V0Vmlld2VyKCkgPT0gdmlld2VyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBJZiBzb3VyY2UgcGFnZSBpcyBhY3RpdmUsIGRvbid0IHVwZGF0ZSB0aGUgZGVzaWduCi0gICAgICAgICAgICAgIHJldHVybiAhZWRpdG9yLmlzU291cmNlUGFnZUFjdGl2ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRyeSB0byBnZXQgdGhlIGl0YWxpYyBmb250IGZvciB0aGUgY3VycmVudCBmb250Ci0gICAqIEBwYXJhbSBmb250Ci0gICAqIEByZXR1cm4KLSAgICovCi0gIHByb3RlY3RlZCBGb250IGdldEl0YWxpY0ZvbnQoRm9udCBmb250KQotICB7Ci0gICAgaWYgKGZvbnQgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgRm9udERhdGFbXSBmZCA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKLSAgICAgIGlmIChmZC5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICBmZFswXS5zZXRTdHlsZShmZFswXS5nZXRTdHlsZSgpIHwgU1dULklUQUxJQyk7Ci0gICAgICAgIHJldHVybiBuZXcgRm9udChmb250LmdldERldmljZSgpLCBmZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmb250OwotICB9Ci0gIHByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQkKLQkgIGlmIChhY2Nlc3NpYmxlUGFydCA9PW51bGwpCi0JICB7Ci0JCSAgYWNjZXNzaWJsZVBhcnQgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCl7Ci0JCQotCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewkJIAotCQkJCWUucmVzdWx0ID0gZ2V0UmVhZGVyVGV4dCgpOwotCQkJfQotCQl9OwotCSAgfQotCSAgcmV0dXJuIGFjY2Vzc2libGVQYXJ0OwotCX0KLXB1YmxpYyBTdHJpbmcgZ2V0UmVhZGVyVGV4dCgpCi17Ci0JICByZXR1cm4gIiI7Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VGaWVsZEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VGaWVsZEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MDk3ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYXNlRmllbGRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EcmFnVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Mb2NhdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LkNvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQuRWxlbWVudFJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LkxhYmVsQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQuTGFiZWxFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5UeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Gb2N1c1R5cGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFREaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuSUFEVFVwZGF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUZpZWxkRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuQ29ubmVjdGFibGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llcy5HcmFwaE5vZGVEcmFnVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBCYXNlRmllbGRFZGl0UGFydCBleHRlbmRzIEJhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0IGltcGxlbWVudHMgSU5hbWVkRWRpdFBhcnQsIElBdXRvRGlyZWN0RWRpdAotewotICBwcm90ZWN0ZWQgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZTsKLSAgcHJvdGVjdGVkIEFEVERpcmVjdEVkaXRQb2xpY3kgYWR0RGlyZWN0RWRpdFBvbGljeSA9IG5ldyBBRFREaXJlY3RFZGl0UG9saWN5KCk7Ci0gIHByb3RlY3RlZCBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmU7Ci0gIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7ICAgICAgICAgIAotICAgIElGaWVsZEZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmVGYWN0b3J5KCkuY3JlYXRlRmllbGRGaWd1cmUoZ2V0TW9kZWwoKSk7ICAgIAotICAgIGZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmllbGRGaWd1cmUgZ2V0RmllbGRGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIChJRmllbGRGaWd1cmUpZmlndXJlOwotICB9Ci0gCi0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREcmF3Q29ubmVjdGlvbigpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIAotICAgIC8vIEZvciBub3cgd2Ugb25seSB3YW50IHRvIHByb2R1Y2Ugb3V0Ym91bmQgbGluZXMgZnJvbSBhIEZpZWxkIHRvIGEgVHlwZQotICAgIC8vIHdoZW4gdGhlIGZpZWxkIGluIGNvbnRhaW5lZCBpbiB0aGUgJ2ZvY3VzJyBlZGl0IHBhcnQgICAgCi0gICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkKLSAgICB7ICAKLSAgICAgIGlmIChwYXJlbnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIEZvY3VzVHlwZUNvbHVtbikKLSAgICAgIHsgICAgICAgIAotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0gIAotICAgIH0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBFZGl0UGFydCBnZXRUYXJnZXRFZGl0UGFydChJVHlwZSB0eXBlKQotICB7Ci0gICAgQ29sdW1uRWRpdFBhcnQgY29sdW1uRWRpdFBhcnQgPSBudWxsOwotICAgIGZvciAoRWRpdFBhcnQgZWRpdFBhcnQgPSB0aGlzOyBlZGl0UGFydCAhPSBudWxsOyBlZGl0UGFydCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpKQotICAgIHsKLSAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbHVtbkVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBjb2x1bW5FZGl0UGFydCA9IChDb2x1bW5FZGl0UGFydCllZGl0UGFydDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAKLSAgICB9ICAgICAKLSAgICBpZiAoY29sdW1uRWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBnZXQgdGhlIG5leHQgY29sdW1uCi0gICAgICBFZGl0UGFydCBwYXJlbnQgPSBjb2x1bW5FZGl0UGFydC5nZXRQYXJlbnQoKTsKLSAgICAgIExpc3QgY29sdW1ucyA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotICAgICAgaW50IGluZGV4ID0gY29sdW1ucy5pbmRleE9mKGNvbHVtbkVkaXRQYXJ0KTsKLSAgICAgIGlmIChpbmRleCArIDEgPCBjb2x1bW5zLnNpemUoKSkKLSAgICAgIHsgIAotICAgICAgICBFZGl0UGFydCBuZXh0Q29sdW1uID0gKEVkaXRQYXJ0KWNvbHVtbnMuZ2V0KGluZGV4ICsgMSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5leHRDb2x1bW4uZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGNoaWxkLmdldE1vZGVsKCkgPT0gdHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGQ7Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIEVkaXRQYXJ0IGdldFRhcmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0gIHsKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOyAKLSAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKWdldE1vZGVsKCk7Ci0gICAgSVR5cGUgdHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsgICAgICAKLSAgICAgIHJlc3VsdCA9IGdldFRhcmdldEVQKHR5cGUpOyAvL2dldFRhcmdldEVkaXRQYXJ0KHR5cGUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICAvKioKLSAgICogRG8gbm90IG92ZXJyaWRlCi0gICAqIEBwYXJhbSB0eXBlCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHByb3RlY3RlZCBFZGl0UGFydCBnZXRUYXJnZXRFUChJVHlwZSB0eXBlKQotICB7Ci0gICAgcmV0dXJuIGdldFRhcmdldEVkaXRQYXJ0KHR5cGUpOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpCi0gIHsKLSAgICBjb25uZWN0aW9uRmlndXJlID0gbnVsbDsgICAKLSAgICBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJlZmVyZW5jZVR5cGVQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpZ2V0VGFyZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCk7Ci0gICAgaWYgKHJlZmVyZW5jZVR5cGVQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgY29ubmVjdGlvbkZpZ3VyZSA9IG5ldyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbigpOwotCi0gICAgICBpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkgPT0gcmVmZXJlbmNlVHlwZVBhcnQuZ2V0RmlndXJlKCkpCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5MRUZULCAxKSk7IAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldFNvdXJjZUFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKGdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuUklHSFQsIDUpKTsKLSAgICAgIH0KLSAgICAgIGludCB0YXJnZXRBbmNob3JZT2Zmc2V0ID0gODsKLQotICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRUYXJnZXRBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihyZWZlcmVuY2VUeXBlUGFydC5nZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkhFQURFUl9MRUZULCAwLCB0YXJnZXRBbmNob3JZT2Zmc2V0KSk7IAotICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotICAgIH0KLQotICAgIHJldHVybiBjb25uZWN0aW9uRmlndXJlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgYWR0RGlyZWN0RWRpdFBvbGljeSk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3IEFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeSgpKTsKLSAgfQotICAKLSAgcHVibGljIEVkaXRQYXJ0IGRvR2V0UmVsYXRpdmVFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7ICAgICAgICAKLSAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QpCi0gICAgeyAgICAKLSAgICAgIHJlc3VsdCA9IGdldFRhcmdldENvbm5lY3Rpb25FZGl0UGFydCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuV0VTVCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRQYXJlbnQoKS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBTZWN0aW9uRWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBTZWN0aW9uRWRpdFBhcnQgZ3JvdXBzID0gKFNlY3Rpb25FZGl0UGFydCkgY2hpbGQ7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ3JvdXBzLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgZ3JvdXBDaGlsZCA9IGkubmV4dCgpOwotICAgICAgICAgICAgRWRpdFBhcnQgY29ubmVjdGFibGUgPSBnZXRQYXJlbnRDb25uZWN0YWJsZUVkaXRQYXJ0KChFZGl0UGFydClncm91cENoaWxkKTsKLSAgICAgICAgICAgIGlmIChjb25uZWN0YWJsZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBjb25uZWN0YWJsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdGhpczsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHN1cGVyLmRvR2V0UmVsYXRpdmVFZGl0UGFydChlZGl0UGFydCwgZGlyZWN0aW9uKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSAoKEJhc2VFZGl0UGFydClnZXRQYXJlbnQoKSkuZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KGVkaXRQYXJ0LCBkaXJlY3Rpb24pOwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIHJlc3VsdDsgICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIENvbm5lY3RhYmxlRWRpdFBhcnQgZ2V0UGFyZW50Q29ubmVjdGFibGVFZGl0UGFydChFZGl0UGFydCBjb25uZWN0YWJsZSkKLSAgewotICAgIGlmIChjb25uZWN0YWJsZSBpbnN0YW5jZW9mIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpCi0gICAgewotICAgICAgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyIHNwYWNlID0gKFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcikgKChUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KWNvbm5lY3RhYmxlKS5nZXRNb2RlbCgpOwotICAgICAgaWYgKHNwYWNlLmdldEFkYXB0ZXIoKSA9PSB0aGlzLmdldE1vZGVsKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoQ29ubmVjdGFibGVFZGl0UGFydCljb25uZWN0YWJsZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgZm9yIChJdGVyYXRvciBpID0gY29ubmVjdGFibGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCBjaGlsZCA9IGkubmV4dCgpOwotICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29ubmVjdGFibGVFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgQ29ubmVjdGFibGVFZGl0UGFydCByID0gZ2V0UGFyZW50Q29ubmVjdGFibGVFZGl0UGFydCgoRWRpdFBhcnQpY2hpbGQpOwotICAgICAgICBpZiAociAhPSBudWxsKSByZXR1cm4gcjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyIHNwYWNlID0gKFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcikgKChUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KWNoaWxkKS5nZXRNb2RlbCgpOwotICAgICAgICBpZiAoc3BhY2UuZ2V0QWRhcHRlcigpID09IHRoaXMuZ2V0TW9kZWwoKSAmJiBjb25uZWN0YWJsZSBpbnN0YW5jZW9mIENvbm5lY3RhYmxlRWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKENvbm5lY3RhYmxlRWRpdFBhcnQpY29ubmVjdGFibGU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICBJRmllbGRGaWd1cmUgZmlndXJlID0gZ2V0RmllbGRGaWd1cmUoKTsKLSAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKSBnZXRNb2RlbCgpOwotICAgIAotICAgIGZpZ3VyZS5nZXROYW1lTGFiZWwoKS5zZXRUZXh0KGZpZWxkLmdldE5hbWUoKSk7Ci0gICAgZmlndXJlLmdldFR5cGVMYWJlbCgpLnNldFRleHQoZmllbGQuZ2V0VHlwZU5hbWUoKSk7Ci0gICAgZmlndXJlLnJlZnJlc2hWaXN1YWxzKGdldE1vZGVsKCkpOwotCi0gICAgZmlndXJlLnJlY29tcHV0ZUxheW91dCgpOwotCi0gICAgKChHcmFwaGljYWxFZGl0UGFydClnZXRSb290KCkpLmdldEZpZ3VyZSgpLmludmFsaWRhdGVUcmVlKCk7Ci0gIH0KLQotICBwdWJsaWMgRHJhZ1RyYWNrZXIgZ2V0RHJhZ1RyYWNrZXIoUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgcmV0dXJuIG5ldyBHcmFwaE5vZGVEcmFnVHJhY2tlcih0aGlzKTsKLSAgfQotICAKLSAgLyoKLSAgcHVibGljIElBY3Rpb25bXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAvLyB3aGVuIGEgRmllbGRFZGl0UGFydCBpcyBzZWxlY3RlZCBpdCBwcm92aWRlcyBpdCdzIG93biBhY3Rpb25zCi0gICAgLy8gYXMgd2VsbCBhcyB0aG9zZSBvZiBpdCdzIHBhcmVudCAndHlwZScgZWRpdCBwYXJ0Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEVkaXRQYXJ0IGNvbXBhcnRtZW50ID0gZ2V0UGFyZW50KCk7Ci0gICAgaWYgKGNvbXBhcnRtZW50ICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBFZGl0UGFydCB0eXBlID0gY29tcGFydG1lbnQuZ2V0UGFyZW50KCk7Ci0gICAgICBpZiAodHlwZSAhPSBudWxsICYmIHR5cGUgaW5zdGFuY2VvZiBJQWN0aW9uUHJvdmlkZXIpCi0gICAgICB7Ci0gICAgICAgIElBY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IChJQWN0aW9uUHJvdmlkZXIpdHlwZTsKLSAgICAgICAgYWRkQWN0aW9uc1RvTGlzdChsaXN0LCBwcm92aWRlci5nZXRBY3Rpb25zKG9iamVjdCkpOwotICAgICAgfQotICAgIH0KLSAgICBhZGRBY3Rpb25zVG9MaXN0KGxpc3QsIHN1cGVyLmdldEFjdGlvbnMob2JqZWN0KSk7Ci0gICAgSUFjdGlvbltdIHJlc3VsdCA9IG5ldyBJQWN0aW9uW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ki8KLSAgCi0gIHB1YmxpYyBMYWJlbCBnZXROYW1lTGFiZWxGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGdldEZpZWxkRmlndXJlKCkuZ2V0TmFtZUxhYmVsKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBjdXJzb3JMb2NhdGlvbikKLSAgewotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgIAotICAgIGlmICgoKElBRFRPYmplY3QpZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpIHx8IGlzRmlsZVJlYWRPbmx5KCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVR8fAotICAgICAgICByZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsKLSAgICAgIElGaWVsZEZpZ3VyZSBmaWVsZEZpZ3VyZSA9IGdldEZpZWxkRmlndXJlKCk7Ci0gICAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0gICAgICB7Ci0gICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KXJlcXVlc3Q7Ci0gICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAKLSAgICAgICAgaWYgKGhpdFRlc3QoZmllbGRGaWd1cmUuZ2V0VHlwZUxhYmVsKCksIHApKQotICAgICAgICB7Ci0gICAgICAgICAgVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyKChJRmllbGQpbW9kZWwsIHRoaXMsIGZpZWxkRmlndXJlLmdldFR5cGVMYWJlbCgpKTsKLSAgICAgICAgICBUeXBlVXBkYXRlQ29tbWFuZCB0eXBlVXBkYXRlQ29tbWFuZCA9IG5ldyBUeXBlVXBkYXRlQ29tbWFuZCgpOwotICAgICAgICAgIHR5cGVVcGRhdGVDb21tYW5kLnNldERlbGVnYXRlKG1hbmFnZXIpOwotICAgICAgICAgIGFkdERpcmVjdEVkaXRQb2xpY3kuc2V0VXBkYXRlQ29tbWFuZCh0eXBlVXBkYXRlQ29tbWFuZCk7Ci0gICAgICAgICAgbWFuYWdlci5zaG93KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaGl0VGVzdChmaWVsZEZpZ3VyZS5nZXROYW1lTGFiZWwoKSwgcCkpCi0gICAgICAgIHsKLSAgICAgICAgCWRpcmVjdEVkaXROYW1lRmllbGQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgCSAgZGlyZWN0RWRpdE5hbWVGaWVsZCgpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZGlyZWN0RWRpdE5hbWVGaWVsZCgpCi0gIHsKLSAgICBpZiAoaXNGaWxlUmVhZE9ubHkoKSkgcmV0dXJuOwotCSAgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkgIElGaWVsZEZpZ3VyZSBmaWVsZEZpZ3VyZSA9IGdldEZpZWxkRmlndXJlKCk7Ci0gIAlpZiAoIG1vZGVsIGluc3RhbmNlb2YgSUZpZWxkKSAKLSAgICB7Ci0gICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKSBtb2RlbDsKLSAgICAgIGlmIChmaWVsZC5pc1JlZmVyZW5jZSgpKQotICAgICAgewotICAgICAgICBFbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBFbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoKElGaWVsZCkgbW9kZWwsIHRoaXMsIGZpZWxkRmlndXJlLmdldE5hbWVMYWJlbCgpKTsKLSAgICAgICAgUmVmZXJlbmNlVXBkYXRlQ29tbWFuZCBlbGVtZW50VXBkYXRlQ29tbWFuZCA9IG5ldyBSZWZlcmVuY2VVcGRhdGVDb21tYW5kKCk7Ci0gICAgICAgIGVsZW1lbnRVcGRhdGVDb21tYW5kLnNldERlbGVnYXRlKG1hbmFnZXIpOwotICAgICAgICBhZHREaXJlY3RFZGl0UG9saWN5LnNldFVwZGF0ZUNvbW1hbmQoZWxlbWVudFVwZGF0ZUNvbW1hbmQpOwotICAgICAgICBtYW5hZ2VyLnNob3coKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgTGFiZWxFZGl0TWFuYWdlciBtYW5hZ2VyID0gbmV3IExhYmVsRWRpdE1hbmFnZXIodGhpcywgbmV3IExhYmVsQ2VsbEVkaXRvckxvY2F0b3IodGhpcywgbnVsbCkpOwotICAgICAgICBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIgd3JhcHBlciA9IG5ldyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIoKTsKLSAgICAgICAgYWR0RGlyZWN0RWRpdFBvbGljeS5zZXRVcGRhdGVDb21tYW5kKHdyYXBwZXIpOwotICAgICAgICBtYW5hZ2VyLnNob3coKTsKLSAgICAgIH0KLSAgCX0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgZG9FZGl0TmFtZShib29sZWFuIGFkZEZyb21EZXNpZ24pCi0gIHsKLSAgICBpZiAoIWFkZEZyb21EZXNpZ24pIHJldHVybjsKLSAgICAKLS8vICAgIHJlbW92ZUZlZWRiYWNrKCk7Ci0KLSAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9ICgoWFNEQmFzZUFkYXB0ZXIpZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIFBvaW50IHAgPSBnZXROYW1lTGFiZWxGaWd1cmUoKS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgIExhYmVsRWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBMYWJlbEVkaXRNYW5hZ2VyKEJhc2VGaWVsZEVkaXRQYXJ0LnRoaXMsIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKEJhc2VGaWVsZEVkaXRQYXJ0LnRoaXMsIHApKTsKLSAgICAgICAgICBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIgd3JhcHBlciA9IG5ldyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIoKTsKLSAgICAgICAgICBhZHREaXJlY3RFZGl0UG9saWN5LnNldFVwZGF0ZUNvbW1hbmQod3JhcHBlcik7Ci0gICAgICAgICAgbWFuYWdlci5zaG93KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0KLSAgfQotICAKLSAgcHJvdGVjdGVkIGNsYXNzIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciBleHRlbmRzIENvbW1hbmQgaW1wbGVtZW50cyBJQURUVXBkYXRlQ29tbWFuZAotICB7Ci0gICAgQ29tbWFuZCBjb21tYW5kOwotICAgIHByb3RlY3RlZCBEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0OwotICAgIAotICAgIHB1YmxpYyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIoKQotICAgIHsKLSAgICAgIHN1cGVyKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX05BTUUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3QoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkKLSAgICB7Ci0gICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICB7Ci0gICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKWdldE1vZGVsKCk7Ci0gICAgICBPYmplY3QgbmV3VmFsdWUgPSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpOwotICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgewotICAgICAgICBjb21tYW5kID0gZmllbGQuZ2V0VXBkYXRlTmFtZUNvbW1hbmQoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGNsYXNzIFR5cGVVcGRhdGVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCBpbXBsZW1lbnRzIElBRFRVcGRhdGVDb21tYW5kCi0gIHsKLSAgICBwcm90ZWN0ZWQgQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlciBkZWxlZ2F0ZTsKLSAgICBwcm90ZWN0ZWQgRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdDsKLSAgICAKLSAgICBwdWJsaWMgVHlwZVVwZGF0ZUNvbW1hbmQoKQotICAgIHsKLSAgICAgIHN1cGVyKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX1RZUEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlbGVnYXRlKENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIgZGVsZWdhdGUpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdChEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KQotICAgIHsKLSAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHsKLSAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBkZWxlZ2F0ZS5wZXJmb3JtRWRpdChyZXF1ZXN0LmdldENlbGxFZGl0b3IoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpCi0gICAgewotICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClnZXRNb2RlbCgpOwotICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gKChDQ29tYm8pcmVxdWVzdC5nZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpKS5nZXRUZXh0KCk7Ci0gICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAhbmV3VmFsdWUuZXF1YWxzKGZpZWxkLmdldFR5cGVOYW1lKCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgY2xhc3MgUmVmZXJlbmNlVXBkYXRlQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgaW1wbGVtZW50cyBJQURUVXBkYXRlQ29tbWFuZAotICB7Ci0JICAgIHByb3RlY3RlZCBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyIGRlbGVnYXRlOwotCSAgICBwcm90ZWN0ZWQgRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdDsKLQkgICAgCi0JICAgIHB1YmxpYyBSZWZlcmVuY2VVcGRhdGVDb21tYW5kKCkKLQkgICAgewotCSAgICAgIHN1cGVyKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX0VMRU1FTlRfUkVGRVJFTkNFKTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyB2b2lkIHNldERlbGVnYXRlKENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIgZGVsZWdhdGUpCi0JICAgIHsKLQkgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpCi0JICAgIHsKLQkgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotCSAgICB9Ci0KLQkgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0JICAgIHsKLQkgICAgICBpZiAoZGVsZWdhdGUgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBkZWxlZ2F0ZS5wZXJmb3JtRWRpdChyZXF1ZXN0LmdldENlbGxFZGl0b3IoKSk7Ci0JICAgICAgfQotCSAgICB9Ci0KLQkgICAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpCi0JICAgIHsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICAvLyBQdXQgYmFjayBjb25uZWN0aW9uIGZpZ3VyZSBzbyBpdCB3b24ndCBnZXQgb3ZlcmxheWVkIGJ5IG90aGVyIG5vbiBoaWdobGlnaHRlZCBjb25uZWN0aW9ucwotICAgIGlmIChjb25uZWN0aW9uRmlndXJlICE9IG51bGwgJiYgIWlzU2VsZWN0ZWQpCi0gICAgewotICAgICAgY29ubmVjdGlvbkZlZWRiYWNrRmlndXJlID0gbmV3IFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uKCk7Ci0gICAgICBjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0U291cmNlQW5jaG9yKGNvbm5lY3Rpb25GaWd1cmUuZ2V0U291cmNlQW5jaG9yKCkpOwotICAgICAgY29ubmVjdGlvbkZlZWRiYWNrRmlndXJlLnNldFRhcmdldEFuY2hvcihjb25uZWN0aW9uRmlndXJlLmdldFRhcmdldEFuY2hvcigpKTsKLSAgICAgIGNvbm5lY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRIaWdobGlnaHQodHJ1ZSk7Ci0gICAgICBnZXRMYXllcihMYXllckNvbnN0YW50cy5GRUVEQkFDS19MQVlFUikuYWRkKGNvbm5lY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0gICAgfQotICAgICBzdXBlci5hZGRGZWVkYmFjaygpOwotICAgICBnZXRGaWVsZEZpZ3VyZSgpLmFkZFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotICAgIGlmIChjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0SGlnaGxpZ2h0KGZhbHNlKTsKLSAgICAgIGdldExheWVyKExheWVyQ29uc3RhbnRzLkZFRURCQUNLX0xBWUVSKS5yZW1vdmUoY29ubmVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLSAgICB9Ci0gICAgY29ubmVjdGlvbkZlZWRiYWNrRmlndXJlID0gbnVsbDsKLSAgICBzdXBlci5yZW1vdmVGZWVkYmFjaygpOwotICAgIGdldEZpZWxkRmlndXJlKCkucmVtb3ZlU2VsZWN0aW9uRmVlZGJhY2soKTsKLSAgfQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRlclRleHQoKQotICB7Ci0JICBJRmllbGRGaWd1cmUgZmllbGRGaWd1cmUgPSBnZXRGaWVsZEZpZ3VyZSgpOwotCSAgCi0JICBTdHJpbmcgbmFtZT0iIjsKLQkgIGlmIChmaWVsZEZpZ3VyZS5nZXROYW1lTGFiZWwoKSAhPW51bGwmJiBmaWVsZEZpZ3VyZS5nZXROYW1lTGFiZWwoKS5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJICBuYW1lICs9ZmllbGRGaWd1cmUuZ2V0TmFtZUxhYmVsKCkuZ2V0VGV4dCgpOwotCSAgaWYgKGZpZWxkRmlndXJlLmdldE5hbWVBbm5vdGF0aW9uTGFiZWwoKSAhPW51bGwgJiYgZmllbGRGaWd1cmUuZ2V0TmFtZUFubm90YXRpb25MYWJlbCgpLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkgIG5hbWUgKz0gIiAiK2ZpZWxkRmlndXJlLmdldE5hbWVBbm5vdGF0aW9uTGFiZWwoKS5nZXRUZXh0KCk7Ci0JICBpZiAoZmllbGRGaWd1cmUuZ2V0VHlwZUxhYmVsKCkgIT1udWxsICYmIGZpZWxkRmlndXJlLmdldFR5cGVMYWJlbCgpLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkgIG5hbWUgKz0gIiB0eXBlICIrZmllbGRGaWd1cmUuZ2V0VHlwZUxhYmVsKCkuZ2V0VGV4dCgpOwotCSAgaWYgKGZpZWxkRmlndXJlLmdldFR5cGVBbm5vdGF0aW9uTGFiZWwoKSAhPW51bGwgJiYgZmllbGRGaWd1cmUuZ2V0VHlwZUFubm90YXRpb25MYWJlbCgpLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPjApCi0JCSAgbmFtZSArPSAiICIrZmllbGRGaWd1cmUuZ2V0VHlwZUFubm90YXRpb25MYWJlbCgpLmdldFRleHQoKTsKLQkgIHJldHVybiBuYW1lOwotCi0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWJiOGU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFzZVR5cGVDb25uZWN0aW5nRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklGZWVkYmFja0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5JQURUVXBkYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc29tZSBiYXNlIGZ1bmN0aW9uIHRvIGVuYWJsZSBkcmF3aW5nIGNvbm5lY3Rpb25zIHRvIGEgcmVmZXJlbmNlZCB0eXBlCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVR5cGVDb25uZWN0aW5nRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQgaW1wbGVtZW50cyBJRmVlZGJhY2tIYW5kbGVyLCBJQ29ubmVjdGlvbkNvbnRhaW5lcgotewotICBwcml2YXRlIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GaWd1cmU7ICAKLSAgCi0gIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmFjdGl2YXRlKCk7ICAgICAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICB7Ci0gICAgZGVhY3RpdmF0ZUNvbm5lY3Rpb24oKTsKLSAgICBzdXBlci5kZWFjdGl2YXRlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hDb25uZWN0aW9ucygpCi0gIHsKLSAgICBkZWFjdGl2YXRlQ29ubmVjdGlvbigpOyAgICAgCi0gICAgYWN0aXZhdGVDb25uZWN0aW9uKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUNvbm5lY3Rpb24oKQotICB7ICAgIAotICAgIC8vIElmIGFwcHJvcHJpYXRlLCBjcmVhdGUgb3VyIGNvbm5lY3Rpb25GaWd1cmUgYW5kIGFkZCBpdCB0byB0aGUgYXBwcm9wcmlhdGUgbGF5ZXIKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZSA9PSBudWxsICYmIHNob3VsZERyYXdDb25uZWN0aW9uKCkpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGl2YXRlZUNvbm5lY3Rpb24oKS1wcmU6IiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsgICAgICAgICAgIAotICAgICAgY29ubmVjdGlvbkZpZ3VyZSA9IGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoKTsKLSAgICAgIGlmIChjb25uZWN0aW9uRmlndXJlICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgLy8gQWRkIG91ciBlZGl0cG9saWN5IGFzIGEgbGlzdGVuZXIgb24gdGhlIGNvbm5lY3Rpb24sIHNvIGl0IGNhbiBzdGF5IGluIHN5bmNoCi0gICAgICAgIC8vY29ubmVjdGlvbkZpZ3VyZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKChBdHRyaWJ1dGVTZWxlY3Rpb25GZWVkYmFja1BvbGljeSkgZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKSk7Ci0gICAgICAgIC8vY29ubmVjdGlvbkZpZ3VyZS5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICBnZXRMYXllcihMYXllckNvbnN0YW50cy5DT05ORUNUSU9OX0xBWUVSKS5hZGQoY29ubmVjdGlvbkZpZ3VyZSk7Ci0gICAgICB9ICAKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRlYWN0aXZhdGVDb25uZWN0aW9uKCkKLSAgewotICAgIC8vIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uLCByZW1vdmUgaXQKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpLnJlbW92ZShjb25uZWN0aW9uRmlndXJlKTsKLSAgICAgIC8vIFJlbW92ZSBvdXIgZWRpdHBvbGljeSBsaXN0ZW5lcihzKQotICAgICAgLy9jb25uZWN0aW9uRmlndXJlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKEF0dHJpYnV0ZVNlbGVjdGlvbkZlZWRiYWNrUG9saWN5KSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpKTsKLSAgICAgIC8vY29ubmVjdGlvbkZpZ3VyZS5yZW1vdmVNb3VzZUxpc3RlbmVyKHRoaXMpOwotICAgICAgY29ubmVjdGlvbkZpZ3VyZSA9IG51bGw7Ci0gICAgfQotICB9ICAKLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3VsZERyYXdDb25uZWN0aW9uKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgYWJzdHJhY3QgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpOwotICAKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodCh0cnVlKTsKLSAgICB9Ci0gICAgc3VwZXIuYWRkRmVlZGJhY2soKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0gICAgfQotICAgIHN1cGVyLnJlbW92ZUZlZWRiYWNrKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIgZXh0ZW5kcyBDb21tYW5kIGltcGxlbWVudHMgSUFEVFVwZGF0ZUNvbW1hbmQKLSAgewotICAgIENvbW1hbmQgY29tbWFuZDsKLSAgICBwcm90ZWN0ZWQgRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdDsKLSAgICAKLSAgICBwdWJsaWMgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyKCkKLSAgICB7Ci0gICAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9OQU1FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpCi0gICAgewotICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgewotICAgICAgSVR5cGUgaVR5cGUgPSAoSVR5cGUpZ2V0TW9kZWwoKTsKLSAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCk7Ci0gICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBpVHlwZS5nZXRVcGRhdGVOYW1lQ29tbWFuZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhpdFRlc3QoSUZpZ3VyZSB0YXJnZXQsIFBvaW50IGxvY2F0aW9uKQotICB7Ci0gICAgUmVjdGFuZ2xlIGIgPSB0YXJnZXQuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgIHRhcmdldC50cmFuc2xhdGVUb0Fic29sdXRlKGIpOyAgCi0gICAgcmV0dXJuIGIuY29udGFpbnMobG9jYXRpb24pOwotICB9ICAgCi0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsgICAgICAgIAotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuV0VTVCkKLSAgICB7ICAgIAotICAgICAgcmVzdWx0ID0gZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpOwotICAgIH0KLSAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuRUFTVCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBnZXRDb25uZWN0aW9uRWRpdFBhcnQoUG9zaXRpb25Db25zdGFudHMuRUFTVCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7ICAgICAgICAgICAgCi0gIH0gICAgICAgIAotICAKLSAgcHJpdmF0ZSBFZGl0UGFydCBnZXRDb25uZWN0aW9uRWRpdFBhcnQoaW50IGRpcmVjdGlvbikKLSAgewotICAgIC8vIGZpbmQgdGhlIGZpcnN0IGNvbm5lY3Rpb24gdGhhdCB0YXJnZXRzIHRoaXMgZWRpdFBhcnQKLSAgICAvLyBuYXZpZ2F0ZSBiYWNrd2FyZCBhbG9uZyB0aGUgY29ubmVjdGlvbiAodG8gdGhlIGxlZnQpIHRvIGZpbmQgdGhlIHNvdXJjZSBlZGl0IHBhcnQKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBGaWd1cmUgZmlndXJlID0gKEZpZ3VyZSlpLm5leHQoKTsKLSAgICAgIGlmIChmaWd1cmUgaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gdHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gPSAoVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24pZmlndXJlOwotICAgICAgICBDb25uZWN0aW9uQW5jaG9yIHRoaXNBbmNob3IgPSBudWxsOwotICAgICAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QpCi0gICAgICAgIHsKLSAgICAgICAgICB0aGlzQW5jaG9yID0gdHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24uZ2V0U291cmNlQW5jaG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpCi0gICAgICAgIHsKLSAgICAgICAgICB0aGlzQW5jaG9yID0gdHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24uZ2V0VGFyZ2V0QW5jaG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXNBbmNob3IgIT0gbnVsbCAmJiB0aGlzQW5jaG9yLmdldE93bmVyKCkgPT0gZ2V0RmlndXJlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBDb25uZWN0aW9uQW5jaG9yIG91dEFuY2hvciA9IG51bGw7Ci0gICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5FQVNUKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dEFuY2hvciA9IHR5cGVSZWZlcmVuY2VDb25uZWN0aW9uLmdldFRhcmdldEFuY2hvcigpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuV0VTVCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvdXRBbmNob3IgPSB0eXBlUmVmZXJlbmNlQ29ubmVjdGlvbi5nZXRTb3VyY2VBbmNob3IoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKG91dEFuY2hvciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElGaWd1cmUgc291cmNlRmlndXJlID0gb3V0QW5jaG9yLmdldE93bmVyKCk7ICAgICAgICAgIAotICAgICAgICAgICAgRWRpdFBhcnQgcGFydCA9IG51bGw7Ci0gICAgICAgICAgICB3aGlsZSAocGFydCA9PSBudWxsICYmIHNvdXJjZUZpZ3VyZSAhPSBudWxsKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcGFydCA9IChFZGl0UGFydClnZXRWaWV3ZXIoKS5nZXRWaXN1YWxQYXJ0TWFwKCkuZ2V0KHNvdXJjZUZpZ3VyZSk7Ci0gICAgICAgICAgICAgIHNvdXJjZUZpZ3VyZSA9IHNvdXJjZUZpZ3VyZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgICAgICByZXN1bHQgPSBwYXJ0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgfSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0JveEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0JveEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YTg1ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Cb3hFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Db21wYXJ0bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLlNpbXBsZURpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5Cb3hGaWd1cmU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCb3hFZGl0UGFydCBleHRlbmRzIEJhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0IC8vSUZlZWRiYWNrSGFuZGxlcgoteyAgCi0gIHByb3RlY3RlZCBMaXN0IGNvbXBhcnRtZW50TGlzdCA9IG51bGw7Ci0gIHByb3RlY3RlZCBTaW1wbGVEaXJlY3RFZGl0UG9saWN5IHNpbXBsZURpcmVjdEVkaXRQb2xpY3kgPSBuZXcgU2ltcGxlRGlyZWN0RWRpdFBvbGljeSgpOwotCi0gIHByb3RlY3RlZCBDb21wYXJ0bWVudFtdIGdldENvbXBhcnRtZW50cygpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIEJveEZpZ3VyZSBmaWd1cmUgPSBuZXcgQm94RmlndXJlKCk7Ci0gICAgTGluZUJvcmRlciBib3hMaW5lQm9yZGVyID0gbmV3IExpbmVCb3JkZXIoMSk7Ci0gICAgZmlndXJlLnNldEJvcmRlcihib3hMaW5lQm9yZGVyKTsgICAgCi0gICAgVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLSAgICB0b29sYmFyTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIodG9vbGJhckxheW91dCk7Ci0gICAgLy8gd2Ugc2hvdWxkIG9yZ2FuaXplIElUcmVlRWxlbWVudCBhbmQgaW50ZWdyYXRlIGl0IHdpdGggdGhlIGZhY2FkZQotICAgIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgSVRyZWVFbGVtZW50KQotICAgIHsKLSAgICAgIGZpZ3VyZS5nZXROYW1lTGFiZWwoKS5zZXRJY29uKCgoSVRyZWVFbGVtZW50KWdldE1vZGVsKCkpLmdldEltYWdlKCkpOwotICAgIH0KLSAgICByZXR1cm4gZmlndXJlOwotICB9Ci0gIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gKChCb3hGaWd1cmUpZ2V0RmlndXJlKCkpLmdldENvbnRlbnRQYW5lKCk7Ci0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG5ldyBBRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3koKSk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBzaW1wbGVEaXJlY3RFZGl0UG9saWN5KTsKLSAgfQotICAKLSAgIAotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBCb3hGaWd1cmUgYm94RmlndXJlID0gKEJveEZpZ3VyZSlmaWd1cmU7Ci0gICAgTGluZUJvcmRlciBib3hGaWd1cmVMaW5lQm9yZGVyID0gKExpbmVCb3JkZXIpYm94RmlndXJlLmdldEJvcmRlcigpOwotICAgIGJveEZpZ3VyZUxpbmVCb3JkZXIuc2V0V2lkdGgoMik7Ci0gICAgYm94RmlndXJlTGluZUJvcmRlci5zZXRDb2xvcihDb2xvckNvbnN0YW50cy5kYXJrQmx1ZSk7ICAKLSAgICBib3hGaWd1cmUuZ2V0SGVhZGluZ0ZpZ3VyZSgpLnNldFNlbGVjdGVkKHRydWUpOwotICAgIGZpZ3VyZS5yZXBhaW50KCk7Ci0gICAgc3VwZXIuYWRkRmVlZGJhY2soKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgQm94RmlndXJlIGJveEZpZ3VyZSA9IChCb3hGaWd1cmUpZmlndXJlOwotICAgIExpbmVCb3JkZXIgYm94RmlndXJlTGluZUJvcmRlciA9IChMaW5lQm9yZGVyKWJveEZpZ3VyZS5nZXRCb3JkZXIoKTsKLSAgICBib3hGaWd1cmVMaW5lQm9yZGVyLnNldFdpZHRoKDEpOwotICAgIGJveEZpZ3VyZUxpbmVCb3JkZXIuc2V0Q29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIGJveEZpZ3VyZS5nZXRIZWFkaW5nRmlndXJlKCkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgIGZpZ3VyZS5yZXBhaW50KCk7Ci0gICAgc3VwZXIucmVtb3ZlRmVlZGJhY2soKTsgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRFZGl0b3JBY3Rpb25SZWdpc3RyeShJRWRpdG9yUGFydCBlZGl0b3IpCi0gIHsKLSAgICByZXR1cm4gKEFjdGlvblJlZ2lzdHJ5KSBlZGl0b3IuZ2V0QWRhcHRlcihBY3Rpb25SZWdpc3RyeS5jbGFzcyk7Ci0gIH0KLX0gIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9DZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOTNiOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9DZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5DZW50ZXJlZEljb25GaWd1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3Rpb25BbmNob3IKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVCA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUID0gMzsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRUFERVJfTEVGVCA9IDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQURFUl9SSUdIVCA9IDU7Ci0KLSAgcHJpdmF0ZSBpbnQgbG9jYXRpb247Ci0gIHByaXZhdGUgaW50IGluc2V0OwotICBwcml2YXRlIGludCBvZmZzZXQgPSAwOwotICBwcml2YXRlIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvciBvdGhlcjsKLQotICBwdWJsaWMgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKElGaWd1cmUgb3duZXIsIGludCBsb2NhdGlvbiwgaW50IGluc2V0KQotICB7Ci0gICAgc3VwZXIob3duZXIpOwotICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB0aGlzLmluc2V0ID0gaW5zZXQ7Ci0gIH0KLQotICBwdWJsaWMgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKElGaWd1cmUgb3duZXIsIGludCBsb2NhdGlvbiwgaW50IGluc2V0LCBpbnQgb2Zmc2V0KQotICB7Ci0gICAgdGhpcyhvd25lciwgbG9jYXRpb24sIGluc2V0KTsKLSAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKLSAgfQotCi0gIHB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbihQb2ludCByZWZlcmVuY2UpCi0gIHsKLSAgICBSZWN0YW5nbGUgciA9IGdldE93bmVyKCkuZ2V0Qm91bmRzKCk7Ci0gICAgaW50IHgsIHk7Ci0gICAgc3dpdGNoIChsb2NhdGlvbikKLSAgICB7Ci0gICAgY2FzZSBUT1A6Ci0gICAgICB4ID0gci5yaWdodCgpIC0gci53aWR0aCAvIDIgKyBvZmZzZXQ7Ci0gICAgICB5ID0gci55ICsgaW5zZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJPVFRPTToKLSAgICAgIHggPSByLnJpZ2h0KCkgLSByLndpZHRoIC8gMiArIG9mZnNldDsKLSAgICAgIHkgPSByLmJvdHRvbSgpIC0gaW5zZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIExFRlQ6Ci0gICAgICB4ID0gci54ICsgaW5zZXQ7Ci0gICAgICB5ID0gci5ib3R0b20oKSAtIHIuaGVpZ2h0IC8gMiArIG9mZnNldDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUklHSFQ6Ci0gICAgICB4ID0gci5yaWdodCgpIC0gaW5zZXQ7Ci0gICAgICB5ID0gci5ib3R0b20oKSAtIHIuaGVpZ2h0IC8gMiArIG9mZnNldDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSEVBREVSX0xFRlQ6Ci0gICAgICB4ID0gci54ICsgaW5zZXQ7Ci0gICAgICB5ID0gci55ICsgb2Zmc2V0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIRUFERVJfUklHSFQ6Ci0gICAgICB4ID0gci5yaWdodCgpIC0gaW5zZXQ7Ci0gICAgICB5ID0gci55ICsgb2Zmc2V0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgeCA9IHIucmlnaHQoKSAtIHIud2lkdGggLyAyOwotICAgICAgeSA9IHIuYm90dG9tKCkgLSByLmhlaWdodCAvIDI7Ci0gICAgfQotICAgIFBvaW50IHAgPSBuZXcgUG9pbnQoeCwgeSk7Ci0KLSAgICBpZiAoIShnZXRPd25lcigpIGluc3RhbmNlb2YgQ2VudGVyZWRJY29uRmlndXJlKSkKLSAgICB7Ci0gICAgICBnZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBnZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocCk7Ci0gICAgfQotICAgIAotICAgIGlmIChvdGhlciAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGlmIHdpdGhpbiBvbmx5IG9uZSBwaXhlbCBvZiBiZWluZyB2ZXJ0aWNhbCwgd2Ugc3RyYWlnaHRlbiB1cCB0aGUgbGluZQotICAgICAgUG9pbnQgcDIgPSBvdGhlci5nZXRMb2NhdGlvbihudWxsKTsKLSAgICAgIGlmIChNYXRoLmFicyhwMi54IC0gcC54KSA8PSAxKQotICAgICAgewotICAgICAgICBwLnggPSBwMi54OwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIHA7Ci0gIH0KLQotICBwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKQotICB7Ci0gICAgcmV0dXJuIGdldExvY2F0aW9uKG51bGwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0T3RoZXIoQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yIG90aGVyKQotICB7Ci0gICAgdGhpcy5vdGhlciA9IG90aGVyOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29sdW1uRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29sdW1uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViNDA5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NvbHVtbkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5BYnN0cmFjdE1vZGVsQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlJlZmVyZW5jZWRUeXBlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBDb2x1bW5FZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAoteyAgICAgICAgIAotICBwcm90ZWN0ZWQgaW50IHNwYWNpbmcgPSAyMDsgIAotICBwcm90ZWN0ZWQgaW50IG1pbm9yQWxpZ25tZW50ID0gLTE7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzSG9yaXpvbnRhbCA9IGZhbHNlOwotICAKLSAgcHVibGljIENvbHVtbkVkaXRQYXJ0KCkKLSAgeyAgICAKLSAgfQotCi0gIHB1YmxpYyBDb2x1bW5FZGl0UGFydChib29sZWFuIGlzSG9yaXpvbnRhbCkKLSAgewotICAgIHRoaXMuaXNIb3Jpem9udGFsID0gaXNIb3Jpem9udGFsOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgRmlndXJlIGZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGlzSG9yaXpvbnRhbCk7Ci0gICAKLSAgICBpZiAobWlub3JBbGlnbm1lbnQgIT0gLTEpCi0gICAgeyAgCi0gICAgICBsYXlvdXQuc2V0TWlub3JBbGlnbm1lbnQobWlub3JBbGlnbm1lbnQpOwotICAgIH0gIAotICAgIGxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsKLSAgICBsYXlvdXQuc2V0U3BhY2luZyhzcGFjaW5nKTsKLSAgICBmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNwYWNpbmcoaW50IHNwYWNpbmcpCi0gIHsKLSAgICB0aGlzLnNwYWNpbmcgPSBzcGFjaW5nOwotICAgIGlmIChmaWd1cmUgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgICgoVG9vbGJhckxheW91dClmaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpKS5zZXRTcGFjaW5nKHNwYWNpbmcpOwotICAgIH0gIAotICB9Ci0gIAotICBwdWJsaWMgSUNvbXBsZXhUeXBlIGdldENvbXBsZXhUeXBlKCkKLSAgewotICAgIHJldHVybiAoSUNvbXBsZXhUeXBlKWdldE1vZGVsKCk7ICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICB9Ci0gIAotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgeyAKLSAgICBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uKWdldE1vZGVsKCk7Ci0gICAgcmV0dXJuIGNvbGxlY3Rpb24uZ2V0Q2hpbGRyZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWlub3JBbGlnbm1lbnQoKQotICB7Ci0gICAgcmV0dXJuIG1pbm9yQWxpZ25tZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TWlub3JBbGlnbm1lbnQoaW50IG1pbm9yQWxpZ25tZW50KQotICB7Ci0gICAgdGhpcy5taW5vckFsaWdubWVudCA9IG1pbm9yQWxpZ25tZW50OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaENoaWxkcmVuKCk7Ci0gICAgaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBSZWZlcmVuY2VkVHlwZUNvbHVtbikKLSAgICB7Ci0gICAgICBpZiAoZ2V0UGFyZW50KCkuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAwKSAKLSAgICAgIHsgICAgICAgIAotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydClnZXRQYXJlbnQoKS5nZXRDaGlsZHJlbigpLmdldCgwKTsKLSAgICAgICAgcmVmcmVzaENvbm5lY3Rpb25zKGVkaXRQYXJ0KTsKLSAgICAgIH0gIAotICAgIH0gICAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVmcmVzaENvbm5lY3Rpb25zKHRoaXMpOyAgICAgIAotICAgIH0gIAotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaENvbm5lY3Rpb25zKEVkaXRQYXJ0IHBhcmVudCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHBhcmVudC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7ICAgICAgCi0gICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBCYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgQmFzZVR5cGVDb25uZWN0aW5nRWRpdFBhcnQgY29ubmVjdGluZ0VkaXRQYXJ0ID0gKEJhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgICBjb25uZWN0aW5nRWRpdFBhcnQucmVmcmVzaENvbm5lY3Rpb25zKCk7Ci0gICAgICB9ICAKLSAgICAgIHJlZnJlc2hDb25uZWN0aW9ucyhlZGl0UGFydCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NvbXBhcnRtZW50RWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWY1NmU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQ29tcGFydG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5LZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklDb21wYXJ0bWVudEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotCi0vLyBUT0RPIChjcykgY29tbW9uLXVwIHdpdGggQm94RWRpdFBhcnQgKD8pCi1wdWJsaWMgY2xhc3MgQ29tcGFydG1lbnRFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydCAvLyBpbXBsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJRmVlZGJhY2tIYW5kbGVyCi17Ci0gIHByb3RlY3RlZCBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbigpOwotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBJQ29tcGFydG1lbnRGaWd1cmUgZmlndXJlID0gZ2V0RmlndXJlRmFjdG9yeSgpLmNyZWF0ZUNvbXBhcnRtZW50RmlndXJlKGdldE1vZGVsKCkpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q29tcGFydG1lbnRGaWd1cmUoKS5nZXRDb250ZW50UGFuZSgpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBoYXNDb250ZW50KCkKLSAgewotICAgIC8vIHNpbmNlIHRoZSBhbm5vdGF0aW9uIGFsd2F5cyB0YWtlcyB1cCAxIGNoaWxkLCBoZXJlJ3MgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gZmlndXJlIG91dCBpZgotICAgIHJldHVybiBnZXRDaGlsZHJlbigpLnNpemUoKSA+IDE7Ci0gIH0KLQotICBMaXN0IGdldENoaWxkcmVuU2Fuc0Fubm90YXRpb24oKQotICB7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBjaGlsZHJlbi5hZGRBbGwoZ2V0Q2hpbGRyZW4oKSk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBFZGl0UGFydCBjaGlsZCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgIGlmIChjaGlsZC5nZXRNb2RlbCgpID09IGFubm90YXRpb24pCi0gICAgICB7Ci0gICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIGNoaWxkcmVuOwotICB9Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsgICAKLSAgICAKLSAgICAvLyB3ZSBjb21wdXRlIHRoZSBjaGlsZHJlbiBzYW5zIHRoZSBhbm5vdGF0aW9uIEVkaXRQYXJ0Ci0gICAgLy8gc2luY2UgdGhlIGFubm90YXRpb24gRWRpdFBhcnQgY29uZnVzZXMgb3VyIHVwL2Rvd24ga2V5IGhhbmRsaW5nCi0gICAgTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuU2Fuc0Fubm90YXRpb24oKTsKLSAgICBpZiAoY2hpbGRyZW4uY29udGFpbnMoZWRpdFBhcnQpKQotICAgIHsgIAotICAgICAgaWYgKGRpcmVjdGlvbiA9PSBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5Lk9VVF9UT19QQVJFTlQpCi0gICAgICB7Ci0gICAgICAgIENvbXBhcnRtZW50IGNvbXBhcnRtZW50ID0gKENvbXBhcnRtZW50KWdldE1vZGVsKCk7Ci0gICAgICAgIGZvciAoRWRpdFBhcnQgcGFyZW50ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCkpCi0gICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICBpZiAocGFyZW50LmdldE1vZGVsKCkgPT0gY29tcGFydG1lbnQuZ2V0T3duZXIoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBwYXJlbnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICB9ICAgICAgICAKLSAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCkKLSAgICAgIHsgICAgCi0gICAgICAgIGludCBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSA+IDApCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBpZiAoY2hpbGRyZW4uZ2V0KHNpemUgLSAxKSA9PSBlZGl0UGFydCkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIENvbXBhcnRtZW50RWRpdFBhcnQgbmV4dENvbXBhcnRtZW50ID0gKENvbXBhcnRtZW50RWRpdFBhcnQpRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuZ2V0TmV4dFNpYmxpbmcoQ29tcGFydG1lbnRFZGl0UGFydC50aGlzKTsKLSAgICAgICAgICAgIGlmIChuZXh0Q29tcGFydG1lbnQgIT0gbnVsbCAmJiBuZXh0Q29tcGFydG1lbnQuZ2V0Q2hpbGRyZW5TYW5zQW5ub3RhdGlvbigpLnNpemUoKSA+IDApCi0gICAgICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgICAgIHJlc3VsdCA9IEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmdldEZpcnN0Q2hpbGQobmV4dENvbXBhcnRtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gZWRpdFBhcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuZ2V0TmV4dFNpYmxpbmcoZWRpdFBhcnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKQotICAgICAgewotICAgICAgICBpZiAoRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuZ2V0Rmlyc3RDaGlsZChDb21wYXJ0bWVudEVkaXRQYXJ0LnRoaXMpID09IGVkaXRQYXJ0KQotICAgICAgICB7ICAKLSAgICAgICAgICBFZGl0UGFydCBwcmV2Q29tcGFydG1lbnQgPSBFZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5nZXRQcmV2U2libGluZyhDb21wYXJ0bWVudEVkaXRQYXJ0LnRoaXMpOwotICAgICAgICAgIGlmIChwcmV2Q29tcGFydG1lbnQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEVkaXRQYXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExpc3QgcHJldkNvbXBMaXN0Q2hpbGRyZW4gPSAoKENvbXBhcnRtZW50RWRpdFBhcnQpcHJldkNvbXBhcnRtZW50KS5nZXRDaGlsZHJlblNhbnNBbm5vdGF0aW9uKCk7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHByZXZDb21wTGlzdENoaWxkcmVuLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChzaXplID4gMCkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICByZXN1bHQgPSAoRWRpdFBhcnQpcHJldkNvbXBhcnRtZW50LmdldENoaWxkcmVuKCkuZ2V0KHNpemUgLSAxKTsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuZ2V0UHJldlNpYmxpbmcoZWRpdFBhcnQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OyAgICAgIAotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkKLSAgewotICAgIE9iamVjdCBtb2RlbCA9IGNoaWxkRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQotICAgIElGaWd1cmUgY2hpbGQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKTsKLQotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElGaWVsZCkKLSAgICB7Ci0gICAgICBnZXRDb21wYXJ0bWVudEZpZ3VyZSgpLmdldENvbnRlbnRQYW5lKCkuYWRkKGNoaWxkLCBpbmRleCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgQW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICBnZXRDb21wYXJ0bWVudEZpZ3VyZSgpLmdldEFubm90YXRpb25QYW5lKCkuYWRkKGNoaWxkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgaW5kZXgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkKLSAgewotICAgIE9iamVjdCBtb2RlbCA9IGNoaWxkRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLSAgICBJRmlndXJlIGNoaWxkID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCk7Ci0KLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgewotICAgICAgZ2V0Q29tcGFydG1lbnRGaWd1cmUoKS5nZXRDb250ZW50UGFuZSgpLnJlbW92ZShjaGlsZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgQW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICBnZXRDb21wYXJ0bWVudEZpZ3VyZSgpLmdldEFubm90YXRpb25QYW5lKCkucmVtb3ZlKGNoaWxkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcGFydG1lbnQgZ2V0Q29tcGFydG1lbnQoKQotICB7Ci0gICAgcmV0dXJuIChDb21wYXJ0bWVudCkgZ2V0TW9kZWwoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IGdldENvbXBhcnRtZW50KCkuZ2V0Q2hpbGRyZW4oKTsKLSAgICBjaGlsZHJlbi5hZGQoYW5ub3RhdGlvbik7Ci0gICAgcmV0dXJuIGNoaWxkcmVuOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNb2RlbChPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBzdXBlci5zZXRNb2RlbChtb2RlbCk7Ci0gICAgYW5ub3RhdGlvbi5zZXRDb21wYXJ0bWVudChnZXRDb21wYXJ0bWVudCgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hDaGlsZHJlbigpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICAvLyAoKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpZ2V0UGFyZW50KCkpLmdldENvbnRlbnRQYW5lKCkuaW52YWxpZGF0ZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotICAgIC8vIGdldEZpZ3VyZSgpLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibHVlKTsKLSAgICAvLyAoKENvbXBhcnRtZW50RmlndXJlKWdldEZpZ3VyZSgpKS5zZXRCb3JkZXJDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgZ2V0RmlndXJlKCkucmVwYWludCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgLy8gZ2V0RmlndXJlKCkuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpZ2h0Qmx1ZSk7Ci0gICAgLy8gKChDb21wYXJ0bWVudEZpZ3VyZSlnZXRGaWd1cmUoKSkuc2V0Qm9yZGVyQ29sb3IoQ29sb3JDb25zdGFudHMubGlnaHRHcmF5KTsKLSAgICBnZXRGaWd1cmUoKS5yZXBhaW50KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJQ29tcGFydG1lbnRGaWd1cmUgZ2V0Q29tcGFydG1lbnRGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIChJQ29tcGFydG1lbnRGaWd1cmUpZmlndXJlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkTm90aWZ5KCkKLSAgeyAgCi0gICAgc3VwZXIuYWRkTm90aWZ5KCk7Ci0gICAgZ2V0Q29tcGFydG1lbnRGaWd1cmUoKS5lZGl0UGFydEF0dGFjaGVkKHRoaXMpOyAgIAotICB9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NvbXBsZXhUeXBlRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29tcGxleFR5cGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWNlYjA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29tcGxleFR5cGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYW5oYXR0YW5Db25uZWN0aW9uUm91dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Gb2N1c1R5cGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBDb21wbGV4VHlwZUVkaXRQYXJ0IGV4dGVuZHMgU3RydWN0dXJlRWRpdFBhcnQKLXsKLSAgcHJpdmF0ZSBGb250IGl0YWxpY0ZvbnQ7Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRHJhd0Nvbm5lY3Rpb24oKQotICB7Ci0gICAgaWYgKGdldFBhcmVudCgpLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBGb2N1c1R5cGVDb2x1bW4pCi0gICAgeyAgCi0gICAgICBJQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSAoSUNvbXBsZXhUeXBlKWdldE1vZGVsKCk7Ci0gICAgICByZXR1cm4gY29tcGxleFR5cGUuZ2V0U3VwZXJUeXBlKCkgIT0gbnVsbDsKLSAgICB9IAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgCi0gIHByaXZhdGUgRWRpdFBhcnQgZ2V0VGFyZ2V0RWRpdFBhcnQoSVR5cGUgdHlwZSkKLSAgewotICAgIENvbHVtbkVkaXRQYXJ0IGNvbHVtbkVkaXRQYXJ0ID0gbnVsbDsKLSAgICBmb3IgKEVkaXRQYXJ0IGVkaXRQYXJ0ID0gdGhpczsgZWRpdFBhcnQgIT0gbnVsbDsgZWRpdFBhcnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKSkKLSAgICB7Ci0gICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb2x1bW5FZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgY29sdW1uRWRpdFBhcnQgPSAoQ29sdW1uRWRpdFBhcnQpZWRpdFBhcnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgCi0gICAgfSAgICAgCi0gICAgaWYgKGNvbHVtbkVkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gY29sdW1uRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBjaGlsZCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgICAgaWYgKGNoaWxkLmdldE1vZGVsKCkgPT0gdHlwZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAgICAgfSAgICAgICAgIAotICAgICAgfSAgCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpCi0gIHsKLSAgICBjb25uZWN0aW9uRmlndXJlID0gbnVsbDsKLSAgICBJQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSAoSUNvbXBsZXhUeXBlKWdldE1vZGVsKCk7Ci0gICAgSVR5cGUgdHlwZSA9IGNvbXBsZXhUeXBlLmdldFN1cGVyVHlwZSgpOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgeyAgICAgIAotICAgICAgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByZWZlcmVuY2VUeXBlUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KWdldFRhcmdldEVkaXRQYXJ0KHR5cGUpOwotICAgICAgaWYgKHJlZmVyZW5jZVR5cGVQYXJ0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUgPSBuZXcgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24odHJ1ZSk7Ci0gICAgICAgIC8vIGRyYXcgYSBsaW5lIG91dCBmcm9tIHRoZSB0b3AgICAgICAgICAKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRTb3VyY2VBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihnZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLlRPUCwgMSkpOwotICAgICAgICAKLSAgICAgICAgLy8gVE9ETyAoY3MpIG5lZWQgdG8gZHJhdyB0aGUgdGFyZ2V0IGFuY2hvciB0byBsb29rIGxpa2UgYSBVTUwgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwCi0gICAgICAgIC8vIGFkZGluZyBhIGxhYmVsIHRvIHRoZSBjb25uZWN0aW9uIHdvdWxkIGhlbHAgdG8KLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRUYXJnZXRBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihyZWZlcmVuY2VUeXBlUGFydC5nZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkJPVFRPTSwgMCwgMCkpOwotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldENvbm5lY3Rpb25Sb3V0ZXIobmV3IE1hbmhhdHRhbkNvbm5lY3Rpb25Sb3V0ZXIoKSk7Ci0gICAgICAgICgoQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKWNvbm5lY3Rpb25GaWd1cmUuZ2V0U291cmNlQW5jaG9yKCkpLnNldE90aGVyKChDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IpY29ubmVjdGlvbkZpZ3VyZS5nZXRUYXJnZXRBbmNob3IoKSk7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KGZhbHNlKTsKLSAgICAgIH0KLSAgICB9ICAgIAotICAgIHJldHVybiBjb25uZWN0aW9uRmlndXJlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICBMYWJlbCBsYWJlbCA9IGdldE5hbWVMYWJlbEZpZ3VyZSgpOwotICAgIElDb21wbGV4VHlwZSBjb21wbGV4VHlwZSA9IChJQ29tcGxleFR5cGUpZ2V0TW9kZWwoKTsKLSAgICBpZiAoY29tcGxleFR5cGUuaXNBYnN0cmFjdCgpKQotICAgIHsKLSAgICAgIGlmIChpdGFsaWNGb250ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEZvbnQgZm9udCA9IGxhYmVsLmdldEZvbnQoKTsKLSAgICAgICAgaXRhbGljRm9udCA9IGdldEl0YWxpY0ZvbnQoZm9udCk7Ci0gICAgICB9Ci0gICAgICBpZiAoaXRhbGljRm9udCAhPSBudWxsKQotICAgICAgewotICAgICAgICBsYWJlbC5zZXRGb250KGl0YWxpY0ZvbnQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGFiZWwuc2V0Rm9udChsYWJlbC5nZXRQYXJlbnQoKS5nZXRGb250KCkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gIHsKLSAgICBpZiAoaXRhbGljRm9udCAhPSBudWxsKQotICAgIHsKLSAgICAgIGl0YWxpY0ZvbnQuZGlzcG9zZSgpOwotICAgICAgaXRhbGljRm9udCA9IG51bGw7Ci0gICAgfQotICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzNGI2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0VkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci0KLQotcHVibGljIGNsYXNzIEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsCi17ICAKLSAgcHVibGljIHN0YXRpYyBFZGl0UGFydCBnZXRGaXJzdENoaWxkKEVkaXRQYXJ0IGVkaXRQYXJ0KQotICB7ICAgICAgCi0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChFZGl0UGFydCllZGl0UGFydC5nZXRDaGlsZHJlbigpLmdldCgwKTsKLSAgICB9ICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBFZGl0UGFydCBnZXRMYXN0Q2hpbGQoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsgICAgICAKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOwotICAgIGludCBzaXplID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5zaXplKCk7Ci0gICAgaWYgKHNpemUgPiAwKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChFZGl0UGFydCllZGl0UGFydC5nZXRDaGlsZHJlbigpLmdldChzaXplIC0gMSk7Ci0gICAgfSAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotICAKLSAgcHVibGljIHN0YXRpYyBFZGl0UGFydCBnZXROZXh0U2libGluZyhFZGl0UGFydCBlZGl0UGFydCkKLSAgeyAgICAKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOyAgICAKLSAgICBFZGl0UGFydCBwYXJlbnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsKLSAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICBpbnQgaW5kZXggPSBjaGlsZHJlbi5pbmRleE9mKGVkaXRQYXJ0KTsKLSAgICAgIGlmIChpbmRleCArIDEgPCBjaGlsZHJlbi5zaXplKCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChFZGl0UGFydCljaGlsZHJlbi5nZXQoaW5kZXggKyAxKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBFZGl0UGFydCBnZXRQcmV2U2libGluZyhFZGl0UGFydCBlZGl0UGFydCkKLSAgeyAgICAKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOwotICAgIEVkaXRQYXJ0IHBhcmVudCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpOwotICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIExpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIGludCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2YoZWRpdFBhcnQpOwotICAgICAgaWYgKGluZGV4IC0gMSA+PSAwKQotICAgICAgewotICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjaGlsZAotICAgICAgICAvLyAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IChFZGl0UGFydCljaGlsZHJlbi5nZXQoaW5kZXggLSAxKTsKLSAgICAgIH0gCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9GaWVsZEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0ZpZWxkRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3ZGQzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0ZpZWxkRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi0KLXB1YmxpYyBjbGFzcyBGaWVsZEVkaXRQYXJ0IGV4dGVuZHMgQmFzZUZpZWxkRWRpdFBhcnQKLXsKLSAgcHVibGljIHZvaWQgYWRkTm90aWZ5KCkKLSAgewotICAgIHN1cGVyLmFkZE5vdGlmeSgpOwotICAgIGdldEZpZWxkRmlndXJlKCkuZWRpdFBhcnRBdHRhY2hlZCh0aGlzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JQXV0b0RpcmVjdEVkaXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvSUF1dG9EaXJlY3RFZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZDMxODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JQXV0b0RpcmVjdEVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi0vKioKLSAqIEVkaXQgcGFydHMgdGhhdCBjYW4gYmUgZGlyZWN0IGVkaXRhYmxlCi0gKiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUF1dG9EaXJlY3RFZGl0Ci17Ci0gIHB1YmxpYyB2b2lkIGRvRWRpdE5hbWUoYm9vbGVhbiBhZGRGcm9tRGVzaWduKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvSUNvbm5lY3Rpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvSUNvbm5lY3Rpb25Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2MTI1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0lDb25uZWN0aW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbm5lY3Rpb25Db250YWluZXIKLXsKLSAgcHVibGljIHZvaWQgcmVmcmVzaENvbm5lY3Rpb25zKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0lIb2xkZXJFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JSG9sZGVyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3YTVhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0lIb2xkZXJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUhvbGRlckVkaXRQYXJ0Ci17Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvSU5hbWVkRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvSU5hbWVkRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4NmMyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0lOYW1lZEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU5hbWVkRWRpdFBhcnQKLXsKLSAgcHVibGljIExhYmVsIGdldE5hbWVMYWJlbEZpZ3VyZSgpOwotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGN1cnNvckxvY2F0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvUm9vdENvbnRlbnRFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Sb290Q29udGVudEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNjc3ZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Sb290Q29udGVudEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5QYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Sb290SG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JVHlwZTsKLQotcHVibGljIGNsYXNzIFJvb3RDb250ZW50RWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsKLSAgTGlzdCBjb2xsZWN0aW9ucyA9IG51bGw7Ci0gIEZpZ3VyZSBjb250ZW50UGFuZTsKLSAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsgICAgCi0gICAgUGFuZWwgcGFuZWwgPSBuZXcgUGFuZWwoKTsgICAgCi0gICAgcGFuZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoNjApKTsKLSAgIAotICAgIFRvb2xiYXJMYXlvdXQgcGFuZWxMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgcGFuZWxMYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsKLSAgICBwYW5lbC5zZXRMYXlvdXRNYW5hZ2VyKHBhbmVsTGF5b3V0KTsKLSAgICAKLSAgICBjb250ZW50UGFuZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBwYW5lbC5hZGQoY29udGVudFBhbmUpOwotICAgIAotICAgIFRvb2xiYXJMYXlvdXQgdGIgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgdGIuc2V0TWlub3JBbGlnbm1lbnQoVG9vbGJhckxheW91dC5BTElHTl9DRU5URVIpOwotICAgIHRiLnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgdGIuc2V0U3BhY2luZyg0MCk7Ci0gICAgY29udGVudFBhbmUuc2V0TGF5b3V0TWFuYWdlcih0Yik7Ci0gICAgCi0gICAgcmV0dXJuIHBhbmVsOwotICB9Ci0gIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gY29udGVudFBhbmU7Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgSUNvbXBsZXhUeXBlIGdldFNlbGVjdGVkQ29tcGxleFR5cGUoKQotICB7Ci0gICAgSUNvbXBsZXhUeXBlIHJlc3VsdCA9IG51bGw7Ci0gICAgSU1vZGVsIG1vZGVsID0gKElNb2RlbClnZXRNb2RlbCgpOwotICAgIExpc3QgdHlwZXMgPSBtb2RlbC5nZXRUeXBlcygpOwotICAgIGlmICh0eXBlcy5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIGlmICh0eXBlcy5nZXQoMCkgaW5zdGFuY2VvZiBJQ29tcGxleFR5cGUpIAotICAgICAgICByZXN1bHQgPSAoSUNvbXBsZXhUeXBlKXR5cGVzLmdldCgwKTsKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsgCi0gICAgY29sbGVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKGdldE1vZGVsKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gZ2V0TW9kZWwoKTsKLSAgICAgIElBRFRPYmplY3QgZm9jdXNPYmplY3QgPSBudWxsOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmUpCi0gICAgICB7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJR3JhcGhFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCgoSUdyYXBoRWxlbWVudClvYmopLmlzRm9jdXNBbGxvd2VkKCkpCi0gICAgICAgICAgICBmb2N1c09iamVjdCA9IChJU3RydWN0dXJlKW9iajsgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElGaWVsZCkKLSAgICAgIHsKLSAgICAgICAgZm9jdXNPYmplY3QgPSAoSUZpZWxkKW9iajsKLSAgICAgIH0gIAotICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSU1vZGVsKQotICAgICAgewotICAgICAgICBmb2N1c09iamVjdCA9IChJTW9kZWwpb2JqOwotICAgICAgICBjb2xsZWN0aW9ucy5hZGQoZm9jdXNPYmplY3QpOwotICAgICAgICByZXR1cm4gY29sbGVjdGlvbnM7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJVHlwZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElHcmFwaEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKChJR3JhcGhFbGVtZW50KW9iaikuaXNGb2N1c0FsbG93ZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb2N1c09iamVjdCA9IChJVHlwZSlvYmo7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJR3JhcGhFbGVtZW50KQotICAgICAgewotICAgICAgICBpZiAoKChJR3JhcGhFbGVtZW50KW9iaikuaXNGb2N1c0FsbG93ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgIGZvY3VzT2JqZWN0ID0gKElBRFRPYmplY3Qpb2JqOwotICAgICAgICAgIGNvbGxlY3Rpb25zLmFkZChmb2N1c09iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25zOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZm9jdXNPYmplY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgUm9vdEhvbGRlciBob2xkZXIgPSBuZXcgUm9vdEhvbGRlcihmb2N1c09iamVjdCk7Ci0gICAgICAgIGNvbGxlY3Rpb25zLmFkZChob2xkZXIpOwotICAgICAgICByZXR1cm4gY29sbGVjdGlvbnM7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjb2xsZWN0aW9uczsKLSAgfQotICAgIAotICAKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIERvbid0IGNhbGwgdGhpcyBtZXRob2QuICBVc2UgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlci5zZXRJbnB1dCgpIGluc3RlYWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgc2V0TW9kZWwoY29tcG9uZW50KTsKLSAgICByZWZyZXNoKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCBEb24ndCBjYWxsIHRoaXMgbWV0aG9kLiAgVXNlIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIuZ2V0SW5wdXQoKSBpbnN0ZWFkLgotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TW9kZWwoKTsKLSAgfQotICAKLSAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjU4OQotICBwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpCi0gIHsKLSAgICBzdXBlci5hY3RpdmF0ZSgpOwotICAgIE9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0gICAgLy8gVGhlIHNjaGVtYSBhZGFwdGVyIGRvZXNuJ3QgaGF2ZSB0byBub3RpZnkgdGhlIFJvb3RDb250ZW50RWRpdFBhcnQgb2YgaXQgY2hhbmdlcwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgewotICAgICAgSUFEVE9iamVjdCBvYmplY3QgPSAoSUFEVE9iamVjdCltb2RlbDsKLSAgICAgIG9iamVjdC51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvUm9vdEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1Jvb3RFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDg3NTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvUm9vdEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5CZW5kcG9pbnRDb25uZWN0aW9uUm91dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5ZXJlZFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5TY2FsYWJsZVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5EZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgUm9vdEVkaXRQYXJ0IGV4dGVuZHMgU2NhbGFibGVSb290RWRpdFBhcnQgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5nZWYuUm9vdEVkaXRQYXJ0Ci17ICAgIAotICBwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpCi0gIHsKLSAgICBzdXBlci5hY3RpdmF0ZSgpOwotICAgIC8vIFNldCB1cCBDb25uZWN0aW9uIGxheWVyIHdpdGggYSByb3V0ZXIsIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBoYXZlIG9uZQotICAgIENvbm5lY3Rpb25MYXllciBjb25uZWN0aW9uTGF5ZXIgPSAoQ29ubmVjdGlvbkxheWVyKSBnZXRMYXllcihMYXllckNvbnN0YW50cy5DT05ORUNUSU9OX0xBWUVSKTsKLSAgICBpZiAoY29ubmVjdGlvbkxheWVyICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBjb25uZWN0aW9uTGF5ZXIuc2V0Q29ubmVjdGlvblJvdXRlcihuZXcgQmVuZHBvaW50Q29ubmVjdGlvblJvdXRlcigpKTsKLSAgICB9Ci0KLSAgICBGaWd1cmUgZmlndXJlID0gKEZpZ3VyZSlnZXRMYXllcihMYXllckNvbnN0YW50cy5GRUVEQkFDS19MQVlFUik7ICAgICAgIAotICAgIGlmIChmaWd1cmUgIT0gbnVsbCkKLSAgICB7ICAgICAgCi0gICAgICBpZiAoZ2V0Vmlld2VyKCkgaW5zdGFuY2VvZiBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIpCi0gICAgICB7ICAKLSAgICAgICAgLy9TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgc2d2ID0gKFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcilnZXRWaWV3ZXIoKTsKLSAgICAgICAgLy9JbmRleEZpZ3VyZSBpbmRleEZpZ3VyZSA9IG5ldyBJbmRleEZpZ3VyZShzZ3YpOwotICAgICAgICAvL2ZpZ3VyZS5hZGQoaW5kZXhGaWd1cmUpOwotICAgICAgICAvL2dldFZpZXdlcigpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoaW5kZXhGaWd1cmUpOwotICAgICAgfSAgCi0gICAgfSAgICAgICAgICAgCi0gICAgcmVmcmVzaCgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgTGF5ZXJlZFBhbmUgY3JlYXRlUHJpbnRhYmxlTGF5ZXJzKCkgCi0gIHsKLSAgICBMYXllcmVkUGFuZSBwYW5lID0gc3VwZXIuY3JlYXRlUHJpbnRhYmxlTGF5ZXJzKCk7ICAgIAotICAgIExheWVyIGxheWVyID0gbmV3IFNjYWxlZEhhbmRsZUxheWVyKCk7Ci0gICAgbGF5ZXIuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDUsIDUpKTsKLSAgICBwYW5lLmFkZChsYXllciwgRGVzaWduVmlld2VyR3JhcGhpY0NvbnN0YW50cy5TQ0FMRURfSEFORExFX0xBWUVSKTsgICAgCi0gICAgcmV0dXJuIHBhbmU7Ci0gIH0gIAotICAKLSAgCi0gIGNsYXNzIFNjYWxlZEhhbmRsZUxheWVyIGV4dGVuZHMgTGF5ZXIKLSAgewotICAgIFNjYWxlZEhhbmRsZUxheWVyKCkgCi0gICAgewotICAgICAgc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlI2dldFByZWZlcnJlZFNpemUoaW50LCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KSAKLSAgICB7Ci0gICAgICBSZWN0YW5nbGUgcmVjdCA9IG5ldyBSZWN0YW5nbGUoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0Q2hpbGRyZW4oKS5zaXplKCk7IGkrKykKLSAgICAgICAgcmVjdC51bmlvbigoKElGaWd1cmUpZ2V0Q2hpbGRyZW4oKS5nZXQoaSkpLmdldEJvdW5kcygpKTsKLSAgICAgIHJldHVybiByZWN0LmdldFNpemUoKTsKLSAgICB9Ci0gIH0gIAotICAKLSAgY2xhc3MgSW5kZXhGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0gIHsKLSAgICBFZGl0UGFydCBlZGl0UGFydDsKLSAgICBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgc2d2OwotICAgIHB1YmxpYyBJbmRleEZpZ3VyZShTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgc2d2KQotICAgIHsKLSAgICAgIHRoaXMuc2d2ID0gc2d2OyAgICAgIAotICAgICAgKChGaWd1cmVDYW52YXMpc2d2LmdldENvbnRyb2woKSkuZ2V0Vmlld3BvcnQoKS5nZXRIb3Jpem9udGFsUmFuZ2VNb2RlbCgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAoKEZpZ3VyZUNhbnZhcylzZ3YuZ2V0Q29udHJvbCgpKS5nZXRWaWV3cG9ydCgpLmdldFZlcnRpY2FsUmFuZ2VNb2RlbCgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgICBSZWN0YW5nbGUgYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCA0MCwgNDApOwotICAgICAgdHJhbnNsYXRlVG9BYnNvbHV0ZShib3VuZHMpOyAgICAgIAotICAgICAgc2V0Qm91bmRzKGJvdW5kcyk7ICAgICAgIAotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNjcm9sbC1jaGFuZ2UiKTsKLSAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDQwLCA0MCk7Ci0gICAgICBQb2ludCBwID0gKChGaWd1cmVDYW52YXMpc2d2LmdldENvbnRyb2woKSkuZ2V0Vmlld3BvcnQoKS5nZXRWaWV3TG9jYXRpb24oKTsKLSAgICAgIGJvdW5kcy50cmFuc2xhdGUocCk7Ci0gICAgICBzZXRCb3VuZHMoYm91bmRzKTsgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkKLSAgICB7Ci0gICAgICBQb2ludCBwID0gKChGaWd1cmVDYW52YXMpc2d2LmdldENvbnRyb2woKSkuZ2V0Vmlld3BvcnQoKS5nZXRWaWV3TG9jYXRpb24oKTsKLSAgICAgIGJvdW5kcy50cmFuc2xhdGUocCk7ICAgICAgCi0gICAgICByZXR1cm4gc3VwZXIuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpLnRyYW5zbGF0ZShwKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvUm9vdEhvbGRlckVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1Jvb3RIb2xkZXJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGFkMDU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvUm9vdEhvbGRlckVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUGFuZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Gb2N1c1R5cGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5SZWZlcmVuY2VkVHlwZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlJvb3RIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBSb290SG9sZGVyRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQgaW1wbGVtZW50cyBJSG9sZGVyRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIFBhbmVsIHBhbmVsOwotICAKLSAgcHVibGljIFJvb3RIb2xkZXJFZGl0UGFydCgpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBwYW5lbCA9IG5ldyBQYW5lbCgpOyAgICAKLSAgICBUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KHRydWUpOwotICAgIGxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsKLSAgICBsYXlvdXQuc2V0U3BhY2luZygxMDApOwotICAgIHBhbmVsLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsgICAgCi0KLSAgICByZXR1cm4gcGFuZWw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIExpc3QgY29sbGVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgUm9vdEhvbGRlciBob2xkZXIgPSAoUm9vdEhvbGRlcilnZXRNb2RlbCgpOwotICAgIElBRFRPYmplY3QgZm9jdXNPYmplY3QgPSBob2xkZXIuZ2V0TW9kZWwoKTsKLSAgICBjb2xsZWN0aW9ucy5hZGQobmV3IEZvY3VzVHlwZUNvbHVtbihmb2N1c09iamVjdCkpOwotICAgIGNvbGxlY3Rpb25zLmFkZChuZXcgUmVmZXJlbmNlZFR5cGVDb2x1bW4oZm9jdXNPYmplY3QpKTsKLSAgICByZXR1cm4gY29sbGVjdGlvbnM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1NlY3Rpb25FZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9TZWN0aW9uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1YWY0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1NlY3Rpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBTZWN0aW9uRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIElDb21wbGV4VHlwZSBjb21wbGV4VHlwZTsKLSAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBGaWd1cmUgZmlnID0gbmV3IEZpZ3VyZSgpOwotICAgIGZpZy5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOwotICAgIHJldHVybiBmaWc7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RhYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9TdHJ1Y3R1cmVFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9TdHJ1Y3R1cmVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjdiZmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvU3RydWN0dXJlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Mb2NhdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkNvbXBhcnRtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuQURURGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLktleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSVN0cnVjdHVyZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuU3BhY2VGaWxsZXJGb3JGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZUVkaXRQYXJ0IGV4dGVuZHMgQmFzZVR5cGVDb25uZWN0aW5nRWRpdFBhcnQgaW1wbGVtZW50cyBJTmFtZWRFZGl0UGFydAoteyAgCi0gIHByb3RlY3RlZCBMaXN0IGNvbXBhcnRtZW50TGlzdCA9IG51bGw7Ci0gIHByb3RlY3RlZCBBRFREaXJlY3RFZGl0UG9saWN5IGFkdERpcmVjdEVkaXRQb2xpY3kgPSBuZXcgQURURGlyZWN0RWRpdFBvbGljeSgpOwotICBwcm90ZWN0ZWQgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZTsKLSAgcHJvdGVjdGVkIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GZWVkYmFja0ZpZ3VyZTsKLQotICAvKioKLSAgICogVE9ETyBjcy4uLiBJJ20gc3VyZSB0aGlzIGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCB0aGUgd2F5IHdlIHdhbnRlZCB0byByZXdvcmsgY29tcGFydG1lbnQgY3JlYXRpb24KLSAgICogSSBzdXBwb3NlIHdlIGNvdWxkIGhhdmUgc3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mIGdldE1vZGVsQ2hpbGRyZW4oKQotICAgKiAKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBDb21wYXJ0bWVudFtdIGdldENvbXBhcnRtZW50cygpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIElTdHJ1Y3R1cmVGaWd1cmUgZmlndXJlID0gZ2V0RmlndXJlRmFjdG9yeSgpLmNyZWF0ZVN0cnVjdHVyZUZpZ3VyZShnZXRNb2RlbCgpKTsKLSAgICByZXR1cm4gZmlndXJlOwotICB9Ci0gIAotICBwdWJsaWMgSVN0cnVjdHVyZUZpZ3VyZSBnZXRTdHJ1Y3R1cmVGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIChJU3RydWN0dXJlRmlndXJlKWdldEZpZ3VyZSgpOwotICB9Ci0gIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0U3RydWN0dXJlRmlndXJlKCkuZ2V0Q29udGVudFBhbmUoKTsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBkb0dldFJlbGF0aXZlRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOyAgICAgICAgICAgICAgIAotICAgIGlmIChkaXJlY3Rpb24gPT0gS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5JTl9UT19GSVJTVF9DSElMRCkKLSAgICB7ICAgICAgICAgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7ICAgICAgICAgICAgCi0gICAgICAgIENvbXBhcnRtZW50RWRpdFBhcnQgY29tcGFydG1lbnQgPSAoQ29tcGFydG1lbnRFZGl0UGFydClpLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbXBhcnRtZW50Lmhhc0NvbnRlbnQoKSkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoSXRlcmF0b3IgY29udGVudENoaWxkcmVuID0gY29tcGFydG1lbnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjb250ZW50Q2hpbGRyZW4uaGFzTmV4dCgpOyApCi0gICAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IGNoaWxkID0gY29udGVudENoaWxkcmVuLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFNlY3Rpb25FZGl0UGFydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU2VjdGlvbkVkaXRQYXJ0IHBhcnQgPSAoU2VjdGlvbkVkaXRQYXJ0KSBjaGlsZDsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KXBhcnQuZ2V0Q2hpbGRyZW4oKS5nZXQoMCk7Ci0gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIEJhc2VGaWVsZEVkaXRQYXJ0ICYmICghKGNoaWxkIGluc3RhbmNlb2YgU3BhY2VGaWxsZXJGb3JGaWVsZEVkaXRQYXJ0KSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IChFZGl0UGFydCljaGlsZDsKLSAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgfSAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIHN1cGVyLmRvR2V0UmVsYXRpdmVFZGl0UGFydChlZGl0UGFydCwgZGlyZWN0aW9uKTsKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OyAgICAgICAgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsgICAgICAgIAotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOyAgCi0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3IEFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeSgpKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsIGFkdERpcmVjdEVkaXRQb2xpY3kpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSVN0cnVjdHVyZSBnZXRTdHJ1Y3R1cmUoKQotICB7Ci0gICAgcmV0dXJuIChJU3RydWN0dXJlKWdldE1vZGVsKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgaWYgKGNvbXBhcnRtZW50TGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIGNvbXBhcnRtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIAotICAgICAgLy8gVE9ETy4uIHRoaXMgbmVlZHMgdG8gYmUgbW92ZWQgdG8gdGhlIHhzZCBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoaXMgY2xhc3MgCi0gICAgICBjb21wYXJ0bWVudExpc3QuYWRkKG5ldyBDb21wYXJ0bWVudChnZXRTdHJ1Y3R1cmUoKSwgImF0dHJpYnV0ZSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgY29tcGFydG1lbnRMaXN0LmFkZChuZXcgQ29tcGFydG1lbnQoZ2V0U3RydWN0dXJlKCksICJlbGVtZW50IikpOyAgICAvLyROT04tTkxTLTEkCi0gICAgfSAgCi0gICAgcmV0dXJuIGNvbXBhcnRtZW50TGlzdDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENoaWxkcmVuKCkKLSAgeyAgIAotICAgIHN1cGVyLnJlZnJlc2hDaGlsZHJlbigpOwotICAgIC8vZ2V0RmlndXJlKCkuaW52YWxpZGF0ZVRyZWUoKTsgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgZ2V0U3RydWN0dXJlRmlndXJlKCkucmVmcmVzaFZpc3VhbHMoZ2V0TW9kZWwoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotICAgIGdldFN0cnVjdHVyZUZpZ3VyZSgpLmFkZFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0gICAgc3VwZXIuYWRkRmVlZGJhY2soKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgZ2V0U3RydWN0dXJlRmlndXJlKCkucmVtb3ZlU2VsZWN0aW9uRmVlZGJhY2soKTsKLSAgICBzdXBlci5yZW1vdmVGZWVkYmFjaygpOyAgICAKLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBnZXROYW1lTGFiZWxGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGdldFN0cnVjdHVyZUZpZ3VyZSgpLmdldE5hbWVMYWJlbCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgY3Vyc29yTG9jYXRpb24pCi0gIHsKLSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkKLSAgeyAgCi0gICAgaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUKQotICAgIHsKLSAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KQotICAgICAgewotICAgICAvLyB1bmNvbW1lbnQgZm9yIGRpcmVjdCBlZGl0IG9mIG5hbWUgKGFkZCBlbHNlKQotLy8gICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KXJlcXVlc3Q7Ci0vLyAgICAgICAgUG9pbnQgcCA9IGxvY2F0aW9uUmVxdWVzdC5nZXRMb2NhdGlvbigpOwotLy8gICAgICAgIGlmIChoaXRUZXN0KGdldE5hbWVMYWJlbEZpZ3VyZSgpLCBwKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBMYWJlbEVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTGFiZWxFZGl0TWFuYWdlcih0aGlzLCBuZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcih0aGlzLCBwKSk7Ci0vLyAgICAgICAgICBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIgd3JhcHBlciA9IG5ldyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIoKTsKLS8vICAgICAgICAgIGFkdERpcmVjdEVkaXRQb2xpY3kuc2V0VXBkYXRlQ29tbWFuZCh3cmFwcGVyKTsKLS8vICAgICAgICAgIG1hbmFnZXIuc2hvdygpOwotLy8gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfT1BFTikKLSAgICB7Ci0gICAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0gICAgICB7Ci0gICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KXJlcXVlc3Q7Ci0gICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgIAotICAgICAgICBpZiAoZ2V0U3RydWN0dXJlRmlndXJlKCkuaGl0VGVzdEhlYWRlcihwKSkKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICAvLyBUT0RPOiAhISEgVGhpcyBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIGFkdC14c2QgcGFja2FnZQotICAgICAgICAgIC8vIAotICAgICAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpICAgICAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlciltb2RlbDsKLSAgICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pYWRhcHRlci5nZXRUYXJnZXQoKTsKLSAgICAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgICBPYmplY3Qgc2NoZW1hID0gZWRpdG9yUGFydC5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgICAgICAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IGdldEVkaXRvckFjdGlvblJlZ2lzdHJ5KGVkaXRvclBhcnQpOwotICAgICAgICAgICAgaWYgKHJlZ2lzdHJ5ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChzY2hlbWEgPT0gY3QuZ2V0U2NoZW1hKCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihTZXRJbnB1dFRvR3JhcGhWaWV3LklEKTsKLSAgICAgICAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUFjdGlvbiBhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICAgICAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgQWN0aW9uUmVnaXN0cnkgZ2V0RWRpdG9yQWN0aW9uUmVnaXN0cnkoSUVkaXRvclBhcnQgZWRpdG9yKQotICB7Ci0gICAgcmV0dXJuIChBY3Rpb25SZWdpc3RyeSkgZWRpdG9yLmdldEFkYXB0ZXIoQWN0aW9uUmVnaXN0cnkuY2xhc3MpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREcmF3Q29ubmVjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZGVyVGV4dCgpCi0gIHsKLSAgCSAvLyByZXR1cm4gZ2V0U3RydWN0dXJlRmlndXJlKCkuZ2V0TmFtZUxhYmVsKCkuZ2V0VGV4dCgpOwotICAJcmV0dXJuIGdldE5hbWVMYWJlbEZpZ3VyZSgpLmdldFRleHQoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvVG9wTGV2ZWxGaWVsZEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1RvcExldmVsRmllbGRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWQwMTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvVG9wTGV2ZWxGaWVsZEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5Cb3hGaWd1cmU7Ci0KLXB1YmxpYyBjbGFzcyBUb3BMZXZlbEZpZWxkRWRpdFBhcnQgZXh0ZW5kcyBCb3hFZGl0UGFydCBpbXBsZW1lbnRzIElOYW1lZEVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBBRFREaXJlY3RFZGl0UG9saWN5IGFkdERpcmVjdEVkaXRQb2xpY3kgPSBuZXcgQURURGlyZWN0RWRpdFBvbGljeSgpOwotICBwcml2YXRlIEZvbnQgaXRhbGljRm9udDsKLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3VsZERyYXdDb25uZWN0aW9uKCkKLSAgewotICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpZ2V0TW9kZWwoKTsKLSAgICBJVHlwZSB0eXBlID0gZmllbGQuZ2V0VHlwZSgpOwotICAgIHJldHVybiAodHlwZSAhPSBudWxsKTsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoKQotICB7Ci0gICAgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZSA9IG51bGw7Ci0gICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClnZXRNb2RlbCgpOwotICAgIElUeXBlIHR5cGUgPSBmaWVsZC5nZXRUeXBlKCk7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICB7ICAgICAgCi0gICAgICBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJlZmVyZW5jZVR5cGVQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpZ2V0Vmlld2VyKCkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCh0eXBlKTsKLSAgICAgIGlmIChyZWZlcmVuY2VUeXBlUGFydCAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb25uZWN0aW9uRmlndXJlID0gbmV3IFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uKCk7ICAgCi0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5SSUdIVCwgMCkpOwotICAgICAgICBpbnQgdGFyZ2V0QW5jaG9yWU9mZnNldCA9IDEyOyAgICAgICAgCi0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IocmVmZXJlbmNlVHlwZVBhcnQuZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5IRUFERVJfTEVGVCwgMCwgdGFyZ2V0QW5jaG9yWU9mZnNldCkpOyAKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotICAgICAgfQotICAgIH0gICAgCi0gICAgcmV0dXJuIGNvbm5lY3Rpb25GaWd1cmU7Ci0gIH0gIAotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgYWR0RGlyZWN0RWRpdFBvbGljeSk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3IEFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeSgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpZ2V0TW9kZWwoKTsKLSAgICBCb3hGaWd1cmUgYm94RmlndXJlID0gKEJveEZpZ3VyZSlnZXRGaWd1cmUoKTsKLSAgICBMYWJlbCBsYWJlbCA9IGJveEZpZ3VyZS5nZXROYW1lTGFiZWwoKTsKLSAgICBsYWJlbC5zZXRUZXh0KGZpZWxkLmdldE5hbWUoKSk7Ci0gICAgaWYgKGZpZWxkLmlzQWJzdHJhY3QoKSkKLSAgICB7Ci0gICAgICBpZiAoaXRhbGljRm9udCA9PSBudWxsKQotICAgICAgewotICAgICAgICBGb250IGZvbnQgPSBsYWJlbC5nZXRGb250KCk7Ci0gICAgICAgIGl0YWxpY0ZvbnQgPSBnZXRJdGFsaWNGb250KGZvbnQpOwotICAgICAgfQotICAgICAgaWYgKGl0YWxpY0ZvbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGFiZWwuc2V0Rm9udChpdGFsaWNGb250KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxhYmVsLnNldEZvbnQobGFiZWwuZ2V0UGFyZW50KCkuZ2V0Rm9udCgpKTsKLSAgICB9Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gIHsKLSAgICBpZiAoaXRhbGljRm9udCAhPSBudWxsKQotICAgIHsKLSAgICAgIGl0YWxpY0ZvbnQuZGlzcG9zZSgpOwotICAgICAgaXRhbGljRm9udCA9IG51bGw7Ci0gICAgfQotICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgfQotICAKLSAgcHVibGljIExhYmVsIGdldE5hbWVMYWJlbEZpZ3VyZSgpCi0gIHsKLSAgICBCb3hGaWd1cmUgYm94RmlndXJlID0gKEJveEZpZ3VyZSlnZXRGaWd1cmUoKTsKLSAgICByZXR1cm4gYm94RmlndXJlLmdldE5hbWVMYWJlbCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgY3Vyc29yTG9jYXRpb24pCi0gIHsKLSAgIAotICB9Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZGVyVGV4dCgpCi0gIHsKLQkgIHJldHVybiAgZ2V0TmFtZUxhYmVsRmlndXJlKCkuZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAKLSAgICBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVR8fAotICAgICAgICByZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsKLS8vICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0vLyAgICAgIHsKLS8vICAgICAgICBMb2NhdGlvblJlcXVlc3QgbG9jYXRpb25SZXF1ZXN0ID0gKExvY2F0aW9uUmVxdWVzdClyZXF1ZXN0OwotLy8gICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLS8vICAgICAgIAotLy8gICAgICAgIGlmIChoaXRUZXN0KGdldE5hbWVMYWJlbEZpZ3VyZSgpLCBwKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBMYWJlbEVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTGFiZWxFZGl0TWFuYWdlcih0aGlzLCBuZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcih0aGlzLCBwKSk7Ci0vLyAgICAgICAgICBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIgd3JhcHBlciA9IG5ldyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIoKTsKLS8vICAgICAgICAgIGFkdERpcmVjdEVkaXRQb2xpY3kuc2V0VXBkYXRlQ29tbWFuZCh3cmFwcGVyKTsKLS8vICAgICAgICAgIG1hbmFnZXIuc2hvdygpOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9UeXBlUmVmZXJlbmNlQ29ubmVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9UeXBlUmVmZXJlbmNlQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDdkYTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvblJvdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hbmhhdHRhbkNvbm5lY3Rpb25Sb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlnb25EZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotcHVibGljIGNsYXNzIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGV4dGVuZHMgUG9seWxpbmVDb25uZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBib29sZWFuIGhpZ2hsaWdodCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbG9yIGFjdGl2ZUNvbm5lY3Rpb24gPSBDb2xvckNvbnN0YW50cy5ibGFjazsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb2xvciBpbmFjdGl2ZUNvbm5lY3Rpb24gPSBuZXcgQ29sb3IobnVsbCwgMTk4LCAxOTUsIDE5OCk7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgY29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNldFRhcmdldERlY29yYXRpb24obmV3IFBvbHlnb25EZWNvcmF0aW9uKCkpOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24oYm9vbGVhbiBmaWxsKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBQb2x5Z29uRGVjb3JhdGlvbiBkZWMgPSBuZXcgUG9seWdvbkRlY29yYXRpb24oKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCB2b2lkIGZpbGxTaGFwZShHcmFwaGljcyBnKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGcucHVzaFN0YXRlKCk7Ci0gICAgICAgICAgZy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgICAgICAgIHN1cGVyLmZpbGxTaGFwZShnKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICBnLnBvcFN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH07Ci0gICAgZGVjLnNldEZpbGwoZmlsbCk7Ci0gICAgZGVjLnNldFRlbXBsYXRlKFBvbHlnb25EZWNvcmF0aW9uLlRSSUFOR0xFX1RJUCk7Ci0gICAgZGVjLnNldFNjYWxlKDE0LDYpOwotICAgIHNldFRhcmdldERlY29yYXRpb24oZGVjKTsKLSAgfQotICAKLQotICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUm91dGVyKENvbm5lY3Rpb25Sb3V0ZXIgY3IpCi0gIHsKLSAgICBpZiAoY3IgIT0gbnVsbCAmJiBnZXRDb25uZWN0aW9uUm91dGVyKCkgIT0gbnVsbCAmJiAhKGdldENvbm5lY3Rpb25Sb3V0ZXIoKSBpbnN0YW5jZW9mIE1hbmhhdHRhbkNvbm5lY3Rpb25Sb3V0ZXIpKQotICAgICAgc3VwZXIuc2V0Q29ubmVjdGlvblJvdXRlcihjcik7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjdXJyZW50IGhpZ2hsaWdodCBzdGF0dXMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZ2hsaWdodGVkKCkKLSAgewotICAgIHJldHVybiBoaWdobGlnaHQ7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGhpZ2hsaWdodAotICAgKiAgICAgICAgICBUaGUgaGlnaGxpZ2h0IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhpZ2hsaWdodChib29sZWFuIGhpZ2hsaWdodCkKLSAgewotICAgIHRoaXMuaGlnaGxpZ2h0ID0gaGlnaGxpZ2h0OwotICAgIC8vIFVwZGF0ZSBvdXIgY29ubmVjdGlvbiB0byB1c2UgdGhlIGNvcnJlY3QgY29sb3VyaW5nCi0gICAgYm9vbGVhbiBoaWdoQ29udHJhc3QgPSBmYWxzZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBoaWdoQ29udHJhc3QgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRIaWdoQ29udHJhc3QoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgaWYgKGhpZ2hDb250cmFzdCkKLSAgICB7Ci0gICAgICBzZXRGb3JlZ3JvdW5kQ29sb3IoaGlnaGxpZ2h0ID8gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EKSA6IENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRGb3JlZ3JvdW5kQ29sb3IoaGlnaGxpZ2h0ID8gYWN0aXZlQ29ubmVjdGlvbiA6IGluYWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgfQotICAgIHNldE9wYXF1ZShoaWdobGlnaHQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0Fic3RyYWN0TW9kZWxDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0Fic3RyYWN0TW9kZWxDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZWI4OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9BYnN0cmFjdE1vZGVsQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIElBRFRPYmplY3QKLXsKLSAgcHJvdGVjdGVkIElBRFRPYmplY3QgbW9kZWw7Ci0gIHByb3RlY3RlZCBTdHJpbmcga2luZDsKLSAgCi0gIHB1YmxpYyBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbihJQURUT2JqZWN0IG1vZGVsLCBTdHJpbmcga2luZCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRNb2RlbCgpCi0gIHsKLSAgICByZXR1cm4gbW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNb2RlbChJQURUT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRLaW5kKCkKLSAgewotICAgIHJldHVybiBraW5kOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0S2luZChTdHJpbmcga2luZCkKLSAgewotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldENoaWxkcmVuKCk7Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBtb2RlbC5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBtb2RlbC51bnJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXIpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Bbm5vdGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2N2E3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uCi17Ci0gIENvbXBhcnRtZW50IGNvbXBhcnRtZW50OwotICBwdWJsaWMgQW5ub3RhdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb21wYXJ0bWVudChDb21wYXJ0bWVudCBjb21wYXJ0bWVudCkKLSAgewotICAgIHRoaXMuY29tcGFydG1lbnQgPSBjb21wYXJ0bWVudDsKLSAgfQotICAKLSAgcHVibGljIENvbXBhcnRtZW50IGdldENvbXBhcnRtZW50KCkKLSAgewotICAgIHJldHVybiBjb21wYXJ0bWVudDsKLSAgfQotICAKLSAgcHVibGljIElTdHJ1Y3R1cmUgZ2V0T3duZXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbXBhcnRtZW50LmdldE93bmVyKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQ29tcGFydG1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQ29tcGFydG1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI4Y2Q0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0NvbXBhcnRtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JU3RydWN0dXJlOwotCi1wdWJsaWMgY2xhc3MgQ29tcGFydG1lbnQgaW1wbGVtZW50cyBJQURUT2JqZWN0Ci17Ci0gIFN0cmluZyBraW5kOwotICBJU3RydWN0dXJlIG93bmVyOwotCi0gIHB1YmxpYyBDb21wYXJ0bWVudChJU3RydWN0dXJlIG93bmVyLCBTdHJpbmcga2luZCkKLSAgewotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgdGhpcy5vd25lciA9IG93bmVyOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG93bmVyLmdldEZpZWxkcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKSBpLm5leHQoKTsKLSAgICAgIGlmIChraW5kID09IG51bGwgfHwga2luZC5lcXVhbHMoZmllbGQuZ2V0S2luZCgpKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoZmllbGQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2luZCgpCi0gIHsKLSAgICByZXR1cm4ga2luZDsKLSAgfQotICAKLSAgcHVibGljIElTdHJ1Y3R1cmUgZ2V0T3duZXIoKQotICB7Ci0gICAgcmV0dXJuIG93bmVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICAvLyByZWFsbHkgd2Ugd2FudCB0byBsaXN0ZW4gdG8gdGhlIG93bmVyCi0gICAgb3duZXIucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgLy8gcmVhbGx5IHdlIHdhbnQgdG8gbGlzdGVuIHRvIHRoZSBvd25lcgotICAgIG93bmVyLnVucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Gb2N1c1R5cGVDb2x1bW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvRm9jdXNUeXBlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYTZmYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Gb2N1c1R5cGVDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotCi1wdWJsaWMgY2xhc3MgRm9jdXNUeXBlQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGb2N1c09iamVjdCA9IGZhbHNlOwotICAKLSAgcHVibGljIEZvY3VzVHlwZUNvbHVtbihJQURUT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgc3VwZXIobW9kZWwsICJGb2N1c1R5cGVDb2x1bW4iKTsgLy8kTk9OLU5MUy0xJCAgCi0gIH0KLQotICBwdWJsaWMgRm9jdXNUeXBlQ29sdW1uKElBRFRPYmplY3QgbW9kZWwsIGJvb2xlYW4gaXNGb2N1c09iamVjdCkKLSAgewotICAgIHN1cGVyKG1vZGVsLCAiRm9jdXNUeXBlQ29sdW1uIik7IC8vJE5PTi1OTFMtMSQKLSAgICB0aGlzLmlzRm9jdXNPYmplY3QgPSBpc0ZvY3VzT2JqZWN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7ICAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJVHlwZSkKLSAgICB7Ci0gICAgICBJVHlwZSB0eXBlID0gKElUeXBlKW1vZGVsOwotICAgICAgaWYgKHR5cGUuZ2V0U3VwZXJUeXBlKCkgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQuYWRkKHR5cGUuZ2V0U3VwZXJUeXBlKCkpOwotICAgICAgfQotICAgICAgcmVzdWx0LmFkZCh0eXBlKTsKLSAgICB9ICAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElGaWVsZCB8fAotICAgICAgICAgICAgIG1vZGVsIGluc3RhbmNlb2YgSVN0cnVjdHVyZSkKLSAgICB7ICAgCi0gICAgICByZXN1bHQuYWRkKG1vZGVsKTsKLSAgICB9ICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7ICAgICAgIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzT2JqZWN0KCkKLSAgewotICAgIHJldHVybiBpc0ZvY3VzT2JqZWN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lBY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg0NDNmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpb25Qcm92aWRlcgotewotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSUZlZWRiYWNrSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JRmVlZGJhY2tIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZTg2MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JRmVlZGJhY2tIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBJRmVlZGJhY2tIYW5kbGVyCi17Ci0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCk7Ci0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lHcmFwaEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSUdyYXBoRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjJmNWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSUdyYXBoRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1wdWJsaWMgaW50ZXJmYWNlIElHcmFwaEVsZW1lbnQKLXsKLSAgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpOwotICBJQURUT2JqZWN0IGdldFRvcENvbnRhaW5lcigpOwotICBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKTsKLSAgSU1vZGVsIGdldE1vZGVsKCk7Ci0gIGJvb2xlYW4gaXNSZWFkT25seSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JTW9kZWxQcm94eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JTW9kZWxQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjYzYzM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSU1vZGVsUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBJTW9kZWxQcm94eQotewotICBJTW9kZWwgZ2V0TW9kZWwoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvUmVmZXJlbmNlZFR5cGVDb2x1bW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvUmVmZXJlbmNlZFR5cGVDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmODk3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1JlZmVyZW5jZWRUeXBlQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VkVHlwZUNvbHVtbiBleHRlbmRzIEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uCi17Ci0gIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICBJbnRlcm5hbExpc3RlbmVyIGludGVybmFsTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxMaXN0ZW5lcigpOwotICAKLSAgLy8gdG9kby4uLiByZWFsbHkgdGhpcyB0aGlzIG1vZGVsIG9iamVjdCBzaG91bGQgbGlzdGVuCi0gIC8vIHRvIHRoZSBwYXJlbnQgb2YgdGhlIElUeXBlCi0gIC8vCi0gIHB1YmxpYyBSZWZlcmVuY2VkVHlwZUNvbHVtbihJQURUT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgc3VwZXIobW9kZWwsICJSZWZlcmVuY2VkVHlwZUNvbHVtbiIpOyAvLyROT04tTkxTLTEkCi0gICAgbW9kZWwucmVnaXN0ZXJMaXN0ZW5lcihpbnRlcm5hbExpc3RlbmVyKTsKLSAgICBpbnRlcm5hbExpc3RlbmVyLnJlY29tcHV0ZVN1Ykxpc3RlbmVycygpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7ICAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlKQotICAgIHsKLSAgICAgIElTdHJ1Y3R1cmUgc3RydWN0dXJlID0gKElTdHJ1Y3R1cmUpbW9kZWw7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzdHJ1Y3R1cmUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClpLm5leHQoKTsKLSAgICAgICAgSVR5cGUgdHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgIC8vICYmIHR5cGUuaXNDb21wbGV4VHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnModHlwZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBJR3JhcGhFbGVtZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoKChJR3JhcGhFbGVtZW50KXR5cGUpLmlzRm9jdXNBbGxvd2VkKCkpCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZCh0eXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICB9ICAgICAgICAKLSAgICB9ICAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElGaWVsZCkKLSAgICB7Ci0gICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKW1vZGVsOwotICAgICAgSVR5cGUgdHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLSAgICAgIGlmICh0eXBlICE9IG51bGwpIC8vICAmJiB0eXBlLmlzQ29tcGxleFR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBJR3JhcGhFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCgoSUdyYXBoRWxlbWVudCl0eXBlKS5pc0ZvY3VzQWxsb3dlZCgpKQotICAgICAgICAgICAgcmVzdWx0LmFkZCh0eXBlKTsgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0gIAotICBwdWJsaWMgdm9pZCByZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICB9ICAgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoT2JqZWN0IGNoYW5nZWRPYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIExpc3QgY2xvbmVkTGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGNsb25lZExpc3RlbmVyTGlzdC5hZGRBbGwobGlzdGVuZXJMaXN0KTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjbG9uZWRMaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIgPSAoSUFEVE9iamVjdExpc3RlbmVyKWkubmV4dCgpOwotICAgICAgbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKHRoaXMsIG51bGwpOwotICAgIH0gCi0gIH0gICAKLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBJbnRlcm5hbExpc3RlbmVyIGltcGxlbWVudHMgSUFEVE9iamVjdExpc3RlbmVyCi0gIHsKLSAgICBMaXN0IGZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHZvaWQgcmVjb21wdXRlU3ViTGlzdGVuZXJzKCkKLSAgICB7Ci0gICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlKQotICAgICAgeyAgCi0gICAgICAgIC8vIHJlbW92ZSBvbGQgb25lcwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBmaWVsZHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZCkgaS5uZXh0KCk7Ci0gICAgICAgICAgZmllbGQudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGFkZCBuZXcgb25lcwotICAgICAgICBmaWVsZHMuY2xlYXIoKTsKLSAgICAgICAgSVN0cnVjdHVyZSBjb21wbGV4VHlwZSA9IChJU3RydWN0dXJlKSBtb2RlbDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29tcGxleFR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZCkgaS5uZXh0KCk7Ci0gICAgICAgICAgZmllbGRzLmFkZChmaWVsZCk7Ci0gICAgICAgICAgZmllbGQucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgaWYgKG9iamVjdCA9PSBtb2RlbCkKLSAgICAgIHsKLSAgICAgICAgLy8gd2UgbmVlZCB0byB1cGRhdGUgdGhlIGZpZWxkcyB3ZSdyZSBsaXN0ZW5pbmcgdG9vCi0gICAgICAgIC8vIHNpbmNlIHRoZXNlIG1heSBoYXZlIGNoYW5nZWQKLSAgICAgICAgcmVjb21wdXRlU3ViTGlzdGVuZXJzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgICB7Ci0gICAgICB9ICAKLSAgICAgIG5vdGlmeUxpc3RlbmVycyhvYmplY3QsIHByb3BlcnR5KTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvUm9vdEhvbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Sb290SG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhN2IzYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Sb290SG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLQotcHVibGljIGNsYXNzIFJvb3RIb2xkZXIKLXsKLSAgSUFEVE9iamVjdCBtb2RlbDsKLQotICBwdWJsaWMgUm9vdEhvbGRlcihJQURUT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0TW9kZWwoKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0FEVERpcmVjdEVkaXRQb2xpY3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvQURURGlyZWN0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2YyMmIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvQURURGlyZWN0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LkNvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBBRFREaXJlY3RFZGl0UG9saWN5IGV4dGVuZHMgRGlyZWN0RWRpdFBvbGljeQotewotICBwcm90ZWN0ZWQgQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlciBkZWxlZ2F0ZTsKLSAgcHJvdGVjdGVkIElBRFRVcGRhdGVDb21tYW5kIGNvbW1hbmQ7Ci0KLSAgcHVibGljIEFEVERpcmVjdEVkaXRQb2xpY3koKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCBzZXRVcGRhdGVDb21tYW5kKElBRFRVcGRhdGVDb21tYW5kIGNvbW1hbmQpCi0gIHsKLSAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzaG93Q3VycmVudEVkaXRWYWx1ZShEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSAKLSAgeyAgICAgIAotICAgIGdldEhvc3RGaWd1cmUoKS5nZXRVcGRhdGVNYW5hZ2VyKCkucGVyZm9ybVVwZGF0ZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGlyZWN0RWRpdENvbW1hbmQoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIGNvbW1hbmQuc2V0UmVxdWVzdChyZXF1ZXN0KTsKLSAgICByZXR1cm4gKENvbW1hbmQpY29tbWFuZDsgCi0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0FEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0NzE2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0FEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JRmVlZGJhY2tIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5IGV4dGVuZHMgU2VsZWN0aW9uRWRpdFBvbGljeQotewotCi0gIHB1YmxpYyBBRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3koKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKQotICB7Ci0gICAgaWYgKGdldEhvc3QoKSBpbnN0YW5jZW9mIElGZWVkYmFja0hhbmRsZXIpCi0gICAgewotICAgICAgKChJRmVlZGJhY2tIYW5kbGVyKSBnZXRIb3N0KCkpLnJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpCi0gIHsKLSAgICBpZiAoZ2V0SG9zdCgpIGluc3RhbmNlb2YgSUZlZWRiYWNrSGFuZGxlcikKLSAgICB7Ci0gICAgICAoKElGZWVkYmFja0hhbmRsZXIpIGdldEhvc3QoKSkuYWRkRmVlZGJhY2soKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNob3dGb2N1cygpCi0gIHsKLSAgICBzdXBlci5zaG93Rm9jdXMoKTsKLSAgICBnZXRIb3N0KCkuc2V0Rm9jdXModHJ1ZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhpZGVGb2N1cygpCi0gIHsKLSAgICBzdXBlci5oaWRlRm9jdXMoKTsKLSAgICBnZXRIb3N0KCkuc2V0Rm9jdXMoZmFsc2UpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0RpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTFiNDkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llczsKLSAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLQotcHVibGljIGludGVyZmFjZSBEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUKLXsgICAgICAgCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1FZGl0KENlbGxFZGl0b3IgY2VsbEVkaXRvcik7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvSUFEVFVwZGF0ZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvSUFEVFVwZGF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjNGViNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0lBRFRVcGRhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLQotcHVibGljIGludGVyZmFjZSBJQURUVXBkYXRlQ29tbWFuZAotewotICB2b2lkIHNldFJlcXVlc3QoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0tleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDBlZTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkdyYXBoaWNhbEVkaXRQb2xpY3k7Ci0KLXB1YmxpYyBjbGFzcyBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5IGV4dGVuZHMgR3JhcGhpY2FsRWRpdFBvbGljeQotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBLRVkgPSAiS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGludCBPVVRfVE9fUEFSRU5UID0gUG9zaXRpb25Db25zdGFudHMuQUxXQVlTX0xFRlQ7Ci0gIHB1YmxpYyBzdGF0aWMgaW50IElOX1RPX0ZJUlNUX0NISUxEID0gUG9zaXRpb25Db25zdGFudHMuQUxXQVlTX1JJR0hUOwotICAKLSAgcHVibGljIEVkaXRQYXJ0IGdldFJlbGF0aXZlRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9TaW1wbGVEaXJlY3RFZGl0UG9saWN5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL1NpbXBsZURpcmVjdEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzOGUzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL1NpbXBsZURpcmVjdEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIFNpbXBsZURpcmVjdEVkaXRQb2xpY3kgZXh0ZW5kcyBEaXJlY3RFZGl0UG9saWN5IAotewotICBwcm90ZWN0ZWQgRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlIGRlbGVnYXRlOwotCi0gIHB1YmxpYyB2b2lkIHNldERlbGVnYXRlKERpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZSBkZWxlZ2F0ZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgZ2V0RGlyZWN0RWRpdENvbW1hbmQoZmluYWwgRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgCi0gIHsgCi0gIAlyZXR1cm4gbmV3IENvbW1hbmQoKSAvL0Fic3RyYWN0Q29tbWFuZCgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGRlbGVnYXRlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBkZWxlZ2F0ZS5wZXJmb3JtRWRpdChyZXF1ZXN0LmdldENlbGxFZGl0b3IoKSk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgICAgCi0gIAotICAgICAgcHVibGljIHZvaWQgcmVkbygpCi0gICAgICB7Ci0gICAgICB9ICAKLSAgCi0gICAgICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgICAgIHsKLSAgICAgIH0gICAgIAotICAKLSAgICAgIHB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzaG93Q3VycmVudEVkaXRWYWx1ZShEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSAKLSAgeyAgICAgIAotICAJLy9oYWNrIHRvIHByZXZlbnQgYXN5bmMgbGF5b3V0IGZyb20gcGxhY2luZyB0aGUgY2VsbCBlZGl0b3IgdHdpY2UuCi0gIAlnZXRIb3N0RmlndXJlKCkuZ2V0VXBkYXRlTWFuYWdlcigpLnBlcmZvcm1VcGRhdGUoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lBRFRGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lBRFRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg0YTI2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JQURURmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFEVEZpZ3VyZSBleHRlbmRzIElGaWd1cmUKLXsKLSAgdm9pZCBlZGl0UGFydEF0dGFjaGVkKEVkaXRQYXJ0IG93bmVyKTsgCi0gIHZvaWQgYWRkU2VsZWN0aW9uRmVlZGJhY2soKTsKLSAgdm9pZCByZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpOwotICB2b2lkIHJlZnJlc2hWaXN1YWxzKE9iamVjdCBtb2RlbCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JQ29tcGFydG1lbnRGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lDb21wYXJ0bWVudEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTI1ZGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lDb21wYXJ0bWVudEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBhcnRtZW50RmlndXJlIGV4dGVuZHMgSUFEVEZpZ3VyZQotewotICBJRmlndXJlIGdldENvbnRlbnRQYW5lKCk7Ci0gIElGaWd1cmUgZ2V0QW5ub3RhdGlvblBhbmUoKTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUZpZWxkRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JRmllbGRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhYmViMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JRmllbGRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElGaWVsZEZpZ3VyZSBleHRlbmRzIElBRFRGaWd1cmUKLXsKLSAgTGFiZWwgZ2V0VHlwZUxhYmVsKCk7Ci0gIExhYmVsIGdldE5hbWVMYWJlbCgpOwotICBMYWJlbCBnZXROYW1lQW5ub3RhdGlvbkxhYmVsKCk7Ci0gIExhYmVsIGdldFR5cGVBbm5vdGF0aW9uTGFiZWwoKTsKLSAgdm9pZCByZWNvbXB1dGVMYXlvdXQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lGaWd1cmVGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JRmlndXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmVmZTYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lGaWd1cmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZpZ3VyZUZhY3RvcnkKLXsKLSAgSUZpZWxkRmlndXJlIGNyZWF0ZUZpZWxkRmlndXJlKE9iamVjdCBtb2RlbCk7Ci0gIElTdHJ1Y3R1cmVGaWd1cmUgY3JlYXRlU3RydWN0dXJlRmlndXJlKE9iamVjdCBtb2RlbCk7Ci0gIElDb21wYXJ0bWVudEZpZ3VyZSBjcmVhdGVDb21wYXJ0bWVudEZpZ3VyZShPYmplY3QgbW9kZWwpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSVN0cnVjdHVyZUZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSVN0cnVjdHVyZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTk2YWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lTdHJ1Y3R1cmVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZUZpZ3VyZSBleHRlbmRzIElBRFRGaWd1cmUKLXsKLSAgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpOwotICBMYWJlbCBnZXROYW1lTGFiZWwoKTsKLSAgYm9vbGVhbiBoaXRUZXN0SGVhZGVyKFBvaW50IHBvaW50KTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdC9Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdC9Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmFjOTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXQvQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIKLXsKLSAgcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0QnJvd3NlRGlhbG9nKCk7Ci0gIHB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldE5ld0RpYWxvZygpOwotICBwdWJsaWMgdm9pZCBtb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoT2JqZWN0IHJlZmVyZW5jaW5nT2JqZWN0LCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJlZmVyZW5jZWRDb21wb25lbnQpOwotICBwdWJsaWMgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZ2V0Q29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcigpOwotICAKLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBnZXRRdWlja1BpY2tzKCk7Ci0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gZ2V0SGlzdG9yeSgpOwotICBwdWJsaWMgdm9pZCBhZGRUb0hpc3RvcnkoQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnQpOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0L0NvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdC9Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxMzEyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0L0NvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjIgZXh0ZW5kcyBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcgotewotICB2b2lkIHNldFJlZmVyZW5jZXIoSUFEVE9iamVjdCBmaWVsZCk7Ci0gIElBRFRPYmplY3QgZ2V0UmVmZXJlbmNlcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdC9JQ29tcG9uZW50RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0L0lDb21wb25lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5NGY5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0L0lDb21wb25lbnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wb25lbnREaWFsb2cgIHsKLSAgCi0JLyoKLQkgKiBTZXQgdGhlIE9iamVjdCBiZWluZyBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbik7Ci0JCi0JLyoKLQkgKiBSZXR1cm4gdGhlIE9iamVjdCB3aGljaCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBnZXRTZWxlY3RlZENvbXBvbmVudCgpOwotCQotCS8qCi0JICogVXNlZCB0byBvcGVuIHRoZSBEaWFsb2cKLQkgKi8KLQlwdWJsaWMgaW50IGNyZWF0ZUFuZE9wZW4oKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRFeHRlcm5hbFJlc291cmNlVmFyaWFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmJmNzZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRFeHRlcm5hbFJlc291cmNlVmFyaWFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZXNwZXIgU3RlZW4gTW9sbGVyIC0gYWRkZWQgcmVzb2x2ZXIgbG9va3VwcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRW5jb2RlZFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBBRFRFeHRlcm5hbFJlc291cmNlVmFyaWFudCBleHRlbmRzIFBsYXRmb3JtT2JqZWN0Ci17Ci0gIHByaXZhdGUgSVN0b3JhZ2Ugc3RvcmFnZTsKLSAgcHJpdmF0ZSBTdHJpbmcgdXJsU3RyaW5nOwotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENoYXJzZXQoU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gZ2V0Q29udGVudERlc2NyaXB0aW9uKG5hbWUsIHN0cmVhbSk7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogZGVzY3JpcHRpb24uZ2V0Q2hhcnNldCgpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBJQ29udGVudERlc2NyaXB0aW9uIGdldENvbnRlbnREZXNjcmlwdGlvbihTdHJpbmcgbmFtZSwgSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIElDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlTWFuYWdlci5nZXREZXNjcmlwdGlvbkZvcihzdHJlYW0sIG5hbWUsIElDb250ZW50RGVzY3JpcHRpb24uQUxMKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQoU3RyaW5nIHVybFN0cmluZykKLSAgewotICAgIHRoaXMudXJsU3RyaW5nID0gdXJsU3RyaW5nOwotICB9Ci0KLSAgY2xhc3MgWFNEUmVzb3VyY2VWYXJpYW50U3RvcmFnZSBpbXBsZW1lbnRzIElFbmNvZGVkU3RvcmFnZQotICB7Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgIAkgIFN0cmluZyBwaHlzaWNhbFVybFN0cmluZyA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24obnVsbCwgbnVsbCwgdXJsU3RyaW5nKTsKLSAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChwaHlzaWNhbFVybFN0cmluZyk7Ci0gICAgICAgICAgVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgcmV0dXJuIHVybENvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIHRvRXhjZXB0aW9uKQotICAgICAgewotICAgICAgICAvLyBoYW5kbGUKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgewotCi0gICAgICB9Ci0gICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVBhdGggZ2V0RnVsbFBhdGgoKQotICAgIHsKLSAgICAgIC8vIFNpbmNlIHRoaXMgaXMgbG9hZGVkIGZyb20gYW4gVVJMLCB0aGlzIHNob3VsZCBuZXZlciBiZSBpbnRlcnByZXRlZCBhcyBhIHBhdGgKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuIHVybFN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikKLSAgICB7Ci0gICAgICByZXR1cm4gQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQudGhpcy5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgICAgSW5wdXRTdHJlYW0gY29udGVudHMgPSBnZXRDb250ZW50cygpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjaGFyU2V0ID0gQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQuZ2V0Q2hhcnNldChnZXROYW1lKCksIGNvbnRlbnRzKTsKLSAgICAgICAgcmV0dXJuIGNoYXJTZXQ7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYU0RFZGl0b3JQbHVnaW4uUExVR0lOX0lELCBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX0RFU0NSSUJJTkdfQ09OVEVOVFMsIE5MUy5iaW5kKCIiLCBuZXcgU3RyaW5nW10geyBnZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkgfSksIGUpKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBjb250ZW50cy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4Y2VwdGlvbikKLSAgICAgICAgewotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSVN0b3JhZ2UgZ2V0U3RvcmFnZSgpCi0gIHsKLSAgICBpZiAoc3RvcmFnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHN0b3JhZ2UgPSBuZXcgWFNEUmVzb3VyY2VWYXJpYW50U3RvcmFnZSgpOwotICAgIH0KLSAgICByZXR1cm4gc3RvcmFnZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0FEVEZpbGVTdG9yZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURURmlsZVN0b3JlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmYzg3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURURmlsZVN0b3JlRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFEVEZpbGVTdG9yZUVkaXRvcklucHV0IGV4dGVuZHMgRmlsZVN0b3JlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJQURURWRpdG9ySW5wdXQKLXsKLSAgcHJpdmF0ZSBYU0RTY2hlbWEgc2NoZW1hOwotICBwcml2YXRlIFN0cmluZyBlZGl0b3JOYW1lOwotCi0gIHB1YmxpYyBBRFRGaWxlU3RvcmVFZGl0b3JJbnB1dChJRmlsZVN0b3JlIGZpbGVTdG9yZSwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKGZpbGVTdG9yZSk7Ci0gICAgdGhpcy5zY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGVkaXRvck5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIGlmIChlZGl0b3JOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGVkaXRvck5hbWU7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5nZXROYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkKLSAgewotICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbnMgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICBpZiAobnMgIT0gbnVsbCAmJiBucy5sZW5ndGgoKSA+IDApCi0gICAgICAgIHJldHVybiBNZXNzYWdlcy5fVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRSArIG5zOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gTWVzc2FnZXMuX1VJX0xBQkVMX05PX05BTUVTUEFDRTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldFRvb2xUaXBUZXh0KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRNdWx0aVBhZ2VFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRNdWx0aVBhZ2VFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJkM2I3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURUTXVsdGlQYWdlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5TZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuWm9vbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLklDb250ZXh0QWN0aXZhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb250ZXh0cy5JQ29udGV4dFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TZXRJbnB1dFRvR3JhcGhWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5BRFRGbG9hdGluZ1Rvb2xiYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5BRFRFZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLkFEVENvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLkFEVExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5FeHRlbnNpYmxlQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFEVE11bHRpUGFnZUVkaXRvciBleHRlbmRzIENvbW1vbk11bHRpUGFnZUVkaXRvcgotewotICBwcm90ZWN0ZWQgSU1vZGVsIG1vZGVsOwotICBwcml2YXRlIGludCBjdXJyZW50UGFnZSA9IC0xOwotICBwcm90ZWN0ZWQgQnV0dG9uIHRhYmxlT2ZDb250ZW50c0J1dHRvbjsKLSAgcHJvdGVjdGVkIEFEVEZsb2F0aW5nVG9vbGJhciBmbG9hdGluZ1Rvb2xiYXI7Ci0gIHByaXZhdGUgSUNvbnRleHRBY3RpdmF0aW9uIGNvbnRleHRBY3RpdmF0aW9uOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERVNJR05fVklFV19DT05URVhUID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuZWRpdG9yLmRlc2lnblZpZXciOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNPVVJDRV9WSUVXX0NPTlRFWFQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5lZGl0b3Iuc291cmNlVmlldyI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbXVsdGktcGFnZSBlZGl0b3IgZXhhbXBsZS4KLSAgICovCi0gIHB1YmxpYyBBRFRNdWx0aVBhZ2VFZGl0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIAotICBwcml2YXRlIGNsYXNzIEludGVybmFsTGF5b3V0IGV4dGVuZHMgU3RhY2tMYXlvdXQKLSAgewotICAgIHB1YmxpYyBJbnRlcm5hbExheW91dCgpCi0gICAgewotICAgICAgc3VwZXIoKTsgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKQotICAgIHsKLSAgICAgIENvbnRyb2wgY2hpbGRyZW5bXSA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgcmVjdC54ICs9IG1hcmdpbldpZHRoOwotICAgICAgcmVjdC55ICs9IG1hcmdpbkhlaWdodDsKLSAgICAgIHJlY3Qud2lkdGggLT0gMiAqIG1hcmdpbldpZHRoOwotICAgICAgcmVjdC5oZWlnaHQgLT0gMiAqIG1hcmdpbkhlaWdodDsKLSAgICAgIAotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgCi0gICAgICB7Ci0gICAgICAgIGlmIChpID09IDApICAvLyBGb3IgdGhlIGJhY2sgdG8gc2NoZW1hIGJ1dHRvbiAKLSAgICAgICAgeyAKLSAgICAgICAgICBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlIHIgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KWZsb2F0aW5nVG9vbGJhci5nZXRDb250ZW50cygpKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLSAgICAgICAgICBjaGlsZHJlbltpXS5zZXRCb3VuZHMocmVjdC54ICsgMTAsIHJlY3QueSArIDEwLCByLndpZHRoLCBNYXRoLm1heCgyNCwgci5oZWlnaHQpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpID09IDEgJiYgbW9kZUNvbWJvICE9IG51bGwpIC8vIEZvciB0aGUgZHJvcCBkb3duIHRvb2xiYXIKLSAgICAgICAgewotICAgICAgICAgIGNoaWxkcmVuW2ldLnNldEJvdW5kcyhyZWN0LnggKyByZWN0LndpZHRoIC0gOTAgLSBtYXhMZW5ndGgsIHJlY3QueSArIDEwLCBtYXhMZW5ndGggKyA2MCwgMjYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLy8gRm9yIHRoZSBtYWluIGdyYXBoIHZpZXdlcgotICAgICAgICB7Ci0gICAgICAgICAgY2hpbGRyZW5baV0uc2V0Qm91bmRzKHJlY3QpOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfSAgICAgICAKLSAgICB9ICAgICAgICAgICAgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlR3JhcGhQYWdlQ29tcG9zaXRlKCkKLSAgeyAgICAKLSAgICBDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShnZXRDb250YWluZXIoKSwgU1dULkZMQVQpOwotICAgIHBhcmVudC5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICAKLSAgICBwYXJlbnQuc2V0TGF5b3V0KG5ldyBJbnRlcm5hbExheW91dCgpKTsKLQotICAgIGZsb2F0aW5nVG9vbGJhciA9IG5ldyBBRFRGbG9hdGluZ1Rvb2xiYXIoZ2V0TW9kZWwoKSk7Ci0gICAgZmxvYXRpbmdUb29sYmFyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICBmbG9hdGluZ1Rvb2xiYXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgRWRpdFBhcnRGYWN0b3J5IGVkaXRQYXJ0RmFjdG9yeSA9IGdldEVkaXRvck1vZGVNYW5hZ2VyKCkuZ2V0Q3VycmVudE1vZGUoKS5nZXRFZGl0UGFydEZhY3RvcnkoKTsKLSAgICBmbG9hdGluZ1Rvb2xiYXIuc2V0RWRpdFBhcnRGYWN0b3J5KGVkaXRQYXJ0RmFjdG9yeSk7Ci0gICAgCi0gICAgY3JlYXRlVmlld01vZGVUb29sYmFyKHBhcmVudCk7Ci0gICAgCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlR3JhcGhQYWdlKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUdyYXBoUGFnZSgpOyAKLS8vICAgIHRvb2xiYXJWaWV3ZXIuZ2V0Q29udHJvbCgpLm1vdmVBYm92ZShncmFwaGljYWxWaWV3ZXIuZ2V0Q29udHJvbCgpKTsKLS8vICAgIGdyYXBoaWNhbFZpZXdlci5nZXRDb250cm9sKCkubW92ZUJlbG93KHRvb2xiYXJWaWV3ZXIuZ2V0Q29udHJvbCgpKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDb250cmlidXRvcklkKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IiOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIHB1YmxpYyBJQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpCi0gIHsKLSAgICBpZiAoZk91dGxpbmVQYWdlID09IG51bGwgfHwgZk91dGxpbmVQYWdlLmdldENvbnRyb2woKSA9PSBudWxsIHx8IGZPdXRsaW5lUGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIGZpbmFsIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IChQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKWdldEFkYXB0ZXIoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgICBFeHRlbnNpYmxlQ29udGVudE91dGxpbmVQYWdlIG91dGxpbmVQYWdlID0gbnVsbDsKLSAgICAgIGlmIChwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dGxpbmVQYWdlID0gcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5nZXRQcm9kdWN0Q29udGVudE91dGxpbmVQYWdlKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChvdXRsaW5lUGFnZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBvdXRsaW5lUGFnZSA9IG5ldyBBRFRDb250ZW50T3V0bGluZVBhZ2UoKTsKLSAgICAgIH0KLSAgICAgIG91dGxpbmVQYWdlLnNldEVkaXRvcih0aGlzKTsKLSAgICAgIElUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gKElUcmVlQ29udGVudFByb3ZpZGVyKWdldEVkaXRvck1vZGVNYW5hZ2VyKCkuZ2V0Q3VycmVudE1vZGUoKS5nZXRPdXRsaW5lUHJvdmlkZXIoKTsKLSAgICAgIG91dGxpbmVQYWdlLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICBBRFRMYWJlbFByb3ZpZGVyIGFkdExhYmVsUHJvdmlkZXIgPSBuZXcgQURUTGFiZWxQcm92aWRlcigpOwotICAgICAgb3V0bGluZVBhZ2Uuc2V0TGFiZWxQcm92aWRlcihhZHRMYWJlbFByb3ZpZGVyKTsKLSAgICAgIG91dGxpbmVQYWdlLnNldE1vZGVsKGdldE1vZGVsKCkpOwotICAgICAgZk91dGxpbmVQYWdlID0gb3V0bGluZVBhZ2U7Ci0gICAgfQotICAgIHJldHVybiBmT3V0bGluZVBhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyB0aGUgcGFnZXMgb2YgdGhlIG11bHRpLXBhZ2UgZWRpdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGFnZXMoKQotICB7Ci0gICAgc2VsZWN0aW9uUHJvdmlkZXIgPSBnZXRTZWxlY3Rpb25NYW5hZ2VyKCk7Ci0gICAgCi0gICAgY3JlYXRlR3JhcGhQYWdlKCk7Ci0gICAgY3JlYXRlU291cmNlUGFnZSgpOwotICAgIAotICAgIGdldEVkaXRvclNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcihzZWxlY3Rpb25Qcm92aWRlcik7Ci0KLSAgICBtb2RlbCA9IGJ1aWxkTW9kZWwoKTsgIC8vIChJRmlsZUVkaXRvcklucHV0KWdldEVkaXRvcklucHV0KCkpOwotICAgIAotICAgIGluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKTsKLSAgICBmbG9hdGluZ1Rvb2xiYXIuc2V0TW9kZWwobW9kZWwpOwotICAgIAotICAgIGludCBwYWdlSW5kZXhUb1Nob3cgPSBnZXREZWZhdWx0UGFnZVR5cGVJbmRleCgpOwotICAgIHNldEFjdGl2ZVBhZ2UocGFnZUluZGV4VG9TaG93KTsKLSAgfQotCi0gIHByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFBhZ2VUeXBlSW5kZXgoKSB7Ci0gICAgaW50IHBhZ2VJbmRleCA9IFNPVVJDRV9QQUdFX0lOREVYOwotICAgIGlmIChYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0RGVmYXVsdFBhZ2UoKS5lcXVhbHMoWFNERWRpdG9yUGx1Z2luLkRFU0lHTl9QQUdFKSkgewotICAgICAgICBwYWdlSW5kZXggPSBERVNJR05fUEFHRV9JTkRFWDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcGFnZUluZGV4OwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpCi0gIHsKLSAgICBzdXBlci5zZXRGb2N1cygpOwotICAgIGlmIChnZXRBY3RpdmVQYWdlKCkgPT0gREVTSUdOX1BBR0VfSU5ERVgpCi0gICAgewotICAgICAgaWYgKGdyYXBoaWNhbFZpZXdlciAhPSBudWxsICYmIGdyYXBoaWNhbFZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBzZWxlY3RlZCA9IGdyYXBoaWNhbFZpZXdlci5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotICAgICAgICBpZiAoc2VsZWN0ZWQuc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGdyYXBoaWNhbFZpZXdlci5zZXRGb2N1cygoRWRpdFBhcnQpc2VsZWN0ZWQuZ2V0KDApKTsKLSAgICAgICAgfQotICAgICAgICBncmFwaGljYWxWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZ3JhcGhpY2FsVmlld2VyLnNldEZvY3VzKG51bGwpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkKLSAgewotCWRlYWN0aXZhdGVDb250ZXh0KGNvbnRleHRBY3RpdmF0aW9uKTsKLSAgICBjdXJyZW50UGFnZSA9IG5ld1BhZ2VJbmRleDsKLSAgICBzdXBlci5wYWdlQ2hhbmdlKG5ld1BhZ2VJbmRleCk7Ci0gICAgCi0gICAgU3RyaW5nIGNvbnRleHQgPSBnZXRDb250ZXh0KGN1cnJlbnRQYWdlKTsKLSAgICBjb250ZXh0QWN0aXZhdGlvbiA9IGFjdGl2YXRlQ29udGV4dChjb250ZXh0KTsKLSAgICAKLSAgICBpZiAobmV3UGFnZUluZGV4ID09IERFU0lHTl9QQUdFX0lOREVYKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ3JhcGhpY2FsVmlld2VyLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIE9iamVjdCBtb2RlbCA9IG51bGw7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgICAvLyBXaGlsZSBpbiB0aGUgc291cmNlIHZpZXcsIHNlbGVjdGlvbiBjb3VsZCBoYXZlIGNoYW5nZWQuCi0gICAgICAgIC8vIFdpbGwgdHJ5IHRvIHNlbGVjdCB0aGUgZmlyc3QgaXRlbSB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIHRoZSBkZXNpZ24gdmlldy4KLSAgICAgICAgLy8gV2UgY3VycmVudGx5IGRvIG5vdCBtdWx0aS1zZWxlY3QgZmlndXJlcyBpZiBtdWx0aXBsZSBlbGVtZW50cyBhcmUgc2VsZWN0ZWQgaW4gdGhlIHNvdXJjZSB2aWV3LgotICAgICAgICAvLyBGb3IgZXhhbXBsZSwgaWYgbXVsdGlwbGUgZ2xvYmFsIGVsZW1lbnRzIGFyZSBzZWxlY3RlZCwgdGhlIGdyYXBoIHZpZXcgd2lsbCBiZSBpbiB0aGUgZGV0YWlscyB2aWV3Ci0gICAgICAgIC8vIG9mIHRoZSBmaXJzdCBvbmUuCi0gICAgICAgIE9iamVjdCBlbGVtID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGVsZW0gaW5zdGFuY2VvZiBFZGl0UGFydCkKLSAgICAgICAgICBtb2RlbCA9ICgoRWRpdFBhcnQpZWxlbSkuZ2V0TW9kZWwoKTsKLSAgICAgIH0KLSAgICAgIC8vIFJlZnJlc2ggdGhlIGRlc2lnbiBwYWdlIHVwb24gcGFnZSBjaGFuZ2UKLSAgICAgIGdyYXBoaWNhbFZpZXdlci5nZXRDb250ZW50cygpLnJlZnJlc2goKTsKLSAgICAgIC8vIE5lZWQgdG8gdXNlIHRoZSBhZGFwdGVyLCBzaW5jZSBhZnRlciByZWZyZXNoLCB0aGUgb2xkIGVkaXQgcGFydCB3aWxsIGhhdmUgYmVlbiByZXBsYWNlZAotICAgICAgLy8gTWFpbnRhaW4gcHJldmlvdXMgc2VsZWN0aW9uOgotICAgICAgaWYgKG1vZGVsICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9kZWwpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2V0Rm9jdXMoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGlzVGFibGVPZkNvbnRlbnRzQXBwbGljYWJsZShPYmplY3QgZ3JhcGhWaWV3SW5wdXQpCi0gIHsKLSAgICByZXR1cm4gIShncmFwaFZpZXdJbnB1dCBpbnN0YW5jZW9mIElNb2RlbCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyIGdldEdyYXBoaWNhbFZpZXdlcigpCi0gIHsKLSAgICBEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IG5ldyBEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyKHRoaXMsIGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgdmlld2VyLmFkZElucHV0Q2hhbmdkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgICAgeyAgICAgICAgCi0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGlucHV0ID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICBmbG9hdGluZ1Rvb2xiYXIucmVmcmVzaChpc1RhYmxlT2ZDb250ZW50c0FwcGxpY2FibGUoaW5wdXQuZ2V0Rmlyc3RFbGVtZW50KCkpKTsKLSAgICAgIH0gICAgICAKLSAgICB9KTsKLSAgICAvLyBXb3JrYXJvdW5kIGJ1ZyAyMjc2ODcgQW4gZWRpdCBwYXJ0J3MgZm9jdXMgc3RhdGUgaXMgbm90IHVwZGF0ZWQgcHJvcGVybHkKLSAgICAvLyBPbmNlIHRoaXMgaXMgYnVnIGlzIGZpeGVkLCB3ZSBjYW4gcmVtb3ZlIGN1c3RvbSBzZWxlY3Rpb24gbWFuYWdlcgotICAgIHZpZXdlci5zZXRTZWxlY3Rpb25NYW5hZ2VyKG5ldyBDdXN0b21TZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJldHVybiB2aWV3ZXI7Ci0gIH0KLQotICAvLyBXb3JrYXJvdW5kIGJ1ZyAyMjc2ODcgQW4gZWRpdCBwYXJ0J3MgZm9jdXMgc3RhdGUgaXMgbm90IHVwZGF0ZWQgcHJvcGVybHkKLSAgLy8gT25jZSB0aGlzIGlzIGJ1ZyBpcyBmaXhlZCwgd2UgY2FuIHJlbW92ZSB0aGlzIGNsYXNzCi0gIHByaXZhdGUgY2xhc3MgQ3VzdG9tU2VsZWN0aW9uTWFuYWdlciBleHRlbmRzIFNlbGVjdGlvbk1hbmFnZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGFwcGVuZFNlbGVjdGlvbihFZGl0UGFydCBlZGl0cGFydCkKLSAgICB7Ci0gICAgICBpZiAoZWRpdHBhcnQgIT0gZ2V0Rm9jdXMoKSkKLSAgICAgICAgZ2V0Vmlld2VyKCkuc2V0Rm9jdXMoZWRpdHBhcnQpOwotICAgICAgc3VwZXIuYXBwZW5kU2VsZWN0aW9uKGVkaXRwYXJ0KTsKLSAgICB9Ci0gIH0KLSAgCi0gIGFic3RyYWN0IHB1YmxpYyBJTW9kZWwgYnVpbGRNb2RlbCgpOyAgLy8gKElGaWxlRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpOwotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpCi0gIHsKLSAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IGdldEFjdGlvblJlZ2lzdHJ5KCk7Ci0gICAgCi0gICAgQmFzZVNlbGVjdGlvbkFjdGlvbiBhY3Rpb24gPSBuZXcgU2V0SW5wdXRUb0dyYXBoVmlldyh0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICB9Ci0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUgPT0gWm9vbU1hbmFnZXIuY2xhc3MpCi0gICAgICByZXR1cm4gZ3JhcGhpY2FsVmlld2VyLmdldFByb3BlcnR5KFpvb21NYW5hZ2VyLmNsYXNzLnRvU3RyaW5nKCkpOwotICAgIAotICAgIGlmICh0eXBlID09IEdyYXBoaWNhbFZpZXdlci5jbGFzcykKLSAgICAgIHJldHVybiBncmFwaGljYWxWaWV3ZXI7Ci0gICAgaWYgKHR5cGUgPT0gRWRpdFBhcnQuY2xhc3MgJiYgZ3JhcGhpY2FsVmlld2VyICE9IG51bGwpCi0gICAgICByZXR1cm4gZ3JhcGhpY2FsVmlld2VyLmdldFJvb3RFZGl0UGFydCgpOwotICAgIGlmICh0eXBlID09IElGaWd1cmUuY2xhc3MgJiYgZ3JhcGhpY2FsVmlld2VyICE9IG51bGwpCi0gICAgICByZXR1cm4gKChHcmFwaGljYWxFZGl0UGFydCkgZ3JhcGhpY2FsVmlld2VyLmdldFJvb3RFZGl0UGFydCgpKS5nZXRGaWd1cmUoKTsKLQotICAgIGlmICh0eXBlID09IElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpCi0gICAgewotICAgICAgcmV0dXJuIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpOwotICAgIH0KLQotICAgIHJldHVybiBzdXBlci5nZXRBZGFwdGVyKHR5cGUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIG5ldyBBRFRFZGl0UGFydEZhY3RvcnkoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKQotICB7Ci0gICAgZ3JhcGhpY2FsVmlld2VyLnNldENvbnRlbnRzKG1vZGVsKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAoY3VycmVudFBhZ2UgPT0gU09VUkNFX1BBR0VfSU5ERVgpCi0gICAgewotICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLnNldFNvdXJjZVBhZ2VBc0RlZmF1bHQoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5zZXREZXNpZ25QYWdlQXNEZWZhdWx0KCk7Ci0gICAgfQotICAgIGZsb2F0aW5nVG9vbGJhciA9IG51bGw7Ci0JZGVhY3RpdmF0ZUNvbnRleHQoY29udGV4dEFjdGl2YXRpb24pOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHQoaW50IHBhZ2VJbmRleCkgewotCSAgaWYgKHBhZ2VJbmRleCA9PSBERVNJR05fUEFHRV9JTkRFWCkgewotCQkgIHJldHVybiBERVNJR05fVklFV19DT05URVhUOwotCSAgfSBlbHNlIGlmIChwYWdlSW5kZXggPT0gU09VUkNFX1BBR0VfSU5ERVgpIHsKLQkJICByZXR1cm4gU09VUkNFX1ZJRVdfQ09OVEVYVDsKLQkgIH0KLQkgIAotCSAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgcHJpdmF0ZSBJQ29udGV4dEFjdGl2YXRpb24gYWN0aXZhdGVDb250ZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JICBJQ29udGV4dFNlcnZpY2UgY29udGV4dFNlcnZpY2UgPSAoSUNvbnRleHRTZXJ2aWNlKSBnZXRTaXRlKCkuZ2V0U2VydmljZShJQ29udGV4dFNlcnZpY2UuY2xhc3MpOwotCi0JICBpZiAoY29udGV4dFNlcnZpY2UgIT0gbnVsbCAmJiBjb250ZXh0ICE9IG51bGwpIHsKLQkJICByZXR1cm4gY29udGV4dEFjdGl2YXRpb24gPSBjb250ZXh0U2VydmljZS5hY3RpdmF0ZUNvbnRleHQoY29udGV4dCk7Ci0JICB9Ci0JICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGRlYWN0aXZhdGVDb250ZXh0KElDb250ZXh0QWN0aXZhdGlvbiBjb250ZXh0QWN0aXZhdGlvbikgewotCSAgSUNvbnRleHRTZXJ2aWNlIGNvbnRleHRTZXJ2aWNlID0gKElDb250ZXh0U2VydmljZSkgZ2V0U2l0ZSgpLmdldFNlcnZpY2UoSUNvbnRleHRTZXJ2aWNlLmNsYXNzKTsKLQotCSAgaWYgKGNvbnRleHRTZXJ2aWNlICE9IG51bGwgJiYgY29udGV4dEFjdGl2YXRpb24gIT0gbnVsbCkgewotCQkgIGNvbnRleHRTZXJ2aWNlLmRlYWN0aXZhdGVDb250ZXh0KGNvbnRleHRBY3RpdmF0aW9uKTsKLQkgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWZkOGQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLS8qKgotICogCi0gKiBVc2VkIGZvciBhbnkgcmVhZC1vbmx5IGZpbGVzLCBpZS4gSFRUUCBmaWxlcy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElTdG9yYWdlRWRpdG9ySW5wdXQsIElBRFRFZGl0b3JJbnB1dAotewotICBwcm90ZWN0ZWQgU3RyaW5nIHVybFN0cmluZzsKLSAgcHJvdGVjdGVkIElTdG9yYWdlIHN0b3JhZ2U7Ci0gIHByb3RlY3RlZCBBRFRFeHRlcm5hbFJlc291cmNlVmFyaWFudCB2YXJpYW50OwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgcHJvdGVjdGVkIFN0cmluZyBlZGl0b3JOYW1lOwotICBwcm90ZWN0ZWQgU3RyaW5nIGVkaXRvcklEID0gIiI7Ci0KLSAgcHVibGljIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KFN0cmluZyB1cmxTdHJpbmcpCi0gIHsKLSAgICB0aGlzLnVybFN0cmluZyA9IHVybFN0cmluZzsKLSAgICB2YXJpYW50ID0gbmV3IEFEVEV4dGVybmFsUmVzb3VyY2VWYXJpYW50KHVybFN0cmluZyk7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCi0gIHsKLSAgICBpZiAobyA9PSB0aGlzKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAobyBpbnN0YW5jZW9mIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KQotICAgIHsKLSAgICAgIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KSBvOwotICAgICAgCi0gICAgICByZXR1cm4gdXJsU3RyaW5nLmVxdWFscyhpbnB1dC5nZXRVcmxTdHJpbmcoKSkgJiYgaW5wdXQuZ2V0RWRpdG9ySUQoKS5lcXVhbHMoZWRpdG9ySUQpOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VXJsU3RyaW5nKCkKLSAgewotICAgIHJldHVybiB1cmxTdHJpbmc7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJU3RvcmFnZSBnZXRTdG9yYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIHN0b3JhZ2UgPSB2YXJpYW50LmdldFN0b3JhZ2UoKTsKLSAgICByZXR1cm4gc3RvcmFnZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGV4aXN0cygpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICBpZiAoZWRpdG9yTmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIFVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVybFN0cmluZyk7Ci0gICAgICByZXR1cm4gdXJpLmxhc3RTZWdtZW50KCk7Ci0gICAgfQotICAgIHJldHVybiBlZGl0b3JOYW1lOwotICB9Ci0KLSAgcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKQotICB7Ci0gICAgLy8gaHR0cCBmaWxlcyBjYW5ub3QgcGVyc2lzdAotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gdXJsU3RyaW5nOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpCi0gIHsKLSAgICBpZiAoYWRhcHRlciA9PSBJV29ya2JlbmNoQWRhcHRlci5jbGFzcykKLSAgICAgIHJldHVybiB0aGlzOwotICAgIGlmIChhZGFwdGVyID09IElTdG9yYWdlLmNsYXNzKQotICAgICAgcmV0dXJuIHN0b3JhZ2U7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4geHNkU2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGVkaXRvck5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9ySUQoU3RyaW5nIGVkaXRvcklEKQotICB7Ci0gICAgdGhpcy5lZGl0b3JJRCA9IGVkaXRvcklEOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEVkaXRvcklEKCkKLSAgewotICAgIHJldHVybiBlZGl0b3JJRDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0NvbW1vbk11bHRpUGFnZUVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0NvbW1vbk11bHRpUGFnZUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDhjYzAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9Db21tb25NdWx0aVBhZ2VFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Nb3VzZVdoZWVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTW91c2VXaGVlbFpvb21IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuTGF5ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuWm9vbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuVXBkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlpvb21JbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5ab29tT3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNlbGVjdGlvblN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdlckdyYXBoaWNDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkZsYXRDQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tbW9uTXVsdGlQYWdlRWRpdG9yIGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydCBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBDb21tYW5kU3RhY2tMaXN0ZW5lciwgSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IsIElQcm9wZXJ0eUxpc3RlbmVyLCBJRWRpdG9yTW9kZUxpc3RlbmVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgaW50IFNPVVJDRV9QQUdFX0lOREVYID0gMSwgREVTSUdOX1BBR0VfSU5ERVggPSAwOyAgCi0gIAotICBwcm90ZWN0ZWQgSUNvbnRlbnRPdXRsaW5lUGFnZSBmT3V0bGluZVBhZ2U7Ci0gIHByb3RlY3RlZCBEZWZhdWx0RWRpdERvbWFpbiBlZGl0RG9tYWluOwotICBwcm90ZWN0ZWQgU2VsZWN0aW9uU3luY2hyb25pemVyIHN5bmNocm9uaXplcjsKLSAgcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5OwotICBwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRFZGl0b3Igc3RydWN0dXJlZFRleHRFZGl0b3I7Ci0gIHByb3RlY3RlZCBDb21tb25TZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvblByb3ZpZGVyOwotICBwcm90ZWN0ZWQgU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLSAgcHJvdGVjdGVkIEVkaXRvck1vZGVNYW5hZ2VyIGVkaXRvck1vZGVNYW5hZ2VyOwotICBwcm90ZWN0ZWQgRmxhdENDb21ibyBtb2RlQ29tYm87Ci0gIHByaXZhdGUgRWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lW10gZWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lczsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSB0b29sYmFyOwotICBwcm90ZWN0ZWQgTW9kZUNvbWJvTGlzdGVuZXIgbW9kZUNvbWJvTGlzdGVuZXI7Ci0gIHByb3RlY3RlZCBpbnQgbWF4TGVuZ3RoID0gMDsKLSAgcHJvdGVjdGVkIENvbW1vbkFjdGl2YXRpb25MaXN0ZW5lciBmQWN0aXZhdGlvbkxpc3RlbmVyOwotICAKLSAgcHVibGljIENvbW1vbk11bHRpUGFnZUVkaXRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGVkaXREb21haW4gPSBuZXcgRGVmYXVsdEVkaXREb21haW4odGhpcykKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBtb3VzZUV2ZW50LCBFZGl0UGFydFZpZXdlciB2aWV3ZXIpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gZWF0VGhlRXZlbnQgPSBmYWxzZTsgICAgICAKLSAgICAgICAgTGF5ZXJNYW5hZ2VyIG1hbmFnZXIgPSAoTGF5ZXJNYW5hZ2VyKXZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KExheWVyTWFuYWdlci5JRCk7ICAgICAKLSAgICAgICAgSUZpZ3VyZSBsYXllciA9IG1hbmFnZXIuZ2V0TGF5ZXIoRGVzaWduVmlld2VyR3JhcGhpY0NvbnN0YW50cy5TQ0FMRURfSEFORExFX0xBWUVSKTsKLSAgICAgICAgaWYgKGxheWVyICE9IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIFBvaW50IHAgPSBuZXcgUG9pbnQobW91c2VFdmVudC54LCBtb3VzZUV2ZW50LnkpOwotICAgICAgICAgIGxheWVyLnRyYW5zbGF0ZVRvUmVsYXRpdmUocCk7Ci0gICAgICAgICAgSUZpZ3VyZSBmaWd1cmUgPSBsYXllci5maW5kRmlndXJlQXQocCk7ICAgICAKLSAgICAgICAgICBpZiAoZmlndXJlICE9IG51bGwgJiYgZmlndXJlICE9IGxheWVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHdlIGVhdCB0aGlzIHNlbGVjdGlvbiBldmVudCEKLSAgICAgICAgICAgIGVhdFRoZUV2ZW50ID0gdHJ1ZTsKLSAgICAgICAgICB9IAotICAgICAgICB9Ci0gICAgICAgIGlmICghZWF0VGhlRXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBzdXBlci5tb3VzZURvd24obW91c2VFdmVudCwgdmlld2VyKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAgICAgCi0gICAgfTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciNnZXRDb250cmlidXRvcklkKCkKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29udHJpYnV0b3JJZCgpOwotICAKLSAgCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUFjdGlvbnMoKTsKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjY3JlYXRlUGFnZXMoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGFnZXMoKQotICB7Ci0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICAgKi8KLSAgcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgewotLy8gICAgZ2V0RWRpdG9yKDEpLmRvU2F2ZShtb25pdG9yKTsgCi0gICAgc3RydWN0dXJlZFRleHRFZGl0b3IuZG9TYXZlKG1vbml0b3IpOwotICAgIGdldENvbW1hbmRTdGFjaygpLm1hcmtTYXZlTG9jYXRpb24oKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjZG9TYXZlQXMoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZG9TYXZlQXMoKQotICB7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0RWRpdG9yKDEpOwotLy8gICAgZWRpdG9yLmRvU2F2ZUFzKCk7Ci0gICAgc3RydWN0dXJlZFRleHRFZGl0b3IuZG9TYXZlQXMoKTsKLSAgICBzZXRJbnB1dChzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICBzZXRQYXJ0TmFtZShlZGl0b3IuZ2V0VGl0bGUoKSk7Ci0gICAgZ2V0Q29tbWFuZFN0YWNrKCkubWFya1NhdmVMb2NhdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLSAgICogCi0gICAqIENsb3NlcyBhbGwgcHJvamVjdCBmaWxlcyBvbiBwcm9qZWN0IGNsb3NlLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKGZpbmFsIElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UpCi0gICAgewotICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgIHsKLSAgICAgICAgICBJV29ya2JlbmNoUGFnZVtdIHBhZ2VzID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhZ2VzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKChGaWxlRWRpdG9ySW5wdXQpIHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKS5nZXRQcm9qZWN0KCkuZXF1YWxzKGV2ZW50LmdldFJlc291cmNlKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gcGFnZXNbaV0uZmluZEVkaXRvcihzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgICAgICAgICAgcGFnZXNbaV0uY2xvc2VFZGl0b3IoZWRpdG9yUGFydCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFja0xpc3RlbmVyI2NvbW1hbmRTdGFja0NoYW5nZWQoamF2YS51dGlsLkV2ZW50T2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChFdmVudE9iamVjdCBldmVudCkKLSAgewotICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEluZGljYXRlcyB0aGF0IGEgcHJvcGVydHkgaGFzIGNoYW5nZWQuCi0gICAqIAotICAgKiBAcGFyYW0gc291cmNlCi0gICAqICAgICAgICAgIHRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaGFzIGNoYW5nZWQKLSAgICogQHBhcmFtIHByb3BJZAotICAgKiAgICAgICAgICB0aGUgaWQgb2YgdGhlIHByb3BlcnR5IHdoaWNoIGhhcyBjaGFuZ2VkOyBwcm9wZXJ0eSBpZHMgYXJlCi0gICAqICAgICAgICAgIGdlbmVyYWxseSBkZWZpbmVkIGFzIGNvbnN0YW50cyBvbiB0aGUgc291cmNlIGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BJZCkKLSAgewotICAgIHN3aXRjaCAocHJvcElkKQotICAgIHsKLSAgICAgIC8vIGhhZCB0byBpbXBsZW1lbnQgaW5wdXQgY2hhbmdlZCAibGlzdGVuZXIiIHNvIHRoYXQKLSAgICAgIC8vIHN0cnVjdXRlZFRleHQgY291bGQgdGVsbCBpdCBjb250YWluaW5nIGVkaXRvciB0aGF0Ci0gICAgICAvLyB0aGUgaW5wdXQgaGFzIGNoYW5nZSwgd2hlbiBhICdyZXNvdXJjZSBtb3ZlZCcgZXZlbnQgaXMKLSAgICAgIC8vIGZvdW5kLgotICAgICAgY2FzZSBJRWRpdG9yUGFydC5QUk9QX0lOUFVUIDoKLSAgICAgIGNhc2UgSUVkaXRvclBhcnQuUFJPUF9ESVJUWSA6IHsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBzdHJ1Y3R1cmVkVGV4dEVkaXRvcikKLSAgICAgICAgewotICAgICAgICAgIGlmIChzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpICE9IGdldEVkaXRvcklucHV0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2V0SW5wdXQoc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICAgICAgICAvLyB0aXRsZSBzaG91bGQgYWx3YXlzIGNoYW5nZSB3aGVuIGlucHV0IGNoYW5nZXMuCi0gICAgICAgICAgICAvLyBjcmVhdGUgcnVubmFibGUgZm9yIGZvbGxvd2luZyBwb3N0IGNhbGwKLSAgICAgICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9maXJlUHJvcGVydHlDaGFuZ2UoSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAvLyBVcGRhdGUgaXMganVzdCB0byBwb3N0IHRoaW5ncyBvbiB0aGUgZGlzcGxheSBxdWV1ZQotICAgICAgICAgICAgLy8gKHRocmVhZCkuIFdlIGhhdmUgdG8gZG8gdGhpcyB0byBnZXQgdGhlIGRpcnR5Ci0gICAgICAgICAgICAvLyBwcm9wZXJ0eSB0byBnZXQgdXBkYXRlZCBhZnRlciBvdGhlciB0aGluZ3Mgb24gdGhlCi0gICAgICAgICAgICAvLyBxdWV1ZSBhcmUgZXhlY3V0ZWQuCi0gICAgICAgICAgICBwb3N0T25EaXNwbGF5UXVlKHJ1bm5hYmxlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIElXb3JrYmVuY2hQYXJ0LlBST1BfVElUTEUgOiB7Ci0gICAgICAgIC8vIHVwZGF0ZSB0aGUgaW5wdXQgaWYgdGhlIHRpdGxlIGlzIGNoYW5nZWQKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBzdHJ1Y3R1cmVkVGV4dEVkaXRvcikKLSAgICAgICAgewotICAgICAgICAgIGlmIChzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpICE9IGdldEVkaXRvcklucHV0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2V0SW5wdXQoc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdCA6IHsKLSAgICAgICAgLy8gcHJvcGFnYXRlIGNoYW5nZXMuIElzIHRoaXMgbmVlZGVkPyBBbnN3ZXI6IFllcy4KLSAgICAgICAgaWYgKHNvdXJjZSA9PSBzdHJ1Y3R1cmVkVGV4dEVkaXRvcikKLSAgICAgICAgewotICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wSWQpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLy8gU2hvdWxkIG92ZXJyaWRlIHRvIHNldCB0aGUgaW5wdXQgdG8gdGhlIGRlc2lnbiB2aWV3ZXIgZm9yIGEgbmV3IGRvY3VtZW50IGNoYW5nZQotICAvLyBpZS4gd2hlbiBkb2luZyBhIHNhdmVBcwotICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dFRvR3JhcGhpY2FsVmlld2VyKElEb2N1bWVudCBuZXdJbnB1dCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQoaW5wdXQpOwotICAgIGlmIChncmFwaGljYWxWaWV3ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXRJbnB1dFRvR3JhcGhpY2FsVmlld2VyKGdldERvY3VtZW50KCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKQotICB7Ci0gICAgSURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICBpZiAoc3RydWN0dXJlZFRleHRFZGl0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkb2N1bWVudCA9IHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRvY3VtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHByb3RlY3RlZCBTZWxlY3Rpb25TeW5jaHJvbml6ZXIgZ2V0U2VsZWN0aW9uU3luY2hyb25pemVyKCkKLSAgewotICAgIGlmIChzeW5jaHJvbml6ZXIgPT0gbnVsbCkKLSAgICAgIHN5bmNocm9uaXplciA9IG5ldyBTZWxlY3Rpb25TeW5jaHJvbml6ZXIoKTsKLSAgICByZXR1cm4gc3luY2hyb25pemVyOwotICB9Ci0KLSAgcHVibGljIENvbW1vblNlbGVjdGlvbk1hbmFnZXIgZ2V0U2VsZWN0aW9uTWFuYWdlcigpCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uUHJvdmlkZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25Qcm92aWRlciA9IG5ldyBDb21tb25TZWxlY3Rpb25NYW5hZ2VyKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gc2VsZWN0aW9uUHJvdmlkZXI7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFRoaXMgbWV0aG9kIGlzIGp1c3QgdG8gbWFrZSBmaXJlUHJvcGVydHlDaGFuZ2VkIGFjY2Vzc2JpYmxlIGZyb20gc29tZQotICAgKiAoYW5vbm9tb3VzKSBpbm5lciBjbGFzc2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgX2ZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgcHJvcGVydHkpCi0gIHsKLSAgICBzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHkpOwotICB9Ci0gIAotICAvKioKLSAgICogUG9zdHMgdGhlIHVwZGF0ZSBjb2RlICJiZWhpbmQiIHRoZSBydW5uaW5nIG9wZXJhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHBvc3RPbkRpc3BsYXlRdWUoUnVubmFibGUgcnVubmFibGUpCi0gIHsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotICAgIGlmICh3aW5kb3dzICE9IG51bGwgJiYgd2luZG93cy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIERpc3BsYXkgZGlzcGxheSA9IHdpbmRvd3NbMF0uZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCk7Ci0gICAgICBkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJ1bm5hYmxlLnJ1bigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSA8Y29kZT5NdWx0aVBhZ2VFZGl0b3JQYXJ0PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAqIDxjb2RlPklXb3JrYmVuY2hQYXJ0PC9jb2RlPiBtZXRob2QgZGlzcG9zZXMgYWxsIG5lc3RlZCBlZGl0b3JzLgotICAgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGdldENvbW1hbmRTdGFjaygpLnJlbW92ZUNvbW1hbmRTdGFja0xpc3RlbmVyKHRoaXMpOwotICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgIGFjdGlvblJlZ2lzdHJ5LmRpc3Bvc2UoKTsKLSAgICAKLSAgICBpZiAoc3RydWN0dXJlZFRleHRFZGl0b3IgIT0gbnVsbCkgewotICAgICAgc3RydWN0dXJlZFRleHRFZGl0b3IucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgc3RydWN0dXJlZFRleHRFZGl0b3IgPSBudWxsOwotICAgIGVkaXREb21haW4gPSBudWxsOwotICAgIGZPdXRsaW5lUGFnZSA9IG51bGw7Ci0gICAgc3luY2hyb25pemVyID0gbnVsbDsKLSAgICBhY3Rpb25SZWdpc3RyeSA9IG51bGw7Ci0gICAgc2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOwotICAgIGdyYXBoaWNhbFZpZXdlciA9IG51bGw7Ci0gICAgaWYgKG1vZGVDb21ibyAhPSBudWxsICYmICFtb2RlQ29tYm8uaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIG1vZGVDb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihtb2RlQ29tYm9MaXN0ZW5lcik7Ci0gICAgICBtb2RlQ29tYm9MaXN0ZW5lciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIGlmIChmQWN0aXZhdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgIGZBY3RpdmF0aW9uTGlzdGVuZXIuZGlzcG9zZSgpOwotICAgICAgZkFjdGl2YXRpb25MaXN0ZW5lciA9IG51bGw7Ci0gICAgfQotICAgCi0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKQotICB7Ci0gICAgcmV0dXJuIGVkaXREb21haW4uZ2V0Q29tbWFuZFN0YWNrKCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9yUGFydAotICAgKi8KLSAgcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikKLSAgewotICAgIHNldEFjdGl2ZVBhZ2UoU09VUkNFX1BBR0VfSU5ERVgpOwotICAgIElERS5nb3RvTWFya2VyKHN0cnVjdHVyZWRUZXh0RWRpdG9yLCBtYXJrZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSA8Y29kZT5NdWx0aVBhZ2VFZGl0b3JFeGFtcGxlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZAotICAgKiBjaGVja3MgdGhhdCB0aGUgaW5wdXQgaXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+SUZpbGVFZGl0b3JJbnB1dDwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5pbml0KHNpdGUsIGVkaXRvcklucHV0KTsKLSAgICAKLSAgICBnZXRDb21tYW5kU3RhY2soKS5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBpbml0aWFsaXplQWN0aW9uUmVnaXN0cnkoKTsKLSAgICAKLSAgICBTdHJpbmcgdGl0bGUgPSBudWxsOwotICAgIGlmIChnZXRFZGl0b3JJbnB1dCgpICE9IG51bGwpIHsKLSAgICAgIHRpdGxlID0gZ2V0RWRpdG9ySW5wdXQoKS5nZXROYW1lKCk7Ci0gICAgfQotICAgIHNldFBhcnROYW1lKHRpdGxlKTsKLSAgICAKLSAgICBmQWN0aXZhdGlvbkxpc3RlbmVyID0gbmV3IENvbW1vbkFjdGl2YXRpb25MaXN0ZW5lcihzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFjdGlvblJlZ2lzdHJ5KCkKLSAgewotICAgIGNyZWF0ZUFjdGlvbnMoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGdldEFjdGlvblJlZ2lzdHJ5KCkKLSAgewotICAgIGlmIChhY3Rpb25SZWdpc3RyeSA9PSBudWxsKQotICAgICAgYWN0aW9uUmVnaXN0cnkgPSBuZXcgQWN0aW9uUmVnaXN0cnkoKTsKLSAgICByZXR1cm4gYWN0aW9uUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgdHlwZSkKLSAgewotICAgIGlmICh0eXBlID09IENvbW1hbmRTdGFjay5jbGFzcykKLSAgICAgIHJldHVybiBnZXRDb21tYW5kU3RhY2soKTsKLSAgICBpZiAodHlwZSA9PSBBY3Rpb25SZWdpc3RyeS5jbGFzcykKLSAgICAgIHJldHVybiBnZXRBY3Rpb25SZWdpc3RyeSgpOwotICAgIGlmICh0eXBlID09IEVkaXRvck1vZGVNYW5hZ2VyLmNsYXNzKQotICAgICAgcmV0dXJuIGdldEVkaXRvck1vZGVNYW5hZ2VyKCk7Ci0gICAgaWYgKHR5cGUgPT0gSUdvdG9NYXJrZXIuY2xhc3MpIHsKLSAgICAgIHJldHVybiBuZXcgSUdvdG9NYXJrZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgICBDb21tb25NdWx0aVBhZ2VFZGl0b3IudGhpcy5nb3RvTWFya2VyKG1hcmtlcik7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgfQotICAgIGlmICh0eXBlID09IElUZXh0RWRpdG9yLmNsYXNzKQotICAgICAgcmV0dXJuIGdldFRleHRFZGl0b3IoKTsKLSAgICAKLSAgICByZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcih0eXBlKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGdldEVkaXREb21haW4oKQotICB7Ci0gICAgcmV0dXJuIGVkaXREb21haW47Ci0gIH0KLQotICAvKioKLSAgICogRnJvbSBHRUYgR3JhcGhpY2FsRWRpdG9yIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciB1cGRhdGluZyBhIHNldCBvZiBhY3Rpb25zCi0gICAqIGRlZmluZWQgYnkgdGhlIGdpdmVuIExpc3Qgb2YgYWN0aW9uIElEcy4gVGhlIGFjdGlvbnMgYXJlIGZvdW5kIGJ5IGxvb2tpbmcKLSAgICogdXAgdGhlIElEIGluIHRoZSB7QGxpbmsgI2dldEFjdGlvblJlZ2lzdHJ5KCkgYWN0aW9uIHJlZ2lzdHJ5fS4gSWYgdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgYWN0aW9uIGlzIGFuIHtAbGluayBVcGRhdGVBY3Rpb259LCBpdCB3aWxsIGhhdmUgaXRzCi0gICAqIDxjb2RlPnVwZGF0ZSgpPC9jb2RlPiBtZXRob2QgY2FsbGVkLgotICAgKiAKLSAgICogQHBhcmFtIGFjdGlvbklkcwotICAgKiAgICAgICAgICB0aGUgbGlzdCBvZiBJRHMgdG8gdXBkYXRlCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBY3Rpb25zKExpc3QgYWN0aW9uSWRzKQotICB7Ci0gICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRBY3Rpb25SZWdpc3RyeSgpOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpb25JZHMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgSUFjdGlvbiBhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oaXRlci5uZXh0KCkpOwotICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIFVwZGF0ZUFjdGlvbikKLSAgICAgICAgKChVcGRhdGVBY3Rpb24pIGFjdGlvbikudXBkYXRlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGdldFRleHRFZGl0b3IoKQotICB7Ci0gICAgcmV0dXJuIHN0cnVjdHVyZWRUZXh0RWRpdG9yOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVHcmFwaFBhZ2VDb21wb3NpdGUoKQotICB7Ci0gICAgQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoZ2V0Q29udGFpbmVyKCksIFNXVC5OT05FKTsgICAgCi0gICAgcGFyZW50LnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaFBhZ2UoKQotICB7Ci0gICAgQ29tcG9zaXRlIHBhcmVudCA9IGNyZWF0ZUdyYXBoUGFnZUNvbXBvc2l0ZSgpOwotICAgIAotICAgIGdyYXBoaWNhbFZpZXdlciA9IGdldEdyYXBoaWNhbFZpZXdlcigpOwotICAgIGdyYXBoaWNhbFZpZXdlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgICAgIAotICAgIGdldEVkaXREb21haW4oKS5hZGRWaWV3ZXIoZ3JhcGhpY2FsVmlld2VyKTsKLSAgICAKLSAgICBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLSAgICBob29rR3JhcGhpY2FsVmlld2VyKCk7ICAgIAotICAgIGludCBpbmRleCA9IGFkZFBhZ2UocGFyZW50KTsKLSAgICBzZXRQYWdlVGV4dChpbmRleCwgTWVzc2FnZXMuX1VJX0xBQkVMX0RFU0lHTik7Ci0gIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2NyZWF0ZVNpdGUob3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQpCi0JICovCi0JcHJvdGVjdGVkIElFZGl0b3JTaXRlIGNyZWF0ZVNpdGUoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCUlFZGl0b3JTaXRlIHNpdGUgPSBudWxsOwotCQlpZiAoZWRpdG9yID09IHN0cnVjdHVyZWRUZXh0RWRpdG9yKSB7Ci0JCQlzaXRlID0gbmV3IE11bHRpUGFnZUVkaXRvclNpdGUodGhpcywgZWRpdG9yKSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQkJLy8gc2V0cyB0aGlzIGlkIHNvIG5lc3RlZCBlZGl0b3IgaXMgY29uc2lkZXJlZCB4bWwgc291cmNlCi0JCQkJCS8vIHBhZ2UKLQkJCQkJcmV0dXJuIENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwgKyAiLnNvdXJjZSI7IC8vJE5PTi1OTFMtMSQ7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQllbHNlIHsKLQkJCXNpdGUgPSBzdXBlci5jcmVhdGVTaXRlKGVkaXRvcik7Ci0JCX0KLQkJcmV0dXJuIHNpdGU7Ci0JfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU291cmNlUGFnZSgpCi0gIHsKLSAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IGFkZFBhZ2Uoc3RydWN0dXJlZFRleHRFZGl0b3IsIGdldEVkaXRvcklucHV0KCkpOwotICAgICAgc2V0UGFnZVRleHQoaW5kZXgsIE1lc3NhZ2VzLl9VSV9MQUJFTF9TT1VSQ0UpOwotICAgICAgc3RydWN0dXJlZFRleHRFZGl0b3IudXBkYXRlKCk7Ci0gICAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5zZXRFZGl0b3JQYXJ0KHRoaXMpOwotICAgICAgc3RydWN0dXJlZFRleHRFZGl0b3IuYWRkUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLSAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX1RJVExFKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNpdGUoKS5nZXRTaGVsbCgpLCAiRXJyb3IgY3JlYXRpbmcgbmVzdGVkIHRleHQgZWRpdG9yIiwgbnVsbCwgZS5nZXRTdGF0dXMoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpCi0gIHsKLSAgICBncmFwaGljYWxWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQpOwotCi0gICAgLy8gU2V0IHRoZSByb290IGVkaXQgcGFydAotICAgIC8vIFNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQgcm9vdCA9IG5ldyBTY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0KCk7Ci0gICAgUm9vdEVkaXRQYXJ0IHJvb3QgPSBuZXcgUm9vdEVkaXRQYXJ0KCk7Ci0gICAgWm9vbU1hbmFnZXIgem9vbU1hbmFnZXIgPSByb290LmdldFpvb21NYW5hZ2VyKCk7Ci0gICAgCi0gICAgTGlzdCB6b29tTGV2ZWxDb250cmlidXRpb25zID0gbmV3IEFycmF5TGlzdCgzKTsKLSAgICB6b29tTGV2ZWxDb250cmlidXRpb25zLmFkZChab29tTWFuYWdlci5GSVRfQUxMKTsKLSAgICB6b29tTGV2ZWxDb250cmlidXRpb25zLmFkZChab29tTWFuYWdlci5GSVRfV0lEVEgpOwotICAgIHpvb21MZXZlbENvbnRyaWJ1dGlvbnMuYWRkKFpvb21NYW5hZ2VyLkZJVF9IRUlHSFQpOwotICAgIHpvb21NYW5hZ2VyLnNldFpvb21MZXZlbENvbnRyaWJ1dGlvbnMoem9vbUxldmVsQ29udHJpYnV0aW9ucyk7Ci0KLSAgICBkb3VibGVbXSB6b29tTGV2ZWxzID0gey4xMCwgLjI1LCAuNSwgLjc1LCAxLjAsIDEuMjUsIDEuNSwgMi4wLCAyLjUsIDMsIDQsIDV9OwotICAgIHpvb21NYW5hZ2VyLnNldFpvb21MZXZlbHMoem9vbUxldmVscyk7Ci0KLSAgICBJQWN0aW9uIHpvb21JbiA9IG5ldyBab29tSW5BY3Rpb24oem9vbU1hbmFnZXIpOwotICAgIElBY3Rpb24gem9vbU91dCA9IG5ldyBab29tT3V0QWN0aW9uKHpvb21NYW5hZ2VyKTsKLSAgICBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHpvb21Jbik7Ci0gICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih6b29tT3V0KTsKLQotICAgIGdldFNpdGUoKS5nZXRLZXlCaW5kaW5nU2VydmljZSgpLnJlZ2lzdGVyQWN0aW9uKHpvb21Jbik7Ci0gICAgZ2V0U2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCkucmVnaXN0ZXJBY3Rpb24oem9vbU91dCk7Ci0KLSAgICAvL0Nvbm5lY3Rpb25MYXllciBjb25uZWN0aW9uTGF5ZXIgPSAoQ29ubmVjdGlvbkxheWVyKSByb290LmdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpOwotICAgIC8vY29ubmVjdGlvbkxheWVyLnNldENvbm5lY3Rpb25Sb3V0ZXIobmV3IEJlbmRwb2ludENvbm5lY3Rpb25Sb3V0ZXIoKSk7Ci0KLSAgICAvL2Nvbm5lY3Rpb25MYXllci5zZXRDb25uZWN0aW9uUm91dGVyKG5ldyBTaG9ydGVzdFBhdGhDb25uZWN0aW9uUm91dGVyKGNvbm5lY3Rpb25MYXllcikpOwotICAgIC8vIGNvbm5lY3Rpb25MYXllci5zZXRWaXNpYmxlKGZhbHNlKTsKLQotICAgIC8vIFpvb20KLSAgICB6b29tTWFuYWdlci5zZXRab29tKDEuMCk7Ci0gICAgLy8gU2Nyb2xsLXdoZWVsIFpvb20KLSAgICBncmFwaGljYWxWaWV3ZXIuc2V0UHJvcGVydHkoTW91c2VXaGVlbEhhbmRsZXIuS2V5R2VuZXJhdG9yLmdldEtleShTV1QuQ1RSTCksIE1vdXNlV2hlZWxab29tSGFuZGxlci5TSU5HTEVUT04pOwotICAgIGdyYXBoaWNhbFZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0gICAgZ3JhcGhpY2FsVmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShnZXRFZGl0UGFydEZhY3RvcnkoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhvb2tHcmFwaGljYWxWaWV3ZXIoKQotICB7Ci0gICAgZ2V0U2VsZWN0aW9uU3luY2hyb25pemVyKCkuYWRkVmlld2VyKGdyYXBoaWNhbFZpZXdlcik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCBFZGl0UGFydEZhY3RvcnkgZ2V0RWRpdFBhcnRGYWN0b3J5KCk7Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKTsKLQotICBwcm90ZWN0ZWQgRWRpdG9yTW9kZU1hbmFnZXIgZ2V0RWRpdG9yTW9kZU1hbmFnZXIoKQotICB7Ci0gICAgaWYgKGVkaXRvck1vZGVNYW5hZ2VyID09IG51bGwpCi0gICAgewotICAgICAgZWRpdG9yTW9kZU1hbmFnZXIgPSBjcmVhdGVFZGl0b3JNb2RlTWFuYWdlcigpOwotICAgICAgZWRpdG9yTW9kZU1hbmFnZXIuYWRkTGlzdGVuZXIodGhpcyk7Ci0gICAgICBlZGl0b3JNb2RlTWFuYWdlci5pbml0KCk7Ci0gICAgfSAgCi0gICAgcmV0dXJuIGVkaXRvck1vZGVNYW5hZ2VyOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYWJzdHJhY3QgRWRpdG9yTW9kZU1hbmFnZXIgY3JlYXRlRWRpdG9yTW9kZU1hbmFnZXIoKTsKLSAgCi0gIAotICBwcml2YXRlIFN0cmluZyBnZXRFZGl0TW9kZU5hbWUoRWRpdG9yTW9kZSBlZGl0b3JNb2RlLCBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gZWRpdG9yTW9kZS5nZXREaXNwbGF5TmFtZSgpOwotICAgIGlmIChwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGN1c3RvbWl6ZWROYW1lID0gcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5nZXRFZGl0b3JNb2RlRGlzcGxheU5hbWUoZWRpdG9yTW9kZS5nZXRJZCgpKTsKLSAgICAgIGlmIChjdXN0b21pemVkTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBjdXN0b21pemVkTmFtZTsKLSAgICAgIH0gIAotICAgIH0gCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgY2xhc3MgRWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lCi0gIHsKLSAgICBFZGl0b3JNb2RlIG1vZGU7Ci0gICAgU3RyaW5nIG5hbWU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVZpZXdNb2RlVG9vbGJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgRWRpdG9yTW9kZU1hbmFnZXIgbWFuYWdlciA9IChFZGl0b3JNb2RlTWFuYWdlcilnZXRBZGFwdGVyKEVkaXRvck1vZGVNYW5hZ2VyLmNsYXNzKTsKLSAgICBmaW5hbCBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgPSAoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcilnZXRBZGFwdGVyKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgIEVkaXRvck1vZGUgW10gbW9kZUxpc3QgPSBtYW5hZ2VyLmdldE1vZGVzKCk7Ci0gICAgCi0gICAgaW50IG1vZGVMaXN0TGVuZ3RoID0gbW9kZUxpc3QubGVuZ3RoOwotICAgIGJvb2xlYW4gc2hvd1Rvb2xCYXIgPSBtb2RlTGlzdExlbmd0aCA+IDE7Ci0gICAKLSAgICBpZiAoc2hvd1Rvb2xCYXIpCi0gICAgewotICAgICAgdG9vbGJhciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuRkxBVCB8IFNXVC5EUkFXX1RSQU5TUEFSRU5UKTsKLSAgICAgIHRvb2xiYXIuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy5saXN0QmFja2dyb3VuZCk7Ci0gICAgICB0b29sYmFyLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gdG9vbGJhci5nZXRDbGllbnRBcmVhKCk7IAotICAgICAgICAgIGUuZ2Muc2V0Rm9yZWdyb3VuZChDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotICAgICAgICAgIGUuZ2MuZHJhd1JlY3RhbmdsZShjbGllbnRBcmVhLngsIGNsaWVudEFyZWEueSwgY2xpZW50QXJlYS53aWR0aCAtIDEsIGNsaWVudEFyZWEuaGVpZ2h0IC0gMSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgICAgCi0gICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgICB0b29sYmFyLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodG9vbGJhciwgU1dULkZMQVQgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgICBsYWJlbC5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpc3RCYWNrZ3JvdW5kKTsKLSAgICAgIGxhYmVsLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX1ZJRVcpOwotICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKSk7Ci0KLSAgICAgIG1vZGVDb21ibyA9IG5ldyBGbGF0Q0NvbWJvKHRvb2xiYXIsIFNXVC5GTEFUKTsKLSAgICAgIG1vZGVDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICBtb2RlQ29tYm8uc2V0VGV4dChnZXRFZGl0TW9kZU5hbWUobWFuYWdlci5nZXRDdXJyZW50TW9kZSgpLCBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKSk7IAotICAgICAgR0MgZ2MgPSBuZXcgR0MobW9kZUNvbWJvKTsKLSAgICAgIGludCB0ZXh0V2lkdGggPSAwOwotICAgICAgbWF4TGVuZ3RoID0gMDsKLSAgICAgIAotICAgICAgLy8gcG9wdWxhdGUgY29tYm8gd2l0aCBtb2RlcwotICAgICAgZWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lcyA9IG5ldyBFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVbbW9kZUxpc3RMZW5ndGhdOyAgICAgIAotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlTGlzdExlbmd0aDsgaSsrKQotICAgICAgeyAgCi0gICAgICAgIEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZSBlbnRyeSA9IG5ldyBFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWUoKTsKLSAgICAgICAgZWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lc1tpXSA9IGVudHJ5OwotICAgICAgICBlbnRyeS5uYW1lID0gZ2V0RWRpdE1vZGVOYW1lKG1vZGVMaXN0W2ldLCBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKTsKLSAgICAgICAgZW50cnkubW9kZSA9IG1vZGVMaXN0W2ldOwotICAgICAgfSAgICAgICAgCi0gICAgICBBcnJheXMuc29ydChlZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVzLCBuZXcgQ29tcGFyYXRvcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpCi0gICAgICAgIHsKLSAgICAgICAgICBFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWUgYSA9IChFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWUpYXJnMDsKLSAgICAgICAgICBFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWUgYiA9IChFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWUpYXJnMTsgICAgICAgIAotICAgICAgICAgIHJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoYS5uYW1lLCBiLm5hbWUpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lcy5sZW5ndGg7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZSBlbnRyeSA9IGVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZXNbaV07Ci0gICAgICAgIG1vZGVDb21iby5hZGQoZW50cnkubmFtZSk7Ci0gICAgICAgIG1heExlbmd0aCA9IE1hdGgubWF4IChnYy5zdHJpbmdFeHRlbnQoZW50cnkubmFtZSkueCwgbWF4TGVuZ3RoKTsKLSAgICAgICAgaW50IGFwcHJveFdpZHRoT2ZTdHJpbmdzID0gTWF0aC5tYXggKGdjLnN0cmluZ0V4dGVudChlbnRyeS5uYW1lKS54LCB0ZXh0V2lkdGgpOwotICAgICAgICBpZiAoYXBwcm94V2lkdGhPZlN0cmluZ3MgPiBtYXhMZW5ndGgpCi0gICAgICAgICAgbWF4TGVuZ3RoID0gYXBwcm94V2lkdGhPZlN0cmluZ3M7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIG1heExlbmd0aCArPSBnYy5zdHJpbmdFeHRlbnQoTWVzc2FnZXMuX1VJX0xBQkVMX1ZJRVcpLng7IAotICAgICAgZ2MuZGlzcG9zZSgpOwotICAgICAgCi0gICAgICBtb2RlQ29tYm9MaXN0ZW5lciA9IG5ldyBNb2RlQ29tYm9MaXN0ZW5lcigpOwotICAgICAgbW9kZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG1vZGVDb21ib0xpc3RlbmVyKTsKLSAgICAgIG1vZGVDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9FTkQpKTsKLSAgICAgIG1vZGVDb21iby5zZXRCYWNrZ3JvdW5kKHRvb2xiYXIuZ2V0QmFja2dyb3VuZCgpKTsKLQotICAgICAgSW1hZ2VIeXBlcmxpbmsgaHlwZXJsaW5rID0gbmV3IEltYWdlSHlwZXJsaW5rKHRvb2xiYXIsIFNXVC5GTEFUKTsKLSAgICAgIGh5cGVybGluay5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ0NTcKLSAgICAgIEltYWdlIGltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJY29uSW1hZ2UoImV0b29sMTYvaGVscF9jb250ZW50cyIpOwotICAgICAgaHlwZXJsaW5rLnNldEltYWdlKGltYWdlKTsKLSAgICAgIGh5cGVybGluay5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfSE9WRVJfVklFV19NT0RFX0RFU0NSSVBUSU9OKTsKLSAgICAgIGh5cGVybGluay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpKTsKLSAgICAgIGh5cGVybGluay5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmhhbmRsZUFjdGlvbigic2hvd0VkaXRvck1vZGVIZWxwIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsgICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIAotICBwcm90ZWN0ZWQgY2xhc3MgTW9kZUNvbWJvTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIE1vZGVDb21ib0xpc3RlbmVyKCkKLSAgICB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIGlmIChlLndpZGdldCA9PSBtb2RlQ29tYm8pCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgRWRpdG9yTW9kZU1hbmFnZXIgbWFuYWdlciA9IChFZGl0b3JNb2RlTWFuYWdlcilnZXRBZGFwdGVyKEVkaXRvck1vZGVNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgRWRpdG9yTW9kZSBbXSBtb2RlTGlzdCA9IG1hbmFnZXIuZ2V0TW9kZXMoKTsKLSAgICAgICAgaWYgKG1vZGVMaXN0Lmxlbmd0aCA+PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgRWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lIGVudHJ5ID0gZWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lc1ttb2RlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV07Ci0gICAgICAgICAgaWYgKG1hbmFnZXIuZ2V0Q3VycmVudE1vZGUoKSAhPSBlbnRyeS5tb2RlKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgbWFuYWdlci5zZXRDdXJyZW50TW9kZShlbnRyeS5tb2RlKTsKLSAgICAgICAgICAgIHN0b3JlQ3VycmVudE1vZGVQcmVmZXJlbmNlKGVudHJ5Lm1vZGUuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgPSAoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcikgZ2V0QWRhcHRlcihQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuaGFuZGxlQWN0aW9uKCJlZGl0b3JNb2RlQ2hhbmdlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzdG9yZUN1cnJlbnRNb2RlUHJlZmVyZW5jZShTdHJpbmcgaWQpCi0gIHsKLSAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBhcyBkZWZhdWx0LiAgQWxsb3cgZXh0ZW5kZXJzIHRvIGltcGxlbWVudC4KLSAgfQotICAKLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBDb21tb25BY3RpdmF0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyLCBJV2luZG93TGlzdGVuZXIKLSAgewotCi0gICAgLyoqIENhY2hlIG9mIHRoZSBhY3RpdmUgd29ya2JlbmNoIHBhcnQuICovCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBmQWN0aXZlUGFydDsKLSAgICAvKiogSW5kaWNhdGVzIHdoZXRoZXIgYWN0aXZhdGlvbiBoYW5kbGluZyBpcyBjdXJyZW50bHkgYmUgZG9uZS4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0gICAgLyoqCi0gICAgICogVGhlIHBhcnQgc2VydmljZS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBJUGFydFNlcnZpY2UgZlBhcnRTZXJ2aWNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGlzIGFjdGl2YXRpb24gbGlzdGVuZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcnRTZXJ2aWNlCi0gICAgICogICAgICAgICAgdGhlIHBhcnQgc2VydmljZSBvbiB3aGljaCB0byBhZGQgdGhlIHBhcnQgbGlzdGVuZXIKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIENvbW1vbkFjdGl2YXRpb25MaXN0ZW5lcihJUGFydFNlcnZpY2UgcGFydFNlcnZpY2UpCi0gICAgewotICAgICAgZlBhcnRTZXJ2aWNlID0gcGFydFNlcnZpY2U7Ci0gICAgICBmUGFydFNlcnZpY2UuYWRkUGFydExpc3RlbmVyKHRoaXMpOwotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwb3NlcyB0aGlzIGFjdGl2YXRpb24gbGlzdGVuZXIuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICAgIGZQYXJ0U2VydmljZS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnJlbW92ZVdpbmRvd0xpc3RlbmVyKHRoaXMpOwotICAgICAgZlBhcnRTZXJ2aWNlID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgICB7Ci0gICAgICBmQWN0aXZlUGFydCA9IHBhcnQ7Ci0gICAgICBoYW5kbGVBY3RpdmF0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydEJyb3VnaHRUb1RvcChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gICAgewotICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRDbG9zZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KQotICAgIHsKLSAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0RGVhY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gICAgewotICAgICAgZkFjdGl2ZVBhcnQgPSBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRPcGVuZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KQotICAgIHsKLSAgICAJaWYgKENvbW1vbk11bHRpUGFnZUVkaXRvci50aGlzLmVxdWFscyhwYXJ0KSkKLSAgICAJewotICAgIAkJZG9Qb3N0RWRpdG9yT3BlblRhc2tzKCk7Ci0gICAgCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHRoZSBhY3RpdmF0aW9uIHRyaWdnZXJpbmcgYSBlbGVtZW50IHN0YXRlIGNoZWNrIGluIHRoZSBlZGl0b3IuCi0gICAgICovCi0gICAgdm9pZCBoYW5kbGVBY3RpdmF0aW9uKCkKLSAgICB7Ci0gICAgICBpZiAoZklzSGFuZGxpbmdBY3RpdmF0aW9uIHx8IChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKGZBY3RpdmVQYXJ0ID09IENvbW1vbk11bHRpUGFnZUVkaXRvci50aGlzKQotICAgICAgewotICAgICAgICBmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSB0cnVlOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGdldFRleHRFZGl0b3IoKS5zYWZlbHlTYW5pdHlDaGVja1N0YXRlKGdldEVkaXRvcklucHV0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dBY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KQotICAgIHsKLSAgICAgIGlmICh3aW5kb3cgPT0gZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKQotICAgICAgewotICAgICAgICAvKgotICAgICAgICAgKiBXb3JrYXJvdW5kIGZvciBwcm9ibGVtIGRlc2NyaWJlZCBpbgotICAgICAgICAgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzMxIFdpbGwgYmUgcmVtb3ZlZAotICAgICAgICAgKiB3aGVuIFNXVCBoYXMgc29sdmVkIHRoZSBwcm9ibGVtLgotICAgICAgICAgKi8KLSAgICAgICAgd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVBY3RpdmF0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0RlYWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdpbmRvd0RlYWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KQotICAgIHsKLSAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0Nsb3NlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpCi0gICAgewotICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93T3BlbmVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykKLSAgICB7Ci0gICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NvdXJjZVBhZ2VBY3RpdmUoKQotICB7Ci0gICAgcmV0dXJuIGdldEFjdGl2ZVBhZ2UoKSA9PSBTT1VSQ0VfUEFHRV9JTkRFWDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEludm9rZWQgZHVyaW5nIElQYXJ0TGlzdGVuZXIjcGFydE9wZW5lZC4gRGVyaXZlZCBjbGFzc2VzIGNhbiBvdmVycmlkZQotICAgKiB0byBwcm92aWRlIHNwZWNpYWxpemVkIGJlaGF2aW91ci4gIAotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0RWRpdG9yT3BlblRhc2tzKCkgewotCSAgLy8gTm90aGluZyB0byBkbyBpbiB0aGUgYmFzZSBjbGFzcy4KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0NvbW1vblNlbGVjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9Db21tb25TZWxlY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZWFkNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0NvbW1vblNlbGVjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uU2VsZWN0aW9uTWFuYWdlciBleHRlbmRzIE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi17Ci0KLSAgcHVibGljIENvbW1vblNlbGVjdGlvbk1hbmFnZXIoTXVsdGlQYWdlRWRpdG9yUGFydCBtdWx0aVBhZ2VFZGl0b3IpCi0gIHsKLSAgICBzdXBlcihtdWx0aVBhZ2VFZGl0b3IpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2FkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2dldFNlbGVjdGlvbigpCi0gICAqLwotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjc2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRoaXMpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZW5hYmxlTm90aWZ5KQotICAgIHsKLSAgICAgIHNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSwgZXZlbnQuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0gICAgfQotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlTm90aWZ5ID0gdHJ1ZTsKLQotICBwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVOb3RpZnkoKQotICB7Ci0gICAgcmV0dXJuIGVuYWJsZU5vdGlmeTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBJU2VsZWN0aW9uUHJvdmlkZXIgc291cmNlKQotICB7ICAKLSAgICBpZiAoZW5hYmxlTm90aWZ5KQotICAgIHsKLSAgICAgIGN1cnJlbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgICBlbmFibGVOb3RpZnkgPSBmYWxzZTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNvdXJjZSwgc2VsZWN0aW9uKTsKLSAgICAgICAgTGlzdCBjb3B5T2ZMaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KGxpc3RlbmVyTGlzdCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvcHlPZkxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKWkubmV4dCgpOwotICAgICAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIGVuYWJsZU5vdGlmeSA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQ29udGV4dE1lbnVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0NvbnRleHRNZW51UGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlkNDI0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQ29udGV4dE1lbnVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQ29udGV4dE1lbnVQYXJ0aWNpcGFudAoteyAgCi0gIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgYWN0aW9uSWQpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgY29udHJpYnV0ZUFjdGlvbnMoT2JqZWN0IG9iamVjdCwgSU1lbnVNYW5hZ2VyIG1lbnUpCi0gIHsgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9FZGl0b3JNb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvRWRpdG9yTW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmVmODQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9FZGl0b3JNb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWRpdG9yTW9kZSBpbXBsZW1lbnRzIElBZGFwdGFibGUKLXsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJZCgpOwotICAKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotICAKLSAgcHVibGljIGFic3RyYWN0IEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKTsKLSAgCi0gIC8vIFRPRE8gKGNzKSB0aGlzIHNob3VsZCByZXR1cm4gSVRyZWVDb250ZW50UHJvdmlkZXIKLSAgcHVibGljIGFic3RyYWN0IElDb250ZW50UHJvdmlkZXIgZ2V0T3V0bGluZVByb3ZpZGVyKCk7Ci0gIAotICBwdWJsaWMgQ29udGV4dE1lbnVQYXJ0aWNpcGFudCBnZXRDb250ZXh0TWVudVBhcnRpY2lwYW50KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvRWRpdG9yTW9kZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9FZGl0b3JNb2RlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmJlZjY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9FZGl0b3JNb2RlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBFZGl0b3JNb2RlTWFuYWdlciBpbXBsZW1lbnRzIElBZGFwdGFibGUKLXsKLSAgcHJpdmF0ZSBMaXN0IG1vZGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIEVkaXRvck1vZGUgY3VycmVudE1vZGUgPSBudWxsOwotICBwcml2YXRlIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIFN0cmluZyBleHRlbnNpb25Qb2ludElkOwotICBwcml2YXRlIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcjsKLSAgCi0gIHB1YmxpYyBFZGl0b3JNb2RlTWFuYWdlcihTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCkKLSAgewotICAgIHRoaXMuZXh0ZW5zaW9uUG9pbnRJZCA9IGV4dGVuc2lvblBvaW50SWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGluaXQoKQotICB7IAotICAgIHJlYWRSZWdpc3RyeShleHRlbnNpb25Qb2ludElkKTsgICAgCi0gICAgY3VycmVudE1vZGUgPSBnZXREZWZhdWx0TW9kZSgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgRWRpdG9yTW9kZSBnZXREZWZhdWx0TW9kZSgpCi0gIHsKLSAgICByZXR1cm4gKEVkaXRvck1vZGUpbW9kZUxpc3QuZ2V0KDApOyAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkTW9kZShFZGl0b3JNb2RlIG1vZGUpCi0gIHsKLSAgICBtb2RlTGlzdC5hZGQobW9kZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0b3JNb2RlIGdldEVkaXRvck1vZGUoU3RyaW5nIGVkaXRvck1vZGVJZCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IG1vZGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRWRpdG9yTW9kZSBlZGl0b3JNb2RlID0gKEVkaXRvck1vZGUpaS5uZXh0KCk7Ci0gICAgICBpZiAoZWRpdG9yTW9kZUlkLmVxdWFscyhlZGl0b3JNb2RlLmdldElkKCkpKQotICAgICAgewotICAgICAgICByZXR1cm4gZWRpdG9yTW9kZTsKLSAgICAgIH0gIAotICAgIH0gIAotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50TW9kZShFZGl0b3JNb2RlIG1vZGUpCi0gIHsKLSAgICBpZiAobW9kZUxpc3QuY29udGFpbnMobW9kZSkpCi0gICAgewotICAgICAgY3VycmVudE1vZGUgPSBtb2RlOwotICAgICAgTGlzdCBjbG9uZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgY2xvbmVkTGlzdC5hZGRBbGwobGlzdGVuZXJzKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNsb25lZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvck1vZGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJRWRpdG9yTW9kZUxpc3RlbmVyKWkubmV4dCgpOwotICAgICAgICBsaXN0ZW5lci5lZGl0b3JNb2RlQ2hhbmdlZChtb2RlKTsKLSAgICAgIH0gIAotICAgIH0gIAotICB9Ci0gIAotICBwdWJsaWMgRWRpdG9yTW9kZSBnZXRDdXJyZW50TW9kZSgpCi0gIHsKLSAgICByZXR1cm4gY3VycmVudE1vZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0b3JNb2RlW10gZ2V0TW9kZXMoKQotICB7Ci0gICAgRWRpdG9yTW9kZVtdIG1vZGVzID0gbmV3IEVkaXRvck1vZGVbbW9kZUxpc3Quc2l6ZSgpXTsKLSAgICBtb2RlTGlzdC50b0FycmF5KG1vZGVzKTsKLSAgICByZXR1cm4gbW9kZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElFZGl0b3JNb2RlTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0gICAgeyAgCi0gICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUVkaXRvck1vZGVMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOyAgCi0gIH0gIAotICAKLSAgcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeShTdHJpbmcgaWQpCi0gIHsgICAgCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihpZCk7ICAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICBTdHJpbmcgZWRpdG9yTW9kZUlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChlZGl0b3JNb2RlSWQgIT0gbnVsbCAmJiAKLSAgICAgICAgICBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyICE9IG51bGwgJiYKLSAgICAgICAgICAhcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5pc0VkaXRvck1vZGVBcHBsaWNhYmxlKGVkaXRvck1vZGVJZCkpCi0gICAgICB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfSAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgRWRpdG9yTW9kZSBtb2RlID0gKEVkaXRvck1vZGUpZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgICBtb2RlTGlzdC5hZGQobW9kZSk7ICAgICAgICAKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfSAgCi0gIAotICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcikKLSAgewotICAgIHRoaXMucHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9JQURURWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9JQURURWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2NGQ2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvSUFEVEVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFEVEVkaXRvcklucHV0IGV4dGVuZHMgSUVkaXRvcklucHV0Ci17Ci0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvSUVkaXRvck1vZGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0lFZGl0b3JNb2RlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5OGJkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvSUVkaXRvck1vZGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUVkaXRvck1vZGVMaXN0ZW5lcgotewotICB2b2lkIGVkaXRvck1vZGVDaGFuZ2VkKEVkaXRvck1vZGUgbmV3RWRpdG9yTW9kZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjdkZTcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUwotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgTWVzc2FnZXMoKQotICB7Ci0gIH0KLQotICBzdGF0aWMKLSAgewotICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotICB9Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fU0hPV19QUk9QRVJUSUVTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1NFVF9BU19GT0NVUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ERUxFVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0ZJRUxEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0JST1dTRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ORVc7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX05BTUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX0VMRU1FTlRfUkVGRVJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1NFTEVDVF9BTEw7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ERVNJR047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TT1VSQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9WSUVXOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSE9WRVJfVklFV19NT0RFX0RFU0NSSVBUSU9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX09WRVJXUklURV9DT05GSVJNQVRJT05fUVVFU1RJT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fT1ZFUldSSVRFX0NPTkZJUk1BVElPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9FUlJPUl9USVRMRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9FUlJPUl9ERVNDUklQVElPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9GT1JNQVRfTk9UX1NVUFBPUlRFRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBUFRVUkVfU0NSRUVOX0FDVElPTl9URVhUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FQVFVSRV9TQ1JFRU5fQUNUSU9OX1RPT0xUSVBURVhUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0RFRkFVTFRfRklMRV9OQU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0ZJTEVfU0FWRV9ESUFMT0dfVElUTEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9IT1ZFUl9CQUNLX1RPX1NDSEVNQTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFRkFDVE9SX0NPTlRFWFRfTUVOVTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0hZUEVSTElOS19URVhUOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL1Byb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjZTA2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLk5hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLkV4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcgotewotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0VkaXRvck1vZGVBcHBsaWNhYmxlKFN0cmluZyBpZCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RWRpdG9yTW9kZURpc3BsYXlOYW1lKFN0cmluZyBpZCk7Ci0gCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdFN0cmluZyhTdHJpbmcgaWQpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdFN0cmluZyhTdHJpbmcgaWQsIE9iamVjdFtdIGFyZ3MpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUFjdGlvbihTdHJpbmcgYWN0aW9uSWQpCi0gIHsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBOYXZpZ2F0aW9uTG9jYXRpb24gZ2V0TmF2aWdhdGlvbkxvY2F0aW9uKElFZGl0b3JQYXJ0IHBhcnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCwgQmFzZUVkaXRQYXJ0IGVkaXRQYXJ0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFeHRlbnNpYmxlQ29udGVudE91dGxpbmVQYWdlIGdldFByb2R1Y3RDb250ZW50T3V0bGluZVBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTBlNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1fVUlfQUNUSU9OX1NIT1dfUFJPUEVSVElFUz1TaG8mdyBwcm9wZXJ0aWVzCi1fVUlfQUNUSU9OX1NFVF9BU19GT0NVUz0mU2V0IEFzIEZvY3VzCi1fVUlfQUNUSU9OX1VQREFURV9OQU1FPVVwZGF0ZSBOYW1lCi1fVUlfQUNUSU9OX1VQREFURV9UWVBFPVVwZGF0ZSB0eXBlCi1fVUlfQUNUSU9OX1VQREFURV9FTEVNRU5UX1JFRkVSRU5DRT1VcGRhdGUgZWxlbWVudCByZWZlcmVuY2UKLV9VSV9BQ1RJT05fREVMRVRFPSZEZWxldGUKLV9VSV9BQ1RJT05fQlJPV1NFPSZCcm93c2UuLi4KLV9VSV9MQUJFTF9ERVNJR049RGVzaWduCi1fVUlfTEFCRUxfU09VUkNFPVNvdXJjZQotX1VJX0FDVElPTl9ORVc9Jk5ldy4uLgotX1VJX0FDVElPTl9BRERfRklFTEQ9QWRkIEZpZWxkCi1fVUlfTEFCRUxfVklFVz1WaWV3OgotX1VJX0hPVkVSX1ZJRVdfTU9ERV9ERVNDUklQVElPTj1DaGFuZ2UgdGhlIHZpZXcgbW9kZSBvZiB0aGUgZWRpdG9yCi1fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX09WRVJXUklURV9DT05GSVJNQVRJT05fUVVFU1RJT049UXVlc3Rpb24KLV9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fT1ZFUldSSVRFX0NPTkZJUk1BVElPTj1UaGUgZmlsZSB7MH0gYWxyZWFkeSBleGlzdHMuIERvIHlvdSB3YW50IHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIGZpbGU/Ci1fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0VSUk9SX1RJVExFPUVycm9yCi1fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0VSUk9SX0RFU0NSSVBUSU9OPUNvdWxkIG5vdCBzYXZlIGVkaXRvciBjb250ZW50cwotX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9GT1JNQVRfTk9UX1NVUFBPUlRFRD1Gb3JtYXQgbm90IHN1cHBvcnRlZAotX1VJX0NBUFRVUkVfU0NSRUVOX0FDVElPTl9URVhUID0gJkV4cG9ydCBEaWFncmFtIGFzIEltYWdlLi4uCi1fVUlfQ0FQVFVSRV9TQ1JFRU5fQUNUSU9OX1RPT0xUSVBURVhUID0gRXhwb3J0IERpYWdyYW0gYXMgSW1hZ2UKLV9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fREVGQVVMVF9GSUxFX05BTUUgPSBEaWFncmFtCi1fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0ZJTEVfU0FWRV9ESUFMT0dfVElUTEU9RXhwb3J0IERpYWdyYW0gYXMgSW1hZ2UKLV9VSV9IT1ZFUl9CQUNLX1RPX1NDSEVNQT1TaG93IHNjaGVtYSBpbmRleCB2aWV3Ci1fVUlfQUNUSU9OX1NFTEVDVF9BTEw9U2VsZWN0ICZBbGwKLV9VSV9SRUZBQ1RPUl9DT05URVhUX01FTlU9UmVmYWMmdG9yCi1fVUlfSFlQRVJMSU5LX1RFWFQgPSBPcGVuIHswfSB3aXRoIHRoZSBYTUwgU2NoZW1hIGVkaXRvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lBRFRPYmplY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JQURUT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYTRhODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lBRFRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFEVE9iamVjdAotewotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKTsKLSAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKTsKLSAgICBib29sZWFuIGlzUmVhZE9ubHkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JQURUT2JqZWN0TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JQURUT2JqZWN0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjOGVmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSUFEVE9iamVjdExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElBRFRPYmplY3RMaXN0ZW5lcgotewotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lDb21wbGV4VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lDb21wbGV4VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTdhZGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JQ29tcGxleFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGU7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wbGV4VHlwZSBleHRlbmRzIElUeXBlLCBJU3RydWN0dXJlCi17Ci0gIGJvb2xlYW4gaXNBYnN0cmFjdCgpOwotICBPYmplY3QgZ2V0Q29udGVudFR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JRmllbGQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzMWQzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSUZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZpZWxkIGV4dGVuZHMgSUFEVE9iamVjdAotewotICBTdHJpbmcgZ2V0S2luZCgpOwotICBTdHJpbmcgZ2V0TmFtZSgpOwotICBTdHJpbmcgZ2V0VHlwZU5hbWUoKTsKLSAgU3RyaW5nIGdldFR5cGVOYW1lUXVhbGlmaWVyKCk7Ci0gIElNb2RlbCBnZXRNb2RlbCgpOwotICBJVHlwZSBnZXRUeXBlKCk7Ci0gIElDb21wbGV4VHlwZSBnZXRDb250YWluZXJUeXBlKCk7Ci0gIGludCBnZXRNaW5PY2N1cnMoKTsKLSAgaW50IGdldE1heE9jY3VycygpOwotICBib29sZWFuIGlzR2xvYmFsKCk7Ci0gIGJvb2xlYW4gaXNSZWZlcmVuY2UoKTsKLSAgYm9vbGVhbiBpc0Fic3RyYWN0KCk7Ci0gIAotICBDb21tYW5kIGdldFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoaW50IG1pbk9jY3Vycyk7Ci0gIENvbW1hbmQgZ2V0VXBkYXRlTWF4T2NjdXJzQ29tbWFuZChpbnQgbWF4T2NjdXJzKTsKLSAgQ29tbWFuZCBnZXRVcGRhdGVUeXBlTmFtZUNvbW1hbmQoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgcXVhaWxpZmllcik7Ci0gIENvbW1hbmQgZ2V0VXBkYXRlTmFtZUNvbW1hbmQoU3RyaW5nIG5hbWUpOyAKLSAgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCk7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0MjQ1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsIGV4dGVuZHMgSUFEVE9iamVjdAotewotICBMaXN0IGdldFR5cGVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSVN0cnVjdHVyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lTdHJ1Y3R1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwZDE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSVN0cnVjdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmUgZXh0ZW5kcyBJQURUT2JqZWN0Ci17Ci0gIFN0cmluZyBnZXROYW1lKCk7Ci0gIExpc3QgZ2V0RmllbGRzKCk7Ci0gIElNb2RlbCBnZXRNb2RlbCgpOwotICBDb21tYW5kIGdldEFkZE5ld0ZpZWxkQ29tbWFuZChTdHJpbmcgZmllbGRLaW5kKTsKLSAgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCk7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZDFhZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVR5cGUgZXh0ZW5kcyBJQURUT2JqZWN0Ci17IAotICBJVHlwZSBnZXRTdXBlclR5cGUoKTsKLSAgU3RyaW5nIGdldE5hbWUoKTsKLSAgU3RyaW5nIGdldFF1YWxpZmllcigpOwotICBib29sZWFuIGlzQ29tcGxleFR5cGUoKTsKLSAgYm9vbGVhbiBpc0Fub255bW91cygpOwotICAKLSAgQ29tbWFuZCBnZXRVcGRhdGVOYW1lQ29tbWFuZChTdHJpbmcgbmV3TmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0FEVENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9BRFRDb250ZW50T3V0bGluZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmYjAxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0FEVENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLkNhdGVnb3J5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlJlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEUmVkZWZpbmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEU2NoZW1hQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdDb250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSU1vZGVsUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFEVENvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIEV4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2UKLXsKLSAgcHJvdGVjdGVkIGludCBsZXZlbCA9IDA7Ci0gIHByb3RlY3RlZCBNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25NYW5hZ2VyOwotICBwcm90ZWN0ZWQgU2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQotICBwdWJsaWMgQURUQ29udGVudE91dGxpbmVQYWdlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgZ2V0VHJlZVZpZXdlcigpLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRJbnB1dChtb2RlbCk7Ci0gICAgZ2V0VHJlZVZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLSAgICBNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigiI3BvcHVwIik7Ly8kTk9OLU5MUy0xJAotICAgIG1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLSAgICBNZW51IG1lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpKTsKLSAgICBnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0gICAgc2V0U2VsZWN0aW9uTWFuYWdlcihlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgbWVudS4uLmZvciBub3cgcmV1c2UgZ3JhcGgncy4gIE5vdGUgZWRpdCBwYXJ0IHZpZXdlciA9IG51bGwKLSAgICBEZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlciBtZW51UHJvdmlkZXIgPSBuZXcgRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIoZWRpdG9yLCBudWxsLCBlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobWVudVByb3ZpZGVyKTsKLSAgICBnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudSgib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5wb3B1cC5vdXRsaW5lIiwgbWVudU1hbmFnZXIsIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBlbmFibGUgcG9wdXBNZW51cyBleHRlbnNpb24KLSAgICAvLyBnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudSgib3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci51aS5wb3B1cC5vdXRsaW5lIiwKLSAgICAvLyBtZW51TWFuYWdlciwgeHNkRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0KLSAgICAvLyBkcmlsbCBkb3duIGZyb20gb3V0bGluZSB2aWV3Ci0gICAgZ2V0VHJlZVZpZXdlcigpLmdldENvbnRyb2woKS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uIGlTZWxlY3Rpb24gPSBnZXRUcmVlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChpU2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGlTZWxlY3Rpb247Ci0gICAgICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgb2JqOwotICAgICAgICAgICAgaWYgKGNvbXAuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGdldFhTREVkaXRvcigpLmdldEdyYXBoVmlld2VyKCkuc2V0SW5wdXQob2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgY2xhc3MgWFNES2V5TGlzdGVuZXIgZXh0ZW5kcyBLZXlBZGFwdGVyCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFeHBhbmRUb0xldmVsKGludCBpKQotICB7Ci0gICAgbGV2ZWwgPSBpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgZ2V0VHJlZVZpZXdlcigpLnNldElucHV0KHZhbHVlKTsKLSAgICBnZXRUcmVlVmlld2VyKCkuZXhwYW5kVG9MZXZlbChsZXZlbCk7Ci0gIH0KLQotICAvLyBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICAvLyB7Ci0gIC8vIGlmIChnZXRUcmVlVmlld2VyKCkgPT0gbnVsbCkKLSAgLy8gcmV0dXJuIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0gIC8vIHJldHVybiBnZXRUcmVlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIC8vIH0KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uTWFuYWdlcihNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlciBuZXdTZWxlY3Rpb25NYW5hZ2VyKQotICB7Ci0gICAgLy8gZGlzY29ubmVjdCBmcm9tIG9sZCBvbmUKLSAgICBpZiAoc2VsZWN0aW9uTWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbk1hbmFnZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0gICAgfQotICAgIHNlbGVjdGlvbk1hbmFnZXIgPSBuZXdTZWxlY3Rpb25NYW5hZ2VyOwotICAgIC8vIGNvbm5lY3QgdG8gbmV3IG9uZQotICAgIGlmIChzZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgc2VsZWN0aW9uTWFuYWdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgU2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgdXBkYXRlU3RhdHVzTGluZShnZXRTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCksIGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgICAgIGlmIChldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpICE9IEFEVENvbnRlbnRPdXRsaW5lUGFnZS50aGlzKSAgLy9nZXRUcmVlVmlld2VyKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRUcmVlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBPYmplY3Qgc2VsZWN0aW9uRmlyc3RFbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBPYmplY3QgY3VycmVudEZpcnN0RWxlbWVudCA9IGN1cnJlbnRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgCi0gICAgICAgIC8vIFRPRE86IEhhY2sgdG8gcHJldmVudCBsb3NpbmcgYSBzZWxlY3Rpb24gd2hlbiB0aGUgc2NoZW1hIGlzIHNlbGVjdGVkIGluIHRoZQotICAgICAgICAvLyBzb3VyY2UuICBGaXggaXMgdG8gcHJldmVudCB0aGUgc291cmNlIGZyb20gZmlyaW5nIG9mZiBzZWxlY3Rpb24gY2hhbmdlcyB3aGVuCi0gICAgICAgIC8vIHRoZSBzZWxlY3Rpb24gc291cmNlIGlzIG5vdCB0aGUgc291cmNlIHZpZXcuCi0gICAgICAgIAotICAgICAgICBpZiAoc2VsZWN0aW9uRmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSU1vZGVsKQotICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgIGlmICghKGN1cnJlbnRGaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kZWxQcm94eSkgfHwgY3VycmVudEZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIFJlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCksIHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzZWxlY3Rpb25GaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKQotICAgICAgICB7Ci0gICAgICAgIAlpZiAoIShjdXJyZW50Rmlyc3RFbGVtZW50IGluc3RhbmNlb2YgUmVkZWZpbmVDYXRlZ29yeUFkYXB0ZXIpKQotICAgICAgICAJewotICAgICAgICAJCWdldFRyZWVWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCksIHRydWUpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICAgIExpc3QgbGlzdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24udG9MaXN0KCk7Ci0gICAgICAgICAgaW50IHNlbGVjdGlvbkxlbmd0aCA9IGxpc3Quc2l6ZSgpOwotICAgICAgICAgIGlmIChzZWxlY3Rpb25MZW5ndGggPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE9iamVjdCBpdGVtID0gbGlzdC5nZXQoaSk7Ci0KLSAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBBZGFwdGVySW1wbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5vdGlmaWVyIHRhcmdldCA9ICgoQWRhcHRlckltcGwpIGl0ZW0pLmdldFRhcmdldCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpKQotICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgdGFyZ2V0OwotCi0gICAgICAgICAgICAgICAgLy8gbmVlZCB0byBleHBhbmQgcGFyZW50IGJlZm9yZSBjaGlsZCwgdGh1cyBhIHN0YWNrIGlzIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgU3RhY2sgY29tcG9uZW50U3RhY2sgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoeHNkQ29uY3JldGVDb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjb21wb25lbnRTdGFjay5wdXNoKHhzZENvbmNyZXRlQ29tcG9uZW50KTsKLSAgICAgICAgICAgICAgICAgIHhzZENvbmNyZXRlQ29tcG9uZW50ID0geHNkQ29uY3JldGVDb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgc3RhY2sgbXVzdCBoYXZlIHRoZSBYU0RTY2hlbWFBZGFwdGVyIGFuZAotICAgICAgICAgICAgICAgIC8vIGF0IGxlYXN0IG9uZSBjb21wb25lbnQKLSAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50U3RhY2suc2l6ZSgpIDwgMikKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgLy8gUG9wIG9mZiB0aGUgdG9wIG5vZGUsIHNpbmNlIGl0IGlzIHRoZSBYU0RTY2hlbWFBZGFwdGVyLCB3aGljaAotICAgICAgICAgICAgICAgIC8vIGlzbid0Ci0gICAgICAgICAgICAgICAgLy8gdXNlZCBhcyBwYXJ0IG9mIGZpbmRpbmcgdGhlIG91dGxpbmUgdmlldyBoaWVyYXJjaHkKLSAgICAgICAgICAgICAgICBjb21wb25lbnRTdGFjay5wb3AoKTsKLQotICAgICAgICAgICAgICAgIGlmICgoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBjb21wb25lbnRTdGFjay5wZWVrKCkpLmVBZGFwdGVycygpLnNpemUoKSA8PSAwKQotICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgY29tcG9uZW50U3RhY2sucGVlaygpKS5lQWRhcHRlcnMoKS5nZXQoMCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBGaW5kIG91dCB3aGljaCBjYXRlZ29yeSB0aGUgc2VsZWN0ZWQgaXRlbSBpcyBjb250YWluZWQgaW4KLSAgICAgICAgICAgICAgICBpbnQgY2F0ZWdvcnlJbmRleCA9IC0xOwotICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNhdGVnb3J5SW5kZXggPSBDYXRlZ29yeUFkYXB0ZXIuRElSRUNUSVZFUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXRlZ29yeUluZGV4ID0gQ2F0ZWdvcnlBZGFwdGVyLkVMRU1FTlRTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlJbmRleCA9IENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNhdGVnb3J5SW5kZXggPSBDYXRlZ29yeUFkYXB0ZXIuQVRUUklCVVRFUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlciB8fCBvYmplY3QgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlJbmRleCA9IENhdGVnb3J5QWRhcHRlci5UWVBFUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNhdGVnb3J5SW5kZXggPSBDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEV4cGFuZCB0aGUgY2F0ZWdvcnkKLSAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnlJbmRleCA9PSAtMSkKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIENhdGVnb3J5QWRhcHRlciBjYXRlZ29yeSA9ICgoWFNEU2NoZW1hQWRhcHRlcikgbW9kZWwpLmdldENhdGVnb3J5KGNhdGVnb3J5SW5kZXgpOwotICAgICAgICAgICAgICAgIHRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShjYXRlZ29yeSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBEbyBub3QgZXhwYW5kIGN1cnJlbnQgbm9kZSBvZiBpbnRlcmVzdCwganVzdCBpdHMgcGFyZW50cwotICAgICAgICAgICAgICAgIHdoaWxlIChjb21wb25lbnRTdGFjay5zaXplKCkgPiAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG9iamVjdCA9IGNvbXBvbmVudFN0YWNrLnBvcCgpOwotICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpIG9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5lQWRhcHRlcnMoKS5zaXplKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gZXhwYW5kCi0gICAgICAgICAgICAgICAgICAgICAgZ2V0VHJlZVZpZXdlcigpLnNldEV4cGFuZGVkU3RhdGUoY29tcG9uZW50LmVBZGFwdGVycygpLmdldCgwKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gQnVnIDI1MTQ3NCAtIFdlIHdpbGwgcmVzdHJpY3Qgc2VsZWN0aW9uIHRvIG9ubHkgb25lIGl0ZW0KLSAgICAgICAgICBpZiAoc2VsZWN0aW9uTGVuZ3RoID09IDEpCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgIAkgIGlmKHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgIT1udWxsKQotICAgICAgICAJCSAgZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKSwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBtZ3IsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgU3RyaW5nIHRleHQgPSBudWxsOwotICAgIEltYWdlIGltYWdlID0gbnVsbDsKLSAgICBJTGFiZWxQcm92aWRlciBzdGF0dXNMaW5lTGFiZWxQcm92aWRlciA9IG5ldyBTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihnZXRUcmVlVmlld2VyKCkpOwotICAgIGlmIChzdGF0dXNMaW5lTGFiZWxQcm92aWRlciAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIE9iamVjdCBmaXJzdEVsZW1lbnQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lQWRhcHRlcikKLSAgICAJICByZXR1cm47Ci0gICAgICB0ZXh0ID0gc3RhdHVzTGluZUxhYmVsUHJvdmlkZXIuZ2V0VGV4dChmaXJzdEVsZW1lbnQpOwotICAgICAgaW1hZ2UgPSBzdGF0dXNMaW5lTGFiZWxQcm92aWRlci5nZXRJbWFnZShmaXJzdEVsZW1lbnQpOwotICAgIH0KLSAgICBpZiAoaW1hZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBtZ3Iuc2V0TWVzc2FnZSh0ZXh0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1nci5zZXRNZXNzYWdlKGltYWdlLCB0ZXh0KTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBTdGF0dXNMaW5lTGFiZWxQcm92aWRlciBleHRlbmRzIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIKLSAgewotICAgIFRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpCi0gICAgewotICAgICAgdHJlZVZpZXdlciA9IHZpZXdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgIFN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgcy5hcHBlbmQobGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpKTsKLSAgICAgIHJldHVybiBzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiBsYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUQ29udGVudE91dGxpbmVQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9BRFRDb250ZW50T3V0bGluZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNmU3NmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9BRFRDb250ZW50T3V0bGluZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBBRFRDb250ZW50T3V0bGluZVByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIsIElBRFRPYmplY3RMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgVmlld2VyIHZpZXdlciA9IG51bGw7Ci0gIHByb3RlY3RlZCBPYmplY3Qgb2xkSW5wdXQsIG5ld0lucHV0OwotICBwcm90ZWN0ZWQgQURUQ29udGVudE91dGxpbmVSZWZyZXNoSm9iIHJlZnJlc2hKb2I7Ci0KLSAgcHVibGljIEFEVENvbnRlbnRPdXRsaW5lUHJvdmlkZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElUcmVlRWxlbWVudCkKLSAgICB7Ci0gICAgICBPYmplY3RbXSBjaGlsZHJlbiA9ICgoSVRyZWVFbGVtZW50KSBwYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbigpOwotICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGludCBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3QgY2hpbGQgPSBjaGlsZHJlbltpXTsKLSAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoSUFEVE9iamVjdCkgY2hpbGQpLnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY2hpbGRyZW47Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHJlZUVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuICgoSVRyZWVFbGVtZW50KSBlbGVtZW50KS5oYXNDaGlsZHJlbigpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIE9iamVjdCBpbnB1dCA9IHZpZXdlci5nZXRJbnB1dCgpOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgewotICAgICAgcmVtb3ZlTGlzdGVuZXIoKElBRFRPYmplY3QpIGlucHV0KTsKLSAgICB9Ci0gICAgaWYgKHJlZnJlc2hKb2IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWZyZXNoSm9iLmNhbmNlbCgpOwotICAgICAgcmVmcmVzaEpvYiA9IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gIHsKLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICB0aGlzLm9sZElucHV0ID0gb2xkSW5wdXQ7Ci0gICAgdGhpcy5uZXdJbnB1dCA9IG5ld0lucHV0OwotICAgIGlmIChyZWZyZXNoSm9iICE9IG51bGwpCi0gICAgewotICAgICAgcmVmcmVzaEpvYi5jYW5jZWwoKTsKLSAgICB9Ci0gICAgcmVmcmVzaEpvYiA9IG5ldyBBRFRDb250ZW50T3V0bGluZVJlZnJlc2hKb2Iodmlld2VyKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlZChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIHJlZnJlc2hKb2IucmVmcmVzaCgoSUFEVE9iamVjdClvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBtb2RlbAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHJlbW92ZUxpc3RlbmVyKElBRFRPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBtb2RlbC51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgT2JqZWN0W10gY2hpbGRyZW4gPSBudWxsOwotICAgIAotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElUcmVlRWxlbWVudCkKLSAgICB7Ci0gICAgICBjaGlsZHJlbiA9ICgoSVRyZWVFbGVtZW50KSBtb2RlbCkuZ2V0Q2hpbGRyZW4oKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJQURUT2JqZWN0ICYmIG1vZGVsICE9IGNoaWxkKQotICAgICAgICB7Ci0gICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoKElBRFRPYmplY3QpIGNoaWxkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0FEVENvbnRlbnRPdXRsaW5lUmVmcmVzaEpvYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9BRFRDb250ZW50T3V0bGluZVJlZnJlc2hKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwNGNmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0FEVENvbnRlbnRPdXRsaW5lUmVmcmVzaEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuQ2F0ZWdvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotCi0KLS8qKgotICogVGhpcyBqb2IgaG9sZHMgYSBxdWV1ZSBvZiB1cGRhdGVzIChhZmZlY3RlZCBub2RlcykgZm9yIHRoZSBYU0QgZWRpdG9yJ3MKLSAqIG91dGxpbmUgdmlldy4gV2hlbiBhIG5ldyByZXF1ZXN0IGNvbWVzIGluLCB0aGUgY3VycmVudCBydW4gaXMgY2FuY2VsbGVkLCAKLSAqIHRoZSBuZXcgcmVxdWVzdCBpcyBhZGRlZCB0byB0aGUgcXVldWUsIHRoZW4gdGhlIGpvYiBpcyByZS1zY2hlZHVsZWQuCi0gKiBUaGlzIGNsYXNzIGlzIGxvb3NlbHkgYmFzZWQgb24gUmVmcmVzaFN0cnVjdHVyZUpvYi4KLSAqLwotY2xhc3MgQURUQ29udGVudE91dGxpbmVSZWZyZXNoSm9iIGV4dGVuZHMgSm9iCi17Ci0gIC8qKgotICAgKiBUaGUgZGVsYXkgdGltZSBpbiBtaWxsaXNlY29uZHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVQREFURV9ERUxBWSA9IDMwMDsKLQotICBwcml2YXRlIGZpbmFsIExpc3Qgbm9kZXNUb1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0KDUpOwotCi0gIHByaXZhdGUgZmluYWwgVHJlZVZpZXdlciB2aWV3ZXI7Ci0KLSAgcHVibGljIEFEVENvbnRlbnRPdXRsaW5lUmVmcmVzaEpvYihWaWV3ZXIgdmlld2VyKQotICB7Ci0gICAgc3VwZXIoIlJlZnJlc2hpbmcgWFNEIG91dGxpbmUiKTsgLy8kTk9OLU5MUy0xJAotICAgIHNldFByaW9yaXR5KEpvYi5MT05HKTsKLSAgICBzZXRTeXN0ZW0odHJ1ZSk7Ci0gICAgdGhpcy52aWV3ZXIgPSAoVHJlZVZpZXdlcil2aWV3ZXI7Ci0gIH0KLQotICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFJlZnJlc2hSZXF1ZXN0KElBRFRPYmplY3QgYWR0T2JqZWN0KQotICB7Ci0gICAgaWYgKG5vZGVzVG9SZWZyZXNoLmNvbnRhaW5zKGFkdE9iamVjdCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG5vZGVzVG9SZWZyZXNoLmFkZChhZHRPYmplY3QpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY2FuY2VsaW5nKCkKLSAgewotICAgIG5vZGVzVG9SZWZyZXNoLmNsZWFyKCk7Ci0gICAgc3VwZXIuY2FuY2VsaW5nKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZG9SZWZyZXNoKGZpbmFsIElBRFRPYmplY3QgYWR0T2JqZWN0KQotICB7Ci0gICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0gICAgZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gaXNWYWxpZFZpZXdlciA9IHZpZXdlciAhPSBudWxsICYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKTsKLSAgICAgICAgICBpZiAoaXNWYWxpZFZpZXdlcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2aWV3ZXIucmVmcmVzaChhZHRPYmplY3QpOwotCi0gICAgICAgICAgICAvLyBOZWVkbGVzc2x5IHJldmVhbGluZyB0aGUgY2F0ZWdvcnkgbm9kZXMgY2F1c2VzIGEgbG90IG9mIFVJIGZsaWNrZXIuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghKGFkdE9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5QWRhcHRlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHZpZXdlci5yZXZlYWwoYWR0T2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICB9Ci0KLSAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgSUFEVE9iamVjdFtdIGdldE5vZGVzVG9SZWZyZXNoKCkKLSAgewotICAgIElBRFRPYmplY3RbXSB0b1JlZnJlc2ggPSBuZXcgSUFEVE9iamVjdCBbbm9kZXNUb1JlZnJlc2guc2l6ZSgpXTsKLSAgICBub2Rlc1RvUmVmcmVzaC50b0FycmF5KHRvUmVmcmVzaCk7Ci0gICAgbm9kZXNUb1JlZnJlc2guY2xlYXIoKTsKLQotICAgIHJldHVybiB0b1JlZnJlc2g7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKElBRFRPYmplY3QgYWR0T2JqZWN0KQotICB7Ci0gICAgaWYgKGFkdE9iamVjdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhZGRSZWZyZXNoUmVxdWVzdChhZHRPYmplY3QpOwotCi0gICAgc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gIHsKLSAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcGVyZm9ybVJlZnJlc2hlcyhtb25pdG9yKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1SZWZyZXNoZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICB7Ci0gICAgSUFEVE9iamVjdFtdIG5vZGVzID0gZ2V0Tm9kZXNUb1JlZnJlc2goKTsKLQotICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBub2Rlcy5sZW5ndGg7IGluZGV4KyspCi0gICAgewotICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIElBRFRPYmplY3Qgbm9kZSA9IG5vZGVzW2luZGV4XTsKLSAgICAgIGRvUmVmcmVzaChub2RlKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0FEVExhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGE2ZDRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBBRFRMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIKLXsKLQotICBwdWJsaWMgQURUTGFiZWxQcm92aWRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVRyZWVFbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiAoKElUcmVlRWxlbWVudCllbGVtZW50KS5nZXRJbWFnZSgpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVRyZWVFbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiAoKElUcmVlRWxlbWVudCllbGVtZW50KS5nZXRUZXh0KCk7Ci0gICAgfQotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0V4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvRXh0ZW5zaWJsZUNvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE5YTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvRXh0ZW5zaWJsZUNvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQURUTXVsdGlQYWdlRWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJsZUNvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIFBhZ2UgaW1wbGVtZW50cyBJQ29udGVudE91dGxpbmVQYWdlLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBMaXN0ZW5lckxpc3Qgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLSAgcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLSAgcHJvdGVjdGVkIE9iamVjdCBtb2RlbDsKLSAgcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLSAgcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBBRFRNdWx0aVBhZ2VFZGl0b3IgZWRpdG9yOwotCi0gIHByb3RlY3RlZCBFeHRlbnNpYmxlQ29udGVudE91dGxpbmVQYWdlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICB0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICB0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVkaXRvcihBRFRNdWx0aVBhZ2VFZGl0b3IgZWRpdG9yKQotICB7Ci0gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKE9iamVjdCBuZXdNb2RlbCkKLSAgewotICAgIG1vZGVsID0gbmV3TW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDb250ZW50UHJvdmlkZXIoSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKQotICB7Ci0gICAgdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmICh0cmVlVmlld2VyICE9IG51bGwpCi0gICAgewotICAgICAgdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGZpcmVTZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgLy8gY3JlYXRlIGFuIGV2ZW50Ci0gICAgZmluYWwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pOwotCi0gICAgLy8gZmlyZSB0aGUgZXZlbnQKLSAgICBPYmplY3RbXSBsaXN0ZW5lcnMgPSBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKQotICAgIHsKLSAgICAgIGZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbCA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0gICAgICBQbGF0Zm9ybS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgIHsKLSAgICAgICAgICBsLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkKLSAgewotICAgIGlmICh0cmVlVmlld2VyID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIHJldHVybiB0cmVlVmlld2VyLmdldENvbnRyb2woKTsKLSAgfQotCi0gIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gIHsKLSAgICBpZiAodHJlZVZpZXdlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotICAgIH0KLSAgICByZXR1cm4gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKQotICB7Ci0gICAgcmV0dXJuIHRyZWVWaWV3ZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KElQYWdlU2l0ZSBwYWdlU2l0ZSkKLSAgewotICAgIHN1cGVyLmluaXQocGFnZVNpdGUpOwotICAgIHBhZ2VTaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICAgIGZpcmVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9JVHJlZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvSVRyZWVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NjBkOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9JVHJlZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElUcmVlRWxlbWVudAotewotICBwdWJsaWMgZmluYWwgc3RhdGljIElUcmVlRWxlbWVudFtdIEVNUFRZX0xJU1QgPSB7fTsKLSAgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKTsKLSAgSVRyZWVFbGVtZW50IGdldFBhcmVudCgpOwotICBib29sZWFuIGhhc0NoaWxkcmVuKCk7Ci0gIFN0cmluZyBnZXRUZXh0KCk7Ci0gIEltYWdlIGdldEltYWdlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9wcm9wZXJ0aWVzL0FEVFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9wcm9wZXJ0aWVzL0FEVFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMTM0M2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3Byb3BlcnRpZXMvQURUVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0vKioKLSAqIEBkZXByZWNhdGVkLiAgRXh0ZW5kZXJzIHNob3VsZCBzcGVjaWFsaXplLi4uaWUuIFhTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBBRFRUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBleHRlbmRzIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlCi17Ci0gIHB1YmxpYyBBRFRUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZShJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKQotICB7Ci0gICAgc3VwZXIodGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQotLy8gICAgICBPYmplY3Qgc2VsZWN0ZWQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLS8vICAgICAgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRWRpdFBhcnQpCi0vLyAgICAgIHsKLS8vICAgICAgICBPYmplY3QgbW9kZWwgPSAoKEVkaXRQYXJ0KXNlbGVjdGVkKS5nZXRNb2RlbCgpOwotLy8gICAgICAgIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vZGVsKTsKLS8vICAgICAgfQotICAgICAgc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREFueUF0dHJpYnV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzc4NWZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEQW55QXR0cmlidXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEFkZFhTREFueUF0dHJpYnV0ZUFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5BZGRYU0RBbnlBdHRyaWJ1dGVBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICAKLSAgcHVibGljIEFkZFhTREFueUF0dHJpYnV0ZUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BTllfQVRUUklCVVRFKTsKLSAgICBzZXRJZChJRCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgIH0KLSAgICBBZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FOWV9BVFRSSUJVVEUsIChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHNlbGVjdGlvbik7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FOWV9BVFRSSUJVVEUsIChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIAotICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgewotICAgICAgYWRkZWRDb21wb25lbnQgPSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGFkZGVkQ29tcG9uZW50KTsKLSAgICAgIHNlbGVjdEFkZGVkQ29tcG9uZW50KGFkYXB0ZXIpOwotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpCi0gIHsKLSAgICBib29sZWFuIHJjID0gc3VwZXIuY2FsY3VsYXRlRW5hYmxlZCgpOwotICAgIGlmIChyYykKLSAgICB7Ci0gICAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm4gKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pc2VsZWN0aW9uKS5nZXRBdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQoKSA9PSBudWxsOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm4gKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pc2VsZWN0aW9uKS5nZXRBdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQoKSA9PSBudWxsOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIHJldHVybiByYzsKLSAgfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBbnlFbGVtZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREFueUVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUwYTUzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREFueUVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RBbnlFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLQotcHVibGljIGNsYXNzIEFkZFhTREFueUVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuQWRkWFNEQW55RWxlbWVudEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgQWRkWFNEQW55RWxlbWVudEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BTllfRUxFTUVOVCk7Ci0gICAgc2V0SWQoSUQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgc2VsZWN0aW9uID0gKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSBnZXRNb2RlbEdyb3VwKHNlbGVjdGlvbik7Ci0KLSAgICBBZGRYU0RBbnlFbGVtZW50Q29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTREFueUVsZW1lbnRDb21tYW5kKGdldFRleHQoKSwgbW9kZWxHcm91cCk7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBjb21tYW5kLnNldENvbXBsZXhUeXBlKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pc2VsZWN0aW9uKTsKLSAgICB9Ci0gICAgY29tbWFuZC5zZXREb0NyZWF0ZU1vZGVsR3JvdXBGb3JDb21wbGV4VHlwZShtb2RlbEdyb3VwID09IG51bGwpOwotICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgYWRkZWRDb21wb25lbnQgPSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChhZGRlZENvbXBvbmVudCk7Ci0gICAgc2VsZWN0QWRkZWRDb21wb25lbnQoYWRhcHRlcik7Ci0gIH0KLQotICBwcml2YXRlIFhTRE1vZGVsR3JvdXAgZ2V0TW9kZWxHcm91cChPYmplY3Qgc2VsZWN0aW9uKQotICB7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgcmV0dXJuIChYU0RNb2RlbEdyb3VwKSBzZWxlY3Rpb247Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29udGVudCA9ICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXNlbGVjdGlvbikuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlQ29udGVudCA9ICgoWFNEUGFydGljbGUpY29udGVudCkuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoWFNETW9kZWxHcm91cClwYXJ0aWNsZUNvbnRlbnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxMTNmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLkFkZFhTREF0dHJpYnV0ZUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQkVGT1JFX1NFTEVDVEVEX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uQkVGT1JFX1NFTEVDVEVEX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFGVEVSX1NFTEVDVEVEX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uQUZURVJfU0VMRUNURURfSUQiOyAvLyROT04tTkxTLTEkICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVGX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlUmVmZXJlbmNlQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBib29sZWFuIGlzUmVmZXJlbmNlID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFKTsKLSAgICBzZXRJZChJRCk7Ci0gICAgaXNSZWZlcmVuY2UgPSBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQsIFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUmVmZXJlbmNlKQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChsYWJlbCk7Ci0gICAgc2V0SWQoaWQpOwotICAgIHRoaXMuaXNSZWZlcmVuY2UgPSBpc1JlZmVyZW5jZTsKLSAgICBkb0RpcmVjdEVkaXQgPSAhaXNSZWZlcmVuY2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBzZWxlY3Rpb24gPSAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBzZWxlY3Rpb24pLmdldENvbnRhaW5lcigpOwotICAgICAgfQotICAgIH0KLSAgICBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUsIChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHNlbGVjdGlvbik7Ci0gICAgICBjb21tYW5kLnNldFJlZmVyZW5jZShpc1JlZmVyZW5jZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlVXNlIHhzZEF0dHJpYnV0ZVVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpIHNlbGVjdGlvbjsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IG51bGw7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSBudWxsOwotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGdyb3VwID0gbnVsbDsKLSAgICAgIGZvciAocGFyZW50ID0geHNkQXR0cmlidXRlVXNlLmdldENvbnRhaW5lcigpOyBwYXJlbnQgIT0gbnVsbDspCi0gICAgICB7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHBhcmVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBncm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pcGFyZW50OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRDb250YWluZXIoKTsKLSAgICAgIH0KLSAgICAgIGlmIChjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVVc2Ugc2VsID0gKFhTREF0dHJpYnV0ZVVzZSkgc2VsZWN0aW9uOwotICAgICAgICBpbnQgaW5kZXggPSBjdC5nZXRBdHRyaWJ1dGVDb250ZW50cygpLmluZGV4T2Yoc2VsKTsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFLCBjdCwgZ2V0SWQoKSwgaW5kZXgpOwotICAgICAgICBjb21tYW5kLnNldFJlZmVyZW5jZShpc1JlZmVyZW5jZSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChncm91cCAhPSBudWxsKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVVc2Ugc2VsID0gKFhTREF0dHJpYnV0ZVVzZSkgc2VsZWN0aW9uOwotICAgICAgICBpbnQgaW5kZXggPSBncm91cC5lQ29udGVudHMoKS5pbmRleE9mKHNlbCk7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSwgZ3JvdXAsIGdldElkKCksIGluZGV4KTsKLSAgICAgICAgY29tbWFuZC5zZXRSZWZlcmVuY2UoaXNSZWZlcmVuY2UpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFLCAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKXNlbGVjdGlvbik7Ci0gICAgICBjb21tYW5kLnNldFJlZmVyZW5jZShpc1JlZmVyZW5jZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFLCAoWFNEU2NoZW1hKXNlbGVjdGlvbik7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICAKLSAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkZGVkQ29tcG9uZW50ID0gY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChhZGRlZENvbXBvbmVudCk7Ci0gICAgICBzZWxlY3RBZGRlZENvbXBvbmVudChhZGFwdGVyKTsKLSAgICB9Ci0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMGEzZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFRl9JRCA9ICJBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVApOwotICAgIHNldElkKElEKTsKLSAgfQotICAKLSAgcHVibGljIEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBTdHJpbmcgaWQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBpZiAoaWQuZXF1YWxzKFJFRl9JRCkpCi0gICAgewotICAgICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX0RFRklOSVRJT04pOwotICAgIH0gICAKLSAgICBzZXRJZChpZCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgIH0KLQotICAgIEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX1JFRiwgKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX0RFRklOSVRJT04sIChYU0RTY2hlbWEpIHNlbGVjdGlvbik7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLQotICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgewotICAgICAgYWRkZWRDb21wb25lbnQgPSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGFkZGVkQ29tcG9uZW50KTsKLSAgICAgIHNlbGVjdEFkZGVkQ29tcG9uZW50KGFkYXB0ZXIpOwotICAgIH0KLQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1ZjRlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5BZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25BY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9DT01QTEVYX1RZUEUpOwotICAgIHNldElkKElEKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9DT01QTEVYX1RZUEUsIChYU0RTY2hlbWEpIHNlbGVjdGlvbik7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgCi0gICAgICBhZGRlZENvbXBvbmVudCA9IGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYWRkZWRDb21wb25lbnQpOwotICAgICAgc2VsZWN0QWRkZWRDb21wb25lbnQoYWRhcHRlcik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREVsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNERWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGJkNjRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNERWxlbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNETW9kZWxHcm91cEltcGw7Ci0KLS8vcmV2aXNpdCB0aGlzIGFuZCBzZWUgaWYgd2UgY2FuIHJldXNlIEFkZEZpZWxkQWN0aW9uPz8KLQotcHVibGljIGNsYXNzIEFkZFhTREVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQkVGT1JFX1NFTEVDVEVEX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbi5CRUZPUkVfU0VMRUNURURfSUQiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFGVEVSX1NFTEVDVEVEX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbi5BRlRFUl9TRUxFQ1RFRF9JRCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVGX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudFJlZmVyZW5jZUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgYm9vbGVhbiBpc1JlZmVyZW5jZTsKLSAgCi0gIHB1YmxpYyBBZGRYU0RFbGVtZW50QWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQsIFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUmVmZXJlbmNlKQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChsYWJlbCk7Ci0gICAgc2V0SWQoaWQpOwotICAgIHRoaXMuaXNSZWZlcmVuY2UgPSBpc1JlZmVyZW5jZTsKLSAgICBkb0RpcmVjdEVkaXQgPSAhaXNSZWZlcmVuY2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgIH0KLSAgICBBZGRYU0RFbGVtZW50Q29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoZ2V0VGV4dCgpLCAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBzZWxlY3Rpb24pOwotICAgICAgY29tbWFuZC5zZXRSZWZlcmVuY2UoaXNSZWZlcmVuY2UpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChnZXRUZXh0KCksIChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgc2VsZWN0aW9uKTsKLSAgICAgIGNvbW1hbmQuc2V0UmVmZXJlbmNlKGlzUmVmZXJlbmNlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnRDb21tYW5kKGdldFRleHQoKSwgKFhTRFNjaGVtYSkgc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApIHNlbGVjdGlvbjsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSBudWxsOwotICAgICAgd2hpbGUgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBjb21wb25lbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50LmdldENvbnRhaW5lcigpOwotICAgICAgfQotCi0gICAgICBpZiAoY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChnZXRUZXh0KCksIChYU0RNb2RlbEdyb3VwKSBzZWxlY3Rpb24sIGN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChnZXRUZXh0KCksIChYU0RNb2RlbEdyb3VwKSBzZWxlY3Rpb24pOwotICAgICAgfQotICAgICAgY29tbWFuZC5zZXRSZWZlcmVuY2UoaXNSZWZlcmVuY2UpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8IHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgc2VsZWN0aW9uOwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gbnVsbDsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IG51bGw7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBncm91cCA9IG51bGw7Ci0gICAgICBYU0RNb2RlbEdyb3VwSW1wbCBjdEdyb3VwID0gbnVsbDsKLQotICAgICAgZm9yIChwYXJlbnQgPSB4c2RDb25jcmV0ZUNvbXBvbmVudC5nZXRDb250YWluZXIoKTsgcGFyZW50ICE9IG51bGw7ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGN0ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilwYXJlbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBncm91cCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbilwYXJlbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjdEdyb3VwID0gKFhTRE1vZGVsR3JvdXBJbXBsKSBwYXJlbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldENvbnRhaW5lcigpOwotICAgICAgfQotICAgICAgaWYgKGN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoZ2V0VGV4dCgpLCBjdCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0UmVmZXJlbmNlKGlzUmVmZXJlbmNlKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGN0R3JvdXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHNlbCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgaW50IGluZGV4ID0gY3RHcm91cC5nZXRDb250ZW50cygpLmluZGV4T2Yoc2VsLmVDb250YWluZXIoKSk7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoZ2V0VGV4dCgpLCBjdEdyb3VwLCBnZXRJZCgpLCBpbmRleCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0UmVmZXJlbmNlKGlzUmVmZXJlbmNlKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoZ2V0VGV4dCgpLCBncm91cCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0UmVmZXJlbmNlKGlzUmVmZXJlbmNlKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGRlZENvbXBvbmVudCA9IGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYWRkZWRDb21wb25lbnQpOwotICAgICAgc2VsZWN0QWRkZWRDb21wb25lbnQoYWRhcHRlcik7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNERW51bWVyYXRpb25GYWNldEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNGMxMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZEVudW1lcmF0aW9uc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERW51bWVyYXRpb25GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNERW51bWVyYXRpb25GYWNldEFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5BZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBCRUZPUkVfU0VMRUNURURfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uLkJFRk9SRV9TRUxFQ1RFRF9JRCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUZURVJfU0VMRUNURURfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uLkFGVEVSX1NFTEVDVEVEX0lEIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIEFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KGxhYmVsKTsKLSAgICBzZXRJZChpZCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBBZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VOVU1FUkFUSU9OKTsKLSAgICBzZXRJZChJRCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgICAgaW50IGluZGV4ID0gLTE7Ci0gICAgICBBZGRFbnVtZXJhdGlvbnNDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSBudWxsOwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilzZWxlY3Rpb247Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkRW51bWVyYXRpb25zQ29tbWFuZChnZXRUZXh0KCksIHN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREVudW1lcmF0aW9uRmFjZXQpCi0gICAgICB7Ci0gICAgICAgIHN0ID0gKChYU0RFbnVtZXJhdGlvbkZhY2V0KXNlbGVjdGlvbikuZ2V0U2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgaW5kZXggPSBzdC5nZXRGYWNldENvbnRlbnRzKCkuaW5kZXhPZihzZWxlY3Rpb24pOwotICAgICAgICBkb0RpcmVjdEVkaXQgPSB0cnVlOwotICAgICAgICBjb21tYW5kID0gbmV3IEFkZEVudW1lcmF0aW9uc0NvbW1hbmQoZ2V0VGV4dCgpLCBzdCwgZ2V0SWQoKSwgaW5kZXgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSAgLy8gU3VwcG9ydCBmb3IgQ29tcGxleCBUeXBlJ3Mgc2ltcGxlIENvbnRlbnQgd2l0aCBlbnVtZXJhdGlvbnMKLSAgICAgIHsKLSAgICAJc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXNlbGVjdGlvbikuZ2V0Q29udGVudCgpOwotICAgICAgICBjb21tYW5kID0gbmV3IEFkZEVudW1lcmF0aW9uc0NvbW1hbmQoZ2V0VGV4dCgpLCBzdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vIG51bGwKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgCi0gICAgICBMaXN0IGVudW1MaXN0ID0gc3QuZ2V0RW51bWVyYXRpb25GYWNldHMoKTsKLSAgICAgIAotICAgICAgU3RyaW5nIG5ld05hbWUgPSBYU0RDb21tb25VSVV0aWxzLmNyZWF0ZVVuaXF1ZUVudW1lcmF0aW9uVmFsdWUoInZhbHVlIiwgZW51bUxpc3QpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIGNvbW1hbmQuc2V0VmFsdWUobmV3TmFtZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgYWRkZWRDb21wb25lbnQgPSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGFkZGVkQ29tcG9uZW50KTsKLSAgICAgIHNlbGVjdEFkZGVkQ29tcG9uZW50KGFkYXB0ZXIpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpIHsKLQkJCi0JCWJvb2xlYW4gcGFyZW50UmVzdWx0ID0gc3VwZXIuY2FsY3VsYXRlRW5hYmxlZCgpOwotCQlib29sZWFuIGVuZFJlc3VsdCA9IHRydWU7Ci0JCU9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyKQotCQl7Ci0JCQlYU0RDb21wbGV4VHlwZURlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJCVhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlID0gZGVmaW5pdGlvbi5nZXRCYXNlVHlwZSgpOwotCQkJaWYgKGJhc2VUeXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0JCQkJZW5kUmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJZW5kUmVzdWx0ID0gZW5kUmVzdWx0ICYgcGFyZW50UmVzdWx0OwotCQlyZXR1cm4gZW5kUmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNETW9kZWxHcm91cEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RNb2RlbEdyb3VwQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZmI0NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RNb2RlbEdyb3VwQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTRE1vZGVsR3JvdXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUVVFTkNFX0lEID0gIkFkZFhTRFNlcXVlbmNlTW9kZWxHcm91cEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ0hPSUNFX0lEID0gIkFkZFhTRENob2ljZU1vZGVsR3JvdXBBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFMTF9JRCA9ICJBZGRYU0RBbGxNb2RlbEdyb3VwQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBYU0RDb21wb3NpdG9yIHhzZENvbXBvc2l0b3I7Ci0KLSAgcHVibGljIEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgWFNEQ29tcG9zaXRvciBjb21wb3NpdG9yLCBTdHJpbmcgSUQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KGdldExhYmVsKGNvbXBvc2l0b3IpKTsKLSAgICBzZXRJZChJRCk7Ci0gICAgdGhpcy54c2RDb21wb3NpdG9yID0gY29tcG9zaXRvcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICBBZGRYU0RNb2RlbEdyb3VwQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICAgIGlmICh4c2RDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSB4c2RDb21wb25lbnQ7Ci0KLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RNb2RlbEdyb3VwQ29tbWFuZChnZXRMYWJlbCh4c2RDb21wb3NpdG9yKSwgeHNkRWxlbWVudERlY2xhcmF0aW9uLCB4c2RDb21wb3NpdG9yKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHhzZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICB7Ci0gICAgICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKSB4c2RDb21wb25lbnQ7Ci0KLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RNb2RlbEdyb3VwQ29tbWFuZChnZXRMYWJlbCh4c2RDb21wb3NpdG9yKSwgeHNkTW9kZWxHcm91cCwgeHNkQ29tcG9zaXRvcik7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh4c2RDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24KLSAgICAgICAgICAgICAgIHx8IHhzZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBDb21tYW5kKGdldExhYmVsKHhzZENvbXBvc2l0b3IpLCB4c2RDb21wb25lbnQsIHhzZENvbXBvc2l0b3IpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgICAKLSAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpKTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICBwcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWRhcHRlcikpOwotICAgICAgfQotCi0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFiZWwoWFNEQ29tcG9zaXRvciBjb21wb3NpdG9yKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1NFUVVFTkNFIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoY29tcG9zaXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChjb21wb3NpdG9yID09IFhTRENvbXBvc2l0b3IuQ0hPSUNFX0xJVEVSQUwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0NIT0lDRSIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wb3NpdG9yID09IFhTRENvbXBvc2l0b3IuQUxMX0xJVEVSQUwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FMTCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDlhMzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxHUk9VUERFRklOSVRJT05fSUQgPSAiQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMR1JPVVBERUZJTklUSU9OUkVGX0lEID0gIkFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uUmVmQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBib29sZWFuIGlzUmVmZXJlbmNlOwotCi0gIHB1YmxpYyBBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBib29sZWFuIGlzUmVmZXJlbmNlKQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgdGhpcy5pc1JlZmVyZW5jZSA9IGlzUmVmZXJlbmNlOwotICAgIGlmIChpc1JlZmVyZW5jZSkKLSAgICB7Ci0gICAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0dST1VQX1JFRik7Ci0gICAgICBzZXRJZChNT0RFTEdST1VQREVGSU5JVElPTl9JRCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0dST1VQKTsKLSAgICAgIHNldElkKE1PREVMR1JPVVBERUZJTklUSU9OUkVGX0lEKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHhzZENvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgIH0KLSAgICBpZiAoeHNkQ29uY3JldGVDb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkNvbW1hbmQoZ2V0VGV4dCgpLCB4c2RDb25jcmV0ZUNvbXBvbmVudCwgaXNSZWZlcmVuY2UpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQotICAgICAgYWRkZWRDb21wb25lbnQgPSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGFkZGVkQ29tcG9uZW50KTsKLSAgICAgIHNlbGVjdEFkZGVkQ29tcG9uZW50KGFkYXB0ZXIpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RSZWRlZmluYWJsZUNvbnRlbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEUmVkZWZpbmFibGVDb250ZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGMxOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RSZWRlZmluYWJsZUNvbnRlbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNlYXJjaExpc3REaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudFNlYXJjaExpc3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmFibGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRYU0RSZWRlZmluYWJsZUNvbnRlbnRBY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBBZGRYU0RSZWRlZmluYWJsZUNvbnRlbnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgU3RyaW5nIElELCBTdHJpbmcgdGV4dCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQodGV4dCk7Ci0gICAgc2V0SWQoSUQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKXNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgIHsKLSAgICAgIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RGVzY3JpcHRpb25Qcm92aWRlcihuZXcgUmVkZWZpbmVEZXNjcmlwdG9yKCkpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXRTZWFyY2hMaXN0UHJvdmlkZXIobmV3IFJlZGVmaW5lU2VhcmNoTGlzdFByb3ZpZGVyKChYU0RSZWRlZmluZSlzZWxlY3Rpb24sIHRoaXMpKTsKLSAgICAgIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cgZGlhbG9nID0gbmV3IENvbXBvbmVudFNlYXJjaExpc3REaWFsb2coRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgTWVzc2FnZXMuX1VJX0xBQkVMX1JFREVGSU5FX0NPTVBPTkVOVCwgY29uZmlndXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQWRqdXN0IHRoZSBkaWFsb2cncyBpbml0aWFsIHNpemUuCi0gICAgICAgICAgCi0gICAgICAgICAgQ29tcG9zaXRlIG1haW5Db21wb3NpdGUgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSltYWluQ29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLSAgICAgICAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gNTAwOwotICAgICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IDM1MDsKLSAgICAgICAgICByZXR1cm4gbWFpbkNvbXBvc2l0ZTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCi0gICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLSAgICAgIHsKLSAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzZWxlY3RlZENvbXBvbmVudCA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotICAgICAgICBidWlsZFJlZGVmaW5lKChYU0RSZWRlZmluZSlzZWxlY3Rpb24sIHNlbGVjdGVkQ29tcG9uZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZCBnZXRDb21tYW5kKFhTRFJlZGVmaW5lIHJlZGVmaW5lLCBYU0RSZWRlZmluYWJsZUNvbXBvbmVudCByZWRlZmluYWJsZUNvbXBvbmVudCk7Ci0gIAotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBidWlsZENvbXBvbmVudHNMaXN0KFhTRFJlZGVmaW5lIHhzZFJlZGVmaW5lLCBTZXQgcmVkZWZpbmVkQ29tcG9uZW50c05hbWVzLCBJQ29tcG9uZW50TGlzdCBjb21wb25lbnRMaXN0KTsKLSAgCi0gIHByb3RlY3RlZCB2b2lkIGJ1aWxkUmVkZWZpbmUoWFNEUmVkZWZpbmUgcmVkZWZpbmUsIENvbXBvbmVudFNwZWNpZmljYXRpb24gc2VsZWN0ZWRDb21wb25lbnQpCi0gIHsKLSAgICBYU0RSZWRlZmluYWJsZUNvbXBvbmVudCByZWRlZmluYWJsZUNvbXBvbmVudCA9IChYU0RSZWRlZmluYWJsZUNvbXBvbmVudClzZWxlY3RlZENvbXBvbmVudC5nZXRPYmplY3QoKTsKLSAgICBBZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kIGNvbW1hbmQgPSBnZXRDb21tYW5kKHJlZGVmaW5lLCByZWRlZmluYWJsZUNvbXBvbmVudCk7Ci0gICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICBhZGRlZENvbXBvbmVudCA9IGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgfQotCi0gIGNsYXNzIFJlZGVmaW5lU2VhcmNoTGlzdFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbXBvbmVudFNlYXJjaExpc3RQcm92aWRlcgotICB7Ci0gICAgWFNEUmVkZWZpbmUgeHNkUmVkZWZpbmU7Ci0gICAgQWRkWFNEUmVkZWZpbmFibGVDb250ZW50QWN0aW9uIGFjdGlvbjsgICAgCi0gICAgCi0gICAgcHVibGljIFJlZGVmaW5lU2VhcmNoTGlzdFByb3ZpZGVyKFhTRFJlZGVmaW5lIHhzZFJlZGVmaW5lLCBBZGRYU0RSZWRlZmluYWJsZUNvbnRlbnRBY3Rpb24gYWN0aW9uKQotICAgIHsKLSAgICAgIHRoaXMueHNkUmVkZWZpbmUgPSB4c2RSZWRlZmluZTsKLSAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOwotICAgIH0KLQotICAgIC8vIFNob3VsZCByZWZhY3RvciB0aGlzIHRvIGhhdmUgYSBzZXBhcmF0ZSBzdWJjbGFzcyBmb3IgZWFjaCB0eXBlIG9mIHJlZGVmaW5lLgotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSkKLSAgICB7ICAgICAgCi0gICAgICBMaXN0IGN1cnJlbnRSZWRlZmluZXMgPSB4c2RSZWRlZmluZS5nZXRDb250ZW50cygpOwotICAgICAgU2V0IHJlZGVmaW5lZENvbXBvbmVudHNOYW1lcyA9IG5ldyBIYXNoU2V0KGN1cnJlbnRSZWRlZmluZXMuc2l6ZSgpKTsKLSAgICAgIEl0ZXJhdG9yIHJlZGVmaW5lc0l0ZXJhdG9yID0gY3VycmVudFJlZGVmaW5lcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKHJlZGVmaW5lc0l0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEUmVkZWZpbmFibGVDb21wb25lbnQgY29tcG9uZW50ID0gKFhTRFJlZGVmaW5hYmxlQ29tcG9uZW50KXJlZGVmaW5lc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHJlZGVmaW5lZENvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgICByZWRlZmluZWRDb21wb25lbnRzTmFtZXMuYWRkKHJlZGVmaW5lZENvbXBvbmVudE5hbWUpOwotICAgICAgfQotICAgICAgYWN0aW9uLmJ1aWxkQ29tcG9uZW50c0xpc3QoeHNkUmVkZWZpbmUsIHJlZGVmaW5lZENvbXBvbmVudHNOYW1lcywgbGlzdCk7ICAgICAgCi0gICAgfQotICB9Ci0KLSAgY2xhc3MgUmVkZWZpbmVEZXNjcmlwdG9yIGltcGxlbWVudHMgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyBJRmlsZSBnZXRGaWxlKE9iamVjdCBjb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgIAlpZiAoKChYU0ROYW1lZENvbXBvbmVudCljb21wb25lbnQpLmdldFNjaGVtYSgpID09IG51bGwpCi0gICAgCXsKLSAgICAJICByZXR1cm4gbnVsbDsKLSAgICAJfQotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSAoKFhTRE5hbWVkQ29tcG9uZW50KWNvbXBvbmVudCkuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIHBsYXRmb3JtUmVzb3VyY2UgPSAicGxhdGZvcm06L3Jlc291cmNlIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCAmJiBsb2NhdGlvbi5zdGFydHNXaXRoKHBsYXRmb3JtUmVzb3VyY2UpKQotICAgICAgICB7Ci0gICAgICAgICAgUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24uc3Vic3RyaW5nKHBsYXRmb3JtUmVzb3VyY2UubGVuZ3RoKCkpKTsKLSAgICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0RmlsZUljb24oT2JqZWN0IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RGaWxlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgWFNEUmVkZWZpbmVDb21wb25lbnRzTGFiZWxQcm92aWRlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZShPYmplY3QgY29tcG9uZW50KQotICAgIHsKLSAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoWFNETmFtZWRDb21wb25lbnQpY29tcG9uZW50KS5nZXROYW1lKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZXIoT2JqZWN0IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKFhTRE5hbWVkQ29tcG9uZW50KWNvbXBvbmVudCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKE9iamVjdCBjb21wb25lbnQpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgSW1hZ2UgZ2V0UmVkZWZpbmVkQ29tcG9uZW50SW1hZ2UoKTsKLSAgCi0gIGNsYXNzIFhTRFJlZGVmaW5lQ29tcG9uZW50c0xhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlcgotICB7Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgSW1hZ2UgaW1hZ2UgPSBnZXRSZWRlZmluZWRDb21wb25lbnRJbWFnZSgpOwotICAgICAgcmV0dXJuIGltYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gKChYU0ROYW1lZENvbXBvbmVudCllbGVtZW50KS5nZXROYW1lKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNWIwZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RSZWRlZmluZWRBdHRyaWJ1dGVHcm91cEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlJlZGVmaW5lQXR0cmlidXRlR3JvdXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluYWJsZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci0KLQotcHVibGljIGNsYXNzIEFkZFhTRFJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwQWN0aW9uIGV4dGVuZHMgQWRkWFNEUmVkZWZpbmFibGVDb250ZW50QWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuYWN0aW9ucy5SZWRlZmluZUF0dHJpYnV0ZUdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBBZGRYU0RSZWRlZmluZWRBdHRyaWJ1dGVHcm91cEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCwgSUQsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fUkVERUZJTkVfQVRUUklCVVRFX0dST1VQKTsKLSAgfQotCi0gIHByb3RlY3RlZCBBZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kIGdldENvbW1hbmQoWFNEUmVkZWZpbmUgcmVkZWZpbmUsIFhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IHJlZGVmaW5hYmxlQ29tcG9uZW50KQotICB7Ci0gICAgQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZCBjb21tYW5kID0gbmV3IFJlZGVmaW5lQXR0cmlidXRlR3JvdXBDb21tYW5kKAotICAgICAgTWVzc2FnZXMuX1VJX0FDVElPTl9SRURFRklORV9BVFRSSUJVVEVfR1JPVVAsCi0gICAgICByZWRlZmluZSwKLSAgICAgIHJlZGVmaW5hYmxlQ29tcG9uZW50KTsKLSAgICByZXR1cm4gY29tbWFuZDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGJ1aWxkQ29tcG9uZW50c0xpc3QoWFNEUmVkZWZpbmUgeHNkUmVkZWZpbmUsIFNldCByZWRlZmluZWRDb21wb25lbnRzTmFtZXMsIElDb21wb25lbnRMaXN0IGNvbXBvbmVudExpc3QpCi0gIHsKLSAgICBMaXN0IGF0dHJpYnV0ZUdyb3VwcyA9IHhzZFJlZGVmaW5lLmdldEluY29ycG9yYXRlZFNjaGVtYSgpLmdldEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKTsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGF0dHJpYnV0ZUdyb3Vwcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24paXRlcmF0b3IubmV4dCgpOwotICAgICAgU3RyaW5nIGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbk5hbWUgPSBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0TmFtZSgpOwotICAgICAgaWYgKCFyZWRlZmluZWRDb21wb25lbnRzTmFtZXMuY29udGFpbnMoYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudExpc3QuYWRkKGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0UmVkZWZpbmVkQ29tcG9uZW50SW1hZ2UoKQotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZShNZXNzYWdlcy5fVUlfSU1BR0VfQVRUUklCVVRFX0dST1VQKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RSZWRlZmluZWRDb21wbGV4VHlwZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RSZWRlZmluZWRDb21wbGV4VHlwZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDFkNWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEUmVkZWZpbmVkQ29tcGxleFR5cGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5SZWRlZmluZUNvbXBsZXhUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmFibGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQWRkWFNEUmVkZWZpbmVkQ29tcGxleFR5cGVBY3Rpb24gZXh0ZW5kcyBBZGRYU0RSZWRlZmluYWJsZUNvbnRlbnRBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5hY3Rpb25zLlJlZGVmaW5lQ29tcGxleFR5cGUiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIEFkZFhTRFJlZGVmaW5lZENvbXBsZXhUeXBlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0LCBJRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9SRURFRklORV9DT01QTEVYX1RZUEUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIEFkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQgZ2V0Q29tbWFuZChYU0RSZWRlZmluZSByZWRlZmluZSwgWFNEUmVkZWZpbmFibGVDb21wb25lbnQgcmVkZWZpbmFibGVDb21wb25lbnQpCi0gIHsKLSAgICBBZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kIGNvbW1hbmQgPSBuZXcgUmVkZWZpbmVDb21wbGV4VHlwZUNvbW1hbmQoCi0gICAgICBNZXNzYWdlcy5fVUlfQUNUSU9OX1JFREVGSU5FX0NPTVBMRVhfVFlQRSwKLSAgICAgIHJlZGVmaW5lLAotICAgICAgcmVkZWZpbmFibGVDb21wb25lbnQpOwotICAgIHJldHVybiBjb21tYW5kOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYnVpbGRDb21wb25lbnRzTGlzdChYU0RSZWRlZmluZSB4c2RSZWRlZmluZSwgU2V0IHJlZGVmaW5lZENvbXBvbmVudHNOYW1lcywgSUNvbXBvbmVudExpc3QgY29tcG9uZW50TGlzdCkKLSAgewotICAgIExpc3QgdHlwZURlZmluaXRpb25zID0geHNkUmVkZWZpbmUuZ2V0SW5jb3Jwb3JhdGVkU2NoZW1hKCkuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB0eXBlRGVmaW5pdGlvbnMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gKFhTRFR5cGVEZWZpbml0aW9uKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIFN0cmluZyB0eXBlRGVmaW5pdGlvbk5hbWUgPSB0eXBlRGVmaW5pdGlvbi5nZXROYW1lKCk7Ci0gICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gJiYgIXJlZGVmaW5lZENvbXBvbmVudHNOYW1lcy5jb250YWlucyh0eXBlRGVmaW5pdGlvbk5hbWUpKQotICAgICAgewotICAgICAgICBjb21wb25lbnRMaXN0LmFkZCh0eXBlRGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0UmVkZWZpbmVkQ29tcG9uZW50SW1hZ2UoKQotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZShNZXNzYWdlcy5fVUlfSU1BR0VfQ09NUExFWF9UWVBFKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RSZWRlZmluZWRNb2RlbEdyb3VwQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFJlZGVmaW5lZE1vZGVsR3JvdXBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4MzlhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFJlZGVmaW5lZE1vZGVsR3JvdXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5SZWRlZmluZU1vZGVsR3JvdXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLQotCi1wdWJsaWMgY2xhc3MgQWRkWFNEUmVkZWZpbmVkTW9kZWxHcm91cEFjdGlvbiBleHRlbmRzIEFkZFhTRFJlZGVmaW5hYmxlQ29udGVudEFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmFjdGlvbnMuUmVkZWZpbmVNb2RlbEdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBBZGRYU0RSZWRlZmluZWRNb2RlbEdyb3VwQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0LCBJRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9SRURFRklORV9NT0RFTF9HUk9VUCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZCBnZXRDb21tYW5kKFhTRFJlZGVmaW5lIHJlZGVmaW5lLCBYU0RSZWRlZmluYWJsZUNvbXBvbmVudCByZWRlZmluYWJsZUNvbXBvbmVudCkKLSAgewotICAgIEFkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQgY29tbWFuZCA9IG5ldyBSZWRlZmluZU1vZGVsR3JvdXBDb21tYW5kKAotICAgICAgTWVzc2FnZXMuX1VJX0FDVElPTl9SRURFRklORV9NT0RFTF9HUk9VUCwKLSAgICAgIHJlZGVmaW5lLAotICAgICAgcmVkZWZpbmFibGVDb21wb25lbnQpOwotICAgIHJldHVybiBjb21tYW5kOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYnVpbGRDb21wb25lbnRzTGlzdChYU0RSZWRlZmluZSB4c2RSZWRlZmluZSwgU2V0IHJlZGVmaW5lZENvbXBvbmVudHNOYW1lcywgSUNvbXBvbmVudExpc3QgY29tcG9uZW50TGlzdCkKLSAgewotICAgIExpc3QgbW9kZWxHcm91cExpc3QgPSB4c2RSZWRlZmluZS5nZXRJbmNvcnBvcmF0ZWRTY2hlbWEoKS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKTsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1vZGVsR3JvdXBMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmaW5pdGlvbiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbilpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBTdHJpbmcgbW9kZWxHcm91cERlZmluaXRpb25OYW1lID0gbW9kZWxHcm91cERlZmluaXRpb24uZ2V0TmFtZSgpOwotICAgICAgaWYgKCFyZWRlZmluZWRDb21wb25lbnRzTmFtZXMuY29udGFpbnMobW9kZWxHcm91cERlZmluaXRpb25OYW1lKSkKLSAgICAgIHsKLSAgICAgICAgY29tcG9uZW50TGlzdC5hZGQobW9kZWxHcm91cERlZmluaXRpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIEltYWdlIGdldFJlZGVmaW5lZENvbXBvbmVudEltYWdlKCkKLSAgewotICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoTWVzc2FnZXMuX1VJX0lNQUdFX01PREVMX0dST1VQKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RSZWRlZmluZWRTaW1wbGVUeXBlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFJlZGVmaW5lZFNpbXBsZVR5cGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4NjA1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFJlZGVmaW5lZFNpbXBsZVR5cGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5SZWRlZmluZVNpbXBsZVR5cGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmFibGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIEFkZFhTRFJlZGVmaW5lZFNpbXBsZVR5cGVBY3Rpb24gZXh0ZW5kcyBBZGRYU0RSZWRlZmluYWJsZUNvbnRlbnRBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5hY3Rpb25zLlJlZGVmaW5lU2ltcGxlVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgQWRkWFNEUmVkZWZpbmVkU2ltcGxlVHlwZUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCwgSUQsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fUkVERUZJTkVfU0lNUExFX1RZUEUpOwotICB9Ci0KLSAgcHVibGljIEFkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQgZ2V0Q29tbWFuZChYU0RSZWRlZmluZSByZWRlZmluZSwgWFNEUmVkZWZpbmFibGVDb21wb25lbnQgcmVkZWZpbmFibGVDb21wb25lbnQpCi0gIHsKLSAgICBBZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kIGNvbW1hbmQgPSBuZXcgUmVkZWZpbmVTaW1wbGVUeXBlQ29tbWFuZCgKLSAgICAgIE1lc3NhZ2VzLl9VSV9BQ1RJT05fUkVERUZJTkVfU0lNUExFX1RZUEUsCi0gICAgICByZWRlZmluZSwKLSAgICAgIHJlZGVmaW5hYmxlQ29tcG9uZW50KTsKLSAgICByZXR1cm4gY29tbWFuZDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGJ1aWxkQ29tcG9uZW50c0xpc3QoWFNEUmVkZWZpbmUgeHNkUmVkZWZpbmUsIFNldCByZWRlZmluZWRDb21wb25lbnRzTmFtZXMsIElDb21wb25lbnRMaXN0IGNvbXBvbmVudExpc3QpCi0gIHsKLSAgICBMaXN0IHR5cGVEZWZpbml0aW9ucyA9IHhzZFJlZGVmaW5lLmdldEluY29ycG9yYXRlZFNjaGVtYSgpLmdldFR5cGVEZWZpbml0aW9ucygpOwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gdHlwZURlZmluaXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IChYU0RUeXBlRGVmaW5pdGlvbilpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBTdHJpbmcgdHlwZURlZmluaXRpb25OYW1lID0gdHlwZURlZmluaXRpb24uZ2V0TmFtZSgpOwotICAgICAgaWYgKHR5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gJiYgIXJlZGVmaW5lZENvbXBvbmVudHNOYW1lcy5jb250YWlucyh0eXBlRGVmaW5pdGlvbk5hbWUpKQotICAgICAgewotICAgICAgICBjb21wb25lbnRMaXN0LmFkZCh0eXBlRGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBJbWFnZSBnZXRSZWRlZmluZWRDb21wb25lbnRJbWFnZSgpCi0gIHsKLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKE1lc3NhZ2VzLl9VSV9JTUFHRV9TSU1QTEVfVFlQRSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzI0ZjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RJbXBvcnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREluY2x1ZGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTRFJlZGVmaW5lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5CYXNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRERpcmVjdGl2ZXNTY2hlbWFMb2NhdGlvblVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOQ0xVREVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RJbmNsdWRlQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTVBPUlRfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RJbXBvcnRBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFREVGSU5FX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEUmVkZWZpbmVBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIFN0cmluZyBsYWJlbDsKLSAgCi0gIHB1YmxpYyBBZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgU3RyaW5nIElELCBTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KGxhYmVsKTsKLSAgICBzZXRJZChJRCk7Ci0gICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgc2VsZWN0aW9uID0gKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBCYXNlQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIGlmIChJTkNMVURFX0lELmVxdWFscyhnZXRJZCgpKSkKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RJbmNsdWRlQ29tbWFuZChsYWJlbCwgKFhTRFNjaGVtYSkgc2VsZWN0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKElNUE9SVF9JRC5lcXVhbHMoZ2V0SWQoKSkpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNESW1wb3J0Q29tbWFuZChsYWJlbCwgKFhTRFNjaGVtYSkgc2VsZWN0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFJFREVGSU5FX0lELmVxdWFscyhnZXRJZCgpKSkKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RSZWRlZmluZUNvbW1hbmQobGFiZWwsIChYU0RTY2hlbWEpIHNlbGVjdGlvbik7Ci0gICAgICB9Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLQotICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgewotICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCkpOwotICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAJICBwcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWRhcHRlcikpOwotICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IG9wZW4gdGhlIHNjaGVtYSBsb2NhdGlvbiBkaWFsb2cgaWYgdGhlIHByZWZlcmVuY2UgaXMgZW5hYmxlZAotICAgICAgICBpZihYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2dTZXR0aW5nKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyIHhzZFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIgPSBudWxsOwotICAgICAgICAgIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIgPSAoWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlcilhZGFwdGVyOwotICAgICAgICAgIH0gICAgCSAgCi0gICAgICAgICAgWFNERGlyZWN0aXZlc1NjaGVtYUxvY2F0aW9uVXBkYXRlci51cGRhdGVTY2hlbWFMb2NhdGlvbigoWFNEU2NoZW1hKSBzZWxlY3Rpb24sIHhzZFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIuZ2V0VGFyZ2V0KCksIAotICAgICAgICAgICAgCQkoY29tbWFuZCBpbnN0YW5jZW9mIEFkZFhTREluY2x1ZGVDb21tYW5kIHx8IGNvbW1hbmQgaW5zdGFuY2VvZiBBZGRYU0RSZWRlZmluZUNvbW1hbmQpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgZ3JhcGhpY2FsIHZpZXcgbWF5IGRlc2VsZWN0LCBzbyBzZWxlY3QgYWdhaW4KLSAgICAgICAgcHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGFkYXB0ZXIpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3Y2Q3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEUpOwotICAgIHNldElkKElEKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEUsIChYU0RTY2hlbWEpIHNlbGVjdGlvbik7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgCi0gICAgICBhZGRlZENvbXBvbmVudCA9IGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYWRkZWRDb21wb25lbnQpOwotICAgICAgc2VsZWN0QWRkZWRDb21wb25lbnQoYWRhcHRlcik7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmZTQ5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0RlbGV0ZVhTRENvbmNyZXRlQ29tcG9uZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9YU0RfQ09NUE9ORU5UX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb24iOyAgIC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEUpOwotICAgIHNldElkKERFTEVURV9YU0RfQ09NUE9ORU5UX0lEKTsKLSAgICBzZXRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZGVsZXRlX29iai5naWYiKSApOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPYmplY3Qgc2VsZWN0aW9uID0gaS5uZXh0KCk7Ci0gICAgICBib29sZWFuIGRvUmVzZWxlY3QgPSBmYWxzZTsKLSAgICAgIAotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgICAgewotICAgICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgICAgfQotCi0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgc2VsZWN0aW9uOwotICAgICAgICBYU0RTY2hlbWEgbW9kZWwgPSB4c2RDb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIAotICAgICAgICBkb1Jlc2VsZWN0ID0geHNkQ29tcG9uZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYTsKLSAgICAgICAgCi0gICAgICAgIERlbGV0ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBEZWxldGVDb21tYW5kKGdldFRleHQoKSwgeHNkQ29tcG9uZW50KTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChtb2RlbCAhPSBudWxsICYmIGRvUmVzZWxlY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KG1vZGVsKTsKLSAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgICAgICAgcHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGFkYXB0ZXIpKTsKLSAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvT3BlbkluTmV3RWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL09wZW5Jbk5ld0VkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWZhZGUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvT3BlbkluTmV3RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uRUZTOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLkZpbGVTdG9yZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkFEVEZpbGVTdG9yZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5BRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNESW1wb3J0SW1wbDsKLQotcHVibGljIGNsYXNzIE9wZW5Jbk5ld0VkaXRvciBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiT3BlbkluTmV3RWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBPcGVuSW5OZXdFZGl0b3IoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9PUEVOX0lOX05FV19FRElUT1IpOyAvLyROT04tTkxTLTEkCi0gICAgc2V0SWQoSUQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gbnVsbDsKLSAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBudWxsOwotICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICBpZiAoYWN0aXZlRWRpdG9yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGVkaXRvcklucHV0ID0gYWN0aXZlRWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIFhTREJhc2VBZGFwdGVyIHhzZEFkYXB0ZXIgPSAoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbjsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGZDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpIHhzZEFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZkNvbXBvbmVudC5nZXRTY2hlbWEoKTsKLSAgICAgIAotICAgICAgYm9vbGVhbiBpc1JlZmVyZW5jZSA9IGZhbHNlOwotICAgICAgaWYgKGZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RGZWF0dXJlKQotICAgICAgewotICAgICAgICBpc1JlZmVyZW5jZSA9ICgoWFNERmVhdHVyZSlmQ29tcG9uZW50KS5pc0ZlYXR1cmVSZWZlcmVuY2UoKTsKLSAgICAgICAgZkNvbXBvbmVudCA9ICgoWFNERmVhdHVyZSlmQ29tcG9uZW50KS5nZXRSZXNvbHZlZEZlYXR1cmUoKTsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gbnVsbDsKLSAgICAgIElQYXRoIHNjaGVtYVBhdGggPSBudWxsOwotICAgICAgSUZpbGUgc2NoZW1hRmlsZSA9IG51bGw7Ci0KLSAgICAgIC8vIFNwZWNpYWwgY2FzZSBhbnkgaW1wb3J0cy9pbmNsdWRlcwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYURpcmVjdGl2ZSBkaXIgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKSgoWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlcilzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgICAgICAvLyBmb3JjZSBsb2FkIG9mIGltcG9ydGVkIHNjaGVtYQotICAgICAgICBpZiAoZGlyIGluc3RhbmNlb2YgWFNESW1wb3J0SW1wbCkKLSAgICAgICAgewotICAgICAgICAgICgoWFNESW1wb3J0SW1wbClkaXIpLmltcG9ydFNjaGVtYSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkaXIuZ2V0UmVzb2x2ZWRTY2hlbWEoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2NoZW1hTG9jYXRpb24gPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKGRpci5nZXRSZXNvbHZlZFNjaGVtYSgpLmdldFNjaGVtYUxvY2F0aW9uKCkpOwotICAgICAgICAgIHNjaGVtYVBhdGggPSBuZXcgUGF0aChzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgICAgc2NoZW1hRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShzY2hlbWFQYXRoKTsKLSAgICAgICAgICBzY2hlbWEgPSBkaXIuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsgCi0gICAgICAgICAgZkNvbXBvbmVudCA9IGRpci5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgICB9Ci0gICAgICB9IC8vIEhhbmRsZSBhbnkgb3RoZXIgZXh0ZXJuYWwgY29tcG9uZW50cwotICAgICAgZWxzZSBpZiAoZkNvbXBvbmVudC5nZXRTY2hlbWEoKSAhPSBudWxsICYmIGZDb21wb25lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hIHx8Ci0gICAgICAgICAgZkNvbXBvbmVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSB8fCBpc1JlZmVyZW5jZSkKLSAgICAgIHsKLSAgICAgICAgc2NoZW1hTG9jYXRpb24gPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKGZDb21wb25lbnQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgIHNjaGVtYVBhdGggPSBuZXcgUGF0aChzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgIHNjaGVtYUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoc2NoZW1hUGF0aCk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKWdldFdvcmtiZW5jaFBhcnQoKS5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgICAgICAgaWYgKGZDb21wb25lbnQuZ2V0U2NoZW1hKCkgPT0geHNkU2NoZW1hKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICgoSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIGVkaXRvclBhcnQpLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShmQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gSWYgdGhlIHNjaGVtYUZpbGUgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UKLSAgICAgIGlmIChwYWdlICE9IG51bGwgJiYgc2NoZW1hRmlsZSAhPSBudWxsICYmIHNjaGVtYUZpbGUuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGVkaXRvcidzIHNjaGVtYQotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKWdldFdvcmtiZW5jaFBhcnQoKS5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICAgICAgLy8gVGhpcyBmaXJzdCBjaGVjayBpcyB0byBlbnN1cmUgdGhhdCB0aGUgc2NoZW1hIGlzIGFjdHVhbGx5Ci0gICAgICAgICAgLy8gZGlmZmVyZW50IHRoYW4gdGhlIGN1cnJlbnQgb25lIHdlIGFyZSBlZGl0aW5nIGFnYWluc3QgaW4gdGhlIGVkaXRvciwgYW5kIHRoYXQgd2UKLSAgICAgICAgICAvLyBhcmUgaW4gdGhlIHNhbWUgcmVzb3VyY2UgZmlsZS4uLi5oZW5jZSBtdWx0aXBsZSBzY2hlbWFzIGluIHRoZSBzYW1lIGZpbGUuCi0gICAgICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsICYmIGZDb21wb25lbnQuZ2V0Um9vdENvbnRhaW5lcigpLmVSZXNvdXJjZSgpID09IHhzZFNjaGVtYS5lUmVzb3VyY2UoKSAmJiB4c2RTY2hlbWEgIT0gc2NoZW1hKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBlZGl0b3JOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIFhTREZpbGVFZGl0b3JJbnB1dCB4c2RGaWxlRWRpdG9ySW5wdXQgPSBuZXcgWFNERmlsZUVkaXRvcklucHV0KHNjaGVtYUZpbGUsIGZDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgICAgLy8gd2lsbCB1c2UgRmlsZUVkaXRvcklucHV0J3MgbmFtZSBpZiBzdGlsbCBudWxsCi0gICAgICAgICAgICAvLyBUcnkgdG8gdXNlIHRoZSBzYW1lIGVkaXRvciBuYW1lIGFzIHRoZSBjdXJyZW50IG9uZQotICAgICAgICAgICAgaWYgKGVkaXRvcklucHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVkaXRvck5hbWUgPSBlZGl0b3JJbnB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIHhzZEZpbGVFZGl0b3JJbnB1dC5zZXRFZGl0b3JOYW1lKGVkaXRvck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWRpdG9yUGFydCA9IGdldEV4aXN0aW5nRWRpdG9yRm9ySW5saW5lU2NoZW1hKHBhZ2UsIHNjaGVtYUZpbGUsIHNjaGVtYSk7Ci0gICAgICAgICAgICBpZiAoZWRpdG9yUGFydCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKHhzZEZpbGVFZGl0b3JJbnB1dCwgWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRCwgdHJ1ZSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoc2NoZW1hRmlsZSksIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIGVkaXRvclBhcnQpLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShmQ29tcG9uZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gb3BlbiB0aGUgeHNkIGV4dGVybmFsbHkKLSAgICAgICAgaWYgKHNjaGVtYUxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgICAgb3BlbkV4dGVybmFsRmlsZXMocGFnZSwgc2NoZW1hTG9jYXRpb24sIGZDb21wb25lbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuWFNERWRpdG9yKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50KQotICB7Ci0gICAgb3BlblhTREVkaXRvcihlZGl0b3JJbnB1dCwgeHNkQ29tcG9uZW50LmdldFNjaGVtYSgpLCB4c2RDb21wb25lbnQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5YU0RFZGl0b3IoSUVkaXRvcklucHV0IGVkaXRvcklucHV0LCBYU0RTY2hlbWEgc2NoZW1hLCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQpCi0gIHsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IG51bGw7Ci0gICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgIHsKLSAgICAgIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgIH0KLQotICAgIFN0cmluZyByZXNvdXJjZSA9IHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgIAotICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCAmJiByZXNvdXJjZSAhPSBudWxsICYmICFyZXNvdXJjZS5zdGFydHNXaXRoKCJodHRwIikpCi0gICAgewotICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChyZXNvdXJjZSk7Ci0gICAgICBvcGVuV29ya3NwYWNlRmlsZShwYWdlLCBzY2hlbWFMb2NhdGlvbiwgeHNkQ29tcG9uZW50KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG9wZW5FeHRlcm5hbEZpbGVzKHBhZ2UsIHJlc291cmNlLCB4c2RDb21wb25lbnQpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5JbmxpbmVTY2hlbWEoSUVkaXRvcklucHV0IGVkaXRvcklucHV0LCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQsIFhTRFNjaGVtYSBzY2hlbWEsIFN0cmluZyBlZGl0b3JOYW1lKQotICB7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBudWxsOwotICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzV29ya3NwYWNlRmlsZSA9IGZhbHNlOwotICAgIAotICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgIFN0cmluZyB3b3Jrc3BhY2VGaWxlTG9jYXRpb24gPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHNjaGVtYUxvY2F0aW9uKTsKLSAgICBJUGF0aCB3b3Jrc3BhY2VGaWxlUGF0aCA9IG5ldyBQYXRoKHdvcmtzcGFjZUZpbGVMb2NhdGlvbik7Ci0gICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSh3b3Jrc3BhY2VGaWxlUGF0aCk7Ci0gICAgCi0gICAgaWYgKHBhZ2UgIT0gbnVsbCAmJiBmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBpc1dvcmtzcGFjZUZpbGUgPSB0cnVlOyAgCi0gICAgfQotCi0gICAgaWYgKGlzV29ya3NwYWNlRmlsZSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICAgIFhTREZpbGVFZGl0b3JJbnB1dCB4c2RGaWxlRWRpdG9ySW5wdXQgPSBuZXcgWFNERmlsZUVkaXRvcklucHV0KGZpbGUsIHNjaGVtYSk7Ci0gICAgICAgIHhzZEZpbGVFZGl0b3JJbnB1dC5zZXRFZGl0b3JOYW1lKGVkaXRvck5hbWUpOwotICAgICAgICBJRWRpdG9yUmVmZXJlbmNlW10gcmVmcyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotICAgICAgICBpbnQgbGVuZ3RoID0gcmVmcy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSByZWZzW2ldLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERmlsZUVkaXRvcklucHV0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElGaWxlIGFGaWxlID0gKChYU0RGaWxlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRGaWxlKCk7Ci0gICAgICAgICAgICBpZiAoYUZpbGUuZ2V0RnVsbFBhdGgoKS5lcXVhbHMoZmlsZS5nZXRGdWxsUGF0aCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCgoWFNERmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U2NoZW1hKCkgPT0gc2NoZW1hKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZWRpdG9yUGFydCA9IHJlZnNbaV0uZ2V0RWRpdG9yKHRydWUpOwotICAgICAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUocmVmc1tpXS5nZXRQYXJ0KHRydWUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZWRpdG9yUGFydCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZWRpdG9yUGFydCA9IHBhZ2Uub3BlbkVkaXRvcih4c2RGaWxlRWRpdG9ySW5wdXQsIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUsIDApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikKLSAgICAgICAgewotICAgICAgICAgIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgICB4c2RFZGl0b3Iub3Blbk9uR2xvYmFsUmVmZXJlbmNlKHhzZENvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiAhc2NoZW1hTG9jYXRpb24uc3RhcnRzV2l0aCgiaHR0cCIpKQotICAgICAgewotICAgICAgICBTdHJpbmcgZmlsZUxvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgLy8gVGhpcyBpcyB0byB3b3JrYXJvdW5kIHRoZSBkaWZmZXJlbmNlIGluIFVSSSByZXNvbHV0aW9uLiBPbiBsaW51eCwgdGhlIHJlc29sdmVkIGxvY2F0aW9uIGlzCi0gICAgICAgIC8vIHBsYXRmb3JtOi9yZXNvdXJjZS8gICBPbiBXaW5kb3dzLCBpdCdzIGZpbGU6Ly8KLSAgICAgICAgLy8gCi0gICAgICAgCWlmIChqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnLycpCi0gICAgICAJewotICAgICAgICAgIGZpbGVMb2NhdGlvbiA9ICIvIiArIFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woc2NoZW1hTG9jYXRpb24pOwotICAgICAgCX0KLSAgICAJICBlbHNlIC8vIFdpbmRvd3MKLSAgICAgIAl7Ci0gICAgICAgICAgZmlsZUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVByb3RvY29sKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgIAl9Ci0gICAgICAgIElQYXRoIHNjaGVtYVBhdGggPSBuZXcgUGF0aChmaWxlTG9jYXRpb24pOwotICAgICAgICBJRmlsZVN0b3JlIGZpbGVTdG9yZSA9IEVGUy5nZXRMb2NhbEZpbGVTeXN0ZW0oKS5nZXRTdG9yZShzY2hlbWFQYXRoKTsKLSAgICAgICAgaWYgKCFmaWxlU3RvcmUuZmV0Y2hJbmZvKCkuaXNEaXJlY3RvcnkoKSAmJiBmaWxlU3RvcmUuZmV0Y2hJbmZvKCkuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBRFRGaWxlU3RvcmVFZGl0b3JJbnB1dCB4c2RGaWxlU3RvcmVFZGl0b3JJbnB1dCA9IG5ldyBBRFRGaWxlU3RvcmVFZGl0b3JJbnB1dChmaWxlU3RvcmUsIHNjaGVtYSk7Ci0gICAgICAgICAgICB4c2RGaWxlU3RvcmVFZGl0b3JJbnB1dC5zZXRFZGl0b3JOYW1lKGVkaXRvck5hbWUpOwotCi0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLSAgICAgICAgICAgIElFZGl0b3JSZWZlcmVuY2VbXSByZWZzID0gcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gcmVmcy5sZW5ndGg7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSByZWZzW2ldLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEFEVEZpbGVTdG9yZUVkaXRvcklucHV0KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVVJJIHVyaSA9ICgoQURURmlsZVN0b3JlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRVUkkoKTsKLSAgICAgICAgICAgICAgICBpZiAodXJpLmVxdWFscyh4c2RGaWxlU3RvcmVFZGl0b3JJbnB1dC5nZXRVUkkoKSkgJiYgKChBRFRGaWxlU3RvcmVFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFNjaGVtYSgpID09IHhzZEZpbGVTdG9yZUVkaXRvcklucHV0LmdldFNjaGVtYSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGVkaXRvclBhcnQgPSByZWZzW2ldLmdldEVkaXRvcih0cnVlKTsKLSAgICAgICAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUocmVmc1tpXS5nZXRQYXJ0KHRydWUpKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFnZSAhPSBudWxsICYmIGVkaXRvclBhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWRpdG9yUGFydCA9IHBhZ2Uub3BlbkVkaXRvcih4c2RGaWxlU3RvcmVFZGl0b3JJbnB1dCwgWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRCwgdHJ1ZSwgMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgICAgICAgeHNkRWRpdG9yLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZSh4c2RDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKQotICAgICAgICAgIHsKLQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBudWxsOwotICAgICAgICAgIElFZGl0b3JSZWZlcmVuY2VbXSByZWZzID0gcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgICAgICAgaW50IGxlbmd0aCA9IHJlZnMubGVuZ3RoOwotICAgICAgICAgIC8vIE5lZWQgdG8gZmluZCBpZiBhbiBlZGl0b3Igb24gdGhhdCBzY2hlbWEgaGFzIGFscmVhZHkgYmVlbiBvcGVuZWQKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IHJlZnNbaV0uZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBBRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dCB4c2RGaWxlU3RvcmFnZUVkaXRvcklucHV0ID0gKEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KSBpbnB1dDsKLSAgICAgICAgICAgICAgaWYgKHhzZEZpbGVTdG9yYWdlRWRpdG9ySW5wdXQuZ2V0VXJsU3RyaW5nKCkuZXF1YWxzKHNjaGVtYUxvY2F0aW9uKQotICAgICAgICAgICAgICAgICAgJiYgeHNkRmlsZVN0b3JhZ2VFZGl0b3JJbnB1dC5nZXRFZGl0b3JJRCgpLmVxdWFscyhYU0RFZGl0b3JQbHVnaW4uRURJVE9SX0lEKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVkaXRvclBhcnQgPSByZWZzW2ldLmdldEVkaXRvcih0cnVlKTsKLSAgICAgICAgICAgICAgICBwYWdlLmFjdGl2YXRlKHJlZnNbaV0uZ2V0UGFydCh0cnVlKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGVkaXRvclBhcnQgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dCB4c2RGaWxlU3RvcmFnZUVkaXRvcklucHV0ID0gbmV3IEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgIHhzZEZpbGVTdG9yYWdlRWRpdG9ySW5wdXQuc2V0U2NoZW1hKHNjaGVtYSk7Ci0gICAgICAgICAgICB4c2RGaWxlU3RvcmFnZUVkaXRvcklucHV0LnNldEVkaXRvck5hbWUoZWRpdG9yTmFtZSk7Ci0gICAgICAgICAgICB4c2RGaWxlU3RvcmFnZUVkaXRvcklucHV0LnNldEVkaXRvcklEKFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQpOwotICAgICAgICAgICAgZWRpdG9yUGFydCA9IHBhZ2Uub3BlbkVkaXRvcih4c2RGaWxlU3RvcmFnZUVkaXRvcklucHV0LCBYU0RFZGl0b3JQbHVnaW4uRURJVE9SX0lELCB0cnVlLCAwKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciB4c2RFZGl0b3IgPSAoSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIGVkaXRvclBhcnQ7Ci0gICAgICAgICAgICB4c2RFZGl0b3Iub3Blbk9uR2xvYmFsUmVmZXJlbmNlKHhzZENvbXBvbmVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgSUVkaXRvclBhcnQgZ2V0RXhpc3RpbmdFZGl0b3JGb3JJbmxpbmVTY2hlbWEoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgSUZpbGUgc2NoZW1hRmlsZSwgWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIElFZGl0b3JSZWZlcmVuY2UgW10gcmVmcyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotICAgIGludCBsZW5ndGggPSByZWZzLmxlbmd0aDsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSByZWZzW2ldLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREZpbGVFZGl0b3JJbnB1dCkKLSAgICAgICAgewotICAgICAgICAgIElGaWxlIGFGaWxlID0gKChYU0RGaWxlRWRpdG9ySW5wdXQpaW5wdXQpLmdldEZpbGUoKTsKLSAgICAgICAgICBpZiAoYUZpbGUuZ2V0RnVsbFBhdGgoKS5lcXVhbHMoc2NoZW1hRmlsZS5nZXRGdWxsUGF0aCgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKChYU0RGaWxlRWRpdG9ySW5wdXQpaW5wdXQpLmdldFNjaGVtYSgpID09IHNjaGVtYSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWRpdG9yUGFydCA9IHJlZnNbaV0uZ2V0RWRpdG9yKHRydWUpOwotICAgICAgICAgICAgICBwYWdlLmFjdGl2YXRlKHJlZnNbaV0uZ2V0UGFydCh0cnVlKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBlZGl0b3JQYXJ0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5Xb3Jrc3BhY2VGaWxlKElXb3JrYmVuY2hQYWdlIHBhZ2UsIFN0cmluZyBzY2hlbWFMb2NhdGlvbiwgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50KQotICB7Ci0gICAgSVBhdGggc2NoZW1hUGF0aCA9IG5ldyBQYXRoKHNjaGVtYUxvY2F0aW9uKTsKLSAgICBJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHNjaGVtYVBhdGgpOwotICAgIGlmIChwYWdlICE9IG51bGwgJiYgZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLSAgICAgICAgaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikKLSAgICAgICAgewotICAgICAgICAgIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgICB4c2RFZGl0b3Iub3Blbk9uR2xvYmFsUmVmZXJlbmNlKHhzZENvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICB7Ci0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkV4dGVybmFsRmlsZXMoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgU3RyaW5nIHNjaGVtYUxvY2F0aW9uLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBmQ29tcG9uZW50KQotICB7Ci0gICAgaWYgKHNjaGVtYUxvY2F0aW9uID09IG51bGwpIHJldHVybjsgIC8vIEFzc2VydCBub3QgbnVsbAotICAKLSAgICBJUGF0aCBzY2hlbWFQYXRoID0gbmV3IFBhdGgoc2NoZW1hTG9jYXRpb24pOwotLy8gIEluaXRpYWxseSB0cmllZCB0byB1c2Ugc2NoZW1hUGF0aC5nZXREZXZpY2UoKSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYW4gaHR0cCByZWZlcmVuY2UuICBIb3dldmVyLCBvbiBMaW51eCwgaXQgaXMgbnVsbC4KLS8vICBTbyBhcyBhIHJlc3VsdCBvZiBidWcgMjIxNDIxLCB3ZSB3aWxsIGp1c3QgdXNlIHRoZSBzY2hlbWFMb2NhdGlvbi4KLSAgICBpZiAoIXNjaGVtYUxvY2F0aW9uLnN0YXJ0c1dpdGgoImh0dHAiKSkKLSAgICB7Ci0gICAgICBzY2hlbWFQYXRoID0gbmV3IFBhdGgoVVJJSGVscGVyLnJlbW92ZVByb3RvY29sKHNjaGVtYUxvY2F0aW9uKSk7Ci0gICAgfQotICAgIElGaWxlU3RvcmUgZmlsZVN0b3JlID0gRUZTLmdldExvY2FsRmlsZVN5c3RlbSgpLmdldFN0b3JlKHNjaGVtYVBhdGgpOwotICAgIFVSSSBzY2hlbWFVUkkgPSBVUkkuY3JlYXRlKHNjaGVtYUxvY2F0aW9uKTsKLSAgICBpZiAoIWZpbGVTdG9yZS5mZXRjaEluZm8oKS5pc0RpcmVjdG9yeSgpICYmIGZpbGVTdG9yZS5mZXRjaEluZm8oKS5leGlzdHMoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICAgIElFZGl0b3JSZWZlcmVuY2VbXSByZWZzID0gcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGludCBsZW5ndGggPSByZWZzLmxlbmd0aDsKLSAgICAgICAgLy8gTmVlZCB0byBmaW5kIGlmIGFuIGVkaXRvciBvbiB0aGF0IHNjaGVtYSBoYXMgYWxyZWFkeSBiZWVuIG9wZW5lZAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gcmVmc1tpXS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEZpbGVTdG9yZUVkaXRvcklucHV0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFVSSSB1cmkgPSAoKEZpbGVTdG9yZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0VVJJKCk7Ci0gICAgICAgICAgICBpZiAodXJpLmVxdWFscyhzY2hlbWFVUkkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcmVmc1tpXS5nZXRFZGl0b3IodHJ1ZSk7Ci0gICAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUocmVmc1tpXS5nZXRQYXJ0KHRydWUpKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChlZGl0b3JQYXJ0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBlZGl0b3JQYXJ0ID0gSURFLm9wZW5FZGl0b3JPbkZpbGVTdG9yZShwYWdlLCBmaWxlU3RvcmUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciB4c2RFZGl0b3IgPSAoSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIGVkaXRvclBhcnQ7Ci0gICAgICAgICAgeHNkRWRpdG9yLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShmQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAoc2NoZW1hTG9jYXRpb24uc3RhcnRzV2l0aCgiaHR0cCIpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICAgICAgICBJRWRpdG9yUmVmZXJlbmNlW10gcmVmcyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotICAgICAgICAgICAgaW50IGxlbmd0aCA9IHJlZnMubGVuZ3RoOwotICAgICAgICAgICAgLy8gTmVlZCB0byBmaW5kIGlmIGFuIGVkaXRvciBvbiB0aGF0IHNjaGVtYSBoYXMgYWxyZWFkeSBiZWVuIG9wZW5lZAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gcmVmc1tpXS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBBRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0IHJlYWRPbmx5RWRpdG9ySW5wdXQgPSAoQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQpIGlucHV0OwotICAgICAgICAgICAgICAgIGlmIChyZWFkT25seUVkaXRvcklucHV0LmdldFVybFN0cmluZygpLmVxdWFscyhzY2hlbWFMb2NhdGlvbikgJiYKLSAgICAgICAgICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRC5lcXVhbHMocmVhZE9ubHlFZGl0b3JJbnB1dC5nZXRFZGl0b3JJRCgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcmVmc1tpXS5nZXRFZGl0b3IodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICBwYWdlLmFjdGl2YXRlKHJlZnNbaV0uZ2V0UGFydCh0cnVlKSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0IHJlYWRPbmx5U3RvcmFnZUVkaXRvcklucHV0ID0gbmV3IEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgcmVhZE9ubHlTdG9yYWdlRWRpdG9ySW5wdXQuc2V0RWRpdG9ySUQoWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRCk7Ci0gICAgICAgICAgICAgIGVkaXRvclBhcnQgPSBwYWdlLm9wZW5FZGl0b3IocmVhZE9ubHlTdG9yYWdlRWRpdG9ySW5wdXQsIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUsIDApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciB4c2RFZGl0b3IgPSAoSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIGVkaXRvclBhcnQ7Ci0gICAgICAgICAgICAgIHhzZEVkaXRvci5vcGVuT25HbG9iYWxSZWZlcmVuY2UoZkNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEZpbGVTdG9yZUVkaXRvcklucHV0IHhzZEZpbGVTdG9yZUVkaXRvcklucHV0ID0gbmV3IEZpbGVTdG9yZUVkaXRvcklucHV0KGZpbGVTdG9yZSk7ICAgICAgICAKLSAgICAgICAgICBwYWdlLm9wZW5FZGl0b3IoeHNkRmlsZVN0b3JlRWRpdG9ySW5wdXQsIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUsIDApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgfQotICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9TZXRCYXNlVHlwZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9TZXRCYXNlVHlwZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmMzYTQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvU2V0QmFzZVR5cGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFNldEJhc2VUeXBlQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLnNldEJhc2VUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBTZXRCYXNlVHlwZUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9CQVNFX1RZUEUgKyAiLi4uIik7IC8vJE5PTi1OTFMtMSQKLSAgICBzZXRJZChJRCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICAKLSAgICAgIGJvb2xlYW4gY29tcGxleFR5cGUgPSBzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci0gICAgICBib29sZWFuIHNpbXBsZVR5cGUgPSBzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLSAgICAgIAotICAgICAgaWYgKGNvbXBsZXhUeXBlIHx8IHNpbXBsZVR5cGUpCi0gICAgICB7Ci0gICAgICAgIAotICAgICAgICBpZiAoZ2V0V29ya2JlbmNoUGFydCgpIGluc3RhbmNlb2YgSUVkaXRvclBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSAoSUVkaXRvclBhcnQpZ2V0V29ya2JlbmNoUGFydCgpOwotCi0gICAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWU7Ci0gICAgICAgICAgSUNvbXBvbmVudERpYWxvZyBkaWFsb2cgPSBudWxsOwotICAgICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0gICAgICAgICAgaWYgKGRpYWxvZyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgCWlmKHNpbXBsZVR5cGUpCi0gICAgICAgIAl7Ci0gICAgICAgIAkJKChYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUpIGRpYWxvZykuc2hvd0NvbXBsZXhUeXBlcyhmYWxzZSk7Ci0gICAgICAgIAl9Ci0gICAgICAgICAgICBpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5ld1ZhbHVlID0gZGlhbG9nLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKHNlbGVjdGlvbiwgbmV3VmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL1NldE11bHRpcGxpY2l0eUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9TZXRNdWx0aXBsaWNpdHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMzOTk2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL1NldE11bHRpcGxpY2l0eUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuU2V0TXVsdGlwbGljaXR5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBTZXRNdWx0aXBsaWNpdHlBY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFUVVJUkVEX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0TXVsdGlwbGljaXR5LlJFUVVJUkVEX0lEIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBaRVJPX09SX09ORV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLlNldE11bHRpcGxpY2l0eS5aRVJPX09SX09ORV9JRCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgWkVST19PUl9NT1JFX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0TXVsdGlwbGljaXR5LlpFUk9fT1JfTU9SRV9JRCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgT05FX09SX01PUkVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRNdWx0aXBsaWNpdHkuT05FX09SX01PUkVfSUQiOyAvLyROT04tTkxTLTEkCi0gIAotICBTZXRNdWx0aXBsaWNpdHlDb21tYW5kIGNvbW1hbmQ7Ci0gIAotICBwdWJsaWMgU2V0TXVsdGlwbGljaXR5QWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIElEKQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChsYWJlbCk7Ci0gICAgc2V0SWQoSUQpOwotICAgIGNvbW1hbmQgPSBuZXcgU2V0TXVsdGlwbGljaXR5Q29tbWFuZChsYWJlbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1heE9jY3VycyhpbnQgaSkKLSAgewotICAgIGNvbW1hbmQuc2V0TWF4T2NjdXJzKGkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TWluT2NjdXJzKGludCBpKQotICB7Ci0gICAgY29tbWFuZC5zZXRNaW5PY2N1cnMoaSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGNhbGN1bGF0ZUVuYWJsZWQoKQotICB7Ci0gICAgYm9vbGVhbiBzdGF0ZSA9IHN1cGVyLmNhbGN1bGF0ZUVuYWJsZWQoKTsKLSAgICBpZiAoc3RhdGUpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29uY3JldGVDb21wb25lbnQgPSBnZXRYU0RJbnB1dCgpOwotICAgICAgaWYgKHhzZENvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm4gISgoWFNERWxlbWVudERlY2xhcmF0aW9uKXhzZENvbmNyZXRlQ29tcG9uZW50KS5pc0dsb2JhbCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoeHNkQ29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgewotICAgICAgICByZXR1cm4gISgoKFhTRE1vZGVsR3JvdXApeHNkQ29uY3JldGVDb21wb25lbnQpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRlOwotICB9Ci0gIAotICBwcml2YXRlIFhTRENvbmNyZXRlQ29tcG9uZW50IGdldFhTRElucHV0KCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHhzZENvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotICAgIHJldHVybiB4c2RDb25jcmV0ZUNvbXBvbmVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IGdldFhTRElucHV0KCk7Ci0gICAgaWYgKHhzZENvbmNyZXRlQ29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgY29tbWFuZC5zZXRYU0RDb25jcmV0ZUNvbXBvbmVudCh4c2RDb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9TZXRUeXBlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL1NldFR5cGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA4M2U0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL1NldFR5cGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlNldFR5cGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFNldFR5cGVBY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9ORVdfVFlQRV9JRCA9ICJTZXRUeXBlQWN0aW9uX0FkZFR5cGUiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9FWElTVElOR19UWVBFX0lEID0gIlNldFR5cGVBY3Rpb25fRXhpc3RpbmdUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0gIFNldFR5cGVDb21tYW5kIGNvbW1hbmQ7Ci0KLSAgcHVibGljIFNldFR5cGVBY3Rpb24oU3RyaW5nIGxhYmVsLCBTdHJpbmcgSUQsIElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KGxhYmVsKTsKLSAgICBzZXRJZChJRCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBPYmplY3QgdGFyZ2V0ID0gKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLQotICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBjb21tYW5kID0gbmV3IFNldFR5cGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0VUX1RZUEUsIGdldElkKCksIChYU0RDb25jcmV0ZUNvbXBvbmVudCkgdGFyZ2V0KTsKLSAgICAgICAgY29tbWFuZC5zZXRBZGFwdGVyKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvWFNEQmFzZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9YU0RCYXNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MmQ5NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9YU0RCYXNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLklBdXRvRGlyZWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREJhc2VBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IGFkZGVkQ29tcG9uZW50OwotCi0gIHB1YmxpYyBYU0RCYXNlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGNhbGN1bGF0ZUVuYWJsZWQoKQotICB7Ci0gICAgaWYgKGdldFdvcmtiZW5jaFBhcnQoKSBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IG93bmluZ0VkaXRvciA9IChJRWRpdG9yUGFydClnZXRXb3JrYmVuY2hQYXJ0KCk7Ci0gICAgICAKLSAgICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gbnVsbDsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgeHNkU2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClzZWxlY3Rpb24pLmdldFNjaGVtYSgpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwgJiYgeHNkU2NoZW1hID09IG93bmluZ0VkaXRvci5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcykpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRvRWRpdChPYmplY3Qgb2JqLCBJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgaWYgKG9iaiBpbnN0YW5jZW9mIFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQpCi0gICAgewotICAgICAgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCBlZGl0UGFydCA9IChUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0KW9iajsKLSAgICAgIGlmIChhZGRlZENvbXBvbmVudCA9PSAoKFhTREJhc2VBZGFwdGVyKWVkaXRQYXJ0LmdldE1vZGVsKCkpLmdldFRhcmdldCgpKQotICAgICAgewotICAgICAgICBlZGl0UGFydC5zZXRTY3JvbGwodHJ1ZSk7Ci0gICAgICAgIGVkaXRQYXJ0LmFkZEZlZWRiYWNrKCk7Ci0gICAgICAgIGVkaXRQYXJ0LmRvRWRpdE5hbWUoIShwYXJ0IGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQmFzZUZpZWxkRWRpdFBhcnQpCi0gICAgewotICAgICAgQmFzZUZpZWxkRWRpdFBhcnQgZWRpdFBhcnQgPSAoQmFzZUZpZWxkRWRpdFBhcnQpb2JqOwotICAgICAgZWRpdFBhcnQuZG9FZGl0TmFtZSghKHBhcnQgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkpOwotICAgIH0KLSAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQXV0b0RpcmVjdEVkaXQpCi0gICAgewotICAgICAgKChJQXV0b0RpcmVjdEVkaXQpb2JqKS5kb0VkaXROYW1lKCEocGFydCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGREb2N1bWVudGF0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRG9jdW1lbnRhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ2MmVjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGREb2N1bWVudGF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQWRkRG9jdW1lbnRhdGlvbkNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb247Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IGlucHV0OwotICBTdHJpbmcgbmV3VmFsdWUsIG9sZFZhbHVlOwotICBib29sZWFuIGRvY3VtZW50YXRpb25FeGlzdHM7Ci0gIEVsZW1lbnQgZG9jdW1lbnRhdGlvbkVsZW1lbnQ7Ci0KLSAgcHVibGljIEFkZERvY3VtZW50YXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dCwgU3RyaW5nIG5ld1ZhbHVlLCBTdHJpbmcgb2xkVmFsdWUpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RBbm5vdGF0aW9uID0geHNkQW5ub3RhdGlvbjsKLSAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gICAgdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotICAgIHRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIGVuc3VyZVNjaGVtYUVsZW1lbnQoKFhTRFNjaGVtYSlpbnB1dCk7Ci0gICAgfQotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGlucHV0LmdldEVsZW1lbnQoKSk7Ci0KLSAgICAgIHhzZEFubm90YXRpb24gPSBYU0RDb21tb25VSVV0aWxzLmdldElucHV0WFNEQW5ub3RhdGlvbihpbnB1dCwgdHJ1ZSk7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RBbm5vdGF0aW9uLmdldEVsZW1lbnQoKTsKLQotICAgICAgTGlzdCBkb2N1bWVudGF0aW9uTGlzdCA9IHhzZEFubm90YXRpb24uZ2V0VXNlckluZm9ybWF0aW9uKCk7Ci0gICAgICBkb2N1bWVudGF0aW9uRWxlbWVudCA9IG51bGw7Ci0gICAgICBkb2N1bWVudGF0aW9uRXhpc3RzID0gZmFsc2U7Ci0gICAgICBpZiAoZG9jdW1lbnRhdGlvbkxpc3Quc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgZG9jdW1lbnRhdGlvbkV4aXN0cyA9IHRydWU7Ci0gICAgICAgIGRvY3VtZW50YXRpb25FbGVtZW50ID0gKEVsZW1lbnQpIGRvY3VtZW50YXRpb25MaXN0LmdldCgwKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRvY3VtZW50YXRpb25FbGVtZW50ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGRvY3VtZW50YXRpb25FbGVtZW50ID0geHNkQW5ub3RhdGlvbi5jcmVhdGVVc2VySW5mb3JtYXRpb24obnVsbCk7Ci0gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgICBmb3JtYXRDaGlsZChkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICAgIC8vIERlZmVjdCBpbiBtb2RlbC4uLi5JIGNyZWF0ZSBpdCBidXQgdGhlIG1vZGVsIG9iamVjdCBkb2Vzbid0IGFwcGVhcgotICAgICAgICAvLyB0byBiZSB1cGRhdGVkCi0gICAgICAgIHhzZEFubm90YXRpb24udXBkYXRlRWxlbWVudCgpOwotICAgICAgICB4c2RBbm5vdGF0aW9uLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkb2N1bWVudGF0aW9uRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChkb2N1bWVudGF0aW9uRWxlbWVudCBpbnN0YW5jZW9mIElET01FbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgSURPTUVsZW1lbnQgZG9tRWxlbWVudCA9IChJRE9NRWxlbWVudCkgZG9jdW1lbnRhdGlvbkVsZW1lbnQ7Ci0KLSAgICAgICAgICBOb2RlIGZpcnN0Q2hpbGQgPSBkb2N1bWVudGF0aW9uRWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgTm9kZSBsYXN0Q2hpbGQgPSBkb2N1bWVudGF0aW9uRWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsKLSAgICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICAgIGludCBlbmQgPSAwOwotCi0gICAgICAgICAgLy8gSURPTU1vZGVsIG1vZGVsID0gZG9tRWxlbWVudC5nZXRNb2RlbCgpOwotICAgICAgICAgIC8vIElET01Eb2N1bWVudCBkb2MgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotICAgICAgICAgIElET01Ob2RlIGZpcnN0ID0gbnVsbDsKLSAgICAgICAgICBpZiAoZmlyc3RDaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZpcnN0ID0gKElET01Ob2RlKSBmaXJzdENoaWxkOwotICAgICAgICAgICAgc3RhcnQgPSBmaXJzdC5nZXRTdGFydE9mZnNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobGFzdENoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgSURPTU5vZGUgbGFzdCA9IChJRE9NTm9kZSkgbGFzdENoaWxkOwotICAgICAgICAgICAgZW5kID0gbGFzdC5nZXRFbmRPZmZzZXQoKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoZG9tRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9sZFZhbHVlID0gZG9tRWxlbWVudC5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldChzdGFydCwgZW5kIC0gc3RhcnQpOwotICAgICAgICAgICAgZG9tRWxlbWVudC5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KGRvY3VtZW50YXRpb25FbGVtZW50LCBzdGFydCwgZW5kIC0gc3RhcnQsIG5ld1ZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIG9sZFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBOb2RlIGNoaWxkTm9kZSA9IGRvY3VtZW50YXRpb25FbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZShuZXdWYWx1ZSk7Ci0gICAgICAgICAgZG9jdW1lbnRhdGlvbkVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICAgIHN1cGVyLnVuZG8oKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRW51bWVyYXRpb25zQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRW51bWVyYXRpb25zQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2I4ZmE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEVudW1lcmF0aW9uc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFCdWlsZGluZ1Rvb2xzOwotCi1wdWJsaWMgY2xhc3MgQWRkRW51bWVyYXRpb25zQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGU7Ci0gIFN0cmluZyB2YWx1ZTsKLSAgLy8gVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbS4gIElmIG5vIGl0ZW0gaXMgc2VsZWN0ZWQsIGluZGV4IHdpbGwgYmUgbGVzcyB0aGFuIDAKLSAgcHJpdmF0ZSBpbnQgaW5kZXggPSAtMTsgIAotICAvLyBEZXRlcm1pbmVzIHdoZXJlIHRoZSBlbGVtZW50IHNob3VsZCBiZSBpbnNlcnRlZCBiYXNlZCBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnQuICBJZiBubwotICAvLyBlbGVtZW50IGlzIHNlbGVjdGVkLCB1c2UgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIGFwcGVuZGluZyB0aGUgZWxlbWVudCB0byB0aGUgZW5kCi0gIHByaXZhdGUgU3RyaW5nIGFkZEVudW1lcmF0aW9uTG9jYXRpb247Ci0gIAotICBwdWJsaWMgQWRkRW51bWVyYXRpb25zQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5zaW1wbGVUeXBlID0gc2ltcGxlVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBBZGRFbnVtZXJhdGlvbnNDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSwgU3RyaW5nIElELCBpbnQgaW5kZXgpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5zaW1wbGVUeXBlID0gc2ltcGxlVHlwZTsKLSAgICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gICAgdGhpcy5hZGRFbnVtZXJhdGlvbkxvY2F0aW9uID0gSUQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7IAotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhzaW1wbGVUeXBlLmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RTY2hlbWFCdWlsZGluZ1Rvb2xzLmdldFhTREZhY3RvcnkoKTsKLSAgICAgIFhTREVudW1lcmF0aW9uRmFjZXQgZW51bWVyYXRpb25GYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNERW51bWVyYXRpb25GYWNldCgpOwotICAgICAgZW51bWVyYXRpb25GYWNldC5zZXRMZXhpY2FsVmFsdWUodmFsdWUpOwotICAgICAgCi0gICAgICBpbmRleCA9IGdldEluc2VydGlvbkluZGV4KCk7Ci0gICAgICBMaXN0IGZhY2V0cyA9IHNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpOwotICAgICAgaWYgKGluZGV4ID49MCAmJiBpbmRleCA8IGZhY2V0cy5zaXplKCkpCi0gICAgICB7Ci0gICAgICAgIGZhY2V0cy5hZGQoaW5kZXgsIGVudW1lcmF0aW9uRmFjZXQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmYWNldHMuYWRkKGVudW1lcmF0aW9uRmFjZXQpOwotICAgICAgfQotICAgICAgZm9ybWF0Q2hpbGQoc2ltcGxlVHlwZS5nZXRFbGVtZW50KCkpOwotICAgICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGVudW1lcmF0aW9uRmFjZXQ7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBpbnQgZ2V0SW5zZXJ0aW9uSW5kZXgoKQotICB7Ci0gICAgaWYgKGluZGV4IDwgMCkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGlmIChhZGRFbnVtZXJhdGlvbkxvY2F0aW9uLmVxdWFscyhBZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uLkJFRk9SRV9TRUxFQ1RFRF9JRCkpCi0gICAgewotICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLSAgICBlbHNlIGlmIChhZGRFbnVtZXJhdGlvbkxvY2F0aW9uLmVxdWFscyhBZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uLkFGVEVSX1NFTEVDVEVEX0lEKSkKLSAgICB7Ci0gICAgICBpbmRleCsrOwotICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2liaWxpdHlFbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQ3ZjU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2liaWxpdHlFbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLlNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFkZEV4dGVuc2liaWxpdHlFbGVtZW50Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIEVsZW1lbnQgaW5wdXQsIGVsZW1lbnRUb0FkZDsKLSAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgZXh0ZW5zaW9uU2NoZW1hU3BlYzsKLQotICBwdWJsaWMgQWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgRWxlbWVudCBpbnB1dCwgRWxlbWVudCBlbGVtZW50VG9BZGQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgIHRoaXMuZWxlbWVudFRvQWRkID0gZWxlbWVudFRvQWRkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoaW5wdXQpOwotICAgICAgYWRkRWxlbWVudCgpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgICBzdXBlci51bmRvKCk7Ci0gICAgLy8gVE9ETwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hUHJvcGVydGllcyhTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBhcHBJbmZvU2NoZW1hU3BlYykKLSAgewotICAgIHRoaXMuZXh0ZW5zaW9uU2NoZW1hU3BlYyA9IGFwcEluZm9TY2hlbWFTcGVjOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFkZEVsZW1lbnQoKQotICB7Ci0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgRG9jdW1lbnQgZG9jID0gaW5wdXQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50VG9BZGQuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhleHRlbnNpb25TY2hlbWFTcGVjLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IGlucHV0LmdldFByZWZpeCgpOwotICAgICAgICByb290RWxlbWVudC5zZXRQcmVmaXgocHJlZml4KTsKLSAgICAgICAgU3RyaW5nIHhtbG5zID0gKHByZWZpeCA9PSBudWxsIHx8IHByZWZpeC5lcXVhbHMoIiIpKSA/ICJ4bWxucyIgOiAieG1sbnM6IiArIHByZWZpeDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgQXR0ciBuc1VSSUF0dHJpYnV0ZSA9IGRvYy5jcmVhdGVBdHRyaWJ1dGUoeG1sbnMpOwotICAgICAgICBuc1VSSUF0dHJpYnV0ZS5zZXRWYWx1ZShleHRlbnNpb25TY2hlbWFTcGVjLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShuc1VSSUF0dHJpYnV0ZSk7Ci0gICAgICAgIGlucHV0LmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotCi0gICAgICB9Ci0KLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaW9uQXR0cmlidXRlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaW9uQXR0cmlidXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWUwYzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2lvbkF0dHJpYnV0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSW5mb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWRkRXh0ZW5zaW9uQXR0cmlidXRlQ29tbWFuZCBleHRlbmRzIEFkZEV4dGVuc2lvbkNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIgbWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotICBwcml2YXRlIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZTsKLSAgcHJpdmF0ZSBib29sZWFuIGFwcEluZm9BdHRyaWJ1dGVBZGRlZCA9IGZhbHNlOwotICBwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGVRTmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlUHJlZml4OwotCi0gIHB1YmxpYyBBZGRFeHRlbnNpb25BdHRyaWJ1dGVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotICAgIHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhjb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICAgIG5hbWVzcGFjZVByZWZpeCA9IGhhbmRsZU5hbWVzcGFjZVByZWZpY2VzKCk7Ci0KLSAgICAgIGF0dHJpYnV0ZVFOYW1lID0gbmFtZXNwYWNlUHJlZml4ICsgIjoiICsgYXR0cmlidXRlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgIGlmICghKGNvbXBvbmVudC5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZVFOYW1lKSkpCi0gICAgICB7Ci0gICAgICAgIGFwcEluZm9BdHRyaWJ1dGVBZGRlZCA9IHRydWU7Ci0gICAgICAgIGNvbXBvbmVudC5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZVFOYW1lLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gICAgc3VwZXIudW5kbygpOwotICAgIGlmIChhcHBJbmZvQXR0cmlidXRlQWRkZWQpewotICAgICAgY29tcG9uZW50LmdldEVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlUU5hbWUpOwotICAgIH0KLSAgfQotCi0gIC8qKiBDcmVhdGUgYSBuYW1lc3BhY2UgcHJlZml4IGlmIG5lZWRlZCwgb3RoZXIgd2lzZSByZXRyaWV2ZSAKLSAgICogYSBwcmVkZWZpbmVkIG5hbWVzcGFjZSBwcmVmaXgKLSAgICogQHJldHVybiAgICovCi0gIHByaXZhdGUgU3RyaW5nIGhhbmRsZU5hbWVzcGFjZVByZWZpY2VzKCkKLSAgewotICAgIEVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IGNvbXBvbmVudC5nZXRTY2hlbWEoKS5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgCi0gICAgLy8gSWYgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgYXR0cmlidXRlIGFscmVhZHkgZXhpc3RzCi0gICAgTGlzdCBuYW1lc3BhY2VQcmVmaWNlcyA9IG1hbmFnZXIuZ2V0TmFtZXNwYWNlSW5mb0xpc3Qoc2NoZW1hRWxlbWVudCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VQcmVmaWNlcy5zaXplKCk7IGkrKyl7Ci0gICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgbmFtZXNwYWNlUHJlZmljZXMuZ2V0KGkpOwotICAgICAgaWYgKCBpbmZvLnVyaS5lcXVhbHMoYXR0cmlidXRlLmdldFRhcmdldE5hbWVzcGFjZSgpKSkgewotICAgICAgICBwcmVmaXggPSBpbmZvLnByZWZpeDsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gQ3JlYXRlIHVucXVpZSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgaWYgKCBwcmVmaXggPT0gbnVsbCl7Ci0gICAgICBwcmVmaXggPSBjcmVhdGVVbmlxdWVQcmVmaXgoY29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBuZXcgTmFtZXNwYWNlSW5mbyhhdHRyaWJ1dGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHByZWZpeCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgTGlzdCBpbmZvTGlzdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0gICAgaW5mb0xpc3QuYWRkKGluZm8pOwotICAgIG1hbmFnZXIuYWRkTmFtZXNwYWNlSW5mbyhzY2hlbWFFbGVtZW50LCBpbmZvTGlzdCwgZmFsc2UpOwotICAgIHJldHVybiBwcmVmaXg7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlVW5pcXVlUHJlZml4KFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSAicCI7IC8vJE5PTi1OTFMtMSQKLSAgICBNYXAgcHJlZk1hcHBlciA9IGNvbXBvbmVudC5nZXRTY2hlbWEoKS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgaWYgKCBwcmVmTWFwcGVyLmdldChwcmVmaXgpICE9IG51bGwpewotICAgICAgaW50IGkgPSAxOwotICAgICAgd2hpbGUgKCBwcmVmTWFwcGVyLmdldChwcmVmaXggKyBpKSAhPSBudWxsKQotICAgICAgICBpKys7Ci0gICAgICBwcmVmaXggKz0gaTsKLSAgICB9Ci0gICAgcmV0dXJuIHByZWZpeDsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NzIxMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLlNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQWRkRXh0ZW5zaW9uQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBleHRlbnNpb25zU2NoZW1hU3BlYzsKLSAgcHJvdGVjdGVkIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudDsKLQotICBwcm90ZWN0ZWQgQWRkRXh0ZW5zaW9uQ29tbWFuZChTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFQcm9wZXJ0aWVzKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGFwcEluZm9TY2hlbWFTcGVjKQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25zU2NoZW1hU3BlYyA9IGFwcEluZm9TY2hlbWFTcGVjOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBlbnN1cmVTY2hlbWFFbGVtZW50KChYU0RTY2hlbWEpY29tcG9uZW50KTsKLSAgICB9Ci0gICAgCi0gICAgc3VwZXIuZXhlY3V0ZSgpOwotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2lvbkVsZW1lbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpb25FbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDQ2OTAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2lvbkVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLlNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRFeHRlbnNpb25FbGVtZW50Q29tbWFuZCBleHRlbmRzIEFkZEV4dGVuc2lvbkNvbW1hbmQKLXsKLSAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQ7Ci0gIEVsZW1lbnQgYXBwSW5mbzsKLSAgRWxlbWVudCBuZXdFbGVtZW50OwotCi0gIHB1YmxpYyBBZGRFeHRlbnNpb25FbGVtZW50Q29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbmNyZXRlQ29tcG9uZW50IGlucHV0LCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLmNvbXBvbmVudCA9IGlucHV0OwotICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgICAgYWRkQW5ub3RhdGlvblNldChjb21wb25lbnQuZ2V0U2NoZW1hKCksIGV4dGVuc2lvbnNTY2hlbWFTcGVjKTsKLSAgICAgIGZvcm1hdENoaWxkKGNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgICBzdXBlci51bmRvKCk7Ci0gICAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uID0gWFNEQ29tbW9uVUlVdGlscy5nZXRJbnB1dFhTREFubm90YXRpb24oY29tcG9uZW50LCBmYWxzZSk7Ci0gICAgeHNkQW5ub3RhdGlvbi5nZXRFbGVtZW50KCkucmVtb3ZlQ2hpbGQoYXBwSW5mbyk7Ci0gICAgTGlzdCBhcHBJbmZvcyA9IHhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpOwotICAgIGFwcEluZm9zLnJlbW92ZShhcHBJbmZvKTsKLSAgICB4c2RBbm5vdGF0aW9uLnVwZGF0ZUVsZW1lbnQoKTsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hUHJvcGVydGllcyhTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjKQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25zU2NoZW1hU3BlYyA9IHNwZWM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uU2V0KFhTRFNjaGVtYSB4c2RTY2hlbWEsIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMpCi0gIHsKLSAgICBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24gPSBYU0RDb21tb25VSVV0aWxzLmdldElucHV0WFNEQW5ub3RhdGlvbihjb21wb25lbnQsIHRydWUpOwotICAgIGFkZEFubm90YXRpb25TZXQoc3BlYywgeHNkQW5ub3RhdGlvbik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRkQW5ub3RhdGlvblNldChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjLCBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24pCi0gIHsgICAgIAotICAgIFhTRFNjaGVtYSBzY2hlbWE9IHhzZEFubm90YXRpb24uZ2V0U2NoZW1hKCk7Ci0gICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gc2NoZW1hLmdldEVsZW1lbnQoKTsKLQotICAgIGlmICh4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKS5zaXplKCkgPT0gMCkKLSAgICB7Ci0gICAgICBhcHBJbmZvID0geHNkQW5ub3RhdGlvbi5jcmVhdGVBcHBsaWNhdGlvbkluZm9ybWF0aW9uKG51bGwpOwotICAgICAgeHNkQW5ub3RhdGlvbi5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoYXBwSW5mbyk7Ci0gICAgICBMaXN0IGFwcEluZm9zID0geHNkQW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCk7Ci0gICAgICBhcHBJbmZvcy5hZGQoYXBwSW5mbyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyB1c2UgdGhlIGZpcnN0IGFwcEluZm8KLSAgICAgIGFwcEluZm8gPSAoRWxlbWVudCl4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHByZWZpeCA9IGFkZE5hbWVzcGFjZURlY2xhcmF0aW9uSWZSZXF1aXJlZChzY2hlbWFFbGVtZW50LCAicCIsIHNwZWMuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCi0gICAgaWYgKGFwcEluZm8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEb2N1bWVudCBkb2MgPSBhcHBJbmZvLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgCi0gICAgICBuZXdFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhzcGVjLmdldE5hbWVzcGFjZVVSSSgpLCBlbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICBuZXdFbGVtZW50LnNldFByZWZpeChwcmVmaXgpOyAgIAotICAgICAgYXBwSW5mby5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTsKLQotICAgICAgeHNkQW5ub3RhdGlvbi51cGRhdGVFbGVtZW50KCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVVbmlxdWVQcmVmaXgoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9ICJwIjsgLy8kTk9OLU5MUy0xJAotICAgIE1hcCBwcmVmTWFwcGVyID0gY29tcG9uZW50LmdldFNjaGVtYSgpLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICBpZiAoIHByZWZNYXBwZXIuZ2V0KHByZWZpeCkgIT0gbnVsbCl7Ci0gICAgICBpbnQgaSA9IDE7Ci0gICAgICB3aGlsZSAoIHByZWZNYXBwZXIuZ2V0KHByZWZpeCArIGkpICE9IG51bGwpCi0gICAgICAgIGkrKzsKLSAgICAgIHByZWZpeCArPSBpOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4OwotICB9ICAKLSAgCi0gIC8vIFRPRE8uLi4gY29tbW9uIHRoaXMgdXAgd2l0aCB3c2RsLnVpCi0gIHByaXZhdGUgU3RyaW5nIGFkZE5hbWVzcGFjZURlY2xhcmF0aW9uSWZSZXF1aXJlZChFbGVtZW50IHNjaGVtYUVsZW1lbnQsIFN0cmluZyBwcmVmaXhIaW50LCBTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7ICAgICAgCi0gICAgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoc2NoZW1hRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoc2NoZW1hRWxlbWVudCk7Ci0gICAgcHJlZml4ID0gbmFtZXNwYWNlVGFibGUuZ2V0UHJlZml4Rm9yVVJJKG5hbWVzcGFjZSk7Ci0gICAgaWYgKHByZWZpeCA9PSBudWxsKQotICAgIHsgCi0gICAgICBTdHJpbmcgYmFzZVByZWZpeCA9IHByZWZpeEhpbnQ7Ci0gICAgICBwcmVmaXggPSBiYXNlUHJlZml4OwotICAgICAgU3RyaW5nIHhtbG5zQ29sb24gPSAieG1sbnM6IjsgLy8kTk9OLU5MUy0xJAotICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSB4bWxuc0NvbG9uICsgcHJlZml4OwotICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgIHdoaWxlIChzY2hlbWFFbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgY291bnQrKzsKLSAgICAgICAgcHJlZml4ID0gYmFzZVByZWZpeCArIGNvdW50OwotICAgICAgICBhdHRyaWJ1dGVOYW1lID0geG1sbnNDb2xvbiArIHByZWZpeDsKLSAgICAgIH0gICAgICAKLSAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIG5hbWVzcGFjZSk7ICAKLSAgICB9ICAgIAotICAgIHJldHVybiBwcmVmaXg7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlY2VkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmFibGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBjb21tYW5kcyB0aGF0IGFkZCByZWRlZmluZWQgY29tcG9uZW50cyB0byBhIHNjaGVtYSByZWRlZmluZS4gCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFhTRFJlZGVmaW5lIHJlZGVmaW5lOwotCi0gIHByb3RlY3RlZCBYU0RSZWRlZmluYWJsZUNvbXBvbmVudCByZWRlZmluYWJsZUNvbXBvbmVudDsKLQotICBwdWJsaWMgQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFJlZGVmaW5lIHJlZGVmaW5lLCBYU0RSZWRlZmluYWJsZUNvbXBvbmVudCByZWRlZmluYWJsZUNvbXBvbmVudCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnJlZGVmaW5lID0gcmVkZWZpbmU7Ci0gICAgdGhpcy5yZWRlZmluYWJsZUNvbXBvbmVudCA9IHJlZGVmaW5hYmxlQ29tcG9uZW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9FeGVjdXRlKCk7Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSByZWRlZmluZS5nZXRFbGVtZW50KCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIGRvRXhlY3V0ZSgpOwotCSAgT2JqZWN0IGFkYXB0ZXIgPSAgcmVkZWZpbmFibGVDb21wb25lbnQuZUFkYXB0ZXJzKCkuZ2V0KDApOwotCSAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyKQotCSAgeyAgICAJCSAKLQkJICAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpYWRhcHRlcikudXBkYXRlRGVsZXRlZE1hcChyZWRlZmluYWJsZUNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgfQotCSAgZWxzZSBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcikKLQkgIHsgICAgCQkgCi0JCSAgKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpYWRhcHRlcikudXBkYXRlRGVsZXRlZE1hcChyZWRlZmluYWJsZUNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgfQotCSAgZWxzZSBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpCi0JICB7ICAgIAkJIAotCQkgICgoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcilhZGFwdGVyKS51cGRhdGVEZWxldGVkTWFwKHJlZGVmaW5hYmxlQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKQotCSAgeyAgICAJCSAKLQkJICAoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcilhZGFwdGVyKS51cGRhdGVEZWxldGVkTWFwKHJlZGVmaW5hYmxlQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgICByZWRlZmluZS5nZXRDb250ZW50cygpLmFkZChhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50KTsKLSAgICAgIGZvcm1hdENoaWxkKGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQW55QXR0cmlidXRlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQW55QXR0cmlidXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTFjYmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREFueUF0dHJpYnV0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEQW55QXR0cmlidXRlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb247Ci0gIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IGlucHV0OwotCi0gIHB1YmxpYyBBZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgICB0aGlzLmlucHV0ID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOyAKLSAgfQotICAKLSAgcHVibGljIEFkZFhTREFueUF0dHJpYnV0ZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uID0geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotICAgIHRoaXMuaW5wdXQgPSB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoaW5wdXQuZ2V0RWxlbWVudCgpKTsKLQotICAgICAgWFNEV2lsZGNhcmQgYW55QXR0cmlidXRlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEV2lsZGNhcmQoKTsKLSAgICAgIGlmICh4c2RDb21wbGV4VHlwZURlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLnNldEF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudChhbnlBdHRyaWJ1dGUpOwotICAgICAgICBmb3JtYXRDaGlsZCh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uc2V0QXR0cmlidXRlV2lsZGNhcmRDb250ZW50KGFueUF0dHJpYnV0ZSk7Ci0gICAgICAgIGZvcm1hdENoaWxkKHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotICAgICAgfQotICAgICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGFueUF0dHJpYnV0ZTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBbnlFbGVtZW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQW55RWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4OGE1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBbnlFbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hQnVpbGRpbmdUb29sczsKLQotcHVibGljIGNsYXNzIEFkZFhTREFueUVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNETW9kZWxHcm91cCBwYXJlbnQ7Ci0gIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZTsKLSAgYm9vbGVhbiBkb0NyZWF0ZU1vZGVsR3JvdXBGb3JDb21wbGV4VHlwZSA9IGZhbHNlOwotCi0gIHB1YmxpYyBBZGRYU0RBbnlFbGVtZW50Q29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRE1vZGVsR3JvdXAgcGFyZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb21wbGV4VHlwZShYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUpCi0gIHsKLSAgICB0aGlzLmNvbXBsZXhUeXBlID0gY29tcGxleFR5cGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldERvQ3JlYXRlTW9kZWxHcm91cEZvckNvbXBsZXhUeXBlKGJvb2xlYW4gZG9DcmVhdGUpCi0gIHsKLSAgICB0aGlzLmRvQ3JlYXRlTW9kZWxHcm91cEZvckNvbXBsZXhUeXBlID0gZG9DcmVhdGU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVNb2RlbEdyb3VwKCkKLSAgewotICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gZmFjdG9yeS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgIHBhcmVudCA9IGZhY3RvcnkuY3JlYXRlWFNETW9kZWxHcm91cCgpOwotICAgIHBhcmVudC5zZXRDb21wb3NpdG9yKFhTRENvbXBvc2l0b3IuU0VRVUVOQ0VfTElURVJBTCk7Ci0gICAgcGFydGljbGUuc2V0Q29udGVudChwYXJlbnQpOwotICAgIGNvbXBsZXhUeXBlLnNldENvbnRlbnQocGFydGljbGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAoZG9DcmVhdGVNb2RlbEdyb3VwRm9yQ29tcGxleFR5cGUpCi0gICAgICB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoY29tcGxleFR5cGUpOwotICAgICAgICBiZWdpblJlY29yZGluZyhjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkpOwotICAgICAgICBjcmVhdGVNb2RlbEdyb3VwKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgfQotICAgICAgWFNEV2lsZGNhcmQgd2lsZENhcmQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RXaWxkY2FyZCgpOwotICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgICAgcGFydGljbGUuc2V0Q29udGVudCh3aWxkQ2FyZCk7Ci0gICAgICBwYXJlbnQuZ2V0Q29udGVudHMoKS5hZGQocGFydGljbGUpOwotICAgICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IHdpbGRDYXJkOwotICAgICAgZm9ybWF0Q2hpbGQocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZGY3ZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwOwotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQ7Ci0gIGJvb2xlYW4gaXNSZWZlcmVuY2U7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVUb0FkZDsKLSAgLy8gVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbS4gIElmIG5vIGl0ZW0gaXMgc2VsZWN0ZWQsIGluZGV4IHdpbGwgYmUgbGVzcyB0aGFuIDAKLSAgcHJpdmF0ZSBpbnQgaW5kZXggPSAtMTsKLSAgLy8gRGV0ZXJtaW5lcyB3aGVyZSB0aGUgYXR0cmlidXRlIHNob3VsZCBiZSBpbnNlcnRlZCBiYXNlZCBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGF0dHJpYnV0ZS4gIElmIG5vCi0gIC8vIGF0dHJpYnV0ZSBpcyBzZWxlY3RlZCwgdXNlIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBhcHBlbmRpbmcgdGhlIGF0dHJpYnV0ZSB0byB0aGUgZW5kCi0gIHByaXZhdGUgU3RyaW5nIGFkZEF0dHJpYnV0ZUxvY2F0aW9uOyAgCi0gIAotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgfQotICAKLSAgcHVibGljIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgfQotICAKLSAgcHVibGljIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCwgU3RyaW5nIGFkZEF0dHJpYnV0ZUxvY2F0aW9uLCBpbnQgaW5kZXgpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLnhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHBhcmVudDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIH0KLSAgICB0aGlzLmFkZEF0dHJpYnV0ZUxvY2F0aW9uID0gYWRkQXR0cmlidXRlTG9jYXRpb247Ci0gICAgdGhpcy5pbmRleCA9IGluZGV4OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgaW50IGdldEluc2VydGlvbkluZGV4KCkKLSAgewotICAgIGlmIChpbmRleCA8IDApCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAoYWRkQXR0cmlidXRlTG9jYXRpb24uZXF1YWxzKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uQkVGT1JFX1NFTEVDVEVEX0lEKSkKLSAgICB7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKGFkZEF0dHJpYnV0ZUxvY2F0aW9uLmVxdWFscyhvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLkFGVEVSX1NFTEVDVEVEX0lEKSkKLSAgICB7Ci0gICAgICBpbmRleCsrOwotICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGlmICghaXNSZWZlcmVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyaWJ1dGUuc2V0TmFtZShnZXROZXdOYW1lKG5hbWVUb0FkZCA9PSBudWxsID8gIk5ld0F0dHJpYnV0ZSIgOiBuYW1lVG9BZGQpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGF0dHJpYnV0ZS5zZXRUeXBlRGVmaW5pdGlvbih4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJzdHJpbmciKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyaWJ1dGUuc2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbihzZXRHbG9iYWxBdHRyaWJ1dGVSZWZlcmVuY2UoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldFNjaGVtYSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJpYnV0ZVVzZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREF0dHJpYnV0ZVVzZSgpOwotICAgICAgICBhdHRyaWJ1dGVVc2Uuc2V0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cmlidXRlKTsKLSAgICAgICAgYXR0cmlidXRlVXNlLnNldENvbnRlbnQoYXR0cmlidXRlKTsKLQotICAgICAgICBpZiAoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGluZGV4ID0gZ2V0SW5zZXJ0aW9uSW5kZXgoKTsKLSAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVDb250ZW50cygpLnNpemUoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QXR0cmlidXRlQ29udGVudHMoKS5hZGQoaW5kZXgsIGF0dHJpYnV0ZVVzZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QXR0cmlidXRlQ29udGVudHMoKS5hZGQoYXR0cmlidXRlVXNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9ybWF0Q2hpbGQoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gKFhTRFNjaGVtYSkgcGFyZW50OwotICAgICAgICAgIGF0dHJpYnV0ZSA9IGNyZWF0ZUdsb2JhbFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKHhzZFNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1JlZmVyZW5jZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGUuc2V0VHlwZURlZmluaXRpb24ocGFyZW50LmdldFNjaGVtYSgpLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigic3RyaW5nIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSAoKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgcGFyZW50KS5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpLmdldEF0dHJpYnV0ZVVzZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgdXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgIGxpc3QuYWRkKHVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoIk5ld0F0dHJpYnV0ZSIsIGxpc3QpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgYXR0cmlidXRlLnNldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oc2V0R2xvYmFsQXR0cmlidXRlUmVmZXJlbmNlKHBhcmVudC5nZXRTY2hlbWEoKSkpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RBdHRyaWJ1dGVVc2UoKTsKLSAgICAgICAgICBhdHRyaWJ1dGVVc2Uuc2V0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cmlidXRlKTsKLSAgICAgICAgICBhdHRyaWJ1dGVVc2Uuc2V0Q29udGVudChhdHRyaWJ1dGUpOwotCi0gICAgICAgICAgaW5kZXggPSBnZXRJbnNlcnRpb25JbmRleCgpOwotICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgKCgoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBwYXJlbnQpLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkuZ2V0Q29udGVudHMoKS5zaXplKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBwYXJlbnQpLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXgsIGF0dHJpYnV0ZVVzZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAoKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgcGFyZW50KS5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpLmdldENvbnRlbnRzKCkuYWRkKGF0dHJpYnV0ZVVzZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZvcm1hdENoaWxkKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGF0dHJpYnV0ZTsKLSAgfQotCi0gIEFycmF5TGlzdCBuYW1lczsKLQotICBwdWJsaWMgdm9pZCBzZXROYW1lVG9BZGQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBuYW1lVG9BZGQgPSBuYW1lOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdOYW1lKFN0cmluZyBkZXNjcmlwdGlvbikKLSAgewotICAgIEFycmF5TGlzdCB1c2VkQXR0cmlidXRlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdXNlZEF0dHJpYnV0ZU5hbWVzLmFkZEFsbChYU0RDb21tb25VSVV0aWxzLmdldEFsbEF0dHJpYnV0ZXMoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKSk7Ci0gICAgdXNlZEF0dHJpYnV0ZU5hbWVzLmFkZEFsbChYU0RDb21tb25VSVV0aWxzLmdldEluaGVyaXRlZEF0dHJpYnV0ZXMoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKSk7Ci0gICAgcmV0dXJuIFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoZGVzY3JpcHRpb24sIHVzZWRBdHRyaWJ1dGVOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlKGJvb2xlYW4gaXNSZWZlcmVuY2UpCi0gIHsKLSAgICB0aGlzLmlzUmVmZXJlbmNlID0gaXNSZWZlcmVuY2U7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBjcmVhdGVHbG9iYWxYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgZW5zdXJlU2NoZW1hRWxlbWVudCh4c2RTY2hlbWEpOwotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgYXR0cmlidXRlLnNldFR5cGVEZWZpbml0aW9uKHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGF0dHJpYnV0ZS5zZXROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUobmFtZVRvQWRkID09IG51bGwgPyAiTmV3QXR0cmlidXRlIiA6IG5hbWVUb0FkZCwgeHNkU2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBUZXh0IHRleHROb2RlID0geHNkU2NoZW1hLmdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoYXR0cmlidXRlKTsKLSAgICByZXR1cm4gYXR0cmlidXRlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHNldEdsb2JhbEF0dHJpYnV0ZVJlZmVyZW5jZShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgTGlzdCBsaXN0ID0geHNkU2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHJlZmVyZW5jZWRBdHRyaWJ1dGUgPSBudWxsOwotICAgIGJvb2xlYW4gaXNVc2VyRGVmaW5lZCA9IGZhbHNlOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIG9iajsKLSAgICAgICAgaWYgKCFYU0RDb25zdGFudHMuU0NIRU1BX0lOU1RBTkNFX1VSSV8yMDAxLmVxdWFscyhhdHRyLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIHJlZmVyZW5jZWRBdHRyaWJ1dGUgPSBhdHRyOwotICAgICAgICAgIGlzVXNlckRlZmluZWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghaXNVc2VyRGVmaW5lZCkKLSAgICB7Ci0gICAgICByZWZlcmVuY2VkQXR0cmlidXRlID0gY3JlYXRlR2xvYmFsWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oeHNkU2NoZW1hKTsKLSAgICAgIFRleHQgdGV4dE5vZGUgPSB4c2RTY2hlbWEuZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQocmVmZXJlbmNlZEF0dHJpYnV0ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlZmVyZW5jZWRBdHRyaWJ1dGU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWU1NzVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25Db21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLQotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RDb21wbGV4VHlwZURlZmluaXRpb24gPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICh4c2RTY2hlbWEgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGF0dHJpYnV0ZUdyb3VwLnNldE5hbWUoZ2V0TmV3TmFtZSgiQXR0cmlidXRlR3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBMaXN0IGxpc3QgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0U2NoZW1hKCkuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpOwotICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgYXR0cmlidXRlR3JvdXAuc2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgbGlzdC5nZXQoMCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGF0dHJpYnV0ZUdyb3VwLnNldE5hbWUobnVsbCk7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwMiA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICAgIGF0dHJpYnV0ZUdyb3VwMi5zZXROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoIk5ld0F0dHJpYnV0ZUdyb3VwIiwgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldFNjaGVtYSgpLmdldEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldFNjaGVtYSgpLmdldENvbnRlbnRzKCkuYWRkKGF0dHJpYnV0ZUdyb3VwMik7Ci0gICAgICAgICAgYXR0cmlidXRlR3JvdXAuc2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oYXR0cmlidXRlR3JvdXAyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QXR0cmlidXRlQ29udGVudHMoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuYWRkKGF0dHJpYnV0ZUdyb3VwKTsKLSAgICAgICAgfQotICAgICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gYXR0cmlidXRlR3JvdXA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGVuc3VyZVNjaGVtYUVsZW1lbnQoeHNkU2NoZW1hKTsKLSAgICAgICAgLy8gcHV0IHRoaXMgYWZ0ZXIsIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBET00gbm9kZSB5ZXQKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGF0dHJpYnV0ZUdyb3VwLnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZSgiTmV3QXR0cmlidXRlR3JvdXAiLCB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgVGV4dCB0ZXh0Tm9kZSA9IHhzZFNjaGVtYS5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHhzZFNjaGVtYS5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoYXR0cmlidXRlR3JvdXApOwotICAgICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gYXR0cmlidXRlR3JvdXA7Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBBcnJheUxpc3QgbmFtZXM7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdOYW1lKFN0cmluZyBkZXNjcmlwdGlvbikKLSAgewotICAgIFN0cmluZyBjYW5kaWRhdGVOYW1lID0gIk5ldyIgKyBkZXNjcmlwdGlvbjsgLy8kTk9OLU5MUy0xJAotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgICBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpbnQgaSA9IDE7Ci0gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBwYXJlbnQ7Ci0gICAgICB3YWxrVXBJbmhlcml0YW5jZShjdCk7Ci0KLSAgICAgIGJvb2xlYW4gcmVhZHkgPSBmYWxzZTsKLSAgICAgIHdoaWxlICghcmVhZHkpCi0gICAgICB7Ci0gICAgICAgIHJlYWR5ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbmFtZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGNhbmRpZGF0ZU5hbWUuZXF1YWxzKGF0dHJOYW1lKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZWFkeSA9IGZhbHNlOwotICAgICAgICAgICAgY2FuZGlkYXRlTmFtZSA9ICJOZXciICsgZGVzY3JpcHRpb24gKyBTdHJpbmcudmFsdWVPZihpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaSsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY2FuZGlkYXRlTmFtZTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3YWxrVXBJbmhlcml0YW5jZShYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QpCi0gIHsKLSAgICB1cGRhdGVOYW1lcyhjdCk7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IGN0LmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgIGlmIChjdCAhPSBjdC5nZXRSb290VHlwZSgpKQotICAgIHsKLSAgICAgIGlmICh0eXBlRGVmIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QyID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdHlwZURlZjsKLSAgICAgICAgd2Fsa1VwSW5oZXJpdGFuY2UoY3QyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlTmFtZXMoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0KQotICB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IGN0LmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlVXNlIHVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpIG9iajsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IHVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKGF0dHJOYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lcy5hZGQoYXR0ck5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTYzNmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hQnVpbGRpbmdUb29sczsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQ7Ci0gIHByb3RlY3RlZCBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3JlYXRlZENvbXBsZXhUeXBlOwotICBwcml2YXRlIFN0cmluZyBuYW1lVG9BZGQ7Ci0gIAotICBwdWJsaWMgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZVRvQWRkKFN0cmluZyBuYW1lVG9BZGQpCi0gIHsKLSAgICB0aGlzLm5hbWVUb0FkZCA9IG5hbWVUb0FkZDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjZXhlY3V0ZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSBmYWN0b3J5LmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotICAgICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGNvbXBsZXhUeXBlOwotICAgICAgU3RyaW5nIG5ld05hbWUgPSBnZXROZXdOYW1lKG5hbWVUb0FkZCA9PSBudWxsID8gIk5ld0NvbXBsZXhUeXBlIiA6IG5hbWVUb0FkZCwgcGFyZW50LmdldFNjaGVtYSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgY29tcGxleFR5cGUuc2V0TmFtZShuZXdOYW1lKTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpIHBhcmVudDsKLSAgICAgICAgICBlbnN1cmVTY2hlbWFFbGVtZW50KHhzZFNjaGVtYSk7Ci0gICAgICAgICAgVGV4dCB0ZXh0Tm9kZSA9IHhzZFNjaGVtYS5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICAgICAgeHNkU2NoZW1hLmdldENvbnRlbnRzKCkuYWRkKGNvbXBsZXhUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBwYXJlbnQpLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKGNvbXBsZXhUeXBlKTsKLSAgICAgICAgZm9ybWF0Q2hpbGQocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgICBjcmVhdGVkQ29tcGxleFR5cGUgPSBjb21wbGV4VHlwZTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3TmFtZShTdHJpbmcgZGVzY3JpcHRpb24sIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBTdHJpbmcgY2FuZGlkYXRlTmFtZSA9IGRlc2NyaXB0aW9uOyAvLyROT04tTkxTLTEkCi0gICAgaW50IGkgPSAxOwotCi0gICAgTGlzdCBsaXN0ID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpOwotICAgIExpc3QgbGlzdE9mTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IChYU0RUeXBlRGVmaW5pdGlvbikgaXRlci5uZXh0KCk7Ci0gICAgICBTdHJpbmcgbmFtZSA9IHR5cGVEZWYuZ2V0TmFtZSgpOwotICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAodHlwZURlZi5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpCi0gICAgICAgIGxpc3RPZk5hbWVzLmFkZChuYW1lKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGZsYWcgPSB0cnVlOwotICAgIHdoaWxlIChmbGFnKQotICAgIHsKLSAgICAgIGlmICghbGlzdE9mTmFtZXMuY29udGFpbnMoY2FuZGlkYXRlTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGZsYWcgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYW5kaWRhdGVOYW1lID0gZGVzY3JpcHRpb24gKyBTdHJpbmcudmFsdWVPZihpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaSsrOwotICAgIH0KLQotICAgIHJldHVybiBjYW5kaWRhdGVOYW1lOwotICB9Ci0KLSAgcHVibGljIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBnZXRDcmVhdGVkQ29tcGxleFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZWRDb21wbGV4VHlwZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNERWxlbWVudENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYmRmZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNERWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUJ1aWxkaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIEFkZFhTREVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb247Ci0gIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cDsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgYm9vbGVhbiBpc1JlZmVyZW5jZTsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZVRvQWRkOwotICAvLyBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLiAgSWYgbm8gaXRlbSBpcyBzZWxlY3RlZCwgaW5kZXggd2lsbCBiZSBsZXNzIHRoYW4gMAotICBwcml2YXRlIGludCBpbmRleCA9IC0xOyAgCi0gIC8vIERldGVybWluZXMgd2hlcmUgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGluc2VydGVkIGJhc2VkIG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudC4gIElmIG5vCi0gIC8vIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHVzZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YgYXBwZW5kaW5nIHRoZSBlbGVtZW50IHRvIHRoZSBlbmQKLSAgcHJpdmF0ZSBTdHJpbmcgYWRkRWxlbWVudExvY2F0aW9uOyAKLSAgCi0gIHB1YmxpYyBBZGRYU0RFbGVtZW50Q29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIEFkZFhTREVsZW1lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgICB4c2RNb2RlbEdyb3VwID0gZ2V0TW9kZWxHcm91cCh4c2RDb21wbGV4VHlwZURlZmluaXRpb24pOwotICB9Ci0KLSAgcHVibGljIEFkZFhTREVsZW1lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb24pCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RNb2RlbEdyb3VwRGVmaW5pdGlvbiA9IHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uOwotICAgIHhzZE1vZGVsR3JvdXAgPSBnZXRNb2RlbEdyb3VwKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKTsKLSAgfQotICAKLSAgcHVibGljIEFkZFhTREVsZW1lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwLCBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkTW9kZWxHcm91cCA9IHhzZE1vZGVsR3JvdXA7Ci0gICAgdGhpcy54c2RDb21wbGV4VHlwZURlZmluaXRpb24gPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgQWRkWFNERWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXApCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RNb2RlbEdyb3VwID0geHNkTW9kZWxHcm91cDsKLSAgfQotICAKLSAgcHVibGljIEFkZFhTREVsZW1lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwLCBTdHJpbmcgSUQsIGludCBpbmRleCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZE1vZGVsR3JvdXAgPSB4c2RNb2RlbEdyb3VwOwotICAgIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgICB0aGlzLmFkZEVsZW1lbnRMb2NhdGlvbiA9IElEOwotICB9Ci0KLSAgcHVibGljIEFkZFhTREVsZW1lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZShib29sZWFuIGlzUmVmZXJlbmNlKQotICB7Ci0gICAgdGhpcy5pc1JlZmVyZW5jZSA9IGlzUmVmZXJlbmNlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROYW1lVG9BZGQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBuYW1lVG9BZGQgPSBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRBZGRFbGVtZW50TG9jYXRpb24oU3RyaW5nIExvY2F0aW9uVHlwZSkKLSAgewotICAgIGFkZEVsZW1lbnRMb2NhdGlvbiA9IExvY2F0aW9uVHlwZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGludCBnZXRJbnNlcnRpb25JbmRleCgpCi0gIHsKLSAgICBpZiAoaW5kZXggPCAwKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgaWYgKGFkZEVsZW1lbnRMb2NhdGlvbi5lcXVhbHMob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uLkJFRk9SRV9TRUxFQ1RFRF9JRCkpCi0gICAgewotICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLSAgICBlbHNlIGlmIChhZGRFbGVtZW50TG9jYXRpb24uZXF1YWxzKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbi5BRlRFUl9TRUxFQ1RFRF9JRCkpCi0gICAgewotICAgICAgaW5kZXgrKzsKLSAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjZXhlY3V0ZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gY3JlYXRlR2xvYmFsWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICAgIFRleHQgdGV4dE5vZGUgPSB4c2RTY2hlbWEuZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICAgICAgeHNkU2NoZW1hLmdldENvbnRlbnRzKCkuYWRkKGVsZW1lbnQpOwotICAgICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gZWxlbWVudDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGlmICh4c2RNb2RlbEdyb3VwID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RTY2hlbWFCdWlsZGluZ1Rvb2xzLmdldFhTREZhY3RvcnkoKTsKLSAgICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IGZhY3RvcnkuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwID0gZmFjdG9yeS5jcmVhdGVYU0RNb2RlbEdyb3VwKCk7Ci0gICAgICAgICAgeHNkTW9kZWxHcm91cC5zZXRDb21wb3NpdG9yKFhTRENvbXBvc2l0b3IuU0VRVUVOQ0VfTElURVJBTCk7Ci0gICAgICAgICAgcGFydGljbGUuc2V0Q29udGVudCh4c2RNb2RlbEdyb3VwKTsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5zZXRNb2RlbEdyb3VwKHhzZE1vZGVsR3JvdXApOwotICAgICAgICB9Ci0gICAgICAgIHhzZFNjaGVtYSA9IHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFNjaGVtYSgpOwotICAgICAgICBpZiAoIWlzUmVmZXJlbmNlKQotICAgICAgICB7Ci0gICAgICAgICAgeHNkTW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZChjcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb25Gb3JNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgeHNkTW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZChjcmVhdGVYU0RFbGVtZW50UmVmZXJlbmNlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvcm1hdENoaWxkKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh4c2RNb2RlbEdyb3VwICE9IG51bGwgJiYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9PSBudWxsIHx8IHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uID09IG51bGwpICkKLSAgICAgIHsKLSAgICAgICAgeHNkU2NoZW1hID0geHNkTW9kZWxHcm91cC5nZXRTY2hlbWEoKTsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGlmICghaXNSZWZlcmVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgCWluZGV4ID0gZ2V0SW5zZXJ0aW9uSW5kZXgoKTsKLSAgICAgICAgCWlmKGluZGV4ID49IDAgJiYgaW5kZXggPCB4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuc2l6ZSgpKQotICAgICAgICAJeyAgICAgICAgCQkKLSAgICAgICAgCQl4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGluZGV4LGNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICAgICAgCX0KLSAgICAgICAgCWVsc2UKLSAgICAgICAgCXsKLSAgICAgICAgCQl4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGNyZWF0ZVhTREVsZW1lbnRSZWZlcmVuY2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9ybWF0Q2hpbGQoeHNkTW9kZWxHcm91cC5nZXRFbGVtZW50KCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB4c2RTY2hlbWEgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKHhzZFNjaGVtYS5nZXRFbGVtZW50KCkpOwotICAgICAgICBpZiAoeHNkTW9kZWxHcm91cCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBmYWN0b3J5LmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgICAgICAgeHNkTW9kZWxHcm91cCA9IGZhY3RvcnkuY3JlYXRlWFNETW9kZWxHcm91cCgpOwotICAgICAgICAgIHhzZE1vZGVsR3JvdXAuc2V0Q29tcG9zaXRvcihYU0RDb21wb3NpdG9yLlNFUVVFTkNFX0xJVEVSQUwpOwotICAgICAgICAgIHBhcnRpY2xlLnNldENvbnRlbnQoeHNkTW9kZWxHcm91cCk7Ci0gICAgICAgICAgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLnNldENvbnRlbnQocGFydGljbGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaXNSZWZlcmVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbkZvckNvbXBsZXhUeXBlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoY3JlYXRlWFNERWxlbWVudFJlZmVyZW5jZSgpKTsKLSAgICAgICAgfQotICAgICAgICBmb3JtYXRDaGlsZCh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTRFBhcnRpY2xlIGNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbigpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlID0geHNkTW9kZWxHcm91cC5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCA9IHhzZE1vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCk7Ci0gICAgQXJyYXlMaXN0IHVzZWRBdHRyaWJ1dGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBYU0RDb21tb25VSVV0aWxzLnJlc2V0VmlzaXRlZEdyb3Vwc1N0YWNrKCk7Ci0gICAgdXNlZEF0dHJpYnV0ZU5hbWVzLmFkZEFsbChYU0RDb21tb25VSVV0aWxzLmdldENoaWxkRWxlbWVudHMoeHNkTW9kZWxHcm91cCkpOyAgICAKLSAgICB3aGlsZSAoY29tcCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHVzZWRBdHRyaWJ1dGVOYW1lcy5hZGRBbGwoWFNEQ29tbW9uVUlVdGlscy5nZXRBbGxBdHRyaWJ1dGVzKChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiljb21wKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgdXNlZEF0dHJpYnV0ZU5hbWVzLmFkZEFsbChYU0RDb21tb25VSVV0aWxzLmdldEFsbEF0dHJpYnV0ZXMoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiljb21wKSk7Ci0gICAgICAgIHVzZWRBdHRyaWJ1dGVOYW1lcy5hZGRBbGwoWFNEQ29tbW9uVUlVdGlscy5nZXRJbmhlcml0ZWRBdHRyaWJ1dGVzKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pY29tcCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNvbXAgPSBjb21wLmdldENvbnRhaW5lcigpOwotICAgIH0KLSAgICBlbGVtZW50LnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZSgKLSAgICAJCW5hbWVUb0FkZCA9PSBudWxsID8gIk5ld0VsZW1lbnQiIDogbmFtZVRvQWRkICwgdXNlZEF0dHJpYnV0ZU5hbWVzKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBlbGVtZW50LnNldFR5cGVEZWZpbml0aW9uKHR5cGUpOwotCi0gICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgIHBhcnRpY2xlLnNldENvbnRlbnQoZWxlbWVudCk7Ci0gICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGVsZW1lbnQ7Ci0gICAgcmV0dXJuIHBhcnRpY2xlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRFBhcnRpY2xlIGNyZWF0ZVhTREVsZW1lbnRSZWZlcmVuY2UoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0geHNkTW9kZWxHcm91cC5nZXRTY2hlbWEoKS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCk7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlZmVyZW5jZWRFbGVtZW50ID0gbnVsbDsKLSAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIHJlZmVyZW5jZWRFbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilsaXN0LmdldCgwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlZmVyZW5jZWRFbGVtZW50ID0gY3JlYXRlR2xvYmFsWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICBUZXh0IHRleHROb2RlID0geHNkU2NoZW1hLmdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHhzZFNjaGVtYS5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgICAgeHNkU2NoZW1hLmdldENvbnRlbnRzKCkuYWRkKHJlZmVyZW5jZWRFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgIAotICAgIGVsZW1lbnQuc2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24ocmVmZXJlbmNlZEVsZW1lbnQpOwotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAgICBwYXJ0aWNsZS5zZXRDb250ZW50KGVsZW1lbnQpOwotICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBlbGVtZW50OwotICAgIHJldHVybiBwYXJ0aWNsZTsKLSAgfQotCi0gIHByb3RlY3RlZCBYU0RQYXJ0aWNsZSBjcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb25Gb3JDb21wbGV4VHlwZSgpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlID0geHNkTW9kZWxHcm91cC5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotCi0gICAgQXJyYXlMaXN0IHVzZWRBdHRyaWJ1dGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB1c2VkQXR0cmlidXRlTmFtZXMuYWRkQWxsKFhTRENvbW1vblVJVXRpbHMuZ2V0QWxsQXR0cmlidXRlcyh4c2RDb21wbGV4VHlwZURlZmluaXRpb24pKTsKLSAgICB1c2VkQXR0cmlidXRlTmFtZXMuYWRkQWxsKFhTRENvbW1vblVJVXRpbHMuZ2V0SW5oZXJpdGVkQXR0cmlidXRlcyh4c2RDb21wbGV4VHlwZURlZmluaXRpb24pKTsKLSAgICBlbGVtZW50LnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZSgKLSAgICAJCW5hbWVUb0FkZCA9PSBudWxsID8gIk5ld0VsZW1lbnQiIDogbmFtZVRvQWRkICwgdXNlZEF0dHJpYnV0ZU5hbWVzKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBlbGVtZW50LnNldFR5cGVEZWZpbml0aW9uKHR5cGUpOwotCi0gICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgIHBhcnRpY2xlLnNldENvbnRlbnQoZWxlbWVudCk7Ci0gICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGVsZW1lbnQ7Ci0gICAgcmV0dXJuIHBhcnRpY2xlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNEUGFydGljbGUgY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uRm9yTW9kZWxHcm91cERlZmluaXRpb25zKCkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUgPSB4c2RNb2RlbEdyb3VwLmdldFNjaGVtYSgpLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigic3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgICBBcnJheUxpc3QgdXNlZEF0dHJpYnV0ZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHVzZWRBdHRyaWJ1dGVOYW1lcy5hZGRBbGwoWFNEQ29tbW9uVUlVdGlscy5nZXRBbGxBdHRyaWJ1dGVzKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKSk7Ci0gICAgZWxlbWVudC5zZXROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoCi0gICAgICAgIG5hbWVUb0FkZCA9PSBudWxsID8gIk5ld0VsZW1lbnQiIDogbmFtZVRvQWRkICwgdXNlZEF0dHJpYnV0ZU5hbWVzKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBlbGVtZW50LnNldFR5cGVEZWZpbml0aW9uKHR5cGUpOwotCi0gICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgIHBhcnRpY2xlLnNldENvbnRlbnQoZWxlbWVudCk7Ci0gICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGVsZW1lbnQ7Ci0gICAgcmV0dXJuIHBhcnRpY2xlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVHbG9iYWxYU0RFbGVtZW50RGVjbGFyYXRpb24oKQotICB7Ci0gICAgZW5zdXJlU2NoZW1hRWxlbWVudCh4c2RTY2hlbWEpOwotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUgPSB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJzdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLQotICAgIGVsZW1lbnQuc2V0TmFtZShYU0RDb21tb25VSVV0aWxzLmNyZWF0ZVVuaXF1ZUVsZW1lbnROYW1lKAotICAgIAkJbmFtZVRvQWRkID09IG51bGwgPyAiTmV3RWxlbWVudCIgOiBuYW1lVG9BZGQgLCB4c2RTY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBlbGVtZW50LnNldFR5cGVEZWZpbml0aW9uKHR5cGUpOwotCi0gICAgcmV0dXJuIGVsZW1lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RNb2RlbEdyb3VwIGdldE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZikKLSAgewotICAgIHJldHVybiBtb2RlbEdyb3VwRGVmLmdldE1vZGVsR3JvdXAoKTsKLSAgfQotCi0gIC8vUE9SVAotICBwdWJsaWMgWFNETW9kZWxHcm91cCBnZXRNb2RlbEdyb3VwKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjVHlwZSkKLSAgewotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gbnVsbDsKLQotICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCB4c2RDb21wbGV4VHlwZUNvbnRlbnQgPSBjVHlwZS5nZXRDb250ZW50KCk7Ci0gICAgaWYgKHhzZENvbXBsZXhUeXBlQ29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgIHsKLSAgICAgIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKXhzZENvbXBsZXhUeXBlQ29udGVudDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHBhcnRpY2xlID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIE9iamVjdCBwYXJ0aWNsZUNvbnRlbnQgPSBwYXJ0aWNsZS5nZXRDb250ZW50KCk7Ci0gICAgWFNETW9kZWxHcm91cCBncm91cCA9IG51bGw7Ci0KLSAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgZ3JvdXAgPSAoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBwYXJ0aWNsZUNvbnRlbnQpLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRNb2RlbEdyb3VwKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgZ3JvdXAgPSAoWFNETW9kZWxHcm91cCkgcGFydGljbGVDb250ZW50OwotICAgIH0KLQotICAgIGlmIChncm91cCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotLy8gICAgaWYgKGdyb3VwLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpIHx8IGdyb3VwLmVSZXNvdXJjZSgpICE9IGNUeXBlLmVSZXNvdXJjZSgpKQotLy8gICAgewotLy8gICAgICBpZiAoY1R5cGUuZ2V0QmFzZVR5cGUoKSAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGNvbnRlbnQgPSBjVHlwZS5nZXRDb250ZW50KCk7Ci0vLyAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBncm91cCA9IChYU0RNb2RlbEdyb3VwKSAoKFhTRFBhcnRpY2xlKSBjb250ZW50KS5nZXRDb250ZW50KCk7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0KLSAgICByZXR1cm4gZ3JvdXA7Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRBZGRlZENvbXBvbmVudCgpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RJbXBvcnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RJbXBvcnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MWY4NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNESW1wb3J0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNESW1wb3J0Q29tbWFuZCBleHRlbmRzIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUNvbW1hbmQKLXsKLSAgcHVibGljIEFkZFhTREltcG9ydENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkU2NoZW1hID0gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgICAvLyBBZGQgdGhpcyBhZnRlciBpZiB3ZSBkb24ndCBoYXZlIGEgRE9NIE5vZGUgeWV0Ci0gICAgICBiZWdpblJlY29yZGluZyh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTREltcG9ydCB4c2RJbXBvcnQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RJbXBvcnQoKTsKLSAgICAgIHhzZFNjaGVtYS5nZXRDb250ZW50cygpLmFkZChmaW5kTmV4dFBvc2l0aW9uVG9JbnNlcnQoKSwgeHNkSW1wb3J0KTsKLSAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSB4c2RJbXBvcnQ7Ci0gICAgICBmb3JtYXRDaGlsZCh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNESW5jbHVkZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREluY2x1ZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWIzMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNESW5jbHVkZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RJbmNsdWRlQ29tbWFuZCBleHRlbmRzIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUNvbW1hbmQKLXsKLSAgcHVibGljIEFkZFhTREluY2x1ZGVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgICAgLy8gQWRkIHRoaXMgYWZ0ZXIgaWYgd2UgZG9uJ3QgaGF2ZSBhIERPTSBOb2RlIHlldAotICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RJbmNsdWRlIHhzZEluY2x1ZGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RJbmNsdWRlKCk7Ci0gICAgICB4c2RJbmNsdWRlLnNldFNjaGVtYUxvY2F0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgeHNkU2NoZW1hLmdldENvbnRlbnRzKCkuYWRkKGZpbmROZXh0UG9zaXRpb25Ub0luc2VydCgpLCB4c2RJbmNsdWRlKTsKLSAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSB4c2RJbmNsdWRlOwotICAgICAgZm9ybWF0Q2hpbGQoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRE1vZGVsR3JvdXBDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RNb2RlbEdyb3VwQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDE0YjI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRE1vZGVsR3JvdXBDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFCdWlsZGluZ1Rvb2xzOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNETW9kZWxHcm91cENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQ7Ci0gIFhTRENvbXBvc2l0b3IgeHNkQ29tcG9zaXRvcjsKLSAgWFNETW9kZWxHcm91cCBuZXdNb2RlbEdyb3VwOwotCi0gIHB1YmxpYyBBZGRYU0RNb2RlbEdyb3VwQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCwgWFNEQ29tcG9zaXRvciB4c2RDb21wb3NpdG9yKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIHRoaXMueHNkQ29tcG9zaXRvciA9IHhzZENvbXBvc2l0b3I7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgb3duZXIgPSBnZXRPd25lcigpOwotICAgICAgaWYgKG93bmVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAgICAgICAgbmV3TW9kZWxHcm91cCA9IGNyZWF0ZU1vZGVsR3JvdXAoKTsKLSAgICAgICAgcGFydGljbGUuc2V0Q29udGVudChuZXdNb2RlbEdyb3VwKTsKLQotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3RkID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgb3duZXI7Ci0gICAgICAgIGN0ZC5zZXRDb250ZW50KHBhcnRpY2xlKTsKLSAgICAgIH0KLSAgICAgIGZvcm1hdENoaWxkKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICAgIHN1cGVyLnVuZG8oKTsKLSAgICAKLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsID0gKFhTRE1vZGVsR3JvdXApIHBhcmVudDsKLSAgICAgIG1vZGVsLmdldENvbnRlbnRzKCkucmVtb3ZlKG5ld01vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRPd25lcigpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBvd25lciA9IG51bGw7Ci0gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcmVudDsgICAgICAKLSAgICAgIGlmIChlZC5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpIAotICAgICAgewotICAgICAgICBpZiAoZWQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZWQuc2V0VHlwZURlZmluaXRpb24obnVsbCk7Ci0gICAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHRkID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgZWQuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24odGQpOwotICAgICAgICAgIG93bmVyID0gZWQuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdGQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICBlZC5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbih0ZCk7Ci0gICAgICAgICAgb3duZXIgPSB0ZDsgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAKLSAgICAgIGVsc2UgaWYgKGVkLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHRkID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIGVkLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKHRkKTsKLSAgICAgICAgb3duZXIgPSB0ZDsgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgb3duZXIgPSBlZC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdGQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgZWQuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24odGQpOwotICAgICAgICBvd25lciA9IHRkOyAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgbmV3TW9kZWxHcm91cCA9IGNyZWF0ZU1vZGVsR3JvdXAoKTsKLSAgICAgICgoWFNETW9kZWxHcm91cCkgcGFyZW50KS5nZXRDb250ZW50cygpLmFkZChuZXdNb2RlbEdyb3VwLmdldENvbnRhaW5lcigpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pcGFyZW50OwotICAgICAgb3duZXIgPSBwYXJlbnQ7Ci0gICAgICBpZiAoY3QuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKWN0LmdldENvbnRlbnQoKTsKLSAgICAgICAgaWYgKHBhcnRpY2xlLmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICAgIHsKLSAgICAgICAgICBvd25lciA9IG51bGw7Ci0gICAgICAgICAgbmV3TW9kZWxHcm91cCA9IGNyZWF0ZU1vZGVsR3JvdXAoKTsKLSAgICAgICAgICBYU0RNb2RlbEdyb3VwIG5ld1BhcmVudCA9IChYU0RNb2RlbEdyb3VwKXBhcnRpY2xlLmdldENvbnRlbnQoKTsKLSAgICAgICAgICBuZXdQYXJlbnQuZ2V0Q29udGVudHMoKS5hZGQobmV3TW9kZWxHcm91cC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWZpbml0aW9uID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKXBhcmVudDsKLSAgICAgIG93bmVyID0gbnVsbDsKLSAgICAgIG5ld01vZGVsR3JvdXAgPSBjcmVhdGVNb2RlbEdyb3VwKCk7Ci0gICAgICBpZiAobW9kZWxHcm91cERlZmluaXRpb24uZ2V0TW9kZWxHcm91cCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTRE1vZGVsR3JvdXAgbmV3UGFyZW50ID0gbW9kZWxHcm91cERlZmluaXRpb24uZ2V0TW9kZWxHcm91cCgpOwotICAgICAgICBuZXdQYXJlbnQuZ2V0Q29udGVudHMoKS5hZGQobmV3TW9kZWxHcm91cC5nZXRDb250YWluZXIoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG1vZGVsR3JvdXBEZWZpbml0aW9uLnNldE1vZGVsR3JvdXAobmV3TW9kZWxHcm91cCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvd25lcjsKLSAgfQotICAKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBhZG9wdChYU0RDb25jcmV0ZUNvbXBvbmVudCBtb2RlbCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTRE1vZGVsR3JvdXAgY3JlYXRlTW9kZWxHcm91cCgpCi0gIHsKLSAgICAKLSAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RTY2hlbWFCdWlsZGluZ1Rvb2xzLmdldFhTREZhY3RvcnkoKTsKLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IGZhY3RvcnkuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSBmYWN0b3J5LmNyZWF0ZVhTRE1vZGVsR3JvdXAoKTsKLSAgICBtb2RlbEdyb3VwLnNldENvbXBvc2l0b3IoeHNkQ29tcG9zaXRvcik7Ci0gICAgcGFydGljbGUuc2V0Q29udGVudChtb2RlbEdyb3VwKTsKLSAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gbW9kZWxHcm91cDsKLSAgICByZXR1cm4gbW9kZWxHcm91cDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3ODJkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUJ1aWxkaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgYm9vbGVhbiBpc1JlZmVyZW5jZTsKLQotICBwdWJsaWMgQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50LCBib29sZWFuIGlzUmVmZXJlbmNlKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIHRoaXMuaXNSZWZlcmVuY2UgPSBpc1JlZmVyZW5jZTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjZXhlY3V0ZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgewotICAgICAgZW5zdXJlU2NoZW1hRWxlbWVudCgoWFNEU2NoZW1hKXBhcmVudCk7Ci0gICAgfQotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgaWYgKCFpc1JlZmVyZW5jZSkKLSAgICAgIHsKLSAgICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZGVmID0gY3JlYXRlWFNETW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICAgICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGRlZjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGRlZiA9IGZhY3RvcnkuY3JlYXRlWFNETW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgICAgICBwYXJ0aWNsZS5zZXRDb250ZW50KGRlZik7Ci0gICAgICAgIExpc3QgbGlzdCA9IHBhcmVudC5nZXRTY2hlbWEoKS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKTsKLSAgICAgICAgaW50IGxlbmd0aCA9IGxpc3Quc2l6ZSgpOwotICAgICAgICBpZiAobGVuZ3RoID4gMSkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZ3IgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGdyLmdldE1vZGVsR3JvdXAoKSAhPSBwYXJlbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRlZi5zZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKGdyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobGVuZ3RoIDw9IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBuZXdHcm91cERlZiA9IGNyZWF0ZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgZGVmLnNldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24obmV3R3JvdXBEZWYpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICAgIHsKLSAgICAgICAgICAoKFhTRE1vZGVsR3JvdXApIHBhcmVudCkuZ2V0Q29udGVudHMoKS5hZGQocGFydGljbGUpOwotICAgICAgICB9Ci0gICAgICAgIGZvcm1hdENoaWxkKGRlZi5nZXRFbGVtZW50KCkpOwotICAgICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gZGVmOwotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGNyZWF0ZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkKLSAgewotICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGRlZiA9IGZhY3RvcnkuY3JlYXRlWFNETW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICBMaXN0IGxpc3QgPSBwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0TW9kZWxHcm91cERlZmluaXRpb25zKCk7Ci0gICAgU3RyaW5nIG5ld05hbWUgPSBYU0RDb21tb25VSVV0aWxzLmNyZWF0ZVVuaXF1ZUVsZW1lbnROYW1lKCJOZXdHcm91cERlZmluaXRpb24iLCBsaXN0KTsgLy8kTk9OLU5MUy0xJAotICAgIGRlZi5zZXROYW1lKG5ld05hbWUpOwotCi0gICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gY3JlYXRlTW9kZWxHcm91cCgpOwotICAgIGRlZi5zZXRNb2RlbEdyb3VwKG1vZGVsR3JvdXApOwotICAgIFRleHQgdGV4dE5vZGUgPSBwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgIHBhcmVudC5nZXRTY2hlbWEoKS5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgIHBhcmVudC5nZXRTY2hlbWEoKS5nZXRDb250ZW50cygpLmFkZChkZWYpOwotICAgIGZvcm1hdENoaWxkKGRlZi5nZXRFbGVtZW50KCkpOwotICAgIHJldHVybiBkZWY7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNETW9kZWxHcm91cCBjcmVhdGVNb2RlbEdyb3VwKCkKLSAgewotICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gZmFjdG9yeS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IGZhY3RvcnkuY3JlYXRlWFNETW9kZWxHcm91cCgpOwotICAgIG1vZGVsR3JvdXAuc2V0Q29tcG9zaXRvcihYU0RDb21wb3NpdG9yLlNFUVVFTkNFX0xJVEVSQUwpOwotICAgIHBhcnRpY2xlLnNldENvbnRlbnQobW9kZWxHcm91cCk7Ci0KLSAgICByZXR1cm4gbW9kZWxHcm91cDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RSZWRlZmluZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRFJlZGVmaW5lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmZkMzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRFJlZGVmaW5lQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RSZWRlZmluZUNvbW1hbmQgZXh0ZW5kcyBBZGRYU0RTY2hlbWFEaXJlY3RpdmVDb21tYW5kCi17Ci0gIHB1YmxpYyBBZGRYU0RSZWRlZmluZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkU2NoZW1hID0gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gQWRkIHRoaXMgYWZ0ZXIgaWYgd2UgZG9uJ3QgaGF2ZSBhIERPTSBOb2RlIHlldAotICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RSZWRlZmluZSB4c2RSZWRlZmluZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFJlZGVmaW5lKCk7Ci0gICAgICB4c2RSZWRlZmluZS5zZXRTY2hlbWFMb2NhdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHhzZFNjaGVtYS5nZXRDb250ZW50cygpLmFkZChmaW5kTmV4dFBvc2l0aW9uVG9JbnNlcnQoKSwgeHNkUmVkZWZpbmUpOwotICAgICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IHhzZFJlZGVmaW5lOwotICAgICAgZm9ybWF0Q2hpbGQoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RTY2hlbWFEaXJlY3RpdmVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RTY2hlbWFEaXJlY3RpdmVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjkwMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEU2NoZW1hRGlyZWN0aXZlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgCi0gIHB1YmxpYyBBZGRYU0RTY2hlbWFEaXJlY3RpdmVDb21tYW5kKFN0cmluZyBsYWJlbCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gICAgc3VwZXIudW5kbygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWRvcHQoWFNEQ29uY3JldGVDb21wb25lbnQgbW9kZWwpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBpbnQgZmluZE5leHRQb3NpdGlvblRvSW5zZXJ0KCkKLSAgewotICAgIGludCBpbmRleCA9IDA7Ci0gICAgZm9yIChJdGVyYXRvciBpID0geHNkU2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICB7Ci0gICAgICAgIGluZGV4ICsrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBlbnN1cmVTY2hlbWFFbGVtZW50KHhzZFNjaGVtYSk7Ci0gfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhYmJlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQ7Ci0gIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGNyZWF0ZWRTaW1wbGVUeXBlOwotICBwcml2YXRlIFN0cmluZyBuYW1lVG9BZGQ7Ci0gIAotICBwdWJsaWMgQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZVRvQWRkKFN0cmluZyBuYW1lVG9BZGQpCi0gIHsKLSAgICB0aGlzLm5hbWVUb0FkZCA9IG5hbWVUb0FkZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIGVuc3VyZVNjaGVtYUVsZW1lbnQoKFhTRFNjaGVtYSlwYXJlbnQpOwotICAgIH0KLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotICAgICAgdHlwZURlZi5zZXRCYXNlVHlwZURlZmluaXRpb24ocGFyZW50LmdldFNjaGVtYSgpLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJzdHJpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgdHlwZURlZi5zZXROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUobmFtZVRvQWRkID09IG51bGwgPyAiTmV3U2ltcGxlVHlwZSIgOiBuYW1lVG9BZGQsICgoWFNEU2NoZW1hKSBwYXJlbnQpLmdldFR5cGVEZWZpbml0aW9ucygpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY3JlYXRlZFNpbXBsZVR5cGUgPSB0eXBlRGVmOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKSBwYXJlbnQ7Ci0gICAgICAgICAgVGV4dCB0ZXh0Tm9kZSA9IHhzZFNjaGVtYS5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICAgICAgeHNkU2NoZW1hLmdldENvbnRlbnRzKCkuYWRkKHR5cGVEZWYpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudCkuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24odHlwZURlZik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgcGFyZW50KS5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbih0eXBlRGVmKTsKLSAgICAgIH0KLSAgICAgIGZvcm1hdENoaWxkKGNyZWF0ZWRTaW1wbGVUeXBlLmdldEVsZW1lbnQoKSk7Ci0KLSAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBjcmVhdGVkU2ltcGxlVHlwZTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBnZXRDcmVhdGVkU2ltcGxlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlZFNpbXBsZVR5cGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0Jhc2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9CYXNlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmJjYTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0Jhc2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIEJhc2VDb21tYW5kIGV4dGVuZHMgQ29tbWFuZAotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MID0gInhtbCI7IC8vJE5PTi1OTFMtMSQKLQotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50OwotCi0gIHB1YmxpYyBCYXNlQ29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIEJhc2VDb21tYW5kKFN0cmluZyBsYWJlbCkKLSAgewotICAgIC8vIENvbW1hbmRzIGluaGVyaXQgdGhlaXIgbmFtZSBmcm9tIHRoZSBhc3NvY2lhdGVkIGFjdGlvbi4KLSAgICAvLyBUaGlzIGxhYmVsIHNob3dzIHVwIGluIHRoZSB1bmRvIG1lbnUgYW5kIGl0IHdvdWxkIGxvb2sgdWdseSB3aXRoIHRoZSBtbmVtb25pYyBpbiBpdC4KLSAgICAvLyBJZGVhbGx5LCB3ZSdkIGhhdmUgc2VwYXJhdGUgc3RyaW5ncy4KLQotICAgIHN1cGVyKGxhYmVsLnJlcGxhY2VGaXJzdCgiJiIsICIiKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRBZGRlZENvbXBvbmVudCgpCi0gIHsKLSAgICByZXR1cm4gYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudDsKLSAgfQotICAKLSAgSURPTU5vZGUgZG9tTm9kZTsKLSAgcHJvdGVjdGVkIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgIGRvbU5vZGUgPSAoSURPTU5vZGUpIGVsZW1lbnQ7IAotICAgICAgZG9tTm9kZS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGdldFVuZG9EZXNjcmlwdGlvbigpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGVuZFJlY29yZGluZygpCi0gIHsKLSAgICBpZiAoZG9tTm9kZSAhPSBudWxsKQotICAgICAgZG9tTm9kZS5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0gICAgcmV0dXJuIGdldExhYmVsKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBmb3JtYXRDaGlsZChFbGVtZW50IGNoaWxkKQotICB7Ci0gICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgSURPTU1vZGVsIG1vZGVsID0gKChJRE9NTm9kZSljaGlsZCkuZ2V0TW9kZWwoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLSAgICAgICAgCi0gICAgICAgIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLSAgICAgICAgZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUoY2hpbGQpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuY2hhbmdlZE1vZGVsKCk7IAotICAgICAgfQotICAgIH0KLSAgfQotIAotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZW5zdXJlU2NoZW1hRWxlbWVudChYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBzY2hlbWEuZ2V0RG9jdW1lbnQoKTsKLSAgICAKLSAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgIGlmIChzY2hlbWFFbGVtZW50ID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGdldERlZmF1bHROYW1lc3BhY2Uoc2NoZW1hKTsKLSAgICAgIHNjaGVtYS5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgIE1hcCBxTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwID0gc2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAucHV0KCJ0bnMiLCB0YXJnZXROYW1lc3BhY2UpOyAgICAgIAotICAgICAgaWYgKFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuaXNRdWFsaWZ5WE1MU2NoZW1hTGFuZ3VhZ2UoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0WE1MU2NoZW1hUHJlZml4KCk7Ci0gICAgICAgIHNjaGVtYS5zZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeChwcmVmaXgpOwotICAgICAgICBxTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwLnB1dChwcmVmaXgsIFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7ICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAucHV0KG51bGwsIFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7ICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIHNjaGVtYS51cGRhdGVFbGVtZW50KCk7Ci0gICAgICBlbnN1cmVYTUxEaXJlY3RpdmUoZG9jdW1lbnQpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgZW5zdXJlWE1MRGlyZWN0aXZlKERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgaWYgKGhhc1hNTERpcmVjdGl2ZShkb2N1bWVudCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBOb2RlIGZpcnN0Q2hpbGQgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHhtbERlY2xhcmF0aW9uID0gZ2V0WE1MRGVjbGFyYXRpb24oZG9jdW1lbnQpOwotICAgIGRvY3VtZW50Lmluc2VydEJlZm9yZSh4bWxEZWNsYXJhdGlvbiwgZmlyc3RDaGlsZCk7Ci0gICAgVGV4dCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7Ci0gICAgZG9jdW1lbnQuaW5zZXJ0QmVmb3JlKHRleHROb2RlLCBmaXJzdENoaWxkKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNYTUxEaXJlY3RpdmUoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBOb2RlIGZpcnN0Q2hpbGQgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAKLSAgICBpZiAoZmlyc3RDaGlsZCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGZpcnN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilmaXJzdENoaWxkOwotICAgIAotICAgIGlmICghWE1MLmVxdWFscyhwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uZ2V0VGFyZ2V0KCkpKSAKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc2luZ0luc3RydWN0aW9uIGdldFhNTERlY2xhcmF0aW9uKERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0gICAgU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0gICAgaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKQotICAgIHsKLSAgICAgIGNoYXJTZXQgPSAiVVRGLTgiOwotICAgIH0KLSAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24geG1sRGVjbGFyYXRpb24gPSBkb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oWE1MLCAidmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIiArIGNoYXJTZXQgKyAiXCIiKTsKLSAgICByZXR1cm4geG1sRGVjbGFyYXRpb247Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0TmFtZXNwYWNlKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRYTUxTY2hlbWFUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgIGlmICghbmFtZXNwYWNlLmVuZHNXaXRoKCIvIikpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gbmFtZXNwYWNlLmNvbmNhdCgiLyIpOwotICAgIH0KLQotICAgIG5hbWVzcGFjZSArPSBnZXRGaWxlTmFtZShzY2hlbWEpICsgIi8iOwotCi0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLQotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIFVSSSBzY2hlbWFVUkkgPSBzY2hlbWEuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0gICAgSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChzY2hlbWFVUkkudG9TdHJpbmcoKSk7Ci0gICAgcmV0dXJuIGZpbGVQYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpLnRvU3RyaW5nKCk7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9DaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYxMGQ4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9DaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTREZlYXR1cmUgcGFyZW50OwotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBhbm9ueW1vdXNTaW1wbGVUeXBlOwotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBjdXJyZW50VHlwZTsKLQotICBwdWJsaWMgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNERmVhdHVyZSBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0KLS8vICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0vLyAgICB7Ci0vLyAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcGFyZW50OwotLy8gICAgICBYU0RUeXBlRGVmaW5pdGlvbiBhVHlwZSA9IGVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotLy8KLS8vICAgICAgaWYgKGFUeXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0vLyAgICAgIHsKLS8vICAgICAgICBjdXJyZW50VHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgYVR5cGU7Ci0vLyAgICAgIH0KLS8vICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0vLyAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLS8vICAgIGFub255bW91c1NpbXBsZVR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKGN1cnJlbnRUeXBlKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLQotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudCkuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oYW5vbnltb3VzU2ltcGxlVHlwZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgcGFyZW50KS5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbihhbm9ueW1vdXNTaW1wbGVUeXBlKTsKLSAgICAgIH0KLSAgICAgIGZvcm1hdENoaWxkKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QW5vbnltb3VzU2ltcGxlVHlwZShYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBhbm9ueW1vdXNTaW1wbGVUeXBlKQotICB7Ci0gICAgdGhpcy5hbm9ueW1vdXNTaW1wbGVUeXBlID0gYW5vbnltb3VzU2ltcGxlVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBnZXRBbm9ueW1vdXNUeXBlKCkKLSAgewotICAgIGlmIChhbm9ueW1vdXNTaW1wbGVUeXBlID09IG51bGwpCi0gICAgewotICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbihjdXJyZW50VHlwZSk7Ci0gICAgfQotICAgIHJldHVybiBhbm9ueW1vdXNTaW1wbGVUeXBlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9EZWxldGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9EZWxldGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Y2M4MzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvRGVsZXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHRhcmdldDsKLQotICBwdWJsaWMgRGVsZXRlQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbmNyZXRlQ29tcG9uZW50IHRhcmdldCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgfQotICAKLSAgcHVibGljIERlbGV0ZUNvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgdGFyZ2V0KQotICB7Ci0gICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEUpOwotICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBYU0RWaXNpdG9yIHZpc2l0b3IgPSBuZXcgWFNEVmlzaXRvcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24ob3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICAgICAgewotICAgICAgICBpZiAoZWxlbWVudC5nZXRUeXBlRGVmaW5pdGlvbigpID09IHRhcmdldCkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUgPSB0YXJnZXQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJzdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGVsZW1lbnQuc2V0VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIudmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IHRhcmdldC5nZXRDb250YWluZXIoKTsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gdGFyZ2V0LmdldFNjaGVtYSgpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBib29sZWFuIGRvQ2xlYW51cCA9IGZhbHNlOwotICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXAgfHwgdGFyZ2V0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8IHRhcmdldCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBkb0NsZWFudXAgPSB0cnVlOwotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocGFyZW50LmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cCkgKChYU0RQYXJ0aWNsZSkgcGFyZW50KS5nZXRDb250YWluZXIoKTsKLQotICAgICAgICAgICAgbW9kZWxHcm91cC5nZXRDb250ZW50cygpLnJlbW92ZShwYXJlbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChwYXJlbnQuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgcGFyZW50LmdldENvbnRhaW5lcigpOwotICAgICAgICAgICAgY29tcGxleFR5cGUuc2V0Q29udGVudChudWxsKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRvci52aXNpdFNjaGVtYSh0YXJnZXQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgICgoWFNEU2NoZW1hKSBwYXJlbnQpLmdldENvbnRlbnRzKCkucmVtb3ZlKHRhcmdldCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICAgIHsKLSAgICAgICAgCU9iamVjdCBhZGFwdGVyID0gdGFyZ2V0LmVBZGFwdGVycygpLmdldCgwKTsKLSAgICAgICAgCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKQotICAgICAgICAgICAgewotICAgICAgICAgIAkgKChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpIGFkYXB0ZXIpLnNldFJlYWRPbmx5KHRydWUpOwotICAgICAgICAgIAkgKChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpIGFkYXB0ZXIpLnNldENoYW5nZVJlYWRPbmx5RmllbGQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgKChYU0RSZWRlZmluZSkgcGFyZW50KS5nZXRDb250ZW50cygpLnJlbW92ZSh0YXJnZXQpOwotICAgICAgICB9ICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgZG9DbGVhbnVwID0gdHJ1ZTsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgewotICAgICAgICAgIEVPYmplY3Qgb2JqID0gcGFyZW50LmVDb250YWluZXIoKTsKLSAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSBudWxsOwotICAgICAgICAgIHdoaWxlIChvYmogIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIG9iajsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvYmogPSBvYmouZUNvbnRhaW5lcigpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoY29tcGxleFR5cGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb21wbGV4VHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpLnJlbW92ZShwYXJlbnQpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChwYXJlbnQuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJHcm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHBhcmVudC5nZXRDb250YWluZXIoKTsKLQotICAgICAgICAgICAgYXR0ckdyb3VwLmdldENvbnRlbnRzKCkucmVtb3ZlKHBhcmVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0b3IudmlzaXRTY2hlbWEodGFyZ2V0LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAoKFhTRFNjaGVtYSkgcGFyZW50KS5nZXRDb250ZW50cygpLnJlbW92ZSh0YXJnZXQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gJiYgcGFyZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBkb0NsZWFudXAgPSB0cnVlOwotICAgICAgICAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgcGFyZW50KS5nZXRBdHRyaWJ1dGVDb250ZW50cygpLnJlbW92ZSh0YXJnZXQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgIHsKLSAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtZXJhdGlvbkZhY2V0ID0gKFhTREVudW1lcmF0aW9uRmFjZXQpIHRhcmdldDsKLSAgICAgICAgZW51bWVyYXRpb25GYWNldC5nZXRTaW1wbGVUeXBlRGVmaW5pdGlvbigpLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUoZW51bWVyYXRpb25GYWNldCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHBhcmVudC5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApICgoWFNEUGFydGljbGUpIHBhcmVudCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkucmVtb3ZlKHBhcmVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBwYXJlbnQpLnNldEF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudChudWxsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAoKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgcGFyZW50KS5zZXRBdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uICYmIHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgZG9DbGVhbnVwID0gdHJ1ZTsKLSAgICAgICAgKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudCkuc2V0VHlwZURlZmluaXRpb24odGFyZ2V0LnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJzdHJpbmciKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICBkb0NsZWFudXAgPSB0cnVlOwotICAgICAgICAgIHZpc2l0b3IudmlzaXRTY2hlbWEodGFyZ2V0LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAoKFhTRFNjaGVtYSkgcGFyZW50KS5nZXRDb250ZW50cygpLnJlbW92ZSh0YXJnZXQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICAgIHsKLSAgICAgICAgICBkb0NsZWFudXAgPSBmYWxzZTsKLSAgICAgICAgICBFTGlzdCBjb250ZW50cyA9ICgoWFNEUmVkZWZpbmUpcGFyZW50KS5nZXRDb250ZW50cygpOyAgICAKLSAgICAgICAgICBPYmplY3QgYWRhcHRlciA9IHRhcmdldC5lQWRhcHRlcnMoKS5nZXQoMCk7Ci0gICAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyKQotICAgICAgICAgIHsKLSAgICAgICAgCSAgCi0gICAgICAgIAkgKChYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyKSBhZGFwdGVyKS5zZXRSZWFkT25seSh0cnVlKTsKLSAgICAgICAgCSAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpIGFkYXB0ZXIpLnNldENoYW5nZVJlYWRPbmx5RmllbGQodHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAJICAKLSAgICAgICAgCSAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcikgYWRhcHRlcikuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0gICAgICAgIAkgKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpIGFkYXB0ZXIpLnNldENoYW5nZVJlYWRPbmx5RmllbGQodHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyKQotICAgICAgICAgIHsKLSAgICAgICAgCSAgCi0gICAgICAgIAkgKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyKSBhZGFwdGVyKS5zZXRSZWFkT25seSh0cnVlKTsKLSAgICAgICAgCSAoKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpIGFkYXB0ZXIpLnNldENoYW5nZVJlYWRPbmx5RmllbGQodHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbnRlbnRzLnJlbW92ZSh0YXJnZXQpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkb0NsZWFudXApCi0gICAgICAgIFhTRERpcmVjdGl2ZXNNYW5hZ2VyLnJlbW92ZVVudXNlZFhTREltcG9ydHMoc2NoZW1hKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0V4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZTRjNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kIGV4dGVuZHMgQWRkRXh0ZW5zaW9uQ29tbWFuZAotewotICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQ7Ci0gIHByb3RlY3RlZCBFbGVtZW50IGFwcEluZm87Ci0gIHByb3RlY3RlZCBFbGVtZW50IG5ld0VsZW1lbnQ7Ci0KLSAgcHVibGljIEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kKFN0cmluZyBsYWJlbCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgfQotCi0gIHB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotICAKLSAgcHVibGljIEVsZW1lbnQgZ2V0TmV3RWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGdldEFwcEluZm8oKQotICB7Ci0gICAgcmV0dXJuIGFwcEluZm87Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0WFNEU2NoZW1hKCkKLSAgewotICAgIHJldHVybiBjb21wb25lbnQuZ2V0U2NoZW1hKCk7ICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXRzKFhTRENvbmNyZXRlQ29tcG9uZW50IGlucHV0LCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgewotICAgIHRoaXMuY29tcG9uZW50ID0gaW5wdXQ7Ci0gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgfQotICAKLSAgcHVibGljIFhTREFubm90YXRpb24gZ2V0WFNEQW5ub3RhdGlvbigpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uID0gWFNEQ29tbW9uVUlVdGlscy5nZXRJbnB1dFhTREFubm90YXRpb24oY29tcG9uZW50LCBmYWxzZSk7Ci0gICAgICByZXR1cm4geHNkQW5ub3RhdGlvbjsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgICAgZG9QcmVwcm9jZXNzaW5nKCk7Ci0gICAgICBhZGRFeHRlbnNpb25Ob2RlKCk7Ci0gICAgICBkb0N1c3RvbWl6ZWRBY3Rpb25zKCk7Ci0gICAgICAKLSAgICAgIGZvcm1hdENoaWxkKGNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb1ByZXByb2Nlc3NpbmcoKQotICB7Ci0gICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZEV4dGVuc2lvbk5vZGUoKQotICB7Ci0gICAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uID0gWFNEQ29tbW9uVUlVdGlscy5nZXRJbnB1dFhTREFubm90YXRpb24oY29tcG9uZW50LCB0cnVlKTsKLSAgICBYU0RTY2hlbWEgc2NoZW1hPSB4c2RBbm5vdGF0aW9uLmdldFNjaGVtYSgpOwotICAgIEVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IHNjaGVtYS5nZXRFbGVtZW50KCk7Ci0KLSAgICBpZiAoeHNkQW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCkuc2l6ZSgpID09IDApCi0gICAgewotICAgICAgYXBwSW5mbyA9IHhzZEFubm90YXRpb24uY3JlYXRlQXBwbGljYXRpb25JbmZvcm1hdGlvbihudWxsKTsKLSAgICAgIHhzZEFubm90YXRpb24uZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKGFwcEluZm8pOwotICAgICAgTGlzdCBhcHBJbmZvcyA9IHhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpOwotICAgICAgYXBwSW5mb3MuYWRkKGFwcEluZm8pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gdXNlIHRoZSBmaXJzdCBhcHBJbmZvCi0gICAgICBhcHBJbmZvID0gKEVsZW1lbnQpeHNkQW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCkuZ2V0KDApOwotICAgIH0KLQotICAgIGlmIChhcHBJbmZvICE9IG51bGwpCi0gICAgewotICAgICAgRG9jdW1lbnQgZG9jID0gYXBwSW5mby5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gYWRkVG9OYW1lc3BhY2VUYWJsZShzY2hlbWFFbGVtZW50KTsKLSAgICAgIG5ld0VsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKGV4dGVuc2lvbnNTY2hlbWFTcGVjLmdldE5hbWVzcGFjZVVSSSgpLCBlbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICBuZXdFbGVtZW50LnNldFByZWZpeChwcmVmaXgpOyAgIAotICAgICAgYXBwSW5mby5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTsKLQotICAgICAgeHNkQW5ub3RhdGlvbi51cGRhdGVFbGVtZW50KCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGFkZFRvTmFtZXNwYWNlVGFibGUoRWxlbWVudCBzY2hlbWFFbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IGFkZE5hbWVzcGFjZURlY2xhcmF0aW9uSWZSZXF1aXJlZChzY2hlbWFFbGVtZW50LCAicCIsIGV4dGVuc2lvbnNTY2hlbWFTcGVjLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRvQ3VzdG9taXplZEFjdGlvbnMoKQotICB7Ci0gICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gICAgc3VwZXIudW5kbygpOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLSAgCi0gIC8vIFRPRE8uLi4gY29tbW9uIHRoaXMgdXAgd2l0aCB3c2RsLnVpCi0gIHByb3RlY3RlZCBTdHJpbmcgYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25JZlJlcXVpcmVkKEVsZW1lbnQgc2NoZW1hRWxlbWVudCwgU3RyaW5nIHByZWZpeEhpbnQsIFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsgICAgICAKLSAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShzY2hlbWFFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChzY2hlbWFFbGVtZW50KTsKLSAgICBwcmVmaXggPSBuYW1lc3BhY2VUYWJsZS5nZXRQcmVmaXhGb3JVUkkobmFtZXNwYWNlKTsKLSAgICBpZiAocHJlZml4ID09IG51bGwpCi0gICAgeyAKLSAgICAgIFN0cmluZyBiYXNlUHJlZml4ID0gcHJlZml4SGludDsKLSAgICAgIHByZWZpeCA9IGJhc2VQcmVmaXg7Ci0gICAgICBTdHJpbmcgeG1sbnNDb2xvbiA9ICJ4bWxuczoiOyAvLyROT04tTkxTLTEkCi0gICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IHhtbG5zQ29sb24gKyBwcmVmaXg7Ci0gICAgICBpbnQgY291bnQgPSAwOwotICAgICAgd2hpbGUgKHNjaGVtYUVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKQotICAgICAgewotICAgICAgICBjb3VudCsrOwotICAgICAgICBwcmVmaXggPSBiYXNlUHJlZml4ICsgY291bnQ7Ci0gICAgICAgIGF0dHJpYnV0ZU5hbWUgPSB4bWxuc0NvbG9uICsgcHJlZml4OwotICAgICAgfSAgICAgIAotICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgbmFtZXNwYWNlKTsgIAotICAgIH0gICAgCi0gICAgcmV0dXJuIHByZWZpeDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkU2NoZW1hQXR0cmlidXRlKEVsZW1lbnQgc2NoZW1hRWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKHNjaGVtYUVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KHNjaGVtYUVsZW1lbnQpOwotICAgIHByZWZpeCA9IG5hbWVzcGFjZVRhYmxlLmdldFByZWZpeEZvclVSSShuYW1lc3BhY2UpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNjaGVtYUVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShwcmVmaXggKyAiOiIgKyBhdHRyaWJ1dGVOYW1lKSA9PSBudWxsKQotICAgICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKHByZWZpeCArICI6IiArIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoc2NoZW1hRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZU5hbWUpID09IG51bGwpCi0gICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgCi0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkU291cmNlQXR0cmlidXRlVG9BcHBJbmZvKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBpZiAoYXBwSW5mby5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5TT1VSQ0VfQVRUUklCVVRFKSA9PSBudWxsKQotICAgICAgYXBwSW5mby5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNPVVJDRV9BVFRSSUJVVEUsIG5hbWVzcGFjZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQKLSAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLSAgICogQHBhcmFtIGF0dHJpYnV0ZVZhbHVlCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKQotICB7Ci0gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9FeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0V4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjVmZjM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0V4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBOb2RlIG5vZGU7Ci0gIHByb3RlY3RlZCBYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dDsKLSAgCi0gIHB1YmxpYyBFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQoU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkKLSAgewotICAgIHRoaXMubm9kZSA9IG5vZGU7Ci0gIH0KLQotICBwdWJsaWMgWFNEQ29uY3JldGVDb21wb25lbnQgZ2V0SW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIGlucHV0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoWFNEQ29uY3JldGVDb21wb25lbnQgaW5wdXQpCi0gIHsKLSAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhub2RlKTsKLSAgICAgIAotICAgICAgZG9QcmVwcm9jZXNzaW5nKCk7Ci0gICAgICAKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpIG5vZGU7Ci0gICAgICAgIGF0dHIuZ2V0T3duZXJFbGVtZW50KCkucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKG5vZGUpOwotICAgICAgICAgIAotICAgICAgICAgIGlmIChYU0RET01IZWxwZXIuaGFzT25seVdoaXRlc3BhY2UocGFyZW50KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoWFNEQ29uc3RhbnRzLkFQUElORk9fRUxFTUVOVF9UQUcuZXF1YWxzKHBhcmVudC5nZXRMb2NhbE5hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShwYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBkb0N1c3RvbWl6ZWRBY3Rpb25zKCk7Ci0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRvUHJlcHJvY2Vzc2luZygpCi0gIHsKLSAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9DdXN0b21pemVkQWN0aW9ucygpCi0gIHsKLSAgIAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlZGVmaW5lQXR0cmlidXRlR3JvdXBDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZWRlZmluZUF0dHJpYnV0ZUdyb3VwQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDQ3M2I0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlZGVmaW5lQXR0cmlidXRlR3JvdXBDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLQotCi0vKioKLSAqIENyZWF0ZXMgYSByZWRlZmluZWQgYXR0cmlidXRlIGdyb3VwIGJhc2VkIG9uIHRoZSBpbnB1dCBhdHRyaWJ1dGUgZ3JvdXAgYW5kIGFkZHMgaXQgdG8gdGhlIHBhcmVudCByZWRlZmluZS4KLSAqLwotcHVibGljIGNsYXNzIFJlZGVmaW5lQXR0cmlidXRlR3JvdXBDb21tYW5kIGV4dGVuZHMgQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZAotewotICBwdWJsaWMgUmVkZWZpbmVBdHRyaWJ1dGVHcm91cENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RSZWRlZmluZSByZWRlZmluZSwgWFNEUmVkZWZpbmFibGVDb21wb25lbnQgcmVkZWZpbmFibGVDb21wb25lbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCwgcmVkZWZpbmUsIHJlZGVmaW5hYmxlQ29tcG9uZW50KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLnNldE5hbWUocmVkZWZpbmFibGVDb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZWRlZmluZUNvbXBsZXhUeXBlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVkZWZpbmVDb21wbGV4VHlwZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkYWQ1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZWRlZmluZUNvbXBsZXhUeXBlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0REZXJpdmF0aW9uTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluYWJsZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci0KLQotLyoqCi0gKiBDcmVhdGVzIGEgcmVkZWZpbmVkIGNvbXBsZXggdHlwZSBiYXNlZCBvbiB0aGUgaW5wdXQgY29tcGxleCB0eXBlIGFuZCBhZGRzIGl0IHRvIHRoZSBwYXJlbnQgcmVkZWZpbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWRlZmluZUNvbXBsZXhUeXBlQ29tbWFuZCBleHRlbmRzIEFkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQKLXsKLSAgcHVibGljIFJlZGVmaW5lQ29tcGxleFR5cGVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEUmVkZWZpbmUgcmVkZWZpbmUsIFhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IHJlZGVmaW5hYmxlQ29tcG9uZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwsIHJlZGVmaW5lLCByZWRlZmluYWJsZUNvbXBvbmVudCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKQotICB7Ci0gICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHJlZGVmaW5lZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotICAgIHJlZGVmaW5lZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5zZXROYW1lKHJlZGVmaW5hYmxlQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgcmVkZWZpbmVkQ29tcGxleFR5cGVEZWZpbml0aW9uLnNldENvbnRlbnQoWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCkuZ2V0Q29udGVudCgpKTsKLSAgICByZWRlZmluZWRDb21wbGV4VHlwZURlZmluaXRpb24uc2V0RGVyaXZhdGlvbk1ldGhvZChYU0REZXJpdmF0aW9uTWV0aG9kLkVYVEVOU0lPTl9MSVRFUkFMKTsKLSAgICByZWRlZmluZWRDb21wbGV4VHlwZURlZmluaXRpb24uc2V0QmFzZVR5cGVEZWZpbml0aW9uKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pcmVkZWZpbmFibGVDb21wb25lbnQpOwotICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSByZWRlZmluZWRDb21wbGV4VHlwZURlZmluaXRpb247Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZWRlZmluZU1vZGVsR3JvdXBDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZWRlZmluZU1vZGVsR3JvdXBDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNjZlZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVkZWZpbmVNb2RlbEdyb3VwQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLQotCi0vKioKLSAqIENyZWF0ZXMgYSByZWRlZmluZWQgbW9kZWwgZ3JvdXAgYmFzZWQgb24gdGhlIGlucHV0IG1vZGVsIGdyb3VwIGFuZCBhZGRzIGl0IHRvIHRoZSBwYXJlbnQgcmVkZWZpbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWRlZmluZU1vZGVsR3JvdXBDb21tYW5kIGV4dGVuZHMgQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZAotewotCi0gIHB1YmxpYyBSZWRlZmluZU1vZGVsR3JvdXBDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEUmVkZWZpbmUgcmVkZWZpbmUsIFhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IHJlZGVmaW5hYmxlQ29tcG9uZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwsIHJlZGVmaW5lLCByZWRlZmluYWJsZUNvbXBvbmVudCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKQotICB7Ci0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgcmVkZWZpbmFibGVDb21wb25lbnQ7Ci0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gcmVkZWZpbmVkTW9kZWxHcm91cERlZmluaXRpb24gPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pbW9kZWxHcm91cC5jbG9uZUNvbmNyZXRlQ29tcG9uZW50KHRydWUsIGZhbHNlKTsKLSAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gcmVkZWZpbmVkTW9kZWxHcm91cERlZmluaXRpb247Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZWRlZmluZVNpbXBsZVR5cGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZWRlZmluZVNpbXBsZVR5cGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNzY1YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVkZWZpbmVTaW1wbGVUeXBlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluYWJsZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi0KLS8qKgotICogQ3JlYXRlcyBhIHJlZGVmaW5lZCBzaW1wbGUgdHlwZSBiYXNlZCBvbiB0aGUgaW5wdXQgc2ltcGxlIHR5cGUgYW5kIGFkZHMgaXQgdG8gdGhlIHBhcmVudCByZWRlZmluZS4KLSAqLwotcHVibGljIGNsYXNzIFJlZGVmaW5lU2ltcGxlVHlwZUNvbW1hbmQgZXh0ZW5kcyBBZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kCi17Ci0gIHB1YmxpYyBSZWRlZmluZVNpbXBsZVR5cGVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEUmVkZWZpbmUgcmVkZWZpbmUsIFhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IHJlZGVmaW5hYmxlQ29tcG9uZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwsIHJlZGVmaW5lLCByZWRlZmluYWJsZUNvbXBvbmVudCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gcmVkZWZpbmVkU2ltcGxlVHlwZURlZmluaXRpb24gPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotICAgIHJlZGVmaW5lZFNpbXBsZVR5cGVEZWZpbml0aW9uLnNldE5hbWUocmVkZWZpbmFibGVDb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICByZWRlZmluZWRTaW1wbGVUeXBlRGVmaW5pdGlvbi5zZXRCYXNlVHlwZURlZmluaXRpb24oKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKXJlZGVmaW5hYmxlQ29tcG9uZW50KTsKLSAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gcmVkZWZpbmVkU2ltcGxlVHlwZURlZmluaXRpb247Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZW1vdmVFeHRlbnNpb25BdHRyaWJ1dGVyQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVtb3ZlRXh0ZW5zaW9uQXR0cmlidXRlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3M2E0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZW1vdmVFeHRlbnNpb25BdHRyaWJ1dGVyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVFeHRlbnNpb25BdHRyaWJ1dGVyQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgCi17Ci0JRWxlbWVudCBob3N0RWxlbWVudDsKLQlBdHRyIGF0dHI7Ci0JCi0JcHVibGljIFJlbW92ZUV4dGVuc2lvbkF0dHJpYnV0ZXJDb21tYW5kKFN0cmluZyBsYWJlbCwgRWxlbWVudCBob3N0RWxlbWVudCwgQXR0ciBhdHRyKQotCXsKLQkJc3VwZXIobGFiZWwpOwotCQl0aGlzLmhvc3RFbGVtZW50ID0gaG9zdEVsZW1lbnQ7Ci0JCXRoaXMuYXR0ciA9IGF0dHI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotCXsKLQkJc3VwZXIuZXhlY3V0ZSgpOwotCQlob3N0RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1bmRvKCkKLQl7Ci0JCXN1cGVyLnVuZG8oKTsKLQkJLy9UT0RPIGltcGxlbWVudCBtZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlbW92ZUV4dGVuc2lvbkVsZW1lbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZW1vdmVFeHRlbnNpb25FbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzNjNzU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlbW92ZUV4dGVuc2lvbkVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVFeHRlbnNpb25FbGVtZW50Q29tbWFuZCBleHRlbmRzIENvbW1hbmQKLXsKLSAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uOwotICBOb2RlIGFwcEluZm87Ci0KLSAgcHVibGljIFJlbW92ZUV4dGVuc2lvbkVsZW1lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uLCBOb2RlIGFwcEluZm8pCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RBbm5vdGF0aW9uID0geHNkQW5ub3RhdGlvbjsKLSAgICB0aGlzLmFwcEluZm8gPSBhcHBJbmZvOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgeHNkQW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCkucmVtb3ZlKGFwcEluZm8pOwotICAgIHhzZEFubm90YXRpb24uZ2V0RWxlbWVudCgpLnJlbW92ZUNoaWxkKGFwcEluZm8pOwotICAgIHhzZEFubm90YXRpb24udXBkYXRlRWxlbWVudCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgICBzdXBlci51bmRvKCk7Ci0gICAgeHNkQW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCkuYWRkKGFwcEluZm8pOwotICAgIHhzZEFubm90YXRpb24uZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKGFwcEluZm8pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQxMTY2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBOb2RlIG5vZGU7Ci0gIAotICBwdWJsaWMgUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBOb2RlIG5vZGUpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5ub2RlID0gbm9kZTsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcobm9kZSk7Ci0gICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBub2RlOwotICAgICAgICBhdHRyLmdldE93bmVyRWxlbWVudCgpLnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShub2RlKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoWFNERE9NSGVscGVyLmhhc09ubHlXaGl0ZXNwYWNlKHBhcmVudCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKFhTRENvbnN0YW50cy5BUFBJTkZPX0VMRU1FTlRfVEFHLmVxdWFscyhwYXJlbnQuZ2V0TG9jYWxOYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UocGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfSAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRCYXNlVHlwZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0QmFzZVR5cGVBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjNDdjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRCYXNlVHlwZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2V0QmFzZVR5cGVBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQgZXh0ZW5kcyBVcGRhdGVUeXBlUmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQKLXsKLQotICBwdWJsaWMgU2V0QmFzZVR5cGVBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQsIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlLCBJRmlsZSBmaWxlKQotICB7Ci0gICAgc3VwZXIoY29uY3JldGVDb21wb25lbnQsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWVzcGFjZSwgZmlsZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbmNyZXRlQ29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RDb21wb25lbnQgdGQgPSBjb21wdXRlQ29tcG9uZW50KCk7Ci0gICAgICBpZiAodGQgIT0gbnVsbCAmJiB0ZCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBTZXRCYXNlVHlwZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBTZXRCYXNlVHlwZUNvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIChYU0RUeXBlRGVmaW5pdGlvbikgdGQpOwotICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIucmVtb3ZlVW51c2VkWFNESW1wb3J0cyhjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0QmFzZVR5cGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRCYXNlVHlwZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I3NGVjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRCYXNlVHlwZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0REZXJpdmF0aW9uTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFZhcmlldHk7Ci0KLXB1YmxpYyBjbGFzcyBTZXRCYXNlVHlwZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudDsKLSAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGU7Ci0gIFhTREJhc2VBZGFwdGVyIGFkYXB0ZXI7Ci0gIAotCi0gIHB1YmxpYyBTZXRCYXNlVHlwZUNvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQsIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlKQotICB7Ci0gICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfQkFTRV9UWVBFKTsKLSAgICB0aGlzLmNvbmNyZXRlQ29tcG9uZW50ID0gY29uY3JldGVDb21wb25lbnQ7Ci0gICAgdGhpcy5iYXNlVHlwZSA9IGJhc2VUeXBlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhjb25jcmV0ZUNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBjb25jcmV0ZUNvbXBvbmVudDsgICAgICAgIAotICAgICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29udGVudFR5cGUgPSAoYmFzZVR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pID8gKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pYmFzZVR5cGUpLmdldENvbnRlbnRUeXBlKCkgOiBudWxsOwotICAgICAgICAKLSAgICAgICAgLy8gQ29tcGxleCB0eXBlIHNpbXBsZSBjb250ZW50Ci0gICAgICAgIGlmIChiYXNlVHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHx8IChjb250ZW50VHlwZSAhPSBudWxsICYmICBjb250ZW50VHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghKGNvbXBsZXhUeXBlLmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVDb250ZW50ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgIGNvbXBsZXhUeXBlLnNldENvbnRlbnQoc2ltcGxlQ29udGVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIENvbXBsZXggdHlwZSBjb21wbGV4IGNvbnRlbnQKLSAgICAgICAgZWxzZSBpZihiYXNlVHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAJaWYoIShjb21wbGV4VHlwZS5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pKQotICAgICAgICAJewotICAgICAgICAJCVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4Q29udGVudCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAJCWNvbXBsZXhUeXBlLnNldENvbnRlbnQoY29tcGxleENvbnRlbnQuZ2V0Q29udGVudCgpKTsKLSAgICAgICAgCX0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIGNvbXBsZXhUeXBlLnNldERlcml2YXRpb25NZXRob2QoWFNERGVyaXZhdGlvbk1ldGhvZC5FWFRFTlNJT05fTElURVJBTCk7Ci0gICAgICAgIGNvbXBsZXhUeXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbihiYXNlVHlwZSk7Ci0gICAgICAgIC8vIHZiIFRoaXMgY2FsbCBzaG91bGQgbm90IGJlIG5lZWRlZC4gVGhlIFhTRCBJbmZvc2V0IG1vZGVsIHNob3VsZCByZWNvbmNpbGUgaXRzZWxmIHByb3Blcmx5LgotICAgICAgICBjb21wbGV4VHlwZS51cGRhdGVFbGVtZW50KHRydWUpOwotICAgICAgICBmb3JtYXRDaGlsZChjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgY29uY3JldGVDb21wb25lbnQ7Ci0gICAgICAgIGlmIChiYXNlVHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEVmFyaWV0eSB2YXJpZXR5ID0gc2ltcGxlVHlwZS5nZXRWYXJpZXR5KCk7Ci0gICAgICAgICAgaWYgKHZhcmlldHkuZ2V0VmFsdWUoKSA9PSBYU0RWYXJpZXR5LkFUT01JQykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzaW1wbGVUeXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGJhc2VUeXBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAodmFyaWV0eS5nZXRWYWx1ZSgpID09IFhTRFZhcmlldHkuVU5JT04pCi0gICAgICAgICAgewotICAgICAgICAgICAgc2ltcGxlVHlwZS5nZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKS5hZGQoYmFzZVR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh2YXJpZXR5LmdldFZhbHVlKCkgPT0gWFNEVmFyaWV0eS5MSVNUKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNpbXBsZVR5cGUuc2V0SXRlbVR5cGVEZWZpbml0aW9uKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgYmFzZVR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRNdWx0aXBsaWNpdHlDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRNdWx0aXBsaWNpdHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NzlmZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0TXVsdGlwbGljaXR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotCi1wdWJsaWMgY2xhc3MgU2V0TXVsdGlwbGljaXR5Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgaW50IG1heE9jY3VycywgbWluT2NjdXJzOwotCi0gIC8qKgotICAgKiBAcGFyYW0gcGFyZW50Ci0gICAqLwotICBwdWJsaWMgU2V0TXVsdGlwbGljaXR5Q29tbWFuZChTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1heE9jY3VycyhpbnQgaSkKLSAgewotICAgIG1heE9jY3Vycz1pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TWluT2NjdXJzKGludCBpKQotICB7Ci0gICAgbWluT2NjdXJzPWk7ICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0WFNEQ29uY3JldGVDb21wb25lbnQoWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50KQotICB7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLkFic3RyYWN0Q29tbWFuZCNydW4oKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZUNvbnRlbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlQ29udGVudCB4c2RQYXJ0aWNsZUNvbnRlbnQgPSAoWFNEUGFydGljbGVDb250ZW50KSBwYXJlbnQ7Ci0gICAgICAgIFhTRFBhcnRpY2xlIHhzZFBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSB4c2RQYXJ0aWNsZUNvbnRlbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIGlmIChtYXhPY2N1cnMgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgbWF4T2NjdXJzID0gWFNEUGFydGljbGUuVU5CT1VOREVEOwotICAgICAgICB9Ci0gICAgICAgIHhzZFBhcnRpY2xlLnNldE1heE9jY3VycyhtYXhPY2N1cnMpOwotICAgICAgICB4c2RQYXJ0aWNsZS5zZXRNaW5PY2N1cnMobWluT2NjdXJzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0VHlwZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldFR5cGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNGNiNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0VHlwZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0VHlwZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBTZXRUeXBlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgcHJpdmF0ZSBib29sZWFuIGNvbnRpbnVlQXBwbHk7Ci0gIFhTREJhc2VBZGFwdGVyIGFkYXB0ZXI7Ci0gIFN0cmluZyBhY3Rpb247Ci0KLSAgcHVibGljIFNldFR5cGVDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIElELCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy5hY3Rpb24gPSBJRDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihYU0RCYXNlQWRhcHRlciBhZGFwdGVyKQotICB7Ci0gICAgdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciA9IGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCk7Ci0gICAgICBjb250aW51ZUFwcGx5ID0gdHJ1ZTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKFNldFR5cGVBY3Rpb24uU0VUX05FV19UWVBFX0lEKSkKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWUgPSAoQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgaW52b2tlRGlhbG9nKGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmdldE5ld0RpYWxvZygpKTsKLSAgICAgICAgICBpZiAoY29udGludWVBcHBseSkKLSAgICAgICAgICAgIGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShhZGFwdGVyLCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZSA9IChDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBpbnZva2VEaWFsb2coY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCkpOwotICAgICAgICAgIGlmIChjb250aW51ZUFwcGx5KQotICAgICAgICAgICAgY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGFkYXB0ZXIsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBmb3JtYXRDaGlsZChwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgT2JqZWN0IGludm9rZURpYWxvZyhJQ29tcG9uZW50RGlhbG9nIGRpYWxvZykKLSAgewotICAgIE9iamVjdCBuZXdWYWx1ZSA9IG51bGw7Ci0KLSAgICBpZiAoZGlhbG9nID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgIHsKLSAgICAgIG5ld1ZhbHVlID0gZGlhbG9nLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb250aW51ZUFwcGx5ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld1ZhbHVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCkKLSAgewotICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIHJlc3VsdCA9IG51bGw7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgaWYgKGVkaXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkKLSAgewotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICByZXR1cm4gZWRpdG9yUGFydDsKLSAgfSAgICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldFhTREZhY2V0VmFsdWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YzY4ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWNldDsKLQotcHVibGljIGNsYXNzIFNldFhTREZhY2V0VmFsdWVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFhTREZhY2V0IGZhY2V0OwotICBwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOwotICAKLSAgcHVibGljIFNldFhTREZhY2V0VmFsdWVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNERmFjZXQgZmFjZXQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5mYWNldCA9IGZhY2V0OwotICB9Ci0gIAotICBwdWJsaWMgU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RGYWNldCBmYWNldCwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMuZmFjZXQgPSBmYWNldDsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoZmFjZXQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIGZhY2V0LnNldExleGljYWxWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUF0dHJpYnV0ZVJlZmVyZW5jZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMzhiNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRERpcmVjdGl2ZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kIGV4dGVuZHMgVXBkYXRlQ29tcG9uZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQKLXsKLQotICBwdWJsaWMgVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50LCBTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWVzcGFjZSwgSUZpbGUgZmlsZSkKLSAgewotICAgIHN1cGVyKGNvbmNyZXRlQ29tcG9uZW50LCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lc3BhY2UsIGZpbGUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRENvbXBvbmVudCBnZXREZWZpbmVkQ29tcG9uZW50KFhTRFNjaGVtYSBzY2hlbWEsIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlKQotICB7Ci0gICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gcmVzdWx0ID0gc2NoZW1hLnJlc29sdmVBdHRyaWJ1dGVEZWNsYXJhdGlvbihjb21wb25lbnROYW1lc3BhY2UsIGNvbXBvbmVudE5hbWUpOwotICAgIGlmIChyZXN1bHQuZUNvbnRhaW5lcigpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoY29uY3JldGVDb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTRENvbXBvbmVudCBjb21wb25lbnREZWYgPSBjb21wdXRlQ29tcG9uZW50KCk7Ci0gICAgICBpZiAoY29tcG9uZW50RGVmICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFVwZGF0ZUF0dHJpYnV0ZVJlZmVyZW5jZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VDb21tYW5kKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX0FUVFJJQlVURV9SRUZFUkVOQ0UsIChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgY29uY3JldGVDb21wb25lbnQsCi0gICAgICAgICAgICAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGNvbXBvbmVudERlZik7Ci0gICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWY2Mzc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUF0dHJpYnV0ZVJlZmVyZW5jZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZUF0dHJpYnV0ZVJlZmVyZW5jZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUsIHJlZjsKLQotICBwdWJsaWMgVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSwgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gcmVmKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwotICAgIHRoaXMucmVmID0gcmVmOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhhdHRyaWJ1dGUuZ2V0RWxlbWVudCgpKTsKLSAgICAgIGF0dHJpYnV0ZS5zZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKHJlZik7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NmYyNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIGZyb20gdGhlIGV4dGVuc2lvbiB2aWV3IHRvIGVkaXQgZXh0ZW5zaW9uIGVsZW1lbnRzCi0gKiBhbmQgYXR0cmlidXRlcyB3aGljaCBhcmUgaW1wbGVtZW50ZWQgYXMgRE9NIG9iamVjdHMgKG5vdCBwYXJ0IG9mIHRoZSBFTUYgbW9kZWwpCi0gKiAKLSAqICh0cnVuZykgYWxzbyB1c2VkIGluIFhTRENvbXBsZXhUeXBlQWR2YW5jZWRTZWN0aW9uIHRvIGNoYW5nZSBhdHRyaWJ1dGUgb2YKLSAqIHNwZWNpY2FsIGF0dHJpYnV0ZXMgbGlrZSBibG9jaywgcmVzdHJpY3Rpb24gd2hpY2ggaXMgbm90IHBhcnQgb2YgRU1GIE1vZGVsCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudDsKLSAgcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVOYW1lOwotICBwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAKLSAgLyoqIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgZGVsZXRlZCBpZiB2YWx1ZSB0byAKLSAgICogICBiZSBzZXQgaXMgYW4gZW1wdHkgU3RyaW5nIG9yIG51bGwgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGRlbGV0ZUlmVmFsdWVFbXB0eSA9IGZhbHNlOwotICAKLSAgcHVibGljIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlVmFsdWUsIGJvb2xlYW4gZGVsZXRlSWZWYWx1ZUVtcHR5KQotICB7Ci0gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwotICAgIHRoaXMuYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVWYWx1ZTsKLSAgICB0aGlzLmRlbGV0ZUlmVmFsdWVFbXB0eSA9IGRlbGV0ZUlmVmFsdWVFbXB0eTsKLSAgfQotCi0gIHB1YmxpYyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlLCBTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICB0aGlzKGVsZW1lbnQsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlLCBmYWxzZSk7Ci0KLSAgICAvLyBUaGUgY29tbWFuZCBsYWJlbCBpcyBzaGFyZWQgd2l0aCB0aGUgYWN0dWFsIFVJIGxhYmVsLCB3aGljaCBjb250YWlucyAKLSAgICAvLyBtbmVtb25pY3MgYW5kIGNvbG9uIGNoYXJhY3RlcnMuIFNpbmNlIHdlIGRvbid0IHdhbnQgdGhlc2UgdG8gc2hvdyB1cCBpbiAKLSAgICAvLyB0aGUgdW5kbyBtZW51IHdlIGRvIGEgbGl0dGxlIGJpdCBvZiByZWd1bGFyIGV4cHJlc3Npb24gbWFnaWMgaGVyZSB0byByZW1vdmUgdGhlbS4KLSAgICAKLSAgICBzZXRMYWJlbChOTFMuYmluZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRSwgbGFiZWwucmVwbGFjZUFsbCgiWyY6XSIsICIiKSkpOwotICB9Ci0gIAotICBwdWJsaWMgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkKLSAgewotICAgIHRoaXMoZWxlbWVudCwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUsIGZhbHNlKTsKLSAgICBzZXRMYWJlbChOTFMuYmluZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRSwgYXR0cmlidXRlTmFtZSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVsZXRlSWZFbXB0eShib29sZWFuIHYpCi0gIHsKLQkgIGRlbGV0ZUlmVmFsdWVFbXB0eSA9IHY7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgaWYgKGRlbGV0ZUlmVmFsdWVFbXB0eSAmJiAKLSAgICAJCSAgKGF0dHJpYnV0ZVZhbHVlID09IG51bGwgfHwgYXR0cmlidXRlVmFsdWUuZXF1YWxzKCIiKSApICkKLSAgICAgIHsKLSAgICAJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZG9Qb3N0UHJvY2Vzc2luZygpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3RQcm9jZXNzaW5nKCkKLSAgewotICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb21wbGV4VHlwZURlcml2YXRpb25CeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQ29tcGxleFR5cGVEZXJpdmF0aW9uQnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjYWU2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb21wbGV4VHlwZURlcml2YXRpb25CeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRERlcml2YXRpb25NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFVwZGF0ZUNvbXBsZXhUeXBlRGVyaXZhdGlvbkJ5IGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nIGRlcml2YXRpb247Ci0KLSAgcHVibGljIFVwZGF0ZUNvbXBsZXhUeXBlRGVyaXZhdGlvbkJ5KFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSwgU3RyaW5nIGRlcml2YXRpb24pCi0gIHsKLSAgICB0aGlzLmNvbXBsZXhUeXBlID0gY29tcGxleFR5cGU7Ci0gICAgdGhpcy5kZXJpdmF0aW9uID0gZGVyaXZhdGlvbjsKLSAgICAvLyBUT0RPOiB1c2UgbmV3IE1lc3NhZ2UgYnVuZGxlIG1lY2hhbmlzbQotICAgIHNldExhYmVsKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9ERVJJVkVEQllfQ0hBTkdFIikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIG9yaWdpbmFsQmFzZVR5cGUgPSBjb21wbGV4VHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgaWYgKGRlcml2YXRpb24uZXF1YWxzKFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcpKQotICAgICAgewotICAgICAgICBjb21wbGV4VHlwZS5zZXREZXJpdmF0aW9uTWV0aG9kKFhTRERlcml2YXRpb25NZXRob2QuRVhURU5TSU9OX0xJVEVSQUwpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZGVyaXZhdGlvbi5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKSkKLSAgICAgIHsKLSAgICAgICAgY29tcGxleFR5cGUuc2V0RGVyaXZhdGlvbk1ldGhvZChYU0REZXJpdmF0aW9uTWV0aG9kLlJFU1RSSUNUSU9OX0xJVEVSQUwpOwotICAgICAgfQotICAgICAgY29tcGxleFR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKG9yaWdpbmFsQmFzZVR5cGUpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb21wb25lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQ29tcG9uZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEyM2YzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb21wb25lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUltcGw7Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVXBkYXRlQ29tcG9uZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBwcm90ZWN0ZWQgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgY29tcG9uZW50TmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBJRmlsZSBmaWxlOwotCi0gIHB1YmxpYyBVcGRhdGVDb21wb25lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2UsIElGaWxlIGZpbGUpCi0gIHsKLSAgICB0aGlzLmNvbmNyZXRlQ29tcG9uZW50ID0gY29uY3JldGVDb21wb25lbnQ7Ci0gICAgdGhpcy5jb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKLSAgICB0aGlzLmNvbXBvbmVudE5hbWVzcGFjZSA9IGNvbXBvbmVudE5hbWVzcGFjZTsKLSAgICB0aGlzLmZpbGUgPSBmaWxlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRENvbXBvbmVudCBjb21wdXRlQ29tcG9uZW50KCkKLSAgewotICAgIFhTRENvbXBvbmVudCByZXN1bHQgPSBudWxsOwotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKTsKLSAgICBYU0RTY2hlbWFEaXJlY3RpdmUgZGlyZWN0aXZlID0gbnVsbDsKLQotICAgIC8vIGxldHMgc2VlIGlmIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgdmlzaWJsZSB0byBvdXIgc2NoZW1hCi0gICAgcmVzdWx0ID0gZ2V0RGVmaW5lZENvbXBvbmVudChzY2hlbWEsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWVzcGFjZSk7Ci0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIFRPRE8gKGNzKSB3ZSBuZWVkIHRvIHByb3ZpZGUgYSBzZXBhcmF0ZSBjb21tYW5kIHRvIGRvIHRoaXMgcGFydAotICAgICAgLy8KLSAgICAgIC8vIGFwcGFyZW50bHkgdGhlIGVsZW1lbnQgaXMgbm90IHlldCB2aXNpYmxlLCB3ZSBuZWVkIHRvIGFkZAotICAgICAgLy8gaW5jbHVkZXMvaW1wb3J0cyB0byBnZXQgdG8gaXQKLSAgICAgIGlmIChjb21wb25lbnROYW1lc3BhY2UgIT0gbnVsbCAmJiBjb21wb25lbnROYW1lc3BhY2UuZXF1YWxzKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICB7Ci0gICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIGFuIGluY2x1ZGUKLSAgICAgICAgLy8gaWYgdGhlIGNvbXBvbmVudCdzIG5hbWVzcGFjZSBpcyBub3QgbnVsbCBhbmQgbWF0Y2hlcyB0aGUgc2NoZW1hJ3MKLSAgICAgICAgLy8gdGFyZ2V0IG5hbWVzcGFjZQotICAgICAgICBkaXJlY3RpdmUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RJbmNsdWRlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wb25lbnROYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gd2UgbmVlZCB0byBhZGQgYW4gaW5jbHVkZQotICAgICAgICAvLyBpZiB0aGUgY29tcG9uZW50J3MgbmFtZXNwYWNlIGlzIG51bGwsIHRoZW4gd2UgY2FuIGp1c3QgYWRkIGl0Ci0gICAgICAgIC8vIG9ubHkgaWYgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIGlzIG5vdCBudWxsCi0gICAgICAgIGRpcmVjdGl2ZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREluY2x1ZGUoKTsKLQotICAgICAgICAvLyB3ZSBoYXZlIHRvIGVuc3VyZSB0aGUgc2NoZW1hIGZvciBzY2hlbWEgcHJlZml4IGlzIE5PVCBudWxsCi0gICAgICAgIGlmIChzY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHRhcmdldE5TID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgIGlmICh0YXJnZXROUyA9PSBudWxsKQotICAgICAgICAgICAgdGFyZ2V0TlMgPSAiIjsKLSAgICAgICAgICAvLyB0aGlzIHdpbGwganVzdCB1cGRhdGUgdGhlIHNjaGVtYSBmb3Igc2NoZW1hIHByZWZpeCB0byBiZSwgc2F5LCB4c2QKLSAgICAgICAgICBVcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQoIiIsIHNjaGVtYSwgIiIsIHRhcmdldE5TKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkZCBhbiBpbXBvcnQKLSAgICAgICAgWFNESW1wb3J0IHhzZEltcG9ydCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREltcG9ydCgpOwotICAgICAgICB4c2RJbXBvcnQuc2V0TmFtZXNwYWNlKGNvbXBvbmVudE5hbWVzcGFjZSk7Ci0gICAgICAgIGRpcmVjdGl2ZSA9IHhzZEltcG9ydDsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIGxvY2F0aW9uID0gY29tcHV0ZU5pY2VMb2NhdGlvbihzY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKSwgZmlsZSk7Ci0gICAgICBkaXJlY3RpdmUuc2V0U2NoZW1hTG9jYXRpb24obG9jYXRpb24pOwotICAgICAgLy8gVE9ETyAoY3MpIHdlIHNob3VsZCBhdCB0aGUgZGlyZWN0aXZlICduZXh0JyBpbiB0aGUgbGlzdCBvZiBkaXJlY3RpdmVzCi0gICAgICAvLyBmb3Igbm93IEknbSBqdXN0IGFkZGluZyBhcyB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIHNjaGVtYSA6LSgKLSAgICAgIC8vCi0gICAgICBzY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoMCwgZGlyZWN0aXZlKTsKLSAgICAgIFhTRFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IGRpcmVjdGl2ZS5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgaWYgKHJlc29sdmVkU2NoZW1hID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwbGF0Zm9ybUxvY2F0aW9uID0gInBsYXRmb3JtOi9yZXNvdXJjZSIgKyBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIFJlc291cmNlIHJlc291cmNlID0gY29uY3JldGVDb21wb25lbnQuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHBsYXRmb3JtTG9jYXRpb24pKTsKLSAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgWFNEUmVzb3VyY2VJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzb3VyY2UubG9hZChudWxsKTsKLSAgICAgICAgICAgIFhTRFJlc291cmNlSW1wbCByZXNvdXJjZUltcGwgPSAoWFNEUmVzb3VyY2VJbXBsKSByZXNvdXJjZTsKLSAgICAgICAgICAgIHJlc29sdmVkU2NoZW1hID0gcmVzb3VyY2VJbXBsLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRpcmVjdGl2ZS5zZXRSZXNvbHZlZFNjaGVtYShyZXNvbHZlZFNjaGVtYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0RGVmaW5lZENvbXBvbmVudChyZXNvbHZlZFNjaGVtYSwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZXNwYWNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETyAoY3MpIGNvbnNpZGVyIHNldHRpbmcgc29tZSBlcnJvciBzdGF0ZSBzbyB0aGF0IHRoZSBjbGllbnQgY2FuCi0gICAgICAgIC8vIHByb3ZpZGUgYSBwb3AtZGlhbG9nIGVycm9yCi0gICAgICAgIC8vIHdlIHNob3VsZCBhbHNvIHJlbW92ZSB0aGUgaW1wb3J0L2luY2x1ZGUgc28gc2F2ZSBmcm9tIGNsdXR0ZXJpbmcKLSAgICAgICAgLy8gdGhlIGZpbGUgd2l0aCBib2d1cyBkaXJlY3RpdmVzCi0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMQVRGT1JNX1JFU09VUkNFX1BSRUZJWCA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiOwotICBwcml2YXRlIFN0cmluZyBjb21wdXRlTmljZUxvY2F0aW9uKFN0cmluZyBiYXNlTG9jYXRpb24sIElGaWxlIGZpbGUpCi0gIHsgICAgIAotICAgIGlmIChiYXNlTG9jYXRpb24uc3RhcnRzV2l0aChQTEFURk9STV9SRVNPVVJDRV9QUkVGSVgpKQotICAgIHsKLSAgICAgIFVSSSBiYXNlVVJJID0gVVJJLmNyZWF0ZVVSSShiYXNlTG9jYXRpb24pOwotICAgICAgVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgICBVUkkgcmVsYXRpdmUgPSBmaWxlVVJJLmRlcmVzb2x2ZShiYXNlVVJJLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7ICAgICAgCi0gICAgICByZXR1cm4gcmVsYXRpdmUudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFVSSSBiYXNlVVJJID0gVVJJLmNyZWF0ZVVSSShiYXNlTG9jYXRpb24pOyAgICAgICAgICAKLSAgICAgIFVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0gICAgICBVUkkgcmVsYXRpdmUgPSBmaWxlVVJJLmRlcmVzb2x2ZShiYXNlVVJJLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7ICAgICAKLSAgICAgIHJldHVybiByZWxhdGl2ZS50b1N0cmluZygpOyAgICAKLSAgICB9IAotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IFhTRENvbXBvbmVudCBnZXREZWZpbmVkQ29tcG9uZW50KFhTRFNjaGVtYSBzY2hlbWEsIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlKTsKLQotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb250ZW50TW9kZWxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb250ZW50TW9kZWxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YTU2MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQ29udGVudE1vZGVsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVDb250ZW50TW9kZWxDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwOwotICBYU0RDb21wb3NpdG9yIG9sZFhTRENvbXBvc2l0b3IsIG5ld1hTRENvbXBvc2l0b3I7Ci0gIAotICAKLSAgcHVibGljIFVwZGF0ZUNvbnRlbnRNb2RlbENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAsIFhTRENvbXBvc2l0b3IgeHNkQ29tcG9zaXRvcikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZE1vZGVsR3JvdXAgPSB4c2RNb2RlbEdyb3VwOwotICAgIHRoaXMubmV3WFNEQ29tcG9zaXRvciA9IHhzZENvbXBvc2l0b3I7Ci0gICAgdGhpcy5vbGRYU0RDb21wb3NpdG9yID0geHNkTW9kZWxHcm91cC5nZXRDb21wb3NpdG9yKCk7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgICBiZWdpblJlY29yZGluZyh4c2RNb2RlbEdyb3VwLmdldEVsZW1lbnQoKSk7Ci0gICAgICB4c2RNb2RlbEdyb3VwLnNldENvbXBvc2l0b3IobmV3WFNEQ29tcG9zaXRvcik7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgICB4c2RNb2RlbEdyb3VwLnNldENvbXBvc2l0b3Iob2xkWFNEQ29tcG9zaXRvcik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUVsZW1lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlRWxlbWVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YWViNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlRWxlbWVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRERpcmVjdGl2ZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZCBleHRlbmRzIFVwZGF0ZUNvbXBvbmVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kCi17Ci0gIHB1YmxpYyBVcGRhdGVFbGVtZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQsIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlLCBJRmlsZSBmaWxlKQotICB7Ci0gICAgc3VwZXIoY29uY3JldGVDb21wb25lbnQsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWVzcGFjZSwgZmlsZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNEQ29tcG9uZW50IGdldERlZmluZWRDb21wb25lbnQoWFNEU2NoZW1hIHNjaGVtYSwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2UpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gc2NoZW1hLnJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24oY29tcG9uZW50TmFtZXNwYWNlLCBjb21wb25lbnROYW1lKTsKLSAgICBpZiAocmVzdWx0LmVDb250YWluZXIoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbmNyZXRlQ29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RDb21wb25lbnQgZWxlbWVudERlZiA9IGNvbXB1dGVDb21wb25lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50RGVmICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlRWxlbWVudFJlZmVyZW5jZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0UsIChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGNvbmNyZXRlQ29tcG9uZW50LAotICAgICAgICAgICAgKFhTREVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudERlZik7Ci0gICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlRWxlbWVudFJlZmVyZW5jZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUVsZW1lbnRSZWZlcmVuY2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YjUyNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlRWxlbWVudFJlZmVyZW5jZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVFbGVtZW50UmVmZXJlbmNlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50LCByZWY7Ci0KLSAgcHVibGljIFVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQsIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZWYpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB0aGlzLnJlZiA9IHJlZjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoZWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAgICAgZWxlbWVudC5zZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbihyZWYpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTWF4T2NjdXJzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTWF4T2NjdXJzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTU5ZWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU1heE9jY3Vyc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotCXByaXZhdGUgaW50IG9sZE1heE9jY3VyczsKLQlwcml2YXRlIGludCBuZXdNYXhPY2N1cnM7Ci0gIHByaXZhdGUgYm9vbGVhbiByZW1vdmVNYXhPY2N1cnNBdHRyaWJ1dGU7Ci0JCi0JWFNEUGFydGljbGUgcGFydGljbGU7Ci0KLSAgcHVibGljIFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSwgaW50IE1heE9jY3VycykKLQl7Ci0JCXN1cGVyKGxhYmVsKTsKLQkJdGhpcy5uZXdNYXhPY2N1cnMgPSBNYXhPY2N1cnM7Ci0JCXRoaXMucGFydGljbGUgPSBwYXJ0aWNsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0JewotICAgIHRyeQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHBhcnRpY2xlLmdldEVsZW1lbnQoKTsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgcmVtb3ZlTWF4T2NjdXJzQXR0cmlidXRlID0gKCEoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUpKSk/IHRydWU6IGZhbHNlOwotCQkgIG9sZE1heE9jY3VycyA9IHBhcnRpY2xlLmdldE1heE9jY3VycygpOwotCQkgIHBhcnRpY2xlLnNldE1heE9jY3VycyhuZXdNYXhPY2N1cnMpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWRvKCkKLQl7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdW5kbygpCi0JewotICAgIGlmIChyZW1vdmVNYXhPY2N1cnNBdHRyaWJ1dGUpCi0gICAgewotICAgICAgcGFydGljbGUudW5zZXRNYXhPY2N1cnMoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkJICBwYXJ0aWNsZS5zZXRNYXhPY2N1cnMob2xkTWF4T2NjdXJzKTsKLSAgICB9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTWluT2NjdXJzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTWluT2NjdXJzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTMxNzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWluT2NjdXJzQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHByaXZhdGUgaW50IG9sZE1pbk9jY3VyczsKLSAgcHJpdmF0ZSBpbnQgbmV3TWluT2NjdXJzOwotICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlTWluT2NjdXJzQXR0cmlidXRlOwotCi0gIFhTRENvbXBvbmVudCBjb21wb25lbnQ7Ci0KLSAgcHVibGljIFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb21wb25lbnQgY29tcG9uZW50LCBpbnQgbWluT2NjdXJzKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMubmV3TWluT2NjdXJzID0gbWluT2NjdXJzOwotICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBjb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgcmVtb3ZlTWluT2NjdXJzQXR0cmlidXRlID0gKCEoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpKSkgPyB0cnVlIDogZmFsc2U7Ci0KLSAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgb2xkTWluT2NjdXJzID0gKChYU0RQYXJ0aWNsZSkgY29tcG9uZW50KS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgKChYU0RQYXJ0aWNsZSkgY29tcG9uZW50KS5zZXRNaW5PY2N1cnMobmV3TWluT2NjdXJzKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgb2xkTWluT2NjdXJzID0gKCgoWFNEQXR0cmlidXRlVXNlKSBjb21wb25lbnQpLmdldFVzZSgpID09IFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5LlJFUVVJUkVEX0xJVEVSQUwgPyAxIDogMCk7Ci0gICAgICAgIGlmIChuZXdNaW5PY2N1cnMgPT0gMSkKLSAgICAgICAgICAoKFhTREF0dHJpYnV0ZVVzZSkgY29tcG9uZW50KS5zZXRVc2UoWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkuUkVRVUlSRURfTElURVJBTCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAoKFhTREF0dHJpYnV0ZVVzZSkgY29tcG9uZW50KS5zZXRVc2UoWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkuT1BUSU9OQUxfTElURVJBTCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICB7Ci0gICAgICBpZiAocmVtb3ZlTWluT2NjdXJzQXR0cmlidXRlKQotICAgICAgewotICAgICAgICAoKFhTRFBhcnRpY2xlKSBjb21wb25lbnQpLnVuc2V0TWluT2NjdXJzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICgoWFNEUGFydGljbGUpIGNvbXBvbmVudCkuc2V0TWluT2NjdXJzKG9sZE1pbk9jY3Vycyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICB7Ci0gICAgICBpZiAocmVtb3ZlTWluT2NjdXJzQXR0cmlidXRlKQotICAgICAgewotICAgICAgICAoKFhTRFBhcnRpY2xlKSBjb21wb25lbnQpLnVuc2V0TWluT2NjdXJzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChvbGRNaW5PY2N1cnMgPT0gMSkKLSAgICAgICAgICAoKFhTREF0dHJpYnV0ZVVzZSkgY29tcG9uZW50KS5zZXRVc2UoWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkuUkVRVUlSRURfTElURVJBTCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAoKFhTREF0dHJpYnV0ZVVzZSkgY29tcG9uZW50KS5zZXRVc2UoWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkuT1BUSU9OQUxfTElURVJBTCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVOYW1lQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTmFtZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMwYTdjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVOYW1lQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVSZWZhY3RvcmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlBlcmZvcm1VbnNhdmVkUmVmYWN0b3JpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlhNTFJlZmFjdG9yaW5nQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLlJlbmFtZUNvbXBvbmVudFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlTmFtZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotLy8gIHByaXZhdGUgU3RyaW5nIG9sZE5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIG5ld05hbWU7Ci0gIHByaXZhdGUgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50OwotCi0gIHB1YmxpYyBVcGRhdGVOYW1lQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0KLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uICYmIGNvbXBvbmVudC5nZXROYW1lKCkgPT0gbnVsbCAmJiBjb21wb25lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQgJiYgKChYU0ROYW1lZENvbXBvbmVudCkgY29tcG9uZW50LmVDb250YWluZXIoKSkuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgewotICAgICAgY29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KSBjb21wb25lbnQuZUNvbnRhaW5lcigpOwotICAgIH0KLQotICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotICAgIHRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0vLyAgICB0aGlzLm9sZE5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCNleGVjdXRlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoY29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICByZW5hbWVDb21wb25lbnQobmV3TmFtZSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQZXJmb3JtcyBhIHJlbmFtZSByZWZhY3RvcmluZyB0byByZW5hbWUgdGhlIGNvbXBvbmVudCBhbmQgYWxsIHRoZQotICAgKiByZWZlcmVuY2VzIHRvIGl0IHdpdGhpbiB0aGUgY3VycmVudCBzY2hlbWEuCi0gICAqIAotICAgKiBAcGFyYW0gbmV3TmFtZSB0aGUgbmV3IGNvbXBvbmVudCBuYW1lLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHJlbmFtZUNvbXBvbmVudChTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIC8vIHRoaXMgaXMgYSAnZ2xvYmFsbHknIGRlZmluZWQgY29tcG9uZW50IChlLmcuIGdsb2JhbCBlbGVtZW50KSAgICAKLSAgICBpZiAoY29tcG9uZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBpZiAocGFnZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBSZWZhY3RvcmluZ0NvbXBvbmVudCByZWZhY3RvcmluZ0NvbXBvbmVudCA9IG5ldyBYTUxSZWZhY3RvcmluZ0NvbXBvbmVudCgKLSAgICAgICAgICAgICAgY29tcG9uZW50LAotICAgICAgICAgICAgICAoSURPTUVsZW1lbnQpY29tcG9uZW50LmdldEVsZW1lbnQoKSwgCi0gICAgICAgICAgICAgIGNvbXBvbmVudC5nZXROYW1lKCksCi0gICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0KLSAgICAgICAgICAgIFJlbmFtZUNvbXBvbmVudFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yKHJlZmFjdG9yaW5nQ29tcG9uZW50LCBuZXdOYW1lLCB0cnVlKTsgICAgCi0gICAgICAgICAgICBSZW5hbWVSZWZhY3RvcmluZyByZWZhY3RvcmluZyA9IG5ldyBSZW5hbWVSZWZhY3RvcmluZyhwcm9jZXNzb3IpOwotICAgICAgICAgICAgUGVyZm9ybVVuc2F2ZWRSZWZhY3RvcmluZ09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgUGVyZm9ybVVuc2F2ZWRSZWZhY3RvcmluZ09wZXJhdGlvbihyZWZhY3RvcmluZyk7Ci0gICAgICAgICAgICBvcGVyYXRpb24ucnVuKG51bGwpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gV2UgY2FuJ3QgcmVmYWN0b3IgcmVuYW1lIGV4dGVybmFsIGZpbGVzCi0gICAgICAgICAgICBjb21wb25lbnQuc2V0TmFtZShuZXdOYW1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IAotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyB0aGlzIGlzIGEgJ2xvY2FsbHknIGRlZmluZWQgY29tcG9uZW50IChlLmcuIGxvY2FsIGVsZW1lbnQpCi0gICAgICAvLyBubyBuZWVkIHRvIGNhbGwgcmVmYWN0b3Jpbmcgc2luY2UgdGhpcyBjb21wb25lbnQgY2FuJ3QgYmUgcmVmZXJlbmNlZCAgICAgIAotICAgICAgY29tcG9uZW50LnNldE5hbWUobmV3TmFtZSk7Ci0gICAgfSAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTmFtZXNwYWNlSW5mb3JtYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWZkZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTmFtZXNwYWNlSW5mb3JtYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTENoYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubnNlZGl0LlRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgcHJvdGVjdGVkIFN0cmluZyBuZXdQcmVmaXgsIG5ld1RhcmdldE5hbWVzcGFjZTsKLSAgCi0gIHB1YmxpYyBVcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgbmV3UHJlZml4LCBTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICAgIHRoaXMubmV3UHJlZml4ID0gbmV3UHJlZml4OwotICAgIHRoaXMubmV3VGFyZ2V0TmFtZXNwYWNlID0gbmV3VGFyZ2V0TmFtZXNwYWNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBlbnN1cmVTY2hlbWFFbGVtZW50KHhzZFNjaGVtYSk7Ci0gICAgCi0gICAgRWxlbWVudCBlbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvL0RvY3VtZW50SW1wbCBkb2MgPSAoRG9jdW1lbnRJbXBsKSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQotICAgICAgU3RyaW5nIG1vZGVsVGFyZ2V0TmFtZXNwYWNlID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgU3RyaW5nIG9sZE5hbWVzcGFjZSA9IHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgICBTdHJpbmcgb2xkUHJlZml4ID0gaGVscGVyLmdldFByZWZpeChlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSksIGZhbHNlKTsKLQotICAgICAgaWYgKG1vZGVsVGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsVGFyZ2V0TmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZS50cmltKCk7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gbmV3UHJlZml4LnRyaW0oKTsKLQotICAgICAgaWYgKCF2YWxpZGF0ZVByZWZpeChwcmVmaXgpIHx8ICF2YWxpZGF0ZVRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpKQotICAgICAgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwICYmIHRhcmdldE5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgICAvLyBjYW4ndCBoYXZlIGJsYW5rIHRhcmdldG5hbWVzcGFjZSBhbmQgeWV0IHNwZWNpZnkgYSBwcmVmaXgKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvL2RvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UQVJHRVROQU1FU1BBQ0VfQ0hBTkdFIikpOyAvLyROT04tTkxTLTEkCi0gICAgICBiZWdpblJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIAotICAgICAgU3RyaW5nIHhzZEZvclhTRFByZWZpeCA9IHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpOwotICAgICAgTWFwIG1hcCA9IHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0KLSAgICAgIC8vIENoZWNrIGlmIHByZWZpeCBpcyBibGFuawotICAgICAgLy8gaWYgaXQgaXMsIHRoZW4gbWFrZSBzdXJlIHdlIGhhdmUgYSBwcmVmaXgKLSAgICAgIC8vIGZvciBzY2hlbWEgZm9yIHNjaGVtYQotICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgICAvLyBpZiBwcmVmaXggZm9yIHNjaGVtYSBmb3Igc2NoZW1hIGlzIGJsYW5rCi0gICAgICAgIC8vIHRoZW4gc2V0IGl0IHRvIHZhbHVlIHNwZWNpZmllZCBpbiBwcmVmZXJlbmNlCi0gICAgICAgIC8vIGFuZCB1cGRhdGUgQUxMIG5vZGVzIHdpdGggdGhpcyBwcmVmaXgKLSAgICAgICAgaWYgKHhzZEZvclhTRFByZWZpeCA9PSBudWxsIHx8ICh4c2RGb3JYU0RQcmVmaXggIT0gbnVsbCAmJiB4c2RGb3JYU0RQcmVmaXgudHJpbSgpLmxlbmd0aCgpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gZ2V0IHByZWZlcmVuY2UgcHJlZml4Ci0gICAgICAgICAgeHNkRm9yWFNEUHJlZml4ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhNTFNjaGVtYVByZWZpeCgpOwotICAgICAgICAgIC8vIGdldCBhIHVuaXF1ZSBwcmVmaXggYnkgY2hlY2tpbmcgd2hhdCdzIGluIHRoZSBtYXAKLQotICAgICAgICAgIHhzZEZvclhTRFByZWZpeCA9IGdldFVuaXF1ZVNjaGVtYUZvclNjaGVtYVByZWZpeCh4c2RGb3JYU0RQcmVmaXgsIG1hcCk7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyB4c2RGb3JYU0RQcmVmaXgsIFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgIHVwZGF0ZUFsbE5vZGVzKGVsZW1lbnQsIHhzZEZvclhTRFByZWZpeCk7Ci0KLSAgICAgICAgICAvLyByZW1vdmUgdGhlIG9sZCB4bWxucyBhdHRyaWJ1dGUgZm9yIHRoZSBzY2hlbWEgZm9yIHNjaGVtYQotICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgieG1sbnMiKSAgJiYgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBlbGVtZW50LmdldEF0dHJpYnV0ZSgieG1sbnMiKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxucyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UubGVuZ3RoKCkgPiAwIHx8ICh0YXJnZXROYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCAmJiBwcmVmaXgubGVuZ3RoKCkgPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIC8vIGNsZWFuIHVwIHRoZSBvbGQgcHJlZml4IGZvciB0aGlzIHNjaGVtYQotICAgICAgICBpZiAob2xkUHJlZml4ICE9IG51bGwgJiYgb2xkUHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxuczoiICsgb2xkUHJlZml4KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIC8vIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4LCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgIC8vIGphdmEudXRpbC5NYXAgcHJlZml4VG9OYW1lU3BhY2VNYXAgPQotICAgICAgICAgIC8vIHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgICAgLy8gcHJlZml4VG9OYW1lU3BhY2VNYXAucmVtb3ZlKG9sZFByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAvLyBpZiBubyBwcmVmaXgKLSAgICAgICAgewotICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgieG1sbnMiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghZWxlbWVudC5nZXRBdHRyaWJ1dGUoInhtbG5zIikuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInhtbG5zIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGlmICghbW9kZWxUYXJnZXROYW1lc3BhY2UuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBub3cgc2V0IHRoZSBuZXcgeG1sbnM6cHJlZml4IGF0dHJpYnV0ZQotICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4LCB0YXJnZXROYW1lc3BhY2UpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zIiwgdGFyZ2V0TmFtZXNwYWNlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIC8vIHNldCB0aGUgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgLy8gZWxzZSB0YXJnZXROYW1lc3BhY2UgaXMgYmxhbmsKLSAgICAgIHsKLSAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIGRvIG91ciBvd24gcmVmZXJlbnRpYWwgaW50ZWdyaXR5Ci0gICAgICBUYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyIHRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIgPSBuZXcgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcih4c2RTY2hlbWEsIG9sZE5hbWVzcGFjZSwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgIHRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIucmVzb2x2ZSgpOwotCi0gICAgICB1cGRhdGVFbGVtZW50KHhzZFNjaGVtYSk7Ci0KLSAgICAgIC8vZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotICAKLSAgLy8gaXNzdWUgKGNzKSBJIGRvbid0IGhhdmUgYSBjbHVlIHdoeSB3ZSBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QKLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVFbGVtZW50KFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGNvbmNyZXRlQ29tcC51cGRhdGVFbGVtZW50KCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGNvbnRhaW5tZW50cyA9IGNvbmNyZXRlQ29tcC5lQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGNvbnRhaW5tZW50cy5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgRVJlZmVyZW5jZSBlUmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpY29udGFpbm1lbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKGVSZWZlcmVuY2UuaXNDb250YWlubWVudCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGVSZWZlcmVuY2UuaXNNYW55KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBvYmplY3RzID0gKChDb2xsZWN0aW9uKWNvbmNyZXRlQ29tcC5lR2V0KGVSZWZlcmVuY2UpKS5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudClvYmplY3RzLm5leHQoKTsKLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4c2RDb25jcmV0ZUNvbXBvbmVudC51cGRhdGVFbGVtZW50KCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KWNvbmNyZXRlQ29tcC5lR2V0KGVSZWZlcmVuY2UpOwotICAgICAgICAgICAgaWYgKHhzZENvbmNyZXRlQ29tcG9uZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeHNkQ29uY3JldGVDb21wb25lbnQudXBkYXRlRWxlbWVudCgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgICAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZVNjaGVtYUZvclNjaGVtYVByZWZpeChTdHJpbmcgeHNkRm9yWFNEUHJlZml4LCBNYXAgbWFwKQotICB7Ci0gICAgaWYgKHhzZEZvclhTRFByZWZpeCA9PSBudWxsIHx8ICh4c2RGb3JYU0RQcmVmaXggIT0gbnVsbCAmJiB4c2RGb3JYU0RQcmVmaXgudHJpbSgpLmxlbmd0aCgpID09IDApKQotICAgIHsKLSAgICAgIHhzZEZvclhTRFByZWZpeCA9ICJ4c2QiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIC8vIGVuc3VyZSBwcmVmaXggaXMgdW5pcXVlCi0gICAgaW50IHByZWZpeEV4dGVuc2lvbiA9IDE7Ci0gICAgd2hpbGUgKG1hcC5jb250YWluc0tleSh4c2RGb3JYU0RQcmVmaXgpICYmIHByZWZpeEV4dGVuc2lvbiA8IDEwMCkKLSAgICB7Ci0gICAgICB4c2RGb3JYU0RQcmVmaXggPSB4c2RGb3JYU0RQcmVmaXggKyBTdHJpbmcudmFsdWVPZihwcmVmaXhFeHRlbnNpb24pOwotICAgICAgcHJlZml4RXh0ZW5zaW9uKys7Ci0gICAgfQotICAgIHJldHVybiB4c2RGb3JYU0RQcmVmaXg7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlQWxsTm9kZXMoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgZWxlbWVudC5zZXRQcmVmaXgocHJlZml4KTsKLSAgICBOb2RlTGlzdCBsaXN0ID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBjaGlsZCA9IGxpc3QuaXRlbShpKTsKLSAgICAgICAgaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgY2hpbGQuc2V0UHJlZml4KHByZWZpeCk7Ci0gICAgICAgICAgaWYgKGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cGRhdGVBbGxOb2RlcygoRWxlbWVudCkgY2hpbGQsIHByZWZpeCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlVGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBucykKLSAgewotICAgIC8vIHdpbGwgYWxsb3cgYmxhbmsgbmFtZXNwYWNlICEhCi0gICAgaWYgKG5zLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkkgdGVzdFVSSSA9IG5ldyBVUkkobnMpOwotICAgICAgdGVzdFVSSS5pc0Fic29sdXRlKCk7Ci0gICAgfQotICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlcnJvck1lc3NhZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfV0FSTl9JTlZBTElEX1RBUkdFVF9OQU1FU1BBQ0UiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIGlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCB8fCBlcnJvck1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVByZWZpeChTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5lcXVhbHMoIiIpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKHByZWZpeCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZG8oKQotICB7Ci0gICAgZXhlY3V0ZSgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjVjZWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4RXhjbHVzaXZlRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1heEluY2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5FeGNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluSW5jbHVzaXZlRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGU7Ci0gIFN0cmluZyBtYXgsIG1pbjsKLSAgYm9vbGVhbiBpbmNsdWRlTWluLCBpbmNsdWRlTWF4OwotICBwcml2YXRlIGJvb2xlYW4gZG9VcGRhdGVNYXggPSBmYWxzZSwgZG9VcGRhdGVNaW4gPSBmYWxzZTsKLSAgWFNETWluSW5jbHVzaXZlRmFjZXQgbWluSW5jbHVzaXZlRmFjZXQ7Ci0gIFhTRE1pbkV4Y2x1c2l2ZUZhY2V0IG1pbkV4Y2x1c2l2ZUZhY2V0OwotICBYU0RNYXhJbmNsdXNpdmVGYWNldCBtYXhJbmNsdXNpdmVGYWNldDsKLSAgWFNETWF4RXhjbHVzaXZlRmFjZXQgbWF4RXhjbHVzaXZlRmFjZXQ7Ci0KLQotICBwdWJsaWMgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGUsIGJvb2xlYW4gaW5jbHVkZU1pbiwgYm9vbGVhbiBpbmNsdWRlTWF4KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkU2ltcGxlVHlwZSA9IHhzZFNpbXBsZVR5cGU7Ci0gICAgdGhpcy5pbmNsdWRlTWluID0gaW5jbHVkZU1pbjsKLSAgICB0aGlzLmluY2x1ZGVNYXggPSBpbmNsdWRlTWF4OwotICAgIAotICAgIG1pbkluY2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNaW5JbmNsdXNpdmVGYWNldCgpOwotICAgIG1pbkV4Y2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNaW5FeGNsdXNpdmVGYWNldCgpOwotICAgIG1heEluY2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNYXhJbmNsdXNpdmVGYWNldCgpOwotICAgIG1heEV4Y2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNYXhFeGNsdXNpdmVGYWNldCgpOwotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNaW4oU3RyaW5nIG1pbikKLSAgewotICAgIHRoaXMubWluID0gbWluOwotICAgIGRvVXBkYXRlTWluID0gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWF4KFN0cmluZyBtYXgpCi0gIHsKLSAgICB0aGlzLm1heCA9IG1heDsKLSAgICBkb1VwZGF0ZU1heCA9IHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHhzZFNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpKTsKLQotICAgICAgaWYgKGRvVXBkYXRlTWluKQotICAgICAgewotICAgICAgICBpZiAoaW5jbHVkZU1pbikKLSAgICAgICAgewotICAgICAgICAgIGlmIChtaW5JbmNsdXNpdmVGYWNldCA9PSBudWxsICYmIG1pbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1pbkluY2x1c2l2ZUZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWluSW5jbHVzaXZlRmFjZXQoKTsKLSAgICAgICAgICAgIG1pbkluY2x1c2l2ZUZhY2V0LnNldExleGljYWxWYWx1ZShtaW4pOwotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1pbkluY2x1c2l2ZUZhY2V0KTsKLQotICAgICAgICAgICAgaWYgKG1pbkV4Y2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtaW5FeGNsdXNpdmVGYWNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG1pbkluY2x1c2l2ZUZhY2V0ICE9IG51bGwgJiYgbWluICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWluSW5jbHVzaXZlRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1pbik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG1pbkluY2x1c2l2ZUZhY2V0ICE9IG51bGwgJiYgbWluID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1pbkluY2x1c2l2ZUZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAvLyAhaW5jbHVkZU1pbgotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1pbkV4Y2x1c2l2ZUZhY2V0ID09IG51bGwgJiYgbWluICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWluRXhjbHVzaXZlRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNaW5FeGNsdXNpdmVGYWNldCgpOwotICAgICAgICAgICAgbWluRXhjbHVzaXZlRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1pbik7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWluRXhjbHVzaXZlRmFjZXQpOwotCi0gICAgICAgICAgICBpZiAobWluSW5jbHVzaXZlRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1pbkluY2x1c2l2ZUZhY2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobWluRXhjbHVzaXZlRmFjZXQgIT0gbnVsbCAmJiBtaW4gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtaW5FeGNsdXNpdmVGYWNldC5zZXRMZXhpY2FsVmFsdWUobWluKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobWluRXhjbHVzaXZlRmFjZXQgIT0gbnVsbCAmJiBtaW4gPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWluRXhjbHVzaXZlRmFjZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoZG9VcGRhdGVNYXgpCi0gICAgICB7Ci0gICAgICAgIGlmIChpbmNsdWRlTWF4KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1heEluY2x1c2l2ZUZhY2V0ID09IG51bGwgJiYgbWF4ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWF4SW5jbHVzaXZlRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNYXhJbmNsdXNpdmVGYWNldCgpOwotICAgICAgICAgICAgbWF4SW5jbHVzaXZlRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1heCk7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWF4SW5jbHVzaXZlRmFjZXQpOwotCi0gICAgICAgICAgICBpZiAobWF4RXhjbHVzaXZlRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1heEV4Y2x1c2l2ZUZhY2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobWF4SW5jbHVzaXZlRmFjZXQgIT0gbnVsbCAmJiBtYXggIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXhJbmNsdXNpdmVGYWNldC5zZXRMZXhpY2FsVmFsdWUobWF4KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobWF4SW5jbHVzaXZlRmFjZXQgIT0gbnVsbCAmJiBtYXggPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWF4SW5jbHVzaXZlRmFjZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIC8vICFpbmNsdWRlTWF4Ci0gICAgICAgIHsKLSAgICAgICAgICBpZiAobWF4RXhjbHVzaXZlRmFjZXQgPT0gbnVsbCAmJiBtYXggIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXhFeGNsdXNpdmVGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1heEV4Y2x1c2l2ZUZhY2V0KCk7Ci0gICAgICAgICAgICBtYXhFeGNsdXNpdmVGYWNldC5zZXRMZXhpY2FsVmFsdWUobWF4KTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtYXhFeGNsdXNpdmVGYWNldCk7Ci0KLSAgICAgICAgICAgIGlmIChtYXhJbmNsdXNpdmVGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWF4SW5jbHVzaXZlRmFjZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChtYXhFeGNsdXNpdmVGYWNldCAhPSBudWxsICYmIG1heCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1heEV4Y2x1c2l2ZUZhY2V0LnNldExleGljYWxWYWx1ZShtYXgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChtYXhFeGNsdXNpdmVGYWNldCAhPSBudWxsICYmIG1heCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtYXhFeGNsdXNpdmVGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZvcm1hdENoaWxkKHhzZFNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVTdHJpbmdMZW5ndGhGYWNldENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWU3OGU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RMZW5ndGhGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4TGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1pbkxlbmd0aEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGU7Ci0gIFN0cmluZyBtYXgsIG1pbjsKLSAgcHJpdmF0ZSBib29sZWFuIGRvVXBkYXRlTWF4ID0gZmFsc2UsIGRvVXBkYXRlTWluID0gZmFsc2U7Ci0KLSAgcHVibGljIFVwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGUpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTaW1wbGVUeXBlID0geHNkU2ltcGxlVHlwZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWluKFN0cmluZyBtaW4pCi0gIHsKLSAgICB0aGlzLm1pbiA9IG1pbjsKLSAgICBkb1VwZGF0ZU1pbiA9IHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1heChTdHJpbmcgbWF4KQotICB7Ci0gICAgdGhpcy5tYXggPSBtYXg7Ci0gICAgZG9VcGRhdGVNYXggPSB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHhzZFNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTRExlbmd0aEZhY2V0IGxlbmd0aEZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRFZmZlY3RpdmVMZW5ndGhGYWNldCgpOwotICAgICAgWFNETWluTGVuZ3RoRmFjZXQgbWluTGVuZ3RoRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldEVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0KCk7Ci0gICAgICBYU0RNYXhMZW5ndGhGYWNldCBtYXhMZW5ndGhGYWNldCA9IHhzZFNpbXBsZVR5cGUuZ2V0RWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQoKTsKLQotICAgICAgU3RyaW5nIGN1cnJlbnRMZW5ndGggPSBudWxsLCBjdXJyZW50TWluID0gbnVsbCwgY3VycmVudE1heCA9IG51bGw7Ci0gICAgICBpZiAobGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY3VycmVudExlbmd0aCA9IGxlbmd0aEZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgICAgfQotICAgICAgaWYgKG1pbkxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRNaW4gPSBtaW5MZW5ndGhGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgIH0KLSAgICAgIGlmIChtYXhMZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgewotICAgICAgICBjdXJyZW50TWF4ID0gbWF4TGVuZ3RoRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkb1VwZGF0ZU1heCAmJiAhZG9VcGRhdGVNaW4pCi0gICAgICB7Ci0gICAgICAgIGlmIChtYXhMZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1heCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtYXguZXF1YWxzKGN1cnJlbnRNaW4pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRExlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICAgIGxlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShtYXgpOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWF4TGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWluTGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShsZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKG1pbkxlbmd0aEZhY2V0ID09IG51bGwgJiYgY3VycmVudExlbmd0aCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNaW5MZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgICAgIG1pbkxlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShjdXJyZW50TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWluTGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1heExlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShtYXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1heExlbmd0aEZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGN1cnJlbnRNaW4gIT0gbnVsbCAmJiBjdXJyZW50TWluLmVxdWFscyhtYXgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsZW5ndGhGYWNldCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRExlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChsZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUobWF4KTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtaW5MZW5ndGhGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRMZW5ndGggIT0gbnVsbCAmJiAhY3VycmVudExlbmd0aC5lcXVhbHMobWF4KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobGVuZ3RoRmFjZXQpOwotCi0gICAgICAgICAgICBpZiAobWF4ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1heExlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWF4TGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1heCk7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtYXhMZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1pbkxlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWluTGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgIG1pbkxlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShjdXJyZW50TGVuZ3RoKTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtaW5MZW5ndGhGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKGxlbmd0aEZhY2V0KTsKLQotICAgICAgICAgICAgICBtaW5MZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1pbkxlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICAgIG1pbkxlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShjdXJyZW50TGVuZ3RoKTsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1pbkxlbmd0aEZhY2V0KTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNYXhMZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1heCk7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWF4TGVuZ3RoRmFjZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoIWRvVXBkYXRlTWF4ICYmIGRvVXBkYXRlTWluKQotICAgICAgewotICAgICAgICBpZiAobWluTGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChtaW4gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobWluLmVxdWFscyhjdXJyZW50TWF4KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RMZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgICBsZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUobWluKTsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKGxlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1heExlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1pbkxlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChtYXhMZW5ndGhGYWNldCA9PSBudWxsICYmIGN1cnJlbnRMZW5ndGggIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1heExlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWF4TGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgICBtYXhMZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUoY3VycmVudExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1heExlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBtaW5MZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUobWluKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtaW5MZW5ndGhGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChjdXJyZW50TWF4ICE9IG51bGwgJiYgY3VycmVudE1heC5lcXVhbHMobWluKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoRmFjZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RMZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1pbik7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWF4TGVuZ3RoRmFjZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChjdXJyZW50TGVuZ3RoICE9IG51bGwgJiYgIWN1cnJlbnRMZW5ndGguZXF1YWxzKG1pbikpCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKGxlbmd0aEZhY2V0KTsKLQotICAgICAgICAgICAgaWYgKG1pbiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtaW5MZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1pbkxlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICAgIG1pbkxlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShtaW4pOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWluTGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYXhMZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1heExlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICBtYXhMZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUoY3VycmVudExlbmd0aCk7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWF4TGVuZ3RoRmFjZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNaW5MZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1pbik7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWluTGVuZ3RoRmFjZXQpOwotCi0gICAgICAgICAgICBpZiAobGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKGxlbmd0aEZhY2V0KTsKLQotICAgICAgICAgICAgICBtYXhMZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1heExlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICAgIG1heExlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShjdXJyZW50TGVuZ3RoKTsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1heExlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZvcm1hdENoaWxkKHhzZFNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVUZXh0VmFsdWVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVUZXh0VmFsdWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NjM2NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlVGV4dFZhbHVlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuVHJlZUNvbnRlbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgZnJvbSB0aGUgZXh0ZW5zaW9uIHZpZXcgdG8gZWRpdCBleHRlbnNpb24gZWxlbWVudHMKLSAqIGFuZCB3aGljaCBhcmUgaW1wbGVtZW50ZWQgYXMgRE9NIG9iamVjdHMgKG5vdCBwYXJ0IG9mIHRoZSBFTUYgbW9kZWwpCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVUZXh0VmFsdWVDb21tYW5kICBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIEVsZW1lbnQgZWxlbWVudDsKLSAgU3RyaW5nIHZhbHVlOwotICAKLSAgcHVibGljIFVwZGF0ZVRleHRWYWx1ZUNvbW1hbmQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGVsZW1lbnQpOyAgICAgIAotICAgICAgTm9kZSB0ZXh0Tm9kZSA9IG51bGw7Ci0gICAgICBUcmVlQ29udGVudEhlbHBlciBoZWxwZXIgPSBuZXcgVHJlZUNvbnRlbnRIZWxwZXIoKTsKLSAgICAgIGZvciAoTm9kZSBub2RlID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgCi0gICAgICB7Ci0gICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYKLSAgICAgICAgICAgICFoZWxwZXIuaXNJZ25vcmFibGVUZXh0KG5vZGUpKSAKLSAgICAgICAgewotICAgICAgICAgIHRleHROb2RlID0gbm9kZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAgICAgICAgIAotICAgICAgfSAgICAgICAKLSAgICAgIGlmICh0ZXh0Tm9kZSA9PSBudWxsKQotICAgICAgewotICAgICAgICB0ZXh0Tm9kZSA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCIiKTsKLSAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICB9ICAKLSAgICAgIGhlbHBlci5zZXROb2RlVmFsdWUodGV4dE5vZGUsIHZhbHVlKTsgICAgICAgIAotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlVHlwZVJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVUeXBlUmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVkNzdiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVUeXBlUmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVUeXBlUmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQgZXh0ZW5kcyBVcGRhdGVDb21wb25lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZAotewotCi0gIHB1YmxpYyBVcGRhdGVUeXBlUmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQsCi0JCSAgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2UsIElGaWxlIGZpbGUpCi0gIHsKLQkgIHN1cGVyKGNvbmNyZXRlQ29tcG9uZW50LCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lc3BhY2UsIGZpbGUpOwotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCBYU0RDb21wb25lbnQgZ2V0RGVmaW5lZENvbXBvbmVudChYU0RTY2hlbWEgc2NoZW1hLCBTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWVzcGFjZSkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHJlc3VsdCA9IHNjaGVtYS5yZXNvbHZlVHlwZURlZmluaXRpb24oY29tcG9uZW50TmFtZXNwYWNlLCBjb21wb25lbnROYW1lKTsKLSAgICBpZiAocmVzdWx0LmVDb250YWluZXIoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgfSAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbmNyZXRlQ29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RDb21wb25lbnQgdGQgPSBjb21wdXRlQ29tcG9uZW50KCk7Ci0gICAgICBpZiAodGQgIT0gbnVsbCAmJiB0ZCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBVcGRhdGVUeXBlUmVmZXJlbmNlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZVR5cGVSZWZlcmVuY2VDb21tYW5kKGNvbmNyZXRlQ29tcG9uZW50LCAoWFNEVHlwZURlZmluaXRpb24pIHRkKTsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIFhTRERpcmVjdGl2ZXNNYW5hZ2VyLnJlbW92ZVVudXNlZFhTREltcG9ydHMoY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVUeXBlUmVmZXJlbmNlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlVHlwZVJlZmVyZW5jZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhMTA2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVUeXBlUmVmZXJlbmNlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVR5cGVSZWZlcmVuY2VDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQ7Ci0gIFhTRFR5cGVEZWZpbml0aW9uIG5ld1R5cGU7Ci0gIAotICBwdWJsaWMgVXBkYXRlVHlwZVJlZmVyZW5jZUNvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQsIFhTRFR5cGVEZWZpbml0aW9uIG5ld1R5cGUpCi0gIHsKLSAgICB0aGlzLmNvbmNyZXRlQ29tcG9uZW50ID0gY29uY3JldGVDb21wb25lbnQ7Ci0gICAgdGhpcy5uZXdUeXBlID0gbmV3VHlwZTsKLSAgfQotICAgCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoY29uY3JldGVDb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLQotICAgICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBzZXRFbGVtZW50VHlwZSgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBjb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgc2V0QXR0cmlidXRlVHlwZSgoWFNEQXR0cmlidXRlVXNlKSBjb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBzZXRBdHRyaWJ1dGVUeXBlKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgY29uY3JldGVDb21wb25lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUeXBlKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgewotICAgIGVkID0gZWQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIGVkLnNldFR5cGVEZWZpbml0aW9uKG5ld1R5cGUpOwotICAgIH0gICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2V0QXR0cmlidXRlVHlwZShYU0RBdHRyaWJ1dGVVc2UgYXR0cmlidXRlVXNlKQotICB7Ci0gICAgc2V0QXR0cmlidXRlVHlwZShhdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpCi0gIHsKLSAgICBhZCA9IGFkLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICBpZiAoYWQgIT0gbnVsbCAmJiBuZXdUeXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgYWQuc2V0VHlwZURlZmluaXRpb24oKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKW5ld1R5cGUpOwotICAgIH0gIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMWI2YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlWFNEUGF0dGVybkZhY2V0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGF0dGVybkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBREQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUxFVEUgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUERBVEUgPSAyOwotICAKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZURlZmluaXRpb247Ci0gIFN0cmluZyB2YWx1ZTsKLSAgaW50IGFjdGlvblR5cGU7Ci0gIFhTRFBhdHRlcm5GYWNldCBwYXR0ZXJuVG9FZGl0OwotICAKLSAgcHVibGljIFVwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiwgaW50IGFjdGlvblR5cGUpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotICAgIHRoaXMuYWN0aW9uVHlwZSA9IGFjdGlvblR5cGU7Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UGF0dGVyblRvRWRpdChYU0RQYXR0ZXJuRmFjZXQgcGF0dGVyblRvRWRpdCkKLSAgewotICAgIHRoaXMucGF0dGVyblRvRWRpdCA9IHBhdHRlcm5Ub0VkaXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICBpZiAoYWN0aW9uVHlwZSA9PSBBREQpCi0gICAgICB7Ci0gICAgICAgIFhTRFBhdHRlcm5GYWNldCBwYXR0ZXJuID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUGF0dGVybkZhY2V0KCk7Ci0gICAgICAgIHBhdHRlcm4uc2V0TGV4aWNhbFZhbHVlKHZhbHVlKTsKLSAgICAgICAgeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RmFjZXRDb250ZW50cygpLmFkZChwYXR0ZXJuKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFjdGlvblR5cGUgPT0gREVMRVRFKQotICAgICAgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHBhdHRlcm5Ub0VkaXQpOwotICAgICAgICBpZiAoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RmFjZXRDb250ZW50cygpLmNvbnRhaW5zKHBhdHRlcm5Ub0VkaXQpKQotICAgICAgICAgIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUocGF0dGVyblRvRWRpdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhY3Rpb25UeXBlID09IFVQREFURSkKLSAgICAgIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChwYXR0ZXJuVG9FZGl0KTsKLSAgICAgICAgcGF0dGVyblRvRWRpdC5zZXRMZXhpY2FsVmFsdWUodmFsdWUpOwotICAgICAgfQotICAgICAgZm9ybWF0Q2hpbGQoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlWFNEV2hpdGVTcGFjZUZhY2V0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlWFNEV2hpdGVTcGFjZUZhY2V0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDkyYzNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVhTRFdoaXRlU3BhY2VGYWNldENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2hpdGVTcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2hpdGVTcGFjZUZhY2V0OwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlWFNEV2hpdGVTcGFjZUZhY2V0Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotICBib29sZWFuIGRvQWRkRmFjZXQ7Ci0gIAotICBwdWJsaWMgVXBkYXRlWFNEV2hpdGVTcGFjZUZhY2V0Q29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGUsIGJvb2xlYW4gZG9BZGRGYWNldCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZFNpbXBsZVR5cGVEZWZpbml0aW9uID0geHNkU2ltcGxlVHlwZTsKLSAgICB0aGlzLmRvQWRkRmFjZXQgPSBkb0FkZEZhY2V0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotICAgICAgWFNEV2hpdGVTcGFjZUZhY2V0IHdoaXRlc3BhY2VGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFdoaXRlU3BhY2VGYWNldCgpOwotCi0gICAgICBpZiAoZG9BZGRGYWNldCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHdoaXRlc3BhY2VGYWNldCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgd2hpdGVzcGFjZUZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEV2hpdGVTcGFjZUZhY2V0KCk7Ci0gICAgICAgICAgeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RmFjZXRDb250ZW50cygpLmFkZCh3aGl0ZXNwYWNlRmFjZXQpOwotICAgICAgICB9Ci0gICAgICAgIHdoaXRlc3BhY2VGYWNldC5zZXRMZXhpY2FsVmFsdWUoWFNEV2hpdGVTcGFjZS5DT0xMQVBTRV9MSVRFUkFMLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICh3aGl0ZXNwYWNlRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUod2hpdGVzcGFjZUZhY2V0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9ybWF0Q2hpbGQoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9wcm92aWRlcnMvWFNEU2VjdGlvbkxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvcHJvdmlkZXJzL1hTRFNlY3Rpb25MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMWU1ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9wcm92aWRlcnMvWFNEU2VjdGlvbkxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLkZpbGVTdG9yZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEU2VjdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBYU0RTZWN0aW9uTGFiZWxQcm92aWRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG51bGwgfHwgb2JqZWN0LmVxdWFscyhTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgSW1hZ2UgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBPYmplY3Qgc2VsZWN0ZWQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIG9iamVjdCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBYU0RCYXNlQWRhcHRlciBhZGFwdGVyID0gKFhTREJhc2VBZGFwdGVyKVhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKFhTRENvbmNyZXRlQ29tcG9uZW50KXNlbGVjdGVkKTsKLSAgICAgICAgcmV0dXJuICgoSVRyZWVFbGVtZW50KWFkYXB0ZXIpLmdldEltYWdlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpCi0gICAgewotICAgICAgcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX05PX0lURU1TX1NFTEVDVEVEOwotICAgIH0KLQotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotCi0gICAgYm9vbGVhbiBpc1JlZmVyZW5jZSA9IGZhbHNlOwotICAgIE9iamVjdCBzZWxlY3RlZCA9IG51bGw7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgc2VsZWN0ZWQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIG9iamVjdCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgc2VsZWN0ZWQ7Ci0gICAgICAgICAgaWYgKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzUmVmZXJlbmNlID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGlmICgoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBzZWxlY3RlZCkuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzUmVmZXJlbmNlID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGlmICgoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBzZWxlY3RlZCkuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzUmVmZXJlbmNlID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBzZWxlY3RlZCkuZ2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2IuYXBwZW5kKCgoWFNEQ29uY3JldGVDb21wb25lbnQpIHNlbGVjdGVkKS5nZXRFbGVtZW50KCkuZ2V0TG9jYWxOYW1lKCkpOwotCi0gICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiIHJlZiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIC8vIFRoaXMgc3RyaW5nIGlzIG5vdCBlYXNpbHkgdHJhbnNsYXRhYmxlIHRvIG90aGVyIGxhbmd1YWdlcy4KLSAgICAgICAgICAgIC8vIEZvciBub3csIG1ha2UgaXQgZW5nbGlzaC1vbmx5IHNpbmNlIHdlIHVzZSB0aGUgZWxlbWVudCB0YWcgYXMgdGhlIHRpdGxlIGFueXdheQotLy8gICAgICAgICAgICBzYi5hcHBlbmQoTWVzc2FnZXMuVUlfUEFHRV9IRUFESU5HX1JFRkVSRU5DRSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgc2VsZWN0ZWQpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9IGZhbHNlOwotICAgICAgICAgICAgICBpZiAoIShlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQgfHwgZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBGaWxlU3RvcmVFZGl0b3JJbnB1dCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpc1JlYWRPbmx5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoZWRpdG9yUGFydCAhPSBudWxsICYmIHhzZFNjaGVtYSAhPSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKSB8fCBpc1JlYWRPbmx5KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgKCIgKyBNZXNzYWdlcy5VSV9MQUJFTF9SRUFEX09OTFkgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBudWxsLCB0aGVuIGxldCdzIHVzZSB0aGUgbW9kZWwgb2JqZWN0IHRvIGZpbmQKLSAgICAgICAgICAvLyBhbiBhcHByb3ByaWF0ZSBuYW1lCi0gICAgICAgICAgaWYgKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgc2VsZWN0ZWQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKChYU0ROYW1lZENvbXBvbmVudClzZWxlY3RlZCkuZ2V0TmFtZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICgoWFNEQ29uY3JldGVDb21wb25lbnQpIHNlbGVjdGVkIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBsYXN0IHJlc29ydC4uLi4KLSAgICAgICAgICByZXR1cm4gIigiICsgTWVzc2FnZXMuVUlfTEFCRUxfUkVBRF9PTkxZICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoRWxlbWVudCkgb2JqZWN0KS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fic3RyYWN0RXh0ZW5zaW9uc1NlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RFeHRlbnNpb25zU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDcwNWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RFeHRlbnNpb25zU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkRXh0ZW5zaW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uRE9NRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uRE9NRXh0ZW5zaW9uSXRlbU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uRXh0ZW5zaW9uRGV0YWlsc1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFeHRlbnNpb25zU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBwcm90ZWN0ZWQgRXh0ZW5zaW9uRGV0YWlsc1ZpZXdlciBleHRlbnNpb25EZXRhaWxzVmlld2VyOwotICBwcm90ZWN0ZWQgVHJlZVZpZXdlciBleHRlbnNpb25UcmVlVmlld2VyOwotICBwcm90ZWN0ZWQgSVRyZWVDb250ZW50UHJvdmlkZXIgZXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcjsKLSAgcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyOwotICBwcm90ZWN0ZWQgTGFiZWwgY29udGVudExhYmVsOwotICBwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBlbGVtZW50U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotICBwcm90ZWN0ZWQgSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyIGRvY3VtZW50Q2hhbmdlTm90aWZpZXI7Ci0gIHByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgaW50ZXJuYWxOb2RlQWRhcHRlciA9IG5ldyBJbnRlcm5hbE5vZGVBZGFwdGVyKCk7Ci0KLSAgcHJpdmF0ZSBDb21wb3NpdGUgcGFnZTsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBhZGRCdXR0b24sIHJlbW92ZUJ1dHRvbjsKLSAgcHJpdmF0ZSBPYmplY3QgcHJldklucHV0OwotICBwcml2YXRlIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHByZXZDYXRlZ29yeTsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgQWJzdHJhY3RFeHRlbnNpb25zU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOyAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotICAgIGV4dGVuc2lvbkRldGFpbHNWaWV3ZXIuc2V0Q29tbWFuZFN0YWNrKGdldENvbW1hbmRTdGFjaygpKTsKLSAgfQotICAKLSAgY2xhc3MgSW50ZXJuYWxOb2RlQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlcgotICB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIC8vIHRoaXMgbWV0aG9kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQKLSAgICAgIC8vIHdlIGRvbid0IHVzZSBvYmplY3RzIG9mIHRoaXMgY2xhc3MgYXMgJ3N0YW5kYXJkJyBhZGFwdGVycwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKQotICAgIHsgICAgIAotICAgICAgYm9vbGVhbiBpc1Jvb3QgPSBmYWxzZTsKLSAgICAgIGlmIChub3RpZmllciBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChpc1RyZWVWaWV3ZXJJbnB1dEVsZW1lbnQoKEVsZW1lbnQpbm90aWZpZXIpKS8vIFRPRE8KLSAgICAgICAgewotICAgICAgICAgIGlzUm9vdCA9IHRydWU7Ci0gICAgICAgICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5yZWZyZXNoKGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSk7Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgICAgaWYgKCFpc1Jvb3QpCi0gICAgICB7ICAKLSAgICAgICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5yZWZyZXNoKG5vdGlmaWVyKTsKLSAgICAgICAgaWYgKCBuZXdWYWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBleHRlbnNpb25UcmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwobm90aWZpZXIsIDEpOwotICAgICAgICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld1ZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gIAotICAgIH0gICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzVHJlZVZpZXdlcklucHV0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gVE9ETyAoY3MpIGFkZCBhc3NlcnRpb24KLSAgICBpZiAoZXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlciA9PSBudWxsKQotICAgICAgIHJldHVybjsKLSAgICAKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBkb2N1bWVudENoYW5nZU5vdGlmaWVyID0gKElEb2N1bWVudENoYW5nZWROb3RpZmllcillZGl0b3IuZ2V0QWRhcHRlcihJRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIuY2xhc3MpOwotICAgIAotICAgIGlmIChkb2N1bWVudENoYW5nZU5vdGlmaWVyICE9IG51bGwpCi0gICAgewotICAgICAgZG9jdW1lbnRDaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihpbnRlcm5hbE5vZGVBZGFwdGVyKTsKLSAgICB9ICAKLSAgICAKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0gICAgcGFnZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlKTsKLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFnZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgcGFnZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAKLSAgICBTYXNoRm9ybSBzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShwYWdlLCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgLy8gVHJ5IHRvIGxpbWl0IHRoZSBpbml0aWFsIHdpZHRoIG9mIHRoZSBzZWN0aW9uCi0gICAgCi0gICAgaW50IHcgPSBTV1QuREVGQVVMVDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJV29ya2JlbmNoUGFydCBwYXJ0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlUGFydCgpOwotCi0gICAgICAvLyBGaW5kIHRoZSB3aWR0aCBvZiB0aGUgVGFiYmVkIFByb3BlcnR5IFNoZWV0J3MgY29tcG9zaXRlIGV4Y2x1ZGluZyB0aGUgdGFiCi0gICAgICBpZiAocGFydCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpCi0gICAgICB7Ci0gICAgICAgIFByb3BlcnR5U2hlZXQgc2hlZXQgPSAoUHJvcGVydHlTaGVldClwYXJ0OwotICAgICAgICBpZiAoc2hlZXQuZ2V0Q3VycmVudFBhZ2UoKSBpbnN0YW5jZW9mIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUGFnZSA9IChUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSlzaGVldC5nZXRDdXJyZW50UGFnZSgpOwotICAgICAgICAgIENvbXBvc2l0ZSB0YXJnZXRDb21wb3NpdGUgPSBudWxsOwotICAgICAgICAgIGlmICh0YWJiZWRQYWdlLmdldENvbnRyb2woKSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDb21wb3NpdGUgYyA9IChDb21wb3NpdGUpdGFiYmVkUGFnZS5nZXRDb250cm9sKCk7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gYy5nZXRDaGlsZHJlbigpLmxlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIENvbnRyb2wgY3RybCA9IGMuZ2V0Q2hpbGRyZW4oKVtpXTsKLSAgICAgICAgICAgICAgaW50IGxlbmd0aDIgID0gKCgoQ29tcG9zaXRlKWN0cmwpLmdldENoaWxkcmVuKCkpLmxlbmd0aDsKLSAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGgyOyBqKysgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCgoKENvbXBvc2l0ZSljdHJsKS5nZXRDaGlsZHJlbigpKVtqXSBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHRhcmdldENvbXBvc2l0ZSA9IChDb21wb3NpdGUpKCgoQ29tcG9zaXRlKWN0cmwpLmdldENoaWxkcmVuKCkpW2pdOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICh0YXJnZXRDb21wb3NpdGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3ID0gdGFyZ2V0Q29tcG9zaXRlLmdldFNpemUoKS54IC0gMjA7ICAvLyBlbnN1cmUgc2Nyb2xsYmFycyBkb24ndCBzaG93Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIFRoZSBhYm92ZSBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHRoZSBmb2xsb3dpbmcgY29kZQotICAgICAgICAgIC8vIGJ1dCBiZWNhdXNlIFRhYmJlZFByb3BlcnR5Q29tcG9zaXRlIGlzIGluIGFuIGludGVybmFsIHBhY2thZ2UsIEkgd2lsbCBnZXQgYSBkaXNjb3VyYWdlZAotICAgICAgICAgIC8vIGFjY2VzcyB3YXJuaW5nLgotICAgICAgICAgIC8vIHcgPSAoKFRhYmJlZFByb3BlcnR5Q29tcG9zaXRlKSh0YWJiZWRQYWdlLmdldENvbnRyb2woKSkpLmdldFRhYkNvbXBvc2l0ZSgpLmdldFNpemUoKS54OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHcgPSBTV1QuREVGQVVMVDsKLSAgICB9Ci0gICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIC8vIFRoZSBpbml0aWFsIHNpemUgc2hvdWxkIGJlIHNldCwgbm90IHRoZSB3aWR0aEhpbnQsIHdoaWNoIGZvcmNlcyB0aGUgd2lkdGgKLSAgICAvLyB0byByZW1haW4gY29uc3RhbnQuCi0gICAgc2FzaEZvcm0uc2V0U2l6ZSh3LCBTV1QuREVGQVVMVCk7Ci0gICAgc2FzaEZvcm0uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgc2FzaEZvcm0uc2V0Rm9yZWdyb3VuZChDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgc2FzaEZvcm0uc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgQ29udHJvbFtdIGNoaWxkcmVuID0gc2FzaEZvcm0uZ2V0Q2hpbGRyZW4oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGNoaWxkcmVuW2ldLnNldFZpc2libGUoZmFsc2UpOwotICAgIH0KLSAgICBDb21wb3NpdGUgbGVmdENvbnRlbnQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHNhc2hGb3JtLCBTV1QuRkxBVCk7Ci0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBsZWZ0Q29udGVudC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBTZWN0aW9uIHNlY3Rpb24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlU2VjdGlvbihsZWZ0Q29udGVudCwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUik7Ci0gICAgc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9FWFRFTlNJT05TKTsKLSAgICBzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgQ29tcG9zaXRlIHRhYmxlQW5kQnV0dG9uQ29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShsZWZ0Q29udGVudCwgU1dULkZMQVQpOwotICAgIHRhYmxlQW5kQnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgdGFibGVBbmRCdXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOyAgICAKLSAgICAKLSAgICBleHRlbnNpb25UcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodGFibGVBbmRCdXR0b25Db21wb3NpdGUsIFNXVC5GTEFUIHwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5MSU5FX1NPTElEKTsKLSAgICBNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOyAgICAKLSAgICBleHRlbnNpb25UcmVlVmlld2VyLmdldFRyZWUoKS5zZXRNZW51KG1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0VHJlZSgpKSk7Ci0gICAgbWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKG5ldyBET01FeHRlbnNpb25JdGVtTWVudUxpc3RlbmVyKGV4dGVuc2lvblRyZWVWaWV3ZXIpKTsKLSAgICAKLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAKLSAgICBleHRlbnNpb25UcmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBleHRlbnNpb25UcmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihleHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyKTsKLSAgICBleHRlbnNpb25UcmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoZXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIpOwotICAgIGVsZW1lbnRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgRWxlbWVudFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpOwotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGVsZW1lbnRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0VHJlZSgpLmFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTW91c2VUcmFja0FkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlSG92ZXIob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBvYmo7Ci0gICAgICAgICAgICBFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpOwotICAgICAgICAgICAgLy8gQXBwbGljYXRpb25TcGVjaWZpY1NjaGVtYVByb3BlcnRpZXNbXSBwcm9wZXJ0aWVzID0KLSAgICAgICAgICAgIC8vIHJlZ2lzdHJ5LmdldEFsbEFwcGxpY2F0aW9uU3BlY2lmaWNTY2hlbWFQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAvLyBBcHBsaWNhdGlvblNwZWNpZmljU2NoZW1hUHJvcGVydGllc1tdIHByb3BlcnRpZXMgPQotICAgICAgICAgICAgLy8gKEFwcGxpY2F0aW9uU3BlY2lmaWNTY2hlbWFQcm9wZXJ0aWVzW10pCi0gICAgICAgICAgICAvLyByZWdpc3RyeS5nZXRBbGxBcHBsaWNhdGlvblNwZWNpZmljU2NoZW1hUHJvcGVydGllcygpLnRvQXJyYXkobmV3Ci0gICAgICAgICAgICAvLyBBcHBsaWNhdGlvblNwZWNpZmljU2NoZW1hUHJvcGVydGllc1swXSk7Ci0gICAgICAgICAgICBMaXN0IHByb3BlcnRpZXMgPSByZWdpc3RyeS5nZXRBbGxFeHRlbnNpb25zU2NoZW1hc0NvbnRyaWJ1dGlvbigpOwotCi0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gcHJvcGVydGllcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBjdXJyZW50ID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKSBwcm9wZXJ0aWVzLmdldChpKTsKLSAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VG9vbFRpcFRleHQoY3VycmVudC5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfSk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChleHRlbnNpb25UcmVlVmlld2VyLmdldENvbnRyb2woKSwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5FWFRFTlNJT05TX1RBQl9fRVhURU5TSU9OUyk7IAotICAgIAotICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHRhYmxlQW5kQnV0dG9uQ29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgLy9Db2x1bW5MYXlvdXQgY29sdW1uTGF5b3V0ID0gbmV3IENvbHVtbkxheW91dCgpOwotICAgIC8vYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChjb2x1bW5MYXlvdXQpOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgZ3JpZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgCi0gICAgYWRkQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1dJVEhfRE9UUywgU1dULkZMQVQpOyAgIAotICAgIGFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLSAgICBhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgYWRkQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VYVEVOU0lPTl9DT01QT05FTlQpOwotICAgIC8vYWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IENvbHVtbkxheW91dERhdGEoQ29sdW1uTGF5b3V0RGF0YS5GSUxMKSk7Ci0gICAgYWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYWRkQnV0dG9uLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkVYVEVOU0lPTlNfVEFCX19BREQpOyAgICAgCi0gICAgCi0gICAgcmVtb3ZlQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9ERUxFVEVfQlVUVE9OLCBTV1QuRkxBVCk7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotICAgIHJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICByZW1vdmVCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEVfRVhURU5TSU9OX0NPTVBPTkVOVCk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZW1vdmVCdXR0b24sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuRVhURU5TSU9OU19UQUJfX0RFTEVURSk7ICAgCi0gICAgCi0gICAgLy9yZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgQ29sdW1uTGF5b3V0RGF0YShDb2x1bW5MYXlvdXREYXRhLkZJTEwpKTsKLQotICAgIC8vIFRPRE8gKGNzKSB1bmNvbW1lbnQgdGhlIHVwL2Rvd24gYnV0dG9uIHdoZW4gd2UgaGF2ZSB0aW1lIHRvIGltcGxlbWVudAotICAgIC8vCi0gICAgLy9CdXR0b24gdXAgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX1VQLCBTV1QuRkxBVCk7Ci0gICAgLy91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAKLSAgICAvL0J1dHRvbiBkb3duID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9ET1dOLCBTV1QuRkxBVCk7Ci0gICAgLy9kb3duLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgQ29tcG9zaXRlIHJpZ2h0Q29udGVudCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoc2FzaEZvcm0sIFNXVC5GTEFUKTsKLSAgICBTZWN0aW9uIHNlY3Rpb24yID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNlY3Rpb24ocmlnaHRDb250ZW50LCBTV1QuRkxBVCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSKTsKLSAgICBzZWN0aW9uMi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9FWFRFTlNJT05fREVUQUlMUyk7Ci0gICAgc2VjdGlvbjIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgLy9jb250ZW50TGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlTGFiZWwocmlnaHRDb250ZW50LCAiQ29udGVudCIpOwotCi0gICAgQ29tcG9zaXRlIHRlc3RDb21wID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShyaWdodENvbnRlbnQsIFNXVC5GTEFUKTsKLQotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5MZWZ0ID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMzsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMzsKLSAgICByaWdodENvbnRlbnQuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHJpZ2h0Q29udGVudC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDM7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDM7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICB0ZXN0Q29tcC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgdGVzdENvbXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICBjcmVhdGVFbGVtZW50Q29udGVudFdpZGdldCh0ZXN0Q29tcCk7Ci0KLSAgICBpbnRbXSB3ZWlnaHRzID0geyA0MCwgNjAgfTsKLSAgICBzYXNoRm9ybS5zZXRXZWlnaHRzKHdlaWdodHMpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWxlbWVudENvbnRlbnRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGV4dGVuc2lvbkRldGFpbHNWaWV3ZXIgPSBuZXcgRXh0ZW5zaW9uRGV0YWlsc1ZpZXdlcihwYXJlbnQsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0gICAgZXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IERPTUV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIoKSk7ICAgIAotICAgIGV4dGVuc2lvbkRldGFpbHNWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5nZXRDb250cm9sKCksCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuRVhURU5TSU9OU19UQUJfX0VYVEVOU0lPTlNfREVUQUlMUyk7ICAgCi0gIH0KLSAgCi0KLSAgLyoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmICggcHJldklucHV0ID09IGlucHV0KQotICAgIAkgIHJldHVybjsKLSAgICAgIGVsc2UKLSAgICAJICBwcmV2SW5wdXQgPSBpbnB1dDsKLSAgICAgIAotICAgICAgVHJlZSB0cmVlID0gZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRUcmVlKCk7Ci0gICAgICBleHRlbnNpb25EZXRhaWxzVmlld2VyLnNldElucHV0KG51bGwpOwotICAgICAgdHJlZS5yZW1vdmVBbGwoKTsKLSAgICAgIAotICAgICAgYWRkQnV0dG9uLnNldEVuYWJsZWQoIWlzUmVhZE9ubHkpOwotICAgICAgCi0gICAgICBleHRlbnNpb25UcmVlVmlld2VyLnNldElucHV0KGlucHV0KTsKLSAgICAgIGlmICh0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkgPT0gMCAmJiB0cmVlLmdldEl0ZW1Db3VudCgpID4gMCkKLSAgICAgIHsgICAgICAgCi0gICAgICAgIFRyZWVJdGVtIHRyZWVJdGVtID0gdHJlZS5nZXRJdGVtKDApOyAgICAgCi0gICAgICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRyZWVJdGVtLmdldERhdGEoKSkpOwotICAgICAgfQotICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCAgJiYgIWlzUmVhZE9ubHkpOwotICAgICAgLy8gQnVnemlsbGEgMTk3MzE1LiAgTWFrZSB0aGlzIGJ1bGxldHByb29mIGZvciBtYWludGVuYW5jZSByZWxlYXNlLgotICAgICAgQ29udHJvbCBkZXRhaWxzVmlld2VyQ29udHJvbCA9IGV4dGVuc2lvbkRldGFpbHNWaWV3ZXIuZ2V0Q29udHJvbCgpOwotICAgICAgaWYgKGRldGFpbHNWaWV3ZXJDb250cm9sICE9IG51bGwgJiYgIWRldGFpbHNWaWV3ZXJDb250cm9sLmlzRGlzcG9zZWQoKSkKLSAgICAgIHsKLSAgICAgICAgZGV0YWlsc1ZpZXdlckNvbnRyb2wuc2V0RW5hYmxlZCghaXNSZWFkT25seSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBDb21wb3NpdGUgZ2V0UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gcGFnZTsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBBZGRFeHRlbnNpb25Db21tYW5kIGdldEFkZEV4dGVuc2lvbkNvbW1hbmQoT2JqZWN0IG8pOwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tbWFuZCBnZXRSZW1vdmVFeHRlbnNpb25Db21tYW5kKE9iamVjdCBvKTsgIAotICBwcm90ZWN0ZWQgYWJzdHJhY3QgRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSBnZXRFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KCk7Ci0gIAotICBwcm90ZWN0ZWQgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyBjcmVhdGVBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nKCkKLSAgewotICAgIHJldHVybiBuZXcgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwgZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpKTsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgewotICAgIGlmIChldmVudC53aWRnZXQgPT0gYWRkQnV0dG9uKQotICAgIHsKLSAgICAgIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KCk7Ci0gICAgICBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nIGRpYWxvZyA9IGNyZWF0ZUFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2coKTsKLQotICAgICAgTGlzdCBwcm9wZXJ0aWVzID0gcmVnaXN0cnkuZ2V0QWxsRXh0ZW5zaW9uc1NjaGVtYXNDb250cmlidXRpb24oKTsKLQotICAgICAgZGlhbG9nLnNldElucHV0KHByb3BlcnRpZXMpOwotICAgICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgICAgZGlhbG9nLnNldFByZWZTdG9yZSggZ2V0UHJlZlN0b3JlKCkgKTsKLSAgICAgIAotICAgICAgaWYgKHByZXZDYXRlZ29yeSAhPSBudWxsKQotICAgIAkgIGRpYWxvZy5zZXRJbml0aWFsQ2F0ZWdvcnlTZWxlY3Rpb24ocHJldkNhdGVnb3J5KTsKLQotICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgewotICAgICAgICBPYmplY3QgbmV3U2VsZWN0aW9uID0gbnVsbDsgICAgICAgICAgCi0gICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsgICAgICAKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgZXh0ZW5zaW9uc1NjaGVtYVNwZWMgPSAoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpIHJlc3VsdFsxXTsKLSAgICAgICAgICBBZGRFeHRlbnNpb25Db21tYW5kIGFkZEV4dGVuc2lvbkNvbW1hbmQgPSBnZXRBZGRFeHRlbnNpb25Db21tYW5kKHJlc3VsdFswXSk7Ci0gICAgICAgICAgaWYgKGFkZEV4dGVuc2lvbkNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIGFkZEV4dGVuc2lvbkNvbW1hbmQuc2V0U2NoZW1hUHJvcGVydGllcyhleHRlbnNpb25zU2NoZW1hU3BlYyk7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29tbWFuZFN0YWNrKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShhZGRFeHRlbnNpb25Db21tYW5kKTsKLSAgICAgICAgICAgICAgbmV3U2VsZWN0aW9uID0gYWRkRXh0ZW5zaW9uQ29tbWFuZC5nZXROZXdPYmplY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9yZWZyZXNoKCk7Ci0gICAgICAgIGlmIChuZXdTZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld1NlbGVjdGlvbikpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHByZXZDYXRlZ29yeSA9IGRpYWxvZy5nZXRTZWxlY3RlZENhdGVnb3J5KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSByZW1vdmVCdXR0b24pCi0gICAgewotICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBleHRlbnNpb25UcmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgCi0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IGdldFJlbW92ZUV4dGVuc2lvbkNvbW1hbmQobyk7ICAgICAgICAgICAgCi0gICAgICAgIGlmIChnZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChldmVudC53aWRnZXQgPT0gZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRUcmVlKCkpCi0gICAgewotCi0gICAgfQotICB9Ci0KLSAgLy8gVE9ETyBtYWtlIHRoaXMgb25lIGFuIGFic3RyYWN0IG1ldGhvZC4gWFNERWRpdG9yIGFuZCBXU0RMRWRpdG9yIHNob3VsZCByZXR1cm4KLSAgLy8gZGlmZXJlbnQgSXByZWZlcmVuY2VTdG9yZSBvYmplY3RzCi0gIHByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZTdG9yZSgpIHsKLQlyZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgewotCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAoZG9jdW1lbnRDaGFuZ2VOb3RpZmllciAhPSBudWxsKQotICAgICAgZG9jdW1lbnRDaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihpbnRlcm5hbE5vZGVBZGFwdGVyKTsKLSAgfQotIAotCi0gIE5vZGUgc2VsZWN0ZWROb2RlOwotCi0gIGNsYXNzIEVsZW1lbnRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICB7ICAgCi0gICAgICBib29sZWFuIGlzRGVsZXRlRW5hYmxlZCA9IGZhbHNlOwotICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICAgIGlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA+IDApCi0gICAgICAgIHsgIAotICAgICAgICAgIE9iamVjdCBvYmogPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBOb2RlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlbGVjdGVkTm9kZSA9IChOb2RlKSBvYmo7Ci0gICAgICAgICAgICBleHRlbnNpb25EZXRhaWxzVmlld2VyLnNldElucHV0KG9iaik7Ci0gICAgICAgICAgICBpc0RlbGV0ZUVuYWJsZWQgPSB0cnVlOyAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQgdGhlbiBkb24ndCBzaG93IGFueSBkZXRhaWxzCi0gICAgICAgICAgLy8KLSAgICAgICAgICBleHRlbnNpb25EZXRhaWxzVmlld2VyLnNldElucHV0KG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXBvbiBlbGVtZW50IHNlbGVjdGlvbiwgdGhlIGRldGFpbHMgdmlldyBwb3B1bGF0ZXMgZmluZSwgYnV0IHRoZXJlIGlzIG5vIHZlcnRpY2FsIHNjcm9sbGJhciwKLSAgICAgICAgLy8gc28gaXQgbWlzbGVhZHMgdGhlIHVzZXIgaW50byB0aGlua2luZyB0aGVyZSBhcmUgbm8gb3RoZXIgYXR0cmlidXRlcyBhdmFpbGFibGUKLSAgICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzQwNzMKLSAgICAgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgdG8gZm9yY2UgYSBsYXlvdXQgb2YgdGhlIHRhYiBjb21wb3NpdGUKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgcGFydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsKLSAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KQotICAgICAgICB7Ci0gICAgICAgICAgUHJvcGVydHlTaGVldCBzaGVldCA9IChQcm9wZXJ0eVNoZWV0KXBhcnQ7Ci0gICAgICAgICAgaWYgKHNoZWV0LmdldEN1cnJlbnRQYWdlKCkgaW5zdGFuY2VvZiBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQYWdlID0gKFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKXNoZWV0LmdldEN1cnJlbnRQYWdlKCk7Ci0gICAgICAgICAgICBpZiAodGFiYmVkUGFnZS5nZXRDb250cm9sKCkgaW5zdGFuY2VvZiBDb21wb3NpdGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIENvbXBvc2l0ZSBjID0gKENvbXBvc2l0ZSl0YWJiZWRQYWdlLmdldENvbnRyb2woKTsKLSAgICAgICAgICAgICAgUG9pbnQgcCA9IGMuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAvLyBjLmxheW91dCh0cnVlLCB0cnVlKSBkb2Vzbid0IGFwcGVhciB0byB3b3JrLgotICAgICAgICAgICAgICAvLyBCdXQgdGhpcyBmb3JjZXMgYSByZWxheW91dDoKLSAgICAgICAgICAgICAgYy5zZXRTaXplKHAueCwgcC55ICsgMSk7Ci0gICAgICAgICAgICAgIC8vIENoYW5nZSB0aGUgc2l6ZSBiYWNrIHRvIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICBjLnNldFNpemUocC54LCBwLnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoaXNEZWxldGVFbmFibGVkICYmICFpc1JlYWRPbmx5KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0RXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIoSVRyZWVDb250ZW50UHJvdmlkZXIgZXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcikKLSAgewotICAgIHRoaXMuZXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlciA9IGV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0RXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIGV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIoSUxhYmVsUHJvdmlkZXIgZXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyID0gZXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXI7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fic3RyYWN0U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9BYnN0cmFjdFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwN2IzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fic3RyYWN0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuRm9ybUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5U2VjdGlvbiBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyLCBMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLSAgcHJvdGVjdGVkIFBhaW50TGlzdGVuZXIgcGFpbnRlcjsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gIHByb3RlY3RlZCBPYmplY3QgaW5wdXQ7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHk7Ci0gIHByb3RlY3RlZCBib29sZWFuIGxpc3RlbmVyRW5hYmxlZCA9IHRydWU7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzU2ltcGxlOwotICBwcm90ZWN0ZWQgQ3VzdG9tTGlzdGVuZXIgY3VzdG9tTGlzdGVuZXIgPSBuZXcgQ3VzdG9tTGlzdGVuZXIoKTsKLSAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IG93bmluZ0VkaXRvcjsKLSAgcHJpdmF0ZSBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNUcmF2ZXJzaW5nID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElDT05fRVJST1IgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKTsKLSAgCi0gIHB1YmxpYyBBYnN0cmFjdFNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgYVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBhVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotICAgIGlzU2ltcGxlID0gZ2V0SXNTaW1wbGUoKTsKLSAgICBjcmVhdGVDb250ZW50cyhwYXJlbnQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KTsKLQotICAgIHByb3RlY3RlZCBQYWludExpc3RlbmVyIGNyZWF0ZVBhaW50ZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotLy8gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICAgICAgR0MgZ2MgPSBlLmdjOwotCi0gICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChnYy5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICAgICAgICAgIGdjLnNldEJhY2tncm91bmQoZ2V0V2lkZ2V0RmFjdG9yeSgpLmdldENvbG9ycygpLmdldENvbG9yKAotICAgICAgICAgICAgICAgICAgICBGb3JtQ29sb3JzLlRCX0JHKSk7Ci0KLS8vICAgICAgICAgICAgICAgIGdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSg0ICsgYm91bmRzLndpZHRoIC8gMiwgMCwKLS8vICAgICAgICAgICAgICAgICAgICBib3VuZHMud2lkdGggLyAyIC0gOSwgYm91bmRzLmhlaWdodCwgZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChnZXRXaWRnZXRGYWN0b3J5KCkuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoCi0gICAgICAgICAgICAgICAgICAgIEZvcm1Db2xvcnMuVEJfQk9SREVSKSk7Ci0vLyAgICAgICAgICAgICAgICBnYy5kcmF3TGluZShib3VuZHMud2lkdGggLSA1LCAwLCBib3VuZHMud2lkdGggLSA1LAotLy8gICAgICAgICAgICAgICAgICAgIGJvdW5kcy5oZWlnaHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgICAgICBpZiAoY29tcG9zaXRlICE9IG51bGwgJiYgISBjb21wb3NpdGUuaXNEaXNwb3NlZCgpICYmIHBhaW50ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5yZW1vdmVQYWludExpc3RlbmVyKHBhaW50ZXIpOwotICAgICAgICAKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICAgIHsKLSAgICAgICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgICAgICAgaXNTaW1wbGUgPSBnZXRJc1NpbXBsZSgpOwotICAgICAgICBPYmplY3QgaW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICAgICAgCi0gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgeHNkU2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClpbnB1dCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHNldCBvd25pbmcgZWRpdG9yIG9mIHRoaXMgc2VjdGlvbgotICAgICAgICBpZiAocGFydCE9bnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvd25pbmdFZGl0b3IgPSAoSUVkaXRvclBhcnQpcGFydDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvd25pbmdFZGl0b3IgPSBwYXJ0LmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHhzZFNjaGVtYSA9PSBvd25pbmdFZGl0b3IuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpKQotICAgICAgICB7Ci0gICAgICAgICAgaXNSZWFkT25seSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlzUmVhZE9ubHkgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gb3duaW5nRWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgIGlmICghKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCB8fCBlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIEZpbGVTdG9yZUVkaXRvcklucHV0KSkKLSAgICAgICAgewotICAgICAgICAgIGlzUmVhZE9ubHkgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gICAgewotICAgICAgc3VwZXIucmVmcmVzaCgpOwotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoIWlzUmVhZE9ubHkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGx5QWxsTGlzdGVuZXJzKENvbnRyb2wgY29udHJvbCkKLSAgICB7Ci0gICAgICBjb250cm9sLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAgIGNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgICBjb250cm9sLmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFwcGx5TW9kaWZ5TGlzdGVuZXJzKENvbnRyb2wgY29udHJvbCkKLSAgICB7Ci0gICAgICBjb250cm9sLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAgIGNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlLZXlMaXN0ZW5lcihDb250cm9sIGNvbnRyb2wpCi0gICAgewotICAgICAgY29udHJvbC5hZGRMaXN0ZW5lcihTV1QuS2V5RG93biwgY3VzdG9tTGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVycyhDb250cm9sIGNvbnRyb2wpCi0gICAgewotICAgICAgY29udHJvbC5yZW1vdmVMaXN0ZW5lcihTV1QuTW9kaWZ5LCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgICBjb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5Gb2N1c091dCwgY3VzdG9tTGlzdGVuZXIpOwotICAgICAgY29udHJvbC5yZW1vdmVMaXN0ZW5lcihTV1QuS2V5RG93biwgY3VzdG9tTGlzdGVuZXIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkb1dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHt9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmCi0gICAgICAgICAgaW5wdXQgIT0gbnVsbCAmJgotICAgICAgICAgICFpc1JlYWRPbmx5KSAKLSAgICAgIHsKLSAgICAgICAgZG9XaWRnZXRTZWxlY3RlZChlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJgotICAgICAgICAgIGlucHV0ICE9IG51bGwgJiYKLSAgICAgICAgICAhaXNSZWFkT25seSkgCi0gICAgICB7Ci0gICAgICAgIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotICAgICAqIEByZXR1cm4gdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJFbmFibGVkKCkgCi0gICAgewotICAgICAgcmV0dXJuIGxpc3RlbmVyRW5hYmxlZDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0gICAgICogQHBhcmFtIHYgIFZhbHVlIHRvIGFzc2lnbiB0byBsaXN0ZW5lckVuYWJsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdGVuZXJFbmFibGVkKGJvb2xlYW4gIHYpIAotICAgIHsKLSAgICAgIHRoaXMubGlzdGVuZXJFbmFibGVkID0gdjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYW4gZXZlbnQgdGhhdCB0aGUgcmVjZWl2ZXIgaGFzIHJlZ2lzdGVyZWQgZm9yIG9jY3Vycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQgd2hpY2ggb2NjdXJyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJiAhaXNSZWFkT25seSkgCi0gICAgICB7Ci0gICAgICAgIGRvSGFuZGxlRXZlbnQoZXZlbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlCi0gICAgICogQHBhcmFtIGV2ZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGdldEFjdGl2ZUVkaXRvcigpCi0gICAgewotICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgIHRoaXMub3duaW5nRWRpdG9yID0gZWRpdG9yUGFydDsKLSAgICAgIHJldHVybiBlZGl0b3JQYXJ0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpCi0gICAgewotICAgICAgT2JqZWN0IGNvbW1hbmRTdGFjayA9IG93bmluZ0VkaXRvci5nZXRBZGFwdGVyKENvbW1hbmRTdGFjay5jbGFzcyk7IAotICAgICAgICAgIAotICAgICAgaWYgKGNvbW1hbmRTdGFjaz09bnVsbCkKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gKENvbW1hbmRTdGFjayljb21tYW5kU3RhY2s7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGdldElzU2ltcGxlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEludGVuZGVkIHRvIGRpc3BsYXkgZXJyb3IgbWVzc2FnZXMuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgSVN0YXR1c0xpbmVNYW5hZ2VyIGdldFN0YXR1c0xpbmVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICBpZiAoc3RhdHVzTGluZT09bnVsbCAmJiBnZXRQYXJ0KCkhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmKGdldFBhcnQoKS5nZXRTaXRlKCkgaW5zdGFuY2VvZiBJRWRpdG9yU2l0ZSkKLSAgICAgICAgICBzdGF0dXNMaW5lID0gKChJRWRpdG9yU2l0ZSlnZXRQYXJ0KCkuZ2V0U2l0ZSgpKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLSAgICAgICAgZWxzZSBpZiAoZ2V0UGFydCgpLmdldFNpdGUoKSBpbnN0YW5jZW9mIElWaWV3U2l0ZSkKLSAgICAgICAgICBzdGF0dXNMaW5lID0gKChJVmlld1NpdGUpZ2V0UGFydCgpLmdldFNpdGUoKSkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0gICAgICAgIAotICAgICAgICAvKiAKLSAgICAgICAgICogV2UgbXVzdCBtYW51YWxseSBzZXQgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHN0YXR1cyBsaW5lIHNpbmNlIHRoZSBhY3Rpb24gYmFycyBhcmUgZnJvbSB0aGUgZWRpdG9yCi0gICAgICAgICAqIHdoaWNoIG1lYW5zIHRoZSBzdGF0dXMgbGluZSBvbmx5IHNob3dzIHVwIHdoZW4gdGhlIGVkaXRvciBpcyBpbiBmb2N1cyAoYnkgZGVmYXVsdCkuCi0gICAgICAgICAqIE5vdGUgb25seSBhIFN1YlN0YXR1c0xpbmVNYW5hZ2VyIGNhbiBzZXQgdGhlIHZpc2liaWxpdHkuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoc3RhdHVzTGluZSBpbnN0YW5jZW9mIFN1YlN0YXR1c0xpbmVNYW5hZ2VyKQotICAgICAgICAgICgoU3ViU3RhdHVzTGluZU1hbmFnZXIpc3RhdHVzTGluZSkuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIHN0YXR1c0xpbmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBzdGF0dXMgbGluZS4KLSAgICAgKiBDYWxsIHNldEVycm9yTWVzc2FnZShudWxsKSB0byBjbGVhciB0aGUgc3RhdHVzIGxpbmUuCi0gICAgICogQHBhcmFtIHRleHQgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyB0ZXh0KQotICAgIHsKLSAgICAgIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lID0gZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQotICAgICAgaWYgKHN0YXR1c0xpbmUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICh0ZXh0PT1udWxsIHx8IHRleHQubGVuZ3RoKCk8MSkKLSAgICAgICAgICBzdGF0dXNMaW5lLnNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHN0YXR1c0xpbmUuc2V0RXJyb3JNZXNzYWdlKElDT05fRVJST1IsIHRleHQpOwotCi0gICAgICAgIC8vIGVuc3VyZSBvdXIgbWVzc2FnZSBnZXRzIGRpc3BsYXllZAotICAgICAgICBpZiAoc3RhdHVzTGluZSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbk1hbmFnZXIpCi0gICAgICAgICAgKChTdWJDb250cmlidXRpb25NYW5hZ2VyKXN0YXR1c0xpbmUpLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBzdGF0dXNMaW5lLnVwZGF0ZSh0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAKLSAgICBwcm90ZWN0ZWQgRU9iamVjdCBnZXRNb2RlbCgpCi0gICAgewotICAgICAgcmV0dXJuIChYU0RDb21wb25lbnQpaW5wdXQ7Ci0gICAgfQotCi0gICAgCi0gICAgY2xhc3MgQ3VzdG9tTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lcgotICAgIHsKLSAgICAgIGJvb2xlYW4gaGFuZGxpbmdFdmVudCA9IGZhbHNlOwotICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmICFpc1JlYWRPbmx5KSAKLSAgICAgICAgewotICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNXVC5LZXlEb3duIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuQ1IpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsaW5nRXZlbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaGFuZGxpbmdFdmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICBkb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgIGhhbmRsaW5nRXZlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNXVC5Gb2N1c091dCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICghaGFuZGxpbmdFdmVudCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhhbmRsaW5nRXZlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGRvSGFuZGxlRXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgIGhhbmRsaW5nRXZlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUGVyZm9ybUNvbWJvU2VsZWN0aW9uKGludCBldmVudFR5cGUsIE9iamVjdCBzZWxlY3RlZEl0ZW0pCi0gICAgewotICAgICAgLy8gaWYgdHJhdmVyc2luZyB0aHJvdWdoIGNvbWJvYm94LCBkb24ndCBhdXRvbWF0aWNhbGx5IHBvcCB1cAotICAgICAgLy8gdGhlIGJyb3dzZSBhbmQgbmV3IGRpYWxvZyBib3hlcwotICAgICAgYm9vbGVhbiB3YXNUcmF2ZXJzaW5nID0gaXNUcmF2ZXJzaW5nOwotICAgICAgaWYgKGlzVHJhdmVyc2luZykKLSAgICAgICAgaXNUcmF2ZXJzaW5nID0gZmFsc2U7Ci0KLSAgICAgIC8vIHdlIG9ubHkgY2FyZSBhYm91dCBkZWZhdWx0IHNlbGVjdGluZyAoaGl0dGluZyBlbnRlciBpbiBjb21ib2JveCkKLSAgICAgIC8vIGZvciBicm93c2UuLiBhbmQgbmV3Li4gb3RoZXJ3aXNlLCBzZWxlY3Rpb24gZXZlbnQgd2lsbCBiZSBmaXJlZAotICAgICAgaWYgKGV2ZW50VHlwZSA9PSBTV1QuRGVmYXVsdFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgaWYgKHNlbGVjdGVkSXRlbSBpbnN0YW5jZW9mIFN0cmluZyAmJiAoKE1lc3NhZ2VzLl9VSV9DT01CT19CUk9XU0UuZXF1YWxzKHNlbGVjdGVkSXRlbSkgfHwgTWVzc2FnZXMuX1VJX0NPTUJPX05FVy5lcXVhbHMoc2VsZWN0ZWRJdGVtKSkpKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGlmIHdhcyB0cmF2ZXJzaW5nIGFuZCBnb3Qgc2VsZWN0aW9uIGV2ZW50LCBkbyBub3RoaW5nIGlmIGl0J3MgCi0gICAgICAvLyBicm93c2UuLiBvciBuZXcuLgotICAgICAgaWYgKHdhc1RyYXZlcnNpbmcgJiYgc2VsZWN0ZWRJdGVtIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgewotICAgICAgICBpZiAoTWVzc2FnZXMuX1VJX0NPTUJPX0JST1dTRS5lcXVhbHMoc2VsZWN0ZWRJdGVtKSB8fCBNZXNzYWdlcy5fVUlfQ09NQk9fTkVXLmVxdWFscyhzZWxlY3RlZEl0ZW0pKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGIzM2JiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklTZWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IgaW1wbGVtZW50cyBJU2VjdGlvbkRlc2NyaXB0b3IKLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRGaWx0ZXIoKQotICAgKi8KLSAgcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SW5wdXRUeXBlcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbnB1dFR5cGVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChYU0RDb25jcmV0ZUNvbXBvbmVudC5jbGFzcyk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRTZWN0aW9uQ2xhc3MoKQotICAgKi8KLSAgcHVibGljIElTZWN0aW9uIGdldFNlY3Rpb25DbGFzcygpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCB8fCBvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgewotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgCi0gIHB1YmxpYyBpbnQgZ2V0RW5hYmxlc0ZvcigpCi0gIHsKLQlyZXR1cm4gRU5BQkxFU19GT1JfQU5ZOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fubm90YXRpb25TZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fubm90YXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZTdmNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9Bbm5vdGF0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkRG9jdW1lbnRhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBUZXh0IHNpbXBsZVRleHQ7Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgc2ltcGxlVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7IC8vJE5PTi1OTFMtMSQKLSAgICBzaW1wbGVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2ltcGxlVGV4dCwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5ET0NVTUVOVEFUSU9OX1RBQl9fTk9fTEFCRUwpOyAKLSAgICAKLQotICAgIEZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMSk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xKTsKLSAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxKTsKLSAgICBkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xKTsKLSAgICBzaW1wbGVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gIH0KLQotICBwdWJsaWMgQW5ub3RhdGlvblNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotICAgIAotICAgIGlmIChzaW1wbGVUZXh0LmlzRm9jdXNDb250cm9sKCkpIHJldHVybjsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbiA9IFhTRENvbW1vblVJVXRpbHMuZ2V0SW5wdXRYU0RBbm5vdGF0aW9uKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXQsIGZhbHNlKTsKLSAgICAgIHNldEluaXRpYWxUZXh0KHhzZEFubm90YXRpb24pOwotICAgIH0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGV2ZW50LndpZGdldCA9PSBzaW1wbGVUZXh0KQotICAgICAgewotICAgICAgICBBZGREb2N1bWVudGF0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZERvY3VtZW50YXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0RPQ1VNRU5UQVRJT04sIG51bGwsIChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXQsIHNpbXBsZVRleHQuZ2V0VGV4dCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotCi0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0SW5pdGlhbFRleHQoWFNEQW5ub3RhdGlvbiBhbikKLSAgewotICAgIGlmIChhbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBMaXN0IGRvY3VtZW50YXRpb25MaXN0ID0gYW4uZ2V0VXNlckluZm9ybWF0aW9uKCk7Ci0gICAgICAgIGlmIChkb2N1bWVudGF0aW9uTGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBkb2NFbGVtZW50ID0gKEVsZW1lbnQpIGRvY3VtZW50YXRpb25MaXN0LmdldCgwKTsKLSAgICAgICAgICBpZiAoZG9jRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNpbXBsZVRleHQuc2V0VGV4dChkb1NlcmlhbGl6ZShkb2NFbGVtZW50KSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc2ltcGxlVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaW1wbGVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZG9TZXJpYWxpemUoRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBzb3VyY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgTm9kZSBmaXJzdENoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgTm9kZSBsYXN0Q2hpbGQgPSBlbGVtZW50LmdldExhc3RDaGlsZCgpOwotICAgIGludCBzdGFydCA9IDA7Ci0gICAgaW50IGVuZCA9IDA7Ci0KLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElET01FbGVtZW50KQotICAgIHsKLSAgICAgIElET01FbGVtZW50IGRvbUVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIGVsZW1lbnQ7Ci0gICAgICBJRE9NTW9kZWwgbW9kZWwgPSBkb21FbGVtZW50LmdldE1vZGVsKCk7Ci0gICAgICBJRE9NRG9jdW1lbnQgZG9jID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotICAgICAgaWYgKGZpcnN0Q2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgIHsKLSAgICAgICAgSURPTU5vZGUgZmlyc3QgPSAoSURPTU5vZGUpIGZpcnN0Q2hpbGQ7Ci0gICAgICAgIHN0YXJ0ID0gZmlyc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLSAgICAgIH0KLSAgICAgIGlmIChsYXN0Q2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgIHsKLSAgICAgICAgSURPTU5vZGUgbGFzdCA9IChJRE9NTm9kZSkgbGFzdENoaWxkOwotICAgICAgICBlbmQgPSBsYXN0LmdldEVuZE9mZnNldCgpOwotICAgICAgfQotICAgICAgc291cmNlID0gZG9jLmdldFNvdXJjZSgpLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc291cmNlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQ29tbW9uRGlyZWN0aXZlc1NlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQ29tbW9uRGlyZWN0aXZlc1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwMWViYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0NvbW1vbkRpcmVjdGl2ZXNTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RQYXJzZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21tb25EaXJlY3RpdmVzU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBUZXh0IHNjaGVtYUxvY2F0aW9uVGV4dDsKLSAgQnV0dG9uIHdpemFyZEJ1dHRvbjsKLSAgU3R5bGVkVGV4dCBlcnJvclRleHQ7Ci0gIENvbG9yIHJlZDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFNjaGVtYUxvY2F0aW9uID0gdHJ1ZTsKLQotICAvLyBUT0RPOiBjb21tb24gdXAgY29kZSB3aXRoIFhTRFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBlcnJvclRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIGlmIChldmVudC53aWRnZXQgPT0gc2NoZW1hTG9jYXRpb25UZXh0KQotICAgIHsKLSAgICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IHRydWU7Ci0gICAgICAgIFN0cmluZyB4c2RNb2RlbEZpbGUgPSBzY2hlbWFMb2NhdGlvblRleHQuZ2V0VGV4dCgpOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgWFNEU2NoZW1hIGV4dGVybmFsU2NoZW1hID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICh4c2RNb2RlbEZpbGUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZVNjaGVtYUxvY2F0aW9uQ2hhbmdlKHhzZE1vZGVsRmlsZSwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBJRmlsZSBjdXJyZW50SUZpbGUgPSBudWxsOwotICAgICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyZW50SUZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpZWRpdG9ySW5wdXQpLmdldEZpbGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgVVJJIG5ld1VSSSA9IFVSSS5jcmVhdGVVUkkoeHNkTW9kZWxGaWxlKTsKLSAgICAgICAgICBTdHJpbmcgeHNkRmlsZSA9IFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShuZXdVUkkudG9TdHJpbmcoKSwgY3VycmVudElGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgZmluYWwgU3RyaW5nIG5vcm1hbGl6ZWRYU0RGaWxlID0gVVJJSGVscGVyLm5vcm1hbGl6ZSh4c2RGaWxlLCBjdXJyZW50SUZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBmaW5hbCBTdHJpbmcgbm9ybWFsaXplZFVSSSA9IFVSSS5lbmNvZGVGcmFnbWVudChVUklIZWxwZXIuYWRkSW1wbGllZEZpbGVQcm90b2NvbChub3JtYWxpemVkWFNERmlsZSksIHRydWUpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgWFNEUGFyc2VyIHBhcnNlciA9IG5ldyBYU0RQYXJzZXIobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgICAgcGFyc2VyLnBhcnNlKG5vcm1hbGl6ZWRVUkkpOwotICAgICAgICAgIGV4dGVybmFsU2NoZW1hID0gcGFyc2VyLmdldFNjaGVtYSgpOwotCi0gICAgICAgICAgaWYgKGV4dGVybmFsU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGV4dE5hbWVzcGFjZSA9IGV4dGVybmFsU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgaWYgKGV4dE5hbWVzcGFjZSA9PSBudWxsKSBleHROYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbmFtZXNwYWNlID0gZXh0TmFtZXNwYWNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZXh0ZXJuYWxTY2hlbWEuZ2V0RGlhZ25vc3RpY3MoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgZXh0ZXJuYWxTY2hlbWEuZ2V0RGlhZ25vc3RpY3MoKS5zaXplKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpc1ZhbGlkU2NoZW1hTG9jYXRpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfSU5DT1JSRUNUX1hNTF9TQ0hFTUEiLCB4c2RNb2RlbEZpbGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9ICAKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnROYW1lU3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREluY2x1ZGUgfHwgaW5wdXQgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIG5hbWVzcGFjZSB0byBtYWtlIHN1cmUgdGhleSBhcmUgdGhlIHNhbWUgYXMgY3VycmVudCBmaWxlCi0gICAgICAgICAgICAgICAgaWYgKGV4dE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TmFtZVNwYWNlICE9IG51bGwgJiYgIWV4dE5hbWVzcGFjZS5lcXVhbHMoY3VycmVudE5hbWVTcGFjZSkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX0RJRkZFUkVOVF9OQU1FX1NQQUNFIiwgeHNkTW9kZWxGaWxlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkU2NoZW1hTG9jYXRpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgbmFtZXNwYWNlIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBmaWxlCi0gICAgICAgICAgICAgICAgaWYgKGV4dE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TmFtZVNwYWNlICE9IG51bGwgJiYgZXh0TmFtZXNwYWNlLmVxdWFscyhjdXJyZW50TmFtZVNwYWNlKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfU0FNRV9OQU1FX1NQQUNFIiwgeHNkTW9kZWxGaWxlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkU2NoZW1hTG9jYXRpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IE1lc3NhZ2VzLl9VSV9FUlJPUl9JTlZBTElEX0ZJTEU7Ci0gICAgICAgICAgICBpc1ZhbGlkU2NoZW1hTG9jYXRpb24gPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBNZXNzYWdlcy5fVUlfRVJST1JfSU5WQUxJRF9GSUxFOwotICAgICAgICAgIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNWYWxpZFNjaGVtYUxvY2F0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVycm9yVGV4dC5zZXRUZXh0KGVycm9yTWVzc2FnZSk7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gZXJyb3JUZXh0LmdldFRleHQoKS5sZW5ndGgoKTsKLSAgICAgICAgICAgIHJlZCA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDAsIDApOwotICAgICAgICAgICAgU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKDAsIGxlbmd0aCwgcmVkLCBzY2hlbWFMb2NhdGlvblRleHQuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgICAgIGVycm9yVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGhhbmRsZVNjaGVtYUxvY2F0aW9uQ2hhbmdlKHhzZE1vZGVsRmlsZSwgbmFtZXNwYWNlLCBleHRlcm5hbFNjaGVtYSk7ICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTY2hlbWFMb2NhdGlvbkNoYW5nZShTdHJpbmcgc2NoZW1hRmlsZVN0cmluZywgU3RyaW5nIG5hbWVzcGFjZSwgWFNEU2NoZW1hIGV4dGVybmFsU2NoZW1hKQotICB7Ci0gICAgCi0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgaWYgKHJlZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlZC5kaXNwb3NlKCk7Ci0gICAgICByZWQgPSBudWxsOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0VudW1lcmF0aW9uc1NlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvRW51bWVyYXRpb25zU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGUyYWRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvRW51bWVyYXRpb25zU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuTmF2aWdhYmxlVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkRW51bWVyYXRpb25zQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlNldFhTREZhY2V0VmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHMuRW51bWVyYXRpb25zRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBFbnVtZXJhdGlvbnNTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIHByaXZhdGUgRW51bWVyYXRpb25zVGFibGVWaWV3ZXIgZW51bWVyYXRpb25zVGFibGU7Ci0gIHByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLSAgcHJpdmF0ZSBCdXR0b24gYWRkTWFueUJ1dHRvbjsKLSAgcHJpdmF0ZSBCdXR0b24gZGVsZXRlQnV0dG9uOwotCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbnNTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0OwotCi0gICAgaWYgKGUud2lkZ2V0ID09IGFkZEJ1dHRvbikKLSAgICB7Ci0gICAgICBMaXN0IGVudW1MaXN0ID0gc3QuZ2V0RW51bWVyYXRpb25GYWNldHMoKTsKLSAgICAgIFN0cmluZyBuZXdOYW1lID0gWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbnVtZXJhdGlvblZhbHVlKCJ2YWx1ZSIsIGVudW1MaXN0KTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBBZGRFbnVtZXJhdGlvbnNDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkRW51bWVyYXRpb25zQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FTlVNRVJBVElPTiwgKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dCk7Ci0gICAgICBjb21tYW5kLnNldFZhbHVlKG5ld05hbWUpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQotICAgICAgZW51bWVyYXRpb25zVGFibGUucmVmcmVzaCgpOwotICAgICAgaW50IG5ld0l0ZW1JbmRleCA9IGVudW1lcmF0aW9uc1RhYmxlLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxOwotICAgICAgZW51bWVyYXRpb25zVGFibGUuZWRpdEVsZW1lbnQoZW51bWVyYXRpb25zVGFibGUuZ2V0RWxlbWVudEF0KG5ld0l0ZW1JbmRleCksIDApOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBhZGRNYW55QnV0dG9uKQotICAgIHsKLSAgICAgIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgICAgLy8gaWYgaXQgaXMgbnVsbCwgZ2V0IHRoZSBkZWZhdWx0IG9uZQotICAgICAgZGlzcGxheSA9IGRpc3BsYXkgPT0gbnVsbCA/IERpc3BsYXkuZ2V0RGVmYXVsdCgpIDogZGlzcGxheTsKLSAgICAgIFNoZWxsIHBhcmVudFNoZWxsID0gZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgRW51bWVyYXRpb25zRGlhbG9nIGRpYWxvZyA9IG5ldyBFbnVtZXJhdGlvbnNEaWFsb2cocGFyZW50U2hlbGwpOwotICAgICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgewotICAgICAgICBTdHJpbmcgdGV4dCA9IGRpYWxvZy5nZXRUZXh0KCk7Ci0gICAgICAgIFN0cmluZyBkZWxpbWl0ZXIgPSBkaWFsb2cuZ2V0RGVsaW1pdGVyKCk7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRleHQsIGRlbGltaXRlcik7Ci0gICAgICAgIENvbXBvdW5kQ29tbWFuZCBjb21wb3VuZENvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VOVU1FUkFUSU9OUyk7Ci0gICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgIGlmIChkaWFsb2cuaXNQcmVzZXJ2ZVdoaXRlc3BhY2UoKSA9PSBmYWxzZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0b2tlbiA9IHRva2VuLnRyaW0oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgQWRkRW51bWVyYXRpb25zQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZEVudW1lcmF0aW9uc0NvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT05TLCAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0KTsKLSAgICAgICAgICBjb21tYW5kLnNldFZhbHVlKHRva2VuKTsKLSAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tcG91bmRDb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVudW1lcmF0aW9uc1RhYmxlLnJlZnJlc2goKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZGVsZXRlQnV0dG9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGVudW1lcmF0aW9uc1RhYmxlLmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0gICAgICAgIENvbXBvdW5kQ29tbWFuZCBjb21wb3VuZENvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fREVMRVRFX0VOVU1FUkFUSU9OKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgb2JqOwotCi0gICAgICAgICAgICAgIERlbGV0ZUNvbW1hbmQgZGVsZXRlQ29tbWFuZCA9IG5ldyBEZWxldGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fREVMRVRFX0VOVU1FUkFUSU9OLCBlbnVtRmFjZXQpOwotICAgICAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGRlbGV0ZUNvbW1hbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbXBvdW5kQ29tbWFuZCk7Ci0gICAgICAgIGVudW1lcmF0aW9uc1RhYmxlLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZW51bWVyYXRpb25zVGFibGUuZ2V0VGFibGUoKSkKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBlbnVtZXJhdGlvbnNUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGlmIChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotICAgIGNvbXBvc2l0ZSA9IGZhY3RvcnkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIGVudW1lcmF0aW9uc1RhYmxlID0gbmV3IEVudW1lcmF0aW9uc1RhYmxlVmlld2VyKGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUYWJsZShjb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTikpOwotICAgIGVudW1lcmF0aW9uc1RhYmxlLnNldElucHV0KGlucHV0KTsKLSAgICBUYWJsZSB0YWJsZSA9IGVudW1lcmF0aW9uc1RhYmxlLmdldFRhYmxlKCk7Ci0gICAgdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBhZGRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9BRERfQlVUVE9OX0xBQkVMIiksIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotICAgIGFkZE1hbnlCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9BRERfQlVUVE9OX0xBQkVMIikgKyAiLi4uIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBkZWxldGVCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEVfSU5DTFVERSIpLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLQotICAgIEZvcm1EYXRhIGRhdGEyID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YTIudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgIGRhdGEyLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTAwKTsKLSAgICBkYXRhMi5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgIC8vIGRhdGEyLndpZHRoID0gNTA7Ci0gICAgYWRkQnV0dG9uLnNldExheW91dERhdGEoZGF0YTIpOwotICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIEZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwLCBTV1QuTEVGVCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZEJ1dHRvbiwgMCk7Ci0gICAgYWRkTWFueUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGFkZE1hbnlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZEJ1dHRvbiwgMCwgU1dULkxFRlQpOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChhZGRNYW55QnV0dG9uLCAwKTsKLSAgICBkZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBkZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgZGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZEJ1dHRvbiwgMCk7Ci0gICAgZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICBkYXRhLndpZHRoID0gNTA7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICB0YWJsZS5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCB0aGlzKTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgaWYgKGlzUmVhZE9ubHkpCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLQotICAgIEl0ZXJhdG9yIHZhbGlkRmFjZXRzID0gc3QuZ2V0VmFsaWRGYWNldHMoKS5pdGVyYXRvcigpOwotCi0gICAgYm9vbGVhbiBpc0FwcGxpY2FibGUgPSBmYWxzZTsKLSAgICB3aGlsZSAodmFsaWRGYWNldHMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBhVmFsaWRGYWNldCA9IChTdHJpbmcpIHZhbGlkRmFjZXRzLm5leHQoKTsKLSAgICAgIGlmIChhVmFsaWRGYWNldC5lcXVhbHMoWFNEQ29uc3RhbnRzLkVOVU1FUkFUSU9OX0VMRU1FTlRfVEFHKSkKLSAgICAgIHsKLSAgICAgICAgaXNBcHBsaWNhYmxlID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaXNBcHBsaWNhYmxlKQotICAgIHsKLSAgICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgYWRkTWFueUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYWRkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgYWRkTWFueUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZW51bWVyYXRpb25zVGFibGUuc2V0SW5wdXQoaW5wdXQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBUYWJsZSB0YWJsZSA9IGVudW1lcmF0aW9uc1RhYmxlLmdldFRhYmxlKCk7Ci0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULlJlc2l6ZSAmJiBldmVudC53aWRnZXQgPT0gdGFibGUpCi0gICAgewotICAgICAgVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW4oMCk7Ci0gICAgICB0YWJsZUNvbHVtbi5zZXRXaWR0aCh0YWJsZS5nZXRTaXplKCkueCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjbGFzcyBFbnVtZXJhdGlvbnNUYWJsZVZpZXdlciBleHRlbmRzIE5hdmlnYWJsZVRhYmxlVmlld2VyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllcgotICB7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMgPSB7IFhTRENvbnN0YW50cy5FTlVNRVJBVElPTl9FTEVNRU5UX1RBRyB9OwotCi0gICAgcHJvdGVjdGVkIENlbGxFZGl0b3JbXSBjZWxsRWRpdG9yczsKLQotICAgIFRhYmxlIHRhYmxlOwotCi0gICAgcHVibGljIEVudW1lcmF0aW9uc1RhYmxlVmlld2VyKFRhYmxlIHRhYmxlKQotICAgIHsKLSAgICAgIHN1cGVyKHRhYmxlKTsKLSAgICAgIHRhYmxlID0gZ2V0VGFibGUoKTsKLQotICAgICAgdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICBzZXRDb250ZW50UHJvdmlkZXIobmV3IEVudW1lcmF0aW9uc1RhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgc2V0TGFiZWxQcm92aWRlcihuZXcgRW51bWVyYXRpb25zVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLQotICAgICAgc2V0Q2VsbE1vZGlmaWVyKHRoaXMpOwotCi0gICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCAwKTsKLSAgICAgIGNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNbMF0pOwotICAgICAgY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0gICAgICBjb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCi0gICAgICBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yWzFdOwotCi0gICAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgIENvbHVtbldlaWdodERhdGEgZGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCk7Ci0KLSAgICAgIGxheW91dC5hZGRDb2x1bW5EYXRhKGRhdGEpOwotICAgICAgY2VsbEVkaXRvcnNbMF0gPSBuZXcgVGV4dENlbGxFZGl0b3IodGFibGUpOwotCi0gICAgICBnZXRUYWJsZSgpLnNldExheW91dChsYXlvdXQpOwotICAgICAgc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0gJiYgKHZhbHVlICE9IG51bGwpKQotICAgICAgewotICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGVsZW1lbnQ7Ci0KLSAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgIFNldFhTREZhY2V0VmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfRU5VTUVSQVRJT05fVkFMVUUsIGVudW1GYWNldCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0VmFsdWUoKFN0cmluZykgdmFsdWUpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICBpdGVtLnNldERhdGEoZW51bUZhY2V0KTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgewotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBlbGVtZW50OwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnVtRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gIH0KLQotICBjbGFzcyBFbnVtZXJhdGlvbnNUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCBpbnB1dEVsZW1lbnQpCi0gICAgewotICAgICAgamF2YS51dGlsLkxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0RWxlbWVudDsKLSAgICAgICAgcmV0dXJuIHN0LmdldEVudW1lcmF0aW9uRmFjZXRzKCkudG9BcnJheSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0gIH0KLQotICBjbGFzcyBFbnVtZXJhdGlvbnNUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlcgotICB7Ci0gICAgcHVibGljIEVudW1lcmF0aW9uc1RhYmxlTGFiZWxQcm92aWRlcigpCi0gICAgewotCi0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlRW51bS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgIHsKLSAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgZWxlbWVudDsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZW51bUZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvRXh0ZW5zaW9uc1NlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvRXh0ZW5zaW9uc1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhZDUxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0V4dGVuc2lvbnNTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZEV4dGVuc2lvbkF0dHJpYnV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkRXh0ZW5zaW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRFeHRlbnNpb25FbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5FeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5FeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkNhdGVnb3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkRPTUV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5FeHRlbnNpb25JdGVtRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5FeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5TcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uWFNERXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0LlhTRE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuTW9kZWxSZWNvbmNpbGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25zU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaW9uc1NlY3Rpb24KLXsKLSAgWFNETW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotICAKLSAgcHVibGljIEV4dGVuc2lvbnNTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc2V0RXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIobmV3IERPTUV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyKCkpOwotICAgIHNldEV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIobmV3IFhTREV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nIGNyZWF0ZUFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2coKQotICB7Ci0gICAgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyBkaWFsb2cgPSAgbmV3IEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCksIGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKSkKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgZ2V0Q2F0ZWdvcnlDb250ZW50UHJvdmlkZXIoKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTRENhdGVnb3J5Q29udGVudFByb3ZpZGVyKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBkaWFsb2cuYWRkRWxlbWVudHNUYWJsZUZpbHRlcihuZXcgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZ0ZpbHRlcihpbnB1dCwgZGlhbG9nKSk7ICAgIAotICAgIHJldHVybiBkaWFsb2c7ICAgCi0gIH0KLSAgIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7IAotICAgIGlmIChhZGFwdGVyID09IG51bGwpCi0gICAgewotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmogPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClvYmopLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkYXB0ZXIgPSBYU0RNb2RlbEFkYXB0ZXIubG9va3VwT3JDcmVhdGVNb2RlbEFkYXB0ZXIoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTW9kZWxSZWNvbmNpbGVBZGFwdGVyIG1vZGVsUmVjb25jaWxlQWRhcHRlciA9IGFkYXB0ZXIuZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCk7Ci0gICAgICAgICAgICAgIGlmIChtb2RlbFJlY29uY2lsZUFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vZGVsUmVjb25jaWxlQWRhcHRlci5hZGRMaXN0ZW5lcihpbnRlcm5hbE5vZGVBZGFwdGVyKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbCgyKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBNb2RlbFJlY29uY2lsZUFkYXB0ZXIgbW9kZWxSZWNvbmNpbGVBZGFwdGVyID0gYWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKTsKLSAgICAgIGlmIChtb2RlbFJlY29uY2lsZUFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbW9kZWxSZWNvbmNpbGVBZGFwdGVyLnJlbW92ZUxpc3RlbmVyKGludGVybmFsTm9kZUFkYXB0ZXIpOwotICAgICAgfQotICAgIH0gIAotICB9Ci0KLSAgcHJvdGVjdGVkIEFkZEV4dGVuc2lvbkNvbW1hbmQgZ2V0QWRkRXh0ZW5zaW9uQ29tbWFuZChPYmplY3QgbykKLSAgewotICAgIEFkZEV4dGVuc2lvbkNvbW1hbmQgYWRkRXh0ZW5zaW9uQ29tbWFuZCA9IG51bGw7Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBvOwotICAgICAgRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQgZXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQgPSBnZXRFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KCkuZ2V0QWRkRXh0ZW5zaW9uQ29tbWFuZChlbGVtZW50LmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgIGlmIChleHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBleHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZC5zZXRJbnB1dHMoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBpbnB1dCwgZWxlbWVudCk7Ci0gICAgICAgIGFkZEV4dGVuc2lvbkNvbW1hbmQgPSBleHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYWRkRXh0ZW5zaW9uQ29tbWFuZCA9IG5ldyBBZGRFeHRlbnNpb25FbGVtZW50Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BUFBJTkZPX0VMRU1FTlQsIChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXQsIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBvOwotICAgICAgYWRkRXh0ZW5zaW9uQ29tbWFuZCA9IG5ldyBBZGRFeHRlbnNpb25BdHRyaWJ1dGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FQUElORk9fQVRUUklCVVRFLCAoWFNEQ29uY3JldGVDb21wb25lbnQpIGlucHV0LCBhdHRyaWJ1dGUpOwotICAgIH0KLSAgICByZXR1cm4gYWRkRXh0ZW5zaW9uQ29tbWFuZDsKLSAgfQotCi0gIHByb3RlY3RlZCBDb21tYW5kIGdldFJlbW92ZUV4dGVuc2lvbkNvbW1hbmQoT2JqZWN0IG8pCi0gIHsKLSAgICBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgTm9kZSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpbzsKLSAgICAgICAgRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kIHJlbW92ZUNvbW1hbmQgPSBnZXRFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KCkuZ2V0UmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQobm9kZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGlmIChyZW1vdmVDb21tYW5kICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZW1vdmVDb21tYW5kLnNldElucHV0KChYU0RDb25jcmV0ZUNvbXBvbmVudClpbnB1dCk7Ci0gICAgICAgICAgcmVtb3ZlQ29tbWFuZC5zZXROb2RlKG5vZGUpOwotICAgICAgICAgIHJldHVybiByZW1vdmVDb21tYW5kOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNvbW1hbmQgPSBuZXcgUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEVfQVBQSU5GT19FTEVNRU5ULCBub2RlKTsgIAotICAgICAgICAgIC8vIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBjb21tYW5kOwotICB9ICAKLSAgCi0gIHByb3RlY3RlZCBFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5IGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKQotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1RyZWVWaWV3ZXJJbnB1dEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7ICAKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudClpbnB1dDsKLSAgICAgIEVsZW1lbnQgY29tcG9uZW50RWxlbWVudCA9IGNvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBOb2RlIHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgTm9kZSBncmFuZFBhcmVudCA9IHBhcmVudCAhPSBudWxsID8gcGFyZW50LmdldFBhcmVudE5vZGUoKSA6IG51bGw7Ci0gICAgICByZXR1cm4gY29tcG9uZW50RWxlbWVudCA9PSBlbGVtZW50IHx8IGNvbXBvbmVudEVsZW1lbnQgPT0gcGFyZW50IHx8IGNvbXBvbmVudEVsZW1lbnQgPT0gZ3JhbmRQYXJlbnQ7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZlN0b3JlKCkKLSAgewotICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gIH0KLSAgCi0gIHN0YXRpYyBjbGFzcyBYU0RDYXRlZ29yeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7ICAgIAotICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWFbXSBleHRlbnNpb25zU2NoZW1hU3BlY3MgPSBudWxsOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIExpc3QgaW5wdXRMaXN0ID0gKExpc3QpIGlucHV0RWxlbWVudDsKLSAgICAgICAgCi0gICAgICAgIExpc3QgdG90YWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRvdGFsLmFkZEFsbChpbnB1dExpc3QpOwotICAgICAgICAKLSAgICAgICAgTGlzdCBkeW5hbWljQ2F0ZWdvcmllcyA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KCkuZ2V0Q2F0ZWdvcnlQcm92aWRlcnMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZHluYW1pY0NhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgIENhdGVnb3J5UHJvdmlkZXIgY2F0ZWdvcnlQcm92aWRlciA9IChDYXRlZ29yeVByb3ZpZGVyKWl0ZXIubmV4dCgpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjYXRlZ29yeVByb3ZpZGVyLmdldENhdGVnb3JpZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcCA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICB0b3RhbC5hZGQoc3ApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjcyA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYVtdKSB0b3RhbC50b0FycmF5KG5ldyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYVswXSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9uc1NjaGVtYVNwZWNzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICAgIC8vIERvIG5vdGhpbmcKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICAgIC8vIERvIG5vdGhpbmcKLQotICAgIH0gICAgICAgICAgIAotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBmaWx0ZXIgaXMgdG8gYmUgdXNlZCBieSB0aGUgZGlhbG9nIGludm9rZWQgd2hlbiBhZGRCdXR0b24gaXMgcHJlc3NlZAotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2dGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIKLSAgewotICAgIHByaXZhdGUgT2JqZWN0IGlucHV0OwotICAgIHByaXZhdGUgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyBkaWFsb2c7Ci0KLSAgICBwdWJsaWMgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZ0ZpbHRlcihPYmplY3QgaW5wdXQsIEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2cgZGlhbG9nKQotICAgIHsKLSAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICAgIHRoaXMuZGlhbG9nID0gZGlhbG9nOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpCi0gICAgeyAgICAgIAotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQgJiYKLSAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYyA9IGRpYWxvZy5nZXRTZWxlY3RlZENhdGVnb3J5KCk7Ci0gICAgICAgIC8vIGhlcmUgd2Ugb2J0YWluIHRoZSBub2RlIGZpbHRlciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciB0aGUgYXBwbGljYWJsZSBuYW1lc3BhY2UKLSAgICAgICAgLy8gbm90aWVkCi0gICAgICAgIE5vZGVGaWx0ZXIgZmlsdGVyID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkoKS5nZXROb2RlRmlsdGVyKHNwZWMuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQ2hlY2sgaWYgYSBub2RlIGZpbHRlciBoYXMgYmVlbiBzcGVjaWZpZWQsIGlmIHNvLCB0aGVuIHVzZSBpdAotICAgICAgICAgIGZpbHRlciA9IHNwZWMuZ2V0Tm9kZUZpbHRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpbHRlciBpbnN0YW5jZW9mIEV4dGVuc2lvbkl0ZW1GaWx0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBFeHRlbnNpb25JdGVtRmlsdGVyIGV4dGVuc2lvbkl0ZW1GaWx0ZXIgPSAoRXh0ZW5zaW9uSXRlbUZpbHRlcilmaWx0ZXI7Ci0gICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbkl0ZW1GaWx0ZXIuaXNBcHBsaWNhYmxlQ29udGV4dCgoWFNEQ29uY3JldGVDb21wb25lbnQpaW5wdXQsIChYU0RDb25jcmV0ZUNvbXBvbmVudCllbGVtZW50KTsgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBUT0RPIGNzOiBldmVuIGlmIGl0J3MganVzdCBhIHBsYWluIG9sZCBOb2RlRmlsdGVyIHdlIHNob3VsZCBzdGlsbCBiZSBhYmxlIHRvIHVzZSBpdCEgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfSAgCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0ZhY2V0Vmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0ZhY2V0Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxM2Q3NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9GYWNldFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi0vL2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotLy9pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotLy9pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0vLwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tBZGFwdGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5OYXZpZ2FibGVUYWJsZVZpZXdlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5ET01BdHRyaWJ1dGU7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3I7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbnN0cmFpbmluZ0ZhY2V0OwotLy9pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4RXhjbHVzaXZlRmFjZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4RmFjZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4SW5jbHVzaXZlRmFjZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluRXhjbHVzaXZlRmFjZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluRmFjZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluSW5jbHVzaXZlRmFjZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFCdWlsZGluZ1Rvb2xzOwotLy9pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEZhY2V0Vmlld2VyIC8vZXh0ZW5kcyBOYXZpZ2FibGVUYWJsZVZpZXdlciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIKLXsKLS8vICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9OQU1FID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZBQ0VUX05BTUUiKTsgLy8gIk5hbWUiOwotLy8gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX1ZBTFVFID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZBQ0VUX1ZBTFVFIik7IC8vICJWYWx1ZSI7Ci0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRfT1RIRVIgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRkFDRVRfRklYRUQiKTsgLy8gIkZpeGVkIjsKLS8vCi0vLyAgcHJvdGVjdGVkIEZhY2V0c1RhYmxlTGFiZWxQcm92aWRlciBmYWNldHNUYWJsZUxhYmVsUHJvdmlkZXIgPSBuZXcgRmFjZXRzVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0vLyAgcHJvdGVjdGVkIEZhY2V0c1RhYmxlQ29udGVudFByb3ZpZGVyIGZhY2V0c1RhYmxlQ29udGVudFByb3ZpZGVyID0gbmV3IEZhY2V0c1RhYmxlQ29udGVudFByb3ZpZGVyKCk7Ci0vLyAgcHJvdGVjdGVkIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMgPSB7IEZBQ0VUX05BTUUsIEZBQ0VUX1ZBTFVFLCBGQUNFVF9PVEhFUiB9OwotLy8gIHByb3RlY3RlZCBDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnM7IC8vIHRoZXNlIGNlbGxFZGl0b3JzIGFyZSB1c2VkIHdoZW4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24td2hpdGVzcGFjZSBmYWNldCBpcyBzZWxlY3RlZAotLy8gIHByb3RlY3RlZCBDZWxsRWRpdG9yW10gYWx0Q2VsbEVkaXRvcnM7IC8vIHRoZXNlIGNlbGxFZGl0b3JzIGFyZSB1c2VkIHdoZW4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpdGVzcGFjZSBmYWNldCBpcyBzZWxlY3RlZAotLy8KLS8vICBwcm90ZWN0ZWQgU3RyaW5nW10gd2hpdGVTcGFjZVZhbHVlcyA9IG5ldyBTdHJpbmdbXSB7ICIiLCAicHJlc2VydmUiLCAicmVwbGFjZSIsICJjb2xsYXBzZSIgfTsKLS8vICBwcm90ZWN0ZWQgU3RyaW5nW10gdHJ1ZUZhbHNlVmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgIiIsICJmYWxzZSIsICJ0cnVlIiB9OwotLy8KLS8vICAvKioKLS8vICAgKiBAcGFyYW0gcGFyZW50Ci0vLyAgICovCi0vLyAgcHVibGljIEZhY2V0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpCi0vLyAgewotLy8gICAgc3VwZXIobmV3IFRhYmxlKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULlNJTkdMRSkpOwotLy8KLS8vICAgIGdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotLy8gICAgZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotLy8KLS8vICAgIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotLy8gICAgZ2V0VGFibGUoKS5hZGRNb3VzZVRyYWNrTGlzdGVuZXIobmV3IE15TW91c2VUcmFja0xpc3RlbmVyKCkpOwotLy8KLS8vICAgIHNldENvbnRlbnRQcm92aWRlcihmYWNldHNUYWJsZUNvbnRlbnRQcm92aWRlcik7Ci0vLyAgICBzZXRMYWJlbFByb3ZpZGVyKGZhY2V0c1RhYmxlTGFiZWxQcm92aWRlcik7Ci0vLyAgICBzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotLy8KLS8vICAgIHNldENlbGxNb2RpZmllcih0aGlzKTsKLS8vCi0vLyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykKLS8vICAgIHsKLS8vICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGdldFRhYmxlKCksIFNXVC5OT05FLCBpKTsKLS8vICAgICAgY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc1tpXSk7Ci0vLyAgICAgIGNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotLy8gICAgICBjb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotLy8gICAgfQotLy8KLS8vICAgIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbM107Ci0vLyAgICBhbHRDZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yWzNdOwotLy8KLS8vICAgIFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotLy8gICAgQ29sdW1uV2VpZ2h0RGF0YSBkYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNjAsIDgwLCB0cnVlKTsKLS8vICAgIGxheW91dC5hZGRDb2x1bW5EYXRhKGRhdGEpOwotLy8gICAgY2VsbEVkaXRvcnNbMF0gPSBudWxsOwotLy8KLS8vICAgIENvbHVtbldlaWdodERhdGEgZGF0YTIgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMjAsIDgwLCB0cnVlKTsKLS8vICAgIGxheW91dC5hZGRDb2x1bW5EYXRhKGRhdGEyKTsKLS8vCi0vLyAgICBjZWxsRWRpdG9yc1sxXSA9IG5ldyBUZXh0Q2VsbEVkaXRvcihnZXRUYWJsZSgpKTsKLS8vICAgIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIHBkID0gbmV3IFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKCJjb21ibyIsICJ3aGl0ZXNwYWNlIiwgd2hpdGVTcGFjZVZhbHVlcyk7Ci0vLyAgICBhbHRDZWxsRWRpdG9yc1sxXSA9IHBkLmNyZWF0ZVByb3BlcnR5RWRpdG9yKGdldFRhYmxlKCkpOwotLy8KLS8vICAgIENvbHVtbldlaWdodERhdGEgZGF0YTMgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg2MCwgNjAsIHRydWUpOwotLy8gICAgbGF5b3V0LmFkZENvbHVtbkRhdGEoZGF0YTMpOwotLy8KLS8vICAgIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIHBkMiA9IG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigiY29tYm8iLCAib3RoZXIiLCB0cnVlRmFsc2VWYWx1ZXMpOwotLy8gICAgY2VsbEVkaXRvcnNbMl0gPSBwZDIuY3JlYXRlUHJvcGVydHlFZGl0b3IoZ2V0VGFibGUoKSk7Ci0vLyAgICBhbHRDZWxsRWRpdG9yc1syXSA9IHBkMi5jcmVhdGVQcm9wZXJ0eUVkaXRvcihnZXRUYWJsZSgpKTsKLS8vCi0vLyAgICBnZXRUYWJsZSgpLnNldExheW91dChsYXlvdXQpOwotLy8gICAgc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotLy8KLS8vICB9Ci0vLwotLy8gIC8qCi0vLyAgICogKG5vbi1KYXZhZG9jKQotLy8gICAqIAotLy8gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyI2Nhbk1vZGlmeShqYXZhLmxhbmcuT2JqZWN0LAotLy8gICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLS8vICAgKi8KLS8vICBwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLS8vICB7Ci0vLyAgICByZXR1cm4gcHJvcGVydHkuZXF1YWxzKEZBQ0VUX1ZBTFVFKSB8fCBwcm9wZXJ0eS5lcXVhbHMoRkFDRVRfT1RIRVIpOwotLy8gIH0KLS8vCi0vLyAgLyoKLS8vICAgKiAobm9uLUphdmFkb2MpCi0vLyAgICogCi0vLyAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjZ2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCwKLS8vICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0vLyAgICovCi0vLyAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotLy8gIHsKLS8vICAgIGludCBjb2x1bW4gPSAwOwotLy8gICAgaWYgKHByb3BlcnR5LmVxdWFscyhjb2x1bW5Qcm9wZXJ0aWVzWzBdKSkKLS8vICAgIHsKLS8vICAgICAgY29sdW1uID0gMDsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhjb2x1bW5Qcm9wZXJ0aWVzWzFdKSkKLS8vICAgIHsKLS8vICAgICAgY29sdW1uID0gMTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhjb2x1bW5Qcm9wZXJ0aWVzWzJdKSkKLS8vICAgIHsKLS8vICAgICAgY29sdW1uID0gMjsKLS8vICAgIH0KLS8vCi0vLyAgICByZXR1cm4gZmFjZXRzVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQoZWxlbWVudCwgY29sdW1uKTsKLS8vICB9Ci0vLwotLy8gIC8qCi0vLyAgICogKG5vbi1KYXZhZG9jKQotLy8gICAqIAotLy8gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyI21vZGlmeShqYXZhLmxhbmcuT2JqZWN0LAotLy8gICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLS8vICAgKi8KLS8vICBwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKQotLy8gIHsKLS8vICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGdldElucHV0KCk7Ci0vLyAgICBUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGVsZW1lbnQ7Ci0vLyAgICBpZiAoaXRlbSAhPSBudWxsKQotLy8gICAgewotLy8gICAgICBPYmplY3QgbyA9IGl0ZW0uZ2V0RGF0YSgpOwotLy8gICAgICBpZiAobyAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgU3RyaW5nIGZhY2V0ID0gKFN0cmluZykgbzsKLS8vCi0vLyAgICAgICAgICBFbGVtZW50IHNpbXBsZVR5cGVFbGVtZW50ID0geHNkU2ltcGxlVHlwZS5nZXRFbGVtZW50KCk7Ci0vLyAgICAgICAgICBYU0RET01IZWxwZXIgeHNkRE9NSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotLy8gICAgICAgICAgRWxlbWVudCBkZXJpdmVkQnlFbGVtZW50ID0geHNkRE9NSGVscGVyLmdldERlcml2ZWRCeUVsZW1lbnQoc2ltcGxlVHlwZUVsZW1lbnQpOwotLy8KLS8vICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBzaW1wbGVUeXBlRWxlbWVudC5nZXRQcmVmaXgoKTsKLS8vICAgICAgICAgIHByZWZpeCA9IChwcmVmaXggPT0gbnVsbCkgPyAiIiA6IChwcmVmaXggKyAiOiIpOwotLy8KLS8vICAgICAgICAgIEVsZW1lbnQgY2hpbGROb2RlRWxlbWVudCA9IG51bGw7Ci0vLyAgICAgICAgICBET01BdHRyaWJ1dGUgdmFsdWVBdHRyID0gbnVsbDsKLS8vCi0vLyAgICAgICAgICBYU0RDb25zdHJhaW5pbmdGYWNldCB0YXJnZXRGYWNldCA9IGdldFhTRENvbnN0cmFpbmluZ0ZhY2V0KGZhY2V0KTsKLS8vCi0vLyAgICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSAiIjsKLS8vICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBuZXdWYWx1ZSA9IChTdHJpbmcpIHZhbHVlOwotLy8gICAgICAgICAgfQotLy8KLS8vICAgICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoY29sdW1uUHJvcGVydGllc1sxXSkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCA9PSBudWxsICYmIG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIHRhcmdldEZhY2V0ID0gY3JlYXRlRmFjZXQoZmFjZXQpOwotLy8gICAgICAgICAgICAgIGNoaWxkTm9kZUVsZW1lbnQgPSAoZGVyaXZlZEJ5RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpLmNyZWF0ZUVsZW1lbnROUyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsIHByZWZpeCArIGZhY2V0KTsKLS8vICAgICAgICAgICAgICB2YWx1ZUF0dHIgPSBuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5WQUxVRV9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLS8vICAgICAgICAgICAgICBjaGlsZE5vZGVFbGVtZW50LnNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIuZ2V0TmFtZSgpLCB2YWx1ZUF0dHIuZ2V0VmFsdWUoKSk7Ci0vLyAgICAgICAgICAgICAgLy8gYWRkIGFuZCBmb3JtYXQgY2hpbGQKLS8vICAgICAgICAgICAgICBkZXJpdmVkQnlFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkTm9kZUVsZW1lbnQpOwotLy8gICAgICAgICAgICAgIHRhcmdldEZhY2V0LnNldEVsZW1lbnQoY2hpbGROb2RlRWxlbWVudCk7Ci0vLyAgICAgICAgICAgICAgWFNERE9NSGVscGVyLmZvcm1hdENoaWxkKGNoaWxkTm9kZUVsZW1lbnQpOwotLy8KLS8vICAgICAgICAgICAgICAvLyBYU0RTY2hlbWFIZWxwZXIudXBkYXRlRWxlbWVudCh4c2RTaW1wbGVUeXBlKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBpZiAodGFyZ2V0RmFjZXQgPT0gbnVsbCkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIHJldHVybjsKLS8vICAgICAgICAgICAgfQotLy8KLS8vICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIHRhcmdldEZhY2V0LnNldExleGljYWxWYWx1ZShuZXdWYWx1ZSk7Ci0vLwotLy8gICAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCBpbnN0YW5jZW9mIFhTRE1heEZhY2V0IHx8IHRhcmdldEZhY2V0IGluc3RhbmNlb2YgWFNETWluRmFjZXQpCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgaWYgKHRhcmdldEZhY2V0IGluc3RhbmNlb2YgWFNETWF4RmFjZXQpCi0vLyAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCBpbnN0YW5jZW9mIFhTRE1heEV4Y2x1c2l2ZUZhY2V0KQotLy8gICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgWFNETWF4SW5jbHVzaXZlRmFjZXQgeHNkTWF4SW5jbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1heEluY2x1c2l2ZUZhY2V0KCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgaWYgKHhzZE1heEluY2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0vLyAgICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB4c2RNYXhJbmNsdXNpdmVGYWNldEVsZW1lbnQgPSB4c2RNYXhJbmNsdXNpdmVGYWNldC5nZXRFbGVtZW50KCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UoeHNkTWF4SW5jbHVzaXZlRmFjZXRFbGVtZW50KTsKLS8vICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0RmFjZXQgaW5zdGFuY2VvZiBYU0RNYXhJbmNsdXNpdmVGYWNldCkKLS8vICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgIFhTRE1heEV4Y2x1c2l2ZUZhY2V0IHhzZE1heEV4Y2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNYXhFeGNsdXNpdmVGYWNldCgpOwotLy8gICAgICAgICAgICAgICAgICAgIGlmICh4c2RNYXhFeGNsdXNpdmVGYWNldCAhPSBudWxsKQotLy8gICAgICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgeHNkTWF4RXhjbHVzaXZlRmFjZXRFbGVtZW50ID0geHNkTWF4RXhjbHVzaXZlRmFjZXQuZ2V0RWxlbWVudCgpOwotLy8gICAgICAgICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHhzZE1heEV4Y2x1c2l2ZUZhY2V0RWxlbWVudCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXJnZXRGYWNldCBpbnN0YW5jZW9mIFhTRE1pbkZhY2V0KQotLy8gICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RmFjZXQgaW5zdGFuY2VvZiBYU0RNaW5FeGNsdXNpdmVGYWNldCkKLS8vICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgIFhTRE1pbkluY2x1c2l2ZUZhY2V0IHhzZE1pbkluY2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNaW5JbmNsdXNpdmVGYWNldCgpOwotLy8gICAgICAgICAgICAgICAgICAgIGlmICh4c2RNaW5JbmNsdXNpdmVGYWNldCAhPSBudWxsKQotLy8gICAgICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgeHNkTWluSW5jbHVzaXZlRmFjZXRFbGVtZW50ID0geHNkTWluSW5jbHVzaXZlRmFjZXQuZ2V0RWxlbWVudCgpOwotLy8gICAgICAgICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHhzZE1pbkluY2x1c2l2ZUZhY2V0RWxlbWVudCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhcmdldEZhY2V0IGluc3RhbmNlb2YgWFNETWluSW5jbHVzaXZlRmFjZXQpCi0vLyAgICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICBYU0RNaW5FeGNsdXNpdmVGYWNldCB4c2RNaW5FeGNsdXNpdmVGYWNldCA9IHhzZFNpbXBsZVR5cGUuZ2V0TWluRXhjbHVzaXZlRmFjZXQoKTsKLS8vICAgICAgICAgICAgICAgICAgICBpZiAoeHNkTWluRXhjbHVzaXZlRmFjZXQgIT0gbnVsbCkKLS8vICAgICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHhzZE1pbkV4Y2x1c2l2ZUZhY2V0RWxlbWVudCA9IHhzZE1pbkV4Y2x1c2l2ZUZhY2V0LmdldEVsZW1lbnQoKTsKLS8vICAgICAgICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZSh4c2RNaW5FeGNsdXNpdmVGYWNldEVsZW1lbnQpOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBlbHNlCi0vLyAgICAgICAgICAgIC8vIG5ld1ZhbHVlLmxlbmd0aCA9PSAwCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICBFbGVtZW50IHRhcmdldEZhY2V0RWxlbWVudCA9IHRhcmdldEZhY2V0LmdldEVsZW1lbnQoKTsKLS8vICAgICAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UodGFyZ2V0RmFjZXRFbGVtZW50KTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMl0pKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBpZiAodGFyZ2V0RmFjZXQgIT0gbnVsbCkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDApCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgdGFyZ2V0RmFjZXQuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0vLyAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICB0YXJnZXRGYWNldC5nZXRFbGVtZW50KCkucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUpOwotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgeHNkU2ltcGxlVHlwZS5zZXRFbGVtZW50KHNpbXBsZVR5cGVFbGVtZW50KTsKLS8vICAgICAgICAgIC8vIHhzZFNpbXBsZVR5cGUudXBkYXRlRWxlbWVudCgpOwotLy8gICAgICAgICAgcmVmcmVzaCgpOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgfQotLy8gIH0KLS8vCi0vLyAgcHJpdmF0ZSBYU0RDb25zdHJhaW5pbmdGYWNldCBnZXRYU0RDb25zdHJhaW5pbmdGYWNldChTdHJpbmcgZmFjZXRTdHJpbmcpCi0vLyAgewotLy8gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgZ2V0SW5wdXQoKTsKLS8vICAgIExpc3QgbGlzdCA9IHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpOwotLy8gICAgaWYgKGxpc3QgPT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgcmV0dXJuIG51bGw7Ci0vLyAgICB9Ci0vLyAgICBJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOwotLy8gICAgWFNEQ29uc3RyYWluaW5nRmFjZXQgdGFyZ2V0RmFjZXQgPSBudWxsOwotLy8KLS8vICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLS8vICAgIHsKLS8vICAgICAgWFNEQ29uc3RyYWluaW5nRmFjZXQgeHNkQ29uc3RyYWluaW5nRmFjZXQgPSAoWFNEQ29uc3RyYWluaW5nRmFjZXQpIGl0ZXIubmV4dCgpOwotLy8gICAgICBpZiAoeHNkQ29uc3RyYWluaW5nRmFjZXQuZ2V0RmFjZXROYW1lKCkuZXF1YWxzKGZhY2V0U3RyaW5nKSkKLS8vICAgICAgewotLy8gICAgICAgIHRhcmdldEZhY2V0ID0geHNkQ29uc3RyYWluaW5nRmFjZXQ7Ci0vLyAgICAgICAgYnJlYWs7Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICAgIHJldHVybiB0YXJnZXRGYWNldDsKLS8vICB9Ci0vLwotLy8gIHByaXZhdGUgWFNEQ29uc3RyYWluaW5nRmFjZXQgY3JlYXRlRmFjZXQoU3RyaW5nIGZhY2V0KQotLy8gIHsKLS8vICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotLy8gICAgWFNEQ29uc3RyYWluaW5nRmFjZXQgeHNkRmFjZXQgPSBudWxsOwotLy8gICAgaWYgKGZhY2V0LmVxdWFscygibGVuZ3RoIikpCi0vLyAgICB7Ci0vLyAgICAgIHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RMZW5ndGhGYWNldCgpOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtaW5MZW5ndGgiKSkKLS8vICAgIHsKLS8vICAgICAgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRE1pbkxlbmd0aEZhY2V0KCk7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1heExlbmd0aCIpKQotLy8gICAgewotLy8gICAgICB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNETWF4TGVuZ3RoRmFjZXQoKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWluSW5jbHVzaXZlIikpCi0vLyAgICB7Ci0vLyAgICAgIHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RNaW5JbmNsdXNpdmVGYWNldCgpOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtaW5FeGNsdXNpdmUiKSkKLS8vICAgIHsKLS8vICAgICAgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRE1pbkV4Y2x1c2l2ZUZhY2V0KCk7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1heEluY2x1c2l2ZSIpKQotLy8gICAgewotLy8gICAgICB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNETWF4SW5jbHVzaXZlRmFjZXQoKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWF4RXhjbHVzaXZlIikpCi0vLyAgICB7Ci0vLyAgICAgIHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RNYXhFeGNsdXNpdmVGYWNldCgpOwotLy8gICAgfQotLy8KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygidG90YWxEaWdpdHMiKSkKLS8vICAgIHsKLS8vICAgICAgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRFRvdGFsRGlnaXRzRmFjZXQoKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygiZnJhY3Rpb25EaWdpdHMiKSkKLS8vICAgIHsKLS8vICAgICAgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTREZyYWN0aW9uRGlnaXRzRmFjZXQoKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygid2hpdGVTcGFjZSIpKQotLy8gICAgewotLy8gICAgICB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNEV2hpdGVTcGFjZUZhY2V0KCk7Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4geHNkRmFjZXQ7Ci0vLyAgfQotLy8KLS8vICAvKioKLS8vICAgKiBHZXQgdGhlIHRvb2x0aXAgZm9yIHRoZSBmYWNldAotLy8gICAqLwotLy8gIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcChTdHJpbmcgZmFjZXQpCi0vLyAgewotLy8gICAgU3RyaW5nIGtleSA9ICIiOwotLy8gICAgaWYgKGZhY2V0LmVxdWFscygibGVuZ3RoIikpCi0vLyAgICB7Ci0vLyAgICAgIGtleSA9ICJfVUlfVE9PTFRJUF9MRU5HVEgiOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtaW5MZW5ndGgiKSkKLS8vICAgIHsKLS8vICAgICAga2V5ID0gIl9VSV9UT09MVElQX01JTl9MRU4iOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtYXhMZW5ndGgiKSkKLS8vICAgIHsKLS8vICAgICAga2V5ID0gIl9VSV9UT09MVElQX01BWF9MRU4iOwotLy8gICAgfQotLy8KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWluSW5jbHVzaXZlIikpCi0vLyAgICB7Ci0vLyAgICAgIGtleSA9ICJfVUlfVE9PTFRJUF9NSU5fSU5DTFVTSVZFIjsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWluRXhjbHVzaXZlIikpCi0vLyAgICB7Ci0vLyAgICAgIGtleSA9ICJfVUlfVE9PTFRJUF9NSU5fRVhDTFVTSVZFIjsKLS8vICAgIH0KLS8vCi0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1heEluY2x1c2l2ZSIpKQotLy8gICAgewotLy8gICAgICBrZXkgPSAiX1VJX1RPT0xUSVBfTUFYX0lOQ0xVU0lWRSI7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1heEV4Y2x1c2l2ZSIpKQotLy8gICAgewotLy8gICAgICBrZXkgPSAiX1VJX1RPT0xUSVBfTUFYX0VYQ0xVU0lWRSI7Ci0vLyAgICB9Ci0vLwotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJ0b3RhbERpZ2l0cyIpKQotLy8gICAgewotLy8gICAgICBrZXkgPSAiX1VJX1RPT0xUSVBfVE9UQUxfRElHSVRTIjsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygiZnJhY3Rpb25EaWdpdHMiKSkKLS8vICAgIHsKLS8vICAgICAga2V5ID0gIl9VSV9UT09MVElQX0ZSQUNUSU9OX0RJR0lUUyI7Ci0vLyAgICB9Ci0vLwotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJ3aGl0ZVNwYWNlIikpCi0vLyAgICB7Ci0vLyAgICAgIGtleSA9ICJfVUlfVE9PTFRJUF9XSElURV9TUEFDRSI7Ci0vLyAgICB9Ci0vLwotLy8gICAgcmV0dXJuIChrZXkgIT0gbnVsbCkgPyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKGtleSkgOiAiIjsKLS8vICB9Ci0vLwotLy8gIC8qKgotLy8gICAqIFRoaXMgbGlzdGVuZXIgZGV0ZWN0cyB3aGljaCByb3cgaXMgc2VsZWN0ZWQgYW5kIGFkZCBhIHRvb2wgdGlwIGZvciB0aGF0IHJvdwotLy8gICAqLwotLy8gIHB1YmxpYyBjbGFzcyBNeU1vdXNlVHJhY2tMaXN0ZW5lciBleHRlbmRzIE1vdXNlVHJhY2tBZGFwdGVyCi0vLyAgewotLy8gICAgcHVibGljIHZvaWQgbW91c2VIb3ZlcihNb3VzZUV2ZW50IGUpCi0vLyAgICB7Ci0vLyAgICAgIFRhYmxlSXRlbSBpdGVtID0gZ2V0VGFibGUoKS5nZXRJdGVtKG5ldyBQb2ludChlLngsIGUueSkpOwotLy8gICAgICBpZiAoaXRlbSAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgT2JqZWN0IG8gPSBpdGVtLmdldERhdGEoKTsKLS8vICAgICAgICBpZiAobyAhPSBudWxsKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIFN0cmluZyBmYWNldE5hbWUgPSAoU3RyaW5nKSBvOwotLy8gICAgICAgICAgZ2V0VGFibGUoKS5zZXRUb29sVGlwVGV4dChnZXRUb29sVGlwKGZhY2V0TmFtZSkpOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgfQotLy8gIH0KLS8vCi0vLyAgLyoqCi0vLyAgICogQmFzZWQgb24gdGhlIHNlbGVjdGlvbiwgZGV0ZWN0cyBpZiBpdCBpcyBhIHdoaXRlIHNwYWNlIG9yIG5vdCwgYW5kIGFkZCB0aGUKLS8vICAgKiBjb3JyZXNwb25kaW5nIGNlbGwgZWRpdG9ycwotLy8gICAqLwotLy8gIHB1YmxpYyBjbGFzcyBTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0vLyAgewotLy8gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0vLyAgICB7Ci0vLyAgICAgIE9iamVjdCBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLS8vICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0vLyAgICAgIHsKLS8vICAgICAgICBPYmplY3QgbyA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLS8vICAgICAgICBpZiAobyAhPSBudWxsKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIFN0cmluZyBmYWNldCA9IChTdHJpbmcpIG87Ci0vLyAgICAgICAgICBpZiAoZmFjZXQuZXF1YWxzKCJ3aGl0ZVNwYWNlIikpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHNldENlbGxFZGl0b3JzKGFsdENlbGxFZGl0b3JzKTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgfQotLy8gIH0KLS8vCi0vLyAgY2xhc3MgRmFjZXRzVGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotLy8gIHsKLS8vICAgIHByb3RlY3RlZCBTdHJpbmcgZmFjZXQ7Ci0vLwotLy8gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotLy8gICAgewotLy8gICAgfQotLy8KLS8vICAgIHB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCBpbnB1dEVsZW1lbnQpCi0vLyAgICB7Ci0vLyAgICAgIExpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gaW5wdXRYU0RTaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dEVsZW1lbnQ7Ci0vLyAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGJhc2UgPSBpbnB1dFhTRFNpbXBsZVR5cGUuZ2V0UHJpbWl0aXZlVHlwZURlZmluaXRpb24oKTsKLS8vCi0vLyAgICAgIGlmIChiYXNlICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBJdGVyYXRvciB2YWxpZEZhY2V0cyA9IGlucHV0WFNEU2ltcGxlVHlwZS5nZXRWYWxpZEZhY2V0cygpLml0ZXJhdG9yKCk7Ci0vLyAgICAgICAgd2hpbGUgKHZhbGlkRmFjZXRzLmhhc05leHQoKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBTdHJpbmcgYVZhbGlkRmFjZXQgPSAoU3RyaW5nKSB2YWxpZEZhY2V0cy5uZXh0KCk7Ci0vLyAgICAgICAgICBpZiAoIShhVmFsaWRGYWNldC5lcXVhbHMoInBhdHRlcm4iKSB8fCBhVmFsaWRGYWNldC5lcXVhbHMoImVudW1lcmF0aW9uIikpKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB2LmFkZChhVmFsaWRGYWNldCk7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICAgIHJldHVybiB2LnRvQXJyYXkoKTsKLS8vICAgIH0KLS8vCi0vLyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLS8vICAgIHsKLS8vICAgIH0KLS8vICB9Ci0vLwotLy8gIGNsYXNzIEZhY2V0c1RhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyCi0vLyAgewotLy8gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0vLyAgICB7Ci0vLyAgICAgIHJldHVybiBudWxsOwotLy8gICAgfQotLy8KLS8vICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotLy8gICAgewotLy8gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykKLS8vICAgICAgewotLy8gICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0vLyAgICAgICAgWFNEQ29uc3RyYWluaW5nRmFjZXQgdGFyZ2V0RmFjZXQgPSBnZXRYU0RDb25zdHJhaW5pbmdGYWNldCgoU3RyaW5nKSBlbGVtZW50KTsKLS8vICAgICAgICBzd2l0Y2ggKGNvbHVtbkluZGV4KQotLy8gICAgICAgIHsKLS8vICAgICAgICBjYXNlIDA6Ci0vLyAgICAgICAgewotLy8gICAgICAgICAgdmFsdWUgPSAoU3RyaW5nKSBlbGVtZW50OwotLy8gICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGNhc2UgMToKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBpZiAodGFyZ2V0RmFjZXQgPT0gbnVsbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgdmFsdWUgPSAiIjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgdmFsdWUgPSB0YXJnZXRGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLS8vICAgICAgICAgIH0KLS8vCi0vLyAgICAgICAgICBicmVhazsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgY2FzZSAyOgotLy8gICAgICAgIHsKLS8vICAgICAgICAgIGlmICh0YXJnZXRGYWNldCA9PSBudWxsKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB2YWx1ZSA9ICIiOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBFbGVtZW50IGVsZW0gPSB0YXJnZXRGYWNldC5nZXRFbGVtZW50KCk7Ci0vLyAgICAgICAgICAgIHZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSk7Ci0vLyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotLy8gICAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgICByZXR1cm4gdmFsdWU7Ci0vLyAgICAgIH0KLS8vICAgICAgcmV0dXJuICIiOwotLy8gICAgfQotLy8gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0lEb2N1bWVudENoYW5nZWROb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJlNjMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyCi17Ci0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb2RlQWRhcHRlciBhZGFwdGVyKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL011bHRpcGxpY2l0eVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvTXVsdGlwbGljaXR5U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTZhY2ZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvTXVsdGlwbGljaXR5U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTWF4T2NjdXJzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVNaW5PY2N1cnNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBNdWx0aXBsaWNpdHlTZWN0aW9uIGV4dGVuZHMgUmVmYWN0b3JpbmdTZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBDQ29tYm8gbWluQ29tYm8sIG1heENvbWJvOwotCi0gIHB1YmxpYyBNdWx0aXBsaWNpdHlTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGlmIChldmVudC53aWRnZXQgPT0gbWluQ29tYm8pCi0gICAgewotICAgICAgdXBkYXRlTWluQXR0cmlidXRlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBtYXhDb21ibykKLSAgICB7Ci0gICAgICB1cGRhdGVNYXhBdHRyaWJ1dGUoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gbWluQ29tYm8pCi0gICAgewotICAgICAgdXBkYXRlTWluQXR0cmlidXRlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG1heENvbWJvKQotICAgIHsKLSAgICAgIHVwZGF0ZU1heEF0dHJpYnV0ZSgpOwotICAgIH0KLSAgICBzdXBlci5kb1dpZGdldFNlbGVjdGVkKGUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTWF4QXR0cmlidXRlKCkKLSAgewotICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IG51bGw7Ci0KLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZUNvbnRlbnQpCi0gICAgewotICAgICAgcGFydGljbGUgPSBnZXRBc3NvY2lhdGVkUGFydGljbGUoKFhTRFBhcnRpY2xlQ29udGVudCkgaW5wdXQpOwotICAgIH0KLSAgICBpZiAocGFydGljbGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBtYXhDb21iby5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgCi0gICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgcGFydGljbGUudW5zZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGludCBuZXdNYXggPSAxOwotICAgICAgICBpZiAobmV3VmFsdWUuZXF1YWxzKCJ1bmJvdW5kZWQiKSB8fCBuZXdWYWx1ZS5lcXVhbHMoIioiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdNYXggPSBYU0RQYXJ0aWNsZS5VTkJPVU5ERUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuZXdNYXggPSBJbnRlZ2VyLnBhcnNlSW50KG5ld1ZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgVXBkYXRlTWF4T2NjdXJzQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9DSEFOR0VfTUFYSU1VTV9PQ0NVUlJFTkNFLCBwYXJ0aWNsZSwgbmV3TWF4KTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5fVUlfRVJST1JfSU5WQUxJRF9WQUxVRV9GT1JfTUFYSU1VTV9PQ0NVUlJFTkNFKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNaW5BdHRyaWJ1dGUoKQotICB7Ci0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gbnVsbDsKLQotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlQ29udGVudCkKLSAgICB7Ci0gICAgICBwYXJ0aWNsZSA9IGdldEFzc29jaWF0ZWRQYXJ0aWNsZSgoWFNEUGFydGljbGVDb250ZW50KSBpbnB1dCk7Ci0gICAgfQotICAgIGlmIChwYXJ0aWNsZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IG1pbkNvbWJvLmdldFRleHQoKTsKLSAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgICBwYXJ0aWNsZS51bnNldE1pbk9jY3VycygpOwotICAgICAgfQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGludCBuZXdNaW4gPSAxOwotICAgICAgICBpZiAobmV3VmFsdWUuZXF1YWxzKCJ1bmJvdW5kZWQiKSB8fCBuZXdWYWx1ZS5lcXVhbHMoIioiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdNaW4gPSBYU0RQYXJ0aWNsZS5VTkJPVU5ERUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmV3TWluID0gSW50ZWdlci5wYXJzZUludChuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgVXBkYXRlTWluT2NjdXJzQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9DSEFOR0VfTUlOSU1VTV9PQ0NVUlJFTkNFLCBwYXJ0aWNsZSwgbmV3TWluKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaE1pbk1heCgpCi0gIHsKLSAgICBib29sZWFuIHJlZnJlc2hNaW5UZXh0ID0gdHJ1ZTsKLSAgICBib29sZWFuIHJlZnJlc2hNYXhUZXh0ID0gdHJ1ZTsKLSAgICBpZiAobWluQ29tYm8uaXNGb2N1c0NvbnRyb2woKSkKLSAgICB7Ci0gICAgICByZWZyZXNoTWluVGV4dCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAobWF4Q29tYm8uaXNGb2N1c0NvbnRyb2woKSkKLSAgICB7Ci0gICAgICByZWZyZXNoTWF4VGV4dCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAocmVmcmVzaE1pblRleHQpCi0gICAgewotICAgICAgbWluQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgaWYgKHJlZnJlc2hNYXhUZXh0KQotICAgIHsKLSAgICAgIG1heENvbWJvLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEUGFydGljbGVDb250ZW50KQotICAgICAgewotICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IGdldEFzc29jaWF0ZWRQYXJ0aWNsZSgoWFNEUGFydGljbGVDb250ZW50KSBpbnB1dCk7Ci0gICAgICAgIGlmIChwYXJ0aWNsZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gbWluVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKHBhcnRpY2xlLmdldE1pbk9jY3VycygpKSk7Ci0gICAgICAgICAgLy8gbWF4VGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKHBhcnRpY2xlLmdldE1heE9jY3VycygpKSk7Ci0gICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gcGFydGljbGUuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKSAmJiByZWZyZXNoTWluVGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIG1pbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgbWluQ29tYm8uc2V0VGV4dChtaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5NQVhPQ0NVUlNfQVRUUklCVVRFKSAmJiByZWZyZXNoTWF4VGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIG1heCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NQVhPQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgbWF4Q29tYm8uc2V0VGV4dChtYXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBYU0RQYXJ0aWNsZSBnZXRBc3NvY2lhdGVkUGFydGljbGUoWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlQ29udGVudCkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXAgPSBwYXJ0aWNsZUNvbnRlbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgaWYgKHhzZENvbXAgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICB7Ci0gICAgICByZXR1cm4gKFhTRFBhcnRpY2xlKSB4c2RDb21wOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAobWluQ29tYm8gIT0gbnVsbCAmJiAhbWluQ29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgcmVtb3ZlTGlzdGVuZXJzKG1pbkNvbWJvKTsKLSAgICBpZiAobWF4Q29tYm8gIT0gbnVsbCAmJiAhbWF4Q29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgcmVtb3ZlTGlzdGVuZXJzKG1heENvbWJvKTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9SZWZhY3RvcmluZ1NlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvUmVmYWN0b3JpbmdTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZWZkMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9SZWZhY3RvcmluZ1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5JU2VsZWN0aW9uTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmhhbmRsZXJzLlJlbmFtZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmFjdG9yaW5nU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiBpbXBsZW1lbnRzIElIeXBlcmxpbmtMaXN0ZW5lcgotewotICAvKioKLSAgICogQ2xpY2tpbmcgb24gaXQgaW52b2tlcyB0aGUgcmVmYWN0b3ItPnJlbmFtZSBhY3Rpb24uCi0gICAqLwotICBwcml2YXRlIEltYWdlSHlwZXJsaW5rIHJlbmFtZUh5cGVybGluazsKLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGhpZGVIeXBlckxpbms7Ci0KLSAgLyoqCi0gICAqIEludm9rZXMgdGhlIHJlZmFjdG9yLT5yZW5hbWUgYWN0aW9uIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbnZva2VSZW5hbWVSZWZhY3RvcmluZygpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSkgZWRpdG9yLmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGlucHV0KTsKLSAgICBJU2VsZWN0aW9uTWFwcGVyIG1hcHBlciA9IChJU2VsZWN0aW9uTWFwcGVyKSBlZGl0b3IuZ2V0QWRhcHRlcihJU2VsZWN0aW9uTWFwcGVyLmNsYXNzKTsKLSAgICBzZWxlY3Rpb24gPSBtYXBwZXIgIT0gbnVsbCA/IG1hcHBlci5tYXBTZWxlY3Rpb24oc2VsZWN0aW9uKSA6IHNlbGVjdGlvbjsKLSAgICBSZW5hbWVIYW5kbGVyIHJlbmFtZUhhbmRsZXIgPSBuZXcgUmVuYW1lSGFuZGxlcigpOwotICAgIHJlbmFtZUhhbmRsZXIuZXhlY3V0ZShzZWxlY3Rpb24sIHNjaGVtYSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzaG93TGluayhib29sZWFuIGlzVmlzaWJsZSkKLSAgewotCSAgcmVuYW1lSHlwZXJsaW5rLnNldFZpc2libGUoaXNWaXNpYmxlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgdGhlIHJlZmFjdG9yL3JlbmFtZSBoeXBlcmxpbmsgc2hvd24gYmVzaWRlIGEgY29tcG9uZW50IG5hbWUuCi0gICAqIENsaWNraW5nIG9uIHRoZSBoeXBlcmxpbmsgaW52b2tlcyB0aGUgcmVmYWN0b3IvcmVuYW1lIGFjdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnQKLSAgICogICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZW5hbWVIeXBlcmxpbmsoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHJlbmFtZUh5cGVybGluayA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVJbWFnZUh5cGVybGluayhwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgIHJlbmFtZUh5cGVybGluay5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL3F1aWNrYXNzaXN0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHJlbmFtZUh5cGVybGluay5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfVE9PTFRJUF9SRU5BTUVfUkVGQUNUT1IpOwotICAgIHJlbmFtZUh5cGVybGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcih0aGlzKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2V0UmVuYW1lSHlwZXJsaW5rRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkKLSAgewotICAgIHJlbmFtZUh5cGVybGluay5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5JSHlwZXJsaW5rTGlzdGVuZXIjbGlua0FjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpCi0gIHsKLSAgICBpbnZva2VSZW5hbWVSZWZhY3RvcmluZygpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyI2xpbmtFbnRlcmVkKG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKEh5cGVybGlua0V2ZW50IGUpCi0gIHsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLklIeXBlcmxpbmtMaXN0ZW5lciNsaW5rRXhpdGVkKG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoSHlwZXJsaW5rRXZlbnQgZSkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1NjaGVtYUxvY2F0aW9uU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9TY2hlbWFMb2NhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3OThiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1NjaGVtYUxvY2F0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRERpcmVjdGl2ZXNTY2hlbWFMb2NhdGlvblVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNESW5jbHVkZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEUmVkZWZpbmVJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFMb2NhdGlvblNlY3Rpb24gZXh0ZW5kcyBDb21tb25EaXJlY3RpdmVzU2VjdGlvbgotewotCSAgSVdvcmtiZW5jaFBhcnQgcGFydDsKLQkgIAotCSAgLyoqCi0JICAgKiAKLQkgICAqLwotCSAgcHVibGljIFNjaGVtYUxvY2F0aW9uU2VjdGlvbigpCi0JICB7Ci0JICAgIHN1cGVyKCk7Ci0JICB9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotCQl7Ci0JCQljb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgCi0gICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLQkJCS8vIENyZWF0ZSBTY2hlbWEgTG9jYXRpb24gTGFiZWwKLQkJCUNMYWJlbCBzY2hlbWFMb2NhdGlvbkxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9TQ0hFTUFfTE9DQVRJT04iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICBzY2hlbWFMb2NhdGlvbkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLSAgICAgIC8vIENyZWF0ZSBTY2hlbWEgTG9jYXRpb24gVGV4dAotICAgICAgc2NoZW1hTG9jYXRpb25UZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgICBzY2hlbWFMb2NhdGlvblRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gICAgICBhcHBseUFsbExpc3RlbmVycyhzY2hlbWFMb2NhdGlvblRleHQpOyAgICAgICAKLQotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBzY2hlbWFMb2NhdGlvblRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIAotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzY2hlbWFMb2NhdGlvblRleHQsCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fSU5DTFVERV9SRURFRklORV9fU0NIRU1BTE9DQVRJT04pOwotICAgICAgCi0JCQkvLyBDcmVhdGUgV2l6YXJkIEJ1dHRvbgotCQkJd2l6YXJkQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHdpemFyZEJ1dHRvbi5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCQl3aXphcmRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXdpemFyZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJCQotICAgICAgLy8gZXJyb3IgdGV4dAotICAgICAgZXJyb3JUZXh0ID0gbmV3IFN0eWxlZFRleHQoY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgICBlcnJvclRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgZXJyb3JUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgZXJyb3JUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAKLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBlcnJvclRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl9Ci0JCQotICAgIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgaWYgKGV2ZW50LndpZGdldCA9PSB3aXphcmRCdXR0b24pCi0gICAgICB7Ci0gICAgICAgIFhTRERpcmVjdGl2ZXNTY2hlbWFMb2NhdGlvblVwZGF0ZXIudXBkYXRlU2NoZW1hTG9jYXRpb24oeHNkU2NoZW1hLGlucHV0LHRydWUpOwotICAgICAgICByZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCQl7Ci0JCQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotCQkJCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgWFNESW5jbHVkZSkKLSAgICAgICAgeyAKLQkJCQkJZWxlbWVudCA9ICgoWFNESW5jbHVkZUltcGwpIGlucHV0KS5nZXRFbGVtZW50KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICAgIHsKLQkJCQkJZWxlbWVudCA9ICgoWFNEUmVkZWZpbmVJbXBsKSBpbnB1dCkuZ2V0RWxlbWVudCgpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0JCQkJCVN0cmluZyBsb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvY2F0aW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInNjaGVtYUxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotCQkJCQlzY2hlbWFMb2NhdGlvblRleHQuc2V0VGV4dChsb2NhdGlvbik7Ci0JCQkJfQotCi0gICAgICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQkJfQotCi0JICAvKiAobm9uLUphdmFkb2MpCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLQkgICAqLwotCSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICB7Ci0JICAgIHJldHVybiB0cnVlOwotCSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9TaW1wbGVDb250ZW50VW5pb25NZW1iZXJUeXBlc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9TaW1wbGVDb250ZW50VW5pb25NZW1iZXJUeXBlc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDkwYmUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvU2ltcGxlQ29udGVudFVuaW9uTWVtYmVyVHlwZXNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHMuVHlwZVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVDb250ZW50VW5pb25NZW1iZXJUeXBlc0RpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGU7Ci0gIC8qKgotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICovCi0gIHB1YmxpYyBTaW1wbGVDb250ZW50VW5pb25NZW1iZXJUeXBlc0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSkKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICB0aGlzLnNpbXBsZVR5cGUgPSBzaW1wbGVUeXBlOwotICB9Ci0gIAotICBUYWJsZSB0YWJsZTsKLSAgVHlwZVNlY3Rpb24gdHlwZVNlY3Rpb247Ci0gIEJ1dHRvbiBhZGRCdXR0b24sIHJlbW92ZUJ1dHRvbjsKLSAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBtZW1iZXJUeXBlc0xpc3Q7Ci0gIAotICBwcml2YXRlIFN0cmluZyByZXN1bHQ7Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkKLSAgewotICAgIGlmIChidXR0b25JZCA9PSBXaW5kb3cuT0spCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgaW50IGxlbmd0aCA9IG1lbWJlclR5cGVzTGlzdC5nZXRJdGVtQ291bnQoKTsKLSAgICAgIGZvciAoaW50IGk9MCA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgc2IuYXBwZW5kKG1lbWJlclR5cGVzTGlzdC5nZXRJdGVtKGkpKTsKLSAgICAgICAgaWYgKGkgPCBsZW5ndGggLSAxKQotICAgICAgICB7Ci0gICAgICAgICAgc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmVzdWx0ID0gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlc3VsdCgpIHsgcmV0dXJuIHJlc3VsdDsgfQotCi0gIC8vCi0gIC8vIENyZWF0ZSB0aGUgY29udHJvbHMKLSAgLy8KLSAgcHVibGljIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGNsaWVudCA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgIGdldFNoZWxsKCkuc2V0VGV4dCgiVW5pb24gIiArIFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpOyAgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIExhYmVsIGluc3RydWN0aW9ucyA9IG5ldyBMYWJlbChjbGllbnQsIFNXVC5MRUZUIHwgU1dULldSQVApOwotICAgIGluc3RydWN0aW9ucy5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9TRUxFQ1RfTUVNQkVSVFlQRVMiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBDb21wb3NpdGUgY29sdW1uc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBjY0dMID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBjY0dMLnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgY2NHTC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0gICAgY2NHTC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGNjR0wubWFyZ2luV2lkdGggPSAwOwotICAgIGNjR0wubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICBjY0dMLm51bUNvbHVtbnMgPSAzOwotICAgIGNvbHVtbnNDb21wb3NpdGUuc2V0TGF5b3V0KGNjR0wpOwotICAgIAotICAgIEdyaWREYXRhIGNjR0QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBjY0dELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNjR0QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgY29sdW1uc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGNjR0QpOyAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0eXBlU2VjdGlvbiA9IG5ldyBUeXBlU2VjdGlvbihjb2x1bW5zQ29tcG9zaXRlKTsKLSAgICB0eXBlU2VjdGlvbi5zZXRTaG93VXNlckNvbXBsZXhUeXBlKGZhbHNlKTsKLQotICAgIHR5cGVTZWN0aW9uLmNyZWF0ZUNsaWVudChjb2x1bW5zQ29tcG9zaXRlKTsKLSAgICB0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICB0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBWaWV3VXRpbGl0eS5jcmVhdGVIb3Jpem9udGFsRmlsbGVyKGNvbHVtbnNDb21wb3NpdGUsIDEpOwotICAgIAotICAgIExhYmVsIG1lbWJlckxpc3RMYWJlbCA9IG5ldyBMYWJlbChjb2x1bW5zQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0gICAgbWVtYmVyTGlzdExhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX01FTUJFUlRZUEVTX1ZBTFVFIikpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgQ29tcG9zaXRlIGRhdGFDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNsaWVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZGNHTCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZGNHTC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgIGRjR0wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBkY0dMLm1hcmdpbldpZHRoID0gMDsKLSAgICBkY0dMLm51bUNvbHVtbnMgPSAzOwotICAgIGRhdGFDb21wb3NpdGUuc2V0TGF5b3V0KGRjR0wpOwotICAgIAotICAgIEdyaWREYXRhIGRjR0QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkY0dELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRjR0QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGRhdGFDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkY0dEKTsKLSAgICAKLSAgICB0YWJsZSA9IG5ldyBUYWJsZShkYXRhQ29tcG9zaXRlLAotICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7IAotICAgIHRhYmxlLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotICAgIHRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICBHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZDIuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZ2QyLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZDIuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QyLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBnZDIuaGVpZ2h0SGludCA9IDIwMDsKLSAgICBnZDIud2lkdGhIaW50ID0gMjAwOwotICAgIHRhYmxlLnNldExheW91dERhdGEoZ2QyKTsKLQotICAgIC8vIEZpbGwgdGFibGUKLSAgICBoYW5kbGVTZXRJbnB1dCgpOwotICAgIHRhYmxlLmdldEl0ZW1Db3VudCgpOwotCi0gICAgVGFibGVDb2x1bW4gdGMgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLSAgICB0Yy5zZXRXaWR0aCgyMDApOwotICAgIHRjLnNldFJlc2l6YWJsZSh0cnVlKTsKLSAgICAKLSAgICBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkYXRhQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBiY0dMID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBiY0dMLm51bUNvbHVtbnMgPSAxOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoYmNHTCk7Ci0gICAgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICBhZGRCdXR0b24uc2V0VGV4dCgiPiIpOyAvLyROT04tTkxTLTEkCi0gICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldFRleHQoIjwiKTsgLy8kTk9OLU5MUy0xJAotICAgIHJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBDb21wb3NpdGUgbGlzdENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGF0YUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbXRHTCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbXRHTC5udW1Db2x1bW5zID0gMTsKLSAgICBtdEdMLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgbXRHTC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgbXRHTC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0gICAgbXRHTC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgIGxpc3RDb21wb3NpdGUuc2V0TGF5b3V0KG10R0wpOwotCi0gICAgR3JpZERhdGEgbXRHRCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIG10R0QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgbXRHRC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgbXRHRC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbXRHRC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBsaXN0Q29tcG9zaXRlLnNldExheW91dERhdGEobXRHRCk7Ci0gICAgCi0gICAgbWVtYmVyVHlwZXNMaXN0ID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QobGlzdENvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0gICAgR3JpZERhdGEgbXRsR0QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBtdGxHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBtdGxHRC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgbXRsR0QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG10bEdELmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG10bEdELmhlaWdodEhpbnQgPSAyMDA7Ci0gICAgbXRsR0Qud2lkdGhIaW50ID0gMjAwOwotICAgIG1lbWJlclR5cGVzTGlzdC5zZXRMYXlvdXREYXRhKG10bEdEKTsKLSAgICAKLSAgICBpbml0aWFsaXplTWVtYmVyTGlzdENvbnRlbnQoKTsKLSAgICByZXR1cm4gY2xpZW50OwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVNZW1iZXJMaXN0Q29udGVudCgpCi0gIHsKLS8vICAgIFN0cmluZyByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKTsKLS8vICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgcmV0dXJuOwotLy8gICAgfQotLy8gICAgU3RyaW5nVG9rZW5pemVyIHRva2VuID0gbmV3IFN0cmluZ1Rva2VuaXplcihyZXN1bHQpOwotLy8gICAgd2hpbGUgKHRva2VuLmhhc01vcmVUb2tlbnMoKSkKLS8vICAgIHsKLS8vICAgICAgbWVtYmVyVHlwZXNMaXN0LmFkZCh0b2tlbi5uZXh0VG9rZW4oKSk7Ci0vLyAgICB9Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IHNpbXBsZVR5cGUuZ2V0U2NoZW1hKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gc2ltcGxlVHlwZS5nZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lID0gKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilpLm5leHQoKSkuZ2V0UU5hbWUoc2NoZW1hKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICBtZW1iZXJUeXBlc0xpc3QuYWRkKG5hbWUpOwotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKSAmJiB0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkuZ2V0U2VsZWN0aW9uKCkpCi0gICAgIHsKLSAgICAgIHBvcHVsYXRlQnVpbHRJblR5cGUoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKSAmJiB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpLmdldFNlbGVjdGlvbigpKQotICAgICB7Ci0gICAgICBwb3B1bGF0ZVVzZXJTaW1wbGVUeXBlKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gYWRkQnV0dG9uKQotICAgIHsKLSAgICAgIFRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLSAgICAgIGludCBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMubGVuZ3RoID4gMCAmJiBzZWxlY3Rpb24gPj0gMCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHR5cGVUb0FkZCA9IGl0ZW1zW3NlbGVjdGlvbl0uZ2V0RGF0YSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChtZW1iZXJUeXBlc0xpc3QuaW5kZXhPZih0eXBlVG9BZGQpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgIG1lbWJlclR5cGVzTGlzdC5hZGQoaXRlbXNbc2VsZWN0aW9uXS5nZXREYXRhKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gcmVtb3ZlQnV0dG9uKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHR5cGVzVG9SZW1vdmUgPSBtZW1iZXJUeXBlc0xpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBmb3IgKGludCBpPTA7IGkgPCB0eXBlc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBtZW1iZXJUeXBlc0xpc3QucmVtb3ZlKHR5cGVzVG9SZW1vdmVbaV0pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaGFuZGxlU2V0SW5wdXQoKQotICB7Ci0gICAgcG9wdWxhdGVCdWlsdEluVHlwZSgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUJ1aWx0SW5UeXBlKCkKLSAgewotICAgIHRhYmxlLnJlbW92ZUFsbCgpOwotICAgIExpc3QgaXRlbXMgPSBnZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgIHsKLSAgICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgICAgaXRlbS5zZXRUZXh0KGl0ZW1zLmdldChpKS50b1N0cmluZygpKTsKLSAgICAgIGl0ZW0uc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaXRlbS5zZXREYXRhKGl0ZW1zLmdldChpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVVc2VyU2ltcGxlVHlwZShib29sZWFuIHNob3dBbm9ueW1vdXMpCi0gIHsKLSAgICB0YWJsZS5yZW1vdmVBbGwoKTsKLSAgICBpZiAoc2hvd0Fub255bW91cykKLSAgICAgewotICAgICAgVGFibGVJdGVtIGFub255bW91c0l0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICBhbm9ueW1vdXNJdGVtLnNldFRleHQoIioqYW5vbnltb3VzKioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgYW5vbnltb3VzSXRlbS5zZXREYXRhKCIqKmFub255bW91cyoqIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgTGlzdCBpdGVtcyA9IGdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICAgewotICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICBpdGVtLnNldFRleHQoaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgICAgaXRlbS5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZVR5cGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgICBpdGVtLnNldERhdGEoaXRlbXMuZ2V0KGkpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpCi0gIHsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoc2ltcGxlVHlwZS5nZXRTY2hlbWEoKSk7Ci0gICAgcmV0dXJuIGhlbHBlci5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICB9Ci0KLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCkKLSAgewotICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcihzaW1wbGVUeXBlLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gaGVscGVyLmdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9TcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1NwZWNpZmljQ29uc3RyYWludHNXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEzYjY1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1NwZWNpZmljQ29uc3RyYWludHNXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5OYXZpZ2FibGVUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRFbnVtZXJhdGlvbnNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkNoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlNldFhTREZhY2V0VmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtZXJhdGlvbnNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzLlJlZ2V4V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGF0dGVybkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciwgTGlzdGVuZXIKLXsKLSAgcHVibGljIHN0YXRpYyBpbnQgRU5VTUVSQVRJT04gPSAwOwotICBwdWJsaWMgc3RhdGljIGludCBQQVRURVJOID0gMTsKLSAgCi0gIGludCBraW5kOwotICBDb25zdHJhaW50c1RhYmxlVmlld2VyIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXI7Ci0gIEJ1dHRvbiBhZGRCdXR0b247Ci0gIEJ1dHRvbiBhZGRVc2luZ0RpYWxvZ0J1dHRvbjsKLSAgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKLSAgQnV0dG9uIGVkaXRCdXR0b247Ci0gIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0gIGJvb2xlYW4gaXNFbmFibGVkOwotICBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5OwotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBpbnB1dDsKLSAgWFNERmVhdHVyZSBmZWF0dXJlOwotICBib29sZWFuIGlzUmVhZE9ubHk7Ci0gIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0gIFhTREZhY2V0U2VjdGlvbiBmYWNldFNlY3Rpb247Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqIEBwYXJhbSBjb21wb3NpdGUKLSAgICogQHBhcmFtIGZhY3RvcnkKLSAgICogQHBhcmFtIGZlYXR1cmUKLSAgICogQHBhcmFtIGlucHV0Ci0gICAqIEBwYXJhbSBmYWNldFNlY3Rpb24KLSAgICovCi0gIHB1YmxpYyBTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnksIFhTREZlYXR1cmUgZmVhdHVyZSwgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gaW5wdXQsIFhTREZhY2V0U2VjdGlvbiBmYWNldFNlY3Rpb24pCi0gIHsKLSAgICB0aGlzKGNvbXBvc2l0ZSwgZmFjdG9yeSwgZmVhdHVyZSwgaW5wdXQsIGZhY2V0U2VjdGlvbiwgRU5VTUVSQVRJT04pOwotICB9Ci0KLSAgcHVibGljIFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSwgWFNERmVhdHVyZSBmZWF0dXJlLCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBpbnB1dCwgWFNERmFjZXRTZWN0aW9uIGZhY2V0U2VjdGlvbiwgaW50IGtpbmQpCi0gIHsKLSAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICB0aGlzLmNvbXBvc2l0ZSA9IGNvbXBvc2l0ZTsKLSAgICB0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotICAgIHRoaXMuZmFjZXRTZWN0aW9uID0gZmFjZXRTZWN0aW9uOwotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgCi0gICAgY3JlYXRlQ29udHJvbChjb21wb3NpdGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q29tbWFuZFN0YWNrKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spCi0gIHsKLSAgICB0aGlzLmNvbW1hbmRTdGFjayA9IGNvbW1hbmRTdGFjazsgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJc1JlYWRPbmx5KGJvb2xlYW4gaXNSZWFkT25seSkKLSAgewotICAgIHRoaXMuaXNSZWFkT25seSA9IGlzUmVhZE9ubHk7Ci0gIH0KLQotICBwdWJsaWMgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZ2V0V2lkZ2V0RmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gZmFjdG9yeTsKLSAgfQotICAKLSAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKQotICB7Ci0gICAgdGhpcy5pc0VuYWJsZWQgPSBpc0VuYWJsZWQ7Ci0gICAgYWRkQnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICBhZGRVc2luZ0RpYWxvZ0J1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICB9Ci0KLSAgcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcG9zaXRlID0gZmFjdG9yeS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyID0gbmV3IENvbnN0cmFpbnRzVGFibGVWaWV3ZXIoZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRhYmxlKGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKSk7Ci0gICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgVGFibGUgdGFibGUgPSBjb25zdHJhaW50c1RhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0gICAgdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEud2lkdGhIaW50ID0gMTUwOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIHRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgdGFibGUuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgdGhpcyk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgR3JpZExheW91dCBidXR0b25Db21wb3NpdGVMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGJ1dHRvbkNvbXBvc2l0ZUxheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGJ1dHRvbkNvbXBvc2l0ZUxheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGJ1dHRvbkNvbXBvc2l0ZUxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkNvbXBvc2l0ZUxheW91dCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAKLSAgICBhZGRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0FDVElPTl9BREQsIFNXVC5QVVNIKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0gICAgYWRkQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIGFkZFVzaW5nRGlhbG9nQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1dJVEhfRE9UUywgU1dULlBVU0gpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLSAgICBhZGRVc2luZ0RpYWxvZ0J1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGFkZFVzaW5nRGlhbG9nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgZWRpdEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfQUNUSU9OX0VESVRfV0lUSF9ET1RTLCBTV1QuUFVTSCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBlZGl0QnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICAKLSAgICBkZWxldGVCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEUsIFNXVC5QVVNIKTsKLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGVsZXRlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgc2V0QnV0dG9uU3RhdGVzKGtpbmQpOwotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIFRhYmxlIHRhYmxlID0gY29uc3RyYWludHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgIGlmIChldmVudC50eXBlID09IFNXVC5SZXNpemUgJiYgZXZlbnQud2lkZ2V0ID09IHRhYmxlKQotICAgIHsKLSAgICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKDApOwotICAgICAgdGFibGVDb2x1bW4uc2V0V2lkdGgodGFibGUuZ2V0U2l6ZSgpLngpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkKLSAgewotICAgIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotICAgIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLS8vICAgIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRDb25zdHJhaW50S2luZCgpCi0gIHsKLQkgIHJldHVybiB0aGlzLmtpbmQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNldEJ1dHRvblN0YXRlcyhpbnQga2luZCkKLSAgewotICAgIGJvb2xlYW4gYWRkLCBhZGRVc2luZywgZGVsZXRlLCBlZGl0OwotCi0gICAgYm9vbGVhbiBsaXN0SGFzSXRlbXMgPSBmYWxzZTsKLSAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25zdHJhaW50c1RhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoc2VsZWN0aW9uLnRvTGlzdCgpLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGxpc3RIYXNJdGVtcyA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGtpbmQgPT0gRU5VTUVSQVRJT04pCi0gICAgewotICAgICAgYWRkID0gdHJ1ZTsKLSAgICAgIGFkZFVzaW5nID0gdHJ1ZTsKLSAgICAgIGVkaXQgPSBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoa2luZCA9PSBQQVRURVJOKQotICAgIHsKLSAgICAgIGFkZCA9IGZhbHNlOwotICAgICAgYWRkVXNpbmcgPSB0cnVlOwotICAgICAgZWRpdCA9IGxpc3RIYXNJdGVtczsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGFkZCA9IHRydWU7Ci0gICAgICBhZGRVc2luZyA9IHRydWU7Ci0gICAgICBlZGl0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgZGVsZXRlID0gbGlzdEhhc0l0ZW1zOwotCi0gICAgaWYgKCFhZGRCdXR0b24uaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKGFkZCk7Ci0gICAgfQotICAgIGlmICghYWRkVXNpbmdEaWFsb2dCdXR0b24uaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIGFkZFVzaW5nRGlhbG9nQnV0dG9uLnNldEVuYWJsZWQoYWRkVXNpbmcpOwotICAgIH0KLSAgICBpZiAoIWRlbGV0ZUJ1dHRvbi5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZGVsZXRlKTsKLSAgICB9Ci0gICAgaWYgKCFlZGl0QnV0dG9uLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBlZGl0QnV0dG9uLnNldEVuYWJsZWQoZWRpdCk7Ci0gICAgfQotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IGlucHV0OwotICAgIGlmIChlLndpZGdldCA9PSBhZGRCdXR0b24pCi0gICAgewotICAgICAgTGlzdCBlbnVtTGlzdCA9IHN0LmdldEVudW1lcmF0aW9uRmFjZXRzKCk7Ci0gICAgICBTdHJpbmcgbmV3TmFtZSA9IFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRW51bWVyYXRpb25WYWx1ZSgidmFsdWUiLCBlbnVtTGlzdCk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgaWYgKGtpbmQgPT0gRU5VTUVSQVRJT04pCi0gICAgICB7Ci0gICAgICAgIENvbXBvdW5kQ29tbWFuZCBjb21wb3VuZENvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHRhcmdldFNpbXBsZVR5cGUgPSBudWxsOwotICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTRENvbW1vblVJVXRpbHMuZ2V0QW5vbnltb3VzU2ltcGxlVHlwZShmZWF0dXJlLCBpbnB1dCk7Ci0gICAgICAgICAgaWYgKGFub255bW91c1NpbXBsZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgIGFub255bW91c1NpbXBsZVR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKGlucHV0KTsKLQotICAgICAgICAgICAgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kIGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZCA9IG5ldyBDaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9DSEFOR0VfUEFUVEVSTiwgZmVhdHVyZSk7Ci0gICAgICAgICAgICBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQuc2V0QW5vbnltb3VzU2ltcGxlVHlwZShhbm9ueW1vdXNTaW1wbGVUeXBlKTsKLSAgICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kKTsKLSAgICAgICAgICAgIGlucHV0ID0gYW5vbnltb3VzU2ltcGxlVHlwZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdGFyZ2V0U2ltcGxlVHlwZSA9IGFub255bW91c1NpbXBsZVR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdGFyZ2V0U2ltcGxlVHlwZSA9IGlucHV0OwotICAgICAgICB9Ci0KLSAgICAgICAgQWRkRW51bWVyYXRpb25zQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZEVudW1lcmF0aW9uc0NvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT04sIHRhcmdldFNpbXBsZVR5cGUpOwotICAgICAgICBjb21tYW5kLnNldFZhbHVlKG5ld05hbWUpOwotICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGNvbW1hbmQpOwotICAgICAgICBjb21tYW5kU3RhY2suZXhlY3V0ZShjb21wb3VuZENvbW1hbmQpOwotICAgICAgICBzZXRJbnB1dChpbnB1dCk7Ci0gICAgICAgIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICBpbnQgbmV3SXRlbUluZGV4ID0gY29uc3RyYWludHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMTsKLSAgICAgICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5lZGl0RWxlbWVudChjb25zdHJhaW50c1RhYmxlVmlld2VyLmdldEVsZW1lbnRBdChuZXdJdGVtSW5kZXgpLCAwKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gYWRkVXNpbmdEaWFsb2dCdXR0b24pCi0gICAgewotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAvLyBpZiBpdCBpcyBudWxsLCBnZXQgdGhlIGRlZmF1bHQgb25lCi0gICAgICBkaXNwbGF5ID0gZGlzcGxheSA9PSBudWxsID8gRGlzcGxheS5nZXREZWZhdWx0KCkgOiBkaXNwbGF5OwotICAgICAgU2hlbGwgc2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0KLSAgICAgIGlmIChraW5kID09IFBBVFRFUk4pCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBpbml0aWFsVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBSZWdleFdpemFyZCB3aXphcmQgPSBuZXcgUmVnZXhXaXphcmQoaW5pdGlhbFZhbHVlKTsKLQotICAgICAgICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLSAgICAgICAgd2l6YXJkRGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgICAgICB3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0KLSAgICAgICAgaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbmV3UGF0dGVybiA9IHdpemFyZC5nZXRQYXR0ZXJuKCk7Ci0gICAgICAgICAgQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLSAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0YXJnZXRTaW1wbGVUeXBlID0gbnVsbDsKLSAgICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RDb21tb25VSVV0aWxzLmdldEFub255bW91c1NpbXBsZVR5cGUoZmVhdHVyZSwgaW5wdXQpOwotICAgICAgICAgICAgaWYgKGFub255bW91c1NpbXBsZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgIGFub255bW91c1NpbXBsZVR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKGlucHV0KTsKLQotICAgICAgICAgICAgICBDaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kID0gbmV3IENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRV9QQVRURVJOLCBmZWF0dXJlKTsKLSAgICAgICAgICAgICAgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kLnNldEFub255bW91c1NpbXBsZVR5cGUoYW5vbnltb3VzU2ltcGxlVHlwZSk7Ci0gICAgICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kKTsKLSAgICAgICAgICAgICAgaW5wdXQgPSBhbm9ueW1vdXNTaW1wbGVUeXBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGFyZ2V0U2ltcGxlVHlwZSA9IGFub255bW91c1NpbXBsZVR5cGU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRTaW1wbGVUeXBlID0gaW5wdXQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIFVwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1BBVFRFUk4sIHRhcmdldFNpbXBsZVR5cGUsIFVwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQuQUREKTsKLSAgICAgICAgICBjb21tYW5kLnNldFZhbHVlKG5ld1BhdHRlcm4pOwotICAgICAgICAgIHNldElucHV0KGlucHV0KTsKLSAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGNvbW1hbmQpOwotICAgICAgICAgIGNvbW1hbmRTdGFjay5leGVjdXRlKGNvbXBvdW5kQ29tbWFuZCk7Ci0gICAgICAgICAgZmFjZXRTZWN0aW9uLmRvU2V0SW5wdXQoKTsKLSAgICAgICAgfQotICAgICAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRW51bWVyYXRpb25zRGlhbG9nIGRpYWxvZyA9IG5ldyBFbnVtZXJhdGlvbnNEaWFsb2coc2hlbGwpOwotICAgICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHRleHQgPSBkaWFsb2cuZ2V0VGV4dCgpOwotICAgICAgICAgIFN0cmluZyBkZWxpbWl0ZXIgPSBkaWFsb2cuZ2V0RGVsaW1pdGVyKCk7Ci0gICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGV4dCwgZGVsaW1pdGVyKTsKLSAgICAgICAgICBDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FTlVNRVJBVElPTlMpOwotICAgICAgICAgIAotICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHRhcmdldFNpbXBsZVR5cGUgPSBudWxsOwotICAgICAgICAgIGlmIChmZWF0dXJlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTRENvbW1vblVJVXRpbHMuZ2V0QW5vbnltb3VzU2ltcGxlVHlwZShmZWF0dXJlLCBpbnB1dCk7Ci0gICAgICAgICAgICBpZiAoYW5vbnltb3VzU2ltcGxlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oaW5wdXQpOwotCi0gICAgICAgICAgICAgIENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZCBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQgPSBuZXcgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kKCIiLCBmZWF0dXJlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQuc2V0QW5vbnltb3VzU2ltcGxlVHlwZShhbm9ueW1vdXNTaW1wbGVUeXBlKTsKLSAgICAgICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZChjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQpOwotICAgICAgICAgICAgICBpbnB1dCA9IGFub255bW91c1NpbXBsZVR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YXJnZXRTaW1wbGVUeXBlID0gYW5vbnltb3VzU2ltcGxlVHlwZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldFNpbXBsZVR5cGUgPSBpbnB1dDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBpZiAoZGlhbG9nLmlzUHJlc2VydmVXaGl0ZXNwYWNlKCkgPT0gZmFsc2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRva2VuID0gdG9rZW4udHJpbSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQWRkRW51bWVyYXRpb25zQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZEVudW1lcmF0aW9uc0NvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT05TLCB0YXJnZXRTaW1wbGVUeXBlKTsKLSAgICAgICAgICAgIGNvbW1hbmQuc2V0VmFsdWUodG9rZW4pOwotICAgICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZChjb21tYW5kKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29tbWFuZFN0YWNrLmV4ZWN1dGUoY29tcG91bmRDb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICAvL3NldElucHV0KGlucHV0KTsKLSAgICAgICAgZmFjZXRTZWN0aW9uLmRvU2V0SW5wdXQoKTsKLSAgICAgICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGRlbGV0ZUJ1dHRvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25zdHJhaW50c1RhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLSAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBjb21wb3VuZENvbW1hbmQuc2V0TGFiZWwoTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEVfQ09OU1RSQUlOVFMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5zZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURV9QQVRURVJOKTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RQYXR0ZXJuRmFjZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFVwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kKCIiLCBpbnB1dCwgVXBkYXRlWFNEUGF0dGVybkZhY2V0Q29tbWFuZC5ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGNvbW1hbmQuc2V0UGF0dGVyblRvRWRpdCgoWFNEUGF0dGVybkZhY2V0KW9iaik7Ci0gICAgICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY29tbWFuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBvYmo7Ci0gICAgICAgICAgICAgIERlbGV0ZUNvbW1hbmQgZGVsZXRlQ29tbWFuZCA9IG5ldyBEZWxldGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fREVMRVRFX0VOVU1FUkFUSU9OLCBlbnVtRmFjZXQpOwotICAgICAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGRlbGV0ZUNvbW1hbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb21tYW5kU3RhY2suZXhlY3V0ZShjb21wb3VuZENvbW1hbmQpOwotICAgICAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZWRpdEJ1dHRvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25zdHJhaW50c1RhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEUGF0dGVybkZhY2V0KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm4gPSAoWFNEUGF0dGVybkZhY2V0KSBvYmo7Ci0gICAgICAgICAgU3RyaW5nIGluaXRpYWxWYWx1ZSA9IHBhdHRlcm4uZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotCi0gICAgICAgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCi0gICAgICAgICAgUmVnZXhXaXphcmQgd2l6YXJkID0gbmV3IFJlZ2V4V2l6YXJkKGluaXRpYWxWYWx1ZSk7Ci0KLSAgICAgICAgICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLSAgICAgICAgICB3aXphcmREaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgICAgd2l6YXJkRGlhbG9nLmNyZWF0ZSgpOwotCi0gICAgICAgICAgaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0KLSAgICAgICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3UGF0dGVybiA9IHdpemFyZC5nZXRQYXR0ZXJuKCk7Ci0gICAgICAgICAgICBwYXR0ZXJuLnNldExleGljYWxWYWx1ZShuZXdQYXR0ZXJuKTsKLSAgICAgICAgICAgIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBzZXRCdXR0b25TdGF0ZXModGhpcy5raW5kKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLQotICB9Ci0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbnN0cmFpbnRLaW5kKGludCBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgICBzZXRCdXR0b25TdGF0ZXMoa2luZCk7Ci0gICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIHNldEJ1dHRvblN0YXRlcyh0aGlzLmtpbmQpOwotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFibGVJdGVtICYmICh2YWx1ZSAhPSBudWxsKSkKLSAgICB7Ci0gICAgICBUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGVsZW1lbnQ7Ci0KLSAgICAgIGlmIChpdGVtLmdldERhdGEoKSBpbnN0YW5jZW9mIFhTRFBhdHRlcm5GYWNldCkKLSAgICAgIHsKLSAgICAgICAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm5GYWNldCA9IChYU0RQYXR0ZXJuRmFjZXQpIGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICBwYXR0ZXJuRmFjZXQuc2V0TGV4aWNhbFZhbHVlKChTdHJpbmcpIHZhbHVlKTsKLQotICAgICAgICBpdGVtLnNldERhdGEocGF0dGVybkZhY2V0KTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgIHsKLSAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgIFNldFhTREZhY2V0VmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfRU5VTUVSQVRJT05fVkFMVUUsIGVudW1GYWNldCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0VmFsdWUoKFN0cmluZykgdmFsdWUpOwotICAgICAgICBjb21tYW5kU3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgaXRlbS5zZXREYXRhKGVudW1GYWNldCk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dCgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGRvR2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNEUGF0dGVybkZhY2V0KQotICAgIHsKLSAgICAgIFhTRFBhdHRlcm5GYWNldCBwYXR0ZXJuRmFjZXQgPSAoWFNEUGF0dGVybkZhY2V0KSBlbGVtZW50OwotICAgICAgU3RyaW5nIHZhbHVlID0gcGF0dGVybkZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTREVudW1lcmF0aW9uRmFjZXQpCi0gICAgewotICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgZWxlbWVudDsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGVudW1GYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIGNsYXNzIENvbnN0cmFpbnRzVGFibGVWaWV3ZXIgZXh0ZW5kcyBOYXZpZ2FibGVUYWJsZVZpZXdlciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIKLSAgewotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzID0geyBNZXNzYWdlcy5fVUlfTEFCRUxfUEFUVEVSTiB9OwotCi0gICAgcHJvdGVjdGVkIENlbGxFZGl0b3JbXSBjZWxsRWRpdG9yczsKLQotICAgIFRhYmxlIHRhYmxlOwotCi0gICAgcHVibGljIENvbnN0cmFpbnRzVGFibGVWaWV3ZXIoVGFibGUgdGFibGUpCi0gICAgewotICAgICAgc3VwZXIodGFibGUpOwotICAgICAgdGFibGUgPSBnZXRUYWJsZSgpOwotCi0gICAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAgIHNldENvbnRlbnRQcm92aWRlcihuZXcgQ29uc3RyYWludHNDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICBzZXRMYWJlbFByb3ZpZGVyKG5ldyBDb25zdHJhaW50c1RhYmxlTGFiZWxQcm92aWRlcigpKTsKLSAgICAgIHNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllcyk7Ci0KLSAgICAgIHNldENlbGxNb2RpZmllcih0aGlzKTsKLQotICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMCk7Ci0gICAgICBjb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzWzBdKTsKLSAgICAgIGNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotICAgICAgY29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotICAgICAgY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvclsxXTsKLQotICAgICAgVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgICBDb2x1bW5XZWlnaHREYXRhIGRhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDApOwotCi0gICAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShkYXRhKTsKLSAgICAgIGNlbGxFZGl0b3JzWzBdID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLQotICAgICAgZ2V0VGFibGUoKS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgIHNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICBkb01vZGlmeShlbGVtZW50LCBwcm9wZXJ0eSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICByZXR1cm4gZG9HZXRWYWx1ZShlbGVtZW50LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gIH0KLQotICBjbGFzcyBDb25zdHJhaW50c0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCBpbnB1dEVsZW1lbnQpCi0gICAgewotICAgICAgamF2YS51dGlsLkxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0RWxlbWVudDsKLSAgICAgICAgYm9vbGVhbiBpc0RlZmluZWQgPSBmYWxzZTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcjsKLSAgICAgICAgaWYgKGtpbmQgPT0gUEFUVEVSTikKLSAgICAgICAgewotICAgICAgICAgIGl0ZXIgPSBzdC5nZXRQYXR0ZXJuRmFjZXRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpdGVyID0gc3QuZ2V0RW51bWVyYXRpb25GYWNldHMoKS5pdGVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERmFjZXQgZmFjZXQgPSAoWFNERmFjZXQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgIGlzRGVmaW5lZCA9IChmYWNldC5nZXRSb290Q29udGFpbmVyKCkgPT0gZmFjZXRTZWN0aW9uLnhzZFNjaGVtYSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoa2luZCA9PSBQQVRURVJOKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzRGVmaW5lZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3QuZ2V0UGF0dGVybkZhY2V0cygpLnRvQXJyYXkoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzRGVmaW5lZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3QuZ2V0RW51bWVyYXRpb25GYWNldHMoKS50b0FycmF5KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLSAgfQotCi0gIGNsYXNzIENvbnN0cmFpbnRzVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyBDb25zdHJhaW50c1RhYmxlTGFiZWxQcm92aWRlcigpCi0gICAgewotCi0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgaWYgKGtpbmQgPT0gUEFUVEVSTikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlUGF0dGVybi5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVFbnVtLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RQYXR0ZXJuRmFjZXQpCi0gICAgICB7Ci0gICAgICAgIFhTRFBhdHRlcm5GYWNldCBwYXR0ZXJuID0gKFhTRFBhdHRlcm5GYWNldCkgZWxlbWVudDsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcGF0dGVybi5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgIHsKLSAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgZWxlbWVudDsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZW51bUZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREFjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzFmYTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuRWRpdEF0dHJpYnV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlhNTE5vZGVBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFhTREFjdGlvbk1hbmFnZXIgZXh0ZW5kcyBYTUxOb2RlQWN0aW9uTWFuYWdlciB7Ci0KLSAgcHJpdmF0ZSBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrOwotICAKLQlwdWJsaWMgWFNEQWN0aW9uTWFuYWdlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKG1vZGVsLCB2aWV3ZXIpOwotCX0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbW1hbmRTdGFjayhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0gICAgdGhpcy5jb21tYW5kU3RhY2sgPSBjb21tYW5kU3RhY2s7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZENEYXRhU2VjdGlvbkFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkUENEYXRhQWN0aW9uKE5vZGUgcGFyZW50LCBDTURhdGFUeXBlIGRhdGFUeXBlLCBpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUFkZERvY3VtZW50Q2hpbGRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBEb2N1bWVudCBkb2N1bWVudCwgaW50IGljLCBpbnQgdmMpIHsKLQl9Ci0gIAotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVFZGl0R3JhbW1hckluZm9ybWF0aW9uQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTm9kZSBub2RlKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBEb2N1bWVudCBkb2N1bWVudCwgaW50IGluZGV4KSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBFbGVtZW50IHBhcmVudEVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBpbnQgaW5kZXgpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVRleHROb2RlQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRWxlbWVudCBwYXJlbnRFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCwgaW50IGluZGV4KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUZXh0Tm9kZUFjdGlvbnMobWVudSwgcGFyZW50RWxlbWVudCwgcGFyZW50RWQsIGluZGV4KTsKLQl9Ci0gIAotICBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZEF0dHJpYnV0ZUFjdGlvbihFbGVtZW50IHBhcmVudCwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkgewotICAgIEFjdGlvbiBhY3Rpb24gPSBudWxsOwotICAgIGlmIChhZCA9PSBudWxsKSB7Ci0gICAgICBhY3Rpb24gPSBuZXcgRWRpdEF0dHJpYnV0ZUFjdGlvbih0aGlzLCBwYXJlbnQsIG51bGwsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfTkVXX0FUVFJJQlVURSwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9ORVdfQVRUUklCVVRFX1RJVExFKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfSBlbHNlIHsKLSAgICAgIGFjdGlvbiA9IG5ldyBBZGROb2RlQWN0aW9uKGFkLCBwYXJlbnQsIC0xKTsKLSAgICB9Ci0gICAgCi0gICAgV3JhcHBlckNvbW1hbmQgY29tbWFuZCA9IG5ldyBXcmFwcGVyQ29tbWFuZChhY3Rpb24sIHBhcmVudCwgYWQpOwotICAgIFdyYXBwZXJBY3Rpb24gd3JhcHBlckFjdGlvbiA9IG5ldyBXcmFwcGVyQWN0aW9uKGNvbW1hbmQpOwotICAgIHJldHVybiB3cmFwcGVyQWN0aW9uOwotICB9Ci0gIAotICBjbGFzcyBXcmFwcGVyQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi0gIHsKLSAgICBXcmFwcGVyQ29tbWFuZCBjb21tYW5kOwotICAgIAotICAgIHB1YmxpYyBXcmFwcGVyQWN0aW9uKFdyYXBwZXJDb21tYW5kIGNvbW1hbmQpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gICAgewotICAgICAgcmV0dXJuIGNvbW1hbmQuZ2V0QWN0aW9uKCkuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgLy8gU29tZSBlZGl0b3JzIG1heSBub3QgdXNlIGEgY29tbWFuZCBzdGFjawotICAgICAgaWYgKGNvbW1hbmRTdGFjayAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb21tYW5kU3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgV3JhcHBlckNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCi0gIHsKLSAgICBBY3Rpb24gYWN0aW9uOwotICAgIEVsZW1lbnQgcGFyZW50OwotICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQ7Ci0gICAgcHVibGljIFdyYXBwZXJDb21tYW5kKEFjdGlvbiBhY3Rpb24sIEVsZW1lbnQgcGFyZW50LCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgdGhpcy5hZCA9IGFkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7Ci0gICAgICByZXR1cm4gYWN0aW9uLmdldFRleHQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEFjdGlvbiBnZXRBY3Rpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHsKLSAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdW5kbygpIHsKLSAgICAgIAotLy8gICAgICAoKEVsZW1lbnQpcGFyZW50KS5yZW1vdmVBdHRyaWJ1dGUoYWQuZ2V0QXR0ck5hbWUoKSk7Ci0KLSAgICAgIGdldE1vZGVsKCkuZ2V0VW5kb01hbmFnZXIoKS51bmRvKCk7Ci0KLSAgICB9IAotICAgICAgICAKLQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQW55RWxlbWVudENvbnRlbnRzU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBbnlFbGVtZW50Q29udGVudHNTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExN2FiNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBbnlFbGVtZW50Q29udGVudHNTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFByb2Nlc3NDb250ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RBbnlFbGVtZW50Q29udGVudHNTZWN0aW9uIGV4dGVuZHMgTXVsdGlwbGljaXR5U2VjdGlvbgotewotICBDQ29tYm8gbmFtZXNwYWNlQ29tYm87Ci0gIENDb21ibyBwcm9jZXNzQ29udGVudHNDb21ibzsKLQotICBwcml2YXRlIFN0cmluZ1tdIG5hbWVzcGFjZUNvbWJvVmFsdWVzID0geyAiIiwgLy8kTk9OLU5MUy0xJAotICAgICAgIiMjYW55IiwgLy8kTk9OLU5MUy0xJAotICAgICAgIiMjb3RoZXIiLCAvLyROT04tTkxTLTEkCi0gICAgICAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkCi0gICAgICAiIyNsb2NhbCIgLy8kTk9OLU5MUy0xJAotICB9OwotCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBYU0RBbnlFbGVtZW50Q29udGVudHNTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLSAgICBDTGFiZWwgbmFtZXNwYWNlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0FUVFJJQlVURVNfTkFNRVNQQUNFKTsKLSAgICBuYW1lc3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgbmFtZXNwYWNlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbmFtZXNwYWNlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBuYW1lc3BhY2VDb21iby5zZXRJdGVtcyhuYW1lc3BhY2VDb21ib1ZhbHVlcyk7Ci0gICAgbmFtZXNwYWNlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lc3BhY2VDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQU5ZRUxFTUVOVF9fTkFNRVNQQUNFKTsKLQotICAgIENMYWJlbCBwcm9jZXNzQ29udGVudHNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUklCVVRFU19QUk9DRVNTQ09OVEVOVFMpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBwcm9jZXNzQ29udGVudHNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgcHJvY2Vzc0NvbnRlbnRzQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgcHJvY2Vzc0NvbnRlbnRzQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBJdGVyYXRvciBsaXN0ID0gWFNEUHJvY2Vzc0NvbnRlbnRzLlZBTFVFUy5pdGVyYXRvcigpOwotICAgIHByb2Nlc3NDb250ZW50c0NvbWJvLmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB3aGlsZSAobGlzdC5oYXNOZXh0KCkpCi0gICAgewotICAgICAgcHJvY2Vzc0NvbnRlbnRzQ29tYm8uYWRkKCgoWFNEUHJvY2Vzc0NvbnRlbnRzKSBsaXN0Lm5leHQoKSkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgcHJvY2Vzc0NvbnRlbnRzQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm9jZXNzQ29udGVudHNDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQU5ZRUxFTUVOVF9fUFJPQ0VTU0NPTlRFTlRTKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIG1pbiBwcm9wZXJ0eQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX01JTk9DQ1VSUyk7Ci0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgbWluQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIG1pbkNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbWluQ29tYm8uYWRkKCIwIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtaW5Db21iby5hZGQoIjEiKTsgLy8kTk9OLU5MUy0xJAotICAgIGFwcGx5QWxsTGlzdGVuZXJzKG1pbkNvbWJvKTsKLSAgICBtaW5Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1pbkNvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19BTllFTEVNRU5UX19NSU5fT0NDVVJFTkNFKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIG1heCBwcm9wZXJ0eQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5VSV9MQUJFTF9NQVhPQ0NVUlMpOwotCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIG1heENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICBtYXhDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG1heENvbWJvLmFkZCgiMCIpOyAvLyROT04tTkxTLTEkCi0gICAgbWF4Q29tYm8uYWRkKCIxIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtYXhDb21iby5hZGQoInVuYm91bmRlZCIpOyAvLyROT04tTkxTLTEkCi0gICAgYXBwbHlBbGxMaXN0ZW5lcnMobWF4Q29tYm8pOwotICAgIG1heENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWF4Q29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0FOWUVMRU1FTlRfX01BWF9PQ0NVUkVOQ0UpOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIG5hbWVzcGFjZUNvbWJvLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgcHJvY2Vzc0NvbnRlbnRzQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICAgIHsKLSAgICAgICAgWFNEV2lsZGNhcmQgd2lsZGNhcmQgPSAoWFNEV2lsZGNhcmQpIGlucHV0OwotICAgICAgICBpZiAod2lsZGNhcmQuaXNTZXRMZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCgpKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZXNwYWNlQ29tYm8uc2V0VGV4dCh3aWxkY2FyZC5nZXRTdHJpbmdMZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lc3BhY2VDb21iby5zZXRUZXh0KCIiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAod2lsZGNhcmQuaXNTZXRQcm9jZXNzQ29udGVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgIFhTRFByb2Nlc3NDb250ZW50cyBwYyA9IHdpbGRjYXJkLmdldFByb2Nlc3NDb250ZW50cygpOwotICAgICAgICAgIHByb2Nlc3NDb250ZW50c0NvbWJvLnNldFRleHQocGMuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHdpbGRjYXJkLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgICB7Ci0gICAgICAgICAgbWluQ29tYm8uc2V0RW5hYmxlZCghaXNSZWFkT25seSk7Ci0gICAgICAgICAgbWF4Q29tYm8uc2V0RW5hYmxlZCghaXNSZWFkT25seSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWluQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgbWF4Q29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmVmcmVzaE1pbk1heCgpOwotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpIGlucHV0OwotICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsKLSAgICAgIFhTRFdpbGRjYXJkIHdpbGRjYXJkID0gKFhTRFdpbGRjYXJkKSBjb25jcmV0ZUNvbXBvbmVudDsKLSAgICAgIGlmIChlLndpZGdldCA9PSBuYW1lc3BhY2VDb21ibykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gbmFtZXNwYWNlQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZSA9IGZhbHNlOwotICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyB1c2UgY29tbWFuZHMKLSAgICAgICAgLy8gYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX05BTUVTUEFDRV9DSEFOR0UiKSwKLSAgICAgICAgLy8gZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHJlbW92ZUF0dHJpYnV0ZSkKLSAgICAgICAgewotICAgICAgICAgIHdpbGRjYXJkLnVuc2V0TGV4aWNhbE5hbWVzcGFjZUNvbnN0cmFpbnQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB3aWxkY2FyZC5zZXRTdHJpbmdMZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludChuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gcHJvY2Vzc0NvbnRlbnRzQ29tYm8pCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IHByb2Nlc3NDb250ZW50c0NvbWJvLmdldFRleHQoKTsKLSAgICAgICAgYm9vbGVhbiByZW1vdmVBdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZW1vdmVBdHRyaWJ1dGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9QUk9DRVNTQ09OVEVOVFNfQ0hBTkdFIiksCi0gICAgICAgIC8vIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChyZW1vdmVBdHRyaWJ1dGUpCi0gICAgICAgIHsKLSAgICAgICAgICB3aWxkY2FyZC51bnNldFByb2Nlc3NDb250ZW50cygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHdpbGRjYXJkLnNldFByb2Nlc3NDb250ZW50cyhYU0RQcm9jZXNzQ29udGVudHMuZ2V0KHByb2Nlc3NDb250ZW50c0NvbWJvLmdldEl0ZW0ocHJvY2Vzc0NvbnRlbnRzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChtaW5Db21ibyAhPSBudWxsICYmICFtaW5Db21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtaW5Db21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBpZiAobWF4Q29tYm8gIT0gbnVsbCAmJiAhbWF4Q29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgbWF4Q29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQXR0cmlidXRlRGVjbGFyYXRpb25TZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREF0dHJpYnV0ZURlY2xhcmF0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWIzZTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQXR0cmlidXRlRGVjbGFyYXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTENoYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQmFzZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy5OZXdUeXBlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaC5YU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uU2VjdGlvbiBleHRlbmRzIFJlZmFjdG9yaW5nU2VjdGlvbgotewotICBwcm90ZWN0ZWQgVGV4dCBuYW1lVGV4dCwgZGVmYXVsdE9yRml4ZWRUZXh0OwotICBwcm90ZWN0ZWQgQ0NvbWJvIGNvbXBvbmVudE5hbWVDb21ibywgdHlwZUNvbWJvLCB1c2FnZUNvbWJvLCBmb3JtQ29tYm87Ci0gIHByb3RlY3RlZCBCdXR0b24gZGVmYXVsdEJ1dHRvbiwgZml4ZWRCdXR0b247Ci0gIHByb3RlY3RlZCBTdHJpbmcgdHlwZU5hbWUgPSAiIiwgcmVmTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gIGJvb2xlYW4gaXNBdHRyaWJ1dGVSZWZlcmVuY2U7Ci0gIAotICBwdWJsaWMgWFNEQXR0cmlidXRlRGVjbGFyYXRpb25TZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBTdHJpbmcgdHlwZUxhYmVsID0gTWVzc2FnZXMuVUlfTEFCRUxfVFlQRTsgLy8kTk9OLU5MUy0xJAotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBOYW1lTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgQ0xhYmVsIG5hbWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FKTsKLSAgICBuYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5hbWVUZXh0Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBuYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBuYW1lVGV4dC5zZXRFbmFibGVkKCFpc0F0dHJpYnV0ZVJlZmVyZW5jZSk7Ci0gICAgYXBwbHlBbGxMaXN0ZW5lcnMobmFtZVRleHQpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZVRleHQsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0FUVFJJQlVURV9fTkFNRSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBSZWZhY3Rvci9yZW5hbWUgaHlwZXJsaW5rCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgaWYgKCFoaWRlSHlwZXJMaW5rKSAKLSAgICB7Ci0gICAgCWNyZWF0ZVJlbmFtZUh5cGVybGluayhjb21wb3NpdGUpOwotCQkgIHNldFJlbmFtZUh5cGVybGlua0VuYWJsZWQoIWlzQXR0cmlidXRlUmVmZXJlbmNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgIAkgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7Ci0gICAgfQotICAgIAotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUmVmIExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgaWYgKGlzQXR0cmlidXRlUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICBDTGFiZWwgcmVmTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfUkVGRVJFTkNFKTsKLSAgICAgIHJlZkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gUmVmIENvbWJvCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICAgIGNvbXBvbmVudE5hbWVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCB0aGlzKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvbmVudE5hbWVDb21ibywKLSAgICAgICAgICBYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0FUVFJJQlVURV9fTkFNRSk7Ci0KLSAgICAgIC8vIGR1bW15Ci0gICAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHR5cGVMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCB0eXBlTGFiZWwpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyB0eXBlQ29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHR5cGVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICB0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICB0eXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgdHlwZUNvbWJvLmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgdGhpcyk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0eXBlQ29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0FUVFJJQlVURV9fVFlQRSk7Ci0KLSAgICAvLyBkdW1teQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBVc2FnZUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIENMYWJlbCB1c2VMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVVNBR0UiKSk7Ci0gICAgdXNlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFVzYWdlQ29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHVzYWdlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgdXNhZ2VDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHVzYWdlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgdXNhZ2VDb21iby5hZGQoIiIpOwotICAgIHVzYWdlQ29tYm8uYWRkKCJyZXF1aXJlZCIpOyAvLyROT04tTkxTLTEkCi0gICAgdXNhZ2VDb21iby5hZGQoIm9wdGlvbmFsIik7IC8vJE5PTi1OTFMtMSQKLSAgICB1c2FnZUNvbWJvLmFkZCgicHJvaGliaXRlZCIpOyAvLyROT04tTkxTLTEkCi0gICAgdXNhZ2VDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICAvLyBkdW1teQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBkZWZhdWx0TGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgQ0xhYmVsIGRlZmF1bHRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9WQUxVRV9DT0xPTik7Ci0gICAgZGVmYXVsdExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIHJhZGlvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotICAgIHJhZGlvLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotICAgIAotICAgIGRlZmF1bHRCdXR0b24gPSBuZXcgQnV0dG9uKHJhZGlvLCBTV1QuUkFESU8pOwotICAgIGRlZmF1bHRCdXR0b24uc2V0VGV4dChvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9ERUZBVUxUKTsKLSAgICBkZWZhdWx0QnV0dG9uLnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7Ci0gICAgZGVmYXVsdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBmaXhlZEJ1dHRvbiA9IG5ldyBCdXR0b24ocmFkaW8sIFNXVC5SQURJTyk7Ci0gICAgZml4ZWRCdXR0b24uc2V0VGV4dChvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9GSVhFRCk7ICAKLSAgICBmaXhlZEJ1dHRvbi5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXRCYWNrZ3JvdW5kKCkpOwotICAgIGZpeGVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIC8vIGR1bW15Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIGR1bW15Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gZGVmYXVsdFRleHQKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRlZmF1bHRPckZpeGVkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgZGVmYXVsdE9yRml4ZWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYXBwbHlBbGxMaXN0ZW5lcnMoZGVmYXVsdE9yRml4ZWRUZXh0KTsKLSAgICAKLSAgICAvL1BsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZVRleHQsCi0gICAgLy8JCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQVRUUklCVVRFX19ERUZBVUxUKTsKLSAgICAKLSAgICAvLyBkdW1teQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBGb3JtTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgQ0xhYmVsIGZvcm1MYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9GT1JNKTsKLSAgICBmb3JtTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEZvcm1Db21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZm9ybUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGZvcm1Db21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGZvcm1Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBmb3JtQ29tYm8uYWRkKCIiKTsKLSAgICBmb3JtQ29tYm8uYWRkKCJxdWFsaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgIGZvcm1Db21iby5hZGQoInVucXVhbGlmaWVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICBmb3JtQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgLy8gZHVtbXkKLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwcml2YXRlIHZvaWQgZmlsbFR5cGVzQ29tYm8oKQotICB7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7Ci0gICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gaXRlbXMgPSBtYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLQotICAgICAgdHlwZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgdHlwZUNvbWJvLmFkZChNZXNzYWdlcy5fVUlfQ09NQk9fQlJPV1NFKTsKLSAgICAgIHR5cGVDb21iby5hZGQoTWVzc2FnZXMuX1VJX0NPTUJPX05FVyk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICB0eXBlQ29tYm8uYWRkKGl0ZW1zW2ldLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIG5hbWVkQ29tcG9uZW50ID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5wdXQpLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIG5hbWVkQ29tcG9uZW50VHlwZSA9IG5hbWVkQ29tcG9uZW50LmdldFR5cGUoKTsKLSAgICAgIGlmIChuYW1lZENvbXBvbmVudFR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRUeXBlTmFtZSA9IG5hbWVkQ29tcG9uZW50VHlwZS5nZXRRTmFtZSh4c2RTY2hlbWEpOyAvLyBubwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVmaXgKLSAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXQgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKGN1cnJlbnRUeXBlTmFtZSwgbWFuYWdlcik7Ci0gICAgICAgIGlmIChyZXQgPT0gbnVsbCkgLy8gbm90IGluIHF1aWNrUGljawotICAgICAgICAgIHR5cGVDb21iby5hZGQoY3VycmVudFR5cGVOYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKFN0cmluZyB2YWx1ZSwgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIpCi0gIHsKLSAgICBpZiAoZWRpdE1hbmFnZXIgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBxdWlja1BpY2tzID0gZWRpdE1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotICAgICAgaWYgKHF1aWNrUGlja3MgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcXVpY2tQaWNrcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IHF1aWNrUGlja3NbaV07Ci0gICAgICAgICAgaWYgKHZhbHVlICE9bnVsbCAmJiBjb21wb25lbnRTcGVjaWZpY2F0aW9uIT1udWxsICYmIHZhbHVlLmVxdWFscyhjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFNwZWNpZmljYXRpb247Ci0gICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCi0gICAgLy8gcmVmcmVzaCBuYW1lCi0KLSAgICBuYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIG5hbWVkQ29tcG9uZW50ID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5wdXQpLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLQotICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lZENvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoaXNBdHRyaWJ1dGVSZWZlcmVuY2UpCi0gICAgewotICAgICAgcmVmcmVzaFJlZkNvbWJvKCk7Ci0gICAgfQotCi0gICAgLy8gcmVmcmVzaCB0eXBlCi0KLSAgICB0eXBlQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgICAgaXNBdHRyaWJ1dGVSZWZlcmVuY2UgPSAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKWlucHV0KS5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCk7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSB4c2RBdHRyaWJ1dGUuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNBbm9ueW1vdXMgPSB4c2RBdHRyaWJ1dGUuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSAhPSBudWxsOwotCi0gICAgICAgIGlmIChpc0Fub255bW91cykKLSAgICAgICAgewotICAgICAgICAgIHR5cGVDb21iby5zZXRUZXh0KCIqKmFub255bW91cyoqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmaWxsVHlwZXNDb21ibygpOwotICAgICAgICAgIGlmICh0eXBlRGVmICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZU5hbWUgPSB0eXBlRGVmLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgICBpZiAodHlwZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHlwZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHlwZUNvbWJvLnNldFRleHQodHlwZU5hbWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZUNvbWJvLnNldFRleHQoTWVzc2FnZXMuVUlfTk9fVFlQRSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB1c2FnZUNvbWJvLnNldFRleHQoIiIpOwotICAgICAgICB1c2FnZUNvbWJvLnNldEVuYWJsZWQoIXhzZEF0dHJpYnV0ZS5pc0dsb2JhbCgpKTsKLSAgICAgICAgCi0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZEF0dHJpYnV0ZS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGJvb2xlYW4gaGFzVXNlQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBoYXNVc2VBdHRyaWJ1dGUgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuVVNFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgaWYgKGhhc1VzZUF0dHJpYnV0ZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdXNhZ2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVVNFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICB1c2FnZUNvbWJvLnNldFRleHQodXNhZ2UpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZGVmYXVsdE9yRml4ZWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgCi0gICAgICAgIGJvb2xlYW4gaGFzRGVmYXVsdEF0dHJpYnV0ZSA9IGZhbHNlLCBoYXNGaXhlZEF0dHJpYnV0ZSA9IGZhbHNlOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaGFzRGVmYXVsdEF0dHJpYnV0ZSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSk7Ci0gICAgICAgICAgaGFzRml4ZWRBdHRyaWJ1dGUgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLQotICAgICAgICAgIC8vIENhc2Ugd2hlcmUgbm8gZml4ZWQgb3IgZGVmYXVsdCBhdHRyaWJ1dGVzIGV4aXN0LCBzbyBlbnN1cmUgb25lIG9mIHRoZSByYWRpbyBidXR0b25zIGlzIHNlbGVjdGVkCi0gICAgICAgICAgaWYgKCFoYXNEZWZhdWx0QXR0cmlidXRlICYmICFoYXNGaXhlZEF0dHJpYnV0ZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWRlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgIWZpeGVkQnV0dG9uLmdldFNlbGVjdGlvbigpKSAvLyBpZiBub25lIGFyZSBzZWxlY3RlZCB0aGVuIHBpY2sgZml4ZWQKLSAgICAgICAgICAgICAgZml4ZWRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gaWYgYm90aCBhcmUgcHJlc2VudCBpbiBzb3VyY2UgKGFuIGVycm9yISksIGFzc3VtZSB0aGF0ICpmaXhlZCogdGFrZXMgInByZWNlZGVuY2UiCi0gICAgICAgICAgICBkZWZhdWx0QnV0dG9uLnNldFNlbGVjdGlvbighaGFzRml4ZWRBdHRyaWJ1dGUgJiYgaGFzRGVmYXVsdEF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICBmaXhlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oaGFzRml4ZWRBdHRyaWJ1dGUpOwotICAgICAgICAgICAgaWYgKGhhc0RlZmF1bHRBdHRyaWJ1dGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyB0aGVEZWZhdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFKTsKLSAgICAgICAgICAgIAlkZWZhdWx0T3JGaXhlZFRleHQuc2V0VGV4dCh0aGVEZWZhdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChoYXNGaXhlZEF0dHJpYnV0ZSkgLy8gd2lsbCBvdmVyd3JpdGUgZGVmYXVsdCBpZiBib3RoIHByZXNlbnQKLQkgICAgICAgICAgewotICAgICAgICAJICAgIFN0cmluZyBmaXhlZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUpOwotICAgICAgICAJICAgIGRlZmF1bHRPckZpeGVkVGV4dC5zZXRUZXh0KGZpeGVkKTsKLQkgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9ybUNvbWJvLnNldFRleHQoIiIpOyAKLSAgICAgICAgZm9ybUNvbWJvLnNldEVuYWJsZWQoIXhzZEF0dHJpYnV0ZS5pc0dsb2JhbCgpICYmICFpc0F0dHJpYnV0ZVJlZmVyZW5jZSk7Ci0gICAgICAgIGJvb2xlYW4gaGFzRm9ybUF0dHJpYnV0ZSA9IGZhbHNlOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaGFzRm9ybUF0dHJpYnV0ZSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5GT1JNX0FUVFJJQlVURSk7Ci0gICAgICAgICAgaWYgKGhhc0Zvcm1BdHRyaWJ1dGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGZvcm0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRk9STV9BVFRSSUJVVEUpOwotICAgICAgICAgICAgZm9ybUNvbWJvLnNldFRleHQoZm9ybSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSB0eXBlQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKHNob3VsZFBlcmZvcm1Db21ib1NlbGVjdGlvbihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgc2VsZWN0aW9uKSkKLSAgICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0gZWxzZSBpZiAoZS53aWRnZXQgPT0gY29tcG9uZW50TmFtZUNvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBjb21wb25lbnROYW1lQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKHNob3VsZFBlcmZvcm1Db21ib1NlbGVjdGlvbihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgc2VsZWN0aW9uKSkKLSAgICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSB0eXBlQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKHNob3VsZFBlcmZvcm1Db21ib1NlbGVjdGlvbihTV1QuU2VsZWN0aW9uLCBzZWxlY3Rpb24pKQotICAgICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfSBlbHNlIGlmIChlLndpZGdldCA9PSBjb21wb25lbnROYW1lQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoc2hvdWxkUGVyZm9ybUNvbWJvU2VsZWN0aW9uKFNXVC5TZWxlY3Rpb24sIHNlbGVjdGlvbikpCi0gICAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgaWYgKGVkaXRvciA9PSBudWxsKSByZXR1cm47Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7Ci0KLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSB0eXBlQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZTsKLSAgICAgIElDb21wb25lbnREaWFsb2cgZGlhbG9nPSBudWxsOwotICAgICAgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9DT01CT19CUk9XU0UpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpOwotICAgICAgICAoKFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZSkgZGlhbG9nKS5zaG93Q29tcGxleFR5cGVzKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9DT01CT19ORVcpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldE5ld0RpYWxvZygpOwotICAgICAgICAoKE5ld1R5cGVEaWFsb2cpIGRpYWxvZykuYWxsb3dDb21wbGV4VHlwZShmYWxzZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGUgPSAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKHhzZEF0dHJpYnV0ZSwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgIAl0eXBlQ29tYm8uc2V0VGV4dCh0eXBlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLy91c2UgdGhlIHZhbHVlIGZyb20gc2VsZWN0ZWQgcXVpY2tQaWNrIGl0ZW0KLSAgICAgIHsKLSAgICAgICAgbmV3VmFsdWUgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKHNlbGVjdGlvbiwgbWFuYWdlcik7Ci0gICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKQotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7Ci0gICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgIGlmIChlZGl0b3IgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RBdHRyaWJ1dGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7Ci0KLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBjb21wb25lbnROYW1lQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZTsKLSAgICAgIElDb21wb25lbnREaWFsb2cgZGlhbG9nPSBudWxsOwotICAgICAgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9DT01CT19CUk9XU0UpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0NPTUJPX05FVykpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KHJlZk5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vdXNlIHRoZSB2YWx1ZSBmcm9tIHNlbGVjdGVkIHF1aWNrUGljayBpdGVtCi0gICAgICB7Ci0gICAgICAgIG5ld1ZhbHVlID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShzZWxlY3Rpb24sIG1hbmFnZXIpOwotICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZEF0dHJpYnV0ZSA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RBdHRyaWJ1dGUuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGUud2lkZ2V0ID09IHVzYWdlQ29tYm8pCi0gICAgICB7CSAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgbmV3VmFsdWUgPSB1c2FnZUNvbWJvLmdldFRleHQoKTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQoZWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfVVNBR0UpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlU3RlcHMoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVVNFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVVNFX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH07Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZm9ybUNvbWJvKQotICAgICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgbmV3VmFsdWUgPSBmb3JtQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBQcm9wZXJ0aWVzQ2hhbmdlQ29tbWFuZChlbGVtZW50LCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9GT1JNKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZVN0ZXBzKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZPUk1fQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GT1JNX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH07Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZGVmYXVsdEJ1dHRvbikKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSA9IGRlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobmV3VmFsdWUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLQotICAgICAgICAgICAgICBQcm9wZXJ0aWVzQ2hhbmdlQ29tbWFuZCBjb21tYW5kID0gbmV3IFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kKGVsZW1lbnQsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0RFRkFVTFQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGVTdGVwcygpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBmaXhlZEJ1dHRvbikKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSA9IGZpeGVkQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG5ld1ZhbHVlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICBQcm9wZXJ0aWVzQ2hhbmdlQ29tbWFuZCBjb21tYW5kID0gbmV3IFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kKGVsZW1lbnQsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0ZJWEVEKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlU3RlcHMoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5kb1dpZGdldFNlbGVjdGVkKGUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGlmIChldmVudC50eXBlID09IFNXVC5UcmF2ZXJzZSkgewotICAgICAgaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVCB8fCBldmVudC5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTKSB7Ci0gICAgICAgIGlzVHJhdmVyc2luZyA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkKLSAgICB7Ci0gICAgICBpZiAoIW5hbWVUZXh0LmdldEVkaXRhYmxlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBuYW1lZENvbXBvbmVudCA9ICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGlucHV0KS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0KLSAgICAgICAgaWYgKCF2YWxpZGF0ZVNlY3Rpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgYW4gYWN0dWFsIG5hbWUgY2hhbmdlIGhhcyB0YWtlbiBwbGFjZQotICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21tYW5kID0gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0FDVElPTl9SRU5BTUUsIG5hbWVkQ29tcG9uZW50LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsICYmIGdldENvbW1hbmRTdGFjaygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoaXNBdHRyaWJ1dGVSZWZlcmVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyUmVmID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKWlucHV0OwotICAgICAgICAgIFN0cmluZyBxbmFtZSA9IGF0dHJSZWYuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFFOYW1lKCk7Ci0gICAgICAgICAgYXR0clJlZi5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFLCBxbmFtZSk7Ci0gICAgICAgICAgCi0vLyAgICAgICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLS8vICAgICAgICAgIExpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyAgICAgICAgICBpdGVtcyA9IGhlbHBlci5nZXRHbG9iYWxFbGVtZW50cygpOwotLy8gICAgICAgICAgaXRlbXMuYWRkKDAsICIiKTsKLS8vICAgICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRJdGVtcygoU3RyaW5nIFtdKWl0ZW1zLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwotLy8KLS8vICAgICAgICAgIHJlZnJlc2hSZWZDb21ibygpOwotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGRlZmF1bHRPckZpeGVkVGV4dCkKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGUgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gZGVmYXVsdE9yRml4ZWRUZXh0LmdldFRleHQoKTsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZEF0dHJpYnV0ZS5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQoZWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfVkFMVUUpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlU3RlcHMoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9OwotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgICAgICAgIGlmIChmaXhlZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChlbGVtZW50LCBYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFLCBuZXdWYWx1ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfRklYRUQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvUG9zdFByb2Nlc3NpbmcoKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGVsZW1lbnQsIFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSwgbmV3VmFsdWUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0RFRkFVTFQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvUG9zdFByb2Nlc3NpbmcoKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVNlY3Rpb24oKQotICB7Ci0gICAgaWYgKG5hbWVUZXh0ID09IG51bGwgfHwgbmFtZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0KLSAgICAvLyB2YWxpZGF0ZSBhZ2FpbnN0IE5DTmFtZQotICAgIGlmIChuYW1lLmxlbmd0aCgpIDwgMSB8fCAhWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKG5hbWUpKQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZShvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9FUlJPUl9JTlZBTElEX05BTUUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChjb21wb25lbnROYW1lQ29tYm8gIT0gbnVsbCAmJiAhY29tcG9uZW50TmFtZUNvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8ucmVtb3ZlTGlzdGVuZXIoU1dULlRyYXZlcnNlLCB0aGlzKTsKLSAgICB9Ci0gICAgaWYgKG5hbWVUZXh0ICE9IG51bGwgJiYgIW5hbWVUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJlbW92ZUxpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgaWYgKHR5cGVDb21ibyAhPSBudWxsICYmICF0eXBlQ29tYm8uaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIHR5cGVDb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIHR5cGVDb21iby5yZW1vdmVMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIHRoaXMpOwotICAgIH0KLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICBpbml0KCk7Ci0gICAgcmVsYXlvdXQoKTsKLSAgICAKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICB7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgIGlzQXR0cmlidXRlUmVmZXJlbmNlID0geHNkQXR0cmlidXRlLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKTsKLSAgICAgIGhpZGVIeXBlckxpbmsgPSAheHNkQXR0cmlidXRlLmlzR2xvYmFsKCkgfHwgaXNBdHRyaWJ1dGVSZWZlcmVuY2U7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVsYXlvdXQoKQotICB7Ci0gICAgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KGZhbHNlKTsKLQotICAgIGlmIChwYXJlbnRDb21wb3NpdGUgIT0gbnVsbCAmJiAhcGFyZW50Q29tcG9zaXRlLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBDb250cm9sW10gY2hpbGRyZW4gPSBwYXJlbnRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGNoaWxkcmVuW2ldLmRpc3Bvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3cgaW5pdGlhbGl6ZSB0aGUgbmV3IGhhbmRsZXIKLSAgICBjcmVhdGVDb250ZW50cyhwYXJlbnRDb21wb3NpdGUpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLSAgICAvLyBOb3cgdHVybiBwYWludGluZyBiYWNrIG9uCi0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLnNldFJlZHJhdyh0cnVlKTsKLSAgICByZWZyZXNoKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hSZWZDb21ibygpCi0gIHsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBmaWxsQ29tcG9uZW50TmFtZUNvbWJvKCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBmaWxsQ29tcG9uZW50TmFtZUNvbWJvKCkKLSAgewotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOyAgICAKLSAgICAKLSAgICBjb21wb25lbnROYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZChNZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRSk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZChNZXNzYWdlcy5fVUlfQUNUSU9OX05FVyk7Ci0gICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHF1aWNrUGlja3MgPSBtYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLSAgICBpZiAocXVpY2tQaWNrcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9MDsgaSA8IHF1aWNrUGlja3MubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IHF1aWNrUGlja3NbaV07Ci0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpOwotICAgICAgfSAgCi0gICAgfQotICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBoaXN0b3J5ID0gbWFuYWdlci5nZXRIaXN0b3J5KCk7Ci0gICAgaWYgKGhpc3RvcnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpPTA7IGkgPCBoaXN0b3J5Lmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBoaXN0b3J5W2ldOwotICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgIH0gIAotICAgIH0KLSAgICAKLSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBuYW1lZENvbXBvbmVudCA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gbmFtZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKTsKLSAgICAgIGlmIChhdHRyVmFsdWUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmV0ID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShhdHRyVmFsdWUsIG1hbmFnZXIpOwotICAgICAgaWYgKHJldCA9PSBudWxsKQotICAgICAgewotICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKGF0dHJWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0VGV4dChhdHRyVmFsdWUpOwotICAgICAgcmVmTmFtZSA9IGF0dHJWYWx1ZTsKLSAgICB9IAotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLSAgewotICAgIHByb3RlY3RlZCBFbGVtZW50IGVsZW1lbnQ7Ci0gICAgcHVibGljIFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGxhYmVsKQotICAgIHsKLSAgICAgIHN1cGVyKE5MUy5iaW5kKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0FDVElPTl9DSEFOR0UsIGxhYmVsKSk7Ci0gICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICAgIGRvRXhlY3V0ZVN0ZXBzKCk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIGVuZFJlY29yZGluZygpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGVTdGVwcygpCi0gICAgewotICAgICAgCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTQwOWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MQ2hhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVOYW1lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblNlY3Rpb24gZXh0ZW5kcyBSZWZhY3RvcmluZ1NlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0gIHByb3RlY3RlZCBDQ29tYm8gcmVmQ29tYm87Ci0gIGJvb2xlYW4gaXNSZWZlcmVuY2U7Ci0KLSAgcHVibGljIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgaWYgKGlzUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gUmVmIExhYmVsCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICBDTGFiZWwgcmVmTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUgKyAiOiIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgcmVmTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBSZWYgQ29tYm8KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgICAgcmVmQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgICAgcmVmQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICByZWZDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJlZkNvbWJvLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0FUVFJJQlVURUdST1VQX1JFRlNfX1JFRik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIE5hbWVMYWJlbAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgICAgQ0xhYmVsIG5hbWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRSk7Ci0gICAgICBuYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBOYW1lVGV4dAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIG5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICBhcHBseUFsbExpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZVRleHQsCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQVRUUklCVVRFR1JPVVBfX05BTUUpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIFJlZmFjdG9yL3JlbmFtZSBoeXBlcmxpbmsgCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAKLSAgICAgIGlmICghaGlkZUh5cGVyTGluaykKLSAgICAgIHsKLSAgICAgICAgY3JlYXRlUmVuYW1lSHlwZXJsaW5rKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHNldFJlbmFtZUh5cGVybGlua0VuYWJsZWQoIWlzUmVmZXJlbmNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLQotICAgIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0KLSAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudClpbnB1dDsKLSAgICAKLSAgICBpZiAoaXNSZWZlcmVuY2UpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gbmFtZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICByZWZDb21iby5zZXRUZXh0KGF0dHJWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyByZWZyZXNoIG5hbWUKLSAgICAgIG5hbWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIFN0cmluZyBuYW1lID0gbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotICAgIGluaXQoKTsKLSAgICByZWxheW91dCgpOwotICAgIAotICAgIGlmIChpc1JlZmVyZW5jZSkKLSAgICB7Ci0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgIExpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBpdGVtcyA9IGhlbHBlci5nZXRHbG9iYWxBdHRyaWJ1dGVHcm91cHMoKTsKLSAgICAgIGl0ZW1zLmFkZCgwLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJlZkNvbWJvLnNldEl0ZW1zKChTdHJpbmcgW10paXRlbXMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWxheW91dCgpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlID0gY29tcG9zaXRlLmdldFBhcmVudCgpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgaWYgKHBhcmVudENvbXBvc2l0ZSAhPSBudWxsICYmICFwYXJlbnRDb21wb3NpdGUuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudENvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIE5vdyBpbml0aWFsaXplIHRoZSBuZXcgaGFuZGxlcgotICAgIGNyZWF0ZUNvbnRlbnRzKHBhcmVudENvbXBvc2l0ZSk7Ci0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQotICAgIC8vIE5vdyB0dXJuIHBhaW50aW5nIGJhY2sgb24KLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KHRydWUpOwotICAgIHJlZnJlc2goKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICBpc1JlZmVyZW5jZSA9IGdyb3VwLmlzQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCk7Ci0gICAgICBoaWRlSHlwZXJMaW5rID0gaXNSZWZlcmVuY2U7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgc3VwZXIuZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KSBpbnB1dDsKLSAgICAgICAgaWYgKCF2YWxpZGF0ZVNlY3Rpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgYW4gYWN0dWFsIG5hbWUgY2hhbmdlIGhhcyB0YWtlbiBwbGFjZQotICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21tYW5kID0gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fUkVOQU1FLCBuYW1lZENvbXBvbmVudCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBnZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICAvLyBkb1JlZmVyZW50aWFsSW50ZWdyaXR5Q2hlY2sobmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVNlY3Rpb24oKQotICB7Ci0gICAgaWYgKG5hbWVUZXh0ID09IG51bGwgfHwgbmFtZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0KLSAgICAvLyB2YWxpZGF0ZSBhZ2FpbnN0IE5DTmFtZQotICAgIGlmIChuYW1lLmxlbmd0aCgpIDwgMSB8fCAhWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKG5hbWUpKQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5fVUlfRVJST1JfSU5WQUxJRF9OQU1FKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSByZWZDb21ibykKLSAgICB7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSByZWZDb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpaW5wdXQ7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG5hbWVkQ29tcG9uZW50LmdldEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAobmFtZWRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgICAgIFhTRERpcmVjdGl2ZXNNYW5hZ2VyLnJlbW92ZVVudXNlZFhTREltcG9ydHMobmFtZWRDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKG5hbWVUZXh0ICE9IG51bGwgJiYgIW5hbWVUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJlbW92ZUxpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQ29tcGxleFR5cGVBZHZhbmNlZFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQ29tcGxleFR5cGVBZHZhbmNlZFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0Zjk5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRENvbXBsZXhUeXBlQWR2YW5jZWRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBYU0RDb21wbGV4VHlwZUFkdmFuY2VkU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSAiIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBDQ29tYm8gYmxvY2tDb21ibzsKLSAgcHJvdGVjdGVkIENDb21ibyBmaW5hbENvbWJvOwotICBwcm90ZWN0ZWQgQ0NvbWJvIG1peGVkQ29tYm87Ci0gIHByb3RlY3RlZCBDQ29tYm8gYWJzdHJhY3RDb21ibzsKLQotICBwcml2YXRlIFN0cmluZyBmaW5hbFZhbHVlc1tdID0geyBFTVBUWSwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCAvLyROT04tTkxTLTEkCi0gICAgICBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCAiIyIgKyBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHIH07IC8vJE5PTi1OTFMtMSQKLQotICBwcml2YXRlIFN0cmluZyBibG9ja1ZhbHVlc1tdID0geyBFTVBUWSwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCAvLyROT04tTkxTLTEkCi0gICAgICBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCAiIyIgKyBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHIH07IC8vJE5PTi1OTFMtMSQKLQotICBwcml2YXRlIFN0cmluZyBib29sZWFuVmFsdWVzW10gPSB7IEVNUFRZLCBUUlVFLCBGQUxTRSB9OyAvLyBUT0RPIHVzZSBzb21lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRlcm5hbCBzdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgaW5zdGVhZAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEFic3RyYWN0TGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLSAgICBDTGFiZWwgYWJzdHJhY3RMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfQUJTVFJBQ1QpOwotICAgIGFic3RyYWN0TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEFic3RyYWN0Q29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGFic3RyYWN0Q29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgYWJzdHJhY3RDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGFic3RyYWN0Q29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgYWJzdHJhY3RDb21iby5zZXRJdGVtcyhib29sZWFuVmFsdWVzKTsKLSAgICBhYnN0cmFjdENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQmxvY2tMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBibG9ja0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9CTE9DSyk7Ci0gICAgYmxvY2tMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQmxvY2tDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgYmxvY2tDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICBibG9ja0NvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYmxvY2tDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLSAgICBibG9ja0NvbWJvLnNldEl0ZW1zKGJsb2NrVmFsdWVzKTsKLSAgICBibG9ja0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRmluYWxMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBmaW5hbExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9GSU5BTCk7Ci0gICAgZmluYWxMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRmluYWxDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZmluYWxDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICBmaW5hbENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZmluYWxDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLSAgICBmaW5hbENvbWJvLnNldEl0ZW1zKGZpbmFsVmFsdWVzKTsKLSAgICBmaW5hbENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE1peGVkIExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIG1peGVkTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX01JWEVEKTsKLSAgICBtaXhlZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBNaXhlZCBDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbWl4ZWRDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICBtaXhlZENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbWl4ZWRDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLSAgICBtaXhlZENvbWJvLnNldEl0ZW1zKGJvb2xlYW5WYWx1ZXMpOwotICAgIG1peGVkQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIGlucHV0OwotICAgIGlmIChlLndpZGdldCA9PSBibG9ja0NvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGJsb2NrQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGNvbXBsZXhUeXBlLmdldEVsZW1lbnQoKSwgWFNEQ29uc3RhbnRzLkJMT0NLX0FUVFJJQlVURSwgdmFsdWUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9CTE9DSyk7Ci0gICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBmaW5hbENvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGZpbmFsQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGNvbXBsZXhUeXBlLmdldEVsZW1lbnQoKSwgWFNEQ29uc3RhbnRzLkZJTkFMX0FUVFJJQlVURSwgdmFsdWUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9GSU5BTCk7Ci0gICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBhYnN0cmFjdENvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGFic3RyYWN0Q29tYm8uZ2V0VGV4dCgpOwotICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGNvbXBsZXhUeXBlLmdldEVsZW1lbnQoKSwgWFNEQ29uc3RhbnRzLkFCU1RSQUNUX0FUVFJJQlVURSwgdmFsdWUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNUUkFDVCk7Ci0gICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBtaXhlZENvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IG1peGVkQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGNvbXBsZXhUeXBlLmdldEVsZW1lbnQoKSwgWFNEQ29uc3RhbnRzLk1JWEVEX0FUVFJJQlVURSwgdmFsdWUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9NSVhFRCk7Ci0gICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIGlucHV0OwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsgCi0gICAgICAgIGlmIChjb21wbGV4VHlwZS5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIGVuYWJsZWQgPSAhaXNSZWFkT25seTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5CTE9DS19BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGJsb2NrQXR0VmFsdWUgPSBjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5CTE9DS19BVFRSSUJVVEUpOwotICAgICAgICAgIGJsb2NrQ29tYm8uc2V0VGV4dChibG9ja0F0dFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBibG9ja0NvbWJvLnNldFRleHQoRU1QVFkpOwotICAgICAgICB9Ci0gICAgICAgIGJsb2NrQ29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQotICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuRklOQUxfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAJU3RyaW5nIGZpbmFsQXR0VmFsdWUgPSBjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgZmluYWxDb21iby5zZXRUZXh0KGZpbmFsQXR0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpbmFsQ29tYm8uc2V0VGV4dChFTVBUWSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxDb21iby5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0gICAgICAgIGlmIChjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5BQlNUUkFDVF9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgYm9vbGVhbiBhYnNBdHRWYWx1ZSA9IGNvbXBsZXhUeXBlLmlzQWJzdHJhY3QoKTsKLSAgICAgICAgICBpZiAoYWJzQXR0VmFsdWUpCi0gICAgICAgICAgICBhYnN0cmFjdENvbWJvLnNldFRleHQoVFJVRSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYWJzdHJhY3RDb21iby5zZXRUZXh0KEZBTFNFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBhYnN0cmFjdENvbWJvLnNldFRleHQoRU1QVFkpOwotICAgICAgICB9Ci0gICAgICAgIGFic3RyYWN0Q29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5NSVhFRF9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgYm9vbGVhbiBtaXhlZFZhbHVlID0gY29tcGxleFR5cGUuaXNNaXhlZCgpOwotICAgICAgICAgIGlmIChtaXhlZFZhbHVlKQotICAgICAgICAgICAgbWl4ZWRDb21iby5zZXRUZXh0KFRSVUUpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1peGVkQ29tYm8uc2V0VGV4dChGQUxTRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWl4ZWRDb21iby5zZXRUZXh0KEVNUFRZKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RDb21wbGV4VHlwZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQ29tcGxleFR5cGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOGZlY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RDb21wbGV4VHlwZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MQ2hhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZUNvbXBsZXhUeXBlRGVyaXZhdGlvbkJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTRENvbXBsZXhUeXBlQmFzZVR5cGVFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0REZXJpdmF0aW9uTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBYU0RDb21wbGV4VHlwZVNlY3Rpb24gZXh0ZW5kcyBSZWZhY3RvcmluZ1NlY3Rpb24gaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgVGV4dCBuYW1lVGV4dDsKLSAgcHJvdGVjdGVkIENDb21ibyBiYXNlVHlwZUNvbWJvOwotICBwcm90ZWN0ZWQgQ0NvbWJvIGRlcml2ZWRCeUNvbWJvOwotICBwcml2YXRlIFN0cmluZyBkZXJpdmVkQnlDaG9pY2VzQ29tYm9WYWx1ZXNbXSA9IHsgIiIsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRyB9OyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIFhTRENvbXBsZXhUeXBlU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnRlbnRzIG9mIHRoZSBwcm9wZXJ0eSB0YWIKLSAgICogCi0gICAqIE5hbWVMYWJlbCBOYW1lVGV4dCBEdW1teUxhYmVsIEJhc2VUeXBlTGFiZWwgQmFzZVR5cGVDb21ibyBCYXNlVHlwZUJ1dHRvbgotICAgKiBEZXJpdmVkQnlMYWJlbCBEZXJpdmVkQnlDb21ibwotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBOYW1lTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgQ0xhYmVsIG5hbWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5VSV9MQUJFTF9OQU1FKTsKLSAgICBuYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5hbWVUZXh0Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBuYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lVGV4dCwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQ09NUExFWF9UWVBFX19OQU1FKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFJlZmFjdG9yL3JlbmFtZSBoeXBlcmxpbmsgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgY3JlYXRlUmVuYW1lSHlwZXJsaW5rKGNvbXBvc2l0ZSk7Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQmFzZVR5cGVMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX0lOSEVSSVRfRlJPTSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEJhc2VUeXBlQ29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgYmFzZVR5cGVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICBiYXNlVHlwZUNvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICBiYXNlVHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYmFzZVR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBiYXNlVHlwZUNvbWJvLmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgdGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChiYXNlVHlwZUNvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19DT01QTEVYX1RZUEVfX0lOSEVSSVRfRlJPTSk7Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFNwYWNlciBsYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBEZXJpdmVkQnlMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBkZXJpdmVkQnlMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5VSV9MQUJFTF9JTkhFUklUX0JZKTsgLy8kTk9OLU5MUy0xJAotICAgIGRlcml2ZWRCeUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBEZXJpdmVkQnlDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBkZXJpdmVkQnlDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZGVyaXZlZEJ5Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBkZXJpdmVkQnlDb21iby5zZXRJdGVtcyhkZXJpdmVkQnlDaG9pY2VzQ29tYm9WYWx1ZXMpOwotICAgIGRlcml2ZWRCeUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGVyaXZlZEJ5Q29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0NPTVBMRVhfVFlQRV9fSU5IRVJJVF9CWSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBTcGFjZXIgbGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpCi0gICAgICByZXR1cm47Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIHNob3dMaW5rKCFoaWRlSHlwZXJMaW5rKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIG5hbWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBiYXNlVHlwZUNvbWJvLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBmaWxsVHlwZXNDb21ibygpOwotCi0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIGlucHV0OwotICAgICAgICBTdHJpbmcgbmFtZSA9IGNvbXBsZXhUeXBlLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBib29sZWFuIGlzQW5vbnltb3VzVHlwZSA9IG5hbWUuZXF1YWxzKCIiKSA/IHRydWUgOiBmYWxzZTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoaXNBbm9ueW1vdXNUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZVRleHQuc2V0VGV4dCgiKiphbm9ueW1vdXMqKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgbmFtZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5hbWVUZXh0LnNldFRleHQobmFtZSk7Ci0gICAgICAgICAgbmFtZVRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZURlZmluaXRpb24gPSBjb21wbGV4VHlwZS5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgU3RyaW5nIGJhc2VUeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGJhc2VUeXBlRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYmFzZVR5cGUgPSBiYXNlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpOwotICAgICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJhc2VUeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJhbnlUeXBlIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgYmFzZVR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBiYXNlVHlwZUNvbWJvLnNldFRleHQoYmFzZVR5cGUpOwotCi0gICAgICAgIGRlcml2ZWRCeUNvbWJvLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGludCBkZXJpdmF0aW9uTWV0aG9kID0gY29tcGxleFR5cGUuZ2V0RGVyaXZhdGlvbk1ldGhvZCgpLmdldFZhbHVlKCk7Ci0gICAgICAgIFhTRERPTUhlbHBlciBkb21IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICAgIGlmKGRvbUhlbHBlci5nZXREZXJpdmVkQnlFbGVtZW50RnJvbUNvbXBsZXhUeXBlKGNvbXBsZXhUeXBlLmdldEVsZW1lbnQoKSkgIT0gbnVsbCkgewotCSAgICAgICAgaWYgKGRlcml2YXRpb25NZXRob2QgPT0gWFNERGVyaXZhdGlvbk1ldGhvZC5FWFRFTlNJT04pCi0JICAgICAgICB7Ci0JICAgICAgICAgIGRlcml2ZWRCeUNvbWJvLnNldFRleHQoWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRyk7Ci0JICAgICAgICB9Ci0JICAgICAgICBlbHNlIGlmIChkZXJpdmF0aW9uTWV0aG9kID09IFhTRERlcml2YXRpb25NZXRob2QuUkVTVFJJQ1RJT04pCi0JICAgICAgICB7Ci0JICAgICAgICAgIGRlcml2ZWRCeUNvbWJvLnNldFRleHQoWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKTsKLQkgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBiYXNlVHlwZUNvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBiYXNlVHlwZUNvbWJvLmdldFRleHQoKTsKLSAgICAgIGlmIChzaG91bGRQZXJmb3JtQ29tYm9TZWxlY3Rpb24oU1dULkRlZmF1bHRTZWxlY3Rpb24sIHNlbGVjdGlvbikpCi0gICAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGJhc2VUeXBlQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGJhc2VUeXBlQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKHNob3VsZFBlcmZvcm1Db21ib1NlbGVjdGlvbihTV1QuU2VsZWN0aW9uLCBzZWxlY3Rpb24pKQotICAgICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdpZGdldFNlbGVjdGlvbihTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGJhc2VUeXBlQ29tYm8pCi0gICAgewotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICBpZiAoZWRpdG9yID09IG51bGwpIHJldHVybjsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLQotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGJhc2VUeXBlQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZTsKLSAgICAgIElDb21wb25lbnREaWFsb2cgZGlhbG9nPSBudWxsOwotICAgICAgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9DT01CT19CUk9XU0UpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0NPTUJPX05FVykpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlZnJlc2goKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBkZXJpdmVkQnlDb21ibykKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGRlcml2ZWRCeUNvbWJvLmdldFRleHQoKTsKLSAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVDb21wbGV4VHlwZURlcml2YXRpb25CeShjb21wbGV4VHlwZSwgdmFsdWUpOwotCi0gICAgICBpZiAoZ2V0Q29tbWFuZFN0YWNrKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuZG9XaWRnZXRTZWxlY3RlZChlKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICBpZiAoYmFzZVR5cGVDb21ibyAhPSBudWxsICYmICFiYXNlVHlwZUNvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICAgIGJhc2VUeXBlQ29tYm8ucmVtb3ZlTGlzdGVuZXIoU1dULlRyYXZlcnNlLCB0aGlzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuVHJhdmVyc2UpIHsKLSAgICAgIGlmIChldmVudC5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0FSUk9XX05FWFQgfHwgZXZlbnQuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9BUlJPV19QUkVWSU9VUykgewotICAgICAgICBpc1RyYXZlcnNpbmcgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLmRvSGFuZGxlRXZlbnQoZXZlbnQpOwotICAgIGlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQpCi0gICAgewotICAgICAgaWYgKCFuYW1lVGV4dC5nZXRFZGl0YWJsZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpIGlucHV0OwotCi0gICAgICAgIGlmICghdmFsaWRhdGVTZWN0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIGFuIGFjdHVhbCBuYW1lIGNoYW5nZSBoYXMgdGFrZW4gcGxhY2UKLSAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lZENvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICAgIGlmICghbmV3VmFsdWUuZXF1YWxzKG9sZE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgY29tbWFuZCA9IG5ldyBVcGRhdGVOYW1lQ29tbWFuZChvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9BQ1RJT05fUkVOQU1FLCBuYW1lZENvbXBvbmVudCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBnZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICAvLyBkb1JlZmVyZW50aWFsSW50ZWdyaXR5Q2hlY2sobmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVNlY3Rpb24oKQotICB7Ci0gICAgaWYgKG5hbWVUZXh0ID09IG51bGwgfHwgbmFtZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0KLSAgICAvLyB2YWxpZGF0ZSBhZ2FpbnN0IE5DTmFtZQotICAgIGlmIChuYW1lLmxlbmd0aCgpIDwgMSB8fCAhWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKG5hbWUpKQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZShvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9FUlJPUl9JTlZBTElEX05BTUUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgIAlYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIGhpZGVIeXBlckxpbmsgPSAhKGNvbXBsZXhUeXBlLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hKTsKLSAgICAgIAotICAgIH0gICAgCi0gICAgCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgZmlsbFR5cGVzQ29tYm8oKQotICB7Ci0gICAgYmFzZVR5cGVDb21iby5yZW1vdmVBbGwoKTsKLSAgICBiYXNlVHlwZUNvbWJvLmFkZChNZXNzYWdlcy5fVUlfQ09NQk9fQlJPV1NFKTsKLSAgICBiYXNlVHlwZUNvbWJvLmFkZChNZXNzYWdlcy5fVUlfQ09NQk9fTkVXKTsKLSAgICAvLyBBZGQgdGhlIGN1cnJlbnQgVHlwZSBvZiB0aGlzIGF0dHJpYnV0ZSBpZiBuZWVkZWQKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZSA9IGNvbXBsZXhUeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgYmFzZVR5cGUuZ2V0UU5hbWUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBjdXJyZW50VHlwZU5hbWUgPSBiYXNlVHlwZS5nZXRRTmFtZSh4c2RTY2hlbWEpOyAvL25vIHByZWZpeAotICAgICAgaWYgKGN1cnJlbnRUeXBlTmFtZSAhPSBudWxsICYmICFjdXJyZW50VHlwZU5hbWUuZXF1YWxzKCJhbnlUeXBlIikpCi0gICAgICAgIGJhc2VUeXBlQ29tYm8uYWRkKGN1cnJlbnRUeXBlTmFtZSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREVsZW1lbnREZWNsYXJhdGlvbkFkdmFuY2VkU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RFbGVtZW50RGVjbGFyYXRpb25BZHZhbmNlZFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjNmFhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREVsZW1lbnREZWNsYXJhdGlvbkFkdmFuY2VkU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gYWRkZWQgbmlsbGFibGUgYWR2YW5jZWQgdGFiIG9wdGlvbiwgYnVnIDIwOTM1NgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTRFN1YnN0aXR1dGlvbkdyb3VwRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNERWxlbWVudERlY2xhcmF0aW9uQWR2YW5jZWRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIENDb21ibyBibG9ja0NvbWJvOwotICBwcm90ZWN0ZWQgQ0NvbWJvIGZpbmFsQ29tYm87Ci0gIHByb3RlY3RlZCBDQ29tYm8gYWJzdHJhY3RDb21ibzsKLSAgcHJvdGVjdGVkIENDb21ibyBzdWJzdEdyb3VwQ29tYm87Ci0gIHByb3RlY3RlZCBDQ29tYm8gbmlsbGFibGVDb21ibzsKLQotICBwcml2YXRlIFN0cmluZyBibG9ja1ZhbHVlc1tdID0geyBFTVBUWSwgIiMiICsgWFNEQ29uc3RhbnRzLkFMTF9FTEVNRU5UX1RBRywgLy8kTk9OLU5MUy0xJAotICAgICAgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLAotICAgICAgInN1YnN0aXR1dGlvbiIgfTsgLy8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgU3RyaW5nIGZpbmFsVmFsdWVzW10gPSB7IEVNUFRZLCAiIyIgKyBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCAvLyROT04tTkxTLTEkCi0gICAgICBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcgfTsgLy8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgU3RyaW5nIGJvb2xlYW5WYWx1ZXNbXSA9IHsgRU1QVFksIFRSVUUsIEZBTFNFIH07IAotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQWJzdHJhY3RMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBhYnN0cmFjdExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX0FCU1RSQUNUKTsKLSAgICBhYnN0cmFjdExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBBYnN0cmFjdENvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBhYnN0cmFjdENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGFic3RyYWN0Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhYnN0cmFjdENvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIGFic3RyYWN0Q29tYm8uc2V0SXRlbXMoYm9vbGVhblZhbHVlcyk7Ci0gICAgYWJzdHJhY3RDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEJsb2NrTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLSAgICBDTGFiZWwgYmxvY2tMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9CTE9DSyk7Ci0gICAgYmxvY2tMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQmxvY2tDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgYmxvY2tDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICBibG9ja0NvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYmxvY2tDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLSAgICBibG9ja0NvbWJvLnNldEl0ZW1zKGJsb2NrVmFsdWVzKTsKLSAgICBibG9ja0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRmluYWxMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBmaW5hbExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX0ZJTkFMKTsKLSAgICBmaW5hbExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBGaW5hbENvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBmaW5hbENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGZpbmFsQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBmaW5hbENvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIGZpbmFsQ29tYm8uc2V0SXRlbXMoZmluYWxWYWx1ZXMpOwotICAgIGZpbmFsQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBTdWJzdGl0dXRpb24gR3JvdXAgTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLSAgICBDTGFiZWwgc3ViR3JvdXBMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9TVUJTVElUVVRJT05fR1JPVVApOwotICAgIHN1Ykdyb3VwTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFN1YnN0aXR1dGlvbiBHcm91cCBDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgc3Vic3RHcm91cENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIHN1YnN0R3JvdXBDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHN1YnN0R3JvdXBDb21iby5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICBzdWJzdEdyb3VwQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgc3Vic3RHcm91cENvbWJvLmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgdGhpcyk7Ci0gICAgYXBwbHlBbGxMaXN0ZW5lcnMoc3Vic3RHcm91cENvbWJvKTsKLSAgICAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBOaWxsYWJsZSBMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBuaWxsYWJsZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX05JTExBQkxFKTsKLSAgICBuaWxsYWJsZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBOaWxsYWJsZUNvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBuaWxsYWJsZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIG5pbGxhYmxlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBuaWxsYWJsZUNvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIG5pbGxhYmxlQ29tYm8uc2V0SXRlbXMoYm9vbGVhblZhbHVlcyk7Ci0gICAgbmlsbGFibGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBzdWJzdEdyb3VwQ29tYm8pCi0gICAgewotICAgICAgaWYgKGUudHlwZSA9PSBTV1QuVHJhdmVyc2UpIHsKLSAgICAgICAgaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9BUlJPV19ORVhUIHx8IGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9BUlJPV19QUkVWSU9VUykKLSAgICAgICAgewotICAgICAgICAgIGlzVHJhdmVyc2luZyA9IHRydWU7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0JCQotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZURlYyA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgU3RyaW5nIHZhbHVlID0gc3Vic3RHcm91cENvbWJvLmdldFRleHQoKTsKLSAgICAgIFN0cmluZyBvbGRWYWx1ZSA9IGVsZURlYy5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUpOwotICAgICAgaWYgKG9sZFZhbHVlID09IG51bGwpCi0gICAgICAgIG9sZFZhbHVlID0gRU1QVFk7Ci0gICAgICBpZiAodmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoZWxlRGVjLmdldEVsZW1lbnQoKSwgWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSwgdmFsdWUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX1NVQlNUSVRVVElPTl9HUk9VUCk7Ci0gICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gc3Vic3RHcm91cENvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBzdWJzdEdyb3VwQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKHNob3VsZFBlcmZvcm1Db21ib1NlbGVjdGlvbihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgc2VsZWN0aW9uKSkKLSAgICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gc3Vic3RHcm91cENvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBzdWJzdEdyb3VwQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKHNob3VsZFBlcmZvcm1Db21ib1NlbGVjdGlvbihTV1QuU2VsZWN0aW9uLCBzZWxlY3Rpb24pKQotICAgICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBibG9ja0NvbWJvKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVEZWMgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGJsb2NrQ29tYm8uZ2V0VGV4dCgpOwotCi0gICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoZWxlRGVjLmdldEVsZW1lbnQoKSwgWFNEQ29uc3RhbnRzLkJMT0NLX0FUVFJJQlVURSwgdmFsdWUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX0JMT0NLKTsKLSAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGZpbmFsQ29tYm8pCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZURlYyA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgU3RyaW5nIHZhbHVlID0gZmluYWxDb21iby5nZXRUZXh0KCk7Ci0KLSAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChlbGVEZWMuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuRklOQUxfQVRUUklCVVRFLCB2YWx1ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfRklOQUwpOwotICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gYWJzdHJhY3RDb21ibykKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlRGVjID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBhYnN0cmFjdENvbWJvLmdldFRleHQoKTsKLSAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChlbGVEZWMuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuQUJTVFJBQ1RfQVRUUklCVVRFLCB2YWx1ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfQUJTVFJBQ1QpOwotICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gc3Vic3RHcm91cENvbWJvKQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgaWYgKGVkaXRvciA9PSBudWxsKSByZXR1cm47Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRFN1YnN0aXR1dGlvbkdyb3VwRWRpdE1hbmFnZXIuY2xhc3MpOwotCi0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gc3Vic3RHcm91cENvbWJvLmdldFRleHQoKTsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWU7Ci0gICAgICBJQ29tcG9uZW50RGlhbG9nIGRpYWxvZz0gbnVsbDsKLSAgICAgIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQ09NQk9fQlJPV1NFKSkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nID0gbWFuYWdlci5nZXRCcm93c2VEaWFsb2coKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9DT01CT19ORVcpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldE5ld0RpYWxvZygpOwotICAgICAgfQotCi0gICAgICBpZiAoZGlhbG9nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChkaWFsb2cuY3JlYXRlQW5kT3BlbigpID09IFdpbmRvdy5PSykKLSAgICAgICAgewotICAgICAgICAgIG5ld1ZhbHVlID0gZGlhbG9nLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgbWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoaW5wdXQsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzdWJzdEdyb3VwQ29tYm8uc2V0VGV4dCgiIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLy91c2UgdGhlIHZhbHVlIGZyb20gc2VsZWN0ZWQgcXVpY2tQaWNrIGl0ZW0KLSAgICAgIHsKLSAgICAgICAgbmV3VmFsdWUgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKHNlbGVjdGlvbiwgbWFuYWdlcik7Ci0gICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKQotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG5pbGxhYmxlQ29tYm8pCi0gICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlRGVjID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG5pbGxhYmxlQ29tYm8uZ2V0VGV4dCgpOwotCi0gICAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChlbGVEZWMuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuTklMTEFCTEVfQVRUUklCVVRFLCB2YWx1ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfTklMTEFCTEUpOwotICAgICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgZmlsbFN1YnN0aXR1dGlvbkdyb3VwQ29tYm8oKTsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZURlYyA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0OwotCi0gICAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgaWYgKGVsZURlYy5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSkgLy8gZ2xvYmFsIGVsZW1lbnQKLSAgICAgICAgewotICAgICAgICAgIGFic3RyYWN0Q29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICBmaW5hbENvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgc3Vic3RHcm91cENvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgbmlsbGFibGVDb21iby5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGFic3RyYWN0Q29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgZmluYWxDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICBzdWJzdEdyb3VwQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gTmlsbGFibGUgd2hlbiB1c2VkIGluIGEgbG9jYWwgZWxlbWVudCBkZWNsYXJhdGlvbiBjYW4ndCBiZSBzZXQgb24KLSAgICAgICAgICAvLyBvbiBlbGVtZW50cyB0aGF0IHVzZSBAcmVmLgotICAgICAgIAkgIG5pbGxhYmxlQ29tYm8uc2V0RW5hYmxlZCghZWxlRGVjLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZWxlRGVjLmdldEVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuQkxPQ0tfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBibG9ja0F0dFZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJMT0NLX0FUVFJJQlVURSk7Ci0gICAgICAgICAgYmxvY2tDb21iby5zZXRUZXh0KGJsb2NrQXR0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJsb2NrQ29tYm8uc2V0VGV4dChFTVBUWSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gV2Ugc2hvdWxkIHNob3cgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBpZiBpdCBpcyBpbnZhbGlkCi0gICAgICAgIC8vIGllLiBhcyB0aGUgdXNlciBzdGFydHMgdHlwaW5nICd0cnVlJyBpbiB0aGUgc291cmNlLCB0aGUgcHJvcGVydGllcyB2aWV3Ci0gICAgICAgIC8vIHNob3VsZCBzaG93IHRoZSB2YWx1ZSBkeW5hbWljYWxseQotICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5JTExBQkxFX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5JTExBQkxFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgbmlsbGFibGVDb21iby5zZXRUZXh0KGF0dHJWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmlsbGFibGVDb21iby5zZXRUZXh0KEVNUFRZKTsKLSAgICAgICAgfQotICAKLSAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgIAlTdHJpbmcgZmluYWxBdHRWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgZmluYWxDb21iby5zZXRUZXh0KGZpbmFsQXR0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpbmFsQ29tYm8uc2V0VGV4dChFTVBUWSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkFCU1RSQUNUX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICBhYnN0cmFjdENvbWJvLnNldFRleHQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkFCU1RSQUNUX0FUVFJJQlVURSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBhYnN0cmFjdENvbWJvLnNldFRleHQoRU1QVFkpOwotCi0gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuU1VCU1RJVFVUSU9OR1JPVVBfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIHN1YnN0R3JvdXBDb21iby5zZXRUZXh0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzdWJzdEdyb3VwQ29tYm8uc2V0VGV4dChFTVBUWSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgZmlsbFN1YnN0aXR1dGlvbkdyb3VwQ29tYm8oKQotICB7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RTdWJzdGl0dXRpb25Hcm91cEVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotCi0gICAgICBzdWJzdEdyb3VwQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICBzdWJzdEdyb3VwQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9DT01CT19CUk9XU0UpOwotICAgICAgc3Vic3RHcm91cENvbWJvLmFkZChNZXNzYWdlcy5fVUlfQ09NQk9fTkVXKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHN1YnN0R3JvdXBDb21iby5hZGQoaXRlbXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBzdWJzdGl0dXRpb24gZ3JvdXAgaWYgbmVlZGVkCi0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gbmFtZWRDb21wb25lbnQgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQpLmdldFN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24oKTsKLSAgICAgIGlmIChuYW1lZENvbXBvbmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJldCA9IGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUobmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpLCBtYW5hZ2VyKTsKLSAgICAgICAgaWYgKHJldCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc3Vic3RHcm91cENvbWJvLmFkZChuYW1lZENvbXBvbmVudC5nZXRRTmFtZSh4c2RTY2hlbWEpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoU3RyaW5nIHZhbHVlLCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBlZGl0TWFuYWdlcikKLSAgewotICAgIGlmIChlZGl0TWFuYWdlciAhPSBudWxsKQotICAgIHsgIAotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHF1aWNrUGlja3MgPSBlZGl0TWFuYWdlci5nZXRRdWlja1BpY2tzKCk7Ci0gICAgICBpZiAocXVpY2tQaWNrcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBxdWlja1BpY2tzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLSAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgCWlmIChzdWJzdEdyb3VwQ29tYm8gIT0gbnVsbCAmJiAhc3Vic3RHcm91cENvbWJvLmlzRGlzcG9zZWQoKSkKLSAgCXsKLQkJc3Vic3RHcm91cENvbWJvLnJlbW92ZUxpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgdGhpcyk7Ci0JfQotCXN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREVsZW1lbnREZWNsYXJhdGlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERWxlbWVudERlY2xhcmF0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTIyM2YwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERWxlbWVudERlY2xhcmF0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy5OZXdUeXBlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaC5YU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFbGVtZW50RGVjbGFyYXRpb25TZWN0aW9uIGV4dGVuZHMgTXVsdGlwbGljaXR5U2VjdGlvbgotewotICBwcm90ZWN0ZWQgVGV4dCBuYW1lVGV4dDsKLSAgcHJvdGVjdGVkIENDb21ibyB0eXBlQ29tYm87Ci0gIHByb3RlY3RlZCBDQ29tYm8gY29tcG9uZW50TmFtZUNvbWJvOwotICBib29sZWFuIGlzRWxlbWVudFJlZmVyZW5jZTsKLSAgcHJvdGVjdGVkIFN0cmluZyB0eXBlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbjsKLQotICBwdWJsaWMgWFNERWxlbWVudERlY2xhcmF0aW9uU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnRlbnRzIG9mIHRoZSBwcm9wZXJ0eSB0YWIKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLSAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCi0gICAgU3RyaW5nIHR5cGVMYWJlbCA9IE1lc3NhZ2VzLlVJX0xBQkVMX1RZUEU7IC8vJE5PTi1OTFMtMSQKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIE5hbWVMYWJlbAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICBDTGFiZWwgbmFtZUxhYmVsID0gZmFjdG9yeS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FKTsKLSAgICAgIG5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIE5hbWVUZXh0Ci0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgbmFtZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIG5hbWVUZXh0LnNldEVuYWJsZWQoIWlzRWxlbWVudFJlZmVyZW5jZSk7Ci0gICAgICBhcHBseUFsbExpc3RlbmVycyhuYW1lVGV4dCk7ICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5hbWVUZXh0LAotICAgICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fRUxFTUVOVF9fTkFNRSk7Ci0gICAgIAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBSZWZhY3Rvci9yZW5hbWUgaHlwZXJsaW5rIAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBpZiAoIWhpZGVIeXBlckxpbmspCi0gICAgICB7Ci0gICAgICAgIGNyZWF0ZVJlbmFtZUh5cGVybGluayhjb21wb3NpdGUpOwotICAgICAgICBzZXRSZW5hbWVIeXBlcmxpbmtFbmFibGVkKCFpc0VsZW1lbnRSZWZlcmVuY2UpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOwotICAgICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUmVmIExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgaWYgKGlzRWxlbWVudFJlZmVyZW5jZSkKLSAgICB7Ci0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgICAgQ0xhYmVsIHJlZkxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX1JFRkVSRU5DRSk7Ci0gICAgICByZWZMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIFJlZiBDb21ibwotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgICBjb21wb25lbnROYW1lQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgdGhpcyk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIAotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb25lbnROYW1lQ29tYm8sCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fRUxFTUVOVF9fUkVGRVJFTkNFKTsKLQotICAgICAgLy8gZHVtbXkKLSAgICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyB0eXBlTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgdHlwZUxhYmVsKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHR5cGVDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICB0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7IC8vJE5PTi1OTFMtMSQKLSAgICB0eXBlQ29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotICAgIHR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICB0eXBlQ29tYm8uYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCB0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHR5cGVDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fRUxFTUVOVF9fVFlQRSk7Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRHVtbXlMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBtaW4gcHJvcGVydHkKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5VSV9MQUJFTF9NSU5PQ0NVUlMpOwotCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIG1pbkNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICBtaW5Db21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG1pbkNvbWJvLmFkZCgiMCIpOyAvLyROT04tTkxTLTEkCi0gICAgbWluQ29tYm8uYWRkKCIxIik7IC8vJE5PTi1OTFMtMSQKLSAgICBhcHBseUFsbExpc3RlbmVycyhtaW5Db21ibyk7Ci0gICAgbWluQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtaW5Db21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fRUxFTUVOVF9fTUlOX09DQ1VSRU5DRSk7ICAgIAotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRHVtbXlMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBtYXggcHJvcGVydHkKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuVUlfTEFCRUxfTUFYT0NDVVJTKTsKLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBtYXhDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgbWF4Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBtYXhDb21iby5hZGQoIjAiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1heENvbWJvLmFkZCgiMSIpOyAvLyROT04tTkxTLTEkCi0gICAgbWF4Q29tYm8uYWRkKCJ1bmJvdW5kZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgIGFwcGx5QWxsTGlzdGVuZXJzKG1heENvbWJvKTsKLSAgICBtYXhDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1heENvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19FTEVNRU5UX19NQVhfT0NDVVJFTkNFKTsgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICBpbml0KCk7Ci0gICAgcmVsYXlvdXQoKTsKLSAgICAKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICB7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgIGlzRWxlbWVudFJlZmVyZW5jZSA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpOwotCi0gICAgICBoaWRlSHlwZXJMaW5rID0gIXhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0dsb2JhbCgpIHx8IGlzRWxlbWVudFJlZmVyZW5jZTsKLSAgICAgIHR5cGVEZWZpbml0aW9uID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBmaWxsVHlwZXNDb21ibygpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7Ci0gICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gaXRlbXMgPSBtYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLQotICAgICAgdHlwZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgdHlwZUNvbWJvLmFkZChNZXNzYWdlcy5fVUlfQ09NQk9fQlJPV1NFKTsKLSAgICAgIHR5cGVDb21iby5hZGQoTWVzc2FnZXMuX1VJX0NPTUJPX05FVyk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICB0eXBlQ29tYm8uYWRkKGl0ZW1zW2ldLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgICAvLyBBZGQgdGhlIGN1cnJlbnQgVHlwZSBvZiB0aGlzIGVsZW1lbnQgaWYgbmVlZGVkCi0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gbmFtZWRDb21wb25lbnQgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IG5hbWVkQ29tcG9uZW50LmdldFR5cGUoKTsKLSAgICAgIGlmICh0ZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgY3VycmVudFR5cGVOYW1lID0gdGQuZ2V0UU5hbWUoeHNkU2NoZW1hKTsKLSAgICAgICAgaWYgKGN1cnJlbnRUeXBlTmFtZSA9PSBudWxsKSAvLyBhbm9ueW1vdXMgdHlwZQotICAgICAgICAgIGN1cnJlbnRUeXBlTmFtZSA9ICIqKkFub255bW91cyoqIjsKLSAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXQgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKGN1cnJlbnRUeXBlTmFtZSwgbWFuYWdlcik7Ci0gICAgICAgIGlmIChyZXQgPT0gbnVsbCAmJiBjdXJyZW50VHlwZU5hbWUgIT0gbnVsbCkgLy8gbm90IGluIHF1aWNrUGljawotICAgICAgICB7Ci0gICAgICAgICAgdHlwZUNvbWJvLmFkZChjdXJyZW50VHlwZU5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShTdHJpbmcgdmFsdWUsIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyKQotICB7Ci0gICAgaWYgKGVkaXRNYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IGVkaXRNYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLSAgICAgIGlmIChxdWlja1BpY2tzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHF1aWNrUGlja3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBxdWlja1BpY2tzW2ldOwotICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFNwZWNpZmljYXRpb247Ci0gICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0KLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0KLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0KS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotCi0gICAgLy8gcmVmcmVzaCBuYW1lCi0gICAgbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB0eXBlQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgbmFtZSA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotICAgIH0KLSAgICAKLSAgICBpZiAoaXNFbGVtZW50UmVmZXJlbmNlKQotICAgIHsKLSAgICAgIHJlZnJlc2hSZWZDb21ibygpOwotICAgIH0KLQotICAgIC8vIHJlZnJlc2ggdHlwZQotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiBpc0Fub255bW91cyA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpICE9IG51bGw7Ci0gICAgICAgIC8vWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IFhTRFV0aWxzLmdldFJlc29sdmVkVHlwZSh4c2RFbGVtZW50RGVjbGFyYXRpb24pOwotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgIAotICAgICAgICBpZiAodHlwZURlZiAhPSBudWxsKQotICAgICAgICAgIHR5cGVOYW1lID0gdHlwZURlZi5nZXRRTmFtZSh4c2RTY2hlbWEpOwotCi0gICAgICAgIGlmICh0eXBlTmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdHlwZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgZmlsbFR5cGVzQ29tYm8oKTsKLSAgICAgICAgaWYgKGlzQW5vbnltb3VzKQotICAgICAgICB7Ci0gICAgICAgIAl0eXBlQ29tYm8uc2V0VGV4dCgiKipBbm9ueW1vdXMqKiIpOwotICAgICAgICAgIHR5cGVOYW1lID0gIioqQW5vbnltb3VzKioiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVDb21iby5zZXRUZXh0KHR5cGVOYW1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVDb21iby5zZXRUZXh0KE1lc3NhZ2VzLlVJX05PX1RZUEUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbWF4Q29tYm8uc2V0RW5hYmxlZCgheHNkRWxlbWVudERlY2xhcmF0aW9uLmlzR2xvYmFsKCkgfHwgaXNFbGVtZW50UmVmZXJlbmNlKTsKLSAgICAgICAgbWluQ29tYm8uc2V0RW5hYmxlZCgheHNkRWxlbWVudERlY2xhcmF0aW9uLmlzR2xvYmFsKCkgfHwgaXNFbGVtZW50UmVmZXJlbmNlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyByZWZyZXNoIG1pbiBtYXgKLSAgICByZWZyZXNoTWluTWF4KCk7Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IHR5cGVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoc2hvdWxkUGVyZm9ybUNvbWJvU2VsZWN0aW9uKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBzZWxlY3Rpb24pKQotICAgICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfSBlbHNlIGlmIChlLndpZGdldCA9PSBjb21wb25lbnROYW1lQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoc2hvdWxkUGVyZm9ybUNvbWJvU2VsZWN0aW9uKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBzZWxlY3Rpb24pKQotICAgICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IHR5cGVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoc2hvdWxkUGVyZm9ybUNvbWJvU2VsZWN0aW9uKFNXVC5TZWxlY3Rpb24sIHNlbGVjdGlvbikpCi0gICAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9IGVsc2UgaWYgKGUud2lkZ2V0ID09IGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gY29tcG9uZW50TmFtZUNvbWJvLmdldFRleHQoKTsKLSAgICAgIGlmIChzaG91bGRQZXJmb3JtQ29tYm9TZWxlY3Rpb24oU1dULlNlbGVjdGlvbiwgc2VsZWN0aW9uKSkKLSAgICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgaWYgKGVkaXRvciA9PSBudWxsKSByZXR1cm47Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7Ci0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gdHlwZUNvbWJvLmdldFRleHQoKTsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWU7Ci0gICAgICBJQ29tcG9uZW50RGlhbG9nIGRpYWxvZz0gbnVsbDsKLSAgICAgIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQ09NQk9fQlJPV1NFKSkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nID0gbWFuYWdlci5nZXRCcm93c2VEaWFsb2coKTsKLSAgICAgICAgKChYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUpIGRpYWxvZykuc2hvd0NvbXBsZXhUeXBlcyh0cnVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9DT01CT19ORVcpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldE5ld0RpYWxvZygpOwotICAgICAgICAoKE5ld1R5cGVEaWFsb2cpIGRpYWxvZykuYWxsb3dDb21wbGV4VHlwZSh0cnVlKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRpYWxvZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdWYWx1ZSA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICAgICAgbWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoZWxlbWVudERlY2xhcmF0aW9uLCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdHlwZUNvbWJvLnNldFRleHQodHlwZU5hbWUgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSAvL3VzZSB0aGUgdmFsdWUgZnJvbSBzZWxlY3RlZCBxdWlja1BpY2sgaXRlbQotICAgICAgewotICAgICAgICBuZXdWYWx1ZSA9IGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoc2VsZWN0aW9uLCBtYW5hZ2VyKTsKLSAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpCi0gICAgICAgICAgbWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoaW5wdXQsIG5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gY29tcG9uZW50TmFtZUNvbWJvKQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgaWYgKGVkaXRvciA9PSBudWxsKSByZXR1cm47Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7Ci0KLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBjb21wb25lbnROYW1lQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZTsKLSAgICAgIElDb21wb25lbnREaWFsb2cgZGlhbG9nPSBudWxsOwotICAgICAgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9DT01CT19CUk9XU0UpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0NPTUJPX05FVykpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KCIiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSAvL3VzZSB0aGUgdmFsdWUgZnJvbSBzZWxlY3RlZCBxdWlja1BpY2sgaXRlbQotICAgICAgewotICAgICAgICBuZXdWYWx1ZSA9IGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoc2VsZWN0aW9uLCBtYW5hZ2VyKTsKLSAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpCi0gICAgICAgICAgbWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoaW5wdXQsIG5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gbWF4Q29tYm8pCi0gICAgewotICAgICAgdXBkYXRlTWF4QXR0cmlidXRlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG1pbkNvbWJvKQotICAgIHsKLSAgICAgIHVwZGF0ZU1pbkF0dHJpYnV0ZSgpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbGF5b3V0KCkKLSAgewotICAgIENvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGUgPSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0KLSAgICBpZiAocGFyZW50Q29tcG9zaXRlICE9IG51bGwgJiYgIXBhcmVudENvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50Q29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBjaGlsZHJlbltpXS5kaXNwb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm93IGluaXRpYWxpemUgdGhlIG5ldyBoYW5kbGVyCi0gICAgY3JlYXRlQ29udGVudHMocGFyZW50Q29tcG9zaXRlKTsKLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUsIHRydWUpOwotCi0gICAgLy8gTm93IHR1cm4gcGFpbnRpbmcgYmFjayBvbgotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgcmVmcmVzaCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGlmIChldmVudC50eXBlID09IFNXVC5UcmF2ZXJzZSkgewotICAgICAgaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVCB8fCBldmVudC5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTKSB7Ci0gICAgICAgIGlzVHJhdmVyc2luZyA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gbmFtZWRDb21wb25lbnQgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICAgIGlmICghdmFsaWRhdGVTZWN0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIGFuIGFjdHVhbCBuYW1lIGNoYW5nZSBoYXMgdGFrZW4gcGxhY2UKLSAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lZENvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICAgIGlmICghbmV3VmFsdWUuZXF1YWxzKG9sZE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgY29tbWFuZCA9IG5ldyBVcGRhdGVOYW1lQ29tbWFuZChvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9BQ1RJT05fUkVOQU1FLCBuYW1lZENvbXBvbmVudCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBnZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRvUmVmZXJlbnRpYWxJbnRlZ3JpdHlDaGVjayhuYW1lZENvbXBvbmVudCwgbmV3VmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU2VjdGlvbigpCi0gIHsKLSAgICBpZiAobmFtZVRleHQgPT0gbnVsbCB8fCBuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLQotICAgIFN0cmluZyBuYW1lID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQotICAgIC8vIHZhbGlkYXRlIGFnYWluc3QgTkNOYW1lCi0gICAgaWYgKG5hbWUubGVuZ3RoKCkgPCAxIHx8ICFYTUxDaGFyLmlzVmFsaWROQ05hbWUobmFtZSkpCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0VSUk9SX0lOVkFMSURfTkFNRSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChjb21wb25lbnROYW1lQ29tYm8gIT0gbnVsbCAmJiAhY29tcG9uZW50TmFtZUNvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8ucmVtb3ZlTGlzdGVuZXIoU1dULlRyYXZlcnNlLCB0aGlzKTsKLSAgICB9Ci0gICAgaWYgKG1pbkNvbWJvICE9IG51bGwgJiYgIW1pbkNvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICAgIG1pbkNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGlmIChtYXhDb21ibyAhPSBudWxsICYmICFtYXhDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtYXhDb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBpZiAodHlwZUNvbWJvICE9IG51bGwgJiYgIXR5cGVDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgdHlwZUNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgdHlwZUNvbWJvLnJlbW92ZUxpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgdGhpcyk7Ci0gICAgfQotICAgIGlmIChuYW1lVGV4dCAhPSBudWxsICYmICFuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnMobmFtZVRleHQpOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hSZWZDb21ibygpCi0gIHsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBmaWxsRWxlbWVudHNDb21ibygpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgZmlsbEVsZW1lbnRzQ29tYm8oKQotICB7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOyAgICAKLSAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoTWVzc2FnZXMuX1VJX0NPTUJPX0JST1dTRSk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9DT01CT19ORVcpOwotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHF1aWNrUGlja3MgPSBtYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLSAgICAgIGlmIChxdWlja1BpY2tzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcXVpY2tQaWNrcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IHF1aWNrUGlja3NbaV07Ci0gICAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZChjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBoaXN0b3J5ID0gbWFuYWdlci5nZXRIaXN0b3J5KCk7Ci0gICAgICBpZiAoaGlzdG9yeSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhpc3RvcnkubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBoaXN0b3J5W2ldOwotICAgICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBuYW1lZENvbXBvbmVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0OwotICAgIEVsZW1lbnQgZWxlbWVudCA9IG5hbWVkQ29tcG9uZW50LmdldEVsZW1lbnQoKTsKLSAgICAKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSk7Ci0gICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJldCA9IGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoYXR0clZhbHVlLCBtYW5hZ2VyKTsKLSAgICAgIGlmIChyZXQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZChhdHRyVmFsdWUpOwotICAgICAgfQotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldFRleHQoYXR0clZhbHVlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERW51bWVyYXRpb25GYWNldFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERW51bWVyYXRpb25GYWNldFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxYjAwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREVudW1lcmF0aW9uRmFjZXRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5TZXRYU0RGYWNldFZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERW51bWVyYXRpb25GYWNldDsKLQotcHVibGljIGNsYXNzIFhTREVudW1lcmF0aW9uRmFjZXRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIENDb21ibyBmaW5hbENvbWJvOwotICBUZXh0IHZhbHVlVGV4dDsKLSAgCi0gIHB1YmxpYyBYU0RFbnVtZXJhdGlvbkZhY2V0U2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0gICAgY29tcG9zaXRlID0gZmFjdG9yeS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFZhbHVlTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIHZhbHVlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX1ZBTFVFKTsKLSAgICB2YWx1ZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBWYWx1ZVRleHQKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHZhbHVlVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgdmFsdWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYXBwbHlBbGxMaXN0ZW5lcnModmFsdWVUZXh0KTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHZhbHVlVGV4dCwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fU0lNUExFX1RZUEVfX05BTUUpOyAgICAKLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCi0gICAgdmFsdWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICB7Ci0gICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IHhzZEVudW1lcmF0aW9uID0gKFhTREVudW1lcmF0aW9uRmFjZXQpaW5wdXQ7Ci0gICAgICAKLSAgICAgIGlmKHhzZEVudW1lcmF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZhbHVlVGV4dC5zZXRUZXh0KHhzZEVudW1lcmF0aW9uLmdldExleGljYWxWYWx1ZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSAKLSAgewotICAgIGlmIChldmVudC53aWRnZXQgPT0gdmFsdWVUZXh0KQotICAgIHsKLSAgICAgIGlmICghdmFsdWVUZXh0LmdldEVkaXRhYmxlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgU3RyaW5nIHZhbHVlID0gdmFsdWVUZXh0LmdldFRleHQoKTsKLSAgICAgIAotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgIHsKLSAgICAJWFNERW51bWVyYXRpb25GYWNldCB4c2RFbnVtZXJhdGlvbiA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KWlucHV0OwotICAgIAkgIAotICAgIAlDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIAljb21tYW5kID0gbmV3IFNldFhTREZhY2V0VmFsdWVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0hBTkdFX0VOVU1FUkFUSU9OX1ZBTFVFLAotICAgICAgICAgIHhzZEVudW1lcmF0aW9uLCB2YWx1ZSk7Ci0KLSAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBnZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgICB2YWx1ZVRleHQuc2V0VGV4dCh2YWx1ZSk7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREZhY2V0U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RGYWNldFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBkMGRmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREZhY2V0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkNoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1heEV4Y2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4SW5jbHVzaXZlRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1heExlbmd0aEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5FeGNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1pbkluY2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5MZW5ndGhGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFZhcmlldHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdoaXRlU3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdoaXRlU3BhY2VGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBYU0RGYWNldFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgcHJpdmF0ZSBTdHJpbmcgbWluTGVuZ3RoU3RyaW5nLCBtYXhMZW5ndGhTdHJpbmcsIHRpdGxlU3RyaW5nOwotICBGb250IHRpdGxlRm9udDsKLSAgQ0xhYmVsIHRpdGxlOwotICBMYWJlbCBtaW5MZW5ndGhMYWJlbDsKLSAgVGV4dCBtaW5MZW5ndGhUZXh0OwotICBMYWJlbCBtYXhMZW5ndGhMYWJlbDsKLSAgVGV4dCBtYXhMZW5ndGhUZXh0OwotICBHcm91cCBzaW1wbGVUeXBlTW9kaWZpZXJHcm91cDsKLSAgU3RyaW5nIHNpbXBsZVR5cGVNb2RpZmllckdyb3VwVGl0bGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICBCdXR0b24gY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uOwotICBCdXR0b24gdXNlRW51bWVyYXRpb25zQnV0dG9uLCB1c2VQYXR0ZXJuc0J1dHRvbjsKLSAgQnV0dG9uIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveDsKLSAgQnV0dG9uIG1heGltdW1JbmNsdXNpdmVDaGVja2JveDsKLSAgYm9vbGVhbiBpc051bWVyaWNCYXNlVHlwZTsKLSAgYm9vbGVhbiBpc1NpbXBsZVR5cGVSZXN0cmljdGlvbjsKLSAgcHJpdmF0ZSBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBjdXJyZW50UHJpbWl0aXZlVHlwZSwgcHJldmlvdXNQcmltaXRpdmVUeXBlOwotICBwcml2YXRlIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb247Ci0gIHByaXZhdGUgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlRGVjbGFyYXRpb247Ci0gIHByaXZhdGUgWFNERmVhdHVyZSB4c2RGZWF0dXJlOwotICBib29sZWFuIGhhc01heE1pbkZhY2V0czsKLQotICBTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0IGNvbnN0cmFpbnRzV2lkZ2V0OwotCi0gIHByaXZhdGUgaW50IGNvbnN0cmFpbnRLaW5kID0gU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldC5FTlVNRVJBVElPTjsKLSAgCi0gIHB1YmxpYyBYU0RGYWNldFNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotICAgIGNvbXBvc2l0ZSA9IGZhY3RvcnkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICB0aXRsZSA9IGZhY3RvcnkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgRm9udERhdGEgZm9udERhdGEgPSBjb21wb3NpdGUuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0gICAgdGl0bGUuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXRCb2xkKGZvbnREYXRhLmdldE5hbWUoKSkpOwotICAgIHRpdGxlLnNldFRleHQodGl0bGVTdHJpbmcgKyAoaXNSZWFkT25seSA/ICIgLSAiICsgTWVzc2FnZXMuX1VJX0xBQkVMX1JFQURPTkxZIDogIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICBDb21wb3NpdGUgZmFjZXRDb21wb3NpdGUgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgZmFjZXRDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBmYWNldENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBzaW1wbGVUeXBlTW9kaWZpZXJHcm91cCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVHcm91cChmYWNldENvbXBvc2l0ZSwgc2ltcGxlVHlwZU1vZGlmaWVyR3JvdXBUaXRsZSk7Ci0gICAgR3JpZExheW91dCBncm91cEdyaWQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyb3VwR3JpZC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyb3VwR3JpZC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyb3VwR3JpZC5udW1Db2x1bW5zID0gMTsKLSAgICBzaW1wbGVUeXBlTW9kaWZpZXJHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHNpbXBsZVR5cGVNb2RpZmllckdyb3VwLnNldExheW91dChncm91cEdyaWQpOwotCi0gICAgQ29tcG9zaXRlIHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShzaW1wbGVUeXBlTW9kaWZpZXJHcm91cCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkLm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZC5udW1Db2x1bW5zID0gMzsKLSAgICBzaW1wbGVUeXBlTW9kaWZpZXJDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWQpOwotICAgIHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGlmIChoYXNNYXhNaW5GYWNldHMpCi0gICAgewotICAgICAgYm9vbGVhbiBpc0xpbnV4ID0gamF2YS5pby5GaWxlLnNlcGFyYXRvci5lcXVhbHMoIi8iKTsKLSAgICAgIG1pbkxlbmd0aExhYmVsID0gZmFjdG9yeS5jcmVhdGVMYWJlbChzaW1wbGVUeXBlTW9kaWZpZXJDb21wb3NpdGUsIG1pbkxlbmd0aFN0cmluZyk7Ci0gICAgICBtaW5MZW5ndGhUZXh0ID0gZmFjdG9yeS5jcmVhdGVUZXh0KHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoaXNMaW51eCkKLSAgICAgIHsKLSAgICAgIAltaW5MZW5ndGhUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAgIAltaW5MZW5ndGhUZXh0LmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgICAJbWluTGVuZ3RoVGV4dC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgYXBwbHlBbGxMaXN0ZW5lcnMobWluTGVuZ3RoVGV4dCk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWluTGVuZ3RoVGV4dCwKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkNPTlNUUkFJTlRTX1RBQl9fTUlOSU1VTV9MRU5HVEgpOwotCi0gICAgICBHcmlkRGF0YSBtaW5HcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgbWluR3JpZERhdGEud2lkdGhIaW50ID0gMTAwOwotICAgICAgbWluTGVuZ3RoVGV4dC5zZXRMYXlvdXREYXRhKG1pbkdyaWREYXRhKTsKLSAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveCA9IGZhY3RvcnkuY3JlYXRlQnV0dG9uKHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0lOQ0xVU0lWRSwgU1dULkNIRUNLKTsKLSAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgICAgbWF4TGVuZ3RoTGFiZWwgPSBmYWN0b3J5LmNyZWF0ZUxhYmVsKHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZSwgbWF4TGVuZ3RoU3RyaW5nKTsKLSAgICAgIG1heExlbmd0aFRleHQgPSBmYWN0b3J5LmNyZWF0ZVRleHQoc2ltcGxlVHlwZU1vZGlmaWVyQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChpc0xpbnV4KQotICAgICAgewotICAgIAkgIG1heExlbmd0aFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgY3VzdG9tTGlzdGVuZXIpOwotICAgIAkgIG1heExlbmd0aFRleHQuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAJICBtYXhMZW5ndGhUZXh0LmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgY3VzdG9tTGlzdGVuZXIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBhcHBseUFsbExpc3RlbmVycyhtYXhMZW5ndGhUZXh0KTsKLSAgICAgIAotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtYXhMZW5ndGhUZXh0LAotICAgICAgICAJCVhTREVkaXRvckNTSGVscElkcy5DT05TVFJBSU5UU19UQUJfX01BWElNVU1fTEVOR1RIKTsKLQotICAgICAgR3JpZERhdGEgbWF4R3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIG1heEdyaWREYXRhLndpZHRoSGludCA9IDEwMDsKLSAgICAgIG1heExlbmd0aFRleHQuc2V0TGF5b3V0RGF0YShtYXhHcmlkRGF0YSk7Ci0KLSAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveCA9IGZhY3RvcnkuY3JlYXRlQnV0dG9uKHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0lOQ0xVU0lWRSwgU1dULkNIRUNLKTsKLSAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgICAgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LnNldFZpc2libGUoaXNOdW1lcmljQmFzZVR5cGUpOwotICAgICAgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LnNldFZpc2libGUoaXNOdW1lcmljQmFzZVR5cGUpOwotICAgIH0KLSAgICBjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24gPSBmYWN0b3J5LmNyZWF0ZUJ1dHRvbihzaW1wbGVUeXBlTW9kaWZpZXJDb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9DT0xMQVBTRV9XSElURVNQQUNFLCBTV1QuQ0hFQ0spOwotICAgIGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbiwKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkNPTlNUUkFJTlRTX1RBQl9fQ09MTEFQU0VfV0hJVEVTUEFDRSk7Ci0KLSAgICBHcm91cCBzcGVjaWZpY1ZhbHVlQ29uc3RyYWludHNHcm91cCA9IGZhY3RvcnkuY3JlYXRlR3JvdXAoZmFjZXRDb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9TUEVDSUZJQ19DT05TVFJBSU5UX1ZBTFVFUyk7Ci0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIHNwZWNpZmljVmFsdWVDb25zdHJhaW50c0dyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHNwZWNpZmljVmFsdWVDb25zdHJhaW50c0dyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlRm9yQnV0dG9ucyA9IGZhY3RvcnkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUoc3BlY2lmaWNWYWx1ZUNvbnN0cmFpbnRzR3JvdXApOwotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgY29tcG9zaXRlRm9yQnV0dG9ucy5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0gICAgY29tcG9zaXRlRm9yQnV0dG9ucy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgZmFjdG9yeS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlRm9yQnV0dG9ucywgTWVzc2FnZXMuX1VJX0xBQkVMX1JFU1RSSUNUX1ZBTFVFU19CWSk7Ci0vLyAgICB1c2VEZWZpbmVkVmFsdWVzQnV0dG9uID0gZmFjdG9yeS5jcmVhdGVCdXR0b24oY29tcG9zaXRlRm9yQnV0dG9ucywgIk9ubHkgcGVybWl0IGNlcnRhaW4gdmFsdWVzIiwgU1dULkNIRUNLKTsKLS8vICAgIHVzZURlZmluZWRWYWx1ZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlRm9yUmFkaW9CdXR0b25zID0gZmFjdG9yeS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShjb21wb3NpdGVGb3JCdXR0b25zKTsKLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5MZWZ0ID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBjb21wb3NpdGVGb3JSYWRpb0J1dHRvbnMuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIHVzZUVudW1lcmF0aW9uc0J1dHRvbiA9IGZhY3RvcnkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZUZvclJhZGlvQnV0dG9ucywgTWVzc2FnZXMuX1VJX0xBQkVMX0VOVU1FUkFUSU9OUywgU1dULlJBRElPKTsKLSAgICB1c2VFbnVtZXJhdGlvbnNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1c2VFbnVtZXJhdGlvbnNCdXR0b24sCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5DT05TVFJBSU5UU19UQUJfX0VOVU1FUkFUSU9OUyk7Ci0gICAgdXNlUGF0dGVybnNCdXR0b24gPSBmYWN0b3J5LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGVGb3JSYWRpb0J1dHRvbnMsIE1lc3NhZ2VzLl9VSV9MQUJFTF9QQVRURVJOUywgU1dULlJBRElPKTsKLSAgICB1c2VQYXR0ZXJuc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVzZVBhdHRlcm5zQnV0dG9uLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQ09OU1RSQUlOVFNfVEFCX19QQVRURVJOUyk7ICAgIAotICAgIAotICAgIGNvbnN0cmFpbnRzV2lkZ2V0ID0gbmV3IFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQoc3BlY2lmaWNWYWx1ZUNvbnN0cmFpbnRzR3JvdXAsIGZhY3RvcnksIChpbnB1dCBpbnN0YW5jZW9mIFhTREZlYXR1cmUpID8gKFhTREZlYXR1cmUpaW5wdXQgOiBudWxsLCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiwgdGhpcywgY29uc3RyYWludEtpbmQpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgY29uc3RyYWludHNXaWRnZXQuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb25zdHJhaW50c1dpZGdldC5nZXRDb250cm9sKCksCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5DT05TVFJBSU5UU19UQUJfX05PX0xBQkVMKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZG9TZXRJbnB1dCgpCi0gIHsKLSAgICBzZXRJbnB1dChnZXRQYXJ0KCksIGdldFNlbGVjdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgICBpbml0KCk7Ci0gICAgCi0gICAgWFNEU2NoZW1hIHNjaGVtYU9mVHlwZSA9IG51bGw7Ci0KLSAgICBpZiAoIWlzUmVhZE9ubHkpCi0gICAgewotICAgICAgc2NoZW1hT2ZUeXBlID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0U2NoZW1hKCk7Ci0gICAgfQotICAgIGlmIChzY2hlbWFPZlR5cGUgPT0gb3duaW5nRWRpdG9yLmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKSkKLSAgICB7Ci0gICAgICBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIVhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgICBpc1JlYWRPbmx5ID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGhhc01heE1pbkZhY2V0cykKLSAgICB7Ci0gICAgICB0aXRsZS5zZXRUZXh0KHRpdGxlU3RyaW5nICsgKGlzUmVhZE9ubHkgPyAiIC0gIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9SRUFET05MWSA6ICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICByZWxheW91dCgpOwotICAgIGNvbnN0cmFpbnRzV2lkZ2V0LnNldENvbW1hbmRTdGFjayhnZXRDb21tYW5kU3RhY2soKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgewotICAgIGhhc01heE1pbkZhY2V0cyA9IGZhbHNlOwotICAgIHRyeQotICAgIHsKLSAgICB1cGRhdGVJbnB1dCgpOwotICAgIAotICAgIGlmICh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGlzU2ltcGxlVHlwZVJlc3RyaWN0aW9uID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0VmFyaWV0eSgpLmdldFZhbHVlKCkgPT0gWFNEVmFyaWV0eS5BVE9NSUM7Ci0gICAgICAKLSAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHRhcmdldFNUID0geHNkU2ltcGxlVHlwZURlZmluaXRpb247Ci0gICAgICAKLSAgICAgIHdoaWxlICghWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyh0YXJnZXRTVC5nZXRUYXJnZXROYW1lc3BhY2UoKSkgJiYgdGFyZ2V0U1QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0U1QgPSB0YXJnZXRTVC5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgbWluTGVuZ3RoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG1heExlbmd0aFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAodGFyZ2V0U1QuZ2V0VmFsaWRGYWNldHMoKS5jb250YWlucygibGVuZ3RoIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgbWluTGVuZ3RoU3RyaW5nID0gTWVzc2FnZXMuX1VJX0xBQkVMX01JTklNVU1fTEVOR1RIOwotICAgICAgICBtYXhMZW5ndGhTdHJpbmcgPSBNZXNzYWdlcy5fVUlfTEFCRUxfTUFYSU1VTV9MRU5HVEg7Ci0gICAgICAgIHNpbXBsZVR5cGVNb2RpZmllckdyb3VwVGl0bGUgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ09OU1RSQUlOVFNfT05fTEVOR1RIX09GICsgdGFyZ2V0U1QuZ2V0TmFtZSgpOwotICAgICAgICBpc051bWVyaWNCYXNlVHlwZSA9IGZhbHNlOwotICAgICAgICBoYXNNYXhNaW5GYWNldHMgPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodGFyZ2V0U1QuZ2V0VmFsaWRGYWNldHMoKS5jb250YWlucygibWF4SW5jbHVzaXZlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgc2ltcGxlVHlwZU1vZGlmaWVyR3JvdXBUaXRsZSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9DT05TVFJBSU5UU19PTl9WQUxVRV9PRiArIHRhcmdldFNULmdldE5hbWUoKTsKLSAgICAgICAgbWluTGVuZ3RoU3RyaW5nID0gTWVzc2FnZXMuX1VJX0xBQkVMX01JTklNVU1fVkFMVUU7Ci0gICAgICAgIG1heExlbmd0aFN0cmluZyA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9NQVhJTVVNX1ZBTFVFOwotICAgICAgICBpc051bWVyaWNCYXNlVHlwZSA9IHRydWU7Ci0gICAgICAgIGhhc01heE1pbkZhY2V0cyA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNpbXBsZVR5cGVNb2RpZmllckdyb3VwVGl0bGUgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ09OVFJBSU5UU19PTiArICh0YXJnZXRTVCAhPSBudWxsID8gdGFyZ2V0U1QuZ2V0TmFtZSgpIDogImFueVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUlucHV0KCkKLSAgewotICAgIHByZXZpb3VzUHJpbWl0aXZlVHlwZSA9IGN1cnJlbnRQcmltaXRpdmVUeXBlOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREZlYXR1cmUpCi0gICAgewotICAgICAgeHNkRmVhdHVyZSA9IChYU0RGZWF0dXJlKSBpbnB1dDsKLSAgICAgIHR5cGVEZWZpbml0aW9uID0geHNkRmVhdHVyZS5nZXRSZXNvbHZlZEZlYXR1cmUoKS5nZXRUeXBlKCk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiBhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoeHNkRmVhdHVyZSBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgeHNkRWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbil4c2RGZWF0dXJlOwotICAgICAgICBhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh4c2RGZWF0dXJlIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKXhzZEZlYXR1cmU7Ci0gICAgICAgIGFub255bW91c1R5cGVEZWZpbml0aW9uID0geHNkQXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZURlZmluaXRpb247Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbjsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICghWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBiYXNlUHJpbWl0aXZlVHlwZSA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgIFN0cmluZyBiYXNlUHJpbWl0aXZlVHlwZVN0cmluZyA9IGJhc2VQcmltaXRpdmVUeXBlICE9IG51bGwgPyBiYXNlUHJpbWl0aXZlVHlwZS5nZXROYW1lKCkgOiAiIjsKLSAgICAgICAgICBjdXJyZW50UHJpbWl0aXZlVHlwZSA9IGJhc2VQcmltaXRpdmVUeXBlOwotICAgICAgICAgIHRpdGxlU3RyaW5nID0gTWVzc2FnZXMuX1VJX0xBQkVMX1RZUEUgKyAoYW5vbnltb3VzVHlwZURlZmluaXRpb24gIT0gbnVsbCA/ICIoIiArIHhzZEZlYXR1cmUuZ2V0UmVzb2x2ZWRGZWF0dXJlKCkuZ2V0TmFtZSgpICsgIlR5cGUpIiA6IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSkgICsgIiAsICIgKyBNZXNzYWdlcy5fVUlfTEFCRUxfQkFTRSArICI6ICIgKyBiYXNlUHJpbWl0aXZlVHlwZVN0cmluZzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGN1cnJlbnRQcmltaXRpdmVUeXBlID0geHNkU2ltcGxlVHlwZURlZmluaXRpb247Ci0gICAgICAgICAgdGl0bGVTdHJpbmcgPSBNZXNzYWdlcy5fVUlfTEFCRUxfVFlQRSArIChhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiAhPSBudWxsID8gIigiICsgeHNkRmVhdHVyZS5nZXRSZXNvbHZlZEZlYXR1cmUoKS5nZXROYW1lKCkgKyAiVHlwZSkiIDogeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIGN1cnJlbnRQcmltaXRpdmVUeXBlID0geHNkU2ltcGxlVHlwZURlZmluaXRpb247Ci0gICAgICB0aXRsZVN0cmluZyA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9UWVBFICsgKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSA9PSBudWxsID8gIihsb2NhbFR5cGUpIiA6IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSkgKyAiICwgIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9CQVNFICsgIjogIiArIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlRGVmaW5pdGlvbigpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgaW5pdCgpOwotICAgIAotICAgIGlmIChjdXJyZW50UHJpbWl0aXZlVHlwZSAhPSBwcmV2aW91c1ByaW1pdGl2ZVR5cGUpCi0gICAgewotICAgICAgcmVsYXlvdXQoKTsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICAKLSAgICBYU0RXaGl0ZVNwYWNlRmFjZXQgd2hpdGVzcGFjZUZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0V2hpdGVTcGFjZUZhY2V0KCk7Ci0gICAgaWYgKHdoaXRlc3BhY2VGYWNldCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmICh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRGYWNldENvbnRlbnRzKCkuY29udGFpbnMod2hpdGVzcGFjZUZhY2V0KSkKLSAgICAgIHsKLSAgICAgICAgaWYgKFhTRFdoaXRlU3BhY2UuQ09MTEFQU0VfTElURVJBTC5lcXVhbHMod2hpdGVzcGFjZUZhY2V0LmdldFZhbHVlKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGhhc01heE1pbkZhY2V0cyAmJiAhbWluTGVuZ3RoTGFiZWwuaXNEaXNwb3NlZCgpICYmICFtYXhMZW5ndGhMYWJlbC5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgbWluTGVuZ3RoTGFiZWwuc2V0VGV4dChtaW5MZW5ndGhTdHJpbmcpOwotICAgICAgbWF4TGVuZ3RoTGFiZWwuc2V0VGV4dChtYXhMZW5ndGhTdHJpbmcpOwotCi0gICAgICBpZiAoIWlzTnVtZXJpY0Jhc2VUeXBlKQotICAgICAgICByZWZyZXNoU3RyaW5nTGVuZ3RoKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJlZnJlc2hWYWx1ZUxlbmd0aHMoKTsKLSAgICB9Ci0KLSAgICBpZiAoKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEVudW1lcmF0aW9uRmFjZXRzKCkuc2l6ZSgpID4gMCAKLSAgICAJCSYmIGNvbnN0cmFpbnRzV2lkZ2V0LmdldENvbnN0cmFpbnRLaW5kKCkgPT0gU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldC5FTlVNRVJBVElPTikKLSAgICAJCXx8IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFBhdHRlcm5GYWNldHMoKS5zaXplKCkgPT0gMCkgCi0gICAgewotICAgICAgdXNlUGF0dGVybnNCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgIHVzZUVudW1lcmF0aW9uc0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICBjb25zdHJhaW50c1dpZGdldC5zZXRDb25zdHJhaW50S2luZChTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LkVOVU1FUkFUSU9OKTsKLSAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LmFkZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLSAgICBlbHNlIGlmICgoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0UGF0dGVybkZhY2V0cygpLnNpemUoKSA+IDAKLSAgICAJCSYmIGNvbnN0cmFpbnRzV2lkZ2V0LmdldENvbnN0cmFpbnRLaW5kKCkgPT0gU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldC5QQVRURVJOKQotICAgIAkJfHwgeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RW51bWVyYXRpb25GYWNldHMoKS5zaXplKCkgPT0gMCkKLSAgICB7Ci0gICAgICB1c2VQYXR0ZXJuc0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICB1c2VFbnVtZXJhdGlvbnNCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LnNldENvbnN0cmFpbnRLaW5kKFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQuUEFUVEVSTik7Ci0gICAgICBjb25zdHJhaW50c1dpZGdldC5hZGRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB1c2VQYXR0ZXJuc0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgdXNlRW51bWVyYXRpb25zQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LnNldENvbnN0cmFpbnRLaW5kKFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQuRU5VTUVSQVRJT04pOwotICAgICAgY29uc3RyYWludHNXaWRnZXQuYWRkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICAgIGNvbnN0cmFpbnRLaW5kID0gY29uc3RyYWludHNXaWRnZXQuZ2V0Q29uc3RyYWludEtpbmQoKTsKLSAgICBjb25zdHJhaW50c1dpZGdldC5zZXRJbnB1dCh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbik7Ci0KLSAgICBzZXRXaWRnZXRzRW5hYmxlZChpc1NpbXBsZVR5cGVSZXN0cmljdGlvbiAmJiAhaXNSZWFkT25seSk7Ci0gICAgY29tcG9zaXRlLnNldEVuYWJsZWQoaXNTaW1wbGVUeXBlUmVzdHJpY3Rpb24gJiYgIWlzUmVhZE9ubHkpOwotICAgIAotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldFdpZGdldHNFbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKQotICB7Ci0gICAgaWYgKGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbiAhPSBudWxsICYmICFjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24uaXNEaXNwb3NlZCgpKQotICAgICAgY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICBpZiAodXNlRW51bWVyYXRpb25zQnV0dG9uICE9IG51bGwgJiYgIXVzZUVudW1lcmF0aW9uc0J1dHRvbi5pc0Rpc3Bvc2VkKCkpCi0gICAgICB1c2VFbnVtZXJhdGlvbnNCdXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgIGlmICh1c2VQYXR0ZXJuc0J1dHRvbiAhPSBudWxsICYmICF1c2VQYXR0ZXJuc0J1dHRvbi5pc0Rpc3Bvc2VkKCkpCi0gICAgICB1c2VQYXR0ZXJuc0J1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgaWYgKG1pbmltdW1JbmNsdXNpdmVDaGVja2JveCAhPSBudWxsICYmICFtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guaXNEaXNwb3NlZCgpKQotICAgICAgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICBpZiAobWF4aW11bUluY2x1c2l2ZUNoZWNrYm94ICE9IG51bGwgJiYgIW1heGltdW1JbmNsdXNpdmVDaGVja2JveC5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgIGlmIChjb25zdHJhaW50c1dpZGdldCAhPSBudWxsICYmICFjb25zdHJhaW50c1dpZGdldC5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIGlmKGNvbnN0cmFpbnRzV2lkZ2V0LmdldENvbnN0cmFpbnRLaW5kKCkgPT0gU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldC5QQVRURVJOKQotICAgICAgewotICAgICAgICBjb25zdHJhaW50c1dpZGdldC5hZGRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7ICAKLSAgICAgIH0KLSAgICAgIGVsc2UgCi0gICAgICB7Ci0gICAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LmFkZEJ1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgICB9ICAgICAgCi0gICAgICBjb25zdHJhaW50c1dpZGdldC5hZGRVc2luZ0RpYWxvZ0J1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVsYXlvdXQoKQotICB7Ci0gICAgQ29tcG9zaXRlIHBhcmVudCA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLSAgICBwYXJlbnQuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KGZhbHNlKTsKLQotICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBDb250cm9sW10gY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGNoaWxkcmVuW2ldLmRpc3Bvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY3JlYXRlQ29udGVudHMocGFyZW50KTsKLSAgICBwYXJlbnQuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUsIHRydWUpOwotICAgIHBhcmVudC5nZXRQYXJlbnQoKS5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgcmVmcmVzaCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAodGl0bGVGb250ICE9IG51bGwgJiYgIXRpdGxlRm9udC5pc0Rpc3Bvc2VkKCkpCi0gICAgICB0aXRsZUZvbnQuZGlzcG9zZSgpOwotICAgIHRpdGxlRm9udCA9IG51bGw7Ci0gICAgCi0gICAgaWYgKG1pbmltdW1JbmNsdXNpdmVDaGVja2JveCAhPSBudWxsICYmICFtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guaXNEaXNwb3NlZCgpKQotICAgICAgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGlmIChtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3ggIT0gbnVsbCAmJiAhbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LmlzRGlzcG9zZWQoKSkKLSAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBpZiAoY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uICE9IG51bGwgJiYgIWNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbi5pc0Rpc3Bvc2VkKCkpCi0gICAgICBjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBpZiAobWF4TGVuZ3RoVGV4dCAhPSBudWxsICYmICFtYXhMZW5ndGhUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJlbW92ZUxpc3RlbmVycyhtYXhMZW5ndGhUZXh0KTsKLSAgICBpZiAobWluTGVuZ3RoVGV4dCAhPSBudWxsICYmICFtaW5MZW5ndGhUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJlbW92ZUxpc3RlbmVycyhtaW5MZW5ndGhUZXh0KTsKLSAgICAKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoU3RyaW5nTGVuZ3RoKCkKLSAgewotICAgIFhTRE1pbkxlbmd0aEZhY2V0IG1pbkxlbmd0aEZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TWluTGVuZ3RoRmFjZXQoKTsKLSAgICBYU0RNYXhMZW5ndGhGYWNldCBtYXhMZW5ndGhGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE1heExlbmd0aEZhY2V0KCk7Ci0gICAgWFNETGVuZ3RoRmFjZXQgbGVuZ3RoRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRMZW5ndGhGYWNldCgpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKG1pbkxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGludCBtaW5MZW5ndGhWYWx1ZSA9IG1pbkxlbmd0aEZhY2V0LmdldFZhbHVlKCk7Ci0gICAgICAgIGlmIChtaW5MZW5ndGhWYWx1ZSA+PSAwICYmIG1pbkxlbmd0aEZhY2V0LmdldFJvb3RDb250YWluZXIoKSA9PSB4c2RTY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICBtaW5MZW5ndGhUZXh0LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhtaW5MZW5ndGhWYWx1ZSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1pbkxlbmd0aFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKG1heExlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGludCBtYXhMZW5ndGggPSBtYXhMZW5ndGhGYWNldC5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAobWF4TGVuZ3RoID49IDAgJiYgbWF4TGVuZ3RoRmFjZXQuZ2V0Um9vdENvbnRhaW5lcigpID09IHhzZFNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIG1heExlbmd0aFRleHQuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKG1heExlbmd0aCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1heExlbmd0aFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGludCBsZW5ndGggPSBsZW5ndGhGYWNldC5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAobGVuZ3RoID49IDAgJiYgbGVuZ3RoRmFjZXQuZ2V0Um9vdENvbnRhaW5lcigpID09IHhzZFNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIG1pbkxlbmd0aFRleHQuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKGxlbmd0aCkpOwotICAgICAgICAgIG1heExlbmd0aFRleHQuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKGxlbmd0aCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0KLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hWYWx1ZUxlbmd0aHMoKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotICAgIFhTRE1pbkZhY2V0IG1pbkZhY2V0ID0gdHlwZS5nZXRNaW5GYWNldCgpOwotICAgIFhTRE1heEZhY2V0IG1heEZhY2V0ID0gdHlwZS5nZXRNYXhGYWNldCgpOwotCi0gICAgaWYgKG1pbkZhY2V0ICE9IG51bGwgJiYgbWluRmFjZXQuZ2V0Um9vdENvbnRhaW5lcigpID09IHhzZFNjaGVtYSkKLSAgICB7Ci0gICAgICBpZiAobWluRmFjZXQuZ2V0RWxlbWVudCgpLmdldExvY2FsTmFtZSgpLmVxdWFscyhYU0RDb25zdGFudHMuTUlORVhDTFVTSVZFX0VMRU1FTlRfVEFHKSB8fCBtaW5GYWNldC5nZXRFbGVtZW50KCkuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5NSU5JTkNMVVNJVkVfRUxFTUVOVF9UQUcpKQotICAgICAgewotICAgICAgICBtaW5MZW5ndGhUZXh0LnNldFRleHQobWluRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCkpOwotICAgICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0U2VsZWN0aW9uKG1pbkZhY2V0LmlzSW5jbHVzaXZlKCkpOwotICAgICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbWluTGVuZ3RoVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotCi0gICAgaWYgKG1heEZhY2V0ICE9IG51bGwgJiYgbWF4RmFjZXQuZ2V0Um9vdENvbnRhaW5lcigpID09IHhzZFNjaGVtYSkKLSAgICB7Ci0gICAgICBpZiAobWF4RmFjZXQuZ2V0RWxlbWVudCgpLmdldExvY2FsTmFtZSgpLmVxdWFscyhYU0RDb25zdGFudHMuTUFYRVhDTFVTSVZFX0VMRU1FTlRfVEFHKSB8fCBtYXhGYWNldC5nZXRFbGVtZW50KCkuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5NQVhJTkNMVVNJVkVfRUxFTUVOVF9UQUcpKQotICAgICAgewotICAgICAgICBtYXhMZW5ndGhUZXh0LnNldFRleHQobWF4RmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCkpOwotICAgICAgICBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0U2VsZWN0aW9uKG1heEZhY2V0LmlzSW5jbHVzaXZlKCkpOwotICAgICAgICBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbWF4TGVuZ3RoVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIHN1cGVyLmRvSGFuZGxlRXZlbnQoZXZlbnQpOwotICAgIENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgYm9vbGVhbiBkb1VwZGF0ZU1heCA9IGZhbHNlLCBkb1VwZGF0ZU1pbiA9IGZhbHNlOwotICAgIGJvb2xlYW4gZG9TZXRJbnB1dCA9IGZhbHNlOwotICAgIAotICAgIFN0cmluZyBtaW5WYWx1ZSA9IG1pbkxlbmd0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICBTdHJpbmcgbWF4VmFsdWUgPSBtYXhMZW5ndGhUZXh0LmdldFRleHQoKS50cmltKCk7Ci0KLSAgICBYU0RMZW5ndGhGYWNldCBsZW5ndGhGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldExlbmd0aEZhY2V0KCk7Ci0gICAgWFNETWluTGVuZ3RoRmFjZXQgbWluTGVuZ3RoRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRNaW5MZW5ndGhGYWNldCgpOwotICAgIFhTRE1heExlbmd0aEZhY2V0IG1heExlbmd0aEZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TWF4TGVuZ3RoRmFjZXQoKTsKLSAgICAKLSAgICBYU0RNaW5JbmNsdXNpdmVGYWNldCBtaW5JbmNsdXNpdmVGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE1pbkluY2x1c2l2ZUZhY2V0KCk7Ci0gICAgWFNETWluRXhjbHVzaXZlRmFjZXQgbWluRXhjbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRNaW5FeGNsdXNpdmVGYWNldCgpOwotICAgIFhTRE1heEluY2x1c2l2ZUZhY2V0IG1heEluY2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKTsKLSAgICBYU0RNYXhFeGNsdXNpdmVGYWNldCBtYXhFeGNsdXNpdmVGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE1heEV4Y2x1c2l2ZUZhY2V0KCk7Ci0KLSAgICBTdHJpbmcgY3VycmVudE1pbkluY2x1c2l2ZSA9IG51bGwsIGN1cnJlbnRNaW5FeGNsdXNpdmUgPSBudWxsLCBjdXJyZW50TWF4SW5jbHVzaXZlID0gbnVsbCwgY3VycmVudE1heEV4Y2x1c2l2ZSA9IG51bGw7Ci0gICAgaWYgKG1pbkluY2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0gICAgewotICAgICAgY3VycmVudE1pbkluY2x1c2l2ZSA9IG1pbkluY2x1c2l2ZUZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgIH0KLSAgICBpZiAobWluRXhjbHVzaXZlRmFjZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjdXJyZW50TWluRXhjbHVzaXZlID0gbWluRXhjbHVzaXZlRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgfQotICAgIGlmIChtYXhJbmNsdXNpdmVGYWNldCAhPSBudWxsKQotICAgIHsKLSAgICAgIGN1cnJlbnRNYXhJbmNsdXNpdmUgPSBtYXhJbmNsdXNpdmVGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICB9Ci0gICAgaWYgKG1heEV4Y2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0gICAgewotICAgICAgY3VycmVudE1heEV4Y2x1c2l2ZSA9IG1heEV4Y2x1c2l2ZUZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgIH0KLSAgICAKLSAgICBTdHJpbmcgY3VycmVudExlbmd0aCA9IG51bGwsIGN1cnJlbnRNaW4gPSBudWxsLCBjdXJyZW50TWF4ID0gbnVsbDsKLSAgICBpZiAobGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjdXJyZW50TGVuZ3RoID0gbGVuZ3RoRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgfQotICAgIGlmIChtaW5MZW5ndGhGYWNldCAhPSBudWxsKQotICAgIHsKLSAgICAgIGN1cnJlbnRNaW4gPSBtaW5MZW5ndGhGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICB9Ci0gICAgaWYgKG1heExlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgewotICAgICAgY3VycmVudE1heCA9IG1heExlbmd0aEZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgIH0KLSAgICAKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IG1pbkxlbmd0aFRleHQpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChtaW5WYWx1ZS5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzTnVtZXJpY0Jhc2VUeXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE51bWJlciBiaWcgPSBuZXcgQmlnSW50ZWdlcihtaW5WYWx1ZSk7Ci0gICAgICAgICAgICBiaWcudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChtaW5MZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobWluVmFsdWUuZXF1YWxzKGN1cnJlbnRNaW4pIHx8IG1pblZhbHVlLmVxdWFscyhjdXJyZW50TGVuZ3RoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChtYXhWYWx1ZSAhPSBudWxsICYmIG1pblZhbHVlLmVxdWFscyhtYXhWYWx1ZSkgJiYgbGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oImRvdWJsZSIpLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZSgpKSB8fCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigiZmxvYXQiKS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGUoKSkgfHwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oImRlY2ltYWwiKS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGUoKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQmlnRGVjaW1hbCBiaWdEZWNpbWFsID0gbmV3IEJpZ0RlY2ltYWwobWluVmFsdWUpOwotICAgICAgICAgICAgICBiaWdEZWNpbWFsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgIGlmICggKGN1cnJlbnRNaW5JbmNsdXNpdmUgIT0gbnVsbCAmJiBtaW5WYWx1ZS5lcXVhbHMoY3VycmVudE1pbkluY2x1c2l2ZSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgKGN1cnJlbnRNaW5FeGNsdXNpdmUgIT0gbnVsbCAmJiBtaW5WYWx1ZS5lcXVhbHMoY3VycmVudE1pbkV4Y2x1c2l2ZSkpICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBOdW1iZXIgYmlnID0gbmV3IEJpZ0ludGVnZXIobWluVmFsdWUpOwotICAgICAgICAgICAgICBiaWcudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzTnVtZXJpY0Jhc2VUeXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TWluID09IG51bGwgJiYgY3VycmVudExlbmd0aCA9PSBudWxsKQotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudE1pbkluY2x1c2l2ZSA9PSBudWxsICYmIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudE1pbkV4Y2x1c2l2ZSA9PSBudWxsICYmICFtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIG1pblZhbHVlID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBkb1VwZGF0ZU1pbiA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE8gc2hvdyBlcnJvciBtZXNzYWdlCi0gICAgICAgIGRvVXBkYXRlTWluID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChldmVudC53aWRnZXQgPT0gbWF4TGVuZ3RoVGV4dCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKG1heFZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNOdW1lcmljQmFzZVR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgTnVtYmVyIGJpZyA9IG5ldyBCaWdJbnRlZ2VyKG1heFZhbHVlKTsKLSAgICAgICAgICAgIGJpZy50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKG1heExlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChtYXhWYWx1ZS5lcXVhbHMoY3VycmVudE1heCkgfHwgbWF4VmFsdWUuZXF1YWxzKGN1cnJlbnRMZW5ndGgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKG1pblZhbHVlICE9IG51bGwgJiYgbWF4VmFsdWUuZXF1YWxzKG1pblZhbHVlKSAmJiBsZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigiZG91YmxlIikuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlKCkpIHx8IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJmbG9hdCIpLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZSgpKSB8fCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigiZGVjaW1hbCIpLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZSgpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBCaWdEZWNpbWFsIGJpZ0RlY2ltYWwgPSBuZXcgQmlnRGVjaW1hbChtYXhWYWx1ZSk7Ci0gICAgICAgICAgICAgIGJpZ0RlY2ltYWwudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTnVtYmVyIGJpZyA9IG5ldyBCaWdJbnRlZ2VyKG1heFZhbHVlKTsKLSAgICAgICAgICAgICAgYmlnLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc051bWVyaWNCYXNlVHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudE1heCA9PSBudWxsICYmIGN1cnJlbnRMZW5ndGggPT0gbnVsbCkKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRNYXhJbmNsdXNpdmUgPT0gbnVsbCAmJiBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRNYXhFeGNsdXNpdmUgPT0gbnVsbCAmJiAhbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIG1heFZhbHVlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGRvVXBkYXRlTWF4ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZG9VcGRhdGVNYXggPSBmYWxzZTsKLSAgICAgICAgLy8gVE9ETyBzaG93IGVycm9yIG1lc3NhZ2UKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpICYmIChkb1VwZGF0ZU1heCB8fCBkb1VwZGF0ZU1pbikpCi0gICAgewotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYW5vbnltb3VzU2ltcGxlVHlwZSA9IG51bGw7Ci0gICAgICBDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotICAgICAgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kIGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZCA9IG51bGw7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RGZWF0dXJlKQotICAgICAgewotICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNEQ29tbW9uVUlVdGlscy5nZXRBbm9ueW1vdXNTaW1wbGVUeXBlKChYU0RGZWF0dXJlKWlucHV0LCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbik7Ci0gICAgICAgIGlmIChhbm9ueW1vdXNTaW1wbGVUeXBlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbih4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbik7Ci0gICAgICAgCi0gICAgICAgICAgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kID0gbmV3IENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NPTlNUUkFJTl9MRU5HVEgsIChYU0RGZWF0dXJlKWlucHV0KTsKLSAgICAgICAgICBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQuc2V0QW5vbnltb3VzU2ltcGxlVHlwZShhbm9ueW1vdXNTaW1wbGVUeXBlKTsKLSAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZCk7Ci0gICAgICAgICAgZG9TZXRJbnB1dCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzTnVtZXJpY0Jhc2VUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kIHVwZGF0ZUNvbW1hbmQgPSBuZXcgVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kKCIiLCBhbm9ueW1vdXNTaW1wbGVUeXBlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChkb1VwZGF0ZU1heCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cGRhdGVDb21tYW5kLnNldE1heChtYXhWYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChkb1VwZGF0ZU1pbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cGRhdGVDb21tYW5kLnNldE1pbihtaW5WYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQodXBkYXRlQ29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZCB1cGRhdGVDb21tYW5kID0gbmV3IFVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfQk9VTkRTLCBhbm9ueW1vdXNTaW1wbGVUeXBlLCBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCksIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgaWYgKGRvVXBkYXRlTWF4KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWF4KG1heFZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRvVXBkYXRlTWluKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWluKG1pblZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZCh1cGRhdGVDb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICBjb21tYW5kID0gY29tcG91bmRDb21tYW5kOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgaWYgKCFpc051bWVyaWNCYXNlVHlwZSkKLSAgICAgICAgewotICAgICAgICAgIFVwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZCB1cGRhdGVDb21tYW5kID0gbmV3IFVwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZCgiIiwgeHNkU2ltcGxlVHlwZURlZmluaXRpb24pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKGRvVXBkYXRlTWF4KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWF4KG1heFZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRvVXBkYXRlTWluKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWluKG1pblZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29tbWFuZCA9IHVwZGF0ZUNvbW1hbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZCB1cGRhdGVDb21tYW5kID0gbmV3IFVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfQk9VTkRTLCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiwgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpLCBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgIGlmIChkb1VwZGF0ZU1heCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cGRhdGVDb21tYW5kLnNldE1heChtYXhWYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChkb1VwZGF0ZU1pbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cGRhdGVDb21tYW5kLnNldE1pbihtaW5WYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbW1hbmQgPSB1cGRhdGVDb21tYW5kOwotICAgICAgICB9Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIWlzTnVtZXJpY0Jhc2VUeXBlKQotICAgICAgewotICAgICAgICBVcGRhdGVTdHJpbmdMZW5ndGhGYWNldENvbW1hbmQgdXBkYXRlQ29tbWFuZCA9IG5ldyBVcGRhdGVTdHJpbmdMZW5ndGhGYWNldENvbW1hbmQoIiIsIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoZG9VcGRhdGVNYXgpCi0gICAgICAgIHsKLSAgICAgICAgICB1cGRhdGVDb21tYW5kLnNldE1heChtYXhWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRvVXBkYXRlTWluKQotICAgICAgICB7Ci0gICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNaW4obWluVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUodXBkYXRlQ29tbWFuZCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQgdXBkYXRlQ29tbWFuZCA9IG5ldyBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX0JPVU5EUywgeHNkU2ltcGxlVHlwZURlZmluaXRpb24sIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSwgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgaWYgKGRvVXBkYXRlTWF4KQotICAgICAgICB7Ci0gICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNYXgobWF4VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkb1VwZGF0ZU1pbikKLSAgICAgICAgewotICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWluKG1pblZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHVwZGF0ZUNvbW1hbmQpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIHJlZnJlc2goKTsKLSAgICBpZiAoZG9TZXRJbnB1dCkKLSAgICAgIHNldElucHV0KGdldFBhcnQoKSwgZ2V0U2VsZWN0aW9uKCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbikKLSAgICB7Ci0gICAgICAgQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLSAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBhbm9ueW1vdXNTaW1wbGVUeXBlID0gbnVsbDsKLSAgICAgICBpZiAoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICAgewotICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERmVhdHVyZSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTRENvbW1vblVJVXRpbHMuZ2V0QW5vbnltb3VzU2ltcGxlVHlwZSgoWFNERmVhdHVyZSlpbnB1dCwgeHNkU2ltcGxlVHlwZURlZmluaXRpb24pOwotICAgICAgICAgICBpZiAoYW5vbnltb3VzU2ltcGxlVHlwZSA9PSBudWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oeHNkU2ltcGxlVHlwZURlZmluaXRpb24pOwotICAgICAgICAgICAKLSAgICAgICAgICAgICBDaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kID0gbmV3IENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NPTlNUUkFJTl9MRU5HVEgsIChYU0RGZWF0dXJlKWlucHV0KTsKLSAgICAgICAgICAgICBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQuc2V0QW5vbnltb3VzU2ltcGxlVHlwZShhbm9ueW1vdXNTaW1wbGVUeXBlKTsKLSAgICAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZCk7Ci0gICAgICAgICAgIH0KLSAgCi0gICAgICAgICAgIFVwZGF0ZVhTRFdoaXRlU3BhY2VGYWNldENvbW1hbmQgd2hpdGVTcGFjZUNvbW1hbmQgPSBuZXcgVXBkYXRlWFNEV2hpdGVTcGFjZUZhY2V0Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NPTExBUFNFX1dISVRFU1BBQ0UsIGFub255bW91c1NpbXBsZVR5cGUsIGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQod2hpdGVTcGFjZUNvbW1hbmQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tcG91bmRDb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICAgc2V0SW5wdXQoZ2V0UGFydCgpLCBnZXRTZWxlY3Rpb24oKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFVwZGF0ZVhTRFdoaXRlU3BhY2VGYWNldENvbW1hbmQgd2hpdGVTcGFjZUNvbW1hbmQgPSBuZXcgVXBkYXRlWFNEV2hpdGVTcGFjZUZhY2V0Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NPTExBUFNFX1dISVRFU1BBQ0UsIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLCBjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHdoaXRlU3BhY2VDb21tYW5kKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gbWluaW11bUluY2x1c2l2ZUNoZWNrYm94KQotICAgIHsKLSAgICAgIFN0cmluZyBtaW5WYWx1ZSA9IG1pbkxlbmd0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgIGlmIChtaW5WYWx1ZS5sZW5ndGgoKSA9PSAwKSBtaW5WYWx1ZSA9IG51bGw7Ci0KLSAgICAgIFVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQgdXBkYXRlQ29tbWFuZCA9IG5ldyBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX0JPVU5EUywgeHNkU2ltcGxlVHlwZURlZmluaXRpb24sIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSwgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLSAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWluKG1pblZhbHVlKTsKLSAgICAgIAotICAgICAgaWYgKG1pblZhbHVlICE9IG51bGwpCi0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUodXBkYXRlQ29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG1heGltdW1JbmNsdXNpdmVDaGVja2JveCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbWF4VmFsdWUgPSBtYXhMZW5ndGhUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICBpZiAobWF4VmFsdWUubGVuZ3RoKCkgPT0gMCkgbWF4VmFsdWUgPSBudWxsOwotICAgICAgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZCB1cGRhdGVDb21tYW5kID0gbmV3IFVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfQk9VTkRTLCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiwgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpLCBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNYXgobWF4VmFsdWUpOwotICAgICAgaWYgKG1heFZhbHVlICE9IG51bGwpCi0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUodXBkYXRlQ29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHVzZUVudW1lcmF0aW9uc0J1dHRvbikKLSAgICB7Ci0gICAgICBjb25zdHJhaW50c1dpZGdldC5hZGRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpKQotICAgICAgewotICAgICAgICBjb25zdHJhaW50c1dpZGdldC5zZXRDb25zdHJhaW50S2luZChTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LkVOVU1FUkFUSU9OKTsKLSAgICAgICAgY29uc3RyYWludEtpbmQgPSBjb25zdHJhaW50c1dpZGdldC5nZXRDb25zdHJhaW50S2luZCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSB1c2VQYXR0ZXJuc0J1dHRvbikKLSAgICB7Ci0gICAgICBjb25zdHJhaW50c1dpZGdldC5hZGRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSkKLSAgICAgIHsKLSAgICAgICAgY29uc3RyYWludHNXaWRnZXQuc2V0Q29uc3RyYWludEtpbmQoU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldC5QQVRURVJOKTsKLSAgICAgICAgY29uc3RyYWludEtpbmQgPSBjb25zdHJhaW50c1dpZGdldC5nZXRDb25zdHJhaW50S2luZCgpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREZhY2V0U2VjdGlvbkZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RGYWNldFNlY3Rpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjNTdjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREZhY2V0U2VjdGlvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNERmFjZXRTZWN0aW9uRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlcgotewotICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoT2JqZWN0IHRvVGVzdCkKLSAgewotICAgIGlmICh0b1Rlc3QgaW5zdGFuY2VvZiBYU0RGZWF0dXJlKQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoKFhTREZlYXR1cmUpdG9UZXN0KS5nZXRSZXNvbHZlZEZlYXR1cmUoKS5nZXRUeXBlKCk7Ci0gICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodG9UZXN0IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pdG9UZXN0OwotICAgICAgaWYgKHN0LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSB8fAotICAgICAgICAgIHN0LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTREZlYXR1cmUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNESW1wb3J0U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RJbXBvcnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MjYzZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RJbXBvcnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MQ2hhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0REaXJlY3RpdmVzU2NoZW1hTG9jYXRpb25VcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RJbXBvcnRTZWN0aW9uIGV4dGVuZHMgU2NoZW1hTG9jYXRpb25TZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVzcGFjZVRleHQsIHByZWZpeFRleHQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgb2xkUHJlZml4VmFsdWU7Ci0KLSAgcHVibGljIFhTREltcG9ydFNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLSAgICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0gICAgLy8gQ3JlYXRlIFNjaGVtYSBMb2NhdGlvbiBMYWJlbAotICAgIENMYWJlbCBuYW1lc3BhY2VMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfTkFNRVNQQUNFIikpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgbmFtZXNwYWNlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIG5hbWVzcGFjZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGFwcGx5QWxsTGlzdGVuZXJzKG5hbWVzcGFjZVRleHQpOwotICAgIG5hbWVzcGFjZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIER1bW15TGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgQ0xhYmVsIHByZWZpeExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9QUkVGSVgiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgcHJlZml4TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHByZWZpeFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICBwcmVmaXhUZXh0LnNldEVkaXRhYmxlKHRydWUpOwotICAgIGFwcGx5QWxsTGlzdGVuZXJzKHByZWZpeFRleHQpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgcHJlZml4VGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRHVtbXlMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBDcmVhdGUgU2NoZW1hIExvY2F0aW9uIExhYmVsCi0gICAgQ0xhYmVsIHNjaGVtYUxvY2F0aW9uTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1NDSEVNQV9MT0NBVElPTiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBzY2hlbWFMb2NhdGlvbkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyBDcmVhdGUgU2NoZW1hIExvY2F0aW9uIFRleHQKLSAgICBzY2hlbWFMb2NhdGlvblRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICBzY2hlbWFMb2NhdGlvblRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gICAgYXBwbHlBbGxMaXN0ZW5lcnMoc2NoZW1hTG9jYXRpb25UZXh0KTsKLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgc2NoZW1hTG9jYXRpb25UZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyBDcmVhdGUgV2l6YXJkIEJ1dHRvbgotICAgIHdpemFyZEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgd2l6YXJkQnV0dG9uLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICB3aXphcmRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICB3aXphcmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAvLyBlcnJvciB0ZXh0Ci0gICAgZXJyb3JUZXh0ID0gbmV3IFN0eWxlZFRleHQoY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZXJyb3JUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICBlcnJvclRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgZXJyb3JUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGVycm9yVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzY2hlbWFMb2NhdGlvblRleHQsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0lNUE9SVF9fU0NIRU1BTE9DQVRJT04pOwotCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lc3BhY2VUZXh0LAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19JTVBPUlRfX05BTUVTUEFDRSk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcmVmaXhUZXh0LAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19JTVBPUlRfX1BSRUZJWCk7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICB7Ci0gICAgICBlbGVtZW50ID0gKChYU0RJbXBvcnQpIGlucHV0KS5nZXRFbGVtZW50KCk7Ci0KLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZXNwYWNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJzY2hlbWFMb2NhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IGhlbHBlci5nZXRQcmVmaXgoZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUpLCBmYWxzZSk7Ci0KLSAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQotICAgICAgaWYgKHByZWZpeCA9PSBudWxsKQotICAgICAgewotICAgICAgICBwcmVmaXggPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotCi0gICAgICBpZiAoc2NoZW1hTG9jYXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2NoZW1hTG9jYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotCi0gICAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQobmFtZXNwYWNlKTsKLSAgICAgIHByZWZpeFRleHQuc2V0VGV4dChwcmVmaXgpOwotICAgICAgc2NoZW1hTG9jYXRpb25UZXh0LnNldFRleHQoc2NoZW1hTG9jYXRpb24pOwotICAgICAgb2xkUHJlZml4VmFsdWUgPSBwcmVmaXhUZXh0LmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgewotICAgIGlmIChldmVudC53aWRnZXQgPT0gd2l6YXJkQnV0dG9uKQotICAgIHsKLSAgICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgICAKLSAgICAgIFhTRERpcmVjdGl2ZXNTY2hlbWFMb2NhdGlvblVwZGF0ZXIudXBkYXRlU2NoZW1hTG9jYXRpb24oeHNkU2NoZW1hLGlucHV0LGZhbHNlKTsKLSAgICAgIHJlZnJlc2goKTsKLSAgICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgICAgIHByZWZpeFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICBzdXBlci5kb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IHByZWZpeFRleHQpCi0gICAgewotICAgICAgU3RyaW5nIG5ld1ByZWZpeCA9IHByZWZpeFRleHQuZ2V0VGV4dCgpOwotICAgICAgaWYgKG9sZFByZWZpeFZhbHVlLmVxdWFscyhuZXdQcmVmaXgpIHx8ICFpc1ZhbGlkU2NoZW1hTG9jYXRpb24pCi0gICAgICAgIHJldHVybjsKLSAgICAgIE1hcCBtYXAgPSB4c2RTY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotICAgICAgU3RyaW5nIGtleSA9IHByZWZpeFRleHQuZ2V0VGV4dCgpOyAgICAgIAotICAgICAgaWYgKGtleS5sZW5ndGgoKSA9PSAwKSBrZXkgPSBudWxsOwotICAgICAgCi0gICAgICBpZiAodmFsaWRhdGVQcmVmaXgobmV3UHJlZml4KSAmJiBzY2hlbWFMb2NhdGlvblRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoa2V5KSkKLSAgICAgICAgewotICAgICAgICAgIHNldEVycm9yTWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfRVJST1JfTEFCRUxfUFJFRklYX0VYSVNUUyIpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIAotICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG9sZFByZWZpeFZhbHVlLmxlbmd0aCgpID09IDApIAotICAgICAgICAgICAgICBzY2hlbWFFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgieG1sbnMiKTsKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxuczoiK29sZFByZWZpeFZhbHVlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBuZXdQcmVmaXgsIG5hbWVzcGFjZVRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInhtbG5zOiIrb2xkUHJlZml4VmFsdWUpOwotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zIiwgbmFtZXNwYWNlVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICB4c2RTY2hlbWEudXBkYXRlRWxlbWVudCgpOwotICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgICBvbGRQcmVmaXhWYWx1ZSA9IG5ld1ByZWZpeDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX0VSUk9SX0xBQkVMX0lOVkFMSURfUFJFRklYIikpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFib3V0VG9CZUhpZGRlbigpCi0gIHsKLSAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgc3VwZXIuYWJvdXRUb0JlSGlkZGVuKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApIHJldHVybiB0cnVlOwotICAgIHJldHVybiBYTUxDaGFyLmlzVmFsaWROQ05hbWUocHJlZml4KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RNb2RlbEdyb3VwRGVmaW5pdGlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNETW9kZWxHcm91cERlZmluaXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzFiMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RNb2RlbEdyb3VwRGVmaW5pdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTENoYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRERpcmVjdGl2ZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvblNlY3Rpb24gZXh0ZW5kcyBNdWx0aXBsaWNpdHlTZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVUZXh0OwotICBwcm90ZWN0ZWQgQ0NvbWJvIGNvbXBvbmVudE5hbWVDb21ibzsKLSAgYm9vbGVhbiBpc1JlZmVyZW5jZTsKLQotICBwdWJsaWMgWFNETW9kZWxHcm91cERlZmluaXRpb25TZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIGlmIChpc1JlZmVyZW5jZSkKLSAgICB7Ci0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIFJlZiBMYWJlbAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgICAgQ0xhYmVsIHJlZkxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFICsgIjoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcmVmTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBSZWYgQ29tYm8KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0gICAgICBjb21wb25lbnROYW1lQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9uZW50TmFtZUNvbWJvLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX01PREVMR1JPVVBfUkVGU19fUkVGKTsKLSAgICAgIAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBtaW4gcHJvcGVydHkKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIAotICAgIAkJICBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlcy5VSV9MQUJFTF9NSU5PQ0NVUlMpOwotICAgICAgCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0gICAgICBtaW5Db21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgICBtaW5Db21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgbWluQ29tYm8uYWRkKCIwIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG1pbkNvbWJvLmFkZCgiMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBhcHBseUFsbExpc3RlbmVycyhtaW5Db21ibyk7Ci0gICAgICBtaW5Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIAotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtaW5Db21ibywKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19NT0RFTEdST1VQX19NSU5fT0NDVVJFTkNFKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBtYXggcHJvcGVydHkKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIAotICAgIAkJICBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlcy5VSV9MQUJFTF9NQVhPQ0NVUlMpOwotCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0gICAgICBtYXhDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgICBtYXhDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgbWF4Q29tYm8uYWRkKCIwIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG1heENvbWJvLmFkZCgiMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBtYXhDb21iby5hZGQoInVuYm91bmRlZCIpOyAvLyROT04tTkxTLTEkCi0gICAgICBhcHBseUFsbExpc3RlbmVycyhtYXhDb21ibyk7Ci0gICAgICBtYXhDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIAotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtYXhDb21ibywKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19NT0RFTEdST1VQX19NQVhfT0NDVVJFTkNFKTsKLSAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBOYW1lTGFiZWwKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICAgIENMYWJlbCBuYW1lTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX05BTUUpOwotICAgICAgbmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gTmFtZVRleHQKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBuYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBuYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgYXBwbHlBbGxMaXN0ZW5lcnMobmFtZVRleHQpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5hbWVUZXh0LAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX01PREVMR1JPVVBfREVGSU5JVElPTl9fTkFNRSk7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gUmVmYWN0b3IvcmVuYW1lIGh5cGVybGluayAKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgaWYgKCFoaWRlSHlwZXJMaW5rKQotICAgICAgewotICAgICAgICBjcmVhdGVSZW5hbWVIeXBlcmxpbmsoY29tcG9zaXRlKTsKLSAgICAgICAgc2V0UmVuYW1lSHlwZXJsaW5rRW5hYmxlZCghaXNSZWZlcmVuY2UpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgaWYgKGlzUmVhZE9ubHkpCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KSBpbnB1dDsKLQotICAgIGlmIChpc1JlZmVyZW5jZSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpOwotICAgICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KGF0dHJWYWx1ZSk7Ci0KLSAgICAgICAgLy8gcmVmcmVzaCBtaW4gbWF4Ci0gICAgICAgIGlmIChtaW5Db21ibyAhPSBudWxsICYmIG1heENvbWJvICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZWZyZXNoTWluTWF4KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIHJlZnJlc2ggbmFtZQotICAgICAgbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lZENvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgICBpbml0KCk7Ci0gICAgcmVsYXlvdXQoKTsKLSAgICAKLSAgICBpZiAoaXNSZWZlcmVuY2UpCi0gICAgewotICAgICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgICBMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgaXRlbXMgPSBoZWxwZXIuZ2V0TW9kZWxHcm91cHMoKTsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBncm91cCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IGdyb3VwLmdldENvbnRhaW5lcigpOwotICAgICAgICB3aGlsZSAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgaXRlbXMucmVtb3ZlKCgoWFNETW9kZWxHcm91cERlZmluaXRpb24pcGFyZW50KS5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGl0ZW1zLmFkZCgwLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRJdGVtcygoU3RyaW5nIFtdKWl0ZW1zLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICB7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZ3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGlucHV0OwotICAgICAgaXNSZWZlcmVuY2UgPSBncm91cC5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCk7Ci0gICAgICBoaWRlSHlwZXJMaW5rID0gaXNSZWZlcmVuY2U7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVsYXlvdXQoKQotICB7Ci0gICAgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KGZhbHNlKTsKLQotICAgIGlmIChwYXJlbnRDb21wb3NpdGUgIT0gbnVsbCAmJiAhcGFyZW50Q29tcG9zaXRlLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBDb250cm9sW10gY2hpbGRyZW4gPSBwYXJlbnRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGNoaWxkcmVuW2ldLmRpc3Bvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3cgaW5pdGlhbGl6ZSB0aGUgbmV3IGhhbmRsZXIKLSAgICBjcmVhdGVDb250ZW50cyhwYXJlbnRDb21wb3NpdGUpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLSAgICAvLyBOb3cgdHVybiBwYWludGluZyBiYWNrIG9uCi0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLnNldFJlZHJhdyh0cnVlKTsKLSAgICByZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgc3VwZXIuZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KSBpbnB1dDsKLSAgICAgICAgaWYgKCF2YWxpZGF0ZVNlY3Rpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgYW4gYWN0dWFsIG5hbWUgY2hhbmdlIGhhcyB0YWtlbiBwbGFjZQotICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21tYW5kID0gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fUkVOQU1FLCBuYW1lZENvbXBvbmVudCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBnZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICAvLyBkb1JlZmVyZW50aWFsSW50ZWdyaXR5Q2hlY2sobmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVNlY3Rpb24oKQotICB7Ci0gICAgaWYgKG5hbWVUZXh0ID09IG51bGwgfHwgbmFtZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0KLSAgICAvLyB2YWxpZGF0ZSBhZ2FpbnN0IE5DTmFtZQotICAgIGlmIChuYW1lLmxlbmd0aCgpIDwgMSB8fCAhWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKG5hbWUpKQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5fVUlfRVJST1JfSU5WQUxJRF9OQU1FKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBjb21wb25lbnROYW1lQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KWlucHV0OwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0KLSAgICAgICAgaWYgKG5hbWVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgICAgIFhTRERpcmVjdGl2ZXNNYW5hZ2VyLnJlbW92ZVVudXNlZFhTREltcG9ydHMobmFtZWRDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKG5hbWVUZXh0ICE9IG51bGwgJiYgIW5hbWVUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJlbW92ZUxpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRE1vZGVsR3JvdXBTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRE1vZGVsR3JvdXBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTVmN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RNb2RlbEdyb3VwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZUNvbnRlbnRNb2RlbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTRE1vZGVsR3JvdXBTZWN0aW9uIGV4dGVuZHMgTXVsdGlwbGljaXR5U2VjdGlvbgotewotICBwcm90ZWN0ZWQgQ0NvbWJvIG1vZGVsR3JvdXBDb21ibzsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBtb2RlbEdyb3VwQ29tYm9WYWx1ZXMgPSB7ICJzZXF1ZW5jZSIsICJjaG9pY2UiLCAiYWxsIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0gIHB1YmxpYyBYU0RNb2RlbEdyb3VwU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBOYW1lTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgQ0xhYmVsIG5hbWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5VSV9MQUJFTF9LSU5EKTsKLSAgICBuYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5hbWVUZXh0Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBtb2RlbEdyb3VwQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIG1vZGVsR3JvdXBDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG1vZGVsR3JvdXBDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBtb2RlbEdyb3VwQ29tYm8uc2V0SXRlbXMobW9kZWxHcm91cENvbWJvVmFsdWVzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1vZGVsR3JvdXBDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fS0lORCk7Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIG1pbiBwcm9wZXJ0eQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5VSV9MQUJFTF9NSU5PQ0NVUlMpOwotICAgIAotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBtaW5Db21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgbWluQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBtaW5Db21iby5hZGQoIjAiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1pbkNvbWJvLmFkZCgiMSIpOyAvLyROT04tTkxTLTEkCi0gICAgYXBwbHlBbGxMaXN0ZW5lcnMobWluQ29tYm8pOwotICAgIG1pbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWluQ29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX01PREVMR1JPVVBfX01JTl9PQ0NVUkVOQ0UpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gbWF4IHByb3BlcnR5Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX01BWE9DQ1VSUyk7Ci0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgbWF4Q29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIG1heENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbWF4Q29tYm8uYWRkKCIwIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtYXhDb21iby5hZGQoIjEiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1heENvbWJvLmFkZCgidW5ib3VuZGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICBhcHBseUFsbExpc3RlbmVycyhtYXhDb21ibyk7Ci0gICAgbWF4Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtYXhDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fTUFYX09DQ1VSRU5DRSk7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0KLSAgICBpZiAoaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCi0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgIHsKLSAgICAgICAgWFNETW9kZWxHcm91cCBwYXJ0aWNsZSA9IChYU0RNb2RlbEdyb3VwKWlucHV0OwotICAgICAgICBTdHJpbmcgbW9kZWxUeXBlID0gcGFydGljbGUuZ2V0Q29tcG9zaXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgbW9kZWxHcm91cENvbWJvLnNldFRleHQobW9kZWxUeXBlKTsKLSAgICAgICAgCi0gICAgICAgIG1pbkNvbWJvLnNldEVuYWJsZWQoIShwYXJ0aWNsZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikpOwotICAgICAgICBtYXhDb21iby5zZXRFbmFibGVkKCEocGFydGljbGUuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmVmcmVzaE1pbk1heCgpOwotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwIHBhcnRpY2xlID0gKFhTRE1vZGVsR3JvdXApaW5wdXQ7Ci0gICAgaWYgKGUud2lkZ2V0ID09IG1vZGVsR3JvdXBDb21ibykKLSAgICB7Ci0gICAgICBYU0RDb21wb3NpdG9yIG5ld1ZhbHVlID0gWFNEQ29tcG9zaXRvci5nZXQobW9kZWxHcm91cENvbWJvLmdldFRleHQoKSk7Ci0gICAgICBVcGRhdGVDb250ZW50TW9kZWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQ29udGVudE1vZGVsQ29tbWFuZChvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0hBTkdFX0NPTlRFTlRfTU9ERUwsIHBhcnRpY2xlLCBuZXdWYWx1ZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBzdXBlci5kb1dpZGdldFNlbGVjdGVkKGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChtaW5Db21ibyAhPSBudWxsICYmICFtaW5Db21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtaW5Db21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBpZiAobWF4Q29tYm8gIT0gbnVsbCAmJiAhbWF4Q29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgbWF4Q29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNjaGVtYUFkdmFuY2VkU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RTY2hlbWFBZHZhbmNlZFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwMjkyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNjaGVtYUFkdmFuY2VkU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hQWR2YW5jZWRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIElXb3JrYmVuY2hQYXJ0IHBhcnQ7Ci0gIHByb3RlY3RlZCBDTGFiZWwgZWxlbWVudEZvcm1MYWJlbCwgYXR0cmlidXRlRm9ybUxhYmVsLCBibG9ja0RlZmF1bHRMYWJlbCwgZmluYWxEZWZhdWx0TGFiZWw7Ci0gIHByb3RlY3RlZCBDQ29tYm8gZWxlbWVudEZvcm1Db21ibywgYXR0cmlidXRlRm9ybUNvbWJvLCBibG9ja0RlZmF1bHRDb21ibywgZmluYWxEZWZhdWx0Q29tYm87ICAKLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGVtcHR5T3B0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFtdIGZvcm1RdWFsaWZpY2F0aW9uID0geyBlbXB0eU9wdGlvbiwgWFNERm9ybS5RVUFMSUZJRURfTElURVJBTC5nZXRMaXRlcmFsKCksIAotICAgICAgWFNERm9ybS5VTlFVQUxJRklFRF9MSVRFUkFMLmdldExpdGVyYWwoKSB9OyAgLy8kTk9OLU5MUy0xJAotCi0gICAgCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGRlcml2ZWRCeUNob2ljZXNDb21ib1ZhbHVlc1tdID0geyAiIiwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCAvLyROT04tTkxTLTEkIAotICAgICAgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRyB9OyAKLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGJsb2NrRGVmYXVsdFZhbHVlc1tdID0geyBlbXB0eU9wdGlvbiwgIiMiICsgWFNEQ29uc3RhbnRzLkFMTF9FTEVNRU5UX1RBRywgLy8kTk9OLU5MUy0xJAotICAgICAgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLAotICAgICAgInN1YnN0aXR1dGlvbiJ9OwotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmluYWxEZWZhdWx0VmFsdWVzW10gPSB7IGVtcHR5T3B0aW9uLCAiIyIgKyBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCAvLyROT04tTkxTLTEkCi0gICAgICBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIAotICAgICAgWFNEQ29uc3RhbnRzLkxJU1RfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBR307ICAgICAgCi0KLSAgcHVibGljIFhTRFNjaGVtYUFkdmFuY2VkU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotICAgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAvLyBDcmVhdGUgZWxlbWVudEZvcm1EZWZhdWx0IGxhYmVsIGFuZCBjb21ibyAgICAgICAKLSAgICBlbGVtZW50Rm9ybUxhYmVsID0gWFNEQ29tbW9uVUlVdGlscy5nZXROZXdQcm9wZXJ0aWVzTGFiZWwoY29tcG9zaXRlLGdldFdpZGdldEZhY3RvcnkoKSwKLSAgICAgICAgTWVzc2FnZXMuX1VJX0xBQkVMX0VMRU1FTlRGT1JNREVGQVVMVCk7Ci0gICAgZWxlbWVudEZvcm1Db21ibyA9IFhTRENvbW1vblVJVXRpbHMuZ2V0TmV3UHJvcGVydGllc0NvbWJvKGNvbXBvc2l0ZSxnZXRXaWRnZXRGYWN0b3J5KCksdGhpcywKLSAgICAgICAgZm9ybVF1YWxpZmljYXRpb24sWFNERWRpdG9yQ1NIZWxwSWRzLkFEVkFOQ0VfVEFCX19TQ0hFTUFfRUxFTUVOVF9GT1JNX0RFRkFVTFQpOwotCi0gICAgLy8gQ3JlYXRlIGF0dHJpYnV0ZUZvcm1EZWZhdWx0IGxhYmVsIGFuZCBjb21ibwotICAgIGF0dHJpYnV0ZUZvcm1MYWJlbCA9IFhTRENvbW1vblVJVXRpbHMuZ2V0TmV3UHJvcGVydGllc0xhYmVsKGNvbXBvc2l0ZSxnZXRXaWRnZXRGYWN0b3J5KCksCi0gICAgICAgIE1lc3NhZ2VzLl9VSV9MQUJFTF9BVFRSSUJVVEVGT1JNREVGQVVMVCk7Ci0gICAgYXR0cmlidXRlRm9ybUNvbWJvID0gWFNEQ29tbW9uVUlVdGlscy5nZXROZXdQcm9wZXJ0aWVzQ29tYm8oY29tcG9zaXRlLGdldFdpZGdldEZhY3RvcnkoKSx0aGlzLAotICAgICAgICBmb3JtUXVhbGlmaWNhdGlvbixYU0RFZGl0b3JDU0hlbHBJZHMuQURWQU5DRV9UQUJfX1NDSEVNQV9BVFRSSUJVVEVfRk9STV9ERUZBVUxUKTsgICAgCi0gICAgCi0gICAgLy8gQ3JlYXRlIGJsb2NrRGVmYXVsdCBsYWJlbCBhbmQgY29tYm8KLSAgICBibG9ja0RlZmF1bHRMYWJlbCA9IFhTRENvbW1vblVJVXRpbHMuZ2V0TmV3UHJvcGVydGllc0xhYmVsKGNvbXBvc2l0ZSxnZXRXaWRnZXRGYWN0b3J5KCksCi0gICAgICAgIE1lc3NhZ2VzLl9VSV9MQUJFTF9CTE9DS0RFRkFVTFQpOwotICAgIGJsb2NrRGVmYXVsdENvbWJvID0gWFNEQ29tbW9uVUlVdGlscy5nZXROZXdQcm9wZXJ0aWVzQ29tYm8oY29tcG9zaXRlLGdldFdpZGdldEZhY3RvcnkoKSx0aGlzLAotICAgICAgICBibG9ja0RlZmF1bHRWYWx1ZXMsWFNERWRpdG9yQ1NIZWxwSWRzLkFEVkFOQ0VfVEFCX19TQ0hFTUFfQkxPQ0tfREVGQVVMVCk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGZpbmFsRGVmYXVsdCBsYWJlbCBhbmQgY29tYm8KLSAgICBmaW5hbERlZmF1bHRMYWJlbCA9IFhTRENvbW1vblVJVXRpbHMuZ2V0TmV3UHJvcGVydGllc0xhYmVsKGNvbXBvc2l0ZSxnZXRXaWRnZXRGYWN0b3J5KCksCi0gICAgICAgIE1lc3NhZ2VzLl9VSV9MQUJFTF9GSU5BTERFRkFVTFQpOwotICAgIGZpbmFsRGVmYXVsdENvbWJvID0gWFNEQ29tbW9uVUlVdGlscy5nZXROZXdQcm9wZXJ0aWVzQ29tYm8oY29tcG9zaXRlLGdldFdpZGdldEZhY3RvcnkoKSx0aGlzLAotICAgICAgICBmaW5hbERlZmF1bHRWYWx1ZXMsWFNERWRpdG9yQ1NIZWxwSWRzLkFEVkFOQ0VfVEFCX19TQ0hFTUFfRklOQUxfREVGQVVMVCk7ICAgIAotICAgIAotICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgCi0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50Rm9ybUNvbWJvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0ZXh0OwotICAgICAgICBpZiAoeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkVMRU1FTlRGT1JNREVGQVVMVF9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgdGV4dCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKS5nZXROYW1lKCk7ICAKLSAgICAgICAgfQotICAgICAgICBlbHNlIAotICAgICAgICB7Ci0gICAgICAgICAgdGV4dCA9IGVtcHR5T3B0aW9uOyAgCi0gICAgICAgIH0gCi0gICAgICAgIGVsZW1lbnRGb3JtQ29tYm8uc2V0VGV4dCh0ZXh0KTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGF0dHJpYnV0ZUZvcm1Db21ibyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgdGV4dDsKLSAgICAgICAgaWYgKHhzZFNjaGVtYS5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5BVFRSSUJVVEVGT1JNREVGQVVMVF9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgdGV4dCA9IHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIAotICAgICAgICB7Ci0gICAgICAgICAgdGV4dCA9IGVtcHR5T3B0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGF0dHJpYnV0ZUZvcm1Db21iby5zZXRUZXh0KHRleHQpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoYmxvY2tEZWZhdWx0Q29tYm8gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHRleHQ7Ci0gICAgICAgIGlmICh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuQkxPQ0tERUZBVUxUX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0ZXh0ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJMT0NLREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICB0ZXh0ID0gZW1wdHlPcHRpb247Ci0gICAgICAgIH0KLSAgICAgICAgYmxvY2tEZWZhdWx0Q29tYm8uc2V0VGV4dCh0ZXh0KTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGZpbmFsRGVmYXVsdENvbWJvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0ZXh0OwotICAgICAgICBpZiAoeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJTkFMREVGQVVMVF9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgdGV4dCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSU5BTERFRkFVTFRfQVRUUklCVVRFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIAotICAgICAgICB7Ci0gICAgICAgICAgdGV4dCA9IGVtcHR5T3B0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsRGVmYXVsdENvbWJvLnNldFRleHQodGV4dCk7Ci0gICAgICB9ICAgICAgCi0gICAgfSAgICAKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgIAotICAgICAgaWYgKGUud2lkZ2V0ID09IGVsZW1lbnRGb3JtQ29tYm8gJiYgZWxlbWVudEZvcm1Db21ibyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgdmFsdWVFbGVtZW50Rm9ybSA9IGVsZW1lbnRGb3JtQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSwgCi0gICAgICAgICAgICBYU0RDb25zdGFudHMuRUxFTUVOVEZPUk1ERUZBVUxUX0FUVFJJQlVURSwgdmFsdWVFbGVtZW50Rm9ybSwgCi0gICAgICAgICAgICBNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVEZPUk1ERUZBVUxUKTsKLSAgICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgICAgICAgICAgCi0gICAgICBpZiAoZS53aWRnZXQgPT0gYXR0cmlidXRlRm9ybUNvbWJvICYmIGF0dHJpYnV0ZUZvcm1Db21ibyAhPSBudWxsKQotICAgICAgeyAgICAgCi0gICAgICAgIFN0cmluZyB2YWx1ZUF0dHJpYnV0ZUZvcm0gPSBhdHRyaWJ1dGVGb3JtQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSwgCi0gICAgICAgICAgICBYU0RDb25zdGFudHMuQVRUUklCVVRFRk9STURFRkFVTFRfQVRUUklCVVRFLCB2YWx1ZUF0dHJpYnV0ZUZvcm0sIAotICAgICAgICAgICAgTWVzc2FnZXMuX1VJX0xBQkVMX0FUVFJJQlVURUZPUk1ERUZBVUxUKTsKLSAgICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOyAgICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChlLndpZGdldCA9PSBibG9ja0RlZmF1bHRDb21ibyAmJiBibG9ja0RlZmF1bHRDb21ibyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgdmFsdWVCbG9ja0RlZmF1bHQgPSBibG9ja0RlZmF1bHRDb21iby5nZXRUZXh0KCk7ICAgICAgICAKLSAgICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKHhzZFNjaGVtYS5nZXRFbGVtZW50KCksIAotICAgICAgICAgICAgWFNEQ29uc3RhbnRzLkJMT0NLREVGQVVMVF9BVFRSSUJVVEUsIHZhbHVlQmxvY2tEZWZhdWx0LCBNZXNzYWdlcy5fVUlfTEFCRUxfQkxPQ0tERUZBVUxUKTsKLSAgICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZihlLndpZGdldCA9PSBmaW5hbERlZmF1bHRDb21ibyAmJiBmaW5hbERlZmF1bHRDb21ibyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgZmluYWxCbG9ja0RlZmF1bHQgPSBmaW5hbERlZmF1bHRDb21iby5nZXRUZXh0KCk7ICAgICAgICAKLSAgICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKHhzZFNjaGVtYS5nZXRFbGVtZW50KCksIAotICAgICAgICAgICAgWFNEQ29uc3RhbnRzLkZJTkFMREVGQVVMVF9BVFRSSUJVVEUsIGZpbmFsQmxvY2tEZWZhdWx0LCBNZXNzYWdlcy5fVUlfTEFCRUxfRklOQUxERUZBVUxUKTsKLSAgICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RTY2hlbWFTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNjaGVtYVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiMjY0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNjaGVtYVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgkgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLlRleHRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VJbmZvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5YU0RFZGl0TmFtZXNwYWNlc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubnNlZGl0LlRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBJV29ya2JlbmNoUGFydCBwYXJ0OwotICBUZXh0IHByZWZpeFRleHQ7Ci0gIFRleHQgdGFyZ2V0TmFtZXNwYWNlVGV4dDsKLSAgQnV0dG9uIGVkaXRCdXR0b247Ci0gIFN0eWxlZFRleHQgZXJyb3JUZXh0OwotICBDb2xvciByZWQ7Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFhTRFNjaGVtYVNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLSAgICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0gICAgLy8gQ3JlYXRlIFByZWZpeCBMYWJlbAotICAgIENMYWJlbCBwcmVmaXhMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfU0NIRU1BX1BSRUZJWCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIHByZWZpeExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyBDcmVhdGUgUHJlZml4IFRleHQKLSAgICBwcmVmaXhUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBwcmVmaXhUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYXBwbHlBbGxMaXN0ZW5lcnMocHJlZml4VGV4dCk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcmVmaXhUZXh0LAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX1NDSEVNQV9fUFJFRklYKTsKLQotICAgIC8vIENyZWF0ZSBUYXJnZXROYW1lc3BhY2UgTGFiZWwKLSAgICBDTGFiZWwgdGFyZ2V0TmFtZXNwYWNlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1RBUkdFVF9OQU1FX1NQQUNFIikpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIHRhcmdldE5hbWVzcGFjZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyBDcmVhdGUgVGFyZ2V0TmFtZXNwYWNlIFRleHQKLSAgICB0YXJnZXROYW1lc3BhY2VUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICB0YXJnZXROYW1lc3BhY2VUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYXBwbHlBbGxMaXN0ZW5lcnModGFyZ2V0TmFtZXNwYWNlVGV4dCk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0YXJnZXROYW1lc3BhY2VUZXh0LAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX1NDSEVNQV9fVEFSR0VUTkFNRVNQQUNFKTsKLQotICAgIC8vIEFkdmFuY2VkIEJ1dHRvbgotICAgIGVkaXRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9FRElUX05BTUVTUEFDRVMiKSwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChlZGl0QnV0dG9uLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX1NDSEVNQV9fQURWQU5DRUQpOwotCi0gICAgLy8gZXJyb3IgdGV4dAotICAgIGVycm9yVGV4dCA9IG5ldyBTdHlsZWRUZXh0KGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIGVycm9yVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgZXJyb3JUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZXJyb3JUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0KLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEhhbmRsZSBwcmVmaXhUZXh0Ci0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgIFN0cmluZyBhUHJlZml4ID0gaGVscGVyLmdldFByZWZpeChlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSksIGZhbHNlKTsKLQotICAgICAgaWYgKGFQcmVmaXggIT0gbnVsbCAmJiBhUHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgcHJlZml4VGV4dC5zZXRUZXh0KGFQcmVmaXgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwcmVmaXhUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIC8vIEhhbmRsZSBUYXJnZXROYW1lc3BhY2VUZXh0Ci0gICAgIAotICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHRucyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFKTsKLSAgICAgICAgU3RyaW5nIHByb2Nlc3NlZFN0cmluZyA9IFRleHRQcm9jZXNzb3IucHJvY2Vzcyh0bnMpOwotICAgICAgICB0YXJnZXROYW1lc3BhY2VUZXh0LnNldFRleHQocHJvY2Vzc2VkU3RyaW5nKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZXJyb3JUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBlcnJvclRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgcHJlZml4VmFsdWUgPSBwcmVmaXhUZXh0LmdldFRleHQoKTsKLSAgICBTdHJpbmcgdG5zVmFsdWUgPSB0YXJnZXROYW1lc3BhY2VUZXh0LmdldFRleHQoKTsKLQotICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgU3RyaW5nIGN1cnJlbnRQcmVmaXggPSBoZWxwZXIuZ2V0UHJlZml4KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFKSwgZmFsc2UpOwotICAgIFN0cmluZyBjdXJyZW50TmFtZXNwYWNlID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIAotICAgIGlmICh0bnNWYWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocHJlZml4VmFsdWUudHJpbSgpLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgZXJyb3JUZXh0LnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX0VSUk9SX1RBUkdFVF9OQU1FU1BBQ0VfQU5EX1BSRUZJWCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbnQgbGVuZ3RoID0gZXJyb3JUZXh0LmdldFRleHQoKS5sZW5ndGgoKTsKLSAgICAgICAgcmVkID0gbmV3IENvbG9yKG51bGwsIDI1NSwgMCwgMCk7Ci0gICAgICAgIFN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZSgwLCBsZW5ndGgsIHJlZCwgdGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICBlcnJvclRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IHByZWZpeFRleHQpCi0gICAgewotICAgICAgLy8gSWYgdGhlIHByZWZpeCBpcyB0aGUgc2FtZSwganVzdCByZXR1cm4uICAgVGhpcyBtYXkgaGFwcGVuIGlmIHRoZQotICAgICAgLy8gd2lkZ2V0IGxvc2VzIGZvY3VzLgotICAgICAgaWYgKHByZWZpeFZhbHVlLmVxdWFscyhjdXJyZW50UHJlZml4KSkgCi0gICAgICAgIHJldHVybjsKLSAgICAgIHVwZGF0ZU5hbWVzcGFjZUluZm8ocHJlZml4VmFsdWUsIHRuc1ZhbHVlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHRhcmdldE5hbWVzcGFjZVRleHQpCi0gICAgewotICAgICAgLy8gSWYgdGhlIG5zIGlzIHRoZSBzYW1lLCBqdXN0IHJldHVybi4gICBUaGlzIG1heSBoYXBwZW4gaWYgdGhlCi0gICAgICAvLyB3aWRnZXQgbG9zZXMgZm9jdXMuCi0gICAgICBpZiAodG5zVmFsdWUuZXF1YWxzKGN1cnJlbnROYW1lc3BhY2UpKSAKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBET01OYW1lc3BhY2VJbmZvTWFuYWdlciBuYW1lc3BhY2VJbmZvTWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotICAgICAgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5hbWVzcGFjZUluZm9NYW5hZ2VyLmdldE5hbWVzcGFjZUluZm9MaXN0KHhzZFNjaGVtYS5nZXRFbGVtZW50KCkpOwotCi0gICAgICBFbGVtZW50IHhzZFNjaGVtYUVsZW1lbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgRG9jdW1lbnRJbXBsIGRvYyA9IChEb2N1bWVudEltcGwpIHhzZFNjaGVtYUVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX05BTUVTUEFDRV9DSEFOR0UiKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAodG5zVmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDAgKSAvL3JlbW92ZSB0aGUgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZQotICAgICAgICB7Ci0gICAgICAgICAgeHNkU2NoZW1hRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyByZXBsYWNlIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSB4bWxucyBlbnRyeQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGluZm8udXJpLmVxdWFscyhjdXJyZW50TmFtZXNwYWNlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvLnVyaSA9IHRuc1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHhzZFNjaGVtYS5zZXRJbmNyZW1lbnRhbFVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIC8vIHNldCB0aGUgbmV3IHhtbG5zIGVudHJpZXMKLSAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIucmVtb3ZlTmFtZXNwYWNlSW5mbyhlbGVtZW50KTsKLSAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIuYWRkTmFtZXNwYWNlSW5mbyhlbGVtZW50LCBuYW1lc3BhY2VJbmZvTGlzdCwgZmFsc2UpOwotICAgICAgICB4c2RTY2hlbWEuc2V0SW5jcmVtZW50YWxVcGRhdGUodHJ1ZSk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlCi0gICAgICAgIHhzZFNjaGVtYS5zZXRUYXJnZXROYW1lc3BhY2UodG5zVmFsdWUpOwotICAgICAgICAKLSAgICAgICAgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlciB0YXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyID0gbmV3IFRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIoeHNkU2NoZW1hLCBjdXJyZW50TmFtZXNwYWNlLCB0bnNWYWx1ZSk7Ci0gICAgICAgIHRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIucmVzb2x2ZSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotCi0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgeHNkU2NoZW1hLnVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBlZGl0QnV0dG9uKQotICAgIHsKLSAgICAgIFhTREVkaXROYW1lc3BhY2VzQWN0aW9uIG5zQWN0aW9uID0gbmV3IFhTREVkaXROYW1lc3BhY2VzQWN0aW9uKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fRURJVF9OQU1FU1BBQ0VTIiksIHhzZFNjaGVtYS5nZXRFbGVtZW50KCksIG51bGwsIHhzZFNjaGVtYSk7IC8vJE5PTi1OTFMtMSQgCi0gICAgICBuc0FjdGlvbi5ydW4oKTsKLSAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlTmFtZXNwYWNlSW5mbyhTdHJpbmcgbmV3UHJlZml4LCBTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgVXBkYXRlTmFtZXNwYWNlSW5mb3JtYXRpb25Db21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlTmFtZXNwYWNlSW5mb3JtYXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkFNRVNQQUNFX0lORk9STUFUSU9OX0NIQU5HRSwgeHNkU2NoZW1hLCBuZXdQcmVmaXgsIG5ld1RhcmdldE5hbWVzcGFjZSk7Ci0gICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKHByZWZpeFRleHQgIT0gbnVsbCAmJiAhcHJlZml4VGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnMocHJlZml4VGV4dCk7Ci0gICAgaWYgKHRhcmdldE5hbWVzcGFjZVRleHQgIT0gbnVsbCAmJiAhdGFyZ2V0TmFtZXNwYWNlVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnModGFyZ2V0TmFtZXNwYWNlVGV4dCk7Ci0gICAgCi0gICAgaWYgKHJlZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlZC5kaXNwb3NlKCk7Ci0gICAgICByZWQgPSBudWxsOwotICAgIH0KLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RTaW1wbGVUeXBlQWR2YW5jZWRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNpbXBsZVR5cGVBZHZhbmNlZFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyYmIyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNpbXBsZVR5cGVBZHZhbmNlZFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlVHlwZUFkdmFuY2VkU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSAiIjsgLy8kTk9OLU5MUy0xJAkJCi0gIHByaXZhdGUgU3RyaW5nIGZpbmFsVmFsdWVzW10gPSB7IEVNUFRZLCAiIyIgKyBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCAgLy8kTk9OLU5MUy0xJAotCSAgICAgIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIAotCSAgICAgIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBR307Ci0gIAotICBDQ29tYm8gZmluYWxDb21ibzsKLSAgCi0gIHB1YmxpYyBYU0RTaW1wbGVUeXBlQWR2YW5jZWRTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSA9IGdldFdpZGdldEZhY3RvcnkoKTsKLSAgICBjb21wb3NpdGUgPSBmYWN0b3J5LmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRmluYWxMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLSAgICBDTGFiZWwgZmluYWxMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfRklOQUwpOwotICAgIGZpbmFsTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEZpbmFsQ29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGZpbmFsQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgZmluYWxDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGZpbmFsQ29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgZmluYWxDb21iby5zZXRJdGVtcyhmaW5hbFZhbHVlcyk7Ci0gICAgZmluYWxDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIGZpbmFsQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQpOyAKLSAgICAKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLQotICAgICAgCi0gICAgICBpZiAoc2ltcGxlVHlwZS5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgZmluYWxBdHRWYWx1ZSA9IHNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklOQUxfQVRUUklCVVRFKTsKLSAgICAgICAgZmluYWxDb21iby5zZXRUZXh0KGZpbmFsQXR0VmFsdWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmaW5hbENvbWJvLnNldFRleHQoRU1QVFkpOwotICAgICAgfQotICAgIH0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gZmluYWxDb21ibyAmJiBpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBmaW5hbENvbWJvLmdldFRleHQoKTsKLSAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChzaW1wbGVUeXBlLmdldEVsZW1lbnQoKSwgWFNEQ29uc3RhbnRzLkZJTkFMX0FUVFJJQlVURSwgdmFsdWUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9GSU5BTCk7Ci0gICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RTaW1wbGVUeXBlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RTaW1wbGVUeXBlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzI3NWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEU2ltcGxlVHlwZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLkNyZWF0ZUVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLkRPTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVOYW1lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MuTmV3VHlwZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFZhcmlldHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlVHlwZVNlY3Rpb24gZXh0ZW5kcyBSZWZhY3RvcmluZ1NlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0gIENDb21ibyB2YXJpZXR5Q29tYm87Ci0gIENDb21ibyB0eXBlc0NvbWJvOwotICBDTGFiZWwgdHlwZXNMYWJlbDsKLQotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBtZW1iZXJUeXBlRGVmaW5pdGlvbiwgaXRlbVR5cGVEZWZpbml0aW9uLCBiYXNlVHlwZURlZmluaXRpb247Ci0KLSAgcHVibGljIFhTRFNpbXBsZVR5cGVTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSA9IGdldFdpZGdldEZhY3RvcnkoKTsKLSAgICBjb21wb3NpdGUgPSBmYWN0b3J5LmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTmFtZUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBDTGFiZWwgbmFtZUxhYmVsID0gZmFjdG9yeS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5VSV9MQUJFTF9OQU1FKTsKLSAgICBuYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5hbWVUZXh0Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBuYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lVGV4dCwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fU0lNUExFX1RZUEVfX05BTUUpOwotICAgIAotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUmVmYWN0b3IvcmVuYW1lIGh5cGVybGluayAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBjcmVhdGVSZW5hbWVIeXBlcmxpbmsoY29tcG9zaXRlKTsKLQotICAgIC8vIFZhcmlldHkgTGFiZWwKLSAgICBDTGFiZWwgbGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1ZBUklFVFkiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFZhcmlldHkgQ29tYm8KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHZhcmlldHlDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIExpc3QgbGlzdCA9IFhTRFZhcmlldHkuVkFMVUVTOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIHZhcmlldHlDb21iby5hZGQoKChYU0RWYXJpZXR5KSBpdGVyLm5leHQoKSkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgdmFyaWV0eUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIHZhcmlldHlDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodmFyaWV0eUNvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19TSU1QTEVfVFlQRV9fVkFSSUVUWSk7Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIER1bW15TGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBUeXBlcyBMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHR5cGVzTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX01FTUJFUlRZUEVTIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBUeXBlcyBDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHR5cGVzQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgdHlwZXNDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgdHlwZXNDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHR5cGVzQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgdHlwZXNDb21iby5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIHRoaXMpOwotCi0gICAgCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICB0eXBlc0NvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0eXBlc0NvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19TSU1QTEVfVFlQRV9fQkFTRV9UWVBFKTsKLQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVsYXlvdXQoKQotICB7Ci0gICAgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KGZhbHNlKTsKLQotICAgIGlmIChwYXJlbnRDb21wb3NpdGUgIT0gbnVsbCAmJiAhcGFyZW50Q29tcG9zaXRlLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBDb250cm9sW10gY2hpbGRyZW4gPSBwYXJlbnRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGNoaWxkcmVuW2ldLmRpc3Bvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3cgaW5pdGlhbGl6ZSB0aGUgbmV3IGhhbmRsZXIKLSAgICBjcmVhdGVDb250ZW50cyhwYXJlbnRDb21wb3NpdGUpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLSAgICAvLyBOb3cgdHVybiBwYWludGluZyBiYWNrIG9uCi0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLnNldFJlZHJhdyh0cnVlKTsKLSAgICByZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLQotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgc2hvd0xpbmsoIWhpZGVIeXBlckxpbmspOwotCi0gICAgbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB2YXJpZXR5Q29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB0eXBlc0NvbWJvLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgZmlsbFR5cGVzQ29tYm8oKTsKLSAgICB0eXBlc0xhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0JBU0VfVFlQRV9XSVRIX0NPTE9OIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICBTdHJpbmcgc2ltcGxlVHlwZU5hbWUgPSBzdC5nZXROYW1lKCk7Ci0gICAgICBpZiAoc2ltcGxlVHlwZU5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZVRleHQuc2V0VGV4dChzaW1wbGVUeXBlTmFtZSk7Ci0gICAgICAgIG5hbWVUZXh0LnNldEVkaXRhYmxlKHRydWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBuYW1lVGV4dC5zZXRUZXh0KCIqKmFub255bW91cyoqIik7IC8vJE5PTi1OTFMtMSQpOwotICAgICAgICBuYW1lVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIFN0cmluZyB2YXJpZXR5ID0gc3QuZ2V0VmFyaWV0eSgpLmdldE5hbWUoKTsKLSAgICAgIGludCBpbnRWYXJpZXR5ID0gc3QuZ2V0VmFyaWV0eSgpLmdldFZhbHVlKCk7Ci0gICAgICBYU0RET01IZWxwZXIgZG9tSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgaWYoZG9tSGVscGVyLmdldERlcml2ZWRCeUVsZW1lbnRGcm9tU2ltcGxlVHlwZShzdC5nZXRFbGVtZW50KCkpICE9IG51bGwpIHsKLQkgICAgICBpZiAodmFyaWV0eSAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIHZhcmlldHlDb21iby5zZXRUZXh0KHZhcmlldHkpOwotCSAgICAgICAgaWYgKGludFZhcmlldHkgPT0gWFNEVmFyaWV0eS5BVE9NSUMpCi0JICAgICAgICB7Ci0JICAgICAgICAgIGJhc2VUeXBlRGVmaW5pdGlvbiA9IHN0LmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotCSAgICAgICAgICBTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JICAgICAgICAgIGlmIChiYXNlVHlwZURlZmluaXRpb24gIT0gbnVsbCkKLQkgICAgICAgICAgewotCSAgICAgICAgICAgIG5hbWUgPSBiYXNlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpOwotCSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIG5hbWUgPSAiIjsKLQkgICAgICAgICAgfQotCSAgICAgICAgICB0eXBlc0NvbWJvLnNldFRleHQobmFtZSk7Ci0JICAgICAgICAgIHR5cGVzTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfQkFTRV9UWVBFX1dJVEhfQ09MT04iKSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UgaWYgKGludFZhcmlldHkgPT0gWFNEVmFyaWV0eS5MSVNUKQotCSAgICAgICAgewotCSAgICAgICAgICBpdGVtVHlwZURlZmluaXRpb24gPSBzdC5nZXRJdGVtVHlwZURlZmluaXRpb24oKTsKLQkgICAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgICBpZiAoaXRlbVR5cGVEZWZpbml0aW9uICE9IG51bGwpCi0JICAgICAgICAgIHsKLQkgICAgICAgICAgICBuYW1lID0gaXRlbVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKTsKLQkgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSBuYW1lID0gIiI7Ci0JICAgICAgICAgIH0KLQkgICAgICAgICAgdHlwZXNDb21iby5zZXRUZXh0KG5hbWUpOwotCSAgICAgICAgICB0eXBlc0xhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0lURU1fVFlQRSIpKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgfQotCSAgICAgICAgZWxzZSBpZiAoaW50VmFyaWV0eSA9PSBYU0RWYXJpZXR5LlVOSU9OKQotCSAgICAgICAgewotCSAgICAgICAgICBMaXN0IG1lbWJlclR5cGVzTGlzdCA9IHN0LmdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpOwotCSAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1lbWJlclR5cGVzTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JICAgICAgICAgIHsKLQkgICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlT2JqZWN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpLm5leHQoKTsKLQkgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHR5cGVPYmplY3QuZ2V0UU5hbWUoKTsKLQkgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgIHNiLmFwcGVuZChuYW1lKTsKLQkgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkKLQkgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgIH0KLQkgICAgICAgICAgU3RyaW5nIG1lbWJlclR5cGVzID0gc2IudG9TdHJpbmcoKTsKLQkgICAgICAgICAgdHlwZXNDb21iby5zZXRUZXh0KG1lbWJlclR5cGVzKTsKLQkgICAgICAgICAgdHlwZXNMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9NRU1CRVJUWVBFUyIpKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgfQotICAgIH0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gdHlwZXNDb21ibykKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gdHlwZXNDb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoc2hvdWxkUGVyZm9ybUNvbWJvU2VsZWN0aW9uKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBzZWxlY3Rpb24pKQotICAgICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSB0eXBlc0NvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSB0eXBlc0NvbWJvLmdldFRleHQoKTsKLSAgICAgIGlmIChzaG91bGRQZXJmb3JtQ29tYm9TZWxlY3Rpb24oU1dULlNlbGVjdGlvbiwgc2VsZWN0aW9uKSkKLSAgICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gdHlwZXNDb21ibykKLSAgICB7Ci0gICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgIGlmIChlZGl0b3IgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIuY2xhc3MpOyAgICAKLQotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IHR5cGVzQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZTsKLSAgICAgIElDb21wb25lbnREaWFsb2cgZGlhbG9nPSBudWxsOwotICAgICAgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9DT01CT19CUk9XU0UpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpOwotICAgICAgICAoKFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZSkgZGlhbG9nKS5zaG93Q29tcGxleFR5cGVzKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9DT01CT19ORVcpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldE5ld0RpYWxvZygpOwotICAgICAgICAoKE5ld1R5cGVEaWFsb2cpIGRpYWxvZykuYWxsb3dDb21wbGV4VHlwZShmYWxzZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vdXNlIHRoZSB2YWx1ZSBmcm9tIHNlbGVjdGVkIHF1aWNrUGljayBpdGVtCi0gICAgICB7Ci0gICAgICAgIG5ld1ZhbHVlID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShzZWxlY3Rpb24sIG1hbmFnZXIpOwotICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSB2YXJpZXR5Q29tYm8pCi0gICAgewotICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0OwotICAgICAgICAgIEVsZW1lbnQgcGFyZW50ID0gc3QuZ2V0RWxlbWVudCgpOwotCi0gICAgICAgICAgU3RyaW5nIHZhcmlldHkgPSB2YXJpZXR5Q29tYm8uZ2V0VGV4dCgpOwotICAgICAgICAgIGlmICh2YXJpZXR5LmVxdWFscyhYU0RWYXJpZXR5LkFUT01JQ19MSVRFUkFMLmdldE5hbWUoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZXNMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9CQVNFX1RZUEVfV0lUSF9DT0xPTiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc3Quc2V0VmFyaWV0eShYU0RWYXJpZXR5LkFUT01JQ19MSVRFUkFMKTsKLSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfUkVTVFJJQ1RJT04iKSwgcGFyZW50LCBudWxsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh2YXJpZXR5LmVxdWFscyhYU0RWYXJpZXR5LlVOSU9OX0xJVEVSQUwuZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlc0xhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX01FTUJFUlRZUEVTIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzdC5zZXRWYXJpZXR5KFhTRFZhcmlldHkuVU5JT05fTElURVJBTCk7Ci0gICAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChYU0RDb25zdGFudHMuVU5JT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1VOSU9OIiksIHBhcmVudCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAodmFyaWV0eS5lcXVhbHMoWFNEVmFyaWV0eS5MSVNUX0xJVEVSQUwuZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlc0xhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0lURU1fVFlQRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc3Quc2V0VmFyaWV0eShYU0RWYXJpZXR5LkxJU1RfTElURVJBTCk7Ci0gICAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfTElTVCIpLCBwYXJlbnQsIG51bGwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBpc3N1ZSAoY3MpIHRoaXMgbWV0aG9kIHNlZW1zIHRvIGJlIHV0aWxpemluZyAnb2xkJyBjbGFzc2VzLCBjYW4gd2UgcmVpbXBsZW1lbnQ/Ci0gIC8vIChlLmcuIENoYW5nZUVsZW1lbnRBY3Rpb24sIFhTRERPTUhlbHBlciwgZXRjKQotICBwcm90ZWN0ZWQgYm9vbGVhbiBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChTdHJpbmcgZWxlbWVudFRhZywgU3RyaW5nIGxhYmVsLCBFbGVtZW50IHBhcmVudCwgTm9kZSByZWxhdGl2ZU5vZGUpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgTGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZyByZXVzZVR5cGUgPSBudWxsOwotCi0gICAgLy8gYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1ZBUklFVFlfQ0hBTkdFIiksCi0gICAgLy8gcGFyZW50KTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChlbGVtZW50VGFnLmVxdWFscyhYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgbGlzdE5vZGUgPSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgWFNEQ29uc3RhbnRzLkxJU1RfRUxFTUVOVF9UQUcsIGZhbHNlKTsKLSAgICAgIGlmIChsaXN0Tm9kZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAobGlzdE5vZGUuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUpKQotICAgICAgICAJcmV1c2VUeXBlID0gbGlzdE5vZGUuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUpOwotICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UobGlzdE5vZGUpOwotICAgICAgfQotCi0gICAgICBFbGVtZW50IHVuaW9uTm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuVU5JT05fRUxFTUVOVF9UQUcsIGZhbHNlKTsKLSAgICAgIGlmICh1bmlvbk5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgCi0gICAgICAgIGlmICh1bmlvbk5vZGUuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG1lbWJlckF0dHIgPSB1bmlvbk5vZGUuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpOwotICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1lbWJlckF0dHIpOwotICAgICAgICAgIHJldXNlVHlwZSA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgfQotICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UodW5pb25Ob2RlKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHJldXNlVHlwZSA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXVzZVR5cGUgPSBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKTsKLSAgICAgIH0KLSAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFLCByZXVzZVR5cGUpKTsKLSAgICAgIHN0LnNldEl0ZW1UeXBlRGVmaW5pdGlvbihudWxsKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudFRhZy5lcXVhbHMoWFNEQ29uc3RhbnRzLkxJU1RfRUxFTUVOVF9UQUcpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgcmVzdHJpY3Rpb25Ob2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpOwotICAgICAgaWYgKHJlc3RyaWN0aW9uTm9kZSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXVzZVR5cGUgPSByZXN0cmljdGlvbk5vZGUuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSk7Ci0gICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShyZXN0cmljdGlvbk5vZGUpOwotICAgICAgfQotICAgICAgRWxlbWVudCB1bmlvbk5vZGUgPSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICBpZiAodW5pb25Ob2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBtZW1iZXJBdHRyID0gdW5pb25Ob2RlLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKG1lbWJlckF0dHIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1lbWJlckF0dHIpOwotICAgICAgICAgIHJldXNlVHlwZSA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgfQotICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UodW5pb25Ob2RlKTsKLSAgICAgIH0KLSAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSwgcmV1c2VUeXBlKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVsZW1lbnRUYWcuZXF1YWxzKFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRykpCi0gICAgewotICAgICAgRWxlbWVudCBsaXN0Tm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywgZmFsc2UpOwotICAgICAgaWYgKGxpc3ROb2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldXNlVHlwZSA9IGxpc3ROb2RlLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFKTsKLSAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKGxpc3ROb2RlKTsKLSAgICAgIH0KLSAgICAgIEVsZW1lbnQgcmVzdHJpY3Rpb25Ob2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpOwotICAgICAgaWYgKHJlc3RyaWN0aW9uTm9kZSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXVzZVR5cGUgPSByZXN0cmljdGlvbk5vZGUuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSk7Ci0gICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShyZXN0cmljdGlvbk5vZGUpOwotICAgICAgfQotICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFLCByZXVzZVR5cGUpKTsKLSAgICAgIHN0LnNldEl0ZW1UeXBlRGVmaW5pdGlvbihudWxsKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIGVsZW1lbnRUYWcsIGZhbHNlKSA9PSBudWxsKQotICAgIHsKLSAgICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKGVsZW1lbnRUYWcsIGxhYmVsLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgfQotCi0gICAgc3Quc2V0RWxlbWVudChwYXJlbnQpOwotICAgIHN0LnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAvLyBlbmRSZWNvcmRpbmcocGFyZW50KTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCBBY3Rpb24gYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihTdHJpbmcgZWxlbWVudFRhZywgU3RyaW5nIGxhYmVsLCBMaXN0IGF0dHJpYnV0ZXMsIEVsZW1lbnQgcGFyZW50LCBOb2RlIHJlbGF0aXZlTm9kZSkKLSAgewotICAgIENyZWF0ZUVsZW1lbnRBY3Rpb24gYWN0aW9uID0gbmV3IENyZWF0ZUVsZW1lbnRBY3Rpb24obGFiZWwpOwotICAgIGFjdGlvbi5zZXRFbGVtZW50VGFnKGVsZW1lbnRUYWcpOwotICAgIGFjdGlvbi5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotICAgIGFjdGlvbi5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0gICAgYWN0aW9uLnNldFJlbGF0aXZlTm9kZShyZWxhdGl2ZU5vZGUpOwotICAgIHJldHVybiBhY3Rpb247Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKE5vZGUgcGFyZW50LCBTdHJpbmcgZWxlbWVudFRhZywgYm9vbGVhbiBpc1JlZikKLSAgewotICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBFbGVtZW50IHRhcmdldE5vZGUgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLSAgICAgIGlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjaGlsZCwgZWxlbWVudFRhZywgaXNSZWYpKQotICAgICAgICB7Ci0gICAgICAgICAgdGFyZ2V0Tm9kZSA9IChFbGVtZW50KSBjaGlsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdGFyZ2V0Tm9kZTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0QnVpbHRJblN0cmluZ1FOYW1lKCkKLSAgewotICAgIFN0cmluZyBzdHJpbmdOYW1lID0gInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgc2NoZW1hRm9yU2NoZW1hUHJlZml4ID0geHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KCk7Ci0gICAgICBpZiAoc2NoZW1hRm9yU2NoZW1hUHJlZml4ICE9IG51bGwgJiYgc2NoZW1hRm9yU2NoZW1hUHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpOwotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZ05hbWUgPSBwcmVmaXggKyAiOiIgKyBzdHJpbmdOYW1lOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0cmluZ05hbWU7Ci0gIH0KLQotICAvLyBUT0RPOiBDb21tb24gdGhpcyB1cCB3aXRoIGVsZW1lbnQgZGVjbGFyYXRpb24KLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgCi0gIHsKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuVHJhdmVyc2UpIHsKLSAgICAgIGlmIChldmVudC5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0FSUk9XX05FWFQgfHwgZXZlbnQuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9BUlJPV19QUkVWSU9VUykgewotICAgICAgICBpc1RyYXZlcnNpbmcgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQpCi0gICAgewotICAgICAgaWYgKCFuYW1lVGV4dC5nZXRFZGl0YWJsZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpaW5wdXQ7Ci0gICAgICAgIGlmICghdmFsaWRhdGVTZWN0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIGFuIGFjdHVhbCBuYW1lIGNoYW5nZSBoYXMgdGFrZW4gcGxhY2UKLSAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lZENvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICAgIGlmICghbmV3VmFsdWUuZXF1YWxzKG9sZE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgY29tbWFuZCA9IG5ldyBVcGRhdGVOYW1lQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1JFTkFNRSwgbmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwgJiYgZ2V0Q29tbWFuZFN0YWNrKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVTZWN0aW9uKCkKLSAgewotICAgIGlmIChuYW1lVGV4dCA9PSBudWxsIHx8IG5hbWVUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0gICAgU3RyaW5nIG5hbWUgPSBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCi0gICAgLy8gdmFsaWRhdGUgYWdhaW5zdCBOQ05hbWUKLSAgICBpZiAobmFtZS5sZW5ndGgoKSA8IDEgfHwgIVhNTENoYXIuaXNWYWxpZE5DTmFtZShuYW1lKSkKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuX1VJX0VSUk9SX0lOVkFMSURfTkFNRSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAJWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICBoaWRlSHlwZXJMaW5rID0gIShzaW1wbGVUeXBlLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hKTsKLSAgICAgIAotICAgIH0gICAgCi0gICAgLy8gRG9uJ3QgaGF2ZSB0byBjYWxsIHJlbGF5b3V0KCkgaGVyZQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGZpbGxUeXBlc0NvbWJvKCkKLSAgewotICAgIHR5cGVzQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgCi0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgIGlmIChtYW5hZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGl0ZW1zID0gbWFuYWdlci5nZXRRdWlja1BpY2tzKCk7Ci0KLSAgICAgIHR5cGVzQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9DT01CT19CUk9XU0UpOwotICAgICAgdHlwZXNDb21iby5hZGQoTWVzc2FnZXMuX1VJX0NPTUJPX05FVyk7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHR5cGVzQ29tYm8uYWRkKGl0ZW1zW2ldLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBUeXBlIG9mIHRoaXMgYXR0cmlidXRlIGlmIG5lZWRlZAotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZSA9IHNpbXBsZVR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmIGJhc2VUeXBlLmdldFFOYW1lKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRUeXBlTmFtZSA9IGJhc2VUeXBlLmdldFFOYW1lKHhzZFNjaGVtYSk7IC8vIG5vIHByZWZpeAotICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJldCA9IGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoY3VycmVudFR5cGVOYW1lLCBtYW5hZ2VyKTsKLSAgICAgICAgaWYgKHJldCA9PSBudWxsICYmIGN1cnJlbnRUeXBlTmFtZSAhPSBudWxsKSAvLyBub3QgaW4gcXVpY2tQaWNrCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlc0NvbWJvLmFkZChjdXJyZW50VHlwZU5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gVE9ETzogY29tbW9uIHRoaXMgdXAgd2l0aCBYU0RFbGVtZW50RGVjbGFyYXRpb25TZWN0aW9uCi0gIHByaXZhdGUgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKFN0cmluZyB2YWx1ZSwgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIpCi0gIHsKLSAgICBpZiAoZWRpdE1hbmFnZXIgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBxdWlja1BpY2tzID0gZWRpdE1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotICAgICAgaWYgKHF1aWNrUGlja3MgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcXVpY2tQaWNrcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IHF1aWNrUGlja3NbaV07Ci0gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKHR5cGVzQ29tYm8gIT0gbnVsbCAmJiAhdHlwZXNDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICB0eXBlc0NvbWJvLnJlbW92ZUxpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgdGhpcyk7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFRhYmxlVHJlZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RUYWJsZVRyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwNGU3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFRhYmxlVHJlZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxUYWJsZVRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTRFRhYmxlVHJlZVZpZXdlciBleHRlbmRzIFhNTFRhYmxlVHJlZVZpZXdlcgotewotCi0gIFN0cmluZyBmaWx0ZXIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gIGNsYXNzIFhTREFjdGlvbk1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpCi0gICAgewotICAgICAgLy8gdXNlZCB0byBkaXNhYmxlIE5vZGVTZWxlY3Rpb24gbGlzdGVuaW5nIHdoaWxlIHJ1bm5pbmcgTm9kZUFjdGlvbgotICAgICAgLy8gWFNEQWN0aW9uTWFuYWdlciBub2RlQWN0aW9uTWFuYWdlciA9IG5ldyBYU0RBY3Rpb25NYW5hZ2VyKGZNb2RlbCwKLSAgICAgIC8vIFhTRFRhYmxlVHJlZVZpZXdlci50aGlzKTsKLSAgICAgIC8vIG5vZGVBY3Rpb25NYW5hZ2VyLnNldENvbW1hbmRTdGFjayhjb21tYW5kU3RhY2spOwotICAgICAgLy8gbm9kZUFjdGlvbk1hbmFnZXIuZmlsbENvbnRleHRNZW51KG1lbnVNYW5hZ2VyLCBnZXRTZWxlY3Rpb24oKSk7Ci0KLSAgICAgIC8vIHVzZWQgdG8gZGlzYWJsZSBOb2RlU2VsZWN0aW9uIGxpc3RlbmluZyB3aGlsZSBydW5uaW5nIE5vZGVBY3Rpb24KLSAgICAgIC8vIFhNTE5vZGVBY3Rpb25NYW5hZ2VyIG5vZGVBY3Rpb25NYW5hZ2VyID0gbmV3Ci0gICAgICAvLyBYTUxOb2RlQWN0aW9uTWFuYWdlcigoKElET01Eb2N1bWVudCkgZ2V0SW5wdXQoKSkuZ2V0TW9kZWwoKSwKLSAgICAgIC8vIFhNTFRhYmxlVHJlZVZpZXdlci50aGlzKSB7Ci0gICAgICBpZiAoZ2V0SW5wdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBYU0RBY3Rpb25NYW5hZ2VyIG5vZGVBY3Rpb25NYW5hZ2VyID0gbmV3IFhTREFjdGlvbk1hbmFnZXIoKChJRE9NRG9jdW1lbnQpICgoKEVsZW1lbnQpIGdldElucHV0KCkpLmdldE93bmVyRG9jdW1lbnQoKSkpLmdldE1vZGVsKCksIFhTRFRhYmxlVHJlZVZpZXdlci50aGlzKTsKLSAgICAgICAgLy8gbm9kZUFjdGlvbk1hbmFnZXIuc2V0Q29tbWFuZFN0YWNrKGNvbW1hbmRTdGFjayk7Ci0gICAgICAgIG5vZGVBY3Rpb25NYW5hZ2VyLmZpbGxDb250ZXh0TWVudShtZW51TWFuYWdlciwgZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgfQotCi0gICAgfQotICB9Ci0KLSAgcHVibGljIFhTRFRhYmxlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgc3VwZXIocGFyZW50KTsKLSAgICAvLyB0cmVlRXh0ZW5zaW9uLnNldENlbGxNb2RpZmllcihudWxsKTsKLSAgICBnZXRUcmVlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgLy8gdHJlZUV4dGVuc2lvbiA9IG5ldyBYTUxUcmVlRXh0ZW5zaW9uKGdldFRyZWUoKSk7Ci0KLSAgICAvLyBSZWFzc2lnbiB0aGUgY29udGVudCBwcm92aWRlcgotICAgIFhNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBNeUNvbnRlbnRQcm92aWRlcigpOwotICAgIC8vIHByb3ZpZGVyLmFkZFZpZXdlcih0aGlzKTsKLQotICAgIHNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0gICAgc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0KLSAgICAvLyBzZXRWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyKG5ldyBWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VySW1wbChudWxsKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgT2JqZWN0IGdldFJvb3QoKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmdldFJvb3QoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZpbHRlcihTdHJpbmcgZmlsdGVyKQotICB7Ci0gICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudSgpCi0gIHsKLSAgICAvLyBUT0RPIFZlcmlmeSBpZiB0aGlzIGlzIG9rYXkgdG8gb3ZlcnJpZGUgdGhlIE1lbnVNYW5hZ2VyCi0gICAgTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCi0gICAgY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQotICAgIC8vIFRoaXMgaXMgdGhlIGxpbmUgd2UgaGF2ZSB0byBtb2RpZnkKLSAgICBjb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIobmV3IFhTREFjdGlvbk1lbnVMaXN0ZW5lcigpKTsKLSAgICBNZW51IG1lbnUgPSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudShnZXRDb250cm9sKCkpOwotICAgIGdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotICB9Ci0KLSAgYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCi0gIGNsYXNzIE15Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgWE1MVGFibGVUcmVlQ29udGVudFByb3ZpZGVyCi0gIHsKLQotICAgIC8vIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgIC8vCQkJCi0gICAgLy8gaWYgKCFhZGRlZCkgewotICAgIC8vIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgIC8vIGFkZGVkID0gdHJ1ZTsKLSAgICAvLyBFbGVtZW50IGVsZW0gPSAoRWxlbWVudCllbGVtZW50OwotICAgIC8vIGlmIChlbGVtIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotICAgIC8vIHZpZXdlck5vdGlmeWluZ0FkYXB0ZXJGYWN0b3J5LmFkYXB0KChJTm9kZU5vdGlmaWVyKSBlbGVtKTsKLSAgICAvLyB9Ci0gICAgLy8gLy8gcmV0dXJuIG5ldyBPYmplY3RbXSB7ZWxlbX07Ci0gICAgLy8gfQotICAgIC8vIH0KLSAgICAvLyByZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0gICAgLy8gfQotCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICAgIGFkZGVkID0gZmFsc2U7Ci0gICAgICBpZiAob2xkSW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICBvbGRJbnB1dCA9ICgoRWxlbWVudCkgb2xkSW5wdXQpLmdldE93bmVyRG9jdW1lbnQoKTsKLQotICAgICAgaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgbmV3SW5wdXQgPSAoKEVsZW1lbnQpIG5ld0lucHV0KS5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICBzdXBlci5pbnB1dENoYW5nZWQodmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0FkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9BZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMzA5YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0FkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuZG9tLkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLlhTREltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2cgZXh0ZW5kcyBTZWxlY3Rpb25EaWFsb2cgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBTZWxlY3Rpb25MaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEltYWdlIERFRkFVTFRfRUxFTUVOVF9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW1hZ2UgREVGQVVMVF9BVFRSSUJVVEVfSUNPTiA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQXR0cmlidXRlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLSAgLyoqIEEgdGVtcG9yYXJ5IERvY3VtZW50IGluIHdoaWNoIHdlIGNyZWF0ZSB0ZW1wb3JhcnkgRE9NIGVsZW1lbnQgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUKLSAgICogRWxlbWVudCB2aWV3LiAocmVxdWlyZWQgYnkgTGFiZWxQcm92aWRlcikgICovIAotICBwcm90ZWN0ZWQgc3RhdGljIERvY3VtZW50IHRlbXBEb2MgPSBuZXcgRG9jdW1lbnRJbXBsKCk7Ci0gIAotICBCdXR0b24gYWRkQnV0dG9uLCByZW1vdmVCdXR0b24sIGVkaXRCdXR0b247Ci0KLSAgcHVibGljIEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2coU2hlbGwgcGFyZW50LCBFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5IHNjaGVtYVJlZ2lzdHJ5KQotICB7Ci0gICAgc3VwZXIocGFyZW50KTsKLSAgICBzZXRUaXRsZShNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FWFRFTlNJT05fQ09NUE9ORU5UUyk7Ci0gICAgc2V0U2hlbGxTdHlsZShTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuUkVTSVpFIHwgU1dULkNMT1NFKTsgICAgCi0gIH0KLQotICBwcml2YXRlIExpc3QgZklucHV0OwotCi0gIHByaXZhdGUgVGFibGVWaWV3ZXIgY2F0ZWdvcnlUYWJsZVZpZXdlciwgZWxlbWVudFRhYmxlVmlld2VyOwotICBwcml2YXRlIEFycmF5TGlzdCBleGlzdGluZ05hbWVzOwotCi0gIHByaXZhdGUgVmlld2VyRmlsdGVyIGVsZW1lbnRUYWJsZVZpZXdlckZpbHRlcjsKLSAgcHJpdmF0ZSBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBjdXJyZW50RXh0Q2F0ZWdvcnk7Ci0gIHByaXZhdGUgSGFzaE1hcCBzcGVjVG9Db21wb25lbnRzTGlzdCA9IG5ldyBIYXNoTWFwKCk7Ci0gIHByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmU7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChMaXN0IGlucHV0KQotICB7Ci0gICAgdGhpcy5mSW5wdXQgPSBpbnB1dDsKLSAgfQotICAKLSAgcHVibGljIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGdldFNlbGVjdGVkQ2F0ZWdvcnkoKXsKLQlyZXR1cm4gY3VycmVudEV4dENhdGVnb3J5OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsQ2F0ZWdvcnlTZWxlY3Rpb24oU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYyl7Ci0JICBjdXJyZW50RXh0Q2F0ZWdvcnkgPSBzcGVjOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgZ2V0Q2F0ZWdvcnlDb250ZW50UHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBDYXRlZ29yeUNvbnRlbnRQcm92aWRlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgY29udGFpbmVyKQotICB7Ci0gICAgQ29tcG9zaXRlIHBhcmVudCA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEoY29udGFpbmVyKTsKLQotICAgIENvbXBvc2l0ZSBjYXRlZ29yeUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGNhdGVnb3J5Q29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgY2F0ZWdvcnlDb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLQotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNhdGVnb3J5Q29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0gICAgbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfRVhURU5TSU9OX0NBVEVHT1JJRVMpOwotCi0gICAgbmV3IExhYmVsKGNhdGVnb3J5Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLSAgICBjYXRlZ29yeVRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGNhdGVnb3J5Q29tcG9zaXRlLCBnZXRUYWJsZVN0eWxlKCkpOwotICAgIGNhdGVnb3J5VGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldENhdGVnb3J5Q29udGVudFByb3ZpZGVyKCkpOwotICAgIGNhdGVnb3J5VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ2F0ZWdvcnlMYWJlbFByb3ZpZGVyKCkpOwotICAgIGNhdGVnb3J5VGFibGVWaWV3ZXIuc2V0SW5wdXQoZklucHV0KTsKLSAgICBjYXRlZ29yeVRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNhdGVnb3J5VGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLCBYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fRVhURU5TSU9OX0NBVEVHT1JJRVMpOwotCi0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBUYWJsZSB0YWJsZSA9IGNhdGVnb3J5VGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLSAgICB0YWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICB0YWJsZS5zZXRGb250KGNvbnRhaW5lci5nZXRGb250KCkpOwotCi0gICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY2F0ZWdvcnlDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICBnbC5udW1Db2x1bW5zID0gMTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChnbCk7Ci0KLSAgICBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgIGFkZEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9BRERfV0lUSF9ET1RTKTsKLSAgICBhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0gICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYWRkQnV0dG9uLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkFERF9FWFRFTlNJT05TX0NPTVBPTkVOVFNfX0FERCk7ICAgIAotCi0gICAgcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICByZW1vdmVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfREVMRVRFKTsKLSAgICByZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0gICAgcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmVtb3ZlQnV0dG9uLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkFERF9FWFRFTlNJT05TX0NPTVBPTkVOVFNfX0RFTEVURSk7ICAgIAotCi0gICAgCi0gICAgZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgZWRpdEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9FRElUKTsKLSAgICBlZGl0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotICAgIGVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChlZGl0QnV0dG9uLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkFERF9FWFRFTlNJT05TX0NPTVBPTkVOVFNfX0VESVQpOyAgICAKLSAgICAKLSAgICAKLSAgICBMaXN0IGluaXRpYWxTZWxlY3Rpb24gPSBnZXRJbml0aWFsRWxlbWVudFNlbGVjdGlvbnMoKTsKLSAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgY2F0ZWdvcnlUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaW5pdGlhbFNlbGVjdGlvbikpOwotCi0gICAgTGFiZWwgZWxlbWVudExhYmVsID0gbmV3IExhYmVsKGNhdGVnb3J5Q29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0gICAgZWxlbWVudExhYmVsLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0FWQUlMQUJMRV9DT01QT05FTlRTX1RPX0FERCk7Ci0KLSAgICBuZXcgTGFiZWwoY2F0ZWdvcnlDb21wb3NpdGUsIFNXVC5OT05FKTsKLQotICAgIGVsZW1lbnRUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjYXRlZ29yeUNvbXBvc2l0ZSwgZ2V0VGFibGVTdHlsZSgpKTsKLSAgICBlbGVtZW50VGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBFbGVtZW50Q29udGVudFByb3ZpZGVyKCkpOwotICAgIGVsZW1lbnRUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBFbGVtZW50TGFiZWxQcm92aWRlcigpKTsKLSAgICBlbGVtZW50VGFibGVWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0gICAgZWxlbWVudFRhYmxlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBva1ByZXNzZWQoKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBpZiAoIGVsZW1lbnRUYWJsZVZpZXdlckZpbHRlciAhPSBudWxsKXsKLSAgICAgIGVsZW1lbnRUYWJsZVZpZXdlci5hZGRGaWx0ZXIoZWxlbWVudFRhYmxlVmlld2VyRmlsdGVyKTsKLSAgICB9Ci0gICAgCi0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICB0YWJsZSA9IGVsZW1lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgIHRhYmxlLnNldExheW91dERhdGEoZ2QpOwotICAgIHRhYmxlLnNldEZvbnQoY29udGFpbmVyLmdldEZvbnQoKSk7Ci0KLSAgICBlbGVtZW50VGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCSAgICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZCh0cnVlKTsJCQkKLQkgICAgfSAgICAgICAgCSAgCi0gICAgICB9KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGVsZW1lbnRUYWJsZVZpZXdlci5nZXRDb250cm9sKCksIFhTREVkaXRvckNTSGVscElkcy5BRERfRVhURU5TSU9OU19DT01QT05FTlRTX19BVkFJTEFCTEVfQ09NUE9ORU5UU19UT19BREQpOwotICAgIAotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGUoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlKCk7Ci0gICAgaWYgKGNhdGVnb3J5VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSA+IDApCi0gICAgewotICAgICAgY2F0ZWdvcnlUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNlbGVjdCgwKTsKLSAgICAgIAotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uOwotICAgICAgaWYgKGN1cnJlbnRFeHRDYXRlZ29yeSAhPSBudWxsKXsKLSAgICAJICBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY3VycmVudEV4dENhdGVnb3J5KTsKLSAgICAgIH0KLSAgICAgIGVsc2V7Ci0gICAgCSAgc3RydWN0dXJlZFNlbGVjdGlvbiA9IAotICAgIAkJICBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjYXRlZ29yeVRhYmxlVmlld2VyLmdldEVsZW1lbnRBdCgwKSk7Ci0gICAgICB9Ci0gICAgICAKLQkgIGNhdGVnb3J5VGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotICAgIH0KLSAgICAKLSAgICAvLyBTZXR1cCB0aGUgbGlzdCBvZiBjYXRlZ29yeSBuYW1lcyB0aGF0IGFscmVhZHkgZXhpc3QKLSAgICAvLyBhbmQgY29udHJ1Y3RzIHRoZSBYU0RTY2hlbWEgZm9yIGVhY2ggY2F0ZWdvcnkKLQlleGlzdGluZ05hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCVRhYmxlSXRlbVtdIGNhdGVnb3JpZXMgPSBjYXRlZ29yeVRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpKysgKXsKLQkJZXhpc3RpbmdOYW1lcy5hZGQoY2F0ZWdvcmllc1tpXS5nZXRUZXh0KCkpOwotCi0JCVNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMgPSAKLQkJCShTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSkgY2F0ZWdvcmllc1tpXS5nZXREYXRhKCk7Ci0JCVhTRFNjaGVtYSBzY2hlbWEgPSBnZXRBU0lTY2hlbWFNb2RlbChzcGVjKTsKLQkJCi0JCWlmIChzY2hlbWEgPT0gbnVsbCkKLQkJewotCQkJY29udGludWU7Ci0JCX0KLQotCQlMaXN0IGNvbXBvbmVudHMgPSBidWlsZElucHV0KHNjaGVtYSk7Ci0JCXNwZWNUb0NvbXBvbmVudHNMaXN0LnB1dChzcGVjLCBjb21wb25lbnRzKTsKLQotCQkvLyBtYXJrIGNhdGVnb3J5IGFzIGdyYXkvZW1wdHkgaWYgYXBwbGljYWJsZQotCQlPYmplY3RbXSByZW1haW5zID0gY29tcG9uZW50cy50b0FycmF5KCk7Ci0JCWlmICggZWxlbWVudFRhYmxlVmlld2VyRmlsdGVyICE9IG51bGwpCi0JCQlyZW1haW5zID0gZWxlbWVudFRhYmxlVmlld2VyRmlsdGVyLmZpbHRlcihlbGVtZW50VGFibGVWaWV3ZXIsIAotCQkJCQllbGVtZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKSwgcmVtYWlucyk7Ci0JCWlmICggcmVtYWlucy5sZW5ndGggPT0gMCkKLQkJewotCQkgIGNhdGVnb3JpZXNbaV0uc2V0Rm9yZWdyb3VuZCgKLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKSk7Ci0JCX0KLQl9Ci0JCi0JZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50c1RhYmxlRmlsdGVyKFZpZXdlckZpbHRlciBmaWx0ZXIpewotCWVsZW1lbnRUYWJsZVZpZXdlckZpbHRlciA9IGZpbHRlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJlZlN0b3JlKElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlKQotICB7Ci0gICAgdGhpcy5wcmVmU3RvcmUgPSBwcmVmU3RvcmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKQotICB7Ci0gICAgcmV0dXJuIGdldFNoZWxsKCkuY29tcHV0ZVNpemUoNDAwLCAzMDApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc3R5bGUgZmxhZ3MgZm9yIHRoZSB0YWJsZSB2aWV3ZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHJvdGVjdGVkIGludCBnZXRUYWJsZVN0eWxlKCkKLSAgewotICAgIHJldHVybiBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUjsKLSAgfQotCi0gIC8qCi0gICAqIE92ZXJyaWRlcyBtZXRob2QgZnJvbSBEaWFsb2cKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpCi0gIHsKLSAgICAvLyBCdWlsZCBhIGxpc3Qgb2Ygc2VsZWN0ZWQgY2hpbGRyZW4uCi0gICAgZ2V0U2hlbGwoKS5zZXRDdXJzb3IobmV3IEN1cnNvcihnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKSk7Ci0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZWxlbWVudFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZWxlbWVudFRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGNhdGVnb3J5U2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjYXRlZ29yeVRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHJlc3VsdC5hZGQoZWxlbWVudFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0gICAgcmVzdWx0LmFkZChjYXRlZ29yeVNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0gICAgaWYgKGVsZW1lbnRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXRSZXN1bHQocmVzdWx0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldFJlc3VsdChudWxsKTsKLSAgICB9Ci0gICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gYWRkQnV0dG9uKQotICAgIHsKLSAgICAJQWRkTmV3Q2F0ZWdvcnlEaWFsb2cgYWRkTmV3Q2F0ZWdvcnlEaWFsb2cKLSAgICAJCT0gbmV3IEFkZE5ld0NhdGVnb3J5RGlhbG9nKGdldFNoZWxsKCkpOwotICAgIAkKLSAgICAJYWRkTmV3Q2F0ZWdvcnlEaWFsb2cuc2V0VW5hdmFpbGFibGVDYXRlZ29yeU5hbWVzKGV4aXN0aW5nTmFtZXMpOwotICAgIAkKLSAgICAJaWYgKCBhZGROZXdDYXRlZ29yeURpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LICl7ICAgIAkJCi0gICAgCQlTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzY2hlbWFTcGVjID0gCi0gICAgCQkJbmV3IFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKCk7Ci0gICAgCQlzY2hlbWFTcGVjLnNldERpc3BsYXlOYW1lKGFkZE5ld0NhdGVnb3J5RGlhbG9nLmdldE5ld0NhdGVnb3J5TmFtZSgpICk7Ci0gICAgCQlzY2hlbWFTcGVjLnNldExvY2F0aW9uKGFkZE5ld0NhdGVnb3J5RGlhbG9nLmdldENhdGVnb3J5TG9jYXRpb24oKSApOwotICAgIAkJc2NoZW1hU3BlYy5zZXRTb3VyY2VIaW50KGFkZE5ld0NhdGVnb3J5RGlhbG9nLmdldFNvdXJjZSgpKTsKLSAgICAJCXNjaGVtYVNwZWMuc2V0RnJvbUNhdGFsb2coYWRkTmV3Q2F0ZWdvcnlEaWFsb2cuZ2V0RnJvbUNhdGFsb2coKSApOwotCi0gICAgCQlmSW5wdXQuYWRkKHNjaGVtYVNwZWMpOwotICAgIAkJZXhpc3RpbmdOYW1lcy5hZGQoc2NoZW1hU3BlYy5nZXREaXNwbGF5TmFtZSgpKTsKLQotICAgIAkJLy8gcmVmcmVzaCB3aXRob3V0IHVwZGF0aW5nIGxhYmVscyBvZiBleGlzdGluZyBUYWJsZUl0ZW1zICAgIAkJCi0gICAgCQljYXRlZ29yeVRhYmxlVmlld2VyLnJlZnJlc2goZmFsc2UpOwotCi0gICAgCQljYXRlZ29yeVRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzY2hlbWFTcGVjKSk7Ci0gICAgCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgCQkKLSAgICAJCXN0b3JlU3BlY0luUHJlZihzY2hlbWFTcGVjKTsgIC8vIG11c3Qgc3RvcmUgYWZ0ZXIgc2VsZWN0aW9uIGNoYW5nZWQgaXMgY2FsbGVkIGllLiAyIGxpbmVzIGFib3ZlICh0cnVuZykKLSAgICAJfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSByZW1vdmVCdXR0b24pCi0gICAgewotICAgIAlUYWJsZUl0ZW1bXSBzZWxlY3Rpb25zID0gY2F0ZWdvcnlUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbigpOwotICAgIAlmb3IgKGludCBpID0wOyBpIDwgc2VsZWN0aW9ucy5sZW5ndGg7IGkrKyl7Ci0gICAgCQlTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjID0gCi0gICAgCQkJKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKSBzZWxlY3Rpb25zW2ldLmdldERhdGEoKTsKLQotCQkJZklucHV0LnJlbW92ZShzcGVjICk7Ci0gICAgCQlleGlzdGluZ05hbWVzLnJlbW92ZShzcGVjLmdldERpc3BsYXlOYW1lKCkpOwotICAgIAkJc3BlY1RvQ29tcG9uZW50c0xpc3QucmVtb3ZlKHNwZWMpOwotICAgIAkJCi0gICAgCQlyZW1vdmVGcm9tUHJlZihzcGVjKTsKLSAgICAJfQotICAgIAljYXRlZ29yeVRhYmxlVmlld2VyLnJlZnJlc2goZmFsc2UpOwotCi0gICAgCWVsZW1lbnRUYWJsZVZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICAJZWxlbWVudFRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQotICAgICAgICAvLyBUT0RPIGF1dG8gc2VsZWN0IGVpdGhlciB0aGUgcHJldiBjYXRlZ29yeSwgdGhlIG5leHQgY2F0ZWdvcnkgb3IgdGhlIGZpcnN0IGNhdGVnb3J5IGluIHRoZSBUYWJsZQotICAgIAlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGVkaXRCdXR0b24pCi0gICAgewotICAgICAgICAvLyB1c2UgdGhpcyBkaWFsb2cgbm90IGZvciBhZGRpbmcgYnV0IGZvciBlZGl0aW5nIHB1cnBvc2UuCi0gICAgICAgIEFkZE5ld0NhdGVnb3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBBZGROZXdDYXRlZ29yeURpYWxvZyhnZXRTaGVsbCgpLCBNZXNzYWdlcy5fVUlfTEFCRUxfRURJVF9DQVRFR09SWSk7Ci0gICAgICAgIAotICAgIAlUYWJsZUl0ZW1bXSBzZWxlY3Rpb25zID0gY2F0ZWdvcnlUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbigpOwotICAgIAlpZiAoc2VsZWN0aW9ucy5sZW5ndGggPT0gMCkKLSAgICAJCXJldHVybjsKLQotICAgIAlTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKSBzZWxlY3Rpb25zWzBdLmdldERhdGEoKTsKLSAgICAgICAgCi0gICAgCVN0cmluZyBkaXNwbGF5TmFtZSA9IHNwZWMuZ2V0RGlzcGxheU5hbWUoKTsKLQotCQlkaWFsb2cuc2V0Q2F0ZWdvcnlOYW1lKGRpc3BsYXlOYW1lICk7Ci0gICAgCWRpYWxvZy5zZXRGcm9tQ2F0YWxvZyhzcGVjLmlzRnJvbUNhdGFsb2coKSApOwotICAgIAlkaWFsb2cuc2V0U291cmNlKHNwZWMuZ2V0U291cmNlSGludCgpICk7Ci0gICAgCWRpYWxvZy5zZXRDYXRlZ29yeUxvY2F0aW9uKHNwZWMuZ2V0TG9jYXRpb24oKSApOwotCi0gICAgCXNwZWNUb0NvbXBvbmVudHNMaXN0LnJlbW92ZShzcGVjKTsKLSAgICAJZGlhbG9nLnNldFVuYXZhaWxhYmxlQ2F0ZWdvcnlOYW1lcyhleGlzdGluZ05hbWVzKTsKLSAgICAgICAgCi0gICAgICAgIGlmICggZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spewotICAgICAgICAJZXhpc3RpbmdOYW1lcy5yZW1vdmUoZGlzcGxheU5hbWUpOwotCQkJU3RyaW5nIG5ld0Rpc3BsYXlOYW1lID0gZGlhbG9nLmdldE5ld0NhdGVnb3J5TmFtZSgpOwotCi0JCQlzcGVjLnNldERpc3BsYXlOYW1lKG5ld0Rpc3BsYXlOYW1lKTsKLSAgICAgICAgCXNwZWMuc2V0TG9jYXRpb24oZGlhbG9nLmdldENhdGVnb3J5TG9jYXRpb24oKSk7Ci0gICAgICAgIAlzcGVjLnNldFNvdXJjZUhpbnQoZGlhbG9nLmdldFNvdXJjZSgpKTsKLSAgICAgICAgCXNwZWMuc2V0RnJvbUNhdGFsb2coZGlhbG9nLmdldEZyb21DYXRhbG9nKCkpOwotICAgICAgICAJc3BlYy5zZXROYW1lc3BhY2VVUkkobnVsbCk7Ci0gICAgICAgIAkKLSAgICAgICAgCWV4aXN0aW5nTmFtZXMuYWRkKG5ld0Rpc3BsYXlOYW1lKTsKLQotICAgICAgICAJY2F0ZWdvcnlUYWJsZVZpZXdlci51cGRhdGUoc3BlYywgbnVsbCk7Ci0gICAgICAgIAlyZWZyZXNoRWxlbWVudHNWaWV3ZXIoc3BlYyk7Ci0gICAgICAgIAkKLSAgICAgICAgCWVkaXRTcGVjSW5QcmVmKGRpc3BsYXlOYW1lLCBzcGVjKTsKLSAgICAgICAgfQotICAgIH0KLSAgfQotCi0vKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQuZ2V0U291cmNlKCkgPT0gY2F0ZWdvcnlUYWJsZVZpZXdlcikKLSAgICB7Ci0gICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmogPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMgPSAoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpIG9iajsKLSAgICAgICAgICBjdXJyZW50RXh0Q2F0ZWdvcnkgPSBzcGVjOwotICAgICAgICAgIHJlZnJlc2hFbGVtZW50c1ZpZXdlcihzcGVjKTsKLQotICAgICAgICAgIGlmICggc3BlYy5pc0RlZmF1dFNjaGVtYSgpICl7Ci0gICAgICAgIAllZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlewotICAgICAgICAJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcmVmcmVzaEVsZW1lbnRzVmlld2VyKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMpIHsKLQkgIExpc3QgY29tcG9uZW50cyA9IChMaXN0KSBzcGVjVG9Db21wb25lbnRzTGlzdC5nZXQoc3BlYyk7Ci0JICBpZiAoIGNvbXBvbmVudHMgIT0gbnVsbCl7Ci0JCWVsZW1lbnRUYWJsZVZpZXdlci5zZXRJbnB1dChjb21wb25lbnRzKTsKLQkJcmV0dXJuOwotCSAgfQotCSAgCi0JICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gZ2V0QVNJU2NoZW1hTW9kZWwoc3BlYyk7Ci0KLQkgIGlmICh4c2RTY2hlbWEgPT0gbnVsbCl7Ci0JCSAgTWVzc2FnZUJveCBlcnJEaWFsb2cgPSBuZXcgTWVzc2FnZUJveChnZXRTaGVsbCgpLCBTV1QuSUNPTl9FUlJPUik7Ci0JCSAgZXJyRGlhbG9nLnNldFRleHQoTWVzc2FnZXMuX1VJX0VSUk9SX0lOVkFMSURfQ0FURUdPUlkpOwotCQkgIC8vIFRPRE8gKHRydW5nKSBJIHdhcyBmb3JjZWQgdG8gdXNlIGEgU3RyaW5nIGluIE1lc3NhZ2VzIHRvIG1ha2UgdGhlIGVycm9yIGNsZWFyZXIKLQkJICAvLyBXaGVuIHdlIGFyZSBiYWNrIHRvIGRldmVsb3BtZW50IHBoYXNlLCB1c2UgYW5vdGhlciBzdHJpbmc6ICJFeHRlbnNpb24gQ2F0ZWdvcnk6ICIKLQkJICAvLyBub3QgIkV4dGVuc2lvbiBDYXRlZ29yaWVzOiIgKyAiICIgbGlrZSB3ZSBhcmUgdXNpbmcgaGVyZQotCQkgIGVyckRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLl9VSV9MQUJFTF9FWFRFTlNJT05fQ0FURUdPUklFUyArICIgIiArIHNwZWMuZ2V0RGlzcGxheU5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJICArICJcbiIgICAvLyROT04tTkxTLTEkCi0JCQkJICArIE1lc3NhZ2VzLl9VSV9FUlJPUl9GSUxFX0NBTk5PVF9CRV9QQVJTRUQKLQkJCQkgICsgIlxuIiArIE1lc3NhZ2VzLl9VSV9FUlJPUl9WQUxJREFURV9USEVfRklMRSk7ICAgLy8kTk9OLU5MUy0xJAotCQkgIGVyckRpYWxvZy5vcGVuKCk7Ci0JCSAgCi0JCSAgZWxlbWVudFRhYmxlVmlld2VyLnNldElucHV0KG5ldyBBcnJheUxpc3QoMCkpOwotCQkgIHJldHVybjsKLQkgIH0KLQkgIAotCSAgY29tcG9uZW50cyA9IGJ1aWxkSW5wdXQoeHNkU2NoZW1hKTsKLSAgICAgIHNwZWNUb0NvbXBvbmVudHNMaXN0LnB1dChzcGVjLCBjb21wb25lbnRzKTsJICAKLQkgIAotCSAgTGlzdCBhbGxJdGVtcyA9IGJ1aWxkSW5wdXQoeHNkU2NoZW1hKTsKLQkgIGlmICggYWxsSXRlbXMgPT0gbnVsbCApCi0JCSAgcmV0dXJuOwotCSAgZWxlbWVudFRhYmxlVmlld2VyLnNldElucHV0KGFsbEl0ZW1zKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBidWlsZElucHV0KFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLQlpZiAoIHhzZFNjaGVtYSA9PW51bGwgKQotCQlyZXR1cm4gbnVsbDsKLQotICAgIExpc3QgZWxlbWVudHMgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotICAgIExpc3QgYXR0cmlidXRlcyA9IHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsKLSAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgLy8gRm9yIHNhZmV0eSBwdXJwb3NlOiBXZSBkb24ndCBhcHBlbmQgJ2F0dHJpYnV0ZXMnIHRvICdlbGVtZW50cycKLSAgICAvLyBBcnJheVN0b3JlRXhjZXB0aW9uKG9yIHNpbWlsYXIgb25lKSBtYXkgb2NjdXIKLSAgICBMaXN0IGFsbEl0ZW1zID0gbmV3IEFycmF5TGlzdChhdHRyaWJ1dGVzLnNpemUoKSArIGVsZW1lbnRzLnNpemUoKSk7Ci0gICAgCi0gICAgewotICAgICAgLy8gZ2V0RWxlbWVudERlY2xhcmF0aW9ucyByZXR1cm5zIGEgbG90IG9mIGVsZW1lbnRzIGZyb20gaW1wb3J0Ci0gICAgICAvLyBzdGF0ZW1lbnQsIHdlCi0gICAgICAvLyBvbmx5IGFkZCBub24taW1wb3J0ZWQgZWxlbWVudHMgaGVyZS4gKHRydW5nKQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGN1cnJlbnRFbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuZ2V0KGkpOwotICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKSkKLSAgICAgICAgICAgIGFsbEl0ZW1zLmFkZChjdXJyZW50RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICAgICAgYWxsSXRlbXMuYWRkKGN1cnJlbnRFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zIGFsc28gcmV0dXJucyBhIGxvdCBvZiBlbGVtZW50cyBmcm9tCi0gICAgICAvLyBpbXBvcnQgc3RhdGVtZW50LCB3ZQotICAgICAgLy8gb25seSBhZGQgbm9uLWltcG9ydGVkIGVsZW1lbnRzIGhlcmUuICh0cnVuZykKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gY3VycmVudEF0dHJpYnV0ZSA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXQoaSk7Ci0gICAgICAgIGlmIChjdXJyZW50QXR0cmlidXRlLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY3VycmVudEF0dHJpYnV0ZS5pc0dsb2JhbCgpICYmIGN1cnJlbnRBdHRyaWJ1dGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSkpCi0gICAgICAgICAgICBhbGxJdGVtcy5hZGQoY3VycmVudEF0dHJpYnV0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICAgICAgYWxsSXRlbXMuYWRkKGN1cnJlbnRBdHRyaWJ1dGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhbGxJdGVtczsKLSAgfQotCi0gIAotICBwcml2YXRlIHN0YXRpYyBYU0RTY2hlbWEgZ2V0QVNJU2NoZW1hTW9kZWwoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgZXh0ZW5zaW9uc1NjaGVtYVNwZWMpCi0gIHsKLSAgICBTdHJpbmcgbG9jYXRpb24gPSBleHRlbnNpb25zU2NoZW1hU3BlYy5nZXRMb2NhdGlvbigpOwotICAgIGlmICggbG9jYXRpb24gPT0gbnVsbCkKLSAgICAJcmV0dXJuIG51bGw7Ci0JWFNEU2NoZW1hIHhzZFNjaGVtYSA9IFhTREltcGwuYnVpbGRYU0RNb2RlbChsb2NhdGlvbik7Ci0gICAgCi0gICAgLy8gbm93IHRoYXQgdGhlIC54c2QgZmlsZSBpcyByZWFkLCB3ZSBjYW4gcmV0cmlldmUgdGhlIG5hbWVzcGFjZSBvZiB0aGlzIHhzZCBmaWxlCi0gICAgLy8gYW5kIHNldCB0aGUgbmFtZXNwYWNlIGZvciAncHJvcGVydGllcycKLSAgICBpZiAoIGV4dGVuc2lvbnNTY2hlbWFTcGVjLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwpewotICAgIAlleHRlbnNpb25zU2NoZW1hU3BlYy5zZXROYW1lc3BhY2VVUkkoIHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc3RvcmVTcGVjSW5QcmVmKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNjaGVtYVNwZWMpIHsKLQlpZiAocHJlZlN0b3JlID09IG51bGwpCi0JCXJldHVybjsKLQkKLQlTdHJpbmcgY3VycmVudFZhbHVlID0gcHJlZlN0b3JlLmdldFN0cmluZyhFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LlVTRVJfQURERURfRVhUX1NDSEVNQVMpOwotCVN0cmluZyBzcGVjRGVzYyA9ICIgICIgKyAiXHQiICsgc2NoZW1hU3BlYy5nZXREaXNwbGF5TmFtZSgpICsgIlx0IisKLQkJc2NoZW1hU3BlYy5nZXROYW1lc3BhY2VVUkkoKSArICJcdCIgKyBzY2hlbWFTcGVjLmdldExvY2F0aW9uKCkgKyAiXHQiICsKLQkJc2NoZW1hU3BlYy5pc0RlZmF1dFNjaGVtYSgpICsgIlx0IiArIHNjaGVtYVNwZWMuZ2V0U291cmNlSGludCgpICsgIlx0IiArCi0JCXNjaGVtYVNwZWMuaXNGcm9tQ2F0YWxvZygpOwotCWN1cnJlbnRWYWx1ZSArPSBzcGVjRGVzYyArICJcbiI7Ci0KLQlwcmVmU3RvcmUuc2V0VmFsdWUoRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeS5VU0VSX0FEREVEX0VYVF9TQ0hFTUFTLAotCQkJY3VycmVudFZhbHVlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBlZGl0U3BlY0luUHJlZihTdHJpbmcgZGlzcGxheU5hbWUsIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIG5ld1NwZWMpIHsKLQlpZiAocHJlZlN0b3JlID09IG51bGwpCi0JICByZXR1cm47Ci0JCi0JU3RyaW5nIG5ld1ZhbHVlID0gIiI7Ci0JU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IHByZWZTdG9yZS5nZXRTdHJpbmcoRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeS5VU0VSX0FEREVEX0VYVF9TQ0hFTUFTKTsKLQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjdXJyZW50VmFsdWUsICJcbiIpOwotCi0Jd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0JewotCSAgU3RyaW5nIG9uZVNwZWNEZXNjID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCSAgLy8gZ2V0IHRoZSBEaXNwbGF5IG5hbWUKLQkgIFN0cmluZ1Rva2VuaXplciBfdG9rZW5pemVyXzIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG9uZVNwZWNEZXNjLCAiXHQiKTsKLQkgIF90b2tlbml6ZXJfMi5uZXh0VG9rZW4oKTsKLQkgIFN0cmluZyBkTmFtZSA9IF90b2tlbml6ZXJfMi5uZXh0VG9rZW4oKTsKLQotCSAgaWYgKCBkTmFtZS5lcXVhbHMoZGlzcGxheU5hbWUgKSApCi0JICB7Ci0JCW9uZVNwZWNEZXNjID0gIiAgIiArICJcdCIgKyBuZXdTcGVjLmdldERpc3BsYXlOYW1lKCkgKyAiXHQiKwotCQkJbmV3U3BlYy5nZXROYW1lc3BhY2VVUkkoKSArICJcdCIgKyBuZXdTcGVjLmdldExvY2F0aW9uKCkgKyAiXHQiICsKLQkJCW5ld1NwZWMuaXNEZWZhdXRTY2hlbWEoKSArICJcdCIgKyBuZXdTcGVjLmdldFNvdXJjZUhpbnQoKSArICJcdCIgKwotCQkJbmV3U3BlYy5pc0Zyb21DYXRhbG9nKCk7CQkgIAotCSAgfQotCi0JICBuZXdWYWx1ZSArPSBvbmVTcGVjRGVzYyArICJcbiI7Ci0JfQotCXByZWZTdG9yZS5zZXRWYWx1ZShFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LlVTRVJfQURERURfRVhUX1NDSEVNQVMsIG5ld1ZhbHVlKTsKLQkKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZW1vdmVGcm9tUHJlZihTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjKSB7Ci0JaWYgKHByZWZTdG9yZSA9PSBudWxsKQotCSAgcmV0dXJuOwkgIAotCSAgCi0JU3RyaW5nIG5ld1ZhbHVlID0gIiI7Ci0JU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IHByZWZTdG9yZS5nZXRTdHJpbmcoRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeS5VU0VSX0FEREVEX0VYVF9TQ0hFTUFTKTsKLQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjdXJyZW50VmFsdWUsICJcbiIpOwotCi0Jd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0JewotCSAgU3RyaW5nIG9uZVNwZWNEZXNjID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCSAgLy8gZ2V0IHRoZSBEaXNwbGF5IG5hbWUKLQkgIFN0cmluZ1Rva2VuaXplciBfdG9rZW5pemVyXzIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG9uZVNwZWNEZXNjLCAiXHQiKTsKLQkgIF90b2tlbml6ZXJfMi5uZXh0VG9rZW4oKTsKLQkgIFN0cmluZyBkTmFtZSA9IF90b2tlbml6ZXJfMi5uZXh0VG9rZW4oKTsKLQotCSAgaWYgKCBkTmFtZS5lcXVhbHMoc3BlYy5nZXREaXNwbGF5TmFtZSgpICkgKQotCQljb250aW51ZTsKLQkgIG5ld1ZhbHVlICs9IG9uZVNwZWNEZXNjICsgIlxuIjsKLQl9Ci0JcHJlZlN0b3JlLnNldFZhbHVlKEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkuVVNFUl9BRERFRF9FWFRfU0NIRU1BUywgbmV3VmFsdWUpOwotICB9Ci0KLXN0YXRpYyBjbGFzcyBDYXRlZ29yeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7ICAgIAotICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWFbXSBleHRlbnNpb25zU2NoZW1hU3BlY3MgPSBudWxsOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIExpc3QgaW5wdXRMaXN0ID0gKExpc3QpIGlucHV0RWxlbWVudDsKLSAgICAgICAgZXh0ZW5zaW9uc1NjaGVtYVNwZWNzID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hW10pIGlucHV0TGlzdC50b0FycmF5KG5ldyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYVswXSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9uc1NjaGVtYVNwZWNzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICAgIC8vIERvIG5vdGhpbmcKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICAgIC8vIERvIG5vdGhpbmcKLQotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBjbGFzcyBDYXRlZ29yeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0gIHsKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvYXBwaW5mb19jYXRlZ29yeS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpCi0gICAgICAgIHJldHVybiAoKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKSBlbGVtZW50KS5nZXREaXNwbGF5TmFtZSgpOwotCi0gICAgICByZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgY2xhc3MgRWxlbWVudENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgTGlzdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoTGlzdCkgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgICAvLyBEbyBub3RoaW5nCi0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0gICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgICAvLyBEbyBub3RoaW5nCi0KLSAgICB9Ci0gIH0KLQotICBjbGFzcyBFbGVtZW50TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLSAgeyAgICAKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKXsKLSAgICAJICAKLSAgICAJICAvLyBXb3JrYXJvdW5kIHRyaWNrOiAodHJ1bmcpIHdlIGNyZWF0ZSBhIHRlbXBvcmFyeSBEb20gZWxlbWVudCBhbmQgcHV0IGl0IGluIHRoZSBsYWJlbCBwcm92aWRlcgotICAgIAkgIC8vIHRvIGdldCB0aGUgaW1hZ2UuCi0gICAgCSAgU3RyaW5nIG5hbWVzcGFjZSA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50KS5nZXRTY2hlbWEoKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAJICBTdHJpbmcgbmFtZSA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0gICAgCSAgRWxlbWVudCB0ZW1wRWxlbWVudCA9IHRlbXBEb2MuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbHAgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkoKS5nZXRMYWJlbFByb3ZpZGVyKG5hbWVzcGFjZSk7Ci0gICAgCSAgaWYgKGxwICE9IG51bGwpewotICAgIAkJICBJbWFnZSBpbWcgPSBscC5nZXRJbWFnZSh0ZW1wRWxlbWVudCk7Ci0gICAgCQkgIAotICAgIAkJICBpZiAoaW1nICE9IG51bGwpewotICAgIAkJCSAgcmV0dXJuIGltZzsKLSAgICAJCSAgfQotICAgIAkgIH0KLSAgICAJICByZXR1cm4gREVGQVVMVF9FTEVNRU5UX0lDT047Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggZWxlbWVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKXsKLSAgICAJICByZXR1cm4gREVGQVVMVF9BVFRSSUJVVEVfSUNPTjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgICByZXR1cm4gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnQpLmdldE5hbWUoKTsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gKQotICAgICAgICByZXR1cm4gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotICAgICAgcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gY2xvc2UoKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGVuYWJsZUJ1dHRvbnMoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZCh2YWx1ZSk7Ci0gICAgYWRkQnV0dG9uLnNldEVuYWJsZWQodmFsdWUpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHZhbHVlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0FkZE5ld0NhdGVnb3J5RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vQWRkTmV3Q2F0ZWdvcnlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1Njg3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vQWRkTmV3Q2F0ZWdvcnlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0U2luZ2xlRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBBZGROZXdDYXRlZ29yeURpYWxvZyBleHRlbmRzIERpYWxvZwotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0xBQkVMID0gTWVzc2FnZXMuX1VJX0xBQkVMX1NDSEVNQTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfTEFCRUwgPSBNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRTsgIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX0ZST01fV09SS1NQQUNFID0gTWVzc2FnZXMuX1VJX0xBQkVMX1dPUktTUEFDRTsgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfRlJPTV9DQVRBTE9HID0gTWVzc2FnZXMuX1VJX0xBQkVMX0NBVEFMT0c7ICAKLSAgcHJpdmF0ZSBTdHJpbmcgZGlhbG9nVGl0bGUgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQUREX0NBVEVHT1JZOwotICAgIAotICBwcm90ZWN0ZWQgTWVudU1hbmFnZXIgYnJvd3NlTWVudTsKLSAgcHJvdGVjdGVkIExhYmVsIG5hbWU7Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVUZXh0OwotICBwcm90ZWN0ZWQgTGFiZWwgc2NoZW1hOwotICBwcm90ZWN0ZWQgQ0xhYmVsIHNjaGVtYURpc3BsYXllcjsKLSAgcHJvdGVjdGVkIFRvb2xCYXIgYnJvd3NlVG9vbEJhcjsKLSAgcHJvdGVjdGVkIFRvb2xJdGVtIGJyb3dzZUl0ZW07Ci0gIHByb3RlY3RlZCBCdXR0b24gc2VhcmNoQ2F0YWxvZzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBzZWFyY2hXb3Jrc3BhY2U7ICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBzb3VyY2VzQ29tcG9zaXRlOwotCi0gIHByb3RlY3RlZCBMaXN0IGludmFsaWROYW1lczsKLSAgCi0gIC8vIFRPRE8gKGNzKSByZW5hbWUgdGhpcyBmaWVsZCB0byBleHRlbnNpb25TY2hlbWFMb2NhdGlvbiBpbiBXVFAgMi4wCi0gIHByb3RlY3RlZCBTdHJpbmcgYXBwSW5mb1NjaGVtYUxvY2F0aW9uOwotICBwcm90ZWN0ZWQgU3RyaW5nIGNhdGVnb3J5TmFtZTsKLSAgcHJvdGVjdGVkIENMYWJlbCBlcnJEaXNwbGF5ZXI7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzQ2F0ZWdvcnlOYW1lVmFsaWQ7Ci0gIHByb3RlY3RlZCBib29sZWFuIGZyb21DYXRhbG9nOwotICAKLSAgcHJpdmF0ZSBib29sZWFuIGNhbk9LID1mYWxzZTsgCi0gIAotICAvKiogRWl0aGVyIHRoZSBsb2NhdGlvbiBpZiBjb21lIGZyb20gd29ya3NwYWNlIG9yIG5hbWVzcGFjZSBpZiBjb21lIGZyb20KLSAgICogCVhNTCBDYXRhbG9nICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHNvdXJjZTsKLQotICBwdWJsaWMgQWRkTmV3Q2F0ZWdvcnlEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gIH0KLQotICBwdWJsaWMgQWRkTmV3Q2F0ZWdvcnlEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSkKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICB0aGlzLmRpYWxvZ1RpdGxlID0gZGlhbG9nVGl0bGU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiByZWNlaXZlIGEgTGlzdCBvZiBuYW1lcyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgY2F0ZWdvcnkgbGlzdAotICAgKiAKLSAgICogQHBhcmFtIHVuYXZhaWxOYW1lcwotICAgKiAgICAgICAgICBBcnJheSBvZiB1bnZhaWxhYmxlIG5hbWVzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVbmF2YWlsYWJsZUNhdGVnb3J5TmFtZXMoTGlzdCB1bmF2YWlsTmFtZXMpCi0gIHsKLSAgICBpbnZhbGlkTmFtZXMgPSB1bmF2YWlsTmFtZXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5ld0NhdGVnb3J5TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gY2F0ZWdvcnlOYW1lLnRyaW0oKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnlMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gYXBwSW5mb1NjaGVtYUxvY2F0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeUxvY2F0aW9uKFN0cmluZyBzKXsKLQkgIGFwcEluZm9TY2hlbWFMb2NhdGlvbiA9IHM7Ci0gIH0KLSAgCi0gIC8qKiBAZGVwcmVjYXRlZCAqLwotICBwdWJsaWMgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgZ2V0RXh0ZW5zaW9uc1NjaGVtYVNwZWMoKXsKLQlTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzY2hlbWFTcGVjID0gbmV3IFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKCk7Ci0Jc2NoZW1hU3BlYy5zZXREaXNwbGF5TmFtZShnZXROZXdDYXRlZ29yeU5hbWUoKSk7Ci0Jc2NoZW1hU3BlYy5zZXRMb2NhdGlvbihnZXRDYXRlZ29yeUxvY2F0aW9uKCkpOwotCQotCXJldHVybiBzY2hlbWFTcGVjOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHNldENhdGVnb3J5TmFtZShTdHJpbmcgY2F0ZWdvcnlOYW1lKSB7Ci0JdGhpcy5jYXRlZ29yeU5hbWUgPSBjYXRlZ29yeU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRGcm9tQ2F0YWxvZygpIHsKLQlyZXR1cm4gZnJvbUNhdGFsb2c7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEZyb21DYXRhbG9nKGJvb2xlYW4gYil7Ci0JZnJvbUNhdGFsb2cgPSBiOwkKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkKLSAgewotCXJldHVybiBzb3VyY2U7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29udHJvbCByZXN1bHQgPSBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLSAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChjYW5PSyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIHJlZHVuZGFudCBtZXRob2QgdG8gaW1wcm92ZSBzcGVlZCAoYWNjb3JkaW5nIHRvIHRoZSBjb21waWxlcikKLSAgcHJvdGVjdGVkIEJ1dHRvbiBnZXRCdXR0b24oaW50IGlkKSB7Ci0gICAgcmV0dXJuIHN1cGVyLmdldEJ1dHRvbihpZCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGdldFNoZWxsKCkuc2V0VGV4dChkaWFsb2dUaXRsZSk7Ci0KLSAgICBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICBsYXlvdXQubWFyZ2luVG9wID0gMTA7Ci0gICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBtYWluQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLndpZHRoSGludCA9IDQwMDsKLQotICAgIG1haW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIExpbmUgMSwgbmFtZQotICAgIG5hbWUgPSBuZXcgTGFiZWwobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIG5hbWUuc2V0VGV4dChOQU1FX0xBQkVMKTsKLQotICAgIG5hbWVUZXh0ID0gbmV3IFRleHQobWFpbkNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotICAgIG5hbWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOyAgICAKLSAgICBpZiAoY2F0ZWdvcnlOYW1lICE9IG51bGwpCi0gICAgCW5hbWVUZXh0LnNldFRleHQoY2F0ZWdvcnlOYW1lKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5hbWVUZXh0LAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkFERF9DQVRFR09SWV9fTkFNRSk7ICAgICAKLQotICAgIAotCi0gICAgLy8gTGluZSAyLCBzY2hlbWEKLSAgICBzY2hlbWEgPSBuZXcgTGFiZWwobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHNjaGVtYS5zZXRUZXh0KFNDSEVNQV9MQUJFTCk7Ci0KLSAgICBzY2hlbWFEaXNwbGF5ZXIgPSBuZXcgQ0xhYmVsKG1haW5Db21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLSAgICBzY2hlbWFEaXNwbGF5ZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgaWYgKHNvdXJjZSAhPSBudWxsKQotICAgIHsKLSAgICAJaWYgKGZyb21DYXRhbG9nKQotICAgIAkJc2NoZW1hRGlzcGxheWVyLnNldEltYWdlKAotICAgIAkJCQlYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL3htbGNhdGFsb2dfb2JqLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIAllbHNlCi0gICAgCQlzY2hlbWFEaXNwbGF5ZXIuc2V0SW1hZ2UoCi0gICAgCQkJCVhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERmlsZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAJc2NoZW1hRGlzcGxheWVyLnNldFRleHQoc291cmNlKTsKLSAgICAJCi0gICAgfQotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2NoZW1hRGlzcGxheWVyLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkFERF9DQVRFR09SWV9fU0NIRU1BKTsgCi0gICAgCi0gICAgaWYgKGNhdGVnb3J5TmFtZSAhPSBudWxsICYmIHNvdXJjZSAhPSBudWxsKQotICAgIAljYW5PSyA9IHRydWU7Ci0gICAgCi0gICAgLy8gTGluZSAzLCBzY2hlbWEgc2VsZWN0aW9uIGJ1dHRvbnMgICAgICAgICAgICAKLSAgICBCdXR0b24gaGlkZGVuID0gbmV3IEJ1dHRvbihtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgaGlkZGVuLnNldFZpc2libGUoZmFsc2UpOyAgICAKLSAgICAgICAgICAgCi0gICAgc291cmNlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIFJvd0xheW91dCBzb3VyY2VzTGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOwotICAKLSAgICBzb3VyY2VzQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0gICAgc291cmNlc0NvbXBvc2l0ZS5zZXRMYXlvdXQoc291cmNlc0xheW91dCk7Ci0gICAgCi0gICAgc2VhcmNoV29ya3NwYWNlID0gbmV3IEJ1dHRvbihzb3VyY2VzQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgc2VhcmNoV29ya3NwYWNlLnNldFRleHQoU0VMRUNUX0ZST01fV09SS1NQQUNFKTsKLSAgICAgICAgCi0gICAgc2VhcmNoQ2F0YWxvZyA9IG5ldyBCdXR0b24oc291cmNlc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHNlYXJjaENhdGFsb2cuc2V0VGV4dChTRUxFQ1RfRlJPTV9DQVRBTE9HKTsKLSAgICAKLSAgICBzZWFyY2hXb3Jrc3BhY2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgIHsKLSAgICAJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAJewotICAgIAkJZmluYWwgU3RyaW5nIFhTRF9GSUxFX0VYVEVOU0lPTiA9ICIueHNkIjsgLy8kTk9OLU5MUy0xJCAgIAkgICAgCi0gICAgCSAgICAKLSAgICAJICAgICAgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBudWxsLCB0cnVlKTsKLSAgICAJICAgICAgZGlhbG9nLmFkZEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgWFNEX0ZJTEVfRVhURU5TSU9OIH0pOwotICAgIAkgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgCSAgICAgIGRpYWxvZy5zZXRUaXRsZShNZXNzYWdlcy5fVUlfTEFCRUxfU0VMRUNUX1hTRF9GSUxFKTsKLSAgICAJICAgICAgZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuX1VJX0RFU0NSSVBUSU9OX0NIT09TRV9YU0RfRklMRSk7Ci0KLSAgICAJICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotICAgIAkgICAgICB7Ci0gICAgCSAgICAgICAgSUZpbGUgYXBwSW5mb1NjaGVtYUZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotICAgIAkgICAgICAgIGlmIChhcHBJbmZvU2NoZW1hRmlsZSAhPSBudWxsKQotICAgIAkgICAgICAgIHsKLSAgICAJICAgICAgICAgIC8vIHJlbW92ZSBsZWFkaW5nIHNsYXNoIGZyb20gdGhlIHZhbHVlIHRvIGF2b2lkIHRoZQotICAgIAkgICAgICAgICAgLy8gd2hvbGUgbGVhZGluZyBzbGFzaCBhbWJpZ3VpdHkgcHJvYmxlbQotICAgIAkgICAgICAgICAgU3RyaW5nIHVyaSA9IGFwcEluZm9TY2hlbWFGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAJICAgICAgICAgIHdoaWxlICh1cmkuc3RhcnRzV2l0aCgiLyIpIHx8IHVyaS5zdGFydHNXaXRoKCJcXCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIAkgICAgICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKDEpOwotICAgIAkgICAgICAgICAgfQotICAgIAkgICAgICAgICAgYXBwSW5mb1NjaGVtYUxvY2F0aW9uID0gdXJpLnRvU3RyaW5nKCk7Ci0gICAgCSAgICAgICAgICBzb3VyY2UgPSB1cmk7Ci0gICAgCSAgICAgICAgICBmcm9tQ2F0YWxvZyA9IGZhbHNlOwotCi0gICAgCSAgICAgICAgICBhcHBJbmZvU2NoZW1hTG9jYXRpb24gPSAiZmlsZTovLyIgKyBQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiLyIgKyBhcHBJbmZvU2NoZW1hTG9jYXRpb247IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIAkgICAgICAgICAgLy8gVE9ETy4uLiBiZSBjYXJlZnVsIGhvdyB3ZSBjb25zdHJ1Y3QgdGhlIGxvY2F0aW9uCi0gICAgCSAgICAgICAgICAvLyBVTklYIHJlbGF0ZWQgaXNzdWVzIGhlcmUKLQotICAgIAkgICAgICAgICAgc2NoZW1hRGlzcGxheWVyLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERmlsZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAJICAgICAgICAgIHNjaGVtYURpc3BsYXllci5zZXRUZXh0KHVyaSk7Ci0KLSAgICAJICAgICAgICAgIC8vIEVuYWJsZSB0aGUgT0sgYnV0dG9uIGlmIHdlIHNob3VsZC4uCi0gICAgCSAgICAgICAgICBpZiAoaXNDYXRlZ29yeU5hbWVWYWxpZCkKLSAgICAJICAgICAgICAgIHsKLSAgICAJICAgICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgCSAgICAgICAgICAgIGVyckRpc3BsYXllci5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkgICAgICAgICAgICBlcnJEaXNwbGF5ZXIuc2V0SW1hZ2UobnVsbCk7Ci0gICAgCSAgICAgICAgICB9Ci0gICAgCSAgICAgICAgfQotICAgIAkgICAgICB9Ci0gICAgCSAgICB9Ci0gICAgCX0KLSAgICAKLSAgICApOwotICAgIAotICAgIHNlYXJjaENhdGFsb2cuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgIHsKLSAgICAJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAJewotICAgIAkgICAgICBTZWxlY3RGcm9tQ2F0YWxvZ0RpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0RnJvbUNhdGFsb2dEaWFsb2coZ2V0U2hlbGwoKSk7Ci0gICAgCSAgICAgIC8vIGRpYWxvZy5vcGVuKCk7Ci0gICAgCSAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykKLSAgICAJICAgICAgewotICAgIAkgICAgICAgIGFwcEluZm9TY2hlbWFMb2NhdGlvbiA9IGRpYWxvZy5nZXRDdXJyZW50U2VsZWN0aW9uTG9jYXRpb24oKTsKLSAgICAJICAgICAgICBzb3VyY2UgPSBkaWFsb2cuZ2V0Q3VycmVudFNlbGVjdGlvbk5hbWVzcGFjZSgpOwotICAgIAkgICAgICAgIGZyb21DYXRhbG9nID0gdHJ1ZTsKLQotICAgIAkgICAgICAgIHNjaGVtYURpc3BsYXllci5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL3htbGNhdGFsb2dfb2JqLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIAkgICAgICAgIHNjaGVtYURpc3BsYXllci5zZXRUZXh0KGRpYWxvZy5nZXRDdXJyZW50U2VsZWN0aW9uTmFtZXNwYWNlKCkpOwotCi0gICAgCSAgICAgICAgLy8gRW5hYmxlIHRoZSBPSyBidXR0b24gaWYgd2Ugc2hvdWxkLi4KLSAgICAJICAgICAgICBpZiAoaXNDYXRlZ29yeU5hbWVWYWxpZCAmJiAhYXBwSW5mb1NjaGVtYUxvY2F0aW9uLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAJICAgICAgICB7Ci0gICAgCSAgICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAJICAgICAgICAgIGVyckRpc3BsYXllci5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkgICAgICAgICAgZXJyRGlzcGxheWVyLnNldEltYWdlKG51bGwpOyAgICAJICAgICAgICAKLSAgICAJICAgICAgfQotICAgIAkgICAgfQotICAgIAl9Ci0gICAgfSk7Ci0gICAgCi0KLSAgICAvLyBUT0RPOiBTaG91bGQgYmUgYWJsZSB0byBnZXQgdGhlIGltYWdlIGZyb20gdGhlIFhNTCBwbHVnaW4uIERvbid0IG5lZWQKLSAgICAvLyB0byBjb3B5IHRvIFhTREVkaXRvciBpY29ucyBmb2xkZXIgbGlrZSB0aGlzLgotCi0KLSAgICAvLyBDb21wb3NpdGUgZXJyQ29tcCA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIC8vIGVyckNvbXAuc2V0QmFja2dyb3VuZChvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIC8vIGVyckNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIGVyckRpc3BsYXllciA9IG5ldyBDTGFiZWwobWFpbkNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIC8vIGVyckRpc3BsYXllci5zZXRUZXh0KCJhYmQiKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMzsKLSAgICBlcnJEaXNwbGF5ZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICAvLyBlcnJDb21wLnNldExheW91dERhdGEoZ2QpOwotICAgIC8vIGVyckRpc3BsYXllci5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAvLyBlcnJNc2dDb250YWluZXIuc2V0Q29udGVudChlcnJEaXNwbGF5ZXIpOwotCi0gICAgbmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkKLSAgICB7Ci0gICAgICAvLyB0cmFjayB0aGUgbmFtZVRleHQgYW5kIGVuYWJsZS9kaXNhYmxlIHRoZSBPSyBidXR0b24gYWNjb3JkaW5nbHkKLSAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLSAgICAgIHsKLSAgICAgICAgY2F0ZWdvcnlOYW1lID0gbmFtZVRleHQuZ2V0VGV4dCgpOwotCi0gICAgICAgIC8vIG5hbWUgaXMgaW4gdGhlIGludmFsaWQgTGlzdAotICAgICAgICBpZiAoaW52YWxpZE5hbWVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaW52YWxpZE5hbWVzLmNvbnRhaW5zKGNhdGVnb3J5TmFtZS50cmltKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzQ2F0ZWdvcnlOYW1lVmFsaWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgZXJyRGlzcGxheWVyLnNldFRleHQoTWVzc2FnZXMuX1VJX0VSUk9SX05BTUVfQUxSRUFEWV9VU0VEKTsKLSAgICAgICAgICAgIGVyckRpc3BsYXllci5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL2Vycm9yX3N0X29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbmFtZSBpcyBlbXB0eSBzdHJpbmcKLSAgICAgICAgaWYgKGNhdGVnb3J5TmFtZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBpc0NhdGVnb3J5TmFtZVZhbGlkID0gZmFsc2U7Ci0KLSAgICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgZXJyRGlzcGxheWVyLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgZXJyRGlzcGxheWVyLnNldEltYWdlKG51bGwpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEVuYWJsZSB0aGUgT2sgYnV0dG9uIGlmIHRoZSBsb2NhdGlvbiBmaWVsZCBBTkQgdGhlIG5hbWUgZmllbGQgYXJlIG5vdAotICAgICAgICAgKiBlbXB0eQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCFjYXRlZ29yeU5hbWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgaXNDYXRlZ29yeU5hbWVWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgZXJyRGlzcGxheWVyLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgZXJyRGlzcGxheWVyLnNldEltYWdlKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcHBJbmZvU2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiAhYXBwSW5mb1NjaGVtYUxvY2F0aW9uLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkKLSAgewotICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vQ2F0ZWdvcnlQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0NhdGVnb3J5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlYjY0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vQ2F0ZWdvcnlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLQotcHVibGljIGNsYXNzIENhdGVnb3J5UHJvdmlkZXIKLXsKLSAgcHJpdmF0ZSBJQ2F0YWxvZyBzeXN0ZW1DYXRhbG9nOwotCi0gIHB1YmxpYyBDYXRlZ29yeVByb3ZpZGVyKCkKLSAgewotICAgIAotICB9Ci0gIAotICAvKioKLSAgICogRXh0ZW5kZXJzIHNob3VsZCBpbXBsZW1lbnQgYW5kIHJldHVybiBhIGxpc3Qgb2YgCi0gICAqIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldENhdGVnb3JpZXMoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEhlbHBlciBtZXRob2QgdG8gZmluZCB0aGUgcGh5c2ljYWwgbG9jYXRpb24gb2YgdGhlIHNjaGVtYQotICAgKiBpbiB0aGUgWE1MIENhdGFsb2cKLSAgICogQHBhcmFtIG5hbWVzcGFjZVVSSQotICAgKiBAcmV0dXJuIHBoeXNpY2FsIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgbG9jYXRlRmlsZVVzaW5nQ2F0YWxvZyhTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgcmV0cmlldmVDYXRhbG9nKCk7Ci0KLSAgICBJQ2F0YWxvZ0VudHJ5W10gZW50cmllcyA9IHN5c3RlbUNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGVudHJpZXNbaV0uZ2V0S2V5KCkuZXF1YWxzKG5hbWVzcGFjZVVSSSkpCi0gICAgICAgIHJldHVybiBlbnRyaWVzW2ldLmdldFVSSSgpOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJldHJpZXZlQ2F0YWxvZygpCi0gIHsKLSAgICBpZiAoc3lzdGVtQ2F0YWxvZyAhPSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgSUNhdGFsb2cgZGVmYXVsdENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotICAgIElOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGRlZmF1bHRDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElOZXh0Q2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW2ldOwotICAgICAgSUNhdGFsb2cgcmVmZXJlbmNlZENhdGFsb2cgPSBjYXRhbG9nLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0gICAgICBpZiAocmVmZXJlbmNlZENhdGFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKFhNTENvcmVQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgc3lzdGVtQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjhlMThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuVHJlZUNvbnRlbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5EZWZhdWx0TGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLk5vZGVFZGl0b3JDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUVkaXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi1wdWJsaWMgY2xhc3MgRE9NRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIEV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSB7fTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0ge307Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxucyI7IC8vJE5PTi1OTFMKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTk9ERV9LRVkgPSAidGV4dCgpIjsgLy8kTk9OLU5MUwotCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRJdGVtcyhPYmplY3QgaW5wdXQpCi0gIHsKLSAgICBIYXNoTWFwIHJlc3VsdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgaW5wdXQ7Ci0gICAgICAKLSAgICAgIC8vIGhlcmUgd2UgY29tcHV0ZSBpdGVtcyBmb3IgdGhlIGF0dHJpYnV0ZXMgdGhhdCBwaHlzaWNhbGx5IGluIHRoZSBkb2N1bWVudCAKLSAgICAgIC8vCi0gICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0gICAgICAgIGlmICghWE1MTlMuZXF1YWxzKGF0dHIuZ2V0TmFtZSgpKSAmJiAhWE1MTlMuZXF1YWxzKGF0dHIuZ2V0UHJlZml4KCkpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdE1hcC5wdXQoYXR0ci5nZXROYW1lKCksIERPTUV4dGVuc2lvbkl0ZW0uY3JlYXRlSXRlbUZvckVsZW1lbnRBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cikpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgIAotICAgICAgLy8gaGVyZSB3ZSBjb21wdXRlIGFuIGl0ZW0gZm9yIHRoZSB0ZXh0IG5vZGUgdGhhdCBpcyBwaHlzaWNhbGx5IGluIHRoZSBkb2N1bWVudCAKLSAgICAgIC8vICAgICAgCi0gICAgICBTdHJpbmcgdGV4dE5vZGVWYWx1ZSA9IG5ldyBUcmVlQ29udGVudEhlbHBlcigpLmdldE5vZGVWYWx1ZShlbGVtZW50KTsKLSAgICAgIGlmICh0ZXh0Tm9kZVZhbHVlICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgcmVzdWx0TWFwLnB1dChURVhUX05PREVfS0VZLCBET01FeHRlbnNpb25JdGVtLmNyZWF0ZUl0ZW1Gb3JFbGVtZW50VGV4dChlbGVtZW50KSk7Ci0gICAgICB9ICAKLSAgICAgIAotICAgICAgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICBpZiAobW9kZWxRdWVyeSAhPSBudWxsKQotICAgICAgewotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gaGVyZSB3ZSBjb21wdXRlIGl0ZW1zIGZvciB0aGUgYXR0cmlidXRlcyB0aGF0IG1heSBiZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgYWNjb3JkaW5nIHRvIHRoZSBncmFtbWFyIAotICAgICAgICAgIC8vICAgICAgICAgICAKLSAgICAgICAgICBMaXN0IGxpc3QgPSBtb2RlbFF1ZXJ5LmdldEF2YWlsYWJsZUNvbnRlbnQoZWxlbWVudCwgZWQsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbilpLm5leHQoKTsKLSAgICAgICAgICAgICAgaWYgKGFkICE9IG51bGwgJiYgcmVzdWx0TWFwLmdldChhZC5nZXROb2RlTmFtZSgpKSA9PSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0TWFwLnB1dChhZC5nZXROb2RlTmFtZSgpLCBET01FeHRlbnNpb25JdGVtLmNyZWF0ZUl0ZW1Gb3JFbGVtZW50QXR0cmlidXRlKGVsZW1lbnQsIGFkKSk7Ci0gICAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHJlc3VsdE1hcC5nZXQoVEVYVF9OT0RFX0tFWSkgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBoZXJlIHdlIGNvbXB1dGUgYW4gaXRlbSBmb3IgdGhlIHRleHQgbm9kZSB0aGF0IG1heSBiZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgYWNjb3JkaW5nIHRvIHRoZSBncmFtbWFyIAotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBjb250ZW50VHlwZSA9IGVkLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBIHx8IGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHRNYXAucHV0KFRFWFRfTk9ERV9LRVksIERPTUV4dGVuc2lvbkl0ZW0uY3JlYXRlSXRlbUZvckVsZW1lbnRUZXh0KGVsZW1lbnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9ICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gcmVzdWx0TWFwLnZhbHVlcygpOwotICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgZWRpdG9yIGluZm9ybWF0aW9uIGZvciBlYWNoIGl0ZW0KLSAgICAgIC8vCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgaW5pdFByb3BlcnR5RWRpdG9yQ29uZmlndXJhdGlvbigoRE9NRXh0ZW5zaW9uSXRlbSkgaS5uZXh0KCkpOwotICAgICAgfQotICAgICAgRE9NRXh0ZW5zaW9uSXRlbVtdIGl0ZW1zID0gbmV3IERPTUV4dGVuc2lvbkl0ZW1bY29sbGVjdGlvbi5zaXplKCldOwotICAgICAgcmVzdWx0TWFwLnZhbHVlcygpLnRvQXJyYXkoaXRlbXMpOwotICAgICAgCi0gICAgICAvLyBoZXJlIHdlIHNvcnQgdGhlIGxpc3QgYWxwaGFiZXRpY2FsbHkKLSAgICAgIC8vCi0gICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkKLSAgICAgIHsgIAotICAgICAgICBDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKQotICAgICAgICAgIHsgICAgICAgICAKLSAgICAgICAgICAgIERPTUV4dGVuc2lvbkl0ZW0gYSA9IChET01FeHRlbnNpb25JdGVtKWFyZzA7Ci0gICAgICAgICAgICBET01FeHRlbnNpb25JdGVtIGIgPSAoRE9NRXh0ZW5zaW9uSXRlbSlhcmcxOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBiZWdpbiBzcGVjaWFsIGNhc2UgdG8gZW5zdXJlICd0ZXh0IG5vZGVzJyBjb21lIGxhc3QKLSAgICAgICAgICAgIGlmIChhLmlzVGV4dFZhbHVlKCkgJiYgIWIuaXNUZXh0VmFsdWUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIDE7ICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChiLmlzVGV4dFZhbHVlKCkgJiYgIWEuaXNUZXh0VmFsdWUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAvLyBlbmQgc3BlY2lhbCBjYXNlCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgICAgICByZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGEuZ2V0TmFtZSgpLCBiLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIEFycmF5cy5zb3J0KGl0ZW1zLCBjb21wYXJhdG9yKTsKLSAgICAgIH0gIAotICAgICAgcmV0dXJuIGl0ZW1zOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEF0dHIpCi0gICAgewotICAgICAgQXR0ciBhdHRyID0gKEF0dHIpIGlucHV0OwotICAgICAgRE9NRXh0ZW5zaW9uSXRlbSBpdGVtID0gRE9NRXh0ZW5zaW9uSXRlbS5jcmVhdGVJdGVtRm9yQXR0cmlidXRlVGV4dChhdHRyLmdldE93bmVyRWxlbWVudCgpLCBhdHRyKTsKLSAgICAgIERPTUV4dGVuc2lvbkl0ZW1bXSBpdGVtcyA9IHtpdGVtfTsKLSAgICAgIHJldHVybiBpdGVtczsKLSAgICB9Ci0gICAgcmV0dXJuIEVNUFRZX0FSUkFZOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBpdGVtKQotICB7Ci0gICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBET01FeHRlbnNpb25JdGVtKQotICAgIHsKLSAgICAgIHJldHVybiAoKERPTUV4dGVuc2lvbkl0ZW0pIGl0ZW0pLmdldE5hbWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKE9iamVjdCBpdGVtKQotICB7Ci0gICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBET01FeHRlbnNpb25JdGVtKQotICAgIHsKLSAgICAgIHJldHVybiAoKERPTUV4dGVuc2lvbkl0ZW0pIGl0ZW0pLmdldFZhbHVlKCk7Ci0gICAgfQotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFBvc3NpYmxlVmFsdWVzKE9iamVjdCBpdGVtKQotICB7Ci0gICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBET01FeHRlbnNpb25JdGVtKQotICAgIHsKLSAgICAgIHJldHVybiAoKERPTUV4dGVuc2lvbkl0ZW0pIGl0ZW0pLmdldFBvc3NpYmxlVmFsdWVzKCk7Ci0gICAgfQotICAgIHJldHVybiBFTVBUWV9TVFJJTkdfQVJSQVk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0UHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uKERPTUV4dGVuc2lvbkl0ZW0gaXRlbSkKLSAgewotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBpdGVtLmdldE5hbWVzcGFjZSgpOwotICAgIFN0cmluZyBuYW1lID0gaXRlbS5nZXROYW1lKCk7Ci0gICAgU3RyaW5nIHBhcmVudE5hbWUgPSBpdGVtLmdldFBhcmVudE5hbWUoKTsKLSAgICBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbnVsbDsKLSAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgewotICAgICAgLy8gVE9ETyAoY3MpIHJlbW92ZSByZWZlcmVuY2UgdG8gWFNERWRpdG9yUGx1Z2luLi4uIG1ha2UgZ2VuZXJpYwotICAgICAgLy8gcGVyaGFwcyBwdXNoIGRvd24gdGhlIHhtbC51aSA/Ci0gICAgICAvLwotICAgICAgTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSByZWdpc3RyeSA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Tm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSgpOwotICAgICAgTm9kZUVkaXRvclByb3ZpZGVyIHByb3ZpZGVyPSByZWdpc3RyeS5nZXROb2RlRWRpdG9yUHJvdmlkZXIobmFtZXNwYWNlKTsgICAgICAKLSAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb25maWd1cmF0aW9uID0gcHJvdmlkZXIuZ2V0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24ocGFyZW50TmFtZSwgbmFtZSk7Ci0gICAgICAgIGlmIChjb25maWd1cmF0aW9uICE9IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0UGFyZW50Tm9kZShpdGVtLmdldFBhcmVudE5vZGUoKSk7Ci0gICAgICAgICAgaWYgKGl0ZW0uZ2V0Tm9kZSgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXROb2RlKGl0ZW0uZ2V0Tm9kZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICBTdHJpbmdbXSB2YWx1ZXMgPSBpdGVtLmdldFBvc3NpYmxlVmFsdWVzKCk7Ci0gICAgaWYgKHZhbHVlcyAhPSBudWxsICYmIHZhbHVlcy5sZW5ndGggPiAxKQotICAgIHsKLSAgICAgIGNvbmZpZ3VyYXRpb24gPSBuZXcgRGVmYXVsdExpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbih2YWx1ZXMpOwotICAgIH0KLSAgICAKLSAgICAvLyBOb3RlIHRoYXQgaXQgSVMgZXhwZWN0ZWQgdGhhdCB0aGUgY29uZmlnYXJhdGlvbiBtYXkgYmUgbnVsbAotICAgIC8vCi0gICAgaXRlbS5zZXRQcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25JdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjUwNTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuVHJlZUNvbnRlbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZVRleHRWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1jbGFzcyBET01FeHRlbnNpb25JdGVtIGV4dGVuZHMgRXh0ZW5zaW9uSXRlbQotewotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgS0lORF9FTEVNRU5UX0FUVFIgPSAxOwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgS0lORF9FTEVNRU5UX1RFWFQgPSAyOwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgS0lORF9FTEVNRU5UX0NNQVRUUklCVVRFID0gMzsKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEtJTkRfQVRUUl9URVhUID0gNDsKLSAgaW50IGtpbmQ7Ci0gIEF0dHIgYXR0cmlidXRlOwotICBFbGVtZW50IHBhcmVudDsKLSAgQ01Ob2RlIGNtTm9kZTsKLQotICBwcml2YXRlIERPTUV4dGVuc2lvbkl0ZW0oaW50IGtpbmQsIEVsZW1lbnQgcGFyZW50LCBBdHRyIG5vZGUsIENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIHRoaXMuYXR0cmlidXRlID0gbm9kZTsKLSAgICB0aGlzLmNtTm9kZSA9IGNtTm9kZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNUZXh0VmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIGtpbmQgPT0gS0lORF9FTEVNRU5UX1RFWFQgfHwga2luZCA9PSBLSU5EX0FUVFJfVEVYVDsKLSAgfQotCi0gIHN0YXRpYyBET01FeHRlbnNpb25JdGVtIGNyZWF0ZUl0ZW1Gb3JFbGVtZW50VGV4dChFbGVtZW50IHBhcmVudCkKLSAgewotICAgIHJldHVybiBuZXcgRE9NRXh0ZW5zaW9uSXRlbShLSU5EX0VMRU1FTlRfVEVYVCwgcGFyZW50LCBudWxsLCBudWxsKTsKLSAgfQotCi0gIHN0YXRpYyBET01FeHRlbnNpb25JdGVtIGNyZWF0ZUl0ZW1Gb3JFbGVtZW50QXR0cmlidXRlKEVsZW1lbnQgcGFyZW50LCBBdHRyIGF0dHJpYnV0ZSkKLSAgewotICAgIHJldHVybiBuZXcgRE9NRXh0ZW5zaW9uSXRlbShLSU5EX0VMRU1FTlRfQVRUUiwgcGFyZW50LCBhdHRyaWJ1dGUsIG51bGwpOwotICB9Ci0KLSAgc3RhdGljIERPTUV4dGVuc2lvbkl0ZW0gY3JlYXRlSXRlbUZvckVsZW1lbnRBdHRyaWJ1dGUoRWxlbWVudCBwYXJlbnQsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpCi0gIHsKLSAgICBpZiAoYWQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm51bGwhIik7Ci0gICAgfQotICAgIHJldHVybiBuZXcgRE9NRXh0ZW5zaW9uSXRlbShLSU5EX0VMRU1FTlRfQ01BVFRSSUJVVEUsIHBhcmVudCwgbnVsbCwgYWQpOwotICB9Ci0KLSAgc3RhdGljIERPTUV4dGVuc2lvbkl0ZW0gY3JlYXRlSXRlbUZvckF0dHJpYnV0ZVRleHQoRWxlbWVudCBwYXJlbnQsIEF0dHIgYXR0cmlidXRlKQotICB7Ci0gICAgcmV0dXJuIG5ldyBET01FeHRlbnNpb25JdGVtKEtJTkRfQVRUUl9URVhULCBwYXJlbnQsIGF0dHJpYnV0ZSwgbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICAgIGNhc2UgS0lORF9BVFRSX1RFWFQgOiB7Ci0gICAgICAgIHJlc3VsdCA9ICJ2YWx1ZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfQVRUUiA6IHsKLSAgICAgICAgcmVzdWx0ID0gYXR0cmlidXRlLmdldE5hbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9DTUFUVFJJQlVURSA6IHsKLSAgICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbU5vZGU7Ci0gICAgICAgIHJlc3VsdCA9IGFkLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfVEVYVCA6IHsKLSAgICAgICAgcmVzdWx0ID0gInRleHQgdmFsdWUiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLSAgewotICAgIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgICBjYXNlIEtJTkRfQVRUUl9URVhUIDoKLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX0FUVFIgOiB7Ci0gICAgICAgIC8vIG5vdGUgaW50ZW50aW9uYWwgZmFsbC10aHJ1ISEKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgIH0KLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX0NNQVRUUklCVVRFIDogewotICAgICAgICAvLyBDUyA6IG9uZSB3b3VsZCB0aGluayB0aGF0IHdlJ2QganVzdCBuZWVkIHRvIHJldHVybiAiIiBoZXJlCi0gICAgICAgIC8vIGJ1dCBhZnRlciBlZGl0aW5nIGEgaXRlbSBvZiB0aGlzIGtpbmQgYW5kIGdpdmluZyBpdCB2YWx1ZQotICAgICAgICAvLyB0aGUgbGlzdCBvZiBpdGVtJ3MgZG9lc24ndCBnZXQgcmVjb21wdXRlZC4uIHNvIHdlIG5lZWQgdG8gdHJpY2sKLSAgICAgICAgLy8gb25lIG9mIHRoZXNlIGl0ZW1zIHRvIGJlaGF2ZSBsaWtlIHRoZSBLSU5EX0VMRU1FTlRfQVRUUiBjYXNlCi0gICAgICAgIC8vCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IHBhcmVudC5nZXRBdHRyaWJ1dGUoY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICByZXR1cm4gKHZhbHVlICE9IG51bGwpID8gdmFsdWUgOiAiIjsKLSAgICAgIH0KLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX1RFWFQgOiB7Ci0gICAgICAgIHJldHVybiBuZXcgVHJlZUNvbnRlbnRIZWxwZXIoKS5nZXRFbGVtZW50VGV4dFZhbHVlKHBhcmVudCk7ICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotICAKLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UG9zc2libGVWYWx1ZXMoKQotICB7Ci0gICAgU3RyaW5nW10gcmVzdWx0ID0ge307Ci0gICAgIAotICAgIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgICBjYXNlIEtJTkRfQVRUUl9URVhUIDoKLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX0FUVFIgOiB7Ci0gICAgICAgIC8vIG5vdGUgaW50ZW50aW9uYWwgZmFsbC10aHJ1ISEKLSAgICAgICAgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICAgICAgaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgICAgIAotICAgICAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSBtb2RlbFF1ZXJ5LmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cmlidXRlKTsgICAgICAgIAotICAgICAgICAgIGlmIChhZCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG1vZGVsUXVlcnkuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhwYXJlbnQsIGFkKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9DTUFUVFJJQlVURSA6IHsKLSAgICAgICAgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICAgICAgaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCAmJiBjbU5vZGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IG1vZGVsUXVlcnkuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhwYXJlbnQsIGNtTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9URVhUIDogewotICAgICAgICBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICBpZiAobW9kZWxRdWVyeSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudCk7Ci0gICAgICAgICAgaWYgKGVkICE9IG51bGwpCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIHJlc3VsdCA9IG1vZGVsUXVlcnkuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhwYXJlbnQsIGVkKTsgICAgICAgICAgICAgCi0gICAgICAgICAgfSAgCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVWYWx1ZUNvbW1hbmQoU3RyaW5nIG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICAgIGNhc2UgS0lORF9BVFRSX1RFWFQgOgotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfQVRUUiA6IHsKLSAgICAgICAgLy8gbm90ZSBpbnRlbnRpb25hbCBmYWxsLXRocnUhISAgICAgICAgICAgICAgIAotICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChwYXJlbnQsIGF0dHJpYnV0ZS5nZXROb2RlTmFtZSgpLCBuZXdWYWx1ZSwgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9DTUFUVFJJQlVURSA6IHsKLSAgICAgICAgZmluYWwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbU5vZGU7Ci0gICAgICAgIHJldHVybiBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKHBhcmVudCwgYWQuZ2V0QXR0ck5hbWUoKSwgbmV3VmFsdWUsIHRydWUpOwotICAgICAgfQotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfVEVYVCA6IHsKLSAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVUZXh0VmFsdWVDb21tYW5kKHBhcmVudCwgbmV3VmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLSAgewotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgIGlmIChraW5kID09IEtJTkRfQVRUUl9URVhUKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSA9IGF0dHJpYnV0ZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gcGFyZW50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpCi0gIHsKLSAgICBOb2RlIHBhcmVudE5vZGUgPSBudWxsOwotICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYXJlbnROb2RlID0gYXR0cmlidXRlLmdldE93bmVyRWxlbWVudCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYXJlbnROb2RlID0gcGFyZW50OwotICAgIH0KLSAgICByZXR1cm4gcGFyZW50Tm9kZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50TmFtZSgpCi0gIHsKLSAgICBOb2RlIHBhcmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKCk7Ci0gICAgcmV0dXJuIHBhcmVudE5vZGUgIT0gbnVsbCA/IHBhcmVudE5vZGUuZ2V0TG9jYWxOYW1lKCkgOiAiIjsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGdldE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIGF0dHJpYnV0ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWM3MGVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25JdGVtRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIERPTUV4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlciBpbXBsZW1lbnRzIEV4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlcgotewotICBwdWJsaWMgdm9pZCBoYW5kbGVFZGl0KE9iamVjdCBpdGVtLCBXaWRnZXQgd2lkZ2V0KQotICB7ICAgCi0gIH0KLQotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDdXN0b21CdXR0b25Db250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUsIE9iamVjdCBpdGVtKQotICB7Ci0gICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgYnV0dG9uLnNldFRleHQoIi4uLiIpOyAvLyROT04tTkxTLTEkCi0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotCi0gIHB1YmxpYyBDb250cm9sIGNyZWF0ZUN1c3RvbVRleHRDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUsIE9iamVjdCBpdGVtKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEJ1dHRvbkNvbnRyb2xTdHlsZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIEV4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlci5TVFlMRV9OT05FOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0Q29udHJvbFN0eWxlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyLlNUWUxFX05PTkU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25JdGVtTWVudUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uSXRlbU1lbnVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzMwYzk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25JdGVtTWVudUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlhNTE5vZGVBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIERPTUV4dGVuc2lvbkl0ZW1NZW51TGlzdGVuZXIgaW1wbGVtZW50cyBJTWVudUxpc3RlbmVyCi17Ci0gIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotICBwdWJsaWMgRE9NRXh0ZW5zaW9uSXRlbU1lbnVMaXN0ZW5lcihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpCi0gIHsKLSAgICB0aGlzLnRyZWVWaWV3ZXIgPSB0cmVlVmlld2VyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKQotICB7Ci0gICAgbWFuYWdlci5yZW1vdmVBbGwoKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLSAgICAgIGlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgRWxlbWVudEltcGwpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnRJbXBsIGVsZW1lbnRJbXBsID0gKEVsZW1lbnRJbXBsKSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBJRE9NRG9jdW1lbnQgZG9tRG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSBlbGVtZW50SW1wbC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgIEludGVybmFsTm9kZUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlciA9IG5ldyBJbnRlcm5hbE5vZGVBY3Rpb25NYW5hZ2VyKGRvbURvY3VtZW50LmdldE1vZGVsKCksIHRyZWVWaWV3ZXIpOwotICAgICAgICBhY3Rpb25NYW5hZ2VyLmZpbGxDb250ZXh0TWVudShtYW5hZ2VyLCBzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIAotICBjbGFzcyBJbnRlcm5hbE5vZGVBY3Rpb25NYW5hZ2VyIGV4dGVuZHMgWE1MTm9kZUFjdGlvbk1hbmFnZXIKLSAgewotICAgIHB1YmxpYyBJbnRlcm5hbE5vZGVBY3Rpb25NYW5hZ2VyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFZpZXdlciB2aWV3ZXIpCi0gICAgewotICAgICAgc3VwZXIobW9kZWwsIHZpZXdlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29udHJpYnV0ZUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIExpc3Qgc2VsZWN0aW9uKQotICAgIHsKLSAgICAgIC8vbWVudS5hZGQobmV3IEFjdGlvbigidGhlcmUiKXt9KTsgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICBpbnQgZWRpdE1vZGUgPSBtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCk7Ci0gICAgICBpbnQgaWMgPSBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVM7Ci0gICAgICBpbnQgdmMgPSAoZWRpdE1vZGUgPT0gTW9kZWxRdWVyeS5FRElUX01PREVfQ09OU1RSQUlORURfU1RSSUNUKSA/IE1vZGVsUXVlcnkuVkFMSURJVFlfU1RSSUNUIDogTW9kZWxRdWVyeS5WQUxJRElUWV9OT05FOwotICAgICAgTGlzdCBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCA9IG51bGw7Ci0KLSAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBzZWxlY3Rpb24uZ2V0KDApOwotICAgICAgICAvLyBjb250cmlidXRlIGFkZCBjaGlsZCBhY3Rpb25zCi0gICAgICAgIGNvbnRyaWJ1dGVBZGRDaGlsZEFjdGlvbnMobWVudSwgbm9kZSwgaWMsIHZjKTsKLSAgICAgIH0KLSAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgaW1wbGljaXRseVNlbGVjdGVkTm9kZUxpc3QgPSBnZXRTZWxlY3RlZE5vZGVzKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0gICAgICAgIC8vIGNvbnRyaWJ1dGUgZGVsZXRlIGFjdGlvbnMKLSAgICAgICAgY29udHJpYnV0ZURlbGV0ZUFjdGlvbnMobWVudSwgaW1wbGljaXRseVNlbGVjdGVkTm9kZUxpc3QsIGljLCB2Yyk7Ci0gICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgbWVudS5hZGQobmV3IEFjdGlvbihlLmdldE1lc3NhZ2UoKSl7fSk7Ci0gICAgICB9Ci0gICAgICAvKgotICAgICAgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICAvLyBjb250cmlidXRlIHJlcGxhY2UgYWN0aW9ucwotICAgICAgICBjb250cmlidXRlUmVwbGFjZUFjdGlvbnMobWVudSwgaW1wbGljaXRseVNlbGVjdGVkTm9kZUxpc3QsIGljLCB2Yyk7Ci0gICAgICB9Ki8KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlQWRkQ2hpbGRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBOb2RlIG5vZGUsIGludCBpYywgaW50IHZjKQotICAgIHsKLSAgICAgIGludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLSAgICAgIGlmIChub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgLy8gJ0FkZCBDaGlsZC4uLicgYW5kICdBZGQgQXR0cmlidXRlLi4uJyBhY3Rpb25zCi0gICAgICAgIC8vCi0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotICAgICAgICBNeU1lbnVNYW5hZ2VyIG5ld01lbnUgPSBuZXcgTXlNZW51TWFuYWdlcigiTmV3Iil7Ci0gICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeyByZXR1cm4gdHJ1ZTsgfSAgICAgICAgICAKLSAgICAgICAgfTsvLyROT04tTkxTLTEkCi0gICAgICAgIG5ld01lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgbWVudS5hZGQobmV3TWVudSk7Ci0gICAgICAgIAotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAvLyBhZGQgaW5zZXJ0IGNoaWxkIG5vZGUgYWN0aW9ucwotICAgICAgICAgIC8vCi0gICAgICAgICAgbW9kZWxRdWVyeUFjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKGVsZW1lbnQsIGVkLCAtMSwgaWMsIHZjLCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0gICAgICAgICAgYWRkQWN0aW9uSGVscGVyKG5ld01lbnUsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOTAyOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIERPTUV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSU5vZGVBZGFwdGVyCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgZmFjZXQ7Ci0gIHByb3RlY3RlZCBWaWV3ZXIgdmlld2VyOwotICAKLSAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICB7Ci0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gIH0KLSAgICAKLSAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KQotICB7Ci0gICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KXBhcmVudEVsZW1lbnQ7ICAgICAgICAKLSAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgZm9yIChOb2RlIG5vZGUgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKQotICAgICAgewotICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQobm9kZSk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgICByZXR1cm4gbGlzdC50b0FycmF5KCk7ICAgICAgCi0gICAgfQotICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULnRvQXJyYXkoKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICBPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGVsZW1lbnQpOwotICAgIHJldHVybiBjaGlsZHJlbi5sZW5ndGggPiAwOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgewotICAgIHJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKQotICB7Ci0gICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgIHsgIAotICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIC8vIHRoaXMgbWV0aG9kIGlzIG5vdCB1c2VkCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3MzU0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBET01FeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbWFnZSBERUZBVUxUX0VMRU1FTlRfSUNPTiA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERWxlbWVudC5naWYiKTsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEltYWdlIERFRkFVTFRfQVRUUl9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgcHVibGljIERPTUV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyKCkKLSAgeyAgICAKLSAgfQotICAKLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSByZWdpc3RyeSA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Tm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSgpOwotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSAoRWxlbWVudCkgZWxlbWVudDsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBkb21FbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIElMYWJlbFByb3ZpZGVyIGxwID0gcmVnaXN0cnkuZ2V0TGFiZWxQcm92aWRlcihuYW1lc3BhY2UpOwotICAgICAgICBpZiAobHAgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEltYWdlIGltZyA9IGxwLmdldEltYWdlKGRvbUVsZW1lbnQpOwotICAgICAgICAgIGlmIChpbWcgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBpbWc7Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgICAgcmV0dXJuIERFRkFVTFRfRUxFTUVOVF9JQ09OOwotICAgIH0KLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEF0dHIpCi0gICAgcmV0dXJuIERFRkFVTFRfQVRUUl9JQ09OOwotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBpbnB1dCkKLSAgewotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgRWxlbWVudCBkb21FbGVtZW50ID0gKEVsZW1lbnQpIGlucHV0OwotICAgICAgU3RyaW5nIHRleHRWYWwgPSAiIjsKLQotICAgICAgaWYgKGRvbUVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSBkb21FbGVtZW50LmdldENoaWxkTm9kZXMoKS5pdGVtKDApOwotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICBUZXh0IHRleHROb2RlID0gKFRleHQpIG5vZGU7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCF0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKS5jb250YWlucygiXG4iKSkKLSAgICAgICAgICAgICAgdGV4dFZhbCA9ICIgWyIgKyB0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKSArICJdIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRleHRWYWwgPSAiIjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBkb21FbGVtZW50LmdldExvY2FsTmFtZSgpICsgdGV4dFZhbDsKLSAgICB9Ci0gICAgaWYgKCBpbnB1dCBpbnN0YW5jZW9mIEF0dHIpewotICAgICAgcmV0dXJuICgoQXR0cikgaW5wdXQpLmdldExvY2FsTmFtZSgpOwotICAgIH0KLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZmFhYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIKLXsKLSAgT2JqZWN0W10gZ2V0SXRlbXMoT2JqZWN0IGlucHV0KTsKLSAgU3RyaW5nIGdldE5hbWUoT2JqZWN0IGl0ZW0pOwotICBTdHJpbmcgZ2V0VmFsdWUoT2JqZWN0IGl0ZW0pOwotICBTdHJpbmdbXSBnZXRQb3NzaWJsZVZhbHVlcyhPYmplY3QgaXRlbSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkRldGFpbHNWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2MmE1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVzc2UgVmFsaWFuZXMgLSBTZW5lY2EgQ29sbGVnZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM1MzgxCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5EaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLkxpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLk5vZGVFZGl0b3JDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uRGV0YWlsc1ZpZXdlciBleHRlbmRzIFZpZXdlcgotewotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSVRFTV9EQVRBID0gIklURU1fREFUQSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVESVRPUl9DT05GSUdVUkFUSU9OX0RBVEEgPSAiRURJVE9SX0NPTkZJR1VSQVRJT05fREFUQSI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIENvbXBvc2l0ZSBjb250cm9sOyAgCi0gIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0gIEV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotICBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5OyAgCi0gIEludGVybmFsQ29udHJvbExpc3RlbmVyIGludGVybmFsQ29udHJvbExpc3RlbmVyOwotICBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrOwotICAKLSAgcHVibGljIEV4dGVuc2lvbkRldGFpbHNWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkKLSAgewotICAgIHRoaXMud2lkZ2V0RmFjdG9yeSA9IHdpZGdldEZhY3Rvcnk7ICAgIAotICAgIGNvbnRyb2wgPSAgd2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLSAgICBpbnRlcm5hbENvbnRyb2xMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbENvbnRyb2xMaXN0ZW5lcigpOwotICAgIGNvbnRyb2wuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOyAgICAKLSAgfQotICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkKLSAgewotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kU3RhY2soQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykKLSAgewotICAgIHRoaXMuY29tbWFuZFN0YWNrID0gY29tbWFuZFN0YWNrOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGdldElucHV0KCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOyAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIENvbnRyb2wgY29udHJvbCA9IGNoaWxkcmVuW2ldOwotICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KQotICAgICAgewotICAgICAgICAgRXh0ZW5zaW9uSXRlbSBpdGVtID0gKEV4dGVuc2lvbkl0ZW0pY29udHJvbC5nZXREYXRhKElURU1fREFUQSk7Ci0gICAgICAgICBTdHJpbmcgdmFsdWUgPSBjb250ZW50UHJvdmlkZXIuZ2V0VmFsdWUoaXRlbSk7ICAgICAgICAKLSAgICAgICAgKChUZXh0KWNvbnRyb2wpLnNldFRleHQodmFsdWUpOyAKLSAgICAgIH0gIAotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVUZXh0T3JDb21ib0NvbnRyb2woRXh0ZW5zaW9uSXRlbSBpdGVtLCBDb21wb3NpdGUgY29tcG9zaXRlKQotICB7Ci0gICAgQ29udHJvbCBjb250cm9sID0gbnVsbDsKLSAgICBTdHJpbmcgdmFsdWUgPSBjb250ZW50UHJvdmlkZXIuZ2V0VmFsdWUoaXRlbSk7Ci0gICAgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gZWRpdG9yQ29uZmlndXJhdGlvbiA9IGl0ZW0uZ2V0UHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uKCk7Ci0KLSAgICBpZiAoZWRpdG9yQ29uZmlndXJhdGlvbiAhPSBudWxsICYmIGhhc1N0eWxlKGVkaXRvckNvbmZpZ3VyYXRpb24sIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uLlNUWUxFX0NPTUJPKSkKLSAgICB7ICAgICAgICAgIAotICAgICAgTGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSAoTGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uKWVkaXRvckNvbmZpZ3VyYXRpb247Ci0gICAgICBDQ29tYm8gY29tYm8gPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgICAgY29tYm8uc2V0VGV4dCh2YWx1ZSk7Ci0gICAgICBPYmplY3RbXSB2YWx1ZXMgPSBjb25maWd1cmF0aW9uLmdldFZhbHVlcyhpdGVtKTsKLSAgICAgIExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0TGFiZWxQcm92aWRlcigpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspCi0gICAgICB7ICAgICAgICAgICAgCi0gICAgICAgIE9iamVjdCBvID0gdmFsdWVzW2pdOwotICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWUgPSBsYWJlbFByb3ZpZGVyICE9IG51bGwgPwotICAgICAgICAgICAgbGFiZWxQcm92aWRlci5nZXRUZXh0KG8pIDoKLSAgICAgICAgICAgICAgby50b1N0cmluZygpOwotICAgICAgICAgICAgY29tYm8uYWRkKGRpc3BsYXlOYW1lKTsKLSAgICAgIH0KLSAgICAgIGNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGludGVybmFsQ29udHJvbExpc3RlbmVyKTsKLSAgICAgIGNvbnRyb2wgPSBjb21ibzsKLSAgICB9Ci0gICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBUZXh0IHRleHQgPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZVRleHQoY29tcG9zaXRlLHZhbHVlKTsKLSAgICAgIHRleHQuYWRkS2V5TGlzdGVuZXIoaW50ZXJuYWxDb250cm9sTGlzdGVuZXIpOwotICAgICAgY29udHJvbCA9IHRleHQ7IAotICAgIH0gCi0gICAgY29udHJvbC5zZXREYXRhKElURU1fREFUQSwgaXRlbSk7Ci0gICAgY29udHJvbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBjb250cm9sLmFkZEZvY3VzTGlzdGVuZXIoaW50ZXJuYWxDb250cm9sTGlzdGVuZXIpOyAgICAgIAotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgY3JlYXRlQnV0dG9uQ29udHJvbChFeHRlbnNpb25JdGVtIGl0ZW0sIENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gIHsKLSAgICBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBlZGl0b3JDb25maWd1cmF0aW9uID0gaXRlbS5nZXRQcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb24oKTsKLSAgICBpZiAoZWRpdG9yQ29uZmlndXJhdGlvbiAhPSBudWxsICYmIGhhc1N0eWxlKGVkaXRvckNvbmZpZ3VyYXRpb24sIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uLlNUWUxFX0RJQUxPRykpCi0gICAgeyAgICAKLSAgICAgIERpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSAoRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24pZWRpdG9yQ29uZmlndXJhdGlvbjsgICAgICAgICAgICAKLSAgICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGdyaWREYXRhLmhlaWdodEhpbnQgPSAxNzsKLSAgICAgIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihpbnRlcm5hbENvbnRyb2xMaXN0ZW5lcik7Ci0gICAgICBidXR0b24uc2V0RGF0YShJVEVNX0RBVEEsIGl0ZW0pOwotICAgICAgYnV0dG9uLnNldERhdGEoRURJVE9SX0NPTkZJR1VSQVRJT05fREFUQSwgY29uZmlndXJhdGlvbik7Ci0gICAgICBTdHJpbmcgdGV4dCA9IGNvbmZpZ3VyYXRpb24uZ2V0QnV0b25UZXh0KCk7Ci0gICAgICBpZiAodGV4dCAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIGJ1dHRvbi5zZXRUZXh0KHRleHQpOyAvLyROT04tTkxTLTEkCi0gICAgICB9ICAKLSAgICAgIGJ1dHRvbi5zZXRJbWFnZShjb25maWd1cmF0aW9uLmdldEJ1dHRvbkltYWdlKCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgQ29udHJvbCBwbGFjZUhvbGRlciA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgIHBsYWNlSG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgcGxhY2VIb2xkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICBwbGFjZUhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsgCi0gICAgfSAgICAgIAotICB9IAotICAKLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7IAotICAgIC8vIFRPRE8gKGNzKSBhZGQgYXNzZXJ0aW9ucwotICAgIC8vCi0gICAgaWYgKGNvbnRlbnRQcm92aWRlciA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIAotICAgIGlmIChjb21wb3NpdGUgIT0gbnVsbCkKLSAgICB7LyoKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbnRyb2xzVGhhdFdlQXJlTGlzdGVuaW5nVG8uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpaS5uZXh0KCk7ICAgICAgIAotICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICBjb250cm9sLnJlbW92ZUZvY3VzTGlzdGVuZXIoaW50ZXJuYWxGb2N1c0xpc3RlbmVyKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICovIAotICAgICAgcmVtb3ZlTGlzdGVuZXJzKCk7Ci0gICAgICBjb21wb3NpdGUuZGlzcG9zZSgpOyAgICAgICAKLSAgICB9ICAgCi0KLSAgICBjb21wb3NpdGUgPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShjb250cm9sKTsKLSAgICBjb21wb3NpdGUuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgT2JqZWN0W10gaXRlbXMgPSBjb250ZW50UHJvdmlkZXIuZ2V0SXRlbXMoaW5wdXQpOyAgICAgIAotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBFeHRlbnNpb25JdGVtIGl0ZW0gPSAoRXh0ZW5zaW9uSXRlbSlpdGVtc1tpXTsKLSAgICAgIFN0cmluZyBuYW1lID0gY29udGVudFByb3ZpZGVyLmdldE5hbWUoaXRlbSk7Ci0gICAgICBMYWJlbCBsYWJlbCA9IHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBuYW1lICsgIjoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0gICAgICBjcmVhdGVUZXh0T3JDb21ib0NvbnRyb2woaXRlbSwgY29tcG9zaXRlKTsKLSAgICAgIGNyZWF0ZUJ1dHRvbkNvbnRyb2woaXRlbSwgY29tcG9zaXRlKTsKLSAgICB9ICAKLSAgICBjb250cm9sLmxheW91dCh0cnVlKTsgICAgCi0gIH0KLSAgICAKLSAgcHJpdmF0ZSBib29sZWFuIGhhc1N0eWxlKE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIGludCBzdHlsZSkKLSAgewotICAgIHJldHVybiAoY29uZmlndXJhdGlvbi5nZXRTdHlsZSgpICYgc3R5bGUpICE9IDA7Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gcmV2ZWFsKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIAotICB9Ci0gIHB1YmxpYyBFeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gY29udGVudFByb3ZpZGVyOwotICB9Ci0gIHB1YmxpYyB2b2lkIHNldENvbnRlbnRQcm92aWRlcihFeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikKLSAgewotICAgIHRoaXMuY29udGVudFByb3ZpZGVyID0gY29udGVudFByb3ZpZGVyOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgYXBwbHlFZGl0KEV4dGVuc2lvbkl0ZW0gaXRlbSwgV2lkZ2V0IHdpZGdldCkKLSAgewotICAgIGlmIChpdGVtICE9IG51bGwpCi0gICAgeyAgICAKLSAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0gICAgICBpZiAod2lkZ2V0IGluc3RhbmNlb2YgVGV4dCkKLSAgICAgIHsKLSAgICAgICAgVGV4dCB0ZXh0ID0gKFRleHQpd2lkZ2V0OwotICAgICAgICB2YWx1ZSA9IHRleHQuZ2V0VGV4dCgpOyAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIENDb21ibykKLSAgICAgIHsKLSAgICAgICAgQ0NvbWJvIGNvbWJvID0gKENDb21ibyl3aWRnZXQ7Ci0gICAgICAgIGludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgdmFsdWUgPSBjb21iby5nZXRJdGVtKGluZGV4KTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAgICAgIAotICAgICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gaXRlbS5nZXRVcGRhdGVWYWx1ZUNvbW1hbmQodmFsdWUpOwotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNvbW1hbmRTdGFjayAhPSBudWxsKQotICAgICAgICAgICAgY29tbWFuZFN0YWNrLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgIH0gICAgICAgICAgICAgIAotICB9Ci0gIAotICBjbGFzcyBJbnRlcm5hbENvbnRyb2xMaXN0ZW5lciBpbXBsZW1lbnRzIEZvY3VzTGlzdGVuZXIsIFNlbGVjdGlvbkxpc3RlbmVyLCBLZXlMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICAvLyBmb3IgYnV0dG9uIGNvbnRyb2xzIHdlIGhhbmRsZSBzZWxlY3Rpb24gZXZlbnRzCi0gICAgICAvLyAgICAgICAgCi0gICAgICBPYmplY3QgaXRlbSA9IGUud2lkZ2V0LmdldERhdGEoRURJVE9SX0NPTkZJR1VSQVRJT05fREFUQSk7Ci0gICAgICBpZiAoaXRlbSA9PSBudWxsKQotICAgICAgICBpdGVtID0gZS53aWRnZXQuZ2V0RGF0YShJVEVNX0RBVEEpOyAgICAKLSAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIERpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uIGRpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uID0gKERpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uKWl0ZW07ICAgICAgICAKLSAgICAgICAgZGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uaW52b2tlRGlhbG9nKCk7Ci0gICAgICAgIHJlZnJlc2goKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeHRlbnNpb25JdGVtKQotICAgICAgewotICAgICAgICBhcHBseUVkaXQoKEV4dGVuc2lvbkl0ZW0paXRlbSwgZS53aWRnZXQpOwotICAgICAgfSAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICAvLyBkbyBub3RoaW5nICAgICAgCi0gICAgfSAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpCi0gICAgewotICAgIH0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkKLSAgICB7Ci0gICAgICAvLyBhcHBseSBlZGl0cyBmb3IgdGV4dCBhbmQgY29tYm8gYm94IGNvbnRyb2xzCi0gICAgICAvLyB2aWEgdGhlIGZvY3VzTG9zdCBldmVudAotICAgICAgT2JqZWN0IGl0ZW0gPSBlLndpZGdldC5nZXREYXRhKElURU1fREFUQSk7Ci0gICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4dGVuc2lvbkl0ZW0pCi0gICAgICB7Ci0gICAgICAgIGFwcGx5RWRpdCgoRXh0ZW5zaW9uSXRlbSlpdGVtLCBlLndpZGdldCk7Ci0gICAgICB9ICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotICAgIHsKLSAgICAgIC8vIGhhbmRsZSBleHBsaWN0IEVOVEVSIGtleQotICAgICAgT2JqZWN0IGl0ZW0gPSBlLndpZGdldC5nZXREYXRhKElURU1fREFUQSk7Ci0gICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4dGVuc2lvbkl0ZW0pCi0gICAgICB7Ci0gICAgICAgIGlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpCi0gICAgICAgICAgYXBwbHlFZGl0KChFeHRlbnNpb25JdGVtKWl0ZW0sIGUud2lkZ2V0KTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKQotICAgIHsKLSAgICAgIC8vIElnbm9yZSB0aGVzZSBldmVudHMKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVycygpCi0gIHsKLSAgICBpZiAoY29tcG9zaXRlICE9IG51bGwgJiYgIWNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgQ29udHJvbCBbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgaW50IGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIENvbnRyb2wgbyA9IGNoaWxkcmVuW2ldOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIENDb21ibykKLSAgICAgICAgewotICAgICAgICAgICgoQ0NvbWJvKW8pLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGludGVybmFsQ29udHJvbExpc3RlbmVyKTsKLSAgICAgICAgICBvLnJlbW92ZUZvY3VzTGlzdGVuZXIoaW50ZXJuYWxDb250cm9sTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBUZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgKChUZXh0KW8pLnJlbW92ZUtleUxpc3RlbmVyKGludGVybmFsQ29udHJvbExpc3RlbmVyKTsKLSAgICAgICAgICBvLnJlbW92ZUZvY3VzTGlzdGVuZXIoaW50ZXJuYWxDb250cm9sTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uSXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2NzgwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLk5vZGVFZGl0b3JDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXh0ZW5zaW9uSXRlbQotewotICBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBwcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb247Ci0KLSAgcHVibGljIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGdldFByb3BlcnR5RWRpdG9yQ29uZmlndXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gcHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uKE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIHByb3BlcnR5RWRpdG9yQ29uZmlndXJhdGlvbikKLSAgewotICAgIHRoaXMucHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uID0gcHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uOwotICB9ICAKLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCBDb21tYW5kIGdldFVwZGF0ZVZhbHVlQ29tbWFuZChTdHJpbmcgbmV3VmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODRhZDFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25JdGVtRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotIAotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovIAotcHVibGljIGludGVyZmFjZSBFeHRlbnNpb25JdGVtRWRpdE1hbmFnZXIKLXsgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRV9OT05FID0gIm5vbmUiOyAgIC8vJE5PTi1OTFMtMSQgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRV9URVhUID0gInRleHQiOyAvLyROT04tTkxTLTEkICAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEVfQ09NQk8gPSAiY29tYm8iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFX0NVU1RPTSA9ICJjdXN0b20iOyAgICAgLy8kTk9OLU5MUy0xJAotICAKLSAgdm9pZCBoYW5kbGVFZGl0KE9iamVjdCBpdGVtLCBXaWRnZXQgd2lkZ2V0KTsKLSAgU3RyaW5nIGdldFRleHRDb250cm9sU3R5bGUoT2JqZWN0IGl0ZW0pOwotICBTdHJpbmcgZ2V0QnV0dG9uQ29udHJvbFN0eWxlKE9iamVjdCBpdGVtKTsKLSAgQ29udHJvbCBjcmVhdGVDdXN0b21UZXh0Q29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlLCBPYmplY3QgaXRlbSk7Ci0gIENvbnRyb2wgY3JlYXRlQ3VzdG9tQnV0dG9uQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlLCBPYmplY3QgaXRlbSk7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25JdGVtRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uSXRlbUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTk5YzM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25JdGVtRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotLy8gY3M6IFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIHN1cHBsaW1lbnQgdGhlIE5vZGVGaWx0ZXIgY2xhc3MKLS8vIHRoYXQgY2FuIGJlIHNwZWNpZmllZCB2aWEgdGhlIGN1c3RvbWl6YXRpb24gZXh0ZW5zaW9ucyBwb2ludC4KLS8vIFdoZW4gdGhlIGluaXRpYWwgbGlzdCBvZiBhIGNhdGVnb3J5J3Mgb2JqZWN0cyBpcyBkaXNwbGF5ZWQgCi0vLyB3ZSdsbCB1c2UgYSBOb2RlRmlsdGVyIHRvIHBydW5lIHRoZSBsaXN0LiAgSWYgdGhlIE5vZGVGaWx0ZXIKLS8vIGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2Ugd2UnbGwgY2FsbCB0aGlzIGludGVyZmFjZSdzIGlzQXBwbGljYWJsZUNvbnRleHQKLS8vIG1ldGhvZCBpbnN0ZWFkIG9mIHRoZSBOb2RlRmlsdGVyJ3MgRE9NIG5vZGUgYmFzZWQgbWV0aG9kLiAgVGhpcyBwcm92aWRlcyAKLS8vIGFyZSBhIG1vcmUgY29udmVuaWVudCBpbnRlcmZhY2UgZm9yIGNsaWVudHMgd2hvIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gCi0vLyBmaWx0ZXIgdGhlIGxpc3QgcHJlc2VudGVkIHZpYSB0aGUgQWRkRXh0ZW5zaW9uQ29tcG9uZW50RGlhbG9nLgotLy8gU2VlIHRoZSBjbGFzcyBFeHRlbnNpb25zU2VjdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgotLy8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaW9uSXRlbUZpbHRlcgotewotICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVDb250ZXh0KFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCwgWFNEQ29uY3JldGVDb21wb25lbnQgY2FuZGlkYXRlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmMzYWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5Ci17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQURERURfRVhUX1NDSEVNQVMgPSAiVVNFUi1BRERFRC1FWFQtU0NIRU1BUyI7ICAvLyBUT0RPIGV4dGVybmFsaXplCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9QUkVGSVggPSAicGxhdGZvcm06L3BsdWdpbi8iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZTkFNRSA9ICJkaXNwbGF5TmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFVVJJID0gIm5hbWVzcGFjZVVSSSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERklMRVVSTCA9ICJ4c2RGaWxlVVJMIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTFBST1ZJREVSID0gImxhYmVsUHJvdmlkZXJDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0NPTU1BTkRfQ0xBU1MgPSAiYWRkQ29tbWFuZENsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfQ09NTUFORF9DTEFTUyA9ICJkZWxldGVDb21tYW5kQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX1BST1ZJREVSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlOwotICBwcm90ZWN0ZWQgU3RyaW5nIGV4dGVuc2lvbklkOwotCi0gIHByb3RlY3RlZCBBcnJheUxpc3QgbnNVUklQcm9wZXJ0aWVzLCBjYXRlZ29yeVByb3ZpZGVyTGlzdDsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVwcmVjYXRlZEV4dGVuc2lvbklkOwotICAKLSAgcHVibGljIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoU3RyaW5nIGFwcGluZm9fZXh0ZW5zaW9uaWQpCi0gIHsKLSAgICBleHRlbnNpb25JZCA9IGFwcGluZm9fZXh0ZW5zaW9uaWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIF9faW50ZXJuYWxTZXREZXByZWNhdGVkRXh0ZW5zaW9uSWQoU3RyaW5nIGRlcHJlY2F0ZWRJZCkKLSAgewotICAgIGRlcHJlY2F0ZWRFeHRlbnNpb25JZCA9IGRlcHJlY2F0ZWRJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJlZlN0b3JlKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpCi0gIHsKLQkgIHByZWZTdG9yZSA9IHN0b3JlOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QWxsRXh0ZW5zaW9uc1NjaGVtYXNDb250cmlidXRpb24oKQotICB7ICAKLSAgICAvLyBJZiB3ZSByZWFkIHRoZSByZWdpc3RyeSwgdGhlbiBsZXQncyBub3QgZG8gaXQgYWdhaW4uCi0gICAgaWYgKG5zVVJJUHJvcGVydGllcyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBuc1VSSVByb3BlcnRpZXM7Ci0gICAgfQotIAotICAgIG5zVVJJUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBjYXRlZ29yeVByb3ZpZGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGdldEFsbEV4dGVuc2lvbnNTY2hlbWFzQ29udHJpYnV0aW9uKGV4dGVuc2lvbklkKTsKLSAgICBpZiAoZGVwcmVjYXRlZEV4dGVuc2lvbklkICE9IG51bGwpCi0gICAgewotICAgICAgZ2V0QWxsRXh0ZW5zaW9uc1NjaGVtYXNDb250cmlidXRpb24oZGVwcmVjYXRlZEV4dGVuc2lvbklkKTsgICAgIAotICAgIH0gIAotICAgIAotICAgIC8vIGdldCB1c2VyLWFkZGVkIHNjaGVtYXMgc3RvcmVkIGluIHByZWZlcmVuY2UKLSAgICBpZiAocHJlZlN0b3JlICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHZhbHVlID0gcHJlZlN0b3JlLmdldFN0cmluZyhVU0VSX0FEREVEX0VYVF9TQ0hFTUFTKTsKLSAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiXG4iKTsKLSAgIAotICAgICAgd2hpbGUgKCB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpICkKLSAgICAgIHsKLSAgICAgICAgbnNVUklQcm9wZXJ0aWVzLmFkZCggbmV3IFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKCB0b2tlbml6ZXIubmV4dFRva2VuKCkgKSApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnNVUklQcm9wZXJ0aWVzOwotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0QWxsRXh0ZW5zaW9uc1NjaGVtYXNDb250cmlidXRpb24oU3RyaW5nIGlkKQotICB7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gYXNpUHJvcGVydGllc0xpc3QgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihpZCk7Ci0KLSAgICBib29sZWFuIGhhc0FTSVByb3BlcnRpZXMgPSAoYXNpUHJvcGVydGllc0xpc3QgIT0gbnVsbCkgJiYgKGFzaVByb3BlcnRpZXNMaXN0Lmxlbmd0aCA+IDApOwotCi0gICAgaWYgKGhhc0FTSVByb3BlcnRpZXMpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhc2lQcm9wZXJ0aWVzTGlzdC5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFzaVByb3BlcnRpZXNFbGVtZW50ID0gYXNpUHJvcGVydGllc0xpc3RbaV07Ci0gICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IGFzaVByb3BlcnRpZXNFbGVtZW50LmdldE5hbWUoKTsKLQotICAgICAgICBpZiAoImNhdGVnb3J5Ii5lcXVhbHMoZWxlbWVudE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gYXNpUHJvcGVydGllc0VsZW1lbnQuZ2V0QXR0cmlidXRlKERFU0NSSVBUSU9OKTsKLSAgICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWUgPSBhc2lQcm9wZXJ0aWVzRWxlbWVudC5nZXRBdHRyaWJ1dGUoRElTUExBWU5BTUUpOwotICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBhc2lQcm9wZXJ0aWVzRWxlbWVudC5nZXRBdHRyaWJ1dGUoTkFNRVNQQUNFVVJJKTsKLSAgICAgICAgICBTdHJpbmcgeHNkRmlsZVVSTCA9IGFzaVByb3BlcnRpZXNFbGVtZW50LmdldEF0dHJpYnV0ZShYU0RGSUxFVVJMKTsKLSAgICAgICAgICBTdHJpbmcgbGFiZWxQcm92aWRlckNsYXNzID0gYXNpUHJvcGVydGllc0VsZW1lbnQuZ2V0QXR0cmlidXRlKExBQkVMUFJPVklERVIpOwotICAgICAgICAgIFN0cmluZyBhZGRDb21tYW5kQ2xhc3MgPSBhc2lQcm9wZXJ0aWVzRWxlbWVudC5nZXRBdHRyaWJ1dGUoQUREX0NPTU1BTkRfQ0xBU1MpOwotICAgICAgICAgIFN0cmluZyBkZWxldGVDb21tYW5kQ2xhc3MgPSBhc2lQcm9wZXJ0aWVzRWxlbWVudC5nZXRBdHRyaWJ1dGUoREVMRVRFX0NPTU1BTkRfQ0xBU1MpOwotICAgICAgICAgIAotICAgICAgICAgIGlmIChkaXNwbGF5TmFtZSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGRpc3BsYXkgbmFtZSwgZm9yY2UgdGhlIHVzZXIKLSAgICAgICAgICAgIC8vIHRvIG1hbnVhbGx5IGNyZWF0ZSBhIG5hbWUuIFRoZXJlZm9yZSwgd2UgaWdub3JlIGVudHJ5IHdpdGhvdXQKLSAgICAgICAgICAgIC8vIGEgZGlzcGxheSBuYW1lLgotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKHhzZEZpbGVVUkwgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RGaWxlVVJMID0gbG9jYXRlRmlsZVVzaW5nQ2F0YWxvZyhuYW1lc3BhY2VVUkkpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGV4dGVuc2lvbnNTY2hlbWFTcGVjID0gY3JlYXRlRW50cnkoKTsKLSAgICAgICAgICBleHRlbnNpb25zU2NoZW1hU3BlYy5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgZXh0ZW5zaW9uc1NjaGVtYVNwZWMuc2V0RGlzcGxheU5hbWUoZGlzcGxheU5hbWUpOwotICAgICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldE5hbWVzcGFjZVVSSShuYW1lc3BhY2VVUkkpOwotICAgICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldERlZmF1dFNjaGVtYSgpOwotCi0gICAgICAgICAgU3RyaW5nIHBsdWdpbklkID0gYXNpUHJvcGVydGllc0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICBpZiAobGFiZWxQcm92aWRlckNsYXNzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpLmxvYWRDbGFzcyhsYWJlbFByb3ZpZGVyQ2xhc3MpOwotICAgICAgICAgICAgICBpZiAodGhlQ2xhc3MgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxhYmVsUHJvdmlkZXIgPSAoSUxhYmVsUHJvdmlkZXIpIHRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBleHRlbnNpb25zU2NoZW1hU3BlYy5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGlmIChhZGRDb21tYW5kQ2xhc3MgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQgYWRkQ29tbWFuZCA9IChFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZClhc2lQcm9wZXJ0aWVzRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFERF9DT01NQU5EX0NMQVNTKTsKLSAgICAgICAgICAgICAgaWYgKGFkZENvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kKGFkZENvbW1hbmQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGRlbGV0ZUNvbW1hbmRDbGFzcyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQgZGVsZXRlQ29tbWFuZCA9IChFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQpYXNpUHJvcGVydGllc0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihERUxFVEVfQ09NTUFORF9DTEFTUyk7Ci0gICAgICAgICAgICAgIGlmIChkZWxldGVDb21tYW5kICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25zU2NoZW1hU3BlYy5zZXRFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQoZGVsZXRlQ29tbWFuZCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBleHRlbnNpb25zU2NoZW1hU3BlYy5zZXRMb2NhdGlvbihMT0NBVElPTl9QUkVGSVggKyBwbHVnaW5JZCArICIvIiArIHhzZEZpbGVVUkwpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICBuc1VSSVByb3BlcnRpZXMuYWRkKGV4dGVuc2lvbnNTY2hlbWFTcGVjKTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCJjYXRlZ29yeVByb3ZpZGVyIi5lcXVhbHMoZWxlbWVudE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGNhdGVnb3J5UHJvdmlkZXJDbGFzcyA9IGFzaVByb3BlcnRpZXNFbGVtZW50LmdldEF0dHJpYnV0ZShDQVRFR09SWV9QUk9WSURFUl9DTEFTUyk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKGNhdGVnb3J5UHJvdmlkZXJDbGFzcyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBDYXRlZ29yeVByb3ZpZGVyIGNhdGVnb3J5UHJvdmlkZXIgPSAoQ2F0ZWdvcnlQcm92aWRlcilhc2lQcm9wZXJ0aWVzRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENBVEVHT1JZX1BST1ZJREVSX0NMQVNTKTsKLSAgICAgICAgICAgICAgaWYgKGNhdGVnb3J5UHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhdGVnb3J5UHJvdmlkZXJMaXN0LmFkZChjYXRlZ29yeVByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnNVUklQcm9wZXJ0aWVzOwotICB9Ci0gIAotICBwdWJsaWMgRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQgZ2V0QWRkRXh0ZW5zaW9uQ29tbWFuZChTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgLy8gRGlkbid0IHJldHJpZXZlIHRoZSBjb25maWcgZWxlbWVudHMgeWV0LgotICAgIGlmIChuc1VSSVByb3BlcnRpZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRBbGxFeHRlbnNpb25zU2NoZW1hc0NvbnRyaWJ1dGlvbigpOwotICAgIH0KLSAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuc1VSSVByb3BlcnRpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKWkubmV4dCgpOwotICAgICAgU3RyaW5nIG5zVVJJID0gc3BlYy5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGlmIChuc1VSSSAhPSBudWxsICYmIG5zVVJJLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgewotICAgICAgICByZXR1cm4gc3BlYy5nZXRFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGNhdGVnb3J5UHJvdmlkZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ2F0ZWdvcnlQcm92aWRlciBjYXRlZ29yeVByb3ZpZGVyID0gKENhdGVnb3J5UHJvdmlkZXIpaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBjYXRlZ29yeVByb3ZpZGVyLmdldENhdGVnb3JpZXMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKSBqLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHNwZWMuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiBuYW1lc3BhY2VVUkkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gc3BlYy5nZXRFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kIGdldFJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICAvLyBEaWRuJ3QgcmV0cmlldmUgdGhlIGNvbmZpZyBlbGVtZW50cyB5ZXQuCi0gICAgaWYgKG5zVVJJUHJvcGVydGllcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGdldEFsbEV4dGVuc2lvbnNTY2hlbWFzQ29udHJpYnV0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIGZvciAoSXRlcmF0b3IgaSA9IG5zVVJJUHJvcGVydGllcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMgPSAoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpaS5uZXh0KCk7Ci0gICAgICBTdHJpbmcgbnNVUkkgPSBzcGVjLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5zVVJJICE9IG51bGwgJiYgbnNVUkkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBzcGVjLmdldEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZCgpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjYXRlZ29yeVByb3ZpZGVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENhdGVnb3J5UHJvdmlkZXIgY2F0ZWdvcnlQcm92aWRlciA9IChDYXRlZ29yeVByb3ZpZGVyKWkubmV4dCgpOwotICAgICAgZm9yIChJdGVyYXRvciBqID0gY2F0ZWdvcnlQcm92aWRlci5nZXRDYXRlZ29yaWVzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYyA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSkgai5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBzcGVjLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwgJiYgbmFtZXNwYWNlVVJJLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHNwZWMuZ2V0RXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldENhdGVnb3J5UHJvdmlkZXJzKCkKLSAgewotICAgIGlmIChuc1VSSVByb3BlcnRpZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRBbGxFeHRlbnNpb25zU2NoZW1hc0NvbnRyaWJ1dGlvbigpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY2F0ZWdvcnlQcm92aWRlckxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGNyZWF0ZUVudHJ5KCkKLSAgewotICAgIHJldHVybiBuZXcgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBTdHJpbmcgbG9jYXRpb24gZm9yIHRoZSBzY2hlbWEgd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlVVJJIGJ5Ci0gICAqIGxvb2tpbmcgYXQgdGhlIFhNTCBjYXRhbG9nLiBXZSBsb29rIG9ubHkgaW4gdGhlIHBsdWdpbiBzcGVjaWZpZWQgZW50cmllcyBvZgotICAgKiB0aGUgY2F0YWxvZy4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLSAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2NoZW1hLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRlRmlsZVVzaW5nQ2F0YWxvZyhTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotICAgIFN0cmluZyByZXN1bHQgPSByZXNvbHZlci5yZXNvbHZlKCIiLCBuYW1lc3BhY2VVUkksICIiKTsKLSAgICByZXR1cm4gcmVzb2x2ZXIucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oIiIsIG5hbWVzcGFjZVVSSSwgcmVzdWx0KTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vU2VsZWN0RnJvbUNhdGFsb2dEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9TZWxlY3RGcm9tQ2F0YWxvZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjVkYWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9TZWxlY3RGcm9tQ2F0YWxvZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5DYXRhbG9nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5YTUxDYXRhbG9nRW50cmllc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dFbnRyeURldGFpbHNWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5YTUxDYXRhbG9nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dUcmVlVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0RnJvbUNhdGFsb2dEaWFsb2cgZXh0ZW5kcyBEaWFsb2cKLXsKLQotICBwcml2YXRlIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZzsKLSAgcHJpdmF0ZSBJQ2F0YWxvZyB1c2VyQ2F0YWxvZzsKLSAgcHJpdmF0ZSBJQ2F0YWxvZyBkZWZhdWx0Q2F0YWxvZzsKLSAgcHJpdmF0ZSBYTUxDYXRhbG9nRW50cmllc1ZpZXcgY2F0YWxvZ0VudHJpZXNWaWV3OwotICBwcml2YXRlIElDYXRhbG9nIHN5c3RlbUNhdGFsb2c7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudFNlbGVjdGlvbkxvY2F0aW9uOwotICBwcml2YXRlIFN0cmluZyBjdXJyZW50U2VsZWN0aW9uTmFtZXNwYWNlOwotCi0gIHB1YmxpYyBTZWxlY3RGcm9tQ2F0YWxvZ0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLQotICAgIGRlZmF1bHRDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLSAgICBJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBkZWZhdWx0Q2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJTmV4dENhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLSAgICAgIElDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nID0gY2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotICAgICAgaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkKLSAgICAgICAgewotICAgICAgICAgIHN5c3RlbUNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChYTUxDb3JlUGx1Z2luLlVTRVJfQ0FUQUxPR19JRC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICB1c2VyQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gd2UgY3JlYXRlIGEgd29ya2luZyBjb3B5IG9mIHRoZSAnVXNlciBTZXR0aW5ncycgZm9yIHRoZSBDYXRhbG9nCi0gICAgLy8gdGhhdCB3ZSBjYW4gbW9kaWZ5Ci0gICAgQ2F0YWxvZ1NldCB0ZW1wQ2F0YWxvZ1NldCA9IG5ldyBDYXRhbG9nU2V0KCk7Ci0gICAgd29ya2luZ1VzZXJDYXRhbG9nID0gdGVtcENhdGFsb2dTZXQubG9va3VwT3JDcmVhdGVDYXRhbG9nKCJ3b3JraW5nIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgIC8vIFRPRE86IGFkZCBlbnRyaWVzIGZyb20gdGhlIG5lc3RlZCBjYXRhbG9ncyBhcyB3ZWxsCi0gICAgd29ya2luZ1VzZXJDYXRhbG9nLmFkZEVudHJpZXNGcm9tQ2F0YWxvZyh1c2VyQ2F0YWxvZyk7Ci0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgZ3JpZERhdGEuaGVpZ2h0SGludCA9IDUwMDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgY3JlYXRlQ2F0YWxvZ0VudHJpZXNWaWV3KGNvbXBvc2l0ZSk7Ci0gICAgY3JlYXRlQ2F0YWxvZ0RldGFpbHNWaWV3KGNvbXBvc2l0ZSk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2F0YWxvZ0VudHJpZXNWaWV3KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBncmlkRGF0YS53aWR0aEhpbnQgPSAzNzA7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgZ3JvdXAuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfVVNFUl9FTlRSSUVTKTsKLSAgICBncm91cC5zZXRUb29sVGlwVGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfVVNFUl9FTlRSSUVTX1RPT0xfVElQKTsKLQotICAgIC8qCi0gICAgICogY3JlYXRlIGEgc3ViY2xhc3Mgb2YgWE1MQ2F0YWxvZ0VudHJpZXNWaWV3IHdoaWNoIHN1cHByZXNzZXMgLSB0aGUKLSAgICAgKiBjcmVhdGlvbiBvZiAnQWRkJywgJ0VkaXQnLCAnRGVsZXRlJyBidXR0b25zIC0gYW55IG1ldGhvZCBpbnZvbHZpbmcgdGhlCi0gICAgICogYWJvdmUgYnV0dG9ucwotICAgICAqLwotICAgIGNhdGFsb2dFbnRyaWVzVmlldyA9IG5ldyBYTUxDYXRhbG9nRW50cmllc1ZpZXcoZ3JvdXAsIHdvcmtpbmdVc2VyQ2F0YWxvZywgc3lzdGVtQ2F0YWxvZykKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldEVuYWJsZWRTdGF0ZSgpCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICB9OwotCi0gICAgLy8gT25seSBYTUwgU2NoZW1hIGVudHJ5IGlzIHNlbGVjdGFibGUKLSAgICBjYXRhbG9nRW50cmllc1ZpZXcuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIgY2F0YWxvZ1RyZWVWaWV3ZXIgPSAoKFhNTENhdGFsb2dUcmVlVmlld2VyKSBjYXRhbG9nRW50cmllc1ZpZXcuZ2V0Vmlld2VyKCkpOwotICAgIGNhdGFsb2dUcmVlVmlld2VyLnJlc2V0RmlsdGVycygpOwotCi0gICAgY2F0YWxvZ1RyZWVWaWV3ZXIuYWRkRmlsdGVyKG5ldyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIobmV3IFN0cmluZ1tdIHsgIi54c2QiIH0pKTsKLSAgfQotCi0gIC8vIEJ1ZyBpbiB0aGUgZmlsdGVyIG9mIHRoZSBYTUwgcGx1Z2luLCBoYXZlIHRvIGdpdmUgYSBjb3JyZWN0IHZlcnNpb24gaGVyZQotICAvLyBUT0RPOiBXYWl0aW5nIGZvciB0aGUgZml4IHRvIGJlIGNvbW1pdGVkIHRvIFhNTCBwbHVnaW4gYW5kCi0gIC8vIGJlIHVzZWQgYnkgY29uc3RlbGxhdGlvbgotICBwcml2YXRlIGNsYXNzIFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlcgotICB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFczX1hNTFNDSEVNQV9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS8iOwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBleHRlbnNpb25zOwotCi0gICAgcHVibGljIFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihTdHJpbmdbXSBleHRlbnNpb25zMSkKLSAgICB7Ci0gICAgICB0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkKLSAgICAgIHsKLSAgICAgICAgSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgZWxlbWVudDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gaWYgdGhlIGV4dGVuc2lvbiBpcyBjb3JyZWN0IGFuZCB0aGUgbmFtZXNwYWNlIGluZGljYXRlcwotICAgICAgICAgIC8vIHRoYXQgdGhpcyBlbnRyeSBpcyBub3QgdGhlIFczIFhNTCBTY2hlbWEKLSAgICAgICAgICBpZiAoY2F0YWxvZ0VudHJ5LmdldFVSSSgpLmVuZHNXaXRoKGV4dGVuc2lvbnNbaV0pICYmICFjYXRhbG9nRW50cnkuZ2V0S2V5KCkuc3RhcnRzV2l0aChXM19YTUxTQ0hFTUFfTkFNRVNQQUNFKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlbGVtZW50LmVxdWFscyhYTUxDYXRhbG9nVHJlZVZpZXdlci5QTFVHSU5fU1BFQ0lGSUVEX0VOVFJJRVNfT0JKRUNUKSB8fCBlbGVtZW50LmVxdWFscyhYTUxDYXRhbG9nVHJlZVZpZXdlci5VU0VSX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDYXRhbG9nRGV0YWlsc1ZpZXcoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIEdyb3VwIGRldGFpbHNHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBkZXRhaWxzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgZGV0YWlsc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBkZXRhaWxzR3JvdXAuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMUyk7Ci0gICAgZmluYWwgWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXcgZGV0YWlsc1ZpZXcgPSBuZXcgWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXcoZGV0YWlsc0dyb3VwKTsKLSAgICBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pID8gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKSA6IG51bGw7Ci0gICAgICAgIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpCi0gICAgICAgIHsKLSAgICAgICAgICBJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gKElDYXRhbG9nRW50cnkpIHNlbGVjdGVkT2JqZWN0OwotICAgICAgICAgIGRldGFpbHNWaWV3LnNldENhdGFsb2dFbGVtZW50KGVudHJ5KTsKLSAgICAgICAgICBjdXJyZW50U2VsZWN0aW9uTG9jYXRpb24gPSBlbnRyeS5nZXRVUkkoKTsKLSAgICAgICAgICBjdXJyZW50U2VsZWN0aW9uTmFtZXNwYWNlID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZGV0YWlsc1ZpZXcuc2V0Q2F0YWxvZ0VsZW1lbnQoKElDYXRhbG9nRW50cnkpIG51bGwpOwotICAgICAgICAgIGN1cnJlbnRTZWxlY3Rpb25Mb2NhdGlvbiA9ICIiOwotICAgICAgICAgIGN1cnJlbnRTZWxlY3Rpb25OYW1lc3BhY2UgPSAiIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgY2F0YWxvZ0VudHJpZXNWaWV3LmdldFZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRTZWxlY3Rpb25Mb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gY3VycmVudFNlbGVjdGlvbkxvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDdXJyZW50U2VsZWN0aW9uTmFtZXNwYWNlKCkKLSAgewotICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uTmFtZXNwYWNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9TcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRhOWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9TcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5FeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5FeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlRmlsdGVyOwotCi1wdWJsaWMgY2xhc3MgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0gIHByaXZhdGUgU3RyaW5nIGRpc3BsYXlOYW1lOwotICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkk7Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotICBwcml2YXRlIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRTY2hlbWEgPSBmYWxzZTsKLSAgcHJpdmF0ZSBFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCBhZGRDb21tYW5kOwotICBwcml2YXRlIEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZCByZW1vdmVDb21tYW5kOwotICBwcml2YXRlIE5vZGVGaWx0ZXIgbm9kZUZpbHRlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NpZmljYXRpb247Ci0gIAotICAvKioKLSAgICogRWl0aGVyIHRoZSB3b3Jrc3BhY2UtcmVsYXRpdmUgcGF0aCBvZiB0aGUgeHNkIGZpbGUgb3IgdGhlIG5hbWVzcGFjZQotICAgKiBvZiB0aGUgeHNkIGZpbGUgKGlmIGl0IGNvbWUgZnJvbSB0aGUgQ2F0YWxvZykgCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBzb3VyY2VIaW50OwotICBwcml2YXRlIGJvb2xlYW4gZnJvbUNhdGFsb2c7Ci0KLSAgcHVibGljIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEoU3RyaW5nIGRlc2MpIHsKLQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihkZXNjLCAiXHQiKTsKLQkKLQkvLyB3ZSBtdXN0IGJlIHN1cmUgdGhhdCBlYWNoICdkZXNjJyBjb250YWlucyBpbmZvIGluIGNvcnJlY3QgZm9ybWF0Ci0JLy8gbm8gZXJyb3IgY2hlY2tpbmcgaGVyZQotCWRlc2NyaXB0aW9uID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCWRpc3BsYXlOYW1lID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCW5hbWVzcGFjZVVSSSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQlsb2NhdGlvbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQlpc0RlZmF1bHRTY2hlbWEgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkuZXF1YWxzKCJ0cnVlIik7Ci0Jc291cmNlSGludCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQlmcm9tQ2F0YWxvZyA9IHRva2VuaXplci5uZXh0VG9rZW4oKS5lcXVhbHMoInRydWUiKTsKLSAgfQotCi0vKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbgotICAgKiAgICAgICAgICBUaGUgZGVzY3JpcHRpb24gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGlzcGxheU5hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkKLSAgewotICAgIHJldHVybiBkaXNwbGF5TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gbmFtZQotICAgKiAgICAgICAgICBUaGUgZGlzcGxheU5hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIGRpc3BsYXlOYW1lKQotICB7Ci0gICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZXNwYWNlVVJJLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0gICAqICAgICAgICAgIFRoZSBuYW1lc3BhY2VVUkkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsKLSAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSB4c2QgZmlsZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBsb2NhdGlvbgotICAgKiAgICAgICAgICBUaGUgbG9jYXRpb24gdG8gYmUgc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gIH0KLQotICBwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gbGFiZWxQcm92aWRlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TGFiZWxQcm92aWRlcihJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyBFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCBnZXRFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gYWRkQ29tbWFuZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kKEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kIGFkZENvbW1hbmQpCi0gIHsKLSAgICB0aGlzLmFkZENvbW1hbmQgPSBhZGRDb21tYW5kOwotICB9Ci0KLSAgcHVibGljIEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZCBnZXRFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQoKQotICB7Ci0gICAgcmV0dXJuIHJlbW92ZUNvbW1hbmQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQoRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kIHJlbW92ZUNvbW1hbmQpCi0gIHsKLSAgICB0aGlzLnJlbW92ZUNvbW1hbmQgPSByZW1vdmVDb21tYW5kOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNEZWZhdXRTY2hlbWEoKXsKLQkgIHJldHVybiBpc0RlZmF1bHRTY2hlbWEgOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVmYXV0U2NoZW1hKCl7Ci0JICBpc0RlZmF1bHRTY2hlbWEgPSB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VIaW50KFN0cmluZyBzKXsKLQkgIHNvdXJjZUhpbnQgPSBzOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUhpbnQoKXsKLQkgIHJldHVybiBzb3VyY2VIaW50OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGcm9tQ2F0YWxvZygpIHsKLQlyZXR1cm4gZnJvbUNhdGFsb2c7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGcm9tQ2F0YWxvZyhib29sZWFuIGZyb21DYXRhbG9nKSB7Ci0JdGhpcy5mcm9tQ2F0YWxvZyA9IGZyb21DYXRhbG9nOwotICB9Ci0gIAotICAvKioKLSAgICogVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc2V0dGluZyB0aGlzIHZpYSB0aGUgZXh0ZW5zaW9uIHBvaW50IGRlZmluZWQgaW4gdGhlIHBsdWdpbi54bWwKLSAgICogVGhpcyBhbGxvd3MgZXh0ZW5kZXJzIHRvIHByb3ZpZGUgYSBmaWx0ZXIgZm9yIGEgY2F0ZWdvcnkgdGhhdCBoYXMgYmVlbiBhZGRlZCAKLSAgICogZHluYW1pY2FsbHkgKHByb2dyYW1tYXRpY2FsbHkpCi0gICAqIEBwYXJhbSBub2RlRmlsdGVyCi0gICAqLyAKLSAgcHVibGljIHZvaWQgc2V0Tm9kZUZpbHRlcihOb2RlRmlsdGVyIG5vZGVGaWx0ZXIpCi0gIHsKLSAgICB0aGlzLm5vZGVGaWx0ZXIgPSBub2RlRmlsdGVyOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBub2RlIGZpbHRlcgotICAgKiBAcmV0dXJuIE5vZGVGaWx0ZXIKLSAgICovCi0gIHB1YmxpYyBOb2RlRmlsdGVyIGdldE5vZGVGaWx0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG5vZGVGaWx0ZXI7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciBzZXR0aW5nIHRoaXMgdmlhIHRoZSBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCBpbiB0aGUgcGx1Z2luLnhtbAotICAgKiBUaGlzIGFsbG93cyBleHRlbmRlcnMgdG8gZ3JvdXAgY2F0ZWdvcmllcyBpbnRvIGdyb3VwcyBvciBjbGFzc2lmaWNhdGlvbnNzICAKLSAgICogQHBhcmFtIGNsYXNzaWZpY2F0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDbGFzc2lmaWNhdGlvbihTdHJpbmcgY2xhc3NpZmljYXRpb24pCi0gIHsKLSAgICB0aGlzLmNsYXNzaWZpY2F0aW9uID0gY2xhc3NpZmljYXRpb247Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGNsYXNzaWZpY2F0aW9uCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENsYXNzaWZpY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBjbGFzc2lmaWNhdGlvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL1hTREV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9YU0RFeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTQyNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL1hTREV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgWFNERXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIERPTUV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIKLXsgIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgewotICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpIGlucHV0RWxlbWVudDsKLSAgICAgIExpc3QgZWxlbWVudHNBbmRBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uID0gWFNEQ29tbW9uVUlVdGlscy5nZXRJbnB1dFhTREFubm90YXRpb24oY29tcG9uZW50LCBmYWxzZSk7Ci0gICAgICBpZiAoeHNkQW5ub3RhdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBCdWcgMTM3ODU2IC0gRXh0ZW5zaW9uIHBhZ2Ugb2YgcHJvcGVydGllcyBzaG91bGRuJ3QgZGlzcGxheSBpbXBvcnRlZCBlbGVtZW50cwotICAgICAgICAvLyBBZGRlZCB0aGlzIGlmIHN0YXRlbWVudAotICAgICAgICBpZiAoeHNkQW5ub3RhdGlvbi5nZXRTY2hlbWEoKSA9PSBjb21wb25lbnQuZ2V0U2NoZW1hKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0IGFwcEluZm9MaXN0ID0geHNkQW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCk7Ci0gICAgICAgICAgRWxlbWVudCBhcHBJbmZvRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgaWYgKGFwcEluZm9MaXN0LnNpemUoKSA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgYXBwSW5mb0VsZW1lbnQgPSAoRWxlbWVudCkgYXBwSW5mb0xpc3QuZ2V0KDApOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoYXBwSW5mb0VsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gYXBwSW5mb0xpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGFwcEluZm8gPSAoRWxlbWVudCkgb2JqOwotICAgICAgICAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gYXBwSW5mby5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLSAgICAgICAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudHNBbmRBdHRyaWJ1dGVzLmFkZChub2RlKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIENvbnN0cnVjdCBhdHRyaWJ1dGVzIGxpc3QgKi8KLSAgICAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gYXBwSW5mb0VsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gU3RyaW5nIGRlZmF1bHROYW1lc3BhY2UgPQotICAgICAgICAgICAgICAvLyAoU3RyaW5nKWNvbXBvbmVudC5nZXRTY2hlbWEoKS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCkuZ2V0KCIiKTsKLSAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOb2RlIG9uZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuaXRlbShpKTsKLSAgICAgICAgICAgICAgICBpZiAoIWlzWG1sbnNBdHRyaWJ1dGUob25lQXR0cmlidXRlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gb25lQXR0cmlidXRlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0V4dGVuc2lvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwgJiYgb25lQXR0cmlidXRlLmdldFByZWZpeCgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlzRXh0ZW5zaW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmICghWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpc0V4dGVuc2lvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAoaXNFeHRlbnNpb24pCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzQW5kQXR0cmlidXRlcy5hZGQob25lQXR0cmlidXRlKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBlbGVtZW50c0FuZEF0dHJpYnV0ZXMudG9BcnJheSgpOwotICAgIH0KLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzWG1sbnNBdHRyaWJ1dGUoTm9kZSBhdHRyaWJ1dGUpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gYXR0cmlidXRlLmdldFByZWZpeCgpOwotICAgIGlmIChwcmVmaXggIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyB0aGlzIGhhbmRsZSB0aGUgeG1sbnM6Zm9vPSJibGFoIiBjYXNlCi0gICAgICByZXR1cm4gInhtbG5zIi5lcXVhbHMocHJlZml4KTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gdGhpcyBoYW5kbGVzIHRoZSB4bWxucz0iYmxhaCIgY2FzZQotICAgICAgcmV0dXJuICJ4bWxucyIuZXF1YWxzKGF0dHJpYnV0ZS5nZXROb2RlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9EZWZhdWx0TGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL0RlZmF1bHRMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0YWQ3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL0RlZmF1bHRMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbTsKLQotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdExpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBleHRlbmRzIExpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbgotewotICBwcml2YXRlIFN0cmluZ1tdIHZhbHVlczsKLSAgCi0gIHB1YmxpYyBEZWZhdWx0TGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uKFN0cmluZ1tdIHZhbHVlcykKLSAgewotICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOyAKLSAgfQotIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0VmFsdWVzKE9iamVjdCBwcm9wZXJ0eU9iamVjdCkKLSAgewotICAgIHJldHVybiB2YWx1ZXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTMwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL0RpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBleHRlbmRzIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uCi17Ci0gIHB1YmxpYyBpbnQgZ2V0U3R5bGUoKQotICB7ICAgICAgICAKLSAgICByZXR1cm4gU1RZTEVfRElBTE9HOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEJ1dG9uVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIEltYWdlIGdldEJ1dHRvbkltYWdlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnZva2VEaWFsb2coKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL0xpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGZiY2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbgotewotICBwcml2YXRlIExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLSAKLSAgcHVibGljIExhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gbGFiZWxQcm92aWRlcjsKLSAgfQotICAKLSAgcHVibGljIGludCBnZXRTdHlsZSgpCi0gIHsKLSAgICByZXR1cm4gU1RZTEVfQ09NQk87Ci0gIH0gICAgCi0KLSAgcHVibGljIHZvaWQgc2V0TGFiZWxQcm92aWRlcihMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIGFic3RyYWN0IE9iamVjdFtdIGdldFZhbHVlcyhPYmplY3QgcHJvcGVydHlPYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL05vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkZjYzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL05vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX1BST1ZJREVSX0NMQVNTX0FUVFJJQlVURV9OQU1FID0gImxhYmVsUHJvdmlkZXJDbGFzcyI7ICAgICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfRURJVE9SX1BST1ZJREVSX0NMQVNTX0FUVFJJQlVURV9OQU1FID0gIm5vZGVFZGl0b3JQcm92aWRlckNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX0NMQVNTX0FUVFJJQlVURV9OQU1FID0gImZpbHRlckNsYXNzIjsgCi0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGV4dGVuc2lvbklkOwotICBwcm90ZWN0ZWQgSGFzaE1hcCBtYXA7Ci0KLSAgcHVibGljIE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkoU3RyaW5nIHByb3BlcnR5RWRpdG9yRXh0ZW5zaW9uSWQpCi0gIHsKLSAgICBleHRlbnNpb25JZCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmV4dGVuc2liaWxpdHlOb2RlQ3VzdG9taXphdGlvbnMiOy8vcHJvcGVydHlFZGl0b3JFeHRlbnNpb25JZDsKLSAgfSAgCi0gIAotICBwcml2YXRlIGNsYXNzIERlc2NyaXB0b3IKLSAgewotICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudDsKLSAgICBOb2RlRWRpdG9yUHJvdmlkZXIgbm9kZUVkaXRvclByb3ZpZGVyOwotICAgIE5vZGVGaWx0ZXIgbm9kZUZpbHRlcjsgICAgCi0gICAgYm9vbGVhbiBub2RlRWRpdG9yUHJvdmlkZXJGYWlsZWRUb0xvYWQgPSBmYWxzZTsKLSAgICBib29sZWFuIGxhYmVsUHJvdmlkZXJGYWlsZWRUb0xvYWQgPSBmYWxzZTsKLSAgICAKLSAgICBEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICAgIHsKLSAgICAgIHRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLSAgICAKLSAgICBOb2RlRWRpdG9yUHJvdmlkZXIgbG9va3VwT3JDcmVhdGVOb2RlRWRpdG9yUHJvdmlkZXIoKQotICAgIHsKLSAgICAgIGlmIChub2RlRWRpdG9yUHJvdmlkZXIgPT0gbnVsbCAmJiAhbm9kZUVkaXRvclByb3ZpZGVyRmFpbGVkVG9Mb2FkKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIG5vZGVFZGl0b3JQcm92aWRlciA9IChOb2RlRWRpdG9yUHJvdmlkZXIpY29uZmlndXJhdGlvbkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihOT0RFX0VESVRPUl9QUk9WSURFUl9DTEFTU19BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSAKLSAgICAgICAgewotICAgICAgICAgIG5vZGVFZGl0b3JQcm92aWRlckZhaWxlZFRvTG9hZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0gCi0gICAgICByZXR1cm4gbm9kZUVkaXRvclByb3ZpZGVyOwotICAgIH0KLSAgICAKLSAgICBJTGFiZWxQcm92aWRlciBjcmVhdGVMYWJlbFByb3ZpZGVyKCkKLSAgICB7Ci0gICAgICBpZiAoIWxhYmVsUHJvdmlkZXJGYWlsZWRUb0xvYWQpCi0gICAgICB7ICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKElMYWJlbFByb3ZpZGVyKWNvbmZpZ3VyYXRpb25FbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oTEFCRUxfUFJPVklERVJfQ0xBU1NfQVRUUklCVVRFX05BTUUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBsYWJlbFByb3ZpZGVyRmFpbGVkVG9Mb2FkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGVGaWx0ZXIgZ2V0Tm9kZUZpbHRlcigpCi0gICAgewotICAgICAgaWYgKCFub2RlRWRpdG9yUHJvdmlkZXJGYWlsZWRUb0xvYWQpCi0gICAgICB7ICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBub2RlRmlsdGVyID0gKE5vZGVGaWx0ZXIpY29uZmlndXJhdGlvbkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihGSUxURVJfQ0xBU1NfQVRUUklCVVRFX05BTUUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBub2RlRWRpdG9yUHJvdmlkZXJGYWlsZWRUb0xvYWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZUZpbHRlcjsKLSAgICB9Ci0gIH0KLQotICAKLSAgcHJpdmF0ZSBIYXNoTWFwIGluaXRNYXAoKQotICB7Ci0gICAgSGFzaE1hcCB0aGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGV4dGVuc2lvbnMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0Zvcigib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5leHRlbnNpYmlsaXR5Tm9kZUN1c3RvbWl6YXRpb25zIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA9IGV4dGVuc2lvbnNbaV07Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKE5BTUVTUEFDRSk7Ci0gICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRoZU1hcC5wdXQobmFtZXNwYWNlLCBuZXcgRGVzY3JpcHRvcihjb25maWd1cmF0aW9uRWxlbWVudCkpOwotICAgICAgfSAgICAgCi0gICAgfSAgICAKLSAgICByZXR1cm4gdGhlTWFwOwotICB9Ci0KLSAgcHJpdmF0ZSBEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIG1hcCA9IG51bGw7Ci0gICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgIHsgCi0gICAgICBpZiAobWFwID09IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgbWFwID0gaW5pdE1hcCgpOwotICAgICAgfSAgCi0gICAgICByZXR1cm4gKERlc2NyaXB0b3IpbWFwLmdldChuYW1lc3BhY2UpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgIAotICB9Ci0gIAotICBwdWJsaWMgTm9kZUVkaXRvclByb3ZpZGVyIGdldE5vZGVFZGl0b3JQcm92aWRlcihTdHJpbmcgbmFtZXNwYWNlKQotICB7ICAgICAKLSAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKG5hbWVzcGFjZSk7Ci0gICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBkZXNjcmlwdG9yLmxvb2t1cE9yQ3JlYXRlTm9kZUVkaXRvclByb3ZpZGVyKCk7ICAgICAgIAotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IobmFtZXNwYWNlKTsKLSAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotICAgIHsgIAotICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuY3JlYXRlTGFiZWxQcm92aWRlcigpOyAgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgTm9kZUZpbHRlciBnZXROb2RlRmlsdGVyKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKG5hbWVzcGFjZSk7Ci0gICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldE5vZGVGaWx0ZXIoKTsgICAgICAgCi0gICAgfQotICAgIHJldHVybiBudWxsOyAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTA2YWQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbgoteyAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUWUxFX05PTkUgPSAwOyAgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVFlMRV9URVhUID0gMTsgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUWUxFX0NPTUJPID0gMjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RZTEVfRElBTE9HID0gNDsgICAKLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U3R5bGUoKTsKLSAgCi0gIHByaXZhdGUgTm9kZSBub2RlOwotICBwcml2YXRlIE5vZGUgcGFyZW50Tm9kZTsKLQotICBwdWJsaWMgTm9kZSBnZXROb2RlKCkKLSAgewotICAgIHJldHVybiBub2RlOwotICB9Ci0gIHB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgdGhpcy5ub2RlID0gbm9kZTsKLSAgfQotICBwdWJsaWMgTm9kZSBnZXRQYXJlbnROb2RlKCkKLSAgewotICAgIHJldHVybiBwYXJlbnROb2RlOwotICB9Ci0gIHB1YmxpYyB2b2lkIHNldFBhcmVudE5vZGUoTm9kZSBwYXJlbnROb2RlKQotICB7Ci0gICAgdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlRWRpdG9yUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUVkaXRvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZDFjNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlRWRpdG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUVkaXRvclByb3ZpZGVyCi17Ci0gIHB1YmxpYyBhYnN0cmFjdCBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBnZXROb2RlRWRpdG9yQ29uZmlndXJhdGlvbihTdHJpbmcgcGFyZW50TmFtZSwgU3RyaW5nIG5vZGVOYW1lKTsgCi0gIC8vcHVibGljIGFic3RyYWN0IE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGdldE5vZGVFZGl0b3JDb25maWd1cmF0aW9uKE5vZGUgbm9kZSk7ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL05vZGVGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2FiYmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE5vZGVGaWx0ZXIKLXsgIAotICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVDb250ZXh0KE5vZGUgcGFyZW50Tm9kZSwgaW50IG5vZGVUeXBlLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKLSAgeyAgCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxODBmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMKLXsKLSAgc3RhdGljIAotICB7Ci0gICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcygib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5tZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIE1lc3NhZ2VzKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fT1BFTl9JTl9ORVdfRURJVE9SOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVA7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9SRUY7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9ERUZJTklUSU9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9HUk9VUF9SRUY7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0dST1VQOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0RFTEVURTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX1NJTVBMRV9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1VQREFURV9FTEVNRU5UX1JFRkVSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PX0lURU1TX1NFTEVDVEVEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfV0lUSF9ET1RTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0VESVRfV0lUSF9ET1RTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NIQU5HRV9QQVRURVJOOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9FTlVNRVJBVElPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9JTlNFUlRfRU5VTUVSQVRJT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX1BBVFRFUk47Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0VOVU1FUkFUSU9OUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ERUxFVEVfQ09OU1RSQUlOVFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fREVMRVRFX1BBVFRFUk47Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fREVMRVRFX0VOVU1FUkFUSU9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1NFVF9FTlVNRVJBVElPTl9WQUxVRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BBVFRFUk47Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0hBTkdFX01BWElNVU1fT0NDVVJSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX0lOVkFMSURfVkFMVUVfRk9SX01BWElNVU1fT0NDVVJSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DSEFOR0VfTUlOSU1VTV9PQ0NVUlJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9BUFBJTkZPX0VMRU1FTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FQUElORk9fQVRUUklCVVRFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0RFTEVURV9BUFBJTkZPX0VMRU1FTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fREVMRVRFX0FQUElORk9fQVRUUklCVVRFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NIQU5HRV9DT05URU5UX01PREVMOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1JFTkFNRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DSEFOR0VfRU5VTUVSQVRJT05fVkFMVUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9JTlZBTElEX05BTUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OQU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUkVGRVJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1VQREFURV9NQVhJTVVNX09DQ1VSUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX01JTklNVU1fT0NDVVJSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1JFQURPTkxZOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfSU5DTFVTSVZFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09MTEFQU0VfV0hJVEVTUEFDRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NQRUNJRklDX0NPTlNUUkFJTlRfVkFMVUVTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUkVTVFJJQ1RfVkFMVUVTX0JZOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5VTUVSQVRJT05TOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUEFUVEVSTlM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9NSU5JTVVNX0xFTkdUSDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX01BWElNVU1fTEVOR1RIOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09OU1RSQUlOVFNfT05fTEVOR1RIX09GOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09OU1RSQUlOVFNfT05fVkFMVUVfT0Y7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9NSU5JTVVNX1ZBTFVFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTUFYSU1VTV9WQUxVRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NPTlRSQUlOVFNfT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQkxPQ0tERUZBVUxUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRklOQUxERUZBVUxUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NPTlNUUkFJTl9MRU5HVEg7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX0JPVU5EUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DT0xMQVBTRV9XSElURVNQQUNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQkFTRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX0lOVkFMSURfRklMRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VYVEVOU0lPTlM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0VYVEVOU0lPTl9DT01QT05FTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fREVMRVRFX0VYVEVOU0lPTl9DT01QT05FTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9VUDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RPV047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FWFRFTlNJT05fREVUQUlMUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRE9DVU1FTlRBVElPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRVhURU5TSU9OX0NPTVBPTkVOVFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FWFRFTlNJT05fQ0FURUdPUklFUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FERF9XSVRIX0RPVFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ERUxFVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FRElUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVZBSUxBQkxFX0NPTVBPTkVOVFNfVE9fQUREOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRURJVF9DQVRFR09SWTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX0lOVkFMSURfQ0FURUdPUlk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9GSUxFX0NBTk5PVF9CRV9QQVJTRUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9WQUxJREFURV9USEVfRklMRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NDSEVNQTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FERF9DQVRFR09SWTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX05BTUVfQUxSRUFEWV9VU0VEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0JST1dTRV9XT1JLU1BBQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TRUxFQ1RfWFNEX0ZJTEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ERVNDUklQVElPTl9DSE9PU0VfWFNEX0ZJTEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQlJPV1NFX0NBVEFMT0c7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FOWV9FTEVNRU5UOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9BTllfQVRUUklCVVRFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1NFVF9CQVNFX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9UT09MVElQX1JFTkFNRV9SRUZBQ1RPUjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1ZBTFVFX0NPTE9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SRUY7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GSVhFRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RFRkFVTFQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GT1JNOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVVNBR0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0hBTkdFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NMT1NFX1NDSEVNQV9QUkVWSUVXX1BPUFVQOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX05BTUVTUEFDRV9JTkZPUk1BVElPTl9DSEFOR0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BQlNUUkFDVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0JMT0NLOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRklOQUw7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TVUJTVElUVVRJT05fR1JPVVA7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9NSVhFRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1ZBTFVFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRk9STTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05JTExBQkxFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRUxFTUVOVEZPUk1ERUZBVUxUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUklCVVRFRk9STURFRkFVTFQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9XT1JLU1BBQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DQVRBTE9HOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfREVMRVRFX0JVVFRPTjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvWFNEQ29tbW9uVUlVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9YU0RDb21tb25VSVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MTA4ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9YU0RDb21tb25VSVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIE5hb2tpIEFraXlhbWEsIEZ1aml0c3UgLSBCdWcgMjQ0OTAxIC0gQ2Fubm90IHNldCB4c2Q6YW5ub3RhdGlvbiB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHNkOnJlZGVmaW5lIGJ5IFByb3BlcnRpZXMgdmlldy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpb25PdmVybGF5SWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkltYWdlT3ZlcmxheURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5BYnN0cmFjdFNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5vdGF0aW9uRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RYUGF0aERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFhTRENvbW1vblVJVXRpbHMKLXsKLSAgcHVibGljIFhTRENvbW1vblVJVXRpbHMoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRVcGRhdGVkSW1hZ2UoWFNEQ29uY3JldGVDb21wb25lbnQgaW5wdXQsIEltYWdlIGJhc2VJbWFnZSwgYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uID0gZ2V0SW5wdXRYU0RBbm5vdGF0aW9uKGlucHV0LCBmYWxzZSk7Ci0gICAgCi0gICAgaWYgKHhzZEFubm90YXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoeHNkQW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCkuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gV2lsbCB1c2UgdGhlIGNsYXNzIG5hbWUgYXBwZW5kZWQgYnkgdGhlIHJlYWQgb25seSBzdGF0ZSBhcyB0aGUgbmFtZSBvZiB0aGUgaW1hZ2UuCi0gICAgICAgIC8vIFRoZXJlIGlzIGEgZGlzYWJsZWQgYW5kIGFuIGVuYWJsZWQgdmVyc2lvbiBvZiBlYWNoIGJhc2VJbWFnZSwgc28gd2UgY2FuJ3Qgc2ltcGx5Ci0gICAgICAgIC8vIHVzZSB0aGUgY29tcG9uZW50IG5hbWUgYXMgdGhlIG5hbWUgb2YgdGhlIGltYWdlCi0gICAgICAgIFN0cmluZyBpbWFnZU5hbWUgPSBpbnB1dC5nZXRDbGFzcygpLmdldE5hbWUoKSArIGlzUmVhZE9ubHk7Ci0gICAgICAgIEltYWdlIG5ld0ltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGltYWdlTmFtZSk7Ci0gICAgICAgIGlmIChuZXdJbWFnZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSW1hZ2VPdmVybGF5RGVzY3JpcHRvciBvdnIgPSBuZXcgSW1hZ2VPdmVybGF5RGVzY3JpcHRvcihiYXNlSW1hZ2UsIGlzUmVhZE9ubHkpOwotICAgICAgICAgIG5ld0ltYWdlID0gb3ZyLmdldEltYWdlKCk7Ci0gICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGltYWdlTmFtZSwgbmV3SW1hZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdJbWFnZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJhc2VJbWFnZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgWFNEQW5ub3RhdGlvbiBnZXRJbnB1dFhTREFubm90YXRpb24oWFNEQ29uY3JldGVDb21wb25lbnQgaW5wdXQsIGJvb2xlYW4gY3JlYXRlSWZOb3RFeGlzdCkKLSAgewotICAgIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbiA9IG51bGw7Ci0gICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0U7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQ29tcCA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24geHNkQ29tcCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZENvbXAgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETm90YXRpb25EZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIHhzZENvbXAgPSAoWFNETm90YXRpb25EZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFhQYXRoRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RYUGF0aERlZmluaXRpb24geHNkQ29tcCA9IChYU0RYUGF0aERlZmluaXRpb24pIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXAgeHNkQ29tcCA9IChYU0RNb2RlbEdyb3VwKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkQ29tcCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pCi0gICAgewotICAgICAgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiB4c2RDb21wID0gKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICB7Ci0gICAgICBYU0RXaWxkY2FyZCB4c2RDb21wID0gKFhTRFdpbGRjYXJkKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSB4c2RDb21wID0gKFhTRFNjaGVtYSkgaW5wdXQ7Ci0gICAgICBMaXN0IGxpc3QgPSB4c2RDb21wLmdldEFubm90YXRpb25zKCk7Ci0gICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gKFhTREFubm90YXRpb24pIGxpc3QuZ2V0KDApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgICAgaWYgKHhzZENvbXAuZ2V0Q29udGVudHMoKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZENvbXAuZ2V0Q29udGVudHMoKS5hZGQoMCwgeHNkQW5ub3RhdGlvbik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4geHNkQW5ub3RhdGlvbjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RGYWNldCkKLSAgICB7Ci0gICAgICBYU0RGYWNldCB4c2RDb21wID0gKFhTREZhY2V0KSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24geHNkQ29tcCA9IChYU0RUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREluY2x1ZGUpCi0gICAgewotICAgICAgWFNESW5jbHVkZSB4c2RDb21wID0gKFhTREluY2x1ZGUpIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgewotICAgICAgWFNESW1wb3J0IHhzZENvbXAgPSAoWFNESW1wb3J0KSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgewotICAgICAgWFNEUmVkZWZpbmUgeHNkQ29tcCA9IChYU0RSZWRlZmluZSkgaW5wdXQ7Ci0gICAgICBMaXN0IGNvbnRlbnRzID0geHNkQ29tcC5nZXRDb250ZW50cygpOyAKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudHMuc2l6ZSgpOyBpKyspCi0gICAgICB7IAotICAgICAgICBPYmplY3QgY29udGVudCA9IGNvbnRlbnRzLmdldChpKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RBbm5vdGF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgeHNkQW5ub3RhdGlvbiA9IChYU0RBbm5vdGF0aW9uKSBjb250ZW50OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgY29udGVudHMuYWRkKDAsIHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgICAgcmV0dXJuIHhzZEFubm90YXRpb247Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0gKFhTREFubm90YXRpb24pIGlucHV0OwotICAgIH0KLQotICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0KQotICAgIHsKLSAgICAgIGZvcm1hdEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHhzZEFubm90YXRpb247Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEFubm90YXRpb24oWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gYW5ub3RhdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgZm9ybWF0Q2hpbGQoZWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgZm9ybWF0Q2hpbGQoTm9kZSBjaGlsZCkKLSAgewotICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgIElET01Nb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpIGNoaWxkKS5nZXRNb2RlbCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0gICAgICAgIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLSAgICAgICAgZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUoY2hpbGQpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoU3RyaW5nIHByZWZpeCwgTGlzdCBlbGVtZW50cykKLSAgewotICAgIEFycmF5TGlzdCB1c2VkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIHVzZWROYW1lcy5hZGQoZ2V0RGlzcGxheU5hbWUoKFhTRE5hbWVkQ29tcG9uZW50KSBpLm5leHQoKSkpOwotICAgIH0KLQotICAgIGludCBpID0gMTsKLSAgICBTdHJpbmcgdGVzdE5hbWUgPSBwcmVmaXg7Ci0gICAgd2hpbGUgKHVzZWROYW1lcy5jb250YWlucyh0ZXN0TmFtZSkpCi0gICAgewotICAgICAgdGVzdE5hbWUgPSBwcmVmaXggKyBpKys7Ci0gICAgfQotICAgIHJldHVybiB0ZXN0TmFtZTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVW5pcXVlRW51bWVyYXRpb25WYWx1ZShTdHJpbmcgcHJlZml4LCBMaXN0IGVsZW1lbnRzKQotICB7Ci0gICAgQXJyYXlMaXN0IHVzZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgdXNlZE5hbWVzLmFkZCgoKFhTREVudW1lcmF0aW9uRmFjZXQpIGkubmV4dCgpKS5nZXRMZXhpY2FsVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgaW50IGkgPSAxOwotICAgIFN0cmluZyB0ZXN0TmFtZSA9IHByZWZpeDsKLSAgICB3aGlsZSAodXNlZE5hbWVzLmNvbnRhaW5zKHRlc3ROYW1lKSkKLSAgICB7Ci0gICAgICB0ZXN0TmFtZSA9IHByZWZpeCArIGkrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHRlc3ROYW1lOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgcmV0dXJuIGdldERpc3BsYXlOYW1lRnJvbVhTRFR5cGUoKFhTRFR5cGVEZWZpbml0aW9uKSBjb21wb25lbnQpOwotCi0gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREZlYXR1cmUpCi0gICAgewotICAgICAgWFNERmVhdHVyZSBmZWF0dXJlID0gKFhTREZlYXR1cmUpIGNvbXBvbmVudDsKLSAgICAgIGlmIChmZWF0dXJlLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICByZXR1cm4gZmVhdHVyZS5nZXROYW1lKCk7Ci0gICAgICBlbHNlIGlmIChmZWF0dXJlLmdldFJlc29sdmVkRmVhdHVyZSgpICE9IG51bGwgJiYgZmVhdHVyZS5nZXRSZXNvbHZlZEZlYXR1cmUoKS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIGZlYXR1cmUuZ2V0UmVzb2x2ZWRGZWF0dXJlKCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHJldHVybiBjb21wb25lbnQuZ2V0TmFtZSgpOwotCi0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaXNwbGF5TmFtZUZyb21YU0RUeXBlKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWVGcm9tWFNEVHlwZSh0eXBlLCB0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpc3BsYXlOYW1lRnJvbVhTRFR5cGUoWFNEVHlwZURlZmluaXRpb24gdHlwZSwgYm9vbGVhbiByZXR1cm5QcmltaXRpdmVQYXJlbnRzKQotICB7Ci0gICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgaWYgKHR5cGUuZ2V0TmFtZSgpID09IG51bGwgfHwgdHlwZS5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocmV0dXJuUHJpbWl0aXZlUGFyZW50cyAmJiBpc1ByaW1pdGl2ZVR5cGUodHlwZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBnZXREaXNwbGF5TmFtZUZyb21YU0RUeXBlKHR5cGUuZ2V0QmFzZVR5cGUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIEVPYmplY3QgY29udGFpbmVyID0gdHlwZS5lQ29udGFpbmVyKCk7Ci0KLSAgICAgIHdoaWxlIChjb250YWluZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50ICYmICgoWFNETmFtZWRDb21wb25lbnQpIGNvbnRhaW5lcikuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKChYU0ROYW1lZENvbXBvbmVudCkgY29udGFpbmVyKS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gdHlwZS5nZXROYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmVUeXBlKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlID0gbnVsbDsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGJhc2VUeXBlID0gdHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gb3JpZ1R5cGUgPSBiYXNlVHlwZTsgLy8gS0M6IGFsdGhvdWdoIGludmFsaWQsIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCBjeWNsZXMgYW5kIHRvIGF2b2lkIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZmluaXRlIGxvb3AKLSAgICAgIHdoaWxlIChiYXNlVHlwZSAhPSBudWxsICYmICFYU0RDb25zdGFudHMuaXNBbnlTaW1wbGVUeXBlKGJhc2VUeXBlKSAmJiAhWFNEQ29uc3RhbnRzLmlzQW55VHlwZShiYXNlVHlwZSkgJiYgb3JpZ1R5cGUgIT0gYmFzZVR5cGUpCi0gICAgICB7Ci0gICAgICAgIHR5cGUgPSBiYXNlVHlwZTsKLSAgICAgICAgYmFzZVR5cGUgPSB0eXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICB9Ci0gICAgICBiYXNlVHlwZSA9IHR5cGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIChYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKGJhc2VUeXBlLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGdldEFub255bW91c1NpbXBsZVR5cGUoWFNERmVhdHVyZSBpbnB1dCwgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBhbm9ueW1vdXNTaW1wbGVUeXBlID0gbnVsbDsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiBsb2NhbFR5cGUgPSBudWxsOwotCi0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIGxvY2FsVHlwZSA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBsb2NhbFR5cGUgPSAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLSAgICB9Ci0KLSAgICBpZiAobG9jYWxUeXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgbG9jYWxUeXBlOwotICAgIH0KLSAgICByZXR1cm4gYW5vbnltb3VzU2ltcGxlVHlwZTsKLSAgfQotCi0gIC8vIGJ1ZzI0NjAzNiAtIGNoZWNrIGZvciBjeWNsaWMgZ3JvdXBzLiAgV2Ugc2hvdWxkIHJlZmFjdG9yIG91dCB0aGlzIHN0YXRpYyBjbGFzcy4KLSAgcHJpdmF0ZSBzdGF0aWMgU3RhY2sgdmlzaXRlZEdyb3VwcyA9IG5ldyBTdGFjaygpOwotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0VmlzaXRlZEdyb3Vwc1N0YWNrKCkKLSAgewotICAgIHZpc2l0ZWRHcm91cHMuY2xlYXIoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDaGlsZEVsZW1lbnRzKFhTRE1vZGVsR3JvdXAgZ3JvdXApCi0gIHsKLSAgICBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHZpc2l0ZWRHcm91cHMucHVzaChncm91cCk7Ci0gICAgaWYgKGdyb3VwID09IG51bGwpIHJldHVybiBjaGlsZHJlbjsKLSAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBncm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RQYXJ0aWNsZSBuZXh0ID0gKFhTRFBhcnRpY2xlKSBpLm5leHQoKTsKLSAgICAgIGlmIChuZXh0LmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIFhTREZlYXR1cmUpCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGlsZHJlbi5jb250YWlucyhuZXh0LmdldENvbnRlbnQoKSkpIGJyZWFrOwotICAgICAgICBjaGlsZHJlbi5hZGQobmV4dC5nZXRDb250ZW50KCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobmV4dC5nZXRUZXJtKCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgewotICAgICAgICBpZiAoIXZpc2l0ZWRHcm91cHMuY29udGFpbnMoZ3JvdXApKQotICAgICAgICBjaGlsZHJlbi5hZGRBbGwoZ2V0Q2hpbGRFbGVtZW50cygoWFNETW9kZWxHcm91cCkgbmV4dC5nZXRUZXJtKCkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdmlzaXRlZEdyb3Vwcy5wb3AoKTsKLSAgICByZXR1cm4gY2hpbGRyZW47Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsQXR0cmlidXRlcyhYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGUpCi0gIHsKLSAgICBMaXN0IGF0dHJpYnV0ZXMgPSBnZXRDaGlsZEVsZW1lbnRzKHhzZENvbXBsZXhUeXBlKTsKLSAgICBhdHRyaWJ1dGVzLmFkZEFsbChnZXRDaGlsZEF0dHJpYnV0ZXMoeHNkQ29tcGxleFR5cGUpKTsKLQotICAgIHJldHVybiBhdHRyaWJ1dGVzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbEF0dHJpYnV0ZXMoWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb24pCi0gIHsKLSAgICBMaXN0IGF0dHJpYnV0ZXMgPSBnZXRDaGlsZEVsZW1lbnRzKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKTsKLQotICAgIHJldHVybiBhdHRyaWJ1dGVzOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0SW5oZXJpdGVkQXR0cmlidXRlcyhYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QpCi0gIHsKLSAgICBMaXN0IGF0dHJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFhTRFR5cGVEZWZpbml0aW9uIHBhcmVudCA9IGN0LmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gJiYgY3QuaXNTZXREZXJpdmF0aW9uTWV0aG9kKCkpCi0gICAgewotICAgICAgYXR0cnMuYWRkQWxsKGdldEFsbEF0dHJpYnV0ZXMoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgcGFyZW50KSk7Ci0gICAgICBpZiAoISBjdC5pc0NpcmN1bGFyKCkpIGF0dHJzLmFkZEFsbChnZXRJbmhlcml0ZWRBdHRyaWJ1dGVzKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHBhcmVudCkpOwotICAgIH0KLQotICAgIHJldHVybiBhdHRyczsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDaGlsZEVsZW1lbnRzKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCkKLSAgewotICAgIHJldHVybiBnZXRDaGlsZEVsZW1lbnRzKGdldE1vZGVsR3JvdXAoY3QpKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldENoaWxkRWxlbWVudHMoWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb24pCi0gIHsKLSAgICByZXR1cm4gZ2V0Q2hpbGRFbGVtZW50cyh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRNb2RlbEdyb3VwKCkpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFhTRE1vZGVsR3JvdXAgZ2V0TW9kZWxHcm91cChYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY1R5cGUpCi0gIHsKLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IGNUeXBlLmdldENvbXBsZXhUeXBlKCk7Ci0KLSAgICBpZiAocGFydGljbGUgPT0gbnVsbCB8fCBwYXJ0aWNsZS5lQ29udGFpbmVyKCkgIT0gY1R5cGUpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIE9iamVjdCBwYXJ0aWNsZUNvbnRlbnQgPSBwYXJ0aWNsZS5nZXRDb250ZW50KCk7Ci0gICAgWFNETW9kZWxHcm91cCBncm91cCA9IG51bGw7Ci0KLSAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICBncm91cCA9ICgoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHBhcnRpY2xlQ29udGVudCkuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgZ3JvdXAgPSAoWFNETW9kZWxHcm91cCkgcGFydGljbGVDb250ZW50OwotCi0gICAgaWYgKGdyb3VwID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIGlmIChncm91cC5nZXRDb250ZW50cygpLmlzRW1wdHkoKSB8fCBncm91cC5lUmVzb3VyY2UoKSAhPSBjVHlwZS5lUmVzb3VyY2UoKSkKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29udGVudCA9IGNUeXBlLmdldENvbnRlbnQoKTsKLSAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICAgIGdyb3VwID0gKFhTRE1vZGVsR3JvdXApICgoWFNEUGFydGljbGUpIGNvbnRlbnQpLmdldENvbnRlbnQoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q2hpbGRBdHRyaWJ1dGVzKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCkKLSAgewotICAgIEVMaXN0IGF0dHJDb250ZW50cyA9IGN0LmdldEF0dHJpYnV0ZUNvbnRlbnRzKCk7Ci0gICAgTGlzdCBhdHRycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJDb250ZW50cy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBPYmplY3QgbmV4dCA9IGF0dHJDb250ZW50cy5nZXQoaSk7Ci0KLSAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBhdHRycy5hZGQoKChYU0RBdHRyaWJ1dGVVc2UpIG5leHQpLmdldENvbnRlbnQoKS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobmV4dCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgLy9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgbmV4dDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGF0dHJzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZVdpdGhFcnJvck92ZXJsYXkoWFNEQ29uY3JldGVDb21wb25lbnQgaW5wdXQsIEltYWdlIGJhc2VJbWFnZSwgYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgSW1hZ2UgZXh0ZW5zaW9uSW1hZ2UgPSBnZXRVcGRhdGVkSW1hZ2UoaW5wdXQsIGJhc2VJbWFnZSwgaXNSZWFkT25seSk7Ci0gICAgSW1hZ2VEZXNjcmlwdG9yIGVycm9yT3ZlcmxheSA9IFhTREVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL292cjE2L2Vycm9yX292ci5naWYiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoYmFzZUltYWdlID09IGV4dGVuc2lvbkltYWdlKQotICAgIHsKLSAgICAgIFN0cmluZyBpbWFnZU5hbWUgPSBpbnB1dC5nZXRDbGFzcygpLmdldE5hbWUoKSArICJfZXJyb3JfIiArIGlzUmVhZE9ubHk7Ci0gICAgICBJbWFnZSBuZXdJbWFnZSA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChpbWFnZU5hbWUpOwotICAgICAgaWYgKG5ld0ltYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIERlY29yYXRpb25PdmVybGF5SWNvbiBvdnIgPSBuZXcgRGVjb3JhdGlvbk92ZXJsYXlJY29uKGJhc2VJbWFnZSwgZXJyb3JPdmVybGF5LCBJRGVjb3JhdGlvbi5UT1BfTEVGVCk7Ci0gICAgICAgIG5ld0ltYWdlID0gb3ZyLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChpbWFnZU5hbWUsIG5ld0ltYWdlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXdJbWFnZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyBpbWFnZU5hbWUgPSBpbnB1dC5nZXRDbGFzcygpLmdldE5hbWUoKSArICJfZXh0ZW5zaW9uX2Vycm9yXyIgKyBpc1JlYWRPbmx5OwotICAgICAgSW1hZ2UgbmV3SW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoaW1hZ2VOYW1lKTsKLSAgICAgIGlmIChuZXdJbWFnZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBEZWNvcmF0aW9uT3ZlcmxheUljb24gb3ZyID0gbmV3IERlY29yYXRpb25PdmVybGF5SWNvbihleHRlbnNpb25JbWFnZSwgZXJyb3JPdmVybGF5LCBJRGVjb3JhdGlvbi5UT1BfTEVGVCk7Ci0gICAgICAgIG5ld0ltYWdlID0gb3ZyLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChpbWFnZU5hbWUsIG5ld0ltYWdlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXdJbWFnZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIENDb21ibyBnZXROZXdQcm9wZXJ0aWVzQ29tYm8oQ29tcG9zaXRlIGNvbXBvc2l0ZSwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSwKLSAgICAgIEFic3RyYWN0U2VjdGlvbiBsaXN0ZW5lciwgU3RyaW5nW10gaXRlbXMsIFN0cmluZyBoZWxwSUQpCi0gIHsKLSAgICBDQ29tYm8gY29tYm8gPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIGNvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICBjb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0gICAgY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOyAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbWJvLCBoZWxwSUQpOwotICAgIHJldHVybiBjb21ibzsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBDTGFiZWwgZ2V0TmV3UHJvcGVydGllc0xhYmVsKENvbXBvc2l0ZSBjb21wb3NpdGUsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnksCi0gICAgICBTdHJpbmcgbGFiZWxUZXh0KQotICB7Ci0gICAgLy8gQ3JlYXRlIGxhYmVsCi0gICAgQ0xhYmVsIGxhYmVsOyAgICAKLSAgICBsYWJlbCA9IHdpZGdldEZhY3RvcnkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgbGFiZWxUZXh0KTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvWFNERGlyZWN0aXZlc01hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvWFNERGlyZWN0aXZlc01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhMWQ4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL1hTRERpcmVjdGl2ZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnRleHQuWFNETW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RTY2hlbWFJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwZXJmb3JtcyBjbGVhbnVwL3JlbW92YWwgb2YgdW51c2VkIFhTRCBpbXBvcnRzIGFuZCBpbmNsdWRlcyBmcm9tIFhNTCBTY2hlbWFzCi0gKiBhbmQgeG1sbnMgZW50cmllcyBpbiB0aGUgbmFtZXNwYWNlIHRhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0REaXJlY3RpdmVzTWFuYWdlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxucyI7IC8vJE5PTi1OTFMtMSQKLSAgLy8gTGlzdCBvZiBhbGwgdGhlIHVudXNlZCBkaXJlY3RpdmVzLiAgVGhlc2Ugd2lsbCBiZSByZW1vdmVkCi0gIHByb3RlY3RlZCBMaXN0IHVudXNlZERpcmVjdGl2ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIC8vIExpc3Qgb2YgYWxsIHRoZSBpbmNsdWRlZCBYU0RTY2hlbWEncwotICBwcm90ZWN0ZWQgTGlzdCB1c2VkSW5jbHVkZVNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIC8vIExpc3Qgb2YgYWxsIHRoZSBYU0RJbmNsdWRlJ3MgdGhhdCBhcmUgaW5kaXJlY3RseSB1c2VkCi0gIHByb3RlY3RlZCBMaXN0IHVzZWRJbmRpcmVjdEluY2x1ZGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAvLyBMaXN0IG9mIHRoZSBYU0RJbmNsdWRlJ3MgdGhhdCBhcmUgZGlyZWN0bHkgdXNlZAotICBwcm90ZWN0ZWQgTGlzdCB1c2VkRGlyZWN0SW5jbHVkZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIC8vIFVzZWQgdG8gdHJhY2sgdGhlIGluY2x1ZGVkIHNjaGVtYXMgdGhhdCB3ZXJlIGFuYWx5emVkIHRvIGF2b2lkIGNpcmN1bGFyIGxvb3AKLSAgcHJvdGVjdGVkIExpc3QgYW5hbHl6ZWRJbmNsdWRlU2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgLy8gTGlzdCBvZiBhbGwgdGhlIGltcG9ydGVkIHVzZWQgc2NoZW1hcwotICBwcm90ZWN0ZWQgTGlzdCB1c2VkU2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgLy8gTGlzdCBvZiBhbGwgdGhlIGluZGlyZWN0bHkgdXNlZCBpbmNsdWRlcyAgCi0gIHByb3RlY3RlZCBNYXAgdXNlZEluZGlyZWN0SW5jbHVkZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAvLyBLZWVwIHRyYWNrIG9mIGFsbCB0aGUgdW51c2VkIHByZWZpeGVzCi0gIHByb3RlY3RlZCBTZXQgdW51c2VkUHJlZml4ZXM7Ci0gIC8vIEtlZXAgdHJhY2sgb2YgYWxsIHRoZSB1c2VkIHByZWZpeGVzCi0gIHByb3RlY3RlZCBTZXQgdXNlZFByZWZpeGVzOwotICAvLyBNYXAgb2YgZWFjaCBzY2hlbWEncyB1bnVzZWQgcHJlZml4ZXMKLSAgcHJvdGVjdGVkIE1hcCBzY2hlbWFUb1ByZWZpeE1hcDsKLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlVW51c2VkWFNESW1wb3J0cyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgLy8gT25seSBkbyB0aGUgcmVtb3ZhbCBpZiB0aGUgcHJlZmVyZW5jZSBpcyB0dXJuZWQgb24KLSAgICBpZiAoWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZW1vdmVJbXBvcnRTZXR0aW5nKCkpCi0gICAgewotICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIgbWdyID0gbmV3IFhTRERpcmVjdGl2ZXNNYW5hZ2VyKCk7Ci0gICAgICBtZ3IucGVyZm9ybVJlbW92YWwoc2NoZW1hKTsKLSAgICAgIG1nci5jbGVhbnVwKCk7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogTWFpbiBtZXRob2QgdG8gZG8gdGhlIGNsZWFudXAKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKi8KLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlbW92YWwoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIC8vIENvbXB1dGUgdW51c2VkIGltcG9ydHMgYW5kIHVudXNlZCBwcmVmaXhlcwotICAgIGNvbXB1dGVVbnVzZWRJbXBvcnRzKHNjaGVtYSk7Ci0gICAgLy8gUmVtb3ZlIHRoZSBpbXBvcnRzCi0gICAgcmVtb3ZlVW51c2VkSW1wb3J0cygpOwotICAgIC8vIFJlbW92ZSB0aGUgcHJlZml4ZXMKLSAgICByZW1vdmVVbnVzZWRQcmVmaXhlcygpOwotICB9Ci0gIAotICAvKioKLSAgICogQ2xpZW50cyBjYW4gbWFudWFsbHkgY2xlYW4gdGhlIGxpc3RzCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkKLSAgewotICAgIGNsZWFyTWFwcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFmdGVyIHBlcmZvcm1pbmcgdGhlIGNsZWFudXAsIHJldHVybiB0aGUgbGlzdCBvZiB1bnVzZWQgWFNEIGRpcmVjdGl2ZXMKLSAgICogIAotICAgKiBAcmV0dXJuIGxpc3Qgb2YgdW51c2VkIFhTRCBkaXJlY3RpdmVzCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRVbnVzZWRYU0REaXJlY3RpdmVzKCkKLSAgewotICAgIHJldHVybiB1bnVzZWREaXJlY3RpdmVzOwotICB9Ci0gIAotICAvKioKLSAgICogQWZ0ZXIgcGVyZm9ybWluZyB0aGUgY2xlYW51cCwgcmV0dXJuIHRoZSBtYXAgb2YgZWFjaCBzY2hlbWFzIHVudXNlZCBwcmVmaXhlcwotICAgKiAKLSAgICogQHJldHVybiBtYXAgb2YgZWFjaCBzY2hlbWFzIHVudXNlZCBwcmVmaXhlcwotICAgKi8KLSAgcHVibGljIE1hcCBnZXRTY2hlbWFUb1ByZWZpeE1hcCgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hVG9QcmVmaXhNYXA7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2V0IG9mIHVudXNlZCBwcmVmaXhlcyBmcm9tIHRoZSBYTUwgbmFtZXNwYWNlIHRhYmxlCi0gICAqIAotICAgKiBAcmV0dXJuIHNldCBvZiB1bnVzZWQgcHJlZml4ZXMKLSAgICovCi0gIHB1YmxpYyBTZXQgZ2V0VW51c2VkUHJlZml4ZXMoKQotICB7Ci0gICAgcmV0dXJuIHVudXNlZFByZWZpeGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHNldCBvZiB1c2VkIHByZWZpeGVzIGZyb20gdGhlIFhNTCBuYW1lc3BhY2UgdGFibGUKLSAgICogCi0gICAqIEByZXR1cm4gc2V0IG9mIHVzZWQgcHJlZml4ZXMKLSAgICovCi0gIHB1YmxpYyBTZXQgZ2V0VXNlZFByZWZpeGVzKCkKLSAgewotICAgIHJldHVybiB1c2VkUHJlZml4ZXM7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSBhbnkgY2xlYW51cCBhZnRlciBjb21wdXRpbmcgYW5kIHJlbW92aW5nIHRoZSB1bnVzZWQgaW1wb3J0cy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNsZWFyTWFwcygpCi0gIHsKLSAgICBpZiAoc2NoZW1hVG9QcmVmaXhNYXAgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzY2hlbWFUb1ByZWZpeE1hcC5jbGVhcigpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmUgdGhlIGxpc3Qgb2YgYWxsIHVudXNlZCBpbXBvcnRzLiAgSW1wb3J0cyBpcyB1c2VkIGluIHRoZSBnZW5lcmljIHRlcm0gaGVyZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZVVudXNlZEltcG9ydHMoKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHVudXNlZERpcmVjdGl2ZXMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgWFNEU2NoZW1hRGlyZWN0aXZlIHhzZERpcmVjdGl2ZSA9IChYU0RTY2hlbWFEaXJlY3RpdmUpIGl0ZXIubmV4dCgpOwotICAgICAgcmVtb3ZlWFNERGlyZWN0aXZlKHhzZERpcmVjdGl2ZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZXMgdGhlIGRpcmVjdGl2ZSBmcm9tIHRoZSBtb2RlbAotICAgKiBAcGFyYW0geHNkSW1wb3J0Ci0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVYU0REaXJlY3RpdmUoWFNEU2NoZW1hRGlyZWN0aXZlIHhzZEltcG9ydCkKLSAgewotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSB4c2RJbXBvcnQuZ2V0U2NoZW1hKCk7Ci0gICAgCi0gICAgRWxlbWVudCBlbGVtZW50ID0geHNkSW1wb3J0LmdldEVsZW1lbnQoKTsKLSAgICAKLSAgICBEb2N1bWVudCBkb2MgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQotICAgIGlmIChkb2MgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgICgoSURPTU5vZGUpZG9jKS5nZXRNb2RlbCgpLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICghcmVtb3ZlVGV4dE5vZGVzQmV0d2Vlbk5leHRFbGVtZW50KGVsZW1lbnQpKQotICAgICAgewotICAgICAgICByZW1vdmVUZXh0Tm9kZUJldHdlZW5QcmV2aW91c0VsZW1lbnQoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBlbGVtZW50LmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChlbGVtZW50KTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGlmIChkb2MgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgIHsKLSAgICAgICAgKChJRE9NTm9kZSlkb2MpLmdldE1vZGVsKCkuY2hhbmdlZE1vZGVsKCk7Ci0gICAgICB9Ci0gICAgICBzY2hlbWEudXBkYXRlKHRydWUpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgY29tcHV0ZXMgdGhlIGxpc3Qgb2YgdW51c2VkIGltcG9ydHMgZm9yIGEgc2NoZW1hCi0gICAqIEBwYXJhbSBzY2hlbWEKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVVbnVzZWRJbXBvcnRzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICB1bnVzZWREaXJlY3RpdmVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHVzZWRTY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHVzZWRQcmVmaXhlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgc2NoZW1hVG9QcmVmaXhNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFN0ZXAgT25lLiAgRmluZCB1bnVzZWQgaW1wb3J0cyB1c2luZyBjcm9zcyByZWZlcmVuY2VyCi0gICAgICBNYXAgeHNkTmFtZWRDb21wb25lbnRVc2FnZSA9IFRvcExldmVsQ29tcG9uZW50Q3Jvc3NSZWZlcmVuY2VyLmZpbmQoc2NoZW1hKTsKLSAgICAgIAotICAgICAgZG9Dcm9zc1JlZmVyZW5jZXIoc2NoZW1hLCB1c2VkU2NoZW1hcywgeHNkTmFtZWRDb21wb25lbnRVc2FnZSk7Ci0KLSAgICAgIC8vIFN0ZXAgVHdvLiAgVXBkYXRlIHRoZSB1bnVzZWRJbXBvcnQgbGlzdCBnaXZlbiB0aGUgbGlzdCBvZiB1c2VkIHNjaGVtYXMgb2J0YWluZWQgZnJvbSBjcm9zcyByZWZlcmVuY2luZwotICAgICAgYWRkVG9VbnVzZWRJbXBvcnRzKHNjaGVtYSwgdXNlZFNjaGVtYXMpOwotICAgICAgCi0gICAgICAvLyBTdGVwIFRocmVlLiAgQ29tcHV0ZSB1bnVzZWQgcHJlZml4ZXMgdG8gYmUgcmVtb3ZlZAotICAgICAgY29tcHV0ZVVudXNlZFByZWZpeGVzKHNjaGVtYSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB1bnVzZWREaXJlY3RpdmVzLmNsZWFyKCk7Ci0gICAgICBzY2hlbWFUb1ByZWZpeE1hcC5jbGVhcigpOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIENvbXB1dGVzIHRoZSBsaXN0IG9mIHVudXNlZCBwcmVmaXhlcyBmcm9tIHRoZSBYTUwgbmFtZXNwYWNlIHRhYmxlIGdpdmVuIGEgc2NoZW1hCi0gICAqIEBwYXJhbSBzY2hlbWEKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVVbnVzZWRQcmVmaXhlcyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgTWFwIHByZWZpeE1hcCA9IHNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgU2V0IGRlZmluZWRQcmVmaXhlcyA9IHByZWZpeE1hcC5rZXlTZXQoKTsKLSAgICBTZXQgYWN0dWFsU2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IHNjaGVtYS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlcygpOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSBkZWZpbmVkUHJlZml4ZXMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIHByZWYgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHByZWYgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKFhNTE5TKSAhPSBudWxsKQotICAgICAgICAgICBhY3R1YWxTZXQuYWRkKG51bGwpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oWE1MTlMgKyAiOiIgKyBwcmVmKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgYWN0dWFsU2V0LmFkZChwcmVmKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB1bnVzZWRQcmVmaXhlcyA9IG5ldyBIYXNoU2V0KGFjdHVhbFNldCk7Ci0gICAgCi0gICAgdXNlZFByZWZpeGVzLmFkZChzY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKSk7Ci0gICAgCi0gICAgRWxlbWVudCBlbGVtZW50ID0gc2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAKLSAgICBOb2RlTGlzdCBjaGlsZEVsZW1lbnRzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IGxlbmd0aCA9IGNoaWxkRWxlbWVudHMuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSBjaGlsZEVsZW1lbnRzLml0ZW0oaSk7Ci0gICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHRyYXZlcnNlRE9NRWxlbWVudCgoRWxlbWVudClub2RlLCBzY2hlbWEpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBjb21wdXRlIHRoZSB1c2VkIHByZWZpeGVzCi0gICAgY29tcHV0ZVVzZWRYU0RQcmVmaXhlcyhzY2hlbWEpOwotICAgIAotICAgIC8vIHJlbW92ZSB0aGUgdXNlZCBwcmVmaXhlcyBmcm9tIHRoZSB1bnVzZWQgdG8gZ2V0IHRoZSBsaXN0IG9mIHVudXNlZCBwcmVmaXhlcwotICAgIHVudXNlZFByZWZpeGVzLnJlbW92ZUFsbCh1c2VkUHJlZml4ZXMpOwotICAgIAotICAgIC8vIHBlcmZvcm0gYWRkaXRpb25hbCBwcm9jZXNzIGZyb20gZXh0ZW5kZXJzCi0gICAgZG9BZGRpdGlvbmFsUHJvY2Vzc2luZyhzY2hlbWEpOwotICAgIAotICAgIHNjaGVtYVRvUHJlZml4TWFwLnB1dChzY2hlbWEsIHVudXNlZFByZWZpeGVzKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJlbW92ZSB1bnVzZWQgcHJlZml4ZXMgZnJvbSB0aGUgWE1MIG5hbWVzcGFjZSB0YWJsZQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVW51c2VkUHJlZml4ZXMoKQotICB7Ci0gICAgU2V0IHNjaGVtYVNldCA9IHNjaGVtYVRvUHJlZml4TWFwLmtleVNldCgpOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSBzY2hlbWFTZXQuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpaXRlci5uZXh0KCk7Ci0gICAgICBNYXAgcHJlZml4TWFwID0gc2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgIFNldCBwcmVmaXhlc1RvUmVtb3ZlID0gKFNldClzY2hlbWFUb1ByZWZpeE1hcC5nZXQoc2NoZW1hKTsKLSAgICAgIEl0ZXJhdG9yIGl0ZXIyID0gcHJlZml4ZXNUb1JlbW92ZS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXIyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpaXRlcjIubmV4dCgpOwotICAgICAgICBpZiAocHJlZml4TWFwLmNvbnRhaW5zS2V5KHN0cmluZykpCi0gICAgICAgICAgcHJlZml4TWFwLnJlbW92ZShzdHJpbmcpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEV4dGVuZGVycyBjYW4gY3VzdG9taXplCi0gICAqIEBwYXJhbSBzY2hlbWEKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGRvQWRkaXRpb25hbFByb2Nlc3NpbmcoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIC8vIERvIG5vdGhpbmcgZm9yIFhTRAotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEKLSAgICovCi0gIHByaXZhdGUgdm9pZCBjb21wdXRlVXNlZFhTRFByZWZpeGVzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBNYXAgcHJlZml4TWFwID0gc2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICBTZXQgZGVmaW5lZFByZWZpeGVzID0gcHJlZml4TWFwLmtleVNldCgpOwotICAgIAotICAgIGJvb2xlYW4gZm91bmRFbnRyeUZvclRhcmdldE5hbWVzcGFjZSA9IGZhbHNlOwotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyID0gdXNlZFByZWZpeGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgcHJlZml4TWFwLmdldChrZXkpOwotICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsICYmIHZhbHVlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvdW5kRW50cnlGb3JUYXJnZXROYW1lc3BhY2UgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UuZXF1YWxzKHZhbHVlKSkKLSAgICAgICAgewotICAgICAgICAgIGZvdW5kRW50cnlGb3JUYXJnZXROYW1lc3BhY2UgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmICghZm91bmRFbnRyeUZvclRhcmdldE5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWZpbmVkUHJlZml4ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIHByZWZpeE1hcC5nZXQoa2V5KTsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsICYmIHZhbHVlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB1c2VkUHJlZml4ZXMuYWRkKG51bGwpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlLmVxdWFscyh2YWx1ZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXNlZFByZWZpeGVzLmFkZChrZXkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogRmluZCBwcmVmaXhlcyB0aGF0IGFyZSBpbiB0aGUgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBlbGVtZW50Ci0gICAqIEBwYXJhbSBzY2hlbWEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZURPTUVsZW1lbnQoRWxlbWVudCBlbGVtZW50LCBYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgdXNlZFByZWZpeGVzLmFkZChwcmVmaXgpOwotICAgIAotICAgIE5hbWVkTm9kZU1hcCBhdHRycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgIGludCBudW1PZkF0dHJzID0gYXR0cnMuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1PZkF0dHJzOyBpKyspCi0gICAgewotICAgICAgTm9kZSBub2RlID0gYXR0cnMuaXRlbShpKTsKLSAgICAgIFN0cmluZyBhdHRyUHJlZml4ID0gbm9kZS5nZXRQcmVmaXgoKTsKLSAgICAgIGlmIChhdHRyUHJlZml4ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHVzZWRQcmVmaXhlcy5hZGQoYXR0clByZWZpeCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIFN0cmluZyBhdHRyID0gbm9kZS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSBjb250aW51ZTsKLSAgICAgICAgaWYgKGF0dHIuZXF1YWxzKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKSB8fAotICAgICAgICAgICAgYXR0ci5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFRkVSX0FUVFJJQlVURSkgfHwKLSAgICAgICAgICAgIGF0dHIuZXF1YWxzKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSkgfHwKLSAgICAgICAgICAgIGF0dHIuZXF1YWxzKFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSkgfHwKLSAgICAgICAgICAgIGF0dHIuZXF1YWxzKFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUpIHx8Ci0gICAgICAgICAgICBhdHRyLmVxdWFscyhYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVzZWRQcmVmaXhlcy5hZGQoZXh0cmFjdFByZWZpeCh2YWx1ZSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXR0ci5lcXVhbHMoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSk7Ci0gICAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgdXNlZFByZWZpeGVzLmFkZChleHRyYWN0UHJlZml4KHRva2VuKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBOb2RlTGlzdCBjaGlsZEVsZW1lbnRzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IGxlbmd0aCA9IGNoaWxkRWxlbWVudHMuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSBjaGlsZEVsZW1lbnRzLml0ZW0oaSk7Ci0gICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHRyYXZlcnNlRE9NRWxlbWVudCgoRWxlbWVudClub2RlLCBzY2hlbWEpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEV4dHJhY3QgdGhlIHByZWZpeCBmcm9tIHRoZSBnaXZlbiBzdHJpbmcuICBGb3IgZXhhbXBsZSwgcHJlZjphdHRyIHJldHVybnMgcHJlZi4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gdGhlIHByZWZpeAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0UHJlZml4KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGludCBpbmRleCA9IHZhbHVlLmluZGV4T2YoJzonKTsKLSAgICBpZiAoaW5kZXggPCAwKSAKLSAgICAgIHJldHVybiBudWxsOwotICAgIGVsc2UKLSAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgZGV0ZXJtaW5lcyB0aGUgbGlzdCBvZiByZWZlcmVuY2VkIGNvbXBvbmVudHMgYW5kIGhlbmNlIHRoZSB1c2VkIHNjaGVtYXMgZnJvbSB3aGljaAotICAgKiB3ZSBjYW4gZGV0ZXJtaW5lIHdoYXQgYXJlIHRoZSB1bnVzZWQgZGlyZWN0aXZlcwotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKiBAcGFyYW0gdW51c2VkSW1wb3J0TGlzdAotICAgKiBAcGFyYW0gdXNlZFNjaGVtYXMKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGRvQ3Jvc3NSZWZlcmVuY2VyKFhTRFNjaGVtYSBzY2hlbWEsIExpc3QgdXNlZFNjaGVtYXMsIE1hcCB4c2ROYW1lZENvbXBvbmVudFVzYWdlKQotICB7Ci0gICAgLy8gQ2FsY3VsYXRlIGFkZGl0aW9uYWwgdW51c2VkIGltcG9ydHMgdGhhdCBtYXkgaGF2ZSB0aGUgc2FtZQotICAgIC8vIG5hbWVzcGFjZSB0aGF0IGRpZCBub3QgZ2V0IGFkZGVkIGluIHRoZSBpbml0aWFsIHBhc3MKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHhzZE5hbWVkQ29tcG9uZW50VXNhZ2Uua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAvLyBGaXJzdCBkZXRlcm1pbmUgdGhlIHVzZWQgc2NoZW1hcyBmcm9tIHRoZSBjcm9zcyByZWZlcmVuY2VyCi0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgWFNEU2NoZW1hIG5hbWVkQ29tcG9uZW50U2NoZW1hID0gbmFtZWRDb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0gICAgICAvLyBJZiB0aGUgbmFtZWQgY29tcG9uZW50IGJlbG9uZ3MgdG8gdGhlIHNhbWUgc2NoZW1hLCB0aGVuIGNvbnRpbnVlLi4ud2UKLSAgICAgIC8vIHdhbnQgdG8gY2hlY2sgdGhlIGV4dGVybmFsIHJlZmVyZW5jZXMKLSAgICAgIGlmIChuYW1lZENvbXBvbmVudFNjaGVtYSA9PSBzY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHhzZE5hbWVkQ29tcG9uZW50VXNhZ2UuZ2V0KG5hbWVkQ29tcG9uZW50KTsKLSAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yMiA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyYXRvcjIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBTZXR0aW5nIHNldHRpbmcgPSAoU2V0dGluZykgaXRlcmF0b3IyLm5leHQoKTsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHNldHRpbmcuZ2V0RU9iamVjdCgpOwotICAgICAgICBpZiAoaXNDb21wb25lbnRVc2VkKG9iaiwgc2NoZW1hLCBuYW1lZENvbXBvbmVudFNjaGVtYSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIXVzZWRTY2hlbWFzLmNvbnRhaW5zKG5hbWVkQ29tcG9uZW50U2NoZW1hKSkKLSAgICAgICAgICAgIHVzZWRTY2hlbWFzLmFkZChuYW1lZENvbXBvbmVudFNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBvYmplY3QgdG8gYmUgYW5hbHl6ZWQgaXMgcmVmZXJlbmNlZCBieSB0aGUgc2NoZW1hIAotICAgKiBAcGFyYW0gb2JqCi0gICAqIEBwYXJhbSBzY2hlbWEKLSAgICogQHBhcmFtIHRhcmdldFNjaGVtYQotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbXBvbmVudCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBzY2hlbWEsIGZhbHNlIGlmIG5vdCByZWZlcmVuY2VkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBvbmVudFVzZWQoT2JqZWN0IG9iaiwgWFNEU2NoZW1hIHNjaGVtYSwgWFNEU2NoZW1hIHRhcmdldFNjaGVtYSkKLSAgewotICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpIG9iajsKLSAgICAgIGlmIChjb21wb25lbnQgPT0gc2NoZW1hIHx8IGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKCF1c2VkSW5jbHVkZVNjaGVtYXMuY29udGFpbnModGFyZ2V0U2NoZW1hKSkKLSAgICAgICAgdXNlZEluY2x1ZGVTY2hlbWFzLmFkZCh0YXJnZXRTY2hlbWEpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEZyb20gYSBsaXN0IG9mIHVzZWQgc2NoZW1hcywgdXBkYXRlIHRoZSB1bnVzZWRJbXBvcnRzIGxpc3QgZm9yIHRoZSBnaXZlbiBzY2hlbWEKLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEKLSAgICogQHBhcmFtIHVudXNlZEltcG9ydHMKLSAgICogQHBhcmFtIHVzZWRTY2hlbWFzCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRUb1VudXNlZEltcG9ydHMoWFNEU2NoZW1hIHNjaGVtYSwgTGlzdCB1c2VkU2NoZW1hcykKLSAgewotICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGxpc3Qgb2YgdXNlZFNjaGVtYXMsIGdldCB0aGUgbGlzdCBvZiB1bnVzZWQKLSAgICAvLyBzY2hlbWFzIGJ5IGNvbXBhcmluZyB0aGlzIGxpc3QgdG8gd2hhdCBpcyBhY3R1YWxseSBpbiB0aGUgc2NoZW1hCi0gICAgSXRlcmF0b3IgaXRlciA9IHNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFEaXJlY3RpdmUgZGlyZWN0aXZlID0gKFhTRFNjaGVtYURpcmVjdGl2ZSkgbzsKLSAgICAgICAgYm9vbGVhbiBpc1VzZWQgPSBmYWxzZTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcjIgPSB1c2VkU2NoZW1hcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcjIuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hIHVzZWRTY2hlbWEgPSAoWFNEU2NoZW1hKSBpdGVyMi5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGRpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTREltcG9ydCAmJiBkaXJlY3RpdmUuZ2V0UmVzb2x2ZWRTY2hlbWEoKSA9PSB1c2VkU2NoZW1hKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzVXNlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTREluY2x1ZGUgJiYgKChYU0RJbmNsdWRlKWRpcmVjdGl2ZSkuZ2V0SW5jb3Jwb3JhdGVkU2NoZW1hKCkgPT0gdXNlZFNjaGVtYSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc1VzZWQgPSB0cnVlOwotICAgICAgICAgICAgdXNlZERpcmVjdEluY2x1ZGVzLmFkZCh1c2VkU2NoZW1hKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBibGluZGx5IGFjY2VwdCByZWRlZmluZXMgYXMgdXNlZAotICAgICAgICAgIGlmIChkaXJlY3RpdmUgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc1VzZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiBpdCBpcyBhbiBpbmNsdWRlLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0IGlzIHVzZWQgaW5kaXJlY3RseQotICAgICAgICBpZiAoZGlyZWN0aXZlIGluc3RhbmNlb2YgWFNESW5jbHVkZSAmJiAhaXNVc2VkKQotICAgICAgICB7Ci0gICAgICAgICAgWFNESW5jbHVkZSBpbmMgPSAoWFNESW5jbHVkZSlkaXJlY3RpdmU7Ci0gICAgICAgICAgWFNEU2NoZW1hIGluY1NjaGVtYSA9IGluYy5nZXRJbmNvcnBvcmF0ZWRTY2hlbWEoKTsKLSAgICAgICAgICBpZiAoaW5jU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEU2NoZW1hIHVzZWRTY2hlbWEgPSBnZXRVc2VkSW5jbHVkZVNjaGVtYShpbmNTY2hlbWEsIGluYyk7Ci0gICAgICAgICAgICBpZiAodXNlZFNjaGVtYSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1c2VkSW5kaXJlY3RJbmNsdWRlcy5hZGQoZGlyZWN0aXZlKTsKLSAgICAgICAgICAgICAgdXNlZEluZGlyZWN0SW5jbHVkZXNNYXAucHV0KGRpcmVjdGl2ZSwgdXNlZFNjaGVtYSk7Ci0gICAgICAgICAgICAgIGlzVXNlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlzVXNlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSWYgcmVzb2x2ZWQgZGlyZWN0aXZlcyBhcmUgZGV0ZXJtaW5lZCB1bnVzZWQKLSAgICAgICAgLy8gSWYgcmVzb2x2ZWQgZGlyZWN0aXZlcyBhcmUgbm90IGFscmVhZHkgaW4gdGhlIHVudXNlZCBsaXN0Ci0gICAgICAgIC8vIEFsc28gYW55IHJlZGVmaW5lcyBzaG91bGQgYmUgY29uc2lkZXJlZCB1c2VkCi0gICAgICAgIGlmICghaXNVc2VkICYmICF1bnVzZWREaXJlY3RpdmVzLmNvbnRhaW5zKGRpcmVjdGl2ZSkgJiYgIShkaXJlY3RpdmUgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkpCi0gICAgICAgIHsKLSAgICAgICAgICB1bnVzZWREaXJlY3RpdmVzLmFkZChkaXJlY3RpdmUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIEl0ZXJhdG9yIGl0ZXIzID0gdXNlZEluZGlyZWN0SW5jbHVkZXMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcjMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaXRlcjMubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RJbmNsdWRlKQotICAgICAgewotICAgICAgICBYU0RJbmNsdWRlIGluYyA9IChYU0RJbmNsdWRlKW87Ci0gICAgICAgIFhTRFNjaGVtYSB0YXJnZXRTY2hlbWEgPSAoWFNEU2NoZW1hKXVzZWRJbmRpcmVjdEluY2x1ZGVzTWFwLmdldChpbmMpOwotICAgICAgICBpZiAodXNlZEluY2x1ZGVTY2hlbWFzLmNvbnRhaW5zKHRhcmdldFNjaGVtYSkgJiYgdXNlZERpcmVjdEluY2x1ZGVzLmNvbnRhaW5zKHRhcmdldFNjaGVtYSkpCi0gICAgICAgIHsKLSAgICAgICAgICB1bnVzZWREaXJlY3RpdmVzLmFkZChpbmMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHVzZWREaXJlY3RJbmNsdWRlcy5hZGQodGFyZ2V0U2NoZW1hKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbmNsdWRlcyBjYW4gYmUgdXNlZCBpbmRpcmVjdGx5LiAgIElmIHRoZSBzY2hlbWEgaW5jbHVkZXMgQSB3aGljaCBpbmNsdWRlcyBCLCBidXQgdGhlIHNjaGVtYQotICAgKiByZWZlcmVuY2VzIHNvbWV0aGluZyBpbiBCLCB0aGVuIEEgaXMgaW5kaXJlY3RseSB1c2VkLCBhbmQgaGVuY2UgQSBjYW5ub3QgYmUgcmVtb3ZlZC4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEKLSAgICogQHBhcmFtIHhzZEluY2x1ZGUKLSAgICogQHJldHVybiB0aGUgcmVmZXJlbmNlZCBzY2hlbWEgaWYgdXNlZCwgbnVsbCBpZiBub3QgdXNlZAotICAgKi8KLSAgcHJpdmF0ZSBYU0RTY2hlbWEgZ2V0VXNlZEluY2x1ZGVTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSwgWFNESW5jbHVkZSB4c2RJbmNsdWRlKQotICB7Ci0gICAgWFNEU2NoZW1hIHJlZlNjaGVtYSA9IG51bGw7Ci0gICAgYm9vbGVhbiBpc1VzZWQgPSBmYWxzZTsKLSAgICBJdGVyYXRvciBpdGVyID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNESW5jbHVkZSkKLSAgICAgIHsKLSAgICAgICAgWFNESW5jbHVkZSBpbmMgPSAoWFNESW5jbHVkZSlvOwotICAgICAgICBYU0RTY2hlbWEgaW5jU2NoZW1hID0gaW5jLmdldEluY29ycG9yYXRlZFNjaGVtYSgpOwotICAgICAgICBpZiAoaW5jU2NoZW1hICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciBpdGVyMiA9IHVzZWRJbmNsdWRlU2NoZW1hcy5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChpdGVyMi5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEU2NoZW1hIHhzZFNjaCA9IChYU0RTY2hlbWEpaXRlcjIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGluY1NjaGVtYSA9PSB4c2RTY2gpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlzVXNlZCA9IHRydWU7Ci0gICAgICAgICAgICAgIHJlZlNjaGVtYSA9IGluY1NjaGVtYTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGlmICghaXNVc2VkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghYW5hbHl6ZWRJbmNsdWRlU2NoZW1hcy5jb250YWlucyhpbmNTY2hlbWEpKSAvLyBUbyBwcmV2ZW50IGluZmluaXRlIGN5Y2xlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGFuYWx5emVkSW5jbHVkZVNjaGVtYXMuYWRkKGluY1NjaGVtYSk7Ci0gICAgICAgICAgICAgIHJlZlNjaGVtYSA9IGdldFVzZWRJbmNsdWRlU2NoZW1hKGluY1NjaGVtYSwgaW5jKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGlzVXNlZCB8fCByZWZTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVmU2NoZW1hOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlZlNjaGVtYTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNlZSBjcm9zcyByZWZlcmVuY2UgZm9yIG1vcmUgZGV0YWlscy4gCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRvcExldmVsQ29tcG9uZW50Q3Jvc3NSZWZlcmVuY2VyIGV4dGVuZHMgWFNEVXRpbC5YU0ROYW1lZENvbXBvbmVudENyb3NzUmVmZXJlbmNlcgotICB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0gICAgWFNEU2NoZW1hIHNjaGVtYUZvclNjaGVtYSA9IFhTRFV0aWwuZ2V0U2NoZW1hRm9yU2NoZW1hKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYUZvclhTSSA9IFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hSW5zdGFuY2UoWFNEQ29uc3RhbnRzLlNDSEVNQV9JTlNUQU5DRV9VUklfMjAwMSk7Ci0KLSAgICBwcm90ZWN0ZWQgVG9wTGV2ZWxDb21wb25lbnRDcm9zc1JlZmVyZW5jZXIoRU9iamVjdCBhcmcwKQotICAgIHsKLSAgICAgIHN1cGVyKGFyZzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBtYXAgb2YgYWxsIFhTRE5hbWVkQ29tcG9uZW50IGNyb3NzIHJlZmVyZW5jZXMgaW4gdGhlIGNvbnRlbnQKLSAgICAgKiB0cmVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGZpbmQoRU9iamVjdCBlT2JqZWN0KQotICAgIHsKLSAgICAgIFRvcExldmVsQ29tcG9uZW50Q3Jvc3NSZWZlcmVuY2VyIHJlc3VsdCA9IG5ldyBUb3BMZXZlbENvbXBvbmVudENyb3NzUmVmZXJlbmNlcihlT2JqZWN0KTsKLSAgICAgIHJlc3VsdC5jcm9zc1JlZmVyZW5jZSgpOwotICAgICAgcmVzdWx0LmRvbmUoKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY3Jvc3NSZWZlcmVuY2UoRU9iamVjdCBlT2JqZWN0LCBFUmVmZXJlbmNlIGVSZWZlcmVuY2UsIEVPYmplY3QgY3Jvc3NSZWZlcmVuY2VkRU9iamVjdCkKLSAgICB7Ci0gICAgICBpZiAoY3Jvc3NSZWZlcmVuY2VkRU9iamVjdCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudCkgY3Jvc3NSZWZlcmVuY2VkRU9iamVjdDsKLQotICAgICAgICBpZiAobmFtZWRDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkgPT0gc2NoZW1hRm9yU2NoZW1hIHx8IAotICAgICAgICAgICAgbmFtZWRDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkgPT0gc2NoZW1hRm9yWFNJIHx8IAotICAgICAgICAgICAgY3Jvc3NSZWZlcmVuY2VkRU9iamVjdC5lQ29udGFpbmVyKCkgPT0gZU9iamVjdCB8fCAKLSAgICAgICAgICAgIG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5hbWVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IChYU0RUeXBlRGVmaW5pdGlvbikgbmFtZWRDb21wb25lbnQ7Ci0gICAgICAgICAgaWYgKCEodHlwZURlZmluaXRpb24uZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBtZXRob2QgdG8gcmVtb3ZlIFRleHQgbm9kZXMKLSAgICogQHBhcmFtIGVsZW1lbnQKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlVGV4dE5vZGVzQmV0d2Vlbk5leHRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIExpc3Qgbm9kZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKQotICAgIHsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0gICAgICB7Ci0gICAgICAgIG5vZGVzVG9SZW1vdmUuYWRkKG5vZGUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBub2Rlc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgbm9kZVRvUmVtb3ZlID0gKE5vZGUpIGoubmV4dCgpOwotICAgICAgICAgIG5vZGVUb1JlbW92ZS5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQobm9kZVRvUmVtb3ZlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBtZXRob2QgdG8gcmVtb3ZlIFRleHQgbm9kZXMuCi0gICAqIEBwYXJhbSBlbGVtZW50Ci0gICAqIEByZXR1cm4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHJlbW92ZVRleHROb2RlQmV0d2VlblByZXZpb3VzRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBMaXN0IG5vZGVzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChOb2RlIG5vZGUgPSBlbGVtZW50LmdldFByZXZpb3VzU2libGluZygpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpKQotICAgIHsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0gICAgICB7Ci0gICAgICAgIG5vZGVzVG9SZW1vdmUuYWRkKG5vZGUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBub2Rlc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgbm9kZVRvUmVtb3ZlID0gKE5vZGUpIGoubmV4dCgpOwotICAgICAgICAgIG5vZGVUb1JlbW92ZS5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQobm9kZVRvUmVtb3ZlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBpRmlsZQotICAgKiBAcGFyYW0gY2hlY2tQcmVmZXJlbmNlIC0gaWYgZmFsc2UsIGlnbm9yZSBjaGVja2luZyB0aGUgcHJlZmVyZW5jZSBzZXR0aW5nIAotICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgKi8KLSAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVVbnVzZWRYU0RJbXBvcnRzKElGaWxlIGlGaWxlLCBib29sZWFuIGNoZWNrUHJlZmVyZW5jZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoIWNoZWNrUHJlZmVyZW5jZSB8fCBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW92ZUltcG9ydFNldHRpbmcoKSkKLSAgICB7Ci0gICAgICBJRE9NTW9kZWwgbW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChpRmlsZSk7Ci0gICAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotICAgICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBYU0RNb2RlbEFkYXB0ZXIubG9va3VwT3JDcmVhdGVTY2hlbWEoZG9jdW1lbnQpOwotICAgICAgICAgIFhTRERpcmVjdGl2ZXNNYW5hZ2VyIG1nciA9IG5ldyBYU0REaXJlY3RpdmVzTWFuYWdlcigpOwotICAgICAgICAgIG1nci5wZXJmb3JtUmVtb3ZhbChzY2hlbWEpOwotICAgICAgICAgIG1nci5jbGVhbnVwKCk7Ci0gICAgICAgICAgbW9kZWwuc2F2ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL1hTRERpcmVjdGl2ZXNTY2hlbWFMb2NhdGlvblVwZGF0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvWFNERGlyZWN0aXZlc1NjaGVtYUxvY2F0aW9uVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjhjMTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvWFNERGlyZWN0aXZlc1NjaGVtYUxvY2F0aW9uVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLlJlc291cmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0REaXJlY3RpdmVzU2NoZW1hTG9jYXRpb25VcGRhdGVyCi17Ci0gIC8qKgotICAgKiBNb2RpZmllcyB0aGUgc2NoZW1hIGxvY2F0aW9uIGJ5IG9wZW5pbmcgdGhlIHNjaGVtYSBsb2NhdGlvbiBkaWFsb2cgYW5kCi0gICAqIHByb2Nlc3NpbmcgdGhlIHJlc3VsdHMuIFRoaXMgbWV0aG9kIHJlZmFjdG9ycyB0aGUgY29kZSBpbgotICAgKiBYU0RJbXBvcnRTZWN0aW9uJHdpZGdldFNlbGVjdGVkIGFuZCBTY2hlbWFMb2NhdGlvblNlY3Rpb24kd2lkZ2V0U2VsZWN0ZWQKLSAgICogYW5kIHRoZSBwcm9jZXNzaW5nIGluIGhhbmRsZVNjaGVtYUxvY2F0aW9uQ2hhbmdlKCkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVTY2hlbWFMb2NhdGlvbihYU0RTY2hlbWEgeHNkU2NoZW1hLCBPYmplY3Qgc2VsZWN0aW9uLCBib29sZWFuIGlzSW5jbHVkZSkKLSAgewotICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICBJRmlsZSBjdXJyZW50SUZpbGUgPSBudWxsOwotICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCk7Ci0gICAgVmlld2VyRmlsdGVyIGZpbHRlcjsKLQotICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpCi0gICAgewotICAgICAgY3VycmVudElGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkuZ2V0RmlsZSgpOwotICAgICAgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKG5ldyBTdHJpbmdbXSB7ICIueHNkIiB9LCAvLyROT04tTkxTLTEkIAotICAgICAgICAgIG5ldyBJRmlsZVtdIHsgY3VycmVudElGaWxlIH0sIG51bGwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKG5ldyBTdHJpbmdbXSB7ICIueHNkIiB9LCAvLyROT04tTkxTLTEkIAotICAgICAgICAgIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIFhTRFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkIGZpbGVTZWxlY3RXaXphcmQgPSBuZXcgWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQoeHNkU2NoZW1hLCBpc0luY2x1ZGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9GSUxFRElBTE9HX1NFTEVDVF9YTUxfU0NIRU1BIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9ERVNDIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmlsdGVyLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQotICAgIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCBmaWxlU2VsZWN0V2l6YXJkKTsKLSAgICB3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0gICAgd2l6YXJkRGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgIGludCByZXN1bHQgPSB3aXphcmREaWFsb2cub3BlbigpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0gICAgewotICAgICAgSUZpbGUgc2VsZWN0ZWRJRmlsZSA9IGZpbGVTZWxlY3RXaXphcmQuZ2V0UmVzdWx0RmlsZSgpOwotICAgICAgU3RyaW5nIHNjaGVtYUZpbGVTdHJpbmc7Ci0gICAgICBpZiAoc2VsZWN0ZWRJRmlsZSAhPSBudWxsICYmIGN1cnJlbnRJRmlsZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBzY2hlbWFGaWxlU3RyaW5nID0gVVJJSGVscGVyLmdldFJlbGF0aXZlVVJJKHNlbGVjdGVkSUZpbGUuZ2V0TG9jYXRpb24oKSwgY3VycmVudElGaWxlLmdldExvY2F0aW9uKCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRJRmlsZSAhPSBudWxsICYmIGN1cnJlbnRJRmlsZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBzY2hlbWFGaWxlU3RyaW5nID0gc2VsZWN0ZWRJRmlsZS5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNjaGVtYUZpbGVTdHJpbmcgPSBmaWxlU2VsZWN0V2l6YXJkLmdldFVSTCgpOwotICAgICAgfQotCi0gICAgICBTdHJpbmcgYXR0cmlidXRlU2NoZW1hTG9jYXRpb24gPSAic2NoZW1hTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNESW1wb3J0KQotICAgICAgewotICAgICAgICBYU0RJbXBvcnQgeHNkSW1wb3J0ID0gKFhTREltcG9ydCkgc2VsZWN0aW9uOwotICAgICAgICB4c2RJbXBvcnQuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVTY2hlbWFMb2NhdGlvbiwgc2NoZW1hRmlsZVN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZmlsZVNlbGVjdFdpemFyZC5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICAgIG5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgWFNEU2NoZW1hIGV4dGVybmFsU2NoZW1hID0gZmlsZVNlbGVjdFdpemFyZC5nZXRFeHRlcm5hbFNjaGVtYSgpOwotICAgICAgICBqYXZhLnV0aWwuTWFwIG1hcCA9IHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgIEVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSB4bWxucyBpbiB0aGUgc2NoZW1hIGVsZW1lbnQgZmlyc3QsIGFuZCB0aGVuIHVwZGF0ZSB0aGUKLSAgICAgICAgLy8gaW1wb3J0IGVsZW1lbnQgbmV4dCBzbyB0aGF0IHRoZSBsYXN0IGNoYW5nZSB3aWxsIGJlIGluIHRoZSBpbXBvcnQgZWxlbWVudC4gVGhpcyBrZWVwcyB0aGUKLSAgICAgICAgLy8gc2VsZWN0aW9uIG9uIHRoZSBpbXBvcnQgZWxlbWVudAotICAgICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoZXh0ZXJuYWxTY2hlbWEpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gaGVscGVyLmdldFByZWZpeChuYW1lc3BhY2UsIGZhbHNlKTsKLQotICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KHByZWZpeCkpCi0gICAgICAgIHsKLSAgICAgICAgICBwcmVmaXggPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsIHx8IChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmdCdWZmZXIgbmV3UHJlZml4ID0gbmV3IFN0cmluZ0J1ZmZlcigicHJlZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaW50IHByZWZpeEV4dGVuc2lvbiA9IDE7Ci0gICAgICAgICAgd2hpbGUgKG1hcC5jb250YWluc0tleShuZXdQcmVmaXgudG9TdHJpbmcoKSkgJiYgcHJlZml4RXh0ZW5zaW9uIDwgMTAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5ld1ByZWZpeCA9IG5ldyBTdHJpbmdCdWZmZXIoInByZWYiICsgU3RyaW5nLnZhbHVlT2YocHJlZml4RXh0ZW5zaW9uKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHByZWZpeEV4dGVuc2lvbisrOwotICAgICAgICAgIH0KLSAgICAgICAgICBwcmVmaXggPSBuZXdQcmVmaXgudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSAibmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIC8vIGlmIG5zIGFscmVhZHkgaW4gbWFwLCB1c2UgaXRzIGNvcnJlc3BvbmRpbmcgcHJlZml4Ci0gICAgICAgICAgaWYgKG1hcC5jb250YWluc1ZhbHVlKG5hbWVzcGFjZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgVHlwZXNIZWxwZXIgdHlwZXNIZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgICAgICAgIHByZWZpeCA9IHR5cGVzSGVscGVyLmdldFByZWZpeChuYW1lc3BhY2UsIGZhbHNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIC8vIG90aGVyd2lzZSBhZGQgdG8gdGhlIG1hcAotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4LCBuYW1lc3BhY2UpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIC8vIHByZWZpeFRleHQuc2V0VGV4dChwcmVmaXgpOwotICAgICAgICAgIHhzZEltcG9ydC5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWVzcGFjZSwgbmFtZXNwYWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1ODg1Ci0gICAgICAgIC8vIE5lZWQgdG8gaW1wb3J0IG90aGVyd2lzZSB0aGUgZXh0ZXJuYWwgc2NoZW1hIGlzIG5ldmVyCi0gICAgICAgIC8vIHJlc29sdmVkLiBPbmUgcHJvYmxlbSBpcyB0aGF0IHRoZSBzY2hlbWEgbG9jYXRpb24gaXMgc3RpbGwgbnVsbCwKLSAgICAgICAgLy8gc28gdGhlIHNldCB0eXBlcyBkaWFsb2cgd2lsbCBzaG93IHR5cGVzIHRoYXQgYmVsb25nIHRvIHRoYXQgc2NoZW1hCi0gICAgICAgIC8vIHdpdGggYSBudWxsIHNjaGVtYSBsb2NhdGlvbi4gVGhpcyBzaG91bGQgbG9hZCByZXNvdXJjZQotICAgICAgICAvLyBpbnRvIHRoZSByZXNvdXJjZSBzZXQKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREltcG9ydEltcGwpIC8vIHJlZHVuZGFudAotICAgICAgICB7Ci0gICAgICAgICAgWFNESW1wb3J0SW1wbCB4c2RJbXBvcnRJbXBsID0gKFhTREltcG9ydEltcGwpIHNlbGVjdGlvbjsKLSAgICAgICAgICB4c2RJbXBvcnRJbXBsLmltcG9ydFNjaGVtYSgpOwotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREluY2x1ZGUpCi0gICAgICB7Ci0gICAgICAgIFhTREluY2x1ZGUgeHNkSW5jbHVkZSA9IChYU0RJbmNsdWRlKSBzZWxlY3Rpb247Ci0gICAgICAgIHhzZEluY2x1ZGUuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVTY2hlbWFMb2NhdGlvbiwgc2NoZW1hRmlsZVN0cmluZyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgIHsKLSAgICAgICAgWFNEUmVkZWZpbmUgeHNkUmVkZWZpbmUgPSAoWFNEUmVkZWZpbmUpIHNlbGVjdGlvbjsKLSAgICAgICAgeHNkUmVkZWZpbmUuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVTY2hlbWFMb2NhdGlvbiwgc2NoZW1hRmlsZVN0cmluZyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YmRjMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLV9VSV9BQ1RJT05fT1BFTl9JTl9ORVdfRURJVE9SPSZPcGVuIEluIE5ldyBFZGl0b3IKLV9VSV9BQ1RJT05fREVMRVRFX0NPTlNUUkFJTlRTPURlbGV0ZSBDb25zdHJhaW50cwotX1VJX0FDVElPTl9ERUxFVEVfRU5VTUVSQVRJT049RGVsZXRlIEVudW1lcmF0aW9uCi1fVUlfQUNUSU9OX0RFTEVURV9BUFBJTkZPX0VMRU1FTlQ9RGVsZXRlIEFwcEluZm8gRWxlbWVudAotX1VJX0FDVElPTl9ERUxFVEVfQVBQSU5GT19BVFRSSUJVVEU9RGVsZXRlIEFwcEluZm8gQXR0cmlidXRlCi1fVUlfQUNUSU9OX0RFTEVURV9FWFRFTlNJT05fQ09NUE9ORU5UPURlbGV0ZSBFeHRlbnNpb24gQ29tcG9uZW50Ci1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVA9QWRkIEF0dHJpYnV0ZSAmR3JvdXAKLV9VSV9BQ1RJT05fQUREX0FQUElORk9fRUxFTUVOVD1BZGQgQXBwSW5mbyBFbGVtZW50Ci1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEU9QWRkICZBdHRyaWJ1dGUKLV9VSV9BQ1RJT05fQUREX0dST1VQX1JFRj1BZGQgJkdyb3VwIFJlZgotX1VJX0FDVElPTl9BRERfQU5ZX0VMRU1FTlQ9QWRkIEFuJnkKLV9VSV9BQ1RJT05fQUREX0FOWV9BVFRSSUJVVEU9QWRkIEEmbnkgQXR0cmlidXRlCi1fVUlfQUNUSU9OX0FERF9XSVRIX0RPVFM9JkFkZC4uLgotX1VJX0FDVElPTl9VUERBVEVfQk9VTkRTPVVwZGF0ZSBib3VuZHMKLV9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRT1BZGQgJkNvbXBsZXggVHlwZQotX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT05TPUFkZCBFbnVtZXJhdGlvbnMKLV9VSV9BQ1RJT05fQUREX0RPQ1VNRU5UQVRJT049QWRkIERvY3VtZW50YXRpb24KLV9VSV9BQ1RJT05fQ09OU1RSQUlOX0xFTkdUSD1Db25zdHJhaW4gbGVuZ3RoCi1fVUlfQUNUSU9OX0JST1dTRV9XT1JLU1BBQ0U9V29ya3NwYWNlCi1fVUlfREVMRVRFX0JVVFRPTj0mRGVsZXRlCi1fVUlfTEFCRUxfTk9fSVRFTVNfU0VMRUNURUQ9Tm8gaXRlbXMgc2VsZWN0ZWQKLV9VSV9MQUJFTF9FTEVNRU5URk9STURFRkFVTFQ9UHJlZml4IGZvciAmRWxlbWVudHM6Ci1fVUlfTEFCRUxfQVRUUklCVVRFRk9STURFRkFVTFQ9UHJlZml4IGZvciAmQXR0cmlidXRlczoKLV9VSV9MQUJFTF9CTE9DS0RFRkFVTFQ9JkJsb2NrIGRlZmF1bHQ6Ci1fVUlfTEFCRUxfRVhURU5TSU9OX0RFVEFJTFM9RXh0ZW5zaW9uIERldGFpbHMKLV9VSV9MQUJFTF9FWFRFTlNJT05fQ0FURUdPUklFUz1FeHRlbnNpb24gJkNhdGVnb3JpZXM6Ci1fVUlfTEFCRUxfRklOQUxERUZBVUxUPSZGaW5hbCBkZWZhdWx0OgotX1VJX0xBQkVMX0NPTExBUFNFX1dISVRFU1BBQ0U9Q29sbGFwc2UgJndoaXRlc3BhY2UKLV9VSV9MQUJFTF9SRVNUUklDVF9WQUxVRVNfQlk9JlJlc3RyaWN0IHZhbHVlcyBieToKLV9VSV9MQUJFTF9NSU5JTVVNX0xFTkdUSD1NaSZuaW11bSBsZW5ndGg6Ci1fVUlfTEFCRUxfTUFYSU1VTV9MRU5HVEg9TWEmeGltdW0gbGVuZ3RoOgotX1VJX0xBQkVMX1NFTEVDVF9YU0RfRklMRT1TZWxlY3QgWFNEIGZpbGUKLV9VSV9MQUJFTF9DT05TVFJBSU5UU19PTl9WQUxVRV9PRj1Db25zdHJhaW50cyBvbiB2YWx1ZSBvZiAKLV9VSV9BQ1RJT05fQUREX1NJTVBMRV9UWVBFPUFkZCAmU2ltcGxlIFR5cGUKLV9VSV9BQ1RJT05fRURJVF9XSVRIX0RPVFM9JkVkaXQuLi4KLV9VSV9BQ1RJT05fQ0hBTkdFX1BBVFRFUk49Q2hhbmdlIHBhdHRlcm4KLV9VSV9BQ1RJT05fQUREX0VOVU1FUkFUSU9OPUFkZCAmRW51bWVyYXRpb24KLV9VSV9BQ1RJT05fSU5TRVJUX0VOVU1FUkFUSU9OPSZJbnNlcnQgRW51bWVyYXRpb24KLV9VSV9BQ1RJT05fQ0hBTkdFX0VOVU1FUkFUSU9OX1ZBTFVFPUNoYW5nZSBFbnVtZXJhdGlvbiB2YWx1ZQotX1VJX0FDVElPTl9ERUxFVEVfUEFUVEVSTj1EZWxldGUgUGF0dGVybgotX1VJX0FDVElPTl9CUk9XU0VfQ0FUQUxPRz1DYXRhbG9nCi1fVUlfQUNUSU9OX0FERF9HUk9VUD1BZGQgJkdyb3VwCi1fVUlfQUNUSU9OX0FERF9QQVRURVJOPUFkZCBwYXR0ZXJuCi1fVUlfQUNUSU9OX1NFVF9CQVNFX1RZUEU9U2V0ICZCYXNlIFR5cGUKLV9VSV9FUlJPUl9JTlZBTElEX05BTUU9SW52YWxpZCBuYW1lCi1fVUlfRVJST1JfSU5WQUxJRF9GSUxFPUludmFsaWQgZmlsZQotX1VJX0VSUk9SX0lOVkFMSURfQ0FURUdPUlk9SW52YWxpZCBDYXRlZ29yeQotX1VJX0FDVElPTl9ERUxFVEU9JkRlbGV0ZQotX1VJX0FDVElPTl9BREQ9QSZkZAotX1VJX0FDVElPTl9SRU5BTUU9UmVuYW1lCi1fVUlfTEFCRUxfUEFUVEVSTj1QYXR0ZXJuCi1fVUlfTEFCRUxfUEFUVEVSTlM9JlBhdHRlcm5zCi1fVUlfTEFCRUxfTkFNRT0mTmFtZToKLV9VSV9MQUJFTF9UWVBFPSZUeXBlOiAKLV9VSV9MQUJFTF9CQVNFPSZCYXNlOgotX1VJX0xBQkVMX1VQPVVwCi1fVUlfTEFCRUxfRE9XTj1Eb3duCi1fVUlfTEFCRUxfREVMRVRFPSZEZWxldGUKLV9VSV9MQUJFTF9TQ0hFTUE9JlNjaGVtYToKLV9VSV9MQUJFTF9FRElUPSZFZGl0Li4uCi1fVUlfTEFCRUxfUkVGRVJFTkNFPVJlZmVyZW5jZToKLV9VSV9MQUJFTF9SRUFET05MWT1SZWFkT25seQotX1VJX0xBQkVMX0lOQ0xVU0lWRT1JbmNsdXNpdmUKLV9VSV9MQUJFTF9FTlVNRVJBVElPTlM9JkVudW1lcmF0aW9ucwotX1VJX0xBQkVMX0VYVEVOU0lPTlM9RXh0ZW5zaW9ucwotX1VJX0xBQkVMX01JTklNVU1fVkFMVUU9Jk1pbmltdW0gdmFsdWU6Ci1fVUlfTEFCRUxfTUFYSU1VTV9WQUxVRT1NYSZ4aW11bSB2YWx1ZToKLV9VSV9MQUJFTF9DT05UUkFJTlRTX09OPUNvbnN0cmFpbnRzIG9uIAotX1VJX0xBQkVMX0FERF9XSVRIX0RPVFM9JkFkZC4uLgotX1VJX0xBQkVMX0FERF9DQVRFR09SWT1BZGQgQ2F0ZWdvcnkKLV9VSV9MQUJFTF9FRElUX0NBVEVHT1JZPUVkaXQgQ2F0ZWdvcnkKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9SRUY9QWRkIEF0dHJpYnV0ZSAmR3JvdXAgUmVmCi1fVUlfQUNUSU9OX0FERF9FWFRFTlNJT05fQ09NUE9ORU5UPUFkZCBFeHRlbnNpb24gQ29tcG9uZW50Ci1fVUlfQUNUSU9OX0FERF9FWFRFTlNJT05fQ09NUE9ORU5UUz1BZGQgRXh0ZW5zaW9uIENvbXBvbmVudHMKLV9VSV9MQUJFTF9DT05TVFJBSU5UU19PTl9MRU5HVEhfT0Y9Q29uc3RyYWludHMgb24gbGVuZ3RoIG9mIAotX1VJX0FDVElPTl9BRERfQVBQSU5GT19BVFRSSUJVVEU9QWRkIEFwcEluZm8gQXR0cmlidXRlCi1fVUlfQUNUSU9OX1NFVF9FTlVNRVJBVElPTl9WQUxVRT1TZXQgRW51bWVyYXRpb24gVmFsdWUKLV9VSV9BQ1RJT05fVVBEQVRFX0VMRU1FTlRfUkVGRVJFTkNFPVVwZGF0ZSBFbGVtZW50IFJlZmVyZW5jZQotX1VJX0FDVElPTl9VUERBVEVfTUFYSU1VTV9PQ0NVUlJFTkNFPVVwZGF0ZSBNYXhpbXVtIE9jY3VycmVuY2UKLV9VSV9BQ1RJT05fVVBEQVRFX01JTklNVU1fT0NDVVJSRU5DRT1VcGRhdGUgTWluaW11bSBPY2N1cnJlbmNlCi1fVUlfQUNUSU9OX0NIQU5HRV9NQVhJTVVNX09DQ1VSUkVOQ0U9TWF4aW11bSBPY2N1cnJlbmNlIENoYW5nZSAKLV9VSV9BQ1RJT05fQ0hBTkdFX01JTklNVU1fT0NDVVJSRU5DRT1NaW5pbXVtIE9jY3VycmVuY2UgQ2hhbmdlCi1fVUlfTEFCRUxfU1BFQ0lGSUNfQ09OU1RSQUlOVF9WQUxVRVM9U3BlY2lmaWMgY29uc3RyYWludCB2YWx1ZXMKLV9VSV9MQUJFTF9BVkFJTEFCTEVfQ09NUE9ORU5UU19UT19BREQ9QXZhaWxhYmxlIGNvbSZwb25lbnRzIHRvIEFkZDoKLV9VSV9BQ1RJT05fQ0hBTkdFX0NPTlRFTlRfTU9ERUw9Q2hhbmdlIENvbnRlbnQgTW9kZWwKLV9VSV9FUlJPUl9GSUxFX0NBTk5PVF9CRV9QQVJTRUQ9VGhlIHhzZCBmaWxlIG9mIHRoZSBzZWxlY3RlZCBjYXRlZ29yeSBjYW5ub3QgYmUgcGFyc2VkLgotX1VJX0RFU0NSSVBUSU9OX0NIT09TRV9YU0RfRklMRT1DaG9vc2UgYW4gWFNEIGZpbGUgY29udGFpbmluZyBzY2hlbWEgZm9yIHlvdXIgZXh0ZW5zaWJsZSBjb21wb25lbnRzCi1fVUlfRVJST1JfVkFMSURBVEVfVEhFX0ZJTEU9UGxlYXNlIHZhbGlkYXRlIHRoZSBmaWxlLgotX1VJX0VSUk9SX05BTUVfQUxSRUFEWV9VU0VEPVRoZSBuYW1lIGlzIGFscmVhZHkgYmVpbmcgdXNlZC4KLV9VSV9BQ1RJT05fQ09MTEFQU0VfV0hJVEVTUEFDRT1Db2xsYXBzZSB3aGl0ZXNwYWNlCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfREVGSU5JVElPTj1BZGQgQXR0cmlidXRlIEdyb3VwIERlZmluaXRpb24KLV9VSV9FUlJPUl9JTlZBTElEX1ZBTFVFX0ZPUl9NQVhJTVVNX09DQ1VSUkVOQ0U9SW52YWxpZCB2YWx1ZSBmb3IgbWF4aW11bSBvY2N1cnJlbmNlCi1fVUlfVE9PTFRJUF9SRU5BTUVfUkVGQUNUT1I9Q2xpY2sgaGVyZSB0byBpbnZva2UgdGhlIFJlbmFtZSByZWZhY3RvcmluZy4KLV9VSV9WQUxVRV9DT0xPTj1WYWx1ZToKLV9VSV9JRD1JRDoKLV9VSV9SRUY9UmVmZXJlbmNlOgotX1VJX0ZJWEVEPUZpeGVkCi1fVUlfREVGQVVMVD1EZWZhdWx0Ci1fVUlfRk9STT1Gb3JtIHF1YWxpZmljYXRpb246Ci1fVUlfTEFCRUxfQ0FUQUxPRz0mWE1MIENhdGFsb2cuLi4KLV9VSV9MQUJFTF9XT1JLU1BBQ0U9JldvcmtzcGFjZS4uLgotX1VJX0FDVElPTl9DSEFOR0U9ezB9IENoYW5nZQotX1VJX0FDVElPTl9DTE9TRV9TQ0hFTUFfUFJFVklFV19QT1BVUD0mQ2xvc2UKLV9VSV9BQ1RJT05fTkFNRVNQQUNFX0lORk9STUFUSU9OX0NIQU5HRT1OYW1lc3BhY2UgSW5mb3JtYXRpb24gQ2hhbmdlCi1fVUlfTEFCRUxfQUJTVFJBQ1Q9JkFic3RyYWN0OgotX1VJX0xBQkVMX0JMT0NLPSZCbG9jazoKLV9VSV9MQUJFTF9GSU5BTD0mRmluYWw6Ci1fVUlfTEFCRUxfU1VCU1RJVFVUSU9OX0dST1VQPSZTdWJzdGl0dXRpb24gR3JvdXA6Ci1fVUlfTEFCRUxfTUlYRUQ9Jk1peGVkOgotX1VJX0xBQkVMX1ZBTFVFPSZWYWx1ZQotX1VJX1VTQUdFPVVzYWdlCi1fVUlfTEFCRUxfRk9STT1Gb3JtCi1fVUlfTEFCRUxfTklMTEFCTEU9Jk5pbGxhYmxlOgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9DaGVja3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9DaGVja3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzYWE3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvQ2hlY2tzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTmFtZVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIENoZWNrcyB7Ci0JCi0JcHVibGljIHN0YXRpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJUmVmYWN0b3JpbmdTdGF0dXMgcmVzdWx0PSBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJaWYgKCIiLmVxdWFscyhuYW1lKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZUZhdGFsRXJyb3JTdGF0dXMoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIkNoZWNrc19DaG9vc2VfbmFtZSIpKTsgIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWxyZWFkeU5hbWVkKFJlZmFjdG9yaW5nQ29tcG9uZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lKXsKLQkJcmV0dXJuIG5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbXBvbmVudE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJUmVmYWN0b3JpbmdTdGF0dXMgcmVzdWx0PSBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJaWYgKCFOYW1lVmFsaWRhdG9yLmlzVmFsaWQobmFtZSkpCi0JCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlRmF0YWxFcnJvclN0YXR1cyhSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiQ2hlY2tzX0Nob29zZV9uYW1lIikpOyAgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvSU5hbWVVcGRhdGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL0lOYW1lVXBkYXRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4OTY2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvSU5hbWVVcGRhdGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciBlYmVsaXNhcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lVXBkYXRpbmcgewotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpOwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmV3RWxlbWVudE5hbWUoKTsKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEN1cnJlbnRFbGVtZW50TmFtZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja05ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvSVJlZmVyZW5jZVVwZGF0aW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvSVJlZmVyZW5jZVVwZGF0aW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZjQ4ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL0lSZWZlcmVuY2VVcGRhdGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZWZlcmVuY2VVcGRhdGluZyB7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhpcyByZWZhY3RvcmluZyBvYmplY3QgaXMgY2FwYWJsZSBvZiB1cGRhdGluZyByZWZlcmVuY2VzIHRvIHRoZSByZW5hbWVkIGVsZW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRW5hYmxlVXBkYXRlUmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogSWYgPGNvZGU+Y2FuVXBkYXRlUmVmZXJlbmNlczwvY29kZT4gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvCi0JICogaW5mb3JtIHRoZSByZWZhY3RvcmluZyBvYmplY3Qgd2hldGhlciByZWZlcmVuY2VzIHNob3VsZCBiZSB1cGRhdGVkLgotCSAqIFRoaXMgY2FsbCBjYW4gYmUgaWdub3JlZCBpZiAgPGNvZGU+Y2FuVXBkYXRlUmVmZXJlbmNlczwvY29kZT4gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZVJlZmVyZW5jZXMoYm9vbGVhbiB1cGRhdGUpOwotCi0JLyoqCi0JICogSWYgPGNvZGU+Y2FuVXBkYXRlUmVmZXJlbmNlczwvY29kZT4gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvCi0JICogYXNrIHRoZSByZWZhY3RvcmluZyBvYmplY3Qgd2hldGhlciByZWZlcmVuY2VzIHNob3VsZCBiZSB1cGRhdGVkLgotCSAqIFRoaXMgY2FsbCBjYW4gYmUgaWdub3JlZCBpZiAgPGNvZGU+Y2FuVXBkYXRlUmVmZXJlbmNlczwvY29kZT4gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRVcGRhdGVSZWZlcmVuY2VzKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvSVhTRFJlZmFjdG9yQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvSVhTRFJlZmFjdG9yQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZGZlYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL0lYU0RSZWZhY3RvckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTRFJlZmFjdG9yQ29uc3RhbnRzIHsKLQlTdHJpbmcgUkVGQUNUT1JfQ09OVEVYVF9NRU5VX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3JNZW51SWQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvTWFrZUFub255bW91c1R5cHNHbG9iYWxFbmFibGVtZW50VGVzdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvTWFrZUFub255bW91c1R5cHNHbG9iYWxFbmFibGVtZW50VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNTdiYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL01ha2VBbm9ueW1vdXNUeXBzR2xvYmFsRW5hYmxlbWVudFRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBNYWtlQW5vbnltb3VzVHlwc0dsb2JhbEVuYWJsZW1lbnRUZXN0ZXIgZXh0ZW5kcyBSZWZhY3RvckVuYWJsZW1lbnRUZXN0ZXIKLXsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWRPYmplY3QsIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBpZiAoc2VsZWN0ZWRPYmplY3QgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgWFNEU2NoZW1hIHNlbGVjdGVkQ29tcG9uZW50U2NoZW1hID0gbnVsbDsKLSAgICBib29sZWFuIGVuYWJsZSA9IGZhbHNlOwotICAgIHNlbGVjdGVkQ29tcG9uZW50U2NoZW1hID0gc2VsZWN0ZWRPYmplY3QuZ2V0U2NoZW1hKCk7Ci0KLSAgICBpZiAoc2VsZWN0ZWRDb21wb25lbnRTY2hlbWEgIT0gbnVsbCAmJiBzZWxlY3RlZENvbXBvbmVudFNjaGVtYSA9PSBzY2hlbWEpCi0gICAgewotICAgICAgZW5hYmxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoZW5hYmxlICYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilzZWxlY3RlZE9iamVjdDsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IHR5cGVEZWYuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZW5hYmxlICYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZURlZiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilzZWxlY3RlZE9iamVjdDsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IHR5cGVEZWYuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvTWFrZUxvY2FsRWxlbWVudEdsb2JhbEVuYWJsZW1lbnRUZXN0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9NYWtlTG9jYWxFbGVtZW50R2xvYmFsRW5hYmxlbWVudFRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGY0Njk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9NYWtlTG9jYWxFbGVtZW50R2xvYmFsRW5hYmxlbWVudFRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLQotcHVibGljIGNsYXNzIE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxFbmFibGVtZW50VGVzdGVyIGV4dGVuZHMgUmVmYWN0b3JFbmFibGVtZW50VGVzdGVyCi17Ci0gIHByb3RlY3RlZCBib29sZWFuIGNhbkVuYWJsZShYU0RDb25jcmV0ZUNvbXBvbmVudCBzZWxlY3RlZE9iamVjdCwgWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIGlmIChzZWxlY3RlZE9iamVjdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbGVhbiBlbmFibGUgPSBmYWxzZTsKLSAgICBYU0RTY2hlbWEgc2VsZWN0ZWRDb21wb25lbnRTY2hlbWEgPSBudWxsOwotICAgIHNlbGVjdGVkQ29tcG9uZW50U2NoZW1hID0gc2VsZWN0ZWRPYmplY3QuZ2V0U2NoZW1hKCk7Ci0gICAgaWYgKHNlbGVjdGVkQ29tcG9uZW50U2NoZW1hICE9IG51bGwgJiYgc2VsZWN0ZWRDb21wb25lbnRTY2hlbWEgPT0gc2NoZW1hKQotICAgIHsKLSAgICAgIGVuYWJsZSA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGVuYWJsZSAmJiBzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICBpZiAoIWVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSAmJiAhZWxlbWVudC5pc0dsb2JhbCgpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9QZXJmb3JtVW5zYXZlZFJlZmFjdG9yaW5nT3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUGVyZm9ybVVuc2F2ZWRSZWZhY3RvcmluZ09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDczOWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9QZXJmb3JtVW5zYXZlZFJlZmFjdG9yaW5nT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUHJvY2Vzc29yQmFzZWRSZWZhY3RvcmluZzsKLQotcHVibGljIGNsYXNzIFBlcmZvcm1VbnNhdmVkUmVmYWN0b3JpbmdPcGVyYXRpb24gaW1wbGVtZW50cyBJV29ya3NwYWNlUnVubmFibGUgCi17IAotICBwcml2YXRlIFByb2Nlc3NvckJhc2VkUmVmYWN0b3JpbmcgcmVmYWN0b3Jpbmc7Ci0gIAotICBwdWJsaWMgUGVyZm9ybVVuc2F2ZWRSZWZhY3RvcmluZ09wZXJhdGlvbihQcm9jZXNzb3JCYXNlZFJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nKQotICB7Ci0gICAgdGhpcy5yZWZhY3RvcmluZyA9IHJlZmFjdG9yaW5nOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwbSkKLSAgewotICAgIGlmIChwbSA9PSBudWxsKQotICAgIHsKLSAgICAgIHBtID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICB9ICAKLSAgICB0cnkKLSAgICB7IAotICAgICAgcmVmYWN0b3JpbmcuY2hlY2tBbGxDb25kaXRpb25zKHBtKTsKLSAgICAgIENoYW5nZSBjaGFuZ2UgPSByZWZhY3RvcmluZy5jcmVhdGVDaGFuZ2UocG0pOyAgIAotICAgICAgaWYgKGNoYW5nZSBpbnN0YW5jZW9mIENvbXBvc2l0ZUNoYW5nZSkKLSAgICAgIHsKLSAgICAgICAgQ29tcG9zaXRlQ2hhbmdlIGNvbXBvc2l0ZUNoYW5nZSA9IChDb21wb3NpdGVDaGFuZ2UpY2hhbmdlOwotICAgICAgICBzZXRTYXZlTW9kZShjb21wb3NpdGVDaGFuZ2UpOyAgICAgICAgICAgICAgCi0gICAgICB9ICAKLSAgICAgIGNoYW5nZS5wZXJmb3JtKHBtKTsgICAgICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldFNhdmVNb2RlKENvbXBvc2l0ZUNoYW5nZSBjb21wb3NpdGUpCi0gIHsKLSAgICBDaGFuZ2VbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgQ2hhbmdlIGNoaWxkID0gY2hpbGRyZW5baV07Ci0gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUZXh0RmlsZUNoYW5nZSkKLSAgICAgIHsKLSAgICAgICAgKChUZXh0RmlsZUNoYW5nZSljaGlsZCkuc2V0U2F2ZU1vZGUoVGV4dEZpbGVDaGFuZ2UuTEVBVkVfRElSVFkpOwotICAgICAgfSAKLSAgICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29tcG9zaXRlQ2hhbmdlKQotICAgICAgewotICAgICAgICBzZXRTYXZlTW9kZSgoQ29tcG9zaXRlQ2hhbmdlKWNoaWxkKTsKLSAgICAgIH0gIAotICAgIH0gIAotICB9Ci19ICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUmVmYWN0b3JFbmFibGVtZW50VGVzdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUmVmYWN0b3JFbmFibGVtZW50VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MTJjYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1JlZmFjdG9yRW5hYmxlbWVudFRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZhY3RvckVuYWJsZW1lbnRUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlcgotewotCi0gIHB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsIE9iamVjdCBleHBlY3RlZFZhbHVlKQotICB7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIGlmICh3aW5kb3cgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgaWYgKGFjdGl2ZVBhZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gYWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBpZiAoZWRpdG9yID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKWVkaXRvci5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0KLSAgICBpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilyZWNlaXZlcjsKLSAgICAgIHJlY2VpdmVyID0gZlN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgICAgewotICAgICAgICByZWNlaXZlciA9ICgoWFNEQmFzZUFkYXB0ZXIpcmVjZWl2ZXIpLmdldFRhcmdldCgpOwotICAgICAgfQotCi0gICAgICBpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNhbkVuYWJsZSgoWFNEQ29uY3JldGVDb21wb25lbnQpcmVjZWl2ZXIsIHNjaGVtYSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mIE5vZGUpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKXJlY2VpdmVyOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IHNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotICAgICAgICAgIHJldHVybiBjYW5FbmFibGUoY29uY3JldGVDb21wb25lbnQsIHNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGNhbkVuYWJsZShYU0RDb25jcmV0ZUNvbXBvbmVudCBzZWxlY3RlZE9iamVjdCwgWFNEU2NoZW1hIHNjaGVtYSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUmVmYWN0b3JpbmdDb21wb25lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9SZWZhY3RvcmluZ0NvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRiYzhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9SZWZhY3RvcmluZ0NvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgUmVmYWN0b3JpbmdDb21wb25lbnQKLXsKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdGhhdCBpcyByZWZhY3RvcmVkLiAgRS5nLiAiZm9vIgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgY29tcG9uZW50IHRoYXQgaXMgcmVmYWN0b3JlZC4gIEUuZy4gImh0dHA6Ly9mb28iCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKTsKLQkKLQkvKioKLQkgKiBUaGUgYmFzaWMgRE9NIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgcmVmYWN0b3JpbmcgcHJvY2Vzc29yL3BhcnRpY2lwYW50IHRvIGdldCAKLQkgKiBhY2Nlc3MgdG8gdGhlIGZpbGUgbG9jYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgU3RydWN0dXJlZCBTb3VyY2UgRWRpdG9yIFhNTCBET00gZWxlbWVudCBvYmplY3QgdGhhdCB1bmRlcmxpbmVzIHRoZSAKLQkgKiBjb21ib25lbnQgYmVpbmcgcmVmYWN0b3JlLgotCSAqIAotCSAqIEBzZWUgSURPTUVsZW1lbnQgCi0JICovCi0JcHVibGljIElET01FbGVtZW50IGdldEVsZW1lbnQoKTsKLQkKLQkvKiogCi0JICogQHJldHVybiB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUgb2YgdGhlIHJlZmFjdG9yZWQgY29tcG9uZW50LiAKLQkgKiAKLQkgKiA8cD4KLQkgKiBBIHF1YWxpZmllZCBuYW1lIGNvbnNpc3RzIG9mIGEgbG9jYWwgbmFtZSBhbmQgYSBuYW1lc3BhY2UuICAKLQkgKiBFLmcuICJjb21wbGV4VHlwZSItbG9jYWwgbmFtZSwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi1uYW1lc3BhY2UKLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBRdWFsaWZpZWROYW1lCi0JICovCi0JcHVibGljIFF1YWxpZmllZE5hbWUgZ2V0VHlwZVFOYW1lKCk7Ci0JCQotCS8qKiAKLQkgKiBUaGUgbW9kZWwgb2JqZWN0IG1heSBiZSByZXF1aXJlZCB0byBiZSBnaXZlbiB0byB0aGUgcmVmYWN0b3JlZCBwYXJ0aWNpcGFudHMgYXMgaXMgb3IgCi0JICogb3RoZXIgb2JqZWN0cyBjb3VsZCBiZSBkZXJpdmVkIGZyb20gaXQuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJpbmNpcGFsIG9iamVjdCBiZWluZyByZWZhY3RvcmVkLCBzdWNoIGFzIGFuIGluc3RhbmNlIG9mIFdTRExFbGVtZW50IG9yIAotCSAqIFhTRE5hbWVkQ29tcG9uZW50Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUmVmYWN0b3JpbmdNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1JlZmFjdG9yaW5nTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlZDRiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUmVmYWN0b3JpbmdNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBSZWZhY3RvcmluZ01lc3NhZ2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9CVU5ETEU9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoUkVTT1VSQ0VfQlVORExFKTsKLQotCXByaXZhdGUgUmVmYWN0b3JpbmdNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U3RyaW5ncyhTdHJpbmcga2V5c1tdKSB7Ci0JCVN0cmluZ1tdIHJlc3VsdD0gbmV3IFN0cmluZ1trZXlzLmxlbmd0aF07Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV09IGdldFN0cmluZyhrZXlzW2ldKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JtYXR0ZWRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IGFyZykgewotCQlyZXR1cm4gZ2V0Rm9ybWF0dGVkU3RyaW5nKGtleSwgbmV3IE9iamVjdFtdIHsgYXJnIH0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JtYXR0ZWRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpOwkKLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1JlbmFtZUVuYWJsZW1lbnRUZXN0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9SZW5hbWVFbmFibGVtZW50VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YmI5N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1JlbmFtZUVuYWJsZW1lbnRUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBSZW5hbWVFbmFibGVtZW50VGVzdGVyIGV4dGVuZHMgUmVmYWN0b3JFbmFibGVtZW50VGVzdGVyCi17Ci0gIHByb3RlY3RlZCBib29sZWFuIGNhbkVuYWJsZShYU0RDb25jcmV0ZUNvbXBvbmVudCBzZWxlY3RlZE9iamVjdCwgWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIGlmIChzZWxlY3RlZE9iamVjdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBYU0ROYW1lZENvbXBvbmVudCBzZWxlY3RlZENvbXBvbmVudCA9IG51bGw7Ci0gICAgYm9vbGVhbiBlbmFibGUgPSBmYWxzZTsKLQotICAgIFhTRFNjaGVtYSBzZWxlY3RlZENvbXBvbmVudFNjaGVtYSA9IG51bGw7Ci0gICAgc2VsZWN0ZWRDb21wb25lbnRTY2hlbWEgPSBzZWxlY3RlZE9iamVjdC5nZXRTY2hlbWEoKTsKLSAgICBpZiAoc2VsZWN0ZWRDb21wb25lbnRTY2hlbWEgIT0gbnVsbCAmJiBzZWxlY3RlZENvbXBvbmVudFNjaGVtYSA9PSBzY2hlbWEpCi0gICAgewotICAgICAgZW5hYmxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoZW5hYmxlICYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgewotICAgICAgc2VsZWN0ZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpc2VsZWN0ZWRPYmplY3Q7Ci0KLSAgICAgIGlmIChzZWxlY3RlZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKXNlbGVjdGVkQ29tcG9uZW50OwotICAgICAgICBpZiAoZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZWxlbWVudC5pc0dsb2JhbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoc2VsZWN0ZWRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IChYU0RUeXBlRGVmaW5pdGlvbilzZWxlY3RlZENvbXBvbmVudDsKLSAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gdHlwZS5nZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJlbnQ7Ci0gICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKS5lcXVhbHModHlwZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pcGFyZW50OwotICAgICAgICAgIGlmIChlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkuZXF1YWxzKHR5cGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvVGV4dENoYW5nZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9UZXh0Q2hhbmdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWM1M2U4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9UZXh0Q2hhbmdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotCi0vKioKLSAqIEEgPGNvZGU+VGV4dENoYW5nZU1hbmFnZXI8L2NvZGU+IG1hbmFnZXMgYXNzb2NpYXRpb25zIGJldHdlZW4gPGNvZGU+SUZpbGU8L2NvZGU+IGFuZCA8Y29kZT5UZXh0Q2hhbmdlPC9jb2RlPiBvYmplY3RzLgotICovCi1wdWJsaWMgY2xhc3MgVGV4dENoYW5nZU1hbmFnZXIgewotCQotCXByaXZhdGUgTWFwIGZNYXA9IG5ldyBIYXNoTWFwKDEwKTsgLy8gSUZpbGUgLT4gVGV4dENoYW5nZQotCQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmS2VlcEV4ZWN1dGVkVGV4dEVkaXRzOwotCQotCXB1YmxpYyBUZXh0Q2hhbmdlTWFuYWdlcigpIHsKLQkJdGhpcyhmYWxzZSk7Ci0JfQotCi0JcHVibGljIFRleHRDaGFuZ2VNYW5hZ2VyKGJvb2xlYW4ga2VlcEV4ZWN1dGVkVGV4dEVkaXRzKSB7Ci0JCWZLZWVwRXhlY3V0ZWRUZXh0RWRpdHM9IGtlZXBFeGVjdXRlZFRleHRFZGl0czsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBnaXZlbiBmaWxlIGFuZCB0aGUgcGFzc2VkCi0JICogY2hhbmdlIHRvIHRoaXMgbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSAoa2V5KQotCSAqIEBwYXJhbSBjaGFuZ2UgdGhlIGNoYW5nZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBtYW5hZ2UoSUZpbGUgZmlsZSwgVGV4dENoYW5nZSBjaGFuZ2UpIHsKLQkJZk1hcC5wdXQoZmlsZSwgY2hhbmdlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+VGV4dENoYW5nZTwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlLgotCSAqIElmIHRoZSBtYW5hZ2VyIGRvZXMgbm90IGFscmVhZHkgbWFuYWdlIGFuIGFzc29jaWF0aW9uIGl0IGNyZWF0ZXMgYSBvbmUuCi0JICogCi0JICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgZm9yIHdoaWNoIHRoZSB0ZXh0IGJ1ZmZlciBjaGFuZ2UgaXMgcmVxdWVzdGVkCi0JICogQHJldHVybiB0aGUgdGV4dCBjaGFuZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlLiAKLQkgKi8KLQlwdWJsaWMgVGV4dENoYW5nZSBnZXQoSUZpbGUgZmlsZSkgewotCQlUZXh0Q2hhbmdlIHJlc3VsdD0gKFRleHRDaGFuZ2UpZk1hcC5nZXQoZmlsZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0PSBuZXcgVGV4dEZpbGVDaGFuZ2UoZmlsZS50b1N0cmluZygpLCBmaWxlKTsKLQkJCXJlc3VsdC5zZXRLZWVwUHJldmlld0VkaXRzKGZLZWVwRXhlY3V0ZWRUZXh0RWRpdHMpOwotCQkJcmVzdWx0LmluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWZNYXAucHV0KGZpbGUsIHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgPHR0PlRleHRDaGFuZ2U8L3R0PiBtYW5hZ2VkIHVuZGVyIHRoZSBnaXZlbiBrZXkKLQkgKiA8Y29kZT51bml0PGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB1bml0IHRoZSBrZXkgZGV0ZXJtaW5pbmcgdGhlIDx0dD5UZXh0Q2hhbmdlPC90dD4gdG8gYmUgcmVtb3ZlZC4KLQkgKiBAcmV0dXJuIHRoZSByZW1vdmVkIDx0dD5UZXh0Q2hhbmdlPC90dD4uCi0JICovCi0JcHVibGljIFRleHRDaGFuZ2UgcmVtb3ZlKElGaWxlIHVuaXQpIHsKLQkJcmV0dXJuIChUZXh0Q2hhbmdlKWZNYXAucmVtb3ZlKHVuaXQpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0ZXh0IGNoYW5nZXMgbWFuYWdlZCBieSB0aGlzIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYWxsIHRleHQgY2hhbmdlcyBtYW5hZ2VkIGJ5IHRoaXMgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgVGV4dENoYW5nZVtdIGdldEFsbENoYW5nZXMoKXsKLQkJcmV0dXJuIChUZXh0Q2hhbmdlW10pZk1hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBUZXh0Q2hhbmdlW2ZNYXAudmFsdWVzKCkuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgZmlsZXMgbWFuYWdlZCBieSB0aGlzIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYWxsIGZpbGVzIG1hbmFnZWQgYnkgdGhpcyBpbnN0YW5jZQotCSAqLwkKLQlwdWJsaWMgSUZpbGVbXSBnZXRBbGxDb21waWxhdGlvblVuaXRzKCl7Ci0JCXJldHVybiAoSUZpbGVbXSkgZk1hcC5rZXlTZXQoKS50b0FycmF5KG5ldyBJRmlsZVtmTWFwLmtleVNldCgpLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBDbGVhcnMgYWxsIGFzc29jaWF0aW9ucyBiZXR3ZWVuIHJlc291cmNlcyBhbmQgdGV4dCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlmTWFwLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpZiBhbnkgdGV4dCBjaGFuZ2VzIGFyZSBtYW5hZ2VkIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUgdGhlIGZpbGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSB0ZXh0IGNoYW5nZXMgYXJlIG1hbmFnZWQgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZSBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwkJCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNDaGFuZ2VzSW4oSUZpbGUgZmlsZSl7Ci0JCXJldHVybiBmTWFwLmNvbnRhaW5zS2V5KGZpbGUpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvWE1MUmVmYWN0b3JpbmdDb21wb25lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9YTUxSZWZhY3RvcmluZ0NvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDc3OWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9YTUxSZWZhY3RvcmluZ0NvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxSZWZhY3RvcmluZ0NvbXBvbmVudCBpbXBsZW1lbnRzIFJlZmFjdG9yaW5nQ29tcG9uZW50Ci17Ci0JLy8gVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBiZWluZyByZWZhY3RvcmVkCi0JU3RyaW5nIG5hbWU7Ci0JCi0JLy8gVGhlIG5hbWVzcGFjZSBpbiB3aGljaCBjb21wb25lbnQgaXMgZGVmaW5lZCwgZS5nLiBYTUwgb3IgV1NETCB0YXJnZXQgbmFtZXNwYWNlCi0JU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLQkKLQkvLyBPcHRpb25hbCBtb2RlbCBvYmplY3QgdGhhdCBpcyByZWZhY3RvcmVkCi0JT2JqZWN0IG1vZGVsOwotCQotCS8vIFNFRCBET00gb2JqZWN0IHRoYXQgdW5kZXJsaW5lcyB0aGUgY29tcG9uZW50IGJlaW5nIHJlZmFjdG9yZWQKLQlJRE9NRWxlbWVudCBkb21FbGVtZW50OwotCi0JcHVibGljIFhNTFJlZmFjdG9yaW5nQ29tcG9uZW50KE9iamVjdCBtb2RlbE9iamVjdCwgSURPTUVsZW1lbnQgZG9tRWxlbWVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lc3BhY2UpCi0JewotCQlzdXBlcigpOwotCQl0aGlzLm1vZGVsID0gbW9kZWxPYmplY3Q7Ci0JCXRoaXMuZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudGFyZ2V0TmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQkKLQkJCi0JfQotCQotCXB1YmxpYyBYTUxSZWZhY3RvcmluZ0NvbXBvbmVudChJRE9NRWxlbWVudCBkb21FbGVtZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWVzcGFjZSkKLQl7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudGFyZ2V0TmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoKQotCXsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJRE9NRWxlbWVudCBnZXRFbGVtZW50KCkKLQl7Ci0JCXJldHVybiBkb21FbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQkKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotCXsKLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQkKLQlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXRUeXBlUU5hbWUoKQotCXsKLQkJcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKGRvbUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCksIGRvbUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL01ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9NYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTE0NzY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL01ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuaGFuZGxlcnMuTWFrZUFub255bW91c1R5cGVHb2JhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmUuTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iuc3RydWN0dXJlLk1ha2VUeXBlR2xvYmFsUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBNYWtlQW5vbnltb3VzVHlwZUdvYmFsSGFuZGxlcn0KLSAqLwotcHVibGljIGNsYXNzIE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uIGV4dGVuZHMgWFNEU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgZlBhcmVudE5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGlzQ29tcGxleFR5cGUgPSB0cnVlOwotCXByaXZhdGUgWFNEVHlwZURlZmluaXRpb24gZlNlbGVjdGVkQ29tcG9uZW50OwotCQotCXB1YmxpYyBNYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgWFNEU2NoZW1hIHNjaGVtYSkgewotCQlzdXBlcihzZWxlY3Rpb24sIHNjaGVtYSk7Ci0JCXNldFRleHQoUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5NYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbl90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW4oKSB7Ci0KLQkJcmV0dXJuIGZTZWxlY3RlZENvbXBvbmVudCAhPSBudWxsOwotCX0KLQkKLQotCXByaXZhdGUgU3RyaW5nIGdldE5ld0RlZmF1bHROYW1lKCl7Ci0JCWlmKGZQYXJlbnROYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhmUGFyZW50TmFtZSkpeyAvLyROT04tTkxTLTEkCi0JCQlpZihpc0NvbXBsZXhUeXBlKXsKLQkJCQlyZXR1cm4gZlBhcmVudE5hbWUgKyAiQ29tcGxleFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlewotCQkJCXJldHVybiBmUGFyZW50TmFtZSArICJTaW1wbGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2V7Ci0JCQlpZihpc0NvbXBsZXhUeXBlKXsKLQkJCQlyZXR1cm4gIk5ld0NvbXBsZXhUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZXsKLQkJCQlyZXR1cm4gIk5ld1NpbXBsZVR5cGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJCi0JfQotCXByaXZhdGUgYm9vbGVhbiBjYW5FbmFibGUoWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50KXsKLQkJaWYgKHhzZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgewotCQkJZlNlbGVjdGVkQ29tcG9uZW50ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil4c2RDb21wb25lbnQ7Ci0JCQlpc0NvbXBsZXhUeXBlID0gdHJ1ZTsKLQkJCVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgeHNkQ29tcG9uZW50OwotCQkJWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gdHlwZURlZi5nZXRDb250YWluZXIoKTsKLQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbil7Ci0JCQkJZlBhcmVudE5hbWUgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJlbnQpLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSAKLQkJZWxzZSBpZiAoeHNkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pewotCQkJZlNlbGVjdGVkQ29tcG9uZW50ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKXhzZENvbXBvbmVudDsKLQkJCWlzQ29tcGxleFR5cGUgPSBmYWxzZTsKLQkJCVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHhzZENvbXBvbmVudDsKLQkJCVhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IHR5cGVEZWYuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pewotCQkJCWZQYXJlbnROYW1lID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pcGFyZW50KS5nZXROYW1lKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKXsKLQkJCQlmUGFyZW50TmFtZSA9ICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pcGFyZW50KS5nZXROYW1lKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRW5hYmxlKE9iamVjdCBzZWxlY3RlZE9iamVjdCkgewotCQkKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpIHsKLQkJCXJldHVybiBjYW5FbmFibGUoKFhTRENvbmNyZXRlQ29tcG9uZW50KXNlbGVjdGVkT2JqZWN0KSAmJiBzdXBlci5jYW5FbmFibGUoc2VsZWN0ZWRPYmplY3QpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHNlbGVjdGVkT2JqZWN0OwotCQkJWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSBnZXRTY2hlbWEoKS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotCQkJcmV0dXJuIGNhbkVuYWJsZShjb25jcmV0ZUNvbXBvbmVudCkgJiYgc3VwZXIuY2FuRW5hYmxlKGNvbmNyZXRlQ29tcG9uZW50KTsKLQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4xKCkgewotCQkKLQkJaWYoZlNlbGVjdGVkQ29tcG9uZW50ID09IG51bGwpewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZihmU2VsZWN0ZWRDb21wb25lbnQuZ2V0U2NoZW1hKCkgPT0gbnVsbCl7Ci0JCQlnZXRTY2hlbWEoKS51cGRhdGVFbGVtZW50KHRydWUpOwotCQl9Ci0JCU1ha2VUeXBlR2xvYmFsUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBNYWtlVHlwZUdsb2JhbFByb2Nlc3NvcihmU2VsZWN0ZWRDb21wb25lbnQsIGdldE5ld0RlZmF1bHROYW1lKCkpOwotCQlSZW5hbWVSZWZhY3RvcmluZyByZWZhY3RvcmluZyA9IG5ldyBSZW5hbWVSZWZhY3RvcmluZyhwcm9jZXNzb3IpOwotCQl0cnkgewotCQkJUmVmYWN0b3JpbmdXaXphcmQgd2l6YXJkID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkKAotCQkJCQlyZWZhY3RvcmluZywKLQkJCQkJUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVDb21wb25lbnRXaXphcmRfZGVmYXVsdFBhZ2VUaXRsZSwgLy8gVE9ETzogcHJvdmlkZSBjb3JyZWN0IHN0cmluZ3MKLQkJCQkJUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVDb21wb25lbnRXaXphcmRfaW5wdXRQYWdlX2Rlc2NyaXB0aW9uLCBudWxsKTsKLQkJCVJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbiBvcD0gbmV3IFJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbih3aXphcmQpOwotCQkJb3AucnVuKFhTREVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCB3aXphcmQuZ2V0RGVmYXVsdFBhZ2VUaXRsZSgpKTsKLQkJCS8vdHJpZ2dlckJ1aWxkKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcuIFVzZXIgYWN0aW9uIGdvdCBjYW5jZWxsZWQKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCl7Ci0JCWlmKGZTZWxlY3RlZENvbXBvbmVudCA9PSBudWxsKXsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoZlNlbGVjdGVkQ29tcG9uZW50LmdldFNjaGVtYSgpID09IG51bGwpewotCQkJZ2V0U2NoZW1hKCkudXBkYXRlRWxlbWVudCh0cnVlKTsKLQkJfQotCQlEb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCkgZlNlbGVjdGVkQ29tcG9uZW50LmdldEVsZW1lbnQoKS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWRvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKAotCQkJCQkJdGhpcywKLQkJCQkJCVJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuTWFrZUFub255bW91c1R5cGVHbG9iYWxBY3Rpb25fdGV4dCk7Ci0JCU1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZCgKLQkJCQlmU2VsZWN0ZWRDb21wb25lbnQsIGdldE5ld0RlZmF1bHROYW1lKCkpOwotCQljb21tYW5kLnJ1bigpOwotCQlkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCQotCQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9NYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9NYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZDg3N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5oYW5kbGVycy5NYWtlTG9jYWxFbGVtZW50R2xvYmFsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnN0cnVjdHVyZS5NYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBNYWtlTG9jYWxFbGVtZW50R2xvYmFsSGFuZGxlcn0KLSAqLwotcHVibGljIGNsYXNzIE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb24gZXh0ZW5kcyBYU0RTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiB7Ci0KLQlYU0RFbGVtZW50RGVjbGFyYXRpb24gZlNlbGVjdGVkQ29tcG9uZW50OwotCi0JcHVibGljIE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIFhTRFNjaGVtYSBzY2hlbWEpIHsKLQkJc3VwZXIoc2VsZWN0aW9uLCBzY2hlbWEpOwotCQlzZXRUZXh0KFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJNYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uLnRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuKCkgewotCi0JCXJldHVybiBmU2VsZWN0ZWRDb21wb25lbnQgIT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWRPYmplY3QpIHsKLQotCQlmU2VsZWN0ZWRDb21wb25lbnQgPSBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlpZiAoIWVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSAmJiAhZWxlbWVudC5pc0dsb2JhbCgpKSB7Ci0JCQkJZlNlbGVjdGVkQ29tcG9uZW50ID0gZWxlbWVudDsKLQkJCX0KLQkJfSAKLQkJcmV0dXJuIGNhblJ1bigpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7Ci0JCQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgewotCQkJcmV0dXJuIGNhbkVuYWJsZSgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWRPYmplY3QpICYmIHN1cGVyLmNhbkVuYWJsZShzZWxlY3RlZE9iamVjdCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IGdldFNjaGVtYSgpCi0JCQkJCS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotCQkJcmV0dXJuIGNhbkVuYWJsZShjb25jcmV0ZUNvbXBvbmVudCkgJiYgc3VwZXIuY2FuRW5hYmxlKGNvbmNyZXRlQ29tcG9uZW50KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JCQotCX0KLQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCkgZlNlbGVjdGVkQ29tcG9uZW50LmdldEVsZW1lbnQoKQotCQkJCS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWRvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGdldFRleHQoKSk7Ci0JCU1ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgTWFrZUxvY2FsRWxlbWVudEdsb2JhbENvbW1hbmQoCi0JCQkJZlNlbGVjdGVkQ29tcG9uZW50KTsKLQkJY29tbWFuZC5ydW4oKTsKLQkJZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkMmZiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXM7Ci0KLQotCi0vKioKLSogUmVuYW1lcyBhIFhNTCBTY2hlbWEgZWxlbWVudCBvciB3b3JrYmVuY2ggcmVzb3VyY2UuCi0qIDxwPgotKiBBY3Rpb24gaXMgYXBwbGljYWJsZSB0byBzZWxlY3Rpb25zIGNvbnRhaW5pbmcgZWxlbWVudHMgb2YgdHlwZQotKiA8Y29kZT48L2NvZGU+IG9yIDxjb2RlPklSZXNvdXJjZTwvY29kZT4uCi0qIAotKiA8cD4KLSogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSogPC9wPgotCi0qLwotcHVibGljIGNsYXNzIFJlbmFtZUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uICB7Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHJlbmFtZUNvbXBvbmVudEFjdGlvbjsKLQlwcml2YXRlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHJlbmFtZVJlc291cmNlQWN0aW9uOwotCQotCQotCXB1YmxpYyBSZW5hbWVBY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIoc2VsZWN0aW9uKTsKLQkJc2V0VGV4dChSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUFjdGlvbl90ZXh0KTsgCi0JCXJlbmFtZVJlc291cmNlQWN0aW9uPSBuZXcgUmVuYW1lUmVzb3VyY2VBY3Rpb24oc2VsZWN0aW9uKTsKLQkJcmVuYW1lUmVzb3VyY2VBY3Rpb24uc2V0VGV4dChnZXRUZXh0KCkpOwotCQkKLQl9Ci0JcHVibGljIFJlbmFtZUFjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgT2JqZWN0IG1vZGVsKSB7Ci0JCXN1cGVyKHNlbGVjdGlvbik7Ci0JCXNldFRleHQoUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVBY3Rpb25fdGV4dCk7Ci0JCXJlbmFtZUNvbXBvbmVudEFjdGlvbj0gbmV3IFJlbmFtZUNvbXBvbmVudEFjdGlvbihzZWxlY3Rpb24sIG1vZGVsKTsKLQkJcmVuYW1lQ29tcG9uZW50QWN0aW9uLnNldFRleHQoZ2V0VGV4dCgpKTsKLQkJcmVuYW1lUmVzb3VyY2VBY3Rpb249IG5ldyBSZW5hbWVSZXNvdXJjZUFjdGlvbihzZWxlY3Rpb24pOwotCQlyZW5hbWVSZXNvdXJjZUFjdGlvbi5zZXRUZXh0KGdldFRleHQoKSk7Ci0JCQotCX0KLQkKLQotCQotCS8qCi0JICogQHNlZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXJlbmFtZUNvbXBvbmVudEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJaWYgKHJlbmFtZVJlc291cmNlQWN0aW9uICE9IG51bGwpCi0JCQlyZW5hbWVSZXNvdXJjZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJc2V0RW5hYmxlZChjb21wdXRlRW5hYmxlZFN0YXRlKCkpOwkJCi0JfQotCi0JLyoKLQkgKiBAc2VlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uI3VwZGF0ZShJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZihyZW5hbWVDb21wb25lbnRBY3Rpb24gIT0gbnVsbCl7Ci0JCQlyZW5hbWVDb21wb25lbnRBY3Rpb24udXBkYXRlKHNlbGVjdGlvbik7Ci0JCX0KLQkJaWYgKHJlbmFtZVJlc291cmNlQWN0aW9uICE9IG51bGwpCi0JCQlyZW5hbWVSZXNvdXJjZUFjdGlvbi51cGRhdGUoc2VsZWN0aW9uKTsKLQkJc2V0RW5hYmxlZChjb21wdXRlRW5hYmxlZFN0YXRlKCkpOwkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjb21wdXRlRW5hYmxlZFN0YXRlKCl7Ci0JCWlmIChyZW5hbWVSZXNvdXJjZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuYW1lQ29tcG9uZW50QWN0aW9uLmlzRW5hYmxlZCgpIHx8IHJlbmFtZVJlc291cmNlQWN0aW9uLmlzRW5hYmxlZCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHJlbmFtZUNvbXBvbmVudEFjdGlvbi5pc0VuYWJsZWQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChyZW5hbWVDb21wb25lbnRBY3Rpb24gIT0gbnVsbCAmJiByZW5hbWVDb21wb25lbnRBY3Rpb24uaXNFbmFibGVkKCkpCi0JCQlyZW5hbWVDb21wb25lbnRBY3Rpb24ucnVuKHNlbGVjdGlvbik7Ci0JCWlmIChyZW5hbWVSZXNvdXJjZUFjdGlvbiAhPSBudWxsICYmIHJlbmFtZVJlc291cmNlQWN0aW9uLmlzRW5hYmxlZCgpKQotCQkJcmVuYW1lUmVzb3VyY2VBY3Rpb24ucnVuKHNlbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAocmVuYW1lQ29tcG9uZW50QWN0aW9uICE9IG51bGwgJiYgcmVuYW1lQ29tcG9uZW50QWN0aW9uLmNhblJ1bigpKQotCQkJcmVuYW1lQ29tcG9uZW50QWN0aW9uLnJ1bihzZWxlY3Rpb24pOwotCQllbHNlCi0JCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVBY3Rpb25fcmVuYW1lLCBSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUFjdGlvbl91bmF2YWlsYWJsZSk7ICAKLQl9Ci0JcHVibGljIHZvaWQgcnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JICAgIGlmKHNlbGVjdGlvbiA9PSBudWxsKXsKLQkgICAgCXN1cGVyLnJ1bigpOwotCSAgICB9Ci0JICAgIGVsc2V7Ci0JICAgIAlzdXBlci5ydW4oc2VsZWN0aW9uKTsKLQkgICAgfQotCQkKLQl9Ci0JcHVibGljIGZpbmFsIHZvaWQgc2V0UmVuYW1lQ29tcG9uZW50QWN0aW9uKAotCQkJU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gcmVuYW1lQ29tcG9uZW50QWN0aW9uKQotCXsKLQkJdGhpcy5yZW5hbWVDb21wb25lbnRBY3Rpb24gPSByZW5hbWVDb21wb25lbnRBY3Rpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lQ29tcG9uZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVDb21wb25lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0NDdlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5HbG9iYWxCdWlsZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3MuU2F2ZURpcnR5RmlsZXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuWE1MUmVmYWN0b3JpbmdDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5oYW5kbGVycy5SZW5hbWVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLlJlbmFtZUNvbXBvbmVudFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBSZW5hbWVIYW5kbGVyfSAKLSAqLwotcHVibGljIGNsYXNzIFJlbmFtZUNvbXBvbmVudEFjdGlvbiBleHRlbmRzIFhTRFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHsKLQotCXByaXZhdGUgWFNETmFtZWRDb21wb25lbnQgc2VsZWN0ZWRDb21wb25lbnQ7Ci0KLQlwdWJsaWMgUmVuYW1lQ29tcG9uZW50QWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLAotCQkJT2JqZWN0IGFNb2RlbCkgewotCQlzdXBlcihzZWxlY3Rpb24sIGFNb2RlbCk7Ci0JCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRW5hYmxlKFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkT2JqZWN0KSB7Ci0KLQkJc2VsZWN0ZWRDb21wb25lbnQgPSBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkgewotCQkJc2VsZWN0ZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpIHNlbGVjdGVkT2JqZWN0OwotCi0JCQkvLyBpZiBpdCdzIGVsZW1lbnQgcmVmZXJlbmNlLCB0aGVuIHRoaXMgYWN0aW9uIGlzIG5vdCBhcHByb3ByaWF0ZQotCQkJaWYgKHNlbGVjdGVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBzZWxlY3RlZENvbXBvbmVudDsKLQkJCQlpZiAoZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKSB7Ci0JCQkJCXNlbGVjdGVkQ29tcG9uZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihzZWxlY3RlZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKXsKLQkJCQlYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKSBzZWxlY3RlZENvbXBvbmVudDsKLQkJCQlYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSB0eXBlLmdldENvbnRhaW5lcigpOwotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBwYXJlbnQ7Ci0JCQkJCWlmKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKS5lcXVhbHModHlwZSkpewotCQkJCQkJc2VsZWN0ZWRDb21wb25lbnQgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHsKLQkJCQkJWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgcGFyZW50OwotCQkJCQlpZihlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkuZXF1YWxzKHR5cGUpKXsKLQkJCQkJCXNlbGVjdGVkQ29tcG9uZW50ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjYW5SdW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7Ci0KLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpIAotCQl7Ci0JCQlyZXR1cm4gY2FuRW5hYmxlKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgc2VsZWN0ZWRPYmplY3QpICYmIHN1cGVyLmNhbkVuYWJsZShzZWxlY3RlZE9iamVjdCk7Ci0JCX0gZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSAKLQkJewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHNlbGVjdGVkT2JqZWN0OwotCQkJaWYgKGdldFNjaGVtYSgpICE9IG51bGwpIAotCQkJewotCQkJCVhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gZ2V0U2NoZW1hKCkKLQkJCQkJCS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotCQkJCXJldHVybiBjYW5FbmFibGUoY29uY3JldGVDb21wb25lbnQpICYmIHN1cGVyLmNhbkVuYWJsZShjb25jcmV0ZUNvbXBvbmVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuKCkgewotCi0JCXJldHVybiBzZWxlY3RlZENvbXBvbmVudCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXNlbGVjdGVkQ29tcG9uZW50LnNldE5hbWUobmV3IFN0cmluZygpKTsKLQkJfQotCQlpZiAoc2VsZWN0ZWRDb21wb25lbnQuZ2V0U2NoZW1hKCkgPT0gbnVsbCkgewotCQkJaWYgKGdldFNjaGVtYSgpICE9IG51bGwpIHsKLQkJCQlnZXRTY2hlbWEoKS51cGRhdGVFbGVtZW50KHRydWUpOwotCQkJfQotCi0JCX0KLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmMgPSBTYXZlRGlydHlGaWxlc0RpYWxvZy5zYXZlRGlydHlGaWxlcygpOwotICAgICAgICBpZiAoIXJjKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9ICAKLSAgICAgICAgUmVmYWN0b3JpbmdDb21wb25lbnQgY29tcG9uZW50ID0gbmV3IFhNTFJlZmFjdG9yaW5nQ29tcG9uZW50KAotCQkJCXNlbGVjdGVkQ29tcG9uZW50LAotCQkJCShJRE9NRWxlbWVudClzZWxlY3RlZENvbXBvbmVudC5nZXRFbGVtZW50KCksIAotCQkJCXNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWUoKSwKLQkJCQlzZWxlY3RlZENvbXBvbmVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCQotCQlSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFJlbmFtZUNvbXBvbmVudFByb2Nlc3NvcigKLQkJCQljb21wb25lbnQsIHNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0JCVJlbmFtZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nKHByb2Nlc3Nvcik7Ci0JCXRyeSB7Ci0JCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQoCi0JCQkJCXJlZmFjdG9yaW5nLAotCQkJCQlSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFdpemFyZF9kZWZhdWx0UGFnZVRpdGxlLCAKLQkJCQkJUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcwotCQkJCQkJCS5SZW5hbWVDb21wb25lbnRXaXphcmRfaW5wdXRQYWdlX2Rlc2NyaXB0aW9uLCAKLQkJCQkJbnVsbCk7Ci0JCQlSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24gb3AgPSBuZXcgUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uKAotCQkJCQl3aXphcmQpOwotCQkJb3AucnVuKFhTREVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCB3aXphcmQKLQkJCQkJLmdldERlZmF1bHRQYWdlVGl0bGUoKSk7Ci0JCQkKLQkJCS8vIFRPRE8gKGNzKSBJJ20gbm90IHN1cmUgd2h5IHdlIG5lZWQgdG8gZG8gdGhpcy4gIFNlZSBidWcgMTQ1NzAwCi0JCQkvL3RyaWdnZXJCdWlsZCgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkbyBub3RoaW5nLiBVc2VyIGFjdGlvbiBnb3QgY2FuY2VsbGVkCi0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmlnZ2VyQnVpbGQoKSB7Ci0JCWlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKS5pc0F1dG9CdWlsZGluZygpKSB7Ci0JCQluZXcgR2xvYmFsQnVpbGRBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSwKLQkJCQkJSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCkucnVuKCk7Ci0JCX0KLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lUmVzb3VyY2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZDdkOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVSZWZhY3RvcmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZW5hbWVSZWZhY3RvcmluZ1dpemFyZDsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZW5hbWVSZXNvdXJjZUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHsKLQotCi0KLQkKLQlwdWJsaWMgUmVuYW1lUmVzb3VyY2VBY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlzdXBlcihzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlSZXNvdXJjZSBlbGVtZW50PSBnZXRSZXNvdXJjZShzZWxlY3Rpb24pOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCVJlbmFtZVJlc291cmNlUHJvY2Vzc29yIHByb2Nlc3Nvcj0gbmV3IFJlbmFtZVJlc291cmNlUHJvY2Vzc29yKGVsZW1lbnQpOwotCQkJc2V0RW5hYmxlZChwcm9jZXNzb3IuaXNBcHBsaWNhYmxlKCkpOwotCQkJCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKHNlbGVjdGlvbik7Ci0JCVJlbmFtZVJlc291cmNlUHJvY2Vzc29yIHByb2Nlc3Nvcj0gbmV3IFJlbmFtZVJlc291cmNlUHJvY2Vzc29yKHJlc291cmNlKTsKLQotCQkJaWYoIXByb2Nlc3Nvci5pc0FwcGxpY2FibGUoKSkKLQkJCQlyZXR1cm47Ci0JCQlSZW5hbWVSZWZhY3RvcmluZyByZWZhY3RvcmluZz0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nKHByb2Nlc3Nvcik7Ci0JCQl0cnkgewotCQkJCVJlZmFjdG9yaW5nV2l6YXJkIHdpemFyZCA9IG5ldyBSZW5hbWVSZWZhY3RvcmluZ1dpemFyZCgKLQkJCQkJCXJlZmFjdG9yaW5nLAotCQkJCQkJUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVDb21wb25lbnRXaXphcmRfZGVmYXVsdFBhZ2VUaXRsZSwgLy9UT0RPOiBwcm92aWRlIGNvcnJlY3Qgc3RyaW5ncwotCQkJCQkJUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVDb21wb25lbnRXaXphcmRfaW5wdXRQYWdlX2Rlc2NyaXB0aW9uLCAKLQkJCQkJCW51bGwpOwotCQkJCVJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbiBvcD0gbmV3IFJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbih3aXphcmQpOwotCQkJCW9wLnJ1bihYU0RFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgd2l6YXJkLmdldERlZmF1bHRQYWdlVGl0bGUoKSk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZy4gVXNlciBhY3Rpb24gZ290IGNhbmNlbGxlZAotCQkJfQotCQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgIT0gMSkKLQkJCXJldHVybiBudWxsOwotCQlPYmplY3QgZmlyc3Q9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKCEgKGZpcnN0IGluc3RhbmNlb2YgSVJlc291cmNlKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElSZXNvdXJjZSlmaXJzdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0YTVhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVSZXNvdXJjZUFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBAYXV0aG9yIGViZWxpc2FyQGNhLmlibS5jb20KLSAqLwotcHVibGljIGNsYXNzIFJlbmFtZVJlc291cmNlQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCQotCXByaXZhdGUgSVNlbGVjdGlvbiBmQ3VycmVudFNlbGVjdGlvbjsKLQotLy8JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBmUGFydDsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0vLwkJZlBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoZkN1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbj0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmQ3VycmVudFNlbGVjdGlvbjsKLQkJCU9iamVjdCBmaXJzdD0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChmaXJzdCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJUmVuYW1lUmVzb3VyY2VBY3Rpb24gcmVuYW1lQWN0aW9uID0gbmV3IFJlbmFtZVJlc291cmNlQWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQkJCXJlbmFtZUFjdGlvbi5ydW4oc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZDdXJyZW50U2VsZWN0aW9uPSBzZWxlY3Rpb247Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVUYXJnZXROYW1lc3BhY2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVRhcmdldE5hbWVzcGFjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGNlZWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVRhcmdldE5hbWVzcGFjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuR2xvYmFsQnVpbGRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLlJlbmFtZVRhcmdldE5hbWVzcGFjZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgUmVuYW1lVGFyZ2V0TmFtZXNwYWNlQWN0aW9uIGV4dGVuZHMgWFNEU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gewotCi0JcHVibGljIFJlbmFtZVRhcmdldE5hbWVzcGFjZUFjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwKLQkJCU9iamVjdCBhTW9kZWwpIHsKLQkJc3VwZXIoc2VsZWN0aW9uLCBhTW9kZWwpOwotCQlzZXRUZXh0KFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVuYW1lVGFyZ2V0TmFtZXNwYWNlX3RleHQpOwotCi0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmNhbkVuYWJsZShzZWxlY3RlZE9iamVjdCk7Ci0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuKCkgewotCi0JCXJldHVybiBnZXRTY2hlbWEoKSAhPSBudWxsOwotCX0KLQotCi0JcHVibGljIHZvaWQgcnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0KLQkJCi0JCVJlbmFtZVRhcmdldE5hbWVzcGFjZVByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgUmVuYW1lVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yKGdldFNjaGVtYSgpLCBnZXRTY2hlbWEoKS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCVJlbmFtZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nKHByb2Nlc3Nvcik7Ci0JCXRyeSB7Ci0JCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQoCi0JCQkJCXJlZmFjdG9yaW5nLAotCQkJCQlSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFdpemFyZF9kZWZhdWx0UGFnZVRpdGxlLC8vVE9ETzogcHJvdmlkZSBjb3JyZWN0IHN0cmluZ3MKLQkJCQkJUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVDb21wb25lbnRXaXphcmRfaW5wdXRQYWdlX2Rlc2NyaXB0aW9uLCAKLQkJCQkJbnVsbCk7Ci0JCQlSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24gb3AgPSBuZXcgUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uKAotCQkJCQl3aXphcmQpOwotCQkJb3AucnVuKFhTREVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCB3aXphcmQKLQkJCQkJLmdldERlZmF1bHRQYWdlVGl0bGUoKSk7Ci0JCQl0cmlnZ2VyQnVpbGQoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90aGluZy4gVXNlciBhY3Rpb24gZ290IGNhbmNlbGxlZAotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJpZ2dlckJ1aWxkKCkgewotCQlpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCkuaXNBdXRvQnVpbGRpbmcoKSkgewotCQkJbmV3IEdsb2JhbEJ1aWxkQWN0aW9uKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCksCi0JCQkJCUluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQpLnJ1bigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9TZWxlY3Rpb25EaXNwYXRjaEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyYWFjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9TZWxlY3Rpb25EaXNwYXRjaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLQotCi0KLS8qKgotICogQWN0aW9uIHRoYXQgZGlzcGF0Y2hlcyB0aGUgPGNvZGU+SUFjdGlvbiNydW4oKTwvY29kZT4gYW5kIHRoZSAKLSAqIDxjb2RlPklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZDwvY29kZT4gCi0gKiBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgdGhlIHNlbGVjdGlvbi4gCi0gKiAKLSAqIDx1bD4KLSAqIAk8bGk+aWYgc2VsZWN0aW9uIGlzIG9mIHR5cGUgPGNvZGU+SVRleHRTZWxlY3Rpb248L2NvZGU+IHRoZW4KLSAqIAk8Y29kZT5ydW4oSVRleHRTZWxlY3Rpb24pPC9jb2RlPiBhbmQgPGNvZGU+c2VsZWN0aW9uQ2hhbmdlZChJVGV4dFNlbGVjdGlvbik8L2NvZGU+Ci0gKiAJaXMgY2FsbGVkLjwvbGk+IAotICogCTxsaT5pZiBzZWxlY3Rpb24gaXMgb2YgdHlwZSA8Y29kZT5JU3RydWN0dXJlZFNlbGVjdGlvbjwvY29kZT4gdGhlbgotICogCTxjb2RlPnJ1bihJU3RydWN0dXJlZFNlbGVjdGlvbik8L2NvZGU+IGFuZCA8Y29kZT4KLSAqIAlzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKTwvY29kZT4gaXMgY2FsbGVkLjwvbGk+Ci0gKiAJPGxpPmRlZmF1bHQgaXMgdG8gY2FsbCA8Y29kZT5ydW4oSVNlbGVjdGlvbik8L2NvZGU+IGFuZCA8Y29kZT4KLSAqIAlzZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24pPC9jb2RlPi48L2xpPgotICogPC91bD4KLSAqIAotICogPHA+Ci0gKiBhZGFwdGVkIGZyb20gPGNvZGU+b3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb248L2NvZGU+Ci0gKiA8L3A+Ci0gKiAgIAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JCi0JcHJpdmF0ZSBPYmplY3QgbW9kZWw7Ci0JCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoc2VsZWN0aW9uKTsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGlvbiBwcm92aWRlZCBieSB0aGUgc2l0ZSBvd25pbmcgdGhpcyBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgc2l0ZSdzIHNlbGVjdGlvbgotCSAqLwkKLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGFjdGlvbidzIGVuYWJsZW1lbnQgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzZWxlY3Rpb24uIFRoaXMKLQkgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIG9uZSBvZiB0aGUgPGNvZGU+c2VsZWN0aW9uQ2hhbmdlZDwvY29kZT4KLQkgKiBtZXRob2RzIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUgcGFzc2VkIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBzZWxlY3Rpb24gdGhpcyBhY3Rpb24gaXMgd29ya2luZyBvbgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlkaXNwYXRjaFNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGFjdGlvbiB0aGF0IHRoZSBnaXZlbiBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4gVGhpcyBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gY2FsbHMgPGNvZGU+c2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uIHNlbGVjdGlvbik8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIG5ldyBzZWxlY3Rpb24KLSAJICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IG9iamVjdCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCXNldEVuYWJsZWQoY2FuRW5hYmxlKG9iamVjdCkpOwotCQl9Ci0JCWVsc2V7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoaXMgYWN0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJ1Y3R1cmVkIHNlbGVjdGlvbi4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JICogY2FsbHMgPGNvZGU+cnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKTwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlydW4oKElTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGFjdGlvbiB0aGF0IHRoZSBnaXZlbiB0ZXh0IHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4gIFRoaXMgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIGNhbGxzIDxjb2RlPnNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBuZXcgc2VsZWN0aW9uCi0gCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWQoKElTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhpcyBhY3Rpb25zIHdpdGggdGhlIGdpdmVuIHRleHQgc2VsZWN0aW9uLiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQkgKiBjYWxscyA8Y29kZT5ydW4oSVNlbGVjdGlvbiBzZWxlY3Rpb24pPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJ1bigoSVNlbGVjdGlvbilzZWxlY3Rpb24pOwotCX0KLQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGFjdGlvbiB0aGF0IHRoZSBnaXZlbiBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuICBUaGlzIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiBzZXRzIHRoZSBhY3Rpb24ncyBlbmFibGVtZW50IHN0YXRlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBuZXcgc2VsZWN0aW9uCi0gCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoaXMgYWN0aW9ucyB3aXRoIHRoZSBnaXZlbiBzZWxlY3Rpb24uIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCSAqIGRvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gSUFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWRpc3BhdGNoUnVuKGdldFNlbGVjdGlvbigpKTsKLQkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlkaXNwYXRjaFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwYXRjaFNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pOwotCQl9IGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkKChJVGV4dFNlbGVjdGlvbilzZWxlY3Rpb24pOwotCQl9IGVsc2UgewotCQkJc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hSdW4oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlydW4oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbik7Ci0JCX0gIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlydW4oKElUZXh0U2VsZWN0aW9uKXNlbGVjdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlydW4oc2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0TW9kZWwoKQotCXsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldE1vZGVsKE9iamVjdCBtb2RlbCkKLQl7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuKCkgewotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvWFNEUmVmYWN0b3JBY3Rpb25Hcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvWFNEUmVmYWN0b3JBY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTY5ZjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1hTRFJlZmFjdG9yQWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVmYWN0b3JBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgWFNEUmVmYWN0b3JBY3Rpb25Hcm91cCBleHRlbmRzIFJlZmFjdG9yQWN0aW9uR3JvdXAgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BS0VfRUxFTUVOVF9HTE9CQUwgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQUtFX1RZUEVfR0xPQkFMID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1FX0VMRU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNRV9UQVJHRVRfTkFNRVNQQ0UgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5yZW5hbWVUYXJnZXROYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGZNYWtlTG9jYWxFbGVtZW50R2xvYmFsOwotCi0JcHJpdmF0ZSBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBmTWFrZUxvY2FsVHlwZUdsb2JhbDsKLQotCXB1YmxpYyBYU0RSZWZhY3RvckFjdGlvbkdyb3VwKElTZWxlY3Rpb24gc2VsZWN0aW9uLAotCQkJWFNEU2NoZW1hIHNjaGVtYSkgewotCQlzdXBlcihzZWxlY3Rpb24pOwotCQlmRWRpdG9yQWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZlJlbmFtZUFjdGlvbiA9IG5ldyBSZW5hbWVBY3Rpb24oc2VsZWN0aW9uLCBzY2hlbWEpOwotCQlmUmVuYW1lQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChSRU5BTUVfRUxFTUVOVCk7Ci0JCWZFZGl0b3JBY3Rpb25zLmFkZChmUmVuYW1lQWN0aW9uKTsKLQotCQkvL2ZSZW5hbWVUYXJnZXROYW1lc3BhY2UgPSBuZXcgUmVuYW1lVGFyZ2V0TmFtZXNwYWNlQWN0aW9uKAotCQkvLwkJc2VsZWN0aW9uLCBzY2hlbWEpOwotCQkvL2ZSZW5hbWVUYXJnZXROYW1lc3BhY2Uuc2V0QWN0aW9uRGVmaW5pdGlvbklkKFJFTkFNRV9UQVJHRVRfTkFNRVNQQ0UpOwotCQkvL2ZFZGl0b3JBY3Rpb25zLmFkZChmUmVuYW1lVGFyZ2V0TmFtZXNwYWNlKTsKLQotCQlmTWFrZUxvY2FsRWxlbWVudEdsb2JhbCA9IG5ldyBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uKAotCQkJCXNlbGVjdGlvbiwgc2NoZW1hKTsKLQkJZk1ha2VMb2NhbEVsZW1lbnRHbG9iYWwuc2V0QWN0aW9uRGVmaW5pdGlvbklkKE1BS0VfRUxFTUVOVF9HTE9CQUwpOwotCQlmRWRpdG9yQWN0aW9ucy5hZGQoZk1ha2VMb2NhbEVsZW1lbnRHbG9iYWwpOwotCi0JCWZNYWtlTG9jYWxUeXBlR2xvYmFsID0gbmV3IE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uKAotCQkJCXNlbGVjdGlvbiwgc2NoZW1hKTsKLQkJZk1ha2VMb2NhbFR5cGVHbG9iYWwuc2V0QWN0aW9uRGVmaW5pdGlvbklkKE1BS0VfVFlQRV9HTE9CQUwpOwotCQlmRWRpdG9yQWN0aW9ucy5hZGQoZk1ha2VMb2NhbFR5cGVHbG9iYWwpOwotCi0JCWluaXRBY3Rpb24oZlJlbmFtZUFjdGlvbiwgc2VsZWN0aW9uKTsKLQkJLy9pbml0QWN0aW9uKGZSZW5hbWVUYXJnZXROYW1lc3BhY2UsIHNlbGVjdGlvbik7Ci0JCWluaXRBY3Rpb24oZk1ha2VMb2NhbEVsZW1lbnRHbG9iYWwsIHNlbGVjdGlvbik7Ci0JCWluaXRBY3Rpb24oZk1ha2VMb2NhbFR5cGVHbG9iYWwsIHNlbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLS8vCQlkaXNwb3NlQWN0aW9uKGZSZW5hbWVBY3Rpb24sIHNlbGVjdGlvbik7Ci0vLwkJZGlzcG9zZUFjdGlvbihmTWFrZUxvY2FsRWxlbWVudEdsb2JhbCwgc2VsZWN0aW9uKTsKLS8vCQlkaXNwb3NlQWN0aW9uKGZNYWtlTG9jYWxUeXBlR2xvYmFsLCBzZWxlY3Rpb24pOwotLy8JCWRpc3Bvc2VBY3Rpb24oZlJlbmFtZVRhcmdldE5hbWVzcGFjZSwgc2VsZWN0aW9uKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvWFNEUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9YU0RSZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4NzNmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9YU0RSZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuSVNlbGVjdGlvbk1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnMuWFNEUmVmYWN0b3JBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3RvckFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3Rvckdyb3VwU3ViTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgWFNEUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlIHsKLQotCXB1YmxpYyBYU0RSZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRmlsbHMgdGhlIG1lbnUgd2l0aCBhcHBsaWNhYmxlIHJlZmFjdG9yIHN1Yi1tZW51ZXMKLQkgKiBAcGFyYW0gbWVudSBUaGUgbWVudSB0byBmaWxsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnUoTWVudSBtZW51KSB7Ci0JCWlmIChmU2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAod29ya2JlbmNoUGFydCAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSA9IHdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpOwotCQkJaWYgKHNpdGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCi0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBzaXRlLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpZWRpdG9yLmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBJU2VsZWN0aW9uTWFwcGVyIG1hcHBlciA9IChJU2VsZWN0aW9uTWFwcGVyKWVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25NYXBwZXIuY2xhc3MpOwotCQkJICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG1hcHBlciAhPSBudWxsID8gbWFwcGVyLm1hcFNlbGVjdGlvbihmU2VsZWN0aW9uKSA6IGZTZWxlY3Rpb247ICAgICAgICAgICAgICAgICAgICAKLQkJCQkJUmVmYWN0b3JBY3Rpb25Hcm91cCByZWZhY3Rvck1lbnVHcm91cCA9IG5ldyBYU0RSZWZhY3RvckFjdGlvbkdyb3VwKHNlbGVjdGlvbiwgc2NoZW1hKTsKLQkJCQkJUmVmYWN0b3JHcm91cFN1Yk1lbnUgc3ViTWVudSA9IG5ldyBSZWZhY3Rvckdyb3VwU3ViTWVudShyZWZhY3Rvck1lbnVHcm91cCk7Ci0JCQkJCXN1Yk1lbnUuZmlsbChtZW51LCAtMSk7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJCi0JCX0KLQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9YU0RTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvWFNEU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyOGRmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9YU0RTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uCi17Ci0KLQkKLQkKLQlwdWJsaWMgWFNEU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIE9iamVjdCBtb2RlbCkKLQl7Ci0JCXN1cGVyKHNlbGVjdGlvbik7Ci0JCXNldE1vZGVsKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWFNEU2NoZW1hIGdldFNjaGVtYSgpewotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZihtb2RlbCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLQkJewotCQkJcmV0dXJuIChYU0RTY2hlbWEpIG1vZGVsOwotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkQ29tcG9uZW50KQotCXsKLQkJWFNEU2NoZW1hIHNlbGVjdGVkQ29tcG9uZW50U2NoZW1hID0gbnVsbDsKLQkJaWYgKHNlbGVjdGVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0JCXsKLQkJCXNlbGVjdGVkQ29tcG9uZW50U2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClzZWxlY3RlZENvbXBvbmVudCkuZ2V0U2NoZW1hKCk7Ci0JCX0KLQkJCi0JCWlmIChzZWxlY3RlZENvbXBvbmVudFNjaGVtYSAhPSBudWxsICYmIHNlbGVjdGVkQ29tcG9uZW50U2NoZW1hID09IGdldFNjaGVtYSgpICkKLQkJewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2hhbmRsZXJzL01ha2VBbm9ueW1vdXNUeXBlR29iYWxIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvaGFuZGxlcnMvTWFrZUFub255bW91c1R5cGVHb2JhbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkODA4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvaGFuZGxlcnMvTWFrZUFub255bW91c1R5cGVHb2JhbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5oYW5kbGVyczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmUuTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIE1ha2VBbm9ueW1vdXNUeXBlR29iYWxIYW5kbGVyIGV4dGVuZHMgUmVmYWN0b3JpbmdIYW5kbGVyCi17Ci0gIHByaXZhdGUgU3RyaW5nIHBhcmVudE5hbWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBsZXhUeXBlID0gdHJ1ZTsKLQotICBwdWJsaWMgT2JqZWN0IGRvRXhlY3V0ZShJU2VsZWN0aW9uIHNlbGVjdGlvbiwgWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIAotICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGVkT2JqZWN0ID0gKChYU0RCYXNlQWRhcHRlcilzZWxlY3RlZE9iamVjdCkuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcCA9IG51bGw7Ci0KLSAgICAgIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIE5vZGUpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKXNlbGVjdGVkT2JqZWN0OwotICAgICAgICBjb25jcmV0ZUNvbXAgPSBzY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChub2RlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIGNvbmNyZXRlQ29tcCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWRPYmplY3QpOwotICAgICAgfQotCi0gICAgICBpZiAoY29uY3JldGVDb21wICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChjb25jcmV0ZUNvbXAgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLQotICAgICAgICAgIGlzQ29tcGxleFR5cGUgPSB0cnVlOwotICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiljb25jcmV0ZUNvbXA7Ci0gICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gdHlwZURlZi5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBhcmVudE5hbWUgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJlbnQpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIHJ1bihzZWxlY3Rpb24sIHNjaGVtYSwgdHlwZURlZik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGNvbmNyZXRlQ29tcCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzQ29tcGxleFR5cGUgPSBmYWxzZTsKLSAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGVEZWYgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pY29uY3JldGVDb21wOwotICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50Q29tcCA9IHNpbXBsZVR5cGVEZWYuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50Q29tcCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcGFyZW50TmFtZSA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcmVudCkuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcGFyZW50TmFtZSA9ICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pcGFyZW50KS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1bihzZWxlY3Rpb24sIHNjaGVtYSwgc2ltcGxlVHlwZURlZik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXROZXdEZWZhdWx0TmFtZSgpCi0gIHsKLSAgICBpZiAocGFyZW50TmFtZSAhPSBudWxsICYmICEiIi5lcXVhbHMocGFyZW50TmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGlzQ29tcGxleFR5cGUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBwYXJlbnROYW1lICsgIkNvbXBsZXhUeXBlIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gcGFyZW50TmFtZSArICJTaW1wbGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGlzQ29tcGxleFR5cGUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAiTmV3Q29tcGxleFR5cGUiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAiTmV3U2ltcGxlVHlwZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgWFNEU2NoZW1hIHNjaGVtYSwgWFNEVHlwZURlZmluaXRpb24gc2VsZWN0ZWRDb21wb25lbnQpCi0gIHsKLSAgICBpZiAoc2VsZWN0ZWRDb21wb25lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHNlbGVjdGVkQ29tcG9uZW50LmdldFNjaGVtYSgpID09IG51bGwpCi0gICAgewotICAgICAgc2NoZW1hLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0gICAgfQotICAgIERvY3VtZW50SW1wbCBkb2MgPSAoRG9jdW1lbnRJbXBsKXNlbGVjdGVkQ29tcG9uZW50LmdldEVsZW1lbnQoKS5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5NYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbl90ZXh0KTsKLSAgICBNYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQgY29tbWFuZCA9IG5ldyBNYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQoc2VsZWN0ZWRDb21wb25lbnQsIGdldE5ld0RlZmF1bHROYW1lKCkpOwotICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2hhbmRsZXJzL01ha2VMb2NhbEVsZW1lbnRHbG9iYWxIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvaGFuZGxlcnMvTWFrZUxvY2FsRWxlbWVudEdsb2JhbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3OGQ4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvaGFuZGxlcnMvTWFrZUxvY2FsRWxlbWVudEdsb2JhbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmhhbmRsZXJzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnN0cnVjdHVyZS5NYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxIYW5kbGVyIGV4dGVuZHMgUmVmYWN0b3JpbmdIYW5kbGVyCi17Ci0KLSAgcHVibGljIE9iamVjdCBkb0V4ZWN1dGUoSVNlbGVjdGlvbiBzZWxlY3Rpb24sIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0ZWRPYmplY3QgPSAoKFhTREJhc2VBZGFwdGVyKXNlbGVjdGVkT2JqZWN0KS5nZXRUYXJnZXQoKTsKLSAgICAgIH0KLSAgICAgIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgcnVuKHNlbGVjdGlvbiwgKFhTREVsZW1lbnREZWNsYXJhdGlvbilzZWxlY3RlZE9iamVjdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIE5vZGUpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKXNlbGVjdGVkT2JqZWN0OwotICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IHNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotICAgICAgICBpZiAoY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICAgICAgcnVuKHNlbGVjdGlvbiwgKFhTREVsZW1lbnREZWNsYXJhdGlvbiljb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIFhTREVsZW1lbnREZWNsYXJhdGlvbiBzZWxlY3RlZENvbXBvbmVudCkKLSAgewotICAgIERvY3VtZW50SW1wbCBkb2MgPSAoRG9jdW1lbnRJbXBsKXNlbGVjdGVkQ29tcG9uZW50LmdldEVsZW1lbnQoKS5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgIk1ha2VMb2NhbEVsZW1lbnRHbG9iYWxIYW5kbGVyLnRleHQiKTsKLSAgICBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kKHNlbGVjdGVkQ29tcG9uZW50KTsKLSAgICBjb21tYW5kLnJ1bigpOwotICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9oYW5kbGVycy9SZWZhY3RvcmluZ0hhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9oYW5kbGVycy9SZWZhY3RvcmluZ0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlMDJmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvaGFuZGxlcnMvUmVmYWN0b3JpbmdIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmYWN0b3JpbmdIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCi17Ci0gIHB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgCi0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coZXZlbnQpOwotICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLSAgICBJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICBpZiAoYWN0aXZlUGFnZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgaWYgKGVkaXRvciA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSllZGl0b3IuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpOwotICAgICAKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGFjdGl2ZVBhZ2UuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCi0gICAgcmV0dXJuIGRvRXhlY3V0ZShzZWxlY3Rpb24sIHNjaGVtYSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGRvRXhlY3V0ZShJU2VsZWN0aW9uIHNlbGVjdGlvbiwgWFNEU2NoZW1hIHNjaGVtYSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvaGFuZGxlcnMvUmVuYW1lSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2hhbmRsZXJzL1JlbmFtZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2YmQ0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvaGFuZGxlcnMvUmVuYW1lSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmhhbmRsZXJzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVSZWZhY3RvcmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3MuU2F2ZURpcnR5RmlsZXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5YTUxSZWZhY3RvcmluZ0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5SZW5hbWVDb21wb25lbnRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZW5hbWVSZWZhY3RvcmluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgUmVuYW1lSGFuZGxlciBleHRlbmRzIFJlZmFjdG9yaW5nSGFuZGxlcgotewotCi0gIHByb3RlY3RlZCBPYmplY3QgZG9FeGVjdXRlKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgcmV0dXJuIGV4ZWN1dGUoc2VsZWN0aW9uLCBzY2hlbWEpOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBleGVjdXRlKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgIHsKLQotICAgICAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0ZWRPYmplY3QgPSAoKFhTREJhc2VBZGFwdGVyKXNlbGVjdGVkT2JqZWN0KS5nZXRUYXJnZXQoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIHJ1bihzZWxlY3Rpb24sIHNjaGVtYSwgKFhTRE5hbWVkQ29tcG9uZW50KXNlbGVjdGVkT2JqZWN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gc2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQobm9kZSk7Ci0gICAgICAgICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcnVuKHNlbGVjdGlvbiwgc2NoZW1hLCAoWFNETmFtZWRDb21wb25lbnQpY29uY3JldGVDb21wb25lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBYU0RTY2hlbWEgc2NoZW1hLCBYU0ROYW1lZENvbXBvbmVudCBzZWxlY3RlZENvbXBvbmVudCkKLSAgewotICAgIGlmIChzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZWxlY3RlZENvbXBvbmVudC5zZXROYW1lKG5ldyBTdHJpbmcoKSk7Ci0gICAgfQotICAgIGlmIChzZWxlY3RlZENvbXBvbmVudC5nZXRTY2hlbWEoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2NoZW1hLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICBib29sZWFuIHJjID0gU2F2ZURpcnR5RmlsZXNEaWFsb2cuc2F2ZURpcnR5RmlsZXMoKTsKLSAgICBpZiAoIXJjKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgUmVmYWN0b3JpbmdDb21wb25lbnQgY29tcG9uZW50ID0gbmV3IFhNTFJlZmFjdG9yaW5nQ29tcG9uZW50KAotICAgICAgc2VsZWN0ZWRDb21wb25lbnQsCi0gICAgICAoSURPTUVsZW1lbnQpc2VsZWN0ZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpLAotICAgICAgc2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZSgpLAotICAgICAgc2VsZWN0ZWRDb21wb25lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCi0gICAgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IoY29tcG9uZW50LCBzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lKCkpOwotICAgIFJlbmFtZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nKHByb2Nlc3Nvcik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgUmVmYWN0b3JpbmdXaXphcmQgd2l6YXJkID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkKAotICAgICAgICByZWZhY3RvcmluZywKLSAgICAgICAgUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVDb21wb25lbnRXaXphcmRfZGVmYXVsdFBhZ2VUaXRsZSwKLSAgICAgICAgUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVDb21wb25lbnRXaXphcmRfaW5wdXRQYWdlX2Rlc2NyaXB0aW9uLAotICAgICAgICBudWxsKTsKLSAgICAgIFJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbiBvcCA9IG5ldyBSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24od2l6YXJkKTsKLSAgICAgIG9wLnJ1bihYU0RFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgd2l6YXJkLmdldERlZmF1bHRQYWdlVGl0bGUoKSk7Ci0KLSAgICB9Ci0gICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gZG8gbm90aGluZy4gVXNlciBhY3Rpb24gZ290IGNhbmNlbGVkCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzhiMDEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVJlZmFjdG9yTWVudS5sYWJlbD1SZWZhY3RvcgotUmVmYWN0b3JBY3Rpb25Hcm91cC5ub19yZWZhY3RvcmluZ19hdmFpbGFibGU9PG5vIHJlZmFjdG9yaW5nIGF2YWlsYWJsZT4KLQotUmVuYW1lQWN0aW9uLnJlbmFtZT1SZW5hbWUKLVJlbmFtZUFjdGlvbi51bmF2YWlsYWJsZT1PcGVyYXRpb24gdW5hdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuU2VsZWN0IGEgLi4uLgotUmVuYW1lQWN0aW9uLnRleHQ9UmUmbmFtZS4uLgotCi1SZW5hbWVJbnB1dFdpemFyZFBhZ2UubmV3X25hbWU9ICZOZXcgbmFtZToKLVJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkLmludGVybmFsX2Vycm9yPSBJbnRlcm5hbCBlcnJvciBkdXJpbmcgbmFtZSBjaGVja2luZzogezB9Ci0KLQotUmVuYW1lWFNERWxlbWVudEFjdGlvbi5leGNlcHRpb249VW5leHBlY3RlZCBleGNlcHRpb24gb2NjdXJyZWQuIFNlZSBsb2cgZm9yIGRldGFpbHMKLVJlbmFtZVhTREVsZW1lbnRBY3Rpb24ubm90X2F2YWlsYWJsZT1PcGVyYXRpb24gdW5hdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuU2VsZWN0IGEgWFNEIHByb2plY3QsIGZvbGRlciwgcmVzb3VyY2UsIGZpbGUsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMsICBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbnMsIGNvbXBsZXggdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMsIGlkZW50aXR5IGNvbnN0cmFpbnQgZGVmaW5pdGlvbnMsIG1vZGVsIGdyb3VwcyBkZWZpbml0aW9ucywgbm90YXRpb24gZGVjbGFyYXRpb25zLCBvciBzaW1wbGUgdHlwZSBkZWZpbml0aW9ucy4KLVJlbmFtZVhTREVsZW1lbnRBY3Rpb24ubmFtZT1SZW5hbWUKLQotCi1SZW5hbWVTdXBwb3J0LmRpYWxvZy50aXRsZT1SZW5hbWUKLVJlbmFtZVN1cHBvcnQubm90X2F2YWlsYWJsZT1SZW5hbWUgc3VwcG9ydCBub3QgYXZhaWxhYmxlCi0KLVJlbmFtZUNvbXBvbmVudFdpemFyZC5kZWZhdWx0UGFnZVRpdGxlPVJlbmFtZSB3aXphcmQKLVJlbmFtZUNvbXBvbmVudFdpemFyZC5pbnB1dFBhZ2UuZGVzY3JpcHRpb249UmVuYW1lIFhNTCBTY2hlbWEgY29tcG9uZW50Ci0KLVJlbmFtZUlucHV0V2l6YXJkUGFnZS51cGRhdGVfcmVmZXJlbmNlcz1VcGRhdGUgcmVmZXJlbmNlcwotWFNEQ29tcG9uZW50UmVuYW1lQ2hhbmdlLm5hbWU9WE1MIFNjaGVtYSBjb21wb25lbnQgcmVuYW1pbmcgaW4gezB9OiB7MX0gdG8gezJ9Ci1YU0RDb21wb25lbnRSZW5hbWVDaGFuZ2UuUmVuYW1pbmc9UmVuYW1pbmcuLi4KLVJlc291cmNlUmVuYW1lUGFydGljaXBhbnQuY29tcG9zaXRlQ2hhbmdlTmFtZT1YU0QgZmlsZSByZW5hbWUgcmVmZXJlbmNlcyB1cGRhdGluZyBjaGFuZ2VzCi1SZW5hbWVSZXNvdXJjZUNoYW5nZS5yZW5hbWVfcmVzb3VyY2VfcmVmZXJlbmNlX2NoYW5nZT1SZW5hbWluZyByZXNvdXJjZSBuYW1lIHJlZmVyZW5jZXMKLVhTRFJlbmFtZVJlc291cmNlQ2hhbmdlLm5hbWU9UmVzb3VyY2UgcmVuYW1lOiB7MH0gdG8gezF9Ci1SZW5hbWVSZXNvdXJjZVJlZmFjdG9yaW5nLkludGVybmFsX0Vycm9yPUludGVybmFsIGVycm9yCi1SZW5hbWVSZXNvdXJjZVJlZmFjdG9yaW5nLmFscmVhZF9leGlzdHM9UmVzb3VyY2UgYWxyZWFkeSBleGlzdAotUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZy5pbnZhbGlkTmFtZT1JbnZhbGlkIHJlc291cmNlIG5hbWUKLVJlbmFtZVJlc291cmNlUHJvY2Vzc29yLm5hbWU9UmVzb3VyY2UgcmVuYW1pbmcKLU1ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb24udGV4dD1NYWtlICZMb2NhbCBFbGVtZW50IEdsb2JhbAotWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXM9WE1MIFNjaGVtYSByZWZhY3RvcmluZyBjaGFuZ2VzCi1XU0RMQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXM9V1NETCByZWZhY3RvcmluZyBjaGFuZ2VzCi1SZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXM9Q29tcG9uZW50IG5hbWUgcmVmYWN0b3JpbmcgY2hhbmdlcwotUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVfZGVjbGF0YXRpb249VXBkYXRlIGNvbXBvbmVudCBkZWNsYXJhdGlvbi9kZWZpbml0aW9uCi1SZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9yZWZlcmVuY2U9VXBkYXRlIGNvbXBvbmVudCByZWZlcmVuY2UKLVhTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LnhzZF9jb21wb25lbnRfcmVuYW1lX3BhcnRpY2lwYW50PVhTRCBjb21wb25lbnQgcmVuYW1lIHBhcnRpY2lwYW50Ci1XU0RMQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQud3NkbF9jb21wb25lbnRfcmVuYW1lX3BhcnRpY2lwYW50PVdTREwgY29tcG9uZW50IHJlbmFtZSBwYXJ0aWNpcGFudAotUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudC5GaWxlX1JlbmFtZV91cGRhdGVfcmVmZXJlbmNlPUZpbGUgcmVuYW1lIHJlZmFjdG9yaW5nIGNoYW5nZXMKLVJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nX2NoZWNraW5nPUNoZWNraW5nLi4uCi1SZW5hbWVDb21wb25lbnRSZWZhY3RvcmluZ19zZWFyY2hpbmc9U2VhcmNoaW5nLi4uCi1DaGVja3NfQ2hvb3NlX25hbWU9SW52YWxpZCBuYW1lCi1SZW5hbWVDb21wb25lbnRSZWZhY3RvcmluZ19hbm90aGVyX25hbWU9TmFtZSBhbHJlYWR5IHVzZWQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL0NvbXBvbmVudFJlbmFtZUFyZ3VtZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRmM2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuVGV4dENoYW5nZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRSZW5hbWVBcmd1bWVudHMgZXh0ZW5kcyBSZW5hbWVBcmd1bWVudHMgewotCQotCVRleHRDaGFuZ2VNYW5hZ2VyIGNoYW5nZU1hbmFnZXI7Ci0JTWFwIG1hdGNoZXM7Ci0JU3RyaW5nIHF1YWxpZmllcjsKLQotCXB1YmxpYyBDb21wb25lbnRSZW5hbWVBcmd1bWVudHMoU3RyaW5nIG5ld05hbWUsIGJvb2xlYW4gdXBkYXRlUmVmZXJlbmNlcykgewotCQlzdXBlcihuZXdOYW1lLCB1cGRhdGVSZWZlcmVuY2VzKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dENoYW5nZU1hbmFnZXIgZ2V0Q2hhbmdlTWFuYWdlcigpIHsKLQkJcmV0dXJuIGNoYW5nZU1hbmFnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlTWFuYWdlcihUZXh0Q2hhbmdlTWFuYWdlciBjaGFuZ2VNYW5hZ2VyKSB7Ci0JCXRoaXMuY2hhbmdlTWFuYWdlciA9IGNoYW5nZU1hbmFnZXI7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRNYXRjaGVzKCkgewotCQlyZXR1cm4gbWF0Y2hlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXRjaGVzKE1hcCBtYXRjaGVzKSB7Ci0JCXRoaXMubWF0Y2hlcyA9IG1hdGNoZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZXIoKSB7Ci0JCXJldHVybiBxdWFsaWZpZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UXVhbGlmaWVyKFN0cmluZyBxdWFsaWZpZXIpIHsKLQkJdGhpcy5xdWFsaWZpZXIgPSBxdWFsaWZpZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5ZDRmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLS8vaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5QYXJ0aWNpcGFudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZUFyZ3VtZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuU2hhcmFibGVQYXJ0aWNpcGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWxlY3Rpb25TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLldvcmtzcGFjZVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gudXRpbC5Db2xsZWN0aW5nU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5DaGVja3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5JTmFtZVVwZGF0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuSVJlZmVyZW5jZVVwZGF0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuVGV4dENoYW5nZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci51dGlsLlRleHRDaGFuZ2VDb21wYXRpYmlsaXR5OwotCi0KLQotcHVibGljIGNsYXNzIFJlbmFtZUNvbXBvbmVudFByb2Nlc3NvciBleHRlbmRzIFJlbmFtZVByb2Nlc3NvciBpbXBsZW1lbnRzIElOYW1lVXBkYXRpbmcsIElSZWZlcmVuY2VVcGRhdGluZyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJRklFUiA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnJlZmFjdG9yLnJlbmFtZUNvbXBvbmVudFByb2Nlc3NvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGJvb2xlYW4gc2luZ2xlRmlsZU9ubHkgPSBmYWxzZTsKLSAgICAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBxdW90ZVN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJdmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZTsKLQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmICghdmFsdWUuc3RhcnRzV2l0aCgiXCIiKSkgewotCQkJc2IuYXBwZW5kKCJcIiIpOwotCQl9Ci0JCXNiLmFwcGVuZCh2YWx1ZSk7Ci0JCWlmICghdmFsdWUuZW5kc1dpdGgoIlwiIikpIHsKLQkJCXNiLmFwcGVuZCgiXCIiKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFRleHRDaGFuZ2VNYW5hZ2VyIGNoYW5nZU1hbmFnZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBuZXdOYW1lOwotCi0JcHJpdmF0ZSBSZWZhY3RvcmluZ0NvbXBvbmVudCBzZWxlY3RlZENvbXBvbmVudDsKLQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVSZWZlcmVuY2VzID0gdHJ1ZTsKLQotCXByaXZhdGUgTWFwIHJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIFJlbmFtZUNvbXBvbmVudFByb2Nlc3NvcihSZWZhY3RvcmluZ0NvbXBvbmVudCBzZWxlY3RlZENvbXBvbmVudCkgewotCQl0aGlzLnNlbGVjdGVkQ29tcG9uZW50ID0gc2VsZWN0ZWRDb21wb25lbnQ7Ci0JfQotCi0JcHVibGljIFJlbmFtZUNvbXBvbmVudFByb2Nlc3NvcihSZWZhY3RvcmluZ0NvbXBvbmVudCBzZWxlY3RlZENvbXBvbmVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcyhzZWxlY3RlZENvbXBvbmVudCwgbmV3TmFtZSwgZmFsc2UpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yKFJlZmFjdG9yaW5nQ29tcG9uZW50IHNlbGVjdGVkQ29tcG9uZW50LCBTdHJpbmcgbmV3TmFtZSwgYm9vbGVhbiBzaW5nbGVGaWxlT25seSkgewotICAgICAgICB0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotICAgICAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50ID0gc2VsZWN0ZWRDb21wb25lbnQ7Ci0gICAgICAgIHRoaXMuc2luZ2xlRmlsZU9ubHkgPSBzaW5nbGVGaWxlT25seTsKLSAgICB9ICAgIAotCi0JcHJpdmF0ZSB2b2lkIGFkZERlY2xhcmF0aW9uVXBkYXRlKFRleHRDaGFuZ2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVTdHIgPSBzZWxlY3RlZENvbXBvbmVudC5nZXRFbGVtZW50KCkuZ2V0TW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKTsKLQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyKSk7Ci0JCWFkZERlY2xhcmF0aW9uVXBkYXRlKG1hbmFnZXIsIGZpbGUpOwotCX0KLQotCWZpbmFsIHZvaWQgYWRkRGVjbGFyYXRpb25VcGRhdGUoVGV4dENoYW5nZU1hbmFnZXIgbWFuYWdlciwgSUZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCVN0cmluZyBjb21wb25lbnROYW1lID0gc2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotCQlTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlID0gc2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCVF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lID0gbmV3IFF1YWxpZmllZE5hbWUoY29tcG9uZW50TmFtZXNwYWNlLCBjb21wb25lbnROYW1lKTsKLQkJUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUgPSBzZWxlY3RlZENvbXBvbmVudC5nZXRUeXBlUU5hbWUoKTsKLQotCi0KLQkJU2VhcmNoU2NvcGUgc2NvcGUgPSBuZXcgV29ya3NwYWNlU2VhcmNoU2NvcGUoKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJc2NvcGUgPSBuZXcgU2VsZWN0aW9uU2VhcmNoU2NvcGUobmV3IElSZXNvdXJjZVtde2ZpbGV9KTsKLQkJfQotCQlDb2xsZWN0aW5nU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb2xsZWN0aW5nU2VhcmNoUmVxdWVzdG9yKCk7Ci0JCVNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4oZmlsZSwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUpOwotCQlTZWFyY2hFbmdpbmUgc2VhcmNoRW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotICAgICAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGlmIChzaW5nbGVGaWxlT25seSkKLSAgICAgICAgewotICAgICAgICAgIG1hcC5wdXQoInNlYXJjaERpcnR5Q29udGVudCIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIH0gIAotCQlzZWFyY2hFbmdpbmUuc2VhcmNoKHBhdHRlcm4sIHJlcXVlc3Rvciwgc2NvcGUsIG1hcCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCUxpc3QgcmVzdWx0cyA9IHJlcXVlc3Rvci5nZXRSZXN1bHRzKCk7Ci0JCQotCQkvLyBtb3JlIHRoYW4gb25lIGRlY2xhcmF0aW9uIGZvdW5kLCBzbyB1c2Ugb2Zmc2V0IGFzIGFkZGl0aW9uYWwgY2hlY2sKLQkJUG9zaXRpb24gb2Zmc2V0UG9zaXRpb24gPSBudWxsOwotCQlpZiAocmVzdWx0cy5zaXplKCkgPiAxKSB7Ci0JCSAgICBJRE9NRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0JCSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJICAgIAlpbnQgc3RhcnRPZmZzZXQgPSBzZWxlY3RlZEVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJICAgIAlvZmZzZXRQb3NpdGlvbiA9IG5ldyBQb3NpdGlvbihzdGFydE9mZnNldCwgKHNlbGVjdGVkRWxlbWVudC5nZXRFbmRPZmZzZXQoKSAtIHN0YXJ0T2Zmc2V0KSk7Ci0JCSAgICB9Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc3VsdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTZWFyY2hNYXRjaCBtYXRjaCA9IChTZWFyY2hNYXRjaCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobWF0Y2ggIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gYWRkVGV4dENoYW5nZSA9IHRydWU7Ci0JCQkJLy8gYWRkaXRpb25hbCBjaGVjayB0byB2ZXJpZnkgY29ycmVjdCBkZWNsYXJhdGlvbiBpcyBjaGFuZ2VkCi0JCQkJaWYgKG9mZnNldFBvc2l0aW9uICE9IG51bGwpIHsKLQkJCQkJYWRkVGV4dENoYW5nZSA9IG9mZnNldFBvc2l0aW9uLm92ZXJsYXBzV2l0aChtYXRjaC5nZXRPZmZzZXQoKSwgbWF0Y2guZ2V0TGVuZ3RoKCkpOyAgCi0JCQkJfQotCQkJCWlmIChhZGRUZXh0Q2hhbmdlKSB7Ci0JCQkJCVRleHRDaGFuZ2UgdGV4dENoYW5nZSA9IG1hbmFnZXIuZ2V0KG1hdGNoLmdldEZpbGUoKSk7Ci0JCQkJCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3RWxlbWVudE5hbWUoKTsKLQkJCQkJbmV3TmFtZSA9IHF1b3RlU3RyaW5nKG5ld05hbWUpOwotCQotCQkJCQlSZXBsYWNlRWRpdCByZXBsYWNlRWRpdCA9IG5ldyBSZXBsYWNlRWRpdChtYXRjaC5nZXRPZmZzZXQoKSwgbWF0Y2guZ2V0TGVuZ3RoKCksIG5ld05hbWUpOwotCQkJCQlTdHJpbmcgZWRpdE5hbWUgPSBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVfZGVjbGF0YXRpb24iKTsKLQkJCQkJVGV4dENoYW5nZUNvbXBhdGliaWxpdHkuYWRkVGV4dEVkaXQodGV4dENoYW5nZSwgZWRpdE5hbWUsIHJlcGxhY2VFZGl0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIGFkZE9jY3VycmVuY2VzKFRleHRDaGFuZ2VNYW5hZ2VyIG1hbmFnZXIsIElQcm9ncmVzc01vbml0b3IgcG0sIFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCVN0cmluZyBmaWxlU3RyID0gc2VsZWN0ZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpLmdldE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZmlsZVN0cikpOwotCi0JCVN0cmluZyBjb21wb25lbnROYW1lID0gc2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotCQlTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlID0gc2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCVF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lID0gbmV3IFF1YWxpZmllZE5hbWUoY29tcG9uZW50TmFtZXNwYWNlLCBjb21wb25lbnROYW1lKTsKLQkJUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUgPSBzZWxlY3RlZENvbXBvbmVudC5nZXRUeXBlUU5hbWUoKTsKLQotCQlTZWFyY2hFbmdpbmUgc2VhcmNoRW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotICAgICAgICBTZWFyY2hTY29wZSBzY29wZSA9IG51bGw7Ci0gICAgICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgaWYgKHNpbmdsZUZpbGVPbmx5KQotICAgICAgICB7Ci0gICAgICAgICAgbWFwLnB1dCgic2VhcmNoRGlydHlDb250ZW50IiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICBzY29wZSA9IG5ldyBTZWxlY3Rpb25TZWFyY2hTY29wZShuZXcgSVJlc291cmNlW117ZmlsZX0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAgCi0gICAgICAgICAgc2NvcGUgPSBuZXcgV29ya3NwYWNlU2VhcmNoU2NvcGUoKTsKLSAgICAgICAgfSAKLQkJU29ydGluZ1NlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgU29ydGluZ1NlYXJjaFJlcXVlc3RvcigpOwotCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0gICAgICAgIAotCQlzZWFyY2hFbmdpbmUuc2VhcmNoKHBhdHRlcm4sIHJlcXVlc3Rvciwgc2NvcGUsIG1hcCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXJlZmVyZW5jZXMgPSByZXF1ZXN0b3IuZ2V0UmVzdWx0cygpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBTZWFyY2hNYXRjaCBtYXRjaCA9IChTZWFyY2hNYXRjaCkgaXRlci5uZXh0KCk7Ci0KLQkJLy8gVGV4dENoYW5nZSB0ZXh0Q2hhbmdlID0gbWFuYWdlci5nZXQobWF0Y2guZ2V0RmlsZSgpKTsKLQkJLy8gU3RyaW5nIG5ld05hbWUgPSBnZXROZXdFbGVtZW50TmFtZSgpOwotCQkvLyBpZihtYXRjaC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpewotCQkvLyBOb2RlIG5vZGUgPSAoTm9kZSltYXRjaC5nZXRPYmplY3QoKTsKLQkJLy8gaWYobm9kZSBpbnN0YW5jZW9mIElET01BdHRyKXsKLQkJLy8gSURPTUF0dHIgYXR0ciA9IChJRE9NQXR0cilub2RlOwotCQkvLyBJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KWF0dHIuZ2V0T3duZXJFbGVtZW50KCkgOwotCQkvLyBuZXdOYW1lID0gZ2V0TmV3UU5hbWUoZWxlbWVudCwgY29tcG9uZW50TmFtZXNwYWNlLCBuZXdOYW1lKTsKLQkJLy8gfQotCQkvLyBuZXdOYW1lID0gcXVvdGVTdHJpbmcobmV3TmFtZSk7Ci0JCS8vIH0KLQkJLy8JCQkJCi0JCS8vIFJlcGxhY2VFZGl0IHJlcGxhY2VFZGl0ID0gbmV3IFJlcGxhY2VFZGl0KG1hdGNoLmdldE9mZnNldCgpLAotCQkvLyBtYXRjaC5nZXRMZW5ndGgoKSwgbmV3TmFtZSApOwotCQkvLyBTdHJpbmcgZWRpdE5hbWUgPQotCQkvLyBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVfcmVmZXJlbmNlIik7Ci0JCS8vIFRleHRDaGFuZ2VDb21wYXRpYmlsaXR5LmFkZFRleHRFZGl0KHRleHRDaGFuZ2UsIGVkaXROYW1lLAotCQkvLyByZXBsYWNlRWRpdCk7Ci0KLQkJLy8gfQotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSVRleHRVcGRhdGluZyNjYW5FbmFibGVUZXh0VXBkYXRpbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkVuYWJsZVRleHRVcGRhdGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRW5hYmxlVXBkYXRlUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNjaGVja0ZpbmFsQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0ZpbmFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChtb25pdG9yKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZXh0KTsKLQkJZmluYWwgUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzID0gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMik7IC8vJE5PTi1OTFMtMSQKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nX2NoZWNraW5nIikpOyAvLyROT04tTkxTLTEkCi0JCQlzdGF0dXMubWVyZ2UoY2hlY2tOZXdFbGVtZW50TmFtZShnZXROZXdFbGVtZW50TmFtZSgpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nX3NlYXJjaGluZyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RhdHVzLm1lcmdlKGNyZWF0ZVJlbmFtZUNoYW5nZXMobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NoZWNrSW5pdGlhbENvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrSW5pdGlhbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBhZGQgY29kZSB0byBjaGVjayBpbml0aWFsIGNvbmRpdGlvbnMgZm9yIGNvbXBvbmVudCByZW5hbWUKLQkJQXNzZXJ0LmlzTm90TnVsbChwbSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBmaW5hbCBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja05ld0VsZW1lbnROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobmFtZSk7Ci0JCWZpbmFsIFJlZmFjdG9yaW5nU3RhdHVzIHJlc3VsdCA9IENoZWNrcy5jaGVja05hbWUobmFtZSk7Ci0JCXJlc3VsdC5tZXJnZShDaGVja3MuY2hlY2tDb21wb25lbnROYW1lKG5hbWUpKTsKLQkJaWYgKENoZWNrcy5pc0FscmVhZHlOYW1lZChzZWxlY3RlZENvbXBvbmVudCwgbmFtZSkpCi0JCQlyZXN1bHQuYWRkRmF0YWxFcnJvcihSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UmVmYWN0b3JpbmdfYW5vdGhlcl9uYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBjb21wdXRlRGVyaXZlZEVsZW1lbnRzKCkgewotCi0JCU9iamVjdFtdIGVsZW1lbnRzID0gZ2V0RWxlbWVudHMoKTsKLQkJLy8gT2JqZWN0W10gcmVzdWx0cyA9IG5ldyBPYmplY3RbZWxlbWVudHMubGVuZ3RoXTsKLQkJLy8gZm9yKGludCBpPTA7IGk8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKXsKLQkJLy8gUmVmYWN0b3JpbmdDb21wb25lbnQgY29tcG9uZW50ID0gKFJlZmFjdG9yaW5nQ29tcG9uZW50KWVsZW1lbnRzW2ldOwotCQkvLyByZXN1bHRzW2ldID0gY29tcG9uZW50LmdldEFkYXB0ZWUoKTsKLQkJLy8JCQkKLQkJLy8gfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gZG9uJ3QgY3JlYXRlIGFueSBjaGFuZ2Ugbm93LCBhbGwgdGhlIGNoYW5nZXMgYXJlIGluIGNoYW5nZU1hbmdlcgotCQkvLyB2YXJpYWJsZSBhbmQgd2lsbCBiZSBjb21iaW5lZCBpbiBwb3N0Q3JlYXRlQ2hhbmdlIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFRleHRDaGFuZ2VNYW5hZ2VyIHVwZGF0ZUNoYW5nZU1hbmFnZXIoSVByb2dyZXNzTW9uaXRvciBwbSwgUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRleHRDaGFuZ2VNYW5hZ2VyIG1hbmFnZXIgPSBnZXRDaGFuZ2VNYW5hZ2VyKCk7Ci0JCS8vIG9ubHkgb25lIGRlY2xhcmF0aW9uIGdldHMgdXBkYXRlZAotCQlhZGREZWNsYXJhdGlvblVwZGF0ZShtYW5hZ2VyKTsKLQkJaWYgKGdldFVwZGF0ZVJlZmVyZW5jZXMoKSkgewotCQkJYWRkT2NjdXJyZW5jZXMobWFuYWdlciwgcG0sIHN0YXR1cyk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JcHJpdmF0ZSBSZWZhY3RvcmluZ1N0YXR1cyBjcmVhdGVSZW5hbWVDaGFuZ2VzKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKG1vbml0b3IpOwotCQlmaW5hbCBSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMgPSBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRSZWZhY3RvcmluZ19zZWFyY2hpbmciKSwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCXVwZGF0ZUNoYW5nZU1hbmFnZXIobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSwgc3RhdHVzKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIFRleHRDaGFuZ2VNYW5hZ2VyIGdldENoYW5nZU1hbmFnZXIoKSB7Ci0KLQkJaWYgKGNoYW5nZU1hbmFnZXIgPT0gbnVsbCkgewotCQkJY2hhbmdlTWFuYWdlciA9IG5ldyBUZXh0Q2hhbmdlTWFuYWdlcihmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZU1hbmFnZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLmludGVybmFsLnJlZmFjdG9yaW5nLnJlbmFtZS5YU0RSZW5hbWVQcm9jZXNzb3IjZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE86IGZpbmQgcHJvamVjdCBuYXR1cmVzIG9mIHRoZSBmaWxlcyB0aGF0IGFyZSBnb2luZyB0byBiZQotCQkvLyByZWZhY3RvcmVkCi0JCXJldHVybiBuZXcgU3RyaW5nW117Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUifTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3JpbmcudGFnZ2luZy5JVGV4dFVwZGF0aW5nI2dldEN1cnJlbnRFbGVtZW50TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50RWxlbWVudE5hbWUoKSB7Ci0JCS8vCi0JCXJldHVybiBzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lKCk7Ci0JfQotCi0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2dldEVsZW1lbnRzKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoKSB7Ci0JCU9iamVjdCBtb2RlbCA9IHNlbGVjdGVkQ29tcG9uZW50LmdldE1vZGVsT2JqZWN0KCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtde21vZGVsfTsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNnZXRJZGVudGlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBJREVOVElGSUVSOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmV3RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBuZXdOYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2dldFByb2Nlc3Nvck5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc29yTmFtZSgpIHsKLQkJcmV0dXJuIFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKCJSZW5hbWVDb21wb25lbnRSZWZhY3RvcmluZy5uYW1lIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgU3RyaW5nW117c2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiOiIgKyBzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lKCksIG5ld05hbWV9KTsKLQotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gZ2V0VXBkYXRlUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIHVwZGF0ZVJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjaXNBcHBsaWNhYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChzZWxlY3RlZENvbXBvbmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBUT0RPIGltcGxlbWVudCBpc0FwcGxpY2FibGUgbG9naWMgZm9yIHRoZSBuYW1lZCBjb21wb25lbnQsCi0JCS8vIHZlcmlmeSBob3cgaXQgaXMgZGlmZmVyZW50IGZyb20gb3RoZXIgY29uZGl0aW9uIGNoZWNrcwotCQkvLyBpZiAoZk5hbWVkQ29tcG9uZW50LmlzQW5vbnltb3VzKCkpCi0JCS8vIHJldHVybiBmYWxzZTsKLQkJLy8gaWYgKCEgQ2hlY2tzLmlzQXZhaWxhYmxlKGZUeXBlKSkKLQkJLy8gcmV0dXJuIGZhbHNlOwotCQkvLyBpZiAoaXNTcGVjaWFsQ2FzZShmVHlwZSkpCi0JCS8vIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLCBMaXN0IHJlc3VsdCwgT2JqZWN0W10gZGVyaXZlZEVsZW1lbnRzLCBDb21wb25lbnRSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzLCBTdHJpbmdbXSBuYXR1cmVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRlcml2ZWRFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcml2ZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCVJlbmFtZVBhcnRpY2lwYW50W10gcGFydGljaXBhbnRzID0gUGFydGljaXBhbnRNYW5hZ2VyLmxvYWRSZW5hbWVQYXJ0aWNpcGFudHMoc3RhdHVzLCB0aGlzLCBkZXJpdmVkRWxlbWVudHNbaV0sIGFyZ3VtZW50cywgbmF0dXJlcywgc2hhcmVkKTsKLQkJCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QocGFydGljaXBhbnRzKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC5pbnRlcm5hbC5yZWZhY3RvcmluZy5yZW5hbWUuWFNEUmVuYW1lUHJvY2Vzc29yI2xvYWREZXJpdmVkUGFydGljaXBhbnRzKG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzLAotCSAqICAgICAgamF2YS51dGlsLkxpc3QsIGphdmEubGFuZy5TdHJpbmdbXSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5TaGFyYWJsZVBhcnRpY2lwYW50cykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsIExpc3QgcmVzdWx0LCBTdHJpbmdbXSBuYXR1cmVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cyA9IG5ldyBDb21wb25lbnRSZW5hbWVBcmd1bWVudHMoZ2V0TmV3RWxlbWVudE5hbWUoKSwgZ2V0VXBkYXRlUmVmZXJlbmNlcygpKTsKLQkJYXJndW1lbnRzLnNldE1hdGNoZXMocmVmZXJlbmNlcyk7Ci0JCWFyZ3VtZW50cy5zZXRRdWFsaWZpZXIoc2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQkvLyBwYXNzIGluIGNoYW5nZU1hbmdlciB0byB0aGUgcGFydGljaXBhbnRzIHNvIHRoYXQgaXQgY2FuIGNvbGxlY3QgYWxsCi0JCS8vIGNoYW5nZXMvcGVyIGZpbGVzCi0JCWFyZ3VtZW50cy5zZXRDaGFuZ2VNYW5hZ2VyKGdldENoYW5nZU1hbmFnZXIoKSk7Ci0JCWxvYWREZXJpdmVkUGFydGljaXBhbnRzKHN0YXR1cywgcmVzdWx0LCBjb21wdXRlRGVyaXZlZEVsZW1lbnRzKCksIGFyZ3VtZW50cywgbmF0dXJlcywgc2hhcmVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRWxlbWVudFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsIExpc3QgcmVzdWx0LCBSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzLCBTdHJpbmdbXSBuYXR1cmVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJT2JqZWN0W10gZWxlbWVudHMgPSBuZXcgT2JqZWN0WzBdOy8vIGdldEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChQYXJ0aWNpcGFudE1hbmFnZXIubG9hZFJlbmFtZVBhcnRpY2lwYW50cyhzdGF0dXMsIHRoaXMsIGVsZW1lbnRzW2ldLCBhcmd1bWVudHMsIG5hdHVyZXMsIHNoYXJlZCkpKTsKLQkJfQotCX0KLQotCi0JcHVibGljIGZpbmFsIFJlZmFjdG9yaW5nUGFydGljaXBhbnRbXSBsb2FkUGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkUGFydGljaXBhbnRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHMgPSBuZXcgUmVuYW1lQXJndW1lbnRzKGdldE5ld0VsZW1lbnROYW1lKCksIGdldFVwZGF0ZVJlZmVyZW5jZXMoKSk7Ci0JCVN0cmluZ1tdIG5hdHVyZXMgPSBnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsb2FkRWxlbWVudFBhcnRpY2lwYW50cyhzdGF0dXMsIHJlc3VsdCwgYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWRQYXJ0aWNpcGFudHMpOwotCQlsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhzdGF0dXMsIHJlc3VsdCwgbmF0dXJlcywgc2hhcmVkUGFydGljaXBhbnRzKTsKLQkJZm9yIChJdGVyYXRvciBpID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpLm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQpIHsKLQkJCQlYTUxDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCBwID0gKFhNTENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50KSBvOwotCQkJCS8vIGdldENoYW5nZU1hbmFnZXIoKQotCQkJCXAuc2V0Q2hhbmdlTWFuYWdlcihnZXRDaGFuZ2VNYW5hZ2VyKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChSZWZhY3RvcmluZ1BhcnRpY2lwYW50W10pIHJlc3VsdC50b0FycmF5KG5ldyBSZWZhY3RvcmluZ1BhcnRpY2lwYW50W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdFbGVtZW50TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5ld05hbWUpOwotCQl0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZVJlZmVyZW5jZXMoYm9vbGVhbiB1cGRhdGUpIHsKLQkJdXBkYXRlUmVmZXJlbmNlcyA9IHVwZGF0ZTsKLQotCX0KLQotCXB1YmxpYyBDaGFuZ2UgcG9zdENyZWF0ZUNoYW5nZShDaGFuZ2VbXSBwYXJ0aWNpcGFudENoYW5nZXMsIElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwocG0pOwotCQl0cnkgewotCQkJU3RyaW5nIGNoYW5nZU5hbWUgPSBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVzIik7Ci0JCQlUZXh0Q2hhbmdlW10gY2hhbmdlcyA9IGNoYW5nZU1hbmFnZXIuZ2V0QWxsQ2hhbmdlcygpOwotLy8JCQlDb21wYXJhdG9yIGMgPSBuZXcgQ29tcGFyYXRvcigpIHsKLS8vCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotLy8JCQkJCVRleHRGaWxlQ2hhbmdlIGMxID0gKFRleHRGaWxlQ2hhbmdlKSBvMTsKLS8vCQkJCQlUZXh0RmlsZUNoYW5nZSBjMiA9IChUZXh0RmlsZUNoYW5nZSkgbzI7Ci0vLwkJCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShjMS5nZXRGaWxlKCkuZ2V0RnVsbFBhdGgoKSwgYzIuZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCkpOwotLy8JCQkJfQotLy8JCQl9OwotCQkJaWYgKGNoYW5nZXMubGVuZ3RoID4gMCkgewotCQkJCS8vIEFycmF5cy5zb3J0KGNoYW5nZXMsIGMpOwotCQkJCUNvbXBvc2l0ZUNoYW5nZSBjb21wb3NpdGVDaGFuZ2UgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKCIhIiArIGNoYW5nZU5hbWUsIGNoYW5nZXMpOwotCQkJCWNvbXBvc2l0ZUNoYW5nZS5tYXJrQXNTeW50aGV0aWMoKTsKLQkJCQlyZXR1cm4gY29tcG9zaXRlQ2hhbmdlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxNzA4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZVJlc291cmNlUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSAgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlBhcnRpY2lwYW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlNoYXJhYmxlUGFydGljaXBhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuSU5hbWVVcGRhdGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBSZW5hbWVSZXNvdXJjZVByb2Nlc3NvciBleHRlbmRzIFJlbmFtZVByb2Nlc3NvciBpbXBsZW1lbnRzIElOYW1lVXBkYXRpbmcgewotCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZlJlc291cmNlOwotCXByaXZhdGUgU3RyaW5nIGZOZXdFbGVtZW50TmFtZTsKLQkJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJRklFUj0gIm9yZy5lY2xpcHNlLndzdC51aS54c2QucmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFJlbmFtZVJlc291cmNlUHJvY2Vzc29yKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlmUmVzb3VyY2U9IHJlc291cmNlOwotCQlpZiAoZlJlc291cmNlICE9IG51bGwpIHsKLQkJCXNldE5ld0VsZW1lbnROYW1lKGZSZXNvdXJjZS5nZXROYW1lKCkpOwotCQl9Ci0JfQotCi0JLy8tLS0tIElOYW1lVXBkYXRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCi0JcHVibGljIHZvaWQgc2V0TmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChuZXdOYW1lKTsKLQkJZk5ld0VsZW1lbnROYW1lPSBuZXdOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmV3RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBmTmV3RWxlbWVudE5hbWU7Ci0JfQotCQotCS8vLS0tLSBJUmVuYW1lUHJvY2Vzc29yIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIElERU5USUZJRVI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZSgpICB7Ci0JCWlmIChmUmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCEgZlJlc291cmNlLmV4aXN0cygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoISBmUmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpCQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsJCQkKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcm9jZXNzb3JOYW1lKCkgewotCQlTdHJpbmcgbWVzc2FnZT0gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRGb3JtYXR0ZWRTdHJpbmcoIlJlbmFtZVJlc291cmNlUHJvY2Vzc29yLm5hbWUiLCAvLyROT04tTkxTLTEkCi0JCQkJbmV3IFN0cmluZ1tde2dldEN1cnJlbnRFbGVtZW50TmFtZSgpLCBnZXROZXdFbGVtZW50TmFtZSgpfSk7Ci0JCXJldHVybiBtZXNzYWdlOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10ge2ZSZXNvdXJjZX07Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZlJlc291cmNlLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TmV3RWxlbWVudCgpIHsKLQkJCi0JCQkKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihjcmVhdGVOZXdQYXRoKGdldE5ld0VsZW1lbnROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRVcGRhdGVSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIFJlZmFjdG9yaW5nUGFydGljaXBhbnRbXSBsb2FkUGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzPSBnZXRFbGVtZW50cygpOwotCQlTdHJpbmdbXSBuYXR1cmVzPSBnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCk7Ci0JCUxpc3QgcmVzdWx0PSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHM9IG5ldyBSZW5hbWVBcmd1bWVudHMoZ2V0TmV3RWxlbWVudE5hbWUoKSwgZ2V0VXBkYXRlUmVmZXJlbmNlcygpKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoUGFydGljaXBhbnRNYW5hZ2VyLmxvYWRSZW5hbWVQYXJ0aWNpcGFudHMoc3RhdHVzLCAKLQkJCQl0aGlzLCBlbGVtZW50c1tpXSwKLQkJCQlhcmd1bWVudHMsIG5hdHVyZXMsIHNoYXJlZCkpKTsKLQkJfQotCQlyZXR1cm4gKFJlZmFjdG9yaW5nUGFydGljaXBhbnRbXSlyZXN1bHQudG9BcnJheShuZXcgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCQotCS8vLS0tIENvbmRpdGlvbiBjaGVja2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrSW5pdGlhbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCQotCS8qIG5vbiBqYXZhLWRvYwotCSAqIEBzZWUgSVJlbmFtZVJlZmFjdG9yaW5nI2NoZWNrTmV3TmFtZSgpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrTmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpICB7Ci0JCUFzc2VydC5pc05vdE51bGwobmV3TmFtZSwgIm5ldyBuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJSUNvbnRhaW5lciBjPSBmUmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCWlmIChjID09IG51bGwpCi0JCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlRmF0YWxFcnJvclN0YXR1cyhSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZy5JbnRlcm5hbF9FcnJvciIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCi0JCWlmIChjLmZpbmRNZW1iZXIobmV3TmFtZSkgIT0gbnVsbCkKLQkJCXJldHVybiBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGVGYXRhbEVycm9yU3RhdHVzKFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVSZXNvdXJjZVJlZmFjdG9yaW5nLmFscmVhZF9leGlzdHMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQlpZiAoIWMuZ2V0RnVsbFBhdGgoKS5pc1ZhbGlkU2VnbWVudChuZXdOYW1lKSkKLQkJCXJldHVybiBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGVGYXRhbEVycm9yU3RhdHVzKFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVSZXNvdXJjZVJlZmFjdG9yaW5nLmludmFsaWROYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCi0JCVJlZmFjdG9yaW5nU3RhdHVzIHJlc3VsdD0gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlKGMuZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVOYW1lKG5ld05hbWUsIGZSZXNvdXJjZS5nZXRUeXBlKCkpKTsKLQkJaWYgKCEgcmVzdWx0Lmhhc0ZhdGFsRXJyb3IoKSkKLQkJCXJlc3VsdC5tZXJnZShSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGUoYy5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZVBhdGgoY3JlYXRlTmV3UGF0aChuZXdOYW1lKSwgZlJlc291cmNlLmdldFR5cGUoKSkpKTsJCQotCQlyZXR1cm4gcmVzdWx0OwkJCi0JfQotCQotCS8qIG5vbiBqYXZhLWRvYwotCSAqIEBzZWUgUmVmYWN0b3JpbmcjY2hlY2tJbnB1dChJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0ZpbmFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpICB7Ci0JCXBtLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5ewotCQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCQl9IGZpbmFsbHl7Ci0JCQlwbS5kb25lKCk7Ci0JCX0JCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlTmV3UGF0aChTdHJpbmcgbmV3TmFtZSl7Ci0JCXJldHVybiBmUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKG5ld05hbWUpLnRvU3RyaW5nKCk7Ci0JfQotCQkKLQkvLy0tLSBjaGFuZ2VzIAotCQotCS8qIG5vbiBqYXZhLWRvYyAKLQkgKiBAc2VlIElSZWZhY3RvcmluZyNjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCXBtLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5ewotCQkJcmV0dXJuIG5ldyBSZXNvdXJjZVJlbmFtZUNoYW5nZShmUmVzb3VyY2UsIGdldE5ld0VsZW1lbnROYW1lKCkpOwotCQl9IGZpbmFsbHl7Ci0JCQlwbS5kb25lKCk7Ci0JCX0JCi0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZVRhcmdldE5hbWVzcGFjZVByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVUYXJnZXROYW1lc3BhY2VQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNkM2M4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZVRhcmdldE5hbWVzcGFjZVByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5QYXJ0aWNpcGFudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZUFyZ3VtZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuU2hhcmFibGVQYXJ0aWNpcGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5JTmFtZVVwZGF0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuSVJlZmVyZW5jZVVwZGF0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuVGV4dENoYW5nZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotCi1wdWJsaWMgY2xhc3MgUmVuYW1lVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yIGV4dGVuZHMgUmVuYW1lUHJvY2Vzc29yIGltcGxlbWVudHMgSU5hbWVVcGRhdGluZywgSVJlZmVyZW5jZVVwZGF0aW5nCi17Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3TmFtZXNwYWNlOwotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVSZWZlcmVuY2VzID0gdHJ1ZTsKLQlwcml2YXRlIFRleHRDaGFuZ2VNYW5hZ2VyIGNoYW5nZU1hbmFnZXI7Ci0JcHJpdmF0ZSBYU0RTY2hlbWEgbW9kZWw7Ci0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVIgPSAib3JnLmVjbGlwc2Uud3N0LnVpLnhzZC5yZW5hbWVDb21wb25lbnRQcm9jZXNzb3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgUmVuYW1lVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yKFhTRFNjaGVtYSBtb2RlbCwgU3RyaW5nIG5ld05hbWUpCi0JewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMubmV3TmFtZXNwYWNlID0gbmV3TmFtZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3JpbmcudGFnZ2luZy5JVGV4dFVwZGF0aW5nI2NhbkVuYWJsZVRleHRVcGRhdGluZygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRW5hYmxlVGV4dFVwZGF0aW5nKCkKLQl7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5yZWZhY3RvcmluZy50YWdnaW5nLklUZXh0VXBkYXRpbmcjZ2V0Q3VycmVudEVsZW1lbnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRFbGVtZW50TmFtZSgpCi0JewotCQkvLwotCQlyZXR1cm4gbW9kZWwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLmludGVybmFsLnJlZmFjdG9yaW5nLnJlbmFtZS5YU0RSZW5hbWVQcm9jZXNzb3IjZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJLy8gVE9ETzogZmluZCBwcm9qZWN0IG5hdHVyZXMgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlCi0JCS8vIHJlZmFjdG9yZWQKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSJ9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC5pbnRlcm5hbC5yZWZhY3RvcmluZy5yZW5hbWUuWFNEUmVuYW1lUHJvY2Vzc29yI2xvYWREZXJpdmVkUGFydGljaXBhbnRzKG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzLAotCSAqICAgICAgamF2YS51dGlsLkxpc3QsIGphdmEubGFuZy5TdHJpbmdbXSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5TaGFyYWJsZVBhcnRpY2lwYW50cykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsCi0JCQlMaXN0IHJlc3VsdCwgU3RyaW5nW10gbmF0dXJlcywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyBuZXdDVU5hbWU9IGdldE5ld0VsZW1lbnROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJUmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cz0gbmV3IFJlbmFtZUFyZ3VtZW50cyhuZXdDVU5hbWUsIGdldFVwZGF0ZVJlZmVyZW5jZXMoKSk7Ci0JCWxvYWREZXJpdmVkUGFydGljaXBhbnRzKHN0YXR1cywgcmVzdWx0LCAKLQkJCWNvbXB1dGVEZXJpdmVkRWxlbWVudHMoKSwgYXJndW1lbnRzLCAKLQkJCSBuYXR1cmVzLCBzaGFyZWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsIExpc3QgcmVzdWx0LCBPYmplY3RbXSBkZXJpdmVkRWxlbWVudHMsIAotCQkJUmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cywgIFN0cmluZ1tdIG5hdHVyZXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZGVyaXZlZEVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBkZXJpdmVkRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlSZW5hbWVQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cz0gUGFydGljaXBhbnRNYW5hZ2VyLmxvYWRSZW5hbWVQYXJ0aWNpcGFudHMoc3RhdHVzLCAKLQkJCQkJdGhpcywgZGVyaXZlZEVsZW1lbnRzW2ldLCAKLQkJCQkJYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWQpOwotCQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYXJ0aWNpcGFudHMpKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3RbXSBjb21wdXRlRGVyaXZlZEVsZW1lbnRzKCkgewotCi0JCU9iamVjdFtdIGVsZW1lbnRzID0gZ2V0RWxlbWVudHMoKTsKLQkJT2JqZWN0W10gcmVzdWx0cyA9IG5ldyBPYmplY3RbZWxlbWVudHMubGVuZ3RoXTsKLQkJZm9yKGludCBpPTA7IGk8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKXsKLQkJCVJlZmFjdG9yaW5nQ29tcG9uZW50IGNvbXBvbmVudCA9IChSZWZhY3RvcmluZ0NvbXBvbmVudCllbGVtZW50c1tpXTsKLQkJCXJlc3VsdHNbaV0gPSBjb21wb25lbnQuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCQotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCQkKLQl9Ci0JCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNjaGVja0ZpbmFsQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0ZpbmFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLAotCQkJQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkJCU9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JewotCQl0cnkKLQkJewotCQkJUmVmYWN0b3JpbmdTdGF0dXMgcmVzdWx0ID0gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCQlwbS5iZWdpblRhc2soIiIsIDkpOyAvLyROT04tTkxTLTEkCi0JCQljaGFuZ2VNYW5hZ2VyID0gY3JlYXRlQ2hhbmdlTWFuYWdlcihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHBtLCAxKSwKLQkJCQkJcmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gZmluYWxseQotCQl7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQkJCi0KLQl9Ci0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNjaGVja0luaXRpYWxDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0luaXRpYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0pCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQl7Ci0JCS8vIFRPRE8gYWRkIGNvZGUgdG8gY2hlY2sgaW5pdGlhbCBjb25kaXRpb25zIGZvciBjb21wb25lbnQgcmVuYW1lCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sCi0JCQlPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCXsKLQkJdHJ5Ci0JCXsKLQkJCVN0cmluZyBjaGFuZ2VOYW1lID0gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlcyIpOwotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDaGFuZ2UoY2hhbmdlTmFtZSwgY2hhbmdlTWFuYWdlci5nZXRBbGxDaGFuZ2VzKCkpOwotCQl9IGZpbmFsbHkKLQkJewotCQkJcG0uZG9uZSgpOwotCQl9Ci0KLQkJLy8gQ2hhbmdlW10gY2hhbmdlcyA9IENvbXBvbmVudFJlbmFtZUNoYW5nZS5jcmVhdGVDaGFuZ2VzRm9yKAotCQkvLyB0aGlzLmZOYW1lZENvbXBvbmVudCwgZ2V0TmV3RWxlbWVudE5hbWUoKSk7Ci0JCS8vCi0JCS8vIGlmIChjaGFuZ2VzLmxlbmd0aCA+IDApCi0JCS8vIHsKLQkJLy8gQ29tcG9zaXRlQ2hhbmdlIG11bHRpQ2hhbmdlID0gbnVsbDsKLQkJLy8gbXVsdGlDaGFuZ2UgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKAotCQkvLyAiWFNEIGNvbXBvbmVudCByZW5hbWUgcGFydGljaXBhbnQgY2hhbmdlcyIsIGNoYW5nZXMpOyAvLyROT04tTkxTLTEkCi0JCS8vIFRPRE86IGV4dGVybmFsaXplIHN0cmluZwotCQkvLyByZXR1cm4gbXVsdGlDaGFuZ2U7Ci0JCS8vIH0gZWxzZQotCQkvLyB7Ci0JCS8vCi0JCS8vIHJldHVybiBuZXcgQ29tcG9uZW50UmVuYW1lQ2hhbmdlKAotCQkvLyBmTmFtZWRDb21wb25lbnQsCi0JCS8vIGZOYW1lZENvbXBvbmVudC5nZXROYW1lKCksCi0JCS8vIGdldE5ld0VsZW1lbnROYW1lKCksCi0JCS8vIGZOYW1lZENvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0JCS8vIH0KLQkJCi0JCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2dldEVsZW1lbnRzKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoKQotCXsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IG1vZGVsIH07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0SWRlbnRpZmllcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkKLQl7Ci0JCXJldHVybiBJREVOVElGSUVSOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2dldFByb2Nlc3Nvck5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc29yTmFtZSgpCi0JewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRGb3JtYXR0ZWRTdHJpbmcoCi0JCQkJIlJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nLm5hbWUiLCAvLyROT04tTkxTLTEkCi0JCQkJbmV3IFN0cmluZ1tdCi0JCQkJewotCQkJCQkJZ2V0Q3VycmVudEVsZW1lbnROYW1lKCksCi0JCQkJCQlnZXROZXdFbGVtZW50TmFtZSgpIH0pOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjaXNBcHBsaWNhYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYgKGdldE1vZGVsKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gVE9ETyBpbXBsZW1lbnQgaXNBcHBsaWNhYmxlIGxvZ2ljIGZvciB0aGUgbmFtZWQgY29tcG9uZW50LAotCQkvLyB2ZXJpZnkgaG93IGl0IGlzIGRpZmZlcmVudCBmcm9tIG90aGVyIGNvbmRpdGlvbiBjaGVja3MKLQkJLy8gaWYgKGZOYW1lZENvbXBvbmVudC5pc0Fub255bW91cygpKQotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCS8vIGlmICghIENoZWNrcy5pc0F2YWlsYWJsZShmVHlwZSkpCi0JCS8vIHJldHVybiBmYWxzZTsKLQkJLy8gaWYgKGlzU3BlY2lhbENhc2UoZlR5cGUpKQotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5yZWZhY3RvcmluZy50YWdnaW5nLklOYW1lVXBkYXRpbmcjY2hlY2tOZXdFbGVtZW50TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja05ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJQXNzZXJ0LmlzTm90TnVsbChuZXdOYW1lLCAibmV3IG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBUT0RPOiBpbXBsZW1lbnQgbmV3IG5hbWUgY2hlY2tpbmcKLQkJLy8gUmVmYWN0b3JpbmdTdGF0dXMgcmVzdWx0ID0gQ2hlY2tzLmNoZWNrVHlwZU5hbWUobmV3TmFtZSk7Ci0JCS8vIGlmIChDaGVja3MuaXNBbHJlYWR5TmFtZWQoZlR5cGUsIG5ld05hbWUpKQotCQkvLyByZXN1bHQuYWRkRmF0YWxFcnJvcihSZWZhY3RvcmluZ0NvcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZVR5cGVSZWZhY3RvcmluZy5jaG9vc2VfYW5vdGhlcl9uYW1lIikpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtdIGxvYWRQYXJ0aWNpcGFudHMoCi0JCQlSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZFBhcnRpY2lwYW50cykKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzID0gbmV3IFJlbmFtZUFyZ3VtZW50cyhnZXROZXdFbGVtZW50TmFtZSgpLAotCQkJCXRydWUpOwotCQlTdHJpbmdbXSBuYXR1cmVzID0gZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbG9hZEVsZW1lbnRQYXJ0aWNpcGFudHMoc3RhdHVzLCByZXN1bHQsIGFyZ3VtZW50cywgbmF0dXJlcywKLQkJCQlzaGFyZWRQYXJ0aWNpcGFudHMpOwotCQlsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhzdGF0dXMsIHJlc3VsdCwgbmF0dXJlcywgc2hhcmVkUGFydGljaXBhbnRzKTsKLQkJcmV0dXJuIChSZWZhY3RvcmluZ1BhcnRpY2lwYW50W10pIHJlc3VsdAotCQkJCS50b0FycmF5KG5ldyBSZWZhY3RvcmluZ1BhcnRpY2lwYW50W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRWxlbWVudFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsCi0JCQlMaXN0IHJlc3VsdCwgUmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cywgU3RyaW5nW10gbmF0dXJlcywKLQkJCVNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gZ2V0RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJewotCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KFBhcnRpY2lwYW50TWFuYWdlcgotCQkJCQkubG9hZFJlbmFtZVBhcnRpY2lwYW50cyhzdGF0dXMsIHRoaXMsIGVsZW1lbnRzW2ldLAotCQkJCQkJCWFyZ3VtZW50cywgbmF0dXJlcywgc2hhcmVkKSkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgVGV4dENoYW5nZU1hbmFnZXIgY3JlYXRlQ2hhbmdlTWFuYWdlcihJUHJvZ3Jlc3NNb25pdG9yIHBtLAotCQkJUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJVGV4dENoYW5nZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBUZXh0Q2hhbmdlTWFuYWdlcihmYWxzZSk7Ci0JCS8vIG9ubHkgb25lIGRlY2xhcmF0aW9uIGdldHMgdXBkYXRlZAotCQlhZGREZWNsYXJhdGlvblVwZGF0ZShtYW5hZ2VyKTsKLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZERlY2xhcmF0aW9uVXBkYXRlKFRleHRDaGFuZ2VNYW5hZ2VyIG1hbmFnZXIpCi0KLQl7Ci0JCVN0cmluZyBmaWxlU3RyID0gZ2V0TW9kZWwoKS5nZXRTY2hlbWFMb2NhdGlvbigpOwotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZVN0cik7Ci0JCXRyeQotCQl7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTCh1cmkudG9TdHJpbmcoKSk7Ci0JCQl1cmwgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCk7Ci0JCQlpZih1cmwgIT0gbnVsbCl7Ci0JCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IHJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKHVybC5nZXRGaWxlKCkpKTsKLQkJCQlpZihmaWxlICE9IG51bGwgKXsKLQkJCQkJVGV4dENoYW5nZSBjaGFuZ2UgPSBtYW5hZ2VyLmdldChmaWxlKTsKLQkJCQkJYWRkRGVjbGFyYXRpb25VcGRhdGUoY2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQkKLQl9Ci0JCi0JCi0KLQlmaW5hbCB2b2lkIGFkZERlY2xhcmF0aW9uVXBkYXRlKFRleHRDaGFuZ2UgY2hhbmdlKSAKLQl7Ci0vLwkJU3RyaW5nIGVkaXROYW1lID0gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlX2RlY2xhdGF0aW9uIik7OwotLy8JICAKLS8vCQlOYW1lZENvbXBvbmVudFJlbmFtZXIgcmVuYW1lciA9IG5ldyBOYW1lZENvbXBvbmVudFJlbmFtZXIoCi0vLwkJCQlzZWxlY3RlZENvbXBvbmVudC5nZXRFbGVtZW50KCksIG5ld05hbWVzcGFjZSk7Ci0vLwkJcmVuYW1lci5yZW5hbWVDb21wb25lbnQoKTsKLS8vCQlMaXN0IHRleHRFZGl0cyA9IHJlbmFtZXIuZ2V0VGV4dEVkaXRzKCk7Ci0vLwkJZm9yIChpbnQgaiA9IDA7IGogPCB0ZXh0RWRpdHMuc2l6ZSgpOyBqKyspCi0vLwkJewotLy8JCQlSZXBsYWNlRWRpdCByZXBsYWNlRWRpdCA9IChSZXBsYWNlRWRpdCkgdGV4dEVkaXRzCi0vLwkJCQkJLmdldChqKTsKLS8vCQkJVGV4dENoYW5nZUNvbXBhdGliaWxpdHkuYWRkVGV4dEVkaXQoY2hhbmdlLAotLy8JCQkJCWVkaXROYW1lLCByZXBsYWNlRWRpdCk7Ci0vLwkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJdGhpcy5uZXdOYW1lc3BhY2UgPSBuZXdOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmV3RWxlbWVudE5hbWUoKQotCXsKLQkJcmV0dXJuIG5ld05hbWVzcGFjZTsKLQl9Ci0KLQkKLQotCXB1YmxpYyBib29sZWFuIGNhbkVuYWJsZVVwZGF0ZVJlZmVyZW5jZXMoKQotCXsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0VXBkYXRlUmVmZXJlbmNlcygpCi0JewotCQlyZXR1cm4gdXBkYXRlUmVmZXJlbmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVSZWZlcmVuY2VzKGJvb2xlYW4gdXBkYXRlKQotCXsKLQkJdXBkYXRlUmVmZXJlbmNlcyA9IHVwZGF0ZTsKLQkJCi0JfQotCi0JcHVibGljIGZpbmFsIFRleHRDaGFuZ2VNYW5hZ2VyIGdldENoYW5nZU1hbmFnZXIoKQotCXsKLQkJcmV0dXJuIGNoYW5nZU1hbmFnZXI7Ci0JfQotCi0JcHVibGljIGZpbmFsIFhTRFNjaGVtYSBnZXRNb2RlbCgpCi0JewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZXNvdXJjZVJlbmFtZUNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZXNvdXJjZVJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjEzZTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVzb3VyY2VSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgY2hhbmdlIHRoYXQgcmVuYW1lcyBhIGdpdmVuIHJlc291cmNlCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVJlbmFtZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0KLQkvKgotCSAqIHdlIGNhbm5vdCB1c2UgaGFuZGxlcyBiZWNhdXNlIHRoZXkgYmVjYW1lIGludmFsaWQgd2hlbiB5b3UgcmVuYW1lIHRoZSByZXNvdXJjZS4KLQkgKiBwYXRocyBkbyBub3QuCi0JICovCi0JcHJpdmF0ZSBJUGF0aCBmUmVzb3VyY2VQYXRoOwotCi0JcHJpdmF0ZSBTdHJpbmcgZk5ld05hbWU7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3TmFtZSBpbmNsdWRlcyB0aGUgZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIFJlc291cmNlUmVuYW1lQ2hhbmdlKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcyhyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFJlc291cmNlUmVuYW1lQ2hhbmdlKElQYXRoIHJlc291cmNlUGF0aCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJZlJlc291cmNlUGF0aD0gcmVzb3VyY2VQYXRoOwotCQlmTmV3TmFtZT0gbmV3TmFtZTsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihmUmVzb3VyY2VQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQkvLyBUT0RPOiBpbXBsZW1lbnQgZmlsZSB2YWxpZGF0aW9uLCBzZWUgSkRUQ2hhbmdlCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JCi0JLyoKLQkgKiB0byBhdm9pZCB0aGUgZXhjZXB0aW9uIHNlbmRlcnMgc2hvdWxkIGNoZWNrIGlmIGEgcmVzb3VyY2Ugd2l0aCB0aGUgbmV3IG5hbWUKLQkgKiBhbHJlYWR5IGV4aXN0cwotCSAqLwotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlwbS5iZWdpblRhc2soUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlhTRFJlbmFtZVJlc291cmNlQ2hhbmdlLnJlbmFtZV9yZXNvdXJjZSIpLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlnZXRSZXNvdXJjZSgpLm1vdmUocmVuYW1lZFJlc291cmNlUGF0aChmUmVzb3VyY2VQYXRoLCBmTmV3TmFtZSksIGdldENvcmVSZW5hbWVGbGFncygpLCBwbSk7Ci0KLQkJCVN0cmluZyBvbGROYW1lPSBmUmVzb3VyY2VQYXRoLmxhc3RTZWdtZW50KCk7Ci0JCQlJUGF0aCBuZXdQYXRoPSByZW5hbWVkUmVzb3VyY2VQYXRoKGZSZXNvdXJjZVBhdGgsIGZOZXdOYW1lKTsKLQkJCXJldHVybiBuZXcgUmVzb3VyY2VSZW5hbWVDaGFuZ2UobmV3UGF0aCwgb2xkTmFtZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBnZXRDb3JlUmVuYW1lRmxhZ3MoKSB7Ci0JCWlmIChnZXRSZXNvdXJjZSgpLmlzTGlua2VkKCkpCi0JCQlyZXR1cm4gSVJlc291cmNlLlNIQUxMT1c7Ci0JCWVsc2UKLQkJCXJldHVybiBJUmVzb3VyY2UuTk9ORTsKLQl9Ci0KLQkvKgotCSAqIGNoYW5nZXMgcmVzb3VyY2UgbmFtZXMgL3MvcC9BLmphdmEgcmVuYW1lZCB0byBCLmphdmEgYmVjb21lcyAvcy9wL0IuamF2YQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggcmVuYW1lZFJlc291cmNlUGF0aChJUGF0aCBwYXRoLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKAotCQkJIlhTRFJlbmFtZVJlc291cmNlQ2hhbmdlLm5hbWUiLCBuZXcgU3RyaW5nW117ZlJlc291cmNlUGF0aC50b1N0cmluZygpLCAvLyROT04tTkxTLTEkCi0JCQlyZW5hbWVkUmVzb3VyY2VQYXRoKGZSZXNvdXJjZVBhdGgsIGZOZXdOYW1lKS50b1N0cmluZygpfSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZSgpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMmJmOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlRleHRDaGFuZ2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0vKioKLSAqIFRoaXMgcmVuYW1lIHBhcnRpY2lwYW50IGNyZWF0ZXMgdGV4dCBjaGFuZ2VzIGZvciB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgWFNEIGFuZCBXU0RMIGZpbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50IGV4dGVuZHMgUmVuYW1lUGFydGljaXBhbnQgewotCQotLy8JcHJpdmF0ZSBJRmlsZSBmaWxlID0gbnVsbDsKLQlwcml2YXRlIFRleHRDaGFuZ2VNYW5hZ2VyIGNoYW5nZU1hbmFnZXI7Ci0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgWFNEX0NPTlRFTlRfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgV1NETF9DT05URU5UX1RZUEVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwud3NkbHNvdXJjZSI7Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJLy8gY2hlY2sgaWYgZmlsZSBoYXMgWFNEIG9yIFdTREwgY29udGVudAotCQkJSUZpbGUgYUZpbGUgPSAoSUZpbGUpIGVsZW1lbnQ7Ci0JCQl0cnkgewotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBhRmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoIGRlc2NyaXB0aW9uID09IG51bGwgKQotICAJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IGRlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJaWYoY29udGVudFR5cGUgIT0gbnVsbCl7Ci0JCQkJCWlmKFhTRF9DT05URU5UX1RZUEVfSUQuZXF1YWxzKGNvbnRlbnRUeXBlLmdldElkKCkpIHx8Ci0JCQkJCQkJV1NETF9DT05URU5UX1RZUEVfSUQuZXF1YWxzKGNvbnRlbnRUeXBlLmdldElkKCkpKXsKLS8vCQkJCQkJZmlsZSA9IGFGaWxlOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50LmNvbXBvc2l0ZUNoYW5nZU5hbWUiKTsKLQl9Ci0JCi0vLwlwcml2YXRlIElQYXRoIGdldE5ld0ZpbGVQYXRoKCkgewotLy8JCQotLy8JCUlQYXRoIG9sZFBhdGggPSBmaWxlLmdldFJhd0xvY2F0aW9uKCk7Ci0vLwkJSVBhdGggbmV3UGF0aCA9IG9sZFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCkpOwotLy8JCXJldHVybiBuZXdQYXRoOwotLy8JfQotCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLAotCQkJQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQl7Ci0JCVJlZmFjdG9yaW5nU3RhdHVzIHJlc3VsdCA9IG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCQl0cnkKLQkJewotCQkJcG0uYmVnaW5UYXNrKCIiLCA5KTsgLy8kTk9OLU5MUy0xJAotCQkJY2hhbmdlTWFuYWdlciA9IGNyZWF0ZUNoYW5nZU1hbmFnZXIobmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgMSksCi0JCQkJCXJlc3VsdCk7Ci0JCQkKLQkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpewotCQkJcmVzdWx0LmFkZEZhdGFsRXJyb3IoZS50b1N0cmluZygpKTsKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCQotCQotCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sCi0JCQlPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCXsKLQkJdHJ5Ci0JCXsKLQkJCVN0cmluZyBjaGFuZ2VOYW1lID0gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZVJlc291cmNlQ2hhbmdlLnJlbmFtZV9yZXNvdXJjZV9yZWZlcmVuY2VfY2hhbmdlIik7Ci0JCQlUZXh0Q2hhbmdlW10gY2hhbmdlcyA9ICBjaGFuZ2VNYW5hZ2VyLmdldEFsbENoYW5nZXMoKTsKLQkJCWlmKGNoYW5nZXMubGVuZ3RoID4gMCl7Ci0JCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDaGFuZ2UoY2hhbmdlTmFtZSwgY2hhbmdlcyk7Ci0JCQl9Ci0JCQllbHNlewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCX0gZmluYWxseQotCQl7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQotCX0KLQkKLQkKLQlwcml2YXRlIFRleHRDaGFuZ2VNYW5hZ2VyIGNyZWF0ZUNoYW5nZU1hbmFnZXIoSVByb2dyZXNzTW9uaXRvciBwbSwKLQkJCVJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cykgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVRleHRDaGFuZ2VNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgVGV4dENoYW5nZU1hbmFnZXIoZmFsc2UpOwotCQkvLyBvbmx5IG9uZSBkZWNsYXJhdGlvbiBnZXRzIHVwZGF0ZWQKLQkJLy9hZGREZWNsYXJhdGlvblVwZGF0ZShtYW5hZ2VyKTsKLQkJaWYgKGdldEFyZ3VtZW50cygpLmdldFVwZGF0ZVJlZmVyZW5jZXMoKSkKLQkJCWFkZE9jY3VycmVuY2VzKG1hbmFnZXIsIHBtLCBzdGF0dXMpOwotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQotCi0Jdm9pZCBhZGRPY2N1cnJlbmNlcyhUZXh0Q2hhbmdlTWFuYWdlciBtYW5hZ2VyLCBJUHJvZ3Jlc3NNb25pdG9yIHBtLAotCQkJUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLS8vCQkKLS8vCQlPYmplY3RbXSBvY2N1cnJlbmNlcyA9IFNlYXJjaFRvb2xzLmdldEZpbGVEZXBlbmRlbmNpZXMoZmlsZSk7Ci0vLwkJcG0uYmVnaW5UYXNrKCIiLCBvY2N1cnJlbmNlcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0vLwkJCi0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBvY2N1cnJlbmNlcy5sZW5ndGg7IGkrKykKLS8vCQl7Ci0vLwkJCU9iamVjdCBvYmplY3QgPSBvY2N1cnJlbmNlc1tpXTsKLS8vCi0vLwkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHRHcm91cCkKLS8vCQkJewotLy8JCQkJU2VhcmNoUmVzdWx0R3JvdXAgc2VhcmNoUmVzdWx0ID0gKFNlYXJjaFJlc3VsdEdyb3VwKSBvYmplY3Q7Ci0vLwkJCQlpZiAoc2VhcmNoUmVzdWx0ID09IG51bGwpCi0vLwkJCQkJY29udGludWU7Ci0vLwkJCQkKLS8vCQkJCUlGaWxlIHJlZmVyZW5jaW5nRmlsZSA9IChJRmlsZSlzZWFyY2hSZXN1bHQuZ2V0UmVzb3VyY2UoKTsKLS8vCQkJCQkKLS8vCQkJCXJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotLy8JCQkJLy8gZm9yIGVhY2ggcmVzdWx0IGZpbGUgY3JlYXRlIFhTRCBtb2RlbCBhbmQgZ2V0IGNvbXBvbmVudCBmcm9tIHRoYXQgbW9kZWwKLS8vCQkJCXJlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQoCi0vLwkJCQkJCW5ldyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkoKSk7Ci0vLwkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocmVmZXJlbmNpbmdGaWxlLmdldExvY2F0aW9uKCkudG9Qb3J0YWJsZVN0cmluZygpKTsKLS8vCQkJCXRyeQotLy8JCQkJewotLy8JCQkJCVhTRFNjaGVtYSBzY2hlbWEgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTY2hlbWEoKTsKLS8vCQkJCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKHJlZmVyZW5jaW5nRmlsZSk7Ci0vLwkJCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgc3RydWN0dXJlZE1vZGVsOwotLy8JCQkJCVJlc291cmNlIHJlc291cmNlID0gbmV3IFhTRFJlc291cmNlSW1wbCgpOwotLy8JCQkJCXJlc291cmNlLnNldFVSSSh1cmkpOwotLy8JCQkJCXNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOwotLy8JCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHNjaGVtYSk7Ci0vLwkJCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLS8vCQkJCQlzY2hlbWEuc2V0RWxlbWVudChkb21Nb2RlbC5nZXREb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpKTsKLS8vCQkJCQkvLyBnZXQgdGFyZ2V0IG5hbWVzcGFjZSAKLS8vCQkJCQlTdHJpbmcgc3RyaW5nUGF0aCA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotLy8JCQkJCVN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBYTUxRdWlja1NjYW4uZ2V0VGFyZ2V0TmFtZXNwYWNlKHN0cmluZ1BhdGgpOwotLy8JCQkJCXRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZSA9PSBudWxsID8gIiIgOiB0YXJnZXROYW1lc3BhY2U7Ci0vLwotLy8JCQkJCUxpc3QgdGV4dEVkaXRzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQkJCVNlYXJjaE1hdGNoW10gbWF0Y2hlcyA9IHNlYXJjaFJlc3VsdC5nZXRTZWFyY2hSZXN1bHRzKCk7Ci0vLwkJCQkJCi0vLwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtYXRjaGVzLmxlbmd0aDsgaisrKSB7Ci0vLwkJCQkJCVNlYXJjaE1hdGNoIG1hdGNoID0gbWF0Y2hlc1tqXTsKLS8vCQkJCQkJCi0vLwkJCQkJCUZpbGVSZWZlcmVuY2VSZW5hbWVyIHJlbmFtZXIgPSBuZXcgRmlsZVJlZmVyZW5jZVJlbmFtZXIoCi0vLwkJCQkJCQkJbWF0Y2guZ2V0QXR0clZhbHVlKCksIHRhcmdldE5hbWVzcGFjZSwgZ2V0TmV3RmlsZVBhdGgoKS50b1N0cmluZygpLCBzY2hlbWEpOwotLy8JCQkJCQlyZW5hbWVyLnZpc2l0U2NoZW1hKHNjaGVtYSk7Ci0vLwkJCQkJICAgIHRleHRFZGl0cy5hZGRBbGwocmVuYW1lci5nZXRUZXh0RWRpdHMoKSk7Ci0vLwkJCQkJfQotLy8JCQkJCQotLy8JCQkJCQotLy8JCQkJCWlmKCF0ZXh0RWRpdHMuaXNFbXB0eSgpKXsKLS8vCQkJCQkJVGV4dENoYW5nZSB0ZXh0Q2hhbmdlID0gbWFuYWdlci5nZXQocmVmZXJlbmNpbmdGaWxlKTsKLS8vCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0ZXh0RWRpdHMuc2l6ZSgpOyBqKyspCi0vLwkJCQkJCXsKLS8vCQkJCQkJCVJlcGxhY2VFZGl0IHJlcGxhY2VFZGl0ID0gKFJlcGxhY2VFZGl0KSB0ZXh0RWRpdHMKLS8vCQkJCQkJCQkJLmdldChqKTsKLS8vCQkJCQkJCVN0cmluZyBlZGl0TmFtZSA9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50LkZpbGVfUmVuYW1lX3VwZGF0ZV9yZWZlcmVuY2UiKTsKLS8vCQkJCQkJCVRleHRDaGFuZ2VDb21wYXRpYmlsaXR5LmFkZFRleHRFZGl0KHRleHRDaGFuZ2UsCi0vLwkJCQkJCQkJCWVkaXROYW1lLCByZXBsYWNlRWRpdCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQkJCi0vLwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLS8vCQkJCXsKLS8vCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotLy8JCQkJfSBmaW5hbGx5Ci0vLwkJCQl7Ci0vLwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotCX0KLQkKLQkKLQlwdWJsaWMgIGNsYXNzIFJlZmVyZW5jZUxvY2F0aW9uRmluZGVyCi0JewotCQlwcm90ZWN0ZWQgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50OwotCQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JCXByb3RlY3RlZCBYU0RTY2hlbWEgcmVmZXJlbmNpbmdTY2hlbWE7Ci0JCXByb3RlY3RlZCBMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIFJlZmVyZW5jZUxvY2F0aW9uRmluZGVyKFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCwKLQkJCQlTdHJpbmcgbmFtZSwgWFNEU2NoZW1hIHJlZmVyZW5jaW5nU2NoZW1hKQotCQl7Ci0JCQl0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLnJlZmVyZW5jaW5nU2NoZW1hID0gcmVmZXJlbmNpbmdTY2hlbWE7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKQotCQl7Ci0JCQkKLQkJCS8vWFNEU3dpdGNoIHhzZFN3aXRjaCA9IG5ldyBYU0RTd2l0Y2goKQotLy8JCQl7Ci0vLwkJCQlwdWJsaWMgT2JqZWN0IGNhc2VYU0RUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiBvYmplY3QpCi0vLwkJCQl7Ci0vLwkJCQkJR2xvYmFsVHlwZVJlZmVyZW5jZVJlbmFtZXIgcmVuYW1lciA9IG5ldyBHbG9iYWxUeXBlUmVmZXJlbmNlUmVuYW1lcigKLS8vCQkJCQkJCW9iamVjdC5nZXROYW1lKCksIG9iamVjdC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZSwgcmVmZXJlbmNpbmdTY2hlbWEpOwotLy8JCQkJCXJlbmFtZXIudmlzaXRTY2hlbWEocmVmZXJlbmNpbmdTY2hlbWEpOwotLy8JCQkJCXJlc3VsdHMuYWRkQWxsKHJlbmFtZXIuZ2V0VGV4dEVkaXRzKCkpOwotLy8JCQkJCXJldHVybiBudWxsOwotLy8JCQkJfQotLy8KLS8vCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTREVsZW1lbnREZWNsYXJhdGlvbigKLS8vCQkJCQkJWFNERWxlbWVudERlY2xhcmF0aW9uIG9iamVjdCkKLS8vCQkJCXsKLS8vCQkJCQlpZiAob2JqZWN0LmlzR2xvYmFsKCkpCi0vLwkJCQkJewotLy8JCQkJCQlHbG9iYWxFbGVtZW50UmVuYW1lciByZW5hbWVyID0gbmV3IEdsb2JhbEVsZW1lbnRSZW5hbWVyKAotLy8JCQkJCQkJCW9iamVjdC5nZXROYW1lKCksIG9iamVjdC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZSwgcmVmZXJlbmNpbmdTY2hlbWEpOwotLy8JCQkJCQlyZW5hbWVyLnZpc2l0U2NoZW1hKHJlZmVyZW5jaW5nU2NoZW1hKTsKLS8vCQkJCQkJcmVzdWx0cy5hZGRBbGwocmVuYW1lci5nZXRUZXh0RWRpdHMoKSk7Ci0vLwkJCQkJfQotLy8JCQkJCXJldHVybiBudWxsOwotLy8JCQkJfQotLy8KLS8vCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKAotLy8JCQkJCQlYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBvYmplY3QpCi0vLwkJCQl7Ci0vLwkJCQkJR2xvYmFsR3JvdXBSZW5hbWVyIHJlbmFtZXIgPSBuZXcgR2xvYmFsR3JvdXBSZW5hbWVyKAotLy8JCQkJCQkJb2JqZWN0LmdldE5hbWUoKSwgb2JqZWN0LmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lLCByZWZlcmVuY2luZ1NjaGVtYSk7Ci0vLwkJCQkJcmVuYW1lci52aXNpdFNjaGVtYShyZWZlcmVuY2luZ1NjaGVtYSk7Ci0vLwkJCQkJcmV0dXJuIG51bGw7Ci0vLwkJCQl9Ci0vLwkJCX07Ci0JCQkvL3hzZFN3aXRjaC5kb1N3aXRjaChjb21wb25lbnQpOwotLy8JCQljb21wb25lbnQuc2V0TmFtZShuYW1lKTsKLS8vCQkJdHJ5Ci0vLwkJCXsKLS8vCQkJCXJlZmVyZW5jaW5nU2NoZW1hLmVSZXNvdXJjZSgpLnNhdmUobmV3IEhhc2hNYXAoKSk7Ci0vLwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0vLwkJCXsKLS8vCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCX0KLQotCQl9Ci0KLQkJcHVibGljIGZpbmFsIExpc3QgZ2V0UmVzdWx0cygpCi0JCXsKLQkJCXJldHVybiByZXN1bHRzOwotCQl9Ci0JfQotCQotCQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9Tb3J0aW5nU2VhcmNoUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1NvcnRpbmdTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0MGE4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1NvcnRpbmdTZWFyY2hSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFNvcnRpbmdTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hSZXF1ZXN0b3IgewotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PTkFNRVNQQUNFID0gIm5vbmFtZXNwYWNlIjsKLQotCQotCQlwcml2YXRlIE1hcCBmRm91bmQ7Ci0KLQkJcHVibGljIFNvcnRpbmdTZWFyY2hSZXF1ZXN0b3IoKSB7Ci0JCQlmRm91bmQ9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJCi0KLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIGEgTGlzdCBvZiB7QGxpbmsgU2VhcmNoTWF0Y2h9ZXMgKHNvcnRlZCBieSBuYW1lc3BhY2UpCi0JCSAqLwotCQlwdWJsaWMgTWFwLyogbmFtZXNwYWNlIC0gPFNlYXJjaE1hdGNoPiovIGdldFJlc3VsdHMoKSB7Ci0JCQlyZXR1cm4gZkZvdW5kOwotCQl9Ci0KLQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsLnByb3Zpc2lvbmFsLlNlYXJjaFJlcXVlc3RvciNhY2NlcHRTZWFyY2hNYXRjaChvcmcuZWNsaXBzZS53c3QuY29tbW9uLnNlYXJjaC5pbnRlcm5hbC5wcm92aXNpb25hbC5TZWFyY2hNYXRjaCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFjY2VwdFNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoIG1hdGNoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJCQotCQkJaWYobWF0Y2ggIT0gbnVsbCAmJiBtYXRjaC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpewotCQkJCU5vZGUgbm9kZSA9IChOb2RlKW1hdGNoLmdldE9iamVjdCgpOwotCQkJCUVsZW1lbnQgZG9tRWxlbWVudCA9IG51bGw7Ci0JCQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREU6Ci0JCQkJCWRvbUVsZW1lbnQgPSAoKEF0dHIpbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0JCQkJCWRvbUVsZW1lbnQgPSAoKEVsZW1lbnQpbm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlTdHJpbmcgbmFtZXNwYWNlID0gZG9tRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQkJCQlpZihuYW1lc3BhY2UgPT0gbnVsbCB8fCBuYW1lc3BhY2UuZXF1YWxzKCIiKSl7Ci0JCQkJCW5hbWVzcGFjZSA9IE5PTkFNRVNQQUNFOwotCQkJCX0KLQkJCQlMaXN0IG1hdGNoZXMgPSBnZXRNYXRjaGVzKG5hbWVzcGFjZSk7Ci0JCQkJbWF0Y2hlcy5hZGQobWF0Y2gpOwkJCQotCQkJfQotCQkJCi0JCX0KLQkJCi0JCXByaXZhdGUgTGlzdCBnZXRNYXRjaGVzKFN0cmluZyBuYW1lc3BhY2UpewotCQkJT2JqZWN0IG1hdGNoZXMgPSBmRm91bmQuZ2V0KG5hbWVzcGFjZSk7Ci0JCQlpZighKG1hdGNoZXMgaW5zdGFuY2VvZiBMaXN0KSl7Ci0JCQkJbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmRm91bmQucHV0KG5hbWVzcGFjZSwgbWF0Y2hlcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gKExpc3QpbWF0Y2hlczsKLQkJCQotCQl9Ci0JCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9YTUxDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9YTUxDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWJhMzIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvWE1MQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlRleHRDaGFuZ2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IudXRpbC5UZXh0Q2hhbmdlQ29tcGF0aWJpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFhNTENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50IGV4dGVuZHMgUmVuYW1lUGFydGljaXBhbnQgewotCQotCXByb3RlY3RlZCBTZWFyY2hNYXRjaCBtYXRjaDsKLQotCXByb3RlY3RlZCBUZXh0Q2hhbmdlTWFuYWdlciBjaGFuZ2VNYW5hZ2VyOwotCXByb3RlY3RlZCBMaXN0IG1hdGNoZXM7Ci0KLSAgICAKLSAgICAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCQotCQlpZihnZXRBcmd1bWVudHMoKSBpbnN0YW5jZW9mIENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cyl7Ci0JCQkvLyBjaGFuZ2VNYW5nZXIgaXMgcGFzc2VkIGluIGZyb20gdGhlIFJlbmFtZUNvbXBvbmVudFByb2Nlc3NvciB0byBjb2xsZWN0IGFsbCB0aGUgY2hhbmdlcwotCQkJY2hhbmdlTWFuYWdlciA9ICgoQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzKWdldEFyZ3VtZW50cygpKS5nZXRDaGFuZ2VNYW5hZ2VyKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIlhNTCBDb21wb25lbnQgUmVuYW1lIFBhcnRpY2lwYW50IjsKLQl9Ci0KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCUNoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBUZXh0Q2hhbmdlTWFuYWdlciBnZXRDaGFuZ2VNYW5hZ2VyKCl7Ci0JCQotCQlpZihjaGFuZ2VNYW5hZ2VyID09IG51bGwpewotCQkJCWNoYW5nZU1hbmFnZXIgPSBuZXcgVGV4dENoYW5nZU1hbmFnZXIoZmFsc2UpOwotCQl9Ci0JCXJldHVybiBjaGFuZ2VNYW5hZ2VyOwotCQkKLQl9Ci0JCi0vLwlwcml2YXRlIFJlZmFjdG9yaW5nU3RhdHVzIGNyZWF0ZVJlbmFtZUNoYW5nZXMoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJQXNzZXJ0LmlzTm90TnVsbChtb25pdG9yKTsKLS8vCQlmaW5hbCBSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXM9IG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotLy8JCXRyeSB7Ci0vLwkJCW1vbml0b3IuYmVnaW5UYXNrKCJSZWZhY3RvcmluZ01lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nX3NlYXJjaGluZyIsIDEpOyAKLS8vCQkJY3JlYXRlUmVuYW1lQ2hhbmdlcyhuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLS8vCQkJLy91cGRhdGVDaGFuZ2VNYW5hZ2VyKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSksIHN0YXR1cyk7Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJbW9uaXRvci5kb25lKCk7Ci0vLwkJfQotLy8JCXJldHVybiBzdGF0dXM7Ci0vLwl9Ci0KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkJCU9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWF0Y2hlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVNlYXJjaE1hdGNoIG1hdGNoID0gKFNlYXJjaE1hdGNoKSBpdGVyLm5leHQoKTsKLQkJCVRleHRDaGFuZ2UgdGV4dENoYW5nZSA9IGdldENoYW5nZU1hbmFnZXIoKS5nZXQobWF0Y2guZ2V0RmlsZSgpKTsKLQkJCVN0cmluZyBuZXdOYW1lID0gZ2V0QXJndW1lbnRzKCkuZ2V0TmV3TmFtZSgpOwotCQkJU3RyaW5nIHF1YWxpZmllciA9ICIiOwotCQkJaWYoZ2V0QXJndW1lbnRzKCkgaW5zdGFuY2VvZiBDb21wb25lbnRSZW5hbWVBcmd1bWVudHMpewotCQkJCXF1YWxpZmllciA9ICgoQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzKWdldEFyZ3VtZW50cygpKS5nZXRRdWFsaWZpZXIoKTsKLQkJCX0KLQkJCWlmKG1hdGNoLmdldE9iamVjdCgpIGluc3RhbmNlb2YgTm9kZSl7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpbWF0Y2guZ2V0T2JqZWN0KCk7Ci0JCQkJaWYobm9kZSBpbnN0YW5jZW9mIElET01BdHRyKXsKLQkJCQkJSURPTUF0dHIgYXR0ciA9IChJRE9NQXR0cilub2RlOwotCQkJCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KWF0dHIuZ2V0T3duZXJFbGVtZW50KCkgOwotCQkJCQluZXdOYW1lID0gZ2V0TmV3UU5hbWUoZWxlbWVudCwgcXVhbGlmaWVyLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQkJbmV3TmFtZSA9IFJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5xdW90ZVN0cmluZyhuZXdOYW1lKTsKLQkJCX0KLQkJCQotCQkJUmVwbGFjZUVkaXQgcmVwbGFjZUVkaXQgPSBuZXcgUmVwbGFjZUVkaXQobWF0Y2guZ2V0T2Zmc2V0KCksIG1hdGNoLmdldExlbmd0aCgpLCBuZXdOYW1lICk7Ci0JCQlTdHJpbmcgZWRpdE5hbWUgPSBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVfcmVmZXJlbmNlIik7Ci0JCQlUZXh0Q2hhbmdlQ29tcGF0aWJpbGl0eS5hZGRUZXh0RWRpdCh0ZXh0Q2hhbmdlLCBlZGl0TmFtZSwgcmVwbGFjZUVkaXQpOwotICAgCQl9Ci0JCS8vIGRvbid0IGNyZWF0ZSBhbnkgY2hhbmdlIG5vdywgYWxsIHRoZSBjaGFuZ2VzIGFyZSBpbiBjaGFuZ2VNYW5nZXIgdmFyaWFibGUgYW5kIHdpbGwgYmUgY29tYmluZWQgaW4gUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLnBvc3RDcmVhdGVDaGFuZ2UgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV3UU5hbWUoTm9kZSBub2RlLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmaXggPSBYU0RDb25zdGFudHMubG9va3VwUXVhbGlmaWVyKG5vZGUsIHRhcmdldE5hbWVzcGFjZSk7Ci0JCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCXNiLmFwcGVuZChwcmVmaXgpOwotCQkJCXNiLmFwcGVuZCgiOiIpOwotCQkJCXNiLmFwcGVuZChuZXdOYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKG5ld05hbWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKG5ld05hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0gIHB1YmxpYyB2b2lkIHNldENoYW5nZU1hbmFnZXIoVGV4dENoYW5nZU1hbmFnZXIgY2hhbmdlTWFuYWdlcikKLSAgewotICAgIHRoaXMuY2hhbmdlTWFuYWdlciA9IGNoYW5nZU1hbmFnZXI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9YU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9YU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLQotLyoqCi0gKiBUaGlzIHBhcnRpY2lwYW50IHRha2VzIGNhc2Ugb2YgcmVuYW1pbmcgbWF0Y2hlcyB0aGF0IGFyZSBYU0QgY29tcG9uZW50cwotICovCi1wdWJsaWMgY2xhc3MgWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBYTUxDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCB7Ci0KLXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShlbGVtZW50KTsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KXsKLQkJCWlmKGdldEFyZ3VtZW50cygpIGluc3RhbmNlb2YgQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzKXsKLQkJCQltYXRjaGVzID0gKExpc3QpKChDb21wb25lbnRSZW5hbWVBcmd1bWVudHMpZ2V0QXJndW1lbnRzKCkpLmdldE1hdGNoZXMoKS5nZXQoSVhTRFNlYXJjaENvbnN0YW50cy5YTUxTQ0hFTUFfTkFNRVNQQUNFKTsKLQkJCX0KLQkJCWlmKG1hdGNoZXMgIT0gbnVsbCl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCi0JCXJldHVybiAiWFNEIGNvbXBvbmVudCByZW5hbWUgcGFydGljaXBhbnQiOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvQWJzdHJhY3RDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL0Fic3RyYWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzllYmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvQWJzdHJhY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tbWFuZCAKLXsKLSAgcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQ7Ci0gIHByaXZhdGUgWFNEQ29uY3JldGVDb21wb25lbnQgbW9kZWw7Ci0KLSAgcHJvdGVjdGVkIEFic3RyYWN0Q29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQpCi0gIHsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgfQotICAKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgcnVuKCk7Ci0KLSAgcHJvdGVjdGVkIFhTRENvbmNyZXRlQ29tcG9uZW50IGdldFBhcmVudCgpCi0gIHsKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0gIAotICBwdWJsaWMgWFNEQ29uY3JldGVDb21wb25lbnQgZ2V0TW9kZWxPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbE9iamVjdChYU0RDb25jcmV0ZUNvbXBvbmVudCBtb2RlbCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgfQotICAKLSAgLy8gRXN0YWJsaXNoIHBhcnQtd2hvbGUgcmVsYXRpb25zaGlwCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGFkb3B0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKTsKLQotICBwcm90ZWN0ZWQgdm9pZCBmb3JtYXRDaGlsZChFbGVtZW50IGNoaWxkKQotICB7Ci0gICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgSURPTU1vZGVsIG1vZGVsID0gKChJRE9NTm9kZSljaGlsZCkuZ2V0TW9kZWwoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLSAgICAgICAgCi0gICAgICAgIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLSAgICAgICAgZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUoY2hpbGQpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuY2hhbmdlZE1vZGVsKCk7IAotICAgICAgfQotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmYzFiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnN0cnVjdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCi0JU3RyaW5nIGZOZXdOYW1lOwotCi0JcHVibGljIE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBlbGVtZW50LAotCQkJU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoZWxlbWVudC5nZXRDb250YWluZXIoKSk7Ci0JCXNldE1vZGVsT2JqZWN0KGVsZW1lbnQpOwotCQlmTmV3TmFtZSA9IG5ld05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlYU0RDb25jcmV0ZUNvbXBvbmVudCBtb2RlbCA9IGdldE1vZGVsT2JqZWN0KCk7Ci0JCVhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IG1vZGVsLmdldENvbnRhaW5lcigpOwotCQlYU0RUeXBlRGVmaW5pdGlvbiBnbG9iYWxUeXBlRGVmID0gbnVsbDsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJLy8gY2xvbmUgdHlwZWRlZiB3aXRoIGl0J3MgY29udGVudCBhbmQgc2V0IGl0IGdsb2JhbAotCQkJCWdsb2JhbFR5cGVEZWYgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBtb2RlbAotCQkJCQkJLmNsb25lQ29uY3JldGVDb21wb25lbnQodHJ1ZSwgZmFsc2UpOwotCQkJCWdsb2JhbFR5cGVEZWYuc2V0TmFtZShmTmV3TmFtZSk7Ci0JCQkJcGFyZW50LmdldFNjaGVtYSgpLmdldENvbnRlbnRzKCkuYWRkKGdsb2JhbFR5cGVEZWYpOwotCQkJCSgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBwYXJlbnQpCi0JCQkJCQkuc2V0VHlwZURlZmluaXRpb24oZ2xvYmFsVHlwZURlZik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgewotCi0JCQlYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBtb2RlbDsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkvLyBjbG9uZSB0eXBlZGVmIHdpdGggaXQncyBjb250ZW50IGFuZCBzZXQgaXQgZ2xvYmFsCi0JCQkJZ2xvYmFsVHlwZURlZiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZURlZgotCQkJCQkJLmNsb25lQ29uY3JldGVDb21wb25lbnQodHJ1ZSwgZmFsc2UpOwotCQkJCWdsb2JhbFR5cGVEZWYuc2V0TmFtZShmTmV3TmFtZSk7Ci0JCQkJcGFyZW50LmdldFNjaGVtYSgpLmdldENvbnRlbnRzKCkuYWRkKGdsb2JhbFR5cGVEZWYpOwotCQkJCSgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBwYXJlbnQpCi0JCQkJCQkuc2V0VHlwZURlZmluaXRpb24oZ2xvYmFsVHlwZURlZik7Ci0JCQkJZm9ybWF0Q2hpbGQoZ2xvYmFsVHlwZURlZi5nZXRFbGVtZW50KCkpOwotCi0JCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSB7Ci0JCQkJLy8gY2xvbmUgdHlwZWRlZiB3aXRoIGl0J3MgY29udGVudCBhbmQgc2V0IGl0IGdsb2JhbAotCQkJCWdsb2JhbFR5cGVEZWYgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHR5cGVEZWYKLQkJCQkJCS5jbG9uZUNvbmNyZXRlQ29tcG9uZW50KHRydWUsIGZhbHNlKTsKLQkJCQlnbG9iYWxUeXBlRGVmLnNldE5hbWUoZk5ld05hbWUpOwotCQkJCXBhcmVudC5nZXRTY2hlbWEoKS5nZXRDb250ZW50cygpLmFkZChnbG9iYWxUeXBlRGVmKTsKLQkJCQkoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBwYXJlbnQpCi0JCQkJCQkuc2V0VHlwZURlZmluaXRpb24oKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBnbG9iYWxUeXBlRGVmKTsKLQotCQkJfQotCi0JCX0KLQotCQlmb3JtYXRDaGlsZChnbG9iYWxUeXBlRGVmLmdldEVsZW1lbnQoKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI2Fkb3B0KG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZG9wdChYU0RDb25jcmV0ZUNvbXBvbmVudCBtb2RlbCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZUxvY2FsRWxlbWVudEdsb2JhbENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZUxvY2FsRWxlbWVudEdsb2JhbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlYjhhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iuc3RydWN0dXJlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kCi17Ci0gIHB1YmxpYyBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBlbGVtZW50KQotICB7Ci0gICAgc3VwZXIoZWxlbWVudC5nZXRDb250YWluZXIoKSk7Ci0gICAgc2V0TW9kZWxPYmplY3QoZWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaWYgKGdldE1vZGVsT2JqZWN0KCkgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotCi0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gbG9jYWxFbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWdldE1vZGVsT2JqZWN0KCk7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbnRhaW5lciA9IHBhcmVudC5nZXRDb250YWluZXIoKTsKLQotICAgICAgLy8gQ2xvbmUgdGhlIGxvY2FsIGVsZW1lbnQgd2l0aCBpdHMgY29udGVudCBhbmQgc2V0IGl0IGdsb2JhbAotCi0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2xvYmFsRWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilsb2NhbEVsZW1lbnREZWNsYXJhdGlvbi5jbG9uZUNvbmNyZXRlQ29tcG9uZW50KHRydWUsIGZhbHNlKTsKLQotICAgICAgLy8gVGhlIHNjaGVtYSBtYXkgYWxyZWFkeSBoYXZlIGEgZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24gd2l0aCB0aGlzIG5hbWUuIEluIHRoYXQgY2FzZSwgZW5zdXJlIHRoZSBuYW1lIG9mIHRoZSBuZXdseSBjcmVhdGVkCi0gICAgICAvLyBlbGVtZW50IGRvZXMgbm90IGNvbGxpZGUgd2l0aCBhbiBleGlzdGluZyBvbmUuCi0KLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBjb250YWluZXIuZ2V0U2NoZW1hKCk7Ci0gICAgICBTdHJpbmcgbG9jYWxFbGVtZW50TmFtZSA9IGxvY2FsRWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKTsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBleGlzdGluZ0dsb2JhbEVsZW1lbnQgPSBzY2hlbWEucmVzb2x2ZUVsZW1lbnREZWNsYXJhdGlvbihsb2NhbEVsZW1lbnROYW1lKTsKLSAgICAgIGJvb2xlYW4gZWxlbWVudEV4aXN0cyA9IGV4aXN0aW5nR2xvYmFsRWxlbWVudCAhPSBudWxsICYmIGV4aXN0aW5nR2xvYmFsRWxlbWVudC5nZXRTY2hlbWEoKSAhPSBudWxsOwotICAgICAgaWYgKGVsZW1lbnRFeGlzdHMpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuZXdFbGVtZW50TmFtZSA9IFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUobG9jYWxFbGVtZW50TmFtZSwgc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKSk7Ci0gICAgICAgIGdsb2JhbEVsZW1lbnREZWNsYXJhdGlvbi5zZXROYW1lKG5ld0VsZW1lbnROYW1lKTsKLSAgICAgIH0KLQotICAgICAgRUxpc3Qgc2NoZW1hQ29udGVudHMgPSBzY2hlbWEuZ2V0Q29udGVudHMoKTsKLSAgICAgIHNjaGVtYUNvbnRlbnRzLmFkZChnbG9iYWxFbGVtZW50RGVjbGFyYXRpb24pOwotCi0gICAgICAvLyBNb2RpZnkgdGhlIGxvY2FsIGVsZW1lbnQgdG8gYmVjb21lIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgZWxlbWVudC4KLQotICAgICAgbG9jYWxFbGVtZW50RGVjbGFyYXRpb24uc2V0TmFtZShudWxsKTsKLSAgICAgIGxvY2FsRWxlbWVudERlY2xhcmF0aW9uLnNldFR5cGVEZWZpbml0aW9uKG51bGwpOwotICAgICAgbG9jYWxFbGVtZW50RGVjbGFyYXRpb24uc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24obnVsbCk7Ci0gICAgICBsb2NhbEVsZW1lbnREZWNsYXJhdGlvbi5zZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbihnbG9iYWxFbGVtZW50RGVjbGFyYXRpb24pOwotICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApY29udGFpbmVyOwotCi0gICAgICAvLyBGb3JtYXQgdGhlIG1hcmt1cC4gCi0KLSAgICAgIGZvcm1hdENoaWxkKG1vZGVsR3JvdXAuZ2V0RWxlbWVudCgpKTsKLSAgICAgIGZvcm1hdENoaWxkKGdsb2JhbEVsZW1lbnREZWNsYXJhdGlvbi5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLkFic3RyYWN0Q29tbWFuZCNhZG9wdChvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBhZG9wdChYU0RDb25jcmV0ZUNvbXBvbmVudCBtb2RlbCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlVHlwZUdsb2JhbENoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlVHlwZUdsb2JhbENoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2IxZDIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZVR5cGVHbG9iYWxDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iuc3RydWN0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogQGF1dGhvciBlYmVsaXNhcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWtlVHlwZUdsb2JhbENoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0KLQlwcml2YXRlIE1hcCBmQ2hhbmdlczsKLQotCXByaXZhdGUgU3RyaW5nIGZOZXdOYW1lOwotCi0JcHJpdmF0ZSBYU0RUeXBlRGVmaW5pdGlvbiBmVHlwZUNvbXBvbmVudDsKLQotCXB1YmxpYyBNYWtlVHlwZUdsb2JhbENoYW5nZShYU0RUeXBlRGVmaW5pdGlvbiBjb21wb25lbnQsIAotCQkJU3RyaW5nIG5ld05hbWUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChuZXdOYW1lLCAibmV3IG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZUeXBlQ29tcG9uZW50ID0gY29tcG9uZW50OwotCQlmTmV3TmFtZSA9IG5ld05hbWU7Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCwKLQkvLyBTdHJpbmcgbmV3TmFtZSkgewotCS8vIC8vIFRPRE86IFAxIGltcGxlbWVudCBzZWFyY2ggb2YgWFNEIGZpbGVzCi0JLy8gWFNEU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gWFNEU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCS8vIFJlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldwotCS8vIFJlZmFjdG9yU2VhcmNoUmVxdWVzdG9yKGNvbXBvbmVudCwgbmV3TmFtZSk7Ci0JLy8gc3VwcG9ydC5zZWFyY2hSdW5uYWJsZShjb21wb25lbnQsIElYU0RTZWFyY2hDb25zdGFudHMuV09SS1NQQUNFX1NDT1BFLAotCS8vIHJlcXVlc3Rvcik7Ci0JLy8KLQkvLyByZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQkvLwotCS8vIH0KLQotCXByb3RlY3RlZCBDaGFuZ2UgY3JlYXRlVW5kb0NoYW5nZSgpIHsKLQkJcmV0dXJuIG5ldyBNYWtlVHlwZUdsb2JhbENoYW5nZShmVHlwZUNvbXBvbmVudCwgZ2V0TmV3TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlbmFtZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gUDEgY2hhbmdlIHRlbXBvcmFyeSByZW5hbWUgb2YgWFNEIG1vZGVsIGNvbXBvbmVudHMKLQkJcGVyZm9ybU1vZGlmeShnZXROZXdOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1Nb2RpZnkoZmluYWwgU3RyaW5nIHZhbHVlKSB7Ci0vLwkJCURlbGF5ZWRSZW5hbWVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBEZWxheWVkUmVuYW1lUnVubmFibGUoCi0vLwkJCQkJZlR5cGVDb21wb25lbnQsIHZhbHVlKTsKLQkJCS8vIFRPRE86IHJlbW92ZSBEaXNwbGF5Ci0JCQkvL0Rpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBEZWxheWVkUmVuYW1lUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByb3RlY3RlZCBYU0RUeXBlRGVmaW5pdGlvbiBjb21wb25lbnQ7Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0JCXB1YmxpYyBEZWxheWVkUmVuYW1lUnVubmFibGUoWFNEVHlwZURlZmluaXRpb24gY29tcG9uZW50LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJRG9jdW1lbnRJbXBsIGRvYyA9IChEb2N1bWVudEltcGwpIGNvbXBvbmVudC5nZXRFbGVtZW50KCkuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcoCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlSZWZhY3RvcmluZ01lc3NhZ2VzCi0JCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQUNUSU9OX01BS0VfQU5PTllNT1VTX1RZUEVfR0xPQkFMIikpOwotCQkJTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kKAotCQkJCQljb21wb25lbnQsIG5hbWUpOwotCQkJY29tbWFuZC5ydW4oKTsKLQkJCWRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0Q2hhbmdlIGdldENoYW5nZShJRmlsZSBmaWxlKSB7Ci0JCVRleHRDaGFuZ2UgcmVzdWx0ID0gKFRleHRDaGFuZ2UpIGZDaGFuZ2VzLmdldChmaWxlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoZmlsZS5nZXROYW1lKCksIGZpbGUpOwotCQkJZkNoYW5nZXMucHV0KGZpbGUsIHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBSZWZhY3RvcmluZ01lc3NhZ2VzCi0JCQkJLmdldEZvcm1hdHRlZFN0cmluZygKLQkJCQkJCSJNYWtlVHlwZUdsb2JhbENoYW5nZS5uYW1lIiwgbmV3IFN0cmluZ1tdIHtnZXROZXdOYW1lKCkgfSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgZmluYWwgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcG0uYmVnaW5UYXNrKFJlZmFjdG9yaW5nTWVzc2FnZXMKLQkJCQkJLmdldFN0cmluZygiWFNEQ29tcG9uZW50UmVuYW1lQ2hhbmdlLlJlbmFtaW5nIiksIDEpOyAvLyROT04tTkxTLTEkCi0JCQlDaGFuZ2UgcmVzdWx0ID0gY3JlYXRlVW5kb0NoYW5nZSgpOwotCQkJZG9SZW5hbWUobmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgMSkpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBmaW5hbGx5IHsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5ld05hbWUuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROZXdOYW1lKCkgewotCQlyZXR1cm4gZk5ld05hbWU7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZSNnZXRNb2RpZmllZEVsZW1lbnQoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmVHlwZUNvbXBvbmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZSNpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjaXNWYWxpZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkJCU9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBpbXBsZW1lbnQgY2hhbmdlIHZhbGlkYXRpb24KLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZVR5cGVHbG9iYWxQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZVR5cGVHbG9iYWxQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3OTNmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VUeXBlR2xvYmFsUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnN0cnVjdHVyZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5QYXJ0aWNpcGFudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZUFyZ3VtZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5TaGFyYWJsZVBhcnRpY2lwYW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLklOYW1lVXBkYXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIE1ha2VUeXBlR2xvYmFsUHJvY2Vzc29yIGV4dGVuZHMgUmVuYW1lUHJvY2Vzc29yIGltcGxlbWVudHMgSU5hbWVVcGRhdGluZ3sKLQkKLQlwcml2YXRlIFhTRFR5cGVEZWZpbml0aW9uIGZUeXBlQ29tcG9uZW50OwotCXByaXZhdGUgU3RyaW5nIGZOZXdFbGVtZW50TmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVI9ICJvcmcuZWNsaXBzZS53c3QudWkueHNkLm1ha2VUeXBlR2xvYmFsUHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9wcml2YXRlIFF1YWxpZmllZE5hbWVTZWFyY2hSZXN1bHQgZk5hbWVTZWFyY2hSZXN1bHQ7Ci0JCi0JcHVibGljIE1ha2VUeXBlR2xvYmFsUHJvY2Vzc29yKFhTRFR5cGVEZWZpbml0aW9uIGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWZUeXBlQ29tcG9uZW50PSBlbGVtZW50OwotCQlmTmV3RWxlbWVudE5hbWUgPSBuZXdOYW1lOwotCQkKLQl9Ci0JCi0JcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIGdldFR5cGVDb21wb25lbnQoKSB7Ci0JCXJldHVybiBmVHlwZUNvbXBvbmVudDsKLQl9Ci0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSVRleHRVcGRhdGluZyNjYW5FbmFibGVUZXh0VXBkYXRpbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkVuYWJsZVRleHRVcGRhdGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vVE9ETzogZmluZCBwcm9qZWN0IG5hdHVyZXMgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHJlZmFjdG9yZWQKLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWREZXJpdmVkUGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywKLQkJCUxpc3QgcmVzdWx0LCBTdHJpbmdbXSBuYXR1cmVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE86IHByb3ZpZGUgYSB3YXkgdG8gbG9hZCByZW5hbWUgcGFydGljaXBhbnRzCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNjaGVja0ZpbmFsQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrRmluYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sCi0JCQlDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvLyBUT0RPIGFkZCBjb2RlIHRvIGNoZWNrIGZpbmFsIGNvbmRpdGlvbnMgZm9yIGNvbXBvbmVudCByZW5hbWUKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjY2hlY2tJbml0aWFsQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tJbml0aWFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLS8vCQkgVE9ETyBhZGQgY29kZSB0byBjaGVjayBpbml0aWFsIGNvbmRpdGlvbnMgZm9yIGNvbXBvbmVudCByZW5hbWUKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvLyBUT0RPIFAxIGFkZCBjaGFuZ2UgY3JlYXRpb24KLS8vCQlDaGFuZ2VbXSBjaGFuZ2VzID0gWFNEQ29tcG9uZW50UmVuYW1lQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IodGhpcy5mTmFtZWRDb21wb25lbnQsIGdldE5ld0VsZW1lbnROYW1lKCkpOwotLy8JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7IAotLy8JCQlpZihjaGFuZ2VzLmxlbmd0aCA+IDApCi0vLwkJCQltdWx0aUNoYW5nZSAgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKCJYU0QgY29tcG9uZW50IHJlbmFtZSBwYXJ0aWNpcGFudCBjaGFuZ2VzIiwgY2hhbmdlcyk7IC8vJE5PTi1OTFMtMSQgVE9ETzogZXh0ZXJuYWxpemUgc3RyaW5nCi0vLwkJcmV0dXJuIG11bHRpQ2hhbmdlOwotCQkKLS8vCQljb21wdXRlTmFtZU1hdGNoZXMocG0pOwkKLS8vCQlDaGFuZ2VbXSBjaGFuZ2VzID0gZk5hbWVTZWFyY2hSZXN1bHQuZ2V0QWxsQ2hhbmdlcygpOwotLy8JCXJldHVybiBuZXcgQ29tcG9zaXRlQ2hhbmdlKCJYU0QgZmlsZSByZW5hbWUgcGFydGljaXBhbnQgY2hhbmdlcyIsIGNoYW5nZXMpOyAvL1RPRE86IGV4dGVybmFsaXplIHN0cmluZwotCQlwbS5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCXRyeXsKLQkJCXJldHVybiBuZXcgTWFrZVR5cGVHbG9iYWxDaGFuZ2UoZlR5cGVDb21wb25lbnQsIGdldE5ld0VsZW1lbnROYW1lKCkpOwotCQl9IGZpbmFsbHl7Ci0JCQlwbS5kb25lKCk7Ci0JCX0JIAotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0RWxlbWVudHMoKQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cygpIHsKLQkJCi0JCXJldHVybiBuZXcgT2JqZWN0W10ge2ZUeXBlQ29tcG9uZW50fTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2dldElkZW50aWZpZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIElERU5USUZJRVI7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNnZXRQcm9jZXNzb3JOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3Nvck5hbWUoKSB7Ci0JCXJldHVybiBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldEZvcm1hdHRlZFN0cmluZygKLQkJCQkiTWFrZUxvY2FsVHlwZUdsb2JhbFJlZmFjdG9yaW5nLm5hbWUiLCAgLy8kTk9OLU5MUy0xJAotCQkJCW5ldyBTdHJpbmdbXXtnZXROZXdFbGVtZW50TmFtZSgpfSk7Ci0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2lzQXBwbGljYWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZlR5cGVDb21wb25lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gVE9ETyBpbXBsZW1lbnQgaXNBcHBsaWNhYmxlIGxvZ2ljIGZvciB0aGUgbmFtZWQgY29tcG9uZW50LCAKLQkJLy8gdmVyaWZ5IGhvdyBpdCBpcyBkaWZmZXJlbnQgZnJvbSBvdGhlciBjb25kaXRpb24gY2hlY2tzCi0vLwkJaWYgKGZOYW1lZENvbXBvbmVudC5pc0Fub255bW91cygpKQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJaWYgKCEgQ2hlY2tzLmlzQXZhaWxhYmxlKGZUeXBlKSkKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCWlmIChpc1NwZWNpYWxDYXNlKGZUeXBlKSkKLS8vCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5yZWZhY3RvcmluZy50YWdnaW5nLklOYW1lVXBkYXRpbmcjY2hlY2tOZXdFbGVtZW50TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja05ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKXsKLQkJQXNzZXJ0LmlzTm90TnVsbChuZXdOYW1lLCAibmV3IG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBUT0RPOiBpbXBsZW1lbnQgbmV3IG5hbWUgY2hlY2tpbmcKLS8vCQlSZWZhY3RvcmluZ1N0YXR1cyByZXN1bHQgPSBDaGVja3MuY2hlY2tUeXBlTmFtZShuZXdOYW1lKTsKLS8vCQlpZiAoQ2hlY2tzLmlzQWxyZWFkeU5hbWVkKGZUeXBlLCBuZXdOYW1lKSkKLS8vCQkJcmVzdWx0LmFkZEZhdGFsRXJyb3IoUmVmYWN0b3JpbmdDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVUeXBlUmVmYWN0b3JpbmcuY2hvb3NlX2Fub3RoZXJfbmFtZSIpKTsJIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSU5hbWVVcGRhdGluZyNnZXROZXdFbGVtZW50KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE5ld0VsZW1lbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLCBpdCdzIHVzZWQgZm9yIHVwZGF0aW5nIHNlbGVjdGlvbiBvbiBuZXcgZWxlbWVudAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0vLwlwcml2YXRlIHZvaWQgY29tcHV0ZU5hbWVNYXRjaGVzKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQotLy8JICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotLy8JICAgIHRyeSB7Ci0vLwkJCVVSTCBmaWxlVVJMID0gUGxhdGZvcm0ucmVzb2x2ZShuZXcgVVJMKGZOYW1lZENvbXBvbmVudC5nZXRTY2hlbWEoKS5nZXRTY2hlbWFMb2NhdGlvbigpKSk7Ci0vLwkJCUlGaWxlIGZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlVVJMLmdldFBhdGgoKSkpOwotLy8JCQlpZiAoZk5hbWVTZWFyY2hSZXN1bHQgPT0gbnVsbCkKLS8vCQkJCWZOYW1lU2VhcmNoUmVzdWx0PSBuZXcgUXVhbGlmaWVkTmFtZVNlYXJjaFJlc3VsdCgpOwotLy8JCQlRdWFsaWZpZWROYW1lRmluZGVyLnByb2Nlc3MoZk5hbWVTZWFyY2hSZXN1bHQsIGdldE5hbWVkQ29tcG9uZW50KCkuZ2V0TmFtZSgpLCAgCi0vLwkJCQlnZXROZXdFbGVtZW50TmFtZSgpLCAKLS8vCQkJCSIqLnhzZCIsIGZpbGUuZ2V0UHJvamVjdCgpLCBwbSk7Ci0vLwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotLy8JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0vLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJfQotLy8JfQotCQotCXB1YmxpYyBmaW5hbCBSZWZhY3RvcmluZ1BhcnRpY2lwYW50W10gbG9hZFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZFBhcnRpY2lwYW50cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzPSBuZXcgUmVuYW1lQXJndW1lbnRzKGdldE5ld0VsZW1lbnROYW1lKCksIHRydWUpOwotCQlTdHJpbmdbXSBuYXR1cmVzPSBnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCk7Ci0JCUxpc3QgcmVzdWx0PSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxvYWRFbGVtZW50UGFydGljaXBhbnRzKHN0YXR1cywgcmVzdWx0LCBhcmd1bWVudHMsIG5hdHVyZXMsIHNoYXJlZFBhcnRpY2lwYW50cyk7Ci0JCWxvYWREZXJpdmVkUGFydGljaXBhbnRzKHN0YXR1cywgcmVzdWx0LCBuYXR1cmVzLCBzaGFyZWRQYXJ0aWNpcGFudHMpOwotCQlyZXR1cm4gKFJlZmFjdG9yaW5nUGFydGljaXBhbnRbXSlyZXN1bHQudG9BcnJheShuZXcgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWRFbGVtZW50UGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgTGlzdCByZXN1bHQsIFJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHMsIFN0cmluZ1tdIG5hdHVyZXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlPYmplY3RbXSBlbGVtZW50cz0gZ2V0RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoUGFydGljaXBhbnRNYW5hZ2VyLmxvYWRSZW5hbWVQYXJ0aWNpcGFudHMoc3RhdHVzLCAKLQkJCQl0aGlzLCAgZWxlbWVudHNbaV0sCi0JCQkJYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWQpKSk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2V0TmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJCi0JCWZOZXdFbGVtZW50TmFtZT0gbmV3TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5ld0VsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZk5ld0VsZW1lbnROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudEVsZW1lbnROYW1lKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmTmV3RWxlbWVudE5hbWU7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3V0aWwvVGV4dENoYW5nZUNvbXBhdGliaWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci91dGlsL1RleHRDaGFuZ2VDb21wYXRpYmlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTc1ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3V0aWwvVGV4dENoYW5nZUNvbXBhdGliaWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXRHcm91cDsKLQotLyoqCi0gKiBBIHV0aWxpdHkgY2xhc3MgdG8gcHJvdmlkZSBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZAotICogdGV4dCBjaGFuZ2UgQVBJIG9mIGFkZGluZyB0ZXh0IGVkaXRzIGRpcmVjdGx5IGFuZCBhdXRvCi0gKiBpbnNlcnRpbmcgdGhlbSBpbnRvIHRoZSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgVGV4dENoYW5nZUNvbXBhdGliaWxpdHkgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRleHRFZGl0KFRleHRDaGFuZ2UgY2hhbmdlLCBTdHJpbmcgbmFtZSwgVGV4dEVkaXQgZWRpdCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGNoYW5nZSk7Ci0JCUFzc2VydC5pc05vdE51bGwobmFtZSk7Ci0JCUFzc2VydC5pc05vdE51bGwoZWRpdCk7Ci0JCVRleHRFZGl0IHJvb3Q9IGNoYW5nZS5nZXRFZGl0KCk7Ci0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCXJvb3Q9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQljaGFuZ2Uuc2V0RWRpdChyb290KTsKLQkJfQotCQlpbnNlcnQocm9vdCwgZWRpdCk7Ci0JCWNoYW5nZS5hZGRUZXh0RWRpdEdyb3VwKG5ldyBUZXh0RWRpdEdyb3VwKG5hbWUsIGVkaXQpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRleHRFZGl0KFRleHRDaGFuZ2UgY2hhbmdlLCBTdHJpbmcgbmFtZSwgVGV4dEVkaXRbXSBlZGl0cykgewotCQlBc3NlcnQuaXNOb3ROdWxsKGNoYW5nZSk7Ci0JCUFzc2VydC5pc05vdE51bGwobmFtZSk7Ci0JCUFzc2VydC5pc05vdE51bGwoZWRpdHMpOwotCQlUZXh0RWRpdCByb290PSBjaGFuZ2UuZ2V0RWRpdCgpOwotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQlyb290PSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJY2hhbmdlLnNldEVkaXQocm9vdCk7Ci0JCX0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVkaXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnNlcnQocm9vdCwgZWRpdHNbaV0pOwotCQl9Ci0JCWNoYW5nZS5hZGRUZXh0RWRpdEdyb3VwKG5ldyBUZXh0RWRpdEdyb3VwKG5hbWUsIGVkaXRzKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnQoVGV4dEVkaXQgcGFyZW50LCBUZXh0RWRpdCBlZGl0KSB7Ci0JCWlmICghcGFyZW50Lmhhc0NoaWxkcmVuKCkpIHsKLQkJCXBhcmVudC5hZGRDaGlsZChlZGl0KTsKLQkJCXJldHVybjsKLQkJfQotCQlUZXh0RWRpdFtdIGNoaWxkcmVuPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJLy8gRmlyc3QgZGl2ZSBkb3duIHRvIGZpbmQgdGhlIHJpZ2h0IHBhcmVudC4KLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlUZXh0RWRpdCBjaGlsZD0gY2hpbGRyZW5baV07Ci0JCQlpZiAoY292ZXJzKGNoaWxkLCBlZGl0KSkgewotCQkJCWluc2VydChjaGlsZCwgZWRpdCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCS8vIFdlIGhhdmUgdGhlIHJpZ2h0IHBhcmVudC4gTm93IGNoZWNrIGlmIHNvbWUgb2YgdGhlIGNoaWxkcmVuIGhhdmUgdG8KLQkJLy8gYmUgbW92ZWQgdW5kZXIgdGhlIG5ldyBlZGl0IHNpbmNlIGl0IGlzIGNvdmVyaW5nIGl0LgotCQlmb3IgKGludCBpPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJVGV4dEVkaXQgY2hpbGQ9IGNoaWxkcmVuW2ldOwotCQkJaWYgKGNvdmVycyhlZGl0LCBjaGlsZCkpIHsKLQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQoaSk7Ci0JCQkJZWRpdC5hZGRDaGlsZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJcGFyZW50LmFkZENoaWxkKGVkaXQpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvdmVycyhUZXh0RWRpdCB0aGlzRWRpdCwgVGV4dEVkaXQgb3RoZXJFZGl0KSB7Ci0JCWlmICh0aGlzRWRpdC5nZXRMZW5ndGgoKSA9PSAwKQkvLyBhbiBpbnNlcnRpb24gcG9pbnQgY2FuJ3QgY292ZXIgYW55dGhpbmcKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWludCB0aGlzT2Zmc2V0PSB0aGlzRWRpdC5nZXRPZmZzZXQoKTsKLQkJaW50IHRoaXNFbmQ9IHRoaXNFZGl0LmdldEV4Y2x1c2l2ZUVuZCgpOwkKLQkJaWYgKG90aGVyRWRpdC5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlpbnQgb3RoZXJPZmZzZXQ9IG90aGVyRWRpdC5nZXRPZmZzZXQoKTsKLQkJCXJldHVybiB0aGlzT2Zmc2V0IDwgb3RoZXJPZmZzZXQgJiYgb3RoZXJPZmZzZXQgPCB0aGlzRW5kOwotCQl9IGVsc2UgewotCQkJaW50IG90aGVyT2Zmc2V0PSBvdGhlckVkaXQuZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgb3RoZXJFbmQ9IG90aGVyRWRpdC5nZXRFeGNsdXNpdmVFbmQoKTsKLQkJCXJldHVybiB0aGlzT2Zmc2V0IDw9IG90aGVyT2Zmc2V0ICYmIG90aGVyRW5kIDw9IHRoaXNFbmQ7Ci0JCX0KLQl9CQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVmYWN0b3JBY3Rpb25Hcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3RvckFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMThkMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3RvckFjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnMuUmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9ucy5TZWxlY3Rpb25EaXNwYXRjaEFjdGlvbjsKLQotLyoqCi0gKiBBY3Rpb24gZ3JvdXAgdGhhdCBhZGRzIHJlZmFjdG9yIGFjdGlvbnMgKGZvciBleGFtcGxlICdSZW5hbWUnLCAnTW92ZScpIHRvIGEKLSAqIGNvbnRleHQgbWVudSBhbmQgdGhlIGdsb2JhbCBtZW51IGJhci4KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmYWN0b3JBY3Rpb25Hcm91cCBleHRlbmRzIEFjdGlvbkdyb3VwIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb0FjdGlvbkF2YWlsYWJsZSBleHRlbmRzIEFjdGlvbiB7Ci0JCXB1YmxpYyBOb0FjdGlvbkF2YWlsYWJsZSgpIHsKLQkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlzZXRUZXh0KFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVmYWN0b3JBY3Rpb25Hcm91cF9ub19yZWZhY3RvcmluZ19hdmFpbGFibGUpOyAKLQkJfQotCX0KLQotCS8qKgotCSAqIFBvcC11cCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciByZW9yZ2FuaXplIGFjdGlvbnMgKHZhbHVlCi0JICogPGNvZGU+Imdyb3VwLnJlb3JnYW5pemUiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfUkVPUkdBTklaRSA9IElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuR1JPVVBfUkVPUkdBTklaRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3RvcmluZy5tZW51IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3JpbmcuYWN0aW9ucy5SZW5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0QWN0aW9uKFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGFjdGlvbiwKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChzZWxlY3Rpb24pOwotCQlBc3NlcnQuaXNOb3ROdWxsKGFjdGlvbik7Ci0JCWFjdGlvbi51cGRhdGUoc2VsZWN0aW9uKTsKLQkJLy9wcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoYWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBmRWRpdG9yQWN0aW9uczsKLQotCXByaXZhdGUgU3RyaW5nIGZHcm91cE5hbWUgPSBHUk9VUF9SRU9SR0FOSVpFOwotCQotCXByaXZhdGUgQWN0aW9uIGZOb0FjdGlvbkF2YWlsYWJsZSA9IG5ldyBOb0FjdGlvbkF2YWlsYWJsZSgpOwotCi0JcHJvdGVjdGVkIFJlbmFtZUFjdGlvbiBmUmVuYW1lQWN0aW9uOwotCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGZSZW5hbWVUYXJnZXROYW1lc3BhY2U7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JCi0JcHVibGljIFJlZmFjdG9yQWN0aW9uR3JvdXAoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkJCi0JfQotCi0JcHVibGljIGludCBhZGRBY3Rpb24oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsICYmIGFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJZkVkaXRvckFjdGlvbnMuYWRkKGFjdGlvbik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUmVmYWN0b3JTdWJtZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0KLQkJSU1lbnVNYW5hZ2VyIHJlZmFjdG9yU3VibWVudSA9IG5ldyBNZW51TWFuYWdlcihSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlZmFjdG9yTWVudV9sYWJlbCwgTUVOVV9JRCk7Ci0JCXJlZmFjdG9yU3VibWVudS5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJCXJlZmFjdG9yTWVudVNob3duKG1hbmFnZXIpOwotCQkJCX0KLQkJCX0pOwotCQlyZWZhY3RvclN1Ym1lbnUuYWRkKGZOb0FjdGlvbkF2YWlsYWJsZSk7Ci0JCQlpZiAobWVudS5maW5kKHJlZmFjdG9yU3VibWVudS5nZXRJZCgpKSA9PSBudWxsKSB7Ci0JCQkJaWYgKG1lbnUuZmluZChmR3JvdXBOYW1lKSA9PSBudWxsKSB7Ci0JCQkJCW1lbnUuYWRkKHJlZmFjdG9yU3VibWVudSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWVudS5hcHBlbmRUb0dyb3VwKGZHcm91cE5hbWUsIHJlZmFjdG9yU3VibWVudSk7Ci0JCQkJfQotCQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VBY3Rpb24oSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBhY3Rpb24sCi0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKQotCQkJcHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGFjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBBY3Rpb25Hcm91cAotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJc3VwZXIuZmlsbEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihSRU5BTUUsIGZSZW5hbWVBY3Rpb24pOwotCQlyZXRhcmdldEZpbGVNZW51QWN0aW9ucyhhY3Rpb25CYXJzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9ucyhMaXN0IGVuYWJsZWRBY3Rpb25zKSB7Ci0JCQotCQlpZihzZWxlY3Rpb24gIT0gbnVsbCAmJiBmRWRpdG9yQWN0aW9ucyAhPSBudWxsKXsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGZFZGl0b3JBY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFjdGlvbiBhY3Rpb24gPSAoQWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24pIHsKLQkJCQkJU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gc2VsZWN0aW9uQWN0aW9uID0gKFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uKSBhY3Rpb247Ci0JCQkJCXNlbGVjdGlvbkFjdGlvbi51cGRhdGUoc2VsZWN0aW9uKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGZFZGl0b3JBY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFjdGlvbiBhY3Rpb24gPSAoQWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCQkJZW5hYmxlZEFjdGlvbnMuYWRkKGFjdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gQWN0aW9uR3JvdXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuZmlsbENvbnRleHRNZW51KG1lbnUpOwotCQlhZGRSZWZhY3RvclN1Ym1lbnUobWVudSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmlsbFJlZmFjdG9yTWVudShJTWVudU1hbmFnZXIgcmVmYWN0b3JTdWJtZW51KSB7Ci0JCWludCBhZGRlZCA9IDA7Ci0JCXJlZmFjdG9yU3VibWVudS5hZGQobmV3IFNlcGFyYXRvcihHUk9VUF9SRU9SR0FOSVpFKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZFZGl0b3JBY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFjdGlvbiAhPSBudWxsICYmIGFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCWZFZGl0b3JBY3Rpb25zLmFkZChhY3Rpb24pOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JCXJldHVybiBhZGRlZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmYWN0b3JNZW51SGlkZGVuKElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZkVkaXRvckFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpb24gYWN0aW9uID0gKEFjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24pIHsKLQkJCQlTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBzZWxlY3Rpb25BY3Rpb24gPSAoU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24pIGFjdGlvbjsKLQkJCQlzZWxlY3Rpb25BY3Rpb24udXBkYXRlKHNlbGVjdGlvbik7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWZhY3Rvck1lbnVTaG93bihmaW5hbCBJTWVudU1hbmFnZXIgcmVmYWN0b3JTdWJtZW51KSB7Ci0JCS8vIHdlIGtub3cgdGhhdCB3ZSBoYXZlIGFuIE1lbnVNYW5hZ2VyIHNpbmNlIHdlIGNyZWF0ZWQgaXQgaW4KLQkJLy8gYWRkUmVmYWN0b3JTdWJtZW51LgotCQlNZW51IG1lbnUgPSAoKE1lbnVNYW5hZ2VyKSByZWZhY3RvclN1Ym1lbnUpLmdldE1lbnUoKTsKLQkJbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUhpZGRlbihNZW51RXZlbnQgZSkgewotCQkJCXJlZmFjdG9yTWVudUhpZGRlbihyZWZhY3RvclN1Ym1lbnUpOwotCQkJfQotCQl9KTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmRWRpdG9yQWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFjdGlvbiBhY3Rpb24gPSAoQWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbikgewotCQkJCVNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHNlbGVjdGlvbkFjdGlvbiA9IChTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbikgYWN0aW9uOwotCQkJCXNlbGVjdGlvbkFjdGlvbi51cGRhdGUoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCQlyZWZhY3RvclN1Ym1lbnUucmVtb3ZlQWxsKCk7Ci0JCWlmIChmaWxsUmVmYWN0b3JNZW51KHJlZmFjdG9yU3VibWVudSkgPT0gMCkKLQkJCXJlZmFjdG9yU3VibWVudS5hZGQoZk5vQWN0aW9uQXZhaWxhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhcmdldHMgdGhlIEZpbGUgYWN0aW9ucyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHJlZmFjdG9yaW5nIGFjdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbkJhcnMKLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gYmFyIHRvIHJlZ2lzdGVyIHRoZSBtb3ZlIGFuZCByZW5hbWUgYWN0aW9uIHdpdGgKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXRhcmdldEZpbGVNZW51QWN0aW9ucyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFTkFNRS5nZXRJZCgpLAotCQkJCWZSZW5hbWVBY3Rpb24pOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljNTY3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlLCBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElNZW51Q3JlYXRvciB7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCXByaXZhdGUgSUFjdGlvbiBmRGVsZWdhdGVBY3Rpb247Ci0JLy8gd2hldGhlciB0byByZS1maWxsIHRoZSBtZW51IChyZXNldCBvbiBzZWxlY3Rpb24gY2hhbmdlKQotCXByaXZhdGUgYm9vbGVhbiBmRmlsbE1lbnUgPSB0cnVlOwotCXByb3RlY3RlZCBJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0OyAKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCi0KLQlwdWJsaWMgUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlKCkgewotCi0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQl3b3JrYmVuY2hQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZ2V0TWVudShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sKQotCSAqLwotCXB1YmxpYyBNZW51IGdldE1lbnUoQ29udHJvbCBwYXJlbnQpIHsKLQkJLy8gbmV2ZXIgY2FsbGVkCi0JCXJldHVybiBudWxsOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2dldE1lbnUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudSkKLQkgKi8KLQlwdWJsaWMgTWVudSBnZXRNZW51KE1lbnUgcGFyZW50KSB7Ci0JCS8vQ3JlYXRlIHRoZSBuZXcgbWVudS4gVGhlIG1lbnUgd2lsbCBnZXQgZmlsbGVkIHdoZW4gaXQgaXMgYWJvdXQgdG8gYmUgc2hvd24uIHNlZSBmaWxsTWVudShNZW51KS4KLQkJTWVudSBtZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLQkJLyoqCi0JCSAqIEFkZCBsaXN0ZW5lciB0byByZXBvcHVsYXRlIHRoZSBtZW51IGVhY2ggdGltZQotCQkgKiBpdCBpcyBzaG93biBiZWNhdXNlIE1lbnVNYW5hZ2VyLnVwZGF0ZShib29sZWFuLCBib29sZWFuKSAKLQkJICogZG9lc24ndCBkaXNwb3NlIHB1bGxkb3duIEFjdGlvbkNvbnRyaWJ1dGlvbiBpdGVtcyBmb3IgZWFjaCBwb3B1cCBtZW51LgotCQkgKi8KLQkJbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBlKSB7Ci0JCQkJaWYgKGZGaWxsTWVudSkgewotCQkJCQlNZW51IG0gPSAoTWVudSllLndpZGdldDsKLQkJCQkJTWVudUl0ZW1bXSBpdGVtcyA9IG0uZ2V0SXRlbXMoKTsKLQkJCQkJZm9yIChpbnQgaT0wOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWl0ZW1zW2ldLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQlmaWxsTWVudShtKTsKLQkJCQkJZkZpbGxNZW51ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIG1lbnU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIE5ldmVyIGNhbGxlZCBiZWNhdXNlIHdlIGJlY29tZSBhIG1lbnUuCi0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZEZWxlZ2F0ZUFjdGlvbiA9IGFjdGlvbjsKLQkJdXBkYXRlV2l0aChzZWxlY3Rpb24pOwotCQkKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQl3b3JrYmVuY2hQYXJ0ID0gdGFyZ2V0RWRpdG9yOwotCQlmRGVsZWdhdGVBY3Rpb24gPSBhY3Rpb247Ci0JCWlmICh0YXJnZXRFZGl0b3IgIT0gbnVsbCAmJiB0YXJnZXRFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpICE9IG51bGwgJiYgdGFyZ2V0RWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpICE9IG51bGwpIHsKLQkJCXVwZGF0ZVdpdGgodGFyZ2V0RWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCQkKLQl9Ci0gICAgCi0JcHVibGljIHZvaWQgdXBkYXRlV2l0aChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlpZiAoZkRlbGVnYXRlQWN0aW9uICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gZW5hYmxlID0gZmFsc2U7Ci0JCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQkJLy9pZiAoKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJCWVuYWJsZSA9IHRydWU7Ci0JCQkJCS8vfQotCQkJCX0KLQkJCQllbHNlIGlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICl7Ci0JCQkJCWVuYWJsZSA9ICFzZWxlY3Rpb24uaXNFbXB0eSgpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGVuYWJsZSBhY3Rpb24KLQkJCWZEZWxlZ2F0ZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkKLQkJCS8vIGZpbGwgc3VibWVudQotCQkJZkZpbGxNZW51ID0gdHJ1ZTsKLQkJCWZEZWxlZ2F0ZUFjdGlvbi5zZXRNZW51Q3JlYXRvcih0aGlzKTsKLQkJCQotCQkJCi0JCX0KLQkJCi0JfQotCQotCQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpbGxNZW51KE1lbnUgbWVudSk7Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yR3JvdXBTdWJNZW51LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yR3JvdXBTdWJNZW51LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NzgwZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3Rvckdyb3VwU3ViTWVudS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQ29tcG91bmRDb250cmlidXRpb25JdGVtOwotCi1wdWJsaWMgY2xhc3MgUmVmYWN0b3JHcm91cFN1Yk1lbnUgZXh0ZW5kcyBDb21wb3VuZENvbnRyaWJ1dGlvbkl0ZW0gewotCi0JUmVmYWN0b3JBY3Rpb25Hcm91cCBmUmVmYWN0b3JNZW51R3JvdXA7Ci0JCi0KLQlwdWJsaWMgUmVmYWN0b3JHcm91cFN1Yk1lbnUoUmVmYWN0b3JBY3Rpb25Hcm91cCByZWZhY3Rvck1lbnVHcm91cCkgewotCQlzdXBlcigpOwotCQlmUmVmYWN0b3JNZW51R3JvdXAgPSByZWZhY3Rvck1lbnVHcm91cDsKLQl9Ci0KLQlwdWJsaWMgUmVmYWN0b3JHcm91cFN1Yk1lbnUoU3RyaW5nIGlkKSB7Ci0JCXN1cGVyKGlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBnZXRDb250cmlidXRpb25JdGVtcygpIHsKLQkJICBBcnJheUxpc3QgYWN0aW9uc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCSAgQXJyYXlMaXN0IGNvbnRyaWJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkgIGZSZWZhY3Rvck1lbnVHcm91cC5maWxsQWN0aW9ucyhhY3Rpb25zTGlzdCk7Ci0JICAgICAgICAgCi0JICAgICAgICBpZiAoYWN0aW9uc0xpc3QgIT0gbnVsbCAmJiAhYWN0aW9uc0xpc3QuaXNFbXB0eSgpKSB7Ci0JICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aW9uc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JICAgICAJCQlJQWN0aW9uIGFjdGlvbiA9IChJQWN0aW9uKSBpdGVyLm5leHQoKTsKLQkgICAgIAkJCWNvbnRyaWJMaXN0LmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pKTsKLQkgICAgIAkJfQotCSAgICAgICAgfSBlbHNlIHsKLQkgICAgICAgICAgICBBY3Rpb24gZHVtbXlBY3Rpb24gPSBuZXcgQWN0aW9uKFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVmYWN0b3JBY3Rpb25Hcm91cF9ub19yZWZhY3RvcmluZ19hdmFpbGFibGUpIHsKLQkgICAgICAgICAgICAgICAgLy8gZHVtbXkgaW5uZXIgY2xhc3M7IG5vIG1ldGhvZHMKLQkgICAgICAgICAgICB9OwotCSAgICAgICAgICAgIGR1bW15QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCSAgICAgICAgICAgIGNvbnRyaWJMaXN0LmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShkdW1teUFjdGlvbikpOwotCSAgICAgICAgfQotCSAgICAgICAgcmV0dXJuIChJQ29udHJpYnV0aW9uSXRlbVtdKSBjb250cmliTGlzdC50b0FycmF5KG5ldyBJQ29udHJpYnV0aW9uSXRlbVtjb250cmliTGlzdC5zaXplKCldKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhYzU0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcyAgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZmFjdG9yTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWZhY3RvckFjdGlvbkdyb3VwX25vX3JlZmFjdG9yaW5nX2F2YWlsYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUFjdGlvbl9yZW5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lQWN0aW9uX3VuYXZhaWxhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lSW5wdXRXaXphcmRQYWdlX25ld19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkX2ludGVybmFsX2Vycm9yOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVRhcmdldE5hbWVzcGFjZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lWFNERWxlbWVudEFjdGlvbl9leGNlcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lWFNERWxlbWVudEFjdGlvbl9ub3RfYXZhaWxhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVhTREVsZW1lbnRBY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVN1cHBvcnRfZGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVN1cHBvcnRfbm90X2F2YWlsYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUNvbXBvbmVudFdpemFyZF9kZWZhdWx0UGFnZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUNvbXBvbmVudFdpemFyZF9pbnB1dFBhZ2VfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVJbnB1dFdpemFyZFBhZ2VfdXBkYXRlX3JlZmVyZW5jZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNEQ29tcG9uZW50UmVuYW1lQ2hhbmdlX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNEQ29tcG9uZW50UmVuYW1lQ2hhbmdlX1JlbmFtaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlUmVuYW1lUGFydGljaXBhbnRfY29tcG9zaXRlQ2hhbmdlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVSZXNvdXJjZUNoYW5nZV9yZW5hbWVfcmVzb3VyY2VfcmVmZXJlbmNlX2NoYW5nZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0RSZW5hbWVSZXNvdXJjZUNoYW5nZV9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmdfSW50ZXJuYWxfRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZ19hbHJlYWRfZXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmdfaW52YWxpZE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3JfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbl90ZXh0OyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnRfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50X0NvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvcl9Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3JfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9kZWNsYXRhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3JfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9yZWZlcmVuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnRfeHNkX2NvbXBvbmVudF9yZW5hbWVfcGFydGljaXBhbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50X3dzZGxfY29tcG9uZW50X3JlbmFtZV9wYXJ0aWNpcGFudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50X0ZpbGVfUmVuYW1lX3VwZGF0ZV9yZWZlcmVuY2U7Ci0KLQotCXByaXZhdGUgUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZW5hbWVJbnB1dFdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVuYW1lSW5wdXRXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYmYzMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZW5hbWVJbnB1dFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5Vc2VySW5wdXRXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLklSZWZlcmVuY2VVcGRhdGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci0KLS8qKgotICogQGF1dGhvciBlYmVsaXNhcgotICoKLSAqLwotcHVibGljIGNsYXNzIFJlbmFtZUlucHV0V2l6YXJkUGFnZSAgZXh0ZW5kcyBVc2VySW5wdXRXaXphcmRQYWdlewotCXByaXZhdGUgU3RyaW5nIGZJbml0aWFsVmFsdWU7Ci0JcHJpdmF0ZSBUZXh0IGZUZXh0RmllbGQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlVwZGF0ZVJlZmVyZW5jZXM7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0ZXh0IGlucHV0IHBhZ2UuCi0JICogQHBhcmFtIGlzTGFzdFVzZXJQYWdlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcGFnZSBpcyB0aGUgd2l6YXJkJ3MgbGFzdAotCSAqICB1c2VyIGlucHV0IHBhZ2UuIE90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JcHVibGljIFJlbmFtZUlucHV0V2l6YXJkUGFnZShTdHJpbmcgZGVzY3JpcHRpb24sIGJvb2xlYW4gaXNMYXN0VXNlclBhZ2UpIHsKLQkJdGhpcyhkZXNjcmlwdGlvbiwgaXNMYXN0VXNlclBhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRleHQgaW5wdXQgcGFnZS4KLQkgKiBAcGFyYW0gaXNMYXN0VXNlclBhZ2UgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBwYWdlIGlzIHRoZSB3aXphcmQncyBsYXN0Ci0JICogIHVzZXIgaW5wdXQgcGFnZS4gT3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIEBwYXJhbSBpbml0aWFsVmFsdWUgdGhlIGluaXRpYWwgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUmVuYW1lSW5wdXRXaXphcmRQYWdlKFN0cmluZyBkZXNjcmlwdGlvbiwgYm9vbGVhbiBpc0xhc3RVc2VyUGFnZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCSAgICBzdXBlcigiUmVuYW1lSW5wdXRXaXphcmRQYWdlIik7Ci0JCUFzc2VydC5pc05vdE51bGwoaW5pdGlhbFZhbHVlKTsKLQkJc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQlmSW5pdGlhbFZhbHVlPSBpbml0aWFsVmFsdWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgaW5pdGlhbCBpbnB1dCBpcyB2YWxpZC4gVHlwaWNhbGx5IGl0IGlzIG5vdCwgYmVjYXVzZSB0aGUgCi0JICogdXNlciBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gZS5nLiBhIG5ldyB0eXBlIG5hbWUgZXRjLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoZSBpbnB1dCBwcm92aWRlZCBhdCBpbml0aWFsaXphdGlvbiBpcyB2YWxpZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5pdGlhbElucHV0VmFsaWQoKXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgYW4gZW1wdHkgc3RyaW5nIGlzIGEgdmFsaWQgaW5wdXQuIFR5cGljYWxseSBpdCBpcyBub3QsIGJlY2F1c2UgCi0JICogdGhlIHVzZXIgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGUuZy4gYSBuZXcgdHlwZSBuYW1lIGV0Yy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiBhbiBlbXB0eSBzdHJpbmcgaXMgdmFsaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VtcHR5SW5wdXRWYWxpZCgpewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgdGhlIHRleHQgaW5wdXQgZmllbGQuCi0JICogCi0JICogQHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgdGV4dCBpbnB1dCBmaWVsZC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIG5vdCB0ZXh0IGlucHV0IGZpZWxkIGhhcyBiZWVuIGNyZWF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmIChmVGV4dEZpZWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZUZXh0RmllbGQuZ2V0VGV4dCgpOwkKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbmV3IHRleHQgZm9yIHRoZSB0ZXh0IGZpZWxkLiBEb2VzIG5vdGhpbmcgaWYgdGhlIHRleHQgZmllbGQgaGFzIG5vdCBiZWVuIGNyZWF0ZWQuCi0JICogQHBhcmFtIHRleHQgdGhlIG5ldyB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZUZXh0RmllbGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZlRleHRGaWVsZC5zZXRUZXh0KHRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtcyBpbnB1dCB2YWxpZGF0aW9uLiBSZXR1cm5zIGEgPGNvZGU+UmVmYWN0b3JpbmdTdGF0dXM8L2NvZGU+IHdoaWNoCi0JICogZGVzY3JpYmVzIHRoZSByZXN1bHQgb2YgaW5wdXQgdmFsaWRhdGlvbi4gPGNvZGU+TnVsbDxjb2RlPiBpcyBpbnRlcnByZXRlZAotCSAqIGFzIG5vIGVycm9yLgotCSAqLwotCXByb3RlY3RlZCBSZWZhY3RvcmluZ1N0YXR1cyB2YWxpZGF0ZVRleHRGaWVsZChTdHJpbmcgdGV4dCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0SW5wdXRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0SW5wdXRGaWVsZChwYXJlbnQsIFNXVC5CT1JERVIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0SW5wdXRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJZlRleHRGaWVsZD0gbmV3IFRleHQocGFyZW50LCBzdHlsZSk7Ci0JCWZUZXh0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdGV4dE1vZGlmaWVkKGdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZlRleHRGaWVsZCwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFTkFNRV9ORVdfTkFNRSk7Ci0JCWZUZXh0RmllbGQuc2V0VGV4dChmSW5pdGlhbFZhbHVlKTsKLQkJcmV0dXJuIGZUZXh0RmllbGQ7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGUgcGFnZSdzIHN0YXRlIGFuZCBpc3N1ZXMgYSBjb3JyZXNwb25kaW5nIGVycm9yIG1lc3NhZ2UuIFRoZSBwYWdlIHZhbGlkYXRpb24KLQkgKiBpcyBjb21wdXRlZCBieSBjYWxsaW5nIDxjb2RlPnZhbGlkYXRlUGFnZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGV4dE1vZGlmaWVkKFN0cmluZyB0ZXh0KSB7CQotCQlpZiAoISBpc0VtcHR5SW5wdXRWYWxpZCgpICYmIHRleHQuZXF1YWxzKCIiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlyZXN0b3JlTWVzc2FnZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgoISBpc0luaXRpYWxJbnB1dFZhbGlkKCkpICYmIHRleHQuZXF1YWxzKGZJbml0aWFsVmFsdWUpKXsKLQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlyZXN0b3JlTWVzc2FnZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVUZXh0RmllbGQodGV4dCkpOwotCQkKLS8vCQkgVE9ETzogZW5hYmxlIHByZXZpZXcgaW4gTTQKLQkJZ2V0UmVmYWN0b3JpbmdXaXphcmQoKS5zZXRGb3JjZVByZXZpZXdSZXZpZXcoZmFsc2UpOwotCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCi0JfQotCQotCS8qKgotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGlmIHRoZXkgd2FudCB0byByZXN0b3JlIHRoZSBtZXNzYWdlIGRpZmZlcmVudGx5LgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gY2FsbHMgPGNvZGU+c2V0TWVzc2FnZShudWxsKTwvY29kZT4sIHdoaWNoIGNsZWFycyB0aGUgbWVzc2FnZSAKLQkgKiB0aHVzIGV4cG9zaW5nIHRoZSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlTWVzc2FnZSgpewotCQlzZXRNZXNzYWdlKG51bGwpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIGluIElEaWFsb2dQYWdlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZlRleHRGaWVsZD0gbnVsbDsJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgaW4gV2l6YXJkUGFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCWlmICh2aXNpYmxlKSB7Ci0JCQl0ZXh0TW9kaWZpZWQoZ2V0VGV4dCgpKTsKLQkJfQotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSAmJiBmVGV4dEZpZWxkICE9IG51bGwpIHsKLQkJCWZUZXh0RmllbGQuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBzdXBlckNvbXBvc2l0ZT0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJc2V0Q29udHJvbChzdXBlckNvbXBvc2l0ZSk7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhzdXBlckNvbXBvc2l0ZSk7Ci0JCQotCQlzdXBlckNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBDb21wb3NpdGUoc3VwZXJDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwkKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0PSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucz0gMjsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZz0gODsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJCi0JCUxhYmVsIGxhYmVsPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0TGFiZWxUZXh0KCkpOwotCQkKLQkJVGV4dCB0ZXh0PSBjcmVhdGVUZXh0SW5wdXRGaWVsZChjb21wb3NpdGUpOwotCQl0ZXh0LnNlbGVjdEFsbCgpOwotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludD0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDI1KTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRleHQsIFhTREVkaXRvckNTSGVscElkcy5SRU5BTUVfTkVXX05BTUUpOwotICAgIAotCQlhZGRPcHRpb25hbFVwZGF0ZVJlZmVyZW5jZXNDaGVja2JveChzdXBlckNvbXBvc2l0ZSk7Ci0JCWdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCWdldFJlZmFjdG9yaW5nV2l6YXJkKCkuc2V0Rm9yY2VQcmV2aWV3UmV2aWV3KGZhbHNlKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoc3VwZXJDb21wb3NpdGUpOwotCQkvL1dvcmtiZW5jaEhlbHAuc2V0SGVscChnZXRDb250cm9sKCksIGZIZWxwQ29udGV4dElEKTsKLQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBib29sZWFuIHZhbHVlKSB7Ci0JCUJ1dHRvbiBjaGVja0JveD0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQodGl0bGUpOwotCQljaGVja0JveC5zZXRTZWxlY3Rpb24odmFsdWUpOwotCQlyZXR1cm4gY2hlY2tCb3g7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE9wdGlvbmFsVXBkYXRlUmVmZXJlbmNlc0NoZWNrYm94KENvbXBvc2l0ZSByZXN1bHQpIHsKLQotCQlmaW5hbCBJUmVmZXJlbmNlVXBkYXRpbmcgcmVmPSAoSVJlZmVyZW5jZVVwZGF0aW5nKWdldFJlZmFjdG9yaW5nKCkuZ2V0QWRhcHRlcihJUmVmZXJlbmNlVXBkYXRpbmcuY2xhc3MpOwotCQlpZiAocmVmID09IG51bGwgfHwgIXJlZi5jYW5FbmFibGVVcGRhdGVSZWZlcmVuY2VzKCkpCQotCQkJcmV0dXJuOwotCQlTdHJpbmcgdGl0bGU9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVJbnB1dFdpemFyZFBhZ2UudXBkYXRlX3JlZmVyZW5jZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIGRlZmF1bHRWYWx1ZT0gdHJ1ZTsgCi0JCWZVcGRhdGVSZWZlcmVuY2VzPSBjcmVhdGVDaGVja2JveChyZXN1bHQsIHRpdGxlLCBkZWZhdWx0VmFsdWUpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZlVwZGF0ZVJlZmVyZW5jZXMsIFhTREVkaXRvckNTSGVscElkcy5SRU5BTUVfVVBEQVRFX1JFRkVSRU5DRVMpOwotCQlyZWYuc2V0VXBkYXRlUmVmZXJlbmNlcyhmVXBkYXRlUmVmZXJlbmNlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWZVcGRhdGVSZWZlcmVuY2VzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgCQlyZWYuc2V0VXBkYXRlUmVmZXJlbmNlcyhmVXBkYXRlUmVmZXJlbmNlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwkJCQkKLQkJZlVwZGF0ZVJlZmVyZW5jZXMuc2V0RW5hYmxlZCh0cnVlKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJcmV0dXJuIFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVJbnB1dFdpemFyZFBhZ2UubmV3X25hbWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZW5hbWVSZWZhY3RvcmluZ1dpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZW5hbWVSZWZhY3RvcmluZ1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQ5NzdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuSU5hbWVVcGRhdGluZzsKLQotcHVibGljIGNsYXNzIFJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkIGV4dGVuZHMgUmVmYWN0b3JpbmdXaXphcmQgewotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZJbnB1dFBhZ2VEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGZJbnB1dFBhZ2VJbWFnZURlc2NyaXB0b3I7Ci0JCi0JcHVibGljIFJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkKFJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nLCBTdHJpbmcgZGVmYXVsdFBhZ2VUaXRsZSwgU3RyaW5nIGlucHV0UGFnZURlc2NyaXB0aW9uLCAKLQkJCUltYWdlRGVzY3JpcHRvciBpbnB1dFBhZ2VJbWFnZURlc2NyaXB0b3IpIHsKLQkJc3VwZXIocmVmYWN0b3JpbmcsIERJQUxPR19CQVNFRF9VU0VSX0lOVEVSRkFDRSk7Ci0JCXNldERlZmF1bHRQYWdlVGl0bGUoZGVmYXVsdFBhZ2VUaXRsZSk7Ci0gICAgCWZJbnB1dFBhZ2VEZXNjcmlwdGlvbj0gaW5wdXRQYWdlRGVzY3JpcHRpb247Ci0JCWZJbnB1dFBhZ2VJbWFnZURlc2NyaXB0b3I9IGlucHV0UGFnZUltYWdlRGVzY3JpcHRvcjsKLQotCX0KLQotCS8qIG5vbiBqYXZhLWRvYwotCSAqIEBzZWUgUmVmYWN0b3JpbmdXaXphcmQjYWRkVXNlcklucHV0UGFnZXMKLQkgKi8gCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXNlcklucHV0UGFnZXMoKSB7Ci0JCVN0cmluZyBpbml0aWFsU2V0dGluZz0gZ2V0UHJvY2Vzc29yKCkuZ2V0Q3VycmVudEVsZW1lbnROYW1lKCk7Ci0JCVJlbmFtZUlucHV0V2l6YXJkUGFnZSBpbnB1dFBhZ2U9IGNyZWF0ZUlucHV0UGFnZShmSW5wdXRQYWdlRGVzY3JpcHRpb24sIGluaXRpYWxTZXR0aW5nKTsKLQkJaW5wdXRQYWdlLnNldEltYWdlRGVzY3JpcHRvcihmSW5wdXRQYWdlSW1hZ2VEZXNjcmlwdG9yKTsKLQkJYWRkUGFnZShpbnB1dFBhZ2UpOwotCX0KLQotCXByb3RlY3RlZCBJTmFtZVVwZGF0aW5nIGdldFByb2Nlc3NvcigpIHsKLQkJCi0JCXJldHVybiAoSU5hbWVVcGRhdGluZylnZXRSZWZhY3RvcmluZygpLmdldEFkYXB0ZXIoSU5hbWVVcGRhdGluZy5jbGFzcyk7CQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgUmVuYW1lSW5wdXRXaXphcmRQYWdlIGNyZWF0ZUlucHV0UGFnZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGluaXRpYWxTZXR0aW5nKSB7Ci0JCXJldHVybiBuZXcgUmVuYW1lSW5wdXRXaXphcmRQYWdlKG1lc3NhZ2UsIHRydWUsIGluaXRpYWxTZXR0aW5nKSB7Ci0JCQlwcm90ZWN0ZWQgUmVmYWN0b3JpbmdTdGF0dXMgdmFsaWRhdGVUZXh0RmllbGQoU3RyaW5nIHRleHQpIHsKLQkJCQlyZXR1cm4gdmFsaWRhdGVOZXdOYW1lKHRleHQpOwotCQkJfQkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlZmFjdG9yaW5nU3RhdHVzIHZhbGlkYXRlTmV3TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlJTmFtZVVwZGF0aW5nIHJlZj0gZ2V0UHJvY2Vzc29yKCk7Ci0JCXJlZi5zZXROZXdFbGVtZW50TmFtZShuZXdOYW1lKTsKLS8vCQl0cnl7Ci0JCQlyZXR1cm4gcmVmLmNoZWNrTmV3RWxlbWVudE5hbWUobmV3TmFtZSk7Ci0vLwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLS8vCQkJLy9YWFg6IHNob3VsZCBsb2cgdGhlIGV4Y2VwdGlvbgotLy8JCQlTdHJpbmcgbXNnPSBlLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiI6IGUuZ2V0TWVzc2FnZSgpOyAvLyROT04tTkxTLTEkCi0vLwkJCXJldHVybiBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGVGYXRhbEVycm9yU3RhdHVzKFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKCJSZW5hbWVSZWZhY3RvcmluZ1dpemFyZC5pbnRlcm5hbF9lcnJvciIsIG1zZykpOy8vJE5PTi1OTFMtMSQKLS8vCQl9CQotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwZmNjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1SZWZhY3Rvck1lbnVfbGFiZWw9UmVmYWN0b3IKLVJlZmFjdG9yQWN0aW9uR3JvdXBfbm9fcmVmYWN0b3JpbmdfYXZhaWxhYmxlPTxubyByZWZhY3RvcmluZyBhdmFpbGFibGU+Ci0KLVJlbmFtZUFjdGlvbl9yZW5hbWU9UmVuYW1lCi1SZW5hbWVBY3Rpb25fdW5hdmFpbGFibGU9T3BlcmF0aW9uIHVuYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cblNlbGVjdCBhIC4uLi4KLVJlbmFtZUFjdGlvbl90ZXh0PVJlJm5hbWUuLi4KLQotUmVuYW1lSW5wdXRXaXphcmRQYWdlX25ld19uYW1lPSAmTmV3IG5hbWU6Ci1SZW5hbWVSZWZhY3RvcmluZ1dpemFyZF9pbnRlcm5hbF9lcnJvcj0gSW50ZXJuYWwgZXJyb3IgZHVyaW5nIG5hbWUgY2hlY2tpbmc6IHswfQotCi0KLVJlbmFtZVhTREVsZW1lbnRBY3Rpb25fZXhjZXB0aW9uPVVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VycmVkLiBTZWUgbG9nIGZvciBkZXRhaWxzCi1SZW5hbWVYU0RFbGVtZW50QWN0aW9uX25vdF9hdmFpbGFibGU9T3BlcmF0aW9uIHVuYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cblNlbGVjdCBhIFhTRCBwcm9qZWN0LCBmb2xkZXIsIHJlc291cmNlLCBmaWxlLCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLCAgYXR0cmlidXRlIGdyb3VwIGRlZmluaXRpb25zLCBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbnMsIGVsZW1lbnQgZGVjbGFyYXRpb25zLCBpZGVudGl0eSBjb25zdHJhaW50IGRlZmluaXRpb25zLCBtb2RlbCBncm91cHMgZGVmaW5pdGlvbnMsIG5vdGF0aW9uIGRlY2xhcmF0aW9ucywgb3Igc2ltcGxlIHR5cGUgZGVmaW5pdGlvbnMuCi1SZW5hbWVYU0RFbGVtZW50QWN0aW9uX25hbWU9UmVuYW1lCi0KLQotUmVuYW1lU3VwcG9ydF9kaWFsb2dfdGl0bGU9UmVuYW1lCi1SZW5hbWVTdXBwb3J0X25vdF9hdmFpbGFibGU9UmVuYW1lIHN1cHBvcnQgbm90IGF2YWlsYWJsZQotCi1SZW5hbWVDb21wb25lbnRXaXphcmRfZGVmYXVsdFBhZ2VUaXRsZT1SZW5hbWUgd2l6YXJkCi1SZW5hbWVDb21wb25lbnRXaXphcmRfaW5wdXRQYWdlX2Rlc2NyaXB0aW9uPVJlbmFtZSBYTUwgU2NoZW1hIGNvbXBvbmVudAotCi1SZW5hbWVJbnB1dFdpemFyZFBhZ2VfdXBkYXRlX3JlZmVyZW5jZXM9VXBkYXRlIHJlZmVyZW5jZXMKLVhTRENvbXBvbmVudFJlbmFtZUNoYW5nZV9uYW1lPVhNTCBTY2hlbWEgY29tcG9uZW50IHJlbmFtaW5nIGluIHswfTogezF9IHRvIHsyfQotWFNEQ29tcG9uZW50UmVuYW1lQ2hhbmdlX1JlbmFtaW5nPVJlbmFtaW5nLi4uCi1SZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50X2NvbXBvc2l0ZUNoYW5nZU5hbWU9WFNEIGZpbGUgcmVuYW1lIHJlZmVyZW5jZXMgdXBkYXRpbmcgY2hhbmdlcwotUmVuYW1lUmVzb3VyY2VDaGFuZ2VfcmVuYW1lX3Jlc291cmNlX3JlZmVyZW5jZV9jaGFuZ2U9UmVuYW1pbmcgcmVzb3VyY2UgbmFtZSByZWZlcmVuY2VzCi1YU0RSZW5hbWVSZXNvdXJjZUNoYW5nZV9uYW1lPVJlc291cmNlIHJlbmFtZTogezB9IHRvIHsxfQotUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZ19JbnRlcm5hbF9FcnJvcj1JbnRlcm5hbCBlcnJvcgotUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZ19hbHJlYWRfZXhpc3RzPVJlc291cmNlIGFscmVhZHkgZXhpc3QKLVJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmdfaW52YWxpZE5hbWU9SW52YWxpZCByZXNvdXJjZSBuYW1lCi1SZW5hbWVSZXNvdXJjZVByb2Nlc3Nvcl9uYW1lPVJlc291cmNlIHJlbmFtaW5nCi1NYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbl90ZXh0PU1ha2UgJkFub255bW91cyBUeXBlIEdsb2JhbCAKLU1ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb25fdGV4dD1NYWtlICZMb2NhbCBFbGVtZW50IEdsb2JhbAotWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnRfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXM9WE1MIFNjaGVtYSByZWZhY3RvcmluZyBjaGFuZ2VzCi1XU0RMQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnRfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXM9V1NETCBTY2hlbWEgcmVmYWN0b3JpbmcgY2hhbmdlcwotUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yX0NvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVzPUNvbXBvbmVudCBuYW1lIHJlZmFjdG9yaW5nIGNoYW5nZXMKLVJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvcl9Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlX2RlY2xhdGF0aW9uPVVwZGF0ZSBjb21wb25lbnQgZGVjbGFyYXRpb24vZGVmaW5pdGlvbgotUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yX0NvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVfcmVmZXJlbmNlPVVwZGF0ZSBjb21wb25lbnQgcmVmZXJlbmNlCi1YU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudF94c2RfY29tcG9uZW50X3JlbmFtZV9wYXJ0aWNpcGFudD1YU0QgY29tcG9uZW50IHJlbmFtZSBwYXJ0aWNpcGFudAotV1NETENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50X3dzZGxfY29tcG9uZW50X3JlbmFtZV9wYXJ0aWNpcGFudD1XU0RMIGNvbXBvbmVudCByZW5hbWUgcGFydGljaXBhbnQKLVJlc291cmNlUmVuYW1lUGFydGljaXBhbnRfRmlsZV9SZW5hbWVfdXBkYXRlX3JlZmVyZW5jZT1GaWxlIHJlbmFtZSByZWZhY3RvcmluZyBjaGFuZ2VzCi0KLVJlbmFtZVRhcmdldE5hbWVzcGFjZV90ZXh0PVJlbmFtZSBUYXJnZXQgTmFtZXNwYWNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9JWFNEU2VhcmNoQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9JWFNEU2VhcmNoQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNDY1YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvSVhTRFNlYXJjaENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotCi1wdWJsaWMgaW50ZXJmYWNlIElYU0RTZWFyY2hDb25zdGFudHMgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTFNDSEVNQV9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTRF9DT05URU5UX1RZUEVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgICBUWVBFX01FVEFfTkFNRSA9ICBuZXcgUXVhbGlmaWVkTmFtZSAoWE1MU0NIRU1BX05BTUVTUEFDRSwgInR5cGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgICBDT01QTEVYX1RZUEVfTUVUQV9OQU1FID0gIG5ldyBRdWFsaWZpZWROYW1lIChYTUxTQ0hFTUFfTkFNRVNQQUNFLCAiY29tcGxleFR5cGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgICBTSU1QTEVfVFlQRV9NRVRBX05BTUUgPSAgbmV3IFF1YWxpZmllZE5hbWUgKFhNTFNDSEVNQV9OQU1FU1BBQ0UsICJzaW1wbGVUeXBlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lICAgRUxFTUVOVF9NRVRBX05BTUUgPSAgbmV3IFF1YWxpZmllZE5hbWUgKFhNTFNDSEVNQV9OQU1FU1BBQ0UsICJlbGVtZW50Iik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lICAgQVRUUklCVVRFX01FVEFfTkFNRSA9ICBuZXcgUXVhbGlmaWVkTmFtZSAoWE1MU0NIRU1BX05BTUVTUEFDRSwgImF0dHJpYnV0ZSIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSAgIEFUVFJJQlVURV9HUk9VUF9NRVRBX05BTUUgPSAgbmV3IFF1YWxpZmllZE5hbWUgKFhNTFNDSEVNQV9OQU1FU1BBQ0UsICJhdHRyaWJ1dGVHcm91cCIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSAgIEdST1VQX01FVEFfTkFNRSA9ICBuZXcgUXVhbGlmaWVkTmFtZSAoWE1MU0NIRU1BX05BTUVTUEFDRSwgImdyb3VwIik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaE1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA3N2E4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VhcmNoTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guU2VhcmNoTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU2VhcmNoTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdyb3VwX3JlZmVyZW5jZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmREZWNsYXJhdGlvbkFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZERlY2xhcmF0aW9uc0luUHJvamVjdEFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZERlY2xhcmF0aW9uc0luV29ya2luZ1NldEFjdGlvbl9sYWJlbDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFNlYXJjaE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9YU0RTZWFyY2hDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvWFNEU2VhcmNoQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4OWI1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9YU0RTZWFyY2hDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLkNvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWFyY2hDb250cmlidXRvciBleHRlbmRzIENvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yICB7Ci0gCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVJlZmVyZW5jZXMoKSB7Ci0JCXJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlTdHJpbmcgbnMgPSBJWFNEU2VhcmNoQ29uc3RhbnRzLlhNTFNDSEVNQV9OQU1FU1BBQ0U7Ci0KLQkJTGlzdCBwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKSk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuU1VCU1RJVFVUSU9OR1JPVVBfQVRUUklCVVRFKSk7Ci0JCXJlZmVyZW5jZXMucHV0KElYU0RTZWFyY2hDb25zdGFudHMuRUxFTUVOVF9NRVRBX05BTUUsIHBhdHRlcm5zKTsKLQotCQlwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUpKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKSk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpKTsKLQkJcmVmZXJlbmNlcy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5DT01QTEVYX1RZUEVfTUVUQV9OQU1FLCBwYXR0ZXJucyk7Ci0KLQkJcGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKSk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSkpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSkpOwotCi0JCXJlZmVyZW5jZXMucHV0KElYU0RTZWFyY2hDb25zdGFudHMuU0lNUExFX1RZUEVfTUVUQV9OQU1FLCBwYXR0ZXJucyk7Ci0KLQkJcGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpKTsKLQkJcmVmZXJlbmNlcy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5HUk9VUF9NRVRBX05BTUUsIHBhdHRlcm5zKTsKLQotCQlwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSkpOwotCQlyZWZlcmVuY2VzLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkFUVFJJQlVURV9HUk9VUF9NRVRBX05BTUUsIHBhdHRlcm5zKTsKLQotCQlwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpKTsKLQkJcmVmZXJlbmNlcy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfTUVUQV9OQU1FLCBwYXR0ZXJucyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlY2xhcmF0aW9ucygpewotCQkKLQkJZGVjbGFyYXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RyaW5nIG5zID0gSVhTRFNlYXJjaENvbnN0YW50cy5YTUxTQ0hFTUFfTkFNRVNQQUNFOwotCi0JCVNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLlNDSEVNQV9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0JCWRlY2xhcmF0aW9ucy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRSwgcGF0dGVybik7Ci0KLQkJcGF0dGVybiA9IG5ldyBYTUxTZWFyY2hQYXR0ZXJuKG5zLCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0JCWRlY2xhcmF0aW9ucy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5DT01QTEVYX1RZUEVfTUVUQV9OQU1FLCBwYXR0ZXJuKTsKLQotCQlwYXR0ZXJuID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4obnMsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotCQlkZWNsYXJhdGlvbnMucHV0KElYU0RTZWFyY2hDb25zdGFudHMuU0lNUExFX1RZUEVfTUVUQV9OQU1FLCBwYXR0ZXJuKTsKLQotCQlwYXR0ZXJuID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4obnMsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0JCWRlY2xhcmF0aW9ucy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfTUVUQV9OQU1FLCBwYXR0ZXJuKTsKLQotCQlwYXR0ZXJuID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4obnMsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLQkJZGVjbGFyYXRpb25zLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkFUVFJJQlVURV9HUk9VUF9NRVRBX05BTUUsIHBhdHRlcm4pOwotCi0JCXBhdHRlcm4gPSBuZXcgWE1MU2VhcmNoUGF0dGVybihucywgWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotCQlkZWNsYXJhdGlvbnMucHV0KElYU0RTZWFyY2hDb25zdGFudHMuR1JPVVBfTUVUQV9OQU1FLCBwYXR0ZXJuKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTdXBwb3J0ZWROYW1lc3BhY2VzKCkgewotCQluYW1lc3BhY2VzID0gbmV3IFN0cmluZ1tdeyBJWFNEU2VhcmNoQ29uc3RhbnRzLlhNTFNDSEVNQV9OQU1FU1BBQ0V9OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9YU0RTZWFyY2hQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvWFNEU2VhcmNoUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1MTgwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9YU0RTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5Db21wb25lbnRTZWFyY2hDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxTZWFyY2hQYXJ0aWNpcGFudDsKLQotcHVibGljIGNsYXNzIFhTRFNlYXJjaFBhcnRpY2lwYW50IGV4dGVuZHMgWE1MU2VhcmNoUGFydGljaXBhbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2Quc2VhcmNoLlhTRFNlYXJjaFBhcnRpY2lwYW50IjsKLQotCXB1YmxpYyBYU0RTZWFyY2hQYXJ0aWNpcGFudCgpCi0JewotCSAgc3VwZXIoKTsKLSAgICAgIGlkID0gSUQ7Ci0JfQkKLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ29udGVudFR5cGVzKCkKLQl7Ci0JICBTdHJpbmdbXSByZXN1bHQgPSB7ICJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIiB9OwotCSAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpCi0JewotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybiApewotCQkJWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybiBjb21wb25lbnRQYXR0ZXJuID0gKFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4pcGF0dGVybjsKLQkJCVN0cmluZyBuYW1lc3BhY2UgPSBjb21wb25lbnRQYXR0ZXJuLmdldE1ldGFOYW1lKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQlpZihJWFNEU2VhcmNoQ29uc3RhbnRzLlhNTFNDSEVNQV9OQU1FU1BBQ0UuZXF1YWxzKG5hbWVzcGFjZSkpewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCQotCXB1YmxpYyBDb21wb25lbnRTZWFyY2hDb250cmlidXRvciBnZXRTZWFyY2hDb250cmlidXRvcigpIHsJCQotCQlyZXR1cm4gbmV3IFhTRFNlYXJjaENvbnRyaWJ1dG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvWFNEU2VhcmNoUXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1hTRFNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZmVmYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvWFNEU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLkFic3RyYWN0U2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgWFNEU2VhcmNoUXVlcnkgZXh0ZW5kcyBBYnN0cmFjdFNlYXJjaFF1ZXJ5Ci17ICAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IExJTUlUX1RPX0RFQ0xBUkFUSU9OUyA9IDE7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IExJTUlUX1RPX1JFRkVSRU5DRVMgICA9IDI7ICAKLSAgCi0gIGludCBmTGltaXRUbyA9IDA7Ci0gIElGaWxlIGZDb250ZXh0RmlsZTsKLSAgUXVhbGlmaWVkTmFtZSBmRWxlbWVudFFOYW1lOwotICBRdWFsaWZpZWROYW1lIGZUeXBlTmFtZTsKLSAgCi0gIHB1YmxpYyBYU0RTZWFyY2hRdWVyeShTdHJpbmcgcGF0dGVybiwgSUZpbGUgZmlsZSwgUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZU5hbWUsIGludCBsaW1pdFRvLCBTZWFyY2hTY29wZSBzY29wZSwgU3RyaW5nIHNjb3BlRGVzY3JpcHRpb24pCi0gIHsKLSAgICBzdXBlcihwYXR0ZXJuLCBzY29wZSwgc2NvcGVEZXNjcmlwdGlvbik7Ci0gICAgZkxpbWl0VG8gPSBsaW1pdFRvOwotICAgIGZDb250ZXh0RmlsZSA9IGZpbGU7Ci0gICAgZkVsZW1lbnRRTmFtZSA9IGVsZW1lbnRRTmFtZTsKLSAgICBmVHlwZU5hbWUgPSB0eXBlTmFtZTsKLSAgfQotCi0gIHByb3RlY3RlZCBTZWFyY2hQYXR0ZXJuIGNyZWF0ZVNlYXJjaFBhdHRlcm4oUXVhbGlmaWVkTmFtZSB0eXBlTmFtZSkKLSAgewotICAgIGlmIChmTGltaXRUbyA9PSBMSU1JVF9UT19ERUNMQVJBVElPTlMpCi0gICAgeyAgCi0gICAgICByZXR1cm4gbmV3IFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybihmQ29udGV4dEZpbGUsIGZFbGVtZW50UU5hbWUsIGZUeXBlTmFtZSk7Ci0gICAgfSAgCi0gICAgZWxzZSBpZiAoZkxpbWl0VG8gPT0gTElNSVRfVE9fUkVGRVJFTkNFUykKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4oZkNvbnRleHRGaWxlLCBmRWxlbWVudFFOYW1lLCBmVHlwZU5hbWUpOwotICAgIH0gIAotICAgIHJldHVybiBudWxsOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvQmFzZUdyb3VwQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvQmFzZUdyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjNjY4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0Jhc2VHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8vVE9ETyAodHJ1bmcpIHNob3VsZCBiZSBpbiBjb21tb24udWkgdGhpcyBvbmUgPz8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlR3JvdXBBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSwgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJTWVudUNyZWF0b3IKLXsKLSAgICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiBmU2VsZWN0aW9uOwotICAgIHByaXZhdGUgSUFjdGlvbiBmRGVsZWdhdGVBY3Rpb247Ci0gICAgLy8gd2hldGhlciB0byByZS1maWxsIHRoZSBtZW51IChyZXNldCBvbiBzZWxlY3Rpb24gY2hhbmdlKQotICAgIHByaXZhdGUgYm9vbGVhbiBmRmlsbE1lbnUgPSB0cnVlOwotICAgIHByb3RlY3RlZCBJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0OyAKLSAgICAKLQotICAgIHB1YmxpYyBCYXNlR3JvdXBBY3Rpb25EZWxlZ2F0ZSgpIAotICAgIHsKLQotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLSAgICAgICAgd29ya2JlbmNoUGFydCA9IHRhcmdldFBhcnQ7Ci0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2dldE1lbnUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVudSBnZXRNZW51KENvbnRyb2wgcGFyZW50KSB7Ci0gICAgICAgIC8vIG5ldmVyIGNhbGxlZAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNnZXRNZW51KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnUpCi0gICAgICovCi0gICAgcHVibGljIE1lbnUgZ2V0TWVudShNZW51IHBhcmVudCkgewotICAgICAgICAvL0NyZWF0ZSB0aGUgbmV3IG1lbnUuIFRoZSBtZW51IHdpbGwgZ2V0IGZpbGxlZCB3aGVuIGl0IGlzIGFib3V0IHRvIGJlIHNob3duLiBzZWUgZmlsbE1lbnUoTWVudSkuCi0gICAgICAgIE1lbnUgbWVudSA9IG5ldyBNZW51KHBhcmVudCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGQgbGlzdGVuZXIgdG8gcmVwb3B1bGF0ZSB0aGUgbWVudSBlYWNoIHRpbWUKLSAgICAgICAgICogaXQgaXMgc2hvd24gYmVjYXVzZSBNZW51TWFuYWdlci51cGRhdGUoYm9vbGVhbiwgYm9vbGVhbikgCi0gICAgICAgICAqIGRvZXNuJ3QgZGlzcG9zZSBwdWxsZG93biBBY3Rpb25Db250cmlidXRpb24gaXRlbXMgZm9yIGVhY2ggcG9wdXAgbWVudS4KLSAgICAgICAgICovCi0gICAgICAgIG1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBNZW51QWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChmRmlsbE1lbnUpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVudSBtID0gKE1lbnUpZS53aWRnZXQ7Ci0gICAgICAgICAgICAgICAgICAgIE1lbnVJdGVtW10gaXRlbXMgPSBtLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmlsbE1lbnUobSk7Ci0gICAgICAgICAgICAgICAgICAgIGZGaWxsTWVudSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBtZW51OwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICAvLyBOZXZlciBjYWxsZWQgYmVjYXVzZSB3ZSBiZWNvbWUgYSBtZW51LgotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBmRGVsZWdhdGVBY3Rpb24gPSBhY3Rpb247Ci0gICAgICAgIHVwZGF0ZVdpdGgoc2VsZWN0aW9uKTsKLSAgICAgICAgCi0gICAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0gICAgICAgIHdvcmtiZW5jaFBhcnQgPSB0YXJnZXRFZGl0b3I7Ci0gICAgICAgIGZEZWxlZ2F0ZUFjdGlvbiA9IGFjdGlvbjsKLSAgICAgICAgaWYgKHRhcmdldEVkaXRvciAhPSBudWxsICYmIHRhcmdldEVkaXRvci5nZXRFZGl0b3JTaXRlKCkgIT0gbnVsbCAmJiB0YXJnZXRFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgdXBkYXRlV2l0aCh0YXJnZXRFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgCi0gICAgcHVibGljIHZvaWQgdXBkYXRlV2l0aChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBmU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgICAgICBpZiAoZkRlbGVnYXRlQWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLy9pZiAoKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICl7Ci0gICAgICAgICAgICAgICAgICAgIGVuYWJsZSA9ICFzZWxlY3Rpb24uaXNFbXB0eSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGVuYWJsZSBhY3Rpb24KLSAgICAgICAgICAgIGZEZWxlZ2F0ZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGZpbGwgc3VibWVudQotICAgICAgICAgICAgZkZpbGxNZW51ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZEZWxlZ2F0ZUFjdGlvbi5zZXRNZW51Q3JlYXRvcih0aGlzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIAotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaWxsTWVudShNZW51IG1lbnUpOwotICAgIAotICAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9Db21wb3NpdGVBY3Rpb25Hcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9Db21wb3NpdGVBY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY5MzZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvQ29tcG9zaXRlQWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gVE9ETy4uLiBvcGVuIGEgYnVnemlsbGEgdG8gZ2V0IHRoZSBKRFQgY2xhc3MgbW92ZWQgdG8gbm9uIGludGVybmFsIHBsYXRmb3JtCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVBY3Rpb25Hcm91cCBleHRlbmRzIEFjdGlvbkdyb3VwIHsKLQotICAgIHByaXZhdGUgQWN0aW9uR3JvdXBbXSBmR3JvdXBzOwotICAgIAotICAgIHB1YmxpYyBDb21wb3NpdGVBY3Rpb25Hcm91cCgpIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENvbXBvc2l0ZUFjdGlvbkdyb3VwKEFjdGlvbkdyb3VwW10gZ3JvdXBzKSB7Ci0gICAgICAgIHNldEdyb3Vwcyhncm91cHMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldEdyb3VwcyhBY3Rpb25Hcm91cFtdIGdyb3VwcykgewotICAgICAgICBBc3NlcnQuaXNUcnVlKGZHcm91cHMgPT0gbnVsbCk7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoZ3JvdXBzKTsKLSAgICAgICAgZkdyb3Vwcz0gZ3JvdXBzOyAgICAgICAgCi0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgQWN0aW9uR3JvdXAgZ2V0KGludCBpbmRleCkgewotICAgICAgICBpZiAoZkdyb3VwcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBmR3JvdXBzW2luZGV4XTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkR3JvdXAoQWN0aW9uR3JvdXAgZ3JvdXApIHsKLSAgICAgICAgaWYgKGZHcm91cHMgPT0gbnVsbCkgewotICAgICAgICAgICAgZkdyb3Vwcz0gbmV3IEFjdGlvbkdyb3VwW10geyBncm91cCB9OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQWN0aW9uR3JvdXBbXSBuZXdHcm91cHM9IG5ldyBBY3Rpb25Hcm91cFtmR3JvdXBzLmxlbmd0aCArIDFdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmR3JvdXBzLCAwLCBuZXdHcm91cHMsIDAsIGZHcm91cHMubGVuZ3RoKTsKLSAgICAgICAgICAgIG5ld0dyb3Vwc1tmR3JvdXBzLmxlbmd0aF09IGdyb3VwOwotICAgICAgICAgICAgZkdyb3Vwcz0gbmV3R3JvdXBzOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgaWYgKGZHcm91cHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZm9yIChpbnQgaT0gMDsgaSA8IGZHcm91cHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZHcm91cHNbaV0uZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotICAgICAgICBzdXBlci5maWxsQWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLSAgICAgICAgaWYgKGZHcm91cHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZm9yIChpbnQgaT0gMDsgaSA8IGZHcm91cHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZHcm91cHNbaV0uZmlsbEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLSAgICAgICAgc3VwZXIuZmlsbENvbnRleHRNZW51KG1lbnUpOwotICAgICAgICBpZiAoZkdyb3VwcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBmb3IgKGludCBpPSAwOyBpIDwgZkdyb3Vwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZkdyb3Vwc1tpXS5maWxsQ29udGV4dE1lbnUobWVudSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEFjdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlci5zZXRDb250ZXh0KGNvbnRleHQpOwotICAgICAgICBpZiAoZkdyb3VwcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBmb3IgKGludCBpPSAwOyBpIDwgZkdyb3Vwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZkdyb3Vwc1tpXS5zZXRDb250ZXh0KGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQWN0aW9uQmFycygpIHsKLSAgICAgICAgc3VwZXIudXBkYXRlQWN0aW9uQmFycygpOwotICAgICAgICBpZiAoZkdyb3VwcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBmb3IgKGludCBpPSAwOyBpIDwgZkdyb3Vwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZkdyb3Vwc1tpXS51cGRhdGVBY3Rpb25CYXJzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0RlY2xhcmF0aW9uc1NlYXJjaEdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0RlY2xhcmF0aW9uc1NlYXJjaEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MzA4ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9EZWNsYXJhdGlvbnNTZWFyY2hHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi0vLyBUT0RPLi4gZmlsbCBpbiB0aGUgY29udGVudAotcHVibGljIGNsYXNzIERlY2xhcmF0aW9uc1NlYXJjaEdyb3VwCi17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ZpbmRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzVhMTc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotcHVibGljIGNsYXNzIEZpbmRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3I7Ci0KLSAgcHJvdGVjdGVkIEZpbmRBY3Rpb24oSUVkaXRvclBhcnQgZWRpdG9yKQotICB7Ci0gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1MzM1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuV29ya3NwYWNlU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuSVNlbGVjdGlvbk1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLlhTRFNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLXB1YmxpYyBjbGFzcyBGaW5kUmVmZXJlbmNlc0FjdGlvbiBleHRlbmRzIEZpbmRBY3Rpb24KLXsKLSAgcHVibGljIEZpbmRSZWZlcmVuY2VzQWN0aW9uKElFZGl0b3JQYXJ0IGVkaXRvcikKLSAgewotICAgIHN1cGVyKGVkaXRvcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBY3Rpb25EZWZpbml0aW9uSWQoU3RyaW5nIHN0cmluZykKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFRvIGJlIHVzZWQgYnkgc3ViY2xhc3MgaW4gaXRzIHJ1bigpIFJldHVybnMgdGhlIGZpbGUgd2hlcmUgdGhlIHNlbGVjdGlvbiBvZgotICAgKiBhIGNvbXBvbmVudCAoZnJvbSB0aGUgdXNlcikgb2NjdXJzIGllLiBSZXR1cm5zIHRoZSBmaWxlIHRoYXQgdGhlIHVzZXIgaXMKLSAgICogY3VycmVudGx5IHdvcmtpbmcgb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBJRmlsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCB3b3JraW5nIGZpbGUuCi0gICAqLwotICBwcm90ZWN0ZWQgSUZpbGUgZ2V0Q3VycmVudEZpbGUoKQotICB7Ci0gICAgaWYgKGVkaXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgIHsKLSAgICAgICAgSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0gICAgICAgIHJldHVybiBmaWxlRWRpdG9ySW5wdXQuZ2V0RmlsZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBUbyBiZSB1c2VkIGJ5IHN1YmNsYXNzIGluIGl0cyBydW4oKS4uIERldGVybWluZXMgdGhlIG1ldGFOYW1lIG9mIHRoZSBYU0QKLSAgICogY29tcG9uZW50IGdpdmVuIHRvIHRoaXMgbWV0aG9kLgotICAgKiAKLSAgICogQHBhcmFtIGNvbXBvbmVudAotICAgKiAgICAgICAgICBUaGUgY29tcG9uZW50IG9mIHdoaWNoIHdlIHdhbnQgdG8gZGV0ZXJtaW5lIHRoZSBuYW1lCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHByb3RlY3RlZCBRdWFsaWZpZWROYW1lIGRldGVybWluZU1ldGFOYW1lKFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIFF1YWxpZmllZE5hbWUgbWV0YU5hbWUgPSBudWxsOwotICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgbWV0YU5hbWUgPSBJWFNEU2VhcmNoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRV9NRVRBX05BTUU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG1ldGFOYW1lID0gSVhTRFNlYXJjaENvbnN0YW50cy5TSU1QTEVfVFlQRV9NRVRBX05BTUU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBtZXRhTmFtZSA9IElYU0RTZWFyY2hDb25zdGFudHMuRUxFTUVOVF9NRVRBX05BTUU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG1ldGFOYW1lID0gSVhTRFNlYXJjaENvbnN0YW50cy5HUk9VUF9NRVRBX05BTUU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBtZXRhTmFtZSA9IElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX0dST1VQX01FVEFfTkFNRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgewotICAgICAgbWV0YU5hbWUgPSBJWFNEU2VhcmNoQ29uc3RhbnRzLkFUVFJJQlVURV9NRVRBX05BTUU7Ci0gICAgfQotICAgIHJldHVybiBtZXRhTmFtZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTRE5hbWVkQ29tcG9uZW50IGdldFhTRE5hbWVkQ29tcG9uZW50KCkKLSAgewotICAgIGlmIChlZGl0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSAoSVNlbGVjdGlvblByb3ZpZGVyKSBlZGl0b3IuZ2V0QWRhcHRlcihJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgICAgSVNlbGVjdGlvbk1hcHBlciBtYXBwZXIgPSAoSVNlbGVjdGlvbk1hcHBlcikgZWRpdG9yLmdldEFkYXB0ZXIoSVNlbGVjdGlvbk1hcHBlci5jbGFzcyk7Ci0gICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBwcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKG1hcHBlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2VsZWN0aW9uID0gbWFwcGVyLm1hcFNlbGVjdGlvbihzZWxlY3Rpb24pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgICBPYmplY3QgbyA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgaWYgKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChYU0ROYW1lZENvbXBvbmVudCkgbzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gVGhlIGV4cGVjdGVkIGNvbXBvbmVudCB3ZSBnZXQgZnJvbSB0aGUgZWRpdG9yIGRvZXMgbm90IG1lZXQKLSAgICAvLyBvdXIgZXhwZWN0YXRpb24KLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIFN0cmluZyBwYXR0ZXJuID0gIiI7Ci0gICAgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0WFNETmFtZWRDb21wb25lbnQoKTsKLSAgICBJRmlsZSBmaWxlID0gZ2V0Q3VycmVudEZpbGUoKTsKLSAgICBpZiAoZmlsZSAhPSBudWxsICYmIGNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIFF1YWxpZmllZE5hbWUgbWV0YU5hbWUgPSBkZXRlcm1pbmVNZXRhTmFtZShjb21wb25lbnQpOwotICAgICAgUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShjb21wb25lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgU2VhcmNoU2NvcGUgc2NvcGUgPSBuZXcgV29ya3NwYWNlU2VhcmNoU2NvcGUoKTsKLSAgICAgIFN0cmluZyBzY29wZURlc2NyaXB0aW9uID0gIldvcmtzcGFjZSI7Ci0gICAgICBYU0RTZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSA9IG5ldyBYU0RTZWFyY2hRdWVyeShwYXR0ZXJuLCBmaWxlLCBlbGVtZW50UU5hbWUsIG1ldGFOYW1lLCBYU0RTZWFyY2hRdWVyeS5MSU1JVF9UT19SRUZFUkVOQ0VTLCBzY29wZSwgc2NvcGVEZXNjcmlwdGlvbik7Ci0gICAgICBOZXdTZWFyY2hVSS5hY3RpdmF0ZVNlYXJjaFJlc3VsdFZpZXcoKTsKLSAgICAgIE5ld1NlYXJjaFVJLnJ1blF1ZXJ5SW5CYWNrZ3JvdW5kKHNlYXJjaFF1ZXJ5KTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0ZjI1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlByb2plY3RTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5YU0RTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1wdWJsaWMgY2xhc3MgRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24gZXh0ZW5kcyBGaW5kUmVmZXJlbmNlc0FjdGlvbgotewotICBwdWJsaWMgRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24oSUVkaXRvclBhcnQgZWRpdG9yKQotICB7Ci0gICAgc3VwZXIoZWRpdG9yKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBTdHJpbmcgcGF0dGVybiA9ICIiOwotICAgIFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldFhTRE5hbWVkQ29tcG9uZW50KCk7Ci0gICAgSUZpbGUgZmlsZSA9IGdldEN1cnJlbnRGaWxlKCk7Ci0gICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBjb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBRdWFsaWZpZWROYW1lIG1ldGFOYW1lID0gZGV0ZXJtaW5lTWV0YU5hbWUoY29tcG9uZW50KTsKLSAgICAgIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lID0gbmV3IFF1YWxpZmllZE5hbWUoY29tcG9uZW50LmdldFRhcmdldE5hbWVzcGFjZSgpLCBjb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgIElQYXRoIGZ1bGxQYXRoID0gZmlsZS5nZXRGdWxsUGF0aCgpOwotICAgICAgUHJvamVjdFNlYXJjaFNjb3BlIHNjb3BlID0gbmV3IFByb2plY3RTZWFyY2hTY29wZShmdWxsUGF0aCk7Ci0gICAgICBTdHJpbmcgc2NvcGVEZXNjcmlwdGlvbiA9ICJQcm9qZWN0IjsKLSAgICAgIFhTRFNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5ID0gbmV3IFhTRFNlYXJjaFF1ZXJ5KHBhdHRlcm4sIGZpbGUsIGVsZW1lbnRRTmFtZSwgbWV0YU5hbWUsIFhTRFNlYXJjaFF1ZXJ5LkxJTUlUX1RPX1JFRkVSRU5DRVMsIHNjb3BlLCBzY29wZURlc2NyaXB0aW9uKTsKLSAgICAgIE5ld1NlYXJjaFVJLmFjdGl2YXRlU2VhcmNoUmVzdWx0VmlldygpOwotICAgICAgTmV3U2VhcmNoVUkucnVuUXVlcnlJbkJhY2tncm91bmQoc2VhcmNoUXVlcnkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzcxMGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JV29ya2luZ1NldFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLldvcmtpbmdTZXRTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guWFNEU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24gZXh0ZW5kcyBGaW5kUmVmZXJlbmNlc0FjdGlvbnsKLQotCXB1YmxpYyBGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aW9uRGVmaW5pdGlvbklkKFN0cmluZyBzdHJpbmcpCi0JewotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJSVdvcmtpbmdTZXRbXSB3b3JraW5nU2V0cyA9IHF1ZXJ5V29ya2luZ1NldHMoKTsKLQkJaWYgKCB3b3JraW5nU2V0cyA9PSBudWxsIHx8IHdvcmtpbmdTZXRzLmxlbmd0aCA9PSAwKQotCQkJLy8gVGhlIHVzZXIgY2hvb3NlcyBub3RoaW5nLCBubyBwb2ludCB0byBjb250aW51ZS4KLQkJCXJldHVybjsKLQkJU3RyaW5nIHBhdHRlcm4gPSAiIjsKLQotCQlYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQgPSBnZXRYU0ROYW1lZENvbXBvbmVudCgpOwotCQlJRmlsZSBmaWxlID0gZ2V0Q3VycmVudEZpbGUoKTsKLQkJaWYgKCBmaWxlICE9IG51bGwgJiYgY29tcG9uZW50ICE9IG51bGwpewotCQkJUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSA9IGRldGVybWluZU1ldGFOYW1lKGNvbXBvbmVudCk7Ci0KLQkJCVF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lID0gCi0JCQkJbmV3IFF1YWxpZmllZE5hbWUoY29tcG9uZW50LmdldFRhcmdldE5hbWVzcGFjZSgpLCBjb21wb25lbnQuZ2V0TmFtZSgpKTsKLQotCQkJLy8gQ3JlYXRlIGEgc2NvcGUgZnJvbSB0aGUgc2VsZWN0ZWQgd29ya2luZyBzZXRzCi0JCQlXb3JraW5nU2V0U2VhcmNoU2NvcGUgc2NvcGUgPSBuZXcgV29ya2luZ1NldFNlYXJjaFNjb3BlKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdvcmtpbmdTZXRzLmxlbmd0aDsgaSsrKXsKLQkJCQlJQWRhcHRhYmxlW10gZWxlbWVudHMgPSB3b3JraW5nU2V0c1tpXS5nZXRFbGVtZW50cygpOwotCQkJCXNjb3BlLmFkZEFXb3JraW5nU2V0VG9TY29wZShlbGVtZW50cyk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBzY29wZURlc2NyaXB0aW9uID0gIldvcmtpbmcgU2V0IjsgICAgCi0JCQlYU0RTZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSA9IAotCQkJCW5ldyBYU0RTZWFyY2hRdWVyeShwYXR0ZXJuLCBmaWxlLCBlbGVtZW50UU5hbWUsIG1ldGFOYW1lLCBYU0RTZWFyY2hRdWVyeS5MSU1JVF9UT19SRUZFUkVOQ0VTLCBzY29wZSwgc2NvcGVEZXNjcmlwdGlvbik7ICAgIAotCQkJTmV3U2VhcmNoVUkuYWN0aXZhdGVTZWFyY2hSZXN1bHRWaWV3KCk7Ci0JCQlOZXdTZWFyY2hVSS5ydW5RdWVyeUluQmFja2dyb3VuZChzZWFyY2hRdWVyeSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyBhIGRpYWxvZyBhc2tpbmcgdGhlIHVzZXIgdG8gY2hvb3NlIHRoZSB3b3JraW5nIFNldHMgaGUgd2FudHMKLQkgKiB0byBkbyB0aGUgc2VhcmNoIG9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtpbmdTZXRbXSBxdWVyeVdvcmtpbmdTZXRzKCl7Ci0JCVNoZWxsIHNoZWxsPSBYU0RFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKTsKLQkJaWYgKHNoZWxsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0KLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2luZ1NldE1hbmFnZXIoKS5jcmVhdGVXb3JraW5nU2V0U2VsZWN0aW9uRGlhbG9nKHNoZWxsLCB0cnVlKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzPSBkaWFsb2cuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAod29ya2luZ1NldHMubGVuZ3RoID4gMCkKLQkJCQlyZXR1cm4gd29ya2luZ1NldHM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9JbXBsZW1lbnRvcnNTZWFyY2hHcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9JbXBsZW1lbnRvcnNTZWFyY2hHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWZjOGZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvSW1wbGVtZW50b3JzU2VhcmNoR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotLy8gVE9ETy4uLiBmaWxsIGluIHRoZSBjb250ZW50Ci1wdWJsaWMgY2xhc3MgSW1wbGVtZW50b3JzU2VhcmNoR3JvdXAKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvT2NjdXJyZW5jZXNTZWFyY2hHcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9PY2N1cnJlbmNlc1NlYXJjaEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2M2UyNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9PY2N1cnJlbmNlc1NlYXJjaEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLS8vIFRPRE8uLi4gZmlsbCBpbiB0aGUgY29udGVudAotcHVibGljIGNsYXNzIE9jY3VycmVuY2VzU2VhcmNoR3JvdXAKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvUmVmZXJlbmNlc1NlYXJjaEdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1JlZmVyZW5jZXNTZWFyY2hHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjk4NGIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvUmVmZXJlbmNlc1NlYXJjaEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLlNlYXJjaE1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlc1NlYXJjaEdyb3VwIGV4dGVuZHMgU2VhcmNoR3JvdXAgIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRU5VX1RFWFQ9IFNlYXJjaE1lc3NhZ2VzLmdyb3VwX3JlZmVyZW5jZXM7IAotCi0gICAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0gICAgcHJpdmF0ZSBJV29ya2JlbmNoU2l0ZSBmU2l0ZTsKLSAgICBwcml2YXRlIElBY3Rpb25CYXJzIGZBY3Rpb25CYXJzOwotICAgIAotLy8gICAgcHJpdmF0ZSBTdHJpbmcgZkdyb3VwSWQ7Ci0gICAgCi0gICAgcHJvdGVjdGVkIEZpbmRBY3Rpb24gZkZpbmRSZWZlcmVuY2VzQWN0aW9uOwotICAgIHByb3RlY3RlZCBGaW5kQWN0aW9uIGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbjsKLSAgICBwcm90ZWN0ZWQgRmluZEFjdGlvbiBmRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb247Ci0KLQotICAgIC8qKgotICAgICAqIE5vdGU6IFRoaXMgY29uc3RydWN0b3IgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIGNvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSBlZGl0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVmZXJlbmNlc1NlYXJjaEdyb3VwKElFZGl0b3JQYXJ0IGVkaXRvcikgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGVkaXRvcik7Ci0gICAgICAgIGZFZGl0b3I9IGVkaXRvcjsKLSAgICAgICAgZlNpdGU9IGZFZGl0b3IuZ2V0U2l0ZSgpOwotICAgICAgICAKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotLy8gICAgICBmR3JvdXBJZD0gSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfRklORDsKLQotICAgICAgICBmRmluZFJlZmVyZW5jZXNBY3Rpb249IG5ldyBGaW5kUmVmZXJlbmNlc0FjdGlvbihmRWRpdG9yKTsKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzQWN0aW9uLnNldFRleHQoU2VhcmNoTWVzc2FnZXMuU2VhcmNoX0ZpbmREZWNsYXJhdGlvbkFjdGlvbl9sYWJlbCk7Ci0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0FjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoIlNFQVJDSF9SRUZFUkVOQ0VTX0lOX1dPUktTUEFDRSIpOwotICAgICAgICAvL2ZFZGl0b3Iuc2V0QWN0aW9uKCJTZWFyY2hSZWZlcmVuY2VzSW5Xb3Jrc3BhY2UiLCBmRmluZFJlZmVyZW5jZXNBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uPSBuZXcgRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24oZkVkaXRvcik7Ci0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbi5zZXRUZXh0KFNlYXJjaE1lc3NhZ2VzLlNlYXJjaF9GaW5kRGVjbGFyYXRpb25zSW5Qcm9qZWN0QWN0aW9uX2xhYmVsKTsgICAgICAgIAotICAgICAgICBmRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJTRUFSQ0hfUkVGRVJFTkNFU19JTl9QUk9KRUNUIik7Ci0gICAgICAgIC8vZkVkaXRvci5zZXRBY3Rpb24oIlNlYXJjaFJlZmVyZW5jZXNJblByb2plY3QiLCBmRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbj0gbmV3IEZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uKGZFZGl0b3IpOwotICAgICAgICBmRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24uc2V0VGV4dChTZWFyY2hNZXNzYWdlcy5TZWFyY2hfRmluZERlY2xhcmF0aW9uc0luV29ya2luZ1NldEFjdGlvbl9sYWJlbCk7ICAgICAgICAgCi0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoIi5TRUFSQ0hfUkVGRVJFTkNFU19JTl9XT1JLSU5HX1NFVCIpOwotICAgICAgICAvL2ZFZGl0b3Iuc2V0QWN0aW9uKCJTZWFyY2hSZWZlcmVuY2VzSW5Xb3JraW5nU2V0IiwgZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uKTsgLy8kTk9OLU5MUy0xJCAgICAJCi0gICAgfQotCi0gICAgLyoKLSAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJBY3Rpb24oU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGFjdGlvbi51cGRhdGUoc2VsZWN0aW9uKTsKLSAgICAgICAgcHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGFjdGlvbik7Ci0gICAgfSovCi0KLSAgICAvKioKLSAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1lbnUgbGFiZWwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBNRU5VX1RFWFQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGZpbGxBY3Rpb25zKExpc3QgbGlzdCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZChmRmluZFJlZmVyZW5jZXNBY3Rpb24pOwotICAgICAgLy9saXN0LmFkZChmRmluZFJlZmVyZW5jZXNJbkhpZXJhcmNoeUFjdGlvbik7Ci0gICAgICBsaXN0LmFkZChmRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24pOwotICAgICAgbGlzdC5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgIGxpc3QuYWRkKGZGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbik7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgaW4gQWN0aW9uR3JvdXAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoYWN0aW9uQmFycyk7Ci0gICAgICAgIHN1cGVyLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotICAgICAgICBmQWN0aW9uQmFycz0gYWN0aW9uQmFyczsKLSAgICAgICAgdXBkYXRlR2xvYmFsQWN0aW9uSGFuZGxlcnMoKTsKLSAgICB9Ci0KLSAgICAKLS8vICAgIHByaXZhdGUgdm9pZCBhZGRBY3Rpb24oSUFjdGlvbiBhY3Rpb24sIElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0vLyAgICAgICAgaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSkgewotLy8gICAgICAgICAgICBtYW5hZ2VyLmFkZChhY3Rpb24pOwotLy8gICAgICAgIH0KLS8vICAgIH0KLQotICAgIC8qCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFdvcmtpbmdTZXRBY3Rpb24oSVdvcmtpbmdTZXRbXSB3b3JraW5nU2V0cywgSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgRmluZEFjdGlvbiBhY3Rpb247Ci0gICAgICAgIGlmIChmRWRpdG9yICE9IG51bGwpCi0gICAgICAgICAgICBhY3Rpb249IG5ldyBXb3JraW5nU2V0RmluZEFjdGlvbihmRWRpdG9yLCBuZXcgRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24oZkVkaXRvciwgd29ya2luZ1NldHMpLCBTZWFyY2hVdGlsLnRvU3RyaW5nKHdvcmtpbmdTZXRzKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFjdGlvbj0gbmV3IFdvcmtpbmdTZXRGaW5kQWN0aW9uKGZTaXRlLCBuZXcgRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24oZlNpdGUsIHdvcmtpbmdTZXRzKSwgU2VhcmNoVXRpbC50b1N0cmluZyh3b3JraW5nU2V0cykpOwotICAgICAgICBhY3Rpb24udXBkYXRlKGdldENvbnRleHQoKS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGFkZEFjdGlvbihhY3Rpb24sIG1hbmFnZXIpOwotICAgIH0KLSAgICAqLwotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQWN0aW9uR3JvdXAuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAvKgotICAgICAgICBNZW51TWFuYWdlciBqYXZhU2VhcmNoTU09IG5ldyBNZW51TWFuYWdlcihnZXROYW1lKCksIElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9TRUFSQ0gpOwotICAgICAgICBhZGRBY3Rpb24oZkZpbmRSZWZlcmVuY2VzQWN0aW9uLCBqYXZhU2VhcmNoTU0pOwotICAgICAgICBhZGRBY3Rpb24oZkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uLCBqYXZhU2VhcmNoTU0pOwotICAgICAgICBhZGRBY3Rpb24oZkZpbmRSZWZlcmVuY2VzSW5IaWVyYXJjaHlBY3Rpb24sIGphdmFTZWFyY2hNTSk7Ci0gICAgICAgIAotICAgICAgICBqYXZhU2VhcmNoTU0uYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIAotICAgICAgICBJdGVyYXRvciBpdGVyPSBTZWFyY2hVdGlsLmdldExSVVdvcmtpbmdTZXRzKCkuc29ydGVkSXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBhZGRXb3JraW5nU2V0QWN0aW9uKChJV29ya2luZ1NldFtdKSBpdGVyLm5leHQoKSwgamF2YVNlYXJjaE1NKTsKLSAgICAgICAgfQotICAgICAgICBhZGRBY3Rpb24oZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLCBqYXZhU2VhcmNoTU0pOwotCi0gICAgICAgIGlmICghamF2YVNlYXJjaE1NLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIG1hbmFnZXIuYXBwZW5kVG9Hcm91cChmR3JvdXBJZCwgamF2YVNlYXJjaE1NKTsKLSAgICAgICAgKi8gICAgCi0gICAgfQotICAgIAotICAgIC8qIAotICAgICAqIE92ZXJyaWRlcyBtZXRob2QgZGVjbGFyZWQgaW4gQWN0aW9uR3JvdXAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXI9IGZTaXRlLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0gICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNwb3NlQWN0aW9uKGZGaW5kUmVmZXJlbmNlc0FjdGlvbiwgcHJvdmlkZXIpOwotICAgICAgICAgICAgZGlzcG9zZUFjdGlvbihmRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24sIHByb3ZpZGVyKTsKLSAgICAgICAgICAvLyAgZGlzcG9zZUFjdGlvbihmRmluZFJlZmVyZW5jZXNJbkhpZXJhcmNoeUFjdGlvbiwgcHJvdmlkZXIpOwotICAgICAgICAgICAgZGlzcG9zZUFjdGlvbihmRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24sIHByb3ZpZGVyKTsKLSAgICAgICAgfQotICAgICAgICBmRmluZFJlZmVyZW5jZXNBY3Rpb249IG51bGw7Ci0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbj0gbnVsbDsKLSAgICAgICAgLy9mRmluZFJlZmVyZW5jZXNJbkhpZXJhcmNoeUFjdGlvbj0gbnVsbDsKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uPSBudWxsOwotICAgICAgICB1cGRhdGVHbG9iYWxBY3Rpb25IYW5kbGVycygpOwotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUdsb2JhbEFjdGlvbkhhbmRsZXJzKCkgewotICAgICAgICBpZiAoZkFjdGlvbkJhcnMgIT0gbnVsbCkgewotLy8gICAgICAgICAgICBmQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEpkdEFjdGlvbkNvbnN0YW50cy5GSU5EX1JFRkVSRU5DRVNfSU5fV09SS1NQQUNFLCBmRmluZFJlZmVyZW5jZXNBY3Rpb24pOwotLy8gICAgICAgICAgICBmQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEpkdEFjdGlvbkNvbnN0YW50cy5GSU5EX1JFRkVSRU5DRVNfSU5fUFJPSkVDVCwgZkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uKTsKLS8vICAgICAgICAgICAgZkFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihKZHRBY3Rpb25Db25zdGFudHMuRklORF9SRUZFUkVOQ0VTX0lOX0hJRVJBUkNIWSwgZkZpbmRSZWZlcmVuY2VzSW5IaWVyYXJjaHlBY3Rpb24pOwotLy8gICAgICAgICAgICBmQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEpkdEFjdGlvbkNvbnN0YW50cy5GSU5EX1JFRkVSRU5DRVNfSU5fV09SS0lOR19TRVQsIGZGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGlzcG9zZUFjdGlvbihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGFjdGlvbiwgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIHByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihhY3Rpb24pOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1NlYXJjaEdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1NlYXJjaEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MDcxYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9TZWFyY2hHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlYXJjaEdyb3VwIGV4dGVuZHMgQWN0aW9uR3JvdXAKLXsKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgZmlsbEFjdGlvbnMoTGlzdCBsaXN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoQWN0aW9uR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoQWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2ODQ2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaEFjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwOwotCi1wdWJsaWMgY2xhc3MgWFNEU2VhcmNoQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cAotewotLy8gIHByaXZhdGUgUmVmZXJlbmNlc1NlYXJjaEdyb3VwIGZSZWZlcmVuY2VzR3JvdXA7Ci0vLyAgcHJpdmF0ZSBEZWNsYXJhdGlvbnNTZWFyY2hHcm91cCBmRGVjbGFyYXRpb25zR3JvdXA7Ci0vLyAgcHJpdmF0ZSBJbXBsZW1lbnRvcnNTZWFyY2hHcm91cCBmSW1wbGVtZW50b3JzR3JvdXA7Ci0vLyAgcHJpdmF0ZSBPY2N1cnJlbmNlc1NlYXJjaEdyb3VwIGZPY2N1cnJlbmNlc0dyb3VwOwotLy8gIHByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQotICBwdWJsaWMgWFNEU2VhcmNoQWN0aW9uR3JvdXAoSUVkaXRvclBhcnQgZWRpdG9yKQotICB7Ci0gICAgQXNzZXJ0LmlzTm90TnVsbChlZGl0b3IpOwotLy8gICAgZkVkaXRvciA9IGVkaXRvcjsKLS8vICAgIGZSZWZlcmVuY2VzR3JvdXAgPSBuZXcgUmVmZXJlbmNlc1NlYXJjaEdyb3VwKGVkaXRvcik7Ci0vLyAgICBmRGVjbGFyYXRpb25zR3JvdXAgPSBuZXcgRGVjbGFyYXRpb25zU2VhcmNoR3JvdXAoKTsKLS8vICAgIGZJbXBsZW1lbnRvcnNHcm91cCA9IG5ldyBJbXBsZW1lbnRvcnNTZWFyY2hHcm91cCgpOwotLy8gICAgZk9jY3VycmVuY2VzR3JvdXAgPSBuZXcgT2NjdXJyZW5jZXNTZWFyY2hHcm91cCgpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hEZWNsYXJhdGlvbnNHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaERlY2xhcmF0aW9uc0dyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjNTVjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaERlY2xhcmF0aW9uc0dyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci0KLS8vb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9ucy5YU0RTZWFyY2hHcm91cEFjdGlvbkRlbGVnYXRlCi1wdWJsaWMgY2xhc3MgWFNEU2VhcmNoRGVjbGFyYXRpb25zR3JvdXBBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEJhc2VHcm91cEFjdGlvbkRlbGVnYXRlCi17Ci0gICAgcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnUoTWVudSBtZW51KSB7Ci0KLSAgICB9ICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hHcm91cFN1Yk1lbnUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoR3JvdXBTdWJNZW51LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYzM1OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hHcm91cFN1Yk1lbnUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Db21wb3VuZENvbnRyaWJ1dGlvbkl0ZW07Ci0KLS8vIFRPRE8gc2hvdWxkIGJlIGluIGNvbW1vbi51aQotcHVibGljIGNsYXNzIFhTRFNlYXJjaEdyb3VwU3ViTWVudSBleHRlbmRzIENvbXBvdW5kQ29udHJpYnV0aW9uSXRlbQotewotICBTZWFyY2hHcm91cCBzZWFyY2hBY3Rpb25Hcm91cDsKLQotICBwdWJsaWMgWFNEU2VhcmNoR3JvdXBTdWJNZW51KFNlYXJjaEdyb3VwIHJlZmFjdG9yTWVudUdyb3VwKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZWFyY2hBY3Rpb25Hcm91cCA9IHJlZmFjdG9yTWVudUdyb3VwOwotICB9Ci0KLSAgcHVibGljIFhTRFNlYXJjaEdyb3VwU3ViTWVudShTdHJpbmcgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBnZXRDb250cmlidXRpb25JdGVtcygpCi0gIHsKLSAgICBBcnJheUxpc3QgYWN0aW9uc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgQXJyYXlMaXN0IGNvbnRyaWJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHNlYXJjaEFjdGlvbkdyb3VwLmZpbGxBY3Rpb25zKGFjdGlvbnNMaXN0KTsKLSAgICBpZiAoYWN0aW9uc0xpc3QgIT0gbnVsbCAmJiAhYWN0aW9uc0xpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGlvbnNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJQWN0aW9uKQotICAgICAgICB7ICAKLSAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IChJQWN0aW9uKW87Ci0gICAgICAgICAgY29udHJpYkxpc3QuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTZXBhcmF0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICBTZXBhcmF0b3Igc2VwYXJhdG9yID0gKFNlcGFyYXRvcilvOwotICAgICAgICAgIGNvbnRyaWJMaXN0LmFkZChzZXBhcmF0b3IpOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEFjdGlvbiBkdW1teUFjdGlvbiA9IG5ldyBBY3Rpb24oIlhTRFNlYWNoQWN0aW9uR3JvdXBfbm9fcmVmYWN0b3JpbmdfYXZhaWxhYmxlIikgLy9UT0RPIHdyb25nIHN0cmluZyBoZXJlID8/Ci0gICAgICB7Ci0gICAgICAgIC8vIGR1bW15IGlubmVyIGNsYXNzOyBubyBtZXRob2RzCi0gICAgICB9OwotICAgICAgZHVtbXlBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICBjb250cmliTGlzdC5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oZHVtbXlBY3Rpb24pKTsKLSAgICB9Ci0gICAgcmV0dXJuIChJQ29udHJpYnV0aW9uSXRlbVtdKSBjb250cmliTGlzdC50b0FycmF5KG5ldyBJQ29udHJpYnV0aW9uSXRlbVtjb250cmliTGlzdC5zaXplKCldKTsgICAgICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaFJlZmVyZW5jZXNHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaFJlZmVyZW5jZXNHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTQ3YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hSZWZlcmVuY2VzR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci0KLS8vb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9ucy5YU0RTZWFyY2hHcm91cEFjdGlvbkRlbGVnYXRlCi1wdWJsaWMgY2xhc3MgWFNEU2VhcmNoUmVmZXJlbmNlc0dyb3VwQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBCYXNlR3JvdXBBY3Rpb25EZWxlZ2F0ZQotewotICAgIHByb3RlY3RlZCB2b2lkIGZpbGxNZW51KE1lbnUgbWVudSkgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChmU2VsZWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAod29ya2JlbmNoUGFydCAhPSBudWxsKQotICAgICAgICB7Ci0JCSAgSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSB3b3JrYmVuY2hQYXJ0LmdldFNpdGUoKTsKLQkJCWlmIChzaXRlID09IG51bGwpCi0JCQkgIHJldHVybjsKLQkKLQkJICBJRWRpdG9yUGFydCBlZGl0b3IgPSBzaXRlLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICBpZiAoIGVkaXRvciAhPSBudWxsICl7Ci0gICAgICAgICAgICBSZWZlcmVuY2VzU2VhcmNoR3JvdXAgcmVmZXJlbmNlc0dyb3VwID0gbmV3IFJlZmVyZW5jZXNTZWFyY2hHcm91cChlZGl0b3IpOwotICAgICAgICAgICAgWFNEU2VhcmNoR3JvdXBTdWJNZW51IHN1Yk1lbnUgPSBuZXcgWFNEU2VhcmNoR3JvdXBTdWJNZW51KHJlZmVyZW5jZXNHcm91cCk7Ci0gICAgICAgICAgICBzdWJNZW51LmZpbGwobWVudSwgLTEpOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1NDVlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MDk4NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDRlMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jVHVlIE1heSAxOSAwMzoxMjoxNiBFRFQgMjAwOQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE3NjA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1R1ZSBNYXkgMTkgMDM6MTI6MTcgRURUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiMjkyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS5oZWxwLnVpCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy9NRVRBLUlORi9lY2xpcHNlLmluZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzL01FVEEtSU5GL2VjbGlwc2UuaW5mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzhlMmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzL01FVEEtSU5GL2VjbGlwc2UuaW5mCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFdlIGRvIG5vdCB3YW50IGNhcGFiaWxpdHkgamFycyBwYWNrMjAwJ2QgKHRoZXkgYXJlIHRpbnksIG5vIGphdmEsIGFuZCBmZXRjaGVkIGVhc2llciBhcyBqYXJzKQotamFycHJvY2Vzc29yLmV4Y2x1ZGUucGFjaz10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvT1NHSS1JTkYvbDEwbi9idW5kbGUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzL09TR0ktSU5GL2wxMG4vYnVuZGxlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODZhNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvT1NHSS1JTkYvbDEwbi9idW5kbGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzCi1CdW5kbGUtTmFtZS4wID0gSmF2YVNjcmlwdCBDYXBhYmlsaXRpZXMKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1hY3Rpdml0eS5qYXZhc2NyaXB0ICAgICAgICAgICAgID0gSmF2YVNjcmlwdCBEZXZlbG9wbWVudAotYWN0aXZpdHkuamF2YXNjcmlwdC5kZXNjICAgICAgICA9IERldmVsb3AgSmF2YVNjcmlwdCBhcHBsaWNhdGlvbnMuIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxY2VjMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDk8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMTk3YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgT1NHSS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgT1NHSS1JTkYvbDEwbi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OWNlMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMiPgotICAgICAgICA8YWN0aXZpdHkKLSAgICAgICAgICAgIG5hbWU9IiVhY3Rpdml0eS5qYXZhc2NyaXB0IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVhY3Rpdml0eS5qYXZhc2NyaXB0LmRlc2MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzIj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwud3N0XC5qc2R0XC5bXC5cdy9dKiI+Ci0gICAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLQotICAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOGVhOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRmMDBhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1R1ZSBNYXkgMTkgMTA6Mjk6MjAgRURUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZmRjZDE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS5oZWxwLnVpCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzL01FVEEtSU5GL2VjbGlwc2UuaW5mIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy9NRVRBLUlORi9lY2xpcHNlLmluZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc4ZTJmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzL01FVEEtSU5GL2VjbGlwc2UuaW5mCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFdlIGRvIG5vdCB3YW50IGNhcGFiaWxpdHkgamFycyBwYWNrMjAwJ2QgKHRoZXkgYXJlIHRpbnksIG5vIGphdmEsIGFuZCBmZXRjaGVkIGVhc2llciBhcyBqYXJzKQotamFycHJvY2Vzc29yLmV4Y2x1ZGUucGFjaz10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy9PU0dJLUlORi9sMTBuL2J1bmRsZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy9PU0dJLUlORi9sMTBuL2J1bmRsZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTVjNTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMvT1NHSS1JTkYvbDEwbi9idW5kbGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMKLUJ1bmRsZS1OYW1lLjAgPSBXZWIgQ2FwYWJpbGl0aWVzCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotYWN0aXZpdHkud2ViICAgICAgICAgICAgID0gV2ViIERldmVsb3BtZW50Ci1hY3Rpdml0eS53ZWIuZGVzYyAgICAgICAgPSBEZXZlbG9wIFdlYiBhcHBsaWNhdGlvbnMuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxY2VjMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwOTwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZjA4NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgT1NHSS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgT1NHSS1JTkYvbDEwbi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTVhZDdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAKLQotICAgPCEtLSBXZWIgQ2FwYWJpbGl0eSBEZWZpbml0aW9uLS0+Ci0gICA8IS0tIFRoZSBXZWIgY2FwYWJpbGl0eSByZXF1aXJlcyB0aGUgWE1MIGNhcGFiaWxpdHkuCi0gICAgICAJVGhlIFhNTCBjYXBhYmlsaXR5IGlzIGN1cnJlbnRseSBzZXJ2aW5nIGFzIHRoZQotICAgICAgCWRlZmF1bHQgV1RQIGNhcGFiaWxpdHkuIChTZWUgdGhlIGNvbW1lbnRzIG9uIHRoZQotICAgICAgCVhNTCBjYXBhYmlsaXR5LikKLSAgICAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMiPgotICAgICAgCQotICAJPGFjdGl2aXR5Ci0gICAgICAgICAgICBuYW1lPSIlYWN0aXZpdHkud2ViIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVhY3Rpdml0eS53ZWIuZGVzYyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcyI+Ci0gICAgIAk8L2FjdGl2aXR5PgotICAgICAJCi0gICAgICAJPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzIgotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC53c3RcLmNzc1wuW1wuXHcvXSoiPgotICAgICAgCTwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgIAkKLSAgICAgIAk8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLndzdFwuaHRtbFwuW1wuXHcvXSoiPgotICAgICAgCTwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgIAkKLSAgICAgIAk8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLndzdFwuamF2YXNjcmlwdFwuW1wuXHcvXSoiPgotICAgICAgCTwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgIAkKLSAgICAgIAk8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLndzdFwuc2VydmVyXC5bXC5cdy9dKiI+Ci0gICAgICAJPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgCQotICAgICAgCTxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwud3N0XC5pbnRlcm5ldFwubW9uaXRvclwuW1wuXHcvXSoiPgotICAgICAgCTwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgIAkKLSAgICAgIAk8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLndzdFwud2ViXC5bXC5cdy9dKiI+Ci0gICAgICAJPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgCQotICAgPC9leHRlbnNpb24+Ci0gICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMWU0MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI3NjBlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1R1ZSBNYXkgMTkgMDk6NDk6NDUgRURUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NjQ2OTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLmhlbHAudWkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvTUVUQS1JTkYvZWNsaXBzZS5pbmYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzL01FVEEtSU5GL2VjbGlwc2UuaW5mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzhlMmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvTUVUQS1JTkYvZWNsaXBzZS5pbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgV2UgZG8gbm90IHdhbnQgY2FwYWJpbGl0eSBqYXJzIHBhY2syMDAnZCAodGhleSBhcmUgdGlueSwgbm8gamF2YSwgYW5kIGZldGNoZWQgZWFzaWVyIGFzIGphcnMpCi1qYXJwcm9jZXNzb3IuZXhjbHVkZS5wYWNrPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzL09TR0ktSU5GL2wxMG4vYnVuZGxlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzL09TR0ktSU5GL2wxMG4vYnVuZGxlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0Yjg4NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy9PU0dJLUlORi9sMTBuL2J1bmRsZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcwotQnVuZGxlLU5hbWUuMCA9IFhNTCBDYXBhYmlsaXRpZXMKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1hY3Rpdml0eS54bWwgICAgICAgICAgICAgPSBYTUwgRGV2ZWxvcG1lbnQKLWFjdGl2aXR5LnhtbC5kZXNjICAgICAgICA9IERldmVsb3AgWE1MIGFwcGxpY2F0aW9ucy4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjZWMwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA5PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmMDg0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBPU0dJLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBPU0dJLUlORi9sMTBuLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZWVkMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICAgPCEtLQotICAgICAgICBYTUwgQ2FwYWJpbGl0eSBEZWZpbml0aW9uIFRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBhcmUKLSAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBYTUwgYWN0aXZpdHkgYXMgdGhleSBhcmUgcmVxdWlyZWQgYnkgWE1MIGFuZAotICAgICAgICBvdGhlciBjb21wb25lbnRzIGFuZCBYTUwgaXMgY3VycmVudGx5IHNlcnZpbmcgYXMgdGhlIGJhc2UgV1RQCi0gICAgICAgIGNvbXBvbmVudC4gY29tbW9uIHNzZSB2YWxpZGF0aW9uCi0gICAgLS0+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcyI+Ci0gICAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iJWFjdGl2aXR5LnhtbCIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlYWN0aXZpdHkueG1sLmRlc2MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMiPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLndzdFwueG1sXC5bXC5cdy9dKiI+Ci0gICAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzIgotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC53c3RcLnhzZFwuW1wuXHcvXSoiPgotICAgICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+Ci0gICAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwud3N0XC5kdGRcLltcLlx3L10qIj4KLSAgICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmFwYWNoZVwueGVyY2VzXC5bXC5cdy9dKiI+Ci0gICAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzIgotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC53c3RcLmNvbW1vblwuW1wuXHcvXSoiPgotICAgICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+Ci0gICAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwud3N0XC5zc2VcLltcLlx3L10qIj4KLSAgICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLndzdFwudmFsaWRhdGlvblwuW1wuXHcvXSoiPgotICAgICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+Ci0gICAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwud3N0XC5pbnRlcm5ldFwuY2FjaGVcLltcLlx3L10qIj4KLSAgICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLndzdFwuaW50ZXJuZXRcLnByb3h5XC5bXC5cdy9dKiI+Ci0gICAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgICAKLSAgICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5jbGFzc3BhdGggYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmIzMzUzLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIiBraW5kPSJjb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmN2c2lnbm9yZSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYzljYjAuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXNzZWp1bml0LmphcgotdGVtcC5mb2xkZXIKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5wcm9qZWN0IGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjUxMDkuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZDQ2NzkuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHM7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNy4wCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cywKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5taW5vcnRvb2xzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjguMCIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudGVzdHMuZW5jb2Rpbmc7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC50ZXN0cy5lbmNvZGluZztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC50ZXN0cy5lbmNvZGluZztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24udGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC52YWxpZGF0aW9uLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudGVzdHMuZW5jb2Rpbmc7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMuY29tcGlsZXI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbDtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC51aS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9TU0UgTWFzdGVyIExpc3QgVGVzdCBTdWl0ZS5sYXVuY2ggYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9TU0UgTWFzdGVyIExpc3QgVGVzdCBTdWl0ZS5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OWU0NTIuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvU1NFIE1hc3RlciBMaXN0IFRlc3QgU3VpdGUubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnBkZS51aS5KdW5pdExhdW5jaENvbmZpZyI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhc2tjbGVhciIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljVmFsaWRhdGUiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImJvb3RzdHJhcCIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNoZWNrZWQiIHZhbHVlPSJbTk9ORV0iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJDb25maWciIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyd3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyd3Nsb2ciIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNvbmZpZ0xvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmUvcGRlLWp1bml0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJsb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLi4vanVuaXQtd29ya3NwYWNlIi8+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1BBVEhTIj4KLTxsaXN0RW50cnkgdmFsdWU9Ii9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyTGlzdFRlc3RTdWl0ZS5qYXZhIi8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1RZUEVTIj4KLTxsaXN0RW50cnkgdmFsdWU9IjEiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuZmF2b3JpdGVHcm91cHMiPgotPGxpc3RFbnRyeSB2YWx1ZT0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoR3JvdXAucnVuIi8+Ci08bGlzdEVudHJ5IHZhbHVlPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hHcm91cC5kZWJ1ZyIvPgotPC9saXN0QXR0cmlidXRlPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5DT05UQUlORVIiIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LktFRVBSVU5OSU5HX0FUVFIiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUTkFNRSIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUX0tJTkQiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQubG9hZGVyLmp1bml0MyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLk1BSU5fVFlQRSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLk1hc3Rlckxpc3RUZXN0U3VpdGUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLW9zICR7dGFyZ2V0Lm9zfSAtd3MgJHt0YXJnZXQud3N9IC1hcmNoICR7dGFyZ2V0LmFyY2h9IC1ubCAke3RhcmdldC5ubH0gLXNob3dMb2NhdGlvbiAtY29uc29sZUxvZyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5WTV9BUkdVTUVOVFMiIHZhbHVlPSItWG1zMTAwTSAtWG14NjAwTSAtWFg6TWF4UGVybVNpemU9MTkyTSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InBkZS52ZXJzaW9uIiB2YWx1ZT0iMy4zIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icHJvZHVjdCIgdmFsdWU9Im9yZy5lY2xpcHNlLnNkay5pZGUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0icnVuX2luX3VpX3RocmVhZCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ic2hvd19zZWxlY3RlZF9vbmx5IiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWciIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VQcm9kdWN0IiB2YWx1ZT0idHJ1ZSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZTE0NTQuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL2ljb25zL3NvdXJjZUVkaXRvci5naWYgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9pY29ucy9zb3VyY2VFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWViZGI4Li4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL2ljb25zL3NvdXJjZUVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzQzNzBiLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotWE1MX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lPVhNTCBTb3VyY2UgUGFnZSBFZGl0b3IKLUphdmFTY3JpcHRfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9SmF2YVNjcmlwdCBTb3VyY2UgUGFnZSBFZGl0b3IKLQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lLjAgPSBVbml0IFRlc3RzCi1hZGRpdGlvbmFsVGVzdHM9QWRkaXRpb25hbCBUZXN0Q2FzZXMgYW5kIFRlc3RTdWl0ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9wbHVnaW4ueG1sIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRkNDkxNy4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICAgICAgICAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IiVYTUxfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICBpY29uPSJpY29ucy9zb3VyY2VFZGl0b3IuZ2lmIgotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yWE1MIgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiCi0gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xpY0ZvbnROYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IgotICAgICAgICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwuc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLSAgICAgICAgICAgICAgICA8L2VkaXRvcj4KLSAgICAgICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJhZGRpdGlvbmFsVGVzdHMiIG5hbWU9IiVhZGRpdGlvbmFsVGVzdHMiIHNjaGVtYT0ic2NoZW1hL2FkZGl0aW9uYWxUZXN0cy5leHNkIi8+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc2NoZW1hL2FkZGl0aW9uYWxUZXN0cy5leHNkIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc2NoZW1hL2FkZGl0aW9uYWxUZXN0cy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGU1ODkzLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NjaGVtYS9hZGRpdGlvbmFsVGVzdHMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cyI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMiIGlkPSJhZGRpdGlvbmFsVGVzdHMiIG5hbWU9IiVhZGRpdGlvbmFsVGVzdHMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSB3YXkgdG8gYWRkIGV4dHJhIHRlc3QgY2FzZXMgYW5kIHN1aXRlcyB0byB0aGUgYWxyZWFkeSBydW5uaW5nIGxpc3Qgd2l0aG91dCBkZWNsYXJpbmcgYSBydW50aW1lIGRlcGVuZGVuY3kgaW4gdGhpcyBwbHVnLWluLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idGVzdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzdWl0ZSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idGVzdCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQWRkcyBhbiBpbmRpdmlkdWFsIFRlc3QgY2FzZSB0byBydW4uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBUZXN0IGNsYXNzIG5hbWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJqdW5pdC5mcmFtZXdvcmsuVGVzdDoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic3VpdGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEFkZHMgYSBUZXN0U3VpdGUgdG8gcnVuLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgVGVzdFN1aXRlIGNsYXNzIG5hbWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL01hc3Rlckxpc3RUZXN0U3VpdGUuamF2YSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9NYXN0ZXJMaXN0VGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzY2FmYjQuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL01hc3Rlckxpc3RUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoCi0gKiBhY2NvbXBhbmllcyAgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXN0cy5KU1BDb3JlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudGVzdHMuZW5jb2RpbmcuSlNQRW5jb2RpbmdUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZXN0cy5KU1BVSVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGVzdHMuQ1NTQ29yZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnRlc3RzLmVuY29kaW5nLkNTU0VuY29kaW5nVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkudGVzdHMuQ1NTVUlUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRlc3RzLkRURENvcmVUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS50ZXN0cy5EVERVSVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRlc3RzLkhUTUxDb3JlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnRlc3RzLmVuY29kaW5nLkhUTUxFbmNvZGluZ1Rlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZXN0cy5IVE1MVUlUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5SdW5KU0RUQ29yZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMuY29tcGlsZXIuSlNEVENvbXBpbGVyVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkudGVzdHMuSlNEVFVJVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUudGVzdHMuQWxsV2ViQ29yZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS50ZXN0cy5BbGxXZWJVSVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXN0cy5TU0VNb2RlbFRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlc3RzLlNTRVVJVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXN0cy5TU0VNb2RlbFhNTFRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnRlc3RzLmVuY29kaW5nLkVuY29kaW5nVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkudGVzdHMuWE1MVUlUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLnRlc3RzLmludGVybmFsLkFsbFhNTFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS50ZXN0cy5pbnRlcm5hbC5BbGxYU0RDb3JlVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC52YWxpZGF0aW9uLnRlc3RzLmludGVybmFsLkFsbFhTRFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudGVzdHMuQWxsVGVzdHNTdWl0ZTsKLQotcHVibGljIGNsYXNzIE1hc3Rlckxpc3RUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTUyA9ICJjbGFzcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5hZGRpdGlvbmFsVGVzdHMiOwotCi0JcHVibGljIE1hc3Rlckxpc3RUZXN0U3VpdGUoKSB7Ci0JCXN1cGVyKCJXVFAgU291cmNlIEVkaXRpbmcgTWFzdGVyIExpc3QgVGVzdCBTdWl0ZSIpOwotCi0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgid3RwLmF1dG90ZXN0Lm5vbmludGVyYWN0aXZlIiwgInRydWUiKTsKLQotCQlhZGRUZXN0KFNTRU1vZGVsVGVzdFN1aXRlLnN1aXRlKCkpOwotCi0JCWFkZFRlc3QoU1NFTW9kZWxYTUxUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoRFREQ29yZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChBbGxYU0RDb3JlVGVzdHMuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoQ1NTQ29yZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChIVE1MQ29yZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChKU1BDb3JlVGVzdFN1aXRlLnN1aXRlKCkpOwotCi0JCWFkZFRlc3QoRW5jb2RpbmdUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoQ1NTRW5jb2RpbmdUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSFRNTEVuY29kaW5nVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KEpTUEVuY29kaW5nVGVzdFN1aXRlLnN1aXRlKCkpOwotCi0JCWFkZFRlc3QoQWxsWE1MVGVzdHMuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoQWxsWFNEVGVzdHMuc3VpdGUoKSk7Ci0KLQkJYWRkVGVzdChTU0VVSVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChYTUxVSVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChEVERVSVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChDU1NVSVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChIVE1MVUlUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSlNQVUlUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCQotCQlhZGRUZXN0KFJ1bkpTRFRDb3JlVGVzdHMuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSlNEVENvbXBpbGVyVGVzdHMuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSlNEVFVJVGVzdHMuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoQWxsV2ViQ29yZVRlc3RzLnN1aXRlKCkpOwotCQlhZGRUZXN0KEFsbFdlYlVJVGVzdHMuc3VpdGUoKSk7Ci0JCQotCi0JCWFkZFRlc3QobmV3IEFsbFRlc3RzU3VpdGUoKSk7Ci0JCQotCQkvLyBhZGRUZXN0KFJlZ3Jlc3Npb25CdWNrZXQuc3VpdGUoKSk7Ci0JCS8vIGFkZFRlc3QoQWxsVGVzdENhc2VzLnN1aXRlKCkpOwotCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsZW1lbnRzW2ldLmdldE5hbWUoKS5lcXVhbHMoInN1aXRlIikpIHsKLQkJCQlUZXN0U3VpdGUgc3VpdGU7Ci0JCQkJdHJ5IHsKLQkJCQkJc3VpdGUgPSAoVGVzdFN1aXRlKSBlbGVtZW50c1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENMQVNTKTsKLQkJCQkJYWRkVGVzdFN1aXRlKHN1aXRlLmdldENsYXNzKCkpOwotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkFkZGluZyBUZXN0U3VpdGUgIiArIHN1aXRlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkJCQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMiKSkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGVsZW1lbnRzW2ldLmdldE5hbWUoKS5lcXVhbHMoInRlc3QiKSkgewotCQkJCVRlc3QgdGVzdDsKLQkJCQl0cnkgewotCQkJCQl0ZXN0ID0gKFRlc3QpIGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0xBU1MpOwotCQkJCQlhZGRUZXN0U3VpdGUodGVzdC5nZXRDbGFzcygpKTsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJBZGRpbmcgVGVzdENhc2UgIiArIHRlc3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQkJCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cyIpKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbCgpIHsKLQkJLy8gdGhpcyBtZXRob2QgbmVlZHMgdG8gZXhpc3QsIGJ1dCBkb2Vzbid0IHJlYWxseSBkbyBhbnl0aGluZwotCQkvLyBvdGhlciB0aGFuIHRvIHNpZ25hbCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLQkJLy8gVGhlIHJlc3QgaXQgYXV0b21hdGljIGZyb20gdGhlIHRlc3RzIGFkZGVkIGluIGNvbnN0cnVjdG9yLgotCX0KLX0KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9UZXN0VHVya2lzaC5qYXZhIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL1Rlc3RUdXJraXNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOWM1NDQuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL1Rlc3RUdXJraXNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLS8qKgotICogVGVzdFR1cmtpc2gKLSAqIFNlZSBodHRwOi8vd3d3LmkxOG5ndXkuY29tL3VuaWNvZGUvdHVya2lzaC1pMThuLmh0bWwKLSAqLwotCi1wdWJsaWMgY2xhc3MgVGVzdFR1cmtpc2ggewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nIHR1cmtpc2hMb3dlckNhc2UgPSAiXHUwMTMxIiArICJcdTAwNjkiOwotCQlTdHJpbmcgdHVya2lzaFVwcGVyQ2FzZSA9ICJcdTAxMzAiICsgIlx1MDA0OSI7Ci0JCUxvY2FsZVtdIGxvY2FsZXMgPSBMb2NhbGUuZ2V0QXZhaWxhYmxlTG9jYWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsZXMubGVuZ3RoOyBpKyspIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihsb2NhbGVzW2ldKTsKLQkJfQotCQlMb2NhbGUgdHVya2lzaExvY2FsZSA9IG5ldyBMb2NhbGUoIlRSIik7Ci0JCVN0cmluZyB0ZXN0VXBwZXJjYXNlID0gdHVya2lzaExvd2VyQ2FzZS50b1VwcGVyQ2FzZSh0dXJraXNoTG9jYWxlKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHR1cmtpc2hVcHBlckNhc2UuZXF1YWxzKHRlc3RVcHBlcmNhc2UpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9UZXN0U3RyaW5nLmphdmEgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9UZXN0U3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OGZjNDYuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVGVzdFN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMubWlub3J0b29sczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIFRlc3RTdHJpbmcKLSAqLwotCi1wdWJsaWMgY2xhc3MgVGVzdFN0cmluZyB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0KLQotCQlTdHJpbmcgeG1sID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi0xNlwiPz48bWVzc2FnZT48c291cmNlVXJpPjwvc291cmNlVXJpPjxib2R5PjwvYm9keT48L21lc3NhZ2U+IjsKLQotCi0JCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShmYWxzZSk7Ci0JCWZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoeG1sKSkpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KGRvY3VtZW50Lmhhc0NoaWxkTm9kZXMoKSk7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZG9jdW1lbnQpOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9taW5vcnRvb2xzL1Rlc3RTdHJpbmdVdGlscy5qYXZhIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVGVzdFN0cmluZ1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmUyMzguLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVGVzdFN0cmluZ1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMubWlub3J0b29sczsKLQotCi0KLXB1YmxpYyBjbGFzcyBUZXN0U3RyaW5nVXRpbHMgewotCi0JLyoqCi0JICogVGVzdFN0cmluZ1V0aWxzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBUZXN0U3RyaW5nVXRpbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSBtYXRjaGluZyBsaXRlcmFsIHBvcnRpb25zIG9mIGEgc3RyaW5nIHdpdGggYW5vdGhlciBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgc291cmNlLCBTdHJpbmcgdGFyZ2V0KSB7Ci0JCWlmIChhU3RyaW5nID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIG5vcm1hbFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGggPSBhU3RyaW5nLmxlbmd0aCgpOwotCQlpbnQgcG9zaXRpb24gPSAwOwotCQlpbnQgcHJldmlvdXMgPSAwOwotCQlpbnQgc3BhY2VyID0gc291cmNlLmxlbmd0aCgpOwotCQl3aGlsZSAocG9zaXRpb24gKyBzcGFjZXIgLSAxIDwgbGVuZ3RoICYmIGFTdHJpbmcuaW5kZXhPZihzb3VyY2UsIHBvc2l0aW9uKSA+IC0xKSB7Ci0JCQlwb3NpdGlvbiA9IGFTdHJpbmcuaW5kZXhPZihzb3VyY2UsIHByZXZpb3VzKTsKLQkJCW5vcm1hbFN0cmluZyA9IG5vcm1hbFN0cmluZyArIGFTdHJpbmcuc3Vic3RyaW5nKHByZXZpb3VzLCBwb3NpdGlvbikgKyB0YXJnZXQ7Ci0JCQlwb3NpdGlvbiArPSBzcGFjZXI7Ci0JCQlwcmV2aW91cyA9IHBvc2l0aW9uOwotCQl9Ci0JCW5vcm1hbFN0cmluZyA9IG5vcm1hbFN0cmluZyArIGFTdHJpbmcuc3Vic3RyaW5nKHBvc2l0aW9uLCBhU3RyaW5nLmxlbmd0aCgpKTsKLQotCQlyZXR1cm4gbm9ybWFsU3RyaW5nOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVmVyc2lvblJlbW92ZXIuamF2YSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9taW5vcnRvb2xzL1ZlcnNpb25SZW1vdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZWQ5YzUuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVmVyc2lvblJlbW92ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMubWlub3J0b29sczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXN0cy51dGlsLkNvbW1vblhNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogTW9kaWZpZXMgcGx1Z2luLnhtbCBhbmQgZnJhZ21lbnQueG1sIGZpbGVzIHRvIG5vdCByZXF1aXJlIHNwZWNpZmljIHZlcnNpb25zCi0gKiBvZiB0aGVpciBwbHVnaW4gZGVwZW5kZW5jaWVzLgotICogCi0gKiBAYXV0aG9yIG5pdGluCi0gKi8KLXB1YmxpYyBjbGFzcyBWZXJzaW9uUmVtb3ZlciB7Ci0KLQljaGFyW10gY2hhcmJ1ZmYgPSBuZXcgY2hhclsyMDQ4XTsKLQlTdHJpbmdCdWZmZXIgcyA9IG51bGw7Ci0KLQlwdWJsaWMgVmVyc2lvblJlbW92ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKGFyZ3MubGVuZ3RoIDwgMSkKLQkJCW5ldyBWZXJzaW9uUmVtb3ZlcigpLnZpc2l0KG5ldyBGaWxlKCJkOi90YXJnZXQiKSk7Ci0JCWVsc2UKLQkJCW5ldyBWZXJzaW9uUmVtb3ZlcigpLnZpc2l0KG5ldyBGaWxlKGFyZ3NbMF0pKTsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXQoRmlsZSBmaWxlKSB7Ci0JCS8vIFNraXAgZGlyZWN0b3JpZXMgbGlrZSBvcmcuZWNsaXBzZS4qLCBvcmcuYXBhY2hlLiosIGFuZCBvcmcuanVuaXQuKgotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpICYmICFmaWxlLmdldE5hbWUoKS5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS4iKSAmJiAhZmlsZS5nZXROYW1lKCkuc3RhcnRzV2l0aCgib3JnLmFwYWNoZSIpICYmICFmaWxlLmdldE5hbWUoKS5zdGFydHNXaXRoKCJvcmcuanVuaXQiKSkgewotCQkJU3RyaW5nW10gY29udGVudHMgPSBmaWxlLmxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudHMubGVuZ3RoOyBpKyspCi0JCQkJdmlzaXQobmV3IEZpbGUoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICcvJyArIGNvbnRlbnRzW2ldKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmaXh1cEZpbGUoZmlsZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXh1cEZpbGUoRmlsZSBmaWxlKSB7Ci0JCS8vIG9ubHkgbG9hZCBhbmQgZml4dXAgZmlsZXMgbmFtZWQgcGx1Z2luLnhtbCBvciBmcmFnbWVudC54bWwgdW5kZXIgZWNsaXBzZVxwbHVnaW5zXFhYWFhYWFguKgotCQlpZiAoIShmaWxlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJwbHVnaW4ueG1sIikgfHwgZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiZnJhZ21lbnQueG1sIikpIHx8IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuaW5kZXhPZigiZWNsaXBzZVxccGx1Z2luc1xcWFhYWFhYWC4iKSA9PSAtMSkKLQkJCXJldHVybjsKLQkJLy8JCVN5c3RlbS5vdXQucHJpbnRsbihmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJdHJ5IHsKLQkJCURvY3VtZW50IGRvYyA9IENvbW1vblhNTC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShmaWxlKTsKLQkJCU5vZGVMaXN0IGltcG9ydHMgPSBudWxsOwotCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoInBsdWdpbi54bWwiKSkKLQkJCQlpbXBvcnRzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbXBvcnQiKTsKLQkJCWVsc2UgaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImZyYWdtZW50LnhtbCIpKQotCQkJCWltcG9ydHMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZyYWdtZW50Iik7Ci0JCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBpbXBvcnROb2RlID0gaW1wb3J0cy5pdGVtKGkpOwotCQkJCWlmIChpbXBvcnROb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiaW1wb3J0IikgJiYgaW1wb3J0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJ2ZXJzaW9uIikgIT0gbnVsbCkgewotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJaW1wb3J0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkucmVtb3ZlTmFtZWRJdGVtKCJ2ZXJzaW9uIik7Ci0JCQkJfQotCQkJCWlmIChpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oInBsdWdpbi12ZXJzaW9uIikgIT0gbnVsbCkgewotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJaW1wb3J0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkucmVtb3ZlTmFtZWRJdGVtKCJwbHVnaW4tdmVyc2lvbiIpOwotCQkJCX0KLQkJCQlpZiAoaW1wb3J0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJtYXRjaCIpICE9IG51bGwpIHsKLQkJCQkJaW1wb3J0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkucmVtb3ZlTmFtZWRJdGVtKCJtYXRjaCIpOwotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2hhbmdlZCkgewotCQkJCUZpbGVPdXRwdXRTdHJlYW0gb3N0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCUNvbW1vblhNTC5zZXJpYWxpemUoZG9jLCBvc3RyZWFtKTsKLQkJCQlvc3RyZWFtLmNsb3NlKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb2RpZmllZCAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZmlsZS5nZXRQYXRoKCkgKyAiOiAiICsgZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihmaWxlLmdldFBhdGgoKSArICI6ICIgKyBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy90ZXN0U3RyaW5nWE1MLmpwYWdlIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL3Rlc3RTdHJpbmdYTUwuanBhZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMWVhYTAuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL3Rlc3RTdHJpbmdYTUwuanBhZ2UKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy90ZXQuanNwIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvdGV0LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkxYjIxZS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy90ZXQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiDQotCXBhZ2VFbmNvZGluZz0iVVRGLTgiJT4NCi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+DQotPHRpdGxlPmNvbnRlbnQgb2YgbG93ZXJjYXNlIHRpdGxlIHRhZ3M8L3RpdGxlPg0KLTx0xLF0bGU+Y29udGVudCBvZiBsb3dlcmNhc2UgdGl0bGUgdGFncyAobm8gZGlhcmVzaXMgb3ZlciBpKTwvdMSxdGxlPg0KLTx0aXRsZT5jb250ZW50IG9mIHVwcGVyY2FzZSB0YWdzPC90aXRsZT4NCi08dGl0bGU+PC90aXRsZT4NCi08dGl0bGU+PC90aXRsZT4NCi08dGl0bGU+PC90aXRsZT4NCi08dGl0bGU+PC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGk+PC9pPg0KLTxpPjwvaT4NCi08aT48L2k+DQotPGk+PC9pPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvdHVya2lzaENhc2UuanBhZ2UgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy90dXJraXNoQ2FzZS5qcGFnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5NmU2MS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy90dXJraXNoQ2FzZS5qcGFnZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1TdHJpbmcgcyA9ICJcdTAxMzEiKyJcdTAwNjkiOwotcy50b1VwcGVyQ2FzZSgpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYmUxYmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL0VkaXRvckpzcENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL0VkaXRvckpzcENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFjMWZlZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9FZGl0b3JKc3BDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImpzcGYxMDAwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgZHJvcC1kb3duIGxpc3RzOgotLSAgPGI+Q2hhcmFjdGVyIGNvZGU6PC9iPiBTcGVjaWZpZXMgdGhlIHBhZ2UgZGlyZWN0aXZlJ3MgcGFnZUVuY29kaW5nIHZhbHVlIGFuZCBjb250ZW50VHlwZSBjaGFyc2V0LiBJbiBIVE1MIGRvY3VtZW50cywgdGhpcyB2YWx1ZSBpcyBhbHNvIHVzZWQgZm9yIHRoZSAmbHQ7TUVUQSZndDsgdGFnJ3MgY2hhcnNldCBwcm9wZXJ0eS4KLS0gIDxiPkxhbmd1YWdlOjwvYj4gU3BlY2lmaWVzIHRoZSBwYWdlIGRpcmVjdGl2ZSdzIHByb2dyYW1taW5nIGxhbmd1YWdlLgotLSAgPGI+Q29udGVudCBUeXBlOjwvYj4gU3BlY2lmaWVzIHRoZSBjb250ZW50VHlwZSdzIFRZUEUgdmFsdWUgZm9yIHRoZSBwYWdlIGRpcmVjdGl2ZS4gSW4gSFRNTCBkb2N1bWVudHMsIHRoaXMgdmFsdWUgaXMgYWxzbyB1c2VkIGZvciB0aGUgJmx0O01FVEEmZ3Q7IHRhZydzIGNvbnRlbnQgcHJvcGVydHkuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ianNwcjAwMTAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBvcGVuIHRoZSA8Yj5SZW5hbWUgUmVzb3VyY2U8L2I+IGRpYWxvZywgaWYgYXBwbGljYWJsZSwgd2hpY2ggbGV0cyB5b3UgcmVuYW1lIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgSmF2YSBlbGVtZW50IGFuZCByZWZlcmVuY2VzIHRvIHRoYXQgZWxlbWVudC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNvdXJjZSBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBzb3VyY2UgY29kZSAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJqc3ByMDAyMCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIG9wZW4gdGhlIDxiPk1vdmU8L2I+IGRpYWxvZywgaWYgYXBwbGljYWJsZSwgd2hpY2ggbGV0cyB5b3UgbW92ZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIEphdmEgZWxlbWVudC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gbW92ZSBhIG1ldGhvZCBmcm9tIG9uZSBjbGFzcyB0byBhbm90aGVyLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU291cmNlIGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHNvdXJjZSBjb2RlIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwNTAiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciBhbmQgdGhlIHRleHQgZW5jb2RpbmcgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYSBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGUuCi0KLVZhcmlvdXMgZGV2ZWxvcG1lbnQgcGxhdGZvcm1zIHVzZSBkaWZmZXJlbnQgbGluZSBkZWxpbWl0ZXJzIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBhIG5ldyBsaW5lLiBTZWxlY3QgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdGhhdCBjb3JyZXNwb25kcyB0byB5b3VyIGRldmVsb3BtZW50IG9yIGRlcGxveW1lbnQgcGxhdGZvcm0uCi08Yj5Ob3RlOjwvYj4gVGhpcyBkZWxpbWl0ZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byBhbnkgZG9jdW1lbnRzIHRoYXQgY3VycmVudGx5IGV4aXN0LiBJdCB3aWxsIGJlIGFkZGVkIG9ubHkgdG8gZG9jdW1lbnRzIHRoYXQgeW91IGNyZWF0ZSBhZnRlciB5b3Ugc2VsZWN0IHRoZSBsaW5lIGRlbGltaXRlciB0eXBlIGFuZCBjbGljayA8Yj5BcHBseTwvYj4sIG9yIHRvIGV4aXN0aW5nIGZpbGVzIHRoYXQgeW91IG9wZW4gYW5kIHRoZW4gcmVzYXZlIGFmdGVyIHlvdSBzZWxlY3QgdGhlIGxpbmUgZGVsaW1pdGVyIHR5cGUgYW5kIGNsaWNrIDxiPkFwcGx5PC9iPi4KLQotVGhlIGVuY29kaW5nIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nIHNldCB0aGF0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBKU1AgZmlsZXMuICBDaGFuZ2luZyB0aGUgZW5jb2RpbmcgY2F1c2VzIGFueSBuZXcgSlNQIGZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQgZnJvbSBzY3JhdGNoIHRvIHVzZSB0aGUgc2VsZWN0ZWQgZW5jb2RpbmcuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDA1MSI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZyB0aGF0IHRoZSBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGVkaXRvciBkb2VzIHdoZW4geW91IGFyZSBlZGl0aW5nIGEgZmlsZS4iCi0KLVRoZSA8Yj5Db250ZW50IHR5cGU8L2I+IGZpZWxkIGNvbnRhaW5zIGEgbGlzdCBvZiBhbGwgdGhlIHNvdXJjZSB0eXBlcyB0aGF0IHlvdSBjYW4gc2VsZWN0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci4gWW91IGNhbiBlaXRoZXIgc2VsZWN0IHRoZSBjb250ZW50IHR5cGUgdGhhdCB5b3Ugd2FudCB0byB3b3JrIHdpdGggZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QsIG9yIGNsaWNrIHRleHQgaW4gdGhlIHRleHQgc2FtcGxlIHdpbmRvdyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjb250ZW50IHR5cGUgZm9yIHdoaWNoIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgdGV4dCBoaWdobGlnaHRpbmcuCi0KLVRoZSA8Yj5Gb3JlZ3JvdW5kPC9iPiBhbmQgPGI+QmFja2dyb3VuZDwvYj4gcHVzaCBidXR0b25zIG9wZW4gPGI+Q29sb3I8L2I+IGRpYWxvZyBib3hlcyB0aGF0IGxldCB5b3Ugc3BlY2lmeSB0ZXh0IGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzLCByZXNwZWN0aXZlbHkuIFNlbGVjdCB0aGUgPGI+Qm9sZDwvYj4gY2hlY2sgYm94IHRvIG1ha2UgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUgYXBwZWFyIGluIGJvbGQuCi0KLUNsaWNrIHRoZSA8Yj5SZXN0b3JlIERlZmF1bHQ8L2I+IHB1c2ggYnV0dG9uIHRvIHNldCB0aGUgaGlnaGxpZ2h0aW5nIHN0eWxlcyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwNTIiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBjcmVhdGUgbmV3IGFuZCBlZGl0IGV4aXN0aW5nIHRlbXBsYXRlcyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBlZGl0IGEgSlNQIGZpbGUuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ4bWxtMTA1MCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIG9wZW4gdGhlIDxiPkNsZWFudXA8L2I+IGRpYWxvZywgd2hpY2ggY29udGFpbnMgc2V0dGluZ3MgdG8gdXBkYXRlIGEgZG9jdW1lbnQgc28gdGhhdCBpdCBpcyB3ZWxsLWZvcm1lZCBhbmQgZm9ybWF0dGVkLiBDbGVhbnVwIGluY2x1ZGVzIHN1Y2ggYWN0aXZpdGllcyBhcyBpbnNlcnRpbmcgbWlzc2luZyB0YWdzLCBhZGRpbmcgcXVvdGF0aW9uIG1hcmtzIGFyb3VuZCBhdHRyaWJ1dGUgdmFsdWVzLCBub2RlIGNhcGl0YWxpemF0aW9uLCBhbmQgZm9ybWF0dGluZyBhIGRvY3VtZW50LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL0VkaXRvckpzcENvbnRleHRzMi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9FZGl0b3JKc3BDb250ZXh0czIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODA4MzVhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL0VkaXRvckpzcENvbnRleHRzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImpzcHNvdXJjZV9zb3VyY2VfSGVscElkIj4KLTxkZXNjcmlwdGlvbj5UaGUgSlNQIHNvdXJjZSBwYWdlIGVkaXRvciBsZXRzIHlvdSBlZGl0IGEgSmF2YVNlcnZlciBQYWdlcyBmaWxlLiBUaGUgZWRpdG9yIHByb3ZpZGVzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LCB1c2VyLWRlZmluZWQgdGVtcGxhdGVzLCBzeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbywgZWxlbWVudCBzZWxlY3Rpb24gYW5kIGZvcm1hdHRpbmcsIGFuZCBkb2N1bWVudCBmb3JtYXR0aW5nLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI4Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iTWFraW5nIGNvbnRlbnQgYXNzaXN0IHdvcmsgZm9yIEpTUCBmaWxlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMy5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJqc3BmMTAwMCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHZhbHVlcyBmb3IgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGZyb20gdGhlIGRyb3AtZG93biBsaXN0czoKLS0gIDxiPkNoYXJhY3RlciBjb2RlOjwvYj4gU3BlY2lmaWVzIHRoZSBwYWdlIGRpcmVjdGl2ZSdzIHBhZ2VFbmNvZGluZyB2YWx1ZSBhbmQgY29udGVudFR5cGUgY2hhcnNldC4gSW4gSFRNTCBkb2N1bWVudHMsIHRoaXMgdmFsdWUgaXMgYWxzbyB1c2VkIGZvciB0aGUgJmx0O01FVEEmZ3Q7IHRhZydzIGNoYXJzZXQgcHJvcGVydHkuCi0tICA8Yj5MYW5ndWFnZTo8L2I+IFNwZWNpZmllcyB0aGUgcGFnZSBkaXJlY3RpdmUncyBwcm9ncmFtbWluZyBsYW5ndWFnZS4KLS0gIDxiPkNvbnRlbnQgVHlwZTo8L2I+IFNwZWNpZmllcyB0aGUgY29udGVudFR5cGUncyBUWVBFIHZhbHVlIGZvciB0aGUgcGFnZSBkaXJlY3RpdmUuIEluIEhUTUwgZG9jdW1lbnRzLCB0aGlzIHZhbHVlIGlzIGFsc28gdXNlZCBmb3IgdGhlICZsdDtNRVRBJmd0OyB0YWcncyBjb250ZW50IHByb3BlcnR5LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9ImpzcHIwMDEwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+UmVmYWN0b3IgUmVuYW1lPC9iPiBkaWFsb2csIGlmIGFwcGxpY2FibGUsIHdoaWNoIGxldHMgeW91IHJlbmFtZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIEphdmEgZWxlbWVudCBhbmQgcmVmZXJlbmNlcyB0byB0aGF0IGVsZW1lbnQuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTb3VyY2UgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgc291cmNlIGNvZGUgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ianNwcjAwMjAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBvcGVuIHRoZSA8Yj5SZWZhY3RvciBNb3ZlPC9iPiBkaWFsb2csIGlmIGFwcGxpY2FibGUsIHdoaWNoIGxldHMgeW91IG1vdmUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBKYXZhIGVsZW1lbnQuIEZvciBleGFtcGxlLCB5b3UgY2FuIG1vdmUgYSBtZXRob2QgZnJvbSBvbmUgY2xhc3MgdG8gYW5vdGhlci4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNvdXJjZSBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBzb3VyY2UgY29kZSAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDUwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgYW5kIHRoZSB0ZXh0IGVuY29kaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGNyZWF0ZSBvciBzYXZlIGEgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlLgotCi1WYXJpb3VzIGRldmVsb3BtZW50IHBsYXRmb3JtcyB1c2UgZGlmZmVyZW50IGxpbmUgZGVsaW1pdGVycyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgYSBuZXcgbGluZS4gU2VsZWN0IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgY29ycmVzcG9uZHMgdG8geW91ciBkZXZlbG9wbWVudCBvciBkZXBsb3ltZW50IHBsYXRmb3JtLgotPGI+Tm90ZTo8L2I+IFRoaXMgZGVsaW1pdGVyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gYW55IGRvY3VtZW50cyB0aGF0IGN1cnJlbnRseSBleGlzdC4gSXQgd2lsbCBiZSBhZGRlZCBvbmx5IHRvIGRvY3VtZW50cyB0aGF0IHlvdSBjcmVhdGUgYWZ0ZXIgeW91IHNlbGVjdCB0aGUgbGluZSBkZWxpbWl0ZXIgdHlwZSBhbmQgY2xpY2sgPGI+QXBwbHk8L2I+LCBvciB0byBleGlzdGluZyBmaWxlcyB0aGF0IHlvdSBvcGVuIGFuZCB0aGVuIHJlc2F2ZSBhZnRlciB5b3Ugc2VsZWN0IHRoZSBsaW5lIGRlbGltaXRlciB0eXBlIGFuZCBjbGljayA8Yj5BcHBseTwvYj4uCi0KLVRoZSBlbmNvZGluZyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZyBzZXQgdGhhdCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgSlNQIGZpbGVzLiAgQ2hhbmdpbmcgdGhlIGVuY29kaW5nIGNhdXNlcyBhbnkgbmV3IEpTUCBmaWxlcyB0aGF0IGFyZSBjcmVhdGVkIGZyb20gc2NyYXRjaCB0byB1c2UgdGhlIHNlbGVjdGVkIGVuY29kaW5nLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwNTEiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBjdXN0b21pemUgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcgdGhhdCB0aGUgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBlZGl0b3IgZG9lcyB3aGVuIHlvdSBhcmUgZWRpdGluZyBhIGZpbGUuIgotCi1UaGUgPGI+Q29udGVudCB0eXBlPC9iPiBmaWVsZCBjb250YWlucyBhIGxpc3Qgb2YgYWxsIHRoZSBzb3VyY2UgdHlwZXMgdGhhdCB5b3UgY2FuIHNlbGVjdCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gZWl0aGVyIHNlbGVjdCB0aGUgY29udGVudCB0eXBlIHRoYXQgeW91IHdhbnQgdG8gd29yayB3aXRoIGZyb20gdGhlIGRyb3AtZG93biBsaXN0LCBvciBjbGljayB0ZXh0IGluIHRoZSB0ZXh0IHNhbXBsZSB3aW5kb3cgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY29udGVudCB0eXBlIGZvciB3aGljaCB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHRleHQgaGlnaGxpZ2h0aW5nLgotCi1UaGUgPGI+Rm9yZWdyb3VuZDwvYj4gYW5kIDxiPkJhY2tncm91bmQ8L2I+IHB1c2ggYnV0dG9ucyBvcGVuIDxiPkNvbG9yPC9iPiBkaWFsb2cgYm94ZXMgdGhhdCBsZXQgeW91IHNwZWNpZnkgdGV4dCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycywgcmVzcGVjdGl2ZWx5LiBTZWxlY3QgdGhlIDxiPkJvbGQ8L2I+IGNoZWNrIGJveCB0byBtYWtlIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlIGFwcGVhciBpbiBib2xkLgotCi1DbGljayB0aGUgPGI+UmVzdG9yZSBEZWZhdWx0PC9iPiBwdXNoIGJ1dHRvbiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZyBzdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDUyIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3JlYXRlIG5ldyBhbmQgZWRpdCBleGlzdGluZyB0ZW1wbGF0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgZWRpdCBhIEpTUCBmaWxlLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI4Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ieG1sbTEwNTAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBvcGVuIHRoZSA8Yj5DbGVhbnVwPC9iPiBkaWFsb2csIHdoaWNoIGNvbnRhaW5zIHNldHRpbmdzIHRvIHVwZGF0ZSBhIGRvY3VtZW50IHNvIHRoYXQgaXQgaXMgd2VsbC1mb3JtZWQgYW5kIGZvcm1hdHRlZC4gQ2xlYW51cCBpbmNsdWRlcyBzdWNoIGFjdGl2aXRpZXMgYXMgaW5zZXJ0aW5nIG1pc3NpbmcgdGFncywgYWRkaW5nIHF1b3RhdGlvbiBtYXJrcyBhcm91bmQgYXR0cmlidXRlIHZhbHVlcywgbm9kZSBjYXBpdGFsaXphdGlvbiwgYW5kIGZvcm1hdHRpbmcgYSBkb2N1bWVudC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9Kc3BXaXpDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9Kc3BXaXpDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMDg1ZTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvSnNwV2l6Q29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLQk8Y29udGV4dCBpZD0ianNwdzAwMTAiPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlTZWxlY3QgdGhlIEpTUCB0ZW1wbGF0ZSBjaGVja2JveCB0byBjcmVhdGUgeW91ciBKU1AgZmlsZSBiYXNlZCBvbiBhIGRlZmF1bHQgdGVtcGxhdGUuIFlvdSBjYW4gY2hvb3NlIHRvIGhhdmUgeW91ciBKU1AgY3JlYXRlZCB3aXRoIEhUTUwsIFhIVE1MLCBvciBYSFRNTCB3aXRoIFhNTCBtYXJrdXAuIElmIHlvdSBkbyBub3Qgc2VsZWN0IGEgdGVtcGxhdGUsIHlvdXIgbmV3bHkgY3JlYXRlZCBKU1AgZmlsZSB3aWxsIGJlIGNvbXBsZXRlbHkgYmxhbmsuCi0JCTwvZGVzY3JpcHRpb24+Ci0JPC9jb250ZXh0PgotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODhmNDEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQbHVnaW4ubmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThjNjk3My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gRWRpdG9ySnNwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIEVkaXRvckpzcENvbnRleHRzMi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgRWRpdG9ySnNwQ29udGV4dHMyLnhtbCxcCi0gICAgICAgICAgICAgICBFZGl0b3JKc3BDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5Y2EyNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRyYW5zbGF0aW9uIEluc3RydWN0aW9uOiBzZWN0aW9uIHRvIGJlIHRyYW5zbGF0ZWQKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1QbHVnaW4ubmFtZSA9IEpTUCB0b29scyBpbmZvcG9wcwotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDFiMTE2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMSI/PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9ySnNwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9ySnNwQ29udGV4dHMyLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iSnNwV2l6Q29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLz4KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODNjODQwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyXzEuMC4wLmphcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjNzViOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjRjMjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuZG9jLnVzZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NjE3MTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYm9vay5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9ib29rLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmMjU1My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9ib29rLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi1AaW1wb3J0ICIuLi9QUk9EVUNUX1BMVUdJTi9ib29rLmNzcyI7Ci0KLVAuQ29kZSB7Ci0JZGlzcGxheTogYmxvY2s7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl0ZXh0LWluZGVudDogMC4wMHB0OwotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsKLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7Ci0JbWFyZ2luLWxlZnQ6IDE1cHQ7Ci0JZm9udC1zaXplOiAxMC4wMDAwMDBwdDsKLQlmb250LXdlaWdodDogbWVkaXVtOwotCWZvbnQtc3R5bGU6IFJlZ3VsYXI7Ci0JY29sb3I6ICM0NDQ0Q0M7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKLQlmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IjsKLX0KLQotSDYuQ2FwdGlvbkZpZ0NvbHVtbiB7Ci0JZGlzcGxheTogYmxvY2s7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl0ZXh0LWluZGVudDogMC4wMDAwMDBwdDsKLQltYXJnaW4tdG9wOiAzLjAwMDAwMHB0OwotCW1hcmdpbi1ib3R0b206IDExLjAwMDAwMHB0OwotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsKLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsKLQlmb250LXNpemU6IDkuMDAwMDAwcHQ7Ci0JZm9udC13ZWlnaHQ6IG1lZGl1bTsKLQlmb250LXN0eWxlOiBJdGFsaWM7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKLQlmb250LWZhbWlseTogIkFyaWFsIjsKLX0KLQotUC5Ob3RlIHsKLQlkaXNwbGF5OiBibG9jazsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXRleHQtaW5kZW50OiAwcHQ7Ci0JbWFyZ2luLXRvcDogMTkuNTAwMDAwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMTkuNTAwMDAwcHQ7Ci0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0OwotCW1hcmdpbi1sZWZ0OiAzMHB0OwotCWZvbnQtc2l6ZTogMTEuMDAwMDAwcHQ7Ci0JZm9udC13ZWlnaHQ6IG1lZGl1bTsKLQlmb250LXN0eWxlOiBJdGFsaWM7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKLQlmb250LWZhbWlseTogIkFyaWFsIjsKLX0KLQotRU0uVUlMYWJlbCB7Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci0JZm9udC1zdHlsZTogUmVndWxhcjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotfQotCi1FTS5Db2RlTmFtZSB7Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci0JZm9udC1zdHlsZTogUmVndWxhcjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciOwotfQotCi0vKiBmb2xsb3dpbmcgZm9udCBmYWNlIGRlY2xhcmF0aW9ucyBuZWVkIHRvIGJlIHJlbW92ZWQgZm9yIERCQ1MgKi8KLWJvZHksaDEsaDIsaDMsaDQsaDUsaDYscCx0YWJsZSx0ZCxjYXB0aW9uLHRoLHVsLG9sLGRsLGxpLGRkLGR0IHsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQljb2xvcjogIzAwMDAwMAotfQotCi1wcmUgewotCWZvbnQtZmFtaWx5OiBDb3VyaWVyLCBtb25vc3BhY2UKLX0KLQotLyogZW5kIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgKi8KLQkvKiBmb2xsb3dpbmcgZm9udCBzaXplIGRlY2xhcmF0aW9ucyBzaG91bGQgYmUgT0sgZm9yIERCQ1MgKi8KLWJvZHksaDEsaDIsaDMsaDQsaDUsaDYscCx0YWJsZSx0ZCxjYXB0aW9uLHRoLHVsLG9sLGRsLGxpLGRkLGR0IHsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXByZSB7Ci0JZm9udC1zaXplOiAxMHB0Ci19Ci0KLS8qIGVuZCBmb250IHNpemUgZGVjbGFyYXRpb25zICovCi1ib2R5IHsKLQliYWNrZ3JvdW5kOiAjRkZGRkZGCi19Ci0KLWgxIHsKLQlmb250LXNpemU6IDE4cHQ7Ci0JbWFyZ2luLXRvcDogNTsKLQltYXJnaW4tYm90dG9tOiAxCi19Ci0KLWgyIHsKLQlmb250LXNpemU6IDE0cHQ7Ci0JbWFyZ2luLXRvcDogMjU7Ci0JbWFyZ2luLWJvdHRvbTogMwotfQotCi1oMyB7Ci0JZm9udC1zaXplOiAxMXB0OwotCW1hcmdpbi10b3A6IDIwOwotCW1hcmdpbi1ib3R0b206IDMKLX0KLQotaDQgewotCWZvbnQtc2l6ZTogMTBwdDsKLQltYXJnaW4tdG9wOiAyMDsKLQltYXJnaW4tYm90dG9tOiAzOwotCWZvbnQtc3R5bGU6IGl0YWxpYwotfQotCi1wIHsKLQltYXJnaW4tdG9wOiAxMHB4OwotCW1hcmdpbi1ib3R0b206IDEwcHgKLX0KLQotcHJlIHsKLQltYXJnaW4tbGVmdDogNjsKLQlmb250LXNpemU6IDlwdAotfQotCi1hOmxpbmsgewotCWNvbG9yOiAjMDAwMEZGCi19Ci0KLWE6aG92ZXIgewotCWNvbG9yOiAjMDAwMDgwCi19Ci0KLWE6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKLX0KLQotdWwgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMTAKLX0KLQotbGkgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMAotfQotCi1saSBwIHsKLQltYXJnaW4tdG9wOiAwOwotCW1hcmdpbi1ib3R0b206IDAKLX0KLQotb2wgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMTAKLX0KLQotZGwgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMTAKLX0KLQotZHQgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMDsKLQlmb250LXdlaWdodDogYm9sZAotfQotCi1kZCB7Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAwCi19Ci0KLXN0cm9uZyB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQKLX0KLQotZW0gewotCWZvbnQtc3R5bGU6IGl0YWxpYwotfQotCi12YXIgewotCWZvbnQtc3R5bGU6IGl0YWxpYwotfQotCi1kaXYucmV2aXNpb24gewotCWJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDsKLQlib3JkZXItbGVmdC13aWR0aDogdGhpbjsKLQlib3JkZXItbGVmdC1jb2xvcjogIzdCNjhFRTsKLQlwYWRkaW5nLWxlZnQ6IDUKLX0KLQotdGggewotCWZvbnQtd2VpZ2h0OiBib2xkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMDdhOGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgY29tbW9uLmNzcyxcCi0gICAgICAgICAgICAgICBjb21tb25sdHIuY3NzLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIG5vdGljZXMuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRvYy54bWwsXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlX3RvYy54bWwsXAotICAgICAgICAgICAgICAgdG9waWNzLyxcCi0gICAgICAgICAgICAgICBib29rLmNzcyxcCi0gICAgICAgICAgICAgICBjb21tb25ydGwuY3NzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0ZjNmMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTE5NyArMCwwIEBACi1ib2R5IHsKLQlmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAwLjhlbTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotCWNvbG9yOiBCbGFjazsKLQltYXJnaW4tcmlnaHQ6IDVlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5pYm1maWxlcGF0aCB7Ci0JZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLQlmb250LXNpemU6IDEwMCU7Ci19Ci0KLS5pYm1jb21tYW5kIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmlibWVtcGhhc2lzIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5tdiwucGssLnBrZGVmLC5wdiB7Ci0JZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLQlmb250LXNpemU6IDEwMCU7Ci0JcGFkZGluZy10b3A6IDBlbTsKLQlwYWRkaW5nLXJpZ2h0OiAuM2VtOwotCXBhZGRpbmctYm90dG9tOiAwZW07Ci0JcGFkZGluZy1sZWZ0OiAuM2VtOwotfQotCi10dCxzYW1wIHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotQk9EWS5uYXYgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci0JYm9yZGVyLXJpZ2h0OiAwLjJlbSByaWRnZSBibGFjazsKLQlmb250LXNpemU6IDAuOTVlbTsKLX0KLQotLmJhc2UgewotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtdmFyaWFudDogbm9ybWFsOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotfQotCi1UQUJMRSB7Ci0JY29sb3I6IGJsYWNrOwotCXdpZHRoOiA5MCU7Ci0JYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKLQlib3JkZXItY29sb3I6IEJsYWNrOwotCWJhY2tncm91bmQ6IHdoaXRlOwotCW1hcmdpbi10b3A6IDAuNWVtOwotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotCW1hcmdpbi1sZWZ0OiAwZW07Ci0JbWFyZ2luLXJpZ2h0OiAwZW07Ci19Ci0KLS50YmxkZXNjIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLVRIIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemU6IDAuN2VtOwotCWNvbG9yOiBibGFjazsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGFkYWRhOwotCXBhZGRpbmctdG9wOiAwLjFlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4zZW07Ci0JcGFkZGluZy1sZWZ0OiAxZW07Ci0JcGFkZGluZy1yaWdodDogMWVtOwotfQotCi1USC5iYXNlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogYmxhY2s7Ci0JYm9yZGVyOiAxIHNvbGlkICM2MDYwNjA7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RjZGFkYTsKLQlwYWRkaW5nLXRvcDogMC42NWVtOwotCXBhZGRpbmctYm90dG9tOiAwLjY1ZW07Ci0JcGFkZGluZy1sZWZ0OiAxZW07Ci0JcGFkZGluZy1yaWdodDogMWVtOwotfQotCi1URCB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQljb2xvcjogYmxhY2s7Ci0JYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Ci0JcGFkZGluZy10b3A6IDAuMWVtOwotCXBhZGRpbmctYm90dG9tOiAwLjNlbTsKLQlwYWRkaW5nLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci19Ci0KLUNJVEUgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotRU0gewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotU1RST05HIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotY2FwdGlvbiB7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLURUIHsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLQltYXJnaW4tYm90dG9tOiAwLjVlbTsKLX0KLQotREQgewotCW1hcmdpbi1sZWZ0OiAxLjBlbTsKLX0KLQotUFJFLHByZS5jZ3JhcGhpYyB7Ci0JZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLQlmb250LXNpemU6IDEycHg7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RhZGFkYTsKLQlwYWRkaW5nOiA1cHg7Ci19Ci0KLS5pdGFsaWMgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmJvbGQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0udW5kZXJsaW5lZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5ib2xkLWl0YWxpYywuYm9sZEl0YWxpYyB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uc21hbGxDYXBzLC5zbWFsbGNhcHMgewotCXRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Ci0JZm9udC1zaXplOiBzbWFsbGVyOwotCWZvbnQtdmFyaWFudDogc21hbGwtY2FwczsKLX0KLQotLml0YWxpYy11bmRlcmxpbmVkIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5ib2xkLXVuZGVybGluZWQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uYm9sZC1pdGFsaWMtdW5kZXJsaW5lZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uc21hbGxjYXBzLXVuZGVybGluZWQgewotCWZvbnQtdmFyaWFudDogc21hbGwtY2FwczsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmVtcGhhc2lzIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5pbmxpbmVkZWYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLnNpZGViYXIgewotCWJhY2tncm91bmQ6ICNjY2NjY2M7Ci19Ci0KLUE6bGluayB7Ci0JY29sb3I6ICMwMDY2OTk7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLUE6dmlzaXRlZCB7Ci0JY29sb3I6ICM5OTY2OTk7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLUE6YWN0aXZlIHsKLQljb2xvcjogIzAwNjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotQTpob3ZlciB7Ci0JY29sb3I6ICM5OTY2OTk7OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLnRvY2xpbms6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRvY2xpbms6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudG9jbGluazp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudG9jbGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEucHRvY2xpbms6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnB0b2NsaW5rOmFjdGl2ZSB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnB0b2NsaW5rOnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wdG9jbGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEuaW5kZXhsaW5rOmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5pbmRleGxpbms6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuaW5kZXhsaW5rOnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5pbmRleGxpbms6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLmZpZ3VyZWxpc3Q6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmZpZ3VyZWxpc3Q6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEudGFibGVsaXN0OmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50YWJsZWxpc3Q6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudGFibGVsaXN0OnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50YWJsZWxpc3Q6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLmJvbGRncmV5bGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC45ZW07Ci19Ci0KLWEuYm9sZGdyZXlsaW5rOnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplOiAwLjllbTsKLX0KLQotYS5ib2xkZ3JleWxpbms6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemU6IDAuOWVtOwotfQotCi0ucnVubmluZ2hlYWRlciB7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMC43ZW07Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIHsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAwLjdlbTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTpsaW5rIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIGE6YWN0aXZlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIGE6dmlzaXRlZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0ucnVubmluZ2Zvb3RlciBhOmhvdmVyIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotI2JyZWFkY3J1bWIsLmJyZWFkY3J1bWIsc3Bhbi5icmVhZGNydW1icyB7Ci0JZm9udC1zaXplOiAwLjc1ZW07Ci19Ci0KLS5mYXN0cGF0aCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmZhc3RwYXRodGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0udG9jIHsKLQlmb250LXNpemU6IHNtYWxsOwotfQotCi0ubmVzdGVkMCB7Ci0JbWFyZ2luLXRvcDogMGVtOwotfQotCi0ucCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotfQotCi1zcGFuLmZpZ2NhcCB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1zcGFuLmZpZ2Rlc2MgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotZGl2LmZpZ2JveCB7Ci0JCi19Ci0KLWRpdi5maWdydWxlcyB7Ci0JCi19Ci0KLWRpdi5maWdub25lIHsKLQkKLX0KLQotLmZpZ25vbmUgewotCQotfQotCi0uZmlnYm9yZGVyIHsKLQkKLX0KLQotLmZpZ3NpZGVzIHsKLQkKLX0KLQotLmZpZ3RvcCB7Ci0JCi19Ci0KLS5maWdib3R0b20gewotCQotfQotCi0uZmlndG9wYm90IHsKLQkKLX0KLQotLnBhcmVudGxpbmsgewotCQotfQotCi0ucHJldmxpbmsgewotCQotfQotCi0ubmV4dGxpbmsgewotCQotfQotCi0ucmVsY29uY2VwdHNoZCB7Ci0JCi19Ci0KLS5yZWx0YXNrc2hkIHsKLQkKLX0KLQotLnJlbHJlZmhkIHsKLQkKLX0KLQotLnN5bm5vbmUgewotCQotfQotCi0uc3luYm9yZGVyIHsKLQkKLX0KLQotLnN5bnNpZGVzIHsKLQkKLX0KLQotLnN5bnRvcCB7Ci0JCi19Ci0KLS5zeW5ib3R0b20gewotCQotfQotCi0uc3ludG9wYm90IHsKLQkKLX0KLQotLnNraXAgewotCW1hcmdpbi10b3A6IDFlbTsKLX0KLQotLnNraXBzcGFjZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLnVsY2hpbGRsaW5rIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0ub2xjaGlsZGxpbmsgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLXVsLG9sIHsKLQltYXJnaW4tdG9wOiAwLjFlbTsKLQlwYWRkaW5nLXRvcDogMC4xZW07Ci19Ci0KLXVsLnNpbXBsZSB7Ci0JbGlzdC1zdHlsZS10eXBlOiBub25lOwotfQotCi11bC5pbmRleGxpc3QgewotCWxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLX0KLQotT0wgTEkgewotCW1hcmdpbi10b3A6IDAuMGVtOwotCW1hcmdpbi1ib3R0b206IDAuMGVtOwotCW1hcmdpbi1sZWZ0OiAwLjBlbTsKLX0KLQotVUwgTEkgewotCW1hcmdpbi10b3A6IDAuMGVtOwotCW1hcmdpbi1ib3R0b206IDAuMGVtOwotCW1hcmdpbi1sZWZ0OiAwLjBlbTsKLX0KLQotT0wgTEkgRElWIFAgewotCWxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbDsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLX0KLQotVUwgTEkgRElWIFAgewotCWxpc3Qtc3R5bGUtdHlwZTogZGlzYzsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLX0KLQotKiBbY29tcGFjdD0ieWVzIl0+bGkgewotCW1hcmdpbi10b3A6IDAgZW07Ci19Ci0KLSogW2NvbXBhY3Q9Im5vIl0+bGkgewotCW1hcmdpbi10b3A6IDAuNWVtOwotfQotCi1ociB7Ci0JbWFyZ2luLWJvdHRvbTogMGVtOwotCW1hcmdpbi10b3A6IDBlbTsKLQlwYWRkaW5nLXRvcDogMGVtOwotCXBhZGRpbmctYm90dG9tOiAwZW07Ci0Jd2lkdGg6IDkwJTsKLQljb2xvcjogI2NjY2NjYzsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLUgxLC50aXRsZSwucGFnZXRpdGxlLC50b3BpY3RpdGxlMSB7Ci0JZm9udC1zaXplOiAxLjVlbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0Jd29yZC1zcGFjaW5nOiAwLjFlbTsKLX0KLQotSDIsLnN1YnRpdGxlLC5wYWdlc3VidGl0bGUsLnRvcGljdGl0bGUyIHsKLQlmb250LXNpemU6IDEuMjVlbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4wZW07Ci0JcGFkZGluZy1ib3R0b206IDAuMGVtOwotfQotCi1IMywuYm9sZHRpdGxlLC50b3BpY3RpdGxlMyB7Ci0JZm9udC1zaXplOiAxLjBlbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JcGFkZGluZy1ib3R0b206IDAuMWVtOwotfQotCi1INCwudG9waWN0aXRsZTQgewotCWZvbnQtc2l6ZTogMC45ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDAuMWVtOwotCXBhZGRpbmctYm90dG9tOiAwLjFlbTsKLX0KLQotaDUsLnRvcGljdGl0bGU1IHsKLQlmb250LXNpemU6IDAuOGVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLX0KLQotaDYsLnRvcGljdGl0bGU2IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLX0KLQotZGl2LmhlYWR0aXRsZSB7Ci0JZm9udC1zaXplOiAxZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWxlZnQ6IDBlbTsKLX0KLQotZGl2LmhlYWQwIHsKLQlmb250LXNpemU6IDAuOWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1sZWZ0OiAwZW07Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci19Ci0KLWRpdi5oZWFkMSB7Ci0JZm9udC1zaXplOiAwLjhlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tbGVmdDogMWVtOwotCXBhZGRpbmctdG9wOiAwLjVlbTsKLX0KLQotZGl2LmhlYWQyIHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLX0KLQotZGl2LmhlYWQzIHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDNlbTsKLX0KLQotZGl2LmhlYWQ0IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDRlbTsKLX0KLQotZGl2LmhlYWQ1IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDVlbTsKLX0KLQotZGl2LmhlYWQ2IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDZlbTsKLX0KLQotZGl2LmhlYWQ3IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDdlbTsKLX0KLQotZGl2LmhlYWQ4IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDhlbTsKLX0KLQotZGl2LmhlYWQ5IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDllbTsKLX0KLQotLnRpcCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLnRpcHRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmZpcnN0Y29sIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnB0b2NIMSB7Ci0JZm9udC1zaXplOiB4LXNtYWxsOwotfQotCi0ucHRvY0gyIHsKLQlmb250LXNpemU6IHgtc21hbGw7Ci19Ci0KLS5zdGl0bGUgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLm50ZSB7Ci0JCi19Ci0KLS54eGxpbmVzIHsKLQl3aGl0ZS1zcGFjZTogcHJlOwotCWZvbnQtc2l6ZTogMC45NWVtOwotfQotCi0uc2VjdGlvbnRpdGxlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMGVtOwotCWNvbG9yOiBibGFjazsKLQlmb250LXNpemU6IDEuMmVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYuaW1hZ2VsZWZ0IHsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi1kaXYuaW1hZ2VjZW50ZXIgewotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotZGl2LmltYWdlcmlnaHQgewotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi1kaXYuaW1hZ2VqdXN0aWZ5IHsKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5OwotfQotCi1kaXYubW1vYmogewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYubW1vYmpsZWZ0IHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLWRpdi5tbW9iamNlbnRlciB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLWRpdi5tbW9ianJpZ2h0IHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi1wcmUuc2NyZWVuIHsKLQlwYWRkaW5nOiAxZW0gMWVtIDFlbSAxZW07Ci0JbWFyZ2luLXRvcDogMC40ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC40ZW07Ci0JYm9yZGVyOiB0aGluIHNvbGlkIEJsYWNrOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotLnByZXJlcSB7Ci0JbWFyZ2luLWxlZnQ6IDEuNWVtOwotfQotCi0uZGVmTGlzdEhlYWQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1zcGFuLm12IHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4ubWQgewotCXRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwotfQotCi0ucGssc3Bhbi5wayB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4ucGtkZWYgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1zcGFuLnB2IHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4ucHZkZWYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotc3Bhbi5rd2QgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLmtkd2RlZiB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5wYXJtTGlzdEt3ZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5wYXJtTGlzdFZhciB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1zcGFuLm9wZXIgewotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLQotc3Bhbi5vcGVyZGVmIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotVkFSLHNwYW4udmFyIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4udmFyZGVmIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWRpdi5tc2cgewotCXBhZGRpbmc6IDAuMmVtIDFlbSAxZW0gMWVtOwotCW1hcmdpbi10b3A6IDAuNGVtOwotCW1hcmdpbi1ib3R0b206IDAuNGVtOwotfQotCi1kaXYubXNnbnVtIHsKLQlmbG9hdDogbGVmdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JbWFyZ2luLXJpZ2h0OiAxZW07Ci19Ci0KLWRpdi5tc2d0ZXh0IHsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLWRpdi5tc2dpdGVtdGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1wLm1zZ2l0ZW0gewotCW1hcmdpbi10b3A6IDBlbTsKLX0KLQotLmF0dGVudGlvbixkaXYuYXR0ZW50aW9uIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uYXR0ZW50aW9udGl0bGUsc3Bhbi5hdHRlbnRpb250aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5jYXV0aW9udGl0bGUsZGl2LmNhdXRpb250aXRsZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uY2F1dGlvbixkaXYuY2F1dGlvbiB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmRhbmdlcixkaXYuZGFuZ2VyIHsKLQlwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjVlbSAwLjVlbTsKLQlib3JkZXI6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5kYW5nZXJ0aXRsZSxkaXYuZGFuZ2VydGl0bGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmltcG9ydGFudCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmltcG9ydGFudHRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnJlbWVtYmVyIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0ucmVtZW1iZXJ0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5yZXN0cmljdGlvbiB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLnJlc3RyaWN0aW9udGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYud2FybmluZ3RpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2Lndhcm5pbmdib2R5IHsKLQltYXJnaW4tbGVmdDogMmVtCi19Ci0KLS5ub3RlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0ubm90ZXRpdGxlLGRpdi5ub3RldGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYubm90ZWJvZHkgewotCW1hcmdpbi1sZWZ0OiAyZW07Ci19Ci0KLWRpdi5ub3RlbGlzdHRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2LmZubnVtIHsKLQlmbG9hdDogbGVmdDsKLX0KLQotZGl2LmZudGV4dCB7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLX0KLQotZGl2LnN0ZXBsIHsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYuc3RlcGxudW0gewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiAwLjVlbTsKLX0KLQotZGl2LnN0ZXBsdGV4dCB7Ci0JbWFyZ2luLWxlZnQ6IDVlbTsKLX0KLQotZGl2LnN0ZXBsbnVtIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZmxvYXQ6IGxlZnQ7Ci0JbWFyZ2luLWxlZnQ6IDAuNWVtOwotfQotCi1kaXYuc3RlcGx0ZXh0IHsKLQltYXJnaW4tYm90dG9tOiAwLjVlbTsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1kaXYubGVkaSB7Ci0JbWFyZ2luLWxlZnQ6IDNlbTsKLX0KLQotZGl2LmxlZGVzYyB7Ci0JbWFyZ2luLWxlZnQ6IDNlbTsKLX0KLQotc3Bhbi5wYmxrdGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYucGJsa2xibGJveCB7Ci0JcGFkZGluZzogMC41ZW0gMC41ZW0gMC41ZW0gMC41ZW07Ci0JYm9yZGVyOiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci19Ci0KLXNwYW4uZWRub3RpY2VzdGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLnVpY29udHJvbCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4udGVybSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4uaWR4c2hvdyB7Ci0JY29sb3I6IGdyZWVuOwotfQotCi1kaXYuY29kZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi1zcGFuLnJlZmtleSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6IHdoaXRlOwotCWJhY2tncm91bmQtY29sb3I6IGJsYWNrOwotfQotCi10dC5hcGwgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotZGl2LnF1YWxpZnN0YXJ0IHsKLQlwYWRkaW5nOiAwLjFlbSAwLjVlbSAwLjVlbSAwLjVlbTsKLQlib3JkZXItdG9wOiBzb2xpZDsKLQlib3JkZXItbGVmdDogc29saWQ7Ci0JYm9yZGVyLXJpZ2h0OiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYucXVhbGlmZW5kIHsKLQlwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjFlbSAwLjVlbTsKLQlib3JkZXItYm90dG9tOiBzb2xpZDsKLQlib3JkZXItbGVmdDogc29saWQ7Ci0JYm9yZGVyLXJpZ2h0OiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi0ubm9zaGFkZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Ci19Ci0KLS54bGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS5saWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0IwQjBCMDsKLX0KLQotLm1lZGl1bSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzhDOEM4QzsKLX0KLQotLmRhcmsgewotCWJhY2tncm91bmQtY29sb3I6ICM2RTZFNkU7Ci19Ci0KLS54ZGFyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzU4NTg1ODsKLX0KLQotLmxpZ2h0LXllbGxvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZDQzsKLX0KLQotLmtoYWtpIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQzk5OwotfQotCi0ubWVkaXVtLWJsdWUgewotCWJhY2tncm91bmQtY29sb3I6ICM2Njk5Q0M7Ci19Ci0KLS5saWdodC1ibHVlIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0ZGOwotfQotCi0ubWlkLWdyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci19Ci0KLS5saWdodC1ncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQURBOwotfQotCi0ubGlnaHRlc3QtZ3JleSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U2RTZFNjsKLX0KLQotI2NoYW5nZWQgewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQlsZWZ0OiAwLjJlbTsKLQljb2xvcjogIzdCNjhFRTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotSU5QVVQuYnV0dG9ucyB7Ci0JZm9udC1zaXplOiAwLjc1ZW07Ci0JYm9yZGVyLXRvcDogMC4yZW0gb3V0c2V0ICNCMUIxQjE7Ci0JYm9yZGVyLXJpZ2h0OiAwLjJlbSBvdXRzZXQgIzAwMDAwMDsKLQlib3JkZXItYm90dG9tOiAwLjJlbSBvdXRzZXQgIzAwMDAwMDsKLQlib3JkZXItbGVmdDogMC4yZW0gb3V0c2V0ICNCMUIxQjE7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMjsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLX0KLQotLmNncmFwaGljIHsKLQlmb250LXNpemU6IDkwJTsKLQljb2xvcjogYmxhY2s7Ci19Ci0KLS5haXgsLmhwdXgsLnN1biwudW5peCwud2luMiwud2lubnQsLndpbiwuem9zLC5saW51eCwub3MzOTAsLm9zNDAwLC5jLC5jcGx1c3BsdXMsLmNvYm9sLC5mb3J0cmFuLC5qYXZhLC5tYWNvc3gsLm9zMiwucGwxLC5ycGcKLQl7Ci0JYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgbGVmdDsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLQl0ZXh0LWluZGVudDogNTVweDsKLX0KLQotLmFpeCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nYWl4LmdpZik7Ci19Ci0KLS5ocHV4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdocHV4LmdpZik7Ci19Ci0KLS5zdW4gewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3NvbGFyaXMuZ2lmKTsKLX0KLQotLnVuaXggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3VuaXguZ2lmKTsKLX0KLQotLndpbjIgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzIwMDAuZ2lmKTsKLX0KLQotLndpbnhwIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmd4cC5naWYpOwotfQotCi0ud2lubnQgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ250LmdpZik7Ci19Ci0KLS53aW4gewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3dpbi5naWYpOwotfQotCi0uem9zIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmd6b3MuZ2lmKTsKLX0KLQotLmxpbnV4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdsaW51eC5naWYpOwotfQotCi0ub3MzOTAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzM5MC5naWYpOwotfQotCi0ub3M0MDAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzQwMC5naWYpOwotfQotCi0uYyB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nYy5naWYpOwotfQotCi0uY3BsdXNwbHVzIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjcHAuZ2lmKTsKLX0KLQotLmNvYm9sIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjb2JvbC5naWYpOwotfQotCi0uZm9ydHJhbiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nZm9ydHJhbi5naWYpOwotfQotCi0uamF2YSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5namF2YS5naWYpOwotfQotCi0ubWFjb3N4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdtYWNvc3guZ2lmKTsKLX0KLQotLm9zMiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nb3MyLmdpZik7Ci19Ci0KLS5wbDEgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3BsMS5naWYpOwotfQotCi0ucnBnIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdycGcuZ2lmKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25sdHIuY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9ubHRyLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhODE5NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25sdHIuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTMwNiArMCwwIEBACi0vKgotIHwgKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNCwgMjAwNSBBbGwgUmlnaHRzIFJlc2VydmVkLgotICovCi0gCi0udW5yZXNvbHZlZCB7IGJhY2tncm91bmQtY29sb3I6IHNreWJsdWU7IH0KLS5ub1RlbXBsYXRlIHsgYmFja2dyb3VuZC1jb2xvcjogeWVsbG93OyB9Ci0KLS5iYXNlIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsgfQotCi0vKiBBZGQgc3BhY2UgZm9yIHRvcCBsZXZlbCB0b3BpY3MgKi8KLS5uZXN0ZWQwIHsgbWFyZ2luLXRvcCA6IDFlbTt9Ci0KLS8qIGRpdiB3aXRoIGNsYXNzPXAgaXMgdXNlZCBmb3IgcGFyYWdyYXBocyB0aGF0IGNvbnRhaW4gYmxvY2tzLCB0byBrZWVwIHRoZSBYSFRNTCB2YWxpZCAqLwotLnAge21hcmdpbi10b3A6IDFlbX0KLQotLyogRGVmYXVsdCBvZiBpdGFsaWNzIHRvIHNldCBhcGFydCBmaWd1cmUgY2FwdGlvbnMgKi8KLS5maWdjYXAgeyBmb250LXN0eWxlOiBpdGFsaWMgfQotLmZpZ2Rlc2MgeyBmb250LXN0eWxlOiBub3JtYWwgfQotCi0vKiBVc2UgQGZyYW1lIHRvIGNyZWF0ZSBmcmFtZXMgb24gZmlndXJlcyAqLwotLmZpZ2JvcmRlciB7IGJvcmRlci1zdHlsZTogc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXdpZHRoIDogMnB4OyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlnc2lkZXMgeyBib3JkZXItbGVmdCA6IDJweCBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItcmlnaHQgOiAycHggc29saWQ7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWd0b3AgeyBib3JkZXItdG9wIDogMnB4IHNvbGlkOyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlnYm90dG9tIHsgYm9yZGVyLWJvdHRvbSA6IDJweCBzb2xpZDsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWd0b3Bib3QgeyBib3JkZXItdG9wIDogMnB4IHNvbGlkOyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0KLS8qIE1vc3QgbGluayBncm91cHMgYXJlIGNyZWF0ZWQgd2l0aCA8ZGl2Pi4gRW5zdXJlIHRoZXkgaGF2ZSBzcGFjZSBiZWZvcmUgYW5kIGFmdGVyLiAqLwotLnVsbGlua3MgeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmUgfQotLnVsY2hpbGRsaW5rIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLm9sY2hpbGRsaW5rIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmxpbmtsaXN0IHsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5saW5rbGlzdHdpdGhjaGlsZCB7IG1hcmdpbi1sZWZ0OiAxLjVlbTsgbWFyZ2luLWJvdHRvbTogMWVtICB9Ci0uc3VibGlua2xpc3QgeyBtYXJnaW4tbGVmdDogMS41ZW07IG1hcmdpbi1ib3R0b206IDFlbSAgfQotLnJlbGNvbmNlcHRzIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbHRhc2tzIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbHJlZiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWxpbmZvIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmJyZWFkY3J1bWIgeyBmb250LXNpemUgOiBzbWFsbGVyOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnByZXJlcSB7IG1hcmdpbi1sZWZ0IDogMjBweDt9Ci0KLS8qIFNldCBoZWFkaW5nIHNpemVzLCBnZXR0aW5nIHNtYWxsZXIgZm9yIGRlZXBlciBuZXN0aW5nICovCi0udG9waWN0aXRsZTEgeyBtYXJnaW4tdG9wOiAwcGM7IG1hcmdpbi1ib3R0b206IC4xZW07IGZvbnQtc2l6ZTogMS4zNGVtOyB9Ci0udG9waWN0aXRsZTIgeyBtYXJnaW4tdG9wOiAxcGM7IG1hcmdpbi1ib3R0b206IC40NWVtOyBmb250LXNpemU6IDEuMTdlbTsgfQotLnRvcGljdGl0bGUzIHsgbWFyZ2luLXRvcDogMXBjOyBtYXJnaW4tYm90dG9tOiAuMTdlbTsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0udG9waWN0aXRsZTQgeyBtYXJnaW4tdG9wOiAuODNlbTsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0udG9waWN0aXRsZTUgeyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNiB7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS5zZWN0aW9udGl0bGUgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDBlbTsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7fQotLnNlY3Rpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZXhhbXBsZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLQotLyogQWxsIG5vdGUgZm9ybWF0cyBoYXZlIHRoZSBzYW1lIGRlZmF1bHQgcHJlc2VudGF0aW9uICovCi0ubm90ZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0ubm90ZXRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLm5vdGVsaXN0dGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0udGlwIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS50aXB0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5mYXN0cGF0aCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uZmFzdHBhdGh0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5pbXBvcnRhbnQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmltcG9ydGFudHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLnJlbWVtYmVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5yZW1lbWJlcnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLnJlc3RyaWN0aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5yZXN0cmljdGlvbnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmF0dGVudGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uYXR0ZW50aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uZGFuZ2VydGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uZGFuZ2VyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5jYXV0aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uY2F1dGlvbiB7IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW4tYm90dG9tIDogMWVtOyB9Ci0KLS8qIFNpbXBsZSBsaXN0cyBkbyBub3QgZ2V0IGEgYnVsbGV0ICovCi11bC5zaW1wbGUgeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmUgfQotCi0vKiBVc2VkIG9uIHRoZSBmaXJzdCBjb2x1bW4gb2YgYSB0YWJsZSwgd2hlbiByb3doZWFkZXI9ImZpcnN0Y29sIiBpcyB1c2VkICovCi0uZmlyc3Rjb2wgeyBmb250LXdlaWdodCA6IGJvbGQ7fQotCi0vKiBWYXJpb3VzIGJhc2ljIHBocmFzZSBzdHlsZXMgKi8KLS5ib2xkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5ib2xkSXRhbGljIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLml0YWxpYyB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnVuZGVybGluZWQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLnVpY29udHJvbCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0ucGFybW5hbWUgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmt3ZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0uZGVma3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0udmFyIHsgZm9udC1zdHlsZSA6IGl0YWxpYzt9Ci0uc2hvcnRjdXQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotCi0vKiBEZWZhdWx0IG9mIGJvbGQgZm9yIGRlZmluaXRpb24gbGlzdCB0ZXJtcyAqLwotLmRsdGVybSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0KLS8qIFVzZSBDU1MgdG8gZXhwYW5kIGxpc3RzIHdpdGggQGNvbXBhY3Q9Im5vIiAqLwotLmRsdGVybWV4cGFuZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW4tdG9wOiAxZW07IH0KLSpbY29tcGFjdD0ieWVzIl0+bGkgeyBtYXJnaW4tdG9wOiAwZW07fQotKltjb21wYWN0PSJubyJdPmxpIHsgbWFyZ2luLXRvcDogLjUzZW07fQkKLS5saWV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zbGlleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGxleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGRleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc3RlcGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zdWJzdGVwZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0vKiBBbGlnbiBpbWFnZXMgYmFzZWQgb24gQGFsaWduIG9uIHRvcGljL2ltYWdlICovCi1kaXYuaW1hZ2VsZWZ0IHsgdGV4dC1hbGlnbjogbGVmdCB9Ci1kaXYuaW1hZ2VjZW50ZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXIgfQotZGl2LmltYWdlcmlnaHQgeyB0ZXh0LWFsaWduOiByaWdodCB9Ci1kaXYuaW1hZ2VqdXN0aWZ5IHsgdGV4dC1hbGlnbjoganVzdGlmeSB9Ci0KLXByZS5zY3JlZW4geyBwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7IGJvcmRlcjogb3V0c2V0OyBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOyBtYXJnaW4tdG9wOiAycHg7IG1hcmdpbi1ib3R0b20gOiAycHg7IHdoaXRlLXNwYWNlOiBwcmV9Ci0KLS8qIGNvcGllZCBmcm9tIGNvbW1vbi5jc3MgKi8KLWJvZHkgewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDAuOGVtOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0JY29sb3I6IEJsYWNrOwotCW1hcmdpbi1yaWdodDogNWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmlibWZpbGVwYXRoIHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotLmlibWNvbW1hbmQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaWJtZW1waGFzaXMgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLm12LC5waywucGtkZWYsLnB2IHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTAwJTsKLQlwYWRkaW5nLXRvcDogMGVtOwotCXBhZGRpbmctcmlnaHQ6IC4zZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWxlZnQ6IC4zZW07Ci19Ci0KLXR0LHNhbXAgewotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JZm9udC1zaXplOiAxMDAlOwotfQotCi1CT0RZLm5hdiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLQlib3JkZXItcmlnaHQ6IDAuMmVtIHJpZGdlIGJsYWNrOwotCWZvbnQtc2l6ZTogMC45NWVtOwotfQotCi0uYmFzZSB7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC12YXJpYW50OiBub3JtYWw7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci19Ci0KLVRBQkxFIHsKLQljb2xvcjogYmxhY2s7Ci0Jd2lkdGg6IDkwJTsKLQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotCWJvcmRlci1jb2xvcjogQmxhY2s7Ci0JYmFja2dyb3VuZDogd2hpdGU7Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0JbWFyZ2luLWxlZnQ6IDBlbTsKLQltYXJnaW4tcmlnaHQ6IDBlbTsKLX0KLQotLnRibGRlc2MgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotVEggewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC43ZW07Ci0JY29sb3I6IGJsYWNrOwotCWJhY2tncm91bmQtY29sb3I6ICNkYWRhZGE7Ci0JcGFkZGluZy10b3A6IDAuMWVtOwotCXBhZGRpbmctYm90dG9tOiAwLjNlbTsKLQlwYWRkaW5nLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci19Ci0KLVRILmJhc2UgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiBibGFjazsKLQlib3JkZXI6IDEgc29saWQgIzYwNjA2MDsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGNkYWRhOwotCXBhZGRpbmctdG9wOiAwLjY1ZW07Ci0JcGFkZGluZy1ib3R0b206IDAuNjVlbTsKLQlwYWRkaW5nLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci19Ci0KLVREIHsKLQlmb250LXNpemU6IDAuN2VtOwotCWNvbG9yOiBibGFjazsKLQliYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKLQlwYWRkaW5nLXRvcDogMC4xZW07Ci0JcGFkZGluZy1ib3R0b206IDAuM2VtOwotCXBhZGRpbmctbGVmdDogMWVtOwotCXBhZGRpbmctcmlnaHQ6IDFlbTsKLX0KLQotQ0lURSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1FTSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1TVFJPTkcgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1jYXB0aW9uIHsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotRFQgewotCW1hcmdpbi10b3A6IDAuNWVtOwotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotfQotCi1ERCB7Ci0JbWFyZ2luLWxlZnQ6IDEuMGVtOwotfQotCi1QUkUscHJlLmNncmFwaGljIHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTJweDsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGFkYWRhOwotCXBhZGRpbmc6IDVweDsKLX0KLQotLml0YWxpYyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uYm9sZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS51bmRlcmxpbmVkIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJvbGQtaXRhbGljLC5ib2xkSXRhbGljIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5zbWFsbENhcHMsLnNtYWxsY2FwcyB7Ci0JdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKLQlmb250LXNpemU6IHNtYWxsZXI7Ci0JZm9udC12YXJpYW50OiBzbWFsbC1jYXBzOwotfQotCi0uaXRhbGljLXVuZGVybGluZWQgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJvbGQtdW5kZXJsaW5lZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5ib2xkLWl0YWxpYy11bmRlcmxpbmVkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5zbWFsbGNhcHMtdW5kZXJsaW5lZCB7Ci0JZm9udC12YXJpYW50OiBzbWFsbC1jYXBzOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uZW1waGFzaXMgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmlubGluZWRlZiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uc2lkZWJhciB7Ci0JYmFja2dyb3VuZDogI2NjY2NjYzsKLX0KLQotQTpsaW5rIHsKLQljb2xvcjogIzAwNjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotQTp2aXNpdGVkIHsKLQljb2xvcjogIzk5NjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotQTphY3RpdmUgewotCWNvbG9yOiAjMDA2Njk5OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1BOmhvdmVyIHsKLQljb2xvcjogIzk5NjY5OTs7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEudG9jbGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudG9jbGluazphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50b2NsaW5rOnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50b2NsaW5rOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS5wdG9jbGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucHRvY2xpbms6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucHRvY2xpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnB0b2NsaW5rOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS5pbmRleGxpbms6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmluZGV4bGluazphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5pbmRleGxpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmluZGV4bGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5maWd1cmVsaXN0OnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5maWd1cmVsaXN0OmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS50YWJsZWxpc3Q6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRhYmxlbGlzdDphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50YWJsZWxpc3Q6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRhYmxlbGlzdDpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEuYm9sZGdyZXlsaW5rOmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplOiAwLjllbTsKLX0KLQotYS5ib2xkZ3JleWxpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemU6IDAuOWVtOwotfQotCi1hLmJvbGRncmV5bGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC45ZW07Ci19Ci0KLS5ydW5uaW5naGVhZGVyIHsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAwLjdlbTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDAuN2VtOwotfQotCi0ucnVubmluZ2Zvb3RlciBhOmxpbmsgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTphY3RpdmUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTp2aXNpdGVkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIGE6aG92ZXIgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0jYnJlYWRjcnVtYiwuYnJlYWRjcnVtYixzcGFuLmJyZWFkY3J1bWJzIHsKLQlmb250LXNpemU6IDAuNzVlbTsKLX0KLQotLmZhc3RwYXRoIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uZmFzdHBhdGh0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50b2MgewotCWZvbnQtc2l6ZTogc21hbGw7Ci19Ci0KLS5uZXN0ZWQwIHsKLQltYXJnaW4tdG9wOiAwZW07Ci19Ci0KLS5wIHsKLQltYXJnaW4tdG9wOiAxZW07Ci19Ci0KLXNwYW4uZmlnY2FwIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4uZmlnZGVzYyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1kaXYuZmlnYm94IHsKLQkKLX0KLQotZGl2LmZpZ3J1bGVzIHsKLQkKLX0KLQotZGl2LmZpZ25vbmUgewotCQotfQotCi0uZmlnbm9uZSB7Ci0JCi19Ci0KLS5maWdib3JkZXIgewotCQotfQotCi0uZmlnc2lkZXMgewotCQotfQotCi0uZmlndG9wIHsKLQkKLX0KLQotLmZpZ2JvdHRvbSB7Ci0JCi19Ci0KLS5maWd0b3Bib3QgewotCQotfQotCi0ucGFyZW50bGluayB7Ci0JCi19Ci0KLS5wcmV2bGluayB7Ci0JCi19Ci0KLS5uZXh0bGluayB7Ci0JCi19Ci0KLS5yZWxjb25jZXB0c2hkIHsKLQkKLX0KLQotLnJlbHRhc2tzaGQgewotCQotfQotCi0ucmVscmVmaGQgewotCQotfQotCi0uc3lubm9uZSB7Ci0JCi19Ci0KLS5zeW5ib3JkZXIgewotCQotfQotCi0uc3luc2lkZXMgewotCQotfQotCi0uc3ludG9wIHsKLQkKLX0KLQotLnN5bmJvdHRvbSB7Ci0JCi19Ci0KLS5zeW50b3Bib3QgewotCQotfQotCi0uc2tpcCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotfQotCi0uc2tpcHNwYWNlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0udWxjaGlsZGxpbmsgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5vbGNoaWxkbGluayB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotdWwsb2wgewotCW1hcmdpbi10b3A6IDAuMWVtOwotCXBhZGRpbmctdG9wOiAwLjFlbTsKLX0KLQotdWwuc2ltcGxlIHsKLQlsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ci19Ci0KLXVsLmluZGV4bGlzdCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBub25lOwotfQotCi1PTCBMSSB7Ci0JbWFyZ2luLXRvcDogMC4wZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4wZW07Ci0JbWFyZ2luLWxlZnQ6IDAuMGVtOwotfQotCi1VTCBMSSB7Ci0JbWFyZ2luLXRvcDogMC4wZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4wZW07Ci0JbWFyZ2luLWxlZnQ6IDAuMGVtOwotfQotCi1PTCBMSSBESVYgUCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotfQotCi1VTCBMSSBESVYgUCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBkaXNjOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotfQotCi0qIFtjb21wYWN0PSJ5ZXMiXT5saSB7Ci0JbWFyZ2luLXRvcDogMCBlbTsKLX0KLQotKiBbY29tcGFjdD0ibm8iXT5saSB7Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci19Ci0KLWhyIHsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JbWFyZ2luLXRvcDogMGVtOwotCXBhZGRpbmctdG9wOiAwZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLQl3aWR0aDogOTAlOwotCWNvbG9yOiAjY2NjY2NjOwotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotSDEsLnRpdGxlLC5wYWdldGl0bGUsLnRvcGljdGl0bGUxIHsKLQlmb250LXNpemU6IDEuNWVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjVlbTsKLQl3b3JkLXNwYWNpbmc6IDAuMWVtOwotfQotCi1IMiwuc3VidGl0bGUsLnBhZ2VzdWJ0aXRsZSwudG9waWN0aXRsZTIgewotCWZvbnQtc2l6ZTogMS4yNWVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4wZW07Ci19Ci0KLUgzLC5ib2xkdGl0bGUsLnRvcGljdGl0bGUzIHsKLQlmb250LXNpemU6IDEuMGVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4xZW07Ci19Ci0KLUg0LC50b3BpY3RpdGxlNCB7Ci0JZm9udC1zaXplOiAwLjllbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4xZW07Ci0JcGFkZGluZy1ib3R0b206IDAuMWVtOwotfQotCi1oNSwudG9waWN0aXRsZTUgewotCWZvbnQtc2l6ZTogMC44ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotfQotCi1oNiwudG9waWN0aXRsZTYgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotfQotCi1kaXYuaGVhZHRpdGxlIHsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tbGVmdDogMGVtOwotfQotCi1kaXYuaGVhZDAgewotCWZvbnQtc2l6ZTogMC45ZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWxlZnQ6IDBlbTsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLX0KLQotZGl2LmhlYWQxIHsKLQlmb250LXNpemU6IDAuOGVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1sZWZ0OiAxZW07Ci0JcGFkZGluZy10b3A6IDAuNWVtOwotfQotCi1kaXYuaGVhZDIgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYuaGVhZDMgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1kaXYuaGVhZDQgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNGVtOwotfQotCi1kaXYuaGVhZDUgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNWVtOwotfQotCi1kaXYuaGVhZDYgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNmVtOwotfQotCi1kaXYuaGVhZDcgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogN2VtOwotfQotCi1kaXYuaGVhZDggewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogOGVtOwotfQotCi1kaXYuaGVhZDkgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogOWVtOwotfQotCi0udGlwIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0udGlwdGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uZmlyc3Rjb2wgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ucHRvY0gxIHsKLQlmb250LXNpemU6IHgtc21hbGw7Ci19Ci0KLS5wdG9jSDIgewotCWZvbnQtc2l6ZTogeC1zbWFsbDsKLX0KLQotLnN0aXRsZSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0ubnRlIHsKLQkKLX0KLQotLnh4bGluZXMgewotCXdoaXRlLXNwYWNlOiBwcmU7Ci0JZm9udC1zaXplOiAwLjk1ZW07Ci19Ci0KLS5zZWN0aW9udGl0bGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JY29sb3I6IGJsYWNrOwotCWZvbnQtc2l6ZTogMS4yZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5pbWFnZWxlZnQgewotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLWRpdi5pbWFnZWNlbnRlciB7Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYuaW1hZ2VyaWdodCB7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLWRpdi5pbWFnZWp1c3RpZnkgewotCXRleHQtYWxpZ246IGp1c3RpZnk7Ci19Ci0KLWRpdi5tbW9iaiB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLWRpdi5tbW9iamxlZnQgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotZGl2Lm1tb2JqY2VudGVyIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotZGl2Lm1tb2JqcmlnaHQgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLXByZS5zY3JlZW4gewotCXBhZGRpbmc6IDFlbSAxZW0gMWVtIDFlbTsKLQltYXJnaW4tdG9wOiAwLjRlbTsKLQltYXJnaW4tYm90dG9tOiAwLjRlbTsKLQlib3JkZXI6IHRoaW4gc29saWQgQmxhY2s7Ci0JZm9udC1zaXplOiAxMDAlOwotfQotCi0ucHJlcmVxIHsKLQltYXJnaW4tbGVmdDogMS41ZW07Ci19Ci0KLS5kZWZMaXN0SGVhZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLXNwYW4ubXYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5tZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Ci19Ci0KLS5wayxzcGFuLnBrIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi5wa2RlZiB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLXNwYW4ucHYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5wdmRlZiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1zcGFuLmt3ZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4ua2R3ZGVmIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLnBhcm1MaXN0S3dkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnBhcm1MaXN0VmFyIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4ub3BlciB7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotfQotCi1zcGFuLm9wZXJkZWYgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1WQVIsc3Bhbi52YXIgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi52YXJkZWYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotZGl2Lm1zZyB7Ci0JcGFkZGluZzogMC4yZW0gMWVtIDFlbSAxZW07Ci0JbWFyZ2luLXRvcDogMC40ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC40ZW07Ci19Ci0KLWRpdi5tc2dudW0gewotCWZsb2F0OiBsZWZ0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQltYXJnaW4tcmlnaHQ6IDFlbTsKLX0KLQotZGl2Lm1zZ3RleHQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotZGl2Lm1zZ2l0ZW10aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXAubXNnaXRlbSB7Ci0JbWFyZ2luLXRvcDogMGVtOwotfQotCi0uYXR0ZW50aW9uLGRpdi5hdHRlbnRpb24gewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5hdHRlbnRpb250aXRsZSxzcGFuLmF0dGVudGlvbnRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmNhdXRpb250aXRsZSxkaXYuY2F1dGlvbnRpdGxlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5jYXV0aW9uLGRpdi5jYXV0aW9uIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uZGFuZ2VyLGRpdi5kYW5nZXIgewotCXBhZGRpbmc6IDAuNWVtIDAuNWVtIDAuNWVtIDAuNWVtOwotCWJvcmRlcjogc29saWQ7Ci0JYm9yZGVyLXdpZHRoOiB0aGluOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmRhbmdlcnRpdGxlLGRpdi5kYW5nZXJ0aXRsZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaW1wb3J0YW50IHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uaW1wb3J0YW50dGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ucmVtZW1iZXIgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5yZW1lbWJlcnRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnJlc3RyaWN0aW9uIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0ucmVzdHJpY3Rpb250aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi53YXJuaW5ndGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYud2FybmluZ2JvZHkgewotCW1hcmdpbi1sZWZ0OiAyZW0KLX0KLQotLm5vdGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5ub3RldGl0bGUsZGl2Lm5vdGV0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5ub3RlYm9keSB7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLX0KLQotZGl2Lm5vdGVsaXN0dGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYuZm5udW0gewotCWZsb2F0OiBsZWZ0OwotfQotCi1kaXYuZm50ZXh0IHsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYuc3RlcGwgewotCW1hcmdpbi1sZWZ0OiAyZW07Ci19Ci0KLWRpdi5zdGVwbG51bSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZmxvYXQ6IGxlZnQ7Ci0JbWFyZ2luLWxlZnQ6IDAuNWVtOwotfQotCi1kaXYuc3RlcGx0ZXh0IHsKLQltYXJnaW4tbGVmdDogNWVtOwotfQotCi1kaXYuc3RlcGxudW0gewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogMC41ZW07Ci19Ci0KLWRpdi5zdGVwbHRleHQgewotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotCW1hcmdpbi1sZWZ0OiAzZW07Ci19Ci0KLWRpdi5sZWRpIHsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1kaXYubGVkZXNjIHsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1zcGFuLnBibGt0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5wYmxrbGJsYm94IHsKLQlwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjVlbSAwLjVlbTsKLQlib3JkZXI6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLX0KLQotc3Bhbi5lZG5vdGljZXN0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4udGVybSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4uaWR4c2hvdyB7Ci0JY29sb3I6IGdyZWVuOwotfQotCi1kaXYuY29kZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi1zcGFuLnJlZmtleSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6IHdoaXRlOwotCWJhY2tncm91bmQtY29sb3I6IGJsYWNrOwotfQotCi10dC5hcGwgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotZGl2LnF1YWxpZnN0YXJ0IHsKLQlwYWRkaW5nOiAwLjFlbSAwLjVlbSAwLjVlbSAwLjVlbTsKLQlib3JkZXItdG9wOiBzb2xpZDsKLQlib3JkZXItbGVmdDogc29saWQ7Ci0JYm9yZGVyLXJpZ2h0OiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYucXVhbGlmZW5kIHsKLQlwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjFlbSAwLjVlbTsKLQlib3JkZXItYm90dG9tOiBzb2xpZDsKLQlib3JkZXItbGVmdDogc29saWQ7Ci0JYm9yZGVyLXJpZ2h0OiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi0ubm9zaGFkZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Ci19Ci0KLS54bGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS5saWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0IwQjBCMDsKLX0KLQotLm1lZGl1bSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzhDOEM4QzsKLX0KLQotLmRhcmsgewotCWJhY2tncm91bmQtY29sb3I6ICM2RTZFNkU7Ci19Ci0KLS54ZGFyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzU4NTg1ODsKLX0KLQotLmxpZ2h0LXllbGxvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZDQzsKLX0KLQotLmtoYWtpIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQzk5OwotfQotCi0ubWVkaXVtLWJsdWUgewotCWJhY2tncm91bmQtY29sb3I6ICM2Njk5Q0M7Ci19Ci0KLS5saWdodC1ibHVlIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0ZGOwotfQotCi0ubWlkLWdyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci19Ci0KLS5saWdodC1ncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQURBOwotfQotCi0ubGlnaHRlc3QtZ3JleSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U2RTZFNjsKLX0KLQotI2NoYW5nZWQgewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQlsZWZ0OiAwLjJlbTsKLQljb2xvcjogIzdCNjhFRTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotSU5QVVQuYnV0dG9ucyB7Ci0JZm9udC1zaXplOiAwLjc1ZW07Ci0JYm9yZGVyLXRvcDogMC4yZW0gb3V0c2V0ICNCMUIxQjE7Ci0JYm9yZGVyLXJpZ2h0OiAwLjJlbSBvdXRzZXQgIzAwMDAwMDsKLQlib3JkZXItYm90dG9tOiAwLjJlbSBvdXRzZXQgIzAwMDAwMDsKLQlib3JkZXItbGVmdDogMC4yZW0gb3V0c2V0ICNCMUIxQjE7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMjsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLX0KLQotLmNncmFwaGljIHsKLQlmb250LXNpemU6IDkwJTsKLQljb2xvcjogYmxhY2s7Ci19Ci0KLS5haXgsLmhwdXgsLnN1biwudW5peCwud2luMiwud2lubnQsLndpbiwuem9zLC5saW51eCwub3MzOTAsLm9zNDAwLC5jLC5jcGx1c3BsdXMsLmNvYm9sLC5mb3J0cmFuLC5qYXZhLC5tYWNvc3gsLm9zMiwucGwxLC5ycGcKLQl7Ci0JYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgbGVmdDsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLQl0ZXh0LWluZGVudDogNTVweDsKLX0KLQotLmFpeCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nYWl4LmdpZik7Ci19Ci0KLS5ocHV4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdocHV4LmdpZik7Ci19Ci0KLS5zdW4gewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3NvbGFyaXMuZ2lmKTsKLX0KLQotLnVuaXggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3VuaXguZ2lmKTsKLX0KLQotLndpbjIgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzIwMDAuZ2lmKTsKLX0KLQotLndpbnhwIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmd4cC5naWYpOwotfQotCi0ud2lubnQgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ250LmdpZik7Ci19Ci0KLS53aW4gewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3dpbi5naWYpOwotfQotCi0uem9zIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmd6b3MuZ2lmKTsKLX0KLQotLmxpbnV4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdsaW51eC5naWYpOwotfQotCi0ub3MzOTAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzM5MC5naWYpOwotfQotCi0ub3M0MDAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzQwMC5naWYpOwotfQotCi0uYyB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nYy5naWYpOwotfQotCi0uY3BsdXNwbHVzIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjcHAuZ2lmKTsKLX0KLQotLmNvYm9sIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjb2JvbC5naWYpOwotfQotCi0uZm9ydHJhbiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nZm9ydHJhbi5naWYpOwotfQotCi0uamF2YSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5namF2YS5naWYpOwotfQotCi0ubWFjb3N4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdtYWNvc3guZ2lmKTsKLX0KLQotLm9zMiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nb3MyLmdpZik7Ci19Ci0KLS5wbDEgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3BsMS5naWYpOwotfQotCi0ucnBnIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdycGcuZ2lmKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25ydGwuY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9ucnRsLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1MGIwMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25ydGwuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gfCAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA0LCAyMDA1IEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLSAKLS51bnJlc29sdmVkIHsgYmFja2dyb3VuZC1jb2xvcjogc2t5Ymx1ZTsgfQotLm5vVGVtcGxhdGUgeyBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7IH0KLQotLmJhc2UgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyB9Ci0KLS8qIEFkZCBzcGFjZSBmb3IgdG9wIGxldmVsIHRvcGljcyAqLwotLm5lc3RlZDAgeyBtYXJnaW4tdG9wIDogMWVtO30KLQotLyogZGl2IHdpdGggY2xhc3M9cCBpcyB1c2VkIGZvciBwYXJhZ3JhcGhzIHRoYXQgY29udGFpbiBibG9ja3MsIHRvIGtlZXAgdGhlIFhIVE1MIHZhbGlkICovCi0ucCB7bWFyZ2luLXRvcDogMWVtfQotCi0vKiBEZWZhdWx0IG9mIGl0YWxpY3MgdG8gc2V0IGFwYXJ0IGZpZ3VyZSBjYXB0aW9ucyAqLwotLmZpZ2NhcCB7IGZvbnQtc3R5bGU6IGl0YWxpYyB9Ci0uZmlnZGVzYyB7IGZvbnQtc3R5bGU6IG5vcm1hbCB9Ci0KLS8qIFVzZSBAZnJhbWUgdG8gY3JlYXRlIGZyYW1lcyBvbiBmaWd1cmVzICovCi0uZmlnYm9yZGVyIHsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItd2lkdGggOiAycHg7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWdzaWRlcyB7IGJvcmRlci1sZWZ0IDogMnB4IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci1yaWdodCA6IDJweCBzb2xpZDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3RvcCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWdib3R0b20geyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3RvcGJvdCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLQotLyogTW9zdCBsaW5rIGdyb3VwcyBhcmUgY3JlYXRlZCB3aXRoIDxkaXY+LiBFbnN1cmUgdGhleSBoYXZlIHNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXIuICovCi0udWxsaW5rcyB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0udWxjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ub2xjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ubGlua2xpc3QgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ubGlua2xpc3R3aXRoY2hpbGQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1yaWdodDogMS41ZW07IG1hcmdpbi1ib3R0b206IDFlbSAgfQotLnN1YmxpbmtsaXN0IHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tcmlnaHQ6IDEuNWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gIH0KLS5yZWxjb25jZXB0cyB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWx0YXNrcyB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWxyZWYgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucmVsaW5mbyB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5icmVhZGNydW1iIHsgZm9udC1zaXplIDogc21hbGxlcjsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5wcmVyZXEgeyBtYXJnaW4tcmlnaHQgOiAyMHB4O30KLQotLyogU2V0IGhlYWRpbmcgc2l6ZXMsIGdldHRpbmcgc21hbGxlciBmb3IgZGVlcGVyIG5lc3RpbmcgKi8KLS50b3BpY3RpdGxlMSB7IG1hcmdpbi10b3A6IDBwYzsgbWFyZ2luLWJvdHRvbTogLjFlbTsgZm9udC1zaXplOiAxLjM0ZW07IH0KLS50b3BpY3RpdGxlMiB7IG1hcmdpbi10b3A6IDFwYzsgbWFyZ2luLWJvdHRvbTogLjQ1ZW07IGZvbnQtc2l6ZTogMS4xN2VtOyB9Ci0udG9waWN0aXRsZTMgeyBtYXJnaW4tdG9wOiAxcGM7IG1hcmdpbi1ib3R0b206IC4xN2VtOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNCB7IG1hcmdpbi10b3A6IC44M2VtOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNSB7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU2IHsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnNlY3Rpb250aXRsZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMGVtOyBjb2xvcjogYmxhY2s7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDt9Ci0uc2VjdGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5leGFtcGxlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0vKiBBbGwgbm90ZSBmb3JtYXRzIGhhdmUgdGhlIHNhbWUgZGVmYXVsdCBwcmVzZW50YXRpb24gKi8KLS5ub3RlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5ub3RldGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ubm90ZWxpc3R0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS50aXAgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnRpcHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmZhc3RwYXRoIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5mYXN0cGF0aHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmltcG9ydGFudCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uaW1wb3J0YW50dGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVtZW1iZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlbWVtYmVydGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVzdHJpY3Rpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlc3RyaWN0aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uYXR0ZW50aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5hdHRlbnRpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXJ0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmNhdXRpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5jYXV0aW9uIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi1ib3R0b20gOiAxZW07IH0KLQotLyogU2ltcGxlIGxpc3RzIGRvIG5vdCBnZXQgYSBidWxsZXQgKi8KLXVsLnNpbXBsZSB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0KLS8qIFVzZWQgb24gdGhlIGZpcnN0IGNvbHVtbiBvZiBhIHRhYmxlLCB3aGVuIHJvd2hlYWRlcj0iZmlyc3Rjb2wiIGlzIHVzZWQgKi8KLS5maXJzdGNvbCB7IGZvbnQtd2VpZ2h0IDogYm9sZDt9Ci0KLS8qIFZhcmlvdXMgYmFzaWMgcGhyYXNlIHN0eWxlcyAqLwotLmJvbGQgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmJvbGRJdGFsaWMgeyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0uaXRhbGljIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0udW5kZXJsaW5lZCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0udWljb250cm9sIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5wYXJtbmFtZSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0ua3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5kZWZrd2QgeyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS52YXIgeyBmb250LXN0eWxlIDogaXRhbGljO30KLS5zaG9ydGN1dCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0KLS8qIERlZmF1bHQgb2YgYm9sZCBmb3IgZGVmaW5pdGlvbiBsaXN0IHRlcm1zICovCi0uZGx0ZXJtIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLQotLyogVXNlIENTUyB0byBleHBhbmQgbGlzdHMgd2l0aCBAY29tcGFjdD0ibm8iICovCi0uZGx0ZXJtZXhwYW5kIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi10b3A6IDFlbTsgfQotKltjb21wYWN0PSJ5ZXMiXT5saSB7IG1hcmdpbi10b3A6IDBlbTt9Ci0qW2NvbXBhY3Q9Im5vIl0+bGkgeyBtYXJnaW4tdG9wOiAuNTNlbTt9Ci0ubGlleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc2xpZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmRsZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmRkZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnN0ZXBleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc3Vic3RlcGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLQotLyogQWxpZ24gaW1hZ2VzIGJhc2VkIG9uIEBhbGlnbiBvbiB0b3BpYy9pbWFnZSAqLwotZGl2LmltYWdlbGVmdCB7IHRleHQtYWxpZ246IGxlZnQgfQotZGl2LmltYWdlY2VudGVyIHsgdGV4dC1hbGlnbjogY2VudGVyIH0KLWRpdi5pbWFnZXJpZ2h0IHsgdGV4dC1hbGlnbjogcmlnaHQgfQotZGl2LmltYWdlanVzdGlmeSB7IHRleHQtYWxpZ246IGp1c3RpZnkgfQotCi1wcmUuc2NyZWVuIHsgcGFkZGluZzogNXB4IDVweCA1cHggNXB4OyBib3JkZXI6IG91dHNldDsgYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsgbWFyZ2luLXRvcDogMnB4OyBtYXJnaW4tYm90dG9tIDogMnB4OyB3aGl0ZS1zcGFjZTogcHJlfQotCi0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3RFeGlzdGluZ1NlcnZlci5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvU2VsZWN0RXhpc3RpbmdTZXJ2ZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOThkYmU0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3RFeGlzdGluZ1NlcnZlci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvU2VsZWN0TmV3U2VydmVyLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3ROZXdTZXJ2ZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWY2YjQ0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3ROZXdTZXJ2ZXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2NGJiOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTIuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYTQzNDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUzLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDg3ZDBjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlNC5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmU0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzNGJiZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmU0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTUuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlNS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NDYxNGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlNS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2U5OUwuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlOTlMLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2YWJkYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2U5OUwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlRUo5LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUVKOS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNzM1MGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlRUo5LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUlBSS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VJQUkuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmY2MjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUlBSS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VMS0YuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlTEtGLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5OGY0Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VMS0YuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlTzc4LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZU83OC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MDc3ZjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlTzc4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZVU3MS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VVNzEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWUwNDMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZVU3MS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvbm90ZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvbm90ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MjYwZGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL25vdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3NlbGVjdFJvb3RFbGVtZW50RFRELnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9zZWxlY3RSb290RWxlbWVudERURC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZjI2MGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3NlbGVjdFJvb3RFbGVtZW50RFRELnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9zZWxlY3RSb290RWxlbWVudFhTRC5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvc2VsZWN0Um9vdEVsZW1lbnRYU0QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTU1ZWQzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9zZWxlY3RSb290RWxlbWVudFhTRC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxfbWFpbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbF9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwNzRlOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbF9tYWluLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWJhY2tidXR0b24uanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItYmFja2J1dHRvbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2QxYzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItYmFja2J1dHRvbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1iaW5kaW5nLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWJpbmRpbmcuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTc0ZDU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWJpbmRpbmcuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItY29tcGxleC10eXBlLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWNvbXBsZXgtdHlwZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDYwNzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItY29tcGxleC10eXBlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWZpbmlzaGVkLXdzZGwuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItZmluaXNoZWQtd3NkbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNTYzNDIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItZmluaXNoZWQtd3NkbC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1uZXctb3BlcmF0aW9uLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLW5ldy1vcGVyYXRpb24uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGMzNGEzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLW5ldy1vcGVyYXRpb24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXNrZWxldG9uLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLW5ldy1za2VsZXRvbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZGRiMjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXNrZWxldG9uLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLW5ldy13aXphcmQuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXdpemFyZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTUzZjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXdpemFyZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zZXRlbGVtZW50LWRpYWxvZy5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zZXRlbGVtZW50LWRpYWxvZy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ODE2NWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc2V0ZWxlbWVudC1kaWFsb2cuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc2V0dHlwZS1kaWFsb2cuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc2V0dHlwZS1kaWFsb2cuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTM2YTY2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLXNldHR5cGUtZGlhbG9nLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLXNtYXJ0LXJlbmFtZTEuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc21hcnQtcmVuYW1lMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjhhNDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc21hcnQtcmVuYW1lMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWJhY2tidXR0b24uanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1iYWNrYnV0dG9uLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA5MjYwNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWJhY2tidXR0b24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUxLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYjRmNmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMi5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MThjNjA2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTMuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2YjZlNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU0LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMTg3ZGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTYyMmVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTYuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU2LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyNTNiOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTYuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU3LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYjc1MjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU3LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlOC5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTguanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYxNzcyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlOC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTkuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU5LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0ZWVjYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTkuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvbm90aWNlcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvbm90aWNlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGI2MDY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL25vdGljZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TElOSyBSRUw9IlNUWUxFU0hFRVQiIEhSRUY9ImJvb2suY3NzIiBDSEFSU0VUPSJJU08tODg1OS0xIgotCVRZUEU9InRleHQvY3NzIj4KLTx0aXRsZT5MZWdhbCBOb3RpY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDM+PGEgTkFNRT0iTm90aWNlcyI+PC9hPk5vdGljZXM8L2gzPgotPHA+VGhlIG1hdGVyaWFsIGluIHRoaXMgZ3VpZGUgaXMgQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kCi1vdGhlcnMgMjAwMCwgMjAwNy48L3A+Ci08cD48YSBocmVmPSJhYm91dC5odG1sIj5UZXJtcyBhbmQgY29uZGl0aW9ucyByZWdhcmRpbmcgdGhlIHVzZSBvZiB0aGlzCi1ndWlkZS48L2E+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2M2I4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgICA9IE1hc3RlciBVc2VyIERvYyBUT0MKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0OGYzNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotCQk8dG9jIGZpbGU9InRvYy54bWwiIHByaW1hcnk9InRydWUiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotCQk8dG9jIGZpbGU9InJlZmVyZW5jZV90b2MueG1sIi8+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3JlZmVyZW5jZV90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvcmVmZXJlbmNlX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNGI3MjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvcmVmZXJlbmNlX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIERlZmluZSB0aGUgdG9wIGxldmVsIHRvcGljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0b2MgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSByZWZlcmVuY2UgaW5mb3JtYXRpb24iPgotICAgPGFuY2hvciBpZD0iY29tbWFuZF9yZWZlcmVuY2UiLz4KLSAgIDxhbmNob3IgaWQ9IlVJX3JlZmVyZW5jZSIvPgotICAgPGFuY2hvciBpZD0iamF2YWRvY19jb21tb24iLz4KLSAgIDxhbmNob3IgaWQ9ImphdmFkb2NfZWpidG9vbHMiLz4KLSAgIDxhbmNob3IgaWQ9ImphdmFkb2NfamVldG9vbHMiLz4KLSAgIDxhbmNob3IgaWQ9ImphdmFkb2Nfc2VydmVydG9vbHMiLz4KLSAgIDxhbmNob3IgaWQ9ImphdmFkb2Nfc291cmNlZWRpdGluZyIvPgotICAgPGFuY2hvciBpZD0iamF2YWRvY194bWwiLz4KLSAgIDxhbmNob3IgaWQ9ImphdmFkb2Nfd2Vic2VydmljZXMiLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDQyNzBjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIERlZmluZSB0aGUgdG9wIGxldmVsIHRvcGljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0b2MgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSBVc2VyIEd1aWRlIgotCXRvcGljPSJ0b3BpY3Mvb3ZlcnZpZXcuaHRtbCI+Ci0KLQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIFdlYiBhcHBsaWNhdGlvbnMiPgotCQk8bGluawotCQkJdG9jPSIuLi9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvd2VidG9vbHNfdG9jLnhtbCIgLz4KLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgSmF2YSBFRSBhbmQgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiPgotCQk8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2pzdF9qMmVlX3RvYy54bWwiIC8+Ci0JCTxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci9lamJfdG9jLnhtbCIgLz4KLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iRWRpdGluZyBtYXJrdXAgbGFuZ3VhZ2UgZmlsZXMiCi0JCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCI+Ci0JCTxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9zc2VfdG9jLnhtbCIgLz4KLQkJPGxpbmsKLQkJCXRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERFZGl0b3JtYXBfdG9jLnhtbCIgLz4KLQkJPGxpbmsKLQkJCXRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy54bWwiIC8+Ci0JCTxsaW5rCi0JCQl0b2M9Ii4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNEZWRpdG9ybWFwX3RvYy54bWwiIC8+Ci0JPC90b3BpYz4KLQk8IS0tIDxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbC5kb2MudXNlci94bWxfdG9jLnhtbCIvPi0tPgotCTx0b3BpYyBsYWJlbD0iRGV2ZWxvcGluZyBXZWIgc2VydmljZSBhcHBsaWNhdGlvbnMiPgotCQk8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci93ZWJzZXJ2aWNlX3RvYy54bWwiIC8+Ci0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IlVzaW5nIHRoZSBzZXJ2ZXIgdG9vbHMiPgotICAJCTxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5kb2MudXNlci93dHBfbWFpbl90b2MueG1sIiAvPgotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJSZWZlcmVuY2UiPgotICAJCTxsaW5rIHRvYz0icmVmZXJlbmNlX3RvYy54bWwiIC8+Ci0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IkxpbWl0YXRpb25zIGFuZCBLbm93biBJc3N1ZXMiIGhyZWY9InRvcGljcy9saW1pdGF0aW9ucy5odG1sIiAvPgotCTx0b3BpYyBsYWJlbD0iTGVnYWwiIGhyZWY9Im5vdGljZXMuaHRtbCIgLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvcGljcy9saW1pdGF0aW9ucy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9waWNzL2xpbWl0YXRpb25zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OTBiZDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9waWNzL2xpbWl0YXRpb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIgotCWhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiA+Ci08dGl0bGU+V2ViIFRvb2xzIFBsYXRmb3JtIExpbWl0YXRpb25zIGFuZCBLbm93biBJc3N1ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+V2ViIFRvb2xzIFBsYXRmb3JtIExpbWl0YXRpb25zIGFuZCBLbm93biBJc3N1ZXM8L2gxPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgbGltaXRhdGlvbnMgYW5kIGtub3duIGlzc3Vlczo8L3A+Ci08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+PGI+V2hlbiB1c2luZyBYRG9jbGV0IHRoZSBnZW5lcmF0aW9uIGRvZXMgbm90IGFwcGVhciB0byBydW4uPC9iPjwvZHQ+Ci08ZGQ+PHA+Q2F1c2U6IFhEb2NsZXQgaGFzIHNvbWUgbGltaXRhdGlvbnMgd2l0aCBsb25nIHBhdGggbmFtZXMuPC9wPgotPHA+U29sdXRpb246IFlvdSBzaG91bGQgaW5zdGFsbCBFY2xpcHNlIGFuZCB0aGUgV2ViIFRvb2xzIFBsYXRmb3JtIGludG8gYSBkaXJlY3Rvcnkgd2l0aCBhIHNob3J0Ci1wYXRoLjwvcD4KLTwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+PGI+V2hlbiBjcmVhdGluZyBhIFdlYiBzZXJ2aWNlIHlvdSBtYXkgc2VlIGEgbWVzc2FnZSBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgb25lOjwvYj48L2R0PgotPGRkPjxwPjxzYW1wPm9yZy5hcGFjaGUuYXhpcy51dGlscy5KYXZhVXRpbHMgaXNBdHRhY2htZW50U3VwcG9ydGVkCi1XQVJOSU5HOiBVbmFibGUgdG8gZmluZCByZXF1aXJlZCBjbGFzc2VzIChqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIGFuZCAKLWphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU11bHRpcGFydCkuIEF0dGFjaG1lbnQgc3VwcG9ydCBpcyBkaXNhYmxlZC4KLTwvc2FtcD48L3A+Ci08cD5DYXVzZTogQXR0YWNobWVudCBzdXBwb3J0IGlzIGRpc2FibGVkLjwvcD4KLTxwPlNvbHV0aW9uOiBUaGUgQXBhY2hlIEF4aXMgdG9vbHMgc2hvdWxkIGF1dG8tZGV0ZWN0IHRoZSBqYXZheC5hY3RpdmF0aW9uIGNsYXNzZXMgcHJvdmlkZWQgeW91IGFkZCAKLTxzYW1wPmFjdGl2YXRpb24uamFyPC9zYW1wPiB0byB0aGUgYnVpbGQgcGF0aCBvZiB0aGUgcHJvamVjdCB0byB3aGljaCB5b3UgYXJlIGdlbmVyYXRpbmcgeW91ciBXZWIgc2VydmljZSBvciBjbGllbnQuIAotRm9yIHNlcnZpY2VzLCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gbWFrZSBzdXJlIDxzYW1wPmFjdGl2YXRpb24uamFyPC9zYW1wPiBpcyBhdmFpbGFibGUgdG8gdGhlIFRvbWNhdCBKUkUsIGVpdGhlciBieSAKLWluY2x1ZGluZyBpdCBpbiB0aGUgc2VydmVyJ3MgZ2xvYmFsIGNsYXNzcGF0aCBvciBieSBwbGFjaW5nIGEgY29weSBvZiBhY3RpdmF0aW9uLmphciBpbnRvIHRoZSB0YXJnZXQgV2ViIAotcHJvamVjdCdzIDxzYW1wPmxpYi88L3NhbXA+IGRpcmVjdG9yeS4KLTwvcD4KLTwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+PGI+UHJvYmxlbXMgZW5jb3VudGVyZWQgcHVibGlzaGluZyBmcm9tIGR5bmFtaWMgV2ViIHByb2plY3RzIHdpdGggbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gdGhlIGNvbnRleHQgcm9vdDwvYj48L2R0PgotPGRkPgotPHA+Q2F1c2U6IEJ5IGRlZmF1bHQgdGhlIGNvbnRleHQgcm9vdCBvZiBhIGR5bmFtaWMgV2ViIHByb2plY3QgdXNlcyB0aGUgcHJvamVjdCBuYW1lLiBJZiBub24tQVNDSUkgY2hhcmFjdGVycyBhcmUgdXNlZCBhcyBwcm9qZWN0IG5hbWVzIGZvciBkeW5hbWljIFdlYiBwcm9qZWN0cywgCi10aGUgZGVmYXVsdCBjb250ZXh0IHJvb3QgY2F1c2VzIHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvIHB1Ymxpc2ggZnJvbSB0aGUgV2ViIHByb2plY3QuPC9wPgotPHA+WW91IG1heSBlbmNvdW50ZXIgdGhlIGZvbGxvd2luZyBlcnJvcnMgaWYgdGhpcyBvY2N1cnM6Ci08dWw+Ci08bGk+SWYgeW91IGNyZWF0ZSBhIGR5bmFtaWMgV2ViIHByb2plY3Qgd2l0aCBub24tQVNDSUkgY2hhcmFjdGVycyAobGVhdmluZyB0aGUgY29udGV4dCByb290Ci10byBkZWZhdWx0IHRvIHRoZSBwcm9qZWN0IG5hbWUgY29udGFpbmluZyBub24gQVNDSUkgY2hhcmFjdGVycykgYW5kIHRyeSB0bwotcHVibGlzaCwgeW91IHdpbGwgc2VlIGFuIGVycm9yIG1lc3NhZ2Ugc2ltaWxhciB0byAiVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBub3QgYXZhaWxhYmxlIi48L2xpPgotPGxpPklmIGEgZHluYW1pYyBXZWIgcHJvamVjdCBjb250YWluaW5nIGEgbm9uLUFTQ0lJIGNvbnRleHQgcm9vdCBpcyB1c2VkIGluIGFuIEF4aXMxIFdlYiBzZXJ2aWNlIGNyZWF0aW9uIAotc2NlbmFyaW8sIHlvdSB3aWxsIHNlZSBhbiBlcnJvciBtZXNzYWdlIHNpbWlsYXIgdG8gIlVuYWJsZSB0byBkZXBsb3kgdG8gQXhpcyIuPC9saT4KLTwvdWw+Ci08cD5Tb2x1dGlvbjogVGhlIGZvbGxvd2luZyBBU0NJSSBjaGFyYWN0ZXJzIGFyZSB2YWxpZCBpbiB0aGUgY29udGV4dCByb290OiBhbGwgbGV0dGVycywgYWxsIG51bWJlcnMsIGFuIHVuZGVyc2NvcmUsIGEgaHlwaGVuIChkYXNoKSwgYSBmb3J3YXJkIHNsYXNoLCBvciBhIHBlcmlvZC48L3A+Ci08L2RkPgotPC9kbD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci90b3BpY3Mvb3ZlcnZpZXcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvcGljcy9vdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWI1MWJlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvcGljcy9vdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLQlocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgPgotPHRpdGxlPldlYiBUb29scyBQcm9qZWN0IE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgxPldlYiBUb29scyBQcm9qZWN0IE92ZXJ2aWV3PC9oMT4KLTxwPlRoZSBXZWIgVG9vbHMgUHJvamVjdCBhaW1zIHRvIHByb3ZpZGUgY29tbW9uIGluZnJhc3RydWN0dXJlIGF2YWlsYWJsZQotdG8gYW55IEVjbGlwc2UtYmFzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgdGFyZ2V0aW5nIFdlYi1lbmFibGVkCi1hcHBsaWNhdGlvbnMuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyZjY5ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvRWRpdG9yRHRkQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvRWRpdG9yRHRkQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjY2Y2U0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL0VkaXRvckR0ZENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPCEtLSBwbHVnaW46IG9yZy5lY2xpcHNlLndzdC5kdGQudWkgLS0+Ci0KLTxjb250ZXh0cz4KLQk8Y29udGV4dCBpZD0iY3NoX291dGVyX2NvbnRhaW5lciI+Ci0JCTxkZXNjcmlwdGlvbiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2VieDAwMjAiPjwhLS0gZHRkIGZpbGVzIHByZWZlcmVuY2UgcGFnZSAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJVGhpcyBwYWdlIGxldHMgeW91IGNob29zZSB3aGljaCBzdWZmaXggKDxiPmR0ZDwvYj4sIDxiPmVudDwvYj4sIG9yIDxiPm1vZDwvYj4pIGlzIGFkZGVkIHdoZW4gYSBuZXcgRFREIGZpbGUgaXMgY3JlYXRlZC4KLQkJPC9kZXNjcmlwdGlvbj4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndlYngwMDIxIj48IS0tIGR0ZCBzdHlsZXMgcHJlZmVyZW5jZSBwYWdlIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlUaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nIHRoYXQgdGhlIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBlZGl0b3IgZG9lcyB3aGVuIHlvdSBhcmUgZWRpdGluZyBhIGZpbGUuCi0KLQkJCVRoZSA8Yj5Db250ZW50IHR5cGU8L2I+IGZpZWxkIGNvbnRhaW5zIGEgbGlzdCBvZiBhbGwgdGhlIHNvdXJjZSB0eXBlcyB0aGF0IHlvdSBjYW4gc2VsZWN0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci4gWW91IGNhbiBlaXRoZXIgc2VsZWN0IHRoZSBjb250ZW50IHR5cGUgdGhhdCB5b3Ugd2FudCB0byB3b3JrIHdpdGggZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QsIG9yIGNsaWNrIHRleHQgaW4gdGhlIHRleHQgc2FtcGxlIHdpbmRvdyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjb250ZW50IHR5cGUgZm9yIHdoaWNoIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgdGV4dCBoaWdobGlnaHRpbmcuCi0KLQkJCVRoZSA8Yj5Gb3JlZ3JvdW5kPC9iPiBhbmQgPGI+QmFja2dyb3VuZDwvYj4gcHVzaCBidXR0b25zIG9wZW4gPGI+Q29sb3I8L2I+IGRpYWxvZyBib3hlcyB0aGF0IGFsbG93IHlvdSB0byBzcGVjaWZ5IHRleHQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMsIHJlc3BlY3RpdmVseS4gU2VsZWN0IHRoZSA8Yj5Cb2xkPC9iPiBjaGVjayBib3ggdG8gbWFrZSB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZSBhcHBlYXIgaW4gYm9sZC4KLQotCQkJQ2xpY2sgdGhlIDxiPlJlc3RvcmUgRGVmYXVsdDwvYj4gcHVzaCBidXR0b24gdG8gc2V0IHRoZSBoaWdobGlnaHRpbmcgc3R5bGVzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0Lmh0bWwiCi0JCQlsYWJlbD0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndlYngwMDIyIj48IS0tIGR0ZCB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVRlbXBsYXRlcyBhcmUgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgRFREIGZpbGUgd2hlbiBpdCBpcyBjcmVhdGVkLgotCi0JCQlDbGljayA8Yj5OZXc8L2I+IGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGNvbXBsZXRlbHkgbmV3IHRlbXBsYXRlLgotCi0JCQlTdXBwbHkgYSBuZXcgdGVtcGxhdGUgPGI+TmFtZTwvYj4gYW5kIDxiPkRlc2NyaXB0aW9uPC9iPi4gVGhlIDxiPkNvbnRleHQ8L2I+IGZvciB0aGUgdGVtcGxhdGUgaXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwgbGlzdCB3aGVuIGNvbnRlbnQgYXNzaXN0IGlzIHJlcXVlc3RlZC4gU3BlY2lmeSB0aGUgPGI+UGF0dGVybjwvYj4gZm9yIHlvdXIgdGVtcGxhdGUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIHRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuCi0KLQkJCUlmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPGI+SW5zZXJ0IFZhcmlhYmxlPC9iPiBidXR0b24gYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuIEZvciBleGFtcGxlLCB0aGUgPGI+ZGF0ZTwvYj4gdmFyaWFibGUgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGRhdGUgd2lsbCBiZSBpbnNlcnRlZC4KLQotCQkJWW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlIHNhbWUgUHJlZmVyZW5jZXMgcGFnZS4KLQotCQkJSWYgeW91IGhhdmUgYSB0ZW1wbGF0ZSB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QsIGNsZWFyIGl0cyBjaGVjayBib3ggaW4gdGhlIDxiPlRlbXBsYXRlczwvYj4gcHJlZmVyZW5jZXMgcGFnZS4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZHRlbXBsdC5odG1sIgotCQkJbGFiZWw9Ildvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzIiAvPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0ZHRkLmh0bWwiCi0JCQlsYWJlbD0iQ3JlYXRpbmcgRFREIGZpbGVzIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iIj48IS0tIGNyZWF0ZSBkdGQgcGFnZSAxIGhhcyBubyBpZCBhdG0gLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCUluIHRoZSA8Yj5GaWxlIG5hbWU8L2I+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mIHRoZSBEVEQuIFRoZSBuYW1lIG9mIHlvdXIgRFREIGZpbGUgbXVzdCBlbmQgd2l0aCB0aGUgZXh0ZW5zaW9uIC5kdGQKLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5odG1sIgotCQkJbGFiZWw9IiIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImR0ZHcwMDEwIj48IS0tIGR0ZCBuZXcgZmlsZSB3aXphcmQgcGFnZSAyLCBwYWdlIDEgaGFzIG5vIElEIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlDbGljayB0aGUgPGI+VXNlIERURCBUZW1wbGF0ZTwvYj4gY2hlY2sgYm94IGlmIHlvdSB3YW50IHRvIHVzZSBhIERURCB0ZW1wbGF0ZSBhcyB0aGUgaW5pdGlhbCBjb250ZW50IGluIHlvdXIgbmV3IERURCBwYWdlLiBBIGxpc3Qgb2YgYXZhaWxhYmxlIERURCB0ZW1wbGF0ZXMgaXMgbGlzdGVkIC0gc2VsZWN0IHRoZSBvbmUgeW91IHdhbnQgdG8gdXNlLiBBIHByZXZpZXcgb2YgeW91ciBEVEQgZmlsZSBpcyBzaG93biBvbmNlIHlvdSBzZWxlY3QgYSBEVEQgdGVtcGxhdGUuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGR0ZW1wbHQuaHRtbCIKLQkJCWxhYmVsPSJXb3JraW5nIHdpdGggRFREIHRlbXBsYXRlcyIgLz4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5odG1sIgotCQkJbGFiZWw9IkNyZWF0aW5nIERURCBmaWxlcyIgLz4KLQk8L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvRWRpdG9yRHRkQ29udGV4dHMyLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL0VkaXRvckR0ZENvbnRleHRzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNDRkMjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvRWRpdG9yRHRkQ29udGV4dHMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImNzaF9vdXRlcl9jb250YWluZXIiPgotPGRlc2NyaXB0aW9uLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJkdGRzb3VyY2Vfc291cmNlX0hlbHBJZCI+Ci08ZGVzY3JpcHRpb24+VGhlIERURCBlZGl0b3IgbGV0cyB5b3UgZWRpdCBhIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbi4KLQotVGhlIGVkaXRvciBwcm92aWRlcyB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMgc3VjaCBhcyBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCB1bmxpbWl0ZWQgdW5kbyBhbmQgcmVkby4KLTwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM1MzY4Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjQwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U4YjM3YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgRWRpdG9yRHRkQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBFZGl0b3JEdGRDb250ZXh0czIueG1sCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwOTRkNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgICAgID0gRFREIEVkaXRvciBpbmZvcG9wcwotcGx1Z2luUHJvdmlkZXIgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNTdmYmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9yRHRkQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpIi8+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IkVkaXRvckR0ZENvbnRleHRzMi54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSIvPgotPC9leHRlbnNpb24+Ci0KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwZmM5Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyXzEuMC4wLmphcgotdGVtcApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4NmQ3YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjM3OjIxIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAxNiAxNDowNToyOSBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFRERWRpdG9ybWFwX3RvYy5kaXRhbWFwIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RUREVkaXRvcm1hcF90b2MuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhNzdlZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFRERWRpdG9ybWFwX3RvYy5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgTWFwLy9FTiINCi0gIm1hcC5kdGQiPg0KLTxtYXAgY29sbGVjdGlvbi10eXBlPSJzZXF1ZW5jZSIgaWQ9ImR0ZGVkaXRvclRPQyIgdGl0bGU9IkRURCBFZGl0b3IiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dvcmtkdGRzLmRpdGEiIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggRFREcyIgdHlwZT0iY29uY2VwdCI+DQotPGFuY2hvciBpZD0iZHRkX3Bvc3RfY3dvcmtkdGRzIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3JldGR0ZC5kaXRhIiBsaW5raW5nPSJub3JtYWwiIG5hdnRpdGxlPSJDcmVhdGluZyBEVERzIg0KLXR5cGU9InRhc2siPg0KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X3RjcmV0ZHRkIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jZHRkb3Zlci5kaXRhIiBsaW5raW5nPSJzb3VyY2Vvbmx5IiBuYXZ0aXRsZT0iRG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIC0gT3ZlcnZpZXciDQotdHlwZT0iY29uY2VwdCI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJkdGRfcG9zdF9jZHRkb3ZlciIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHNyY3N0LmRpdGEiIGxpbmtpbmc9InNvdXJjZW9ubHkiIG5hdnRpdGxlPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0iZHRkX3Bvc3RfY3RlZHRzcmNzdCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGR0ZW1wbHQuZGl0YSIgbGlua2luZz0ic291cmNlb25seSIgbmF2dGl0bGU9Ildvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0iZHRkX3Bvc3RfdGR0ZW1wbHQiLz48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGltcHRkdGQuZGl0YSIgbmF2dGl0bGU9IkltcG9ydGluZyBEVERzIiB0eXBlPSJ0YXNrIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X3RpbXB0ZHRkIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dmFsZHRkLmRpdGEiIG5hdnRpdGxlPSJWYWxpZGF0aW5nIERURHMiIHR5cGU9InRhc2siPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0iZHRkX3Bvc3RfdHZhbGR0ZCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcmR0ZGljb25zLmRpdGEiIG5hdnRpdGxlPSJJY29ucyB1c2VkIGluIHRoZSBEVEQgZWRpdG9yIg0KLXR5cGU9InJlZmVyZW5jZSI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJkdGRfcG9zdF9yZHRkaWNvbnMiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JkdGRrZXkuZGl0YSIgbmF2dGl0bGU9IkRURCBlZGl0b3Iga2V5Ym9hcmQgc2hvcnRjdXRzIg0KLXR5cGU9InJlZmVyZW5jZSI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJkdGRfcG9zdF9yZHRka2V5Ii8+PC90b3BpY3JlZj4NCi08L21hcD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFRERWRpdG9ybWFwX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFRERWRpdG9ybWFwX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNWQ5ODguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RUREVkaXRvcm1hcF90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iRFREIEVkaXRvciIgdG9waWM9InRvcGljcy9jd29ya2R0ZHMuaHRtbCI+Ci08dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBEVERzIiBocmVmPSJ0b3BpY3MvY3dvcmtkdGRzLmh0bWwiPgotPGFuY2hvciBpZD0iZHRkX3Bvc3RfY3dvcmtkdGRzIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIERURHMiIGhyZWY9InRvcGljcy90Y3JldGR0ZC5odG1sIj4KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X3RjcmV0ZHRkIi8+Ci08dG9waWMgbGFiZWw9IkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMgKERURHMpIC0gb3ZlcnZpZXciIGhyZWY9InRvcGljcy9jZHRkb3Zlci5odG1sIi8+Ci08YW5jaG9yIGlkPSJkdGRfcG9zdF9jZHRkb3ZlciIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBocmVmPSJ0b3BpY3MvdGVkdHNyY3N0Lmh0bWwiLz4KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X2N0ZWR0c3Jjc3QiLz4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90ZHRlbXBsdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJkdGRfcG9zdF90ZHRlbXBsdCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIERURHMiIGhyZWY9InRvcGljcy90aW1wdGR0ZC5odG1sIi8+Ci08YW5jaG9yIGlkPSJkdGRfcG9zdF90aW1wdGR0ZCIvPgotPHRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIERURHMiIGhyZWY9InRvcGljcy90dmFsZHRkLmh0bWwiLz4KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X3R2YWxkdGQiLz4KLTx0b3BpYyBsYWJlbD0iSWNvbnMgdXNlZCBpbiB0aGUgRFREIGVkaXRvciIgaHJlZj0idG9waWNzL3JkdGRpY29ucy5odG1sIi8+Ci08YW5jaG9yIGlkPSJkdGRfcG9zdF9yZHRkaWNvbnMiLz4KLTx0b3BpYyBsYWJlbD0iRFREIGVkaXRvciBrZXlib2FyZCBzaG9ydGN1dHMiIGhyZWY9InRvcGljcy9yZHRka2V5Lmh0bWwiLz4KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X3JkdGRrZXkiLz4KLTwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERyZWZ0YWJsZS5kaXRhbWFwIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RURHJlZnRhYmxlLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNWIwMzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RURHJlZnRhYmxlLmRpdGFtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIiAibWFwLmR0ZCI+DQotPG1hcD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3JldGR0ZC5kaXRhIiBsaW5raW5nPSJub3JtYWwiIG5hdnRpdGxlPSJDcmVhdGluZyBhIG5ldyBEVEQiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NkdGRvdmVyLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJEb2N1bWVudCB0eXBlIGRlZmluaXRpb24gLSBPdmVydmlldyINCi10eXBlPSJjb25jZXB0Ij48L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jZHRkb3Zlci5kaXRhIiBuYXZ0aXRsZT0iRG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIC0gT3ZlcnZpZXciDQotdHlwZT0iY29uY2VwdCI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R2YWxkdGQuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgRFREcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3JldGR0ZC5kaXRhIiBsaW5raW5nPSJub3JtYWwiIG5hdnRpdGxlPSJDcmVhdGluZyBhIG5ldyBEVEQiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RkdGVtcGx0LmRpdGEiIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggRFREIHRlbXBsYXRlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08L21hcD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFREcmVmdGFibGUueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RURHJlZnRhYmxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJkZDMwYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFREcmVmdGFibGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyB0b3BpYz0idG9waWNzL3RjcmV0ZHRkLmh0bWwiPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBEVERzIiBocmVmPSJ0b3BpY3MvdGNyZXRkdGQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJEb2N1bWVudCB0eXBlIGRlZmluaXRpb25zIChEVERzKSAtIG92ZXJ2aWV3IiBocmVmPSJ0b3BpY3MvY2R0ZG92ZXIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJEb2N1bWVudCB0eXBlIGRlZmluaXRpb25zIChEVERzKSAtIG92ZXJ2aWV3IiBocmVmPSJ0b3BpY3MvY2R0ZG92ZXIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIERURHMiIGhyZWY9InRvcGljcy90dmFsZHRkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgRFREcyIgaHJlZj0idG9waWNzL3RjcmV0ZHRkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90ZHRlbXBsdC5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9Eb2NCdWlsZC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRG9jQnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjNkMGViLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9Eb2NCdWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0gCi0KLQlUaGlzIHNjcmlwdCBidWlsZCB0aGUgSGVscCBwbHVnLWluIGJ5IHRyYW5zZm9ybWluZyB0aGUgRElUQSBzb3VyY2UgZmlsZXMgaW50byBIVE1MLgotCQotCVRvIHVzZSB0aGlzIHNjcmlwdCwgeW91IG11c3QgaW5zdGFsbCBESVRBLU9UIG9uIHlvdXIgbWFjaGluZSBpbiB0aGUgZGlyZWN0b3J5Ci0JZGVmaW5lZCBieSB0aGUgZGl0YS5vdC5kaXIgcHJvcGVydHkuCi0JCi0JUnVuIHRoZSBkZWZhdWx0IHRhcmdldCBhZnRlciB5b3UgZWRpdCB0aGUgRElUQSBzb3VyY2UgZmlsZXMgdG8gcmVnZW5lcmF0ZSB0aGUgSFRNTC4KLQkKLQlUbyBjdXN0b21pemUgdGhpcyBzY3JpcHQgZm9yIG90aGVyIEhlbHAgcGx1Zy1pbnMsIG1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIGFyZ3MuaW5wdXQgcHJvcGVydHkKLQl0byBiZSB0aGUgRElUQSBtYXAgZmlsZSBmb3IgdGhlIHBsdWctaW4uCi0JCi0JTk9URTogVGhpcyBzY3JpcHQgYXNzdW1lcyB0aGF0IGxpbmtzIHRvIHNpYmxpbmcgSGVscCBwbHVnLWlucyBoYXZlIHNjb3BlPSJwZWVyIiwgb3RoZXJ3aXNlIHRoZQotCW91dHB1dCBkaXJlY3Rvcnkgc3RydWN0dXJlIHdpbGwgYmUgc2hpZnRlZCBpbmNvcnJlY3RseS4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgeW91IGhhbmQgY29kZSB5b3VyIHBsdWdpbi54bWwgZmlsZSBpbiBteXBsdWdpbi54bWwuIFRoaXMgZmlsZQotCXdpbGwgYmUgY29waWVkIG92ZXIgdGhlIGdlbmVyYXRlZCBwbHVnaW4ueG1sIHdoaWNoIGlzIGN1cnJlbnRseSBub3QgYmVpbmcgZ2VuZXJhdGVkIGNvcnJlY3RseQotCWJ5IERJVEEtT1QuCi0JCi0JQ2hhbmdlTG9nOgotCTIwMDYtMDQtMDUgQXJ0aHVyIFJ5bWFuIDxyeW1hbkBjYS5pYm0uY29tPgotCS0gQ3JlYXRlZC4KLQkyMDA4LTAxLTA5IEthdGUgUHJpY2UgPGthdGVwQGNhLmlibS5jb20+Ci0JLSBtb2RpZmllZCBmb3IgbmV3IERJVEEtT1QgdmVyc2lvbgotCTIwMDgtMDUtMDUgS2F0ZSBQcmljZSA8a2F0ZXBAY2EuaWJtLmNvbT4KLQktIG1vZGlmaWVkIHRvIGFkZCBnZW5lcmF0aW9uIG9mIHByZS1idWlsdCBoZWxwIGluZGV4LiAKLQktIE11c3QgZGVsZXRlIC9pbmRleCBmb2xkZXIgYmVmb3JlIHJ1bm5pbmcgYnVpbGQKLS0tPgotPHByb2plY3QgbmFtZT0iZWNsaXBzZWhlbHAiIGRlZmF1bHQ9ImFsbCI+Ci0KLQk8cHJvcGVydHkgbmFtZT0iZGl0YS5vdC5kaXIiIGxvY2F0aW9uPSJDOi9ESVRBLU9UMS4yLjIiIC8+Ci0KLQk8cGF0aCBpZD0iZG9zdC5jbGFzcy5wYXRoIj4KLQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9bGliJHtmaWxlLnNlcGFyYXRvcn1kb3N0LmphciIgLz4KLQk8L3BhdGg+Ci0KLQk8dGFza2RlZiBuYW1lPSJpbnRlZ3JhdGUiIGNsYXNzbmFtZT0ib3JnLmRpdGEuZG9zdC5wbGF0Zm9ybS5JbnRlZ3JhdG9yVGFzayI+Ci0JCTxjbGFzc3BhdGggcmVmaWQ9ImRvc3QuY2xhc3MucGF0aCIgLz4KLQk8L3Rhc2tkZWY+Ci0JPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImludGVncmF0ZSwgZWNsaXBzZWhlbHAiPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iaW50ZWdyYXRlIj4KLQkJPGludGVncmF0ZSBkaXRhZGlyPSIke2RpdGEub3QuZGlyfSIgLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gcmV2aXNlIGJlbG93IGhlcmUgLS0+Ci0JPHRhcmdldCBuYW1lPSJlY2xpcHNlaGVscCI+Ci0JCTxhbnQgYW50ZmlsZT0iJHtkaXRhLm90LmRpcn0ke2ZpbGUuc2VwYXJhdG9yfWNvbmR1Y3Rvci54bWwiIHRhcmdldD0iaW5pdCIgZGlyPSIke2RpdGEub3QuZGlyfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5jb3B5Y3NzIiB2YWx1ZT0ibm8iIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5jc3NwYXRoIiB2YWx1ZT0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuZWNsaXBzZS5wcm92aWRlciIgdmFsdWU9IkVjbGlwc2Uub3JnIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuZWNsaXBzZS52ZXJzaW9uIiB2YWx1ZT0iMy40LjAiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5pbnB1dCIgbG9jYXRpb249IkRURHJlZnRhYmxlLmRpdGFtYXAiIC8+ICAgIAkJCi0JCQk8cHJvcGVydHkgbmFtZT0iY2xlYW4udGVtcCIgdmFsdWU9InRydWUiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iZGl0YS5leHRuYW1lIiB2YWx1ZT0iLmRpdGEiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iZGl0YS50ZW1wLmRpciIgbG9jYXRpb249InRlbXAiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0LmRpciIgbG9jYXRpb249IiIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJ0cmFuc3R5cGUiIHZhbHVlPSJlY2xpcHNlaGVscCIgLz4KLQkJPC9hbnQ+Ci0JCTxjb3B5IGZpbGU9Im15cGx1Z2luLnhtbCIgdG9maWxlPSJwbHVnaW4ueG1sIiBvdmVyd3JpdGU9InllcyIgLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLmluZGV4IiBkZXNjcmlwdGlvbj0iQnVpbGRzIHNlYXJjaCBpbmRleCBmb3IgdGhlIHBsdWctaW4iIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgotCSAgICAgPGhlbHAuYnVpbGRIZWxwSW5kZXggbWFuaWZlc3Q9InBsdWdpbi54bWwiIGRlc3RpbmF0aW9uPSIuIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3Y2UwODUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjcwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZmUzNTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBEVERFZGl0b3JtYXBfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwsXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8qLmh0bSosXAotICAgICAgICAgICAgICAgaW5kZXgvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gKi5tYXBsaXN0LFwKLSAgICAgICAgICAgICAgICouZGl0YW1hcCxcCi0gICAgICAgICAgICAgICB0b3BpY3MvKi5kaXRhCi1iaW4uZXhjbHVkZXMgPSBEb2NCdWlsZC54bWwsXAotICAgICAgICAgICAgICAgbXlQbHVnaW4qLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2RpdGEubGlzdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9kaXRhLmxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZGQ5OWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2RpdGEubGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUaHUgT2N0IDE1IDExOjM2OjQ5IEVEVCAyMDA5DQotdXNlci5pbnB1dC5maWxlPURURHJlZnRhYmxlLmRpdGFtYXANCi11c2VyLmlucHV0LmRpcj1EXDpcXERvY3NcXFdUUDNcXG9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXINCi1mbGFnaW1hZ2VsaXN0PQ0KLWZ1bGxkaXRhbWFwbGlzdD1EVERyZWZ0YWJsZS5kaXRhbWFwDQotY29ucmVmbGlzdD0NCi1ocmVmdGFyZ2V0c2xpc3Q9dG9waWNzL3RkdGVtcGx0LmRpdGEsdG9waWNzL3RjcmV0ZHRkLmRpdGEsdG9waWNzL3R2YWxkdGQuZGl0YSx0b3BpY3MvY2R0ZG92ZXIuZGl0YQ0KLWZ1bGxkaXRhdG9waWNsaXN0PXRvcGljcy90ZHRlbXBsdC5kaXRhLHRvcGljcy90Y3JldGR0ZC5kaXRhLHRvcGljcy90dmFsZHRkLmRpdGEsdG9waWNzL2NkdGRvdmVyLmRpdGENCi1mdWxsZGl0YW1hcGFuZHRvcGljbGlzdD10b3BpY3MvdGR0ZW1wbHQuZGl0YSx0b3BpY3MvdGNyZXRkdGQuZGl0YSxEVERyZWZ0YWJsZS5kaXRhbWFwLHRvcGljcy90dmFsZHRkLmRpdGEsdG9waWNzL2NkdGRvdmVyLmRpdGENCi1odG1sbGlzdD0NCi1pbWFnZWxpc3Q9DQotaHJlZmRpdGF0b3BpY2xpc3Q9dG9waWNzL3R2YWxkdGQuZGl0YQ0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0NvbW1lbnQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfQ29tbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjExZDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfQ29tbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9FbGVtZW50LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY0ODg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfRW50aXR5LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDE1MDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfRW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZmE5YjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9Ob3RhdGlvbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9Ob3RhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YWQwODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfTm90YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDaG9pY2UuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWJhODI1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTZXF1ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZjNmOTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2F0dHJpYnV0ZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2Y2RlOTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9hdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9hdHRyaWJ1dGVfbGlzdC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2F0dHJpYnV0ZV9saXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmMDI5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2F0dHJpYnV0ZV9saXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbkRUREZpbGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uRFRERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OTkxNDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uRFRERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hbnkuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uYW55LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxN2Q5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uZW1wdHkuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uZW1wdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTllM2Q0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmVtcHR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvb3JnYW5pemVfZHRkX2xvZ2ljYWxseS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL29yZ2FuaXplX2R0ZF9sb2dpY2FsbHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTNjNmJhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvb3JnYW5pemVfZHRkX2xvZ2ljYWxseS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3NvcnQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9zb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNjNWQwYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3NvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L185LmNmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9fOS5jZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MTA1NjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L185LmNmcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9kZWxldGFibGUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvZGVsZXRhYmxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTNmNDcwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9kZWxldGFibGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfY29udHJpYnV0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlYTMxZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jV2VkIEFwciAyOSAxODowMzozMCBFRFQgMjAwOQ0KLW9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXI9b3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlclxuMS4wLjQwMC5xdWFsaWZpZXINCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNzA3YmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZGVwZW5kZW5jaWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jV2VkIEFwciAyOSAxODowMzozMCBFRFQgMjAwOQ0KLWx1Y2VuZT0xLjkuMS52MjAwODA1MzAtMTYwMA0KLWFuYWx5emVyPW9yZy5lY2xpcHNlLmhlbHAuYmFzZVwjMy4zLjEwMS5NMjAwODA3MjhfMzR4P2xvY2FsZVw9ZW4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4NzZiNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1dlZCBBcHIgMjkgMTg6MDM6MzAgRURUIDIwMDkNCi0vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGtleS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtkdGRzLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wdGR0ZC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY2R0ZG92ZXIuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRpY29ucy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZhbGR0ZC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGR0ZW1wbHQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0ZHRkLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c3Jjc3QuaHRtbD0wDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODRmMWIyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9zZWdtZW50cworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjc1ODUzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuNiI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4gCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgIDx0b2MgZmlsZT0iRFRERWRpdG9ybWFwX3RvYy54bWwiLz4KLSAgICAgICA8aW5kZXggcGF0aD0iaW5kZXgvIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotCQk8aW5kZXggZmlsZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCIvPiAgICAgCi0JPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIubWFwbGlzdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLm1hcGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzY2JkNzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIubWFwbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPG1hcGxpc3QgdmVyc2lvbj0iMy42LjIiPg0KLSAgPG5hdj4NCi0gICAgPG1hcCBmaWxlPSJEVERFZGl0b3JtYXBfdG9jLmRpdGFtYXAiLz4NCi0gIDwvbmF2Pg0KLSAgPGxpbms+DQotICAgIDxtYXAgZmlsZT0iRFRERWRpdG9ybWFwX3RvYy5kaXRhbWFwIi8+DQotICAgIDxtYXAgZmlsZT0iRFREcmVmdGFibGUuZGl0YW1hcCIvPg0KLSAgPC9saW5rPg0KLTwvbWFwbGlzdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRhYjJlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxpbmRleD4KLSAgPGVudHJ5IGtleXdvcmQ9IkRURHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV0ZHRkLmh0bWwjdGNyZXRkdGQiIHRpdGxlPSJDcmVhdGluZyBEVERzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jZHRkb3Zlci5odG1sI2NkdGRvdmVyIiB0aXRsZT0iRG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyAoRFREcykgLSBvdmVydmlldyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImhpZ2hsaWdodGluZyBzdHlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0c3Jjc3QuaHRtbCN0dGFnaGlsdCIgdGl0bGU9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyB0ZW1wbGF0ZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZHRlbXBsdC5odG1sI3R3bWFjcm8iIHRpdGxlPSJXb3JraW5nIHdpdGggRFREIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImltcG9ydGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RpbXB0ZHRkLmh0bWwjdGltcHRkdGQiIHRpdGxlPSJJbXBvcnRpbmcgRFREcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRvciBpY29ucyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3JkdGRpY29ucy5odG1sI3JpY29ucyIgdGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIERURCBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIGVkaXRvciI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRURCBoaWdobGlnaHRpbmcgc3R5bGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHNyY3N0Lmh0bWwjdHRhZ2hpbHQiIHRpdGxlPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRlbXBsYXRlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRURCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RkdGVtcGx0Lmh0bWwjdHdtYWNybyIgdGl0bGU9Ildvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkRURCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InZhbGlkYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90dmFsZHRkLmh0bWwjdHZhbGR0ZCIgdGl0bGU9IlZhbGlkYXRpbmcgRFREcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJEVEQgZWRpdG9yIj4KLSAgICA8ZW50cnkga2V5d29yZD0ia2V5Ym9hcmQgc2hvcnRjdXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcmR0ZGtleS5odG1sI2tleWJvYXJkc2hvcnRjdXRzaW50aGVkdGRlZGl0b3IiIHRpdGxlPSJEVEQgZWRpdG9yIGtleWJvYXJkIHNob3J0Y3V0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJrZXlib2FyZCBzaG9ydGN1dHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJEVEQgZWRpdG9yIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcmR0ZGtleS5odG1sI2tleWJvYXJkc2hvcnRjdXRzaW50aGVkdGRlZGl0b3IiIHRpdGxlPSJEVEQgZWRpdG9yIGtleWJvYXJkIHNob3J0Y3V0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRjMjA1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLXBsdWdpbk5hbWUgICAgID0gRFREIEVkaXRvciBkb2N1bWVudGF0aW9uCi1wbHVnaW5Qcm92aWRlciA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjc1ODUzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjYiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+IAotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPHBsdWdpbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICA8dG9jIGZpbGU9IkRUREVkaXRvcm1hcF90b2MueG1sIi8+Ci0gICAgICAgPGluZGV4IHBhdGg9ImluZGV4LyIvPgotICA8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLQkJPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwiLz4gICAgIAotCTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY2R0ZG92ZXIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY2R0ZG92ZXIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwYTk5OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NkdGRvdmVyLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNkdGRvdmVyIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Eb2N1bWVudCB0eXBlIGRlZmluaXRpb25zIChEVERzKSAtIG92ZXJ2aWV3PC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5Eb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgLSBvdmVydmlldzwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBwcm92aWRlcyB5b3Ugd2l0aCB0aGUgbWVhbnMgdG8NCi12YWxpZGF0ZSBYTUwgZmlsZXMgYWdhaW5zdCBhIHNldCBvZiBydWxlcy4gV2hlbiB5b3UgY3JlYXRlIGEgRFREIGZpbGUsIHlvdQ0KLWNhbiBzcGVjaWZ5IHJ1bGVzIHRoYXQgY29udHJvbCB0aGUgc3RydWN0dXJlIG9mIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UNCi10aGUgRFREIGZpbGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RFREczxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+QSBEVEQgY2FuIGNvbnRhaW4gZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBub3RhdGlvbnMsDQotYW5kIGVudGl0aWVzIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS4gSXQgYWxzbyBlc3RhYmxpc2hlcw0KLWNvbnN0cmFpbnRzIGZvciBob3cgZWFjaCBlbGVtZW50LCBhdHRyaWJ1dGUsIG5vdGF0aW9uLCBhbmQgZW50aXR5IGNhbiBiZSB1c2VkDQotd2l0aGluIGFueSBvZiB0aGUgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS48L3A+DQotPHA+VG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCB0aGUgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieQ0KLWEgRFREIChvciBhbiBYTUwgc2NoZW1hKSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURA0KLShvciBYTUwgc2NoZW1hKS48L3A+DQotPHA+Q2VydGFpbiBYTUwgcGFyc2VycyBoYXZlIHRoZSBhYmlsaXR5IHRvIHJlYWQgRFREcyBhbmQgY2hlY2sgdG8gc2VlIGlmIHRoZQ0KLVhNTCBmaWxlIGl0IGlzIHJlYWRpbmcgZm9sbG93cyBhbGwgb2YgdGhvc2UgcnVsZXMuIFdoaWxlIHRoZSBwYXJzZXIgaXMgcmVhZGluZw0KLXRoZSBYTUwgZmlsZSwgaXQgd2lsbCBjaGVjayBlYWNoIGxpbmUgdG8gYmUgc3VyZSB0aGF0IGl0IGNvbmZvcm1zIHRvIHRoZSBydWxlcw0KLXRoYXQgYXJlIGxhaWQgb3V0IGluIHRoZSBEVEQgZmlsZS4gSWYgdGhlcmUgaXMgYSBwcm9ibGVtLCB0aGUgcGFyc2VyIGdlbmVyYXRlcw0KLWFuIGVycm9yIGFuZCBwb2ludHMgdG8gd2hlcmUgdGhlIGVycm9yIG9jY3VycyBpbiB0aGUgWE1MIGZpbGUuIFRoaXMga2luZCBvZg0KLXBhcnNlciBpcyBjYWxsZWQgYSB2YWxpZGF0aW5nIHBhcnNlciBiZWNhdXNlIGl0IHZhbGlkYXRlcyB0aGUgY29udGVudCBvZiB0aGUNCi1YTUwgZmlsZSBhZ2FpbnN0IHRoZSBEVEQuPC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jZHRkb3Zlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jZHRkb3Zlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODk0NjZlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY2R0ZG92ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMgKERURHMpIC0gb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgcHJvdmlkZXMgeW91IHdpdGggdGhlIG1lYW5zIHRvIHZhbGlkYXRlIFhNTCBmaWxlcyBhZ2FpbnN0IGEgc2V0IG9mIHJ1bGVzLiBXaGVuIHlvdSBjcmVhdGUgYSBEVEQgZmlsZSwgeW91IGNhbiBzcGVjaWZ5IHJ1bGVzIHRoYXQgY29udHJvbCB0aGUgc3RydWN0dXJlIG9mIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBwcm92aWRlcyB5b3Ugd2l0aCB0aGUgbWVhbnMgdG8gdmFsaWRhdGUgWE1MIGZpbGVzIGFnYWluc3QgYSBzZXQgb2YgcnVsZXMuIFdoZW4geW91IGNyZWF0ZSBhIERURCBmaWxlLCB5b3UgY2FuIHNwZWNpZnkgcnVsZXMgdGhhdCBjb250cm9sIHRoZSBzdHJ1Y3R1cmUgb2YgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuIiAvPgotPG1ldGEgY29udGVudD0iRFREcywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJEVERzLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90dmFsZHRkLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY2R0ZG92ZXIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Eb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgLSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2R0ZG92ZXIiPjxhIG5hbWU9ImNkdGRvdmVyIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Eb2N1bWVudCB0eXBlIGRlZmluaXRpb25zIChEVERzKSAtIG92ZXJ2aWV3PC9oMT4KLQotCi0KLQotPGRpdj48cD5BIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBwcm92aWRlcyB5b3Ugd2l0aCB0aGUgbWVhbnMgdG8KLXZhbGlkYXRlIFhNTCBmaWxlcyBhZ2FpbnN0IGEgc2V0IG9mIHJ1bGVzLiBXaGVuIHlvdSBjcmVhdGUgYSBEVEQgZmlsZSwgeW91Ci1jYW4gc3BlY2lmeSBydWxlcyB0aGF0IGNvbnRyb2wgdGhlIHN0cnVjdHVyZSBvZiBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlCi10aGUgRFREIGZpbGUuPC9wPgotCi08cD5BIERURCBjYW4gY29udGFpbiBkZWNsYXJhdGlvbnMgdGhhdCBkZWZpbmUgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIG5vdGF0aW9ucywKLWFuZCBlbnRpdGllcyBmb3IgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuIEl0IGFsc28gZXN0YWJsaXNoZXMKLWNvbnN0cmFpbnRzIGZvciBob3cgZWFjaCBlbGVtZW50LCBhdHRyaWJ1dGUsIG5vdGF0aW9uLCBhbmQgZW50aXR5IGNhbiBiZSB1c2VkCi13aXRoaW4gYW55IG9mIHRoZSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLjwvcD4KLQotPHA+VG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCB0aGUgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieQotYSBEVEQgKG9yIGFuIFhNTCBzY2hlbWEpLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFRECi0ob3IgWE1MIHNjaGVtYSkuPC9wPgotCi08cD5DZXJ0YWluIFhNTCBwYXJzZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gcmVhZCBEVERzIGFuZCBjaGVjayB0byBzZWUgaWYgdGhlCi1YTUwgZmlsZSBpdCBpcyByZWFkaW5nIGZvbGxvd3MgYWxsIG9mIHRob3NlIHJ1bGVzLiBXaGlsZSB0aGUgcGFyc2VyIGlzIHJlYWRpbmcKLXRoZSBYTUwgZmlsZSwgaXQgd2lsbCBjaGVjayBlYWNoIGxpbmUgdG8gYmUgc3VyZSB0aGF0IGl0IGNvbmZvcm1zIHRvIHRoZSBydWxlcwotdGhhdCBhcmUgbGFpZCBvdXQgaW4gdGhlIERURCBmaWxlLiBJZiB0aGVyZSBpcyBhIHByb2JsZW0sIHRoZSBwYXJzZXIgZ2VuZXJhdGVzCi1hbiBlcnJvciBhbmQgcG9pbnRzIHRvIHdoZXJlIHRoZSBlcnJvciBvY2N1cnMgaW4gdGhlIFhNTCBmaWxlLiBUaGlzIGtpbmQgb2YKLXBhcnNlciBpcyBjYWxsZWQgYSB2YWxpZGF0aW5nIHBhcnNlciBiZWNhdXNlIGl0IHZhbGlkYXRlcyB0aGUgY29udGVudCBvZiB0aGUKLVhNTCBmaWxlIGFnYWluc3QgdGhlIERURC48L3A+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R2YWxkdGQuaHRtbCIgdGl0bGU9IlZhbGlkYXRpbmcgYSBEVEQgZmlsZSBsZXRzIHlvdSB2ZXJpZnkgdGhhdCBpdCBpcyB3ZWxsIGZvcm1lZCBhbmQgZG9lcyBub3QgY29udGFpbiBhbnkgZXJyb3JzLiI+VmFsaWRhdGluZyBEVERzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtkdGRzLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrZHRkcy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjg1MGQ0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtkdGRzLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iICAiY29uY2VwdC5kdGQiPg0KLTw/UHViIEluYz8+DQotPGNvbmNlcHQgaWQ9Indvcmtpbmd3aXRoZHRkcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V29ya2luZyB3aXRoIERURHM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+VGhpcyBzZWN0aW9ucyBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOjwvc2hvcnRkZXNjPg0KLTxjb25ib2R5PjwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDAzOTU/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtkdGRzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrZHRkcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjQ3OGI0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtkdGRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JraW5nIHdpdGggRFREcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6IiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgc2VjdGlvbnMgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzoiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JldGR0ZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGltcHRkdGQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R2YWxkdGQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3JkdGRpY29ucy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcmR0ZGtleS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9Indvcmtpbmd3aXRoZHRkcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldvcmtpbmcgd2l0aCBEVERzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ3b3JraW5nd2l0aGR0ZHMiPjxhIG5hbWU9Indvcmtpbmd3aXRoZHRkcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29ya2luZyB3aXRoIERURHM8L2gxPgotCi0KLTxkaXY+PHA+VGhpcyBzZWN0aW9ucyBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOjwvcD4KLTwvZGl2PgotCi08ZGl2PgotPHVsIGNsYXNzPSJ1bGxpbmtzIj4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV0ZHRkLmh0bWwiPkNyZWF0aW5nIERURHM8L2E+PC9zdHJvbmc+PGJyIC8+Ci1BIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBjb250YWlucyBhIHNldCBvZiBydWxlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIGFuIFhNTCBmaWxlLiBBZnRlciB5b3UgaGF2ZSBjcmVhdGVkIGEgRFRELCB5b3UgY2FuIGVkaXQgaXQgbWFudWFsbHksIGFkZGluZyBkZWNsYXJhdGlvbnMgdGhhdCBkZWZpbmUgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGVudGl0aWVzLCBhbmQgbm90YXRpb25zLCBhbmQgaG93IHRoZXkgY2FuIGJlIHVzZWQgZm9yIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90aW1wdGR0ZC5odG1sIj5JbXBvcnRpbmcgRFREczwvYT48L3N0cm9uZz48YnIgLz4KLUlmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBEVEQgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZSBEVEQgZWRpdG9yLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90dmFsZHRkLmh0bWwiPlZhbGlkYXRpbmcgRFREczwvYT48L3N0cm9uZz48YnIgLz4KLVZhbGlkYXRpbmcgYSBEVEQgZmlsZSBsZXRzIHlvdSB2ZXJpZnkgdGhhdCBpdCBpcyB3ZWxsIGZvcm1lZCBhbmQgZG9lcyBub3QgY29udGFpbiBhbnkgZXJyb3JzLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy9yZHRkaWNvbnMuaHRtbCI+SWNvbnMgdXNlZCBpbiB0aGUgRFREIGVkaXRvcjwvYT48L3N0cm9uZz48YnIgLz4KLVRoZXNlIERURCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIHZpZXcuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3JkdGRrZXkuaHRtbCI+RFREIGVkaXRvciBrZXlib2FyZCBzaG9ydGN1dHM8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRkaWNvbnMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGljb25zLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTNlMTkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRkaWNvbnMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iDQotICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJyaWNvbnMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIERURCBlZGl0b3I8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIERURCBlZGl0b3I8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhlc2UgRFREIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUgdmlldy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5EVERzPGluZGV4dGVybT5lZGl0b3IgaWNvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHJlZmJvZHk+DQotPHRhYmxlPg0KLTx0Z3JvdXAgY29scz0iMiI+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzAiLz48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMSIvPg0KLTx0aGVhZD4NCi08cm93Pg0KLTxlbnRyeT5JY29uJm5ic3A7PC9lbnRyeT4NCi08ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGhlYWQ+DQotPHRib2R5Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj48L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSI+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9uYW55LmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIEFOWSBjb250ZW50DQotaWNvbjwvYWx0PjwvaW1hZ2U+IDwvZW50cnk+DQotPGVudHJ5PkFOWSBjb250ZW50IChjb250ZW50IG1vZGVsKTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9hdHRyaWJ1dGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgYXR0cmlidXRlDQotaWNvbjwvYWx0PjwvaW1hZ2U+IDwvZW50cnk+DQotPGVudHJ5PmF0dHJpYnV0ZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9hdHRyaWJ1dGVfbGlzdC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLWF0dHJpYnV0ZSBsaXN0IGljb248L2FsdD48L2ltYWdlPiA8L2VudHJ5Pg0KLTxlbnRyeT5hdHRyaWJ1dGUgbGlzdDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvQUREX0NvbW1lbnQuZ2lmIj48YWx0PlRoaXMNCi1ncmFwaGljIGlzIHRoZSBjb21tZW50IGljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMxIj5jb21tZW50PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RDaG9pY2UuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29udGVudA0KLW1vZGVsIC0gY2hvaWNlIGljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNvbnRlbnQgbW9kZWwgLSBjaG9pY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGNvbnRlbnQNCi1tb2RlbCAtIHNlcXVlbmNlIGljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNvbnRlbnQgbW9kZWwgLSBzZXF1ZW5jZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9BRERfRWxlbWVudC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBlbGVtZW50DQotaWNvbjwvYWx0PjwvaW1hZ2U+IDwvZW50cnk+DQotPGVudHJ5PmVsZW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL25lbXB0eS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBFTVBUWQ0KLWNvbnRlbnQgKGNvbnRlbnQgbW9kZWwpIGljb248L2FsdD48L2ltYWdlPiA8L2VudHJ5Pg0KLTxlbnRyeT5FTVBUWSBjb250ZW50IChjb250ZW50IG1vZGVsKTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9BRERfRW50aXR5LmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGVudGl0eQ0KLWljb248L2FsdD48L2ltYWdlPiA8L2VudHJ5Pg0KLTxlbnRyeT5lbnRpdHk8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvQUREX05vdGF0aW9uLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIG5vdGF0aW9uDQotaWNvbjwvYWx0PjwvaW1hZ2U+IDwvZW50cnk+DQotPGVudHJ5Pm5vdGF0aW9uPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljDQotaXMgdGhlIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlIGljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PnBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlPC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+DQotPHNlY3Rpb24+PC9zZWN0aW9uPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRpY29ucy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRkaWNvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwYjM5NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRpY29ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSWNvbnMgdXNlZCBpbiB0aGUgRFREIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGVzZSBEVEQgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSB2aWV3LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGVzZSBEVEQgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSB2aWV3LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURHMsIGVkaXRvciBpY29ucyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURHMsIGVkaXRvciBpY29ucyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd29ya2R0ZHMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJyaWNvbnMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5JY29ucyB1c2VkIGluIHRoZSBEVEQgZWRpdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyaWNvbnMiPjxhIG5hbWU9InJpY29ucyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SWNvbnMgdXNlZCBpbiB0aGUgRFREIGVkaXRvcjwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlc2UgRFREIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUgdmlldy48L3A+Ci0KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPgotPHRoZWFkIGFsaWduPSJsZWZ0Ij4KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgaWQ9Ik4xMDA2MyI+SWNvbsKgPC90aD4KLQotPHRoIHZhbGlnbj0idG9wIiBpZD0iTjEwMDZBIj5EZXNjcmlwdGlvbjwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDYzICI+Jm5ic3A7PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkEgIj4mbmJzcDs8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2MyAiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL25hbnkuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgQU5ZIGNvbnRlbnQmIzEwO2ljb24iIC8+IDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZBICI+QU5ZIGNvbnRlbnQgKGNvbnRlbnQgbW9kZWwpPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNjMgIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2F0dHJpYnV0ZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBhdHRyaWJ1dGUmIzEwO2ljb24iIC8+IDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZBICI+YXR0cmlidXRlPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNjMgIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2F0dHJpYnV0ZV9saXN0LmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlJiMxMDthdHRyaWJ1dGUgbGlzdCBpY29uIiAvPiA8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2QSAiPmF0dHJpYnV0ZSBsaXN0PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNjMgIj48aW1nIHNyYz0iLi4vaW1hZ2VzL0FERF9Db21tZW50LmdpZiIgYWx0PSJUaGlzJiMxMDtncmFwaGljIGlzIHRoZSBjb21tZW50IGljb24iIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkEgIj5jb21tZW50PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNjMgIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RDaG9pY2UuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29udGVudCYjMTA7bW9kZWwgLSBjaG9pY2UgaWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2QSAiPmNvbnRlbnQgbW9kZWwgLSBjaG9pY2U8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2MyAiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGNvbnRlbnQmIzEwO21vZGVsIC0gc2VxdWVuY2UgaWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2QSAiPmNvbnRlbnQgbW9kZWwgLSBzZXF1ZW5jZTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDYzICI+PGltZyBzcmM9Ii4uL2ltYWdlcy9BRERfRWxlbWVudC5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBlbGVtZW50JiMxMDtpY29uIiAvPiA8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2QSAiPmVsZW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2MyAiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL25lbXB0eS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBFTVBUWSYjMTA7Y29udGVudCAoY29udGVudCBtb2RlbCkgaWNvbiIgLz4gPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkEgIj5FTVBUWSBjb250ZW50IChjb250ZW50IG1vZGVsKTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDYzICI+PGltZyBzcmM9Ii4uL2ltYWdlcy9BRERfRW50aXR5LmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGVudGl0eSYjMTA7aWNvbiIgLz4gPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkEgIj5lbnRpdHk8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2MyAiPjxpbWcgc3JjPSIuLi9pbWFnZXMvQUREX05vdGF0aW9uLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIG5vdGF0aW9uJiMxMDtpY29uIiAvPiA8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2QSAiPm5vdGF0aW9uPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNjMgIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYiIGFsdD0iVGhpcyBncmFwaGljJiMxMDtpcyB0aGUgcGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2UgaWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2QSAiPnBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlPC90ZD4KLQotPC90cj4KLQotPC90Ym9keT4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiAvPgotCi08L2Rpdj4KLQotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvY3dvcmtkdGRzLmh0bWwiIHRpdGxlPSJUaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6Ij5Xb3JraW5nIHdpdGggRFREczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRrZXkuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGtleS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU3ZmE0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGtleS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiINCi0gInJlZmVyZW5jZS5kdGQiPg0KLTxyZWZlcmVuY2UgaWQ9ImtleWJvYXJkc2hvcnRjdXRzaW50aGVkdGRlZGl0b3IiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+RFREIGVkaXRvciBrZXlib2FyZCBzaG9ydGN1dHM8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+PC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RFREIGVkaXRvcjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5rZXlib2FyZCBzaG9ydGN1dHM8aW5kZXh0ZXJtPkRURCBlZGl0b3I8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHJlZmJvZHk+DQotPHRhYmxlIGZyYW1lPSJhbGwiPg0KLTx0Z3JvdXAgY29scz0iMiI+PGNvbHNwZWMgY29sbmFtZT0iY29sMSIgY29sd2lkdGg9Ijg0KiIvPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDMiDQotY29sd2lkdGg9IjkzKiIvPg0KLTx0aGVhZD4NCi08cm93IHZhbGlnbj0iYm90dG9tIj4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+S2V5IENvbWJpbmF0aW9uPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+RnVuY3Rpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGhlYWQ+DQotPHRib2R5Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPlNoaWZ0K0FsdCtVcCBBcnJvdzwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDMiPkV4cGFuZCBzZWxlY3Rpb24gdG8gZW5jbG9zaW5nIGVsZW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPlNoaWZ0K0FsdCtSaWdodCBBcnJvdzwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDMiPkV4cGFuZCBzZWxlY3Rpb24gdG8gbmV4dCBlbGVtZW50PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5TaGlmdCtBbHQrTGVmdCBBcnJvdzwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDMiPkV4cGFuZCBzZWxlY3Rpb24gdG8gcHJldmlvdXMgZWxlbWVudDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+U2hpZnQrQWx0K0Rvd24gQXJyb3c8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wzIj5SZXN0b3JlIGxhc3Qgc2VsZWN0aW9uPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5DdHJsK1NoaWZ0K1A8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wzIj5HbyB0byBtYXRjaGluZyBicmFja2V0PC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGtleS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRka2V5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMGE2NTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRka2V5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRURCBlZGl0b3Iga2V5Ym9hcmQgc2hvcnRjdXRzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSIiIC8+Ci08bWV0YSBjb250ZW50PSJEVEQgZWRpdG9yLCBrZXlib2FyZCBzaG9ydGN1dHMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJEVEQgZWRpdG9yLCBrZXlib2FyZCBzaG9ydGN1dHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dvcmtkdGRzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0ia2V5Ym9hcmRzaG9ydGN1dHNpbnRoZWR0ZGVkaXRvciIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkRURCBlZGl0b3Iga2V5Ym9hcmQgc2hvcnRjdXRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJrZXlib2FyZHNob3J0Y3V0c2ludGhlZHRkZWRpdG9yIj48YSBuYW1lPSJrZXlib2FyZHNob3J0Y3V0c2ludGhlZHRkZWRpdG9yIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9ImlkX3RpdGxlIj5EVEQgZWRpdG9yIGtleWJvYXJkIHNob3J0Y3V0czwvaDE+Ci0KLQotCi08ZGl2PjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiIC8+Ci0KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPgotPHRoZWFkIGFsaWduPSJsZWZ0Ij4KLTx0ciB2YWxpZ249ImJvdHRvbSI+Ci08dGggdmFsaWduPSJib3R0b20iIHdpZHRoPSI0Ny40NTc2MjcxMTg2NDQwNyUiIGlkPSJOMTAwNjgiPktleSBDb21iaW5hdGlvbjwvdGg+Ci0KLTx0aCB2YWxpZ249ImJvdHRvbSIgd2lkdGg9IjUyLjU0MjM3Mjg4MTM1NTk0JSIgaWQ9Ik4xMDA2RiI+RnVuY3Rpb248L3RoPgotCi08L3RyPgotCi08L3RoZWFkPgotCi08dGJvZHk+Ci08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0Ny40NTc2MjcxMTg2NDQwNyUiIGhlYWRlcnM9Ik4xMDA2OCAiPlNoaWZ0K0FsdCtVcCBBcnJvdzwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUyLjU0MjM3Mjg4MTM1NTk0JSIgaGVhZGVycz0iTjEwMDZGICI+RXhwYW5kIHNlbGVjdGlvbiB0byBlbmNsb3NpbmcgZWxlbWVudDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ3LjQ1NzYyNzExODY0NDA3JSIgaGVhZGVycz0iTjEwMDY4ICI+U2hpZnQrQWx0K1JpZ2h0IEFycm93PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTIuNTQyMzcyODgxMzU1OTQlIiBoZWFkZXJzPSJOMTAwNkYgIj5FeHBhbmQgc2VsZWN0aW9uIHRvIG5leHQgZWxlbWVudDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ3LjQ1NzYyNzExODY0NDA3JSIgaGVhZGVycz0iTjEwMDY4ICI+U2hpZnQrQWx0K0xlZnQgQXJyb3c8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Mi41NDIzNzI4ODEzNTU5NCUiIGhlYWRlcnM9Ik4xMDA2RiAiPkV4cGFuZCBzZWxlY3Rpb24gdG8gcHJldmlvdXMgZWxlbWVudDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ3LjQ1NzYyNzExODY0NDA3JSIgaGVhZGVycz0iTjEwMDY4ICI+U2hpZnQrQWx0K0Rvd24gQXJyb3c8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Mi41NDIzNzI4ODEzNTU5NCUiIGhlYWRlcnM9Ik4xMDA2RiAiPlJlc3RvcmUgbGFzdCBzZWxlY3Rpb248L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0Ny40NTc2MjcxMTg2NDQwNyUiIGhlYWRlcnM9Ik4xMDA2OCAiPkN0cmwrU2hpZnQrUDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUyLjU0MjM3Mjg4MTM1NTk0JSIgaGVhZGVycz0iTjEwMDZGICI+R28gdG8gbWF0Y2hpbmcgYnJhY2tldDwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL2N3b3JrZHRkcy5odG1sIiB0aXRsZT0iVGhpcyBzZWN0aW9ucyBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOiI+V29ya2luZyB3aXRoIERURHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWY4Y2UzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXRkdGQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGNyZXRkdGQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIERURHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkNyZWF0aW5nIGEgbmV3IGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKTwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBjb250YWlucyBhIHNldCBvZiBydWxlcyB0aGF0IGNhbg0KLWJlIHVzZWQgdG8gdmFsaWRhdGUgYW4gWE1MIGZpbGUuIEFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgYSBEVEQsIHlvdSBjYW4gZWRpdA0KLWl0IG1hbnVhbGx5LCBhZGRpbmcgZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBlbnRpdGllcywNCi1hbmQgbm90YXRpb25zLCBhbmQgaG93IHRoZXkgY2FuIGJlIHVzZWQgZm9yIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlDQotRFREIGZpbGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RFREczxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBjcmVhdGUgYSBuZXcNCi1EVEQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBwcm9qZWN0IHRvIGNvbnRhaW4gdGhlIERURCBpZiBuZWVkZWQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIHdvcmtiZW5jaCwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RmlsZTwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+PHVpY29udHJvbD5PdGhlcjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD4gRFREPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uIENsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi4gPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgRFRELjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPkZpbGUgbmFtZTwvdWljb250cm9sPiBmaWVsZCwgdHlwZSB0aGUgbmFtZSBvZg0KLXRoZSBEVEQsIGZvciBleGFtcGxlIDx1c2VyaW5wdXQ+TXlEVEQuZHRkPC91c2VyaW5wdXQ+LjwvY21kPjxpbmZvPlRoZSBuYW1lDQotb2YgeW91ciBEVEQgZmlsZSBtdXN0IGVuZCB3aXRoIHRoZSBleHRlbnNpb24gPHVzZXJpbnB1dD4uZHRkPC91c2VyaW5wdXQ+PC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+WW91IGNhbiB1c2UgYSBEVEQgdGVtcGxhdGUgYXMgdGhlIGJhc2lzIGZvcg0KLXlvdXIgbmV3IERURCBmaWxlLiBUbyBkbyBzbywgY2xpY2sgdGhlIDx1aWNvbnRyb2w+VXNlIERURCBUZW1wbGF0ZTwvdWljb250cm9sPiBjaGVjaw0KLWJveCwgYW5kIHNlbGVjdCB0aGUgdGVtcGxhdGUgeW91IHdhbnQgdG8gdXNlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+VGhlIERURCBhcHBlYXJzIGluIHRoZSBOYXZpZ2F0b3IgdmlldyBhbmQgYXV0b21hdGljYWxseSwgYnkgZGVmYXVsdCwNCi1vcGVucyBpbiB0aGUgRFREIGVkaXRvci4gSW4gdGhlIERURCBlZGl0b3IsIHlvdSBjYW4gbWFudWFsbHkgYWRkIGVsZW1lbnRzLA0KLWF0dHJpYnV0ZXMsIG5vdGF0aW9ucywgZW50aXRpZXMsIGFuZCBjb21tZW50cyB0byB0aGUgRFRELiBJZiB5b3UgY2xvc2UgdGhlDQotZmlsZSwgYW5kIHdhbnQgdG8gbGF0ZXIgcmUtb3BlbiBpdCBpbiB0aGUgRFREIGVkaXRvciwgZG91YmxlLWNsaWNrIGl0IGluIHRoZQ0KLU5hdmlnYXRvciB2aWV3LjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0ZHRkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0ZHRkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzI1ZjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgRFREcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBjb250YWlucyBhIHNldCBvZiBydWxlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIGFuIFhNTCBmaWxlLiBBZnRlciB5b3UgaGF2ZSBjcmVhdGVkIGEgRFRELCB5b3UgY2FuIGVkaXQgaXQgbWFudWFsbHksIGFkZGluZyBkZWNsYXJhdGlvbnMgdGhhdCBkZWZpbmUgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGVudGl0aWVzLCBhbmQgbm90YXRpb25zLCBhbmQgaG93IHRoZXkgY2FuIGJlIHVzZWQgZm9yIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBjb250YWlucyBhIHNldCBvZiBydWxlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIGFuIFhNTCBmaWxlLiBBZnRlciB5b3UgaGF2ZSBjcmVhdGVkIGEgRFRELCB5b3UgY2FuIGVkaXQgaXQgbWFudWFsbHksIGFkZGluZyBkZWNsYXJhdGlvbnMgdGhhdCBkZWZpbmUgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGVudGl0aWVzLCBhbmQgbm90YXRpb25zLCBhbmQgaG93IHRoZXkgY2FuIGJlIHVzZWQgZm9yIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURHMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iRFREcywgY3JlYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2R0ZG92ZXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RkdGVtcGx0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGNyZXRkdGQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIG5ldyBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCk8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjcmV0ZHRkIj48YSBuYW1lPSJ0Y3JldGR0ZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgRFREczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgY29udGFpbnMgYSBzZXQgb2YgcnVsZXMgdGhhdCBjYW4KLWJlIHVzZWQgdG8gdmFsaWRhdGUgYW4gWE1MIGZpbGUuIEFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgYSBEVEQsIHlvdSBjYW4gZWRpdAotaXQgbWFudWFsbHksIGFkZGluZyBkZWNsYXJhdGlvbnMgdGhhdCBkZWZpbmUgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGVudGl0aWVzLAotYW5kIG5vdGF0aW9ucywgYW5kIGhvdyB0aGV5IGNhbiBiZSB1c2VkIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZQotRFREIGZpbGUuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGNyZWF0ZSBhIG5ldwotRFRELCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSBhIHByb2plY3QgdG8gY29udGFpbiB0aGUgRFREIGlmIG5lZWRlZC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgd29ya2JlbmNoLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGU8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3RoZXI8L3NwYW4+PC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+Ci08c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+IERURDwvc3Bhbj48L3NwYW4+LiBDbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi4gPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIHByb2plY3Qgb3IgZm9sZGVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBEVEQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgbmFtZTwvc3Bhbj4gZmllbGQsIHR5cGUgdGhlIG5hbWUgb2YKLXRoZSBEVEQsIGZvciBleGFtcGxlIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+TXlEVEQuZHRkPC9rYmQ+Ljwvc3Bhbj4gVGhlIG5hbWUKLW9mIHlvdXIgRFREIGZpbGUgbXVzdCBlbmQgd2l0aCB0aGUgZXh0ZW5zaW9uIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+LmR0ZDwva2JkPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5Zb3UgY2FuIHVzZSBhIERURCB0ZW1wbGF0ZSBhcyB0aGUgYmFzaXMgZm9yCi15b3VyIG5ldyBEVEQgZmlsZS4gVG8gZG8gc28sIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2UgRFREIFRlbXBsYXRlPC9zcGFuPiBjaGVjawotYm94LCBhbmQgc2VsZWN0IHRoZSB0ZW1wbGF0ZSB5b3Ugd2FudCB0byB1c2UuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIERURCBhcHBlYXJzIGluIHRoZSBOYXZpZ2F0b3IgdmlldyBhbmQgYXV0b21hdGljYWxseSwgYnkgZGVmYXVsdCwKLW9wZW5zIGluIHRoZSBEVEQgZWRpdG9yLiBJbiB0aGUgRFREIGVkaXRvciwgeW91IGNhbiBtYW51YWxseSBhZGQgZWxlbWVudHMsCi1hdHRyaWJ1dGVzLCBub3RhdGlvbnMsIGVudGl0aWVzLCBhbmQgY29tbWVudHMgdG8gdGhlIERURC4gSWYgeW91IGNsb3NlIHRoZQotZmlsZSwgYW5kIHdhbnQgdG8gbGF0ZXIgcmUtb3BlbiBpdCBpbiB0aGUgRFREIGVkaXRvciwgZG91YmxlLWNsaWNrIGl0IGluIHRoZQotTmF2aWdhdG9yIHZpZXcuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NkdGRvdmVyLmh0bWwiIHRpdGxlPSJBIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBwcm92aWRlcyB5b3Ugd2l0aCB0aGUgbWVhbnMgdG8gdmFsaWRhdGUgWE1MIGZpbGVzIGFnYWluc3QgYSBzZXQgb2YgcnVsZXMuIFdoZW4geW91IGNyZWF0ZSBhIERURCBmaWxlLCB5b3UgY2FuIHNwZWNpZnkgcnVsZXMgdGhhdCBjb250cm9sIHRoZSBzdHJ1Y3R1cmUgb2YgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuIj5Eb2N1bWVudCB0eXBlIGRlZmluaXRpb25zIChEVERzKSAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZHRlbXBsdC5odG1sIiB0aXRsZT0iVGVtcGxhdGVzIGFyZSBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBEVEQgZmlsZSB3aGVuIGl0IGlzIGNyZWF0ZWQuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIGEgY2VydGFpbiBwaWVjZSBvZiBjb2RlIHlvdSB3YW50IHRvIHJldXNlIHNldmVyYWwgdGltZXMsIGFuZCB5b3UgZG8gbm90IHdhbnQgdG8gd3JpdGUgaXQgb3V0IGV2ZXJ5IHRpbWUuIj5Xb3JraW5nIHdpdGggRFREIHRlbXBsYXRlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YTI2N2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZHRlbXBsdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d21hY3JvIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Xb3JraW5nIHdpdGggRFREIHRlbXBsYXRlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+V29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGVtcGxhdGVzIGFyZSBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8NCi1hIERURCBmaWxlIHdoZW4gaXQgaXMgY3JlYXRlZC4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4geW91IGhhdmUNCi1hIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50DQotdG8gd3JpdGUgaXQgb3V0IGV2ZXJ5IHRpbWUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RFREczxpbmRleHRlcm0+Y3JlYXRpbmcgdGVtcGxhdGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT50ZW1wbGF0ZXM8aW5kZXh0ZXJtPkRURDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VG8gY3JlYXRlIGEgbmV3IERURCB0ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPldlYiBhbmQgWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5EVEQgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPlRlbXBsYXRlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+IGluIHRoZSB0ZW1wbGF0ZXMgcHJlZmVyZWNlcy48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TdXBwbHkgYSBuZXcgdGVtcGxhdGUgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGFuZCA8dWljb250cm9sPkRlc2NyaXB0aW9uPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNwZWNpZnkgdGhlIDx1aWNvbnRyb2w+Q29udGV4dDwvdWljb250cm9sPiBmb3IgdGhlIHRlbXBsYXRlLjwvY21kPg0KLTxpbmZvPlRoaXMgaXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwNCi1saXN0IHdoZW4gY29udGVudCBhc3Npc3QgaXMgcmVxdWVzdGVkLiA8L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3BlY2lmeSB0aGUgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZvciB5b3VyIHRlbXBsYXRlIHVzaW5nDQotdGhlIGFwcHJvcHJpYXRlIHRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQgYnkgY29udGVudA0KLWFzc2lzdC48L2NtZD48L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+VG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8dWljb250cm9sPkluc2VydA0KLVZhcmlhYmxlPC91aWNvbnRyb2w+IGJ1dHRvbiBhbmQgc2VsZWN0IGEgdmFyaWFibGUuIDwvY21kPjxpbmZvPkZvciBleGFtcGxlLA0KLXRoZSA8dWljb250cm9sPmRhdGU8L3VpY29udHJvbD4gdmFyaWFibGUgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGRhdGUgd2lsbCBiZQ0KLWluc2VydGVkLiA8L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5BcHBseTwvdWljb250cm9sPiBhbmQgdGhlbiA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvDQotc2F2ZSB5b3VyIGNoYW5nZXMuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlIHNhbWUNCi1wcmVmZXJlbmNlcyBwYWdlLiA8cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlIHRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSwNCi1idXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXIgaW4gdGhlIERURCB0ZW1wbGF0ZXMgbGlzdCB3aGVuDQoteW91IGNyZWF0ZSBhIGZpbGUsIGNsZWFyIGl0cyBjaGVja2JveCBpbiB0aGUgdGVtcGxhdGVzIHRhYmxlLjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZHRlbXBsdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZHRlbXBsdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGIxYzMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGR0ZW1wbHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ildvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRlbXBsYXRlcyBhcmUgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgRFREIGZpbGUgd2hlbiBpdCBpcyBjcmVhdGVkLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUZW1wbGF0ZXMgYXJlIGEgY2h1bmsgb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIERURCBmaWxlIHdoZW4gaXQgaXMgY3JlYXRlZC4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdSBkbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS4iIC8+Ci08bWV0YSBjb250ZW50PSJEVERzLCBjcmVhdGluZyB0ZW1wbGF0ZXMsIHRlbXBsYXRlcywgRFREIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iRFREcywgY3JlYXRpbmcgdGVtcGxhdGVzLCB0ZW1wbGF0ZXMsIERURCIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JldGR0ZC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3bWFjcm8iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Xb3JraW5nIHdpdGggRFREIHRlbXBsYXRlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdtYWNybyI+PGEgbmFtZT0idHdtYWNybyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRlbXBsYXRlcyBhcmUgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvCi1hIERURCBmaWxlIHdoZW4gaXQgaXMgY3JlYXRlZC4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4geW91IGhhdmUKLWEgY2VydGFpbiBwaWVjZSBvZiBjb2RlIHlvdSB3YW50IHRvIHJldXNlIHNldmVyYWwgdGltZXMsIGFuZCB5b3UgZG8gbm90IHdhbnQKLXRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gY3JlYXRlIGEgbmV3IERURCB0ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQgWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRURCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UZW1wbGF0ZXM8L3NwYW4+Ci08L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gaW4gdGhlIHRlbXBsYXRlcyBwcmVmZXJlY2VzLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3VwcGx5IGEgbmV3IHRlbXBsYXRlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXNjcmlwdGlvbjwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZXh0PC9zcGFuPiBmb3IgdGhlIHRlbXBsYXRlLjwvc3Bhbj4KLSBUaGlzIGlzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsCi1saXN0IHdoZW4gY29udGVudCBhc3Npc3QgaXMgcmVxdWVzdGVkLiA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm48L3NwYW4+IGZvciB5b3VyIHRlbXBsYXRlIHVzaW5nCi10aGUgYXBwcm9wcmlhdGUgdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyB0byBiZSBpbnNlcnRlZCBieSBjb250ZW50Ci1hc3Npc3QuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+VG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnNlcnQKLVZhcmlhYmxlPC9zcGFuPiBidXR0b24gYW5kIHNlbGVjdCBhIHZhcmlhYmxlLiA8L3NwYW4+IEZvciBleGFtcGxlLAotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmRhdGU8L3NwYW4+IHZhcmlhYmxlIGluZGljYXRlcyB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUKLWluc2VydGVkLiA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGx5PC9zcGFuPiBhbmQgdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8KLXNhdmUgeW91ciBjaGFuZ2VzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUgc2FtZQotcHJlZmVyZW5jZXMgcGFnZS4gPHA+SWYgeW91IGhhdmUgYSB0ZW1wbGF0ZSB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUsCi1idXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXIgaW4gdGhlIERURCB0ZW1wbGF0ZXMgbGlzdCB3aGVuCi15b3UgY3JlYXRlIGEgZmlsZSwgY2xlYXIgaXRzIGNoZWNrYm94IGluIHRoZSB0ZW1wbGF0ZXMgdGFibGUuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV0ZHRkLmh0bWwiIHRpdGxlPSJBIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBjb250YWlucyBhIHNldCBvZiBydWxlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIGFuIFhNTCBmaWxlLiBBZnRlciB5b3UgaGF2ZSBjcmVhdGVkIGEgRFRELCB5b3UgY2FuIGVkaXQgaXQgbWFudWFsbHksIGFkZGluZyBkZWNsYXJhdGlvbnMgdGhhdCBkZWZpbmUgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGVudGl0aWVzLCBhbmQgbm90YXRpb25zLCBhbmQgaG93IHRoZXkgY2FuIGJlIHVzZWQgZm9yIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLiI+Q3JlYXRpbmcgRFREczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzcmNzdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c3Jjc3QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0MmY2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzcmNzdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0dGFnaGlsdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+U2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyBmb3IgRFREIGZpbGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIERURCBzb3VyY2UNCi1jb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIERURCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycw0KLXRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkRURHM8aW5kZXh0ZXJtPmhpZ2hsaWdodGluZyBzdHlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPkRURCBoaWdobGlnaHRpbmcgc3R5bGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBzZXQgaGlnaGxpZ2h0aW5nIHN0eWxlcyBmb3IgdGhlIERURCBjb2RlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nDQotc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+RFREIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD4gU3ludGF4DQotQ29sb3Jpbmc8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5TeW50YXggRWxlbWVudDwvdWljb250cm9sPiBsaXN0LCBzZWxlY3QgdGhlIHNvdXJjZQ0KLXRhZyB0eXBlIHRoYXQgeW91IHdpc2ggdG8gc2V0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci4gWW91IGNhbiBhbHNvIGNsaWNrDQotdGV4dCBpbiB0aGUgc2FtcGxlIHRleHQgdG8gc3BlY2lmeSB0aGUgc291cmNlIHRhZyB0eXBlIHRoYXQgeW91IHdpc2ggdG8gc2V0DQotYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkZvcmVncm91bmQ8L3VpY29udHJvbD4gYm94IGFuZCBzZWxlY3QgdGhlDQotY29sb3IgdGhhdCB5b3Ugd2FudCB0aGUgdGV4dCBvZiB0aGUgdGFnIHRvIGFwcGVhciBpbiBhbmQgY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5CYWNrZ3JvdW5kPC91aWNvbnRyb2w+IGJveCBhbmQgc2VsZWN0IHRoZQ0KLWNvbG9yIHRoYXQgeW91IHdhbnQgdG8gYXBwZWFyIGJlaGluZCB0aGUgdGFnIGFuZCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5Cb2xkPC91aWNvbnRyb2w+LCA8dWljb250cm9sPkl0YWxpYzwvdWljb250cm9sPiwgPHVpY29udHJvbD5TdHJpa2V0aHJvdWdoPC91aWNvbnRyb2w+LA0KLWFuZDx1aWNvbnRyb2w+VW5kZXJsaW5lPC91aWNvbnRyb2w+IGNoZWNrIGJveGVzIGZvciBhZGRpdGlvbmFsIGZvcm1hdHRpbmcNCi1vcHRpb25zLiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPlJlc3RvcmUgRGVmYXVsdDwvdWljb250cm9sPiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZw0KLXN0eWxlcyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiBJZiB5b3Ugb25seSB3YW50IHRvIHJlc2V0IHRoZSB2YWx1ZSBmb3INCi1hIHBhcnRpY3VsYXIgY29udGVudCB0eXBlLCBzZWxlY3QgaXQgaW4gdGhlIDx1aWNvbnRyb2w+Q29udGVudCB0eXBlPC91aWNvbnRyb2w+IGZpZWxkLA0KLXRoZSBjbGljayB0aGUgPHVpY29udHJvbD5SZXN0b3JlIERlZmF1bHQ8L3VpY29udHJvbD4gYnV0dG9uIG5leHQgdG8gaXQuIDwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8gc2F2ZSB5b3VyIGNoYW5nZXMuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzcmNzdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c3Jjc3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3NTIxYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzcmNzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBEVEQgc291cmNlIGNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgRFREIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzIHRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBEVEQgc291cmNlIGNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgRFREIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzIHRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURHMsIGhpZ2hsaWdodGluZyBzdHlsZXMsIFhNTCBlZGl0b3IsIERURCBoaWdobGlnaHRpbmcgc3R5bGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iRFREcywgaGlnaGxpZ2h0aW5nIHN0eWxlcywgWE1MIGVkaXRvciwgRFREIGhpZ2hsaWdodGluZyBzdHlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXRkdGQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0dGFnaGlsdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMgZm9yIERURCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHRhZ2hpbHQiPjxhIG5hbWU9InR0YWdoaWx0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5JZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBEVEQgc291cmNlCi1jb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIERURCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycwotdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBzZXQgaGlnaGxpZ2h0aW5nIHN0eWxlcyBmb3IgdGhlIERURCBjb2RlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nCi1zdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RFREIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiBTeW50YXgKLUNvbG9yaW5nPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3ludGF4IEVsZW1lbnQ8L3NwYW4+IGxpc3QsIHNlbGVjdCB0aGUgc291cmNlCi10YWcgdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gYWxzbyBjbGljawotdGV4dCBpbiB0aGUgc2FtcGxlIHRleHQgdG8gc3BlY2lmeSB0aGUgc291cmNlIHRhZyB0eXBlIHRoYXQgeW91IHdpc2ggdG8gc2V0Ci1hIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Rm9yZWdyb3VuZDwvc3Bhbj4gYm94IGFuZCBzZWxlY3QgdGhlCi1jb2xvciB0aGF0IHlvdSB3YW50IHRoZSB0ZXh0IG9mIHRoZSB0YWcgdG8gYXBwZWFyIGluIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5CYWNrZ3JvdW5kPC9zcGFuPiBib3ggYW5kIHNlbGVjdCB0aGUKLWNvbG9yIHRoYXQgeW91IHdhbnQgdG8gYXBwZWFyIGJlaGluZCB0aGUgdGFnIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Qm9sZDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkl0YWxpYzwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cmlrZXRocm91Z2g8L3NwYW4+LAotYW5kPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VW5kZXJsaW5lPC9zcGFuPiBjaGVjayBib3hlcyBmb3IgYWRkaXRpb25hbCBmb3JtYXR0aW5nCi1vcHRpb25zLiA8L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlc3RvcmUgRGVmYXVsdDwvc3Bhbj4gdG8gc2V0IHRoZSBoaWdobGlnaHRpbmcKLXN0eWxlcyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiBJZiB5b3Ugb25seSB3YW50IHRvIHJlc2V0IHRoZSB2YWx1ZSBmb3IKLWEgcGFydGljdWxhciBjb250ZW50IHR5cGUsIHNlbGVjdCBpdCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGVudCB0eXBlPC9zcGFuPiBmaWVsZCwKLXRoZSBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVzdG9yZSBEZWZhdWx0PC9zcGFuPiBidXR0b24gbmV4dCB0byBpdC4gPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHlvdXIgY2hhbmdlcy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3RjcmV0ZHRkLmh0bWwiIHRpdGxlPSJBIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBjb250YWlucyBhIHNldCBvZiBydWxlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIGFuIFhNTCBmaWxlLiBBZnRlciB5b3UgaGF2ZSBjcmVhdGVkIGEgRFRELCB5b3UgY2FuIGVkaXQgaXQgbWFudWFsbHksIGFkZGluZyBkZWNsYXJhdGlvbnMgdGhhdCBkZWZpbmUgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGVudGl0aWVzLCBhbmQgbm90YXRpb25zLCBhbmQgaG93IHRoZXkgY2FuIGJlIHVzZWQgZm9yIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLiI+Q3JlYXRpbmcgRFREczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXB0ZHRkLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXB0ZHRkLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNzU5MGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wdGR0ZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0aW1wdGR0ZCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+SW1wb3J0aW5nIERURHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkltcG9ydGluZyBEVERzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBEVEQgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlIG9mDQotdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlIERURA0KLWVkaXRvci4gPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RFREczxpbmRleHRlcm0+aW1wb3J0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBpbXBvcnQgYSBEVEQgaW50byB0aGUgd29ya2JlbmNoLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RmlsZTwvdWljb250cm9sPjx1aWNvbnRyb2w+SW1wb3J0PC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uIFNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+PHVpY29udHJvbD5GaWxlDQotU3lzdGVtPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5GaWxsIGluIHRoZSBmaWVsZHMgaW4gdGhlIDx1aWNvbnRyb2w+SW1wb3J0PC91aWNvbnRyb2w+IHdpemFyZA0KLWFzIG5lY2Vzc2FyeS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPiB0byBleGl0IHRoZSB3aXphcmQgYW5kIGltcG9ydA0KLXRoZSBmaWxlcy48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIERURCBmaWxlIGluIHRoZSBOYXZpZ2F0b3IgdmlldyBhbmQgZG91YmxlLWNsaWNrIGl0IHRvDQotb3BlbiBpdCBpbiB0aGUgRFREIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPkFmdGVyIHlvdSBoYXZlIGltcG9ydGVkIGEgRFREIGZpbGUgaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuZWQNCi1pdCBpbiB0aGUgRFREIGVkaXRvciwgeW91IGNhbiBlZGl0IGl0IG1hbnVhbGx5LjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXB0ZHRkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXB0ZHRkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MTNlYjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wdGR0ZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSW1wb3J0aW5nIERURHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgeW91IHdhbnQgdG8gd29yayB3aXRoIERURCBmaWxlcyB0aGF0IHlvdSBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlIERURCBlZGl0b3IuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBEVEQgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZSBEVEQgZWRpdG9yLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURHMsIGltcG9ydGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURHMsIGltcG9ydGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd29ya2R0ZHMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0aW1wdGR0ZCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkltcG9ydGluZyBEVERzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0aW1wdGR0ZCI+PGEgbmFtZT0idGltcHRkdGQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkltcG9ydGluZyBEVERzPC9oMT4KLQotCi0KLQotPGRpdj48cD5JZiB5b3Ugd2FudCB0byB3b3JrIHdpdGggRFREIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZSBvZgotdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlIERURAotZWRpdG9yLiA8L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGltcG9ydCBhIERURCBpbnRvIHRoZSB3b3JrYmVuY2gsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGU8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW1wb3J0PC9zcGFuPgotPC9zcGFuPi4gU2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlCi1TeXN0ZW08L3NwYW4+PC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkZpbGwgaW4gdGhlIGZpZWxkcyBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW1wb3J0PC9zcGFuPiB3aXphcmQKLWFzIG5lY2Vzc2FyeS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4gdG8gZXhpdCB0aGUgd2l6YXJkIGFuZCBpbXBvcnQKLXRoZSBmaWxlcy48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlNlbGVjdCB0aGUgRFREIGZpbGUgaW4gdGhlIE5hdmlnYXRvciB2aWV3IGFuZCBkb3VibGUtY2xpY2sgaXQgdG8KLW9wZW4gaXQgaW4gdGhlIERURCBlZGl0b3IuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkFmdGVyIHlvdSBoYXZlIGltcG9ydGVkIGEgRFREIGZpbGUgaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuZWQKLWl0IGluIHRoZSBEVEQgZWRpdG9yLCB5b3UgY2FuIGVkaXQgaXQgbWFudWFsbHkuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9jd29ya2R0ZHMuaHRtbCIgdGl0bGU9IlRoaXMgc2VjdGlvbnMgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzoiPldvcmtpbmcgd2l0aCBEVERzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZhbGR0ZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmFsZHRkLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYzdhYTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmFsZHRkLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwOCwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgU3R5IF9kaXNwbGF5IEZvbnRDb2xvcj0icmVkIj8+DQotPHRhc2sgaWQ9InR2YWxkdGQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlZhbGlkYXRpbmcgRFREczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VmFsaWRhdGluZyBEVERzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlZhbGlkYXRpbmcgYSBEVEQgZmlsZSBsZXRzIHlvdSB2ZXJpZnkgdGhhdCBpdCBpcyB3ZWxsIGZvcm1lZA0KLWFuZCBkb2VzIG5vdCBjb250YWluIGFueSBlcnJvcnMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RFREPGluZGV4dGVybT52YWxpZGF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZQ0KLXBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8NCi12YWxpZGF0ZSBhIERURCwgcmlnaHQtY2xpY2sgdGhlIERURCBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPlZhbGlkYXRlPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uIEEgZGlhbG9nIG9wZW5zLCBpbmRpY2F0aW5nDQotaWYgdGhlIERURCBmaWxlIHdhcyBzdWNjZXNzZnVsbHkgdmFsaWRhdGVkIG9yIG5vdC4gSWYgdGhlIGZpbGUgaXMNCi1pbnZhbGlkLCBhbnkgZXJyb3JzIHdpbGwgYXBwZWFyIGluIHRoZSBQcm9ibGVtcyB2aWV3Ljw/UHViIENhcmV0Pz48L3A+PC9jb250ZXh0Pg0KLTxyZXN1bHQ+PG5vdGU+SWYgeW91IHJlY2VpdmUgYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlDQotUHJvYmxlbXMgdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMNCi1hbGxvd2VkIGluIHRoZSB2aWV3LiBDbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4NCi08dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+PHVpY29udHJvbD5NYXJrZXJzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uIE9uIHRoaXMgcHJlZmVyZW5jZXMgcGFnZSB5b3UgY2FuIGluY3JlYXNlIG9yIGRlY3JlYXNlDQotdGhlIG51bWJlciBvZiB2aXNpYmxlIGl0ZW1zIGluIHRoZSBwcm9ibGVtcyB2aWV3LiA8L25vdGU+PHA+WW91IGNhbg0KLXNldCB1cCBhIHByb2plY3QncyBwcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QgcmVzb3VyY2VzDQotYXJlIGF1dG9tYXRpY2FsbHkgdmFsaWRhdGVkIHdoZW4geW91IHNhdmUgdGhlbS4gUmlnaHQgY2xpY2sgb24gdGhlDQotcHJvamVjdCwgY2xpY2sgPHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+LCBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+VmFsaWRhdGlvbjwvdWljb250cm9sPi4NCi1BbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1biBhZ2FpbnN0IHlvdXImbmJzcDtwcm9qZWN0IHdpbGwgYmUgbGlzdGVkDQotaW4gdGhlIFZhbGlkYXRpb24gcGFnZS48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuZGl0YSINCi1zY29wZT0icGVlciI+PGxpbmt0ZXh0PlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvbGlua3RleHQ+DQotPGRlc2M+R2VuZXJhbCB2YWxpZGF0aW9uIGluZm9ybWF0aW9uPC9kZXNjPg0KLTwvbGluaz4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMTA1Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2YWxkdGQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZhbGR0ZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDk4ZTUwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZhbGR0ZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVmFsaWRhdGluZyBEVERzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlZhbGlkYXRpbmcgYSBEVEQgZmlsZSBsZXRzIHlvdSB2ZXJpZnkgdGhhdCBpdCBpcyB3ZWxsIGZvcm1lZCBhbmQgZG9lcyBub3QgY29udGFpbiBhbnkgZXJyb3JzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJWYWxpZGF0aW5nIGEgRFREIGZpbGUgbGV0cyB5b3UgdmVyaWZ5IHRoYXQgaXQgaXMgd2VsbCBmb3JtZWQgYW5kIGRvZXMgbm90IGNvbnRhaW4gYW55IGVycm9ycy4iIC8+Ci08bWV0YSBjb250ZW50PSJEVEQsIHZhbGlkYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJEVEQsIHZhbGlkYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0dmFsZHRkIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+VmFsaWRhdGluZyBEVERzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0dmFsZHRkIj48YSBuYW1lPSJ0dmFsZHRkIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5WYWxpZGF0aW5nIERURHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlZhbGlkYXRpbmcgYSBEVEQgZmlsZSBsZXRzIHlvdSB2ZXJpZnkgdGhhdCBpdCBpcyB3ZWxsIGZvcm1lZAotYW5kIGRvZXMgbm90IGNvbnRhaW4gYW55IGVycm9ycy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLXZhbGlkYXRlIGEgRFRELCByaWdodC1jbGljayB0aGUgRFREIGluIHRoZSBOYXZpZ2F0b3IgdmlldyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRlPC9zcGFuPjwvc3Bhbj4uIEEgZGlhbG9nIG9wZW5zLCBpbmRpY2F0aW5nCi1pZiB0aGUgRFREIGZpbGUgd2FzIHN1Y2Nlc3NmdWxseSB2YWxpZGF0ZWQgb3Igbm90LiBJZiB0aGUgZmlsZSBpcwotaW52YWxpZCwgYW55IGVycm9ycyB3aWxsIGFwcGVhciBpbiB0aGUgUHJvYmxlbXMgdmlldy48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IElmIHlvdSByZWNlaXZlIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZQotUHJvYmxlbXMgdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMKLWFsbG93ZWQgaW4gdGhlIHZpZXcuIENsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+PC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+Ci08c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1hcmtlcnM8L3NwYW4+Ci08L3NwYW4+LiBPbiB0aGlzIHByZWZlcmVuY2VzIHBhZ2UgeW91IGNhbiBpbmNyZWFzZSBvciBkZWNyZWFzZQotdGhlIG51bWJlciBvZiB2aXNpYmxlIGl0ZW1zIGluIHRoZSBwcm9ibGVtcyB2aWV3LiA8L2Rpdj4KLTxwPllvdSBjYW4KLXNldCB1cCBhIHByb2plY3QncyBwcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QgcmVzb3VyY2VzCi1hcmUgYXV0b21hdGljYWxseSB2YWxpZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGVtLiBSaWdodCBjbGljayBvbiB0aGUKLXByb2plY3QsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+LCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+LgotQW55IHZhbGlkYXRvcnMgeW91IGNhbiBydW4gYWdhaW5zdCB5b3VywqBwcm9qZWN0IHdpbGwgYmUgbGlzdGVkCi1pbiB0aGUgVmFsaWRhdGlvbiBwYWdlLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxpbmZvIj48c3Ryb25nPlJlbGF0ZWQgaW5mb3JtYXRpb248L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIHRpdGxlPSJHZW5lcmFsIHZhbGlkYXRpb24gaW5mb3JtYXRpb24iPlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YWExYjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL0VkaXRvckh0bWxDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvRWRpdG9ySHRtbENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4ZGMxMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvRWRpdG9ySHRtbENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9Im1pc2MwMTcwIj4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gZWRpdCB0aGUgV2ViIGNvbnRlbnQgc2V0dGluZ3MgZm9yIGEgV2ViIHByb2plY3QuIFlvdSBjYW4gc3BlY2lmeSB0aGUgZGVmYXVsdCBkb2N1bWVudCB0eXBlLCBDU1MgcHJvZmlsZSwgYW5kIHRhcmdldCBkZXZpY2UuIFRoZSBwdWJsaWMgSUQgYW5kIHN5c3RlbSBJRCBhcmUgcG9wdWxhdGVkIGF1dG9tYXRpY2FsbHkuIFRvIHJlc3RvcmUgdGhlIGRlZmF1bHRzLCBjbGljayA8Yj5SZXN0b3JlIERlZmF1bHRzPC9iPi4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDAzMCI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUsIHNhdmUsIG9yIGxvYWQgYW4gSFRNTCBmaWxlLgotCi1WYXJpb3VzIGRldmVsb3BtZW50IHBsYXRmb3JtcyB1c2UgZGlmZmVyZW50IGxpbmUgZGVsaW1pdGVycyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgYSBuZXcgbGluZS4gU2VsZWN0IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgY29ycmVzcG9uZHMgdG8geW91ciBkZXZlbG9wbWVudCBvciBkZXBsb3ltZW50IHBsYXRmb3JtLgotPGI+Tm90ZTo8L2I+IFRoaXMgZGVsaW1pdGVyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gYW55IGRvY3VtZW50cyB0aGF0IGN1cnJlbnRseSBleGlzdC4gSXQgd2lsbCBiZSBhZGRlZCBvbmx5IHRvIGRvY3VtZW50cyB0aGF0IHlvdSBjcmVhdGUgYWZ0ZXIgeW91IHNlbGVjdCB0aGUgbGluZSBkZWxpbWl0ZXIgdHlwZSBhbmQgY2xpY2sgPGI+QXBwbHk8L2I+LCBvciB0byBleGlzdGluZyBmaWxlcyB0aGF0IHlvdSBvcGVuIGFuZCB0aGVuIHJlc2F2ZSBhZnRlciB5b3Ugc2VsZWN0IHRoZSBsaW5lIGRlbGltaXRlciB0eXBlIGFuZCBjbGljayA8Yj5BcHBseTwvYj4uCi0KLVRoZSBlbmNvZGluZyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZyBzZXQgdGhhdCBpcyB1c2VkIHdoZW4gZWl0aGVyIGNyZWF0aW5nIEhUTUwgZmlsZXMgb3IgbG9hZGluZyB5b3VyIEhUTUwgZmlsZXMgaW50byB0aGUgZWRpdG9yLiAgQ2hhbmdpbmcgdGhlIGNyZWF0aW5nIGZpbGVzIGVuY29kaW5nIGNhdXNlcyBhbnkgbmV3IEhUTUwgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBmcm9tIHNjcmF0Y2ggdG8gdXNlIHRoZSBzZWxlY3RlZCBlbmNvZGluZy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDMxIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgZm9ybWF0dGluZywgY29udGVudCBhc3Npc3QsIGFuZCBjYXBpdGFsaXphdGlvbiBzdHlsZSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBlZGl0IGFuIEhUTUwgZmlsZS4KLQotRW50ZXIgYSBtYXhpbXVtIHdpZHRoIGluIHRoZSA8Yj5MaW5lIHdpZHRoPC9iPiBmaWVsZCB0byBzcGVjaWZ5IHRoZSBsaW5lIHdpZHRoIHRvIGJyZWFrIGEgbGluZSB0byBmaXQgb250byBtb3JlIHRoYW4gb25lIGxpbmUgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLgotCi1TZWxlY3QgPGI+U3BsaXQgbXVsdGlwbGUgYXR0cmlidXRlcyBlYWNoIG9uIGEgbmV3IGxpbmU8L2I+IHRvIHN0YXJ0IGV2ZXJ5IGF0dHJpYnV0ZSBvbiBhIG5ldyBsaW5lIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZvcm1hdHRlZC4gQXR0cmlidXRlcyB3aWxsIHJldHVybiB0byB0aGUgc2FtZSBtYXJnaW4gYXMgdGhlIHByZXZpb3VzIGxpbmUuCi0KLVNlbGVjdCA8Yj5JbmRlbnQgdXNpbmcgdGFiczwvYj4gaWYgeW91IHdhbnQgdG8gdXNlIHRhYiBjaGFyYWN0ZXJzIChcdCkgYXMgdGhlIHN0YW5kYXJkIGZvcm1hdHRpbmcgaW5kZW50YXRpb24uCi0KLUlmIHlvdSBwcmVmZXIgdG8gdXNlIHNwYWNlcywgc2VsZWN0IDxiPkluZGVudCB1c2luZyBzcGFjZXM8L2I+LgotCi1Zb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgPGI+SW5kZW50YXRpb24gc2l6ZTwvYj4gd2hpY2ggaXMgdGhlIG51bWJlciBvZiB0YWJzIG9yIHNwYWNlIGNoYXJhY3RlcnMgdXNlZCBmb3IgZm9ybWF0dGluZyBpbmRlbnRhdGlvbi4KLQotU2VsZWN0IDxiPkNsZWFyIGFsbCBibGFuayBsaW5lczwvYj4gdG8gcmVtb3ZlIGJsYW5rIGxpbmVzIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZvcm1hdHRlZC4KLQotVG8gYXBwbHkgdGhlc2UgZm9ybWF0dGluZyBzdHlsZXMsIHNlbGVjdCB0aGUgPGI+Rm9ybWF0IERvY3VtZW50PC9iPiBtZW51IGl0ZW0uCi0KLUlmIHRoZSA8Yj5BdXRvbWF0aWNhbGx5IG1ha2Ugc3VnZ2VzdGlvbnM8L2I+IGNoZWNrIGJveCBpcyBzZWxlY3RlZCwgeW91IGNhbiBzcGVjaWZ5IHRoYXQgY2VydGFpbiBjaGFyYWN0ZXJzIHdpbGwgY2F1c2UgdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgdG8gcG9wIHVwIGF1dG9tYXRpY2FsbHkuIFNwZWNpZnkgdGhlc2UgY2hhcmFjdGVycyBpbiB0aGUgPGI+UHJvbXB0IHdoZW4gdGhlc2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQ8L2I+IGZpZWxkLgotCi1TZWxlY3QgdGhlIFVwcGVyY2FzZSBvciBMb3dlcmNhc2UgcmFkaW8gYnV0dG9uIHRvIGRldGVybWluZSB0aGUgY2FzZSBmb3IgdGFnIGFuZCBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgZG9jdW1lbnQgd2hlbiB1c2luZyBjb250ZW50IGFzc2lzdCBvciBjb2RlIGdlbmVyYXRpb24uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDAzMiI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZyB0aGF0IHRoZSBIVE1MIGVkaXRvciBkb2VzIHdoZW4geW91IGFyZSBlZGl0aW5nIGEgZmlsZS4KLQotVGhlIDxiPkNvbnRlbnQgdHlwZTwvYj4gZmllbGQgY29udGFpbnMgYSBsaXN0IG9mIGFsbCB0aGUgc291cmNlIHR5cGVzIHRoYXQgeW91IGNhbiBzZWxlY3QgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGVpdGhlciBzZWxlY3QgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IHlvdSB3YW50IHRvIHdvcmsgd2l0aCBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdCwgb3IgY2xpY2sgdGV4dCBpbiB0aGUgdGV4dCBzYW1wbGUgd2luZG93IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNvbnRlbnQgdHlwZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gY2hhbmdlIHRoZSB0ZXh0IGhpZ2hsaWdodGluZy4KLQotVGhlIDxiPkZvcmVncm91bmQ8L2I+IGFuZCA8Yj5CYWNrZ3JvdW5kPC9iPiBwdXNoIGJ1dHRvbnMgb3BlbiA8Yj5Db2xvcjwvYj4gZGlhbG9nIGJveGVzIHRoYXQgYWxsb3cgeW91IHRvIHNwZWNpZnkgdGV4dCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycywgcmVzcGVjdGl2ZWx5LiBTZWxlY3QgdGhlIDxiPkJvbGQ8L2I+IGNoZWNrIGJveCB0byBtYWtlIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlIGFwcGVhciBpbiBib2xkLgotCi1DbGljayB0aGUgPGI+UmVzdG9yZSBEZWZhdWx0PC9iPiBwdXNoIGJ1dHRvbiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZyBzdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDMzIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3JlYXRlIG5ldyBhbmQgZWRpdCBleGlzdGluZyB0ZW1wbGF0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgZWRpdCBhbiBIVE1MIGZpbGUuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ieG1sbTExMDAiPgotPGRlc2NyaXB0aW9uPkNsZWFudXAgb3B0aW9ucyBlbmFibGUgeW91IHRvIHVwZGF0ZSBhIGRvY3VtZW50IHNvIHRoYXQgaXQgaXMgd2VsbC1mb3JtZWQgYW5kIGZvcm1hdHRlZC4KLQotVGhlIGZvbGxvd2luZyBjbGVhbnVwIG9wdGlvbnMgbGV0IHlvdSBzZWxlY3QgcmFkaW8gYnV0dG9ucyB0byBjaG9vc2UgdGhlIHR5cGUgb2YgY2xlYW51cCB0byBiZSBwZXJmb3JtZWQ6Ci0tIDxiPlRhZyBuYW1lIGNhc2UgZm9yIEhUTUw8L2I+OiBVbmxlc3Mgc2V0IHRvIDxiPkFzLWlzPC9iPiwgY2hhbmdlcyB0aGUgY2FzZSBvZiBhbGwgdGFncyBpbiBhIGZpbGUgZm9yIGVhc2llciB2aXN1YWwgcGFyc2luZyBhbmQgY29uc2lzdGVuY3kuCi0tIDxiPkF0dHJpYnV0ZSBuYW1lIGNhc2UgZm9yIEhUTUw8L2I+OiBVbmxlc3Mgc2V0IHRvIDxiPkFzLWlzPC9iPiwgY2hhbmdlcyB0aGUgY2FzZSBvZiBhbGwgYXR0cmlidXRlcyBpbiBhIGZpbGUgZm9yIGVhc2llciB2aXN1YWwgcGFyc2luZyBhbmQgY29uc2lzdGVuY3kuCi0KLVRoZSBmb2xsb3dpbmcgY2xlYW51cCBvcHRpb25zIGNhbiBiZSBzZXQgdG8gb24gb3Igb2ZmLCBzbyB0aGF0IHlvdSBjYW4gbGltaXQgdGhlIHR5cGUgb2YgY2xlYW51cCBwZXJmb3JtZWQ6Ci0tIDxiPkluc2VydCByZXF1aXJlZCBhdHRyaWJ1dGVzPC9iPjogSW5zZXJ0cyBhbiBtaXNzaW5nIGF0dHJpYnV0ZXMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgdGhlIHRhZyB0byBtYWtlIHRoZSBlbGVtZW50IG9yIGRvY3VtZW50IHdlbGwtZm9ybWVkLgotLSA8Yj5JbnNlcnQgbWlzc2luZyB0YWdzPC9iPjogQ29tcGxldGVzIGFueSBtaXNzaW5nIHRhZ3MgKHN1Y2ggYXMgYWRkaW5nIGFuIGVuZCB0YWcpIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBlbGVtZW50IG9yIGRvY3VtZW50IHdlbGwtZm9ybWVkLgotLSA8Yj5RdW90ZSBhdHRyaWJ1dGUgdmFsdWVzPC9iPjogQXBwcm9wcmlhdGVseSBhZGRzIGRvdWJsZS0gb3Igc2luZ2xlLXF1b3RlcyBiZWZvcmUgYW5kIGFmdGVyIGF0dHJpYnV0ZSB2YWx1ZXMgaWYgdGhleSBhcmUgbWlzc2luZy4KLS0gPGI+Rm9ybWF0IHNvdXJjZTwvYj46IEZvcm1hdHMgdGhlIGRvY3VtZW50IGp1c3QgYXMgdGhlIDxiPkZvcm1hdCBEb2N1bWVudDwvYj4gY29udGV4dCBtZW51IG9wdGlvbiBkb2VzLCBpbW1lZGlhdGVseSBhZnRlciBwZXJmb3JtaW5nIGFueSBvdGhlciBzcGVjaWZpZWQgPGI+Q2xlYW51cDwvYj4gb3B0aW9ucy4KLS0gPGI+Q29udmVydCBsaW5lIGRlbGltaXRlcnMgdG88L2I+OiBDb252ZXJ0cyBhbGwgbGluZSBkZWxpbWl0ZXJzIGluIHRoZSBmaWxlIHRvIHRoZSBzZWxlY3RlZCBvcGVyYXRpbmcgc3lzdGVtJ3MgdHlwZS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvRWRpdG9ySHRtbENvbnRleHRzMi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvRWRpdG9ySHRtbENvbnRleHRzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MTQxODcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL0VkaXRvckh0bWxDb250ZXh0czIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iaHRtbHNvdXJjZV9zb3VyY2VfSGVscElkIj4KLTxkZXNjcmlwdGlvbj5UaGUgSFRNTCBzb3VyY2UgcGFnZSBlZGl0b3IgbGV0cyB5b3UgZWRpdCBhIGZpbGUgdGhhdCBpcyBjb2RlZCBpbiB0aGUgSHlwZXJ0ZXh0IE1hcmt1cCBMYW5ndWFnZSBvciBpbiBYSFRNTC4gVGhlIGVkaXRvciBwcm92aWRlcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhcyBjb250ZW50IGFzc2lzdCwgdXNlci1kZWZpbmVkIHRlbXBsYXRlcywgc3ludGF4IGhpZ2hsaWdodGluZywgdW5saW1pdGVkIHVuZG8gYW5kIHJlZG8sIGVsZW1lbnQgc2VsZWN0aW9uIGFuZCBmb3JtYXR0aW5nLCBhbmQgZG9jdW1lbnQgZm9ybWF0dGluZy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjQuaHRtbCIvPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9IVE1MV2l6Q29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL0hUTUxXaXpDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNjhjZjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL0hUTUxXaXpDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9Imh0bWx3MDAxMCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoZSBIVE1MIHRlbXBsYXRlIGNoZWNrYm94IHRvIGNyZWF0ZSB5b3VyIEhUTUwgZmlsZSBiYXNlZCBvbiBhIGRlZmF1bHQgdGVtcGxhdGUuIENob29zZSBvbmUgb2YgdGhlIGZyYW1lc2V0IHRlbXBsYXRlcyBpZiB5b3UgYXJlIGRldmVsb3BpbmcgYSBXZWIgc2l0ZSB3aXRoIGZyYW1lcy4gSWYgeW91IGRvIG5vdCBzZWxlY3QgYSB0ZW1wbGF0ZSwgeW91ciBuZXdseSBjcmVhdGVkIEpTUCBmaWxlIHdpbGwgYmUgY29tcGxldGVseSBibGFuay4KLTwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci0KLQotCi08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDkxNTkzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYTM1MmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBFZGl0b3JIdG1sQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBFZGl0b3JIdG1sQ29udGV4dHMyLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZlYjllMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotQnVuZGxlLU5hbWUuMCA9IEhUTUwgZWRpdG9yIGluZm9wb3BzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwODVlNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9ySHRtbENvbnRleHRzLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9ySHRtbENvbnRleHRzMi54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUiLz4KLSAgICAgICAgIDxjb250ZXh0cyBmaWxlPSJIVE1MV2l6Q29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpIi8+Ci08L2V4dGVuc2lvbj4KLQotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2EyZjg4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJfMS4wLjAuamFyCi10ZW1wCi1EaXRhTGluay5jYXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZDY0MDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL0RvY0J1aWxkLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9Eb2NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMTg2ODQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL0RvY0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLSAKLQotCVRoaXMgc2NyaXB0IGJ1aWxkIHRoZSBIZWxwIHBsdWctaW4gYnkgdHJhbnNmb3JtaW5nIHRoZSBESVRBIHNvdXJjZSBmaWxlcyBpbnRvIEhUTUwuCi0JCi0JVG8gdXNlIHRoaXMgc2NyaXB0LCB5b3UgbXVzdCBpbnN0YWxsIERJVEEtT1Qgb24geW91ciBtYWNoaW5lIGluIHRoZSBkaXJlY3RvcnkKLQlkZWZpbmVkIGJ5IHRoZSBkaXRhLm90LmRpciBwcm9wZXJ0eS4KLQkKLQlSdW4gdGhlIGRlZmF1bHQgdGFyZ2V0IGFmdGVyIHlvdSBlZGl0IHRoZSBESVRBIHNvdXJjZSBmaWxlcyB0byByZWdlbmVyYXRlIHRoZSBIVE1MLgotCQotCVRvIGN1c3RvbWl6ZSB0aGlzIHNjcmlwdCBmb3Igb3RoZXIgSGVscCBwbHVnLWlucywgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgYXJncy5pbnB1dCBwcm9wZXJ0eQotCXRvIGJlIHRoZSBESVRBIG1hcCBmaWxlIGZvciB0aGUgcGx1Zy1pbi4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgbGlua3MgdG8gc2libGluZyBIZWxwIHBsdWctaW5zIGhhdmUgc2NvcGU9InBlZXIiLCBvdGhlcndpc2UgdGhlCi0Jb3V0cHV0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2lsbCBiZSBzaGlmdGVkIGluY29ycmVjdGx5LgotCQotCU5PVEU6IFRoaXMgc2NyaXB0IGFzc3VtZXMgdGhhdCB5b3UgaGFuZCBjb2RlIHlvdXIgcGx1Z2luLnhtbCBmaWxlIGluIG15cGx1Z2luLnhtbC4gVGhpcyBmaWxlCi0Jd2lsbCBiZSBjb3BpZWQgb3ZlciB0aGUgZ2VuZXJhdGVkIHBsdWdpbi54bWwgd2hpY2ggaXMgY3VycmVudGx5IG5vdCBiZWluZyBnZW5lcmF0ZWQgY29ycmVjdGx5Ci0JYnkgRElUQS1PVC4KLQkKLQlDaGFuZ2VMb2c6Ci0JMjAwNi0wNC0wNSBBcnRodXIgUnltYW4gPHJ5bWFuQGNhLmlibS5jb20+Ci0JLSBDcmVhdGVkLgotCTIwMDgtMDUtMDUgS2F0ZSBQcmljZSA8a2F0ZXBAY2EuaWJtLmNvbT4KLQktIG1vZGlmaWVkIHRvIGFkZCBnZW5lcmF0aW9uIG9mIHByZS1idWlsdCBoZWxwIGluZGV4LiAKLQktIE11c3QgZGVsZXRlIC9pbmRleCBmb2xkZXIgYmVmb3JlIHJ1bm5pbmcgYnVpbGQKLS0tPgotPHByb2plY3QgbmFtZT0iZWNsaXBzZWhlbHAiIGRlZmF1bHQ9ImFsbCI+Ci0KLQk8cHJvcGVydHkgbmFtZT0iZGl0YS5vdC5kaXIiIGxvY2F0aW9uPSJDOi9ESVRBLU9UMS4yLjIiIC8+Ci0KLQk8cGF0aCBpZD0iZG9zdC5jbGFzcy5wYXRoIj4KLQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9bGliJHtmaWxlLnNlcGFyYXRvcn1kb3N0LmphciIgLz4KLQk8L3BhdGg+Ci0KLQk8dGFza2RlZiBuYW1lPSJpbnRlZ3JhdGUiIGNsYXNzbmFtZT0ib3JnLmRpdGEuZG9zdC5wbGF0Zm9ybS5JbnRlZ3JhdG9yVGFzayI+Ci0JCTxjbGFzc3BhdGggcmVmaWQ9ImRvc3QuY2xhc3MucGF0aCIgLz4KLQk8L3Rhc2tkZWY+Ci0JPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImludGVncmF0ZSwgZWNsaXBzZWhlbHAiPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iaW50ZWdyYXRlIj4KLQkJPGludGVncmF0ZSBkaXRhZGlyPSIke2RpdGEub3QuZGlyfSIgLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gcmV2aXNlIGJlbG93IGhlcmUgLS0+Ci0JPHRhcmdldCBuYW1lPSJlY2xpcHNlaGVscCI+Ci0JCTxhbnQgYW50ZmlsZT0iJHtkaXRhLm90LmRpcn0ke2ZpbGUuc2VwYXJhdG9yfWNvbmR1Y3Rvci54bWwiIHRhcmdldD0iaW5pdCIgZGlyPSIke2RpdGEub3QuZGlyfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5jb3B5Y3NzIiB2YWx1ZT0ibm8iIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5jc3NwYXRoIiB2YWx1ZT0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuZWNsaXBzZS5wcm92aWRlciIgdmFsdWU9IkVjbGlwc2Uub3JnIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuZWNsaXBzZS52ZXJzaW9uIiB2YWx1ZT0iMy4zLjAiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5pbnB1dCIgbG9jYXRpb249InNzZV90b2MuZGl0YW1hcCIgLz4gICAgCQkKLQkJCTxwcm9wZXJ0eSBuYW1lPSJjbGVhbi50ZW1wIiB2YWx1ZT0idHJ1ZSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLmV4dG5hbWUiIHZhbHVlPSIuZGl0YSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLnRlbXAuZGlyIiBsb2NhdGlvbj0idGVtcCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQuZGlyIiBsb2NhdGlvbj0iIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InRyYW5zdHlwZSIgdmFsdWU9ImVjbGlwc2VoZWxwIiAvPgotCQk8L2FudD4KLQkJPGNvcHkgZmlsZT0ibXlwbHVnaW4ueG1sIiB0b2ZpbGU9InBsdWdpbi54bWwiIG92ZXJ3cml0ZT0ieWVzIiAvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iYnVpbGQuaW5kZXgiIGRlc2NyaXB0aW9uPSJCdWlsZHMgc2VhcmNoIGluZGV4IGZvciB0aGUgcGx1Zy1pbiIgaWY9ImVjbGlwc2UucnVubmluZyI+Ci0JICAgICA8aGVscC5idWlsZEhlbHBJbmRleCBtYW5pZmVzdD0icGx1Z2luLnhtbCIgZGVzdGluYXRpb249Ii4iLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhMTFmOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYzBjMGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzc2VfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXgueG1sLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8qLmh0bSosXAotICAgICAgICAgICAgICAgaW5kZXgvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gKi5tYXBsaXN0LFwKLSAgICAgICAgICAgICAgICouZGl0YW1hcCxcCi0gICAgICAgICAgICAgICB0b3BpY3MvKi5kaXRhCi1iaW4uZXhjbHVkZXMgPSBEb2NCdWlsZC54bWwsXAotICAgICAgICAgICAgICAgbXlQbHVnaW4qLnhtbAotICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25jb250YXNzLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmNvbnRhc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODIwMTRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmNvbnRhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9uanNjZGFzdC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25qc2NkYXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhMTQxYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25qc2NkYXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxMzVjZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25saW51eC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25tYWNzY3JwLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbm1hY3NjcnAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGE2MzcxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbm1hY3NjcnAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ucXVlc3QuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ucXVlc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmFhMWUyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbnF1ZXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbndpbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL253aW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVmOWNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbndpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvX3AuY2ZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L19wLmNmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E0MTY0OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvX3AuY2ZzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9kZWxldGFibGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5M2Y0NzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmE3NmRjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNXZWQgTWF5IDE0IDE4OjU2OjAzIEVEVCAyMDA4DQotb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcj1vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyXG4xLjEuMC5xdWFsaWZpZXINCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYzdhNjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZGVwZW5kZW5jaWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jV2VkIE1heSAxNCAxODo1NjowMyBFRFQgMjAwOA0KLWx1Y2VuZT0xLjkuMS52MjAwODAzMDYxODExDQotYW5hbHl6ZXI9b3JnLmVjbGlwc2UuaGVscC5iYXNlXCMzLjMuMTAwLnYyMDA4MDQyNT9sb2NhbGVcPWVuDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9pbmRleGVkX2RvY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NWNkNDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNXZWQgTWF5IDE0IDE4OjU2OjAzIEVEVCAyMDA4DQotL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMi5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxMC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3ZhbGlkYXRlLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI2Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jZW5jb2RpbmcuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjcuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDYuaHRtbD0wDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDYzYzRjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9zZWdtZW50cworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9teXBsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjU1MDU2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9teXBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuNiI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4gCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWctaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCBwYWdlcyAgICAgIC0tPgotPCEtLSBmb3IgdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIChzb3VyY2UgZWRpdG9ycykuICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLTxwbHVnaW4+Ci0KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgICA8dG9jIGZpbGU9InNzZV90b2MueG1sIi8+Ci0gICAgICAgPGluZGV4IHBhdGg9ImluZGV4LyIvPgotICAgPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5pbmRleCI+Ci0gICAgICA8aW5kZXggZmlsZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcmluZGV4LnhtbCIvPgotPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIubWFwbGlzdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLm1hcGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZjRkYTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIubWFwbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPG1hcGxpc3QgdmVyc2lvbj0iMy42LjIiPg0KLSAgPG5hdj4NCi0gICAgPG1hcCBmaWxlPSJzc2VfdG9jLmRpdGFtYXAiLz4NCi0gIDwvbmF2Pg0KLSAgPGxpbms+DQotICA8L2xpbms+DQotPC9tYXBsaXN0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXguaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhODg4Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcmluZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNyIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTwhLS0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTGljZW5zZWQgTWF0ZXJpYWxzIFByb3BlcnR5IG9mIElCTSAtLT4KLTwhLS0gVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtLT4KLTwhLS0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgLS0+Ci08IS0tIEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJpYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5JbmRleDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMT5JbmRleDwvaDE+Ci08YSBuYW1lPSJJRFgwXzQxIiBocmVmPSIjSURYMV80MSI+QTwvYT4KLTxhIG5hbWU9IklEWDBfNDMiIGhyZWY9IiNJRFgxXzQzIj5DPC9hPgotPGEgbmFtZT0iSURYMF80NCIgaHJlZj0iI0lEWDFfNDQiPkQ8L2E+Ci08YSBuYW1lPSJJRFgwXzQ2IiBocmVmPSIjSURYMV80NiI+RjwvYT4KLTxhIG5hbWU9IklEWDBfNDgiIGhyZWY9IiNJRFgxXzQ4Ij5IPC9hPgotPGEgbmFtZT0iSURYMF80QSIgaHJlZj0iI0lEWDFfNEEiPko8L2E+Ci08YSBuYW1lPSJJRFgwXzREIiBocmVmPSIjSURYMV80RCI+TTwvYT4KLTxhIG5hbWU9IklEWDBfNTMiIGhyZWY9IiNJRFgxXzUzIj5TPC9hPgotPGEgbmFtZT0iSURYMF81NCIgaHJlZj0iI0lEWDFfNTQiPlQ8L2E+Ci08YSBuYW1lPSJJRFgwXzU2IiBocmVmPSIjSURYMV81NiI+VjwvYT4KLTxhIG5hbWU9IklEWDBfNTgiIGhyZWY9IiNJRFgxXzU4Ij5YPC9hPgotPGhyPjwvaHI+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNDEiIGhyZWY9IiNJRFgwXzQxIj5BPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPmFubm90YXRpb24gcHJlZmVyZW5jZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMS5odG1sI3RzcmNlZHQwMDEiPm1hcmt1cCBsYW5ndWFnZSBzZXR0aW5nczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNDMiIGhyZWY9IiNJRFgwXzQzIj5DPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPmNoYXJhY3RlciBlbmNvZGluZwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuaHRtbCNjZW5jb2RpbmciPmxvY2F0aW9uIGluIGZpbGVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmNvbnRlbnQgYXNzaXN0YW5jZQotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDIzLmh0bWwjdHNyY2VkdDAyMyI+ZW5hYmxpbmcgZm9yIEpTUCBmaWxlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL2NzcmNlZHQwMDYuaHRtbCNjc3JjZWR0MDA2Ij5vdmVydmlldzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMDUuaHRtbCN0c3JjZWR0MDA1Ij5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5jb250ZW50IHR5cGVzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3Rjb250ZW50dHlwZS5odG1sI3Rjb250ZW50dHlwZSI+bWFwcGluZyBmaWxlIGV4dGVuc2lvbnM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzQ0IiBocmVmPSIjSURYMF80NCI+RDwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5kcmF3ZXJzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMTYuaHRtbCN0c3JjZWR0MDE2Ij5zbmlwcGV0cyB2aWV3PC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV80NiIgaHJlZj0iI0lEWDBfNDYiPkY8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+ZmlsZSBleHRlbnNpb25zCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3Rjb250ZW50dHlwZS5odG1sI3Rjb250ZW50dHlwZSI+bWFwcGluZyBjb250ZW50IHR5cGVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmZpbGUgdHlwZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwjdGNvbnRlbnR0eXBlIj5lZGl0b3JzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV80OCIgaHJlZj0iI0lEWDBfNDgiPkg8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+SFRNTAotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPnRlbXBsYXRlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDI0Lmh0bWwjdHNyY2VkdDAyNCI+YWRkaW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNC5odG1sI3RzcmNlZHQwMjQiPnJlbW92aW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzRBIiBocmVmPSIjSURYMF80QSI+SjwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5KU1AgZmlsZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY2VuY29kaW5nLmh0bWwjY2VuY29kaW5nIj5jaGFyYWN0ZXIgZW5jb2Rpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDIzLmh0bWwjdHNyY2VkdDAyMyI+ZW5hYmxpbmcgY29udGVudCBhc3Npc3RhbmNlPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPkpTUCBwYWdlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDI4Lmh0bWwjdHNyY2VkdDAyOCI+dGVtcGxhdGVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV80RCIgaHJlZj0iI0lEWDBfNEQiPk08L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+bWFya3VwIGxhbmd1YWdlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDAwLmh0bWwjdHNyY2VkdDAwMCI+ZWRpdGluZyB0ZXh0PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMS5odG1sI3RzcmNlZHQwMDEiPnNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjcuaHRtbCN0c3JjZWR0MDI3Ij50ZW1wbGF0ZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzUzIiBocmVmPSIjSURYMF81MyI+UzwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5zbmlwcGV0IGRyYXdlcnMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNS5odG1sI3RzcmNlZHQwMTUiPmFkZGluZyBpdGVtczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5zbmlwcGV0IGl0ZW1zCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMTUuaHRtbCN0c3JjZWR0MDE1Ij5hZGRpbmcgdG8gZHJhd2VyczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5zbmlwcGV0cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDE0Lmh0bWwjdHNyY2VkdDAxNCI+ZHJhd2VyIGN1c3RvbWl6YXRpb248L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDIyLmh0bWwjdHNyY2VkdDAyMiI+ZWRpdGluZyBpdGVtczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMTYuaHRtbCN0c3JjZWR0MDE2Ij5tb2RpZnlpbmcgZHJhd2VyczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjYuaHRtbCN0c3JjZWR0MDI2Ij5vdmVydmlldzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5TbmlwcGV0cyB2aWV3Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL2NzcmNlZHQwMDEuaHRtbCNjc3JjZWR0MDAxIj5vdmVydmlldzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5zcGVsbCBjaGVjawotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDEwLmh0bWwjdHNyY2VkdDAxMCI+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5jb250ZW50IGFzc2lzdGFuY2UgPGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMDUuaHRtbCN0c3JjZWR0MDA1Ij4oMSk8L2E+LCA8YSBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNi5odG1sI2NzcmNlZHQwMDYiPigyKTwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL2NzcmNlZHQwMDQuaHRtbCNjc3JjZWR0MDA0Ij5vdmVydmlldzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjUuaHRtbCN0c3JjZWR0MDI1Ij5wcmVmZXJlbmNlIHNldHRpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDEwLmh0bWwjdHNyY2VkdDAxMCI+c3BlbGwgY2hlY2s8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDA3Lmh0bWwjdHNyY2VkdDAwNyI+dGV4dCBzZWFyY2g8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzU0IiBocmVmPSIjSURYMF81NCI+VDwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT50ZW1wbGF0ZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNC5odG1sI3RzcmNlZHQwMjQiPkhUTUw8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDI4Lmh0bWwjdHNyY2VkdDAyOCI+SlNQIHBhZ2VzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNy5odG1sI3RzcmNlZHQwMjciPm1hcmt1cCBsYW5ndWFnZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy9jc3JjZWR0MDA0Lmh0bWwjY3NyY2VkdDAwNCI+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDI5Lmh0bWwjdHNyY2VkdDAyNyI+WE1MPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnRleHQKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMC5odG1sI3RzcmNlZHQwMDAiPmVkaXRpbmcgaW4gbWFya3VwIGxhbmd1YWdlczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNTYiIGhyZWY9IiNJRFgwXzU2Ij5WPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPnZhbGlkYXRpb24KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3ZhbGlkYXRlLmh0bWwjY3NyY2VkdDAwMSI+c291cmNlIHZzIGJhdGNoPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV81OCIgaHJlZj0iI0lEWDBfNTgiPlg8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+WEhUTUwKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY2VuY29kaW5nLmh0bWwjY2VuY29kaW5nIj5jaGFyYWN0ZXIgZW5jb2Rpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+WE1MCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL2NlbmNvZGluZy5odG1sI2NlbmNvZGluZyI+Y2hhcmFjdGVyIGVuY29kaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnhtbCB0ZW1wbGF0ZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOS5odG1sI3RzcmNlZHQwMjciPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJpbmRleC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcmluZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyM2FjNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcmluZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPGluZGV4PgotICA8ZW50cnkga2V5d29yZD0ic3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NzcmNlZHQwMDQuaHRtbCNjc3JjZWR0MDA0IiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcmVmZXJlbmNlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjUuaHRtbCN0c3JjZWR0MDI1IiB0aXRsZT0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IGFzc2lzdGFuY2UiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9InRleHQgZWRpdG9ycyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNS5odG1sI3RzcmNlZHQwMDUiIHRpdGxlPSJHZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNi5odG1sI2NzcmNlZHQwMDYiIHRpdGxlPSJDb250ZW50IGFzc2lzdCIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ0ZXh0IHNlYXJjaCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMDcuaHRtbCN0c3JjZWR0MDA3IiB0aXRsZT0iU2VhcmNoaW5nIG9yIGZpbmRpbmcgdGV4dCB3aXRoaW4gYSBmaWxlIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic3BlbGwgY2hlY2siPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDEwLmh0bWwjdHNyY2VkdDAxMCIgdGl0bGU9IkNoZWNraW5nIHNwZWxsaW5nIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRlbXBsYXRlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNC5odG1sI2NzcmNlZHQwMDQiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcmt1cCBsYW5ndWFnZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI3Lmh0bWwjdHNyY2VkdDAyNyIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSFRNTCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjQuaHRtbCN0c3JjZWR0MDI0IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpTUCBwYWdlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjguaHRtbCN0c3JjZWR0MDI4IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iWE1MIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOS5odG1sI3RzcmNlZHQwMjciIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFya3VwIGxhbmd1YWdlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmcgdGV4dCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMDAuaHRtbCN0c3JjZWR0MDAwIiB0aXRsZT0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMDEuaHRtbCN0c3JjZWR0MDAxIiB0aXRsZT0iU2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idGVtcGxhdGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNy5odG1sI3RzcmNlZHQwMjciIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXMgLSBvdmVydmlldyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ0ZXh0Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyBpbiBtYXJrdXAgbGFuZ3VhZ2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMC5odG1sI3RzcmNlZHQwMDAiIHRpdGxlPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InZhbGlkYXRpb24iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJzb3VyY2UgdmVyc3VzIGJhdGNoIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3ZhbGlkYXRlLmh0bWwjY3NyY2VkdDAwMSIgdGl0bGU9IlNvdXJjZSBhbmQgYmF0Y2ggdmFsaWRhdGlvbiIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJhbm5vdGF0aW9ucyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcmt1cCBsYW5ndWFnZSBzZXR0aW5ncyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMDEuaHRtbCN0c3JjZWR0MDAxIiB0aXRsZT0iU2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgYXNzaXN0YW5jZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNS5odG1sI3RzcmNlZHQwMDUiIHRpdGxlPSJHZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNi5odG1sI2NzcmNlZHQwMDYiIHRpdGxlPSJDb250ZW50IGFzc2lzdCIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVuYWJsaW5nIGZvciBKU1AgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDIzLmh0bWwjdHNyY2VkdDAyMyIgdGl0bGU9IkVuYWJsaW5nIGNvbnRlbnQgYXNzaXN0IGZvciBKU1AgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlNQIGZpbGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZW5hYmxpbmcgY29udGVudCBhc3Npc3RhbmNlIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyMy5odG1sI3RzcmNlZHQwMjMiIHRpdGxlPSJFbmFibGluZyBjb250ZW50IGFzc2lzdCBmb3IgSlNQIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY2hhcmFjdGVyIGVuY29kaW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2VuY29kaW5nLmh0bWwjY2VuY29kaW5nIiB0aXRsZT0iRmlsZSBFbmNvZGluZyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InRlbXBsYXRlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjguaHRtbCN0c3JjZWR0MDI4IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgdHlwZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nIGZpbGUgZXh0ZW5zaW9ucyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3Rjb250ZW50dHlwZS5odG1sI3Rjb250ZW50dHlwZSIgdGl0bGU9IkFzc29jaWF0aW5nIGVkaXRvcnMgd2l0aCBhZGRpdGlvbmFsIGZpbGVzIHR5cGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImZpbGUgZXh0ZW5zaW9ucyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmcgY29udGVudCB0eXBlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3Rjb250ZW50dHlwZS5odG1sI3Rjb250ZW50dHlwZSIgdGl0bGU9IkFzc29jaWF0aW5nIGVkaXRvcnMgd2l0aCBhZGRpdGlvbmFsIGZpbGVzIHR5cGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImZpbGUgdHlwZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0b3JzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwjdGNvbnRlbnR0eXBlIiB0aXRsZT0iQXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGFkZGl0aW9uYWwgZmlsZXMgdHlwZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY2hhcmFjdGVyIGVuY29kaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0ibG9jYXRpb24gaW4gZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuaHRtbCNjZW5jb2RpbmciIHRpdGxlPSJGaWxlIEVuY29kaW5nIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlhIVE1MIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY2hhcmFjdGVyIGVuY29kaW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2VuY29kaW5nLmh0bWwjY2VuY29kaW5nIiB0aXRsZT0iRmlsZSBFbmNvZGluZyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjaGFyYWN0ZXIgZW5jb2RpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuaHRtbCNjZW5jb2RpbmciIHRpdGxlPSJGaWxlIEVuY29kaW5nIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIHRlbXBsYXRlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjkuaHRtbCN0c3JjZWR0MDI3IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNwZWxsIGNoZWNrIj4KLSAgICA8ZW50cnkga2V5d29yZD0ic3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDEwLmh0bWwjdHNyY2VkdDAxMCIgdGl0bGU9IkNoZWNraW5nIHNwZWxsaW5nIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkhUTUwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJ0ZW1wbGF0ZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9InJlbW92aW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI0Lmh0bWwjdHNyY2VkdDAyNCIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI0Lmh0bWwjdHNyY2VkdDAyNCIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNuaXBwZXRzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI2Lmh0bWwjdHNyY2VkdDAyNiIgdGl0bGU9IkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZHJhd2VyIGN1c3RvbWl6YXRpb24iPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDE0Lmh0bWwjdHNyY2VkdDAxNCIgdGl0bGU9IkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZHJhd2VycyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTUuaHRtbCN0c3JjZWR0MDE1IiB0aXRsZT0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIGl0ZW1zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyMi5odG1sI3RzcmNlZHQwMjIiIHRpdGxlPSJFZGl0aW5nIHNuaXBwZXQgaXRlbXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtb2RpZnlpbmcgZHJhd2VycyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTYuaHRtbCN0c3JjZWR0MDE2IiB0aXRsZT0iRGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VycyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJTbmlwcGV0cyB2aWV3Ij4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jc3JjZWR0MDAxLmh0bWwjY3NyY2VkdDAwMSIgdGl0bGU9IlNuaXBwZXRzIHZpZXciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZHJhd2VycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNuaXBwZXRzIHZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDE2Lmh0bWwjdHNyY2VkdDAxNiIgdGl0bGU9IkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotPC9pbmRleD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNmYzYjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcgotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLUJ1bmRsZS1OYW1lLjAgPSBTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGFuZCBzbmlwcGV0cyBkb2N1bWVudGF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1NTA1Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy42Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PiAKLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Zy1pbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwIHBhZ2VzICAgICAgLS0+Ci08IS0tIGZvciB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgKHNvdXJjZSBlZGl0b3JzKS4gICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHBsdWdpbj4KLQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MgZmlsZT0ic3NlX3RvYy54bWwiLz4KLSAgICAgICA8aW5kZXggcGF0aD0iaW5kZXgvIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXgueG1sIi8+Ci08L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvc3NlX3RvYy5kaXRhbWFwIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3NzZV90b2MuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwYjU5Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvc3NlX3RvYy5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgTWFwLy9FTiINCi0gIm1hcC5kdGQiPg0KLTxtYXAgaWQ9IndzdHNzZXRvYyIgbGlua2luZz0ibm9uZSIgdGl0bGU9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNC5kaXRhIiBuYXZ0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMC5kaXRhIiBsb2NrdGl0bGU9InllcyIgbmF2dGl0bGU9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzICINCi10eXBlPSJ0YXNrIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N2YWxpZGF0ZS5kaXRhIiBuYXZ0aXRsZT0iU291cmNlIGFuZCBiYXRjaCB2YWxpZGF0aW9uIg0KLXR5cGU9ImNvbmNlcHQiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDI1LmRpdGEiIG5hdnRpdGxlPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyINCi10eXBlPSJ0YXNrIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMDEuZGl0YSIgbmF2dGl0bGU9IlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDA1LmRpdGEiIG5hdnRpdGxlPSJHZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyINCi10eXBlPSJ0YXNrIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NzcmNlZHQwMDYuZGl0YSIgbmF2dGl0bGU9IkNvbnRlbnQgYXNzaXN0IiB0eXBlPSJjb25jZXB0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyMy5kaXRhIiBuYXZ0aXRsZT0iTWFraW5nIGNvbnRlbnQgYXNzaXN0IHdvcmsgZm9yIEpTUCBmaWxlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y29udGVudHR5cGUuZGl0YSIgbmF2dGl0bGU9IkFzc29jaWF0aW5nIGVkaXRvcnMgd2l0aCBmaWxlIHR5cGVzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuZGl0YSIgbmF2dGl0bGU9IkZpbGUgRW5jb2RpbmciIHR5cGU9ImNvbmNlcHQiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDA3LmRpdGEiIG5hdnRpdGxlPSJTZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGUiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMTAuZGl0YSIgbmF2dGl0bGU9IkNoZWNraW5nIHNwZWxsaW5nIiB0eXBlPSJ0YXNrIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNy5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzIC0gb3ZlcnZpZXciDQotdHlwZT0idGFzayI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDI0LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDI4LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMjkuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDI2LmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldyINCi10eXBlPSJ0YXNrIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NzcmNlZHQwMDEuZGl0YSIgbmF2dGl0bGU9IlNuaXBwZXRzIHZpZXciIHR5cGU9ImNvbmNlcHQiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDE0LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgc25pcHBldHMgZHJhd2VycyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNS5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMjIuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgc25pcHBldCBpdGVtcyIgdHlwZT0idGFzayI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMTYuZGl0YSIgbmF2dGl0bGU9IkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sdG9vbHNrZXkuZGl0YSINCi1uYXZ0aXRsZT0iU291cmNlIGVkaXRvciBrZXlib2FyZCBzaG9ydGN1dHMiIHNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L21hcD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvc3NlX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvc3NlX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNTM2MTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3NzZV90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgdG9waWM9InRvcGljcy9jc3JjZWR0MDA0Lmh0bWwiPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0idG9waWNzL2NzcmNlZHQwMDQuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzICIgaHJlZj0idG9waWNzL3RzcmNlZHQwMDAuaHRtbCI+Ci08dG9waWMgbGFiZWw9IlNvdXJjZSBhbmQgYmF0Y2ggdmFsaWRhdGlvbiIgaHJlZj0idG9waWNzL2N2YWxpZGF0ZS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNS5odG1sIj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMS5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJHZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMDUuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNi5odG1sIi8+Ci08dG9waWMgbGFiZWw9Ik1ha2luZyBjb250ZW50IGFzc2lzdCB3b3JrIGZvciBKU1AgZmlsZXMiIGhyZWY9InRvcGljcy90c3JjZWR0MDIzLmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkFzc29jaWF0aW5nIGVkaXRvcnMgd2l0aCBmaWxlIHR5cGVzIiBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRmlsZSBFbmNvZGluZyIgaHJlZj0idG9waWNzL2NlbmNvZGluZy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNlYXJjaGluZyBvciBmaW5kaW5nIHRleHQgd2l0aGluIGEgZmlsZSIgaHJlZj0idG9waWNzL3RzcmNlZHQwMDcuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDaGVja2luZyBzcGVsbGluZyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMTAuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXMgLSBvdmVydmlldyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMjcuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90c3JjZWR0MDI0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlcyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMjkuaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXciIGhyZWY9InRvcGljcy90c3JjZWR0MDI2Lmh0bWwiPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgc25pcHBldCBpdGVtcyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMjIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNi5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJTb3VyY2UgZWRpdG9yIGtleWJvYXJkIHNob3J0Y3V0cyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbHRvb2xza2V5Lmh0bWwiLz4KLTwvdG9waWM+Ci08L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NlbmNvZGluZy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jZW5jb2RpbmcuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhNzMyMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NlbmNvZGluZy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiLi5cZHRkXGNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY2VuY29kaW5nIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5GaWxlIEVuY29kaW5nPC90aXRsZT4NCi08c2hvcnRkZXNjPjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmNoYXJhY3RlciBlbmNvZGluZzxpbmRleHRlcm0+bG9jYXRpb24gaW4gZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkpTUCBmaWxlczxpbmRleHRlcm0+Y2hhcmFjdGVyIGVuY29kaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YSFRNTDxpbmRleHRlcm0+Y2hhcmFjdGVyIGVuY29kaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUw8aW5kZXh0ZXJtPmNoYXJhY3RlciBlbmNvZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD4gVGhlIGNoYXJhY3RlciBlbmNvZGluZyBpbiBYTUwsIChYKUhUTUwgZmlsZXMsIGFuZCBKU1AgZmlsZXMgY2FuIGJlIHNwZWNpZmllZA0KLWFuZCBpbnZva2VkIGluIG1hbnkgZGlmZmVyZW50IHdheXM7IGhvd2V2ZXIsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBzcGVjaWZ5DQotdGhlIGVuY29kaW5nIGluIGVhY2ggb25lIG9mIHlvdXIgc291cmNlIGZpbGVzLCBmb3IgdGhhdCBpcyB3aGVyZSBtYW55IFhNTCwNCi1IVE1MLCBKU1AgZWRpdG9ycyBleHBlY3QgdG8gZmluZCB0aGUgZW5jb2RpbmcuPC9wPg0KLTxwPkZvciBleGFtcGxlLCBmb3IgSlNQIGZpbGVzLCB5b3UgbWlnaHQgdXNlIHRoZSBwYWdlRW5jb2RpbmcgYXR0cmlidXRlIGFuZC9vcg0KLXRoZSBjb250ZW50VHlwZSBhdHRyaWJ1dGUgaW4gdGhlIHBhZ2UgZGlyZWN0aXZlLCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nDQotZXhhbXBsZTo8Y29kZWJsb2NrPiZsdDslQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiDQotICAgIHBhZ2VFbmNvZGluZz0iSVNPLTg4NTktMSIlJmd0Ow0KLTwvY29kZWJsb2NrPjwvcD4NCi08cD5Gb3IgWE1MIGZpbGVzLCB5b3UgbWlnaHQgdXNlIHRoZSBlbmNvZGluZyBwc2V1ZG8tYXR0cmlidXRlIGluIHRoZSB4bWwgZGVjbGFyYXRpb24NCi1hdCB0aGUgc3RhcnQgb2YgYSBkb2N1bWVudCBvciB0aGUgdGV4dCBkZWNsYXJhdGlvbiBhdCB0aGUgc3RhcnQgb2YgYW4gZW50aXR5LA0KLWFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTogPGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIiA/PjwvY29kZWJsb2NrPjwvcD4NCi08cD5Gb3IgKFgpSFRNTCBmaWxlcywgeW91IG1pZ2h0IHVzZSB0aGUgJmx0O21ldGEmZ3Q7IHRhZyBpbnNpZGUgdGhlICZsdDtoZWFkJmd0Ow0KLXRhZ3MsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8Y29kZWJsb2NrPiZsdDttZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+PC9jb2RlYmxvY2s+PC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jZW5jb2RpbmcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY2VuY29kaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNjNmNGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jZW5jb2RpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkZpbGUgRW5jb2RpbmciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNoYXJhY3RlciBlbmNvZGluZywgbG9jYXRpb24gaW4gZmlsZXMsIEpTUCBmaWxlcywgWEhUTUwsIFhNTCIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNoYXJhY3RlciBlbmNvZGluZywgbG9jYXRpb24gaW4gZmlsZXMsIEpTUCBmaWxlcywgWEhUTUwsIFhNTCIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY2VuY29kaW5nIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RmlsZSBFbmNvZGluZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2VuY29kaW5nIj48YSBuYW1lPSJjZW5jb2RpbmciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkZpbGUgRW5jb2Rpbmc8L2gxPgotCi0KLQotPGRpdj48cCAvPgotCi08cD4gVGhlIGNoYXJhY3RlciBlbmNvZGluZyBpbiBYTUwsIChYKUhUTUwgZmlsZXMsIGFuZCBKU1AgZmlsZXMgY2FuIGJlIHNwZWNpZmllZAotYW5kIGludm9rZWQgaW4gbWFueSBkaWZmZXJlbnQgd2F5czsgaG93ZXZlciwgd2UgcmVjb21tZW5kIHRoYXQgeW91IHNwZWNpZnkKLXRoZSBlbmNvZGluZyBpbiBlYWNoIG9uZSBvZiB5b3VyIHNvdXJjZSBmaWxlcywgZm9yIHRoYXQgaXMgd2hlcmUgbWFueSBYTUwsCi1IVE1MLCBKU1AgZWRpdG9ycyBleHBlY3QgdG8gZmluZCB0aGUgZW5jb2RpbmcuPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5Gb3IgZXhhbXBsZSwgZm9yIEpTUCBmaWxlcywgeW91IG1pZ2h0IHVzZSB0aGUgcGFnZUVuY29kaW5nIGF0dHJpYnV0ZSBhbmQvb3IKLXRoZSBjb250ZW50VHlwZSBhdHRyaWJ1dGUgaW4gdGhlIHBhZ2UgZGlyZWN0aXZlLCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nCi1leGFtcGxlOjxwcmU+Jmx0OyVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIKLSAgICBwYWdlRW5jb2Rpbmc9IklTTy04ODU5LTEiJSZndDsKLTwvcHJlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InAiPkZvciBYTUwgZmlsZXMsIHlvdSBtaWdodCB1c2UgdGhlIGVuY29kaW5nIHBzZXVkby1hdHRyaWJ1dGUgaW4gdGhlIHhtbCBkZWNsYXJhdGlvbgotYXQgdGhlIHN0YXJ0IG9mIGEgZG9jdW1lbnQgb3IgdGhlIHRleHQgZGVjbGFyYXRpb24gYXQgdGhlIHN0YXJ0IG9mIGFuIGVudGl0eSwKLWFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTogPHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIiA/Jmd0OzwvcHJlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InAiPkZvciAoWClIVE1MIGZpbGVzLCB5b3UgbWlnaHQgdXNlIHRoZSAmbHQ7bWV0YSZndDsgdGFnIGluc2lkZSB0aGUgJmx0O2hlYWQmZ3Q7Ci10YWdzLCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PHByZT4mbHQ7bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvJmd0OzwvcHJlPgotPC9kaXY+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjg1Yzk1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiLi5cZHRkXGNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3NyY2VkdDAwMSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U25pcHBldHMgdmlldzwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZw0KLW9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoDQotZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5TbmlwcGV0cyB2aWV3PGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD4gVGhlIFNuaXBwZXRzIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdQ0KLWRlZmluZSBhbmQgaW5jbHVkZS4gVG8gdmlldyBvciBjb2xsYXBzZSB0aGUgb2JqZWN0cyBpbiBhIHNwZWNpZmljIGRyYXdlciwNCi1jbGljayB0aGUgZHJhd2VyIG5hbWUuPC9wPg0KLTxwPlRoZSBTbmlwcGV0cyB2aWV3IGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOiA8dWw+DQotPGxpPkRyYWctYW5kLWRyb3AgdG8gdmFyaW91cyBzb3VyY2UgZWRpdGluZyBwYWdlczogWW91IGNhbiBkcmFnIGl0ZW1zIGZyb20NCi10aGUgdmlldyBpbnRvIHRoZSBhY3RpdmUgZWRpdG9yIGFuZCB0aGUgdGV4dCB3aWxsIGJlIGRyb3BwZWQgaW50byB0aGUgZG9jdW1lbnQNCi1hdCB0aGUgY3Vyc29yIGxvY2F0aW9uIDwvbGk+DQotPGxpPkRvdWJsZS1jbGljayBzdXBwb3J0OiBZb3UgY2FuIGRvdWJsZS1jbGljayBvbiBhbiBpdGVtIGFuZCBoYXZlIGl0IGluc2VydGVkDQotYXQgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBhY3RpdmUgZWRpdG9yIDwvbGk+DQotPGxpPlVzZXItZGVmaW5lZCBkcmF3ZXJzIGFuZCBpdGVtczogWW91IGNhbiBkZWZpbmUsIGVkaXQsIGFuZCByZW1vdmUgaXRlbXMNCi1mcm9tIHZpZXcgZHJhd2VycyBhcyBkZXNpcmVkLjwvbGk+DQotPGxpPlBsdWctaW4tZGVmaW5lZCBkcmF3ZXJzIGFuZCBpdGVtczogUGx1Zy1pbiBkZXZlbG9wZXJzIGNhbiBjb250cmlidXRlIGENCi1kZWZhdWx0IGxpc3Qgb2YgaXRlbXMgdG8gdGhlaXIgb3duIGRyYXdlcnMuPC9saT4NCi08bGk+VmFyaWFibGVzIGluIGluc2VydGlvbnM6IEJ5IGRlZmF1bHQsIGl0ZW1zIHdpbGwgYmUgZWRpdGVkIHVzaW5nIGEgZGlhbG9nDQotYW5kLCB3aGVuIGluc2VydGVkLCB5b3Ugd2lsbCBiZSBwcm9tcHRlZCBmb3IgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSB2YXJpYWJsZXMuPC9saT4NCi08bGk+Q3VzdG9taXphdGlvbjogWW91IGNhbiBzZWxlY3Qgd2hpY2ggZHJhd2VycyBhbmQgaXRlbXMgYXJlIHNob3duIGluIHRoZQ0KLVNuaXBwZXRzIHZpZXcuPC9saT4NCi08bGk+Q3VzdG9tIGluc2VydGlvbjogUGx1Zy1pbiBkZXZlbG9wZXJzIGNhbiBjdXN0b21pemUgdGhlIGJlaGF2aW9yIG9mIGl0ZW1zDQotc28gdGhhdCB3aGVuIHRoZXkgYXJlIGRyb3BwZWQgZHVyaW5nIGEgZHJhZy1hbmQtZHJvcCBhY3Rpb24sIGJvdGggdGhlIHRleHQNCi10aGF0IGlzIGluc2VydGVkIGFuZCB0aGUgaW5zZXJ0aW9uIGxvY2F0aW9uIGFyZSBzdHJpY3RseSBkZWZpbmVkLjwvbGk+DQotPC91bD48L3A+DQotPC9jb25ib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE0LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTUuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyMi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNi5kaXRhIj48bGlua3RleHQ+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3INCi1kcmF3ZXJzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTNmOWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTbmlwcGV0cyB2aWV3IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlNuaXBwZXRzIHZpZXcsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iU25pcHBldHMgdmlldywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE1Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3NyY2VkdDAwMSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNuaXBwZXRzIHZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNzcmNlZHQwMDEiPjxhIG5hbWU9ImNzcmNlZHQwMDEiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNuaXBwZXRzIHZpZXc8L2gxPgotCi0KLQotPGRpdj48cD5UaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZwotb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHTihKIsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aAotZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy48L3A+Ci0KLTxwPiBUaGUgU25pcHBldHMgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzIHRoYXQgeW91Ci1kZWZpbmUgYW5kIGluY2x1ZGUuIFRvIHZpZXcgb3IgY29sbGFwc2UgdGhlIG9iamVjdHMgaW4gYSBzcGVjaWZpYyBkcmF3ZXIsCi1jbGljayB0aGUgZHJhd2VyIG5hbWUuPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5UaGUgU25pcHBldHMgdmlldyBoYXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczogPHVsPgotPGxpPkRyYWctYW5kLWRyb3AgdG8gdmFyaW91cyBzb3VyY2UgZWRpdGluZyBwYWdlczogWW91IGNhbiBkcmFnIGl0ZW1zIGZyb20KLXRoZSB2aWV3IGludG8gdGhlIGFjdGl2ZSBlZGl0b3IgYW5kIHRoZSB0ZXh0IHdpbGwgYmUgZHJvcHBlZCBpbnRvIHRoZSBkb2N1bWVudAotYXQgdGhlIGN1cnNvciBsb2NhdGlvbiA8L2xpPgotCi08bGk+RG91YmxlLWNsaWNrIHN1cHBvcnQ6IFlvdSBjYW4gZG91YmxlLWNsaWNrIG9uIGFuIGl0ZW0gYW5kIGhhdmUgaXQgaW5zZXJ0ZWQKLWF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgYWN0aXZlIGVkaXRvciA8L2xpPgotCi08bGk+VXNlci1kZWZpbmVkIGRyYXdlcnMgYW5kIGl0ZW1zOiBZb3UgY2FuIGRlZmluZSwgZWRpdCwgYW5kIHJlbW92ZSBpdGVtcwotZnJvbSB2aWV3IGRyYXdlcnMgYXMgZGVzaXJlZC48L2xpPgotCi08bGk+UGx1Zy1pbi1kZWZpbmVkIGRyYXdlcnMgYW5kIGl0ZW1zOiBQbHVnLWluIGRldmVsb3BlcnMgY2FuIGNvbnRyaWJ1dGUgYQotZGVmYXVsdCBsaXN0IG9mIGl0ZW1zIHRvIHRoZWlyIG93biBkcmF3ZXJzLjwvbGk+Ci0KLTxsaT5WYXJpYWJsZXMgaW4gaW5zZXJ0aW9uczogQnkgZGVmYXVsdCwgaXRlbXMgd2lsbCBiZSBlZGl0ZWQgdXNpbmcgYSBkaWFsb2cKLWFuZCwgd2hlbiBpbnNlcnRlZCwgeW91IHdpbGwgYmUgcHJvbXB0ZWQgZm9yIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgdmFyaWFibGVzLjwvbGk+Ci0KLTxsaT5DdXN0b21pemF0aW9uOiBZb3UgY2FuIHNlbGVjdCB3aGljaCBkcmF3ZXJzIGFuZCBpdGVtcyBhcmUgc2hvd24gaW4gdGhlCi1TbmlwcGV0cyB2aWV3LjwvbGk+Ci0KLTxsaT5DdXN0b20gaW5zZXJ0aW9uOiBQbHVnLWluIGRldmVsb3BlcnMgY2FuIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2YgaXRlbXMKLXNvIHRoYXQgd2hlbiB0aGV5IGFyZSBkcm9wcGVkIGR1cmluZyBhIGRyYWctYW5kLWRyb3AgYWN0aW9uLCBib3RoIHRoZSB0ZXh0Ci10aGF0IGlzIGluc2VydGVkIGFuZCB0aGUgaW5zZXJ0aW9uIGxvY2F0aW9uIGFyZSBzdHJpY3RseSBkZWZpbmVkLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjYuaHRtbCIgdGl0bGU9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4gVGhlIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuIj5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNC5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiIHRpdGxlPSIiPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDIyLmh0bWwiIHRpdGxlPSIiPkVkaXRpbmcgc25pcHBldCBpdGVtczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNi5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQgaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIj5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcgotZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjgwOTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDksIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiLi5cZHRkXGNvbmNlcHQuZHRkIj4NCi08P1B1YiBTdHkgX2Rpc3BsYXkgRm9udENvbG9yPSJyZWQiPz4NCi08Y29uY2VwdCBpZD0iY3NyY2VkdDAwNCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPjxxPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3I8L3E+IGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycw0KLXRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LA0KLW9yIFhNTC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGtleXdvcmQ+c291cmNlIGVkaXRvcnM8L2tleXdvcmQ+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPjxpbmRleHRlcm0+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+IDxpbmRleHRlcm0+dGVtcGxhdGVzPGluZGV4dGVybT5zdHJ1Y3R1cmVkDQotdGV4dCBlZGl0b3JzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+ICBUaGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcw0KLXJlcHJlc2VudGVkIGJ5IHZhcmlvdXMgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgZmlsZXMgY29kZWQNCi13aXRoIG1hcmt1cCB0YWdzOjwvcD4NCi08dGFibGU+DQotPHRncm91cCBjb2xzPSIzIj48Y29sc3BlYyBjb2xuYW1lPSJjb2wxIiBjb2x3aWR0aD0iODkqIi8+PGNvbHNwZWMNCi1jb2xuYW1lPSJjb2wyIiBjb2x3aWR0aD0iMTM0KiIvPjxjb2xzcGVjIGNvbG5hbWU9IkNPTFNQRUMwIg0KLWNvbHdpZHRoPSI2OSoiLz4NCi08dGhlYWQ+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSIgdmFsaWduPSJ0b3AiPkZpbGUgdHlwZTwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiIHZhbGlnbj0idG9wIj5FZGl0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCIgdmFsaWduPSJ0b3AiPkNvbnRlbnQgYXNzaXN0PzwvZW50cnk+DQotPC9yb3c+DQotPC90aGVhZD4NCi08dGJvZHk+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+Q2FzY2FkaW5nIHN0eWxlIHNoZWV0PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+Q1NTIHNvdXJjZSBwYWdlIGVkaXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj5ZZXM8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnM8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5EVEQgc291cmNlIHBhZ2UgZWRpdG9yPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPk5vPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5IVE1MPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+SFRNTCBzb3VyY2UgcGFnZSBlZGl0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+WWVzPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj48dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPjx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+IHNvdXJjZQ0KLXBhZ2UgZWRpdG9yIG9yIHNvdXJjZSB0YWIgb2YgSmF2YVNjcmlwdCBlZGl0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+WWVzPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5KU1A8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5KU1Agc291cmNlIHBhZ2UgZWRpdG9yPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPlllczwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+WE1MPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+U291cmNlIHRhYiBvZiBYTUwgZWRpdG9yPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPlllczwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+WFNEIChzY2hlbWEpPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+U291cmNlIHRhYiBvZiBYTUwgc2NoZW1hIGVkaXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj5ZZXM8L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGJvZHk+DQotPC90Z3JvdXA+DQotPC90YWJsZT4NCi08cD5Zb3UgY2FuIGFjY2VzcyB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBieSByaWdodC1jbGlja2luZyBvbg0KLWEgcmVsZXZhbnQgZmlsZSBuYW1lIGluIE5hdmlnYXRvciBvciBQYWNrYWdlIEV4cGxvcmVyIHZpZXcgYW5kIHRoZW4NCi1jbGlja2luZyA8dWljb250cm9sPk9wZW4gV2l0aDwvdWljb250cm9sPiBhbmQgc2VsZWN0aW5nIHRoZSBlZGl0b3INCi1tZW50aW9uZWQgYWJvdmUuPC9wPg0KLTxwPlRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIHByb3ZpZGVzIGEgY29uc2lzdGVudCBpbnRlcmZhY2UgcmVnYXJkbGVzcw0KLW9mIHRoZSBtYXJrdXAgbGFuZ3VhZ2Ugd2l0aCB3aGljaCBpdCBpcyBhc3NvY2lhdGVkLiBJdCBwcm92aWRlcyBjYXBhYmlsaXRpZXMNCi1zdWNoIGFzIGZpbmQgYW5kIHJlcGxhY2UsIHVuZG8sIHJlZG8sIGEgc3BlbGxpbmcgY2hlY2tlciwgYW5kIGNvZGluZw0KLWFzc2lzdGFuY2UgKHVubGVzcyBvdGhlcndpc2Ugbm90ZWQpLiBJdCBhbHNvIGhpZ2hsaWdodHMgc3ludGF4IGluDQotZGlmZmVyZW50IGNvbG9ycy4gRm9sbG93aW5nIGlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2Ygc29tZSBvZiB0aGUNCi1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yJ3MgY2FwYWJpbGl0aWVzOjwvcD4NCi08ZGw+PGRsZW50cnk+DQotPGR0PnN5bnRheCBoaWdobGlnaHRpbmc8L2R0Pg0KLTxkZD5FYWNoIGtleXdvcmQgdHlwZSBhbmQgc3ludGF4IHR5cGUgaXMgaGlnaGxpZ2h0ZWQgZGlmZmVyZW50bHksDQotZW5hYmxpbmcgeW91IHRvIGVhc2lseSBmaW5kIGEgY2VydGFpbiBraW5kIG9mIGtleXdvcmQgZm9yIGVkaXRpbmcuDQotRm9yIGV4YW1wbGUsIGluIEhUTUwsIGVsZW1lbnQgbmFtZXMsIGF0dHJpYnV0ZSBuYW1lcywgYXR0cmlidXRlIHZhbHVlcywNCi1hbmQgY29tbWVudHMgaGF2ZSBkaWZmZXJlbnQgY29sb3JzOyBpbiA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiwNCi1mdW5jdGlvbiBhbmQgdmFyaWFibGUgbmFtZXMsIHF1b3RlZCB0ZXh0IHN0cmluZ3MsIGFuZCBjb21tZW50cyBoYXZlDQotZGlmZmVyZW50IGNvbG9ycy48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+dW5saW1pdGVkIHVuZG8gYW5kIHJlZG88L2R0Pg0KLTxkZD5UaGVzZSBvcHRpb25zIGFsbG93IHlvdSB0byBpbmNyZW1lbnRhbGx5IHVuZG8gYW5kIHJlZG8gZXZlcnkgY2hhbmdlDQotbWFkZSB0byBhIGZpbGUgZm9yIHRoZSBlbnRpcmUgZWRpdGluZyBzZXNzaW9uLiBGb3IgdGV4dCwgY2hhbmdlcyBhcmUNCi1pbmNyZW1lbnRlZCBvbmUgY2hhcmFjdGVyIG9yIHNldCBvZiBzZWxlY3RlZCBjaGFyYWN0ZXJzIGF0IGEgdGltZS48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+Y29udGVudCBhc3Npc3Q8L2R0Pg0KLTxkZD5Db250ZW50IGFzc2lzdCBoZWxwcyB5b3UgdG8gaW5zZXJ0IDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+IGZ1bmN0aW9ucywNCi1IVE1MIHRhZ3MsIG9yIG90aGVyIGtleXdvcmRzLiBDaG9pY2VzIGF2YWlsYWJsZSBpbiB0aGUgY29udGVudCBhc3Npc3QNCi1saXN0IGFyZSBiYXNlZCBvbiBmdW5jdGlvbnMgZGVmaW5lZCBieSB0aGUgc3ludGF4IG9mIHRoZSBsYW5ndWFnZQ0KLWluIHdoaWNoIHRoZSBmaWxlIGlzIGNvZGVkLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD51c2VyLWRlZmluZWQgdGVtcGxhdGVzIGFuZCBzbmlwcGV0czwvZHQ+DQotPGRkPkJ5IHVzaW5nIHRoZSBTbmlwcGV0cyB2aWV3LCB5b3UgY2FuIGFjY2VzcyB1c2VyLWRlZmluZWQgY29kZSBzbmlwcGV0cw0KLWFuZCAoZm9yIGFsbCBjb2RlIHR5cGVzIGV4Y2VwdCA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPikNCi10ZW1wbGF0ZXMgdG8gaGVscCB5b3UgcXVpY2tseSBhZGQgcmVndWxhcmx5IHVzZWQgdGV4dCBzdHJpbmdzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5mdW5jdGlvbiBzZWxlY3Rpb248L2R0Pg0KLTxkZD5CYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgeW91ciBjdXJzb3IsIHRoZSBmdW5jdGlvbiBvciB0YWcgc2VsZWN0aW9uDQotaW5kaWNhdG9yIGhpZ2hsaWdodHMgdGhlIGxpbmUgbnVtYmVycyB0aGF0IGluY2x1ZGUgYSBmdW5jdGlvbiBvciB0YWcNCi1pbiB0aGUgdmVydGljYWwgcnVsZXIgb24gdGhlIGxlZnQgYXJlYSBvZiB0aGUgU291cmNlIHBhZ2UuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PnBvcC11cCBtZW51IG9wdGlvbnM8L2R0Pg0KLTxkZD5UaGVzZSBhcmUgdGhlIHNhbWUgZWRpdGluZyBvcHRpb25zIGF2YWlsYWJsZSBpbiB0aGUgd29ya2JlbmNoIDx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPiBtZW51LjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5jb2RlIGZvbGRpbmc8L2R0Pg0KLTxkZD5Db2RlIGZvbGRpbmcgYWxsb3dzIGNvbGxhcHNpbmcgYW5kIGV4cGFuZGluZyBvZiB0ZXh0IGFuZCBjYW4gYmUNCi1hY2Nlc3NlZCBieSB0aGUgPHVpY29udHJvbD5Gb2xkaW5nPC91aWNvbnRyb2w+IG9wdGlvbiBpbiB0aGUgcG9wLXVwDQotbWVudS48L2RkPg0KLTwvZGxlbnRyeT48L2RsPjw/UHViIENhcmV0IDE0NzE/Pg0KLTwvY29uYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNi5kaXRhIj48bGlua3RleHQ+Q29udGVudCBhc3Npc3Q8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDU1NDM/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYzA4NjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iIC8+Ci08bWV0YSBjb250ZW50PSJzb3VyY2UgZWRpdG9ycyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InNvdXJjZSBlZGl0b3JzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3NyY2VkdDAwNCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjc3JjZWR0MDA0Ij48YSBuYW1lPSJjc3JjZWR0MDA0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+PHNwYW4gY2xhc3M9InEiPiJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIjwvc3Bhbj4gaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQKLXlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IKLVhNTC48L3A+Ci0KLTxwPgotCi0KLVRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIHJlcHJlc2VudGVkIGJ5IHZhcmlvdXMgZWRpdG9ycyB0aGF0IHlvdSBjYW4KLXVzZSB0byBlZGl0IGZpbGVzIGNvZGVkIHdpdGggbWFya3VwIHRhZ3M6PC9wPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLTx0aGVhZCBhbGlnbj0ibGVmdCI+Ci08dHI+Ci08dGggdmFsaWduPSJ0b3AiIHdpZHRoPSIzMC40Nzk0NTIwNTQ3OTQ1MiUiIGlkPSJOMTAwODYiPkZpbGUgdHlwZTwvdGg+Ci0KLTx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjQ1Ljg5MDQxMDk1ODkwNDExJSIgaWQ9Ik4xMDA4RSI+RWRpdG9yPC90aD4KLQotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iMjMuNjMwMTM2OTg2MzAxMzclIiBpZD0iTjEwMDk2Ij5Db250ZW50IGFzc2lzdD88L3RoPgotCi08L3RyPgotCi08L3RoZWFkPgotCi08dGJvZHk+Ci08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzMC40Nzk0NTIwNTQ3OTQ1MiUiIGhlYWRlcnM9Ik4xMDA4NiAiPkNhc2NhZGluZyBzdHlsZSBzaGVldDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ1Ljg5MDQxMDk1ODkwNDExJSIgaGVhZGVycz0iTjEwMDhFICI+Q1NTIHNvdXJjZSBwYWdlIGVkaXRvcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIzLjYzMDEzNjk4NjMwMTM3JSIgaGVhZGVycz0iTjEwMDk2ICI+WWVzPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMzAuNDc5NDUyMDU0Nzk0NTIlIiBoZWFkZXJzPSJOMTAwODYgIj5Eb2N1bWVudCB0eXBlIGRlZmluaXRpb25zPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBoZWFkZXJzPSJOMTAwOEUgIj5EVEQgc291cmNlIHBhZ2UgZWRpdG9yPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjMuNjMwMTM2OTg2MzAxMzclIiBoZWFkZXJzPSJOMTAwOTYgIj5ObzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjMwLjQ3OTQ1MjA1NDc5NDUyJSIgaGVhZGVycz0iTjEwMDg2ICI+SFRNTDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ1Ljg5MDQxMDk1ODkwNDExJSIgaGVhZGVycz0iTjEwMDhFICI+SFRNTCBzb3VyY2UgcGFnZSBlZGl0b3I8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy42MzAxMzY5ODYzMDEzNyUiIGhlYWRlcnM9Ik4xMDA5NiAiPlllczwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjMwLjQ3OTQ1MjA1NDc5NDUyJSIgaGVhZGVycz0iTjEwMDg2ICI+SmF2YVNjcmlwdOKEojwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ1Ljg5MDQxMDk1ODkwNDExJSIgaGVhZGVycz0iTjEwMDhFICI+SmF2YVNjcmlwdCBzb3VyY2UgcGFnZSBlZGl0b3Igb3Igc291cmNlCi10YWIgb2YgSmF2YVNjcmlwdCBlZGl0b3I8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy42MzAxMzY5ODYzMDEzNyUiIGhlYWRlcnM9Ik4xMDA5NiAiPlllczwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjMwLjQ3OTQ1MjA1NDc5NDUyJSIgaGVhZGVycz0iTjEwMDg2ICI+SlNQPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBoZWFkZXJzPSJOMTAwOEUgIj5KU1Agc291cmNlIHBhZ2UgZWRpdG9yPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjMuNjMwMTM2OTg2MzAxMzclIiBoZWFkZXJzPSJOMTAwOTYgIj5ZZXM8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzMC40Nzk0NTIwNTQ3OTQ1MiUiIGhlYWRlcnM9Ik4xMDA4NiAiPlhNTDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ1Ljg5MDQxMDk1ODkwNDExJSIgaGVhZGVycz0iTjEwMDhFICI+U291cmNlIHRhYiBvZiBYTUwgZWRpdG9yPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjMuNjMwMTM2OTg2MzAxMzclIiBoZWFkZXJzPSJOMTAwOTYgIj5ZZXM8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzMC40Nzk0NTIwNTQ3OTQ1MiUiIGhlYWRlcnM9Ik4xMDA4NiAiPlhTRCAoc2NoZW1hKTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ1Ljg5MDQxMDk1ODkwNDExJSIgaGVhZGVycz0iTjEwMDhFICI+U291cmNlIHRhYiBvZiBYTUwgc2NoZW1hIGVkaXRvcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIzLjYzMDEzNjk4NjMwMTM3JSIgaGVhZGVycz0iTjEwMDk2ICI+WWVzPC90ZD4KLQotPC90cj4KLQotPC90Ym9keT4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08cD5Zb3UgY2FuIGFjY2VzcyB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBieSByaWdodC1jbGlja2luZyBvbiBhIHJlbGV2YW50Ci1maWxlIG5hbWUgaW4gTmF2aWdhdG9yIG9yIFBhY2thZ2UgRXhwbG9yZXIgdmlldyBhbmQgdGhlbiBjbGlja2luZyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PcGVuCi1XaXRoPC9zcGFuPiBhbmQgc2VsZWN0aW5nIHRoZSBlZGl0b3IgbWVudGlvbmVkIGFib3ZlLjwvcD4KLQotPHA+VGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGludGVyZmFjZSByZWdhcmRsZXNzIG9mCi10aGUgbWFya3VwIGxhbmd1YWdlIHdpdGggd2hpY2ggaXQgaXMgYXNzb2NpYXRlZC4gSXQgcHJvdmlkZXMgY2FwYWJpbGl0aWVzCi1zdWNoIGFzIGZpbmQgYW5kIHJlcGxhY2UsIHVuZG8sIHJlZG8sIGEgc3BlbGxpbmcgY2hlY2tlciwgYW5kIGNvZGluZyBhc3Npc3RhbmNlCi0odW5sZXNzIG90aGVyd2lzZSBub3RlZCkuIEl0IGFsc28gaGlnaGxpZ2h0cyBzeW50YXggaW4gZGlmZmVyZW50IGNvbG9ycy4gRm9sbG93aW5nCi1pcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHNvbWUgb2YgdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IncyBjYXBhYmlsaXRpZXM6PC9wPgotCi08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+c3ludGF4IGhpZ2hsaWdodGluZzwvZHQ+Ci0KLTxkZD5FYWNoIGtleXdvcmQgdHlwZSBhbmQgc3ludGF4IHR5cGUgaXMgaGlnaGxpZ2h0ZWQgZGlmZmVyZW50bHksIGVuYWJsaW5nCi15b3UgdG8gZWFzaWx5IGZpbmQgYSBjZXJ0YWluIGtpbmQgb2Yga2V5d29yZCBmb3IgZWRpdGluZy4gRm9yIGV4YW1wbGUsIGluCi1IVE1MLCBlbGVtZW50IG5hbWVzLCBhdHRyaWJ1dGUgbmFtZXMsIGF0dHJpYnV0ZSB2YWx1ZXMsIGFuZCBjb21tZW50cyBoYXZlCi1kaWZmZXJlbnQgY29sb3JzOyBpbiBKYXZhU2NyaXB0LCBmdW5jdGlvbiBhbmQgdmFyaWFibGUKLW5hbWVzLCBxdW90ZWQgdGV4dCBzdHJpbmdzLCBhbmQgY29tbWVudHMgaGF2ZSBkaWZmZXJlbnQgY29sb3JzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPnVubGltaXRlZCB1bmRvIGFuZCByZWRvPC9kdD4KLQotPGRkPlRoZXNlIG9wdGlvbnMgYWxsb3cgeW91IHRvIGluY3JlbWVudGFsbHkgdW5kbyBhbmQgcmVkbyBldmVyeSBjaGFuZ2UgbWFkZQotdG8gYSBmaWxlIGZvciB0aGUgZW50aXJlIGVkaXRpbmcgc2Vzc2lvbi4gRm9yIHRleHQsIGNoYW5nZXMgYXJlIGluY3JlbWVudGVkCi1vbmUgY2hhcmFjdGVyIG9yIHNldCBvZiBzZWxlY3RlZCBjaGFyYWN0ZXJzIGF0IGEgdGltZS48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5jb250ZW50IGFzc2lzdDwvZHQ+Ci0KLTxkZD5Db250ZW50IGFzc2lzdCBoZWxwcyB5b3UgdG8gaW5zZXJ0IEphdmFTY3JpcHQgZnVuY3Rpb25zLCBIVE1MIHRhZ3MsIG9yCi1vdGhlciBrZXl3b3Jkcy4gQ2hvaWNlcyBhdmFpbGFibGUgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgYXJlIGJhc2VkIG9uCi1mdW5jdGlvbnMgZGVmaW5lZCBieSB0aGUgc3ludGF4IG9mIHRoZSBsYW5ndWFnZSBpbiB3aGljaCB0aGUgZmlsZSBpcyBjb2RlZC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj51c2VyLWRlZmluZWQgdGVtcGxhdGVzIGFuZCBzbmlwcGV0czwvZHQ+Ci0KLTxkZD5CeSB1c2luZyB0aGUgU25pcHBldHMgdmlldywgeW91IGNhbiBhY2Nlc3MgdXNlci1kZWZpbmVkIGNvZGUgc25pcHBldHMKLWFuZCAoZm9yIGFsbCBjb2RlIHR5cGVzIGV4Y2VwdCBKYXZhU2NyaXB0KSB0ZW1wbGF0ZXMgdG8gaGVscCB5b3UKLXF1aWNrbHkgYWRkIHJlZ3VsYXJseSB1c2VkIHRleHQgc3RyaW5ncy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5mdW5jdGlvbiBzZWxlY3Rpb248L2R0PgotCi08ZGQ+QmFzZWQgb24gdGhlIGxvY2F0aW9uIG9mIHlvdXIgY3Vyc29yLCB0aGUgZnVuY3Rpb24gb3IgdGFnIHNlbGVjdGlvbiBpbmRpY2F0b3IKLWhpZ2hsaWdodHMgdGhlIGxpbmUgbnVtYmVycyB0aGF0IGluY2x1ZGUgYSBmdW5jdGlvbiBvciB0YWcgaW4gdGhlIHZlcnRpY2FsCi1ydWxlciBvbiB0aGUgbGVmdCBhcmVhIG9mIHRoZSBTb3VyY2UgcGFnZS48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5wb3AtdXAgbWVudSBvcHRpb25zPC9kdD4KLQotPGRkPlRoZXNlIGFyZSB0aGUgc2FtZSBlZGl0aW5nIG9wdGlvbnMgYXZhaWxhYmxlIGluIHRoZSB3b3JrYmVuY2ggPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4gbWVudS48L2RkPgotCi08L2RsPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDYuaHRtbCIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucyBmb3IgY29tcGxldGlvbi4iPkNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDYuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGJmZTlkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gIi4uXGR0ZFxjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNzcmNlZHQwMDYiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNvbnRlbnQgYXNzaXN0PC90aXRsZT4NCi08c2hvcnRkZXNjPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yDQotZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yDQotaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMNCi1mb3IgY29tcGxldGlvbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9ImNzcmNlZHQwMDZ8MXxjb250ZW50YXNzaXN0YW5jZW92ZXJ2aWV3IiBzdGF0dXM9Im5ldyI+Y29udGVudA0KLWFzc2lzdGFuY2U8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybSBrZXlyZWY9ImNzcmNlZHQwMDZ8MnxzdHJ1Y3R1cmVkdGV4dGVkaXRvcnNjb250ZW50YXNzaXN0YW5jZSINCi1zdGF0dXM9ImNoYW5nZWQiPnN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPGluZGV4dGVybT5jb250ZW50IGFzc2lzdGFuY2U8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPk1vc3Qgb2YgdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGhhdmUgY29udGVudCBhc3Npc3QuIEZvciBhIGxpc3Qgb2YNCi1lZGl0b3JzIHRoYXQgaGF2ZSBjb250ZW50IGFzc2lzdCwgc2VlIDx4cmVmIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSIgdHlwZT0iY29uY2VwdCI+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+PHRpdGxlPkpTUCBjb250ZW50IGFzc2lzdDwvdGl0bGU+PHA+WW91IGhhdmUgbWFueSBvcHRpb25zIGZvciBlbWJlZGRpbmcgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYW5kDQotSFRNTCBjb2RlIGluIHlvdXIgSlNQIHBhZ2VzIGJ5IHVzaW5nIGNvbnRlbnQgYXNzaXN0LjwvcD48cD5BbGwgb2YgdGhlIEpTUA0KLXRhZ3MgYXJlIGluY2x1ZGVkIGJvdGggaW4gdGhlIHRlbXBsYXRlIGxpc3QgYW5kIGluIFhNTCBmb3JtYXQgKGZvciBleGFtcGxlLCA8Y29kZXBoPiZsdDtqc3A6ZXhwcmVzc2lvbj48L2NvZGVwaD4pLg0KLVRvIGFkZCBKU1Agc2NyaXB0bGV0IHRhZ3MsIGZvciBleGFtcGxlLCBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGFwcHJvcHJpYXRlDQotcG9zaXRpb24gaW4gdGhlIGZpbGUgYW5kIHByZXNzIEN0cmwrU3BhY2UgdG8gdXNlIGNvbnRlbnQgYXNzaXN0LiBTZWxlY3QgPGltYWdlDQotYWx0PSJKU1Agc2NyaXB0bGV0IGNvbnRlbnQgYXNzaXN0IiBocmVmPSIuLi9pbWFnZXMvbm1hY3NjcnAuZ2lmIiBwbGFjZW1lbnQ9ImlubGluZSI+DQotPC9pbWFnZT4gZnJvbSB0aGUgcHJvcG9zYWwgbGlzdCB0byBpbnNlcnQgPGNvZGVwaD4mbHQ7JSAlPjwvY29kZXBoPiAgaW4gdGhlDQotZG9jdW1lbnQuPC9wPjxwPlNjcmlwdGxldHMgYXJlIGluc2VydGVkIGluIGEgdGFnIDxjb2RlcGg+Jmx0OyUgJT48L2NvZGVwaD4uDQotRm9yIGV4YW1wbGU6IDxjb2RlYmxvY2s+Jmx0OyUgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgJT48L2NvZGVibG9jaz48L3A+PHA+VGhpcw0KLWV4YW1wbGUgd2lsbCBldmFsdWF0ZSB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc3RhdGVtZW50IHRvIGdldCB0aGUgY3VycmVudCB0aW1lIGluDQotbWlsbGlzZWNvbmRzLjwvcD48cD5UbyBoYXZlIHRoZSByZXN1bHQgb2YgdGhlIHN0YXRlbWVudCBpbnNlcnRlZCBpbiB0aGUgZmlsZSwNCi1wdXQgYW4gZXF1YWxzIHNpZ24gKD0pIGluIHRoZSBmcm9udCBvZiB0aGUgc3RhdGVtZW50LiBGb3IgZXhhbXBsZTogPGNvZGVibG9jaz4mbHQ7Yj5UaGlzIGlzIHRoZSB0aW1lIDogJmx0OyU9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpJT4mbHQ7L2I+PC9jb2RlYmxvY2sNCi0+PC9wPjxwPldoZW4geW91IGFyZSB3aXRoaW4gYSBzY3JpcHRsZXQgeW91IGFyZSB3cml0aW5nIHB1cmUgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY29kZS4NCi1UaGVyZWZvcmUsIGNvbnRlbnQgYXNzaXN0IHdvcmtzIGV4YWN0bHkgdGhlIHNhbWUgYXMgaXQgZG9lcyBmb3IgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGVkaXRvci4NCi1Gb3IgZXhhbXBsZSwgaWYgeW91IHJlcXVlc3QgY29udGVudCBhc3Npc3QgYWZ0ZXIgPGNvZGVwaD5TeXN0ZW08L2NvZGVwaD4sDQotY29udGVudCBhc3Npc3QgZGlzcGxheXMgYSBsaXN0IG9mIG1ldGhvZHMuIDxub3RlPjx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNvbnRlbnQgYXNzaXN0IHdvcmtzIG9ubHkgaW4gYSBXZWINCi1wcm9qZWN0LCBiZWNhdXNlIGl0IHJlcXVpcmVzIGEgYnVpbGRwYXRoIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNsYXNzZXMuPC9ub3RlPjwvcD48cD5UaGVyZQ0KLWFyZSBhbHNvIHNwZWNpYWwgdGFncyBzdWNoIGFzIHVzZUJlYW4uIEZvciBleGFtcGxlOiA8Y29kZWJsb2NrPiZsdDtqc3A6dXNlQmVhbiBpZD0idXNlQmVhbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciLz48L2NvZGVibG9jaz48L3A+PHA+VGhlDQotdXNlQmVhbiB0YWcgZW5hYmxlcyB5b3UgdG8gY3JlYXRlIGEgYmVhbiBjYWxsZWQgPGNvZGVwaD5hU3RyaW5nPC9jb2RlcGg+IG9mDQotdHlwZSA8Y29kZXBoPlN0cmluZzwvY29kZXBoPi4gVGhlbiB3aGVuIHlvdSB1c2UgY29udGVudCBhc3Npc3QsIHRoaXMgaXMgcmVjb2duaXplZA0KLWFzIGEgZGVjbGFyZWQgdmFyaWFibGUuIEZvciBleGFtcGxlLCBpZiB5b3UgdXNlIGNvbnRlbnQgYXNzaXN0IGFmdGVyIDxjb2RlcGg+YVN0cmluZzwvY29kZXBoPiwNCi1hcyBmb2xsb3dzOjwvcD48cD4gPGNvZGVibG9jaz4mbHQ7JSBhU3RyaW5nLiAlPiA8L2NvZGVibG9jaz50aGUgY29udGVudCBhc3Npc3QNCi1saXN0IHNob3dzIGF2YWlsYWJsZSBtZXRob2RzLiBUaGlzIGlzIGJlY2F1c2UgPGNvZGVwaD5hU3RyaW5nPC9jb2RlcGg+IGhhcw0KLWJlZW4gZGVjbGFyZWQgYXMgYSBiZWFuIG9mIHR5cGUgU3RyaW5nLjwvcD48cD5JZiB5b3UgdXNlIGNvbnRlbnQgYXNzaXN0IGFmdGVyDQotdGhlIDxjb2RlcGg+YTwvY29kZXBoPiwgYXMgZm9sbG93czogPGNvZGVibG9jaz4mbHQ7JSBhICU+IDwvY29kZWJsb2NrPmNvbnRlbnQNCi1hc3Npc3Qga25vd3MgdGhhdCA8Y29kZXBoPmFTdHJpbmc8L2NvZGVwaD4gZXhpc3RzLCBhbmQgaXQgaXMgc2hvd24gaW4gdGhlDQotY29udGVudCBhc3Npc3QgbGlzdC48L3A+PC9zZWN0aW9uPg0KLTwvY29uYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDUuZGl0YSI+PGxpbmt0ZXh0PkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQNCi10ZXh0IGVkaXRvcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI0LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MDQ2NzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ29udGVudCBhc3Npc3QiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHRoZSBzb3VyY2UgZmlsZSBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uIiAvPgotPG1ldGEgY29udGVudD0iY29udGVudCBhc3Npc3RhbmNlLCBvdmVydmlldywgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMsIGNvbnRlbnQgYXNzaXN0YW5jZSIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbnRlbnQgYXNzaXN0YW5jZSwgb3ZlcnZpZXcsIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCBjb250ZW50IGFzc2lzdGFuY2UiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNzcmNlZHQwMDYiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Db250ZW50IGFzc2lzdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3NyY2VkdDAwNiI+PGEgbmFtZT0iY3NyY2VkdDAwNiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q29udGVudCBhc3Npc3Q8L2gxPgotCi0KLQotPGRpdj48cD5Db250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvcgotZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yCi1pbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucwotZm9yIGNvbXBsZXRpb24uPC9wPgotCi08cD5Nb3N0IG9mIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBoYXZlIGNvbnRlbnQgYXNzaXN0LiBGb3IgYSBsaXN0IG9mCi1lZGl0b3JzIHRoYXQgaGF2ZSBjb250ZW50IGFzc2lzdCwgc2VlIDxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXM8L2E+LiBGb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdldCBjb250ZW50Ci1hc3Npc3RhbmNlLCBzZWUgPGEgaHJlZj0idHNyY2VkdDAwNS5odG1sIj5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvYT48L3A+Ci0KLTxwPlRoZSBzZWN0aW9ucyBiZWxvdyBkZXNjcmliZSBzcGVjaWZpY3Mgb2YgSFRNTCBjb250ZW50IGFzc2lzdCwgSmF2YVNjcmlwdOKEoiBjb250ZW50Ci1hc3Npc3QsIGFuZCBKU1AgY29udGVudCBhc3Npc3QuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+SFRNTCBjb250ZW50IGFzc2lzdDwvaDQ+PHA+SFRNTCBpcyBmbGV4aWJsZSBpbiB0aGF0IHNvbWUKLUhUTUwgZWxlbWVudHMgYWxsb3cgZW5kIHRhZ3MgdG8gYmUgb3B0aW9uYWxseSBvbWl0dGVkLCBzdWNoIGFzIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlA8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5EVDwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkREPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+TEk8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5USEVBRDwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlRSPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+VEQ8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5USDwvc2FtcD4sCi1hbmQgc28gb24uIE90aGVyIEhUTUwgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCB0byBoYXZlIG5vIGNvbnRlbnQgbWF5IHJlcXVpcmUKLXRoZSBlbmQgdGFnIGFsd2F5cyBiZSBvbWl0dGVkLCBzdWNoIGFzIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkJSPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+SFI8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5MSU5LPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+TUVUQTwvc2FtcD4sCi1hbmQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+SU1HPC9zYW1wPi4gVGhpcyBmbGV4aWJpbGl0eSBtYWtlcyB0aGUgY29udGVudCBhc3Npc3QgZnVuY3Rpb24KLXdpdGhpbiB0aGUgSFRNTCBzb3VyY2UgcGFnZSBlZGl0b3IgbGVzcyBwcmVjaXNlIHRoYW4gaXQgbWlnaHQgYmUgd2l0aCBhIG1vcmUKLXJpZ2lkbHkgY29uc3RyYWluZWQgbWFya3VwIGxhbmd1YWdlLjwvcD4KLTxwPkhUTUwgY29udGVudCBhc3Npc3QgaXMgbW9zdCBiZW5lZmljaWFsCi13aGVuIHlvdSBuZWVkIHRvIGNvbXBsZXRlIGEgdGFnIG5hbWUsIGFkZCBhbiBhdHRyaWJ1dGUgbmFtZS12YWx1ZSBwYWlyIHdpdGhpbgotYSBzdGFydCB0YWcsIG9yIHNlbGVjdCBmcm9tIGFuIGVudW1lcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGUgdmFsdWVzLjwvcD4KLTxwPkFsdGhvdWdoCi1jb250ZW50IGFzc2lzdCBvbmx5IHNob3dzIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGhhdmUgbm90IGFscmVhZHkgYmVlbiBzcGVjaWZpZWQKLWluIGEgc3RhcnQgdGFnLCBpdCBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCBncmFtbWFyIGNvbnN0cmFpbnRzIGZvciB0YWdzLgotRm9yIGV4YW1wbGUsIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5IRUFEPC9zYW1wPiBlbGVtZW50IGluIEhUTUwgb25seSBwZXJtaXRzIHplcm8gb3IKLW9uZSBvY2N1cnJlbmNlcyBvZiBhIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlRJVExFPC9zYW1wPiB0YWcgaW4gaXRzIGNvbnRlbnQuIElmIHlvdSBwcm9tcHQKLWZvciBjb250ZW50IGFzc2lzdCB3aXRoaW4gYSA8c2FtcCBjbGFzcz0iY29kZXBoIj5IRUFEPC9zYW1wPiBjb250ZW50IHRoYXQgYWxyZWFkeSBjb250YWlucwotYSA8c2FtcCBjbGFzcz0iY29kZXBoIj5USVRMRTwvc2FtcD4gdGFnLCBjb250ZW50IGFzc2lzdCB3aWxsIHN0aWxsIHNob3cgPHNhbXAgY2xhc3M9ImNvZGVwaCI+VElUTEU8L3NhbXA+IGluCi1pdHMgcHJvcG9zYWwgbGlzdC48L3A+Ci08cD5Ib3dldmVyLCBpZiBhbiBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgYWNjb3JkaW5nIHRvCi10aGUgRFREL1NjaGVtYSwgdGhhdCBhdHRyaWJ1dGUgd2lsbCBzaG93IHVwIGF0IHRoZSB0b3Agb2YgdGhlIGxpc3QsIHdpdGggYQoteWVsbG93IGNpcmNsZSBpbmRpY2F0b3Igb24gaXRzIGljb24uPC9wPgotPHA+SWYgeW91ciBjdXJzb3IgaXMgaW4gYSBwb3NpdGlvbgotd2hlcmUgY29udGVudCBhc3Npc3QgaXMgYXZhaWxhYmxlLCBhIHBvcC11cCBsaXN0IG9mIGF2YWlsYWJsZSBjaG9pY2VzIGlzIGRpc3BsYXllZC4KLVRoZSBsaXN0IGlzIGJhc2VkIG9uIHRoZSBjb250ZXh0LiBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSBjb250ZW50IGFzc2lzdCBkaXJlY3RseQotYWZ0ZXIgYW4gb3BlbmluZyBwYXJhZ3JhcGggdGFnICg8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7cCZndDs8L3NhbXA+KSAsIHRoZSBmaXJzdCBpdGVtCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCB3aWxsIGJlIHRoZSBjb3JyZXNwb25kaW5nIGNsb3NpbmcgcGFyYWdyYXBoICg8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7L3AmZ3Q7PC9zYW1wPikKLXRhZy48L3A+Ci08cD5UaGUgY29udGVudCBhc3Npc3QgbGlzdCBkaXNwbGF5cyBhbGwgYXZhaWxhYmxlIHRhZ3MgZm9yIHRoZSBjdXJyZW50Ci1jdXJzb3IgcG9zaXRpb24sIGluY2x1ZGluZyB0ZW1wbGF0ZXMuIFRoZSBwaWN0dXJlIGJlbG93IHNob3dzIHRoZSBkZWZhdWx0Ci1jb250ZW50IGFzc2lzdCBsaXN0IGZvciBhIHBhcmFncmFwaCB0YWcgZXhhbXBsZTo8YnIgLz48aW1nIHNyYz0iLi4vaW1hZ2VzL25jb250YXNzLmdpZiIgYWx0PSJIVE1MIENvbnRlbnQgYXNzaXN0IiAvPjxiciAvPjwvcD4KLTxwPlRhZyBwcm9wb3NhbHMKLWFyZSBsaXN0ZWQgYWxwaGFiZXRpY2FsbHkuIElmIHlvdSB0eXBlIGEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0Ozwvc2FtcD4gKHRvIGJlZ2luIGEKLW5ldyB0YWcpIGJlZm9yZSBwcm9tcHRpbmcgZm9yIGNvbnRlbnQgYXNzaXN0LCBhbmQgYmVnaW4gdHlwaW5nIHRoZSBmaXJzdCBvbmUKLW9yIHR3byBsZXR0ZXJzIG9mIHRoZSB0YWcgdGhhdCB5b3Ugd2FudCB0byBhZGQsIHRoZSBwcm9wb3NhbCBsaXN0IGF1dG9tYXRpY2FsbHkKLXJlZnJlc2hlcyB0byByZWZsZWN0IHByb3Bvc2FscyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuIHlvdSBoYXZlIHR5cGVkLiBJZiB5b3UKLWRvIG5vdCB0eXBlIGEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0Ozwvc2FtcD4gYmVmb3JlIHByb21wdGluZyBmb3IgY29udGVudCBhc3Npc3QsIHlvdQotY2FuIGNsaWNrIHdpdGhpbiB0aGUgcHJvcG9zYWwgbGlzdCBhbmQgdGhlbiB0eXBlIHRoZSBsZXR0ZXIgdGhhdCB0aGUgdGFnIGJlZ2lucwotd2l0aCwgdG8gcmVkdWNlIChzb21ld2hhdCkgdGhlIGFtb3VudCBvZiBzY3JvbGxpbmcgdG8gbG9jYXRlIHRoZSBkZXNpcmVkIHRhZy48L3A+Ci08cD5BcwoteW91IHR5cGUgdGhlIGZpcnN0IG9uZSBvciB0d28gbGV0dGVycyBvZiB0aGUgYXR0cmlidXRlIG5hbWVzIG9yIGVudW1lcmF0ZWQKLWF0dHJpYnV0ZSB2YWx1ZXMgdGhhdCB5b3Ugd2FudCB0byBhZGQgdG8gYSB0YWcsIHRoZSBsaXN0IGF1dG9tYXRpY2FsbHkgcmVmcmVzaGVzCi10byByZWZsZWN0IHByb3Bvc2FscyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuIHlvdSBoYXZlIHR5cGVkLjwvcD4KLTxkaXYgY2xhc3M9InJlc3RyaWN0aW9uIj48c3BhbiBjbGFzcz0icmVzdHJpY3Rpb250aXRsZSI+UmVzdHJpY3Rpb246PC9zcGFuPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL25saW51eC5naWYiIGFsdD0iRm9yIExpbnV4LiIgLz4gV2hlbiB1c2luZyBMaW51eCAoTW90aWYKLW9yIEdUSykgYW5kIGEgREJDUyBsb2NhbGUsIGRvdWJsZS1jbGlja2luZyBvbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCBjYW4KLXNvbWV0aW1lcyBjYXVzZSB0aGUgSmF2YeKEoiBWTSB0byB0ZXJtaW5hdGUuIEluc3RlYWQgb2YgZG91YmxlLWNsaWNraW5nCi1vbiB0aGUgbGlzdCwgdXNlIHRoZSBhcnJvd3MgYW5kIEVudGVyIGtleXMgdG8gbWFrZSB0aGUgc2VsZWN0aW9uIGZyb20gdGhlCi1saXN0LjwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5KU1AgY29udGVudCBhc3Npc3Q8L2g0PjxwPllvdSBoYXZlIG1hbnkgb3B0aW9ucyBmb3IgZW1iZWRkaW5nIEphdmEgYW5kCi1IVE1MIGNvZGUgaW4geW91ciBKU1AgcGFnZXMgYnkgdXNpbmcgY29udGVudCBhc3Npc3QuPC9wPgotPHA+QWxsIG9mIHRoZSBKU1AKLXRhZ3MgYXJlIGluY2x1ZGVkIGJvdGggaW4gdGhlIHRlbXBsYXRlIGxpc3QgYW5kIGluIFhNTCBmb3JtYXQgKGZvciBleGFtcGxlLCA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7anNwOmV4cHJlc3Npb24mZ3Q7PC9zYW1wPikuCi1UbyBhZGQgSlNQIHNjcmlwdGxldCB0YWdzLCBmb3IgZXhhbXBsZSwgbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBhcHByb3ByaWF0ZQotcG9zaXRpb24gaW4gdGhlIGZpbGUgYW5kIHByZXNzIEN0cmwrU3BhY2UgdG8gdXNlIGNvbnRlbnQgYXNzaXN0LiBTZWxlY3QgPGltZyBzcmM9Ii4uL2ltYWdlcy9ubWFjc2NycC5naWYiIGFsdD0iSlNQIHNjcmlwdGxldCBjb250ZW50IGFzc2lzdCIgLz4gZnJvbSB0aGUgcHJvcG9zYWwgbGlzdCB0byBpbnNlcnQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0OyUgJSZndDs8L3NhbXA+ICBpbiB0aGUKLWRvY3VtZW50LjwvcD4KLTxkaXYgY2xhc3M9InAiPlNjcmlwdGxldHMgYXJlIGluc2VydGVkIGluIGEgdGFnIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDslICUmZ3Q7PC9zYW1wPi4KLUZvciBleGFtcGxlOiA8cHJlPiZsdDslIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICUmZ3Q7PC9wcmU+Ci08L2Rpdj4KLTxwPlRoaXMKLWV4YW1wbGUgd2lsbCBldmFsdWF0ZSB0aGUgSmF2YSBzdGF0ZW1lbnQgdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWUgaW4KLW1pbGxpc2Vjb25kcy48L3A+Ci08ZGl2IGNsYXNzPSJwIj5UbyBoYXZlIHRoZSByZXN1bHQgb2YgdGhlIHN0YXRlbWVudCBpbnNlcnRlZCBpbiB0aGUgZmlsZSwKLXB1dCBhbiBlcXVhbHMgc2lnbiAoPSkgaW4gdGhlIGZyb250IG9mIHRoZSBzdGF0ZW1lbnQuIEZvciBleGFtcGxlOiA8cHJlPiZsdDtiJmd0O1RoaXMgaXMgdGhlIHRpbWUgOiAmbHQ7JT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCklJmd0OyZsdDsvYiZndDs8L3ByZT4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+V2hlbiB5b3UgYXJlIHdpdGhpbiBhIHNjcmlwdGxldCB5b3UgYXJlIHdyaXRpbmcgcHVyZSBKYXZhIGNvZGUuCi1UaGVyZWZvcmUsIGNvbnRlbnQgYXNzaXN0IHdvcmtzIGV4YWN0bHkgdGhlIHNhbWUgYXMgaXQgZG9lcyBmb3IgdGhlIEphdmEgZWRpdG9yLgotRm9yIGV4YW1wbGUsIGlmIHlvdSByZXF1ZXN0IGNvbnRlbnQgYXNzaXN0IGFmdGVyIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlN5c3RlbTwvc2FtcD4sCi1jb250ZW50IGFzc2lzdCBkaXNwbGF5cyBhIGxpc3Qgb2YgbWV0aG9kcy4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEphdmEgY29udGVudCBhc3Npc3Qgd29ya3Mgb25seSBpbiBhIFdlYgotcHJvamVjdCwgYmVjYXVzZSBpdCByZXF1aXJlcyBhIGJ1aWxkcGF0aCB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBKYXZhIGNsYXNzZXMuPC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPlRoZXJlCi1hcmUgYWxzbyBzcGVjaWFsIHRhZ3Mgc3VjaCBhcyB1c2VCZWFuLiBGb3IgZXhhbXBsZTogPHByZT4mbHQ7anNwOnVzZUJlYW4gaWQ9InVzZUJlYW4iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8mZ3Q7PC9wcmU+Ci08L2Rpdj4KLTxwPlRoZQotdXNlQmVhbiB0YWcgZW5hYmxlcyB5b3UgdG8gY3JlYXRlIGEgYmVhbiBjYWxsZWQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YVN0cmluZzwvc2FtcD4gb2YKLXR5cGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+U3RyaW5nPC9zYW1wPi4gVGhlbiB3aGVuIHlvdSB1c2UgY29udGVudCBhc3Npc3QsIHRoaXMgaXMgcmVjb2duaXplZAotYXMgYSBkZWNsYXJlZCB2YXJpYWJsZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgY29udGVudCBhc3Npc3QgYWZ0ZXIgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YVN0cmluZzwvc2FtcD4sCi1hcyBmb2xsb3dzOjwvcD4KLTxkaXYgY2xhc3M9InAiPiA8cHJlPiZsdDslIGFTdHJpbmcuICUmZ3Q7IDwvcHJlPgotdGhlIGNvbnRlbnQgYXNzaXN0Ci1saXN0IHNob3dzIGF2YWlsYWJsZSBtZXRob2RzLiBUaGlzIGlzIGJlY2F1c2UgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YVN0cmluZzwvc2FtcD4gaGFzCi1iZWVuIGRlY2xhcmVkIGFzIGEgYmVhbiBvZiB0eXBlIFN0cmluZy48L2Rpdj4KLTxkaXYgY2xhc3M9InAiPklmIHlvdSB1c2UgY29udGVudCBhc3Npc3QgYWZ0ZXIKLXRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hPC9zYW1wPiwgYXMgZm9sbG93czogPHByZT4mbHQ7JSBhICUmZ3Q7IDwvcHJlPgotY29udGVudAotYXNzaXN0IGtub3dzIHRoYXQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YVN0cmluZzwvc2FtcD4gZXhpc3RzLCBhbmQgaXQgaXMgc2hvd24gaW4gdGhlCi1jb250ZW50IGFzc2lzdCBsaXN0LjwvZGl2PgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDA1Lmh0bWwiIHRpdGxlPSJUbyBnZXQgaGVscCBpbiBhZGRpbmcgbWFya3VwIHRvIGEgZmlsZSwgeW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiI+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZAotdGV4dCBlZGl0b3JzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI0Lmh0bWwiIHRpdGxlPSJIVE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3ZhbGlkYXRlLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2N2YWxpZGF0ZS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDMwZTc3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3ZhbGlkYXRlLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICIuLlxkdGRcY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjc3JjZWR0MDAxIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Tb3VyY2UgYW5kIGJhdGNoIHZhbGlkYXRpb248L3RpdGxlPg0KLTxzaG9ydGRlc2M+PC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJjdmFsaWRhdGV8MXx2YWxpZGF0aW9uc291cmNldnNiYXRjaCIgc3RhdHVzPSJjaGFuZ2VkIj52YWxpZGF0aW9uPGluZGV4dGVybT5zb3VyY2UNCi12ZXJzdXMgYmF0Y2g8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VGhlcmUgYXJlIHR3byB0eXBlcyBvZiB2YWxpZGF0aW9uIHRoYXQgY2FuIG9jY3VyIHdoZW4geW91IGFyZSB3b3JraW5nIHdpdGgNCi1zb3VyY2UgZmlsZXMgaW4gYSBzdHJ1Y3R1cmVkIHNvdXJjZSBlZGl0b3I6IHNvdXJjZSB2YWxpZGF0aW9uIGFuZCBiYXRjaCB2YWxpZGF0aW9uLiA8L3A+DQotPHA+U291cmNlIHZhbGlkYXRpb24gb2NjdXJzIGFzIHlvdSB0eXBlIHlvdXIgY29kZTsgdGhpcyB2YWxpZGF0aW9uIHJlZmxlY3RzDQotdGhlICJ1bnNhdmVkIiBhbmQgInVuYnVpbHQiIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgeW91IGFyZSBlZGl0aW5nLiBGb3IgZXhhbXBsZSwNCi1pZiB5b3Ugd2VyZSB0byB0eXBlIHRoZSBmb2xsb3dpbmcgY29kZSBpbiBhIEpTUCBlZGl0b3I6PGxpbmVzPjxjb2RlcGg+Jmx0O2ZvbzpiYXI+PC9jb2RlcGg+PC9saW5lcz53aGVyZSA8Y29kZXBoPmZvbzpiYXI8L2NvZGVwaD5pcw0KLWEgdGFnIHRoYXQgZG9lcyBub3QgZXhpc3QsIHRoZSBwcm9ibGVtIHdvdWxkIGJlIGRpc2NvdmVyZWQgaW1tZWRpYXRlbHkgYW5kDQotd291bGQgYXBwZWFyIHVuZGVybGluZWQgaW4gdGhlIGVkaXRvci4gVGhlIGFkdmFudGFnZSBvZiB0aGlzIHR5cGUgb2YgdmFsaWRhdGlvbg0KLWlzIHRoYXQgaXQgY2FuIGFsZXJ0IHlvdSB0byBlcnJvcnMgaW5zdGFudGx5Ljxub3RlPlRvIHR1cm4gc291cmNlIHZhbGlkYXRpb24NCi1vbiAob3Igb2ZmKSBmb3IgYWxsIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4NCi08dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+PHVpY29udHJvbD5FZGl0b3JzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZCBjaGVjayAob3INCi11bmNoZWNrKSA8Yj5SZXBvcnQgcHJvYmxlbXMgYXMgeW91IHR5cGU8L2I+Ljwvbm90ZT48L3A+DQotPHA+QmF0Y2ggdmFsaWRhdGlvbiBvY2N1cnMgb24gc2F2ZWQgZmlsZXMuIEl0IGNhbiBjYXRjaCBidWlsZCBwcm9jZXNzIGVycm9ycw0KLWFuZCBvdGhlciBlcnJvcnMgdGhhdCB0aGUgc291cmNlIHZhbGlkYXRvciBjYW5ub3QuIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdQ0KLXR5cGVkIHRoZSBmb2xsb3dpbmcgaW4gYSBKU1AgZWRpdG9yOjxsaW5lcz4NCi08Y29kZXBoPiZsdDslQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJT4NCi0mbHQ7JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiU+PC9jb2RlcGg+PC9saW5lcz5Jbg0KLXRoaXMgZXhhbXBsZSwgdGhlIHNhbWUgcHJlZml4IGlzIHVzZWQgdHdpY2UuIFRoaXMgd291bGQgcHJvbXB0IHRoZSBiYXRjaCB2YWxpZGF0b3INCi10byB0cmlnZ2VyIG1hcmtlcnMgYW5kIHRvIGdlbmVyYXRlIGJ1aWxkIHdhcm5pbmdzIGluIHRoZSBQcm9ibGVtcyB2aWV3IGFuZA0KLWluIHRoZSBOYXZpZ2F0b3IuIDwvcD4NCi08cD5CYXRjaCB2YWxpZGF0aW9uIGNhbiB1bmNvdmVyIGVycm9ycyBpbiBtdWx0aXBsZSBmaWxlcyBhdCBvbmNlIGFuZCBnaXZlDQoteW91IGEgY29tcHJlaGVuc2l2ZSB2aWV3IG9mIHdoZXJlIHByb2JsZW1hdGljIGNvZGUgY2FuIGJlIGZvdW5kIGluIHlvdXIgcHJvamVjdC4NCi1Nb3Jlb3ZlciwgeW91IGRvIG5vdCBuZWVkIHRvIG9wZW4gZmlsZXMgaW4gYW4gZWRpdG9yIHRvIHJ1biBiYXRjaCB2YWxpZGF0aW9uLg0KLVRvIHJ1biBiYXRjaCB2YWxpZGF0aW9uIG9uIHNwZWNpZmljIGZpbGVzLCBzZWxlY3QgYW5kIHJpZ2h0IGNsaWNrIHRoZSBmaWxlcw0KLWluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIGFuZCB0aGVuIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5WYWxpZGF0ZTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGZyb20gdGhlIHBvcHVwIG1lbnUuPC9wPg0KLTxub3RlPlRvIHNldCBwcmVmZXJlbmNlcyBmb3IgYmF0Y2ggdmFsaWRhdGlvbiwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPjx1aWNvbnRyb2w+VmFsaWRhdGlvbjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9ub3RlPg0KLTwvY29uYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2N2YWxpZGF0ZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jdmFsaWRhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5NjIxMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2N2YWxpZGF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU291cmNlIGFuZCBiYXRjaCB2YWxpZGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSIiIC8+Ci08bWV0YSBjb250ZW50PSJ2YWxpZGF0aW9uLCBzb3VyY2UgdmVyc3VzIGJhdGNoIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0idmFsaWRhdGlvbiwgc291cmNlIHZlcnN1cyBiYXRjaCIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjc3JjZWR0MDAxIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U291cmNlIGFuZCBiYXRjaCB2YWxpZGF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjc3JjZWR0MDAxIj48YSBuYW1lPSJjc3JjZWR0MDAxIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Tb3VyY2UgYW5kIGJhdGNoIHZhbGlkYXRpb248L2gxPgotCi0KLQotPGRpdj48cCAvPgotCi08cD5UaGVyZSBhcmUgdHdvIHR5cGVzIG9mIHZhbGlkYXRpb24gdGhhdCBjYW4gb2NjdXIgd2hlbiB5b3UgYXJlIHdvcmtpbmcgd2l0aAotc291cmNlIGZpbGVzIGluIGEgc3RydWN0dXJlZCBzb3VyY2UgZWRpdG9yOiBzb3VyY2UgdmFsaWRhdGlvbiBhbmQgYmF0Y2ggdmFsaWRhdGlvbi4gPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5Tb3VyY2UgdmFsaWRhdGlvbiBvY2N1cnMgYXMgeW91IHR5cGUgeW91ciBjb2RlOyB0aGlzIHZhbGlkYXRpb24gcmVmbGVjdHMKLXRoZSAidW5zYXZlZCIgYW5kICJ1bmJ1aWx0IiBjb250ZW50cyBvZiB0aGUgc291cmNlIHlvdSBhcmUgZWRpdGluZy4gRm9yIGV4YW1wbGUsCi1pZiB5b3Ugd2VyZSB0byB0eXBlIHRoZSBmb2xsb3dpbmcgY29kZSBpbiBhIEpTUCBlZGl0b3I6PHA+PHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0O2ZvbzpiYXImZ3Q7PC9zYW1wPjwvcD4KLXdoZXJlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmZvbzpiYXI8L3NhbXA+aXMKLWEgdGFnIHRoYXQgZG9lcyBub3QgZXhpc3QsIHRoZSBwcm9ibGVtIHdvdWxkIGJlIGRpc2NvdmVyZWQgaW1tZWRpYXRlbHkgYW5kCi13b3VsZCBhcHBlYXIgdW5kZXJsaW5lZCBpbiB0aGUgZWRpdG9yLiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgdHlwZSBvZiB2YWxpZGF0aW9uCi1pcyB0aGF0IGl0IGNhbiBhbGVydCB5b3UgdG8gZXJyb3JzIGluc3RhbnRseS48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVG8gdHVybiBzb3VyY2UgdmFsaWRhdGlvbgotb24gKG9yIG9mZikgZm9yIGFsbCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcnM8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yczwvc3Bhbj48L3NwYW4+IGFuZCBjaGVjayAob3IKLXVuY2hlY2spIDxzdHJvbmc+UmVwb3J0IHByb2JsZW1zIGFzIHlvdSB0eXBlPC9zdHJvbmc+LjwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InAiPkJhdGNoIHZhbGlkYXRpb24gb2NjdXJzIG9uIHNhdmVkIGZpbGVzLiBJdCBjYW4gY2F0Y2ggYnVpbGQgcHJvY2VzcyBlcnJvcnMKLWFuZCBvdGhlciBlcnJvcnMgdGhhdCB0aGUgc291cmNlIHZhbGlkYXRvciBjYW5ub3QuIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdQotdHlwZWQgdGhlIGZvbGxvd2luZyBpbiBhIEpTUCBlZGl0b3I6PHA+PGJyIC8+Ci08c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiUmZ3Q7PGJyIC8+Ci0mbHQ7JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiUmZ3Q7PC9zYW1wPjwvcD4KLUluCi10aGlzIGV4YW1wbGUsIHRoZSBzYW1lIHByZWZpeCBpcyB1c2VkIHR3aWNlLiBUaGlzIHdvdWxkIHByb21wdCB0aGUgYmF0Y2ggdmFsaWRhdG9yCi10byB0cmlnZ2VyIG1hcmtlcnMgYW5kIHRvIGdlbmVyYXRlIGJ1aWxkIHdhcm5pbmdzIGluIHRoZSBQcm9ibGVtcyB2aWV3IGFuZAotaW4gdGhlIE5hdmlnYXRvci4gPC9kaXY+Ci0KLTxwPkJhdGNoIHZhbGlkYXRpb24gY2FuIHVuY292ZXIgZXJyb3JzIGluIG11bHRpcGxlIGZpbGVzIGF0IG9uY2UgYW5kIGdpdmUKLXlvdSBhIGNvbXByZWhlbnNpdmUgdmlldyBvZiB3aGVyZSBwcm9ibGVtYXRpYyBjb2RlIGNhbiBiZSBmb3VuZCBpbiB5b3VyIHByb2plY3QuCi1Nb3Jlb3ZlciwgeW91IGRvIG5vdCBuZWVkIHRvIG9wZW4gZmlsZXMgaW4gYW4gZWRpdG9yIHRvIHJ1biBiYXRjaCB2YWxpZGF0aW9uLgotVG8gcnVuIGJhdGNoIHZhbGlkYXRpb24gb24gc3BlY2lmaWMgZmlsZXMsIHNlbGVjdCBhbmQgcmlnaHQgY2xpY2sgdGhlIGZpbGVzCi1pbiB0aGUgUHJvamVjdCBFeHBsb3JlciBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0ZTwvc3Bhbj4KLTwvc3Bhbj4gZnJvbSB0aGUgcG9wdXAgbWVudS48L3A+Ci0KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUbyBzZXQgcHJlZmVyZW5jZXMgZm9yIGJhdGNoIHZhbGlkYXRpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGlvbjwvc3Bhbj48L3NwYW4+PC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90Y29udGVudHR5cGUuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzZDFlMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idGNvbnRlbnR0eXBlIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Bc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggYWRkaXRpb25hbCBmaWxlcyB0eXBlczwvdGl0bGU+DQotPHNob3J0ZGVzYz48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5jb250ZW50IHR5cGVzPGluZGV4dGVybT5tYXBwaW5nIGZpbGUgZXh0ZW5zaW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+ZmlsZSBleHRlbnNpb25zPGluZGV4dGVybT5tYXBwaW5nIGNvbnRlbnQgdHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPmZpbGUgdHlwZXM8aW5kZXh0ZXJtPmVkaXRvcnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPllvdSBjYW4gYXNzb2NpYXRlIGNlcnRhaW4gZWRpdG9ycyB3aXRoIGEgZmlsZSB0eXBlIGJ5IGNsaWNraW5nDQotb24gPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPjx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPjx1aWNvbnRyb2w+RmlsZQ0KLUFzc29jaWF0aW9uPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIHNldHRpbmcgdXAgdGhlIGFzc29jaWF0aW9ucyBpbiB0aGUNCi1GaWxlIEFzc29jaWF0aW9ucyBXaW5kb3cuPC9wPjxwPlNvbWUgRWNsaXBzZS1iYXNlZCBlZGl0b3JzLCBob3dldmVyLCB3aWxsDQotb25seSByZWNvZ25pemUgYSBmaWxlIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4gQ29uc2VxdWVudGx5LCBpZg0KLXlvdSB3YW50IHRvIGFzc29jaWF0ZSBhbiBhZGRpdGlvbmFsIGZpbGUgdHlwZSB3aXRoIHNvbWUgZWRpdG9ycywgeW91IG1heSBoYXZlDQotdG8gZmlyc3QgbWFwIHRoZSBjb250ZW50IHR5cGUgd2l0aCBpdHMgZmlsZSBleHRlbnNpb24uIFRvIG1hcCBhIGNvbnRlbnQgdHlwZQ0KLXdpdGggYSBmaWxlIGV4dGVuc2lvbiwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPjxvbD4NCi08bGk+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5Db250ZW50IFR5cGVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uIFRoZSBDb250ZW50IFR5cGUgd2luZG93DQotYXBwZWFycy4gPC9saT4NCi08bGk+U2VsZWN0IGEgY29udGVudCB0eXBlIGluIHRoZSBDb250ZW50IFR5cGUgd2luZG93LCBhbmQgdGhlbiBzZWxlY3QgPGI+QWRkPC9iPiAuDQotVGhlIERlZmluZSBhIE5ldyBGaWxlIFR5cGUgd2luZG93IGFwcGVhcnMuPC9saT4NCi08bGk+VHlwZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0eXBlLCBhbmQgdGhlbiBjbGljayA8Yj5PSzwvYj4uPC9saT4NCi08L29sPjwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90Y29udGVudHR5cGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVmMTg2MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGFkZGl0aW9uYWwgZmlsZXMgdHlwZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbnRlbnQgdHlwZXMsIG1hcHBpbmcgZmlsZSBleHRlbnNpb25zLCBmaWxlIGV4dGVuc2lvbnMsIG1hcHBpbmcgY29udGVudCB0eXBlcywgZmlsZSB0eXBlcywgZWRpdG9ycyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbnRlbnQgdHlwZXMsIG1hcHBpbmcgZmlsZSBleHRlbnNpb25zLCBmaWxlIGV4dGVuc2lvbnMsIG1hcHBpbmcgY29udGVudCB0eXBlcywgZmlsZSB0eXBlcywgZWRpdG9ycyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGNvbnRlbnR0eXBlIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGFkZGl0aW9uYWwgZmlsZXMgdHlwZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjb250ZW50dHlwZSI+PGEgbmFtZT0idGNvbnRlbnR0eXBlIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Bc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggYWRkaXRpb25hbCBmaWxlcyB0eXBlczwvaDE+Ci0KLQotCi08ZGl2PjxwIC8+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gYXNzb2NpYXRlIGNlcnRhaW4gZWRpdG9ycyB3aXRoIGEgZmlsZSB0eXBlIGJ5IGNsaWNraW5nCi1vbiA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlCi1Bc3NvY2lhdGlvbjwvc3Bhbj48L3NwYW4+IGFuZCBzZXR0aW5nIHVwIHRoZSBhc3NvY2lhdGlvbnMgaW4gdGhlCi1GaWxlIEFzc29jaWF0aW9ucyBXaW5kb3cuPC9wPgotPHA+U29tZSBFY2xpcHNlLWJhc2VkIGVkaXRvcnMsIGhvd2V2ZXIsIHdpbGwKLW9ubHkgcmVjb2duaXplIGEgZmlsZSBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUuIENvbnNlcXVlbnRseSwgaWYKLXlvdSB3YW50IHRvIGFzc29jaWF0ZSBhbiBhZGRpdGlvbmFsIGZpbGUgdHlwZSB3aXRoIHNvbWUgZWRpdG9ycywgeW91IG1heSBoYXZlCi10byBmaXJzdCBtYXAgdGhlIGNvbnRlbnQgdHlwZSB3aXRoIGl0cyBmaWxlIGV4dGVuc2lvbi4gVG8gbWFwIGEgY29udGVudCB0eXBlCi13aXRoIGEgZmlsZSBleHRlbnNpb24sIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD4KLTxvbD4KLTxsaT5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGVudCBUeXBlczwvc3Bhbj48L3NwYW4+LiBUaGUgQ29udGVudCBUeXBlIHdpbmRvdwotYXBwZWFycy4gPC9saT4KLQotPGxpPlNlbGVjdCBhIGNvbnRlbnQgdHlwZSBpbiB0aGUgQ29udGVudCBUeXBlIHdpbmRvdywgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+QWRkPC9zdHJvbmc+IC4KLVRoZSBEZWZpbmUgYSBOZXcgRmlsZSBUeXBlIHdpbmRvdyBhcHBlYXJzLjwvbGk+Ci0KLTxsaT5UeXBlIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHR5cGUsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uPC9saT4KLQotPC9vbD4KLTwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiN2I5Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMDAiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPkVkaXRpbmcgbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3PC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIDx0ZXJtPnN0cnVjdHVyZWQNCi10ZXh0IGVkaXRvcjwvdGVybT4uIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4NCi11c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+bWFya3VwIGxhbmd1YWdlczxpbmRleHRlcm0+ZWRpdGluZyB0ZXh0PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT50ZXh0PGluZGV4dGVybT5lZGl0aW5nIGluIG1hcmt1cCBsYW5ndWFnZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+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+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk0ODYxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIiAvPgotPG1ldGEgY29udGVudD0ibWFya3VwIGxhbmd1YWdlcywgZWRpdGluZyB0ZXh0LCB0ZXh0LCBlZGl0aW5nIGluIG1hcmt1cCBsYW5ndWFnZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJtYXJrdXAgbGFuZ3VhZ2VzLCBlZGl0aW5nIHRleHQsIHRleHQsIGVkaXRpbmcgaW4gbWFya3VwIGxhbmd1YWdlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDAxLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwNS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDA3Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTAuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI2Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAwMCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMDAiPjxhIG5hbWU9InRzcmNlZHQwMDAiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXc8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIDxkZm4gY2xhc3M9InRlcm0iPnN0cnVjdHVyZWQKLXRleHQgZWRpdG9yPC9kZm4+LiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuCi11c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5JbiBhZGRpdGlvbiB0byBiYXNpYyBlZGl0aW5nIHRhc2tzIHN1Y2ggYXMgYWRkaW5nLCBtb2RpZnlpbmcsIGFuZAotZGVsZXRpbmcgdGV4dCwgeW91IGNhbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGFza3M6PC9kaXY+Ci0KLTx1bD4KLTxsaT48c3Bhbj48YSBocmVmPSJ0c3JjZWR0MDI1Lmh0bWwiPlNldCBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2E+PC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj48YSBocmVmPSJ0c3JjZWR0MDA1Lmh0bWwiPkdldCBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2E+PC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj48YSBocmVmPSJ0c3JjZWR0MDA3Lmh0bWwiPlNlYXJjaCBvciBmaW5kIHRleHQgd2l0aGluIGEgZmlsZTwvYT48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPjxhIGhyZWY9InRzcmNlZHQwMTAuaHRtbCI+Q2hlY2sgc3BlbGxpbmc8L2E+PC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPjxhIGhyZWY9InRzcmNlZHQwMjcuaHRtbCI+QWRkIG9yIHJlbW92ZSBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzPC9hPjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+PGEgaHJlZj0idHNyY2VkdDAyNi5odG1sIj5FZGl0IHdpdGggc25pcHBldHM8L2E+PC9zcGFuPgotPC9saT4KLQotPC91bD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA2Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uIj5Db250ZW50IGFzc2lzdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiI+U25pcHBldHMgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI1Lmh0bWwiIHRpdGxlPSIiPlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDA1Lmh0bWwiIHRpdGxlPSJUbyBnZXQgaGVscCBpbiBhZGRpbmcgbWFya3VwIHRvIGEgZmlsZSwgeW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiI+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDcuaHRtbCIgdGl0bGU9IiI+U2VhcmNoaW5nIG9yIGZpbmRpbmcgdGV4dCB3aXRoaW4gYSBmaWxlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDEwLmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBjaGVjayBzcGVsbGluZyBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIj5DaGVja2luZyBzcGVsbGluZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNy5odG1sIiB0aXRsZT0iQ29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNi5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiBUaGUgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzIHRoYXQgeW91IGRlZmluZSBhbmQgaW5jbHVkZS4iPkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDBjOGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDAxIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBsYW5ndWFnZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlczwvbmF2dGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBzZXQgPHRlcm0+YW5ub3RhdGlvbiBwcmVmZXJlbmNlczwvdGVybT4gZm9yDQotV2ViIGFuZCBYTUwgZmlsZXMuIFRoZSBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGluY2x1ZGUgd2hldGhlciB0byBhbmFseXplIHRoZQ0KLXN5bnRhY3RpYyB2YWxpZGl0eSBvZiB5b3VyIGZpbGUgd2hpbGUgeW91IGFyZSB0eXBpbmcgYW5kIHdoYXQgY29sb3JzIHRvIHVzZQ0KLXRvIGhpZ2hsaWdodCBlcnJvcnMsIHdhcm5pbmdzLCB0YXNrcywgc2VhcmNoIHJlc3VsdHMsIGJvb2ttYXJrcywgYW5kIG90aGVyDQotdGV4dC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRzcmNlZHQwMDF8MXxhbm5vdGF0aW9ucHJlZmVyZW5jZXNtYXJrdXBsYW5ndWFnZXNldHRpbmdzIg0KLXN0YXR1cz0iY2hhbmdlZCI+YW5ub3RhdGlvbnM8aW5kZXh0ZXJtPm1hcmt1cCBsYW5ndWFnZSBzZXR0aW5nczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0ga2V5cmVmPSJ0c3JjZWR0MDAxfDJ8bWFya3VwbGFuZ3VhZ2Vzc2V0dGluZ2Fubm90YXRpb25wcmVmZXJlbmNlcyINCi1zdGF0dXM9Im5ldyI+bWFya3VwIGxhbmd1YWdlczxpbmRleHRlcm0+c2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+QnkgZGVmYXVsdCwgd2hlbiB5b3UgZWRpdCBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IsIHlvdXIgc291cmNlDQotY29kZSBpcyB2YWxpZGF0ZWQgYXMgeW91IHR5cGUgaXQgaW4uIExpa2Ugb3RoZXIgRWNsaXBzZS1iYXNlZCBlZGl0b3JzLCB0aGUNCi1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyBmbGFnIHdhcm5pbmdzIGFuZCBlcnJvcnMgaW4gdGhlDQotc291cmNlIGNvZGUgaW4gdGhlIGVkaXRvciBhcmVhLiBUaGUgd2FybmluZ3MgYW5kIGVycm9ycyBhbHNvIHNob3cgdXAgaW4gdGhlDQotVGFza3MgdmlldyB3aGVuIHlvdSBzYXZlIHRoZSBmaWxlLjwvcD48bm90ZT5IaWdobGlnaHRpbmcgaXMgZnVsbHkgZHluYW1pYw0KLXdpdGggdGhlIGV4Y2VwdGlvbiBvZiBzZWFyY2ggcmVzdWx0cy4gU2VhcmNoIHJlc3VsdHMgYXJlIGhpZ2hsaWdodGVkIGJhc2VkDQotdXBvbiB3aGF0IGhhcyBiZWVuIHNhdmVkIHRvIGRpc2suPC9ub3RlPjxub3RlIHR5cGU9InRpcCI+WW91IGNhbiBpbXByb3ZlIGENCi1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yJ3MgcGVyZm9ybWFuY2UgYnkgdHVybmluZyBvZmYgdGhlIHJlYWwtdGltZSB2YWxpZGF0aW9uLjwvbm90ZT48cD5Ubw0KLXNldCBhbm5vdGF0aW9uIHByZWZlcmVuY2VzLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4gPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi48L2NtZD48c3RlcHJlc3VsdD5BIFByZWZlcmVuY2VzIHdpbmRvdyBhcHBlYXJzLjwvc3RlcHJlc3VsdD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJlZmVyZW5jZXMgd2luZG93LCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD4NCi08dWljb250cm9sPkVkaXRvcnM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPlRvIHR1cm4gb2ZmIHJlYWwtdGltZSBzeW50YXggdmFsaWRhdGlvbiwgY2xpY2sgPHVpY29udHJvbD5TdHJ1Y3R1cmVkDQotVGV4dCBFZGl0b3I8L3VpY29udHJvbD4gYW5kIHVuY2hlY2sgdGhlIDx1aWNvbnRyb2w+QW5hbHl6ZSBhbm5vdGF0aW9ucyB3aGlsZQ0KLXR5cGluZzwvdWljb250cm9sPiBib3guPC9jaG9pY2U+DQotPGNob2ljZT5UbyBjb250cm9sIG90aGVyIGFubm90YXRpb24gc2V0dGluZ3MsIGNsaWNrIDx1aWNvbnRyb2w+QW5ub3RhdGlvbnM8L3VpY29udHJvbD4gYW5kDQotc2VsZWN0IHlvdXIgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcy48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0byBzYXZlIHlvdXIgcHJlZmVyZW5jZXMgYW5kIGNsb3NlDQotdGhlIHBhZ2UuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjUuZGl0YSI+PGxpbmt0ZXh0PlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQNCi10ZXh0IGVkaXRvcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjYTU1Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBzZXQgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgV2ViIGFuZCBYTUwgZmlsZXMuIFRoZSBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGluY2x1ZGUgd2hldGhlciB0byBhbmFseXplIHRoZSBzeW50YWN0aWMgdmFsaWRpdHkgb2YgeW91ciBmaWxlIHdoaWxlIHlvdSBhcmUgdHlwaW5nIGFuZCB3aGF0IGNvbG9ycyB0byB1c2UgdG8gaGlnaGxpZ2h0IGVycm9ycywgd2FybmluZ3MsIHRhc2tzLCBzZWFyY2ggcmVzdWx0cywgYm9va21hcmtzLCBhbmQgb3RoZXIgdGV4dC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gc2V0IGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIFdlYiBhbmQgWE1MIGZpbGVzLiBUaGUgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBpbmNsdWRlIHdoZXRoZXIgdG8gYW5hbHl6ZSB0aGUgc3ludGFjdGljIHZhbGlkaXR5IG9mIHlvdXIgZmlsZSB3aGlsZSB5b3UgYXJlIHR5cGluZyBhbmQgd2hhdCBjb2xvcnMgdG8gdXNlIHRvIGhpZ2hsaWdodCBlcnJvcnMsIHdhcm5pbmdzLCB0YXNrcywgc2VhcmNoIHJlc3VsdHMsIGJvb2ttYXJrcywgYW5kIG90aGVyIHRleHQuIiAvPgotPG1ldGEgY29udGVudD0iYW5ub3RhdGlvbnMsIG1hcmt1cCBsYW5ndWFnZSBzZXR0aW5ncywgbWFya3VwIGxhbmd1YWdlcywgc2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iYW5ub3RhdGlvbnMsIG1hcmt1cCBsYW5ndWFnZSBzZXR0aW5ncywgbWFya3VwIGxhbmd1YWdlcywgc2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI1Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAwMSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAwMSI+PGEgbmFtZT0idHNyY2VkdDAwMSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBzZXQgPGRmbiBjbGFzcz0idGVybSI+YW5ub3RhdGlvbiBwcmVmZXJlbmNlczwvZGZuPiBmb3IKLVdlYiBhbmQgWE1MIGZpbGVzLiBUaGUgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBpbmNsdWRlIHdoZXRoZXIgdG8gYW5hbHl6ZSB0aGUKLXN5bnRhY3RpYyB2YWxpZGl0eSBvZiB5b3VyIGZpbGUgd2hpbGUgeW91IGFyZSB0eXBpbmcgYW5kIHdoYXQgY29sb3JzIHRvIHVzZQotdG8gaGlnaGxpZ2h0IGVycm9ycywgd2FybmluZ3MsIHRhc2tzLCBzZWFyY2ggcmVzdWx0cywgYm9va21hcmtzLCBhbmQgb3RoZXIKLXRleHQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+QnkgZGVmYXVsdCwgd2hlbiB5b3UgZWRpdCBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IsIHlvdXIgc291cmNlCi1jb2RlIGlzIHZhbGlkYXRlZCBhcyB5b3UgdHlwZSBpdCBpbi4gTGlrZSBvdGhlciBFY2xpcHNlLWJhc2VkIGVkaXRvcnMsIHRoZQotc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMgZmxhZyB3YXJuaW5ncyBhbmQgZXJyb3JzIGluIHRoZQotc291cmNlIGNvZGUgaW4gdGhlIGVkaXRvciBhcmVhLiBUaGUgd2FybmluZ3MgYW5kIGVycm9ycyBhbHNvIHNob3cgdXAgaW4gdGhlCi1UYXNrcyB2aWV3IHdoZW4geW91IHNhdmUgdGhlIGZpbGUuPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEhpZ2hsaWdodGluZyBpcyBmdWxseSBkeW5hbWljCi13aXRoIHRoZSBleGNlcHRpb24gb2Ygc2VhcmNoIHJlc3VsdHMuIFNlYXJjaCByZXN1bHRzIGFyZSBoaWdobGlnaHRlZCBiYXNlZAotdXBvbiB3aGF0IGhhcyBiZWVuIHNhdmVkIHRvIGRpc2suPC9kaXY+Ci08ZGl2IGNsYXNzPSJ0aXAiPjxzcGFuIGNsYXNzPSJ0aXB0aXRsZSI+VGlwOjwvc3Bhbj4gWW91IGNhbiBpbXByb3ZlIGEKLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3IncyBwZXJmb3JtYW5jZSBieSB0dXJuaW5nIG9mZiB0aGUgcmVhbC10aW1lIHZhbGlkYXRpb24uPC9kaXY+Ci08cD5Ubwotc2V0IGFubm90YXRpb24gcHJlZmVyZW5jZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotIDwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPi48L3NwYW4+IEEgUHJlZmVyZW5jZXMgd2luZG93IGFwcGVhcnMuCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3csIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjwvc3Bhbj4KLTx1bD4KLTxsaT5UbyB0dXJuIG9mZiByZWFsLXRpbWUgc3ludGF4IHZhbGlkYXRpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cnVjdHVyZWQKLVRleHQgRWRpdG9yPC9zcGFuPiBhbmQgdW5jaGVjayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QW5hbHl6ZSBhbm5vdGF0aW9ucyB3aGlsZQotdHlwaW5nPC9zcGFuPiBib3guPC9saT4KLQotPGxpPlRvIGNvbnRyb2wgb3RoZXIgYW5ub3RhdGlvbiBzZXR0aW5ncywgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QW5ub3RhdGlvbnM8L3NwYW4+IGFuZAotc2VsZWN0IHlvdXIgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcy48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHlvdXIgcHJlZmVyZW5jZXMgYW5kIGNsb3NlCi10aGUgcGFnZS48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjUuaHRtbCIgdGl0bGU9IiI+U2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZAotdGV4dCBlZGl0b3JzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA1LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODM2NzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA1LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDA1IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvdGl0bGU+DQotPCEtLUZvcm1lcmx5ICJVc2luZyBKYXZhU2NyaXB0IGNvbnRlbnQgYXNzaXN0IjsgbW92ZWQgc29tZSBKYXZhU2NyaXB0LXNwZWNpZmljIGNvbnRlbnQgdG8gY3NyY2VkdDAwNi5kaXRhICgiQ29udGVudCBhc3Npc3QiKS0tPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlPC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRvIGdldCBoZWxwIGluIGFkZGluZyBtYXJrdXAgdG8gYSBmaWxlLCB5b3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdA0KLWluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcNCi1vciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idHNyY2VkdDAwNXwxfGNvbnRlbnRhc3Npc3RhbmNlc3RydWN0dXJlZHRleHRlZGl0b3JzIg0KLXN0YXR1cz0ibmV3Ij5jb250ZW50IGFzc2lzdGFuY2U8aW5kZXh0ZXJtPnN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybSBrZXlyZWY9InRzcmNlZHQwMDV8MnxzdHJ1Y3R1cmVkdGV4dGVkaXRvcnNjb250ZW50YXNzaXN0YW5jZSIgc3RhdHVzPSJjaGFuZ2VkIj5zdHJ1Y3R1cmVkDQotdGV4dCBlZGl0b3JzPGluZGV4dGVybT5jb250ZW50IGFzc2lzdGFuY2U8aW5kZXh0ZXJtPnRleHQgZWRpdG9yczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+Q29udGVudCBhc3Npc3QgYWxzbyBlbmFibGVzIHlvdSB0byBzZWxlY3QgYW5kIGluc2VydCB0ZW1wbGF0ZXMgaW4NCi1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycy4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHRoZSBzb3VyY2UgZmlsZSBwcm92aWRlcw0KLXRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uPC9jb250ZXh0Pg0KLTxzdGVwcy11bm9yZGVyZWQ+DQotPHN0ZXA+PGNtZD48L2NtZD48aW5mbz5Zb3UgY2FuIHJlcXVlc3QgY29udGVudCBhc3Npc3QgaW4gZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcNCi10d28gd2F5czo8L2luZm8+DQotPGNob2ljZXM+DQotPGNob2ljZT5Gcm9tIHRoZSA8dWljb250cm9sPkVkaXQ8L3VpY29udHJvbD4gbWVudSwgc2VsZWN0IDx1aWNvbnRyb2w+Q29udGVudA0KLUFzc2lzdDwvdWljb250cm9sPjwvY2hvaWNlPg0KLTxjaG9pY2U+UHJlc3MgQ3RybCtTcGFjZTwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08aW5mbz48cD5JbiBhZGRpdGlvbiwgeW91IGNhbiBzZXQgYSBwcmVmZXJlbmNlIHRoYXQgY2F1c2VzIGNvbnRlbnQgYXNzaXN0DQotdG8gcG9wIHVwIGF1dG9tYXRpY2FsbHkgd2hlbiBjZXJ0YWluIGNoYXJhY3RlcnMgYXJlIHR5cGVkLCBzdWNoIGFzIDxjb2RlcGg+LjwvY29kZXBoPiBpbg0KLXRoZSBjYXNlIG9mIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+IG9yIDxjb2RlcGg+Jmx0OzwvY29kZXBoPiBpbiB0aGUgY2FzZQ0KLW9mIEhUTUwgYW5kIFhNTC4gVG8gc2V0IHRoaXMgcHJlZmVyZW5jZSwgc2VsZWN0IDx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4gZnJvbQ0KLXRoZSA8dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPiBtZW51LCBhbmQgdGhlbiBzZWxlY3QgPHVpY29udHJvbD5XZWIgYW5kDQotWE1MIEZpbGVzPC91aWNvbnRyb2w+LCBmb2xsb3dlZCBieSBvbmUgb2YgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZXM6PHVsPg0KLTxsaT48bWVudWNhc2NhZGU+PHVpY29udHJvbD5IVE1MIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5IVE1MIFNvdXJjZTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+PC9saT4NCi08bGk+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+SmF2YVNjcmlwdCBGaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+SmF2YVNjcmlwdA0KLVNvdXJjZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9saT4NCi08bGk+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+WE1MIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwgU291cmNlPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT48L2xpPg0KLTwvdWw+SW4gdGhlIDx1aWNvbnRyb2w+Q29udGVudCBhc3Npc3Q8L3VpY29udHJvbD4gZ3JvdXAgYm94LCBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+QXV0b21hdGljYWxseQ0KLW1ha2Ugc3VnZ2VzdGlvbnM8L3VpY29udHJvbD4gY2hlY2sgYm94LCBhbmQgc3VwcGx5IGFueSBhZGRpdGlvbmFsIGNoYXJhY3RlcnMNCi10aGF0IHNob3VsZCB0cmlnZ2VyIGNvbnRlbnQgYXNzaXN0LjwvcD48cD5JZiB5b3VyIGN1cnNvciBpcyBpbiBhIHBvc2l0aW9uDQotd2hlcmUgY29udGVudCBhc3Npc3QgaXMgYXZhaWxhYmxlLCBhIHBvcC11cCBsaXN0IG9mIGFsbCBhdmFpbGFibGUgY2hvaWNlcw0KLWlzIGRpc3BsYXllZC4gRm9yIGVhY2ggb2YgdGhlc2UgY2hvaWNlcywgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgY29kZSBpcw0KLXByb3ZpZGVkLjwvcD48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHMtdW5vcmRlcmVkPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPCEtLSAgPGxpbmsgaHJlZj0iY29udGVudGFzc2lzdCIgdHlwZT0ic2hvd21lIiBmb3JtYXQ9InZpZXdsZXQiPjxsaW5rdGV4dD5TaG93IE1lPC9saW5rdGV4dD48L2xpbms+ICAtLT4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNi5kaXRhIj48bGlua3RleHQ+Q29udGVudCBhc3Npc3Q8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyMy5kaXRhIj48bGlua3RleHQ+TWFraW5nIGNvbnRlbnQgYXNzaXN0IHdvcmsgZm9yIEpTUA0KLWZpbGVzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNy5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UNCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjY4ZmMxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iR2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVG8gZ2V0IGhlbHAgaW4gYWRkaW5nIG1hcmt1cCB0byBhIGZpbGUsIHlvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVG8gZ2V0IGhlbHAgaW4gYWRkaW5nIG1hcmt1cCB0byBhIGZpbGUsIHlvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4iIC8+Ci08bWV0YSBjb250ZW50PSJjb250ZW50IGFzc2lzdGFuY2UsIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgdGV4dCBlZGl0b3JzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iY29udGVudCBhc3Npc3RhbmNlLCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMsIHRleHQgZWRpdG9ycyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDIzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMDUiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAwNSI+PGEgbmFtZT0idHNyY2VkdDAwNSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2gxPgotCi0KLQotCi0KLTxkaXY+PHA+VG8gZ2V0IGhlbHAgaW4gYWRkaW5nIG1hcmt1cCB0byBhIGZpbGUsIHlvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0Ci1pbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIENvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnCi1vciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+Q29udGVudCBhc3Npc3QgYWxzbyBlbmFibGVzIHlvdSB0byBzZWxlY3QgYW5kIGluc2VydCB0ZW1wbGF0ZXMgaW4KLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzCi10aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLjwvZGl2PgotCi0KLTxkaXYgY2xhc3M9InAiPjxzcGFuIC8+IFlvdSBjYW4gcmVxdWVzdCBjb250ZW50IGFzc2lzdCBpbiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZwotdHdvIHdheXM6Ci08dWw+Ci08bGk+RnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4gbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRlbnQKLUFzc2lzdDwvc3Bhbj48L2xpPgotCi08bGk+UHJlc3MgQ3RybCtTcGFjZTwvbGk+Ci0KLTwvdWw+Ci0KLSA8ZGl2IGNsYXNzPSJwIj5JbiBhZGRpdGlvbiwgeW91IGNhbiBzZXQgYSBwcmVmZXJlbmNlIHRoYXQgY2F1c2VzIGNvbnRlbnQgYXNzaXN0Ci10byBwb3AgdXAgYXV0b21hdGljYWxseSB3aGVuIGNlcnRhaW4gY2hhcmFjdGVycyBhcmUgdHlwZWQsIHN1Y2ggYXMgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Ljwvc2FtcD4gaW4KLXRoZSBjYXNlIG9mIEphdmFTY3JpcHTihKIgb3IgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0Ozwvc2FtcD4gaW4gdGhlIGNhc2UKLW9mIEhUTUwgYW5kIFhNTC4gVG8gc2V0IHRoaXMgcHJlZmVyZW5jZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPiBmcm9tCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiBtZW51LCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZAotWE1MIEZpbGVzPC9zcGFuPiwgZm9sbG93ZWQgYnkgb25lIG9mIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2VzOjx1bD4KLTxsaT48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBTb3VyY2U8L3NwYW4+Ci08L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+SmF2YVNjcmlwdCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KYXZhU2NyaXB0Ci1Tb3VyY2U8L3NwYW4+PC9zcGFuPjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgU291cmNlPC9zcGFuPgotPC9zcGFuPjwvbGk+Ci0KLTwvdWw+Ci1JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGVudCBhc3Npc3Q8L3NwYW4+IGdyb3VwIGJveCwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BdXRvbWF0aWNhbGx5Ci1tYWtlIHN1Z2dlc3Rpb25zPC9zcGFuPiBjaGVjayBib3gsIGFuZCBzdXBwbHkgYW55IGFkZGl0aW9uYWwgY2hhcmFjdGVycwotdGhhdCBzaG91bGQgdHJpZ2dlciBjb250ZW50IGFzc2lzdC48L2Rpdj4KLTxwPklmIHlvdXIgY3Vyc29yIGlzIGluIGEgcG9zaXRpb24KLXdoZXJlIGNvbnRlbnQgYXNzaXN0IGlzIGF2YWlsYWJsZSwgYSBwb3AtdXAgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGNob2ljZXMKLWlzIGRpc3BsYXllZC4gRm9yIGVhY2ggb2YgdGhlc2UgY2hvaWNlcywgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgY29kZSBpcwotcHJvdmlkZWQuPC9wPgotPC9kaXY+Ci0KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA2Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uIj5Db250ZW50IGFzc2lzdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDIzLmh0bWwiIHRpdGxlPSJIYXZpbmcgdGhlIHByb3BlciBmaWxlcyBkZWZpbmVkIGluIHRoZSBKYXZhIGJ1aWxkIGNsYXNzIHBhdGggaXMgZXNzZW50aWFsIGZvciBjb250ZW50IGFzc2lzdCB0byB3b3JrIHByb3Blcmx5IGluIEpTUCBmaWxlcy4gSXQgaXMgYWxzbyBlc3NlbnRpYWwgZm9yIHRoZSBsaW5rcyBidWlsZGVyIHRvIGJlIGFibGUgdG8gY29ycmVjdGx5IHJlc29sdmUgbGlua3MgdG8gc2VydmxldHMgb3IgSmF2YSBiZWFucyBpbiBKU1AgYW5kIEhUTUwgZmlsZXMuIj5NYWtpbmcgY29udGVudCBhc3Npc3Qgd29yayBmb3IgSlNQCi1maWxlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNy5odG1sIiB0aXRsZT0iQ29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZQotdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA3LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDcuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhYThiNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDcuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMDciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNlYXJjaGluZyBvciBmaW5kaW5nIHRleHQgd2l0aGluIGEgZmlsZTwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8aW5kZXh0ZXJtPnRleHQgc2VhcmNoPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08cHJlcmVxPjxub3RlIHR5cGU9InRpcCI+QmVmb3JlIHlvdSBkbyBhIFNlYXJjaCBvcGVyYXRpb24gaW4gYSBzdHJ1Y3R1cmVkDQotdGV4dCBlZGl0b3IsIHNhdmUgdGhlIGZpbGUgeW91IGFyZSBzZWFyY2hpbmcuIFRoZSBzZWFyY2ggZnVuY3Rpb24gd29ya3MgZnJvbQ0KLXRoZSBtb3N0IHJlY2VudGx5IHNhdmVkIHZlcnNpb24gb2YgdGhlIGZpbGUgcmF0aGVyIHRoYW4gZnJvbSB0aGUgY29udGVudHMNCi10aGF0IHlvdSBzZWUgaW4gdGhlIGVkaXRvciBhcmVhLiBZb3UgZG8gbm90IG5lZWQgdG8gc2F2ZSB5b3VyIGZpbGUgYmVmb3JlDQoteW91IGRvIGEgRmluZC9SZXBsYWNlIG9wZXJhdGlvbi4gPC9ub3RlPjwvcHJlcmVxPg0KLTxjb250ZXh0PkVhY2ggc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBwcm92aWRlcyB0d28gd2F5cyB0byBsb2NhdGUgYSB0ZXh0IHN0cmluZw0KLWluIHRoZSBmaWxlIHlvdSBhcmUgZWRpdGluZyBhbmQgb3B0aW9uYWxseSByZXBsYWNlIGl0IHdpdGggYW5vdGhlciBzdHJpbmc6IDxkbD4NCi08ZGxlbnRyeT4NCi08ZHQ+RmluZC9SZXBsYWNlPC9kdD4NCi08ZGQ+TGV0cyB5b3UgbG9jYXRlIHRleHQgaW4gdGhlIGZpbGUgY3VycmVudGx5IGJlaW5nIGVkaXRlZC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+U2VhcmNoPC9kdD4NCi08ZGQ+TGV0cyB5b3UgbG9jYXRlIHRleHQgaW4gZmlsZXMgdGhhdCBoYXZlIGJlZW4gc2F2ZWQgdG8geW91ciB3b3Jrc3BhY2UuPC9kZD4NCi08L2RsZW50cnk+PC9kbD48cD5UbyBsb2NhdGUgYW5kIG9wdGlvbmFsbHkgcmVwbGFjZSB0ZXh0LCBzZWxlY3Qgb25lIG9mIHRoZQ0KLWZvbGxvd2luZyBtZW51IHBhdGhzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzLXVub3JkZXJlZD4NCi08c3RlcD48Y21kPjxtZW51Y2FzY2FkZT48dWljb250cm9sPkVkaXQ8L3VpY29udHJvbD48dWljb250cm9sPkZpbmQvUmVwbGFjZTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IChvciA8dWljb250cm9sPkN0cmwrRjwvdWljb250cm9sPik8L2NtZD48aW5mbz5UaGlzIG9wdGlvbiBpcw0KLXNlbGYtZXhwbGFuYXRvcnkuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzLXVub3JkZXJlZD4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNzg4ZWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGUiIC8+Ci08bWV0YSBjb250ZW50PSJzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgdGV4dCBzZWFyY2giIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgdGV4dCBzZWFyY2giIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDA3IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U2VhcmNoaW5nIG9yIGZpbmRpbmcgdGV4dCB3aXRoaW4gYSBmaWxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDA3Ij48YSBuYW1lPSJ0c3JjZWR0MDA3Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGU8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJwIj48ZGl2IGNsYXNzPSJ0aXAiPjxzcGFuIGNsYXNzPSJ0aXB0aXRsZSI+VGlwOjwvc3Bhbj4gQmVmb3JlIHlvdSBkbyBhIFNlYXJjaCBvcGVyYXRpb24gaW4gYSBzdHJ1Y3R1cmVkCi10ZXh0IGVkaXRvciwgc2F2ZSB0aGUgZmlsZSB5b3UgYXJlIHNlYXJjaGluZy4gVGhlIHNlYXJjaCBmdW5jdGlvbiB3b3JrcyBmcm9tCi10aGUgbW9zdCByZWNlbnRseSBzYXZlZCB2ZXJzaW9uIG9mIHRoZSBmaWxlIHJhdGhlciB0aGFuIGZyb20gdGhlIGNvbnRlbnRzCi10aGF0IHlvdSBzZWUgaW4gdGhlIGVkaXRvciBhcmVhLiBZb3UgZG8gbm90IG5lZWQgdG8gc2F2ZSB5b3VyIGZpbGUgYmVmb3JlCi15b3UgZG8gYSBGaW5kL1JlcGxhY2Ugb3BlcmF0aW9uLiA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5FYWNoIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgcHJvdmlkZXMgdHdvIHdheXMgdG8gbG9jYXRlIGEgdGV4dCBzdHJpbmcKLWluIHRoZSBmaWxlIHlvdSBhcmUgZWRpdGluZyBhbmQgb3B0aW9uYWxseSByZXBsYWNlIGl0IHdpdGggYW5vdGhlciBzdHJpbmc6IDxkbD4KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkZpbmQvUmVwbGFjZTwvZHQ+Ci0KLTxkZD5MZXRzIHlvdSBsb2NhdGUgdGV4dCBpbiB0aGUgZmlsZSBjdXJyZW50bHkgYmVpbmcgZWRpdGVkLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlNlYXJjaDwvZHQ+Ci0KLTxkZD5MZXRzIHlvdSBsb2NhdGUgdGV4dCBpbiBmaWxlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZCB0byB5b3VyIHdvcmtzcGFjZS48L2RkPgotCi08L2RsPgotPHA+VG8gbG9jYXRlIGFuZCBvcHRpb25hbGx5IHJlcGxhY2UgdGV4dCwgc2VsZWN0IG9uZSBvZiB0aGUKLWZvbGxvd2luZyBtZW51IHBhdGhzOjwvcD4KLTwvZGl2PgotCi0KLTxkaXYgY2xhc3M9InAiPjxzcGFuPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5kL1JlcGxhY2U8L3NwYW4+Ci08L3NwYW4+IChvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdHJsK0Y8L3NwYW4+KTwvc3Bhbj4gVGhpcyBvcHRpb24gaXMKLXNlbGYtZXhwbGFuYXRvcnkuPC9kaXY+Ci0KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+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+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGM2MmQzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ2hlY2tpbmcgc3BlbGxpbmciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gY2hlY2sgc3BlbGxpbmcgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBjaGVjayBzcGVsbGluZyBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIiAvPgotPG1ldGEgY29udGVudD0ic3BlbGwgY2hlY2ssIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic3BlbGwgY2hlY2ssIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAxMCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNoZWNraW5nIHNwZWxsaW5nPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDEwIj48YSBuYW1lPSJ0c3JjZWR0MDEwIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DaGVja2luZyBzcGVsbGluZzwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGNoZWNrIHNwZWxsaW5nIGluIGEgc3RydWN0dXJlZAotdGV4dCBlZGl0b3IuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+VGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIChhY2Nlc3NlZCBmcm9tCi10aGUgUHJvamVjdCBFeHBsb3JlcidzIHBvcC11cCBtZW51IG9yIGJ5IGNsaWNraW5nIHRoZSBTb3VyY2UgdGFiIGluIGNlcnRhaW4KLWVkaXRvcnMpIHByb3ZpZGUgYSBzcGVsbCBjaGVja2luZyBmZWF0dXJlLjwvcD4KLTxwPlRvIGNoZWNrIHNwZWxsaW5nIGluIGFuIEhUTUwsCi1YTUwsIG9yIG90aGVyIGZpbGUgdGhhdCB1c2VzIGEgc3RydWN0dXJlZCBtYXJrdXAgbGFuZ3VhZ2U6PC9wPgotIDwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+KE9wdGlvbmFsKSBUbyBzZWxlY3QgdGhlIGRpY3Rpb25hcnkgdGhhdCB3aWxsIGJlIHVzZWQsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+Ci08c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BlbGwKLUNoZWNrPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5PcGVuIGluIGEgIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgdGhlIGZpbGUgd2hvc2Ugc3BlbGxpbmcgeW91IHdhbnQKLXRvIGNoZWNrLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U3RhcnQgdGhlIHNwZWxsaW5nIGNoZWNrZXIgYnkgY2xpY2tpbmcgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BlbGwgQ2hlY2s8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlR5cGUgYSBuZXcgc3BlbGxpbmcgaW50byB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2hhbmdlIHRvPC9zcGFuPiBmaWVsZCwKLW9yIHNlbGVjdCBvbmUgb2YgdGhlIGF2YWlsYWJsZSBvcHRpb25zLiBDbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2hhbmdlPC9zcGFuPiBidXR0b24KLXRvIGNoYW5nZSB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgd29yZCBpbiB0aGUgY3VycmVudCBkb2N1bWVudC4gQ2xpY2sKLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DaGFuZ2UgQWxsPC9zcGFuPiBidXR0b24gdG8gY2hhbmdlIGFsbCBpbnN0YW5jZXMgb2YgdGhlCi13b3JkIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LiBZb3UgY2FuIGFsc28gY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4gYnV0dG9uCi10byBhZGQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzcGVsbGluZyB0byB5b3VyIGRpY3Rpb25hcnkuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5Vc2UgdGhlIGNvbnRyb2xzIGluIHRoZSBTcGVsbCBDaGVjayBkaWFsb2cgYm94IHRvIGlnbm9yZSwgY2hhbmdlLAotb3IgYWRkIHRlcm1zIHRvIHRoZSBjdXJyZW50IGRpY3Rpb25hcnkuIChUbyByZW1vdmUgYSB3b3JkIGFmdGVyIGl0IGhhcyBiZWVuCi1hZGRlZCB0byB0aGUgZGljdGlvbmFyeSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRpY3Rpb25hcnk8L3NwYW4+IHB1c2gKLWJ1dHRvbi4pPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMmJiMWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDE0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGlzIGRvY3VtZW50YXRpb24gZXhwbGFpbnMgaG93IHRvIGN1c3RvbWl6ZSB0aGUgU25pcHBldHMgdmlldw0KLWJ5IGFkZGluZyBhIG5ldyBkcmF3ZXIuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c25pcHBldHM8aW5kZXh0ZXJtPmRyYXdlciBjdXN0b21pemF0aW9uPC9pbmRleHRlcm0+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+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTE0NWUwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIHNuaXBwZXRzIGRyYXdlcnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iIC8+Ci08bWV0YSBjb250ZW50PSJzbmlwcGV0cywgZHJhd2VyIGN1c3RvbWl6YXRpb24iIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzbmlwcGV0cywgZHJhd2VyIGN1c3RvbWl6YXRpb24iIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDAxLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDIyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTYuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDE0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMTQiPjxhIG5hbWU9InRzcmNlZHQwMTQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9oMT4KLQotCi0KLTxkaXY+PHA+VGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcKLWJ5IGFkZGluZyBhIG5ldyBkcmF3ZXIuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBhZGQgYSBuZXcgZHJhd2VyIHRvIHRoZSBTbmlwcGV0cyB2aWV3OjwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+UmlnaHQtY2xpY2sgYW55d2hlcmUgaW4gdGhlIFNuaXBwZXRzIHZpZXcgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXN0b21pemU8L3NwYW4+IGZyb20KLXRoZSBwb3AtdXAgbWVudS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNhdGVnb3J5PC9zcGFuPgotPC9zcGFuPiBhbmQgdHlwZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGRyYXdlciBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPk9wdGlvbmFsbHksIHR5cGUgYSBkZXNjcmlwdGlvbiBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVzY3JpcHRpb248L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIGRyYXdlcidzIGJlaGF2aW9yIGJ5IGNoZWNraW5nIGNoZWNrIGJveGVzIGFzIGFwcHJvcHJpYXRlLgotVGhlIGNoZWNrIGJveGVzIGFyZSBhcyBmb2xsb3dzOjwvc3Bhbj4KLQotPHRhYmxlIGNsYXNzPSJjaG9pY2V0YWJsZWJvcmRlciIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIHJ1bGVzPSJyb3dzIiBmcmFtZT0iaHNpZGVzIiBib3JkZXI9IjEiPgotPHRoZWFkPjx0cj48dGggdmFsaWduPSJib3R0b20iIGlkPSJOMTAwOTAtb3B0aW9uIiBhbGlnbj0ibGVmdCI+T3B0aW9uPC90aD4KLTx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9Ik4xMDA5MC1kZXNjIiBhbGlnbj0ibGVmdCI+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD4KLTx0Ym9keT4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA5MC1vcHRpb24iIGlkPSJOMTAwOUEiPjxzdHJvbmc+SGlkZTwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA5MC1kZXNjIE4xMDA5QSI+RG8gbm90IGRpc3BsYXkgdGhlIGRyYXdlci48L3RkPgotCi08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwOTAtb3B0aW9uIiBpZD0iTjEwMEFBIj48c3Ryb25nPk9wZW4gZHJhd2VyIGF0IHN0YXJ0LXVwPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDkwLWRlc2MgTjEwMEFBIj5BdCBzdGFydC11cCwgZGlzcGxheQotdGhlIGRyYXdlcidzIGl0ZW1zLjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwOTAtb3B0aW9uIiBpZD0iTjEwMEI5Ij48c3Ryb25nPlBpbiBkcmF3ZXIgb3BlbiBhdCBzdGFydC11cDwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA5MC1kZXNjIE4xMDBCOSI+S2VlcCB0aGUgZHJhd2VyCi1vcGVuLjwvdGQ+Ci08L3RyPgotCi08L3Rib2R5PjwvdGFibGU+Ci0KLTwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uIFRoZSBuZXcgZHJhd2VyIHdpbGwgYmUgYWRkZWQgdG8KLXRoZSBsaXN0IG9mIGRyYXdlcnMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiI+U25pcHBldHMgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTUuaHRtbCIgdGl0bGU9IiI+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjIuaHRtbCIgdGl0bGU9IiI+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE2Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBkZWxldGUgb3IgaGlkZSBkcmF3ZXJzIGFuZCBpdGVtcyBpbiB0aGUgU25pcHBldHMgdmlldy4iPkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yCi1kcmF3ZXJzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYmNjZWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDE1IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJ0c3JjZWR0MDE1fDJ8c25pcHBldGl0ZW1zYWRkaW5ndG9kcmF3ZXJzIiBzdGF0dXM9ImNoYW5nZWQiPnNuaXBwZXRzPGluZGV4dGVybT5kcmF3ZXJzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gVG8gYWRkIG5ldyBpdGVtcyB0byBhbiBleGlzdGluZyBzbmlwcGV0cyBkcmF3ZXI6PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNob2ljZXM6PC9jbWQ+PGluZm8+PHRhYmxlIGNvbHNlcD0iMCIgZnJhbWU9InRvcGJvdCI+DQotPHRncm91cCBjb2xzPSIyIj48Y29sc3BlYyBjb2xuYW1lPSJjb2wxIiBjb2x3aWR0aD0iNzIqIi8+PGNvbHNwZWMgY29sbmFtZT0iY29sMiINCi1jb2x3aWR0aD0iMTI3KiIvPg0KLTx0aGVhZD4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIiB2YWxpZ249InRvcCI+VG8gc3RhcnQgd2l0aCB0aGlzOjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiIHZhbGlnbj0idG9wIj5EbyB0aGlzOjwvZW50cnk+DQotPC9yb3c+DQotPC90aGVhZD4NCi08dGJvZHk+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+QW4gZW1wdHkgaXRlbSB0aGF0IHlvdSBjYW4gZWRpdDwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPlJpZ2h0LWNsaWNrIGFueXdoZXJlIGluIGFuIGV4aXN0aW5nIGRyYXdlciwgc2VsZWN0IDx1aWNvbnRyb2w+Q3VzdG9taXplPC91aWNvbnRyb2w+LA0KLWFuZCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48dWljb250cm9sPk5ldyBJdGVtPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5FeGlzdGluZyB0ZXh0IHBhc3RlZCBpbnRvIGEgbmV3IGl0ZW0gaW4gYW4gZXhpc3RpbmcNCi1kcmF3ZXI8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5Db3B5IG9yIGN1dCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuIEluIHRoZSBTbmlwcGV0cyB2aWV3LA0KLXJpZ2h0LWNsaWNrIGFueXdoZXJlIGluIGFuIGV4aXN0aW5nIGRyYXdlciBhbmQgY2xpY2sgPHVpY29udHJvbD5QYXN0ZTwvdWljb250cm9sPi48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkV4aXN0aW5nIHRleHQgcGFzdGVkIGludG8gYSBuZXcgaXRlbSBpbiBhIG5ldyBvciBleGlzdGluZw0KLWRyYXdlcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPlNlbGVjdCB0aGUgdGV4dCwgcmlnaHQtY2xpY2ssIGNsaWNrIDx1aWNvbnRyb2w+QWRkIHRvDQotU25pcHBldHM8L3VpY29udHJvbD4sIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGRyYXdlciBpbiB0aGUgU25pcHBldHMgdmlldw0KLXRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCB0aGUgaXRlbSwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+PC9pbmZvPjxzdGVwcmVzdWx0PkEgPHdpbnRpdGxlPkN1c3RvbWl6ZSBQYWxldHRlPC93aW50aXRsZT4gd2luZG93DQotYXBwZWFycy48L3N0ZXByZXN1bHQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VHlwZSBhIG5hbWUgZm9yIHRoZSBuZXcgaXRlbSwgYW5kLCBvcHRpb25hbGx5LCBwcm92aWRlIGEgZGVzY3JpcHRpb24uPC9jbWQ+DQotPHN0ZXByZXN1bHQ+VGhlIHZhbHVlIHRoYXQgeW91IHR5cGUgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZA0KLXdpbGwgYXBwZWFyIG5leHQgdG8gdGhlIGl0ZW0ncyBpY29uIGluIHRoZSBTbmlwcGV0cyB2aWV3Ljwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBpbmNsdWRlIGluIHRoZSA8dWljb250cm9sPlRlbXBsYXRlIFBhdHRlcm48L3VpY29udHJvbD4gZmllbGQNCi1hIHZhcmlhYmxlIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBkZWZpbmVkLCBjbGljayA8dWljb250cm9sPkluc2VydCBWYXJpYWJsZQ0KLVBsYWNlaG9sZGVyPC91aWNvbnRyb2w+LiA8L2NtZD48aW5mbz5BIHZhcmlhYmxlIHBsYWNlaG9sZGVyIGlzIGEgbWFya2VyIHRoYXQsDQotd2hlbiB0YWdnaW5nIGlzIGluc2VydGVkIGludG8gdGhlIGFjdGl2ZSBmaWxlLCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB2YWx1ZQ0KLXRoYXQgaXMgZW50ZXJlZCBpbnRvIHRoZSA8dWljb250cm9sPkluc2VydCBUZW1wbGF0ZTo8L3VpY29udHJvbD48dmFybmFtZT5JdGVtX25hbWU8L3Zhcm5hbWU+IGRpYWxvZw0KLWF0IGluc2VydGlvbiB0aW1lLiBDbGlja2luZyB0aGUgPHVpY29udHJvbD5JbnNlcnQgVmFyaWFibGUgUGxhY2Vob2xkZXI8L3VpY29udHJvbD4gYnV0dG9uDQotb3IgdHlwaW5nIEN0cmwrU3BhY2UgYWN0aXZhdGVzIGEgcG9wLXVwIGluIHRoZSB0ZXh0IGFyZWEgdGhhdCBwcm9tcHRzIHlvdQ0KLXdpdGggdGhlIGNvcnJlY3Qgc2VxdWVuY2VzIHRvIGNyZWF0ZSBhIG1hcmtlciBmb3IgdGhlIHZhcmlhYmxlLjwvaW5mbz48c3RlcHhtcD5Gb3INCi1leGFtcGxlLCBpZiB5b3UgY3JlYXRlIHR3byB2YXJpYWJsZXMgbmFtZWQgPHZhcm5hbWU+dXJpPC92YXJuYW1lPiBhbmQgPHZhcm5hbWU+cHJlZml4PC92YXJuYW1lPiwNCi1hbmQgY3JlYXRlIHZhcmlhYmxlIHBsYWNlaG9sZGVycyBmb3IgYm90aCwgdGhlIHRlbXBsYXRlIHBhdHRlcm4gbWlnaHQgbG9vaw0KLWxpa2UgdGhpczo8Y29kZWJsb2NrPiZsdDslQCB0YWdsaWIgdXJpPSIke3VyaX0iIHByZWZpeD0iJHtwcmVmaXh9IiAlPjwvY29kZWJsb2NrPjwvc3RlcHhtcD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+VGhlIG5ldyBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIGFwcHJvcHJpYXRlDQotZHJhd2VyLjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDEuZGl0YSI+PGxpbmt0ZXh0PlNuaXBwZXRzIHZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI2LmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyMi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNi5kaXRhIj48bGlua3RleHQ+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3INCi1kcmF3ZXJzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMTVlZTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiIC8+Ci08bWV0YSBjb250ZW50PSJzbmlwcGV0cywgZHJhd2VycyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InNuaXBwZXRzLCBkcmF3ZXJzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwMS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyMi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE2Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAxNSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDE1Ij48YSBuYW1lPSJ0c3JjZWR0MDE1Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiBUbyBhZGQgbmV3IGl0ZW1zIHRvIGFuIGV4aXN0aW5nIHNuaXBwZXRzIGRyYXdlcjo8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5EbyBvbmUgb2YgdGhlIGZvbGxvd2luZyBjaG9pY2VzOjwvc3Bhbj4gCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJoc2lkZXMiIGJvcmRlcj0iMSIgcnVsZXM9InJvd3MiPgotPHRoZWFkIGFsaWduPSJsZWZ0Ij4KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjM2LjE4MDkwNDUyMjYxMzA3JSIgaWQ9Ik4xMDA3MCI+VG8gc3RhcnQgd2l0aCB0aGlzOjwvdGg+Ci0KLTx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjYzLjgxOTA5NTQ3NzM4NjkzJSIgaWQ9Ik4xMDA3OCI+RG8gdGhpczo8L3RoPgotCi08L3RyPgotCi08L3RoZWFkPgotCi08dGJvZHk+Ci08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzNi4xODA5MDQ1MjI2MTMwNyUiIGhlYWRlcnM9Ik4xMDA3MCAiPkFuIGVtcHR5IGl0ZW0gdGhhdCB5b3UgY2FuIGVkaXQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI2My44MTkwOTU0NzczODY5MyUiIGhlYWRlcnM9Ik4xMDA3OCAiPlJpZ2h0LWNsaWNrIGFueXdoZXJlIGluIGFuIGV4aXN0aW5nIGRyYXdlciwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1c3RvbWl6ZTwvc3Bhbj4sCi1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3IEl0ZW08L3NwYW4+Ci08L3NwYW4+LjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjM2LjE4MDkwNDUyMjYxMzA3JSIgaGVhZGVycz0iTjEwMDcwICI+RXhpc3RpbmcgdGV4dCBwYXN0ZWQgaW50byBhIG5ldyBpdGVtIGluIGFuIGV4aXN0aW5nCi1kcmF3ZXI8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI2My44MTkwOTU0NzczODY5MyUiIGhlYWRlcnM9Ik4xMDA3OCAiPkNvcHkgb3IgY3V0IHRleHQgdG8gdGhlIGNsaXBib2FyZC4gSW4gdGhlIFNuaXBwZXRzIHZpZXcsCi1yaWdodC1jbGljayBhbnl3aGVyZSBpbiBhbiBleGlzdGluZyBkcmF3ZXIgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhc3RlPC9zcGFuPi48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzNi4xODA5MDQ1MjI2MTMwNyUiIGhlYWRlcnM9Ik4xMDA3MCAiPkV4aXN0aW5nIHRleHQgcGFzdGVkIGludG8gYSBuZXcgaXRlbSBpbiBhIG5ldyBvciBleGlzdGluZwotZHJhd2VyPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMuODE5MDk1NDc3Mzg2OTMlIiBoZWFkZXJzPSJOMTAwNzggIj5TZWxlY3QgdGhlIHRleHQsIHJpZ2h0LWNsaWNrLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgdG8KLVNuaXBwZXRzPC9zcGFuPiwgc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZHJhd2VyIGluIHRoZSBTbmlwcGV0cyB2aWV3Ci10byB3aGljaCB5b3Ugd2FudCB0byBhZGQgdGhlIGl0ZW0sIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC90ZD4KLQotPC90cj4KLQotPC90Ym9keT4KLQotPC90YWJsZT4KLTwvZGl2PgotIEEgPHNwYW4gY2xhc3M9IndpbnRpdGxlIj5DdXN0b21pemUgUGFsZXR0ZTwvc3Bhbj4gd2luZG93Ci1hcHBlYXJzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG5hbWUgZm9yIHRoZSBuZXcgaXRlbSwgYW5kLCBvcHRpb25hbGx5LCBwcm92aWRlIGEgZGVzY3JpcHRpb24uPC9zcGFuPgotIFRoZSB2YWx1ZSB0aGF0IHlvdSB0eXBlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBmaWVsZAotd2lsbCBhcHBlYXIgbmV4dCB0byB0aGUgaXRlbSdzIGljb24gaW4gdGhlIFNuaXBwZXRzIHZpZXcuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBpbmNsdWRlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UZW1wbGF0ZSBQYXR0ZXJuPC9zcGFuPiBmaWVsZAotYSB2YXJpYWJsZSB0aGF0IHlvdSBoYXZlIGFscmVhZHkgZGVmaW5lZCwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5zZXJ0IFZhcmlhYmxlCi1QbGFjZWhvbGRlcjwvc3Bhbj4uIDwvc3Bhbj4gQSB2YXJpYWJsZSBwbGFjZWhvbGRlciBpcyBhIG1hcmtlciB0aGF0LAotd2hlbiB0YWdnaW5nIGlzIGluc2VydGVkIGludG8gdGhlIGFjdGl2ZSBmaWxlLCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB2YWx1ZQotdGhhdCBpcyBlbnRlcmVkIGludG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydCBUZW1wbGF0ZTo8L3NwYW4+PHZhciBjbGFzcz0idmFybmFtZSI+SXRlbV9uYW1lPC92YXI+IGRpYWxvZwotYXQgaW5zZXJ0aW9uIHRpbWUuIENsaWNraW5nIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnNlcnQgVmFyaWFibGUgUGxhY2Vob2xkZXI8L3NwYW4+IGJ1dHRvbgotb3IgdHlwaW5nIEN0cmwrU3BhY2UgYWN0aXZhdGVzIGEgcG9wLXVwIGluIHRoZSB0ZXh0IGFyZWEgdGhhdCBwcm9tcHRzIHlvdQotd2l0aCB0aGUgY29ycmVjdCBzZXF1ZW5jZXMgdG8gY3JlYXRlIGEgbWFya2VyIGZvciB0aGUgdmFyaWFibGUuIEZvcgotZXhhbXBsZSwgaWYgeW91IGNyZWF0ZSB0d28gdmFyaWFibGVzIG5hbWVkIDx2YXIgY2xhc3M9InZhcm5hbWUiPnVyaTwvdmFyPiBhbmQgPHZhciBjbGFzcz0idmFybmFtZSI+cHJlZml4PC92YXI+LAotYW5kIGNyZWF0ZSB2YXJpYWJsZSBwbGFjZWhvbGRlcnMgZm9yIGJvdGgsIHRoZSB0ZW1wbGF0ZSBwYXR0ZXJuIG1pZ2h0IGxvb2sKLWxpa2UgdGhpczo8cHJlPiZsdDslQCB0YWdsaWIgdXJpPSIke3VyaX0iIHByZWZpeD0iJHtwcmVmaXh9IiAlJmd0OzwvcHJlPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlIG5ldyBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIGFwcHJvcHJpYXRlCi1kcmF3ZXIuPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiI+U25pcHBldHMgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTQuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBleHBsYWlucyBob3cgdG8gY3VzdG9taXplIHRoZSBTbmlwcGV0cyB2aWV3IGJ5IGFkZGluZyBhIG5ldyBkcmF3ZXIuIj5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyMi5odG1sIiB0aXRsZT0iIj5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTYuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlbGV0ZSBvciBoaWRlIGRyYXdlcnMgYW5kIGl0ZW1zIGluIHRoZSBTbmlwcGV0cyB2aWV3LiI+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IKLWRyYXdlcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTYuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2MjRhZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTYuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMTYiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPkRlbGV0aW5nIGFuZCBoaWRpbmcgZHJhd2VycyBhbmQgaXRlbXM8L25hdnRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQNCi1pdGVtcyBpbiB0aGUgU25pcHBldHMgdmlldy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5kcmF3ZXJzPGluZGV4dGVybT5zbmlwcGV0cyB2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5zbmlwcGV0czxpbmRleHRlcm0+bW9kaWZ5aW5nIGRyYXdlcnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PllvdSBjYW4gaGlkZSBhbnkgZHJhd2VyIG9yIGl0ZW0gdGhhdCBzaG93cyB1cCBpbiB0aGUgU25pcHBldHMgdmlldy4NCi1JZiB0aGUgZHJhd2VyIG9yIGl0ZW0gaXMgdXNlci1kZWZpbmVkLCB5b3UgY2FuIGRlbGV0ZSBpdCBwZXJtYW5lbnRseS4gVG8gZGVsZXRlDQotb3IgaGlkZSBhIGRyYXdlciBvciBpdGVtLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIGl0ZW0gb3IgZHJhd2VyIHRoYXQgeW91IHdhbnQgdG8gcmVtb3ZlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIGFuZCBzZWxlY3QgPHVpY29udHJvbD5DdXN0b21pemU8L3VpY29udHJvbD4gZnJvbSB0aGUNCi1wb3AtdXAgbWVudS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIGl0ZW0gb3IgZHJhd2VyIGFuZCBjbGljayA8dWljb250cm9sPkRlbGV0ZTwvdWljb250cm9sPiBvciA8dWljb250cm9sPkhpZGU8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi4gVGhlIGl0ZW0gb3IgZHJhd2VyIHdpbGwgYmUgZGVsZXRlZA0KLW9yIGhpZGRlbiBmcm9tIHRoZSBTbmlwcGV0cyB2aWV3LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDEuZGl0YSI+PGxpbmt0ZXh0PlNuaXBwZXRzIHZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI2LmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNS5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDIyLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwZDM3Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQgaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlbGV0ZSBvciBoaWRlIGRyYXdlcnMgYW5kIGl0ZW1zIGluIHRoZSBTbmlwcGV0cyB2aWV3LiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImRyYXdlcnMsIHNuaXBwZXRzIHZpZXcsIHNuaXBwZXRzLCBtb2RpZnlpbmcgZHJhd2VycyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImRyYXdlcnMsIHNuaXBwZXRzIHZpZXcsIHNuaXBwZXRzLCBtb2RpZnlpbmcgZHJhd2VycyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDEuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyMi5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMTYiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDE2Ij48YSBuYW1lPSJ0c3JjZWR0MDE2Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBkZWxldGUgb3IgaGlkZSBkcmF3ZXJzIGFuZAotaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIGhpZGUgYW55IGRyYXdlciBvciBpdGVtIHRoYXQgc2hvd3MgdXAgaW4gdGhlIFNuaXBwZXRzIHZpZXcuCi1JZiB0aGUgZHJhd2VyIG9yIGl0ZW0gaXMgdXNlci1kZWZpbmVkLCB5b3UgY2FuIGRlbGV0ZSBpdCBwZXJtYW5lbnRseS4gVG8gZGVsZXRlCi1vciBoaWRlIGEgZHJhd2VyIG9yIGl0ZW0sIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIGl0ZW0gb3IgZHJhd2VyIHRoYXQgeW91IHdhbnQgdG8gcmVtb3ZlLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+UmlnaHQtY2xpY2sgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXN0b21pemU8L3NwYW4+IGZyb20gdGhlCi1wb3AtdXAgbWVudS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlNlbGVjdCB0aGUgaXRlbSBvciBkcmF3ZXIgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlbGV0ZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SGlkZTwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi4gVGhlIGl0ZW0gb3IgZHJhd2VyIHdpbGwgYmUgZGVsZXRlZAotb3IgaGlkZGVuIGZyb20gdGhlIFNuaXBwZXRzIHZpZXcuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiI+U25pcHBldHMgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTQuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBleHBsYWlucyBob3cgdG8gY3VzdG9taXplIHRoZSBTbmlwcGV0cyB2aWV3IGJ5IGFkZGluZyBhIG5ldyBkcmF3ZXIuIj5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNS5odG1sIiB0aXRsZT0iIj5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyMi5odG1sIiB0aXRsZT0iIj5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiMzFiZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMjIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgc25pcHBldCBpdGVtczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c25pcHBldHM8aW5kZXh0ZXJtPmVkaXRpbmcgaXRlbXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiBUbyBtb2RpZnkgYW4gZXhpc3RpbmcgaXRlbSBpbiBhIFNuaXBwZXRzIGRyYXdlciwgY29tcGxldGUgdGhlIHN0ZXBzDQotbGlzdGVkIGJlbG93LiBJZiB5b3UgaGF2ZSBqdXN0IGNvbXBsZXRlZCB0aGUgdGFzayA8eHJlZiBocmVmPSJ0c3JjZWR0MDE1LmRpdGEiDQotdHlwZT0idGFzayI+QWRkaW5nIGFuIGl0ZW0gdG8gYSBzbmlwcGV0cyBkcmF3ZXI8L3hyZWY+IGFuZCB0aGUgPHdpbnRpdGxlPkN1c3RvbWl6ZQ0KLVBhbGV0dGU8L3dpbnRpdGxlPiB3aW5kb3cgaXMgc3RpbGwgb3BlbiwgeW91IGNhbiBza2lwIHN0ZXBzIDEgYW5kIDIuPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBTbmlwcGV0cyB2aWV3LCByaWdodC1jbGljayB0aGUgbmFtZSBvZiB0aGUgaXRlbSB0aGF0IHlvdQ0KLXdhbnQgdG8gbW9kaWZ5LCBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+Q3VzdG9taXplPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPk9wdGlvbmFsbHksIHR5cGUgYSBuZXcgbmFtZSBhbmQgYSBuZXcgZGVzY3JpcHRpb24gZm9yIHRoZSBpdGVtLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGRlY2xhcmUgYSB2YXJpYWJsZSwgY2xpY2sgPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4gYW5kIHR5cGUNCi10aGUgdmFyaWFibGUncyBuYW1lLCBkZXNjcmlwdGlvbiwgYW5kIGRlZmF1bHQgdmFsdWUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gZWRpdCBhbiBleGlzdGluZyB2YXJpYWJsZSwgdHlwZSBvdmVyIHRoZSBleGlzdGluZyB2YWx1ZXMuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gZWRpdCB0aGUgPHVpY29udHJvbD5UZW1wbGF0ZSBQYXR0ZXJuPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlDQotaW50byB0aGUgZmllbGQsIGN1dCBhbmQgcGFzdGUgaW50byB0aGUgZmllbGQsIG9yLCBpZiB5b3UgaGF2ZSBkZWZpbmVkIG9uZQ0KLW9yIG1vcmUgdmFyaWFibGVzLCBjbGljayB0aGUgPHVpY29udHJvbD5JbnNlcnQgVmFyaWFibGUgUGxhY2Vob2xkZXI8L3VpY29udHJvbD4gYnV0dG9uLA0KLWFuZCBkb3VibGUtY2xpY2sgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgeW91IHdhbnQgdG8gaW5zZXJ0LjwvY21kPjxzdGVweG1wPkZvcg0KLWV4YW1wbGUsIGlmIHlvdSBoYXZlIGRlY2xhcmUgdmFyaWFibGVzIG5hbWVkIDx2YXJuYW1lPnVyaTwvdmFybmFtZT4gYW5kIDx2YXJuYW1lPnByZWZpeDwvdmFybmFtZT4sDQotY2xpY2tpbmcgdGhlIGJ1dHRvbiBicmluZ3MgdXAgYSBtZW51IHRoYXQgY29udGFpbnMgdGhvc2UgbmFtZXMuIERvdWJsZS1jbGlja2luZyA8dmFybmFtZT51cmk8L3Zhcm5hbWU+IGluc2VydHMgPGNvZGVwaD4ke3VyaX08L2NvZGVwaD4sDQotYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjxjb2RlYmxvY2s+Jmx0OyVAIHRhZ2xpYiB1cmk9IiR7dXJpfSIgcHJlZml4PSIke3ByZWZpeH0iICU+PC9jb2RlYmxvY2s+PC9zdGVweG1wPg0KLTxzdGVwcmVzdWx0PkxhdGVyLCB3aGVuIHlvdSBpbnNlcnQgdGhlIHNuaXBwZXQgaW50byBhIGZpbGUsIDxjb2RlcGg+JHt1cml9PC9jb2RlcGg+IGFuZCA8Y29kZXBoPiR7cHJlZml4fTwvY29kZXBoPiBhcmUNCi1lYWNoIGNvbnZlcnRlZCB0byB0aGUgZGVmYXVsdCB2YWx1ZSBkZWNsYXJlZCBpbiB0aGUgVmFyaWFibGVzIHRhYmxlLiBVc2Vycw0KLWNhbiByZXBsYWNlIHRoZSBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgPHVpY29udHJvbD5JbnNlcnQgVGVtcGxhdGU6PC91aWNvbnRyb2w+PHZhcm5hbWU+SXRlbV9uYW1lPC92YXJuYW1lPiBkaWFsb2cNCi1hdCBpbnNlcnRpb24gdGltZS48L3N0ZXByZXN1bHQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PlRoZSBtb2RpZmllZCBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIGFwcHJvcHJpYXRlDQotZHJhd2VyLjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDEuZGl0YSI+PGxpbmt0ZXh0PlNuaXBwZXRzIHZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI2LmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNS5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE2LmRpdGEiPjxsaW5rdGV4dD5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcg0KLWRyYXdlcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1OGEwZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgc25pcHBldCBpdGVtcyIgLz4KLTxtZXRhIGNvbnRlbnQ9InNuaXBwZXRzLCBlZGl0aW5nIGl0ZW1zIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic25pcHBldHMsIGVkaXRpbmcgaXRlbXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDAxLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE1Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTYuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDIyIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDIyIj48YSBuYW1lPSJ0c3JjZWR0MDIyIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gVG8gbW9kaWZ5IGFuIGV4aXN0aW5nIGl0ZW0gaW4gYSBTbmlwcGV0cyBkcmF3ZXIsIGNvbXBsZXRlIHRoZSBzdGVwcwotbGlzdGVkIGJlbG93LiBJZiB5b3UgaGF2ZSBqdXN0IGNvbXBsZXRlZCB0aGUgdGFzayA8YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiPkFkZGluZyBhbiBpdGVtIHRvIGEgc25pcHBldHMgZHJhd2VyPC9hPiBhbmQgdGhlIDxzcGFuIGNsYXNzPSJ3aW50aXRsZSI+Q3VzdG9taXplCi1QYWxldHRlPC9zcGFuPiB3aW5kb3cgaXMgc3RpbGwgb3BlbiwgeW91IGNhbiBza2lwIHN0ZXBzIDEgYW5kIDIuPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFNuaXBwZXRzIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBuYW1lIG9mIHRoZSBpdGVtIHRoYXQgeW91Ci13YW50IHRvIG1vZGlmeSwgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXN0b21pemU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wdGlvbmFsbHksIHR5cGUgYSBuZXcgbmFtZSBhbmQgYSBuZXcgZGVzY3JpcHRpb24gZm9yIHRoZSBpdGVtLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gZGVjbGFyZSBhIHZhcmlhYmxlLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+IGFuZCB0eXBlCi10aGUgdmFyaWFibGUncyBuYW1lLCBkZXNjcmlwdGlvbiwgYW5kIGRlZmF1bHQgdmFsdWUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gZWRpdCBhbiBleGlzdGluZyB2YXJpYWJsZSwgdHlwZSBvdmVyIHRoZSBleGlzdGluZyB2YWx1ZXMuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBlZGl0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UZW1wbGF0ZSBQYXR0ZXJuPC9zcGFuPiBmaWVsZCwgdHlwZQotaW50byB0aGUgZmllbGQsIGN1dCBhbmQgcGFzdGUgaW50byB0aGUgZmllbGQsIG9yLCBpZiB5b3UgaGF2ZSBkZWZpbmVkIG9uZQotb3IgbW9yZSB2YXJpYWJsZXMsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnNlcnQgVmFyaWFibGUgUGxhY2Vob2xkZXI8L3NwYW4+IGJ1dHRvbiwKLWFuZCBkb3VibGUtY2xpY2sgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgeW91IHdhbnQgdG8gaW5zZXJ0Ljwvc3Bhbj4gRm9yCi1leGFtcGxlLCBpZiB5b3UgaGF2ZSBkZWNsYXJlIHZhcmlhYmxlcyBuYW1lZCA8dmFyIGNsYXNzPSJ2YXJuYW1lIj51cmk8L3Zhcj4gYW5kIDx2YXIgY2xhc3M9InZhcm5hbWUiPnByZWZpeDwvdmFyPiwKLWNsaWNraW5nIHRoZSBidXR0b24gYnJpbmdzIHVwIGEgbWVudSB0aGF0IGNvbnRhaW5zIHRob3NlIG5hbWVzLiBEb3VibGUtY2xpY2tpbmcgPHZhciBjbGFzcz0idmFybmFtZSI+dXJpPC92YXI+IGluc2VydHMgPHNhbXAgY2xhc3M9ImNvZGVwaCI+JHt1cml9PC9zYW1wPiwKLWFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8cHJlPiZsdDslQCB0YWdsaWIgdXJpPSIke3VyaX0iIHByZWZpeD0iJHtwcmVmaXh9IiAlJmd0OzwvcHJlPgotCi0gTGF0ZXIsIHdoZW4geW91IGluc2VydCB0aGUgc25pcHBldCBpbnRvIGEgZmlsZSwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+JHt1cml9PC9zYW1wPiBhbmQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+JHtwcmVmaXh9PC9zYW1wPiBhcmUKLWVhY2ggY29udmVydGVkIHRvIHRoZSBkZWZhdWx0IHZhbHVlIGRlY2xhcmVkIGluIHRoZSBWYXJpYWJsZXMgdGFibGUuIFVzZXJzCi1jYW4gcmVwbGFjZSB0aGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydCBUZW1wbGF0ZTo8L3NwYW4+PHZhciBjbGFzcz0idmFybmFtZSI+SXRlbV9uYW1lPC92YXI+IGRpYWxvZwotYXQgaW5zZXJ0aW9uIHRpbWUuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRoZSBtb2RpZmllZCBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIGFwcHJvcHJpYXRlCi1kcmF3ZXIuPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiI+U25pcHBldHMgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTQuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBleHBsYWlucyBob3cgdG8gY3VzdG9taXplIHRoZSBTbmlwcGV0cyB2aWV3IGJ5IGFkZGluZyBhIG5ldyBkcmF3ZXIuIj5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNS5odG1sIiB0aXRsZT0iIj5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNi5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQgaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIj5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcgotZHJhd2VyczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQ4MDY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyMyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RW5hYmxpbmcgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5IYXZpbmcgdGhlIHByb3BlciBmaWxlcyBkZWZpbmVkIGluIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZCBjbGFzcyBwYXRoIGlzIGVzc2VudGlhbCBmb3IgY29udGVudA0KLWFzc2lzdCB0byB3b3JrIHByb3Blcmx5IGluIEpTUCBmaWxlcy4gSXQgaXMgYWxzbyBlc3NlbnRpYWwgZm9yIHRoZSBsaW5rcyBidWlsZGVyDQotdG8gYmUgYWJsZSB0byBjb3JyZWN0bHkgcmVzb2x2ZSBsaW5rcyB0byBzZXJ2bGV0cyBvciA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBiZWFucw0KLWluIEpTUCBhbmQgSFRNTCBmaWxlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5jb250ZW50IGFzc2lzdGFuY2U8aW5kZXh0ZXJtPmVuYWJsaW5nIGZvciBKU1AgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkpTUCBmaWxlczxpbmRleHRlcm0+ZW5hYmxpbmcgY29udGVudCBhc3Npc3RhbmNlPC9pbmRleHRlcm0+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+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMGE4NjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFbmFibGluZyBjb250ZW50IGFzc2lzdCBmb3IgSlNQIGZpbGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkhhdmluZyB0aGUgcHJvcGVyIGZpbGVzIGRlZmluZWQgaW4gdGhlIEphdmEgYnVpbGQgY2xhc3MgcGF0aCBpcyBlc3NlbnRpYWwgZm9yIGNvbnRlbnQgYXNzaXN0IHRvIHdvcmsgcHJvcGVybHkgaW4gSlNQIGZpbGVzLiBJdCBpcyBhbHNvIGVzc2VudGlhbCBmb3IgdGhlIGxpbmtzIGJ1aWxkZXIgdG8gYmUgYWJsZSB0byBjb3JyZWN0bHkgcmVzb2x2ZSBsaW5rcyB0byBzZXJ2bGV0cyBvciBKYXZhIGJlYW5zIGluIEpTUCBhbmQgSFRNTCBmaWxlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSGF2aW5nIHRoZSBwcm9wZXIgZmlsZXMgZGVmaW5lZCBpbiB0aGUgSmF2YSBidWlsZCBjbGFzcyBwYXRoIGlzIGVzc2VudGlhbCBmb3IgY29udGVudCBhc3Npc3QgdG8gd29yayBwcm9wZXJseSBpbiBKU1AgZmlsZXMuIEl0IGlzIGFsc28gZXNzZW50aWFsIGZvciB0aGUgbGlua3MgYnVpbGRlciB0byBiZSBhYmxlIHRvIGNvcnJlY3RseSByZXNvbHZlIGxpbmtzIHRvIHNlcnZsZXRzIG9yIEphdmEgYmVhbnMgaW4gSlNQIGFuZCBIVE1MIGZpbGVzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbnRlbnQgYXNzaXN0YW5jZSwgZW5hYmxpbmcgZm9yIEpTUCBmaWxlcywgSlNQIGZpbGVzLCBlbmFibGluZyBjb250ZW50IGFzc2lzdGFuY2UiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJjb250ZW50IGFzc2lzdGFuY2UsIGVuYWJsaW5nIGZvciBKU1AgZmlsZXMsIEpTUCBmaWxlcywgZW5hYmxpbmcgY29udGVudCBhc3Npc3RhbmNlIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyOC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAyMyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVuYWJsaW5nIGNvbnRlbnQgYXNzaXN0IGZvciBKU1AgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjMiPjxhIG5hbWU9InRzcmNlZHQwMjMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVuYWJsaW5nIGNvbnRlbnQgYXNzaXN0IGZvciBKU1AgZmlsZXM8L2gxPgotCi0KLQotPGRpdj48cD5IYXZpbmcgdGhlIHByb3BlciBmaWxlcyBkZWZpbmVkIGluIHRoZSBKYXZh4oSiIGJ1aWxkIGNsYXNzIHBhdGggaXMgZXNzZW50aWFsIGZvciBjb250ZW50Ci1hc3Npc3QgdG8gd29yayBwcm9wZXJseSBpbiBKU1AgZmlsZXMuIEl0IGlzIGFsc28gZXNzZW50aWFsIGZvciB0aGUgbGlua3MgYnVpbGRlcgotdG8gYmUgYWJsZSB0byBjb3JyZWN0bHkgcmVzb2x2ZSBsaW5rcyB0byBzZXJ2bGV0cyBvciBKYXZhIGJlYW5zCi1pbiBKU1AgYW5kIEhUTUwgZmlsZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBlbmFibGUgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlczo8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBkZXRlcm1pbmUgd2hldGhlciB0aGUgYnVpbGQgcGF0aCBpcyBjb3JyZWN0LCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4gZnJvbQotdGhlIHByb2plY3QncyBwb3AtdXAgbWVudS4gPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkphdmEgQnVpbGQgUGF0aDwvc3Bhbj4sIGFuZCB0aGVuIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5MaWJyYXJpZXM8L3NwYW4+IHBhZ2UuIDwvc3Bhbj4KLSBZb3Ugc2hvdWxkIHNlZSB0aGUgZm9sbG93aW5nIGZpbGVzOjx1bD4KLTxsaT5qMmVlLmphcjwvbGk+Ci0KLTxsaT5ydC5qYXIgPC9saT4KLQotPGxpPnNlcnZsZXQuamFyPC9saT4KLQotPGxpPndlYmNvbnRhaW5lci5qYXI8L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB0aGV5IGFyZSBub3QgcHJlc2VudCwgYWRkIHRoZW0gYXMgRXh0ZXJuYWwgSkFSIGZpbGVzLiBZb3UgbWF5Ci1oYXZlIHlvdXIgb3duIHZlcnNpb25zIG9mIHRoZXNlIGZpbGVzLCBkZXBlbmRpbmcgb24gdGhlIGxldmVsIG9mIEpESyBvciBTZXJ2bGV0Ci1BUEkgZm9yIHdoaWNoIHlvdSBhcmUgZGV2ZWxvcGluZy48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3VyIFdlYiBhcHBsaWNhdGlvbnMgcmVmZXJlbmNlIG90aGVyIEpBUnMsIHlvdSBjYW4gcGxhY2UgdGhlbQotaW4gdGhlIGJ1aWxkIHBhdGggYXMgZm9sbG93czo8L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGk+PHNwYW4+VXNlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgSkFSczwvc3Bhbj4gYnV0dG9uIG9uIHRoZSBMaWJyYXJ5Ci1wYWdlLiBZb3UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgSkFSIGZpbGUgaXMgYXZhaWxhYmxlIHRvIHRoZSBzZXJ2ZXIgYnkgcHJvcGVybHkKLWNvbmZpZ3VyaW5nIHRoZSBzZXJ2ZXIuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5BZGQgdGhlIEpBUnMgdG8gdGhlIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+V0VCLUlORi9saWI8L3NwYW4+IGRpcmVjdG9yeS4KLVRoZXkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBidWlsZCBwYXRoIGFuZCBkZXBsb3llZCB0byB0aGUgc2VydmVyCi1pbiBhcyBwYXJ0IG9mIHRoZSBwcm9qZWN0IFdBUi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA2Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uIj5Db250ZW50IGFzc2lzdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDA1Lmh0bWwiIHRpdGxlPSJUbyBnZXQgaGVscCBpbiBhZGRpbmcgbWFya3VwIHRvIGEgZmlsZSwgeW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiI+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZAotdGV4dCBlZGl0b3JzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI4Lmh0bWwiIHRpdGxlPSJKU1AgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDc1ZTk4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyNCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+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+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNmE0MDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJIVE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iIC8+Ci08bWV0YSBjb250ZW50PSJIVE1MLCB0ZW1wbGF0ZXMsIHJlbW92aW5nLCBhZGRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJIVE1MLCB0ZW1wbGF0ZXMsIHJlbW92aW5nLCBhZGRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyOC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI5Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDI0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyNCI+PGEgbmFtZT0idHNyY2VkdDAyNCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvaDE+Ci0KLQotCi08ZGl2PjxwPkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkCi1jb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMKLXByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPkZvciBleGFtcGxlLCB5b3UgbWF5IHdvcmsgb24gYSBncm91cCBvZiBIVE1MIHBhZ2VzIHRoYXQgc2hvdWxkCi1hbGwgY29udGFpbiBhIHRhYmxlIHdpdGggYSBzcGVjaWZpYyBhcHBlYXJhbmNlLiBDcmVhdGUgYSB0ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zCi10aGUgdGFncyBmb3IgdGhhdCB0YWJsZSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUKLXZhbHVlcyBmb3IgZWFjaCB0YWcuIChZb3UgY2FuIGNvcHkgYW5kIHBhc3RlIHRoZSB0YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQKLWVkaXRvciBpbnRvIHRoZSB0ZW1wbGF0ZSdzIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm48L3NwYW4+IGZpZWxkLikgVGhlbiBzZWxlY3QKLXRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBmcm9tIGEgY29udGVudCBhc3Npc3QgcHJvcG9zYWwgbGlzdCB3aGVuZXZlciB5b3UKLXdhbnQgdG8gaW5zZXJ0IHlvdXIgY3VzdG9tIHRhYmxlIGludG8gYW4gSFRNTCBvciBYSFRNTCBmaWxlLjwvcD4KLTxwPlRvIGFkZAotYSBuZXcgSFRNTCB0ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci0gPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiBtZW51LCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZWZlcmVuY2VzIHBhZ2UsIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQKLVhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgVGVtcGxhdGVzPC9zcGFuPgotPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+LiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FbnRlciB0aGUgbmV3IHRlbXBsYXRlIG5hbWUgKGEgdGV4dCBzdHJpbmcpIGFuZCBhIGJyaWVmIGRlc2NyaXB0aW9uCi1vZiB0aGUgdGVtcGxhdGUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRleHQ8L3NwYW4+IGRyb3AtZG93biBsaXN0LCBzcGVjaWZ5Ci10aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbCBsaXN0IHdoZW4gY29udGVudAotYXNzaXN0IGlzIHJlcXVlc3RlZC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQsIGVudGVyIHRoZSBhcHByb3ByaWF0ZQotdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyAodGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlKSB0byBiZQotaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYXJpYWJsZTwvc3Bhbj4gYnV0dG9uCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC48L3NwYW4+IEZvciBleGFtcGxlLCB0aGUgPHZhciBjbGFzcz0idmFybmFtZSI+d29yZF9zZWxlY3Rpb248L3Zhcj4gdmFyaWFibGUKLWluZGljYXRlcyB0aGUgd29yZCB0aGF0IGlzIHNlbGVjdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGVtcGxhdGUgaW5zZXJ0aW9uLAotYW5kIHRoZSA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5jdXJzb3I8L3Zhcj4gdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgY3Vyc29yIHdpbGwKLWJlIGFmdGVyIHRoZSB0ZW1wbGF0ZSBpcyBpbnNlcnRlZCBpbiB0aGUgSFRNTCBkb2N1bWVudC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHRoZSBuZXcgdGVtcGxhdGUuPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlCi1zYW1lIFByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlCi1pdCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBhbHNvIHJlc3RvcmUgYSByZW1vdmVkIHRlbXBsYXRlIGlmIHlvdSBoYXZlCi1ub3QgZXhpdGVkIGZyb20gdGhlIHdvcmtiZW5jaCBzaW5jZSBpdCB3YXMgcmVtb3ZlZC48L3A+Ci08cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlCi10aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCB0aGUgdGVtcGxhdGUgdG8gYXBwZWFyCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCwgZ28gdG8gdGhlIFRlbXBsYXRlcyBwcmVmZXJlbmNlcyBwYWdlIGFuZCB1bmNoZWNrCi1pdHMgY2hlY2sgYm94LjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNy5odG1sIiB0aXRsZT0iQ29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZQotdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjguaHRtbCIgdGl0bGU9IkpTUCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI5Lmh0bWwiIHRpdGxlPSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzYTgzYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwOSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTw/UHViIFN0eSBfZGlzcGxheSBGb250Q29sb3I9InJlZCI/Pg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDI1IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08bmF2dGl0bGU+U2V0dGluZyBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIHByZWZlcmVuY2VzPC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybQ0KLWtleXJlZj0idHNyY2VkdDAyNXwxfHN0cnVjdHVyZWR0ZXh0ZWRpdG9yc3ByZWZlcmVuY2VzZXR0aW5nIg0KLXN0YXR1cz0iY2hhbmdlZCI+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8aW5kZXh0ZXJtPnByZWZlcmVuY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5Zb3UgY2FuIGN1c3RvbWl6ZSB5b3VyIHdvcmtpbmcgZW52aXJvbm1lbnQgYnkgc3BlY2lmeWluZw0KLXByZWZlcmVuY2VzIGZvciB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIG1haW4gbWVudSwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBvbmUgb2YgdGhlIGNob2ljZXMgdGhhdCBhcmUgc2hvd24gaW4gdGhlIGZvbGxvd2luZw0KLXRhYmxlOjwvY21kPg0KLTxjaG9pY2V0YWJsZSByZWxjb2x3aWR0aD0iMTAqIDMwKiI+DQotPGNoaGVhZD48Y2hvcHRpb25oZD5JdGVtPC9jaG9wdGlvbmhkPjxjaGRlc2NoZD5NZW51IHBhdGg8L2NoZGVzY2hkPg0KLTwvY2hoZWFkPg0KLTxjaHJvdz48Y2hvcHRpb24+QW5ub3RhdGlvbiBzZXR0aW5nczwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD48dWljb250cm9sPkVkaXRvcnM8L3VpY29udHJvbD4NCi08dWljb250cm9sPkFubm90YXRpb25zPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+Q2hhcmFjdGVyIGVuY29kaW5nPC9jaG9wdGlvbj48Y2hkZXNjPjx1aWNvbnRyb2w+V2ViDQotYW5kIFhNTDwvdWljb250cm9sPiwgdGhlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjaG9pY2VzOiA8dWljb250cm9sPkNTUw0KLUZpbGVzPC91aWNvbnRyb2w+LCA8dWljb250cm9sPkhUTUwgRmlsZXM8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+SlNQDQotRmlsZXM8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+KlhNTCBGaWxlcyAoICpub3QgaW1wbGVtZW50ZWQgaW4gV1RQKTwvdWljb250cm9sPjwvY2hkZXNjPg0KLTwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5Db2RlIGZvbGRpbmc8L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPjx1aWNvbnRyb2w+U3RydWN0dXJlZCBUZXh0IEVkaXRvcnM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+PD9QdWIgQ2FyZXQgNTg/Pg0KLTxjaHJvdz48Y2hvcHRpb24+Q29udGVudCBhc3Npc3Q6IEhUTUw8L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+V2ViIGFuZCBYTUw8L3VpY29udHJvbD48dWljb250cm9sPkhUTUwgRmlsZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPkhUTUwgU291cmNlPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+Q29udGVudCBhc3Npc3Q6IEphdmFTY3JpcHQ8L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+V2ViIGFuZCBYTUw8L3VpY29udHJvbD48dWljb250cm9sPkphdmFTY3JpcHQgRmlsZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPkphdmFTY3JpcHQgU291cmNlPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+Q29udGVudCBhc3Npc3Q6IFhNTDwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+KlhNTCBGaWxlcyAoKm5vdCBpbXBsZW1lbnRlZA0KLWluIFdUUCk8L3VpY29udHJvbD48dWljb250cm9sPlhNTCBTb3VyY2U8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY2hkZXNjPg0KLTwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5FZGl0b3IgYXBwZWFyYW5jZTwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD48dWljb250cm9sPkVkaXRvcnM8L3VpY29udHJvbD4NCi08dWljb250cm9sPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3VpY29udHJvbD48dWljb250cm9sPkFwcGVhcmFuY2U8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5FZGl0b3IgZm9udDwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+PHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD4NCi08dWljb250cm9sPkNvbG9ycyBhbmQgRm9udHM8L3VpY29udHJvbD48dWljb250cm9sPlN0cnVjdHVyZWQgVGV4dA0KLUVkaXRvcjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkVkaXRvciBuYXZpZ2F0aW9uPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPjx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvdWljb250cm9sPjx1aWNvbnRyb2w+TmF2aWdhdGlvbjwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+PC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkZpbGUtdHlwZS1zcGVjaWZpYyBzZXR0aW5nczwvY2hvcHRpb24+PGNoZGVzYz48dWljb250cm9sPldlYg0KLWFuZCBYTUw8L3VpY29udHJvbD4sIHRoZW4gbmF2aWdhdGUgdG8gdGhlIGZpbGUgdHlwZSBhbmQgcGFydGljdWxhcg0KLXNldHRpbmc8L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+SG92ZXIgaGVscDwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+PHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD4NCi08dWljb250cm9sPkVkaXRvcnM8L3VpY29udHJvbD48dWljb250cm9sPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3VpY29udHJvbD4NCi08dWljb250cm9sPkhvdmVyczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPktleSBiaW5kaW5nczwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+PHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD4NCi08dWljb250cm9sPktleXM8L3VpY29udHJvbD48dWljb250cm9sPktleWJvYXJkIFNob3J0Y3V0czwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IHRoZW4gaW4gdGhlIDx1aWNvbnRyb2w+Q2F0ZWdvcnk8L3VpY29udHJvbD4gZmllbGQgc3BlY2lmeSA8dWljb250cm9sPlNvdXJjZTwvdWljb250cm9sPjwvY2hkZXNjPg0KLTwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5TcGVsbCBjaGVja2luZzwvY2hvcHRpb24+PGNoZGVzYz48dWljb250cm9sPlNwZWxsDQotQ2hlY2s8L3VpY29udHJvbD48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+U3ludGF4IGNoZWNraW5nPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPjx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvdWljb250cm9sPjx1aWNvbnRyb2w+QXBwZWFyYW5jZTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IHRoZW4gY2hlY2sgb3IgdW5jaGVjayB0aGUgPHVpY29udHJvbD5BbmFseXplIGFubm90YXRpb25zDQotd2hpbGUgdHlwaW5nPC91aWNvbnRyb2w+IGJveC48L2NoZGVzYz48L2Nocm93Pg0KLTwvY2hvaWNldGFibGU+DQotPGluZm8+PG5vdGU+WW91IGNhbm5vdCBzZXQgPHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPiBwcmVmZXJlbmNlcw0KLXVubGVzcyB0aGUgQ29yZSBYTUwgU3VwcG9ydCBjYXBhYmlsaXR5ICg8bWVudWNhc2NhZGU+PHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD4NCi08dWljb250cm9sPkNhcGFiaWxpdGllczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+KSBpcyBlbmFibGVkLCBhbmQNCi15b3UgY2Fubm90IHNldCBwcmVmZXJlbmNlcyBmb3IgRFREIGZpbGVzIHVubGVzcyB0aGUgWE1MIERldmVsb3BtZW50DQotY2FwYWJpbGl0eSBpcyBlbmFibGVkLjwvbm90ZT48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yDQotbWFya3VwIGxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDEuZGl0YSI+PGxpbmt0ZXh0PlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcw0KLWZvciBtYXJrdXAgbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxMC5kaXRhIj48bGlua3RleHQ+Q2hlY2tpbmcgc3BlbGxpbmc8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwDQotbGFuZ3VhZ2VzIC0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDUxNjA/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NjNkYjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIC8+Ci08bWV0YSBjb250ZW50PSJzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgcHJlZmVyZW5jZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgcHJlZmVyZW5jZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDEuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxMC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAyNSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDI1Ij48YSBuYW1lPSJ0c3JjZWR0MDI1Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvaDE+Ci0KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+WW91IGNhbiBjdXN0b21pemUgeW91ciB3b3JraW5nIGVudmlyb25tZW50IGJ5IHNwZWNpZnlpbmcgcHJlZmVyZW5jZXMKLWZvciB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci48L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgbWFpbiBtZW51LCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IG9uZSBvZiB0aGUgY2hvaWNlcyB0aGF0IGFyZSBzaG93biBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOjwvc3Bhbj4KLQotPHRhYmxlIGNsYXNzPSJjaG9pY2V0YWJsZWJvcmRlciIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIHJ1bGVzPSJyb3dzIiBmcmFtZT0iaHNpZGVzIiBib3JkZXI9IjEiPgotPHRoZWFkPjx0cj48dGggdmFsaWduPSJib3R0b20iIGlkPSJOMTAwNzAtb3B0aW9uIj5JdGVtPC90aD4KLTx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9Ik4xMDA3MC1kZXNjIj5NZW51IHBhdGg8L3RoPjwvdHI+PC90aGVhZD4KLTx0Ym9keT4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLW9wdGlvbiIgaWQ9Ik4xMDA4QSI+PHN0cm9uZz5Bbm5vdGF0aW9uIHNldHRpbmdzPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLWRlc2MgTjEwMDhBIj48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcnM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QW5ub3RhdGlvbnM8L3NwYW4+PC9zcGFuPjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1vcHRpb24iIGlkPSJOMTAwQUQiPjxzdHJvbmc+Q2hhcmFjdGVyIGVuY29kaW5nPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLWRlc2MgTjEwMEFEIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kIFhNTDwvc3Bhbj4sCi10aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNob2ljZXM6IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNTUyBGaWxlczwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwKLUZpbGVzPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SlNQIEZpbGVzPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+KlhNTCBGaWxlcwotKCAqbm90IGltcGxlbWVudGVkIGluIFdUUCk8L3NwYW4+PC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1vcHRpb24iIGlkPSJOMTAwRDgiPjxzdHJvbmc+Q29udGVudCBhc3Npc3Q6IEhUTUw8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtZGVzYyBOMTAwRDgiPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViCi1hbmQgWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBTb3VyY2U8L3NwYW4+Ci08L3NwYW4+PC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1vcHRpb24iIGlkPSJOMTAwRkEiPjxzdHJvbmc+Q29udGVudCBhc3Npc3Q6IEphdmFTY3JpcHQ8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtZGVzYyBOMTAwRkEiPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+Ci08c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kIFhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KYXZhU2NyaXB0IEZpbGVzPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SmF2YVNjcmlwdCBTb3VyY2U8L3NwYW4+PC9zcGFuPjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtb3B0aW9uIiBpZD0iTjEwMTFEIj48c3Ryb25nPkNvbnRlbnQgYXNzaXN0OiBYTUw8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtZGVzYyBOMTAxMUQiPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViCi1hbmQgWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPipYTUwgRmlsZXMgKCpub3QgaW1wbGVtZW50ZWQgaW4gV1RQKTwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBTb3VyY2U8L3NwYW4+PC9zcGFuPjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtb3B0aW9uIiBpZD0iTjEwMTNGIj48c3Ryb25nPkVkaXRvciBhcHBlYXJhbmNlPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLWRlc2MgTjEwMTNGIj48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcnM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGVhcmFuY2U8L3NwYW4+PC9zcGFuPjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtb3B0aW9uIiBpZD0iTjEwMTY3Ij48c3Ryb25nPkVkaXRvciBmb250PC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLWRlc2MgTjEwMTY3Ij48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbG9ycyBhbmQgRm9udHM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvc3Bhbj4KLTwvc3Bhbj48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLW9wdGlvbiIgaWQ9Ik4xMDE4QSI+PHN0cm9uZz5FZGl0b3IgbmF2aWdhdGlvbjwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1kZXNjIE4xMDE4QSI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3JzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYXZpZ2F0aW9uPC9zcGFuPjwvc3Bhbj48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLW9wdGlvbiIgaWQ9Ik4xMDFCMiI+PHN0cm9uZz5GaWxlLXR5cGUtc3BlY2lmaWMgc2V0dGluZ3M8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtZGVzYyBOMTAxQjIiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYgotYW5kIFhNTDwvc3Bhbj4sIHRoZW4gbmF2aWdhdGUgdG8gdGhlIGZpbGUgdHlwZSBhbmQgcGFydGljdWxhciBzZXR0aW5nPC90ZD4KLQotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLW9wdGlvbiIgaWQ9Ik4xMDFDNyI+PHN0cm9uZz5Ib3ZlciBoZWxwPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLWRlc2MgTjEwMUM3Ij48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcnM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhvdmVyczwvc3Bhbj48L3NwYW4+PC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1vcHRpb24iIGlkPSJOMTAxRUYiPjxzdHJvbmc+S2V5IGJpbmRpbmdzPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLWRlc2MgTjEwMUVGIj48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5Ym9hcmQgU2hvcnRjdXRzPC9zcGFuPjwvc3Bhbj4gdGhlbgotaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNhdGVnb3J5PC9zcGFuPiBmaWVsZCBzcGVjaWZ5IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNvdXJjZTwvc3Bhbj48L3RkPgotCi08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtb3B0aW9uIiBpZD0iTjEwMjFFIj48c3Ryb25nPlNwZWxsIGNoZWNraW5nPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLWRlc2MgTjEwMjFFIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5TcGVsbCBDaGVjazwvc3Bhbj48L3RkPgotCi08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtb3B0aW9uIiBpZD0iTjEwMjMyIj48c3Ryb25nPlN5bnRheCBjaGVja2luZzwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1kZXNjIE4xMDIzMiI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3JzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBlYXJhbmNlPC9zcGFuPjwvc3Bhbj4gdGhlbiBjaGVjayBvciB1bmNoZWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BbmFseXplCi1hbm5vdGF0aW9ucyB3aGlsZSB0eXBpbmc8L3NwYW4+IGJveC48L3RkPgotPC90cj4KLQotPC90Ym9keT48L3RhYmxlPgotCi0gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW5ub3Qgc2V0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQgWE1MPC9zcGFuPiBwcmVmZXJlbmNlcwotdW5sZXNzIHRoZSBDb3JlIFhNTCBTdXBwb3J0IGNhcGFiaWxpdHkgKDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2FwYWJpbGl0aWVzPC9zcGFuPjwvc3Bhbj4pIGlzIGVuYWJsZWQsIGFuZCB5b3UgY2Fubm90Ci1zZXQgcHJlZmVyZW5jZXMgZm9yIERURCBmaWxlcyB1bmxlc3MgdGhlIFhNTCBEZXZlbG9wbWVudCBjYXBhYmlsaXR5IGlzIGVuYWJsZWQuPC9kaXY+Ci0KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBzZXQgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgV2ViIGFuZCBYTUwgZmlsZXMuIFRoZSBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGluY2x1ZGUgd2hldGhlciB0byBhbmFseXplIHRoZSBzeW50YWN0aWMgdmFsaWRpdHkgb2YgeW91ciBmaWxlIHdoaWxlIHlvdSBhcmUgdHlwaW5nIGFuZCB3aGF0IGNvbG9ycyB0byB1c2UgdG8gaGlnaGxpZ2h0IGVycm9ycywgd2FybmluZ3MsIHRhc2tzLCBzZWFyY2ggcmVzdWx0cywgYm9va21hcmtzLCBhbmQgb3RoZXIgdGV4dC4iPlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IKLW1hcmt1cCBsYW5ndWFnZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTAuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGNoZWNrIHNwZWxsaW5nIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4iPkNoZWNraW5nIHNwZWxsaW5nPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI2LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Y2Y5MjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI2LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDI2IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZw0KLW9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoDQotZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4gVGhlIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cw0KLXRoYXQgeW91IGRlZmluZSBhbmQgaW5jbHVkZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zbmlwcGV0czxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi0NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PkluIHRoZSBTbmlwcGV0cyB2aWV3IHlvdSBjYW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIHRhc2tzOjwvY29udGV4dD4NCi08c3RlcHMtdW5vcmRlcmVkPg0KLTxzdGVwPjxjbWQ+QWRkIHNuaXBwZXRzIGRyYXdlcnM8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5BZGQgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkVkaXQgc25pcHBldCBpdGVtczwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkRlbGV0ZSBvciBoaWRlIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VyczwvY21kPjwvc3RlcD4NCi08L3N0ZXBzLXVub3JkZXJlZD4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDAxLmRpdGEiPjxsaW5rdGV4dD5TbmlwcGV0cyB2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE1LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjIuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgc25pcHBldCBpdGVtczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTYuZGl0YSI+PGxpbmt0ZXh0PkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yDQotZHJhd2VyczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjYuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTgxZTFhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiBUaGUgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzIHRoYXQgeW91IGRlZmluZSBhbmQgaW5jbHVkZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiBUaGUgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzIHRoYXQgeW91IGRlZmluZSBhbmQgaW5jbHVkZS4iIC8+Ci08bWV0YSBjb250ZW50PSJzbmlwcGV0cywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzbmlwcGV0cywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDAxLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDIyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMjYiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyNiI+PGEgbmFtZT0idHNyY2VkdDAyNiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2gxPgotCi0KLQotPGRpdj48cD5UaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZwotb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHTihKIsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aAotZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4gVGhlIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cwotdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+SW4gdGhlIFNuaXBwZXRzIHZpZXcgeW91IGNhbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGFza3M6PC9kaXY+Ci0KLTx1bD4KLTxsaT48c3Bhbj5BZGQgc25pcHBldHMgZHJhd2Vyczwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+QWRkIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkVkaXQgc25pcHBldCBpdGVtczwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+RGVsZXRlIG9yIGhpZGUgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzPC9zcGFuPjwvbGk+Ci0KLTwvdWw+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiI+U25pcHBldHMgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE0Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZXhwbGFpbnMgaG93IHRvIGN1c3RvbWl6ZSB0aGUgU25pcHBldHMgdmlldyBieSBhZGRpbmcgYSBuZXcgZHJhd2VyLiI+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTUuaHRtbCIgdGl0bGU9IiI+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjIuaHRtbCIgdGl0bGU9IiI+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE2Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBkZWxldGUgb3IgaGlkZSBkcmF3ZXJzIGFuZCBpdGVtcyBpbiB0aGUgU25pcHBldHMgdmlldy4iPkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yCi1kcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI3LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMzI0ZWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI3LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDI3IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXMgLSBvdmVydmlldzwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08bmF2dGl0bGU+QWRkaW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXM8L25hdnRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+Q29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLA0KLXRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwNCi1jdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPm1hcmt1cCBsYW5ndWFnZXM8aW5kZXh0ZXJtPnRlbXBsYXRlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+dGVtcGxhdGVzPGluZGV4dGVybT5tYXJrdXAgbGFuZ3VhZ2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5UZW1wbGF0ZXMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBtYXJrdXAgbGFuZ3VhZ2VzOjx1bD4NCi08bGk+SFRNTCBvciBYSFRNTDwvbGk+DQotPGxpPkpTUDwvbGk+DQotPC91bD48L2NvbnRleHQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI4LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI5LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcw0KLS0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI3Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxZTQ1Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJDb250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iIC8+Ci08bWV0YSBjb250ZW50PSJtYXJrdXAgbGFuZ3VhZ2VzLCB0ZW1wbGF0ZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJtYXJrdXAgbGFuZ3VhZ2VzLCB0ZW1wbGF0ZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyOC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI5Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDI3IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjciPjxhIG5hbWU9InRzcmNlZHQwMjciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9oMT4KLQotCi0KLQotPGRpdj48cD5Db250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsCi10aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsCi1jdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGVtcGxhdGVzIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcgbWFya3VwIGxhbmd1YWdlczo8dWw+Ci08bGk+SFRNTCBvciBYSFRNTDwvbGk+Ci0KLTxsaT5KU1A8L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI0Lmh0bWwiIHRpdGxlPSJIVE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI4Lmh0bWwiIHRpdGxlPSJKU1AgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyOS5odG1sIiB0aXRsZT0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGUgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGF0IHRlbXBsYXRlLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI4LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZjgxZGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI4LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDI4IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+SlNQIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZA0KLWNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcw0KLXByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idHNyY2VkdDAyOHwxfEpTUHBhZ2VzdGVtcGxhdGVzIiBzdGF0dXM9ImNoYW5nZWQiPkpTUA0KLWZpbGVzPGluZGV4dGVybT50ZW1wbGF0ZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtIGtleXJlZj0idHNyY2VkdDAyOHwyfHRlbXBsYXRlc0pTUHBhZ2VzIg0KLXN0YXR1cz0ibmV3Ij50ZW1wbGF0ZXM8aW5kZXh0ZXJtPkpTUCBwYWdlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPkZvciBleGFtcGxlLCB5b3UgbWF5IHdvcmsgb24gYSBncm91cCBvZiBKU1AgcGFnZXMgdGhhdCBzaG91bGQNCi1hbGwgY29udGFpbiBhIHRhYmxlIHdpdGggYSBzcGVjaWZpYyBhcHBlYXJhbmNlLiBDcmVhdGUgYSB0ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zDQotdGhlIHRhZ3MgZm9yIHRoYXQgdGFibGUsIGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUgYXR0cmlidXRlcyBhbmQgYXR0cmlidXRlDQotdmFsdWVzIGZvciBlYWNoIHRhZy4gKFlvdSBjYW4gY29weSBhbmQgcGFzdGUgdGhlIHRhZ3MgZnJvbSBhIHN0cnVjdHVyZWQgdGV4dA0KLWVkaXRvciBpbnRvIHRoZSB0ZW1wbGF0ZSdzIDx1aWNvbnRyb2w+UGF0dGVybjwvdWljb250cm9sPiBmaWVsZC4pIFRoZW4gc2VsZWN0DQotdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyIHlvdQ0KLXdhbnQgdG8gaW5zZXJ0IHlvdXIgY3VzdG9tIHRhYmxlIGludG8gYSBKU1AgZmlsZS48L3A+PHA+VG8gYWRkIGEgbmV3IEpTUCB0ZW1wbGF0ZSwNCi1jb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4gPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkZyb20gdGhlIDx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+IG1lbnUsIHNlbGVjdCA8dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcmVmZXJlbmNlcyBwYWdlLCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2ViIGFuZA0KLVhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+SlNQIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5KU1AgVGVtcGxhdGVzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkVudGVyIHRoZSBuZXcgdGVtcGxhdGUgbmFtZSAoYSB0ZXh0IHN0cmluZykgYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24NCi1vZiB0aGUgdGVtcGxhdGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VXNpbmcgdGhlIDx1aWNvbnRyb2w+Q29udGV4dDwvdWljb250cm9sPiBkcm9wLWRvd24gbGlzdCwgc3BlY2lmeQ0KLXRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50DQotYXNzaXN0IGlzIHJlcXVlc3RlZC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZpZWxkLCBlbnRlciB0aGUgYXBwcm9wcmlhdGUNCi10YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzICh0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUpIHRvIGJlDQotaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8dWljb250cm9sPlZhcmlhYmxlPC91aWNvbnRyb2w+IGJ1dHRvbg0KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLjwvY21kPjxzdGVweG1wPkZvciBleGFtcGxlLCB0aGUgPHZhcm5hbWU+d29yZF9zZWxlY3Rpb248L3Zhcm5hbWU+IHZhcmlhYmxlDQotaW5kaWNhdGVzIHRoZSB3b3JkIHRoYXQgaXMgc2VsZWN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZW1wbGF0ZSBpbnNlcnRpb24sDQotYW5kIHRoZSA8dmFybmFtZT5jdXJzb3I8L3Zhcm5hbWU+IHZhcmlhYmxlIGRldGVybWluZXMgd2hlcmUgdGhlIGN1cnNvciB3aWxsDQotYmUgYWZ0ZXIgdGhlIHRlbXBsYXRlIGlzIGluc2VydGVkIGluIHRoZSBIVE1MIGRvY3VtZW50Ljwvc3RlcHhtcD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvIHNhdmUgdGhlIG5ldyB0ZW1wbGF0ZS48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48cD5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUNCi1zYW1lIFByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlDQotaXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gYWxzbyByZXN0b3JlIGEgcmVtb3ZlZCB0ZW1wbGF0ZSBpZiB5b3UgaGF2ZQ0KLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLjwvcD48cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlDQotdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIGJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgdGhlIHRlbXBsYXRlIHRvIGFwcGVhcg0KLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LCBnbyB0byB0aGUgVGVtcGxhdGVzIHByZWZlcmVuY2VzIHBhZ2UgYW5kIHVuY2hlY2sNCi1pdHMgY2hlY2sgYm94LjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjcuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlDQotdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI0LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyOS5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjQ3ZmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkpTUCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJKU1AgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iIC8+Ci08bWV0YSBjb250ZW50PSJKU1AgZmlsZXMsIHRlbXBsYXRlcywgSlNQIHBhZ2VzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iSlNQIGZpbGVzLCB0ZW1wbGF0ZXMsIEpTUCBwYWdlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjkuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMjgiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjgiPjxhIG5hbWU9InRzcmNlZHQwMjgiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvaDE+Ci0KLQotCi08ZGl2PjxwPkpTUCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQKLWNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcwotcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+Rm9yIGV4YW1wbGUsIHlvdSBtYXkgd29yayBvbiBhIGdyb3VwIG9mIEpTUCBwYWdlcyB0aGF0IHNob3VsZAotYWxsIGNvbnRhaW4gYSB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgYXBwZWFyYW5jZS4gQ3JlYXRlIGEgdGVtcGxhdGUgdGhhdCBjb250YWlucwotdGhlIHRhZ3MgZm9yIHRoYXQgdGFibGUsIGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUgYXR0cmlidXRlcyBhbmQgYXR0cmlidXRlCi12YWx1ZXMgZm9yIGVhY2ggdGFnLiAoWW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUgdGFncyBmcm9tIGEgc3RydWN0dXJlZCB0ZXh0Ci1lZGl0b3IgaW50byB0aGUgdGVtcGxhdGUncyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmaWVsZC4pIFRoZW4gc2VsZWN0Ci10aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgZnJvbSBhIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FsIGxpc3Qgd2hlbmV2ZXIgeW91Ci13YW50IHRvIGluc2VydCB5b3VyIGN1c3RvbSB0YWJsZSBpbnRvIGEgSlNQIGZpbGUuPC9wPgotPHA+VG8gYWRkIGEgbmV3IEpTUCB0ZW1wbGF0ZSwKLWNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotIDwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcmVmZXJlbmNlcyBwYWdlLCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kCi1YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SlNQIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkpTUCBUZW1wbGF0ZXM8L3NwYW4+Ci08L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkVudGVyIHRoZSBuZXcgdGVtcGxhdGUgbmFtZSAoYSB0ZXh0IHN0cmluZykgYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24KLW9mIHRoZSB0ZW1wbGF0ZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Vc2luZyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGV4dDwvc3Bhbj4gZHJvcC1kb3duIGxpc3QsIHNwZWNpZnkKLXRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50Ci1hc3Npc3QgaXMgcmVxdWVzdGVkLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmaWVsZCwgZW50ZXIgdGhlIGFwcHJvcHJpYXRlCi10YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzICh0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUpIHRvIGJlCi1pbnNlcnRlZCBieSBjb250ZW50IGFzc2lzdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhcmlhYmxlPC9zcGFuPiBidXR0b24KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLjwvc3Bhbj4gRm9yIGV4YW1wbGUsIHRoZSA8dmFyIGNsYXNzPSJ2YXJuYW1lIj53b3JkX3NlbGVjdGlvbjwvdmFyPiB2YXJpYWJsZQotaW5kaWNhdGVzIHRoZSB3b3JkIHRoYXQgaXMgc2VsZWN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZW1wbGF0ZSBpbnNlcnRpb24sCi1hbmQgdGhlIDx2YXIgY2xhc3M9InZhcm5hbWUiPmN1cnNvcjwvdmFyPiB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoZXJlIHRoZSBjdXJzb3Igd2lsbAotYmUgYWZ0ZXIgdGhlIHRlbXBsYXRlIGlzIGluc2VydGVkIGluIHRoZSBIVE1MIGRvY3VtZW50LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvIHNhdmUgdGhlIG5ldyB0ZW1wbGF0ZS48L3NwYW4+Ci08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUKLXNhbWUgUHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUKLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUKLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLjwvcD4KLTxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUKLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXIKLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LCBnbyB0byB0aGUgVGVtcGxhdGVzIHByZWZlcmVuY2VzIHBhZ2UgYW5kIHVuY2hlY2sKLWl0cyBjaGVjayBib3guPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI3Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNC5odG1sIiB0aXRsZT0iSFRNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyOS5odG1sIiB0aXRsZT0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGUgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGF0IHRlbXBsYXRlLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI5LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZWJiMDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI5LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDI3IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+WE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkDQotY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcw0KLXByb3ZpZGVkLCBjdXN0b21pemUgdGhhdCB0ZW1wbGF0ZSwgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRzcmNlZHQwMjl8MXx0ZW1wbGF0ZXNYTUwiIHN0YXR1cz0ibmV3Ij50ZW1wbGF0ZXM8aW5kZXh0ZXJtPlhNTDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0ga2V5cmVmPSJ0c3JjZWR0MDI5fDJ8eG1sdGVtcGxhdGVzYWRkaW5nIiBzdGF0dXM9ImNoYW5nZWQiPlhNTDxpbmRleHRlcm0+YWRkaW5nDQotdGVtcGxhdGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+Rm9yIGV4YW1wbGUsIHlvdSBtYXkgd29yayBvbiBhIGdyb3VwIG9mIFhNTCBwYWdlcyB0aGF0IHNob3VsZA0KLWFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZSBhIHRlbXBsYXRlIHRoYXQgY29udGFpbnMNCi10aGUgdGFncyBmb3IgdGhhdCB0YWJsZSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUNCi12YWx1ZXMgZm9yIGVhY2ggdGFnLiAoWW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUgdGFncyBmcm9tIGEgc3RydWN0dXJlZCB0ZXh0DQotZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZpZWxkLikgVGhlbiBzZWxlY3QNCi10aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgZnJvbSBhIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FsIGxpc3Qgd2hlbmV2ZXIgeW91DQotd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhbiBYTUwgZmlsZS48L3A+PHA+VG8gYWRkIGEgbmV3IFhNTA0KLXRlbXBsYXRlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOiA8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSA8dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPiBtZW51LCBzZWxlY3QgPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJlZmVyZW5jZXMgcGFnZSwgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPldlYiBhbmQNCi1YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTCBGaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MIFRlbXBsYXRlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5FbnRlciB0aGUgbmV3IHRlbXBsYXRlIG5hbWUgKGEgdGV4dCBzdHJpbmcpIGFuZCBhIGJyaWVmIGRlc2NyaXB0aW9uDQotb2YgdGhlIHRlbXBsYXRlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlVzaW5nIHRoZSA8dWljb250cm9sPkNvbnRleHQ8L3VpY29udHJvbD4gZHJvcC1kb3duIGxpc3QsIHNwZWNpZnkNCi10aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbCBsaXN0IHdoZW4gY29udGVudA0KLWFzc2lzdCBpcyByZXF1ZXN0ZWQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+UGF0dGVybjwvdWljb250cm9sPiBmaWVsZCwgZW50ZXIgdGhlIGFwcHJvcHJpYXRlDQotdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyAodGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlKSB0byBiZQ0KLWluc2VydGVkIGJ5IGNvbnRlbnQgYXNzaXN0LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPHVpY29udHJvbD5WYXJpYWJsZTwvdWljb250cm9sPiBidXR0b24NCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC48L2NtZD48c3RlcHhtcD5Gb3IgZXhhbXBsZSwgdGhlIDx2YXJuYW1lPndvcmRfc2VsZWN0aW9uPC92YXJuYW1lPiB2YXJpYWJsZQ0KLWluZGljYXRlcyB0aGUgd29yZCB0aGF0IGlzIHNlbGVjdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGVtcGxhdGUgaW5zZXJ0aW9uLA0KLWFuZCB0aGUgPHZhcm5hbWU+Y3Vyc29yPC92YXJuYW1lPiB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoZXJlIHRoZSBjdXJzb3Igd2lsbA0KLWJlIGFmdGVyIHRoZSB0ZW1wbGF0ZSBpcyBpbnNlcnRlZCBpbiB0aGUgWE1MIGRvY3VtZW50Ljwvc3RlcHhtcD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvIHNhdmUgdGhlIG5ldyB0ZW1wbGF0ZS48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48cD5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUNCi1zYW1lIFByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlDQotaXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gYWxzbyByZXN0b3JlIGEgcmVtb3ZlZCB0ZW1wbGF0ZSBpZiB5b3UgaGF2ZQ0KLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLjwvcD48cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlDQotdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIGJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgdGhlIHRlbXBsYXRlIHRvIGFwcGVhcg0KLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LCBnbyB0byB0aGUgVGVtcGxhdGVzIHByZWZlcmVuY2VzIHBhZ2UgYW5kIHVuY2hlY2sNCi1pdHMgY2hlY2sgYm94LjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjcuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlDQotdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI0LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyOC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NzQyNDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgY2h1bmsgb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhhdCB0ZW1wbGF0ZSwgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGUgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGF0IHRlbXBsYXRlLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlbXBsYXRlcywgWE1MLCBhZGRpbmcgdGVtcGxhdGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0idGVtcGxhdGVzLCBYTUwsIGFkZGluZyB0ZW1wbGF0ZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI4Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDI3IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDI3Ij48YSBuYW1lPSJ0c3JjZWR0MDI3Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L2gxPgotCi0KLQotPGRpdj48cD5YTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQKLWNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGUgYXMKLXByb3ZpZGVkLCBjdXN0b21pemUgdGhhdCB0ZW1wbGF0ZSwgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5Gb3IgZXhhbXBsZSwgeW91IG1heSB3b3JrIG9uIGEgZ3JvdXAgb2YgWE1MIHBhZ2VzIHRoYXQgc2hvdWxkCi1hbGwgY29udGFpbiBhIHRhYmxlIHdpdGggYSBzcGVjaWZpYyBhcHBlYXJhbmNlLiBDcmVhdGUgYSB0ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zCi10aGUgdGFncyBmb3IgdGhhdCB0YWJsZSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUKLXZhbHVlcyBmb3IgZWFjaCB0YWcuIChZb3UgY2FuIGNvcHkgYW5kIHBhc3RlIHRoZSB0YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQKLWVkaXRvciBpbnRvIHRoZSB0ZW1wbGF0ZSdzIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm48L3NwYW4+IGZpZWxkLikgVGhlbiBzZWxlY3QKLXRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBmcm9tIGEgY29udGVudCBhc3Npc3QgcHJvcG9zYWwgbGlzdCB3aGVuZXZlciB5b3UKLXdhbnQgdG8gaW5zZXJ0IHlvdXIgY3VzdG9tIHRhYmxlIGludG8gYW4gWE1MIGZpbGUuPC9wPgotPHA+VG8gYWRkIGEgbmV3IFhNTAotdGVtcGxhdGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD4KLSA8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+IG1lbnUsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJlZmVyZW5jZXMgcGFnZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZAotWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgVGVtcGxhdGVzPC9zcGFuPgotPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+LiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FbnRlciB0aGUgbmV3IHRlbXBsYXRlIG5hbWUgKGEgdGV4dCBzdHJpbmcpIGFuZCBhIGJyaWVmIGRlc2NyaXB0aW9uCi1vZiB0aGUgdGVtcGxhdGUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRleHQ8L3NwYW4+IGRyb3AtZG93biBsaXN0LCBzcGVjaWZ5Ci10aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbCBsaXN0IHdoZW4gY29udGVudAotYXNzaXN0IGlzIHJlcXVlc3RlZC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQsIGVudGVyIHRoZSBhcHByb3ByaWF0ZQotdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyAodGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlKSB0byBiZQotaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYXJpYWJsZTwvc3Bhbj4gYnV0dG9uCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC48L3NwYW4+IEZvciBleGFtcGxlLCB0aGUgPHZhciBjbGFzcz0idmFybmFtZSI+d29yZF9zZWxlY3Rpb248L3Zhcj4gdmFyaWFibGUKLWluZGljYXRlcyB0aGUgd29yZCB0aGF0IGlzIHNlbGVjdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGVtcGxhdGUgaW5zZXJ0aW9uLAotYW5kIHRoZSA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5jdXJzb3I8L3Zhcj4gdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgY3Vyc29yIHdpbGwKLWJlIGFmdGVyIHRoZSB0ZW1wbGF0ZSBpcyBpbnNlcnRlZCBpbiB0aGUgWE1MIGRvY3VtZW50LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvIHNhdmUgdGhlIG5ldyB0ZW1wbGF0ZS48L3NwYW4+Ci08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUKLXNhbWUgUHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUKLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUKLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLjwvcD4KLTxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUKLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXIKLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LCBnbyB0byB0aGUgVGVtcGxhdGVzIHByZWZlcmVuY2VzIHBhZ2UgYW5kIHVuY2hlY2sKLWl0cyBjaGVjayBib3guPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI3Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNC5odG1sIiB0aXRsZT0iSFRNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyOC5odG1sIiB0aXRsZT0iSlNQIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5Y2M4NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvRWRpdG9yQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvRWRpdG9yQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjgwNjdlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL0VkaXRvckNvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci0KLTxjb250ZXh0IGlkPSJzdGVkMDAwMSI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGN1c3RvbWl6ZSB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMuCi1XaGVuIHRoZSA8Yj5IaWdobGlnaHQgbWF0Y2hpbmcgYnJhY2tldHM8L2I+IG9wdGlvbiBpcyBzZWxlY3RlZCwgd2hlbmV2ZXIgdGhlIGN1cnNvciBpcyBuZXh0IHRvIGEgYnJhY2tldCBvciBjdXJseSBicmFjZXMsIGl0cyBvcGVuaW5nIG9yIGNsb3NpbmcgY291bnRlciBwYXJ0IGlzIGhpZ2hsaWdodGVkLgotU2VsZWN0IHRoZSA8Yj5SZXBvcnQgcHJvYmxlbXMgYXMgeW91IHR5cGU8L2I+IGNoZWNrIGJveCB0byB1cGRhdGUgdmFsaWRpdHkgYW5ub3RhdGlvbnMgKHRlbXBvcmFyeSBhbm5vdGF0aW9ucywgc3VjaCBhcyBtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZXMgYmFzZWQgb24gYSBEVEQsIHRoYXQgZ28gYXdheSB3aGVuIHRoZSBlZGl0b3IgaXMgY2xvc2VkLCBvciB0aGUgcHJvYmxlbSBpcyBmaXhlZCkgYXMgdGhlIHVzZXIgdHlwZXMuCi1JbiB0aGUgPGI+QXBwZWFyYW5jZSBjb2xvciBvcHRpb25zPC9iPiB0YWJsZSwgeW91IGNhbiBhZGp1c3QgdmFyaW91cyBlZGl0b3IgYXBwZWFyYW5jZSBmZWF0dXJlcy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJzdGVkMDAwMyI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGN1c3RvbWl6ZSBob3ZlciB0ZXh0IGluIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlzcGUud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ4bWxtMTAxMCI+Ci08ZGVzY3JpcHRpb24+Q29udGVudCBhc3Npc3QgaGVscHMgeW91IHRvIGZpbmlzaCB0YWdzIG9yIGxpbmVzIG9mIGNvZGUgYW5kIGluc2VydCB0ZW1wbGF0ZXMuIERlcGVuZGluZyBvbiB0aGUgc291cmNlIG1hcmt1cCBsYW5ndWFnZSwgdGhlIGNob2ljZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0IGFyZSBiYXNlZCBvbiB0YWdzIGRlZmluZWQgYnkgRFREIGFuZCBzY2hlbWEgZmlsZXMsIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3JzLCBvciBjb250ZW50IG1vZGVsIHN0YW5kYXJkIHRoYXQgaXMgc3BlY2lmaWVkIGZvciB0aGUgZmlsZSBiZWluZyBlZGl0ZWQuIEhUTUwgY29udGVudCBhc3Npc3QgY2hvaWNlcyBhcmUgYmFzZWQgb24gdGhlIFczQyBIVE1MIDQuMDEgY29udGVudCBtb2RlbC4KLQotSWYgeW91ciBjdXJzb3IgaXMgaW4gYSBwb3NpdGlvbiB3aGVyZSBjb250ZW50IGFzc2lzdCBpcyBhdmFpbGFibGUsIGEgcG9wLXVwIGxpc3Qgb2YgYXZhaWxhYmxlIGNob2ljZXMgaXMgZGlzcGxheWVkLiBUaGUgY29udGVudCBhc3Npc3QgbGlzdCBkaXNwbGF5cyBhbGwgYXZhaWxhYmxlIGNvbXBsZXRpb25zIGZvciB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24sIGluY2x1ZGluZyB0ZW1wbGF0ZXMuIENvbnRlbnQgYXNzaXN0IGlzIGFsc28gYXZhaWxhYmxlIGJ5IHByZXNzaW5nIEN0cmwrU3BhY2UuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDb250ZW50IGFzc2lzdCIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA1Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ4bWxtMTAzMCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIGZvcm1hdCBhbiBlbnRpcmUgZG9jdW1lbnQuIEZvcm1hdHRpbmcgcmVzdG9yZXMgZWxlbWVudCBhbmQgYXR0cmlidXRlIGluZGVudGF0aW9uIGFuZCBwb3NpdGlvbmluZywgd2hpY2ggbWF5IGhhdmUgYmVlbiBvZmZzZXQgZHVyaW5nIGVkaXRpbmcsIHRvIHNlZSBuZXN0aW5nIGhpZXJhcmNoaWVzIGFuZCByZWxhdGlvbnNoaXBzIG1vcmUgY2xlYXJseSBpbiB0aGUgZmlsZS4gRWRpdCB0aGUgYXBwcm9wcmlhdGUgUHJlZmVyZW5jZXMgcGFnZXMgdG8gbWFrZSBjaGFuZ2VzIGluIHNwZWNpZmljIGZvcm1hdHRpbmcgYmVoYXZpb3IuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ieG1sbTEwNDAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBmb3JtYXQgc2VsZWN0ZWQgZWxlbWVudHMuIEZvcm1hdHRpbmcgcmVzdG9yZXMgZWxlbWVudCBhbmQgYXR0cmlidXRlIGluZGVudGF0aW9uIGFuZCBwb3NpdGlvbmluZywgd2hpY2ggbWF5IGhhdmUgYmVlbiBvZmZzZXQgZHVyaW5nIGVkaXRpbmcsIHRvIHNlZSBuZXN0aW5nIGhpZXJhcmNoaWVzIGFuZCByZWxhdGlvbnNoaXBzIG1vcmUgY2xlYXJseSBpbiB0aGUgZmlsZS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ4bWxtMTA3MCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIG9wZW4gdGhlIDxiPlByb3BlcnRpZXM8L2I+IHZpZXcsIHdoaWNoIGRpc3BsYXlzIHByb3BlcnRpZXMgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgZWxlbWVudCBpZiBhbnkgZXhpc3QuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJQcm9wZXJ0aWVzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2Nwcm9wdmlldy5odG0iLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ4bWxtMjAwMCI+Ci08ZGVzY3JpcHRpb24+VGhpcyBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGxldHMgeW91IGVkaXQgYSB0ZXh0IGZpbGUgdGhhdCBpcyBjb2RlZCBpbiBhIG1hcmt1cCBsYW5ndWFnZS4gVGhlIGVkaXRvciBwcm92aWRlcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhcyBjb250ZW50IGFzc2lzdCwgc3ludGF4IGhpZ2hsaWdodGluZywgdW5saW1pdGVkIHVuZG8gYW5kIHJlZG8sIGVsZW1lbnQgc2VsZWN0aW9uIGFuZCBmb3JtYXR0aW5nLCBhbmQgZG9jdW1lbnQgZm9ybWF0dGluZy4gRm9yIGEgbW9yZSBzcGVjaWZpYyBsaXN0IG9mIGVkaXRpbmcgZmVhdHVyZXMsIHNlZSB0aGUgZmlyc3QgbGluayBiZWxvdy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDAwMCI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGN1c3RvbWl6ZSB0YXNrIHRhZyBkaXNjb3ZlcnkgaW4gdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLgotPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9ImVjc3MwMDAwIj4KLTxkZXNjcmlwdGlvbj5UaGUgQ1NTIHNvdXJjZSBwYWdlIGVkaXRvciBsZXRzIHlvdSBlZGl0IGEgY2FzY2FkaW5nIHN0eWxlIHNoZWV0LiBUaGUgZWRpdG9yIHByb3ZpZGVzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LCBzeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbywgZWxlbWVudCBzZWxlY3Rpb24gYW5kIGZvcm1hdHRpbmcsIGFuZCBkb2N1bWVudCBmb3JtYXR0aW5nLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJtaXNjMDE4MCI+Ci0gPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBlZGl0IHRoZSBDU1MgY29udGVudCBzZXR0aW5ncyBmb3IgYSBDU1MgZmlsZS4gWW91IGNhbiBzcGVjaWZ5IENTUyBwcm9maWxlIG9yIHJlc3RvcmUgdGhlIGRlZmF1bHQgYnkgY2xpY2tpbmcgPGI+UmVzdG9yZSBEZWZhdWx0czwvYj4uCi0gPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9FZGl0b3JDc3NDb250ZXh0czIueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvRWRpdG9yQ3NzQ29udGV4dHMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiYzM5ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9FZGl0b3JDc3NDb250ZXh0czIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJjc3Nzb3VyY2Vfc291cmNlX0hlbHBJZCI+Ci08ZGVzY3JpcHRpb24+VGhlIENTUyBzb3VyY2UgcGFnZSBlZGl0b3IgbGV0cyB5b3UgZWRpdCBhIGNhc2NhZGluZyBzdHlsZSBzaGVldC4gVGhlIGVkaXRvciBwcm92aWRlcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhcyBjb250ZW50IGFzc2lzdCwgc3ludGF4IGhpZ2hsaWdodGluZywgdW5saW1pdGVkIHVuZG8gYW5kIHJlZG8sIGVsZW1lbnQgc2VsZWN0aW9uIGFuZCBmb3JtYXR0aW5nLCBhbmQgZG9jdW1lbnQgZm9ybWF0dGluZy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0iZWNzczAwMDAiPgotPGRlc2NyaXB0aW9uPlRoZSBDU1Mgc291cmNlIHBhZ2UgZWRpdG9yIGxldHMgeW91IGVkaXQgYSBjYXNjYWRpbmcgc3R5bGUgc2hlZXQuIFRoZSBlZGl0b3IgcHJvdmlkZXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QsIHN5bnRheCBoaWdobGlnaHRpbmcsIHVubGltaXRlZCB1bmRvIGFuZCByZWRvLCBlbGVtZW50IHNlbGVjdGlvbiBhbmQgZm9ybWF0dGluZywgYW5kIGRvY3VtZW50IGZvcm1hdHRpbmcuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotIDxjb250ZXh0IGlkPSJtaXNjMDE4MCI+Ci0gPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBlZGl0IHRoZSBDU1MgY29udGVudCBzZXR0aW5ncyBmb3IgYSBDU1MgZmlsZS4gWW91IGNhbiBzcGVjaWZ5IENTUyBwcm9maWxlIG9yIHJlc3RvcmUgdGhlIGRlZmF1bHQgYnkgY2xpY2tpbmcgPGI+UmVzdG9yZSBEZWZhdWx0czwvYj4uCi0gPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDdjOTVlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMzAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjN2Y5OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBFZGl0b3JDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBFZGl0b3JDc3NDb250ZXh0czIueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwMjVkMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBwcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcAotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLUJ1bmRsZS1OYW1lLjAgPSBTU0UgaW5mb3BvcHMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEzNzk2Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IkVkaXRvckNvbnRleHRzLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJFZGl0b3JDc3NDb250ZXh0czIueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIi8+Ci08L2V4dGVuc2lvbj4KLQotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGM0YTZlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2MGM1Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogU3RhdGljIFdlYiBpbmZvcG9wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL1N0YXRpY1dlYldpekNvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL1N0YXRpY1dlYldpekNvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwZjQwMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9TdGF0aWNXZWJXaXpDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9IndlYncyMDAwIj4KLTxkZXNjcmlwdGlvbj4gVXNlIHRoaXMgcGFnZSB0byBuYW1lIHlvdXIgV2ViIHByb2plY3QgYW5kIHNwZWNpZnkgdGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uICh0aGUgcGxhY2Ugd2hlcmUgdGhlIHJlc291cmNlcyB5b3UgY3JlYXRlIGFyZSBzdG9yZWQuKSBXaGVuIHRoZSBVc2UgZGVmYXVsdCBjaGVjayBib3ggaXMgc2VsZWN0ZWQsIHRoZSBwcm9qZWN0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gd2hlcmUgeW91ciB3b3Jrc3BhY2UgcmVzaWRlcy4gVG8gY2hhbmdlIHRoZSBkZWZhdWx0IGZpbGUgc3lzdGVtIGxvY2F0aW9uLCBjbGVhciB0aGUgY2hlY2tib3ggYW5kIGxvY2F0ZSB0aGUgcGF0aCB1c2luZyB0aGUgPGI+QnJvd3NlPC9iPiBidXR0b24uIFRvIGNvbmZpZ3VyZSBhZGRpdGlvbmFsIG9wdGlvbnMsIHNlbGVjdCB0aGUgPGI+TmV4dDwvYj4gYnV0dG9uLgotSW4gdGhlIFRhcmdldCBSdW50aW1lIGZpZWxkLCBzZWxlY3QgdGhlIHNlcnZlciB3aGVyZSB5b3Ugd2FudCB0byBwdWJsaXNoIHRoZSBXZWIgcHJvamVjdC4gaWYgYSBzZXJ2ZXIgaXMgbm90IGFscmVhZHkgZGVmaW5lZCwgY2xpY2sgPGI+TmV3PC9iPiB0byBzZWxlY3QgYSBzZXJ2ZXIgcnVudGltZSBlbnZpcm9ubWVudC4gPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VidzIxMDAiPgotPGRlc2NyaXB0aW9uPlByZXNldHMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgZGVmYXVsdCBzZXQgb2YgZmFjZXQgdmVyc2lvbnMgdGhhdCB3aWxsIGNvbmZpZ3VyZSBhIHByb2plY3QgZm9yIGEgcGFydGljdWxhciB0eXBlIG9mIGRldmVsb3BtZW50LiBUaGUgU3RhdGljIFdlYiBNb2R1bGUgZmFjZXQgZW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSBkZXBsb3llZCBhcyBhIHN0YXRpYwotV2ViIG1vZHVsZS4gQ2xpY2sgU2hvdyBSdW50aW1lcyB0byB2aWV3IHRoZSBhdmFpbGFibGUgcnVudGltZXMgYW5kIHJ1bnRpbWUgY29tcG9zaXRpb25zLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgc3RhdGljIFdlYiBwcm9qZWN0IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jlc3RhLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYncyMjAwIj4KLTxkZXNjcmlwdGlvbj5UaGUgV2ViIGNvbnRlbnQgZm9sZGVyIGlzIHdoZXJlIHRoZSBlbGVtZW50cyBvZiB5b3VyIFdlYiBzaXRlIHN1Y2ggYXMgV2ViIHBhZ2VzLCBncmFwaGljcyBhbmQgc3R5bGUgc2hlZXRzIGFyZSBzdG9yZWQuIFRoaXMgZGlyZWN0b3J5IHN0cnVjdHVyZSBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRlbnQgb2YgeW91ciBXZWIgc2l0ZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBXQVIgZmlsZSBhdCBkZXBsb3ltZW50IGFuZCB0aGF0IGxpbmsgdmFsaWRhdGlvbiB3aWxsIHdvcmsgY29ycmVjdGx5LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuaHRtbCIvPgotPC9jb250ZXh0PgotCi0KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3YzFhOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBTdGF0aWNXZWJXaXpDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjFkMmRlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSAgICAgPSBTdGF0aWMgV2ViIGluZm9wb3AKLXBsdWdpblByb3ZpZGVyID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhYzAxOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotICAgICAgPGNvbnRleHRzIGZpbGU9IlN0YXRpY1dlYldpekNvbnRleHRzLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIvPgotPC9leHRlbnNpb24+Ci0KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZGNhOTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXJfMS4wLjAuamFyCi10ZW1wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1YjE1Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL0RvY0J1aWxkLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL0RvY0J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1Y2NmMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9Eb2NCdWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0gCi0KLQlUaGlzIHNjcmlwdCBidWlsZCB0aGUgSGVscCBwbHVnLWluIGJ5IHRyYW5zZm9ybWluZyB0aGUgRElUQSBzb3VyY2UgZmlsZXMgaW50byBIVE1MLgotCQotCVRvIHVzZSB0aGlzIHNjcmlwdCwgeW91IG11c3QgaW5zdGFsbCBESVRBLU9UIG9uIHlvdXIgbWFjaGluZSBpbiB0aGUgZGlyZWN0b3J5Ci0JZGVmaW5lZCBieSB0aGUgZGl0YS5vdC5kaXIgcHJvcGVydHkuCi0JCi0JUnVuIHRoZSBkZWZhdWx0IHRhcmdldCBhZnRlciB5b3UgZWRpdCB0aGUgRElUQSBzb3VyY2UgZmlsZXMgdG8gcmVnZW5lcmF0ZSB0aGUgSFRNTC4KLQkKLQlUbyBjdXN0b21pemUgdGhpcyBzY3JpcHQgZm9yIG90aGVyIEhlbHAgcGx1Zy1pbnMsIG1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIGFyZ3MuaW5wdXQgcHJvcGVydHkKLQl0byBiZSB0aGUgRElUQSBtYXAgZmlsZSBmb3IgdGhlIHBsdWctaW4uCi0JCi0JTk9URTogVGhpcyBzY3JpcHQgYXNzdW1lcyB0aGF0IGxpbmtzIHRvIHNpYmxpbmcgSGVscCBwbHVnLWlucyBoYXZlIHNjb3BlPSJwZWVyIiwgb3RoZXJ3aXNlIHRoZQotCW91dHB1dCBkaXJlY3Rvcnkgc3RydWN0dXJlIHdpbGwgYmUgc2hpZnRlZCBpbmNvcnJlY3RseS4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgeW91IGhhbmQgY29kZSB5b3VyIHBsdWdpbi54bWwgZmlsZSBpbiBteXBsdWdpbi54bWwuIFRoaXMgZmlsZQotCXdpbGwgYmUgY29waWVkIG92ZXIgdGhlIGdlbmVyYXRlZCBwbHVnaW4ueG1sIHdoaWNoIGlzIGN1cnJlbnRseSBub3QgYmVpbmcgZ2VuZXJhdGVkIGNvcnJlY3RseQotCWJ5IERJVEEtT1QuCi0JCi0JQ2hhbmdlTG9nOgotCTIwMDYtMDQtMDUgQXJ0aHVyIFJ5bWFuIDxyeW1hbkBjYS5pYm0uY29tPgotCS0gQ3JlYXRlZC4KLQkyMDA4LTAxLTA5IEthdGUgUHJpY2UgPGthdGVwQGNhLmlibS5jb20+Ci0JLSBtb2RpZmllZCBmb3IgbmV3IERJVEEtT1QgdmVyc2lvbgotCTIwMDgtMDUtMDUgS2F0ZSBQcmljZSA8a2F0ZXBAY2EuaWJtLmNvbT4KLQktIG1vZGlmaWVkIHRvIGFkZCBnZW5lcmF0aW9uIG9mIHByZS1idWlsdCBoZWxwIGluZGV4LiAKLQktIE11c3QgZGVsZXRlIC9pbmRleCBmb2xkZXIgYmVmb3JlIHJ1bm5pbmcgYnVpbGQKLS0tPgotPHByb2plY3QgbmFtZT0iZWNsaXBzZWhlbHAiIGRlZmF1bHQ9ImFsbCI+Ci0KLQk8cHJvcGVydHkgbmFtZT0iZGl0YS5vdC5kaXIiIGxvY2F0aW9uPSJDOi9ESVRBLU9UMS4yLjIiIC8+Ci0KLQk8cGF0aCBpZD0iZG9zdC5jbGFzcy5wYXRoIj4KLQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9bGliJHtmaWxlLnNlcGFyYXRvcn1kb3N0LmphciIgLz4KLQk8L3BhdGg+Ci0KLQk8dGFza2RlZiBuYW1lPSJpbnRlZ3JhdGUiIGNsYXNzbmFtZT0ib3JnLmRpdGEuZG9zdC5wbGF0Zm9ybS5JbnRlZ3JhdG9yVGFzayI+Ci0JCTxjbGFzc3BhdGggcmVmaWQ9ImRvc3QuY2xhc3MucGF0aCIgLz4KLQk8L3Rhc2tkZWY+Ci0JPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImludGVncmF0ZSwgZWNsaXBzZWhlbHAiPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iaW50ZWdyYXRlIj4KLQkJPGludGVncmF0ZSBkaXRhZGlyPSIke2RpdGEub3QuZGlyfSIgLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gcmV2aXNlIGJlbG93IGhlcmUgLS0+Ci0JPHRhcmdldCBuYW1lPSJlY2xpcHNlaGVscCI+Ci0JCTxhbnQgYW50ZmlsZT0iJHtkaXRhLm90LmRpcn0ke2ZpbGUuc2VwYXJhdG9yfWNvbmR1Y3Rvci54bWwiIHRhcmdldD0iaW5pdCIgZGlyPSIke2RpdGEub3QuZGlyfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5jb3B5Y3NzIiB2YWx1ZT0ibm8iIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5jc3NwYXRoIiB2YWx1ZT0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuZWNsaXBzZS5wcm92aWRlciIgdmFsdWU9IkVjbGlwc2Uub3JnIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuZWNsaXBzZS52ZXJzaW9uIiB2YWx1ZT0iMy4zLjAiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5pbnB1dCIgbG9jYXRpb249InJlbGF0ZWRsaW5rcy5kaXRhbWFwIiAvPiAgICAJCQotCQkJPHByb3BlcnR5IG5hbWU9ImNsZWFuLnRlbXAiIHZhbHVlPSJ0cnVlIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImRpdGEuZXh0bmFtZSIgdmFsdWU9Ii5kaXRhIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImRpdGEudGVtcC5kaXIiIGxvY2F0aW9uPSJ0ZW1wIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dC5kaXIiIGxvY2F0aW9uPSIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0idHJhbnN0eXBlIiB2YWx1ZT0iZWNsaXBzZWhlbHAiIC8+Ci0JCTwvYW50PgotCQk8Y29weSBmaWxlPSJteXBsdWdpbi54bWwiIHRvZmlsZT0icGx1Z2luLnhtbCIgb3ZlcndyaXRlPSJ5ZXMiIC8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJidWlsZC5pbmRleCIgZGVzY3JpcHRpb249IkJ1aWxkcyBzZWFyY2ggaW5kZXggZm9yIHRoZSBwbHVnLWluIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkgICAgIDxoZWxwLmJ1aWxkSGVscEluZGV4IG1hbmlmZXN0PSJwbHVnaW4ueG1sIiBkZXN0aW5hdGlvbj0iLiIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4ZjZhNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjUwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTNhMWM3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHdlYnRvb2xzX3RvYy54bWwsXAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyaW5kZXgueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICB0b3BpY3MvKmh0bSosXAotICAgICAgICAgICAgICAgaW5kZXgvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gKi5tYXBsaXN0LFwKLSAgICAgICAgICAgICAgICouZGl0YW1hcCxcCi0gICAgICAgICAgICAgICB0b3BpY3MvKi5kaXRhCi1iaW4uZXhjbHVkZXMgPSBEb2NCdWlsZC54bWwsXAotICAgICAgICAgICAgICAgbXlQbHVnaW4qLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL2ZpeGl0LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9maXhpdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYWZjM2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL2ZpeGl0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ncnB0eXBlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ncnB0eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZkMjQ1Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvZ3JwdHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbWVudWJ1dHRvbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbWVudWJ1dHRvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZjFhNjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL21lbnVidXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL25saW51eC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxMzVjZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9uc2hvd2Vyci5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbnNob3dlcnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmJmZGQ2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9uc2hvd2Vyci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndhcm5pbmcuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253YXJuaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0ZmRmOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndhcm5pbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253aW4uZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253aW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVmOWNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2Jyay5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmticmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIxNDMzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2Jyay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtjc3MuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rY3NzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwY2FmNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtjc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rZ3ItbC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtnci1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3M2I2YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtnci1sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2dyLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2dyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjNjI2MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtnci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtpbmQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5raW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzZjc1Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtpbmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rbWFsLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua21hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OWM0N2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rbWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua251bS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtudW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzI0YTYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua251bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtvdHIuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rb3RyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5NjU5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtvdHIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rcXVlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua3F1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NWY5MzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rcXVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua3Rzay5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmt0c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2Q0N2VlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvc2tpcGl0LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9za2lwaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWY1YjFiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9za2lwaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL3ZpZXdsaW5rLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy92aWV3bGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwN2IwNTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL3ZpZXdsaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L18xMC5jZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9fMTAuY2ZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDBjNGM1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L18xMC5jZnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9kZWxldGFibGUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9kZWxldGFibGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5M2Y0NzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvZGVsZXRhYmxlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTFlMWI3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfY29udHJpYnV0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1dlZCBNYXkgMTQgMjA6MDM6MDIgRURUIDIwMDgNCi1vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXI9b3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyXG4xLjAuNDAwLnF1YWxpZmllcg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZGVwZW5kZW5jaWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMGMyY2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNXZWQgTWF5IDE0IDIwOjAzOjAyIEVEVCAyMDA4DQotbHVjZW5lPTEuOS4xLnYyMDA4MDMwNjE4MTENCi1hbmFseXplcj1vcmcuZWNsaXBzZS5oZWxwLmJhc2VcIzMuMy4xMDAudjIwMDgwNDI1P2xvY2FsZVw9ZW4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9pbmRleGVkX2RvY3MgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9pbmRleGVkX2RvY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMDA5N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1dlZCBNYXkgMTQgMjA6MDM6MDIgRURUIDIwMDgNCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2ZpbHRibi5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3d0b3Zlci5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amRldGFncy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzZXJ2ZXJ0YXJnZXQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwY252cnQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJ2dy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3NlcnZibi5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2xzdHdpei5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3ByanNldC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ZsdHdpei5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90anByZWZzLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Zzci5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXByai5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWpzcC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2ViYXJ0aWZhY3QuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJwcmouaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVodG0uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dsaXN0Ym4uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d0ZmVhdHVyZXMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3ZWR0dncuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3BkanNwcy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BsaWIuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnByb2plY3RzLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3aW1wd2FyLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzdHlsZXNoZWV0Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jld2FyLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njc3RhdGljLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJwYWdlZGVzaWduLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3c3J2d2l6Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2Fyb3ZyLmh0bWw9MA0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOTc2OTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9teXBsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9teXBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTIwYjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjYiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+IAotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotICAgPHBsdWdpbj4gCi0gICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgICAgCTx0b2MgZmlsZT0id2VidG9vbHNfdG9jLnhtbCIgLz4gCi0gICAgICAgPGluZGV4IHBhdGg9ImluZGV4LyIvPgotICAgICAgICAgCSAgIDwvZXh0ZW5zaW9uPiAgCi0gICAgICAgICAJICAgCi0gICAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotICAgICAgICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcmluZGV4LnhtbCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgICA8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIubWFwbGlzdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci5tYXBsaXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWQ1MmRiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci5tYXBsaXN0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08bWFwbGlzdCB2ZXJzaW9uPSIzLjYuMiI+DQotICA8bmF2Pg0KLSAgICA8bWFwIGZpbGU9IndlYnRvb2xzX3RvYy5kaXRhbWFwIi8+DQotICA8L25hdj4NCi0gIDxsaW5rPg0KLSAgICA8bWFwIGZpbGU9InJlbGF0ZWRsaW5rcy5kaXRhbWFwIi8+DQotICA8L2xpbms+DQotPC9tYXBsaXN0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcmluZGV4LnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcmluZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJjOGE0ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXJpbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxpbmRleD4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiBhcHBsaWNhdGlvbnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2Njd3RvdmVyLmh0bWwjY2N3dG92ZXIiIHRpdGxlPSJXZWIgYXBwbGljYXRpb24gb3ZlcnZpZXciLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyBvciBpbXBvcnRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jd2VicHJvamVjdHMuaHRtbCNjd2VicHJvamVjdHMiIHRpdGxlPSJXZWIgcHJvamVjdHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJyZXNvdXJjZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NyZXByai5odG1sI3R3Y3JlcHJqIiB0aXRsZT0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2VydmVyIHRhcmdldGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzZXJ2ZXJ0YXJnZXQuaHRtbCN0c2VydmVydGFyZ2V0IiB0aXRsZT0iU2VydmVyIHRhcmdldGluZyBmb3IgV2ViIGFwcGxpY2F0aW9ucyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJXZWIgdG9vbHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJmZWF0dXJlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N3dGZlYXR1cmVzLmh0bWwjY3d0ZmVhdHVyZXMiIHRpdGxlPSJXZWIgdG9vbHMgZmVhdHVyZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBFeHBsb3JlciB2aWV3Ij4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jY3dlYnZ3Lmh0bWwjY2N3ZWJ2dyIgdGl0bGU9IlByb2plY3QgRXhwbG9yZXIgdmlldyBhbmQgV2ViIGRldmVsb3BtZW50Ii8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiBwcm9qZWN0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgRXhwbG9yZXIgdmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2Njd2VidncuaHRtbCNjY3dlYnZ3IiB0aXRsZT0iUHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N3ZWJwcm9qZWN0cy5odG1sI2N3ZWJwcm9qZWN0cyIgdGl0bGU9IldlYiBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIGR5bmFtaWMgcHJvamVjdHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NyZXByai5odG1sI3R3Y3JlcHJqIiB0aXRsZT0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZHluYW1pYyBwcm9qZWN0cyBvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2Njd2VicHJqLmh0bWwjY2N3ZWJwcmoiIHRpdGxlPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgc3RhdGljIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdjcmVzdGEuaHRtbCN0d2NyZXN0YSIgdGl0bGU9IkNyZWF0aW5nIGEgc3RhdGljIFdlYiBwcm9qZWN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY29udmVydGluZyBzdGF0aWMgdG8gZHluYW1pYyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3cGNudnJ0Lmh0bWwjdHdwY252cnQiIHRpdGxlPSJDb252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzdGF0aWMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jY3N0YXRpYy5odG1sI2Njc3RhdGljIiB0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImV4cG9ydGluZyBXQVIgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NyZXdhci5odG1sI3R3Y3Jld2FyIiB0aXRsZT0iRXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idmlydHVhbCBKQVIgZmlsZXMgYW5kIHByb2plY3RzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdwbGliLmh0bWwjdHdwbGliIiB0aXRsZT0iQWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icHJvcGVydGllcyBzZXR0aW5ncyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3cHJqc2V0Lmh0bWwjdHdwcmpzZXQiIHRpdGxlPSJTZXR0aW5nIFdlYiBwcm9qZWN0IHByb3BlcnRpZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iV2ViIHJlc291cmNlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3dlYnJlc291cmNlcy5odG1sI2N3ZWJyZXNvdXJjZXMiIHRpdGxlPSJXZWIgcmVzb3VyY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiBwYWdlIGRlc2lnbiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3dlYnBhZ2VkZXNpZ24uaHRtbCNjd2VicGFnZWRlc2lnbiIgdGl0bGU9IldlYiBwYWdlIGRlc2lnbiIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJXQVIgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmh0bWwjY3d3YXJvdnIiIHRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImltcG9ydGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3aW1wd2FyLmh0bWwjdHdpbXB3YXIiIHRpdGxlPSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJleHBvcnRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NyZXdhci5odG1sI3R3Y3Jld2FyIiB0aXRsZT0iRXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVudGVycHJpc2UgYXBwbGljYXRpb25zIj4KLSAgICA8ZW50cnkga2V5d29yZD0icHJvamVjdHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImR5bmFtaWMgV2ViIHByb2plY3RzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jY3dlYnByai5odG1sI2Njd2VicHJqIiB0aXRsZT0iRHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9ucyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic3RhdGljIFdlYiBwcm9qZWN0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdjcmVzdGEuaHRtbCN0d2NyZXN0YSIgdGl0bGU9IkNyZWF0aW5nIGEgc3RhdGljIFdlYiBwcm9qZWN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY29udmVydGluZyB0byBkeW5hbWljIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdwY252cnQuaHRtbCN0d3BjbnZydCIgdGl0bGU9IkNvbnZlcnRpbmcgc3RhdGljIFdlYiBwcm9qZWN0cyB0byBkeW5hbWljIFdlYiBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2NzdGF0aWMuaHRtbCNjY3N0YXRpYyIgdGl0bGU9IlN0YXRpYyBXZWIgcHJvamVjdHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZXhwb3J0aW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iV0FSIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdjcmV3YXIuaHRtbCN0d2NyZXdhciIgdGl0bGU9IkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ2aXJ0dWFsIEpBUiBmaWxlcyBhc3NvY2lhdGlvbnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJXZWIgbGlicmFyeSBwcm9qZWN0cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3cGxpYi5odG1sI3R3cGxpYiIgdGl0bGU9IkFkZGluZyBXZWIgbGlicmFyeSBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ3b3JrYmVuY2giPgotICAgIDxlbnRyeSBrZXl3b3JkPSJXZWIgZWRpdG9ycyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N3d2VkdHZ3Lmh0bWwjY3d3ZWR0dnciIHRpdGxlPSJXb3JrYmVuY2ggaW50ZWdyYXRpb24gd2l0aCBXZWIgZWRpdG9ycyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJXZWIgcGFnZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqZGV0YWdzLmh0bWwjdGpkZXRhZ3MiIHRpdGxlPSJDcmVhdGluZyBhbmQgZWRpdGluZyBXZWIgcGFnZXMgLSBvdmVydmlldyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJmcmFtZXNldHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqY3JlaHRtLmh0bWwjdGpjcmVodG0iIHRpdGxlPSJDcmVhdGluZyBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkhUTUwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqY3JlaHRtLmh0bWwjdGpjcmVodG0iIHRpdGxlPSJDcmVhdGluZyBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyBwcmVmZXJlbmNlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqcHJlZnMuaHRtbCN0anByZWZzIiB0aXRsZT0iRGVmaW5pbmcgSFRNTCBmaWxlIHByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldNTCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpjcmVodG0uaHRtbCN0amNyZWh0bSIgdGl0bGU9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWEhUTUwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqY3JlaHRtLmh0bWwjdGpjcmVodG0iIHRpdGxlPSJDcmVhdGluZyBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIGF1dG9tYXRpY2FsbHkiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90anByZWZzLmh0bWwjdGpwcmVmcyIgdGl0bGU9IkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJIVE1MIGZpbGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyBwcmVmZXJlbmNlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqcHJlZnMuaHRtbCN0anByZWZzIiB0aXRsZT0iRGVmaW5pbmcgSFRNTCBmaWxlIHByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InN0eWxlIHNoZWV0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHN0eWxlc2hlZXQuaHRtbCN0c3R5bGVzaGVldCIgdGl0bGU9IkNyZWF0aW5nIGNhc2NhZGluZyBzdHlsZSBzaGVldHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlNQIGZpbGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90amNyZWpzcC5odG1sI3RqY3JlanNwIiB0aXRsZT0iQ3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3BkanNwcy5odG1sI2NwZGpzcHMiIHRpdGxlPSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iV2ViIGNvbnRlbnQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGR5bmFtaWNhbGx5Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3BkanNwcy5odG1sI2NwZGpzcHMiIHRpdGxlPSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2VydmxldHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3c3J2d2l6Lmh0bWwjdHdzcnZ3aXoiIHRpdGxlPSJDcmVhdGluZyBzZXJ2bGV0cyIvPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2xzdHdpei5odG1sI3R3bHN0d2l6IiB0aXRsZT0iQ3JlYXRpbmcgTGlzdGVuZXJzIi8+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Zmx0d2l6Lmh0bWwjdHdmbHR3aXoiIHRpdGxlPSJDcmVhdGluZyBGaWx0ZXJzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jd3NlcnZibi5odG1sI2N3c2VydmJuIiB0aXRsZT0iU2VydmxldHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iV2ViIHNlcnZlcnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGR5bmFtaWMgY29udGVudCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N3c2VydmJuLmh0bWwjY3dzZXJ2Ym4iIHRpdGxlPSJTZXJ2bGV0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJsaXN0ZW5lcnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N3bGlzdGJuLmh0bWwjY3dsaXN0Ym4iIHRpdGxlPSJMaXN0ZW5lcnMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZmlsdGVycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3dmaWx0Ym4uaHRtbCNjd2ZpbHRibiIgdGl0bGU9Ikxpc3RlbmVycyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJidWlsZCBvdXRwdXQgZm9sZGVycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imlnbm9yaW5nIGluIENWUyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y3Zzci5odG1sI3R3Y3ZzciIgdGl0bGU9IlNldHRpbmcgQ1ZTIHJlcG9zaXRvcnkgZGVmYXVsdHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQ1ZTIj4KLSAgICA8ZW50cnkga2V5d29yZD0ic2V0dGluZyByZXBvc2l0b3J5IGRlZmF1bHRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdjdnNyLmh0bWwjdHdjdnNyIiB0aXRsZT0iU2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjdnNpZ25vcmUgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y3Zzci5odG1sI3R3Y3ZzciIgdGl0bGU9IlNldHRpbmcgQ1ZTIHJlcG9zaXRvcnkgZGVmYXVsdHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icmVwb3NpdG9yaWVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZGVmYXVsdCBDVlMgc2V0dGluZ3MiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2N2c3IuaHRtbCN0d2N2c3IiIHRpdGxlPSJTZXR0aW5nIENWUyByZXBvc2l0b3J5IGRlZmF1bHRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNlcnZlcnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJ0YXJnZXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c2VydmVydGFyZ2V0Lmh0bWwjdHNlcnZlcnRhcmdldCIgdGl0bGU9IlNlcnZlciB0YXJnZXRpbmcgZm9yIFdlYiBhcHBsaWNhdGlvbnMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotPC9pbmRleD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDMyNTE4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSAgID0gV2ViIHRvb2xzIGRvY3VtZW50YXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTIwYjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy42Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PiAKLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLSAgIDxwbHVnaW4+IAotICAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgICAgIAk8dG9jIGZpbGU9IndlYnRvb2xzX3RvYy54bWwiIC8+IAotICAgICAgIDxpbmRleCBwYXRoPSJpbmRleC8iLz4KLSAgICAgICAgIAkgICA8L2V4dGVuc2lvbj4gIAotICAgICAgICAgCSAgIAotICAgICAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgICAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXJpbmRleC54bWwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICAgPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcmVsYXRlZGxpbmtzLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9yZWxhdGVkbGlua3MuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3OGYzMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9yZWxhdGVkbGlua3MuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIg0KLSAibWFwLmR0ZCI+DQotPG1hcCB0aXRsZT0iV2ViIHRvb2xzIHJlbGF0ZWQgbGlua3MiPg0KLTxyZWx0YWJsZT4NCi08cmVsaGVhZGVyPg0KLTxyZWxjb2xzcGVjIHR5cGU9ImNvbmNlcHQiPjwvcmVsY29sc3BlYz4NCi08cmVsY29sc3BlYyB0eXBlPSJ0YXNrIj48L3JlbGNvbHNwZWM+DQotPHJlbGNvbHNwZWMgdHlwZT0icmVmZXJlbmNlIj48L3JlbGNvbHNwZWM+DQotPC9yZWxoZWFkZXI+DQotPHJlbHJvdz4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY2hneGR0LmRpdGEiIG5hdnRpdGxlPSJTcGVjaWZ5aW5nIGFuIGltcGxpY2l0IGRvY3VtZW50IHR5cGUgZm9yIGFuIEhUTUwsIFhIVE1MLCBvciBKU1AgZnJhZ21lbnQiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amNyZWh0bS5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0cyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jcGRqc3BzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNlcnZlcnRhcmdldC5kaXRhIiBuYXZ0aXRsZT0iU2VydmVyIHRhcmdldGluZyBmb3IgV2ViIGFwcGxpY2F0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2NzdGF0aWMuZGl0YSIgbmF2dGl0bGU9IlN0YXRpYyBXZWIgcHJvamVjdHMiIHNjb3BlPSJwZWVyIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouZGl0YSIgbmF2dGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amNyZWpzcC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3N0YXRpYy5kaXRhIiBuYXZ0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyIgc2NvcGU9InBlZXIiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3Jlc3RhLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dhcm92ci5kaXRhIiBuYXZ0aXRsZT0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiIHNjb3BlPSJwZWVyIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3Jld2FyLmRpdGEiIG5hdnRpdGxlPSJFeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3Zzci5kaXRhIiBuYXZ0aXRsZT0iU2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0cyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dhcm92ci5kaXRhIiBuYXZ0aXRsZT0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiIHNjb3BlPSJwZWVyIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3aW1wd2FyLmRpdGEiIG5hdnRpdGxlPSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3N0YXRpYy5kaXRhIiBuYXZ0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyIgc2NvcGU9InBlZXIiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3dlYnByai5kaXRhIiBuYXZ0aXRsZT0iRHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9ucyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3BjbnZydC5kaXRhIiBuYXZ0aXRsZT0iQ29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3BsaWIuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBXZWIgbGlicmFyeSBwcm9qZWN0cyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdwcmpzZXQuZGl0YSIgbmF2dGl0bGU9IlNldHRpbmcgV2ViIHByb2plY3QgcHJvcGVydGllcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dzZXJ2Ym4uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlNlcnZsZXRzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3Nydndpei5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgU2VydmxldHMiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3bGlzdGJuLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJMaXN0ZW5lcnMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3bHN0d2l6LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBMaXN0ZW5lcnMiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZmlsdGJuLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJGaWx0ZXJzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2ZsdHdpei5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgRmlsdGVycyI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3ZWJ2dy5kaXRhIiBuYXZ0aXRsZT0iUHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicHJvamVjdHMuZGl0YSIgbmF2dGl0bGU9IldlYiBwcm9qZWN0cyIgc2NvcGU9InBlZXIiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3d0b3Zlci5kaXRhIiBuYXZ0aXRsZT0iV2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3Ig0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3BkanNwcy5kaXRhIiBuYXZ0aXRsZT0iSmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5Ig0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3aW1wd2FyLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd3RvdmVyLmRpdGEiIG5hdnRpdGxlPSJXZWIgYXBwbGljYXRpb24gb3ZlcnZpZXciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3RmZWF0dXJlcy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIHRvb2xzIGZlYXR1cmVzIj4NCi08L3RvcGljcmVmPg0KLTwhLS0gPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2ViZGV2ZWxvcG1lbnR0b29scy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGRldmVsb3BtZW50IHRvb2xzIj4NCi08L3RvcGljcmVmPiAtLT4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCINCi1zY29wZT0icGVlciI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amRldGFncy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXciPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYmFydGlmYWN0LmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBXZWIgQXJ0aWZhY3RzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d0ZmVhdHVyZXMuZGl0YSIgbmF2dGl0bGU9IldlYiB0b29scyBmZWF0dXJlcyI+PC90b3BpY3JlZj4NCi08IS0tIDx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYmRldmVsb3BtZW50dG9vbHMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBkZXZlbG9wbWVudCB0b29scyI+DQotPC90b3BpY3JlZj4gLS0+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3dlYnByai5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJwYWdlZGVzaWduLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgcGFnZSBkZXNpZ24iPg0KLTwvdG9waWNyZWY+DQotPCEtLSA8dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJ0ZWNobm9sb2dpZXMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiB0ZWNobm9sb2dpZXMiPg0KLTwvdG9waWNyZWY+IC0tPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amNyZWpzcC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3c3J2d2l6LmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBTZXJ2bGV0cyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3bHN0d2l6LmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBMaXN0ZW5lcnMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2ZsdHdpei5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgRmlsdGVycyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTwhLS0gPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VidGVjaG5vbG9naWVzLmRpdGEiIG5hdnRpdGxlPSJXZWIgdGVjaG5vbG9naWVzIj4NCi08L3RvcGljcmVmPiAtLT4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd2VicHJqLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3BkanNwcy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iSmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3BkanNwcy5kaXRhIiBuYXZ0aXRsZT0iSmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dzZXJ2Ym4uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlNlcnZsZXRzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dsaXN0Ym4uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9Ikxpc3RlbmVycyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZmlsdGJuLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJGaWx0ZXJzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amNyZWpzcC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dzZXJ2Ym4uZGl0YSIgbmF2dGl0bGU9IlNlcnZsZXRzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dsaXN0Ym4uZGl0YSIgbmF2dGl0bGU9Ikxpc3RlbmVycyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZmlsdGJuLmRpdGEiIG5hdnRpdGxlPSJGaWx0ZXJzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3dG92ZXIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyI+DQotPC90b3BpY3JlZj4NCi08IS0tIDx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYmRldmVsb3BtZW50dG9vbHMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBkZXZlbG9wbWVudCB0b29scyI+DQotPC90b3BpY3JlZj4gLS0+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdzcnZ3aXouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIFNlcnZsZXRzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdsc3R3aXouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIExpc3RlbmVycyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Zmx0d2l6LmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBGaWx0ZXJzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPCEtLSA8dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJkZXZlbG9wbWVudHRvb2xzLmRpdGEiIG5hdnRpdGxlPSJXZWIgZGV2ZWxvcG1lbnQgdG9vbHMiPg0KLTwvdG9waWNyZWY+IC0tPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2NzdGF0aWMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlN0YXRpYyBXZWIgcHJvamVjdHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3dlYnByai5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVzdGEuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgc3RhdGljIFdlYiBwcm9qZWN0Ig0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlaHRtLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjcmVqc3AuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd3RvdmVyLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgYXBwbGljYXRpb24gb3ZlcnZpZXciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dlZHR2dy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV29ya2JlbmNoIGludGVncmF0aW9uIHdpdGggV2ViIGVkaXRvcnMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpwcmVmcy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRGVmaW5pbmcgSFRNTCBmaWxlIHByZWZlcmVuY2VzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jcGRqc3BzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnByb2plY3RzLmRpdGEiIG5hdnRpdGxlPSJXZWIgcHJvamVjdHMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3N0YXRpYy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd2VicHJqLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d3YXJvdnIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBhcmNoaXZlIChXQVIpIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXN0YS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXByai5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0Ig0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3N0YXRpYy5kaXRhIiBuYXZ0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJyZXNvdXJjZXMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiByZXNvdXJjZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dhcm92ci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVzdGEuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgc3RhdGljIFdlYiBwcm9qZWN0Ig0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3dlYnByai5kaXRhIiBuYXZ0aXRsZT0iRHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJyZXNvdXJjZXMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiByZXNvdXJjZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dhcm92ci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amNyZWpzcC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnBhZ2VkZXNpZ24uZGl0YSIgbmF2dGl0bGU9IldlYiBwYWdlIGRlc2lnbiI+PC90b3BpY3JlZj4NCi08IS0tIDx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYmRldmVsb3BtZW50dG9vbHMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBkZXZlbG9wbWVudCB0b29scyI+DQotPC90b3BpY3JlZj4gLS0+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqZGV0YWdzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhbmQgZWRpdGluZyBXZWIgcGFnZXMgLSBvdmVydmlldyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnJlc291cmNlcy5kaXRhIiBuYXZ0aXRsZT0iV2ViIHJlc291cmNlcyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dlZHR2dy5kaXRhIiBuYXZ0aXRsZT0iV29ya2JlbmNoIGludGVncmF0aW9uIHdpdGggV2ViIGVkaXRvcnMiPg0KLTwvdG9waWNyZWY+DQotPCEtLSA8dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJkZXZlbG9wbWVudHRvb2xzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgZGV2ZWxvcG1lbnQgdG9vbHMiPg0KLTwvdG9waWNyZWY+IC0tPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnJlc291cmNlcy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIHJlc291cmNlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amNyZWpzcC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d3YXJvdnIuZGl0YSIgbmF2dGl0bGU9IldlYiBhcmNoaXZlIChXQVIpIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnJlc291cmNlcy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIHJlc291cmNlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2ltcHdhci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iSW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmV3YXIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlcyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicmVzb3VyY2VzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgcmVzb3VyY2VzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPg0KLTwhLS0gPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2ViZGV2ZWxvcG1lbnR0b29scy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGRldmVsb3BtZW50IHRvb2xzIj4NCi08L3RvcGljcmVmPiAtLT4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd3RvdmVyLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgYXBwbGljYXRpb24gb3ZlcnZpZXciPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqZGV0YWdzLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhbmQgZWRpdGluZyBXZWIgcGFnZXMgLSBvdmVydmlldyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpwcmVmcy5kaXRhIiBuYXZ0aXRsZT0iRGVmaW5pbmcgSFRNTCBmaWxlIHByZWZlcmVuY2VzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPC9yZWx0YWJsZT4NCi08L21hcD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9yZWxhdGVkbGlua3MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcmVsYXRlZGxpbmtzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4YTMyOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9yZWxhdGVkbGlua3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJXZWIgdG9vbHMgcmVsYXRlZCBsaW5rcyIvPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njc3RhdGljLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2NzdGF0aWMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U4MDlmYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2NzdGF0aWMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY2NzdGF0aWMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlN0YXRpYyBXZWIgcHJvamVjdHM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPldlYiBwcm9qZWN0czxpbmRleHRlcm0+c3RhdGljPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5zdGF0aWMgV2ViIHByb2plY3RzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5JZiB5b3UgIHdhbnQgdG8gY3JlYXRlIGEgY29udGVudC1iYXNlZCBXZWIgYXBwbGljYXRpb24gdGhhdCBkb2VzIG5vdCBjb250YWluDQotYW55IGR5bmFtaWMgY29udGVudCAgKHN1Y2ggYXMgc2VydmxldHMsIEpTUCBmaWxlcywgZmlsdGVycywgYW5kIGFzc29jaWF0ZWQNCi1tZXRhZGF0YSkgeW91IG1pZ2h0IHByZWZlciB0byBjcmVhdGUgYSBzdGF0aWMgV2ViIHByb2plY3QsIGFzIG9wcG9zZWQgdG8gYSA8eHJlZg0KLWhyZWY9ImNjd2VicHJqLmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+ZHluYW1pYyBXZWIgcHJvamVjdDwveHJlZj4uPC9wPg0KLTxwPlN0YXRpYyBXZWIgcHJvamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczogIDx1bD4NCi08bGk+YSBXZWIgY29udGVudCBmb2xkZXIgKGNhbGxlZCBXZWJDb250ZW50KSBmb3IgYWxsIHB1Ymxpc2hhYmxlIHJlc291cmNlcywNCi1Zb3UgY2FuIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIGZvbGRlciBmcm9tIHRoZSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUuPC9saT4NCi08bGk+YSBUaGVtZSBmb2xkZXIsIHRoZSBzdWdnZXN0ZWQgZGlyZWN0b3J5IGZvciBzdG9yaW5nIGNhc2NhZGluZyBzdHlsZSBzaGVldHMNCi1hbmQgb3RoZXIgc3R5bGUtcmVsYXRlZCBvYmplY3RzLjwvbGk+DQotPGxpPnRoZSBhYmlsaXR5IHRvIGRlZmluZSBmb2xkZXJzIG91dHNpZGUgb2YgdGhlIFdlYiBjb250ZW50IGZvbGRlciwgZm9yIHN0b3JpbmcNCi1pbnRlcm1lZGlhdGUgZmlsZXMsIHN1Y2ggYXMgTUlGIGZpbGVzPC9saT4NCi08bGk+YSBjb252ZXJzaW9uIHBhdGggZnJvbSBhIHN0YXRpYyBXZWIgcHJvamVjdCB0byBhIGR5bmFtaWMgV2ViIHByb2plY3QuDQotSWYgeW91IGRlY2lkZSB0byA8eHJlZiBocmVmPSJ0d3BjbnZydC5kaXRhIiBzY29wZT0icGVlciI+PGRlc2M+PC9kZXNjPmNvbnZlcnQ8L3hyZWY+IHRoZQ0KLXByb2plY3QsIGl0IHdpbGwgYmUgYSBmdWxseS12YWxpZCBkeW5hbWljIFdlYiBwcm9qZWN0LiA8L2xpPg0KLTwvdWw+PC9wPg0KLTxwPkluIGFkZGl0aW9uLCB5b3VyIHByb2plY3Qgd2lsbCBzdGlsbCBoYXZlIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgKHdoaWNoDQotYXJlIGNvbW1vbiB0byBib3RoIHN0YXRpYyBhbmQgZHluYW1pYyBXZWIgcHJvamVjdHMgKSA6IDx1bD4NCi08bGk+SFRNTCBzeW50YXggdmFsaWRhdGlvbjwvbGk+DQotPGxpPmEgYnJva2VuIGxpbmsgZml4LXVwIHdpemFyZDwvbGk+DQotPGxpPmEgV2ViIHNpdGUgbmF2aWdhdGlvbiB0b29sPC9saT4NCi08bGk+YSBuZXcgc2VydmVyIHR5cGUsIHRoZSBTdGF0aWMgV2ViIHNlcnZlciwgd2hpY2ggbWFrZXMgaXQgZWFzeSB0byBwdWJsaXNoDQotc3RhdGljIFdlYiBwcm9qZWN0czwvbGk+DQotPC91bD4gPC9wPg0KLTxwPlRoZSBmb2xkZXIgdGhhdCBhIHN0YXRpYyBXZWIgcHJvamVjdCBpcyBwdWJsaXNoZWQgdG8gaXMgbW9kaWZpYWJsZSwgc28NCi10aGF0IHdoZW4geW91IHNldCB0aGUgcHVibGlzaGluZyAicm9vdCIgdmFsdWUgKGNhbGxlZCBhIDxpPmNvbnRleHQgcm9vdDwvaT4pLA0KLXN1Y2ggYXMgPGNvZGVwaD4vd2ViMTwvY29kZXBoPiwgZm9yIGEgc3RhdGljIHByb2plY3QsIGV2ZXJ5dGhpbmcgaW4gdGhlIFdlYg0KLWNvbnRlbnQgZm9sZGVyIHdpbGwgYmUgcHVibGlzaGVkIHRvIHRoZSA8ZmlsZXBhdGg+d2ViMTwvZmlsZXBhdGg+IGZvbGRlciB1bmRlcg0KLXRoZSBXZWIgc2VydmVyJ3MgZG9jIHJvb3QuIFRoaXMgZW5hYmxlcyB5b3UgdG8gZ3JvdXAgV2ViIHJlc291cmNlcyBvbiBhIFdlYg0KLXNlcnZlciBpbiBmb2xkZXJzIHRoYXQgY29ycmVzcG9uZCB0byBXZWIgcHJvamVjdHMgaW4gdGhlIHdvcmtiZW5jaC4gV2hlbiBwcm9qZWN0cw0KLWRlZmluZWQgaW4gdGhpcyB3YXkgYXJlIHJlYWR5IGZvciBwcm9kdWN0aW9uLCB5b3UgY2FuIHB1Ymxpc2ggc3BlY2lmaWMgcHJvamVjdHMNCi1kaXJlY3RseSB0byB0aGUgZG9jIHJvb3QgYnkgY2hhbmdpbmcgdGhlIHZhbHVlIHRvIDxjb2RlcGg+LzwvY29kZXBoPiBhbmQgYWxsDQotcHVibGlzaGluZywgbGluayBmaXhpbmcsIGFuZCBicm93c2luZyB3aWxsIHVwZGF0ZSBhdXRvbWF0aWNhbGx5LjwvcD4NCi08cD5BbGlhc2VzIGNhbiBhbHNvIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGNvbnRleHQgcm9vdCB2YWx1ZS4gRm9yIGV4YW1wbGUsDQotc3VwcG9zZSB0aGF0IHRoZXJlIGlzIGFuIGFsaWFzIHRoYXQgaXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IFdlYiBzZXJ2ZXIsIGFzDQotZm9sbG93czogPGNvZGVibG9jaz5BbGlhcyAvc2NyaXB0cy8gIi92YXIvd3d3L3NjcmlwdHMiPC9jb2RlYmxvY2s+SW4gdGhpcw0KLWV4YW1wbGUsIGluIHdoaWNoIHRoZSBjdXJyZW50IHN0YXRpYyBXZWIgcHJvamVjdCB3aWxsIGNvbnRhaW4gY29tbW9uIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+IGZpbGVzLA0KLXlvdSBjYW4gc2V0IHRoZSBjb250ZXh0IHJvb3QgdmFsdWUgdG8gYmUgPHBoPiJzY3JpcHRzIjwvcGg+LiAgSW4gb3JkZXIgZm9yDQotdGhlIHJlc291cmNlcyBpbiB0aGUgc3RhdGljIFdlYiBwcm9qZWN0IHRvIGJlIHB1Ymxpc2hlZCB0byB0aGUgY29ycmVjdCBsb2NhdGlvbg0KLW9uIHRoZSBXZWIgc2VydmVyLCB5b3UgbXVzdCBhZGQgdGhpcyBBbGlhcyBtYXBwaW5nIHRvIHRoZSBzZXJ2ZXIgdG9vbHMgaW5zdGFuY2UNCi1vZiB0aGUgc3RhdGljIFdlYiBzZXJ2ZXIsIGFzIGZvbGxvd3MuICA8b2w+DQotPGxpPkZyb20gdGhlIFNlcnZlciB2aWV3LCBkb3VibGUtY2xpY2sgb24gdGhlIHN0YXRpYyBXZWIgc2VydmVyIGNvbmZpZ3VyYXRpb24NCi10byBvcGVuIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBlZGl0b3IuPG5vdGU+VGhpcyBhc3N1bWVzIHRoYXQgeW91J3ZlIGFscmVhZHkNCi1kZWZpbmVkIHRoZSBzdGF0aWMgV2ViIHNlcnZlci48L25vdGU+PC9saT4NCi08bGk+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+Q29uZmlndXJhdGlvbjwvdWljb250cm9sPiBlZGl0b3IgdGFiLjwvbGk+DQotPGxpPlNjcm9sbCBkb3duIHRvIHRoZSA8dWljb250cm9sPkFsaWFzIFBhdGggTWFwcGluZzwvdWljb250cm9sPiBzZWN0aW9uLA0KLWFuZCBhZGQgdGhlIG5ldyBBbGlhcyBtYXBwaW5nLjwvbGk+DQotPC9vbD5Ob3cgdGhhdCA8cGg+InNjcmlwdHMiPC9waD4gaXMgZGVmaW5lZCBhcyBhbiBBbGlhcywgdGhlIFdlYiBjb250ZW50IGluDQotdGhlIHN0YXRpYyBXZWIgcHJvamVjdCB3aWxsIGJlIHB1Ymxpc2hlZCB0byB0aGUgbWFwcGVkIHBhdGgsIDxmaWxlcGF0aD4vdmFyL3d3dy9zY3JpcHRzPC9maWxlcGF0aD4uPC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njc3RhdGljLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2NzdGF0aWMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRhZTM1NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2NzdGF0aWMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTdGF0aWMgV2ViIHByb2plY3RzIiAvPgotPG1ldGEgY29udGVudD0iV2ViIHByb2plY3RzLCBzdGF0aWMsIHN0YXRpYyBXZWIgcHJvamVjdHMsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV2ViIHByb2plY3RzLCBzdGF0aWMsIHN0YXRpYyBXZWIgcHJvamVjdHMsIG92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3ZWJyZXNvdXJjZXMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3d2Fyb3ZyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2NyZXN0YS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNjc3RhdGljIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U3RhdGljIFdlYiBwcm9qZWN0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2NzdGF0aWMiPjxhIG5hbWU9ImNjc3RhdGljIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TdGF0aWMgV2ViIHByb2plY3RzPC9oMT4KLQotCi08ZGl2PgotPHA+SWYgeW91ICB3YW50IHRvIGNyZWF0ZSBhIGNvbnRlbnQtYmFzZWQgV2ViIGFwcGxpY2F0aW9uIHRoYXQgZG9lcyBub3QgY29udGFpbgotYW55IGR5bmFtaWMgY29udGVudCAgKHN1Y2ggYXMgc2VydmxldHMsIEpTUCBmaWxlcywgZmlsdGVycywgYW5kIGFzc29jaWF0ZWQKLW1ldGFkYXRhKSB5b3UgbWlnaHQgcHJlZmVyIHRvIGNyZWF0ZSBhIHN0YXRpYyBXZWIgcHJvamVjdCwgYXMgb3Bwb3NlZCB0byBhIDxhIGhyZWY9ImNjd2VicHJqLmh0bWwiIHRpdGxlPSIiPmR5bmFtaWMgV2ViIHByb2plY3Q8L2E+LjwvcD4KLQotPGRpdiBjbGFzcz0icCI+U3RhdGljIFdlYiBwcm9qZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyaXN0aWNzOiAgPHVsPgotPGxpPmEgV2ViIGNvbnRlbnQgZm9sZGVyIChjYWxsZWQgV2ViQ29udGVudCkgZm9yIGFsbCBwdWJsaXNoYWJsZSByZXNvdXJjZXMsCi1Zb3UgY2FuIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIGZvbGRlciBmcm9tIHRoZSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUuPC9saT4KLQotPGxpPmEgVGhlbWUgZm9sZGVyLCB0aGUgc3VnZ2VzdGVkIGRpcmVjdG9yeSBmb3Igc3RvcmluZyBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzCi1hbmQgb3RoZXIgc3R5bGUtcmVsYXRlZCBvYmplY3RzLjwvbGk+Ci0KLTxsaT50aGUgYWJpbGl0eSB0byBkZWZpbmUgZm9sZGVycyBvdXRzaWRlIG9mIHRoZSBXZWIgY29udGVudCBmb2xkZXIsIGZvciBzdG9yaW5nCi1pbnRlcm1lZGlhdGUgZmlsZXMsIHN1Y2ggYXMgTUlGIGZpbGVzPC9saT4KLQotPGxpPmEgY29udmVyc2lvbiBwYXRoIGZyb20gYSBzdGF0aWMgV2ViIHByb2plY3QgdG8gYSBkeW5hbWljIFdlYiBwcm9qZWN0LgotSWYgeW91IGRlY2lkZSB0byA8YSBocmVmPSJ0d3BjbnZydC5odG1sIiB0aXRsZT0iIj5jb252ZXJ0PC9hPiB0aGUKLXByb2plY3QsIGl0IHdpbGwgYmUgYSBmdWxseS12YWxpZCBkeW5hbWljIFdlYiBwcm9qZWN0LiA8L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InAiPkluIGFkZGl0aW9uLCB5b3VyIHByb2plY3Qgd2lsbCBzdGlsbCBoYXZlIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgKHdoaWNoCi1hcmUgY29tbW9uIHRvIGJvdGggc3RhdGljIGFuZCBkeW5hbWljIFdlYiBwcm9qZWN0cyApIDogPHVsPgotPGxpPkhUTUwgc3ludGF4IHZhbGlkYXRpb248L2xpPgotCi08bGk+YSBicm9rZW4gbGluayBmaXgtdXAgd2l6YXJkPC9saT4KLQotPGxpPmEgV2ViIHNpdGUgbmF2aWdhdGlvbiB0b29sPC9saT4KLQotPGxpPmEgbmV3IHNlcnZlciB0eXBlLCB0aGUgU3RhdGljIFdlYiBzZXJ2ZXIsIHdoaWNoIG1ha2VzIGl0IGVhc3kgdG8gcHVibGlzaAotc3RhdGljIFdlYiBwcm9qZWN0czwvbGk+Ci0KLTwvdWw+Ci0gPC9kaXY+Ci0KLTxwPlRoZSBmb2xkZXIgdGhhdCBhIHN0YXRpYyBXZWIgcHJvamVjdCBpcyBwdWJsaXNoZWQgdG8gaXMgbW9kaWZpYWJsZSwgc28KLXRoYXQgd2hlbiB5b3Ugc2V0IHRoZSBwdWJsaXNoaW5nICJyb290IiB2YWx1ZSAoY2FsbGVkIGEgPGVtPmNvbnRleHQgcm9vdDwvZW0+KSwKLXN1Y2ggYXMgPHNhbXAgY2xhc3M9ImNvZGVwaCI+L3dlYjE8L3NhbXA+LCBmb3IgYSBzdGF0aWMgcHJvamVjdCwgZXZlcnl0aGluZyBpbiB0aGUgV2ViCi1jb250ZW50IGZvbGRlciB3aWxsIGJlIHB1Ymxpc2hlZCB0byB0aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj53ZWIxPC9zcGFuPiBmb2xkZXIgdW5kZXIKLXRoZSBXZWIgc2VydmVyJ3MgZG9jIHJvb3QuIFRoaXMgZW5hYmxlcyB5b3UgdG8gZ3JvdXAgV2ViIHJlc291cmNlcyBvbiBhIFdlYgotc2VydmVyIGluIGZvbGRlcnMgdGhhdCBjb3JyZXNwb25kIHRvIFdlYiBwcm9qZWN0cyBpbiB0aGUgd29ya2JlbmNoLiBXaGVuIHByb2plY3RzCi1kZWZpbmVkIGluIHRoaXMgd2F5IGFyZSByZWFkeSBmb3IgcHJvZHVjdGlvbiwgeW91IGNhbiBwdWJsaXNoIHNwZWNpZmljIHByb2plY3RzCi1kaXJlY3RseSB0byB0aGUgZG9jIHJvb3QgYnkgY2hhbmdpbmcgdGhlIHZhbHVlIHRvIDxzYW1wIGNsYXNzPSJjb2RlcGgiPi88L3NhbXA+IGFuZCBhbGwKLXB1Ymxpc2hpbmcsIGxpbmsgZml4aW5nLCBhbmQgYnJvd3Npbmcgd2lsbCB1cGRhdGUgYXV0b21hdGljYWxseS48L3A+Ci0KLTxkaXYgY2xhc3M9InAiPkFsaWFzZXMgY2FuIGFsc28gYmUgdXNlZCB0byBzcGVjaWZ5IGEgY29udGV4dCByb290IHZhbHVlLiBGb3IgZXhhbXBsZSwKLXN1cHBvc2UgdGhhdCB0aGVyZSBpcyBhbiBhbGlhcyB0aGF0IGlzIGRlZmluZWQgb24gdGhlIHRhcmdldCBXZWIgc2VydmVyLCBhcwotZm9sbG93czogPHByZT5BbGlhcyAvc2NyaXB0cy8gIi92YXIvd3d3L3NjcmlwdHMiPC9wcmU+Ci1JbiB0aGlzCi1leGFtcGxlLCBpbiB3aGljaCB0aGUgY3VycmVudCBzdGF0aWMgV2ViIHByb2plY3Qgd2lsbCBjb250YWluIGNvbW1vbiBKYXZhU2NyaXB04oSiIGZpbGVzLAoteW91IGNhbiBzZXQgdGhlIGNvbnRleHQgcm9vdCB2YWx1ZSB0byBiZSA8c3Bhbj4ic2NyaXB0cyI8L3NwYW4+LiAgSW4gb3JkZXIgZm9yCi10aGUgcmVzb3VyY2VzIGluIHRoZSBzdGF0aWMgV2ViIHByb2plY3QgdG8gYmUgcHVibGlzaGVkIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uCi1vbiB0aGUgV2ViIHNlcnZlciwgeW91IG11c3QgYWRkIHRoaXMgQWxpYXMgbWFwcGluZyB0byB0aGUgc2VydmVyIHRvb2xzIGluc3RhbmNlCi1vZiB0aGUgc3RhdGljIFdlYiBzZXJ2ZXIsIGFzIGZvbGxvd3MuICA8b2w+Ci08bGk+RnJvbSB0aGUgU2VydmVyIHZpZXcsIGRvdWJsZS1jbGljayBvbiB0aGUgc3RhdGljIFdlYiBzZXJ2ZXIgY29uZmlndXJhdGlvbgotdG8gb3BlbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZWRpdG9yLjxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaGlzIGFzc3VtZXMgdGhhdCB5b3UndmUgYWxyZWFkeQotZGVmaW5lZCB0aGUgc3RhdGljIFdlYiBzZXJ2ZXIuPC9kaXY+Ci08L2xpPgotCi08bGk+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbmZpZ3VyYXRpb248L3NwYW4+IGVkaXRvciB0YWIuPC9saT4KLQotPGxpPlNjcm9sbCBkb3duIHRvIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BbGlhcyBQYXRoIE1hcHBpbmc8L3NwYW4+IHNlY3Rpb24sCi1hbmQgYWRkIHRoZSBuZXcgQWxpYXMgbWFwcGluZy48L2xpPgotCi08L29sPgotTm93IHRoYXQgPHNwYW4+InNjcmlwdHMiPC9zcGFuPiBpcyBkZWZpbmVkIGFzIGFuIEFsaWFzLCB0aGUgV2ViIGNvbnRlbnQgaW4KLXRoZSBzdGF0aWMgV2ViIHByb2plY3Qgd2lsbCBiZSBwdWJsaXNoZWQgdG8gdGhlIG1hcHBlZCBwYXRoLCA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPi92YXIvd3d3L3NjcmlwdHM8L3NwYW4+LjwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwiIHRpdGxlPSIiPldlYiByZXNvdXJjZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3dhcm92ci5odG1sIiB0aXRsZT0iIj5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdjcmVzdGEuaHRtbCI+Q3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VicHJqLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJwcmouZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE1YWM1Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJwcmouZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNjd2VicHJqIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5EeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5lbnRlcnByaXNlIGFwcGxpY2F0aW9uczxpbmRleHRlcm0+cHJvamVjdHM8aW5kZXh0ZXJtPmR5bmFtaWMNCi1XZWIgcHJvamVjdHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPldlYiBwcm9qZWN0czxpbmRleHRlcm0+ZHluYW1pYw0KLXByb2plY3RzIG92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPlRoZXJlIGFyZSB0d28gdHlwZXMgb2YgV2ViIHByb2plY3RzOiBkeW5hbWljIGFuZCA8eHJlZiBocmVmPSJjY3N0YXRpYy5kaXRhIg0KLXNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+c3RhdGljPC94cmVmPi4gRHluYW1pYyB3ZWIgcHJvamVjdHMgY2FuIGNvbnRhaW4NCi1keW5hbWljIEphdmEgRUUgcmVzb3VyY2VzIHN1Y2ggYXMgc2VydmxldHMsIEpTUCBmaWxlcywgZmlsdGVycywgYW5kIGFzc29jaWF0ZWQNCi1tZXRhZGF0YSwgaW4gYWRkaXRpb24gdG8gc3RhdGljIHJlc291cmNlcyBzdWNoIGFzIGltYWdlcyBhbmQgSFRNTCBmaWxlcy4gU3RhdGljDQotd2ViIHByb2plY3RzIG9ubHkgY29udGFpbnMgc3RhdGljIHJlc291cmNlcy4gV2hlbiB5b3UgY3JlYXRlIFdlYiBwcm9qZWN0cywNCi15b3UgY2FuIGluY2x1ZGUgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyBhbmQgSlNQIHRhZyBsaWJyYXJpZXMgKGZvciBkeW5hbWljDQotV2ViIHByb2plY3RzKSwgc28gdGhhdCB5b3UgY2FuIGJlZ2luIGRldmVsb3BtZW50IHdpdGggYSByaWNoZXIgc2V0IG9mIHByb2plY3QNCi1yZXNvdXJjZXMuPC9wPg0KLTxwPkR5bmFtaWMgV2ViIHByb2plY3RzIGFyZSBhbHdheXMgZW1iZWRkZWQgaW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0cy4NCi1UaGUgd2l6YXJkIHRoYXQgeW91IHVzZSB0byBjcmVhdGUgYSBkeW5hbWljIFdlYiBwcm9qZWN0IHdpbGwgYWxzbyBjcmVhdGUgYW4NCi1FbnRlcnByaXNlIEFwcGxpY2F0aW9uIChFQVIpIHByb2plY3QgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gVGhlIHdpemFyZA0KLXdpbGwgYWxzbyB1cGRhdGUgdGhlIDxmaWxlcGF0aD5hcHBsaWNhdGlvbi54bWw8L2ZpbGVwYXRoPiBkZXBsb3ltZW50IGRlc2NyaXB0b3INCi1vZiB0aGUgc3BlY2lmaWVkIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB0byBkZWZpbmUgdGhlIFdlYiBwcm9qZWN0DQotYXMgYSBtb2R1bGUgZWxlbWVudC4gSWYgeW91IGFyZSBpbXBvcnRpbmcgYSBXQVIgZmlsZSByYXRoZXIgdGhhbiBjcmVhdGluZw0KLWEgZHluYW1pYyBXZWIgcHJvamVjdCBuZXcsIHRoZSBXQVIgSW1wb3J0IHdpemFyZCByZXF1aXJlcyB0aGF0IHlvdSBzcGVjaWZ5DQotYSBXZWIgcHJvamVjdCwgd2hpY2ggYWxyZWFkeSByZXF1aXJlcyBhbiBFQVIgcHJvamVjdC4gPC9wPg0KLTxwPkphdmEgRUUgY29udmVudGlvbnMgbWF5IHJlcHJlc2VudCBleHRyYSBvdmVyaGVhZCBpZiB5b3Ugb25seSB3YW50IHRvIGNyZWF0ZQ0KLWEgc3RhdGljLCBjb250ZW50LWJhc2VkIFdlYiBhcHBsaWNhdGlvbiwgd2hpY2ggY29udGFpbnMgbm8gZHluYW1pYyBmaWxlcywNCi1zdWNoIGFzIEpTUCBmaWxlcyBvciBzZXJ2bGV0cy4gSW4gdGhpcyBjYXNlLCB3aGVuIHlvdSBuZWVkIG9ubHkgdGhlIG1vc3QgYmFzaWMNCi1XZWIgcHJvamVjdCwgeW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoZSA8aT5zdGF0aWM8L2k+IFdlYiBwcm9qZWN0IHR5cGUgKHNlZSA8eHJlZg0KLWhyZWY9ImNjc3RhdGljLmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+U3RhdGljIFdlYiBwcm9qZWN0czwveHJlZj4pLg0KLSBOb3RlIHRoYXQgc3RhdGljIFdlYiBwcm9qZWN0cyBjYW4gIGJlIGNvbnZlcnRlZCB0byBkeW5hbWljIFdlYiBwcm9qZWN0cyBieQ0KLXNlbGVjdGluZyA8Yj5Db252ZXJ0IHRvIGEgRHluYW1pYyBXZWIgUHJvamVjdDwvYj4sIGZyb20gdGhlIFByb2plY3QgbWVudS48L3A+DQotPHA+VGhlIEphdmEgRUUgbW9kZWwsIGFuZCBtb3JlIHNwZWNpZmljYWxseSwgdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldA0KLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiwgZGVmaW5lcyBhIFdlYiBhcHBsaWNhdGlvbiBkaXJlY3Rvcnkgc3RydWN0dXJlIHRoYXQNCi1zcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIFdlYiBjb250ZW50IGZpbGVzLCBjbGFzcyBmaWxlcywgY2xhc3MgcGF0aHMsIGRlcGxveW1lbnQNCi1kZXNjcmlwdG9ycywgYW5kIHN1cHBvcnRpbmcgbWV0YWRhdGEuIFRoZSBXZWIgcHJvamVjdCBoaWVyYXJjaHkgbWlycm9ycyB0aGF0DQotb2YgdGhlIFdlYiBhcHBsaWNhdGlvbiBjcmVhdGVkIGZyb20gYSBwcm9qZWN0LiBJbiB0aGUgd29ya2JlbmNoLCB5b3UgY2FuIHVzZQ0KLXRoZSA8cGg+TmV3IFdlYiBQcm9qZWN0PC9waD4gd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBXZWIgcHJvamVjdC48L3A+DQotPHA+VGhlIG1haW4gcHJvamVjdCBmb2xkZXIgY29udGFpbnMgYWxsIGRldmVsb3BtZW50IG9iamVjdHMgcmVsYXRlZCB0byBhIFdlYg0KLWFwcGxpY2F0aW9uLiBUaGUgV2ViIGNvbnRlbnQgZm9sZGVyIGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiB0aGUgcHJvamVjdCBuZWNlc3NhcnkNCi10byBjcmVhdGUgYSBXZWIgYXBwbGljYXRpb24uIFRoaXMgZm9sZGVyIHN0cnVjdHVyZSBtYXBzIHRvIHRoZSBXZWIgYXBwbGljYXRpb24NCi1hcmNoaXZlIChXQVIpIHN0cnVjdHVyZSBkZWZpbmVkIGJ5IFN1biBNaWNyb3N5c3RlbXMuLiBUaGUgZm9sbG93aW5nIGRlZmF1bHQNCi1lbGVtZW50cyBhcmUgbG9jYXRlZCBpbiB0aGUgV2ViIHByb2plY3QgZm9sZGVyIGhpZXJhcmNoeTogPG5vdGU+SW4gdGhlIFByb2plY3QNCi1FeHBsb3JlciB2aWV3LCBXZWIgcHJvamVjdHMgYXJlIGZpbHRlcmVkIGludG8gZm9sZGVyIG5vZGVzIHRvIGN1c3RvbWl6ZSB0aGUNCi1kaXNwbGF5IG9mIFdlYiByZXNvdXJjZXMgZm9yIGVhc3kgbWFuYWdlbWVudCBkdXJpbmcgZGV2ZWxvcG1lbnQuIEZvciBpbmZvcm1hdGlvbg0KLW9uIHRoZSBmaWx0ZXJlZCBzdHJ1Y3R1cmUsIHNlZSA8eHJlZiBocmVmPSJjY3dlYnZ3LmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+UHJvamVjdA0KLUV4cGxvcmVyIHZpZXc8L3hyZWY+Ljwvbm90ZT48ZGw+PGRsZW50cnk+DQotPGR0PldlYiBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2R0Pg0KLTxkZD5UaGUgc3RhbmRhcmQgV2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciAodGhlIDxmaWxlcGF0aD53ZWIueG1sPC9maWxlcGF0aD4gZmlsZSkuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkphdmFTb3VyY2U8L2R0Pg0KLTxkZD5Db250YWlucyB0aGUgcHJvamVjdCdzIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHNvdXJjZSBjb2RlIGZvciBjbGFzc2VzLCBiZWFucywgYW5kDQotc2VydmxldHMuIFdoZW4gdGhlc2UgcmVzb3VyY2VzIGFyZSBhZGRlZCB0byBhIFdlYiBwcm9qZWN0LCB0aGV5IGFyZSBhdXRvbWF0aWNhbGx5DQotY29tcGlsZWQgYW5kIHRoZSBnZW5lcmF0ZWQgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBXRUItSU5GL2NsYXNzZXMgZGlyZWN0b3J5Lg0KLVRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgbm90IHBhY2thZ2VkIGluIFdBUiBmaWxlcyB1bmxlc3MNCi1hbiBvcHRpb24gaXMgc3BlY2lmaWVkIHdoZW4gYSBXQVIgZmlsZSBpcyBjcmVhdGVkLiA8bm90ZT5UaG91Z2ggdGhlIGRlZmF1bHQNCi1uYW1lIGdpdmVuIHRvIHRoZSBmb2xkZXIgaXMgSmF2YVNvdXJjZXMsIHlvdSBjYW4gY2hhbmdlIHRoZSBuYW1lIGJ5IHJpZ2h0DQotY2xpY2tpbmcgb24gdGhlIG5hbWUgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYW5kIGNsaWNraW5nIG9uIDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPlJlZmFjdG9yPC91aWNvbnRyb2w+PHVpY29udHJvbD5SZW5hbWU8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L25vdGU+PC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PmltcG9ydGVkX2NsYXNzZXMgZm9sZGVyPC9kdD4NCi08ZGQ+VGhpcyBmb2xkZXIgbWF5IGJlIGNyZWF0ZWQgZHVyaW5nIGEgV0FSIGltcG9ydCwgYW5kIGNvbnRhaW5zIGNsYXNzIGZpbGVzDQotdGhhdCBkbyBub3QgaGF2ZSBhY2NvbXBhbnlpbmcgc291cmNlLiAgVGhlIDx1aWNvbnRyb2w+aW1wb3J0ZWRfY2xhc3NlczwvdWljb250cm9sPiBmb2xkZXINCi1pcyBhIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjbGFzc2VzDQotZm9sZGVyOyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjbGFzc2VzIGZvbGRlcnMgY2FuIGFsc28gYmUgY3JlYXRlZCB1c2luZyB0aGUgV2ViDQotcHJvamVjdCA8dWljb250cm9sPkphdmEgQnVpbGQgUGF0aDwvdWljb250cm9sPiBwcm9wZXJ0aWVzIHBhZ2UuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PldlYkNvbnRlbnQgZm9sZGVyPC9kdD4NCi08ZGQ+VGhlIG1hbmRhdG9yeSBsb2NhdGlvbiBvZiBhbGwgV2ViIHJlc291cmNlcywgaW5jbHVkaW5nIEhUTUwsIEpTUCwgZ3JhcGhpYw0KLWZpbGVzLCBhbmQgc28gb24uIElmIHRoZSBmaWxlcyBhcmUgbm90IHBsYWNlZCBpbiB0aGlzIGRpcmVjdG9yeSAob3IgaW4gYSBzdWJkaXJlY3RvcnkNCi1zdHJ1Y3R1cmUgdW5kZXIgdGhpcyBkaXJlY3RvcnkpLCB0aGUgZmlsZXMgd2lsbCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gdGhlDQotYXBwbGljYXRpb24gaXMgZXhlY3V0ZWQgb24gYSBzZXJ2ZXIuIFRoZSBXZWIgY29udGVudCBmb2xkZXIgcmVwcmVzZW50cyB0aGUNCi1jb250ZW50cyBvZiB0aGUgV0FSIGZpbGUgdGhhdCB3aWxsIGJlIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXIuIEFueSBmaWxlcyBub3QNCi11bmRlciB0aGUgV2ViIGNvbnRlbnQgZm9sZGVyIGFyZSBjb25zaWRlcmVkIGRldmVsb3BtZW50LXRpbWUgcmVzb3VyY2VzIChmb3INCi1leGFtcGxlLCAuamF2YSBmaWxlcywgLnNxbCBmaWxlcywgYW5kIC5taWYgZmlsZXMpLCBhbmQgYXJlIG5vdCBkZXBsb3llZCB3aGVuDQotdGhlIHByb2plY3QgaXMgdW5pdCB0ZXN0ZWQgb3IgcHVibGlzaGVkLiA8bm90ZT5UaG91Z2ggdGhlIGRlZmF1bHQgbmFtZSBnaXZlbg0KLXRvIHRoZSBmb2xkZXIgaXMgPGZpbGVwYXRoPldlYkNvbnRlbnQ8L2ZpbGVwYXRoPiwgeW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUNCi0gaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYnkgcmlnaHQtY2xpY2tpbmcgdGhlIGZvbGRlciBhbmQgc2VsZWN0aW5nIDx1aWNvbnRyb2w+UmVmYWN0b3I8L3VpY29udHJvbD48dWljb250cm9sPlJlbmFtZTwvdWljb250cm9sPiBvcg0KLWZyb20gdGhlIFdlYiBwYWdlIG9mIHRoZSBwcm9qZWN0J3MgUHJvcGVydGllcyBkaWFsb2cuIEluIGEgZHluYW1pYyBXZWIgcHJvamVjdCwNCi1jaGFuZ2luZyB0aGUgZm9sZGVyIG5hbWUgd2lsbCB1cGRhdGUgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkuIDwvbm90ZT48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+TUVUQS1JTkY8L2R0Pg0KLTxkZD5UaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgPGZpbGVwYXRoPk1BTklGRVNULk1GPC9maWxlcGF0aD4gZmlsZSwgd2hpY2gNCi1pcyB1c2VkIHRvIG1hcCBjbGFzcyBwYXRocyBmb3IgZGVwZW5kZW50IEpBUiBmaWxlcyB0aGF0IGV4aXN0IGluIG90aGVyIHByb2plY3RzDQotaW4gdGhlIHNhbWUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0LiBBbiBlbnRyeSBpbiB0aGlzIGZpbGUgd2lsbCB1cGRhdGUNCi10aGUgcnVuLXRpbWUgcHJvamVjdCBjbGFzcyBwYXRoIGFuZCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZCBzZXR0aW5ncyB0byBpbmNsdWRlIHRoZSByZWZlcmVuY2VkDQotSkFSIGZpbGVzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD50aGVtZTwvZHQ+DQotPGRkPlRoZSBzdWdnZXN0ZWQgZGlyZWN0b3J5IGZvciBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzIGFuZCBvdGhlciBzdHlsZS1yZWxhdGVkDQotb2JqZWN0cy48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+V0VCLUlORjwvZHQ+DQotPGRkPkJhc2VkIG9uIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+LCB0aGlzDQotZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBzdXBwb3J0aW5nIFdlYiByZXNvdXJjZXMgZm9yIGEgV2ViIGFwcGxpY2F0aW9uLCBpbmNsdWRpbmcNCi10aGUgPGZpbGVwYXRoPndlYi54bWw8L2ZpbGVwYXRoPiBmaWxlIGFuZCB0aGUgY2xhc3NlcyBhbmQgbGliIGRpcmVjdG9yaWVzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD4vY2xhc3NlczwvZHQ+DQotPGRkPlRoaXMgZGlyZWN0b3J5IGlzIGZvciBzZXJ2bGV0cywgdXRpbGl0eSBjbGFzc2VzLCBhbmQgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNvbXBpbGVyDQotb3V0cHV0IGRpcmVjdG9yeS4gVGhlIGNsYXNzZXMgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uDQotY2xhc3MgbG9hZGVyIHRvIGxvYWQgdGhlIGNsYXNzZXMuIEZvbGRlcnMgaW4gdGhpcyBkaXJlY3Rvcnkgd2lsbCBtYXAgcGFja2FnZQ0KLWFuZCBjbGFzcyBuYW1lcywgYXMgaW46IDxjb2RlcGg+L1dFQi1JTkYvY2xhc3Nlcy9jb20vbXljb3JwL3NlcnZsZXRzL015U2VydmxldC5jbGFzczwvY29kZXBoPi48cD5Ebw0KLW5vdCBwbGFjZSBhbnkgLmNsYXNzIGZpbGVzIGRpcmVjdGx5IGludG8gdGhpcyBkaXJlY3RvcnkuIFRoZSAuY2xhc3MgZmlsZXMNCi1hcmUgcGxhY2VkIGluIHRoaXMgZGlyZWN0b3J5IGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY29tcGlsZXINCi1jb21waWxlcyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBzb3VyY2UgZmlsZXMgdGhhdCBhcmUgaW4gdGhlIDxmaWxlcGF0aD5KYXZhIFJlc291cmNlczwvZmlsZXBhdGg+IGRpcmVjdG9yeS4NCi1BbnkgZmlsZXMgcGxhY2VkIGRpcmVjdGx5IGluIHRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgZGVsZXRlZCBieSB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY29tcGlsZXINCi13aGVuIGl0IHJ1bnMuPC9wPjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD4vbGliPC9kdD4NCi08ZGQ+VGhlIHN1cHBvcnRpbmcgSkFSIGZpbGVzIHRoYXQgeW91ciBXZWIgYXBwbGljYXRpb24gcmVmZXJlbmNlcy4gQW55IGNsYXNzZXMNCi1pbiAuamFyIGZpbGVzIHBsYWNlZCBpbiB0aGlzIGRpcmVjdG9yeSB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgeW91ciBXZWIgYXBwbGljYXRpb248L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+TGlicmFyaWVzPC9kdD4NCi08ZGQ+VGhlIHN1cHBvcnRpbmcgSkFSIGZpbGVzIHRoYXQgeW91ciBXZWIgYXBwbGljYXRpb24gcmVmZXJlbmNlcy4gVGhpcyBmb2xkZXINCi1taXJyb3JzIHRoZSBjb250ZW50IG9mIHRoZSBsaWIgZm9sZGVyLiBJbiBhZGRpdGlvbiwgV2ViIExpYnJhcnkgUHJvamVjdHMsDQotd2hpY2ggYXJlICJ2aXJ0dWFsIiBKQVIgZmlsZXMgdGhhdCBkbyBub3QgcGh5c2ljYWxseSByZXNpZGUgaW4gdGhlIFdlYiBwcm9qZWN0LA0KLWJ1dCBhcmUgYXNzb2NpYXRlZCB3aXRoIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHByb2plY3RzIGVsc2V3aGVyZSBpbiB5b3VyIHdvcmtzcGFjZSwNCi1hcmUgaW5jbHVkZWQgaW4gdGhpcyBmb2xkZXIuIFRoZXkgYXJlIHBhY2thZ2VkIHdpdGggeW91ciBwcm9qZWN0IHdoZW4geW91DQotZXhwb3J0IHRoZSBhcHBsaWNhdGlvbidzIFdBUiBmaWxlLjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+IDxub3RlPkEgbGlicmFyeSBlbnRyeSBvbiB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYnVpbGQgcGF0aCB3aWxsIHJlbWFpbiB0aGVyZSB1bmxlc3MNCi10aGUgYWN0dWFsIEpBUiBmaWxlIGlzIGRlbGV0ZWQgZnJvbSB0aGUgV0VCLUlORi9saWIgZm9sZGVyLiBJZiB5b3UgcmVtb3ZlDQotYSBsaWJyYXJ5IHBhdGggZW50cnkgYnV0IG5vdCB0aGUgSkFSIGZpbGUsIHRoZSBsaWJyYXJ5IGVudHJ5IHdpbGwgYmUgcmUtYWRkZWQNCi10byB0aGUgcGF0aCBhdXRvbWF0aWNhbGx5Ljwvbm90ZT48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJwcmouaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NThlNWMyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiIC8+Ci08bWV0YSBjb250ZW50PSJlbnRlcnByaXNlIGFwcGxpY2F0aW9ucywgcHJvamVjdHMsIGR5bmFtaWMgV2ViIHByb2plY3RzLCBXZWIgcHJvamVjdHMsIGR5bmFtaWMgcHJvamVjdHMgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJlbnRlcnByaXNlIGFwcGxpY2F0aW9ucywgcHJvamVjdHMsIGR5bmFtaWMgV2ViIHByb2plY3RzLCBXZWIgcHJvamVjdHMsIGR5bmFtaWMgcHJvamVjdHMgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dlYnJlc291cmNlcy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d3YXJvdnIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amNyZWpzcC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNjd2VicHJqIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9uczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2N3ZWJwcmoiPjxhIG5hbWU9ImNjd2VicHJqIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zPC9oMT4KLQotCi08ZGl2PgotPHA+VGhlcmUgYXJlIHR3byB0eXBlcyBvZiBXZWIgcHJvamVjdHM6IGR5bmFtaWMgYW5kIDxhIGhyZWY9ImNjc3RhdGljLmh0bWwiIHRpdGxlPSIiPnN0YXRpYzwvYT4uIER5bmFtaWMgd2ViIHByb2plY3RzIGNhbiBjb250YWluCi1keW5hbWljIEphdmEgRUUgcmVzb3VyY2VzIHN1Y2ggYXMgc2VydmxldHMsIEpTUCBmaWxlcywgZmlsdGVycywgYW5kIGFzc29jaWF0ZWQKLW1ldGFkYXRhLCBpbiBhZGRpdGlvbiB0byBzdGF0aWMgcmVzb3VyY2VzIHN1Y2ggYXMgaW1hZ2VzIGFuZCBIVE1MIGZpbGVzLiBTdGF0aWMKLXdlYiBwcm9qZWN0cyBvbmx5IGNvbnRhaW5zIHN0YXRpYyByZXNvdXJjZXMuIFdoZW4geW91IGNyZWF0ZSBXZWIgcHJvamVjdHMsCi15b3UgY2FuIGluY2x1ZGUgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyBhbmQgSlNQIHRhZyBsaWJyYXJpZXMgKGZvciBkeW5hbWljCi1XZWIgcHJvamVjdHMpLCBzbyB0aGF0IHlvdSBjYW4gYmVnaW4gZGV2ZWxvcG1lbnQgd2l0aCBhIHJpY2hlciBzZXQgb2YgcHJvamVjdAotcmVzb3VyY2VzLjwvcD4KLQotPHA+RHluYW1pYyBXZWIgcHJvamVjdHMgYXJlIGFsd2F5cyBlbWJlZGRlZCBpbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3RzLgotVGhlIHdpemFyZCB0aGF0IHlvdSB1c2UgdG8gY3JlYXRlIGEgZHluYW1pYyBXZWIgcHJvamVjdCB3aWxsIGFsc28gY3JlYXRlIGFuCi1FbnRlcnByaXNlIEFwcGxpY2F0aW9uIChFQVIpIHByb2plY3QgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gVGhlIHdpemFyZAotd2lsbCBhbHNvIHVwZGF0ZSB0aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5hcHBsaWNhdGlvbi54bWw8L3NwYW4+IGRlcGxveW1lbnQgZGVzY3JpcHRvcgotb2YgdGhlIHNwZWNpZmllZCBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgdG8gZGVmaW5lIHRoZSBXZWIgcHJvamVjdAotYXMgYSBtb2R1bGUgZWxlbWVudC4gSWYgeW91IGFyZSBpbXBvcnRpbmcgYSBXQVIgZmlsZSByYXRoZXIgdGhhbiBjcmVhdGluZwotYSBkeW5hbWljIFdlYiBwcm9qZWN0IG5ldywgdGhlIFdBUiBJbXBvcnQgd2l6YXJkIHJlcXVpcmVzIHRoYXQgeW91IHNwZWNpZnkKLWEgV2ViIHByb2plY3QsIHdoaWNoIGFscmVhZHkgcmVxdWlyZXMgYW4gRUFSIHByb2plY3QuIDwvcD4KLQotPHA+SmF2YSBFRSBjb252ZW50aW9ucyBtYXkgcmVwcmVzZW50IGV4dHJhIG92ZXJoZWFkIGlmIHlvdSBvbmx5IHdhbnQgdG8gY3JlYXRlCi1hIHN0YXRpYywgY29udGVudC1iYXNlZCBXZWIgYXBwbGljYXRpb24sIHdoaWNoIGNvbnRhaW5zIG5vIGR5bmFtaWMgZmlsZXMsCi1zdWNoIGFzIEpTUCBmaWxlcyBvciBzZXJ2bGV0cy4gSW4gdGhpcyBjYXNlLCB3aGVuIHlvdSBuZWVkIG9ubHkgdGhlIG1vc3QgYmFzaWMKLVdlYiBwcm9qZWN0LCB5b3UgbWlnaHQgd2FudCB0byB1c2UgdGhlIDxlbT5zdGF0aWM8L2VtPiBXZWIgcHJvamVjdCB0eXBlIChzZWUgPGEgaHJlZj0iY2NzdGF0aWMuaHRtbCIgdGl0bGU9IiI+U3RhdGljIFdlYiBwcm9qZWN0czwvYT4pLgotIE5vdGUgdGhhdCBzdGF0aWMgV2ViIHByb2plY3RzIGNhbiAgYmUgY29udmVydGVkIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzIGJ5Ci1zZWxlY3RpbmcgPHN0cm9uZz5Db252ZXJ0IHRvIGEgRHluYW1pYyBXZWIgUHJvamVjdDwvc3Ryb25nPiwgZnJvbSB0aGUgUHJvamVjdCBtZW51LjwvcD4KLQotPHA+VGhlIEphdmEgRUUgbW9kZWwsIGFuZCBtb3JlIHNwZWNpZmljYWxseSwgdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YeKEoiBTZXJ2bGV0Ci0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4sIGRlZmluZXMgYSBXZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5IHN0cnVjdHVyZSB0aGF0Ci1zcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIFdlYiBjb250ZW50IGZpbGVzLCBjbGFzcyBmaWxlcywgY2xhc3MgcGF0aHMsIGRlcGxveW1lbnQKLWRlc2NyaXB0b3JzLCBhbmQgc3VwcG9ydGluZyBtZXRhZGF0YS4gVGhlIFdlYiBwcm9qZWN0IGhpZXJhcmNoeSBtaXJyb3JzIHRoYXQKLW9mIHRoZSBXZWIgYXBwbGljYXRpb24gY3JlYXRlZCBmcm9tIGEgcHJvamVjdC4gSW4gdGhlIHdvcmtiZW5jaCwgeW91IGNhbiB1c2UKLXRoZSA8c3Bhbj5OZXcgV2ViIFByb2plY3Q8L3NwYW4+IHdpemFyZCB0byBjcmVhdGUgYSBuZXcgV2ViIHByb2plY3QuPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5UaGUgbWFpbiBwcm9qZWN0IGZvbGRlciBjb250YWlucyBhbGwgZGV2ZWxvcG1lbnQgb2JqZWN0cyByZWxhdGVkIHRvIGEgV2ViCi1hcHBsaWNhdGlvbi4gVGhlIFdlYiBjb250ZW50IGZvbGRlciBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgdGhlIHByb2plY3QgbmVjZXNzYXJ5Ci10byBjcmVhdGUgYSBXZWIgYXBwbGljYXRpb24uIFRoaXMgZm9sZGVyIHN0cnVjdHVyZSBtYXBzIHRvIHRoZSBXZWIgYXBwbGljYXRpb24KLWFyY2hpdmUgKFdBUikgc3RydWN0dXJlIGRlZmluZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcy4uIFRoZSBmb2xsb3dpbmcgZGVmYXVsdAotZWxlbWVudHMgYXJlIGxvY2F0ZWQgaW4gdGhlIFdlYiBwcm9qZWN0IGZvbGRlciBoaWVyYXJjaHk6IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBJbiB0aGUgUHJvamVjdAotRXhwbG9yZXIgdmlldywgV2ViIHByb2plY3RzIGFyZSBmaWx0ZXJlZCBpbnRvIGZvbGRlciBub2RlcyB0byBjdXN0b21pemUgdGhlCi1kaXNwbGF5IG9mIFdlYiByZXNvdXJjZXMgZm9yIGVhc3kgbWFuYWdlbWVudCBkdXJpbmcgZGV2ZWxvcG1lbnQuIEZvciBpbmZvcm1hdGlvbgotb24gdGhlIGZpbHRlcmVkIHN0cnVjdHVyZSwgc2VlIDxhIGhyZWY9ImNjd2VidncuaHRtbCIgdGl0bGU9IiI+UHJvamVjdCBFeHBsb3JlciB2aWV3PC9hPi48L2Rpdj4KLTxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5XZWIgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9kdD4KLQotPGRkPlRoZSBzdGFuZGFyZCBXZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yICh0aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj53ZWIueG1sPC9zcGFuPiBmaWxlKS48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5KYXZhU291cmNlPC9kdD4KLQotPGRkPkNvbnRhaW5zIHRoZSBwcm9qZWN0J3MgSmF2YSBzb3VyY2UgY29kZSBmb3IgY2xhc3NlcywgYmVhbnMsIGFuZAotc2VydmxldHMuIFdoZW4gdGhlc2UgcmVzb3VyY2VzIGFyZSBhZGRlZCB0byBhIFdlYiBwcm9qZWN0LCB0aGV5IGFyZSBhdXRvbWF0aWNhbGx5Ci1jb21waWxlZCBhbmQgdGhlIGdlbmVyYXRlZCBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIFdFQi1JTkYvY2xhc3NlcyBkaXJlY3RvcnkuCi1UaGUgY29udGVudHMgb2YgdGhlIHNvdXJjZSBkaXJlY3RvcnkgYXJlIG5vdCBwYWNrYWdlZCBpbiBXQVIgZmlsZXMgdW5sZXNzCi1hbiBvcHRpb24gaXMgc3BlY2lmaWVkIHdoZW4gYSBXQVIgZmlsZSBpcyBjcmVhdGVkLiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhvdWdoIHRoZSBkZWZhdWx0Ci1uYW1lIGdpdmVuIHRvIHRoZSBmb2xkZXIgaXMgSmF2YVNvdXJjZXMsIHlvdSBjYW4gY2hhbmdlIHRoZSBuYW1lIGJ5IHJpZ2h0Ci1jbGlja2luZyBvbiB0aGUgbmFtZSBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciBhbmQgY2xpY2tpbmcgb24gPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZmFjdG9yPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbmFtZTwvc3Bhbj48L3NwYW4+LjwvZGl2PgotPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+aW1wb3J0ZWRfY2xhc3NlcyBmb2xkZXI8L2R0PgotCi08ZGQ+VGhpcyBmb2xkZXIgbWF5IGJlIGNyZWF0ZWQgZHVyaW5nIGEgV0FSIGltcG9ydCwgYW5kIGNvbnRhaW5zIGNsYXNzIGZpbGVzCi10aGF0IGRvIG5vdCBoYXZlIGFjY29tcGFueWluZyBzb3VyY2UuICBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+aW1wb3J0ZWRfY2xhc3Nlczwvc3Bhbj4gZm9sZGVyCi1pcyBhIEphdmEgY2xhc3NlcwotZm9sZGVyOyBKYXZhIGNsYXNzZXMgZm9sZGVycyBjYW4gYWxzbyBiZSBjcmVhdGVkIHVzaW5nIHRoZSBXZWIKLXByb2plY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SmF2YSBCdWlsZCBQYXRoPC9zcGFuPiBwcm9wZXJ0aWVzIHBhZ2UuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+V2ViQ29udGVudCBmb2xkZXI8L2R0PgotCi08ZGQ+VGhlIG1hbmRhdG9yeSBsb2NhdGlvbiBvZiBhbGwgV2ViIHJlc291cmNlcywgaW5jbHVkaW5nIEhUTUwsIEpTUCwgZ3JhcGhpYwotZmlsZXMsIGFuZCBzbyBvbi4gSWYgdGhlIGZpbGVzIGFyZSBub3QgcGxhY2VkIGluIHRoaXMgZGlyZWN0b3J5IChvciBpbiBhIHN1YmRpcmVjdG9yeQotc3RydWN0dXJlIHVuZGVyIHRoaXMgZGlyZWN0b3J5KSwgdGhlIGZpbGVzIHdpbGwgbm90IGJlIGF2YWlsYWJsZSB3aGVuIHRoZQotYXBwbGljYXRpb24gaXMgZXhlY3V0ZWQgb24gYSBzZXJ2ZXIuIFRoZSBXZWIgY29udGVudCBmb2xkZXIgcmVwcmVzZW50cyB0aGUKLWNvbnRlbnRzIG9mIHRoZSBXQVIgZmlsZSB0aGF0IHdpbGwgYmUgZGVwbG95ZWQgdG8gdGhlIHNlcnZlci4gQW55IGZpbGVzIG5vdAotdW5kZXIgdGhlIFdlYiBjb250ZW50IGZvbGRlciBhcmUgY29uc2lkZXJlZCBkZXZlbG9wbWVudC10aW1lIHJlc291cmNlcyAoZm9yCi1leGFtcGxlLCAuamF2YSBmaWxlcywgLnNxbCBmaWxlcywgYW5kIC5taWYgZmlsZXMpLCBhbmQgYXJlIG5vdCBkZXBsb3llZCB3aGVuCi10aGUgcHJvamVjdCBpcyB1bml0IHRlc3RlZCBvciBwdWJsaXNoZWQuIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaG91Z2ggdGhlIGRlZmF1bHQgbmFtZSBnaXZlbgotdG8gdGhlIGZvbGRlciBpcyA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPldlYkNvbnRlbnQ8L3NwYW4+LCB5b3UgY2FuIGNoYW5nZSB0aGUgbmFtZQotIGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIGJ5IHJpZ2h0LWNsaWNraW5nIHRoZSBmb2xkZXIgYW5kIHNlbGVjdGluZyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWZhY3Rvcjwvc3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5SZW5hbWU8L3NwYW4+IG9yCi1mcm9tIHRoZSBXZWIgcGFnZSBvZiB0aGUgcHJvamVjdCdzIFByb3BlcnRpZXMgZGlhbG9nLiBJbiBhIGR5bmFtaWMgV2ViIHByb2plY3QsCi1jaGFuZ2luZyB0aGUgZm9sZGVyIG5hbWUgd2lsbCB1cGRhdGUgdGhlIEphdmEgYnVpbGQgb3V0cHV0IGRpcmVjdG9yeS4gPC9kaXY+Ci08L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5NRVRBLUlORjwvZHQ+Ci0KLTxkZD5UaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5NQU5JRkVTVC5NRjwvc3Bhbj4gZmlsZSwgd2hpY2gKLWlzIHVzZWQgdG8gbWFwIGNsYXNzIHBhdGhzIGZvciBkZXBlbmRlbnQgSkFSIGZpbGVzIHRoYXQgZXhpc3QgaW4gb3RoZXIgcHJvamVjdHMKLWluIHRoZSBzYW1lIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdC4gQW4gZW50cnkgaW4gdGhpcyBmaWxlIHdpbGwgdXBkYXRlCi10aGUgcnVuLXRpbWUgcHJvamVjdCBjbGFzcyBwYXRoIGFuZCBKYXZhIGJ1aWxkIHNldHRpbmdzIHRvIGluY2x1ZGUgdGhlIHJlZmVyZW5jZWQKLUpBUiBmaWxlcy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj50aGVtZTwvZHQ+Ci0KLTxkZD5UaGUgc3VnZ2VzdGVkIGRpcmVjdG9yeSBmb3IgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyBhbmQgb3RoZXIgc3R5bGUtcmVsYXRlZAotb2JqZWN0cy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5XRUItSU5GPC9kdD4KLQotPGRkPkJhc2VkIG9uIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEphdmEgU2VydmxldCAyLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4sIHRoaXMKLWRpcmVjdG9yeSBjb250YWlucyB0aGUgc3VwcG9ydGluZyBXZWIgcmVzb3VyY2VzIGZvciBhIFdlYiBhcHBsaWNhdGlvbiwgaW5jbHVkaW5nCi10aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj53ZWIueG1sPC9zcGFuPiBmaWxlIGFuZCB0aGUgY2xhc3NlcyBhbmQgbGliIGRpcmVjdG9yaWVzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPi9jbGFzc2VzPC9kdD4KLQotPGRkPlRoaXMgZGlyZWN0b3J5IGlzIGZvciBzZXJ2bGV0cywgdXRpbGl0eSBjbGFzc2VzLCBhbmQgdGhlIEphdmEgY29tcGlsZXIKLW91dHB1dCBkaXJlY3RvcnkuIFRoZSBjbGFzc2VzIGluIHRoaXMgZGlyZWN0b3J5IGFyZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbgotY2xhc3MgbG9hZGVyIHRvIGxvYWQgdGhlIGNsYXNzZXMuIEZvbGRlcnMgaW4gdGhpcyBkaXJlY3Rvcnkgd2lsbCBtYXAgcGFja2FnZQotYW5kIGNsYXNzIG5hbWVzLCBhcyBpbjogPHNhbXAgY2xhc3M9ImNvZGVwaCI+L1dFQi1JTkYvY2xhc3Nlcy9jb20vbXljb3JwL3NlcnZsZXRzL015U2VydmxldC5jbGFzczwvc2FtcD4uPHA+RG8KLW5vdCBwbGFjZSBhbnkgLmNsYXNzIGZpbGVzIGRpcmVjdGx5IGludG8gdGhpcyBkaXJlY3RvcnkuIFRoZSAuY2xhc3MgZmlsZXMKLWFyZSBwbGFjZWQgaW4gdGhpcyBkaXJlY3RvcnkgYXV0b21hdGljYWxseSB3aGVuIHRoZSBKYXZhIGNvbXBpbGVyCi1jb21waWxlcyBKYXZhIHNvdXJjZSBmaWxlcyB0aGF0IGFyZSBpbiB0aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5KYXZhIFJlc291cmNlczwvc3Bhbj4gZGlyZWN0b3J5LgotQW55IGZpbGVzIHBsYWNlZCBkaXJlY3RseSBpbiB0aGlzIGRpcmVjdG9yeSB3aWxsIGJlIGRlbGV0ZWQgYnkgdGhlIEphdmEgY29tcGlsZXIKLXdoZW4gaXQgcnVucy48L3A+Ci08L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj4vbGliPC9kdD4KLQotPGRkPlRoZSBzdXBwb3J0aW5nIEpBUiBmaWxlcyB0aGF0IHlvdXIgV2ViIGFwcGxpY2F0aW9uIHJlZmVyZW5jZXMuIEFueSBjbGFzc2VzCi1pbiAuamFyIGZpbGVzIHBsYWNlZCBpbiB0aGlzIGRpcmVjdG9yeSB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgeW91ciBXZWIgYXBwbGljYXRpb248L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5MaWJyYXJpZXM8L2R0PgotCi08ZGQ+VGhlIHN1cHBvcnRpbmcgSkFSIGZpbGVzIHRoYXQgeW91ciBXZWIgYXBwbGljYXRpb24gcmVmZXJlbmNlcy4gVGhpcyBmb2xkZXIKLW1pcnJvcnMgdGhlIGNvbnRlbnQgb2YgdGhlIGxpYiBmb2xkZXIuIEluIGFkZGl0aW9uLCBXZWIgTGlicmFyeSBQcm9qZWN0cywKLXdoaWNoIGFyZSAidmlydHVhbCIgSkFSIGZpbGVzIHRoYXQgZG8gbm90IHBoeXNpY2FsbHkgcmVzaWRlIGluIHRoZSBXZWIgcHJvamVjdCwKLWJ1dCBhcmUgYXNzb2NpYXRlZCB3aXRoIEphdmEgcHJvamVjdHMgZWxzZXdoZXJlIGluIHlvdXIgd29ya3NwYWNlLAotYXJlIGluY2x1ZGVkIGluIHRoaXMgZm9sZGVyLiBUaGV5IGFyZSBwYWNrYWdlZCB3aXRoIHlvdXIgcHJvamVjdCB3aGVuIHlvdQotZXhwb3J0IHRoZSBhcHBsaWNhdGlvbidzIFdBUiBmaWxlLjwvZGQ+Ci0KLTwvZGw+Ci0gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEEgbGlicmFyeSBlbnRyeSBvbiB0aGUgSmF2YSBidWlsZCBwYXRoIHdpbGwgcmVtYWluIHRoZXJlIHVubGVzcwotdGhlIGFjdHVhbCBKQVIgZmlsZSBpcyBkZWxldGVkIGZyb20gdGhlIFdFQi1JTkYvbGliIGZvbGRlci4gSWYgeW91IHJlbW92ZQotYSBsaWJyYXJ5IHBhdGggZW50cnkgYnV0IG5vdCB0aGUgSkFSIGZpbGUsIHRoZSBsaWJyYXJ5IGVudHJ5IHdpbGwgYmUgcmUtYWRkZWQKLXRvIHRoZSBwYXRoIGF1dG9tYXRpY2FsbHkuPC9kaXY+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dlYnJlc291cmNlcy5odG1sIiB0aXRsZT0iIj5XZWIgcmVzb3VyY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d3YXJvdnIuaHRtbCIgdGl0bGU9IiI+V2ViIGFyY2hpdmUgKFdBUikgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqY3JlanNwLmh0bWwiPkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VidncuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnZ3LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMDQzZTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VidncuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY2N3ZWJ2dyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+UHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQ8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0iY2N3ZWJ2d3wxfFByb2plY3RFeHBsb3JlcnZpZXdvdmVydmlldyIgc3RhdHVzPSJuZXciPlByb2plY3QNCi1FeHBsb3JlciB2aWV3PGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0ga2V5cmVmPSJjY3dlYnZ3fDJ8V2ViZGV2ZWxvcG1lbnRQcm9qZWN0RXhwbG9yZXJ2aWV3Ig0KLXN0YXR1cz0iY2hhbmdlZCI+V2ViIHByb2plY3RzPGluZGV4dGVybT5Qcm9qZWN0IEV4cGxvcmVyIHZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHNlY3Rpb24+PHA+VGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG5vdGFibGUgZmVhdHVyZXM6IDx1bD4NCi08bGk+PGltYWdlIGFsdD0iRm9yIFdpbmRvd3MiIGhyZWY9Ii4uL2ltYWdlcy9ud2luLmdpZiIgcGxhY2VtZW50PSJpbmxpbmUiPg0KLTwvaW1hZ2U+IFlvdSBjYW4gZHJhZyBhbmQgZHJvcCBmaWxlcyBmcm9tIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJNaWNyb3NvZnQgQ29ycG9yYXRpb24iDQotdG10eXBlPSJyZWciIHRyYWRlbWFyaz0iV2luZG93cyI+V2luZG93czwvdG0+IEV4cGxvcmVyIG9yIHRoZSBkZXNrdG9wIGludG8NCi10aGUgTmF2aWdhdG9yIHZpZXcuPC9saT4NCi08bGk+VmlldyBmaWx0ZXJpbmcgaXMgc3VwcG9ydGVkIGJ5IHNlbGVjdGluZyA8cGg+PHVpY29udHJvbD5GaWx0ZXJzPC91aWNvbnRyb2w+PC9waD4gZnJvbQ0KLXRoZSBOYXZpZ2F0b3IgdmlldyA8cGg+PHVpY29udHJvbD5NZW51PC91aWNvbnRyb2w+PC9waD4gYnV0dG9uLiBSZXNvdXJjZXMNCi1jYW4gYmUgZmlsdGVyZWQgYnkgbmFtZSwgcHJvamVjdCB0eXBlIG9yIGNvbnRlbnQgdHlwZS4gRmlsZXMgYmVnaW5uaW5nIHdpdGgNCi1hIHBlcmlvZCBhcmUgZmlsdGVyZWQgb3V0IGJ5IGRlZmF1bHQuPC9saT4NCi08bGk+VGhlIHN0YXR1cyBsaW5lIHNob3dzIHRoZSBmdWxsIHBhdGggb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlLjwvbGk+DQotPGxpPkRyYWdnaW5nIGEgLmphdmEgZmlsZSBmcm9tIHRoZSBOYXZpZ2F0b3IgdmlldyBpbnRvIGEgSlNQIGZpbGUgd2lsbCBpbnNlcnQNCi1hIHVzZWJlYW4gdGFnLCB0aGUgc2FtZSBiZWhhdmlvciB0aGF0IGlzIGV4aGliaXRlZCB3aGVuIGEgLmNsYXNzIGZpbGUgaXMgZHJhZ2dlZA0KLWludG8gYSBKU1AgZmlsZS48L2xpPg0KLTxsaT5FcnJvcnMgYW5kIHdhcm5pbmdzIG9uIHJlc291cmNlcyAoaW5jbHVkaW5nIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+LCBIVE1ML0pTUCwgYW5kIExpbmtzIEJ1aWxkZXIgZXJyb3JzDQotYW5kIHdhcm5pbmdzKSBhcmUgaW5kaWNhdGVkIHdpdGggYSByZWQgZXJyb3IgPGltYWdlIGFsdD0iRXJyb3IgaWNvbiIgaHJlZj0iLi4vaW1hZ2VzL25zaG93ZXJyLmdpZiINCi1wbGFjZW1lbnQ9ImlubGluZSI+PC9pbWFnZT4gb3IgeWVsbG93IHdhcm5pbmcgPGltYWdlIGFsdD0iV2FybmluZyBpY29uIiBocmVmPSIuLi9pbWFnZXMvbndhcm5pbmcuZ2lmIg0KLXBsYWNlbWVudD0iaW5saW5lIj48L2ltYWdlPiBuZXh0IHRvIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBlcnJvciwgYXMgd2VsbCBhcw0KLXRoZSBwYXJlbnQgY29udGFpbmVycyB1cCB0byB0aGUgcHJvamVjdC4gVGhpcyBhcHBsaWVzIGZvciBhbGwgcHJvamVjdCB0eXBlcywNCi1ub3Qgb25seSBXZWIgcHJvamVjdHMuPC9saT4NCi08bGk+SXRlbXMgYXZhaWxhYmxlIGZyb20gdGhlIDxwaD48dWljb250cm9sPk5ldzwvdWljb250cm9sPjwvcGg+IGNhc2NhZGluZw0KLW1lbnUgaW4gdGhlIHByb2plY3QgcG9wLXVwIG1lbnUgYXJlIGNvbnRleHQgc2Vuc2l0aXZlLiAgQWxsIG1lbnVzIHdpbGwgaGF2ZSA8cGg+PHVpY29udHJvbD5Qcm9qZWN0PC91aWNvbnRyb2w+PC9waD4gYW5kIDxwaD48dWljb250cm9sPk90aGVyPC91aWNvbnRyb2wNCi0+PC9waD4gb3B0aW9ucy48L2xpPg0KLTwvdWw+PC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+T3JnYW5pemF0aW9uIG9mIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXc8L3RpdGxlPjxwPlRoZSBQcm9qZWN0DQotRXhwbG9yZXIgdmlldyBzaG93cyBhIGN1c3RvbSB2aWV3IG9mIGFsbCBXZWIgcHJvamVjdHMuIFRoZSBmb2xsb3dpbmcgYXJlIHNvbWUNCi1vZiB0aGUgbm90YWJsZSB0b3AtbGV2ZWwgb2JqZWN0cyB0aGF0IGFwcGVhciBiZW5lYXRoIHRoZSBwcm9qZWN0IG5vZGUgKGJhc2VkDQotb24gZGVmYXVsdCBmb2xkZXIgbmFtZXMpLjwvcD48cD48Yj5XZWIgY29udGVudCBmb2xkZXI8L2I+IC0gVGhpcyBmb2xkZXIgY29udGFpbnMNCi1pdGVtcyB0byBiZSBwdWJsaXNoZWQgdG8gdGhlIHNlcnZlci4gQnkgZGVmYXVsdCwgdGhpcyBmb2xkZXIgd2lsbCBiZSBuYW1lZCA8Yj5XZWJDb250ZW50PC9iPiBmb3INCi1uZXdseSBjcmVhdGVkIHN0YXRpYyBhbmQgZHluYW1pYyBXZWIgcHJvamVjdHMuIDxub3RlPllvdSBjYW4gY2hhbmdlIHRoZSBuYW1lDQotaW4gdGhlIGNyZWF0aW9uIHdpemFyZCBXZWIgZmFjZXQgcGFnZS48L25vdGU+PHVsPg0KLTxsaT48Yj5NRVRBLUlORjwvYj4gLSBUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgPGZpbGVwYXRoPk1BTklGRVNULk1GPC9maWxlcGF0aD4gZmlsZSwNCi13aGljaCBpcyB1c2VkIHRvIG1hcCBjbGFzcyBwYXRocyBmb3IgZGVwZW5kZW50IEpBUiBmaWxlcyB0aGF0IGV4aXN0IGluIG90aGVyDQotcHJvamVjdHMgaW4gdGhlIHNhbWUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0LiBBbiBlbnRyeSBpbiB0aGlzIGZpbGUNCi13aWxsIHVwZGF0ZSB0aGUgcnVuLXRpbWUgcHJvamVjdCBjbGFzcyBwYXRoIGFuZCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZCBzZXR0aW5ncyB0byBpbmNsdWRlIHRoZSByZWZlcmVuY2VkDQotSkFSIGZpbGVzLjwvbGk+DQotPC91bD48dWw+DQotPGxpPjxiPldFQi1JTkY8L2I+IC0gVGhlIGRpcmVjdG9yeSB3aGVyZSBzdXBwb3J0aW5nIFdlYiByZXNvdXJjZXMgZm9yIGEgV2ViDQotYXBwbGljYXRpb24gYXJlIGtlcHQgKGZvciBleGFtcGxlOiAueG1pIGZpbGVzLCAueG1sIGZpbGVzLCBhbmQgd2ViLnhtbC4pIDwvbGk+DQotPC91bD4gPC9wPiA8L3NlY3Rpb24+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJ2dy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VidncuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmNTdhYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJ2dy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQiIC8+Ci08bWV0YSBjb250ZW50PSJQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIG92ZXJ2aWV3LCBXZWIgcHJvamVjdHMsIFByb2plY3QgRXhwbG9yZXIgdmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlByb2plY3QgRXhwbG9yZXIgdmlldywgb3ZlcnZpZXcsIFdlYiBwcm9qZWN0cywgUHJvamVjdCBFeHBsb3JlciB2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjY3dlYnZ3IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+UHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNjd2VidnciPjxhIG5hbWU9ImNjd2VidnciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlByb2plY3QgRXhwbG9yZXIgdmlldyBhbmQgV2ViIGRldmVsb3BtZW50PC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0icCI+VGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG5vdGFibGUgZmVhdHVyZXM6IDx1bD4KLTxsaT48aW1nIHNyYz0iLi4vaW1hZ2VzL253aW4uZ2lmIiBhbHQ9IkZvciBXaW5kb3dzIiAvPiBZb3UgY2FuIGRyYWcgYW5kIGRyb3AgZmlsZXMgZnJvbSBXaW5kb3dzPHN1cD7Crjwvc3VwPiBFeHBsb3JlciBvciB0aGUgZGVza3RvcCBpbnRvCi10aGUgTmF2aWdhdG9yIHZpZXcuPC9saT4KLQotPGxpPlZpZXcgZmlsdGVyaW5nIGlzIHN1cHBvcnRlZCBieSBzZWxlY3RpbmcgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsdGVyczwvc3Bhbj48L3NwYW4+IGZyb20KLXRoZSBOYXZpZ2F0b3IgdmlldyA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5NZW51PC9zcGFuPjwvc3Bhbj4gYnV0dG9uLiBSZXNvdXJjZXMKLWNhbiBiZSBmaWx0ZXJlZCBieSBuYW1lLCBwcm9qZWN0IHR5cGUgb3IgY29udGVudCB0eXBlLiBGaWxlcyBiZWdpbm5pbmcgd2l0aAotYSBwZXJpb2QgYXJlIGZpbHRlcmVkIG91dCBieSBkZWZhdWx0LjwvbGk+Ci0KLTxsaT5UaGUgc3RhdHVzIGxpbmUgc2hvd3MgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UuPC9saT4KLQotPGxpPkRyYWdnaW5nIGEgLmphdmEgZmlsZSBmcm9tIHRoZSBOYXZpZ2F0b3IgdmlldyBpbnRvIGEgSlNQIGZpbGUgd2lsbCBpbnNlcnQKLWEgdXNlYmVhbiB0YWcsIHRoZSBzYW1lIGJlaGF2aW9yIHRoYXQgaXMgZXhoaWJpdGVkIHdoZW4gYSAuY2xhc3MgZmlsZSBpcyBkcmFnZ2VkCi1pbnRvIGEgSlNQIGZpbGUuPC9saT4KLQotPGxpPkVycm9ycyBhbmQgd2FybmluZ3Mgb24gcmVzb3VyY2VzIChpbmNsdWRpbmcgSmF2YeKEoiwgSFRNTC9KU1AsIGFuZCBMaW5rcyBCdWlsZGVyIGVycm9ycwotYW5kIHdhcm5pbmdzKSBhcmUgaW5kaWNhdGVkIHdpdGggYSByZWQgZXJyb3IgPGltZyBzcmM9Ii4uL2ltYWdlcy9uc2hvd2Vyci5naWYiIGFsdD0iRXJyb3IgaWNvbiIgLz4gb3IgeWVsbG93IHdhcm5pbmcgPGltZyBzcmM9Ii4uL2ltYWdlcy9ud2FybmluZy5naWYiIGFsdD0iV2FybmluZyBpY29uIiAvPiBuZXh0IHRvIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBlcnJvciwgYXMgd2VsbCBhcwotdGhlIHBhcmVudCBjb250YWluZXJzIHVwIHRvIHRoZSBwcm9qZWN0LiBUaGlzIGFwcGxpZXMgZm9yIGFsbCBwcm9qZWN0IHR5cGVzLAotbm90IG9ubHkgV2ViIHByb2plY3RzLjwvbGk+Ci0KLTxsaT5JdGVtcyBhdmFpbGFibGUgZnJvbSB0aGUgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPjwvc3Bhbj4gY2FzY2FkaW5nCi1tZW51IGluIHRoZSBwcm9qZWN0IHBvcC11cCBtZW51IGFyZSBjb250ZXh0IHNlbnNpdGl2ZS4gIEFsbCBtZW51cyB3aWxsIGhhdmUgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvamVjdDwvc3Bhbj48L3NwYW4+IGFuZCA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5PdGhlcjwvc3Bhbj48L3NwYW4+IG9wdGlvbnMuPC9saT4KLQotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5Pcmdhbml6YXRpb24gb2YgdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldzwvaDQ+PHA+VGhlIFByb2plY3QKLUV4cGxvcmVyIHZpZXcgc2hvd3MgYSBjdXN0b20gdmlldyBvZiBhbGwgV2ViIHByb2plY3RzLiBUaGUgZm9sbG93aW5nIGFyZSBzb21lCi1vZiB0aGUgbm90YWJsZSB0b3AtbGV2ZWwgb2JqZWN0cyB0aGF0IGFwcGVhciBiZW5lYXRoIHRoZSBwcm9qZWN0IG5vZGUgKGJhc2VkCi1vbiBkZWZhdWx0IGZvbGRlciBuYW1lcykuPC9wPgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5XZWIgY29udGVudCBmb2xkZXI8L3N0cm9uZz4gLSBUaGlzIGZvbGRlciBjb250YWlucwotaXRlbXMgdG8gYmUgcHVibGlzaGVkIHRvIHRoZSBzZXJ2ZXIuIEJ5IGRlZmF1bHQsIHRoaXMgZm9sZGVyIHdpbGwgYmUgbmFtZWQgPHN0cm9uZz5XZWJDb250ZW50PC9zdHJvbmc+IGZvcgotbmV3bHkgY3JlYXRlZCBzdGF0aWMgYW5kIGR5bmFtaWMgV2ViIHByb2plY3RzLiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUKLWluIHRoZSBjcmVhdGlvbiB3aXphcmQgV2ViIGZhY2V0IHBhZ2UuPC9kaXY+Ci08dWw+Ci08bGk+PHN0cm9uZz5NRVRBLUlORjwvc3Ryb25nPiAtIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPk1BTklGRVNULk1GPC9zcGFuPiBmaWxlLAotd2hpY2ggaXMgdXNlZCB0byBtYXAgY2xhc3MgcGF0aHMgZm9yIGRlcGVuZGVudCBKQVIgZmlsZXMgdGhhdCBleGlzdCBpbiBvdGhlcgotcHJvamVjdHMgaW4gdGhlIHNhbWUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0LiBBbiBlbnRyeSBpbiB0aGlzIGZpbGUKLXdpbGwgdXBkYXRlIHRoZSBydW4tdGltZSBwcm9qZWN0IGNsYXNzIHBhdGggYW5kIEphdmEgYnVpbGQgc2V0dGluZ3MgdG8gaW5jbHVkZSB0aGUgcmVmZXJlbmNlZAotSkFSIGZpbGVzLjwvbGk+Ci0KLTwvdWw+Ci08dWw+Ci08bGk+PHN0cm9uZz5XRUItSU5GPC9zdHJvbmc+IC0gVGhlIGRpcmVjdG9yeSB3aGVyZSBzdXBwb3J0aW5nIFdlYiByZXNvdXJjZXMgZm9yIGEgV2ViCi1hcHBsaWNhdGlvbiBhcmUga2VwdCAoZm9yIGV4YW1wbGU6IC54bWkgZmlsZXMsIC54bWwgZmlsZXMsIGFuZCB3ZWIueG1sLikgPC9saT4KLQotPC91bD4KLSA8L2Rpdj4KLSA8L2Rpdj4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3d0b3Zlci5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd3RvdmVyLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MGNjM2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd3RvdmVyLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPCEtLSBBcmJvclRleHQsIEluYy4sIDE5ODgtMjAwMiwgdi40MDAyIC0tPg0KLTxjb25jZXB0IGlkPSJjY3d0b3ZlciIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3PC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgYXBwbGljYXRpb25zPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGUgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IHByb3ZpZGVzIHRoZSB0b29scyB5b3UgbmVlZCB0byBkZXZlbG9wDQotV2ViIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQNCi0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gYW5kIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEpTUCAxLjIgU3BlY2lmaWNhdGlvbjwvY2l0ZT4uDQotV2ViIGFwcGxpY2F0aW9ucyBjYW4gYmUgc2ltcGxlIChjb25zaXN0aW5nIG9mIG9ubHkgc3RhdGljIFdlYiBwYWdlcykgb3IgdGhleQ0KLWNhbiBiZSBtb3JlIGFkdmFuY2VkIGFuZCBpbmNsdWRlIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXMgYW5kIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHNlcnZsZXRzLg0KLVRoZXNlIHJlc291cmNlcywgYWxvbmcgd2l0aCBhbiBYTUwgZGVwbG95bWVudCBkZXNjcmlwdG9yIChhbmQgb3RoZXIgPHhyZWYNCi1ocmVmPSJjd2VicmVzb3VyY2VzLmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+IFdlYiByZXNvdXJjZXM8L3hyZWY+LCBhcmUgY29udGFpbmVkDQotd2l0aGluIGEgV2ViIHByb2plY3QgZHVyaW5nIGRldmVsb3BtZW50LiBXaGVuIHlvdSBhcmUgcmVhZHkgdG8gcHVibGlzaCB0aGUNCi1XZWIgYXBwbGljYXRpb24gdG8gdGhlIFdlYiwgeW91IGRlcGxveSB0aGUgV2ViIHByb2plY3QgdG8gdGhlIHNlcnZlciBpbiB0aGUNCi1mb3JtIG9mIGEgV2ViIGFyY2hpdmUgKFdBUikgZmlsZSAuIFRoZSBlbmQgdXNlciBjYW4gdGhlbiB2aWV3IHRoZSBXZWIgYXBwbGljYXRpb24NCi1hcyBhIFdlYiBzaXRlIGZyb20gYSBVUkwuPC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd3RvdmVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3dG92ZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4NmUzNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3dG92ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBhcHBsaWNhdGlvbnMsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV2ViIGFwcGxpY2F0aW9ucywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d0ZmVhdHVyZXMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amRldGFncy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dlYmFydGlmYWN0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY2N3dG92ZXIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5XZWIgYXBwbGljYXRpb24gb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNjd3RvdmVyIj48YSBuYW1lPSJjY3d0b3ZlciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3PC9oMT4KLQotCi08ZGl2PgotPHA+VGhlIFdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBwcm92aWRlcyB0aGUgdG9vbHMgeW91IG5lZWQgdG8gZGV2ZWxvcAotV2ViIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEphdmHihKIgU2VydmxldAotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IGFuZCB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKU1AgMS4yIFNwZWNpZmljYXRpb248L2NpdGU+LgotV2ViIGFwcGxpY2F0aW9ucyBjYW4gYmUgc2ltcGxlIChjb25zaXN0aW5nIG9mIG9ubHkgc3RhdGljIFdlYiBwYWdlcykgb3IgdGhleQotY2FuIGJlIG1vcmUgYWR2YW5jZWQgYW5kIGluY2x1ZGUgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyBhbmQgSmF2YSBzZXJ2bGV0cy4KLVRoZXNlIHJlc291cmNlcywgYWxvbmcgd2l0aCBhbiBYTUwgZGVwbG95bWVudCBkZXNjcmlwdG9yIChhbmQgb3RoZXIgPGEgaHJlZj0iY3dlYnJlc291cmNlcy5odG1sIiB0aXRsZT0iIj5XZWIgcmVzb3VyY2VzPC9hPiwgYXJlIGNvbnRhaW5lZAotd2l0aGluIGEgV2ViIHByb2plY3QgZHVyaW5nIGRldmVsb3BtZW50LiBXaGVuIHlvdSBhcmUgcmVhZHkgdG8gcHVibGlzaCB0aGUKLVdlYiBhcHBsaWNhdGlvbiB0byB0aGUgV2ViLCB5b3UgZGVwbG95IHRoZSBXZWIgcHJvamVjdCB0byB0aGUgc2VydmVyIGluIHRoZQotZm9ybSBvZiBhIFdlYiBhcmNoaXZlIChXQVIpIGZpbGUgLiBUaGUgZW5kIHVzZXIgY2FuIHRoZW4gdmlldyB0aGUgV2ViIGFwcGxpY2F0aW9uCi1hcyBhIFdlYiBzaXRlIGZyb20gYSBVUkwuPC9wPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3RmZWF0dXJlcy5odG1sIiB0aXRsZT0iVGhlIGludGVncmF0ZWQgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IG1ha2VzIGl0IGVhc3kgdG8gY29vcGVyYXRpdmVseSBjcmVhdGUsIGFzc2VtYmxlLCBwdWJsaXNoLCBkZXBsb3kgYW5kIG1haW50YWluIGR5bmFtaWMsIGludGVyYWN0aXZlIFdlYiBhcHBsaWNhdGlvbnMuIj5XZWIgdG9vbHMgZmVhdHVyZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZGV0YWdzLmh0bWwiPkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dlYmFydGlmYWN0Lmh0bWwiPkNyZWF0aW5nIFdlYiBBcnRpZmFjdHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2NwZGpzcHMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jcGRqc3BzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MjI0ZjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2NwZGpzcHMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3BkanNwcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+SmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5PC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9ImNwZGpzcHN8MXxKU1BwYWdlc292ZXJ2aWV3IiBzdGF0dXM9ImNoYW5nZWQiPkpTUA0KLWZpbGVzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0ga2V5cmVmPSJjcGRqc3BzfDJ8V2ViY29udGVudGdlbmVyYXRpbmdkeW5hbWljYWxseSINCi1zdGF0dXM9Im5ldyI+V2ViIGNvbnRlbnQ8aW5kZXh0ZXJtPmdlbmVyYXRpbmcgZHluYW1pY2FsbHk8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VGhlIEphdmFTZXJ2ZXIgUGFnZXMgdGVjaG5vbG9neSBlbmFibGVzIHlvdSB0byBnZW5lcmF0ZSBkeW5hbWljIHdlYiBjb250ZW50LA0KLXN1Y2ggYXMgSFRNTCwgREhUTUwsIFhIVE1MLCBhbmQgWE1MIGZpbGVzLCB0byBpbmNsdWRlIGluIGEgV2ViIGFwcGxpY2F0aW9uLg0KLUpTUCBmaWxlcyBhcmUgb25lIHdheSB0byBpbXBsZW1lbnQgc2VydmVyLXNpZGUgZHluYW1pYyBwYWdlIGNvbnRlbnQuIEpTUCBmaWxlcw0KLWFsbG93IGEgV2ViIHNlcnZlciwgc3VjaCBhcyBBcGFjaGUgVG9tY2F0LCB0byBhZGQgY29udGVudCBkeW5hbWljYWxseSB0byB5b3VyDQotSFRNTCBwYWdlcyBiZWZvcmUgdGhleSBhcmUgc2VudCB0byBhIHJlcXVlc3RpbmcgYnJvd3Nlci48L3A+DQotPHA+V2hlbiB5b3UgZGVwbG95IGEgSlNQIGZpbGUgdG8gYSBXZWIgc2VydmVyIHRoYXQgcHJvdmlkZXMgYSBzZXJ2bGV0IGVuZ2luZSwNCi1pdCBpcyBwcmVwcm9jZXNzZWQgaW50byBhIHNlcnZsZXQgdGhhdCBydW5zIG9uIHRoZSBXZWIgc2VydmVyLiBUaGlzIGlzIGluDQotY29udHJhc3Qgd2l0aCBjbGllbnQtc2lkZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiAod2l0aGluIDxjb2RlcGg+Jmx0O1NDUklQVD48L2NvZGVwaD4gdGFncyksDQotd2hpY2ggaXMgcnVuIGluIGEgYnJvd3Nlci4gQSBKU1AgcGFnZSBpcyBpZGVhbCBmb3IgdGFza3MgdGhhdCBhcmUgYmV0dGVyIHN1aXRlZA0KLXRvIGV4ZWN1dGlvbiBvbiB0aGUgc2VydmVyLCBzdWNoIGFzIGFjY2Vzc2luZyBkYXRhYmFzZXMgb3IgY2FsbGluZyBFbnRlcnByaXNlIDx0bQ0KLXRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJlYW5zLjwvcD4NCi08cD5Zb3UgY2FuIGNyZWF0ZSBhbmQgZWRpdCBhIEpTUCBmaWxlIGluIHRoZSBIVE1MIGVkaXRvciBieSBhZGRpbmcgeW91ciBvd24NCi10ZXh0IGFuZCBpbWFnZXMgdXNpbmcgSFRNTCwgSlNQIHRhZ2dpbmcsIG9yIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+LCBpbmNsdWRpbmcgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc291cmNlDQotY29kZSBpbnNpZGUgb2Ygc2NyaXB0bGV0IHRhZ3MuIFR5cGljYWxseSwgSlNQIGZpbGVzIGhhdmUgdGhlIGZpbGUgZXh0ZW5zaW9uDQotLmpzcC4gQWRkaXRpb25hbGx5LCB0aGUgSlNQIHNwZWNpZmljYXRpb24gc3VnZ2VzdHMgdGhhdCBKU1AgZnJhZ21lbnQgZmlsZXMNCi1zaG91bGQgaGF2ZSBmaWxlIGV4dGVuc2lvbiAuanNwZi4gSWYgdGhpcyBjb252ZW50aW9uIGlzIG5vdCBmb2xsb3dlZCwgdGhlDQotSlNQIHZhbGlkYXRvciB3aWxsIHRyZWF0IEpTUCBmcmFnbWVudHMgYXMgcmVndWxhciBzdGFuZGFsb25lIEpTUCBmaWxlcywgYW5kDQotY29tcGlsYXRpb24gZXJyb3JzIG1pZ2h0IGJlIHJlcG9ydGVkLjwvcD4NCi08cD5UaGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKU1AgMS4yIFNwZWNpZmljYXRpb248L2NpdGU+IHByb3ZpZGVzIHRoZSBhYmlsaXR5DQotdG8gY3JlYXRlIGN1c3RvbSBKU1AgdGFncy4gQ3VzdG9tIHRhZ3Mgc2ltcGxpZnkgY29tcGxleCBhY3Rpb25zIGFuZCAgcHJvdmlkZQ0KLWRldmVsb3BlcnMgd2l0aCBncmVhdGVyIGNvbnRyb2wgb3ZlciBwYWdlIGNvbnRlbnQuIEN1c3RvbSB0YWdzIGFyZSBjb2xsZWN0ZWQNCi1pbnRvIGEgbGlicmFyeSAodGFnbGliKS4gQSB0YWcgbGlicmFyeSBkZXNjcmlwdG9yIGZpbGUgKHRhZ2xpYi50bGQpIGlzIGFuDQotWE1MIGRvY3VtZW50IHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhZyBsaWJyYXJ5LCBpbmNsdWRpbmcgdGhlDQotdGFnbGliIHNob3J0IG5hbWUsIGxpYnJhcnkgZGVzY3JpcHRpb24sIGFuZCB0YWcgZGVzY3JpcHRpb25zLiBSZWZlciB0byB0aGUgPGNpdGU+U3VuDQotTWljcm9zeXN0ZW1zIEpTUCAxLjIgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gZm9yIG1vcmUgZGV0YWlscy48L3A+DQotPHA+VG8gdXNlIEpTUCAxLjIgY3VzdG9tIHRhZ2xpYnMsIHlvdSBjYW4gaW1wb3J0IHRoZSB0YWcgbGlicmFyeSAudGxkIGFuZA0KLS5qYXIgZmlsZXMgaW50byB5b3VyIHByb2plY3QgdG8gdXNlIHRoZW0sIG9yIGFzc29jaWF0ZSB0aGVtIGFzIFdlYiBMaWJyYXJ5DQotcHJvamVjdHMuIFlvdSBjYW4gYWxzbyByZWZlcmVuY2UgYSBUTEQgZmlsZSBieSB1c2luZyBhIFVSSS48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3BkanNwcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2NwZGpzcHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkYzYyOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3BkanNwcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5IiAvPgotPG1ldGEgY29udGVudD0iSlNQIGZpbGVzLCBvdmVydmlldywgV2ViIGNvbnRlbnQsIGdlbmVyYXRpbmcgZHluYW1pY2FsbHkiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJKU1AgZmlsZXMsIG92ZXJ2aWV3LCBXZWIgY29udGVudCwgZ2VuZXJhdGluZyBkeW5hbWljYWxseSIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3NlcnZibi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dsaXN0Ym4uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3ZmlsdGJuLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amNyZWpzcC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNwZGpzcHMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5KYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3k8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNwZGpzcHMiPjxhIG5hbWU9ImNwZGpzcHMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neTwvaDE+Ci0KLQotPGRpdj4KLTxwPlRoZSBKYXZhU2VydmVyIFBhZ2VzIHRlY2hub2xvZ3kgZW5hYmxlcyB5b3UgdG8gZ2VuZXJhdGUgZHluYW1pYyB3ZWIgY29udGVudCwKLXN1Y2ggYXMgSFRNTCwgREhUTUwsIFhIVE1MLCBhbmQgWE1MIGZpbGVzLCB0byBpbmNsdWRlIGluIGEgV2ViIGFwcGxpY2F0aW9uLgotSlNQIGZpbGVzIGFyZSBvbmUgd2F5IHRvIGltcGxlbWVudCBzZXJ2ZXItc2lkZSBkeW5hbWljIHBhZ2UgY29udGVudC4gSlNQIGZpbGVzCi1hbGxvdyBhIFdlYiBzZXJ2ZXIsIHN1Y2ggYXMgQXBhY2hlIFRvbWNhdCwgdG8gYWRkIGNvbnRlbnQgZHluYW1pY2FsbHkgdG8geW91cgotSFRNTCBwYWdlcyBiZWZvcmUgdGhleSBhcmUgc2VudCB0byBhIHJlcXVlc3RpbmcgYnJvd3Nlci48L3A+Ci0KLTxwPldoZW4geW91IGRlcGxveSBhIEpTUCBmaWxlIHRvIGEgV2ViIHNlcnZlciB0aGF0IHByb3ZpZGVzIGEgc2VydmxldCBlbmdpbmUsCi1pdCBpcyBwcmVwcm9jZXNzZWQgaW50byBhIHNlcnZsZXQgdGhhdCBydW5zIG9uIHRoZSBXZWIgc2VydmVyLiBUaGlzIGlzIGluCi1jb250cmFzdCB3aXRoIGNsaWVudC1zaWRlIEphdmFTY3JpcHTihKIgKHdpdGhpbiA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7U0NSSVBUJmd0Ozwvc2FtcD4gdGFncyksCi13aGljaCBpcyBydW4gaW4gYSBicm93c2VyLiBBIEpTUCBwYWdlIGlzIGlkZWFsIGZvciB0YXNrcyB0aGF0IGFyZSBiZXR0ZXIgc3VpdGVkCi10byBleGVjdXRpb24gb24gdGhlIHNlcnZlciwgc3VjaCBhcyBhY2Nlc3NpbmcgZGF0YWJhc2VzIG9yIGNhbGxpbmcgRW50ZXJwcmlzZSBKYXZh4oSiIGJlYW5zLjwvcD4KLQotPHA+WW91IGNhbiBjcmVhdGUgYW5kIGVkaXQgYSBKU1AgZmlsZSBpbiB0aGUgSFRNTCBlZGl0b3IgYnkgYWRkaW5nIHlvdXIgb3duCi10ZXh0IGFuZCBpbWFnZXMgdXNpbmcgSFRNTCwgSlNQIHRhZ2dpbmcsIG9yIEphdmFTY3JpcHQsIGluY2x1ZGluZyBKYXZhIHNvdXJjZQotY29kZSBpbnNpZGUgb2Ygc2NyaXB0bGV0IHRhZ3MuIFR5cGljYWxseSwgSlNQIGZpbGVzIGhhdmUgdGhlIGZpbGUgZXh0ZW5zaW9uCi0uanNwLiBBZGRpdGlvbmFsbHksIHRoZSBKU1Agc3BlY2lmaWNhdGlvbiBzdWdnZXN0cyB0aGF0IEpTUCBmcmFnbWVudCBmaWxlcwotc2hvdWxkIGhhdmUgZmlsZSBleHRlbnNpb24gLmpzcGYuIElmIHRoaXMgY29udmVudGlvbiBpcyBub3QgZm9sbG93ZWQsIHRoZQotSlNQIHZhbGlkYXRvciB3aWxsIHRyZWF0IEpTUCBmcmFnbWVudHMgYXMgcmVndWxhciBzdGFuZGFsb25lIEpTUCBmaWxlcywgYW5kCi1jb21waWxhdGlvbiBlcnJvcnMgbWlnaHQgYmUgcmVwb3J0ZWQuPC9wPgotCi08cD5UaGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKU1AgMS4yIFNwZWNpZmljYXRpb248L2NpdGU+IHByb3ZpZGVzIHRoZSBhYmlsaXR5Ci10byBjcmVhdGUgY3VzdG9tIEpTUCB0YWdzLiBDdXN0b20gdGFncyBzaW1wbGlmeSBjb21wbGV4IGFjdGlvbnMgYW5kICBwcm92aWRlCi1kZXZlbG9wZXJzIHdpdGggZ3JlYXRlciBjb250cm9sIG92ZXIgcGFnZSBjb250ZW50LiBDdXN0b20gdGFncyBhcmUgY29sbGVjdGVkCi1pbnRvIGEgbGlicmFyeSAodGFnbGliKS4gQSB0YWcgbGlicmFyeSBkZXNjcmlwdG9yIGZpbGUgKHRhZ2xpYi50bGQpIGlzIGFuCi1YTUwgZG9jdW1lbnQgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFnIGxpYnJhcnksIGluY2x1ZGluZyB0aGUKLXRhZ2xpYiBzaG9ydCBuYW1lLCBsaWJyYXJ5IGRlc2NyaXB0aW9uLCBhbmQgdGFnIGRlc2NyaXB0aW9ucy4gUmVmZXIgdG8gdGhlIDxjaXRlPlN1bgotTWljcm9zeXN0ZW1zIEpTUCAxLjIgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gZm9yIG1vcmUgZGV0YWlscy48L3A+Ci0KLTxwPlRvIHVzZSBKU1AgMS4yIGN1c3RvbSB0YWdsaWJzLCB5b3UgY2FuIGltcG9ydCB0aGUgdGFnIGxpYnJhcnkgLnRsZCBhbmQKLS5qYXIgZmlsZXMgaW50byB5b3VyIHByb2plY3QgdG8gdXNlIHRoZW0sIG9yIGFzc29jaWF0ZSB0aGVtIGFzIFdlYiBMaWJyYXJ5Ci1wcm9qZWN0cy4gWW91IGNhbiBhbHNvIHJlZmVyZW5jZSBhIFRMRCBmaWxlIGJ5IHVzaW5nIGEgVVJJLjwvcD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dzZXJ2Ym4uaHRtbCIgdGl0bGU9IiI+U2VydmxldHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd2xpc3Ribi5odG1sIiB0aXRsZT0iIj5MaXN0ZW5lcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd2ZpbHRibi5odG1sIiB0aXRsZT0iIj5MaXN0ZW5lcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqY3JlanNwLmh0bWwiPkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJhcnRpZmFjdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJhcnRpZmFjdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjRiZGFmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2ViYXJ0aWZhY3QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08IS0tIEFyYm9yVGV4dCwgSW5jLiwgMTk4OC0yMDAyLCB2LjQwMDIgLS0+DQotPGNvbmNlcHQgaWQ9ImN3ZWJhcnRpZmFjdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgV2ViIEFydGlmYWN0czwvdGl0bGU+DQotPGNvbmJvZHk+DQotPHA+Q29udGVudHM6PC9wPg0KLTx1bD4NCi08bGk+PHhyZWYgaHJlZj0idHdzcnZ3aXouZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5DcmVhdGluZyBTZXJ2bGV0czwveHJlZj48L2xpPg0KLTxsaT48eHJlZiBocmVmPSJ0d2xzdHdpei5kaXRhIiBzY29wZT0icGVlciI+PGRlc2M+PC9kZXNjPkNyZWF0aW5nIExpc3RlbmVyczwveHJlZj48L2xpPg0KLTxsaT48eHJlZiBocmVmPSJ0d2ZsdHdpei5kaXRhIiBzY29wZT0icGVlciI+PGRlc2M+PC9kZXNjPkNyZWF0aW5nIEZpbHRlcnM8L3hyZWY+PC9saT4NCi08L3VsPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJhcnRpZmFjdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJhcnRpZmFjdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWRmNzQ5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2ViYXJ0aWZhY3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIFdlYiBBcnRpZmFjdHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3dlYmFydGlmYWN0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgV2ViIEFydGlmYWN0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3dlYmFydGlmYWN0Ij48YSBuYW1lPSJjd2ViYXJ0aWZhY3QiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIFdlYiBBcnRpZmFjdHM8L2gxPgotCi08ZGl2PgotPHA+Q29udGVudHM6PC9wPgotCi08dWw+Ci08bGk+PGEgaHJlZj0idHdzcnZ3aXouaHRtbCIgdGl0bGU9IiI+Q3JlYXRpbmcgU2VydmxldHM8L2E+PC9saT4KLQotPGxpPjxhIGhyZWY9InR3bHN0d2l6Lmh0bWwiIHRpdGxlPSIiPkNyZWF0aW5nIExpc3RlbmVyczwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0idHdmbHR3aXouaHRtbCIgdGl0bGU9IiI+Q3JlYXRpbmcgRmlsdGVyczwvYT48L2xpPgotCi08L3VsPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJwYWdlZGVzaWduLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YxNjI0Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3dlYnBhZ2VkZXNpZ24iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldlYiBwYWdlIGRlc2lnbjwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+V2ViIHBhZ2UgZGVzaWduPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5XZWIgcGFnZXMgYXJlIGFuIGludGVncmFsIHBhcnQgb2YgZXZlcnkgV2ViIGFwcGxpY2F0aW9uLiBFYWNoIFdlYiBwYWdlDQotc2hvdWxkIHNlcnZlIHRvIGhlbHAgYWNoaWV2ZSB0aGUgb3ZlcmFsbCBnb2FsIG9mIHRoZSBlbnRpcmUgV2ViIHNpdGUuPC9wPg0KLTxwPiBUaGVyZSBhcmUgbWFueSB0eXBlcyBvZiBXZWIgcGFnZXMsIHJhbmdpbmcgZnJvbSBzaW1wbGUgSFRNTCBwYWdlcyB0aGF0DQotY29udGFpbiBubyBkeW5hbWljIGVsZW1lbnRzLCB0byBhZHZhbmNlZCBKYXZhLWJhc2VkIHBhZ2VzIHRoYXQgbWFrZSB1c2Ugb2YNCi1zZXJ2bGV0cywgc2NyaXB0cywgZm9ybXMsIG9yIGRhdGEgYWNjZXNzIGNvbXBvbmVudHMuPC9wPg0KLTxwPkEgZmV3IG9mIHRoZSBtYW55IGl0ZW1zIHlvdSBzaG91bGQgY29uc2lkZXIgd2hlbiBkZXNpZ25pbmcgeW91ciBwYWdlcyBhcmUNCi1tYXJrdXAgbGFuZ3VhZ2UsIGxpbmtzLCBpbWFnZXMsIGFuZCBzdHlsZSBzaGVldHMuPC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJwYWdlZGVzaWduLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJlMjE3Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IldlYiBwYWdlIGRlc2lnbiIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBwYWdlIGRlc2lnbiwgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcGFnZSBkZXNpZ24sIG92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqZGV0YWdzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3dlYnBhZ2VkZXNpZ24iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5XZWIgcGFnZSBkZXNpZ248L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN3ZWJwYWdlZGVzaWduIj48YSBuYW1lPSJjd2VicGFnZWRlc2lnbiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V2ViIHBhZ2UgZGVzaWduPC9oMT4KLQotCi08ZGl2PgotPHA+V2ViIHBhZ2VzIGFyZSBhbiBpbnRlZ3JhbCBwYXJ0IG9mIGV2ZXJ5IFdlYiBhcHBsaWNhdGlvbi4gRWFjaCBXZWIgcGFnZQotc2hvdWxkIHNlcnZlIHRvIGhlbHAgYWNoaWV2ZSB0aGUgb3ZlcmFsbCBnb2FsIG9mIHRoZSBlbnRpcmUgV2ViIHNpdGUuPC9wPgotCi08cD4gVGhlcmUgYXJlIG1hbnkgdHlwZXMgb2YgV2ViIHBhZ2VzLCByYW5naW5nIGZyb20gc2ltcGxlIEhUTUwgcGFnZXMgdGhhdAotY29udGFpbiBubyBkeW5hbWljIGVsZW1lbnRzLCB0byBhZHZhbmNlZCBKYXZhLWJhc2VkIHBhZ2VzIHRoYXQgbWFrZSB1c2Ugb2YKLXNlcnZsZXRzLCBzY3JpcHRzLCBmb3Jtcywgb3IgZGF0YSBhY2Nlc3MgY29tcG9uZW50cy48L3A+Ci0KLTxwPkEgZmV3IG9mIHRoZSBtYW55IGl0ZW1zIHlvdSBzaG91bGQgY29uc2lkZXIgd2hlbiBkZXNpZ25pbmcgeW91ciBwYWdlcyBhcmUKLW1hcmt1cCBsYW5ndWFnZSwgbGlua3MsIGltYWdlcywgYW5kIHN0eWxlIHNoZWV0cy48L3A+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZGV0YWdzLmh0bWwiIHRpdGxlPSIiPkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicHJvamVjdHMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicHJvamVjdHMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1ODYxMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnByb2plY3RzLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN3ZWJwcm9qZWN0cyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V2ViIHByb2plY3RzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgcHJvamVjdHM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5XZWIgYXBwbGljYXRpb25zPGluZGV4dGVybT5jcmVhdGluZyBvciBpbXBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+V2ViIHByb2plY3RzIGhvbGQgYWxsIG9mIHRoZSBXZWIgcmVzb3VyY2VzIHRoYXQgYXJlIGNyZWF0ZWQgYW5kIHVzZWQgd2hlbg0KLWRldmVsb3BpbmcgeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBmaXJzdCBzdGVwIHRvIGNyZWF0aW5nIG9yIGltcG9ydGluZyBhDQotV2ViIGFwcGxpY2F0aW9uIGlzIHRvIGNyZWF0ZSBlaXRoZXIgYSBzdGF0aWMgb3IgYSBkeW5hbWljIFdlYiBwcm9qZWN0LiBTdGF0aWMNCi1XZWIgcHJvamVjdHMgYXJlIG1lYW50IHRvIGNvbnRhaW4gb25seSBzaW1wbGUgV2ViIHNpdGUgcmVzb3VyY2VzLCBzdWNoIGFzDQotSFRNTCBmaWxlcy4gRHluYW1pYyBXZWIgcHJvamVjdHMgYXJlIHVzZWQgdG8gc3RydWN0dXJlIFdlYiBhcHBsaWNhdGlvbnMgdGhhdA0KLXdpbGwgdXNlIG1vcmUgY29tcGxpY2F0ZWQsIGR5bmFtaWMgV2ViIHRlY2hub2xvZ2llcywgc3VjaCBhcyBKYXZhU2VydmVyIFBhZ2VzDQotZmlsZXMsIGFuZCBwb3NzaWJseSBkYXRhIGFjY2VzcyByZXNvdXJjZXMuPC9wPg0KLTxwPlRob3VnaCB0aGUgV2ViIHByb2plY3QgaXMgc3RydWN0dXJlZCBvbiB5b3VyIGZpbGUgc3lzdGVtIGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBKYXZhIEVFIFdlYiBhcHBsaWNhdGlvbiBzdGFuZGFyZCBmb3IgZGVwbG95bWVudCBwdXJwb3NlcywgdGhlIFByb2plY3QNCi1FeHBsb3JlciB2aWV3IGlzIGRlc2lnbmVkIHRvIHNob3cgdGhlIG1vc3QgY29udmVuaWVudCBkaXNwbGF5IG9mIHByb2plY3QgcmVzb3VyY2VzDQotZm9yIHVzZSB3aGlsZSB5b3UgYXJlIGFjdHVhbGx5IGRldmVsb3BpbmcgdGhlIFdlYiBhcHBsaWNhdGlvbi4gV2hlbiB5b3UgYXJlDQotZmluaXNoZWQgZGV2ZWxvcGluZyB5b3VyIFdlYiBhcHBsaWNhdGlvbiwgeW91IHVzZSB0aGUgV2ViIHByb2plY3QgdG8gZGVwbG95DQotdGhlIGNvcnJlY3QgcmVzb3VyY2VzIHRvIHRoZSBzZXJ2ZXIuIFRoZXNlIHJlc291cmNlcyB3aWxsIGJlIHBhY2thZ2VkIGluIGENCi1maWxlIGNhbGxlZCBhIFdlYiBhcmNoaXZlLCBvciBXQVIgZmlsZS48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnByb2plY3RzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnByb2plY3RzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YmZhZTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJwcm9qZWN0cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV2ViIHByb2plY3RzIiAvPgotPG1ldGEgY29udGVudD0iV2ViIHByb2plY3RzLCBvdmVydmlldywgV2ViIGFwcGxpY2F0aW9ucywgY3JlYXRpbmcgb3IgaW1wb3J0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV2ViIHByb2plY3RzLCBvdmVydmlldywgV2ViIGFwcGxpY2F0aW9ucywgY3JlYXRpbmcgb3IgaW1wb3J0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Njc3RhdGljLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jY3dlYnByai5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d3YXJvdnIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Y3Jlc3RhLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2NyZXByai5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN3ZWJwcm9qZWN0cyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldlYiBwcm9qZWN0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3dlYnByb2plY3RzIj48YSBuYW1lPSJjd2VicHJvamVjdHMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldlYiBwcm9qZWN0czwvaDE+Ci0KLQotPGRpdj4KLTxwPldlYiBwcm9qZWN0cyBob2xkIGFsbCBvZiB0aGUgV2ViIHJlc291cmNlcyB0aGF0IGFyZSBjcmVhdGVkIGFuZCB1c2VkIHdoZW4KLWRldmVsb3BpbmcgeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBmaXJzdCBzdGVwIHRvIGNyZWF0aW5nIG9yIGltcG9ydGluZyBhCi1XZWIgYXBwbGljYXRpb24gaXMgdG8gY3JlYXRlIGVpdGhlciBhIHN0YXRpYyBvciBhIGR5bmFtaWMgV2ViIHByb2plY3QuIFN0YXRpYwotV2ViIHByb2plY3RzIGFyZSBtZWFudCB0byBjb250YWluIG9ubHkgc2ltcGxlIFdlYiBzaXRlIHJlc291cmNlcywgc3VjaCBhcwotSFRNTCBmaWxlcy4gRHluYW1pYyBXZWIgcHJvamVjdHMgYXJlIHVzZWQgdG8gc3RydWN0dXJlIFdlYiBhcHBsaWNhdGlvbnMgdGhhdAotd2lsbCB1c2UgbW9yZSBjb21wbGljYXRlZCwgZHluYW1pYyBXZWIgdGVjaG5vbG9naWVzLCBzdWNoIGFzIEphdmFTZXJ2ZXIgUGFnZXMKLWZpbGVzLCBhbmQgcG9zc2libHkgZGF0YSBhY2Nlc3MgcmVzb3VyY2VzLjwvcD4KLQotPHA+VGhvdWdoIHRoZSBXZWIgcHJvamVjdCBpcyBzdHJ1Y3R1cmVkIG9uIHlvdXIgZmlsZSBzeXN0ZW0gaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgSmF2YSBFRSBXZWIgYXBwbGljYXRpb24gc3RhbmRhcmQgZm9yIGRlcGxveW1lbnQgcHVycG9zZXMsIHRoZSBQcm9qZWN0Ci1FeHBsb3JlciB2aWV3IGlzIGRlc2lnbmVkIHRvIHNob3cgdGhlIG1vc3QgY29udmVuaWVudCBkaXNwbGF5IG9mIHByb2plY3QgcmVzb3VyY2VzCi1mb3IgdXNlIHdoaWxlIHlvdSBhcmUgYWN0dWFsbHkgZGV2ZWxvcGluZyB0aGUgV2ViIGFwcGxpY2F0aW9uLiBXaGVuIHlvdSBhcmUKLWZpbmlzaGVkIGRldmVsb3BpbmcgeW91ciBXZWIgYXBwbGljYXRpb24sIHlvdSB1c2UgdGhlIFdlYiBwcm9qZWN0IHRvIGRlcGxveQotdGhlIGNvcnJlY3QgcmVzb3VyY2VzIHRvIHRoZSBzZXJ2ZXIuIFRoZXNlIHJlc291cmNlcyB3aWxsIGJlIHBhY2thZ2VkIGluIGEKLWZpbGUgY2FsbGVkIGEgV2ViIGFyY2hpdmUsIG9yIFdBUiBmaWxlLjwvcD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2NzdGF0aWMuaHRtbCIgdGl0bGU9IiI+U3RhdGljIFdlYiBwcm9qZWN0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2Njd2VicHJqLmh0bWwiIHRpdGxlPSIiPkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3dhcm92ci5odG1sIiB0aXRsZT0iIj5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdjcmVzdGEuaHRtbCI+Q3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NyZXByai5odG1sIj5DcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJyZXNvdXJjZXMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicmVzb3VyY2VzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjhkNzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJyZXNvdXJjZXMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3dlYnJlc291cmNlcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V2ViIHJlc291cmNlczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+V2ViIHJlc291cmNlczxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+SW4gbW9zdCBjYXNlcywgYWxsIG9mIHRoZSByZXNvdXJjZXMgdGhhdCB5b3UgbmVlZCB0byBjcmVhdGUgZm9yIHlvdXIgV2ViDQotYXBwbGljYXRpb24gYXJlIGRldmVsb3BlZCBkdXJpbmcgV2ViIHNpdGUgb3IgV2ViIHBhZ2UgZGVzaWduOyBob3dldmVyLCB0aGVyZQ0KLWFyZSBhZGRpdGlvbmFsIHJlc291cmNlcyB0aGF0IHlvdSBtYXkgbmVlZCB0byBpbmNsdWRlIGluIHlvdXIgV2ViIHByb2plY3QNCi1pZiB5b3UgYXJlIHVzaW5nIG1vcmUgYWR2YW5jZWQgV2ViIHRlY2hub2xvZ2llcyBpbiB5b3VyIGFwcGxpY2F0aW9uLjwvcD4NCi08cD5UaGVzZSBXZWIgcmVzb3VyY2VzIGFyZSBub3QgdHlwaWNhbCBXZWIgcGFnZSBmaWxlcywgYW5kIGFyZSBvZnRlbiBub3QgdGhlDQotcmVzb3VyY2VzIHRoYXQgeW91IGNvbnNpZGVyIHBhcnQgb2YgdGhlIGZpbmFsIFdlYiBzaXRlLiBGb3IgZXhhbXBsZSwgdGFnIGxpYnJhcmllcw0KLWFuZCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gcmVzb3VyY2VzLA0KLXN1Y2ggYXMgSkFSIGZpbGVzLCBhcmUgcmVzb3VyY2VzIHlvdSBtaWdodCBuZWVkIHRvIGluY2x1ZGUgaW4geW91ciBXZWIgcHJvamVjdC4gPC9wPg0KLTxwPkluIGZhY3QsIGV2ZW4gdGhlIFdBUiBmaWxlIGl0c2VsZiBjb3VsZCBiZSBjb25zaWRlcmVkIGEgV2ViIHJlc291cmNlLCBpZg0KLXlvdSBjb25zaWRlciBpbXBvcnRpbmcgb3IgZXhwb3J0aW5nIHRoZSByZXNvdXJjZS48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnJlc291cmNlcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJyZXNvdXJjZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzMzAwYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnJlc291cmNlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV2ViIHJlc291cmNlcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiByZXNvdXJjZXMsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV2ViIHJlc291cmNlcywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d3YXJvdnIuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd2VicmVzb3VyY2VzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V2ViIHJlc291cmNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3dlYnJlc291cmNlcyI+PGEgbmFtZT0iY3dlYnJlc291cmNlcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V2ViIHJlc291cmNlczwvaDE+Ci0KLQotPGRpdj4KLTxwPkluIG1vc3QgY2FzZXMsIGFsbCBvZiB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IG5lZWQgdG8gY3JlYXRlIGZvciB5b3VyIFdlYgotYXBwbGljYXRpb24gYXJlIGRldmVsb3BlZCBkdXJpbmcgV2ViIHNpdGUgb3IgV2ViIHBhZ2UgZGVzaWduOyBob3dldmVyLCB0aGVyZQotYXJlIGFkZGl0aW9uYWwgcmVzb3VyY2VzIHRoYXQgeW91IG1heSBuZWVkIHRvIGluY2x1ZGUgaW4geW91ciBXZWIgcHJvamVjdAotaWYgeW91IGFyZSB1c2luZyBtb3JlIGFkdmFuY2VkIFdlYiB0ZWNobm9sb2dpZXMgaW4geW91ciBhcHBsaWNhdGlvbi48L3A+Ci0KLTxwPlRoZXNlIFdlYiByZXNvdXJjZXMgYXJlIG5vdCB0eXBpY2FsIFdlYiBwYWdlIGZpbGVzLCBhbmQgYXJlIG9mdGVuIG5vdCB0aGUKLXJlc291cmNlcyB0aGF0IHlvdSBjb25zaWRlciBwYXJ0IG9mIHRoZSBmaW5hbCBXZWIgc2l0ZS4gRm9yIGV4YW1wbGUsIHRhZyBsaWJyYXJpZXMKLWFuZCBKYXZh4oSiIHJlc291cmNlcywKLXN1Y2ggYXMgSkFSIGZpbGVzLCBhcmUgcmVzb3VyY2VzIHlvdSBtaWdodCBuZWVkIHRvIGluY2x1ZGUgaW4geW91ciBXZWIgcHJvamVjdC4gPC9wPgotCi08cD5JbiBmYWN0LCBldmVuIHRoZSBXQVIgZmlsZSBpdHNlbGYgY291bGQgYmUgY29uc2lkZXJlZCBhIFdlYiByZXNvdXJjZSwgaWYKLXlvdSBjb25zaWRlciBpbXBvcnRpbmcgb3IgZXhwb3J0aW5nIHRoZSByZXNvdXJjZS48L3A+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3d2Fyb3ZyLmh0bWwiIHRpdGxlPSIiPldlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2ZpbHRibi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZmlsdGJuLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZDg3NWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZmlsdGJuLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN3ZmlsdGJuIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5MaXN0ZW5lcnM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmZpbHRlcnM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPkZpbHRlcnMgYXJlIG5ldyBpbiB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFNlcnZsZXQNCi0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4uIFRoZXkgZW5hYmxlIHlvdSB0byBpbnRlcmNlcHQgdG8gaW50ZXJjZXB0IGENCi1yZXF1ZXN0IGJlZm9yZSBpdCByZWFjaGVzIGEgcmVzb3VyY2UuIEluIG90aGVyIHdvcmRzLCBhIGZpbHRlciBnaXZlcyB5b3UNCi1hY2Nlc3MgdG8gdGhlIEh0dHBTZXJ2bGV0UmVxdWVzdCBhbmQgdGhlIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugb2JqZWN0cw0KLWJlZm9yZSB0aGV5IGFyZSBwYXNzZWQgb24gdG8gYSBzZXJ2bGV0LjwvcD4NCi08cD5GaWx0ZXJzIGNhbiBiZSB2ZXJ5IHVzZWZ1bC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gd3JpdGUgYSBmaWx0ZXINCi10aGF0IHJlY29yZHMgYWxsIGluY29taW5nIHJlcXVlc3RzIGFuZCBsb2dzIHRoZSBJUCBhZGRyZXNzZXMgb2YgdGhlDQotY29tcHV0ZXJzIGZyb20gd2hpY2ggdGhlIHJlcXVlc3RzIG9yaWdpbmF0ZS4gWW91IGFsc28gY2FuIHVzZSBhIGZpbHRlcg0KLWFzIGFuIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gZGV2aWNlLiBPdGhlciB1c2VzIGluY2x1ZGUgdXNlcg0KLWF1dGhlbnRpY2F0aW9uLCBkYXRhIGNvbXByZXNzaW9uLCB1c2VyIGlucHV0IHZhbGlkYXRpb24sIGFuZCBzbyBvbi48L3A+DQotPHA+WW91IGFsc28gY2FuIHB1dCBhIHNldCBvZiBmaWx0ZXJzIGluIGEgY2hhaW4uIFRoZSBmaXJzdCBmaWx0ZXIgaW4NCi10aGUgY2hhaW4gd2lsbCBiZSBjYWxsZWQgZmlyc3QgYW5kIHRoZW4gcGFzcyBjb250cm9sIHRvIHRoZSBzZWNvbmQNCi1maWx0ZXIsIGFuZCBzbyBvbi4gRmlsdGVyIGNoYWluaW5nIGVuc3VyZXMgdGhhdCB5b3UgY2FuIHdyaXRlIGEgZmlsdGVyDQotdGhhdCBkb2VzIGEgc3BlY2lmaWMgdGFzayBidXQgYWRkcyBzb21lIGZ1bmN0aW9uYWxpdHkgaW4gYW5vdGhlciBmaWx0ZXIuPC9wPg0KLTxwPldoZW4gd3JpdGluZyBhIGZpbHRlciwgeW91IGJhc2ljYWxseSBkZWFsIHdpdGggdGhlDQotZm9sbG93aW5nIHRocmVlIGludGVyZmFjZXMgaW4gdGhlIGphdmF4LnNlcnZsZXQgcGFja2FnZToNCi08dWw+DQotCTxsaT48Yj5qYXZheC5zZXJ2bGV0LkZpbHRlcjo8L2I+IHJlcHJlc2VudHMgdGhlDQotCWxpZmUtY3ljbGUgb2YgdGhlIGZpbHRlci48L2xpPg0KLQk8bGk+PGI+amF2YXguc2VydmxldC5GaWx0ZXJDb25maWc6PC9iPiByZXByZXNlbnRzIHRoZQ0KLQljb25maWd1cmF0aW9uIG9mIHRoZSBmaWx0ZXIuPC9saT4NCi0JPGxpPjxiPmphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW46PC9iPiBvYmplY3QgcHJvdmlkZWQgYnkNCi0JdGhlIHNlcnZsZXQgY29udGFpbmVyIHRvIHRoZSBkZXZlbG9wZXIgZ2l2aW5nIGEgdmlldyBpbnRvIHRoZQ0KLQlpbnZvY2F0aW9uIGNoYWluIG9mIGEgZmlsdGVyZWQgcmVxdWVzdCBmb3IgYSByZXNvdXJjZS48L2xpPg0KLTwvdWw+PC9wPg0KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGZpbHRlcnMsIHJlZmVyIHRvIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIDx0bQ0KLXRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQNCi0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gYXQgPGNvZGVwaD5qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC9kb3dubG9hZC5odG1sPC9jb2RlcGg+LjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2ZpbHRibi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZmlsdGJuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTUyMjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZmlsdGJuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJMaXN0ZW5lcnMiIC8+Ci08bWV0YSBjb250ZW50PSJmaWx0ZXJzLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImZpbHRlcnMsIG92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3c2VydmJuLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd2xpc3Ribi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2N3dG92ZXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3c3J2d2l6Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2xzdHdpei5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdmbHR3aXouaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd2ZpbHRibiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkxpc3RlbmVyczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3dmaWx0Ym4iPjxhIG5hbWU9ImN3ZmlsdGJuIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5MaXN0ZW5lcnM8L2gxPgotCi0KLTxkaXY+Ci08cD5GaWx0ZXJzIGFyZSBuZXcgaW4gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YSBTZXJ2bGV0Ci0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4uIFRoZXkgZW5hYmxlIHlvdSB0byBpbnRlcmNlcHQgdG8gaW50ZXJjZXB0IGEKLXJlcXVlc3QgYmVmb3JlIGl0IHJlYWNoZXMgYSByZXNvdXJjZS4gSW4gb3RoZXIgd29yZHMsIGEgZmlsdGVyIGdpdmVzIHlvdQotYWNjZXNzIHRvIHRoZSBIdHRwU2VydmxldFJlcXVlc3QgYW5kIHRoZSBIdHRwU2VydmxldFJlc3BvbnNlIG9iamVjdHMKLWJlZm9yZSB0aGV5IGFyZSBwYXNzZWQgb24gdG8gYSBzZXJ2bGV0LjwvcD4KLQotPHA+RmlsdGVycyBjYW4gYmUgdmVyeSB1c2VmdWwuIEZvciBleGFtcGxlLCB5b3UgY2FuIHdyaXRlIGEgZmlsdGVyCi10aGF0IHJlY29yZHMgYWxsIGluY29taW5nIHJlcXVlc3RzIGFuZCBsb2dzIHRoZSBJUCBhZGRyZXNzZXMgb2YgdGhlCi1jb21wdXRlcnMgZnJvbSB3aGljaCB0aGUgcmVxdWVzdHMgb3JpZ2luYXRlLiBZb3UgYWxzbyBjYW4gdXNlIGEgZmlsdGVyCi1hcyBhbiBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIGRldmljZS4gT3RoZXIgdXNlcyBpbmNsdWRlIHVzZXIKLWF1dGhlbnRpY2F0aW9uLCBkYXRhIGNvbXByZXNzaW9uLCB1c2VyIGlucHV0IHZhbGlkYXRpb24sIGFuZCBzbyBvbi48L3A+Ci0KLTxwPllvdSBhbHNvIGNhbiBwdXQgYSBzZXQgb2YgZmlsdGVycyBpbiBhIGNoYWluLiBUaGUgZmlyc3QgZmlsdGVyIGluCi10aGUgY2hhaW4gd2lsbCBiZSBjYWxsZWQgZmlyc3QgYW5kIHRoZW4gcGFzcyBjb250cm9sIHRvIHRoZSBzZWNvbmQKLWZpbHRlciwgYW5kIHNvIG9uLiBGaWx0ZXIgY2hhaW5pbmcgZW5zdXJlcyB0aGF0IHlvdSBjYW4gd3JpdGUgYSBmaWx0ZXIKLXRoYXQgZG9lcyBhIHNwZWNpZmljIHRhc2sgYnV0IGFkZHMgc29tZSBmdW5jdGlvbmFsaXR5IGluIGFub3RoZXIgZmlsdGVyLjwvcD4KLQotPGRpdiBjbGFzcz0icCI+V2hlbiB3cml0aW5nIGEgZmlsdGVyLCB5b3UgYmFzaWNhbGx5IGRlYWwgd2l0aCB0aGUKLWZvbGxvd2luZyB0aHJlZSBpbnRlcmZhY2VzIGluIHRoZSBqYXZheC5zZXJ2bGV0IHBhY2thZ2U6Ci08dWw+Ci0JPGxpPjxzdHJvbmc+amF2YXguc2VydmxldC5GaWx0ZXI6PC9zdHJvbmc+IHJlcHJlc2VudHMgdGhlCi0JbGlmZS1jeWNsZSBvZiB0aGUgZmlsdGVyLjwvbGk+Ci0KLQk8bGk+PHN0cm9uZz5qYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzo8L3N0cm9uZz4gcmVwcmVzZW50cyB0aGUKLQljb25maWd1cmF0aW9uIG9mIHRoZSBmaWx0ZXIuPC9saT4KLQotCTxsaT48c3Ryb25nPmphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW46PC9zdHJvbmc+IG9iamVjdCBwcm92aWRlZCBieQotCXRoZSBzZXJ2bGV0IGNvbnRhaW5lciB0byB0aGUgZGV2ZWxvcGVyIGdpdmluZyBhIHZpZXcgaW50byB0aGUKLQlpbnZvY2F0aW9uIGNoYWluIG9mIGEgZmlsdGVyZWQgcmVxdWVzdCBmb3IgYSByZXNvdXJjZS48L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGZpbHRlcnMsIHJlZmVyIHRvIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEphdmHihKIgU2VydmxldAotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IGF0IDxzYW1wIGNsYXNzPSJjb2RlcGgiPmphdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0L2Rvd25sb2FkLmh0bWw8L3NhbXA+LjwvcD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dzZXJ2Ym4uaHRtbCIgdGl0bGU9IiI+U2VydmxldHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd2xpc3Ribi5odG1sIiB0aXRsZT0iIj5MaXN0ZW5lcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jY3d0b3Zlci5odG1sIiB0aXRsZT0iIj5XZWIgYXBwbGljYXRpb24gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3c3J2d2l6Lmh0bWwiPkNyZWF0aW5nIFNlcnZsZXRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdsc3R3aXouaHRtbCI+Q3JlYXRpbmcgTGlzdGVuZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdmbHR3aXouaHRtbCI+Q3JlYXRpbmcgRmlsdGVyczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dsaXN0Ym4uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2xpc3Ribi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2E1MTMyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2xpc3Ribi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjd2xpc3RibiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+TGlzdGVuZXJzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5saXN0ZW5lcnM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPkxpc3RlbmVycyBhcmUgbmV3IGZlYXR1cmUgaW4gdGhlIDxjaXRlPlN1bg0KLU1pY3Jvc3lzdGVtcyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPi4gQSBsaXN0ZW5lciBjYW4gYmUgdXNlZCB0byBtb25pdG9yIGFuZA0KLXJlYWN0IHRvIGV2ZW50cyBpbiBhIHNlcnZsZXQncyBsaWZlLWN5Y2xlIGJ5IGRlZmluaW5nIG1ldGhvZHMgdGhhdCBnZXQNCi1pbnZva2VkIHdoZW4gbGlmZS1jeWNsZSBldmVudHMgb2NjdXIuIFN1cHBvcnQgZm9yIGFwcGxpY2F0aW9uIGxldmVsDQotZXZlbnRzIGlzIGRlZmluZWQgaW4gdGhlIEphdmEgU2VydmxldCBTcGVjaWZpY2F0aW9uIDIuMy48L3A+DQotPHA+QXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzIGFyZSBjbGFzc2VzIHRoYXQNCi1pbXBsZW1lbnQgb25lIG9yIG1vcmUgb2YgdGhlIHNlcnZsZXQgZXZlbnQgbGlzdGVuZXIgaW50ZXJmYWNlcy4gU2VydmxldA0KLWV2ZW50IGxpc3RlbmVycyBzdXBwb3J0IG5vdGlmaWNhdGlvbiBmb3Igc3RhdGUgY2hhbmdlcyBpbiB0aGUNCi08Yj5TZXJ2bGV0Q29udGV4dDwvYj4gYW5kIDxiPkh0dHBTZXNzaW9uPC9iPiBvYmplY3RzLCBzcGVjaWZpY2FsbHk6DQotPHVsPg0KLQk8bGk+PGI+U2VydmxldCBjb250ZXh0IGxpc3RlbmVyczwvYj4gYXJlIHVzZWQgdG8gbWFuYWdlIHJlc291cmNlcyBvciBzdGF0ZSBoZWxkIGF0IGEgVk0NCi0JbGV2ZWwgZm9yIHRoZSBhcHBsaWNhdGlvbi48L2xpPg0KLQk8bGk+PGI+SFRUUCBzZXNzaW9uCWxpc3RlbmVyczwvYj4gYXJlIHVzZWQgdG8gbWFuYWdlIHN0YXRlIG9yIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYQ0KLQlzZXJpZXMgb2YgcmVxdWVzdHMgbWFkZSBpbiBhIFdlYiBhcHBsaWNhdGlvbiBmcm9tIHRoZSBzYW1lIGNsaWVudCBvcg0KLQl1c2VyLjwvbGk+DQotPC91bD48L3A+DQotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbGlzdGVuZXJzLCByZWZlciB0byB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyA8dG0NCi10bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBTZXJ2bGV0DQotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IGF0IDxjb2RlcGg+amF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQvZG93bmxvYWQuaHRtbDwvY29kZXBoPi48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dsaXN0Ym4uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2xpc3Ribi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjExMDlkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2xpc3Ribi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTGlzdGVuZXJzIiAvPgotPG1ldGEgY29udGVudD0ibGlzdGVuZXJzLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9Imxpc3RlbmVycywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dzZXJ2Ym4uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3ZmlsdGJuLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jY3d0b3Zlci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdzcnZ3aXouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3bHN0d2l6Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2ZsdHdpei5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN3bGlzdGJuIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+TGlzdGVuZXJzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd2xpc3RibiI+PGEgbmFtZT0iY3dsaXN0Ym4iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkxpc3RlbmVyczwvaDE+Ci0KLQotPGRpdj4KLTxwPkxpc3RlbmVycyBhcmUgbmV3IGZlYXR1cmUgaW4gdGhlIDxjaXRlPlN1bgotTWljcm9zeXN0ZW1zIEphdmHihKIgU2VydmxldCAyLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4uIEEgbGlzdGVuZXIgY2FuIGJlIHVzZWQgdG8gbW9uaXRvciBhbmQKLXJlYWN0IHRvIGV2ZW50cyBpbiBhIHNlcnZsZXQncyBsaWZlLWN5Y2xlIGJ5IGRlZmluaW5nIG1ldGhvZHMgdGhhdCBnZXQKLWludm9rZWQgd2hlbiBsaWZlLWN5Y2xlIGV2ZW50cyBvY2N1ci4gU3VwcG9ydCBmb3IgYXBwbGljYXRpb24gbGV2ZWwKLWV2ZW50cyBpcyBkZWZpbmVkIGluIHRoZSBKYXZhIFNlcnZsZXQgU3BlY2lmaWNhdGlvbiAyLjMuPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5BcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMgYXJlIGNsYXNzZXMgdGhhdAotaW1wbGVtZW50IG9uZSBvciBtb3JlIG9mIHRoZSBzZXJ2bGV0IGV2ZW50IGxpc3RlbmVyIGludGVyZmFjZXMuIFNlcnZsZXQKLWV2ZW50IGxpc3RlbmVycyBzdXBwb3J0IG5vdGlmaWNhdGlvbiBmb3Igc3RhdGUgY2hhbmdlcyBpbiB0aGUKLTxzdHJvbmc+U2VydmxldENvbnRleHQ8L3N0cm9uZz4gYW5kIDxzdHJvbmc+SHR0cFNlc3Npb248L3N0cm9uZz4gb2JqZWN0cywgc3BlY2lmaWNhbGx5OgotPHVsPgotCTxsaT48c3Ryb25nPlNlcnZsZXQgY29udGV4dCBsaXN0ZW5lcnM8L3N0cm9uZz4gYXJlIHVzZWQgdG8gbWFuYWdlIHJlc291cmNlcyBvciBzdGF0ZSBoZWxkIGF0IGEgVk0KLQlsZXZlbCBmb3IgdGhlIGFwcGxpY2F0aW9uLjwvbGk+Ci0KLQk8bGk+PHN0cm9uZz5IVFRQIHNlc3Npb24JbGlzdGVuZXJzPC9zdHJvbmc+IGFyZSB1c2VkIHRvIG1hbmFnZSBzdGF0ZSBvciByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEKLQlzZXJpZXMgb2YgcmVxdWVzdHMgbWFkZSBpbiBhIFdlYiBhcHBsaWNhdGlvbiBmcm9tIHRoZSBzYW1lIGNsaWVudCBvcgotCXVzZXIuPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBsaXN0ZW5lcnMsIHJlZmVyIHRvIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEphdmEgU2VydmxldAotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IGF0IDxzYW1wIGNsYXNzPSJjb2RlcGgiPmphdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0L2Rvd25sb2FkLmh0bWw8L3NhbXA+LjwvcD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dzZXJ2Ym4uaHRtbCIgdGl0bGU9IiI+U2VydmxldHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd2ZpbHRibi5odG1sIiB0aXRsZT0iIj5MaXN0ZW5lcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jY3d0b3Zlci5odG1sIiB0aXRsZT0iIj5XZWIgYXBwbGljYXRpb24gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3c3J2d2l6Lmh0bWwiPkNyZWF0aW5nIFNlcnZsZXRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdsc3R3aXouaHRtbCI+Q3JlYXRpbmcgTGlzdGVuZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdmbHR3aXouaHRtbCI+Q3JlYXRpbmcgRmlsdGVyczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dzZXJ2Ym4uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3NlcnZibi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWI1ODEzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3NlcnZibi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjd3NlcnZibiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2VydmxldHM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNlcnZsZXRzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+V2ViDQotc2VydmVyczxpbmRleHRlcm0+Z2VuZXJhdGluZyBkeW5hbWljIGNvbnRlbnQ8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+U2VydmxldHMgYXJlIHNlcnZlci1zaWRlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHByb2dyYW1zIHRoYXQgdXNlIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIDx0bQ0KLXRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQNCi1BUEk8L2NpdGU+IGFuZCBpdHMgYXNzb2NpYXRlZCBjbGFzc2VzIGFuZCBtZXRob2RzLCBhcyBkZWZpbmVkIGluIHRoZSA8Y2l0ZT5TdW4NCi1NaWNyb3N5c3RlbXMgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iDQotdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldCAyLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4uIFRoZXNlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHByb2dyYW1zDQotZXh0ZW5kIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGEgV2ViIHNlcnZlciBieSBnZW5lcmF0aW5nIGR5bmFtaWMgY29udGVudCBhbmQNCi1yZXNwb25kaW5nIHRvIFdlYiBjbGllbnQgcmVxdWVzdHMuIFdoZW4gYSBicm93c2VyIHNlbmRzIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyLA0KLXRoZSBzZXJ2ZXIgY2FuIHNlbmQgdGhlIHJlcXVlc3QgaW5mb3JtYXRpb24gdG8gYSBzZXJ2bGV0LCBzbyB0aGF0IHRoZSBzZXJ2bGV0DQotY2FuIGNvbnN0cnVjdCB0aGUgcmVzcG9uc2UgdGhhdCBpcyBzZW50IGJhY2sgdG8gdGhlIGJyb3dzZXIuPC9wPg0KLTxwPkp1c3QgYXMgYXBwbGV0cyBydW4gb24gYSBXZWIgYnJvd3NlciBhbmQgZXh0ZW5kIHRoZSBicm93c2VyJ3MgY2FwYWJpbGl0aWVzLA0KLXNlcnZsZXRzIHJ1biBvbiBhIEphdmEtZW5hYmxlZCBXZWIgc2VydmVyIGFuZCBleHRlbmQgdGhlIHNlcnZlcidzIGNhcGFiaWxpdGllcy4NCi1CZWNhdXNlIG9mIHRoZWlyIGZsZXhpYmlsaXR5IGFuZCBzY2FsYWJpbGl0eSwgc2VydmxldHMgYXJlIGNvbW1vbmx5IHVzZWQgdG8NCi1lbmFibGUgYnVzaW5lc3NlcyB0byBjb25uZWN0IGRhdGFiYXNlcyB0byB0aGUgV2ViLjwvcD4NCi08cD5BbHRob3VnaCBhIHNlcnZsZXQgY2FuIGJlIGEgY29tcGxldGVseSBzZWxmLWNvbnRhaW5lZCBwcm9ncmFtLCB5b3UgY2FuDQotc3BsaXQgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgaW50byB0d28gcG9ydGlvbnM6ICA8dWw+DQotPGxpPlRoZSBidXNpbmVzcyBsb2dpYyAoY29udGVudCBnZW5lcmF0aW9uKSwgd2hpY2ggZ292ZXJucyB0aGUgcmVsYXRpb25zaGlwDQotYmV0d2VlbiBpbnB1dCwgcHJvY2Vzc2luZywgYW5kIG91dHB1dDwvbGk+DQotPGxpPlRoZSBwcmVzZW50YXRpb24gbG9naWMgKGNvbnRlbnQgcHJlc2VudGF0aW9uLCBvciBncmFwaGljIGRlc2lnbiBydWxlcyksDQotd2hpY2ggZGV0ZXJtaW5lcyBob3cgaW5mb3JtYXRpb24gaXMgcHJlc2VudGVkIHRvIHRoZSB1c2VyPC9saT4NCi08L3VsPlVzaW5nIHRoaXMgcGFyYWRpZ20sIHlvdSBtYXkgY2hvb3NlIHRvIGhhdmUgYnVzaW5lc3MgbG9naWMgaGFuZGxlZCBieSA8dG0NCi10bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBiZWFucywNCi10aGUgcHJlc2VudGF0aW9uIGxvZ2ljIGhhbmRsZWQgYnkgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBvciBIVE1MIGZpbGVzLCBhbmQNCi10aGUgSFRUUCBwcm90b2NvbCBoYW5kbGVkIGJ5IGEgc2VydmxldC48L3A+DQotPG5vdGU+SlNQIGZpbGVzIGNhbiBiZSB1c2VkIHRvIG1hbmFnZSBib3RoIHRoZSBwcmVzZW50YXRpb24gYW5kIGJ1c2luZXNzIGxvZ2ljDQotZm9yIGEgV2ViIGFwcGxpY2F0aW9uLiBKU1AgZmlsZXMgdXNlIHN0cnVjdHVyZWQgbWFya3VwIGZvciBwcmVzZW50YXRpb24sIGFuZA0KLXN1cHBseSBzZXJ2bGV0IG1vZGVsIGJlaGF2aW9yIGF0IHJ1biB0aW1lLjwvbm90ZT4NCi08cD5Zb3UgY2FuIGRldmVsb3AsIGRlYnVnLCBhbmQgZGVwbG95IHNlcnZsZXRzLCBzZXQgYnJlYWtwb2ludHMgd2l0aGluIHNlcnZsZXQNCi1vYmplY3RzLCBhbmQgc3RlcCB0aHJvdWdoIGNvZGUgdG8gbWFrZSBjaGFuZ2VzIHRoYXQgYXJlIGR5bmFtaWNhbGx5IGZvbGRlZA0KLWludG8gdGhlIHJ1bm5pbmcgc2VydmxldCBvbiBhIHJ1bm5pbmcgc2VydmVyLCB3aXRob3V0IGhhdmluZyB0byByZXN0YXJ0IGVhY2gNCi10aW1lLjwvcD4NCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBzZXJ2bGV0cywgcmVmZXIgdG8gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldA0KLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiBhdCA8Y29kZXBoPmphdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0L2Rvd25sb2FkLmh0bWw8L2NvZGVwaD4uPC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3c2VydmJuLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dzZXJ2Ym4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3MWU3OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dzZXJ2Ym4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNlcnZsZXRzIiAvPgotPG1ldGEgY29udGVudD0ic2VydmxldHMsIG92ZXJ2aWV3LCBXZWIgc2VydmVycywgZ2VuZXJhdGluZyBkeW5hbWljIGNvbnRlbnQiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzZXJ2bGV0cywgb3ZlcnZpZXcsIFdlYiBzZXJ2ZXJzLCBnZW5lcmF0aW5nIGR5bmFtaWMgY29udGVudCIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd2xpc3Ribi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dmaWx0Ym4uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Njd3RvdmVyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d3Nydndpei5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdsc3R3aXouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Zmx0d2l6Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3dzZXJ2Ym4iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZXJ2bGV0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3dzZXJ2Ym4iPjxhIG5hbWU9ImN3c2VydmJuIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZXJ2bGV0czwvaDE+Ci0KLQotPGRpdj4KLTxwPlNlcnZsZXRzIGFyZSBzZXJ2ZXItc2lkZSBKYXZh4oSiIHByb2dyYW1zIHRoYXQgdXNlIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEphdmEgU2VydmxldAotQVBJPC9jaXRlPiBhbmQgaXRzIGFzc29jaWF0ZWQgY2xhc3NlcyBhbmQgbWV0aG9kcywgYXMgZGVmaW5lZCBpbiB0aGUgPGNpdGU+U3VuCi1NaWNyb3N5c3RlbXMgSmF2YSBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPi4gVGhlc2UgSmF2YSBwcm9ncmFtcwotZXh0ZW5kIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGEgV2ViIHNlcnZlciBieSBnZW5lcmF0aW5nIGR5bmFtaWMgY29udGVudCBhbmQKLXJlc3BvbmRpbmcgdG8gV2ViIGNsaWVudCByZXF1ZXN0cy4gV2hlbiBhIGJyb3dzZXIgc2VuZHMgYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIsCi10aGUgc2VydmVyIGNhbiBzZW5kIHRoZSByZXF1ZXN0IGluZm9ybWF0aW9uIHRvIGEgc2VydmxldCwgc28gdGhhdCB0aGUgc2VydmxldAotY2FuIGNvbnN0cnVjdCB0aGUgcmVzcG9uc2UgdGhhdCBpcyBzZW50IGJhY2sgdG8gdGhlIGJyb3dzZXIuPC9wPgotCi08cD5KdXN0IGFzIGFwcGxldHMgcnVuIG9uIGEgV2ViIGJyb3dzZXIgYW5kIGV4dGVuZCB0aGUgYnJvd3NlcidzIGNhcGFiaWxpdGllcywKLXNlcnZsZXRzIHJ1biBvbiBhIEphdmEtZW5hYmxlZCBXZWIgc2VydmVyIGFuZCBleHRlbmQgdGhlIHNlcnZlcidzIGNhcGFiaWxpdGllcy4KLUJlY2F1c2Ugb2YgdGhlaXIgZmxleGliaWxpdHkgYW5kIHNjYWxhYmlsaXR5LCBzZXJ2bGV0cyBhcmUgY29tbW9ubHkgdXNlZCB0bwotZW5hYmxlIGJ1c2luZXNzZXMgdG8gY29ubmVjdCBkYXRhYmFzZXMgdG8gdGhlIFdlYi48L3A+Ci0KLTxkaXYgY2xhc3M9InAiPkFsdGhvdWdoIGEgc2VydmxldCBjYW4gYmUgYSBjb21wbGV0ZWx5IHNlbGYtY29udGFpbmVkIHByb2dyYW0sIHlvdSBjYW4KLXNwbGl0IGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IGludG8gdHdvIHBvcnRpb25zOiAgPHVsPgotPGxpPlRoZSBidXNpbmVzcyBsb2dpYyAoY29udGVudCBnZW5lcmF0aW9uKSwgd2hpY2ggZ292ZXJucyB0aGUgcmVsYXRpb25zaGlwCi1iZXR3ZWVuIGlucHV0LCBwcm9jZXNzaW5nLCBhbmQgb3V0cHV0PC9saT4KLQotPGxpPlRoZSBwcmVzZW50YXRpb24gbG9naWMgKGNvbnRlbnQgcHJlc2VudGF0aW9uLCBvciBncmFwaGljIGRlc2lnbiBydWxlcyksCi13aGljaCBkZXRlcm1pbmVzIGhvdyBpbmZvcm1hdGlvbiBpcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXI8L2xpPgotCi08L3VsPgotVXNpbmcgdGhpcyBwYXJhZGlnbSwgeW91IG1heSBjaG9vc2UgdG8gaGF2ZSBidXNpbmVzcyBsb2dpYyBoYW5kbGVkIGJ5IEphdmEgYmVhbnMsCi10aGUgcHJlc2VudGF0aW9uIGxvZ2ljIGhhbmRsZWQgYnkgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBvciBIVE1MIGZpbGVzLCBhbmQKLXRoZSBIVFRQIHByb3RvY29sIGhhbmRsZWQgYnkgYSBzZXJ2bGV0LjwvZGl2PgotCi08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSlNQIGZpbGVzIGNhbiBiZSB1c2VkIHRvIG1hbmFnZSBib3RoIHRoZSBwcmVzZW50YXRpb24gYW5kIGJ1c2luZXNzIGxvZ2ljCi1mb3IgYSBXZWIgYXBwbGljYXRpb24uIEpTUCBmaWxlcyB1c2Ugc3RydWN0dXJlZCBtYXJrdXAgZm9yIHByZXNlbnRhdGlvbiwgYW5kCi1zdXBwbHkgc2VydmxldCBtb2RlbCBiZWhhdmlvciBhdCBydW4gdGltZS48L2Rpdj4KLQotPHA+WW91IGNhbiBkZXZlbG9wLCBkZWJ1ZywgYW5kIGRlcGxveSBzZXJ2bGV0cywgc2V0IGJyZWFrcG9pbnRzIHdpdGhpbiBzZXJ2bGV0Ci1vYmplY3RzLCBhbmQgc3RlcCB0aHJvdWdoIGNvZGUgdG8gbWFrZSBjaGFuZ2VzIHRoYXQgYXJlIGR5bmFtaWNhbGx5IGZvbGRlZAotaW50byB0aGUgcnVubmluZyBzZXJ2bGV0IG9uIGEgcnVubmluZyBzZXJ2ZXIsIHdpdGhvdXQgaGF2aW5nIHRvIHJlc3RhcnQgZWFjaAotdGltZS48L3A+Ci0KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHNlcnZsZXRzLCByZWZlciB0byB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFNlcnZsZXQKLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiBhdCA8c2FtcCBjbGFzcz0iY29kZXBoIj5qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC9kb3dubG9hZC5odG1sPC9zYW1wPi48L3A+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3bGlzdGJuLmh0bWwiIHRpdGxlPSIiPkxpc3RlbmVyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3ZmlsdGJuLmh0bWwiIHRpdGxlPSIiPkxpc3RlbmVyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2Njd3RvdmVyLmh0bWwiIHRpdGxlPSIiPldlYiBhcHBsaWNhdGlvbiBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdzcnZ3aXouaHRtbCI+Q3JlYXRpbmcgU2VydmxldHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2xzdHdpei5odG1sIj5DcmVhdGluZyBMaXN0ZW5lcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2ZsdHdpei5odG1sIj5DcmVhdGluZyBGaWx0ZXJzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3RmZWF0dXJlcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3dGZlYXR1cmVzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNmU0MTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3dGZlYXR1cmVzLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPCEtLSBBcmJvclRleHQsIEluYy4sIDE5ODgtMjAwMiwgdi40MDAyIC0tPg0KLTxjb25jZXB0IGlkPSJjd3RmZWF0dXJlcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V2ViIHRvb2xzIGZlYXR1cmVzPC90aXRsZT4NCi08c2hvcnRkZXNjPiBUaGUgaW50ZWdyYXRlZCBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgbWFrZXMgaXQgZWFzeSB0byBjb29wZXJhdGl2ZWx5DQotY3JlYXRlLCBhc3NlbWJsZSwgcHVibGlzaCwgZGVwbG95IGFuZCBtYWludGFpbiBkeW5hbWljLCBpbnRlcmFjdGl2ZSBXZWIgYXBwbGljYXRpb25zLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPldlYiB0b29sczxpbmRleHRlcm0+ZmVhdHVyZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VGhlIFdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGhpZ2gtbGV2ZWwgY2FwYWJpbGl0aWVzOg0KLSA8dWw+DQotPGxpPkR5bmFtaWMgV2ViIHByb2plY3QgY3JlYXRpb24sIHVzaW5nIHRoZSBKYXZhIEVFLWRlZmluZWQgaGllcmFyY2h5LCBvcg0KLWEgc3RhdGljIHZlcnNpb24gdGhhdCByZWR1Y2VzIHByb2plY3Qgb3ZlcmhlYWQgd2hlbiBkeW5hbWljIGVsZW1lbnRzIGFyZSBub3QNCi1yZXF1aXJlZC4gIFN0YXRpYyBXZWIgcHJvamVjdHMgY2FuIGxhdGVyIGJlIGNvbnZlcnRlZCB0byBkeW5hbWljIFdlYiBwcm9qZWN0cy48cD48L3A+PC9saT4NCi08bGk+Q3JlYXRpb24gYW5kIGVkaXRpbmcgb2YgYSBXZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yICg8ZmlsZXBhdGg+d2ViLnhtbDwvZmlsZXBhdGg+KQ0KLSBmaWxlPHA+PC9wPjwvbGk+DQotPGxpPkpTUCBhbmQgSFRNTCBmaWxlIGNyZWF0aW9uLCB2YWxpZGF0aW9uLCBlZGl0aW5nLCBhbmQgZGVidWdnaW5nPHA+PC9wPjwvbGk+DQotPGxpPkFuIGV4dGVuc2libGUgdmlldywgY2FsbGVkIHRoZSBTbmlwcGV0cyB2aWV3LCB3aGljaCBhbGxvd3MgdXNlcnMgdG8gY2F0YWxvZw0KLSBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MLCA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiwNCi0gYW5kIEpTUCBtYXJrdXAsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSB0YWdzLCB0aGF0IGNhbiBiZSBlbWJlZGRlZCBpbg0KLSBleGlzdGluZyBmaWxlczxwPjwvcD48L2xpPg0KLTxsaT5EeW5hbWljIHRhZyBoZWxwIChjb250ZW50IGFzc2lzdCkgLCB3aGljaCBkaXNwbGF5cyB0YWcgdXNhZ2UgYW5kIGF0dHJpYnV0ZQ0KLWluZm9ybWF0aW9uIGZvciAgSFRNTCwgSlNQLCBhbmQgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gdGFncyBiYXNlZCBvbiBjdXJzb3IgbG9jYXRpb24NCi0gaW4gdGhlIFNvdXJjZSBwYWdlLiAoWW91IGludm9rZSBDb250ZW50IEFzc2lzdCBieSBwcmVzc2luZyAoQ3RybCtTcGFjZWJhcikNCi0pPHA+PC9wPjwvbGk+DQotPGxpPkNhc2NhZGluZyBzdHlsZSBzaGVldCAoQ1NTKSBlZGl0aW5nIHN1cHBvcnQ8cD48L3A+PC9saT4NCi08bGk+SFRUUC9GVFAgaW1wb3J0PHA+PC9wPjwvbGk+DQotPGxpPkZUUCBleHBvcnQgKHNpbXBsZSByZXNvdXJjZSBjb3B5KSB0byBhIHNlcnZlcjxwPjwvcD48L2xpPg0KLTxsaT5XQVIgZmlsZSBpbXBvcnQsIGV4cG9ydCwgYW5kIHZhbGlkYXRpb248cD48L3A+PC9saT4NCi08bGk+U2VydmxldCBjcmVhdGlvbiwgd2hpY2ggZW1wbG95cyB0aGUgU2VydmxldCBXaXphcmQgdG8gY3JlYXRlIG5ldyBzZXJ2bGV0cy48cD48L3A+PC9saT4NCi08L3VsPjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3RmZWF0dXJlcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3dGZlYXR1cmVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MzJlNWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3dGZlYXR1cmVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXZWIgdG9vbHMgZmVhdHVyZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIGludGVncmF0ZWQgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IG1ha2VzIGl0IGVhc3kgdG8gY29vcGVyYXRpdmVseSBjcmVhdGUsIGFzc2VtYmxlLCBwdWJsaXNoLCBkZXBsb3kgYW5kIG1haW50YWluIGR5bmFtaWMsIGludGVyYWN0aXZlIFdlYiBhcHBsaWNhdGlvbnMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBpbnRlZ3JhdGVkIFdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBtYWtlcyBpdCBlYXN5IHRvIGNvb3BlcmF0aXZlbHkgY3JlYXRlLCBhc3NlbWJsZSwgcHVibGlzaCwgZGVwbG95IGFuZCBtYWludGFpbiBkeW5hbWljLCBpbnRlcmFjdGl2ZSBXZWIgYXBwbGljYXRpb25zLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiB0b29scywgZmVhdHVyZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgdG9vbHMsIGZlYXR1cmVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Njd2VicHJqLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjcmVwcmouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqY3JlanNwLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d3Nydndpei5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdsc3R3aXouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Zmx0d2l6Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3d0ZmVhdHVyZXMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5XZWIgdG9vbHMgZmVhdHVyZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN3dGZlYXR1cmVzIj48YSBuYW1lPSJjd3RmZWF0dXJlcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V2ViIHRvb2xzIGZlYXR1cmVzPC9oMT4KLQotCi0KLTxkaXY+PHA+IFRoZSBpbnRlZ3JhdGVkIFdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBtYWtlcyBpdCBlYXN5IHRvIGNvb3BlcmF0aXZlbHkKLWNyZWF0ZSwgYXNzZW1ibGUsIHB1Ymxpc2gsIGRlcGxveSBhbmQgbWFpbnRhaW4gZHluYW1pYywgaW50ZXJhY3RpdmUgV2ViIGFwcGxpY2F0aW9ucy48L3A+Ci0KLTxkaXYgY2xhc3M9InAiPlRoZSBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBoaWdoLWxldmVsIGNhcGFiaWxpdGllczoKLSA8dWw+Ci08bGk+RHluYW1pYyBXZWIgcHJvamVjdCBjcmVhdGlvbiwgdXNpbmcgdGhlIEphdmEgRUUtZGVmaW5lZCBoaWVyYXJjaHksIG9yCi1hIHN0YXRpYyB2ZXJzaW9uIHRoYXQgcmVkdWNlcyBwcm9qZWN0IG92ZXJoZWFkIHdoZW4gZHluYW1pYyBlbGVtZW50cyBhcmUgbm90Ci1yZXF1aXJlZC4gIFN0YXRpYyBXZWIgcHJvamVjdHMgY2FuIGxhdGVyIGJlIGNvbnZlcnRlZCB0byBkeW5hbWljIFdlYiBwcm9qZWN0cy48cCAvPgotPC9saT4KLQotPGxpPkNyZWF0aW9uIGFuZCBlZGl0aW5nIG9mIGEgV2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciAoPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj53ZWIueG1sPC9zcGFuPikKLSBmaWxlPHAgLz4KLTwvbGk+Ci0KLTxsaT5KU1AgYW5kIEhUTUwgZmlsZSBjcmVhdGlvbiwgdmFsaWRhdGlvbiwgZWRpdGluZywgYW5kIGRlYnVnZ2luZzxwIC8+Ci08L2xpPgotCi08bGk+QW4gZXh0ZW5zaWJsZSB2aWV3LCBjYWxsZWQgdGhlIFNuaXBwZXRzIHZpZXcsIHdoaWNoIGFsbG93cyB1c2VycyB0byBjYXRhbG9nCi0gYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdOKEoiwKLSBhbmQgSlNQIG1hcmt1cCwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIHRhZ3MsIHRoYXQgY2FuIGJlIGVtYmVkZGVkIGluCi0gZXhpc3RpbmcgZmlsZXM8cCAvPgotPC9saT4KLQotPGxpPkR5bmFtaWMgdGFnIGhlbHAgKGNvbnRlbnQgYXNzaXN0KSAsIHdoaWNoIGRpc3BsYXlzIHRhZyB1c2FnZSBhbmQgYXR0cmlidXRlCi1pbmZvcm1hdGlvbiBmb3IgIEhUTUwsIEpTUCwgYW5kIEphdmFTY3JpcHQgdGFncyBiYXNlZCBvbiBjdXJzb3IgbG9jYXRpb24KLSBpbiB0aGUgU291cmNlIHBhZ2UuIChZb3UgaW52b2tlIENvbnRlbnQgQXNzaXN0IGJ5IHByZXNzaW5nIChDdHJsK1NwYWNlYmFyKQotKTxwIC8+Ci08L2xpPgotCi08bGk+Q2FzY2FkaW5nIHN0eWxlIHNoZWV0IChDU1MpIGVkaXRpbmcgc3VwcG9ydDxwIC8+Ci08L2xpPgotCi08bGk+SFRUUC9GVFAgaW1wb3J0PHAgLz4KLTwvbGk+Ci0KLTxsaT5GVFAgZXhwb3J0IChzaW1wbGUgcmVzb3VyY2UgY29weSkgdG8gYSBzZXJ2ZXI8cCAvPgotPC9saT4KLQotPGxpPldBUiBmaWxlIGltcG9ydCwgZXhwb3J0LCBhbmQgdmFsaWRhdGlvbjxwIC8+Ci08L2xpPgotCi08bGk+U2VydmxldCBjcmVhdGlvbiwgd2hpY2ggZW1wbG95cyB0aGUgU2VydmxldCBXaXphcmQgdG8gY3JlYXRlIG5ldyBzZXJ2bGV0cy48cCAvPgotPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jY3dlYnByai5odG1sIiB0aXRsZT0iIj5EeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uaHRtbCIgdGl0bGU9IiI+V2ViIHBhZ2UgZGVzaWduPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NyZXByai5odG1sIj5DcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amNyZWpzcC5odG1sIj5DcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdzcnZ3aXouaHRtbCI+Q3JlYXRpbmcgU2VydmxldHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2xzdHdpei5odG1sIj5DcmVhdGluZyBMaXN0ZW5lcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2ZsdHdpei5odG1sIj5DcmVhdGluZyBGaWx0ZXJzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dhcm92ci5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2Fyb3ZyLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMWFkZjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2Fyb3ZyLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN3d2Fyb3ZyIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+V0FSIGZpbGVzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD4gQSBXZWIgYXBwbGljYXRpb24gaXMgYSBncm91cCBvZiBIVE1MIHBhZ2VzLCBKU1AgcGFnZXMsIHNlcnZsZXRzLCByZXNvdXJjZXMNCi1hbmQgc291cmNlIGZpbGUsIHdoaWNoIGNhbiBiZSBtYW5hZ2VkIGFzIGEgc2luZ2xlIHVuaXQuIEEgV2ViIGFyY2hpdmUgKFdBUikNCi1maWxlIGlzIGEgcGFja2FnZWQgV2ViIGFwcGxpY2F0aW9uLiBXQVIgZmlsZXMgY2FuIGJlIHVzZWQgdG8gaW1wb3J0IGEgV2ViDQotYXBwbGljYXRpb24gaW50byBhIFdlYiBzZXJ2ZXIuPC9wPg0KLTxwPkluIGFkZGl0aW9uIHRvIHByb2plY3QgcmVzb3VyY2VzLCB0aGUgV0FSIGZpbGUgaW5jbHVkZXMgYSBXZWIgZGVwbG95bWVudA0KLWRlc2NyaXB0b3IgZmlsZS4gVGhlIFdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgYW4gWE1MIGZpbGUgdGhhdCBjb250YWlucw0KLWRlcGxveW1lbnQgaW5mb3JtYXRpb24sIE1JTUUgdHlwZXMsIHNlc3Npb24gY29uZmlndXJhdGlvbiBkZXRhaWxzLCBhbmQgb3RoZXINCi1zZXR0aW5ncyBmb3IgYSBXZWIgYXBwbGljYXRpb24uIFRoZSBXZWIgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgKDxmaWxlcGF0aD53ZWIueG1sPC9maWxlcGF0aD4pDQotcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFdBUiBmaWxlIGlzIHNoYXJlZCB3aXRoIHRoZSBkZXZlbG9wZXJzLCBhc3NlbWJsZXJzLA0KLWFuZCBkZXBsb3llcnMgaW4gYSBKYXZhIEVFIGVudmlyb25tZW50LjwvcD4NCi08cD5UaGUgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IHByb3ZpZGVzIGZhY2lsaXRpZXMgZm9yIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nDQotV0FSIGZpbGVzLCB1c2luZyB0aGUgZm9sbG93aW5nIHdpemFyZHM6IDx1bD4NCi08bGk+PHBoPkltcG9ydCBSZXNvdXJjZXMgZnJvbSBhIFdBUiBGaWxlPC9waD4sIHdoaWNoIHJlcXVpcmVzIHRoYXQgeW91IHRvDQotc3BlY2lmeSBhIFdlYiBwcm9qZWN0LiBZb3UgY2FuIHVzZSBleGlzdGluZyBwcm9qZWN0cyBvciBjcmVhdGUgdGhlbSBhcyB5b3UNCi11c2UgdGhlIHdpemFyZC48L2xpPg0KLTxsaT48cGg+RXhwb3J0IFJlc291cmNlcyB0byBhIFdBUiBGaWxlPC9waD4sIHdoaWNoIHJlcXVpcmVzIG9ubHkgYW4gZXhwb3J0DQotbG9jYXRpb24gYW5kIHNvbWUgb3B0aW9uYWwgc2V0dGluZ3M8L2xpPg0KLTwvdWw+PC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2Fyb3ZyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3YXJvdnIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViNWQ2My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3YXJvdnIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IldlYiBhcmNoaXZlIChXQVIpIGZpbGVzIiAvPgotPG1ldGEgY29udGVudD0iV0FSIGZpbGVzLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldBUiBmaWxlcywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dlYnJlc291cmNlcy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdpbXB3YXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Y3Jld2FyLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3d3YXJvdnIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3d3YXJvdnIiPjxhIG5hbWU9ImN3d2Fyb3ZyIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvaDE+Ci0KLQotPGRpdj4KLTxwPiBBIFdlYiBhcHBsaWNhdGlvbiBpcyBhIGdyb3VwIG9mIEhUTUwgcGFnZXMsIEpTUCBwYWdlcywgc2VydmxldHMsIHJlc291cmNlcwotYW5kIHNvdXJjZSBmaWxlLCB3aGljaCBjYW4gYmUgbWFuYWdlZCBhcyBhIHNpbmdsZSB1bml0LiBBIFdlYiBhcmNoaXZlIChXQVIpCi1maWxlIGlzIGEgcGFja2FnZWQgV2ViIGFwcGxpY2F0aW9uLiBXQVIgZmlsZXMgY2FuIGJlIHVzZWQgdG8gaW1wb3J0IGEgV2ViCi1hcHBsaWNhdGlvbiBpbnRvIGEgV2ViIHNlcnZlci48L3A+Ci0KLTxwPkluIGFkZGl0aW9uIHRvIHByb2plY3QgcmVzb3VyY2VzLCB0aGUgV0FSIGZpbGUgaW5jbHVkZXMgYSBXZWIgZGVwbG95bWVudAotZGVzY3JpcHRvciBmaWxlLiBUaGUgV2ViIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBhbiBYTUwgZmlsZSB0aGF0IGNvbnRhaW5zCi1kZXBsb3ltZW50IGluZm9ybWF0aW9uLCBNSU1FIHR5cGVzLCBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gZGV0YWlscywgYW5kIG90aGVyCi1zZXR0aW5ncyBmb3IgYSBXZWIgYXBwbGljYXRpb24uIFRoZSBXZWIgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgKDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+d2ViLnhtbDwvc3Bhbj4pCi1wcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgV0FSIGZpbGUgaXMgc2hhcmVkIHdpdGggdGhlIGRldmVsb3BlcnMsIGFzc2VtYmxlcnMsCi1hbmQgZGVwbG95ZXJzIGluIGEgSmF2YSBFRSBlbnZpcm9ubWVudC48L3A+Ci0KLTxkaXYgY2xhc3M9InAiPlRoZSBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgcHJvdmlkZXMgZmFjaWxpdGllcyBmb3IgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcKLVdBUiBmaWxlcywgdXNpbmcgdGhlIGZvbGxvd2luZyB3aXphcmRzOiA8dWw+Ci08bGk+PHNwYW4+SW1wb3J0IFJlc291cmNlcyBmcm9tIGEgV0FSIEZpbGU8L3NwYW4+LCB3aGljaCByZXF1aXJlcyB0aGF0IHlvdSB0bwotc3BlY2lmeSBhIFdlYiBwcm9qZWN0LiBZb3UgY2FuIHVzZSBleGlzdGluZyBwcm9qZWN0cyBvciBjcmVhdGUgdGhlbSBhcyB5b3UKLXVzZSB0aGUgd2l6YXJkLjwvbGk+Ci0KLTxsaT48c3Bhbj5FeHBvcnQgUmVzb3VyY2VzIHRvIGEgV0FSIEZpbGU8L3NwYW4+LCB3aGljaCByZXF1aXJlcyBvbmx5IGFuIGV4cG9ydAotbG9jYXRpb24gYW5kIHNvbWUgb3B0aW9uYWwgc2V0dGluZ3M8L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3ZWJyZXNvdXJjZXMuaHRtbCIgdGl0bGU9IiI+V2ViIHJlc291cmNlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdpbXB3YXIuaHRtbCI+SW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdjcmV3YXIuaHRtbCI+RXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dlZHR2dy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2VkdHZ3LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNzMzZGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2VkdHZ3LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN3d2VkdHZ3IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Xb3JrYmVuY2ggaW50ZWdyYXRpb24gd2l0aCBXZWIgZWRpdG9yczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJjd3dlZHR2d3wxfFdlYmVkaXRvcnN3b3JrYmVuY2hpbnRlZ3JhdGlvbiIgc3RhdHVzPSJjaGFuZ2VkIj53b3JrYmVuY2g8aW5kZXh0ZXJtPldlYg0KLWVkaXRvcnM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VGhlcmUgYXJlIHNldmVyYWwgZWRpdG9ycyBmb3IgdXNlIGluIHZhcmlvdXMgY29udGV4dHMgZm9yIHZhcmlvdXMgZmlsZQ0KLXR5cGVzLiBUbyBlZGl0IGEgZmlsZSB1c2luZyBpdHMgZGVmYXVsdCBlZGl0b3IsIGRvdWJsZS1jbGljayBvbiB0aGUgZmlsZSBuYW1lDQotaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgb3IgcmlnaHQtY2xpY2sgb24gdGhlIGZpbGUgYW5kIHNlbGVjdCA8dWljb250cm9sPk9wZW48L3VpY29udHJvbD4uDQotVGhlIGVkaXRvciB0aGF0IGlzIGxhc3QgdXNlZCB0byBvcGVuIGEgZmlsZSBiZWNvbWVzIHRoZSBkZWZhdWx0IGZvciB0aGF0IHBhcnRpY3VsYXINCi1maWxlLiBUbyBlZGl0IHRoZSBmaWxlIHdpdGggYSBkaWZmZXJlbnQgZWRpdG9yLCByaWdodC1jbGljayBvbiB0aGUgZmlsZSBhbmQNCi1zZWxlY3QgPHVpY29udHJvbD5PcGVuIFdpdGg8L3VpY29udHJvbD4gdG8gY2hvb3NlIGZyb20gYSBsaXN0IG9mIGF2YWlsYWJsZQ0KLWVkaXRvcnMuPC9wPg0KLTxwPkluIHRoZSB3b3JrYmVuY2gsIHlvdSBjYW4gYXNzb2NpYXRlIGZpbGUtbmFtZSBleHRlbnNpb25zIGZvciBkaWZmZXJlbnQNCi10eXBlcyBvZiByZXNvdXJjZXMgd2l0aCB2YXJpb3VzIGVkaXRvcnMuIEEgcmVzb3VyY2UgZXh0ZW5zaW9uIGNhbiBoYXZlIG1vcmUNCi10aGFuIG9uZSBlZGl0b3IgYXNzb2NpYXRlZCB3aXRoIGl0OyB0aGUgbGFzdCBlZGl0b3IgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyDQotZXh0ZW5zaW9uIHR5cGUgaXMgaW5kaWNhdGVkIGJ5IGEgYmxhY2sgZG90IGJlZm9yZSBpdCBpbiB0aGUgPHVpY29udHJvbD5PcGVuDQotV2l0aDwvdWljb250cm9sPiBwb3AtdXAgbWVudS4gWW91IGNhbiBhc3NvY2lhdGUgZXh0ZW5zaW9ucyB0aGF0IGFyZSBrbm93bg0KLXRvIHRoZSB3b3JrYmVuY2ggd2l0aCBhZGRpdGlvbmFsIGVkaXRvcnMsIGJ5IHVzaW5nIHRoZSA8Yj5GaWxlIEFzc29jaWF0aW9uczwvYj4gcHJlZmVyZW5jZXMNCi1wYWdlLCBhY2Nlc3NlZCBieSBzZWxlY3RpbmcgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+PHVpY29udHJvbD5GaWxlIEFzc29jaWF0aW9uczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvcD4NCi08cD5UaGUgUHJvcGVydGllcyB2aWV3IHByb3ZpZGVzIGdlbmVyYWwgY2FwYWJpbGl0aWVzIHRoYXQgYXJlIGFkdmFudGFnZW91cw0KLXRvIFdlYiBlZGl0b3IgdXNlcnMuIDxkbD48ZGxlbnRyeT4NCi08ZHQ+UHJvcGVydGllcyB2aWV3PC9kdD4NCi08ZGQ+VGhlIFByb3BlcnRpZXMgdmlldyAoPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5TaG93DQotVmlldzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJvcGVydGllczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+KSBjb250YWlucw0KLWEgbGlzdCBvZiBhdHRyaWJ1dGVzIGFuZCBlZGl0YWJsZSBhdHRyaWJ1dGUgdmFsdWVzLiBGb3IgZXhhbXBsZSwgd2hlbiB5b3UNCi1zZWxlY3QgYW4gaW1hZ2UgdGFnIDx1aWNvbnRyb2w+aW1nPC91aWNvbnRyb2w+ICwgdGhlIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzDQotYXBwZWFyIGZvciBlZGl0aW5nLiBJbiBhZGRpdGlvbiwgYW55IG90aGVyIGF0dHJpYnV0ZXMgYWxsb3dlZCBieSB0aGUgc3RhbmRhcmQNCi1zcGVjaWZpZWQgaW4gdGhlIERPQ1RZUEUgZm9yIHRoZSBmaWxlIChzdWNoIGFzIHRoZSBIVE1MIDQuMC4xIERURCkgYXJlIGxpc3RlZC4NCi1XaGVuIHlvdSBjbGljayB0aGUgdmFsdWUgY29sdW1uIG9mIGEgcHJvcGVydHksIHlvdSBjYW4gc2VsZWN0IGZyb20gYW1vbmcgdGhlDQotbGlzdCBvZiBhdmFpbGFibGUgYXR0cmlidXRlIHZhbHVlcy4gPHA+VGhlIHBvcC11cCBtZW51IGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcNCi1lbmFibGVzIHlvdSB0byB1bmRvLCBjdXQsIGNvcHksIHBhc3RlLCBkZWxldGUsIGFuZCBzZWxlY3QgYWxsLiBUaGUgb3B0aW9ucw0KLXRoYXQgYXJlIGF2YWlsYWJsZSBhdCBhIGdpdmVuIHRpbWUgZGVwZW5kcyBvbiB3aGVyZSB0aGUgY3Vyc29yIGlzIGxvY2F0ZWQNCi13aGVuIHlvdSByaWdodC1jbGljayB0byBkaXNwbGF5IHRoZSBwb3AtdXAgbWVudS4gVG8gc2VlIHRoZSBwb3AtdXAgbWVudSB0aGF0DQotY29udGFpbnMgdW5kbywgY3V0LCBhbmQgc28gb24sIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmaWVsZCBtdXN0IGJlIGFjdGl2ZS4gKFRoaXMNCi1pcyBhY2NvbXBsaXNoZWQgYnkgc2VsZWN0aW5nIHRoZSBwcm9wZXJ0eSBhbmQgdGhlbiBzZWxlY3RpbmcgaXRzIHZhbHVlLikgT3RoZXJ3aXNlLA0KLXRoZSBwb3AtdXAgbWVudSB3aWxsIGNvbnRhaW4gZGlmZmVyZW50IG9wdGlvbnMuPC9wPiA8cD5Vc2UgdGhlIDx1aWNvbnRyb2w+UmVzdG9yZQ0KLURlZmF1bHQgVmFsdWU8L3VpY29udHJvbD4gYnV0dG9uIHRvIGNoYW5nZSBhbnkgdmFsdWUgYmFjayB0byB0aGUgZGVmYXVsdCBzZXR0aW5nLjwvcD4gPHA+QWZ0ZXINCi15b3UgYXJlIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gbW9kaWZ5IG90aGVyIHByb3BlcnR5IHZhbHVlcyBmb3Igc3BlY2lmaWMNCi10YWdzLiBUbyBlZGl0IGFub3RoZXIgdGFnIHVzaW5nIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIG1vdmUgdGhlIGN1cnNvciB3aXRoaW4NCi10aGUgZWRpdGluZyBhcmVhIG9mIHRoZSBTb3VyY2UgcGFnZSBvciBEZXNpZ24gcGFnZSB0byB0aGUgdGFnIHlvdSB3YW50IHRvDQotZWRpdC4gVGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgYW5kIHZhbHVlcyBhcmUgZGlzcGxheWVkIGluIHRoZSBQcm9wZXJ0aWVzDQotdmlldy48L3A+PC9kZD4NCi08L2RsZW50cnk+PC9kbD48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3ZWR0dncuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dlZHR2dy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTExZjUxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dlZHR2dy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29ya2JlbmNoIGludGVncmF0aW9uIHdpdGggV2ViIGVkaXRvcnMiIC8+Ci08bWV0YSBjb250ZW50PSJ3b3JrYmVuY2gsIFdlYiBlZGl0b3JzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0id29ya2JlbmNoLCBXZWIgZWRpdG9ycyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3d3ZWR0dnciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Xb3JrYmVuY2ggaW50ZWdyYXRpb24gd2l0aCBXZWIgZWRpdG9yczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3d3ZWR0dnciPjxhIG5hbWU9ImN3d2VkdHZ3Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JrYmVuY2ggaW50ZWdyYXRpb24gd2l0aCBXZWIgZWRpdG9yczwvaDE+Ci0KLQotPGRpdj4KLTxwPlRoZXJlIGFyZSBzZXZlcmFsIGVkaXRvcnMgZm9yIHVzZSBpbiB2YXJpb3VzIGNvbnRleHRzIGZvciB2YXJpb3VzIGZpbGUKLXR5cGVzLiBUbyBlZGl0IGEgZmlsZSB1c2luZyBpdHMgZGVmYXVsdCBlZGl0b3IsIGRvdWJsZS1jbGljayBvbiB0aGUgZmlsZSBuYW1lCi1pbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCBvciByaWdodC1jbGljayBvbiB0aGUgZmlsZSBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW48L3NwYW4+LgotVGhlIGVkaXRvciB0aGF0IGlzIGxhc3QgdXNlZCB0byBvcGVuIGEgZmlsZSBiZWNvbWVzIHRoZSBkZWZhdWx0IGZvciB0aGF0IHBhcnRpY3VsYXIKLWZpbGUuIFRvIGVkaXQgdGhlIGZpbGUgd2l0aCBhIGRpZmZlcmVudCBlZGl0b3IsIHJpZ2h0LWNsaWNrIG9uIHRoZSBmaWxlIGFuZAotc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4gV2l0aDwvc3Bhbj4gdG8gY2hvb3NlIGZyb20gYSBsaXN0IG9mIGF2YWlsYWJsZQotZWRpdG9ycy48L3A+Ci0KLTxwPkluIHRoZSB3b3JrYmVuY2gsIHlvdSBjYW4gYXNzb2NpYXRlIGZpbGUtbmFtZSBleHRlbnNpb25zIGZvciBkaWZmZXJlbnQKLXR5cGVzIG9mIHJlc291cmNlcyB3aXRoIHZhcmlvdXMgZWRpdG9ycy4gQSByZXNvdXJjZSBleHRlbnNpb24gY2FuIGhhdmUgbW9yZQotdGhhbiBvbmUgZWRpdG9yIGFzc29jaWF0ZWQgd2l0aCBpdDsgdGhlIGxhc3QgZWRpdG9yIHVzZWQgZm9yIGEgcGFydGljdWxhcgotZXh0ZW5zaW9uIHR5cGUgaXMgaW5kaWNhdGVkIGJ5IGEgYmxhY2sgZG90IGJlZm9yZSBpdCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3BlbgotV2l0aDwvc3Bhbj4gcG9wLXVwIG1lbnUuIFlvdSBjYW4gYXNzb2NpYXRlIGV4dGVuc2lvbnMgdGhhdCBhcmUga25vd24KLXRvIHRoZSB3b3JrYmVuY2ggd2l0aCBhZGRpdGlvbmFsIGVkaXRvcnMsIGJ5IHVzaW5nIHRoZSA8c3Ryb25nPkZpbGUgQXNzb2NpYXRpb25zPC9zdHJvbmc+IHByZWZlcmVuY2VzCi1wYWdlLCBhY2Nlc3NlZCBieSBzZWxlY3RpbmcgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZSBBc3NvY2lhdGlvbnM8L3NwYW4+PC9zcGFuPi48L3A+Ci0KLTxkaXYgY2xhc3M9InAiPlRoZSBQcm9wZXJ0aWVzIHZpZXcgcHJvdmlkZXMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMgdGhhdCBhcmUgYWR2YW50YWdlb3VzCi10byBXZWIgZWRpdG9yIHVzZXJzLiA8ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+UHJvcGVydGllcyB2aWV3PC9kdD4KLQotPGRkPlRoZSBQcm9wZXJ0aWVzIHZpZXcgKDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNob3cKLVZpZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj48L3NwYW4+KSBjb250YWlucwotYSBsaXN0IG9mIGF0dHJpYnV0ZXMgYW5kIGVkaXRhYmxlIGF0dHJpYnV0ZSB2YWx1ZXMuIEZvciBleGFtcGxlLCB3aGVuIHlvdQotc2VsZWN0IGFuIGltYWdlIHRhZyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5pbWc8L3NwYW4+ICwgdGhlIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzCi1hcHBlYXIgZm9yIGVkaXRpbmcuIEluIGFkZGl0aW9uLCBhbnkgb3RoZXIgYXR0cmlidXRlcyBhbGxvd2VkIGJ5IHRoZSBzdGFuZGFyZAotc3BlY2lmaWVkIGluIHRoZSBET0NUWVBFIGZvciB0aGUgZmlsZSAoc3VjaCBhcyB0aGUgSFRNTCA0LjAuMSBEVEQpIGFyZSBsaXN0ZWQuCi1XaGVuIHlvdSBjbGljayB0aGUgdmFsdWUgY29sdW1uIG9mIGEgcHJvcGVydHksIHlvdSBjYW4gc2VsZWN0IGZyb20gYW1vbmcgdGhlCi1saXN0IG9mIGF2YWlsYWJsZSBhdHRyaWJ1dGUgdmFsdWVzLiA8cD5UaGUgcG9wLXVwIG1lbnUgaW4gdGhlIFByb3BlcnRpZXMgdmlldwotZW5hYmxlcyB5b3UgdG8gdW5kbywgY3V0LCBjb3B5LCBwYXN0ZSwgZGVsZXRlLCBhbmQgc2VsZWN0IGFsbC4gVGhlIG9wdGlvbnMKLXRoYXQgYXJlIGF2YWlsYWJsZSBhdCBhIGdpdmVuIHRpbWUgZGVwZW5kcyBvbiB3aGVyZSB0aGUgY3Vyc29yIGlzIGxvY2F0ZWQKLXdoZW4geW91IHJpZ2h0LWNsaWNrIHRvIGRpc3BsYXkgdGhlIHBvcC11cCBtZW51LiBUbyBzZWUgdGhlIHBvcC11cCBtZW51IHRoYXQKLWNvbnRhaW5zIHVuZG8sIGN1dCwgYW5kIHNvIG9uLCB0aGUgcHJvcGVydHkgdmFsdWUgZmllbGQgbXVzdCBiZSBhY3RpdmUuIChUaGlzCi1pcyBhY2NvbXBsaXNoZWQgYnkgc2VsZWN0aW5nIHRoZSBwcm9wZXJ0eSBhbmQgdGhlbiBzZWxlY3RpbmcgaXRzIHZhbHVlLikgT3RoZXJ3aXNlLAotdGhlIHBvcC11cCBtZW51IHdpbGwgY29udGFpbiBkaWZmZXJlbnQgb3B0aW9ucy48L3A+Ci0gPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZXN0b3JlCi1EZWZhdWx0IFZhbHVlPC9zcGFuPiBidXR0b24gdG8gY2hhbmdlIGFueSB2YWx1ZSBiYWNrIHRvIHRoZSBkZWZhdWx0IHNldHRpbmcuPC9wPgotIDxwPkFmdGVyCi15b3UgYXJlIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gbW9kaWZ5IG90aGVyIHByb3BlcnR5IHZhbHVlcyBmb3Igc3BlY2lmaWMKLXRhZ3MuIFRvIGVkaXQgYW5vdGhlciB0YWcgdXNpbmcgdGhlIFByb3BlcnRpZXMgdmlldywgbW92ZSB0aGUgY3Vyc29yIHdpdGhpbgotdGhlIGVkaXRpbmcgYXJlYSBvZiB0aGUgU291cmNlIHBhZ2Ugb3IgRGVzaWduIHBhZ2UgdG8gdGhlIHRhZyB5b3Ugd2FudCB0bwotZWRpdC4gVGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgYW5kIHZhbHVlcyBhcmUgZGlzcGxheWVkIGluIHRoZSBQcm9wZXJ0aWVzCi12aWV3LjwvcD4KLTwvZGQ+Ci0KLTwvZGw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNoZ3hkdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY2hneGR0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNWMzZjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY2hneGR0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRqY2hneGR0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TcGVjaWZ5aW5nIGFuIGltcGxpY2l0IGRvY3VtZW50IHR5cGUgZm9yIGFuIEhUTUwsIFhIVE1MLCBvciBKU1AgZnJhZ21lbnQ8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkRPQ1RZUEUgZGVjbGFyYXRpb25zPGluZGV4dGVybT5pbXBsaWNpdCBmb3IgZnJhZ21lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5kb2N1bWVudCB0eXBlczxpbmRleHRlcm0+aW1wbGljaXQgZm9yIGZyYWdtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+SFRNTCBmcmFnbWVudHM8aW5kZXh0ZXJtPmltcGxpY2l0IGRvY3VtZW50IHR5cGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5KU1AgZnJhZ21lbnRzPGluZGV4dGVybT5pbXBsaWNpdCBkb2N1bWVudCB0eXBlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WEhUTUwgZnJhZ21lbnRzPGluZGV4dGVybT5pbXBsaWNpdCBkb2N1bWVudCB0eXBlIGZvciBmcmFnbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5BbiA8aT5pbXBsaWNpdDwvaT4gZG9jdW1lbnQgdHlwZSBpcyB1c2VkIGZvciBjb250ZW50IGFzc2lzdCAoQ1RSTCtTcGFjZWJhciksDQotdGhlIFByb3BlcnRpZXMgdmlldywgYW5kIG90aGVyIGVkaXRpbmcgY29udGV4dHMgd2hlbiBubyBET0NUWVBFIGRlY2xhcmF0aW9uDQotaXMgc3BlY2lmaWVkIGluIGFuIEhUTUwsIFhIVE1MLCBvciBKU1AgZmlsZS4gVHlwaWNhbGx5LCB0aGlzIGZlYXR1cmUgaXMgdXNlZA0KLWZvciBhIGZyYWdtZW50IChwYXJ0aWFsIGRvY3VtZW50KSB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiBvdGhlciBwYWdlcyB1c2luZw0KLUpTUCBpbmNsdWRlIG9yIHNlcnZlci1zaWRlIGluY2x1ZGUuPC9wPjxwPlRvIGFzc2lnbiBhbiBpbXBsaWNpdCBkb2N1bWVudCB0eXBlDQotdG8gYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmcmFnbWVudCwgZG8gdGhlIGZvbGxvd2luZzogPC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCBzZWxlY3QgdGhlIEhUTUwsIFhIVE1MLCBvciBKU1ANCi1mcmFnbWVudC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgPHBoPjx1aWNvbnRyb2w+UHJvcGVydGllczwvdWljb250cm9sPjwvcGg+IGZyb20gdGhlIGZpbGUncw0KLXBvcC11cCBtZW51LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPldlYiBDb250ZW50IFNldHRpbmdzPC91aWNvbnRyb2w+IHBhZ2UsIHNlbGVjdA0KLXRoZSBkZXNpcmVkIERPQ1RZUEUgZnJvbSB0aGUgPHBoPjx1aWNvbnRyb2w+RG9jdW1lbnQgdHlwZTwvdWljb250cm9sPjwvcGg+IGRyb3AtZG93bg0KLWxpc3QuPC9jbWQ+PGluZm8+PHA+VGhlIDxwaD48dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD48L3BoPiBkaWFsb2cNCi1mb3IgV2ViIHByb2plY3RzIGFsc28gaW5jbHVkZXMgYW4gPHBoPjx1aWNvbnRyb2w+V2ViIENvbnRlbnQgU2V0dGluZ3M8L3VpY29udHJvbD48L3BoPiBwYWdlLA0KLXdoZXJlIHlvdSBjYW4gc3BlY2lmeSBwcm9qZWN0LWRlZmF1bHQgSFRNTCBkb2N1bWVudCB0eXBlLiBUaGlzIHNldHRpbmcgd2lsbA0KLWJlIHVzZWQgaWYgbm8gRE9DVFlQRSBkZWNsYXJhdGlvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIGZpbGUsIGFuZCBubyBkZWZhdWx0DQotZG9jdW1lbnQgdHlwZSBpcyBzcGVjaWZpZWQgaW4gdGhlIDxwaD48dWljb250cm9sPldlYiBDb250ZW50IFNldHRpbmdzPC91aWNvbnRyb2w+PC9waD4gcGFnZQ0KLW9uIHRoZSA8cGg+PHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+PC9waD4gZGlhbG9nIGZvciB0aGUgZmlsZS48L3A+PC9pbmZvPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNoZ3hkdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY2hneGR0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlY2JmOWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY2hneGR0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTcGVjaWZ5aW5nIGFuIGltcGxpY2l0IGRvY3VtZW50IHR5cGUgZm9yIGFuIEhUTUwsIFhIVE1MLCBvciBKU1AgZnJhZ21lbnQiIC8+Ci08bWV0YSBjb250ZW50PSJET0NUWVBFIGRlY2xhcmF0aW9ucywgaW1wbGljaXQgZm9yIGZyYWdtZW50cywgZG9jdW1lbnQgdHlwZXMsIEhUTUwgZnJhZ21lbnRzLCBpbXBsaWNpdCBkb2N1bWVudCB0eXBlcywgSlNQIGZyYWdtZW50cywgWEhUTUwgZnJhZ21lbnRzLCBpbXBsaWNpdCBkb2N1bWVudCB0eXBlIGZvciBmcmFnbWVudHMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJET0NUWVBFIGRlY2xhcmF0aW9ucywgaW1wbGljaXQgZm9yIGZyYWdtZW50cywgZG9jdW1lbnQgdHlwZXMsIEhUTUwgZnJhZ21lbnRzLCBpbXBsaWNpdCBkb2N1bWVudCB0eXBlcywgSlNQIGZyYWdtZW50cywgWEhUTUwgZnJhZ21lbnRzLCBpbXBsaWNpdCBkb2N1bWVudCB0eXBlIGZvciBmcmFnbWVudHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRqY2hneGR0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U3BlY2lmeWluZyBhbiBpbXBsaWNpdCBkb2N1bWVudCB0eXBlIGZvciBhbiBIVE1MLCBYSFRNTCwgb3IgSlNQIGZyYWdtZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amNoZ3hkdCI+PGEgbmFtZT0idGpjaGd4ZHQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNwZWNpZnlpbmcgYW4gaW1wbGljaXQgZG9jdW1lbnQgdHlwZSBmb3IgYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmcmFnbWVudDwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5BbiA8ZW0+aW1wbGljaXQ8L2VtPiBkb2N1bWVudCB0eXBlIGlzIHVzZWQgZm9yIGNvbnRlbnQgYXNzaXN0IChDVFJMK1NwYWNlYmFyKSwKLXRoZSBQcm9wZXJ0aWVzIHZpZXcsIGFuZCBvdGhlciBlZGl0aW5nIGNvbnRleHRzIHdoZW4gbm8gRE9DVFlQRSBkZWNsYXJhdGlvbgotaXMgc3BlY2lmaWVkIGluIGFuIEhUTUwsIFhIVE1MLCBvciBKU1AgZmlsZS4gVHlwaWNhbGx5LCB0aGlzIGZlYXR1cmUgaXMgdXNlZAotZm9yIGEgZnJhZ21lbnQgKHBhcnRpYWwgZG9jdW1lbnQpIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIG90aGVyIHBhZ2VzIHVzaW5nCi1KU1AgaW5jbHVkZSBvciBzZXJ2ZXItc2lkZSBpbmNsdWRlLjwvcD4KLTxwPlRvIGFzc2lnbiBhbiBpbXBsaWNpdCBkb2N1bWVudCB0eXBlCi10byBhbiBIVE1MLCBYSFRNTCwgb3IgSlNQIGZyYWdtZW50LCBkbyB0aGUgZm9sbG93aW5nOiA8L3A+Ci0gPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCBzZWxlY3QgdGhlIEhUTUwsIFhIVE1MLCBvciBKU1AKLWZyYWdtZW50Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPjwvc3Bhbj4gZnJvbSB0aGUgZmlsZSdzCi1wb3AtdXAgbWVudS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIENvbnRlbnQgU2V0dGluZ3M8L3NwYW4+IHBhZ2UsIHNlbGVjdAotdGhlIGRlc2lyZWQgRE9DVFlQRSBmcm9tIHRoZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudCB0eXBlPC9zcGFuPjwvc3Bhbj4gZHJvcC1kb3duCi1saXN0Ljwvc3Bhbj4gPHA+VGhlIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+PC9zcGFuPiBkaWFsb2cKLWZvciBXZWIgcHJvamVjdHMgYWxzbyBpbmNsdWRlcyBhbiA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgQ29udGVudCBTZXR0aW5nczwvc3Bhbj48L3NwYW4+IHBhZ2UsCi13aGVyZSB5b3UgY2FuIHNwZWNpZnkgcHJvamVjdC1kZWZhdWx0IEhUTUwgZG9jdW1lbnQgdHlwZS4gVGhpcyBzZXR0aW5nIHdpbGwKLWJlIHVzZWQgaWYgbm8gRE9DVFlQRSBkZWNsYXJhdGlvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIGZpbGUsIGFuZCBubyBkZWZhdWx0Ci1kb2N1bWVudCB0eXBlIGlzIHNwZWNpZmllZCBpbiB0aGUgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIENvbnRlbnQgU2V0dGluZ3M8L3NwYW4+PC9zcGFuPiBwYWdlCi1vbiB0aGUgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj48L3NwYW4+IGRpYWxvZyBmb3IgdGhlIGZpbGUuPC9wPgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlaHRtLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVodG0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2ZWZlMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVodG0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGpjcmVodG0iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+WW91IGNhbiB1c2UgdGhlIE5ldyBIVE1MIEZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBIVE1MIGFuZCBYSFRNTCBmaWxlcw0KLWFuZCBmcmFtZXNldHMuIDwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz4NCi08aW5kZXh0ZXJtPmZyYW1lc2V0czxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkhUTUw8aW5kZXh0ZXJtPmNyZWF0aW5nIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5XTUw8aW5kZXh0ZXJtPmNyZWF0aW5nIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YSFRNTDxpbmRleHRlcm0+Y3JlYXRpbmcgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q3JlYXRlIGEgc3RhdGljIG9yIGEgZHluYW1pYyBXZWIgcHJvamVjdCBpZiB5b3UgaGF2ZSBub3QgYWxyZWFkeQ0KLWRvbmUgc28uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIGV4cGFuZCB5b3VyIHByb2plY3QgYW5kIHJpZ2h0IGNsaWNrIG9uDQoteW91ciBXZWJDb250ZW50IGZvbGRlciBvciBvbiBhIHN1YmZvbGRlciB1bmRlciBXZWJDb250ZW50LiAgPC9jbWQ+PGluZm8+Tm90ZQ0KLXRoYXQgaWYgeW91IGNob29zZSBhbnkgb3RoZXIgZm9sZGVyIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgSFRNTCBmaWxlLCB0aGVuDQotaXQgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIFdBUiBmaWxlIHRoYXQgaXMgZGVwbG95ZWQgdG8gdGhlIHNlcnZlci4gSW4NCi1hZGRpdGlvbiwgbGluayB2YWxpZGF0aW9uIHdpbGwgbm90IGVuY29tcGFzcyBmaWxlcyB0aGF0IGFyZSBub3QgdW5kZXIgdGhlDQotV2ViQ29udGVudCBmb2xkZXIuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkZyb20gdGhlIGNvbnRleHQgbWVudSwgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPk5ldzwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+T3RoZXI8L3VpY29udHJvbD48dWljb250cm9sPldlYjwvdWljb250cm9sPjx1aWNvbnRyb2w+SFRNTDwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LjwvY21kPjxzdGVwcmVzdWx0PlRoZSBOZXcgSFRNTCBQYWdlIHdpbmRvdyBhcHBlYXJzIHdpdGggeW91cg0KLWZvbGRlciBzZWxlY3RlZDwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UeXBlIGEgZmlsZSBuYW1lIGludG8gdGhlIEZpbGUgbmFtZSBmaWVsZCwgbWFraW5nIHN1cmUgeW91IGluY2x1ZGUNCi1hbiBodG1sIGV4dGVuc2lvbiAoaHRtbCwgaHRtLCB4aHRtbCwgaHRwbCwgd21sLCBzaHRtbCwgb3Igc2h0bSkgaW4gdGhlIGZpbGUNCi1uYW1lLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPiBZb3UgaGF2ZSBzZXZlcmFsIG9wdGlvbnMgZm9yIHByb2NlZWRpbmc6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5UbyBhY2NlcHQgdGhlIGRlZmF1bHRzIGFzc29jaWF0ZWQgd2l0aCBhIG5ldyBIVE1MIGZpbGUsIHNlbGVjdCA8dWljb250cm9sPkZpbmlzaC48L3VpY29udHJvbD48L2Nob2ljZT4NCi08Y2hvaWNlPiBUbyB1c2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgaW5pdGlhbCBjb250ZW50IG9mIHlvdXIgSFRNTCBwYWdlLA0KLXNlbGVjdCA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uIFRoZSBTZWxlY3QgSFRNTCBUZW1wbGF0ZSB3aW5kb3cgYXBwZWFycy4NCi1TZWxlY3QgdGhlIDx1aWNvbnRyb2w+VXNlIEhUTUwgVGVtcGxhdGU8L3VpY29udHJvbD4gY2hlY2sgYm94LCBhbmQgdGhlbiBzZWxlY3QNCi1vbmUgb2YgdGhlIHNhbXBsZSB0ZW1wbGF0ZXMuIFlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+SFRNTCBUZW1wbGF0ZXM8L3VpY29udHJvbD4gbGluaw0KLXRvIGFkZCBvciByZW1vdmUgSFRNTCB0ZW1wbGF0ZXMgdG8geW91ciBsaXN0IG9mIHRlbXBsYXRlcy48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlaHRtLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVodG0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1ZThmOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVodG0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIE5ldyBIVE1MIEZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgTmV3IEhUTUwgRmlsZSB3aXphcmQgdG8gY3JlYXRlIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMuIiAvPgotPG1ldGEgY29udGVudD0iZnJhbWVzZXRzLCBjcmVhdGluZywgSFRNTCwgY3JlYXRpbmcgZmlsZXMsIFdNTCwgWEhUTUwiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJmcmFtZXNldHMsIGNyZWF0aW5nLCBIVE1MLCBjcmVhdGluZyBmaWxlcywgV01MLCBYSFRNTCIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGpjcmVodG0iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amNyZWh0bSI+PGEgbmFtZT0idGpjcmVodG0iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHM8L2gxPgotCi0KLQotPGRpdj48cD5Zb3UgY2FuIHVzZSB0aGUgTmV3IEhUTUwgRmlsZSB3aXphcmQgdG8gY3JlYXRlIEhUTUwgYW5kIFhIVE1MIGZpbGVzCi1hbmQgZnJhbWVzZXRzLiA8L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DcmVhdGUgYSBzdGF0aWMgb3IgYSBkeW5hbWljIFdlYiBwcm9qZWN0IGlmIHlvdSBoYXZlIG5vdCBhbHJlYWR5Ci1kb25lIHNvLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLCBleHBhbmQgeW91ciBwcm9qZWN0IGFuZCByaWdodCBjbGljayBvbgoteW91ciBXZWJDb250ZW50IGZvbGRlciBvciBvbiBhIHN1YmZvbGRlciB1bmRlciBXZWJDb250ZW50LiAgPC9zcGFuPiBOb3RlCi10aGF0IGlmIHlvdSBjaG9vc2UgYW55IG90aGVyIGZvbGRlciBpbiB3aGljaCB0byBjcmVhdGUgdGhlIEhUTUwgZmlsZSwgdGhlbgotaXQgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIFdBUiBmaWxlIHRoYXQgaXMgZGVwbG95ZWQgdG8gdGhlIHNlcnZlci4gSW4KLWFkZGl0aW9uLCBsaW5rIHZhbGlkYXRpb24gd2lsbCBub3QgZW5jb21wYXNzIGZpbGVzIHRoYXQgYXJlIG5vdCB1bmRlciB0aGUKLVdlYkNvbnRlbnQgZm9sZGVyLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgY29udGV4dCBtZW51LCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdGhlcjwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWI8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTDwvc3Bhbj4KLTwvc3Bhbj4uPC9zcGFuPiBUaGUgTmV3IEhUTUwgUGFnZSB3aW5kb3cgYXBwZWFycyB3aXRoIHlvdXIKLWZvbGRlciBzZWxlY3RlZDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIGZpbGUgbmFtZSBpbnRvIHRoZSBGaWxlIG5hbWUgZmllbGQsIG1ha2luZyBzdXJlIHlvdSBpbmNsdWRlCi1hbiBodG1sIGV4dGVuc2lvbiAoaHRtbCwgaHRtLCB4aHRtbCwgaHRwbCwgd21sLCBzaHRtbCwgb3Igc2h0bSkgaW4gdGhlIGZpbGUKLW5hbWUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+IFlvdSBoYXZlIHNldmVyYWwgb3B0aW9ucyBmb3IgcHJvY2VlZGluZzo8L3NwYW4+Ci08dWw+Ci08bGk+VG8gYWNjZXB0IHRoZSBkZWZhdWx0cyBhc3NvY2lhdGVkIHdpdGggYSBuZXcgSFRNTCBmaWxlLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoLjwvc3Bhbj48L2xpPgotCi08bGk+IFRvIHVzZSBhIHRlbXBsYXRlIGZpbGUgZm9yIHRoZSBpbml0aWFsIGNvbnRlbnQgb2YgeW91ciBIVE1MIHBhZ2UsCi1zZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIFRoZSBTZWxlY3QgSFRNTCBUZW1wbGF0ZSB3aW5kb3cgYXBwZWFycy4KLVNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VXNlIEhUTUwgVGVtcGxhdGU8L3NwYW4+IGNoZWNrIGJveCwgYW5kIHRoZW4gc2VsZWN0Ci1vbmUgb2YgdGhlIHNhbXBsZSB0ZW1wbGF0ZXMuIFlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgVGVtcGxhdGVzPC9zcGFuPiBsaW5rCi10byBhZGQgb3IgcmVtb3ZlIEhUTUwgdGVtcGxhdGVzIHRvIHlvdXIgbGlzdCBvZiB0ZW1wbGF0ZXMuPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXYgLz4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWpzcC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlanNwLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNzViMzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlanNwLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRqY3JlanNwIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5KU1AgZmlsZXM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Nb3N0IHR5cGVzIG9mIEpTUCBmaWxlcyBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUgTmV3IEpTUCBGaWxlDQotd2l6YXJkLiBUbyBjcmVhdGUgYSBiYXNpYyBKU1AgZmlsZSB1c2luZyB0aGUgd2l6YXJkLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nDQotc3RlcHM6IDwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q3JlYXRlIGEgZHluYW1pYyBXZWIgcHJvamVjdCBpZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSBkb25lIHNvLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLCBleHBhbmQgeW91ciBwcm9qZWN0IGFuZCByaWdodCBjbGljayBvbg0KLXlvdXIgV2ViQ29udGVudCBmb2xkZXIgb3Igb24gYSBzdWJmb2xkZXIgdW5kZXIgV2ViQ29udGVudC4gIE5vdGUgdGhhdCBpZiB5b3UNCi1jaG9vc2UgYW55IG90aGVyIGZvbGRlciBpbiB3aGljaCB0byBjcmVhdGUgdGhlIEpTUCwgdGhlbiBpdCB3aWxsIG5vdCBiZSBpbmNsdWRlZA0KLWluIHRoZSBXQVIgZmlsZSB0aGF0IGlzIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXIuIEluIGFkZGl0aW9uLCBsaW5rIHZhbGlkYXRpb24NCi13aWxsIG5vdCBlbmNvbXBhc3MgZmlsZXMgdGhhdCBhcmUgbm90IHVuZGVyIHRoZSBXZWJDb250ZW50IGZvbGRlci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSBjb250ZXh0IG1lbnUsIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4NCi08dWljb250cm9sPkpTUDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjxzdGVwcmVzdWx0PlRoZSBOZXcgSmF2YSBTZXJ2ZXINCi1QYWdlIHdpbmRvdyBhcHBlYXJzIHdpdGggeW91ciBmb2xkZXIgc2VsZWN0ZWQ8L3N0ZXByZXN1bHQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VHlwZSBhIGZpbGUgbmFtZSBpbnRvIHRoZSBGaWxlIG5hbWUgZmllbGQsIG1ha2luZyBzdXJlIHlvdSBpbmNsdWRlDQotdGhlIGpzcCBleHRlbnNpb24gKGpzcCwganN2LCBqdHBsLCBvciBqc3B4KSBpbiB0aGUgZmlsZSBuYW1lLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPiBZb3UgaGF2ZSBzZXZlcmFsIG9wdGlvbnMgZm9yIHByb2NlZWRpbmc6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5UbyBhY2NlcHQgdGhlIGRlZmF1bHRzIGFzc29jaWF0ZWQgd2l0aCBhIG5ldyBKU1AgZmlsZSwgc2VsZWN0IDx1aWNvbnRyb2w+RmluaXNoLjwvdWljb250cm9sPjwvY2hvaWNlPg0KLTxjaG9pY2U+VG8gbGluayB0byBhIGZpbGUgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBzcGVjaWZ5IHBhdGggdmFyaWFibGVzLCBzZWxlY3QgPHVpY29udHJvbD5BZHZhbmNlZDwvdWljb250cm9sPiBhbmQNCi10aGVuIG1ha2UgeW91ciBzZWxlY3Rpb25zIHVzaW5nIHRoZSA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiBhbmQgPHVpY29udHJvbD5WYXJpYWJsZXM8L3VpY29udHJvbD4gYnV0dG9ucy4gPC9jaG9pY2U+DQotPGNob2ljZT4gVG8gdXNlIGEgdGVtcGxhdGUgZmlsZSBmb3IgdGhlIGluaXRpYWwgY29udGVudCBvZiB5b3VyIEpTUCBwYWdlLA0KLXNlbGVjdCA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uIFRoZSBTZWxlY3QgSlNQIFRlbXBsYXRlIHdpbmRvdyBhcHBlYXJzLg0KLVNlbGVjdCB0aGUgPHVpY29udHJvbD5Vc2UgSlNQIFRlbXBsYXRlPC91aWNvbnRyb2w+IGNoZWNrIGJveCwgYW5kIHRoZW4gc2VsZWN0DQotb25lIG9mIHRoZSBzYW1wbGUgdGVtcGxhdGVzLiBZb3UgY2FuIGFsc28gc2VsZWN0IHRoZSA8dWljb250cm9sPkpTUCBUZW1wbGF0ZXM8L3VpY29udHJvbD4gbGluaw0KLXRvIGFkZCBvciByZW1vdmUgSlNQIHRlbXBsYXRlcyB0byB5b3VyIGxpc3Qgb2YgdGVtcGxhdGVzLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVqc3AuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWpzcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDM3ZjRiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWpzcC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IkpTUCBmaWxlcywgY3JlYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJKU1AgZmlsZXMsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jcGRqc3BzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGpjcmVqc3AiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amNyZWpzcCI+PGEgbmFtZT0idGpjcmVqc3AiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXM8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Nb3N0IHR5cGVzIG9mIEpTUCBmaWxlcyBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUgTmV3IEpTUCBGaWxlCi13aXphcmQuIFRvIGNyZWF0ZSBhIGJhc2ljIEpTUCBmaWxlIHVzaW5nIHRoZSB3aXphcmQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcKLXN0ZXBzOiA8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DcmVhdGUgYSBkeW5hbWljIFdlYiBwcm9qZWN0IGlmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IGRvbmUgc28uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgZXhwYW5kIHlvdXIgcHJvamVjdCBhbmQgcmlnaHQgY2xpY2sgb24KLXlvdXIgV2ViQ29udGVudCBmb2xkZXIgb3Igb24gYSBzdWJmb2xkZXIgdW5kZXIgV2ViQ29udGVudC4gIE5vdGUgdGhhdCBpZiB5b3UKLWNob29zZSBhbnkgb3RoZXIgZm9sZGVyIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgSlNQLCB0aGVuIGl0IHdpbGwgbm90IGJlIGluY2x1ZGVkCi1pbiB0aGUgV0FSIGZpbGUgdGhhdCBpcyBkZXBsb3llZCB0byB0aGUgc2VydmVyLiBJbiBhZGRpdGlvbiwgbGluayB2YWxpZGF0aW9uCi13aWxsIG5vdCBlbmNvbXBhc3MgZmlsZXMgdGhhdCBhcmUgbm90IHVuZGVyIHRoZSBXZWJDb250ZW50IGZvbGRlci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSBjb250ZXh0IG1lbnUsIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkpTUDwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj4gVGhlIE5ldyBKYXZhIFNlcnZlcgotUGFnZSB3aW5kb3cgYXBwZWFycyB3aXRoIHlvdXIgZm9sZGVyIHNlbGVjdGVkPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgZmlsZSBuYW1lIGludG8gdGhlIEZpbGUgbmFtZSBmaWVsZCwgbWFraW5nIHN1cmUgeW91IGluY2x1ZGUKLXRoZSBqc3AgZXh0ZW5zaW9uIChqc3AsIGpzdiwganRwbCwgb3IganNweCkgaW4gdGhlIGZpbGUgbmFtZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4gWW91IGhhdmUgc2V2ZXJhbCBvcHRpb25zIGZvciBwcm9jZWVkaW5nOjwvc3Bhbj4KLTx1bD4KLTxsaT5UbyBhY2NlcHQgdGhlIGRlZmF1bHRzIGFzc29jaWF0ZWQgd2l0aCBhIG5ldyBKU1AgZmlsZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaC48L3NwYW4+PC9saT4KLQotPGxpPlRvIGxpbmsgdG8gYSBmaWxlIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgc3BlY2lmeSBwYXRoIHZhcmlhYmxlcywgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkdmFuY2VkPC9zcGFuPiBhbmQKLXRoZW4gbWFrZSB5b3VyIHNlbGVjdGlvbnMgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhcmlhYmxlczwvc3Bhbj4gYnV0dG9ucy4gPC9saT4KLQotPGxpPiBUbyB1c2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgaW5pdGlhbCBjb250ZW50IG9mIHlvdXIgSlNQIHBhZ2UsCi1zZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIFRoZSBTZWxlY3QgSlNQIFRlbXBsYXRlIHdpbmRvdyBhcHBlYXJzLgotU2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2UgSlNQIFRlbXBsYXRlPC9zcGFuPiBjaGVjayBib3gsIGFuZCB0aGVuIHNlbGVjdAotb25lIG9mIHRoZSBzYW1wbGUgdGVtcGxhdGVzLiBZb3UgY2FuIGFsc28gc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KU1AgVGVtcGxhdGVzPC9zcGFuPiBsaW5rCi10byBhZGQgb3IgcmVtb3ZlIEpTUCB0ZW1wbGF0ZXMgdG8geW91ciBsaXN0IG9mIHRlbXBsYXRlcy48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jcGRqc3BzLmh0bWwiPkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdjcmVwcmouaHRtbCIgdGl0bGU9IllvdSBjcmVhdGUgYW5kIG1haW50YWluIHRoZSByZXNvdXJjZXMgZm9yIHlvdXIgV2ViIGFwcGxpY2F0aW9ucyBpbiBXZWIgcHJvamVjdHMuIj5DcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqZGV0YWdzLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpkZXRhZ3MuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVmZmI2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpkZXRhZ3MuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGpkZXRhZ3MiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3PC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgcGFnZXM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+VG8gYWlkIGluIFdlYiBzaXRlIGRldmVsb3BtZW50IGFuZCBlZGl0aW5nLCB0aGVyZSBpcyBsb2NhbCB0YWcNCi1ob3ZlciBoZWxwIGZvciBhbGwgc3VwcG9ydGVkIHRhZyBzZXRzLCBhcyB3ZWxsIGFzIDx4cmVmIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDYuZGl0YSINCi1zY29wZT0icGVlciI+PGRlc2M+PC9kZXNjPmNvbnRlbnQgYXNzaXN0PC94cmVmPiAoQ3RybCtTcGFjZWJhciksIGEgdG9vbCB0aGF0DQotaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGENCi1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLjwvcD48cD4gWW91IGNhbiB0b2dnbGUgYW1vbmcgdmFyaW91cyB2aWV3aW5nIG1vZGVzDQotKHdoaWNoIGFyZSBkZXRlcm1pbmVkIGJ5IGZpbGUgdHlwZSkgdG8gdmlzdWFsbHkgZGVzaWduIHBhZ2VzLCB3b3JrIHdpdGggSFRNTCwgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gb3INCi1KU1AgY29udGVudCwgYW5kIHByZXZpZXcgeW91ciBwYWdlcy4gVG8gaGVscCB5b3UgY3JlYXRlIHRoZSB2aXN1YWwgaW1wYWN0DQoteW91IHdhbnQgb24geW91ciBXZWIgc2l0ZXMsIHRoZSBlZGl0b3IgaW5jbHVkZXMgaXRzIG93biBsaWJyYXJ5IG9mIHJldXNhYmxlDQotZ3JhcGhpY3MgYW5kIHR3byBncmFwaGljIHByb2dyYW1zIGZvciBjcmVhdGluZywgZWRpdGluZywgYW5kIGFuaW1hdGluZyBpbWFnZQ0KLWZpbGVzLiA8L3A+PG5vdGU+VXNlIGVpdGhlciB1cHBlcmNhc2Ugb3IgbG93ZXJjYXNlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzDQotY29uc2lzdGVudGx5IHdoZW4gbmFtaW5nIEhUTUwgZmlsZXMgYW5kIGVtYmVkZGVkIGZpbGVzIChzdWNoIGFzIGltYWdlIGZpbGVzKQ0KLXVzZWQgaW4geW91ciBXZWIgcGFnZXMsIGJlY2F1c2Ugc29tZSBzZXJ2ZXIgb3BlcmF0aW5nIHN5c3RlbXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLg0KLURvIG5vdCB1c2Ugc3BhY2VzIG9yIHNwZWNpYWwgY2hhcmFjdGVycyBzdWNoIGFzIGV4Y2xhbWF0aW9uIHBvaW50cyBvciBxdWVzdGlvbg0KLW1hcmtzIGluIGZpbGUgbmFtZXMuPC9ub3RlPiA8L2NvbnRleHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqZGV0YWdzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpkZXRhZ3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE0ZmY5Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpkZXRhZ3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3IiAvPgotPG1ldGEgY29udGVudD0iV2ViIHBhZ2VzLCBjcmVhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBwYWdlcywgY3JlYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2N3dG92ZXIuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0amRldGFncyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amRldGFncyI+PGEgbmFtZT0idGpkZXRhZ3MiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3PC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPlRvIGFpZCBpbiBXZWIgc2l0ZSBkZXZlbG9wbWVudCBhbmQgZWRpdGluZywgdGhlcmUgaXMgbG9jYWwgdGFnCi1ob3ZlciBoZWxwIGZvciBhbGwgc3VwcG9ydGVkIHRhZyBzZXRzLCBhcyB3ZWxsIGFzIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDYuaHRtbCIgdGl0bGU9IiI+Y29udGVudCBhc3Npc3Q8L2E+IChDdHJsK1NwYWNlYmFyKSwgYSB0b29sIHRoYXQKLWhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhCi1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLjwvcD4KLTxwPiBZb3UgY2FuIHRvZ2dsZSBhbW9uZyB2YXJpb3VzIHZpZXdpbmcgbW9kZXMKLSh3aGljaCBhcmUgZGV0ZXJtaW5lZCBieSBmaWxlIHR5cGUpIHRvIHZpc3VhbGx5IGRlc2lnbiBwYWdlcywgd29yayB3aXRoIEhUTUwsIEphdmFTY3JpcHTihKIgb3IKLUpTUCBjb250ZW50LCBhbmQgcHJldmlldyB5b3VyIHBhZ2VzLiBUbyBoZWxwIHlvdSBjcmVhdGUgdGhlIHZpc3VhbCBpbXBhY3QKLXlvdSB3YW50IG9uIHlvdXIgV2ViIHNpdGVzLCB0aGUgZWRpdG9yIGluY2x1ZGVzIGl0cyBvd24gbGlicmFyeSBvZiByZXVzYWJsZQotZ3JhcGhpY3MgYW5kIHR3byBncmFwaGljIHByb2dyYW1zIGZvciBjcmVhdGluZywgZWRpdGluZywgYW5kIGFuaW1hdGluZyBpbWFnZQotZmlsZXMuIDwvcD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBVc2UgZWl0aGVyIHVwcGVyY2FzZSBvciBsb3dlcmNhc2UgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMKLWNvbnNpc3RlbnRseSB3aGVuIG5hbWluZyBIVE1MIGZpbGVzIGFuZCBlbWJlZGRlZCBmaWxlcyAoc3VjaCBhcyBpbWFnZSBmaWxlcykKLXVzZWQgaW4geW91ciBXZWIgcGFnZXMsIGJlY2F1c2Ugc29tZSBzZXJ2ZXIgb3BlcmF0aW5nIHN5c3RlbXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLgotRG8gbm90IHVzZSBzcGFjZXMgb3Igc3BlY2lhbCBjaGFyYWN0ZXJzIHN1Y2ggYXMgZXhjbGFtYXRpb24gcG9pbnRzIG9yIHF1ZXN0aW9uCi1tYXJrcyBpbiBmaWxlIG5hbWVzLjwvZGl2PgotIDwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jY3d0b3Zlci5odG1sIiB0aXRsZT0iIj5XZWIgYXBwbGljYXRpb24gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90anByZWZzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzczZDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGpwcmVmcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RGVmaW5pbmcgSFRNTCBmaWxlIHByZWZlcmVuY2VzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRqcHJlZnN8MXxET0NUWVBFZGVjbGFyYXRpb25zYWRkaW5nYXV0b21hdGljYWxseSINCi1zdGF0dXM9Im5ldyI+RE9DVFlQRSBkZWNsYXJhdGlvbnM8aW5kZXh0ZXJtPmFkZGluZyBhdXRvbWF0aWNhbGx5PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybSBrZXlyZWY9InRqcHJlZnN8MnxIVE1MZmlsZXNlZGl0aW5ncHJlZmVyZW5jZXMiIHN0YXR1cz0iY2hhbmdlZCI+SFRNTDxpbmRleHRlcm0+ZWRpdGluZw0KLXByZWZlcmVuY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+PGluZGV4dGVybT5ET0NUWVBFIGRlY2xhcmF0aW9uczxpbmRleHRlcm0+YWRkaW5nIGF1dG9tYXRpY2FsbHk8L2luZGV4dGVybT48L2luZGV4dGVybT4gPGluZGV4dGVybT5IVE1MDQotZmlsZXM8aW5kZXh0ZXJtPmVkaXRpbmcgcHJlZmVyZW5jZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4gVG8gZGVmaW5lIGdlbmVyYWwNCi1IVE1MIGZpbGUgcHJlZmVyZW5jZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSA8dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPiBtZW51LCBzZWxlY3QgPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJlZmVyZW5jZXMgd2luZG93LCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2ViIGFuZA0KLVhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+SFRNTCBGaWxlczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNwZWNpZnkgdGhlIGZvbGxvd2luZyBzZXR0aW5ncyByZWxhdGVkIHRvIHNhdmluZyBhbiBIVE1MIHNvdXJjZQ0KLXBhZ2UuIFRoZSBkZWZhdWx0cyBhcmUgcmVjb21tZW5kZWQgYW5kIHNob3VsZCBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gdGhlcmUNCi1pcyBhIHNwZWNpZmljIHJlYXNvbiB0byBkbyBzby4gPC9jbWQ+PGluZm8+PGRsPjxkbGVudHJ5Pg0KLTxkdD5MaW5lIGRlbGltaXRlcjwvZHQ+DQotPGRkPlNwZWNpZnkgdGhlIGFwcHJvcHJpYXRlIEVPTCBjaGFyYWN0ZXIgZm9yIHlvdXIgZW52aXJvbm1lbnQuIFRoZSBkZWZhdWx0DQotaXMgPHVpY29udHJvbD5ObyB0cmFuc2xhdGlvbjwvdWljb250cm9sPi48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+QWRkIHRoaXMgc3VmZml4PC9kdD4NCi08ZGQ+U3BlY2lmeSBhIGRlZmF1bHQgc3VmZml4IGZvciBmaWxlcyB0aGF0IHlvdSBzYXZlLiBUaGUgZGVmYXVsdCBpcyA8dXNlcmlucHV0Pmh0bWw8L3VzZXJpbnB1dD4uPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkVuY29kaW5nLCBJQU5BLCAoVXNlIHdvcmtiZW5jaCBkZWZhdWx0KTwvZHQ+DQotPGRkPlNwZWNpZnkgdGhlIGRlZmF1bHQgZW5jb2RpbmcgKGNvZGUgcGFnZSkgZm9yIGZpbGVzIHRoYXQgeW91IGNyZWF0ZS4gVGhlDQotZGVmYXVsdCBpcyB0aGUgV29ya2JlbmNoJ3MgZW5jb2RpbmcgcHJlZmVyZW5jZS4gPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pkluc2VydCBET0NUWVBFIGRlY2xhcmF0aW9uPC9kdD4NCi08ZGQ+T3B0aW9uYWxseSwgeW91IGNhbiBhdXRvbWF0aWNhbGx5IGFkZCBhIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gSFRNTCBmaWxlcy4NCi1UaGUgZGVmYXVsdCBET0NUWVBFIGlzIGRldGVybWluZWQgd2hlbiB5b3UgY3JlYXRlIGFuIEhUTUwgZmlsZSBvciBhIEpTUCBmaWxlDQotdXNpbmcgYSB3aXphcmQuIElmIHlvdSBhZGQgdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24sIHlvdSBzaG91bGQgaW5jbHVkZSBhdA0KLWxlYXN0IGEgUHVibGljIElEIHNwZWNpZmljYXRpb24sIGFuZCwgb3B0aW9uYWxseSwgYSBTeXN0ZW0gSUQuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pkluc2VydCBHRU5FUkFUT1Igd2l0aCBNRVRBIHRhZzwvZHQ+DQotPGRkPk9wdGlvbmFsbHksIHNlbGVjdCB0aGUgY2hlY2sgYm94IHRvIHNwZWNpZnkgR0VORVJBVE9SIGluIGEgTUVUQSB0YWcgaW4NCi10aGUgSFRNTCBmaWxlIGhlYWRlci48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+TG9hZGluZyBmaWxlczwvZHQ+DQotPGRkPlNwZWNpZnkgdGhlIGRlZmF1bHQgZW5jb2RpbmcgKGNvZGUgcGFnZSkgZm9yIGZpbGVzIHRoYXQgeW91IG9wZW4uIFRoZQ0KLWRlZmF1bHQgaXMgdGhlIFdvcmtiZW5jaCdzIGVuY29kaW5nIHByZWZlcmVuY2UuIERlc2VsZWN0IHRoZSA8dWljb250cm9sPlVzZQ0KLXdvcmtiZW5jaCBkZWZhdWx0PC91aWNvbnRyb2w+IGNoZWNrIGJveCB0byBzZWxlY3QgYW5vdGhlciBlbmNvZGluZy4gICA8bm90ZT5FbmNvZGluZw0KLWRldGVjdGlvbiAod2hlbiBsb2FkaW5nIGZpbGVzKSBpcyBwZXJmb3JtZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogICA8dWw+DQotPGxpPkxvY2F0ZSB0aGUgZW5jb2RpbmcgbmFtZSBlbWJlZGRlZCBpbiB0aGUgZG9jdW1lbnQuPC9saT4NCi08bGk+V2hlbiBubyBlbmNvZGluZyBpcyBlbWJlZGRlZCBpbiB0aGUgZG9jdW1lbnQsIGFuIGF1dG9tYXRpYyBlbmNvZGluZyBkZXRlY3Rvcg0KLWF0dGVtcHRzIHRvIGRldGVybWluZSBlbmNvZGluZyB1c2VkIGluIHRoZSBkb2N1bWVudC48L2xpPg0KLTxsaT5JZiB0aGUgZW5jb2Rpbmcgc3RpbGwgY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSBlbmNvZGluZyBkZWZpbmVkIGluIHRoZSA8dWljb250cm9sPkVuY29kaW5nPC91aWNvbnRyb2w+IGZpZWxkDQotaXMgdXNlZC48L2xpPg0KLTwvdWw+IDwvbm90ZT4gPC9kZD4NCi08L2RsZW50cnk+PC9kbD4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD4gdGhlbiA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvDQotc2F2ZSB5b3VyIGNoYW5nZXMuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90anByZWZzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MmYxMjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXMiIC8+Ci08bWV0YSBjb250ZW50PSJET0NUWVBFIGRlY2xhcmF0aW9ucywgYWRkaW5nIGF1dG9tYXRpY2FsbHksIEhUTUwsIGVkaXRpbmcgcHJlZmVyZW5jZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJET0NUWVBFIGRlY2xhcmF0aW9ucywgYWRkaW5nIGF1dG9tYXRpY2FsbHksIEhUTUwsIGVkaXRpbmcgcHJlZmVyZW5jZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRqcHJlZnMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5EZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqcHJlZnMiPjxhIG5hbWU9InRqcHJlZnMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlczwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD4gIFRvIGRlZmluZSBnZW5lcmFsCi1IVE1MIGZpbGUgcHJlZmVyZW5jZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiBtZW51LCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZWZlcmVuY2VzIHdpbmRvdywgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZAotWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgRmlsZXM8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgcmVsYXRlZCB0byBzYXZpbmcgYW4gSFRNTCBzb3VyY2UKLXBhZ2UuIFRoZSBkZWZhdWx0cyBhcmUgcmVjb21tZW5kZWQgYW5kIHNob3VsZCBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gdGhlcmUKLWlzIGEgc3BlY2lmaWMgcmVhc29uIHRvIGRvIHNvLiA8L3NwYW4+IDxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5MaW5lIGRlbGltaXRlcjwvZHQ+Ci0KLTxkZD5TcGVjaWZ5IHRoZSBhcHByb3ByaWF0ZSBFT0wgY2hhcmFjdGVyIGZvciB5b3VyIGVudmlyb25tZW50LiBUaGUgZGVmYXVsdAotaXMgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Tm8gdHJhbnNsYXRpb248L3NwYW4+LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkFkZCB0aGlzIHN1ZmZpeDwvZHQ+Ci0KLTxkZD5TcGVjaWZ5IGEgZGVmYXVsdCBzdWZmaXggZm9yIGZpbGVzIHRoYXQgeW91IHNhdmUuIFRoZSBkZWZhdWx0IGlzIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+aHRtbDwva2JkPi48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5FbmNvZGluZywgSUFOQSwgKFVzZSB3b3JrYmVuY2ggZGVmYXVsdCk8L2R0PgotCi08ZGQ+U3BlY2lmeSB0aGUgZGVmYXVsdCBlbmNvZGluZyAoY29kZSBwYWdlKSBmb3IgZmlsZXMgdGhhdCB5b3UgY3JlYXRlLiBUaGUKLWRlZmF1bHQgaXMgdGhlIFdvcmtiZW5jaCdzIGVuY29kaW5nIHByZWZlcmVuY2UuIDwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkluc2VydCBET0NUWVBFIGRlY2xhcmF0aW9uPC9kdD4KLQotPGRkPk9wdGlvbmFsbHksIHlvdSBjYW4gYXV0b21hdGljYWxseSBhZGQgYSBET0NUWVBFIGRlY2xhcmF0aW9uIHRvIEhUTUwgZmlsZXMuCi1UaGUgZGVmYXVsdCBET0NUWVBFIGlzIGRldGVybWluZWQgd2hlbiB5b3UgY3JlYXRlIGFuIEhUTUwgZmlsZSBvciBhIEpTUCBmaWxlCi11c2luZyBhIHdpemFyZC4gSWYgeW91IGFkZCB0aGUgRE9DVFlQRSBkZWNsYXJhdGlvbiwgeW91IHNob3VsZCBpbmNsdWRlIGF0Ci1sZWFzdCBhIFB1YmxpYyBJRCBzcGVjaWZpY2F0aW9uLCBhbmQsIG9wdGlvbmFsbHksIGEgU3lzdGVtIElELjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkluc2VydCBHRU5FUkFUT1Igd2l0aCBNRVRBIHRhZzwvZHQ+Ci0KLTxkZD5PcHRpb25hbGx5LCBzZWxlY3QgdGhlIGNoZWNrIGJveCB0byBzcGVjaWZ5IEdFTkVSQVRPUiBpbiBhIE1FVEEgdGFnIGluCi10aGUgSFRNTCBmaWxlIGhlYWRlci48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Mb2FkaW5nIGZpbGVzPC9kdD4KLQotPGRkPlNwZWNpZnkgdGhlIGRlZmF1bHQgZW5jb2RpbmcgKGNvZGUgcGFnZSkgZm9yIGZpbGVzIHRoYXQgeW91IG9wZW4uIFRoZQotZGVmYXVsdCBpcyB0aGUgV29ya2JlbmNoJ3MgZW5jb2RpbmcgcHJlZmVyZW5jZS4gRGVzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZQotd29ya2JlbmNoIGRlZmF1bHQ8L3NwYW4+IGNoZWNrIGJveCB0byBzZWxlY3QgYW5vdGhlciBlbmNvZGluZy4gICA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gRW5jb2RpbmcKLWRldGVjdGlvbiAod2hlbiBsb2FkaW5nIGZpbGVzKSBpcyBwZXJmb3JtZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogICA8dWw+Ci08bGk+TG9jYXRlIHRoZSBlbmNvZGluZyBuYW1lIGVtYmVkZGVkIGluIHRoZSBkb2N1bWVudC48L2xpPgotCi08bGk+V2hlbiBubyBlbmNvZGluZyBpcyBlbWJlZGRlZCBpbiB0aGUgZG9jdW1lbnQsIGFuIGF1dG9tYXRpYyBlbmNvZGluZyBkZXRlY3RvcgotYXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIGVuY29kaW5nIHVzZWQgaW4gdGhlIGRvY3VtZW50LjwvbGk+Ci0KLTxsaT5JZiB0aGUgZW5jb2Rpbmcgc3RpbGwgY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSBlbmNvZGluZyBkZWZpbmVkIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FbmNvZGluZzwvc3Bhbj4gZmllbGQKLWlzIHVzZWQuPC9saT4KLQotPC91bD4KLSA8L2Rpdj4KLSA8L2RkPgotCi08L2RsPgotIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbHk8L3NwYW4+IHRoZW4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvCi1zYXZlIHlvdXIgY2hhbmdlcy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c2VydmVydGFyZ2V0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHNlcnZlcnRhcmdldC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjcxNzE4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c2VydmVydGFyZ2V0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9InRzZXJ2ZXJ0YXJnZXQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNlcnZlciB0YXJnZXRpbmcgZm9yIFdlYiBhcHBsaWNhdGlvbnM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNlcnZlcnM8aW5kZXh0ZXJtPnRhcmdldGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+V2ViDQotYXBwbGljYXRpb25zPGluZGV4dGVybT5zZXJ2ZXIgdGFyZ2V0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPlRvIHN1cHBvcnQgZGlmZmVyZW50IEphdmEgRUUgYXBwbGljYXRpb24gc2VydmVycywgdGhlIEphdmEgRUUgdG9vbGluZyBhbGxvd3MNCi15b3UgdG8gdGFyZ2V0IGEgc3BlY2lmaWMgc2VydmVyIGR1cmluZyB5b3VyIEVudGVycHJpc2UgQXBwbGljYXRpb24gKEVBUikgcHJvamVjdA0KLWRldmVsb3BtZW50LiBJbiBtb3N0IGNhc2VzLCBhIFdlYiBwcm9qZWN0IG11c3QgdGFyZ2V0IHRoZSBzYW1lIHNlcnZlciBhcyB0aGUNCi1FQVIgcHJvamVjdCBpbiBvcmRlciB0byBkZXBsb3kgdGhlIFdlYiBhcHBsaWNhdGlvbiB0byB0aGUgc2VydmVyIHByb3Blcmx5LiA8L3A+DQotPHA+QWZ0ZXIgeW91IGhhdmUgYSBXZWIgcHJvamVjdCBjcmVhdGVkLCB5b3UgY2FuIG1vZGlmeSB0aGUgdGFyZ2V0IHNlcnZlcg0KLXVzaW5nIHRoZSBwcm9qZWN0J3MgcHJvcGVydGllcyBkaWFsb2cuIFRvIGRvIHRoaXMsIHJpZ2h0LWNsaWNrIG9uIHRoZSBwcm9qZWN0DQotaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5TZXJ2ZXI8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHNlcnZlcnRhcmdldC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzZXJ2ZXJ0YXJnZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4ZmMwOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHNlcnZlcnRhcmdldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2VydmVyIHRhcmdldGluZyBmb3IgV2ViIGFwcGxpY2F0aW9ucyIgLz4KLTxtZXRhIGNvbnRlbnQ9InNlcnZlcnMsIHRhcmdldGluZywgV2ViIGFwcGxpY2F0aW9ucywgc2VydmVyIHRhcmdldGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InNlcnZlcnMsIHRhcmdldGluZywgV2ViIGFwcGxpY2F0aW9ucywgc2VydmVyIHRhcmdldGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2NyZXByai5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzZXJ2ZXJ0YXJnZXQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c2VydmVydGFyZ2V0Ij48YSBuYW1lPSJ0c2VydmVydGFyZ2V0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zPC9oMT4KLQotCi08ZGl2PgotPHA+VG8gc3VwcG9ydCBkaWZmZXJlbnQgSmF2YSBFRSBhcHBsaWNhdGlvbiBzZXJ2ZXJzLCB0aGUgSmF2YSBFRSB0b29saW5nIGFsbG93cwoteW91IHRvIHRhcmdldCBhIHNwZWNpZmljIHNlcnZlciBkdXJpbmcgeW91ciBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIChFQVIpIHByb2plY3QKLWRldmVsb3BtZW50LiBJbiBtb3N0IGNhc2VzLCBhIFdlYiBwcm9qZWN0IG11c3QgdGFyZ2V0IHRoZSBzYW1lIHNlcnZlciBhcyB0aGUKLUVBUiBwcm9qZWN0IGluIG9yZGVyIHRvIGRlcGxveSB0aGUgV2ViIGFwcGxpY2F0aW9uIHRvIHRoZSBzZXJ2ZXIgcHJvcGVybHkuIDwvcD4KLQotPHA+QWZ0ZXIgeW91IGhhdmUgYSBXZWIgcHJvamVjdCBjcmVhdGVkLCB5b3UgY2FuIG1vZGlmeSB0aGUgdGFyZ2V0IHNlcnZlcgotdXNpbmcgdGhlIHByb2plY3QncyBwcm9wZXJ0aWVzIGRpYWxvZy4gVG8gZG8gdGhpcywgcmlnaHQtY2xpY2sgb24gdGhlIHByb2plY3QKLWluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2VydmVyPC9zcGFuPjwvc3Bhbj4uPC9wPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NyZXByai5odG1sIiB0aXRsZT0iWW91IGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhlIHJlc291cmNlcyBmb3IgeW91ciBXZWIgYXBwbGljYXRpb25zIGluIFdlYiBwcm9qZWN0cy4iPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHN0eWxlc2hlZXQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c3R5bGVzaGVldC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWYzN2UyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c3R5bGVzaGVldC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3R5bGVzaGVldCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0czwvdGl0bGU+DQotPHNob3J0ZGVzYz5DYXNjYWRpbmcgc3R5bGUgc2hlZXRzIGVuYWJsZSB5b3UgdG8gZGVmaW5lIGEgY29uc2lzdGVudCBsb29rIGFuZA0KLWZlZWwgdGhyb3VnaG91dCB5b3VyIFdlYiBzaXRlIGJ5IG1haW50YWluaW5nIHRoZSBjb250ZW50cyAoV2ViIHBhZ2VzKSBhbmQNCi10aGUgZGVzaWduICh0aGUgc3R5bGUgc2hlZXQpIHNlcGFyYXRlbHkuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c3R5bGUgc2hlZXRzPGluZGV4dGVybT5jcmVhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+VG8gY3JlYXRlIGEgbmV3IGNhc2NhZGluZyBzdHlsZSBzaGVldDo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q3JlYXRlIGEgc3RhdGljIG9yIGEgZHluYW1pYyBXZWIgcHJvamVjdCBpZiB5b3UgaGF2ZSBub3QgYWxyZWFkeQ0KLWRvbmUgc28uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIGV4cGFuZCB5b3VyIHByb2plY3QgYW5kIHJpZ2h0IGNsaWNrIG9uDQoteW91ciBXZWJDb250ZW50IGZvbGRlciBvciBvbiBhIHN1YmZvbGRlciB1bmRlciBXZWJDb250ZW50LiAgPC9jbWQ+PGluZm8+Tm90ZQ0KLXRoYXQgaWYgeW91IGNob29zZSBhbnkgb3RoZXIgZm9sZGVyIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgQ1NTIGZpbGUsIHRoZW4NCi1pdCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgV0FSIGZpbGUgdGhhdCBpcyBkZXBsb3llZCB0byB0aGUgc2VydmVyLiA8L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgY29udGV4dCBtZW51LCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5PdGhlcjwvdWljb250cm9sPjx1aWNvbnRyb2w+V2ViPC91aWNvbnRyb2w+PHVpY29udHJvbD5DU1M8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi48L2NtZD48c3RlcHJlc3VsdD5UaGUgTmV3IENhc2NhZGluZyBTdHlsZSBTaGVldCB3aW5kb3cgYXBwZWFycw0KLXdpdGggeW91ciBmb2xkZXIgc2VsZWN0ZWQ8L3N0ZXByZXN1bHQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VHlwZSBhIGZpbGUgbmFtZSBpbnRvIHRoZSBGaWxlIG5hbWUgZmllbGQsIG1ha2luZyBzdXJlIHlvdSBpbmNsdWRlDQotYSBjc3MgZXh0ZW5zaW9uIGluIHRoZSBmaWxlIG5hbWUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+IFlvdSBoYXZlIHNldmVyYWwgb3B0aW9ucyBmb3IgcHJvY2VlZGluZzo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPlRvIGFjY2VwdCB0aGUgZGVmYXVsdHMgYXNzb2NpYXRlZCB3aXRoIGEgbmV3IENTUyBmaWxlLCBzZWxlY3QgPHVpY29udHJvbD5GaW5pc2guPC91aWNvbnRyb2w+PC9jaG9pY2U+DQotPGNob2ljZT4gVG8gdXNlIGEgdGVtcGxhdGUgZmlsZSBmb3IgdGhlIGluaXRpYWwgY29udGVudCBvZiB5b3VyIENTUyBmaWxlLA0KLXNlbGVjdCA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uIFRoZSBTZWxlY3QgQ1NTIFRlbXBsYXRlIHdpbmRvdyBhcHBlYXJzLg0KLVNlbGVjdCB0aGUgPHVpY29udHJvbD5Vc2UgQ1NTIFRlbXBsYXRlPC91aWNvbnRyb2w+IGNoZWNrIGJveCwgYW5kIHRoZW4gc2VsZWN0DQotb25lIG9mIHRoZSBzYW1wbGUgdGVtcGxhdGVzLiBZb3UgY2FuIGFsc28gc2VsZWN0IHRoZSA8dWljb250cm9sPkNTUyBUZW1wbGF0ZXM8L3VpY29udHJvbD4gbGluaw0KLXRvIGFkZCBvciByZW1vdmUgSFRNTCB0ZW1wbGF0ZXMgdG8geW91ciBsaXN0IG9mIHRlbXBsYXRlcy48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzdHlsZXNoZWV0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHN0eWxlc2hlZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZmMGEwYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHN0eWxlc2hlZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGNhc2NhZGluZyBzdHlsZSBzaGVldHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQ2FzY2FkaW5nIHN0eWxlIHNoZWV0cyBlbmFibGUgeW91IHRvIGRlZmluZSBhIGNvbnNpc3RlbnQgbG9vayBhbmQgZmVlbCB0aHJvdWdob3V0IHlvdXIgV2ViIHNpdGUgYnkgbWFpbnRhaW5pbmcgdGhlIGNvbnRlbnRzIChXZWIgcGFnZXMpIGFuZCB0aGUgZGVzaWduICh0aGUgc3R5bGUgc2hlZXQpIHNlcGFyYXRlbHkuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkNhc2NhZGluZyBzdHlsZSBzaGVldHMgZW5hYmxlIHlvdSB0byBkZWZpbmUgYSBjb25zaXN0ZW50IGxvb2sgYW5kIGZlZWwgdGhyb3VnaG91dCB5b3VyIFdlYiBzaXRlIGJ5IG1haW50YWluaW5nIHRoZSBjb250ZW50cyAoV2ViIHBhZ2VzKSBhbmQgdGhlIGRlc2lnbiAodGhlIHN0eWxlIHNoZWV0KSBzZXBhcmF0ZWx5LiIgLz4KLTxtZXRhIGNvbnRlbnQ9InN0eWxlIHNoZWV0cywgY3JlYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzdHlsZSBzaGVldHMsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3R5bGVzaGVldCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGNhc2NhZGluZyBzdHlsZSBzaGVldHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzdHlsZXNoZWV0Ij48YSBuYW1lPSJ0c3R5bGVzaGVldCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0czwvaDE+Ci0KLQotCi08ZGl2PjxwPkNhc2NhZGluZyBzdHlsZSBzaGVldHMgZW5hYmxlIHlvdSB0byBkZWZpbmUgYSBjb25zaXN0ZW50IGxvb2sgYW5kCi1mZWVsIHRocm91Z2hvdXQgeW91ciBXZWIgc2l0ZSBieSBtYWludGFpbmluZyB0aGUgY29udGVudHMgKFdlYiBwYWdlcykgYW5kCi10aGUgZGVzaWduICh0aGUgc3R5bGUgc2hlZXQpIHNlcGFyYXRlbHkuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSBuZXcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0OjwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSBhIHN0YXRpYyBvciBhIGR5bmFtaWMgV2ViIHByb2plY3QgaWYgeW91IGhhdmUgbm90IGFscmVhZHkKLWRvbmUgc28uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIGV4cGFuZCB5b3VyIHByb2plY3QgYW5kIHJpZ2h0IGNsaWNrIG9uCi15b3VyIFdlYkNvbnRlbnQgZm9sZGVyIG9yIG9uIGEgc3ViZm9sZGVyIHVuZGVyIFdlYkNvbnRlbnQuICA8L3NwYW4+IE5vdGUKLXRoYXQgaWYgeW91IGNob29zZSBhbnkgb3RoZXIgZm9sZGVyIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgQ1NTIGZpbGUsIHRoZW4KLWl0IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBXQVIgZmlsZSB0aGF0IGlzIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXIuIAotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSBjb250ZXh0IG1lbnUsIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYjwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DU1M8L3NwYW4+Ci08L3NwYW4+Ljwvc3Bhbj4gVGhlIE5ldyBDYXNjYWRpbmcgU3R5bGUgU2hlZXQgd2luZG93IGFwcGVhcnMKLXdpdGggeW91ciBmb2xkZXIgc2VsZWN0ZWQ8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBmaWxlIG5hbWUgaW50byB0aGUgRmlsZSBuYW1lIGZpZWxkLCBtYWtpbmcgc3VyZSB5b3UgaW5jbHVkZQotYSBjc3MgZXh0ZW5zaW9uIGluIHRoZSBmaWxlIG5hbWUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+IFlvdSBoYXZlIHNldmVyYWwgb3B0aW9ucyBmb3IgcHJvY2VlZGluZzo8L3NwYW4+Ci08dWw+Ci08bGk+VG8gYWNjZXB0IHRoZSBkZWZhdWx0cyBhc3NvY2lhdGVkIHdpdGggYSBuZXcgQ1NTIGZpbGUsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2guPC9zcGFuPjwvbGk+Ci0KLTxsaT4gVG8gdXNlIGEgdGVtcGxhdGUgZmlsZSBmb3IgdGhlIGluaXRpYWwgY29udGVudCBvZiB5b3VyIENTUyBmaWxlLAotc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+LiBUaGUgU2VsZWN0IENTUyBUZW1wbGF0ZSB3aW5kb3cgYXBwZWFycy4KLVNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VXNlIENTUyBUZW1wbGF0ZTwvc3Bhbj4gY2hlY2sgYm94LCBhbmQgdGhlbiBzZWxlY3QKLW9uZSBvZiB0aGUgc2FtcGxlIHRlbXBsYXRlcy4gWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q1NTIFRlbXBsYXRlczwvc3Bhbj4gbGluawotdG8gYWRkIG9yIHJlbW92ZSBIVE1MIHRlbXBsYXRlcyB0byB5b3VyIGxpc3Qgb2YgdGVtcGxhdGVzLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVwcmouZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXByai5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2MzYjNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXByai5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTwhLS0gQXJib3JUZXh0LCBJbmMuLCAxOTg4LTIwMDIsIHYuNDAwMi0tPg0KLTx0YXNrIGlkPSJ0d2NyZXByaiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0PC90aXRsZT4NCi08c2hvcnRkZXNjPllvdSBjcmVhdGUgYW5kIG1haW50YWluIHRoZSByZXNvdXJjZXMgZm9yIHlvdXIgV2ViIGFwcGxpY2F0aW9ucw0KLWluIFdlYiBwcm9qZWN0cy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgcHJvamVjdHM8aW5kZXh0ZXJtPmNyZWF0aW5nIGR5bmFtaWMgcHJvamVjdHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldlYiBhcHBsaWNhdGlvbnM8aW5kZXh0ZXJtPnJlc291cmNlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPiBVbmxpa2Ugd2l0aCA8eHJlZiBocmVmPSJ0d2NyZXN0YS5kaXRhIiBzY29wZT0icGVlciI+PGRlc2M+PC9kZXNjPnN0YXRpYzwveHJlZj4gV2ViDQotcHJvamVjdHMsICBkeW5hbWljIFdlYiBwcm9qZWN0cyBlbmFibGUgeW91IHRvIGNyZWF0ZSByZXNvdXJjZXMgc3VjaCBhcyBKYXZhU2VydmVyDQotUGFnZXMgYW5kIHNlcnZsZXRzLjwvcD48cD5UbyBjcmVhdGUgYSBuZXcgZHluYW1pYyBXZWIgcHJvamVjdCwgY29tcGxldGUgdGhlDQotZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgcmlnaHQgY2xpY2sgb24gRHluYW1pYyBXZWIgUHJvamVjdHMsIGFuZA0KLXNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48dWljb250cm9sPkR5bmFtaWMgV2ViIFByb2plY3Q8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBmcm9tIHRoZSBjb250ZXh0IG1lbnUuIFRoZSBOZXcgRHluYW1pYyBXZWIgUHJvamVjdCB3aXphcmQgc3RhcnRzLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkZvbGxvdyB0aGUgcHJvamVjdCB3aXphcmQgcHJvbXB0cy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48cD48Yj5HZW5lcmFsIEluZm9ybWF0aW9uPC9iPjwvcD48ZGw+PGRsZW50cnk+DQotPGR0PlByb2plY3QgRmFjZXRzIDwvZHQ+DQotPGRkPkEgZmFjZXQgcmVwcmVzZW50cyBhIHVuaXQgb2YgZnVuY3Rpb25hbGl0eSBpbiBhIFdlYiBwcm9qZWN0LiBGb3IgZXhhbXBsZSwNCi10aGUgRHluYW1pYyBXZWIgTW9kdWxlIGZhY2V0IGVuYWJsZXMgdGhlIHByb2plY3QgdG8gYmUgZGVwbG95ZWQgYXMgYSBkeW5hbWljDQotV2ViIG1vZHVsZS4gQSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIHByb2plY3QgZmFjZXQgYXBwZWFycyBpbiB0aGUgd2l6YXJkIHdoZW4NCi15b3Ugc2VsZWN0IGl0LiAgTm90ZSB0aGF0IGluIG1hbnkgaW5zdGFuY2VzLCB5b3UgY2FuIHZpZXcgdGhlIGNvbnN0cmFpbnRzDQotZm9yIGEgcHJvamVjdCBmYWNldCBieSByaWdodCBjbGlja2luZyBvbiB0aGUgZmFjZXQgYW5kIHNlbGVjdGluZyBwcm9qZWN0IGNvbnN0cmFpbnRzDQotZnJvbSB0aGUgcG9wIHVwIG1lbnUuICA8L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+VGFyZ2V0IFJ1bnRpbWU8L2R0Pg0KLTxkZD5Vc2UgdGhpcyBmaWVsZCB0byBkZWZpbmUgYSBuZXcgaW5zdGFsbGVkIHJ1bnRpbWUgZW52aXJvbm1lbnQuIFJ1bnRpbWVzDQotYXJlIHVzZWQgYXQgYnVpbGQgdGltZSB0byBjb21waWxlIHByb2plY3RzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5FbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgKEVBUiBQcm9qZWN0KTwvZHQ+DQotPGRkPkEgbmV3IG9yIGV4aXN0aW5nIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCAoRUFSIFByb2plY3QpIG11c3QgYmUNCi1hc3NvY2lhdGVkIHdpdGggeW91ciBuZXcgV2ViIHByb2plY3QgdG8gZmFjaWxpdGF0ZSBkZXBsb3ltZW50LiBJZiB5b3Ugd2FudA0KLXRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNldHRpbmdzIGZvciB0aGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0LCB5b3UNCi1jYW4gZG8gc28gdXNpbmcgdGhlIHdpemFyZC4gV2hlbiB5b3VyIFdlYiBwcm9qZWN0IGlzIGNyZWF0ZWQgYXQgdGhlIGVuZCBvZg0KLXRoZSB3aXphcmQsIHRoZSBuZXcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IGlzIGFsc28gY3JlYXRlZCB3aXRoIHRoZQ0KLW5hbWUgc3BlY2lmaWVkIGluIHRoZSBFQVIgcHJvamVjdCBmaWVsZC4gTm90ZSB0aGF0IHRoZSBkZWZhdWx0IGlzIHRoZSBuYW1lDQotb2YgdGhlIHdlYiBwcm9qZWN0IGFwcGVuZGVkIHdpdGggRUFSICh1bmxlc3MgdGhlIGVhciBwcm9qZWN0IHdhcyBzZWxlY3RlZA0KLXdoZW4geW91IG9wZW5lZCB0aGUgd2l6YXJkLik8L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+Q29udGV4dCBSb290PC9kdD4NCi08ZGQ+VGhlIGNvbnRleHQgcm9vdCBpcyB0aGUgV2ViIGFwcGxpY2F0aW9uIHJvb3QsIHdoaWNoIGlzIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5DQotb2YgeW91ciBhcHBsaWNhdGlvbiB3aGVuIGl0IGlzIGRlcGxveWVkIHRvIHRoZSBXZWIgc2VydmVyLiBZb3UgY2FuIGNoYW5nZQ0KLXRoZSBjb250ZXh0IHJvb3QgYWZ0ZXIgeW91IGNyZWF0ZSBhIHByb2plY3QgdXNpbmcgdGhlIHByb2plY3QgUHJvcGVydGllcyBkaWFsb2csDQotd2hpY2ggeW91IGFjY2VzcyBmcm9tIHRoZSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUuIFRoZSBjb250ZXh0IHJvb3QgY2FuIGFsc28NCi1iZSB1c2VkIGJ5IHRoZSBsaW5rcyBidWlsZGVyIHRvIGVuc3VyZSB0aGF0IHlvdXIgbGlua3MgcmVtYWluIHJlYWR5IHRvIHB1Ymxpc2gNCi1hcyB5b3UgbW92ZSBhbmQgcmVuYW1lIGZpbGVzIGluc2lkZSB5b3VyIHByb2plY3QuPC9kZD4NCi08L2RsZW50cnk+PC9kbD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3JlcHJqLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVwcmouaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhZTdkMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVwcmouaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhlIHJlc291cmNlcyBmb3IgeW91ciBXZWIgYXBwbGljYXRpb25zIGluIFdlYiBwcm9qZWN0cy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhlIHJlc291cmNlcyBmb3IgeW91ciBXZWIgYXBwbGljYXRpb25zIGluIFdlYiBwcm9qZWN0cy4iIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIGNyZWF0aW5nIGR5bmFtaWMgcHJvamVjdHMsIFdlYiBhcHBsaWNhdGlvbnMsIHJlc291cmNlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBwcm9qZWN0cywgY3JlYXRpbmcgZHluYW1pYyBwcm9qZWN0cywgV2ViIGFwcGxpY2F0aW9ucywgcmVzb3VyY2VzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqY3JlanNwLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jY3N0YXRpYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2N3ZWJwcmouaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0d2NyZXByaiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdjcmVwcmoiPjxhIG5hbWU9InR3Y3JlcHJqIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3Q8L2gxPgotCi0KLQotPGRpdj48cD5Zb3UgY3JlYXRlIGFuZCBtYWludGFpbiB0aGUgcmVzb3VyY2VzIGZvciB5b3VyIFdlYiBhcHBsaWNhdGlvbnMKLWluIFdlYiBwcm9qZWN0cy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD4gVW5saWtlIHdpdGggPGEgaHJlZj0idHdjcmVzdGEuaHRtbCIgdGl0bGU9IiI+c3RhdGljPC9hPiBXZWIKLXByb2plY3RzLCAgZHluYW1pYyBXZWIgcHJvamVjdHMgZW5hYmxlIHlvdSB0byBjcmVhdGUgcmVzb3VyY2VzIHN1Y2ggYXMgSmF2YVNlcnZlcgotUGFnZXMgYW5kIHNlcnZsZXRzLjwvcD4KLTxwPlRvIGNyZWF0ZSBhIG5ldyBkeW5hbWljIFdlYiBwcm9qZWN0LCBjb21wbGV0ZSB0aGUKLWZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPk9wZW4gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgcmlnaHQgY2xpY2sgb24gRHluYW1pYyBXZWIgUHJvamVjdHMsIGFuZAotc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkR5bmFtaWMgV2ViIFByb2plY3Q8L3NwYW4+Ci08L3NwYW4+IGZyb20gdGhlIGNvbnRleHQgbWVudS4gVGhlIE5ldyBEeW5hbWljIFdlYiBQcm9qZWN0IHdpemFyZCBzdGFydHMuPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkZvbGxvdyB0aGUgcHJvamVjdCB3aXphcmQgcHJvbXB0cy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+PHN0cm9uZz5HZW5lcmFsIEluZm9ybWF0aW9uPC9zdHJvbmc+PC9wPgotPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPlByb2plY3QgRmFjZXRzIDwvZHQ+Ci0KLTxkZD5BIGZhY2V0IHJlcHJlc2VudHMgYSB1bml0IG9mIGZ1bmN0aW9uYWxpdHkgaW4gYSBXZWIgcHJvamVjdC4gRm9yIGV4YW1wbGUsCi10aGUgRHluYW1pYyBXZWIgTW9kdWxlIGZhY2V0IGVuYWJsZXMgdGhlIHByb2plY3QgdG8gYmUgZGVwbG95ZWQgYXMgYSBkeW5hbWljCi1XZWIgbW9kdWxlLiBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGEgcHJvamVjdCBmYWNldCBhcHBlYXJzIGluIHRoZSB3aXphcmQgd2hlbgoteW91IHNlbGVjdCBpdC4gIE5vdGUgdGhhdCBpbiBtYW55IGluc3RhbmNlcywgeW91IGNhbiB2aWV3IHRoZSBjb25zdHJhaW50cwotZm9yIGEgcHJvamVjdCBmYWNldCBieSByaWdodCBjbGlja2luZyBvbiB0aGUgZmFjZXQgYW5kIHNlbGVjdGluZyBwcm9qZWN0IGNvbnN0cmFpbnRzCi1mcm9tIHRoZSBwb3AgdXAgbWVudS4gIDwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlRhcmdldCBSdW50aW1lPC9kdD4KLQotPGRkPlVzZSB0aGlzIGZpZWxkIHRvIGRlZmluZSBhIG5ldyBpbnN0YWxsZWQgcnVudGltZSBlbnZpcm9ubWVudC4gUnVudGltZXMKLWFyZSB1c2VkIGF0IGJ1aWxkIHRpbWUgdG8gY29tcGlsZSBwcm9qZWN0cy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5FbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgKEVBUiBQcm9qZWN0KTwvZHQ+Ci0KLTxkZD5BIG5ldyBvciBleGlzdGluZyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgKEVBUiBQcm9qZWN0KSBtdXN0IGJlCi1hc3NvY2lhdGVkIHdpdGggeW91ciBuZXcgV2ViIHByb2plY3QgdG8gZmFjaWxpdGF0ZSBkZXBsb3ltZW50LiBJZiB5b3Ugd2FudAotdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QsIHlvdQotY2FuIGRvIHNvIHVzaW5nIHRoZSB3aXphcmQuIFdoZW4geW91ciBXZWIgcHJvamVjdCBpcyBjcmVhdGVkIGF0IHRoZSBlbmQgb2YKLXRoZSB3aXphcmQsIHRoZSBuZXcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IGlzIGFsc28gY3JlYXRlZCB3aXRoIHRoZQotbmFtZSBzcGVjaWZpZWQgaW4gdGhlIEVBUiBwcm9qZWN0IGZpZWxkLiBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgaXMgdGhlIG5hbWUKLW9mIHRoZSB3ZWIgcHJvamVjdCBhcHBlbmRlZCB3aXRoIEVBUiAodW5sZXNzIHRoZSBlYXIgcHJvamVjdCB3YXMgc2VsZWN0ZWQKLXdoZW4geW91IG9wZW5lZCB0aGUgd2l6YXJkLik8L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Db250ZXh0IFJvb3Q8L2R0PgotCi08ZGQ+VGhlIGNvbnRleHQgcm9vdCBpcyB0aGUgV2ViIGFwcGxpY2F0aW9uIHJvb3QsIHdoaWNoIGlzIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5Ci1vZiB5b3VyIGFwcGxpY2F0aW9uIHdoZW4gaXQgaXMgZGVwbG95ZWQgdG8gdGhlIFdlYiBzZXJ2ZXIuIFlvdSBjYW4gY2hhbmdlCi10aGUgY29udGV4dCByb290IGFmdGVyIHlvdSBjcmVhdGUgYSBwcm9qZWN0IHVzaW5nIHRoZSBwcm9qZWN0IFByb3BlcnRpZXMgZGlhbG9nLAotd2hpY2ggeW91IGFjY2VzcyBmcm9tIHRoZSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUuIFRoZSBjb250ZXh0IHJvb3QgY2FuIGFsc28KLWJlIHVzZWQgYnkgdGhlIGxpbmtzIGJ1aWxkZXIgdG8gZW5zdXJlIHRoYXQgeW91ciBsaW5rcyByZW1haW4gcmVhZHkgdG8gcHVibGlzaAotYXMgeW91IG1vdmUgYW5kIHJlbmFtZSBmaWxlcyBpbnNpZGUgeW91ciBwcm9qZWN0LjwvZGQ+Ci0KLTwvZGw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2NzdGF0aWMuaHRtbCI+U3RhdGljIFdlYiBwcm9qZWN0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2Njd2VicHJqLmh0bWwiPkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqY3JlanNwLmh0bWwiIHRpdGxlPSIiPkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jlc3RhLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlNTEzMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHdjcmVzdGEiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIGEgc3RhdGljIFdlYiBwcm9qZWN0PC90aXRsZT4NCi08c2hvcnRkZXNjPjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnN0YXRpYyBXZWIgcHJvamVjdHM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5XZWIgcHJvamVjdHM8aW5kZXh0ZXJtPmNyZWF0aW5nIHN0YXRpYzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+IEluIHRoZSB3b3JrYmVuY2gsIHlvdSBjcmVhdGUgYW5kIG1haW50YWluIHJlc291cmNlcyBmb3IgV2ViIGFwcGxpY2F0aW9ucw0KLWluIFdlYiBwcm9qZWN0cy4gSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgc3RhdGljLCBjb250ZW50LWJhc2VkIFdlYiBhcHBsaWNhdGlvbg0KLXRoYXQgY29udGFpbnMgbm8gZHluYW1pYyBlbGVtZW50cywgc3VjaCBhcyBKU1AgZmlsZXMgb3Igc2VydmxldHMsIHVzZSB0aGUgPHBoPjx1aWNvbnRyb2w+TmV3DQotU3RhdGljIFdlYiBQcm9qZWN0PC91aWNvbnRyb2w+PC9waD4gd2l6YXJkLiA8L3A+PHA+VG8gY3JlYXRlIGEgbmV3IHN0YXRpYw0KLVdlYiBwcm9qZWN0LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSA8L2NtZD48aW5mbz48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIHJpZ2h0IGNsaWNrIG9uIE90aGVyIFByb2plY3RzIGFuZCBzZWxlY3QgPGI+TmV3LT5PdGhlci0+V2ViLT5TdGF0aWMNCi1XZWIgUHJvamVjdDwvYj4gZnJvbSB0aGUgY29udGV4dCBtZW51LiBUaGUgTmV3IFN0YXRpYyBXZWIgUHJvamVjdCB3aXphcmQgc3RhcnRzLiA8L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Gb2xsb3cgdGhlIHByb2plY3Qgd2l6YXJkIHByb21wdHM8L2NtZD48aW5mbz48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PHA+PGI+R2VuZXJhbCBJbmZvcm1hdGlvbjwvYj48L3A+PGRsPjxkbGVudHJ5Pg0KLTxkdD5Qcm9qZWN0IEZhY2V0cyA8L2R0Pg0KLTxkZD5BIGZhY2V0IHJlcHJlc2VudHMgYSB1bml0IG9mIGZ1bmN0aW9uYWxpdHkgaW4gYSBXZWIgcHJvamVjdC4gRm9yIGV4YW1wbGUsDQotdGhlIFN0YXRpYyBXZWIgTW9kdWxlIGZhY2V0IGVuYWJsZXMgdGhlIHByb2plY3QgdG8gYmUgZGVwbG95ZWQgYXMgYSBzdGF0aWMNCi1XZWIgbW9kdWxlLiBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGEgcHJvamVjdCBmYWNldCBhcHBlYXJzIGluIHRoZSB3aXphcmQgd2hlbg0KLXlvdSBzZWxlY3QgaXQuICBOb3RlIHRoYXQgaW4gbWFueSBpbnN0YW5jZXMsIHlvdSBjYW4gdmlldyB0aGUgY29uc3RyYWludHMNCi1mb3IgYSBwcm9qZWN0IGZhY2V0IGJ5IHJpZ2h0IGNsaWNraW5nIG9uIHRoZSBmYWNldCBhbmQgc2VsZWN0aW5nIHByb2plY3QgY29uc3RyYWludHMNCi1mcm9tIHRoZSBwb3AgdXAgbWVudS4gIDwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5UYXJnZXQgUnVudGltZTwvZHQ+DQotPGRkPlVzZSB0aGlzIGZpZWxkIHRvIGRlZmluZSBhIG5ldyBpbnN0YWxsZWQgcnVudGltZSBlbnZpcm9ubWVudC4gUnVudGltZXMNCi1hcmUgdXNlZCBhdCBidWlsZCB0aW1lIHRvIGNvbXBpbGUgcHJvamVjdHMuIDwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PGRsPjxkbGVudHJ5Pg0KLTxkdD5XZWIgQ29udGVudCBGb2xkZXI8L2R0Pg0KLTxkZD5UaGUgZm9sZGVyIGluIHdoaWNoIHlvdSB3YW50IHRvIHN0b3JlIHlvdXIgcHVibGlzaGFibGUgcmVzb3VyY2VzLiA8L2RkPg0KLTwvZGxlbnRyeT48L2RsPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDlhZjA4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiIgLz4KLTxtZXRhIGNvbnRlbnQ9InN0YXRpYyBXZWIgcHJvamVjdHMsIGNyZWF0aW5nLCBXZWIgcHJvamVjdHMsIGNyZWF0aW5nIHN0YXRpYyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InN0YXRpYyBXZWIgcHJvamVjdHMsIGNyZWF0aW5nLCBXZWIgcHJvamVjdHMsIGNyZWF0aW5nIHN0YXRpYyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jY3N0YXRpYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3Y3Jlc3RhIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3Y3Jlc3RhIj48YSBuYW1lPSJ0d2NyZXN0YSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3Q8L2gxPgotCi0KLQotPGRpdj48cCAvPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD4gSW4gdGhlIHdvcmtiZW5jaCwgeW91IGNyZWF0ZSBhbmQgbWFpbnRhaW4gcmVzb3VyY2VzIGZvciBXZWIgYXBwbGljYXRpb25zCi1pbiBXZWIgcHJvamVjdHMuIElmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIHN0YXRpYywgY29udGVudC1iYXNlZCBXZWIgYXBwbGljYXRpb24KLXRoYXQgY29udGFpbnMgbm8gZHluYW1pYyBlbGVtZW50cywgc3VjaCBhcyBKU1AgZmlsZXMgb3Igc2VydmxldHMsIHVzZSB0aGUgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3Ci1TdGF0aWMgV2ViIFByb2plY3Q8L3NwYW4+PC9zcGFuPiB3aXphcmQuIDwvcD4KLTxwPlRvIGNyZWF0ZSBhIG5ldyBzdGF0aWMKLVdlYiBwcm9qZWN0LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUgPC9zcGFuPiA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLCByaWdodCBjbGljayBvbiBPdGhlciBQcm9qZWN0cyBhbmQgc2VsZWN0IDxzdHJvbmc+TmV3LSZndDtPdGhlci0mZ3Q7V2ViLSZndDtTdGF0aWMKLVdlYiBQcm9qZWN0PC9zdHJvbmc+IGZyb20gdGhlIGNvbnRleHQgbWVudS4gVGhlIE5ldyBTdGF0aWMgV2ViIFByb2plY3Qgd2l6YXJkIHN0YXJ0cy4gPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gb2xsb3cgdGhlIHByb2plY3Qgd2l6YXJkIHByb21wdHM8L3NwYW4+IDwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPjxzdHJvbmc+R2VuZXJhbCBJbmZvcm1hdGlvbjwvc3Ryb25nPjwvcD4KLTxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Qcm9qZWN0IEZhY2V0cyA8L2R0PgotCi08ZGQ+QSBmYWNldCByZXByZXNlbnRzIGEgdW5pdCBvZiBmdW5jdGlvbmFsaXR5IGluIGEgV2ViIHByb2plY3QuIEZvciBleGFtcGxlLAotdGhlIFN0YXRpYyBXZWIgTW9kdWxlIGZhY2V0IGVuYWJsZXMgdGhlIHByb2plY3QgdG8gYmUgZGVwbG95ZWQgYXMgYSBzdGF0aWMKLVdlYiBtb2R1bGUuIEEgYnJpZWYgZGVzY3JpcHRpb24gb2YgYSBwcm9qZWN0IGZhY2V0IGFwcGVhcnMgaW4gdGhlIHdpemFyZCB3aGVuCi15b3Ugc2VsZWN0IGl0LiAgTm90ZSB0aGF0IGluIG1hbnkgaW5zdGFuY2VzLCB5b3UgY2FuIHZpZXcgdGhlIGNvbnN0cmFpbnRzCi1mb3IgYSBwcm9qZWN0IGZhY2V0IGJ5IHJpZ2h0IGNsaWNraW5nIG9uIHRoZSBmYWNldCBhbmQgc2VsZWN0aW5nIHByb2plY3QgY29uc3RyYWludHMKLWZyb20gdGhlIHBvcCB1cCBtZW51LiAgPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+VGFyZ2V0IFJ1bnRpbWU8L2R0PgotCi08ZGQ+VXNlIHRoaXMgZmllbGQgdG8gZGVmaW5lIGEgbmV3IGluc3RhbGxlZCBydW50aW1lIGVudmlyb25tZW50LiBSdW50aW1lcwotYXJlIHVzZWQgYXQgYnVpbGQgdGltZSB0byBjb21waWxlIHByb2plY3RzLiA8L2RkPgotCi08L2RsPgotPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPldlYiBDb250ZW50IEZvbGRlcjwvZHQ+Ci0KLTxkZD5UaGUgZm9sZGVyIGluIHdoaWNoIHlvdSB3YW50IHRvIHN0b3JlIHlvdXIgcHVibGlzaGFibGUgcmVzb3VyY2VzLiA8L2RkPgotCi08L2RsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2Njc3RhdGljLmh0bWwiPlN0YXRpYyBXZWIgcHJvamVjdHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jld2FyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2OTlhYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHdjcmV3YXIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+ZXhwb3J0aW5nPGluZGV4dGVybT5XQVIgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldBUiBmaWxlczxpbmRleHRlcm0+ZXhwb3J0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5XZWIgcHJvamVjdHM8aW5kZXh0ZXJtPmV4cG9ydGluZyBXQVIgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD4gQSBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlIGlzIGEgcGFja2FnZWQgV2ViIGFwcGxpY2F0aW9uIHRoYXQNCi1jYW4gYmUgZXhwb3J0ZWQgdG8gdGVzdCwgcHVibGlzaCwgYW5kIGRlcGxveSB0aGUgcmVzb3VyY2VzIGRldmVsb3BlZCB3aXRoaW4NCi1hIFdlYiBwcm9qZWN0LjwvcD48cD5UbyBleHBvcnQgYSBXQVIgZmlsZSBmcm9tIGEgV2ViIHByb2plY3QsIGRvIHRoZSBmb2xsb3dpbmc6IDwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+UmlnaHQgY2xpY2sgb24gYSBXZWIgcHJvamVjdCBmb2xkZXIgYW5kIHNlbGVjdCA8Yj5FeHBvcnQ8L2I+IGZyb20NCi10aGUgcG9wLXVwIG1lbnUuIFRoZW4gc2VsZWN0PGI+IFdBUiBmaWxlPC9iPiBpbiB0aGUgRXhwb3J0IHdpbmRvdyBhbmQgdGhlbg0KLXNlbGVjdCA8Yj5OZXh0PC9iPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TcGVjaWZ5IHRoZSBXZWIgcHJvamVjdCB5b3Ugd2FudCB0byBleHBvcnQgKHRoaXMgZmllbGQgaXMgcHJpbWVkDQotaWYgeW91IHVzZWQgdGhlIHBvcC11cCBtZW51IHRvIG9wZW4gdGhlIHdpemFyZCksIGFuZCBzcGVjaWZ5IGEgbG9jYXRpb24gZm9yDQotdGhlIG5ldyBXQVIgZmlsZTwvY21kPjwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5PcHRpb25hbGx5LCBzdXBwbHkgV0FSIGV4cG9ydCA8cGg+T3B0aW9uczwvcGg+LA0KLXN1Y2ggYXMgd2hldGhlciBvciBub3QgdG8gaW5jbHVkZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBzb3VyY2UgZmlsZXMgaW4gdGhlIFdBUiwgYW5kIHdoZXRoZXINCi10byBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIHJlc291cmNlcyBkdXJpbmcgdGhlIGV4cG9ydCBwcm9jZXNzLiA8L2NtZD48aW5mbz5Tb3VyY2UNCi1maWxlcyBhcmUgbm90IHVzdWFsbHkgaW5jbHVkZWQgaW4gYSBXQVIgZmlsZSwgYmVjYXVzZSB0aGV5IGFyZSBub3QgbmVjZXNzYXJ5DQotZm9yIHRoZSBzZXJ2ZXIgdG8gcnVuIHRoZSB3ZWIgYXBwbGljYXRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDxwaD48dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPjwvcGg+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXdhci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jld2FyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYTY1NzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jld2FyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXMiIC8+Ci08bWV0YSBjb250ZW50PSJleHBvcnRpbmcsIFdBUiBmaWxlcywgV2ViIHByb2plY3RzLCBleHBvcnRpbmcgV0FSIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iZXhwb3J0aW5nLCBXQVIgZmlsZXMsIFdlYiBwcm9qZWN0cywgZXhwb3J0aW5nIFdBUiBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3dhcm92ci5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3Y3Jld2FyIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d2NyZXdhciI+PGEgbmFtZT0idHdjcmV3YXIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlczwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD4gQSBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlIGlzIGEgcGFja2FnZWQgV2ViIGFwcGxpY2F0aW9uIHRoYXQKLWNhbiBiZSBleHBvcnRlZCB0byB0ZXN0LCBwdWJsaXNoLCBhbmQgZGVwbG95IHRoZSByZXNvdXJjZXMgZGV2ZWxvcGVkIHdpdGhpbgotYSBXZWIgcHJvamVjdC48L3A+Ci08cD5UbyBleHBvcnQgYSBXQVIgZmlsZSBmcm9tIGEgV2ViIHByb2plY3QsIGRvIHRoZSBmb2xsb3dpbmc6IDwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIG9uIGEgV2ViIHByb2plY3QgZm9sZGVyIGFuZCBzZWxlY3QgPHN0cm9uZz5FeHBvcnQ8L3N0cm9uZz4gZnJvbQotdGhlIHBvcC11cCBtZW51LiBUaGVuIHNlbGVjdDxzdHJvbmc+IFdBUiBmaWxlPC9zdHJvbmc+IGluIHRoZSBFeHBvcnQgd2luZG93IGFuZCB0aGVuCi1zZWxlY3QgPHN0cm9uZz5OZXh0PC9zdHJvbmc+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIFdlYiBwcm9qZWN0IHlvdSB3YW50IHRvIGV4cG9ydCAodGhpcyBmaWVsZCBpcyBwcmltZWQKLWlmIHlvdSB1c2VkIHRoZSBwb3AtdXAgbWVudSB0byBvcGVuIHRoZSB3aXphcmQpLCBhbmQgc3BlY2lmeSBhIGxvY2F0aW9uIGZvcgotdGhlIG5ldyBXQVIgZmlsZTwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPk9wdGlvbmFsbHksIHN1cHBseSBXQVIgZXhwb3J0IDxzcGFuPk9wdGlvbnM8L3NwYW4+LAotc3VjaCBhcyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIEphdmHihKIgc291cmNlIGZpbGVzIGluIHRoZSBXQVIsIGFuZCB3aGV0aGVyCi10byBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIHJlc291cmNlcyBkdXJpbmcgdGhlIGV4cG9ydCBwcm9jZXNzLiA8L3NwYW4+IFNvdXJjZQotZmlsZXMgYXJlIG5vdCB1c3VhbGx5IGluY2x1ZGVkIGluIGEgV0FSIGZpbGUsIGJlY2F1c2UgdGhleSBhcmUgbm90IG5lY2Vzc2FyeQotZm9yIHRoZSBzZXJ2ZXIgdG8gcnVuIHRoZSB3ZWIgYXBwbGljYXRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d3YXJvdnIuaHRtbCI+V2ViIGFyY2hpdmUgKFdBUikgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Zzci5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Zzci5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmNmY2M4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2N2c3IuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHdjdnNyIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXR0aW5nIENWUyByZXBvc2l0b3J5IGRlZmF1bHRzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5idWlsZCBvdXRwdXQgZm9sZGVyczxpbmRleHRlcm0+aWdub3JpbmcgaW4gQ1ZTPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5DVlM8aW5kZXh0ZXJtPnNldHRpbmcgcmVwb3NpdG9yeSBkZWZhdWx0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+Y3ZzaWdub3JlIGZpbGVzPGluZGV4dGVybT5jcmVhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+cmVwb3NpdG9yaWVzPGluZGV4dGVybT5kZWZhdWx0IENWUyBzZXR0aW5nczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPldoZW4geW91IHVzZSBhIENWUyByZXBvc2l0b3J5IGR1cmluZyB0ZWFtIGRldmVsb3BtZW50LCB5b3UgbWlnaHQNCi13YW50IHRvIHVzZSB0aGUgZm9sbG93aW5nIHNldHVwIHRvIGVuc3VyZSB0aGF0IHRoZSBDVlMgdmVyc2lvbmluZyBzdXBwb3J0DQotaWdub3JlcyB0aGUgcHJvamVjdCdzIGJ1aWxkIG91dHB1dCBmb2xkZXI6PC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q3JlYXRlIGEgZmlsZSBjYWxsZWQgLmN2c2lnbm9yZSBpbiB5b3VyIHByb2plY3QncyA8ZmlsZXBhdGg+V2ViQ29udGVudC9XRUItSU5GPC9maWxlcGF0aD4gZm9sZGVyLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoaXMgZmlsZSwgYWRkIGEgbGluZSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBvdXRwdXQgZm9sZGVyDQotKGZvciBleGFtcGxlLCA8Y29kZXBoPmNsYXNzZXM8L2NvZGVwaD4pLjwvY21kPjxpbmZvPjxwPkN1cnJlbnRseSwgeW91IGhhdmUNCi10aGUgb3B0aW9uIG9mIGNyZWF0aW5nIHRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IChhcyBhIGZlYXR1cmUpIHdoZW4gdXNpbmcgdGhlDQotTmV3IER5bmFtaWMgV2ViIFByb2plY3Qgd2l6YXJkLjwvcD48cD5XaGVuIHlvdSBzeW5jaHJvbml6ZSB3aXRoIGEgQ1ZTIHRlYW0NCi1zdHJlYW0sIHRoZSBvdXRwdXQgZm9sZGVyIHdpbGwgYmUgaWdub3JlZC48L3A+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIGFkZGl0aW9uLCB5b3Ugc2hvdWxkIHR1cm4gb2ZmIHRoZSA8cGg+PHVpY29udHJvbD5QcnVuZSBlbXB0eQ0KLWRpcmVjdG9yaWVzPC91aWNvbnRyb2w+PC9waD4gb3B0aW9uLiBTZWxlY3QgPHBoPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvd3M8L3VpY29udHJvbD4NCi08dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L3BoPiwgc3dpdGNoIHRvIHRoZSA8cGg+PG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+VGVhbTwvdWljb250cm9sPjx1aWNvbnRyb2w+Q1ZTPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L3BoPiBwcm9wZXJ0aWVzDQotcGFnZSwgYW5kIGVuc3VyZSB0aGF0IHRoZSA8cGg+PHVpY29udHJvbD5QcnVuZSBlbXB0eSBkaXJlY3RvcmllczwvdWljb250cm9sPjwvcGg+IGNoZWNrDQotYm94IGlzIG5vdCBjaGVja2VkLjwvY21kPjxpbmZvPjxwPklmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIHlvdXIgV2ViIHByb2plY3Qncw0KLXNvdXJjZSBkaXJlY3RvcnkgaXMgZW1wdHksIGl0IHdpbGwgYmUgZGVsZXRlZCB3aGVuIHRoZSBwcm9qZWN0IGlzIGFkZGVkIHRvDQoteW91ciB3b3Jrc3BhY2UgZnJvbSBhIENWUyByZXBvc2l0b3J5LCBjYXVzaW5nIGEgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYnVpbGQgZXJyb3IuPC9wPjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjdnNyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjdnNyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNmU1MmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Zzci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0cyIgLz4KLTxtZXRhIGNvbnRlbnQ9ImJ1aWxkIG91dHB1dCBmb2xkZXJzLCBpZ25vcmluZyBpbiBDVlMsIENWUywgc2V0dGluZyByZXBvc2l0b3J5IGRlZmF1bHRzLCBjdnNpZ25vcmUgZmlsZXMsIGNyZWF0aW5nLCByZXBvc2l0b3JpZXMsIGRlZmF1bHQgQ1ZTIHNldHRpbmdzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iYnVpbGQgb3V0cHV0IGZvbGRlcnMsIGlnbm9yaW5nIGluIENWUywgQ1ZTLCBzZXR0aW5nIHJlcG9zaXRvcnkgZGVmYXVsdHMsIGN2c2lnbm9yZSBmaWxlcywgY3JlYXRpbmcsIHJlcG9zaXRvcmllcywgZGVmYXVsdCBDVlMgc2V0dGluZ3MiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3Y3ZzciIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNldHRpbmcgQ1ZTIHJlcG9zaXRvcnkgZGVmYXVsdHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3Y3ZzciI+PGEgbmFtZT0idHdjdnNyIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZXR0aW5nIENWUyByZXBvc2l0b3J5IGRlZmF1bHRzPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPldoZW4geW91IHVzZSBhIENWUyByZXBvc2l0b3J5IGR1cmluZyB0ZWFtIGRldmVsb3BtZW50LCB5b3UgbWlnaHQKLXdhbnQgdG8gdXNlIHRoZSBmb2xsb3dpbmcgc2V0dXAgdG8gZW5zdXJlIHRoYXQgdGhlIENWUyB2ZXJzaW9uaW5nIHN1cHBvcnQKLWlnbm9yZXMgdGhlIHByb2plY3QncyBidWlsZCBvdXRwdXQgZm9sZGVyOjwvcD4KLSA8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DcmVhdGUgYSBmaWxlIGNhbGxlZCAuY3ZzaWdub3JlIGluIHlvdXIgcHJvamVjdCdzIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+V2ViQ29udGVudC9XRUItSU5GPC9zcGFuPiBmb2xkZXIuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGlzIGZpbGUsIGFkZCBhIGxpbmUgd2l0aCB0aGUgbmFtZSBvZiB0aGUgYnVpbGQgb3V0cHV0IGZvbGRlcgotKGZvciBleGFtcGxlLCA8c2FtcCBjbGFzcz0iY29kZXBoIj5jbGFzc2VzPC9zYW1wPikuPC9zcGFuPiA8cD5DdXJyZW50bHksIHlvdSBoYXZlCi10aGUgb3B0aW9uIG9mIGNyZWF0aW5nIHRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IChhcyBhIGZlYXR1cmUpIHdoZW4gdXNpbmcgdGhlCi1OZXcgRHluYW1pYyBXZWIgUHJvamVjdCB3aXphcmQuPC9wPgotPHA+V2hlbiB5b3Ugc3luY2hyb25pemUgd2l0aCBhIENWUyB0ZWFtCi1zdHJlYW0sIHRoZSBvdXRwdXQgZm9sZGVyIHdpbGwgYmUgaWdub3JlZC48L3A+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIGFkZGl0aW9uLCB5b3Ugc2hvdWxkIHR1cm4gb2ZmIHRoZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5QcnVuZSBlbXB0eQotZGlyZWN0b3JpZXM8L3NwYW4+PC9zcGFuPiBvcHRpb24uIFNlbGVjdCA8c3Bhbj48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvd3M8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj48L3NwYW4+PC9zcGFuPiwgc3dpdGNoIHRvIHRoZSA8c3Bhbj48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGVhbTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DVlM8L3NwYW4+PC9zcGFuPjwvc3Bhbj4gcHJvcGVydGllcwotcGFnZSwgYW5kIGVuc3VyZSB0aGF0IHRoZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5QcnVuZSBlbXB0eSBkaXJlY3Rvcmllczwvc3Bhbj48L3NwYW4+IGNoZWNrCi1ib3ggaXMgbm90IGNoZWNrZWQuPC9zcGFuPiA8cD5JZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkIGFuZCB5b3VyIFdlYiBwcm9qZWN0J3MKLXNvdXJjZSBkaXJlY3RvcnkgaXMgZW1wdHksIGl0IHdpbGwgYmUgZGVsZXRlZCB3aGVuIHRoZSBwcm9qZWN0IGlzIGFkZGVkIHRvCi15b3VyIHdvcmtzcGFjZSBmcm9tIGEgQ1ZTIHJlcG9zaXRvcnksIGNhdXNpbmcgYSBKYXZh4oSiIGJ1aWxkIGVycm9yLjwvcD4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdmbHR3aXouZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ZsdHdpei5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2M5MmZlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ZsdHdpei5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d2ZsdHdpeiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgRmlsdGVyczwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGUgZmlsdGVycyB3aXphcmQgaGVscHMgeW91IHRvIGNyZWF0ZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBzZXJ2bGV0IGZpbHRlcnMgYnkgd2Fsa2luZyB5b3UgdGhyb3VnaA0KLXRoZSBjcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2UNCi1vciB0aGF0IHlvdSBjYW4gbW9kaWZ5IGZvciB1c2Ugd2l0aCB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIGZpbHRlcnMgY2FuDQotcnVuIG9uIEphdmEgRUUtY29tcGxpYW50IFdlYiBzZXJ2ZXJzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNlcnZsZXRzPGluZGV4dGVybT5jcmVhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPlRvIGNyZWF0ZSBhIGZpbHRlciwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSwgZXhwYW5kIHlvdXIgIDx4cmVmIGhyZWY9ImNjd2VicHJqLmRpdGEiDQotc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5keW5hbWljIHByb2plY3Q8L3hyZWY+IGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+UmlnaHQgY2xpY2sgb24gdGhlIDxiPkZpbHRlcjwvYj4gaWNvbiwgYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48dWljb250cm9sPkZpbHRlcjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGZyb20NCi10aGUgcG9wLXVwIG1lbnUuPC9jbWQ+PHN0ZXByZXN1bHQ+IFRoZSA8dWljb250cm9sPkNyZWF0ZSBGaWx0ZXI8L3VpY29udHJvbD4gd2l6YXJkDQotYXBwZWFycy48L3N0ZXByZXN1bHQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxwPjxiPkdlbmVyYWwgSW5mb3JtYXRpb248L2I+PC9wPjxkbD48ZGxlbnRyeT4NCi08ZHQ+TW9kaWZpZXJzPC9kdD4NCi08ZGQ+VGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldCAyLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gc3RhdGVzDQotdGhhdCBhIFNlcnZsZXQgY2xhc3MgbXVzdCBiZSA8Yj5wdWJsaWM8L2I+IGFuZCBub3QgPGI+YWJzdHJhY3Q8L2I+LiBUaGVyZWZvcmUsDQoteW91IGNhbm5vdCBjaGFuZ2UgdGhlc2UgbW9kaWZpZXJzLiBUaGUgb25seSBvbmUgYXZhaWxhYmxlIGZvciBjaGFuZ2UgaXMgdGhlIDxiPmZpbmFsPC9iPiBtb2RpZmllci48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SW50ZXJmYWNlczwvZHQ+DQotPGRkPlRoZXJlIGlzIG9uZSBvYmxpZ2F0b3J5IGludGVyZmFjZSB0aGF0IGZpbHRlciBjbGFzc2VzIG11c3QgaW1wbGVtZW50OiA8Yj5qYXZheC5zZXJ2bGV0LkZpbHRlcjwvYj4uDQotVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldCBwYWNrYWdlIGFuZCBpcyB1c2VkIHRvIHJlcHJlc2VudA0KLXRoZSBsaWZlLWN5Y2xlIG9mIHRoZSBmaWx0ZXIuIFRoaXMgaW50ZXJmYWNlIGhhcyB0aHJlZSBtZXRob2RzOiBpbml0LCBkb0ZpbHRlcg0KLWFuZCBkZXN0cm95LiA8dWw+DQotPGxpPlRoZSA8Yj5pbml0PC9iPiBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBvbmx5IG9uY2UsIHdoZW4NCi1pdCBmaW5pc2hlcyBpbnN0YW50aWF0aW5nIHRoZSBmaWx0ZXIuPC9saT4NCi08bGk+VGhlPGI+ZG9GaWx0ZXI8L2I+IG1ldGhvZCBpcyB3aGVyZSB0aGUgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZCBhbmQgaXMgY2FsbGVkDQotZXZlcnkgdGltZSBhIHVzZXIgcmVxdWVzdHMgYSByZXNvdXJjZSwgc3VjaCBhcyBhIHNlcnZsZXQsIHRvIHdoaWNoIHRoZSBmaWx0ZXINCi1pcyBtYXBwZWQuPC9saT4NCi08bGk+VGhlIDxiPmRlc3Ryb3k8L2I+IG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZsZXQgY29udGFpbmVyIHRvIHRlbGwgdGhlDQotZmlsdGVyIHRoYXQgaXQgd2lsbCBiZSB0YWtlbiBvdXQgb2Ygc2VydmljZS48L2xpPg0KLTwvdWw+IEFsdGhvdWdoLCB0aGF0IHRoZSBqYXZheC5zZXJ2bGV0LkZpbHRlciBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgaW4gdGhlIDxiPkludGVyZmFjZXM8L2I+IGZpZWxkDQotYnkgZGVmYXVsdCwgeW91IGNhbiBhZGQgYWRkaXRpb25hbCBpbnRlcmZhY2VzIHRvIGltcGxlbWVudCBieSB1c2luZyB0aGUgPGI+QWRkPC9iPiBidXR0b24uPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkludGVyZmFjZSBzZWxlY3Rpb24gZGlhbG9nPC9kdD4NCi08ZGQ+VGhpcyBkaWFsb2cgYXBwZWFycyBpZiB5b3Ugc2VsZWN0IHRvIGFkZCBhbiBpbnRlcmZhY2UgdG8geW91ciBmaWx0ZXIuDQotQXMgeW91IHR5cGUgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0aGF0IHlvdSBhcmUgYWRkaW5nLCBhIGxpc3Qgb2YgYXZhaWxhYmxlDQotaW50ZXJmYWNlcyBsaXN0ZWQgaW4gdGhlIDxiPk1hdGNoaW5nIGl0ZW1zPC9iPiBsaXN0IGJveCB1cGRhdGVzIGR5bmFtaWNhbGx5DQotdG8gZGlzcGxheSBvbmx5IHRoZSBpbnRlcmZhY2VzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uIENob29zZSBhbiBpbnRlcmZhY2UNCi10byBzZWUgdGhlIHF1YWxpZmllciwgYW5kIHRoZW4gY2xpY2sgPGI+T0s8L2I+IHdoZW4gZmluaXNoZWQuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkZpbHRlciBNYXBwaW5nczwvZHQ+DQotPGRkPkZvciBhIGZpbHRlciB0byBpbnRlcmNlcHQgYSByZXF1ZXN0IHRvIGEgc2VydmxldCwgeW91IG11c3Q6IDxvbD4NCi08bGk+ZGVjbGFyZSB0aGUgZmlsdGVyIHdpdGggYSA8Yj4mbHQ7ZmlsdGVyJmd0OzwvYj4gZWxlbWVudCBpbiB0aGUgZGVwbG95bWVudA0KLWRlc2NyaXB0b3I8L2xpPg0KLTxsaT5tYXAgdGhlIGZpbHRlciB0byB0aGUgc2VydmxldCB1c2luZyB0aGUgPGI+Jmx0O2ZpbHRlci1tYXBwaW5nJmd0OzwvYj4gDQotZWxlbWVudC48L2xpPg0KLTwvb2w+IFNvbWV0aW1lcyB5b3Ugd2FudCBhIGZpbHRlciB0byB3b3JrIG9uIG11bHRpcGxlIHNlcnZsZXRzLiBZb3UgY2FuIGRvDQotdGhpcyBieSBtYXBwaW5nIGEgZmlsdGVyIHRvIGEgVVJMIHBhdHRlcm4gc28gdGhhdCBhbnkgcmVxdWVzdCB0aGF0IG1hdGNoZXMNCi10aGF0IFVSTCBwYXR0ZXJuIHdpbGwgYmUgZmlsdGVyZWQuIEFsbCB0aGlzIGlzIG1hZGUgYXV0b21hdGljYWxseSBpZiB5b3UgdXNlDQotdGhlIDxiPkZpbHRlciBNYXBwaW5nczwvYj4gZmllbGQuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pk1ldGhvZCBzdHViczwvZHQ+DQotPGRkPkJlY2F1c2UgZWFjaCBmaWx0ZXIgbXVzdCBpbXBsZW1lbnQgdGhlIGphdmF4LnNlcnZsZXQuRmlsdGVyIGludGVyZmFjZSwNCi10aGUgPGI+SW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZHM8L2I+IG9wdGlvbiBpcyBhbHdheXMgY2hlY2tlZCBhbmQgY2Fubm90DQotYmUgY2hhbmdlZC48L2RkPg0KLTwvZGxlbnRyeT48L2RsPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdmbHR3aXouaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ZsdHdpei5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2I4YWEwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ZsdHdpei5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIEZpbHRlcnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIGZpbHRlcnMgd2l6YXJkIGhlbHBzIHlvdSB0byBjcmVhdGUgSmF2YSBzZXJ2bGV0IGZpbHRlcnMgYnkgd2Fsa2luZyB5b3UgdGhyb3VnaCB0aGUgY3JlYXRpb24gcHJvY2VzcyBhbmQgYnkgcHJvdmlkaW5nIHlvdSB3aXRoIG91dHB1dCBmaWxlcyB0aGF0IHlvdSBjYW4gdXNlIG9yIHRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgZmlsdGVycyBjYW4gcnVuIG9uIEphdmEgRUUtY29tcGxpYW50IFdlYiBzZXJ2ZXJzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgZmlsdGVycyB3aXphcmQgaGVscHMgeW91IHRvIGNyZWF0ZSBKYXZhIHNlcnZsZXQgZmlsdGVycyBieSB3YWxraW5nIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2Ugb3IgdGhhdCB5b3UgY2FuIG1vZGlmeSBmb3IgdXNlIHdpdGggeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBmaWx0ZXJzIGNhbiBydW4gb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuIiAvPgotPG1ldGEgY29udGVudD0ic2VydmxldHMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic2VydmxldHMsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3ZmlsdGJuLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdmbHR3aXoiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBGaWx0ZXJzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d2ZsdHdpeiI+PGEgbmFtZT0idHdmbHR3aXoiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIEZpbHRlcnM8L2gxPgotCi0KLQotPGRpdj48cD5UaGUgZmlsdGVycyB3aXphcmQgaGVscHMgeW91IHRvIGNyZWF0ZSBKYXZh4oSiIHNlcnZsZXQgZmlsdGVycyBieSB3YWxraW5nIHlvdSB0aHJvdWdoCi10aGUgY3JlYXRpb24gcHJvY2VzcyBhbmQgYnkgcHJvdmlkaW5nIHlvdSB3aXRoIG91dHB1dCBmaWxlcyB0aGF0IHlvdSBjYW4gdXNlCi1vciB0aGF0IHlvdSBjYW4gbW9kaWZ5IGZvciB1c2Ugd2l0aCB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIGZpbHRlcnMgY2FuCi1ydW4gb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+VG8gY3JlYXRlIGEgZmlsdGVyLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOiA8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSwgZXhwYW5kIHlvdXIgIDxhIGhyZWY9ImNjd2VicHJqLmh0bWwiIHRpdGxlPSIiPmR5bmFtaWMgcHJvamVjdDwvYT4gaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldy48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIG9uIHRoZSA8c3Ryb25nPkZpbHRlcjwvc3Ryb25nPiBpY29uLCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+Ci08c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsdGVyPC9zcGFuPjwvc3Bhbj4gZnJvbQotdGhlIHBvcC11cCBtZW51Ljwvc3Bhbj4gIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgRmlsdGVyPC9zcGFuPiB3aXphcmQKLWFwcGVhcnMuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gb2xsb3cgdGhlIHByb2plY3Qgd2l6YXJkIHByb21wdHMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPjxzdHJvbmc+R2VuZXJhbCBJbmZvcm1hdGlvbjwvc3Ryb25nPjwvcD4KLTxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Nb2RpZmllcnM8L2R0PgotCi08ZGQ+VGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YSBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiBzdGF0ZXMKLXRoYXQgYSBTZXJ2bGV0IGNsYXNzIG11c3QgYmUgPHN0cm9uZz5wdWJsaWM8L3N0cm9uZz4gYW5kIG5vdCA8c3Ryb25nPmFic3RyYWN0PC9zdHJvbmc+LiBUaGVyZWZvcmUsCi15b3UgY2Fubm90IGNoYW5nZSB0aGVzZSBtb2RpZmllcnMuIFRoZSBvbmx5IG9uZSBhdmFpbGFibGUgZm9yIGNoYW5nZSBpcyB0aGUgPHN0cm9uZz5maW5hbDwvc3Ryb25nPiBtb2RpZmllci48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5JbnRlcmZhY2VzPC9kdD4KLQotPGRkPlRoZXJlIGlzIG9uZSBvYmxpZ2F0b3J5IGludGVyZmFjZSB0aGF0IGZpbHRlciBjbGFzc2VzIG11c3QgaW1wbGVtZW50OiA8c3Ryb25nPmphdmF4LnNlcnZsZXQuRmlsdGVyPC9zdHJvbmc+LgotVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldCBwYWNrYWdlIGFuZCBpcyB1c2VkIHRvIHJlcHJlc2VudAotdGhlIGxpZmUtY3ljbGUgb2YgdGhlIGZpbHRlci4gVGhpcyBpbnRlcmZhY2UgaGFzIHRocmVlIG1ldGhvZHM6IGluaXQsIGRvRmlsdGVyCi1hbmQgZGVzdHJveS4gPHVsPgotPGxpPlRoZSA8c3Ryb25nPmluaXQ8L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmxldCBjb250YWluZXIgb25seSBvbmNlLCB3aGVuCi1pdCBmaW5pc2hlcyBpbnN0YW50aWF0aW5nIHRoZSBmaWx0ZXIuPC9saT4KLQotPGxpPlRoZTxzdHJvbmc+ZG9GaWx0ZXI8L3N0cm9uZz4gbWV0aG9kIGlzIHdoZXJlIHRoZSBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkIGFuZCBpcyBjYWxsZWQKLWV2ZXJ5IHRpbWUgYSB1c2VyIHJlcXVlc3RzIGEgcmVzb3VyY2UsIHN1Y2ggYXMgYSBzZXJ2bGV0LCB0byB3aGljaCB0aGUgZmlsdGVyCi1pcyBtYXBwZWQuPC9saT4KLQotPGxpPlRoZSA8c3Ryb25nPmRlc3Ryb3k8L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmxldCBjb250YWluZXIgdG8gdGVsbCB0aGUKLWZpbHRlciB0aGF0IGl0IHdpbGwgYmUgdGFrZW4gb3V0IG9mIHNlcnZpY2UuPC9saT4KLQotPC91bD4KLSBBbHRob3VnaCwgdGhhdCB0aGUgamF2YXguc2VydmxldC5GaWx0ZXIgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIGluIHRoZSA8c3Ryb25nPkludGVyZmFjZXM8L3N0cm9uZz4gZmllbGQKLWJ5IGRlZmF1bHQsIHlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgaW50ZXJmYWNlcyB0byBpbXBsZW1lbnQgYnkgdXNpbmcgdGhlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbi48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5JbnRlcmZhY2Ugc2VsZWN0aW9uIGRpYWxvZzwvZHQ+Ci0KLTxkZD5UaGlzIGRpYWxvZyBhcHBlYXJzIGlmIHlvdSBzZWxlY3QgdG8gYWRkIGFuIGludGVyZmFjZSB0byB5b3VyIGZpbHRlci4KLUFzIHlvdSB0eXBlIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCB5b3UgYXJlIGFkZGluZywgYSBsaXN0IG9mIGF2YWlsYWJsZQotaW50ZXJmYWNlcyBsaXN0ZWQgaW4gdGhlIDxzdHJvbmc+TWF0Y2hpbmcgaXRlbXM8L3N0cm9uZz4gbGlzdCBib3ggdXBkYXRlcyBkeW5hbWljYWxseQotdG8gZGlzcGxheSBvbmx5IHRoZSBpbnRlcmZhY2VzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uIENob29zZSBhbiBpbnRlcmZhY2UKLXRvIHNlZSB0aGUgcXVhbGlmaWVyLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+IHdoZW4gZmluaXNoZWQuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+RmlsdGVyIE1hcHBpbmdzPC9kdD4KLQotPGRkPkZvciBhIGZpbHRlciB0byBpbnRlcmNlcHQgYSByZXF1ZXN0IHRvIGEgc2VydmxldCwgeW91IG11c3Q6IDxvbD4KLTxsaT5kZWNsYXJlIHRoZSBmaWx0ZXIgd2l0aCBhIDxzdHJvbmc+Jmx0O2ZpbHRlciZndDs8L3N0cm9uZz4gZWxlbWVudCBpbiB0aGUgZGVwbG95bWVudAotZGVzY3JpcHRvcjwvbGk+Ci0KLTxsaT5tYXAgdGhlIGZpbHRlciB0byB0aGUgc2VydmxldCB1c2luZyB0aGUgPHN0cm9uZz4mbHQ7ZmlsdGVyLW1hcHBpbmcmZ3Q7PC9zdHJvbmc+IAotZWxlbWVudC48L2xpPgotCi08L29sPgotIFNvbWV0aW1lcyB5b3Ugd2FudCBhIGZpbHRlciB0byB3b3JrIG9uIG11bHRpcGxlIHNlcnZsZXRzLiBZb3UgY2FuIGRvCi10aGlzIGJ5IG1hcHBpbmcgYSBmaWx0ZXIgdG8gYSBVUkwgcGF0dGVybiBzbyB0aGF0IGFueSByZXF1ZXN0IHRoYXQgbWF0Y2hlcwotdGhhdCBVUkwgcGF0dGVybiB3aWxsIGJlIGZpbHRlcmVkLiBBbGwgdGhpcyBpcyBtYWRlIGF1dG9tYXRpY2FsbHkgaWYgeW91IHVzZQotdGhlIDxzdHJvbmc+RmlsdGVyIE1hcHBpbmdzPC9zdHJvbmc+IGZpZWxkLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPk1ldGhvZCBzdHViczwvZHQ+Ci0KLTxkZD5CZWNhdXNlIGVhY2ggZmlsdGVyIG11c3QgaW1wbGVtZW50IHRoZSBqYXZheC5zZXJ2bGV0LkZpbHRlciBpbnRlcmZhY2UsCi10aGUgPHN0cm9uZz5Jbmhlcml0ZWQgYWJzdHJhY3QgbWV0aG9kczwvc3Ryb25nPiBvcHRpb24gaXMgYWx3YXlzIGNoZWNrZWQgYW5kIGNhbm5vdAotYmUgY2hhbmdlZC48L2RkPgotCi08L2RsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3ZmlsdGJuLmh0bWwiPkZpbHRlcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3aW1wd2FyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdpbXB3YXIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5YzA2MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdpbXB3YXIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHdpbXB3YXIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkltcG9ydGluZyBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+V0FSIGZpbGVzPGluZGV4dGVybT5pbXBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5BIFdlYiBBcmNoaXZlIChXQVIpIGZpbGUgaXMgYSBwb3J0YWJsZSwgcGFja2FnZWQgV2ViIGFwcGxpY2F0aW9uDQotdGhhdCB5b3UgY2FuIGltcG9ydCBpbnRvIHlvdXIgd29ya3NwYWNlLiA8L3A+PHA+IEJlZm9yZSBpbXBvcnRpbmcgYSBXQVIgZmlsZSwNCi15b3Ugc2hvdWxkIGZpcnN0IGRldGVybWluZSBpZiB0aGUgV0FSIGZpbGUgY29udGFpbnMgbmVlZGVkIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHNvdXJjZQ0KLWZpbGVzLiBXaGVuIGltcG9ydGluZyBhIFdBUiBmaWxlIGludG8gYW4gZXhpc3RpbmcgV2ViIHByb2plY3QsIHRoZSBpbXBvcnRlZA0KLVdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZXMgYXJlIGVpdGhlciBub3QgY2hhbmdlZCBvciBvdmVyd3JpdHRlbiBieSB0aGUNCi1vbmVzIGluY2x1ZGVkIGluIHRoZSBpbXBvcnRlZCBXQVIgZmlsZSwgYmFzZWQgb24geW91ciByZXNwb25zZSB0byB0aGUgcHJvbXB0DQotdGhhdCBpcyBwcm92aWRlZC4gIEluIGVpdGhlciBjYXNlLCB0aGlzIGFjdGlvbiBkb2VzIDxpPm5vdDwvaT4gcmVwcmVzZW50IGENCi1tZXJnaW5nIG9mIHRoZSB0d28gc2V0cyBvZiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLiAgPC9wPiAgPHA+VG8gaW1wb3J0IHRoZQ0KLVdlYiBwcm9qZWN0IHJlc291cmNlcyBpbiBhIFdBUiBmaWxlIGludG8geW91ciB3b3Jrc3BhY2UsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcNCi1zdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPlNlbGVjdCA8cGg+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RmlsZTwvdWljb250cm9sPjx1aWNvbnRyb2w+SW1wb3J0PC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT48L3BoPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD4gSW4gdGhlIEltcG9ydCBkaWFsb2csIHNlbGVjdCA8cGg+PHVpY29udHJvbD5XQVIgZmlsZTwvdWljb250cm9sPjwvcGg+IGFuZA0KLXRoZW4gY2xpY2sgPHBoPjx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPjwvcGg+LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Mb2NhdGUgdGhlIFdBUiBmaWxlIHRoYXQgeW91IHdhbnQgdG8gaW1wb3J0IHVzaW5nIHRoZSA8cGg+PHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD48L3BoPiBidXR0b24uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+IFRoZSB3aXphcmQgYXNzdW1lcyB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgV2ViIHByb2plY3Qgd2l0aCB0aGUNCi1zYW1lIG5hbWUgYXMgdGhlIFdBUiBmaWxlLiBJZiB5b3UgYWNjZXB0IHRoaXMgY2hvaWNlLCB0aGUgcHJvamVjdCB3aWxsIGJlDQotY3JlYXRlZCB3aXRoIHRoZSBzYW1lIHNlcnZsZXQgdmVyc2lvbiBhcyBzcGVjaWZpZWQgYnkgdGhlIFdBUiBmaWxlIGFuZCBpbg0KLXRoZSBzYW1lIGxvY2F0aW9uLiBJZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGVzZSBzZXR0aW5ncywgeW91IGNhbiBjbGljayA8Yj5OZXc8L2I+IGFuZA0KLXNwZWNpZnkgeW91ciBuZXcgc2V0dGluZ3MgaW4gdGhlIER5bmFtaWMgV2ViIFByb2plY3Qgd2l6YXJkLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDxwaD48dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPjwvcGg+IHRvIHBvcHVsYXRlIHRoZSBXZWINCi1wcm9qZWN0LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPjwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdpbXB3YXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ltcHdhci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGRmYjhhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ltcHdhci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzIiAvPgotPG1ldGEgY29udGVudD0iV0FSIGZpbGVzLCBpbXBvcnRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXQVIgZmlsZXMsIGltcG9ydGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3dhcm92ci5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3aW1wd2FyIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+SW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d2ltcHdhciI+PGEgbmFtZT0idHdpbXB3YXIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkltcG9ydGluZyBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5BIFdlYiBBcmNoaXZlIChXQVIpIGZpbGUgaXMgYSBwb3J0YWJsZSwgcGFja2FnZWQgV2ViIGFwcGxpY2F0aW9uCi10aGF0IHlvdSBjYW4gaW1wb3J0IGludG8geW91ciB3b3Jrc3BhY2UuIDwvcD4KLTxwPiBCZWZvcmUgaW1wb3J0aW5nIGEgV0FSIGZpbGUsCi15b3Ugc2hvdWxkIGZpcnN0IGRldGVybWluZSBpZiB0aGUgV0FSIGZpbGUgY29udGFpbnMgbmVlZGVkIEphdmHihKIgc291cmNlCi1maWxlcy4gV2hlbiBpbXBvcnRpbmcgYSBXQVIgZmlsZSBpbnRvIGFuIGV4aXN0aW5nIFdlYiBwcm9qZWN0LCB0aGUgaW1wb3J0ZWQKLVdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZXMgYXJlIGVpdGhlciBub3QgY2hhbmdlZCBvciBvdmVyd3JpdHRlbiBieSB0aGUKLW9uZXMgaW5jbHVkZWQgaW4gdGhlIGltcG9ydGVkIFdBUiBmaWxlLCBiYXNlZCBvbiB5b3VyIHJlc3BvbnNlIHRvIHRoZSBwcm9tcHQKLXRoYXQgaXMgcHJvdmlkZWQuICBJbiBlaXRoZXIgY2FzZSwgdGhpcyBhY3Rpb24gZG9lcyA8ZW0+bm90PC9lbT4gcmVwcmVzZW50IGEKLW1lcmdpbmcgb2YgdGhlIHR3byBzZXRzIG9mIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuICA8L3A+Ci0gIDxwPlRvIGltcG9ydCB0aGUKLVdlYiBwcm9qZWN0IHJlc291cmNlcyBpbiBhIFdBUiBmaWxlIGludG8geW91ciB3b3Jrc3BhY2UsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcKLXN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+U2VsZWN0IDxzcGFuPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbXBvcnQ8L3NwYW4+Ci08L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPiBJbiB0aGUgSW1wb3J0IGRpYWxvZywgc2VsZWN0IDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldBUiBmaWxlPC9zcGFuPjwvc3Bhbj4gYW5kCi10aGVuIGNsaWNrIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+PC9zcGFuPi4gPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5Mb2NhdGUgdGhlIFdBUiBmaWxlIHRoYXQgeW91IHdhbnQgdG8gaW1wb3J0IHVzaW5nIHRoZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+PC9zcGFuPiBidXR0b24uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPiBUaGUgd2l6YXJkIGFzc3VtZXMgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IFdlYiBwcm9qZWN0IHdpdGggdGhlCi1zYW1lIG5hbWUgYXMgdGhlIFdBUiBmaWxlLiBJZiB5b3UgYWNjZXB0IHRoaXMgY2hvaWNlLCB0aGUgcHJvamVjdCB3aWxsIGJlCi1jcmVhdGVkIHdpdGggdGhlIHNhbWUgc2VydmxldCB2ZXJzaW9uIGFzIHNwZWNpZmllZCBieSB0aGUgV0FSIGZpbGUgYW5kIGluCi10aGUgc2FtZSBsb2NhdGlvbi4gSWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlc2Ugc2V0dGluZ3MsIHlvdSBjYW4gY2xpY2sgPHN0cm9uZz5OZXc8L3N0cm9uZz4gYW5kCi1zcGVjaWZ5IHlvdXIgbmV3IHNldHRpbmdzIGluIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0IHdpemFyZC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj48L3NwYW4+IHRvIHBvcHVsYXRlIHRoZSBXZWIKLXByb2plY3QuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3d2Fyb3ZyLmh0bWwiPldlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2xzdHdpei5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3bHN0d2l6LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YjFlZGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3bHN0d2l6LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3bHN0d2l6IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBMaXN0ZW5lcnM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+VGhlIGxpc3RlbmVyIHdpemFyZCBoZWxwcyB5b3UgY3JlYXRlIGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYnkgd2Fsa2luZyB5b3UgdGhyb3VnaCB0aGUgY3JlYXRpb24gcHJvY2VzcyBhbmQgYnkgcHJvdmlkaW5nIHlvdSB3aXRoIG91dHB1dCBmaWxlcyB0aGF0IHlvdSBjYW4gdXNlIG9yIHRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgbGlzdGVuZXJzIGNhbiBydW4gb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c2VydmxldHM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+VG8gY3JlYXRlIGEgbGlzdGVuZXIsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSwgZXhwYW5kIHlvdXIgIDx4cmVmIGhyZWY9ImNjd2VicHJqLmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+ZHluYW1pYyBwcm9qZWN0PC94cmVmPiBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlJpZ2h0IGNsaWNrIG9uIHRoZSA8Yj5MaXN0ZW5lcjwvYj4gaWNvbiwgYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48dWljb250cm9sPkxpc3RlbmVyPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gZnJvbSB0aGUgcG9wLXVwIG1lbnUuPC9jbWQ+PHN0ZXByZXN1bHQ+IFRoZSA8dWljb250cm9sPkNyZWF0ZSBMaXN0ZW5lcjwvdWljb250cm9sPiB3aXphcmQgYXBwZWFycy48L3N0ZXByZXN1bHQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxkbD48ZGxlbnRyeT4NCi08ZHQ+QXBwbGljYXRpb24gbGlmZWN5Y2xlIGxpc3RlbmVyczwvZHQ+DQotPGRkPlRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPmRlZmluZXMgdGhlIAlmb2xsb3dpbmcgaW50ZXJmYWNlcyB0aGF0IHJlcHJlc2VudCB0aGF0IGFwcGxpY2F0aW9uIGxpZmVjeWNsZSAJbGlzdGVuZXJzLiBZb3Ugc2hvdWxkIHNlbGVjdCBhdCBsZWFzdCBvbmUgb2YgdGhlIGludGVmYWNlcy4gCTx1bD4NCi08bGk+PGI+amF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dExpc3RlbmVyOjwvYj4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldCBwYWNrYWdlIGFuZCBjYW4gYmUgdXNlZCB0byBsaXN0ZW4gdG8gdGhlIFNlcnZsZXRDb250ZXh0IGxpZmUtY3ljbGUgZXZlbnRzLiBUaGlzIGludGVyZmFjZSBoYXMgdHdvIG1ldGhvZHM6IGNvbnRleHRJbml0aWFsaXplZCBhbmQgY29udGV4dERlc3Ryb3llZC4gVGhlIDxiPjxpPmNvbnRleHRJbml0aWFsaXplZDwvaT48L2I+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGlzIHJlYWR5IHRvIHNlcnZpY2UgcmVxdWVzdHMgYW5kIHRoZSA8Yj48aT5jb250ZXh0RGVzdHJveWVkPC9pPjwvYj4gbWV0aG9kIGlzIGludm9rZWQgd2hlbiB0aGUgc2VydmxldCBjb250ZXh0IGlzIGFib3V0IHRvIGJlIHNodXQgZG93bi48L2xpPg0KLTxsaT48Yj5qYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXI6PC9iPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGJlIG5vdGlmaWVkIHdoZW4gYW55IGF0dHJpYnV0ZSBpcyBhZGRlZCB0byB0aGUgU2VydmxldENvbnRleHQgb3IgaWYgYW55IG9mIHRoZSBTZXJ2bGV0Q29udGV4dCdzIGF0dHJpYnV0ZXMgYXJlIGNoYW5nZWQgb3IgcmVtb3ZlZC4gVGhpcyBpbmV0ZmFjZSBoYXMgdGhyZWUgbWV0aG9kczogPGI+PGk+YXR0cmlidXRlQWRkZWQsIGF0dHJpYnV0ZVJlbW92ZWQ8L2k+PC9iPiBhbmQgPGI+PGk+YXR0cmlidXRlUmVwbGFjZWQ8L2k+PC9iPi48L2xpPg0KLTxsaT48Yj5qYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0TGlzdGVuZXI6PC9iPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGJlIG5vdGlmaWVkIHdoZW4gYSByZXF1ZXN0IGlzIGNvbWluZyBpbiBvciBvdXQgb2Ygc2NvcGUgaW4gYSBXZWIgY29tcG9uZW50LiBUaGlzIGludGVyZmFjZSBoYXMgdHdvIG1ldGhvZHM6IHJlcXVlc3RJbml0aWFsaXplZCBhbmQgcmVxdWVzdERlc3Ryb3llZC4gVGhlIDxiPjxpPnJlcXVlc3RJbml0aWFsaXplZDwvaT48L2I+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBpdCBpcyBhYm91dCB0byBlbnRlciB0aGUgZmlyc3Qgc2VydmxldCBvciBmaWx0ZXIgaW4gZWFjaCBXZWIgYXBwbGljYXRpb24uIFRoZSA8Yj48aT5yZXF1ZXN0RGVzdHJveWVkPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGl0IGV4aXRzIHRoZSBsYXN0IHNlcnZsZXQgb3IgdGhlIGZpcnN0IGZpbHRlciBpbiB0aGUgY2hhaW4uPC9saT4NCi08bGk+PGI+amF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyOjwvYj4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldCBwYWNrYWdlIGFuZCBjYW4gYmUgdXNlZCB0byBiZSBub3RpZmllZCB3aGVuIGFueSByZXF1ZXN0IGF0dHJpYnV0ZSBpcyBjaGFuZ2VkLiBUaGlzIGludGVyZmFjZSBoYXMgdGhyZWUgbWV0aG9kczogYXR0cmlidXRlQWRkZWQsIGF0dHJpYnV0ZVJlbW92ZWQgYW5kIGF0dHJpYnV0ZVJlcGxhY2VkLiBUaGUgPGI+PGk+YXR0cmlidXR0ZUFkZGVkPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgbmV3IGF0dHJpYnV0ZSB3YXMgYWRkZWQgdG8gc2VydmxldCByZXF1ZXN0LiBUaGUgPGI+PGk+YXR0cmlidXRlUmVtb3ZlZDwvaT48L2I+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBleGlzdGluZyBhdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuIFRoZSA8Yj48aT5hdHRyaWJ1dGVSZXBsYWNlZDwvaT48L2I+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgd2FzIHJlcGxhY2VkIG9uIHRoZSBzZXJ2bGV0IHJlcXVlc3QuPC9saT4NCi08bGk+PGI+amF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uTGlzdGVuZXI6PC9iPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZSBhbmQgY2FuIGJlIHVzZWQgdG8gbGlzdGVuIHRvIGEgc2Vzc2lvbnMgbGlmZSBjeWNsZSBldmVudHMuIFRoaXMgaW50ZXJmYWNlIGhhcyB0d28gbWV0aG9kczogc2Vzc2lvbkNyZWF0ZWQgYW5kIHNlc3Npb25EZXN0cm95ZWQuIFRoZSA8Yj48aT5zZXNzaW9uQ3JlYXRlZDwvaT48L2I+ICAJbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIEh0dHBTZXNzaW9uIG9iamVjdCBpcyBjcmVhdGVkLiBUaGUgPGI+PGk+c2Vzc2lvbkRlc3Ryb3llZDwvaT48L2I+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBIdHRwU2Vzc2lvbiBvYmplY3QgaXMgaW52YWxpZGF0ZWQuPC9saT4NCi08bGk+PGI+amF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyOjwvYj4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldC5odHRwIHBhY2thZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGxpc3RlbiB0byBhIGNvbnRhaW5lciBldmVudHMgbm90aWZ5aW5nIHRoYXQgc2Vzc2lvbnMgd2lsbCBiZSBwYXNzaXZhdGVkIG9yIGFjdGl2YXRlZC4gVGhpcyBpbnRlcmZhY2UgaGFzIHR3byBtZXRob2RzOiBzZXNzaW9uRGlkQWN0aXZhdGUgYW5kIHNlc3Npb25XaWxsUGFzaXZhdGUuIFRoZSA8Yj48aT5zZXNzaW9uRGlkQWN0aXZhdGU8L2k+PC9iPiBpcyBjYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBoYXMganVzdCBiZWVuIGFjdGl2YXRlZCBhbmQgdGhlIDxiPjxpPnNlc3Npb25XaWxsUGFzaXZhdGU8L2k+PC9iPiBpcyBjYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBpcyBhYm91dCB0byBiZSBwYXNzaXZhdGVkLjwvbGk+DQotPGxpPjxiPmphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyOjwvYj4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldC5odHRwIHBhY2thZ2UgYW5kIGNhbiBiZSB1c2VkIHRvIGxpc3RlbiB0byBldmVudHMgcmVsYXRlZCB0byBzZXNzaW9uIGF0dHJpYnV0ZXMuIFRoaXMgaW50ZXJmYWNlIGhhcyB0aHJlZSBtZXRob2RzOiBhdHRyaWJ1dGVBZGRlZCwgYXR0cmlidXRlUmVtb3ZlZCBhbmQgYXR0cmlidXRlUmVwbGFjZWQuIFRoZSA8Yj48aT5hdHRyaWJ1dGVBZGRlZDwvaT48L2I+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgaXMgYWRkZWQgdG8gYW4gSHR0cFNlc3Npb24gb2JqZWN0LiBUaGUgPGI+PGk+YXR0cmlidXRlUmVtb3ZlZDwvaT48L2I+IGFuZCA8Yj48aT5hdHRyaWJ1dGVSZXBsYWNlZDwvaT48L2I+IG1ldGhvZHMgYXJlIGNhbGxlZCB3aGVuIGFuIEh0dHBTZXNzaW9uIGF0dHJpYnV0ZSBpcyByZW1vdmVkIG9yIHJlcGxhY2VkLCByZXNwZWN0aXZlbHkuPC9saT4NCi08bGk+PGI+amF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyOjwvYj4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldC5odHRwIHBhY2thZ2UgYW5kIGNhbiBiZSB1c2VkIHRvIGJlIG5vdGlmaWVkIHdoZW4gYW4gb2JqZWN0IGlzIGJvdW5kIHRvIG9yIHVuYm91bmQgZnJvbSBhIHNlc3Npb24uIFRoaXMgaW50ZXJmYWNlIGhhcyB0d28gbWV0aG9kczogdmFsdWVCb3VuZCBhbmQgdmFsdWVVbmJvdW5kLiBUaGUgPGI+PGk+dmFsdWVCb3VuZDwvaT48L2I+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGlzIGJlaW5nIGJvdW5kIHRvIGEgc2Vzc2lvbiBhbmQgaWRlbnRpZmllcyB0aGUgc2Vzc2lvbi4gVGhlIDxiPjxpPnZhbHVlVW5ib3VuZDwvaT48L2I+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGlzIGJlaW5nIHVuYm91bmQgZnJvbSBhIHNlc3Npb24gYW5kIGlkZW50aWZpZXMgdGhlIHNlc3Npb24uPC9saT4NCi08L3VsPiAJPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pk1vZGlmaWVyczwvZHQ+DQotPGRkPlRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiBzdGF0ZXMgdGhhdCBhIAlMaXN0ZW5lciBjbGFzcyBtdXN0IGJlIDxiPnB1YmxpYzwvYj4gYW5kIG5vdCA8Yj5hYnN0cmFjdDwvYj4uIFRoZXJlZm9yZSwgCXlvdSBjYW5ub3QgY2hhbmdlIHRoZXNlIG1vZGlmaWVycy4gVGhlIG9ubHkgb25lIGF2YWlsYWJsZSBmb3IgY2hhbmdlIGlzIAl0aGUgPGI+ZmluYWw8L2I+IG1vZGlmaWVyLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5JbnRlcmZhY2VzPC9kdD4NCi08ZGQ+VGhlIGludGVyZmFjZXMgdGhhdCB5b3Ugc2VsZWN0ZWQgaW4gdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIHdpemFyZCAJYXJlIHByb3ZpZGVkIGFzIGRlZmF1bHQgdmFsdWVzIGluIHRoZSA8Yj5JbnRlcmZhY2VzPC9iPiBmaWVsZC4gVG8gYWRkIAlhZGRpdGlvbmFsIGludGVyZmFjZXMsIGNsaWNrIHRoZSA8Yj5BZGQ8L2I+IGJ1dHRvbiBuZXh0IHRvIHRoaXMgZmllbGQuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkludGVyZmFjZSBzZWxlY3Rpb24gZGlhbG9nPC9kdD4NCi08ZGQ+VGhpcyBkaWFsb2cgYXBwZWFycyBpZiB5b3Ugc2VsZWN0IHRvIGFkZCBhbiBpbnRlcmZhY2UgdG8geW91ciAJc2VydmxldC4gQXMgeW91IHR5cGUgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0aGF0IHlvdSBhcmUgYWRkaW5nLCBhIAlsaXN0IG9mIGF2YWlsYWJsZSBpbnRlcmZhY2VzIGxpc3RlZCBpbiB0aGUgPGI+TWF0Y2hpbmcgaXRlbXM8L2I+IGxpc3QgYm94IAl1cGRhdGVzIGR5bmFtaWNhbGx5IHRvIGRpc3BsYXkgb25seSB0aGUgaW50ZXJmYWNlcyB0aGF0IG1hdGNoIHRoZSAJcGF0dGVybi4gQ2hvb3NlIGFuIGludGVyZmFjZSB0byBzZWUgdGhlIHF1YWxpZmllciwgYW5kIHRoZW4gY2xpY2sgPGI+T0s8L2I+IAl3aGVuIGZpbmlzaGVkLjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2xzdHdpei5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3bHN0d2l6Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NjJjYzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3bHN0d2l6Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBMaXN0ZW5lcnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIGxpc3RlbmVyIHdpemFyZCBoZWxwcyB5b3UgY3JlYXRlIGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYnkgd2Fsa2luZyB5b3UgdGhyb3VnaCB0aGUgY3JlYXRpb24gcHJvY2VzcyBhbmQgYnkgcHJvdmlkaW5nIHlvdSB3aXRoIG91dHB1dCBmaWxlcyB0aGF0IHlvdSBjYW4gdXNlIG9yIHRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgbGlzdGVuZXJzIGNhbiBydW4gb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBsaXN0ZW5lciB3aXphcmQgaGVscHMgeW91IGNyZWF0ZSBhcHBsaWNhdGlvbiBsaWZlY3ljbGUgbGlzdGVuZXJzIGJ5IHdhbGtpbmcgeW91IHRocm91Z2ggdGhlIGNyZWF0aW9uIHByb2Nlc3MgYW5kIGJ5IHByb3ZpZGluZyB5b3Ugd2l0aCBvdXRwdXQgZmlsZXMgdGhhdCB5b3UgY2FuIHVzZSBvciB0aGF0IHlvdSBjYW4gbW9kaWZ5IGZvciB1c2Ugd2l0aCB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIGxpc3RlbmVycyBjYW4gcnVuIG9uIEphdmEgRUUtY29tcGxpYW50IFdlYiBzZXJ2ZXJzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InNlcnZsZXRzLCBjcmVhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InNlcnZsZXRzLCBjcmVhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd2xpc3Ribi5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3bHN0d2l6IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgTGlzdGVuZXJzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d2xzdHdpeiI+PGEgbmFtZT0idHdsc3R3aXoiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIExpc3RlbmVyczwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoZSBsaXN0ZW5lciB3aXphcmQgaGVscHMgeW91IGNyZWF0ZSBhcHBsaWNhdGlvbiBsaWZlY3ljbGUgbGlzdGVuZXJzIGJ5IHdhbGtpbmcgeW91IHRocm91Z2ggdGhlIGNyZWF0aW9uIHByb2Nlc3MgYW5kIGJ5IHByb3ZpZGluZyB5b3Ugd2l0aCBvdXRwdXQgZmlsZXMgdGhhdCB5b3UgY2FuIHVzZSBvciB0aGF0IHlvdSBjYW4gbW9kaWZ5IGZvciB1c2Ugd2l0aCB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIGxpc3RlbmVycyBjYW4gcnVuIG9uIEphdmEgRUUtY29tcGxpYW50IFdlYiBzZXJ2ZXJzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPlRvIGNyZWF0ZSBhIGxpc3RlbmVyLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOiA8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLCBleHBhbmQgeW91ciAgPGEgaHJlZj0iY2N3ZWJwcmouaHRtbCIgdGl0bGU9IiI+ZHluYW1pYyBwcm9qZWN0PC9hPiBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIG9uIHRoZSA8c3Ryb25nPkxpc3RlbmVyPC9zdHJvbmc+IGljb24sIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TGlzdGVuZXI8L3NwYW4+PC9zcGFuPiBmcm9tIHRoZSBwb3AtdXAgbWVudS48L3NwYW4+ICBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIExpc3RlbmVyPC9zcGFuPiB3aXphcmQgYXBwZWFycy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZvbGxvdyB0aGUgcHJvamVjdCB3aXphcmQgcHJvbXB0cy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPkFwcGxpY2F0aW9uIGxpZmVjeWNsZSBsaXN0ZW5lcnM8L2R0PgotCi08ZGQ+VGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YeKEoiBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPmRlZmluZXMgdGhlIAlmb2xsb3dpbmcgaW50ZXJmYWNlcyB0aGF0IHJlcHJlc2VudCB0aGF0IGFwcGxpY2F0aW9uIGxpZmVjeWNsZSAJbGlzdGVuZXJzLiBZb3Ugc2hvdWxkIHNlbGVjdCBhdCBsZWFzdCBvbmUgb2YgdGhlIGludGVmYWNlcy4gCTx1bD4KLTxsaT48c3Ryb25nPmphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRMaXN0ZW5lcjo8L3N0cm9uZz4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldCBwYWNrYWdlIGFuZCBjYW4gYmUgdXNlZCB0byBsaXN0ZW4gdG8gdGhlIFNlcnZsZXRDb250ZXh0IGxpZmUtY3ljbGUgZXZlbnRzLiBUaGlzIGludGVyZmFjZSBoYXMgdHdvIG1ldGhvZHM6IGNvbnRleHRJbml0aWFsaXplZCBhbmQgY29udGV4dERlc3Ryb3llZC4gVGhlIDxzdHJvbmc+PGVtPmNvbnRleHRJbml0aWFsaXplZDwvZW0+PC9zdHJvbmc+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGlzIHJlYWR5IHRvIHNlcnZpY2UgcmVxdWVzdHMgYW5kIHRoZSA8c3Ryb25nPjxlbT5jb250ZXh0RGVzdHJveWVkPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGludm9rZWQgd2hlbiB0aGUgc2VydmxldCBjb250ZXh0IGlzIGFib3V0IHRvIGJlIHNodXQgZG93bi48L2xpPgotCi08bGk+PHN0cm9uZz5qYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXI6PC9zdHJvbmc+IFRoaXMgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIGJ5IGphdmF4LnNlcnZsZXQgcGFja2FnZS4gSXQgY2FuIGJlIHVzZWQgdG8gYmUgbm90aWZpZWQgd2hlbiBhbnkgYXR0cmlidXRlIGlzIGFkZGVkIHRvIHRoZSBTZXJ2bGV0Q29udGV4dCBvciBpZiBhbnkgb2YgdGhlIFNlcnZsZXRDb250ZXh0J3MgYXR0cmlidXRlcyBhcmUgY2hhbmdlZCBvciByZW1vdmVkLiBUaGlzIGluZXRmYWNlIGhhcyB0aHJlZSBtZXRob2RzOiA8c3Ryb25nPjxlbT5hdHRyaWJ1dGVBZGRlZCwgYXR0cmlidXRlUmVtb3ZlZDwvZW0+PC9zdHJvbmc+IGFuZCA8c3Ryb25nPjxlbT5hdHRyaWJ1dGVSZXBsYWNlZDwvZW0+PC9zdHJvbmc+LjwvbGk+Ci0KLTxsaT48c3Ryb25nPmphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RMaXN0ZW5lcjo8L3N0cm9uZz4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldCBwYWNrYWdlLiBJdCBjYW4gYmUgdXNlZCB0byBiZSBub3RpZmllZCB3aGVuIGEgcmVxdWVzdCBpcyBjb21pbmcgaW4gb3Igb3V0IG9mIHNjb3BlIGluIGEgV2ViIGNvbXBvbmVudC4gVGhpcyBpbnRlcmZhY2UgaGFzIHR3byBtZXRob2RzOiByZXF1ZXN0SW5pdGlhbGl6ZWQgYW5kIHJlcXVlc3REZXN0cm95ZWQuIFRoZSA8c3Ryb25nPjxlbT5yZXF1ZXN0SW5pdGlhbGl6ZWQ8L2VtPjwvc3Ryb25nPiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gaXQgaXMgYWJvdXQgdG8gZW50ZXIgdGhlIGZpcnN0IHNlcnZsZXQgb3IgZmlsdGVyIGluIGVhY2ggV2ViIGFwcGxpY2F0aW9uLiBUaGUgPHN0cm9uZz48ZW0+cmVxdWVzdERlc3Ryb3llZDwvZW0+PC9zdHJvbmc+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBpdCBleGl0cyB0aGUgbGFzdCBzZXJ2bGV0IG9yIHRoZSBmaXJzdCBmaWx0ZXIgaW4gdGhlIGNoYWluLjwvbGk+Ci0KLTxsaT48c3Ryb25nPmphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lcjo8L3N0cm9uZz4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldCBwYWNrYWdlIGFuZCBjYW4gYmUgdXNlZCB0byBiZSBub3RpZmllZCB3aGVuIGFueSByZXF1ZXN0IGF0dHJpYnV0ZSBpcyBjaGFuZ2VkLiBUaGlzIGludGVyZmFjZSBoYXMgdGhyZWUgbWV0aG9kczogYXR0cmlidXRlQWRkZWQsIGF0dHJpYnV0ZVJlbW92ZWQgYW5kIGF0dHJpYnV0ZVJlcGxhY2VkLiBUaGUgPHN0cm9uZz48ZW0+YXR0cmlidXR0ZUFkZGVkPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgbmV3IGF0dHJpYnV0ZSB3YXMgYWRkZWQgdG8gc2VydmxldCByZXF1ZXN0LiBUaGUgPHN0cm9uZz48ZW0+YXR0cmlidXRlUmVtb3ZlZDwvZW0+PC9zdHJvbmc+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBleGlzdGluZyBhdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuIFRoZSA8c3Ryb25nPjxlbT5hdHRyaWJ1dGVSZXBsYWNlZDwvZW0+PC9zdHJvbmc+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgd2FzIHJlcGxhY2VkIG9uIHRoZSBzZXJ2bGV0IHJlcXVlc3QuPC9saT4KLQotPGxpPjxzdHJvbmc+amF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uTGlzdGVuZXI6PC9zdHJvbmc+IFRoaXMgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIGJ5IGphdmF4LnNlcnZsZXQuaHR0cCBwYWNrYWdlIGFuZCBjYW4gYmUgdXNlZCB0byBsaXN0ZW4gdG8gYSBzZXNzaW9ucyBsaWZlIGN5Y2xlIGV2ZW50cy4gVGhpcyBpbnRlcmZhY2UgaGFzIHR3byBtZXRob2RzOiBzZXNzaW9uQ3JlYXRlZCBhbmQgc2Vzc2lvbkRlc3Ryb3llZC4gVGhlIDxzdHJvbmc+PGVtPnNlc3Npb25DcmVhdGVkPC9lbT48L3N0cm9uZz4gIAltZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gSHR0cFNlc3Npb24gb2JqZWN0IGlzIGNyZWF0ZWQuIFRoZSA8c3Ryb25nPjxlbT5zZXNzaW9uRGVzdHJveWVkPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIEh0dHBTZXNzaW9uIG9iamVjdCBpcyBpbnZhbGlkYXRlZC48L2xpPgotCi08bGk+PHN0cm9uZz5qYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXI6PC9zdHJvbmc+IFRoaXMgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIGJ5IGphdmF4LnNlcnZsZXQuaHR0cCBwYWNrYWdlLiBJdCBjYW4gYmUgdXNlZCB0byBsaXN0ZW4gdG8gYSBjb250YWluZXIgZXZlbnRzIG5vdGlmeWluZyB0aGF0IHNlc3Npb25zIHdpbGwgYmUgcGFzc2l2YXRlZCBvciBhY3RpdmF0ZWQuIFRoaXMgaW50ZXJmYWNlIGhhcyB0d28gbWV0aG9kczogc2Vzc2lvbkRpZEFjdGl2YXRlIGFuZCBzZXNzaW9uV2lsbFBhc2l2YXRlLiBUaGUgPHN0cm9uZz48ZW0+c2Vzc2lvbkRpZEFjdGl2YXRlPC9lbT48L3N0cm9uZz4gaXMgY2FsbGVkIHdoZW4gdGhlIHNlc3Npb24gaGFzIGp1c3QgYmVlbiBhY3RpdmF0ZWQgYW5kIHRoZSA8c3Ryb25nPjxlbT5zZXNzaW9uV2lsbFBhc2l2YXRlPC9lbT48L3N0cm9uZz4gaXMgY2FsbGVkIHdoZW4gdGhlIHNlc3Npb24gaXMgYWJvdXQgdG8gYmUgcGFzc2l2YXRlZC48L2xpPgotCi08bGk+PHN0cm9uZz5qYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcjo8L3N0cm9uZz4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldC5odHRwIHBhY2thZ2UgYW5kIGNhbiBiZSB1c2VkIHRvIGxpc3RlbiB0byBldmVudHMgcmVsYXRlZCB0byBzZXNzaW9uIGF0dHJpYnV0ZXMuIFRoaXMgaW50ZXJmYWNlIGhhcyB0aHJlZSBtZXRob2RzOiBhdHRyaWJ1dGVBZGRlZCwgYXR0cmlidXRlUmVtb3ZlZCBhbmQgYXR0cmlidXRlUmVwbGFjZWQuIFRoZSA8c3Ryb25nPjxlbT5hdHRyaWJ1dGVBZGRlZDwvZW0+PC9zdHJvbmc+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgaXMgYWRkZWQgdG8gYW4gSHR0cFNlc3Npb24gb2JqZWN0LiBUaGUgPHN0cm9uZz48ZW0+YXR0cmlidXRlUmVtb3ZlZDwvZW0+PC9zdHJvbmc+IGFuZCA8c3Ryb25nPjxlbT5hdHRyaWJ1dGVSZXBsYWNlZDwvZW0+PC9zdHJvbmc+IG1ldGhvZHMgYXJlIGNhbGxlZCB3aGVuIGFuIEh0dHBTZXNzaW9uIGF0dHJpYnV0ZSBpcyByZW1vdmVkIG9yIHJlcGxhY2VkLCByZXNwZWN0aXZlbHkuPC9saT4KLQotPGxpPjxzdHJvbmc+amF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyOjwvc3Ryb25nPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZSBhbmQgY2FuIGJlIHVzZWQgdG8gYmUgbm90aWZpZWQgd2hlbiBhbiBvYmplY3QgaXMgYm91bmQgdG8gb3IgdW5ib3VuZCBmcm9tIGEgc2Vzc2lvbi4gVGhpcyBpbnRlcmZhY2UgaGFzIHR3byBtZXRob2RzOiB2YWx1ZUJvdW5kIGFuZCB2YWx1ZVVuYm91bmQuIFRoZSA8c3Ryb25nPjxlbT52YWx1ZUJvdW5kPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBvYmplY3QgaXMgYmVpbmcgYm91bmQgdG8gYSBzZXNzaW9uIGFuZCBpZGVudGlmaWVzIHRoZSBzZXNzaW9uLiBUaGUgPHN0cm9uZz48ZW0+dmFsdWVVbmJvdW5kPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBvYmplY3QgaXMgYmVpbmcgdW5ib3VuZCBmcm9tIGEgc2Vzc2lvbiBhbmQgaWRlbnRpZmllcyB0aGUgc2Vzc2lvbi48L2xpPgotCi08L3VsPgotIAk8L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Nb2RpZmllcnM8L2R0PgotCi08ZGQ+VGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YSBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiBzdGF0ZXMgdGhhdCBhIAlMaXN0ZW5lciBjbGFzcyBtdXN0IGJlIDxzdHJvbmc+cHVibGljPC9zdHJvbmc+IGFuZCBub3QgPHN0cm9uZz5hYnN0cmFjdDwvc3Ryb25nPi4gVGhlcmVmb3JlLCAJeW91IGNhbm5vdCBjaGFuZ2UgdGhlc2UgbW9kaWZpZXJzLiBUaGUgb25seSBvbmUgYXZhaWxhYmxlIGZvciBjaGFuZ2UgaXMgCXRoZSA8c3Ryb25nPmZpbmFsPC9zdHJvbmc+IG1vZGlmaWVyLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkludGVyZmFjZXM8L2R0PgotCi08ZGQ+VGhlIGludGVyZmFjZXMgdGhhdCB5b3Ugc2VsZWN0ZWQgaW4gdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIHdpemFyZCAJYXJlIHByb3ZpZGVkIGFzIGRlZmF1bHQgdmFsdWVzIGluIHRoZSA8c3Ryb25nPkludGVyZmFjZXM8L3N0cm9uZz4gZmllbGQuIFRvIGFkZCAJYWRkaXRpb25hbCBpbnRlcmZhY2VzLCBjbGljayB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uIG5leHQgdG8gdGhpcyBmaWVsZC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5JbnRlcmZhY2Ugc2VsZWN0aW9uIGRpYWxvZzwvZHQ+Ci0KLTxkZD5UaGlzIGRpYWxvZyBhcHBlYXJzIGlmIHlvdSBzZWxlY3QgdG8gYWRkIGFuIGludGVyZmFjZSB0byB5b3VyIAlzZXJ2bGV0LiBBcyB5b3UgdHlwZSB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgeW91IGFyZSBhZGRpbmcsIGEgCWxpc3Qgb2YgYXZhaWxhYmxlIGludGVyZmFjZXMgbGlzdGVkIGluIHRoZSA8c3Ryb25nPk1hdGNoaW5nIGl0ZW1zPC9zdHJvbmc+IGxpc3QgYm94IAl1cGRhdGVzIGR5bmFtaWNhbGx5IHRvIGRpc3BsYXkgb25seSB0aGUgaW50ZXJmYWNlcyB0aGF0IG1hdGNoIHRoZSAJcGF0dGVybi4gQ2hvb3NlIGFuIGludGVyZmFjZSB0byBzZWUgdGhlIHF1YWxpZmllciwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPiAJd2hlbiBmaW5pc2hlZC48L2RkPgotCi08L2RsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3bGlzdGJuLmh0bWwiPkxpc3RlbmVyczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwY252cnQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BjbnZydC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTk4OTBjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BjbnZydC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d3BjbnZydCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zdGF0aWMgV2ViIHByb2plY3RzPGluZGV4dGVybT5jb252ZXJ0aW5nIHRvIGR5bmFtaWM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldlYiBwcm9qZWN0czxpbmRleHRlcm0+Y29udmVydGluZyBzdGF0aWMgdG8gZHluYW1pYzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPiBJZiB5b3Ugd2FudCB0byBhZGQgZHluYW1pYyBlbGVtZW50cyB0byBhIHN0YXRpYyB3ZWIgcHJvamVjdCwNCi1zdWNoIGFzIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHNlcnZsZXRzIGFuZCBKU1AgZmlsZXMsIHlvdSBtdXN0IGNvbnZlcnQgdGhlIHByb2plY3QNCi1mcm9tIGEgc3RhdGljIHRvIGEgZHluYW1pYyBvbmUuIFRvIGNvbnZlcnQgYSBzdGF0aWMgV2ViIHByb2plY3QgdG8gYSBkeW5hbWljDQotV2ViIHByb2plY3QsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBwcm9qZWN0IGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIGFuZCB0aGVuIHNlbGVjdCA8cGg+PHVpY29udHJvbD5Db252ZXJ0DQotdG8gYSBEeW5hbWljIFdlYiBQcm9qZWN0PC91aWNvbnRyb2w+PC9waD4gZnJvbSB0aGUgPGI+UHJvamVjdDwvYj4gbWVudS48L2NtZD4NCi08aW5mbz5UaGlzIGNvbnZlcnNpb24gYXNzdW1lcyB0aGUgIHByb2plY3QgbmFtZSBhbmQgbG9jYXRpb24gd2lsbCBiZSB0aGUgc2FtZS4NCi1UaGUgY29udmVyc2lvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIENTUyBmaWxlIHNwZWNpZmllZCBpbiB0aGUgb3JpZ2luYWwgc3RhdGljDQotcHJvamVjdCwgc28gaXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGR5bmFtaWMgV2ViIHByb2plY3QuIDwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD4gU3BlY2lmeSB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzIHRoYXQgYXJlIGF2YWlsYWJsZSB3aGVuICA8eHJlZg0KLWhyZWY9InR3Y3JlcHJqLmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+Q3JlYXRpbmcgYSBEeW5hbWljIFdlYiBwcm9qZWN0LjwveHJlZj48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwY252cnQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BjbnZydC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGVmYjI5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BjbnZydC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzIiAvPgotPG1ldGEgY29udGVudD0ic3RhdGljIFdlYiBwcm9qZWN0cywgY29udmVydGluZyB0byBkeW5hbWljLCBXZWIgcHJvamVjdHMsIGNvbnZlcnRpbmcgc3RhdGljIHRvIGR5bmFtaWMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzdGF0aWMgV2ViIHByb2plY3RzLCBjb252ZXJ0aW5nIHRvIGR5bmFtaWMsIFdlYiBwcm9qZWN0cywgY29udmVydGluZyBzdGF0aWMgdG8gZHluYW1pYyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jY3N0YXRpYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2N3ZWJwcmouaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0d3BjbnZydCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNvbnZlcnRpbmcgc3RhdGljIFdlYiBwcm9qZWN0cyB0byBkeW5hbWljIFdlYiBwcm9qZWN0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdwY252cnQiPjxhIG5hbWU9InR3cGNudnJ0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Db252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHM8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+IElmIHlvdSB3YW50IHRvIGFkZCBkeW5hbWljIGVsZW1lbnRzIHRvIGEgc3RhdGljIHdlYiBwcm9qZWN0LAotc3VjaCBhcyBKYXZh4oSiIHNlcnZsZXRzIGFuZCBKU1AgZmlsZXMsIHlvdSBtdXN0IGNvbnZlcnQgdGhlIHByb2plY3QKLWZyb20gYSBzdGF0aWMgdG8gYSBkeW5hbWljIG9uZS4gVG8gY29udmVydCBhIHN0YXRpYyBXZWIgcHJvamVjdCB0byBhIGR5bmFtaWMKLVdlYiBwcm9qZWN0LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLSA8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIHByb2plY3QgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgYW5kIHRoZW4gc2VsZWN0IDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnZlcnQKLXRvIGEgRHluYW1pYyBXZWIgUHJvamVjdDwvc3Bhbj48L3NwYW4+IGZyb20gdGhlIDxzdHJvbmc+UHJvamVjdDwvc3Ryb25nPiBtZW51Ljwvc3Bhbj4KLSBUaGlzIGNvbnZlcnNpb24gYXNzdW1lcyB0aGUgIHByb2plY3QgbmFtZSBhbmQgbG9jYXRpb24gd2lsbCBiZSB0aGUgc2FtZS4KLVRoZSBjb252ZXJzaW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgQ1NTIGZpbGUgc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBzdGF0aWMKLXByb2plY3QsIHNvIGl0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBkeW5hbWljIFdlYiBwcm9qZWN0LiAKLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+IFNwZWNpZnkgdGhlIHByb2plY3QgcHJvcGVydGllcyB0aGF0IGFyZSBhdmFpbGFibGUgd2hlbiAgPGEgaHJlZj0idHdjcmVwcmouaHRtbCIgdGl0bGU9IiI+Q3JlYXRpbmcgYSBEeW5hbWljIFdlYiBwcm9qZWN0LjwvYT48L3NwYW4+Ci08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jY3N0YXRpYy5odG1sIj5TdGF0aWMgV2ViIHByb2plY3RzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2N3ZWJwcmouaHRtbCI+RHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwbGliLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwbGliLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMWJkMzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGxpYi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d3BsaWIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBXZWIgbGlicmFyeSBwcm9qZWN0czwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJ0d3BsaWJ8MXxXZWJsaWJyYXJ5cHJvamVjdHN2aXJ0dWFsSkFSZmlsZXNhbmRwcm9qZWN0cyINCi1zdGF0dXM9ImNoYW5nZWQiPldlYiBwcm9qZWN0czxpbmRleHRlcm0+dmlydHVhbCBKQVIgZmlsZXMgYW5kIHByb2plY3RzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybSBrZXlyZWY9InR3cGxpYnwyfHZpcnR1YWxKQVJmaWxlc2Fzc29jaWF0aW9uc1dlYmxpYnJhcnlwcm9qZWN0cyINCi1zdGF0dXM9Im5ldyI+dmlydHVhbCBKQVIgZmlsZXMgYXNzb2NpYXRpb25zPGluZGV4dGVybT5XZWIgbGlicmFyeSBwcm9qZWN0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPldlYiBsaWJyYXJ5IHByb2plY3RzIGFsbG93IHlvdSB0byBhc3NvY2lhdGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gcHJvamVjdHMNCi13aXRoICJ2aXJ0dWFsIiBKQVIgZmlsZXMgaW4gYSBXZWIgcHJvamVjdCdzIFdFQi1JTkYvbGliIGRpcmVjdG9yeS4gWW91IGNhbg0KLXJlZmVyZW5jZSBKQVIgZmlsZXMgdGhhdCBleGlzdCBlbHNld2hlcmUgaW4gdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdA0KLXRoYXQgY29udGFpbnMgeW91ciBXZWIgcHJvamVjdCwgaWYgdGhleSBhcmUgaW4gdGhlIFdlYiBwcm9qZWN0J3MgYnVpbGQgcGF0aCwNCi1hbmQgYXZvaWQgdGhlIG5lZWQgdG8gZXhwbGljaXRseSBjb3B5IHRoZXNlIEpBUiBmaWxlcyBpbnRvIHRoZSBwcm9qZWN0J3MgbGliDQotZm9sZGVyIGJlZm9yZSB5b3UgcHVibGlzaCB0aGUgV2ViIGFwcGxpY2F0aW9uIHRvIGEgc2VydmVyLjwvcD48cD5UbyBzZXQgdXANCi10aGVzZSBhc3NvY2lhdGlvbnM6PC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+UmlnaHQgY2xpY2sgb24gYSBXZWIgcHJvamVjdCBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+UHJvcGVydGllczwvdWljb250cm9sPiBmcm9tDQotdGhlIHBvcC11cCBtZW51LjwvY21kPjxpbmZvPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayBvbiA8dWljb250cm9sPkphdmEgRUUgTW9kdWxlIERlcGVuZGVuY2llczwvdWljb250cm9sPjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNldCB1cCB5b3VyIGFzc29jaWF0aW9ucyBpbiB0aGUgSmF2YSBFRSBNb2R1bGUgRGVwZW5kZW5jaWVzIHdpbmRvdzwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDxwaD48dWljb250cm9sPk9LPC91aWNvbnRyb2w+PC9waD4gd2hlbiB5b3UgYXJlIGRvbmUuPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGxpYi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGxpYi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDk4N2M3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BsaWIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBXZWIgbGlicmFyeSBwcm9qZWN0cyIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBwcm9qZWN0cywgdmlydHVhbCBKQVIgZmlsZXMgYW5kIHByb2plY3RzLCB2aXJ0dWFsIEpBUiBmaWxlcyBhc3NvY2lhdGlvbnMsIFdlYiBsaWJyYXJ5IHByb2plY3RzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV2ViIHByb2plY3RzLCB2aXJ0dWFsIEpBUiBmaWxlcyBhbmQgcHJvamVjdHMsIHZpcnR1YWwgSkFSIGZpbGVzIGFzc29jaWF0aW9ucywgV2ViIGxpYnJhcnkgcHJvamVjdHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3cGxpYiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBXZWIgbGlicmFyeSBwcm9qZWN0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdwbGliIj48YSBuYW1lPSJ0d3BsaWIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBXZWIgbGlicmFyeSBwcm9qZWN0czwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5XZWIgbGlicmFyeSBwcm9qZWN0cyBhbGxvdyB5b3UgdG8gYXNzb2NpYXRlIEphdmHihKIgcHJvamVjdHMKLXdpdGggInZpcnR1YWwiIEpBUiBmaWxlcyBpbiBhIFdlYiBwcm9qZWN0J3MgV0VCLUlORi9saWIgZGlyZWN0b3J5LiBZb3UgY2FuCi1yZWZlcmVuY2UgSkFSIGZpbGVzIHRoYXQgZXhpc3QgZWxzZXdoZXJlIGluIHRoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QKLXRoYXQgY29udGFpbnMgeW91ciBXZWIgcHJvamVjdCwgaWYgdGhleSBhcmUgaW4gdGhlIFdlYiBwcm9qZWN0J3MgYnVpbGQgcGF0aCwKLWFuZCBhdm9pZCB0aGUgbmVlZCB0byBleHBsaWNpdGx5IGNvcHkgdGhlc2UgSkFSIGZpbGVzIGludG8gdGhlIHByb2plY3QncyBsaWIKLWZvbGRlciBiZWZvcmUgeW91IHB1Ymxpc2ggdGhlIFdlYiBhcHBsaWNhdGlvbiB0byBhIHNlcnZlci48L3A+Ci08cD5UbyBzZXQgdXAKLXRoZXNlIGFzc29jaWF0aW9uczo8L3A+Ci0gPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgb24gYSBXZWIgcHJvamVjdCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+IGZyb20KLXRoZSBwb3AtdXAgbWVudS48L3NwYW4+IDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgb24gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SmF2YSBFRSBNb2R1bGUgRGVwZW5kZW5jaWVzPC9zcGFuPjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2V0IHVwIHlvdXIgYXNzb2NpYXRpb25zIGluIHRoZSBKYXZhIEVFIE1vZHVsZSBEZXBlbmRlbmNpZXMgd2luZG93PC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj48L3NwYW4+IHdoZW4geW91IGFyZSBkb25lLjwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwcmpzZXQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3ByanNldC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzI4MjY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3ByanNldC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHdwcmpzZXQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNldHRpbmcgV2ViIHByb2plY3QgcHJvcGVydGllczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+V2ViIHByb2plY3RzPGluZGV4dGVybT5wcm9wZXJ0aWVzIHNldHRpbmdzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+VGhlcmUgYXJlIG1hbnkgV2ViIHByb2plY3QgcHJvcGVydGllcyB0aGF0IHlvdSBjYW4gc2V0IHRoYXQgYWZmZWN0DQotdGhlIHBoYXNlcyBpbiB0aGUgbGlmZWN5Y2xlIG9mIHlvdXIgcHJvamVjdCBhbmQgaXRzIGRlcGVuZGVuY2llcyBvbiBvdGhlcg0KLVdlYiByZXNvdXJjZXMgYW5kIFdlYiBkZXZlbG9wbWVudCBwcm9jZXNzZXMuIFlvdSBtaWdodCB3YW50IHRvIHZlcmlmeSBvciB1cGRhdGUNCi10aGVzZSBwcm9wZXJ0aWVzIGFmdGVyIHlvdSBoYXZlIHVwZGF0ZWQgYW4gZXhpc3RpbmcgcHJvamVjdCBvciBoYXZlIGltcG9ydGVkDQotV2ViIHJlc291cmNlcyBpbnRvIGEgcHJvamVjdCAuPC9wPjxwPlRvIHZpZXcgb3Igc2V0IFdlYiBwcm9qZWN0IHByb3BlcnRpZXMsDQotZG8gdGhlIGZvbGxvd2luZzogPC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+UmlnaHQtY2xpY2sgb24gYSBXZWIgUHJvamVjdCwgYW5kIGZyb20gdGhlIHBvcC11cCBtZW51IHNlbGVjdCA8cGg+PHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+PC9waD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IGEgcHJvcGVydHkgdHlwZSBpbiB0aGUgbGVmdCBwYW5lIG9mIHRoZSBQcm9wZXJ0aWVzIGRpYWxvZw0KLXRvIHZpZXcgb3IgdXBkYXRlIHByb3BlcnRpZXMgaW4gdGhlIFdlYiBwcm9qZWN0LiBGb3IgZWFjaCBwcm9wZXJ0eSwgeW91IGNhbg0KLWFwcGx5IGNoYW5nZXMgYW5kIG1vZGlmeSBkZWZhdWx0IHNldHRpbmdzLiBCYXNlZCBvbiB3aGV0aGVyIHlvdSBoYXZlIGEgc3RhdGljDQotb3IgYSBkeW5hbWljIFdlYiBwcm9qZWN0LCB0aGUgZm9sbG93aW5nIHByb3BlcnR5IHR5cGVzIGFyZSBhdmFpbGFibGU6PC9jbWQ+DQotPGluZm8+PGRsPjxkbGVudHJ5Pg0KLTxkdD5JbmZvPC9kdD4NCi08ZGQ+UHJvdmlkZXMgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBwcm9qZWN0IHR5cGUsIGxvY2F0aW9uLCBhbmQgbW9kaWZpY2F0aW9uDQotc3RhdHVzLiA8L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+QmVhbkluZm8gUGF0aCAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+DQotPGRkPklmIHlvdSBzZWxlY3QgdGhlIEVuYWJsZSBCZWFuaW5mbyBJbnRyb3NwZWN0aW9uIG9uIHRoaXMgcHJvamVjdCwgeW91IGNhbg0KLXNwZWNpZnkgdGhlIGNvbnRlbnRzIGFuZCBvcmRlciBvZiA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBCZWFuIHNlYXJjaCBwYXRocyB0byBwcm92aWRlIEJlYW4gaW5mb3JtYXRpb24NCi1yZWxldmFudCB0byB0aGUgcHJvamVjdC4gWW91IGNhbiBhZGQsIHJlbW92ZSwgYW5kIHJlb3JkZXIgKHVzaW5nIHRoZSA8cGg+VXA8L3BoPiBhbmQgPHBoPkRvd248L3BoPiBidXR0b25zKQ0KLXRoZSBwYWNrYWdlcyB1c2VkIHRvIGluY2x1ZGUgQmVhbiBpbmZvcm1hdGlvbi48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+QnVpbGRlcnM8L2R0Pg0KLTxkZD5BZGQsIHJlbW92ZSwgb3IgcmVvcmRlciBleHRlcm5hbCB0b29scyBpbiB0aGUgYnVpbGQgb3JkZXIuIFdoZW4geW91IHNlbGVjdCA8dWljb250cm9sPk5ldzwvdWljb250cm9sPiB0bw0KLWNyZWF0ZSBhIG5ldyBleHRlcm5hbCB0b29sIHRvIHRoZSBsaXN0LCB0aGUgTmV3IEV4dGVybmFsIFRvb2wgd2l6YXJkIG9wZW5zLA0KLXNvIHRoYXQgeW91IGNhbiBkZWZpbmUgdGhlIG5ldyBidWlsZCB0b29sLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5KYXZhIEVFIChEeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4NCi08ZGQ+SWRlbnRpZnkgV2ViIGxldmVsIHNwZWNpZmljYXRpb24gYW5kIG1vZGlmeSBjb250ZXh0IHJvb3QgYW5kIFdlYiBjb250ZW50DQotZm9sZGVyIG5hbWU8L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+PHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEJ1aWxkDQotUGF0aCAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+DQotPGRkPlZpZXcgb3IgY2hhbmdlIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYnVpbGQgcGF0aCB0aGF0IHlvdSBzdXBwbGllZCB3aGVuIGNyZWF0aW5nDQotdGhlIHByb2plY3QgdXNpbmcgdGhlIDxwaD5DcmVhdGUgYSBEeW5hbWljV2ViIFByb2plY3Q8L3BoPiB3aXphcmQuIFdoZW5ldmVyDQotdGhlIFdlYiBwcm9qZWN0IGlzIHJlYnVpbHQsIGFueSBjbGFzcyBmaWxlcyB0aGF0IGFyZSBjcmVhdGVkIG9yIHVwZGF0ZWQgd2lsbA0KLWJlIG91dHB1dCB0byB0aGUgc3BlY2lmaWVkIG91dHB1dCBmb2xkZXIuIDxub3RlPkEgbGlicmFyeSBlbnRyeSBvbiB0aGUgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYnVpbGQNCi1wYXRoIHdpbGwgcmVtYWluIHRoZXJlIHVubGVzcyB0aGUgYWN0dWFsIEpBUiBmaWxlIGlzIGRlbGV0ZWQgZnJvbSB0aGUgV0VCLUlORi9saWINCi1mb2xkZXIuIElmIHlvdSByZW1vdmUgYSBsaWJyYXJ5IHBhdGggZW50cnkgYnV0IG5vdCB0aGUgSkFSIGZpbGUsIHRoZSBsaWJyYXJ5DQotZW50cnkgd2lsbCBiZSByZS1hZGRlZCB0byB0aGUgcGF0aCBhdXRvbWF0aWNhbGx5Ljwvbm90ZT48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+PHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IENvbXBpbGVyDQotKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0Pg0KLTxkZD5EZWZpbmUgd2hldGhlciB0byB1c2Ugd29ya3NwYWNlIHNldHRpbmdzIG9yIHByb2plY3Qgc2V0dGluZyBmb3IgY29tcGlsaW5nIDx0bQ0KLXRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNvZGUsDQotaW5jbHVkaW5nIHNldHRpbmdzIGZvciBQcm9ibGVtcywgU3R5bGUsIENvbXBsaWFuY2UgYW5kIENsYXNzZmlsZXMsIGFuZCBCdWlsZA0KLVBhdGguPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkphdmFkb2MgTG9jYXRpb24gKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0Pg0KLTxkZD5EZWZpbmUgYSBkZWZhdWx0IGxvY2F0aW9uIChVUkwpIGZvciBhbnkgSmF2YWRvYyBhdmFpbGFibGUgdG8gdGhlIHByb2plY3QuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pjx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBKQVINCi1EZXBlbmRlbmNpZXMgKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0Pg0KLTxkZD5EZWZpbmUgYW5kIHJlb3JkZXIgSkFSIGRlcGVuZGVuY2llcyBmb3IgdGhlIHByb2plY3QuIE5vdGUgdGhhdCB0aGVzZSBkZXBlbmRlbmNpZXMNCi1tYXkgZGlmZmVyIGJhc2VkIG9uIGEgV2ViIHByb2plY3QncyBhc3NvY2lhdGlvbiB3aXRoIG11bHRpcGxlIEVudGVycHJpc2UgYXBwbGljYXRpb24NCi1wcm9qZWN0cy48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SlNQIFRhc2sgVGFnczwvZHQ+DQotPGRkPkFkZCwgZWRpdCwgb3IgcmVtb3ZlIEpTUCB0YXNrIHRhZ3MgYW5kIGFzc2lnbiB0YWcgcHJpb3JpdGllcy4gVGhlc2UgInRvDQotZG8iIGl0ZW1zIGFwcGVhciBpbiB5b3VyIFRhc2tzIHZpZXcuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkpTUCBDb21waWxhdGlvbjwvZHQ+DQotPGRkPlNwZWNpZnkgd2hlbiBpbiB0aGUgYnVpbGQgcHJvY2VzcyBhIEpTUCBzaG91bGQgYmUgc2V0IHRvIGNvbXBpbGU8L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SlNQIEZyYWdtZW50IChkeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4NCi08ZGQ+RGVmaW5lIGRlZmF1bHQgZW5jb2RpbmcsIHBhZ2UgZGlyZWN0aXZlLCBhbmQgY29udGVudCB0eXBlIHZhbHVlcyBmb3IgSlNQDQotZnJhZ21lbnQgZG9jdW1lbnRzIGluIHRoZSB3ZWIgcHJvamVjdC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+TGlua3MgVmFsaWRhdGlvbi9SZWZhY3RvcmluZzwvZHQ+DQotPGRkPkRlZmluZSBwcm9qZWN0LWxldmVsIGxpbmsgbWFuYWdlbWVudCBhbmQgdmFsaWRhdGlvbiBzZXR0aW5ncy4gVGhlc2Ugc2V0dGluZ3MNCi1vdmVycmlkZSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGluIHRoZSBXb3JrYmVuY2ggUHJlZmVyZW5jZSBzZXR0aW5ncyBmb3IgdGhlDQotY3VycmVudCBwcm9qZWN0LjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5Qcm9qZWN0IFJlZmVyZW5jZXM8L2R0Pg0KLTxkZD5SZWZlcmVuY2Ugb3RoZXIgV2ViIHByb2plY3RzIHRoYXQgZXhpc3Qgb24geW91ciB3b3JrYmVuY2ggd29ya3NwYWNlLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5TZXJ2ZXI8L2R0Pg0KLTxkZD5TZWxlY3QgdGhlIHNlcnZlciBpbnN0YW5jZSB1c2VkIHRvIHBlcmZvcm0gbmVjZXNzYXJ5IGRldmVsb3BtZW50LCB0ZXN0LA0KLWFuZCBwdWJsaXNoaW5nIGZ1bmN0aW9ucyBmb3IgdGhlIHByb2plY3QuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PlZhbGlkYXRpb248L2R0Pg0KLTxkZD5TcGVjaWZ5IHdoaWNoIHZhbGlkYXRvcnMgc2hvdWxkIHJ1biBmb3IgdGhlIHByb2plY3QsIGFuZCB3aGV0aGVyIHZhbGlkYXRpb24NCi1zaG91bGQgb2NjdXIgYXV0b21hdGljYWxseSB3aGVuIHJlc291cmNlIHVwZGF0ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIHByb2plY3QuDQotVGhlIGF2YWlsYWJsZSB2YWxpZGF0b3JzIGFyZSBiYXNlZCBvbiB0aGUgdHlwZXMgb2YgcmVzb3VyY2VzIGluIHlvdXIgcHJvamVjdC4NCi1CeSBkZWZhdWx0LCB2YWxpZGF0b3JzIGFyZSBhdXRvbWF0aWNhbGx5IHJ1biB3aGVuIHlvdSBzYXZlIHJlc291cmNlcyBpbiBhDQotV2ViIHByb2plY3QuIElmIHlvdSBkbyBub3Qgd2FudCB2YWxpZGF0b3JzIHRvIHJ1biBhdXRvbWF0aWNhbGx5IHdoZW4geW91IHNhdmUNCi10aGVzZSByZXNvdXJjZXMsIGVuYWJsZSB0aGUgPHVpY29udHJvbD5PdmVycmlkZSB2YWxpZGF0aW9uPC91aWNvbnRyb2w+IHByZWZlcmVuY2VzDQotb3B0aW9uIGFuZCBkaXNhYmxlIHRoZSA8dWljb250cm9sPlJ1biB2YWxpZGF0aW9uIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3Ugc2F2ZQ0KLWNoYW5nZXMgdG8gcmVzb3VyY2VzPC91aWNvbnRyb2w+IG9wdGlvbi4gPG5vdGU+WW91IGNhbiBhbHNvICBkaXNhYmxlIGF1dG9tYXRpYw0KLXZhbGlkYXRpb24gKGFuZCBidWlsZHMpIGZvciBhbGwgcHJvamVjdHMgYnkgZGlzYWJsaW5nIDx1aWNvbnRyb2w+UGVyZm9ybSBidWlsZA0KLSBhdXRvbWF0aWNhbGx5IG9uIHJlc291cmNlIG1vZGlmaWNhdGlvbjwvdWljb250cm9sPiBmcm9tIHRoZSA8dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPiBwcm9wZXJ0aWVzLg0KLUlmICB5b3UgZGlzYWJsZSBhdXRvbWF0aWMgYnVpbGRzLCB5b3UgY2FuIG1hbnVhbGx5ICBydW4gYSBidWlsZCAoYW5kIHZhbGlkYXRpb24pDQotYnkgc2VsZWN0aW5nICA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5Qcm9qZWN0PC91aWNvbnRyb2w+PHVpY29udHJvbD5SZWJ1aWxkDQotcHJvamVjdDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+Ljwvbm90ZT48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+V2ViIENvbnRlbnQgU2V0dGluZ3M8L2R0Pg0KLTxkZD5Qcm92aWRlIGFueSBhcHBsaWNhYmxlIFdlYiBjb250ZW50IHNldHRpbmdzIGZvciBhIFdlYiBwcm9qZWN0LiBZb3UgY2FuDQotc3BlY2lmeSB0aGUgZG9jdW1lbnQgdHlwZSwgQ1NTIHByb2ZpbGUsIGFuZCB0YXJnZXQgZGV2aWNlLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5XZWIgUHJvamVjdCBGZWF0dXJlczwvZHQ+DQotPGRkPlNlbGVjdCB0aGUgZmVhdHVyZXMgeW91IHdhbnQgdG8gYmUgZW5hYmxlZCBmb3IgeW91ciBXZWIgcHJvamVjdCwgc3VjaA0KLWFzIFBhZ2UgVGVtcGxhdGUgc3VwcG9ydC48L2RkPg0KLTwvZGxlbnRyeT48L2RsPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5XaGVuIHlvdSBoYXZlIGNvbXBsZXRlZCB1cGRhdGVzIHRvIFdlYiBwcm9qZWN0IHNldHRpbmdzLCBjbGljayA8cGg+PHVpY29udHJvbD5PSzwvdWljb250cm9sPjwvcGg+IHRvDQotc2F2ZSBhbmQgY2xvc2UgdGhlIFByb3BlcnRpZXMgZGlhbG9nLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3ByanNldC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cHJqc2V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDFlNDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cHJqc2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzIiAvPgotPG1ldGEgY29udGVudD0iV2ViIHByb2plY3RzLCBwcm9wZXJ0aWVzIHNldHRpbmdzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV2ViIHByb2plY3RzLCBwcm9wZXJ0aWVzIHNldHRpbmdzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0d3ByanNldCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNldHRpbmcgV2ViIHByb2plY3QgcHJvcGVydGllczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdwcmpzZXQiPjxhIG5hbWU9InR3cHJqc2V0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZXR0aW5nIFdlYiBwcm9qZWN0IHByb3BlcnRpZXM8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+VGhlcmUgYXJlIG1hbnkgV2ViIHByb2plY3QgcHJvcGVydGllcyB0aGF0IHlvdSBjYW4gc2V0IHRoYXQgYWZmZWN0Ci10aGUgcGhhc2VzIGluIHRoZSBsaWZlY3ljbGUgb2YgeW91ciBwcm9qZWN0IGFuZCBpdHMgZGVwZW5kZW5jaWVzIG9uIG90aGVyCi1XZWIgcmVzb3VyY2VzIGFuZCBXZWIgZGV2ZWxvcG1lbnQgcHJvY2Vzc2VzLiBZb3UgbWlnaHQgd2FudCB0byB2ZXJpZnkgb3IgdXBkYXRlCi10aGVzZSBwcm9wZXJ0aWVzIGFmdGVyIHlvdSBoYXZlIHVwZGF0ZWQgYW4gZXhpc3RpbmcgcHJvamVjdCBvciBoYXZlIGltcG9ydGVkCi1XZWIgcmVzb3VyY2VzIGludG8gYSBwcm9qZWN0IC48L3A+Ci08cD5UbyB2aWV3IG9yIHNldCBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzLAotZG8gdGhlIGZvbGxvd2luZzogPC9wPgotIDwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0LWNsaWNrIG9uIGEgV2ViIFByb2plY3QsIGFuZCBmcm9tIHRoZSBwb3AtdXAgbWVudSBzZWxlY3QgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGEgcHJvcGVydHkgdHlwZSBpbiB0aGUgbGVmdCBwYW5lIG9mIHRoZSBQcm9wZXJ0aWVzIGRpYWxvZwotdG8gdmlldyBvciB1cGRhdGUgcHJvcGVydGllcyBpbiB0aGUgV2ViIHByb2plY3QuIEZvciBlYWNoIHByb3BlcnR5LCB5b3UgY2FuCi1hcHBseSBjaGFuZ2VzIGFuZCBtb2RpZnkgZGVmYXVsdCBzZXR0aW5ncy4gQmFzZWQgb24gd2hldGhlciB5b3UgaGF2ZSBhIHN0YXRpYwotb3IgYSBkeW5hbWljIFdlYiBwcm9qZWN0LCB0aGUgZm9sbG93aW5nIHByb3BlcnR5IHR5cGVzIGFyZSBhdmFpbGFibGU6PC9zcGFuPgotIDxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5JbmZvPC9kdD4KLQotPGRkPlByb3ZpZGVzIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgcHJvamVjdCB0eXBlLCBsb2NhdGlvbiwgYW5kIG1vZGlmaWNhdGlvbgotc3RhdHVzLiA8L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5CZWFuSW5mbyBQYXRoIChEeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4KLQotPGRkPklmIHlvdSBzZWxlY3QgdGhlIEVuYWJsZSBCZWFuaW5mbyBJbnRyb3NwZWN0aW9uIG9uIHRoaXMgcHJvamVjdCwgeW91IGNhbgotc3BlY2lmeSB0aGUgY29udGVudHMgYW5kIG9yZGVyIG9mIEphdmHihKIgQmVhbiBzZWFyY2ggcGF0aHMgdG8gcHJvdmlkZSBCZWFuIGluZm9ybWF0aW9uCi1yZWxldmFudCB0byB0aGUgcHJvamVjdC4gWW91IGNhbiBhZGQsIHJlbW92ZSwgYW5kIHJlb3JkZXIgKHVzaW5nIHRoZSA8c3Bhbj5VcDwvc3Bhbj4gYW5kIDxzcGFuPkRvd248L3NwYW4+IGJ1dHRvbnMpCi10aGUgcGFja2FnZXMgdXNlZCB0byBpbmNsdWRlIEJlYW4gaW5mb3JtYXRpb24uPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+QnVpbGRlcnM8L2R0PgotCi08ZGQ+QWRkLCByZW1vdmUsIG9yIHJlb3JkZXIgZXh0ZXJuYWwgdG9vbHMgaW4gdGhlIGJ1aWxkIG9yZGVyLiBXaGVuIHlvdSBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiB0bwotY3JlYXRlIGEgbmV3IGV4dGVybmFsIHRvb2wgdG8gdGhlIGxpc3QsIHRoZSBOZXcgRXh0ZXJuYWwgVG9vbCB3aXphcmQgb3BlbnMsCi1zbyB0aGF0IHlvdSBjYW4gZGVmaW5lIHRoZSBuZXcgYnVpbGQgdG9vbC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5KYXZhIEVFIChEeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4KLQotPGRkPklkZW50aWZ5IFdlYiBsZXZlbCBzcGVjaWZpY2F0aW9uIGFuZCBtb2RpZnkgY29udGV4dCByb290IGFuZCBXZWIgY29udGVudAotZm9sZGVyIG5hbWU8L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5KYXZhIEJ1aWxkCi1QYXRoIChEeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4KLQotPGRkPlZpZXcgb3IgY2hhbmdlIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgSmF2YSBidWlsZCBwYXRoIHRoYXQgeW91IHN1cHBsaWVkIHdoZW4gY3JlYXRpbmcKLXRoZSBwcm9qZWN0IHVzaW5nIHRoZSA8c3Bhbj5DcmVhdGUgYSBEeW5hbWljV2ViIFByb2plY3Q8L3NwYW4+IHdpemFyZC4gV2hlbmV2ZXIKLXRoZSBXZWIgcHJvamVjdCBpcyByZWJ1aWx0LCBhbnkgY2xhc3MgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBvciB1cGRhdGVkIHdpbGwKLWJlIG91dHB1dCB0byB0aGUgc3BlY2lmaWVkIG91dHB1dCBmb2xkZXIuIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBBIGxpYnJhcnkgZW50cnkgb24gdGhlIEphdmEgYnVpbGQKLXBhdGggd2lsbCByZW1haW4gdGhlcmUgdW5sZXNzIHRoZSBhY3R1YWwgSkFSIGZpbGUgaXMgZGVsZXRlZCBmcm9tIHRoZSBXRUItSU5GL2xpYgotZm9sZGVyLiBJZiB5b3UgcmVtb3ZlIGEgbGlicmFyeSBwYXRoIGVudHJ5IGJ1dCBub3QgdGhlIEpBUiBmaWxlLCB0aGUgbGlicmFyeQotZW50cnkgd2lsbCBiZSByZS1hZGRlZCB0byB0aGUgcGF0aCBhdXRvbWF0aWNhbGx5LjwvZGl2PgotPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SmF2YSBDb21waWxlcgotKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0PgotCi08ZGQ+RGVmaW5lIHdoZXRoZXIgdG8gdXNlIHdvcmtzcGFjZSBzZXR0aW5ncyBvciBwcm9qZWN0IHNldHRpbmcgZm9yIGNvbXBpbGluZyBKYXZhIGNvZGUsCi1pbmNsdWRpbmcgc2V0dGluZ3MgZm9yIFByb2JsZW1zLCBTdHlsZSwgQ29tcGxpYW5jZSBhbmQgQ2xhc3NmaWxlcywgYW5kIEJ1aWxkCi1QYXRoLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkphdmFkb2MgTG9jYXRpb24gKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0PgotCi08ZGQ+RGVmaW5lIGEgZGVmYXVsdCBsb2NhdGlvbiAoVVJMKSBmb3IgYW55IEphdmFkb2MgYXZhaWxhYmxlIHRvIHRoZSBwcm9qZWN0LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkphdmEgSkFSCi1EZXBlbmRlbmNpZXMgKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0PgotCi08ZGQ+RGVmaW5lIGFuZCByZW9yZGVyIEpBUiBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwcm9qZWN0LiBOb3RlIHRoYXQgdGhlc2UgZGVwZW5kZW5jaWVzCi1tYXkgZGlmZmVyIGJhc2VkIG9uIGEgV2ViIHByb2plY3QncyBhc3NvY2lhdGlvbiB3aXRoIG11bHRpcGxlIEVudGVycHJpc2UgYXBwbGljYXRpb24KLXByb2plY3RzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkpTUCBUYXNrIFRhZ3M8L2R0PgotCi08ZGQ+QWRkLCBlZGl0LCBvciByZW1vdmUgSlNQIHRhc2sgdGFncyBhbmQgYXNzaWduIHRhZyBwcmlvcml0aWVzLiBUaGVzZSAidG8KLWRvIiBpdGVtcyBhcHBlYXIgaW4geW91ciBUYXNrcyB2aWV3LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkpTUCBDb21waWxhdGlvbjwvZHQ+Ci0KLTxkZD5TcGVjaWZ5IHdoZW4gaW4gdGhlIGJ1aWxkIHByb2Nlc3MgYSBKU1Agc2hvdWxkIGJlIHNldCB0byBjb21waWxlPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SlNQIEZyYWdtZW50IChkeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4KLQotPGRkPkRlZmluZSBkZWZhdWx0IGVuY29kaW5nLCBwYWdlIGRpcmVjdGl2ZSwgYW5kIGNvbnRlbnQgdHlwZSB2YWx1ZXMgZm9yIEpTUAotZnJhZ21lbnQgZG9jdW1lbnRzIGluIHRoZSB3ZWIgcHJvamVjdC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5MaW5rcyBWYWxpZGF0aW9uL1JlZmFjdG9yaW5nPC9kdD4KLQotPGRkPkRlZmluZSBwcm9qZWN0LWxldmVsIGxpbmsgbWFuYWdlbWVudCBhbmQgdmFsaWRhdGlvbiBzZXR0aW5ncy4gVGhlc2Ugc2V0dGluZ3MKLW92ZXJyaWRlIGNvcnJlc3BvbmRpbmcgc2V0dGluZ3MgaW4gdGhlIFdvcmtiZW5jaCBQcmVmZXJlbmNlIHNldHRpbmdzIGZvciB0aGUKLWN1cnJlbnQgcHJvamVjdC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Qcm9qZWN0IFJlZmVyZW5jZXM8L2R0PgotCi08ZGQ+UmVmZXJlbmNlIG90aGVyIFdlYiBwcm9qZWN0cyB0aGF0IGV4aXN0IG9uIHlvdXIgd29ya2JlbmNoIHdvcmtzcGFjZS48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5TZXJ2ZXI8L2R0PgotCi08ZGQ+U2VsZWN0IHRoZSBzZXJ2ZXIgaW5zdGFuY2UgdXNlZCB0byBwZXJmb3JtIG5lY2Vzc2FyeSBkZXZlbG9wbWVudCwgdGVzdCwKLWFuZCBwdWJsaXNoaW5nIGZ1bmN0aW9ucyBmb3IgdGhlIHByb2plY3QuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+VmFsaWRhdGlvbjwvZHQ+Ci0KLTxkZD5TcGVjaWZ5IHdoaWNoIHZhbGlkYXRvcnMgc2hvdWxkIHJ1biBmb3IgdGhlIHByb2plY3QsIGFuZCB3aGV0aGVyIHZhbGlkYXRpb24KLXNob3VsZCBvY2N1ciBhdXRvbWF0aWNhbGx5IHdoZW4gcmVzb3VyY2UgdXBkYXRlcyBhcmUgd3JpdHRlbiB0byB0aGUgcHJvamVjdC4KLVRoZSBhdmFpbGFibGUgdmFsaWRhdG9ycyBhcmUgYmFzZWQgb24gdGhlIHR5cGVzIG9mIHJlc291cmNlcyBpbiB5b3VyIHByb2plY3QuCi1CeSBkZWZhdWx0LCB2YWxpZGF0b3JzIGFyZSBhdXRvbWF0aWNhbGx5IHJ1biB3aGVuIHlvdSBzYXZlIHJlc291cmNlcyBpbiBhCi1XZWIgcHJvamVjdC4gSWYgeW91IGRvIG5vdCB3YW50IHZhbGlkYXRvcnMgdG8gcnVuIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3Ugc2F2ZQotdGhlc2UgcmVzb3VyY2VzLCBlbmFibGUgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk92ZXJyaWRlIHZhbGlkYXRpb248L3NwYW4+IHByZWZlcmVuY2VzCi1vcHRpb24gYW5kIGRpc2FibGUgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJ1biB2YWxpZGF0aW9uIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3Ugc2F2ZQotY2hhbmdlcyB0byByZXNvdXJjZXM8L3NwYW4+IG9wdGlvbi4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW4gYWxzbyAgZGlzYWJsZSBhdXRvbWF0aWMKLXZhbGlkYXRpb24gKGFuZCBidWlsZHMpIGZvciBhbGwgcHJvamVjdHMgYnkgZGlzYWJsaW5nIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBlcmZvcm0gYnVpbGQKLSBhdXRvbWF0aWNhbGx5IG9uIHJlc291cmNlIG1vZGlmaWNhdGlvbjwvc3Bhbj4gZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPiBwcm9wZXJ0aWVzLgotSWYgIHlvdSBkaXNhYmxlIGF1dG9tYXRpYyBidWlsZHMsIHlvdSBjYW4gbWFudWFsbHkgIHJ1biBhIGJ1aWxkIChhbmQgdmFsaWRhdGlvbikKLWJ5IHNlbGVjdGluZyAgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlYnVpbGQKLXByb2plY3Q8L3NwYW4+PC9zcGFuPi48L2Rpdj4KLTwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPldlYiBDb250ZW50IFNldHRpbmdzPC9kdD4KLQotPGRkPlByb3ZpZGUgYW55IGFwcGxpY2FibGUgV2ViIGNvbnRlbnQgc2V0dGluZ3MgZm9yIGEgV2ViIHByb2plY3QuIFlvdSBjYW4KLXNwZWNpZnkgdGhlIGRvY3VtZW50IHR5cGUsIENTUyBwcm9maWxlLCBhbmQgdGFyZ2V0IGRldmljZS48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5XZWIgUHJvamVjdCBGZWF0dXJlczwvZHQ+Ci0KLTxkZD5TZWxlY3QgdGhlIGZlYXR1cmVzIHlvdSB3YW50IHRvIGJlIGVuYWJsZWQgZm9yIHlvdXIgV2ViIHByb2plY3QsIHN1Y2gKLWFzIFBhZ2UgVGVtcGxhdGUgc3VwcG9ydC48L2RkPgotCi08L2RsPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5XaGVuIHlvdSBoYXZlIGNvbXBsZXRlZCB1cGRhdGVzIHRvIFdlYiBwcm9qZWN0IHNldHRpbmdzLCBjbGljayA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj48L3NwYW4+IHRvCi1zYXZlIGFuZCBjbG9zZSB0aGUgUHJvcGVydGllcyBkaWFsb2cuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2IC8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdzcnZ3aXouZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3Nydndpei5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTA5MmU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3Nydndpei5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d3NydndpeiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgc2VydmxldHM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+VGhlIHNlcnZsZXQgd2l6YXJkIGhlbHBzIHlvdSBjcmVhdGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc2VydmxldHMgYnkgd2Fsa2luZyB5b3UgdGhyb3VnaCB0aGUNCi1jcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2Ugb3INCi10aGF0IHlvdSBjYW4gbW9kaWZ5IGZvciB1c2Ugd2l0aCB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIHNlcnZsZXRzIGNhbiBydW4NCi1vbiBKYXZhIEVFLWNvbXBsaWFudCBXZWIgc2VydmVycy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zZXJ2bGV0czxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5UbyBjcmVhdGUgYSBzZXJ2bGV0LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOiA8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkZyb20gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUsIGV4cGFuZCB5b3VyICA8eHJlZiBocmVmPSJjY3dlYnByai5kaXRhIg0KLXNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+ZHluYW1pYyBwcm9qZWN0PC94cmVmPiBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlJpZ2h0IGNsaWNrIG9uIHRoZSA8Yj5TZXJ2bGV0PC9iPiBpY29uLCBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+U2VydmxldDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGZyb20NCi10aGUgcG9wLXVwIG1lbnUuPC9jbWQ+PHN0ZXByZXN1bHQ+IFRoZSA8dWljb250cm9sPkNyZWF0ZSBTZXJ2bGV0PC91aWNvbnRyb2w+IHdpemFyZA0KLWFwcGVhcnMuPC9zdGVwcmVzdWx0Pjwvc3RlcD4NCi08c3RlcD48Y21kPkZvbGxvdyB0aGUgcHJvamVjdCB3aXphcmQgcHJvbXB0cy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48cD48Yj5HZW5lcmFsIEluZm9ybWF0aW9uPC9iPjwvcD48ZGw+PGRsZW50cnk+DQotPGR0Pk1vZGlmaWVyczwvZHQ+DQotPGRkPllvdSBjYW4gc2VsZWN0IGEgbW9kaWZpZXIgaW4gdGhlIHdpemFyZCB0byBzcGVjaWZ5IHdoZXRoZXIgeW91ciBzZXJ2bGV0DQotY2xhc3MgaXMgcHVibGljLCBhYnN0cmFjdCwgb3IgZmluYWwuIE5vdGUgdGhhdCBjbGFzc2VzIGNhbm5vdCBiZSBib3RoIGFic3RyYWN0DQotYW5kIGZpbmFsLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5qYXZheC5zZXJ2bGV0LlNlcnZsZXQ8L2R0Pg0KLTxkZD5BbHRob3VnaCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQgaXMgcHJvdmlkZWQgYXMgdGhlIGRlZmF1bHQgaW50ZXJmYWNlLCB5b3UNCi1jYW4gdXNlIHRoZSB3aXphcmQgdG8gYWRkIGFkZGl0aW9uYWwgaW50ZXJmYWNlcyB0byBpbXBsZW1lbnQuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkludGVyZmFjZSBzZWxlY3Rpb24gZGlhbG9nPC9kdD4NCi08ZGQ+VGhpcyBkaWFsb2cgYXBwZWFycyBpZiB5b3UgZWxlY3QgdG8gYWRkIGFuIGludGVyZmFjZSB0byB5b3VyIHNlcnZsZXQuDQotQXMgeW91IHR5cGUgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0aGF0IHlvdSBhcmUgYWRkaW5nLCBhIGxpc3Qgb2YgYXZhaWxhYmxlDQotaW50ZXJmYWNlcyBsaXN0ZWQgaW4gdGhlIE1hdGNoaW5nIHR5cGVzIGxpc3QgYm94IHVwZGF0ZXMgZHluYW1pY2FsbHkgdG8gZGlzcGxheQ0KLW9ubHkgdGhlIGludGVyZmFjZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gWW91IHNob3VsZCBjaG9vc2UgYW4gaW50ZXJmYWNlDQotdG8gc2VlIHRoZSBxdWFsaWZpZXIsIGFuZCB0aGVuIGNsaWNrIE9LIHdoZW4gZmluaXNoZWQuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pk1ldGhvZCBzdHViczwvZHQ+DQotPGRkPllvdSBjYW4gc2VsZWN0IGFueSBhcHByb3ByaWF0ZSBtZXRob2Qgc3R1YnMgdG8gYmUgY3JlYXRlZCBpbiB0aGUgc2VydmxldA0KLWZpbGUuIFRoZSBzdHVicyBjcmVhdGVkIGJ5IHVzaW5nIHRoZSBJbmhlcml0ZWQgYWJzdHJhY3QgbWV0aG9kcyBvcHRpb24gbXVzdA0KLWJlIGltcGxlbWVudGVkIGlmIHlvdSBkbyBub3QgaW50ZW5kIHRvIGNyZWF0ZSBhbiBhYnN0cmFjdCBzZXJ2bGV0LiBOb3RlIHRoYXQNCi10aGlzIGlzIG5vdCB0cnVlIGZvciBDb25zdHJ1Y3RvcnMgZnJvbSBzdXBlcmNsYXNzPC9kZD4NCi08L2RsZW50cnk+PC9kbD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3c3J2d2l6Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdzcnZ3aXouaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhMWFjNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdzcnZ3aXouaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIHNlcnZsZXRzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSBzZXJ2bGV0IHdpemFyZCBoZWxwcyB5b3UgY3JlYXRlIEphdmEgc2VydmxldHMgYnkgd2Fsa2luZyB5b3UgdGhyb3VnaCB0aGUgY3JlYXRpb24gcHJvY2VzcyBhbmQgYnkgcHJvdmlkaW5nIHlvdSB3aXRoIG91dHB1dCBmaWxlcyB0aGF0IHlvdSBjYW4gdXNlIG9yIHRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgc2VydmxldHMgY2FuIHJ1biBvbiBKYXZhIEVFLWNvbXBsaWFudCBXZWIgc2VydmVycy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIHNlcnZsZXQgd2l6YXJkIGhlbHBzIHlvdSBjcmVhdGUgSmF2YSBzZXJ2bGV0cyBieSB3YWxraW5nIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2Ugb3IgdGhhdCB5b3UgY2FuIG1vZGlmeSBmb3IgdXNlIHdpdGggeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBzZXJ2bGV0cyBjYW4gcnVuIG9uIEphdmEgRUUtY29tcGxpYW50IFdlYiBzZXJ2ZXJzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InNlcnZsZXRzLCBjcmVhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InNlcnZsZXRzLCBjcmVhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3NlcnZibi5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3c3J2d2l6IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgc2VydmxldHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3c3J2d2l6Ij48YSBuYW1lPSJ0d3NydndpeiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgc2VydmxldHM8L2gxPgotCi0KLQotPGRpdj48cD5UaGUgc2VydmxldCB3aXphcmQgaGVscHMgeW91IGNyZWF0ZSBKYXZh4oSiIHNlcnZsZXRzIGJ5IHdhbGtpbmcgeW91IHRocm91Z2ggdGhlCi1jcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2Ugb3IKLXRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgc2VydmxldHMgY2FuIHJ1bgotb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+VG8gY3JlYXRlIGEgc2VydmxldCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSwgZXhwYW5kIHlvdXIgIDxhIGhyZWY9ImNjd2VicHJqLmh0bWwiIHRpdGxlPSIiPmR5bmFtaWMgcHJvamVjdDwvYT4gaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldy48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIG9uIHRoZSA8c3Ryb25nPlNlcnZsZXQ8L3N0cm9uZz4gaWNvbiwgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNlcnZsZXQ8L3NwYW4+PC9zcGFuPiBmcm9tCi10aGUgcG9wLXVwIG1lbnUuPC9zcGFuPiAgVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBTZXJ2bGV0PC9zcGFuPiB3aXphcmQKLWFwcGVhcnMuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gb2xsb3cgdGhlIHByb2plY3Qgd2l6YXJkIHByb21wdHMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPjxzdHJvbmc+R2VuZXJhbCBJbmZvcm1hdGlvbjwvc3Ryb25nPjwvcD4KLTxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Nb2RpZmllcnM8L2R0PgotCi08ZGQ+WW91IGNhbiBzZWxlY3QgYSBtb2RpZmllciBpbiB0aGUgd2l6YXJkIHRvIHNwZWNpZnkgd2hldGhlciB5b3VyIHNlcnZsZXQKLWNsYXNzIGlzIHB1YmxpYywgYWJzdHJhY3QsIG9yIGZpbmFsLiBOb3RlIHRoYXQgY2xhc3NlcyBjYW5ub3QgYmUgYm90aCBhYnN0cmFjdAotYW5kIGZpbmFsLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPmphdmF4LnNlcnZsZXQuU2VydmxldDwvZHQ+Ci0KLTxkZD5BbHRob3VnaCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQgaXMgcHJvdmlkZWQgYXMgdGhlIGRlZmF1bHQgaW50ZXJmYWNlLCB5b3UKLWNhbiB1c2UgdGhlIHdpemFyZCB0byBhZGQgYWRkaXRpb25hbCBpbnRlcmZhY2VzIHRvIGltcGxlbWVudC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5JbnRlcmZhY2Ugc2VsZWN0aW9uIGRpYWxvZzwvZHQ+Ci0KLTxkZD5UaGlzIGRpYWxvZyBhcHBlYXJzIGlmIHlvdSBlbGVjdCB0byBhZGQgYW4gaW50ZXJmYWNlIHRvIHlvdXIgc2VydmxldC4KLUFzIHlvdSB0eXBlIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCB5b3UgYXJlIGFkZGluZywgYSBsaXN0IG9mIGF2YWlsYWJsZQotaW50ZXJmYWNlcyBsaXN0ZWQgaW4gdGhlIE1hdGNoaW5nIHR5cGVzIGxpc3QgYm94IHVwZGF0ZXMgZHluYW1pY2FsbHkgdG8gZGlzcGxheQotb25seSB0aGUgaW50ZXJmYWNlcyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLiBZb3Ugc2hvdWxkIGNob29zZSBhbiBpbnRlcmZhY2UKLXRvIHNlZSB0aGUgcXVhbGlmaWVyLCBhbmQgdGhlbiBjbGljayBPSyB3aGVuIGZpbmlzaGVkLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPk1ldGhvZCBzdHViczwvZHQ+Ci0KLTxkZD5Zb3UgY2FuIHNlbGVjdCBhbnkgYXBwcm9wcmlhdGUgbWV0aG9kIHN0dWJzIHRvIGJlIGNyZWF0ZWQgaW4gdGhlIHNlcnZsZXQKLWZpbGUuIFRoZSBzdHVicyBjcmVhdGVkIGJ5IHVzaW5nIHRoZSBJbmhlcml0ZWQgYWJzdHJhY3QgbWV0aG9kcyBvcHRpb24gbXVzdAotYmUgaW1wbGVtZW50ZWQgaWYgeW91IGRvIG5vdCBpbnRlbmQgdG8gY3JlYXRlIGFuIGFic3RyYWN0IHNlcnZsZXQuIE5vdGUgdGhhdAotdGhpcyBpcyBub3QgdHJ1ZSBmb3IgQ29uc3RydWN0b3JzIGZyb20gc3VwZXJjbGFzczwvZGQ+Ci0KLTwvZGw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dzZXJ2Ym4uaHRtbCI+U2VydmxldHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvd2VidG9vbHNfdG9jLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci93ZWJ0b29sc190b2MuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyNTkxZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci93ZWJ0b29sc190b2MuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iDQotICJtYXAuZHRkIj4NCi08bWFwIGlkPSJ3ZWJhcHBkZXZlbG9wbWVudCIgbGlua2luZz0ibm9uZSIgdGl0bGU9IldlYiBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3d0b3Zlci5kaXRhIiBuYXZ0aXRsZT0iV2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3dGZlYXR1cmVzLmRpdGEiIG5hdnRpdGxlPSJXZWIgdG9vbHMgZmVhdHVyZXMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3ZWJ2dy5kaXRhIiBuYXZ0aXRsZT0iUHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicmVzb3VyY2VzLmRpdGEiIG5hdnRpdGxlPSJXZWIgcmVzb3VyY2VzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnBhZ2VkZXNpZ24uZGl0YSIgbmF2dGl0bGU9IldlYiBwYWdlIGRlc2lnbiI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicHJvamVjdHMuZGl0YSIgbmF2dGl0bGU9IldlYiBwcm9qZWN0cyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dhcm92ci5kaXRhIiBuYXZ0aXRsZT0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXByai5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd2VicHJqLmRpdGEiIG5hdnRpdGxlPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXN0YS5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdwY252cnQuZGl0YSIgbmF2dGl0bGU9IkNvbnZlcnRpbmcgc3RhdGljIFdlYiBwcm9qZWN0cyB0byBkeW5hbWljIFdlYiBwcm9qZWN0cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njc3RhdGljLmRpdGEiIG5hdnRpdGxlPSJTdGF0aWMgV2ViIHByb2plY3RzIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2ltcHdhci5kaXRhIiBuYXZ0aXRsZT0iSW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmV3YXIuZGl0YSIgbmF2dGl0bGU9IkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3cGxpYi5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdwcmpzZXQuZGl0YSIgbmF2dGl0bGU9IlNldHRpbmcgV2ViIHByb2plY3QgcHJvcGVydGllcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d3ZWR0dncuZGl0YSIgbmF2dGl0bGU9IldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpkZXRhZ3MuZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlaHRtLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpwcmVmcy5kaXRhIiBuYXZ0aXRsZT0iRGVmaW5pbmcgSFRNTCBmaWxlIHByZWZlcmVuY2VzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHN0eWxlc2hlZXQuZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIGNhc2NhZGluZyBzdHlsZSBzaGVldHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amNyZWpzcC5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jcGRqc3BzLmRpdGEiIG5hdnRpdGxlPSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJhcnRpZmFjdC5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgV2ViIEFydGlmYWN0cyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3Nydndpei5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgc2VydmxldHMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dzZXJ2Ym4uZGl0YSIgbmF2dGl0bGU9IlNlcnZsZXRzIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2xzdHdpei5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgTGlzdGVuZXJzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3bGlzdGJuLmRpdGEiIG5hdnRpdGxlPSJMaXN0ZW5lcnMiPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Zmx0d2l6LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBGaWx0ZXJzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZmlsdGJuLmRpdGEiIG5hdnRpdGxlPSJGaWx0ZXJzIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjdnNyLmRpdGEiIG5hdnRpdGxlPSJTZXR0aW5nIENWUyByZXBvc2l0b3J5IGRlZmF1bHRzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNlcnZlcnRhcmdldC5kaXRhIiBuYXZ0aXRsZT0iU2VydmVyIHRhcmdldGluZyBmb3IgV2ViIGFwcGxpY2F0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08L21hcD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci93ZWJ0b29sc190b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvd2VidG9vbHNfdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlMWY2YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci93ZWJ0b29sc190b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iV2ViIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IiB0b3BpYz0idG9waWNzL2Njd3RvdmVyLmh0bWwiPgotPHRvcGljIGxhYmVsPSJXZWIgYXBwbGljYXRpb24gb3ZlcnZpZXciIGhyZWY9InRvcGljcy9jY3d0b3Zlci5odG1sIj4KLTx0b3BpYyBsYWJlbD0iV2ViIHRvb2xzIGZlYXR1cmVzIiBocmVmPSJ0b3BpY3MvY3d0ZmVhdHVyZXMuaHRtbCI+Ci08dG9waWMgbGFiZWw9IlByb2plY3QgRXhwbG9yZXIgdmlldyBhbmQgV2ViIGRldmVsb3BtZW50IiBocmVmPSJ0b3BpY3MvY2N3ZWJ2dy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IldlYiByZXNvdXJjZXMiIGhyZWY9InRvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iV2ViIHBhZ2UgZGVzaWduIiBocmVmPSJ0b3BpY3MvY3dlYnBhZ2VkZXNpZ24uaHRtbCIvPgotPC90b3BpYz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IldlYiBwcm9qZWN0cyIgaHJlZj0idG9waWNzL2N3ZWJwcm9qZWN0cy5odG1sIj4KLTx0b3BpYyBsYWJlbD0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiIGhyZWY9InRvcGljcy9jd3dhcm92ci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCIgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmh0bWwiPgotPHRvcGljIGxhYmVsPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIiBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiIGhyZWY9InRvcGljcy90d2NyZXN0YS5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQ29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzIiBocmVmPSJ0b3BpY3MvdHdwY252cnQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTdGF0aWMgV2ViIHByb2plY3RzIiBocmVmPSJ0b3BpY3MvY2NzdGF0aWMuaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzIiBocmVmPSJ0b3BpY3MvdHdpbXB3YXIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXMiIGhyZWY9InRvcGljcy90d2NyZXdhci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBXZWIgbGlicmFyeSBwcm9qZWN0cyIgaHJlZj0idG9waWNzL3R3cGxpYi5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgV2ViIHByb2plY3QgcHJvcGVydGllcyIgaHJlZj0idG9waWNzL3R3cHJqc2V0Lmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzIiBocmVmPSJ0b3BpY3MvY3d3ZWR0dncuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhbmQgZWRpdGluZyBXZWIgcGFnZXMgLSBvdmVydmlldyIgaHJlZj0idG9waWNzL3RqZGV0YWdzLmh0bWwiPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzIiBocmVmPSJ0b3BpY3MvdGpjcmVodG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJEZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90anByZWZzLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyIgaHJlZj0idG9waWNzL3RzdHlsZXNoZWV0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyIgaHJlZj0idG9waWNzL3RqY3JlanNwLmh0bWwiPgotPHRvcGljIGxhYmVsPSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiIGhyZWY9InRvcGljcy9jcGRqc3BzLmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIFdlYiBBcnRpZmFjdHMiIGhyZWY9InRvcGljcy9jd2ViYXJ0aWZhY3QuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIHNlcnZsZXRzIiBocmVmPSJ0b3BpY3MvdHdzcnZ3aXouaHRtbCI+Ci08dG9waWMgbGFiZWw9IlNlcnZsZXRzIiBocmVmPSJ0b3BpY3MvY3dzZXJ2Ym4uaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgTGlzdGVuZXJzIiBocmVmPSJ0b3BpY3MvdHdsc3R3aXouaHRtbCI+Ci08dG9waWMgbGFiZWw9Ikxpc3RlbmVycyIgaHJlZj0idG9waWNzL2N3bGlzdGJuLmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIEZpbHRlcnMiIGhyZWY9InRvcGljcy90d2ZsdHdpei5odG1sIj4KLTx0b3BpYyBsYWJlbD0iTGlzdGVuZXJzIiBocmVmPSJ0b3BpY3MvY3dmaWx0Ym4uaHRtbCIvPgotPC90b3BpYz4KLTwvdG9waWM+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIENWUyByZXBvc2l0b3J5IGRlZmF1bHRzIiBocmVmPSJ0b3BpY3MvdHdjdnNyLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU2VydmVyIHRhcmdldGluZyBmb3IgV2ViIGFwcGxpY2F0aW9ucyIgaHJlZj0idG9waWNzL3RzZXJ2ZXJ0YXJnZXQuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTBmZjY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjM3OjIxIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAxNiAxNDowNToyOSBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9FZGl0b3JYbWxDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9FZGl0b3JYbWxDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MmI0YTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvRWRpdG9yWG1sQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0JKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0JKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLQkqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0JKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotCSogCi0JKiBDb250cmlidXRvcnM6Ci0JKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08IS0tcGx1Z2luOiBvcmcuZWNsaXBzZS53c3QueG1sLnVpIC0tPgotPGNvbnRleHRzPgotCTxjb250ZXh0IGlkPSJjc2hfb3V0ZXJfY29udGFpbmVyIj4KLQkJPGRlc2NyaXB0aW9uIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3ZWJ4MDA2MCI+PCEtLSBYTUwgRmlsZXMgcHJlZmVyZW5jZSBwYWdlICAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJPHA+VGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGZpbGUgc3VmZml4IGFuZCB0ZXh0IGVuY29kaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGNyZWF0ZSBvciBzYXZlIGFuIFhNTCByZWxhdGVkIGZpbGUuPC9wPgotCi0JCQk8cD5UaGUgZW5jb2RpbmcgYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2Rpbmcgc2V0IHRoYXQgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIFhNTCByZWxhdGVkIGZpbGVzIChEVERzLCBYTUwgZmlsZXMsIFhNTCBzY2hlbWFzKS4gQ2hhbmdpbmcgdGhlIGVuY29kaW5nIGNhdXNlcyBhbnkgbmV3LCBYTUwgcmVsYXRlZCBmaWxlcyB0aGF0IGFyZSBjcmVhdGVkIGZyb20gc2NyYXRjaCB0byB1c2UgdGhlIHNlbGVjdGVkIGVuY29kaW5nLjwvcD4KLQotCQkJPHA+WW91IGNhbiBhbHNvIHNldCB0aGUgdHlwZSBvZiBtZXNzYWdlIHRoYXQgd2lsbCBhcHBlYXIgaW4gdGhlIHByb2JsZW1zIHZpZXcgd2hlbiBhIHJlc291cmNlIGlzIHZhbGlkYXRlZCB3aXRoIG5vIHNwZWNpZmllZCBncmFtbWFyLjwvcD4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRlbmMuaHRtbCIgbGFiZWw9IlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgYW5kIGxpbmUgZGVsaW1pdGVycyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndlYngwMDYxIj48IS0tIEVkaXRvciBwcmVmZXJlbmNlcyBwYWdlIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQk8cD5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgZm9ybWF0dGluZyBhbmQgY29udGVudCBhc3Npc3QgcHJlZmVyZW5jZXMgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiBlZGl0aW5nIGFuIFhNTCBmaWxlLjwvcD4KLQotCQkJPHA+RW50ZXIgYSBtYXhpbXVtIHdpZHRoIGluIHRoZSA8Yj5MaW5lIHdpZHRoPC9iPiBmaWVsZCB0byBzcGVjaWZ5IHdoZW4gYSBsaW5lIHNob3VsZCBiZSBicm9rZW4gdG8gZml0IG9udG8gbW9yZSB0aGFuIG9uZSBsaW5lLiBUaGlzIHdpbGwgYmUgYXBwbGllZCB3aGVuIHRoZSBkb2N1bWVudCBpcyBmb3JtYXR0ZWQuCi0JCQk8L3A+Ci0JCQotCi0JCQk8cD5TZWxlY3QgPGI+U3BsaXQgbXVsdGlwbGUgYXR0cmlidXRlcyBlYWNoIG9uIGEgbmV3IGxpbmU8L2I+IHRvIHN0YXJ0IGV2ZXJ5IGF0dHJpYnV0ZSBvbiBhIG5ldyBsaW5lIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZvcm1hdHRlZC4KLQkJCTwvcD4KLQotCQkJPHA+Ci0JCQkJU2VsZWN0IDxiPkNsZWFyIGFsbCBibGFuayBsaW5lczwvYj4gdG8gcmVtb3ZlIGJsYW5rIGxpbmVzIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZvcm1hdHRlZC4KLQkJCTwvcD4KLQotCQkJPHA+Ci0JCQkJU2VsZWN0IDxiPkluZGVudCB1c2luZyB0YWJzPC9iPiBpZiB5b3Ugd2FudCB0byB1c2UgdGFiIGNoYXJhY3RlcnMgKFx0KSBhcyB0aGUgc3RhbmRhcmQgZm9ybWF0dGluZyBpbmRlbnRhdGlvbi4gSWYgeW91IHByZWZlciB0byB1c2Ugc3BhY2VzLCBzZWxlY3QgPGI+SW5kZW50IHVzaW5nIHNwYWNlczwvYj4uCi0JCQk8L3A+Ci0KLQkJCTxwPgotCQkJCVlvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSA8Yj5JbmRlbnRhdGlvbiBzaXplPC9iPiB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHRhYnMgb3Igc3BhY2UgY2hhcmFjdGVycyB1c2VkIGZvciBmb3JtYXR0aW5nIGluZGVudGF0aW9uLgotCQkJPC9wPgotCi0JCQk8cD4KLQkJCQlUbyBhcHBseSB0aGVzZSBmb3JtYXR0aW5nIHN0eWxlcywgcmlnaHQtY2xpY2sgaW4geW91ciBYTUwgZG9jdW1lbnQsIGFuZCBjbGljayA8Yj5Gb3JtYXQgJmd0OyBEb2N1bWVudDwvYj4uCi0JCQk8L3A+Ci0KLQkJCTxwPgotCQkJCUlmIHRoZSA8Yj5BdXRvbWF0aWNhbGx5IG1ha2Ugc3VnZ2VzdGlvbnM8L2I+IGNoZWNrIGJveCBpcyBzZWxlY3RlZCwgeW91IGNhbiBzcGVjaWZ5IHRoYXQgY2VydGFpbiBjaGFyYWN0ZXJzIHdpbGwgY2F1c2UgdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgdG8gcG9wIHVwIGF1dG9tYXRpY2FsbHkuIFNwZWNpZnkgdGhlc2UgY2hhcmFjdGVycyBpbiB0aGUgPGI+UHJvbXB0IHdoZW4gdGhlc2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQ8L2I+IGZpZWxkLgotCQkJPC9wPgotCi0JCQk8cD4KLQkJCQlJZiB5b3Ugc2VsZWN0IDxiPlN0cmljdDwvYj4gZnJvbSB0aGUgPGI+U3VnZ2VzdGlvbiBzdHJhdGVneTwvYj4gbGlzdCwgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIHNob3duIGZpcnN0ICh3aXRoIGJvbGQgaWNvbnMpIGluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LiBPdGhlciBzdWdnZXN0aW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBlbGVtZW50IHNjb3BlLCBidXQgbm90IGdyYW1tYXRpY2FsbHkgdmFsaWQsIHdpbGwgYmUgc2hvd24gYmVsb3cgdGhlbSB3aXRoIGEgZGUtZW1waGFzaXplZCBpY29uLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyA8Yj5MYXg8L2I+LgotCQkJPC9wPgotCi0JCQk8cD4KLQkJCQlJZiBhIERURCBvciBzY2hlbWEgKG9yIG90aGVyIG1vZGVsKSBpcyBub3Qgc3BlY2lmaWVkIGZvciBhbiBYTUwgZmlsZSwgc2VsZWN0aW5nIDxiPlVzZSBpbmZlcnJlZCBncmFtbWFyIGluIGFic2VuY2Ugb2YgRFREL1NjaGVtYTwvYj4gYWxsb3dzIHRoZSBlZGl0b3IgdG8gImd1ZXNzIiB3aGF0IGVsZW1lbnRzIG9yIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSBiYXNlZCBvbiBleGlzdGluZyBjb250ZW50LgotCQkJPC9wPgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5odG1sIiBsYWJlbD0iRGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlcyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndlYngwMDYyIj48IS0tIFN5bnRheCBDb2xvcmluZyBwcmVmZXJlbmNlIHBhZ2UgLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCTxwPlRoaXMgcGFnZSBsZXRzIHlvdSBjdXN0b21pemUgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcgdGhhdCB0aGUgWE1MIGVkaXRvciBkb2VzIHdoZW4geW91IGFyZSBlZGl0aW5nIGEgZmlsZS48L3A+Ci0KLQkJCTxwPgotCQkJCVRoZSA8Yj5Db250ZW50IHR5cGU8L2I+IGZpZWxkIGNvbnRhaW5zIGEgbGlzdCBvZiBhbGwgdGhlIHNvdXJjZSB0eXBlcyB0aGF0IHlvdSBjYW4gc2VsZWN0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci4gWW91IGNhbiBlaXRoZXIgc2VsZWN0IHRoZSBjb250ZW50IHR5cGUgdGhhdCB5b3Ugd2FudCB0byB3b3JrIHdpdGggZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QsIG9yIGNsaWNrIHRleHQgaW4gdGhlIHRleHQgc2FtcGxlIHdpbmRvdyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjb250ZW50IHR5cGUgZm9yIHdoaWNoIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgdGV4dCBoaWdobGlnaHRpbmcuCi0JCQk8L3A+Ci0KLQkJCTxwPgotCQkJCVRoZSA8Yj5Gb3JlZ3JvdW5kPC9iPiBhbmQgPGI+QmFja2dyb3VuZDwvYj4gYnV0dG9ucyBvcGVuIDxiPkNvbG9yPC9iPiBkaWFsb2cgYm94ZXMgdGhhdCBhbGxvdyB5b3UgdG8gc3BlY2lmeSB0ZXh0IGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzLCByZXNwZWN0aXZlbHkuIFNlbGVjdCB0aGUgPGI+Qm9sZDwvYj4gY2hlY2sgYm94IHRvIG1ha2UgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUgYXBwZWFyIGluIGJvbGQuCi0JCQk8L3A+Ci0KLQkJCTxwPgotCQkJCUNsaWNrIHRoZSA8Yj5SZXN0b3JlIERlZmF1bHRzPC9iPiBidXR0b24gdG8gc2V0IHRoZSBoaWdobGlnaHRpbmcgc3R5bGVzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuIElmIHlvdSBvbmx5IHdhbnQgdG8gcmVzZXQgdGhlIHZhbHVlIGZvciBhIHBhcnRpY3VsYXIgY29udGVudCB0eXBlLCBzZWxlY3QgaXQgaW4gdGhlIDxiPkNvbnRlbnQgdHlwZTwvYj4gZmllbGQsIHRoZSBjbGljayB0aGUgPGI+UmVzdG9yZSBEZWZhdWx0PC9iPiBidXR0b24gbmV4dCB0byBpdC4KLQkJCTwvcD4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R0YWdoaWx0Lmh0bWwiIGxhYmVsPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2VieDAwNjMiPjwhLS0gVGVtcGxhdGVzIHByZWZlcmVuY2UgcGFnZSAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJPHA+VGhpcyBwYWdlIGxldHMgeW91IGNyZWF0ZSBuZXcgdGVtcGxhdGVzIGFuZCBlZGl0IGV4aXN0aW5nIG9uZXMgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGVkaXRpbmcgYW4gWE1MIGZpbGUuIEEgdGVtcGxhdGUgaXMgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS48L3A+Ci0KLQkJCTxwPkNsaWNrIDxiPk5ldzwvYj4gaWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgY29tcGxldGVseSBuZXcgdGVtcGxhdGUuCi0JCQk8L3A+Ci0KLQkJCTxwPlN1cHBseSBhIG5ldyB0ZW1wbGF0ZSA8Yj5OYW1lPC9iPiBhbmQgPGI+RGVzY3JpcHRpb248L2I+LiBUaGUgPGI+Q29udGV4dDwvYj4gZm9yIHRoZSB0ZW1wbGF0ZSBpcyB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbCBsaXN0IHdoZW4gY29udGVudCBhc3Npc3QgaXMgcmVxdWVzdGVkLiBTcGVjaWZ5IHRoZSA8Yj5QYXR0ZXJuPC9iPiBmb3IgeW91ciB0ZW1wbGF0ZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyB0byBiZSBpbnNlcnRlZCBieSBjb250ZW50IGFzc2lzdC4KLQkJCTwvcD4KLQotCQkJPHA+Ci0JCQkJSWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8Yj5JbnNlcnQgVmFyaWFibGU8L2I+IGJ1dHRvbiBhbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC4gRm9yIGV4YW1wbGUsIHRoZSA8Yj5kYXRlPC9iPiB2YXJpYWJsZSBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgZGF0ZSB3aWxsIGJlIGluc2VydGVkLgotCQkJPC9wPgotCi0JCQk8cD5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUgc2FtZSBQcmVmZXJlbmNlcyBwYWdlLiBJZiB5b3UgaGF2ZSBtb2RpZmllZCBhIGRlZmF1bHQgdGVtcGxhdGUsIHlvdSBjYW4gcmVzdG9yZSBpdCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBhbHNvIHJlc3RvcmUgYSByZW1vdmVkIHRlbXBsYXRlIGlmIHlvdSBoYXZlIG5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLjwvcD4KLQotCQkJPHA+Ci0JCQkJSWYgeW91IGhhdmUgYSB0ZW1wbGF0ZSB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QsIGNsZWFyIGl0cyBjaGVjayBib3ggaW4gdGhlIDxiPlRlbXBsYXRlczwvYj4gcHJlZmVyZW5jZXMgcGFnZS4KLQkJCTwvcD4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3bWFjcm8uaHRtbCIgbGFiZWw9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieG1sbTEyMDAiPjwhLS0gZG9lc24ndCBleGlzdCBpbiB4bWwgcHJlZmVyZW5jZXMgLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCUNsZWFudXAgb3B0aW9ucyBlbmFibGUgeW91IHRvIHVwZGF0ZSBhIGRvY3VtZW50IHNvIHRoYXQgaXQgaXMgd2VsbC1mb3JtZWQgYW5kIGNvbnNpc3RlbnRseSBmb3JtYXR0ZWQuCi0KLQkJCVRoZSBmb2xsb3dpbmcgY2xlYW51cCBvcHRpb25zIGNhbiBiZSBzZXQgdG8gb24gb3Igb2ZmLCBzbyB0aGF0IHlvdSBjYW4gbGltaXQgdGhlIHR5cGUgb2YgY2xlYW51cCBwZXJmb3JtZWQ6Ci0KLQkJCS0gPGI+Q29tcHJlc3MgZW1wdHkgZWxlbWVudCB0YWdzPC9iPjogQ29tcHJlc3MgZWxlbWVudCB0YWdzIHdpdGggbm8gY29udGVudCB0byBvbmUgdGFnIHdpdGggYW4gZW5kIHRhZyBkZWxpbWl0ZXIgKGllOiBjaGFuZ2UgJmx0O3RhZyZndDsmbHQ7L3RhZyZndDsgdG8gJmx0O3RhZy8mZ3Q7KS4KLQotCQkJLSA8Yj5JbnNlcnQgcmVxdWlyZWQgYXR0cmlidXRlczwvYj46IEluc2VydHMgYW55IG1pc3NpbmcgYXR0cmlidXRlcyB0aGF0IGFyZSByZXF1aXJlZCBieSB0aGUgdGFnIHRvIG1ha2UgdGhlIGVsZW1lbnQgb3IgZG9jdW1lbnQgd2VsbC1mb3JtZWQuCi0KLQkJCS0gPGI+SW5zZXJ0IG1pc3NpbmcgdGFnczwvYj46IENvbXBsZXRlcyBhbnkgbWlzc2luZyB0YWdzIChzdWNoIGFzIGFkZGluZyBhbiBlbmQgdGFnKSBuZWNlc3NhcnkgdG8gbWFrZSB0aGUgZWxlbWVudCBvciBkb2N1bWVudCB3ZWxsLWZvcm1lZC4KLQotCQkJLSA8Yj5RdW90ZSBhdHRyaWJ1dGUgdmFsdWVzPC9iPjogQXBwcm9wcmlhdGVseSBhZGRzIGRvdWJsZS0gb3Igc2luZ2xlLXF1b3RlcyBiZWZvcmUgYW5kIGFmdGVyIGF0dHJpYnV0ZSB2YWx1ZXMgaWYgdGhleSBhcmUgbWlzc2luZy4KLQotCQkJLSA8Yj5Gb3JtYXQgc291cmNlPC9iPjogRm9ybWF0cyB0aGUgZG9jdW1lbnQganVzdCBhcyB0aGUgPGI+Rm9ybWF0IERvY3VtZW50PC9iPiBjb250ZXh0IG1lbnUgb3B0aW9uIGRvZXMsIGltbWVkaWF0ZWx5IGFmdGVyIHBlcmZvcm1pbmcgYW55IG90aGVyIHNwZWNpZmllZCA8Yj5DbGVhbnVwPC9iPiBvcHRpb25zLgotCi0JCQktIDxiPkNvbnZlcnQgbGluZSBkZWxpbWl0ZXJzIHRvPC9iPjogQ29udmVydHMgYWxsIGxpbmUgZGVsaW1pdGVycyBpbiB0aGUgZmlsZSB0byB0aGUgc2VsZWN0ZWQgb3BlcmF0aW5nIHN5c3RlbSdzIHR5cGUuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHNyYy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4Y3VpMDUwMCI+PCEtLSBhZGQgbmV3IGF0dHJpYnV0ZSBkaWFsb2cgLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCUVudGVyIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIDxiPk5hbWU8L2I+IGZpZWxkLCB0aGVuIGVudGVyIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGluIHRoZSA8Yj5WYWx1ZTwvYj4gZmllbGQuIENsaWNrIDxiPk9LPC9iPi4gVGhlIGF0dHJpYnV0ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBmaWxlLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieGN1aTAwMTAiPjwhLS0gIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlUaGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiBhbiBYTUwgZmlsZSBpcyB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiB1c2UgdGhlIDxiPlB1YmxpYyBJRDwvYj4gZmllbGQgdG8gY3JlYXRlIGFuIGFzc29jaWF0aW9uIHVzaW5nIGFuIFhNTCBDYXRhbG9nIGVudHJ5IG9yIHRoZSA8Yj5TeXN0ZW0gSUQ8L2I+IGZpZWxkIHRvIGNyZWF0ZSBhbiBhc3NvY2lhdGlvbiB1c2luZyBhIGZpbGUgaW4gdGhlIHdvcmtiZW5jaC4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgLz4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRkb2MuaHRtbCIgbGFiZWw9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4Y3VpMDAyMCI+PCEtLSBlZGl0IGRvY3R5cGUgZGVjbGFyYXRpb24gZGlhbG9nIC0tPgotCQk8ZGVzY3JpcHRpb24+VGhpcyBzaG91bGQgbWF0Y2ggdGhlIG5hbWUgb2YgeW91ciBYTUwgZmlsZSdzIHJvb3QgZWxlbWVudC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiAvPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5odG1sIiBsYWJlbD0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhjdWkwMDMwIj48IS0tIGVkaXQgZG9jdHlwZSBkZWNsYXJhdGlvbiBkaWFsb2cgLS0+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgdmFsdWUgaW4gdGhpcyBmaWVsZCBpcyB0aGUgUHVibGljIElkZW50aWZpZXIuIEl0IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBYTUwgZmlsZSAodXNpbmcgYW4gWE1MIGNhdGFsb2cgZW50cnkpIHdpdGggYSBEVEQgZmlsZSBieSBwcm92aWRpbmcgYSBoaW50IHRvIHRoZSBYTUwgcHJvY2Vzc29yLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwiIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieGN1aTAwNTAiPjwhLS0gZWRpdCBkb2N0eXBlIGRlY2xhcmF0aW9uIGRpYWxvZyAtLT4KLQkJPGRlc2NyaXB0aW9uPlRoZSB2YWx1ZSBpbiB0aGlzIGZpZWxkIGlzIHRoZSBEVEQgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4gWW91IGNhbiBjaGFuZ2UgdGhlIERURCB0aGUgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYnkgZWRpdGluZyB0aGlzIGZpZWxkLiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHRyeSB0byB1c2UgdGhlIFB1YmxpYyBJRCB0byBsb2NhdGUgdGhlIERURCwgYW5kIGlmIHRoaXMgZmFpbHMsIGl0IHdpbGwgdXNlIHRoZSBTeXN0ZW0gSUQgdG8gZmluZCBpdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiAvPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5odG1sIiBsYWJlbD0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhjdWkwNjAwIj48IS0tIGFkZCBlbGVtZW50IGRpYWxvZyAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJRW50ZXIgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIDxiPkVsZW1lbnQgbmFtZTwvYj4gZmllbGQsIHRoZW4gY2xpY2sgPGI+T0s8L2I+LiBUaGUgZWxlbWVudCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBmaWxlLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieGN1aTAzMDAiPjwhLS0gZWRpdCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGRpYWxvZyAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJQSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGlzIGEgc3ludGF4IGluIFhNTCBmb3IgcGFzc2luZyBpbnN0cnVjdGlvbnMgYWxvbmcgdG8gdGhlIGFwcGxpY2F0aW9uIHVzaW5nIGFuIFhNTCBkb2N1bWVudC4gVGhlIDxiPlRhcmdldDwvYj4gZmllbGQgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgYXBwbGljYXRpb24gdGhlIGluc3RydWN0aW9ucyBiZWxvbmdzIHRvLiBUaGUgPGI+RGF0YTwvYj4gZmllbGQgY29udGFpbnMgdGhlIGluc3RydWN0aW9ucy4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgLz4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcm9jLmh0bWwiIGxhYmVsPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhjdWkwMTAwIj48IS0tIGVkaXQgc2NoZW1hIGluZm9ybWF0aW9uIChuYW1lc3BhY2UgZGVjbGFyYXRpb24pIGRpYWxvZyAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJVGhpcyBpcyBhIHJlYWQtb25seSBkaWFsb2cuIFNlbGVjdCB0aGUgZW50cnkgeW91IHdhbnQgdG8gZWRpdCBhbmQgY2xpY2sgPGI+RWRpdDwvYj4uCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyB5b3VyIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhjdWkwMjAwIj48IS0tIGFkZCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gZGlhbG9nIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlUaGUgdmFsdWUgaW4gdGhlIDxiPk5hbWVzcGFjZSBOYW1lPC9iPiBmaWVsZCBpcyB0aGUgbmFtZXNwYWNlIHRoZSBYTUwgZmlsZSBiZWxvbmdzIHRvLgotCi0JCQlBbGwgcXVhbGlmaWVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHRoZSBYTUwgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIDxiPlByZWZpeDwvYj4gdmFsdWUuCi0KLQkJCVRoZSA8Yj5Mb2NhdGlvbiBIaW50PC9iPiBmaWVsZCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIFhNTCBzY2hlbWEgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4gQW4gWE1MIENhdGFsb2cgSUQgb3IgYSBVUkkgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGlzIGZpZWxkLiBZb3UgY2FuIHNlYXJjaCBmb3IgdGhlIHNjaGVtYSB5b3Ugd2FudCB0byB1c2UgYnkgY2xpY2tpbmcgPGI+QnJvd3NlPC9iPi4gT25jZSB5b3Ugc2VsZWN0IGEgZmlsZSwgdGhlIDxiPk5hbWVzcGFjZSBOYW1lPC9iPiBhbmQgPGI+UHJlZml4PC9iPiBmaWVsZHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGZpbGxlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMgZnJvbSB0aGUgc2NoZW1hICh5b3UgbXVzdCBsZWF2ZSB0aGUgZmllbGRzIGJsYW5rIGZvciB0aGlzIHRvIG9jY3VyKS4KLQotCQkJPGI+Tm90ZTwvYj4gOiBJZiB5b3UgYXJlIGNyZWF0aW5nIGFuIFhNTCBmaWxlIGZyb20gYW4gWE1MIHNjaGVtYSwgeW91IGNhbm5vdCBjaGFuZ2UgdGhlIDxiPk5hbWVzcGFjZSBOYW1lPC9iPiBvciA8Yj5Mb2NhdGlvbiBIaW50PC9iPiB2YWx1ZXMuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyB5b3VyIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhjdWkwNDAwIj48IS0tICAtLT4KLQkJPGRlc2NyaXB0aW9uPkFuIFhNTCBDYXRhbG9nIGVudHJ5IGNvbnRhaW5zIHR3byBwYXJ0cyAtIGEgS2V5ICh3aGljaCByZXByZXNlbnRzIGEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIFVSSSAod2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gU2VsZWN0IHRoZSBjYXRhbG9nIGVudHJ5IHlvdSB3YW50IHRvIGFzc29jaWF0ZSB5b3VyIFhNTCBmaWxlIHdpdGguPC9kZXNjcmlwdGlvbj4KLQk8L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvRWRpdG9yWG1sQ29udGV4dHMyLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL0VkaXRvclhtbENvbnRleHRzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NTA0ZWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvRWRpdG9yWG1sQ29udGV4dHMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0JKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0JKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLQkqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0JKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotCSogCi0JKiBDb250cmlidXRvcnM6Ci0JKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci0JPGNvbnRleHQgaWQ9ImNzaF9vdXRlcl9jb250YWluZXIiPgotCQk8ZGVzY3JpcHRpb24gLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhtbF9zb3VyY2VfSGVscElkIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBYTUwgc291cmNlIHZpZXcgbGV0cyB5b3UgZWRpdCBhIGZpbGUgdGhhdCBpcyBjb2RlZCBpbiB0aGUgRXh0ZW5zaWJsZSBNYXJrdXAgTGFuZ3VhZ2UuIFRoZSBlZGl0b3IgcHJvdmlkZXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QsIHVzZXItZGVmaW5lZCB0ZW1wbGF0ZXMsIHN5bnRheCBoaWdobGlnaHRpbmcsIHVubGltaXRlZCB1bmRvIGFuZCByZWRvLCBlbGVtZW50IHNlbGVjdGlvbiBhbmQgZm9ybWF0dGluZywgYW5kIGRvY3VtZW50IGZvcm1hdHRpbmcuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHNyYy5odG1sIgotCQkJbGFiZWw9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3IiAvPgotCTwvY29udGV4dD4KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhMTllYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjQwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9UYWJsZVRyZWUueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvVGFibGVUcmVlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2MmVmYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9UYWJsZVRyZWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPGNvbnRleHRzPgotCTxjb250ZXh0IGlkPSJjc2hfb3V0ZXJfY29udGFpbmVyIj4KLQkJPGRlc2NyaXB0aW9uIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxtMzAwMCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgRGVzaWduIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IgcmVwcmVzZW50cyB5b3VyIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLCB3aGljaCBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBEZXBlbmRpbmcgb24gdGhlIGtpbmQgb2YgZmlsZSB5b3UgYXJlIHdvcmtpbmcgd2l0aCwgY29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBsb2NhdGlvbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiCi0JCQlsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci0JPC9jb250ZXh0PgotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9XU0RMQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvV1NETENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0NjJiNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9XU0RMQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0JKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0JKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLQkqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0JKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotCSogCi0JKiBDb250cmlidXRvcnM6Ci0JKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0KLTwhLS0gcGx1Z2luOiBvcmcuZWNsaXBzZS53c3Qud3NkbC51aSAtLT4KLQotPGNvbnRleHRzPgotCTxjb250ZXh0IGlkPSJjc2hfb3V0ZXJfY29udGFpbmVyIj4KLQkJPGRlc2NyaXB0aW9uIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSIiPjwhLS0gY2hhbmdlIGxhdGVyLCB0aGlzIGhhcyBubyBpZCBhdG0gLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVNlbGVjdCB0aGUgcHJvamVjdCBvciBmb2xkZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIFdTREwgZmlsZS4gSW4gdGhlIDxiPkZpbGUgbmFtZTwvYj4gZmllbGQsIHR5cGUgdGhlIG5hbWUgb2YgdGhlIFdTREwgZmlsZSwgZm9yIGV4YW1wbGUgPGk+TmV3V1NETEZpbGUud3NkbDwvaT4uIFRoZSBuYW1lIG9mIHlvdXIgV1NETCBmaWxlIG11c3QgZW5kIGluIDxpPi53c2RsPC9pPi4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS5kb2MudXNlci90YXNrcy90Y3J0d3NkbC5odG1sIgotCQkJbGFiZWw9IiIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndzZGx1MDAwMCI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCTxiPlRhcmdldCBuYW1lc3BhY2U8L2I+IGlzIHVzZWQgZm9yIHRoZSBuYW1lcyBvZiBtZXNzYWdlcyBhbmQgdGhlIHBvcnQgdHlwZSwgYmluZGluZyBhbmQgc2VydmljZSBkZWZpbmVkIGluIHRoZSBXU0RMIGZpbGUuIFRoZSB2YWx1ZSBtdXN0IHRha2UgdGhlIGZvcm0gb2YgYSB2YWxpZCBVUkkgKGZvciBleGFtcGxlLCBodHRwOi8vd3d3Lm15Y29tcGFueS5jb20vbXlzZXJ2aWNlLykuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZG9jLnVzZXIvdGFza3MvdGNydHdzZGwuaHRtbCIKLQkJCWxhYmVsPSIiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3c2RsdTAwMDEiPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQk8Yj5QcmVmaXg8L2I+IGlzIHRoZSBwcmVmaXggYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXJnZXQgbmFtZXNwYWNlLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmRvYy51c2VyL3Rhc2tzL3RjcnR3c2RsLmh0bWwiCi0JCQlsYWJlbD0iIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id3NkbHUwMDAyIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJPGI+Q3JlYXRlIFdTREwgU2tlbGV0b248L2I+IHdpbGwgZ2VuZXJhdGUgdGhlIFdTREwgZWxlbWVudHMgcmVxdWlyZWQgZm9yIHlvdXIgc2VydmljZSwgaW5jbHVkaW5nIGJpbmRpbmdzLCBwb3J0cyBhbmQgbWVzc2FnZXMuIFlvdSBjYW4gdGhlbiBtb2RpZnkgdGhlc2UgdG8gbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mIHlvdXIgV2ViIHNlcnZpY2UuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZG9jLnVzZXIvdGFza3MvdGNydHdzZGwuaHRtbCIKLQkJCWxhYmVsPSIiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3c2RsdTAwMDMiPgotCQk8ZGVzY3JpcHRpb24+SWYgeW91IGhhdmUgY2hvc2VuIHRvIGNyZWF0ZSBhIFdTREwgc2tlbGV0b24sIHNlbGVjdCB0aGUgYmluZGluZyBvcHRpb25zIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgUHJvdG9jb2wgZHJvcCBkb3duLiBUaGUgb3B0aW9ucyBhcmUgU09BUCBhbmQgSFRUUC4gVXNlIHRoZSBTT0FQIHByb3RvY29sIHdoZW4geW91IHdhbnQgdG8gZXhjaGFuZ2Ugc3RydWN0dXJlZCBhbmQgdHlwZWQgaW5mb3JtYXRpb24uIFVzZSB0aGUgSFRUUCBwcm90b2NvbCB3aGVuIHlvdSB3YW50IHlvdXIgYXBwbGljYXRpb24gY2xpZW50IHRvIGp1c3QgcmVxdWVzdCBvciB1cGRhdGUgaW5mb3JtYXRpb24uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS5kb2MudXNlci90YXNrcy90Y3J0d3NkbC5odG1sIgotCQkJbGFiZWw9IiIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndzZGx1MDAxMCI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCUlmIHlvdSBzZWxlY3QgU09BUCB5b3UgY2FuIHRoZW4gc2VsZWN0IHRoZSBlbmNvZGluZyBzdHlsZSB5b3Ugd2FudCB0byB1c2U6Ci0JCQk8dWw+Ci0JCQkJPGxpPgotCQkJCQk8Yj5kb2N1bWVudCBsaXRlcmFsPC9iPjogRG9jdW1lbnQgc3R5bGUgbWVzc2FnZXMsIGxpdGVyYWwgZW5jb2RpbmcuIFVzZSB0aGlzIHN0eWxlIG9mIGJpbmRpbmcgd2hlbiB5b3Ugd2FudCB0byBzZW5kIFNPQVAgbWVzc2FnZXMgdGhhdCBjYW4gYmUgdmFsaWRhdGVkIGJ5IGFuIFhNTCB2YWxpZGF0b3IuIEFsbCB0aGUgZGF0YSB0eXBlcyBpbiB0aGUgU09BUCBtZXNzYWdlIGJvZHkgYXJlIGRlZmluZWQgaW4gYSBzY2hlbWEsIHNvIHRoZSBXU0RMIHBhcnRzIG11c3QgcG9pbnQgdG8gc2NoZW1hIGVsZW1lbnRzLgotCQkJCTwvbGk+Ci0JCQk8L3VsPgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmRvYy51c2VyL3Rhc2tzL3RjcnR3c2RsLmh0bWwiCi0JCQlsYWJlbD0iIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id3NkbHUwMDExIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJPHVsPgotCQkJCTxsaT4KLQkJCQkJPGI+cnBjIGxpdGVyYWw8L2I+OiBSUEMgc3R5bGUgbWVzc2FnZXMsIGxpdGVyYWwgZW5jb2RpbmcuIFVzZSB0aGlzIHN0eWxlIG9mIGJpbmRpbmcgd2hlbiB5b3Ugd2FudCB0byBzcGVjaWZ5IHRoZSBvcGVyYXRpb24gbWV0aG9kIG5hbWVzIGluIHlvdXIgU09BUCBtZXNzYWdlcyBzbyBhIHNlcnZlciBjYW4gZGlzcGF0Y2ggdGhlIHNwZWNpZmllZCBtZXRob2RzLiBEYXRhIHR5cGVzIG11c3QgYmUgZGVmaW5lZCwgc28gdGhlIFdTREwgcGFydHMgbXVzdCBwb2ludCB0byBYU0QgdHlwZXMuCi0JCQkJPC9saT4KLQkJCTwvdWw+Ci0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZG9jLnVzZXIvdGFza3MvdGNydHdzZGwuaHRtbCIKLQkJCWxhYmVsPSIiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3c2RsdTAwMTIiPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQk8dWw+Ci0JCQkJPGxpPgotCQkJCQk8Yj5ycGMgZW5jb2RlZDwvYj46IFJQQyBzdHlsZSBtZXNzYWdlcyBhbmQgU09BUCBlbmNvZGluZy4gVXNlIHRoaXMgc3R5bGUgb2YgYmluZGluZyB3aGVuIHlvdSB3YW50IHRvIGVuY29kZSBkYXRhIGdyYXBocyBpbiB5b3VyIFNPQVAgbWVzc2FnZXMgc28gYSBzZXJ2ZXIgY2FuIGRlc2VyaWFsaXplIHRoZSBvYmplY3QgZGF0YS4gRGF0YSB0eXBlcyBtdXN0IGJlIGRlZmluZWQsIHNvIHRoZSBXU0RMIHBhcnRzIG11c3QgcG9pbnQgdG8gWFNEIHR5cGVzLgotCQkJCTwvbGk+Ci0JCQk8L3VsPgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmRvYy51c2VyL3Rhc2tzL3RjcnR3c2RsLmh0bWwiCi0JCQlsYWJlbD0iIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id3NkbHUwMDEzIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJSWYgeW91IHNlbGVjdCBIVFRQIHlvdSBjYW4gc2VsZWN0IHdoZXRoZXIgdG8gY3JlYXRlIGFuIEhUVFAgZ2V0dGVyIG9yIHNldHRlcjoKLQkJCTx1bD4KLQkJCQk8bGk+Ci0JCQkJCTxiPkhUVFAgR0VUPC9iPjogQSBHRVQgcmVxdWVzdCBmZXRjaGVzIGRhdGEgZnJvbSBhIFdlYiBzZXJ2ZXIgYmFzZWQgb24gYW4gVVJMIHZhbHVlIGFuZCBhIHNldCBvZiBIVFRQIGhlYWRlcnMuIFVzZSB0aGlzIG1ldGhvZCB3aGVuIHlvdSB3YW50IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC4KLQkJCQk8L2xpPgotCQkJPC91bD4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS5kb2MudXNlci90YXNrcy90Y3J0d3NkbC5odG1sIgotCQkJbGFiZWw9IiIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndzZGx1MDAxNCI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCTx1bD4KLQkJCQk8bGk+Ci0JCQkJCTxiPkhUVFAgUE9TVDwvYj46IEEgUE9TVCByZXF1ZXN0IHNlbmRzIGFkZGl0aW9uYWwgZGF0YSB0byB0aGUgc2VydmVyLCBzcGVjaWZpZWQgYWZ0ZXIgdGhlIFVSTCBhbmQgdGhlIGhlYWRlcnMuIFVzZSB0aGlzIG1ldGhvZCB3aGVuIHlvdSB3YW50IHRvIHNlbmQgZGF0YSBlbmNsb3NlZCBpbiB0aGUgYm9keSBvZiB0aGUgcmVxdWVzdC4KLQkJCQk8L2xpPgotCQkJPC91bD4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS5kb2MudXNlci90YXNrcy90Y3J0d3NkbC5odG1sIgotCQkJbGFiZWw9IiIgLz4KLQk8L2NvbnRleHQ+Ci08L2NvbnRleHRzPgotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9YTUxXaXphcmRDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9YTUxXaXphcmRDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YmI5MTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvWE1MV2l6YXJkQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0JKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0JKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLQkqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0JKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotCSogCi0JKiBDb250cmlidXRvcnM6Ci0JKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0KLTxjb250ZXh0cz4KLQk8Y29udGV4dCBpZD0iY3NoX291dGVyX2NvbnRhaW5lciI+Ci0JCTxkZXNjcmlwdGlvbiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieG1sYzAxMDEiPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlTZWxlY3QgdGhlIDxiPkNyZWF0ZSBYTUwgZmlsZSBmcm9tIGEgRFREIGZpbGU8L2I+IHJhZGlvIGJ1dHRvbiB0byBjcmVhdGUgYW4gWE1MIGZpbGUgZnJvbSBhIERURCBmaWxlLiBUaGUgZmlsZSB3aWxsIGNvbnRhaW4gdGhlIHNlbGVjdGVkIHJvb3QgZWxlbWVudCwgcG9wdWxhdGVkIHdpdGggYW55IHJlcXVpcmVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieG1sYzAxMDIiPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlTZWxlY3QgdGhlIDxiPkNyZWF0ZSBYTUwgZmlsZSBmcm9tIGFuIFhNTCBzY2hlbWEgZmlsZTwvYj4gcmFkaW8gYnV0dG9uIHRvIGNyZWF0ZSBhbiBYTUwgZmlsZSBmcm9tIGFuIFhNTCBzY2hlbWEuIFRoZSBmaWxlIHdpbGwgY29udGFpbiB0aGUgc2VsZWN0ZWQgcm9vdCBlbGVtZW50IG9mIHRoZSBYTUwgc2NoZW1hIGFuZCBhbnkgZWxlbWVudHMgb3IgYXR0cmlidXRlcyBpdCBjb250YWlucy4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDEwMyI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVNlbGVjdCB0aGUgPGI+Q3JlYXRlIFhNTCBmaWxlIGZyb20gc2NyYXRjaDwvYj4gcmFkaW8gYnV0dG9uIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBYTUwgZmlsZSBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBYTUwgc2NoZW1hIG9yIERURCBmaWxlLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmh0bWwiCi0JCQlsYWJlbD0iQ3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieG1sYzA1MDAiPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlTZWxlY3QgdGhlIDxiPlNlbGVjdCBmaWxlIGZyb20gd29ya2JlbmNoPC9iPiByYWRpbyBidXR0b24gaWYgeW91IHdhbnQgdG8gY3JlYXRlIHlvdXIgWE1MIGZpbGUgZnJvbSBhIERURCBvciBYTUwgc2NoZW1hIHRoYXQgaXMgaW4gdGhlIHdvcmtiZW5jaC4KLQotCQkJU2VsZWN0IHRoZSA8Yj5TZWxlY3QgWE1MIENhdGFsb2cgZW50cnk8L2I+IHJhZGlvIGJ1dHRvbiBpZiB5b3Ugd2FudCB0byB1c2UgYSBmaWxlIGxpc3RlZCBpbiB0aGUgWE1MIENhdGFsb2cgdG8gY3JlYXRlIHlvdXIgWE1MIGZpbGUuCi0JCTwvZGVzY3JpcHRpb24+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDQxMCI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVRoZSByb290IGVsZW1lbnQgb2YgYW4gWE1MIGZpbGUgaXMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgb3RoZXIgZWxlbWVudHMgaW4gdGhhdCBmaWxlLiBBbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgRFREIG9yIGFsbCBnbG9iYWwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgWE1MIHNjaGVtYSBhcmUgaW5jbHVkZWQgaW4gdGhpcyBsaXN0LgotCi0JCQk8Yj5Ob3RlPC9iPjogSWYgeW91IGRvIG5vdCBoYXZlIGFueSBlbGVtZW50cyBpbiB5b3VyIERURCBvciBhbnkgZ2xvYmFsIGVsZW1lbnRzIGluIHlvdXIgWE1MIHNjaGVtYSwgeW91IGNhbm5vdCBjcmVhdGUgYW4gWE1MIGZpbGUgZnJvbSBpdC4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIgLz4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDQ0MSI+Ci0JCTxkZXNjcmlwdGlvbj5JZiB5b3Ugc2VsZWN0IHRoaXMgY2hlY2sgYm94LCBib3RoIG1hbmRhdG9yeSBhbmQgb3B0aW9uYWwgYXR0cmlidXRlcyB3aWxsIGJlIGdlbmVyYXRlZC4gSWYgeW91IGRvIG5vdCBzZWxlY3QgaXQsIG9ubHkgbWFuZGF0b3J5IGF0dHJpYnV0ZXMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIgLz4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDQ0MiI+Ci0JCTxkZXNjcmlwdGlvbj5JZiB5b3Ugc2VsZWN0IHRoaXMgY2hlY2sgYm94LCBib3RoIHRoZSBtYW5kYXRvcnkgYW5kIG9wdGlvbmFsIGVsZW1lbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBJZiB5b3UgZG8gbm90IHNlbGVjdCBpdCwgb25seSBtYW5kYXRvcnkgZWxlbWVudHMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIgLz4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDQ0MyI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCUlmIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIHRoZSBmaXJzdCBjaG9pY2Ugb2YgYSByZXF1aXJlZCBjaG9pY2Ugd2lsbCBiZSBnZW5lcmF0ZWQgaW4geW91ciBYTUwgZmlsZS4KLQotCQkJRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgY29kZSBpbiB5b3VyIHNvdXJjZSBmaWxlOgotCi0JCQk8Yj4mbHQ7Y2hvaWNlJmd0OyAmbHQ7ZWxlbWVudCBuYW1lPSJhIiB0eXBlPSJzdHJpbmcmZ3Q7ICZsdDtlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImludGVnZXImZ3Q7ICZsdDsvY2hvaWNlJmd0OzwvYj4KLQotCQkJYW5kIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIGFuIGVsZW1lbnQgc3VjaCBhcyB0aGUgZm9sbG93aW5nIHdpbGwgYmUgY3JlYXRlZCBpbiB5b3VyIFhNTCBmaWxlOgotCi0JCQk8Yj4mbHQ7YSZndDtoZWxsbyZsdDsvYSZndDs8L2I+Ci0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbCIKLQkJCWxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIC8+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuaHRtbCIKLQkJCWxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieG1sYzA0NDQiPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlJZiB5b3Ugc2VsZWN0IHRoaXMgY2hlY2sgYm94LCBhbnkgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZ2VuZXJhdGVkIHdpbGwgYmUgZmlsbGVkIHdpdGggc2FtcGxlIGRhdGEsIHN1Y2ggYXMgPGI+Jmx0O3RleHQmZ3Q7RW1wdHlUZXh0Jmx0Oy90ZXh0Jmd0Oy48L2I+IE90aGVyd2lzZSwgdGhleSB3aWxsIGJlIGVtcHR5IC0gdGhhdCBpcywgPGI+Jmx0O3RleHQmZ3Q7Jmx0Oy90ZXh0Jmd0Oy48L2I+Ci0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbCIKLQkJCWxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIC8+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuaHRtbCIKLQkJCWxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieG1sYzAyMTAiPgotCQk8ZGVzY3JpcHRpb24+VGhlIFN5c3RlbSBJRCB2YWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgVVJJIChwaHlzaWNhbCBsb2NhdGlvbikgb2YgdGhlIERURCBmaWxlLiBUaGUgUHVibGljIElEIHZhbHVlIGNhbiByZWZlciB0byBhIERURCBlbnRyeSBpbiBhbiBYTUwgQ2F0YWxvZy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieG1sYzAyMjAiPgotCQk8ZGVzY3JpcHRpb24+VGhlIFN5c3RlbSBJRCB2YWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgVVJJIChwaHlzaWNhbCBsb2NhdGlvbikgb2YgdGhlIERURCBmaWxlLiBUaGUgUHVibGljIElEIHZhbHVlIGNhbiByZWZlciB0byBhIERURCBlbnRyeSBpbiBhbiBYTUwgQ2F0YWxvZy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIiAvPgotCTwvY29udGV4dD4KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvWFNEQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvWFNEQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmVhODllLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1hTRENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0JKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0JKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLQkqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0JKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotCSogCi0JKiBDb250cmlidXRvcnM6Ci0JKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0KLTwhLS0gcGx1Z2luczogb3JnLmVjbGlwc2UudWkuaWRlIGFuZCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsIC0tPgotCi08Y29udGV4dHM+Ci0JPGNvbnRleHQgaWQ9ImNzaF9vdXRlcl9jb250YWluZXIiPgotCQk8ZGVzY3JpcHRpb24gLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im5ld19maWxlX3dpemFyZF9wYWdlX2NvbnRleHQiPjwhLS0gZml4IHRoaXMsIHRoZXJlIGlzIG5vIGNvbnRleHQgaWQgYXRtIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlTZWxlY3QgdGhlIHByb2plY3Qgb3IgZm9sZGVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBYTUwgc2NoZW1hLiBJbiB0aGUgPGI+RmlsZSBuYW1lPC9iPiBmaWVsZCwgdHlwZSB0aGUgbmFtZSBvZiB0aGUgWE1MIHNjaGVtYSwgZm9yIGV4YW1wbGUgPGk+TXlYTUxTY2hlbWEueHNkPC9pPi4gVGhlIG5hbWUgb2YgeW91ciBYTUwgc2NoZW1hIG11c3QgZW5kIGluIDxpPi54c2Q8L2k+LgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjeG1sc2NoLmh0bWwiCi0JCQlsYWJlbD0iQ3JlYXRpbmcgWE1MIHNjaGVtYXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4c2RwMDAxMCI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVNlbGVjdCB0aGUgPGI+UXVhbGlmeSBYTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHM8L2I+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCBhIHByZWZpeCBhcHBsaWVkIHRvIGFsbCBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgaW4geW91ciBYTUwgc2NoZW1hLgotCi0JCQlJbiB0aGUgPGI+WE1MIHNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIHByZWZpeDwvYj4gZmllbGQsIHR5cGUgdGhlIHByZWZpeCB5b3Ugd2FudCBhcHBsaWVkIHRvIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBpbiB5b3VyIFhNTCBzY2hlbWEuIFRoZSBwcmVmaXggPGk+eHNkPC9pPiBpcyB1c2VkIGJ5IGNvbnZlbnRpb24gdG8gZGVub3RlIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZSwgYnV0IGFueSBwcmVmaXggY2FuIGJlIHVzZWQuIFRoZSBwdXJwb3NlIG9mIHRoZSBhc3NvY2lhdGlvbiBpcyB0byBpZGVudGlmeSB0aGUgZWxlbWVudHMgYW5kIHNpbXBsZSB0eXBlcyBhcyBiZWxvbmdpbmcgdG8gdGhlIHZvY2FidWxhcnkgb2YgdGhlIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgcmF0aGVyIHRoYW4gdGhlIHZvY2FidWxhcnkgb2YgdGhlIHNjaGVtYSBhdXRob3IuCi0KLQkJCTxiPk5vdGU6PC9iPiBUaGlzIHByZWZpeCB3aWxsIG5vdCBhcHBlYXIgaW4gYW55IHNjaGVtYXMgdGhhdCBjdXJyZW50bHkgZXhpc3QgLSBpdCB3aWxsIG9ubHkgYXBwZWFyIGluIG5ldyBzY2hlbWFzIHlvdSBjcmVhdGUgYWZ0ZXIgeW91IHR5cGUgdGhlIHByZWZpeCBhbmQgY2xpY2sgPGI+QXBwbHk8L2I+LiBBbnkgc2NoZW1hcyB0aGF0IGFscmVhZHkgZXhpc3Qgd2lsbCBoYXZlIHRoZSBwcmVmaXggc3BlY2lmaWVkIGluIHRoZSBzY2hlbWEgYXBwbGllZCB0byB0aGUgWE1MIHNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzLgotCi0JCQlZb3UgY2FuIGNoYW5nZSB0aGUgPGI+RGVmYXVsdCBUYXJnZXQgTmFtZXNwYWNlPC9iPiB2YWx1ZS4gVGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGlzIGZpZWxkIHdpbGwgYmUgdGhlIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSBmb3IgYW55IG5ldyBYTUwgc2NoZW1hIGZpbGVzIGNyZWF0ZWQuCi0KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJlZi5odG1sIgotCQkJbGFiZWw9IkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVjZXMiIC8+Ci0JPC9jb250ZXh0PgotPC9jb250ZXh0cz4KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MGNlODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBFZGl0b3JYbWxDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgRWRpdG9yWG1sQ29udGV4dHMyLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgWE1MV2l6YXJkQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIFRhYmxlVHJlZS54bWwsXAotICAgICAgICAgICAgICAgV1NETENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBYU0RDb250ZXh0cy54bWwKLSAgICAgICAgICAgICAgIAotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjkxYzQ5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSAgICAgPSBYTUwgaW5mb3BvcHMKLXBsdWdpblByb3ZpZGVyID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2Y0YzVhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMSI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IkVkaXRvclhtbENvbnRleHRzLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJFZGl0b3JYbWxDb250ZXh0czIueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iVGFibGVUcmVlLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJYTUxXaXphcmRDb250ZXh0cy54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC54bWwudWkiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iV1NETENvbnRleHRzLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iWFNEQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpIi8+Ci0KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MzI5OGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcl8xLjAuMC5qYXIKLWJhawotdGVtcAotRGl0YUxpbmsuY2F0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTMzYWY2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9Eb2NCdWlsZC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvRG9jQnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWY4MzU1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9Eb2NCdWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0gCi0KLQlUaGlzIHNjcmlwdCBidWlsZCB0aGUgSGVscCBwbHVnLWluIGJ5IHRyYW5zZm9ybWluZyB0aGUgRElUQSBzb3VyY2UgZmlsZXMgaW50byBIVE1MLgotCQotCVRvIHVzZSB0aGlzIHNjcmlwdCwgeW91IG11c3QgaW5zdGFsbCBESVRBLU9UIG9uIHlvdXIgbWFjaGluZSBpbiB0aGUgZGlyZWN0b3J5Ci0JZGVmaW5lZCBieSB0aGUgZGl0YS5vdC5kaXIgcHJvcGVydHkuCi0JCi0JUnVuIHRoZSBkZWZhdWx0IHRhcmdldCBhZnRlciB5b3UgZWRpdCB0aGUgRElUQSBzb3VyY2UgZmlsZXMgdG8gcmVnZW5lcmF0ZSB0aGUgSFRNTC4KLQkKLQlUbyBjdXN0b21pemUgdGhpcyBzY3JpcHQgZm9yIG90aGVyIEhlbHAgcGx1Zy1pbnMsIG1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIGFyZ3MuaW5wdXQgcHJvcGVydHkKLQl0byBiZSB0aGUgRElUQSBtYXAgZmlsZSBmb3IgdGhlIHBsdWctaW4uCi0JCi0JTk9URTogVGhpcyBzY3JpcHQgYXNzdW1lcyB0aGF0IGxpbmtzIHRvIHNpYmxpbmcgSGVscCBwbHVnLWlucyBoYXZlIHNjb3BlPSJwZWVyIiwgb3RoZXJ3aXNlIHRoZQotCW91dHB1dCBkaXJlY3Rvcnkgc3RydWN0dXJlIHdpbGwgYmUgc2hpZnRlZCBpbmNvcnJlY3RseS4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgeW91IGhhbmQgY29kZSB5b3VyIHBsdWdpbi54bWwgZmlsZSBpbiBteXBsdWdpbi54bWwuIFRoaXMgZmlsZQotCXdpbGwgYmUgY29waWVkIG92ZXIgdGhlIGdlbmVyYXRlZCBwbHVnaW4ueG1sIHdoaWNoIGlzIGN1cnJlbnRseSBub3QgYmVpbmcgZ2VuZXJhdGVkIGNvcnJlY3RseQotCWJ5IERJVEEtT1QuCi0JCi0JQ2hhbmdlTG9nOgotCTIwMDYtMDQtMDUgQXJ0aHVyIFJ5bWFuIDxyeW1hbkBjYS5pYm0uY29tPgotCS0gQ3JlYXRlZC4KLQkyMDA4LTAxLTA5IEthdGUgUHJpY2UgPGthdGVwQGNhLmlibS5jb20+Ci0JLSBtb2RpZmllZCBmb3IgbmV3IERJVEEtT1QgdmVyc2lvbgotCTIwMDgtMDUtMDUgS2F0ZSBQcmljZSA8a2F0ZXBAY2EuaWJtLmNvbT4KLQktIG1vZGlmaWVkIHRvIGFkZCBnZW5lcmF0aW9uIG9mIHByZS1idWlsdCBoZWxwIGluZGV4LiAKLQktIE11c3QgZGVsZXRlIC9pbmRleCBmb2xkZXIgYmVmb3JlIHJ1bm5pbmcgYnVpbGQKLS0tPgotPHByb2plY3QgbmFtZT0iZWNsaXBzZWhlbHAiIGRlZmF1bHQ9ImFsbCI+Ci0KLQk8cHJvcGVydHkgbmFtZT0iZGl0YS5vdC5kaXIiIGxvY2F0aW9uPSJDOi9ESVRBLU9UMS4yLjIiIC8+Ci0KLQk8cGF0aCBpZD0iZG9zdC5jbGFzcy5wYXRoIj4KLQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9bGliJHtmaWxlLnNlcGFyYXRvcn1kb3N0LmphciIgLz4KLQk8L3BhdGg+Ci0KLQk8dGFza2RlZiBuYW1lPSJpbnRlZ3JhdGUiIGNsYXNzbmFtZT0ib3JnLmRpdGEuZG9zdC5wbGF0Zm9ybS5JbnRlZ3JhdG9yVGFzayI+Ci0JCTxjbGFzc3BhdGggcmVmaWQ9ImRvc3QuY2xhc3MucGF0aCIgLz4KLQk8L3Rhc2tkZWY+Ci0JPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImludGVncmF0ZSwgZWNsaXBzZWhlbHAiPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iaW50ZWdyYXRlIj4KLQkJPGludGVncmF0ZSBkaXRhZGlyPSIke2RpdGEub3QuZGlyfSIgLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gcmV2aXNlIGJlbG93IGhlcmUgLS0+Ci0JPHRhcmdldCBuYW1lPSJlY2xpcHNlaGVscCI+Ci0JCTxhbnQgYW50ZmlsZT0iJHtkaXRhLm90LmRpcn0ke2ZpbGUuc2VwYXJhdG9yfWNvbmR1Y3Rvci54bWwiIHRhcmdldD0iaW5pdCIgZGlyPSIke2RpdGEub3QuZGlyfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5jb3B5Y3NzIiB2YWx1ZT0ibm8iIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5jc3NwYXRoIiB2YWx1ZT0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuZWNsaXBzZS5wcm92aWRlciIgdmFsdWU9IkVjbGlwc2Uub3JnIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuZWNsaXBzZS52ZXJzaW9uIiB2YWx1ZT0iMy42LjAiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5pbnB1dCIgbG9jYXRpb249IlhNTEJ1aWxkZXJyZWwuZGl0YW1hcCIgLz4gICAgCQkKLQkJCTxwcm9wZXJ0eSBuYW1lPSJjbGVhbi50ZW1wIiB2YWx1ZT0idHJ1ZSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLmV4dG5hbWUiIHZhbHVlPSIuZGl0YSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLnRlbXAuZGlyIiBsb2NhdGlvbj0idGVtcCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQuZGlyIiBsb2NhdGlvbj0iIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InRyYW5zdHlwZSIgdmFsdWU9ImVjbGlwc2VoZWxwIiAvPgotCQk8L2FudD4KLQkJPGNvcHkgZmlsZT0ibXlwbHVnaW4ueG1sIiB0b2ZpbGU9InBsdWdpbi54bWwiIG92ZXJ3cml0ZT0ieWVzIiAvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iYnVpbGQuaW5kZXgiIGRlc2NyaXB0aW9uPSJCdWlsZHMgc2VhcmNoIGluZGV4IGZvciB0aGUgcGx1Zy1pbiIgaWY9ImVjbGlwc2UucnVubmluZyI+Ci0JICAgICA8aGVscC5idWlsZEhlbHBJbmRleCBtYW5pZmVzdD0icGx1Z2luLnhtbCIgZGVzdGluYXRpb249Ii4iLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiZDUwZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNzAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJtYXBfdG9jLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcm1hcF90b2MuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmMzJkNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcm1hcF90b2MuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iDQotICJtYXAuZHRkIj4NCi08bWFwIGNvbGxlY3Rpb24tdHlwZT0ic2VxdWVuY2UiIGlkPSJ4bWxlZGl0b3Jkb2N1bWVudGF0aW9uIiB0aXRsZT0iRGV2ZWxvcGluZyBYTUwgZmlsZXMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dvcmtYTUwuZGl0YSIgbGlua2luZz0ic291cmNlb25seSIgbmF2dGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgZmlsZXMiPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N3b3JrWE1MIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3JlYXR4bS5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgWE1MIGZpbGVzIj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF9jY3JlYXR4bSIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXR4bWwuZGl0YSIgaWQ9InhtbGNyZXR4bWwiIG5hdnRpdGxlPSJDcmVhdGluZyBlbXB0eSBYTUwgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGNyZXR4bWwiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGNyZXhkdGQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4eHNkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RjcmV4eHNkIi8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhNTC5kaXRhIiBuYXZ0aXRsZT0iTGltaXRhdGlvbnMgb2YgWE1MIEVkaXRvciINCi10b2M9Im5vIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3JsaW1pdGF0aW9uc19zbHVzaFhNTCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIGZpbGVzIj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eGVkdHRhZyIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuZGl0YSIgbmF2dGl0bGU9IlhNTCBlZGl0b3IiPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N3eG1sZWR0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eHByZWZzLmRpdGEiIG5hdnRpdGxlPSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eHByZWZzIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dGFnaGlsdC5kaXRhIiBpZD0idGFnaGlsdCIgbmF2dGl0bGU9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHRhZ2hpbHQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRlbmMuZGl0YSIgbmF2dGl0bGU9IlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzIj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0ZW5jIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sZW5jLmRpdGEiIG5hdnRpdGxlPSJYTUwgYW5kIEhUTUwgZW5jb2RpbmdzIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N4bWxlbmMiLz48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0LmRpdGEiIG5hdnRpdGxlPSJTZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdCI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90c3Vnc3RyYXQiLz48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdGRlcy5kaXRhIiBpZD0idHhlZHRkZXMiIGxpbmtpbmc9Im5vbmUiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhlZHRkZXMiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRkb2MuZGl0YSIgaWQ9InRlZHRkb2MiIG5hdnRpdGxlPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRkb2MiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2guZGl0YSIgaWQ9InRlZHRzY2giIG5hdnRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0c2NoIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0cHJvYy5kaXRhIiBpZD0idGVkdHByb2MiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0cHJvYyIvPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdHNyYy5kaXRhIiBpZD0idHhlZHNyYyIgbGlua2luZz0ibm9uZSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ij4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eGVkdHNyYyIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5kaXRhIiBuYXZ0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ij4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R3Y2Rhc3QiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3bWFjcm8uZGl0YSIgaWQ9InR3bWFjcm8iIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90d21hY3JvIi8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRjbnN0LmRpdGEiIGlkPSJ0ZWR0Y250IiBuYXZ0aXRsZT0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRjbnN0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eHNpdHlwLmRpdGEiIG5hdnRpdGxlPSJVc2luZyB4c2k6dHlwZSI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eHNpdHlwIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yZXh0Y3RuLmRpdGEiIGlkPSJyZXh0Y3RuIiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgZG9jdW1lbnRzIHdpdGggbXVsdGlwbGUgbmFtZXNwYWNlcyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF9yZXh0Y3RuIi8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3eHZhbGlkLmRpdGEiIGlkPSJ4bWx2YWxpZCIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R3eHZhbGlkIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sY2F0LmRpdGEiIGxpbmtpbmc9Im5vbmUiIG5hdnRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyI+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfY3htbGNhdCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5kaXRhIiBpZD0idHhtbGNhdCIgbmF2dGl0bGU9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eG1sY2F0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0Z3JhbS5kaXRhIiBpZD0idGVkdGdyYW0iIG5hdnRpdGxlPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3J4bWxjYXRrZXkuZGl0YSIgaWQ9InJ4bWxjYXRrZXkiIG5hdnRpdGxlPSJYTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfcnhtbGNhdGtleSIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcnhtbHRvb2xza2V5LmRpdGEiIG5hdnRpdGxlPSJYTUwgZWRpdG9yIGtleWJvYXJkIHNob3J0Y3V0cyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0Z3JhbSIvPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yeG1sYmljb25zLmRpdGEiIGlkPSJyaWNvbnMiIG5hdnRpdGxlPSJJY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3J4bWxiaWNvbnMiLz48L3RvcGljcmVmPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcm1hcF90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjljODA5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJEZXZlbG9waW5nIFhNTCBmaWxlcyIgdG9waWM9InRvcGljcy9jd29ya1hNTC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL2N3b3JrWE1MLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfY3dvcmtYTUwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvY2NyZWF0eG0uaHRtbCI+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF9jY3JlYXR4bSIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90Y3JldHhtbC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90Y3JldHhtbCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIGhyZWY9InRvcGljcy90Y3JleGR0ZC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90Y3JleGR0ZCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGNyZXh4c2QiLz4KLTwvdG9waWM+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF9ybGltaXRhdGlvbnNfc2x1c2hYTUwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90eGVkdHRhZy5odG1sIj4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R4ZWR0dGFnIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9jd3htbGVkdC5odG1sIj4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N3eG1sZWR0Ii8+Ci08dG9waWMgbGFiZWw9IkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90eHByZWZzLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhwcmVmcyIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBocmVmPSJ0b3BpY3MvdHRhZ2hpbHQuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHRhZ2hpbHQiLz4KLTx0b3BpYyBsYWJlbD0iU3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnMiIGhyZWY9InRvcGljcy90ZWR0ZW5jLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGVkdGVuYyIvPgotPHRvcGljIGxhYmVsPSJYTUwgYW5kIEhUTUwgZW5jb2RpbmdzIiBocmVmPSJ0b3BpY3MvY3htbGVuYy5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF9jeG1sZW5jIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdCIgaHJlZj0idG9waWNzL3RzdWdzdHJhdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90c3Vnc3RyYXQiLz4KLTwvdG9waWM+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhlZHRkZXMiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIgaHJlZj0idG9waWNzL3RlZHRkb2MuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGVkdGRvYyIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGVkdHNjaCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyIgaHJlZj0idG9waWNzL3RlZHRwcm9jLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRwcm9jIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhlZHRzcmMiLz4KLTx0b3BpYyBsYWJlbD0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90d2NkYXN0Ii8+Ci08dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90d21hY3JvIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiIGhyZWY9InRvcGljcy90ZWR0Y25zdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0Y25zdCIvPgotPHRvcGljIGxhYmVsPSJVc2luZyB4c2k6dHlwZSIgaHJlZj0idG9waWNzL3R4c2l0eXAuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhzaXR5cCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBkb2N1bWVudHMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2VzIiBocmVmPSJ0b3BpY3MvcmV4dGN0bi5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF9yZXh0Y3RuIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3R3eHZhbGlkLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R3eHZhbGlkIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sIj4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N4bWxjYXQiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eG1sY2F0Ii8+Ci08dG9waWMgbGFiZWw9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHMiIGhyZWY9InRvcGljcy9yeG1sY2F0a2V5Lmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3J4bWxjYXRrZXkiLz4KLTx0b3BpYyBsYWJlbD0iU291cmNlIGVkaXRvciBhbmQgWE1MIHRvb2xzIGtleWJvYXJkIHNob3J0Y3V0cyIgaHJlZj0idG9waWNzL3J4bWx0b29sc2tleS5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0Z3JhbSIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvciIgaHJlZj0idG9waWNzL3J4bWxiaWNvbnMuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfcnhtbGJpY29ucyIvPgotPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJyZWwuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVycmVsLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWJhMDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJyZWwuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIg0KLSAibWFwLmR0ZCI+DQotPG1hcCBpZD0ieG1sZWRpdG9ycmVsdGFibGUiPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV0eG1sLmRpdGEiIGlkPSJ4bWxjcmV0eG1sIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXhkdGQuZGl0YSIgbmF2dGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4eHNkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuZGl0YSIgbmF2dGl0bGU9IlhNTCBlZGl0b3IiPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmRpdGEiIGxpbmtpbmc9InNvdXJjZW9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3eG1sZWR0LmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJYTUwgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sY2F0LmRpdGEiIG5hdnRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRjbnN0LmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0ZG9jLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5kaXRhIiBpZD0idHhtbGNhdCIgbmF2dGl0bGU9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRncmFtLmRpdGEiIGlkPSJ0ZWR0Z3JhbSIgbmF2dGl0bGU9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sY2F0LmRpdGEiIG5hdnRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRjbnN0LmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NoLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4bWxjYXQuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRncmFtLmRpdGEiIG5hdnRpdGxlPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiIGxpbmtpbmc9Im5vcm1hbCI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0cHJvYy5kaXRhIiBpZD0idGVkdHByb2MiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxjYXQuZGl0YSIgbmF2dGl0bGU9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSIgbGlua2luZz0ibm9ybWFsIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3eG1sZWR0LmRpdGEiIG5hdnRpdGxlPSJYTUwgZWRpdG9yIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbGNhdC5kaXRhIiBuYXZ0aXRsZT0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5IiBsaW5raW5nPSJub3JtYWwiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHd4dmFsaWQuZGl0YSIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuZGl0YSIgbmF2dGl0bGU9IlhNTCBlZGl0b3IiPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4eHNkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuZGl0YSINCi1saW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iWE1MIG5hbWVzcGFjZXMiIHNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NoLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmRpdGEiDQotbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlhNTCBuYW1lc3BhY2VzIiBzY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuZGl0YSIgaWQ9InR4ZWRzcmMiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y2Rhc3QuZGl0YSIgbmF2dGl0bGU9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdtYWNyby5kaXRhIiBuYXZ0aXRsZT0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R0YWdoaWx0LmRpdGEiIG5hdnRpdGxlPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NkYXN0LmRpdGEiIG5hdnRpdGxlPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d21hY3JvLmRpdGEiIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5kaXRhIiBuYXZ0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0LmRpdGEiIG5hdnRpdGxlPSJYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRkb2MuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2guZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdGRlcy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0cHJvYy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3J4bWxiaWNvbnMuZGl0YSIgbmF2dGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVycmVsLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVycmVsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwYWI1MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcnJlbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIHRvcGljPSJ0b3BpY3MvdGNyZXR4bWwuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3RjcmV0eG1sLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIiBocmVmPSJ0b3BpY3MvdGNyZXhkdGQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGVkaXRvciIgaHJlZj0idG9waWNzL2N3eG1sZWR0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90eGVkdHRhZy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9jd3htbGVkdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy9jeG1sY2F0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIiBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIiBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyIgaHJlZj0idG9waWNzL3R4bWxjYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RlZHRncmFtLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy9jeG1sY2F0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIiBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2ciIGhyZWY9InRvcGljcy90eG1sY2F0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXMiIGhyZWY9InRvcGljcy90ZWR0Z3JhbS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIiBocmVmPSJ0b3BpY3MvdGVkdHByb2MuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvdHd4dmFsaWQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgbmFtZXNwYWNlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIG5hbWVzcGFjZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiIGhyZWY9InRvcGljcy90d2NkYXN0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBocmVmPSJ0b3BpY3MvdHRhZ2hpbHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiIGhyZWY9InRvcGljcy90d2NkYXN0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiIGhyZWY9InRvcGljcy90ZWR0ZG9jLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyIgaHJlZj0idG9waWNzL3RlZHRwcm9jLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sIi8+Ci08dG9waWMgbGFiZWw9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9yeG1sYmljb25zLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1MWQ1NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IFhNTEJ1aWxkZXJtYXBfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8qLmh0bSosXAotICAgICAgICAgICAgICAgaW5kZXgvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcyxcCi0JCSAgICAgICAqLm1hcGxpc3QsXAotICAgICAgICAgICAgICAgKi5kaXRhbWFwLFwKLQkJICAgICAgIHRvcGljcy8qLmRpdGEKLWJpbi5leGNsdWRlcyA9IERvY0J1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICBteVBsdWdpbioueG1sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jZGF0YXNlY3Rpb24uZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jZGF0YXNlY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjA4NzJjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY2RhdGFzZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjMGRlNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2NvbW1lbnRfb2JqLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29tbWVudF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGMyY2NiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29tbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9kb2N0eXBlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvZG9jdHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDBmODIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9kb2N0eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvZXhwYW5kX2FsbC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJjMTRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvZXhwYW5kX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hdHRyaWIuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uYXR0cmliLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhOTk3NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hdHRyaWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uZWxlbS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25lbGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhYmRkYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25lbGVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvbnJzdHJ2YWwuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ucnN0cnZhbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDJiOGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ucnN0cnZhbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3Byb2luc3Rfb2JqLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDQzNmQ4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ybGRncm1yLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvcmxkZ3Jtci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OWNhYzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ybGRncm1yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvc3VnZ2VzdGlvbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3N1Z2dlc3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGVhODQ5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvc3VnZ2VzdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvX3cuY2ZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L193LmNmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyODg5OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvX3cuY2ZzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9kZWxldGFibGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5M2Y0NzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTUyY2NmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNUdWUgTWF5IDIwIDExOjEzOjA1IEVEVCAyMDA4DQotb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcj1vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyXG4xLjAuNDAwLnF1YWxpZmllcg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQwOWQ0ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNUdWUgTWF5IDIwIDExOjEzOjA1IEVEVCAyMDA4DQotbHVjZW5lPTEuOS4xLnYyMDA4MDMwNjE4MTENCi1hbmFseXplcj1vcmcuZWNsaXBzZS5oZWxwLmJhc2VcIzMuMy4xMDAudjIwMDgwNDI1P2xvY2FsZVw9ZW4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyMGRlMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1R1ZSBNYXkgMjAgMTE6MTM6MDUgRURUIDIwMDgNCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYTUwuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGNhdGtleS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3d4bWxlZHQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4cHJlZnMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGVuYy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGJpY29ucy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sdG9vbHNrZXkuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RzdWdzdHJhdC5odG1sPTANCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YTY5MmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZjIwMDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy42Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgPHRvYyBmaWxlPSJYTUxCdWlsZGVybWFwX3RvYy54bWwiLz4KLSAgICAgICA8aW5kZXggcGF0aD0iaW5kZXgvIi8+Ci0gICAgICAKLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwiLz4gICAgIAotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIubWFwbGlzdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLm1hcGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjM2UyNDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIubWFwbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPG1hcGxpc3QgdmVyc2lvbj0iMy42LjIiPg0KLSAgPG5hdj4NCi0gICAgPG1hcCBmaWxlPSJYTUxCdWlsZGVybWFwX3RvYy5kaXRhbWFwIi8+DQotICA8L25hdj4NCi0gIDxsaW5rPg0KLSAgICA8bWFwIGZpbGU9IlhNTEJ1aWxkZXJyZWwuZGl0YW1hcCIvPg0KLSAgPC9saW5rPg0KLTwvbWFwbGlzdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjE4YmEwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08aW5kZXg+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV0eG1sLmh0bWwjdGNyZXR4bWwiIHRpdGxlPSJDcmVhdGluZyBYTUwgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGZyb20gRFREcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmh0bWwjdGNyZXhkdGQiIHRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGZyb20gWE1MIHNjaGVtYXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90Y3JleHhzZC5odG1sI3RjcmV4eHNkIiB0aXRsZT0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNjaGVtYXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90Y3JleHhzZC5odG1sI3RjcmV4eHNkIiB0aXRsZT0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eGVkdHRhZy5odG1sI3R4ZWR0dGFnIiB0aXRsZT0iRWRpdGluZyBYTUwgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzcGVjaWZ5aW5nIGxpbmUgZGVsaW1pdGVycyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRlbmMuaHRtbCN0ZWR0ZW5jIiB0aXRsZT0iU3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJuYW1lc3BhY2UgaW5mb3JtYXRpb24iPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwjdGVkdHNjaCIgdGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sI3RlZHRwcm9jIiB0aXRsZT0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IGFzc2lzdCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCN0d2NkYXN0IiB0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idGVtcGxhdGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sI3R3bWFjcm8iIHRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmcgd2l0aCBjb25zdHJhaW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRjbnN0Lmh0bWwjdGVkdGNuc3QiIHRpdGxlPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ2YWxpZGF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHd4dmFsaWQuaHRtbCN0d3h2YWxpZCIgdGl0bGU9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYXNzb2NpYXRpb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sI2N4bWxjYXQiIHRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InVwZGF0aW5nIHdpdGggYXNzb2NpYXRlZCBjaGFuZ2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uaHRtbCN0ZWR0Z3JhbSIgdGl0bGU9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkRURHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIFhNTCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmh0bWwjdGNyZXhkdGQiIHRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2NoZW1hcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgWE1MIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuaHRtbCN0Y3JleHhzZCIgdGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIGVkaXRvciI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwjdHhlZHR0YWciIHRpdGxlPSJFZGl0aW5nIFhNTCBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuaHRtbCNjd3htbGVkdCIgdGl0bGU9IlhNTCBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcmVmZXJlbmNlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4cHJlZnMuaHRtbCN0eHByZWZzIiB0aXRsZT0iRGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90dGFnaGlsdC5odG1sI3R0YWdoaWx0IiB0aXRsZT0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0Lmh0bWwjeG1sc291cmNlc3VnZ2VzdGlvbnN0cmF0ZWd5IiB0aXRsZT0iU2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJEZXNpZ24gdmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwjdHhlZHRkZXMiIHRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sI3RlZHRkb2MiIHRpdGxlPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibmFtZXNwYWNlIGluZm9ybWF0aW9uIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sI3RlZHRzY2giIHRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHByb2MuaHRtbCN0ZWR0cHJvYyIgdGl0bGU9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iU291cmNlIHZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sI3R4ZWR0c3JjIiB0aXRsZT0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IGFzc2lzdCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCN0d2NkYXN0IiB0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyB3aXRoIGNvbnN0cmFpbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuaHRtbCN0ZWR0Y25zdCIgdGl0bGU9IkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InVwZGF0aW5nIFhNTCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRncmFtLmh0bWwjdGVkdGdyYW0iIHRpdGxlPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFjY2Vzc2liaWxpdHkiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yeG1sY2F0a2V5Lmh0bWwjeG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIiB0aXRsZT0iWE1MIENhdGFsb2cga2V5Ym9hcmQgc2hvcnRjdXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ia2V5Ym9hcmQgc2hvcnRjdXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnhtbGNhdGtleS5odG1sI3htbGNhdGFsb2drZXlib2FyZHNob3J0Y3V0cyIgdGl0bGU9IlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imljb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnhtbGJpY29ucy5odG1sI3JpY29ucyIgdGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icHJlZmVyZW5jZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwgZWRpdG9yIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHhwcmVmcy5odG1sI3R4cHJlZnMiIHRpdGxlPSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImxpbmUgZGVsaW1pdGVycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRlbmMuaHRtbCN0ZWR0ZW5jIiB0aXRsZT0iU3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY2hhcmFjdGVyIGVuY29kaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0ic3VwcG9ydGVkIGNoYXJhY3RlciBzZXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3htbGVuYy5odG1sI2N4bWxlbmMiIHRpdGxlPSJYTUwgYW5kIEhUTUwgZW5jb2RpbmdzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zIj4KLSAgICA8ZW50cnkga2V5d29yZD0iWE1MIGVkaXRvciI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRkb2MuaHRtbCN0ZWR0ZG9jIiB0aXRsZT0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ0ZW1wbGF0ZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJ3b3JraW5nIHdpdGggcHJlZGVmaW5lZCBYTUwgY29kZSI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3bWFjcm8uaHRtbCN0d21hY3JvIiB0aXRsZT0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIGNhdGFsb2ciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCNjeG1sY2F0IiB0aXRsZT0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgZW50cmllcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4bWxjYXQuaHRtbCN0eG1sY2F0IiB0aXRsZT0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImFjY2Vzc2liaWxpdHkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJrZXlib2FyZCBzaG9ydGN1dHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBlZGl0b3IiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3J4bWxjYXRrZXkuaHRtbCN4bWxjYXRhbG9na2V5Ym9hcmRzaG9ydGN1dHMiIHRpdGxlPSJYTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImtleWJvYXJkIHNob3J0Y3V0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBlZGl0b3IiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yeG1sY2F0a2V5Lmh0bWwjeG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIiB0aXRsZT0iWE1MIENhdGFsb2cga2V5Ym9hcmQgc2hvcnRjdXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNob3J0Y3V0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImtleWJvYXJkIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwgZWRpdG9yIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yeG1sY2F0a2V5Lmh0bWwjeG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIiB0aXRsZT0iWE1MIENhdGFsb2cga2V5Ym9hcmQgc2hvcnRjdXRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlZDM3OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lICAgICA9IFhNTCBlZGl0b3IKLXBsdWdpblByb3ZpZGVyID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZjIwMDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuNiI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgIDx0b2MgZmlsZT0iWE1MQnVpbGRlcm1hcF90b2MueG1sIi8+Ci0gICAgICAgPGluZGV4IHBhdGg9ImluZGV4LyIvPgotICAgICAgCi08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5pbmRleCI+Ci0gICAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIi8+ICAgICAKLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxOTA0OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NjcmVhdHhtLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iICAiY29uY2VwdC5kdGQiPg0KLTw/UHViIEluYz8+DQotPGNvbmNlcHQgaWQ9ImNyZWF0aW5neG1sZmlsZXMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIFhNTCBmaWxlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgWE1MIGZpbGVzOjwvc2hvcnRkZXNjPg0KLTxjb25ib2R5PjwvY29uYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua2xpc3Q+DQotPGxpbmsgaHJlZj0idGNyZXR4bWwuZGl0YSI+PGxpbmt0ZXh0PkNyZWF0aW5nIGVtcHR5IFhNTCBmaWxlczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRjcmV4ZHRkLmRpdGEiPjxsaW5rdGV4dD5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIGEgRFREczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRjcmV4eHNkLmRpdGEiPjxsaW5rdGV4dD5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTA0KLXNjaGVtYXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtsaXN0Pg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDA3MTg/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMxMTc2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NjcmVhdHhtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBYTUwgZmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIFhNTCBmaWxlczoiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIFhNTCBmaWxlczoiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRjcmV0eG1sLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRjcmV4ZHRkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRjcmV4eHNkLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3JlYXRpbmd4bWxmaWxlcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIFhNTCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRpbmd4bWxmaWxlcyI+PGEgbmFtZT0iY3JlYXRpbmd4bWxmaWxlcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgWE1MIGZpbGVzPC9oMT4KLQotCi08ZGl2PjxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjcmVhdGluZyBYTUwgZmlsZXM6PC9wPgotPC9kaXY+Ci0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+Ci08ZGl2PjxhIGhyZWY9InRjcmV0eG1sLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB3aGljaCB5b3UgY2FuIHRoZW4gZWRpdCBpbiB0aGUgWE1MIGVkaXRvci4gWW91IGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mIGNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uIj5DcmVhdGluZyBlbXB0eSBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRjcmV4ZHRkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIERURC4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gYSBEVERzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0Y3JleHhzZC5odG1sIiB0aXRsZT0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MCi1zY2hlbWFzPC9hPjwvZGl2PjwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWE1MLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWE1MLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOTNjOGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hNTC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29ya2luZyB3aXRoIFhNTCBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzoiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6IiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjY3JlYXR4bS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0eGVkdHRhZy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0d3h2YWxpZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InJ4bWxiaWNvbnMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ3b3JraW5nd2l0aHhtbGZpbGVzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V29ya2luZyB3aXRoIFhNTCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id29ya2luZ3dpdGh4bWxmaWxlcyI+PGEgbmFtZT0id29ya2luZ3dpdGh4bWxmaWxlcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29ya2luZyB3aXRoIFhNTCBmaWxlczwvaDE+Ci0KLQotPGRpdj48cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3A+Ci08L2Rpdj4KLQotPGRpdj4KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij4KLTxkaXY+PGEgaHJlZj0iY2NyZWF0eG0uaHRtbCIgdGl0bGU9IlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjcmVhdGluZyBYTUwgZmlsZXM6Ij5DcmVhdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InR4ZWR0dGFnLmh0bWwiIHRpdGxlPSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIj5FZGl0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHd4dmFsaWQuaHRtbCIgdGl0bGU9IldoZW4geW91IHZhbGlkYXRlIHlvdXIgWE1MIGZpbGUsIHRoZSBYTUwgdmFsaWRhdG9yIHdpbGwgY2hlY2sgdG8gc2VlIHRoYXQgeW91ciBmaWxlIGlzIHZhbGlkIGFuZCB3ZWxsLWZvcm1lZC4iPlZhbGlkYXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MCi1zY2hlbWE8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJ4bWxiaWNvbnMuaHRtbCIgdGl0bGU9IlRoZSBmb2xsb3dpbmcgWE1MIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUgYW5kIERlc2lnbiB2aWV3LiI+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvcjwvYT48L2Rpdj48L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya3htbC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya3htbC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmZhM2UxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmt4bWwuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiIgICJjb25jZXB0LmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08Y29uY2VwdCBpZD0id29ya2luZ3dpdGh4bWxmaWxlcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V29ya2luZyB3aXRoIFhNTCBmaWxlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3Nob3J0ZGVzYz4NCi08Y29uYm9keT48L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtsaXN0Pg0KLTxsaW5rIGhyZWY9ImNjcmVhdHhtLmRpdGEiPjxsaW5rdGV4dD5DcmVhdGluZyBYTUwgZmlsZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0eGVkdHRhZy5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBYTUwgZmlsZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0d3h2YWxpZC5kaXRhIj48bGlua3RleHQ+VmFsaWRhdGluZyBYTUwgZmlsZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJjeG1sY2F0LmRpdGEiPjxsaW5rdGV4dD5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwNCi1zY2hlbWE8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJyeG1sYmljb25zLmRpdGEiPjxsaW5rdGV4dD5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC9saW5rdGV4dD4NCi08L2xpbms+DQotPC9saW5rbGlzdD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC9jb25jZXB0Pg0KLTw/UHViICowMDAwMDAwODcxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3eG1sZWR0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3eG1sZWR0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NGI2MDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd3htbGVkdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjd3htbGVkdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+WE1MIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+WE1MIGVkaXRvcjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5Zb3UgY2FuIHVzZSBpdCB0byBwZXJmb3JtIGEgdmFyaWV0eSBvZiB0YXNrcyBzdWNoIGFzOjwvcD4NCi08dWw+DQotPGxpPkNyZWF0aW5nIG5ldywgZW1wdHkgWE1MIGZpbGVzIG9yIGdlbmVyYXRpbmcgdGhlbSBmcm9tIGV4aXN0aW5nIERURHMgb3INCi1leGlzdGluZyBYTUwgc2NoZW1hczwvbGk+DQotPGxpPkVkaXRpbmcgWE1MIGZpbGVzPC9saT4NCi08bGk+SW1wb3J0aW5nIGV4aXN0aW5nIFhNTCBmaWxlcyBmb3Igc3RydWN0dXJlZCB2aWV3aW5nPC9saT4NCi08bGk+QXNzb2NpYXRpbmcgWE1MIGZpbGVzIHdpdGggRFREcyBvciBYTUwgc2NoZW1hczwvbGk+DQotPC91bD4NCi08cD5UaGUgWE1MIGVkaXRvciBoYXMgdHdvIG1haW4gdmlld3MgLSB0aGUgU291cmNlIHZpZXcgYW5kIHRoZSBEZXNpZ24gdmlldy4NCi1Zb3UgY2FuIGFsc28gdXNlIHRoZSBPdXRsaW5lIHZpZXcgdG8gaW5zZXJ0IGFuZCBkZWxldGUgZWxlbWVudHMuPC9wPg0KLTxzZWN0aW9uPjx0aXRsZT5Tb3VyY2UgdmlldzwvdGl0bGU+PHA+VGhlIFNvdXJjZSB2aWV3IGVuYWJsZXMgeW91IHRvIHZpZXcNCi1hbmQgd29yayBkaXJlY3RseSB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlLiBNYW55IG9mIHRoZSBYTUwgZWRpdGluZyBmZWF0dXJlcw0KLWluIHRoZSBYTUwgZWRpdG9yIFNvdXJjZSB2aWV3IGFyZSB2ZXJ5IHNpbWlsYXIgdG8gdGhvc2UgYXZhaWxhYmxlIGluIHRoZSBTb3VyY2UNCi12aWV3IG9mIFBhZ2UgRGVzaWduZXIuPC9wPjxwPlRoZSBTb3VyY2UgdmlldyBoYXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsDQotc3VjaCBhczogPHVsPg0KLTxsaT4gU3ludGF4IGhpZ2hsaWdodGluZywgdW5saW1pdGVkIHVuZG8vcmVkbywgYW5kIHVzZXItZGVmaW5lZCB0ZW1wbGF0ZXMuPC9saT4NCi08bGk+IENvbnRlbnQgYXNzaXN0LCB3aGljaCB1c2VzIHRoZSBpbmZvcm1hdGlvbiBpbiBhIERURCBvciBzY2hlbWEgY29udGVudA0KLW1vZGVsIHRvIHByb3ZpZGUgYSBsaXN0IG9mIGFjY2VwdGFibGUgY29udGludWF0aW9ucyBkZXBlbmRpbmcgb24gd2hlcmUgdGhlDQotY3Vyc29yIGlzIGxvY2F0ZWQgaW4gYW4gWE1MIGZpbGUsIG9yIHdoYXQgaGFzIGp1c3QgYmVlbiB0eXBlZC48L2xpPg0KLTxsaT4iU21hcnQiIGRvdWJsZS1jbGlja2luZyBiZWhhdmlvci4gSWYgeW91ciBjdXJzb3IgaXMgcGxhY2VkIGluIGFuIGF0dHJpYnV0ZQ0KLXZhbHVlLCBvbmUgZG91YmxlLWNsaWNrIHNlbGVjdHMgdGhhdCB2YWx1ZSwgYW5vdGhlciBkb3VibGUgY2xpY2sgc2VsZWN0cyB0aGUNCi1hdHRyaWJ1dGUtdmFsdWUgcGFpciwgYW5kIGEgdGhpcmQgZG91YmxlLWNsaWNrIHNlbGVjdHMgdGhlIGVudGlyZSB0YWcuIFRoaXMNCi1tYWtlcyBpdCBlYXNpZXIgdG8gY29weSBhbmQgcGFzdGUgY29tbW9ubHkgdXNlZCBwaWVjZXMgb2YgWE1MLjwvbGk+DQotPC91bD48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5EZXNpZ24gdmlldzwvdGl0bGU+PHA+VGhlIFhNTCBlZGl0b3IgYWxzbyBoYXMgYSBEZXNpZ24gdmlldy4NCi1UaGlzIHZpZXcgaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6PHVsPg0KLTxsaT5UaGUgWE1MIGZpbGUgaXMgcmVwcmVzZW50ZWQgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzDQotaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci48L2xpPg0KLTxsaT5Db250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLA0KLXdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBub2RlcyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3INCi10aGF0IGxvY2F0aW9uLiAgRm9yIGV4YW1wbGUsIHRoZSA8dWljb250cm9sPkFkZCBDaGlsZDwvdWljb250cm9sPiBtZW51IGl0ZW0NCi13aWxsIGxpc3Qgb25seSB0aG9zZSBlbGVtZW50cyBmcm9tIGEgRFREIG9yIFhNTCBzY2hlbWEgd2hpY2ggd291bGQgYmUgdmFsaWQNCi1jaGlsZHJlbiBhdCB0aGF0IHBvaW50IChhcyBsb25nIGFzIGdyYW1tYXIgY29uc3RyYWludHMgYXJlIG9uKS48L2xpPg0KLTwvdWw+PC9wPjxwPlRoZSBEZXNpZ24gdmlldyBpcyBlc3BlY2lhbGx5IGhlbHBmdWwgaWYgeW91IGFyZSBuZXcgdG8gWE1MLCBvcg0KLW5lZWQgdG8gZG8gZm9ybS1vcmllbnRlZCBlZGl0aW5nLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHVzZSB0aGUgQ3JlYXRlIFhNTA0KLUZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBhIHRlbXBsYXRlIFhNTCBmaWxlIGZvciBhIGpvYiBkZXNjcmlwdGlvbiBmb3JtIGZyb20NCi1hIGpvYiBkZXNjcmlwdGlvbiBEVEQuIEFmdGVyIHRob3NlIHN0ZXBzIGFyZSBjb21wbGV0ZWQsIHlvdSB3b3VsZCBvbmx5IGhhdmUNCi10byBmaWxsIGluIHRoZSBmb3JtIGRhdGEgdXNpbmcgdGhlIERlc2lnbiB2aWV3LjwvcD48L3NlY3Rpb24+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3eG1sZWR0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3eG1sZWR0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YTFlZDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd3htbGVkdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlhNTCBlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIFhNTCBlZGl0b3IgaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXR4bWwuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV4ZHRkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JleHhzZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHd4dmFsaWQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd3htbGVkdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlhNTCBlZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN3eG1sZWR0Ij48YSBuYW1lPSJjd3htbGVkdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+WE1MIGVkaXRvcjwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlIFhNTCBlZGl0b3IgaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuPC9wPgotCi08cD5Zb3UgY2FuIHVzZSBpdCB0byBwZXJmb3JtIGEgdmFyaWV0eSBvZiB0YXNrcyBzdWNoIGFzOjwvcD4KLQotPHVsPgotPGxpPkNyZWF0aW5nIG5ldywgZW1wdHkgWE1MIGZpbGVzIG9yIGdlbmVyYXRpbmcgdGhlbSBmcm9tIGV4aXN0aW5nIERURHMgb3IKLWV4aXN0aW5nIFhNTCBzY2hlbWFzPC9saT4KLQotPGxpPkVkaXRpbmcgWE1MIGZpbGVzPC9saT4KLQotPGxpPkltcG9ydGluZyBleGlzdGluZyBYTUwgZmlsZXMgZm9yIHN0cnVjdHVyZWQgdmlld2luZzwvbGk+Ci0KLTxsaT5Bc3NvY2lhdGluZyBYTUwgZmlsZXMgd2l0aCBEVERzIG9yIFhNTCBzY2hlbWFzPC9saT4KLQotPC91bD4KLQotPHA+VGhlIFhNTCBlZGl0b3IgaGFzIHR3byBtYWluIHZpZXdzIC0gdGhlIFNvdXJjZSB2aWV3IGFuZCB0aGUgRGVzaWduIHZpZXcuCi1Zb3UgY2FuIGFsc28gdXNlIHRoZSBPdXRsaW5lIHZpZXcgdG8gaW5zZXJ0IGFuZCBkZWxldGUgZWxlbWVudHMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U291cmNlIHZpZXc8L2g0PjxwPlRoZSBTb3VyY2UgdmlldyBlbmFibGVzIHlvdSB0byB2aWV3Ci1hbmQgd29yayBkaXJlY3RseSB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlLiBNYW55IG9mIHRoZSBYTUwgZWRpdGluZyBmZWF0dXJlcwotaW4gdGhlIFhNTCBlZGl0b3IgU291cmNlIHZpZXcgYXJlIHZlcnkgc2ltaWxhciB0byB0aG9zZSBhdmFpbGFibGUgaW4gdGhlIFNvdXJjZQotdmlldyBvZiBQYWdlIERlc2lnbmVyLjwvcD4KLTxkaXYgY2xhc3M9InAiPlRoZSBTb3VyY2UgdmlldyBoYXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsCi1zdWNoIGFzOiA8dWw+Ci08bGk+IFN5bnRheCBoaWdobGlnaHRpbmcsIHVubGltaXRlZCB1bmRvL3JlZG8sIGFuZCB1c2VyLWRlZmluZWQgdGVtcGxhdGVzLjwvbGk+Ci0KLTxsaT4gQ29udGVudCBhc3Npc3QsIHdoaWNoIHVzZXMgdGhlIGluZm9ybWF0aW9uIGluIGEgRFREIG9yIHNjaGVtYSBjb250ZW50Ci1tb2RlbCB0byBwcm92aWRlIGEgbGlzdCBvZiBhY2NlcHRhYmxlIGNvbnRpbnVhdGlvbnMgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZQotY3Vyc29yIGlzIGxvY2F0ZWQgaW4gYW4gWE1MIGZpbGUsIG9yIHdoYXQgaGFzIGp1c3QgYmVlbiB0eXBlZC48L2xpPgotCi08bGk+IlNtYXJ0IiBkb3VibGUtY2xpY2tpbmcgYmVoYXZpb3IuIElmIHlvdXIgY3Vyc29yIGlzIHBsYWNlZCBpbiBhbiBhdHRyaWJ1dGUKLXZhbHVlLCBvbmUgZG91YmxlLWNsaWNrIHNlbGVjdHMgdGhhdCB2YWx1ZSwgYW5vdGhlciBkb3VibGUgY2xpY2sgc2VsZWN0cyB0aGUKLWF0dHJpYnV0ZS12YWx1ZSBwYWlyLCBhbmQgYSB0aGlyZCBkb3VibGUtY2xpY2sgc2VsZWN0cyB0aGUgZW50aXJlIHRhZy4gVGhpcwotbWFrZXMgaXQgZWFzaWVyIHRvIGNvcHkgYW5kIHBhc3RlIGNvbW1vbmx5IHVzZWQgcGllY2VzIG9mIFhNTC48L2xpPgotCi08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkRlc2lnbiB2aWV3PC9oND48ZGl2IGNsYXNzPSJwIj5UaGUgWE1MIGVkaXRvciBhbHNvIGhhcyBhIERlc2lnbiB2aWV3LgotVGhpcyB2aWV3IGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOjx1bD4KLTxsaT5UaGUgWE1MIGZpbGUgaXMgcmVwcmVzZW50ZWQgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzCi1oZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLjwvbGk+Ci0KLTxsaT5Db250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLAotd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIG5vZGVzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvcgotdGhhdCBsb2NhdGlvbi4gIEZvciBleGFtcGxlLCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIENoaWxkPC9zcGFuPiBtZW51IGl0ZW0KLXdpbGwgbGlzdCBvbmx5IHRob3NlIGVsZW1lbnRzIGZyb20gYSBEVEQgb3IgWE1MIHNjaGVtYSB3aGljaCB3b3VsZCBiZSB2YWxpZAotY2hpbGRyZW4gYXQgdGhhdCBwb2ludCAoYXMgbG9uZyBhcyBncmFtbWFyIGNvbnN0cmFpbnRzIGFyZSBvbikuPC9saT4KLQotPC91bD4KLTwvZGl2PgotPHA+VGhlIERlc2lnbiB2aWV3IGlzIGVzcGVjaWFsbHkgaGVscGZ1bCBpZiB5b3UgYXJlIG5ldyB0byBYTUwsIG9yCi1uZWVkIHRvIGRvIGZvcm0tb3JpZW50ZWQgZWRpdGluZy4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB1c2UgdGhlIENyZWF0ZSBYTUwKLUZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBhIHRlbXBsYXRlIFhNTCBmaWxlIGZvciBhIGpvYiBkZXNjcmlwdGlvbiBmb3JtIGZyb20KLWEgam9iIGRlc2NyaXB0aW9uIERURC4gQWZ0ZXIgdGhvc2Ugc3RlcHMgYXJlIGNvbXBsZXRlZCwgeW91IHdvdWxkIG9ubHkgaGF2ZQotdG8gZmlsbCBpbiB0aGUgZm9ybSBkYXRhIHVzaW5nIHRoZSBEZXNpZ24gdmlldy48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3JldHhtbC5odG1sIiB0aXRsZT0iWW91IGNhbiBjcmVhdGUgYSBuZXcgWE1MIGZpbGUgd2hpY2ggeW91IGNhbiB0aGVuIGVkaXQgaW4gdGhlIFhNTCBlZGl0b3IuIFlvdSBjcmVhdGUgYSBuZXcgWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLiI+Q3JlYXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXhkdGQuaHRtbCIgdGl0bGU9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIERURCBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgRFRELiI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXh4c2QuaHRtbCIgdGl0bGU9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBYTUwgc2NoZW1hIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIFhNTCBzY2hlbWEuIj5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgdGl0bGU9IlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy4iPkVkaXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIHdpdGggTm9kZSBhbmQgQ29udGVudCBjb2x1bW5zIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3eHZhbGlkLmh0bWwiIHRpdGxlPSJXaGVuIHlvdSB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLCB0aGUgWE1MIHZhbGlkYXRvciB3aWxsIGNoZWNrIHRvIHNlZSB0aGF0IHlvdXIgZmlsZSBpcyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQuIj5WYWxpZGF0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxjYXQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVmYTRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3htbGNhdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzDQotYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZA0KLWEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLA0KLWFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGNhdGFsb2c8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPmFzc29jaWF0aW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB3YXlzIHRvIGFzc29jaWF0ZSBYTUwgZmlsZXMgd2l0aCBEVERzIG9yIFhNTCBzY2hlbWFzLjwvcD4NCi08b2w+DQotPGxpPkRpcmVjdCBhc3NvY2lhdGlvbiAtIFRoZSBYTUwgZmlsZSBjb250YWlucyBlaXRoZXIgdGhlIG5hbWUgb2YgYSBEVEQgaW4NCi1pdHMgZG9jdHlwZSBkZWNsYXJhdGlvbiAoZm9yIGV4YW1wbGUsICZsdDshRE9DVFlQRSByb290LWVsZW1lbnQgU1lTVEVNICI8dmFybmFtZT5kdGRmaWxlLmR0ZDwvdmFybmFtZT4iDQotPiwgd2hlcmUgPHZhcm5hbWU+ZHRkZmlsZS5kdGQ8L3Zhcm5hbWU+IGlzIHRoZSBuYW1lIG9mIHRoZSBEVEQgZmlsZSkgb3IgaXQNCi1jb250YWlucyB0aGUgcGF0aCBvZiBhbiBYTUwgc2NoZW1hIGluIHRoZSBzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgb2YgdGhlDQotWE1MIGZpbGUgcm9vdCBlbGVtZW50IChmb3IgZXhhbXBsZSwgJmx0O3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tLzx2YXJuYW1lPnNjaGVtYS54c2Q8L3Zhcm5hbWU+Ij4sDQotd2hlcmUgIDx2YXJuYW1lPnNjaGVtYS54c2Q8L3Zhcm5hbWU+IGlzIHRoZSBuYW1lIG9mIHRoZSBYTUwgc2NoZW1hLjwvbGk+DQotPGxpPlhNTCBDYXRhbG9nIGVudHJ5IC0gWW91IGNhbiByZWdpc3RlciBEVEQgYW5kIFhNTCBzY2hlbWEgZmlsZXMgaW4gdGhlIFhNTA0KLUNhdGFsb2cgYW5kIGFzc29jaWF0ZSB0aGVtIHdpdGggYSAgS2V5IHRoYXQgcmVwcmVzZW50cyB0aGVtLiBZb3UgY2FuIHRoZW4NCi1yZWZlciB0byBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUgS2V5IGZyb20gYW4gWE1MIGZpbGUgaW5zdGVhZCBvZiByZWZlcnJpbmcNCi1kaXJlY3RseSB0byB0aGUgRFREIG9yIFhNTCBzY2hlbWEgZmlsZS4gQW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvDQotcGFydHMgLSB0aGUgS2V5ICh3aGljaCByZXByZXNlbnRzIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgVVJJICh3aGljaA0KLWNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBsb2NhdGlvbikuPC9saT4NCi08L29sPg0KLTxzZWN0aW9uPjx0aXRsZT5Ib3cgYW4gYXNzb2NpYXRpb24gd29ya3M8L3RpdGxlPjxiPkFzc29jaWF0aW5nIGFuIFhNTCBmaWxlDQotd2l0aCBhIERURCA8L2I+PHA+SWYgYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFRELCBhIERPQ1RZUEUgdGFnIHN1Y2gNCi1hcyB0aGUgZm9sbG93aW5nIG9uZSBpcyBpbmNsdWRlZCBpbiB0aGUgWE1MIGZpbGU6PGNvZGVibG9jaz4mbHQ7IURPQ1RZUEUgcm9vdC1uYW1lIFBVQkxJQyAiPHZhcm5hbWU+SW52b2ljZUlkPC92YXJuYW1lPiIgIjx2YXJuYW1lPkM6XG15ZHRkc1xJbnZvaWNlLmR0ZDwvdmFybmFtZQ0KLT4iPg0KLTwvY29kZWJsb2NrPjwvcD48cD5JbnZvaWNlSWQgaXMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBEVEQgZmlsZS4gSXQNCi1pcyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUgWE1MIGZpbGUgd2l0aCBhIERURCBmaWxlIChpbiB0aGlzIGNhc2UsIHRoZSBEVEQgZmlsZQ0KLWlzIEludm9pY2UuZHRkKS4gSWYgdGhlIHB1YmxpYyBpZGVudGlmaWVyIEludm9pY2VJZCBjb3JyZXNwb25kcyB0byB0aGUgS2V5DQotb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5IGZvciBJbnZvaWNlLmR0ZCwgdGhlbiB0aGUgVTw/UHViIENhcmV0Pz5SSSBvZiB0aGUNCi1YTUwgQ2F0YWxvZyBlbnRyeSAod2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIG9mIEludm9pY2UuZHRkKQ0KLWlzIHVzZWQgdG8gbG9jYXRlIHRoZSBEVEQuIE90aGVyd2lzZSwgdGhlIERPQ1RZUEUncyBzeXN0ZW0gaWRlbnRpZmllciAoIkM6XG15ZHRkc1xJbnZvaWNlLmR0ZCIpLA0KLXdoaWNoIHJlZmVycyBkaXJlY3RseSB0byB0aGUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gb2YgdGhlIERURCwgaXMgdXNlZCB0byBsb2NhdGUNCi10aGUgRFRELjwvcD48bm90ZT5Zb3UgY2FuIGFsc28gdXNlIGEgc3lzdGVtIGlkZW50aWZpZXIgYXMgYSBLZXkgaW4gYW4gWE1MDQotQ2F0YWxvZyBlbnRyeS4gSWYgeW91IHVzZSBhIHN5c3RlbSBpZGVudGlmaWVyIGFzIGEgS2V5LCBhIERPQ1RZUEUgdGFnIHN1Y2gNCi1hcyB0aGUgZm9sbG93aW5nIG9uZSBpcyBpbmNsdWRlZCBpbiBhbiBYTUwgZmlsZTo8L25vdGU+PGNvZGVibG9jaz4mbHQ7IURPQ1RZUEUgUm9vdC1uYW1lIFNZU1RFTSAiTXlEVEQuZHRkIj4gPC9jb2RlYmxvY2s+PHA+d2hlcmUNCi1NeURURC5kdGQgaXMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIEtleSBvZiBhbiBYTUwgQ2F0YWxvZw0KLWVudHJ5LjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PGI+QXNzb2NpYXRpbmcgYW4gWE1MIGZpbGUgd2l0aCBhbiBYTUwgc2NoZW1hPC9iPjxwPklmIGFuIFhNTCBmaWxlDQotaXMgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWEsIG9uZSBvciBtb3JlIHNjaGVtYSBsb2NhdGlvbiBhdHRyaWJ1dGVzIGFyZQ0KLWluY2x1ZGVkIGluIHRoZSBYTUwgZmlsZS4gVGhlIGluZm9ybWF0aW9uIGluIHRoZSBzY2hlbWFMb2NhdGlvbiBpcyBwcm92aWRlZA0KLWFzIGEgImhpbnQiIHRvIHRoZSBYTUwgcHJvY2Vzc29yLiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgc2NoZW1hTG9jYXRpb24NCi1hdHRyaWJ1dGVzOjwvcD48cD4gPGI+RXhhbXBsZSAxIDwvYj48Y29kZWJsb2NrPiZsdDtwdXJjaGFzZU9yZGVyIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iDQoteHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gQzpcbXlzY2hlbWFzXFB1cmNoYXNlT3JkZXIueHNkIj4NCi0mbHQ7c2hpcFRvIGNvdW50cnk9IlVTIj4NCi0uLi48L2NvZGVibG9jaz4gICAgPC9wPjxwPjxiPkV4YW1wbGUgMiA8L2I+PGNvZGVibG9jaz4mbHQ7cHVyY2hhc2VPcmRlciB4bWxucz0iaHR0cDovL3d3dy5pYm0uY29tIg0KLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIFBPLnhzZCI+DQotJmx0O3NoaXBUbyBjb3VudHJ5PSJVUyI+DQotLi4uLjwvY29kZWJsb2NrPiAgPC9wPjxwPkluIEV4YW1wbGUgMSwgdGhlIHNjaGVtYUxvY2F0aW9uICdoaW50JyAoJ0M6XG15c2NoZW1hc1xQdXJjaGFzZU9yZGVyLnhzZCcpDQotcmVmZXJzIGRpcmVjdGx5IHRvIHRoZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiBvciBVUkkgb2YgdGhlIFhNTCBzY2hlbWEuIEluIHRoaXMNCi1jYXNlLCB0aGUgc2NoZW1hIGZpbGUgd2lsbCBiZSBsb2NhdGVkIGJ5IHRoZSBYTUwgcHJvY2Vzc29yIGRpcmVjdGx5LjwvcD48cD5Jbg0KLUV4YW1wbGUgMiwgdGhlIHNjaGVtYUxvY2F0aW9uICdoaW50JyAoJ1BPLnhzZCcpIHJlZmVycyB0byBhbiBYTUwgQ2F0YWxvZyBlbnRyeS4NCi1QTy54c2QgY29ycmVzcG9uZHMgdG8gdGhlICA8dmFybmFtZT5LZXk8L3Zhcm5hbWU+IG9mIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeQ0KLWZvciBQdXJjaGFzZU9yZGVyLnhzZCwgYW5kIHRoZSBVUkkgb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5ICh3aGljaCBjb250YWlucw0KLWluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBvZiBQdXJjaGFzZU9yZGVyLnhzZCkgd2lsbCBiZSB1c2VkIHRvIGxvY2F0ZWQNCi10aGUgWE1MIHNjaGVtYS48L3A+PHA+SW4gYm90aCBleGFtcGxlcywgPGNvZGVwaD5odHRwOi8vd3d3LmlibS5jb208L2NvZGVwaD4gaW4NCi10aGUgPGNvZGVwaD54c2k6c2NoZW1hTG9jYXRpb248L2NvZGVwaD4gdGFnIGlzIGEgVVJJIHRoYXQgaWRlbnRpZmllcyB0aGUgbmFtZXNwYWNlDQotZm9yIHRoZSBYTUwgc2NoZW1hLjwvcD48cD5Zb3UgY2FuIGFsc28gdXNlIGEgbmFtZXNwYWNlIGFzIGEgS2V5IGZvciBhbiBYTUwNCi1DYXRhbG9nIGVudHJ5LiBJZiB5b3UgdXNlIGEgbmFtZXNwYWNlIGFzIGEgS2V5LCBhIHNjaGVtYUxvY2F0aW9uIHRhZyBzdWNoDQotYXMgdGhlIGZvbGxvd2luZyBvbmUgaXMgaW5jbHVkZWQgaW4gYW4gWE1MIGZpbGU6PGNvZGVibG9jaz4mbHQ7cHVyY2hhc2VPcmRlciB4bWxuczo9Ind3dy5pYm0uY29tIg0KLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHBvL3hzZC9QdXJjaGFzZU9yZGVyLnhzZCAiPjwvY29kZWJsb2NrPjwvcD48cD5UaGUNCi1zY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgcG9pbnRzIHRvIGJvdGggdGhlIEtleSBhbmQgdGhlIGFjdHVhbCBsb2NhdGlvbiBvZg0KLXRoZSBzY2hlbWEuPC9wPjxwPjxiPkRURCBvciBYTUwgc2NoZW1hIHJlc2lkZXMgb24gYSByZW1vdGUgc2VydmVyPC9iPjwvcD48cD5TZXZlcmFsDQotZnVuY3Rpb25zIGluIHRoZSBYTUwgZWRpdG9yLCBzdWNoIGFzIHZhbGlkYXRpb24gYW5kIGNvbnRlbnQgYXNzaXN0LCByZXF1aXJlDQotdGhlIGF2YWlsYWJpbGl0eSBvZiBhIERURCBvciBhbiBYTUwgc2NoZW1hLiBUaGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHByb3ZpZGVzDQotdXNhZ2UgaW5mb3JtYXRpb24gZm9yIGNhc2VzIHdoZW4gdGhlIERURCBvciBYTUwgc2NoZW1hIHJlc2lkZXMgb24geW91ciBsb2NhbA0KLW1hY2hpbmUuIEhvd2V2ZXIsIGluIG1hbnkgY2FzZXMsIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBjYW4gcmVzaWRlIG9uIGEgcmVtb3RlDQotc2VydmVyLCBmb3IgZXhhbXBsZTo8L3A+PHA+PGNvZGVwaD4mbHQ7IURPQ1RZUEUgQ2F0YWxvZyBQVUJMSUMgImFiYy9DYXRhbG9nIg0KLSJodHRwOi8veHl6LmFiYy5vcmcvZHRkcy9jYXRhbG9nLmR0ZCI+PC9jb2RlcGg+PC9wPjxwPk5vcm1hbGx5LCB0aGlzIGNhc2UNCi1wb3NlcyBubyBwcm9ibGVtLCBiZWNhdXNlIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlDQotcmVtb3RlIHNlcnZlci4gSG93ZXZlciwgaWYgeW91IGFyZSBiZWhpbmQgYSBmaXJld2FsbCwgYW5kIGRvIG5vdCBoYXZlIGEgU09DS1NpZmllZA0KLXN5c3RlbSwgdGhlIHdvcmtiZW5jaCBjdXJyZW50bHkgZG9lcyBub3QgcHJvdmlkZSBhIHdheSBmb3IgeW91IHRvIHNwZWNpZnkNCi1hIHNvY2tzIHNlcnZlciBmb3IgcmV0cmlldmluZyBhIERURCBvciBYTUwgc2NoZW1hLiBJZiB5b3UgYXJlIHVuYWJsZSB0byBTT0NLU2lmeQ0KLXlvdXIgc3lzdGVtLCB0aGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBwcm9ibGVtIGlzIHRvIHJldHJpZXZlIGEgY29weSBvZiB0aGUNCi1EVEQgb3IgWE1MIHNjaGVtYSAodXNpbmcgYSBXZWIgYnJvd3NlciwgZm9yIGV4YW1wbGUpIGFuZCBzYXZlIHRoYXQgY29weSBvbg0KLXlvdXIgbG9jYWwgbWFjaGluZS4gVGhlbiwgeW91IGNhbiBlaXRoZXIgcGxhY2UgYSBsb2NhbCBjb3B5IGluIHRoZSBzYW1lIHByb2plY3QNCi1hcyB5b3VyIFhNTCBmaWxlLCBvciB1c2UgdGhlIFhNTCBDYXRhbG9nIHRvIGFzc29jaWF0ZSBhIHB1YmxpYyBpZGVudGlmaWVyDQotd2l0aCB0aGUgRFREJ3MgKGxvY2FsKSBsb2NhdGlvbi48L3A+PG5vdGU+SWYgeW91IGhhdmUgYW4gWE1MIGZpbGUgYXNzb2NpYXRlZA0KLXdpdGggYW4gWE1MIHNjaGVtYSBvciBEVEQgdGhhdCBpcyBlbHNld2hlcmUgaW4gdGhlIG5ldHdvcmssIGFuZCB5b3UgYXJlIHdvcmtpbmcNCi1vbiBhIG1hY2hpbmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIG5ldHdvcmssIHlvdSBjYW4gZm9sbG93IHRoZSBzdGVwcyBkZXNjcmliZWQNCi1wcmV2aW91c2x5IGlmIHlvdSB3YW50IHRvIHVzZSBjb250ZW50IGFzc2lzdCBvciB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLiAgPC9ub3RlPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+QWR2YW50YWdlcyBvZiBYTUwgQ2F0YWxvZyBlbnRyeSBhc3NvY2lhdGlvbnM8L3RpdGxlPjxwPklmDQoteW91IGNyZWF0ZSBhIGRpcmVjdCBhc3NvY2lhdGlvbiBiZXR3ZWVuIGFuIFhNTCBmaWxlIGFuZCBhbiBYTUwgc2NoZW1hIG9yIERURA0KLWZpbGUsIGFueSB0aW1lIHlvdSBjaGFuZ2UgdGhlIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEgb3IgRFREIHlvdSBoYXZlIHRvIHRyYWNrDQotZG93biBhbmQgdXBkYXRlIGFsbCBvZiB0aGUgcmVmZXJlbmNpbmcgWE1MIGZpbGVzIHdpdGggdGhlIG5ldyBsb2NhdGlvbiBvZg0KLXRoZSBEVEQgb3Igc2NoZW1hLiBJZiwgaG93ZXZlciwgeW91IGFzc29jaWF0ZSBhbiBYTUwgZmlsZSB3aXRoIGFuIFhNTCBzY2hlbWENCi1vciBEVEQgS2V5LCB0aGVuLCB3aGVuIHlvdSBjaGFuZ2UgdGhlIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEgb3IgRFRELCB5b3Ugb25seQ0KLWhhdmUgdG8gdXBkYXRlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSwgaW5zdGVhZCBvZiBlYWNoIGluZGl2aWR1YWwgWE1MIGZpbGUuPC9wPjxwPkZvcg0KLWV4YW1wbGUsIHlvdSBoYXZlIGEgRFREIGNhbGxlZCBCdWlsZGluZy5kdGQsIHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCBmaXZlDQotWE1MIGZpbGVzIC0gT2ZmaWNlLnhtbCwgSG91c2UueG1sLCBBcGFydG1lbnQueG1sLCBCYW5rLnhtbCwgYW5kIFBvc3RPZmZpY2UueG1sLg0KLVlvdSBtb3ZlIHRoZSBEVEQgZmlsZSBCdWlsZGluZy5kdGQgdG8gYSBuZXcgbG9jYXRpb24uIElmIHlvdSBoYXZlIGEgZGlyZWN0aW9uDQotYXNzb2NpYXRpb24gYmV0d2VlbiBCdWlsZGluZy5kdGQgYW5kIGFsbCB0aGUgWE1MIGZpbGVzLCB5b3Ugd2lsbCBoYXZlIHRvIHVwZGF0ZQ0KLXRoZSAmbHQ7RE9DVFRZUEU+IGRlY2xhcmF0aW9uIGluIGVhY2ggWE1MIGZpbGUgdG8gcmVmbGVjdCB0aGUgbmV3IGxvY2F0aW9uDQotb2YgQnVpbGRpbmcuZHRkLiBJZiwgaG93ZXZlciwgeW91IGhhdmUgYW4gWE1MIENhdGFsb2cgYXNzb2NpYXRpb24sIGFuZCBhbGwNCi10aGUgWE1MIGZpbGVzIGp1c3QgcmVmZXIgdG8gdGhlIEtleSBvZiBCdWlsZGluZy5kdGQsIHRoZW4geW91IG9ubHkgaGF2ZSB0bw0KLXVwZGF0ZSB0aGUgVVJJIGFuZCBhbGwgdGhlIFhNTCBmaWxlcyB3aWxsIHBvaW50IHRvIHRoZSBuZXcgbG9jYXRpb24gb2YgQnVpbGRpbmcuZHRkLjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlVwZGF0aW5nIGFuIGVudHJ5IGluIHRoZSBYTUwgQ2F0YWxvZzwvdGl0bGU+PHA+QWZ0ZXIgeW91IGhhdmUNCi11cGRhdGVkIGFuIGVudHJ5IGluIHRoZSBYTUwgQ2F0YWxvZywgeW91IG1pZ2h0IG5lZWQgdG8gcmVmcmVzaCB0aGUgWE1MIGVkaXRvcg0KLXZpZXcgc28gdGhhdCBpdCB1c2VzIHRoZSBuZXcgaW5mb3JtYXRpb24uIFRvIGRvIHRoaXMsIGNsaWNrIHRoZSA8dWljb250cm9sPlJlbG9hZA0KLURlcGVuZGVuY2llczwvdWljb250cm9sPiB0b29sYmFyIGJ1dHRvbiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL3JsZGdybXIuZ2lmIj4NCi08YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgUmVsb2FkIERlcGVuZGVuY2llcyB0b29sYmFyIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+IGFuZA0KLXRoZSB2aWV3IHdpbGwgYmUgdXBkYXRlZCB1c2luZyB0aGUgY3VycmVudCBYTUwgQ2F0YWxvZyBzZXR0aW5ncy4gWW91IG9ubHkNCi1uZWVkIHRvIHJlZnJlc2ggdGhlIFhNTCBlZGl0b3IgdmlldyB3aGVuIHlvdSBoYXZlIGFuIFhNTCBmaWxlIG9wZW4gdGhhdCByZWZlcmVuY2VzDQotdGhlIFhNTCBDYXRhbG9nIGVudHJ5IHRoYXQgd2FzIHVwZGF0ZWQuPC9wPjxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlcg0KLXRvIHRoZSByZWxhdGVkIHRhc2tzLjwvcD48L3NlY3Rpb24+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCi08P1B1YiAqMDAwMDAwODM1OT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sY2F0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxjYXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkMWM0MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxjYXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBjYXRhbG9nLCBvdmVydmlldywgWE1MIGZpbGVzLCBhc3NvY2lhdGlvbnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgY2F0YWxvZywgb3ZlcnZpZXcsIFhNTCBmaWxlcywgYXNzb2NpYXRpb25zIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0cHJvYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN4bWxjYXQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3htbGNhdCI+PGEgbmFtZT0iY3htbGNhdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzCi1ib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkCi1hIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwKLWFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuPC9wPgotCi08cD5UaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB3YXlzIHRvIGFzc29jaWF0ZSBYTUwgZmlsZXMgd2l0aCBEVERzIG9yIFhNTCBzY2hlbWFzLjwvcD4KLQotPG9sPgotPGxpPkRpcmVjdCBhc3NvY2lhdGlvbiAtIFRoZSBYTUwgZmlsZSBjb250YWlucyBlaXRoZXIgdGhlIG5hbWUgb2YgYSBEVEQgaW4KLWl0cyBkb2N0eXBlIGRlY2xhcmF0aW9uIChmb3IgZXhhbXBsZSwgJmx0OyFET0NUWVBFIHJvb3QtZWxlbWVudCBTWVNURU0gIjx2YXIgY2xhc3M9InZhcm5hbWUiPmR0ZGZpbGUuZHRkPC92YXI+IgotJmd0Oywgd2hlcmUgPHZhciBjbGFzcz0idmFybmFtZSI+ZHRkZmlsZS5kdGQ8L3Zhcj4gaXMgdGhlIG5hbWUgb2YgdGhlIERURCBmaWxlKSBvciBpdAotY29udGFpbnMgdGhlIHBhdGggb2YgYW4gWE1MIHNjaGVtYSBpbiB0aGUgc2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIG9mIHRoZQotWE1MIGZpbGUgcm9vdCBlbGVtZW50IChmb3IgZXhhbXBsZSwgJmx0O3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tLzx2YXIgY2xhc3M9InZhcm5hbWUiPnNjaGVtYS54c2Q8L3Zhcj4iJmd0OywKLXdoZXJlICA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5zY2hlbWEueHNkPC92YXI+IGlzIHRoZSBuYW1lIG9mIHRoZSBYTUwgc2NoZW1hLjwvbGk+Ci0KLTxsaT5YTUwgQ2F0YWxvZyBlbnRyeSAtIFlvdSBjYW4gcmVnaXN0ZXIgRFREIGFuZCBYTUwgc2NoZW1hIGZpbGVzIGluIHRoZSBYTUwKLUNhdGFsb2cgYW5kIGFzc29jaWF0ZSB0aGVtIHdpdGggYSAgS2V5IHRoYXQgcmVwcmVzZW50cyB0aGVtLiBZb3UgY2FuIHRoZW4KLXJlZmVyIHRvIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSBLZXkgZnJvbSBhbiBYTUwgZmlsZSBpbnN0ZWFkIG9mIHJlZmVycmluZwotZGlyZWN0bHkgdG8gdGhlIERURCBvciBYTUwgc2NoZW1hIGZpbGUuIEFuIFhNTCBDYXRhbG9nIGVudHJ5IGNvbnRhaW5zIHR3bwotcGFydHMgLSB0aGUgS2V5ICh3aGljaCByZXByZXNlbnRzIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgVVJJICh3aGljaAotY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIERURCBvciBYTUwgc2NoZW1hIGxvY2F0aW9uKS48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+SG93IGFuIGFzc29jaWF0aW9uIHdvcmtzPC9oND48c3Ryb25nPkFzc29jaWF0aW5nIGFuIFhNTCBmaWxlCi13aXRoIGEgRFREIDwvc3Ryb25nPjxkaXYgY2xhc3M9InAiPklmIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCwgYSBET0NUWVBFIHRhZyBzdWNoCi1hcyB0aGUgZm9sbG93aW5nIG9uZSBpcyBpbmNsdWRlZCBpbiB0aGUgWE1MIGZpbGU6PHByZT4mbHQ7IURPQ1RZUEUgcm9vdC1uYW1lIFBVQkxJQyAiPHZhciBjbGFzcz0idmFybmFtZSI+SW52b2ljZUlkPC92YXI+IiAiPHZhciBjbGFzcz0idmFybmFtZSI+QzpcbXlkdGRzXEludm9pY2UuZHRkPC92YXI+IiZndDsKLTwvcHJlPgotPC9kaXY+Ci08cD5JbnZvaWNlSWQgaXMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBEVEQgZmlsZS4gSXQKLWlzIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBYTUwgZmlsZSB3aXRoIGEgRFREIGZpbGUgKGluIHRoaXMgY2FzZSwgdGhlIERURCBmaWxlCi1pcyBJbnZvaWNlLmR0ZCkuIElmIHRoZSBwdWJsaWMgaWRlbnRpZmllciBJbnZvaWNlSWQgY29ycmVzcG9uZHMgdG8gdGhlIEtleQotb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5IGZvciBJbnZvaWNlLmR0ZCwgdGhlbiB0aGUgVVJJIG9mIHRoZQotWE1MIENhdGFsb2cgZW50cnkgKHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBvZiBJbnZvaWNlLmR0ZCkKLWlzIHVzZWQgdG8gbG9jYXRlIHRoZSBEVEQuIE90aGVyd2lzZSwgdGhlIERPQ1RZUEUncyBzeXN0ZW0gaWRlbnRpZmllciAoIkM6XG15ZHRkc1xJbnZvaWNlLmR0ZCIpLAotd2hpY2ggcmVmZXJzIGRpcmVjdGx5IHRvIHRoZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiBvZiB0aGUgRFRELCBpcyB1c2VkIHRvIGxvY2F0ZQotdGhlIERURC48L3A+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiBhbHNvIHVzZSBhIHN5c3RlbSBpZGVudGlmaWVyIGFzIGEgS2V5IGluIGFuIFhNTAotQ2F0YWxvZyBlbnRyeS4gSWYgeW91IHVzZSBhIHN5c3RlbSBpZGVudGlmaWVyIGFzIGEgS2V5LCBhIERPQ1RZUEUgdGFnIHN1Y2gKLWFzIHRoZSBmb2xsb3dpbmcgb25lIGlzIGluY2x1ZGVkIGluIGFuIFhNTCBmaWxlOjwvZGl2PgotPHByZT4mbHQ7IURPQ1RZUEUgUm9vdC1uYW1lIFNZU1RFTSAiTXlEVEQuZHRkIiZndDsgPC9wcmU+Ci08cD53aGVyZQotTXlEVEQuZHRkIGlzIHRoZSBzeXN0ZW0gaWRlbnRpZmllciB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBLZXkgb2YgYW4gWE1MIENhdGFsb2cKLWVudHJ5LjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48c3Ryb25nPkFzc29jaWF0aW5nIGFuIFhNTCBmaWxlIHdpdGggYW4gWE1MIHNjaGVtYTwvc3Ryb25nPjxwPklmIGFuIFhNTCBmaWxlCi1pcyBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIHNjaGVtYSwgb25lIG9yIG1vcmUgc2NoZW1hIGxvY2F0aW9uIGF0dHJpYnV0ZXMgYXJlCi1pbmNsdWRlZCBpbiB0aGUgWE1MIGZpbGUuIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgc2NoZW1hTG9jYXRpb24gaXMgcHJvdmlkZWQKLWFzIGEgImhpbnQiIHRvIHRoZSBYTUwgcHJvY2Vzc29yLiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgc2NoZW1hTG9jYXRpb24KLWF0dHJpYnV0ZXM6PC9wPgotPGRpdiBjbGFzcz0icCI+IDxzdHJvbmc+RXhhbXBsZSAxIDwvc3Ryb25nPjxwcmU+Jmx0O3B1cmNoYXNlT3JkZXIgeG1sbnM9Imh0dHA6Ly93d3cuaWJtLmNvbSIKLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIEM6XG15c2NoZW1hc1xQdXJjaGFzZU9yZGVyLnhzZCImZ3Q7Ci0mbHQ7c2hpcFRvIGNvdW50cnk9IlVTIiZndDsKLS4uLjwvcHJlPgotICAgIDwvZGl2PgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5FeGFtcGxlIDIgPC9zdHJvbmc+PHByZT4mbHQ7cHVyY2hhc2VPcmRlciB4bWxucz0iaHR0cDovL3d3dy5pYm0uY29tIgoteHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gUE8ueHNkIiZndDsKLSZsdDtzaGlwVG8gY291bnRyeT0iVVMiJmd0OwotLi4uLjwvcHJlPgotICA8L2Rpdj4KLTxwPkluIEV4YW1wbGUgMSwgdGhlIHNjaGVtYUxvY2F0aW9uICdoaW50JyAoJ0M6XG15c2NoZW1hc1xQdXJjaGFzZU9yZGVyLnhzZCcpCi1yZWZlcnMgZGlyZWN0bHkgdG8gdGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uIG9yIFVSSSBvZiB0aGUgWE1MIHNjaGVtYS4gSW4gdGhpcwotY2FzZSwgdGhlIHNjaGVtYSBmaWxlIHdpbGwgYmUgbG9jYXRlZCBieSB0aGUgWE1MIHByb2Nlc3NvciBkaXJlY3RseS48L3A+Ci08cD5JbgotRXhhbXBsZSAyLCB0aGUgc2NoZW1hTG9jYXRpb24gJ2hpbnQnICgnUE8ueHNkJykgcmVmZXJzIHRvIGFuIFhNTCBDYXRhbG9nIGVudHJ5LgotUE8ueHNkIGNvcnJlc3BvbmRzIHRvIHRoZSAgPHZhciBjbGFzcz0idmFybmFtZSI+S2V5PC92YXI+IG9mIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeQotZm9yIFB1cmNoYXNlT3JkZXIueHNkLCBhbmQgdGhlIFVSSSBvZiB0aGUgWE1MIENhdGFsb2cgZW50cnkgKHdoaWNoIGNvbnRhaW5zCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYXRpb24gb2YgUHVyY2hhc2VPcmRlci54c2QpIHdpbGwgYmUgdXNlZCB0byBsb2NhdGVkCi10aGUgWE1MIHNjaGVtYS48L3A+Ci08cD5JbiBib3RoIGV4YW1wbGVzLCA8c2FtcCBjbGFzcz0iY29kZXBoIj5odHRwOi8vd3d3LmlibS5jb208L3NhbXA+IGluCi10aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+eHNpOnNjaGVtYUxvY2F0aW9uPC9zYW1wPiB0YWcgaXMgYSBVUkkgdGhhdCBpZGVudGlmaWVzIHRoZSBuYW1lc3BhY2UKLWZvciB0aGUgWE1MIHNjaGVtYS48L3A+Ci08ZGl2IGNsYXNzPSJwIj5Zb3UgY2FuIGFsc28gdXNlIGEgbmFtZXNwYWNlIGFzIGEgS2V5IGZvciBhbiBYTUwKLUNhdGFsb2cgZW50cnkuIElmIHlvdSB1c2UgYSBuYW1lc3BhY2UgYXMgYSBLZXksIGEgc2NoZW1hTG9jYXRpb24gdGFnIHN1Y2gKLWFzIHRoZSBmb2xsb3dpbmcgb25lIGlzIGluY2x1ZGVkIGluIGFuIFhNTCBmaWxlOjxwcmU+Jmx0O3B1cmNoYXNlT3JkZXIgeG1sbnM6PSJ3d3cuaWJtLmNvbSIKLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHBvL3hzZC9QdXJjaGFzZU9yZGVyLnhzZCAiJmd0OzwvcHJlPgotPC9kaXY+Ci08cD5UaGUKLXNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBwb2ludHMgdG8gYm90aCB0aGUgS2V5IGFuZCB0aGUgYWN0dWFsIGxvY2F0aW9uIG9mCi10aGUgc2NoZW1hLjwvcD4KLTxwPjxzdHJvbmc+RFREIG9yIFhNTCBzY2hlbWEgcmVzaWRlcyBvbiBhIHJlbW90ZSBzZXJ2ZXI8L3N0cm9uZz48L3A+Ci08cD5TZXZlcmFsCi1mdW5jdGlvbnMgaW4gdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdmFsaWRhdGlvbiBhbmQgY29udGVudCBhc3Npc3QsIHJlcXVpcmUKLXRoZSBhdmFpbGFiaWxpdHkgb2YgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYS4gVGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiBwcm92aWRlcwotdXNhZ2UgaW5mb3JtYXRpb24gZm9yIGNhc2VzIHdoZW4gdGhlIERURCBvciBYTUwgc2NoZW1hIHJlc2lkZXMgb24geW91ciBsb2NhbAotbWFjaGluZS4gSG93ZXZlciwgaW4gbWFueSBjYXNlcywgdGhlIERURCBvciBYTUwgc2NoZW1hIGNhbiByZXNpZGUgb24gYSByZW1vdGUKLXNlcnZlciwgZm9yIGV4YW1wbGU6PC9wPgotPHA+PHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0OyFET0NUWVBFIENhdGFsb2cgUFVCTElDICJhYmMvQ2F0YWxvZyIKLSJodHRwOi8veHl6LmFiYy5vcmcvZHRkcy9jYXRhbG9nLmR0ZCImZ3Q7PC9zYW1wPjwvcD4KLTxwPk5vcm1hbGx5LCB0aGlzIGNhc2UKLXBvc2VzIG5vIHByb2JsZW0sIGJlY2F1c2UgdGhlIERURCBvciBYTUwgc2NoZW1hIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUKLXJlbW90ZSBzZXJ2ZXIuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgYmVoaW5kIGEgZmlyZXdhbGwsIGFuZCBkbyBub3QgaGF2ZSBhIFNPQ0tTaWZpZWQKLXN5c3RlbSwgdGhlIHdvcmtiZW5jaCBjdXJyZW50bHkgZG9lcyBub3QgcHJvdmlkZSBhIHdheSBmb3IgeW91IHRvIHNwZWNpZnkKLWEgc29ja3Mgc2VydmVyIGZvciByZXRyaWV2aW5nIGEgRFREIG9yIFhNTCBzY2hlbWEuIElmIHlvdSBhcmUgdW5hYmxlIHRvIFNPQ0tTaWZ5Ci15b3VyIHN5c3RlbSwgdGhlIHdvcmthcm91bmQgZm9yIHRoaXMgcHJvYmxlbSBpcyB0byByZXRyaWV2ZSBhIGNvcHkgb2YgdGhlCi1EVEQgb3IgWE1MIHNjaGVtYSAodXNpbmcgYSBXZWIgYnJvd3NlciwgZm9yIGV4YW1wbGUpIGFuZCBzYXZlIHRoYXQgY29weSBvbgoteW91ciBsb2NhbCBtYWNoaW5lLiBUaGVuLCB5b3UgY2FuIGVpdGhlciBwbGFjZSBhIGxvY2FsIGNvcHkgaW4gdGhlIHNhbWUgcHJvamVjdAotYXMgeW91ciBYTUwgZmlsZSwgb3IgdXNlIHRoZSBYTUwgQ2F0YWxvZyB0byBhc3NvY2lhdGUgYSBwdWJsaWMgaWRlbnRpZmllcgotd2l0aCB0aGUgRFREJ3MgKGxvY2FsKSBsb2NhdGlvbi48L3A+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSWYgeW91IGhhdmUgYW4gWE1MIGZpbGUgYXNzb2NpYXRlZAotd2l0aCBhbiBYTUwgc2NoZW1hIG9yIERURCB0aGF0IGlzIGVsc2V3aGVyZSBpbiB0aGUgbmV0d29yaywgYW5kIHlvdSBhcmUgd29ya2luZwotb24gYSBtYWNoaW5lIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBuZXR3b3JrLCB5b3UgY2FuIGZvbGxvdyB0aGUgc3RlcHMgZGVzY3JpYmVkCi1wcmV2aW91c2x5IGlmIHlvdSB3YW50IHRvIHVzZSBjb250ZW50IGFzc2lzdCBvciB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLiAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkFkdmFudGFnZXMgb2YgWE1MIENhdGFsb2cgZW50cnkgYXNzb2NpYXRpb25zPC9oND48cD5JZgoteW91IGNyZWF0ZSBhIGRpcmVjdCBhc3NvY2lhdGlvbiBiZXR3ZWVuIGFuIFhNTCBmaWxlIGFuZCBhbiBYTUwgc2NoZW1hIG9yIERURAotZmlsZSwgYW55IHRpbWUgeW91IGNoYW5nZSB0aGUgbG9jYXRpb24gb2YgdGhlIHNjaGVtYSBvciBEVEQgeW91IGhhdmUgdG8gdHJhY2sKLWRvd24gYW5kIHVwZGF0ZSBhbGwgb2YgdGhlIHJlZmVyZW5jaW5nIFhNTCBmaWxlcyB3aXRoIHRoZSBuZXcgbG9jYXRpb24gb2YKLXRoZSBEVEQgb3Igc2NoZW1hLiBJZiwgaG93ZXZlciwgeW91IGFzc29jaWF0ZSBhbiBYTUwgZmlsZSB3aXRoIGFuIFhNTCBzY2hlbWEKLW9yIERURCBLZXksIHRoZW4sIHdoZW4geW91IGNoYW5nZSB0aGUgbG9jYXRpb24gb2YgdGhlIHNjaGVtYSBvciBEVEQsIHlvdSBvbmx5Ci1oYXZlIHRvIHVwZGF0ZSB0aGUgWE1MIENhdGFsb2cgZW50cnksIGluc3RlYWQgb2YgZWFjaCBpbmRpdmlkdWFsIFhNTCBmaWxlLjwvcD4KLTxwPkZvcgotZXhhbXBsZSwgeW91IGhhdmUgYSBEVEQgY2FsbGVkIEJ1aWxkaW5nLmR0ZCwgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIGZpdmUKLVhNTCBmaWxlcyAtIE9mZmljZS54bWwsIEhvdXNlLnhtbCwgQXBhcnRtZW50LnhtbCwgQmFuay54bWwsIGFuZCBQb3N0T2ZmaWNlLnhtbC4KLVlvdSBtb3ZlIHRoZSBEVEQgZmlsZSBCdWlsZGluZy5kdGQgdG8gYSBuZXcgbG9jYXRpb24uIElmIHlvdSBoYXZlIGEgZGlyZWN0aW9uCi1hc3NvY2lhdGlvbiBiZXR3ZWVuIEJ1aWxkaW5nLmR0ZCBhbmQgYWxsIHRoZSBYTUwgZmlsZXMsIHlvdSB3aWxsIGhhdmUgdG8gdXBkYXRlCi10aGUgJmx0O0RPQ1RUWVBFJmd0OyBkZWNsYXJhdGlvbiBpbiBlYWNoIFhNTCBmaWxlIHRvIHJlZmxlY3QgdGhlIG5ldyBsb2NhdGlvbgotb2YgQnVpbGRpbmcuZHRkLiBJZiwgaG93ZXZlciwgeW91IGhhdmUgYW4gWE1MIENhdGFsb2cgYXNzb2NpYXRpb24sIGFuZCBhbGwKLXRoZSBYTUwgZmlsZXMganVzdCByZWZlciB0byB0aGUgS2V5IG9mIEJ1aWxkaW5nLmR0ZCwgdGhlbiB5b3Ugb25seSBoYXZlIHRvCi11cGRhdGUgdGhlIFVSSSBhbmQgYWxsIHRoZSBYTUwgZmlsZXMgd2lsbCBwb2ludCB0byB0aGUgbmV3IGxvY2F0aW9uIG9mIEJ1aWxkaW5nLmR0ZC48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlVwZGF0aW5nIGFuIGVudHJ5IGluIHRoZSBYTUwgQ2F0YWxvZzwvaDQ+PHA+QWZ0ZXIgeW91IGhhdmUKLXVwZGF0ZWQgYW4gZW50cnkgaW4gdGhlIFhNTCBDYXRhbG9nLCB5b3UgbWlnaHQgbmVlZCB0byByZWZyZXNoIHRoZSBYTUwgZWRpdG9yCi12aWV3IHNvIHRoYXQgaXQgdXNlcyB0aGUgbmV3IGluZm9ybWF0aW9uLiBUbyBkbyB0aGlzLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVsb2FkCi1EZXBlbmRlbmNpZXM8L3NwYW4+IHRvb2xiYXIgYnV0dG9uIDxpbWcgc3JjPSIuLi9pbWFnZXMvcmxkZ3Jtci5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvb2xiYXIgYnV0dG9uIiAvPiBhbmQKLXRoZSB2aWV3IHdpbGwgYmUgdXBkYXRlZCB1c2luZyB0aGUgY3VycmVudCBYTUwgQ2F0YWxvZyBzZXR0aW5ncy4gWW91IG9ubHkKLW5lZWQgdG8gcmVmcmVzaCB0aGUgWE1MIGVkaXRvciB2aWV3IHdoZW4geW91IGhhdmUgYW4gWE1MIGZpbGUgb3BlbiB0aGF0IHJlZmVyZW5jZXMKLXRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0aGF0IHdhcyB1cGRhdGVkLjwvcD4KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlcgotdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIHRpdGxlPSJJbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YgY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdSBlZGl0LCBidXQgc3RpbGwgbWFpbnRhaW4gdGhlIHZhbGlkaXR5IG9mIHRoZSBkb2N1bWVudCBwZXJpb2RpY2FsbHkuIj5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIHRpdGxlPSJUaGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiBhbiBYTUwgZmlsZSBpcyB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbiB0byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiI+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgdGl0bGU9IlhNTCBDYXRhbG9nIGVudHJpZXMgYXJlIHVzZWQgdG8gbWFwIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2VzIHRvIGxvY2FsbHkgZGVmaW5lZCByZXNvdXJjZXMuIFlvdSBjYW4gcHJvdmlkZSBydWxlcyBzcGVjaWZ5IGhvdyB0aGVzZSBlbnRpdGllcyBhcmUgcmVzb2x2ZWQiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIHRpdGxlPSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiB0aXRsZT0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHByb2MuaHRtbCIgdGl0bGU9IklmIHlvdSBoYXZlIGluc3RydWN0aW9ucyB5b3Ugd2FudCB0byBzZW5kIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGFuIFhNTCBkb2N1bWVudCwgeW91IGNhbiB1c2UgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiI+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgd2l0aCBOb2RlIGFuZCBDb250ZW50IGNvbHVtbnMgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGVuYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sZW5jLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1Zjc0ZDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sZW5jLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjeG1sZW5jIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5YTUwgYW5kIEhUTUwgZW5jb2RpbmdzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5YTUwgYW5kIEhUTUwgZW5jb2RpbmdzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkVuY29kaW5ncyBlbmFibGUgeW91IHRvIHNwZWNpZnkgd2hhdCBjaGFyYWN0ZXIgZW5jb2RpbmcgeW91ciB0ZXh0DQotaXMgaW4uPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJjeG1sZW5jfDF8Y2hhcmFjdGVyZW5jb2Rpbmd0ZXh0aW5maWxlcyIgc3RhdHVzPSJjaGFuZ2VkIj5jaGFyYWN0ZXINCi1lbmNvZGluZzxpbmRleHRlcm0+c3VwcG9ydGVkIGNoYXJhY3RlciBzZXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPlRoZSBJQU5BIG5hbWUgaXMgdXNlZCBpbiB0aGUgZW5jb2Rpbmcgc3RhdGVtZW50IG9mIGFuIFhNTCBmaWxlLCBvciBjaGFyc2V0DQotZGlyZWN0aXZlIGluIGFuIEhUTUwgZmlsZS48L3A+DQotPHA+VGhlIEhUTUwgYW5kIFhNTCBlZGl0b3JzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBlbmNvZGluZ3M6PC9wPg0KLTx0YWJsZSByb3doZWFkZXI9ImZpcnN0Y29sIj4NCi08dGdyb3VwIGNvbHM9IjIiPjxjb2xzcGVjIGNvbG5hbWU9IkNPTFNQRUMwIi8+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzEiLz4NCi08dGhlYWQ+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiIHZhbGlnbj0idG9wIj4gPHA+PGI+WE1MIEVuY29kaW5nIChJQU5BIE5hbWUpPC9iPjwvcD4gPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzEiIHZhbGlnbj0idG9wIj4gPHA+PGI+RGVzY3JpcHRpb248L2I+PC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGhlYWQ+DQotPHRib2R5Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5CSUc1PC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+QmlnNSwgVHJhZGl0aW9uYWwgQ2hpbmVzZTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+RVVDLUpQPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+RVVDIGVuY29kaW5nLCBKYXBhbmVzZTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+RVVDLUtSPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+RVVDIGVuY29kaW5nLCBLb3JlYW48L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+R0IxODAzMDwvZW50cnk+DQotPGVudHJ5Pk5hdGlvbmFsIFN0YW5kYXJkLCBDaGluZXNlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+SVNPLTIwMjItSlA8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5JU08gMjAyMiwgSmFwYW5lc2U8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPklTTy0yMDIyLUtSPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+SVNPIDIwMjIsIEtvcmVhbjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+SVNPLTg4NTktMTwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPklTTyBMYXRpbi0xPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PklTTy04ODU5LTI8L2VudHJ5Pg0KLTxlbnRyeT5DZW50cmFsL0Vhc3QgRXVyb3BlYW4gKFNsYXZpYyk8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PklTTy04ODU5LTM8L2VudHJ5Pg0KLTxlbnRyeT5Tb3V0aGVybiBFdXJvcGVhbjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+SVNPLTg4NTktNDwvZW50cnk+DQotPGVudHJ5PklTTyA4ODU5LTQsIEN5cmlsbGljPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5JU08tODg1OS01PC9lbnRyeT4NCi08ZW50cnk+SVNPIDg4NTktNSwgQ3lyaWxsaWM8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5JU08tODg1OS02PC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+QXJhYmljIChMb2dpY2FsKTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5JU08tODg1OS03PC9lbnRyeT4NCi08ZW50cnk+R3JlZWs8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5JU08tODg1OS04PC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+SGVicmV3IChWaXN1YWwpIChlbmNvZGluZyBzdXBwb3J0ZWQsIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBQYWdlDQotRGVzaWduZXIgRGVzaWduIHBhZ2UpPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PklTTy04ODU5LTk8L2VudHJ5Pg0KLTxlbnRyeT5UdXJraXNoPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+U0hJRlRfSklTPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+U2hpZnQtSklTLCBKYXBhbmVzZTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5USVMtNjIwPC9lbnRyeT4NCi08ZW50cnk+VElTSSwgVGhhaTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPlVTLUFTQ0lJPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+VVMgQVNDSUk8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPlVURi04PC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+SVNPIDEwNjQ2L1VuaWNvZGUsIG9uZS1ieXRlIGVuY29kaW5nPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5VVEYtMTY8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5JU08gMTA2NDYvVW5pY29kZSwgdHdvLWJ5dGUgZW5jb2Rpbmc8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPlVURi0xNkJFPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+VW5pY29kZSBCaWdFbmRpYW48L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPlVURi0xNkxFPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+VW5pY29kZSBMaXR0bGVFbmRpYW48L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPjxwPldJTkRPV1MtMzFKPC9wPjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMxIj48cD5KYXBhbmVzZSwgV2luZG93cy0zMUo8L3A+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+V0lORE9XUy0xMjU1PC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+SGVicmV3PC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5XSU5ET1dTLTEyNTY8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5BcmFiaWM8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sZW5jLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxlbmMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3MjNiMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxlbmMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJYTUwgYW5kIEhUTUwgZW5jb2RpbmdzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkVuY29kaW5ncyBlbmFibGUgeW91IHRvIHNwZWNpZnkgd2hhdCBjaGFyYWN0ZXIgZW5jb2RpbmcgeW91ciB0ZXh0IGlzIGluLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJFbmNvZGluZ3MgZW5hYmxlIHlvdSB0byBzcGVjaWZ5IHdoYXQgY2hhcmFjdGVyIGVuY29kaW5nIHlvdXIgdGV4dCBpcyBpbi4iIC8+Ci08bWV0YSBjb250ZW50PSJjaGFyYWN0ZXIgZW5jb2RpbmcsIHN1cHBvcnRlZCBjaGFyYWN0ZXIgc2V0cyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNoYXJhY3RlciBlbmNvZGluZywgc3VwcG9ydGVkIGNoYXJhY3RlciBzZXRzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjeG1sZW5jIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+WE1MIGFuZCBIVE1MIGVuY29kaW5nczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3htbGVuYyI+PGEgbmFtZT0iY3htbGVuYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+WE1MIGFuZCBIVE1MIGVuY29kaW5nczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+RW5jb2RpbmdzIGVuYWJsZSB5b3UgdG8gc3BlY2lmeSB3aGF0IGNoYXJhY3RlciBlbmNvZGluZyB5b3VyIHRleHQKLWlzIGluLjwvcD4KLQotPHA+VGhlIElBTkEgbmFtZSBpcyB1c2VkIGluIHRoZSBlbmNvZGluZyBzdGF0ZW1lbnQgb2YgYW4gWE1MIGZpbGUsIG9yIGNoYXJzZXQKLWRpcmVjdGl2ZSBpbiBhbiBIVE1MIGZpbGUuPC9wPgotCi08cD5UaGUgSFRNTCBhbmQgWE1MIGVkaXRvcnMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGVuY29kaW5nczo8L3A+Ci0KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPgotPHRoZWFkIGFsaWduPSJsZWZ0Ij4KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMDcyIj4gPHA+PHN0cm9uZz5YTUwgRW5jb2RpbmcgKElBTkEgTmFtZSk8L3N0cm9uZz48L3A+Ci0gPC90aD4KLQotPHRoIHZhbGlnbj0idG9wIiBpZD0iTjEwMDg0Ij4gPHA+PHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvcD4KLSA8L3RoPgotCi08L3RyPgotCi08L3RoZWFkPgotCi08dGJvZHk+Ci08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDBBMiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPkJJRzU8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwQTIgTjEwMDg0ICI+IDxwPkJpZzUsIFRyYWRpdGlvbmFsIENoaW5lc2U8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAwQzIiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5FVUMtSlA8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwQzIgTjEwMDg0ICI+IDxwPkVVQyBlbmNvZGluZywgSmFwYW5lc2U8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAwRTIiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5FVUMtS1I8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRTIgTjEwMDg0ICI+IDxwPkVVQyBlbmNvZGluZywgS29yZWFuPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMTAyIiBoZWFkZXJzPSJOMTAwNzIgIj5HQjE4MDMwPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxMDIgTjEwMDg0ICI+TmF0aW9uYWwgU3RhbmRhcmQsIENoaW5lc2U8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDExNiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPklTTy0yMDIyLUpQPC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTE2IE4xMDA4NCAiPiA8cD5JU08gMjAyMiwgSmFwYW5lc2U8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxMzYiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5JU08tMjAyMi1LUjwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDEzNiBOMTAwODQgIj4gPHA+SVNPIDIwMjIsIEtvcmVhbjwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDE1NiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPklTTy04ODU5LTE8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxNTYgTjEwMDg0ICI+IDxwPklTTyBMYXRpbi0xPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMTc2IiBoZWFkZXJzPSJOMTAwNzIgIj5JU08tODg1OS0yPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxNzYgTjEwMDg0ICI+Q2VudHJhbC9FYXN0IEV1cm9wZWFuIChTbGF2aWMpPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxOEEiIGhlYWRlcnM9Ik4xMDA3MiAiPklTTy04ODU5LTM8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE4QSBOMTAwODQgIj5Tb3V0aGVybiBFdXJvcGVhbjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMTlFIiBoZWFkZXJzPSJOMTAwNzIgIj5JU08tODg1OS00PC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOUUgTjEwMDg0ICI+SVNPIDg4NTktNCwgQ3lyaWxsaWM8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDFCMiIgaGVhZGVycz0iTjEwMDcyICI+SVNPLTg4NTktNTwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMUIyIE4xMDA4NCAiPklTTyA4ODU5LTUsIEN5cmlsbGljPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxQzYiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5JU08tODg1OS02PC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMUM2IE4xMDA4NCAiPiA8cD5BcmFiaWMgKExvZ2ljYWwpPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMUU2IiBoZWFkZXJzPSJOMTAwNzIgIj5JU08tODg1OS03PC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxRTYgTjEwMDg0ICI+R3JlZWs8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDFGQSIgaGVhZGVycz0iTjEwMDcyICI+IDxwPklTTy04ODU5LTg8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxRkEgTjEwMDg0ICI+IDxwPkhlYnJldyAoVmlzdWFsKSAoZW5jb2Rpbmcgc3VwcG9ydGVkLCBidXQgbm90IHN1cHBvcnRlZCBieSB0aGUgUGFnZQotRGVzaWduZXIgRGVzaWduIHBhZ2UpPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMjFBIiBoZWFkZXJzPSJOMTAwNzIgIj5JU08tODg1OS05PC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyMUEgTjEwMDg0ICI+VHVya2lzaDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMjJFIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+U0hJRlRfSklTPC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjJFIE4xMDA4NCAiPiA8cD5TaGlmdC1KSVMsIEphcGFuZXNlPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMjRFIiBoZWFkZXJzPSJOMTAwNzIgIj5USVMtNjIwPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyNEUgTjEwMDg0ICI+VElTSSwgVGhhaTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMjYyIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+VVMtQVNDSUk8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyNjIgTjEwMDg0ICI+IDxwPlVTIEFTQ0lJPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMjgyIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+VVRGLTg8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyODIgTjEwMDg0ICI+IDxwPklTTyAxMDY0Ni9Vbmljb2RlLCBvbmUtYnl0ZSBlbmNvZGluZzwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDJBMiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPlVURi0xNjwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDJBMiBOMTAwODQgIj4gPHA+SVNPIDEwNjQ2L1VuaWNvZGUsIHR3by1ieXRlIGVuY29kaW5nPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMkMyIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+VVRGLTE2QkU8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyQzIgTjEwMDg0ICI+IDxwPlVuaWNvZGUgQmlnRW5kaWFuPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMkUyIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+VVRGLTE2TEU8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyRTIgTjEwMDg0ICI+IDxwPlVuaWNvZGUgTGl0dGxlRW5kaWFuPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMzAyIiBoZWFkZXJzPSJOMTAwNzIgIj48cD5XSU5ET1dTLTMxSjwvcD4KLTwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMzAyIE4xMDA4NCAiPjxwPkphcGFuZXNlLCBXaW5kb3dzLTMxSjwvcD4KLTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMzFFIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+V0lORE9XUy0xMjU1PC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMzFFIE4xMDA4NCAiPiA8cD5IZWJyZXc8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAzM0UiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5XSU5ET1dTLTEyNTY8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAzM0UgTjEwMDg0ICI+IDxwPkFyYWJpYzwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08L3Rib2R5PgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2IC8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWx0b29sLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWx0b29sLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZmM1YjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sdG9vbC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIiAgImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3htbHRvb2wiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlhNTCB0b29scyAtIG92ZXJ2aWV3PC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5YTUwgdG9vbHMgLSBvdmVydmlldzwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIHByb2R1Y3QgcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIHZpc3VhbCBYTUwgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuDQotVGhlIHRvb2wgc2V0IGluY2x1ZGVzIGNvbXBvbmVudHMgZm9yIGJ1aWxkaW5nIERURHMsIFhNTCBzY2hlbWFzLCBhbmQgWE1MIGZpbGVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCB0b29sczxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VGhlIGZvbGxvd2luZyBYTUwgdG9vbHMgYXJlIGF2YWlsYWJsZS4gPC9wPg0KLTxwPlRoZSA8Yj5YTUwgZWRpdG9yPC9iPiBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4gWW91DQotY2FuIHVzZSBpdCB0byBjcmVhdGUgbmV3IFhNTCBmaWxlcywgZWl0aGVyIGZyb20gc2NyYXRjaCwgZXhpc3RpbmcgRFREcywgb3INCi1leGlzdGluZyBYTUwgc2NoZW1hcy4gWW91IGNhbiBhbHNvIHVzZSBpdCB0byBlZGl0IFhNTCBmaWxlcywgYXNzb2NpYXRlIHRoZW0NCi13aXRoIERURHMgb3Igc2NoZW1hcywgYW5kIHZhbGlkYXRlIHRoZW0uIDwvcD4NCi08cD4gVGhlIDxiPkRURCBlZGl0b3I8L2I+IGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgRFREcy4gICA8L3A+DQotPHA+VGhlIDxiPlhNTCBzY2hlbWEgZWRpdG9yPC9iPiBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLCBhbmQgdmFsaWRhdGluZw0KLVhNTCBzY2hlbWFzLiBZb3UgY2FuIHVzZSB0aGUgWE1MIHNjaGVtYSBlZGl0b3IgdG8gcGVyZm9ybSB0YXNrcyBzdWNoIGFzIGNyZWF0aW5nDQotWE1MIHNjaGVtYSBjb21wb25lbnRzIGFuZCBpbXBvcnRpbmcgYW5kIHZpZXdpbmcgWE1MIHNjaGVtYXMuIDwvcD4NCi08cD48Yj5Ob3Rlczo8L2I+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+PC9zZWN0aW9uPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JleHRjdG4uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmV4dGN0bi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjljNGUyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmV4dGN0bi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InJlZmVyZW5jZSIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIFhNTCBkb2N1bWVudHMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2VzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSBYTUwgc2NoZW1hIGFueSBlbGVtZW50IHRvIGV4dGVuZCB0aGUgY29udGVudCBtb2RlbCBvZiBhbiBYTUwgZG9jdW1lbnQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSBYTUwgc2NoZW1hIGFueSBlbGVtZW50IHRvIGV4dGVuZCB0aGUgY29udGVudCBtb2RlbCBvZiBhbiBYTUwgZG9jdW1lbnQuIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJleHRjdG4iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIFhNTCBkb2N1bWVudHMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyZXh0Y3RuIj48YSBuYW1lPSJyZXh0Y3RuIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIFhNTCBkb2N1bWVudHMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2VzPC9oMT4KLQotCi0KLTxkaXY+PHA+WW91IGNhbiB1c2UgdGhlIFhNTCBzY2hlbWEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50IHRvIGV4dGVuZAotdGhlIGNvbnRlbnQgbW9kZWwgb2YgYW4gWE1MIGRvY3VtZW50LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+Rm9yIGV4YW1wbGUsIHlvdSBoYXZlIGFuIFhNTCBzY2hlbWEgZmlsZSBjYWxsZWQgQm9vay54c2QgdGhhdAotY29udGFpbnMgYSBjb21wbGV4IHR5cGUgY2FsbGVkIEJvb2tUeXBlLiBCb29rVHlwZSBjb250YWlucyA0IGVsZW1lbnRzICh0aXRsZSwKLWF1dGhvciwgeWVhciwgYW5kIElTQk4pIGFuZCBvbmUgIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudC4gVGhlIG5hbWVzcGFjZQotZm9yIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+ICBlbGVtZW50IGlzICA8c2FtcCBjbGFzcz0iY29kZXBoIj4jI2FueTwvc2FtcD4uIFRoaXMgbWVhbnMKLXRoYXQgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQsIHlvdSBjYW4gaW5zZXJ0IGFueSBYTUwgZWxlbWVudCB0byBleHRlbmQgdGhlCi1kZWZpbml0aW9uIG9mIHRoZSBCb29rVHlwZS48L3A+Ci08cD5Zb3UgY2FuIGFsc28gcHJvdmlkZSBhIG1vcmUgc3BlY2lmaWMgbmFtZXNwYWNlLgotRm9yIGV4YW1wbGUsIHlvdSBoYXZlIGFub3RoZXIgc2NoZW1hIGNhbGxlZCBNeV9Cb29rLnhzZCwgd2hpY2ggY29udGFpbnMgYQotY29tcGxleCB0eXBlIGNhbGxlZCBNeV9Cb29rVHlwZS4gTXlfQm9va1R5cGUgY29udGFpbnMgNCBlbGVtZW50cyAodGl0bGUsIGF1dGhvciwKLXllYXIsIGFuZCBJU0JOKSBhbmQgb25lICA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQsIGJ1dCBpbiB0aGlzIGNhc2UgdGhlCi1uYW1lc3BhY2UgZm9yIHRoZSAgQm9va1R5cGUgZWxlbWVudCBpcyB3d3cud2VzbGV5LmNvbS4gVGhpcyBtZWFucyB0aGF0IGluCi1hbiBpbnN0YW5jZSBkb2N1bWVudCwgeW91IGNhbiBpbnNlcnQgYW55IFhNTCBlbGVtZW50IHRvIGV4dGVuZCB0aGUgZGVmaW5pdGlvbgotb2YgdGhlIEJvb2tUeXBlLCBwcm92aWRlZCB0aGF0IHRoZXkgYmVsb25nIHRvIHRoZSBuYW1lc3BhY2UgaHR0cDovL3d3dy53ZXNsZXkuY29tLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdiAvPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWE1MLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZWU0YjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlICBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIiAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0icmxpbWl0YXRpb25zX3NsdXNoWE1MIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5MaW1pdGF0aW9ucyBvZiBYTUwgRWRpdG9yPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5MaW1pdGF0aW9ucyBvZiBYTUwgRWRpdG9yPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgc2VjdGlvbiBkZXNjcmliZXMga25vd24gcHJvZHVjdCBhc3BlY3QgbGltaXRhdGlvbnMgYW5kIHdvcmthcm91bmRzLjwvc2hvcnRkZXNjPg0KLTxyZWZib2R5Pg0KLTwhLS1Vc2UgdGhpcyB0ZW1wbGF0ZSB0byBzaW5nbGUgc291cmNlIHRoZSByZWFkbWUgaW5mb3JtYXRpb24uICBUaGUgY29udGVudCBmb3IgdGhlIHJlYWRtZSBpbmZvcm1hdGlvbiBpcyBtYWludGFpbmVkIGluIHRoaXMgdG9waWMgYW5kIGlzIGluc2VydGVkIGludG8gdGhlIHJlbGF0ZWQgdG9waWMgdXNpbmcgdGhlIGNvbnJlZiBhdHRyaWJ1dGUuIFRoaXMgZmlsZSB3aWxsIG5vdCBiZSBzdXJmYWNlZCBpbiB5b3VyIG5hdmlnYXRpb24uLS0+DQotPHNlY3Rpb24gaWQ9InVucmVzb2x2X1VSSSI+PCEtLU5vIGRlZmVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcy4gSXQgaXMgZnJvbSB0aGUgNS4xLiByZWFkbWUuLS0+PHA+VGhlDQotYmVoYXZpb3Igb2YgdGhlIFhNTCBwYXJzZXIgd2hlbiBlbmNvdW50ZXJpbmcgYW4gdW5yZXNvbHZhYmxlIFVSSSAoZm9yIGV4YW1wbGUsDQotaW4gYSBET0NUWVBFIGRlY2xhcmF0aW9uKSBpcyB0byByZXBvcnQgYSBmYXRhbCBJTyBlcnJvciBhbmQgc3RvcCBhbnkgZnVydGhlcg0KLXByb2Nlc3NpbmcuIEFuIHVucmVzb2x2ZWQgVVJJIGlzIHNlZW4gbmVpdGhlciBhcyBhIHN5bnRhY3RpYyBub3IgYSBzZW1hbnRpYw0KLWVycm9yIGFuZCBhcyBzdWNoLCB0aGUgcGFyc2VyIGRvZXMgbm90IGF0dGVtcHQgdG8gaGFuZGxlIGl0LiBFc3NlbnRpYWxseSwNCi10aGUgZG9jdW1lbnQgcmVtYWlucyB1bmNoZWNrZWQuIFRoaXMgaXMgYSBrbm93biBwcm9ibGVtLjwvcD48L3NlY3Rpb24+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWE1MLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhNTC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmExMmMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWE1MLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkxpbWl0YXRpb25zIG9mIFhNTCBFZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgc2VjdGlvbiBkZXNjcmliZXMga25vd24gcHJvZHVjdCBhc3BlY3QgbGltaXRhdGlvbnMgYW5kIHdvcmthcm91bmRzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJybGltaXRhdGlvbnNfc2x1c2hYTUwiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5MaW1pdGF0aW9ucyBvZiBYTUwgRWRpdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJybGltaXRhdGlvbnNfc2x1c2hYTUwiPjxhIG5hbWU9InJsaW1pdGF0aW9uc19zbHVzaFhNTCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TGltaXRhdGlvbnMgb2YgWE1MIEVkaXRvcjwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoaXMgc2VjdGlvbiBkZXNjcmliZXMga25vd24gcHJvZHVjdCBhc3BlY3QgbGltaXRhdGlvbnMgYW5kIHdvcmthcm91bmRzLjwvcD4KLQotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0icmxpbWl0YXRpb25zX3NsdXNoWE1MX191bnJlc29sdl9VUkkiPjxhIG5hbWU9InJsaW1pdGF0aW9uc19zbHVzaFhNTF9fdW5yZXNvbHZfVVJJIj48IS0tIC0tPjwvYT48cD5UaGUKLWJlaGF2aW9yIG9mIHRoZSBYTUwgcGFyc2VyIHdoZW4gZW5jb3VudGVyaW5nIGFuIHVucmVzb2x2YWJsZSBVUkkgKGZvciBleGFtcGxlLAotaW4gYSBET0NUWVBFIGRlY2xhcmF0aW9uKSBpcyB0byByZXBvcnQgYSBmYXRhbCBJTyBlcnJvciBhbmQgc3RvcCBhbnkgZnVydGhlcgotcHJvY2Vzc2luZy4gQW4gdW5yZXNvbHZlZCBVUkkgaXMgc2VlbiBuZWl0aGVyIGFzIGEgc3ludGFjdGljIG5vciBhIHNlbWFudGljCi1lcnJvciBhbmQgYXMgc3VjaCwgdGhlIHBhcnNlciBkb2VzIG5vdCBhdHRlbXB0IHRvIGhhbmRsZSBpdC4gRXNzZW50aWFsbHksCi10aGUgZG9jdW1lbnQgcmVtYWlucyB1bmNoZWNrZWQuIFRoaXMgaXMgYSBrbm93biBwcm9ibGVtLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdiAvPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sYmljb25zLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5OGIwNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlICBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIiAicmVmZXJlbmNlLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08cmVmZXJlbmNlIGlkPSJyaWNvbnMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3I8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3I8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhlIGZvbGxvd2luZyBYTUwgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSBhbmQgRGVzaWduDQotdmlldy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5pY29uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08cmVmYm9keT4NCi08dGFibGU+DQotPHRncm91cCBjb2xzPSIyIj48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMCIvPjxjb2xzcGVjIGNvbG5hbWU9IkNPTFNQRUMxIi8+DQotPHRib2R5Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIiB2YWxpZ249ImJvdHRvbSI+PGI+SWNvbjwvYj48L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSIgdmFsaWduPSJib3R0b20iPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvbmF0dHJpYi5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBhdHRyaWJ1dGUNCi1pY29uPC9hbHQ+PC9pbWFnZT4gPC9lbnRyeT4NCi08ZW50cnk+YXR0cmlidXRlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9jZGF0YXNlY3Rpb24uZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1jaGFyYWN0ZXIgZGF0YSBpY29uPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5jaGFyYWN0ZXIgZGF0YSAoQ0RBVEEpIHNlY3Rpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2NvbW1lbnRfb2JqLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGNvbW1lbnQNCi1pY29uPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5jb21tZW50PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9kb2N0eXBlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIERPQ1RZUEUNCi1pY29uPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5ET0NUWVBFIGRlY2xhcmF0aW9uPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9uZWxlbS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBlbGVtZW50DQotaWNvbjwvYWx0PjwvaW1hZ2U+IDwvZW50cnk+DQotPGVudHJ5PmVsZW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL3Byb2luc3Rfb2JqLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIHByb2Nlc3NpbmcNCi1pbnN0cnVjdGlvbnMgaWNvbjwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+cHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGJvZHk+DQotPC90Z3JvdXA+DQotPC90YWJsZT4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQotPD9QdWIgKjAwMDAwMDE4MjQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGJpY29ucy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sYmljb25zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOTljNjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sYmljb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIGZvbGxvd2luZyBYTUwgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSBhbmQgRGVzaWduIHZpZXcuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBmb2xsb3dpbmcgWE1MIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUgYW5kIERlc2lnbiB2aWV3LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIGljb25zIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgaWNvbnMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJyaWNvbnMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyaWNvbnMiPjxhIG5hbWU9InJpY29ucyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvcjwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlIGZvbGxvd2luZyBYTUwgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSBhbmQgRGVzaWduCi12aWV3LjwvcD4KLQotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgdmFsaWduPSJib3R0b20iPjxzdHJvbmc+SWNvbjwvc3Ryb25nPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249ImJvdHRvbSI+PHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvbmF0dHJpYi5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBhdHRyaWJ1dGUmIzEwO2ljb24iIC8+IDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+YXR0cmlidXRlPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9jZGF0YXNlY3Rpb24uZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUmIzEwO2NoYXJhY3RlciBkYXRhIGljb24iIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5jaGFyYWN0ZXIgZGF0YSAoQ0RBVEEpIHNlY3Rpb248L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL2NvbW1lbnRfb2JqLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGNvbW1lbnQmIzEwO2ljb24iIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5jb21tZW50PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9kb2N0eXBlLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIERPQ1RZUEUmIzEwO2ljb24iIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5ET0NUWVBFIGRlY2xhcmF0aW9uPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9uZWxlbS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBlbGVtZW50JiMxMDtpY29uIiAvPiA8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmVsZW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL3Byb2luc3Rfb2JqLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIHByb2Nlc3NpbmcmIzEwO2luc3RydWN0aW9ucyBpY29uIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+cHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L3RkPgotCi08L3RyPgotCi08L3Rib2R5PgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSB3aXRoIE5vZGUgYW5kIENvbnRlbnQgY29sdW1ucyBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxjYXRrZXkuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGNhdGtleS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTUyYzhkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGNhdGtleS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiINCi0gInJlZmVyZW5jZS5kdGQiPg0KLTxyZWZlcmVuY2UgaWQ9InhtbGNhdGFsb2drZXlib2FyZHNob3J0Y3V0cyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5YTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHM8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+QWNjZWxlcmF0b3Iga2V5cyBjYW4gYmUgdXNlZCBpbiB0aGUNCi1jYXRhbG9nIHRyZWUgc3RydWN0dXJlIGFuZCBjYXRhbG9nIGVudHJ5IHdpemFyZCBieSBmaXJzdCBwcmVzc2luZyBhbmQgaG9sZGluZw0KLXRoZSBBbHQga2V5Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmFjY2Vzc2liaWxpdHk8aW5kZXh0ZXJtPmtleWJvYXJkIHNob3J0Y3V0czxpbmRleHRlcm0+WE1MDQotY2F0YWxvZyB3aXphcmQ8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPmtleWJvYXJkIHNob3J0Y3V0czxpbmRleHRlcm0+WE1MDQotY2F0YWxvZyB3aXphcmQ8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPnNob3J0Y3V0czxpbmRleHRlcm0+a2V5Ym9hcmQ8aW5kZXh0ZXJtPlhNTA0KLWNhdGFsb2cgd2l6YXJkPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgY2F0YWxvZyB3aXphcmQ8aW5kZXh0ZXJtPmFjY2Vzc2liaWxpdHk8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBjYXRhbG9nIHdpemFyZDxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTx0YWJsZSBmcmFtZT0iYWxsIj4NCi08dGdyb3VwIGNvbHM9IjIiPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDEiIGNvbHdpZHRoPSI4NCoiLz48Y29sc3BlYyBjb2xuYW1lPSJjb2wzIg0KLWNvbHdpZHRoPSI5MyoiLz4NCi08dGhlYWQ+DQotPHJvdyB2YWxpZ249ImJvdHRvbSI+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPktleSBDb21iaW5hdGlvbjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDMiPkZ1bmN0aW9uPC9lbnRyeT4NCi08L3Jvdz4NCi08L3RoZWFkPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5BbHQrQTwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDMiPkFkZCBjYXRhbG9nIGVudHJ5PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5BbHQrRTwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDMiPkVkaXQgc2VsZWN0ZWQgY2F0YWxvZyBlbnRyeTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+QWx0K1I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wzIj5SZW1vdmUgc2VsZWN0ZWQgY2F0YWxvZyBlbnRyeTwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxjYXRrZXkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGNhdGtleS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWJjMTQ1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGNhdGtleS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InJlZmVyZW5jZSIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJYTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQWNjZWxlcmF0b3Iga2V5cyBjYW4gYmUgdXNlZCBpbiB0aGUgY2F0YWxvZyB0cmVlIHN0cnVjdHVyZSBhbmQgY2F0YWxvZyBlbnRyeSB3aXphcmQgYnkgZmlyc3QgcHJlc3NpbmcgYW5kIGhvbGRpbmcgdGhlIEFsdCBrZXkuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFjY2VsZXJhdG9yIGtleXMgY2FuIGJlIHVzZWQgaW4gdGhlIGNhdGFsb2cgdHJlZSBzdHJ1Y3R1cmUgYW5kIGNhdGFsb2cgZW50cnkgd2l6YXJkIGJ5IGZpcnN0IHByZXNzaW5nIGFuZCBob2xkaW5nIHRoZSBBbHQga2V5LiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImFjY2Vzc2liaWxpdHksIGtleWJvYXJkIHNob3J0Y3V0cywgWE1MIGNhdGFsb2cgd2l6YXJkLCBzaG9ydGN1dHMsIGtleWJvYXJkLCBYTUwgY2F0YWxvZyB3aXphcmQiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJhY2Nlc3NpYmlsaXR5LCBrZXlib2FyZCBzaG9ydGN1dHMsIFhNTCBjYXRhbG9nIHdpemFyZCwgc2hvcnRjdXRzLCBrZXlib2FyZCwgWE1MIGNhdGFsb2cgd2l6YXJkIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ4bWxjYXRhbG9na2V5Ym9hcmRzaG9ydGN1dHMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5YTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InhtbGNhdGFsb2drZXlib2FyZHNob3J0Y3V0cyI+PGEgbmFtZT0ieG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9ImlkX3RpdGxlIj5YTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHM8L2gxPgotCi0KLQotPGRpdj48cCBjbGFzcz0iaWRfc2hvcnRkZXNjIj5BY2NlbGVyYXRvciBrZXlzIGNhbiBiZSB1c2VkIGluIHRoZQotY2F0YWxvZyB0cmVlIHN0cnVjdHVyZSBhbmQgY2F0YWxvZyBlbnRyeSB3aXphcmQgYnkgZmlyc3QgcHJlc3NpbmcgYW5kIGhvbGRpbmcKLXRoZSBBbHQga2V5LjwvcD4KLQotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+Ci08dGhlYWQgYWxpZ249ImxlZnQiPgotPHRyIHZhbGlnbj0iYm90dG9tIj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgd2lkdGg9IjQ3LjQ1NzYyNzExODY0NDA3JSIgaWQ9Ik4xMDA5MSI+S2V5IENvbWJpbmF0aW9uPC90aD4KLQotPHRoIHZhbGlnbj0iYm90dG9tIiB3aWR0aD0iNTIuNTQyMzcyODgxMzU1OTQlIiBpZD0iTjEwMDk4Ij5GdW5jdGlvbjwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ3LjQ1NzYyNzExODY0NDA3JSIgaGVhZGVycz0iTjEwMDkxICI+QWx0K0E8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Mi41NDIzNzI4ODEzNTU5NCUiIGhlYWRlcnM9Ik4xMDA5OCAiPkFkZCBjYXRhbG9nIGVudHJ5PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDcuNDU3NjI3MTE4NjQ0MDclIiBoZWFkZXJzPSJOMTAwOTEgIj5BbHQrRTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUyLjU0MjM3Mjg4MTM1NTk0JSIgaGVhZGVycz0iTjEwMDk4ICI+RWRpdCBzZWxlY3RlZCBjYXRhbG9nIGVudHJ5PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDcuNDU3NjI3MTE4NjQ0MDclIiBoZWFkZXJzPSJOMTAwOTEgIj5BbHQrUjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUyLjU0MjM3Mjg4MTM1NTk0JSIgaGVhZGVycz0iTjEwMDk4ICI+UmVtb3ZlIHNlbGVjdGVkIGNhdGFsb2cgZW50cnk8L3RkPgotCi08L3RyPgotCi08L3Rib2R5PgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWx0b29sc2tleS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sdG9vbHNrZXkuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBlZGMzZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWx0b29sc2tleS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iDQotICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJ4bWx0b29sc2tleWJvYXJkc2hvcnRjdXRzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Tb3VyY2UgZWRpdG9yIGFuZCBYTUwgdG9vbHMga2V5Ym9hcmQgc2hvcnRjdXRzPC90aXRsZT4NCi08c2hvcnRkZXNjPlRoZSBmb2xsb3dpbmcga2V5Ym9hcmQgc2hvcnRjdXRzIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBYTUwsIFhTRCwNCi1XU0RMLCBIVE1MLCBKU1AsIENTUyBhbmQgRFREIGVkaXRvcnMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+YWNjZXNzaWJpbGl0eTxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPGluZGV4dGVybT5YTUwNCi1lZGl0b3I8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPmFjY2Vzc2liaWxpdHk8aW5kZXh0ZXJtPmtleWJvYXJkDQotc2hvcnRjdXRzPGluZGV4dGVybT5zb3VyY2UgZWRpdG9yPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5rZXlib2FyZA0KLXNob3J0Y3V0czxpbmRleHRlcm0+WE1MIGVkaXRvcjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+c2hvcnRjdXRzPGluZGV4dGVybT5rZXlib2FyZDxpbmRleHRlcm0+WE1MDQotZWRpdG9yPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5hY2Nlc3NpYmlsaXR5PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5rZXlib2FyZCBzaG9ydGN1dHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhTRCBlZGl0b3I8aW5kZXh0ZXJtPmtleWJvYXJkIHNob3J0Y3V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+V1NETCBlZGl0b3I8aW5kZXh0ZXJtPmtleWJvYXJkIHNob3J0Y3V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+SFRNTCBlZGl0b3I8aW5kZXh0ZXJtPmtleWJvYXJkIHNob3J0Y3V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+SlNQIGVkaXRvcjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5DU1MgZWRpdG9yPGluZGV4dGVybT5rZXlib2FyZCBzaG9ydGN1dHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkRURCBlZGl0b3I8aW5kZXh0ZXJtPmtleWJvYXJkIHNob3J0Y3V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08cmVmYm9keT4NCi08c2VjdGlvbj48dGl0bGU+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiBhbGwgc291cmNlIGVkaXRvcnM8L3RpdGxlPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5PkNvbW1hbmQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+U2hvcnRjdXQ8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkdvIFRvIE1hdGNoaW5nIEJyYWNrZXQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+Q3RybCtTaGlmdCtQPC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PlJlc3RvcmUgTGFzdCBTZWxlY3Rpb248L3N0ZW50cnk+DQotPHN0ZW50cnk+QXRsK1NoaWZ0K0Rvd248L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+U2VsZWN0IEVuY2xvc2luZyBFbGVtZW50PC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkFsdCtTaGlmdCtVcDwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT5TZWxlY3QgTmV4dCBFbGVtZW50PC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkFsdCtTaGlmdCtSaWdodDwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT5TZWxlY3QgUHJldmlvdXMgRWxlbWVudDwvc3RlbnRyeT4NCi08c3RlbnRyeT5BbHQrU2hpZnQrTGVmdDwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTwvc2ltcGxldGFibGU+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TaG9ydGN1dHMgYXZhaWxhYmxlIGluIHRoZSBYTUwsIFhTRCwgV1NETCwgSFRNTCwgSlNQLCBhbmQNCi1DU1MgZWRpdG9ycyAoZXhjbHVkZXMgdGhlIERURCBlZGl0b3IpPC90aXRsZT48c2ltcGxldGFibGU+DQotPHN0aGVhZD4NCi08c3RlbnRyeT5Db21tYW5kPC9zdGVudHJ5Pg0KLTxzdGVudHJ5PlNob3J0Y3V0PC9zdGVudHJ5Pg0KLTwvc3RoZWFkPg0KLTxzdHJvdz4NCi08c3RlbnRyeT5Gb3JtYXQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+Q3RybCtTaGlmdCtGPC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkZvcm1hdCBBY3RpdmUgRWxlbWVudHM8L3N0ZW50cnk+DQotPHN0ZW50cnk+Q3RybCtJPC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPC9zaW1wbGV0YWJsZT48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlNob3J0Y3V0cyBhdmFpbGFibGUgaW4gdGhlIFhNTCwgWFNELCBXU0RMLCBIVE1MLCBhbmQgSlNQIGVkaXRvcnMNCi0oZXhjbHVkZXMgdGhlIERURCBhbmQgQ1NTIGVkaXRvcnMpPC90aXRsZT48c2ltcGxldGFibGU+DQotPHN0aGVhZD4NCi08c3RlbnRyeT5Db21tYW5kPC9zdGVudHJ5Pg0KLTxzdGVudHJ5PlNob3J0Y3V0PC9zdGVudHJ5Pg0KLTwvc3RoZWFkPg0KLTxzdHJvdz4NCi08c3RlbnRyeT5BZGQgQmxvY2sgQ29tbWVudDwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0Ky88L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+R28gVG8gTWF0Y2hpbmcgVGFnPC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkN0cmwrU2hpZnQrPjwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT5HbyBUbyBOZXh0IFNpYmxpbmc8L3N0ZW50cnk+DQotPHN0ZW50cnk+Q3RybCtTaGlmdCtEb3duPC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5Pk9jY3VycmVuY2VzIGluIEZpbGU8L3N0ZW50cnk+DQotPHN0ZW50cnk+Q3RybCtTaGlmdCtBPC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5Pk9wZW4gU2VsZWN0aW9uPC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkYzPC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkdvIFRvIFByZXZpb3VzIFNpYmxpbmc8L3N0ZW50cnk+DQotPHN0ZW50cnk+Q3RybCtTaGlmdCtVcDwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT5SZW1vdmUgQmxvY2sgQ29tbWVudDwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K1w8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+VG9nZ2xlIENvbW1lbnQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+Q3RybCtTaGlmdCtDPC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPC9zaW1wbGV0YWJsZT48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlNob3J0Y3V0cyBhdmFpbGFibGUgaW4gdGhlIGRlc2lnbiB2aWV3IG9mIHRoZSBYU0QgYW5kIFdTREwNCi1lZGl0b3JzPC90aXRsZT48c2ltcGxldGFibGU+DQotPHN0aGVhZD4NCi08c3RlbnRyeT5Db21tYW5kPC9zdGVudHJ5Pg0KLTxzdGVudHJ5PlNob3J0Y3V0PC9zdGVudHJ5Pg0KLTwvc3RoZWFkPg0KLTxzdHJvdz4NCi08c3RlbnRyeT5ab29tIEluPC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkN0cmwrPTwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT5ab29tIE91dDwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsKy08L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08L3NpbXBsZXRhYmxlPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgZGVzaWduIHZpZXcgb2YgdGhlIFdTREwgZWRpdG9yPC90aXRsZT48c2ltcGxldGFibGU+DQotPHN0aGVhZD4NCi08c3RlbnRyeT5Db21tYW5kPC9zdGVudHJ5Pg0KLTxzdGVudHJ5PlNob3J0Y3V0PC9zdGVudHJ5Pg0KLTwvc3RoZWFkPg0KLTxzdHJvdz4NCi08c3RlbnRyeT5FeHBvcnQgRGlhZ3JhbSBhcyBJbWFnZTwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K1g8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08L3NpbXBsZXRhYmxlPjwvc2VjdGlvbj4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sdG9vbHNrZXkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbHRvb2xza2V5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NTg2OTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sdG9vbHNrZXkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNvdXJjZSBlZGl0b3IgYW5kIFhNTCB0b29scyBrZXlib2FyZCBzaG9ydGN1dHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIFhNTCwgWFNELCBXU0RMLCBIVE1MLCBKU1AsIENTUyBhbmQgRFREIGVkaXRvcnMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBmb2xsb3dpbmcga2V5Ym9hcmQgc2hvcnRjdXRzIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBYTUwsIFhTRCwgV1NETCwgSFRNTCwgSlNQLCBDU1MgYW5kIERURCBlZGl0b3JzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImFjY2Vzc2liaWxpdHksIGtleWJvYXJkIHNob3J0Y3V0cywgWE1MIGVkaXRvciwga2V5Ym9hcmQgc2hvcnRjdXRzLCBzb3VyY2UgZWRpdG9yLCBYTUwgZWRpdG9yLCBzaG9ydGN1dHMsIGtleWJvYXJkLCBYU0QgZWRpdG9yLCBXU0RMIGVkaXRvciwgSFRNTCBlZGl0b3IsIEpTUCBlZGl0b3IsIENTUyBlZGl0b3IsIERURCBlZGl0b3IiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJhY2Nlc3NpYmlsaXR5LCBrZXlib2FyZCBzaG9ydGN1dHMsIFhNTCBlZGl0b3IsIGtleWJvYXJkIHNob3J0Y3V0cywgc291cmNlIGVkaXRvciwgWE1MIGVkaXRvciwgc2hvcnRjdXRzLCBrZXlib2FyZCwgWFNEIGVkaXRvciwgV1NETCBlZGl0b3IsIEhUTUwgZWRpdG9yLCBKU1AgZWRpdG9yLCBDU1MgZWRpdG9yLCBEVEQgZWRpdG9yIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ4bWx0b29sc2tleWJvYXJkc2hvcnRjdXRzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U291cmNlIGVkaXRvciBhbmQgWE1MIHRvb2xzIGtleWJvYXJkIHNob3J0Y3V0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ieG1sdG9vbHNrZXlib2FyZHNob3J0Y3V0cyI+PGEgbmFtZT0ieG1sdG9vbHNrZXlib2FyZHNob3J0Y3V0cyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U291cmNlIGVkaXRvciBhbmQgWE1MIHRvb2xzIGtleWJvYXJkIHNob3J0Y3V0czwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoZSBmb2xsb3dpbmcga2V5Ym9hcmQgc2hvcnRjdXRzIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBYTUwsIFhTRCwKLVdTREwsIEhUTUwsIEpTUCwgQ1NTIGFuZCBEVEQgZWRpdG9ycy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TaG9ydGN1dHMgYXZhaWxhYmxlIGluIGFsbCBzb3VyY2UgZWRpdG9yczwvaDQ+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBib3JkZXI9IjEiIGNsYXNzPSJzaW1wbGV0YWJsZWJvcmRlciI+Ci08dHI+Ci08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMEQwIj5Db21tYW5kPC90aD4KLQotPHRoIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgaWQ9Ik4xMDBENiI+U2hvcnRjdXQ8L3RoPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBEMCI+R28gVG8gTWF0Y2hpbmcgQnJhY2tldDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQ2Ij5DdHJsK1NoaWZ0K1A8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBEMCI+UmVzdG9yZSBMYXN0IFNlbGVjdGlvbjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQ2Ij5BdGwrU2hpZnQrRG93bjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQwIj5TZWxlY3QgRW5jbG9zaW5nIEVsZW1lbnQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBENiI+QWx0K1NoaWZ0K1VwPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRDAiPlNlbGVjdCBOZXh0IEVsZW1lbnQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBENiI+QWx0K1NoaWZ0K1JpZ2h0PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRDAiPlNlbGVjdCBQcmV2aW91cyBFbGVtZW50PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRDYiPkFsdCtTaGlmdCtMZWZ0PC90ZD4KLQotPC90cj4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgWE1MLCBYU0QsIFdTREwsIEhUTUwsIEpTUCwgYW5kCi1DU1MgZWRpdG9ycyAoZXhjbHVkZXMgdGhlIERURCBlZGl0b3IpPC9oND48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGJvcmRlcj0iMSIgY2xhc3M9InNpbXBsZXRhYmxlYm9yZGVyIj4KLTx0cj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAxNEIiPkNvbW1hbmQ8L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMTUxIj5TaG9ydGN1dDwvdGg+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTRCIj5Gb3JtYXQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE1MSI+Q3RybCtTaGlmdCtGPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxNEIiPkZvcm1hdCBBY3RpdmUgRWxlbWVudHM8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE1MSI+Q3RybCtJPC90ZD4KLQotPC90cj4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgWE1MLCBYU0QsIFdTREwsIEhUTUwsIGFuZCBKU1AgZWRpdG9ycwotKGV4Y2x1ZGVzIHRoZSBEVEQgYW5kIENTUyBlZGl0b3JzKTwvaDQ+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBib3JkZXI9IjEiIGNsYXNzPSJzaW1wbGV0YWJsZWJvcmRlciI+Ci08dHI+Ci08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMTkwIj5Db21tYW5kPC90aD4KLQotPHRoIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgaWQ9Ik4xMDE5NiI+U2hvcnRjdXQ8L3RoPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5MCI+QWRkIEJsb2NrIENvbW1lbnQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5NiI+Q3RybCtTaGlmdCsvPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTAiPkdvIFRvIE1hdGNoaW5nIFRhZzwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTk2Ij5DdHJsK1NoaWZ0KyZndDs8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5MCI+R28gVG8gTmV4dCBTaWJsaW5nPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTYiPkN0cmwrU2hpZnQrRG93bjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkwIj5PY2N1cnJlbmNlcyBpbiBGaWxlPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTYiPkN0cmwrU2hpZnQrQTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkwIj5PcGVuIFNlbGVjdGlvbjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTk2Ij5GMzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkwIj5HbyBUbyBQcmV2aW91cyBTaWJsaW5nPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTYiPkN0cmwrU2hpZnQrVXA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5MCI+UmVtb3ZlIEJsb2NrIENvbW1lbnQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5NiI+Q3RybCtTaGlmdCtcPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTAiPlRvZ2dsZSBDb21tZW50PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTYiPkN0cmwrU2hpZnQrQzwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlNob3J0Y3V0cyBhdmFpbGFibGUgaW4gdGhlIGRlc2lnbiB2aWV3IG9mIHRoZSBYU0QgYW5kIFdTREwKLWVkaXRvcnM8L2g0Pjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgYm9yZGVyPSIxIiBjbGFzcz0ic2ltcGxldGFibGVib3JkZXIiPgotPHRyPgotPHRoIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgaWQ9Ik4xMDI0MSI+Q29tbWFuZDwvdGg+Ci0KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAyNDciPlNob3J0Y3V0PC90aD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyNDEiPlpvb20gSW48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI0NyI+Q3RybCs9PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyNDEiPlpvb20gT3V0PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyNDciPkN0cmwrLTwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlNob3J0Y3V0cyBhdmFpbGFibGUgaW4gdGhlIGRlc2lnbiB2aWV3IG9mIHRoZSBXU0RMIGVkaXRvcjwvaDQ+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBib3JkZXI9IjEiIGNsYXNzPSJzaW1wbGV0YWJsZWJvcmRlciI+Ci08dHI+Ci08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMjg2Ij5Db21tYW5kPC90aD4KLQotPHRoIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgaWQ9Ik4xMDI4QyI+U2hvcnRjdXQ8L3RoPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI4NiI+RXhwb3J0IERpYWdyYW0gYXMgSW1hZ2U8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI4QyI+Q3RybCtTaGlmdCtYPC90ZD4KLQotPC90cj4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldHhtbC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldHhtbC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2M3NmFiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXR4bWwuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0Y3JldHhtbCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgWE1MIGZpbGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5DcmVhdGluZyBYTUwgZmlsZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBjcmVhdGUgYSBuZXcgWE1MIGZpbGUgd2hpY2ggeW91IGNhbiB0aGVuIGVkaXQgaW4gdGhlIFhNTA0KLWVkaXRvci4gWW91IGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MDQotc2NoZW1hIGZpbGUsIHNvIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGtpbmQgb2YgY29udGVudCBpdCBjYW4gY29udGFpbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gY3JlYXRlIGEgbmV3DQotWE1MIGZpbGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBwcm9qZWN0IHRvIGNvbnRhaW4gdGhlIFhNTCBmaWxlIGlmIG9uZSBkb2VzIG5vdCBleGlzdA0KLWFscmVhZHkuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIHdvcmtiZW5jaCwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RmlsZTwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+PHVpY29udHJvbD5PdGhlcjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi4gQ2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgcHJvamVjdCBvciBmb2xkZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIFhNTCBmaWxlLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPkZpbGUgbmFtZTwvdWljb250cm9sPiBmaWVsZCwgdHlwZSB0aGUgbmFtZSBvZg0KLXRoZSBYTUwgZmlsZSBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LiBUaGUgbmFtZSBvZiB5b3VyIFhNTCBmaWxlDQotbXVzdCBlbmQgaW4gPHVzZXJpbnB1dD4ueG1sPC91c2VyaW5wdXQ+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5DcmVhdGUgWE1MIGZpbGUgZnJvbSBhbiBYTUwgdGVtcGxhdGU8L3VpY29udHJvbD4gcmFkaW8NCi1idXR0b24gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dC48L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPllvdSBtYXkgY2hvb3NlIHRvIHZpZXcgYW5kIGVkaXQgdGhlIFhNTCB0ZW1wbGF0ZXMNCi10aGF0IHdpbGwgYmUgdXNlZCBpbiB5b3VyIG5ldyBYTUwgZmlsZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayAgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PD9QdWIgQ2FyZXQ/PjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjAwND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldHhtbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldHhtbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTVkMDRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXR4bWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIFhNTCBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB3aGljaCB5b3UgY2FuIHRoZW4gZWRpdCBpbiB0aGUgWE1MIGVkaXRvci4gWW91IGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mIGNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwgZWRpdG9yLiBZb3UgY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUsIHNvIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGtpbmQgb2YgY29udGVudCBpdCBjYW4gY29udGFpbi4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBjcmVhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JleGR0ZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXh4c2QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0dGFnLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRjcmV0eG1sIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgWE1MIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0Y3JldHhtbCI+PGEgbmFtZT0idGNyZXR4bWwiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIFhNTCBmaWxlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBjcmVhdGUgYSBuZXcgWE1MIGZpbGUgd2hpY2ggeW91IGNhbiB0aGVuIGVkaXQgaW4gdGhlIFhNTAotZWRpdG9yLiBZb3UgY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwKLXNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mIGNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGNyZWF0ZSBhIG5ldwotWE1MIGZpbGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5DcmVhdGUgYSBwcm9qZWN0IHRvIGNvbnRhaW4gdGhlIFhNTCBmaWxlIGlmIG9uZSBkb2VzIG5vdCBleGlzdAotYWxyZWFkeS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSB3b3JrYmVuY2gsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdGhlcjwvc3Bhbj48L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+PC9zcGFuPi4gQ2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPlNlbGVjdCB0aGUgcHJvamVjdCBvciBmb2xkZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIFhNTCBmaWxlLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZSBuYW1lPC9zcGFuPiBmaWVsZCwgdHlwZSB0aGUgbmFtZSBvZgotdGhlIFhNTCBmaWxlIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi4gVGhlIG5hbWUgb2YgeW91ciBYTUwgZmlsZQotbXVzdCBlbmQgaW4gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij4ueG1sPC9rYmQ+Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgWE1MIGZpbGUgZnJvbSBhbiBYTUwgdGVtcGxhdGU8L3NwYW4+IHJhZGlvCi1idXR0b24gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQuPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPllvdSBtYXkgY2hvb3NlIHRvIHZpZXcgYW5kIGVkaXQgdGhlIFhNTCB0ZW1wbGF0ZXMKLXRoYXQgd2lsbCBiZSB1c2VkIGluIHlvdXIgbmV3IFhNTCBmaWxlLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iIC8+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV4ZHRkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIERURC4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV4eHNkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgWE1MIHNjaGVtYSBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBYTUwgc2NoZW1hLCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBYTUwgc2NoZW1hLiI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0dGFnLmh0bWwiIHRpdGxlPSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIj5FZGl0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZWZkZTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0Y3JleGR0ZCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5HZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgRFREPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5DQotY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyDQotRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGgNCi15b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXINCi1EVEQuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJ0Y3JleGR0ZHwxfFhNTGZpbGVzZ2VuZXJhdGluZ2Zyb21EVERzIiBzdGF0dXM9Im5ldyI+WE1MDQotZmlsZXM8aW5kZXh0ZXJtPmdlbmVyYXRpbmcgZnJvbSBEVERzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybSBrZXlyZWY9InRjcmV4ZHRkfDJ8RFREZ2VuZXJhdGluZ1hNTGZpbGVzIg0KLXN0YXR1cz0iY2hhbmdlZCI+RFREczxpbmRleHRlcm0+Z2VuZXJhdGluZyBYTUwgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPkFmdGVyIHlvdSBoYXZlIGdlbmVyYXRlZCB5b3VyIFhNTCBmaWxlLCB5b3UgY2FuIGZ1cnRoZXIgY3VzdG9taXplDQotaXQgaW4gdGhlIFhNTCBlZGl0b3IuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlDQotUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWNyZWF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgRFREIGZpbGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBEVEQgZmlsZSB0aGF0IHlvdSB3YW50IHRvDQotd29yayB3aXRoIGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+R2VuZXJhdGU8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUZpbGU8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlciB0byBjb250YWluIHRoZSBYTUwgZmlsZSBhbmQgdHlwZSBhIG5hbWUNCi1mb3IgdGhlIGZpbGUgaW4gdGhlIDx1aWNvbnRyb2w+RmlsZSBOYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08aW5mbz5UaGUgbmFtZSBvZiB0aGUgZmlsZSBtdXN0IGVuZCBpbiA8dXNlcmlucHV0Pi54bWw8L3VzZXJpbnB1dD4uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5Sb290IGVsZW1lbnQ8L3VpY29udHJvbD4gb2YgdGhlIFhNTCBmaWxlLjwvY21kPg0KLTxpbmZvPlRoZSByb290IGVsZW1lbnQgb2YgYW4gWE1MIGZpbGUgaXMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgb3RoZXINCi1lbGVtZW50cyBpbiB0aGF0IGZpbGUuIEFsbCB0aGUgZWxlbWVudHMgdGhhdCB5b3UgaGF2ZSBkZWZpbmVkIGluIHRoZSBEVEQgd2lsbA0KLWJlIHNob3duIGluIHRoZSA8dWljb250cm9sPlJvb3QgZWxlbWVudDwvdWljb250cm9sPiBsaXN0LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgZnJvbSB0aGUgZm9sbG93aW5nIGNvbnRlbnQgb3B0aW9uczogIDwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+PHVpY29udHJvbD5DcmVhdGUgb3B0aW9uYWwgYXR0cmlidXRlczwvdWljb250cm9sPjogYm90aCBtYW5kYXRvcnkNCi1hbmQgb3B0aW9uYWwgYXR0cmlidXRlcyB3aWxsIGJlIGdlbmVyYXRlZC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIG9wdGlvbmFsIGVsZW1lbnRzPC91aWNvbnRyb2w+OiBib3RoIG1hbmRhdG9yeSBhbmQNCi1vcHRpb25hbCBlbGVtZW50cyB3aWxsIGJlIGdlbmVyYXRlZC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCBjaG9pY2U8L3VpY29udHJvbD46IHRoZQ0KLWZpcnN0IG9wdGlvbiBvZiBhIHJlcXVpcmVkIGNob2ljZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiB5b3VyIFhNTCBmaWxlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5GaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdpdGggZGF0YTwvdWljb250cm9sPjogYW55DQotZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZ2VuZXJhdGVkIHdpbGwgYmUgZmlsbGVkIHdpdGggc2FtcGxlIGRhdGEuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTxpbmZvPiBJZiB5b3UgZG8gbm90IHNlbGVjdCBhbnkgb2YgdGhlc2Ugb3B0aW9ucywgdGhlbiBvbmx5IHRoZSBtaW5pbXVtIGFtb3VudA0KLW9mIGNvbnRlbnQgcmVxdWlyZWQgZm9yIHRoZSBYTUwgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNwZWNpZnkgdGhlIDx1aWNvbnRyb2w+UHVibGljIElEPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+U3lzdGVtDQotSUQ8L3VpY29udHJvbD4uPC9jbWQ+PGluZm8+WW91IGRvIG5vdCBuZWVkIHRvIHNwZWNpZnkgYm90aC4gSWYgeW91IGRvLCB0aGUNCi1QdWJsaWMgSUQgd2lsbCBiZSB1c2VkIGJlZm9yZSB0aGUgU3lzdGVtIElELiA8L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5UaGUgWE1MIGZpbGUgd2lsbCBvbmx5IGNvbnRhaW4gdGhlIHNlbGVjdGVkIHJvb3QgZWxlbWVudCBhbmQgYW55DQotZWxlbWVudHMgb3IgYXR0cmlidXRlcyBjb250YWluZWQgaW4gdGhlIHJvb3QgZWxlbWVudC4gWW91IGNhbiBub3cgYWRkIGVsZW1lbnRzLA0KLWF0dHJpYnV0ZXMsIGVudGl0aWVzLCBhbmQgbm90YXRpb25zIHRvIHRoZSBYTUwgZmlsZSwgaG93ZXZlciwgdGhleSBtdXN0IGZvbGxvdw0KLXRoZSBydWxlcyBlc3RhYmxpc2hlZCBpbiB0aGUgRFREIHRoYXQgeW91IHVzZWQgdG8gY3JlYXRlIHRoZSBYTUwgZmlsZS48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmZiYTFmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgRFRELCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBEVEQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIERURCBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgRFRELiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgZ2VuZXJhdGluZyBmcm9tIERURHMsIERURHMsIGdlbmVyYXRpbmcgWE1MIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBnZW5lcmF0aW5nIGZyb20gRFREcywgRFREcywgZ2VuZXJhdGluZyBYTUwgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXR4bWwuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV4eHNkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHRhZy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0Y3JleGR0ZCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBEVEQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjcmV4ZHRkIj48YSBuYW1lPSJ0Y3JleGR0ZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseQotY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyCi1EVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aAoteW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyCi1EVEQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciBYTUwgZmlsZSwgeW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZQotaXQgaW4gdGhlIFhNTCBlZGl0b3IuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUKLVJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBEVEQgZmlsZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBEVEQgZmlsZSB0aGF0IHlvdSB3YW50IHRvCi13b3JrIHdpdGggYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYXRlPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRmlsZTwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBhIHByb2plY3Qgb3IgZm9sZGVyIHRvIGNvbnRhaW4gdGhlIFhNTCBmaWxlIGFuZCB0eXBlIGEgbmFtZQotZm9yIHRoZSBmaWxlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlIE5hbWU8L3NwYW4+IGZpZWxkLCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLSBUaGUgbmFtZSBvZiB0aGUgZmlsZSBtdXN0IGVuZCBpbiA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPi54bWw8L2tiZD4uCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Um9vdCBlbGVtZW50PC9zcGFuPiBvZiB0aGUgWE1MIGZpbGUuPC9zcGFuPgotIFRoZSByb290IGVsZW1lbnQgb2YgYW4gWE1MIGZpbGUgaXMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgb3RoZXIKLWVsZW1lbnRzIGluIHRoYXQgZmlsZS4gQWxsIHRoZSBlbGVtZW50cyB0aGF0IHlvdSBoYXZlIGRlZmluZWQgaW4gdGhlIERURCB3aWxsCi1iZSBzaG93biBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Um9vdCBlbGVtZW50PC9zcGFuPiBsaXN0LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBjb250ZW50IG9wdGlvbnM6ICA8L3NwYW4+Ci08dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIG9wdGlvbmFsIGF0dHJpYnV0ZXM8L3NwYW4+OiBib3RoIG1hbmRhdG9yeQotYW5kIG9wdGlvbmFsIGF0dHJpYnV0ZXMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBvcHRpb25hbCBlbGVtZW50czwvc3Bhbj46IGJvdGggbWFuZGF0b3J5IGFuZAotb3B0aW9uYWwgZWxlbWVudHMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBmaXJzdCBjaG9pY2Ugb2YgcmVxdWlyZWQgY2hvaWNlPC9zcGFuPjogdGhlCi1maXJzdCBvcHRpb24gb2YgYSByZXF1aXJlZCBjaG9pY2Ugd2lsbCBiZSBnZW5lcmF0ZWQgaW4geW91ciBYTUwgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3aXRoIGRhdGE8L3NwYW4+OiBhbnkKLWVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGdlbmVyYXRlZCB3aWxsIGJlIGZpbGxlZCB3aXRoIHNhbXBsZSBkYXRhLjwvbGk+Ci0KLTwvdWw+Ci0KLSAgSWYgeW91IGRvIG5vdCBzZWxlY3QgYW55IG9mIHRoZXNlIG9wdGlvbnMsIHRoZW4gb25seSB0aGUgbWluaW11bSBhbW91bnQKLW9mIGNvbnRlbnQgcmVxdWlyZWQgZm9yIHRoZSBYTUwgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QdWJsaWMgSUQ8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN5c3RlbQotSUQ8L3NwYW4+Ljwvc3Bhbj4gWW91IGRvIG5vdCBuZWVkIHRvIHNwZWNpZnkgYm90aC4gSWYgeW91IGRvLCB0aGUKLVB1YmxpYyBJRCB3aWxsIGJlIHVzZWQgYmVmb3JlIHRoZSBTeXN0ZW0gSUQuIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBmaWxlIHdpbGwgb25seSBjb250YWluIHRoZSBzZWxlY3RlZCByb290IGVsZW1lbnQgYW5kIGFueQotZWxlbWVudHMgb3IgYXR0cmlidXRlcyBjb250YWluZWQgaW4gdGhlIHJvb3QgZWxlbWVudC4gWW91IGNhbiBub3cgYWRkIGVsZW1lbnRzLAotYXR0cmlidXRlcywgZW50aXRpZXMsIGFuZCBub3RhdGlvbnMgdG8gdGhlIFhNTCBmaWxlLCBob3dldmVyLCB0aGV5IG11c3QgZm9sbG93Ci10aGUgcnVsZXMgZXN0YWJsaXNoZWQgaW4gdGhlIERURCB0aGF0IHlvdSB1c2VkIHRvIGNyZWF0ZSB0aGUgWE1MIGZpbGUuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV0eG1sLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB3aGljaCB5b3UgY2FuIHRoZW4gZWRpdCBpbiB0aGUgWE1MIGVkaXRvci4gWW91IGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mIGNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uIj5DcmVhdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3JleHhzZC5odG1sIiB0aXRsZT0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHRhZy5odG1sIiB0aXRsZT0iVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgWE1MIGZpbGVzLiI+RWRpdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmEzODczLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGNyZXh4c2QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSBhbiBYTUwgc2NoZW1hPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgaWYgeW91IHdhbnQgdG8NCi1xdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwNCi1maWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeQ0KLWFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cw0KLWFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRjcmV4eHNkfDF8WE1MZmlsZXNnZW5lcmF0aW5nZnJvbVhNTHNjaGVtYXMiDQotc3RhdHVzPSJuZXciPlhNTCBmaWxlczxpbmRleHRlcm0+Z2VuZXJhdGluZyBmcm9tIFhNTCBzY2hlbWFzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybSBrZXlyZWY9InRjcmV4eHNkfDJ8WE1Mc2NoZW1hc2dlbmVyYXRpbmdYTUxmaWxlcyIgc3RhdHVzPSJjaGFuZ2VkIj5zY2hlbWFzPGluZGV4dGVybT5nZW5lcmF0aW5nDQotWE1MIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRjcmV4eHNkfDExfFhNTGZpbGVzc2NoZW1hcyIgc3RhdHVzPSJuZXciPlhNTA0KLWZpbGVzPGluZGV4dGVybT5zY2hlbWFzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5BZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciBYTUwgZmlsZSwgeW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZQ0KLWl0IGluIHRoZSBYTUwgZWRpdG9yLjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZQ0KLVJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8NCi1nZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgc2NoZW1hIGZpbGUgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE5hdmlnYXRvciB2aWV3LCByaWdodC1jbGljayB0aGUgWE1MIHNjaGVtYSBmaWxlIHRoYXQgeW91DQotd2FudCB0byB3b3JrIHdpdGggYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5HZW5lcmF0ZTwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+WE1MIEZpbGU8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlciB0byBjb250YWluIHRoZSBYTUwgZmlsZSBhbmQgdHlwZSBhIG5hbWUNCi1mb3IgdGhlIGZpbGUgaW4gdGhlIDx1aWNvbnRyb2w+RmlsZSBOYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08aW5mbz5UaGUgbmFtZSBvZiB0aGUgZmlsZSBtdXN0IGVuZCBpbiA8dXNlcmlucHV0Pi54bWw8L3VzZXJpbnB1dD4uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5Sb290IGVsZW1lbnQ8L3VpY29udHJvbD4gb2YgdGhlIFhNTCBmaWxlLjwvY21kPg0KLTxpbmZvPlRoZSByb290IGVsZW1lbnQgb2YgYW4gWE1MIGZpbGUgaXMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgb3RoZXINCi1lbGVtZW50cyBpbiB0aGF0IGZpbGUuIEFsbCBvZiB0aGUgZ2xvYmFsIGVsZW1lbnRzIHlvdSBoYXZlIGRlZmluZWQgaW4gdGhlDQotWE1MIHNjaGVtYSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBSb290IGVsZW1lbnQgbGlzdC4gSWYgeW91IGRvIG5vdCBoYXZlIGFueQ0KLWdsb2JhbCBlbGVtZW50cyBpbiB5b3VyIFhNTCBzY2hlbWEsIHlvdSBjYW5ub3QgY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gaXQuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBmcm9tIHRoZSBmb2xsb3dpbmcgY29udGVudCBvcHRpb25zOjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+PHVpY29udHJvbD5DcmVhdGUgb3B0aW9uYWwgYXR0cmlidXRlczwvdWljb250cm9sPjogYm90aCBtYW5kYXRvcnkNCi1hbmQgb3B0aW9uYWwgYXR0cmlidXRlcyB3aWxsIGJlIGdlbmVyYXRlZC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIG9wdGlvbmFsIGVsZW1lbnRzPC91aWNvbnRyb2w+OiBib3RoIG1hbmRhdG9yeSBhbmQNCi1vcHRpb25hbCBlbGVtZW50cyB3aWxsIGJlIGdlbmVyYXRlZC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCBjaG9pY2U8L3VpY29udHJvbD46IHRoZQ0KLWZpcnN0IG9wdGlvbiBvZiBhIHJlcXVpcmVkIGNob2ljZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiB5b3VyIFhNTCBmaWxlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5GaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdpdGggZGF0YTwvdWljb250cm9sPjogYW55DQotZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZ2VuZXJhdGVkIHdpbGwgYmUgZmlsbGVkIHdpdGggc2FtcGxlIGRhdGEuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTxpbmZvPklmIHlvdSBkbyBub3Qgc2VsZWN0IGFueSBvZiB0aGVzZSBvcHRpb25zLCB0aGVuIG9ubHkgdGhlIG1pbmltdW0gYW1vdW50DQotb2YgY29udGVudCByZXF1aXJlZCBmb3IgdGhlIFhNTCBmaWxlIHdpbGwgYmUgY3JlYXRlZC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIE5hbWVzcGFjZSBJbmZvcm1hdGlvbiBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQ0KLXRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIFhNTCBzY2hlbWEsIGl0cyBwcmVmaXgsIGFuZCB0aGUgc2NoZW1hIGxvY2F0aW9uLiBTZWxlY3QNCi10aGUgZW50cnkgeW91IHdhbnQgdG8gZWRpdCBhbmQgY2xpY2sgPHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+LjwvY21kPjxpbmZvPjx1bD4NCi08bGk+VGhlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPk5hbWVzcGFjZSBOYW1lPC91aWNvbnRyb2w+IGZpZWxkIGlzIHRoZSB0YXJnZXQNCi1uYW1lc3BhY2Ugb2YgdGhlIFhNTCBzY2hlbWEuIFlvdXIgWE1MIGZpbGUgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZQ0KLW5hbWVzcGFjZSBhcyBpdHMgWE1MIHNjaGVtYSBpcyBhc3NvY2lhdGVkIHdpdGguPC9saT4NCi08bGk+QWxsIHF1YWxpZmllZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB0aGUgWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoDQotdGhlIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIDx1aWNvbnRyb2w+UHJlZml4PC91aWNvbnRyb2w+IHZhbHVlLjwvbGk+DQotPGxpPlRoZSAgPHVpY29udHJvbD5Mb2NhdGlvbiBIaW50PC91aWNvbnRyb2w+IGZpZWxkIGNvbnRhaW5zIHRoZSBsb2NhdGlvbg0KLW9mIHRoZSBYTUwgc2NoZW1hLjwvbGk+DQotPC91bD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBuYW1lc3BhY2VzIGFuZCBuYW1lc3BhY2UgcHJlZml4ZXMsIHJlZmVyIHRvDQotdGhlIHJlbGF0ZWQgcmVmZXJlbmNlcy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiBhbmQgdGhlbiA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPlRoZSBYTUwgZmlsZSB3aWxsIGNvbnRhaW4gdGhlIHNlbGVjdGVkIHJvb3QgZWxlbWVudCBhbmQgYW55IGVsZW1lbnRzDQotb3IgYXR0cmlidXRlcyBjb250YWluZWQgaW4gdGhlIHJvb3QgZWxlbWVudC4gSXQgYWxzbyBjb250YWlucyBpbmZvcm1hdGlvbg0KLWFib3V0IHRoZSBYTUwgZmlsZSBuYW1lc3BhY2UgYW5kIGxvY2F0aW9uLiBZb3UgY2FuIG5vdyBhZGQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMNCi10byB0aGUgWE1MIGZpbGUuPC9wPjxub3RlPkluIGNlcnRhaW4gY2FzZXMsIHdoZW4gYW4gWE1MIGZpbGUgaXMgZ2VuZXJhdGVkDQotZnJvbSBhIGNvbXBsZXggWE1MIHNjaGVtYSBmaWxlLCB0aGUgWE1MIGZpbGUgbWlnaHQgbm90IGJlIHZhbGlkLiBJZiB0aGlzIG9jY3VycywNCi15b3UgY2FuIG9wZW4gdGhlIGdlbmVyYXRlZCBmaWxlIGluIHRoZSBYTUwgZWRpdG9yIGFuZCBjb3JyZWN0IGFueSBlcnJvcnMgdGhhdA0KLW9jY3VyLiBVc3VhbGx5LCBvbmx5IGEgZmV3IGVycm9ycyBuZWVkIHRvIGJlIGZpeGVkLiBUaGUgZm9sbG93aW5nIFhNTCBzY2hlbWENCi1jb25zdHJ1Y3RzIG1pZ2h0IHByZXNlbnQgcHJvYmxlbXM6PC9ub3RlPjx1bD4NCi08bGk+UmVzdHJpY3Rpb25zOiBzb21ldGltZXMgcmVzdHJpY3RlZCBlbGVtZW50cyBhcmUgZXJyb25lb3VzbHkgZ2VuZXJhdGVkLiA8L2xpPg0KLTxsaT5GYWNldHM6IGRlZmF1bHQgZ2VuZXJhdGVkIGRhdGEgdmFsdWVzIG1pZ2h0IG5vdCBjb25mb3JtIHRvIGNvbXBsZXggZmFjZXRzDQotKGZvciBleGFtcGxlLCBwYXR0ZXJucykuPC9saT4NCi08bGk+QWJzdHJhY3QgZWxlbWVudHM6IGFic3RyYWN0IGVsZW1lbnRzIGFyZSBzb21ldGltZXMgZXJyb25lb3VzbHkgZ2VuZXJhdGVkLjwvbGk+DQotPC91bD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMTY1YmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGdlbmVyYXRpbmcgZnJvbSBYTUwgc2NoZW1hcywgc2NoZW1hcywgZ2VuZXJhdGluZyBYTUwgZmlsZXMsIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgZ2VuZXJhdGluZyBmcm9tIFhNTCBzY2hlbWFzLCBzY2hlbWFzLCBnZW5lcmF0aW5nIFhNTCBmaWxlcywgWE1MIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV0eG1sLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JleGR0ZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRjcmV4eHNkIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+R2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIGFuIFhNTCBzY2hlbWE8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjcmV4eHNkIj48YSBuYW1lPSJ0Y3JleHhzZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0bwotcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBYTUwgc2NoZW1hIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MCi1maWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeQotYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzCi1hbmQgYXR0cmlidXRlcyBpbiB5b3VyIFhNTCBzY2hlbWEuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciBYTUwgZmlsZSwgeW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZQotaXQgaW4gdGhlIFhNTCBlZGl0b3IuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUKLVJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSBhIHNjaGVtYSBmaWxlIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBYTUwgc2NoZW1hIGZpbGUgdGhhdCB5b3UKLXdhbnQgdG8gd29yayB3aXRoIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmF0ZTwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBGaWxlPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGEgcHJvamVjdCBvciBmb2xkZXIgdG8gY29udGFpbiB0aGUgWE1MIGZpbGUgYW5kIHR5cGUgYSBuYW1lCi1mb3IgdGhlIGZpbGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgTmFtZTwvc3Bhbj4gZmllbGQsIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPgotIFRoZSBuYW1lIG9mIHRoZSBmaWxlIG11c3QgZW5kIGluIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+LnhtbDwva2JkPi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Sb290IGVsZW1lbnQ8L3NwYW4+IG9mIHRoZSBYTUwgZmlsZS48L3NwYW4+Ci0gVGhlIHJvb3QgZWxlbWVudCBvZiBhbiBYTUwgZmlsZSBpcyB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCBvdGhlcgotZWxlbWVudHMgaW4gdGhhdCBmaWxlLiBBbGwgb2YgdGhlIGdsb2JhbCBlbGVtZW50cyB5b3UgaGF2ZSBkZWZpbmVkIGluIHRoZQotWE1MIHNjaGVtYSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBSb290IGVsZW1lbnQgbGlzdC4gSWYgeW91IGRvIG5vdCBoYXZlIGFueQotZ2xvYmFsIGVsZW1lbnRzIGluIHlvdXIgWE1MIHNjaGVtYSwgeW91IGNhbm5vdCBjcmVhdGUgYW4gWE1MIGZpbGUgZnJvbSBpdC4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBjb250ZW50IG9wdGlvbnM6PC9zcGFuPgotPHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBvcHRpb25hbCBhdHRyaWJ1dGVzPC9zcGFuPjogYm90aCBtYW5kYXRvcnkKLWFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgb3B0aW9uYWwgZWxlbWVudHM8L3NwYW4+OiBib3RoIG1hbmRhdG9yeSBhbmQKLW9wdGlvbmFsIGVsZW1lbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgZmlyc3QgY2hvaWNlIG9mIHJlcXVpcmVkIGNob2ljZTwvc3Bhbj46IHRoZQotZmlyc3Qgb3B0aW9uIG9mIGEgcmVxdWlyZWQgY2hvaWNlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHlvdXIgWE1MIGZpbGUuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgd2l0aCBkYXRhPC9zcGFuPjogYW55Ci1lbGVtZW50cyBhbmQgYXR0cmlidXRlcyBnZW5lcmF0ZWQgd2lsbCBiZSBmaWxsZWQgd2l0aCBzYW1wbGUgZGF0YS48L2xpPgotCi08L3VsPgotCi0gSWYgeW91IGRvIG5vdCBzZWxlY3QgYW55IG9mIHRoZXNlIG9wdGlvbnMsIHRoZW4gb25seSB0aGUgbWluaW11bSBhbW91bnQKLW9mIGNvbnRlbnQgcmVxdWlyZWQgZm9yIHRoZSBYTUwgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgTmFtZXNwYWNlIEluZm9ybWF0aW9uIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi10YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBYTUwgc2NoZW1hLCBpdHMgcHJlZml4LCBhbmQgdGhlIHNjaGVtYSBsb2NhdGlvbi4gU2VsZWN0Ci10aGUgZW50cnkgeW91IHdhbnQgdG8gZWRpdCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4uPC9zcGFuPiA8dWw+Ci08bGk+VGhlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lc3BhY2UgTmFtZTwvc3Bhbj4gZmllbGQgaXMgdGhlIHRhcmdldAotbmFtZXNwYWNlIG9mIHRoZSBYTUwgc2NoZW1hLiBZb3VyIFhNTCBmaWxlIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUKLW5hbWVzcGFjZSBhcyBpdHMgWE1MIHNjaGVtYSBpcyBhc3NvY2lhdGVkIHdpdGguPC9saT4KLQotPGxpPkFsbCBxdWFsaWZpZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aAotdGhlIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZpeDwvc3Bhbj4gdmFsdWUuPC9saT4KLQotPGxpPlRoZSAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TG9jYXRpb24gSGludDwvc3Bhbj4gZmllbGQgY29udGFpbnMgdGhlIGxvY2F0aW9uCi1vZiB0aGUgWE1MIHNjaGVtYS48L2xpPgotCi08L3VsPgotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbmFtZXNwYWNlcyBhbmQgbmFtZXNwYWNlIHByZWZpeGVzLCByZWZlciB0bwotdGhlIHJlbGF0ZWQgcmVmZXJlbmNlcy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiBhbmQgdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBYTUwgZmlsZSB3aWxsIGNvbnRhaW4gdGhlIHNlbGVjdGVkIHJvb3QgZWxlbWVudCBhbmQgYW55IGVsZW1lbnRzCi1vciBhdHRyaWJ1dGVzIGNvbnRhaW5lZCBpbiB0aGUgcm9vdCBlbGVtZW50LiBJdCBhbHNvIGNvbnRhaW5zIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgWE1MIGZpbGUgbmFtZXNwYWNlIGFuZCBsb2NhdGlvbi4gWW91IGNhbiBub3cgYWRkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzCi10byB0aGUgWE1MIGZpbGUuPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEluIGNlcnRhaW4gY2FzZXMsIHdoZW4gYW4gWE1MIGZpbGUgaXMgZ2VuZXJhdGVkCi1mcm9tIGEgY29tcGxleCBYTUwgc2NoZW1hIGZpbGUsIHRoZSBYTUwgZmlsZSBtaWdodCBub3QgYmUgdmFsaWQuIElmIHRoaXMgb2NjdXJzLAoteW91IGNhbiBvcGVuIHRoZSBnZW5lcmF0ZWQgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciBhbmQgY29ycmVjdCBhbnkgZXJyb3JzIHRoYXQKLW9jY3VyLiBVc3VhbGx5LCBvbmx5IGEgZmV3IGVycm9ycyBuZWVkIHRvIGJlIGZpeGVkLiBUaGUgZm9sbG93aW5nIFhNTCBzY2hlbWEKLWNvbnN0cnVjdHMgbWlnaHQgcHJlc2VudCBwcm9ibGVtczo8L2Rpdj4KLTx1bD4KLTxsaT5SZXN0cmljdGlvbnM6IHNvbWV0aW1lcyByZXN0cmljdGVkIGVsZW1lbnRzIGFyZSBlcnJvbmVvdXNseSBnZW5lcmF0ZWQuIDwvbGk+Ci0KLTxsaT5GYWNldHM6IGRlZmF1bHQgZ2VuZXJhdGVkIGRhdGEgdmFsdWVzIG1pZ2h0IG5vdCBjb25mb3JtIHRvIGNvbXBsZXggZmFjZXRzCi0oZm9yIGV4YW1wbGUsIHBhdHRlcm5zKS48L2xpPgotCi08bGk+QWJzdHJhY3QgZWxlbWVudHM6IGFic3RyYWN0IGVsZW1lbnRzIGFyZSBzb21ldGltZXMgZXJyb25lb3VzbHkgZ2VuZXJhdGVkLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXR4bWwuaHRtbCIgdGl0bGU9IllvdSBjYW4gY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwgZWRpdG9yLiBZb3UgY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUsIHNvIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGtpbmQgb2YgY29udGVudCBpdCBjYW4gY29udGFpbi4iPkNyZWF0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV4ZHRkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIERURC4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0dGFnLmh0bWwiIHRpdGxlPSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIj5FZGl0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsaW5mbyI+PHN0cm9uZz5SZWxhdGVkIGluZm9ybWF0aW9uPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIj5YTUwgbmFtZXNwYWNlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRjbnN0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRjbnN0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDQzY2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0ZWR0Y25zdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mDQotY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzDQotb24gYW5kIG9mZiB0byBwcm92aWRlIGZsZXhpYmlsaXR5IGluIHRoZSB3YXkgeW91IGVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbg0KLXRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmVkaXRpbmcgd2l0aCBjb25zdHJhaW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5lZGl0aW5nIHdpdGggY29uc3RyYWludHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPiBXaGVuIHRoZSBjb25zdHJhaW50cyBhcmUgdHVybmVkIG9uLCBhbmQgeW91IGFyZSB3b3JraW5nIGluIHRoZQ0KLURlc2lnbiB2aWV3LCB0aGUgWE1MIGVkaXRvciBwcmV2ZW50cyB5b3UgZnJvbSBpbnNlcnRpbmcgZWxlbWVudHMsIGF0dHJpYnV0ZXMsDQotb3IgYXR0cmlidXRlIHZhbHVlcyBub3QgcGVybWl0dGVkIGJ5IHRoZSBydWxlcyBvZiB0aGUgWE1MIHNjaGVtYSBvciBEVEQsIGFuZA0KLWZyb20gcmVtb3ZpbmcgbmVjZXNzYXJ5IG9yIHByZWRlZmluZWQgc2V0cyBvZiB0YWdzIGFuZCB2YWx1ZXMuIEluIHRoaXMgbW9kZSwNCi1hbiBlbGVtZW50J3MgY29udGVudCBtdXN0IGJlIHZhbGlkIHRvIHVzZSB0aGUgWE1MIGVkaXRvcidzIGd1aWRlZCBlZGl0aW5nDQotb3B0aW9ucy48L3A+PHA+WW91IG1pZ2h0IHdhbnQgdG8gdHVybiB0aGUgY29uc3RyYWludHMgb2ZmIGZvciBhbiBYTUwgZmlsZQ0KLWlmIHlvdSBuZWVkIG1vcmUgZmxleGliaWxpdHkuIEZvciBleGFtcGxlLCB5b3Ugd2FudCB0byB0cnkgd29ya2luZyB3aXRoIGVsZW1lbnRzDQotb3IgYXR0cmlidXRlcyBub3QgcGVybWl0dGVkIGJ5IHRoZSBhc3NvY2lhdGVkIERURCBvciBYTUwgc2NoZW1hLCB3aXRob3V0IGFjdHVhbGx5DQotcmVtb3ZpbmcgdGhlIGFzc29jaWF0aW9uIHdpdGggdGhlIERURCBvciBYTUwgc2NoZW1hLjwvcD48cD5UbyB0dXJuIHRoZSBjb25zdHJhaW50cw0KLWZvciBhbiBYTUwgZmlsZSBvZmYsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+VHVybg0KLUdyYW1tYXIgQ29uc3RyYWludHMgT2ZmPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gaW4gdGhlIHRvb2xiYXIuIEFmdGVyIHlvdQ0KLWhhdmUgdHVybmVkIHRoZSBjb25zdHJhaW50cyBvZmYgZm9yIGEgZmlsZSwgeW91IGNhbiBpbnNlcnQgb3IgZGVsZXRlIGFueSBlbGVtZW50DQotb3IgYXR0cmlidXRlIHJlZ2FyZGxlc3Mgb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIHJ1bGVzLiBZb3UgY2FuIGNyZWF0ZSBuZXcNCi1lbGVtZW50cyBvciBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgRFREIG9yIHNjaGVtYSAtIHRoZXNlIERlc2lnbiB2aWV3DQotcHJvbXB0cyB3aWxsIG9ubHkgYXBwZWFyIHdoZW4geW91IGhhdmUgdHVybmVkIGNvbnN0cmFpbnRzIG9mZi4gVGhlIGZpbGUgbWlnaHQNCi1ub3QgYmUgdmFsaWQsIGhvd2V2ZXIsIGlmIHlvdSBkbyB0aGlzLiA8L3A+PHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzDQotd2hhdCB5b3UgY2FuIGRvIGlmIHlvdSB0dXJuIHRoZSBjb25zdHJhaW50cyBvZiBhIERURCBvZmY6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHRoZSBYTUwgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciAocmlnaHQtY2xpY2sgdGhlIGZpbGUgaW4gdGhlDQotTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+T3BlbiBXaXRoID4gWE1MIEVkaXRvcjwvdWljb250cm9sPikuIDwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBoYXZlIGEgRFREIHRoYXQgc3BlY2lmaWVzIHRoYXQgYW4gZWxlbWVudCByZXF1aXJlcyBhdCBsZWFzdA0KLW9uZSBvZiBhIHNwZWNpZmljIGNoaWxkIGVsZW1lbnQ6ICA8L2NtZD48aW5mbz48Y29kZWJsb2NrPiZsdDshRUxFTUVOVCBwYXJlbnRFbGVtZW50IChjaGlsZEVsZW1lbnQrKT4NCi08L2NvZGVibG9jaz48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYsIGluIGFuIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgeW91IGF0dGVtcHQgdG8gcmVtb3ZlDQotdGhlIGZpbmFsIGNoaWxkIGVsZW1lbnQgb2YgdGhlIGVsZW1lbnQgd2l0aCB0aGUgRFREIGNvbnN0cmFpbnRzIHR1cm5lZCBvbiwNCi10aGUgZWRpdG9yIHdpbGwgbm90IGFsbG93IHlvdSB0byBkbyB0aGlzLCBhcyBpdCB3aWxsIG1ha2UgdGhlIGRvY3VtZW50IGludmFsaWQuPC9jbWQ+DQotPGluZm8+WW91IGNhbiBjb25maXJtIHRoaXMgYnkgdXNpbmcgdGhlIGVsZW1lbnQncyBwb3AtdXAgbWVudSB0byB2ZXJpZnkgdGhhdA0KLXRoZSA8dWljb250cm9sPlJlbW92ZTwvdWljb250cm9sPiBvcHRpb24gaXMgZ3JheWVkIG91dC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gdHVybiB0aGUgRFREIGNvbnN0cmFpbnRzIG9mZiwgY2xpY2sgPHVpY29udHJvbD5YTUwgPiBUdXJuIEdyYW1tYXINCi1Db25zdHJhaW50cyBPZmY8L3VpY29udHJvbD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSBhdHRlbXB0IHRvIHJlbW92ZSB0aGUgc2FtZSBjaGlsZCBlbGVtZW50IHdpdGggY29uc3RyYWludHMNCi1vZmYsIHRoZSBlZGl0b3Igd2lsbCBhbGxvdyB5b3UgdG8uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gY29ycmVjdCB0aGUgaW52YWxpZCBkb2N1bWVudCwgeW91IHdpbGwgaGF2ZSB0byByZS1hZGQgdGhlIG5lY2Vzc2FyeQ0KLWVsZW1lbnQsIG9yIHJlbW92ZSB0aGUgaW52YWxpZCB0YWdnaW5nIG9yIHZhbHVlLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PD9QdWIgQ2FyZXQ/PjxwPklmIHlvdSBpbnRyb2R1Y2UgZXJyb3JzIGludG8geW91ciBmaWxlcywgeW91IG11c3QNCi1zYXZlIGFuZCB2YWxpZGF0ZSB0aGUgZmlsZSBpbiBvcmRlciB0byBzZWUgYSBsaXN0IG9mIHRoZSBlcnJvcnMgeW91IGhhdmUgaW50cm9kdWNlZC4NCi1UaGV5IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiBBZnRlciB5b3UgZml4IHRoZSBlcnJvcnMsIHlvdSBtdXN0DQotc2F2ZSBhbmQgdmFsaWRhdGUgeW91ciBmaWxlIGFnYWluIHRvIHNlZSBpZiB0aGUgZmlsZSBpcyBub3cgdmFsaWQuPC9wPjxwPlRoZXNlDQotaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28NCi13b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzgxND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjkzZWJjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGNuc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9yIHJ1bGVzIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YgY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdSBlZGl0LCBidXQgc3RpbGwgbWFpbnRhaW4gdGhlIHZhbGlkaXR5IG9mIHRoZSBkb2N1bWVudCBwZXJpb2RpY2FsbHkuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgZWRpdGluZyB3aXRoIGNvbnN0cmFpbnRzLCBYTUwgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nIHdpdGggY29uc3RyYWludHMsIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZWR0Y25zdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdGNuc3QiPjxhIG5hbWU9InRlZHRjbnN0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZgotY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzCi1vbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluCi10aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPiBXaGVuIHRoZSBjb25zdHJhaW50cyBhcmUgdHVybmVkIG9uLCBhbmQgeW91IGFyZSB3b3JraW5nIGluIHRoZQotRGVzaWduIHZpZXcsIHRoZSBYTUwgZWRpdG9yIHByZXZlbnRzIHlvdSBmcm9tIGluc2VydGluZyBlbGVtZW50cywgYXR0cmlidXRlcywKLW9yIGF0dHJpYnV0ZSB2YWx1ZXMgbm90IHBlcm1pdHRlZCBieSB0aGUgcnVsZXMgb2YgdGhlIFhNTCBzY2hlbWEgb3IgRFRELCBhbmQKLWZyb20gcmVtb3ZpbmcgbmVjZXNzYXJ5IG9yIHByZWRlZmluZWQgc2V0cyBvZiB0YWdzIGFuZCB2YWx1ZXMuIEluIHRoaXMgbW9kZSwKLWFuIGVsZW1lbnQncyBjb250ZW50IG11c3QgYmUgdmFsaWQgdG8gdXNlIHRoZSBYTUwgZWRpdG9yJ3MgZ3VpZGVkIGVkaXRpbmcKLW9wdGlvbnMuPC9wPgotPHA+WW91IG1pZ2h0IHdhbnQgdG8gdHVybiB0aGUgY29uc3RyYWludHMgb2ZmIGZvciBhbiBYTUwgZmlsZQotaWYgeW91IG5lZWQgbW9yZSBmbGV4aWJpbGl0eS4gRm9yIGV4YW1wbGUsIHlvdSB3YW50IHRvIHRyeSB3b3JraW5nIHdpdGggZWxlbWVudHMKLW9yIGF0dHJpYnV0ZXMgbm90IHBlcm1pdHRlZCBieSB0aGUgYXNzb2NpYXRlZCBEVEQgb3IgWE1MIHNjaGVtYSwgd2l0aG91dCBhY3R1YWxseQotcmVtb3ZpbmcgdGhlIGFzc29jaWF0aW9uIHdpdGggdGhlIERURCBvciBYTUwgc2NoZW1hLjwvcD4KLTxwPlRvIHR1cm4gdGhlIGNvbnN0cmFpbnRzCi1mb3IgYW4gWE1MIGZpbGUgb2ZmLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UdXJuCi1HcmFtbWFyIENvbnN0cmFpbnRzIE9mZjwvc3Bhbj48L3NwYW4+IGluIHRoZSB0b29sYmFyLiBBZnRlciB5b3UKLWhhdmUgdHVybmVkIHRoZSBjb25zdHJhaW50cyBvZmYgZm9yIGEgZmlsZSwgeW91IGNhbiBpbnNlcnQgb3IgZGVsZXRlIGFueSBlbGVtZW50Ci1vciBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgcnVsZXMuIFlvdSBjYW4gY3JlYXRlIG5ldwotZWxlbWVudHMgb3IgYXR0cmlidXRlcyB0aGF0IGFyZSBub3QgaW4gdGhlIERURCBvciBzY2hlbWEgLSB0aGVzZSBEZXNpZ24gdmlldwotcHJvbXB0cyB3aWxsIG9ubHkgYXBwZWFyIHdoZW4geW91IGhhdmUgdHVybmVkIGNvbnN0cmFpbnRzIG9mZi4gVGhlIGZpbGUgbWlnaHQKLW5vdCBiZSB2YWxpZCwgaG93ZXZlciwgaWYgeW91IGRvIHRoaXMuIDwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cwotd2hhdCB5b3UgY2FuIGRvIGlmIHlvdSB0dXJuIHRoZSBjb25zdHJhaW50cyBvZiBhIERURCBvZmY6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB0aGUgWE1MIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IgKHJpZ2h0LWNsaWNrIHRoZSBmaWxlIGluIHRoZQotTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4gV2l0aCAmZ3Q7IFhNTCBFZGl0b3I8L3NwYW4+KS4gPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgaGF2ZSBhIERURCB0aGF0IHNwZWNpZmllcyB0aGF0IGFuIGVsZW1lbnQgcmVxdWlyZXMgYXQgbGVhc3QKLW9uZSBvZiBhIHNwZWNpZmljIGNoaWxkIGVsZW1lbnQ6ICA8L3NwYW4+IDxwcmU+Jmx0OyFFTEVNRU5UIHBhcmVudEVsZW1lbnQgKGNoaWxkRWxlbWVudCspJmd0OwotPC9wcmU+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmLCBpbiBhbiBYTUwgZmlsZSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIHlvdSBhdHRlbXB0IHRvIHJlbW92ZQotdGhlIGZpbmFsIGNoaWxkIGVsZW1lbnQgb2YgdGhlIGVsZW1lbnQgd2l0aCB0aGUgRFREIGNvbnN0cmFpbnRzIHR1cm5lZCBvbiwKLXRoZSBlZGl0b3Igd2lsbCBub3QgYWxsb3cgeW91IHRvIGRvIHRoaXMsIGFzIGl0IHdpbGwgbWFrZSB0aGUgZG9jdW1lbnQgaW52YWxpZC48L3NwYW4+Ci0gWW91IGNhbiBjb25maXJtIHRoaXMgYnkgdXNpbmcgdGhlIGVsZW1lbnQncyBwb3AtdXAgbWVudSB0byB2ZXJpZnkgdGhhdAotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbW92ZTwvc3Bhbj4gb3B0aW9uIGlzIGdyYXllZCBvdXQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyB0dXJuIHRoZSBEVEQgY29uc3RyYWludHMgb2ZmLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgJmd0OyBUdXJuIEdyYW1tYXIKLUNvbnN0cmFpbnRzIE9mZjwvc3Bhbj4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSBhdHRlbXB0IHRvIHJlbW92ZSB0aGUgc2FtZSBjaGlsZCBlbGVtZW50IHdpdGggY29uc3RyYWludHMKLW9mZiwgdGhlIGVkaXRvciB3aWxsIGFsbG93IHlvdSB0by48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBjb3JyZWN0IHRoZSBpbnZhbGlkIGRvY3VtZW50LCB5b3Ugd2lsbCBoYXZlIHRvIHJlLWFkZCB0aGUgbmVjZXNzYXJ5Ci1lbGVtZW50LCBvciByZW1vdmUgdGhlIGludmFsaWQgdGFnZ2luZyBvciB2YWx1ZS48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+SWYgeW91IGludHJvZHVjZSBlcnJvcnMgaW50byB5b3VyIGZpbGVzLCB5b3UgbXVzdAotc2F2ZSBhbmQgdmFsaWRhdGUgdGhlIGZpbGUgaW4gb3JkZXIgdG8gc2VlIGEgbGlzdCBvZiB0aGUgZXJyb3JzIHlvdSBoYXZlIGludHJvZHVjZWQuCi1UaGV5IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiBBZnRlciB5b3UgZml4IHRoZSBlcnJvcnMsIHlvdSBtdXN0Ci1zYXZlIGFuZCB2YWxpZGF0ZSB5b3VyIGZpbGUgYWdhaW4gdG8gc2VlIGlmIHRoZSBmaWxlIGlzIG5vdyB2YWxpZC48L3A+Ci08cD5UaGVzZQotaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28KLXdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiB0aXRsZT0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIHRpdGxlPSJYTUwgQ2F0YWxvZyBlbnRyaWVzIGFyZSB1c2VkIHRvIG1hcCBleHRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlcyB0byBsb2NhbGx5IGRlZmluZWQgcmVzb3VyY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgc3BlY2lmeSBob3cgdGhlc2UgZW50aXRpZXMgYXJlIHJlc29sdmVkIj5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiB0aXRsZT0iSWYgeW91IG1ha2UgY2hhbmdlcyB0byBhIERURCBmaWxlIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBmaWxlICh0aGF0IGlzIGN1cnJlbnRseSBvcGVuKSwgY2xpY2sgWE1MICZndDsgUmVsb2FkIERlcGVuZGVuY2llcyB0byB1cGRhdGUgdGhlIFhNTCBmaWxlIHdpdGggdGhlc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIGd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuIj5VcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgdGl0bGU9IllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuIj5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRkb2MuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWMwNTMxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0ZWR0ZG9jIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZw0KLW9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24NCi10byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkRPQ1RZUEUgZGVjbGFyYXRpb25zPGluZGV4dGVybT5YTUwgZWRpdG9yPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5ET0NUWVBFIGRlY2xhcmF0aW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGVkaXQgeW91ciBET0NUWVBFDQotZGVjbGFyYXRpb24sIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHJpZ2h0LWNsaWNrIDx1aWNvbnRyb2w+RE9DVFlQRTwvdWljb250cm9sPiBhbmQNCi1jbGljayA8dWljb250cm9sPkVkaXQgRE9DVFlQRTwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+Um9vdCBlbGVtZW50IG5hbWU8L3VpY29udHJvbD4gZmllbGQNCi1zaG91bGQgbWF0Y2ggdGhlIHJvb3QgZWxlbWVudCBvZiB5b3VyIFhNTCBmaWxlIGV4YWN0bHkuPC9jbWQ+PGluZm8+WW91IHNob3VsZA0KLW9ubHkgZWRpdCB0aGUgdmFsdWUgaW4gdGhpcyBmaWVsZCBpZiB5b3VyIHJvb3QgZWxlbWVudCBjaGFuZ2VzLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3UgY2FuIHNlbGVjdCBhIFB1YmxpYyBJRCBmb3IgYW55IGV4aXN0aW5nIFhNTCBDYXRhbG9nIGVudHJpZXMNCi1ieSBjbGlja2luZyA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPi4gPC9jbWQ+PGluZm8+VGhlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPlB1YmxpYw0KLUlEPC91aWNvbnRyb2w+IGZpZWxkIGlzIHRoZSBQdWJsaWMgSWRlbnRpZmllci4gSXQgaXMgdXNlZCB0byBhc3NvY2lhdGUgdGhlDQotWE1MIGZpbGUgKHVzaW5nIGFuIFhNTCBDYXRhbG9nIGVudHJ5KSB3aXRoIGEgRFREIGZpbGUuIEZvciBtb3JlIGluZm9ybWF0aW9uLA0KLXNlZSA8eHJlZiBmb3JtYXQ9ImRpdGEiIGhyZWY9InR4bWxjYXQuZGl0YSIgc2NvcGU9ImxvY2FsIj5BZGRpbmcgZW50cmllcyB0bw0KLXRoZSBYTUwgQ2F0YWxvZzwveHJlZj4uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5TeXN0ZW0gSUQ8L3VpY29udHJvbD4gZmllbGQgaXMgdGhlDQotRFREIHRoZSBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIFR5cGUgdGhlIHBhdGggb2YgdGhlIERURCBmaWxlIChvciBicm93c2UNCi1mb3IgaXQpIHlvdSB3YW50IHRoZSBYTUwgZmlsZSBhc3NvY2lhdGVkIHdpdGggaW4gdGhpcyBmaWVsZC4gPC9jbWQ+PGluZm8+IDxub3RlPldoZW4NCi10aGUgWE1MIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBYTUwgcHJvY2Vzc29yLCBpdCB3aWxsIGZpcnN0IHRyeSB0byB1c2UgdGhlDQotUHVibGljIElEIHRvIGxvY2F0ZSB0aGUgRFRELCBhbmQgaWYgdGhpcyBmYWlscywgaXQgd2lsbCB1c2UgdGhlIFN5c3RlbSBJRA0KLXRvIGZpbmQgaXQuPC9ub3RlPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayAgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT5JZiB5b3UgZG8gbm90IGhhdmUgYSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIHlvdXIgWE1MIGZpbGUsIHlvdSBjYW4NCi1yaWdodC1jbGljayBpbiB0aGUgRGVzaWduIHZpZXcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIERURCBJbmZvcm1hdGlvbjwvdWljb250cm9sPiB0bw0KLWFkZCBvbmUuPC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NDkyOTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIGVkaXQgeW91ciBET0NUWVBFIGRlY2xhcmF0aW9uIHRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIGVkaXQgeW91ciBET0NUWVBFIGRlY2xhcmF0aW9uIHRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIiAvPgotPG1ldGEgY29udGVudD0iRE9DVFlQRSBkZWNsYXJhdGlvbnMsIFhNTCBlZGl0b3IiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJET0NUWVBFIGRlY2xhcmF0aW9ucywgWE1MIGVkaXRvciIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdGRvYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlZHRkb2MiPjxhIG5hbWU9InRlZHRkb2MiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZwotb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbgotdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gZWRpdCB5b3VyIERPQ1RZUEUKLWRlY2xhcmF0aW9uLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RE9DVFlQRTwvc3Bhbj4gYW5kCi1jbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0IERPQ1RZUEU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSB2YWx1ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Um9vdCBlbGVtZW50IG5hbWU8L3NwYW4+IGZpZWxkCi1zaG91bGQgbWF0Y2ggdGhlIHJvb3QgZWxlbWVudCBvZiB5b3VyIFhNTCBmaWxlIGV4YWN0bHkuPC9zcGFuPiBZb3Ugc2hvdWxkCi1vbmx5IGVkaXQgdGhlIHZhbHVlIGluIHRoaXMgZmllbGQgaWYgeW91ciByb290IGVsZW1lbnQgY2hhbmdlcy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gc2VsZWN0IGEgUHVibGljIElEIGZvciBhbnkgZXhpc3RpbmcgWE1MIENhdGFsb2cgZW50cmllcwotYnkgY2xpY2tpbmcgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPi4gPC9zcGFuPiBUaGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlB1YmxpYwotSUQ8L3NwYW4+IGZpZWxkIGlzIHRoZSBQdWJsaWMgSWRlbnRpZmllci4gSXQgaXMgdXNlZCB0byBhc3NvY2lhdGUgdGhlCi1YTUwgZmlsZSAodXNpbmcgYW4gWE1MIENhdGFsb2cgZW50cnkpIHdpdGggYSBEVEQgZmlsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sCi1zZWUgPGEgaHJlZj0idHhtbGNhdC5odG1sIj5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L2E+LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TeXN0ZW0gSUQ8L3NwYW4+IGZpZWxkIGlzIHRoZQotRFREIHRoZSBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIFR5cGUgdGhlIHBhdGggb2YgdGhlIERURCBmaWxlIChvciBicm93c2UKLWZvciBpdCkgeW91IHdhbnQgdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBpbiB0aGlzIGZpZWxkLiA8L3NwYW4+ICA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gV2hlbgotdGhlIFhNTCBmaWxlIGlzIHByb2Nlc3NlZCBieSB0aGUgWE1MIHByb2Nlc3NvciwgaXQgd2lsbCBmaXJzdCB0cnkgdG8gdXNlIHRoZQotUHVibGljIElEIHRvIGxvY2F0ZSB0aGUgRFRELCBhbmQgaWYgdGhpcyBmYWlscywgaXQgd2lsbCB1c2UgdGhlIFN5c3RlbSBJRAotdG8gZmluZCBpdC48L2Rpdj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+SWYgeW91IGRvIG5vdCBoYXZlIGEgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiB5b3VyIFhNTCBmaWxlLCB5b3UgY2FuCi1yaWdodC1jbGljayBpbiB0aGUgRGVzaWduIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBEVEQgSW5mb3JtYXRpb248L3NwYW4+IHRvCi1hZGQgb25lLjwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIHRpdGxlPSJJbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YgY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdSBlZGl0LCBidXQgc3RpbGwgbWFpbnRhaW4gdGhlIHZhbGlkaXR5IG9mIHRoZSBkb2N1bWVudCBwZXJpb2RpY2FsbHkuIj5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIHRpdGxlPSJYTUwgQ2F0YWxvZyBlbnRyaWVzIGFyZSB1c2VkIHRvIG1hcCBleHRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlcyB0byBsb2NhbGx5IGRlZmluZWQgcmVzb3VyY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgc3BlY2lmeSBob3cgdGhlc2UgZW50aXRpZXMgYXJlIHJlc29sdmVkIj5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiB0aXRsZT0iSWYgeW91IG1ha2UgY2hhbmdlcyB0byBhIERURCBmaWxlIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBmaWxlICh0aGF0IGlzIGN1cnJlbnRseSBvcGVuKSwgY2xpY2sgWE1MICZndDsgUmVsb2FkIERlcGVuZGVuY2llcyB0byB1cGRhdGUgdGhlIFhNTCBmaWxlIHdpdGggdGhlc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIGd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuIj5VcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSB3aXRoIE5vZGUgYW5kIENvbnRlbnQgY29sdW1ucyBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRlbmMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2JlZTFkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRlZHRlbmMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5TcGVjaWZ5aW5nIGxpbmUgZGVsaW1pdGVyczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgYW5kIHRoZSB0ZXh0IGVuY29kaW5nDQotdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYW4gWE1MIHJlbGF0ZWQgZmlsZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPnNwZWNpZnlpbmcgbGluZSBkZWxpbWl0ZXJzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5saW5lIGRlbGltaXRlcnM8aW5kZXh0ZXJtPlhNTCBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPGtleXdvcmRzPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VG8gc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgeW91IHdhbnQgdG8gdXNlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nDQotc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUZpbGVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgPHVpY29udHJvbD5FbmNvZGluZzwvdWljb250cm9sPiBmaWVsZCwgc3BlY2lmeSB0aGUgZGVmYXVsdA0KLWNoYXJhY3RlciBlbmNvZGluZyBzZXQgdGhhdCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgWE1MIHJlbGF0ZWQgZmlsZXMgKERURHMsDQotWE1MIGZpbGVzLCBYTUwgc2NoZW1hcykuIENoYW5naW5nIHRoZSBlbmNvZGluZyBjYXVzZXMgYW55IG5ldywgWE1MIHJlbGF0ZWQNCi1maWxlcyB0aGF0IGFyZSBjcmVhdGVkIGZyb20gc2NyYXRjaCB0byB1c2UgdGhlIHNlbGVjdGVkIGVuY29kaW5nLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+PHVpY29udHJvbD5Xb3Jrc3BhY2U8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBpbiB0aGUgbGVmdCBwYW5lIG9mIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3cgYW5kIGNob3NlIGVpdGhlciA8dWljb250cm9sPkRlZmF1bHQ8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5PdGhlcjwvdWljb250cm9sPiBpbg0KLXRoZSA8dWljb250cm9sPk5ldyB0ZXh0IGZpbGUgbGluZSBkZWxpbWl0ZXIgPC91aWNvbnRyb2w+c2VjdGlvbi4gU2VsZWN0IHRoZQ0KLW9wZXJhdGluZyBzeXN0ZW0gdGhhdCBhcHBsaWVzIHRvIHlvdXIgZGV2ZWxvcG1lbnQgb3IgZGVwbG95bWVudCBwbGF0Zm9ybSBmcm9tDQotdGhlIDx1aWNvbnRyb2w+T3RoZXI8L3VpY29udHJvbD4gZHJvcCBkb3duIGxpc3QuPC9jbWQ+PC9zdGVwPjw/UHViIENhcmV0Pz4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPkFwcGx5PC91aWNvbnRyb2w+LCB0aGVuIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjAwMj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZW5jLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRlbmMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzMDc4Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRlbmMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciBhbmQgdGhlIHRleHQgZW5jb2RpbmcgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYW4gWE1MIHJlbGF0ZWQgZmlsZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhbiBYTUwgcmVsYXRlZCBmaWxlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgc3BlY2lmeWluZyBsaW5lIGRlbGltaXRlcnMsIGxpbmUgZGVsaW1pdGVycyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgc3BlY2lmeWluZyBsaW5lIGRlbGltaXRlcnMsIGxpbmUgZGVsaW1pdGVycyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdGVuYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNwZWNpZnlpbmcgbGluZSBkZWxpbWl0ZXJzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZWR0ZW5jIj48YSBuYW1lPSJ0ZWR0ZW5jIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TcGVjaWZ5aW5nIFhNTCBkZWZhdWx0IGVuY29kaW5nIGxpbmUgZGVsaW1pdGVyczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZwotdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYW4gWE1MIHJlbGF0ZWQgZmlsZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIHlvdSB3YW50IHRvIHVzZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZwotc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLTwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwKLUZpbGVzPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5Gcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FbmNvZGluZzwvc3Bhbj4gZmllbGQsIHNwZWNpZnkgdGhlIGRlZmF1bHQKLWNoYXJhY3RlciBlbmNvZGluZyBzZXQgdGhhdCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgWE1MIHJlbGF0ZWQgZmlsZXMgKERURHMsCi1YTUwgZmlsZXMsIFhNTCBzY2hlbWFzKS4gQ2hhbmdpbmcgdGhlIGVuY29kaW5nIGNhdXNlcyBhbnkgbmV3LCBYTUwgcmVsYXRlZAotZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBmcm9tIHNjcmF0Y2ggdG8gdXNlIHRoZSBzZWxlY3RlZCBlbmNvZGluZy48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya3NwYWNlPC9zcGFuPgotPC9zcGFuPiBpbiB0aGUgbGVmdCBwYW5lIG9mIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3cgYW5kIGNob3NlIGVpdGhlciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZWZhdWx0PC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdGhlcjwvc3Bhbj4gaW4KLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXcgdGV4dCBmaWxlIGxpbmUgZGVsaW1pdGVyIDwvc3Bhbj5zZWN0aW9uLiBTZWxlY3QgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIHRoYXQgYXBwbGllcyB0byB5b3VyIGRldmVsb3BtZW50IG9yIGRlcGxveW1lbnQgcGxhdGZvcm0gZnJvbQotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPiBkcm9wIGRvd24gbGlzdC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj4sIHRoZW4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iIC8+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRncmFtLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRncmFtLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODgxNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0ZWR0Z3JhbSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+VXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aA0KLWFuIFhNTCBmaWxlICh0aGF0IGlzIGN1cnJlbnRseSBvcGVuKSwgY2xpY2sgPHVpY29udHJvbD5YTUwgPiBSZWxvYWQgRGVwZW5kZW5jaWVzPC91aWNvbnRyb2w+IHRvDQotdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZQ0KLWd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+dXBkYXRpbmcgWE1MIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPnVwZGF0aW5nIHdpdGggYXNzb2NpYXRlZCBjaGFuZ2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYSBEVEQgZmlsZSBjYWxsZWQgIkNvbnRhY3QuZHRkIiBhbmQgYW4gWE1MDQotZmlsZSBjYWxsZWQgIkNvbnRhY3QueG1sIiBhc3NvY2lhdGVkIHdpdGggaXQuIENvbnRhY3QuZHRkIGNvbnRhaW5zIGEgcm9vdA0KLWVsZW1lbnQgY2FsbGVkIDx1c2VyaW5wdXQ+Q29udGFjdDwvdXNlcmlucHV0PiB0aGF0IGNhbiBjb250YWluIGFueSBvZiB0aGUNCi1mb2xsb3dpbmcgY2hpbGRyZW4gZWxlbWVudHM6ICA8dXNlcmlucHV0Pk5hbWU8L3VzZXJpbnB1dD4sIDx1c2VyaW5wdXQ+UG9zdGFsQWRkcmVzczwvdXNlcmlucHV0Piw8P1B1YiBDYXJldD8+IDx1c2VyaW5wdXQ+RW1haWw8L3VzZXJpbnB1dD4uDQotSWYgeW91IHJlbW92ZSB0aGUgY2hpbGQgZWxlbWVudCAgPHVzZXJpbnB1dD5FbWFpbDwvdXNlcmlucHV0PiBmcm9tIHRoZSBEVEQsDQoteW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWRkIGFuICA8dXNlcmlucHV0PkVtYWlsPC91c2VyaW5wdXQ+IGNoaWxkIGVsZW1lbnQNCi10byB5b3VyIHJvb3QgZWxlbWVudCBDb250YWN0IGluIHlvdXIgQ29udGFjdC54bWwgZmlsZS4gVGhpcyBjaGFuZ2UsIGhvd2V2ZXIsDQotd2lsbCBub3QgY29tZSBpbnRvIGVmZmVjdCB1bnRpbCB5b3Ugc2F2ZSB5b3VyIGNoYW5nZXMgaW4gdGhlIERURCBhbmQgY2xpY2sgPHVpY29udHJvbD5YTUwNCi0+IFJlbG9hZCBEZXBlbmRlbmNpZXM8L3VpY29udHJvbD4gaW4gdGhlIFhNTCBlZGl0b3IuIFVudGlsIHlvdSBjbGljayBpdCwgeW91DQotd2lsbCBzdGlsbCBiZSBhYmxlIHRvIGFkZCA8dXNlcmlucHV0PkVtYWlsPC91c2VyaW5wdXQ+IGVsZW1lbnRzIHRvIENvbnRhY3QueG1sLjwvcD48cD5UaGlzDQotZmVhdHVyZSBpcyB2ZXJ5IGhhbmR5IHdoZW4geW91IGFyZSBtYWtpbmcgdXBkYXRlcyB0byBib3RoIERURHMgYW5kIFhNTCBzY2hlbWFzDQotYW5kIFhNTCBmaWxlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMuPC9wPjwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMTk4Nz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDRhMTE2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGdyYW0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIFhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXMgdG8gdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCB1cGRhdGluZyBYTUwgZmlsZXMsIFhNTCBmaWxlcywgdXBkYXRpbmcgd2l0aCBhc3NvY2lhdGVkIGNoYW5nZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCB1cGRhdGluZyBYTUwgZmlsZXMsIFhNTCBmaWxlcywgdXBkYXRpbmcgd2l0aCBhc3NvY2lhdGVkIGNoYW5nZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdGdyYW0iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5VcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdGdyYW0iPjxhIG5hbWU9InRlZHRncmFtIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5VcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+SWYgeW91IG1ha2UgY2hhbmdlcyB0byBhIERURCBmaWxlIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoCi1hbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXM8L3NwYW4+IHRvCi11cGRhdGUgdGhlIFhNTCBmaWxlIHdpdGggdGhlc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlCi1ndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+Rm9yIGV4YW1wbGUsIHlvdSBoYXZlIGEgRFREIGZpbGUgY2FsbGVkICJDb250YWN0LmR0ZCIgYW5kIGFuIFhNTAotZmlsZSBjYWxsZWQgIkNvbnRhY3QueG1sIiBhc3NvY2lhdGVkIHdpdGggaXQuIENvbnRhY3QuZHRkIGNvbnRhaW5zIGEgcm9vdAotZWxlbWVudCBjYWxsZWQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5Db250YWN0PC9rYmQ+IHRoYXQgY2FuIGNvbnRhaW4gYW55IG9mIHRoZQotZm9sbG93aW5nIGNoaWxkcmVuIGVsZW1lbnRzOiAgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5OYW1lPC9rYmQ+LCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPlBvc3RhbEFkZHJlc3M8L2tiZD4sIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+RW1haWw8L2tiZD4uCi1JZiB5b3UgcmVtb3ZlIHRoZSBjaGlsZCBlbGVtZW50ICA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkVtYWlsPC9rYmQ+IGZyb20gdGhlIERURCwKLXlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFkZCBhbiAgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5FbWFpbDwva2JkPiBjaGlsZCBlbGVtZW50Ci10byB5b3VyIHJvb3QgZWxlbWVudCBDb250YWN0IGluIHlvdXIgQ29udGFjdC54bWwgZmlsZS4gVGhpcyBjaGFuZ2UsIGhvd2V2ZXIsCi13aWxsIG5vdCBjb21lIGludG8gZWZmZWN0IHVudGlsIHlvdSBzYXZlIHlvdXIgY2hhbmdlcyBpbiB0aGUgRFREIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwKLSZndDsgUmVsb2FkIERlcGVuZGVuY2llczwvc3Bhbj4gaW4gdGhlIFhNTCBlZGl0b3IuIFVudGlsIHlvdSBjbGljayBpdCwgeW91Ci13aWxsIHN0aWxsIGJlIGFibGUgdG8gYWRkIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+RW1haWw8L2tiZD4gZWxlbWVudHMgdG8gQ29udGFjdC54bWwuPC9wPgotPHA+VGhpcwotZmVhdHVyZSBpcyB2ZXJ5IGhhbmR5IHdoZW4geW91IGFyZSBtYWtpbmcgdXBkYXRlcyB0byBib3RoIERURHMgYW5kIFhNTCBzY2hlbWFzCi1hbmQgWE1MIGZpbGVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcy48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiB0aXRsZT0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9yIHJ1bGVzIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiI+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiB0aXRsZT0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIHRpdGxlPSJYTUwgQ2F0YWxvZyBlbnRyaWVzIGFyZSB1c2VkIHRvIG1hcCBleHRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlcyB0byBsb2NhbGx5IGRlZmluZWQgcmVzb3VyY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgc3BlY2lmeSBob3cgdGhlc2UgZW50aXRpZXMgYXJlIHJlc29sdmVkIj5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIHRpdGxlPSJZb3VyIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgWE1MIGZpbGUsIHN1Y2ggYXMgdGhlIFhNTCBzY2hlbWEgYW5kIG5hbWVzcGFjZSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIElmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHRoZSBzY2hlbWEgYW5kIG5hbWVzcGFjZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBvciBhZGQgYSBuZXcgYXNzb2NpYXRpb24uIE1vZGlmeWluZyBhbnkgYXNzb2NpYXRpb25zIGNhbiBpbXBhY3Qgd2hhdCBjb250ZW50IGlzIGFsbG93ZWQgaW4gdGhlIFhNTCBmaWxlLiI+RWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb248L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzk5ZDExLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGVkdHByb2MiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JZiB5b3UgaGF2ZSBpbnN0cnVjdGlvbnMgeW91IHdhbnQgdG8gc2VuZCB0byBhbiBhcHBsaWNhdGlvbiB1c2luZw0KLWFuIFhNTCBkb2N1bWVudCwgeW91IGNhbiB1c2UgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiA8L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5wcm9jZXNzaW5nIGluc3RydWN0aW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5wcm9jZXNzaW5nIGluc3RydWN0aW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VG8gY3JlYXRlIGEgbmV3IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIHJpZ2h0LWNsaWNrIGluIHRoZSBEZXNpZ24NCi12aWV3LCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgQ2hpbGQ8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+QWRkIEJlZm9yZTwvdWljb250cm9sPiBvciA8dWljb250cm9sPkFkZA0KLUFmdGVyPC91aWNvbnRyb2w+LCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+QWRkIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb248L3VpY29udHJvbD4uPC9wPjxwPlRvDQotZWRpdCBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gaW4gdGhlIFhNTCBlZGl0b3IgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHlvdXINCi1wcm9jZXNzaW5nIGluc3RydWN0aW9uLCBhbmQgY2xpY2sgPHVpY29udHJvbD5FZGl0IFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb248L3VpY29udHJvbD4uDQotWW91IGNhbiBjaGFuZ2UgdGhlIHZhbHVlcyBpbiB0aGUgZm9sbG93aW5nIGZpZWxkczo8L3A+PHVsPg0KLTxsaT5UaGUgPHVpY29udHJvbD5UYXJnZXQ8L3VpY29udHJvbD4gZmllbGQgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgYXBwbGljYXRpb24NCi10aGUgaW5zdHJ1Y3Rpb25zIGJlbG9uZ3MgdG8uPC9saT4NCi08bGk+VGhlIDx1aWNvbnRyb2w+RGF0YTwvdWljb250cm9sPiBmaWVsZCBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb25zLjwvbGk+DQotPC91bD48L2NvbnRleHQ+DQotPHBvc3RyZXE+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0byBzYXZlIHlvdXIgc2V0dGluZ3MuPG5vdGU+VGhlc2U8P1B1YiBDYXJldD8+DQotaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28NCi13b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvbm90ZT48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDE2NTA/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U4ZGE2Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcm9jLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJJZiB5b3UgaGF2ZSBpbnN0cnVjdGlvbnMgeW91IHdhbnQgdG8gc2VuZCB0byBhbiBhcHBsaWNhdGlvbiB1c2luZyBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSWYgeW91IGhhdmUgaW5zdHJ1Y3Rpb25zIHlvdSB3YW50IHRvIHNlbmQgdG8gYW4gYXBwbGljYXRpb24gdXNpbmcgYW4gWE1MIGRvY3VtZW50LCB5b3UgY2FuIHVzZSBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBYTUwgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZWR0cHJvYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZWR0cHJvYyI+PGEgbmFtZT0idGVkdHByb2MiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9oMT4KLQotCi0KLQotPGRpdj48cD5JZiB5b3UgaGF2ZSBpbnN0cnVjdGlvbnMgeW91IHdhbnQgdG8gc2VuZCB0byBhbiBhcHBsaWNhdGlvbiB1c2luZwotYW4gWE1MIGRvY3VtZW50LCB5b3UgY2FuIHVzZSBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIDwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gY3JlYXRlIGEgbmV3IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIHJpZ2h0LWNsaWNrIGluIHRoZSBEZXNpZ24KLXZpZXcsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQ2hpbGQ8L3NwYW4+LCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQmVmb3JlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLUFmdGVyPC9zcGFuPiwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbjwvc3Bhbj4uPC9wPgotPHA+VG8KLWVkaXQgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGluIHRoZSBYTUwgZWRpdG9yIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB5b3VyCi1wcm9jZXNzaW5nIGluc3RydWN0aW9uLCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdCBQcm9jZXNzaW5nIEluc3RydWN0aW9uPC9zcGFuPi4KLVlvdSBjYW4gY2hhbmdlIHRoZSB2YWx1ZXMgaW4gdGhlIGZvbGxvd2luZyBmaWVsZHM6PC9wPgotPHVsPgotPGxpPlRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXQ8L3NwYW4+IGZpZWxkIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGFwcGxpY2F0aW9uCi10aGUgaW5zdHJ1Y3Rpb25zIGJlbG9uZ3MgdG8uPC9saT4KLQotPGxpPlRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EYXRhPC9zcGFuPiBmaWVsZCBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb25zLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvIHNhdmUgeW91ciBzZXR0aW5ncy48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhlc2UKLWluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvCi13b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvZGl2PgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSB3aXRoIE5vZGUgYW5kIENvbnRlbnQgY29sdW1ucyBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2guZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmM3MGM5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDgsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIFN0eSBfZGlzcGxheSBGb250Q29sb3I9InJlZCI/Pg0KLTx0YXNrIGlkPSJ0ZWR0c2NoIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb248L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24NCi1hYm91dCB0aGUgWE1MIGZpbGUsIHN1Y2ggYXMgdGhlIFhNTCBzY2hlbWEgYW5kIG5hbWVzcGFjZSBpdCBpcyBhc3NvY2lhdGVkDQotd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MDQotZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucw0KLWNhbiBpbXBhY3Qgd2hhdCBjb250ZW50IGlzIGFsbG93ZWQgaW4gdGhlIFhNTCBmaWxlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPm5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5uYW1lc3BhY2UgaW5mb3JtYXRpb248L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWVkaXQgeW91ciBzY2hlbWEgaW5mb3JtYXRpb24sIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHJpZ2h0LWNsaWNrIHlvdXINCi1yb290IGVsZW1lbnQgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RWRpdCBOYW1lc3BhY2VzPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPllvdXIgWE1MIGZpbGUgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBtb3JlIHRoYW4gb25lIG5hbWVzcGFjZQ0KLW9yIHNjaGVtYS48L2NtZD48aW5mbz5TZWxlY3QgdGhlIGVudHJ5IHlvdSB3YW50IHRvIGVkaXQgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPi48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPk5hbWVzcGFjZSBOYW1lPC91aWNvbnRyb2w+IGZpZWxkDQotaXMgYSBuYW1lc3BhY2UgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC48L2NtZD48aW5mbz5Zb3VyIFhNTA0KLWZpbGUgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZSBuYW1lc3BhY2UocykgaXRzIFhNTCBzY2hlbWENCi1pcyBhc3NvY2lhdGVkIHdpdGguIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG5hbWVzcGFjZXMsIHJlZmVyIHRvDQotdGhlIHJlbGF0ZWQgcmVmZXJlbmNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDx4cmVmDQotaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmRpdGEiDQotc2NvcGU9InBlZXIiPlhNTCBuYW1lc3BhY2VzPC94cmVmPi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+QWxsIHF1YWxpZmllZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB0aGUgWE08P1B1YiBDYXJldD8+TA0KLWZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lc3BhY2Ugd2lsbCBiZSBwcmVmaXhlZCB3aXRoIHRoZSA8dWljb250cm9sPlByZWZpeDwvdWljb250cm9sPiB2YWx1ZS48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgPHVpY29udHJvbD5Mb2NhdGlvbiBIaW50PC91aWNvbnRyb2w+IGZpZWxkIGNvbnRhaW5zDQotdGhlIGxvY2F0aW9uIG9mIHRoZSBYTUwgc2NoZW1hIHRoZSBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguPC9jbWQ+DQotPGluZm8+QW4gWE1MIENhdGFsb2cgS2V5IG9yIGEgbmFtZXNwYWNlIG5hbWUgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGlzDQotZmllbGQuIENsaWNrIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IHRvIHZpZXcgYWxsIFhNTCBzY2hlbWFzDQotaW4gdGhlIHdvcmtiZW5jaCBhbmQgWE1MIENhdGFsb2cuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4sIHRoZW4gY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiBhZ2Fpbi48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPklmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBhc3NvY2lhdGlvbiwgY2xpY2sgPHVpY29udHJvbD5BZGQ8L3VpY29udHJvbD4gaW5zdGVhZA0KLW9mIDx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPi4gWW91IGNhbiB0aGVuIGVpdGhlciBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+U3BlY2lmeQ0KLUZyb20gUmVnaXN0ZXJlZCBOYW1lc3BhY2U8L3VpY29udHJvbD4gcmFkaW8gYnV0dG9uIGFuZCBzZWxlY3QgdGhlDQotbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB5b3Ugd2FudCB0byBhZGQgb3Igc2VsZWN0IHRoZSA8dWljb250cm9sPlNwZWNpZnkNCi1OZXcgTmFtZXNwYWNlPC91aWNvbnRyb2w+IHJhZGlvIGJ1dHRvbiBhbmQgZmlsbCBpbiB0aGUgZmllbGRzIGFzIG5lY2Vzc2FyeS48L3A+PC9yZXN1bHQ+DQotPHBvc3RyZXE+SWYgeW91IGRvIG5vdCBoYXZlIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpbiB5b3VyIFhNTCBmaWxlLA0KLXlvdSBjYW4gcmlnaHQtY2xpY2sgeW91ciByb290IGVsZW1lbnQgaW4gdGhlIERlc2lnbiB2aWV3IGFuZCBjbGljayA8dWljb250cm9sPkVkaXQNCi1OYW1lc3BhY2VzPC91aWNvbnRyb2w+IHRvIGFkZCBpdC4gSWYgeW91IGRvIG5vdCBoYXZlIGEgcm9vdCBlbGVtZW50LA0KLXlvdSBtdXN0IGNyZWF0ZSBvbmUgYmVmb3JlIHlvdSBjYW4gYWRkIHRoZSBuYW1lc3BhY2UgaW5mb3JtYXRpb24uPC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzMjg4Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2guaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmQ4NzQzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgbmFtZXNwYWNlIGluZm9ybWF0aW9uLCBYTUwgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBuYW1lc3BhY2UgaW5mb3JtYXRpb24sIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlZHRzY2giIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdHNjaCI+PGEgbmFtZT0idGVkdHNjaCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb248L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgWE1MIGZpbGUsIHN1Y2ggYXMgdGhlIFhNTCBzY2hlbWEgYW5kIG5hbWVzcGFjZSBpdCBpcyBhc3NvY2lhdGVkCi13aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwKLWZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMKLWNhbiBpbXBhY3Qgd2hhdCBjb250ZW50IGlzIGFsbG93ZWQgaW4gdGhlIFhNTCBmaWxlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UKLXBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotZWRpdCB5b3VyIHNjaGVtYSBpbmZvcm1hdGlvbiwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHJpZ2h0LWNsaWNrIHlvdXIKLXJvb3QgZWxlbWVudCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdCBOYW1lc3BhY2VzPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdXIgWE1MIGZpbGUgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBtb3JlIHRoYW4gb25lIG5hbWVzcGFjZQotb3Igc2NoZW1hLjwvc3Bhbj4gU2VsZWN0IHRoZSBlbnRyeSB5b3Ugd2FudCB0byBlZGl0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lc3BhY2UgTmFtZTwvc3Bhbj4gZmllbGQKLWlzIGEgbmFtZXNwYWNlIHRoZSBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguPC9zcGFuPiBZb3VyIFhNTAotZmlsZSBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1lIG5hbWVzcGFjZShzKSBpdHMgWE1MIHNjaGVtYQotaXMgYXNzb2NpYXRlZCB3aXRoLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBuYW1lc3BhY2VzLCByZWZlciB0bwotdGhlIHJlbGF0ZWQgcmVmZXJlbmNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIj5YTUwgbmFtZXNwYWNlczwvYT4uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BbGwgcXVhbGlmaWVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHRoZSBYTUwKLWZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lc3BhY2Ugd2lsbCBiZSBwcmVmaXhlZCB3aXRoIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmaXg8L3NwYW4+IHZhbHVlLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkxvY2F0aW9uIEhpbnQ8L3NwYW4+IGZpZWxkIGNvbnRhaW5zCi10aGUgbG9jYXRpb24gb2YgdGhlIFhNTCBzY2hlbWEgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC48L3NwYW4+Ci0gQW4gWE1MIENhdGFsb2cgS2V5IG9yIGEgbmFtZXNwYWNlIG5hbWUgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGlzCi1maWVsZC4gQ2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiB0byB2aWV3IGFsbCBYTUwgc2NoZW1hcwotaW4gdGhlIHdvcmtiZW5jaCBhbmQgWE1MIENhdGFsb2cuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4sIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IGFnYWluLjwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPklmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBhc3NvY2lhdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkPC9zcGFuPiBpbnN0ZWFkCi1vZiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPi4gWW91IGNhbiB0aGVuIGVpdGhlciBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwZWNpZnkKLUZyb20gUmVnaXN0ZXJlZCBOYW1lc3BhY2U8L3NwYW4+IHJhZGlvIGJ1dHRvbiBhbmQgc2VsZWN0IHRoZQotbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB5b3Ugd2FudCB0byBhZGQgb3Igc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TcGVjaWZ5Ci1OZXcgTmFtZXNwYWNlPC9zcGFuPiByYWRpbyBidXR0b24gYW5kIGZpbGwgaW4gdGhlIGZpZWxkcyBhcyBuZWNlc3NhcnkuPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPklmIHlvdSBkbyBub3QgaGF2ZSBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaW4geW91ciBYTUwgZmlsZSwKLXlvdSBjYW4gcmlnaHQtY2xpY2sgeW91ciByb290IGVsZW1lbnQgaW4gdGhlIERlc2lnbiB2aWV3IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0Ci1OYW1lc3BhY2VzPC9zcGFuPiB0byBhZGQgaXQuIElmIHlvdSBkbyBub3QgaGF2ZSBhIHJvb3QgZWxlbWVudCwKLXlvdSBtdXN0IGNyZWF0ZSBvbmUgYmVmb3JlIHlvdSBjYW4gYWRkIHRoZSBuYW1lc3BhY2UgaW5mb3JtYXRpb24uPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgdGl0bGU9IkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZiBjb25zdHJhaW50cyBvciBydWxlcyBkZWZpbmVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gdHVybiB0aGUgY29uc3RyYWludHMgb24gYW5kIG9mZiB0byBwcm92aWRlIGZsZXhpYmlsaXR5IGluIHRoZSB3YXkgeW91IGVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS4iPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgdGl0bGU9IlhNTCBDYXRhbG9nIGVudHJpZXMgYXJlIHVzZWQgdG8gbWFwIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2VzIHRvIGxvY2FsbHkgZGVmaW5lZCByZXNvdXJjZXMuIFlvdSBjYW4gcHJvdmlkZSBydWxlcyBzcGVjaWZ5IGhvdyB0aGVzZSBlbnRpdGllcyBhcmUgcmVzb2x2ZWQiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIHRpdGxlPSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIHdpdGggTm9kZSBhbmQgQ29udGVudCBjb2x1bW5zIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxpbmZvIj48c3Ryb25nPlJlbGF0ZWQgaW5mb3JtYXRpb248L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwiPlhNTCBuYW1lc3BhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RzdWdzdHJhdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGI4ZjI4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InhtbHNvdXJjZXN1Z2dlc3Rpb25zdHJhdGVneSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3Q8L3RpdGxlPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBjdXN0b21pemUgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIHN1Z2dlc3Rpb25zIGdpdmVuIGJ5IGNvbnRlbnQNCi1hc3Npc3QgYnkgY2hvb3NpbmcgYSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHByZWZlcmVuY2UuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kNCi1pcyBzZXQgdG8gU3RyaWN0LCBzdWdnZXN0aW9ucyB0aGF0IGFyZSBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgZGlzcGxheWVkDQotZmlyc3QgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgaGlnaGxpZ2h0ZWQgYnkgYm9sZCBpY29ucy4gT3RoZXIgc3VnZ2VzdGlvbnMNCi10aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoaXMgZWxlbWVudCdzIHNjb3BlIGJ1dCBhcmUgbm90IGdyYW1tYXRpY2FsbHkgdmFsaWQNCi13aWxsIGJlIGRpc3BsYXllZCBsb3dlciBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIFdoZW4gdGhlIHN1Z2dlc3Rpb24NCi1zdHJhdGVneSBpcyBzZXQgdG8gTGF4LCBhbGwgc3VnZ2VzdGlvbnMgd2lsbCBkaXNwbGF5ZWQgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkDQotaWNvbnMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+c291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3k8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PlRvIHNldCB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0LCBjb21wbGV0ZSB0aGUNCi1mb2xsb3dpbmcgc3RlcHM6PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MDQotRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPkVkaXRvcjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+QmVzaWRlIDx1aWNvbnRyb2w+U3VnZ2VzdGlvbiBzdHJhdGVneTwvdWljb250cm9sPiBpbiB0aGUgQ29udGVudA0KLWFzc2lzdCBzZWN0aW9uLCBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHNldHRpbmcgKFN0cmljdCBvciBMYXgpLjwvY21kPjwvc3RlcD48P1B1YiBDYXJldD8+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkFwcGx5PC91aWNvbnRyb2w+LCB0aGVuIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8NCi1zYXZlIHlvdXIgc2V0dGluZ3M8L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08ZXhhbXBsZT48cD5UaGUgZm9sbG93aW5nIHNjcmVlbiBjYXB0dXJlIGRlbW9uc3RyYXRlcyBjb250ZW50IGFzc2lzdCB3aXRoDQotdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgc2V0IHRvICJTdHJpY3QiOjwvcD48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL3N1Z2dlc3Rpb24uZ2lmIg0KLXBsYWNlbWVudD0iYnJlYWsiPjxhbHQ+RXhhbXBsZSBvZiBTdHJpY3QgU3VnZ2VzdGlvbiBTdHJhdGVneTwvYWx0PjwvaW1hZ2U+PC9leGFtcGxlPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAxOTUwPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RzdWdzdHJhdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3Vnc3RyYXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxNjI0ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RzdWdzdHJhdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3QiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBjdXN0b21pemUgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIHN1Z2dlc3Rpb25zIGdpdmVuIGJ5IGNvbnRlbnQgYXNzaXN0IGJ5IGNob29zaW5nIGEgc3VnZ2VzdGlvbiBzdHJhdGVneSBwcmVmZXJlbmNlLiBXaGVuIHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGlzIHNldCB0byBTdHJpY3QsIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBkaXNwbGF5ZWQgZmlyc3QgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgaGlnaGxpZ2h0ZWQgYnkgYm9sZCBpY29ucy4gT3RoZXIgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGlzIGVsZW1lbnQncyBzY29wZSBidXQgYXJlIG5vdCBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgZGlzcGxheWVkIGxvd2VyIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBpcyBzZXQgdG8gTGF4LCBhbGwgc3VnZ2VzdGlvbnMgd2lsbCBkaXNwbGF5ZWQgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkIGljb25zLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIGN1c3RvbWl6ZSB0aGUgZm9ybWF0dGluZyBvZiB0aGUgc3VnZ2VzdGlvbnMgZ2l2ZW4gYnkgY29udGVudCBhc3Npc3QgYnkgY2hvb3NpbmcgYSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHByZWZlcmVuY2UuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvIFN0cmljdCwgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZCBmaXJzdCBpbiB0aGUgbGlzdCBvZiBvcHRpb25zIGFuZCBoaWdobGlnaHRlZCBieSBib2xkIGljb25zLiBPdGhlciBzdWdnZXN0aW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoaXMgZWxlbWVudCdzIHNjb3BlIGJ1dCBhcmUgbm90IGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBkaXNwbGF5ZWQgbG93ZXIgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkIGljb25zLiBXaGVuIHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGlzIHNldCB0byBMYXgsIGFsbCBzdWdnZXN0aW9ucyB3aWxsIGRpc3BsYXllZCBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2NkYXN0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0ieG1sc291cmNlc3VnZ2VzdGlvbnN0cmF0ZWd5IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InhtbHNvdXJjZXN1Z2dlc3Rpb25zdHJhdGVneSI+PGEgbmFtZT0ieG1sc291cmNlc3VnZ2VzdGlvbnN0cmF0ZWd5Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdDwvaDE+Ci0KLQotCi08ZGl2PjxwPllvdSBjYW4gY3VzdG9taXplIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBzdWdnZXN0aW9ucyBnaXZlbiBieSBjb250ZW50Ci1hc3Npc3QgYnkgY2hvb3NpbmcgYSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHByZWZlcmVuY2UuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kKLWlzIHNldCB0byBTdHJpY3QsIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBkaXNwbGF5ZWQKLWZpcnN0IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMgYW5kIGhpZ2hsaWdodGVkIGJ5IGJvbGQgaWNvbnMuIE90aGVyIHN1Z2dlc3Rpb25zCi10aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoaXMgZWxlbWVudCdzIHNjb3BlIGJ1dCBhcmUgbm90IGdyYW1tYXRpY2FsbHkgdmFsaWQKLXdpbGwgYmUgZGlzcGxheWVkIGxvd2VyIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4gV2hlbiB0aGUgc3VnZ2VzdGlvbgotc3RyYXRlZ3kgaXMgc2V0IHRvIExheCwgYWxsIHN1Z2dlc3Rpb25zIHdpbGwgZGlzcGxheWVkIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZAotaWNvbnMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBzZXQgdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdCwgY29tcGxldGUgdGhlCi1mb2xsb3dpbmcgc3RlcHM6PC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLTwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwKLUZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5CZXNpZGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3VnZ2VzdGlvbiBzdHJhdGVneTwvc3Bhbj4gaW4gdGhlIENvbnRlbnQKLWFzc2lzdCBzZWN0aW9uLCBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHNldHRpbmcgKFN0cmljdCBvciBMYXgpLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbHk8L3NwYW4+LCB0aGVuIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0bwotc2F2ZSB5b3VyIHNldHRpbmdzPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPlRoZSBmb2xsb3dpbmcgc2NyZWVuIGNhcHR1cmUgZGVtb25zdHJhdGVzIGNvbnRlbnQgYXNzaXN0IHdpdGgKLXRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHNldCB0byAiU3RyaWN0Ijo8L3A+Ci08YnIgLz48aW1nIHNyYz0iLi4vaW1hZ2VzL3N1Z2dlc3Rpb24uZ2lmIiBhbHQ9IkV4YW1wbGUgb2YgU3RyaWN0IFN1Z2dlc3Rpb24gU3RyYXRlZ3kiIC8+PGJyIC8+PC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y2Rhc3QuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmlzaCBhIHRhZyBvciBsaW5lIG9mIGNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGluc2VydCB0ZW1wbGF0ZXMgaW50byB5b3VyIFhNTCBjb2RlLiI+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVhODkxNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R0YWdoaWx0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idHRhZ2hpbHQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyB0aGUgWE1MIHNvdXJjZQ0KLWNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzDQotdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+c2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VG8gc2V0IGhpZ2hsaWdodGluZyBzdHlsZXMgZm9yIHRoZSBYTUwgY29kZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZw0KLXN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwNCi1GaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+IFN5bnRheCBDb2xvcmluZzwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPlN5bnRheCBFbGVtZW50PC91aWNvbnRyb2w+IGxpc3QsIHNlbGVjdCB0aGUgc291cmNlDQotdGFnIHR5cGUgdGhhdCB5b3Ugd2lzaCB0byBzZXQgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGFsc28gY2xpY2sNCi10ZXh0IGluIHRoZSA8dWljb250cm9sPlNhbXBsZSB0ZXh0PC91aWNvbnRyb2w+IGJveCB0byBzcGVjaWZ5IHRoZSBzb3VyY2UgdGFnDQotdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+Rm9yZWdyb3VuZDwvdWljb250cm9sPiBib3gsIHNlbGVjdCB0aGUgY29sb3INCi10aGF0IHlvdSB3YW50IHRoZSB0ZXh0IG9mIHRoZSB0YWcgdG8gYXBwZWFyIGluLCBhbmQgY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5CYWNrZ3JvdW5kPC91aWNvbnRyb2w+IGJveCwgc2VsZWN0IHRoZSBjb2xvcg0KLXRoYXQgeW91IHdhbnQgdG8gYXBwZWFyIGJlaGluZCB0aGUgdGFnLCBhbmQgY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIDx1aWNvbnRyb2w+Qm9sZDwvdWljb250cm9sPiBjaGVjayBib3ggaWYgeW91IHdhbnQgdG8NCi1tYWtlIHRoZSB0eXBlIGJvbGQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+IDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8gc2F2ZSB5b3VyIGNoYW5nZXMuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD5UbyBzZXQgdGhlIGhpZ2hsaWdodDw/UHViIENhcmV0Pz5pbmcgc3R5bGVzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdA0KLXZhbHVlcywgY2xpY2sgPHVpY29udHJvbD5SZXN0b3JlIERlZmF1bHQ8L3VpY29udHJvbD4uIElmIHlvdSBvbmx5IHdhbnQgdG8NCi1yZXNldCB0aGUgdmFsdWUgZm9yIGEgcGFydGljdWxhciBjb250ZW50IHR5cGUsIHNlbGVjdCBpdCBpbiB0aGUgPHVpY29udHJvbD5TeW50YXgNCi1FbGVtZW50PC91aWNvbnRyb2w+IGZpZWxkLCB0aGVuIGNsaWNrIHRoZSA8dWljb250cm9sPlJlc3RvcmUgRGVmYXVsdDwvdWljb250cm9sPiBidXR0b24uPC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDIyOTA/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5NmIxZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R0YWdoaWx0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIFhNTCBzb3VyY2UgY29kZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCBzdWNoIGFzIHRoZSBjb2xvcnMgdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIFhNTCBzb3VyY2UgY29kZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCBzdWNoIGFzIHRoZSBjb2xvcnMgdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgc2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0dGFnaGlsdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR0YWdoaWx0Ij48YSBuYW1lPSJ0dGFnaGlsdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+SWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyB0aGUgWE1MIHNvdXJjZQotY29kZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCBzdWNoIGFzIHRoZSBjb2xvcnMKLXRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gc2V0IGhpZ2hsaWdodGluZyBzdHlsZXMgZm9yIHRoZSBYTUwgY29kZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZwotc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLTwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwKLUZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiBTeW50YXggQ29sb3Jpbmc8L3NwYW4+PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN5bnRheCBFbGVtZW50PC9zcGFuPiBsaXN0LCBzZWxlY3QgdGhlIHNvdXJjZQotdGFnIHR5cGUgdGhhdCB5b3Ugd2lzaCB0byBzZXQgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGFsc28gY2xpY2sKLXRleHQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNhbXBsZSB0ZXh0PC9zcGFuPiBib3ggdG8gc3BlY2lmeSB0aGUgc291cmNlIHRhZwotdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Rm9yZWdyb3VuZDwvc3Bhbj4gYm94LCBzZWxlY3QgdGhlIGNvbG9yCi10aGF0IHlvdSB3YW50IHRoZSB0ZXh0IG9mIHRoZSB0YWcgdG8gYXBwZWFyIGluLCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QmFja2dyb3VuZDwvc3Bhbj4gYm94LCBzZWxlY3QgdGhlIGNvbG9yCi10aGF0IHlvdSB3YW50IHRvIGFwcGVhciBiZWhpbmQgdGhlIHRhZywgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Cb2xkPC9zcGFuPiBjaGVjayBib3ggaWYgeW91IHdhbnQgdG8KLW1ha2UgdGhlIHR5cGUgYm9sZC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPiA8L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHlvdXIgY2hhbmdlcy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gc2V0IHRoZSBoaWdobGlnaHRpbmcgc3R5bGVzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdAotdmFsdWVzLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZXN0b3JlIERlZmF1bHQ8L3NwYW4+LiBJZiB5b3Ugb25seSB3YW50IHRvCi1yZXNldCB0aGUgdmFsdWUgZm9yIGEgcGFydGljdWxhciBjb250ZW50IHR5cGUsIHNlbGVjdCBpdCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3ludGF4Ci1FbGVtZW50PC9zcGFuPiBmaWVsZCwgdGhlbiBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVzdG9yZSBEZWZhdWx0PC9zcGFuPiBidXR0b24uPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d2NkYXN0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5YTY0YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA5LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0d2NkYXN0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Vc2luZyBYTUwgY29udGVudCBhc3Npc3Q8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5pc2ggYSB0YWcgb3INCi1saW5lIG9mIGNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlDQotY29udGVudCBhc3Npc3QgdG8gaW5zZXJ0IHRlbXBsYXRlcyBpbnRvIHlvdXIgWE1MIGNvZGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+Y29udGVudCBhc3Npc3Q8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+Y29udGVudCBhc3Npc3Q8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB5b3VyIHNvdXJjZSBmaWxlIHByb3ZpZGVzDQotdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucyBmb3IgY29tcGxldGlvbi48L3A+PHA+WW91DQotY2FuIGxhdW5jaCBjb250ZW50IGFzc2lzdCBpbiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB3YXlzOjwvcD48dWw+DQotPGxpPkZyb20gdGhlIDx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPiBtZW51LCBjbGljayA8dWljb250cm9sPkNvbnRlbnQNCi1Bc3Npc3Q8L3VpY29udHJvbD4sIG9yPC9saT4NCi08bGk+UHJlc3MgQ3RybCtTcGFjZTwvbGk+DQotPC91bD48cD5JbiBhZGRpdGlvbiwgeW91IGNhbiBzZXQgdXAgYW4gb3B0aW9uIHRoYXQgY2F1c2VzIGNvbnRlbnQNCi1hc3Npc3QgdG8gcG9wIHVwIGF1dG9tYXRpY2FsbHkgd2hlbiBjZXJ0YWluIGNoYXJhY3RlcnMgYXJlIHR5cGVkLg0KLVRvIHNldCB1cCB0aGlzIG9wdGlvbiwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD4gUHJlZmVyZW5jZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiB0byBvcGVuIHRoZSBQcmVmZXJlbmNlcw0KLXdpbmRvdywgdGhlbiBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwNCi1GaWxlcyA8L3VpY29udHJvbD48dWljb250cm9sPkVkaXRvcjwvdWljb250cm9sPjx1aWNvbnRyb2w+Q29udGVudA0KLWFzc2lzdDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IC4gU2VsZWN0IHRoZSA8dWljb250cm9sPkF1dG9tYXRpY2FsbHkNCi1tYWtlIHN1Z2dlc3Rpb25zPC91aWNvbnRyb2w+IGNoZWNrIGJveCwgYW5kIHN1cHBseSBhbnkgYWRkaXRpb25hbA0KLWNoYXJhY3RlcnMgdGhhdCBzaG91bGQgdHJpZ2dlciBjb250ZW50IGFzc2lzdC48L3A+PHA+SWYgeW91ciBjdXJzb3INCi1pcyBpbiBhIHBvc2l0aW9uIHdoZXJlIGNvbnRlbnQgYXNzaXN0IGlzIGF2YWlsYWJsZSwgYSBwb3AtdXAgbGlzdA0KLW9mIGF2YWlsYWJsZSBjaG9pY2VzIGlzIGRpc3BsYXllZCB3aGVuIHlvdSBsYXVuY2ggY29udGVudCBhc3Npc3QuDQotVGhlIGxpc3QgaXMgYmFzZWQgb24gdGhlIGNvbnRleHQgYW5kIHdoZXRoZXIgYSBEVEQgb3IgWE1MIHNjaGVtYSBpcw0KLWFzc29jaWF0ZWQgd2l0aCB0aGUgWE1MIGZpbGUgYmVpbmcgZWRpdGVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUNCi1hbiBBZGRyZXNzIGVsZW1lbnQgdGhhdCBjYW4gY29udGFpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjaGlsZHJlbg0KLWVsZW1lbnRzOiBOYW1lLCBTdHJlZXQsIENpdHksIFppcCBDb2RlLCBDb3VudHJ5LCBhbmQgUHJvdmluY2UsIGFuZA0KLXlvdSBwbGFjZSB5b3VyIGN1cnNvciBhZnRlciBhbnkgb2YgdGhlbSBhbmQgbGF1bmNoIGNvbnRlbnQgYXNzaXN0LA0KLWFsbCBvZiB0aGUgY2hpbGQgZWxlbWVudHMgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QuPC9wPjxwPkNvbnRlbnQNCi1hc3Npc3QgY3ljbGluZyBpcyBhdmFpbGFibGUgaW4gdGhlIFhNTCBlZGl0b3IsIG9mZmVyaW5nIG11bHRpcGxlIHBhZ2VzDQotb2YgY29udGVudCBhc3Npc3QuIFlvdSBjYW4gc2V0IHByZWZlcmVuY2VzIGZvciB0aGUgcHJvcG9zYWwgY2F0ZWdvcmllcw0KLWFuZCB0aGUgY3ljbGUgb3JkZXIgd2hlbiByZXBlYXRlZGx5IGludm9raW5nIGNvbnRlbnQgYXNzaXN0IDwvcD48P1B1Yg0KLUNhcmV0IDUzPz48cD5UaGUgY29udGVudCBhc3Npc3QgbGlzdCBkaXNwbGF5cyBhbGwgdmFsaWQgdGFncyBmb3IgdGhlDQotY3VycmVudCBjdXJzb3IgcG9zaXRpb24sIGluY2x1ZGluZyB0ZW1wbGF0ZXMuIElmIHlvdXIgZ3JhbW1hciBjb25zdHJhaW50cw0KLWFyZSB0dXJuZWQgb2ZmLCBhbGwgYXZhaWxhYmxlIHRhZ3MsIG5vdCBqdXN0IHZhbGlkIG9uZXMsIGFyZSBkaXNwbGF5ZWQuIDwvcD48cD5Bcw0KLXlvdSB0eXBlIHRoZSBmaXJzdCBvbmUgb3IgdHdvIGxldHRlcnMgb2YgdGhlIHRhZyB0aGF0IHlvdSB3YW50LCB0aGUNCi1saXN0IGF1dG9tYXRpY2FsbHkgcmVmcmVzaGVzIHdpdGggYWxwaGFiZXRpemVkIGNob2ljZXMgdGhhdCBtYXRjaA0KLXlvdXIgaW5wdXQuIFNjcm9sbCBkb3duIGFuZCBzZWxlY3QgdGhlIHRhZyB0aGF0IHlvdSB3YW50IHRvIHVzZSBieQ0KLWRvdWJsZS1jbGlja2luZyBvbiBpdC48L3A+PG5vdGU+VGhlIGxpc3Qgb25seSByZWZyZXNoZXMgYXMgZGVzY3JpYmVkDQotaWYgeW91IGZpcnN0IHR5cGUgPHVzZXJpbnB1dD4mbHQ7PC91c2VyaW5wdXQ+IGJlZm9yZSBwcm9tcHRpbmcgZm9yDQotY29udGVudCBhc3Npc3QuPC9ub3RlPjwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzA5Mj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d2NkYXN0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwZDRmNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5pc2ggYSB0YWcgb3IgbGluZSBvZiBjb2RlIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvci4gWW91IGNhbiBhbHNvIHVzZSBjb250ZW50IGFzc2lzdCB0byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yIGxpbmUgb2YgY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UgY29udGVudCBhc3Npc3QgdG8gaW5zZXJ0IHRlbXBsYXRlcyBpbnRvIHlvdXIgWE1MIGNvZGUuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgY29udGVudCBhc3Npc3QsIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIGNvbnRlbnQgYXNzaXN0LCBYTUwgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3bWFjcm8uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RzdWdzdHJhdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3Y2Rhc3QiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Vc2luZyBYTUwgY29udGVudCBhc3Npc3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3Y2Rhc3QiPjxhIG5hbWU9InR3Y2Rhc3QiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yCi1saW5lIG9mIGNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlCi1jb250ZW50IGFzc2lzdCB0byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB5b3VyIHNvdXJjZSBmaWxlIHByb3ZpZGVzCi10aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLjwvcD4KLTxwPllvdQotY2FuIGxhdW5jaCBjb250ZW50IGFzc2lzdCBpbiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB3YXlzOjwvcD4KLTx1bD4KLTxsaT5Gcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPiBtZW51LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50Ci1Bc3Npc3Q8L3NwYW4+LCBvcjwvbGk+Ci0KLTxsaT5QcmVzcyBDdHJsK1NwYWNlPC9saT4KLQotPC91bD4KLTxwPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNldCB1cCBhbiBvcHRpb24gdGhhdCBjYXVzZXMgY29udGVudAotYXNzaXN0IHRvIHBvcCB1cCBhdXRvbWF0aWNhbGx5IHdoZW4gY2VydGFpbiBjaGFyYWN0ZXJzIGFyZSB0eXBlZC4KLVRvIHNldCB1cCB0aGlzIG9wdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj4gUHJlZmVyZW5jZXM8L3NwYW4+PC9zcGFuPiB0byBvcGVuIHRoZSBQcmVmZXJlbmNlcwotd2luZG93LCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwKLUZpbGVzIDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3I8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGVudAotYXNzaXN0PC9zcGFuPjwvc3Bhbj4gLiBTZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkF1dG9tYXRpY2FsbHkKLW1ha2Ugc3VnZ2VzdGlvbnM8L3NwYW4+IGNoZWNrIGJveCwgYW5kIHN1cHBseSBhbnkgYWRkaXRpb25hbAotY2hhcmFjdGVycyB0aGF0IHNob3VsZCB0cmlnZ2VyIGNvbnRlbnQgYXNzaXN0LjwvcD4KLTxwPklmIHlvdXIgY3Vyc29yCi1pcyBpbiBhIHBvc2l0aW9uIHdoZXJlIGNvbnRlbnQgYXNzaXN0IGlzIGF2YWlsYWJsZSwgYSBwb3AtdXAgbGlzdAotb2YgYXZhaWxhYmxlIGNob2ljZXMgaXMgZGlzcGxheWVkIHdoZW4geW91IGxhdW5jaCBjb250ZW50IGFzc2lzdC4KLVRoZSBsaXN0IGlzIGJhc2VkIG9uIHRoZSBjb250ZXh0IGFuZCB3aGV0aGVyIGEgRFREIG9yIFhNTCBzY2hlbWEgaXMKLWFzc29jaWF0ZWQgd2l0aCB0aGUgWE1MIGZpbGUgYmVpbmcgZWRpdGVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKLWFuIEFkZHJlc3MgZWxlbWVudCB0aGF0IGNhbiBjb250YWluIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoaWxkcmVuCi1lbGVtZW50czogTmFtZSwgU3RyZWV0LCBDaXR5LCBaaXAgQ29kZSwgQ291bnRyeSwgYW5kIFByb3ZpbmNlLCBhbmQKLXlvdSBwbGFjZSB5b3VyIGN1cnNvciBhZnRlciBhbnkgb2YgdGhlbSBhbmQgbGF1bmNoIGNvbnRlbnQgYXNzaXN0LAotYWxsIG9mIHRoZSBjaGlsZCBlbGVtZW50cyB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdC48L3A+Ci08cD5Db250ZW50Ci1hc3Npc3QgY3ljbGluZyBpcyBhdmFpbGFibGUgaW4gdGhlIFhNTCBlZGl0b3IsIG9mZmVyaW5nIG11bHRpcGxlIHBhZ2VzCi1vZiBjb250ZW50IGFzc2lzdC4gWW91IGNhbiBzZXQgcHJlZmVyZW5jZXMgZm9yIHRoZSBwcm9wb3NhbCBjYXRlZ29yaWVzCi1hbmQgdGhlIGN5Y2xlIG9yZGVyIHdoZW4gcmVwZWF0ZWRseSBpbnZva2luZyBjb250ZW50IGFzc2lzdCA8L3A+Ci08cD5UaGUgY29udGVudCBhc3Npc3QgbGlzdCBkaXNwbGF5cyBhbGwgdmFsaWQgdGFncyBmb3IgdGhlCi1jdXJyZW50IGN1cnNvciBwb3NpdGlvbiwgaW5jbHVkaW5nIHRlbXBsYXRlcy4gSWYgeW91ciBncmFtbWFyIGNvbnN0cmFpbnRzCi1hcmUgdHVybmVkIG9mZiwgYWxsIGF2YWlsYWJsZSB0YWdzLCBub3QganVzdCB2YWxpZCBvbmVzLCBhcmUgZGlzcGxheWVkLiA8L3A+Ci08cD5BcwoteW91IHR5cGUgdGhlIGZpcnN0IG9uZSBvciB0d28gbGV0dGVycyBvZiB0aGUgdGFnIHRoYXQgeW91IHdhbnQsIHRoZQotbGlzdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2hlcyB3aXRoIGFscGhhYmV0aXplZCBjaG9pY2VzIHRoYXQgbWF0Y2gKLXlvdXIgaW5wdXQuIFNjcm9sbCBkb3duIGFuZCBzZWxlY3QgdGhlIHRhZyB0aGF0IHlvdSB3YW50IHRvIHVzZSBieQotZG91YmxlLWNsaWNraW5nIG9uIGl0LjwvcD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaGUgbGlzdCBvbmx5IHJlZnJlc2hlcyBhcyBkZXNjcmliZWQKLWlmIHlvdSBmaXJzdCB0eXBlIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+Jmx0Ozwva2JkPiBiZWZvcmUgcHJvbXB0aW5nIGZvcgotY29udGVudCBhc3Npc3QuPC9kaXY+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3bWFjcm8uaHRtbCIgdGl0bGU9IlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgc2VjdGlvbiBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdSBkbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS4iPldvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHN1Z3N0cmF0Lmh0bWwiIHRpdGxlPSJZb3UgY2FuIGN1c3RvbWl6ZSB0aGUgZm9ybWF0dGluZyBvZiB0aGUgc3VnZ2VzdGlvbnMgZ2l2ZW4gYnkgY29udGVudCBhc3Npc3QgYnkgY2hvb3NpbmcgYSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHByZWZlcmVuY2UuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvIFN0cmljdCwgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZCBmaXJzdCBpbiB0aGUgbGlzdCBvZiBvcHRpb25zIGFuZCBoaWdobGlnaHRlZCBieSBib2xkIGljb25zLiBPdGhlciBzdWdnZXN0aW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoaXMgZWxlbWVudCdzIHNjb3BlIGJ1dCBhcmUgbm90IGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBkaXNwbGF5ZWQgbG93ZXIgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkIGljb25zLiBXaGVuIHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGlzIHNldCB0byBMYXgsIGFsbCBzdWdnZXN0aW9ucyB3aWxsIGRpc3BsYXllZCBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIj5TZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3bWFjcm8uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTFiNGM1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d21hY3JvIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+V29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBzZWN0aW9uIG9mIHByZWRlZmluZWQNCi1jb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuDQoteW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdQ0KLWRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idHdtYWNyb3wxfFhNTHRlbXBsYXRlc3dvcmtpbmd3aXRocHJlZGVmaW5lZGNvZGUiDQotc3RhdHVzPSJjaGFuZ2VkIj50ZW1wbGF0ZXM8aW5kZXh0ZXJtPndvcmtpbmcgd2l0aCBwcmVkZWZpbmVkIFhNTCBjb2RlPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InR3bWFjcm98MTB8WE1MZmlsZXN0ZW1wbGF0ZXMiIHN0YXR1cz0ibmV3Ij5YTUwNCi1maWxlczxpbmRleHRlcm0+dGVtcGxhdGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Zb3UgY2FuIHVzZSBhIGRlZmF1bHQgdGVtcGxhdGUgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGF0IHRlbXBsYXRlLA0KLW9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9wPjxwPkZvciBleGFtcGxlLCB5b3UgY2FuIHdvcmsgb24gYSBncm91cCBvZg0KLVhNTCBwYWdlcyB0aGF0IHNob3VsZCBhbGwgY29udGFpbiBhIHRhYmxlIHdpdGggYSBzcGVjaWZpYyBhcHBlYXJhbmNlLiBDcmVhdGUNCi1hIHRlbXBsYXRlIHRoYXQgY29udGFpbnMgdGhlIHRhZ3MgZm9yIHRoYXQgdGFibGUsIGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUNCi1hdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGZvciBlYWNoIHRhZy4gKFlvdSBjYW4gY29weSBhbmQgcGFzdGUgdGhlDQotdGFncyBmcm9tIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpbnRvIHRoZSB0ZW1wbGF0ZSdzIDx1aWNvbnRyb2w+UGF0dGVybjwvdWljb250cm9sPiBmaWVsZC4pDQotVGhlbiBzZWxlY3QgdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyDQoteW91IHdhbnQgdG8gaW5zZXJ0IHlvdXIgY3VzdG9tIHRhYmxlIGludG8gYW4gWE1MIGZpbGUuPC9wPjxwPlRvIGNyZWF0ZSBhIG5ldw0KLVhNTCB0ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MDQotRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPlRlbXBsYXRlczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+IGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGNvbXBsZXRlbHkNCi1uZXcgdGVtcGxhdGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3VwcGx5IGEgbmV3IHRlbXBsYXRlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBhbmQgPHVpY29udHJvbD5EZXNjcmlwdGlvbjwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TcGVjaWZ5IHRoZSA8dWljb250cm9sPkNvbnRleHQ8L3VpY29udHJvbD4gZm9yIHRoZSB0ZW1wbGF0ZS48L2NtZD4NCi08aW5mbz5UaGlzIGlzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsDQotbGlzdCB3aGVuIGNvbnRlbnQgYXNzaXN0IGlzIHJlcXVlc3RlZC4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNwZWNpZnkgdGhlIDx1aWNvbnRyb2w+UGF0dGVybjwvdWljb250cm9sPiBmb3IgeW91ciB0ZW1wbGF0ZSB1c2luZw0KLXRoZSBhcHByb3ByaWF0ZSB0YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIGluc2VydGVkIGJ5IGNvbnRlbnQNCi1hc3Npc3QuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8dWljb250cm9sPkluc2VydCBWYXJpYWJsZTwvdWljb250cm9sPiBidXR0b24NCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC4gPC9jbWQ+PGluZm8+Rm9yIGV4YW1wbGUsIHRoZSA8Yj5kYXRlPC9iPiB2YXJpYWJsZQ0KLWluZGljYXRlcyB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgaW5zZXJ0ZWQuIDwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IGFuZCB0aGVuIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD4gdG8NCi1zYXZlIHlvdXIgY2hhbmdlcy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUgc2FtZQ0KLXByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlDQotaXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gYWxzbyByZXN0b3JlIGEgcmVtb3ZlZCB0ZW1wbGF0ZSBpZiB5b3UgaGF2ZQ0KLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLiA8cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlDQotdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIGJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgaXQgdG8gYXBwZWFyIGluIHRoZQ0KLWNvbnRlbnQgYXNzaXN0IGxpc3QsIGNsZWFyIGl0cyBjaGVjayBib3ggaW4gdGhlIHRhYmxlIG9uIHRoZSBUZW1wbGF0ZXMgcHJlZmVyZW5jZXMNCi1wYWdlLjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3bWFjcm8uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNjMTRmYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3bWFjcm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgc2VjdGlvbiBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdSBkbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBzZWN0aW9uIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlbXBsYXRlcywgd29ya2luZyB3aXRoIHByZWRlZmluZWQgWE1MIGNvZGUsIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlbXBsYXRlcywgd29ya2luZyB3aXRoIHByZWRlZmluZWQgWE1MIGNvZGUsIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjZGFzdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3bWFjcm8iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdtYWNybyI+PGEgbmFtZT0idHdtYWNybyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgc2VjdGlvbiBvZiBwcmVkZWZpbmVkCi1jb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuCi15b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91Ci1kbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gdXNlIGEgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsCi1vciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvcD4KLTxwPkZvciBleGFtcGxlLCB5b3UgY2FuIHdvcmsgb24gYSBncm91cCBvZgotWE1MIHBhZ2VzIHRoYXQgc2hvdWxkIGFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZQotYSB0ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zIHRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlCi1hdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGZvciBlYWNoIHRhZy4gKFlvdSBjYW4gY29weSBhbmQgcGFzdGUgdGhlCi10YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQuKQotVGhlbiBzZWxlY3QgdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyCi15b3Ugd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhbiBYTUwgZmlsZS48L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcKLVhNTCB0ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLTwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwKLUZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRlbXBsYXRlczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gaWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgY29tcGxldGVseQotbmV3IHRlbXBsYXRlLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlN1cHBseSBhIG5ldyB0ZW1wbGF0ZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVzY3JpcHRpb248L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3BlY2lmeSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGV4dDwvc3Bhbj4gZm9yIHRoZSB0ZW1wbGF0ZS48L3NwYW4+Ci0gVGhpcyBpcyB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbAotbGlzdCB3aGVuIGNvbnRlbnQgYXNzaXN0IGlzIHJlcXVlc3RlZC4gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmb3IgeW91ciB0ZW1wbGF0ZSB1c2luZwotdGhlIGFwcHJvcHJpYXRlIHRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQgYnkgY29udGVudAotYXNzaXN0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5zZXJ0IFZhcmlhYmxlPC9zcGFuPiBidXR0b24KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLiA8L3NwYW4+IEZvciBleGFtcGxlLCB0aGUgPHN0cm9uZz5kYXRlPC9zdHJvbmc+IHZhcmlhYmxlCi1pbmRpY2F0ZXMgdGhlIGN1cnJlbnQgZGF0ZSB3aWxsIGJlIGluc2VydGVkLiA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiBhbmQgdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj4gdG8KLXNhdmUgeW91ciBjaGFuZ2VzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUgc2FtZQotcHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUKLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUKLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLiA8cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlCi10aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlCi1jb250ZW50IGFzc2lzdCBsaXN0LCBjbGVhciBpdHMgY2hlY2sgYm94IGluIHRoZSB0YWJsZSBvbiB0aGUgVGVtcGxhdGVzIHByZWZlcmVuY2VzCi1wYWdlLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdjZGFzdC5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yIGxpbmUgb2YgY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UgY29udGVudCBhc3Npc3QgdG8gaW5zZXJ0IHRlbXBsYXRlcyBpbnRvIHlvdXIgWE1MIGNvZGUuIj5Vc2luZyBYTUwgY29udGVudCBhc3Npc3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d3h2YWxpZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d3h2YWxpZC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWRmZWMyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHd4dmFsaWQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlZhbGlkYXRpbmcgWE1MIGZpbGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5WYWxpZGF0aW5nIFhNTCBmaWxlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5XaGVuIHlvdSB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLCB0aGUgWE1MIHZhbGlkYXRvciB3aWxsIGNoZWNrIHRvDQotc2VlIHRoYXQgeW91ciBmaWxlIGlzIHZhbGlkIGFuZCB3ZWxsLWZvcm1lZC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPnZhbGlkYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBYTUwgZWRpdG9yIHdpbGwgcHJvY2VzcyBYTUwgZmlsZXMgdGhhdCBhcmUgaW52YWxpZCBvciBub3QNCi13ZWxsLWZvcm1lZC4gVGhlIGVkaXRvciB1c2VzIGhldXJpc3RpY3MgdG8gb3BlbiBhIGZpbGUgdXNpbmcgdGhlIGJlc3QgaW50ZXJwcmV0YXRpb24NCi1vZiB0aGUgdGFnZ2luZyB0aGF0IGl0IGNhbi4gRm9yIGV4YW1wbGUsIGFuIGVsZW1lbnQgd2l0aCBhIG1pc3NpbmcgZW5kIHRhZw0KLWlzIHNpbXBseSBhc3N1bWVkIHRvIGVuZCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4gQXMgeW91IG1ha2UgdXBkYXRlcyB0bw0KLWEgZmlsZSwgdGhlIGVkaXRvciBpbmNyZW1lbnRhbGx5IHJlaW50ZXJwcmV0cyB5b3VyIGRvY3VtZW50LCBjaGFuZ2luZyB0aGUNCi1oaWdobGlnaHRpbmcsIHRyZWUgdmlldywgYW5kIHNvIG9uLiBNYW55IGZvcm1hdGlvbiBlcnJvcnMgYXJlIGVhc3kgdG8gc3BvdA0KLWluIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nLCBzbyB5b3UgY2FuIGVhc2lseSBjb3JyZWN0IG9idmlvdXMgZXJyb3JzIG9uLXRoZS1mbHkuDQotSG93ZXZlciwgdGhlcmUgd2lsbCBiZSBvdGhlciBjYXNlcyB3aGVuIGl0IHdpbGwgYmUgYmVuZWZpY2lhbCB0byBwZXJmb3JtIGZvcm1hbA0KLXZhbGlkYXRpb24gb24geW91ciBkb2N1bWVudHMuPC9wPjxwPllvdSBjYW4gdmFsaWRhdGUgeW91ciBmaWxlIGJ5IHNlbGVjdGluZw0KLWl0IGluIHRoZSBOYXZpZ2F0b3IgdmlldywgcmlnaHQtY2xpY2tpbmcgaXQsIGFuZCBjbGlja2luZyA8dWljb250cm9sPlZhbGlkYXRlPC91aWNvbnRyb2w+Lg0KLUFueSB2YWxpZGF0aW9uIHByb2JsZW1zIGFyZSBpbmRpY2F0ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIFlvdSBjYW4gZG91YmxlLWNsaWNrDQotb24gaW5kaXZpZHVhbCBlcnJvcnMsIGFuZCB5b3Ugd2lsbCBiZSB0YWtlbiB0byB0aGUgaW52YWxpZCB0YWcgaW4gdGhlIGZpbGUsDQotc28gdGhhdCB5b3UgY2FuIG1ha2UgY29ycmVjdGlvbnMuPC9wPjwvY29udGV4dD4NCi08cG9zdHJlcT48bm90ZT4gSWYgeW91IHJlY2VpdmUgYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIFByb2JsZW1zDQotdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgYWxsb3dlZCBieSBjbGlja2luZyA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kDQotc2VsZWN0aW5nIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD48dWljb250cm9sPk1hcmtlcnM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi4gU2VsZWN0IHRoZSA8dWljb250cm9sPlVzZSBtYXJrZXIgbGltaXRzPC91aWNvbnRyb2w+IGNoZWNrDQotYm94IGFuZCBjaGFuZ2UgdGhlIG51bWJlciBpbiB0aGUgPHVpY29udHJvbD5MaW1pdCB2aXNpYmxlIGl0ZW1zIHBlciBncm91cDwvdWljb250cm9sPiA8P1B1YiBDYXJldD8+ZmllbGQuPC9ub3RlPjxwPllvdQ0KLWNhbiBzZXQgdXAgYSBwcm9qZWN0J3MgcHJvcGVydGllcyBzbyB0aGF0IGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0IHJlc291cmNlcw0KLWFyZSBhdXRvbWF0aWNhbGx5IHZhbGlkYXRlZCB3aGVuIHlvdSBzYXZlIHRoZW0uIEZyb20gYSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUsDQotY2xpY2sgPHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+LCB0aGVuIHNlbGVjdCA8dWljb250cm9sPlZhbGlkYXRpb248L3VpY29udHJvbD4uDQotQW55IHZhbGlkYXRvcnMgeW91IGNhbiBydW4gYWdhaW5zdCB5b3VyIHByb2plY3Qgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIFZhbGlkYXRpb24NCi1wYWdlLjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuZGl0YSIgc2NvcGU9InBlZXIiPg0KLTxsaW5rdGV4dD5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyNjU4Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZDNmMzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d3h2YWxpZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVmFsaWRhdGluZyBYTUwgZmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iV2hlbiB5b3UgdmFsaWRhdGUgeW91ciBYTUwgZmlsZSwgdGhlIFhNTCB2YWxpZGF0b3Igd2lsbCBjaGVjayB0byBzZWUgdGhhdCB5b3VyIGZpbGUgaXMgdmFsaWQgYW5kIHdlbGwtZm9ybWVkLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJXaGVuIHlvdSB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLCB0aGUgWE1MIHZhbGlkYXRvciB3aWxsIGNoZWNrIHRvIHNlZSB0aGF0IHlvdXIgZmlsZSBpcyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCB2YWxpZGF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCB2YWxpZGF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3eHZhbGlkIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+VmFsaWRhdGluZyBYTUwgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3eHZhbGlkIj48YSBuYW1lPSJ0d3h2YWxpZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VmFsaWRhdGluZyBYTUwgZmlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPldoZW4geW91IHZhbGlkYXRlIHlvdXIgWE1MIGZpbGUsIHRoZSBYTUwgdmFsaWRhdG9yIHdpbGwgY2hlY2sgdG8KLXNlZSB0aGF0IHlvdXIgZmlsZSBpcyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgWE1MIGVkaXRvciB3aWxsIHByb2Nlc3MgWE1MIGZpbGVzIHRoYXQgYXJlIGludmFsaWQgb3Igbm90Ci13ZWxsLWZvcm1lZC4gVGhlIGVkaXRvciB1c2VzIGhldXJpc3RpY3MgdG8gb3BlbiBhIGZpbGUgdXNpbmcgdGhlIGJlc3QgaW50ZXJwcmV0YXRpb24KLW9mIHRoZSB0YWdnaW5nIHRoYXQgaXQgY2FuLiBGb3IgZXhhbXBsZSwgYW4gZWxlbWVudCB3aXRoIGEgbWlzc2luZyBlbmQgdGFnCi1pcyBzaW1wbHkgYXNzdW1lZCB0byBlbmQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuIEFzIHlvdSBtYWtlIHVwZGF0ZXMgdG8KLWEgZmlsZSwgdGhlIGVkaXRvciBpbmNyZW1lbnRhbGx5IHJlaW50ZXJwcmV0cyB5b3VyIGRvY3VtZW50LCBjaGFuZ2luZyB0aGUKLWhpZ2hsaWdodGluZywgdHJlZSB2aWV3LCBhbmQgc28gb24uIE1hbnkgZm9ybWF0aW9uIGVycm9ycyBhcmUgZWFzeSB0byBzcG90Ci1pbiB0aGUgc3ludGF4IGhpZ2hsaWdodGluZywgc28geW91IGNhbiBlYXNpbHkgY29ycmVjdCBvYnZpb3VzIGVycm9ycyBvbi10aGUtZmx5LgotSG93ZXZlciwgdGhlcmUgd2lsbCBiZSBvdGhlciBjYXNlcyB3aGVuIGl0IHdpbGwgYmUgYmVuZWZpY2lhbCB0byBwZXJmb3JtIGZvcm1hbAotdmFsaWRhdGlvbiBvbiB5b3VyIGRvY3VtZW50cy48L3A+Ci08cD5Zb3UgY2FuIHZhbGlkYXRlIHlvdXIgZmlsZSBieSBzZWxlY3RpbmcKLWl0IGluIHRoZSBOYXZpZ2F0b3IgdmlldywgcmlnaHQtY2xpY2tpbmcgaXQsIGFuZCBjbGlja2luZyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0ZTwvc3Bhbj4uCi1BbnkgdmFsaWRhdGlvbiBwcm9ibGVtcyBhcmUgaW5kaWNhdGVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiBZb3UgY2FuIGRvdWJsZS1jbGljawotb24gaW5kaXZpZHVhbCBlcnJvcnMsIGFuZCB5b3Ugd2lsbCBiZSB0YWtlbiB0byB0aGUgaW52YWxpZCB0YWcgaW4gdGhlIGZpbGUsCi1zbyB0aGF0IHlvdSBjYW4gbWFrZSBjb3JyZWN0aW9ucy48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+ICBJZiB5b3UgcmVjZWl2ZSBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgUHJvYmxlbXMKLXZpZXcgaXMgZnVsbCwgeW91IGNhbiBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIGFsbG93ZWQgYnkgY2xpY2tpbmcgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj48L3NwYW4+IGFuZAotc2VsZWN0aW5nIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXJrZXJzPC9zcGFuPgotPC9zcGFuPi4gU2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2UgbWFya2VyIGxpbWl0czwvc3Bhbj4gY2hlY2sKLWJveCBhbmQgY2hhbmdlIHRoZSBudW1iZXIgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkxpbWl0IHZpc2libGUgaXRlbXMgcGVyIGdyb3VwPC9zcGFuPiBmaWVsZC48L2Rpdj4KLTxwPllvdQotY2FuIHNldCB1cCBhIHByb2plY3QncyBwcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QgcmVzb3VyY2VzCi1hcmUgYXV0b21hdGljYWxseSB2YWxpZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGVtLiBGcm9tIGEgcHJvamVjdCdzIHBvcC11cCBtZW51LAotY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4sIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+LgotQW55IHZhbGlkYXRvcnMgeW91IGNhbiBydW4gYWdhaW5zdCB5b3VyIHByb2plY3Qgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIFZhbGlkYXRpb24KLXBhZ2UuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGluZm8iPjxzdHJvbmc+UmVsYXRlZCBpbmZvcm1hdGlvbjwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbCI+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlNWY1MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDksIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIFN0eSBfZGlzcGxheSBGb250Q29sb3I9InJlZCI/Pg0KLTx0YXNrIGlkPSJ0eGVkdGRlcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZQ0KLVhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgd2l0aCBOb2RlIGFuZCBDb250ZW50IGNvbHVtbnMgYW5kDQotYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kDQotYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUNCi1wb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQNCi1mb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+RGVzaWduIHZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPkZvciBleGFtcGxlLCB0aGUgPHVpY29udHJvbD5BZGQgY2hpbGQ8L3VpY29udHJvbD4gbWVudQ0KLWl0ZW0gd2lsbCBsaXN0IG9ubHkgdGhvc2UgZWxlbWVudHMgZnJvbSBhIERURCBvciBYTUwgc2NoZW1hIHdoaWNoDQotd291bGQgYmUgdmFsaWQgY2hpbGRyZW4gYXQgdGhhdCBwb2ludC48L3A+PHA+V2hlbiB5b3UgaGF2ZSBhbiBYTUwNCi1maWxlIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgc2NoZW1hIG9yIERURCBmaWxlLCBjZXJ0YWluIHRhZ3MgYW5kIHJ1bGVzDQotZm9yIHRoYXQgZmlsZSBoYXZlIGFscmVhZHkgYmVlbiBlc3RhYmxpc2hlZCwgd2hpY2ggaXMgd2h5IHRoZSBEZXNpZ24NCi12aWV3IGNhbiBwcm92aWRlIHByb21wdHMgKHZpYSBhIHBvcC11cCBtZW51KSBmb3IgdGhvc2UgdGFncy4gV2hlbg0KLXlvdSBjcmVhdGUgYW4gWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWEgb3INCi1EVEQgZmlsZSwgaXQgaGFzIG5vIHRhZ3Mgb3IgcnVsZXMgYXNzb2NpYXRlZCB3aXRoIGl0LCBzbyB0aGUgRGVzaWduDQotdmlldyBjYW5ub3QgcHJvdmlkZSBwcm9tcHRzIGZvciBzcGVjaWZpYyB0YWdzLCBidXQgaXQgY2FuIHByb3ZpZGUNCi1wcm9tcHRzIHRvIGNyZWF0ZSBuZXcgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuPC9wPjxwPkZvciBhbnkgWE1MIGZpbGUNCi1hc3NvY2lhdGVkIHdpdGggYW4gWE1MIHNjaGVtYSBvciBEVEQgZmlsZSwgeW91IGNhbiB1c2UgdGhlIERlc2lnbg0KLXZpZXcgdG8gYWRkIGFueSBpdGVtcyBkZWZpbmVkIGluIHRoZSBYTUwgc2NoZW1hIG9yIERURCAoc3VjaCBhcyBlbGVtZW50cw0KLWFuZCBhdHRyaWJ1dGVzKSB0byB0aGUgWE1MIGZpbGUuIFlvdSBjYW4gYWxzbyB1c2UgaXQgdG8gYWRkIHByb2Nlc3NpbmcNCi1pbnN0cnVjdGlvbnMgYW5kIGNvbW1lbnRzIHRvIGFsbCBYTUwgZmlsZXMuPC9wPjxwPlRvIG9wZW4gYW5kIGVkaXQNCi1hIFhNTCBmaWxlIGluIHRoZSBYTUwgZWRpdG9yLCByaWdodC1jbGljayB0aGUgZmlsZSBpbiB0aGUgUHJvamVjdA0KLUV4cGxvcmVyIHZpZXcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+T3BlbiBXaXRoID4gWE1MIEVkaXRvcjwvdWljb250cm9sPi4NCi1JZiBuZWNlc3NhcnksIGNsaWNrIHRoZSA8dWljb250cm9sPkRlc2lnbjwvdWljb250cm9sPiB0YWIgdG8gb3Blbg0KLXRoZSBEZXNpZ24gdmlldy48L3A+PD9QdWIgQ2FyZXQgOTI/PjxwPlRvIGV4cGFuZCBhbGwgdGhlIGl0ZW1zIGluDQoteW91ciBYTUwgZmlsZSwgY2xpY2sgdGhlIDx1aWNvbnRyb2w+RXhwYW5kIEFsbDwvdWljb250cm9sPiBidXR0b248aW1hZ2UNCi1ocmVmPSIuLi9pbWFnZXMvZXhwYW5kX2FsbC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBFeHBhbmQgQWxsDQotYnV0dG9uPC9hbHQ+PC9pbWFnZT4gb24gdGhlIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlIGVkaXRvci4gVG8gY29sbGFwc2UNCi10aGVtLCBjbGljayB0aGUgPHVpY29udHJvbD5Db2xsYXBzZSBBbGw8L3VpY29udHJvbD4gYnV0dG9uPGltYWdlDQotaHJlZj0iLi4vaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBDb2xsYXBzZQ0KLUFsbCBidXR0b248L2FsdD48L2ltYWdlPiBvbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgZWRpdG9yLjwvcD48cD5JZg0KLXlvdSByaWdodC1jbGljayB0aGUgaXRlbSB0aGF0IHlvdSB3YW50IHRvIHdvcmsgd2l0aCwgc29tZSBvciBhbGwgb2YNCi10aGUgZm9sbG93aW5nIG9wdGlvbnMgKGFzIGFwcGxpY2FibGUpIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhlIHBvcC11cA0KLW1lbnUgdGhhdCBhcHBlYXJzOjwvcD48dGFibGU+DQotPHRncm91cCBjb2xzPSIyIj48Y29sc3BlYyBjb2xuYW1lPSJjb2wxIiBjb2x3aWR0aD0iNDgqIi8+PGNvbHNwZWMNCi1jb2xuYW1lPSJjb2wyIiBjb2x3aWR0aD0iMTUwKiIvPg0KLTx0aGVhZD4NCi08cm93IHZhbGlnbj0iYm90dG9tIj4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+U2VsZWN0IHRoaXM8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5JZiB5b3Ugd2FudCB0byBkbyB0aGlzPC9lbnRyeT4NCi08L3Jvdz4NCi08L3RoZWFkPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5BZGQgRFREIEluZm9ybWF0aW9uPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+QXNzb2NpYXRlIHRoZSBYTUwgZmlsZSB3aXRoIGEgRFRELjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+RWRpdCBET0NUWVBFPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+RWRpdCB0aGUgRE9DVFlQRSBkZWNsYXJhdGlvbi4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQNCi10YXNrIGZvciBtb3JlIGRldGFpbHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPHhyZWYgZm9ybWF0PSJkaXRhIg0KLWhyZWY9InRlZHRkb2MuZGl0YSIgc2NvcGU9ImxvY2FsIj5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC94cmVmPi48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkVkaXQgTmFtZXNwYWNlczwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkVkaXQgdGhlIGV4aXN0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBvciBjcmVhdGUNCi1hIG5ldyBhc3NvY2lhdGlvbiB3aXRoIGEgbmFtZXNwYWNlLiBSZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrIGZvcg0KLW1vcmUgZGV0YWlscy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8eHJlZiBmb3JtYXQ9ImRpdGEiDQotaHJlZj0idGVkdHNjaC5kaXRhIiBzY29wZT0ibG9jYWwiPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC94cmVmPi48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkVkaXQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkVkaXQgdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIFJlZmVyIHRvIHRoZQ0KLXJlbGF0ZWQgdGFzayBmb3IgbW9yZSBkZXRhaWxzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDx4cmVmDQotZm9ybWF0PSJkaXRhIiBocmVmPSJ0ZWR0cHJvYy5kaXRhIiBzY29wZT0ibG9jYWwiPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcNCi1pbnN0cnVjdGlvbnM8L3hyZWY+LjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+UmVtb3ZlPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+UmVtb3ZlIHRoZSBpdGVtIHRoYXQgeW91IGhhdmUgc2VsZWN0ZWQgZnJvbQ0KLXRoZSBYTUwgZmlsZS4gSWYgdGhlIHNlbGVjdGVkIGl0ZW0gb3IgcmVsYXRlZCBpdGVtcyBhcmUgZGVmaW5lZCBzbw0KLXRoYXQgdGhlIGl0ZW0gbXVzdCBleGlzdCBpbiB0aGUgZmlsZSwgdGhpcyBvcHRpb24gd2lsbCBub3QgYmUgYXZhaWxhYmxlLg0KLUZvciBleGFtcGxlLCBpbiB5b3VyIERURCwgaWYgeW91IGhhdmUgZGVjbGFyZWQgdGhhdCAiT25lIG9yIG1vcmUiDQotb2YgdGhlIGl0ZW0gbXVzdCBhbHdheXMgZXhpc3QgaW4geW91ciBYTUwgZmlsZSwgYW5kIHRoZSBpdGVtIHlvdSBoYXZlDQotc2VsZWN0ZWQgaXMgdGhlIG9ubHkgb25lIHRoYXQgZXhpc3RzIGluIHlvdXIgWE1MIGZpbGUuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5BZGQgQXR0cmlidXRlPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+QWRkIGFuIGF0dHJpYnV0ZSB0byB0aGUgZWxlbWVudCB0aGF0IHlvdSBzZWxlY3RlZC4NCi1BbnkgYXR0cmlidXRlcyB5b3UgYXJlIGFsbG93ZWQgdG8gYWRkIHRvIHRoZSBlbGVtZW50IHdpbGwgYmUgbGlzdGVkLg0KLUFmdGVyIHlvdSBoYXZlIGFkZGVkIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIFhNTCBmaWxlLCB5b3UgY2FuIGNsaWNrDQotaW4gdGhlIHJpZ2h0LWhhbmQgY29sdW1uIHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gSWYNCi10aGUgYXR0cmlidXRlIGhhcyBzZXQgdmFsdWVzLCB0aGV5IHdpbGwgYXBwZWFyIGluIGEgbGlzdC48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkFkZCBDaGlsZDwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkFkZCBhbm90aGVyIGVsZW1lbnQsIGEgY29tbWVudCwgb3IgYSBwcm9jZXNzaW5nDQotaW5zdHJ1Y3Rpb24gYXMgYSBjaGlsZCBvZiB0aGUgcGFyZW50IGVsZW1lbnQuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5BZGQgQmVmb3JlPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+QWRkIGEgY2hpbGQgZWxlbWVudCwgY29tbWVudCwgb3IgcHJvY2Vzc2luZw0KLWluc3RydWN0aW9uIHRoYXQgY2FuIGdvIGJlZm9yZSB0aGUgaXRlbSB5b3UgaGF2ZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGUsDQotaWYgeW91IGhhdmUgYSBwYXJlbnQgZWxlbWVudCBjYWxsZWQgPHVzZXJpbnB1dD5DRCBDb2xsZWN0aW9uczwvdXNlcmlucHV0PiB0aGF0DQotY2FuIGNvbnRhaW4gYW4gdW5saW1pdGVkIGFtb3VudCBvZiBjaGlsZHJlbiBjYWxsZWQgPHVzZXJpbnB1dD5DRDwvdXNlcmlucHV0PiwNCi15b3UgY291bGQgY2xpY2sgYSA8dXNlcmlucHV0PkNEPC91c2VyaW5wdXQ+IGVsZW1lbnQgYW5kIGNsaWNrIDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPkFkZCBCZWZvcmU8L3VpY29udHJvbD48dWljb250cm9sPiBDRDwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+ICwgYXMgYSA8dXNlcmlucHV0PkNEPC91c2VyaW5wdXQ+IGVsZW1lbnQgY2FuIGdvIGJlZm9yZQ0KLWFub3RoZXIgPHVzZXJpbnB1dD5DRDwvdXNlcmlucHV0PiBlbGVtZW50LjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+QWRkIEFmdGVyPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+QWRkIGEgY2hpbGQgZWxlbWVudCwgY29tbWVudCwgb3IgcHJvY2Vzc2luZw0KLWluc3RydWN0aW9uIHRoYXQgY2FuIGdvIGFmdGVyIHRoZSBpdGVtIHlvdSBoYXZlIHNlbGVjdGVkLiBGb3IgZXhhbXBsZSwNCi1pZiB5b3UgaGF2ZSBhIHBhcmVudCBlbGVtZW50IGNhbGxlZCA8dXNlcmlucHV0PkNEIENvbGxlY3Rpb25zPC91c2VyaW5wdXQ+IHRoYXQNCi1jYW4gY29udGFpbiBhbiB1bmxpbWl0ZWQgYW1vdW50IG9mIGNoaWxkcmVuIGNhbGxlZCA8dXNlcmlucHV0PkNEPC91c2VyaW5wdXQ+LA0KLXlvdSBjb3VsZCBjbGljayBhIDx1c2VyaW5wdXQ+Q0Q8L3VzZXJpbnB1dD4gZWxlbWVudCBhbmQgY2xpY2sgIDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPkFkZCBBZnRlcjwvdWljb250cm9sPjx1aWNvbnRyb2w+IENEPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4sDQotYXMgYSA8dXNlcmlucHV0PkNEPC91c2VyaW5wdXQ+IGVsZW1lbnQgY2FuIGdvIGFmdGVyIGFub3RoZXIgPHVzZXJpbnB1dD5DRDwvdXNlcmlucHV0PiBlbGVtZW50LjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+UmVwbGFjZSBXaXRoPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+UmVwbGFjZSBvbmUgaXRlbSB3aXRoIGFub3RoZXIuIFRoaXMgb3B0aW9uIGlzDQotbm90IGF2YWlsYWJsZSBpZiB5b3UgdHVybiBncmFtbWFyIGNvbnN0cmFpbnRzIG9mZiBvciBpZiB0aGVyZSBhcmUNCi1ubyB2YWxpZCBhbHRlcm5hdGl2ZXMgZm9yIHlvdSB0byByZXBsYWNlIHRoZSBpdGVtIHdpdGguPC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+PC9jb250ZXh0Pg0KLTxyZXN1bHQ+PHA+QW55IGNoYW5nZXMgeW91IG1ha2UgaW4gdGhlIERlc2lnbiB2aWV3IGFyZSBhbHNvIHJlZmxlY3RlZA0KLWluIHRoZSBTb3VyY2UgdmlldyBhbmQgdGhlIE91dGxpbmUgdmlldy48L3A+PG5vdGU+VGhlc2UgaW5zdHJ1Y3Rpb25zDQotd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrDQotaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9ub3RlPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDA2NzgxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MzcwZWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIHdpdGggTm9kZSBhbmQgQ29udGVudCBjb2x1bW5zIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgd2l0aCBOb2RlIGFuZCBDb250ZW50IGNvbHVtbnMgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIERlc2lnbiB2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgRGVzaWduIHZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0cHJvYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcnhtbGJpY29ucy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4ZWR0ZGVzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4ZWR0ZGVzIj48YSBuYW1lPSJ0eGVkdGRlcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZQotWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSB3aXRoIE5vZGUgYW5kIENvbnRlbnQgY29sdW1ucyBhbmQKLWEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZAotYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUKLXBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZAotZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+Rm9yIGV4YW1wbGUsIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgY2hpbGQ8L3NwYW4+IG1lbnUKLWl0ZW0gd2lsbCBsaXN0IG9ubHkgdGhvc2UgZWxlbWVudHMgZnJvbSBhIERURCBvciBYTUwgc2NoZW1hIHdoaWNoCi13b3VsZCBiZSB2YWxpZCBjaGlsZHJlbiBhdCB0aGF0IHBvaW50LjwvcD4KLTxwPldoZW4geW91IGhhdmUgYW4gWE1MCi1maWxlIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgc2NoZW1hIG9yIERURCBmaWxlLCBjZXJ0YWluIHRhZ3MgYW5kIHJ1bGVzCi1mb3IgdGhhdCBmaWxlIGhhdmUgYWxyZWFkeSBiZWVuIGVzdGFibGlzaGVkLCB3aGljaCBpcyB3aHkgdGhlIERlc2lnbgotdmlldyBjYW4gcHJvdmlkZSBwcm9tcHRzICh2aWEgYSBwb3AtdXAgbWVudSkgZm9yIHRob3NlIHRhZ3MuIFdoZW4KLXlvdSBjcmVhdGUgYW4gWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWEgb3IKLURURCBmaWxlLCBpdCBoYXMgbm8gdGFncyBvciBydWxlcyBhc3NvY2lhdGVkIHdpdGggaXQsIHNvIHRoZSBEZXNpZ24KLXZpZXcgY2Fubm90IHByb3ZpZGUgcHJvbXB0cyBmb3Igc3BlY2lmaWMgdGFncywgYnV0IGl0IGNhbiBwcm92aWRlCi1wcm9tcHRzIHRvIGNyZWF0ZSBuZXcgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuPC9wPgotPHA+Rm9yIGFueSBYTUwgZmlsZQotYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWEgb3IgRFREIGZpbGUsIHlvdSBjYW4gdXNlIHRoZSBEZXNpZ24KLXZpZXcgdG8gYWRkIGFueSBpdGVtcyBkZWZpbmVkIGluIHRoZSBYTUwgc2NoZW1hIG9yIERURCAoc3VjaCBhcyBlbGVtZW50cwotYW5kIGF0dHJpYnV0ZXMpIHRvIHRoZSBYTUwgZmlsZS4gWW91IGNhbiBhbHNvIHVzZSBpdCB0byBhZGQgcHJvY2Vzc2luZwotaW5zdHJ1Y3Rpb25zIGFuZCBjb21tZW50cyB0byBhbGwgWE1MIGZpbGVzLjwvcD4KLTxwPlRvIG9wZW4gYW5kIGVkaXQKLWEgWE1MIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IsIHJpZ2h0LWNsaWNrIHRoZSBmaWxlIGluIHRoZSBQcm9qZWN0Ci1FeHBsb3JlciB2aWV3IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PcGVuIFdpdGggJmd0OyBYTUwgRWRpdG9yPC9zcGFuPi4KLUlmIG5lY2Vzc2FyeSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlc2lnbjwvc3Bhbj4gdGFiIHRvIG9wZW4KLXRoZSBEZXNpZ24gdmlldy48L3A+Ci08cD5UbyBleHBhbmQgYWxsIHRoZSBpdGVtcyBpbgoteW91ciBYTUwgZmlsZSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4cGFuZCBBbGw8L3NwYW4+IGJ1dHRvbjxpbWcgc3JjPSIuLi9pbWFnZXMvZXhwYW5kX2FsbC5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBFeHBhbmQgQWxsJiMxMDtidXR0b24iIC8+IG9uIHRoZSB0b3AgcmlnaHQgY29ybmVyIG9mIHRoZSBlZGl0b3IuIFRvIGNvbGxhcHNlCi10aGVtLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29sbGFwc2UgQWxsPC9zcGFuPiBidXR0b248aW1nIHNyYz0iLi4vaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBDb2xsYXBzZSYjMTA7QWxsIGJ1dHRvbiIgLz4gb24gdGhlIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlIGVkaXRvci48L3A+Ci08cD5JZgoteW91IHJpZ2h0LWNsaWNrIHRoZSBpdGVtIHRoYXQgeW91IHdhbnQgdG8gd29yayB3aXRoLCBzb21lIG9yIGFsbCBvZgotdGhlIGZvbGxvd2luZyBvcHRpb25zIChhcyBhcHBsaWNhYmxlKSB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIHRoZSBwb3AtdXAKLW1lbnUgdGhhdCBhcHBlYXJzOjwvcD4KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPgotPHRoZWFkIGFsaWduPSJsZWZ0Ij4KLTx0ciB2YWxpZ249ImJvdHRvbSI+Ci08dGggdmFsaWduPSJib3R0b20iIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBpZD0iTjEwMEJGIj5TZWxlY3QgdGhpczwvdGg+Ci0KLTx0aCB2YWxpZ249ImJvdHRvbSIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaWQ9Ik4xMDBDNiI+SWYgeW91IHdhbnQgdG8gZG8gdGhpczwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjI0MjQyNDI0MjQyNDI0MiUiIGhlYWRlcnM9Ik4xMDBCRiAiPkFkZCBEVEQgSW5mb3JtYXRpb248L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBDNiAiPkFzc29jaWF0ZSB0aGUgWE1MIGZpbGUgd2l0aCBhIERURC48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwQkYgIj5FZGl0IERPQ1RZUEU8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBDNiAiPkVkaXQgdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24uIFJlZmVyIHRvIHRoZSByZWxhdGVkCi10YXNrIGZvciBtb3JlIGRldGFpbHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0idGVkdGRvYy5odG1sIj5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC9hPi48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwQkYgIj5FZGl0IE5hbWVzcGFjZXM8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBDNiAiPkVkaXQgdGhlIGV4aXN0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBvciBjcmVhdGUKLWEgbmV3IGFzc29jaWF0aW9uIHdpdGggYSBuYW1lc3BhY2UuIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yCi1tb3JlIGRldGFpbHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0idGVkdHNjaC5odG1sIj5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvYT4uPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMjQyNDI0MjQyNDI0MjQyJSIgaGVhZGVycz0iTjEwMEJGICI+RWRpdCBQcm9jZXNzaW5nIEluc3RydWN0aW9uPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNzUuNzU3NTc1NzU3NTc1NzUlIiBoZWFkZXJzPSJOMTAwQzYgIj5FZGl0IHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiBSZWZlciB0byB0aGUKLXJlbGF0ZWQgdGFzayBmb3IgbW9yZSBkZXRhaWxzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9InRlZHRwcm9jLmh0bWwiPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9hPi48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwQkYgIj5SZW1vdmU8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBDNiAiPlJlbW92ZSB0aGUgaXRlbSB0aGF0IHlvdSBoYXZlIHNlbGVjdGVkIGZyb20KLXRoZSBYTUwgZmlsZS4gSWYgdGhlIHNlbGVjdGVkIGl0ZW0gb3IgcmVsYXRlZCBpdGVtcyBhcmUgZGVmaW5lZCBzbwotdGhhdCB0aGUgaXRlbSBtdXN0IGV4aXN0IGluIHRoZSBmaWxlLCB0aGlzIG9wdGlvbiB3aWxsIG5vdCBiZSBhdmFpbGFibGUuCi1Gb3IgZXhhbXBsZSwgaW4geW91ciBEVEQsIGlmIHlvdSBoYXZlIGRlY2xhcmVkIHRoYXQgIk9uZSBvciBtb3JlIgotb2YgdGhlIGl0ZW0gbXVzdCBhbHdheXMgZXhpc3QgaW4geW91ciBYTUwgZmlsZSwgYW5kIHRoZSBpdGVtIHlvdSBoYXZlCi1zZWxlY3RlZCBpcyB0aGUgb25seSBvbmUgdGhhdCBleGlzdHMgaW4geW91ciBYTUwgZmlsZS48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwQkYgIj5BZGQgQXR0cmlidXRlPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNzUuNzU3NTc1NzU3NTc1NzUlIiBoZWFkZXJzPSJOMTAwQzYgIj5BZGQgYW4gYXR0cmlidXRlIHRvIHRoZSBlbGVtZW50IHRoYXQgeW91IHNlbGVjdGVkLgotQW55IGF0dHJpYnV0ZXMgeW91IGFyZSBhbGxvd2VkIHRvIGFkZCB0byB0aGUgZWxlbWVudCB3aWxsIGJlIGxpc3RlZC4KLUFmdGVyIHlvdSBoYXZlIGFkZGVkIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIFhNTCBmaWxlLCB5b3UgY2FuIGNsaWNrCi1pbiB0aGUgcmlnaHQtaGFuZCBjb2x1bW4gdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLiBJZgotdGhlIGF0dHJpYnV0ZSBoYXMgc2V0IHZhbHVlcywgdGhleSB3aWxsIGFwcGVhciBpbiBhIGxpc3QuPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMjQyNDI0MjQyNDI0MjQyJSIgaGVhZGVycz0iTjEwMEJGICI+QWRkIENoaWxkPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNzUuNzU3NTc1NzU3NTc1NzUlIiBoZWFkZXJzPSJOMTAwQzYgIj5BZGQgYW5vdGhlciBlbGVtZW50LCBhIGNvbW1lbnQsIG9yIGEgcHJvY2Vzc2luZwotaW5zdHJ1Y3Rpb24gYXMgYSBjaGlsZCBvZiB0aGUgcGFyZW50IGVsZW1lbnQuPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMjQyNDI0MjQyNDI0MjQyJSIgaGVhZGVycz0iTjEwMEJGICI+QWRkIEJlZm9yZTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaGVhZGVycz0iTjEwMEM2ICI+QWRkIGEgY2hpbGQgZWxlbWVudCwgY29tbWVudCwgb3IgcHJvY2Vzc2luZwotaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gZ28gYmVmb3JlIHRoZSBpdGVtIHlvdSBoYXZlIHNlbGVjdGVkLiBGb3IgZXhhbXBsZSwKLWlmIHlvdSBoYXZlIGEgcGFyZW50IGVsZW1lbnQgY2FsbGVkIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+Q0QgQ29sbGVjdGlvbnM8L2tiZD4gdGhhdAotY2FuIGNvbnRhaW4gYW4gdW5saW1pdGVkIGFtb3VudCBvZiBjaGlsZHJlbiBjYWxsZWQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiwKLXlvdSBjb3VsZCBjbGljayBhIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+Q0Q8L2tiZD4gZWxlbWVudCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBCZWZvcmU8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+IENEPC9zcGFuPgotPC9zcGFuPiAsIGFzIGEgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiBlbGVtZW50IGNhbiBnbyBiZWZvcmUKLWFub3RoZXIgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiBlbGVtZW50LjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjI0MjQyNDI0MjQyNDI0MiUiIGhlYWRlcnM9Ik4xMDBCRiAiPkFkZCBBZnRlcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaGVhZGVycz0iTjEwMEM2ICI+QWRkIGEgY2hpbGQgZWxlbWVudCwgY29tbWVudCwgb3IgcHJvY2Vzc2luZwotaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gZ28gYWZ0ZXIgdGhlIGl0ZW0geW91IGhhdmUgc2VsZWN0ZWQuIEZvciBleGFtcGxlLAotaWYgeW91IGhhdmUgYSBwYXJlbnQgZWxlbWVudCBjYWxsZWQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRCBDb2xsZWN0aW9uczwva2JkPiB0aGF0Ci1jYW4gY29udGFpbiBhbiB1bmxpbWl0ZWQgYW1vdW50IG9mIGNoaWxkcmVuIGNhbGxlZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNEPC9rYmQ+LAoteW91IGNvdWxkIGNsaWNrIGEgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiBlbGVtZW50IGFuZCBjbGljayAgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBBZnRlcjwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj4gQ0Q8L3NwYW4+PC9zcGFuPiwKLWFzIGEgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiBlbGVtZW50IGNhbiBnbyBhZnRlciBhbm90aGVyIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+Q0Q8L2tiZD4gZWxlbWVudC48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwQkYgIj5SZXBsYWNlIFdpdGg8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBDNiAiPlJlcGxhY2Ugb25lIGl0ZW0gd2l0aCBhbm90aGVyLiBUaGlzIG9wdGlvbiBpcwotbm90IGF2YWlsYWJsZSBpZiB5b3UgdHVybiBncmFtbWFyIGNvbnN0cmFpbnRzIG9mZiBvciBpZiB0aGVyZSBhcmUKLW5vIHZhbGlkIGFsdGVybmF0aXZlcyBmb3IgeW91IHRvIHJlcGxhY2UgdGhlIGl0ZW0gd2l0aC48L3RkPgotCi08L3RyPgotCi08L3Rib2R5PgotCi08L3RhYmxlPgotPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+QW55IGNoYW5nZXMgeW91IG1ha2UgaW4gdGhlIERlc2lnbiB2aWV3IGFyZSBhbHNvIHJlZmxlY3RlZAotaW4gdGhlIFNvdXJjZSB2aWV3IGFuZCB0aGUgT3V0bGluZSB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaGVzZSBpbnN0cnVjdGlvbnMKLXdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yawotaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9kaXY+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgdGl0bGU9IlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIGVkaXQgeW91ciBET0NUWVBFIGRlY2xhcmF0aW9uIHRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIj5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiB0aXRsZT0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHByb2MuaHRtbCIgdGl0bGU9IklmIHlvdSBoYXZlIGluc3RydWN0aW9ucyB5b3Ugd2FudCB0byBzZW5kIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGFuIFhNTCBkb2N1bWVudCwgeW91IGNhbiB1c2UgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiI+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvcnhtbGJpY29ucy5odG1sIiB0aXRsZT0iVGhlIGZvbGxvd2luZyBYTUwgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSBhbmQgRGVzaWduIHZpZXcuIj5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhOGZhYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR4ZWR0c3JjIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UNCi1jb2RlIGRpcmVjdGx5Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPlNvdXJjZSB2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD4gVGhlIFNvdXJjZSB2aWV3IGhhcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhczo8L3A+PGRsPg0KLTxkbGVudHJ5Pg0KLTxkdD5TeW50YXggaGlnaGxpZ2h0aW5nPC9kdD4NCi08ZGQ+RWFjaCB0YWcgdHlwZSBpcyBoaWdobGlnaHRlZCBkaWZmZXJlbnRseSwgZW5hYmxpbmcgeW91IHRvIGVhc2lseSBmaW5kDQotYSBjZXJ0YWluIGtpbmQgb2YgdGFnIGZvciBlZGl0aW5nLiBJbiBhZGRpdGlvbiwgc3ludGF4IGhpZ2hsaWdodGluZyBpcyB2YWx1YWJsZQ0KLWluIGxvY2F0aW5nIHN5bnRheCBlcnJvcnMuIEZvciBleGFtcGxlLCBpZiB5b3UgYmVnaW4gYSBjb21tZW50IGluIHRoZSBtaWRkbGUNCi1vZiB0aGUgZG9jdW1lbnQgd2l0aCA8Y29kZXBoPiZsdDshLS08L2NvZGVwaD4gZXZlcnl0aGluZyB1bnRpbCB0aGUgbmV4dCA8Y29kZXBoPi0tPjwvY29kZXBoPiBpcw0KLWNvbnNpZGVyZWQgYSBjb21tZW50LCBhbmQgd2lsbCBiZSBoaWdobGlnaHRlZCBhY2NvcmRpbmdseS4gVGhlIGxhcmdlIGhpZ2hsaWdodGVkDQotYXJlYSB3aWxsIGluZGljYXRlIHRoYXQgeW91IG5lZWQgdG8gYWRkIDxjb2RlcGg+LS0+PC9jb2RlcGg+IHRvIGNsb3NlIHRoZQ0KLWNvbW1lbnQuPHA+WW91IGNhbiBjdXN0b21pemUgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcuIFJlZmVyIHRvIHRoZSByZWxhdGVkDQotdGFza3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PGRsPjxkbGVudHJ5Pg0KLTxkdD5VbmxpbWl0ZWQgdW5kbyBhbmQgcmVkbzwvZHQ+DQotPGRkPlRoZXNlIG9wdGlvbnMgYWxsb3cgeW91IHRvIGluY3JlbWVudGFsbHkgdW5kbyBhbmQgcmVkbyBldmVyeSBjaGFuZ2UgbWFkZQ0KLXRvIGEgZmlsZSBmb3IgdGhlIGVudGlyZSBlZGl0aW5nIHNlc3Npb24uIEZvciB0ZXh0LCBjaGFuZ2VzIGFyZSBpbmNyZW1lbnRlZA0KLW9uZSBjaGFyYWN0ZXIgb3Igc2V0IG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgYXQgYSB0aW1lLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5Db250ZW50IGFzc2lzdDwvZHQ+DQotPGRkPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBmaW5pc2ggdGFncyBhbmQgaW5zZXJ0IG1hY3Jvcy4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQNCi10YXNrIGZvciBtb3JlIGRldGFpbHMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PlRlbXBsYXRlPC9kdD4NCi08ZGQ+WW91IGNhbiBhY2Nlc3MgdGVtcGxhdGVzICh1c2luZyBjb250ZW50IGFzc2lzdCkgdG8gaGVscCB5b3UgcXVpY2tseSBhZGQNCi1yZWd1bGFybHktdXNlZCB0YWdnaW5nIGNvbWJpbmF0aW9ucy4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFzayBmb3IgbW9yZSBkZXRhaWxzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5Ob2RlIHNlbGVjdGlvbjwvZHQ+DQotPGRkPkJhc2VkIG9uIHRoZSBsb2NhdGlvbiBvZiB5b3VyIGN1cnNvciAob3Igc2VsZWN0aW9uIGluIHRoZSBPdXRsaW5lIHZpZXcpLA0KLXRoZSBub2RlIHNlbGVjdGlvbiBpbmRpY2F0b3IgaGlnaGxpZ2h0cyB0aGUgbGluZSBudW1iZXJzIHRoYXQgaW5jbHVkZSBhIG5vZGUNCi0oZm9yIGV4YW1wbGUsIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlKSwgaW4gdGhlIHZlcnRpY2FsIHJ1bGVyIGluIHRoZSBsZWZ0DQotYXJlYSBvZiB0aGUgU291cmNlIHZpZXcuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PlBvcC11cCBtZW51IG9wdGlvbnM8L2R0Pg0KLTxkZD5Gcm9tIHRoZSBlZGl0b3IncyBwb3AtdXAgbWVudSwgeW91IGhhdmUgbWFueSBvZiB0aGUgc2FtZSBlZGl0aW5nIG9wdGlvbnMNCi1hdmFpbGFibGUgYXMgeW91IGRvIGZyb20gdGhlIHdvcmtiZW5jaCAgPGI+RWRpdDwvYj4gbWVudS4gWW91IGNhbiBzZWxlY3QgbWVudQ0KLW9wdGlvbnMgc3VjaCBhczogPHVpY29udHJvbD5DbGVhbnVwIERvY3VtZW50LDwvdWljb250cm9sPiB0byBvcGVuIHRoZSA8dWljb250cm9sPkNsZWFudXA8L3VpY29udHJvbD4gDQotZGlhbG9nLCB3aGljaCBjb250YWlucyBzZXR0aW5ncyB0byB1cGRhdGUgYSBkb2N1bWVudCBzbyB0aGF0IGl0IGlzIHdlbGwtZm9ybWVkDQotYW5kIGZvcm1hdHRlZCBhbmQgPHVpY29udHJvbD5Gb3JtYXQsPC91aWNvbnRyb2w+IHdoaWNoIGZvcm1hdHMgZWl0aGVyIHRoZQ0KLWVudGlyZSBkb2N1bWVudCBvciBzZWxlY3RlZCBlbGVtZW50cy48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+IlNtYXJ0IiBkb3VibGUgY2xpY2tpbmc8L2R0Pg0KLTxkZD5Zb3UgY2FuIHVzZSBkb3VibGUtY2xpY2sgdG8gc2VsZWN0IGF0dHJpYnV0ZSB2YWx1ZXMsIGF0dHJpYnV0ZS12YWx1ZSBwYWlycywNCi1hbmQgZW50aXJlIHRhZyBzZXRzIHRvIHF1aWNrbHkgdXBkYXRlLCBjb3B5LCBvciByZW1vdmUgY29udGVudC48L2RkPg0KLTwvZGxlbnRyeT48L2RsPjxwPlRvIG9wZW4gYW4gWE1MIGZpbGUgdG8gZWRpdCwgcmlnaHQtY2xpY2sgdGhlIGZpbGUgaW4gdGhlDQotTmF2aWdhdG9yIHZpZXcgYW5kIHNlbGVjdCA8dWljb250cm9sPk9wZW4gV2l0aCA+IFhNTCBFZGl0b3I8L3VpY29udHJvbD4uIENsaWNrDQotdGhlIDx1aWNvbnRyb2w+U291cmNlPC91aWNvbnRyb2w+IHRvIHNlZSB0aGUgU291cmNlIHZpZXcuPC9wPjxwPkVkaXQgdGhlIGNvZGUNCi1hcyBuZWNlc3NhcnksIHVzaW5nIGFueSBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzLiBBcyB5b3UgbW92ZSB0aGUgY3Vyc29yDQotd2l0aGluIHlvdXIgWE1MIGZpbGUgKG9yIHNlbGVjdCBpdGVtcyBmcm9tIHRoZSBPdXRsaW5lIHZpZXcpLCB0aGUgbm9kZSBzZWxlY3Rpb24NCi1pbmRpY2F0b3Igd2lsbCBoaWdobGlnaHQgdGhlIGxpbmUgbnVtYmVycyB0aGF0IGVuY29tcGFzcyB0aGUgbm9kZSAoZm9yIGV4YW1wbGUsDQotYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUpLiBZb3UgY2FuIHVzZSBzbWFydCBkb3VibGUtY2xpY2tpbmcgYmVoYXZpb3IgdG8gc2VsZWN0DQotYXR0cmlidXRlIHZhbHVlcywgYXR0cmlidXRlLXZhbHVlIHBhaXJzLCBhbmQgZW50aXJlIHRhZyBzZXRzIHRvIHF1aWNrbHkgdXBkYXRlLA0KLWNvcHksIG9yIHJlbW92ZSBjb250ZW50LiA8P1B1YiBDYXJldD8+SWYgZGVzaXJlZCwgdmFsaWRhdGUgYW5kIHNhdmUgdGhlIFhNTA0KLWZpbGUuPC9wPjwvY29udGV4dD4NCi08cmVzdWx0PjxwPkFueSBjaGFuZ2VzIHlvdSBtYWtlIGluIHRoZSBTb3VyY2UgdmlldyBhcmUgYWxzbyByZWZsZWN0ZWQgaW4gdGhlDQotRGVzaWduIHZpZXcgYW5kIHRoZSBPdXRsaW5lIHZpZXcuPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzNzgxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODM5ZTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHNyYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgU291cmNlIHZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBTb3VyY2UgdmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Y2Rhc3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3bWFjcm8uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R0YWdoaWx0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHhlZHRzcmMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHhlZHRzcmMiPjxhIG5hbWU9InR4ZWR0c3JjIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UKLWNvZGUgZGlyZWN0bHkuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD4gVGhlIFNvdXJjZSB2aWV3IGhhcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhczo8L3A+Ci08ZGw+Ci0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5TeW50YXggaGlnaGxpZ2h0aW5nPC9kdD4KLQotPGRkPkVhY2ggdGFnIHR5cGUgaXMgaGlnaGxpZ2h0ZWQgZGlmZmVyZW50bHksIGVuYWJsaW5nIHlvdSB0byBlYXNpbHkgZmluZAotYSBjZXJ0YWluIGtpbmQgb2YgdGFnIGZvciBlZGl0aW5nLiBJbiBhZGRpdGlvbiwgc3ludGF4IGhpZ2hsaWdodGluZyBpcyB2YWx1YWJsZQotaW4gbG9jYXRpbmcgc3ludGF4IGVycm9ycy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBiZWdpbiBhIGNvbW1lbnQgaW4gdGhlIG1pZGRsZQotb2YgdGhlIGRvY3VtZW50IHdpdGggPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0OyEtLTwvc2FtcD4gZXZlcnl0aGluZyB1bnRpbCB0aGUgbmV4dCA8c2FtcCBjbGFzcz0iY29kZXBoIj4tLSZndDs8L3NhbXA+IGlzCi1jb25zaWRlcmVkIGEgY29tbWVudCwgYW5kIHdpbGwgYmUgaGlnaGxpZ2h0ZWQgYWNjb3JkaW5nbHkuIFRoZSBsYXJnZSBoaWdobGlnaHRlZAotYXJlYSB3aWxsIGluZGljYXRlIHRoYXQgeW91IG5lZWQgdG8gYWRkIDxzYW1wIGNsYXNzPSJjb2RlcGgiPi0tJmd0Ozwvc2FtcD4gdG8gY2xvc2UgdGhlCi1jb21tZW50LjxwPllvdSBjYW4gY3VzdG9taXplIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nLiBSZWZlciB0byB0aGUgcmVsYXRlZAotdGFza3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPC9kZD4KLQotPC9kbD4KLTxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5VbmxpbWl0ZWQgdW5kbyBhbmQgcmVkbzwvZHQ+Ci0KLTxkZD5UaGVzZSBvcHRpb25zIGFsbG93IHlvdSB0byBpbmNyZW1lbnRhbGx5IHVuZG8gYW5kIHJlZG8gZXZlcnkgY2hhbmdlIG1hZGUKLXRvIGEgZmlsZSBmb3IgdGhlIGVudGlyZSBlZGl0aW5nIHNlc3Npb24uIEZvciB0ZXh0LCBjaGFuZ2VzIGFyZSBpbmNyZW1lbnRlZAotb25lIGNoYXJhY3RlciBvciBzZXQgb2Ygc2VsZWN0ZWQgY2hhcmFjdGVycyBhdCBhIHRpbWUuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+Q29udGVudCBhc3Npc3Q8L2R0PgotCi08ZGQ+Q29udGVudCBhc3Npc3QgaGVscHMgeW91IGZpbmlzaCB0YWdzIGFuZCBpbnNlcnQgbWFjcm9zLiBSZWZlciB0byB0aGUgcmVsYXRlZAotdGFzayBmb3IgbW9yZSBkZXRhaWxzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlRlbXBsYXRlPC9kdD4KLQotPGRkPllvdSBjYW4gYWNjZXNzIHRlbXBsYXRlcyAodXNpbmcgY29udGVudCBhc3Npc3QpIHRvIGhlbHAgeW91IHF1aWNrbHkgYWRkCi1yZWd1bGFybHktdXNlZCB0YWdnaW5nIGNvbWJpbmF0aW9ucy4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFzayBmb3IgbW9yZSBkZXRhaWxzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPk5vZGUgc2VsZWN0aW9uPC9kdD4KLQotPGRkPkJhc2VkIG9uIHRoZSBsb2NhdGlvbiBvZiB5b3VyIGN1cnNvciAob3Igc2VsZWN0aW9uIGluIHRoZSBPdXRsaW5lIHZpZXcpLAotdGhlIG5vZGUgc2VsZWN0aW9uIGluZGljYXRvciBoaWdobGlnaHRzIHRoZSBsaW5lIG51bWJlcnMgdGhhdCBpbmNsdWRlIGEgbm9kZQotKGZvciBleGFtcGxlLCBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSksIGluIHRoZSB2ZXJ0aWNhbCBydWxlciBpbiB0aGUgbGVmdAotYXJlYSBvZiB0aGUgU291cmNlIHZpZXcuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+UG9wLXVwIG1lbnUgb3B0aW9uczwvZHQ+Ci0KLTxkZD5Gcm9tIHRoZSBlZGl0b3IncyBwb3AtdXAgbWVudSwgeW91IGhhdmUgbWFueSBvZiB0aGUgc2FtZSBlZGl0aW5nIG9wdGlvbnMKLWF2YWlsYWJsZSBhcyB5b3UgZG8gZnJvbSB0aGUgd29ya2JlbmNoICA8c3Ryb25nPkVkaXQ8L3N0cm9uZz4gbWVudS4gWW91IGNhbiBzZWxlY3QgbWVudQotb3B0aW9ucyBzdWNoIGFzOiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DbGVhbnVwIERvY3VtZW50LDwvc3Bhbj4gdG8gb3BlbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2xlYW51cDwvc3Bhbj4gCi1kaWFsb2csIHdoaWNoIGNvbnRhaW5zIHNldHRpbmdzIHRvIHVwZGF0ZSBhIGRvY3VtZW50IHNvIHRoYXQgaXQgaXMgd2VsbC1mb3JtZWQKLWFuZCBmb3JtYXR0ZWQgYW5kIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZvcm1hdCw8L3NwYW4+IHdoaWNoIGZvcm1hdHMgZWl0aGVyIHRoZQotZW50aXJlIGRvY3VtZW50IG9yIHNlbGVjdGVkIGVsZW1lbnRzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPiJTbWFydCIgZG91YmxlIGNsaWNraW5nPC9kdD4KLQotPGRkPllvdSBjYW4gdXNlIGRvdWJsZS1jbGljayB0byBzZWxlY3QgYXR0cmlidXRlIHZhbHVlcywgYXR0cmlidXRlLXZhbHVlIHBhaXJzLAotYW5kIGVudGlyZSB0YWcgc2V0cyB0byBxdWlja2x5IHVwZGF0ZSwgY29weSwgb3IgcmVtb3ZlIGNvbnRlbnQuPC9kZD4KLQotPC9kbD4KLTxwPlRvIG9wZW4gYW4gWE1MIGZpbGUgdG8gZWRpdCwgcmlnaHQtY2xpY2sgdGhlIGZpbGUgaW4gdGhlCi1OYXZpZ2F0b3IgdmlldyBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4gV2l0aCAmZ3Q7IFhNTCBFZGl0b3I8L3NwYW4+LiBDbGljawotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNvdXJjZTwvc3Bhbj4gdG8gc2VlIHRoZSBTb3VyY2Ugdmlldy48L3A+Ci08cD5FZGl0IHRoZSBjb2RlCi1hcyBuZWNlc3NhcnksIHVzaW5nIGFueSBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzLiBBcyB5b3UgbW92ZSB0aGUgY3Vyc29yCi13aXRoaW4geW91ciBYTUwgZmlsZSAob3Igc2VsZWN0IGl0ZW1zIGZyb20gdGhlIE91dGxpbmUgdmlldyksIHRoZSBub2RlIHNlbGVjdGlvbgotaW5kaWNhdG9yIHdpbGwgaGlnaGxpZ2h0IHRoZSBsaW5lIG51bWJlcnMgdGhhdCBlbmNvbXBhc3MgdGhlIG5vZGUgKGZvciBleGFtcGxlLAotYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUpLiBZb3UgY2FuIHVzZSBzbWFydCBkb3VibGUtY2xpY2tpbmcgYmVoYXZpb3IgdG8gc2VsZWN0Ci1hdHRyaWJ1dGUgdmFsdWVzLCBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMsIGFuZCBlbnRpcmUgdGFnIHNldHMgdG8gcXVpY2tseSB1cGRhdGUsCi1jb3B5LCBvciByZW1vdmUgY29udGVudC4gSWYgZGVzaXJlZCwgdmFsaWRhdGUgYW5kIHNhdmUgdGhlIFhNTAotZmlsZS48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+QW55IGNoYW5nZXMgeW91IG1ha2UgaW4gdGhlIFNvdXJjZSB2aWV3IGFyZSBhbHNvIHJlZmxlY3RlZCBpbiB0aGUKLURlc2lnbiB2aWV3IGFuZCB0aGUgT3V0bGluZSB2aWV3LjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuIj5YTUwgZWRpdG9yPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgd2l0aCBOb2RlIGFuZCBDb250ZW50IGNvbHVtbnMgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NkYXN0Lmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5pc2ggYSB0YWcgb3IgbGluZSBvZiBjb2RlIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvci4gWW91IGNhbiBhbHNvIHVzZSBjb250ZW50IGFzc2lzdCB0byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS4iPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3bWFjcm8uaHRtbCIgdGl0bGU9IlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgc2VjdGlvbiBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdSBkbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS4iPldvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHRhZ2hpbHQuaHRtbCIgdGl0bGU9IklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIFhNTCBzb3VyY2UgY29kZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCBzdWNoIGFzIHRoZSBjb2xvcnMgdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uIj5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE2NWZmMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR4ZWR0dGFnIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIFhNTCBmaWxlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBYTUwgZmlsZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgWE1MIGZpbGVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPlhNTCBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5lZGl0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBvcGVuIGFuIFhNTCBmaWxlIGluIHRoZSBYTUwgZWRpdG9yLCByaWdodC1jbGljayBpdCBpbiB0aGUgTmF2aWdhdG9yDQotdmlldyBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPk9wZW4gV2l0aDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MDQotRWRpdG9yPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uIDwvcD48cD5XZSByZWNvbW1lbmQgd29ya2luZyBpbiB0aGUgUmVzb3VyY2UNCi1wZXJzcGVjdGl2ZSB3aGVuIHlvdSBhcmUgZGV2ZWxvcGluZyBYTUwgZmlsZXMuIFRoZSB2aWV3cyB0aGF0IGFwcGVhciBieSBkZWZhdWx0DQotaW4gdGhpcyBwZXJzcGVjdGl2ZSAoc3VjaCBhcyB0aGUgT3V0bGluZSB2aWV3KSBoZWxwIGZhY2lsaXRhdGUgWE1MIGRldmVsb3BtZW50LjwvcD48cD5UaGUNCi1YTUwgZWRpdG9yIGVuYWJsZXMgeW91IHRvIGRpcmVjdGx5IGVkaXQgWE1MIGZpbGVzLiBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQNCi12aWV3cyB5b3UgY2FuIHVzZSB0byBlZGl0IHlvdXIgZmlsZXM6PC9wPjx1bD4NCi08bGk+PGI+U291cmNlIHZpZXc8L2I+OiB5b3UgY2FuIG1hbnVhbGx5IGluc2VydCwgZWRpdCwgYW5kIGRlbGV0ZSBlbGVtZW50cw0KLWFuZCBhdHRyaWJ1dGVzIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvci4gVG8gZmFjaWxpdGF0ZSB0aGlzIGVmZm9ydCwNCi15b3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB3aGlsZSB5b3UgYXJlIGluIHRoZSBTb3VyY2Ugdmlldy48L2xpPg0KLTxsaT48Yj5EZXNpZ24gdmlldzwvYj46IHlvdSBjYW4gaW5zZXJ0LCBkZWxldGUsIGFuZCBlZGl0IGVsZW1lbnRzLCBhdHRyaWJ1dGVzLA0KLWNvbW1lbnRzLCBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgaW4gdGhpcyB2aWV3LjwvbGk+DQotPGxpPjxiPk91dGxpbmUgdmlldzwvYj46IHlvdSBjYW4gaW5zZXJ0IGFuZCBkZWxldGUgZWxlbWVudHMgYXR0cmlidXRlcywgY29tbWVudHMsDQotYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgdmlldy48L2xpPg0KLTwvdWw+PHA+T2Z0ZW4sIHlvdSBtYXkgZmluZCB0aGF0IHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgd2F5IHRvIHBlcmZvcm0gYSBzcGVjaWZpYw0KLXRhc2suIEZvciBleGFtcGxlLCB5b3UgaGF2ZSBhbiBYTUwgZmlsZSAiTXlTY2hvb2xTdWJqZWN0cy54bWwiIGFzc29jaWF0ZWQNCi13aXRoIGFuIFhNTCBzY2hlbWEgZmlsZSAiU2Nob29sU3ViamVjdHMueHNkIiwgd2hpY2ggbGlzdCBhbGwgdGhlIHN1YmplY3RzDQotdGF1Z2h0IGluIGEgc2Nob29sLiBZb3Ugd2FudCB0byBpbnNlcnQgYSBuZXcgZWxlbWVudCAiTWF0aCIgaW50byB5b3VyIGZpbGUuDQotWW91IGNhbiBkbyBzbyBpbiB0aGUgZm9sbG93aW5nIHdheXM6PC9wPjx1bD4NCi08bGk+SW4gdGhlIE91dGxpbmUgb3IgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBhcHByb3ByaWF0ZSBwYXJlbnQgZWxlbWVudA0KLWFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+QWRkIENoaWxkPC91aWNvbnRyb2w+PHVpY29udHJvbD5NYXRoPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gb3IgPHVpY29udHJvbD5OZXcgRWxlbWVudDwvdWljb250cm9sPiBhbmQgZW50ZXIgdGhlIG5hbWUgb2YNCi10aGUgY2hpbGQgZWxlbWVudDw/UHViIENhcmV0Pz4uPC9saT4NCi08bGk+SW4gdGhlIFNvdXJjZSB2aWV3LCB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluZCB0aGUgYXBwcm9wcmlhdGUNCi1sb2NhdGlvbiBhbmQgY29kZSBmb3IgdGhlIDx1aWNvbnRyb2w+TWF0aDwvdWljb250cm9sPiBlbGVtZW50LjwvbGk+DQotPGxpPkluIHRoZSBTb3VyY2UgdmlldywgdHlwZSB0aGUgY29kZSBmb3IgdGhlIDx1aWNvbnRyb2w+TWF0aDwvdWljb250cm9sPiBlbGVtZW50DQotaW4gdGhlIGZpbGUuPC9saT4NCi08L3VsPjwvY29udGV4dD4NCi08cG9zdHJlcT48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDI1MzA/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1M2I3ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIFhNTCBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBYTUwgZmlsZXMsIGVkaXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBYTUwgZmlsZXMsIGVkaXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4ZWR0dGFnIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBYTUwgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4ZWR0dGFnIj48YSBuYW1lPSJ0eGVkdHRhZyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBYTUwgZmlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIG9wZW4gYW4gWE1MIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IsIHJpZ2h0LWNsaWNrIGl0IGluIHRoZSBOYXZpZ2F0b3IKLXZpZXcgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4gV2l0aDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwKLUVkaXRvcjwvc3Bhbj48L3NwYW4+LiA8L3A+Ci08cD5XZSByZWNvbW1lbmQgd29ya2luZyBpbiB0aGUgUmVzb3VyY2UKLXBlcnNwZWN0aXZlIHdoZW4geW91IGFyZSBkZXZlbG9waW5nIFhNTCBmaWxlcy4gVGhlIHZpZXdzIHRoYXQgYXBwZWFyIGJ5IGRlZmF1bHQKLWluIHRoaXMgcGVyc3BlY3RpdmUgKHN1Y2ggYXMgdGhlIE91dGxpbmUgdmlldykgaGVscCBmYWNpbGl0YXRlIFhNTCBkZXZlbG9wbWVudC48L3A+Ci08cD5UaGUKLVhNTCBlZGl0b3IgZW5hYmxlcyB5b3UgdG8gZGlyZWN0bHkgZWRpdCBYTUwgZmlsZXMuIFRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudAotdmlld3MgeW91IGNhbiB1c2UgdG8gZWRpdCB5b3VyIGZpbGVzOjwvcD4KLTx1bD4KLTxsaT48c3Ryb25nPlNvdXJjZSB2aWV3PC9zdHJvbmc+OiB5b3UgY2FuIG1hbnVhbGx5IGluc2VydCwgZWRpdCwgYW5kIGRlbGV0ZSBlbGVtZW50cwotYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBUbyBmYWNpbGl0YXRlIHRoaXMgZWZmb3J0LAoteW91IGNhbiB1c2UgY29udGVudCBhc3Npc3Qgd2hpbGUgeW91IGFyZSBpbiB0aGUgU291cmNlIHZpZXcuPC9saT4KLQotPGxpPjxzdHJvbmc+RGVzaWduIHZpZXc8L3N0cm9uZz46IHlvdSBjYW4gaW5zZXJ0LCBkZWxldGUsIGFuZCBlZGl0IGVsZW1lbnRzLCBhdHRyaWJ1dGVzLAotY29tbWVudHMsIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBpbiB0aGlzIHZpZXcuPC9saT4KLQotPGxpPjxzdHJvbmc+T3V0bGluZSB2aWV3PC9zdHJvbmc+OiB5b3UgY2FuIGluc2VydCBhbmQgZGVsZXRlIGVsZW1lbnRzIGF0dHJpYnV0ZXMsIGNvbW1lbnRzLAotYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgdmlldy48L2xpPgotCi08L3VsPgotPHA+T2Z0ZW4sIHlvdSBtYXkgZmluZCB0aGF0IHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgd2F5IHRvIHBlcmZvcm0gYSBzcGVjaWZpYwotdGFzay4gRm9yIGV4YW1wbGUsIHlvdSBoYXZlIGFuIFhNTCBmaWxlICJNeVNjaG9vbFN1YmplY3RzLnhtbCIgYXNzb2NpYXRlZAotd2l0aCBhbiBYTUwgc2NoZW1hIGZpbGUgIlNjaG9vbFN1YmplY3RzLnhzZCIsIHdoaWNoIGxpc3QgYWxsIHRoZSBzdWJqZWN0cwotdGF1Z2h0IGluIGEgc2Nob29sLiBZb3Ugd2FudCB0byBpbnNlcnQgYSBuZXcgZWxlbWVudCAiTWF0aCIgaW50byB5b3VyIGZpbGUuCi1Zb3UgY2FuIGRvIHNvIGluIHRoZSBmb2xsb3dpbmcgd2F5czo8L3A+Ci08dWw+Ci08bGk+SW4gdGhlIE91dGxpbmUgb3IgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBhcHByb3ByaWF0ZSBwYXJlbnQgZWxlbWVudAotYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBDaGlsZDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXRoPC9zcGFuPgotPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXcgRWxlbWVudDwvc3Bhbj4gYW5kIGVudGVyIHRoZSBuYW1lIG9mCi10aGUgY2hpbGQgZWxlbWVudC48L2xpPgotCi08bGk+SW4gdGhlIFNvdXJjZSB2aWV3LCB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluZCB0aGUgYXBwcm9wcmlhdGUKLWxvY2F0aW9uIGFuZCBjb2RlIGZvciB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWF0aDwvc3Bhbj4gZWxlbWVudC48L2xpPgotCi08bGk+SW4gdGhlIFNvdXJjZSB2aWV3LCB0eXBlIHRoZSBjb2RlIGZvciB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWF0aDwvc3Bhbj4gZWxlbWVudAotaW4gdGhlIGZpbGUuPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiAvPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuIj5YTUwgZWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgd2l0aCBOb2RlIGFuZCBDb250ZW50IGNvbHVtbnMgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhtbGNhdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eG1sY2F0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZmY4MmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eG1sY2F0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDgsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIFN0eSBfZGlzcGxheSBGb250Q29sb3I9InJlZCI/Pg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InR4bWxjYXQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlhNTCBDYXRhbG9nIGVudHJpZXMgYXJlIHVzZWQgdG8gbWFwIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2VzDQotdG8gbG9jYWxseSBkZWZpbmVkIHJlc291cmNlcy4gWW91IGNhbiBwcm92aWRlIHJ1bGVzIHNwZWNpZnkgaG93IHRoZXNlDQotZW50aXRpZXMgYXJlIHJlc29sdmVkPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGNhdGFsb2c8aW5kZXh0ZXJtPmFkZGluZyBlbnRyaWVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Gb3IgZGV0YWlscyBvbiB0aGUgc3RhbmRhcmQgZm9yIFhNTCBDYXRhbG9ncywgc2VlOiA8eHJlZg0KLWhyZWY9Imh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9kb3dubG9hZC5waHAvMTQ4MDkveG1sLWNhdGFsb2dzLmh0bWwiDQotc2NvcGU9ImV4dGVybmFsIj48L3hyZWY+LjwvcD48cD5Gb3IgZXhhbXBsZTogeW91IGFyZSB3b3JraW5nIG9uIGFuDQotWE1MIGZpbGUgb24gYSBjb21wdXRlciBhbmQgcG9pbnQgaXRzIDxjb2RlcGg+c2NoZW1hTG9jYXRpb248L2NvZGVwaD4gdG93YXJkcw0KLWEgc2NoZW1hIGNhbGxlZCA8Y29kZXBoPmM6XE15U2NoZW1hLnhzZDwvY29kZXBoPi4gSWYgeW91IGRvIG5vdCB1c2UNCi1hbiBYTUwgY2F0YWxvZywgdGhlbiB3aGVuIHlvdSBmaW5pc2ggZWRpdGluZyB0aGUgWE1MIGZpbGUgYW5kIGFyZQ0KLXJlYWR5IHRvIHB1Ymxpc2ggaXQgb24gdGhlIFdlYiwgeW91IHdpbGwgbmVlZCB0byBlZGl0IDxjb2RlcGg+c2NoZW1hTG9jYXRpb248L2NvZGVwaD4gc28NCi10aGF0IGl0IHBvaW50cyB0byBhIHJlc291cmNlIHRoYXQgaXMgYWNjZXNzaWJsZSBvbiB0aGUgV2ViLjwvcD48cD5Ubw0KLWF2b2lkIG1ha2luZyBmcmVxdWVudCBjaGFuZ2VzIHRvIHlvdXIgWE1MIGRvY3VtZW50LCB5b3UgY2FuIHVzZSB0aGUNCi1YTUwgQ2F0YWxvZzogeW91IGNvdWxkIHNwZWNpZnkgYSBydWxlIHRoYXQgcmVkaXJlY3RzIGFuIEludGVybmV0IHJlc291cmNlDQotcmVmZXJlbmNlIChmb3IgZXhhbXBsZSwgIDxjb2RlcGg+Imh0dHA6Ly93d3cuaWJtLmNvbS9wdWJsaXNoZWQtc2NoZW1hcy9NeVNjaGVtYS54c2QiPC9jb2RlcGg+KQ0KLXNvIHRoYXQgaXQgcG9pbnRzIHRvIGEgcmVzb3VyY2Ugb24gdGhlIGxvY2FsIG1hY2hpbmUgKGZvciBleGFtcGxlLA0KLSA8Y29kZXBoPiJmaWxlOi8vL0M6L015U2NoZW1hLnhzZCI8L2NvZGVwaD4pLiBOb3csIGluc3RlYWQgb2YgZnJlcXVlbnRseQ0KLWVkaXRpbmcgWE1MIGRvY3VtZW50cyB0byB1cGRhdGUgdGhlIFVSSXMgb3IgbG9jYXRpb25zIChlc3BlY2lhbGx5DQotd2hlbiB0aGVyZSBhcmUgbWFueSBkb2N1bWVudHMgaW4geW91ciBwcm9qZWN0KSwgeW91IG9ubHkgbmVlZCB0byB1cGRhdGUNCi1hIHNpbmdsZSBydWxlIGluIHlvdXIgWE1MIENhdGFsb2cuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zDQotd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrDQotaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiBlbnRyeSB0byB0aGUgWE1MIENhdGFsb2csDQotZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB0aGUgWE1MIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBhc3NvY2lhdGUgd2l0aCBhIERURA0KLW9yIFhNTCBzY2hlbWEuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+WE1MIENhdGFsb2c8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48aW5mbz5UaGUgIDx1aWNvbnRyb2w+WE1MDQotQ2F0YWxvZyBFbnRyaWVzPC91aWNvbnRyb2w+IHNlY3Rpb24gY29udGFpbnMgYSBsaXN0IG9mIGFueSB1c2VyLWRlZmluZWQNCi1hbmQgcGx1Zy1pbiBkZWZpbmVkIGNhdGFsb2cgZW50cmllcy4gU2VsZWN0IGFueSBlbnRyeSB0byBzZWUgaW5mb3JtYXRpb24NCi1hYm91dCBpdCBpbiB0aGUgPHVpY29udHJvbD5EZXRhaWxzPC91aWNvbnRyb2w+IHNlY3Rpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+QWRkPC91aWNvbnRyb2w+IHRvIGNyZWF0ZSBhIG5ldyBjYXRhbG9nDQotZW50cnkuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIGxlZnQtaGFuZCBjb2x1bW4sIGNsaWNrIHRoZSB0eXBlIG9mIGNhdGFsb2cgZW50cnkNCi10aGF0IHlvdSB3YW50IHRvIGFkZDo8L2NtZD4NCi08Y2hvaWNldGFibGU+DQotPGNocm93PjxjaG9wdGlvbj5DYXRhbG9nIEVudHJ5PC9jaG9wdGlvbj48Y2hkZXNjPlVzZWQgYnkgYW4gWE1MIHByb2Nlc3Nvcg0KLXdoZW4gcmVzb2x2aW5nIGVudGl0eSByZWZlcmVuY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgdG8gdGhlIGNhdGFsb2cNCi10byBzcGVjaWZ5IGhvdyBlbnRpdGllcyBzaG91bGQgYmUgcmVzb2x2ZWQuPHA+QW4gWE1MIENhdGFsb2cgZW50cnkNCi1jb250YWlucyB0d28gcGFydHM6PHVsPg0KLTxsaT5BIGtleSAod2hpY2ggcmVwcmVzZW50cyBhIERURCBvciBYTUwgc2NoZW1hKTwvbGk+DQotPGxpPkEgbG9jYXRpb24gKHNpbWlsYXIgdG8gYSBVUkksIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0DQotYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS48L2xpPg0KLTwvdWw+IFlvdSBjYW4gcGxhY2UgdGhlIEtleSBpbiBhbiBYTUwgZmlsZS4gV2hlbiB0aGUgWE1MIHByb2Nlc3Nvcg0KLWVuY291bnRlcnMgaXQsIGl0IHdpbGwgdXNlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0byBmaW5kIHRoZSBsb2NhdGlvbg0KLW9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleTwvcD48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+UmV3cml0ZSBFbnRyeTwvY2hvcHRpb24+PGNoZGVzYz5Vc2VkIHRvIHJlZGlyZWN0DQotYSBzZXQgb2YgZW50aXRpZXMuPC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPlN1ZmZpeCBFbnRyeTwvY2hvcHRpb24+PGNoZGVzYz5Vc2VkIHRvIG1hdGNoIHRoZQ0KLXN1ZmZpeCBvZiBhIFVSSSBvciBzeXN0ZW1JRC48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+TmV4dCBDYXRhbG9nPC9jaG9wdGlvbj48Y2hkZXNjPlVzZWQgdG8gcmVmZXIgdG8gYW5vdGhlcg0KLWNhdGFsb2cgd2l0aG91dCBpbXBvcnRpbmcgaXQgaW50byB0aGUgd29ya2JlbmNoLjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5EZWxlZ2F0ZSBDYXRhbG9nPC9jaG9wdGlvbj48Y2hkZXNjPlVzZWQgdG8gYXNzb2NpYXRlDQotYW4gYWx0ZXJuYXRlIGNhdGFsb2cgd2l0aCBhbiBpZGVudGlmaWVyLjwvY2hkZXNjPjwvY2hyb3c+DQotPC9jaG9pY2V0YWJsZT4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Db21wbGV0ZSB0aGUgZmllbGRzIGZvciB0aGUgY2F0YWxvZyBlbnRyeSB0aGF0IHlvdSBzZWxlY3RlZDo8L2NtZD4NCi08aW5mbz48dGFibGU+PHRpdGxlPiBDYXRhPD9QdWIgQ2FyZXQ/PmxvZyBlbnRyeSB0eXBlcyBhbmQgYXNzb2NpYXRlZA0KLWZpZWxkczwvdGl0bGU+DQotPHRncm91cCBjb2xzPSIyIj48Y29sc3BlYyBjb2xuYW1lPSJjb2wxIi8+PGNvbHNwZWMgY29sbmFtZT0iY29sMiIvPg0KLTx0aGVhZD4NCi08cm93IHZhbGlnbj0iYm90dG9tIj4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+Q2F0YWxvZyB0eXBlPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+RmllbGRzPC9lbnRyeT4NCi08L3Jvdz4NCi08L3RoZWFkPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeSBjaGFyPSIuIiBjb2xuYW1lPSJjb2wxIj5DYXRhbG9nIEVudHJ5PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+PHVsPg0KLTxsaT5JbiB0aGUgPHVpY29udHJvbD5Mb2NhdGlvbjwvdWljb250cm9sPiBmaWVsZCwgZW50ZXIgb3IgYnJvd3NlDQotZm9yIHRoZSBsb2NhdGlvbiBvciBVUkkgb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGZpbGUuIFRoaXMgdXNlcyB5b3VyDQotY29tcHV0ZXIncyBwYXRoIHN0eWxlIHRvIGRlc2NyaWJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZS4gPC9saT4NCi08bGk+U2VsZWN0IGEgPHVpY29udHJvbD5LZXkgVHlwZTwvdWljb250cm9sPjo8dWw+DQotPGxpPklmIHlvdSBzcGVjaWZpZWQgYSBEVEQ6IHNlbGVjdCA8dWljb250cm9sPlB1YmxpYyBJRDwvdWljb250cm9sPiwgPHVpY29udHJvbD5TeXN0ZW0NCi1JRDwvdWljb250cm9sPiwgb3IgPHVpY29udHJvbD5VUkk8L3VpY29udHJvbD4gZnJvbSB0aGUgPHVpY29udHJvbD5LZXkNCi1UeXBlPC91aWNvbnRyb2w+IGZpZWxkLiBJZiB5b3Ugc2VsZWN0IDx1aWNvbnRyb2w+UHVibGljIElELDwvdWljb250cm9sPiB0aGUNCi12YWx1ZSB5b3UgZW50ZXIgaW4gdGhlIDx1aWNvbnRyb2w+S2V5PC91aWNvbnRyb2w+IGZpZWxkIHNob3VsZCBiZQ0KLXRoZSBzYW1lIGFzIHRoZSBQdWJsaWMgSUQgaW4gdGhlIFhNTCBmaWxlJ3MgRE9DVFlQRSBkZWNsYXJhdGlvbi4gSWYNCi15b3Ugc2VsZWN0IDx1aWNvbnRyb2w+U3lzdGVtIElEPC91aWNvbnRyb2w+LCB0aGUgdmFsdWUgeW91IGVudGVyIHNob3VsZA0KLWNvcnJlc3BvbmQgdG8gdGhlIFN5c3RlbSBJRCBpbiBhbiBYTUwgZmlsZSdzIERPQ1RZUEUgZGVjbGFyYXRpb24uDQotSWYgeW91IHNlbGVjdCA8dWljb250cm9sPlVSSTwvdWljb250cm9sPiwgdGhlIHZhbHVlIHlvdSBlbnRlciBtdXN0DQotYmUgYSBmdWxseSBxdWFsaWZpZWQgVVJJLjwvbGk+DQotPGxpPklmIHlvdSBzcGVjaWZpZWQgYW4gWE1MIHNjaGVtYTogc2VsZWN0IGVpdGhlciA8dWljb250cm9sPk5hbWVzcGFjZQ0KLU5hbWU8L3VpY29udHJvbD4gb3IgIDx1aWNvbnRyb2w+U2NoZW1hIExvY2F0aW9uPC91aWNvbnRyb2w+IGZyb20gdGhlIDx1aWNvbnRyb2w+S2V5DQotVHlwZTwvdWljb250cm9sPiBmaWVsZC4gSWYgdGhlIHNjaGVtYSBkZWZpbmVzIGEgdGFyZ2V0IG5hbWVzcGFjZSwNCi1pdCB3aWxsIGF1dG9tYXRpY2FsbHkgYXBwZWFyIGluIHRoZSA8dWljb250cm9sPktleTwvdWljb250cm9sPiBmaWVsZC4NCi1PdGhlcndpc2UsIHlvdSBjYW4gZW50ZXIgdGhlIHNjaGVtYSBsb2NhdGlvbiBpbiB0aGUgPHVpY29udHJvbD5LZXk8L3VpY29udHJvbD4gZmllbGQuPC9saT4NCi08L3VsPjwvbGk+DQotPGxpPlNlbGVjdCB0aGUgPHVpY29udHJvbD5TcGVjaWZ5IGFsdGVybmF0aXZlIFdlYiBhZGRyZXNzPC91aWNvbnRyb2w+IGNoZWNrDQotYm94IGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGUgV2ViIGFkZHJlc3MgZm9yDQotdGhlIHJlc291cmNlLiA8cD5UaGlzIFdlYiBhZGRyZXNzIGlzIHVzZWQgd2hlbiBhbiBYTUwgaW5zdGFuY2UgaXMNCi1nZW5lcmF0ZWQgZnJvbSB0aGlzIGNhdGFsb2cgZW50cnkuPG5vdGU+VGhpcyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUNCi1pZiB5b3Ugc2VsZWN0IDx1aWNvbnRyb2w+UHVibGljIElEPC91aWNvbnRyb2w+IChmb3IgYSBEVEQpIG9yICA8dWljb250cm9sPk5hbWVzcGFjZQ0KLU5hbWU8L3VpY29udHJvbD4gKGZvciBhIHNjaGVtYSkgaW4gdGhlICA8dWljb250cm9sPktleSB0eXBlPC91aWNvbnRyb2w+IGZpZWxkLjwvbm90ZT48L3A+PC9saT4NCi08L3VsPjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY2hhcj0iLiIgY29sbmFtZT0iY29sMSI+UmV3cml0ZSBFbnRyeTwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPjx1bD4NCi08bGk+U2VsZWN0IGEgPHVpY29udHJvbD5LZXkgdHlwZSB0byBtYXRjaDwvdWljb250cm9sPiwgZWl0aGVyIFVSSQ0KLW9yIHN5c3RlbUlELjwvbGk+DQotPGxpPjx1aWNvbnRyb2w+TWF0Y2hpbmcgc3RhcnQgc3RyaW5nPC91aWNvbnRyb2w+OiBUaGUgbWF0Y2hpbmcgcHJlZml4DQotdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzdXBwbGllZCBpZGVudGlmaWVyLjwvbGk+DQotPGxpPjx1aWNvbnRyb2w+UmV3cml0ZSBwcmVmaXg8L3VpY29udHJvbD46IFRoZSBwcmVmaXggaXMgYmUgdXNlZCBpbnN0ZWFkDQotb2YgdGhlIHByZWZpeCB0aGF0IGlzIHJlbW92ZWQuPC9saT4NCi08L3VsPjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY2hhcj0iLiIgY29sbmFtZT0iY29sMSI+U3VmZml4IEVudHJ5PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+PHVsPg0KLTxsaT5JbiB0aGUgPHVpY29udHJvbD5Mb2NhdGlvbjwvdWljb250cm9sPiBmaWVsZCwgZW50ZXIgb3IgYnJvd3NlDQotZm9yIHRoZSBsb2NhdGlvbiBvciBVUkkgb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGZpbGUuIFRoaXMgdXNlcyB5b3VyDQotY29tcHV0ZXIncyBwYXRoIHN0eWxlIHRvIGRlc2NyaWJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZS4gPC9saT4NCi08bGk+U2VsZWN0IGEgPHVpY29udHJvbD5LZXkgVHlwZTwvdWljb250cm9sPiAoVVJJIG9yIHN5c3RlbUlEKSB0bw0KLW1hdGNoLiA8L2xpPg0KLTxsaT5UeXBlIHRoZSA8dWljb250cm9sPlN1ZmZpeDwvdWljb250cm9sPiBvZiB0aGUgaWRlbnRpZmllciB0byBtYXRjaC48L2xpPg0KLTwvdWw+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjaGFyPSIuIiBjb2xuYW1lPSJjb2wxIj5OZXh0IENhdGFsb2c8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5JbiB0aGUgPHVpY29udHJvbD5Mb2NhdGlvbiBvZiBhbm90aGVyIFhNTCBDYXRhbG9nDQotZmlsZTwvdWljb250cm9sPiBmaWVsZCwgdHlwZSBvciBicm93c2UgZm9yIHRoZSBYTUwgY2F0YWxvZyB5b3Ugd2FudA0KLXRvIHJlZmVyIHRvLiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNoYXI9Ii4iIGNvbG5hbWU9ImNvbDEiPkRlbGVnYXRlIENhdGFsb2c8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj48dWw+DQotPGxpPlNlbGVjdCBhIDx1aWNvbnRyb2w+S2V5IHR5cGUgdG8gbWF0Y2g8L3VpY29udHJvbD4sIGVpdGhlciBVUkkNCi1vciBzeXN0ZW1JRC48L2xpPg0KLTxsaT48dWljb250cm9sPk1hdGNoaW5nIHN0YXJ0IHN0cmluZzwvdWljb250cm9sPjogVGhlIHByZWZpeCBvZiB0aGUNCi1zdXBwbGllZCBpZGVudGlmaWVyIHRvIG1hdGNoLjwvbGk+DQotPGxpPjx1aWNvbnRyb2w+RGVsZWdhdGUgdG8gdGhpcyBYTUwgZmlsZTwvdWljb250cm9sPjogVGhlIGFsdGVybmF0ZQ0KLWNhdGFsb2cgdG8gYXNzb2NpYXRlLjwvbGk+DQotPC91bD48L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGJvZHk+DQotPC90Z3JvdXA+DQotPC90YWJsZT48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2hlbiB5b3UgYXJlIGRvbmUgY3JlYXRpbmcgY2F0YWxvZyBlbnRyaWVzLCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvDQotY2xvc2UgdGhlIEFkZCBYTUwgQ2F0YWxvZyBFbnRyeSBkaWFsb2cuIENsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gYWdhaW4NCi10byBzYXZlIHlvdXIgc2V0dGluZ3MuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+TWFrZSBzdXJlIHRoZSBYTUwgZmlsZSBpcyBpbiBmb2N1cyBhbmQgY2xpY2sgdGhlIDx1aWNvbnRyb2w+UmVsb2FkDQotZGVwZW5kZW5jaWVzPC91aWNvbnRyb2w+IHRvb2xiYXIgYnV0dG9uLiA8L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PlRoZSBYTUwgZmlsZSBpcyBub3cgYXNzb2NpYXRlZCB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZg0KLXRoZSBYTUwgc2NoZW1hIG9yIERURC48L3Jlc3VsdD4NCi08cG9zdHJlcT48cD5Zb3UgY2FuIGFsc28gZXhwb3J0IGFuZCBpbXBvcnQgWE1MIENhdGFsb2cgaW5mb3JtYXRpb246IDwvcD48cD5Ubw0KLWV4cG9ydCwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RmlsZTwvdWljb250cm9sPjx1aWNvbnRyb2w+RXhwb3J0PC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD4NCi08dWljb250cm9sPlhNTCBDYXRhbG9nPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uIFlvdSB3aWxsIGJlIHByb21wdGVkDQotdG8gc2VsZWN0IGEgcHJvamVjdCBhbmQgcHJvdmlkZSBhIGZpbGUgbmFtZSB0byBzdG9yZSB5b3VyIGNhdGFsb2cNCi1lbnRyaWVzIGluIGFuIC54bWxjYXRhbG9nIGZpbGUsIHdoaWNoIGNhbiBiZSBvcGVuZWQgZnJvbSB0aGUgTmF2aWdhdG9yDQotdmlldy4gU2luY2UgeW91ciBjYXRhbG9nIGVudHJpZXMgYXJlIHN0b3JlZCBpbiBhbiAueG1sY2F0YWxvZyBmaWxlLA0KLXlvdSBjYW4gY2hlY2sgdGhlbSBpbiBhbmQgb3V0IGFuZCBzaGFyZSB0aGVtIGxpa2UgYW55IG90aGVyIHByb2plY3QNCi1yZXNvdXJjZS48L3A+PHA+VG8gaW1wb3J0LCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5JbXBvcnQ8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPlhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MIENhdGFsb2c8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi4gVGhlbiBzcGVjaWZ5IHRoZSBmaWxlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGxvYWQgdGhlDQotWE1MIENhdGFsb2cgc2V0dGluZ3MuIFdoZW4geW91IGltcG9ydCBhIC54bWxjYXRhbG9nIGZpbGUsIGFueSBlbnRyaWVzDQotaW4gaXQgd2lsbCBiZSBsb2FkZWQgaW50byB0aGUgWE1MIENhdGFsb2cgKGFuZCBhbnkgZXhpc3RpbmcgZW50cmllcw0KLXdpbGwgYmUgb3ZlcndyaXR0ZW4pLiA8L3A+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDA5MTE3Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhtbGNhdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWY2NjA1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhtbGNhdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJYTUwgQ2F0YWxvZyBlbnRyaWVzIGFyZSB1c2VkIHRvIG1hcCBleHRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlcyB0byBsb2NhbGx5IGRlZmluZWQgcmVzb3VyY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgc3BlY2lmeSBob3cgdGhlc2UgZW50aXRpZXMgYXJlIHJlc29sdmVkIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlhNTCBDYXRhbG9nIGVudHJpZXMgYXJlIHVzZWQgdG8gbWFwIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2VzIHRvIGxvY2FsbHkgZGVmaW5lZCByZXNvdXJjZXMuIFlvdSBjYW4gcHJvdmlkZSBydWxlcyBzcGVjaWZ5IGhvdyB0aGVzZSBlbnRpdGllcyBhcmUgcmVzb2x2ZWQiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgY2F0YWxvZywgYWRkaW5nIGVudHJpZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgY2F0YWxvZywgYWRkaW5nIGVudHJpZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0eG1sY2F0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0eG1sY2F0Ij48YSBuYW1lPSJ0eG1sY2F0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L2gxPgotCi0KLQotCi08ZGl2PjxwPlhNTCBDYXRhbG9nIGVudHJpZXMgYXJlIHVzZWQgdG8gbWFwIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2VzCi10byBsb2NhbGx5IGRlZmluZWQgcmVzb3VyY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgc3BlY2lmeSBob3cgdGhlc2UKLWVudGl0aWVzIGFyZSByZXNvbHZlZDwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+Rm9yIGRldGFpbHMgb24gdGhlIHN0YW5kYXJkIGZvciBYTUwgQ2F0YWxvZ3MsIHNlZTogPGEgaHJlZj0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2Rvd25sb2FkLnBocC8xNDgwOS94bWwtY2F0YWxvZ3MuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9kb3dubG9hZC5waHAvMTQ4MDkveG1sLWNhdGFsb2dzLmh0bWw8L2E+LjwvcD4KLTxwPkZvciBleGFtcGxlOiB5b3UgYXJlIHdvcmtpbmcgb24gYW4KLVhNTCBmaWxlIG9uIGEgY29tcHV0ZXIgYW5kIHBvaW50IGl0cyA8c2FtcCBjbGFzcz0iY29kZXBoIj5zY2hlbWFMb2NhdGlvbjwvc2FtcD4gdG93YXJkcwotYSBzY2hlbWEgY2FsbGVkIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmM6XE15U2NoZW1hLnhzZDwvc2FtcD4uIElmIHlvdSBkbyBub3QgdXNlCi1hbiBYTUwgY2F0YWxvZywgdGhlbiB3aGVuIHlvdSBmaW5pc2ggZWRpdGluZyB0aGUgWE1MIGZpbGUgYW5kIGFyZQotcmVhZHkgdG8gcHVibGlzaCBpdCBvbiB0aGUgV2ViLCB5b3Ugd2lsbCBuZWVkIHRvIGVkaXQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+c2NoZW1hTG9jYXRpb248L3NhbXA+IHNvCi10aGF0IGl0IHBvaW50cyB0byBhIHJlc291cmNlIHRoYXQgaXMgYWNjZXNzaWJsZSBvbiB0aGUgV2ViLjwvcD4KLTxwPlRvCi1hdm9pZCBtYWtpbmcgZnJlcXVlbnQgY2hhbmdlcyB0byB5b3VyIFhNTCBkb2N1bWVudCwgeW91IGNhbiB1c2UgdGhlCi1YTUwgQ2F0YWxvZzogeW91IGNvdWxkIHNwZWNpZnkgYSBydWxlIHRoYXQgcmVkaXJlY3RzIGFuIEludGVybmV0IHJlc291cmNlCi1yZWZlcmVuY2UgKGZvciBleGFtcGxlLCAgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Imh0dHA6Ly93d3cuaWJtLmNvbS9wdWJsaXNoZWQtc2NoZW1hcy9NeVNjaGVtYS54c2QiPC9zYW1wPikKLXNvIHRoYXQgaXQgcG9pbnRzIHRvIGEgcmVzb3VyY2Ugb24gdGhlIGxvY2FsIG1hY2hpbmUgKGZvciBleGFtcGxlLAotIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiJmaWxlOi8vL0M6L015U2NoZW1hLnhzZCI8L3NhbXA+KS4gTm93LCBpbnN0ZWFkIG9mIGZyZXF1ZW50bHkKLWVkaXRpbmcgWE1MIGRvY3VtZW50cyB0byB1cGRhdGUgdGhlIFVSSXMgb3IgbG9jYXRpb25zIChlc3BlY2lhbGx5Ci13aGVuIHRoZXJlIGFyZSBtYW55IGRvY3VtZW50cyBpbiB5b3VyIHByb2plY3QpLCB5b3Ugb25seSBuZWVkIHRvIHVwZGF0ZQotYSBzaW5nbGUgcnVsZSBpbiB5b3VyIFhNTCBDYXRhbG9nLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zCi13ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsKLWluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhbiBlbnRyeSB0byB0aGUgWE1MIENhdGFsb2csCi1mb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB0aGUgWE1MIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBhc3NvY2lhdGUgd2l0aCBhIERURAotb3IgWE1MIHNjaGVtYS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci08L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgQ2F0YWxvZzwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj4gVGhlICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwKLUNhdGFsb2cgRW50cmllczwvc3Bhbj4gc2VjdGlvbiBjb250YWlucyBhIGxpc3Qgb2YgYW55IHVzZXItZGVmaW5lZAotYW5kIHBsdWctaW4gZGVmaW5lZCBjYXRhbG9nIGVudHJpZXMuIFNlbGVjdCBhbnkgZW50cnkgdG8gc2VlIGluZm9ybWF0aW9uCi1hYm91dCBpdCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGV0YWlsczwvc3Bhbj4gc2VjdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGNhdGFsb2cKLWVudHJ5Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBsZWZ0LWhhbmQgY29sdW1uLCBjbGljayB0aGUgdHlwZSBvZiBjYXRhbG9nIGVudHJ5Ci10aGF0IHlvdSB3YW50IHRvIGFkZDo8L3NwYW4+Ci0KLTx0YWJsZSBjbGFzcz0iY2hvaWNldGFibGVib3JkZXIiIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBydWxlcz0icm93cyIgZnJhbWU9ImhzaWRlcyIgYm9yZGVyPSIxIj4KLTx0aGVhZD48dHI+PHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iTjEwMEVFLW9wdGlvbiIgYWxpZ249ImxlZnQiPk9wdGlvbjwvdGg+Ci08dGggdmFsaWduPSJib3R0b20iIGlkPSJOMTAwRUUtZGVzYyIgYWxpZ249ImxlZnQiPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+Ci08dGJvZHk+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRUUtb3B0aW9uIiBpZD0iTjEwMEY4Ij48c3Ryb25nPkNhdGFsb2cgRW50cnk8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRUUtZGVzYyBOMTAwRjgiPlVzZWQgYnkgYW4gWE1MIHByb2Nlc3Nvcgotd2hlbiByZXNvbHZpbmcgZW50aXR5IHJlZmVyZW5jZXMuIFlvdSBjYW4gcHJvdmlkZSBydWxlcyB0byB0aGUgY2F0YWxvZwotdG8gc3BlY2lmeSBob3cgZW50aXRpZXMgc2hvdWxkIGJlIHJlc29sdmVkLjxkaXYgY2xhc3M9InAiPkFuIFhNTCBDYXRhbG9nIGVudHJ5Ci1jb250YWlucyB0d28gcGFydHM6PHVsPgotPGxpPkEga2V5ICh3aGljaCByZXByZXNlbnRzIGEgRFREIG9yIFhNTCBzY2hlbWEpPC9saT4KLQotPGxpPkEgbG9jYXRpb24gKHNpbWlsYXIgdG8gYSBVUkksIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0Ci1hIERURCBvciBYTUwgc2NoZW1hJ3MgbG9jYXRpb24pLjwvbGk+Ci0KLTwvdWw+Ci0gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluIGFuIFhNTCBmaWxlLiBXaGVuIHRoZSBYTUwgcHJvY2Vzc29yCi1lbmNvdW50ZXJzIGl0LCBpdCB3aWxsIHVzZSB0aGUgWE1MIENhdGFsb2cgZW50cnkgdG8gZmluZCB0aGUgbG9jYXRpb24KLW9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleTwvZGl2PgotPC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBFRS1vcHRpb24iIGlkPSJOMTAxMUUiPjxzdHJvbmc+UmV3cml0ZSBFbnRyeTwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBFRS1kZXNjIE4xMDExRSI+VXNlZCB0byByZWRpcmVjdAotYSBzZXQgb2YgZW50aXRpZXMuPC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBFRS1vcHRpb24iIGlkPSJOMTAxMkQiPjxzdHJvbmc+U3VmZml4IEVudHJ5PC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEVFLWRlc2MgTjEwMTJEIj5Vc2VkIHRvIG1hdGNoIHRoZQotc3VmZml4IG9mIGEgVVJJIG9yIHN5c3RlbUlELjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRUUtb3B0aW9uIiBpZD0iTjEwMTNDIj48c3Ryb25nPk5leHQgQ2F0YWxvZzwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBFRS1kZXNjIE4xMDEzQyI+VXNlZCB0byByZWZlciB0byBhbm90aGVyCi1jYXRhbG9nIHdpdGhvdXQgaW1wb3J0aW5nIGl0IGludG8gdGhlIHdvcmtiZW5jaC48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEVFLW9wdGlvbiIgaWQ9Ik4xMDE0QiI+PHN0cm9uZz5EZWxlZ2F0ZSBDYXRhbG9nPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEVFLWRlc2MgTjEwMTRCIj5Vc2VkIHRvIGFzc29jaWF0ZQotYW4gYWx0ZXJuYXRlIGNhdGFsb2cgd2l0aCBhbiBpZGVudGlmaWVyLjwvdGQ+Ci08L3RyPgotCi08L3Rib2R5PjwvdGFibGU+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q29tcGxldGUgdGhlIGZpZWxkcyBmb3IgdGhlIGNhdGFsb2cgZW50cnkgdGhhdCB5b3Ugc2VsZWN0ZWQ6PC9zcGFuPgotIAotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPjxjYXB0aW9uPlRhYmxlIDEuICBDYXRhbG9nIGVudHJ5IHR5cGVzIGFuZCBhc3NvY2lhdGVkCi1maWVsZHM8L2NhcHRpb24+Ci08dGhlYWQgYWxpZ249ImxlZnQiPgotPHRyIHZhbGlnbj0iYm90dG9tIj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9Ik4xMDE4QiI+Q2F0YWxvZyB0eXBlPC90aD4KLQotPHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iTjEwMTkyIj5GaWVsZHM8L3RoPgotCi08L3RyPgotCi08L3RoZWFkPgotCi08dGJvZHk+Ci08dHI+Ci08dGQgY2hhcj0iLiIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE4QiAiPkNhdGFsb2cgRW50cnk8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5MiAiPjx1bD4KLTxsaT5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TG9jYXRpb248L3NwYW4+IGZpZWxkLCBlbnRlciBvciBicm93c2UKLWZvciB0aGUgbG9jYXRpb24gb3IgVVJJIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLiBUaGlzIHVzZXMgeW91cgotY29tcHV0ZXIncyBwYXRoIHN0eWxlIHRvIGRlc2NyaWJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZS4gPC9saT4KLQotPGxpPlNlbGVjdCBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleSBUeXBlPC9zcGFuPjo8dWw+Ci08bGk+SWYgeW91IHNwZWNpZmllZCBhIERURDogc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlB1YmxpYyBJRDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN5c3RlbQotSUQ8L3NwYW4+LCBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5VUkk8L3NwYW4+IGZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleQotVHlwZTwvc3Bhbj4gZmllbGQuIElmIHlvdSBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHVibGljIElELDwvc3Bhbj4gdGhlCi12YWx1ZSB5b3UgZW50ZXIgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleTwvc3Bhbj4gZmllbGQgc2hvdWxkIGJlCi10aGUgc2FtZSBhcyB0aGUgUHVibGljIElEIGluIHRoZSBYTUwgZmlsZSdzIERPQ1RZUEUgZGVjbGFyYXRpb24uIElmCi15b3Ugc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN5c3RlbSBJRDwvc3Bhbj4sIHRoZSB2YWx1ZSB5b3UgZW50ZXIgc2hvdWxkCi1jb3JyZXNwb25kIHRvIHRoZSBTeXN0ZW0gSUQgaW4gYW4gWE1MIGZpbGUncyBET0NUWVBFIGRlY2xhcmF0aW9uLgotSWYgeW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5VUkk8L3NwYW4+LCB0aGUgdmFsdWUgeW91IGVudGVyIG11c3QKLWJlIGEgZnVsbHkgcXVhbGlmaWVkIFVSSS48L2xpPgotCi08bGk+SWYgeW91IHNwZWNpZmllZCBhbiBYTUwgc2NoZW1hOiBzZWxlY3QgZWl0aGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWVzcGFjZQotTmFtZTwvc3Bhbj4gb3IgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjaGVtYSBMb2NhdGlvbjwvc3Bhbj4gZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5Ci1UeXBlPC9zcGFuPiBmaWVsZC4gSWYgdGhlIHNjaGVtYSBkZWZpbmVzIGEgdGFyZ2V0IG5hbWVzcGFjZSwKLWl0IHdpbGwgYXV0b21hdGljYWxseSBhcHBlYXIgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleTwvc3Bhbj4gZmllbGQuCi1PdGhlcndpc2UsIHlvdSBjYW4gZW50ZXIgdGhlIHNjaGVtYSBsb2NhdGlvbiBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5PC9zcGFuPiBmaWVsZC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BlY2lmeSBhbHRlcm5hdGl2ZSBXZWIgYWRkcmVzczwvc3Bhbj4gY2hlY2sKLWJveCBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRlIFdlYiBhZGRyZXNzIGZvcgotdGhlIHJlc291cmNlLiA8ZGl2IGNsYXNzPSJwIj5UaGlzIFdlYiBhZGRyZXNzIGlzIHVzZWQgd2hlbiBhbiBYTUwgaW5zdGFuY2UgaXMKLWdlbmVyYXRlZCBmcm9tIHRoaXMgY2F0YWxvZyBlbnRyeS48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhpcyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUKLWlmIHlvdSBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHVibGljIElEPC9zcGFuPiAoZm9yIGEgRFREKSBvciAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZXNwYWNlCi1OYW1lPC9zcGFuPiAoZm9yIGEgc2NoZW1hKSBpbiB0aGUgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleSB0eXBlPC9zcGFuPiBmaWVsZC48L2Rpdj4KLTwvZGl2PgotPC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCBjaGFyPSIuIiB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMThCICI+UmV3cml0ZSBFbnRyeTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkyICI+PHVsPgotPGxpPlNlbGVjdCBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleSB0eXBlIHRvIG1hdGNoPC9zcGFuPiwgZWl0aGVyIFVSSQotb3Igc3lzdGVtSUQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1hdGNoaW5nIHN0YXJ0IHN0cmluZzwvc3Bhbj46IFRoZSBtYXRjaGluZyBwcmVmaXgKLXRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgc3VwcGxpZWQgaWRlbnRpZmllci48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmV3cml0ZSBwcmVmaXg8L3NwYW4+OiBUaGUgcHJlZml4IGlzIGJlIHVzZWQgaW5zdGVhZAotb2YgdGhlIHByZWZpeCB0aGF0IGlzIHJlbW92ZWQuPC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCBjaGFyPSIuIiB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMThCICI+U3VmZml4IEVudHJ5PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTIgIj48dWw+Ci08bGk+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkxvY2F0aW9uPC9zcGFuPiBmaWVsZCwgZW50ZXIgb3IgYnJvd3NlCi1mb3IgdGhlIGxvY2F0aW9uIG9yIFVSSSBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgZmlsZS4gVGhpcyB1c2VzIHlvdXIKLWNvbXB1dGVyJ3MgcGF0aCBzdHlsZSB0byBkZXNjcmliZSB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUuIDwvbGk+Ci0KLTxsaT5TZWxlY3QgYSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LZXkgVHlwZTwvc3Bhbj4gKFVSSSBvciBzeXN0ZW1JRCkgdG8KLW1hdGNoLiA8L2xpPgotCi08bGk+VHlwZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3VmZml4PC9zcGFuPiBvZiB0aGUgaWRlbnRpZmllciB0byBtYXRjaC48L2xpPgotCi08L3VsPgotPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIGNoYXI9Ii4iIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOEIgIj5OZXh0IENhdGFsb2c8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5MiAiPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Mb2NhdGlvbiBvZiBhbm90aGVyIFhNTCBDYXRhbG9nCi1maWxlPC9zcGFuPiBmaWVsZCwgdHlwZSBvciBicm93c2UgZm9yIHRoZSBYTUwgY2F0YWxvZyB5b3Ugd2FudAotdG8gcmVmZXIgdG8uIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCBjaGFyPSIuIiB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMThCICI+RGVsZWdhdGUgQ2F0YWxvZzwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkyICI+PHVsPgotPGxpPlNlbGVjdCBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleSB0eXBlIHRvIG1hdGNoPC9zcGFuPiwgZWl0aGVyIFVSSQotb3Igc3lzdGVtSUQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1hdGNoaW5nIHN0YXJ0IHN0cmluZzwvc3Bhbj46IFRoZSBwcmVmaXggb2YgdGhlCi1zdXBwbGllZCBpZGVudGlmaWVyIHRvIG1hdGNoLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5EZWxlZ2F0ZSB0byB0aGlzIFhNTCBmaWxlPC9zcGFuPjogVGhlIGFsdGVybmF0ZQotY2F0YWxvZyB0byBhc3NvY2lhdGUuPC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+V2hlbiB5b3UgYXJlIGRvbmUgY3JlYXRpbmcgY2F0YWxvZyBlbnRyaWVzLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8KLWNsb3NlIHRoZSBBZGQgWE1MIENhdGFsb2cgRW50cnkgZGlhbG9nLiBDbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gYWdhaW4KLXRvIHNhdmUgeW91ciBzZXR0aW5ncy48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5NYWtlIHN1cmUgdGhlIFhNTCBmaWxlIGlzIGluIGZvY3VzIGFuZCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVsb2FkCi1kZXBlbmRlbmNpZXM8L3NwYW4+IHRvb2xiYXIgYnV0dG9uLiA8L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlIFhNTCBmaWxlIGlzIG5vdyBhc3NvY2lhdGVkIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mCi10aGUgWE1MIHNjaGVtYSBvciBEVEQuPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gYWxzbyBleHBvcnQgYW5kIGltcG9ydCBYTUwgQ2F0YWxvZyBpbmZvcm1hdGlvbjogPC9wPgotPHA+VG8KLWV4cG9ydCwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4cG9ydDwvc3Bhbj4KLTwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBDYXRhbG9nPC9zcGFuPjwvc3Bhbj4uIFlvdSB3aWxsIGJlIHByb21wdGVkCi10byBzZWxlY3QgYSBwcm9qZWN0IGFuZCBwcm92aWRlIGEgZmlsZSBuYW1lIHRvIHN0b3JlIHlvdXIgY2F0YWxvZwotZW50cmllcyBpbiBhbiAueG1sY2F0YWxvZyBmaWxlLCB3aGljaCBjYW4gYmUgb3BlbmVkIGZyb20gdGhlIE5hdmlnYXRvcgotdmlldy4gU2luY2UgeW91ciBjYXRhbG9nIGVudHJpZXMgYXJlIHN0b3JlZCBpbiBhbiAueG1sY2F0YWxvZyBmaWxlLAoteW91IGNhbiBjaGVjayB0aGVtIGluIGFuZCBvdXQgYW5kIHNoYXJlIHRoZW0gbGlrZSBhbnkgb3RoZXIgcHJvamVjdAotcmVzb3VyY2UuPC9wPgotPHA+VG8gaW1wb3J0LCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGU8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbXBvcnQ8L3NwYW4+PC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+Ci08c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIENhdGFsb2c8L3NwYW4+Ci08L3NwYW4+LiBUaGVuIHNwZWNpZnkgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gbG9hZCB0aGUKLVhNTCBDYXRhbG9nIHNldHRpbmdzLiBXaGVuIHlvdSBpbXBvcnQgYSAueG1sY2F0YWxvZyBmaWxlLCBhbnkgZW50cmllcwotaW4gaXQgd2lsbCBiZSBsb2FkZWQgaW50byB0aGUgWE1MIENhdGFsb2cgKGFuZCBhbnkgZXhpc3RpbmcgZW50cmllcwotd2lsbCBiZSBvdmVyd3JpdHRlbikuIDwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIHRpdGxlPSJJbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YgY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdSBlZGl0LCBidXQgc3RpbGwgbWFpbnRhaW4gdGhlIHZhbGlkaXR5IG9mIHRoZSBkb2N1bWVudCBwZXJpb2RpY2FsbHkuIj5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIHRpdGxlPSJUaGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiBhbiBYTUwgZmlsZSBpcyB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbiB0byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiI+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIHRpdGxlPSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiB0aXRsZT0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZDlmZmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR4cHJlZnMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwNCi1lZGl0b3Igc3VjaCBhcyB0aGUgZm9ybWF0dGVyIGluZGVudGF0aW9uIHN0eWxlLCBsaW5lIHdyYXBwaW5nIHJ1bGVzLCBhbmQgY29udGVudA0KLWFzc2lzdCBydWxlcy4gVG8gYXBwbHkgdGhlIGZvcm1hdHRpbmcgc3R5bGVzLCByaWdodC1jbGljayBpbiB0aGUgU291cmNlIHZpZXcNCi1mb3IgeW91ciBYTUwgZG9jdW1lbnQsIGFuZCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5Gb3JtYXQ8L3VpY29udHJvbD4NCi08dWljb250cm9sPkRvY3VtZW50PC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+cHJlZmVyZW5jZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnByZWZlcmVuY2VzPGluZGV4dGVybT5YTUwgZWRpdG9yPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBkZWZpbmUgWE1MIHByZWZlcmVuY2VzLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MDQotRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPkVkaXRvcjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkVudGVyIGEgbWF4aW11bSB3aWR0aCBmb3IgZm9ybWF0dGVkIGxpbmVzIGluIHRoZSA8dWljb250cm9sPkxpbmUNCi13aWR0aDwvdWljb250cm9sPiBmaWVsZDwvY21kPjxpbmZvPlRoZSBkZWZhdWx0IHZhbHVlIGlzIDcyLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5TcGxpdCBtdWx0aXBsZSBhdHRyaWJ1dGVzIGVhY2ggb24gYSBuZXcgbGluZTwvdWljb250cm9sPiB0bw0KLXN0YXJ0IGV2ZXJ5IGF0dHJpYnV0ZSBvbiBhIG5ldyBsaW5lLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCA8dWljb250cm9sPlByZXNlcnZlIHdoaXRlc3BhY2UgaW4gdGFncyB3aXRoIFBDREFUQSBjb250ZW50PC91aWNvbnRyb2w+IHRvDQotcHJldmVudCB0aGUgZWRpdG9yIGZyb20gZGVsZXRpbmcgd2hpdGVzcGFjZSBpbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gcGFyc2VkDQotY2hhcmFjdGVyIGRhdGEuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHdhbnQgYmxhbmsgbGluZXMgdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBkb2N1bWVudCBpcyBmb3JtYXR0ZWQsDQotc2VsZWN0IHRoZSA8dWljb250cm9sPkNsZWFyIGFsbCBibGFuayBsaW5lczwvdWljb250cm9sPiBjaGVjayBib3guIDwvY21kPg0KLTxpbmZvPkJ5IGRlZmF1bHQsIGJsYW5rIGxpbmVzIGFyZSBwcmVzZXJ2ZWQgaW4gYSBmb3JtYXR0ZWQgZG9jdW1lbnQuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCA8dWljb250cm9sPkluZGVudCB1c2luZyB0YWJzPC91aWNvbnRyb2w+IGlmIHlvdSB3YW50IHRvDQotdXNlIHRhYiBjaGFyYWN0ZXJzIChcdCkgYXMgdGhlIHN0YW5kYXJkIGZvcm1hdHRpbmcgaW5kZW50YXRpb24sIG9yLCBpZiB5b3UNCi1wcmVmZXIgdG8gdXNlIHNwYWNlcywgc2VsZWN0IDx1aWNvbnRyb2w+SW5kZW50IHVzaW5nIHNwYWNlczwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgPHVpY29udHJvbD5JbmRlbnRhdGlvbiBzaXplPC91aWNvbnRyb2w+IHdoaWNoDQotaXMgdGhlIG51bWJlciBvZiB0YWJzIG9yIHNwYWNlIGNoYXJhY3RlcnMgdXNlZCBmb3IgZm9ybWF0dGluZyBpbmRlbnRhdGlvbi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3UgY2FuIHNwZWNpZnkgY2VydGFpbiBjaGFyYWN0ZXJzICh0aGUgZGVmYXVsdCBjb21tYW5kPD9QdWIgQ2FyZXQ/Pg0KLWlzICZsdDs9KSB0aGF0IHdpbGwgY2F1c2UgdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgdG8gcG9wIHVwIGF1dG9tYXRpY2FsbHkuDQotRW5zdXJlIHRoZSA8dWljb250cm9sPkF1dG9tYXRpY2FsbHkgbWFrZSBzdWdnZXN0aW9uczwvdWljb250cm9sPiBjaGVjayBib3gNCi1pcyBzZWxlY3RlZCBhbmQgc3BlY2lmeSB0aGUgY2hhcmFjdGVycyBpbiB0aGUgPHVpY29udHJvbD5Qcm9tcHQgd2hlbiB0aGVzZQ0KLWNoYXJhY3RlcnMgYXJlIGluc2VydGVkPC91aWNvbnRyb2w+IGZpZWxkLiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugc2VsZWN0IDxiPlN0cmljdDwvYj4gZnJvbSB0aGUgPGI+U3VnZ2VzdGlvbiBzdHJhdGVneTwvYj4gbGlzdCwNCi1zdWdnZXN0aW9ucyB0aGF0IGFyZSBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgc2hvd24gZmlyc3QgKHdpdGggYm9sZCBpY29ucykNCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdC4gT3RoZXIgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgZWxlbWVudA0KLXNjb3BlLCBidXQgbm90IGdyYW1tYXRpY2FsbHkgdmFsaWQsIHdpbGwgYmUgc2hvd24gYmVsb3cgdGhlbSB3aXRoIGEgZGUtZW1waGFzaXplZA0KLWljb24uIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIDxiPlN0cmljdDwvYj4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIDx1aWNvbnRyb2w+VXNlIGluZmVycmVkIGdyYW1tYXIgaW4gYWJzZW5jZSBvZiBEVEQvU2NoZW1hPC91aWNvbnRyb2w+IGNoZWNrDQotYm94IGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuIDwvY21kPjxpbmZvPklmIHRoaXMgYm94IGlzIHNlbGVjdGVkLCB3aGVuIHlvdQ0KLWhhdmUgYW4gWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIHlvdSB3aWxsDQotc3RpbGwgYmUgYWJsZSB0byBnZXQgY29udGVudCBhc3Npc3QgLSB0aGUgdG9vbCB3aWxsIGluZmVyIHdoYXQgc2hvdWxkIGNvbWUNCi1uZXh0IGluIHlvdXIgZmlsZSBiYXNlZCBvbiB0aGUgZXhpc3RpbmcgY29udGVudC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5BcHBseTwvdWljb250cm9sPiBhbmQgdGhlbiA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvDQotc2F2ZSB5b3VyIGNoYW5nZXMuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDM2NTk/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NDQ1ZjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciBzdWNoIGFzIHRoZSBmb3JtYXR0ZXIgaW5kZW50YXRpb24gc3R5bGUsIGxpbmUgd3JhcHBpbmcgcnVsZXMsIGFuZCBjb250ZW50IGFzc2lzdCBydWxlcy4gVG8gYXBwbHkgdGhlIGZvcm1hdHRpbmcgc3R5bGVzLCByaWdodC1jbGljayBpbiB0aGUgU291cmNlIHZpZXcgZm9yIHlvdXIgWE1MIGRvY3VtZW50LCBhbmQgY2xpY2sgRm9ybWF0ICZndDsgRG9jdW1lbnQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciBzdWNoIGFzIHRoZSBmb3JtYXR0ZXIgaW5kZW50YXRpb24gc3R5bGUsIGxpbmUgd3JhcHBpbmcgcnVsZXMsIGFuZCBjb250ZW50IGFzc2lzdCBydWxlcy4gVG8gYXBwbHkgdGhlIGZvcm1hdHRpbmcgc3R5bGVzLCByaWdodC1jbGljayBpbiB0aGUgU291cmNlIHZpZXcgZm9yIHlvdXIgWE1MIGRvY3VtZW50LCBhbmQgY2xpY2sgRm9ybWF0ICZndDsgRG9jdW1lbnQuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgcHJlZmVyZW5jZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBwcmVmZXJlbmNlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHhwcmVmcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4cHJlZnMiPjxhIG5hbWU9InR4cHJlZnMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MCi1lZGl0b3Igc3VjaCBhcyB0aGUgZm9ybWF0dGVyIGluZGVudGF0aW9uIHN0eWxlLCBsaW5lIHdyYXBwaW5nIHJ1bGVzLCBhbmQgY29udGVudAotYXNzaXN0IHJ1bGVzLiBUbyBhcHBseSB0aGUgZm9ybWF0dGluZyBzdHlsZXMsIHJpZ2h0LWNsaWNrIGluIHRoZSBTb3VyY2UgdmlldwotZm9yIHlvdXIgWE1MIGRvY3VtZW50LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Gb3JtYXQ8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudDwvc3Bhbj48L3NwYW4+LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gZGVmaW5lIFhNTCBwcmVmZXJlbmNlcywgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci08L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MCi1GaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3I8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FbnRlciBhIG1heGltdW0gd2lkdGggZm9yIGZvcm1hdHRlZCBsaW5lcyBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TGluZQotd2lkdGg8L3NwYW4+IGZpZWxkPC9zcGFuPiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA3Mi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TcGxpdCBtdWx0aXBsZSBhdHRyaWJ1dGVzIGVhY2ggb24gYSBuZXcgbGluZTwvc3Bhbj4gdG8KLXN0YXJ0IGV2ZXJ5IGF0dHJpYnV0ZSBvbiBhIG5ldyBsaW5lLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVzZXJ2ZSB3aGl0ZXNwYWNlIGluIHRhZ3Mgd2l0aCBQQ0RBVEEgY29udGVudDwvc3Bhbj4gdG8KLXByZXZlbnQgdGhlIGVkaXRvciBmcm9tIGRlbGV0aW5nIHdoaXRlc3BhY2UgaW4gZWxlbWVudHMgdGhhdCBjb250YWluIHBhcnNlZAotY2hhcmFjdGVyIGRhdGEuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgYmxhbmsgbGluZXMgdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBkb2N1bWVudCBpcyBmb3JtYXR0ZWQsCi1zZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNsZWFyIGFsbCBibGFuayBsaW5lczwvc3Bhbj4gY2hlY2sgYm94LiA8L3NwYW4+Ci0gQnkgZGVmYXVsdCwgYmxhbmsgbGluZXMgYXJlIHByZXNlcnZlZCBpbiBhIGZvcm1hdHRlZCBkb2N1bWVudC4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluZGVudCB1c2luZyB0YWJzPC9zcGFuPiBpZiB5b3Ugd2FudCB0bwotdXNlIHRhYiBjaGFyYWN0ZXJzIChcdCkgYXMgdGhlIHN0YW5kYXJkIGZvcm1hdHRpbmcgaW5kZW50YXRpb24sIG9yLCBpZiB5b3UKLXByZWZlciB0byB1c2Ugc3BhY2VzLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5kZW50IHVzaW5nIHNwYWNlczwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5kZW50YXRpb24gc2l6ZTwvc3Bhbj4gd2hpY2gKLWlzIHRoZSBudW1iZXIgb2YgdGFicyBvciBzcGFjZSBjaGFyYWN0ZXJzIHVzZWQgZm9yIGZvcm1hdHRpbmcgaW5kZW50YXRpb24uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgY2FuIHNwZWNpZnkgY2VydGFpbiBjaGFyYWN0ZXJzICh0aGUgZGVmYXVsdCBjb21tYW5kCi1pcyAmbHQ7PSkgdGhhdCB3aWxsIGNhdXNlIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0IHRvIHBvcCB1cCBhdXRvbWF0aWNhbGx5LgotRW5zdXJlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BdXRvbWF0aWNhbGx5IG1ha2Ugc3VnZ2VzdGlvbnM8L3NwYW4+IGNoZWNrIGJveAotaXMgc2VsZWN0ZWQgYW5kIHNwZWNpZnkgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb21wdCB3aGVuIHRoZXNlCi1jaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZDwvc3Bhbj4gZmllbGQuIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSBzZWxlY3QgPHN0cm9uZz5TdHJpY3Q8L3N0cm9uZz4gZnJvbSB0aGUgPHN0cm9uZz5TdWdnZXN0aW9uIHN0cmF0ZWd5PC9zdHJvbmc+IGxpc3QsCi1zdWdnZXN0aW9ucyB0aGF0IGFyZSBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgc2hvd24gZmlyc3QgKHdpdGggYm9sZCBpY29ucykKLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LiBPdGhlciBzdWdnZXN0aW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBlbGVtZW50Ci1zY29wZSwgYnV0IG5vdCBncmFtbWF0aWNhbGx5IHZhbGlkLCB3aWxsIGJlIHNob3duIGJlbG93IHRoZW0gd2l0aCBhIGRlLWVtcGhhc2l6ZWQKLWljb24uIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIDxzdHJvbmc+U3RyaWN0PC9zdHJvbmc+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2UgaW5mZXJyZWQgZ3JhbW1hciBpbiBhYnNlbmNlIG9mIERURC9TY2hlbWE8L3NwYW4+IGNoZWNrCi1ib3ggaXMgc2VsZWN0ZWQgYnkgZGVmYXVsdC4gPC9zcGFuPiBJZiB0aGlzIGJveCBpcyBzZWxlY3RlZCwgd2hlbiB5b3UKLWhhdmUgYW4gWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIHlvdSB3aWxsCi1zdGlsbCBiZSBhYmxlIHRvIGdldCBjb250ZW50IGFzc2lzdCAtIHRoZSB0b29sIHdpbGwgaW5mZXIgd2hhdCBzaG91bGQgY29tZQotbmV4dCBpbiB5b3VyIGZpbGUgYmFzZWQgb24gdGhlIGV4aXN0aW5nIGNvbnRlbnQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj4gYW5kIHRoZW4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvCi1zYXZlIHlvdXIgY2hhbmdlcy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhzaXR5cC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHNpdHlwLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZWQ5NzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHNpdHlwLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR4c2l0eXAiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlVzaW5nIHhzaTp0eXBlPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5Vc2luZyB4c2k6dHlwZTwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JZiB5b3UgaGF2ZSBlbGVtZW50cyBpbiB5b3VyIFhNTCBmaWxlIHdob3NlIHR5cGUgaXMgYSBjb21wbGV4IHR5cGUsDQoteHNpOnR5cGUgc3VwcG9ydCBpbiB0aGUgWE1MIGVkaXRvciBsZXRzIHlvdSBjaG9vc2UgYmV0d2VlbiB0aGUgY29tcGxleCB0eXBlDQotYW5kIGFueSBvdGhlciBjb21wbGV4IHR5cGVzIGRlcml2ZWQgZnJvbSBpdC48L3Nob3J0ZGVzYz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbiBhbGxvd3MgeW91IHRvIGRlcml2ZSB0eXBlcyBieSBleHRlbnNpb24uDQotU2VlIHRoZSBmb2xsb3dpbmcgc3RlcHMgYXMgYW4gZXhhbXBsZTw/UHViIENhcmV0Pz46PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYW4gWE1MIHNjaGVtYSBhbmQgY3JlYXRlIGEgY29tcGxleCB0eXBlIGZvciBpdCBjYWxsZWQgIDx1c2VyaW5wdXQ+QWRkcmVzczwvdXNlcmlucHV0Pi4gPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+QWRkIHNvbWUgYmFzaWMgZWxlbWVudHMgdG8gPHVzZXJpbnB1dD5BZGRyZXNzPC91c2VyaW5wdXQ+LCBzdWNoDQotYXMgPHVzZXJpbnB1dD5zdHJlZXROYW1lPC91c2VyaW5wdXQ+IGFuZCA8dXNlcmlucHV0PmNpdHk8L3VzZXJpbnB1dD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+RGVyaXZlIChieSBleHRlbnNpb24pIHR3byBuZXcgY29tcGxleCB0eXBlcyBmcm9tIDx1c2VyaW5wdXQ+QWRkcmVzczwvdXNlcmlucHV0PjogPHVzZXJpbnB1dD5VU0FkZHJlc3M8L3VzZXJpbnB1dD4gYW5kIDx1c2VyaW5wdXQ+VUtBZGRyZXNzPC91c2VyaW5wdXQNCi0+LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5BZGQgYSBuZXcgZWxlbWVudCB0byA8dXNlcmlucHV0PlVTQWRkcmVzczwvdXNlcmlucHV0PiBjYWxsZWQgIDx1c2VyaW5wdXQ+c3RhdGU8L3VzZXJpbnB1dD4sDQotYW5kIGFsc28gYSBuZXcgZWxlbWVudCB0byA8dXNlcmlucHV0PlVLQWRkcmVzczwvdXNlcmlucHV0PiBjYWxsZWQgPHVzZXJpbnB1dD5wb3N0Y29kZTwvdXNlcmlucHV0Pi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DcmVhdGUgdHdvIG1vcmUgZWxlbWVudHM6IDx1c2VyaW5wdXQ+YmlsbFRvPC91c2VyaW5wdXQ+IGFuZCA8dXNlcmlucHV0PnNoaXBUbzwvdXNlcmlucHV0PiwNCi1hcyAgPHN5c3RlbW91dHB1dD5BZGRyZXNzPC9zeXN0ZW1vdXRwdXQ+IHR5cGVzLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPldoZW4geW91IGNyZWF0ZSBhbiBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgZm9yIGFuIGVsZW1lbnQgc3VjaCBhcw0KLSA8c3lzdGVtb3V0cHV0PmJpbGxUbzwvc3lzdGVtb3V0cHV0PiBvciAgPHVzZXJpbnB1dD5BZGRyZXNzPC91c2VyaW5wdXQ+LCBhbg0KLXhzaTp0eXBlIGF0dHJpYnV0ZSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gaXQuPC9jbWQ+PGluZm8+Rm9yIGV4YW1wbGUsIDxjb2RlYmxvY2s+Jmx0O2JpbGxUbyB4c2k6dHlwZT0iaXBvOkFkZHJlc3MiPjwvY29kZWJsb2NrPlRoZQ0KLXhzaTp0eXBlIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGRlcml2ZWQgY29tcGxleCB0eXBlcyAoYXMgd2VsbCBhcyBjb21wbGV4DQotdHlwZXMgdGhhdCBoYXZlIGJlZW4gZGVyaXZlZCBmcm9tKS48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCBhIGxpc3Qgd2lsbCBiZSBhdmFpbGFibGUsDQotbGV0dGluZyB5b3Ugc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB0eXBlIGRlZmluaXRpb24gKDx1aWNvbnRyb2w+QWRkcmVzczwvdWljb250cm9sPiwgPHVpY29udHJvbD5VU0FkZHJlc3M8L3VpY29udHJvbD4sDQotb3IgIDx1aWNvbnRyb2w+VUtBZGRyZXNzPC91aWNvbnRyb2w+KS4gVGhlIGd1aWRlZCBlZGl0aW5nIGZvciB0aGUgY29udGVudA0KLW1vZGVsIHdpbGwgcmVmbGVjdCB0aGUgdHlwZSBkZWZpbml0aW9uIHRoYXQgeW91IGNob29zZS4gRm9yIGV4YW1wbGUsIGlmIHlvdQ0KLXNlbGVjdCAgPHVpY29udHJvbD5VU0FkZHJlc3M8L3VpY29udHJvbD4gLCB5b3VyIDxjb2RlcGg+YmlsbFRvPC9jb2RlcGg+IGVsZW1lbnQNCi1jYW4gY29udGFpbiBhIDxjb2RlcGg+c3RhdGU8L2NvZGVwaD4gZWxlbWVudCwgYnV0IGl0IGNhbm5vdCBjb250YWluIGEgPGNvZGVwaD5wb3N0Y29kZTwvY29kZXBoPiBlbGVtZW50LjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxwPlRoZSBYTUwgZXhhbXBsZSAiRWRpdGluZyBhbmQgdmFsaWRhdGluZyBYTUwgZmlsZXMiIGRlbW9uc3RyYXRlcyA8Yj54c2k6dHlwZTwvYj4gc3VwcG9ydC48L3A+PHA+Rm9yDQotbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB4c2k6dHlwZSwgcmVmZXIgdG8gdGhlIDxiPlVzaW5nIERlcml2ZWQgVHlwZXMgaW4gSW5zdGFuY2UNCi1Eb2N1bWVudHM8L2I+IHNlY3Rpb24gaW4gPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMC8jVXNlRGVyaXZJbkluc3REb2NzIg0KLXNjb3BlPSJleHRlcm5hbCI+WE1MIFNjaGVtYSBQYXJ0IDA6IFByaW1lci48L3hyZWY+PC9wPjxwPkZvciBtb3JlIGluZm9ybWF0aW9uDQotYWJvdXQgdmFsaWRhdGlvbiBzZW1hbnRpY3Mgd2hlbiB4c2k6dHlwZSBpcyB1c2VkLCByZWZlciB0byB0aGUgPGI+U2NoZW1hLVJlbGF0ZWQNCi1NYXJrdXAgaW4gRG9jdW1lbnRzIEJlaW5nIFZhbGlkYXRlZDwvYj4gc2VjdGlvbiBpbiAgPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jeHNpX3R5cGUiDQotc2NvcGU9ImV4dGVybmFsIj5YTUwgU2NoZW1hIFBhcnQgMTogU3RydWN0dXJlczwveHJlZj4gPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzE1ND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHNpdHlwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0N2M0Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlVzaW5nIHhzaTp0eXBlIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdSBoYXZlIGVsZW1lbnRzIGluIHlvdXIgWE1MIGZpbGUgd2hvc2UgdHlwZSBpcyBhIGNvbXBsZXggdHlwZSwgeHNpOnR5cGUgc3VwcG9ydCBpbiB0aGUgWE1MIGVkaXRvciBsZXRzIHlvdSBjaG9vc2UgYmV0d2VlbiB0aGUgY29tcGxleCB0eXBlIGFuZCBhbnkgb3RoZXIgY29tcGxleCB0eXBlcyBkZXJpdmVkIGZyb20gaXQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IklmIHlvdSBoYXZlIGVsZW1lbnRzIGluIHlvdXIgWE1MIGZpbGUgd2hvc2UgdHlwZSBpcyBhIGNvbXBsZXggdHlwZSwgeHNpOnR5cGUgc3VwcG9ydCBpbiB0aGUgWE1MIGVkaXRvciBsZXRzIHlvdSBjaG9vc2UgYmV0d2VlbiB0aGUgY29tcGxleCB0eXBlIGFuZCBhbnkgb3RoZXIgY29tcGxleCB0eXBlcyBkZXJpdmVkIGZyb20gaXQuIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4c2l0eXAiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Vc2luZyB4c2k6dHlwZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHhzaXR5cCI+PGEgbmFtZT0idHhzaXR5cCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VXNpbmcgeHNpOnR5cGU8L2gxPgotCi0KLQotPGRpdj48cD5JZiB5b3UgaGF2ZSBlbGVtZW50cyBpbiB5b3VyIFhNTCBmaWxlIHdob3NlIHR5cGUgaXMgYSBjb21wbGV4IHR5cGUsCi14c2k6dHlwZSBzdXBwb3J0IGluIHRoZSBYTUwgZWRpdG9yIGxldHMgeW91IGNob29zZSBiZXR3ZWVuIHRoZSBjb21wbGV4IHR5cGUKLWFuZCBhbnkgb3RoZXIgY29tcGxleCB0eXBlcyBkZXJpdmVkIGZyb20gaXQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9uIGFsbG93cyB5b3UgdG8gZGVyaXZlIHR5cGVzIGJ5IGV4dGVuc2lvbi4KLVNlZSB0aGUgZm9sbG93aW5nIHN0ZXBzIGFzIGFuIGV4YW1wbGU6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGFuIFhNTCBzY2hlbWEgYW5kIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBmb3IgaXQgY2FsbGVkICA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkFkZHJlc3M8L2tiZD4uIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QWRkIHNvbWUgYmFzaWMgZWxlbWVudHMgdG8gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5BZGRyZXNzPC9rYmQ+LCBzdWNoCi1hcyA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPnN0cmVldE5hbWU8L2tiZD4gYW5kIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+Y2l0eTwva2JkPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkRlcml2ZSAoYnkgZXh0ZW5zaW9uKSB0d28gbmV3IGNvbXBsZXggdHlwZXMgZnJvbSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkFkZHJlc3M8L2tiZD46IDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+VVNBZGRyZXNzPC9rYmQ+IGFuZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPlVLQWRkcmVzczwva2JkPi4gPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QWRkIGEgbmV3IGVsZW1lbnQgdG8gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5VU0FkZHJlc3M8L2tiZD4gY2FsbGVkICA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPnN0YXRlPC9rYmQ+LAotYW5kIGFsc28gYSBuZXcgZWxlbWVudCB0byA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPlVLQWRkcmVzczwva2JkPiBjYWxsZWQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5wb3N0Y29kZTwva2JkPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSB0d28gbW9yZSBlbGVtZW50czogPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5iaWxsVG88L2tiZD4gYW5kIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+c2hpcFRvPC9rYmQ+LAotYXMgIDx0dCBjbGFzcz0ic3lzb3V0Ij5BZGRyZXNzPC90dD4gdHlwZXMuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+V2hlbiB5b3UgY3JlYXRlIGFuIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBmb3IgYW4gZWxlbWVudCBzdWNoIGFzCi0gPHR0IGNsYXNzPSJzeXNvdXQiPmJpbGxUbzwvdHQ+IG9yICA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkFkZHJlc3M8L2tiZD4sIGFuCi14c2k6dHlwZSBhdHRyaWJ1dGUgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIGl0Ljwvc3Bhbj4gRm9yIGV4YW1wbGUsIDxwcmU+Jmx0O2JpbGxUbyB4c2k6dHlwZT0iaXBvOkFkZHJlc3MiJmd0OzwvcHJlPgotVGhlCi14c2k6dHlwZSBhdHRyaWJ1dGUgaXMgdXNlZCB0byBpZGVudGlmeSBkZXJpdmVkIGNvbXBsZXggdHlwZXMgKGFzIHdlbGwgYXMgY29tcGxleAotdHlwZXMgdGhhdCBoYXZlIGJlZW4gZGVyaXZlZCBmcm9tKS48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgYSBsaXN0IHdpbGwgYmUgYXZhaWxhYmxlLAotbGV0dGluZyB5b3Ugc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB0eXBlIGRlZmluaXRpb24gKDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZHJlc3M8L3NwYW4+LCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5VU0FkZHJlc3M8L3NwYW4+LAotb3IgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVLQWRkcmVzczwvc3Bhbj4pLiBUaGUgZ3VpZGVkIGVkaXRpbmcgZm9yIHRoZSBjb250ZW50Ci1tb2RlbCB3aWxsIHJlZmxlY3QgdGhlIHR5cGUgZGVmaW5pdGlvbiB0aGF0IHlvdSBjaG9vc2UuIEZvciBleGFtcGxlLCBpZiB5b3UKLXNlbGVjdCAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VVNBZGRyZXNzPC9zcGFuPiAsIHlvdXIgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YmlsbFRvPC9zYW1wPiBlbGVtZW50Ci1jYW4gY29udGFpbiBhIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnN0YXRlPC9zYW1wPiBlbGVtZW50LCBidXQgaXQgY2Fubm90IGNvbnRhaW4gYSA8c2FtcCBjbGFzcz0iY29kZXBoIj5wb3N0Y29kZTwvc2FtcD4gZWxlbWVudC48L3NwYW4+Ci08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgWE1MIGV4YW1wbGUgIkVkaXRpbmcgYW5kIHZhbGlkYXRpbmcgWE1MIGZpbGVzIiBkZW1vbnN0cmF0ZXMgPHN0cm9uZz54c2k6dHlwZTwvc3Ryb25nPiBzdXBwb3J0LjwvcD4KLTxwPkZvcgotbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB4c2k6dHlwZSwgcmVmZXIgdG8gdGhlIDxzdHJvbmc+VXNpbmcgRGVyaXZlZCBUeXBlcyBpbiBJbnN0YW5jZQotRG9jdW1lbnRzPC9zdHJvbmc+IHNlY3Rpb24gaW4gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTAvI1VzZURlcml2SW5JbnN0RG9jcyIgdGFyZ2V0PSJfYmxhbmsiPlhNTCBTY2hlbWEgUGFydCAwOiBQcmltZXIuPC9hPjwvcD4KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uCi1hYm91dCB2YWxpZGF0aW9uIHNlbWFudGljcyB3aGVuIHhzaTp0eXBlIGlzIHVzZWQsIHJlZmVyIHRvIHRoZSA8c3Ryb25nPlNjaGVtYS1SZWxhdGVkCi1NYXJrdXAgaW4gRG9jdW1lbnRzIEJlaW5nIFZhbGlkYXRlZDwvc3Ryb25nPiBzZWN0aW9uIGluICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jeHNpX3R5cGUiIHRhcmdldD0iX2JsYW5rIj5YTUwgU2NoZW1hIFBhcnQgMTogU3RydWN0dXJlczwvYT4gPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTY2MjI4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJfMS4wLjAuamFyCi10ZW1wCi1EaXRhTGluay5jYXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTcwYjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL0RvY0J1aWxkLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9Eb2NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Y2YzMmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL0RvY0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLSAKLQotCVRoaXMgc2NyaXB0IGJ1aWxkIHRoZSBIZWxwIHBsdWctaW4gYnkgdHJhbnNmb3JtaW5nIHRoZSBESVRBIHNvdXJjZSBmaWxlcyBpbnRvIEhUTUwuCi0JCi0JVG8gdXNlIHRoaXMgc2NyaXB0LCB5b3UgbXVzdCBpbnN0YWxsIERJVEEtT1Qgb24geW91ciBtYWNoaW5lIGluIHRoZSBkaXJlY3RvcnkKLQlkZWZpbmVkIGJ5IHRoZSBkaXRhLm90LmRpciBwcm9wZXJ0eS4KLQkKLQlSdW4gdGhlIGRlZmF1bHQgdGFyZ2V0IGFmdGVyIHlvdSBlZGl0IHRoZSBESVRBIHNvdXJjZSBmaWxlcyB0byByZWdlbmVyYXRlIHRoZSBIVE1MLgotCQotCVRvIGN1c3RvbWl6ZSB0aGlzIHNjcmlwdCBmb3Igb3RoZXIgSGVscCBwbHVnLWlucywgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgYXJncy5pbnB1dCBwcm9wZXJ0eQotCXRvIGJlIHRoZSBESVRBIG1hcCBmaWxlIGZvciB0aGUgcGx1Zy1pbi4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgbGlua3MgdG8gc2libGluZyBIZWxwIHBsdWctaW5zIGhhdmUgc2NvcGU9InBlZXIiLCBvdGhlcndpc2UgdGhlCi0Jb3V0cHV0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2lsbCBiZSBzaGlmdGVkIGluY29ycmVjdGx5LgotCQotCU5PVEU6IFRoaXMgc2NyaXB0IGFzc3VtZXMgdGhhdCB5b3UgaGFuZCBjb2RlIHlvdXIgcGx1Z2luLnhtbCBmaWxlIGluIG15cGx1Z2luLnhtbC4gVGhpcyBmaWxlCi0Jd2lsbCBiZSBjb3BpZWQgb3ZlciB0aGUgZ2VuZXJhdGVkIHBsdWdpbi54bWwgd2hpY2ggaXMgY3VycmVudGx5IG5vdCBiZWluZyBnZW5lcmF0ZWQgY29ycmVjdGx5Ci0JYnkgRElUQS1PVC4KLQkKLQlDaGFuZ2VMb2c6Ci0JMjAwNi0wNC0wNSBBcnRodXIgUnltYW4gPHJ5bWFuQGNhLmlibS5jb20+Ci0JLSBDcmVhdGVkLgotCTIwMDgtMDEtMDkgS2F0ZSBQcmljZSA8a2F0ZXBAY2EuaWJtLmNvbT4KLQktIG1vZGlmaWVkIGZvciBuZXcgRElUQS1PVCB2ZXJzaW9uCi0JMjAwOC0wNS0wNSBLYXRlIFByaWNlIDxrYXRlcEBjYS5pYm0uY29tPgotCS0gbW9kaWZpZWQgdG8gYWRkIGdlbmVyYXRpb24gb2YgcHJlLWJ1aWx0IGhlbHAgaW5kZXguIAotCS0gTXVzdCBkZWxldGUgL2luZGV4IGZvbGRlciBiZWZvcmUgcnVubmluZyBidWlsZAotLS0+Ci08cHJvamVjdCBuYW1lPSJlY2xpcHNlaGVscCIgZGVmYXVsdD0iYWxsIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLm90LmRpciIgbG9jYXRpb249IkM6L0RJVEEtT1QxLjIuMiIgLz4KLQotCTxwYXRoIGlkPSJkb3N0LmNsYXNzLnBhdGgiPgotCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZGl0YS5vdC5kaXJ9JHtmaWxlLnNlcGFyYXRvcn1saWIke2ZpbGUuc2VwYXJhdG9yfWRvc3QuamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXNrZGVmIG5hbWU9ImludGVncmF0ZSIgY2xhc3NuYW1lPSJvcmcuZGl0YS5kb3N0LnBsYXRmb3JtLkludGVncmF0b3JUYXNrIj4KLQkJPGNsYXNzcGF0aCByZWZpZD0iZG9zdC5jbGFzcy5wYXRoIiAvPgotCTwvdGFza2RlZj4KLQk8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iaW50ZWdyYXRlLCBlY2xpcHNlaGVscCI+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJpbnRlZ3JhdGUiPgotCQk8aW50ZWdyYXRlIGRpdGFkaXI9IiR7ZGl0YS5vdC5kaXJ9IiAvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSByZXZpc2UgYmVsb3cgaGVyZSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImVjbGlwc2VoZWxwIj4KLQkJPGFudCBhbnRmaWxlPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9Y29uZHVjdG9yLnhtbCIgdGFyZ2V0PSJpbml0IiBkaXI9IiR7ZGl0YS5vdC5kaXJ9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNvcHljc3MiIHZhbHVlPSJubyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNzc3BhdGgiIHZhbHVlPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnByb3ZpZGVyIiB2YWx1ZT0iRWNsaXBzZS5vcmciIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnZlcnNpb24iIHZhbHVlPSIzLjQuMCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmlucHV0IiBsb2NhdGlvbj0iWFNETGVkaXRvcnJlbC5kaXRhbWFwIiAvPiAgICAJCQotCQkJPHByb3BlcnR5IG5hbWU9ImNsZWFuLnRlbXAiIHZhbHVlPSJ0cnVlIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImRpdGEuZXh0bmFtZSIgdmFsdWU9Ii5kaXRhIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImRpdGEudGVtcC5kaXIiIGxvY2F0aW9uPSJ0ZW1wIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dC5kaXIiIGxvY2F0aW9uPSIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0idHJhbnN0eXBlIiB2YWx1ZT0iZWNsaXBzZWhlbHAiIC8+Ci0JCTwvYW50PgotCQk8Y29weSBmaWxlPSJteXBsdWdpbi54bWwiIHRvZmlsZT0icGx1Z2luLnhtbCIgb3ZlcndyaXRlPSJ5ZXMiIC8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJidWlsZC5pbmRleCIgZGVzY3JpcHRpb249IkJ1aWxkcyBzZWFyY2ggaW5kZXggZm9yIHRoZSBwbHVnLWluIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkgICAgIDxoZWxwLmJ1aWxkSGVscEluZGV4IG1hbmlmZXN0PSJwbHVnaW4ueG1sIiBkZXN0aW5hdGlvbj0iLiIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzUwOWFlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBsdWdpbi5uYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuODAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNETGVkaXRvcnJlbC5kaXRhbWFwIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRExlZGl0b3JyZWwuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzZWUwMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNETGVkaXRvcnJlbC5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLTw/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+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RlZGl0b3JtYXBfdG9jLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNEZWRpdG9ybWFwX3RvYy5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA3YzA1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RlZGl0b3JtYXBfdG9jLmRpdGFtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIg0KLSAibWFwLmR0ZCI+DQotPG1hcCBjb2xsZWN0aW9uLXR5cGU9InNlcXVlbmNlIiBpZD0id3N0eHNkdG9jIiB0aXRsZT0iWE1MIHNjaGVtYXMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dvcmtYU0QuZGl0YSIgbGlua2luZz0ic291cmNlb25seSIgbmF2dGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgc2NoZW1hcyAoWFNEcykiPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X2N3b3JrWFNEIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3htbHNjaC5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgWE1MIHNjaGVtYXMiPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGN4bWxzY2giLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhTRC5kaXRhIiBuYXZ0aXRsZT0iWFNEIFNsdXNoIGZpbGUiDQotdG9jPSJubyI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF9ybGltaXRhdGlvbnNfc2x1c2hYU0QiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RpbXBzY2htLmRpdGEiIG5hdnRpdGxlPSJJbXBvcnRpbmcgYW4gWE1MIHNjaGVtYSI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90aW1wc2NobSIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdG5hdnNyYy5kaXRhIiBuYXZ0aXRsZT0iTmF2aWdhdGluZyBYTUwgc2NoZW1hcyI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90bmF2c3JjIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5kaXRhIiBuYXZ0aXRsZT0iUmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdHJlZmFjdHIiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRwcmVmLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgIGVkaXRvciBwcmVmZXJlbmNlcyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90ZWRpdHByZWYiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2htLmRpdGEiIGxpbmtpbmc9Im5vbmUiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyI+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGVkaXRzY2htIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sc2NlZC5kaXRhIiBpZD0ieHNkY29uY2VwdHMiIG5hdnRpdGxlPSJYTUwgc2NoZW1hIGVkaXRvciI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF9jeG1sc2NlZCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGFncnAuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhbiBhdHRyaWJ1dGUgZ3JvdXAiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGdycCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGNteHQuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIGNvbXBsZXggdHlwZSI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkY214dCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIGNvbnRlbnQgbW9kZWwiPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRjbW9kIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkYW55ZS5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGFueSBlbGVtZW50Ij48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRhbnllIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZWxtLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW4gZWxlbWVudCI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkZWxtIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZWxtci5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGVsZW1lbnQgcmVmZXJlbmNlIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRlbG1yIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ3Jwci5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgZ3JvdXAgcmVmZXJlbmNlIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRncnByIi8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRnbGJhLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSBnbG9iYWwgYXR0cmlidXRlIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRnbGJhIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ2xlbS5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgZ2xvYmFsIGVsZW1lbnQiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGdsZW0iLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRncnVwLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSBncm91cCI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkZ3J1cCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGltcHQuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhbiBpbXBvcnQgZWxlbWVudCI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkaW1wdCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGluY2wuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhbiBpbmNsdWRlIGVsZW1lbnQiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGluY2wiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRyZGZuLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSByZWRlZmluZSBlbGVtZW50Ij4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRyZGZuIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkc21wdC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgc2ltcGxlIHR5cGUiPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRzbXB0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkcmVnLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSBwYXR0ZXJuIGZhY2V0IHRvIGEgc2ltcGxlIHR5cGUiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZHJlZyIvPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3J4c2RpY29ucy5kaXRhIiBpZD0ieHNkaWNvbnMiIG5hdnRpdGxlPSJJY29ucyB1c2VkIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF9yeHNkaWNvbnMiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RkZWxzY21wLmRpdGEiIG5hdnRpdGxlPSJEZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHMiPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RkZWxzY21wIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9ycmVmaW50Zy5kaXRhIiBuYXZ0aXRsZT0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF9ycmVmaW50ZyIvPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dmR0c2NobS5kaXRhIiBuYXZ0aXRsZT0iVmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3R2dHNjaG0iLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JubXNwYy5kaXRhIiBuYXZ0aXRsZT0iWE1MIG5hbWVzcGFjZXMiPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3Rfcm5tc3BjIi8+PC90b3BpY3JlZj4NCi08L21hcD4NCi08P1B1YiAqMDAwMDAwMzgyOD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRGVkaXRvcm1hcF90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRGVkaXRvcm1hcF90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjNlMmEyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RlZGl0b3JtYXBfdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IlhNTCBzY2hlbWFzIiB0b3BpYz0idG9waWNzL2N3b3JrWFNELmh0bWwiPgotPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy9jd29ya1hTRC5odG1sIj4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X2N3b3JrWFNEIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGN4bWxzY2guaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGN4bWxzY2giLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3JsaW1pdGF0aW9uc19zbHVzaFhTRCIvPgotPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90aW1wc2NobS5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90aW1wc2NobSIvPgotPHRvcGljIGxhYmVsPSJOYXZpZ2F0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdG5hdnNyYy5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90bmF2c3JjIi8+Ci08dG9waWMgbGFiZWw9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXMiIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90cmVmYWN0ciIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RlZHRwcmVmLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RlZGl0cHJlZiIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyIgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwiPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGVkaXRzY2htIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBzY2hlbWEgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfY3htbHNjZWQiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGF0dHJpYnV0ZSBncm91cHMiIGhyZWY9InRvcGljcy90YWRkYWdycC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkZ3JwIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBjb21wbGV4IHR5cGVzIiBocmVmPSJ0b3BpY3MvdGFkZGNteHQuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGNteHQiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIiBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuaHRtbCI+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkY21vZCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiIGhyZWY9InRvcGljcy90YWRkYW55ZS5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkYW55ZSIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkZWxtLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRlbG0iLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRlbG1yIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBncm91cCByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGFkZGdycHIuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGdycHIiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBnbG9iYWwgYXR0cmlidXRlcyIgaHJlZj0idG9waWNzL3RhZGRnbGJhLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRnbGJhIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBnbG9iYWwgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkZ2xlbS5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkZ2xlbSIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ3JvdXBzIiBocmVmPSJ0b3BpY3MvdGFkZGdydXAuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGdydXAiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGltcG9ydCBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRpbXB0Lmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRpbXB0Ii8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGluY2wuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGluY2wiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZHJkZm4uaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZHJkZm4iLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIHNpbXBsZSB0eXBlcyIgaHJlZj0idG9waWNzL3RhZGRzbXB0Lmh0bWwiPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZHNtcHQiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlcyIgaHJlZj0idG9waWNzL3RhZGRyZWcuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZHJlZyIvPgotPC90b3BpYz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIiBocmVmPSJ0b3BpY3MvcnhzZGljb25zLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3J4c2RpY29ucyIvPgotPHRvcGljIGxhYmVsPSJEZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHMiIGhyZWY9InRvcGljcy90ZGVsc2NtcC5odG1sIj4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RkZWxzY21wIi8+Ci08dG9waWMgbGFiZWw9IlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiIGhyZWY9InRvcGljcy9ycmVmaW50Zy5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF9ycmVmaW50ZyIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3R2ZHRzY2htLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3R2dHNjaG0iLz4KLTx0b3BpYyBsYWJlbD0iWE1MIG5hbWVzcGFjZXMiIGhyZWY9InRvcGljcy9ybm1zcGMuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3Rfcm5tc3BjIi8+Ci08L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTU2MjNlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gWFNEZWRpdG9ybWFwX3RvYy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0b3BpY3MvKi5odG0qLFwKLSAgICAgICAgICAgICAgIGluZGV4LyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotCQkgICAgICAgKi5tYXBsaXN0LFwKLSAgICAgICAgICAgICAgICouZGl0YW1hcCxcCi0JCSAgICAgICB0b3BpY3MvKi5kaXRhCi1iaW4uZXhjbHVkZXMgPSBEb2NCdWlsZC54bWwsXAotICAgICAgICAgICAgICAgbXlQbHVnaW4qLnhtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQnJvd3NlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQnJvd3NlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyMTFiZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0Jyb3dzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL01vcmUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9Nb3JlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyMTFiZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL01vcmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbGwuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTM3ZmJhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQW55LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQW55LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5ZjkzYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFueS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFueUF0dHJpYnV0ZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFueUF0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyODBjYzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbnlBdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQ0OWQwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXAuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOGRmNzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZUdyb3VwUmVmLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmMxZGI5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVSZWYuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzY1YWYyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQXR0cmlidXRlUmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ2hvaWNlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFmNTgzZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRENob2ljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRENvbXBsZXhUeXBlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ29tcGxleFR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzhiOTRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ29tcGxleFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RFbGVtZW50LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNERWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDVmMDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNERWxlbWVudFJlZi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREVsZW1lbnRSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDlhY2ZjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNERWxlbWVudFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDQ5ZDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHbG9iYWxBdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHbG9iYWxFbGVtZW50LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER2xvYmFsRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDVmMDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHbG9iYWxFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER3JvdXAuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MmMyZDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHcm91cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdyb3VwUmVmLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER3JvdXBSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjg5ODdiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER3JvdXBSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RJbXBvcnQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RJbXBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQ0Y2U1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNESW1wb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNESW5jbHVkZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREluY2x1ZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjZjNTI3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNESW5jbHVkZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFJlZGVmaW5lLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEUmVkZWZpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk2NGMxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEUmVkZWZpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTZXF1ZW5jZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiODYxMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlRW51bS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZUVudW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQ3OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlRW51bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZVBhdHRlcm4uZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVQYXR0ZXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExM2NmNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVUeXBlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNzQ0MzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbmRleC9fdi5jZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvX3YuY2ZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDc1Yzc5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbmRleC9fdi5jZnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvZGVsZXRhYmxlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzZjQ3MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvZGVsZXRhYmxlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfY29udHJpYnV0aW9ucyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMmExNDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfY29udHJpYnV0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI01vbiBNYXkgMTggMTc6Mzg6MjQgRURUIDIwMDkNCi1vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyPW9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJcbjEuMC43MDAucXVhbGlmaWVyDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZGVwZW5kZW5jaWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZGVwZW5kZW5jaWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmI3NmVlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI01vbiBNYXkgMTggMTc6Mzg6MjQgRURUIDIwMDkNCi1sdWNlbmU9MS45LjEudjIwMDgwNTMwLTE2MDANCi1hbmFseXplcj1vcmcuZWNsaXBzZS5oZWxwLmJhc2VcIzMuMy4xMDEuTTIwMDgwNzI4XzM0eD9sb2NhbGVcPWVuDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RvY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmN2ZlZjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNNb24gTWF5IDE4IDE3OjM4OjI0IEVEVCAyMDA5DQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbXh0Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hTRC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sc2NlZC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdycHIuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXBzY2htLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90bmF2c3JjLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xlbS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhzZGljb25zLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW1wdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsYmEuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcmVmLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ycmVmaW50Zy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaG0uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbW9kLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYW55ZS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdydXAuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG0uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZGZuLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW5jbC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHNtcHQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZWcuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkZWxzY21wLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3htbHNjaC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZkdHNjaG0uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG1yLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYWdycC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHJlZmFjdHJYU0QuaHRtbD0wDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjU2NGM1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbmRleC9zZWdtZW50cworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzdjNWNkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuNiI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgIDx0b2MgZmlsZT0iWFNEZWRpdG9ybWFwX3RvYy54bWwiLz4KLSAgICAgICA8aW5kZXggcGF0aD0iaW5kZXgvIi8+Ci0gICAgICAKLTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5pbmRleCI+Ci0gICAgICA8aW5kZXggZmlsZT0ib3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCIvPgotPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLm1hcGxpc3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci5tYXBsaXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjZmNDYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLm1hcGxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxtYXBsaXN0IHZlcnNpb249IjMuNi4yIj4NCi0gIDxuYXY+DQotICAgIDxtYXAgZmlsZT0iWFNEZWRpdG9ybWFwX3RvYy5kaXRhbWFwIi8+DQotICA8L25hdj4NCi0gIDxsaW5rPg0KLSAgICA8bWFwIGZpbGU9IlhTRGVkaXRvcm1hcF90b2MuZGl0YW1hcCIvPg0KLSAgICA8bWFwIGZpbGU9IlhTRExlZGl0b3JyZWwuZGl0YW1hcCIvPg0KLSAgPC9saW5rPg0KLTwvbWFwbGlzdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcmluZGV4Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcmluZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMDc2MDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJpbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDciIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08IS0tIEFsbCByaWdodHMgcmVzZXJ2ZWQuIExpY2Vuc2VkIE1hdGVyaWFscyBQcm9wZXJ0eSBvZiBJQk0gLS0+Ci08IS0tIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLS0+Ci08IS0tIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IC0tPgotPCEtLSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+SW5kZXg8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+SW5kZXg8L2gxPgotPGEgbmFtZT0iSURYMF80NCIgaHJlZj0iI0lEWDFfNDQiPkQ8L2E+Ci08YSBuYW1lPSJJRFgwXzUwIiBocmVmPSIjSURYMV81MCI+UDwvYT4KLTxhIG5hbWU9IklEWDBfNTIiIGhyZWY9IiNJRFgxXzUyIj5SPC9hPgotPGEgbmFtZT0iSURYMF81OCIgaHJlZj0iI0lEWDFfNTgiPlg8L2E+Ci08aHI+PC9ocj4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV80NCIgaHJlZj0iI0lEWDBfNDQiPkQ8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+ZGVwZW5kZW50IGFydGlmYWN0cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sI3JlZmFjdG9yaW5nIj5yZWZhY3RvcnRpbmcgWE1MIHNjaGVtYSBmaWxlczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNTAiIGhyZWY9IiNJRFgwXzUwIj5QPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPnByZWZlcmVuY2VzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRwcmVmLmh0bWwjdGVkdHByZWYiPlhNTCBzY2hlbWEgZmlsZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzUyIiBocmVmPSIjSURYMF81MiI+UjwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5yZWZhY3RvcmluZwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sI3JlZmFjdG9yaW5nIj5YTUwgc2NoZW1hIGZpbGVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnJlbmFtaW5nCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciPlhNTCBzY2hlbWEgZmlsZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzU4IiBocmVmPSIjSURYMF81OCI+WDwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5YTUwgbmFtZXNwYWNlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9ybm1zcGMuaHRtbCNybm1zcGMiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPlhNTCBzY2hlbWEgZWRpdG9yCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwjdGFkZGFueWUiPmFkZGluZyBhbiBhbnkgZWxlbWVudDwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRyZGZuLmh0bWwjdGFkZHJkZm4iPmFkZGluZyByZWRlZmluZSBlbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRhZ3JwLmh0bWwjdGFkZGFncnAiPmF0dHJpYnV0ZSBncm91cHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy9ycmVmaW50Zy5odG1sI3JyZWZpbnRnIj5jbGVhbiB1cCBpbjwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRjbXh0Lmh0bWwjdGFkZGNteHQiPmNvbXBsZXggdHlwZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sI3RhZGRjbW9kIj5jb250ZW50IG1vZGVsczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RkZWxzY21wLmh0bWwjdGRlbHNjbXAiPmRlbGV0aW5nIGNvbXBvbmVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZWxtci5odG1sI3RhZGRlbG1yIj5lbGVtZW50IHJlZmVyZW5jZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZWxtLmh0bWwjdGFkZGVsbSI+ZWxlbWVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ2xiYS5odG1sI3RhZGRnbGJhIj5nbG9iYWwgYXR0cmlidXRlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRnbGVtLmh0bWwjdGFkZGdsZW0iPmdsb2JhbCBlbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRncnByLmh0bWwjdGFkZGdycHIiPmdyb3VwIGZlYXR1cmVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdydXAuaHRtbCN0YWRkZ3J1cCI+Z3JvdXBzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvcnhzZGljb25zLmh0bWwjcmljb25zIj5pY29uczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRpbXB0Lmh0bWwjdGFkZGltcHQiPmltcG9ydCBlbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRpbmNsLmh0bWwjdGFkZGluY2wiPmluY2x1ZGUgZWxlbWVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy9jeG1sc2NlZC5odG1sI2N4bWxzY2VkIj5vdmVydmlldzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRyZWcuaHRtbCN0YWRkcmVnIj5wYXR0ZXJuIGZhY2V0czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3JyZWZpbnRnLmh0bWwjcnJlZmludGciPnJlZmVyZW50aWFsIGludGVncml0eTwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRzbXB0Lmh0bWwjdGFkZHNtcHQiPnNpbXBsZSB0eXBlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwjdGVkdHNjaG0iPlhNTCBzY2hlbWEgcHJvcGVydGllczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5YTUwgc2NoZW1hIGZpbGVzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwjdGFkZGFueWUiPmFkZGluZyBhbiBhbnkgZWxlbWVudDwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRyZGZuLmh0bWwjdGFkZHJkZm4iPmFkZGluZyByZWRlZmluZSBlbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRhZ3JwLmh0bWwjdGFkZGFncnAiPmF0dHJpYnV0ZSBncm91cHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkY214dC5odG1sI3RhZGRjbXh0Ij5jb21wbGV4IHR5cGVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuaHRtbCN0YWRkY21vZCI+Y29udGVudCBtb2RlbHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90Y3htbHNjaC5odG1sI3RjeG1sc2NoIj5jcmVhdGluZzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RkZWxzY21wLmh0bWwjdGRlbHNjbXAiPmRlbGV0aW5nIGNvbXBvbmVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0cHJlZi5odG1sI3RlZHRwcmVmIj5lZGl0aW5nIHByZWZlcmVuY2VzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCN0ZWR0c2NobSI+ZWRpdGluZyBwcm9wZXJ0aWVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCN0YWRkZWxtciI+ZWxlbWVudCByZWZlcmVuY2VzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGVsbS5odG1sI3RhZGRlbG0iPmVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuaHRtbCN0YWRkZ2xiYSI+Z2xvYmFsIGF0dHJpYnV0ZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ2xlbS5odG1sI3RhZGRnbGVtIj5nbG9iYWwgZWxlbWVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sI3RhZGRncnByIj5ncm91cCBmZWF0dXJlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwjdGFkZGdydXAiPmdyb3VwczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRpbXB0Lmh0bWwjdGFkZGltcHQiPmltcG9ydCBlbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RpbXBzY2htLmh0bWwjdGltcHNjaG0iPmltcG9ydGluZzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRpbmNsLmh0bWwjdGFkZGluY2wiPmluY2x1ZGUgZWxlbWVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90bmF2c3JjLmh0bWwjdG5hdnNyYyI+bmF2aWdhdGluZzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRyZWcuaHRtbCN0YWRkcmVnIj5wYXR0ZXJuIGZhY2V0czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRzbXB0Lmh0bWwjdGFkZHNtcHQiPnNpbXBsZSB0eXBlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R2ZHRzY2htLmh0bWwjdHZkdHNjaG0iPnZhbGlkYXRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+WE1MIHNjaGVtYXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyI+ZWRpdGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNkZDg4My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPGluZGV4PgotICA8ZW50cnkga2V5d29yZD0iWE1MIHNjaGVtYSBmaWxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGN4bWxzY2guaHRtbCN0Y3htbHNjaCIgdGl0bGU9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGltcHNjaG0uaHRtbCN0aW1wc2NobSIgdGl0bGU9IkltcG9ydGluZyBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im5hdmlnYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90bmF2c3JjLmh0bWwjdG5hdnNyYyIgdGl0bGU9Ik5hdmlnYXRpbmcgWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIHByZWZlcmVuY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHByZWYuaHRtbCN0ZWR0cHJlZiIgdGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyBwcm9wZXJ0aWVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCN0ZWR0c2NobSIgdGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYXR0cmlidXRlIGdyb3VwcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRhZ3JwLmh0bWwjdGFkZGFncnAiIHRpdGxlPSJBZGRpbmcgYXR0cmlidXRlIGdyb3VwcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbXBsZXggdHlwZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkY214dC5odG1sI3RhZGRjbXh0IiB0aXRsZT0iQWRkaW5nIGNvbXBsZXggdHlwZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IG1vZGVscyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwjdGFkZGNtb2QiIHRpdGxlPSJBZGRpbmcgY29udGVudCBtb2RlbHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgYW4gYW55IGVsZW1lbnQiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkYW55ZS5odG1sI3RhZGRhbnllIiB0aXRsZT0iQWRkaW5nIGFuIGFueSBlbGVtZW50Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWxlbWVudHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZWxtLmh0bWwjdGFkZGVsbSIgdGl0bGU9IkFkZGluZyBlbGVtZW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVsZW1lbnQgcmVmZXJlbmNlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwjdGFkZGVsbXIiIHRpdGxlPSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ3JvdXAgZmVhdHVyZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sI3RhZGRncnByIiB0aXRsZT0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnbG9iYWwgYXR0cmlidXRlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRnbGJhLmh0bWwjdGFkZGdsYmEiIHRpdGxlPSJBZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnbG9iYWwgZWxlbWVudHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ2xlbS5odG1sI3RhZGRnbGVtIiB0aXRsZT0iQWRkaW5nIGdsb2JhbCBlbGVtZW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imdyb3VwcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwjdGFkZGdydXAiIHRpdGxlPSJBZGRpbmcgZ3JvdXBzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0IGVsZW1lbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGltcHQuaHRtbCN0YWRkaW1wdCIgdGl0bGU9IkFkZGluZyBpbXBvcnQgZWxlbWVudHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbmNsdWRlIGVsZW1lbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGluY2wuaHRtbCN0YWRkaW5jbCIgdGl0bGU9IkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZHJkZm4uaHRtbCN0YWRkcmRmbiIgdGl0bGU9IkFkZGluZyByZWRlZmluZSBlbGVtZW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNpbXBsZSB0eXBlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRzbXB0Lmh0bWwjdGFkZHNtcHQiIHRpdGxlPSJBZGRpbmcgc2ltcGxlIHR5cGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icGF0dGVybiBmYWNldHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkcmVnLmh0bWwjdGFkZHJlZyIgdGl0bGU9IkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJkZWxldGluZyBjb21wb25lbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGRlbHNjbXAuaHRtbCN0ZGVsc2NtcCIgdGl0bGU9IkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InZhbGlkYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90dmR0c2NobS5odG1sI3R2ZHRzY2htIiB0aXRsZT0iVmFsaWRhdGluZyBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJkZXBlbmRlbnQgYXJ0aWZhY3RzIj4KLSAgICA8ZW50cnkga2V5d29yZD0icmVmYWN0b3JpbmcgWE1MIHNjaGVtYSBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciIHRpdGxlPSJSZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InJlZmFjdG9yaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iWE1MIHNjaGVtYSBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciIHRpdGxlPSJSZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InJlbmFtaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iWE1MIHNjaGVtYSBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciIHRpdGxlPSJSZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNjaGVtYXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyIgdGl0bGU9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icHJlZmVyZW5jZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwgc2NoZW1hIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHByZWYuaHRtbCN0ZWR0cHJlZiIgdGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlhNTCBzY2hlbWEgZWRpdG9yIj4KLSAgICA8ZW50cnkga2V5d29yZD0iWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCN0ZWR0c2NobSIgdGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jeG1sc2NlZC5odG1sI2N4bWxzY2VkIiB0aXRsZT0iWE1MIHNjaGVtYSBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhdHRyaWJ1dGUgZ3JvdXBzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGFncnAuaHRtbCN0YWRkYWdycCIgdGl0bGU9IkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY29tcGxleCB0eXBlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRjbXh0Lmh0bWwjdGFkZGNteHQiIHRpdGxlPSJBZGRpbmcgY29tcGxleCB0eXBlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgbW9kZWxzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuaHRtbCN0YWRkY21vZCIgdGl0bGU9IkFkZGluZyBjb250ZW50IG1vZGVscyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyBhbiBhbnkgZWxlbWVudCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwjdGFkZGFueWUiIHRpdGxlPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbGVtZW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCN0YWRkZWxtIiB0aXRsZT0iQWRkaW5nIGVsZW1lbnRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWxlbWVudCByZWZlcmVuY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCN0YWRkZWxtciIgdGl0bGU9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJncm91cCBmZWF0dXJlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRncnByLmh0bWwjdGFkZGdycHIiIHRpdGxlPSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imdsb2JhbCBhdHRyaWJ1dGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuaHRtbCN0YWRkZ2xiYSIgdGl0bGU9IkFkZGluZyBnbG9iYWwgYXR0cmlidXRlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imdsb2JhbCBlbGVtZW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRnbGVtLmh0bWwjdGFkZGdsZW0iIHRpdGxlPSJBZGRpbmcgZ2xvYmFsIGVsZW1lbnRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ3JvdXBzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdydXAuaHRtbCN0YWRkZ3J1cCIgdGl0bGU9IkFkZGluZyBncm91cHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbXBvcnQgZWxlbWVudHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkaW1wdC5odG1sI3RhZGRpbXB0IiB0aXRsZT0iQWRkaW5nIGltcG9ydCBlbGVtZW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImluY2x1ZGUgZWxlbWVudHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkaW5jbC5odG1sI3RhZGRpbmNsIiB0aXRsZT0iQWRkaW5nIGluY2x1ZGUgZWxlbWVudHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgcmVkZWZpbmUgZWxlbWVudHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkcmRmbi5odG1sI3RhZGRyZGZuIiB0aXRsZT0iQWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2ltcGxlIHR5cGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuaHRtbCN0YWRkc21wdCIgdGl0bGU9IkFkZGluZyBzaW1wbGUgdHlwZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwYXR0ZXJuIGZhY2V0cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRyZWcuaHRtbCN0YWRkcmVnIiB0aXRsZT0iQWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imljb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnhzZGljb25zLmh0bWwjcmljb25zIiB0aXRsZT0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJkZWxldGluZyBjb21wb25lbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGRlbHNjbXAuaHRtbCN0ZGVsc2NtcCIgdGl0bGU9IkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InJlZmVyZW50aWFsIGludGVncml0eSI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3JyZWZpbnRnLmh0bWwjcnJlZmludGciIHRpdGxlPSJSZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY2xlYW4gdXAgaW4iPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9ycmVmaW50Zy5odG1sI3JyZWZpbnRnIiB0aXRsZT0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgbmFtZXNwYWNlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3Mvcm5tc3BjLmh0bWwjcm5tc3BjIiB0aXRsZT0iWE1MIG5hbWVzcGFjZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotPC9pbmRleD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZGE0MTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUiAKLSMgTkxTX0VOQ09ESU5HPVVURi04IAotUGx1Z2luLm5hbWUgPSBYTUwgc2NoZW1hIGVkaXRvcgotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3YzVjZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy42Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgPHRvYyBmaWxlPSJYU0RlZGl0b3JtYXBfdG9jLnhtbCIvPgotICAgICAgIDxpbmRleCBwYXRoPSJpbmRleC8iLz4KLSAgICAgIAotPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIi8+Ci08L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hTRC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hTRC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgwNDA5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYU0QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTxjb25jZXB0IGlkPSJ3b3JraW5nd2l0aHhtbHNjaGVtYXMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldvcmtpbmcgd2l0aCBYTUwgc2NoZW1hczwvdGl0bGU+DQotPHNob3J0ZGVzYz5YTUwgc2NoZW1hcyBhcmUgYW4gWE1MIGxhbmd1YWdlIGZvciBkZXNjcmliaW5nIGFuZCBjb25zdHJhaW5pbmcNCi10aGUgY29udGVudCBvZiBYTUwgZmlsZXMuPC9zaG9ydGRlc2M+DQotPGNvbmJvZHk+DQotPHA+VGhpcyBzZWN0aW9ucyBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOjwvcD4NCi08L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmsgaHJlZj0idGN4bWxzY2guZGl0YSI+PGxpbmt0ZXh0PkNyZWF0aW5nIFhNTCBzY2hlbWFzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idGltcHNjaG0uZGl0YSI+PGxpbmt0ZXh0PkltcG9ydGluZyBYTUwgc2NoZW1hczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRuYXZzcmMuZGl0YSI+PGxpbmt0ZXh0Pk5hdmlnYXRpbmcgWE1MIHNjaGVtYXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0cmVmYWN0clhTRC5kaXRhIj48bGlua3RleHQ+UmVmYWN0b3JpbmcgaW4gWE1MIHNjaGVtYXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0ZWR0cHJlZi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJyeHNkaWNvbnMuZGl0YSI+PGxpbmt0ZXh0Pkljb25zIHVzZWQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idGRlbHNjbXAuZGl0YSI+PGxpbmt0ZXh0PkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50czwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InR2ZHRzY2htLmRpdGEiPjxsaW5rdGV4dD5WYWxpZGF0aW5nIFhNTCBzY2hlbWFzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0icm5tc3BjLmRpdGEiPjxsaW5rdGV4dD5YTUwgbmFtZXNwYWNlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDEyNjc/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYU0QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYU0QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4ZGVmMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWFNELmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JraW5nIHdpdGggWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWE1MIHNjaGVtYXMgYXJlIGFuIFhNTCBsYW5ndWFnZSBmb3IgZGVzY3JpYmluZyBhbmQgY29uc3RyYWluaW5nIHRoZSBjb250ZW50IG9mIFhNTCBmaWxlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWE1MIHNjaGVtYXMgYXJlIGFuIFhNTCBsYW5ndWFnZSBmb3IgZGVzY3JpYmluZyBhbmQgY29uc3RyYWluaW5nIHRoZSBjb250ZW50IG9mIFhNTCBmaWxlcy4iIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRjeG1sc2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRpbXBzY2htLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRuYXZzcmMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHJlZmFjdHJYU0QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGVkdHByZWYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0icnhzZGljb25zLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRkZWxzY21wLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InR2ZHRzY2htLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InJubXNwYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9Indvcmtpbmd3aXRoeG1sc2NoZW1hcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldvcmtpbmcgd2l0aCBYTUwgc2NoZW1hczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id29ya2luZ3dpdGh4bWxzY2hlbWFzIj48YSBuYW1lPSJ3b3JraW5nd2l0aHhtbHNjaGVtYXMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmtpbmcgd2l0aCBYTUwgc2NoZW1hczwvaDE+Ci0KLQotPGRpdj48cD5YTUwgc2NoZW1hcyBhcmUgYW4gWE1MIGxhbmd1YWdlIGZvciBkZXNjcmliaW5nIGFuZCBjb25zdHJhaW5pbmcKLXRoZSBjb250ZW50IG9mIFhNTCBmaWxlcy48L3A+Ci0KLTxwPlRoaXMgc2VjdGlvbnMgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idGN4bWxzY2guaHRtbCIgdGl0bGU9IllvdSBjYW4gY3JlYXRlIGFuIFhNTCBzY2hlbWEgYW5kIHRoZW4gZWRpdCBpdCB1c2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIFVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvciwgeW91IGNhbiBzcGVjaWZ5IGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIj5DcmVhdGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idGltcHNjaG0uaHRtbCIgdGl0bGU9IklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBYTUwgc2NoZW1hIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgcHJvZHVjdCwgeW91IGNhbiBpbXBvcnQgdGhlbSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW4gdGhlbSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIFRoZSBYTUwgc2NoZW1hIGVkaXRvciBwcm92aWRlcyB5b3Ugd2l0aCBhIHN0cnVjdHVyZWQgdmlldyBvZiB0aGUgWE1MIHNjaGVtYS4iPkltcG9ydGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idG5hdnNyYy5odG1sIiB0aXRsZT0iV2hlbiB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIFNvdXJjZSB2aWV3LCB5b3UgY2FuIHVzZSBGMyB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBmaWxlIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW4gdGhlIGFwcHJvcHJpYXRlIGl0ZW0gYW5kIHByZXNzaW5nIEYzIHRvIGp1bXAgdG8gdGhlIGl0ZW0gaXQgcmVmZXJzIHRvLiI+TmF2aWdhdGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHJlZmFjdHJYU0QuaHRtbCIgdGl0bGU9IldpdGhpbiBhbiBYTUwgU2NoZW1hIGZpbGUsIHJlZmFjdG9yaW5nIGFsbG93cyBhdXRob3JzIHRvIG1ha2UgYSBzaW5nbGUgYXJ0aWZhY3QgY2hhbmdlLCBhbmQgaGF2ZSB0aGF0IGNoYW5nZSBpbXBsZW1lbnRlZCB0aHJvdWdob3V0IGFsbCBvdGhlciBkZXBlbmRhbnQgYXJ0aWZhY3RzLiI+UmVmYWN0b3JpbmcgaW4gWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRlZHRwcmVmLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciBYTUwgc2NoZW1hIGZpbGVzIHN1Y2ggYXMgdGhlIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSBhbmQgWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIHByZWZpeCB1c2VkLiI+RWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRkZWxzY21wLmh0bWwiIHRpdGxlPSJJZiB5b3UgaGF2ZSBjcmVhdGVkIGFueSBYTUwgc2NoZW1hIGNvbXBvbmVudHMgeW91IG5vIGxvbmdlciBuZWVkLCB5b3UgY2FuIGRlbGV0ZSB0aGVtLiI+RGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0dmR0c2NobS5odG1sIiB0aXRsZT0iVmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgUHJvYmxlbXMgdmlldy4iPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJyeHNkaWNvbnMuaHRtbCIgdGl0bGU9IlRoZSBmb2xsb3dpbmcgWE1MIHNjaGVtYSBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lLCBEZXNpZ24sIGFuZCBQcm9wZXJ0aWVzIHZpZXcuIj5JY29ucyB1c2VkIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvcjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icm5tc3BjLmh0bWwiIHRpdGxlPSJBbiBYTUwgbmFtZXNwYWNlIGlzIGEgY29sbGVjdGlvbiBvZiBuYW1lcywgaWRlbnRpZmllZCBieSBhIFVSSSByZWZlcmVuY2UsIHdoaWNoIGFyZSB1c2VkIGluIFhNTCBkb2N1bWVudHMgYXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlIG5hbWVzLiI+WE1MIG5hbWVzcGFjZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sc2NlZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sc2NlZC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGFhYjNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHNjZWQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3htbHNjZWQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlhNTCBzY2hlbWEgZWRpdG9yPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5YTUwgc2NoZW1hIGVkaXRvcjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLA0KLWFuZCB2YWxpZGF0aW5nIFhNTCBzY2hlbWFzLiBYTUwgc2NoZW1hcyBhcmUgYSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBlbGVtZW50DQotbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaA0KLWNvbWJpbmF0aW9ucy4gPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPkEgc2NoZW1hIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIGEgRFRELCBidXQgaXMgd3JpdHRlbiBpbiBYTUwuIEENCi1zY2hlbWEgYWxzbyBwcm92aWRlcyBleHRlbmRlZCBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgZGF0YSB0eXBpbmcsIGluaGVyaXRhbmNlLA0KLWFuZCBwcmVzZW50YXRpb24gcnVsZXMuPC9wPg0KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFhNTCBzY2hlbWEsIHNlZSB0aGUgZm9sbG93aW5nOjwvcD4NCi08dWw+DQotPGxpPiA8eHJlZiBmb3JtYXQ9Imh0bWwiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0wLyIgc2NvcGU9ImV4dGVybmFsIj5odHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMC88L3hyZWY+IDwvbGk+DQotPGxpPiA8eHJlZiBmb3JtYXQ9Imh0bWwiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyIgc2NvcGU9ImV4dGVybmFsIj5odHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS88L3hyZWY+IDwvbGk+DQotPGxpPiA8eHJlZiBmb3JtYXQ9Imh0bWwiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyIgc2NvcGU9ImV4dGVybmFsIj5odHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi88L3hyZWY+IDwvbGk+DQotPC91bD4NCi08cD5Vc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW46PC9wPg0KLTx1bD4NCi08bGk+Q3JlYXRlIGFuZCBkZWxldGUgWE1MIHNjaGVtYSBjb21wb25lbnRzIHN1Y2ggYXMgY29tcGxleCB0eXBlcywgc2ltcGxlDQotdHlwZXMsIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUgZ3JvdXBzLCBhbmQgZ3JvdXBzLjwvbGk+DQotPGxpPkVkaXQgWE1MIHNjaGVtYXMuPC9saT4NCi08bGk+SW1wb3J0IGV4aXN0aW5nIFhNTCBzY2hlbWFzIGZvciBzdHJ1Y3R1cmVkIHZpZXdpbmcuPC9saT4NCi08L3VsPg0KLTxwPlRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24gZnJvbSB0aGUgVzNDIFdlYiBzaXRlIGlzIHVzZWQgZm9yIHZhbGlkYXRpb24uPC9wPg0KLTxzZWN0aW9uPjx0aXRsZT5YTUwgc2NoZW1hIGVkaXRvciB2aWV3cyAtIERlc2lnbiwgT3V0bGluZSwgUHJvcGVydGllcywgYW5kDQotU291cmNlPC90aXRsZT5UaGVyZSBhcmUgZm91ciBtYWluIHZpZXdzIHlvdSBjYW4gd29yayB3aXRoIGluIHRoZSBYTUwgc2NoZW1hDQotZWRpdG9yOjx1bD4NCi08bGk+RGVzaWduIC0gdGhlIERlc2lnbiB2aWV3IHByb3ZpZGVzIGEgZ3JhcGhpY2FsIHdheSB0byBlZGl0IHlvdXIgc2NoZW1hPC9saT4NCi08bGk+T3V0bGluZSAtIHRoZSBPdXRsaW5lIHZpZXcgc2hvd3MgeW91IHRoZSBtYWluIGNvbXBvbmVudHMgaW4geW91ciBYTUwgc2NoZW1hLg0KLVlvdSBjYW4gdXNlIHRoaXMgdmlldyB0byBhZGQgYW5kIHJlbW92ZSBjZXJ0YWluIGNvbXBvbmVudHMuPC9saT4NCi08bGk+UHJvcGVydGllcyAtIHRoZSBQcm9wZXJ0aWVzIHZpZXcgZW5hYmxlcyB5b3UgdG8gZWRpdCB0aGUgcHJvcGVydGllcyBvZg0KLXlvdXIgWE1MIHNjaGVtYSBjb21wb25lbnRzPC9saT4NCi08bGk+U291cmNlIC0gdGhlIFNvdXJjZSB2aWV3IGVuYWJsZXMgeW91IHRvIGVkaXQgeW91ciBzb3VyY2UgY29kZSBkaXJlY3RseTwvbGk+DQotPC91bD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlN0YXR1cyBvZiB0aGUgWE1MIHNjaGVtYTwvdGl0bGU+PHA+PC9wPjxwPlRocmVlIHN0YXR1cyBpbmRpY2F0b3JzDQotZm9yIHRoZSBzY2hlbWEgYXJlIGF2YWlsYWJsZS4gVGhleSBhcmUgaW4gdGhlIGJvdHRvbSByaWdodCBjb3JuZXI6PC9wPjx1bD4NCi08bGk+IDx1aWNvbnRyb2w+V3JpdGFibGU8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5SZWFkIE9ubHk8L3VpY29udHJvbD4uIDwvbGk+DQotPGxpPiAoU291cmNlIHZpZXcgb25seSkgPHVpY29udHJvbD5TbWFydCBJbnNlcnQ8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5PdmVyd3JpdGU8L3VpY29udHJvbD4uDQotVG8gdG9nZ2xlIGJldHdlZW4gdGhlc2UgbW9kZXMsIHByZXNzIHRoZSA8dWljb250cm9sPkluc2VydDwvdWljb250cm9sPiBidXR0b24NCi1vbiB5b3VyIGtleWJvYXJkLjwvbGk+DQotPGxpPiBMaW5lIGFuZCBjb2x1bW4gbnVtYmVyIChkaXNwbGF5ZWQgaW4gdGhlIGZvcm1hdCA8P1B1YiBDYXJldD8+PHVzZXJpbnB1dD5jb2x1bW4NCi0jIDogbGluZSAjPC91c2VyaW5wdXQ+KTwvbGk+DQotPC91bD48L3NlY3Rpb24+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCi08P1B1YiAqMDAwMDAwMjkwNj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sc2NlZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sc2NlZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmE5OTE0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHNjZWQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLCBhbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWE1MIHNjaGVtYXMgYXJlIGEgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBwcm9kdWN0IHByb3ZpZGVzIGFuIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcgWE1MIHNjaGVtYXMuIFhNTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIG92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjeG1sc2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NobS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHZkdHNjaG0uaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjeG1sc2NlZCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlhNTCBzY2hlbWEgZWRpdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjeG1sc2NlZCI+PGEgbmFtZT0iY3htbHNjZWQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlhNTCBzY2hlbWEgZWRpdG9yPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLAotYW5kIHZhbGlkYXRpbmcgWE1MIHNjaGVtYXMuIFhNTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGVsZW1lbnQKLW5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2gKLWNvbWJpbmF0aW9ucy4gPC9wPgotCi08cD5BIHNjaGVtYSBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBhIERURCwgYnV0IGlzIHdyaXR0ZW4gaW4gWE1MLiBBCi1zY2hlbWEgYWxzbyBwcm92aWRlcyBleHRlbmRlZCBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgZGF0YSB0eXBpbmcsIGluaGVyaXRhbmNlLAotYW5kIHByZXNlbnRhdGlvbiBydWxlcy48L3A+Ci0KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFhNTCBzY2hlbWEsIHNlZSB0aGUgZm9sbG93aW5nOjwvcD4KLQotPHVsPgotPGxpPiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMC8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMC88L2E+IDwvbGk+Ci0KLTxsaT4gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvPC9hPiA8L2xpPgotCi08bGk+IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLzwvYT4gPC9saT4KLQotPC91bD4KLQotPHA+VXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuOjwvcD4KLQotPHVsPgotPGxpPkNyZWF0ZSBhbmQgZGVsZXRlIFhNTCBzY2hlbWEgY29tcG9uZW50cyBzdWNoIGFzIGNvbXBsZXggdHlwZXMsIHNpbXBsZQotdHlwZXMsIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUgZ3JvdXBzLCBhbmQgZ3JvdXBzLjwvbGk+Ci0KLTxsaT5FZGl0IFhNTCBzY2hlbWFzLjwvbGk+Ci0KLTxsaT5JbXBvcnQgZXhpc3RpbmcgWE1MIHNjaGVtYXMgZm9yIHN0cnVjdHVyZWQgdmlld2luZy48L2xpPgotCi08L3VsPgotCi08cD5UaGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9uIGZyb20gdGhlIFczQyBXZWIgc2l0ZSBpcyB1c2VkIGZvciB2YWxpZGF0aW9uLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlhNTCBzY2hlbWEgZWRpdG9yIHZpZXdzIC0gRGVzaWduLCBPdXRsaW5lLCBQcm9wZXJ0aWVzLCBhbmQKLVNvdXJjZTwvaDQ+VGhlcmUgYXJlIGZvdXIgbWFpbiB2aWV3cyB5b3UgY2FuIHdvcmsgd2l0aCBpbiB0aGUgWE1MIHNjaGVtYQotZWRpdG9yOjx1bD4KLTxsaT5EZXNpZ24gLSB0aGUgRGVzaWduIHZpZXcgcHJvdmlkZXMgYSBncmFwaGljYWwgd2F5IHRvIGVkaXQgeW91ciBzY2hlbWE8L2xpPgotCi08bGk+T3V0bGluZSAtIHRoZSBPdXRsaW5lIHZpZXcgc2hvd3MgeW91IHRoZSBtYWluIGNvbXBvbmVudHMgaW4geW91ciBYTUwgc2NoZW1hLgotWW91IGNhbiB1c2UgdGhpcyB2aWV3IHRvIGFkZCBhbmQgcmVtb3ZlIGNlcnRhaW4gY29tcG9uZW50cy48L2xpPgotCi08bGk+UHJvcGVydGllcyAtIHRoZSBQcm9wZXJ0aWVzIHZpZXcgZW5hYmxlcyB5b3UgdG8gZWRpdCB0aGUgcHJvcGVydGllcyBvZgoteW91ciBYTUwgc2NoZW1hIGNvbXBvbmVudHM8L2xpPgotCi08bGk+U291cmNlIC0gdGhlIFNvdXJjZSB2aWV3IGVuYWJsZXMgeW91IHRvIGVkaXQgeW91ciBzb3VyY2UgY29kZSBkaXJlY3RseTwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlN0YXR1cyBvZiB0aGUgWE1MIHNjaGVtYTwvaDQ+PHAgLz4KLTxwPlRocmVlIHN0YXR1cyBpbmRpY2F0b3JzCi1mb3IgdGhlIHNjaGVtYSBhcmUgYXZhaWxhYmxlLiBUaGV5IGFyZSBpbiB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lcjo8L3A+Ci08dWw+Ci08bGk+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldyaXRhYmxlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWFkIE9ubHk8L3NwYW4+LiA8L2xpPgotCi08bGk+IChTb3VyY2UgdmlldyBvbmx5KSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TbWFydCBJbnNlcnQ8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk92ZXJ3cml0ZTwvc3Bhbj4uCi1UbyB0b2dnbGUgYmV0d2VlbiB0aGVzZSBtb2RlcywgcHJlc3MgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydDwvc3Bhbj4gYnV0dG9uCi1vbiB5b3VyIGtleWJvYXJkLjwvbGk+Ci0KLTxsaT4gTGluZSBhbmQgY29sdW1uIG51bWJlciAoZGlzcGxheWVkIGluIHRoZSBmb3JtYXQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5jb2x1bW4KLSMgOiBsaW5lICM8L2tiZD4pPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3htbHNjaC5odG1sIiB0aXRsZT0iWW91IGNhbiBjcmVhdGUgYW4gWE1MIHNjaGVtYSBhbmQgdGhlbiBlZGl0IGl0IHVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuIHNwZWNpZnkgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iPkNyZWF0aW5nIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaG0uaHRtbCIgdGl0bGU9IkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LiI+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90dmR0c2NobS5odG1sIiB0aXRsZT0iVmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgUHJvYmxlbXMgdmlldy4iPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYU0QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWFNELmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MDI2MGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYU0QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlICBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIiAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0icmxpbWl0YXRpb25zX3NsdXNoWFNEIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5MaW1pdGF0aW9ucyBvZiBYTUwgc2NoZW1hIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+TGltaXRhdGlvbnMgb2YgWE1MIHNjaGVtYSBlZGl0b3I8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuPC9zaG9ydGRlc2M+DQotPHJlZmJvZHk+DQotPCEtLVVzZSB0aGlzIHRlbXBsYXRlIHRvIHNpbmdsZSBzb3VyY2UgdGhlIHJlYWRtZSBpbmZvcm1hdGlvbi4gIFRoZSBjb250ZW50IGZvciB0aGUgcmVhZG1lIGluZm9ybWF0aW9uIGlzIG1haW50YWluZWQgaW4gdGhpcyB0b3BpYyBhbmQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgcmVsYXRlZCB0b3BpYyB1c2luZyB0aGUgY29ucmVmIGF0dHJpYnV0ZS4gVGhpcyBmaWxlIHdpbGwgbm90IGJlIHN1cmZhY2VkIGluIHlvdXIgbmF2aWdhdGlvbi4tLT4NCi08c2VjdGlvbj48dGl0bGU+SGVicmV3IExvZ2ljYWwgZW5jb2Rpbmc8L3RpdGxlPjxwIGlkPSJlbmNvZGluZyI+PCEtLVRoZXJlIGlzIG5vIGRlZmVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbnRyeS4gSXQgaXMgZnJvbSB0aGUgNS4xIHJlYWRtZS4tLT5XaGVuDQotSGVicmV3IExvZ2ljYWwgKElTTy04ODU5LTgtSSkgZW5jb2RpbmcgaXMgc2VsZWN0ZWQgYXMgYSBwcmVmZXJlbmNlIGZvciBlbmNvZGluZw0KLW9mIEhUTUwgZmlsZXMgKDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPldlYiBhbmQgWE1MIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5IVE1MIGZpbGVzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gaW4gdGhlICJXaGVuIGNyZWF0aW5nIGZpbGVzIiBzZWN0aW9uKSwgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbg0KLWZpbGVzIGdlbmVyYXRlZCBmcm9tIGFuIFhNTCBzY2hlbWEgZmlsZSB3aWxsIHN0aWxsIGhhdmUgYSBVVEYtOCBlbmNvZGluZy4NCi1UaGlzIGlzIGEga25vd24gcHJvYmxlbS48L3A+PC9zZWN0aW9uPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhTRC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYU0QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyZmMyOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhTRC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InJlZmVyZW5jZSIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJMaW1pdGF0aW9ucyBvZiBYTUwgc2NoZW1hIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGtub3duIHByb2R1Y3QgYXNwZWN0IGxpbWl0YXRpb25zIGFuZCB3b3JrYXJvdW5kcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJsaW1pdGF0aW9uc19zbHVzaFhTRCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkxpbWl0YXRpb25zIG9mIFhNTCBzY2hlbWEgZWRpdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJybGltaXRhdGlvbnNfc2x1c2hYU0QiPjxhIG5hbWU9InJsaW1pdGF0aW9uc19zbHVzaFhTRCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TGltaXRhdGlvbnMgb2YgWE1MIHNjaGVtYSBlZGl0b3I8L2gxPgotCi0KLQotPGRpdj48cD5UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGtub3duIHByb2R1Y3QgYXNwZWN0IGxpbWl0YXRpb25zIGFuZCB3b3JrYXJvdW5kcy48L3A+Ci0KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkhlYnJldyBMb2dpY2FsIGVuY29kaW5nPC9oND48cCBpZD0icmxpbWl0YXRpb25zX3NsdXNoWFNEX19lbmNvZGluZyI+PGEgbmFtZT0icmxpbWl0YXRpb25zX3NsdXNoWFNEX19lbmNvZGluZyI+PCEtLSAtLT48L2E+V2hlbgotSGVicmV3IExvZ2ljYWwgKElTTy04ODU5LTgtSSkgZW5jb2RpbmcgaXMgc2VsZWN0ZWQgYXMgYSBwcmVmZXJlbmNlIGZvciBlbmNvZGluZwotb2YgSFRNTCBmaWxlcyAoPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kIFhNTCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MIGZpbGVzPC9zcGFuPgotPC9zcGFuPiBpbiB0aGUgIldoZW4gY3JlYXRpbmcgZmlsZXMiIHNlY3Rpb24pLCB0aGUgSFRNTCBkb2N1bWVudGF0aW9uCi1maWxlcyBnZW5lcmF0ZWQgZnJvbSBhbiBYTUwgc2NoZW1hIGZpbGUgd2lsbCBzdGlsbCBoYXZlIGEgVVRGLTggZW5jb2RpbmcuCi1UaGlzIGlzIGEga25vd24gcHJvYmxlbS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDlhNDYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDgsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiINCi0gInJlZmVyZW5jZS5kdGQiPg0KLTw/UHViIFN0eSBfZGlzcGxheSBGb250Q29sb3I9InJlZCI/Pg0KLTxyZWZlcmVuY2UgaWQ9InJubXNwYyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+WE1MIG5hbWVzcGFjZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCBuYW1lc3BhY2VzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkFuIFhNTCBuYW1lc3BhY2UgaXMgYSBjb2xsZWN0aW9uIG9mIG5hbWVzLCBpZGVudGlmaWVkIGJ5DQotYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMNCi1hbmQgYXR0cmlidXRlIG5hbWVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBuYW1lc3BhY2VzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08cmVmYm9keT4NCi08c2VjdGlvbj5YTUwgbmFtZXNwYWNlcyBhcmUgZGVmaW5lZCBieSBhIFczQyByZWNvbW1lbmRhdGlvbiwgZGF0aW5nDQotMTYgQXVndXN0IDIwMDYsIGNhbGxlZCA8eHJlZiBmb3JtYXQ9Imh0bWwiDQotaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9SRUMteG1sLW5hbWVzLTIwMDYwODE2LyIgc2NvcGU9ImV4dGVybmFsIj5OYW1lc3BhY2VzDQotaW4gWE1MPC94cmVmPi4gWE1MIHRhZyBuYW1lcyBzaG91bGQgYmUgZ2xvYmFsbHkgdW5pcXVlLCBhcyB3ZWxsIGFzDQotc2hvcnQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIEluIG9yZGVyIHRvIHJlc29sdmUgdGhpcyBjb25mbGljdCwNCi10aGUgVzNDIG5hbWVzcGFjZSByZWNvbW1lbmRhdGlvbiBkZWZpbmVzIGFuIGF0dHJpYnV0ZSA8Yj54bWxuczwvYj4gd2hpY2gNCi1jYW4gYW1lbmQgYW55IFhNTCBlbGVtZW50LiBJZiBpdCBpcyBwcmVzZW50IGluIGFuIGVsZW1lbnQsIGl0IGlkZW50aWZpZXMNCi10aGUgbmFtZXNwYWNlIGZvciB0aGlzIGVsZW1lbnQuPC9zZWN0aW9uPg0KLTxzZWN0aW9uPjxwPlRoZSB4bWxucyBhdHRyaWJ1dGUgaGFzIHRoZSBmb2xsb3dpbmcgc3ludGF4OjwvcD48cD48Y29kZXBoPnhtbG5zOjx2YXJuYW1lPnByZWZpeDwvdmFybmFtZT49bmFtZXNwYWNlPC9jb2RlcGg+IDwvcD48cD53aGVyZSA8Y29kZXBoPm5hbWVzcGFjZTwvY29kZXBoPiBpcw0KLWEgdW5pcXVlIFVSSSAoc3VjaCBhcyB3d3cuaWJtLmNvbSkgYW5kIHdoZXJlIDxjb2RlcGg+PHZhcm5hbWU+cHJlZml4PC92YXJuYW1lPjwvY29kZXBoPiByZXByZXNlbnRzDQotdGhlIG5hbWVzcGFjZSBhbmQgcHJvdmlkZXMgYSBwb2ludGVyIHRvIGl0LjwvcD48cD5JbiB0aGUgZm9sbG93aW5nDQotY3VzdG9tZXIgZWxlbWVudCBkZWZpbml0aW9uLCBhbiBhY2NvdW50aW5nIG5hbWVzcGFjZSBpcyBkZWZpbmVkIGluDQotb3JkZXIgdG8gYmUgYWJsZSB0byBkaXN0aW5ndWlzaCB0aGUgZWxlbWVudCB0YWdzIGZyb20gdGhvc2UgYXBwZWFyaW5nDQotaW4gY3VzdG9tZXIgcmVjb3JkcyBjcmVhdGVkIGJ5IG90aGVyIGJ1c2luZXNzIGFwcGxpY2F0aW9uczo8L3A+PHA+PGNvZGVibG9jaz4mbHQ7YWNjdDpjdXN0b21lciB4bWxuczphY2N0PSJodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwIj4NCi0JJmx0O2FjY3Q6bmFtZT5Db3Jwb3JhdGlvbiZsdDsvYWNjdDpuYW1lPg0KLQkmbHQ7YWNjdDpvcmRlciBhY2N0OnJlZj0iNTU2NiIvPg0KLQkmbHQ7YWNjdDpzdGF0dXM+aW52b2ljZSZsdDsvYWNjdDpzdGF0dXM+DQotJmx0Oy9hY2N0OmN1c3RvbWVyPiAgPC9jb2RlYmxvY2s+IDwvcD48cD5UaGUgbmFtZXNwYWNlIGRlZmluaXRpb24NCi1pbiB0aGUgZmlyc3QgbGluZSBhc3NpZ25zIHRoZSBuYW1lc3BhY2UgaHR0cDovL3d3dy5teS5jb20vYWNjdC1SRVYxMA0KLXRvIHRoZSBwcmVmaXguIFRoaXMgcHJlZml4IGlzIHVzZWQgb24gdGhlIGVsZW1lbnQgbmFtZXMgc3VjaCBhcyBuYW1lDQotaW4gb3JkZXIgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIG5hbWVzcGFjZS4gQSBzZWNvbmQgYXBwbGljYXRpb24sIGZvcg0KLWV4YW1wbGUsIGEgZnVsZmlsbG1lbnQgc3lzdGVtLCBjYW4gYXNzaWduIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0bw0KLWl0cyBjdXN0b21lciBlbGVtZW50czo8L3A+PHA+PGNvZGVibG9jaz4mbHQ7ZnVsOmN1c3RvbWVyIHhtbG5zOmZ1bD0iaHR0cDovL3d3dy55b3VyLmNvbS9mdWwiPg0KLQkmbHQ7ZnVsOm5hbWU+Q29ycG9yYXRpb24mbHQ7L2Z1bDpuYW1lPg0KLQkmbHQ7ZnVsOm9yZGVyIGZ1bDpyZWY9IkE5ODc1NiIvPg0KLQkmbHQ7ZnVsOnN0YXR1cz5zaGlwcGVkJmx0Oy9mdWw6c3RhdHVzPg0KLSAmbHQ7L2Z1bDpjdXN0b21lcj48L2NvZGVibG9jaz4gPC9wPjxwPkFuIGFwcGxpY2F0aW9uIHByb2Nlc3NpbmcgYm90aA0KLWRhdGEgc3RydWN0dXJlcyBpcyBub3cgYWJsZSB0byB0cmVhdCB0aGUgYWNjb3VudGluZyBhbmQgdGhlIGZ1bGZpbGxtZW50DQotZGF0YSBkaWZmZXJlbnRseS4gVGhlcmUgaXMgYSBkZWZhdWx0IG5hbWVzcGFjZS4gSXQgaXMgc2V0IGlmIG5vIGxvY2FsDQotbmFtZSBpcyBhc3NpZ25lZCBpbiB0aGUgbmFtZXNwYWNlIGRlZmluaXRpb246PC9wPjxwPjxjb2RlYmxvY2s+Jmx0O2FjY3Q6Y3VzdG9tZXIgeG1sbnM9Imh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTAiIHhtbG5zOmFjY3Q9Imh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTAgIj4NCi0mbHQ7bmFtZT5Db3Jwb3JhdGlvbiZsdDsvbmFtZT4NCi0mbHQ7b3JkZXIgYWNjdDpyZWY9IjU1NjYiLz4NCi0mbHQ7c3RhdHVzPmludm9pY2UmbHQ7L3N0YXR1cz4NCi0mbHQ7L2N1c3RvbWVyPjwvY29kZWJsb2NrPjwvcD48cD5JbiB0aGlzIGV4YW1wbGUsIGFsbCB0YWdzIGluIHRoZQ0KLWN1c3RvbWVyIHJlY29yZCBhcmUgcXVhbGlmaWVkIHRvIHJlc2lkZSBpbiB0aGUgbmFtZXNwYWNlIGh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTAuDQotTm8gZXhwbGljaXQgcHJlZml4IGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBpcyB1c2VkLg0KLU5vdGUgdGhhdCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgYXBwbGllcyB0byBhbnkgYXR0cmlidXRlcyBkZWZpbml0aW9ucy48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5YTUwgc2NoZW1hcyBhbmQgbmFtZXNwYWNlczwvdGl0bGU+PHA+SW4gdGhlIGZvbGxvd2luZw0KLVhNTCBzY2hlbWEsIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBmb3IgdGhlIHNjaGVtYSBpcyBkZWZpbmVkIGFzIHRoZQ0KLXN0YW5kYXJkIFhNTCBzY2hlbWEgbmFtZXNwYWNlIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hOyB0aGVyZQ0KLWlzIGFsc28gYSBzY2hlbWEgc3BlY2lmaWMgbmFtZXNwYWNlIGh0dHA6Ly93d3cuaWJtLmNvbS48L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0mbHQ7c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOlRlc3RTY2hlbWE9Imh0dHA6Ly93d3cuaWJtLmNvbSI+DQotICZsdDtzaW1wbGVUeXBlIG5hbWU9IlppcENvZGVUeXBlIj4NCi0gJmx0O3Jlc3RyaWN0aW9uIGJhc2U9ImludGVnZXIiPg0KLSAgJmx0O21pbkluY2x1c2l2ZSB2YWx1ZT0iMTAwMDAiLz4NCi0gJmx0O21heEluY2x1c2l2ZSB2YWx1ZT0iOTk5OTkiLz4NCi0mbHQ7L3Jlc3RyaWN0aW9uPg0KLSAmbHQ7L3NpbXBsZVR5cGU+IA0KLSAmbHQ7IS0tZWxlbWVudCBkZWZpbml0aW9ucyBza2lwcGVkIC0tPiAgDQotJmx0Oy9zY2hlbWE+ICA8L2NvZGVibG9jaz48L3A+PHA+QXNzdW1pbmcgdGhhdCB0aGUgcHJlY2VkaW5nIFhNTCBzY2hlbWENCi1pcyBzYXZlZCBhcyA8ZmlsZXBhdGg+QzpcdGVtcFxUZXN0U2NoZW1hLnhzZDwvZmlsZXBhdGg+LCBhIHNhbXBsZQ0KLVhNTCBmaWxlIHRoYXQgdmFsaWRhdGVzIGFnYWluc3QgdGhpcyBzY2hlbWEgaXM6PC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotJmx0O3g6YWRkcmVzc0xpc3QgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gZmlsZTovLy9DOi90ZW1wL1Rlc3RTY2hlbWEueHNkIj4NCi0geHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gZmlsZTovLy9DOi90ZW1wL1Rlc3RTY2hlbWEueHNkIj4NCi0mbHQ7eDphZGRyZXNzPg0KLSAmbHQ7eDpzdHJlZXQ+eDpWYW5nZXJvd3N0cmFzc2UmbHQ7L3g6c3RyZWV0Pg0KLSAgJmx0O3g6emlwQ29kZT42OTExNSZsdDsveDp6aXBDb2RlPg0KLSAmbHQ7eDpjaXR5Png6SGVpZGVsYmVyZyZsdDsveDpjaXR5Pg0KLSAmbHQ7L3g6YWRkcmVzcz4NCi0gICAgJmx0O3g6YWRkcmVzcz4gDQotJmx0O3g6c3RyZWV0Png6QmVybmFsIFJvYWQmbHQ7L3g6c3RyZWV0PiANCi0mbHQ7eDp6aXBDb2RlPjkwMzc1Jmx0Oy94OnppcENvZGU+DQotICAgICAmbHQ7eDpjaXR5Png6U2FuIEpvc2UmbHQ7L3g6Y2l0eT4NCi0gJmx0Oy94OmFkZHJlc3M+DQotJmx0Oy94OmFkZHJlc3NMaXN0PiA8L2NvZGVibG9jaz48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5UYXJnZXQgbmFtZXNwYWNlPC90aXRsZT48cD4gVGhlIHRhcmdldCBuYW1lc3BhY2Ugc2VydmVzDQotdG8gaWRlbnRpZnkgdGhlIG5hbWVzcGFjZSB3aXRoaW4gd2hpY2ggdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlDQotZWxlbWVudCBhbmQgaXRzIG5hbWUgZXhpc3RzLiBJbiB0aGUgY2FzZSBvZiBkZWNsYXJhdGlvbnMsIHRoaXMgYXNzb2NpYXRpb24NCi1kZXRlcm1pbmVzIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGVsZW1lbnRzIGluIFhNTCBmaWxlcyBjb25mb3JtaW5nIHRvDQotdGhlIHNjaGVtYS4gQW4gWE1MIGZpbGUgaW1wb3J0aW5nIGEgc2NoZW1hIG11c3QgcmVmZXJlbmNlIGl0cyB0YXJnZXQNCi1uYW1lc3BhY2UgaW4gdGhlIHNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZS4gQW55IG1pc21hdGNoZXMgYmV0d2Vlbg0KLXRoZSB0YXJnZXQgYW5kIHRoZSBhY3R1YWwgbmFtZXNwYWNlIG9mIGFuIGVsZW1lbnQgYXJlIHJlcG9ydGVkIGFzDQotc2NoZW1hIHZhbGlkYXRpb24gZXJyb3JzLiBJbiBvdXIgZXhhbXBsZSwgdGhlIHRhcmdldCBuYW1lc3BhY2UgaXMNCi1odHRwOi8vd3d3LmlibS5jb207IGl0IGlzIGRlZmluZWQgaW4gdGhlICBYTUwgc2NoZW1hIGZpbGUgYW5kIHJlZmVyZW5jZWQNCi10d2ljZSBpbiB0aGUgWE1MIGZpbGUuIEFueSBtaXNtYXRjaCBiZXR3ZWVuIHRoZXNlIHRocmVlIG9jY3VycmVuY2VzDQotb2YgdGhlIG5hbWVzcGFjZSBsZWFkIHRvIHZhbGlkYXRpb24gZXJyb3JzLjwvcD48cD4gVGhlIGZvbGxvd2luZyBleGFtcGxlcw0KLXNob3cgaG93IHRhcmdldCBuYW1lc3BhY2VzIGFuZCBuYW1lc3BhY2UgcHJlZml4ZXMgd29yayBpbiBYTUwgc2NoZW1hcw0KLWFuZCB0aGVpciBjb3JyZXNwb25kaW5nIFhNTCBpbnN0YW5jZSBkb2N1bWVudHMuPC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2FtcGxlIDEgLSBBIHNjaGVtYSB3aXRoIGJvdGggYSBkZWZhdWx0IGFuZCB0YXJnZXQNCi1uYW1lc3BhY2UgYW5kIHVucXVhbGlmaWVkIGxvY2FsczwvdGl0bGU+PHA+VGhlIFhNTCBzY2hlbWE6ICA8L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0mbHQ7c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSI+DQotJmx0O2NvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NUeXBlIj4NCi0mbHQ7c2VxdWVuY2U+DQotJmx0O2VsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4mbHQ7L2VsZW1lbnQ+DQotJmx0Oy9zZXF1ZW5jZT4NCi0mbHQ7L2NvbXBsZXhUeXBlPg0KLSZsdDtlbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0ieDpBZGRyZXNzVHlwZSI+Jmx0Oy9lbGVtZW50Pg0KLSZsdDsvc2NoZW1hPiA8L2NvZGVibG9jaz4gPC9wPjxwPkEgdmFsaWQgWE1MIGluc3RhbmNlIGRvY3VtZW50IGNyZWF0ZWQNCi1mcm9tIHRoaXMgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gTG9jYWwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgYXJlDQotdW5xdWFsaWZpZWQuPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotJmx0O3g6TXlBZGRyZXNzIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20geC54c2QgIj4NCi0mbHQ7bmFtZT5QZXRlciBTbWl0aCZsdDsvbmFtZT4NCi0mbHQ7L3g6TXlBZGRyZXNzPiA8L2NvZGVibG9jaz48L3A+PHA+V2hlbiBsb2NhbCBlbGVtZW50cyAoc3VjaCBhcw0KLXRoZSAibmFtZSIgZWxlbWVudCkgYW5kIGF0dHJpYnV0ZXMgYXJlIHVucXVhbGlmaWVkIGluIGFuIFhNTCBmaWxlLA0KLXRoZW4gb25seSB0aGUgcm9vdCBlbGVtZW50IGlzIHF1YWxpZmllZC4gU28sIGluIHRoaXMgZXhhbXBsZSwgdGhlDQotIngiIG5hbWVzcGFjZSBwcmVmaXggaXMgYXNzaWduZWQgdG8gdGhlIHJvb3QgZWxlbWVudCAiTXlBZGRyZXNzIiwNCi1hc3NvY2lhdGluZyBpdCB3aXRoIHRoZSBuYW1lc3BhY2UgImh0dHA6Ly93d3cuaWJtLmNvbSIsIGJ1dCB0aGUieCINCi1wcmVmaXggaXMgbm90IGFzc2lnbmVkIHRvIHRoZSBsb2NhbCBlbGVtZW50ICJuYW1lIi48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TYW1wbGUgMiAtIEEgc2NoZW1hIHdpdGggYm90aCBhIGRlZmF1bHQgYW5kIHRhcmdldA0KLW5hbWVzcGFjZSBhbmQgcXVhbGlmaWVkIGxvY2FsczwvdGl0bGU+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0mbHQ7c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KLSZsdDtjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSI+DQotJmx0O3NlcXVlbmNlPg0KLSZsdDtlbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Jmx0Oy9lbGVtZW50Pg0KLSZsdDsvc2VxdWVuY2U+DQotJmx0Oy9jb21wbGV4VHlwZT4NCi0mbHQ7ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9Ing6QWRkcmVzc1R5cGUiPiZsdDsvZWxlbWVudD4NCi0gJmx0Oy9zY2hlbWE+ICA8L2NvZGVibG9jaz48L3A+PHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZA0KLWZyb20gdGhpcyBzY2hlbWEgbG9va3MgbGlrZSB0aGlzLiBMb2NhbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBhcmUNCi1xdWFsaWZpZWQgVGhpcyBpcyBiZWNhdXNlIHRoZSBlbGVtZW50Rm9ybURlZmF1bHQgYXR0cmlidXRlIGlzIHNldA0KLXRvIHF1YWxpZmllZCBpbiB0aGUgWE1MIHNjaGVtYS48L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0gICZsdDt4Ok15QWRkcmVzcyB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHgueHNkICI+IA0KLSZsdDt4Om5hbWU+UGV0ZXIgU21pdGgmbHQ7L3g6bmFtZT4NCi0gJmx0Oy94Ok15QWRkcmVzcz48L2NvZGVibG9jaz4gPC9wPjxwPkluIHRoaXMgZXhhbXBsZSwgdGhlICJ4IiBuYW1lc3BhY2UNCi1wcmVmaXggaXMgYXNzaWduZWQgdG8gYm90aCB0aGUgcm9vdCBlbGVtZW50ICJNeUFkZHJlc3MiIGFuZCB0aGUgbG9jYWwNCi1lbGVtZW50ICJuYW1lIiwgYXNzb2NpYXRpbmcgdGhlbSB3aXRoIHRoZSBuYW1lc3BhY2UgImh0dHA6Ly93d3cuaWJtLmNvbSIsLjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlNhbXBsZSAzIC0gU2NoZW1hIHdpdGggdGFyZ2V0IE5hbWVzcGFjZSwgYW5kIGV4cGxpY2l0bHkNCi1kZWZpbmVzIHhtbG5zOnhzZDwvdGl0bGU+PHA+VGhpcyBYTUwgc2NoZW1hIGFkZHMgdGhpcyBhdHRyaWJ1dGU6ICA8L3A+PGNvZGVwaD54bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIDwvY29kZXBoPjxwPldoYXQNCi10aGlzIG1lYW5zIGlzIHRoYXQgZWFjaCBvZiB0aGUgY29uc3RydWN0cyB0aGF0IGFyZSBkZWZpbmVkIGJ5IHRoZQ0KLVhNTCBzY2hlbWEgbGFuZ3VhZ2Ugd2lsbCBuZWVkIHRvIGJlIHF1YWxpZmllZCB3aXRoIHRoZSAieHNkIiBwcmVmaXguDQotRm9yIGV4YW1wbGUsIHhzZDpjb21wbGV4VHlwZSBhbmQgIHhzZDpzdHJpbmc8L3A+PHA+LiBOb3RlIHRoYXQgeW91DQotY2FuIGNob3NlIGFueSBvdGhlciBwcmVmaXhlcyBzdWNoIGFzICJ4cyIgb3IgImZvb2JhciIgaW4geW91ciBkZWNsYXJhdGlvbg0KLWFuZCB1c2FnZS48L3A+PHA+WW91IGNhbiBzcGVjaWZ5IHRoaXMgcHJlZml4IGluIHRoZSBYTUwgc2NoZW1hIHByZWZlcmVuY2VzDQotcGFnZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvcD48cD5BbGwNCi11c2VyIGRlZmluZWQgdHlwZXMgYmVsb25nIHRvIHRoZSBuYW1lc3BhY2UgIGh0dHA6Ly93d3cuaWJtLmNvbSBhcw0KLWRlZmluZWQgYnkgdGhlIHRhcmdldE5hbWVzcGFjZSBhdHRyaWJ1dGUsIGFuZCB0aGUgcHJlZml4IGlzICJ4IiBhcw0KLWRlZmluZWQgYnkgdGhlIHhtbG5zOnggYXR0cmlidXRlLjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSZsdDt4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iPg0KLSZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiPg0KLSZsdDt4c2Q6c2VxdWVuY2U+DQotCQkgJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPiZsdDsveHNkOmVsZW1lbnQ+DQotJmx0Oy94c2Q6c2VxdWVuY2U+DQotICZsdDsveHNkOmNvbXBsZXhUeXBlPg0KLSAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJ4OkFkZHJlc3NUeXBlIj4mbHQ7L3hzZDplbGVtZW50Pg0KLSZsdDsveHNkOnNjaGVtYT48L2NvZGVibG9jaz4gPC9wPjxwPkEgdmFsaWQgWE1MIGluc3RhbmNlIGRvY3VtZW50DQotY3JlYXRlZCBmcm9tIHRoaXMgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gTG9jYWwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMNCi1hcmUgdW5xdWFsaWZpZWQuIFRoZSBzZW1hbnRpY3Mgb2YgcXVhbGlmaWNhdGlvbiBpcyB0aGUgc2FtZSBhcyBTYW1wbGUNCi0xLjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSAmbHQ7eDpNeUFkZHJlc3MgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlInhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHgueHNkICI+DQotJmx0O25hbWU+UGV0ZXIgU21pdGgmbHQ7L25hbWU+DQotICZsdDsveDpNeUFkZHJlc3M+PC9jb2RlYmxvY2s+PC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2FtcGxlIDQgLSBTY2hlbWEgd2l0aCB1bmRlY2xhcmVkIHRhcmdldCBOYW1lc3BhY2UNCi10aGF0IGV4cGxpY2l0bHkgZGVmaW5lcyB4bWxuczp4c2Q8L3RpdGxlPjxwPlRoaXMgWE1MIHNjaGVtYSBoYXMgbm8NCi10YXJnZXQgbmFtZXNwYWNlIGZvciBpdHNlbGYuIEluIHRoaXMgY2FzZSwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkDQotdGhhdCBhbGwgWE1MIHNjaGVtYSBjb25zdHJ1Y3RzIGJlIGV4cGxpY2l0bHkgcXVhbGlmaWVkIHdpdGggYSBwcmVmaXgNCi1zdWNoIGFzICJ4c2QiLiBUaGUgZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIHRoaXMgc2NoZW1hIHN1Y2gNCi1hcyBBZGRyZXNzVHlwZSBhcmUgcmVmZXJlbmNlZCB3aXRob3V0IG5hbWVzcGFjZSBxdWFsaWZpY2F0aW9uIHNpbmNlDQotdGhlcmUgaXMgbm8gbmFtZXNwYWNlIHByZWZpeC4gIDwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSZsdDt4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiPg0KLSZsdDt4c2Q6c2VxdWVuY2U+DQotJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPiZsdDsveHNkOmVsZW1lbnQ+DQotJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPiZsdDsveHNkOmVsZW1lbnQ+DQotJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPiZsdDsveHNkOmVsZW1lbnQ+IA0KLSZsdDsveHNkOnNlcXVlbmNlPiANCi0mbHQ7L3hzZDpjb21wbGV4VHlwZT4NCi0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJBZGRyZXNzVHlwZSI+Jmx0Oy94c2Q6ZWxlbWVudD4gDQotJmx0Oy94c2Q6c2NoZW1hPiA8L2NvZGVibG9jaz48L3A+PHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQNCi1jcmVhdGVkIGZyb20gdGhlIHNjaGVtYSBsb29rcyBsaWtlIHRoaXMuIEFsbCBlbGVtZW50cyBhcmUgdW5xdWFsaWZpZWQuPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotJmx0O015QWRkcmVzcyB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0ieC54c2QiPg0KLSZsdDtuYW1lPm5hbWUmbHQ7L25hbWU+DQotJmx0Oy9NeUFkZHJlc3M+PC9jb2RlYmxvY2s+ICA8L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TYW1wbGUgNSAtIEEgc2NoZW1hIHdoZXJlIHRoZSB0YXJnZXQgbmFtZXNwYWNlIGlzDQotdGhlIGRlZmF1bHQgbmFtZXNwYWNlPC90aXRsZT48cD5UaGlzIGlzIGFuIFhNTCBzY2hlbWEgd2hlcmUgdGhlIHRhcmdldA0KLW5hbWVzcGFjZSBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UuIEFzIHdlbGwsIHRoZSBuYW1lc3BhY2UgaGFzIG5vDQotbmFtZXNwYWNlIHByZWZpeC48L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0gJmx0O3hzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iPg0KLSZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiPg0KLSZsdDt4c2Q6c2VxdWVuY2U+DQotJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPiZsdDsveHNkOmVsZW1lbnQ+DQotJmx0Oy94c2Q6c2VxdWVuY2U+DQotJmx0Oy94c2Q6Y29tcGxleFR5cGU+DQotICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9IkFkZHJlc3NUeXBlIj4mbHQ7L3hzZDplbGVtZW50Pg0KLSAmbHQ7L3hzZDpzY2hlbWE+IDwvY29kZWJsb2NrPiA8L3A+PHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQNCi1jcmVhdGVkIGZyb20gdGhlIHNjaGVtYSBsb29rcyBsaWtlIHRoaXM6PC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0mbHQ7TXlBZGRyZXNzIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIE5ld1hNTFNjaGVtYS54c2QiPg0KLSZsdDtuYW1lPm5hbWUmbHQ7L25hbWU+DQotICZsdDsvTXlBZGRyZXNzPiAgPC9jb2RlYmxvY2s+IDwvcD48L3NlY3Rpb24+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPjw/UHViIENhcmV0Pz4NCi08P1B1YiAqMDAwMDAxMjAzOD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODEwMjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlhNTCBuYW1lc3BhY2VzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkFuIFhNTCBuYW1lc3BhY2UgaXMgYSBjb2xsZWN0aW9uIG9mIG5hbWVzLCBpZGVudGlmaWVkIGJ5IGEgVVJJIHJlZmVyZW5jZSwgd2hpY2ggYXJlIHVzZWQgaW4gWE1MIGRvY3VtZW50cyBhcyBlbGVtZW50IHR5cGVzIGFuZCBhdHRyaWJ1dGUgbmFtZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFuIFhNTCBuYW1lc3BhY2UgaXMgYSBjb2xsZWN0aW9uIG9mIG5hbWVzLCBpZGVudGlmaWVkIGJ5IGEgVVJJIHJlZmVyZW5jZSwgd2hpY2ggYXJlIHVzZWQgaW4gWE1MIGRvY3VtZW50cyBhcyBlbGVtZW50IHR5cGVzIGFuZCBhdHRyaWJ1dGUgbmFtZXMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIG5hbWVzcGFjZXMsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIG5hbWVzcGFjZXMsIG92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRwcmVmLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icm5tc3BjIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+WE1MIG5hbWVzcGFjZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJubXNwYyI+PGEgbmFtZT0icm5tc3BjIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5YTUwgbmFtZXNwYWNlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkKLXJlZmVyZW5jZSwgd2hpY2ggYXJlIHVzZWQgaW4gWE1MIGRvY3VtZW50cyBhcyBlbGVtZW50IHR5cGVzIGFuZCBhdHRyaWJ1dGUKLW5hbWVzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+WE1MIG5hbWVzcGFjZXMgYXJlIGRlZmluZWQgYnkgYSBXM0MgcmVjb21tZW5kYXRpb24sIGRhdGluZyAxNiBBdWd1c3QKLTIwMDYsIGNhbGxlZCA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA2L1JFQy14bWwtbmFtZXMtMjAwNjA4MTYvIiB0YXJnZXQ9Il9ibGFuayI+TmFtZXNwYWNlcyBpbiBYTUw8L2E+LiBYTUwgdGFnIG5hbWVzIHNob3VsZCBiZSBnbG9iYWxseQotdW5pcXVlLCBhcyB3ZWxsIGFzIHNob3J0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBJbiBvcmRlciB0byByZXNvbHZlIHRoaXMKLWNvbmZsaWN0LCB0aGUgVzNDIG5hbWVzcGFjZSByZWNvbW1lbmRhdGlvbiBkZWZpbmVzIGFuIGF0dHJpYnV0ZSA8c3Ryb25nPnhtbG5zPC9zdHJvbmc+IHdoaWNoCi1jYW4gYW1lbmQgYW55IFhNTCBlbGVtZW50LiBJZiBpdCBpcyBwcmVzZW50IGluIGFuIGVsZW1lbnQsIGl0IGlkZW50aWZpZXMgdGhlCi1uYW1lc3BhY2UgZm9yIHRoaXMgZWxlbWVudC48L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIHhtbG5zIGF0dHJpYnV0ZSBoYXMgdGhlIGZvbGxvd2luZyBzeW50YXg6PC9wPgotPHA+PHNhbXAgY2xhc3M9ImNvZGVwaCI+eG1sbnM6PHZhciBjbGFzcz0idmFybmFtZSI+cHJlZml4PC92YXI+PW5hbWVzcGFjZTwvc2FtcD4gPC9wPgotPHA+d2hlcmUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+bmFtZXNwYWNlPC9zYW1wPiBpcyBhIHVuaXF1ZSBVUkkgKHN1Y2ggYXMgd3d3LmlibS5jb20pIGFuZCB3aGVyZSA8c2FtcCBjbGFzcz0iY29kZXBoIj48dmFyIGNsYXNzPSJ2YXJuYW1lIj5wcmVmaXg8L3Zhcj48L3NhbXA+IHJlcHJlc2VudHMKLXRoZSBuYW1lc3BhY2UgYW5kIHByb3ZpZGVzIGEgcG9pbnRlciB0byBpdC48L3A+Ci08cD5JbiB0aGUgZm9sbG93aW5nIGN1c3RvbWVyCi1lbGVtZW50IGRlZmluaXRpb24sIGFuIGFjY291bnRpbmcgbmFtZXNwYWNlIGlzIGRlZmluZWQgaW4gb3JkZXIgdG8gYmUgYWJsZQotdG8gZGlzdGluZ3Vpc2ggdGhlIGVsZW1lbnQgdGFncyBmcm9tIHRob3NlIGFwcGVhcmluZyBpbiBjdXN0b21lciByZWNvcmRzIGNyZWF0ZWQKLWJ5IG90aGVyIGJ1c2luZXNzIGFwcGxpY2F0aW9uczo8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDthY2N0OmN1c3RvbWVyIHhtbG5zOmFjY3Q9Imh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTAiJmd0OwotCSZsdDthY2N0Om5hbWUmZ3Q7Q29ycG9yYXRpb24mbHQ7L2FjY3Q6bmFtZSZndDsKLQkmbHQ7YWNjdDpvcmRlciBhY2N0OnJlZj0iNTU2NiIvJmd0OwotCSZsdDthY2N0OnN0YXR1cyZndDtpbnZvaWNlJmx0Oy9hY2N0OnN0YXR1cyZndDsKLSZsdDsvYWNjdDpjdXN0b21lciZndDsgIDwvcHJlPgotIDwvZGl2PgotPHA+VGhlIG5hbWVzcGFjZSBkZWZpbml0aW9uIGluIHRoZSBmaXJzdAotbGluZSBhc3NpZ25zIHRoZSBuYW1lc3BhY2UgaHR0cDovL3d3dy5teS5jb20vYWNjdC1SRVYxMCB0byB0aGUgcHJlZml4LiBUaGlzCi1wcmVmaXggaXMgdXNlZCBvbiB0aGUgZWxlbWVudCBuYW1lcyBzdWNoIGFzIG5hbWUgaW4gb3JkZXIgdG8gYXR0YWNoIHRoZW0gdG8KLXRoZSBuYW1lc3BhY2UuIEEgc2Vjb25kIGFwcGxpY2F0aW9uLCBmb3IgZXhhbXBsZSwgYSBmdWxmaWxsbWVudCBzeXN0ZW0sIGNhbgotYXNzaWduIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0byBpdHMgY3VzdG9tZXIgZWxlbWVudHM6PC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7ZnVsOmN1c3RvbWVyIHhtbG5zOmZ1bD0iaHR0cDovL3d3dy55b3VyLmNvbS9mdWwiJmd0OwotCSZsdDtmdWw6bmFtZSZndDtDb3Jwb3JhdGlvbiZsdDsvZnVsOm5hbWUmZ3Q7Ci0JJmx0O2Z1bDpvcmRlciBmdWw6cmVmPSJBOTg3NTYiLyZndDsKLQkmbHQ7ZnVsOnN0YXR1cyZndDtzaGlwcGVkJmx0Oy9mdWw6c3RhdHVzJmd0OwotICZsdDsvZnVsOmN1c3RvbWVyJmd0OzwvcHJlPgotIDwvZGl2PgotPHA+QW4gYXBwbGljYXRpb24gcHJvY2Vzc2luZyBib3RoIGRhdGEKLXN0cnVjdHVyZXMgaXMgbm93IGFibGUgdG8gdHJlYXQgdGhlIGFjY291bnRpbmcgYW5kIHRoZSBmdWxmaWxsbWVudCBkYXRhIGRpZmZlcmVudGx5LgotVGhlcmUgaXMgYSBkZWZhdWx0IG5hbWVzcGFjZS4gSXQgaXMgc2V0IGlmIG5vIGxvY2FsIG5hbWUgaXMgYXNzaWduZWQgaW4gdGhlCi1uYW1lc3BhY2UgZGVmaW5pdGlvbjo8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDthY2N0OmN1c3RvbWVyIHhtbG5zPSJodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwIiB4bWxuczphY2N0PSJodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwICImZ3Q7Ci0mbHQ7bmFtZSZndDtDb3Jwb3JhdGlvbiZsdDsvbmFtZSZndDsKLSZsdDtvcmRlciBhY2N0OnJlZj0iNTU2NiIvJmd0OwotJmx0O3N0YXR1cyZndDtpbnZvaWNlJmx0Oy9zdGF0dXMmZ3Q7Ci0mbHQ7L2N1c3RvbWVyJmd0OzwvcHJlPgotPC9kaXY+Ci08cD5JbiB0aGlzIGV4YW1wbGUsIGFsbCB0YWdzIGluIHRoZSBjdXN0b21lcgotcmVjb3JkIGFyZSBxdWFsaWZpZWQgdG8gcmVzaWRlIGluIHRoZSBuYW1lc3BhY2UgaHR0cDovL3d3dy5teS5jb20vYWNjdC1SRVYxMC4KLU5vIGV4cGxpY2l0IHByZWZpeCBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgaXMgdXNlZC4gTm90ZSB0aGF0Ci10aGUgZGVmYXVsdCBuYW1lc3BhY2UgYXBwbGllcyB0byBhbnkgYXR0cmlidXRlcyBkZWZpbml0aW9ucy48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlhNTCBzY2hlbWFzIGFuZCBuYW1lc3BhY2VzPC9oND48cD5JbiB0aGUgZm9sbG93aW5nIFhNTAotc2NoZW1hLCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgZm9yIHRoZSBzY2hlbWEgaXMgZGVmaW5lZCBhcyB0aGUgc3RhbmRhcmQgWE1MCi1zY2hlbWEgbmFtZXNwYWNlIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hOyB0aGVyZSBpcyBhbHNvIGEgc2NoZW1hCi1zcGVjaWZpYyBuYW1lc3BhY2UgaHR0cDovL3d3dy5pYm0uY29tLjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOlRlc3RTY2hlbWE9Imh0dHA6Ly93d3cuaWJtLmNvbSImZ3Q7Ci0gJmx0O3NpbXBsZVR5cGUgbmFtZT0iWmlwQ29kZVR5cGUiJmd0OwotICZsdDtyZXN0cmljdGlvbiBiYXNlPSJpbnRlZ2VyIiZndDsKLSAgJmx0O21pbkluY2x1c2l2ZSB2YWx1ZT0iMTAwMDAiLyZndDsKLSAmbHQ7bWF4SW5jbHVzaXZlIHZhbHVlPSI5OTk5OSIvJmd0OwotJmx0Oy9yZXN0cmljdGlvbiZndDsKLSAmbHQ7L3NpbXBsZVR5cGUmZ3Q7IAotICZsdDshLS1lbGVtZW50IGRlZmluaXRpb25zIHNraXBwZWQgLS0mZ3Q7ICAKLSZsdDsvc2NoZW1hJmd0OyAgPC9wcmU+Ci08L2Rpdj4KLTxwPkFzc3VtaW5nIHRoYXQgdGhlIHByZWNlZGluZyBYTUwgc2NoZW1hIGlzCi1zYXZlZCBhcyA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPkM6XHRlbXBcVGVzdFNjaGVtYS54c2Q8L3NwYW4+LCBhIHNhbXBsZSBYTUwgZmlsZSB0aGF0Ci12YWxpZGF0ZXMgYWdhaW5zdCB0aGlzIHNjaGVtYSBpczo8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3g6YWRkcmVzc0xpc3QgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gZmlsZTovLy9DOi90ZW1wL1Rlc3RTY2hlbWEueHNkIiZndDsKLSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBmaWxlOi8vL0M6L3RlbXAvVGVzdFNjaGVtYS54c2QiJmd0OwotJmx0O3g6YWRkcmVzcyZndDsKLSAmbHQ7eDpzdHJlZXQmZ3Q7eDpWYW5nZXJvd3N0cmFzc2UmbHQ7L3g6c3RyZWV0Jmd0OwotICAmbHQ7eDp6aXBDb2RlJmd0OzY5MTE1Jmx0Oy94OnppcENvZGUmZ3Q7Ci0gJmx0O3g6Y2l0eSZndDt4OkhlaWRlbGJlcmcmbHQ7L3g6Y2l0eSZndDsKLSAmbHQ7L3g6YWRkcmVzcyZndDsKLSAgICAmbHQ7eDphZGRyZXNzJmd0OyAKLSZsdDt4OnN0cmVldCZndDt4OkJlcm5hbCBSb2FkJmx0Oy94OnN0cmVldCZndDsgCi0mbHQ7eDp6aXBDb2RlJmd0OzkwMzc1Jmx0Oy94OnppcENvZGUmZ3Q7Ci0gICAgICZsdDt4OmNpdHkmZ3Q7eDpTYW4gSm9zZSZsdDsveDpjaXR5Jmd0OwotICZsdDsveDphZGRyZXNzJmd0OwotJmx0Oy94OmFkZHJlc3NMaXN0Jmd0OyA8L3ByZT4KLTwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5UYXJnZXQgbmFtZXNwYWNlPC9oND48cD4gVGhlIHRhcmdldCBuYW1lc3BhY2Ugc2VydmVzIHRvCi1pZGVudGlmeSB0aGUgbmFtZXNwYWNlIHdpdGhpbiB3aGljaCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgZWxlbWVudCBhbmQKLWl0cyBuYW1lIGV4aXN0cy4gSW4gdGhlIGNhc2Ugb2YgZGVjbGFyYXRpb25zLCB0aGlzIGFzc29jaWF0aW9uIGRldGVybWluZXMKLXRoZSBuYW1lc3BhY2Ugb2YgdGhlIGVsZW1lbnRzIGluIFhNTCBmaWxlcyBjb25mb3JtaW5nIHRvIHRoZSBzY2hlbWEuIEFuIFhNTAotZmlsZSBpbXBvcnRpbmcgYSBzY2hlbWEgbXVzdCByZWZlcmVuY2UgaXRzIHRhcmdldCBuYW1lc3BhY2UgaW4gdGhlIHNjaGVtYUxvY2F0aW9uCi1hdHRyaWJ1dGUuIEFueSBtaXNtYXRjaGVzIGJldHdlZW4gdGhlIHRhcmdldCBhbmQgdGhlIGFjdHVhbCBuYW1lc3BhY2Ugb2YgYW4KLWVsZW1lbnQgYXJlIHJlcG9ydGVkIGFzIHNjaGVtYSB2YWxpZGF0aW9uIGVycm9ycy4gSW4gb3VyIGV4YW1wbGUsIHRoZSB0YXJnZXQKLW5hbWVzcGFjZSBpcyBodHRwOi8vd3d3LmlibS5jb207IGl0IGlzIGRlZmluZWQgaW4gdGhlICBYTUwgc2NoZW1hIGZpbGUgYW5kCi1yZWZlcmVuY2VkIHR3aWNlIGluIHRoZSBYTUwgZmlsZS4gQW55IG1pc21hdGNoIGJldHdlZW4gdGhlc2UgdGhyZWUgb2NjdXJyZW5jZXMKLW9mIHRoZSBuYW1lc3BhY2UgbGVhZCB0byB2YWxpZGF0aW9uIGVycm9ycy48L3A+Ci08cD4gVGhlIGZvbGxvd2luZyBleGFtcGxlcwotc2hvdyBob3cgdGFyZ2V0IG5hbWVzcGFjZXMgYW5kIG5hbWVzcGFjZSBwcmVmaXhlcyB3b3JrIGluIFhNTCBzY2hlbWFzIGFuZAotdGhlaXIgY29ycmVzcG9uZGluZyBYTUwgaW5zdGFuY2UgZG9jdW1lbnRzLjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2FtcGxlIDEgLSBBIHNjaGVtYSB3aXRoIGJvdGggYSBkZWZhdWx0IGFuZCB0YXJnZXQgbmFtZXNwYWNlCi1hbmQgdW5xdWFsaWZpZWQgbG9jYWxzPC9oND48cD5UaGUgWE1MIHNjaGVtYTogIDwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSImZ3Q7Ci0mbHQ7Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiJmd0OwotJmx0O3NlcXVlbmNlJmd0OwotJmx0O2VsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiZndDsmbHQ7L2VsZW1lbnQmZ3Q7Ci0mbHQ7L3NlcXVlbmNlJmd0OwotJmx0Oy9jb21wbGV4VHlwZSZndDsKLSZsdDtlbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0ieDpBZGRyZXNzVHlwZSImZ3Q7Jmx0Oy9lbGVtZW50Jmd0OwotJmx0Oy9zY2hlbWEmZ3Q7IDwvcHJlPgotIDwvZGl2PgotPHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZCBmcm9tCi10aGlzIHNjaGVtYSBsb29rcyBsaWtlIHRoaXMuIExvY2FsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGFyZSB1bnF1YWxpZmllZC48L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3g6TXlBZGRyZXNzIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20geC54c2QgIiZndDsKLSZsdDtuYW1lJmd0O1BldGVyIFNtaXRoJmx0Oy9uYW1lJmd0OwotJmx0Oy94Ok15QWRkcmVzcyZndDsgPC9wcmU+Ci08L2Rpdj4KLTxwPldoZW4gbG9jYWwgZWxlbWVudHMgKHN1Y2ggYXMgdGhlICJuYW1lIgotZWxlbWVudCkgYW5kIGF0dHJpYnV0ZXMgYXJlIHVucXVhbGlmaWVkIGluIGFuIFhNTCBmaWxlLCB0aGVuIG9ubHkgdGhlIHJvb3QKLWVsZW1lbnQgaXMgcXVhbGlmaWVkLiBTbywgaW4gdGhpcyBleGFtcGxlLCB0aGUgIngiIG5hbWVzcGFjZSBwcmVmaXggaXMgYXNzaWduZWQKLXRvIHRoZSByb290IGVsZW1lbnQgIk15QWRkcmVzcyIsIGFzc29jaWF0aW5nIGl0IHdpdGggdGhlIG5hbWVzcGFjZSAiaHR0cDovL3d3dy5pYm0uY29tIiwKLWJ1dCB0aGUieCIgcHJlZml4IGlzIG5vdCBhc3NpZ25lZCB0byB0aGUgbG9jYWwgZWxlbWVudCAibmFtZSIuPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TYW1wbGUgMiAtIEEgc2NoZW1hIHdpdGggYm90aCBhIGRlZmF1bHQgYW5kIHRhcmdldCBuYW1lc3BhY2UKLWFuZCBxdWFsaWZpZWQgbG9jYWxzPC9oND48ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3NjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiZndDsKLSZsdDtjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSImZ3Q7Ci0mbHQ7c2VxdWVuY2UmZ3Q7Ci0mbHQ7ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciJmd0OyZsdDsvZWxlbWVudCZndDsKLSZsdDsvc2VxdWVuY2UmZ3Q7Ci0mbHQ7L2NvbXBsZXhUeXBlJmd0OwotJmx0O2VsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJ4OkFkZHJlc3NUeXBlIiZndDsmbHQ7L2VsZW1lbnQmZ3Q7Ci0gJmx0Oy9zY2hlbWEmZ3Q7ICA8L3ByZT4KLTwvZGl2PgotPHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZCBmcm9tCi10aGlzIHNjaGVtYSBsb29rcyBsaWtlIHRoaXMuIExvY2FsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGFyZSBxdWFsaWZpZWQgVGhpcwotaXMgYmVjYXVzZSB0aGUgZWxlbWVudEZvcm1EZWZhdWx0IGF0dHJpYnV0ZSBpcyBzZXQgdG8gcXVhbGlmaWVkIGluIHRoZSBYTUwKLXNjaGVtYS48L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotICAmbHQ7eDpNeUFkZHJlc3MgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHgueHNkICImZ3Q7IAotJmx0O3g6bmFtZSZndDtQZXRlciBTbWl0aCZsdDsveDpuYW1lJmd0OwotICZsdDsveDpNeUFkZHJlc3MmZ3Q7PC9wcmU+Ci0gPC9kaXY+Ci08cD5JbiB0aGlzIGV4YW1wbGUsIHRoZSAieCIgbmFtZXNwYWNlIHByZWZpeAotaXMgYXNzaWduZWQgdG8gYm90aCB0aGUgcm9vdCBlbGVtZW50ICJNeUFkZHJlc3MiIGFuZCB0aGUgbG9jYWwgZWxlbWVudCAibmFtZSIsCi1hc3NvY2lhdGluZyB0aGVtIHdpdGggdGhlIG5hbWVzcGFjZSAiaHR0cDovL3d3dy5pYm0uY29tIiwuPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TYW1wbGUgMyAtIFNjaGVtYSB3aXRoIHRhcmdldCBOYW1lc3BhY2UsIGFuZCBleHBsaWNpdGx5IGRlZmluZXMKLXhtbG5zOnhzZDwvaDQ+PHA+VGhpcyBYTUwgc2NoZW1hIGFkZHMgdGhpcyBhdHRyaWJ1dGU6ICA8L3A+Ci08c2FtcCBjbGFzcz0iY29kZXBoIj54bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIDwvc2FtcD48cD5XaGF0Ci10aGlzIG1lYW5zIGlzIHRoYXQgZWFjaCBvZiB0aGUgY29uc3RydWN0cyB0aGF0IGFyZSBkZWZpbmVkIGJ5IHRoZSBYTUwgc2NoZW1hCi1sYW5ndWFnZSB3aWxsIG5lZWQgdG8gYmUgcXVhbGlmaWVkIHdpdGggdGhlICJ4c2QiIHByZWZpeC4gRm9yIGV4YW1wbGUsIHhzZDpjb21wbGV4VHlwZQotYW5kICB4c2Q6c3RyaW5nPC9wPgotPHA+LiBOb3RlIHRoYXQgeW91IGNhbiBjaG9zZSBhbnkgb3RoZXIgcHJlZml4ZXMgc3VjaCBhcwotInhzIiBvciAiZm9vYmFyIiBpbiB5b3VyIGRlY2xhcmF0aW9uIGFuZCB1c2FnZS48L3A+Ci08cD5Zb3UgY2FuIHNwZWNpZnkgdGhpcwotcHJlZml4IGluIHRoZSBYTUwgc2NoZW1hIHByZWZlcmVuY2VzIHBhZ2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0bwotdGhlIHJlbGF0ZWQgdGFza3MuPC9wPgotPHA+QWxsIHVzZXIgZGVmaW5lZCB0eXBlcyBiZWxvbmcgdG8gdGhlIG5hbWVzcGFjZSAgaHR0cDovL3d3dy5pYm0uY29tCi1hcyBkZWZpbmVkIGJ5IHRoZSB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlLCBhbmQgdGhlIHByZWZpeCBpcyAieCIgYXMgZGVmaW5lZAotYnkgdGhlIHhtbG5zOnggYXR0cmlidXRlLjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiZndDsKLSZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiJmd0OwotJmx0O3hzZDpzZXF1ZW5jZSZndDsKLQkJICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiZndDsmbHQ7L3hzZDplbGVtZW50Jmd0OwotJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7Ci0gJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7Ci0gJmx0O3hzZDplbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0ieDpBZGRyZXNzVHlwZSImZ3Q7Jmx0Oy94c2Q6ZWxlbWVudCZndDsKLSZsdDsveHNkOnNjaGVtYSZndDs8L3ByZT4KLSA8L2Rpdj4KLTxwPkEgdmFsaWQgWE1MIGluc3RhbmNlIGRvY3VtZW50IGNyZWF0ZWQKLWZyb20gdGhpcyBzY2hlbWEgbG9va3MgbGlrZSB0aGlzLiBMb2NhbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBhcmUgdW5xdWFsaWZpZWQuCi1UaGUgc2VtYW50aWNzIG9mIHF1YWxpZmljYXRpb24gaXMgdGhlIHNhbWUgYXMgU2FtcGxlIDEuPC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSAmbHQ7eDpNeUFkZHJlc3MgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlInhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHgueHNkICImZ3Q7Ci0mbHQ7bmFtZSZndDtQZXRlciBTbWl0aCZsdDsvbmFtZSZndDsKLSAmbHQ7L3g6TXlBZGRyZXNzJmd0OzwvcHJlPgotPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlNhbXBsZSA0IC0gU2NoZW1hIHdpdGggdW5kZWNsYXJlZCB0YXJnZXQgTmFtZXNwYWNlIHRoYXQgZXhwbGljaXRseQotZGVmaW5lcyB4bWxuczp4c2Q8L2g0PjxwPlRoaXMgWE1MIHNjaGVtYSBoYXMgbm8gdGFyZ2V0IG5hbWVzcGFjZSBmb3IgaXRzZWxmLgotSW4gdGhpcyBjYXNlLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCBhbGwgWE1MIHNjaGVtYSBjb25zdHJ1Y3RzIGJlIGV4cGxpY2l0bHkKLXF1YWxpZmllZCB3aXRoIGEgcHJlZml4IHN1Y2ggYXMgInhzZCIuIFRoZSBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20KLXRoaXMgc2NoZW1hIHN1Y2ggYXMgQWRkcmVzc1R5cGUgYXJlIHJlZmVyZW5jZWQgd2l0aG91dCBuYW1lc3BhY2UgcXVhbGlmaWNhdGlvbgotc2luY2UgdGhlcmUgaXMgbm8gbmFtZXNwYWNlIHByZWZpeC4gIDwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiZndDsKLSZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiJmd0OwotJmx0O3hzZDpzZXF1ZW5jZSZndDsKLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiZndDsmbHQ7L3hzZDplbGVtZW50Jmd0OwotJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciJmd0OyZsdDsveHNkOmVsZW1lbnQmZ3Q7Ci0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyImZ3Q7Jmx0Oy94c2Q6ZWxlbWVudCZndDsgCi0mbHQ7L3hzZDpzZXF1ZW5jZSZndDsgCi0mbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9IkFkZHJlc3NUeXBlIiZndDsmbHQ7L3hzZDplbGVtZW50Jmd0OyAKLSZsdDsveHNkOnNjaGVtYSZndDsgPC9wcmU+Ci08L2Rpdj4KLTxwPkEgdmFsaWQgWE1MIGluc3RhbmNlIGRvY3VtZW50IGNyZWF0ZWQKLWZyb20gdGhlIHNjaGVtYSBsb29rcyBsaWtlIHRoaXMuIEFsbCBlbGVtZW50cyBhcmUgdW5xdWFsaWZpZWQuPC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSZsdDtNeUFkZHJlc3MgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IngueHNkIiZndDsKLSZsdDtuYW1lJmd0O25hbWUmbHQ7L25hbWUmZ3Q7Ci0mbHQ7L015QWRkcmVzcyZndDs8L3ByZT4KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlNhbXBsZSA1IC0gQSBzY2hlbWEgd2hlcmUgdGhlIHRhcmdldCBuYW1lc3BhY2UgaXMgdGhlIGRlZmF1bHQKLW5hbWVzcGFjZTwvaDQ+PHA+VGhpcyBpcyBhbiBYTUwgc2NoZW1hIHdoZXJlIHRoZSB0YXJnZXQgbmFtZXNwYWNlIGlzIHRoZQotZGVmYXVsdCBuYW1lc3BhY2UuIEFzIHdlbGwsIHRoZSBuYW1lc3BhY2UgaGFzIG5vIG5hbWVzcGFjZSBwcmVmaXguPC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSAmbHQ7eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM9Imh0dHA6Ly93d3cuaWJtLmNvbSImZ3Q7Ci0mbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NUeXBlIiZndDsKLSZsdDt4c2Q6c2VxdWVuY2UmZ3Q7Ci0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyImZ3Q7Jmx0Oy94c2Q6ZWxlbWVudCZndDsKLSZsdDsveHNkOnNlcXVlbmNlJmd0OwotJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7Ci0gJmx0O3hzZDplbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0iQWRkcmVzc1R5cGUiJmd0OyZsdDsveHNkOmVsZW1lbnQmZ3Q7Ci0gJmx0Oy94c2Q6c2NoZW1hJmd0OyA8L3ByZT4KLSA8L2Rpdj4KLTxwPkEgdmFsaWQgWE1MIGluc3RhbmNlIGRvY3VtZW50IGNyZWF0ZWQKLWZyb20gdGhlIHNjaGVtYSBsb29rcyBsaWtlIHRoaXM6PC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Jmd0OwotJmx0O015QWRkcmVzcyB4bWxucz0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBOZXdYTUxTY2hlbWEueHNkIiZndDsKLSZsdDtuYW1lJmd0O25hbWUmbHQ7L25hbWUmZ3Q7Ci0gJmx0Oy9NeUFkZHJlc3MmZ3Q7ICA8L3ByZT4KLSA8L2Rpdj4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0cHJlZi5odG1sIiB0aXRsZT0iWW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgWE1MIHNjaGVtYSBmaWxlcyBzdWNoIGFzIHRoZSBkZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UgYW5kIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBwcmVmaXggdXNlZC4iPkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnJlZmludGcuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnJlZmludGcuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyYjMwMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JyZWZpbnRnLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIg0KLSAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0icnJlZmludGciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3I8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlJlZmVyZW50aWFsIGludGVncml0eTwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGUgWE1MIHNjaGVtYSBlZGl0b3IgaGFzIGEgYnVpbHQtaW4gbWVjaGFuaXNtIHRvIGhhbmRsZSByZWZlcmVudGlhbA0KLWludGVncml0eSBpc3N1ZXMuIFdoZW4geW91IGRlbGV0ZSBjZXJ0YWluIG5vZGVzLCBjbGVhbiB1cCBmb3IgYW55IG5vZGVzIGFmZmVjdGVkDQotd2lsbCBhdXRvbWF0aWNhbGx5IG9jY3VyLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5yZWZlcmVudGlhbCBpbnRlZ3JpdHk8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5jbGVhbiB1cCBpbjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08cmVmYm9keT4NCi08c2VjdGlvbj5XaGVuIHlvdSBkZWZpbmUgYSBjb21wbGV4IHR5cGUsIHlvdSBjYW4gYWRkIGEgY29udGVudCBtb2RlbCB0byBpdA0KLWFuZCByZWZlcmVuY2UgYSBnbG9iYWwgZWxlbWVudC4gPHA+Rm9yIGV4YW1wbGU6PGNvZGVibG9jaz4mbHQ7c2NoZW1hPg0KLSAmbHQ7ZWxlbWVudCBuYW1lPSJjb21tZW50IiB0eXBlPSJzdHJpbmciPg0KLQkmbHQ7Y29tcGxleFR5cGUgbmFtZT0iSXRlbXMiPg0KLQkJJmx0O3NlcXVlbmNlPg0KLTw/UHViIENhcmV0Pz4JCQkJJmx0O2VsZW1lbnQgcmVmPSJjb21tZW50Ij4NCi0JCSAmbHQ7L3NlcXVlbmNlPg0KLQkgJmx0Oy9jb21wbGV4VHlwZT4NCi0mbHQ7L3NjaGVtYT48L2NvZGVibG9jaz48L3A+PHA+SWYgdGhlIGdsb2JhbCBlbGVtZW50IChjb21tZW50KSB3YXMgZGVsZXRlZCwNCi1hbGwgcmVmZXJlbmNlcyB0byBpdCB3b3VsZCBiZSBpbiBlcnJvci4gSG93ZXZlciwgd2hlbiB5b3UgZGVsZXRlIHRoZSBnbG9iYWwNCi1lbGVtZW50LCB0aGUgWE1MIHNjaGVtYSBlZGl0b3Igd2lsbCBjbGVhbiB1cCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTo8L3A+PHVsPg0KLTxsaT5JZiB0aGVyZSBhcmUgb25lIG9yIG1vcmUgZ2xvYmFsIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEsIGl0IHdpbGwgY2hhbmdlDQotYWxsIGV4aXN0aW5nIHJlZmVyZW5jZXMgdG8gdGhlIGZpcnN0IGdsb2JhbCBlbGVtZW50LjwvbGk+DQotPGxpPklmIHRoZXJlIGlzIG5vIGdsb2JhbCBlbGVtZW50LCB0aGVuIGl0IHdpbGwgZGVsZXRlIHRoZSBlbGVtZW50IHJlZmVyZW5jZQ0KLWZyb20gdGhlIGNvbnRlbnQgbW9kZWwuPC9saT4NCi08L3VsPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+RGVsZXRpbmcgaW5jbHVkZWQgYW5kIGltcG9ydGVkIHNjaGVtYTwvdGl0bGU+PHA+SWYgYW4gaW5jbHVkZWQNCi1vciBpbXBvcnRlZCBzY2hlbWEgaXMgZGVsZXRlZCwgeW91IG11c3QgbWFudWFsbHkgcmVzZXQgdGhlIGZvbGxvd2luZyB0eXBlDQotcmVmZXJlbmNlcyBhcyBhcHByb3ByaWF0ZTogPHVsPg0KLTxsaT5HbG9iYWwgZWxlbWVudCBhbmQgZWxlbWVudCdzIHR5cGUuPC9saT4NCi08bGk+QXR0cmlidXRlIHR5cGUuPC9saT4NCi08bGk+Q29tcGxleCB0eXBlIGRlcml2YXRpb24uPC9saT4NCi08bGk+U2ltcGxlIHR5cGUgZGVyaXZhdGlvbi48L2xpPg0KLTwvdWw+VGhleSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJlIHJlc2V0IGlmIGFuIGluY2x1ZGVkIG9yIGltcG9ydGVkIHNjaGVtYQ0KLWlzIGRlbGV0ZWQuPC9wPjwvc2VjdGlvbj4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQotPD9QdWIgKjAwMDAwMDIwNDY/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnJlZmludGcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnJlZmludGcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3YjQyZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JyZWZpbnRnLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIFhNTCBzY2hlbWEgZWRpdG9yIGhhcyBhIGJ1aWx0LWluIG1lY2hhbmlzbSB0byBoYW5kbGUgcmVmZXJlbnRpYWwgaW50ZWdyaXR5IGlzc3Vlcy4gV2hlbiB5b3UgZGVsZXRlIGNlcnRhaW4gbm9kZXMsIGNsZWFuIHVwIGZvciBhbnkgbm9kZXMgYWZmZWN0ZWQgd2lsbCBhdXRvbWF0aWNhbGx5IG9jY3VyLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgWE1MIHNjaGVtYSBlZGl0b3IgaGFzIGEgYnVpbHQtaW4gbWVjaGFuaXNtIHRvIGhhbmRsZSByZWZlcmVudGlhbCBpbnRlZ3JpdHkgaXNzdWVzLiBXaGVuIHlvdSBkZWxldGUgY2VydGFpbiBub2RlcywgY2xlYW4gdXAgZm9yIGFueSBub2RlcyBhZmZlY3RlZCB3aWxsIGF1dG9tYXRpY2FsbHkgb2NjdXIuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIHJlZmVyZW50aWFsIGludGVncml0eSwgY2xlYW4gdXAgaW4iIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgcmVmZXJlbnRpYWwgaW50ZWdyaXR5LCBjbGVhbiB1cCBpbiIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHNjaG0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RkZWxzY21wLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icnJlZmludGciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5SZWZlcmVudGlhbCBpbnRlZ3JpdHk8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJyZWZpbnRnIj48YSBuYW1lPSJycmVmaW50ZyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvcjwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlIFhNTCBzY2hlbWEgZWRpdG9yIGhhcyBhIGJ1aWx0LWluIG1lY2hhbmlzbSB0byBoYW5kbGUgcmVmZXJlbnRpYWwKLWludGVncml0eSBpc3N1ZXMuIFdoZW4geW91IGRlbGV0ZSBjZXJ0YWluIG5vZGVzLCBjbGVhbiB1cCBmb3IgYW55IG5vZGVzIGFmZmVjdGVkCi13aWxsIGF1dG9tYXRpY2FsbHkgb2NjdXIuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5XaGVuIHlvdSBkZWZpbmUgYSBjb21wbGV4IHR5cGUsIHlvdSBjYW4gYWRkIGEgY29udGVudCBtb2RlbCB0byBpdAotYW5kIHJlZmVyZW5jZSBhIGdsb2JhbCBlbGVtZW50LiA8ZGl2IGNsYXNzPSJwIj5Gb3IgZXhhbXBsZTo8cHJlPiZsdDtzY2hlbWEmZ3Q7Ci0gJmx0O2VsZW1lbnQgbmFtZT0iY29tbWVudCIgdHlwZT0ic3RyaW5nIiZndDsKLQkmbHQ7Y29tcGxleFR5cGUgbmFtZT0iSXRlbXMiJmd0OwotCQkmbHQ7c2VxdWVuY2UmZ3Q7Ci0JCQkJJmx0O2VsZW1lbnQgcmVmPSJjb21tZW50IiZndDsKLQkJICZsdDsvc2VxdWVuY2UmZ3Q7Ci0JICZsdDsvY29tcGxleFR5cGUmZ3Q7Ci0mbHQ7L3NjaGVtYSZndDs8L3ByZT4KLTwvZGl2PgotPHA+SWYgdGhlIGdsb2JhbCBlbGVtZW50IChjb21tZW50KSB3YXMgZGVsZXRlZCwKLWFsbCByZWZlcmVuY2VzIHRvIGl0IHdvdWxkIGJlIGluIGVycm9yLiBIb3dldmVyLCB3aGVuIHlvdSBkZWxldGUgdGhlIGdsb2JhbAotZWxlbWVudCwgdGhlIFhNTCBzY2hlbWEgZWRpdG9yIHdpbGwgY2xlYW4gdXAgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06PC9wPgotPHVsPgotPGxpPklmIHRoZXJlIGFyZSBvbmUgb3IgbW9yZSBnbG9iYWwgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSwgaXQgd2lsbCBjaGFuZ2UKLWFsbCBleGlzdGluZyByZWZlcmVuY2VzIHRvIHRoZSBmaXJzdCBnbG9iYWwgZWxlbWVudC48L2xpPgotCi08bGk+SWYgdGhlcmUgaXMgbm8gZ2xvYmFsIGVsZW1lbnQsIHRoZW4gaXQgd2lsbCBkZWxldGUgdGhlIGVsZW1lbnQgcmVmZXJlbmNlCi1mcm9tIHRoZSBjb250ZW50IG1vZGVsLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkRlbGV0aW5nIGluY2x1ZGVkIGFuZCBpbXBvcnRlZCBzY2hlbWE8L2g0PjxkaXYgY2xhc3M9InAiPklmIGFuIGluY2x1ZGVkCi1vciBpbXBvcnRlZCBzY2hlbWEgaXMgZGVsZXRlZCwgeW91IG11c3QgbWFudWFsbHkgcmVzZXQgdGhlIGZvbGxvd2luZyB0eXBlCi1yZWZlcmVuY2VzIGFzIGFwcHJvcHJpYXRlOiA8dWw+Ci08bGk+R2xvYmFsIGVsZW1lbnQgYW5kIGVsZW1lbnQncyB0eXBlLjwvbGk+Ci0KLTxsaT5BdHRyaWJ1dGUgdHlwZS48L2xpPgotCi08bGk+Q29tcGxleCB0eXBlIGRlcml2YXRpb24uPC9saT4KLQotPGxpPlNpbXBsZSB0eXBlIGRlcml2YXRpb24uPC9saT4KLQotPC91bD4KLVRoZXkgd2lsbCBub3QgYXV0b21hdGljYWxseSBiZSByZXNldCBpZiBhbiBpbmNsdWRlZCBvciBpbXBvcnRlZCBzY2hlbWEKLWlzIGRlbGV0ZWQuPC9kaXY+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbHNjZWQuaHRtbCIgdGl0bGU9IlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhbiBYTUwgc2NoZW1hIGVkaXRvciBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsIGFuZCB2YWxpZGF0aW5nIFhNTCBzY2hlbWFzLiBYTUwgc2NoZW1hcyBhcmUgYSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiI+WE1MIHNjaGVtYSBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRzY2htLmh0bWwiIHRpdGxlPSJBZnRlciB5b3UgY3JlYXRlIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gZWRpdCBpdHMgdmFyaW91cyBwcm9wZXJ0aWVzLCBzdWNoIGFzIGl0cyBuYW1lc3BhY2UgYW5kIHByZWZpeC4iPkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGRlbHNjbXAuaHRtbCIgdGl0bGU9IklmIHlvdSBoYXZlIGNyZWF0ZWQgYW55IFhNTCBzY2hlbWEgY29tcG9uZW50cyB5b3Ugbm8gbG9uZ2VyIG5lZWQsIHlvdSBjYW4gZGVsZXRlIHRoZW0uIj5EZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeHNkaWNvbnMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhzZGljb25zLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZGVhMzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeHNkaWNvbnMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIg0KLSAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0icmljb25zIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5JY29ucyB1c2VkIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+WE1MIHNjaGVtYSBlZGl0b3IgaWNvbnM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhlIGZvbGxvd2luZyBYTUwgc2NoZW1hIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUsIERlc2lnbiwNCi1hbmQgUHJvcGVydGllcyB2aWV3Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5pY29uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08cmVmYm9keT4NCi08c2VjdGlvbj48L3NlY3Rpb24+DQotPHRhYmxlPg0KLTx0Z3JvdXAgY29scz0iMiI+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzAiLz48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMSIvPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCIgdmFsaWduPSJib3R0b20iPjxiPkljb248L2I+PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzEiIHZhbGlnbj0iYm90dG9tIj48Yj5EZXNjcmlwdGlvbjwvYj48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQW55QXR0cmlidXRlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlDQotYW55IGF0dHJpYnV0ZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+PGNvZGVwaD5hbnk8L2NvZGVwaD4gYXR0cmlidXRlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREFueS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBhbnkgZWxlbWVudA0KLWljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT48Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREF0dHJpYnV0ZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBhdHRyaWJ1dGUNCi1pY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+YXR0cmlidXRlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREF0dHJpYnV0ZUdyb3VwLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMNCi10aGUgYXR0cmlidXRlIGdyb3VwIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5hdHRyaWJ1dGUgZ3JvdXA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYw0KLWlzIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5hdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREF0dHJpYnV0ZVJlZi5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLWF0dHJpYnV0ZSByZWZlcmVuY2UgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmF0dHJpYnV0ZSByZWZlcmVuY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQWxsLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGNvbnRlbnQNCi1tb2RlbCAtIGFsbCBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+Y29udGVudCBtb2RlbCAtIGFsbDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQ2hvaWNlLmdpZiI+PGFsdD5UaGlzDQotZ3JhcGhpYyBpcyB0aGUgY29udGVudCBtb2RlbCAtIGNob2ljZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzEiPmNvbnRlbnQgbW9kZWwgLSBjaG9pY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZiI+PGFsdD5UaGlzDQotZ3JhcGhpYyBpcyB0aGUgY29udGVudCBtb2RlbCAtIHNlcXVlbmNlIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSI+Y29udGVudCBtb2RlbCAtIHNlcXVlbmNlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRENvbXBsZXhUeXBlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlDQotYW55IGVsZW1lbnQgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNvbXBsZXggdHlwZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RFbGVtZW50LmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGVsZW1lbnQNCi1pY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+ZWxlbWVudDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RFbGVtZW50UmVmLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlDQotZWxlbWVudCByZWZlcmVuY2UgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmVsZW1lbnQgcmVmZXJlbmNlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRFNpbXBsZUVudW0uZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1lbnVtZXJhdGlvbiBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+ZW51bWVyYXRpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNER2xvYmFsQXR0cmlidXRlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMNCi10aGUgZ2xvYmFsIGF0dHJpYnV0ZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+Z2xvYmFsIGF0dHJpYnV0ZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNER2xvYmFsRWxlbWVudC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzDQotdGhlIGdsb2JhbCBlbGVtZW50IGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5nbG9iYWwgZWxlbWVudDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNER3JvdXAuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgZ3JvdXANCi1pY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+Z3JvdXA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNER3JvdXBSZWYuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgZ3JvdXANCi1yZWZlcmVuY2UgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5Pmdyb3VwIHJlZmVyZW5jZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RJbXBvcnQuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgaW1wb3J0DQotaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmltcG9ydDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RJbmNsdWRlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGluY2x1ZGUNCi1pY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+aW5jbHVkZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RTaW1wbGVQYXR0ZXJuLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlDQotcGF0dGVybiBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+cGF0dGVybjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RSZWRlZmluZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSByZWRlZmluZQ0KLWljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5yZWRlZmluZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RTaW1wbGVUeXBlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlDQotc2ltcGxlIHR5cGUgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PnNpbXBsZSB0eXBlPC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KLTw/UHViICowMDAwMDA0NTgxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4c2RpY29ucy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeHNkaWNvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjY2UwMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4c2RpY29ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIGZvbGxvd2luZyBYTUwgc2NoZW1hIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUsIERlc2lnbiwgYW5kIFByb3BlcnRpZXMgdmlldy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIGZvbGxvd2luZyBYTUwgc2NoZW1hIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUsIERlc2lnbiwgYW5kIFByb3BlcnRpZXMgdmlldy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgaWNvbnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgaWNvbnMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJpY29ucyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlhNTCBzY2hlbWEgZWRpdG9yIGljb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyaWNvbnMiPjxhIG5hbWU9InJpY29ucyI+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+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhZ3JwLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhZ3JwLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjE1MTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYWdycC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA4LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGFkZGFncnAiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgYXR0cmlidXRlIGdyb3Vwczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BbiBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbiBpcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuDQotYSBuYW1lIGFuZCBhIHNldCBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLiBOYW1lZCBncm91cHMgb2YgYXR0cmlidXRlDQotZGVjbGFyYXRpb25zIGNhbiBncmVhdGx5IGZhY2lsaXRhdGUgdGhlIG1haW50ZW5hbmNlIGFuZCByZXVzZSBvZiBjb21tb24NCi1hdHRyaWJ1dGUgZGVjbGFyYXRpb25zIGluIGFuIFhNTCBzY2hlbWEuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmF0dHJpYnV0ZSBncm91cHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmF0dHJpYnV0ZSBncm91cHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWFkZCBhbiBhdHRyaWJ1dGUgZ3JvdXAgdG8gYW4gWE1MIHNjaGVtYSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayB0aGUgPHVpY29udHJvbD5BdHRyaWJ1dGVzPC91aWNvbnRyb2w+IGZvbGRlcg0KLWFuZCBjbGljayAgPHVpY29udHJvbD5BZGQgQXR0cmlidXRlIEdyb3VwPC91aWNvbnRyb2w+LiA8L2NtZD48aW5mbz5JdA0KLWFwcGVhcnMgaW4gdGhlIDx1aWNvbnRyb2w+QXR0cmlidXRlczwvdWljb250cm9sPiBmb2xkZXIuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB5b3VyIG5ldyBncm91cCwgYW5kIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sNCi10aGUgYXR0cmlidXRlIGdyb3VwIGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+UmVmYWN0b3I8L3VpY29udHJvbD4NCi08dWljb250cm9sPlJlbmFtZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LiBJbiB0aGUgPHVpY29udHJvbD5OZXcNCi1OYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlIGEgbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZSBncm91cCBhbmQgY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBhZGQgYW4gYXR0cmlidXRlLCByaWdodC1jbGljayB5b3VyIGF0dHJpYnV0ZSBncm91cCBpbg0KLXRoZSBPdXRsaW5lIHZpZXcsIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEF0dHJpYnV0ZTwvdWljb250cm9sPi4gPC9jbWQ+DQotPGluZm8+VGhlIGF0dHJpYnV0ZSBhcHBlYXJzIGJlbG93IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgaW4gdGhlIE91dGxpbmUNCi12aWV3LjwvaW5mbz4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgdGhlIGF0dHJpYnV0ZSwgYW5kIGluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sNCi10aGUgY3VycmVudCAoZGVmYXVsdCkgbmFtZSBvZiB0aGUgYXR0cmlidXRlLCB0aGVuIHR5cGUgdGhlIG5ldyA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCBjbGljayB0aGUgY3VycmVudCAoZGVmYXVsdCkgYXR0cmlidXRlDQotdHlwZSBhbmQgc2VsZWN0IGEgdHlwZSBmcm9tIHRoZSBtZW51LiBBbHRlcm5hdGVseSwgeW91IGNhbiBzZWxlY3QNCi1icm93c2UgdG8gaW52b2tlIHRoZSBTZXQgVHlwZSBtZW51IGZvciBtb3JlIG9wdGlvbnMuIDwvY21kPjxpbmZvPlRoZQ0KLVNldCBUeXBlIGRpYWxvZyBsaXN0cyBhbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkNCi1hdmFpbGFibGUuIFlvdSBjYW4gY2hhbmdlIHRoZSA8dWljb250cm9sPlNjb3BlPC91aWNvbnRyb2w+IG9mIHRoZQ0KLWxpc3QgYnkgc2VsZWN0aW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPg0KLTxsaT48dWljb250cm9sPldvcmtzcGFjZTwvdWljb250cm9sPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUNCi1pbiB5b3VyIHdvcmtzcGFjZS4gPC9saT4NCi08bGk+PHVpY29udHJvbD5FbmNsb3NpbmcgUHJvamVjdDwvdWljb250cm9sPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcw0KLWF2YWlsYWJsZSBpbiB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHlvdXIgZmlsZS4gPC9saT4NCi08bGk+PHVpY29udHJvbD5DdXJyZW50IFJlc291cmNlPC91aWNvbnRyb2w+IChkZWZhdWx0KS4gTGlzdCBhbGwgb2YNCi10aGUgdHlwZXMgYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+DQotPGxpPjx1aWNvbnRyb2w+V29ya2luZyBTZXRzPC91aWNvbnRyb2w+LiBMaXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlDQotd2l0aGluIHRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPg0KLTwvdWw+PC9pbmZvPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkFuIGF0dHJpYnV0ZSByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwNCi1hdHRyaWJ1dGUuIFRvIGFkZCBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLCBpbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrDQotdGhlIGNvbXBsZXggdHlwZSBjb250YWluaW5nIHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQNCi1BdHRyaWJ1dGUgUmVmPC91aWNvbnRyb2w+LiA8L2NtZD48aW5mbz5BIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcw0KLWEgZ2xvYmFsIGF0dHJpYnV0ZSBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZSB0byBhcHBlYXIgaW4gdGhlDQotaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiBTZWxlY3QNCi10aGUgcmVmZXJlbmNlLCB0aGVuIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHNlbGVjdCB0aGUgYXR0cmlidXRlIHlvdQ0KLXdhbnQgaXQgdG8gcmVmZXJlbmNlIGZyb20gdGhlIDx1aWNvbnRyb2w+UmVmZXJlbmNlPC91aWNvbnRyb2w+IGxpc3QuPD9QdWINCi1DYXJldD8+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkFuIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYW4NCi1hdHRyaWJ1dGUgZ3JvdXAuIFRvIGFkZCBhbiBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlLCBpbiB0aGUgRGVzaWduDQotdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbXBsZXggdHlwZSBjb250YWluaW5nIHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQNCi1BdHRyaWJ1dGUgR3JvdXAgUmVmPC91aWNvbnRyb2w+LiA8L2NtZD48aW5mbz5BIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcw0KLWEgZ2xvYmFsIGF0dHJpYnV0ZSBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZSB0byBhcHBlYXIgaW4gdGhlDQotaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiBTZWxlY3QNCi10aGUgcmVmZXJlbmNlLCB0aGVuIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHNlbGVjdCB0aGUgYXR0cmlidXRlIGdyb3VwDQoteW91IHdhbnQgaXQgdG8gcmVmZXJlbmNlIGZyb20gdGhlIDx1aWNvbnRyb2w+UmVmZXJlbmNlPC91aWNvbnRyb2w+IGxpc3QuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQgZW5hYmxlcyBlbGVtZW50IGNvbnRlbnQNCi1hY2NvcmRpbmcgdG8gbmFtZXNwYWNlcywgYW5kIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlcGg+YW55PC9jb2RlcGg+IGF0dHJpYnV0ZQ0KLWVsZW1lbnQgZW5hYmxlcyBhdHRyaWJ1dGVzIHRvIGFwcGVhciBpbiBlbGVtZW50cy4gVG8gYWRkIGFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGF0dHJpYnV0ZSwNCi1yaWdodC1jbGljayB5b3VyIGF0dHJpYnV0ZSBncm91cCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgQW55IEF0dHJpYnV0ZTwvdWljb250cm9sPi4gPC9jbWQ+DQotPGluZm8+VGhlIDxjb2RlcGg+YW55PC9jb2RlcGg+IGFwcGVhcnMgYmVsb3cgdGhlIGF0dHJpYnV0ZSBncm91cCBpbg0KLXRoZSBPdXRsaW5lIHZpZXcuIFlvdSBjYW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgYW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gYXR0cmlidXRlOjwvaW5mbz4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPkZvciBhIDx1aWNvbnRyb2w+TmFtZXNwYWNlPC91aWNvbnRyb2w+IHZhbHVlLCB5b3UgY2FuIHNlbGVjdDo8dWw+DQotPGxpPjxiPiMjYW55PC9iPjogdGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCBmcm9tIGFueSBuYW1lc3BhY2UuPC9saT4NCi08bGk+PGI+IyNsb2NhbCA8L2I+OiB0aGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIHRoYXQgaXMgbm90IGRlY2xhcmVkDQotdG8gYmUgaW4gYSBuYW1lc3BhY2UuPC9saT4NCi08bGk+PGI+IyNvdGhlcjwvYj46IHRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZnJvbQ0KLXRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuPC9saT4NCi08bGk+PGI+IyN0YXJnZXROYW1lc3BhY2UgPC9iPjogdGhpcyBpcyBzaG9ydGhhbmQgZm9yIHRoZSB0YXJnZXQgbmFtZXNwYWNlDQotb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPg0KLTwvdWw+PC9jaG9pY2U+DQotPGNob2ljZT5Gb3IgYSA8dWljb250cm9sPlByb2Nlc3MgQ29udGVudHM8L3VpY29udHJvbD4gdmFsdWUsIHlvdSBjYW4NCi1zZWxlY3Q6PHVsPg0KLTxsaT48Yj5za2lwPC9iPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCBub3QgdmFsaWRhdGUgdGhlIGF0dHJpYnV0ZQ0KLWNvbnRlbnQgYXQgYWxsLjwvbGk+DQotPGxpPjxiPmxheDwvYj46IHRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgdGhlIGF0dHJpYnV0ZSBjb250ZW50DQotYXMgbXVjaCBhcyBpdCBjYW4uPC9saT4NCi08bGk+PGI+c3RyaWN0PC9iPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSBhbGwgdGhlIGF0dHJpYnV0ZQ0KLWNvbnRlbnQuPC9saT4NCi08L3VsPjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNTU0ND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYWdycC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYWdycC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjNiMzlhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFncnAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgYXR0cmlidXRlIGdyb3VwcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBbiBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbiBpcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgbmFtZSBhbmQgYSBzZXQgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4gTmFtZWQgZ3JvdXBzIG9mIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMgY2FuIGdyZWF0bHkgZmFjaWxpdGF0ZSB0aGUgbWFpbnRlbmFuY2UgYW5kIHJldXNlIG9mIGNvbW1vbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zIGluIGFuIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFuIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9uIGlzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gYSBuYW1lIGFuZCBhIHNldCBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLiBOYW1lZCBncm91cHMgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucyBjYW4gZ3JlYXRseSBmYWNpbGl0YXRlIHRoZSBtYWludGVuYW5jZSBhbmQgcmV1c2Ugb2YgY29tbW9uIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMgaW4gYW4gWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYXR0cmlidXRlIGdyb3VwcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhdHRyaWJ1dGUgZ3JvdXBzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkYWdycCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkYWdycCI+PGEgbmFtZT0idGFkZGFncnAiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BbiBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbiBpcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuCi1hIG5hbWUgYW5kIGEgc2V0IG9mIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuIE5hbWVkIGdyb3VwcyBvZiBhdHRyaWJ1dGUKLWRlY2xhcmF0aW9ucyBjYW4gZ3JlYXRseSBmYWNpbGl0YXRlIHRoZSBtYWludGVuYW5jZSBhbmQgcmV1c2Ugb2YgY29tbW9uCi1hdHRyaWJ1dGUgZGVjbGFyYXRpb25zIGluIGFuIFhNTCBzY2hlbWEuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvCi1hZGQgYW4gYXR0cmlidXRlIGdyb3VwIHRvIGFuIFhNTCBzY2hlbWEsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BdHRyaWJ1dGVzPC9zcGFuPiBmb2xkZXIKLWFuZCBjbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZSBHcm91cDwvc3Bhbj4uIDwvc3Bhbj4gSXQKLWFwcGVhcnMgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkF0dHJpYnV0ZXM8L3NwYW4+IGZvbGRlci48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB5b3VyIG5ldyBncm91cCwgYW5kIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sKLXRoZSBhdHRyaWJ1dGUgZ3JvdXAgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZmFjdG9yPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVuYW1lPC9zcGFuPjwvc3Bhbj4uIEluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXcKLU5hbWU8L3NwYW4+IGZpZWxkLCB0eXBlIGEgbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZSBncm91cCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gYWRkIGFuIGF0dHJpYnV0ZSwgcmlnaHQtY2xpY2sgeW91ciBhdHRyaWJ1dGUgZ3JvdXAgaW4KLXRoZSBPdXRsaW5lIHZpZXcsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBBdHRyaWJ1dGU8L3NwYW4+LiA8L3NwYW4+Ci0gVGhlIGF0dHJpYnV0ZSBhcHBlYXJzIGJlbG93IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgaW4gdGhlIE91dGxpbmUKLXZpZXcuCi08b2wgdHlwZT0iYSI+Ci08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgYXR0cmlidXRlLCBhbmQgaW4gdGhlIERlc2lnbiB2aWV3LCBjbGljawotdGhlIGN1cnJlbnQgKGRlZmF1bHQpIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSwgdGhlbiB0eXBlIHRoZSBuZXcgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSBjdXJyZW50IChkZWZhdWx0KSBhdHRyaWJ1dGUKLXR5cGUgYW5kIHNlbGVjdCBhIHR5cGUgZnJvbSB0aGUgbWVudS4gQWx0ZXJuYXRlbHksIHlvdSBjYW4gc2VsZWN0Ci1icm93c2UgdG8gaW52b2tlIHRoZSBTZXQgVHlwZSBtZW51IGZvciBtb3JlIG9wdGlvbnMuIDwvc3Bhbj4gVGhlCi1TZXQgVHlwZSBkaWFsb2cgbGlzdHMgYWxsIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5Ci1hdmFpbGFibGUuIFlvdSBjYW4gY2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TY29wZTwvc3Bhbj4gb2YgdGhlCi1saXN0IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjx1bD4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3Jrc3BhY2U8L3NwYW4+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQotaW4geW91ciB3b3Jrc3BhY2UuIDwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5FbmNsb3NpbmcgUHJvamVjdDwvc3Bhbj4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMKLWF2YWlsYWJsZSBpbiB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHlvdXIgZmlsZS4gPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1cnJlbnQgUmVzb3VyY2U8L3NwYW4+IChkZWZhdWx0KS4gTGlzdCBhbGwgb2YKLXRoZSB0eXBlcyBhdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtpbmcgU2V0czwvc3Bhbj4uIExpc3QgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUKLXdpdGhpbiB0aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QW4gYXR0cmlidXRlIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbAotYXR0cmlidXRlLiBUbyBhZGQgYW4gYXR0cmlidXRlIHJlZmVyZW5jZSwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljawotdGhlIGNvbXBsZXggdHlwZSBjb250YWluaW5nIHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkCi1BdHRyaWJ1dGUgUmVmPC9zcGFuPi4gPC9zcGFuPiBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcwotYSBnbG9iYWwgYXR0cmlidXRlIGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIHRvIGFwcGVhciBpbiB0aGUKLWluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4gU2VsZWN0Ci10aGUgcmVmZXJlbmNlLCB0aGVuIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHNlbGVjdCB0aGUgYXR0cmlidXRlIHlvdQotd2FudCBpdCB0byByZWZlcmVuY2UgZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVmZXJlbmNlPC9zcGFuPiBsaXN0LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QW4gYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhbgotYXR0cmlidXRlIGdyb3VwLiBUbyBhZGQgYW4gYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSwgaW4gdGhlIERlc2lnbgotdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbXBsZXggdHlwZSBjb250YWluaW5nIHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkCi1BdHRyaWJ1dGUgR3JvdXAgUmVmPC9zcGFuPi4gPC9zcGFuPiBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcwotYSBnbG9iYWwgYXR0cmlidXRlIGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIHRvIGFwcGVhciBpbiB0aGUKLWluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4gU2VsZWN0Ci10aGUgcmVmZXJlbmNlLCB0aGVuIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHNlbGVjdCB0aGUgYXR0cmlidXRlIGdyb3VwCi15b3Ugd2FudCBpdCB0byByZWZlcmVuY2UgZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVmZXJlbmNlPC9zcGFuPiBsaXN0LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQgZW5hYmxlcyBlbGVtZW50IGNvbnRlbnQKLWFjY29yZGluZyB0byBuYW1lc3BhY2VzLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBhdHRyaWJ1dGUKLWVsZW1lbnQgZW5hYmxlcyBhdHRyaWJ1dGVzIHRvIGFwcGVhciBpbiBlbGVtZW50cy4gVG8gYWRkIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gYXR0cmlidXRlLAotcmlnaHQtY2xpY2sgeW91ciBhdHRyaWJ1dGUgZ3JvdXAgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBBbnkgQXR0cmlidXRlPC9zcGFuPi4gPC9zcGFuPgotIFRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGFwcGVhcnMgYmVsb3cgdGhlIGF0dHJpYnV0ZSBncm91cCBpbgotdGhlIE91dGxpbmUgdmlldy4gWW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBhbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGF0dHJpYnV0ZToKLTx1bD4KLTxsaT5Gb3IgYSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lc3BhY2U8L3NwYW4+IHZhbHVlLCB5b3UgY2FuIHNlbGVjdDo8dWw+Ci08bGk+PHN0cm9uZz4jI2FueTwvc3Ryb25nPjogdGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCBmcm9tIGFueSBuYW1lc3BhY2UuPC9saT4KLQotPGxpPjxzdHJvbmc+IyNsb2NhbCA8L3N0cm9uZz46IHRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZGVjbGFyZWQKLXRvIGJlIGluIGEgbmFtZXNwYWNlLjwvbGk+Ci0KLTxsaT48c3Ryb25nPiMjb3RoZXI8L3N0cm9uZz46IHRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZnJvbQotdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPgotCi08bGk+PHN0cm9uZz4jI3RhcmdldE5hbWVzcGFjZSA8L3N0cm9uZz46IHRoaXMgaXMgc2hvcnRoYW5kIGZvciB0aGUgdGFyZ2V0IG5hbWVzcGFjZQotb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpPkZvciBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb2Nlc3MgQ29udGVudHM8L3NwYW4+IHZhbHVlLCB5b3UgY2FuCi1zZWxlY3Q6PHVsPgotPGxpPjxzdHJvbmc+c2tpcDwvc3Ryb25nPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCBub3QgdmFsaWRhdGUgdGhlIGF0dHJpYnV0ZQotY29udGVudCBhdCBhbGwuPC9saT4KLQotPGxpPjxzdHJvbmc+bGF4PC9zdHJvbmc+OiB0aGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIHRoZSBhdHRyaWJ1dGUgY29udGVudAotYXMgbXVjaCBhcyBpdCBjYW4uPC9saT4KLQotPGxpPjxzdHJvbmc+c3RyaWN0PC9zdHJvbmc+OiB0aGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgYXR0cmlidXRlCi1jb250ZW50LjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYW55ZS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYW55ZS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMThjN2NkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFueWUuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA4LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkYW55ZSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGFuIGFueSBlbGVtZW50PC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgYW4gYW55IGVsZW1lbnQ8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiB1c2UgdGhlIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQgaW4gYSBzaW1pbGFyDQotd2F5IGFzIGEgRFREJ3MgQU5ZIGNvbnRlbnQgbW9kZWwsIGhvd2V2ZXIsIGl0IG11c3QgYmUgZG9uZSBpbiBjb25qdW5jdGlvbg0KLXdpdGggbmFtZXNwYWNlcy4gVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwNCi1zdWNoIGFzIGFuIEhUTUwgV2ViIHBhZ2UgdGhhdCBjb25mb3JtcyB0byBYSFRNTCAxLjAgc3ludGF4Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5hZGRpbmcgYW4gYW55IGVsZW1lbnQ8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZyBhbiBhbnkgZWxlbWVudDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+Rm9yIGV4YW1wbGU6PC9wPjxwPjxjb2RlYmxvY2s+Jmx0O2VsZW1lbnQgbmFtZSA9ICJNeVdlYlBhZ2UiPg0KLSZsdDtjb21wbGV4VHlwZT4NCi0mbHQ7YW55IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9InNraXAiLz4NCi0mbHQ7L2NvbXBsZXhUeXBlPg0KLSZsdDsvZWxlbWVudD48L2NvZGVibG9jaz48L3A+PHA+VGhlIHByZWNlZGluZyBzY2hlbWEgZnJhZ21lbnQgYWxsb3dzDQotYSA8Y29kZXBoPiZsdDtNeVdlYlBhZ2U+PC9jb2RlcGg+IGVsZW1lbnQgdG8gY29udGFpbiBhbnkgd2VsbC1mb3JtZWQNCi1YSFRNTCBkYXRhIHRoYXQgYXBwZWFycyBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS48L3A+PHA+VGhlIGZvbGxvd2luZw0KLWluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbA0KLWFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gYWRkIGFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQsDQotY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBjb250ZW50IG1vZGVsIHRoYXQNCi15b3Ugd2FudCB0byB3b3JrIHdpdGggYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEFueTwvdWljb250cm9sPi4gPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBuZXcgPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBmb3IgYSA8dWljb250cm9sPk5hbWVzcGFjZTwvdWljb250cm9sPiB2YWx1ZSwNCi15b3UgY2FuIHNlbGVjdDo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPjxiPiMjYW55PC9iPjogdGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCBmcm9tIGFueSBuYW1lc3BhY2UuPC9jaG9pY2U+DQotPGNob2ljZT48Yj4jI2xvY2FsIDwvYj46IHRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QNCi1kZWNsYXJlZCB0byBiZSBpbiBhIG5hbWVzcGFjZS48L2Nob2ljZT4NCi08Y2hvaWNlPjxiPiMjb3RoZXIgPC9iPjogdGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdA0KLWZyb20gdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2Nob2ljZT4NCi08Y2hvaWNlPjxiPiMjdGFyZ2V0TmFtZXNwYWNlPC9iPjogdGhpcyBpcyBzaG9ydGhhbmQgZm9yIHRoZSB0YXJnZXQNCi1uYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Rm9yIGEgPHVpY29udHJvbD5Qcm9jZXNzIENvbnRlbnRzPC91aWNvbnRyb2w+IHZhbHVlLCB5b3UNCi1jYW4gc2VsZWN0OjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+PGI+c2tpcDwvYj46IHRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgbm90IHZhbGlkYXRlIHRoZSBjb250ZW50DQotYXQgYWxsLjwvY2hvaWNlPg0KLTxjaG9pY2U+PGI+bGF4PC9iPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSB0aGUgY29udGVudCBhcw0KLW11Y2ggYXMgaXQgY2FuLjwvY2hvaWNlPg0KLTxjaG9pY2U+PGI+c3RyaWN0PC9iPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSBhbGwgdGhlIGNvbnRlbnQuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSA8dWljb250cm9sPk1pbmltdW0gT2NjdXJyZW5jZTwvdWljb250cm9sPiB2YWx1ZSBpcw0KLXRoZSBudW1iZXIgb2YgdGltZXMgdGhlIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQgbXVzdCBhcHBlYXIgaW4NCi1hbiBpbnN0YW5jZSBkb2N1bWVudC4gWW91IGNhbiBzZWxlY3QgPHVpY29udHJvbD4wPC91aWNvbnRyb2w+IGlmIHlvdQ0KLXdhbnQgdGhlIGVsZW1lbnQgdG8gYmUgb3B0aW9uYWw7IG90aGVyd2lzZSwgc2VsZWN0IDx1aWNvbnRyb2w+MTwvdWljb250cm9sPi4gPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIDx1aWNvbnRyb2w+TWF4aW11bSBPY2N1cnJlbmNlPC91aWNvbnRyb2w+IHZhbHVlIGlzDQotdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIGFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQgY2FuIGFwcGVhcg0KLWluIGFuIGluc3RhbmNlIGRvY3VtZW50LiBZb3UgY2FuIHNlbGVjdCA8dWljb250cm9sPjA8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+MTwvdWljb250cm9sPiwNCi1vciwgdG8gaW5kaWNhdGUgdGhlcmUgaXMgbm8gbWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMsIDx1aWNvbnRyb2w+dW5ib3VuZGVkPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdQ0KLXdhbnQgdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlbGVtZW50LiA8P1B1YiBDYXJldD8+PC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlIGlzIHVzZWQgZm9yIGh1bWFuDQotcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91DQotd2FudCB0byBhZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZg0KLXNjaGVtYSBjb21wb25lbnRzLiA8L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UNCi1hbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxkcmFmdC1jb21tZW50PihjKSBDb3B5cmlnaHQgMjAwMSwgV29ybGQgV2lkZSBXZWIgKE1hc3NhY2h1c2V0dHMNCi1JbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZQ0KLWV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLjwvZHJhZnQtY29tbWVudD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDQwODY/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFueWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFueWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1YjdhNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhbnllLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGFuIGFueSBlbGVtZW50IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSBhbnkgZWxlbWVudCBpbiBhIHNpbWlsYXIgd2F5IGFzIGEgRFREJ3MgQU5ZIGNvbnRlbnQgbW9kZWwsIGhvd2V2ZXIsIGl0IG11c3QgYmUgZG9uZSBpbiBjb25qdW5jdGlvbiB3aXRoIG5hbWVzcGFjZXMuIFRoaXMgZW5hYmxlcyB5b3UgdG8gaW5jbHVkZSBhbnkgd2VsbC1mb3JtZWQgWE1MIGNvbnRlbnQsIHN1Y2ggYXMgYW4gSFRNTCBXZWIgcGFnZSB0aGF0IGNvbmZvcm1zIHRvIFhIVE1MIDEuMCBzeW50YXguIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSBhbnkgZWxlbWVudCBpbiBhIHNpbWlsYXIgd2F5IGFzIGEgRFREJ3MgQU5ZIGNvbnRlbnQgbW9kZWwsIGhvd2V2ZXIsIGl0IG11c3QgYmUgZG9uZSBpbiBjb25qdW5jdGlvbiB3aXRoIG5hbWVzcGFjZXMuIFRoaXMgZW5hYmxlcyB5b3UgdG8gaW5jbHVkZSBhbnkgd2VsbC1mb3JtZWQgWE1MIGNvbnRlbnQsIHN1Y2ggYXMgYW4gSFRNTCBXZWIgcGFnZSB0aGF0IGNvbmZvcm1zIHRvIFhIVE1MIDEuMCBzeW50YXguIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZyBhbiBhbnkgZWxlbWVudCwgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcgYW4gYW55IGVsZW1lbnQsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRhbnllIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGFuIGFueSBlbGVtZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkYW55ZSI+PGEgbmFtZT0idGFkZGFueWUiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBhbiBhbnkgZWxlbWVudDwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiB1c2UgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudCBpbiBhIHNpbWlsYXIKLXdheSBhcyBhIERURCdzIEFOWSBjb250ZW50IG1vZGVsLCBob3dldmVyLCBpdCBtdXN0IGJlIGRvbmUgaW4gY29uanVuY3Rpb24KLXdpdGggbmFtZXNwYWNlcy4gVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwKLXN1Y2ggYXMgYW4gSFRNTCBXZWIgcGFnZSB0aGF0IGNvbmZvcm1zIHRvIFhIVE1MIDEuMCBzeW50YXguPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Gb3IgZXhhbXBsZTo8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDtlbGVtZW50IG5hbWUgPSAiTXlXZWJQYWdlIiZndDsKLSZsdDtjb21wbGV4VHlwZSZndDsKLSZsdDthbnkgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJza2lwIi8mZ3Q7Ci0mbHQ7L2NvbXBsZXhUeXBlJmd0OwotJmx0Oy9lbGVtZW50Jmd0OzwvcHJlPgotPC9kaXY+Ci08cD5UaGUgcHJlY2VkaW5nIHNjaGVtYSBmcmFnbWVudCBhbGxvd3MKLWEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0O015V2ViUGFnZSZndDs8L3NhbXA+IGVsZW1lbnQgdG8gY29udGFpbiBhbnkgd2VsbC1mb3JtZWQKLVhIVE1MIGRhdGEgdGhhdCBhcHBlYXJzIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcKLWluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbAotYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQsCi1jb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBjb250ZW50IG1vZGVsIHRoYXQKLXlvdSB3YW50IHRvIHdvcmsgd2l0aCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEFueTwvc3Bhbj4uIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBuZXcgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGZvciBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWVzcGFjZTwvc3Bhbj4gdmFsdWUsCi15b3UgY2FuIHNlbGVjdDo8L3NwYW4+Ci08dWw+Ci08bGk+PHN0cm9uZz4jI2FueTwvc3Ryb25nPjogdGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCBmcm9tIGFueSBuYW1lc3BhY2UuPC9saT4KLQotPGxpPjxzdHJvbmc+IyNsb2NhbCA8L3N0cm9uZz46IHRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QKLWRlY2xhcmVkIHRvIGJlIGluIGEgbmFtZXNwYWNlLjwvbGk+Ci0KLTxsaT48c3Ryb25nPiMjb3RoZXIgPC9zdHJvbmc+OiB0aGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIHRoYXQgaXMgbm90Ci1mcm9tIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuPC9saT4KLQotPGxpPjxzdHJvbmc+IyN0YXJnZXROYW1lc3BhY2U8L3N0cm9uZz46IHRoaXMgaXMgc2hvcnRoYW5kIGZvciB0aGUgdGFyZ2V0Ci1uYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZvciBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb2Nlc3MgQ29udGVudHM8L3NwYW4+IHZhbHVlLCB5b3UKLWNhbiBzZWxlY3Q6PC9zcGFuPgotPHVsPgotPGxpPjxzdHJvbmc+c2tpcDwvc3Ryb25nPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCBub3QgdmFsaWRhdGUgdGhlIGNvbnRlbnQKLWF0IGFsbC48L2xpPgotCi08bGk+PHN0cm9uZz5sYXg8L3N0cm9uZz46IHRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgdGhlIGNvbnRlbnQgYXMKLW11Y2ggYXMgaXQgY2FuLjwvbGk+Ci0KLTxsaT48c3Ryb25nPnN0cmljdDwvc3Ryb25nPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSBhbGwgdGhlIGNvbnRlbnQuPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWluaW11bSBPY2N1cnJlbmNlPC9zcGFuPiB2YWx1ZSBpcwotdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50IG11c3QgYXBwZWFyIGluCi1hbiBpbnN0YW5jZSBkb2N1bWVudC4gWW91IGNhbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MDwvc3Bhbj4gaWYgeW91Ci13YW50IHRoZSBlbGVtZW50IHRvIGJlIG9wdGlvbmFsOyBvdGhlcndpc2UsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4xPC9zcGFuPi4gPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWF4aW11bSBPY2N1cnJlbmNlPC9zcGFuPiB2YWx1ZSBpcwotdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudCBjYW4gYXBwZWFyCi1pbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gWW91IGNhbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjE8L3NwYW4+LAotb3IsIHRvIGluZGljYXRlIHRoZXJlIGlzIG5vIG1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzLCA8c3BhbiBjbGFzcz0idWljb250cm9sIj51bmJvdW5kZWQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3UKLXdhbnQgdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlbGVtZW50LiA8L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UgaXMgdXNlZCBmb3IgaHVtYW4KLXJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdQotd2FudCB0byBhZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZgotc2NoZW1hIGNvbXBvbmVudHMuIDwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UKLWFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iIC8+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbW9kLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbW9kLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjlkZGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY21vZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRjbW9kIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgY29udGVudCBtb2RlbHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBjb250ZW50IG1vZGVsczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZA0KLWluc2lkZSBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cC4gSXQgaXMgYSBmb3JtYWwNCi1kZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlIGFuZCBwZXJtaXNzaWJsZSBjb250ZW50IG9mIGFuIGVsZW1lbnQsIGdsb2JhbA0KLWVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIGEgZG9jdW1lbnQNCi1pbnN0YW5jZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+Y29udGVudCBtb2RlbHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmNvbnRlbnQgbW9kZWxzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IGtpbmRzIG9mIGNvbnRlbnQgbW9kZWxzOjx1bD4NCi08bGk+PGI+U2VxdWVuY2U8L2I+LCB3aGljaCBtZWFucyB0aGF0IGFsbCB0aGUgY29udGVudCBtb2RlbCdzIGNoaWxkcmVuIGNhbg0KLWFwcGVhciBpbiBhbiBpbnN0YW5jZSBvZiB0aGUgWE1MIHNjaGVtYS4gVGhleSBtdXN0LCBob3dldmVyLCBhcHBlYXIgaW4gdGhlDQotb3JkZXIgdGhleSBhcmUgbGlzdGVkIGluIHRoZSBjb250ZW50IG1vZGVsLjwvbGk+DQotPGxpPjxiPkNob2ljZTwvYj4sIHdoaWNoIG1lYW5zIHRoYXQgb25seSBvbmUgb2YgdGhlIGNvbnRlbnQgbW9kZWwncyBjaGlsZHJlbg0KLWNhbiBhcHBlYXIgaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIFhNTCBzY2hlbWEuPC9saT4NCi08bGk+PGI+QWxsPC9iPiwgd2hpY2ggbWVhbnMgdGhhdCBhbGwgb2YgdGhlIGNvbnRlbnQgbW9kZWwncyBjaGlsZHJlbiBjYW4gYXBwZWFyDQotb25jZSBvciBub3QgYXQgYWxsLCBhbmQgdGhleSBjYW4gYXBwZWFyIGluIGFueSBvcmRlci4gSWYgeW91IHNlbGVjdCB0aGlzIG9wdGlvbiwNCi1hbGwgb2YgdGhlIGNvbnRlbnRzIG1vZGVsJ3MgY2hpbGRyZW4gbXVzdCBiZSBpbmRpdmlkdWFsIGVsZW1lbnRzIGFuZCBubyBlbGVtZW50DQotaW4gdGhlIGNvbnRlbnQgbW9kZWwgY2FuIGFwcGVhciBtb3JlIHRoYW4gb25jZS48L2xpPg0KLTwvdWw+PC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYSBjb250ZW50DQotbW9kZWwgdG8gYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIGNvbXBsZXRlIHRoZQ0KLWZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgc2VsZWN0IHlvdXIgY29tcGxleCB0eXBlLCBvciBncm91cDo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPklmIHlvdSBzZWxlY3RlZCBhIGNvbXBsZXggdHlwZSwgeW91IGNhbiByaWdodC1jbGljayBpdCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQNCi1TZXF1ZW5jZTwvdWljb250cm9sPiwgb3IgPHVpY29udHJvbD5BZGQgQ2hvaWNlPC91aWNvbnRyb2w+IHRvIGFkZCB0aGUgdHlwZQ0KLW9mIGNvbnRlbnQgbW9kZWwgeW91IHdhbnQgdG8geW91ciBjb21wbGV4IHR5cGUuIElmIHlvdSB3aXNoIHRvIHVzZSB0aGUgPHVpY29udHJvbD5hbGw8L3VpY29udHJvbD4gY29udGVudA0KLW1vZGVsLCB5b3UgY2FuIGNoYW5nZSB0aGUgbW9kZWwgYnkgY2xpY2tpbmcgdGhlIG1vZGVsIGluIHRoZSBEZXNpZ24gdmlldywNCi1hbmQgaW4gcHJvcGVydGllcywgc2VsZWN0IDx1aWNvbnRyb2w+YWxsPC91aWNvbnRyb2w+IGFzIHRoZSA8dWljb250cm9sPktpbmQ8L3VpY29udHJvbD4uDQotWW91ciBjb250ZW50IG1vZGVsIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMgYSBjaGlsZCBvZiB5b3VyIGNvbXBsZXggdHlwZQ0KLS0gZXhwYW5kIGluIHRoZSBPdXRsaW5lIHZpZXcgdG8gc2VlIGl0LiA8Yj5Ob3RlOjwvYj4gVGhlc2Ugb3B0aW9ucyB3aWxsIG5vdA0KLWFwcGVhciBpZiB5b3UgaGF2ZSBzZXQgYSBiYXNlIHR5cGUgZm9yIHlvdXIgY29tcGxleCB0eXBlLiBZb3UgY2FuIGVpdGhlciBzZXQNCi1hIGJhc2UgdHlwZSBmb3IgeW91ciBjb21wbGV4IHR5cGUsIG9yIHlvdSBhZGQgYSBjb250ZW50IG1vZGVsIHRvIGl0LCBidXQgeW91DQotY2Fubm90IGRvIGJvdGguPC9jaG9pY2U+DQotPGNob2ljZT5Zb3VyIGdyb3VwIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB3aXRoIGEgc2VxdWVuY2UgY29udGVudCBtb2RlbA0KLWNoaWxkLiBFeHBhbmQgaXQgaW4gdGhlIE91dGxpbmUgdmlldyB0byBzZWUgaXQgYW5kIHNlbGVjdCBpdC4gSW4gdGhlIFByb3BlcnRpZXMNCi12aWV3LCB5b3UgY2FuIHNlbGVjdCB0byBjaGFuZ2UgaXQgdG8gYSA8dWljb250cm9sPmNob2ljZTwvdWljb250cm9sPiBvciA8dWljb250cm9sPmFsbDwvdWljb250cm9sPiBjb250ZW50DQotbW9kZWwgYnkgc2VsZWN0aW5nIHRoZXNlIG9wdGlvbnMgZnJvbSB0aGUgPHVpY29udHJvbD5LaW5kPC91aWNvbnRyb2w+IGRyb3AtZG93bi48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPlNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+TWluaW11bQ0KLU9jY3Vycjw/UHViIENhcmV0Pz5lbmNlPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPjxpbmZvPlRoaXMgaXMgdGhlIG1pbmltdW0NCi1udW1iZXIgb2YgdGltZXMgdGhlIGNvbnRlbnQgbW9kZWwgbXVzdCBhcHBlYXIuIElmIHlvdSB3YW50IHRoZSBjb250ZW50IG1vZGVsDQotdG8gYmUgb3B0aW9uYWwsIHNlbGVjdCA8dWljb250cm9sPjA8L3VpY29udHJvbD4uIE90aGVyd2lzZSwgc2VsZWN0IDx1aWNvbnRyb2w+MTwvdWljb250cm9sPi4gPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5TZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPk1heGltdW0NCi1PY2N1cnJlbmNlPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPjxpbmZvPlRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzDQotYSBjb250ZW50IG1vZGVsIGNhbiBhcHBlYXIuIFlvdSBjYW4gc2VsZWN0IDx1aWNvbnRyb2w+dW5ib3VuZGVkPC91aWNvbnRyb2w+IHRvDQotaW5kaWNhdGUgdGhlcmUgaXMgbm8gbWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb250ZW50IG1vZGVsLjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48cD5Zb3UgY2FuIGFkZCB0aGUgZm9sbG93aW5nIGl0ZW1zIHRvIGEgY29udGVudCBvYmplY3QgbW9kZWw6IDwvcD48dWw+DQotPGxpPkFub3RoZXIgY29udGVudCBtb2RlbC48L2xpPg0KLTxsaT5BIGdyb3VwIHJlZmVyZW5jZSB3aGljaCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUNCi1pbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIFRoaXMgbWVudQ0KLW9wdGlvbiBvbmx5IGFwcGVhcnMgaWYgdGhlcmUgYXJlIGdsb2JhbCBncm91cHMgZGVmaW5lZCBlbHNld2hlcmUgaW4gdGhlIGRvY3VtZW50DQotb3IgaWYgZ3JvdXBzIGFyZSBkZWZpbmVkIGluIGluY2x1ZGVkIHNjaGVtYXMuPC9saT4NCi08bGk+QW4gZWxlbWVudCwgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIGluIFhNTC48L2xpPg0KLTxsaT5BbiBlbGVtZW50IHJlZmVyZW5jZSwgd2hpY2ggcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4NCi1UaGlzIG1lbnUgb3B0aW9uIG9ubHkgYXBwZWFycyBpZiB0aGVyZSBhcmUgZ2xvYmFsIGVsZW1lbnRzIGRlZmluZWQgZWxzZXdoZXJlDQotaW4gdGhlIGRvY3VtZW50LjwvbGk+DQotPGxpPkFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQuIFlvdSBjYW4gdXNlIGFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQNCi10byBleHRlbmQgeW91ciBjb250ZW50IG1vZGVsIGJ5IGFueSBlbGVtZW50cyBiZWxvbmdpbmcgdG8gYSBzcGVjaWZpZWQgbmFtZXNwYWNlLjwvbGk+DQotPC91bD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDUxMDE/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNtb2QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNtb2QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5MTViZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbW9kLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cC4gSXQgaXMgYSBmb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgcGVybWlzc2libGUgY29udGVudCBvZiBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudCBpbnN0YW5jZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLiBJdCBpcyBhIGZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlIGFuZCBwZXJtaXNzaWJsZSBjb250ZW50IG9mIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCB3aGljaCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBhIGRvY3VtZW50IGluc3RhbmNlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBjb250ZW50IG1vZGVscywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBjb250ZW50IG1vZGVscywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkYW55ZS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGVsbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGVsbXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRncnByLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGNtb2QiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgY29udGVudCBtb2RlbHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRjbW9kIj48YSBuYW1lPSJ0YWRkY21vZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGNvbnRlbnQgbW9kZWxzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZAotaW5zaWRlIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLiBJdCBpcyBhIGZvcm1hbAotZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgcGVybWlzc2libGUgY29udGVudCBvZiBhbiBlbGVtZW50LCBnbG9iYWwKLWVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIGEgZG9jdW1lbnQKLWluc3RhbmNlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0icCI+VGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCBraW5kcyBvZiBjb250ZW50IG1vZGVsczo8dWw+Ci08bGk+PHN0cm9uZz5TZXF1ZW5jZTwvc3Ryb25nPiwgd2hpY2ggbWVhbnMgdGhhdCBhbGwgdGhlIGNvbnRlbnQgbW9kZWwncyBjaGlsZHJlbiBjYW4KLWFwcGVhciBpbiBhbiBpbnN0YW5jZSBvZiB0aGUgWE1MIHNjaGVtYS4gVGhleSBtdXN0LCBob3dldmVyLCBhcHBlYXIgaW4gdGhlCi1vcmRlciB0aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIGNvbnRlbnQgbW9kZWwuPC9saT4KLQotPGxpPjxzdHJvbmc+Q2hvaWNlPC9zdHJvbmc+LCB3aGljaCBtZWFucyB0aGF0IG9ubHkgb25lIG9mIHRoZSBjb250ZW50IG1vZGVsJ3MgY2hpbGRyZW4KLWNhbiBhcHBlYXIgaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIFhNTCBzY2hlbWEuPC9saT4KLQotPGxpPjxzdHJvbmc+QWxsPC9zdHJvbmc+LCB3aGljaCBtZWFucyB0aGF0IGFsbCBvZiB0aGUgY29udGVudCBtb2RlbCdzIGNoaWxkcmVuIGNhbiBhcHBlYXIKLW9uY2Ugb3Igbm90IGF0IGFsbCwgYW5kIHRoZXkgY2FuIGFwcGVhciBpbiBhbnkgb3JkZXIuIElmIHlvdSBzZWxlY3QgdGhpcyBvcHRpb24sCi1hbGwgb2YgdGhlIGNvbnRlbnRzIG1vZGVsJ3MgY2hpbGRyZW4gbXVzdCBiZSBpbmRpdmlkdWFsIGVsZW1lbnRzIGFuZCBubyBlbGVtZW50Ci1pbiB0aGUgY29udGVudCBtb2RlbCBjYW4gYXBwZWFyIG1vcmUgdGhhbiBvbmNlLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGEgY29udGVudAotbW9kZWwgdG8gYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIGNvbXBsZXRlIHRoZQotZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgc2VsZWN0IHlvdXIgY29tcGxleCB0eXBlLCBvciBncm91cDo8L3NwYW4+Ci08dWw+Ci08bGk+SWYgeW91IHNlbGVjdGVkIGEgY29tcGxleCB0eXBlLCB5b3UgY2FuIHJpZ2h0LWNsaWNrIGl0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLVNlcXVlbmNlPC9zcGFuPiwgb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIENob2ljZTwvc3Bhbj4gdG8gYWRkIHRoZSB0eXBlCi1vZiBjb250ZW50IG1vZGVsIHlvdSB3YW50IHRvIHlvdXIgY29tcGxleCB0eXBlLiBJZiB5b3Ugd2lzaCB0byB1c2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmFsbDwvc3Bhbj4gY29udGVudAotbW9kZWwsIHlvdSBjYW4gY2hhbmdlIHRoZSBtb2RlbCBieSBjbGlja2luZyB0aGUgbW9kZWwgaW4gdGhlIERlc2lnbiB2aWV3LAotYW5kIGluIHByb3BlcnRpZXMsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5hbGw8L3NwYW4+IGFzIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LaW5kPC9zcGFuPi4KLVlvdXIgY29udGVudCBtb2RlbCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzIGEgY2hpbGQgb2YgeW91ciBjb21wbGV4IHR5cGUKLS0gZXhwYW5kIGluIHRoZSBPdXRsaW5lIHZpZXcgdG8gc2VlIGl0LiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZXNlIG9wdGlvbnMgd2lsbCBub3QKLWFwcGVhciBpZiB5b3UgaGF2ZSBzZXQgYSBiYXNlIHR5cGUgZm9yIHlvdXIgY29tcGxleCB0eXBlLiBZb3UgY2FuIGVpdGhlciBzZXQKLWEgYmFzZSB0eXBlIGZvciB5b3VyIGNvbXBsZXggdHlwZSwgb3IgeW91IGFkZCBhIGNvbnRlbnQgbW9kZWwgdG8gaXQsIGJ1dCB5b3UKLWNhbm5vdCBkbyBib3RoLjwvbGk+Ci0KLTxsaT5Zb3VyIGdyb3VwIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB3aXRoIGEgc2VxdWVuY2UgY29udGVudCBtb2RlbAotY2hpbGQuIEV4cGFuZCBpdCBpbiB0aGUgT3V0bGluZSB2aWV3IHRvIHNlZSBpdCBhbmQgc2VsZWN0IGl0LiBJbiB0aGUgUHJvcGVydGllcwotdmlldywgeW91IGNhbiBzZWxlY3QgdG8gY2hhbmdlIGl0IHRvIGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Y2hvaWNlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5hbGw8L3NwYW4+IGNvbnRlbnQKLW1vZGVsIGJ5IHNlbGVjdGluZyB0aGVzZSBvcHRpb25zIGZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktpbmQ8L3NwYW4+IGRyb3AtZG93bi48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPlNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1pbmltdW0KLU9jY3VycmVuY2U8L3NwYW4+IGZpZWxkLjwvc3Bhbj4gVGhpcyBpcyB0aGUgbWluaW11bQotbnVtYmVyIG9mIHRpbWVzIHRoZSBjb250ZW50IG1vZGVsIG11c3QgYXBwZWFyLiBJZiB5b3Ugd2FudCB0aGUgY29udGVudCBtb2RlbAotdG8gYmUgb3B0aW9uYWwsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4wPC9zcGFuPi4gT3RoZXJ3aXNlLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MTwvc3Bhbj4uIAotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5TZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXhpbXVtCi1PY2N1cnJlbmNlPC9zcGFuPiBmaWVsZC48L3NwYW4+IFRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzCi1hIGNvbnRlbnQgbW9kZWwgY2FuIGFwcGVhci4gWW91IGNhbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+dW5ib3VuZGVkPC9zcGFuPiB0bwotaW5kaWNhdGUgdGhlcmUgaXMgbm8gbWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbnRlbnQgbW9kZWwuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gYWRkIHRoZSBmb2xsb3dpbmcgaXRlbXMgdG8gYSBjb250ZW50IG9iamVjdCBtb2RlbDogPC9wPgotPHVsPgotPGxpPkFub3RoZXIgY29udGVudCBtb2RlbC48L2xpPgotCi08bGk+QSBncm91cCByZWZlcmVuY2Ugd2hpY2ggZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBncm91cCB0byBhcHBlYXIgaW4gdGhlCi1pbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIFRoaXMgbWVudQotb3B0aW9uIG9ubHkgYXBwZWFycyBpZiB0aGVyZSBhcmUgZ2xvYmFsIGdyb3VwcyBkZWZpbmVkIGVsc2V3aGVyZSBpbiB0aGUgZG9jdW1lbnQKLW9yIGlmIGdyb3VwcyBhcmUgZGVmaW5lZCBpbiBpbmNsdWRlZCBzY2hlbWFzLjwvbGk+Ci0KLTxsaT5BbiBlbGVtZW50LCBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgaW4gWE1MLjwvbGk+Ci0KLTxsaT5BbiBlbGVtZW50IHJlZmVyZW5jZSwgd2hpY2ggcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4KLVRoaXMgbWVudSBvcHRpb24gb25seSBhcHBlYXJzIGlmIHRoZXJlIGFyZSBnbG9iYWwgZWxlbWVudHMgZGVmaW5lZCBlbHNld2hlcmUKLWluIHRoZSBkb2N1bWVudC48L2xpPgotCi08bGk+QW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50LiBZb3UgY2FuIHVzZSBhbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQKLXRvIGV4dGVuZCB5b3VyIGNvbnRlbnQgbW9kZWwgYnkgYW55IGVsZW1lbnRzIGJlbG9uZ2luZyB0byBhIHNwZWNpZmllZCBuYW1lc3BhY2UuPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkYW55ZS5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIGFueSBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMgYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uIHdpdGggbmFtZXNwYWNlcy4gVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwgc3VjaCBhcyBhbiBIVE1MIFdlYiBwYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC4iPkFkZGluZyBhbiBhbnkgZWxlbWVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRlbG0uaHRtbCIgdGl0bGU9IkVsZW1lbnRzIGFyZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgaW4gWE1MLiBFbGVtZW50IGRlY2xhcmF0aW9ucyBwcm92aWRlIHZhbHVlIGNvbnN0cmFpbnRzLCBwcm92aWRlIGEgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmFsaWRhdGlvbiwgZXN0YWJsaXNoIGNvbnN0cmFpbmluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gcmVsYXRlZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcywgYW5kIGNvbnRyb2wgdGhlIHN1YnN0aXR1dGlvbiBvZiBlbGVtZW50cy4iPkFkZGluZyBlbGVtZW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRlbG1yLmh0bWwiIHRpdGxlPSJBbiBlbGVtZW50IHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50LiBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBlbGVtZW50IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ2xvYmFsIGVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIj5BZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGdycHIuaHRtbCIgdGl0bGU9IkEgZ3JvdXAgcmVmZXJlbmNlIGlzIGEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ3JvdXAuIEl0IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ3JvdXAgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIj5BZGRpbmcgZ3JvdXAgcmVmZXJlbmNlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbXh0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbXh0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YmQ3ZWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY214dC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDgsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIFN0eSBfZGlzcGxheSBGb250Q29sb3I9InJlZCI/Pg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRjbXh0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgY29tcGxleCB0eXBlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGNvbXBsZXggdHlwZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QSBjb21wbGV4IHR5cGUgYWxsb3dzIGVsZW1lbnRzIGluIGl0cyBjb250ZW50IGFuZCBjYW4gY2FycnkNCi1hdHRyaWJ1dGVzLiBDb21wbGV4IHR5cGVzIGNhbiBiZSB1c2VkIHRvIGhlbHAgZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZQ0KLWNvbnRlbnQgZm9yIGFueSBpbnN0YW5jZSBkb2N1bWVudHMgZ2VuZXJhdGVkIGZyb20gb3IgYXNzb2NpYXRlZCB3aXRoDQoteW91ciBYTUwgc2NoZW1hLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5jb21wbGV4IHR5cGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5jb21wbGV4IHR5cGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Zb3UgY2FuIGFkZCBhcyBtYW55IGNvbXBsZXggdHlwZXMgYXMgeW91IHdhbnQgdG8gYW4gWE1MDQotc2NoZW1hLjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZQ0KLXBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8NCi1hZGQgYSBjb21wbGV4IHR5cGUgdG8gYW4gWE1MIHNjaGVtYSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5SaWdodC1jbGljayB0aGUgVHlwZXMgY2F0ZWdvcnkgaW4gdGhlIERlc2lnbiB2aWV3LCBjbGljayA8dWljb250cm9sPkFkZA0KLUNvbXBsZXggVHlwZTwvdWljb250cm9sPiBhbmQgdHlwZSB0aGUgbmFtZSBmb3IgdGhlIGNvbXBsZXggdHlwZS4gSWYNCi15b3UgbmVlZCB0byBjaGFuZ2UgdGhlIG5hbWUgbGF0ZXIsIHlvdSBjYW4gZWRpdCBpdCBpbiB0aGUgPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+IHRhYg0KLW9mIHRoZSBQcm9wZXJ0aWVzIHZpZXcuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gc2V0IGEgYmFzZSB0eXBlIGZvciB0aGUgY29tcGxleCB0eXBlLCByaWdodC1jbGljayB0aGUNCi10eXBlIGluIHRoZSBEZXNpZ24gdmlldyBhbmQgY2xpY2sgPHVpY29udHJvbD5TZXQgQmFzZSBUeXBlPC91aWNvbnRyb2w+LiA8L2NtZD4NCi08aW5mbz5Zb3UgY2FuIGVpdGhlciBzZXQgYSBiYXNlIHR5cGUgZm9yIHlvdXIgY29tcGxleCB0eXBlLCBvciB5b3UNCi1jYW4gYWRkIGEgY29udGVudCBtb2RlbCB0byBpdCAod2hpY2ggcmVwcmVzZW50cyBhbnkgZGF0YSB0aGF0IGNhbg0KLWJlIGNvbnRhaW5lZCBpbnNpZGUgYW4gZWxlbWVudCksIGJ1dCB5b3UgY2Fubm90IGRvIGJvdGguIEZvciBtb3JlDQotaW5mb3JtYXRpb24gYWJvdXQgY29udGVudCBtb2RlbHMsIHNlZSA8eHJlZiBocmVmPSJ0YWRkY21vZC5kaXRhIg0KLXNjb3BlPSJwZWVyIj5BZGRpbmcgY29udGVudCBtb2RlbHM8L3hyZWY+LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3VyIG5ldyB0eXBlIGNhbiBiZSBkZXJpdmVkIGZyb20gaXRzIGJhc2UgdHlwZSBlaXRoZXINCi1ieSBleHRlbnNpb24gb3IgcmVzdHJpY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBkZXJpdmF0aW9uIGlzIHNldCB0bw0KLWV4dGVuc2lvbi4gVG8gY2hhbmdlIGhvdyB0aGUgdHlwZSBpcyBkZXJpdmVkLCBjbGljayB0aGUgPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+IHRhYg0KLWluIHRoZSBQcm9wZXJ0aWVzIHZpZXcgYW5kIHNlbGVjdCA8dWljb250cm9sPnJlc3RyaWN0aW9uPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+ZXh0ZW5zaW9uPC91aWNvbnRyb2w+IGZyb20NCi10aGUgPHVpY29udHJvbD5Jbmhlcml0ZWQgQnk8L3VpY29udHJvbD4gbGlzdC4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gYWRkIGF0dHJpYnV0ZXMgdG8geW91ciBjb21wbGV4IHR5cGUsIGluIHRoZSBEZXNpZ24gdmlldywNCi1yaWdodC1jbGljayB5b3VyIGNvbXBsZXggdHlwZSBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+QWRkIEF0dHJpYnV0ZTwvdWljb250cm9sPi4gPC9jbWQ+DQotPGluZm8+QW4gYXR0cmlidXRlIGFzc29jaWF0ZXMgYW4gYXR0cmlidXRlIG5hbWUgd2l0aCBhIHNwZWNpZmljIHR5cGUNCi1hbmQgdmFsdWUuIDwvaW5mbz48P1B1YiBDYXJldDE/Pg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlRvIHNldCB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLCBpbiB0aGUgRGVzaWduIHZpZXcsDQotZG91YmxlLWNsaWNrIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgYW5kIHR5cGUgdGhlIG5hbWUuPC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+VG8gc2V0IHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUsIGluIHRoZSBEZXNpZ24gdmlldywNCi1kb3VibGUtY2xpY2sgdGhlIGF0dHJpYnV0ZSB0eXBlIGFuZCB0aGVuIHNlbGVjdCB0aGUgbmV3IHR5cGUgZnJvbQ0KLXRoZSBsaXN0LjwvY21kPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTxpbmZvPkZvciBpbmZvcm1hdGlvbiBhYm91dCBhZGRpbmcgYXR0cmlidXRlcywgYXR0cmlidXRlIHJlZmVyZW5jZXMsDQotYW5kIDx1c2VyaW5wdXQ+YW55PC91c2VyaW5wdXQ+IGF0dHJpYnV0ZXMsIHNlZSA8eHJlZiBocmVmPSJ0YWRkYWdycC5kaXRhIg0KLXNjb3BlPSJwZWVyIj5BZGRpbmcgYXR0cmlidXRlIGdyb3VwczwveHJlZj4uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBjYW4gZnVydGhlciBkZWZpbmUgeW91ciBjb21wbGV4IHR5cGUgaW4gdGhlIFByb3BlcnRpZXMNCi12aWV3OjwvY21kPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmDQoteW91IHdhbnQgdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb21wbGV4IHR5cGUuIDwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZSBpcyB1c2VkIGZvciBodW1hbg0KLXJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdQ0KLXdhbnQgdG8gYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2YNCi1zY2hlbWEgY29tcG9uZW50cy4gPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlDQotYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBzY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz4NCi08L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzg0MT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY214dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY214dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVlNmYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNteHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgY29tcGxleCB0eXBlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBIGNvbXBsZXggdHlwZSBhbGxvd3MgZWxlbWVudHMgaW4gaXRzIGNvbnRlbnQgYW5kIGNhbiBjYXJyeSBhdHRyaWJ1dGVzLiBDb21wbGV4IHR5cGVzIGNhbiBiZSB1c2VkIHRvIGhlbHAgZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50IGZvciBhbnkgaW5zdGFuY2UgZG9jdW1lbnRzIGdlbmVyYXRlZCBmcm9tIG9yIGFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgY29tcGxleCB0eXBlIGFsbG93cyBlbGVtZW50cyBpbiBpdHMgY29udGVudCBhbmQgY2FuIGNhcnJ5IGF0dHJpYnV0ZXMuIENvbXBsZXggdHlwZXMgY2FuIGJlIHVzZWQgdG8gaGVscCBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGNvbnRlbnQgZm9yIGFueSBpbnN0YW5jZSBkb2N1bWVudHMgZ2VuZXJhdGVkIGZyb20gb3IgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgY29tcGxleCB0eXBlcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBjb21wbGV4IHR5cGVzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRjbW9kLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGNteHQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgY29tcGxleCB0eXBlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGNteHQiPjxhIG5hbWU9InRhZGRjbXh0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgY29tcGxleCB0eXBlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QSBjb21wbGV4IHR5cGUgYWxsb3dzIGVsZW1lbnRzIGluIGl0cyBjb250ZW50IGFuZCBjYW4gY2FycnkKLWF0dHJpYnV0ZXMuIENvbXBsZXggdHlwZXMgY2FuIGJlIHVzZWQgdG8gaGVscCBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlCi1jb250ZW50IGZvciBhbnkgaW5zdGFuY2UgZG9jdW1lbnRzIGdlbmVyYXRlZCBmcm9tIG9yIGFzc29jaWF0ZWQgd2l0aAoteW91ciBYTUwgc2NoZW1hLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBhZGQgYXMgbWFueSBjb21wbGV4IHR5cGVzIGFzIHlvdSB3YW50IHRvIGFuIFhNTAotc2NoZW1hLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLWFkZCBhIGNvbXBsZXggdHlwZSB0byBhbiBYTUwgc2NoZW1hLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodC1jbGljayB0aGUgVHlwZXMgY2F0ZWdvcnkgaW4gdGhlIERlc2lnbiB2aWV3LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLUNvbXBsZXggVHlwZTwvc3Bhbj4gYW5kIHR5cGUgdGhlIG5hbWUgZm9yIHRoZSBjb21wbGV4IHR5cGUuIElmCi15b3UgbmVlZCB0byBjaGFuZ2UgdGhlIG5hbWUgbGF0ZXIsIHlvdSBjYW4gZWRpdCBpdCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gdGFiCi1vZiB0aGUgUHJvcGVydGllcyB2aWV3Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIHNldCBhIGJhc2UgdHlwZSBmb3IgdGhlIGNvbXBsZXggdHlwZSwgcmlnaHQtY2xpY2sgdGhlCi10eXBlIGluIHRoZSBEZXNpZ24gdmlldyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2V0IEJhc2UgVHlwZTwvc3Bhbj4uIDwvc3Bhbj4KLSBZb3UgY2FuIGVpdGhlciBzZXQgYSBiYXNlIHR5cGUgZm9yIHlvdXIgY29tcGxleCB0eXBlLCBvciB5b3UKLWNhbiBhZGQgYSBjb250ZW50IG1vZGVsIHRvIGl0ICh3aGljaCByZXByZXNlbnRzIGFueSBkYXRhIHRoYXQgY2FuCi1iZSBjb250YWluZWQgaW5zaWRlIGFuIGVsZW1lbnQpLCBidXQgeW91IGNhbm5vdCBkbyBib3RoLiBGb3IgbW9yZQotaW5mb3JtYXRpb24gYWJvdXQgY29udGVudCBtb2RlbHMsIHNlZSA8YSBocmVmPSJ0YWRkY21vZC5odG1sIj5BZGRpbmcgY29udGVudCBtb2RlbHM8L2E+LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91ciBuZXcgdHlwZSBjYW4gYmUgZGVyaXZlZCBmcm9tIGl0cyBiYXNlIHR5cGUgZWl0aGVyCi1ieSBleHRlbnNpb24gb3IgcmVzdHJpY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBkZXJpdmF0aW9uIGlzIHNldCB0bwotZXh0ZW5zaW9uLiBUbyBjaGFuZ2UgaG93IHRoZSB0eXBlIGlzIGRlcml2ZWQsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiB0YWIKLWluIHRoZSBQcm9wZXJ0aWVzIHZpZXcgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5yZXN0cmljdGlvbjwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+ZXh0ZW5zaW9uPC9zcGFuPiBmcm9tCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5oZXJpdGVkIEJ5PC9zcGFuPiBsaXN0LiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBhZGQgYXR0cmlidXRlcyB0byB5b3VyIGNvbXBsZXggdHlwZSwgaW4gdGhlIERlc2lnbiB2aWV3LAotcmlnaHQtY2xpY2sgeW91ciBjb21wbGV4IHR5cGUgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQXR0cmlidXRlPC9zcGFuPi4gPC9zcGFuPgotIEFuIGF0dHJpYnV0ZSBhc3NvY2lhdGVzIGFuIGF0dHJpYnV0ZSBuYW1lIHdpdGggYSBzcGVjaWZpYyB0eXBlCi1hbmQgdmFsdWUuIAotPG9sIHR5cGU9ImEiPgotPGxpPjxzcGFuPlRvIHNldCB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLCBpbiB0aGUgRGVzaWduIHZpZXcsCi1kb3VibGUtY2xpY2sgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhbmQgdHlwZSB0aGUgbmFtZS48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+VG8gc2V0IHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUsIGluIHRoZSBEZXNpZ24gdmlldywKLWRvdWJsZS1jbGljayB0aGUgYXR0cmlidXRlIHR5cGUgYW5kIHRoZW4gc2VsZWN0IHRoZSBuZXcgdHlwZSBmcm9tCi10aGUgbGlzdC48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotIEZvciBpbmZvcm1hdGlvbiBhYm91dCBhZGRpbmcgYXR0cmlidXRlcywgYXR0cmlidXRlIHJlZmVyZW5jZXMsCi1hbmQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5hbnk8L2tiZD4gYXR0cmlidXRlcywgc2VlIDxhIGhyZWY9InRhZGRhZ3JwLmh0bWwiPkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzPC9hPi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gZnVydGhlciBkZWZpbmUgeW91ciBjb21wbGV4IHR5cGUgaW4gdGhlIFByb3BlcnRpZXMKLXZpZXc6PC9zcGFuPgotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmCi15b3Ugd2FudCB0byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbXBsZXggdHlwZS4gPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlIGlzIHVzZWQgZm9yIGh1bWFuCi1yZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3UKLXdhbnQgdG8gYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2YKLXNjaGVtYSBjb21wb25lbnRzLiA8L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlCi1hbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuCi08L2xpPgotCi08L29sPgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkY21vZC5odG1sIiB0aXRsZT0iQSBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLiBJdCBpcyBhIGZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlIGFuZCBwZXJtaXNzaWJsZSBjb250ZW50IG9mIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCB3aGljaCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBhIGRvY3VtZW50IGluc3RhbmNlLiI+QWRkaW5nIGNvbnRlbnQgbW9kZWxzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTliZjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwOCwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRhZGRlbG0iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBlbGVtZW50czwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGVsZW1lbnRzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkVsZW1lbnRzIGFyZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgaW4gWE1MLiBFbGVtZW50DQotZGVjbGFyYXRpb25zIHByb3ZpZGUgdmFsdWUgY29uc3RyYWludHMsIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB0aGF0DQotY2FuIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24sIGVzdGFibGlzaCBjb25zdHJhaW5pbmcgcmVsYXRpb25zaGlwcyBiZXR3ZWVuDQotcmVsYXRlZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcywgYW5kIGNvbnRyb2wgdGhlIHN1YnN0aXR1dGlvbiBvZiBlbGVtZW50cy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+ZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZQ0KLXBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8NCi1hZGQgYW4gZWxlbWVudCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPlRvIGFkZCBhbiBlbGVtZW50LCBpbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZQ0KLWNvbnRlbnQgbW9kZWwgKHNlcXVlbmNlLCBjaG9pY2UsIG9yIGFsbCBlbGVtZW50KSB5b3Ugd2FudCB0byB3b3JrDQotd2l0aCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgRWxlbWVudDwvdWljb250cm9sPi48L2NtZD48aW5mbz5UaGUNCi1lbGVtZW50IGFwcGVhcnMgYXR0YWNoZWQgdG8gdGhlIGNvbnRlbnQgbW9kZWwgaW4gdGhlIERlc2lnbiB2aWV3LjwvaW5mbz4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHNlbGVjdCB0aGUgZWxlbWVudCwgYW5kIGNsaWNrIHRoZQ0KLWN1cnJlbnQgKGRlZmF1bHQpIG5hbWUgb2YgdGhlIGVsZW1lbnQsIHdoaWNoIHB1dHMgeW91IGluIGRpcmVjdCBlZGl0aW5nDQotbW9kZSwgdGhlbiB0eXBlIHRoZSBuZXcgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGFuZCBwcmVzcyBlbnRlci48L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSBjdXJyZW50IChkZWZhdWx0KSBlbGVtZW50DQotdHlwZSBhbmQgc2VsZWN0IGEgdHlwZSBmcm9tIHRoZSBtZW51LiBBbHRlcm5hdGVseSwgeW91IGNhbiBzZWxlY3QNCi1icm93c2UgdG8gaW52b2tlIHRoZSBTZXQgVHlwZSBkaWFsb2cgZm9yIG1vcmUgb3B0aW9ucy48L2NtZD48aW5mbz5UaGUNCi1TZXQgVHlwZSBkaWFsb2cgbGlzdHMgYWxsIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5DQotYXZhaWxhYmxlLiBZb3UgY2FuIGNoYW5nZSB0aGUgPHVpY29udHJvbD5TY29wZTwvdWljb250cm9sPiBvZiB0aGUNCi1saXN0IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjx1bD4NCi08bGk+PHVpY29udHJvbD5Xb3Jrc3BhY2U8L3VpY29udHJvbD46IGxpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlDQotaW4geW91ciB3b3Jrc3BhY2UuPC9saT4NCi08bGk+PHVpY29udHJvbD5FbmNsb3NpbmcgUHJvamVjdDwvdWljb250cm9sPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcw0KLWF2YWlsYWJsZSBpbiB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHlvdXIgZmlsZS48L2xpPg0KLTxsaT4oRGVmYXVsdCkgPHVpY29udHJvbD5DdXJyZW50IFJlc291cmNlPC91aWNvbnRyb2w+OiBsaXN0IGFsbCBvZg0KLXRoZSB0eXBlcyBhdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4NCi08bGk+PHVpY29udHJvbD5Xb3JraW5nIFNldHM8L3VpY29udHJvbD46IGxpc3QgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUNCi13aXRoaW4gdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+DQotPC91bD48L2luZm8+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+KE9wdGlvbmFsKSBJbiB0aGUgUHJvcGVydGllcyB2aWV3LCBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlDQotdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+TWluaW11bSBPY2N1cnJlbmNlPC91aWNvbnRyb2w+IGZpZWxkLiA8L2NtZD4NCi08aW5mbz5UaGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGVsZW1lbnQgY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZQ0KLWRvY3VtZW50LiBJZiB5b3Ugd2FudCB0aGUgZWxlbWVudCB0byBiZSBvcHRpb25hbCwgc2VsZWN0IDx1aWNvbnRyb2w+MDwvdWljb250cm9sPi4NCi1PdGhlcndpc2UsIHNlbGVjdCA8dWljb250cm9sPjE8L3VpY29udHJvbD4uIDwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD4oT3B0aW9uYWwpIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+TWF4aW11bQ0KLU9jY3VycmVuY2U8L3VpY29udHJvbD4gZmllbGQuIDwvY21kPjxpbmZvPlRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyDQotb2YgdGltZXMgdGhlIGVsZW1lbnQgY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gU2VsZWN0IDx1aWNvbnRyb2w+dW5ib3VuZGVkPC91aWNvbnRyb2w+IHRvDQotaW5kaWNhdGUgdGhlcmUgaXMgbm8gbWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdQ0KLXdhbnQgdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlbGVtZW50LiA8L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3UNCi13YW50IHRvIGFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mDQotc2NoZW1hIGNvbXBvbmVudHMuIDw/UHViIENhcmV0Pz48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UNCi1hbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPllvdSBjYW4gYWRkIGEgY29udGVudCBtb2RlbCB0byBhbiBlbGVtZW50LCB3aGljaCBpcyB0aGUgcmVwcmVzZW50YXRpb24NCi1vZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIHRoZSBlbGVtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbg0KLWFib3V0IHdvcmtpbmcgd2l0aCBjb250ZW50IG1vZGVscywgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzODkzPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjE1ZjM3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBlbGVtZW50cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJFbGVtZW50cyBhcmUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIGluIFhNTC4gRWxlbWVudCBkZWNsYXJhdGlvbnMgcHJvdmlkZSB2YWx1ZSBjb25zdHJhaW50cywgcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24sIGVzdGFibGlzaCBjb25zdHJhaW5pbmcgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHJlbGF0ZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMsIGFuZCBjb250cm9sIHRoZSBzdWJzdGl0dXRpb24gb2YgZWxlbWVudHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkVsZW1lbnRzIGFyZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgaW4gWE1MLiBFbGVtZW50IGRlY2xhcmF0aW9ucyBwcm92aWRlIHZhbHVlIGNvbnN0cmFpbnRzLCBwcm92aWRlIGEgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmFsaWRhdGlvbiwgZXN0YWJsaXNoIGNvbnN0cmFpbmluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gcmVsYXRlZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcywgYW5kIGNvbnRyb2wgdGhlIHN1YnN0aXR1dGlvbiBvZiBlbGVtZW50cy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRlbG1yLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkYW55ZS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGdsYmEuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkZWxtIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGVsZW1lbnRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkZWxtIj48YSBuYW1lPSJ0YWRkZWxtIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgZWxlbWVudHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkVsZW1lbnRzIGFyZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgaW4gWE1MLiBFbGVtZW50Ci1kZWNsYXJhdGlvbnMgcHJvdmlkZSB2YWx1ZSBjb25zdHJhaW50cywgcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHRoYXQKLWNhbiBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLCBlc3RhYmxpc2ggY29uc3RyYWluaW5nIHJlbGF0aW9uc2hpcHMgYmV0d2VlbgotcmVsYXRlZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcywgYW5kIGNvbnRyb2wgdGhlIHN1YnN0aXR1dGlvbiBvZiBlbGVtZW50cy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLWFkZCBhbiBlbGVtZW50LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFkZCBhbiBlbGVtZW50LCBpbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZQotY29udGVudCBtb2RlbCAoc2VxdWVuY2UsIGNob2ljZSwgb3IgYWxsIGVsZW1lbnQpIHlvdSB3YW50IHRvIHdvcmsKLXdpdGggYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBFbGVtZW50PC9zcGFuPi48L3NwYW4+IFRoZQotZWxlbWVudCBhcHBlYXJzIGF0dGFjaGVkIHRvIHRoZSBjb250ZW50IG1vZGVsIGluIHRoZSBEZXNpZ24gdmlldy4KLTxvbCB0eXBlPSJhIj4KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCBzZWxlY3QgdGhlIGVsZW1lbnQsIGFuZCBjbGljayB0aGUKLWN1cnJlbnQgKGRlZmF1bHQpIG5hbWUgb2YgdGhlIGVsZW1lbnQsIHdoaWNoIHB1dHMgeW91IGluIGRpcmVjdCBlZGl0aW5nCi1tb2RlLCB0aGVuIHR5cGUgdGhlIG5ldyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBhbmQgcHJlc3MgZW50ZXIuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSBjdXJyZW50IChkZWZhdWx0KSBlbGVtZW50Ci10eXBlIGFuZCBzZWxlY3QgYSB0eXBlIGZyb20gdGhlIG1lbnUuIEFsdGVybmF0ZWx5LCB5b3UgY2FuIHNlbGVjdAotYnJvd3NlIHRvIGludm9rZSB0aGUgU2V0IFR5cGUgZGlhbG9nIGZvciBtb3JlIG9wdGlvbnMuPC9zcGFuPiBUaGUKLVNldCBUeXBlIGRpYWxvZyBsaXN0cyBhbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkKLWF2YWlsYWJsZS4gWW91IGNhbiBjaGFuZ2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjb3BlPC9zcGFuPiBvZiB0aGUKLWxpc3QgYnkgc2VsZWN0aW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtzcGFjZTwvc3Bhbj46IGxpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlCi1pbiB5b3VyIHdvcmtzcGFjZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW5jbG9zaW5nIFByb2plY3Q8L3NwYW4+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzCi1hdmFpbGFibGUgaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuPC9saT4KLQotPGxpPihEZWZhdWx0KSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXJyZW50IFJlc291cmNlPC9zcGFuPjogbGlzdCBhbGwgb2YKLXRoZSB0eXBlcyBhdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtpbmcgU2V0czwvc3Bhbj46IGxpc3QgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUKLXdpdGhpbiB0aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+KE9wdGlvbmFsKSBJbiB0aGUgUHJvcGVydGllcyB2aWV3LCBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlCi12YWx1ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWluaW11bSBPY2N1cnJlbmNlPC9zcGFuPiBmaWVsZC4gPC9zcGFuPgotIFRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZWxlbWVudCBjYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlCi1kb2N1bWVudC4gSWYgeW91IHdhbnQgdGhlIGVsZW1lbnQgdG8gYmUgb3B0aW9uYWwsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4wPC9zcGFuPi4KLU90aGVyd2lzZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjE8L3NwYW4+LiA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPihPcHRpb25hbCkgU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWF4aW11bQotT2NjdXJyZW5jZTwvc3Bhbj4gZmllbGQuIDwvc3Bhbj4gVGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIKLW9mIHRpbWVzIHRoZSBlbGVtZW50IGNhbiBhcHBlYXIgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIFNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj51bmJvdW5kZWQ8L3NwYW4+IHRvCi1pbmRpY2F0ZSB0aGVyZSBpcyBubyBtYXhpbXVtIG51bWJlciBvZiBvY2N1cnJlbmNlcy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91Ci13YW50IHRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZWxlbWVudC4gPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3UKLXdhbnQgdG8gYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2YKLXNjaGVtYSBjb21wb25lbnRzLiA8L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlCi1hbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuCi08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIGFkZCBhIGNvbnRlbnQgbW9kZWwgdG8gYW4gZWxlbWVudCwgd2hpY2ggaXMgdGhlIHJlcHJlc2VudGF0aW9uCi1vZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIHRoZSBlbGVtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbgotYWJvdXQgd29ya2luZyB3aXRoIGNvbnRlbnQgbW9kZWxzLCByZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrcy48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgdGl0bGU9IkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cC4gSXQgaXMgYSBmb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgcGVybWlzc2libGUgY29udGVudCBvZiBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudCBpbnN0YW5jZS4iPkFkZGluZyBjb250ZW50IG1vZGVsczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRlbG1yLmh0bWwiIHRpdGxlPSJBbiBlbGVtZW50IHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50LiBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBlbGVtZW50IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ2xvYmFsIGVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIj5BZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGFueWUuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBhbnkgZWxlbWVudCBpbiBhIHNpbWlsYXIgd2F5IGFzIGEgRFREJ3MgQU5ZIGNvbnRlbnQgbW9kZWwsIGhvd2V2ZXIsIGl0IG11c3QgYmUgZG9uZSBpbiBjb25qdW5jdGlvbiB3aXRoIG5hbWVzcGFjZXMuIFRoaXMgZW5hYmxlcyB5b3UgdG8gaW5jbHVkZSBhbnkgd2VsbC1mb3JtZWQgWE1MIGNvbnRlbnQsIHN1Y2ggYXMgYW4gSFRNTCBXZWIgcGFnZSB0aGF0IGNvbmZvcm1zIHRvIFhIVE1MIDEuMCBzeW50YXguIj5BZGRpbmcgYW4gYW55IGVsZW1lbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZ2xiYS5odG1sIiB0aXRsZT0iQSBnbG9iYWwgYXR0cmlidXRlIGlzIGFuIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSByZWNvZ25pemVkIGFueXdoZXJlIGluIGEgZG9jdW1lbnQuIE9uY2UgZGVjbGFyZWQsIGEgZ2xvYmFsIGF0dHJpYnV0ZSBjYW4gYmUgcmVmZXJlbmNlZCBpbiBvbmUgb3IgbW9yZSBkZWNsYXJhdGlvbnMgdXNpbmcgYW4gYXR0cmlidXRlIHJlZmVyZW5jZS4iPkFkZGluZyBnbG9iYWwgYXR0cmlidXRlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG1yLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG1yLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYzY2ZDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRlbG1yIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkFuIGVsZW1lbnQgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGVsZW1lbnQuDQotQSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwgZWxlbWVudCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdsb2JhbA0KLWVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcNCi1kZWNsYXJhdGlvbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+ZWxlbWVudCByZWZlcmVuY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5lbGVtZW50IHJlZmVyZW5jZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYW4gZWxlbWVudA0KLXJlZmVyZW5jZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbnRlbnQgbW9kZWwgKHNlcXVlbmNlLCBjaG9pY2UsDQotb3IgYWxsIGVsZW1lbnQpIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgRWxlbWVudCBSZWY8L3VpY29udHJvbD4uPC9jbWQ+DQotPHN0ZXByZXN1bHQ+SWYgbm8gZ2xvYmFsIGVsZW1lbnQgaXMgZGVmaW5lZCBpbiB0aGUgZG9jdW1lbnQsIGEgbmV3IGdsb2JhbA0KLWVsZW1lbnQgaXMgY3JlYXRlZCBmb3IgeW91LCBhbmQgdGhlIGVsZW1lbnQgcmVmZXJlbmNlIHdpbGwgcG9pbnQgdG8gaXQuPC9zdGVwcmVzdWx0Pg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgZWxlbWVudCByZWZlcmVuY2UuIFRvIHNwZWNpZnkgdmFsdWVzIGZvciBhbiBlbGVtZW50DQotcmVmZXJlbmNlOjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+Q2xpY2sgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoZSBEZXNpZ24gdmlldy4gRW50ZXINCi10aGUgbmFtZSBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UuPC9jaG9pY2U+DQotPGNob2ljZT5DbGljayB0aGUgZWxlbWVudCByZWZlcmVuY2UgdHlwZSBpbiB0aGUgRGVzaWduIHZpZXcuIFNlbGVjdCBhIHR5cGUNCi1mcm9tIHRoZSBtZW51LCBvciBzZWxlY3QgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gZm9yIG1vcmUgb3B0aW9ucy48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+KE9wdGlvbmFsKSBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPk1pbmltdW0NCi1PY2N1cnJlbmNlPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPjxpbmZvPlRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZ2xvYmFsDQotZWxlbWVudCByZWZlcmVuY2VkIGNhbiBhcHBlYXIgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIElmIHlvdSB3YW50IHRoZSBlbGVtZW50DQotdG8gYmUgb3B0aW9uYWwsIHNlbGVjdCA8dWljb250cm9sPjA8L3VpY29udHJvbD4uIE90aGVyd2lzZSwgc2VsZWN0IDx1aWNvbnRyb2w+MTwvdWljb250cm9sPi4gPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPihPcHRpb25hbCkgU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5NYXhpbXVtDQotT2NjdXJyZW5jZTw/UHViIENhcmV0Pz48L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+PGluZm8+VGhpcyBpcyB0aGUgbWF4aW11bQ0KLW51bWJlciBvZiB0aW1lcyB0aGUgZ2xvYmFsIGVsZW1lbnQgcmVmZXJlbmNlZCBjYW4gYXBwZWFyLiBZb3UgY2FuIHNlbGVjdCA8dWljb250cm9sPnVuYm91bmRlZDwvdWljb250cm9sPiB0bw0KLWluZGljYXRlIHRoZXJlIGlzIG5vIG1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZWxlbWVudCByZWZlcmVuY2UuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzMDM5Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG1yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG1yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NWVjMzguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBbiBlbGVtZW50IHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50LiBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBlbGVtZW50IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ2xvYmFsIGVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFuIGVsZW1lbnQgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGVsZW1lbnQuIEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGVsZW1lbnQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBnbG9iYWwgZWxlbWVudCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZWxlbWVudCByZWZlcmVuY2VzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGVsZW1lbnQgcmVmZXJlbmNlcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZ2xlbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGVsbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGFueWUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRnbGJhLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGVsbXIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkZWxtciI+PGEgbmFtZT0idGFkZGVsbXIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkFuIGVsZW1lbnQgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGVsZW1lbnQuCi1BIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBlbGVtZW50IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ2xvYmFsCi1lbGVtZW50IHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nCi1kZWNsYXJhdGlvbi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGFuIGVsZW1lbnQKLXJlZmVyZW5jZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBjb250ZW50IG1vZGVsIChzZXF1ZW5jZSwgY2hvaWNlLAotb3IgYWxsIGVsZW1lbnQpIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEVsZW1lbnQgUmVmPC9zcGFuPi48L3NwYW4+Ci0gSWYgbm8gZ2xvYmFsIGVsZW1lbnQgaXMgZGVmaW5lZCBpbiB0aGUgZG9jdW1lbnQsIGEgbmV3IGdsb2JhbAotZWxlbWVudCBpcyBjcmVhdGVkIGZvciB5b3UsIGFuZCB0aGUgZWxlbWVudCByZWZlcmVuY2Ugd2lsbCBwb2ludCB0byBpdC4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBlbGVtZW50IHJlZmVyZW5jZS4gVG8gc3BlY2lmeSB2YWx1ZXMgZm9yIGFuIGVsZW1lbnQKLXJlZmVyZW5jZTo8L3NwYW4+Ci08dWw+Ci08bGk+Q2xpY2sgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoZSBEZXNpZ24gdmlldy4gRW50ZXIKLXRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZS48L2xpPgotCi08bGk+Q2xpY2sgdGhlIGVsZW1lbnQgcmVmZXJlbmNlIHR5cGUgaW4gdGhlIERlc2lnbiB2aWV3LiBTZWxlY3QgYSB0eXBlCi1mcm9tIHRoZSBtZW51LCBvciBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBmb3IgbW9yZSBvcHRpb25zLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+KE9wdGlvbmFsKSBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NaW5pbXVtCi1PY2N1cnJlbmNlPC9zcGFuPiBmaWVsZC48L3NwYW4+IFRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZ2xvYmFsCi1lbGVtZW50IHJlZmVyZW5jZWQgY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gSWYgeW91IHdhbnQgdGhlIGVsZW1lbnQKLXRvIGJlIG9wdGlvbmFsLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MDwvc3Bhbj4uIE90aGVyd2lzZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjE8L3NwYW4+LiAKLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+KE9wdGlvbmFsKSBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXhpbXVtCi1PY2N1cnJlbmNlPC9zcGFuPiBmaWVsZC48L3NwYW4+IFRoaXMgaXMgdGhlIG1heGltdW0KLW51bWJlciBvZiB0aW1lcyB0aGUgZ2xvYmFsIGVsZW1lbnQgcmVmZXJlbmNlZCBjYW4gYXBwZWFyLiBZb3UgY2FuIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj51bmJvdW5kZWQ8L3NwYW4+IHRvCi1pbmRpY2F0ZSB0aGVyZSBpcyBubyBtYXhpbXVtIG51bWJlciBvZiBvY2N1cnJlbmNlcy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZWxlbWVudCByZWZlcmVuY2UuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRnbGVtLmh0bWwiIHRpdGxlPSJBIGdsb2JhbCBlbGVtZW50IGlzIGFuIGVsZW1lbnQgd2l0aCBhIGdsb2JhbCBzY29wZS4gSXQgaXMgb25lIHRoYXQgaGFzIGJlZW4gZGVjbGFyZWQgYXMgcGFydCBvZiB0aGUgbWFpbiBzY2hlbWEgcmF0aGVyIHRoYW4gYXMgcGFydCBvZiBhIGNvbnRlbnQgbW9kZWwuIj5BZGRpbmcgZ2xvYmFsIGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGVsbS5odG1sIiB0aXRsZT0iRWxlbWVudHMgYXJlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBpbiBYTUwuIEVsZW1lbnQgZGVjbGFyYXRpb25zIHByb3ZpZGUgdmFsdWUgY29uc3RyYWludHMsIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLCBlc3RhYmxpc2ggY29uc3RyYWluaW5nIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiByZWxhdGVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLCBhbmQgY29udHJvbCB0aGUgc3Vic3RpdHV0aW9uIG9mIGVsZW1lbnRzLiI+QWRkaW5nIGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGFueWUuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBhbnkgZWxlbWVudCBpbiBhIHNpbWlsYXIgd2F5IGFzIGEgRFREJ3MgQU5ZIGNvbnRlbnQgbW9kZWwsIGhvd2V2ZXIsIGl0IG11c3QgYmUgZG9uZSBpbiBjb25qdW5jdGlvbiB3aXRoIG5hbWVzcGFjZXMuIFRoaXMgZW5hYmxlcyB5b3UgdG8gaW5jbHVkZSBhbnkgd2VsbC1mb3JtZWQgWE1MIGNvbnRlbnQsIHN1Y2ggYXMgYW4gSFRNTCBXZWIgcGFnZSB0aGF0IGNvbmZvcm1zIHRvIFhIVE1MIDEuMCBzeW50YXguIj5BZGRpbmcgYW4gYW55IGVsZW1lbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZ2xiYS5odG1sIiB0aXRsZT0iQSBnbG9iYWwgYXR0cmlidXRlIGlzIGFuIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSByZWNvZ25pemVkIGFueXdoZXJlIGluIGEgZG9jdW1lbnQuIE9uY2UgZGVjbGFyZWQsIGEgZ2xvYmFsIGF0dHJpYnV0ZSBjYW4gYmUgcmVmZXJlbmNlZCBpbiBvbmUgb3IgbW9yZSBkZWNsYXJhdGlvbnMgdXNpbmcgYW4gYXR0cmlidXRlIHJlZmVyZW5jZS4iPkFkZGluZyBnbG9iYWwgYXR0cmlidXRlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGJhLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGJhLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYWQwNzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xiYS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRnbGJhIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBnbG9iYWwgYXR0cmlidXRlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIGdsb2JhbCBhdHRyaWJ1dGUgaXMgYW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHJlY29nbml6ZWQgYW55d2hlcmUNCi1pbiBhIGRvY3VtZW50LiBPbmNlIGRlY2xhcmVkLCBhIGdsb2JhbCBhdHRyaWJ1dGUgY2FuIGJlIHJlZmVyZW5jZWQgaW4gb25lDQotb3IgbW9yZSBkZWNsYXJhdGlvbnMgdXNpbmcgYW4gYXR0cmlidXRlIHJlZmVyZW5jZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+Z2xvYmFsIGF0dHJpYnV0ZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmdsb2JhbCBhdHRyaWJ1dGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gYWRkIGEgZ2xvYmFsDQotYXR0cmlidXRlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxiPkF0dHJpYnV0ZXM8L2I+IHNlY3Rpb24NCi1hbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgQXR0cmlidXRlPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGVudGVyIGEgbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gc2VsZWN0IHRoZSBhdHRyaWJ1dGUgPHVpY29udHJvbD5UeXBlPC91aWNvbnRyb2w+IGZyb20NCi10aGUgcHJlZGVmaW5lZCBsaXN0IGluIHRoZSBtZW51IG5leHQgdG8gdGhlIDx1aWNvbnRyb2w+VHlwZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08aW5mbz48cD5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNlbGVjdCA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiBmcm9tDQotdGhlIGxpc3QgZm9yIG1vcmUgb3B0aW9ucy4gPC9wPjxwPlRoZSBTZXQgVHlwZSBkaWFsb2cgd2lsbCBhcHBlYXIsIGFuZCBsaXN0cw0KLWFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuIFlvdSBjYW4gY2hhbmdlIHRoZSA8dWljb250cm9sPlNjb3BlPC91aWNvbnRyb2w+IG9mDQotdGhlIGxpc3QgYnkgc2VsZWN0aW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPg0KLTxsaT48dWljb250cm9sPldvcmtzcGFjZTwvdWljb250cm9sPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUgaW4NCi15b3VyIHdvcmtzcGFjZS4gPC9saT4NCi08bGk+PHVpY29udHJvbD5FbmNsb3NpbmcgUHJvamVjdDwvdWljb250cm9sPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUNCi1pbiB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHlvdXIgZmlsZS4gPC9saT4NCi08bGk+KERlZmF1bHQpIDx1aWNvbnRyb2w+Q3VycmVudCBSZXNvdXJjZTwvdWljb250cm9sPjogbGlzdCBhbGwgb2YgdGhlIHR5cGVzDQotYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+DQotPGxpPjx1aWNvbnRyb2w+V29ya2luZyBTZXRzPC91aWNvbnRyb2w+OiBsPD9QdWIgQ2FyZXQ/PmlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZQ0KLXdpdGhpbiB0aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4NCi08L3VsPjwvcD48cD5TZWxlY3QgdGhlIHR5cGUgeW91IHdhbnQgaW4gdGhlIHR5cGUgbGlzdCwgdGhlbiBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LiA8L3A+PC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBnbG9iYWwgYXR0cmlidXRlLjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjk4Mz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xiYS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xiYS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2IxNDViLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsYmEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBnbG9iYWwgYXR0cmlidXRlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBIGdsb2JhbCBhdHRyaWJ1dGUgaXMgYW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHJlY29nbml6ZWQgYW55d2hlcmUgaW4gYSBkb2N1bWVudC4gT25jZSBkZWNsYXJlZCwgYSBnbG9iYWwgYXR0cmlidXRlIGNhbiBiZSByZWZlcmVuY2VkIGluIG9uZSBvciBtb3JlIGRlY2xhcmF0aW9ucyB1c2luZyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIGdsb2JhbCBhdHRyaWJ1dGUgaXMgYW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHJlY29nbml6ZWQgYW55d2hlcmUgaW4gYSBkb2N1bWVudC4gT25jZSBkZWNsYXJlZCwgYSBnbG9iYWwgYXR0cmlidXRlIGNhbiBiZSByZWZlcmVuY2VkIGluIG9uZSBvciBtb3JlIGRlY2xhcmF0aW9ucyB1c2luZyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBnbG9iYWwgYXR0cmlidXRlcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBnbG9iYWwgYXR0cmlidXRlcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGdsYmEiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRnbGJhIj48YSBuYW1lPSJ0YWRkZ2xiYSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BIGdsb2JhbCBhdHRyaWJ1dGUgaXMgYW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHJlY29nbml6ZWQgYW55d2hlcmUKLWluIGEgZG9jdW1lbnQuIE9uY2UgZGVjbGFyZWQsIGEgZ2xvYmFsIGF0dHJpYnV0ZSBjYW4gYmUgcmVmZXJlbmNlZCBpbiBvbmUKLW9yIG1vcmUgZGVjbGFyYXRpb25zIHVzaW5nIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhIGdsb2JhbAotYXR0cmlidXRlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIGluIHRoZSA8c3Ryb25nPkF0dHJpYnV0ZXM8L3N0cm9uZz4gc2VjdGlvbgotYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBBdHRyaWJ1dGU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGVudGVyIGEgbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIHNlbGVjdCB0aGUgYXR0cmlidXRlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlR5cGU8L3NwYW4+IGZyb20KLXRoZSBwcmVkZWZpbmVkIGxpc3QgaW4gdGhlIG1lbnUgbmV4dCB0byB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VHlwZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotIDxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gZnJvbQotdGhlIGxpc3QgZm9yIG1vcmUgb3B0aW9ucy4gPC9wPgotPGRpdiBjbGFzcz0icCI+VGhlIFNldCBUeXBlIGRpYWxvZyB3aWxsIGFwcGVhciwgYW5kIGxpc3RzCi1hbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLiBZb3UgY2FuIGNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NvcGU8L3NwYW4+IG9mCi10aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya3NwYWNlPC9zcGFuPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUgaW4KLXlvdXIgd29ya3NwYWNlLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW5jbG9zaW5nIFByb2plY3Q8L3NwYW4+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+Ci0KLTxsaT4oRGVmYXVsdCkgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VycmVudCBSZXNvdXJjZTwvc3Bhbj46IGxpc3QgYWxsIG9mIHRoZSB0eXBlcwotYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JraW5nIFNldHM8L3NwYW4+OiBsaXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlCi13aXRoaW4gdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLTxwPlNlbGVjdCB0aGUgdHlwZSB5b3Ugd2FudCBpbiB0aGUgdHlwZSBsaXN0LCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi4gPC9wPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ2xvYmFsIGF0dHJpYnV0ZS48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsZW0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsZW0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhYmQwMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGVtLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGdsZW0iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBnbG9iYWwgZWxlbWVudHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBnbG9iYWwgZWxlbWVudHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QSBnbG9iYWwgZWxlbWVudCBpcyBhbiBlbGVtZW50IHdpdGggYSBnbG9iYWwgc2NvcGUuIEl0IGlzIG9uZSB0aGF0DQotaGFzIGJlZW4gZGVjbGFyZWQgYXMgcGFydCBvZiB0aGUgbWFpbiBzY2hlbWEgcmF0aGVyIHRoYW4gYXMgcGFydCBvZiBhIGNvbnRlbnQNCi1tb2RlbC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+Z2xvYmFsIGVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5nbG9iYWwgZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYSBnbG9iYWwNCi1lbGVtZW50LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIHNlbGVjdCB5b3VyIHNjaGVtYS48L2NtZD48aW5mbz5UaGUgZW50aXJlDQotc2NoZW1hIGFuZCBpdHMgY29udGVudHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgRGVzaWduIHZpZXcuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxiPkVsZW1lbnRzPC9iPiBzZWN0aW9uDQotYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEVsZW1lbnQ8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPiB0YWIsDQotYW5kIHR5cGUgYSBuZXcgbmFtZSBmb3IgdGhlIGdsb2JhbCBlbGVtZW50IGluIHRoZSA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgeW91IGNhbiBzZWxlY3QgdGhlIGF0dHJpYnV0ZSB0eXBlIGZyb20NCi10aGUgcHJlZGVmaW5lZCBsaXN0IGluIHRoZSBtZW51IG5leHQgdG8gdGhlIDx1aWNvbnRyb2w+VHlwZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08aW5mbz48cD5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNlbGVjdCA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiBmcm9tDQotdGhlIGxpc3QgZm9yIG1vcmUgb3B0aW9ucy4gPC9wPjxwPlRoZSA8dWljb250cm9sPlNldCBUeXBlPC91aWNvbnRyb2w+IGRpYWxvZw0KLWJveCBhcHBlYXJzLCBhbmQgbGlzdHMgYWxsIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4NCi1Zb3UgY2FuIGNoYW5nZSB0aGUgPHVpY29udHJvbD5TY29wZTwvdWljb250cm9sPiBvZiB0aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lDQotb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjx1bD4NCi08bGk+PHVpY29udHJvbD5Xb3Jrc3BhY2U8L3VpY29udHJvbD46IGxpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlIGluDQoteW91ciB3b3Jrc3BhY2UuIDwvbGk+DQotPGxpPjx1aWNvbnRyb2w+RW5jbG9zaW5nIFByb2plY3Q8L3VpY29udHJvbD46IGxpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlDQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+DQotPGxpPihEZWZhdWx0KSA8dWljb250cm9sPkN1cnJlbnQgUmVzb3VyY2U8L3VpY29udHJvbD46IGxpc3QgYWxsIG9mIHRoZSB0eXBlcw0KLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPg0KLTxsaT48dWljb250cm9sPldvcmtpbmcgU2V0czwvdWljb250cm9sPjogbGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4NCi10aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4NCi08L3VsPjwvcD48cD5TZWxlY3QgdGhlIHR5cGUgeW91IHdhbnQgaW4gdGhlIHR5cGUgbGlzdCwgdGhlbiBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LiA8L3A+PC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkFkdmFuY2VkPC91aWNvbnRyb2w+IHRhYi48L2NtZD48aW5mbz5JbiB0aGlzDQotcGFnZSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFyaW91cyB2YWx1ZXMgZm9yIHRoZSBnbG9iYWwgZWxlbWVudDogPC9pbmZvPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+PHVpY29udHJvbD5BYnN0cmFjdDwvdWljb250cm9sPjogY2xpY2sgPGI+dHJ1ZTwvYj4gaWYgeW91IHdhbnQgdGhlDQotZ2xvYmFsIGVsZW1lbnQgdG8gYmUgYWJzdHJhY3QuIFdoZW4gYSBnbG9iYWwgZWxlbWVudCBpcyBkZWNsYXJlZCB0byBiZSBhYnN0cmFjdCwNCi1pdCBjYW5ub3QgYmUgdXNlZCBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gSW5zdGVhZCwgYSBtZW1iZXIgb2YgdGhhdCBnbG9iYWwNCi1lbGVtZW50J3Mgc3Vic3RpdHV0aW9uIGdyb3VwIG11c3QgYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+QmxvY2s8L3VpY29udHJvbD46IGRldGVybWluZXMgd2hldGhlciB0aGUgZ2xvYmFsIGVsZW1lbnQNCi1tYXkgYmUgcmVwbGFjZWQgYnkgYW4gZWxlbWVudCBkZXJpdmVkIGZyb20gaXQuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPkZpbmFsPC91aWNvbnRyb2w+OiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBnbG9iYWwgZWxlbWVudA0KLW1heSBiZSBkZXJpdmVkIGZyb20uPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPlN1YnN0aXR1dGlvbiBHcm91cDwvdWljb250cm9sPjogYSBzdWJzdGl0dXRpb24gZ3JvdXAgYWxsb3dzDQotZWxlbWVudHMgdG8gYmUgc3Vic3RpdHV0ZWQgZm9yIG90aGVyIGVsZW1lbnRzLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5OaWxsYWJsZTwvdWljb250cm9sPjogc2VsZWN0IDxiPnRydWU8L2I+IGlmIHlvdSBkbyBub3QNCi13YW50IHRoZSBnbG9iYWwgZWxlbWVudCB0byBiZSBhYmxlIHRvIGhhdmUgYW55IGNoaWxkIGVsZW1lbnRzLCBvbmx5IGF0dHJpYnV0ZXMuIDwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiB0byBwcm92aWRlIGFueQ0KLWluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ2xvYmFsIGVsZW1lbnQuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgdG8gYWRkIGFwcGxpY2F0aW9uDQotaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UNCi1hbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPg0KLTwvc3RlcD48P1B1YiBDYXJldD8+DQotPC9zdGVwcz4NCi08cG9zdHJlcT5Zb3UgY2FuIGFkZCBhIGNvbnRlbnQgbW9kZWwgdG8gYSBnbG9iYWwgZWxlbWVudCwgd2hpY2ggaXMgdGhlIHJlcHJlc2VudGF0aW9uDQotb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSB0aGUgZ2xvYmFsIGVsZW1lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uDQotYWJvdXQgd29ya2luZyB3aXRoIGNvbnRlbnQgbW9kZWxzLCByZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrcy48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDQzODM/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsZW0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsZW0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJhMWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGVtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGdsb2JhbCBlbGVtZW50cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBIGdsb2JhbCBlbGVtZW50IGlzIGFuIGVsZW1lbnQgd2l0aCBhIGdsb2JhbCBzY29wZS4gSXQgaXMgb25lIHRoYXQgaGFzIGJlZW4gZGVjbGFyZWQgYXMgcGFydCBvZiB0aGUgbWFpbiBzY2hlbWEgcmF0aGVyIHRoYW4gYXMgcGFydCBvZiBhIGNvbnRlbnQgbW9kZWwuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZ2xvYmFsIGVsZW1lbnQgaXMgYW4gZWxlbWVudCB3aXRoIGEgZ2xvYmFsIHNjb3BlLiBJdCBpcyBvbmUgdGhhdCBoYXMgYmVlbiBkZWNsYXJlZCBhcyBwYXJ0IG9mIHRoZSBtYWluIHNjaGVtYSByYXRoZXIgdGhhbiBhcyBwYXJ0IG9mIGEgY29udGVudCBtb2RlbC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZ2xvYmFsIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGdsb2JhbCBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkY21vZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGVsbXIuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkZ2xlbSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBnbG9iYWwgZWxlbWVudHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRnbGVtIj48YSBuYW1lPSJ0YWRkZ2xlbSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGdsb2JhbCBlbGVtZW50czwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QSBnbG9iYWwgZWxlbWVudCBpcyBhbiBlbGVtZW50IHdpdGggYSBnbG9iYWwgc2NvcGUuIEl0IGlzIG9uZSB0aGF0Ci1oYXMgYmVlbiBkZWNsYXJlZCBhcyBwYXJ0IG9mIHRoZSBtYWluIHNjaGVtYSByYXRoZXIgdGhhbiBhcyBwYXJ0IG9mIGEgY29udGVudAotbW9kZWwuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhIGdsb2JhbAotZWxlbWVudCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgc2VsZWN0IHlvdXIgc2NoZW1hLjwvc3Bhbj4gVGhlIGVudGlyZQotc2NoZW1hIGFuZCBpdHMgY29udGVudHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgRGVzaWduIHZpZXcuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIGluIHRoZSA8c3Ryb25nPkVsZW1lbnRzPC9zdHJvbmc+IHNlY3Rpb24KLWFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgRWxlbWVudDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+IHRhYiwKLWFuZCB0eXBlIGEgbmV3IG5hbWUgZm9yIHRoZSBnbG9iYWwgZWxlbWVudCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIHNlbGVjdCB0aGUgYXR0cmlidXRlIHR5cGUgZnJvbQotdGhlIHByZWRlZmluZWQgbGlzdCBpbiB0aGUgbWVudSBuZXh0IHRvIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UeXBlPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci0gPHA+QWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBmcm9tCi10aGUgbGlzdCBmb3IgbW9yZSBvcHRpb25zLiA8L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2V0IFR5cGU8L3NwYW4+IGRpYWxvZwotYm94IGFwcGVhcnMsIGFuZCBsaXN0cyBhbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLgotWW91IGNhbiBjaGFuZ2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjb3BlPC9zcGFuPiBvZiB0aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lCi1vZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtzcGFjZTwvc3Bhbj46IGxpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlIGluCi15b3VyIHdvcmtzcGFjZS4gPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY2xvc2luZyBQcm9qZWN0PC9zcGFuPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUKLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPgotCi08bGk+KERlZmF1bHQpIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1cnJlbnQgUmVzb3VyY2U8L3NwYW4+OiBsaXN0IGFsbCBvZiB0aGUgdHlwZXMKLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2luZyBTZXRzPC9zcGFuPjogbGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4KLXRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPgotCi08L3VsPgotPC9kaXY+Ci08cD5TZWxlY3QgdGhlIHR5cGUgeW91IHdhbnQgaW4gdGhlIHR5cGUgbGlzdCwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uIDwvcD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWR2YW5jZWQ8L3NwYW4+IHRhYi48L3NwYW4+IEluIHRoaXMKLXBhZ2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nIHZhcmlvdXMgdmFsdWVzIGZvciB0aGUgZ2xvYmFsIGVsZW1lbnQ6IAotPHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFic3RyYWN0PC9zcGFuPjogY2xpY2sgPHN0cm9uZz50cnVlPC9zdHJvbmc+IGlmIHlvdSB3YW50IHRoZQotZ2xvYmFsIGVsZW1lbnQgdG8gYmUgYWJzdHJhY3QuIFdoZW4gYSBnbG9iYWwgZWxlbWVudCBpcyBkZWNsYXJlZCB0byBiZSBhYnN0cmFjdCwKLWl0IGNhbm5vdCBiZSB1c2VkIGluIGFuIGluc3RhbmNlIGRvY3VtZW50LiBJbnN0ZWFkLCBhIG1lbWJlciBvZiB0aGF0IGdsb2JhbAotZWxlbWVudCdzIHN1YnN0aXR1dGlvbiBncm91cCBtdXN0IGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJsb2NrPC9zcGFuPjogZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnbG9iYWwgZWxlbWVudAotbWF5IGJlIHJlcGxhY2VkIGJ5IGFuIGVsZW1lbnQgZGVyaXZlZCBmcm9tIGl0LjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5hbDwvc3Bhbj46IGRldGVybWluZXMgd2hldGhlciB0aGlzIGdsb2JhbCBlbGVtZW50Ci1tYXkgYmUgZGVyaXZlZCBmcm9tLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5TdWJzdGl0dXRpb24gR3JvdXA8L3NwYW4+OiBhIHN1YnN0aXR1dGlvbiBncm91cCBhbGxvd3MKLWVsZW1lbnRzIHRvIGJlIHN1YnN0aXR1dGVkIGZvciBvdGhlciBlbGVtZW50cy48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmlsbGFibGU8L3NwYW4+OiBzZWxlY3QgPHN0cm9uZz50cnVlPC9zdHJvbmc+IGlmIHlvdSBkbyBub3QKLXdhbnQgdGhlIGdsb2JhbCBlbGVtZW50IHRvIGJlIGFibGUgdG8gaGF2ZSBhbnkgY2hpbGQgZWxlbWVudHMsIG9ubHkgYXR0cmlidXRlcy4gPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIHRvIHByb3ZpZGUgYW55Ci1pbmZvcm1hdGlvbiBhYm91dCB0aGlzIGdsb2JhbCBlbGVtZW50Ljwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIHRvIGFkZCBhcHBsaWNhdGlvbgotaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlCi1hbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuCi08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIGFkZCBhIGNvbnRlbnQgbW9kZWwgdG8gYSBnbG9iYWwgZWxlbWVudCwgd2hpY2ggaXMgdGhlIHJlcHJlc2VudGF0aW9uCi1vZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIHRoZSBnbG9iYWwgZWxlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLWFib3V0IHdvcmtpbmcgd2l0aCBjb250ZW50IG1vZGVscywgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRjbW9kLmh0bWwiIHRpdGxlPSJBIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAuIEl0IGlzIGEgZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHBlcm1pc3NpYmxlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIGEgZG9jdW1lbnQgaW5zdGFuY2UuIj5BZGRpbmcgY29udGVudCBtb2RlbHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZWxtci5odG1sIiB0aXRsZT0iQW4gZWxlbWVudCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4gQSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwgZWxlbWVudCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdsb2JhbCBlbGVtZW50IHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiI+QWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnByLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnByLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMGVjMDIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3Jwci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRncnByIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgZ3JvdXAgcmVmZXJlbmNlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGdyb3VwIHJlZmVyZW5jZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QSBncm91cCByZWZlcmVuY2UgaXMgYSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBncm91cC4gSXQNCi1lbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQNCi1vZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmdyb3VwIGZlYXR1cmVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5ncm91cCBmZWF0dXJlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+VGhlIG1lbnUgb3B0aW9uIHRvIGFkZCBhIGdyb3VwIHJlZmVyZW5jZSBvbmx5IGFwcGVhcnMgaWYgdGhlcmUgYXJlDQotZ3JvdXBzIGRlZmluZWQgZWxzZXdoZXJlIGluIHRoZSBkb2N1bWVudC48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlDQotd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyDQotcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYSBncm91cCByZWZlcmVuY2UsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM8P1B1YiBDYXJldD8+OjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgY29udGVudCBtb2RlbCB5b3Ugd2FudCB0byB3b3JrDQotd2l0aCBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+QWRkIEdyb3VwIFJlZjwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIG5ldyBncm91cCByZWZlcmVuY2UuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgc2VsZWN0IHRoZSBncm91cCB5b3Ugd2FudCB0byByZWZlciB0byBpbg0KLXRoZSA8dWljb250cm9sPnJlZjwvdWljb250cm9sPiBsaXN0LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBncm91cCByZWZlcmVuY2UuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMDA3Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnByLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnByLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMGQ3YmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3Jwci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBncm91cCByZWZlcmVuY2UgaXMgYSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBncm91cC4gSXQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBncm91cCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBncm91cCByZWZlcmVuY2UgaXMgYSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBncm91cC4gSXQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBncm91cCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZ3JvdXAgZmVhdHVyZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZ3JvdXAgZmVhdHVyZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGdydXAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkZ3JwciIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBncm91cCByZWZlcmVuY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkZ3JwciI+PGEgbmFtZT0idGFkZGdycHIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBncm91cCByZWZlcmVuY2VzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BIGdyb3VwIHJlZmVyZW5jZSBpcyBhIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdyb3VwLiBJdAotZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBncm91cCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0Ci1vZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGUgbWVudSBvcHRpb24gdG8gYWRkIGEgZ3JvdXAgcmVmZXJlbmNlIG9ubHkgYXBwZWFycyBpZiB0aGVyZSBhcmUKLWdyb3VwcyBkZWZpbmVkIGVsc2V3aGVyZSBpbiB0aGUgZG9jdW1lbnQuPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZQotd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyCi1wZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGEgZ3JvdXAgcmVmZXJlbmNlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbnRlbnQgbW9kZWwgeW91IHdhbnQgdG8gd29yawotd2l0aCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBHcm91cCBSZWY8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgbmV3IGdyb3VwIHJlZmVyZW5jZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBzZWxlY3QgdGhlIGdyb3VwIHlvdSB3YW50IHRvIHJlZmVyIHRvIGluCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+cmVmPC9zcGFuPiBsaXN0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ3JvdXAgcmVmZXJlbmNlLjwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZ3J1cC5odG1sIiB0aXRsZT0iV2hlbiB5b3UgY3JlYXRlIGEgZ3JvdXAsIGl0IGF1dG9tYXRpY2FsbHkgY29udGFpbnMgYSBjb250ZW50IG1vZGVsLiBUaGUgY29udGVudCBtb2RlbCBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGdyb3VwZWQgdG9nZXRoZXIgYnkgdGhlIGdyb3VwLCBzdWNoIGFzIGVsZW1lbnRzLCBlbGVtZW50IHJlZmVyZW5jZXMsIGFuZCBncm91cCByZWZlcmVuY2VzLiI+QWRkaW5nIGdyb3VwczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnVwLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnVwLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OTcyMWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3J1cC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0YWRkZ3J1cCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGdyb3VwczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGdyb3Vwczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5XaGVuIHlvdSBjcmVhdGUgYSBncm91cCwgaXQgYXV0b21hdGljYWxseSBjb250YWlucyBhIGNvbnRlbnQgbW9kZWwuDQotVGhlIGNvbnRlbnQgbW9kZWwgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBncm91cGVkIHRvZ2V0aGVyDQotYnkgdGhlIGdyb3VwLCBzdWNoIGFzIGVsZW1lbnRzLCBlbGVtZW50IHJlZmVyZW5jZXMsIGFuZCBncm91cCByZWZlcmVuY2VzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5ncm91cHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmdyb3VwczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+PC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdzPD9QdWIgQ2FyZXQ/PmlsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvDQotYWRkIGEgZ3JvdXAsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgcmlnaHQtY2xpY2sgPGI+R3JvdXBzPC9iPiwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkDQotR3JvdXA8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgdHlwZSBhIG5ldyBuYW1lIGZvciB0aGUgZ3JvdXAgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ3JvdXAgZWxlbWVudC48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlDQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgZXhwYW5kIHRoZSA8dWljb250cm9sPkdyb3VwczwvdWljb250cm9sPiBmb2xkZXINCi1hbmQgeW91ciBuZXcgZ3JvdXAuPC9jbWQ+PGluZm8+WW91ciBncm91cCBhdXRvbWF0aWNhbGx5IGNvbnRhaW5zIGEgY29udGVudA0KLW1vZGVsLiBBIGdyb3VwJ3MgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4NCi1iZSBjb250YWluZWQgaW5zaWRlIHRoZSBncm91cC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd29ya2luZyB3aXRoIGNvbnRlbnQNCi1tb2RlbHMsIHJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjIzMj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3J1cC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3J1cC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2E2ZjNjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdydXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBncm91cHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iV2hlbiB5b3UgY3JlYXRlIGEgZ3JvdXAsIGl0IGF1dG9tYXRpY2FsbHkgY29udGFpbnMgYSBjb250ZW50IG1vZGVsLiBUaGUgY29udGVudCBtb2RlbCBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGdyb3VwZWQgdG9nZXRoZXIgYnkgdGhlIGdyb3VwLCBzdWNoIGFzIGVsZW1lbnRzLCBlbGVtZW50IHJlZmVyZW5jZXMsIGFuZCBncm91cCByZWZlcmVuY2VzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJXaGVuIHlvdSBjcmVhdGUgYSBncm91cCwgaXQgYXV0b21hdGljYWxseSBjb250YWlucyBhIGNvbnRlbnQgbW9kZWwuIFRoZSBjb250ZW50IG1vZGVsIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgZ3JvdXBlZCB0b2dldGhlciBieSB0aGUgZ3JvdXAsIHN1Y2ggYXMgZWxlbWVudHMsIGVsZW1lbnQgcmVmZXJlbmNlcywgYW5kIGdyb3VwIHJlZmVyZW5jZXMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGdyb3VwcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBncm91cHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGdycHIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRjbW9kLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGdydXAiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgZ3JvdXBzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkZ3J1cCI+PGEgbmFtZT0idGFkZGdydXAiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBncm91cHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPldoZW4geW91IGNyZWF0ZSBhIGdyb3VwLCBpdCBhdXRvbWF0aWNhbGx5IGNvbnRhaW5zIGEgY29udGVudCBtb2RlbC4KLVRoZSBjb250ZW50IG1vZGVsIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgZ3JvdXBlZCB0b2dldGhlcgotYnkgdGhlIGdyb3VwLCBzdWNoIGFzIGVsZW1lbnRzLCBlbGVtZW50IHJlZmVyZW5jZXMsIGFuZCBncm91cCByZWZlcmVuY2VzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHAgLz4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd3NpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvCi1hZGQgYSBncm91cCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgcmlnaHQtY2xpY2sgPHN0cm9uZz5Hcm91cHM8L3N0cm9uZz4sIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLUdyb3VwPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB0eXBlIGEgbmV3IG5hbWUgZm9yIHRoZSBncm91cCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGdyb3VwIGVsZW1lbnQuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgZXhwYW5kIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Hcm91cHM8L3NwYW4+IGZvbGRlcgotYW5kIHlvdXIgbmV3IGdyb3VwLjwvc3Bhbj4gWW91ciBncm91cCBhdXRvbWF0aWNhbGx5IGNvbnRhaW5zIGEgY29udGVudAotbW9kZWwuIEEgZ3JvdXAncyBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbgotYmUgY29udGFpbmVkIGluc2lkZSB0aGUgZ3JvdXAuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHdvcmtpbmcgd2l0aCBjb250ZW50Ci1tb2RlbHMsIHJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRncnByLmh0bWwiIHRpdGxlPSJBIGdyb3VwIHJlZmVyZW5jZSBpcyBhIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdyb3VwLiBJdCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiI+QWRkaW5nIGdyb3VwIHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkY21vZC5odG1sIiB0aXRsZT0iQSBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLiBJdCBpcyBhIGZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlIGFuZCBwZXJtaXNzaWJsZSBjb250ZW50IG9mIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCB3aGljaCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBhIGRvY3VtZW50IGluc3RhbmNlLiI+QWRkaW5nIGNvbnRlbnQgbW9kZWxzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGltcHQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGltcHQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwZDE1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbXB0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwOCwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGltcHQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBpbXBvcnQgZWxlbWVudHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBpbXBvcnQgZWxlbWVudHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SWYgeW91ciBzY2hlbWFzIGFyZSBsYXJnZSwgeW91IG1pZ2h0IGNob29zZSB0byBkaXZpZGUgdGhlaXINCi1jb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyB0byBtYWtlIHRoZW0gZWFzaWVyIHRvIG1haW50YWluLA0KLXJldXNlLCBhbmQgcmVhZC4gWW91IGNhbiB1c2UgYW4gPGNvZGVwaD5pbXBvcnQ8L2NvZGVwaD4gZWxlbWVudCB0bw0KLWJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50bw0KLXRoZSBjdXJyZW50IHNjaGVtYS4gPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmltcG9ydCBlbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+aW1wb3J0IGVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Zb3UgY2FuIGltcG9ydCBhIHNjaGVtYSBmcm9tIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuDQotdGhlIGN1cnJlbnQgc2NoZW1hLiBZb3UgY2FuIGFkZCBtdWx0aXBsZSBpbXBvcnQgZWxlbWVudHMgdG8gYW4gWE1MDQotc2NoZW1hOyBob3dldmVyLCBhbiBpbXBvcnRlZCBzY2hlbWEgY2Fubm90IGhhdmUgdGhlIHNhbWUgbmFtZXNwYWNlDQotb3IgcHJlZml4IGFzIGFub3RoZXIgaW1wb3J0ZWQgc2NoZW1hLjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucw0KLXdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yaw0KLWluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYW4gaW1wb3J0IGVsZW1lbnQsIGNvbXBsZXRlDQotdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIGluIHRoZSA8Yj5EaXJlY3RpdmVzPC9iPiBzZWN0aW9uDQotYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEltcG9ydDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgU2VsZWN0IFhNTCBzY2hlbWEgZmlsZSB3aXphcmQsIHlvdSBjYW4gaW1wb3J0IGFuDQotWE1MIHNjaGVtYSB0aGF0IGlzIGxvY2F0ZWQgaW4geW91ciB3b3Jrc3BhY2Ugb3IgeW91IGNhbiBpbXBvcnQgYSBzY2hlbWENCi1mcm9tIGFuIEhUVFAgV2ViIGFkZHJlc3MuPC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5JZiB5b3Ugd2FudCB0byBpbXBvcnQgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIGluIHlvdXIgd29ya3NwYWNlOjxvbD4NCi08bGk+U2VsZWN0IDx1aWNvbnRyb2w+V29ya2JlbmNoIHByb2plY3RzPC91aWNvbnRyb2w+IGFuZCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uIDwvbGk+DQotPGxpPlNlbGVjdCB0aGUgc2NoZW1hIHRoYXQgeW91IHdhbnQgdG8gaW1wb3J0IGFuZCBjbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2xpPg0KLTwvb2w+PC9jaG9pY2U+DQotPGNob2ljZT5JZiB5b3Ugd2FudCB0byBpbXBvcnQgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIGF0IGFuIEhUVFAgV2ViDQotYWRkcmVzczo8b2w+DQotPGxpPlNlbGVjdCA8dWljb250cm9sPkhUVFA8L3VpY29udHJvbD4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2xpPg0KLTxsaT5UeXBlIHRoZSBVUkwgb2YgdGhlIFhNTCBzY2hlbWEgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+Ljxub3RlPkENCi1sb2NhbCBjb3B5IG9mIHRoZSBzY2hlbWEgaXMgbm90IHN0b3JlZCBpbiB5b3VyIHdvcmtzcGFjZS4gSWYgeW91IHZhbGlkYXRlDQoteW91ciBzY2hlbWEsIHRoZSBzY2hlbWEncyBjb250ZW50cyBhcmUgY2hlY2tlZCBmcm9tIHRoZSBVUkwgdGhhdCB5b3UNCi1zcGVjaWZ5Ljwvbm90ZT48L2xpPg0KLTwvb2w+PC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5Vc2UgdGhlIFByb3BlcnRpZXMgdmlldyB0byBkZWZpbmUNCi1hZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIHlvdXIgaW1wb3J0IGVsZW1lbnQuPC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gYWRkIGEgdW5pcXVlIHByZWZpeCBmb3IgdGhpcyBuYW1lc3BhY2UsDQotY2xpY2sgdGhlIDx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPiB0YWIgYW5kIHR5cGUgdGhlIHByZWZpeCBpbg0KLXRoZSA8dWljb250cm9sPlByZWZpeDwvdWljb250cm9sPiBmaWVsZC48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZg0KLXlvdSB3YW50IHRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wb3J0IGVsZW1lbnQuIDwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZSBpcyB1c2VkIGZvciBodW1hbg0KLXJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdQ0KLXdhbnQgdG8gYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2YNCi1zY2hlbWEgY29tcG9uZW50cy4gPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlDQotYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBzY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz4NCi08L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPC9zdGVwcz48P1B1YiBDYXJldDE/Pg0KLTxyZXN1bHQ+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCBhbiBpbXBvcnQgZWxlbWVudCB0byB5b3VyIFhNTCBzY2hlbWEsDQotd2hlbiB5b3UgZGVmaW5lIG5ldyBlbGVtZW50cywgYXR0cmlidXRlcywgY29tcGxleCB0eXBlcywgb3Igc2ltcGxlDQotdHlwZXMgd2hlcmUgeW91IGNhbiBzcGVjaWZ5IHR5cGUgaW5mb3JtYXRpb24sIGFueSBkZWNsYXJhdGlvbnMgZnJvbQ0KLXRoZSBpbmNsdWRlZCBzY2hlbWEgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIDx1aWNvbnRyb2w+VHlwZTwvdWljb250cm9sPiBsaXN0DQotZm9yIHRoZSBlbGVtZW50LCBhdHRyaWJ1dGUsIGNvbXBsZXggb3Igc2ltcGxlIHR5cGUuPC9wPjwvcmVzdWx0Pg0KLTxwb3N0cmVxPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzc1Nj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW1wdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW1wdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzAwODNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGltcHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgaW1wb3J0IGVsZW1lbnRzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdXIgc2NoZW1hcyBhcmUgbGFyZ2UsIHlvdSBtaWdodCBjaG9vc2UgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIHRvIG1ha2UgdGhlbSBlYXNpZXIgdG8gbWFpbnRhaW4sIHJldXNlLCBhbmQgcmVhZC4gWW91IGNhbiB1c2UgYW4gaW1wb3J0IGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIGFuIGltcG9ydGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSWYgeW91ciBzY2hlbWFzIGFyZSBsYXJnZSwgeW91IG1pZ2h0IGNob29zZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgdG8gbWFrZSB0aGVtIGVhc2llciB0byBtYWludGFpbiwgcmV1c2UsIGFuZCByZWFkLiBZb3UgY2FuIHVzZSBhbiBpbXBvcnQgZWxlbWVudCB0byBicmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gYW4gaW1wb3J0ZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBpbXBvcnQgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgaW1wb3J0IGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRpbmNsLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkcmRmbi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3Mvcm5tc3BjLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGltcHQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgaW1wb3J0IGVsZW1lbnRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkaW1wdCI+PGEgbmFtZT0idGFkZGltcHQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBpbXBvcnQgZWxlbWVudHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIHlvdXIgc2NoZW1hcyBhcmUgbGFyZ2UsIHlvdSBtaWdodCBjaG9vc2UgdG8gZGl2aWRlIHRoZWlyCi1jb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyB0byBtYWtlIHRoZW0gZWFzaWVyIHRvIG1haW50YWluLAotcmV1c2UsIGFuZCByZWFkLiBZb3UgY2FuIHVzZSBhbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5pbXBvcnQ8L3NhbXA+IGVsZW1lbnQgdG8KLWJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50bwotdGhlIGN1cnJlbnQgc2NoZW1hLiA8L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gaW1wb3J0IGEgc2NoZW1hIGZyb20gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4KLXRoZSBjdXJyZW50IHNjaGVtYS4gWW91IGNhbiBhZGQgbXVsdGlwbGUgaW1wb3J0IGVsZW1lbnRzIHRvIGFuIFhNTAotc2NoZW1hOyBob3dldmVyLCBhbiBpbXBvcnRlZCBzY2hlbWEgY2Fubm90IGhhdmUgdGhlIHNhbWUgbmFtZXNwYWNlCi1vciBwcmVmaXggYXMgYW5vdGhlciBpbXBvcnRlZCBzY2hlbWEuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMKLXdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yawotaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGFuIGltcG9ydCBlbGVtZW50LCBjb21wbGV0ZQotdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxzdHJvbmc+RGlyZWN0aXZlczwvc3Ryb25nPiBzZWN0aW9uCi1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEltcG9ydDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5JbiB0aGUgU2VsZWN0IFhNTCBzY2hlbWEgZmlsZSB3aXphcmQsIHlvdSBjYW4gaW1wb3J0IGFuCi1YTUwgc2NoZW1hIHRoYXQgaXMgbG9jYXRlZCBpbiB5b3VyIHdvcmtzcGFjZSBvciB5b3UgY2FuIGltcG9ydCBhIHNjaGVtYQotZnJvbSBhbiBIVFRQIFdlYiBhZGRyZXNzLjwvc3Bhbj4KLTx1bD4KLTxsaT5JZiB5b3Ugd2FudCB0byBpbXBvcnQgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIGluIHlvdXIgd29ya3NwYWNlOjxvbCB0eXBlPSJhIj4KLTxsaT5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoIHByb2plY3RzPC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIDwvbGk+Ci0KLTxsaT5TZWxlY3QgdGhlIHNjaGVtYSB0aGF0IHlvdSB3YW50IHRvIGltcG9ydCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L2xpPgotCi08L29sPgotPC9saT4KLQotPGxpPklmIHlvdSB3YW50IHRvIGltcG9ydCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgYXQgYW4gSFRUUCBXZWIKLWFkZHJlc3M6PG9sIHR5cGU9ImEiPgotPGxpPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVFRQPC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9saT4KLQotPGxpPlR5cGUgdGhlIFVSTCBvZiB0aGUgWE1MIHNjaGVtYSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQQotbG9jYWwgY29weSBvZiB0aGUgc2NoZW1hIGlzIG5vdCBzdG9yZWQgaW4geW91ciB3b3Jrc3BhY2UuIElmIHlvdSB2YWxpZGF0ZQoteW91ciBzY2hlbWEsIHRoZSBzY2hlbWEncyBjb250ZW50cyBhcmUgY2hlY2tlZCBmcm9tIHRoZSBVUkwgdGhhdCB5b3UKLXNwZWNpZnkuPC9kaXY+Ci08L2xpPgotCi08L29sPgotPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPlVzZSB0aGUgUHJvcGVydGllcyB2aWV3IHRvIGRlZmluZQotYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciB5b3VyIGltcG9ydCBlbGVtZW50Ljwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gYWRkIGEgdW5pcXVlIHByZWZpeCBmb3IgdGhpcyBuYW1lc3BhY2UsCi1jbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gdGFiIGFuZCB0eXBlIHRoZSBwcmVmaXggaW4KLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmaXg8L3NwYW4+IGZpZWxkLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYKLXlvdSB3YW50IHRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wb3J0IGVsZW1lbnQuIDwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZSBpcyB1c2VkIGZvciBodW1hbgotcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91Ci13YW50IHRvIGFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mCi1zY2hlbWEgY29tcG9uZW50cy4gPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZQotYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBzY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCBhbiBpbXBvcnQgZWxlbWVudCB0byB5b3VyIFhNTCBzY2hlbWEsCi13aGVuIHlvdSBkZWZpbmUgbmV3IGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBjb21wbGV4IHR5cGVzLCBvciBzaW1wbGUKLXR5cGVzIHdoZXJlIHlvdSBjYW4gc3BlY2lmeSB0eXBlIGluZm9ybWF0aW9uLCBhbnkgZGVjbGFyYXRpb25zIGZyb20KLXRoZSBpbmNsdWRlZCBzY2hlbWEgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlR5cGU8L3NwYW4+IGxpc3QKLWZvciB0aGUgZWxlbWVudCwgYXR0cmlidXRlLCBjb21wbGV4IG9yIHNpbXBsZSB0eXBlLjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiAvPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkaW5jbC5odG1sIiB0aXRsZT0iSWYgeW91ciBzY2hlbWFzIGFyZSBsYXJnZSwgeW91IG1pZ2h0IGNob29zZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgdG8gbWFrZSB0aGVtIGVhc2llciB0byBtYWludGFpbiwgcmV1c2UsIGFuZCByZWFkLiBZb3UgY2FuIHVzZSB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgaW5jbHVkaW5nIHNjaGVtYS4iPkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZHJkZm4uaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSByZWRlZmluZSBtZWNoYW5pc20gdG8gcmVkZWZpbmUgc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZCBhdHRyaWJ1dGUgZ3JvdXBzIG9idGFpbmVkIGZyb20gZXh0ZXJuYWwgc2NoZW1hIGZpbGVzLiBXaGVuIHlvdSByZWRlZmluZSBhIGNvbXBvbmVudCwgeW91IGFyZSBtb2RpZnlpbmcgaXRzIGNvbnRlbnRzLiI+QWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxyZWYiPjxzdHJvbmc+UmVsYXRlZCByZWZlcmVuY2U8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3JubXNwYy5odG1sIiB0aXRsZT0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iPlhNTCBuYW1lc3BhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGluY2wuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGluY2wuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwMTFlZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbmNsLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwOCwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGluY2wiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgaW5jbHVkZSBlbGVtZW50czwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JZiB5b3VyIHNjaGVtYXMgYXJlIGxhcmdlLCB5b3UgbWlnaHQgY2hvb3NlIHRvIGRpdmlkZSB0aGVpcg0KLWNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIHRvIG1ha2UgdGhlbSBlYXNpZXIgdG8gbWFpbnRhaW4sDQotcmV1c2UsIGFuZCByZWFkLiAgWW91IGNhbiB1c2UgdGhlIDxjb2RlcGg+aW5jbHVkZTwvY29kZXBoPiBlbGVtZW50DQotdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWENCi1pbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4gVGhlIGluY2x1ZGVkIHNjaGVtYSBtdXN0IGJlIGluIHRoZSBzYW1lIHRhcmdldA0KLW5hbWVzcGFjZSBhcyB0aGUgaW5jbHVkaW5nIHNjaGVtYS4gPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmluY2x1ZGUgZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmluY2x1ZGUgZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWFkZCBhbiBpbmNsdWRlIGVsZW1lbnQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPGI+RGlyZWN0aXZlczwvYj4gc2VjdGlvbg0KLWFuZCBjbGljayA8dWljb250cm9sPkFkZCBJbmNsdWRlPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBTZWxlY3QgWE1MIHNjaGVtYSBmaWxlIHdpemFyZCwgeW91IGNhbiBpbmNsdWRlIGFuDQotWE1MIHNjaGVtYSB0aGF0IGlzIGxvY2F0ZWQgaW4geW91ciB3b3Jrc3BhY2Ugb3IgeW91IGNhbiBpbmNsdWRlIGENCi1zY2hlbWEgZnJvbSBhbiBIVFRQIFdlYiBhZGRyZXNzLiBUaGUgWE1MIHNjaGVtYSBmaWxlIHRoYXQgeW91IHNlbGVjdA0KLW11c3QgaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIGN1cnJlbnQgc2NoZW1hLjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+SWYgeW91IHdhbnQgdG8gaW5jbHVkZSBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgaW4geW91ciB3b3Jrc3BhY2U6PG9sPg0KLTxsaT5TZWxlY3QgPHVpY29udHJvbD5Xb3JrYmVuY2ggcHJvamVjdHM8L3VpY29udHJvbD4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi4gPC9saT4NCi08bGk+U2VsZWN0IHRoZSBzY2hlbWEgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvbGk+DQotPC9vbD48L2Nob2ljZT4NCi08Y2hvaWNlPklmIHlvdSB3YW50IHRvIGluY2x1ZGUgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIGF0IGFuIEhUVFAgV2ViDQotYWRkcmVzczo8b2w+DQotPGxpPlNlbGVjdCA8dWljb250cm9sPkhUVFA8L3VpY29udHJvbD4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2xpPg0KLTxsaT5UeXBlIHRoZSBVUkwgb2YgdGhlIFhNTCBzY2hlbWEgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+Ljxub3RlPkENCi1sb2NhbCBjb3B5IG9mIHRoZSBzY2hlbWEgaXMgbm90IHN0b3JlZCBpbiB5b3VyIHdvcmtzcGFjZS4gSWYgeW91IHZhbGlkYXRlDQoteW91ciBzY2hlbWEsIHRoZSBzY2hlbWEncyBjb250ZW50cyBhcmUgY2hlY2tlZCBmcm9tIHRoZSBVUkwgdGhhdCB5b3UNCi1zcGVjaWZ5Ljwvbm90ZT48L2xpPg0KLTwvb2w+PC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5Vc2UgdGhlIFByb3BlcnRpZXMgdmlldyB0byBkZWZpbmUNCi1hZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIHlvdXIgaW1wb3J0IGVsZW1lbnQuPC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gZWRpdCB0aGUgbG9jYXRpb24gb2YgdGhlIGluY2x1ZGVkIFhNTA0KLXNjaGVtYSBmaWxlLCBjbGljayB0aGUgPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+IHRhYiBhbmQgdHlwZQ0KLXRoZSBuZXcgbG9jYXRpb24gZGlzcGxheSBpbiB0aGUgPHVpY29udHJvbD5TY2hlbWEgbG9jYXRpb248L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYNCi15b3Ugd2FudCB0byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGluY2x1ZGU8P1B1YiBDYXJldD8+DQotZWxlbWVudC4gPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91DQotd2FudCB0byBhZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZg0KLXNjaGVtYSBjb21wb25lbnRzLiA8L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UNCi1hbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPg0KLTwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIHlvdXIgWE1MIHNjaGVtYSwNCi13aGVuIHlvdSBkZWZpbmUgbmV3IGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBjb21wbGV4IHR5cGVzLCBvciBzaW1wbGUNCi10eXBlcyB3aGVyZSB5b3UgY2FuIHNwZWNpZnkgdHlwZSBpbmZvcm1hdGlvbiwgYW55IGRlY2xhcmF0aW9ucyBmcm9tDQotdGhlIGluY2x1ZGVkIHNjaGVtYSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgPHVpY29udHJvbD5UeXBlPC91aWNvbnRyb2w+IGxpc3QNCi1mb3IgdGhlIGVsZW1lbnQsIGF0dHJpYnV0ZSwgY29tcGxleCBvciBzaW1wbGUgdHlwZS48L3A+PHA+Rm9yIGV4YW1wbGUsDQotaWYgQWRkcmVzcy54c2QgaGFzIHRoZSBmb2xsb3dpbmcgY29udGVudDo8L3A+PGNvZGVibG9jaz4mbHQ7Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzcyI+DQotICAgICZsdDtzZXF1ZW5jZT4NCi0gICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzdHJlZXQiIHR5cGU9InN0cmluZyI+DQotICAgICZsdDsvc2VxdWVuY2U+DQotJmx0Oy9jb21wbGV4VHlwZT4NCi08L2NvZGVibG9jaz5hbmQgeW91IGhhdmUgYW4gWE1MIHNjaGVtYSBjYWxsZWQgUHVyY2hhc2VPcmRlci54c2QgdGhhdA0KLWhhcyBhZGRlZCBhbiBpbmNsdWRlIGZvciBBZGRyZXNzLnhzZCwgdGhlbiB3aGVuIGRlZmluaW5nIGEgbmV3IGVsZW1lbnQNCi1pbiAgUHVyY2hhc2VPcmRlciwgeW91IGNhbiBzZWxlY3QgQWRkcmVzcyBhcyBpdHMgdHlwZS4gIDwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDA0MTc0Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbmNsLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbmNsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOWQ1MmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW5jbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdXIgc2NoZW1hcyBhcmUgbGFyZ2UsIHlvdSBtaWdodCBjaG9vc2UgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIHRvIG1ha2UgdGhlbSBlYXNpZXIgdG8gbWFpbnRhaW4sIHJldXNlLCBhbmQgcmVhZC4gWW91IGNhbiB1c2UgdGhlIGluY2x1ZGUgZWxlbWVudCB0byBicmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gdGhlIGluY2x1ZGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4gVGhlIGluY2x1ZGVkIHNjaGVtYSBtdXN0IGJlIGluIHRoZSBzYW1lIHRhcmdldCBuYW1lc3BhY2UgYXMgdGhlIGluY2x1ZGluZyBzY2hlbWEuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IklmIHlvdXIgc2NoZW1hcyBhcmUgbGFyZ2UsIHlvdSBtaWdodCBjaG9vc2UgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIHRvIG1ha2UgdGhlbSBlYXNpZXIgdG8gbWFpbnRhaW4sIHJldXNlLCBhbmQgcmVhZC4gWW91IGNhbiB1c2UgdGhlIGluY2x1ZGUgZWxlbWVudCB0byBicmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gdGhlIGluY2x1ZGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4gVGhlIGluY2x1ZGVkIHNjaGVtYSBtdXN0IGJlIGluIHRoZSBzYW1lIHRhcmdldCBuYW1lc3BhY2UgYXMgdGhlIGluY2x1ZGluZyBzY2hlbWEuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGluY2x1ZGUgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgaW5jbHVkZSBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkaW1wdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZHJkZm4uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3JubXNwYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRpbmNsIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGluY2x1ZGUgZWxlbWVudHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRpbmNsIj48YSBuYW1lPSJ0YWRkaW5jbCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGluY2x1ZGUgZWxlbWVudHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIHlvdXIgc2NoZW1hcyBhcmUgbGFyZ2UsIHlvdSBtaWdodCBjaG9vc2UgdG8gZGl2aWRlIHRoZWlyCi1jb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyB0byBtYWtlIHRoZW0gZWFzaWVyIHRvIG1haW50YWluLAotcmV1c2UsIGFuZCByZWFkLiAgWW91IGNhbiB1c2UgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmluY2x1ZGU8L3NhbXA+IGVsZW1lbnQKLXRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hCi1pbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4gVGhlIGluY2x1ZGVkIHNjaGVtYSBtdXN0IGJlIGluIHRoZSBzYW1lIHRhcmdldAotbmFtZXNwYWNlIGFzIHRoZSBpbmNsdWRpbmcgc2NoZW1hLiA8L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLWFkZCBhbiBpbmNsdWRlIGVsZW1lbnQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIGluIHRoZSA8c3Ryb25nPkRpcmVjdGl2ZXM8L3N0cm9uZz4gc2VjdGlvbgotYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBJbmNsdWRlPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSBTZWxlY3QgWE1MIHNjaGVtYSBmaWxlIHdpemFyZCwgeW91IGNhbiBpbmNsdWRlIGFuCi1YTUwgc2NoZW1hIHRoYXQgaXMgbG9jYXRlZCBpbiB5b3VyIHdvcmtzcGFjZSBvciB5b3UgY2FuIGluY2x1ZGUgYQotc2NoZW1hIGZyb20gYW4gSFRUUCBXZWIgYWRkcmVzcy4gVGhlIFhNTCBzY2hlbWEgZmlsZSB0aGF0IHlvdSBzZWxlY3QKLW11c3QgaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIGN1cnJlbnQgc2NoZW1hLjwvc3Bhbj4KLTx1bD4KLTxsaT5JZiB5b3Ugd2FudCB0byBpbmNsdWRlIGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBpbiB5b3VyIHdvcmtzcGFjZTo8b2wgdHlwZT0iYSI+Ci08bGk+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaCBwcm9qZWN0czwvc3Bhbj4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+LiA8L2xpPgotCi08bGk+U2VsZWN0IHRoZSBzY2hlbWEgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9saT4KLQotPC9vbD4KLTwvbGk+Ci0KLTxsaT5JZiB5b3Ugd2FudCB0byBpbmNsdWRlIGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBhdCBhbiBIVFRQIFdlYgotYWRkcmVzczo8b2wgdHlwZT0iYSI+Ci08bGk+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUVFA8L3NwYW4+IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L2xpPgotCi08bGk+VHlwZSB0aGUgVVJMIG9mIHRoZSBYTUwgc2NoZW1hIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+LjxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBBCi1sb2NhbCBjb3B5IG9mIHRoZSBzY2hlbWEgaXMgbm90IHN0b3JlZCBpbiB5b3VyIHdvcmtzcGFjZS4gSWYgeW91IHZhbGlkYXRlCi15b3VyIHNjaGVtYSwgdGhlIHNjaGVtYSdzIGNvbnRlbnRzIGFyZSBjaGVja2VkIGZyb20gdGhlIFVSTCB0aGF0IHlvdQotc3BlY2lmeS48L2Rpdj4KLTwvbGk+Ci0KLTwvb2w+Ci08L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGk+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+VXNlIHRoZSBQcm9wZXJ0aWVzIHZpZXcgdG8gZGVmaW5lCi1hZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIHlvdXIgaW1wb3J0IGVsZW1lbnQuPC9zcGFuPgotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBlZGl0IHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5jbHVkZWQgWE1MCi1zY2hlbWEgZmlsZSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+IHRhYiBhbmQgdHlwZQotdGhlIG5ldyBsb2NhdGlvbiBkaXNwbGF5IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TY2hlbWEgbG9jYXRpb248L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZgoteW91IHdhbnQgdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbmNsdWRlCi1lbGVtZW50LiA8L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdQotd2FudCB0byBhZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZgotc2NoZW1hIGNvbXBvbmVudHMuIDwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UKLWFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPk9uY2UgeW91IGhhdmUgYWRkZWQgdGhlIGluY2x1ZGUgZWxlbWVudCB0byB5b3VyIFhNTCBzY2hlbWEsCi13aGVuIHlvdSBkZWZpbmUgbmV3IGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBjb21wbGV4IHR5cGVzLCBvciBzaW1wbGUKLXR5cGVzIHdoZXJlIHlvdSBjYW4gc3BlY2lmeSB0eXBlIGluZm9ybWF0aW9uLCBhbnkgZGVjbGFyYXRpb25zIGZyb20KLXRoZSBpbmNsdWRlZCBzY2hlbWEgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlR5cGU8L3NwYW4+IGxpc3QKLWZvciB0aGUgZWxlbWVudCwgYXR0cmlidXRlLCBjb21wbGV4IG9yIHNpbXBsZSB0eXBlLjwvcD4KLTxwPkZvciBleGFtcGxlLAotaWYgQWRkcmVzcy54c2QgaGFzIHRoZSBmb2xsb3dpbmcgY29udGVudDo8L3A+Ci08cHJlPiZsdDtjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIiZndDsKLSAgICAmbHQ7c2VxdWVuY2UmZ3Q7Ci0gICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyImZ3Q7Ci0gICAgICAgICZsdDtlbGVtZW50IG5hbWU9InN0cmVldCIgdHlwZT0ic3RyaW5nIiZndDsKLSAgICAmbHQ7L3NlcXVlbmNlJmd0OwotJmx0Oy9jb21wbGV4VHlwZSZndDsKLTwvcHJlPgotYW5kIHlvdSBoYXZlIGFuIFhNTCBzY2hlbWEgY2FsbGVkIFB1cmNoYXNlT3JkZXIueHNkIHRoYXQKLWhhcyBhZGRlZCBhbiBpbmNsdWRlIGZvciBBZGRyZXNzLnhzZCwgdGhlbiB3aGVuIGRlZmluaW5nIGEgbmV3IGVsZW1lbnQKLWluICBQdXJjaGFzZU9yZGVyLCB5b3UgY2FuIHNlbGVjdCBBZGRyZXNzIGFzIGl0cyB0eXBlLiAgPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRpbXB0Lmh0bWwiIHRpdGxlPSJJZiB5b3VyIHNjaGVtYXMgYXJlIGxhcmdlLCB5b3UgbWlnaHQgY2hvb3NlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyB0byBtYWtlIHRoZW0gZWFzaWVyIHRvIG1haW50YWluLCByZXVzZSwgYW5kIHJlYWQuIFlvdSBjYW4gdXNlIGFuIGltcG9ydCBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIj5BZGRpbmcgaW1wb3J0IGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZHJkZm4uaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSByZWRlZmluZSBtZWNoYW5pc20gdG8gcmVkZWZpbmUgc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZCBhdHRyaWJ1dGUgZ3JvdXBzIG9idGFpbmVkIGZyb20gZXh0ZXJuYWwgc2NoZW1hIGZpbGVzLiBXaGVuIHlvdSByZWRlZmluZSBhIGNvbXBvbmVudCwgeW91IGFyZSBtb2RpZnlpbmcgaXRzIGNvbnRlbnRzLiI+QWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxyZWYiPjxzdHJvbmc+UmVsYXRlZCByZWZlcmVuY2U8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3JubXNwYy5odG1sIiB0aXRsZT0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iPlhNTCBuYW1lc3BhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZG5vdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkbm90LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MjhkMDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkbm90LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZG5vdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIG5vdGF0aW9uczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIG5vdGF0aW9uczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIG5vdGF0aW9uIGlzIGEgbWVhbnMgb2YgYXNzb2NpYXRpbmcgYSBiaW5hcnkgZGVzY3JpcHRpb24gd2l0aA0KLWFuIGVudGl0eSBvciBhdHRyaWJ1dGUuIFRoZSBtb3N0IGNvbW1vbiB1c2VzIG9mIG5vdGF0aW9ucyBhcmUgdG8gaW5jbHVkZSBmYW1pbGlhcg0KLXR5cGVzIG9mIGJpbmFyeSByZWZlcmVuY2VzLCBzdWNoIGFzIEdJRnMgYW5kIEpQR3MsIGluIGFuIFhNTCBmaWxlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5ub3RhdGlvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPm5vdGF0aW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+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+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyOTU5Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRub3QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZG5vdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTA3OGIwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZG5vdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5BZGRpbmcgbm90YXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkbm90Ij48YSBuYW1lPSJ0YWRkbm90Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIG5vdGF0aW9uczwvaDE+Ci08ZGl2PjxwPkEgbm90YXRpb24gaXMgYSBtZWFucyBvZiBhc3NvY2lhdGluZyBhIGJpbmFyeSBkZXNjcmlwdGlvbiB3aXRoCi1hbiBlbnRpdHkgb3IgYXR0cmlidXRlLiBUaGUgbW9zdCBjb21tb24gdXNlcyBvZiBub3RhdGlvbnMgYXJlIHRvIGluY2x1ZGUgZmFtaWxpYXIKLXR5cGVzIG9mIGJpbmFyeSByZWZlcmVuY2VzLCBzdWNoIGFzIEdJRnMgYW5kIEpQR3MsIGluIGFuIFhNTCBmaWxlLjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkZvciBleGFtcGxlLCB5b3UgYXJlIG1ha2luZyBhIGNhdGFsb2d1ZSBvZiB5b3VyIGNsb3RoaW5nIGFuZCB3YW50Ci10byBpbmNsdWRlIGFuIGltYWdlIG9mIG9uZSBvZiB5b3VyIHNoaXJ0cy4gWW91IHdvdWxkIGhhdmUgdG8gY3JlYXRlIGEgbm90YXRpb24KLWxpa2UgdGhpczogIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+Jmx0O25vdGF0aW9uIG5hbWU9Ik15X1NoaXJ0IiBzeXN0ZW09IkdJRiImZ3Q7Jmx0Oy9ub3RhdGlvbiZndDs8L2tiZD4gd2hpY2gKLWRlZmluZXMgYSBub3RhdGlvbiBmb3IgYSBHSUYgaW1hZ2UuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCAKLXRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLWNyZWF0ZSBhIG5vdGF0aW9uLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayB5b3VyIFhNTCBzY2hlbWEgYW5kIGNsaWNrIAotPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZAotTm90YXRpb248L3NwYW4+PC9iPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB0eXBlIHRoZSBuYW1lIG9mIHRoZSBub3RhdGlvbiBpbiB0aGUgCi08Yj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj48L2I+IGZpZWxkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkNsaWNrIHRoZSA8Yj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3RoZXI8L3NwYW4+PC9iPiB0YWIuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+SW4gdGhlIDxiPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5wdWJsaWM8L3NwYW4+PC9iPiBmaWVsZCwgdHlwZSBhIHB1YmxpYyBpZGVudGlmaWVyLjwvc3Bhbj4gIFRoaXMgaXMgb3B0aW9uYWwgaWYgeW91IGVudGVyIGEgdmFsdWUgaW4gdGhlIAotPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnN5c3RlbTwvc3Bhbj48L2I+IGZpZWxkLjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+SW4gdGhlIDxiPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5zeXN0ZW08L3NwYW4+PC9iPiBmaWVsZCwgdHlwZSBhIFVSSSByZWZlcmVuY2UuPC9zcGFuPiAgVGhpcyBpcyBvcHRpb25hbCBpZiB5b3UgZW50ZXIgYSB2YWx1ZSBpbiB0aGUgCi08Yj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+cHVibGljPC9zcGFuPjwvYj4gZmllbGQuPC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5DbGljayB0aGUgPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+PC9iPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbm90YXRpb24uPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbiwgYW5kIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHAKLUluZm88L3NwYW4+IHBhZ2UgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb25zLjwvbGk+Ci08L29sPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmRmbi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmRmbi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODVlNjJlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJkZm4uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA4LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkcmRmbiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiB1c2UgdGhlIDxjb2RlcGg+cmVkZWZpbmU8L2NvZGVwaD4gbWVjaGFuaXNtIHRvDQotcmVkZWZpbmUgc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZCBhdHRyaWJ1dGUgZ3JvdXBzIG9idGFpbmVkDQotZnJvbSBleHRlcm5hbCBzY2hlbWEgZmlsZXMuIFdoZW4geW91IHJlZGVmaW5lIGEgY29tcG9uZW50LCB5b3UgYXJlDQotbW9kaWZ5aW5nIGl0cyBjb250ZW50cy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5hZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPkxpa2UgdGhlIDxjb2RlcGg+aW5jbHVkZTwvY29kZXBoPiBtZWNoYW5pc20sIDxjb2RlcGg+cmVkZWZpbmU8L2NvZGVwaD4gcmVxdWlyZXMNCi10aGUgZXh0ZXJuYWwgY29tcG9uZW50cyB0byBiZSBpbiB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZQ0KLXJlZGVmaW5pbmcgc2NoZW1hLCBhbHRob3VnaCBleHRlcm5hbCBjb21wb25lbnRzIGZyb20gc2NoZW1hcyB0aGF0DQotaGF2ZSBubyBuYW1lc3BhY2UgY2FuIGFsc28gYmUgcmVkZWZpbmVkLjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucw0KLXdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yaw0KLWluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYSByZWRlZmluZSBlbGVtZW50LCBjb21wbGV0ZQ0KLXRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPGI+RGlyZWN0aXZlczwvYj4gc2VjdGlvbg0KLWFuZCBjbGljayA8dWljb250cm9sPkFkZCBSZWRlZmluZTwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgU2VsZWN0IFhNTCBzY2hlbWEgZmlsZSB3aXphcmQsIHlvdSBjYW4gaW1wb3J0IGFuDQotWE1MIHNjaGVtYSB0aGF0IGlzIGxvY2F0ZWQgaW4geW91ciB3b3Jrc3BhY2Ugb3IgeW91IGNhbiBpbXBvcnQgYSBzY2hlbWENCi1mcm9tIGFuIEhUVFAgV2ViIGFkZHJlc3MuIFRoZSBYTUwgc2NoZW1hIGZpbGUgdGhhdCB5b3Ugc2VsZWN0IG11c3QNCi1oYXZlIHRoZSBzYW1lIG5hbWVzcGFjZSBhcyB0aGUgY3VycmVudCBzY2hlbWEuPC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5JZiB5b3Ugd2FudCB0byBpbXBvcnQgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIGluIHlvdXIgd29ya3NwYWNlOjxvbD4NCi08bGk+U2VsZWN0IDx1aWNvbnRyb2w+V29ya2JlbmNoIHByb2plY3RzPC91aWNvbnRyb2w+IGFuZCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uIDwvbGk+DQotPGxpPlNlbGVjdCB0aGUgc2NoZW1hIHRoYXQgeW91IHdhbnQgdG8gaW1wb3J0IGFuZCBjbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2xpPg0KLTwvb2w+PC9jaG9pY2U+DQotPGNob2ljZT5JZiB5b3Ugd2FudCB0byBpbXBvcnQgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIGF0IGFuIEhUVFAgV2ViDQotYWRkcmVzczo8b2w+DQotPGxpPlNlbGVjdCA8dWljb250cm9sPkhUVFA8L3VpY29udHJvbD4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2xpPg0KLTxsaT5UeXBlIHRoZSBVUkwgb2YgdGhlIFhNTCBzY2hlbWEgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+Ljxub3RlPkENCi1sb2NhbCBjb3B5IG9mIHRoZSBzY2hlbWEgaXMgbm90IHN0b3JlZCBpbiB5b3VyIHdvcmtzcGFjZS4gSWYgeW91IHZhbGlkYXRlDQoteW91ciBzY2hlbWEsIHRoZSBzY2hlbWEncyBjb250ZW50cyBhcmUgY2hlY2tlZCBmcm9tIHRoZSBVUkwgdGhhdCB5b3UNCi1zcGVjaWZ5Ljwvbm90ZT48L2xpPg0KLTwvb2w+PC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5Vc2UgdGhlIFByb3BlcnRpZXMgdmlldyB0byBkZWZpbmUNCi1hZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIHlvdXIgaW1wb3J0IGVsZW1lbnQuPC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gZWRpdCB0aGUgbG9jYXRpb24gb2YgdGhlIGluY2x1ZGVkIFhNTA0KLXNjaGVtYSBmaWxlLCBjbGljayB0aGUgPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+IHRhYiBhbmQgdHlwZQ0KLXRoZSBuZXcgbG9jYXRpb24gZGlzcGxheSBpbiB0aGUgPHVpY29udHJvbD5TY2hlbWEgbG9jYXRpb248L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYNCi15b3Ugd2FudCB0byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJlZGVmaW5lIGVsZW1lbnQuIDwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZSBpcyB1c2VkIGZvciBodW1hbg0KLXJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdQ0KLXdhbnQgdG8gYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2YNCi1zY2hlbWEgY29tcG9uZW50cy4gPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlDQotYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBzY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz4NCi08L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPC9zdGVwcz48P1B1YiBDYXJldDE/Pg0KLTxyZXN1bHQ+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCB0aGUgcmVkZWZpbmUgZWxlbWVudCB0byB5b3VyIFhNTCBzY2hlbWEsDQoteW91IGNhbiByZWRlZmluZSBhbnkgb2YgdGhlIHNpbXBsZSBhbmQgY29tcGxleCB0eXBlcywgZ3JvdXBzLCBhbmQNCi1hdHRyaWJ1dGUgZ3JvdXBzIGluIHRoZSBYTUwgc2NoZW1hIHlvdSBzZWxlY3RlZCBpbiB0aGUgcmVkZWZpbmUgZWxlbWVudC4gPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzNzIxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZGZuLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZGZuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjZkNGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmRmbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyByZWRlZmluZSBlbGVtZW50cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgcmVkZWZpbmUgbWVjaGFuaXNtIHRvIHJlZGVmaW5lIHNpbXBsZSBhbmQgY29tcGxleCB0eXBlcywgZ3JvdXBzLCBhbmQgYXR0cmlidXRlIGdyb3VwcyBvYnRhaW5lZCBmcm9tIGV4dGVybmFsIHNjaGVtYSBmaWxlcy4gV2hlbiB5b3UgcmVkZWZpbmUgYSBjb21wb25lbnQsIHlvdSBhcmUgbW9kaWZ5aW5nIGl0cyBjb250ZW50cy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIHJlZGVmaW5lIG1lY2hhbmlzbSB0byByZWRlZmluZSBzaW1wbGUgYW5kIGNvbXBsZXggdHlwZXMsIGdyb3VwcywgYW5kIGF0dHJpYnV0ZSBncm91cHMgb2J0YWluZWQgZnJvbSBleHRlcm5hbCBzY2hlbWEgZmlsZXMuIFdoZW4geW91IHJlZGVmaW5lIGEgY29tcG9uZW50LCB5b3UgYXJlIG1vZGlmeWluZyBpdHMgY29udGVudHMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZyByZWRlZmluZSBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcgcmVkZWZpbmUgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGltcHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRpbmNsLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9ybm1zcGMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkcmRmbiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyByZWRlZmluZSBlbGVtZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZHJkZm4iPjxhIG5hbWU9InRhZGRyZGZuIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gdXNlIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5yZWRlZmluZTwvc2FtcD4gbWVjaGFuaXNtIHRvCi1yZWRlZmluZSBzaW1wbGUgYW5kIGNvbXBsZXggdHlwZXMsIGdyb3VwcywgYW5kIGF0dHJpYnV0ZSBncm91cHMgb2J0YWluZWQKLWZyb20gZXh0ZXJuYWwgc2NoZW1hIGZpbGVzLiBXaGVuIHlvdSByZWRlZmluZSBhIGNvbXBvbmVudCwgeW91IGFyZQotbW9kaWZ5aW5nIGl0cyBjb250ZW50cy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkxpa2UgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmluY2x1ZGU8L3NhbXA+IG1lY2hhbmlzbSwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+cmVkZWZpbmU8L3NhbXA+IHJlcXVpcmVzCi10aGUgZXh0ZXJuYWwgY29tcG9uZW50cyB0byBiZSBpbiB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZQotcmVkZWZpbmluZyBzY2hlbWEsIGFsdGhvdWdoIGV4dGVybmFsIGNvbXBvbmVudHMgZnJvbSBzY2hlbWFzIHRoYXQKLWhhdmUgbm8gbmFtZXNwYWNlIGNhbiBhbHNvIGJlIHJlZGVmaW5lZC48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucwotd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrCi1pbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYSByZWRlZmluZSBlbGVtZW50LCBjb21wbGV0ZQotdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxzdHJvbmc+RGlyZWN0aXZlczwvc3Ryb25nPiBzZWN0aW9uCi1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIFJlZGVmaW5lPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSBTZWxlY3QgWE1MIHNjaGVtYSBmaWxlIHdpemFyZCwgeW91IGNhbiBpbXBvcnQgYW4KLVhNTCBzY2hlbWEgdGhhdCBpcyBsb2NhdGVkIGluIHlvdXIgd29ya3NwYWNlIG9yIHlvdSBjYW4gaW1wb3J0IGEgc2NoZW1hCi1mcm9tIGFuIEhUVFAgV2ViIGFkZHJlc3MuIFRoZSBYTUwgc2NoZW1hIGZpbGUgdGhhdCB5b3Ugc2VsZWN0IG11c3QKLWhhdmUgdGhlIHNhbWUgbmFtZXNwYWNlIGFzIHRoZSBjdXJyZW50IHNjaGVtYS48L3NwYW4+Ci08dWw+Ci08bGk+SWYgeW91IHdhbnQgdG8gaW1wb3J0IGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBpbiB5b3VyIHdvcmtzcGFjZTo8b2wgdHlwZT0iYSI+Ci08bGk+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaCBwcm9qZWN0czwvc3Bhbj4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+LiA8L2xpPgotCi08bGk+U2VsZWN0IHRoZSBzY2hlbWEgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9saT4KLQotPC9vbD4KLTwvbGk+Ci0KLTxsaT5JZiB5b3Ugd2FudCB0byBpbXBvcnQgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIGF0IGFuIEhUVFAgV2ViCi1hZGRyZXNzOjxvbCB0eXBlPSJhIj4KLTxsaT5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRUUDwvc3Bhbj4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+LjwvbGk+Ci0KLTxsaT5UeXBlIHRoZSBVUkwgb2YgdGhlIFhNTCBzY2hlbWEgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEEKLWxvY2FsIGNvcHkgb2YgdGhlIHNjaGVtYSBpcyBub3Qgc3RvcmVkIGluIHlvdXIgd29ya3NwYWNlLiBJZiB5b3UgdmFsaWRhdGUKLXlvdXIgc2NoZW1hLCB0aGUgc2NoZW1hJ3MgY29udGVudHMgYXJlIGNoZWNrZWQgZnJvbSB0aGUgVVJMIHRoYXQgeW91Ci1zcGVjaWZ5LjwvZGl2PgotPC9saT4KLQotPC9vbD4KLTwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaT48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5Vc2UgdGhlIFByb3BlcnRpZXMgdmlldyB0byBkZWZpbmUKLWFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgeW91ciBpbXBvcnQgZWxlbWVudC48L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIGVkaXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbmNsdWRlZCBYTUwKLXNjaGVtYSBmaWxlLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gdGFiIGFuZCB0eXBlCi10aGUgbmV3IGxvY2F0aW9uIGRpc3BsYXkgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjaGVtYSBsb2NhdGlvbjwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmCi15b3Ugd2FudCB0byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJlZGVmaW5lIGVsZW1lbnQuIDwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZSBpcyB1c2VkIGZvciBodW1hbgotcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91Ci13YW50IHRvIGFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mCi1zY2hlbWEgY29tcG9uZW50cy4gPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZQotYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBzY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCB0aGUgcmVkZWZpbmUgZWxlbWVudCB0byB5b3VyIFhNTCBzY2hlbWEsCi15b3UgY2FuIHJlZGVmaW5lIGFueSBvZiB0aGUgc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZAotYXR0cmlidXRlIGdyb3VwcyBpbiB0aGUgWE1MIHNjaGVtYSB5b3Ugc2VsZWN0ZWQgaW4gdGhlIHJlZGVmaW5lIGVsZW1lbnQuIDwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkaW1wdC5odG1sIiB0aXRsZT0iSWYgeW91ciBzY2hlbWFzIGFyZSBsYXJnZSwgeW91IG1pZ2h0IGNob29zZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgdG8gbWFrZSB0aGVtIGVhc2llciB0byBtYWludGFpbiwgcmV1c2UsIGFuZCByZWFkLiBZb3UgY2FuIHVzZSBhbiBpbXBvcnQgZWxlbWVudCB0byBicmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gYW4gaW1wb3J0ZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiI+QWRkaW5nIGltcG9ydCBlbGVtZW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRpbmNsLmh0bWwiIHRpdGxlPSJJZiB5b3VyIHNjaGVtYXMgYXJlIGxhcmdlLCB5b3UgbWlnaHQgY2hvb3NlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyB0byBtYWtlIHRoZW0gZWFzaWVyIHRvIG1haW50YWluLCByZXVzZSwgYW5kIHJlYWQuIFlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlIGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIFRoZSBpbmNsdWRlZCBzY2hlbWEgbXVzdCBiZSBpbiB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZSBpbmNsdWRpbmcgc2NoZW1hLiI+QWRkaW5nIGluY2x1ZGUgZWxlbWVudHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3Mvcm5tc3BjLmh0bWwiIHRpdGxlPSJBbiBYTUwgbmFtZXNwYWNlIGlzIGEgY29sbGVjdGlvbiBvZiBuYW1lcywgaWRlbnRpZmllZCBieSBhIFVSSSByZWZlcmVuY2UsIHdoaWNoIGFyZSB1c2VkIGluIFhNTCBkb2N1bWVudHMgYXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlIG5hbWVzLiI+WE1MIG5hbWVzcGFjZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmVnLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZWcuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5ZDdiMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZWcuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGFkZHJlZyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIHBhdHRlcm4gZmFjZXQgY2FuIGJlIHVzZWQgdG8gY29uc3RyYWluIHRoZSB2YWx1ZSBvZiBhIHR5cGUncw0KLWxleGljYWwgc3BhY2UgKHRoZSBzZXQgb2Ygc3RyaW5nIGxpdGVyYWxzIHRoYXQgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgYSB0eXBlKSwNCi13aGljaCBpbmRpcmVjdGx5IGNvbnN0cmFpbnMgdGhlIHZhbHVlIHNwYWNlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5wYXR0ZXJuIGZhY2V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+cGF0dGVybiBmYWNldHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPiBUaGUgdmFsdWUgb2YgdGhlIHBhdHRlcm4gaXMgY2FsbGVkIGEgcmVndWxhciBleHByZXNzaW9uLiBZb3UNCi1jYW4gc3BlY2lmeSBpdCB1c2luZyB0aGUgPHVpY29udHJvbD5SZWd1bGFyIEV4cHJlc3Npb248L3VpY29udHJvbD4gd2l6YXJkLjwvcD48cD5Ubw0KLWFkZCBhIHBhdHRlcm4gdG8gYSBzaW1wbGUgdHlwZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgc2VsZWN0IHRoZSBzaW1wbGUgdHlwZSB5b3Ugd2FudCB0byB3b3JrIHdpdGguPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDx1aWNvbnRyb2w+Q29uc3RyYWludHM8L3VpY29udHJvbD4gdGFiLA0KLXRoZW4gPHVpY29udHJvbD5QYXR0ZXJuczwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPi48L2NtZD48aW5mbz5UaGUgUmVndWxhciBFeHByZXNzaW9uDQotd2l6YXJkIG9wZW5zLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIHRva2VuIHlvdSB3YW50IHRvIGFkZCB0byB0aGUgZXhwcmVzc2lvbi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbmRpY2F0ZSBob3cgb2Z0ZW4geW91IHdhbnQgdGhlIHRva2VuIHRvIGFwcGVhciBpbiBvcmRlciBmb3IgYQ0KLW1hdGNoIHRvIHN1Y2NlZWQ6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5JZiB5b3Ugd2FudCB0aGUgdG9rZW4gdG8gcmVwZWF0LCBjbGljayA8dWljb250cm9sPlJlcGVhdDwvdWljb250cm9sPiBhbmQNCi1zcGVjaWZ5IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHRva2VuIG11c3QgYXBwZWFyLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPiBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgbWluaW11bSBhbmQgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlDQotdG9rZW4gY2FuIGFwcGVhciwgY2xpY2sgPHVpY29udHJvbD5SYW5nZTwvdWljb250cm9sPiBhbmQgZW50ZXIgYSBtaW5pbXVtIGFuZA0KLW1heGltdW0gdmFsdWUuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGFkZCB0aGUgdG9rZW4gdG8gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgY2xpY2sgPHVpY29udHJvbD5BZGQ8L3VpY29udHJvbD4uIDwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGNyZWF0ZSB0aGUgZW50aXJlIGV4cHJlc3Npb24sIHJlcGVhdCBzdGVwcyA0IC0gNiBhcyBuZWNlc3NhcnkuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2hlbiB5b3UgYXJlIGZpbmlzaGVkLCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VDw/UHViIENhcmV0MT8+byB0ZXN0IGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgc2VlIGlmDQotYSBtYXRjaCBvY2N1cnMsIGVudGVyIHNhbXBsZSB0ZXh0LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPjxzdGVwcmVzdWx0PiBUaGUgcmVndWxhcg0KLWV4cHJlc3Npb24gd2lsbCBhcHBlYXIgaW4gdGhlIFBhdHRlcm5zIHBhZ2UuIDxub3RlIHR5cGU9InRpcCI+IFRvIGVkaXQgYW4NCi1leGlzdGluZyBwYXR0ZXJuLCBzZWxlY3QgaXQgaW4gdGhlIFBhdHRlcm5zIHBhZ2UgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPi4NCi1UbyBkZWxldGUgYW4gZXhpc3RpbmcgcGF0dGVybiwgc2VsZWN0IGl0IGluIHRoZSBQYXR0ZXJucyBwYWdlIGFuZCBjbGljayA8dWljb250cm9sPkRlbGV0ZTwvdWljb250cm9sPi4gPC9ub3RlPjwvc3RlcHJlc3VsdD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjcwMz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmVnLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZWcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1ZjRmNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZWcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBwYXR0ZXJuIGZhY2V0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cmFpbiB0aGUgdmFsdWUgb2YgYSB0eXBlJ3MgbGV4aWNhbCBzcGFjZSAodGhlIHNldCBvZiBzdHJpbmcgbGl0ZXJhbHMgdGhhdCByZXByZXNlbnQgdGhlIHZhbHVlcyBvZiBhIHR5cGUpLCB3aGljaCBpbmRpcmVjdGx5IGNvbnN0cmFpbnMgdGhlIHZhbHVlIHNwYWNlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIHBhdHRlcm4gZmFjZXQgY2FuIGJlIHVzZWQgdG8gY29uc3RyYWluIHRoZSB2YWx1ZSBvZiBhIHR5cGUncyBsZXhpY2FsIHNwYWNlICh0aGUgc2V0IG9mIHN0cmluZyBsaXRlcmFscyB0aGF0IHJlcHJlc2VudCB0aGUgdmFsdWVzIG9mIGEgdHlwZSksIHdoaWNoIGluZGlyZWN0bHkgY29uc3RyYWlucyB0aGUgdmFsdWUgc3BhY2UuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIHBhdHRlcm4gZmFjZXRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIHBhdHRlcm4gZmFjZXRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRzbXB0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZHJlZyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRyZWciPjxhIG5hbWU9InRhZGRyZWciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkEgcGF0dGVybiBmYWNldCBjYW4gYmUgdXNlZCB0byBjb25zdHJhaW4gdGhlIHZhbHVlIG9mIGEgdHlwZSdzCi1sZXhpY2FsIHNwYWNlICh0aGUgc2V0IG9mIHN0cmluZyBsaXRlcmFscyB0aGF0IHJlcHJlc2VudCB0aGUgdmFsdWVzIG9mIGEgdHlwZSksCi13aGljaCBpbmRpcmVjdGx5IGNvbnN0cmFpbnMgdGhlIHZhbHVlIHNwYWNlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+IFRoZSB2YWx1ZSBvZiB0aGUgcGF0dGVybiBpcyBjYWxsZWQgYSByZWd1bGFyIGV4cHJlc3Npb24uIFlvdQotY2FuIHNwZWNpZnkgaXQgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZ3VsYXIgRXhwcmVzc2lvbjwvc3Bhbj4gd2l6YXJkLjwvcD4KLTxwPlRvCi1hZGQgYSBwYXR0ZXJuIHRvIGEgc2ltcGxlIHR5cGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCBzZWxlY3QgdGhlIHNpbXBsZSB0eXBlIHlvdSB3YW50IHRvIHdvcmsgd2l0aC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db25zdHJhaW50czwvc3Bhbj4gdGFiLAotdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuczwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkPC9zcGFuPi48L3NwYW4+IFRoZSBSZWd1bGFyIEV4cHJlc3Npb24KLXdpemFyZCBvcGVucy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgdG9rZW4geW91IHdhbnQgdG8gYWRkIHRvIHRoZSBleHByZXNzaW9uLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluZGljYXRlIGhvdyBvZnRlbiB5b3Ugd2FudCB0aGUgdG9rZW4gdG8gYXBwZWFyIGluIG9yZGVyIGZvciBhCi1tYXRjaCB0byBzdWNjZWVkOjwvc3Bhbj4KLTx1bD4KLTxsaT5JZiB5b3Ugd2FudCB0aGUgdG9rZW4gdG8gcmVwZWF0LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZXBlYXQ8L3NwYW4+IGFuZAotc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSB0b2tlbiBtdXN0IGFwcGVhci48L2xpPgotCi08L3VsPgotCi08dWw+Ci08bGk+IElmIHlvdSB3YW50IHRvIHNwZWNpZnkgYSBtaW5pbXVtIGFuZCBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUKLXRva2VuIGNhbiBhcHBlYXIsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJhbmdlPC9zcGFuPiBhbmQgZW50ZXIgYSBtaW5pbXVtIGFuZAotbWF4aW11bSB2YWx1ZS48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFkZCB0aGUgdG9rZW4gdG8gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkPC9zcGFuPi4gPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBjcmVhdGUgdGhlIGVudGlyZSBleHByZXNzaW9uLCByZXBlYXQgc3RlcHMgNCAtIDYgYXMgbmVjZXNzYXJ5Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+V2hlbiB5b3UgYXJlIGZpbmlzaGVkLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIHRlc3QgYWdhaW5zdCB0aGUgcmVndWxhciBleHByZXNzaW9uIGFuZCBzZWUgaWYKLWEgbWF0Y2ggb2NjdXJzLCBlbnRlciBzYW1wbGUgdGV4dC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj4gIFRoZSByZWd1bGFyCi1leHByZXNzaW9uIHdpbGwgYXBwZWFyIGluIHRoZSBQYXR0ZXJucyBwYWdlLiA8ZGl2IGNsYXNzPSJ0aXAiPjxzcGFuIGNsYXNzPSJ0aXB0aXRsZSI+VGlwOjwvc3Bhbj4gIFRvIGVkaXQgYW4KLWV4aXN0aW5nIHBhdHRlcm4sIHNlbGVjdCBpdCBpbiB0aGUgUGF0dGVybnMgcGFnZSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4uCi1UbyBkZWxldGUgYW4gZXhpc3RpbmcgcGF0dGVybiwgc2VsZWN0IGl0IGluIHRoZSBQYXR0ZXJucyBwYWdlIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZWxldGU8L3NwYW4+LiA8L2Rpdj4KLQotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZHNtcHQuaHRtbCIgdGl0bGU9IlNpbXBsZSB0eXBlcyBhcmUgdXNlZCB0byBjcmVhdGUgZGVyaXZlZCBkYXRhIHR5cGVzLiBUaGV5IHByb3ZpZGUgYSBzZXQgb2YgY29uc3RyYWludHMgb24gdGhlIHZhbHVlIHNwYWNlIChhIHNldCBvZiB2YWx1ZXMpIGFuZCB0aGUgbGV4aWNhbCBzcGFjZSAoYSBzZXQgb2YgdmFsaWQgbGl0ZXJhbHMpIG9mIGEgZGF0YXR5cGUuIj5BZGRpbmcgc2ltcGxlIHR5cGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHNtcHQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHNtcHQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhM2Q2Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRzbXB0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDgsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRzbXB0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgc2ltcGxlIHR5cGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgc2ltcGxlIHR5cGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlNpbXBsZSB0eXBlcyBhcmUgdXNlZCB0byBjcmVhdGUgZGVyaXZlZCBkYXRhIHR5cGVzLiBUaGV5DQotcHJvdmlkZSBhIHNldCBvZiBjb25zdHJhaW50cyBvbiB0aGUgdmFsdWUgc3BhY2UgKGEgc2V0IG9mIHZhbHVlcykNCi1hbmQgdGhlIGxleGljYWwgc3BhY2UgKGEgc2V0IG9mIHZhbGlkIGxpdGVyYWxzKSBvZiBhIGRhdGF0eXBlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5zaW1wbGUgdHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPnNpbXBsZSB0eXBlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+QSBzaW1wbGUgdHlwZSBjYW5ub3QgaGF2ZSBlbGVtZW50IGNvbnRlbnQgYW5kIGNhbm5vdCBjYXJyeQ0KLWF0dHJpYnV0ZXMuIEVsZW1lbnRzIHRoYXQgY29udGFpbiBudW1iZXJzIChhbmQgc3RyaW5ncywgYW5kIGRhdGVzLA0KLWFuZCBzbyBvbikgYnV0IGRvIG5vdCBjb250YWluIGFueSBzdWItZWxlbWVudHMgaGF2ZSBhIHNpbXBsZSB0eXBlLjwvcD48cD5UaGUNCi1mb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYQ0KLXNpbXBsZSB0eXBlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIDxiPlR5cGVzPC9iPiwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkDQotU2ltcGxlIFR5cGU8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgc2VsZWN0IHRoZSBuZXcgc2ltcGxlIHR5cGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPiB0YWIuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VHlwZSBhIG5ldyBuYW1lIGZvciB0aGUgc2ltcGxlIHR5cGUgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3UgY2FuIHNlbGVjdCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgZnJvbSB0aGUgPHVpY29udHJvbD5WYXJpZXR5PC91aWNvbnRyb2w+IGxpc3Q6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT48dWljb250cm9sPmF0b21pYzwvdWljb250cm9sPjogYXRvbWljIHR5cGVzIGFyZSBhbGwgdGhlIHNpbXBsZQ0KLXR5cGVzIGJ1aWx0IGludG8gdGhlIFhNTCBzY2hlbWEgbGFuZ3VhZ2UuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPmxpc3Q8L3VpY29udHJvbD46IGxpc3QgdHlwZXMgYXJlIGNvbXByaXNlZCBvZiBzZXF1ZW5jZXMNCi1vZiBhdG9taWMgdHlwZXMuIFRoZXkgaGF2ZSB2YWx1ZXMgdGhhdCBhcmUgY29tcHJpc2VkIG9mIGZpbml0ZS1sZW5ndGgNCi1zZXF1ZW5jZXMgb2YgYXRvbWljIHZhbHVlcy4gPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPnVuaW9uPC91aWNvbnRyb2w+OiB1bmlvbiB0eXBlcyBlbmFibGUgYW4gZWxlbWVudA0KLW9yIGF0dHJpYnV0ZSB2YWx1ZSB0byBiZSBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2Ygb25lIHR5cGUgZHJhd24gZnJvbQ0KLXRoZSB1bmlvbiBvZiBtdWx0aXBsZSBhdG9taWMgYW5kIGxpc3QgdHlwZXMuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSBzZWxlY3RlZCA8dWljb250cm9sPmF0b21pYzwvdWljb250cm9sPiBvciA8dWljb250cm9sPmxpc3Q8L3VpY29udHJvbD4gZnJvbQ0KLXRoZSA8dWljb250cm9sPlZhcmlldHk8L3VpY29udHJvbD4gbGlzdCwgY2xpY2sgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gPGltYWdlDQotaHJlZj0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBCcm93c2UgYnV0dG9uPC9hbHQ+DQotPC9pbWFnZT4gbmV4dCB0byB0aGUgPHVpY29udHJvbD5CYXNlIHR5cGU8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5JdGVtDQotdHlwZTwvdWljb250cm9sPiBmaWVsZCB0byBzcGVjaWZ5IGEgYmFzZSB0eXBlIGZvciB0aGUgc2ltcGxlIHR5cGUuIDwvY21kPg0KLTxpbmZvPlRoZSBTZXQgVHlwZSBkaWFsb2cgYm94IGxpc3RzIGFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkDQotdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4gWW91IGNhbiBjaGFuZ2UgdGhlIDx1aWNvbnRyb2w+U2NvcGU8L3VpY29udHJvbD4gb2YNCi10aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8dWw+DQotPGxpPjx1aWNvbnRyb2w+V29ya3NwYWNlPC91aWNvbnRyb2w+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQ0KLWluIHlvdXIgd29ya3NwYWNlLiA8L2xpPg0KLTxsaT48dWljb250cm9sPkVuY2xvc2luZyBQcm9qZWN0PC91aWNvbnRyb2w+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzDQotYXZhaWxhYmxlIGluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPg0KLTxsaT4oRGVmYXVsdCkgPHVpY29udHJvbD5DdXJyZW50IFJlc291cmNlPC91aWNvbnRyb2w+OiBsaXN0cyBhbGwgb2YNCi10aGUgdHlwZXMgYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+DQotPGxpPjx1aWNvbnRyb2w+V29ya2luZyBTZXRzPC91aWNvbnRyb2w+OiBsaXN0cyBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZQ0KLXdpdGhpbiB0aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4NCi08L3VsPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugc2VsZWN0ZWQgPHVpY29udHJvbD51bmlvbjwvdWljb250cm9sPiBmcm9tIHRoZSA8dWljb250cm9sPlZhcmlldHk8L3VpY29udHJvbD4gbGlzdCwNCi1jbGljayA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiPg0KLTxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBCcm93c2UgYnV0dG9uPC9hbHQ+PC9pbWFnZT4gbmV4dCB0byB0aGUgPHVpY29udHJvbD5NZW1iZXINCi10eXBlczwvdWljb250cm9sPiBmaWVsZCB0byBzcGVjaWZ5IHRoZSBtZW1iZXIgdHlwZXMgZm9yIHRoZSBzaW1wbGUNCi10eXBlLiA8L2NtZD48aW5mbz5Zb3UgY2FuIHNlbGVjdCB0byBhZGQgYm90aCA8dWljb250cm9sPkJ1aWx0LWluIHNpbXBsZQ0KLXR5cGVzPC91aWNvbnRyb2w+IGFuZCA8dWljb250cm9sPlVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZXM8L3VpY29udHJvbD4gdG8NCi10aGUgbWVtYmVyIHR5cGVzIHZhbHVlIGxpc3QuIDwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBzZXQgc3BlY2lmaWMgY29uc3RyYWludCB2YWx1ZXMgb24geW91ciBzaW1wbGUgdHlwZSwNCi1zdWNoIGFzIGxlbmd0aCBjb25zdHJhaW50cywgZW51bWVyYXRpb25zLCBhbmQgcGF0dGVybnMsIGNsaWNrIHRoZSA8dWljb250cm9sPkNvbnN0cmFpbnRzPC91aWNvbnRyb2w+IHRhYi48L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5Zb3UgY2FuIHVzZSA8aT5lbnVtZXJhdGlvbnM8L2k+IHRvIGRlZmluZSBhIHNldCBvZiB2YWxpZA0KLXZhbHVlcyBmb3Igc2ltcGxlIHR5cGVzLiBUaGV5IGFyZSB0aGUgYWN0dWFsIHZhbHVlcyB0aGUgc2ltcGxlIHR5cGUNCi1jYW4gdGFrZSBhcyB2YWxpZCB2YWx1ZXMgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50LiBZb3UgY2FuIGFkZCBvbmUNCi1lbnVtZXJhdGlvbiBvciBzZXZlcmFsIGVudW1lcmF0aW9ucyBhdCBhIHRpbWU6PC9jbWQ+PGluZm8+PHVsPg0KLTxsaT5UbyBhZGQgb25lIGVudW1lcmF0aW9uIGF0IGEgdGltZSwgdW5kZXIgPHVpY29udHJvbD5TcGVjaWZpYyBjb25zdHJhaW50DQotdmFsdWVzPC91aWNvbnRyb2w+LCBzZWxlY3QgPHVpY29udHJvbD5FbnVtZXJhdGlvbnM8L3VpY29udHJvbD4gYW5kDQotY2xpY2sgPHVpY29udHJvbD5BZGQ8L3VpY29udHJvbD4gYW5kIHNwZWNpZnkgYSB2YWx1ZSBmb3IgdGhlIGVudW1lcmF0aW9uLjwvbGk+DQotPGxpPlRvIGFkZCBzZXZlcmFsIGVudW1lcmF0aW9ucyBhdCBvbmUgdGltZTo8b2w+DQotPGxpPlNlbGVjdCA8dWljb250cm9sPkVudW1lcmF0aW9uczwvdWljb250cm9sPiBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQ8L3VpY29udHJvbD4uPC9saT4NCi08bGk+RW50ZXIgdGhlIHZhbHVlIG9mIGVhY2ggZW51bWVyYXRpb24uIEVhY2ggdmFsdWUgbXVzdCBiZSBzZXBhcmF0ZWQNCi1ieSB0aGUgPHVpY29udHJvbD5EZWxpbWl0ZXIgY2hhcmFjdGVyPC91aWNvbnRyb2w+LiBGb3IgZXhhbXBsZTogPGNvZGVwaD5GaXJzdCwNCi1TZWNvbmQ8L2NvZGVwaD4gd2lsbCBjcmVhdGUgdHdvIGVudW1lcmF0aW9ucywgb25lIHdpdGggdGhlIHZhbHVlICJGaXJzdCINCi1hbmQgb25lIHdpdGggdGhlIHZhbHVlICJTZWNvbmQiLjwvbGk+DQotPGxpPlNlbGVjdCB0aGUgPHVpY29udHJvbD5QcmVzZXJ2ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlPC91aWNvbnRyb2w+IGNoZWNrDQotYm94IGlmIHlvdSB3YW50IGFueSB3aGl0ZSBzcGFjZSBhcm91bmQgeW91ciBlbnVtZXJhdGlvbiB2YWx1ZXMgdG8NCi1iZSBwcmVzZXJ2ZWQuIElmIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIHRoZSB2YWx1ZXMgb2YgPGNvZGVwaD5GaXJzdCwNCi1TZWNvbmQ8L2NvZGVwaD4gd2lsbCBzaG93IHVwIGFzICJGaXJzdCIgYW5kICIgU2Vjb25kIiAodGhlcmUgaXMgYQ0KLXNwYWNlIGJlZm9yZSBTZWNvbmQpIGJlY2F1c2UgeW91IHB1dCBhIHNwYWNlIGJlZm9yZSAiU2Vjb25kIiB3aGVuDQotZW50ZXJpbmcgdGhlIHZhbHVlLjwvbGk+DQotPGxpPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uIFlvdXIgZW51bWVyYXRpb25zIHdpbGwgYmUgY3JlYXRlZA0KLWFuZCBhcHBlYXIgaW4gdGhlIFByb3BlcnRpZXMgdmlldy48L2xpPg0KLTwvb2w+PC9saT4NCi08L3VsPjwvaW5mbz48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5Zb3UgY2FuIHVzZSA8aT5wYXR0ZXJuczwvaT4gdG8gcGxhY2UgY2VydGFpbiBjb25zdHJhaW50cw0KLXJlZ2FyZGluZyBhbGxvd2FibGUgdmFsdWVzLiA8L2NtZD48aW5mbz5Gb3IgZXhhbXBsZSwgeW91IGNvdWxkIHJlc3RyaWN0DQotdGhlIGZpZWxkIHRvIG9ubHkgYWNjZXB0IGlucHV0IHdoaWNoIGZvbGxvd3MgdGhlIHBhdHRlcm4gImZpdmUgZGlnaXRzDQotZm9sbG93ZWQgYnkgdHdvIHVwcGVyLWNhc2UgQVNDSUkgbGV0dGVycyIuIFRvIHNldCBhIHBhdHRlcm4gY29uc3RyYWludDo8b2w+DQotPGxpPlNlbGVjdCA8dWljb250cm9sPlBhdHRlcm5zPC91aWNvbnRyb2w+IGFuZCBjbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPi48L2xpPg0KLTxsaT5DcmVhdGUgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHlvdSB3aXNoIHRvIHVzZSBhcyB5b3VyDQotY29uc3RyYWludCB1c2luZyB0aGUgPHVpY29udHJvbD5SZWd1bGFyIEV4cHJlc3Npb248L3VpY29udHJvbD4gd2l6YXJkLjwvbGk+DQotPGxpPkNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvbGk+DQotPC9vbD48L2luZm8+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91DQotd2FudCB0byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNpbXBsZSB0eXBlLiA8L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3UNCi13YW50IHRvIGFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mDQotc2NoZW1hIGNvbXBvbmVudHMuIDwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZQ0KLWFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IGRvIG5vdCB3YW50IHRoZSBzaW1wbGUgdHlwZSB0byBiZSB1c2VkIHRvIGRlcml2ZQ0KLW90aGVyIHR5cGVzLCBjbGljayB0aGUgPHVpY29udHJvbD5BZHZhbmNlZDwvdWljb250cm9sPiB0YWIgYW5kLCBpbg0KLXRoZSA8dWljb250cm9sPkZpbmFsPC91aWNvbnRyb2w+IGxpc3QsIHNlbGVjdCBpZiBkZXJpdmF0aW9ucyBzaG91bGQNCi1iZSBwcmV2ZW50ZWQgYnkgPHVpY29udHJvbD5saXN0PC91aWNvbnRyb2w+LCA8dWljb250cm9sPnJlc3RyaWN0aW9uPC91aWNvbnRyb2w+LCA8dWljb250cm9sPnVuaW9uPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+I2FsbDwvdWljb250cm9sPi48L2NtZD48P1B1Yg0KLUNhcmV0MT8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDY5OTk/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHNtcHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHNtcHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwOWNhMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRzbXB0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIHNpbXBsZSB0eXBlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJTaW1wbGUgdHlwZXMgYXJlIHVzZWQgdG8gY3JlYXRlIGRlcml2ZWQgZGF0YSB0eXBlcy4gVGhleSBwcm92aWRlIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9uIHRoZSB2YWx1ZSBzcGFjZSAoYSBzZXQgb2YgdmFsdWVzKSBhbmQgdGhlIGxleGljYWwgc3BhY2UgKGEgc2V0IG9mIHZhbGlkIGxpdGVyYWxzKSBvZiBhIGRhdGF0eXBlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJTaW1wbGUgdHlwZXMgYXJlIHVzZWQgdG8gY3JlYXRlIGRlcml2ZWQgZGF0YSB0eXBlcy4gVGhleSBwcm92aWRlIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9uIHRoZSB2YWx1ZSBzcGFjZSAoYSBzZXQgb2YgdmFsdWVzKSBhbmQgdGhlIGxleGljYWwgc3BhY2UgKGEgc2V0IG9mIHZhbGlkIGxpdGVyYWxzKSBvZiBhIGRhdGF0eXBlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBzaW1wbGUgdHlwZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgc2ltcGxlIHR5cGVzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRyZWcuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkc21wdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBzaW1wbGUgdHlwZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRzbXB0Ij48YSBuYW1lPSJ0YWRkc21wdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIHNpbXBsZSB0eXBlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+U2ltcGxlIHR5cGVzIGFyZSB1c2VkIHRvIGNyZWF0ZSBkZXJpdmVkIGRhdGEgdHlwZXMuIFRoZXkKLXByb3ZpZGUgYSBzZXQgb2YgY29uc3RyYWludHMgb24gdGhlIHZhbHVlIHNwYWNlIChhIHNldCBvZiB2YWx1ZXMpCi1hbmQgdGhlIGxleGljYWwgc3BhY2UgKGEgc2V0IG9mIHZhbGlkIGxpdGVyYWxzKSBvZiBhIGRhdGF0eXBlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+QSBzaW1wbGUgdHlwZSBjYW5ub3QgaGF2ZSBlbGVtZW50IGNvbnRlbnQgYW5kIGNhbm5vdCBjYXJyeQotYXR0cmlidXRlcy4gRWxlbWVudHMgdGhhdCBjb250YWluIG51bWJlcnMgKGFuZCBzdHJpbmdzLCBhbmQgZGF0ZXMsCi1hbmQgc28gb24pIGJ1dCBkbyBub3QgY29udGFpbiBhbnkgc3ViLWVsZW1lbnRzIGhhdmUgYSBzaW1wbGUgdHlwZS48L3A+Ci08cD5UaGUKLWZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYQotc2ltcGxlIHR5cGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIDxzdHJvbmc+VHlwZXM8L3N0cm9uZz4sIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLVNpbXBsZSBUeXBlPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCBzZWxlY3QgdGhlIG5ldyBzaW1wbGUgdHlwZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gdGFiLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG5ldyBuYW1lIGZvciB0aGUgc2ltcGxlIHR5cGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBzZWxlY3QgdGhlIGZvbGxvd2luZyBvcHRpb25zIGZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhcmlldHk8L3NwYW4+IGxpc3Q6PC9zcGFuPgotPHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmF0b21pYzwvc3Bhbj46IGF0b21pYyB0eXBlcyBhcmUgYWxsIHRoZSBzaW1wbGUKLXR5cGVzIGJ1aWx0IGludG8gdGhlIFhNTCBzY2hlbWEgbGFuZ3VhZ2UuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmxpc3Q8L3NwYW4+OiBsaXN0IHR5cGVzIGFyZSBjb21wcmlzZWQgb2Ygc2VxdWVuY2VzCi1vZiBhdG9taWMgdHlwZXMuIFRoZXkgaGF2ZSB2YWx1ZXMgdGhhdCBhcmUgY29tcHJpc2VkIG9mIGZpbml0ZS1sZW5ndGgKLXNlcXVlbmNlcyBvZiBhdG9taWMgdmFsdWVzLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+dW5pb248L3NwYW4+OiB1bmlvbiB0eXBlcyBlbmFibGUgYW4gZWxlbWVudAotb3IgYXR0cmlidXRlIHZhbHVlIHRvIGJlIG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZiBvbmUgdHlwZSBkcmF3biBmcm9tCi10aGUgdW5pb24gb2YgbXVsdGlwbGUgYXRvbWljIGFuZCBsaXN0IHR5cGVzLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHNlbGVjdGVkIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmF0b21pYzwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+bGlzdDwvc3Bhbj4gZnJvbQotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhcmlldHk8L3NwYW4+IGxpc3QsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9Ccm93c2UuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbiIgLz4gbmV4dCB0byB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QmFzZSB0eXBlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JdGVtCi10eXBlPC9zcGFuPiBmaWVsZCB0byBzcGVjaWZ5IGEgYmFzZSB0eXBlIGZvciB0aGUgc2ltcGxlIHR5cGUuIDwvc3Bhbj4KLSBUaGUgU2V0IFR5cGUgZGlhbG9nIGJveCBsaXN0cyBhbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZAotdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4gWW91IGNhbiBjaGFuZ2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjb3BlPC9zcGFuPiBvZgotdGhlIGxpc3QgYnkgc2VsZWN0aW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtzcGFjZTwvc3Bhbj46IGxpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlCi1pbiB5b3VyIHdvcmtzcGFjZS4gPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY2xvc2luZyBQcm9qZWN0PC9zcGFuPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcwotYXZhaWxhYmxlIGluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPgotCi08bGk+KERlZmF1bHQpIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1cnJlbnQgUmVzb3VyY2U8L3NwYW4+OiBsaXN0cyBhbGwgb2YKLXRoZSB0eXBlcyBhdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtpbmcgU2V0czwvc3Bhbj46IGxpc3RzIGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlCi13aXRoaW4gdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj51bmlvbjwvc3Bhbj4gZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFyaWV0eTwvc3Bhbj4gbGlzdCwKLWNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9Ccm93c2UuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbiIgLz4gbmV4dCB0byB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWVtYmVyCi10eXBlczwvc3Bhbj4gZmllbGQgdG8gc3BlY2lmeSB0aGUgbWVtYmVyIHR5cGVzIGZvciB0aGUgc2ltcGxlCi10eXBlLiA8L3NwYW4+IFlvdSBjYW4gc2VsZWN0IHRvIGFkZCBib3RoIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJ1aWx0LWluIHNpbXBsZQotdHlwZXM8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2VyLWRlZmluZWQgc2ltcGxlIHR5cGVzPC9zcGFuPiB0bwotdGhlIG1lbWJlciB0eXBlcyB2YWx1ZSBsaXN0LiA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIHNldCBzcGVjaWZpYyBjb25zdHJhaW50IHZhbHVlcyBvbiB5b3VyIHNpbXBsZSB0eXBlLAotc3VjaCBhcyBsZW5ndGggY29uc3RyYWludHMsIGVudW1lcmF0aW9ucywgYW5kIHBhdHRlcm5zLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29uc3RyYWludHM8L3NwYW4+IHRhYi48L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gdXNlIDxlbT5lbnVtZXJhdGlvbnM8L2VtPiB0byBkZWZpbmUgYSBzZXQgb2YgdmFsaWQKLXZhbHVlcyBmb3Igc2ltcGxlIHR5cGVzLiBUaGV5IGFyZSB0aGUgYWN0dWFsIHZhbHVlcyB0aGUgc2ltcGxlIHR5cGUKLWNhbiB0YWtlIGFzIHZhbGlkIHZhbHVlcyBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQuIFlvdSBjYW4gYWRkIG9uZQotZW51bWVyYXRpb24gb3Igc2V2ZXJhbCBlbnVtZXJhdGlvbnMgYXQgYSB0aW1lOjwvc3Bhbj4gPHVsPgotPGxpPlRvIGFkZCBvbmUgZW51bWVyYXRpb24gYXQgYSB0aW1lLCB1bmRlciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TcGVjaWZpYyBjb25zdHJhaW50Ci12YWx1ZXM8L3NwYW4+LCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW51bWVyYXRpb25zPC9zcGFuPiBhbmQKLWNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4gYW5kIHNwZWNpZnkgYSB2YWx1ZSBmb3IgdGhlIGVudW1lcmF0aW9uLjwvbGk+Ci0KLTxsaT5UbyBhZGQgc2V2ZXJhbCBlbnVtZXJhdGlvbnMgYXQgb25lIHRpbWU6PG9sIHR5cGU9ImkiPgotPGxpPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FbnVtZXJhdGlvbnM8L3NwYW4+IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQ8L3NwYW4+LjwvbGk+Ci0KLTxsaT5FbnRlciB0aGUgdmFsdWUgb2YgZWFjaCBlbnVtZXJhdGlvbi4gRWFjaCB2YWx1ZSBtdXN0IGJlIHNlcGFyYXRlZAotYnkgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlbGltaXRlciBjaGFyYWN0ZXI8L3NwYW4+LiBGb3IgZXhhbXBsZTogPHNhbXAgY2xhc3M9ImNvZGVwaCI+Rmlyc3QsCi1TZWNvbmQ8L3NhbXA+IHdpbGwgY3JlYXRlIHR3byBlbnVtZXJhdGlvbnMsIG9uZSB3aXRoIHRoZSB2YWx1ZSAiRmlyc3QiCi1hbmQgb25lIHdpdGggdGhlIHZhbHVlICJTZWNvbmQiLjwvbGk+Ci0KLTxsaT5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZXNlcnZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2U8L3NwYW4+IGNoZWNrCi1ib3ggaWYgeW91IHdhbnQgYW55IHdoaXRlIHNwYWNlIGFyb3VuZCB5b3VyIGVudW1lcmF0aW9uIHZhbHVlcyB0bwotYmUgcHJlc2VydmVkLiBJZiB5b3Ugc2VsZWN0IHRoaXMgY2hlY2sgYm94LCB0aGUgdmFsdWVzIG9mIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkZpcnN0LAotU2Vjb25kPC9zYW1wPiB3aWxsIHNob3cgdXAgYXMgIkZpcnN0IiBhbmQgIiBTZWNvbmQiICh0aGVyZSBpcyBhCi1zcGFjZSBiZWZvcmUgU2Vjb25kKSBiZWNhdXNlIHlvdSBwdXQgYSBzcGFjZSBiZWZvcmUgIlNlY29uZCIgd2hlbgotZW50ZXJpbmcgdGhlIHZhbHVlLjwvbGk+Ci0KLTxsaT5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uIFlvdXIgZW51bWVyYXRpb25zIHdpbGwgYmUgY3JlYXRlZAotYW5kIGFwcGVhciBpbiB0aGUgUHJvcGVydGllcyB2aWV3LjwvbGk+Ci0KLTwvb2w+Ci08L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgY2FuIHVzZSA8ZW0+cGF0dGVybnM8L2VtPiB0byBwbGFjZSBjZXJ0YWluIGNvbnN0cmFpbnRzCi1yZWdhcmRpbmcgYWxsb3dhYmxlIHZhbHVlcy4gPC9zcGFuPiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHJlc3RyaWN0Ci10aGUgZmllbGQgdG8gb25seSBhY2NlcHQgaW5wdXQgd2hpY2ggZm9sbG93cyB0aGUgcGF0dGVybiAiZml2ZSBkaWdpdHMKLWZvbGxvd2VkIGJ5IHR3byB1cHBlci1jYXNlIEFTQ0lJIGxldHRlcnMiLiBUbyBzZXQgYSBwYXR0ZXJuIGNvbnN0cmFpbnQ6PG9sIHR5cGU9ImkiPgotPGxpPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuczwvc3Bhbj4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4uPC9saT4KLQotPGxpPkNyZWF0ZSB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4geW91IHdpc2ggdG8gdXNlIGFzIHlvdXIKLWNvbnN0cmFpbnQgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZ3VsYXIgRXhwcmVzc2lvbjwvc3Bhbj4gd2l6YXJkLjwvbGk+Ci0KLTxsaT5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+LjwvbGk+Ci0KLTwvb2w+Ci08L2xpPgotCi08L29sPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91Ci13YW50IHRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc2ltcGxlIHR5cGUuIDwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91Ci13YW50IHRvIGFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mCi1zY2hlbWEgY29tcG9uZW50cy4gPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZQotYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBzY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3UgZG8gbm90IHdhbnQgdGhlIHNpbXBsZSB0eXBlIHRvIGJlIHVzZWQgdG8gZGVyaXZlCi1vdGhlciB0eXBlcywgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkdmFuY2VkPC9zcGFuPiB0YWIgYW5kLCBpbgotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmFsPC9zcGFuPiBsaXN0LCBzZWxlY3QgaWYgZGVyaXZhdGlvbnMgc2hvdWxkCi1iZSBwcmV2ZW50ZWQgYnkgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+bGlzdDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnJlc3RyaWN0aW9uPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+dW5pb248L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiNhbGw8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkcmVnLmh0bWwiIHRpdGxlPSJBIHBhdHRlcm4gZmFjZXQgY2FuIGJlIHVzZWQgdG8gY29uc3RyYWluIHRoZSB2YWx1ZSBvZiBhIHR5cGUncyBsZXhpY2FsIHNwYWNlICh0aGUgc2V0IG9mIHN0cmluZyBsaXRlcmFscyB0aGF0IHJlcHJlc2VudCB0aGUgdmFsdWVzIG9mIGEgdHlwZSksIHdoaWNoIGluZGlyZWN0bHkgY29uc3RyYWlucyB0aGUgdmFsdWUgc3BhY2UuIj5BZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGN4bWxzY2guZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGN4bWxzY2guZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhYmQxMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjeG1sc2NoLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRjeG1sc2NoIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBYTUwgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+Q3JlYXRpbmcgWE1MIHNjaGVtYXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBjcmVhdGUgYW4gWE1MIHNjaGVtYSBhbmQgdGhlbiBlZGl0IGl0IHVzaW5nIHRoZSBYTUwgc2NoZW1hDQotZWRpdG9yLiBVc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW4gc3BlY2lmeSBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzDQotd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PlRvIGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzPD9QdWIgQ2FyZXQ/Pjo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q3JlYXRlIGEgcHJvamVjdCB0byBjb250YWluIHRoZSBYTUwgc2NoZW1hLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSB3b3JrYmVuY2gsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkZpbGUgPiBOZXcgPiBPdGhlcjwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+WE1MID4gWE1MIFNjaGVtYTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LiBDbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgWE1MIHNjaGVtYS4NCi1JbiB0aGUgPC9jbWQ+PGluZm8+PHVpY29udHJvbD5GaWxlIG5hbWU8L3VpY29udHJvbD4gZmllbGQsIHR5cGUgdGhlIG5hbWUgb2YNCi10aGUgWE1MIHNjaGVtYSwgZm9yIGV4YW1wbGUgPHVzZXJpbnB1dD5NeVhNTFNjaGVtYS54c2Q8L3VzZXJpbnB1dD4uIFRoZSBuYW1lDQotb2YgeW91ciBYTUwgc2NoZW1hIG11c3QgZW5kIGluIDxzeXN0ZW1vdXRwdXQ+LnhzZDwvc3lzdGVtb3V0cHV0Pi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+VGhlIFhNTCBzY2hlbWEgb3BlbnMgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiA8L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMTU1OD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3htbHNjaC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3htbHNjaC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjU3NDkyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGN4bWxzY2guaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gY3JlYXRlIGFuIFhNTCBzY2hlbWEgYW5kIHRoZW4gZWRpdCBpdCB1c2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIFVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvciwgeW91IGNhbiBzcGVjaWZ5IGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gY3JlYXRlIGFuIFhNTCBzY2hlbWEgYW5kIHRoZW4gZWRpdCBpdCB1c2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIFVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvciwgeW91IGNhbiBzcGVjaWZ5IGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgY3JlYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGZpbGVzLCBjcmVhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NobS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbHNjZWQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R2ZHRzY2htLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGN4bWxzY2giIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBYTUwgc2NoZW1hczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGN4bWxzY2giPjxhIG5hbWU9InRjeG1sc2NoIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBjcmVhdGUgYW4gWE1MIHNjaGVtYSBhbmQgdGhlbiBlZGl0IGl0IHVzaW5nIHRoZSBYTUwgc2NoZW1hCi1lZGl0b3IuIFVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvciwgeW91IGNhbiBzcGVjaWZ5IGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMKLXdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gY3JlYXRlIGFuIFhNTCBzY2hlbWEsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgcHJvamVjdCB0byBjb250YWluIHRoZSBYTUwgc2NoZW1hLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSB3b3JrYmVuY2gsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPgotPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MICZndDsgWE1MIFNjaGVtYTwvc3Bhbj4KLTwvc3Bhbj4uIENsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgcHJvamVjdCBvciBmb2xkZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIFhNTCBzY2hlbWEuCi1JbiB0aGUgPC9zcGFuPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlIG5hbWU8L3NwYW4+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mCi10aGUgWE1MIHNjaGVtYSwgZm9yIGV4YW1wbGUgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5NeVhNTFNjaGVtYS54c2Q8L2tiZD4uIFRoZSBuYW1lCi1vZiB5b3VyIFhNTCBzY2hlbWEgbXVzdCBlbmQgaW4gPHR0IGNsYXNzPSJzeXNvdXQiPi54c2Q8L3R0Pi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGUgWE1MIHNjaGVtYSBvcGVucyBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIDwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiB0aXRsZT0iVGhpcyBwcm9kdWN0IHByb3ZpZGVzIGFuIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcgWE1MIHNjaGVtYXMuIFhNTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIj5YTUwgc2NoZW1hIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaG0uaHRtbCIgdGl0bGU9IkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LiI+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90dmR0c2NobS5odG1sIiB0aXRsZT0iVmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgUHJvYmxlbXMgdmlldy4iPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZGVsc2NtcC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZGVsc2NtcC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTMyODhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGRlbHNjbXAuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGRlbHNjbXAiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50czwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIHlvdSBoYXZlIGNyZWF0ZWQgYW55IFhNTCBzY2hlbWEgY29tcG9uZW50cyB5b3Ugbm8gbG9uZ2VyIG5lZWQsDQoteW91IGNhbiBkZWxldGUgdGhlbS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+ZGVsZXRpbmcgY29tcG9uZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+ZGVsZXRpbmcgY29tcG9uZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGRlbGV0ZSBhbiBYTUwNCi1zY2hlbWEgY29tcG9uZW50LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIGNsaWNrIHRoZSBpdGVtIHRvIGRlbGV0ZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5SaWdodC1jbGljayB0aGUgaXRlbSwgYW5kLCBmcm9tIGl0cyBwb3AtdXAgbWVudSwgY2xpY2sgPHVpY29udHJvbD5EZWxldGU8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5UaGUgWE1MIHNjaGVtYSBlZGl0b3IgaGFzIGEgYnVpbHQtaW4gbWVjaGFuaXNtIHRvIGhhbmRsZSByZWZlcmVudGlhbA0KLWludGVncml0eSBpc3N1ZXMuIFdoZW4geW91IGRlbGV0ZSBjZXJ0YWluIGNvbXBvbmVudHMsIGNsZWFudXAgd2lsbCBhdXRvbWF0aWNhbGx5DQotb2NjdXIuPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPjw/UHViIENhcmV0Pz4NCi08P1B1YiAqMDAwMDAwMTM4ND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZGVsc2NtcC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZGVsc2NtcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg4MGMxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGRlbHNjbXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJJZiB5b3UgaGF2ZSBjcmVhdGVkIGFueSBYTUwgc2NoZW1hIGNvbXBvbmVudHMgeW91IG5vIGxvbmdlciBuZWVkLCB5b3UgY2FuIGRlbGV0ZSB0aGVtLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3UgaGF2ZSBjcmVhdGVkIGFueSBYTUwgc2NoZW1hIGNvbXBvbmVudHMgeW91IG5vIGxvbmdlciBuZWVkLCB5b3UgY2FuIGRlbGV0ZSB0aGVtLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBkZWxldGluZyBjb21wb25lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGRlbGV0aW5nIGNvbXBvbmVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcnJlZmludGcuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZGVsc2NtcCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGRlbHNjbXAiPjxhIG5hbWU9InRkZWxzY21wIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIHlvdSBoYXZlIGNyZWF0ZWQgYW55IFhNTCBzY2hlbWEgY29tcG9uZW50cyB5b3Ugbm8gbG9uZ2VyIG5lZWQsCi15b3UgY2FuIGRlbGV0ZSB0aGVtLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBkZWxldGUgYW4gWE1MCi1zY2hlbWEgY29tcG9uZW50LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgY2xpY2sgdGhlIGl0ZW0gdG8gZGVsZXRlLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+UmlnaHQtY2xpY2sgdGhlIGl0ZW0sIGFuZCwgZnJvbSBpdHMgcG9wLXVwIG1lbnUsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlbGV0ZTwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBzY2hlbWEgZWRpdG9yIGhhcyBhIGJ1aWx0LWluIG1lY2hhbmlzbSB0byBoYW5kbGUgcmVmZXJlbnRpYWwKLWludGVncml0eSBpc3N1ZXMuIFdoZW4geW91IGRlbGV0ZSBjZXJ0YWluIGNvbXBvbmVudHMsIGNsZWFudXAgd2lsbCBhdXRvbWF0aWNhbGx5Ci1vY2N1ci48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVscmVmIj48c3Ryb25nPlJlbGF0ZWQgcmVmZXJlbmNlPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9ycmVmaW50Zy5odG1sIiB0aXRsZT0iVGhlIFhNTCBzY2hlbWEgZWRpdG9yIGhhcyBhIGJ1aWx0LWluIG1lY2hhbmlzbSB0byBoYW5kbGUgcmVmZXJlbnRpYWwgaW50ZWdyaXR5IGlzc3Vlcy4gV2hlbiB5b3UgZGVsZXRlIGNlcnRhaW4gbm9kZXMsIGNsZWFuIHVwIGZvciBhbnkgbm9kZXMgYWZmZWN0ZWQgd2lsbCBhdXRvbWF0aWNhbGx5IG9jY3VyLiI+UmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcmVmLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcmVmLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjODQxMzQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJlZi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0ZWR0cHJlZiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIFhNTCBzY2hlbWEgZmlsZXMgc3VjaCBhcyB0aGUNCi1kZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UgYW5kIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBwcmVmaXggdXNlZC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5lZGl0aW5nIHByZWZlcmVuY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5wcmVmZXJlbmNlczxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VG8gZGVmaW5lIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlcywgY29tcGxldGUgdGhlIGZvbGxvd2luZw0KLXN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93ID4gUHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MDQotU2NoZW1hIEZpbGVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPlF1YWxpZnkgWE1MIHNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzPC91aWNvbnRyb2w+IGNoZWNrDQotYm94IGlmIHlvdSB3YW50IGEgcHJlZml4IGFwcGxpZWQgdG8gYWxsIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBpbg0KLXlvdXIgWE1MIHNjaGVtYS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5YTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4PC91aWNvbnRyb2w+IGZpZWxkLA0KLXR5cGUgdGhlIHByZWZpeCB5b3Ugd2FudCBhcHBsaWVkIHRvIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBpbiB5b3VyDQotWE1MIHNjaGVtYS48L2NtZD48aW5mbz5UaGUgcHJlZml4IDx1aWNvbnRyb2w+eHNkPC91aWNvbnRyb2w+IGlzIHVzZWQgYnkgY29udmVudGlvbg0KLXRvIGRlbm90ZSB0aGUgWE1MIFNjaGVtYSBuYW1lc3BhY2UsIGJ1dCBhbnkgcHJlZml4IGNhbiBiZSB1c2VkLiBUaGUgcHVycG9zZQ0KLW9mIHRoZSBhc3NvY2lhdGlvbiBpcyB0byBpZGVudGlmeSB0aGUgZWxlbWVudHMgYW5kIHNpbXBsZSB0eXBlcyBhcyBiZWxvbmdpbmcNCi10byB0aGUgdm9jYWJ1bGFyeSBvZiB0aGUgWE1MIFNjaGVtYSBsYW5ndWFnZSByYXRoZXIgdGhhbiB0aGUgdm9jYWJ1bGFyeSBvZg0KLXRoZSBzY2hlbWEgYXV0aG9yLiAgPG5vdGU+VGhpcyBwcmVmaXggd2lsbCBub3QgYXBwZWFyIGluIGFueSBzY2hlbWFzIHRoYXQNCi1jdXJyZW50bHkgZXhpc3QgLSBpdCB3aWxsIG9ubHkgYXBwZWFyIGluIG5ldyBzY2hlbWFzIHlvdSBjcmVhdGUgYWZ0ZXIgeW91DQotdHlwZSB0aGUgcHJlZml4IGFuZCBjbGljayA8dWljb250cm9sPkFwcGx5PC91aWNvbnRyb2w+LiBBbnkgc2NoZW1hcyB0aGF0IGFscmVhZHkNCi1leGlzdCB3aWxsIGhhdmUgdGhlIHByZWZpeCBzcGVjaWZpZWQgaW4gdGhlIHNjaGVtYSBhcHBsaWVkIHRvIHRoZSBYTUwgc2NoZW1hDQotbGFuZ3VhZ2UgY29uc3RydWN0cy48L25vdGU+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBjYW4gY2hhbmdlIHRoZSA8dWljb250cm9sPkRlZmF1bHQgVGFyZ2V0IE5hbWVzcGFjZTwvdWljb250cm9sPiB2YWx1ZS48L2NtZD4NCi08aW5mbz5UaGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoaXMgZmllbGQgd2lsbCBiZSB0aGUgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlDQotZm9yIGFueSBuZXcgWE1MIHNjaGVtYSBmaWxlcyBjcmVhdGVkLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDIzODE/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByZWYuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByZWYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzMjllZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcmVmLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciBYTUwgc2NoZW1hIGZpbGVzIHN1Y2ggYXMgdGhlIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSBhbmQgWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIHByZWZpeCB1c2VkLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciBYTUwgc2NoZW1hIGZpbGVzIHN1Y2ggYXMgdGhlIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSBhbmQgWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIHByZWZpeCB1c2VkLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIGVkaXRpbmcgcHJlZmVyZW5jZXMsIHByZWZlcmVuY2VzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgZWRpdGluZyBwcmVmZXJlbmNlcywgcHJlZmVyZW5jZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlZHRwcmVmIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlZHRwcmVmIj48YSBuYW1lPSJ0ZWR0cHJlZiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIFhNTCBzY2hlbWEgZmlsZXMgc3VjaCBhcyB0aGUKLWRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSBhbmQgWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIHByZWZpeCB1c2VkLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gZGVmaW5lIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlcywgY29tcGxldGUgdGhlIGZvbGxvd2luZwotc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3cgJmd0OyBQcmVmZXJlbmNlczwvc3Bhbj4KLTwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwKLVNjaGVtYSBGaWxlczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UXVhbGlmeSBYTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHM8L3NwYW4+IGNoZWNrCi1ib3ggaWYgeW91IHdhbnQgYSBwcmVmaXggYXBwbGllZCB0byBhbGwgWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIGluCi15b3VyIFhNTCBzY2hlbWEuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBwcmVmaXg8L3NwYW4+IGZpZWxkLAotdHlwZSB0aGUgcHJlZml4IHlvdSB3YW50IGFwcGxpZWQgdG8gWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIGluIHlvdXIKLVhNTCBzY2hlbWEuPC9zcGFuPiBUaGUgcHJlZml4IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnhzZDwvc3Bhbj4gaXMgdXNlZCBieSBjb252ZW50aW9uCi10byBkZW5vdGUgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlLCBidXQgYW55IHByZWZpeCBjYW4gYmUgdXNlZC4gVGhlIHB1cnBvc2UKLW9mIHRoZSBhc3NvY2lhdGlvbiBpcyB0byBpZGVudGlmeSB0aGUgZWxlbWVudHMgYW5kIHNpbXBsZSB0eXBlcyBhcyBiZWxvbmdpbmcKLXRvIHRoZSB2b2NhYnVsYXJ5IG9mIHRoZSBYTUwgU2NoZW1hIGxhbmd1YWdlIHJhdGhlciB0aGFuIHRoZSB2b2NhYnVsYXJ5IG9mCi10aGUgc2NoZW1hIGF1dGhvci4gIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaGlzIHByZWZpeCB3aWxsIG5vdCBhcHBlYXIgaW4gYW55IHNjaGVtYXMgdGhhdAotY3VycmVudGx5IGV4aXN0IC0gaXQgd2lsbCBvbmx5IGFwcGVhciBpbiBuZXcgc2NoZW1hcyB5b3UgY3JlYXRlIGFmdGVyIHlvdQotdHlwZSB0aGUgcHJlZml4IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj4uIEFueSBzY2hlbWFzIHRoYXQgYWxyZWFkeQotZXhpc3Qgd2lsbCBoYXZlIHRoZSBwcmVmaXggc3BlY2lmaWVkIGluIHRoZSBzY2hlbWEgYXBwbGllZCB0byB0aGUgWE1MIHNjaGVtYQotbGFuZ3VhZ2UgY29uc3RydWN0cy48L2Rpdj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBjaGFuZ2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlZmF1bHQgVGFyZ2V0IE5hbWVzcGFjZTwvc3Bhbj4gdmFsdWUuPC9zcGFuPgotIFRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhpcyBmaWVsZCB3aWxsIGJlIHRoZSBkZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UKLWZvciBhbnkgbmV3IFhNTCBzY2hlbWEgZmlsZXMgY3JlYXRlZC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaG0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaG0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmMmI5NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2htLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwOCwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGVkdHNjaG0iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BZnRlciB5b3UgY3JlYXRlIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gZWRpdCBpdHMgdmFyaW91cw0KLXByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5YTUwgc2NoZW1hIHByb3BlcnRpZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmVkaXRpbmcgcHJvcGVydGllczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+PD9QdWIgQ2FyZXQxPz5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4NCi1mb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyDQotcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBlZGl0IGFuIFhNTCBzY2hlbWEncyBwcm9wZXJ0aWVzLCBjb21wbGV0ZSB0aGUNCi1mb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBuZXcgWE1MIHNjaGVtYSBvciBkb3VibGUtY2xpY2sgYW4gZXhpc3Rpbmcgc2NoZW1hDQotaW4gdGhlIE5hdmlnYXRvciB2aWV3LjwvY21kPjxpbmZvPiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgb3BlbiBpbiB0aGUNCi1YTUwgc2NoZW1hIGVkaXRvci48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgY2xpY2sgPHVpY29udHJvbD5EaXJlY3RpdmVzPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNsaWNrIHRoZSA8dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD4gdGFiLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBjYW4gY2hhbmdlIHRoZSA8dWljb250cm9sPlByZWZpeDwvdWljb250cm9sPiBhc3NvY2lhdGVkDQotd2l0aCB0aGUgY3VycmVudCBuYW1lc3BhY2UuIDwvY21kPjxpbmZvPkVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lcw0KLXRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhpcw0KLXZhbHVlLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3UgY2FuIGFsc28gZWRpdCB0aGUgPHVpY29udHJvbD5UYXJnZXQgbmFtZXNwYWNlPC91aWNvbnRyb2w+IGZvcg0KLXRoaXMgc2NoZW1hLjwvY21kPjxpbmZvPiBBIG5hbWVzcGFjZSBpcyBhIFVSSSB0aGF0IHByb3ZpZGVzIGEgdW5pcXVlDQotbmFtZSB0byBhc3NvY2lhdGUgd2l0aCBhbGwgdGhlIGVsZW1lbnRzIGFuZCB0eXBlIGRlZmluaXRpb25zIGluIGENCi1zY2hlbWEuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdQ0KLXdhbnQgdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBYTUwgc2NoZW1hLiA8L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3UNCi13YW50IHRvIGFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mDQotc2NoZW1hIGNvbXBvbmVudHMuIDwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZQ0KLWFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+QWR2YW5jZWQ8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gZGVmaW5lIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBzY2hlbWEgYXR0cmlidXRlczogPC9jbWQ+PGluZm8+PHVsPg0KLTxsaT48dWljb250cm9sPlByZWZpeCBmb3IgZWxlbWVudHM8L3VpY29udHJvbD4gKGVsZW1lbnRGb3JtRGVmYXVsdCk8L2xpPg0KLTxsaT48dWljb250cm9sPlByZWZpeCBmb3IgYXR0cmlidXRlczwvdWljb250cm9sPiAoYXR0cmlidXRlRm9ybURlZmF1bHQpPC9saT4NCi08bGk+PHVpY29udHJvbD5CbG9jayBkZWZhdWx0PC91aWNvbnRyb2w+IChibG9ja0RlZmF1bHQpPC9saT4NCi08bGk+PHVpY29udHJvbD5GaW5hbCBkZWZhdWx0PC91aWNvbnRyb2w+IChmaW5hbERlZmF1bHQpPC9saT4NCi08L3VsPjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjc4MD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWQ1YWU2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaG0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBZnRlciB5b3UgY3JlYXRlIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gZWRpdCBpdHMgdmFyaW91cyBwcm9wZXJ0aWVzLCBzdWNoIGFzIGl0cyBuYW1lc3BhY2UgYW5kIHByZWZpeC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzLCBYTUwgc2NoZW1hIGZpbGVzLCBlZGl0aW5nIHByb3BlcnRpZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzLCBYTUwgc2NoZW1hIGZpbGVzLCBlZGl0aW5nIHByb3BlcnRpZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlZHRzY2htIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlZHRzY2htIj48YSBuYW1lPSJ0ZWR0c2NobSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzCi1wcm9wZXJ0aWVzLCBzdWNoIGFzIGl0cyBuYW1lc3BhY2UgYW5kIHByZWZpeC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbgotZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlcgotcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGVkaXQgYW4gWE1MIHNjaGVtYSdzIHByb3BlcnRpZXMsIGNvbXBsZXRlIHRoZQotZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSBhIG5ldyBYTUwgc2NoZW1hIG9yIGRvdWJsZS1jbGljayBhbiBleGlzdGluZyBzY2hlbWEKLWluIHRoZSBOYXZpZ2F0b3Igdmlldy48L3NwYW4+ICBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgb3BlbiBpbiB0aGUKLVhNTCBzY2hlbWEgZWRpdG9yLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGlyZWN0aXZlczwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gdGFiLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBjaGFuZ2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZpeDwvc3Bhbj4gYXNzb2NpYXRlZAotd2l0aCB0aGUgY3VycmVudCBuYW1lc3BhY2UuIDwvc3Bhbj4gRWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzCi10aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBuYW1lc3BhY2Ugd2lsbCBiZSBwcmVmaXhlZCB3aXRoIHRoaXMKLXZhbHVlLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBhbHNvIGVkaXQgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRhcmdldCBuYW1lc3BhY2U8L3NwYW4+IGZvcgotdGhpcyBzY2hlbWEuPC9zcGFuPiAgQSBuYW1lc3BhY2UgaXMgYSBVUkkgdGhhdCBwcm92aWRlcyBhIHVuaXF1ZQotbmFtZSB0byBhc3NvY2lhdGUgd2l0aCBhbGwgdGhlIGVsZW1lbnRzIGFuZCB0eXBlIGRlZmluaXRpb25zIGluIGEKLXNjaGVtYS48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91Ci13YW50IHRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgWE1MIHNjaGVtYS4gPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3UKLXdhbnQgdG8gYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2YKLXNjaGVtYSBjb21wb25lbnRzLiA8L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlCi1hbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZHZhbmNlZDwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBkZWZpbmUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHNjaGVtYSBhdHRyaWJ1dGVzOiA8L3NwYW4+IDx1bD4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmaXggZm9yIGVsZW1lbnRzPC9zcGFuPiAoZWxlbWVudEZvcm1EZWZhdWx0KTwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmaXggZm9yIGF0dHJpYnV0ZXM8L3NwYW4+IChhdHRyaWJ1dGVGb3JtRGVmYXVsdCk8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+QmxvY2sgZGVmYXVsdDwvc3Bhbj4gKGJsb2NrRGVmYXVsdCk8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluYWwgZGVmYXVsdDwvc3Bhbj4gKGZpbmFsRGVmYXVsdCk8L2xpPgotCi08L3VsPgotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHNjaG0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHNjaG0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAwMTRlYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXBzY2htLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRpbXBzY2htIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5JbXBvcnRpbmcgWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkltcG9ydGluZyBYTUwgc2NoZW1hczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JZiB5b3Ugd2FudCB0byB3b3JrIHdpdGggWE1MIHNjaGVtYSBmaWxlcyB0aGF0IHlvdSBjcmVhdGVkIG91dHNpZGUNCi1vZiB0aGUgcHJvZHVjdCwgeW91IGNhbiBpbXBvcnQgdGhlbSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW4gdGhlbSBpbiB0aGUNCi1YTUwgc2NoZW1hIGVkaXRvci4gVGhlIFhNTCBzY2hlbWEgZWRpdG9yIHByb3ZpZGVzIHlvdSB3aXRoIGEgc3RydWN0dXJlZCB2aWV3DQotb2YgdGhlIFhNTCBzY2hlbWEuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+aW1wb3J0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gaW1wb3J0IGFuIFhNTA0KLXNjaGVtYSBpbnRvIHRoZSB3b3JrYmVuY2gsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlID4gSW1wb3J0PC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD48dWljb250cm9sPkZpbGUNCi1TeXN0ZW08L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBhbmQgY2xpY2sgIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiBvbiB0aGUgbmV4dCBwYWdlIG9mIHRoZSB3aXphcmQNCi10byBzZWxlY3QgdGhlIGRpcmVjdG9yaWVzIGZyb20gd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gYWRkIHRoZSBYTUwgc2NoZW1hLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBpbXBvcnQgc2VsZWN0aW9uIHBhbmVzLCB1c2UgdGhlIGZvbGxvd2luZyBtZXRob2RzIHRvIHNlbGVjdA0KLWV4YWN0bHkgdGhlIHJlc291cmNlcyB5b3Ugd2FudCB0byBhZGQ6ICA8L2NtZD48aW5mbz48dWw+DQotPGxpPkV4cGFuZCB0aGUgaGllcmFyY2hpZXMgaW4gdGhlIGxlZnQgcGFuZSBhbmQgc2VsZWN0IG9yIGNsZWFyIHRoZSBjaGVja2JveGVzDQotdGhhdCByZXByZXNlbnQgdGhlIGZvbGRlcnMgaW4gdGhlIHNlbGVjdGVkIGRpcmVjdG9yeS4gVGhlbiBpbiB0aGUgcmlnaHQgcGFuZSwNCi1zZWxlY3Qgb3IgY2xlYXIgY2hlY2sgYm94ZXMgZm9yIGluZGl2aWR1YWwgZmlsZXMuPC9saT4NCi08bGk+Q2xpY2sgPHVpY29udHJvbD5GaWx0ZXIgVHlwZXM8L3VpY29udHJvbD4gdG8gZmlsdGVyIHRoZSBjdXJyZW50IHNlbGVjdGlvbg0KLWZvciBmaWxlcyBvZiBhIHNwZWNpZmljIHR5cGUuPC9saT4NCi08bGk+Q2xpY2sgPHVpY29udHJvbD5TZWxlY3QgQWxsPC91aWNvbnRyb2w+IHRvIHNlbGVjdCBhbGwgcmVzb3VyY2VzIGluIHRoZQ0KLWRpcmVjdG9yeSwgdGhlbiBnbyB0aHJvdWdoIGFuZCBkZXNlbGVjdCB0aGUgb25lcyB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byBhZGQuPC9saT4NCi08bGk+Q2xpY2sgPHVpY29udHJvbD5EZXNlbGVjdCBBbGw8L3VpY29udHJvbD4gdG8gZGVzZWxlY3QgYWxsIHJlc291cmNlcyBpbg0KLXRoZSBkaXJlY3RvcnksIHRoZW4gZ28gdGhyb3VnaCBhbmQgY2hvb3NlIGluZGl2aWR1YWwgcmVzb3VyY2VzIHRvIGFkZC48L2xpPg0KLTwvdWw+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPkludG8gZm9sZGVyPC91aWNvbnRyb2w+IGZpZWxkLCBzcGVjaWZ5IHRoZSBXb3JrYmVuY2gNCi1wcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgYmUgdGhlIGltcG9ydCBkZXN0aW5hdGlvbi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5XaGVuIHlvdSBoYXZlIGZpbmlzaGVkIHNwZWNpZnlpbmcgeW91ciBpbXBvcnQgb3B0aW9ucywgY2xpY2sgPHVpY29udHJvbD5GaW5pc2guPC91aWNvbnRyb2w+PC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+PD9QdWIgQ2FyZXQxPz4NCi08cmVzdWx0PjxwPlRoZSBpbXBvcnRlZCBzY2hlbWEgbm93IGFwcGVhcnMgaW4gdGhlIE5hdmlnYXRvciB2aWV3LiBEb3VibGUtY2xpY2sNCi1pdCB0byBvcGVuIGl0IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDI2MTY/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHNjaG0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHNjaG0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmMzhhOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXBzY2htLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSW1wb3J0aW5nIFhNTCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBYTUwgc2NoZW1hIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgcHJvZHVjdCwgeW91IGNhbiBpbXBvcnQgdGhlbSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW4gdGhlbSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIFRoZSBYTUwgc2NoZW1hIGVkaXRvciBwcm92aWRlcyB5b3Ugd2l0aCBhIHN0cnVjdHVyZWQgdmlldyBvZiB0aGUgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSWYgeW91IHdhbnQgdG8gd29yayB3aXRoIFhNTCBzY2hlbWEgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVGhlIFhNTCBzY2hlbWEgZWRpdG9yIHByb3ZpZGVzIHlvdSB3aXRoIGEgc3RydWN0dXJlZCB2aWV3IG9mIHRoZSBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIGltcG9ydGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIGltcG9ydGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NobS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbHNjZWQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R2ZHRzY2htLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkaW1wdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGluY2wuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0aW1wc2NobSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkltcG9ydGluZyBYTUwgc2NoZW1hczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGltcHNjaG0iPjxhIG5hbWU9InRpbXBzY2htIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5JbXBvcnRpbmcgWE1MIHNjaGVtYXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBYTUwgc2NoZW1hIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZQotb2YgdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlCi1YTUwgc2NoZW1hIGVkaXRvci4gVGhlIFhNTCBzY2hlbWEgZWRpdG9yIHByb3ZpZGVzIHlvdSB3aXRoIGEgc3RydWN0dXJlZCB2aWV3Ci1vZiB0aGUgWE1MIHNjaGVtYS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gaW1wb3J0IGFuIFhNTAotc2NoZW1hIGludG8gdGhlIHdvcmtiZW5jaCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgJmd0OyBJbXBvcnQ8L3NwYW4+PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZQotU3lzdGVtPC9zcGFuPjwvc3Bhbj4gYW5kIGNsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gb24gdGhlIG5leHQgcGFnZSBvZiB0aGUgd2l6YXJkCi10byBzZWxlY3QgdGhlIGRpcmVjdG9yaWVzIGZyb20gd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gYWRkIHRoZSBYTUwgc2NoZW1hLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIGltcG9ydCBzZWxlY3Rpb24gcGFuZXMsIHVzZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdG8gc2VsZWN0Ci1leGFjdGx5IHRoZSByZXNvdXJjZXMgeW91IHdhbnQgdG8gYWRkOiAgPC9zcGFuPiA8dWw+Ci08bGk+RXhwYW5kIHRoZSBoaWVyYXJjaGllcyBpbiB0aGUgbGVmdCBwYW5lIGFuZCBzZWxlY3Qgb3IgY2xlYXIgdGhlIGNoZWNrYm94ZXMKLXRoYXQgcmVwcmVzZW50IHRoZSBmb2xkZXJzIGluIHRoZSBzZWxlY3RlZCBkaXJlY3RvcnkuIFRoZW4gaW4gdGhlIHJpZ2h0IHBhbmUsCi1zZWxlY3Qgb3IgY2xlYXIgY2hlY2sgYm94ZXMgZm9yIGluZGl2aWR1YWwgZmlsZXMuPC9saT4KLQotPGxpPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbHRlciBUeXBlczwvc3Bhbj4gdG8gZmlsdGVyIHRoZSBjdXJyZW50IHNlbGVjdGlvbgotZm9yIGZpbGVzIG9mIGEgc3BlY2lmaWMgdHlwZS48L2xpPgotCi08bGk+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2VsZWN0IEFsbDwvc3Bhbj4gdG8gc2VsZWN0IGFsbCByZXNvdXJjZXMgaW4gdGhlCi1kaXJlY3RvcnksIHRoZW4gZ28gdGhyb3VnaCBhbmQgZGVzZWxlY3QgdGhlIG9uZXMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gYWRkLjwvbGk+Ci0KLTxsaT5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXNlbGVjdCBBbGw8L3NwYW4+IHRvIGRlc2VsZWN0IGFsbCByZXNvdXJjZXMgaW4KLXRoZSBkaXJlY3RvcnksIHRoZW4gZ28gdGhyb3VnaCBhbmQgY2hvb3NlIGluZGl2aWR1YWwgcmVzb3VyY2VzIHRvIGFkZC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW50byBmb2xkZXI8L3NwYW4+IGZpZWxkLCBzcGVjaWZ5IHRoZSBXb3JrYmVuY2gKLXByb2plY3Qgb3IgZm9sZGVyIHRoYXQgd2lsbCBiZSB0aGUgaW1wb3J0IGRlc3RpbmF0aW9uLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPldoZW4geW91IGhhdmUgZmluaXNoZWQgc3BlY2lmeWluZyB5b3VyIGltcG9ydCBvcHRpb25zLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2guPC9zcGFuPjwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBpbXBvcnRlZCBzY2hlbWEgbm93IGFwcGVhcnMgaW4gdGhlIE5hdmlnYXRvciB2aWV3LiBEb3VibGUtY2xpY2sKLWl0IHRvIG9wZW4gaXQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiB0aXRsZT0iVGhpcyBwcm9kdWN0IHByb3ZpZGVzIGFuIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcgWE1MIHNjaGVtYXMuIFhNTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIj5YTUwgc2NoZW1hIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaG0uaHRtbCIgdGl0bGU9IkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LiI+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90dmR0c2NobS5odG1sIiB0aXRsZT0iVmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgUHJvYmxlbXMgdmlldy4iPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkaW1wdC5odG1sIiB0aXRsZT0iSWYgeW91ciBzY2hlbWFzIGFyZSBsYXJnZSwgeW91IG1pZ2h0IGNob29zZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgdG8gbWFrZSB0aGVtIGVhc2llciB0byBtYWludGFpbiwgcmV1c2UsIGFuZCByZWFkLiBZb3UgY2FuIHVzZSBhbiBpbXBvcnQgZWxlbWVudCB0byBicmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gYW4gaW1wb3J0ZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiI+QWRkaW5nIGltcG9ydCBlbGVtZW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRpbmNsLmh0bWwiIHRpdGxlPSJJZiB5b3VyIHNjaGVtYXMgYXJlIGxhcmdlLCB5b3UgbWlnaHQgY2hvb3NlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyB0byBtYWtlIHRoZW0gZWFzaWVyIHRvIG1haW50YWluLCByZXVzZSwgYW5kIHJlYWQuIFlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlIGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIFRoZSBpbmNsdWRlZCBzY2hlbWEgbXVzdCBiZSBpbiB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZSBpbmNsdWRpbmcgc2NoZW1hLiI+QWRkaW5nIGluY2x1ZGUgZWxlbWVudHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90bmF2c3JjLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RuYXZzcmMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAzODZkMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RuYXZzcmMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idG5hdnNyYyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+TmF2aWdhdGluZyBYTUwgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+TmF2aWdhdGluZyBYTUwgc2NoZW1hczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5XaGVuIHlvdSBhcmUgd29ya2luZyBpbiB0aGUgU291cmNlIHZpZXcsIHlvdSBjYW4gdXNlIEYzIHRvIG5hdmlnYXRlDQotdGhyb3VnaCB0aGUgZmlsZSBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluIHRoZSBhcHByb3ByaWF0ZSBpdGVtIGFuZCBwcmVzc2luZw0KLUYzIHRvIGp1bXAgdG8gdGhlIGl0ZW0gaXQgcmVmZXJzIHRvLiA8L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5uYXZpZ2F0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Zb3UgY2FuIGp1bXAgdG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgaXRlbXM6PC9wPjx1bD4NCi08bGk+RWxlbWVudCBvciBhdHRyaWJ1dGUgZGVjbGFyYXRpb24ncyB0eXBlPC9saT4NCi08bGk+RWxlbWVudCByZWZlcmVuY2VzPC9saT4NCi08bGk+R3JvdXAgcmVmZXJlbmNlczwvbGk+DQotPGxpPkF0dHJpYnV0ZSByZWZlcmVuY2VzPC9saT4NCi08bGk+QXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZXM8L2xpPg0KLTxsaT5JbXBvcnQsIGluY2x1ZGUsIGFuZCByZWRlZmluZSBlbGVtZW50ICh0aGUgZXh0ZXJuYWwgc2NoZW1hIHdpbGwgb3BlbiBpbg0KLXRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVGhpcyBvbmx5IHdvcmtzIHdpdGggc2NoZW1hcyBpbiB0aGUgd29ya3NwYWNlKS48L2xpPg0KLTxsaT48L2xpPg0KLTwvdWw+PHA+WW91PD9QdWIgQ2FyZXQ/PiBtdXN0IHBsYWNlIHlvdXIgY3Vyc29yIGV4YWN0bHkgaW4gdGhlIGxvY2F0aW9uIG9mDQotdGhlIHJlZmVyZW5jZSAoZm9yIGV4YW1wbGUgYmV0d2VlbiB0aGUgZG91YmxlIHF1b3RlcyBmb3IgPHN5c3RlbW91dHB1dD50eXBlDQotPSAiICI8L3N5c3RlbW91dHB1dD4gb3IgIDxzeXN0ZW1vdXRwdXQ+YmFzZSA9ICIgIjwvc3lzdGVtb3V0cHV0PikuPC9wPjxwPkZvcg0KLWV4YW1wbGUsIGlmIHlvdSBwbGFjZSB5b3VyIGN1cnNvciBhbnl3aGVyZSBpbiB0aGUgZm9sbG93aW5nIHRleHQgYW5kIHByZXNzDQotRjM6PC9wPjxwPiA8c3lzdGVtb3V0cHV0PiZsdDtlbGVtZW50IG5hbWU9InNoaXBUbyIgdHlwZT0icG86VVNBZGRyZXNzIj4mbHQ7L2VsZW1lbnQ+PC9zeXN0ZW1vdXRwdXQ+IDwvcD48cD50aGUNCi1jdXJzb3Igd2lsbCBhdXRvbWF0aWNhbGx5IGp1bXAgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBmaWxlIHdoZXJlIHRoZSB0eXBlDQotVVNBZGRyZXNzIGlzIGRlZmluZWQuPC9wPjxwPk9yLCBpZiB5b3UgcGxhY2UgeW91ciBjdXJzb3IgYW55d2hlcmUgaW4gdGhlIGZvbGxvd2luZw0KLXRleHQgYW5kIGNsaWNrIEYzOjwvcD48cD4gPHN5c3RlbW91dHB1dD4mbHQ7ZWxlbWVudCByZWY9InBvOkNvbnRhY3RFbGVtZW50Ij4mbHQ7L2VsZW1lbnQ+PC9zeXN0ZW1vdXRwdXQ+IDwvcD48cD50aGUNCi1jdXJzb3Igd2lsbCBhdXRvbWF0aWNhbGx5IGp1bXAgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBmaWxlIHdoZXJlIHRoZSBnbG9iYWwNCi1lbGVtZW50IENvbnRhY3RFbGVtZW50IGlzIGRlZmluZWQuPC9wPjxwPlRoaXMgd29ya3MgYWNyb3NzIGZpbGVzLiBGb3IgZXhhbXBsZSwNCi1pZiB0aGUgdHlwZSB5b3UgaGF2ZSBzZWxlY3RlZCBpcyBkZWZpbmVkIGluIGFub3RoZXIgWE1MIHNjaGVtYSBhbmQgeW91IGNsaWNrDQotRjMsIHlvdSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdGFrZW4gdG8gdGhhdCBmaWxlLjwvcD48L2NvbnRleHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDIwNjY/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdG5hdnNyYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90bmF2c3JjLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZTRkZjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90bmF2c3JjLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJOYXZpZ2F0aW5nIFhNTCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IldoZW4geW91IGFyZSB3b3JraW5nIGluIHRoZSBTb3VyY2UgdmlldywgeW91IGNhbiB1c2UgRjMgdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUgZmlsZSBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluIHRoZSBhcHByb3ByaWF0ZSBpdGVtIGFuZCBwcmVzc2luZyBGMyB0byBqdW1wIHRvIHRoZSBpdGVtIGl0IHJlZmVycyB0by4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iV2hlbiB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIFNvdXJjZSB2aWV3LCB5b3UgY2FuIHVzZSBGMyB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBmaWxlIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW4gdGhlIGFwcHJvcHJpYXRlIGl0ZW0gYW5kIHByZXNzaW5nIEYzIHRvIGp1bXAgdG8gdGhlIGl0ZW0gaXQgcmVmZXJzIHRvLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIG5hdmlnYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGZpbGVzLCBuYXZpZ2F0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxzY2VkLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idG5hdnNyYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPk5hdmlnYXRpbmcgWE1MIHNjaGVtYXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRuYXZzcmMiPjxhIG5hbWU9InRuYXZzcmMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk5hdmlnYXRpbmcgWE1MIHNjaGVtYXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPldoZW4geW91IGFyZSB3b3JraW5nIGluIHRoZSBTb3VyY2UgdmlldywgeW91IGNhbiB1c2UgRjMgdG8gbmF2aWdhdGUKLXRocm91Z2ggdGhlIGZpbGUgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbiB0aGUgYXBwcm9wcmlhdGUgaXRlbSBhbmQgcHJlc3NpbmcKLUYzIHRvIGp1bXAgdG8gdGhlIGl0ZW0gaXQgcmVmZXJzIHRvLiA8L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4ganVtcCB0byBhbnkgb2YgdGhlIGZvbGxvd2luZyBpdGVtczo8L3A+Ci08dWw+Ci08bGk+RWxlbWVudCBvciBhdHRyaWJ1dGUgZGVjbGFyYXRpb24ncyB0eXBlPC9saT4KLQotPGxpPkVsZW1lbnQgcmVmZXJlbmNlczwvbGk+Ci0KLTxsaT5Hcm91cCByZWZlcmVuY2VzPC9saT4KLQotPGxpPkF0dHJpYnV0ZSByZWZlcmVuY2VzPC9saT4KLQotPGxpPkF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2VzPC9saT4KLQotPGxpPkltcG9ydCwgaW5jbHVkZSwgYW5kIHJlZGVmaW5lIGVsZW1lbnQgKHRoZSBleHRlcm5hbCBzY2hlbWEgd2lsbCBvcGVuIGluCi10aGUgWE1MIHNjaGVtYSBlZGl0b3IuIFRoaXMgb25seSB3b3JrcyB3aXRoIHNjaGVtYXMgaW4gdGhlIHdvcmtzcGFjZSkuPC9saT4KLQotPGxpIC8+Ci0KLTwvdWw+Ci08cD5Zb3UgbXVzdCBwbGFjZSB5b3VyIGN1cnNvciBleGFjdGx5IGluIHRoZSBsb2NhdGlvbiBvZgotdGhlIHJlZmVyZW5jZSAoZm9yIGV4YW1wbGUgYmV0d2VlbiB0aGUgZG91YmxlIHF1b3RlcyBmb3IgPHR0IGNsYXNzPSJzeXNvdXQiPnR5cGUKLT0gIiAiPC90dD4gb3IgIDx0dCBjbGFzcz0ic3lzb3V0Ij5iYXNlID0gIiAiPC90dD4pLjwvcD4KLTxwPkZvcgotZXhhbXBsZSwgaWYgeW91IHBsYWNlIHlvdXIgY3Vyc29yIGFueXdoZXJlIGluIHRoZSBmb2xsb3dpbmcgdGV4dCBhbmQgcHJlc3MKLUYzOjwvcD4KLTxwPiA8dHQgY2xhc3M9InN5c291dCI+Jmx0O2VsZW1lbnQgbmFtZT0ic2hpcFRvIiB0eXBlPSJwbzpVU0FkZHJlc3MiJmd0OyZsdDsvZWxlbWVudCZndDs8L3R0PiA8L3A+Ci08cD50aGUKLWN1cnNvciB3aWxsIGF1dG9tYXRpY2FsbHkganVtcCB0byB0aGUgbG9jYXRpb24gaW4gdGhlIGZpbGUgd2hlcmUgdGhlIHR5cGUKLVVTQWRkcmVzcyBpcyBkZWZpbmVkLjwvcD4KLTxwPk9yLCBpZiB5b3UgcGxhY2UgeW91ciBjdXJzb3IgYW55d2hlcmUgaW4gdGhlIGZvbGxvd2luZwotdGV4dCBhbmQgY2xpY2sgRjM6PC9wPgotPHA+IDx0dCBjbGFzcz0ic3lzb3V0Ij4mbHQ7ZWxlbWVudCByZWY9InBvOkNvbnRhY3RFbGVtZW50IiZndDsmbHQ7L2VsZW1lbnQmZ3Q7PC90dD4gPC9wPgotPHA+dGhlCi1jdXJzb3Igd2lsbCBhdXRvbWF0aWNhbGx5IGp1bXAgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBmaWxlIHdoZXJlIHRoZSBnbG9iYWwKLWVsZW1lbnQgQ29udGFjdEVsZW1lbnQgaXMgZGVmaW5lZC48L3A+Ci08cD5UaGlzIHdvcmtzIGFjcm9zcyBmaWxlcy4gRm9yIGV4YW1wbGUsCi1pZiB0aGUgdHlwZSB5b3UgaGF2ZSBzZWxlY3RlZCBpcyBkZWZpbmVkIGluIGFub3RoZXIgWE1MIHNjaGVtYSBhbmQgeW91IGNsaWNrCi1GMywgeW91IHdpbGwgYXV0b21hdGljYWxseSBiZSB0YWtlbiB0byB0aGF0IGZpbGUuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxzY2VkLmh0bWwiIHRpdGxlPSJUaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLCBhbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWE1MIHNjaGVtYXMgYXJlIGEgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iPlhNTCBzY2hlbWEgZWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHJlZmFjdHJYU0QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHJlZmFjdHJYU0QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczNmE0YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RyZWZhY3RyWFNELmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InJlZmFjdG9yaW5nIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5SZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5SZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPldpdGhpbiBhbiBYTUwgU2NoZW1hIGZpbGUsIHJlZmFjdG9yaW5nIGFsbG93cyBhdXRob3JzIHRvIG1ha2UgYQ0KLXNpbmdsZSBhcnRpZmFjdCBjaGFuZ2UsIGFuZCBoYXZlIHRoYXQgY2hhbmdlIGltcGxlbWVudGVkIHRocm91Z2hvdXQgYWxsIG90aGVyDQotZGVwZW5kYW50IGFydGlmYWN0cy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRyZWZhY3RyWFNEfDF8ZGVwZW5kZW50YXJ0aWZhY3RzcmVmYWN0b3J0aW5nWE1Mc2NoZW1hZmlsZXMiDQotc3RhdHVzPSJuZXciPmRlcGVuZGVudCBhcnRpZmFjdHM8aW5kZXh0ZXJtPnJlZmFjdG9yaW5nIFhNTCBzY2hlbWEgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtIGtleXJlZj0idHJlZmFjdHJYU0R8MnxyZWZhY3RvcmluZ1hNTHNjaGVtYWZpbGVzIiBzdGF0dXM9Im5ldyI+cmVmYWN0b3Jpbmc8aW5kZXh0ZXJtPlhNTA0KLXNjaGVtYSBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0ga2V5cmVmPSJ0cmVmYWN0clhTRHwzfHJlbmFtaW5nWE1Mc2NoZW1hZmlsZXMiDQotc3RhdHVzPSJuZXciPnJlbmFtaW5nPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybQ0KLWtleXJlZj0idHJlZmFjdHJYU0R8NHxYTUxzY2hlbWFzZWRpdGluZyIgc3RhdHVzPSJjaGFuZ2VkIj5zY2hlbWFzPGluZGV4dGVybT5lZGl0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08cHJlcmVxPjwvcHJlcmVxPg0KLTxjb250ZXh0PlJlZmFjdG9yaW5nIGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIHRoZSB0ZWRpb3VzIGVkaXRpbmcgbmVjZXNzYXJ5DQotdG8gcmVjb3ZlciBicm9rZW4gZGVwZW5kZW5jaWVzIGNhdXNlZCBieSBhcnRpZmFjdCBjaGFuZ2VzIHdoaWNoIGNhdXNlIHJpcHBsZQ0KLWVmZmVjdHMgb24gb3RoZXIgZGVwZW5kYW50IGFydGlmYWN0cyAoc3VjaCBhcyByZW5hbWluZyBhbiBYTUwgU2NoZW1hIGVsZW1lbnQpLjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBuZXcgWE1MIHNjaGVtYSBvciBkb3VibGUtY2xpY2sgYW4gZXhpc3Rpbmcgc2NoZW1hIGluIHRoZQ0KLU5hdmlnYXRvciB2aWV3LjwvY21kPjxpbmZvPiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgb3BlbiBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRvIHJlZmFjdG9yIGFuIGFydGlmYWN0LCBwb3NpdGlvbiBjdXJzb3Igd2l0aGluIHRoZSBhcnRpZmFjdCwgcmlnaHQtY2xpY2sNCi10aGUgYXJ0aWZhY3QsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPlJlZmFjdG9yPC91aWNvbnRyb2w+PHVpY29udHJvbD5SZW5hbWU8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPjwvY21kPjxpbmZvPkEgcG9wdXAgZGlhbG9nIHdpbGwgcmVxdWVzdCB0aGUgZW50cnkgb2YgYSBuZXcgbmFtZQ0KLWZvciB0aGF0IGFydGlmYWN0PC9pbmZvPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlR5cGUgaW4gdGhlIG5ldyBuYW1lIG9mIHRoZSBhcnRpZmFjdC48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD4oT3B0aW9uYWwpIENsaWNrIDxiPlByZXZpZXc8L2I+LjwvY21kPjxpbmZvPkEgd2luZG93IHdpbGwgb3Blbg0KLWluZGljYXRpbmcgYWxsIG9mIHRoZSBjaGFuZ2VzIHdoaWNoIHdpbGwgdGFrZSBwbGFjZSBkdWUgdG8gdGhlIHJlZmFjdG9yaW5nLjwvaW5mbz4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LLjwvdWljb250cm9sPjwvY21kPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+VGhlIG5ldyBuYW1lIHdpbGwgYmUgZW50ZXJlZCBpbiB0aGUgb3BlbmVkIFhTRCBzb3VyY2UsIGFzIHdlbGwgYXMNCi1pbiBhbGwgZGVwZW5kYW50IGFydGlmYWN0cy48L3Jlc3VsdD4NCi08ZXhhbXBsZT48Yj48dT5Db21wb25lbnQgUmVmZXJlbmNlcyBpbiBYTUwgU2NoZW1hPC91PjwvYj48c2ltcGxldGFibGU+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+PC9leGFtcGxlPg0KLTxwb3N0cmVxPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RyZWZhY3RyWFNELmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RyZWZhY3RyWFNELmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMWE5MzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90cmVmYWN0clhTRC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iV2l0aGluIGFuIFhNTCBTY2hlbWEgZmlsZSwgcmVmYWN0b3JpbmcgYWxsb3dzIGF1dGhvcnMgdG8gbWFrZSBhIHNpbmdsZSBhcnRpZmFjdCBjaGFuZ2UsIGFuZCBoYXZlIHRoYXQgY2hhbmdlIGltcGxlbWVudGVkIHRocm91Z2hvdXQgYWxsIG90aGVyIGRlcGVuZGFudCBhcnRpZmFjdHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldpdGhpbiBhbiBYTUwgU2NoZW1hIGZpbGUsIHJlZmFjdG9yaW5nIGFsbG93cyBhdXRob3JzIHRvIG1ha2UgYSBzaW5nbGUgYXJ0aWZhY3QgY2hhbmdlLCBhbmQgaGF2ZSB0aGF0IGNoYW5nZSBpbXBsZW1lbnRlZCB0aHJvdWdob3V0IGFsbCBvdGhlciBkZXBlbmRhbnQgYXJ0aWZhY3RzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImRlcGVuZGVudCBhcnRpZmFjdHMsIHJlZmFjdG9yaW5nIFhNTCBzY2hlbWEgZmlsZXMsIHJlZmFjdG9yaW5nLCBYTUwgc2NoZW1hIGZpbGVzLCByZW5hbWluZywgWE1MIHNjaGVtYSBmaWxlcywgc2NoZW1hcywgZWRpdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImRlcGVuZGVudCBhcnRpZmFjdHMsIHJlZmFjdG9yaW5nIFhNTCBzY2hlbWEgZmlsZXMsIHJlZmFjdG9yaW5nLCBYTUwgc2NoZW1hIGZpbGVzLCByZW5hbWluZywgWE1MIHNjaGVtYSBmaWxlcywgc2NoZW1hcywgZWRpdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icmVmYWN0b3JpbmciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5SZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyZWZhY3RvcmluZyI+PGEgbmFtZT0icmVmYWN0b3JpbmciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPldpdGhpbiBhbiBYTUwgU2NoZW1hIGZpbGUsIHJlZmFjdG9yaW5nIGFsbG93cyBhdXRob3JzIHRvIG1ha2UgYQotc2luZ2xlIGFydGlmYWN0IGNoYW5nZSwgYW5kIGhhdmUgdGhhdCBjaGFuZ2UgaW1wbGVtZW50ZWQgdGhyb3VnaG91dCBhbGwgb3RoZXIKLWRlcGVuZGFudCBhcnRpZmFjdHMuPC9wPgotCi08ZGl2IGNsYXNzPSJwIiAvPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5SZWZhY3RvcmluZyBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciB0aGUgdGVkaW91cyBlZGl0aW5nIG5lY2Vzc2FyeQotdG8gcmVjb3ZlciBicm9rZW4gZGVwZW5kZW5jaWVzIGNhdXNlZCBieSBhcnRpZmFjdCBjaGFuZ2VzIHdoaWNoIGNhdXNlIHJpcHBsZQotZWZmZWN0cyBvbiBvdGhlciBkZXBlbmRhbnQgYXJ0aWZhY3RzIChzdWNoIGFzIHJlbmFtaW5nIGFuIFhNTCBTY2hlbWEgZWxlbWVudCkuPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgbmV3IFhNTCBzY2hlbWEgb3IgZG91YmxlLWNsaWNrIGFuIGV4aXN0aW5nIHNjaGVtYSBpbiB0aGUKLU5hdmlnYXRvciB2aWV3Ljwvc3Bhbj4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBvcGVuIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gcmVmYWN0b3IgYW4gYXJ0aWZhY3QsIHBvc2l0aW9uIGN1cnNvciB3aXRoaW4gdGhlIGFydGlmYWN0LCByaWdodC1jbGljawotdGhlIGFydGlmYWN0LCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZmFjdG9yPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbmFtZTwvc3Bhbj4KLTwvc3Bhbj48L3NwYW4+IEEgcG9wdXAgZGlhbG9nIHdpbGwgcmVxdWVzdCB0aGUgZW50cnkgb2YgYSBuZXcgbmFtZQotZm9yIHRoYXQgYXJ0aWZhY3QKLTxvbCB0eXBlPSJhIj4KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBpbiB0aGUgbmV3IG5hbWUgb2YgdGhlIGFydGlmYWN0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPihPcHRpb25hbCkgQ2xpY2sgPHN0cm9uZz5QcmV2aWV3PC9zdHJvbmc+Ljwvc3Bhbj4gQSB3aW5kb3cgd2lsbCBvcGVuCi1pbmRpY2F0aW5nIGFsbCBvZiB0aGUgY2hhbmdlcyB3aGljaCB3aWxsIHRha2UgcGxhY2UgZHVlIHRvIHRoZSByZWZhY3RvcmluZy4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0suPC9zcGFuPjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGUgbmV3IG5hbWUgd2lsbCBiZSBlbnRlcmVkIGluIHRoZSBvcGVuZWQgWFNEIHNvdXJjZSwgYXMgd2VsbCBhcwotaW4gYWxsIGRlcGVuZGFudCBhcnRpZmFjdHMuPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImV4YW1wbGUiPjxzdHJvbmc+PHU+Q29tcG9uZW50IFJlZmVyZW5jZXMgaW4gWE1MIFNjaGVtYTwvdT48L3N0cm9uZz48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGJvcmRlcj0iMSIgY2xhc3M9InNpbXBsZXRhYmxlYm9yZGVyIj4KLTx0cj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAwRkUiPkdsb2JhbCBuYW1lZCBjb21wb25lbnRzPC90aD4KLQotPHRoIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgaWQ9Ik4xMDEwNCI+UmVmZXJlbmNlPC90aD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRkUiPjx1bD4KLTxsaT4mbHQ7ZWxlbWVudCBuYW1lPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDEwNCI+PHVsPgotPGxpPiZsdDtlbGVtZW50IHJlZj0iZm9vIiZndDs8L2xpPgotCi08bGk+Jmx0O2VsZW1lbnQgc3Vic3RpdHV0aW9uR3JvdXA9ImZvbyI8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRkUiPjx1bD4KLTxsaT4mbHQ7c2ltcGxlL2NvbXBsZXhUeXBlIG5hbWU9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTA0Ij48dWw+Ci08bGk+Jmx0O2VsZW1lbnQgdHlwZT0iZm9vIiZndDs8L2xpPgotCi08bGk+Jmx0O2F0dHJpYnV0ZSB0eXBlPSJmb28iJmd0OzwvbGk+Ci0KLTxsaT4mbHQ7cmVzdHJpY3Rpb24gYmFzZT0iZm9vIiZndDs8L2xpPgotCi08bGk+Jmx0O3N1YnN0aXR1dGlvbiBiYXNlPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBGRSI+PHVsPgotPGxpPiZsdDthdHRyaWJ1dGUgbmFtZT0iZm9vIiZndDs8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxMDQiPjx1bD4KLTxsaT4mbHQ7YXR0cmlidXRlIHJlZj0iZm9vIiZndDs8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRkUiPjx1bD4KLTxsaT4mbHQ7YXR0cmlidXRlR3JvdXAgbmFtZT0iZm9vIiZndDs8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxMDQiPjx1bD4KLTxsaT4mbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBGRSI+PHVsPgotPGxpPiZsdDtncm91cCBuYW1lPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDEwNCI+PHVsPgotPGxpPiZsdDtncm91cCByZWY9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLTxkaXYgLz4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZkdHNjaG0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZkdHNjaG0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3M2Y3ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2ZHRzY2htLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR2ZHRzY2htIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5WYWxpZGF0aW5nIFhNTCBzY2hlbWFzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5WYWxpZGF0aW5nIFhNTCBzY2hlbWFzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YNCi10aGUgWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGRpc3BsYXllZCBpbg0KLXRoZSBQcm9ibGVtcyB2aWV3Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPnZhbGlkYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyB2YWxpZGF0ZSBhbiBYTUwNCi1zY2hlbWEsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5SaWdodC1jbGljayB5b3VyIGZpbGUgaW4gdGhlIE5hdmlnYXRvciB2aWV3IGFuZCBjbGljayA8dWljb250cm9sPlZhbGlkYXRlPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPiBJZiB2YWxpZGF0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bCwgeW91IGNhbiByZWZlciB0byB0aGUgUHJvYmxlbXMNCi12aWV3IHRvIHNlZSB3aGF0IHByb2JsZW1zIHdlcmUgbG9nZ2VkLiA8L2NtZD48aW5mbz4gPG5vdGU+IElmIHlvdSByZWNlaXZlDQotYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIFByb2JsZW1zIHZpZXcgaXMgZnVsbCwgeW91IGNhbiBpbmNyZWFzZQ0KLXRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgYWxsb3dlZCBieSBjbGlja2luZyA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4NCi08dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdGluZyA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+PHVpY29udHJvbD5NYXJrZXJzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uDQotU2VsZWN0IHRoZSA8dWljb250cm9sPlVzZSBtYXJrZXIgbGltaXRzPC91aWNvbnRyb2w+IGNoZWNrIGJveCBhbmQgY2hhbmdlIHRoZQ0KLW51bWJlciBpbiB0aGUgPHVpY29udHJvbD5MaW1pdCB2aXNpYmxlIGl0ZW1zIHBlciBncm91cDwvdWljb250cm9sPiBmaWVsZC48L25vdGU+PC9pbmZvPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+VGhlIFhNTCBzY2hlbWEgc3VwcG9ydCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IgaXMgYmFzZWQgb24gdGhlDQotVzNDIFhNTCBTY2hlbWEgUmVjb21tZW5kYXRpb24gU3BlY2lmaWNhdGlvbi4gVGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbnMNCi1YTUwgU2NoZW1hIFBhcnQgMTogU3RydWN0dXJlcyBhbmQgWE1MIFNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlcyBmcm9tIHRoZSBXM0MNCi1XZWIgc2l0ZSBhcmUgdXNlZCBmb3IgdmFsaWRhdGlvbi48L3A+PHA+Q2VydGFpbiBlcnJvciBtZXNzYWdlcyBjb250YWluIGEgcmVmZXJlbmNlDQotdG8gdGhlIHNjaGVtYSBjb25zdHJhaW50cyBsaXN0ZWQgaW4gQXBwZW5kaXggQyBvZiB0aGUgWE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXMNCi1kb2N1bWVudC4gRWFjaCBjb25zdHJhaW50IGhhcyBhIHVuaXF1ZSBuYW1lIHRoYXQgd2lsbCBiZSByZWZlcmVuY2VkIGluIHRoZQ0KLWVycm9yIG1lc3NhZ2UuIEZvciBleGFtcGxlLCBpZiB5b3UgcmVjZWl2ZSBhbiBlcnJvciBtZXNzYWdlIHdpdGggdGhpcyB0ZXh0OiA8c3lzdGVtb3V0cHV0PmN0LXByb3BzLWNvcnJlY3Q8L3N5c3RlbW91dHB1dD4gYW5kDQoteW91IHNlYXJjaGVkIGluIHRoZSBTdHJ1Y3R1cmUgZG9jdW1lbnQgZm9yIHRoZSB0ZXh0LCB5b3Ugd291bGQgZmluZCB0aGF0IGl0DQotaXMgZm9yIHRoZSBzZWN0aW9uICJTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IENvbXBsZXggVHlwZSBEZWZpbml0aW9uIFByb3BlcnRpZXMNCi1Db3JyZWN0Ii4gPC9wPjxwPllvdSBjYW4gc2V0IHVwIGEgcHJvamVjdCdzIHByb3BlcnRpZXMgc28gdGhhdCBkaWZmZXJlbnQgdHlwZXMNCi1vZiBwcm9qZWN0IHJlc291cmNlcyBhcmUgYXV0b21hdGljYWxseSB2YWxpZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGVtICh0aGlzDQotaXMgc2V0IGZvciBhbGwgcmVzb3VyY2VzIGJ5IGRlZmF1bHQpLiBGcm9tIGEgcHJvamVjdCdzIHBvcC11cCBtZW51IHNlbGVjdCA8dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD4sDQotdGhlbiBzZWxlY3QgPHVpY29udHJvbD5WYWxpZGF0aW9uPC91aWNvbnRyb2w+LiBBbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1bg0KLWFnYWluc3QgeW91ciBwcm9qZWN0IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBWYWxpZGF0aW9uIHBhZ2UuPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9saW5rdGV4dD4NCi08ZGVzYz5HZW5lcmFsIHZhbGlkYXRpb24gaW5mb3JtYXRpb248L2Rlc2M+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xIiBzY29wZT0iZXh0ZXJuYWwiPjxsaW5rdGV4dD5YTUwNCi1TY2hlbWEgUGFydCAxOiBTdHJ1Y3R1cmVzPC9saW5rdGV4dD4NCi08ZGVzYz5TZWUgdGhlIFczQyBXZWIgc2l0ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb25zPC9kZXNjPg0KLTwvbGluaz4NCi08bGluayBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMiIgc2NvcGU9ImV4dGVybmFsIj48bGlua3RleHQ+WE1MDQotU2NoZW1hIFBhcnQgMjogRGF0YXR5cGVzPC9saW5rdGV4dD4NCi08ZGVzYz5TZWUgdGhlIFczQyBXZWIgc2l0ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb25zPC9kZXNjPg0KLTwvbGluaz4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZkdHNjaG0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZkdHNjaG0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc5YzE2OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2ZHRzY2htLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgdmFsaWRhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIHZhbGlkYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGN4bWxzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0dmR0c2NobSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR2ZHRzY2htIj48YSBuYW1lPSJ0dmR0c2NobSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZgotdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4KLXRoZSBQcm9ibGVtcyB2aWV3LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyB2YWxpZGF0ZSBhbiBYTUwKLXNjaGVtYSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodC1jbGljayB5b3VyIGZpbGUgaW4gdGhlIE5hdmlnYXRvciB2aWV3IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0ZTwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4gSWYgdmFsaWRhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWwsIHlvdSBjYW4gcmVmZXIgdG8gdGhlIFByb2JsZW1zCi12aWV3IHRvIHNlZSB3aGF0IHByb2JsZW1zIHdlcmUgbG9nZ2VkLiA8L3NwYW4+ICA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gIElmIHlvdSByZWNlaXZlCi1hbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgUHJvYmxlbXMgdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlCi10aGUgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIGFsbG93ZWQgYnkgY2xpY2tpbmcgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj48L3NwYW4+IGFuZCBzZWxlY3RpbmcgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWFya2Vyczwvc3Bhbj48L3NwYW4+LgotU2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2UgbWFya2VyIGxpbWl0czwvc3Bhbj4gY2hlY2sgYm94IGFuZCBjaGFuZ2UgdGhlCi1udW1iZXIgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkxpbWl0IHZpc2libGUgaXRlbXMgcGVyIGdyb3VwPC9zcGFuPiBmaWVsZC48L2Rpdj4KLQotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBzY2hlbWEgc3VwcG9ydCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IgaXMgYmFzZWQgb24gdGhlCi1XM0MgWE1MIFNjaGVtYSBSZWNvbW1lbmRhdGlvbiBTcGVjaWZpY2F0aW9uLiBUaGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9ucwotWE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXMgYW5kIFhNTCBTY2hlbWEgUGFydCAyOiBEYXRhdHlwZXMgZnJvbSB0aGUgVzNDCi1XZWIgc2l0ZSBhcmUgdXNlZCBmb3IgdmFsaWRhdGlvbi48L3A+Ci08cD5DZXJ0YWluIGVycm9yIG1lc3NhZ2VzIGNvbnRhaW4gYSByZWZlcmVuY2UKLXRvIHRoZSBzY2hlbWEgY29uc3RyYWludHMgbGlzdGVkIGluIEFwcGVuZGl4IEMgb2YgdGhlIFhNTCBTY2hlbWEgUGFydCAxOiBTdHJ1Y3R1cmVzCi1kb2N1bWVudC4gRWFjaCBjb25zdHJhaW50IGhhcyBhIHVuaXF1ZSBuYW1lIHRoYXQgd2lsbCBiZSByZWZlcmVuY2VkIGluIHRoZQotZXJyb3IgbWVzc2FnZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSByZWNlaXZlIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCB0aGlzIHRleHQ6IDx0dCBjbGFzcz0ic3lzb3V0Ij5jdC1wcm9wcy1jb3JyZWN0PC90dD4gYW5kCi15b3Ugc2VhcmNoZWQgaW4gdGhlIFN0cnVjdHVyZSBkb2N1bWVudCBmb3IgdGhlIHRleHQsIHlvdSB3b3VsZCBmaW5kIHRoYXQgaXQKLWlzIGZvciB0aGUgc2VjdGlvbiAiU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBDb21wbGV4IFR5cGUgRGVmaW5pdGlvbiBQcm9wZXJ0aWVzCi1Db3JyZWN0Ii4gPC9wPgotPHA+WW91IGNhbiBzZXQgdXAgYSBwcm9qZWN0J3MgcHJvcGVydGllcyBzbyB0aGF0IGRpZmZlcmVudCB0eXBlcwotb2YgcHJvamVjdCByZXNvdXJjZXMgYXJlIGF1dG9tYXRpY2FsbHkgdmFsaWRhdGVkIHdoZW4geW91IHNhdmUgdGhlbSAodGhpcwotaXMgc2V0IGZvciBhbGwgcmVzb3VyY2VzIGJ5IGRlZmF1bHQpLiBGcm9tIGEgcHJvamVjdCdzIHBvcC11cCBtZW51IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPiwKLXRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+LiBBbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1bgotYWdhaW5zdCB5b3VyIHByb2plY3Qgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIFZhbGlkYXRpb24gcGFnZS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGN4bWxzY2guaHRtbCIgdGl0bGU9IllvdSBjYW4gY3JlYXRlIGFuIFhNTCBzY2hlbWEgYW5kIHRoZW4gZWRpdCBpdCB1c2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIFVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvciwgeW91IGNhbiBzcGVjaWZ5IGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIj5DcmVhdGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsaW5mbyI+PHN0cm9uZz5SZWxhdGVkIGluZm9ybWF0aW9uPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sIiB0aXRsZT0iR2VuZXJhbCB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xIiB0YXJnZXQ9Il9ibGFuayIgdGl0bGU9IlNlZSB0aGUgVzNDIFdlYiBzaXRlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbnMiPlhNTAotU2NoZW1hIFBhcnQgMTogU3RydWN0dXJlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIiIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0iU2VlIHRoZSBXM0MgV2ViIHNpdGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9ucyI+WE1MCi1TY2hlbWEgUGFydCAyOiBEYXRhdHlwZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyNTY2MS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZjkzYTkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5wYXRjaC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUucGF0Y2guaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBjM2JjNC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5wYXRjaC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotCi08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQnVpbGQiIGNvbnRlbnQ9IkJ1aWxkIj4KLSAgIDx0aXRsZT5XVFAgMS41LjUgUGF0Y2hlczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDE+V1RQIDEuNS41IFBhdGNoZXM8L2gxPgotCi08aDI+b3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlPC9oMj4KLQotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU0MDInPjE4NTQwMjwvYT4uIEpTUCB2YWxpZGF0aW9uIGZhaWxzIGJlY2F1c2Ugb2YgZGVmYXVsdGVkIGF0dHJpYnV0ZSBmbHVzaCBvbiBqc3A6aW5jbHVkZTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzNzExJz4yMDM3MTE8L2E+LiB0YWdsaWIgZGVjbGFyYXRpb25zIGluIEpTUCBmcmFnbWVudHM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5OTA1Myc+MTk5MDUzPC9hPi4gU3ludGF4IGVycm9ycyBvdXRzaWRlIG9mIHNjcmlwdGluZyBhcmVhcyBub3QgcmVwb3J0ZWQ8L3A+Ci0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5N2I0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XVFAgUGF0Y2ggZm9yIHdzdC54bWxfdWkKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1cCi1BIHBhdGNoIGZvciBzc2UudWlcblwKLVRoaXMgcGF0Y2ggZml4ZXMgcHJvYmxlbXMgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgYnVnczogXG5cCi1cblwKLUJ1ZyAxODU0MDIgSlNQIHZhbGlkYXRpb24gZmFpbHMgYmVjYXVzZSBvZiBkZWZhdWx0ZWQgYXR0cmlidXRlIGZsdXNoIG9uIGpzcDppbmNsdWRlICBcblwKLVNlZSBidWcgMTg1NDAyIChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1NDAyKSkgXG5cCi1cblwKLUJ1ZyAyMDM3MTEgdGFnbGliIGRlY2xhcmF0aW9ucyBpbiBKU1AgZnJhZ21lbnRzICBcblwKLVNlZSBidWcgMjAzNzExIChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzNzExKSkgXG5cCi1cblwKLUJ1ZyAxOTkwNTMgU3ludGF4IGVycm9ycyBvdXRzaWRlIG9mIHNjcmlwdGluZyBhcmVhcyBub3QgcmVwb3J0ZWQgIFxuXAotU2VlIGJ1ZyAxOTkwNTMgKGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTkwNTMpKSBcblwKLVxuXAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1PY3RvYmVyLCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc4MTM2NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuNS41LnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjUuNS52MjAwNzA4MDkwNTE4LS00aE5ERGlFbkpXRGRSUSIgcGF0Y2g9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+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+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOWIwNjUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMGNlMWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyMTM1YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgV2ViIENvcmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdlYiB0b29scyBjb3JlLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDgwOTRlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4zLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLTx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDE0LCAyMDEwPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi0KLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQotICAgICAgIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuPC9wPgotCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZyBQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLQotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWYxZTZlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIENvcmVcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ1MTJkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZDM4ZDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBXZWIgQ29yZSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjQ5ZTlmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkYzE1NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBDb3JlIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBXZWIgY29yZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiNzM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzDQotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcw0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotMD1AYnVpbGRADQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZjFlNmUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBXZWIgQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkMzhkNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkMzAyZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJ1aWxkLnhtbAotZmVhdHVyZXMKLXBsdWdpbnMKLW9yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5Zjg0Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyNDRhNC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZSwgZmVhdHVyZUBvcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5zb3VyY2UKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA5YWEwMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBXZWIgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciB0aGUgV1NUIHdlYiB0b29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E3YWJjMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjMuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdF9zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJjZDlmZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjUwMjYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2guaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzkyYTNjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPG1ldGEgbmFtZT0iQnVpbGQiIGNvbnRlbnQ9IkJ1aWxkIj4KLTx0aXRsZT5XVFAgMy4wLjQgUGF0Y2hlczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDE+V1RQIDMuMC40IFBhdGNoZXM8L2gxPgotCi08aDI+b3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlPC9oMj4KLQotPHA+QnVnIDxhCi0JaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MDQwNyc+MjcwNDA3PC9hPi4KLW9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9ycycgZXh0ZW5zaW9uIHBvaW50IHdpbGwgYmUgaWdub3JlZAotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMGQxMjUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdUUCBQYXRjaCBmb3Igb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249XAotQ29udGFpbnMgZml4ZXMgZm9yIHRoZSBmb2xsb3dpbmcgYnVnczogXG5cCi1cblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjcwNDA3IG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9ycycgZXh0ZW5zaW9uIHBvaW50IHdpbGwgYmUgaWdub3JlZFxuXAotXG5cCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU9jdG9iZXIsIDIwMDhcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxODVkMzYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC40LnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZSIgdmVyc2lvbj0iMy4wLjQudjIwMDgxMTI0MDkwMC03UjBFUDdFOEtzOXY3dXJ0dURKdEJjYVJWNlJpIiBwYXRjaD0idHJ1ZSIvPgotICAgPC9yZXF1aXJlcz4KLSAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLSAgICAgICAgIAotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0YjQ3Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTg0MzQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFdlYiBEZXZlbG9wZXIgVG9vbHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUVjbGlwc2UgV2ViIERldmVsb3BlciBUb29scywgaW5jbHVkaW5nIEhUTUwsIENTUywgWEhUTUwsIGV0Yy4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmU3NWI3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjMuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5NWMwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBXZWIgVUlcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTU3NWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjU2ZmI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBVSSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOGE2MTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbAotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnNvdXJjZSA9IG9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0N2ZhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBXZWIgVUkgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBXZWIgVUkuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLTx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDE0LCAyMDEwPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi0KLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQotICAgICAgIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuPC9wPgotCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZyBQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLQotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiNzM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOTVjMGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIFVJXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE1NzVjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1NmZiOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBXZWIgVUkgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZmUxNzQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZV8xLjAuMC5qYXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNWViMzEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4OTU2Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgV2ViIFVzZXIgRG9jdW1lbnRhdGlvbgotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V1NUIFdlYiB1c2VyIGRvY3VtZW50YXRpb24KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcyNWQ5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMy4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0Y2EzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OGM3OTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS5wYXRjaDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnBhdGNoL2Rlc2NyaXB0aW9uLnR4dCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnBhdGNoL2Rlc2NyaXB0aW9uLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ4MTQ4YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS5wYXRjaC9kZXNjcmlwdGlvbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVRoaXMgaGVhZCB0cnVuayBpcyBkZWxpYmVyYXRseSBlbXB0eS4gCi0KLVBsZWFzZSBsb2FkIHRoZSBhcHByb3ByaWF0ZSBtYWludGVuYW5jZSBicmFuY2guIAotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzNWFlMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlXzEuNS4wLjIwMDYwNTA4MDEwNC5iaW4uZGlzdC56aXAKLWRldi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWFlMjQ4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MDkyNzYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIE1heSAwOCAwOToxMDoyNyBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0NDgwYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1YzEyZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgWE1MIENvcmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XU1QgWE1MIGNvcmUuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNDdkZmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjMuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImphdmF4LnhtbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjE5MCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMTkwIgotICAgICAgICAgdmVyc2lvbj0iMS4zLjQucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS54bWwucmVzb2x2ZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSI5NiIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iOTYiCi0gICAgICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMjcwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIyNzAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjcuMS5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnhlcmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjEyMDAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjEyMDAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjkuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjE1MiIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMTUyIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLTx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDE0LCAyMDEwPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi0KLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQotICAgICAgIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuPC9wPgotCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZyBQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLQotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWMyNzE2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gWE1MIENvcmVcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ1MTJkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOTI0MTEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBYTUwgQ29yZSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjQ5ZTlmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjNDRmNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFhNTCBDb3JlIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBYTUwgY29yZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiNzM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzDQotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcw0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotMD1AYnVpbGRADQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzI3MTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBYTUwgQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM5MjQxMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3NDk1Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWZlYXR1cmVzCi1wbHVnaW5zCi1idWlsZC54bWwKLWRldi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3NWZhNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0MDUwZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUsIGZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUuc291cmNlIApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0YTZlZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgWE1MIEVkaXRvcnMgYW5kIFRvb2xzIFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIHRoZSBXU1QgWE1MIHRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGVjMDgyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMy4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLTx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDE0LCAyMDEwPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi0KLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQotICAgICAgIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuPC9wPgotCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZyBQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLQotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUucGF0Y2gvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGMxZjguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmOTNhOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYjNjMjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnBhdGgiCi0gICAgICBsYWJlbD0iUGF0aCBGZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS4wLjAiPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Rlc2NyaXB0aW9uIj4KLSAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY29weXJpZ2h0Ij4KLSAgICAgIFtFbnRlciBDb3B5cmlnaHQgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgotICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjUuNS52MjAwNzA3MzExNjM1LXpraUNmek8tSUZVT2p6UiIgcGF0Y2g9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkzMThjNy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkMzQ5OS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBYTUwgRWRpdG9ycyBhbmQgVG9vbHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFJlcG9zaXRvcnkKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVhNTCwgRFREIGFuZCBYTUwgU2NoZW1hIEVkaXRvcnMsIHZhbGlkYXRvcnMsIGFuZCBYTUwgQ2F0YWxvZyBzdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyYjQzMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4zLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3JlcG9zaXRvcnkvaGVsaW9zIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGUxMGVhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBVSVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNTc1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YjVmNGQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gWE1MIFVJIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3MzdhZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDYzMzYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgWE1MIFVJIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBYTUwgVUkuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLTx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDE0LCAyMDEwPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi0KLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQotICAgICAgIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuPC9wPgotCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZyBQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLQotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiNzM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTEwZWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gWE1MIFVJXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE1NzVjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliNWY0ZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBYTUwgVUkgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzOTFiMi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWE3YzBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBYTUwgVXNlciBEb2N1bWVudGF0aW9uCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V1NUIFhNTCB1c2VyIGRvY3VtZW50YXRpb24KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjN2JmNy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMy4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLTx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDE0LCAyMDEwPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi0KLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQotICAgICAgIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuPC9wPgotCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZyBQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLQotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+Cg==